diff --git a/.gitignore b/.gitignore index b942c2f42e..24af068c53 100644 --- a/.gitignore +++ b/.gitignore @@ -2,14 +2,14 @@ .vscode/ __pycache__ AssetProcessorTemp/** -build/** -Cache/** +[Bb]uild/** +[Cc]ache/ Editor/EditorEventLog.xml Editor/EditorLayout.xml Tools/**/*egg-info/** Tools/**/*egg-link UserSettings.xml -user/Registry/** +[Uu]ser/ FrameCapture/** .DS_Store user*.cfg @@ -17,4 +17,4 @@ user*.cfg _savebackup/ #Output folder for test results when running Automated Tests TestResults/** -*.swatches \ No newline at end of file +*.swatches diff --git a/AssetProcessorPlatformConfig.setreg b/AssetProcessorPlatformConfig.setreg index c075342b98..d3cf6d6272 100644 --- a/AssetProcessorPlatformConfig.setreg +++ b/AssetProcessorPlatformConfig.setreg @@ -22,7 +22,7 @@ "AssetProcessor": { "Settings": { "Platform pc": { - "tags": "tools,renderer,dx12,vulkan" + "tags": "tools,renderer,dx12,vulkan,null" }, "Platform es3": { "tags": "android,mobile,renderer,vulkan" @@ -31,7 +31,7 @@ "tags": "mobile,renderer,metal" }, "Platform osx_gl": { - "tags": "tools,renderer,metal" + "tags": "tools,renderer,metal,null" }, // this is an example of a headless platform that has no renderer. // To use this you would still need to make sure 'assetplatform' in your startup params in your main() chooses this 'server' platform as your server 'assets' flavor @@ -104,7 +104,7 @@ "ScanFolder Game": { "watch": "@PROJECTROOT@", - "display": "@PROJECTROOT@", + "display": "@PROJECTNAME@", "recursive": 1, "order": 0 }, @@ -172,6 +172,9 @@ "Exclude Build": { "pattern": ".*/[Bb]uild/.*" }, + "Exclude UserSettings": { + "pattern": ".*/UserSettings.xml" + }, // ------------------------------------------------------------------------------ // Large Worlds Test diff --git a/AutomatedReview/Jenkinsfile b/AutomatedReview/Jenkinsfile index 1c4f03f30d..a9c16a9e4d 100644 --- a/AutomatedReview/Jenkinsfile +++ b/AutomatedReview/Jenkinsfile @@ -16,6 +16,8 @@ INCREMENTAL_BUILD_SCRIPT_PATH = 'scripts/build/bootstrap/incremental_build_util. EMPTY_JSON = readJSON text: '{}' +ENGINE_REPOSITORY_NAME = env.DEFAULT_REPOSITORY_NAME + def pipelineProperties = [] def pipelineParameters = [ @@ -117,7 +119,7 @@ def RegexMatcher(str, regex) { def LoadPipelineConfig(String pipelineName, String branchName, String scmType) { echo 'Loading pipeline config' if (scmType == 'codecommit') { - PullFilesFromGit(PIPELINE_CONFIG_FILE, branchName) + PullFilesFromGit(PIPELINE_CONFIG_FILE, branchName, true, ENGINE_REPOSITORY_NAME) } def pipelineConfig = {} pipelineConfig = readJSON file: PIPELINE_CONFIG_FILE @@ -132,7 +134,7 @@ def LoadPipelineConfig(String pipelineName, String branchName, String scmType) { } echo "Downloading platform pipeline configs ${pipeline_config}" if (scmType == 'codecommit') { - PullFilesFromGit(pipeline_config, branchName) + PullFilesFromGit(pipeline_config, branchName, false, ENGINE_REPOSITORY_NAME) } echo "Searching platform pipeline configs in ${pipeline_config} using ${platform_regex}" for (pipeline_config_path in findFiles(glob: pipeline_config)) { @@ -154,7 +156,7 @@ def LoadPipelineConfig(String pipelineName, String branchName, String scmType) { } echo "Downloading configs ${build_config}" if (scmType == 'codecommit') { - PullFilesFromGit(build_config, branchName) + PullFilesFromGit(build_config, branchName, false, ENGINE_REPOSITORY_NAME) } echo "Searching configs in ${build_config} using ${platform_regex}" for (build_config_path in findFiles(glob: build_config)) { @@ -163,6 +165,7 @@ def LoadPipelineConfig(String pipelineName, String branchName, String scmType) { if(platform) { pipelineConfig.platforms[platform].build_types = readJSON file: build_config_path.toString() } + palRm(build_config_path.toString()) } } return pipelineConfig @@ -193,29 +196,14 @@ def GetBuildEnvVars(Map platformEnv, Map buildTypeEnv, String pipelineName) { // This may override the above one if there is an entry defined by the job envVarMap[var.key] = var.value } - return envVarMap -} + + // Environment that only applies to to Jenkins tweaks. + // For 3rdParty downloads, we store them in the EBS volume so we can reuse them across node + // instances. This allow us to scale up and down without having to re-download 3rdParty + envVarMap['LY_PACKAGE_DOWNLOAD_CACHE_LOCATION'] = "${envVarMap['WORKSPACE']}/3rdParty/downloaded_packages" + envVarMap['LY_PACKAGE_UNPACK_LOCATION'] = "${envVarMap['WORKSPACE']}/3rdParty/packages" -def CheckoutBootstrapScripts(String branchName) { - checkout([$class: "GitSCM", - branches: [[name: "*/${branchName}"]], - doGenerateSubmoduleConfigurations: false, - extensions: [ - [ - $class: "SparseCheckoutPaths", - sparseCheckoutPaths: [ - [ $class: "SparseCheckoutPath", path: "AutomatedReview/" ], - [ $class: "SparseCheckoutPath", path: "scripts/build/bootstrap/" ], - [ $class: "SparseCheckoutPath", path: "Tools/build/JenkinsScripts/build/Platform" ] - ] - ], - [ - $class: "CloneOption", depth: 1, noTags: false, reference: "", shallow: true - ] - ], - submoduleCfg: [], - userRemoteConfigs: scm.userRemoteConfigs - ]) + return envVarMap } def GetEnvStringList(Map envVarMap) { @@ -229,7 +217,7 @@ def GetEnvStringList(Map envVarMap) { // Pulls/downloads files from the repo through codecommit. Despite Glob matching is NOT supported, '*' is supported // as a folder or filename (not a portion, it has to be the whole folder or filename) def PullFilesFromGit(String filenamePath, String branchName, boolean failIfNotFound = true, String repositoryName = env.DEFAULT_REPOSITORY_NAME) { - echo "PullFilesFromGit filenamePath=${filenamePath} branchName=${branchName}" + echo "PullFilesFromGit filenamePath=${filenamePath} branchName=${branchName} repositoryName=${repositoryName}" def folderPathParts = filenamePath.tokenize('/') def filename = folderPathParts[folderPathParts.size()-1] folderPathParts.remove(folderPathParts.size()-1) // remove the filename @@ -310,28 +298,42 @@ def PullFilesFromGit(String filenamePath, String branchName, boolean failIfNotFo } } -def SetLfsCredentials(cmd, lbl = '') { - if (env.IS_UNIX) { - sh label: lbl, - script: cmd - } else { - bat label: lbl, - script: cmd - } +def CheckoutBootstrapScripts(String branchName) { + checkout([$class: "GitSCM", + branches: [[name: "*/${branchName}"]], + doGenerateSubmoduleConfigurations: false, + extensions: [ + [ + $class: "SparseCheckoutPaths", + sparseCheckoutPaths: [ + [ $class: "SparseCheckoutPath", path: "AutomatedReview/" ], + [ $class: "SparseCheckoutPath", path: "scripts/build/bootstrap/" ], + [ $class: "SparseCheckoutPath", path: "Tools/build/JenkinsScripts/build/Platform" ] + ] + ], + [ + $class: "CloneOption", depth: 1, noTags: false, reference: "", shallow: true + ] + ], + submoduleCfg: [], + userRemoteConfigs: scm.userRemoteConfigs + ]) } def CheckoutRepo(boolean disableSubmodules = false) { - palSh('git lfs uninstall', 'Git LFS Uninstall') // Prevent git from pulling lfs objects during checkout - - if(fileExists('.git')) { - // If the repository after checkout is locked, likely we took a snapshot while git was running, - // to leave the repo in a usable state, garbagecollect. This also helps in situations where - def indexLockFile = '.git/index.lock' - if(fileExists(indexLockFile)) { - palSh('git gc', 'Git GarbageCollect') - } - if(fileExists(indexLockFile)) { // if it is still there, remove it - palRm(indexLockFile) + + dir(ENGINE_REPOSITORY_NAME) { + if(fileExists('.git')) { + // If the repository after checkout is locked, likely we took a snapshot while git was running, + // to leave the repo in a usable state, garbagecollect. This also helps in situations where + def indexLockFile = '.git/index.lock' + if(fileExists(indexLockFile)) { + palSh('git gc', 'Git GarbageCollect') + } + if(fileExists(indexLockFile)) { // if it is still there, remove it + palRm(indexLockFile) + } + palSh('git remote prune origin', 'Git reset') } } @@ -344,41 +346,45 @@ def CheckoutRepo(boolean disableSubmodules = false) { retryAttempt = retryAttempt + 1 if(params.PULL_REQUEST_ID) { // This is a pull request build. Perform merge with destination branch before building. - checkout scm: [ - $class: 'GitSCM', - branches: scm.branches, - extensions: [ - [$class: 'PreBuildMerge', options: [mergeRemote: 'origin', mergeTarget: params.DESTINATION_BRANCH]], - [$class: 'SubmoduleOption', disableSubmodules: disableSubmodules, recursiveSubmodules: true], - [$class: 'CheckoutOption', timeout: 60] - ], - userRemoteConfigs: scm.userRemoteConfigs - ] + dir(ENGINE_REPOSITORY_NAME) { + checkout scm: [ + $class: 'GitSCM', + branches: scm.branches, + extensions: [ + [$class: 'PreBuildMerge', options: [mergeRemote: 'origin', mergeTarget: params.DESTINATION_BRANCH]], + [$class: 'SubmoduleOption', disableSubmodules: disableSubmodules, recursiveSubmodules: true], + [$class: 'CheckoutOption', timeout: 60] + ], + userRemoteConfigs: scm.userRemoteConfigs + ] + } } else { - checkout scm: [ - $class: 'GitSCM', - branches: scm.branches, - extensions: [ - [$class: 'SubmoduleOption', disableSubmodules: disableSubmodules, recursiveSubmodules: true], - [$class: 'CheckoutOption', timeout: 60] - ], - userRemoteConfigs: scm.userRemoteConfigs - ] + dir(ENGINE_REPOSITORY_NAME) { + checkout scm: [ + $class: 'GitSCM', + branches: scm.branches, + extensions: [ + [$class: 'SubmoduleOption', disableSubmodules: disableSubmodules, recursiveSubmodules: true], + [$class: 'CheckoutOption', timeout: 60] + ], + userRemoteConfigs: scm.userRemoteConfigs + ] + } } } - // Run lfs in a separate step. Jenkins is unable to load the credentials for the custom LFS endpoint - withCredentials([usernamePassword(credentialsId: "${env.GITHUB_USER}", passwordVariable: 'accesstoken', usernameVariable: 'username')]) { - SetLfsCredentials("git config -f .lfsconfig lfs.url https://${username}:${accesstoken}@${env.LFS_URL}", 'Set credentials') - } - palSh('git lfs install', 'Git LFS Install') - palSh('git lfs pull', 'Git LFS Pull') + // Add folder where we will store the 3rdParty downloads and packages + if(!fileExists('3rdParty')) { + palMkdir('3rdParty') + } // CHANGE_ID is used by some scripts to identify uniquely the current change (usually metric jobs) - palSh('git rev-parse HEAD > commitid', 'Getting commit id') - env.CHANGE_ID = readFile file: 'commitid' - env.CHANGE_ID = env.CHANGE_ID.trim() - palRm('commitid') + dir(ENGINE_REPOSITORY_NAME) { + palSh('git rev-parse HEAD > commitid', 'Getting commit id') + env.CHANGE_ID = readFile file: 'commitid' + env.CHANGE_ID = env.CHANGE_ID.trim() + palRm('commitid') + } } def PreBuildCommonSteps(String pipeline, String branchName, String platform, String buildType, String workspace, boolean mount = true, boolean disableSubmodules = false) { @@ -409,7 +415,10 @@ def PreBuildCommonSteps(String pipeline, String branchName, String platform, Str """ } } - if(params.CLEAN_WORKSPACE) { + + // Cleanup previous repo location, we are currently at the root of the workspace, if we have a .git folder + // we need to cleanup. Once all branches take this relocation, we can remove this + if(params.CLEAN_WORKSPACE || fileExists("${workspace}/.git")) { if(fileExists(workspace)) { palRmDir(workspace) } @@ -420,19 +429,21 @@ def PreBuildCommonSteps(String pipeline, String branchName, String platform, Str CheckoutRepo(disableSubmodules) // Get python - if(env.IS_UNIX) { + dir(ENGINE_REPOSITORY_NAME) { + if(env.IS_UNIX) { sh label: 'Getting python', script: 'python/get_python.sh' - } else { - bat label: 'Getting python', - script: 'python/get_python.bat' + } else { + bat label: 'Getting python', + script: 'python/get_python.bat' + } } } } def Build(Map options, String platform, String type, String workspace) { def command = "${options.BUILD_ENTRY_POINT} --platform ${platform} --type ${type}" - dir(workspace) { + dir("${workspace}/${ENGINE_REPOSITORY_NAME}") { if (env.IS_UNIX) { sh label: "Running ${platform} ${type}", script: "${options.PYTHON_DIR}/python.sh -u ${command}" @@ -443,20 +454,20 @@ def Build(Map options, String platform, String type, String workspace) { } } -def TestMetrics(Map options, Map buildType, String workspace, String branchName, String repoName) { +def TestMetrics(Map options, String workspace, String branchName, String repoName, String buildJobName, String outputDirectory, String configuration) { catchError(buildResult: null, stageResult: null) { - def cmakeBuildDir = [workspace, buildType.value.PARAMETERS.OUTPUT_DIRECTORY].join('/') - def command = "${options.PYTHON_DIR}/python.cmd -u mars/scripts/python/ctest_test_metric_scraper.py -e jenkins.creds.user ${username} -e jenkins.creds.pass ${apitoken} ${cmakeBuildDir} ${branchName} %BUILD_NUMBER% AR ${buildType.value.PARAMETERS.CONFIGURATION} ${repoName} " - if (params.DESTINATION_BRANCH) - command += '--destination-branch "$DESTINATION_BRANCH" ' - dir(workspace) { + def cmakeBuildDir = [workspace, ENGINE_REPOSITORY_NAME, outputDirectory].join('/') + dir("${workspace}/${ENGINE_REPOSITORY_NAME}") { checkout scm: [ $class: 'GitSCM', extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'mars']], userRemoteConfigs: [[url: "${env.MARS_REPO}", name: 'mars']] ] withCredentials([usernamePassword(credentialsId: "${env.SERVICE_USER}", passwordVariable: 'apitoken', usernameVariable: 'username')]) { - bat label: "Publishing ${buildType.key} Test Metrics", + def command = "${options.PYTHON_DIR}/python.cmd -u mars/scripts/python/ctest_test_metric_scraper.py -e jenkins.creds.user ${username} -e jenkins.creds.pass ${apitoken} ${cmakeBuildDir} ${branchName} %BUILD_NUMBER% AR ${configuration} ${repoName} " + if (params.DESTINATION_BRANCH) + command += "--destination-branch ${params.DESTINATION_BRANCH} " + bat label: "Publishing ${buildJobName} Test Metrics", script: command } } @@ -467,7 +478,7 @@ def PostBuildCommonSteps(String workspace, boolean mount = true) { echo 'Starting post-build common steps...' if(params.PULL_REQUEST_ID) { - dir(workspace) { + dir("${workspace}/${ENGINE_REPOSITORY_NAME}") { if(fileExists('.git')) { palSh('git reset --hard HEAD', 'Discard PR merge, git reset') } @@ -505,10 +516,10 @@ def CreateBuildStage(Map pipelineConfig, String platformName, String jobName, Ma } } -def CreateTestMetricsStage(Map pipelineConfig, Map buildJob, String branchName, Map environmentVars) { +def CreateTestMetricsStage(Map pipelineConfig, String branchName, Map environmentVars, String buildJobName, String outputDirectory, String configuration) { return { - stage("${buildJob.key}") { - TestMetrics(pipelineConfig, buildJob, environmentVars['WORKSPACE'], branchName, env.DEFAULT_REPOSITORY_NAME) + stage("${buildJobName}_metrics") { + TestMetrics(pipelineConfig, environmentVars['WORKSPACE'], branchName, env.DEFAULT_REPOSITORY_NAME, buildJobName, outputDirectory, configuration) } } } @@ -564,7 +575,7 @@ try { // Stash the INCREMENTAL_BUILD_SCRIPT_PATH since all nodes will use it if (scmType == 'codecommit') { - PullFilesFromGit(INCREMENTAL_BUILD_SCRIPT_PATH, branchName) + PullFilesFromGit(INCREMENTAL_BUILD_SCRIPT_PATH, branchName, true, ENGINE_REPOSITORY_NAME) } stash name: 'incremental_build_script', includes: INCREMENTAL_BUILD_SCRIPT_PATH @@ -599,19 +610,25 @@ try { withEnv(GetEnvStringList(envVars)) { timeout(time: envVars['TIMEOUT'], unit: 'MINUTES', activity: true) { try { + def build_job_name = build_job.key + CreateSetupStage(pipelineName, branchName, platform.key, build_job.key, envVars).call() if(build_job.value.steps) { //this is a pipe with many steps so create all the build stages build_job.value.steps.each { build_step -> + build_job_name = build_step CreateBuildStage(pipelineConfig, platform.key, build_step, envVars).call() } } else { CreateBuildStage(pipelineConfig, platform.key, build_job.key, envVars).call() } - if (env.MARS_REPO && platform.key == 'Windows' && build_job.key.startsWith('test')) { - CreateTestMetricsStage(pipelineConfig, build_job, branchName, envVars).call() + + if (env.MARS_REPO && platform.key == 'Windows' && build_job_name.startsWith('test')) { + def output_directory = platform.value.build_types[build_job_name].PARAMETERS.OUTPUT_DIRECTORY + def configuration = platform.value.build_types[build_job_name].PARAMETERS.CONFIGURATION + CreateTestMetricsStage(pipelineConfig, branchName, envVars, build_job_name, output_directory, configuration).call() } - } + } catch(Exception e) { // https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/Result.java // {SUCCESS,UNSTABLE,FAILURE,NOT_BUILT,ABORTED} diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt index a787fb84fa..19c6eb260e 100644 --- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt @@ -21,7 +21,7 @@ add_subdirectory(assetpipeline) if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_pytest( NAME AutomatedTesting::PhysicsTests - TEST_SUITE main + TEST_SUITE sandbox TEST_SERIAL PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Active.py TIMEOUT 3600 diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_enum.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_enum.py index 4fa9356b93..3d51444500 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_enum.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_enum.py @@ -53,7 +53,7 @@ typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsB addComponentsOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', entityId, typeIdsList) print_result("Components added to entity", addComponentsOutcome.IsSuccess()) -# fetch the Vegetation Distance Between Filter +# fetch the Vegetation Distance Between Filter vegDistTypeIdList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', ["Vegetation Distance Between Filter"], entity.EntityType().Game) componentOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentsOfType', entityId, vegDistTypeIdList[0]) print_result('Found Vegetation Distance Between Filter', componentOutcome.IsSuccess()) diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_test_utils.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_test_utils.py index 2c88d5d1dc..caf109571e 100755 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_test_utils.py +++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_test_utils.py @@ -52,8 +52,9 @@ def launch_and_validate_results(request, test_directory, editor, editor_script, test_case = os.path.join(test_directory, editor_script) request.addfinalizer(lambda: teardown_editor(editor)) logger.debug("Running automated test: {}".format(editor_script)) - editor.args.extend(["--skipWelcomeScreenDialog", "--regset=/Amazon/Settings/EnableSourceControl=false", - run_python, test_case, "--runpythonargs", " ".join(cfg_args)]) + editor.args.extend(["--skipWelcomeScreenDialog", "--regset=/Amazon/Settings/EnableSourceControl=false", + "--regset=/Amazon/Preferences/EnablePrefabSystem=false", run_python, test_case, + "--runpythonargs", " ".join(cfg_args)]) if auto_test_mode: editor.args.extend(["--autotest_mode"]) if null_renderer: diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py index 9f64f70fe0..4beca8845d 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py @@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ # Test case ID : C14195074 -# Test Case Title : Verify Post Update Events +# Test Case Title : Verify Postsimulate Events # URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/14195074 # fmt: off @@ -29,7 +29,7 @@ class Tests: def C14195074_ScriptCanvas_PostUpdateEvent(): """ - Summary: Verifies that Post Update Event node in Script Canvas works as expected. + Summary: Verifies that Postsimulate Event node in Script Canvas works as expected. Level Description: Lead_Sphere - Directly next to Follow_sphere on the +x axis; has rigid body(gravity disabled), sphere shape diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py index 323bbb9318..4c9c7de263 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py @@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ # Test case ID : C14902097 -# Test Case Title : Verify Pre Update Events +# Test Case Title : Verify Presimulate Events # URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/14902097 # fmt: off @@ -29,7 +29,7 @@ class Tests: def C14902097_ScriptCanvas_PreUpdateEvent(): """ - Summary: Verifies that Pre Update Event node in Script Canvas works as expected. + Summary: Verifies that Presimulate node in Script Canvas works as expected. Level Description: Lead_Sphere - Directly next to Follow_sphere on the +x axis; has rigid body (gravity disabled), sphere shape diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py b/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py index 44da1373b0..669ff3d84d 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py @@ -11,7 +11,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # Test case ID : C14902098 -# Test Case Title : Check that force region simulation with PostPhysicsUpdate works independently from rendering tick +# Test Case Title : Check that force region simulation with Postsimulate works independently from rendering tick # URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/14902098 @@ -41,7 +41,7 @@ def C14902098_ScriptCanvas_PostPhysicsUpdate(): """ Summary: - Check that force region simulation with PostPhysicsUpdate works independently from rendering tick. + Check that force region simulation with Postsimulate works independently from rendering tick. Level Description: A Sphere is placed inside a Force Region. The "Fixed Time Step" in PhysX Configuration is set to 0.05. @@ -49,7 +49,7 @@ def C14902098_ScriptCanvas_PostPhysicsUpdate(): Box Shape components Sphere (entity) - Entity with PhysX Rigid Body, PhysX Collider, Mesh and 2 Script Canvas components Script Canvas: - onpostphysicsupdate - The script checks the position of the sphere on every On Post Physics Update event and prints + onpostphysicsupdate - The script checks the position of the sphere on every On Postsimulate event and prints debug statements as per the position of the sphere relative to its previous position. ontick - The script checks the position of the sphere on every On Tick event and prints debug statements as per the position of the sphere relative to its previous position. diff --git a/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py b/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py index f82e211525..9f595616e7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py @@ -37,7 +37,7 @@ def C28978033_Ragdoll_WorldBodyBusTests(): - RayEnd: entity that points where to end the raycast_correct | ( ) | - o - - - | ¦ | - - > o + o - - - | | | - - > o RayStart | / \ | RayEnd TestRagdoll diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py b/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py index 114be00012..9ae4122eef 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py @@ -253,7 +253,7 @@ def C4044697_Material_PerfaceMaterialValidation(): # 3) Create entity objects sphere_0 = Entity("Sphere_0", math.Vector3(0.0, -10.0, 0.0), math.Vector3(0.0, 0.0, 0.0)) - sphere_1 = Entity("Sphere_1", math.Vector3(-10.0, 0.0, 0.0), math.Vector3(8.35, -0.71, 4.56)) + sphere_1 = Entity("Sphere_1", math.Vector3(-10.0, 0.0, 0.0), math.Vector3(10.09, 1.85, 1.18)) sphere_2 = Entity("Sphere_2", math.Vector3(10.0, 0.0, 0.0), math.Vector3(-5.0, 0.0, 0.0)) perface_entity = Entity("Perface_Entity") entity_list = [sphere_0, sphere_1, sphere_2, perface_entity] diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py b/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py index f9a0687cc5..2b7bf49278 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py @@ -148,7 +148,7 @@ def C5959763_ForceRegion_ForceRegionImpulsesCube(): Report.failure(Tests.tests_completed) else: - # Did Force Region succeed. True if vector z ≈ 1 and force region magnitude ≈ magnitude applied on cube + # Did Force Region succeed. True if vector z is close to 1 and force region magnitude is close to magnitude applied on cube force_region_result = ( ifVectorClose(RegionObject.force_vector.z, UPWARD_Z_VECTOR) and RegionObject.force_region_in_range() ) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py b/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py index 7ff62e7cb2..02bba2f848 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py @@ -148,7 +148,7 @@ def C5959764_ForceRegion_ForceRegionImpulsesCapsule(): Report.failure(Tests.tests_completed) else: - # Did Force Region succeed. True if vector z ≈ 1 and force region magnitude ≈ magnitude applied on Capsule + # Did Force Region succeed. True if vector z is close to 1 and force region magnitude is close to magnitude applied on Capsule force_region_result = ( ifVectorClose(RegionObject.force_vector.z, UPWARD_Z_VECTOR) and RegionObject.force_region_in_range() ) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py b/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py index 8268440521..1afd7b4536 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py @@ -153,7 +153,7 @@ def C5959765_ForceRegion_AssetGetsImpulsed(): Report.failure(Tests.tests_completed) else: - # Did Force Region succeed. True if vector z ≈ 1 and force region magnitude ≈ magnitude applied on Asset + # Did Force Region succeed. True if vector z is close to 1 and force region magnitude is close to magnitude applied on Asset force_region_result = ( ifVectorAxisClose(RegionObject.force_vector.z, UPWARD_Z_VECTOR) and RegionObject.force_region_in_range() ) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py index 23a892b29d..2b93dc4a6f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py @@ -27,7 +27,7 @@ from base import TestAutomationBase revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', 'physxdefaultsceneconfiguration.setreg', 'physxsystemconfiguration.setreg'], 'AutomatedTesting/Registry') -@pytest.mark.SUITE_main +@pytest.mark.SUITE_sandbox @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) class TestAutomation(TestAutomationBase): @@ -263,11 +263,6 @@ class TestAutomation(TestAutomationBase): from . import C4976243_Collision_SameCollisionGroupDiffCollisionLayers as test_module self._run_test(request, workspace, editor, test_module) - @revert_physics_config - def test_C6224408_ScriptCanvas_EntitySpawn(self, request, workspace, editor, launcher_platform): - from . import C6224408_ScriptCanvas_EntitySpawn as test_module - self._run_test(request, workspace, editor, test_module) - @revert_physics_config def test_C12712455_ScriptCanvas_ShapeCastVerification(self, request, workspace, editor, launcher_platform): from . import C12712455_ScriptCanvas_ShapeCastVerification as test_module @@ -324,6 +319,10 @@ class TestAutomation(TestAutomationBase): from . import C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody as test_module self._run_test(request, workspace, editor, test_module) + # Marking the test as an expected failure due to sporadic failure on Automated Review: LYN-2580 + # The test still runs, but a failure of the test doesn't result in the test run failing + @pytest.mark.xfail( + reason="This test needs new physics asset with multiple materials to be more stable.") @revert_physics_config def test_C4044697_Material_PerfaceMaterialValidation(self, request, workspace, editor, launcher_platform): from . import C4044697_Material_PerfaceMaterialValidation as test_module @@ -402,9 +401,6 @@ class TestAutomation(TestAutomationBase): from . import C4976244_Collider_SameGroupSameLayerCollision as test_module self._run_test(request, workspace, editor, test_module) - @pytest.mark.xfail( - reason="This test seems to fail sometimes due to reliance on non-deterministic movement calculations." - "Need to figure out the reason why this is the case") @revert_physics_config @fm.file_override('physxdefaultsceneconfiguration.setreg','C14195074_ScriptCanvas_PostUpdateEvent.setreg', 'AutomatedTesting/Registry') def test_C14195074_ScriptCanvas_PostUpdateEvent(self, request, workspace, editor, launcher_platform): @@ -428,9 +424,6 @@ class TestAutomation(TestAutomationBase): from . import C3510644_Collider_CollisionGroups as test_module self._run_test(request, workspace, editor, test_module) - @pytest.mark.xfail( - reason="This test seems to fail sometimes due to reliance on non-deterministic movement calculations." - "Need to figure out the reason why this is the case") @revert_physics_config @fm.file_override('physxdefaultsceneconfiguration.setreg','C14902097_ScriptCanvas_PreUpdateEvent.setreg', 'AutomatedTesting/Registry') def test_C14902097_ScriptCanvas_PreUpdateEvent(self, request, workspace, editor, launcher_platform): diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly index 15986210b7..b34e483067 100644 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly +++ b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:00f8a158fcfb667b060c902ed2129024f5041816e299c9cace2370f4ac60287d -size 10762 +oid sha256:ec428aee9c49ffd58a00fdcbb0625185a22f5690f7b2e81326ef5443699019e6 +size 10945 diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas index 4cda3349c0..a422f072a5 100644 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,21 +16,21 @@ - + - + - + - + - + @@ -39,9 +39,23 @@ + + + + + + + + + + + + + + - + @@ -67,7 +81,7 @@ - + @@ -78,7 +92,7 @@ - + @@ -104,7 +118,7 @@ - + @@ -114,7 +128,7 @@ - + @@ -141,7 +155,7 @@ - + @@ -151,7 +165,7 @@ - + @@ -178,7 +192,7 @@ - + @@ -188,8 +202,8 @@ - - + + @@ -201,7 +215,7 @@ - + @@ -215,7 +229,7 @@ - + @@ -224,23 +238,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - + + - + @@ -257,7 +303,7 @@ - + @@ -266,18 +312,37 @@ + + + + + + + + + + + + + + + + + + + - + - + - + @@ -290,11 +355,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -303,25 +431,39 @@ + + + + + + + + + + + + + + - - + + - - + + - - + + - + @@ -331,7 +473,7 @@ - + @@ -341,8 +483,8 @@ - - + + @@ -351,10 +493,10 @@ - + - + @@ -368,7 +510,7 @@ - + @@ -378,10 +520,10 @@ - - + + - + @@ -389,13 +531,13 @@ - + - + @@ -405,7 +547,7 @@ - + @@ -415,24 +557,24 @@ - - + + - - + + - + - + @@ -442,7 +584,7 @@ - + @@ -452,8 +594,8 @@ - - + + @@ -479,7 +621,7 @@ - + @@ -489,11 +631,48 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -516,7 +695,7 @@ - + @@ -525,8 +704,27 @@ + + + + + + + + + + + + + + + + + + + - + @@ -536,14 +734,14 @@ - - + + - + - + @@ -554,105 +752,47 @@ - - + + - - + + + + + + + - + - - - - + + + + + - - - - - - - - - - - - - - - - - - + + - - - + + + - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - @@ -660,21 +800,21 @@ - + - + - + - + @@ -716,7 +856,7 @@ - + @@ -753,7 +893,7 @@ - + @@ -806,7 +946,7 @@ - + @@ -822,21 +962,21 @@ - + - + - + - + - + @@ -847,7 +987,7 @@ - + @@ -873,7 +1013,7 @@ - + @@ -883,8 +1023,8 @@ - - + + @@ -910,7 +1050,7 @@ - + @@ -920,10 +1060,10 @@ - - + + - + @@ -931,51 +1071,23 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -990,8 +1102,8 @@ - - + + @@ -1013,109 +1125,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + - + - - - - - - - - - - @@ -1123,21 +1149,21 @@ - + - + - + - + - + @@ -1148,7 +1174,7 @@ - + @@ -1174,7 +1200,7 @@ - + @@ -1184,8 +1210,8 @@ - - + + @@ -1211,7 +1237,7 @@ - + @@ -1220,14 +1246,9 @@ - - - - - - - + + @@ -1236,14 +1257,14 @@ - - + + - + @@ -1253,7 +1274,7 @@ - + @@ -1262,18 +1283,23 @@ + + + + + - - + + - + - + @@ -1291,21 +1317,18 @@ - + - - - + - + - @@ -1313,21 +1336,125 @@ - + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1336,8 +1463,13 @@ + + + + + - + @@ -1348,13 +1480,13 @@ - + - + @@ -1364,7 +1496,7 @@ - + @@ -1374,7 +1506,7 @@ - + @@ -1384,7 +1516,7 @@ - + @@ -1401,7 +1533,7 @@ - + @@ -1410,13 +1542,8 @@ - - - - - - + @@ -1426,14 +1553,14 @@ - - + + - + @@ -1443,7 +1570,7 @@ - + @@ -1453,11 +1580,11 @@ - + - - + + @@ -1490,12 +1617,21 @@ - + - + + + + + + + + + + @@ -1503,7 +1639,7 @@ - + @@ -1693,21 +1829,21 @@ - + - + - + - + - + @@ -1717,8 +1853,8 @@ - - + + @@ -1744,7 +1880,7 @@ - + @@ -1754,8 +1890,8 @@ - - + + @@ -1764,7 +1900,7 @@ - + @@ -1781,7 +1917,7 @@ - + @@ -1791,8 +1927,8 @@ - - + + @@ -1818,7 +1954,7 @@ - + @@ -1827,9 +1963,14 @@ + + + + + - - + + @@ -1838,24 +1979,58 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1865,8 +2040,8 @@ - - + + @@ -1875,7 +2050,7 @@ - + @@ -1892,7 +2067,7 @@ - + @@ -1901,14 +2076,9 @@ - - - - - - - + + @@ -1917,14 +2087,14 @@ - - + + - + @@ -1934,7 +2104,7 @@ - + @@ -1967,48 +2137,143 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -2017,8 +2282,13 @@ + + + + + - + @@ -2028,14 +2298,14 @@ - - + + - + - + @@ -2045,7 +2315,7 @@ - + @@ -2055,24 +2325,24 @@ - + - + - - + + - + @@ -2082,7 +2352,7 @@ - + @@ -2092,34 +2362,80 @@ - + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -2129,8 +2445,8 @@ - - + + @@ -2139,10 +2455,10 @@ - + - + @@ -2156,7 +2472,7 @@ - + @@ -2166,10 +2482,10 @@ - - + + - + @@ -2177,13 +2493,13 @@ - + - + @@ -2193,7 +2509,7 @@ - + @@ -2203,10 +2519,10 @@ - + - + @@ -2214,122 +2530,29 @@ - + - + - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - + @@ -2337,21 +2560,21 @@ - + - + - + - + - + @@ -2360,9 +2583,14 @@ + + + + + - - + + @@ -2372,13 +2600,13 @@ - + - + @@ -2388,7 +2616,7 @@ - + @@ -2398,8 +2626,8 @@ - - + + @@ -2425,7 +2653,7 @@ - + @@ -2435,8 +2663,8 @@ - - + + @@ -2458,48 +2686,57 @@ - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -2508,9 +2745,23 @@ + + + + + + + + + + + + + + - - + + @@ -2519,7 +2770,7 @@ - + @@ -2536,7 +2787,7 @@ - + @@ -2545,14 +2796,9 @@ - - - - - - - + + @@ -2562,13 +2808,13 @@ - + - + @@ -2578,7 +2824,7 @@ - + @@ -2588,10 +2834,10 @@ - - + + - + @@ -2599,13 +2845,13 @@ - + - + @@ -2615,7 +2861,7 @@ - + @@ -2625,24 +2871,24 @@ - - + + - - + + - + - + @@ -2652,7 +2898,7 @@ - + @@ -2662,8 +2908,8 @@ - - + + @@ -2689,7 +2935,7 @@ - + @@ -2699,11 +2945,11 @@ - + - - + + @@ -2726,7 +2972,7 @@ - + @@ -2736,11 +2982,11 @@ - + - + @@ -2763,7 +3009,7 @@ - + @@ -2772,8 +3018,27 @@ + + + + + + + + + + + + + + + + + + + - + @@ -2783,24 +3048,87 @@ - - + + - + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2809,18 +3137,23 @@ + + + + + - + - + - + @@ -2837,7 +3170,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2847,7 +3217,7 @@ - + @@ -2860,7 +3230,7 @@ - + @@ -2884,96 +3254,21 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - + @@ -2981,21 +3276,21 @@ - + - + - + - + - + @@ -3004,9 +3299,14 @@ + + + + + - - + + @@ -3016,13 +3316,13 @@ - + - + @@ -3032,7 +3332,7 @@ - + @@ -3042,8 +3342,8 @@ - - + + @@ -3052,7 +3352,7 @@ - + @@ -3069,7 +3369,7 @@ - + @@ -3079,8 +3379,8 @@ - - + + @@ -3106,7 +3406,7 @@ - + @@ -3115,23 +3415,18 @@ - - - - - - - + + - - + + - + @@ -3149,18 +3444,30 @@ - + - + + + - + + + + + + + + + + + @@ -3168,21 +3475,21 @@ - + - + - + - + - + @@ -3191,9 +3498,14 @@ + + + + + - - + + @@ -3203,13 +3515,13 @@ - + - + @@ -3219,7 +3531,7 @@ - + @@ -3229,8 +3541,8 @@ - - + + @@ -3239,7 +3551,7 @@ - + @@ -3256,7 +3568,7 @@ - + @@ -3266,10 +3578,10 @@ - + - + @@ -3277,29 +3589,47 @@ - + - + - + + + + + + + + + + + + + + + + - - - - - + + + + + + + + - + @@ -3307,21 +3637,21 @@ - + - + - + - + - + @@ -3330,14 +3660,9 @@ - - - - - - - + + @@ -3347,13 +3672,13 @@ - + - + @@ -3363,7 +3688,7 @@ - + @@ -3373,8 +3698,8 @@ - - + + @@ -3400,7 +3725,7 @@ - + @@ -3410,8 +3735,8 @@ - - + + @@ -3433,161 +3758,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3596,14 +3771,9 @@ - - - - - - - + + @@ -3612,14 +3782,14 @@ - - + + - + @@ -3629,7 +3799,7 @@ - + @@ -3639,8 +3809,8 @@ - - + + @@ -3649,7 +3819,7 @@ - + @@ -3666,7 +3836,7 @@ - + @@ -3675,9 +3845,14 @@ + + + + + - - + + @@ -3686,70 +3861,24 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3759,24 +3888,24 @@ - - + + - + - - + + - + @@ -3786,7 +3915,7 @@ - + @@ -3796,8 +3925,8 @@ - - + + @@ -3809,7 +3938,7 @@ - + @@ -3823,7 +3952,7 @@ - + @@ -3856,143 +3985,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4001,13 +4168,8 @@ - - - - - - + @@ -4018,13 +4180,13 @@ - + - + @@ -4034,7 +4196,7 @@ - + @@ -4044,7 +4206,7 @@ - + @@ -4054,7 +4216,7 @@ - + @@ -4071,7 +4233,7 @@ - + @@ -4081,24 +4243,24 @@ - + - - + + - + - + @@ -4123,16 +4285,16 @@ - - - + + + - + @@ -4140,21 +4302,21 @@ - + - + - + - + - + @@ -4163,13 +4325,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -4179,14 +4373,14 @@ - - + + - + @@ -4196,7 +4390,7 @@ - + @@ -4205,8 +4399,13 @@ + + + + + - + @@ -4217,13 +4416,13 @@ - + - + @@ -4233,7 +4432,7 @@ - + @@ -4243,10 +4442,10 @@ - + - + @@ -4254,13 +4453,13 @@ - + - + @@ -4280,21 +4479,12 @@ - + - - - - - - - - - - + @@ -4302,21 +4492,21 @@ - + - + - + - + - + @@ -4327,7 +4517,7 @@ - + @@ -4353,7 +4543,7 @@ - + @@ -4363,8 +4553,8 @@ - - + + @@ -4390,7 +4580,7 @@ - + @@ -4400,10 +4590,10 @@ - - + + - + @@ -4411,23 +4601,51 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -4442,8 +4660,8 @@ - - + + @@ -4459,7 +4677,81 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4470,18 +4762,30 @@ - + - + + + - + + + + + + + + + + + @@ -4489,21 +4793,21 @@ - + - + - + - + - + @@ -4514,7 +4818,7 @@ - + @@ -4540,7 +4844,7 @@ - + @@ -4550,8 +4854,8 @@ - - + + @@ -4577,7 +4881,7 @@ - + @@ -4586,9 +4890,14 @@ + + + + + - - + + @@ -4597,14 +4906,14 @@ - - + + - + @@ -4614,7 +4923,7 @@ - + @@ -4623,23 +4932,18 @@ - - - - - - - + + - + - + @@ -4653,42 +4957,293 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + - + - + @@ -4696,7 +5251,7 @@ - + @@ -4709,17 +5264,17 @@ - + - + - + @@ -4727,7 +5282,7 @@ - + @@ -4740,28 +5295,28 @@ - + - + - + - + - + - + - + @@ -4771,28 +5326,59 @@ - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4802,17 +5388,17 @@ - + - + - + @@ -4820,7 +5406,7 @@ - + @@ -4833,28 +5419,28 @@ - + - + - + - + - + - + - + @@ -4864,17 +5450,48 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -4882,7 +5499,7 @@ - + @@ -4895,28 +5512,28 @@ - + - + - + - + - + - + - + @@ -4926,25 +5543,25 @@ - + - + - + - + - + @@ -4957,28 +5574,28 @@ - + - + - + - + - + - + - + @@ -4988,28 +5605,28 @@ - + - + - + - + - + - + - + @@ -5019,28 +5636,28 @@ - + - + - + - + - + - + - + @@ -5050,28 +5667,90 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -5081,28 +5760,28 @@ - + - + - + - + - + - + - + @@ -5112,28 +5791,28 @@ - + - + - + - + - + - + - + @@ -5143,28 +5822,28 @@ - + - + - + - + - + - + - + @@ -5174,28 +5853,28 @@ - + - + - + - + - + - + - + @@ -5205,28 +5884,28 @@ - + - + - + - + - + - + - + @@ -5236,28 +5915,28 @@ - + - + - + - + - + - + - + @@ -5267,28 +5946,28 @@ - + - + - + - + - + - + - + @@ -5298,28 +5977,28 @@ - + - + - + - + - + - + - + @@ -5329,28 +6008,28 @@ - + - + - + - + - + - + - + @@ -5360,28 +6039,28 @@ - + - + - + - + - + - + - + @@ -5391,28 +6070,28 @@ - + - + - + - + - + - + - + @@ -5422,28 +6101,28 @@ - + - + - + - + - + - + - + @@ -5453,28 +6132,28 @@ - + - + - + - + - + - + - + @@ -5484,28 +6163,28 @@ - + - + - + - + - + - + - + @@ -5515,28 +6194,28 @@ - + - + - + - + - + - + - + @@ -5546,28 +6225,28 @@ - + - + - + - + - + - + - + @@ -5577,28 +6256,28 @@ - + - + - + - + - + - + - + @@ -5608,28 +6287,28 @@ - + - + - + - + - + - + - + @@ -5639,28 +6318,28 @@ - + - + - + - + - + - + - + @@ -5670,28 +6349,28 @@ - + - + - + - + - + - + - + @@ -5707,7 +6386,7 @@ - + @@ -5715,7 +6394,7 @@ - + @@ -5723,33 +6402,222 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + @@ -5757,7 +6625,7 @@ - + @@ -5765,27 +6633,27 @@ - + - + - + - + @@ -5799,22 +6667,20 @@ - + - - - - + + + - - - - + + + @@ -5825,15 +6691,17 @@ - - - + + + + - - - + + + + @@ -5841,41 +6709,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -5883,41 +6751,46 @@ - + - - - - + + + - - + + - + - - + + - + - - - + + + + + + + + + - - - + + + @@ -5925,22 +6798,20 @@ - + - - - - + + + - - - - + + + @@ -5951,36 +6822,17 @@ - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - + + + + @@ -5988,41 +6840,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -6030,7 +6882,7 @@ - + @@ -6038,7 +6890,7 @@ - + @@ -6058,7 +6910,7 @@ - + @@ -6072,46 +6924,41 @@ - + - - - - - - - - - + + + - + - - + + - + - - + + - + - - - + + + + @@ -6119,7 +6966,7 @@ - + @@ -6127,27 +6974,27 @@ - + - + - + - + @@ -6161,88 +7008,83 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + - - - - - - - - - - - - - - - + + + + + + + + + - + - - + + - + - - + + - + - - - + + + + @@ -6250,46 +7092,41 @@ - + - - - - - - - - - + + + - + - - + + - + - - + + - + - - - + + + + @@ -6297,41 +7134,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -6339,41 +7176,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -6381,41 +7218,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -6423,41 +7260,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -6465,7 +7302,7 @@ - + @@ -6473,27 +7310,27 @@ - + - + - + - + @@ -6507,41 +7344,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -6549,41 +7386,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -6594,49 +7431,57 @@ - + - - + + - + - - + + - - + + - + - + - + - - + + - + + + + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml index 3a083a6882..6ea168cc6b 100644 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml +++ b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml @@ -1,17 +1,17 @@ - + - + - + - + @@ -20,31 +20,31 @@ - + - + - + - + - + - + - + @@ -56,7 +56,7 @@ - + @@ -83,10 +83,10 @@ - + - + @@ -104,7 +104,7 @@ - + @@ -140,7 +140,7 @@ - + @@ -149,7 +149,7 @@ - + @@ -158,76 +158,76 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -239,10 +239,10 @@ - + - + @@ -251,7 +251,7 @@ - + @@ -263,7 +263,7 @@ - + @@ -275,10 +275,10 @@ - + - + @@ -287,7 +287,7 @@ - + @@ -341,7 +341,7 @@ - + @@ -350,7 +350,7 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/C12712455_ScriptCanvas_ShapeCastVerification.ly b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/C12712455_ScriptCanvas_ShapeCastVerification.ly index 5c93e231d5..5088b67628 100644 --- a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/C12712455_ScriptCanvas_ShapeCastVerification.ly +++ b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/C12712455_ScriptCanvas_ShapeCastVerification.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f096ae6620bbb17e9a1c98f7f476f62762753e1359a1dfe84192ba3e052e6404 -size 10036 +oid sha256:6df3d83f5b9dd43118aba5cef3a8fe9ee42ee253f7bd3886fc7c88f41c504fff +size 8802 diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/filelist.xml b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/filelist.xml index 362bfb7b51..36bb23e8d4 100644 --- a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/filelist.xml +++ b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/filelist.xml @@ -1,6 +1,6 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/level.pak b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/level.pak index 6945bded24..cc9a49f622 100644 --- a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/level.pak +++ b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/level.pak @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8cdc13062aba6712ebbcc2f32f49295cd1e872f7313a02994f8d06baf7765bd0 -size 39334 +oid sha256:625b55f2edc3e8eabeea7d87575119590fe7ed88db70a6125eb6bf9d891d743f +size 39113 diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TimeOfDay.xml index 456d609b8a..6ea168cc6b 100644 --- a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TimeOfDay.xml +++ b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TimeOfDay.xml @@ -1,356 +1,356 @@ - - + + - - + + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - - + + - + - - + + - + - + - - + + diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas index e973421d1d..88e3333298 100644 --- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,21 +16,21 @@ - + - + - + - + - + @@ -40,8 +40,8 @@ - - + + @@ -67,7 +67,7 @@ - + @@ -77,8 +77,8 @@ - - + + @@ -87,7 +87,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -114,8 +114,8 @@ - - + + @@ -141,7 +141,7 @@ - + @@ -150,46 +150,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + @@ -198,24 +166,58 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -225,13 +227,22 @@ - + + + + + + + + + + - - + + @@ -241,13 +252,13 @@ - + - + @@ -257,7 +268,7 @@ - + @@ -267,24 +278,24 @@ - - + + - + - - + + - + @@ -294,7 +305,7 @@ - + @@ -304,8 +315,8 @@ - - + + @@ -317,7 +328,7 @@ - + @@ -331,7 +342,7 @@ - + @@ -341,10 +352,10 @@ - - + + - + @@ -352,13 +363,13 @@ - + - + @@ -368,7 +379,7 @@ - + @@ -378,8 +389,8 @@ - - + + @@ -405,7 +416,7 @@ - + @@ -419,8 +430,22 @@ + + + + + + + + + + + + + + - + @@ -443,48 +468,60 @@ - - - - - + + + + + + + - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -494,24 +531,24 @@ - + - + - - + + - + @@ -521,7 +558,7 @@ - + @@ -531,7 +568,7 @@ - + @@ -544,7 +581,7 @@ - + @@ -558,7 +595,7 @@ - + @@ -567,18 +604,23 @@ + + + + + - + - + - + @@ -595,7 +637,7 @@ - + @@ -604,18 +646,23 @@ + + + + + - + - + - + @@ -632,7 +679,7 @@ - + @@ -641,18 +688,23 @@ + + + + + - + - + - + @@ -669,7 +721,7 @@ - + @@ -679,10 +731,10 @@ - + - + @@ -690,13 +742,13 @@ - + - + - + @@ -707,203 +759,43 @@ - + - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - + + + + + - - - - + + + - - + + - - - - - + @@ -911,21 +803,21 @@ - + - + - + - + - + @@ -936,7 +828,7 @@ - + @@ -962,7 +854,7 @@ - + @@ -973,7 +865,7 @@ - + @@ -999,7 +891,7 @@ - + @@ -1008,23 +900,18 @@ - - - - - - + - - + + - + @@ -1037,11 +924,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1050,18 +968,23 @@ + + + + + - + - + - + @@ -1078,7 +1001,7 @@ - + @@ -1088,24 +1011,24 @@ - + - + - - + + - + @@ -1115,7 +1038,7 @@ - + @@ -1125,10 +1048,10 @@ - + - + @@ -1152,7 +1075,7 @@ - + @@ -1162,10 +1085,10 @@ - + - + @@ -1173,13 +1096,13 @@ - + - + @@ -1190,59 +1113,30 @@ - + - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + @@ -1250,21 +1144,21 @@ - + - + - + - + - + @@ -1275,7 +1169,7 @@ - + @@ -1301,7 +1195,7 @@ - + @@ -1311,8 +1205,8 @@ - - + + @@ -1338,7 +1232,7 @@ - + @@ -1348,10 +1242,10 @@ - - + + - + @@ -1359,48 +1253,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1413,82 +1265,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1498,10 +1279,10 @@ - + - + @@ -1509,48 +1290,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1567,7 +1306,7 @@ - + @@ -1576,23 +1315,18 @@ - - - - - - + - + - + @@ -1609,7 +1343,7 @@ - + @@ -1618,23 +1352,18 @@ - - - - - - + - + - + @@ -1647,85 +1376,48 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + - - - - - - - - - - - + + + - - - - - - - - - - - + + + + + + + + + + - - @@ -1733,7 +1425,7 @@ - + @@ -1837,21 +1529,125 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -1861,8 +1657,8 @@ - - + + @@ -1888,7 +1684,7 @@ - + @@ -1898,8 +1694,8 @@ - - + + @@ -1908,7 +1704,7 @@ - + @@ -1925,7 +1721,7 @@ - + @@ -1935,10 +1731,10 @@ - - + + - + @@ -1946,13 +1742,13 @@ - + - + @@ -1962,7 +1758,7 @@ - + @@ -1972,10 +1768,10 @@ - - + + - + @@ -1983,13 +1779,13 @@ - + - + @@ -1999,7 +1795,7 @@ - + @@ -2009,10 +1805,10 @@ - - + + - + @@ -2020,13 +1816,13 @@ - + - + @@ -2036,7 +1832,7 @@ - + @@ -2045,18 +1841,23 @@ + + + + + - - + + - + - + @@ -2069,174 +1870,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2245,23 +1883,18 @@ - - - - - - + - + - + @@ -2278,7 +1911,7 @@ - + @@ -2288,7 +1921,7 @@ - + @@ -2298,10 +1931,10 @@ - + - + @@ -2315,7 +1948,7 @@ - + @@ -2325,10 +1958,10 @@ - + - + @@ -2352,7 +1985,7 @@ - + @@ -2362,7 +1995,7 @@ - + @@ -2375,7 +2008,7 @@ - + @@ -2404,47 +2037,524 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + - - - + - + - + - + - + - + - + @@ -2454,28 +2564,28 @@ - + - + - + - + - + - + - + @@ -2485,28 +2595,28 @@ - + - + - + - + - + - + - + @@ -2516,28 +2626,28 @@ - + - + - + - + - + - + - + @@ -2547,28 +2657,28 @@ - + - + - + - + - + - + - + @@ -2578,28 +2688,28 @@ - + - + - + - + - + - + - + @@ -2609,28 +2719,28 @@ - + - + - + - + - + - + - + @@ -2640,28 +2750,28 @@ - + - + - + - + - + - + - + @@ -2671,28 +2781,28 @@ - + - + - + - + - + - + - + @@ -2702,28 +2812,28 @@ - + - + - + - + - + - + - + @@ -2733,28 +2843,28 @@ - + - + - + - + - + - + - + @@ -2770,7 +2880,7 @@ - + @@ -2778,7 +2888,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2820,7 +2972,70 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2862,7 +3077,7 @@ - + @@ -2870,27 +3085,27 @@ - + - + - + - + @@ -2904,7 +3119,7 @@ - + @@ -2946,7 +3161,7 @@ - + @@ -2957,7 +3172,7 @@ - + @@ -2965,14 +3180,14 @@ - + - + @@ -2993,7 +3208,7 @@ - + @@ -3001,27 +3216,27 @@ - + - + - + - + @@ -3035,28 +3250,7 @@ - - - - - - - - - - - - - - - - - - - - - - + @@ -3064,27 +3258,27 @@ - + - + - + - + @@ -3098,7 +3292,7 @@ - + @@ -3106,27 +3300,27 @@ - + - + - + - + @@ -3158,9 +3352,22 @@ + + + + + + + + + + + + + @@ -3170,11 +3377,15 @@ - + - + + + + + @@ -3182,11 +3393,11 @@ - + - + @@ -3204,7 +3415,7 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/C4044697_Material_PerfaceMaterialValidation.ly b/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/C4044697_Material_PerfaceMaterialValidation.ly index 48958d519b..0de21e7ffa 100644 --- a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/C4044697_Material_PerfaceMaterialValidation.ly +++ b/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/C4044697_Material_PerfaceMaterialValidation.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c96e192861177f27edcd4dde87612645f328cb4d53ee31fb188cb75a0da7496b -size 9974 +oid sha256:1f42344cdf0092eac6fc43bff66a2e0d9706511865da89490abfb2d054a1b5db +size 9647 diff --git a/AutomatedTesting/Levels/Simple/Simple.cry b/AutomatedTesting/Levels/Simple/Simple.ly similarity index 100% rename from AutomatedTesting/Levels/Simple/Simple.cry rename to AutomatedTesting/Levels/Simple/Simple.ly diff --git a/AutomatedTesting/Registry/editorpreferences.setreg b/AutomatedTesting/Registry/editorpreferences.setreg new file mode 100644 index 0000000000..b338d6acad --- /dev/null +++ b/AutomatedTesting/Registry/editorpreferences.setreg @@ -0,0 +1,7 @@ +{ + "Amazon": { + "Preferences": { + "EnablePrefabSystem": false + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas b/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas index 2383fb043f..ff9fe5c64c 100644 --- a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,21 +16,142 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -41,7 +162,7 @@ - + @@ -64,9 +185,46 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,7 +232,16 @@ - + + + + + + + + + + @@ -290,21 +457,21 @@ - + - + - + - + @@ -313,23 +480,18 @@ - - - - - - + - + - + @@ -346,7 +508,7 @@ - + @@ -361,7 +523,7 @@ - + @@ -388,7 +550,7 @@ - + @@ -425,7 +587,7 @@ - + @@ -469,36 +631,24 @@ - + - - - - - - - - - - - - - - + + - + - + @@ -506,21 +656,21 @@ - + - + - + - + - + @@ -557,7 +707,7 @@ - + @@ -594,7 +744,7 @@ - + @@ -636,7 +786,7 @@ - + @@ -678,7 +828,7 @@ - + @@ -720,7 +870,7 @@ - + @@ -762,7 +912,7 @@ - + @@ -777,7 +927,7 @@ - + @@ -804,7 +954,7 @@ - + @@ -813,18 +963,23 @@ + + + + + - + - + - + @@ -841,7 +996,7 @@ - + @@ -851,10 +1006,10 @@ - + - + @@ -878,7 +1033,7 @@ - + @@ -888,7 +1043,7 @@ - + @@ -915,7 +1070,7 @@ - + @@ -925,10 +1080,10 @@ - + - + @@ -952,7 +1107,7 @@ - + @@ -962,10 +1117,10 @@ - + - + @@ -985,96 +1140,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1083,23 +1153,18 @@ - - - - - - + - + - + @@ -1116,7 +1181,7 @@ - + @@ -1125,23 +1190,18 @@ - - - - - - + - + - + @@ -1154,129 +1214,94 @@ - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - + + + + - - - - - + + + + + - - - - - - - + + + - - - - + + + + + + - - - - - - + + + - - - + + + + + + + - - - - + + + + - - - + - - - + - + - + - + + + - + - - - - - - - - - - + - + - + @@ -1598,7 +1623,7 @@ - + @@ -1838,26 +1863,26 @@ - + - + - + - + - + - + @@ -1867,10 +1892,10 @@ - - + + - + @@ -1878,25 +1903,46 @@ - + - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1936,7 +1982,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1973,7 +2061,7 @@ - + @@ -2017,24 +2105,36 @@ - + + + + + + + + + + + + + - - + + - + - + @@ -2044,28 +2144,28 @@ - + - + - + - + - + - + - + @@ -2075,28 +2175,28 @@ - + - + - + - + - + - + - + @@ -2106,28 +2206,28 @@ - + - + - + - + - + - + - + @@ -2137,28 +2237,28 @@ - + - + - + - + - + - + - + @@ -2168,17 +2268,17 @@ - + - + - + - + @@ -2186,10 +2286,10 @@ - + - + @@ -2199,28 +2299,28 @@ - + - + - + - + - + - + - + @@ -2230,28 +2330,28 @@ - + - + - + - + - + - + - + @@ -2261,28 +2361,28 @@ - + - + - + - + - + - + - + @@ -2292,28 +2392,28 @@ - + - + - + - + - + - + - + @@ -2329,7 +2429,7 @@ - + @@ -2337,7 +2437,7 @@ - + @@ -2345,27 +2445,33 @@ - + - + - + - + + + + + + + @@ -2373,22 +2479,20 @@ - + - - - - + + + - - - - + + + @@ -2399,15 +2503,17 @@ - - - + + + + - - - + + + + @@ -2415,22 +2521,20 @@ - + - - - - + + + - - - - + + + @@ -2441,15 +2545,17 @@ - - - + + + + - - - + + + + @@ -2457,22 +2563,20 @@ - + - - - - + + + - - - - + + + @@ -2483,15 +2587,38 @@ - - - + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2499,7 +2626,7 @@ - + @@ -2512,14 +2639,14 @@ - + - + @@ -2533,7 +2660,7 @@ - + @@ -2541,22 +2668,20 @@ - + - - - - + + + - - - - + + + @@ -2567,36 +2692,17 @@ - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -2604,7 +2710,7 @@ - + @@ -2612,7 +2718,7 @@ - + @@ -2626,13 +2732,13 @@ - + - + @@ -2646,7 +2752,7 @@ - + @@ -2654,27 +2760,27 @@ - + - + - + - + @@ -2690,20 +2796,16 @@ - - - - - + - + @@ -2711,7 +2813,11 @@ - + + + + + diff --git a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas index 97c2213cc0..988184109a 100644 --- a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,382 +16,453 @@ - + - + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - + + + + - - - - - + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + - - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + - + - + @@ -607,7 +678,7 @@ - + @@ -781,7 +852,7 @@ - + @@ -806,21 +877,21 @@ - + - + - + @@ -857,7 +928,7 @@ - + @@ -894,7 +965,7 @@ - + @@ -931,7 +1002,7 @@ - + @@ -968,7 +1039,7 @@ - + @@ -1005,7 +1076,7 @@ - + @@ -1021,7 +1092,7 @@ - + @@ -1047,7 +1118,7 @@ - + @@ -1057,10 +1128,10 @@ - + - + @@ -1084,7 +1155,7 @@ - + @@ -1094,7 +1165,7 @@ - + @@ -1121,7 +1192,7 @@ - + @@ -1131,10 +1202,10 @@ - + - + @@ -1158,7 +1229,7 @@ - + @@ -1168,7 +1239,7 @@ - + @@ -1191,540 +1262,579 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - + + + + + - - - + + + + + + + + + + + + + + - - - + + - - - + + + + + + + + - - - - - + + + + + + + + + - - - - - - - + + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + - - - + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + - + - + - + - + - + - + @@ -1734,28 +1844,28 @@ - + - + - + - + - + - + - + @@ -1765,28 +1875,28 @@ - + - + - + - + - + - + - + @@ -1796,28 +1906,28 @@ - + - + - + - + - + - + - + @@ -1827,28 +1937,28 @@ - + - + - + - + - + - + - + @@ -1864,7 +1974,7 @@ - + @@ -1872,41 +1982,83 @@ - + - - + + + + + + + + + + + + + + - + - + - - + + - + + + + + + + + + + + + + + + + - + - - - + + + + + + + + + + + + + + + + + + @@ -1914,7 +2066,7 @@ - + @@ -1923,9 +2075,9 @@ - - - + + + @@ -1935,7 +2087,7 @@ - + @@ -1971,7 +2123,7 @@ - + @@ -1981,31 +2133,36 @@ - - - - - - - + - - + + - + - - + + - + + + + + + + + + + + + @@ -2013,27 +2170,22 @@ - + - - + + - - - - - - + - - + + - + @@ -2046,7 +2198,55 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2063,6 +2263,15 @@ + + + + + + + + + @@ -2074,12 +2283,20 @@ + + + + - + + + + + diff --git a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas index 9613504689..a5b927dfc1 100644 --- a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,7 +16,149 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -232,7 +374,7 @@ - + @@ -602,26 +744,26 @@ - + - + - + - + - + - + @@ -631,13 +773,22 @@ - + + + + + + + + + + - - + + @@ -647,13 +798,13 @@ - + - + @@ -663,7 +814,7 @@ - + @@ -673,8 +824,8 @@ - - + + @@ -700,7 +851,7 @@ - + @@ -710,10 +861,10 @@ - - + + - + @@ -721,13 +872,13 @@ - + - + @@ -737,7 +888,7 @@ - + @@ -747,8 +898,8 @@ - - + + @@ -770,57 +921,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -830,8 +935,8 @@ - - + + @@ -840,10 +945,10 @@ - + - + @@ -857,7 +962,7 @@ - + @@ -867,24 +972,24 @@ - - + + - + - - + + - + @@ -894,7 +999,7 @@ - + @@ -903,9 +1008,28 @@ + + + + + + + + + + + + + + + + + + + - - + + @@ -914,35 +1038,92 @@ - - + + - + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -951,7 +1132,7 @@ - + @@ -968,7 +1149,7 @@ - + @@ -978,8 +1159,8 @@ - - + + @@ -988,7 +1169,7 @@ - + @@ -1005,7 +1186,7 @@ - + @@ -1014,14 +1195,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + @@ -1030,14 +1243,14 @@ - - + + - + @@ -1047,7 +1260,7 @@ - + @@ -1057,10 +1270,10 @@ - - + + - + @@ -1068,13 +1281,13 @@ - + - + @@ -1084,7 +1297,7 @@ - + @@ -1093,9 +1306,14 @@ + + + + + - - + + @@ -1104,14 +1322,14 @@ - - + + - + - + @@ -1121,7 +1339,7 @@ - + @@ -1131,10 +1349,10 @@ - + - + @@ -1158,7 +1376,7 @@ - + @@ -1168,7 +1386,7 @@ - + @@ -1195,7 +1413,7 @@ - + @@ -1205,10 +1423,10 @@ - + - + @@ -1232,7 +1450,7 @@ - + @@ -1242,7 +1460,7 @@ - + @@ -1265,11 +1483,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1278,18 +1587,23 @@ + + + + + - + - + - + @@ -1306,7 +1620,7 @@ - + @@ -1316,7 +1630,7 @@ - + @@ -1326,10 +1640,10 @@ - + - + @@ -1343,7 +1657,7 @@ - + @@ -1352,23 +1666,18 @@ - - - - - - + - + - + @@ -1385,7 +1694,7 @@ - + @@ -1395,7 +1704,7 @@ - + @@ -1408,7 +1717,7 @@ - + @@ -1423,186 +1732,123 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + - + - + - + - + - + - + @@ -1612,28 +1858,28 @@ - + - + - + - + - + - + - + @@ -1643,28 +1889,28 @@ - + - + - + - + - + - + - + @@ -1674,28 +1920,28 @@ - + - + - + - + - + - + - + @@ -1705,28 +1951,59 @@ - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1742,7 +2019,7 @@ - + @@ -1750,64 +2027,125 @@ - + - - + + + + + + + + + + + + + + - + - + - - + + - + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + - - - - + + + @@ -1818,15 +2156,17 @@ - - - + + + + - - - + + + + @@ -1834,20 +2174,41 @@ - + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1855,7 +2216,7 @@ - + @@ -1876,7 +2237,7 @@ - + @@ -1886,7 +2247,7 @@ - + @@ -1894,7 +2255,7 @@ - + @@ -1902,22 +2263,20 @@ - + - - - - + + + - - - - + + + @@ -1928,15 +2287,17 @@ - - - + + + + - - - + + + + @@ -1962,11 +2323,28 @@ + + + + + + + + + - + + + + + + + + + @@ -1974,11 +2352,11 @@ - + - + diff --git a/AutomatedTesting/physicssurfaces/default_phys_materials.physmaterial b/AutomatedTesting/physicssurfaces/default_phys_materials.physmaterial new file mode 100644 index 0000000000..3c39d5521e --- /dev/null +++ b/AutomatedTesting/physicssurfaces/default_phys_materials.physmaterial @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/CMakeLists.txt b/CMakeLists.txt index 801aa0447c..dfc299e144 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ # # Cmake version 3.17 is the minimum version needed for all of lumberyard's supported platforms -cmake_minimum_required(VERSION 3.17) +cmake_minimum_required(VERSION 3.19) # CMP0111 introduced in 3.19 has a bug that produces the policy to warn every time there is an # INTERFACE IMPORTED library. We use this type of libraries for handling 3rdParty. The rest of diff --git a/Code/CryEngine/Cry3DEngine/3dEngine.h b/Code/CryEngine/Cry3DEngine/3dEngine.h index 5cd6c20e10..a8e46c32ae 100644 --- a/Code/CryEngine/Cry3DEngine/3dEngine.h +++ b/Code/CryEngine/Cry3DEngine/3dEngine.h @@ -559,7 +559,7 @@ public: virtual bool Init(); virtual void OnFrameStart(); virtual void Update(); - virtual void RenderWorld(const int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName); + virtual void RenderWorld(int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName); virtual void PreWorldStreamUpdate(const CCamera& cam); virtual void WorldStreamUpdate(); virtual void ShutDown(); @@ -570,7 +570,7 @@ public: virtual void PostLoadLevel(); virtual bool InitLevelForEditor(const char* szFolderName, const char* szMissionName); virtual bool LevelLoadingInProgress(); - virtual void DisplayInfo(float& fTextPosX, float& fTextPosY, float& fTextStepY, const bool bEnhanced); + virtual void DisplayInfo(float& fTextPosX, float& fTextPosY, float& fTextStepY, bool bEnhanced); virtual void DisplayMemoryStatistics(); virtual void SetupDistanceFog(); virtual IStatObj* LoadStatObjUnsafeManualRef(const char* fileName, const char* geomName = nullptr, /*[Out]*/ IStatObj::SSubObject** subObject = nullptr, @@ -893,7 +893,7 @@ public: void UpdatePostRender(const SRenderingPassInfo& passInfo); virtual void RenderScene(const int nRenderFlags, const SRenderingPassInfo& passInfo); - virtual void RenderSceneReflection(const int nRenderFlags, const SRenderingPassInfo& passInfo); + virtual void RenderSceneReflection(int nRenderFlags, const SRenderingPassInfo& passInfo); virtual void DebugDraw_UpdateDebugNode(); void DebugDraw_Draw(); diff --git a/Code/CryEngine/Cry3DEngine/3dEngineLoad.cpp b/Code/CryEngine/Cry3DEngine/3dEngineLoad.cpp index a3cb04dea0..215fe602c9 100644 --- a/Code/CryEngine/Cry3DEngine/3dEngineLoad.cpp +++ b/Code/CryEngine/Cry3DEngine/3dEngineLoad.cpp @@ -38,7 +38,9 @@ #include #include #include -#include "AzCore/Component/TickBus.h" + +#include +#include //------------------------------------------------------------------------------ #define LEVEL_DATA_FILE "LevelData.xml" @@ -154,6 +156,9 @@ bool C3DEngine::InitLevelForEditor([[maybe_unused]] const char* szFolderName, [[ ClearDebugFPSInfo(); + bool usePrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); if (!szFolderName || !szFolderName[0]) { @@ -161,7 +166,7 @@ bool C3DEngine::InitLevelForEditor([[maybe_unused]] const char* szFolderName, [[ return 0; } - if (!szMissionName || !szMissionName[0]) + if (!usePrefabSystemEnabled && (!szMissionName || !szMissionName[0])) { Warning("C3DEngine::LoadLevel: Mission name is not specified"); } @@ -248,6 +253,17 @@ bool C3DEngine::LevelLoadingInProgress() bool C3DEngine::LoadCompiledOctreeForEditor() { + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) + { + // Prefab levels don't use any of the legacy level data. + return true; + } + + // Load LevelData.xml File. XmlNodeRef xmlLevelData = GetSystem()->LoadXmlFromFile(GetLevelFilePath(LEVEL_DATA_FILE)); @@ -257,18 +273,8 @@ bool C3DEngine::LoadCompiledOctreeForEditor() return false; } - std::vector* pStatObjTable = NULL; - std::vector<_smart_ptr >* pMatTable = NULL; - - int nSID = 0; - - XmlNodeRef nodeRef = xmlLevelData->findChild("SurfaceTypes"); - LoadCollisionClasses(xmlLevelData->findChild("CollisionClasses")); - SAFE_DELETE(pStatObjTable); - SAFE_DELETE(pMatTable); - return true; } @@ -617,6 +623,11 @@ bool C3DEngine::LoadLevel(const char* szFolderName, const char* szMissionName) GetISystem()->LoadConfiguration(GetLevelFilePath(LEVEL_CONFIG_FILE)); } + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (!usePrefabSystemForLevels) { // check is LevelData.xml file exist char sMapFileName[_MAX_PATH]; cry_strcpy(sMapFileName, m_szLevelFolder); @@ -659,12 +670,16 @@ bool C3DEngine::LoadLevel(const char* szFolderName, const char* szMissionName) } // Load LevelData.xml File. - XmlNodeRef xmlLevelData = GetSystem()->LoadXmlFromFile(GetLevelFilePath(LEVEL_DATA_FILE)); - - if (xmlLevelData == 0) + XmlNodeRef xmlLevelData; + if (!usePrefabSystemForLevels) { - Error("C3DEngine::LoadLevel: xml file not found (files missing?)"); // files missing ? - return false; + xmlLevelData = GetSystem()->LoadXmlFromFile(GetLevelFilePath(LEVEL_DATA_FILE)); + + if (xmlLevelData == 0) + { + Error("C3DEngine::LoadLevel: xml file not found (files missing?)"); // files missing ? + return false; + } } // re-create decal manager @@ -690,41 +705,48 @@ bool C3DEngine::LoadLevel(const char* szFolderName, const char* szMissionName) m_pObjManager->PreloadLevelObjects(); } - std::vector* pStatObjTable = NULL; - std::vector<_smart_ptr >* pMatTable = NULL; - - int nSID = 0; - - // load terrain - XmlNodeRef nodeRef = xmlLevelData->findChild("SurfaceTypes"); - - LoadCollisionClasses(xmlLevelData->findChild("CollisionClasses")); + if (!usePrefabSystemForLevels) + { + LoadCollisionClasses(xmlLevelData->findChild("CollisionClasses")); + } gEnv->pSystem->SetSystemGlobalState(ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_STATIC_WORLD); -#if defined(FEATURE_SVO_GI) - if (gEnv->pConsole->GetCVar("e_GI")->GetIVal()) + if (usePrefabSystemForLevels) { - // Load SVOGI settings - char szFileName[256]; - azsprintf(szFileName, "mission_%s.xml", szMissionName); - XmlNodeRef xmlMission = GetSystem()->LoadXmlFromFile(Get3DEngine()->GetLevelFilePath(szFileName)); - if (xmlMission) + // When using the prefab system, just initialize a default manager instead of loading values from the indoor.dat file. + m_pVisAreaManager = new CVisAreaManager(); + } + else + { +#if defined(FEATURE_SVO_GI) + if (gEnv->pConsole->GetCVar("e_GI")->GetIVal()) { - LoadTISettings(xmlMission->findChild("Environment")); + // Load SVOGI settings + char szFileName[256]; + azsprintf(szFileName, "mission_%s.xml", szMissionName); + XmlNodeRef xmlMission = GetSystem()->LoadXmlFromFile(Get3DEngine()->GetLevelFilePath(szFileName)); + if (xmlMission) + { + LoadTISettings(xmlMission->findChild("Environment")); + } } - } #endif - // load indoors - if (!LoadVisAreas(&pStatObjTable, &pMatTable)) - { - Error("VisAreas file (%s) not found or file version error, please try to re-export the level", COMPILED_VISAREA_MAP_FILE_NAME); - return false; + // load indoors + std::vector* pStatObjTable = NULL; + std::vector<_smart_ptr>* pMatTable = NULL; + + if (!LoadVisAreas(&pStatObjTable, &pMatTable)) + { + Error("VisAreas file (%s) not found or file version error, please try to re-export the level", COMPILED_VISAREA_MAP_FILE_NAME); + return false; + } + + SAFE_DELETE(pStatObjTable); + SAFE_DELETE(pMatTable); } - SAFE_DELETE(pStatObjTable); - SAFE_DELETE(pMatTable); //Update loading screen and important tick functions SYNCHRONOUS_LOADING_TICK(); @@ -737,29 +759,37 @@ bool C3DEngine::LoadLevel(const char* szFolderName, const char* szMissionName) // load leveldata.xml m_pTerrainWaterMat = 0; m_nWaterBottomTexId = 0; + + // This call is needed whether or not the prefab system is used for levels. If prefabs are used, it will initialize the + // environment and time of day managers with default values. With legacy levels, they will intialize from the saved xml files. LoadMissionDataFromXMLNode(szMissionName); //Update loading screen and important tick functions SYNCHRONOUS_LOADING_TICK(); - - // init water if not initialized already (if no mission was found) - if (!GetOcean()) + if (!usePrefabSystemForLevels) { - PrintMessage("===== Creating Ocean ====="); - CreateOcean(m_pTerrainWaterMat, COcean::GetWaterLevelInfo()); - } + // init water if not initialized already (if no mission was found) + if (!GetOcean()) + { + PrintMessage("===== Creating Ocean ====="); + CreateOcean(m_pTerrainWaterMat, COcean::GetWaterLevelInfo()); + } - PrintMessage("===== Load level physics data ====="); - LoadFlaresData(); + PrintMessage("===== Load level physics data ====="); + LoadFlaresData(); + } // restore game state EnableOceanRendering(true); m_pObjManager->SetLockCGFResources(false); - PrintMessage("===== loading occlusion mesh ====="); + if (!usePrefabSystemForLevels) + { + PrintMessage("===== loading occlusion mesh ====="); - GetObjManager()->LoadOcclusionMesh(szFolderName); + GetObjManager()->LoadOcclusionMesh(szFolderName); + } PrintMessage("===== Finished loading static world ====="); @@ -817,7 +847,9 @@ void C3DEngine::LoadMissionDataFromXMLNode(const char* szMissionName) } else { - Error("C3DEngine::LoadMissionDataFromXMLNode: Mission file not found: %s", szFileName); + // XML file couldn't be found, just use the defaults for everything. + LoadEnvironmentSettingsFromXML(nullptr, GetDefSID()); + LoadTimeOfDaySettingsFromXML(nullptr); } } else @@ -832,10 +864,13 @@ char* C3DEngine::GetXMLAttribText(XmlNodeRef pInputNode, const char* szLevel1, c cry_strcpy(szResText, szDefaultValue); - XmlNodeRef nodeLevel = pInputNode->findChild(szLevel1); - if (nodeLevel && nodeLevel->haveAttr(szLevel2)) + if (pInputNode) { - cry_strcpy(szResText, nodeLevel->getAttr(szLevel2)); + XmlNodeRef nodeLevel = pInputNode->findChild(szLevel1); + if (nodeLevel && nodeLevel->haveAttr(szLevel2)) + { + cry_strcpy(szResText, nodeLevel->getAttr(szLevel2)); + } } return szResText; @@ -847,13 +882,16 @@ char* C3DEngine::GetXMLAttribText(XmlNodeRef pInputNode, const char* szLevel1, c cry_strcpy(szResText, szDefaultValue); - XmlNodeRef nodeLevel = pInputNode->findChild(szLevel1); - if (nodeLevel) + if (pInputNode) { - nodeLevel = nodeLevel->findChild(szLevel2); + XmlNodeRef nodeLevel = pInputNode->findChild(szLevel1); if (nodeLevel) { - cry_strcpy(szResText, nodeLevel->getAttr(szLevel3)); + nodeLevel = nodeLevel->findChild(szLevel2); + if (nodeLevel) + { + cry_strcpy(szResText, nodeLevel->getAttr(szLevel3)); + } } } @@ -904,7 +942,7 @@ void C3DEngine::LoadEnvironmentSettingsFromXML(XmlNodeRef pInputNode, [[maybe_un { char moonTexture[256]; - cry_strcpy(moonTexture, GetXMLAttribText(pInputNode, "Moon", "Texture", "")); + cry_strcpy(moonTexture, GetXMLAttribText(pInputNode, "Moon", "Texture", "Textures/Skys/Night/half_moon.dds")); ITexture* pTex(0); if (moonTexture[0] != '\0') @@ -923,14 +961,14 @@ void C3DEngine::LoadEnvironmentSettingsFromXML(XmlNodeRef pInputNode, [[maybe_un m_volFogGlobalDensityMultiplierLDR = (float)max(atof(GetXMLAttribText(pInputNode, "Fog", "LDRGlobalDensMult", "1.0")), 0.0); // SkyBox - const string skyMaterialName = GetXMLAttribText(pInputNode, "SkyBox", "Material", "Materials/Sky/Sky"); - const string skyLowSpecMaterialName = GetXMLAttribText(pInputNode, "SkyBox", "MaterialLowSpec", "Materials/Sky/Sky"); + const string skyMaterialName = GetXMLAttribText(pInputNode, "SkyBox", "Material", "EngineAssets/Materials/Sky/Sky"); + const string skyLowSpecMaterialName = GetXMLAttribText(pInputNode, "SkyBox", "MaterialLowSpec", "EngineAssets/Materials/Sky/Sky"); SetSkyMaterialPath(skyMaterialName); SetSkyLowSpecMaterialPath(skyLowSpecMaterialName); LoadSkyMaterial(); m_fSkyBoxAngle = (float)atof(GetXMLAttribText(pInputNode, "SkyBox", "Angle", "0.0")); - m_fSkyBoxStretching = (float)atof(GetXMLAttribText(pInputNode, "SkyBox", "Stretching", "1.0")); + m_fSkyBoxStretching = (float)atof(GetXMLAttribText(pInputNode, "SkyBox", "Stretching", "0.5")); // set terrain water (aka the infinite ocean), sun road and bottom shaders if (OceanToggle::IsActive()) diff --git a/Code/CryEngine/Cry3DEngine/Cry_LegacyPhysUtils.cpp b/Code/CryEngine/Cry3DEngine/Cry_LegacyPhysUtils.cpp index 8919486095..7a85244397 100644 --- a/Code/CryEngine/Cry3DEngine/Cry_LegacyPhysUtils.cpp +++ b/Code/CryEngine/Cry3DEngine/Cry_LegacyPhysUtils.cpp @@ -37,7 +37,7 @@ namespace LegacyCryPhysicsUtils strided_pointer pts = strided_pointer((Vec3mem*)_pts.data, _pts.iStride); ptitem* pt, * ptmax, * ptdeleted, * ptlist = npts > sizeof(ptbuf) / sizeof(ptbuf[0]) ? new ptitem[npts] : ptbuf; - qhtritem* tr, * trnext, * trend, * trnew, * trdata = trbuf, * trstart = 0, * trlast, * trbest; + qhtritem* tr, * trnext, * trend, * trnew, * trdata = trbuf, * trstart = 0, * trlast, * trbest = nullptr; int i, j, k, ti, trdatasz = sizeof(trbuf) / sizeof(trbuf[0]), bidx[6], n, next_iter, delbuds; qhtritem** tmparr_ptr = tmparr_ptr_buf; int* tmparr_idx = tmparr_idx_buf, tmparr_sz = 512; @@ -679,7 +679,7 @@ namespace LegacyCryPhysicsUtils { return 0; } - vtxthunk* pThunks, * pPrevThunk, * pContStart, ** pSags, ** pBottoms, * pPinnacle, * pBounds[2], * pPrevBounds[2], * ptr, * ptr_next; + vtxthunk* pThunks, * pPrevThunk, * pContStart, ** pSags, ** pBottoms, * pPinnacle = nullptr, * pBounds[2], * pPrevBounds[2], * ptr, * ptr_next; vtxthunk bufThunks[32], * bufSags[16], * bufBottoms[16]; int i, nThunks, nBottoms = 0, nSags = 0, iBottom = 0, nConts = 0, j, isag, nThunks0, nTris = 0, nPrevSags, nTrisCnt, iter, nDegenTris = 0; float ymax, ymin, e, area0 = 0, area1 = 0, cntarea, minCntArea; diff --git a/Code/CryEngine/Cry3DEngine/ObjMan.cpp b/Code/CryEngine/Cry3DEngine/ObjMan.cpp index fcee5a2946..f3d9a21fb5 100644 --- a/Code/CryEngine/Cry3DEngine/ObjMan.cpp +++ b/Code/CryEngine/Cry3DEngine/ObjMan.cpp @@ -281,46 +281,49 @@ void CObjManager::PreloadLevelObjects() ////////////////////////////////////////////////////////////////////////// // Request objects loading from Streaming System. - if (const char* pCgfName = pResList->GetFirst()) + if (pResList) { - while (pCgfName) + if (const char* pCgfName = pResList->GetFirst()) { - if (strstr(pCgfName, ".cgf")) + while (pCgfName) { - const char* sLodName = strstr(pCgfName, "_lod"); - if (sLodName && (sLodName[4] >= '0' && sLodName[4] <= '9')) + if (strstr(pCgfName, ".cgf")) { - // Ignore Lod files. - pCgfName = pResList->GetNext(); - continue; - } + const char* sLodName = strstr(pCgfName, "_lod"); + if (sLodName && (sLodName[4] >= '0' && sLodName[4] <= '9')) + { + // Ignore Lod files. + pCgfName = pResList->GetNext(); + continue; + } - cgfFilename = pCgfName; + cgfFilename = pCgfName; - if (bVerboseLogging) - { - CryLog("%s", cgfFilename.c_str()); - } - IStatObj* pStatObj = GetObjManager()->LoadStatObjUnsafeManualRef(cgfFilename.c_str(), NULL, 0, true, 0); - if (pStatObj) - { - if (pStatObj->IsMeshStrippedCGF()) + if (bVerboseLogging) { - nInLevelCacheCount++; + CryLog("%s", cgfFilename.c_str()); } + IStatObj* pStatObj = GetObjManager()->LoadStatObjUnsafeManualRef(cgfFilename.c_str(), NULL, 0, true, 0); + if (pStatObj) + { + if (pStatObj->IsMeshStrippedCGF()) + { + nInLevelCacheCount++; + } + } + // cgfStreamer.StartStreaming(cgfFilename.c_str()); + nCgfCounter++; + + // This loop can take a few seconds, so we should refresh the loading screen and call the loading tick functions to + // ensure that no big gaps in coverage occur. + SYNCHRONOUS_LOADING_TICK(); } - //cgfStreamer.StartStreaming(cgfFilename.c_str()); - nCgfCounter++; - //This loop can take a few seconds, so we should refresh the loading screen and call the loading tick functions to ensure that no big gaps in coverage occur. - SYNCHRONOUS_LOADING_TICK(); + pCgfName = pResList->GetNext(); } - - pCgfName = pResList->GetNext(); } } - // PrintMessage("Finished requesting level CGF's: %d objects in %.1f sec", nCgfCounter, GetCurAsyncTimeSec()-fStartTime); // Continue updating streaming system until all CGF's are loaded diff --git a/Code/CryEngine/CryCommon/AnimKey.h b/Code/CryEngine/CryCommon/AnimKey.h index 52bc636f67..ae7c3146f3 100644 --- a/Code/CryEngine/CryCommon/AnimKey.h +++ b/Code/CryEngine/CryCommon/AnimKey.h @@ -344,61 +344,18 @@ struct ICaptureKey { friend class AnimSerializer; - enum CaptureBufferType - { - Color = 0, - ColorWithAlpha, - NumCaptureBufferTypes // keep this last - }; - enum CaptureFileFormat - { - Jpg = 0, - Tga, - Tif, - NumCaptureFileFormats // keep this last - }; + AZStd::string folder; + AZStd::string prefix; float duration; float timeStep; - AZStd::string folder; bool once; - AZStd::string prefix; - CaptureBufferType captureBufferIndex; - - const char* GetFormat() const - { return format.c_str(); } - - void FormatJPG() - { format = "jpg"; } - void FormatTIF() - { format = "tif"; } - void FormatTGA() - { format = "tga"; } - void FormatHDR() - { - // deprecated - if (gEnv->pLog) - { - gEnv->pLog->LogWarning("'hdr' capture format is deprecated."); - } - format = "hdr"; - } - void FormatBMP() - { - // deprecated - if (gEnv->pLog) - { - gEnv->pLog->LogWarning("'bmp' capture format is deprecated."); - } - format = "bmp"; - } + ICaptureKey() : IKey() - , duration(0) + , duration(0.0f) , timeStep(0.033f) , once(false) - , captureBufferIndex(Color) { - FormatTGA(); ICVar* pCaptureFolderCVar = gEnv->pConsole->GetCVar("capture_folder"); if (pCaptureFolderCVar != NULL && pCaptureFolderCVar->GetString()) { @@ -409,11 +366,6 @@ struct ICaptureKey { prefix = pCaptureFilePrefixCVar->GetString(); } - ICVar* pCaptureFileFormatCVar = gEnv->pConsole->GetCVar("capture_file_format"); - if (pCaptureFileFormatCVar != NULL) - { - format = pCaptureFileFormatCVar->GetString(); - } } ICaptureKey(const ICaptureKey& other) @@ -423,13 +375,8 @@ struct ICaptureKey , duration(other.duration) , timeStep(other.timeStep) , once(other.once) - , format(other.format) - , captureBufferIndex(other.captureBufferIndex) { } - -private: - AZStd::string format; }; //! Boolean key. diff --git a/Code/CryEngine/CryCommon/I3DEngine.h b/Code/CryEngine/CryCommon/I3DEngine.h index 533c4bdfa3..a9c231c51a 100644 --- a/Code/CryEngine/CryCommon/I3DEngine.h +++ b/Code/CryEngine/CryCommon/I3DEngine.h @@ -1309,9 +1309,9 @@ struct I3DEngine // SetCamera // Arguments: // szDebugName - name that can be visualized for debugging purpose, must not be 0 - virtual void RenderWorld(const int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName) = 0; + virtual void RenderWorld(int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName) = 0; - virtual void RenderSceneReflection(const int nRenderFlags, const SRenderingPassInfo& passInfo) = 0; + virtual void RenderSceneReflection(int nRenderFlags, const SRenderingPassInfo& passInfo) = 0; // Summary: // Prepares for the world stream update, should be called before rendering @@ -1816,7 +1816,7 @@ struct I3DEngine // fTextPosY - Y position for the text // fTextStepY - Amount of pixels to distance each line // bEnhanced - false=normal, true=more interesting information - virtual void DisplayInfo(float& fTextPosX, float& fTextPosY, float& fTextStepY, const bool bEnhanced) = 0; + virtual void DisplayInfo(float& fTextPosX, float& fTextPosY, float& fTextStepY, bool bEnhanced) = 0; // Summary: // Displays CPU and GPU memory usage statistics on screen diff --git a/Code/CryEngine/CryCommon/IAudioSystem.h b/Code/CryEngine/CryCommon/IAudioSystem.h index 0e68ae88d4..1e67d7c78d 100644 --- a/Code/CryEngine/CryCommon/IAudioSystem.h +++ b/Code/CryEngine/CryCommon/IAudioSystem.h @@ -844,21 +844,21 @@ namespace Audio { virtual ~IAudioProxy() = default; - virtual void Initialize(const char* const sObjectName, const bool bInitAsync = true) = 0; + virtual void Initialize(const char* sObjectName, bool bInitAsync = true) = 0; virtual void Release() = 0; virtual void Reset() = 0; virtual void ExecuteSourceTrigger(TAudioControlID nTriggerID, const SAudioSourceInfo& rSourceInfo, const SAudioCallBackInfos& rCallbackInfos = SAudioCallBackInfos::GetEmptyObject()) = 0; - virtual void ExecuteTrigger(const TAudioControlID nTriggerID, const SAudioCallBackInfos& rCallbackInfos = SAudioCallBackInfos::GetEmptyObject()) = 0; + virtual void ExecuteTrigger(TAudioControlID nTriggerID, const SAudioCallBackInfos& rCallbackInfos = SAudioCallBackInfos::GetEmptyObject()) = 0; virtual void StopAllTriggers() = 0; - virtual void StopTrigger(const TAudioControlID nTriggerID) = 0; - virtual void SetSwitchState(const TAudioControlID nSwitchID, const TAudioSwitchStateID nStateID) = 0; - virtual void SetRtpcValue(const TAudioControlID nRtpcID, const float fValue) = 0; - virtual void SetObstructionCalcType(const EAudioObjectObstructionCalcType eObstructionType) = 0; + virtual void StopTrigger(TAudioControlID nTriggerID) = 0; + virtual void SetSwitchState(TAudioControlID nSwitchID, TAudioSwitchStateID nStateID) = 0; + virtual void SetRtpcValue(TAudioControlID nRtpcID, float fValue) = 0; + virtual void SetObstructionCalcType(EAudioObjectObstructionCalcType eObstructionType) = 0; virtual void SetPosition(const SATLWorldPosition& rPosition) = 0; virtual void SetPosition(const AZ::Vector3& rPosition) = 0; virtual void SetMultiplePositions(const MultiPositionParams& params) = 0; - virtual void SetEnvironmentAmount(const TAudioEnvironmentID nEnvironmentID, const float fAmount) = 0; + virtual void SetEnvironmentAmount(TAudioEnvironmentID nEnvironmentID, float fAmount) = 0; virtual void SetCurrentEnvironments() = 0; virtual void ResetRtpcValues() = 0; virtual TAudioObjectID GetAudioObjectID() const = 0; @@ -907,37 +907,37 @@ namespace Audio virtual void AddRequestListener( AudioRequestCallbackType callBack, - void* const objectToListenTo, - const EAudioRequestType requestType = eART_AUDIO_ALL_REQUESTS, - const TATLEnumFlagsType specificRequestMask = ALL_AUDIO_REQUEST_SPECIFIC_TYPE_FLAGS) = 0; + void* objectToListenTo, + EAudioRequestType requestType = eART_AUDIO_ALL_REQUESTS, + TATLEnumFlagsType specificRequestMask = ALL_AUDIO_REQUEST_SPECIFIC_TYPE_FLAGS) = 0; virtual void RemoveRequestListener( AudioRequestCallbackType callBack, - void* const requestOwner) = 0; + void* requestOwner) = 0; - virtual TAudioControlID GetAudioTriggerID(const char* const sAudioTriggerName) const = 0; - virtual TAudioControlID GetAudioRtpcID(const char* const sAudioRtpcName) const = 0; - virtual TAudioControlID GetAudioSwitchID(const char* const sAudioSwitchName) const = 0; - virtual TAudioSwitchStateID GetAudioSwitchStateID(const TAudioControlID nSwitchID, const char* const sAudioSwitchStateName) const = 0; - virtual TAudioPreloadRequestID GetAudioPreloadRequestID(const char* const sAudioPreloadRequestName) const = 0; - virtual TAudioEnvironmentID GetAudioEnvironmentID(const char* const sAudioEnvironmentName) const = 0; + virtual TAudioControlID GetAudioTriggerID(const char* sAudioTriggerName) const = 0; + virtual TAudioControlID GetAudioRtpcID(const char* sAudioRtpcName) const = 0; + virtual TAudioControlID GetAudioSwitchID(const char* sAudioSwitchName) const = 0; + virtual TAudioSwitchStateID GetAudioSwitchStateID(TAudioControlID nSwitchID, const char* sAudioSwitchStateName) const = 0; + virtual TAudioPreloadRequestID GetAudioPreloadRequestID(const char* sAudioPreloadRequestName) const = 0; + virtual TAudioEnvironmentID GetAudioEnvironmentID(const char* sAudioEnvironmentName) const = 0; virtual bool ReserveAudioListenerID(TAudioObjectID& rAudioObjectID) = 0; - virtual bool ReleaseAudioListenerID(const TAudioObjectID nAudioObjectID) = 0; - virtual bool SetAudioListenerOverrideID(const TAudioObjectID nAudioObjectID) = 0; + virtual bool ReleaseAudioListenerID(TAudioObjectID nAudioObjectID) = 0; + virtual bool SetAudioListenerOverrideID(TAudioObjectID nAudioObjectID) = 0; virtual void GetInfo(SAudioSystemInfo& rAudioSystemInfo) = 0; virtual const char* GetControlsPath() const = 0; virtual void UpdateControlsPath() = 0; - virtual void RefreshAudioSystem(const char* const levelName) = 0; + virtual void RefreshAudioSystem(const char* levelName) = 0; virtual IAudioProxy* GetFreeAudioProxy() = 0; - virtual void FreeAudioProxy(IAudioProxy* const pIAudioProxy) = 0; + virtual void FreeAudioProxy(IAudioProxy* pIAudioProxy) = 0; virtual TAudioSourceId CreateAudioSource(const SAudioInputConfig& sourceConfig) = 0; virtual void DestroyAudioSource(TAudioSourceId sourceId) = 0; - virtual const char* GetAudioControlName(const EAudioControlType controlType, const TATLIDType atlID) const = 0; - virtual const char* GetAudioSwitchStateName(const TAudioControlID switchID, const TAudioSwitchStateID stateID) const = 0; + virtual const char* GetAudioControlName(EAudioControlType controlType, TATLIDType atlID) const = 0; + virtual const char* GetAudioSwitchStateName(TAudioControlID switchID, TAudioSwitchStateID stateID) const = 0; }; using AudioSystemRequestBus = AZ::EBus; diff --git a/Code/CryEngine/CryCommon/IConsole.h b/Code/CryEngine/CryCommon/IConsole.h index 2b04b51054..17ebd672d6 100644 --- a/Code/CryEngine/CryCommon/IConsole.h +++ b/Code/CryEngine/CryCommon/IConsole.h @@ -282,7 +282,7 @@ struct IConsole // show/hide the console // @param specifies if the window must be (true=show,false=hide) // @param specifies iRequestScrollMax <=0 if not used, otherwise it sets SetScrollMax temporary to the given value - virtual void ShowConsole(bool show, const int iRequestScrollMax = -1) = 0; + virtual void ShowConsole(bool show, int iRequestScrollMax = -1) = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Dump all console-variables to a callback-interface // @param Callback callback-interface which needs to be called for each element @@ -318,7 +318,7 @@ struct IConsole // @param indwBufferSize 1.. size of the buffer // @return true=line was returned, false=there are no more lines - virtual bool GetLineNo(const int indwLineNo, char* outszBuffer, const int indwBufferSize) const = 0; + virtual bool GetLineNo(int indwLineNo, char* outszBuffer, int indwBufferSize) const = 0; // @return current number of lines in the console virtual int GetLineCount() const = 0; @@ -408,7 +408,7 @@ struct IConsole // bDeferExecution - true=the command is stored in special fifo that allows delayed execution // by using wait_seconds and wait_frames commands // - virtual void ExecuteString(const char* command, const bool bSilentMode = false, const bool bDeferExecution = false) = 0; + virtual void ExecuteString(const char* command, bool bSilentMode = false, bool bDeferExecution = false) = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Print a message into the log and abort the execution of the application @@ -489,7 +489,7 @@ struct IConsole // \param bUpOrDown true=after pressed "up", false=after pressed "down" // \return 0 if there is no history line or pointer to the null terminated history line - virtual const char* GetHistoryElement(const bool bUpOrDown) = 0; + virtual const char* GetHistoryElement(bool bUpOrDown) = 0; //! \param szCommand must not be 0 virtual void AddCommandToHistory(const char* szCommand) = 0; @@ -602,11 +602,11 @@ struct ICVar //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // set the float value of the variable // @param s float representation the value - virtual void Set(const float f) = 0; + virtual void Set(float f) = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // set the float value of the variable // @param s integer representation the value - virtual void Set(const int i) = 0; + virtual void Set(int i) = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // clear the specified bits in the flag field virtual void ClearFlags (int flags) = 0; @@ -659,7 +659,7 @@ struct ICVar ////////////////////////////////////////////////////////////////////////// // Removes an on change functor // returns true if removal was successful. - virtual bool RemoveOnChangeFunctor(const uint64 nFunctorId) = 0; + virtual bool RemoveOnChangeFunctor(uint64 nFunctorId) = 0; ////////////////////////////////////////////////////////////////////////// // Get the current callback function. diff --git a/Code/CryEngine/CryCommon/ILevelSystem.h b/Code/CryEngine/CryCommon/ILevelSystem.h index 74458277de..13d274b243 100644 --- a/Code/CryEngine/CryCommon/ILevelSystem.h +++ b/Code/CryEngine/CryCommon/ILevelSystem.h @@ -20,8 +20,8 @@ #include #include +#include -struct ILevelRotationFile; struct IConsoleCmdArgs; namespace AZ::IO @@ -29,212 +29,75 @@ namespace AZ::IO struct IArchive; } -struct ILevelRotation -{ - virtual ~ILevelRotation() {} - typedef uint32 TExtInfoId; - - struct IExtendedInfo - { - }; - - - typedef uint8 TRandomisationFlags; - - enum EPlaylistRandomisationFlags - { - ePRF_None = 0, - ePRF_Shuffle = 1 << 0, - ePRF_MaintainPairs = 1 << 1, - }; - - virtual bool Load([[maybe_unused]] ILevelRotationFile* file) { return false; } - virtual bool LoadFromXmlRootNode(const XmlNodeRef rootNode, [[maybe_unused]] const char* altRootTag) { return false; } - - virtual void Reset() {} - virtual int AddLevel([[maybe_unused]] const char* level) { return 0; } - virtual void AddGameMode([[maybe_unused]] int level, [[maybe_unused]] const char* gameMode) {} - - virtual int AddLevel([[maybe_unused]] const char* level, [[maybe_unused]] const char* gameMode) { return 0; } - - - //call to set the playlist ready for a new session - virtual void Initialise([[maybe_unused]] int nSeed) {} - - virtual bool First() { return false; } - virtual bool Advance() { return false; } - virtual bool AdvanceAndLoopIfNeeded() { return false; } - - virtual const char* GetNextLevel() const { return nullptr; } - virtual const char* GetNextGameRules() const { return nullptr; } - virtual int GetLength() const { return 0; } - virtual int GetTotalGameModeEntries() const { return 0; } - virtual int GetNext() const { return 0; } - - virtual const char* GetLevel([[maybe_unused]] uint32 idx, [[maybe_unused]] bool accessShuffled = true) const { return nullptr; } - virtual int GetNGameRulesForEntry([[maybe_unused]] uint32 idx, [[maybe_unused]] bool accessShuffled = true) const { return 0; } - virtual const char* GetGameRules([[maybe_unused]] uint32 idx, [[maybe_unused]] uint32 iMode, [[maybe_unused]] bool accessShuffled = true) const { return nullptr; } - - virtual const char* GetNextGameRulesForEntry([[maybe_unused]] int idx) const { return nullptr; } - - virtual const int NumAdvancesTaken() const { return 0; } - virtual void ResetAdvancement() {} - - virtual bool IsRandom() const { return false; } - - virtual ILevelRotation::TRandomisationFlags GetRandomisationFlags() const { return ePRF_None; } - virtual void SetRandomisationFlags([[maybe_unused]] TRandomisationFlags flags) {} - - virtual void ChangeLevel([[maybe_unused]] IConsoleCmdArgs* pArgs = NULL) {} - - virtual bool NextPairMatch() const { return false; } -}; - - +// [LYN-2376] Remove once legacy slice support is removed struct ILevelInfo { - virtual ~ILevelInfo() {} - typedef std::vector TStringVec; - - struct TGameTypeInfo - { - string name; - string xmlFile; - int cgfCount; - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(name); - pSizer->AddObject(xmlFile); - } - }; - - struct SMinimapInfo - { - SMinimapInfo() - : fStartX(0) - , fStartY(0) - , fEndX(1) - , fEndY(1) - , fDimX(1) - , fDimY(1) - , iWidth(1024) - , iHeight(1024) {} - - string sMinimapName; - int iWidth; - int iHeight; - float fStartX; - float fStartY; - float fEndX; - float fEndY; - float fDimX; - float fDimY; - }; + virtual ~ILevelInfo() = default; virtual const char* GetName() const = 0; - virtual const bool IsOfType(const char* sType) const = 0; virtual const char* GetPath() const = 0; - virtual const char* GetPaks() const = 0; - virtual const char* GetDisplayName() const = 0; - virtual const char* GetPreviewImagePath() const = 0; - virtual const char* GetBackgroundImagePath() const = 0; - virtual const char* GetMinimapImagePath() const = 0; - //virtual const ILevelInfo::TStringVec& GetMusicLibs() const = 0; // Gets reintroduced when level specific music data loading is implemented. - virtual const bool MetadataLoaded() const = 0; - virtual bool GetIsModLevel() const = 0; - virtual const uint32 GetScanTag() const = 0; - virtual const uint32 GetLevelTag() const = 0; - - virtual int GetGameTypeCount() const = 0; - virtual const ILevelInfo::TGameTypeInfo* GetGameType(int gameType) const = 0; - virtual bool SupportsGameType(const char* gameTypeName) const = 0; - virtual const ILevelInfo::TGameTypeInfo* GetDefaultGameType() const = 0; - virtual ILevelInfo::TStringVec GetGameRules() const = 0; - virtual bool HasGameRules() const = 0; - - virtual const ILevelInfo::SMinimapInfo& GetMinimapInfo() const = 0; - - virtual const char* GetDefaultGameRules() const = 0; + virtual const char* GetAssetName() const = 0; }; -struct ILevel -{ - virtual ~ILevel() {} - virtual void Release() = 0; - virtual ILevelInfo* GetLevelInfo() = 0; -}; - /*! * Extend this class and call ILevelSystem::AddListener() to receive level system related events. */ struct ILevelSystemListener { - virtual ~ILevelSystemListener() {} + virtual ~ILevelSystemListener() = default; //! Called when loading a level fails due to it not being found. virtual void OnLevelNotFound([[maybe_unused]] const char* levelName) {} //! Called after ILevelSystem::PrepareNextLevel() completes. - virtual void OnPrepareNextLevel([[maybe_unused]] ILevelInfo* pLevel) {} + virtual void OnPrepareNextLevel([[maybe_unused]] const char* levelName) {} //! Called after ILevelSystem::OnLoadingStart() completes, before the level actually starts loading. - virtual void OnLoadingStart([[maybe_unused]] ILevelInfo* pLevel) {} + virtual void OnLoadingStart([[maybe_unused]] const char* levelName) {} //! Called after the level finished - virtual void OnLoadingComplete([[maybe_unused]] ILevel* pLevel) {} + virtual void OnLoadingComplete([[maybe_unused]] const char* levelName) {} //! Called when there's an error loading a level, with the level info and a description of the error. - virtual void OnLoadingError([[maybe_unused]] ILevelInfo* pLevel, [[maybe_unused]] const char* error) {} + virtual void OnLoadingError([[maybe_unused]] const char* levelName, [[maybe_unused]] const char* error) {} //! Called whenever the loading status of a level changes. progressAmount goes from 0->100. - virtual void OnLoadingProgress([[maybe_unused]] ILevelInfo* pLevel, [[maybe_unused]] int progressAmount) {} + virtual void OnLoadingProgress([[maybe_unused]] const char* levelName, [[maybe_unused]] int progressAmount) {} //! Called after a level is unloaded, before the data is freed. - virtual void OnUnloadComplete([[maybe_unused]] ILevel* pLevel) {} + virtual void OnUnloadComplete([[maybe_unused]] const char* levelName) {} void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const { } }; struct ILevelSystem - : public ILevelSystemListener { - enum - { - TAG_MAIN = 'MAIN', - TAG_UNKNOWN = 'ZZZZ' - }; - - static constexpr char LevelsDirectoryName[] = "levels"; - static constexpr char LevelPakName[] = "level.pak"; + virtual ~ILevelSystem() = default; virtual void Release() = 0; - virtual void Rescan(const char* levelsFolder, const uint32 tag) = 0; - virtual void ScanFolder(const char* subfolder, bool modFolder, const uint32 tag) = 0; - virtual void PopulateLevels(string searchPattern, string& folder, AZ::IO::IArchive* pPak, bool& modFolder, const uint32& tag, bool fromFileSystemOnly) = 0; - virtual void LoadRotation() {} - virtual int GetLevelCount() = 0; - virtual DynArray* GetLevelTypeList() = 0; - virtual ILevelInfo* GetLevelInfo(int level) = 0; - virtual ILevelInfo* GetLevelInfo(const char* levelName) = 0; virtual void AddListener(ILevelSystemListener* pListener) = 0; virtual void RemoveListener(ILevelSystemListener* pListener) = 0; - virtual ILevel* GetCurrentLevel() const = 0; - virtual ILevel* LoadLevel(const char* levelName) = 0; - virtual void UnLoadLevel() = 0; - virtual ILevel* SetEditorLoadedLevel(const char* levelName, bool bReadLevelInfoMetaData = false) = 0; + virtual bool LoadLevel(const char* levelName) = 0; + virtual void UnloadLevel() = 0; virtual bool IsLevelLoaded() = 0; - virtual void PrepareNextLevel(const char* levelName) = 0; + virtual const char* GetCurrentLevelName() const = 0; - virtual ILevelRotation* GetLevelRotation() { return nullptr; } + // If the level load failed then we need to have a different shutdown procedure vs when a level is naturally unloaded + virtual void SetLevelLoadFailed(bool loadFailed) = 0; + virtual bool GetLevelLoadFailed() = 0; - virtual ILevelRotation* FindLevelRotationForExtInfoId([[maybe_unused]] const ILevelRotation::TExtInfoId findId) { return nullptr; } + virtual AZ::Data::AssetType GetLevelAssetType() const = 0; - virtual bool AddExtendedLevelRotationFromXmlRootNode(const XmlNodeRef rootNode, [[maybe_unused]] const char* altRootTag, [[maybe_unused]] const ILevelRotation::TExtInfoId extInfoId) { return false; } - virtual void ClearExtendedLevelRotations() {} - virtual ILevelRotation* CreateNewRotation([[maybe_unused]] const ILevelRotation::TExtInfoId id) { return nullptr; } + static const char* GetLevelsDirectoryName() + { + return LevelsDirectoryName; + } - // Retrieve`s last level level loading time. - virtual float GetLastLevelLoadTime() = 0; + // [LYN-2376] Deprecated methods, to be removed once slices are removed: + virtual void Rescan(const char* levelsFolder) = 0; + virtual int GetLevelCount() = 0; + virtual ILevelInfo* GetLevelInfo(int level) = 0; + virtual ILevelInfo* GetLevelInfo(const char* levelName) = 0; - // If the level load failed then we need to have a different shutdown procedure vs when a level is naturally unloaded - virtual void SetLevelLoadFailed(bool loadFailed) = 0; - virtual bool GetLevelLoadFailed() = 0; +protected: + + static constexpr const char* LevelsDirectoryName = "levels"; }; #endif // CRYINCLUDE_CRYACTION_ILEVELSYSTEM_H diff --git a/Code/CryEngine/CryCommon/IMiniLog.h b/Code/CryEngine/CryCommon/IMiniLog.h index 57cde63c66..ca494430eb 100644 --- a/Code/CryEngine/CryCommon/IMiniLog.h +++ b/Code/CryEngine/CryCommon/IMiniLog.h @@ -40,9 +40,9 @@ struct IMiniLog // // Notes: // You only have to implement this function. - virtual void LogV (const ELogType nType, const char* szFormat, va_list args) PRINTF_PARAMS(3, 0) = 0; + virtual void LogV(ELogType nType, const char* szFormat, va_list args) PRINTF_PARAMS(3, 0) = 0; - virtual void LogV (const ELogType nType, int flags, const char* szFormat, va_list args) PRINTF_PARAMS(4, 0) = 0; + virtual void LogV(ELogType nType, int flags, const char* szFormat, va_list args) PRINTF_PARAMS(4, 0) = 0; // Summary: // Logs using type. @@ -123,8 +123,8 @@ struct CNullMiniLog // The default implementation just won't do anything //##@{ void LogV([[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} - void LogV([[maybe_unused]] const ELogType nType, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} - void LogV ([[maybe_unused]] const ELogType nType, [[maybe_unused]] int flags, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} + void LogV([[maybe_unused]] ELogType nType, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} + void LogV ([[maybe_unused]] ELogType nType, [[maybe_unused]] int flags, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} //##@} }; diff --git a/Code/CryEngine/CryCommon/IProcess.h b/Code/CryEngine/CryCommon/IProcess.h index aa1c063f55..bade01ccf5 100644 --- a/Code/CryEngine/CryCommon/IProcess.h +++ b/Code/CryEngine/CryCommon/IProcess.h @@ -29,7 +29,7 @@ struct IProcess virtual ~IProcess(){} virtual bool Init() = 0; virtual void Update() = 0; - virtual void RenderWorld(const int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName) = 0; + virtual void RenderWorld(int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName) = 0; virtual void ShutDown() = 0; virtual void SetFlags(int flags) = 0; virtual int GetFlags(void) = 0; diff --git a/Code/CryEngine/CryCommon/IRenderer.h b/Code/CryEngine/CryCommon/IRenderer.h index e3b20e9fa3..01c2b2149d 100644 --- a/Code/CryEngine/CryCommon/IRenderer.h +++ b/Code/CryEngine/CryCommon/IRenderer.h @@ -1119,8 +1119,8 @@ struct IRenderer //Sums DIP counts for the EFSLIST_* passes that match the submitted mask. //Compose the mask with bitwise arithmetic, use (1 << EFSLIST_*) per list. //e.g. to sum general and transparent, pass in ( (1 << EFSLIST_GENERAL) | (1 << EFSLIST_TRANSP) ) - virtual int GetCurrentNumberOfDrawCalls(const uint32 EFSListMask) const = 0; - virtual float GetCurrentDrawCallRTTimes(const uint32 EFSListMask) const = 0; + virtual int GetCurrentNumberOfDrawCalls(uint32 EFSListMask) const = 0; + virtual float GetCurrentDrawCallRTTimes(uint32 EFSListMask) const = 0; virtual void SetDebugRenderNode(IRenderNode* pRenderNode) = 0; virtual bool IsDebugRenderNode(IRenderNode* pRenderNode) const = 0; @@ -1211,7 +1211,7 @@ struct IRenderer // Summary: // Draws user primitives. - virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, const PublicRenderPrimitiveType nPrimType) = 0; + virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, PublicRenderPrimitiveType nPrimType) = 0; struct DynUiPrimitive : public AZStd::intrusive_slist_node { @@ -1242,7 +1242,7 @@ struct IRenderer // Summary: // Sets delta gamma. - virtual bool SetGammaDelta(const float fGamma) = 0; + virtual bool SetGammaDelta(float fGamma) = 0; // Summary: // Restores gamma @@ -1442,7 +1442,7 @@ struct IRenderer virtual void FontRestoreRenderingState(bool overrideViewProjMatrices, const TransformationMatrices& restoringMatrices) = 0; virtual bool FlushRTCommands(bool bWait, bool bImmediatelly, bool bForce) = 0; - virtual void DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, const bool asciiMultiLine, const STextDrawContext& ctx) const = 0; + virtual void DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, bool asciiMultiLine, const STextDrawContext& ctx) const = 0; virtual int RT_CurThreadList() = 0; @@ -1522,8 +1522,8 @@ struct IRenderer virtual ITexture* EF_GetTextureByName(const char* name, uint32 flags = 0) = 0; // Summary: // Loads the texture for name(nameTex). - virtual ITexture* EF_LoadTexture(const char* nameTex, const uint32 flags = 0) = 0; - virtual ITexture* EF_LoadCubemapTexture(const char* nameTex, const uint32 flags = 0) = 0; + virtual ITexture* EF_LoadTexture(const char* nameTex, uint32 flags = 0) = 0; + virtual ITexture* EF_LoadCubemapTexture(const char* nameTex, uint32 flags = 0) = 0; // Summary: // Loads default texture whose life cycle is managed by Texture Manager, do not try to release them by yourself! virtual ITexture* EF_LoadDefaultTexture(const char* nameTex) = 0; @@ -1556,9 +1556,9 @@ struct IRenderer virtual void EF_AddEf (IRenderElement* pRE, SShaderItem& pSH, CRenderObject* pObj, const SRenderingPassInfo& passInfo, int nList, int nAW, const SRendItemSorter& rendItemSorter) = 0; //! Draw all shaded REs in the list - virtual void EF_EndEf3D (const int nFlags, const int nPrecacheUpdateId, const int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo) = 0; + virtual void EF_EndEf3D (int nFlags, int nPrecacheUpdateId, int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo) = 0; - virtual void EF_InvokeShadowMapRenderJobs(const int nFlags) = 0; + virtual void EF_InvokeShadowMapRenderJobs(int nFlags) = 0; // Dynamic lights void EF_ClearLightsList() {}; // For FC Compatibility. @@ -1570,9 +1570,9 @@ struct IRenderer // Deferred lights/vis areas virtual int EF_AddDeferredLight(const CDLight& pLight, float fMult, const SRenderingPassInfo& passInfo, const SRendItemSorter& rendItemSorter) = 0; - virtual uint32 EF_GetDeferredLightsNum(const eDeferredLightType eLightType = eDLT_DeferredLight) = 0; + virtual uint32 EF_GetDeferredLightsNum(eDeferredLightType eLightType = eDLT_DeferredLight) = 0; virtual void EF_ClearDeferredLightsList() = 0; - virtual TArray* EF_GetDeferredLights(const SRenderingPassInfo& passInfo, const eDeferredLightType eLightType = eDLT_DeferredLight) = 0; + virtual TArray* EF_GetDeferredLights(const SRenderingPassInfo& passInfo, eDeferredLightType eLightType = eDLT_DeferredLight) = 0; virtual uint8 EF_AddDeferredClipVolume(const IClipVolume* pClipVolume) = 0; virtual bool EF_SetDeferredClipVolumeBlendData(const IClipVolume* pClipVolume, const SClipVolumeBlendInfo& blendInfo) = 0; @@ -1605,13 +1605,13 @@ struct IRenderer ////////////////////////////////////////////////////////////////////////// - virtual void EF_AddWaterSimHit(const Vec3& vPos, const float scale, const float strength) = 0; + virtual void EF_AddWaterSimHit(const Vec3& vPos, float scale, float strength) = 0; virtual void EF_DrawWaterSimHits() = 0; ///////////////////////////////////////////////////////////////////////////////// // 2d interface for the shaders ///////////////////////////////////////////////////////////////////////////////// - virtual void EF_EndEf2D(const bool bSort) = 0; + virtual void EF_EndEf2D(bool bSort) = 0; // Summary: // Returns various Renderer Settings, see ERenderQueryTypes. @@ -1771,7 +1771,7 @@ struct IRenderer virtual void UpdateTextureInVideoMemory(uint32 tnum, const byte* newdata, int posx, int posy, int w, int h, ETEX_Format eTFSrc = eTF_B8G8R8, int posz = 0, int sizez = 1) = 0; virtual bool DXTCompress(const byte* raw_data, int nWidth, int nHeight, ETEX_Format eTF, bool bUseHW, bool bGenMips, int nSrcBytesPerPix, MIPDXTcallback callback) = 0; - virtual bool DXTDecompress(const byte* srcData, const size_t srcFileSize, byte* dstData, int nWidth, int nHeight, int nMips, ETEX_Format eSrcTF, bool bUseHW, int nDstBytesPerPix) = 0; + virtual bool DXTDecompress(const byte* srcData, size_t srcFileSize, byte* dstData, int nWidth, int nHeight, int nMips, ETEX_Format eSrcTF, bool bUseHW, int nDstBytesPerPix) = 0; virtual void RemoveTexture(unsigned int TextureId) = 0; virtual void DeleteFont(IFFont* font) = 0; @@ -2219,7 +2219,7 @@ struct IRenderer virtual void EndScreenShot([[maybe_unused]] int e_ScreenShot) {}; // Sets a renderer tracked cvar - virtual void SetRendererCVar(ICVar* pCVar, const char* pArgText, const bool bSilentMode = false) = 0; + virtual void SetRendererCVar(ICVar* pCVar, const char* pArgText, bool bSilentMode = false) = 0; // Get the render piepline virtual SRenderPipeline* GetRenderPipeline() = 0; @@ -2303,7 +2303,7 @@ struct IRenderer virtual long FX_SetVertexDeclaration(int StreamMask, const AZ::Vertex::Format& vertexFormat) = 0; // Draw indexed prim - virtual void FX_DrawIndexedPrimitive(const eRenderPrimitiveType eType, const int nVBOffset, const int nMinVertexIndex, const int nVerticesCount, const int nStartIndex, const int nNumIndices, bool bInstanced = false) = 0; + virtual void FX_DrawIndexedPrimitive(eRenderPrimitiveType eType, int nVBOffset, int nMinVertexIndex, int nVerticesCount, int nStartIndex, int nNumIndices, bool bInstanced = false) = 0; // Set Index stream virtual long FX_SetIStream(const void* pB, uint32 nOffs, RenderIndexType idxType) = 0; @@ -2312,7 +2312,7 @@ struct IRenderer virtual long FX_SetVStream(int nID, const void* pB, uint32 nOffs, uint32 nStride, uint32 nFreq = 1) = 0; // Draw primitives - virtual void FX_DrawPrimitive(const eRenderPrimitiveType eType, const int nStartVertex, const int nVerticesCount, const int nInstanceVertices = 0) = 0; + virtual void FX_DrawPrimitive(eRenderPrimitiveType eType, int nStartVertex, int nVerticesCount, int nInstanceVertices = 0) = 0; // Clear texture virtual void FX_ClearTarget(ITexture* pTex) = 0; @@ -2370,7 +2370,7 @@ struct IRenderer virtual void ApplyDepthTextureState(int unit, int nFilter, bool clamp) = 0; virtual ITexture* GetZTargetTexture() = 0; virtual int GetTextureState(const STexState& TS) = 0; - virtual uint32 TextureDataSize(uint32 nWidth, uint32 nHeight, uint32 nDepth, uint32 nMips, uint32 nSlices, const ETEX_Format eTF, ETEX_TileMode eTM = eTM_None) = 0; + virtual uint32 TextureDataSize(uint32 nWidth, uint32 nHeight, uint32 nDepth, uint32 nMips, uint32 nSlices, ETEX_Format eTF, ETEX_TileMode eTM = eTM_None) = 0; virtual void ApplyForID(int nID, int nTUnit, int nTState, int nTexMaterialSlot, int nSUnit, bool useWhiteDefault) = 0; virtual ITexture* Create3DTexture(const char* szName, int nWidth, int nHeight, int nDepth, int nMips, int nFlags, const byte* pData, ETEX_Format eTFSrc, ETEX_Format eTFDst) = 0; virtual bool IsTextureExist(const ITexture* pTex) = 0; diff --git a/Code/CryEngine/CryCommon/ISystem.h b/Code/CryEngine/CryCommon/ISystem.h index 679dc66327..2519aae1c3 100644 --- a/Code/CryEngine/CryCommon/ISystem.h +++ b/Code/CryEngine/CryCommon/ISystem.h @@ -1267,7 +1267,7 @@ struct ISystem // Arguments: // bValue - Set to true when running on a cheat protected server or a client that is connected to it (not used in singleplayer). - virtual void SetForceNonDevMode(const bool bValue) = 0; + virtual void SetForceNonDevMode(bool bValue) = 0; // Return Value: // True when running on a cheat protected server or a client that is connected to it (not used in singleplayer). virtual bool GetForceNonDevMode() const = 0; @@ -1386,12 +1386,12 @@ struct ISystem // Summary: // Changes current configuration platform. - virtual void SetConfigPlatform(const ESystemConfigPlatform platform) = 0; + virtual void SetConfigPlatform(ESystemConfigPlatform platform) = 0; ////////////////////////////////////////////////////////////////////////// // Summary: // Detects and set optimal spec. - virtual void AutoDetectSpec(const bool detectResolution) = 0; + virtual void AutoDetectSpec(bool detectResolution) = 0; // Summary: // Thread management for subsystems @@ -1519,7 +1519,7 @@ struct ISystem // it adds a line to "MemoryCoverage.bmp" (generated the first time, there is a max line count). virtual void DumpMemoryCoverage() = 0; virtual ESystemGlobalState GetSystemGlobalState(void) = 0; - virtual void SetSystemGlobalState(const ESystemGlobalState systemGlobalState) = 0; + virtual void SetSystemGlobalState(ESystemGlobalState systemGlobalState) = 0; // Summary: // Asynchronous memcpy diff --git a/Code/CryEngine/CryCommon/ITexture.h b/Code/CryEngine/CryCommon/ITexture.h index 1f37bf61da..a5aa8d20f5 100644 --- a/Code/CryEngine/CryCommon/ITexture.h +++ b/Code/CryEngine/CryCommon/ITexture.h @@ -323,7 +323,7 @@ public: /*LATER*/ } - virtual void SetKeepSystemCopy(const bool bKeepSystemCopy) = 0; + virtual void SetKeepSystemCopy(bool bKeepSystemCopy) = 0; virtual void UpdateTextureRegion(const uint8_t* data, int nX, int nY, int nZ, int USize, int VSize, int ZSize, ETEX_Format eTFSrc) = 0; virtual CDeviceTexture* GetDevTexture() const = 0; diff --git a/Code/CryEngine/CryCommon/MaterialUtils.h b/Code/CryEngine/CryCommon/MaterialUtils.h index 901a517094..60752de8c5 100644 --- a/Code/CryEngine/CryCommon/MaterialUtils.h +++ b/Code/CryEngine/CryCommon/MaterialUtils.h @@ -87,7 +87,7 @@ namespace MaterialUtils if (cachedGameName[0] == 0) { // at least substitute something so that unit tests can make this assumption: - azstrcpy(cachedGameName, AZ_MAX_PATH_LEN, "SamplesProject/"); + azstrcpy(cachedGameName, AZ_MAX_PATH_LEN, "AutomatedTesting/"); } removals[removalSize - 1] = cachedGameName; diff --git a/Code/CryEngine/CryCommon/Mocks/I3DEngineMock.h b/Code/CryEngine/CryCommon/Mocks/I3DEngineMock.h index f0e49739a1..b0936ddbdd 100644 --- a/Code/CryEngine/CryCommon/Mocks/I3DEngineMock.h +++ b/Code/CryEngine/CryCommon/Mocks/I3DEngineMock.h @@ -69,9 +69,9 @@ public: MOCK_METHOD0(Release, void()); MOCK_METHOD3(RenderWorld, - void(const int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName)); + void(int nRenderFlags, const SRenderingPassInfo& passInfo, const char* szDebugName)); MOCK_METHOD2(RenderSceneReflection, - void(const int nRenderFlags, const SRenderingPassInfo& passInfo)); + void(int nRenderFlags, const SRenderingPassInfo& passInfo)); MOCK_METHOD1(PreWorldStreamUpdate, void(const CCamera& cam)); MOCK_METHOD0(WorldStreamUpdate, @@ -262,7 +262,7 @@ public: MOCK_METHOD1(GetLevelFilePath, const char*(const char* szFileName)); MOCK_METHOD4(DisplayInfo, - void(float& fTextPosX, float& fTextPosY, float& fTextStepY, const bool bEnhanced)); + void(float& fTextPosX, float& fTextPosY, float& fTextStepY, bool bEnhanced)); MOCK_METHOD0(DisplayMemoryStatistics, void()); diff --git a/Code/CryEngine/CryCommon/Mocks/IAudioSystemMock.h b/Code/CryEngine/CryCommon/Mocks/IAudioSystemMock.h index 2735548e00..5995b2ecc0 100644 --- a/Code/CryEngine/CryCommon/Mocks/IAudioSystemMock.h +++ b/Code/CryEngine/CryCommon/Mocks/IAudioSystemMock.h @@ -19,16 +19,16 @@ namespace Audio struct AudioProxyMock : public IAudioProxy { - MOCK_METHOD2(Initialize, void(const char* const sObjectName, const bool bInitAsync /* = true */)); + MOCK_METHOD2(Initialize, void(const char* const sObjectName, bool bInitAsync /* = true */)); MOCK_METHOD0(Release, void()); MOCK_METHOD0(Reset, void()); - MOCK_METHOD1(StopTrigger, void(const TAudioControlID nTriggerID)); - MOCK_METHOD2(SetSwitchState, void(const TAudioControlID nSwitchID, const TAudioSwitchStateID nStateID)); - MOCK_METHOD2(SetRtpcValue, void(const TAudioControlID nRtpcID, const float fValue)); - MOCK_METHOD1(SetObstructionCalcType, void(const EAudioObjectObstructionCalcType eObstructionType)); + MOCK_METHOD1(StopTrigger, void(TAudioControlID nTriggerID)); + MOCK_METHOD2(SetSwitchState, void(TAudioControlID nSwitchID, TAudioSwitchStateID nStateID)); + MOCK_METHOD2(SetRtpcValue, void(TAudioControlID nRtpcID, float fValue)); + MOCK_METHOD1(SetObstructionCalcType, void(EAudioObjectObstructionCalcType eObstructionType)); MOCK_METHOD1(SetPosition, void(const SATLWorldPosition& rPosition)); MOCK_METHOD1(SetPosition, void(const AZ::Vector3& rPosition)); - MOCK_METHOD2(SetEnvironmentAmount, void(const TAudioEnvironmentID nEnvironmentID, const float fAmount)); + MOCK_METHOD2(SetEnvironmentAmount, void(TAudioEnvironmentID nEnvironmentID, float fAmount)); MOCK_METHOD0(SetCurrentEnvironments, void()); MOCK_CONST_METHOD0(GetAudioObjectID, TAudioObjectID()); }; @@ -39,25 +39,25 @@ namespace Audio MOCK_METHOD0(Initialize, bool()); MOCK_METHOD0(Release, void()); MOCK_METHOD1(PushRequest, void(const SAudioRequest& rAudioRequestData)); - MOCK_METHOD4(AddRequestListener, void(AudioRequestCallbackType func, void* const pObjectToListenTo, const EAudioRequestType requestType /* = eART_AUDIO_ALL_REQUESTS */, const TATLEnumFlagsType specificRequestMask /* = ALL_AUDIO_REQUEST_SPECIFIC_TYPE_FLAGS */)); - MOCK_METHOD2(RemoveRequestListener, void(AudioRequestCallbackType func, void* const pObjectToListenTo)); + MOCK_METHOD4(AddRequestListener, void(AudioRequestCallbackType func, void* pObjectToListenTo, EAudioRequestType requestType /* = eART_AUDIO_ALL_REQUESTS */, TATLEnumFlagsType specificRequestMask /* = ALL_AUDIO_REQUEST_SPECIFIC_TYPE_FLAGS */)); + MOCK_METHOD2(RemoveRequestListener, void(AudioRequestCallbackType func, void* pObjectToListenTo)); MOCK_METHOD0(ExternalUpdate, void()); - MOCK_CONST_METHOD1(GetAudioTriggerID, TAudioControlID(const char* const sAudioTriggerName)); - MOCK_CONST_METHOD1(GetAudioRtpcID, TAudioControlID(const char* const sAudioRtpcName)); - MOCK_CONST_METHOD1(GetAudioSwitchID, TAudioControlID(const char* const sAudioSwitchName)); - MOCK_CONST_METHOD2(GetAudioSwitchStateID, TAudioSwitchStateID(const TAudioControlID nSwitchID, const char* const sAudioStateName)); - MOCK_CONST_METHOD1(GetAudioPreloadRequestID, TAudioPreloadRequestID(const char* const sAudioPreloadRequestName)); - MOCK_CONST_METHOD1(GetAudioEnvironmentID, TAudioEnvironmentID(const char* const sAudioEnvironmentName)); + MOCK_CONST_METHOD1(GetAudioTriggerID, TAudioControlID(const char* sAudioTriggerName)); + MOCK_CONST_METHOD1(GetAudioRtpcID, TAudioControlID(const char* sAudioRtpcName)); + MOCK_CONST_METHOD1(GetAudioSwitchID, TAudioControlID(const char* sAudioSwitchName)); + MOCK_CONST_METHOD2(GetAudioSwitchStateID, TAudioSwitchStateID(const TAudioControlID nSwitchID, const char* sAudioStateName)); + MOCK_CONST_METHOD1(GetAudioPreloadRequestID, TAudioPreloadRequestID(const char* sAudioPreloadRequestName)); + MOCK_CONST_METHOD1(GetAudioEnvironmentID, TAudioEnvironmentID(const char* sAudioEnvironmentName)); MOCK_METHOD1(ReserveAudioListenerID, bool(TAudioObjectID& rAudioListenerID)); - MOCK_METHOD1(ReleaseAudioListenerID, bool(const TAudioObjectID nAudioObjectID)); + MOCK_METHOD1(ReleaseAudioListenerID, bool(TAudioObjectID nAudioObjectID)); MOCK_METHOD1(OnCVarChanged, void(ICVar* const pCVar)); MOCK_METHOD1(GetInfo, void(SAudioSystemInfo& rAudioSystemInfo)); MOCK_CONST_METHOD0(GetControlsPath, const char*()); MOCK_METHOD0(UpdateControlsPath, void()); MOCK_METHOD0(GetFreeAudioProxy, IAudioProxy*()); - MOCK_METHOD1(FreeAudioProxy, void(IAudioProxy* const pIAudioProxy)); - MOCK_CONST_METHOD2(GetAudioControlName, const char*(const EAudioControlType eAudioEntityType, const TATLIDType nAudioEntityID)); - MOCK_CONST_METHOD2(GetAudioSwitchStateName, const char*(const TAudioControlID switchID, const TAudioSwitchStateID stateID)); + MOCK_METHOD1(FreeAudioProxy, void(IAudioProxy* pIAudioProxy)); + MOCK_CONST_METHOD2(GetAudioControlName, const char*(EAudioControlType eAudioEntityType, TATLIDType nAudioEntityID)); + MOCK_CONST_METHOD2(GetAudioSwitchStateName, const char*(TAudioControlID switchID, TAudioSwitchStateID stateID)); }; } // namespace Audio diff --git a/Code/CryEngine/CryCommon/Mocks/ICVarMock.h b/Code/CryEngine/CryCommon/Mocks/ICVarMock.h index 1a72b45435..beeb0a31e4 100644 --- a/Code/CryEngine/CryCommon/Mocks/ICVarMock.h +++ b/Code/CryEngine/CryCommon/Mocks/ICVarMock.h @@ -29,8 +29,8 @@ public: MOCK_CONST_METHOD0(GetDataProbeString, const char*()); MOCK_METHOD1(Set, void(const char*)); MOCK_METHOD1(ForceSet, void(const char*)); - MOCK_METHOD1(Set, void(const float)); - MOCK_METHOD1(Set, void(const int)); + MOCK_METHOD1(Set, void(float)); + MOCK_METHOD1(Set, void(int)); MOCK_METHOD1(ClearFlags, void(const int)); MOCK_CONST_METHOD0(GetFlags, int()); MOCK_METHOD1(SetFlags, int(const int)); diff --git a/Code/CryEngine/CryCommon/Mocks/IConsoleMock.h b/Code/CryEngine/CryCommon/Mocks/IConsoleMock.h index 6042c3de83..31509ca6ba 100644 --- a/Code/CryEngine/CryCommon/Mocks/IConsoleMock.h +++ b/Code/CryEngine/CryCommon/Mocks/IConsoleMock.h @@ -36,14 +36,14 @@ public: MOCK_METHOD1(SetScrollMax, void(int value)); MOCK_METHOD1(AddOutputPrintSink, void(IOutputPrintSink * inpSink)); MOCK_METHOD1(RemoveOutputPrintSink, void(IOutputPrintSink * inpSink)); - MOCK_METHOD2(ShowConsole, void(bool show, const int iRequestScrollMax)); + MOCK_METHOD2(ShowConsole, void(bool show, int iRequestScrollMax)); MOCK_METHOD2(DumpCVars, void(ICVarDumpSink * pCallback, unsigned int nFlagsFilter)); MOCK_METHOD2(CreateKeyBind, void(const char* sCmd, const char* sRes)); MOCK_METHOD2(SetImage, void (ITexture * pImage, bool bDeleteCurrent)); MOCK_METHOD0(GetImage, ITexture * ()); MOCK_METHOD1(StaticBackground, void (bool bStatic)); MOCK_METHOD1(SetLoadingImage, void(const char* szFilename)); - MOCK_CONST_METHOD3(GetLineNo, bool(const int indwLineNo, char* outszBuffer, const int indwBufferSize)); + MOCK_CONST_METHOD3(GetLineNo, bool(int indwLineNo, char* outszBuffer, int indwBufferSize)); MOCK_CONST_METHOD0(GetLineCount, int ()); MOCK_METHOD1(GetCVar, ICVar * (const char* name)); MOCK_METHOD3(GetVariable, char*(const char* szVarName, const char* szFileName, const char* def_val)); @@ -57,7 +57,7 @@ public: MOCK_METHOD4(AddCommand, bool (const char* sCommand, ConsoleCommandFunc func, int nFlags, const char* sHelp)); MOCK_METHOD4(AddCommand, bool (const char* sName, const char* sScriptFunc, int nFlags, const char* sHelp)); MOCK_METHOD1(RemoveCommand, void (const char* sName)); - MOCK_METHOD3(ExecuteString, void (const char* command, const bool bSilentMode, const bool bDeferExecution )); + MOCK_METHOD3(ExecuteString, void (const char* command, bool bSilentMode, bool bDeferExecution )); MOCK_METHOD0(IsOpened, bool ()); MOCK_METHOD0(GetNumVars, int()); MOCK_METHOD0(GetNumVisibleVars, int()); @@ -83,7 +83,7 @@ public: MOCK_METHOD1(GetCheatVarAt, char* (uint32 nOffset)); MOCK_METHOD1(AddConsoleVarSink, void (IConsoleVarSink * pSink)); MOCK_METHOD1(RemoveConsoleVarSink, void (IConsoleVarSink * pSink)); - MOCK_METHOD1(GetHistoryElement, const char*(const bool bUpOrDown)); + MOCK_METHOD1(GetHistoryElement, const char*(bool bUpOrDown)); MOCK_METHOD1(AddCommandToHistory, void (const char* szCommand)); MOCK_METHOD2(LoadConfigVar, void (const char* sVariable, const char* sValue)); MOCK_METHOD1(EnableActivationKey, void (bool bEnable)); diff --git a/Code/CryEngine/CryCommon/Mocks/ILogMock.h b/Code/CryEngine/CryCommon/Mocks/ILogMock.h index 1d2b5dd7d8..5d8b6d41b6 100644 --- a/Code/CryEngine/CryCommon/Mocks/ILogMock.h +++ b/Code/CryEngine/CryCommon/Mocks/ILogMock.h @@ -17,9 +17,9 @@ class LogMock { public: MOCK_METHOD3(LogV, - void(const ELogType nType, const char* szFormat, va_list args)); + void(ELogType nType, const char* szFormat, va_list args)); MOCK_METHOD4(LogV, - void(const ELogType nType, int flags, const char* szFormat, va_list args)); + void(ELogType nType, int flags, const char* szFormat, va_list args)); MOCK_METHOD0(Release, void()); MOCK_METHOD2(SetFileName, diff --git a/Code/CryEngine/CryCommon/Mocks/IRendererMock.h b/Code/CryEngine/CryCommon/Mocks/IRendererMock.h index 1d2e49ad66..2021e96172 100644 --- a/Code/CryEngine/CryCommon/Mocks/IRendererMock.h +++ b/Code/CryEngine/CryCommon/Mocks/IRendererMock.h @@ -63,9 +63,9 @@ public: MOCK_CONST_METHOD2(GetCurrentNumberOfDrawCalls, void(int& nGeneral, int& nShadowGen)); MOCK_CONST_METHOD1(GetCurrentNumberOfDrawCalls, - int(const uint32 EFSListMask)); + int(uint32 EFSListMask)); MOCK_CONST_METHOD1(GetCurrentDrawCallRTTimes, - float(const uint32 EFSListMask)); + float(uint32 EFSListMask)); MOCK_METHOD1(SetDebugRenderNode, void(IRenderNode * pRenderNode)); MOCK_CONST_METHOD1(IsDebugRenderNode, @@ -135,7 +135,7 @@ public: MOCK_METHOD1(ApplyViewParameters, void(const CameraViewParameters& viewParameters)); MOCK_METHOD5(DrawDynVB, - void(SVF_P3F_C4B_T2F * pBuf, uint16 * pInds, int nVerts, int nInds, const PublicRenderPrimitiveType nPrimType)); + void(SVF_P3F_C4B_T2F * pBuf, uint16 * pInds, int nVerts, int nInds, PublicRenderPrimitiveType nPrimType)); // Hand-edit: google mock has issues with DynUiPrimitiveList void DrawDynUiPrimitiveList([[maybe_unused]] DynUiPrimitiveList& primitives, [[maybe_unused]] int totalNumVertices, [[maybe_unused]] int totalNumIndices) override { return; } @@ -147,7 +147,7 @@ public: MOCK_METHOD1(GetRenderViewForThread, CRenderView * (int nThreadID)); MOCK_METHOD1(SetGammaDelta, - bool(const float fGamma)); + bool(float fGamma)); MOCK_METHOD0(RestoreGamma, void(void)); MOCK_METHOD3(ChangeDisplay, @@ -255,7 +255,7 @@ public: MOCK_METHOD3(FlushRTCommands, bool(bool bWait, bool bImmediatelly, bool bForce)); MOCK_CONST_METHOD7(DrawStringU, - void(IFFont_RenderProxy * pFont, float x, float y, float z, const char* pStr, const bool asciiMultiLine, const STextDrawContext& ctx)); + void(IFFont_RenderProxy * pFont, float x, float y, float z, const char* pStr, bool asciiMultiLine, const STextDrawContext& ctx)); MOCK_METHOD0(RT_CurThreadList, int()); MOCK_METHOD6(EF_PrecacheResource, @@ -343,9 +343,9 @@ public: MOCK_METHOD7(EF_AddEf, void(IRenderElement * pRE, SShaderItem & pSH, CRenderObject * pObj, const SRenderingPassInfo& passInfo, int nList, int nAW, const SRendItemSorter& rendItemSorter)); MOCK_METHOD4(EF_EndEf3D, - void(const int nFlags, const int nPrecacheUpdateId, const int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo)); + void(int nFlags, int nPrecacheUpdateId, int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo)); MOCK_METHOD1(EF_InvokeShadowMapRenderJobs, - void(const int nFlags)); + void(int nFlags)); MOCK_METHOD1(EF_IsFakeDLight, bool(const CDLight * Source)); MOCK_METHOD2(EF_ADDDlight, @@ -393,11 +393,11 @@ public: MOCK_METHOD0(EF_DisableTemporalEffects, void()); MOCK_METHOD3(EF_AddWaterSimHit, - void(const Vec3& vPos, const float scale, const float strength)); + void(const Vec3& vPos, float scale, float strength)); MOCK_METHOD0(EF_DrawWaterSimHits, void()); MOCK_METHOD1(EF_EndEf2D, - void(const bool bSort)); + void(bool bSort)); MOCK_METHOD0(ForceGC, void()); MOCK_CONST_METHOD0(GetPolyCount, @@ -532,7 +532,7 @@ public: MOCK_METHOD8(DXTCompress, bool(const byte * raw_data, int nWidth, int nHeight, ETEX_Format eTF, bool bUseHW, bool bGenMips, int nSrcBytesPerPix, MIPDXTcallback callback)); MOCK_METHOD9(DXTDecompress, - bool(const byte * srcData, const size_t srcFileSize, byte * dstData, int nWidth, int nHeight, int nMips, ETEX_Format eSrcTF, bool bUseHW, int nDstBytesPerPix)); + bool(const byte * srcData, size_t srcFileSize, byte * dstData, int nWidth, int nHeight, int nMips, ETEX_Format eSrcTF, bool bUseHW, int nDstBytesPerPix)); MOCK_METHOD1(RemoveTexture, void(unsigned int TextureId)); MOCK_METHOD1(DeleteFont, @@ -727,7 +727,7 @@ public: MOCK_METHOD1(EndScreenShot, void(int e_ScreenShot)); MOCK_METHOD3(SetRendererCVar, - void(ICVar*, const char*, const bool)); + void(ICVar*, const char*, bool)); MOCK_METHOD0(GetRenderPipeline, SRenderPipeline * ()); MOCK_METHOD0(GetShaderManager, diff --git a/Code/CryEngine/CryCommon/Mocks/ITextureMock.h b/Code/CryEngine/CryCommon/Mocks/ITextureMock.h index af8719892d..bf51279b52 100644 --- a/Code/CryEngine/CryCommon/Mocks/ITextureMock.h +++ b/Code/CryEngine/CryCommon/Mocks/ITextureMock.h @@ -107,7 +107,7 @@ public: MOCK_METHOD3(GetLowResSystemCopy, const ColorB * (uint16 & nWidth, uint16 & nHeight, int** ppLowResSystemCopyAtlasId)); MOCK_METHOD1(SetKeepSystemCopy, - void(const bool bKeepSystemCopy)); + void(bool bKeepSystemCopy)); MOCK_METHOD8(UpdateTextureRegion, void(const uint8_t * data, int nX, int nY, int nZ, int USize, int VSize, int ZSize, ETEX_Format eTFSrc)); MOCK_CONST_METHOD0(GetDevTexture, diff --git a/Code/CryEngine/CryCommon/ResourceCompilerHelper.cpp b/Code/CryEngine/CryCommon/ResourceCompilerHelper.cpp index b69002dd7b..33373f7460 100644 --- a/Code/CryEngine/CryCommon/ResourceCompilerHelper.cpp +++ b/Code/CryEngine/CryCommon/ResourceCompilerHelper.cpp @@ -401,8 +401,8 @@ IResourceCompilerHelper::ERcCallResult CResourceCompilerHelper::CallResourceComp [[maybe_unused]] const wchar_t* szRootPath) { #if defined(AZ_PLATFORM_WINDOWS) - HANDLE hChildStdOutRd, hChildStdOutWr; - HANDLE hChildStdInRd, hChildStdInWr; + HANDLE hChildStdOutRd = INVALID_HANDLE_VALUE, hChildStdOutWr = INVALID_HANDLE_VALUE; + HANDLE hChildStdInRd = INVALID_HANDLE_VALUE, hChildStdInWr = INVALID_HANDLE_VALUE; PROCESS_INFORMATION pi; #else FILE* hChildStdOutRd; diff --git a/Code/CryEngine/CryCommon/physinterface.h b/Code/CryEngine/CryCommon/physinterface.h index 0efcb084c2..036f7e29ab 100644 --- a/Code/CryEngine/CryCommon/physinterface.h +++ b/Code/CryEngine/CryCommon/physinterface.h @@ -2112,7 +2112,7 @@ struct pe_status_area { type_id = ePE_status_area }; - pe_status_area() { type = type_id; bUniformOnly = false; ctr.zero(); size.zero(); vel.zero(); MARK_UNUSED gravity, pb; pLockUpdate = 0; pSurface = 0; } + pe_status_area() { type = type_id; bUniformOnly = false; ctr.zero(); size.zero(); vel.zero(); MARK_UNUSED gravity; pLockUpdate = 0; pSurface = 0; } // inputs. Vec3 ctr, size; // query bounds diff --git a/Code/CryEngine/CrySystem/AsyncPakManager.cpp b/Code/CryEngine/CrySystem/AsyncPakManager.cpp index 0ead1bfbe1..40928715d8 100644 --- a/Code/CryEngine/CrySystem/AsyncPakManager.cpp +++ b/Code/CryEngine/CrySystem/AsyncPakManager.cpp @@ -19,6 +19,7 @@ #include "System.h" #include "IStreamEngine.h" #include +#include #include "ResourceManager.h" #define MEGA_BYTE 1024* 1024 @@ -360,20 +361,37 @@ void CAsyncPakManager::StreamAsyncOnComplete( } else { - // - // ugly hack - depending on the pak file pak may need special root info / open flags - // - if (pLayerPak->layername.find("level.pak") != string::npos) - { - gEnv->pCryPak->OpenPack({ pLayerPak->filename.c_str(), pLayerPak->filename.size() }, AZ::IO::IArchive::FLAGS_FILENAMES_AS_CRC32, NULL); - } - else if (pLayerPak->layername.find("levelshadercache.pak") != string::npos) + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, + &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) { - gEnv->pCryPak->OpenPack("@assets@", { pLayerPak->filename.c_str(), pLayerPak->filename.size() }, AZ::IO::IArchive::FLAGS_PATH_REAL, NULL); + gEnv->pCryPak->OpenPack( + "@assets@", {pLayerPak->filename.c_str(), pLayerPak->filename.size()}, AZ::IO::IArchive::FLAGS_FILENAMES_AS_CRC32, NULL); } else { - gEnv->pCryPak->OpenPack("@assets@", { pLayerPak->filename.c_str(), pLayerPak->filename.size() }, AZ::IO::IArchive::FLAGS_FILENAMES_AS_CRC32, NULL); + // + // ugly hack - depending on the pak file pak may need special root info / open flags + // + if (pLayerPak->layername.find("level.pak") != string::npos) + { + gEnv->pCryPak->OpenPack( + {pLayerPak->filename.c_str(), pLayerPak->filename.size()}, AZ::IO::IArchive::FLAGS_FILENAMES_AS_CRC32, NULL); + } + else if (pLayerPak->layername.find("levelshadercache.pak") != string::npos) + { + gEnv->pCryPak->OpenPack( + "@assets@", {pLayerPak->filename.c_str(), pLayerPak->filename.size()}, AZ::IO::IArchive::FLAGS_PATH_REAL, NULL); + } + else + { + gEnv->pCryPak->OpenPack( + "@assets@", {pLayerPak->filename.c_str(), pLayerPak->filename.size()}, AZ::IO::IArchive::FLAGS_FILENAMES_AS_CRC32, + NULL); + } } gEnv->pCryPak->LoadPakToMemory(pLayerPak->filename.c_str(), AZ::IO::IArchive::eInMemoryPakLocale_GPU, pLayerPak->pData); } diff --git a/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.cpp b/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.cpp index f029060ee1..996dee7810 100644 --- a/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.cpp +++ b/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.cpp @@ -11,6 +11,8 @@ */ // Original file Copyright Crytek GMBH or its affiliates, used under license. +// [LYN-2376] Remove the entire file once legacy slice support is removed + #include "CrySystem_precompiled.h" #include "LevelSystem.h" #include @@ -25,9 +27,11 @@ #include #include +#include #include #include #include +#include #include "MainThreadRenderRequestBus.h" #include @@ -43,47 +47,88 @@ namespace LegacyLevelSystem { +static constexpr const char* ArchiveExtension = ".pak"; -int CLevelSystem::s_loadCount = 0; -const char* ArchiveExtension = ".pak"; -const char TerrarinTexturePakName[] = "terraintexture.pak"; +void CLevelInfo::GetMemoryUsage(ICrySizer* pSizer) const +{ + pSizer->AddObject(m_levelName); + pSizer->AddObject(m_levelPath); +} -//------------------------------------------------------------------------ -bool CLevelInfo::SupportsGameType(const char* gameTypeName) const +////////////////////////////////////////////////////////////////////////// +bool CLevelInfo::OpenLevelPak() { - //read level meta data - for (int i = 0; i < m_gamerules.size(); ++i) + LOADING_TIME_PROFILE_SECTION; + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + // The prefab system doesn't use level.pak + if (usePrefabSystemForLevels) { - if (!azstricmp(m_gamerules[i].c_str(), gameTypeName)) - { - return true; - } + return false; } - return false; + + AZStd::string levelpak(m_levelPath); + levelpak += "/level.pak"; + AZStd::fixed_string fullLevelPakPath; + bool bOk = gEnv->pCryPak->OpenPack( + levelpak.c_str(), m_isPak ? AZ::IO::IArchive::FLAGS_LEVEL_PAK_INSIDE_PAK : (unsigned)0, NULL, &fullLevelPakPath, false); + m_levelPakFullPath.assign(fullLevelPakPath.c_str()); + return bOk; } -//------------------------------------------------------------------------ -const char* CLevelInfo::GetDisplayName() const +////////////////////////////////////////////////////////////////////////// +void CLevelInfo::CloseLevelPak() { - return m_levelDisplayName.c_str(); + LOADING_TIME_PROFILE_SECTION; + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + // The prefab system doesn't use level.pak + if (usePrefabSystemForLevels) + { + return; + } + + if (!m_levelPakFullPath.empty()) + { + gEnv->pCryPak->ClosePack(m_levelPakFullPath.c_str(), AZ::IO::IArchive::FLAGS_PATH_REAL); + m_levelPakFullPath.clear(); + } } ////////////////////////////////////////////////////////////////////////// bool CLevelInfo::ReadInfo() { - string levelPath = m_levelPath; - string xmlFile = levelPath + string("/LevelInfo.xml"); + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) + { + // Set up a default game type for legacy code. + m_defaultGameTypeName = "Mission0"; + return true; + } + + + AZStd::string levelPath(m_levelPath); + AZStd::string xmlFile(levelPath); + xmlFile += "/LevelInfo.xml"; XmlNodeRef rootNode = GetISystem()->LoadXmlFromFile(xmlFile.c_str()); if (rootNode) { - m_heightmapSize = atoi(rootNode->getAttr("HeightmapSize")); - - string dataFile = levelPath + string("/LevelDataAction.xml"); + AZStd::string dataFile(levelPath); + dataFile += "/LevelDataAction.xml"; XmlNodeRef dataNode = GetISystem()->LoadXmlFromFile(dataFile.c_str()); if (!dataNode) { - dataFile = levelPath + string("/LevelData.xml"); + dataFile = levelPath + "/LevelData.xml"; dataNode = GetISystem()->LoadXmlFromFile(dataFile.c_str()); } @@ -93,8 +138,7 @@ bool CLevelInfo::ReadInfo() if ((gameTypesNode != 0) && (gameTypesNode->getChildCount() > 0)) { - m_gameTypes.clear(); - //m_musicLibs.clear(); + m_defaultGameTypeName.clear(); for (int i = 0; i < gameTypesNode->getChildCount(); i++) { @@ -106,37 +150,11 @@ bool CLevelInfo::ReadInfo() if (gameTypeName) { - ILevelInfo::TGameTypeInfo info; - - info.cgfCount = 0; - gameTypeNode->getAttr("CGFCount", info.cgfCount); - info.name = gameTypeNode->getAttr("Name"); - info.xmlFile = gameTypeNode->getAttr("File"); - m_gameTypes.push_back(info); + m_defaultGameTypeName = gameTypeName; + break; } } } - - // Gets reintroduced when level specific music data loading is implemented. - /*XmlNodeRef musicLibraryNode = dataNode->findChild("MusicLibrary"); - - if ((musicLibraryNode!=0) && (musicLibraryNode->getChildCount() > 0)) - { - for (int i = 0; i < musicLibraryNode->getChildCount(); i++) - { - XmlNodeRef musicLibrary = musicLibraryNode->getChild(i); - - if (musicLibrary->isTag("Library")) - { - const char *musicLibraryName = musicLibrary->getAttr("File"); - - if (musicLibraryName) - { - m_musicLibs.push_back(string("music/") + musicLibraryName); - } - } - } - }*/ } } } @@ -144,130 +162,12 @@ bool CLevelInfo::ReadInfo() } ////////////////////////////////////////////////////////////////////////// -void CLevelInfo::ReadMetaData() -{ - string fullPath(GetPath()); - int slashPos = fullPath.find_last_of("\\/"); - string mapName = fullPath.substr(slashPos + 1, fullPath.length() - slashPos); - fullPath.append("/"); - fullPath.append(mapName); - fullPath.append(".xml"); - - m_levelDisplayName = string("@ui_") + mapName; - - if (!gEnv->pCryPak->IsFileExist(fullPath.c_str())) - { - return; - } - - XmlNodeRef mapInfo = GetISystem()->LoadXmlFromFile(fullPath.c_str()); - //retrieve the coordinates of the map - bool foundMinimapInfo = false; - if (mapInfo) - { - for (int n = 0; n < mapInfo->getChildCount(); ++n) - { - XmlNodeRef rulesNode = mapInfo->getChild(n); - const char* name = rulesNode->getTag(); - if (!azstricmp(name, "Gamerules")) - { - for (int a = 0; a < rulesNode->getNumAttributes(); ++a) - { - const char* key, * value; - rulesNode->getAttributeByIndex(a, &key, &value); - m_gamerules.push_back(value); - } - } - else if (!azstricmp(name, "Display")) - { - XmlString v; - if (rulesNode->getAttr("Name", v)) - { - m_levelDisplayName = v.c_str(); - } - } - else if (!azstricmp(name, "PreviewImage")) - { - const char* pFilename = NULL; - if (rulesNode->getAttr("Filename", &pFilename)) - { - m_previewImagePath = pFilename; - } - } - else if (!azstricmp(name, "BackgroundImage")) - { - const char* pFilename = NULL; - if (rulesNode->getAttr("Filename", &pFilename)) - { - m_backgroundImagePath = pFilename; - } - } - else if (!azstricmp(name, "Minimap")) - { - foundMinimapInfo = true; - - const char* minimap_dds = ""; - foundMinimapInfo &= rulesNode->getAttr("Filename", &minimap_dds); - m_minimapImagePath = minimap_dds; - m_minimapInfo.sMinimapName = GetPath(); - m_minimapInfo.sMinimapName.append("/"); - m_minimapInfo.sMinimapName.append(minimap_dds); - - foundMinimapInfo &= rulesNode->getAttr("startX", m_minimapInfo.fStartX); - foundMinimapInfo &= rulesNode->getAttr("startY", m_minimapInfo.fStartY); - foundMinimapInfo &= rulesNode->getAttr("endX", m_minimapInfo.fEndX); - foundMinimapInfo &= rulesNode->getAttr("endY", m_minimapInfo.fEndY); - foundMinimapInfo &= rulesNode->getAttr("width", m_minimapInfo.iWidth); - foundMinimapInfo &= rulesNode->getAttr("height", m_minimapInfo.iHeight); - m_minimapInfo.fDimX = m_minimapInfo.fEndX - m_minimapInfo.fStartX; - m_minimapInfo.fDimY = m_minimapInfo.fEndY - m_minimapInfo.fStartY; - m_minimapInfo.fDimX = m_minimapInfo.fDimX > 0 ? m_minimapInfo.fDimX : 1; - m_minimapInfo.fDimY = m_minimapInfo.fDimY > 0 ? m_minimapInfo.fDimY : 1; - } - else if (!azstricmp(name, "Tag")) - { - m_levelTag = ILevelSystem::TAG_UNKNOWN; - SwapEndian(m_levelTag, eBigEndian); - const char* pTag = NULL; - if (rulesNode->getAttr("Value", &pTag)) - { - m_levelTag = 0; - memcpy(&m_levelTag, pTag, std::min(sizeof(m_levelTag), strlen(pTag))); - } - } - else if (!azstricmp(name, "LevelType")) - { - const char* levelType; - if (rulesNode->getAttr("value", &levelType)) - { - m_levelTypeList.push_back(levelType); - } - } - } - m_bMetaDataRead = true; - } - if (!foundMinimapInfo) - { - gEnv->pLog->LogWarning("Map %s: Missing or invalid minimap info!", mapName.c_str()); - } -} - -//------------------------------------------------------------------------ -const ILevelInfo::TGameTypeInfo* CLevelInfo::GetDefaultGameType() const -{ - if (!m_gameTypes.empty()) - { - return &m_gameTypes[0]; - } - - return 0; -}; /// Used by console auto completion. struct SLevelNameAutoComplete : public IConsoleArgumentAutoComplete { - std::vector levels; + AZStd::vector levels; virtual int GetCount() const { return levels.size(); }; virtual const char* GetValue(int nIndex) const { return levels[nIndex].c_str(); }; }; @@ -281,7 +181,7 @@ static void LoadMap(IConsoleCmdArgs* args) { if (args->GetArgCount() > 1) { - gEnv->pSystem->GetILevelSystem()->UnLoadLevel(); + gEnv->pSystem->GetILevelSystem()->UnloadLevel(); gEnv->pSystem->GetILevelSystem()->LoadLevel(args->GetArg(1)); } } @@ -292,7 +192,7 @@ static void UnloadMap([[maybe_unused]] IConsoleCmdArgs* args) { if (gEnv->pSystem && gEnv->pSystem->GetILevelSystem() && !gEnv->IsEditor()) { - gEnv->pSystem->GetILevelSystem()->UnLoadLevel(); + gEnv->pSystem->GetILevelSystem()->UnloadLevel(); if (gEnv->p3DEngine) { gEnv->p3DEngine->LoadEmptyLevel(); @@ -309,29 +209,12 @@ CLevelSystem::CLevelSystem(ISystem* pSystem, const char* levelsFolder) LOADING_TIME_PROFILE_SECTION; CRY_ASSERT(pSystem); - //Load user defined level types - if (XmlNodeRef levelTypeNode = m_pSystem->LoadXmlFromFile("Libs/Levels/leveltypes.xml")) - { - for (unsigned int i = 0; i < levelTypeNode->getChildCount(); ++i) - { - XmlNodeRef child = levelTypeNode->getChild(i); - const char* levelType; - - if (child->getAttr("value", &levelType)) - { - m_levelTypeList.push_back(string(levelType)); - } - } - } - //if (!gEnv->IsEditor()) - Rescan(levelsFolder, ILevelSystem::TAG_MAIN); + Rescan(levelsFolder); m_fLastLevelLoadTime = 0; - m_fFilteredProgress = 0; m_fLastTime = 0; m_bLevelLoaded = false; - m_bRecordingFileOpens = false; m_levelLoadStartTime.SetValue(0); @@ -355,10 +238,9 @@ CLevelSystem::CLevelSystem(ISystem* pSystem, const char* levelsFolder) for (AZStd::string dir : levelDirs) { AZ::StringFunc::Path::StripComponent(dir, true); - string searchPattern = string(dir.c_str(), dir.size()) + AZ_FILESYSTEM_SEPARATOR_WILDCARD; + AZStd::string searchPattern = dir + AZ_FILESYSTEM_SEPARATOR_WILDCARD; bool modFolder = false; - string rootFolder(dir.c_str(), dir.size()); - PopulateLevels(searchPattern, rootFolder, gEnv->pCryPak, modFolder, ILevelSystem::TAG_MAIN, false); + PopulateLevels(searchPattern, dir, gEnv->pCryPak, modFolder, false); } }); m_levelPackOpenHandler.Connect(*levelPakOpenEvent); @@ -368,7 +250,7 @@ CLevelSystem::CLevelSystem(ISystem* pSystem, const char* levelsFolder) { m_levelPackCloseHandler = AZ::IO::IArchive::LevelPackCloseEvent::Handler([this](AZStd::string_view) { - Rescan(ILevelSystem::LevelsDirectoryName, ILevelSystem::TAG_MAIN); + Rescan(ILevelSystem::LevelsDirectoryName); }); m_levelPackCloseHandler.Connect(*levelPakCloseEvent); } @@ -380,7 +262,7 @@ CLevelSystem::~CLevelSystem() } //------------------------------------------------------------------------ -void CLevelSystem::Rescan(const char* levelsFolder, const uint32 tag) +void CLevelSystem::Rescan(const char* levelsFolder) { if (levelsFolder) { @@ -388,9 +270,9 @@ void CLevelSystem::Rescan(const char* levelsFolder, const uint32 tag) { if (m_pSystem->IsMODValid(pModArg->GetValue())) { - m_levelsFolder.Format("Mods/%s/%s", pModArg->GetValue(), levelsFolder); + m_levelsFolder.format("Mods/%s/%s", pModArg->GetValue(), levelsFolder); m_levelInfos.clear(); - ScanFolder(0, true, tag); + ScanFolder(0, true); } } @@ -400,25 +282,25 @@ void CLevelSystem::Rescan(const char* levelsFolder, const uint32 tag) CRY_ASSERT(!m_levelsFolder.empty()); m_levelInfos.clear(); m_levelInfos.reserve(64); - ScanFolder(0, false, tag); + ScanFolder(0, false); g_LevelNameAutoComplete->levels.clear(); for (int i = 0; i < (int)m_levelInfos.size(); i++) { - g_LevelNameAutoComplete->levels.push_back(PathUtil::GetFileName(m_levelInfos[i].GetName())); + g_LevelNameAutoComplete->levels.push_back(AZStd::string(PathUtil::GetFileName(m_levelInfos[i].GetName()).c_str())); } } //----------------------------------------------------------------------- -void CLevelSystem::ScanFolder(const char* subfolder, bool modFolder, const uint32 tag) +void CLevelSystem::ScanFolder(const char* subfolder, bool modFolder) { - string folder; + AZStd::string folder; if (subfolder && subfolder[0]) { folder = subfolder; } - string search(m_levelsFolder); + AZStd::string search(m_levelsFolder); if (!folder.empty()) { if (AZ::StringFunc::StartsWith(folder.c_str(), m_levelsFolder.c_str())) @@ -427,7 +309,7 @@ void CLevelSystem::ScanFolder(const char* subfolder, bool modFolder, const uint3 } else { - search += string("/") + folder; + search += "/" + folder; } } search += "/*"; @@ -453,12 +335,13 @@ void CLevelSystem::ScanFolder(const char* subfolder, bool modFolder, const uint3 AZ::StringFunc::Path::Split(handle.m_filename.data(), nullptr, nullptr, &levelName, &extension); if (extension == ArchiveExtension) { - if (AZ::StringFunc::Equal(handle.m_filename.data(), ILevelSystem::LevelPakName) || AZ::StringFunc::Equal(handle.m_filename.data(), TerrarinTexturePakName)) + if (AZ::StringFunc::Equal(handle.m_filename.data(), LevelPakName)) { - // level folder contain pak files like 'level.pak' and 'terraintexture.pak' + // level folder contain pak files like 'level.pak' // which we only want to load during level loading. continue; } + AZStd::string levelContainerPakPath; AZ::StringFunc::Path::Join("@assets@", m_levelsFolder.c_str(), levelContainerPakPath); if (subfolder && subfolder[0]) @@ -482,101 +365,93 @@ void CLevelSystem::ScanFolder(const char* subfolder, bool modFolder, const uint3 } // Levels in bundles now take priority over levels outside of bundles. - PopulateLevels(search, folder, pPak, modFolder, tag, false); + PopulateLevels(search, folder, pPak, modFolder, false); // Load levels outside of the bundles to maintain backward compatibility. - PopulateLevels(search, folder, pPak, modFolder, tag, true); + PopulateLevels(search, folder, pPak, modFolder, true); } -void CLevelSystem::PopulateLevels(string searchPattern, string& folder, AZ::IO::IArchive* pPak, bool& modFolder, const uint32& tag, bool fromFileSystemOnly) +void CLevelSystem::PopulateLevels( + AZStd::string searchPattern, AZStd::string& folder, AZ::IO::IArchive* pPak, bool& modFolder, bool fromFileSystemOnly) { - // allow this find first to actually touch the file system - // (causes small overhead but with minimal amount of levels this should only be around 150ms on actual DVD Emu) - AZ::IO::ArchiveFileIterator handle = pPak->FindFirst(searchPattern.c_str(), 0, fromFileSystemOnly); - - if (handle) { - do + // allow this find first to actually touch the file system + // (causes small overhead but with minimal amount of levels this should only be around 150ms on actual DVD Emu) + AZ::IO::ArchiveFileIterator handle = pPak->FindFirst(searchPattern.c_str(), 0, fromFileSystemOnly); + + if (handle) { - if ((handle.m_fileDesc.nAttrib & AZ::IO::FileDesc::Attribute::Subdirectory) != AZ::IO::FileDesc::Attribute::Subdirectory || handle.m_filename == "." || handle.m_filename == "..") + do { - continue; - } + if ((handle.m_fileDesc.nAttrib & AZ::IO::FileDesc::Attribute::Subdirectory) != AZ::IO::FileDesc::Attribute::Subdirectory || + handle.m_filename == "." || handle.m_filename == "..") + { + continue; + } - string levelFolder; - if (fromFileSystemOnly) - { - levelFolder = (folder.empty() ? "" : (folder + "/")) + string(handle.m_filename.data(), handle.m_filename.size()); - } - else - { - AZStd::string levelName = AZ::IO::PathView(handle.m_filename).Filename().Native(); - levelFolder = (folder.empty() ? "" : (folder + "/")) + string(levelName.c_str()); - } + AZStd::string levelFolder; + if (fromFileSystemOnly) + { + levelFolder = + (folder.empty() ? "" : (folder + "/")) + AZStd::string(handle.m_filename.data(), handle.m_filename.size()); + } + else + { + AZStd::string levelName(AZ::IO::PathView(handle.m_filename).Filename().Native()); + levelFolder = (folder.empty() ? "" : (folder + "/")) + levelName; + } - string levelPath; - if (AZ::StringFunc::StartsWith(levelFolder.c_str(), m_levelsFolder.c_str())) - { - levelPath = levelFolder; - } - else - { - levelPath = m_levelsFolder + "/" + levelFolder; - } - string paks = levelPath + string("/*.pak"); + AZStd::string levelPath; + if (AZ::StringFunc::StartsWith(levelFolder.c_str(), m_levelsFolder.c_str())) + { + levelPath = levelFolder; + } + else + { + levelPath = m_levelsFolder + "/" + levelFolder; + } - const string levelPakName = levelPath + "/level.pak"; - const string levelInfoName = levelPath + "/levelinfo.xml"; + const AZStd::string levelPakName = levelPath + "/" + LevelPakName; + const AZStd::string levelInfoName = levelPath + "/levelinfo.xml"; - if (!pPak->IsFileExist(levelPakName.c_str(), fromFileSystemOnly ? AZ::IO::IArchive::eFileLocation_OnDisk : AZ::IO::IArchive::eFileLocation_InPak) && !pPak->IsFileExist(levelInfoName.c_str(), fromFileSystemOnly ? AZ::IO::IArchive::eFileLocation_OnDisk : AZ::IO::IArchive::eFileLocation_InPak)) - { - ScanFolder(levelFolder.c_str(), modFolder, tag); - continue; - } + if (!pPak->IsFileExist( + levelPakName.c_str(), + fromFileSystemOnly ? AZ::IO::IArchive::eFileLocation_OnDisk : AZ::IO::IArchive::eFileLocation_InPak) && + !pPak->IsFileExist( + levelInfoName.c_str(), + fromFileSystemOnly ? AZ::IO::IArchive::eFileLocation_OnDisk : AZ::IO::IArchive::eFileLocation_InPak)) + { + ScanFolder(levelFolder.c_str(), modFolder); + continue; + } - CLevelInfo levelInfo; - levelInfo.m_levelPath = levelPath; - levelInfo.m_levelPaks = paks; - levelInfo.m_levelName = levelFolder; - levelInfo.m_levelName = UnifyName(levelInfo.m_levelName); - levelInfo.m_isModLevel = modFolder; - levelInfo.m_scanTag = tag; - levelInfo.m_levelTag = ILevelSystem::TAG_UNKNOWN; - levelInfo.m_isPak = !fromFileSystemOnly; - - SwapEndian(levelInfo.m_scanTag, eBigEndian); - SwapEndian(levelInfo.m_levelTag, eBigEndian); - - CLevelInfo* pExistingInfo = GetLevelInfoInternal(levelInfo.m_levelName); - if (pExistingInfo && pExistingInfo->MetadataLoaded() == false) - { - //Reload metadata if it failed to load - pExistingInfo->ReadMetaData(); - } + // With the level.pak workflow, levelPath and levelName will point to a directory. + // levelPath: levels/mylevel + // levelName: mylevel + CLevelInfo levelInfo; + levelInfo.m_levelPath = levelPath; + levelInfo.m_levelName = levelFolder; + levelInfo.m_isPak = !fromFileSystemOnly; - // Don't add the level if it is already in the list - if (pExistingInfo == NULL) - { - levelInfo.ReadMetaData(); + CLevelInfo* pExistingInfo = GetLevelInfoInternal(levelInfo.m_levelName); - m_levelInfos.push_back(levelInfo); - } - else - { - // Levels in bundles take priority over levels outside bundles. - if (!pExistingInfo->m_isPak && levelInfo.m_isPak) + // Don't add the level if it is already in the list + if (pExistingInfo == NULL) { - *pExistingInfo = levelInfo; + m_levelInfos.push_back(levelInfo); } else { - // Update the scan tag - pExistingInfo->m_scanTag = tag; + // Levels in bundles take priority over levels outside bundles. + if (!pExistingInfo->m_isPak && levelInfo.m_isPak) + { + *pExistingInfo = levelInfo; + } } - } - } while (handle = pPak->FindNext(handle)); + } while (handle = pPak->FindNext(handle)); - pPak->FindClose(handle); + pPak->FindClose(handle); + } } } @@ -610,34 +485,36 @@ ILevelInfo* CLevelSystem::GetLevelInfo(const char* levelName) } //------------------------------------------------------------------------ -CLevelInfo* CLevelSystem::GetLevelInfoInternal(const char* levelName) +CLevelInfo* CLevelSystem::GetLevelInfoInternal(const AZStd::string& levelName) { // If level not found by full name try comparing with only filename - for (std::vector::iterator it = m_levelInfos.begin(); it != m_levelInfos.end(); ++it) + for (AZStd::vector::iterator it = m_levelInfos.begin(); it != m_levelInfos.end(); ++it) { - if (!azstricmp(it->GetName(), levelName)) + if (!azstricmp(it->GetName(), levelName.c_str())) { return &(*it); } } ////////////////////////////////////////////////////////////////////////// - for (std::vector::iterator it = m_levelInfos.begin(); it != m_levelInfos.end(); ++it) + for (AZStd::vector::iterator it = m_levelInfos.begin(); it != m_levelInfos.end(); ++it) { - if (!azstricmp(PathUtil::GetFileName(it->GetName()), levelName)) { - return &(*it); + if (!azstricmp(PathUtil::GetFileName(it->GetName()), levelName.c_str())) + { + return &(*it); + } } } // Try stripping out the folder to find the raw filename - string sLevelName(levelName); + AZStd::string sLevelName(levelName); size_t lastSlash = sLevelName.find_last_of('\\'); - if (lastSlash == string::npos) + if (lastSlash == AZStd::string::npos) { lastSlash = sLevelName.find_last_of('/'); } - if (lastSlash != string::npos) + if (lastSlash != AZStd::string::npos) { sLevelName = sLevelName.substr(lastSlash + 1, sLevelName.size() - lastSlash - 1); return GetLevelInfoInternal(sLevelName.c_str()); @@ -649,7 +526,7 @@ CLevelInfo* CLevelSystem::GetLevelInfoInternal(const char* levelName) //------------------------------------------------------------------------ void CLevelSystem::AddListener(ILevelSystemListener* pListener) { - std::vector::iterator it = std::find(m_listeners.begin(), m_listeners.end(), pListener); + AZStd::vector::iterator it = AZStd::find(m_listeners.begin(), m_listeners.end(), pListener); if (it == m_listeners.end()) { @@ -661,7 +538,7 @@ void CLevelSystem::AddListener(ILevelSystemListener* pListener) //------------------------------------------------------------------------ void CLevelSystem::RemoveListener(ILevelSystemListener* pListener) { - std::vector::iterator it = std::find(m_listeners.begin(), m_listeners.end(), pListener); + AZStd::vector::iterator it = AZStd::find(m_listeners.begin(), m_listeners.end(), pListener); if (it != m_listeners.end()) { @@ -669,18 +546,24 @@ void CLevelSystem::RemoveListener(ILevelSystemListener* pListener) if (m_listeners.empty()) { - stl::free_container(m_listeners); + m_listeners.shrink_to_fit(); } } } //------------------------------------------------------------------------ -ILevel* CLevelSystem::LoadLevel(const char* _levelName) +bool CLevelSystem::LoadLevel(const char* _levelName) { if (gEnv->IsEditor()) { AZ_TracePrintf("CrySystem::CLevelSystem", "LoadLevel for %s was called in the editor - not actually loading.\n", _levelName); - return nullptr; + return false; + } + + // If a level is currently loaded, unload it before loading the next one. + if (IsLevelLoaded()) + { + UnloadLevel(); } gEnv->pSystem->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_PREPARE, 0, 0); @@ -689,10 +572,10 @@ ILevel* CLevelSystem::LoadLevel(const char* _levelName) ILevel* level = LoadLevelInternal(_levelName); if (level) { - OnLoadingComplete(level); + OnLoadingComplete(_levelName); } - return level; + return (level != nullptr); } //------------------------------------------------------------------------ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName) @@ -724,7 +607,7 @@ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName) m_bLevelLoaded = false; - const bool bLoadingSameLevel = m_lastLevelName.compareNoCase(levelName) == 0; + const bool bLoadingSameLevel = azstricmp(m_lastLevelName.c_str(), levelName) == 0; m_lastLevelName = levelName; delete m_pCurrentLevel; @@ -736,7 +619,7 @@ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName) // Read main level info. if (!pLevelInfo->ReadInfo()) { - OnLoadingError(pLevelInfo, "Failed to read level info (level.pak might be corrupted)!"); + OnLoadingError(levelName, "Failed to read level info (level.pak might be corrupted)!"); return 0; } //[AlexMcC|19.04.10]: Update the level's LevelInfo @@ -762,12 +645,12 @@ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName) m_pSystem->SetViewCamera(defaultCam); m_pLoadingLevelInfo = pLevelInfo; - OnLoadingStart(pLevelInfo); + OnLoadingStart(levelName); auto pPak = gEnv->pCryPak; - string levelPath = pLevelInfo->GetPath(); + AZStd::string levelPath(pLevelInfo->GetPath()); /* ICVar *pFileCache = gEnv->pConsole->GetCVar("sys_FileCache"); CRY_ASSERT(pFileCache); @@ -793,20 +676,20 @@ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName) if (gEnv->p3DEngine) { - bool is3DEngineLoaded = gEnv->IsEditor() ? gEnv->p3DEngine->InitLevelForEditor(pLevelInfo->GetPath(), pLevelInfo->GetDefaultGameType()->name) - : gEnv->p3DEngine->LoadLevel(pLevelInfo->GetPath(), pLevelInfo->GetDefaultGameType()->name); + bool is3DEngineLoaded = gEnv->IsEditor() ? gEnv->p3DEngine->InitLevelForEditor(pLevelInfo->GetPath(), pLevelInfo->m_defaultGameTypeName.c_str()) + : gEnv->p3DEngine->LoadLevel(pLevelInfo->GetPath(), pLevelInfo->m_defaultGameTypeName.c_str()); if (!is3DEngineLoaded) { - OnLoadingError(pLevelInfo, "3DEngine failed to handle loading the level"); + OnLoadingError(levelName, "3DEngine failed to handle loading the level"); return 0; } } // Parse level specific config data. - string const sLevelNameOnly = PathUtil::GetFileName(levelName); + AZStd::string const sLevelNameOnly(PathUtil::GetFileName(levelName)); - if (!sLevelNameOnly.empty() && sLevelNameOnly.compareNoCase("Untitled") != 0) + if (!sLevelNameOnly.empty()) { const char* controlsPath = nullptr; Audio::AudioSystemRequestBus::BroadcastResult(controlsPath, &Audio::AudioSystemRequestBus::Events::GetControlsPath); @@ -838,22 +721,29 @@ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName) } } - string missionXml = pLevelInfo->GetDefaultGameType()->xmlFile; - string xmlFile = string(pLevelInfo->GetPath()) + "/" + missionXml; - - if (!gEnv->IsEditor()) { - AZStd::string entitiesFilename = AZStd::string::format("%s/%s.entities_xml", pLevelInfo->GetPath(), pLevelInfo->GetDefaultGameType()->name.c_str()); - AZStd::vector fileBuffer; - CCryFile entitiesFile; - if (entitiesFile.Open(entitiesFilename.c_str(), "rt")) + AZStd::string missionXml("Mission_"); + missionXml += pLevelInfo->m_defaultGameTypeName; + missionXml += ".xml"; + AZStd::string xmlFile(pLevelInfo->GetPath()); + xmlFile += "/"; + xmlFile += missionXml; + + if (!gEnv->IsEditor()) { - fileBuffer.resize(entitiesFile.GetLength()); - - if (fileBuffer.size() == entitiesFile.ReadRaw(fileBuffer.begin(), fileBuffer.size())) + AZStd::string entitiesFilename = + AZStd::string::format("%s/%s.entities_xml", pLevelInfo->GetPath(), pLevelInfo->m_defaultGameTypeName.c_str()); + AZStd::vector fileBuffer; + CCryFile entitiesFile; + if (entitiesFile.Open(entitiesFilename.c_str(), "rt")) { - AZ::IO::ByteContainerStream > fileStream(&fileBuffer); - EBUS_EVENT(AzFramework::GameEntityContextRequestBus, LoadFromStream, fileStream, false); + fileBuffer.resize(entitiesFile.GetLength()); + + if (fileBuffer.size() == entitiesFile.ReadRaw(fileBuffer.begin(), fileBuffer.size())) + { + AZ::IO::ByteContainerStream> fileStream(&fileBuffer); + EBUS_EVENT(AzFramework::GameEntityContextRequestBus, LoadFromStream, fileStream, false); + } } } } @@ -907,33 +797,6 @@ ILevel* CLevelSystem::LoadLevelInternal(const char* _levelName) return m_pCurrentLevel; } -//------------------------------------------------------------------------ -ILevel* CLevelSystem::SetEditorLoadedLevel(const char* levelName, bool bReadLevelInfoMetaData) -{ - CLevelInfo* pLevelInfo = GetLevelInfoInternal(levelName); - - if (!pLevelInfo) - { - gEnv->pLog->LogError("Failed to get level info for level %s!", levelName); - return 0; - } - - if (bReadLevelInfoMetaData) - { - pLevelInfo->ReadMetaData(); - } - - m_lastLevelName = levelName; - - SAFE_DELETE(m_pCurrentLevel); - CLevel* pLevel = new CLevel(); - pLevel->m_levelInfo = *pLevelInfo; - m_pCurrentLevel = pLevel; - m_bLevelLoaded = true; - - return m_pCurrentLevel; -} - //------------------------------------------------------------------------ void CLevelSystem::PrepareNextLevel(const char* levelName) { @@ -954,56 +817,52 @@ void CLevelSystem::PrepareNextLevel(const char* levelName) pLevelInfo->OpenLevelPak(); // switched to level heap, so now imm start the loading screen (renderer will be reinitialized in the levelheap) - gEnv->pSystem->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_START_LOADINGSCREEN, (UINT_PTR)pLevelInfo, 0); + gEnv->pSystem->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_START_LOADINGSCREEN, 0, 0); gEnv->pSystem->SetSystemGlobalState(ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_PREPARE); // Inform resource manager about loading of the new level. GetISystem()->GetIResourceManager()->PrepareLevel(pLevelInfo->GetPath(), pLevelInfo->GetName()); } - for (std::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) + for (AZStd::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { - (*it)->OnPrepareNextLevel(pLevelInfo); + (*it)->OnPrepareNextLevel(pLevelInfo->GetName()); } } //------------------------------------------------------------------------ void CLevelSystem::OnLevelNotFound(const char* levelName) { - for (std::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) + for (AZStd::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { (*it)->OnLevelNotFound(levelName); } } //------------------------------------------------------------------------ -void CLevelSystem::OnLoadingStart(ILevelInfo* pLevelInfo) +void CLevelSystem::OnLoadingStart(const char* levelName) { if (gEnv->pCryPak->GetRecordFileOpenList() == AZ::IO::IArchive::RFOM_EngineStartup) { gEnv->pCryPak->RecordFileOpen(AZ::IO::IArchive::RFOM_Level); } - m_fFilteredProgress = 0.f; m_fLastTime = gEnv->pTimer->GetAsyncCurTime(); GetISystem()->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_START, 0, 0); LOADING_TIME_PROFILE_SECTION(gEnv->pSystem); - for (std::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) + for (AZStd::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { - (*it)->OnLoadingStart(pLevelInfo); + (*it)->OnLoadingStart(levelName); } } //------------------------------------------------------------------------ -void CLevelSystem::OnLoadingError(ILevelInfo* pLevelInfo, const char* error) +void CLevelSystem::OnLoadingError(const char* levelName, const char* error) { - if (!pLevelInfo) - { - pLevelInfo = m_pLoadingLevelInfo; - } + ILevelInfo* pLevelInfo = m_pLoadingLevelInfo; if (!pLevelInfo) { CRY_ASSERT(false); @@ -1015,25 +874,17 @@ void CLevelSystem::OnLoadingError(ILevelInfo* pLevelInfo, const char* error) gEnv->pRenderer->SetTexturePrecaching(false); } - for (std::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) + for (AZStd::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { - (*it)->OnLoadingError(pLevelInfo, error); + (*it)->OnLoadingError(levelName, error); } ((CLevelInfo*)pLevelInfo)->CloseLevelPak(); } //------------------------------------------------------------------------ -void CLevelSystem::OnLoadingComplete(ILevel* pLevelInfo) +void CLevelSystem::OnLoadingComplete(const char* levelName) { - if (m_bRecordingFileOpens) - { - // Stop recoding file opens. - gEnv->pCryPak->RecordFileOpen(AZ::IO::IArchive::RFOM_Disabled); - // Save recorded list. - SaveOpenedFilesList(); - } - CTimeValue t = gEnv->pTimer->GetAsyncTime(); m_fLastLevelLoadTime = (t - m_levelLoadStartTime).GetSeconds(); @@ -1044,9 +895,9 @@ void CLevelSystem::OnLoadingComplete(ILevel* pLevelInfo) // Hide console after loading. gEnv->pConsole->ShowConsole(false); - for (std::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) + for (AZStd::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { - (*it)->OnLoadingComplete(pLevelInfo); + (*it)->OnLoadingComplete(levelName); } #if AZ_LOADSCREENCOMPONENT_ENABLED @@ -1055,32 +906,23 @@ void CLevelSystem::OnLoadingComplete(ILevel* pLevelInfo) } //------------------------------------------------------------------------ -void CLevelSystem::OnLoadingProgress(ILevelInfo* pLevel, int progressAmount) +void CLevelSystem::OnLoadingProgress(const char* levelName, int progressAmount) { - for (std::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) + for (AZStd::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { - (*it)->OnLoadingProgress(pLevel, progressAmount); + (*it)->OnLoadingProgress(levelName, progressAmount); } } //------------------------------------------------------------------------ -void CLevelSystem::OnUnloadComplete(ILevel* pLevel) +void CLevelSystem::OnUnloadComplete(const char* levelName) { - for (std::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) + for (AZStd::vector::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { - (*it)->OnUnloadComplete(pLevel); + (*it)->OnUnloadComplete(levelName); } } -//------------------------------------------------------------------------ -string& CLevelSystem::UnifyName(string& name) -{ - //name.MakeLower(); - name.replace('\\', '/'); - - return name; -} - ////////////////////////////////////////////////////////////////////////// void CLevelSystem::LogLoadingTime() { @@ -1103,8 +945,8 @@ void CLevelSystem::LogLoadingTime() sChain = " (Chained)"; } - string text; - text.Format("Game Level Load Time: [%s] Level %s loaded in %.2f seconds%s", vers, m_lastLevelName.c_str(), m_fLastLevelLoadTime, sChain); + AZStd::string text; + text.format("Game Level Load Time: [%s] Level %s loaded in %.2f seconds%s", vers, m_lastLevelName.c_str(), m_fLastLevelLoadTime, sChain); gEnv->pLog->Log(text.c_str()); } @@ -1116,77 +958,8 @@ void CLevelSystem::GetMemoryUsage(ICrySizer* pSizer) const pSizer->AddObject(m_listeners); } -void CLevelInfo::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->AddObject(m_levelName); - pSizer->AddObject(m_levelPath); - pSizer->AddObject(m_levelPaks); - //pSizer->AddObject(m_musicLibs); - pSizer->AddObject(m_gamerules); - pSizer->AddObject(m_gameTypes); -} - - -////////////////////////////////////////////////////////////////////////// -bool CLevelInfo::OpenLevelPak() -{ - LOADING_TIME_PROFILE_SECTION; - - string levelpak = m_levelPath + string("/level.pak"); - AZStd::fixed_string fullLevelPakPath; - bool bOk = gEnv->pCryPak->OpenPack(levelpak.c_str(), m_isPak ? AZ::IO::IArchive::FLAGS_LEVEL_PAK_INSIDE_PAK : (unsigned)0, NULL, &fullLevelPakPath, false); - m_levelPakFullPath.assign(fullLevelPakPath.c_str()); - return bOk; -} - ////////////////////////////////////////////////////////////////////////// -void CLevelInfo::CloseLevelPak() -{ - LOADING_TIME_PROFILE_SECTION; - if (!m_levelPakFullPath.empty()) - { - gEnv->pCryPak->ClosePack(m_levelPakFullPath.c_str(), AZ::IO::IArchive::FLAGS_PATH_REAL); - stl::free_container(m_levelPakFullPath); - } -} - -const bool CLevelInfo::IsOfType(const char* sType) const -{ - for (unsigned int i = 0; i < m_levelTypeList.size(); ++i) - { - if (strcmp(m_levelTypeList[i], sType) == 0) - { - return true; - } - } - - return false; -} - -////////////////////////////////////////////////////////////////////////// -void CLevelSystem::SaveOpenedFilesList() -{ - if (!m_pLoadingLevelInfo) - { - return; - } - - // Write resource list to file. - string filename = PathUtil::Make(m_pLoadingLevelInfo->GetPath(), "resourcelist.txt"); - AZ::IO::HandleType fileHandle = fxopen(filename.c_str(), "wt", true); - if (fileHandle != AZ::IO::InvalidHandle) - { - auto pResList = gEnv->pCryPak->GetResourceList(AZ::IO::IArchive::RFOM_Level); - for (const char* fname = pResList->GetFirst(); fname; fname = pResList->GetNext()) - { - AZ::IO::Print(fileHandle, "%s\n", fname); - } - gEnv->pFileIO->Close(fileHandle); - } -} - -////////////////////////////////////////////////////////////////////////// -void CLevelSystem::UnLoadLevel() +void CLevelSystem::UnloadLevel() { if (gEnv->IsEditor()) { @@ -1197,7 +970,7 @@ void CLevelSystem::UnLoadLevel() return; } - CryLog("UnLoadLevel Start"); + CryLog("UnloadLevel Start"); INDENT_LOG_DURING_SCOPE(); // Flush core buses. We're about to unload Cry modules and need to ensure we don't have module-owned functions left behind. @@ -1286,7 +1059,7 @@ void CLevelSystem::UnLoadLevel() CCamera defaultCam; m_pSystem->SetViewCamera(defaultCam); - OnUnloadComplete(m_pCurrentLevel); + OnUnloadComplete(m_lastLevelName.c_str()); // -- kenzo: this will close all pack files for this level // (even the ones which were not added through here, if this is not desired, @@ -1297,7 +1070,7 @@ void CLevelSystem::UnLoadLevel() m_pLoadingLevelInfo = NULL; } - stl::free_container(m_lastLevelName); + m_lastLevelName.clear(); GetISystem()->GetIResourceManager()->UnloadLevel(); @@ -1352,7 +1125,7 @@ void CLevelSystem::UnLoadLevel() m_bLevelLoaded = false; CTimeValue tUnloadTime = gEnv->pTimer->GetAsyncTime() - tBegin; - CryLog("UnLoadLevel End: %.1f sec", tUnloadTime.GetSeconds()); + CryLog("UnloadLevel End: %.1f sec", tUnloadTime.GetSeconds()); // Must be sent last. // Cleanup all containers @@ -1360,9 +1133,4 @@ void CLevelSystem::UnLoadLevel() AzFramework::InputChannelRequestBus::Broadcast(&AzFramework::InputChannelRequests::ResetState); } -DynArray* CLevelSystem::GetLevelTypeList() -{ - return &m_levelTypeList; -} - } // namespace LegacyLevelSystem diff --git a/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.h b/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.h index ba39b41df0..2b3f454da5 100644 --- a/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.h +++ b/Code/CryEngine/CrySystem/LevelSystem/LevelSystem.h @@ -16,6 +16,8 @@ #include "ILevelSystem.h" #include +// [LYN-2376] Remove the entire file once legacy slice support is removed + namespace LegacyLevelSystem { @@ -24,75 +26,38 @@ class CLevelInfo { friend class CLevelSystem; public: - CLevelInfo() - : m_heightmapSize(0) - , m_bMetaDataRead(false) - , m_isModLevel(false) - , m_scanTag(ILevelSystem::TAG_UNKNOWN) - , m_levelTag(ILevelSystem::TAG_UNKNOWN) - { - SwapEndian(m_scanTag, eBigEndian); - SwapEndian(m_levelTag, eBigEndian); - }; + CLevelInfo() = default; // ILevelInfo - virtual const char* GetName() const { return m_levelName.c_str(); }; - virtual const bool IsOfType(const char* sType) const; - virtual const char* GetPath() const { return m_levelPath.c_str(); }; - virtual const char* GetPaks() const { return m_levelPaks.c_str(); }; - virtual bool GetIsModLevel() const { return m_isModLevel; } - virtual const uint32 GetScanTag() const { return m_scanTag; } - virtual const uint32 GetLevelTag() const { return m_levelTag; } - virtual const char* GetDisplayName() const; - virtual const char* GetPreviewImagePath() const { return m_previewImagePath.c_str(); } - virtual const char* GetBackgroundImagePath() const { return m_backgroundImagePath.c_str(); } - virtual const char* GetMinimapImagePath() const {return m_minimapImagePath.c_str(); } - //virtual const ILevelInfo::TStringVec& GetMusicLibs() const { return m_musicLibs; }; // Gets reintroduced when level specific music data loading is implemented. - virtual const bool MetadataLoaded() const { return m_bMetaDataRead; } - - virtual int GetGameTypeCount() const { return m_gameTypes.size(); }; - virtual const ILevelInfo::TGameTypeInfo* GetGameType(int gameType) const { return &m_gameTypes[gameType]; }; - virtual bool SupportsGameType(const char* gameTypeName) const; - virtual const ILevelInfo::TGameTypeInfo* GetDefaultGameType() const; - virtual bool HasGameRules() const{ return !m_gamerules.empty(); } - - virtual const ILevelInfo::SMinimapInfo& GetMinimapInfo() const { return m_minimapInfo; } - - virtual const char* GetDefaultGameRules() const{ return m_gamerules.empty() ? NULL : m_gamerules[0].c_str(); } - virtual ILevelInfo::TStringVec GetGameRules() const{ return m_gamerules; } + virtual const char* GetName() const { return m_levelName.c_str(); } + virtual const char* GetPath() const { return m_levelPath.c_str(); } + virtual const char* GetAssetName() const { return m_levelAssetName.c_str(); } // ~ILevelInfo void GetMemoryUsage(ICrySizer*) const; private: - void ReadMetaData(); bool ReadInfo(); bool OpenLevelPak(); void CloseLevelPak(); - string m_levelName; - string m_levelPath; - string m_levelPaks; - string m_levelDisplayName; - string m_previewImagePath; - string m_backgroundImagePath; - string m_minimapImagePath; - - string m_levelPakFullPath; - - TStringVec m_gamerules; - int m_heightmapSize; - uint32 m_scanTag; - uint32 m_levelTag; - bool m_bMetaDataRead; - std::vector m_gameTypes; - bool m_isModLevel; - SMinimapInfo m_minimapInfo; - - DynArray m_levelTypeList; - bool m_isPak = false; + AZStd::string m_defaultGameTypeName; + AZStd::string m_levelName; + AZStd::string m_levelPath; + AZStd::string m_levelAssetName; + + AZStd::string m_levelPakFullPath; + + bool m_isPak = false; +}; + +struct ILevel +{ + virtual ~ILevel() = default; + virtual void Release() = 0; + virtual ILevelInfo* GetLevelInfo() = 0; }; class CLevel @@ -121,10 +86,7 @@ public: void Release() { delete this; }; // ILevelSystem - virtual DynArray* GetLevelTypeList(); - virtual void Rescan(const char* levelsFolder, const uint32 tag); - void ScanFolder(const char* subfolder, bool modFolder, const uint32 tag) override; - void PopulateLevels(string searchPattern, string& folder, AZ::IO::IArchive* pPak, bool& modFolder, const uint32& tag, bool fromFileSystemOnly) override; + virtual void Rescan(const char* levelsFolder); virtual int GetLevelCount(); virtual ILevelInfo* GetLevelInfo(int level); virtual ILevelInfo* GetLevelInfo(const char* levelName); @@ -132,74 +94,81 @@ public: virtual void AddListener(ILevelSystemListener* pListener); virtual void RemoveListener(ILevelSystemListener* pListener); - virtual ILevel* GetCurrentLevel() const { return m_pCurrentLevel; } - virtual ILevel* LoadLevel(const char* levelName); - virtual void UnLoadLevel(); - virtual ILevel* SetEditorLoadedLevel(const char* levelName, bool bReadLevelInfoMetaData = false); - virtual void PrepareNextLevel(const char* levelName); - virtual float GetLastLevelLoadTime() { return m_fLastLevelLoadTime; }; + virtual bool LoadLevel(const char* levelName); + virtual void UnloadLevel(); virtual bool IsLevelLoaded() { return m_bLevelLoaded; } + const char* GetCurrentLevelName() const override + { + if (m_pCurrentLevel && m_pCurrentLevel->GetLevelInfo()) + { + return m_pCurrentLevel->GetLevelInfo()->GetName(); + } + else + { + return ""; + } + } // If the level load failed then we need to have a different shutdown procedure vs when a level is naturally unloaded virtual void SetLevelLoadFailed(bool loadFailed) { m_levelLoadFailed = loadFailed; } virtual bool GetLevelLoadFailed() { return m_levelLoadFailed; } + // Unsupported by legacy level system. + virtual AZ::Data::AssetType GetLevelAssetType() const { return {}; } + // ~ILevelSystem void GetMemoryUsage(ICrySizer* s) const; - void SaveOpenedFilesList(); - private: + float GetLastLevelLoadTime() { return m_fLastLevelLoadTime; } + + void ScanFolder(const char* subfolder, bool modFolder); + void PopulateLevels( + AZStd::string searchPattern, AZStd::string& folder, AZ::IO::IArchive* pPak, bool& modFolder, bool fromFileSystemOnly); + void PrepareNextLevel(const char* levelName); ILevel* LoadLevelInternal(const char* _levelName); - // ILevelSystemListener events notification + // Methods to notify ILevelSystemListener void OnLevelNotFound(const char* levelName); - void OnLoadingStart(ILevelInfo* pLevel); - void OnLoadingComplete(ILevel* pLevel); - void OnLoadingError(ILevelInfo* pLevel, const char* error); - void OnLoadingProgress(ILevelInfo* pLevel, int progressAmount); - void OnUnloadComplete(ILevel* pLevel); - - // lowercase string and replace backslashes with forward slashes - // TODO: move this to a more general place in CryEngine - string& UnifyName(string& name); + void OnLoadingStart(const char* levelName); + void OnLoadingComplete(const char* levelName); + void OnLoadingError(const char* levelName, const char* error); + void OnLoadingProgress(const char* levelName, int progressAmount); + void OnUnloadComplete(const char* levelName); + void LogLoadingTime(); bool LoadLevelInfo(CLevelInfo& levelInfo); // internal get functions for the level infos ... they preserve the type and don't // directly cast to the interface CLevelInfo* GetLevelInfoInternal(int level); - CLevelInfo* GetLevelInfoInternal(const char* levelName); + CLevelInfo* GetLevelInfoInternal(const AZStd::string& levelName); ISystem* m_pSystem; - std::vector m_levelInfos; - string m_levelsFolder; + AZStd::vector m_levelInfos; + AZStd::string m_levelsFolder; ILevel* m_pCurrentLevel; ILevelInfo* m_pLoadingLevelInfo; - string m_lastLevelName; + AZStd::string m_lastLevelName; float m_fLastLevelLoadTime; - float m_fFilteredProgress; float m_fLastTime; bool m_bLevelLoaded; - bool m_bRecordingFileOpens; bool m_levelLoadFailed = false; int m_nLoadedLevelsCount; CTimeValue m_levelLoadStartTime; - static int s_loadCount; - - std::vector m_listeners; - - DynArray m_levelTypeList; + AZStd::vector m_listeners; AZ::IO::IArchive::LevelPackOpenEvent::Handler m_levelPackOpenHandler; AZ::IO::IArchive::LevelPackCloseEvent::Handler m_levelPackCloseHandler; + + static constexpr const char* LevelPakName = "level.pak"; }; } // namespace LegacyLevelSystem diff --git a/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.cpp b/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.cpp new file mode 100644 index 0000000000..a09eba37b8 --- /dev/null +++ b/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.cpp @@ -0,0 +1,709 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "CrySystem_precompiled.h" +#include "SpawnableLevelSystem.h" +#include +#include "IMovieSystem.h" +#include +#include "IDeferredCollisionEvent.h" + +#include + +#include +#include +#include +#include +#include + +#include "MainThreadRenderRequestBus.h" +#include +#include +#include +#include + +#include + +namespace LegacyLevelSystem +{ + //------------------------------------------------------------------------ + static void LoadLevel(const AZ::ConsoleCommandContainer& arguments) + { + AZ_Error("SpawnableLevelSystem", arguments.empty(), "LoadLevel requires a level file name to be provided."); + AZ_Error("SpawnableLevelSystem", arguments.size() > 1, "LoadLevel requires a single level file name to be provided."); + + if (!arguments.empty() && gEnv->pSystem && gEnv->pSystem->GetILevelSystem() && !gEnv->IsEditor()) + { + gEnv->pSystem->GetILevelSystem()->LoadLevel(arguments[0].data()); + } + } + + //------------------------------------------------------------------------ + static void UnloadLevel([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments) + { + AZ_Warning("SpawnableLevelSystem", !arguments.empty(), "UnloadLevel doesn't use any arguments."); + + if (gEnv->pSystem && gEnv->pSystem->GetILevelSystem() && !gEnv->IsEditor()) + { + gEnv->pSystem->GetILevelSystem()->UnloadLevel(); + if (gEnv->p3DEngine) + { + gEnv->p3DEngine->LoadEmptyLevel(); + } + } + } + + AZ_CONSOLEFREEFUNC(LoadLevel, AZ::ConsoleFunctorFlags::Null, "Unloads the current level and loads a new one with the given asset name"); + AZ_CONSOLEFREEFUNC(UnloadLevel, AZ::ConsoleFunctorFlags::Null, "Unloads the current level"); + + //------------------------------------------------------------------------ + SpawnableLevelSystem::SpawnableLevelSystem(ISystem* pSystem) + : m_pSystem(pSystem) + { + LOADING_TIME_PROFILE_SECTION; + CRY_ASSERT(pSystem); + + m_fLastLevelLoadTime = 0; + m_fLastTime = 0; + m_bLevelLoaded = false; + + m_levelLoadStartTime.SetValue(0); + m_nLoadedLevelsCount = 0; + + AZ_Assert(gEnv && gEnv->pCryPak, "gEnv and CryPak must be initialized for loading levels."); + if (!gEnv || !gEnv->pCryPak) + { + return; + } + auto pPak = gEnv->pCryPak; + + AzFramework::RootSpawnableNotificationBus::Handler::BusConnect(); + } + + //------------------------------------------------------------------------ + SpawnableLevelSystem::~SpawnableLevelSystem() + { + AzFramework::RootSpawnableNotificationBus::Handler::BusDisconnect(); + } + + void SpawnableLevelSystem::Release() + { + delete this; + } + + bool SpawnableLevelSystem::IsLevelLoaded() + { + return m_bLevelLoaded; + } + + const char* SpawnableLevelSystem::GetCurrentLevelName() const + { + return m_bLevelLoaded ? m_lastLevelName.c_str() : ""; + } + + // If the level load failed then we need to have a different shutdown procedure vs when a level is naturally unloaded + void SpawnableLevelSystem::SetLevelLoadFailed(bool loadFailed) + { + m_levelLoadFailed = loadFailed; + } + + bool SpawnableLevelSystem::GetLevelLoadFailed() + { + return m_levelLoadFailed; + } + + AZ::Data::AssetType SpawnableLevelSystem::GetLevelAssetType() const + { + return azrtti_typeid(); + } + + // The following methods are deprecated from ILevelSystem and will be removed once slice support is removed. + + // [LYN-2376] Remove once legacy slice support is removed + void SpawnableLevelSystem::Rescan([[maybe_unused]] const char* levelsFolder) + { + AZ_Assert(false, "Rescan - No longer supported."); + } + + // [LYN-2376] Remove once legacy slice support is removed + int SpawnableLevelSystem::GetLevelCount() + { + AZ_Assert(false, "GetLevelCount - No longer supported."); + return 0; + } + + // [LYN-2376] Remove once legacy slice support is removed + ILevelInfo* SpawnableLevelSystem::GetLevelInfo([[maybe_unused]] int level) + { + AZ_Assert(false, "GetLevelInfo - No longer supported."); + return nullptr; + } + + // [LYN-2376] Remove once legacy slice support is removed + ILevelInfo* SpawnableLevelSystem::GetLevelInfo([[maybe_unused]] const char* levelName) + { + AZ_Assert(false, "GetLevelInfo - No longer supported."); + return nullptr; + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::AddListener(ILevelSystemListener* pListener) + { + AZStd::vector::iterator it = AZStd::find(m_listeners.begin(), m_listeners.end(), pListener); + + if (it == m_listeners.end()) + { + m_listeners.push_back(pListener); + } + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::RemoveListener(ILevelSystemListener* pListener) + { + AZStd::vector::iterator it = AZStd::find(m_listeners.begin(), m_listeners.end(), pListener); + + if (it != m_listeners.end()) + { + m_listeners.erase(it); + } + } + + //------------------------------------------------------------------------ + bool SpawnableLevelSystem::LoadLevel(const char* levelName) + { + if (gEnv->IsEditor()) + { + AZ_TracePrintf("CrySystem::CLevelSystem", "LoadLevel for %s was called in the editor - not actually loading.\n", levelName); + return false; + } + + // If a level is currently loaded, unload it before loading the next one. + if (IsLevelLoaded()) + { + UnloadLevel(); + } + + gEnv->pSystem->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_PREPARE, 0, 0); + PrepareNextLevel(levelName); + + bool result = LoadLevelInternal(levelName); + if (result) + { + OnLoadingComplete(levelName); + } + + return result; + } + + //------------------------------------------------------------------------ + bool SpawnableLevelSystem::LoadLevelInternal(const char* levelName) + { + gEnv->pSystem->SetSystemGlobalState(ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START); + AZ_ASSET_NAMED_SCOPE("Level: %s", levelName); + + INDENT_LOG_DURING_SCOPE(); + + AZ::Data::AssetId rootSpawnableAssetId; + AZ::Data::AssetCatalogRequestBus::BroadcastResult( + rootSpawnableAssetId, &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, levelName, nullptr, false); + if (!rootSpawnableAssetId.IsValid()) + { + OnLoadingError(levelName, "AssetCatalog has no entry for the requested level."); + + return false; + } + + // This scope is specifically used for marking a loading time profile section + { + LOADING_TIME_PROFILE_SECTION; + + m_bLevelLoaded = false; + m_lastLevelName = levelName; + gEnv->pConsole->SetScrollMax(600); + ICVar* con_showonload = gEnv->pConsole->GetCVar("con_showonload"); + if (con_showonload && con_showonload->GetIVal() != 0) + { + gEnv->pConsole->ShowConsole(true); + ICVar* g_enableloadingscreen = gEnv->pConsole->GetCVar("g_enableloadingscreen"); + if (g_enableloadingscreen) + { + g_enableloadingscreen->Set(0); + } + } + + // Reset the camera to (1,1,1) (not (0,0,0) which is the invalid/uninitialised state, + // to avoid the hack in the renderer to not show anything if the camera is at the origin). + CCamera defaultCam; + defaultCam.SetPosition(Vec3(1.0f)); + m_pSystem->SetViewCamera(defaultCam); + + OnLoadingStart(levelName); + + auto pPak = gEnv->pCryPak; + + m_pSystem->SetThreadState(ESubsys_Physics, false); + + ICVar* pSpamDelay = gEnv->pConsole->GetCVar("log_SpamDelay"); + float spamDelay = 0.0f; + if (pSpamDelay) + { + spamDelay = pSpamDelay->GetFVal(); + pSpamDelay->Set(0.0f); + } + + if (gEnv->p3DEngine) + { + AZ::IO::PathView levelPath(levelName); + AZStd::string parentPath(levelPath.ParentPath().Native()); + + static constexpr const char* defaultGameTypeName = "Mission0"; + bool is3DEngineLoaded = gEnv->IsEditor() ? gEnv->p3DEngine->InitLevelForEditor(parentPath.c_str(), defaultGameTypeName) + : gEnv->p3DEngine->LoadLevel(parentPath.c_str(), defaultGameTypeName); + if (!is3DEngineLoaded) + { + OnLoadingError(levelName, "3DEngine failed to handle loading the level"); + + return 0; + } + } + + // Parse level specific config data. + AZStd::string const sLevelNameOnly(PathUtil::GetFileName(levelName)); + + if (!sLevelNameOnly.empty()) + { + const char* controlsPath = nullptr; + Audio::AudioSystemRequestBus::BroadcastResult(controlsPath, &Audio::AudioSystemRequestBus::Events::GetControlsPath); + if (controlsPath) + { + AZStd::string sAudioLevelPath(controlsPath); + sAudioLevelPath.append("levels/"); + sAudioLevelPath += sLevelNameOnly; + + Audio::SAudioManagerRequestData oAMData( + sAudioLevelPath.c_str(), Audio::eADS_LEVEL_SPECIFIC); + Audio::SAudioRequest oAudioRequestData; + oAudioRequestData.nFlags = + (Audio::eARF_PRIORITY_HIGH | + Audio::eARF_EXECUTE_BLOCKING); // Needs to be blocking so data is available for next preloading request! + oAudioRequestData.pData = &oAMData; + Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData); + + Audio::SAudioManagerRequestData oAMData2( + sAudioLevelPath.c_str(), Audio::eADS_LEVEL_SPECIFIC); + oAudioRequestData.pData = &oAMData2; + Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData); + + Audio::TAudioPreloadRequestID nPreloadRequestID = INVALID_AUDIO_PRELOAD_REQUEST_ID; + + Audio::AudioSystemRequestBus::BroadcastResult( + nPreloadRequestID, &Audio::AudioSystemRequestBus::Events::GetAudioPreloadRequestID, sLevelNameOnly.c_str()); + if (nPreloadRequestID != INVALID_AUDIO_PRELOAD_REQUEST_ID) + { + Audio::SAudioManagerRequestData requestData(nPreloadRequestID, true); + oAudioRequestData.pData = &requestData; + Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData); + } + } + } + + + AZ::Data::Asset rootSpawnable( + rootSpawnableAssetId, azrtti_typeid(), levelName); + + m_rootSpawnableId = rootSpawnableAssetId; + m_rootSpawnableGeneration = AzFramework::RootSpawnableInterface::Get()->AssignRootSpawnable(rootSpawnable); + + ////////////////////////////////////////////////////////////////////////// + // Movie system must be reset after entities. + ////////////////////////////////////////////////////////////////////////// + IMovieSystem* movieSys = gEnv->pMovieSystem; + if (movieSys != NULL) + { + // bSeekAllToStart needs to be false here as it's only of interest in the editor + movieSys->Reset(true, false); + } + + gEnv->pSystem->SetSystemGlobalState(ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_PRECACHE); + + ////////////////////////////////////////////////////////////////////////// + // Notify 3D engine that loading finished + ////////////////////////////////////////////////////////////////////////// + if (gEnv->p3DEngine) + { + gEnv->p3DEngine->PostLoadLevel(); + } + + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + gEnv->pConsole->SetScrollMax(600 / 2); + + pPak->GetResourceList(AZ::IO::IArchive::RFOM_NextLevel)->Clear(); + + if (pSpamDelay) + { + pSpamDelay->Set(spamDelay); + } + + m_bLevelLoaded = true; + gEnv->pSystem->SetSystemGlobalState(ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_END); + } + + GetISystem()->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_END, 0, 0); + + if (auto cvar = gEnv->pConsole->GetCVar("sv_map"); cvar) + { + cvar->Set(levelName); + } + + gEnv->pSystem->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_PRECACHE_START, 0, 0); + + m_pSystem->SetThreadState(ESubsys_Physics, true); + + return true; + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::PrepareNextLevel(const char* levelName) + { + AZ::Data::AssetId rootSpawnableAssetId; + AZ::Data::AssetCatalogRequestBus::BroadcastResult( + rootSpawnableAssetId, &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, levelName, nullptr, false); + if (!rootSpawnableAssetId.IsValid()) + { + // alert the listener + OnLevelNotFound(levelName); + return; + } + + // This work not required in-editor. + if (!gEnv || !gEnv->IsEditor()) + { + m_levelLoadStartTime = gEnv->pTimer->GetAsyncTime(); + + // switched to level heap, so now imm start the loading screen (renderer will be reinitialized in the levelheap) + gEnv->pSystem->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_START_LOADINGSCREEN, 0, 0); + gEnv->pSystem->SetSystemGlobalState(ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_PREPARE); + } + + OnPrepareNextLevel(levelName); + } + + void SpawnableLevelSystem::OnPrepareNextLevel(const char* levelName) + { + AZ_TracePrintf("LevelSystem", "Level system is preparing to load '%s'\n", levelName); + + for (auto& listener : m_listeners) + { + listener->OnPrepareNextLevel(levelName); + } + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::OnLevelNotFound(const char* levelName) + { + AZ_Error("LevelSystem", false, "Requested level not found: '%s'\n", levelName); + + for (auto& listener : m_listeners) + { + listener->OnLevelNotFound(levelName); + } + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::OnLoadingStart(const char* levelName) + { + AZ_TracePrintf("LevelSystem", "Level system is loading '%s'\n", levelName); + + if (gEnv->pCryPak->GetRecordFileOpenList() == AZ::IO::IArchive::RFOM_EngineStartup) + { + gEnv->pCryPak->RecordFileOpen(AZ::IO::IArchive::RFOM_Level); + } + + m_fLastTime = gEnv->pTimer->GetAsyncCurTime(); + + GetISystem()->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_START, 0, 0); + + LOADING_TIME_PROFILE_SECTION(gEnv->pSystem); + + for (auto& listener : m_listeners) + { + listener->OnLoadingStart(levelName); + } + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::OnLoadingError(const char* levelName, const char* error) + { + AZ_Error("LevelSystem", false, "Error loading level '%s': %s\n", levelName, error); + + if (gEnv->pRenderer) + { + gEnv->pRenderer->SetTexturePrecaching(false); + } + + for (auto& listener : m_listeners) + { + listener->OnLoadingError(levelName, error); + } + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::OnLoadingComplete(const char* levelName) + { + CTimeValue t = gEnv->pTimer->GetAsyncTime(); + m_fLastLevelLoadTime = (t - m_levelLoadStartTime).GetSeconds(); + + LogLoadingTime(); + + m_nLoadedLevelsCount++; + + // Hide console after loading. + gEnv->pConsole->ShowConsole(false); + + for (auto& listener : m_listeners) + { + listener->OnLoadingComplete(levelName); + } + + #if AZ_LOADSCREENCOMPONENT_ENABLED + EBUS_EVENT(LoadScreenBus, Stop); + #endif // if AZ_LOADSCREENCOMPONENT_ENABLED + + AZ_TracePrintf("LevelSystem", "Level load complete: '%s'\n", levelName); + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::OnLoadingProgress(const char* levelName, int progressAmount) + { + for (auto& listener : m_listeners) + { + listener->OnLoadingProgress(levelName, progressAmount); + } + } + + //------------------------------------------------------------------------ + void SpawnableLevelSystem::OnUnloadComplete(const char* levelName) + { + for (auto& listener : m_listeners) + { + listener->OnUnloadComplete(levelName); + } + + AZ_TracePrintf("LevelSystem", "Level unload complete: '%s'\n", levelName); + } + + ////////////////////////////////////////////////////////////////////////// + void SpawnableLevelSystem::LogLoadingTime() + { + if (gEnv->IsEditor()) + { + return; + } + + if (!GetISystem()->IsDevMode()) + { + return; + } + + char vers[128]; + GetISystem()->GetFileVersion().ToString(vers, sizeof(vers)); + + const char* sChain = ""; + if (m_nLoadedLevelsCount > 0) + { + sChain = " (Chained)"; + } + + AZStd::string text; + text.format( + "Game Level Load Time: [%s] Level %s loaded in %.2f seconds%s", vers, m_lastLevelName.c_str(), m_fLastLevelLoadTime, sChain); + gEnv->pLog->Log(text.c_str()); + } + + ////////////////////////////////////////////////////////////////////////// + void SpawnableLevelSystem::UnloadLevel() + { + if (gEnv->IsEditor()) + { + return; + } + + if (m_lastLevelName.empty()) + { + return; + } + + AZ_TracePrintf("LevelSystem", "UnloadLevel Start\n"); + INDENT_LOG_DURING_SCOPE(); + + // Flush core buses. We're about to unload Cry modules and need to ensure we don't have module-owned functions left behind. + AZ::Data::AssetBus::ExecuteQueuedEvents(); + AZ::TickBus::ExecuteQueuedEvents(); + AZ::MainThreadRenderRequestBus::ExecuteQueuedEvents(); + + if (gEnv && gEnv->pSystem) + { + // clear all error messages to prevent stalling due to runtime file access check during chainloading + gEnv->pSystem->ClearErrorMessages(); + } + + if (gEnv && gEnv->pCryPak) + { + gEnv->pCryPak->DisableRuntimeFileAccess(false); + } + + CTimeValue tBegin = gEnv->pTimer->GetAsyncTime(); + + I3DEngine* p3DEngine = gEnv->p3DEngine; + if (p3DEngine) + { + IDeferredPhysicsEventManager* pPhysEventManager = p3DEngine->GetDeferredPhysicsEventManager(); + if (pPhysEventManager) + { + // clear deferred physics queues before renderer, since we could have jobs running + // which access a rendermesh + pPhysEventManager->ClearDeferredEvents(); + } + } + + // AM: Flush render thread (Flush is not exposed - using EndFrame()) + // We are about to delete resources that could be in use + if (gEnv->pRenderer) + { + gEnv->pRenderer->EndFrame(); + + bool isLoadScreenPlaying = false; + #if AZ_LOADSCREENCOMPONENT_ENABLED + LoadScreenBus::BroadcastResult(isLoadScreenPlaying, &LoadScreenBus::Events::IsPlaying); + #endif // if AZ_LOADSCREENCOMPONENT_ENABLED + + // force a black screen as last render command. + // if load screen is playing do not call this draw as it may lead to a crash due to UI loading code getting + // pumped while loading the shaders for this draw. + if (!isLoadScreenPlaying) + { + gEnv->pRenderer->BeginFrame(); + gEnv->pRenderer->SetState(GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA | GS_NODEPTHTEST); + gEnv->pRenderer->Draw2dImage(0, 0, 800, 600, -1, 0.0f, 0.0f, 1.0f, 1.0f, 0.f, 0.0f, 0.0f, 0.0f, 1.0, 0.f); + gEnv->pRenderer->EndFrame(); + } + + // flush any outstanding texture requests + gEnv->pRenderer->FlushPendingTextureTasks(); + } + + // Clear level entities and prefab instances. + EBUS_EVENT(AzFramework::GameEntityContextRequestBus, ResetGameContext); + + if (gEnv->pMovieSystem) + { + gEnv->pMovieSystem->Reset(false, false); + gEnv->pMovieSystem->RemoveAllSequences(); + } + + // Unload level specific audio binary data. + Audio::SAudioManagerRequestData oAMData(Audio::eADS_LEVEL_SPECIFIC); + Audio::SAudioRequest oAudioRequestData; + oAudioRequestData.nFlags = (Audio::eARF_PRIORITY_HIGH | Audio::eARF_EXECUTE_BLOCKING); + oAudioRequestData.pData = &oAMData; + Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData); + + // Now unload level specific audio config data. + Audio::SAudioManagerRequestData oAMData2(Audio::eADS_LEVEL_SPECIFIC); + oAudioRequestData.pData = &oAMData2; + Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData); + + Audio::SAudioManagerRequestData oAMData3(Audio::eADS_LEVEL_SPECIFIC); + oAudioRequestData.pData = &oAMData3; + Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequestBlocking, oAudioRequestData); + + // Reset the camera to (0,0,0) which is the invalid/uninitialised state + CCamera defaultCam; + m_pSystem->SetViewCamera(defaultCam); + + OnUnloadComplete(m_lastLevelName.c_str()); + + AzFramework::RootSpawnableInterface::Get()->ReleaseRootSpawnable(); + + m_lastLevelName.clear(); + + GetISystem()->GetIResourceManager()->UnloadLevel(); + + /* + Force Lua garbage collection before p3DEngine->UnloadLevel() and pRenderer->FreeResources(flags) are called. + p3DEngine->UnloadLevel() will destroy particle emitters even if they're still referenced by Lua objects that are yet to be + collected. (as per comment in 3dEngineLoad.cpp (line 501) - "Force to clean all particles that are left, even if still referenced."). + Then, during the next GC cycle, Lua finally cleans up, the particle emitter smart pointers will be pointing to invalid memory). + Normally the GC step is triggered at the end of this method (by the ESYSTEM_EVENT_LEVEL_POST_UNLOAD event), which is too late + (after the render resources have been purged). + This extra GC step takes a few ms more level unload time, which is a small price for fixing nasty crashes. + If, however, we wanted to claim it back, we could potentially get rid of the GC step that is triggered by + ESYSTEM_EVENT_LEVEL_POST_UNLOAD to break even. + */ + + EBUS_EVENT(AZ::ScriptSystemRequestBus, GarbageCollect); + + // Delete engine resources + if (p3DEngine) + { + p3DEngine->UnloadLevel(); + } + // Force to clean render resources left after deleting all objects and materials. + IRenderer* pRenderer = gEnv->pRenderer; + if (pRenderer) + { + pRenderer->FlushRTCommands(true, true, true); + + CryComment("Deleting Render meshes, render resources and flush texture streaming"); + // This may also release some of the materials. + int flags = FRR_DELETED_MESHES | FRR_FLUSH_TEXTURESTREAMING | FRR_OBJECTS | FRR_RENDERELEMENTS | FRR_RP_BUFFERS | FRR_POST_EFFECTS; + + // Always keep the system resources around in the editor. + // If a level load fails for any reason, then do not unload the system resources, otherwise we will not have any system resources to + // continue rendering the console and debug output text. + if (!gEnv->IsEditor() && !GetLevelLoadFailed()) + { + flags |= FRR_SYSTEM_RESOURCES; + } + + pRenderer->FreeResources(flags); + CryComment("done"); + } + + // Perform level unload procedures for the LyShine UI system + if (gEnv && gEnv->pLyShine) + { + gEnv->pLyShine->OnLevelUnload(); + } + + m_bLevelLoaded = false; + + CTimeValue tUnloadTime = gEnv->pTimer->GetAsyncTime() - tBegin; + AZ_TracePrintf("LevelSystem", "UnloadLevel End: %.1f sec\n", tUnloadTime.GetSeconds()); + + // Must be sent last. + // Cleanup all containers + GetISystem()->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_POST_UNLOAD, 0, 0); + AzFramework::InputChannelRequestBus::Broadcast(&AzFramework::InputChannelRequests::ResetState); + } + + void SpawnableLevelSystem::OnRootSpawnableAssigned( + [[maybe_unused]] AZ::Data::Asset rootSpawnable, [[maybe_unused]] uint32_t generation) + { + } + + void SpawnableLevelSystem::OnRootSpawnableReleased([[maybe_unused]] uint32_t generation) + { + } + +} // namespace LegacyLevelSystem diff --git a/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.h b/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.h new file mode 100644 index 0000000000..f319249bc3 --- /dev/null +++ b/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.h @@ -0,0 +1,93 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include "ILevelSystem.h" +#include +#include +#include + +namespace LegacyLevelSystem +{ + +class SpawnableLevelSystem + : public ILevelSystem + , public AzFramework::RootSpawnableNotificationBus::Handler + { + public: + explicit SpawnableLevelSystem(ISystem* pSystem); + ~SpawnableLevelSystem() override; + + // ILevelSystem + void Release() override; + + void AddListener(ILevelSystemListener* pListener) override; + void RemoveListener(ILevelSystemListener* pListener) override; + + bool LoadLevel(const char* levelName) override; + void UnloadLevel() override; + bool IsLevelLoaded() override; + const char* GetCurrentLevelName() const override; + + // If the level load failed then we need to have a different shutdown procedure vs when a level is naturally unloaded + void SetLevelLoadFailed(bool loadFailed) override; + bool GetLevelLoadFailed() override; + AZ::Data::AssetType GetLevelAssetType() const override; + + // The following methods are deprecated from ILevelSystem and will be removed once slice support is removed. + + // [LYN-2376] Remove once legacy slice support is removed + void Rescan([[maybe_unused]] const char* levelsFolder) override; + int GetLevelCount() override; + ILevelInfo* GetLevelInfo([[maybe_unused]] int level) override; + ILevelInfo* GetLevelInfo([[maybe_unused]] const char* levelName) override; + + private: + void OnRootSpawnableAssigned(AZ::Data::Asset rootSpawnable, uint32_t generation) override; + void OnRootSpawnableReleased(uint32_t generation) override; + + void PrepareNextLevel(const char* levelName); + bool LoadLevelInternal(const char* levelName); + + // Methods to notify ILevelSystemListener + void OnPrepareNextLevel(const char* levelName); + void OnLevelNotFound(const char* levelName); + void OnLoadingStart(const char* levelName); + void OnLoadingComplete(const char* levelName); + void OnLoadingError(const char* levelName, const char* error); + void OnLoadingProgress(const char* levelName, int progressAmount); + void OnUnloadComplete(const char* levelName); + + void LogLoadingTime(); + + ISystem* m_pSystem{nullptr}; + + AZStd::string m_lastLevelName; + float m_fLastLevelLoadTime{0.0f}; + float m_fLastTime{0.0f}; + + bool m_bLevelLoaded{false}; + bool m_levelLoadFailed{false}; + + int m_nLoadedLevelsCount{0}; + + CTimeValue m_levelLoadStartTime; + + AZStd::vector m_listeners; + + // Information about the currently-loaded root spawnable, used for tracking loads and unloads. + uint64_t m_rootSpawnableGeneration{0}; + AZ::Data::AssetId m_rootSpawnableId{}; + }; + +} // namespace LegacyLevelSystem diff --git a/Code/CryEngine/CrySystem/Log.h b/Code/CryEngine/CrySystem/Log.h index 5e4f173a01..911043871a 100644 --- a/Code/CryEngine/CrySystem/Log.h +++ b/Code/CryEngine/CrySystem/Log.h @@ -92,8 +92,8 @@ public: virtual void UnregisterConsoleVariables(); virtual void AddCallback(ILogCallback* pCallback); virtual void RemoveCallback(ILogCallback* pCallback); - virtual void LogV(const ELogType ineType, int flags, const char* szFormat, va_list args); - virtual void LogV(const ELogType ineType, const char* szFormat, va_list args); + virtual void LogV(ELogType ineType, int flags, const char* szFormat, va_list args); + virtual void LogV(ELogType ineType, const char* szFormat, va_list args); virtual void Update(); virtual const char* GetModuleFilter(); virtual void FlushAndClose(); diff --git a/Code/CryEngine/CrySystem/ResourceManager.cpp b/Code/CryEngine/CrySystem/ResourceManager.cpp index 1dc0c03768..e5c0ac53ca 100644 --- a/Code/CryEngine/CrySystem/ResourceManager.cpp +++ b/Code/CryEngine/CrySystem/ResourceManager.cpp @@ -19,6 +19,7 @@ #include "System.h" #include "MaterialUtils.h" #include +#include #include #include #include @@ -216,12 +217,20 @@ void CResourceManager::PrepareLevel(const char* sLevelFolder, const char* sLevel if (g_cvars.archiveVars.nLoadCache) { - CryPathString levelpak = PathUtil::Make(sLevelFolder, LEVEL_PAK_FILENAME); - size_t nPakFileSize = gEnv->pCryPak->FGetSize(levelpak.c_str()); - if (nPakFileSize < LEVEL_PAK_INMEMORY_MAXSIZE) // 10 megs. + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + // The prefab system doesn't use level.pak + if (!usePrefabSystemForLevels) { - // Force level.pak from this level in memory. - gEnv->pCryPak->LoadPakToMemory(LEVEL_PAK_FILENAME, AZ::IO::IArchive::eInMemoryPakLocale_GPU); + CryPathString levelpak = PathUtil::Make(sLevelFolder, LEVEL_PAK_FILENAME); + size_t nPakFileSize = gEnv->pCryPak->FGetSize(levelpak.c_str()); + if (nPakFileSize < LEVEL_PAK_INMEMORY_MAXSIZE) // 10 megs. + { + // Force level.pak from this level in memory. + gEnv->pCryPak->LoadPakToMemory(LEVEL_PAK_FILENAME, AZ::IO::IArchive::eInMemoryPakLocale_GPU); + } } gEnv->pCryPak->LoadPakToMemory(ENGINE_PAK_FILENAME, AZ::IO::IArchive::eInMemoryPakLocale_GPU); @@ -584,8 +593,15 @@ void CResourceManager::UnloadAllLevelCachePaks(bool bLevelLoadEnd) { gEnv->pCryPak->LoadPakToMemory(ENGINE_PAK_FILENAME, AZ::IO::IArchive::eInMemoryPakLocale_Unload); - // Force level.pak out of memory. - gEnv->pCryPak->LoadPakToMemory(LEVEL_PAK_FILENAME, AZ::IO::IArchive::eInMemoryPakLocale_Unload); + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (!usePrefabSystemForLevels) + { + // Force level.pak out of memory. + gEnv->pCryPak->LoadPakToMemory(LEVEL_PAK_FILENAME, AZ::IO::IArchive::eInMemoryPakLocale_Unload); + } } if (!bLevelLoadEnd) { diff --git a/Code/CryEngine/CrySystem/System.cpp b/Code/CryEngine/CrySystem/System.cpp index 285f5c2573..a75e514def 100644 --- a/Code/CryEngine/CrySystem/System.cpp +++ b/Code/CryEngine/CrySystem/System.cpp @@ -1501,7 +1501,7 @@ bool CSystem::UpdatePreTickBus(int updateFlags, int nPauseMode) if (maxFPS == 0 && vSync == 0) { ILevelSystem* pLvlSys = GetILevelSystem(); - const bool inLevel = pLvlSys && pLvlSys->GetCurrentLevel() != 0; + const bool inLevel = pLvlSys && pLvlSys->IsLevelLoaded(); maxFPS = !inLevel || IsPaused() ? 60 : 0; } @@ -1791,23 +1791,6 @@ bool CSystem::UpdatePostTickBus(int updateFlags, int nPauseMode) GetIViewSystem()->Update(min(gEnv->pTimer->GetFrameTime(), 0.1f)); } - if (gEnv->pLyShine) - { - // Tell the UI system the size of the viewport we are rendering to - this drives the - // canvas size for full screen UI canvases. It needs to be set before either pLyShine->Update or - // pLyShine->Render are called. It must match the viewport size that the input system is using. - AZ::Vector2 viewportSize; - viewportSize.SetX(static_cast(gEnv->pRenderer->GetOverlayWidth())); - viewportSize.SetY(static_cast(gEnv->pRenderer->GetOverlayHeight())); - gEnv->pLyShine->SetViewportSize(viewportSize); - - bool isUiPaused = gEnv->pTimer->IsTimerPaused(ITimer::ETIMER_UI); - if (!isUiPaused) - { - gEnv->pLyShine->Update(gEnv->pTimer->GetFrameTime(ITimer::ETIMER_UI)); - } - } - // Begin occlusion job after setting the correct camera. gEnv->p3DEngine->PrepareOcclusion(GetViewCamera()); diff --git a/Code/CryEngine/CrySystem/System.h b/Code/CryEngine/CrySystem/System.h index 1244283f7d..47fdb362e9 100644 --- a/Code/CryEngine/CrySystem/System.h +++ b/Code/CryEngine/CrySystem/System.h @@ -612,7 +612,7 @@ public: virtual void SetConfigSpec(ESystemConfigSpec spec, ESystemConfigPlatform platform, bool bClient); virtual ESystemConfigSpec GetMaxConfigSpec() const; virtual ESystemConfigPlatform GetConfigPlatform() const; - virtual void SetConfigPlatform(const ESystemConfigPlatform platform); + virtual void SetConfigPlatform(ESystemConfigPlatform platform); ////////////////////////////////////////////////////////////////////////// virtual int SetThreadState(ESubsystem subsys, bool bActive); @@ -746,7 +746,7 @@ public: // interface ISystem ------------------------------------------- virtual IDataProbe* GetIDataProbe() { return m_pDataProbe; }; - virtual void SetForceNonDevMode(const bool bValue); + virtual void SetForceNonDevMode(bool bValue); virtual bool GetForceNonDevMode() const; virtual bool WasInDevMode() const { return m_bWasInDevMode; }; virtual bool IsDevMode() const { return m_bInDevMode && !GetForceNonDevMode(); } @@ -759,7 +759,7 @@ public: } return (true); } - virtual void AutoDetectSpec(const bool detectResolution); + virtual void AutoDetectSpec(bool detectResolution); virtual void AsyncMemcpy(void* dst, const void* src, size_t size, int nFlags, volatile int* sync) { @@ -1084,7 +1084,7 @@ public: } virtual ESystemGlobalState GetSystemGlobalState(void); - virtual void SetSystemGlobalState(const ESystemGlobalState systemGlobalState); + virtual void SetSystemGlobalState(ESystemGlobalState systemGlobalState); #if !defined(_RELEASE) virtual bool IsSavingResourceList() const { return (g_cvars.archiveVars.nSaveLevelResourceList != 0); } diff --git a/Code/CryEngine/CrySystem/SystemInit.cpp b/Code/CryEngine/CrySystem/SystemInit.cpp index 5fcf63a2ef..df51cd741a 100644 --- a/Code/CryEngine/CrySystem/SystemInit.cpp +++ b/Code/CryEngine/CrySystem/SystemInit.cpp @@ -54,6 +54,7 @@ #include #include #include +#include #include #include #include @@ -131,6 +132,7 @@ #include "ServiceNetwork.h" #include "RemoteCommand.h" #include "LevelSystem/LevelSystem.h" +#include "LevelSystem/SpawnableLevelSystem.h" #include "ViewSystem/ViewSystem.h" #include #include @@ -310,8 +312,6 @@ namespace //static int g_sysSpecChanged = false; -const char* g_szLvlResExt = "_LvlRes.txt"; - struct SCVarsClientConfigSink : public ILoadConfigurationEntrySink { @@ -1517,27 +1517,16 @@ bool CSystem::InitFileSystem() m_pUserCallback->OnInitProgress("Initializing File System..."); } - bool bLvlRes = false; // true: all assets since executable start are recorded, false otherwise - // get the DirectInstance FileIOBase which should be the AZ::LocalFileIO m_env.pFileIO = AZ::IO::FileIOBase::GetDirectInstance(); m_env.pResourceCompilerHelper = nullptr; -#if !defined(_RELEASE) - const ICmdLineArg* pArg = m_pCmdLine->FindArg(eCLAT_Pre, "LvlRes"); // -LvlRes command line option - - if (pArg) - { - bLvlRes = true; - } -#endif // !defined(_RELEASE) - m_env.pCryPak = AZ::Interface::Get(); m_env.pFileIO = AZ::IO::FileIOBase::GetInstance(); AZ_Assert(m_env.pCryPak, "CryPak has not been initialized on AZ::Interface"); AZ_Assert(m_env.pFileIO, "FileIOBase has not been initialized"); - if (m_bEditor || bLvlRes) + if (m_bEditor) { m_env.pCryPak->RecordFileOpen(AZ::IO::IArchive::RFOM_EngineStartup); } @@ -2212,43 +2201,6 @@ public: using CommandRegisteredHandler = AZ::IConsole::ConsoleCommandRegisteredEvent::Handler; static inline CommandRegisteredHandler s_commandRegisteredHandler = CommandRegisteredHandler([](AZ::ConsoleFunctorBase* functor) { Visit(functor); }); - - using CommandInvokedHandler = AZ::ConsoleCommandInvokedEvent::Handler; - static inline CommandInvokedHandler s_commandInvokedHandler = CommandInvokedHandler([] - ( - AZStd::string_view command, - const AZ::ConsoleCommandContainer& args, - [[maybe_unused]] AZ::ConsoleFunctorFlags flags, - AZ::ConsoleInvokedFrom invokedFrom - ) - { - if (invokedFrom == AZ::ConsoleInvokedFrom::CryBinding) - { - // If a command originated from the cry console, do not echo it back to the cry console - return; - } - AZ::CVarFixedString joinedCommand = AZ::CVarFixedString(command) + " "; - AZ::StringFunc::Join(joinedCommand, args.begin(), args.end(), " "); - gEnv->pConsole->ExecuteString(joinedCommand.c_str(), true); - }); - - using CommandNotFoundHandler = AZ::DispatchCommandNotFoundEvent::Handler; - static inline CommandNotFoundHandler s_commandNotFoundHandler = CommandNotFoundHandler([] - ( - AZStd::string_view command, - const AZ::ConsoleCommandContainer& args, - AZ::ConsoleInvokedFrom invokedFrom - ) - { - if (invokedFrom == AZ::ConsoleInvokedFrom::CryBinding) - { - // If a command originated from the cry console, do not echo it back to the cry console - return; - } - AZ::CVarFixedString joinedCommand = AZ::CVarFixedString(command) + " "; - AZ::StringFunc::Join(joinedCommand, args.begin(), args.end(), " "); - gEnv->pConsole->ExecuteString(joinedCommand.c_str(), true); - }); }; // System initialization @@ -3193,7 +3145,19 @@ AZ_POP_DISABLE_WARNING ////////////////////////////////////////////////////////////////////////// // LEVEL SYSTEM - m_pLevelSystem = new LegacyLevelSystem::CLevelSystem(this, "levels"); + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) + { + m_pLevelSystem = new LegacyLevelSystem::SpawnableLevelSystem(this); + } + else + { + // [LYN-2376] Remove once legacy slice support is removed + m_pLevelSystem = new LegacyLevelSystem::CLevelSystem(this, ILevelSystem::GetLevelsDirectoryName()); + } InlineInitializationProcessing("CSystem::Init Level System"); @@ -3276,8 +3240,6 @@ AZ_POP_DISABLE_WARNING // Az to Cry console binding AZ::Interface::Get()->VisitRegisteredFunctors([](AZ::ConsoleFunctorBase* functor) { AzConsoleToCryConsoleBinder::Visit(functor); }); AzConsoleToCryConsoleBinder::s_commandRegisteredHandler.Connect(AZ::Interface::Get()->GetConsoleCommandRegisteredEvent()); - AzConsoleToCryConsoleBinder::s_commandInvokedHandler.Connect(AZ::Interface::Get()->GetConsoleCommandInvokedEvent()); - AzConsoleToCryConsoleBinder::s_commandNotFoundHandler.Connect(AZ::Interface::Get()->GetDispatchCommandNotFoundEvent()); // final tryflush to be sure that all framework init request have been processed if (!startupParams.bShaderCacheGen && m_env.pRenderer) @@ -3384,548 +3346,6 @@ static string ConcatPath(const char* szPart1, const char* szPart2) return ret; } - - -class CLvlRes_base -{ -public: - - // destructor - virtual ~CLvlRes_base() - { - } - - void RegisterAllLevelPaks(const string& sPath) - { - string sPathPattern = ConcatPath(sPath, "*"); - - AZ::IO::ArchiveFileIterator handle = gEnv->pCryPak->FindFirst(sPathPattern.c_str()); - - if (!handle) - { - gEnv->pLog->LogError("ERROR: CLvlRes_base failed '%s'", sPathPattern.c_str()); - return; - } - - do - { - if ((handle.m_fileDesc.nAttrib & AZ::IO::FileDesc::Attribute::Subdirectory) == AZ::IO::FileDesc::Attribute::Subdirectory) - { - if (handle.m_filename != "." && handle.m_filename != "..") - { - RegisterAllLevelPaks(ConcatPath(sPath, handle.m_filename.data())); - } - } - else if (HasRightExtension(handle.m_filename.data())) // open only the level paks if there is a LvlRes.txt, opening all would be too slow - { - OnPakEntry(sPath, handle.m_filename.data()); - } - } while (handle = gEnv->pCryPak->FindNext(handle)); - - gEnv->pCryPak->FindClose(handle); - } - - - - void Process(const string& sPath) - { - string sPathPattern = ConcatPath(sPath, "*"); - - AZ::IO::ArchiveFileIterator handle = gEnv->pCryPak->FindFirst(sPathPattern.c_str()); - - if (!handle) - { - gEnv->pLog->LogError("ERROR: LvlRes_finalstep failed '%s'", sPathPattern.c_str()); - return; - } - - do - { - if ((handle.m_fileDesc.nAttrib & AZ::IO::FileDesc::Attribute::Subdirectory) == AZ::IO::FileDesc::Attribute::Subdirectory) - { - if (handle.m_filename != "." && handle.m_filename != "..") - { - Process(ConcatPath(sPath, handle.m_filename.data())); - } - } - else if (HasRightExtension(handle.m_filename.data())) - { - string sFilePath = ConcatPath(sPath, handle.m_filename.data()); - - gEnv->pLog->Log("CLvlRes_base processing '%s' ...", sFilePath.c_str()); - - AZ::IO::HandleType fileHandle = gEnv->pCryPak->FOpen(sFilePath.c_str(), "rb"); - - if (fileHandle != AZ::IO::InvalidHandle) - { - std::vector vBuffer; - - size_t len = gEnv->pCryPak->FGetSize(fileHandle); - vBuffer.resize(len + 1); - - if (len) - { - if (gEnv->pCryPak->FReadRaw(&vBuffer[0], len, 1, fileHandle) == 1) - { - vBuffer[len] = 0; // end terminator - - char* p = &vBuffer[0]; - - while (*p) - { - while (*p != 0 && *p <= ' ') // jump over whitespace - { - ++p; - } - - char* pLineStart = p; - - while (*p != 0 && *p != 10 && *p != 13) // goto end of line - { - ++p; - } - - char* pLineEnd = p; - - while (*p != 0 && (*p == 10 || *p == 13)) // goto next line with data - { - ++p; - } - - if (*pLineStart != ';') // if it's not a commented line - { - *pLineEnd = 0; - OnFileEntry(pLineStart); // add line - } - } - } - else - { - gEnv->pLog->LogError("Error: LvlRes_finalstep file open '%s' failed", sFilePath.c_str()); - } - } - - gEnv->pCryPak->FClose(fileHandle); - } - else - { - gEnv->pLog->LogError("Error: LvlRes_finalstep file open '%s' failed", sFilePath.c_str()); - } - } - } while (handle = gEnv->pCryPak->FindNext(handle)); - - gEnv->pCryPak->FindClose(handle); - } - - bool IsFileKnown(const char* szFilePath) - { - string sFilePath = szFilePath; - - return m_UniqueFileList.find(sFilePath) != m_UniqueFileList.end(); - } - -protected: // ------------------------------------------------------------------------- - - static bool HasRightExtension(const char* szFileName) - { - const char* szLvlResExt = szFileName; - - size_t lenName = strlen(szLvlResExt); - static size_t lenLvlExt = strlen(g_szLvlResExt); - - if (lenName >= lenLvlExt) - { - szLvlResExt += lenName - lenLvlExt; // "test_LvlRes.txt" -> "_LvlRes.txt" - } - return azstricmp(szLvlResExt, g_szLvlResExt) == 0; - } - - // Arguments - // sFilePath - e.g. "game/object/vehices/car01.dds" - void OnFileEntry(const char* szFilePath) - { - string sFilePath = szFilePath; - if (m_UniqueFileList.find(sFilePath) == m_UniqueFileList.end()) // to to file processing only once per file - { - m_UniqueFileList.insert(sFilePath); - - ProcessFile(sFilePath); - - gEnv->pLog->UpdateLoadingScreen(0); - } - } - - virtual void ProcessFile(const string& sFilePath) = 0; - - virtual void OnPakEntry([[maybe_unused]] const string& sPath, [[maybe_unused]] const char* szPak) {} - - // ----------------------------------------------------------------- - - std::set m_UniqueFileList; // to removed duplicate files -}; - - - - - -class CLvlRes_finalstep - : public CLvlRes_base -{ -public: - - // constructor - CLvlRes_finalstep(const char* szPath) - : m_sPath(szPath) - { - assert(szPath); - } - - // destructor - virtual ~CLvlRes_finalstep() - { - // free registered paks - std::set::iterator it, end = m_RegisteredPakFiles.end(); - - for (it = m_RegisteredPakFiles.begin(); it != end; ++it) - { - string sName = *it; - - gEnv->pCryPak->ClosePack(sName.c_str()); - } - } - - // register a pak file so all files within do not become file entries but the pak file becomes - void RegisterPak(const string& sPath, const char* szFile) - { - string sPak = ConcatPath(sPath, szFile); - AZStd::string_view pakView{ sPak.c_str(), sPak.size() }; - gEnv->pCryPak->ClosePack(pakView); // so we don't get error for paks that were already opened - - if (!gEnv->pCryPak->OpenPack(pakView)) - { - CryLog("RegisterPak '%s' failed - file not present?", sPak.c_str()); - return; - } - - enum - { - nMaxPath = 0x800 - }; - char szAbsPathBuf[nMaxPath]; - - const char* szAbsPath = gEnv->pCryPak->AdjustFileName({ sPak.c_str(), sPak.size() }, szAbsPathBuf, AZ_ARRAY_SIZE(szAbsPathBuf), 0); - - // string sAbsPath = PathUtil::RemoveSlash(PathUtil::GetPath(szAbsPath)); - - // debug - CryLog("RegisterPak '%s'", szAbsPath); - - m_RegisteredPakFiles.insert(string(szAbsPath)); - - OnFileEntry(sPak); // include pak as file entry - } - - // finds a specific file - static AZ::IO::ArchiveFileIterator FindFile(const char* szFilePath, const char* szFile) - { - AZ::IO::ArchiveFileIterator handle = gEnv->pCryPak->FindFirst(szFilePath); - - if (!handle) - { - return {}; - } - - do - { - if (azstricmp(handle.m_filename.data(), szFile) == 0) - { - gEnv->pCryPak->FindClose(handle); - return handle; - } - } while (handle = gEnv->pCryPak->FindNext(handle)); - - gEnv->pCryPak->FindClose(handle); - return {}; - } - - // slow but safe (to correct path and file name upper/lower case to the existing files) - // some code might rely on the case (e.g. CVarGroup creation) so it's better to correct the case - static void CorrectCaseInPlace(char* szFilePath) - { - // required for FindFirst, TODO: investigate as this seems wrong behavior - { - // jump over "Game" - while (*szFilePath != '/' && *szFilePath != '\\' && *szFilePath != 0) - { - ++szFilePath; - } - // jump over "/" - if (*szFilePath != 0) - { - ++szFilePath; - } - } - - char* szFile = szFilePath, * p = szFilePath; - - for (;; ) - { - if (*p == '/' || *p == '\\' || *p == 0) - { - char cOldChar = *p; - *p = 0; // create zero termination - - auto fileIterator = FindFile(szFilePath, szFile); - - if (fileIterator) - { - assert(strlen(szFile) == fileIterator.m_filename.size()); - } - - *p = cOldChar; // get back the old separator - - if (!fileIterator) - { - return; - } - - fileIterator.m_filename.copy(szFile, fileIterator.m_filename.size()); - - if (*p == 0) - { - break; - } - - ++p; - szFile = p; - } - else - { - ++p; - } - } - } - - virtual void ProcessFile(const string& _sFilePath) - { - string sFilePath = _sFilePath; - - CorrectCaseInPlace((char*)&sFilePath[0]); - - gEnv->pLog->LogWithType(ILog::eAlways, "LvlRes: %s", sFilePath.c_str()); - - CCryFile file; - std::vector data; - - if (!file.Open(sFilePath.c_str(), "rb")) - { - gEnv->pLog->LogError("ERROR: failed to open '%s'", sFilePath.c_str()); // pak not opened ? - return; - } - - if (IsInRegisteredPak(file.GetHandle())) - { - return; // then don't process as we include the pak - } - // Save this file in target folder. - string trgFilename = PathUtil::Make(m_sPath, sFilePath); - int fsize = file.GetLength(); - - size_t len = file.GetLength(); - - if (fsize > (int)data.size()) - { - data.resize(fsize + 16); - } - - // Read data. - file.ReadRaw(&data[0], fsize); - - // Save this data to target file. - string trgFileDir = PathUtil::ToDosPath(PathUtil::RemoveSlash(PathUtil::GetPath(trgFilename))); - - gEnv->pFileIO->CreatePath(trgFileDir); // ensure path exists - - // Create target file - FILE* trgFile = nullptr; - azfopen(&trgFile, trgFilename, "wb"); - - if (trgFile) - { - fwrite(&data[0], fsize, 1, trgFile); - fclose(trgFile); - } - else - { - gEnv->pLog->LogError("ERROR: failed to write '%s' (write protected/disk full/rights)", trgFilename.c_str()); - assert(0); - } - } - - bool IsInRegisteredPak(AZ::IO::HandleType fileHandle) - { - const char* szPak = gEnv->pCryPak->GetFileArchivePath(fileHandle); - - if (!szPak) - { - return false; // outside pak - } - bool bInsideRegisteredPak = m_RegisteredPakFiles.find(szPak) != m_RegisteredPakFiles.end(); - - return bInsideRegisteredPak; - } - - virtual void OnPakEntry(const string& sPath, [[maybe_unused]] const char* szPak) - { - RegisterPak(sPath, "level.pak"); - RegisterPak(sPath, "levelmm.pak"); - } - - // ------------------------------------------------------------------------------- - - string m_sPath; // directory path to store the assets e.g. "c:\temp\Out" - std::set m_RegisteredPakFiles; // abs path to pak files we registered e.g. "c:\MasterCD\game\GameData.pak", to avoid processing files inside these pak files - the ones we anyway want to include -}; - - -class CLvlRes_findunused - : public CLvlRes_base -{ -public: - - virtual void ProcessFile([[maybe_unused]] const string& sFilePath) - { - } -}; - - - - - - -static void LvlRes_finalstep(IConsoleCmdArgs* pParams) -{ - assert(pParams); - - uint32 dwCnt = pParams->GetArgCount(); - - if (dwCnt != 2) - { - gEnv->pLog->LogWithType(ILog::eError, "ERROR: sys_LvlRes_finalstep requires destination path as parameter"); - return; - } - - const char* szPath = pParams->GetArg(1); - assert(szPath); - - gEnv->pLog->LogWithType(ILog::eInputResponse, "sys_LvlRes_finalstep %s ...", szPath); - - // open console - gEnv->pConsole->ShowConsole(true); - - CLvlRes_finalstep sink(szPath); - - sink.RegisterPak("@assets@", "GameData.pak"); - sink.RegisterPak("@assets@", "Shaders.pak"); - - sink.RegisterAllLevelPaks("levels"); - sink.Process("levels"); -} - - - - -static void _LvlRes_findunused_recursive(CLvlRes_findunused& sink, const string& sPath, - uint32& dwUnused, uint32& dwAll) -{ - string sPathPattern = ConcatPath(sPath, "*"); - - // ignore some directories - if (azstricmp(sPath.c_str(), "Shaders") == 0 - || azstricmp(sPath.c_str(), "ScreenShots") == 0 - || azstricmp(sPath.c_str(), "Scripts") == 0 - || azstricmp(sPath.c_str(), "Config") == 0 - || azstricmp(sPath.c_str(), "LowSpec") == 0) - { - return; - } - - // gEnv->pLog->Log("_LvlRes_findunused_recursive '%s'",sPath.c_str()); - - AZ::IO::ArchiveFileIterator handle = gEnv->pCryPak->FindFirst(sPathPattern.c_str()); - - if (!handle) - { - gEnv->pLog->LogError("ERROR: _LvlRes_findunused_recursive failed '%s'", sPathPattern.c_str()); - return; - } - - do - { - if ((handle.m_fileDesc.nAttrib & AZ::IO::FileDesc::Attribute::Subdirectory) == AZ::IO::FileDesc::Attribute::Subdirectory) - { - if (handle.m_filename != "." && handle.m_filename != "..") - { - _LvlRes_findunused_recursive(sink, ConcatPath(sPath, handle.m_filename.data()), dwUnused, dwAll); - } - } - else - { - string sFilePath = CryStringUtils::ToLower(ConcatPath(sPath, handle.m_filename.data())); - enum - { - nMaxPath = 0x800 - }; - char szAbsPathBuf[nMaxPath]; - - gEnv->pCryPak->AdjustFileName(sFilePath.c_str(), szAbsPathBuf, AZ_ARRAY_SIZE(szAbsPathBuf), 0); - - if (!sink.IsFileKnown(szAbsPathBuf)) - { - gEnv->pLog->LogWithType(IMiniLog::eAlways, "%d, %s", (uint32)handle.m_fileDesc.nSize, szAbsPathBuf); - ++dwUnused; - } - ++dwAll; - } - } while (handle = gEnv->pCryPak->FindNext(handle)); - - gEnv->pCryPak->FindClose(handle); -} - - -static void LvlRes_findunused([[maybe_unused]] IConsoleCmdArgs* pParams) -{ - assert(pParams); - - gEnv->pLog->LogWithType(ILog::eInputResponse, "sys_LvlRes_findunused ..."); - - // open console - gEnv->pConsole->ShowConsole(true); - - CLvlRes_findunused sink; - - sink.RegisterAllLevelPaks("levels"); - sink.Process("levels"); - - gEnv->pLog->LogWithType(ILog::eInputResponse, " "); - gEnv->pLog->LogWithType(ILog::eInputResponse, "Assets not used by the existing LvlRes data:"); - gEnv->pLog->LogWithType(ILog::eInputResponse, " "); - - char rootpath[_MAX_PATH]; - AZ::Utils::GetExecutableDirectory(rootpath, _MAX_PATH); - - gEnv->pLog->LogWithType(ILog::eInputResponse, "Folder: %s", rootpath); - - uint32 dwUnused = 0, dwAll = 0; - - string unused; - _LvlRes_findunused_recursive(sink, unused, dwUnused, dwAll); - - gEnv->pLog->LogWithType(ILog::eInputResponse, " "); - gEnv->pLog->LogWithType(ILog::eInputResponse, "Unused assets: %d/%d", dwUnused, dwAll); - gEnv->pLog->LogWithType(ILog::eInputResponse, " "); -} - static void ScreenshotCmd(IConsoleCmdArgs* pParams) { assert(pParams); @@ -4628,15 +4048,9 @@ void CSystem::CreateSystemVars() REGISTER_INT("capture_frames", 0, 0, "Enables capturing of frames. 0=off, 1=on"); REGISTER_STRING("capture_folder", "CaptureOutput", 0, "Specifies sub folder to write captured frames."); - REGISTER_STRING("capture_file_format", "jpg", 0, "Specifies file format of captured files (jpg, tga, tif)."); REGISTER_INT("capture_frame_once", 0, 0, "Makes capture single frame only"); REGISTER_STRING("capture_file_name", "", 0, "If set, specifies the path and name to use for the captured frame"); REGISTER_STRING("capture_file_prefix", "", 0, "If set, specifies the prefix to use for the captured frame instead of the default 'Frame'."); - REGISTER_INT("capture_buffer", 0, 0, - "Buffer to capture when capture_frames is enabled.\n" - "0=Color\n" - "1=Color with Alpha (requires capture_file_format=tga)"); - m_gpu_particle_physics = REGISTER_INT("gpu_particle_physics", 0, VF_REQUIRE_APP_RESTART, "Enable GPU physics if available (0=off / 1=enabled)."); assert(m_gpu_particle_physics); @@ -4645,7 +4059,6 @@ void CSystem::CreateSystemVars() "Load .cfg file from disk (from the {Game}/Config directory)\n" "e.g. LoadConfig lowspec.cfg\n" "Usage: LoadConfig "); - assert(m_env.pConsole); m_env.pConsole->CreateKeyBind("alt_keyboard_key_function_F12", "Screenshot"); m_env.pConsole->CreateKeyBind("alt_keyboard_key_function_F11", "RecordClip"); @@ -4656,8 +4069,6 @@ void CSystem::CreateSystemVars() "e.g. Screenshot beach scene with shark\n" "Usage: Screenshot "); - REGISTER_COMMAND("sys_LvlRes_finalstep", &LvlRes_finalstep, 0, "to combine all recorded level resources and create final stripped build (pass directory name as parameter)"); - REGISTER_COMMAND("sys_LvlRes_findunused", &LvlRes_findunused, 0, "find unused level resources"); /* // experimental feature? - needs to be created very early m_sys_filecache = REGISTER_INT("sys_FileCache",0,0, diff --git a/Code/CryEngine/CrySystem/SystemRender.cpp b/Code/CryEngine/CrySystem/SystemRender.cpp index 16009730b2..6e1a763759 100644 --- a/Code/CryEngine/CrySystem/SystemRender.cpp +++ b/Code/CryEngine/CrySystem/SystemRender.cpp @@ -353,15 +353,6 @@ void CSystem::RenderEnd([[maybe_unused]] bool bRenderStats, bool bMainWindow) if (!gEnv->pSystem->GetILevelSystem() || !gEnv->pSystem->GetILevelSystem()->IsLevelLoaded()) { IConsole* console = GetIConsole(); - ILyShine* lyShine = gEnv->pLyShine; - - //Normally the UI is drawn as part of the scene so it can properly render once per eye in VR - //We only want to draw here if there is no level loaded. This way the user can see loading - // UI and other information before the level is loaded. - if (lyShine != nullptr) - { - lyShine->Render(); - } //Same goes for the console. When no level is loaded, it's okay to render it outside of the renderer //so that users can load maps or change settings. @@ -390,12 +381,6 @@ void CSystem::RenderEnd([[maybe_unused]] bool bRenderStats, bool bMainWindow) void CSystem::OnScene3DEnd() { - // Render UI Canvas - if (m_bDrawUI && gEnv->pLyShine) - { - gEnv->pLyShine->Render(); - } - //Render Console if (m_bDrawConsole && gEnv->pConsole) { diff --git a/Code/CryEngine/CrySystem/UnitTests/CryMathTests.cpp b/Code/CryEngine/CrySystem/UnitTests/CryMathTests.cpp index dcf039b908..6fc9ae7830 100644 --- a/Code/CryEngine/CrySystem/UnitTests/CryMathTests.cpp +++ b/Code/CryEngine/CrySystem/UnitTests/CryMathTests.cpp @@ -20,7 +20,11 @@ namespace UnitTest : public ::testing::Test {}; +#if AZ_TRAIT_DISABLE_FAILED_MATH_TESTS + TEST_F(CryMathTestFixture, DISABLED_InverserSqrt_HasAtLeast22BitsOfAccuracy) +#else TEST_F(CryMathTestFixture, InverserSqrt_HasAtLeast22BitsOfAccuracy) +#endif { float testFloat(0.336950600); const float result = isqrt_safe_tpl(testFloat * testFloat); @@ -28,7 +32,11 @@ namespace UnitTest EXPECT_NEAR(2.96779, result, epsilon); } +#if AZ_TRAIT_DISABLE_FAILED_MATH_TESTS + TEST_F(CryMathTestFixture, DISABLED_SimdSqrt_HasAtLeast23BitsOfAccuracy) +#else TEST_F(CryMathTestFixture, SimdSqrt_HasAtLeast23BitsOfAccuracy) +#endif { float testFloat(3434.34839439); const float result = sqrt_tpl(testFloat); diff --git a/Code/CryEngine/CrySystem/UnitTests/CryPakUnitTests.cpp b/Code/CryEngine/CrySystem/UnitTests/CryPakUnitTests.cpp index 7931acae76..1935196570 100644 --- a/Code/CryEngine/CrySystem/UnitTests/CryPakUnitTests.cpp +++ b/Code/CryEngine/CrySystem/UnitTests/CryPakUnitTests.cpp @@ -55,55 +55,6 @@ namespace CryPakUnitTests } }; - TEST_F(Integ_CryPakUnitTests, TestCryPakArchiveContainingLevels) - { - AZ::IO::FileIOBase* fileIo = AZ::IO::FileIOBase::GetInstance(); - ASSERT_NE(nullptr, fileIo); - - constexpr const char* testPakPath = "@usercache@/archivecontainerlevel.pak"; - - char resolvedArchivePath[AZ_MAX_PATH_LEN] = { 0 }; - EXPECT_TRUE(fileIo->ResolvePath(testPakPath, resolvedArchivePath, AZ_MAX_PATH_LEN)); - - AZ::IO::IArchive* pak = gEnv->pCryPak; - - ASSERT_NE(nullptr, pak); - - // delete test files in case they already exist - pak->ClosePack(testPakPath); - fileIo->Remove(testPakPath); - - ILevelSystem* levelSystem = gEnv->pSystem->GetILevelSystem(); - EXPECT_NE(nullptr, levelSystem); - - // ------------ Create an archive with a dummy level in it ------------ - AZStd::intrusive_ptr pArchive = pak->OpenArchive(testPakPath, nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); - EXPECT_NE(nullptr, pArchive); - - const char levelInfoFile[] = "levelInfo.xml"; - AZStd::string relativeLevelPakPath = AZStd::string::format("levels/dummy/%s", ILevelSystem::LevelPakName); - AZStd::string relativeLevelInfoPath = AZStd::string::format("levels/dummy/%s", levelInfoFile); - - EXPECT_EQ(0, pArchive->UpdateFile(relativeLevelPakPath.c_str(), const_cast("test"), 4, AZ::IO::INestedArchive::METHOD_COMPRESS, AZ::IO::INestedArchive::LEVEL_BEST)); - EXPECT_EQ(0, pArchive->UpdateFile(relativeLevelInfoPath.c_str(), const_cast("test"), 4, AZ::IO::INestedArchive::METHOD_COMPRESS, AZ::IO::INestedArchive::LEVEL_BEST)); - - pArchive.reset(); - EXPECT_TRUE(IsPackValid(testPakPath)); - AZStd::fixed_string fullLevelPakPath; - bool addLevel = true; - EXPECT_TRUE(pak->OpenPack("@assets@", resolvedArchivePath, AZ::IO::IArchive::FLAGS_LEVEL_PAK_INSIDE_PAK, nullptr, &fullLevelPakPath, addLevel)); - - ILevelInfo* levelInfo = nullptr; - // Since the archive was open, we should be able to find the level "dummy" - levelInfo = levelSystem->GetLevelInfo("dummy"); - EXPECT_NE(nullptr, levelInfo); - EXPECT_TRUE(pak->ClosePack(resolvedArchivePath)); - - // After closing the archive we should not be able to find the level "dummy" - levelInfo = levelSystem->GetLevelInfo("dummy"); - EXPECT_EQ(nullptr, levelInfo); - } - TEST_F(Integ_CryPakUnitTests, TestCryPakModTime) { AZ::IO::FileIOBase* fileIo = AZ::IO::FileIOBase::GetInstance(); diff --git a/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.cpp b/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.cpp index 2436abf37d..72139c1da4 100644 --- a/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.cpp +++ b/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.cpp @@ -595,7 +595,7 @@ void CViewSystem::UpdateSoundListeners() } ////////////////////////////////////////////////////////////////// -void CViewSystem::OnLoadingStart([[maybe_unused]] ILevelInfo* pLevel) +void CViewSystem::OnLoadingStart([[maybe_unused]] const char* levelName) { //If the level is being restarted (IsSerializingFile() == 1) //views should not be cleared, because the main view (player one) won't be recreated in this case @@ -609,7 +609,7 @@ void CViewSystem::OnLoadingStart([[maybe_unused]] ILevelInfo* pLevel) } ///////////////////////////////////////////////////////////////////// -void CViewSystem::OnUnloadComplete([[maybe_unused]] ILevel* pLevel) +void CViewSystem::OnUnloadComplete([[maybe_unused]] const char* levelName) { bool shouldClearViews = gEnv->pSystem ? (gEnv->pSystem->IsSerializingFile() != 1) : false; diff --git a/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.h b/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.h index 06dc0b64cd..7820b5685b 100644 --- a/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.h +++ b/Code/CryEngine/CrySystem/ViewSystem/ViewSystem.h @@ -85,11 +85,11 @@ public: // ILevelSystemListener virtual void OnLevelNotFound([[maybe_unused]] const char* levelName) {}; - virtual void OnLoadingStart(ILevelInfo* pLevel); - virtual void OnLoadingComplete([[maybe_unused]] ILevel* pLevel) {}; - virtual void OnLoadingError([[maybe_unused]] ILevelInfo* pLevel, [[maybe_unused]] const char* error) {}; - virtual void OnLoadingProgress([[maybe_unused]] ILevelInfo* pLevel, [[maybe_unused]] int progressAmount) {}; - virtual void OnUnloadComplete(ILevel* pLevel); + virtual void OnLoadingStart([[maybe_unused]] const char* levelName); + virtual void OnLoadingComplete([[maybe_unused]] const char* levelName){}; + virtual void OnLoadingError([[maybe_unused]] const char* levelName, [[maybe_unused]] const char* error){}; + virtual void OnLoadingProgress([[maybe_unused]] const char* levelName, [[maybe_unused]] int progressAmount){}; + virtual void OnUnloadComplete([[maybe_unused]] const char* levelName); //~ILevelSystemListener CViewSystem(ISystem* pSystem); diff --git a/Code/CryEngine/CrySystem/XConsole.h b/Code/CryEngine/CrySystem/XConsole.h index 725013019b..ed3a3e9b82 100644 --- a/Code/CryEngine/CrySystem/XConsole.h +++ b/Code/CryEngine/CrySystem/XConsole.h @@ -170,7 +170,7 @@ public: virtual void SetScrollMax(int value); virtual void AddOutputPrintSink(IOutputPrintSink* inpSink); virtual void RemoveOutputPrintSink(IOutputPrintSink* inpSink); - virtual void ShowConsole(bool show, const int iRequestScrollMax = -1); + virtual void ShowConsole(bool show, int iRequestScrollMax = -1); virtual void DumpCVars(ICVarDumpSink* pCallback, unsigned int nFlagsFilter = 0); virtual void DumpKeyBinds(IKeyBindDumpSink* pCallback); virtual void CreateKeyBind(const char* sCmd, const char* sRes); @@ -178,7 +178,7 @@ public: virtual void SetImage(ITexture* pImage, bool bDeleteCurrent); virtual inline ITexture* GetImage() { return m_pImage; } virtual void StaticBackground(bool bStatic) { m_bStaticBackground = bStatic; } - virtual bool GetLineNo(const int indwLineNo, char* outszBuffer, const int indwBufferSize) const; + virtual bool GetLineNo(int indwLineNo, char* outszBuffer, int indwBufferSize) const; virtual int GetLineCount() const; virtual ICVar* GetCVar(const char* name); virtual char* GetVariable(const char* szVarName, const char* szFileName, const char* def_val); @@ -192,7 +192,7 @@ public: virtual bool AddCommand(const char* sCommand, ConsoleCommandFunc func, int nFlags = 0, const char* sHelp = NULL); virtual bool AddCommand(const char* sName, const char* sScriptFunc, int nFlags = 0, const char* sHelp = NULL); virtual void RemoveCommand(const char* sName); - virtual void ExecuteString(const char* command, const bool bSilentMode, const bool bDeferExecution = false); + virtual void ExecuteString(const char* command, bool bSilentMode, bool bDeferExecution = false); virtual void ExecuteConsoleCommand(const char* command) override; virtual void ResetCVarsToDefaults() override; virtual void Exit(const char* command, ...) PRINTF_PARAMS(2, 3); @@ -218,7 +218,7 @@ public: virtual void SetLoadingImage(const char* szFilename); virtual void AddConsoleVarSink(IConsoleVarSink* pSink); virtual void RemoveConsoleVarSink(IConsoleVarSink* pSink); - virtual const char* GetHistoryElement(const bool bUpOrDown); + virtual const char* GetHistoryElement(bool bUpOrDown); virtual void AddCommandToHistory(const char* szCommand); virtual void SetInputLine(const char* szLine); virtual void LoadConfigVar(const char* sVariable, const char* sValue); diff --git a/Code/CryEngine/CrySystem/XConsoleVariable.h b/Code/CryEngine/CrySystem/XConsoleVariable.h index fb42eaa49d..9c59f95711 100644 --- a/Code/CryEngine/CrySystem/XConsoleVariable.h +++ b/Code/CryEngine/CrySystem/XConsoleVariable.h @@ -221,7 +221,7 @@ public: } } - virtual void Set(const float f) + virtual void Set(float f) { stack_string s; s.Format("%g", f); @@ -235,7 +235,7 @@ public: Set(s.c_str()); } - virtual void Set(const int i) + virtual void Set(int i) { stack_string s; s.Format("%d", i); @@ -289,11 +289,11 @@ public: Set(nValue); } - virtual void Set(const float f) + virtual void Set(float f) { Set((int)f); } - virtual void Set(const int i) + virtual void Set(int i) { if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -353,15 +353,15 @@ public: Set(nValue); } - virtual void Set(const float f) + virtual void Set(float f) { Set((int)f); } - virtual void Set(const int i) + virtual void Set(int i) { Set((int64)i); } - virtual void Set(const int64 i) + virtual void Set(int64 i) { if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -439,7 +439,7 @@ public: m_pConsole->OnAfterVarChange(this); } } - virtual void Set(const float f) + virtual void Set(float f) { if (f == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -459,7 +459,7 @@ public: m_pConsole->OnAfterVarChange(this); } } - virtual void Set(const int i) + virtual void Set(int i) { if ((float)i == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -542,7 +542,7 @@ public: m_pConsole->OnAfterVarChange(this); } } - virtual void Set(const float f) + virtual void Set(float f) { if ((int)f == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -560,7 +560,7 @@ public: m_pConsole->OnAfterVarChange(this); } } - virtual void Set(const int i) + virtual void Set(int i) { if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -639,7 +639,7 @@ public: m_pConsole->OnAfterVarChange(this); } } - virtual void Set(const float f) + virtual void Set(float f) { if (f == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -657,7 +657,7 @@ public: m_pConsole->OnAfterVarChange(this); } } - virtual void Set(const int i) + virtual void Set(int i) { if ((float)i == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { @@ -742,13 +742,13 @@ public: m_pConsole->OnAfterVarChange(this); } } - virtual void Set(const float f) + virtual void Set(float f) { stack_string s; s.Format("%g", f); Set(s.c_str()); } - virtual void Set(const int i) + virtual void Set(int i) { stack_string s; s.Format("%d", i); @@ -792,7 +792,7 @@ public: virtual void DebugLog(const int iExpectedValue, const ICVar::EConsoleLogMode mode) const; - virtual void Set(const int i); + virtual void Set(int i); // ConsoleVarFunc ------------------------------------------------------------------------------------ diff --git a/Code/CryEngine/CrySystem/crysystem_files.cmake b/Code/CryEngine/CrySystem/crysystem_files.cmake index c096a710f6..23ad644041 100644 --- a/Code/CryEngine/CrySystem/crysystem_files.cmake +++ b/Code/CryEngine/CrySystem/crysystem_files.cmake @@ -178,6 +178,8 @@ set(FILES LZ4Decompressor.cpp LevelSystem/LevelSystem.cpp LevelSystem/LevelSystem.h + LevelSystem/SpawnableLevelSystem.cpp + LevelSystem/SpawnableLevelSystem.h ViewSystem/DebugCamera.cpp ViewSystem/DebugCamera.h ViewSystem/View.cpp diff --git a/Code/CryEngine/RenderDll/Common/Renderer.h b/Code/CryEngine/RenderDll/Common/Renderer.h index 92ef497393..33f2472c6c 100644 --- a/Code/CryEngine/RenderDll/Common/Renderer.h +++ b/Code/CryEngine/RenderDll/Common/Renderer.h @@ -781,8 +781,8 @@ public: #include AZ_RESTRICTED_FILE(Renderer_h) #endif - virtual void DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, const bool asciiMultiLine, const STextDrawContext& ctx) const; - virtual void RT_DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, const bool asciiMultiLine, const STextDrawContext& ctx) const = 0; + virtual void DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, bool asciiMultiLine, const STextDrawContext& ctx) const; + virtual void RT_DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, bool asciiMultiLine, const STextDrawContext& ctx) const = 0; virtual void RT_DrawLines(Vec3 v[], int nump, ColorF& col, int flags, float fGround) = 0; @@ -847,7 +847,7 @@ public: virtual void RequestFlushAllPendingTextureStreamingJobs(int nFrames) { m_nFlushAllPendingTextureStreamingJobs = nFrames; } virtual void SetTexturesStreamingGlobalMipFactor(float fFactor) { m_fTexturesStreamingGlobalMipFactor = fFactor; } - virtual void SetRendererCVar(ICVar* pCVar, const char* pArgText, const bool bSilentMode = false) = 0; + virtual void SetRendererCVar(ICVar* pCVar, const char* pArgText, bool bSilentMode = false) = 0; virtual void EF_ClearTargetsImmediately(uint32 nFlags) = 0; virtual void EF_ClearTargetsImmediately(uint32 nFlags, const ColorF& Colors, float fDepth, uint8 nStencil) = 0; @@ -935,7 +935,7 @@ public: #endif } - virtual int GetCurrentNumberOfDrawCalls([[maybe_unused]] const uint32 EFSListMask) const + virtual int GetCurrentNumberOfDrawCalls([[maybe_unused]] uint32 EFSListMask) const { int nDIPs = 0; #if defined(ENABLE_PROFILING_CODE) @@ -951,7 +951,7 @@ public: return nDIPs; } - virtual float GetCurrentDrawCallRTTimes(const uint32 EFSListMask) const + virtual float GetCurrentDrawCallRTTimes(uint32 EFSListMask) const { float fDIPTimes = 0.0f; int nThr = m_pRT->GetThreadList(); @@ -1052,8 +1052,8 @@ public: virtual unsigned int DownLoadToVideoMemoryCube(const byte* data, int w, int h, ETEX_Format eTFSrc, ETEX_Format eTFDst, int nummipmap, bool repeat = true, int filter = FILTER_BILINEAR, int Id = 0, const char* szCacheName = NULL, int flags = 0, EEndian eEndian = eLittleEndian, RectI* pRegion = NULL, bool bAsynDevTexCreation = false) = 0; virtual bool DXTCompress(const byte* raw_data, int nWidth, int nHeight, ETEX_Format eTF, bool bUseHW, bool bGenMips, int nSrcBytesPerPix, MIPDXTcallback callback); - virtual bool DXTDecompress(const byte* srcData, const size_t srcFileSize, byte* dstData, int nWidth, int nHeight, int nMips, ETEX_Format eSrcTF, bool bUseHW, int nDstBytesPerPix); - virtual bool SetGammaDelta(const float fGamma) = 0; + virtual bool DXTDecompress(const byte* srcData, size_t srcFileSize, byte* dstData, int nWidth, int nHeight, int nMips, ETEX_Format eSrcTF, bool bUseHW, int nDstBytesPerPix); + virtual bool SetGammaDelta(float fGamma) = 0; virtual void RemoveTexture(unsigned int TextureId) = 0; @@ -1598,8 +1598,8 @@ public: virtual bool EF_RenderEnvironmentCubeHDR (int size, Vec3& Pos, TArray& vecData); virtual ITexture* EF_GetTextureByID(int Id); virtual ITexture* EF_GetTextureByName(const char* name, uint32 flags = 0); - virtual ITexture* EF_LoadTexture(const char* nameTex, const uint32 flags = 0); - virtual ITexture* EF_LoadCubemapTexture(const char* nameTex, const uint32 flags = 0); + virtual ITexture* EF_LoadTexture(const char* nameTex, uint32 flags = 0); + virtual ITexture* EF_LoadCubemapTexture(const char* nameTex, uint32 flags = 0); virtual ITexture* EF_LoadDefaultTexture(const char* nameTex); virtual const SShaderProfile& GetShaderProfile(EShaderType eST) const; @@ -1627,19 +1627,19 @@ public: void EF_AddEf_NotVirtual (IRenderElement* pRE, SShaderItem& pSH, CRenderObject* pObj, const SRenderingPassInfo& passInfo, int nList, int nAW, const SRendItemSorter& rendItemSorter); // Draw all shaded REs in the list - virtual void EF_EndEf3D (const int nFlags, const int nPrecacheUpdateId, const int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo) = 0; + virtual void EF_EndEf3D (int nFlags, int nPrecacheUpdateId, int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo) = 0; - virtual void EF_InvokeShadowMapRenderJobs(const int nFlags) = 0; + virtual void EF_InvokeShadowMapRenderJobs(int nFlags) = 0; // 2d interface for shaders - virtual void EF_EndEf2D(const bool bSort) = 0; + virtual void EF_EndEf2D(bool bSort) = 0; // Dynamic lights virtual bool EF_IsFakeDLight (const CDLight* Source); virtual void EF_ADDDlight(CDLight* Source, const SRenderingPassInfo& passInfo); virtual bool EF_AddDeferredDecal(const SDeferredDecal& rDecal); - virtual uint32 EF_GetDeferredLightsNum(const eDeferredLightType eLightType = eDLT_DeferredLight); + virtual uint32 EF_GetDeferredLightsNum(eDeferredLightType eLightType = eDLT_DeferredLight); virtual int EF_AddDeferredLight(const CDLight& pLight, float fMult, const SRenderingPassInfo& passInfo, const SRendItemSorter& rendItemSorter); - virtual TArray* EF_GetDeferredLights(const SRenderingPassInfo& passInfo, const eDeferredLightType eLightType = eDLT_DeferredLight); + virtual TArray* EF_GetDeferredLights(const SRenderingPassInfo& passInfo, eDeferredLightType eLightType = eDLT_DeferredLight); SRenderLight* EF_GetDeferredLightByID(const uint16 nLightID, const eDeferredLightType eLightType = eDLT_DeferredLight); virtual void EF_ClearDeferredLightsList(); virtual void EF_ReleaseDeferredData(); @@ -1649,7 +1649,7 @@ public: void EF_CheckLightMaterial(CDLight* pLight, uint16 nRenderLightID, const SRenderingPassInfo& passInfo, const SRendItemSorter& rendItemSorter); // Water sim hits - virtual void EF_AddWaterSimHit(const Vec3& vPos, const float scale, const float strength); + virtual void EF_AddWaterSimHit(const Vec3& vPos, float scale, float strength); virtual void EF_DrawWaterSimHits(); virtual void EF_QueryImpl(ERenderQueryTypes eQuery, void* pInOut0, uint32 nInOutSize0, void* pInOut1, uint32 nInOutSize1); diff --git a/Code/CryEngine/RenderDll/Common/Textures/Texture.h b/Code/CryEngine/RenderDll/Common/Textures/Texture.h index 80131fa575..5c71f6cd9f 100644 --- a/Code/CryEngine/RenderDll/Common/Textures/Texture.h +++ b/Code/CryEngine/RenderDll/Common/Textures/Texture.h @@ -1792,7 +1792,7 @@ public: void SetWasUnload(bool bSet) { m_bWasUnloaded = bSet; } const bool IsPartiallyLoaded() const { return m_nMinMipVidUploaded != 0; } const bool IsUnloaded(void) const { return m_bWasUnloaded; } - void SetKeepSystemCopy(const bool bKeepSystemCopy) + void SetKeepSystemCopy(bool bKeepSystemCopy) { if (bKeepSystemCopy) { diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLResource.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLResource.cpp index e1dea5990b..ebaa4a02c9 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLResource.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLResource.cpp @@ -259,7 +259,7 @@ namespace NCryMetal } else if(CTexture::IsDeviceFormatTypeless(pFormat->m_eDXGIFormat)) { - //Apple recommendation -> For sRGB variant views, you don’t need the PFV flag when: - running on + //Apple recommendation -> For sRGB variant views, you don't need the PFV flag when: - running on //iOS/tvOS 12.0 or newer - running on macOS 10.15 or newer //However, on older OSs (and in macOS case, older GPUs) you are still required to set the flag. #if defined(AZ_COMPILER_CLANG) && AZ_COMPILER_CLANG >= 9 //@available was added in Xcode 9 diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.cpp index 8b21951319..49d08604f2 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.cpp @@ -443,7 +443,6 @@ void CD3D9Renderer::InitRenderer() CV_capture_frames = 0; CV_capture_folder = 0; - CV_capture_file_format = 0; CV_capture_buffer = 0; m_NewViewport.fMinZ = 0; @@ -1830,8 +1829,10 @@ bool CD3D9Renderer::PrepFrameCapture(FrameBufferDescription& frameBufDesc, CText HRESULT hrZ = GetDevice().CreateTexture2D(&tmpZdesc, NULL, &frameBufDesc.tempZtex); D3D11_MAPPED_SUBRESOURCE zMappedResource; - - frameBufDesc.includeAlpha = ((CV_capture_buffer->GetIVal() == ICaptureKey::ColorWithAlpha) && frameBufDesc.tempZtex && (tmpZdesc.Width == frameBufDesc.backBufferDesc.Width) && (tmpZdesc.Height == frameBufDesc.backBufferDesc.Height)); + + // default to includeAlpha 'on' + frameBufDesc.includeAlpha = frameBufDesc.tempZtex && tmpZdesc.Width == frameBufDesc.backBufferDesc.Width && + tmpZdesc.Height == frameBufDesc.backBufferDesc.Height; if (frameBufDesc.includeAlpha) { @@ -2095,7 +2096,7 @@ bool CD3D9Renderer::InternalSaveToTIFF(ID3D11Texture2D* backBuffer, const char* void CD3D9Renderer::CacheCaptureCVars() { // cache console vars - if (!CV_capture_frames || !CV_capture_folder || !CV_capture_file_format || !CV_capture_frame_once || + if (!CV_capture_frames || !CV_capture_folder || !CV_capture_frame_once || !CV_capture_file_name || !CV_capture_file_prefix || !CV_capture_buffer) { ISystem* pSystem(GetISystem()); @@ -2112,7 +2113,6 @@ void CD3D9Renderer::CacheCaptureCVars() CV_capture_frames = !CV_capture_frames ? pConsole->GetCVar("capture_frames") : CV_capture_frames; CV_capture_folder = !CV_capture_folder ? pConsole->GetCVar("capture_folder") : CV_capture_folder; - CV_capture_file_format = !CV_capture_file_format ? pConsole->GetCVar("capture_file_format") : CV_capture_file_format; CV_capture_frame_once = !CV_capture_frame_once ? pConsole->GetCVar("capture_frame_once") : CV_capture_frame_once; CV_capture_file_name = !CV_capture_file_name ? pConsole->GetCVar("capture_file_name") : CV_capture_file_name; CV_capture_file_prefix = !CV_capture_file_prefix ? pConsole->GetCVar("capture_file_prefix") : CV_capture_file_prefix; @@ -2125,7 +2125,7 @@ void CD3D9Renderer::CaptureFrameBuffer() CDebugAllowFileAccess ignoreInvalidFileAccess; CacheCaptureCVars(); - if (!CV_capture_frames || !CV_capture_folder || !CV_capture_file_format || !CV_capture_frame_once || + if (!CV_capture_frames || !CV_capture_folder || !CV_capture_frame_once || !CV_capture_file_name || !CV_capture_file_prefix || !CV_capture_buffer) { return; @@ -2156,7 +2156,7 @@ void CD3D9Renderer::CaptureFrameBuffer() } size_t pathLen = strlen(path); - snprintf(&path[pathLen], sizeof(path) - 1 - pathLen, "\\%s%06d.%s", prefix, frameNum - 1, CV_capture_file_format->GetString()); + snprintf(&path[pathLen], sizeof(path) - 1 - pathLen, "\\%s%06d.%s", prefix, frameNum - 1, "jpg"); } if (CV_capture_frame_once->GetIVal()) diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.h b/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.h index 716d5d03e1..01f855283b 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DriverD3D.h @@ -852,7 +852,7 @@ public: bool EF_PrepareShadowGenForLight(SRenderLight* pLight, int nLightID); bool PrepareShadowGenForFrustum(ShadowMapFrustum* pCurFrustum, SRenderLight* pLight, int nLightFrustumID = 0, int nLOD = 0); void PrepareShadowGenForFrustumNonJobs(const int nFlags); - virtual void EF_InvokeShadowMapRenderJobs(const int nFlags); + virtual void EF_InvokeShadowMapRenderJobs(int nFlags); void InvokeShadowMapRenderJobs(ShadowMapFrustum* pCurFrustum, const SRenderingPassInfo& passInfo); void StartInvokeShadowMapRenderJobs(ShadowMapFrustum* pCurFrustum, const SRenderingPassInfo& passInfo); @@ -989,7 +989,7 @@ public: virtual void RT_ReleaseCB(void* pCB); virtual void RT_DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, uint32 nVerts, uint32 nInds, const PublicRenderPrimitiveType nPrimType); virtual void RT_DrawDynVBUI(SVF_P2F_C4B_T2F_F4B* pBuf, uint16* pInds, uint32 nVerts, uint32 nInds, const PublicRenderPrimitiveType nPrimType); - virtual void RT_DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, const bool asciiMultiLine, const STextDrawContext& ctx) const; + virtual void RT_DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, bool asciiMultiLine, const STextDrawContext& ctx) const; virtual void RT_DrawLines(Vec3 v[], int nump, ColorF& col, int flags, float fGround); virtual void RT_Draw2dImage(float xpos, float ypos, float w, float h, CTexture* pTexture, float s0, float t0, float s1, float t1, float angle, DWORD col, float z); virtual void RT_Draw2dImageStretchMode(bool bStretch); @@ -1112,7 +1112,7 @@ public: void DrawLines(Vec3 v[], int nump, ColorF& col, int flags, float fGround); virtual void Graph(byte* g, int x, int y, int wdt, int hgt, int nC, int type, const char* text, ColorF& color, float fScale); - virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, const PublicRenderPrimitiveType nPrimType); + virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, PublicRenderPrimitiveType nPrimType); virtual void DrawDynUiPrimitiveList(DynUiPrimitiveList& primitives, int totalNumVertices, int totalNumIndices); virtual void PrintResourcesLeaks(); @@ -1159,7 +1159,7 @@ public: virtual void ReadFrameBuffer(unsigned char* pRGB, int nImageX, int nSizeX, int nSizeY, ERB_Type eRBType, bool bRGBA, int nScaledX = -1, int nScaledY = -1); virtual void ReadFrameBufferFast(uint32* pDstARGBA8, int dstWidth, int dstHeight, bool BGRA = true); - virtual void SetRendererCVar(ICVar* pCVar, const char* pArgText, const bool bSilentMode = false); + virtual void SetRendererCVar(ICVar* pCVar, const char* pArgText, bool bSilentMode = false); ///////////////////////////////////////////////////////////////////////////////////////////////////// // This routines uses 2 destination surfaces. It triggers a backbuffer copy to one of its surfaces, @@ -1267,7 +1267,7 @@ public: virtual int ScreenToTexture(int nTexID); - virtual bool SetGammaDelta(const float fGamma); + virtual bool SetGammaDelta(float fGamma); ////////////////////////////////////////////////////////////////////// // Replacement functions for the Font engine @@ -1871,7 +1871,7 @@ public: } // This is a cross-platform low-level function for DIP call - ILINE void FX_DrawPrimitive(const eRenderPrimitiveType eType, const int nStartVertex, const int nVerticesCount, const int nInstanceVertices = 0) + ILINE void FX_DrawPrimitive(eRenderPrimitiveType eType, int nStartVertex, int nVerticesCount, int nInstanceVertices = 0) { int nPrimitives; if (nInstanceVertices) @@ -2046,8 +2046,8 @@ public: void EF_PrintProfileInfo(); - virtual void EF_EndEf3D (const int nFlags, const int nPrecacheUpdateId, const int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo); - virtual void EF_EndEf2D(const bool bSort); // 2d only + virtual void EF_EndEf3D (int nFlags, int nPrecacheUpdateId, int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo); + virtual void EF_EndEf2D(bool bSort); // 2d only virtual WIN_HWND GetHWND() { return m_hWnd; } virtual bool SetWindowIcon(const char* path); @@ -2268,7 +2268,6 @@ private: ICVar* CV_capture_frames; ICVar* CV_capture_folder; ICVar* CV_capture_buffer; - ICVar* CV_capture_file_format; ICVar* CV_capture_frame_once; ICVar* CV_capture_file_name; ICVar* CV_capture_file_prefix; diff --git a/Code/CryEngine/RenderDll/XRenderNULL/NULL_Renderer.h b/Code/CryEngine/RenderDll/XRenderNULL/NULL_Renderer.h index deb6483f3c..dd7dd468cc 100644 --- a/Code/CryEngine/RenderDll/XRenderNULL/NULL_Renderer.h +++ b/Code/CryEngine/RenderDll/XRenderNULL/NULL_Renderer.h @@ -47,7 +47,7 @@ public: virtual SDepthTexture* FX_GetDepthSurface([[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] bool bAA, [[maybe_unused]] bool shaderResourceView = false) override { return nullptr; } virtual long FX_SetIStream([[maybe_unused]] const void* pB, [[maybe_unused]] uint32 nOffs, [[maybe_unused]] RenderIndexType idxType) override { return -1; } virtual long FX_SetVStream([[maybe_unused]] int nID, [[maybe_unused]] const void* pB, [[maybe_unused]] uint32 nOffs, [[maybe_unused]] uint32 nStride, [[maybe_unused]] uint32 nFreq = 1) override { return -1; } - virtual void FX_DrawPrimitive([[maybe_unused]] const eRenderPrimitiveType eType, [[maybe_unused]] const int nStartVertex, [[maybe_unused]] const int nVerticesCount, [[maybe_unused]] const int nInstanceVertices = 0) {} + virtual void FX_DrawPrimitive([[maybe_unused]] eRenderPrimitiveType eType, [[maybe_unused]] int nStartVertex, [[maybe_unused]] int nVerticesCount, [[maybe_unused]] int nInstanceVertices = 0) {} virtual void DrawQuad3D([[maybe_unused]] const Vec3& v0, [[maybe_unused]] const Vec3& v1, [[maybe_unused]] const Vec3& v2, [[maybe_unused]] const Vec3& v3, [[maybe_unused]] const ColorF& color, [[maybe_unused]] float ftx0, [[maybe_unused]] float fty0, [[maybe_unused]] float ftx1, [[maybe_unused]] float fty1) override {} virtual void FX_ClearTarget(ITexture* pTex) override; virtual void FX_ClearTarget(SDepthTexture* pTex) override; @@ -97,7 +97,7 @@ public: virtual void SetRenderTile([[maybe_unused]] f32 nTilesPosX, [[maybe_unused]] f32 nTilesPosY, [[maybe_unused]] f32 nTilesGridSizeX, [[maybe_unused]] f32 nTilesGridSizeY) {} - virtual void EF_InvokeShadowMapRenderJobs([[maybe_unused]] const int nFlags){} + virtual void EF_InvokeShadowMapRenderJobs([[maybe_unused]] int nFlags){} //! Fills array of all supported video formats (except low resolution formats) //! Returns number of formats, also when called with NULL virtual int EnumDisplayFormats(SDispFormat* Formats); @@ -128,7 +128,7 @@ public: virtual void Reset (void) {}; virtual void RT_ReleaseCB(void*){} - virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, const PublicRenderPrimitiveType nPrimType); + virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, PublicRenderPrimitiveType nPrimType); virtual void DrawDynUiPrimitiveList(DynUiPrimitiveList& primitives, int totalNumVertices, int totalNumIndices); virtual void DrawBuffer(CVertexBuffer* pVBuf, CIndexBuffer* pIBuf, int nNumIndices, int nOffsIndex, const PublicRenderPrimitiveType nPrmode, int nVertStart = 0, int nVertStop = 0); @@ -177,7 +177,7 @@ public: virtual unsigned int DownLoadToVideoMemory3D([[maybe_unused]] const byte* data, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] int d, [[maybe_unused]] ETEX_Format eTFSrc, [[maybe_unused]] ETEX_Format eTFDst, [[maybe_unused]] int nummipmap, [[maybe_unused]] bool repeat = true, [[maybe_unused]] int filter = FILTER_BILINEAR, [[maybe_unused]] int Id = 0, [[maybe_unused]] const char* szCacheName = NULL, [[maybe_unused]] int flags = 0, [[maybe_unused]] EEndian eEndian = eLittleEndian, [[maybe_unused]] RectI* pRegion = NULL, [[maybe_unused]] bool bAsynDevTexCreation = false) { return 0; } virtual void UpdateTextureInVideoMemory([[maybe_unused]] uint32 tnum, [[maybe_unused]] const byte* newdata, [[maybe_unused]] int posx, [[maybe_unused]] int posy, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] ETEX_Format eTFSrc = eTF_R8G8B8A8, [[maybe_unused]] int posz = 0, [[maybe_unused]] int sizez = 1){} - virtual bool SetGammaDelta(const float fGamma); + virtual bool SetGammaDelta(float fGamma); virtual void RestoreGamma(void) {}; virtual void RemoveTexture([[maybe_unused]] unsigned int TextureId) {} @@ -238,7 +238,7 @@ public: virtual void GetProjectionMatrix(float* mat); //for texture - virtual ITexture* EF_LoadTexture(const char* nameTex, const uint32 flags = 0); + virtual ITexture* EF_LoadTexture(const char* nameTex, uint32 flags = 0); virtual ITexture* EF_LoadDefaultTexture(const char* nameTex); virtual void DrawQuad(const Vec3& right, const Vec3& up, const Vec3& origin, int nFlipMode = 0); @@ -298,10 +298,10 @@ public: virtual bool EF_SetLightHole(Vec3 vPos, Vec3 vNormal, int idTex, float fScale = 1.0f, bool bAdditive = true); // Draw all shaded REs in the list - virtual void EF_EndEf3D (const int nFlags, const int nPrecacheUpdateId, const int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo); + virtual void EF_EndEf3D (int nFlags, int nPrecacheUpdateId, int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo); // 2d interface for shaders - virtual void EF_EndEf2D(const bool bSort); + virtual void EF_EndEf2D(bool bSort); virtual bool EF_PrecacheResource(SShaderItem* pSI, float fMipFactor, float fTimeToReady, int Flags, int nUpdateId, int nCounter); virtual bool EF_PrecacheResource(ITexture* pTP, float fDist, float fTimeToReady, int Flags, int nUpdateId, int nCounter); virtual void PrecacheResources(); @@ -380,7 +380,7 @@ public: virtual void RT_DrawDynVB([[maybe_unused]] int Pool, [[maybe_unused]] uint32 nVerts) {} virtual void RT_DrawDynVB([[maybe_unused]] SVF_P3F_C4B_T2F* pBuf, [[maybe_unused]] uint16* pInds, [[maybe_unused]] uint32 nVerts, [[maybe_unused]] uint32 nInds, [[maybe_unused]] const PublicRenderPrimitiveType nPrimType) {} virtual void RT_DrawDynVBUI([[maybe_unused]] SVF_P2F_C4B_T2F_F4B* pBuf, [[maybe_unused]] uint16* pInds, [[maybe_unused]] uint32 nVerts, [[maybe_unused]] uint32 nInds, [[maybe_unused]] const PublicRenderPrimitiveType nPrimType) {} - virtual void RT_DrawStringU([[maybe_unused]] IFFont_RenderProxy* pFont, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z, [[maybe_unused]] const char* pStr, [[maybe_unused]] const bool asciiMultiLine, [[maybe_unused]] const STextDrawContext& ctx) const {} + virtual void RT_DrawStringU([[maybe_unused]] IFFont_RenderProxy* pFont, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z, [[maybe_unused]] const char* pStr, [[maybe_unused]] bool asciiMultiLine, [[maybe_unused]] const STextDrawContext& ctx) const {} virtual void RT_DrawLines([[maybe_unused]] Vec3 v[], [[maybe_unused]] int nump, [[maybe_unused]] ColorF& col, [[maybe_unused]] int flags, [[maybe_unused]] float fGround) {} virtual void RT_Draw2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] CTexture* pTexture, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] DWORD col, [[maybe_unused]] float z) {} virtual void RT_Push2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] CTexture* pTexture, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] DWORD col, [[maybe_unused]] float z, [[maybe_unused]] float stereoDepth) {} @@ -402,7 +402,7 @@ public: virtual void RT_SetViewport([[maybe_unused]] int x, [[maybe_unused]] int y, [[maybe_unused]] int width, [[maybe_unused]] int height, [[maybe_unused]] int id) {}; virtual void RT_SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] const bool bSilentMode = false) {}; - virtual void SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] const bool bSilentMode = false) {}; + virtual void SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] bool bSilentMode = false) {}; virtual void SetMatrices([[maybe_unused]] float* pProjMat, [[maybe_unused]] float* pViewMat) {} diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp index ccc87c990c..aa9af89457 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp @@ -107,15 +107,9 @@ namespace AZ result = ContinueLoading(&id, azrtti_typeid(), it->value, context); if (!id.m_guid.IsNull()) { - if (instance->Create(id)) - { - result.Combine(context.Report(result, "Successfully created Asset.")); - } - else - { - result.Combine(context.Report(JSR::Tasks::Convert, JSR::Outcomes::Unknown, - "The asset id was successfully read, but creating an Asset instance from it failed.")); - } + *instance = Asset(id, instance->GetType()); + + result.Combine(context.Report(result, "Successfully created Asset with id.")); } else if (result.GetProcessing() == JSR::Processing::Completed) { diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp index 0b783239c7..f4caaa6095 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp @@ -48,6 +48,7 @@ #include #include +#include #include #include @@ -434,6 +435,7 @@ namespace AZ // Merge the bootstrap.cfg file into the Settings Registry as soon as the OSAllocator has been created. SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(*m_settingsRegistry); + SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(*m_settingsRegistry, AZ_TRAIT_OS_PLATFORM_CODENAME, {}); SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(*m_settingsRegistry, m_commandLine, executeRegDumpCommands); SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*m_settingsRegistry); @@ -888,17 +890,19 @@ namespace AZ SettingsRegistryMergeUtils::MergeSettingsToRegistry_TargetBuildDependencyRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); #if defined(AZ_DEBUG_BUILD) || defined(AZ_PROFILE_BUILD) - // In development builds apply the developer registry and the command line to allow early overrides. This will + // In development builds apply the o3de registry and the command line to allow early overrides. This will // allow developers to override things like default paths or Asset Processor connection settings. Any additional // values will be replaced by later loads, so this step will happen again at the end of loading. - SettingsRegistryMergeUtils::MergeSettingsToRegistry_UserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(registry, m_commandLine, false); #endif SettingsRegistryMergeUtils::MergeSettingsToRegistry_EngineRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); SettingsRegistryMergeUtils::MergeSettingsToRegistry_GemRegistries(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); #if defined(AZ_DEBUG_BUILD) || defined(AZ_PROFILE_BUILD) - SettingsRegistryMergeUtils::MergeSettingsToRegistry_UserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(registry, m_commandLine, true); #endif } @@ -1455,6 +1459,8 @@ namespace AZ PolygonPrismReflect(context); // reflect name dictionary. Name::Reflect(context); + // reflect path + IO::PathReflection::Reflect(context); // reflect the SettingsRegistryInterface, SettignsRegistryImpl and the global Settings Registry // instance (AZ::SettingsRegistry::Get()) into the Behavior Context diff --git a/Code/Framework/AzCore/AzCore/Component/Entity.cpp b/Code/Framework/AzCore/AzCore/Component/Entity.cpp index ed1bd732d0..77af9e4ffa 100644 --- a/Code/Framework/AzCore/AzCore/Component/Entity.cpp +++ b/Code/Framework/AzCore/AzCore/Component/Entity.cpp @@ -96,6 +96,11 @@ namespace AZ } Entity::~Entity() + { + Reset(); + } + + void Entity::Reset() { AZ_Assert(m_state != State::Activating && m_state != State::Deactivating && m_state != State::Initializing, "Unsafe to delete an entity during its state transition."); if (m_state == State::Active) @@ -116,6 +121,8 @@ namespace AZ delete *it; } + m_components.clear(); + if (m_state == State::Init) { EBUS_EVENT(EntitySystemBus, OnEntityDestroyed, m_id); @@ -751,6 +758,8 @@ namespace AZ ->Field("IsRuntimeActive", &Entity::m_isRuntimeActiveByDefault) ; + serializeContext->RegisterGenericType>(); + serializeContext->Class() ->Version(1, &EntityIdConverter) ->Field("id", &EntityId::m_id); diff --git a/Code/Framework/AzCore/AzCore/Component/Entity.h b/Code/Framework/AzCore/AzCore/Component/Entity.h index 8706025300..b8c8782ebf 100644 --- a/Code/Framework/AzCore/AzCore/Component/Entity.h +++ b/Code/Framework/AzCore/AzCore/Component/Entity.h @@ -118,6 +118,9 @@ namespace AZ //! If the entity is in a transition state, this function asserts. virtual ~Entity(); + //! Resets the state to default + void Reset(); + //! Gets the ID of the entity. //! @return The ID of the entity. EntityId GetId() const { return m_id; } diff --git a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp index c6b7d87861..07e371c1ab 100644 --- a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp +++ b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp @@ -10,6 +10,7 @@ * */ +#include #include #include #include @@ -62,11 +63,17 @@ namespace AZ } { + AZStd::unordered_map componentMap; JSR::ResultCode componentLoadResult = - ContinueLoadingFromJsonObjectField(&entityInstance->m_components, - azrtti_typeidm_components)>(), + ContinueLoadingFromJsonObjectField(&componentMap, + azrtti_typeid(), inputValue, "Components", context); + for (auto& [componentKey, component] : componentMap) + { + entityInstance->m_components.emplace_back(component); + } + result.Combine(componentLoadResult); } @@ -145,9 +152,21 @@ namespace AZ const AZ::Entity::ComponentArrayType* defaultComponents = defaultEntityInstance ? &defaultEntityInstance->m_components : nullptr; + AZStd::unordered_map componentMap; + AZStd::unordered_map defaultComponentMap; + + ConvertComponentVectorToMap(*components, componentMap); + + if (defaultComponents) + { + ConvertComponentVectorToMap(*defaultComponents, defaultComponentMap); + } + JSR::ResultCode resultComponents = ContinueStoringToJsonObjectField(outputValue, "Components", - components, defaultComponents, azrtti_typeidm_components)>(), context); + &componentMap, + defaultComponents ? &defaultComponentMap : nullptr, + azrtti_typeid(), context); result.Combine(resultComponents); } @@ -183,4 +202,16 @@ namespace AZ result.GetProcessing() == JSR::Processing::Halted ? "Successfully stored Entity information." : "Failed to store Entity information."); } + + void JsonEntitySerializer::ConvertComponentVectorToMap(const AZ::Entity::ComponentArrayType& components, + AZStd::unordered_map& componentMapOut) + { + for (AZ::Component* component : components) + { + if (component) + { + componentMapOut.emplace(AZStd::string::format("Component_[%llu]", component->GetId()), component); + } + } + } } diff --git a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.h b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.h index 84faf11a32..32dbb9ae89 100644 --- a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.h +++ b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.h @@ -29,5 +29,9 @@ namespace AZ JsonSerializationResult::Result Store(rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue, const Uuid& valueTypeId, JsonSerializerContext& context) override; + + private: + void ConvertComponentVectorToMap(const AZ::Entity::ComponentArrayType& components, + AZStd::unordered_map& componentMapOut); }; } diff --git a/Code/Framework/AzCore/AzCore/Console/Console.cpp b/Code/Framework/AzCore/AzCore/Console/Console.cpp index 3701f35f8d..788a127830 100644 --- a/Code/Framework/AzCore/AzCore/Console/Console.cpp +++ b/Code/Framework/AzCore/AzCore/Console/Console.cpp @@ -196,7 +196,7 @@ namespace AZ return nullptr; } - AZStd::string Console::AutoCompleteCommand(const char* command) + AZStd::string Console::AutoCompleteCommand(const char* command, AZStd::vector* matches) { const size_t commandLength = strlen(command); @@ -219,6 +219,10 @@ namespace AZ { AZLOG_INFO("- %s : %s\n", curr->m_name, curr->m_desc); commandSubset.push_back(curr->m_name); + if (matches) + { + matches->push_back(curr->m_name); + } } } @@ -283,6 +287,12 @@ namespace AZ AZ_Assert(false, "Mismatched console functor types registered under the same name"); return; } + + // Discard duplicate functors if the 'DontDuplicate' flag has been set + if ((front->GetFlags() & ConsoleFunctorFlags::DontDuplicate) != ConsoleFunctorFlags::Null) + { + return; + } } } m_commands[lowerName].emplace_back(functor); diff --git a/Code/Framework/AzCore/AzCore/Console/Console.h b/Code/Framework/AzCore/AzCore/Console/Console.h index 6942ebb086..1c9c6897f6 100644 --- a/Code/Framework/AzCore/AzCore/Console/Console.h +++ b/Code/Framework/AzCore/AzCore/Console/Console.h @@ -62,7 +62,7 @@ namespace AZ void ExecuteCommandLine(const AZ::CommandLine& commandLine) override; bool HasCommand(const char* command) override; ConsoleFunctorBase* FindCommand(const char* command) override; - AZStd::string AutoCompleteCommand(const char* command) override; + AZStd::string AutoCompleteCommand(const char* command, AZStd::vector* matches = nullptr) override; void VisitRegisteredFunctors(const FunctorVisitor& visitor) override; void RegisterFunctor(ConsoleFunctorBase* functor) override; void UnregisterFunctor(ConsoleFunctorBase* functor) override; diff --git a/Code/Framework/AzCore/AzCore/Console/IConsole.h b/Code/Framework/AzCore/AzCore/Console/IConsole.h index 56f2ab6840..9f5ede7f4c 100644 --- a/Code/Framework/AzCore/AzCore/Console/IConsole.h +++ b/Code/Framework/AzCore/AzCore/Console/IConsole.h @@ -17,6 +17,7 @@ #include #include #include +#include #include namespace AZ @@ -103,10 +104,13 @@ namespace AZ //! @return non-null pointer to the console command if found virtual ConsoleFunctorBase* FindCommand(const char* command) = 0; - //! Prints all commands of which the input is a prefix. - //! @param command the prefix string to dump all matching commands for - //! @return boolean true on success, false otherwise - virtual AZStd::string AutoCompleteCommand(const char* command) = 0; + //! Finds all commands where the input command is a prefix and returns + //! the longest matching substring prefix the results have in common. + //! @param command The prefix string to find all matching commands for. + //! @param matches The list of all commands that match the input prefix. + //! @return The longest matching substring prefix the results have in common. + virtual AZStd::string AutoCompleteCommand(const char* command, + AZStd::vector* matches = nullptr) = 0; //! Retrieves the value of the requested cvar. //! @param command the name of the cvar to find and retrieve the current value of @@ -233,7 +237,7 @@ static constexpr AZ::ThreadSafety ConsoleThreadSafety<_TYPE, std::enable_if_t Functor##_FUNCTION(#_FUNCTION, _DESC, _FLAGS, AZ::TypeId::CreateNull(), &_FUNCTION) + inline AZ::ConsoleFunctor Functor##_FUNCTION(#_FUNCTION, _DESC, _FLAGS | AZ::ConsoleFunctorFlags::DontDuplicate, AZ::TypeId::CreateNull(), &_FUNCTION) //! Implements a console functor for a non-member function. //! @@ -243,6 +247,6 @@ static constexpr AZ::ThreadSafety ConsoleThreadSafety<_TYPE, std::enable_if_t Functor##_FUNCTION(#_FUNCTION, _DESC, _FLAGS, AZ::TypeId::CreateNull(), &_FUNCTION) + inline AZ::ConsoleFunctor Functor##_FUNCTION(#_FUNCTION, _DESC, _FLAGS | AZ::ConsoleFunctorFlags::DontDuplicate, AZ::TypeId::CreateNull(), &_FUNCTION) #define AZ_CONSOLEFREEFUNC(...) AZ_MACRO_SPECIALIZE(AZ_CONSOLEFREEFUNC_, AZ_VA_NUM_ARGS(__VA_ARGS__), (__VA_ARGS__)) diff --git a/Code/Framework/AzCore/AzCore/Console/IConsoleTypes.h b/Code/Framework/AzCore/AzCore/Console/IConsoleTypes.h index 76d21baa83..09d8f35385 100644 --- a/Code/Framework/AzCore/AzCore/Console/IConsoleTypes.h +++ b/Code/Framework/AzCore/AzCore/Console/IConsoleTypes.h @@ -55,6 +55,7 @@ namespace AZ , IsDeprecated = (1 << 5) // Command is deprecated, show a warning when invoked , NeedsReload = (1 << 6) // Level should be reloaded after executing this command , AllowClientSet = (1 << 7) // Allow clients to modify this cvar even in release (this alters the cvar for all connected servers and clients, be VERY careful enabling this flag) + , DontDuplicate = (1 << 8) // Discard functors with the same name as another that has already been registered instead of duplicating them (which is the default behavior) }; AZ_DEFINE_ENUM_BITWISE_OPERATORS(ConsoleFunctorFlags); diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.cpp b/Code/Framework/AzCore/AzCore/IO/Path/Path.cpp index 9504a828c9..34c35b17ba 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path.cpp +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.cpp @@ -11,6 +11,7 @@ */ #include +#include // Explicit instantations of our support Path classes namespace AZ::IO @@ -53,4 +54,13 @@ namespace AZ::IO const PathIterator& rhs); template bool operator!=(const PathIterator& lhs, const PathIterator& rhs); + + void PathReflection::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Field("m_path", &AZ::IO::Path::m_path); + } + } } diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.h b/Code/Framework/AzCore/AzCore/IO/Path/Path.h index 97f528d1dc..28e6854e60 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path.h +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.h @@ -300,6 +300,7 @@ namespace AZ::IO using const_iterator = const PathIterator; using iterator = const_iterator; friend PathIterator; + friend struct PathReflection; // constructors and destructor constexpr BasicPath() = default; @@ -631,6 +632,11 @@ namespace AZ::IO constexpr BasicPath operator/(const BasicPath& lhs, const typename BasicPath::value_type* rhs); } +namespace AZ +{ + AZ_TYPE_INFO_SPECIALIZE(AZ::IO::Path, "{88E0A40F-3085-4CAB-8B11-EF5A2659C71A}"); +} + namespace AZ::IO { //! Path iterator that allows traversal of the path elements diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path_fwd.h b/Code/Framework/AzCore/AzCore/IO/Path/Path_fwd.h index df572f5574..37dfb9bf4a 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path_fwd.h +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path_fwd.h @@ -31,6 +31,11 @@ namespace AZStd struct hash; } +namespace AZ +{ + class ReflectContext; +} + namespace AZ::IO { //! Path Constants @@ -56,6 +61,11 @@ namespace AZ::IO // It depends on the path type template class PathIterator; + + struct PathReflection + { + static void Reflect(AZ::ReflectContext* context); + }; } namespace AZStd diff --git a/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerComponent.cpp b/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerComponent.cpp index 6be07f35ed..37b3572dee 100644 --- a/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerComponent.cpp +++ b/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerComponent.cpp @@ -68,9 +68,11 @@ namespace AZ bool useAllHardware = true; settingsRegistry->Get(useAllHardware, "/Amazon/AzCore/Streamer/UseAllHardware"); + bool reportHardware = true; + settingsRegistry->Get(reportHardware, "/Amazon/AzCore/Streamer/ReportHardware"); AZ::IO::HardwareInformation hardwareInfo; - if (!AZ::IO::CollectIoHardwareInformation(hardwareInfo, useAllHardware)) + if (!AZ::IO::CollectIoHardwareInformation(hardwareInfo, useAllHardware, reportHardware)) { AZ_Assert(false, "Unable to collect information on available IO hardware."); return CreateSimpleStreamerStack(); diff --git a/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerConfiguration.h b/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerConfiguration.h index f66981bd0d..e2b3d896d9 100644 --- a/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerConfiguration.h +++ b/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerConfiguration.h @@ -42,8 +42,8 @@ namespace AZ::IO AZStd::string m_profile{"Default"}; size_t m_maxPhysicalSectorSize{ AZCORE_GLOBAL_NEW_ALIGNMENT }; size_t m_maxLogicalSectorSize{ AZCORE_GLOBAL_NEW_ALIGNMENT }; - size_t m_maxPageSize{ 0 }; - size_t m_maxTransfer{ 0 }; + size_t m_maxPageSize{ AZCORE_GLOBAL_NEW_ALIGNMENT }; + size_t m_maxTransfer{ AZCORE_GLOBAL_NEW_ALIGNMENT }; }; class IStreamerStackConfig @@ -73,7 +73,8 @@ namespace AZ::IO //! @param includeAllHardware Includes all available hardware that can be used by AZ::IO::Streamer. If set to false //! only hardware is listed that is known to be used. This may be more performant, but can result is file //! requests failing if they use an previously unknown path. - extern bool CollectIoHardwareInformation(HardwareInformation& info, bool includeAllHardware); + //! @param reportHardware If true, hardware information will be printed to the log if available. + extern bool CollectIoHardwareInformation(HardwareInformation& info, bool includeAllHardware, bool reportHardware); extern void ReflectNative(ReflectContext* context); //! Constant used to denote "file not found" in StreamStackEntry processing. diff --git a/Code/Framework/AzCore/AzCore/Math/MathReflection.cpp b/Code/Framework/AzCore/AzCore/Math/MathReflection.cpp index 06bc5de92a..d97a69c3cb 100644 --- a/Code/Framework/AzCore/AzCore/Math/MathReflection.cpp +++ b/Code/Framework/AzCore/AzCore/Math/MathReflection.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -370,6 +371,7 @@ namespace AZ context.Serializer()->HandlesType(); context.Serializer()->HandlesType(); context.Serializer()->HandlesType(); + context.Serializer()->HandlesType(); } void MathReflect(ReflectContext* context) diff --git a/Code/Framework/AzCore/AzCore/Math/TransformSerializer.cpp b/Code/Framework/AzCore/AzCore/Math/TransformSerializer.cpp new file mode 100644 index 0000000000..0a3e02ee0d --- /dev/null +++ b/Code/Framework/AzCore/AzCore/Math/TransformSerializer.cpp @@ -0,0 +1,143 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include +#include + +namespace AZ +{ + AZ_CLASS_ALLOCATOR_IMPL(JsonTransformSerializer, AZ::SystemAllocator, 0); + + JsonSerializationResult::Result JsonTransformSerializer::Load( + void* outputValue, [[maybe_unused]] const Uuid& outputValueTypeId, const rapidjson::Value& inputValue, + JsonDeserializerContext& context) + { + namespace JSR = JsonSerializationResult; + + if (azrtti_typeid() != outputValueTypeId) + { + return context.Report( + JSR::Tasks::ReadField, JSR::Outcomes::Unsupported, + "Unable to deserialize Transform from json because the outputValueTypeId isn't a Transform type."); + } + + AZ::Transform* transformInstance = reinterpret_cast(outputValue); + AZ_Assert(transformInstance, "Output value for JsonTransformSerializer can't be null."); + + JSR::ResultCode result(JSR::Tasks::ReadField); + + { + AZ::Vector3 translation = transformInstance->GetTranslation(); + + JSR::ResultCode loadResult = ContinueLoadingFromJsonObjectField( + &translation, azrtti_typeid(), inputValue, TranslationTag, context); + + result.Combine(loadResult); + + transformInstance->SetTranslation(translation); + } + + { + AZ::Quaternion rotation = transformInstance->GetRotation(); + + JSR::ResultCode loadResult = + ContinueLoadingFromJsonObjectField(&rotation, azrtti_typeid(), inputValue, RotationTag, context); + + result.Combine(loadResult); + + transformInstance->SetRotation(rotation); + } + + { + // Scale is transitioning to a single uniform scale value, but since it's still internally represented as a Vector3, + // we need to pick one number to use for load/store operations. + float scale = transformInstance->GetScale().GetMaxElement(); + + JSR::ResultCode loadResult = + ContinueLoadingFromJsonObjectField(&scale, azrtti_typeid(), inputValue, ScaleTag, context); + + result.Combine(loadResult); + + transformInstance->SetScale(AZ::Vector3(scale)); + } + + return context.Report( + result, + result.GetProcessing() != JSR::Processing::Halted ? "Succesfully loaded Transform information." + : "Failed to load Transform information."); + } + + JsonSerializationResult::Result JsonTransformSerializer::Store( + rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue, [[maybe_unused]] const Uuid& valueTypeId, + JsonSerializerContext& context) + { + namespace JSR = AZ::JsonSerializationResult; + + if (azrtti_typeid() != valueTypeId) + { + return context.Report( + JSR::Tasks::WriteValue, JSR::Outcomes::Unsupported, + "Unable to Serialize Transform to json because the valueTypeId isn't a Transform type."); + } + + const AZ::Transform* transformInstance = reinterpret_cast(inputValue); + AZ_Assert(transformInstance, "Input value for JsonTransformSerializer can't be null."); + const AZ::Transform* defaultTransformInstance = reinterpret_cast(defaultValue); + + JSR::ResultCode result(JSR::Tasks::WriteValue); + + { + AZ::ScopedContextPath subPathName(context, TranslationTag); + const AZ::Vector3 translation = transformInstance->GetTranslation(); + const AZ::Vector3 defaultTranslation = defaultTransformInstance ? defaultTransformInstance->GetTranslation() : AZ::Vector3(); + + JSR::ResultCode storeResult = ContinueStoringToJsonObjectField( + outputValue, TranslationTag, &translation, defaultTransformInstance ? &defaultTranslation : nullptr, + azrtti_typeid(), context); + + result.Combine(storeResult); + } + + { + AZ::ScopedContextPath subPathName(context, RotationTag); + const AZ::Quaternion rotation = transformInstance->GetRotation(); + const AZ::Quaternion defaultRotation = defaultTransformInstance ? defaultTransformInstance->GetRotation() : AZ::Quaternion(); + + JSR::ResultCode storeResult = ContinueStoringToJsonObjectField( + outputValue, RotationTag, &rotation, defaultTransformInstance ? &defaultRotation : nullptr, + azrtti_typeid(), context); + + result.Combine(storeResult); + } + + { + AZ::ScopedContextPath subPathName(context, ScaleTag); + + // Scale is transitioning to a single uniform scale value, but since it's still internally represented as a Vector3, + // we need to pick one number to use for load/store operations. + float scale = transformInstance->GetScale().GetMaxElement(); + float defaultScale = defaultTransformInstance ? defaultTransformInstance->GetScale().GetMaxElement() : 0.0f; + + JSR::ResultCode storeResult = ContinueStoringToJsonObjectField( + outputValue, ScaleTag, &scale, defaultTransformInstance ? &defaultScale : nullptr, azrtti_typeid(), + context); + + result.Combine(storeResult); + } + + return context.Report( + result, + result.GetProcessing() != JSR::Processing::Halted ? "Successfully stored Transform information." + : "Failed to store Transform information."); + } + +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Math/TransformSerializer.h b/Code/Framework/AzCore/AzCore/Math/TransformSerializer.h new file mode 100644 index 0000000000..e03c41e31d --- /dev/null +++ b/Code/Framework/AzCore/AzCore/Math/TransformSerializer.h @@ -0,0 +1,41 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace AZ +{ + class JsonTransformSerializer : public BaseJsonSerializer + { + public: + AZ_RTTI(JsonTransformSerializer, "{51C321B8-9214-4E85-AA5C-B720428A3B17}", BaseJsonSerializer); + AZ_CLASS_ALLOCATOR_DECL; + + JsonSerializationResult::Result Load( + void* outputValue, const Uuid& outputValueTypeId, const rapidjson::Value& inputValue, + JsonDeserializerContext& context) override; + + JsonSerializationResult::Result Store( + rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue, const Uuid& valueTypeId, + JsonSerializerContext& context) override; + + private: + // Note: These need to be defined as "const char[]" instead of "const char*" so that they can be implicitly converted + // to a rapidjson::GenericStringRef<>. (This also lets rapidjson get the string length at compile time) + static inline constexpr const char TranslationTag[] = "Translation"; + static inline constexpr const char RotationTag[] = "Rotation"; + static inline constexpr const char ScaleTag[] = "Scale"; + }; + +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp index 4d3f2b3a19..c3ca2bf33f 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace AZ { @@ -195,7 +196,9 @@ namespace AZ context.GetSerializeContext()->FindClassData(classElement.m_typeId); if (!elementClassData) { - return context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, "Failed to retrieve serialization information."); + return context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, + AZStd::string::format("Failed to retrieve serialization information for type %s.", + classElement.m_typeId.ToString>().c_str())); } if (!elementClassData->m_azRtti) { diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp index f9fd606714..af17f4238f 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp @@ -709,7 +709,7 @@ namespace AZ::SettingsRegistryMergeUtils } } - void MergeSettingsToRegistry_UserRegistry(SettingsRegistryInterface& registry, const AZStd::string_view platform, + void MergeSettingsToRegistry_ProjectUserRegistry(SettingsRegistryInterface& registry, const AZStd::string_view platform, const SettingsRegistryInterface::Specializations& specializations, AZStd::vector* scratchBuffer) { // Unlike other paths, the path can't be overwritten by the dev settings because that would create a circular dependency. @@ -721,6 +721,16 @@ namespace AZ::SettingsRegistryMergeUtils } } + void MergeSettingsToRegistry_O3deUserRegistry(SettingsRegistryInterface& registry, const AZStd::string_view platform, + const SettingsRegistryInterface::Specializations& specializations, AZStd::vector* scratchBuffer) + { + if (AZ::IO::FixedMaxPath o3deUserPath = AZ::Utils::GetO3deManifestDirectory(); !o3deUserPath.empty()) + { + o3deUserPath /= SettingsRegistryInterface::RegistryFolder; + registry.MergeSettingsFolder(o3deUserPath.Native(), specializations, platform, "", scratchBuffer); + } + } + void MergeSettingsToRegistry_CommandLine(SettingsRegistryInterface& registry, const AZ::CommandLine& commandLine, bool executeCommands) { // Iterate over all the command line options in order to parse the --regset and --regremove diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h index b86df27b36..dd7488d7f1 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h @@ -171,7 +171,14 @@ namespace AZ::SettingsRegistryMergeUtils //! Adds the development settings added by individual users of the project to the Settings Registry. //! Note that this function is only called in development builds and is compiled out in release builds. - void MergeSettingsToRegistry_UserRegistry(SettingsRegistryInterface& registry, const AZStd::string_view platform, + void MergeSettingsToRegistry_ProjectUserRegistry(SettingsRegistryInterface& registry, const AZStd::string_view platform, + const SettingsRegistryInterface::Specializations& specializations, AZStd::vector* scratchBuffer = nullptr); + + //! Adds the user settings from the users home directory of "~/.o3de/Registry" + //! '~' corresponds to %USERPROFILE% on Windows and $HOME on Unix-like platforms(Linux, Mac) + //! Note that this function is only called in development builds and is compiled out in release builds. + //! It is merged before the command line settings are merged so that the command line always takes precedence + void MergeSettingsToRegistry_O3deUserRegistry(SettingsRegistryInterface& registry, const AZStd::string_view platform, const SettingsRegistryInterface::Specializations& specializations, AZStd::vector* scratchBuffer = nullptr); //! Adds the settings set through the command line to the Settings Registry. This will also execute any Settings diff --git a/Code/Framework/AzCore/AzCore/Utils/Utils.cpp b/Code/Framework/AzCore/AzCore/Utils/Utils.cpp index e20d36b12f..71f01cb349 100644 --- a/Code/Framework/AzCore/AzCore/Utils/Utils.cpp +++ b/Code/Framework/AzCore/AzCore/Utils/Utils.cpp @@ -42,6 +42,30 @@ namespace AZ::Utils return result.m_pathStored; } + AZ::IO::FixedMaxPathString GetExecutableDirectory() + { + AZ::IO::FixedMaxPathString executableDirectory; + if(GetExecutableDirectory(executableDirectory.data(), executableDirectory.capacity()) + == ExecutablePathResult::Success) + { + // Updated the size field within the fixed string by using char_traits to calculate the string length + executableDirectory.resize_no_construct(AZStd::char_traits::length(executableDirectory.data())); + } + + return executableDirectory; + } + + AZ::IO::FixedMaxPathString GetEngineManifestPath() + { + AZ::IO::FixedMaxPath o3deManifestPath = GetO3deManifestDirectory(); + if (!o3deManifestPath.empty()) + { + o3deManifestPath /= "o3de_manifest.json"; + } + + return o3deManifestPath.Native(); + } + AZ::IO::FixedMaxPathString GetEnginePath() { if (auto registry = AZ::SettingsRegistry::Get(); registry != nullptr) diff --git a/Code/Framework/AzCore/AzCore/Utils/Utils.h b/Code/Framework/AzCore/AzCore/Utils/Utils.h index 431bf7487a..f6152d0e9b 100644 --- a/Code/Framework/AzCore/AzCore/Utils/Utils.h +++ b/Code/Framework/AzCore/AzCore/Utils/Utils.h @@ -76,6 +76,9 @@ namespace AZ //! @returns a result object that indicates if the executable directory was able to be stored within the buffer ExecutablePathResult GetExecutableDirectory(char* exeStorageBuffer, size_t exeStorageSize); + //! Retrieves the full path of the directroy containing the executable + AZ::IO::FixedMaxPathString GetExecutableDirectory(); + //! Retrieves the full path to the engine from settings registry AZ::IO::FixedMaxPathString GetEnginePath(); @@ -85,6 +88,9 @@ namespace AZ //! Retrieves the project name from the settings registry AZ::SettingsRegistryInterface::FixedValueString GetProjectName(); + //! Retrieves the full directory to the O3DE manifest directory, i.e. "/.o3de" + AZ::IO::FixedMaxPathString GetO3deManifestDirectory(); + //! Retrieves the full path where the manifest file lives, i.e. "/.o3de/o3de_manifest.json" AZ::IO::FixedMaxPathString GetEngineManifestPath(); diff --git a/Code/Framework/AzCore/AzCore/azcore_files.cmake b/Code/Framework/AzCore/AzCore/azcore_files.cmake index 4325f9639b..97b86f2432 100644 --- a/Code/Framework/AzCore/AzCore/azcore_files.cmake +++ b/Code/Framework/AzCore/AzCore/azcore_files.cmake @@ -332,6 +332,8 @@ set(FILES Math/Transform.cpp Math/Transform.h Math/Transform.inl + Math/TransformSerializer.cpp + Math/TransformSerializer.h Math/Uuid.cpp Math/Uuid.h Math/UuidSerializer.h diff --git a/Code/Framework/AzCore/AzCore/std/containers/compressed_pair.h b/Code/Framework/AzCore/AzCore/std/containers/compressed_pair.h index 4bef100ab4..6a18951c17 100644 --- a/Code/Framework/AzCore/AzCore/std/containers/compressed_pair.h +++ b/Code/Framework/AzCore/AzCore/std/containers/compressed_pair.h @@ -38,7 +38,7 @@ namespace AZStd * therefore an empty class in C++ has size of 1 byte. * From the C++20 draft chapter 10, note 5 * "[Note: Complete objects of class type have nonzero size. Base class subobjects and " - * "members declared with the no_­unique_­address attribute ([dcl.attr.nouniqueaddr]) are not so constrained. —end note]" + * "members declared with the no_unique_address attribute ([dcl.attr.nouniqueaddr]) are not so constrained. -end note]" * The Index template parameter is used to disambiguate a compressed pair containing multiple elements of the same types * This is used to allow multiple inheritance from 2 of the same types underlying elements */ diff --git a/Code/Framework/AzCore/AzCore/std/docs.h b/Code/Framework/AzCore/AzCore/std/docs.h index d659fe8ef0..cc502540d6 100644 --- a/Code/Framework/AzCore/AzCore/std/docs.h +++ b/Code/Framework/AzCore/AzCore/std/docs.h @@ -96,7 +96,7 @@ namespace AZStd * \page Setup AZSTD Setup * * After you have the AZStd code, you need to make sure you project has add the include path to the folder where AZStd was installed. All AZStd include files are using based on - * AZStd parent folder. For instance all includes are like this \e AZStd/base.h,"AZCore/std/containers/vector,h",etc. We use use the AZStd to avoid name collisions with other + * AZStd parent folder. For instance all includes are like this \e AZStd/base.h,"AzCore/std/containers/vector,h",etc. We use use the AZStd to avoid name collisions with other * stl implementations and make it obvious where the included file comes from. * If you decide to use the default allocator (AZStd::allocator) you will need to implement AZStd::Default_Alloc and AZStd::Default_Free functions otherwise you should * use your own allocator. diff --git a/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerConfiguration_Default.cpp b/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerConfiguration_Default.cpp index b13a95b278..a5f06143ac 100644 --- a/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerConfiguration_Default.cpp +++ b/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerConfiguration_Default.cpp @@ -15,7 +15,8 @@ namespace AZ::IO { - bool CollectIoHardwareInformation(HardwareInformation& info, [[maybe_unused]] bool includeAllHardware) + bool CollectIoHardwareInformation( + HardwareInformation& info, [[maybe_unused]] bool includeAllHardware, [[maybe_unused]] bool reportHardware) { // The numbers below are based on common defaults from a local hardware survey. info.m_maxPageSize = 4096; diff --git a/Code/Framework/AzCore/Platform/Common/Unimplemented/AzCore/Utils/Utils_Unimplemented.cpp b/Code/Framework/AzCore/Platform/Common/Unimplemented/AzCore/Utils/Utils_Unimplemented.cpp index eee242f3b7..20a9edbe2c 100644 --- a/Code/Framework/AzCore/Platform/Common/Unimplemented/AzCore/Utils/Utils_Unimplemented.cpp +++ b/Code/Framework/AzCore/Platform/Common/Unimplemented/AzCore/Utils/Utils_Unimplemented.cpp @@ -14,9 +14,8 @@ namespace AZ::Utils { - AZ::IO::FixedMaxPathString GetEngineManifestPath() + AZ::IO::FixedMaxPathString GetO3deManifestDirectory() { return {}; } - -} // namespace AZ::Utils \ No newline at end of file +} // namespace AZ::Utils diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp index fdd00689c6..2763baac1d 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp @@ -25,7 +25,7 @@ namespace AZ void NativeErrorMessageBox(const char*, const char*) {} - AZ::IO::FixedMaxPathString GetEngineManifestPath() + AZ::IO::FixedMaxPathString GetO3deManifestDirectory() { if (const char* homePath = std::getenv("HOME"); homePath != nullptr) { @@ -33,7 +33,6 @@ namespace AZ if (!path.empty()) { path /= ".o3de"; - path /= "o3de_manifest.json"; } return path.Native(); } diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.cpp index ebade8f6f3..0b1d7b661c 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.cpp @@ -31,6 +31,7 @@ namespace AZ::IO options.m_enableUnbufferedReads = m_enableUnbufferedReads; options.m_enableSharing = m_enableFileSharing; options.m_hasSeekPenalty = drive.m_hasSeekPenalty; + options.m_minimalReporting = m_minimalReporting; AZStd::vector drivePaths(drive.m_paths.begin(), drive.m_paths.end()); AZ_Assert(!drive.m_paths.empty(), "Expected at least one drive path."); @@ -59,7 +60,8 @@ namespace AZ::IO ->Field("MaxMetaDataCache", &WindowsStorageDriveConfig::m_maxMetaDataCache) ->Field("Overcommit", &WindowsStorageDriveConfig::m_overcommit) ->Field("EnableFileSharing", &WindowsStorageDriveConfig::m_enableFileSharing) - ->Field("EnableUnbufferedReads", &WindowsStorageDriveConfig::m_enableUnbufferedReads); + ->Field("EnableUnbufferedReads", &WindowsStorageDriveConfig::m_enableUnbufferedReads) + ->Field("MinimalReporting", &WindowsStorageDriveConfig::m_minimalReporting); } } } // namespace AZ::IO diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.h b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.h index 10092759c4..2a4f4f35f1 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.h +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDriveConfig_Windows.h @@ -34,5 +34,6 @@ namespace AZ::IO AZ::u32 m_overcommit{ 8 }; bool m_enableFileSharing{ false }; bool m_enableUnbufferedReads{ true }; + bool m_minimalReporting{ false }; }; } // namespace AZ::IO diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.cpp index e726668f0a..ff9277f010 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.cpp @@ -41,6 +41,7 @@ namespace AZ::IO : m_hasSeekPenalty(true) , m_enableUnbufferedReads(true) , m_enableSharing(false) + , m_minimalReporting(false) {} // @@ -102,7 +103,10 @@ namespace AZ::IO m_name += m_drivePaths[i].substr(0, m_drivePaths[i].length()-1); } m_name += ')'; - AZ_Printf("Streamer", "%s created.\n", m_name.c_str()); + if (!m_constructionOptions.m_minimalReporting) + { + AZ_Printf("Streamer", "%s created.\n", m_name.c_str()); + } if (m_physicalSectorSize == 0) { @@ -160,7 +164,10 @@ namespace AZ::IO ::CloseHandle(file); } } - AZ_Printf("Streamer", "%s destroyed.\n", m_name.c_str()); + if (!m_constructionOptions.m_minimalReporting) + { + AZ_Printf("Streamer", "%s destroyed.\n", m_name.c_str()); + } } void StorageDriveWin::PrepareRequest(FileRequest* request) @@ -483,7 +490,7 @@ namespace AZ::IO // Remove any alertable IO completion notifications that could be queued by the IO Manager. if (!::SetFileCompletionNotificationModes(file, FILE_SKIP_SET_EVENT_ON_HANDLE | FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { - AZ_Printf("StorageDriveWin", "Failed to remove alertable IO completion notifications. (Error: %u)\n", ::GetLastError()); + AZ_Warning("StorageDriveWin", false, "Failed to remove alertable IO completion notifications. (Error: %u)\n", ::GetLastError()); } if (m_fileCache_handles[cacheIndex] != INVALID_HANDLE_VALUE) @@ -651,15 +658,6 @@ namespace AZ::IO #endif // AZ_STREAMER_ADD_EXTRA_PROFILING_INFO } - // Keep this, it helps to see the critical info about every read. - //AZ_Printf("StorageDriveWin", "FileRead: addr: 0x%p size: %zu offs: %zu alloc: %s direct: %.2f%% '%s'\n", - // data->m_output, - // data->m_size, - // data->m_offset, - // (isAligned) ? "Yes" : "No", - // m_directReadsPercentageStat.GetAverage() * 100.0, - // data->m_path.GetRelativePath()); - FileReadStatus& readStatus = m_readSlots_statusInfo[readSlot]; LPOVERLAPPED overlapped = &readStatus.m_overlapped; overlapped->Offset = aznumeric_caster(readOffs); @@ -678,7 +676,7 @@ namespace AZ::IO DWORD error = ::GetLastError(); if (error != ERROR_IO_PENDING) { - AZ_Printf("StorageDriveWin", "::ReadFile failed with error: %u\n", error); + AZ_Warning("StorageDriveWin", false, "::ReadFile failed with error: %u\n", error); m_context->GetStreamerThreadSynchronizer().DestroyEventHandle(overlapped->hEvent); diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h index e6edb5e6a2..479828c9d3 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h @@ -47,6 +47,9 @@ namespace AZ::IO //! while in use by AZ::IO::Streamer. File sharing can negatively impact performance and is recommended for //! development only. u8 m_enableSharing : 1; + //! If true, only information that's explicitly requested or issues are reported. If false, status information + //! such as when drives are created and destroyed is reported as well. + u8 m_minimalReporting : 1; }; //! Creates an instance of a storage device that's optimized for use on Windows. diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp index 5d719836dd..5a19bc4f54 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp @@ -34,7 +34,7 @@ namespace AZ::IO return value; } - static void CollectIoAdaptor(HANDLE deviceHandle, DriveInformation& info, const char* driveName) + static void CollectIoAdaptor(HANDLE deviceHandle, DriveInformation& info, const char* driveName, bool reportHardware) { STORAGE_ADAPTER_DESCRIPTOR adapterDescriptor{}; STORAGE_PROPERTY_QUERY query{}; @@ -71,17 +71,21 @@ namespace AZ::IO DWORD pageSize = NextPowerOfTwo(adapterDescriptor.MaximumTransferLength / adapterDescriptor.MaximumPhysicalPages); - AZ_Printf("Streamer", - "Adapter for drive '%s':\n" - " Bus: %s %i.%i\n" - " Max transfer: %.3f kb\n" - " Page size: %i kb for %i pages\n" - " Supports queuing: %s\n", - driveName, - info.m_profile.c_str(), adapterDescriptor.BusMajorVersion, adapterDescriptor.BusMinorVersion, - (1.0f / 1024.0f) * adapterDescriptor.MaximumTransferLength, - pageSize, adapterDescriptor.MaximumPhysicalPages, - adapterDescriptor.CommandQueueing ? "Yes" : "No"); + if (reportHardware) + { + AZ_Printf( + "Streamer", + "Adapter for drive '%s':\n" + " Bus: %s %i.%i\n" + " Max transfer: %.3f kb\n" + " Page size: %i kb for %i pages\n" + " Supports queuing: %s\n", + driveName, + info.m_profile.c_str(), adapterDescriptor.BusMajorVersion, adapterDescriptor.BusMinorVersion, + (1.0f / 1024.0f) * adapterDescriptor.MaximumTransferLength, + pageSize, adapterDescriptor.MaximumPhysicalPages, + adapterDescriptor.CommandQueueing ? "Yes" : "No"); + } info.m_maxTransfer = adapterDescriptor.MaximumTransferLength; info.m_pageSize = pageSize; @@ -89,7 +93,7 @@ namespace AZ::IO } } - static void AppendDriveTypeToProfile(HANDLE deviceHandle, DriveInformation& information) + static void AppendDriveTypeToProfile(HANDLE deviceHandle, DriveInformation& information, bool reportHardware) { // Check for support for the TRIM command. This command is exclusively used by SSD drives so can be used to // tell the difference between SSD and HDD. Since these are the only 2 types supported right now, no further @@ -105,18 +109,24 @@ namespace AZ::IO &trimDescriptor, sizeof(trimDescriptor), &bytesReturned, nullptr)) { information.m_profile += trimDescriptor.TrimEnabled ? "_SSD" : "_HDD"; - AZ_Printf("Streamer", - " Drive type: %s\n", - trimDescriptor.TrimEnabled ? "SSD" : "HDD"); + if (reportHardware) + { + + AZ_Printf("Streamer", + " Drive type: %s\n", + trimDescriptor.TrimEnabled ? "SSD" : "HDD"); + } } else { - AZ_Printf("Streamer", - " Drive type couldn't be determined."); + if (reportHardware) + { + AZ_Printf("Streamer", " Drive type couldn't be determined."); + } } } - static void CollectAlignmentRequirements(HANDLE deviceHandle, DriveInformation& information) + static void CollectAlignmentRequirements(HANDLE deviceHandle, DriveInformation& information, bool reportHardware) { STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR alignmentDescriptor{}; STORAGE_PROPERTY_QUERY query{}; @@ -129,15 +139,19 @@ namespace AZ::IO { information.m_physicalSectorSize = aznumeric_caster(alignmentDescriptor.BytesPerPhysicalSector); information.m_logicalSectorSize = aznumeric_caster(alignmentDescriptor.BytesPerLogicalSector); - AZ_Printf("Streamer", - " Physical sector size: %i bytes\n" - " Logical sector size: %i bytes\n", - alignmentDescriptor.BytesPerPhysicalSector, - alignmentDescriptor.BytesPerLogicalSector); + if (reportHardware) + { + AZ_Printf( + "Streamer", + " Physical sector size: %i bytes\n" + " Logical sector size: %i bytes\n", + alignmentDescriptor.BytesPerPhysicalSector, + alignmentDescriptor.BytesPerLogicalSector); + } } } - static void CollectDriveInfo(HANDLE deviceHandle, const char* driveName) + static void CollectDriveInfo(HANDLE deviceHandle, const char* driveName, bool reportHardware) { STORAGE_DEVICE_DESCRIPTOR sizeRequest{}; STORAGE_PROPERTY_QUERY query{}; @@ -154,21 +168,24 @@ namespace AZ::IO if (::DeviceIoControl(deviceHandle, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), buffer.get(), header->Size, &bytesReturned, nullptr)) { - auto deviceDescriptor = reinterpret_cast(buffer.get()); - AZ_Printf("Streamer", - "Drive info for '%s':\n" - " Id: %s%s%s%s%s\n", - driveName, - deviceDescriptor->VendorIdOffset != 0 ? buffer.get() + deviceDescriptor->VendorIdOffset : "", - deviceDescriptor->VendorIdOffset != 0 ? " " : "", - deviceDescriptor->ProductIdOffset != 0 ? buffer.get() + deviceDescriptor->ProductIdOffset : "", - deviceDescriptor->ProductIdOffset != 0 ? " " : "", - deviceDescriptor->ProductRevisionOffset != 0 ? buffer.get() + deviceDescriptor->ProductRevisionOffset : ""); + if (reportHardware) + { + auto deviceDescriptor = reinterpret_cast(buffer.get()); + AZ_Printf("Streamer", + "Drive info for '%s':\n" + " Id: %s%s%s%s%s\n", + driveName, + deviceDescriptor->VendorIdOffset != 0 ? buffer.get() + deviceDescriptor->VendorIdOffset : "", + deviceDescriptor->VendorIdOffset != 0 ? " " : "", + deviceDescriptor->ProductIdOffset != 0 ? buffer.get() + deviceDescriptor->ProductIdOffset : "", + deviceDescriptor->ProductIdOffset != 0 ? " " : "", + deviceDescriptor->ProductRevisionOffset != 0 ? buffer.get() + deviceDescriptor->ProductRevisionOffset : ""); + } } } } - static void CollectDriveIoCapability(HANDLE deviceHandle, DriveInformation& information) + static void CollectDriveIoCapability(HANDLE deviceHandle, DriveInformation& information, bool reportHardware) { STORAGE_DEVICE_IO_CAPABILITY_DESCRIPTOR capabilityDescriptor{}; STORAGE_PROPERTY_QUERY query{}; @@ -180,15 +197,19 @@ namespace AZ::IO &capabilityDescriptor, sizeof(capabilityDescriptor), &bytesReturned, nullptr)) { information.m_ioChannelCount = aznumeric_caster(capabilityDescriptor.LunMaxIoCount); - AZ_Printf("Streamer", - " Max IO count (LUN): %i\n" - " Max IO count (Adapter): %i\n", - capabilityDescriptor.LunMaxIoCount, - capabilityDescriptor.AdapterMaxIoCount); + if (reportHardware) + { + AZ_Printf( + "Streamer", + " Max IO count (LUN): %i\n" + " Max IO count (Adapter): %i\n", + capabilityDescriptor.LunMaxIoCount, + capabilityDescriptor.AdapterMaxIoCount); + } } } - static void CollectDriveSeekPenalty(HANDLE deviceHandle, DriveInformation& information) + static void CollectDriveSeekPenalty(HANDLE deviceHandle, DriveInformation& information, bool reportHardware) { DWORD bytesReturned = 0; @@ -201,9 +222,12 @@ namespace AZ::IO &seekPenaltyDescriptor, sizeof(seekPenaltyDescriptor), &bytesReturned, nullptr)) { information.m_hasSeekPenalty = seekPenaltyDescriptor.IncursSeekPenalty ? true : false; - AZ_Printf("Streamer", - " Has seek penalty: %s\n", - information.m_hasSeekPenalty ? "Yes" : "No"); + if (reportHardware) + { + AZ_Printf("Streamer", + " Has seek penalty: %s\n", + information.m_hasSeekPenalty ? "Yes" : "No"); + } } } @@ -267,7 +291,7 @@ namespace AZ::IO return visitor.m_found; } - static bool CollectHardwareInfo(HardwareInformation& hardwareInfo, bool addAllDrives) + static bool CollectHardwareInfo(HardwareInformation& hardwareInfo, bool addAllDrives, bool reportHardware) { char drives[512]; if (::GetLogicalDriveStrings(sizeof(drives) - 1, drives)) @@ -286,7 +310,10 @@ namespace AZ::IO { if (!addAllDrives && !IsDriveUsed(driveIt)) { - AZ_Printf("Streamer", "Skipping drive '%s' because to no paths make use of it.\n", driveIt); + if (reportHardware) + { + AZ_Printf("Streamer", "Skipping drive '%s' because to no paths make use of it.\n", driveIt); + } while (*driveIt++); continue; } @@ -311,14 +338,14 @@ namespace AZ::IO DriveInformation driveInformation; driveInformation.m_paths.emplace_back(driveIt); - CollectIoAdaptor(deviceHandle, driveInformation, driveIt); + CollectIoAdaptor(deviceHandle, driveInformation, driveIt, reportHardware); if (driveInformation.m_supportsQueuing) { - CollectDriveInfo(deviceHandle, driveIt); - AppendDriveTypeToProfile(deviceHandle, driveInformation); - CollectDriveIoCapability(deviceHandle, driveInformation); - CollectDriveSeekPenalty(deviceHandle, driveInformation); - CollectAlignmentRequirements(deviceHandle, driveInformation); + CollectDriveInfo(deviceHandle, driveIt, reportHardware); + AppendDriveTypeToProfile(deviceHandle, driveInformation, reportHardware); + CollectDriveIoCapability(deviceHandle, driveInformation, reportHardware); + CollectDriveSeekPenalty(deviceHandle, driveInformation, reportHardware); + CollectAlignmentRequirements(deviceHandle, driveInformation, reportHardware); hardwareInfo.m_maxPhysicalSectorSize = AZStd::max(hardwareInfo.m_maxPhysicalSectorSize, driveInformation.m_physicalSectorSize); @@ -329,24 +356,39 @@ namespace AZ::IO driveMappings.insert({ storageDeviceNumber.DeviceNumber, AZStd::move(driveInformation) }); - AZ_Printf("Streamer", "\n"); + if (reportHardware) + { + AZ_Printf("Streamer", "\n"); + } } else { - AZ_Printf("Streamer", "Skipping drive '%s' because device does not support queuing requests.\n", driveIt); + if (reportHardware) + { + AZ_Printf( + "Streamer", "Skipping drive '%s' because device does not support queuing requests.\n", driveIt); + } } } else { - AZ_Printf("Streamer", "Drive '%s' is on the same storage drive as '%s'.\n", - driveIt, driveInformationEntry->second.m_paths[0].c_str()); + if (reportHardware) + { + AZ_Printf( + "Streamer", "Drive '%s' is on the same storage drive as '%s'.\n", + driveIt, driveInformationEntry->second.m_paths[0].c_str()); + } driveInformationEntry->second.m_paths.emplace_back(driveIt); } } else { - AZ_Printf("Streamer", - "Skipping drive '%s' because device is not registered with OS as a storage device.\n", driveIt); + if (reportHardware) + { + AZ_Printf( + "Streamer", "Skipping drive '%s' because device is not registered with OS as a storage device.\n", + driveIt); + } } ::CloseHandle(deviceHandle); } @@ -358,7 +400,10 @@ namespace AZ::IO } else { - AZ_Printf("Streamer", "Skipping drive '%s', as it the type of drive is not supported.\n", driveIt); + if (reportHardware) + { + AZ_Printf("Streamer", "Skipping drive '%s', as it the type of drive is not supported.\n", driveIt); + } } // Move to next drive string. GetLogicalDriveStrings fills the target buffer with null-terminated strings, for instance @@ -384,9 +429,9 @@ namespace AZ::IO } } - bool CollectIoHardwareInformation(HardwareInformation& info, bool includeAllHardware) + bool CollectIoHardwareInformation(HardwareInformation& info, bool includeAllHardware, bool reportHardware) { - if (!CollectHardwareInfo(info, includeAllHardware)) + if (!CollectHardwareInfo(info, includeAllHardware, reportHardware)) { // The numbers below are based on common defaults from a local hardware survey. info.m_maxPageSize = 4096; diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/Utils/Utils_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/Utils/Utils_Windows.cpp index 5a56ed6b84..2ade67955b 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/Utils/Utils_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/Utils/Utils_Windows.cpp @@ -22,20 +22,18 @@ namespace AZ::Utils ::MessageBox(0, message, title, MB_OK | MB_ICONERROR); } - AZ::IO::FixedMaxPathString GetEngineManifestPath() + AZ::IO::FixedMaxPathString GetO3deManifestDirectory() { - char userProfileBuffer[AZ::IO::MaxPathLength] = {0}; + char userProfileBuffer[AZ::IO::MaxPathLength]{}; size_t variableSize = 0; auto err = getenv_s(&variableSize, userProfileBuffer, AZ::IO::MaxPathLength, "USERPROFILE"); if (!err) { - AZ::IO::FixedMaxPath path{userProfileBuffer}; + AZ::IO::FixedMaxPath path{ userProfileBuffer }; path /= ".o3de"; - path /= "o3de_manifest.json"; return path.Native(); } return {}; } - } // namespace AZ::Utils diff --git a/Code/Framework/AzCore/Platform/iOS/AzCore/Utils/Utils_iOS.mm b/Code/Framework/AzCore/Platform/iOS/AzCore/Utils/Utils_iOS.mm index f7054fdcea..1bd9843ef8 100644 --- a/Code/Framework/AzCore/Platform/iOS/AzCore/Utils/Utils_iOS.mm +++ b/Code/Framework/AzCore/Platform/iOS/AzCore/Utils/Utils_iOS.mm @@ -41,7 +41,7 @@ namespace AZ::Utils const char* src = [appSupportDir UTF8String]; const size_t srcLen = strlen(src); - if (srcLen > MaxPathLength - 1) + if (srcLen > AZ::IO::MaxPathLength - 1) { return AZStd::nullopt; } diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp new file mode 100644 index 0000000000..12711b1e1a --- /dev/null +++ b/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp @@ -0,0 +1,218 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include + +namespace JsonSerializationTests +{ + class JsonTransformSerializerTestDescription : public JsonSerializerConformityTestDescriptor + { + public: + AZStd::shared_ptr CreateSerializer() override + { + return AZStd::make_shared(); + } + + AZStd::shared_ptr CreateDefaultInstance() override + { + return AZStd::make_shared(AZ::Transform::CreateIdentity()); + } + + AZStd::shared_ptr CreatePartialDefaultInstance() override + { + return AZStd::make_shared(AZ::Transform::CreateTranslation(AZ::Vector3(1.0f, 2.0f, 3.0f))); + } + + AZStd::string_view GetJsonForPartialDefaultInstance() override + { + return "{ \"Translation\" : [ 1.0, 2.0, 3.0 ] }"; + } + + + AZStd::shared_ptr CreateFullySetInstance() override + { + return AZStd::make_shared( + AZ::Vector3(1.0f, 2.0f, 3.0f), AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f), AZ::Vector3(9.0f)); + } + + AZStd::string_view GetJsonForFullySetInstance() override + { + return "{ \"Translation\" : [ 1.0, 2.0, 3.0 ], \"Rotation\" : [ 0.25, 0.5, 0.75, 1.0 ], \"Scale\" : 9.0 }"; + } + + void ConfigureFeatures(JsonSerializerConformityTestDescriptorFeatures& features) override + { + features.EnableJsonType(rapidjson::kObjectType); + features.m_supportsPartialInitialization = true; + features.m_supportsInjection = false; + features.m_requiresTypeIdLookups = true; + } + + bool AreEqual(const AZ::Transform& lhs, const AZ::Transform& rhs) override + { + return lhs == rhs; + } + }; + + using JsonTransformSerializerConformityTestTypes = ::testing::Types; + INSTANTIATE_TYPED_TEST_CASE_P(JsonTransformSerializer, JsonSerializerConformityTests, JsonTransformSerializerConformityTestTypes); + + class JsonTransformSerializerTests + : public BaseJsonSerializerFixture + { + public: + void SetUp() override + { + BaseJsonSerializerFixture::SetUp(); + m_transformSerializer = AZStd::make_unique(); + } + + void TearDown() override + { + m_transformSerializer.reset(); + BaseJsonSerializerFixture::TearDown(); + } + + protected: + AZStd::unique_ptr m_transformSerializer; + }; + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithAllValuesSetCorrectly) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform( + AZ::Vector3(2.25f, 3.5f, 4.75f), + AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f), + AZ::Vector3(5.5f)); + + rapidjson::Document json; + json.Parse(R"({ "Translation": [ 2.25, 3.5, 4.75 ], "Rotation": [ 0.25, 0.5, 0.75, 1.0 ], "Scale": 5.5 })"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::Success); + EXPECT_EQ(testTransform, expectedTransform); + } + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithDefaultTranslation) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform = + AZ::Transform::CreateFromQuaternion(AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f)); + expectedTransform.SetScale(AZ::Vector3(5.5f)); + + rapidjson::Document json; + json.Parse(R"({ "Rotation": [ 0.25, 0.5, 0.75, 1.0 ], "Scale": 5.5 })"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::PartialDefaults); + EXPECT_EQ(testTransform, expectedTransform); + } + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithDefaultRotation) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform = AZ::Transform::CreateTranslation(AZ::Vector3(2.25f, 3.5f, 4.75f)); + expectedTransform.SetScale(AZ::Vector3(5.5f)); + + rapidjson::Document json; + json.Parse(R"({ "Translation": [ 2.25, 3.5, 4.75 ], "Scale": 5.5 })"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::PartialDefaults); + EXPECT_EQ(testTransform, expectedTransform); + } + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithDefaultScale) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform = + AZ::Transform::CreateFromQuaternionAndTranslation(AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f), AZ::Vector3(2.25f, 3.5f, 4.75f)); + + rapidjson::Document json; + json.Parse(R"({ "Translation": [ 2.25, 3.5, 4.75 ], "Rotation": [ 0.25, 0.5, 0.75, 1.0 ] })"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::PartialDefaults); + EXPECT_EQ(testTransform, expectedTransform); + } + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithOnlyTranslation) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform = AZ::Transform::CreateTranslation(AZ::Vector3(2.25f, 3.5f, 4.75f)); + + rapidjson::Document json; + json.Parse(R"({ "Translation": [ 2.25, 3.5, 4.75 ] })"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::PartialDefaults); + EXPECT_EQ(testTransform, expectedTransform); + } + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithOnlyRotation) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform = AZ::Transform::CreateFromQuaternion(AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f)); + + rapidjson::Document json; + json.Parse(R"({ "Rotation": [ 0.25, 0.5, 0.75, 1.0 ] })"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::PartialDefaults); + EXPECT_EQ(testTransform, expectedTransform); + } + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithOnlyScale) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform = AZ::Transform::CreateScale(AZ::Vector3(5.5f)); + + rapidjson::Document json; + json.Parse(R"({ "Scale" : 5.5 })"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::PartialDefaults); + EXPECT_EQ(testTransform, expectedTransform); + } + + TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithAllDefaults) + { + AZ::Transform testTransform = AZ::Transform::CreateIdentity(); + AZ::Transform expectedTransform = AZ::Transform::CreateIdentity(); + + rapidjson::Document json; + json.Parse(R"({})"); + + ResultCode result = + m_transformSerializer->Load(&testTransform, azrtti_typeid(), json, *m_jsonDeserializationContext); + + EXPECT_EQ(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::DefaultsUsed); + EXPECT_EQ(testTransform, expectedTransform); + } +} // namespace JsonSerializationTests diff --git a/Code/Framework/AzCore/Tests/azcoretests_files.cmake b/Code/Framework/AzCore/Tests/azcoretests_files.cmake index 9f4260d6ff..c51cf46a37 100644 --- a/Code/Framework/AzCore/Tests/azcoretests_files.cmake +++ b/Code/Framework/AzCore/Tests/azcoretests_files.cmake @@ -123,6 +123,7 @@ set(FILES Serialization/Json/TestCases_Pointers.h Serialization/Json/TestCases_Pointers.cpp Serialization/Json/TestCases_TypeId.cpp + Serialization/Json/TransformSerializerTests.cpp Serialization/Json/TupleSerializerTests.cpp Serialization/Json/UnorderedSetSerializerTests.cpp Serialization/Json/UuidSerializerTests.cpp diff --git a/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h b/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h index c5a72521fa..a6a5a2bd59 100644 --- a/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h +++ b/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h @@ -93,8 +93,8 @@ namespace AzFramework /// Execute a function in a new thread and pump the system event loop at the specified frequency until the thread returns. virtual void PumpSystemEventLoopWhileDoingWorkInNewThread(const AZStd::chrono::milliseconds& /*eventPumpFrequency*/, - const AZStd::function& /*workForNewThread*/, - const char* /*newThreadName*/) {} + const AZStd::function& /*workForNewThread*/, + const char* /*newThreadName*/) {} /// Run the main loop until ExitMainLoop is called. virtual void RunMainLoop() {} @@ -114,6 +114,21 @@ namespace AzFramework /// Calculate the branch token from the current application's engine root virtual void CalculateBranchTokenForEngineRoot(AZStd::string& token) const = 0; + /// Returns true if Prefab System is enabled, false if Legacy Slice System is enabled + virtual bool IsPrefabSystemEnabled() const { return true; } + + /// Returns true if the additional work in progress Prefab features are enabled, false otherwise + virtual bool ArePrefabWipFeaturesEnabled() const { return false; } + + /// Sets whether or not the Prefab System should be enabled. The application will need to be restarted when this changes + virtual void SetPrefabSystemEnabled([[maybe_unused]] bool enable) {} + + /// Returns true if Prefab System is enabled for use with levels, false if legacy level system is enabled (level.pak) + virtual bool IsPrefabSystemForLevelsEnabled() const { return false; } + + /// Returns true if code should assert when the Legacy Slice System is used + virtual bool ShouldAssertForLegacySlicesUsage() const { return false; } + /*! * Returns a Type Uuid of the component for the given componentId and entityId. * if no component matches the entity and component Id pair, a Null Uuid is returned diff --git a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp index a363e79523..ff9e0ce6c5 100644 --- a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp +++ b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp @@ -89,6 +89,10 @@ namespace AzFramework { namespace ApplicationInternal { + static constexpr const char s_prefabSystemKey[] = "/Amazon/Preferences/EnablePrefabSystem"; + static constexpr const char s_prefabWipSystemKey[] = "/Amazon/Preferences/EnablePrefabSystemWipFeatures"; + static constexpr const char s_legacySlicesAssertKey[] = "/Amazon/Preferences/ShouldAssertForLegacySlicesUsage"; + // A Helper function that can load an app descriptor from file. AZ::Outcome, AZStd::string> LoadDescriptorFromFilePath(const char* appDescriptorFilePath, AZ::SerializeContext& serializeContext) { @@ -411,9 +415,10 @@ namespace AzFramework // UserSettingsFileLocatorBus AZStd::string Application::ResolveFilePath([[maybe_unused]] AZ::u32 providerId) { - AZStd::string result; - AzFramework::StringFunc::Path::Join(GetEngineRoot(), "UserSettings.xml", result, /*bCaseInsenitive*/false); - return result; + AZ::IO::Path userSettingsPath; + m_settingsRegistry->Get(userSettingsPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectUserPath); + userSettingsPath /= "UserSettings.xml"; + return userSettingsPath.Native(); } AZ::Component* Application::EnsureComponentAdded(AZ::Entity* systemEntity, const AZ::Uuid& typeId) @@ -779,4 +784,47 @@ namespace AzFramework } } + bool Application::IsPrefabSystemEnabled() const + { + bool value = true; + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->Get(value, ApplicationInternal::s_prefabSystemKey); + } + return value; + } + + bool Application::ArePrefabWipFeaturesEnabled() const + { + bool value = false; + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->Get(value, ApplicationInternal::s_prefabWipSystemKey); + } + return value; + } + + void Application::SetPrefabSystemEnabled(bool enable) + { + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->Set(ApplicationInternal::s_prefabSystemKey, enable); + } + } + + bool Application::IsPrefabSystemForLevelsEnabled() const + { + return IsPrefabSystemEnabled(); + } + + bool Application::ShouldAssertForLegacySlicesUsage() const + { + bool value = false; + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->Get(value, ApplicationInternal::s_legacySlicesAssertKey); + } + return value; + } + } // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Application/Application.h b/Code/Framework/AzFramework/AzFramework/Application/Application.h index b4abccd116..fdc0ddcfb7 100644 --- a/Code/Framework/AzFramework/AzFramework/Application/Application.h +++ b/Code/Framework/AzFramework/AzFramework/Application/Application.h @@ -104,6 +104,11 @@ namespace AzFramework const char* GetAppRoot() const override; void ResolveEnginePath(AZStd::string& engineRelativePath) const override; void CalculateBranchTokenForEngineRoot(AZStd::string& token) const override; + bool IsPrefabSystemEnabled() const override; + bool ArePrefabWipFeaturesEnabled() const override; + void SetPrefabSystemEnabled(bool enable) override; + bool IsPrefabSystemForLevelsEnabled() const override; + bool ShouldAssertForLegacySlicesUsage() const override; #pragma push_macro("GetCommandLine") #undef GetCommandLine diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp index 0fb85431d1..e985386335 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -1506,35 +1507,48 @@ namespace AZ::IO auto bundleManifest = GetBundleManifest(desc.pZip); AZStd::shared_ptr bundleCatalog; - AZStd::vector levelDirs; if (bundleManifest) { bundleCatalog = GetBundleCatalog(desc.pZip, bundleManifest->GetCatalogName()); } - if (addLevels) + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) { - // Note that manifest version two and above will contain level directory information inside them - // otherwise we will fallback to scanning the archive for levels. - if (bundleManifest && bundleManifest->GetBundleVersion() >= 2) - { + m_arrZips.insert(revItZip.base(), desc); + } + else + { + // [LYN-2376] Remove once legacy slice support is removed + AZStd::vector levelDirs; - levelDirs = bundleManifest->GetLevelDirectories(); + if (addLevels) + { + // Note that manifest version two and above will contain level directory information inside them + // otherwise we will fallback to scanning the archive for levels. + if (bundleManifest && bundleManifest->GetBundleVersion() >= 2) + { + levelDirs = bundleManifest->GetLevelDirectories(); + } + else + { + levelDirs = ScanForLevels(desc.pZip); + } } - else + + if (!levelDirs.empty()) { - levelDirs = ScanForLevels(desc.pZip); + desc.m_containsLevelPak = true; } - } - if (!levelDirs.empty()) - { - desc.m_containsLevelPak = true; - } + m_arrZips.insert(revItZip.base(), desc); - m_arrZips.insert(revItZip.base(), desc); + m_levelOpenEvent.Signal(levelDirs); + } - m_levelOpenEvent.Signal(levelDirs); AZ::IO::ArchiveNotificationBus::Broadcast([](AZ::IO::ArchiveNotifications* archiveNotifications, const char* bundleName, AZStd::shared_ptr bundleManifest, const char* nextBundle, AZStd::shared_ptr bundleCatalog) { @@ -1555,10 +1569,13 @@ namespace AZ::IO return false; } + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + AZStd::unique_lock lock(m_csZips); for (auto it = m_arrZips.begin(); it != m_arrZips.end();) { - bool needRescan = false; if (azstricmp(szZipPath->c_str(), it->GetFullPath()) == 0) { // this is the pack with the given name - remove it, and if possible it will be deleted @@ -1571,16 +1588,25 @@ namespace AZ::IO archiveNotifications->BundleClosed(bundleName); }, it->GetFullPath()); - if (it->m_containsLevelPak) + if (usePrefabSystemForLevels) { - needRescan = true; + it = m_arrZips.erase(it); } + else + { + // [LYN-2376] Remove once legacy slice support is removed + bool needRescan = false; + if (it->m_containsLevelPak) + { + needRescan = true; + } - it = m_arrZips.erase(it); + it = m_arrZips.erase(it); - if (needRescan) - { - m_levelCloseEvent.Signal(szZipPath->Native()); + if (needRescan) + { + m_levelCloseEvent.Signal(szZipPath->Native()); + } } } else diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.h b/Code/Framework/AzFramework/AzFramework/Archive/Archive.h index 8038d3df9e..997b3e3d2c 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.h @@ -120,6 +120,8 @@ namespace AZ::IO { AZ::IO::Path m_pathBindRoot; // the zip binding root AZStd::string strFileName; // the zip file name (with path) - very useful for debugging so please don't remove + + // [LYN-2376] Remove once legacy slice support is removed bool m_containsLevelPak = false; // indicates whether this archive has level.pak inside it or not const char* GetFullPath() const { return pZip->GetFilePath(); } @@ -199,6 +201,7 @@ namespace AZ::IO bool IsInstalledToHDD(AZStd::string_view acFilePath = 0) const override; + // [LYN-2376] Remove 'addLevels' parameter once legacy slice support is removed bool OpenPack(AZStd::string_view pName, uint32_t nFlags = 0, AZStd::intrusive_ptr pData = nullptr, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) override; bool OpenPack(AZStd::string_view szBindRoot, AZStd::string_view pName, uint32_t nFlags = 0, AZStd::intrusive_ptr pData = nullptr, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) override; // after this call, the file will be unlocked and closed, and its contents won't be used to search for files @@ -300,7 +303,8 @@ namespace AZ::IO EStreamSourceMediaType GetFileMediaType(AZStd::string_view szName) const override; - auto GetLevelPackOpenEvent()->LevelPackOpenEvent* override; + // [LYN-2376] Remove once legacy slice support is removed + auto GetLevelPackOpenEvent() -> LevelPackOpenEvent* override; auto GetLevelPackCloseEvent()->LevelPackCloseEvent* override; @@ -336,6 +340,8 @@ namespace AZ::IO //! Return the Manifest from a bundle, if it exists AZStd::shared_ptr GetBundleManifest(ZipDir::CachePtr pZip); AZStd::shared_ptr GetBundleCatalog(ZipDir::CachePtr pZip, const AZStd::string& catalogName); + + // [LYN-2376] Remove once legacy slice support is removed AZStd::vector ScanForLevels(ZipDir::CachePtr pZip); mutable AZStd::shared_mutex m_csOpenFiles; @@ -362,6 +368,8 @@ namespace AZ::IO RecordedFilesSet m_recordedFilesSet; AZStd::intrusive_ptr m_pEngineStartupResourceList; + + // [LYN-2376] Remove once legacy slice support is removed AZStd::intrusive_ptr m_pLevelResourceList; AZStd::intrusive_ptr m_pNextLevelResourceList; @@ -378,6 +386,8 @@ namespace AZ::IO AZStd::fixed_string<128> m_sLocalizationRoot; AZStd::set, AZ::OSStdAllocator> m_filesCachedOnHDD; + + // [LYN-2376] Remove once legacy slice support is removed LevelPackOpenEvent m_levelOpenEvent; LevelPackCloseEvent m_levelCloseEvent; }; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp index 20bec16bb0..678f4e40bf 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp @@ -17,17 +17,28 @@ #include #include - namespace AZ::IO { bool AZStdStringLessCaseInsensitive::operator()(AZStd::string_view left, AZStd::string_view right) const { + // If one or both strings are 0-length, return true if the left side is smaller, false if they're equal or left is larger. size_t compareLength = (AZStd::min)(left.size(), right.size()); if (compareLength == 0) { return left.size() < right.size(); } + + // They're both non-zero, so compare the strings up until the length of the shorter string. int compareResult = azstrnicmp(left.data(), right.data(), compareLength); + + // If both strings are equal for the number of characters compared, return true if the left side is shorter, false if + // they're equal or left is longer. + if (compareResult == 0) + { + return left.size() < right.size(); + } + + // Return true if the left side should come first alphabetically, false if the right side should. return compareResult < 0; } @@ -124,7 +135,8 @@ namespace AZ::IO fileDesc.tAccess = fileDesc.tWrite; fileDesc.tCreate = fileDesc.tWrite; } - m_mapFiles.emplace(AZStd::move(fullFilePath), fileDesc); + [[maybe_unused]] auto result = m_mapFiles.emplace(AZStd::move(fullFilePath), fileDesc); + AZ_Assert(result.second, "Failed to insert FindData entry for %s", fullFilePath.c_str()); return true; }); diff --git a/Code/Framework/AzFramework/AzFramework/Components/CameraBus.h b/Code/Framework/AzFramework/AzFramework/Components/CameraBus.h index b68f3cd11a..62c49c72c7 100644 --- a/Code/Framework/AzFramework/AzFramework/Components/CameraBus.h +++ b/Code/Framework/AzFramework/AzFramework/Components/CameraBus.h @@ -16,6 +16,7 @@ namespace Camera { + //! Stores camera configuration values that describe the camera's view frustum. struct Configuration { float m_fovRadians = 0.f; @@ -25,114 +26,83 @@ namespace Camera float m_frustumHeight = 0.f; }; - /** - * Use this bus to send messages to a camera component on an entity - * If you create your own camera you should implement this bus - * Call like this: - * Camera::CameraRequestBus::Event(cameraEntityId, &Camera::CameraRequestBus::Events::SetFov, newFov); - */ + //! Use this bus to send messages to a camera component on an entity + //! If you create your own camera you should implement this bus + //! Call like this: + //! Camera::CameraRequestBus::Event(cameraEntityId, &Camera::CameraRequestBus::Events::SetFov, newFov); class CameraComponentRequests : public AZ::ComponentBus { public: virtual ~CameraComponentRequests() = default; - /** - * Gets the camera's field of view in degrees - * @return The camera's field of view in degrees - */ + //! Gets the camera's field of view in degrees + //! @return The camera's field of view in degrees virtual float GetFov() { AZ_WarningOnce("CameraBus", false, "GetFov is deprecated. Please use GetFovDegrees or GetFovRadians."); return GetFovDegrees(); } - /** - * Gets the camera's field of view in degrees - * @return The camera's field of view in degrees - */ + //! Gets the camera's field of view in degrees + //! @return The camera's field of view in degrees virtual float GetFovDegrees() = 0; - /** - * Gets the camera's field of view in radians - * @return The camera's field of view in radians - */ + //! Gets the camera's field of view in radians + //! @return The camera's field of view in radians virtual float GetFovRadians() = 0; - /** - * Gets the camera's distance from the near clip plane in meters - * @return The camera's distance from the near clip plane in meters - */ + //! Gets the camera's distance from the near clip plane in meters + //! @return The camera's distance from the near clip plane in meters virtual float GetNearClipDistance() = 0; - /** - * Gets the camera's distance from the far clip plane in meters - * @return The camera's distance from the far clip plane in meters - */ + //! Gets the camera's distance from the far clip plane in meters + //! @return The camera's distance from the far clip plane in meters virtual float GetFarClipDistance() = 0; - /** - * Gets the camera frustum's width - * @return The camera frustum's width - */ + //! Gets the camera frustum's width + //! @return The camera frustum's width virtual float GetFrustumWidth() = 0; - /** - * Gets the camera frustum's height - * @return The camera frustum's height - */ + //! Gets the camera frustum's height + //! @return The camera frustum's height virtual float GetFrustumHeight() = 0; - /** - * Sets the camera's field of view in degrees between 0 < fov < 180 degrees - * @param fov The camera frustum's new field of view in degrees - */ + //! Sets the camera's field of view in degrees between 0 < fov < 180 degrees + //! @param fov The camera frustum's new field of view in degrees virtual void SetFov(float fov) { AZ_WarningOnce("CameraBus", false, "SetFov is deprecated. Please use SetFovDegrees or SetFovRadians."); SetFovDegrees(fov); } - /** - * Sets the camera's field of view in degrees between 0 < fov < 180 degrees - * @param fov The camera frustum's new field of view in degrees - */ + //! Sets the camera's field of view in degrees between 0 < fov < 180 degrees + //! @param fov The camera frustum's new field of view in degrees virtual void SetFovDegrees(float fovInDegrees) = 0; - /** - * Sets the camera's field of view in radians between 0 < fov < pi radians - * @param fov The camera frustum's new field of view in radians - */ + //! Sets the camera's field of view in radians between 0 < fov < pi radians + //! @param fov The camera frustum's new field of view in radians virtual void SetFovRadians(float fovInRadians) = 0; - /** - * Sets the near clip plane to a given distance from the camera in meters. Should be small, but greater than 0 - * @param nearClipDistance The camera frustum's new near clip plane distance from camera - */ + //! Sets the near clip plane to a given distance from the camera in meters. Should be small, but greater than 0 + //! @param nearClipDistance The camera frustum's new near clip plane distance from camera virtual void SetNearClipDistance(float nearClipDistance) = 0; - /** - * Sets the far clip plane to a given distance from the camera in meters. - * @param farClipDistance The camera frustum's new far clip plane distance from camera - */ + //! Sets the far clip plane to a given distance from the camera in meters. + //! @param farClipDistance The camera frustum's new far clip plane distance from camera virtual void SetFarClipDistance(float farClipDistance) = 0; - /** - * Sets the camera frustum's width - * @param width The camera frustum's new width - */ + //! Sets the camera frustum's width + //! @param width The camera frustum's new width virtual void SetFrustumWidth(float width) = 0; - /** - * Sets the camera frustum's height - * @param height The camera frustum's new height - */ + //! Sets the camera frustum's height + //! @param height The camera frustum's new height virtual void SetFrustumHeight(float height) = 0; - /** - * Makes the camera the active view - */ + //! Makes the camera the active view virtual void MakeActiveView() = 0; + //! Get the camera frustum's aggregate configuration virtual Configuration GetCameraConfiguration() { return Configuration @@ -147,14 +117,11 @@ namespace Camera }; using CameraRequestBus = AZ::EBus; - /** - * Use this broadcast bus to gather a list of all active cameras - * If you create your own camera you should handle this bus - * Call like this: - * - * AZ::EBusAggregateResults results; - * Camera::CameraBus::BroadcastResult(results, &Camera::CameraRequests::GetCameras); - */ + //! Use this broadcast bus to gather a list of all active cameras + //! If you create your own camera you should handle this bus + //! Call like this: + //! AZ::EBusAggregateResults results; + //! Camera::CameraBus::BroadcastResult(results, &Camera::CameraRequests::GetCameras); class CameraRequests : public AZ::EBusTraits { @@ -166,18 +133,14 @@ namespace Camera }; using CameraBus = AZ::EBus; - /** - * Use this system broadcast for things like getting the active camera - */ + //! Use this system broadcast for things like getting the active camera class CameraSystemRequests : public AZ::EBusTraits { public: virtual ~CameraSystemRequests() = default; - /** - * returns the camera being used by the active view - */ + //! returns the camera being used by the active view virtual AZ::EntityId GetActiveCamera() = 0; }; using CameraSystemRequestBus = AZ::EBus; @@ -198,13 +161,11 @@ namespace Camera }; using ActiveCameraRequestBus = AZ::EBus; - /** - * Handle this bus if you want to know when cameras are added or removed during edit or run time - * You will get an OnCameraAdded event for each camera that is already active - * If you create your own camera you should call this bus on activation/deactivation - * Connect to the bus like this - * Camera::CameraNotificationBus::Handler::Connect() - */ + //! Handle this bus if you want to know when cameras are added or removed during edit or run time + //! You will get an OnCameraAdded event for each camera that is already active + //! If you create your own camera you should call this bus on activation/deactivation + //! Connect to the bus like this + //! Camera::CameraNotificationBus::Handler::Connect() class CameraNotifications : public AZ::EBusTraits { @@ -223,28 +184,33 @@ namespace Camera { handler->OnCameraAdded(cameraId); } + + AZ::EntityId activeView; + CameraSystemRequestBus::BroadcastResult(activeView, &CameraSystemRequestBus::Events::GetActiveCamera); + if (activeView.IsValid()) + { + handler->OnActiveViewChanged(activeView); + } } }; - /** - * If the camera is active when a handler connects to the bus, - * then OnCameraAdded() is immediately dispatched. - */ + //! If the camera is active when a handler connects to the bus, + //! then OnCameraAdded() is immediately dispatched. template using ConnectionPolicy = CameraNotificationConnectionPolicy; virtual ~CameraNotifications() = default; - /** - * Called whenever a camera entity is added - * @param cameraId The id of the camera added - */ - virtual void OnCameraAdded(const AZ::EntityId& cameraId) = 0; - - /** - * Called whenever a camera entity is removed - * @param cameraId The id of the camera removed - */ - virtual void OnCameraRemoved(const AZ::EntityId& cameraId) = 0; + //! Called whenever a camera entity is added + //! @param cameraId The id of the camera added + virtual void OnCameraAdded(const AZ::EntityId& /*cameraId*/) {} + + //! Called whenever a camera entity is removed + //! @param cameraId The id of the camera removed + virtual void OnCameraRemoved(const AZ::EntityId& /*cameraId*/) {} + + //! Called whenever the active camera entity changes + //! @param cameraId The id of the newly activated camera + virtual void OnActiveViewChanged(const AZ::EntityId&) {} }; using CameraNotificationBus = AZ::EBus; diff --git a/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.cpp b/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.cpp index 80e838f064..630dbb0322 100644 --- a/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.cpp @@ -44,10 +44,7 @@ namespace AzFramework incompatible.push_back(AZ_CRC_CE("LookAtService")); incompatible.push_back(AZ_CRC_CE("SequenceService")); incompatible.push_back(AZ_CRC_CE("ClothMeshService")); - incompatible.push_back(AZ_CRC_CE("PhysXColliderService")); - incompatible.push_back(AZ_CRC_CE("PhysXTriggerService")); incompatible.push_back(AZ_CRC_CE("PhysXJointService")); - incompatible.push_back(AZ_CRC_CE("PhysXShapeColliderService")); incompatible.push_back(AZ_CRC_CE("PhysXCharacterControllerService")); incompatible.push_back(AZ_CRC_CE("PhysXRagdollService")); incompatible.push_back(AZ_CRC_CE("WhiteBoxService")); diff --git a/Code/Framework/AzFramework/AzFramework/Engine/Engine.cpp b/Code/Framework/AzFramework/AzFramework/Engine/Engine.cpp deleted file mode 100644 index 67bb1e5085..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Engine/Engine.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ - -#include - -#include -#include - -namespace AzFramework -{ - namespace Engine - { - AZ::IO::FixedMaxPath FindEngineRoot(AZStd::string_view searchPath) - { - // File to locate - const char engineRootMarker[] = "engine.json"; - - AZ::IO::FixedMaxPath currentSearchPath{searchPath}; - if (currentSearchPath.empty()) - { - char executablePath[AZ_MAX_PATH_LEN]; - AZ::Utils::GetExecutablePathReturnType result = AZ::Utils::GetExecutablePath(executablePath, AZ_MAX_PATH_LEN); - currentSearchPath = executablePath; - } - do - { - currentSearchPath = currentSearchPath.ParentPath(); - if (AZ::IO::SystemFile::Exists((currentSearchPath / engineRootMarker).c_str())) - { - return currentSearchPath; - } - } while (currentSearchPath.ParentPath() != currentSearchPath); - - return {}; - } - } -} // AzFramework - diff --git a/Code/Framework/AzFramework/AzFramework/Engine/Engine.h b/Code/Framework/AzFramework/AzFramework/Engine/Engine.h deleted file mode 100644 index 9012ac4106..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Engine/Engine.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ -#pragma once - -#include -#include - -namespace AzFramework -{ - namespace Engine - { - // Helper to attempt to locate the engine root by searching up the directory tree. If no search path is - // provided the current executable path is used - AZ::IO::FixedMaxPath FindEngineRoot(AZStd::string_view searchPath = {}); - } // Engine -} // AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Entity/SliceEntityOwnershipService.h b/Code/Framework/AzFramework/AzFramework/Entity/SliceEntityOwnershipService.h index 09a691ef15..6174d85d4d 100644 --- a/Code/Framework/AzFramework/AzFramework/Entity/SliceEntityOwnershipService.h +++ b/Code/Framework/AzFramework/AzFramework/Entity/SliceEntityOwnershipService.h @@ -100,9 +100,9 @@ namespace AzFramework //! @param idRemapTable if remapIds is true, the provided table is filled with a map of original ids to new ids //! @param filterDesc any ObjectStream::LoadFlags //! @return whether or not the root slice was successfully loaded from the provided stream - virtual bool LoadFromStream(AZ::IO::GenericStream& stream, bool remapIds, + bool LoadFromStream(AZ::IO::GenericStream& stream, bool remapIds, EntityIdToEntityIdMap* idRemapTable = nullptr, - const AZ::ObjectStream::FilterDescriptor& filterDesc = AZ::ObjectStream::FilterDescriptor()); + const AZ::ObjectStream::FilterDescriptor& filterDesc = AZ::ObjectStream::FilterDescriptor()) override; //! Executes the post-add actions for the provided list of entities, like connecting to required ebuses. //! @param entities The entities to perform the post-add actions for. diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Casts.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Casts.cpp deleted file mode 100644 index 7f829c1afa..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/Casts.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -namespace Physics -{ - /// This structure is used only for reflecting type vector to - /// serialize and behavior context. It's not used in the API anywhere - struct RaycastHitArray - { - AZ_TYPE_INFO(RaycastHitArray, "{BAFCC4E7-A06B-4909-B2AE-C89D9E84FE4E}"); - AZStd::vector m_hitArray; - }; - - AZStd::vector> PopulateCollisionGroups() - { - AZStd::vector> elems; - const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetCollisionConfiguration(); - for (const AzPhysics::CollisionGroups::Preset& preset : configuration.m_collisionGroups.GetPresets()) - { - elems.push_back({ AzPhysics::CollisionGroup(preset.m_name), preset.m_name }); - } - return elems; - } - - - void RayCastHit::Reflect(AZ::ReflectContext* context) - { - if (auto serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Field("Distance", &RayCastRequest::m_distance) - ->Field("Start", &RayCastRequest::m_start) - ->Field("Direction", &RayCastRequest::m_direction) - ->Field("Collision", &RayCastRequest::m_collisionGroup) - ->Field("QueryType", &RayCastRequest::m_queryType) - ->Field("MaxResults", &RayCastRequest::m_maxResults) - ; - - serializeContext->Class() - ->Field("Distance", &RayCastHit::m_distance) - ->Field("Position", &RayCastHit::m_position) - ->Field("Normal", &RayCastHit::m_normal) - ; - - serializeContext->Class() - ->Field("HitArray", &RaycastHitArray::m_hitArray) - ; - - if (auto editContext = azrtti_cast(serializeContext->GetEditContext())) - { - editContext->Enum("Query Type", "Object types to include in the query") - ->Value("Static", QueryType::Static) - ->Value("Dynamic", QueryType::Dynamic) - ->Value("Static and Dynamic", QueryType::StaticAndDynamic) - ; - - editContext->Class("RayCast Request", "Parameters for raycast") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &RayCastRequest::m_start, "Start", "Start position of the raycast") - ->DataElement(AZ::Edit::UIHandlers::Default, &RayCastRequest::m_distance, "Distance", "Length of the raycast") - ->DataElement(AZ::Edit::UIHandlers::Default, &RayCastRequest::m_direction, "Direction", "Direction of the raycast") - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &RayCastRequest::m_collisionGroup, "Collision Group", "The layers to include in the query") - ->Attribute(AZ::Edit::Attributes::EnumValues, &PopulateCollisionGroups) - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &RayCastRequest::m_queryType, "Query Type", "Object types to include in the query") - ->DataElement(AZ::Edit::UIHandlers::Default, &RayCastRequest::m_maxResults, "Max results", "The Maximum results for this request to return, this is limited by the value set in WorldConfiguration") - ; - } - } - - if (auto behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class("RayCastRequest") - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Attribute(AZ::Script::Attributes::Module, "physics") - ->Attribute(AZ::Script::Attributes::Category, "PhysX") - ->Property("Distance", BehaviorValueProperty(&RayCastRequest::m_distance)) - ->Property("Start", BehaviorValueProperty(&RayCastRequest::m_start)) - ->Property("Direction", BehaviorValueProperty(&RayCastRequest::m_direction)) - ->Property("Collision", BehaviorValueProperty(&RayCastRequest::m_collisionGroup)) - // Until enum class support for behavior context is done, expose this as an int - ->Property("QueryType", [](const RayCastRequest& self) { return static_cast(self.m_queryType); }, - [](RayCastRequest& self, int newQueryType) { self.m_queryType = QueryType(newQueryType); }) - ->Property("MaxResults", BehaviorValueProperty(&RayCastRequest::m_maxResults)) - ; - - behaviorContext->Class("RayCastHit") - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Attribute(AZ::Script::Attributes::Module, "physics") - ->Attribute(AZ::Script::Attributes::Category, "PhysX") - ->Property("Distance", BehaviorValueProperty(&RayCastHit::m_distance)) - ->Property("Position", BehaviorValueProperty(&RayCastHit::m_position)) - ->Property("Normal", BehaviorValueProperty(&RayCastHit::m_normal)) - ->Property("EntityId", [](RayCastHit& result) { return result.m_body != nullptr ? result.m_body->GetEntityId() : AZ::EntityId(); }, nullptr) - ; - - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Attribute(AZ::Script::Attributes::Module, "physics") - ->Attribute(AZ::Script::Attributes::Category, "PhysX") - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) - ->Property("HitArray", BehaviorValueProperty(&RaycastHitArray::m_hitArray)) - ; - } - } - -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Casts.h b/Code/Framework/AzFramework/AzFramework/Physics/Casts.h deleted file mode 100644 index 962d89f341..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/Casts.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace Physics -{ - class WorldBody; - class Shape; - class ShapeConfiguration; - - /// Enum to specify the hit type returned by the filter callback. - enum QueryHitType - { - None, ///< The hit should not be reported. - Touch, ///< The hit should be reported but it should not block the query - Block ///< The hit should be reported and it should block the query - }; - - /// Callback used for directed scene queries: RayCasts and ShapeCasts - using FilterCallback = AZStd::function; - - /// Enum to specify which shapes are included in the query. - enum class QueryType : int - { - Static, ///< Only test against static shapes - Dynamic, ///< Only test against dynamic shapes - StaticAndDynamic ///< Test against both static and dynamic shapes - }; - - //! Scene query and geometry query behavior flags. - //! - //! HitFlags are used for 3 different purposes: - //! - //! 1) To request hit fields to be filled in by scene queries (such as hit position, normal, face index or UVs). - //! 2) Once query is completed, to indicate which fields are valid (note that a query may produce more valid fields than requested). - //! 3) To specify additional options for the narrow phase and mid-phase intersection routines. - enum class HitFlags : AZ::u16 - { - Position = (1 << 0), //!< "position" member of the hit is valid - Normal = (1 << 1), //!< "normal" member of the hit is valid - UV = (1 << 3), //!< "u" and "v" barycentric coordinates of the hit are valid. Not applicable to ShapeCast queries. - //! Performance hint flag for ShapeCasts when it is known upfront there's no initial overlap. - //! NOTE: using this flag may cause undefined results if shapes are initially overlapping. - AssumeNoInitialOverlap = (1 << 4), - MeshMultiple = (1 << 5), //!< Report all hits for meshes rather than just the first. Not applicable to ShapeCast queries. - //! Report any first hit for meshes. If neither MeshMultiple nor MeshAny is specified, - //! a single closest hit will be reported for meshes. - MeshAny = (1 << 6), - //! Report hits with back faces of mesh triangles. Also report hits for raycast - //! originating on mesh surface and facing away from the surface normal. Not applicable to ShapeCast queries. - MeshBothSides = (1 << 7), - PreciseSweep = (1 << 8), //!< Use more accurate but slower narrow phase sweep tests. - MTD = (1 << 9), //!< Report the minimum translation depth, normal and contact point. - FaceIndex = (1 << 10), //!< "face index" member of the hit is valid. Required to get the per-face material data. - Default = Position | Normal | FaceIndex - }; - - /// Casts a ray from a starting pose along a direction returning objects that intersected with the ray. - struct RayCastRequest - { - AZ_CLASS_ALLOCATOR(RayCastRequest, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(RayCastRequest, "{53EAD088-A391-48F1-8370-2A1DBA31512F}"); - - float m_distance = 500.0f; ///< The distance along m_dir direction. - AZ::Vector3 m_start = AZ::Vector3::CreateZero(); ///< World space point where ray starts from. - AZ::Vector3 m_direction = AZ::Vector3::CreateZero(); ///< World space direction (normalized). - AzPhysics::CollisionGroup m_collisionGroup = AzPhysics::CollisionGroup::All; ///< The layers to include in the query - FilterCallback m_filterCallback = nullptr; ///< Hit filtering function - QueryType m_queryType = QueryType::StaticAndDynamic; ///< Object types to include in the query - HitFlags m_hitFlags = HitFlags::Default; ///< Query behavior flags - AZ::u64 m_maxResults = 32; ///< The Maximum results for this request to return, this is limited by the value set in WorldConfiguration - }; - - /// Sweeps a shape from a starting pose along a direction returning objects that intersected with the shape. - struct ShapeCastRequest - { - AZ_CLASS_ALLOCATOR(ShapeCastRequest, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(ShapeCastRequest, "{52F6C536-92F6-4C05-983D-0A74800AE56D}"); - - float m_distance = 500.0f; /// The distance to cast along m_dir direction. - AZ::Transform m_start = AZ::Transform::CreateIdentity(); ///< World space start position. Assumes only rotation + translation (no scaling). - AZ::Vector3 m_direction = AZ::Vector3::CreateZero(); ///< World space direction (Should be normalized) - ShapeConfiguration* m_shapeConfiguration = nullptr; ///< Shape information. - AzPhysics::CollisionGroup m_collisionGroup = AzPhysics::CollisionGroup::All; ///< Collision filter for the query. - FilterCallback m_filterCallback = nullptr; ///< Hit filtering function - QueryType m_queryType = QueryType::StaticAndDynamic; ///< Object types to include in the query - HitFlags m_hitFlags = HitFlags::Default; ///< Query behavior flags - AZ::u64 m_maxResults = 32; ///< The Maximum results for this request to return, this is limited by the value set in WorldConfiguration - }; - - /// Callback used for undirected scene queries: Overlaps - using OverlapFilterCallback = AZStd::function; - - /// Searches a region enclosed by a specified shape for any overlapping objects in the scene. - struct OverlapRequest - { - AZ_CLASS_ALLOCATOR(OverlapRequest, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(OverlapRequest, "{3DC986C2-316B-4C54-A0A6-8ABBB8ABCC4A}"); - - AZ::Transform m_pose = AZ::Transform::CreateIdentity(); ///< Initial shape pose - ShapeConfiguration* m_shapeConfiguration = nullptr; ///< Shape information. - AzPhysics::CollisionGroup m_collisionGroup = AzPhysics::CollisionGroup::All; ///< Collision filter for the query. - OverlapFilterCallback m_filterCallback = nullptr; ///< Hit filtering function - QueryType m_queryType = QueryType::StaticAndDynamic; ///< Object types to include in the query - AZ::u64 m_maxResults = 32; ///< The Maximum results for this request to return, this is limited by the value set in WorldConfiguration - }; - - /// Structure used to store the result from either a raycast or a shape cast. - struct RayCastHit - { - AZ_CLASS_ALLOCATOR(RayCastHit, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(RayCastHit, "{A46CBEA6-6B92-4809-9363-9DDF0F74F296}"); - static void Reflect(AZ::ReflectContext* context); - - inline operator bool() const { return m_body != nullptr; } - - float m_distance = 0.0f; ///< The distance along the cast at which the hit occurred as given by Dot(m_normal, startPoint) - Dot(m_normal, m_point). - AZ::Vector3 m_position = AZ::Vector3::CreateZero(); ///< The position of the hit in world space - AZ::Vector3 m_normal = AZ::Vector3::CreateZero(); ///< The normal of the surface hit - WorldBody* m_body = nullptr; ///< World body that was hit. - Shape* m_shape = nullptr; ///< The shape on the body that was hit - Material* m_material = nullptr; ///< The material on the shape (or face) that was hit - }; - - /// Overlap hit. - struct OverlapHit - { - AZ_CLASS_ALLOCATOR(OverlapHit, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(OverlapHit, "{7A7201B9-67B5-438B-B4EB-F3EEBB78C617}"); - - inline operator bool() const { return m_body != nullptr; } - - WorldBody* m_body = nullptr; ///< World body that was hit. - Shape* m_shape = nullptr; ///< The shape on the body that was hit - Material* m_material = nullptr; ///< The material on the shape (or face) that was hit - }; - - /// Bitwise operators for HitFlags - inline HitFlags operator|(HitFlags lhs, HitFlags rhs) - { - return static_cast(static_cast(lhs) | static_cast(rhs)); - } - - inline HitFlags operator&(HitFlags lhs, HitFlags rhs) - { - return static_cast(static_cast(lhs) & static_cast(rhs)); - } -} // namespace Physics - -namespace AZ -{ - AZ_TYPE_INFO_SPECIALIZE(Physics::QueryType, "{0E0E56A8-73A8-40B4-B438-B19FC852E3C0}"); -} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Character.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Character.cpp index f161f68973..02e2ffd1e3 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Character.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Character.cpp @@ -88,7 +88,7 @@ namespace Physics AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(2) ->Field("CollisionLayer", &CharacterConfiguration::m_collisionLayer) ->Field("CollisionGroupId", &CharacterConfiguration::m_collisionGroupId) diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Character.h b/Code/Framework/AzFramework/AzFramework/Physics/Character.h index e1639384a1..c43c6de9e8 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Character.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Character.h @@ -15,11 +15,11 @@ #include #include -#include #include #include - +#include +#include namespace Physics { @@ -59,11 +59,11 @@ namespace Physics /// Information required to create the basic physics representation of a character. class CharacterConfiguration - : public WorldBodyConfiguration + : public AzPhysics::SimulatedBodyConfiguration { public: AZ_CLASS_ALLOCATOR(CharacterConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(CharacterConfiguration, "{58D5A6CA-113B-4AC3-8D53-239DB0C4E240}"); + AZ_RTTI(CharacterConfiguration, "{58D5A6CA-113B-4AC3-8D53-239DB0C4E240}", AzPhysics::SimulatedBodyConfiguration); virtual ~CharacterConfiguration() = default; @@ -84,11 +84,11 @@ namespace Physics /// all-purpose character controller implementation. This class just abstracts some common functionality amongst /// typical characters, and is take-it-or-leave it style; useful as a starting point or reference. class Character - : public WorldBody + : public AzPhysics::SimulatedBody { public: AZ_CLASS_ALLOCATOR(Character, AZ::SystemAllocator, 0); - AZ_RTTI(Character, "{962E37A1-3401-4672-B896-0A6157CFAC97}", WorldBody); + AZ_RTTI(Character, "{962E37A1-3401-4672-B896-0A6157CFAC97}", AzPhysics::SimulatedBody); ~Character() override = default; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/CharacterPhysicsDataBus.h b/Code/Framework/AzFramework/AzFramework/Physics/CharacterPhysicsDataBus.h index c0b14c38a6..5bed17b333 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/CharacterPhysicsDataBus.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/CharacterPhysicsDataBus.h @@ -36,7 +36,33 @@ namespace AzFramework public: virtual ~CharacterPhysicsDataNotifications() = default; - virtual void OnRagdollConfigurationReady() = 0; + virtual void OnRagdollConfigurationReady(const Physics::RagdollConfiguration& ragdollConfiguration) = 0; + + //! When connecting to this bus, if the ragdoll configuration is ready + //! it will immediately send an OnRagdollConfigurationReady event. + template + struct ConnectionPolicy + : public AZ::EBusConnectionPolicy + { + static void Connect( + typename Bus::BusPtr& busPtr, + typename Bus::Context& context, + typename Bus::HandlerNode& handler, + typename Bus::Context::ConnectLockGuard& connectLock, + const typename Bus::BusIdType& id = 0) + { + AZ::EBusConnectionPolicy::Connect(busPtr, context, handler, connectLock, id); + + bool ragdollConfigValid = false; + Physics::RagdollConfiguration ragdollConfiguration; + CharacterPhysicsDataRequestBus::EventResult(ragdollConfigValid, id, + &CharacterPhysicsDataRequests::GetRagdollConfiguration, ragdollConfiguration); + if (ragdollConfigValid) + { + handler->OnRagdollConfigurationReady(ragdollConfiguration); + } + } + }; }; using CharacterPhysicsDataNotificationBus = AZ::EBus; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp b/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp index f13e62c072..eb74390638 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp @@ -264,63 +264,5 @@ namespace Physics return success; } - - bool RigidBodyVersionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) - { - if (classElement.GetVersion() <= 1) - { - const int elementIndex = classElement.FindElement(AZ_CRC("Centre of mass offset", 0x1e569a45)); - - if (elementIndex >= 0) - { - AZ::Vector3 existingCenterOfMassOffset; - AZ::SerializeContext::DataElementNode& centerOfMassElement = classElement.GetSubElement(elementIndex); - const bool found = centerOfMassElement.GetData(existingCenterOfMassOffset); - - if (found && !existingCenterOfMassOffset.IsZero()) - { - // An existing center of mass (COM) offset value was specified for this rigid body. - // Version 2 includes a new m_computeCenterOfMass boolean flag to specify the automatic calculation of COM. - // In this case set m_computeCenterOfMass to false so that the existing center of mass offset value is utilized correctly. - const int idx = classElement.AddElement(context, "Compute COM"); - if (idx != -1) - { - if (!classElement.GetSubElement(idx).SetData(context, false)) - { - return false; - } - } - } - } - } - - if (classElement.GetVersion() <= 2) - { - const int elementIndex = classElement.FindElement(AZ_CRC("Mass", 0x6c035b66)); - - if (elementIndex >= 0) - { - float existingMass = 0; - AZ::SerializeContext::DataElementNode& massElement = classElement.GetSubElement(elementIndex); - const bool found = massElement.GetData(existingMass); - - if (found && existingMass > 0) - { - // Keeping the existing mass and disabling auto-compute of the mass for this rigid body. - // Version 3 includes a new m_computeMass boolean flag to specify the automatic calculation of mass. - const int idx = classElement.AddElement(context, "Compute Mass"); - if (idx != -1) - { - if (!classElement.GetSubElement(idx).SetData(context, false)) - { - return false; - } - } - } - } - } - - return true; - } } // namespace ClassConverters } // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.h b/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.h index 312c16cd03..d07707c94e 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.h @@ -22,6 +22,6 @@ namespace Physics bool MaterialLibraryAssetConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); bool ColliderConfigurationConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); bool MaterialSelectionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); - bool RigidBodyVersionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); + } // namespace ClassConverters -} // namespace Physics \ No newline at end of file +} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Collision/CollisionEvents.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Collision/CollisionEvents.cpp new file mode 100644 index 0000000000..4c9124f594 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Collision/CollisionEvents.cpp @@ -0,0 +1,132 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include + +namespace AzPhysics +{ + AZ_CLASS_ALLOCATOR_IMPL(TriggerEvent, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(Contact, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(CollisionEvent, AZ::SystemAllocator, 0); + + /*static*/ void TriggerEvent::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Version(2) + ->Field("Type", &TriggerEvent::m_type) + ->Field("TriggerBodyHandle", &TriggerEvent::m_triggerBodyHandle) + ->Field("OtherBodyHandle", &TriggerEvent::m_otherBodyHandle) + ; + } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Method("GetTriggerEntityId", &TriggerEvent::GetTriggerEntityId) + ->Method("GetOtherEntityId", &TriggerEvent::GetOtherEntityId) + ; + } + } + + AZ::EntityId TriggerEvent::GetTriggerEntityId() const + { + if (m_triggerBody) + { + return m_triggerBody->GetEntityId(); + } + return AZ::EntityId(); + } + + AZ::EntityId TriggerEvent::GetOtherEntityId() const + { + if (m_otherBody) + { + return m_otherBody->GetEntityId(); + } + return AZ::EntityId(); + } + + /*static*/ void Contact::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Version(1) + ->Field("Position", &Contact::m_position) + ->Field("Normal", &Contact::m_normal) + ->Field("Impulse", &Contact::m_impulse) + ->Field("Separation", &Contact::m_separation) + ; + } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class("Contact") + ->Property("Position", BehaviorValueProperty(&Contact::m_position)) + ->Property("Normal", BehaviorValueProperty(&Contact::m_normal)) + ->Property("Impulse", BehaviorValueProperty(&Contact::m_impulse)) + ->Property("Separation", BehaviorValueProperty(&Contact::m_separation)) + ; + } + } + + /*static*/ void CollisionEvent::Reflect(AZ::ReflectContext* context) + { + Contact::Reflect(context); + + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Version(3) + ->Field("Type", &CollisionEvent::m_type) + ->Field("Contacts", &CollisionEvent::m_contacts) + ->Field("BodyHandle1", &CollisionEvent::m_bodyHandle1) + ->Field("BodyHandle2", &CollisionEvent::m_bodyHandle2) + ; + } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Property("Contacts", BehaviorValueProperty(&CollisionEvent::m_contacts)) + ->Method("GetBody1EntityId", &CollisionEvent::GetBody1EntityId) + ->Method("GetBody2EntityId", &CollisionEvent::GetBody2EntityId) + ; + } + } + + AZ::EntityId CollisionEvent::GetBody1EntityId() const + { + if (m_body1) + { + return m_body1->GetEntityId(); + } + return AZ::EntityId(); + } + + AZ::EntityId CollisionEvent::GetBody2EntityId() const + { + if (m_body2) + { + return m_body2->GetEntityId(); + } + return AZ::EntityId(); + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Collision/CollisionEvents.h b/Code/Framework/AzFramework/AzFramework/Physics/Collision/CollisionEvents.h new file mode 100644 index 0000000000..1eab2b4f4b --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Collision/CollisionEvents.h @@ -0,0 +1,107 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include + +#include + +namespace AZ +{ + class ReflectContext; +} + +namespace Physics +{ + class Shape; +} + +namespace AzPhysics +{ + struct SimulatedBody; + + //! Trigger event raised when an object enters/exits a trigger shape. + struct TriggerEvent + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_TYPE_INFO(TriggerEvent, "{7A0851A3-2CBD-4A03-85D5-1C40221E7F61}"); + static void Reflect(AZ::ReflectContext* context); + + enum class Type : AZ::u8 + { + Enter, + Exit + }; + + Type m_type; //! The type of trigger event. + SimulatedBodyHandle m_triggerBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; //!< Handle to the trigger body + SimulatedBody* m_triggerBody = nullptr; //!< The trigger body + Physics::Shape* m_triggerShape = nullptr; //!< The trigger shape + SimulatedBodyHandle m_otherBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; //!< Handle to the body that entered the trigger + SimulatedBody* m_otherBody = nullptr; //!< The other body that entered the trigger + Physics::Shape* m_otherShape = nullptr; //!< The other shape that entered the trigger + + private: + // helpers for reflecting to behaviour context + AZ::EntityId GetTriggerEntityId() const; + AZ::EntityId GetOtherEntityId() const; + }; + using TriggerEventList = AZStd::vector; + + //! Stores information about the contacts between two overlapping shapes. + struct Contact + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_TYPE_INFO(Contact, "{D7439508-ED10-4395-9D48-1FC3D7815361}"); + static void Reflect(AZ::ReflectContext* context); + + AZ::Vector3 m_position; //!< The position of the contact + AZ::Vector3 m_normal; //!< The normal of the contact + AZ::Vector3 m_impulse; //!< The impulse force applied to separate the bodies + AZ::u32 m_internalFaceIndex01 = 0; //!< Internal face index of the first shape + AZ::u32 m_internalFaceIndex02 = 0; //!< Internal face index of the second shape + float m_separation = 0.0f; //!< The separation + }; + + //! A collision event raised when two objects, neither of which can be triggers, overlap. + struct CollisionEvent + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_TYPE_INFO(CollisionEvent, "{7602AA36-792C-4BDC-BDF8-AA16792151A3}"); + static void Reflect(AZ::ReflectContext* context); + + enum class Type : AZ::u8 + { + Begin, + Persist, + End + }; + Type m_type; //! The Type of collision event. + SimulatedBodyHandle m_bodyHandle1 = AzPhysics::InvalidSimulatedBodyHandle; //!< Handle to the first body + SimulatedBody* m_body1 = nullptr; //! The first body + Physics::Shape* m_shape1 = nullptr; //!< The shape on the first body + SimulatedBodyHandle m_bodyHandle2 = AzPhysics::InvalidSimulatedBodyHandle; //!< Handle to the second body + SimulatedBody* m_body2 = nullptr; //! The second body + Physics::Shape* m_shape2 = nullptr; //!< The shape on the second body + AZStd::vector m_contacts; //!< The contacts between the two shapes + + private: + // helpers for reflecting to behaviour context + AZ::EntityId GetBody1EntityId() const; + AZ::EntityId GetBody2EntityId() const; + }; + using CollisionEventList = AZStd::vector; +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/CollisionBus.h b/Code/Framework/AzFramework/AzFramework/Physics/CollisionBus.h index 5c2d7dbaf8..4826c46be9 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/CollisionBus.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/CollisionBus.h @@ -60,8 +60,6 @@ namespace Physics /// Creates a new collision group preset with corresponding groupName. virtual void CreateCollisionGroup(const AZStd::string& groupName, const AzPhysics::CollisionGroup& group) = 0; - - virtual AzPhysics::CollisionConfiguration GetCollisionConfiguration() = 0; }; /// Collision requests bus traits. Singleton pattern. diff --git a/Code/Framework/AzFramework/AzFramework/Physics/CollisionNotificationBus.h b/Code/Framework/AzFramework/AzFramework/Physics/CollisionNotificationBus.h deleted file mode 100644 index 6b5992316f..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/CollisionNotificationBus.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include - -namespace Physics -{ - /// CollisionNotifications - /// Bus interface for receiving collision events from a Physics::World - /// - /// The bus is addressed by EntityId. Body1 inside collisionEvent will correspond - /// to the eEntity id subscribed to. Body2 will always be the other body colliding with the entity. - class CollisionNotifications - : public AZ::ComponentBus - { - public: - // Ebus Traits. ID'd on body1 entity Id - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; - static const bool EnableEventQueue = true; - using BusIdType = AZ::EntityId; - - virtual ~CollisionNotifications() {} - - /// Dispatched when two shapes start colliding. - virtual void OnCollisionBegin(const CollisionEvent& /*collisionEvent*/) {} - - /// Dispatched when two shapes continue colliding. - virtual void OnCollisionPersist(const CollisionEvent& /*collisionEvent*/) {} - - /// Dispatched when two shapes stop colliding. - virtual void OnCollisionEnd(const CollisionEvent& /*collisionEvent*/) {} - }; - - /// Bus to service the PhysX Trigger Area Component event group. - using CollisionNotificationBus = AZ::EBus; -} // namespace PhysX \ No newline at end of file diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h index b42e206038..d5a82c0367 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h @@ -13,6 +13,14 @@ #include #include +#include +#include +#include + +namespace AZ +{ + class Vector3; +} namespace AzPhysics { @@ -42,6 +50,14 @@ namespace AzPhysics //! Event triggers at the end of the SystemInterface::Simulate call. using OnPostsimulateEvent = AZ::Event<>; + //! Event trigger when a Scene is added to the simulation. + //! When triggered will send the handle to the new Scene. + using OnSceneAddedEvent = AZ::Event; + + //! Event trigger when a Scene is removed from the simulation. + //! When triggered will send the handle to the old Scene (after this call, the Handle will be invalid). + using OnSceneRemovedEvent = AZ::Event; + //! Event that triggers when the default material library changes. //! When triggered the event will send the Asset Id of the new material library. using OnDefaultMaterialLibraryChangedEvent = AZ::Event; @@ -50,4 +66,80 @@ namespace AzPhysics //! When triggered the event will send the new default scene configuration. using OnDefaultSceneConfigurationChangedEvent = AZ::Event; } + + namespace SceneEvents + { + //! Event that triggers when a new config is set on a scene. + //! When triggered the event will send a handle to the Scene that triggered the event and the new configuration. + using OnSceneConfigurationChanged = AZ::Event; + + //! Event that triggers when a Simulated body has been added to a scene. + //! When triggered the event will send a handle to the Scene that triggered the event and a handle to the new simulated body. + using OnSimulationBodyAdded = AZ::Event; + + //! Event that triggers when a Simulated body has been removed from a scene. + //! When triggered the event will send a handle to the Scene that triggered the event and a handle to the removed simulated body (after this call, the Handle will be invalid). + using OnSimulationBodyRemoved = AZ::Event; + + //! Event that triggers when a Simulated body has its simulation enabled. + //! When triggered the event will send a handle to the Scene that triggered the event and a handle to the affected simulated body. + using OnSimulationBodySimulationEnabled = AZ::Event; + + //! Event that triggers when a Simulated body has its simulation disabled. + //! When triggered the event will send a handle to the Scene that triggered the event and a handle to the affected simulated body. + using OnSimulationBodySimulationDisabled = AZ::Event; + + //! Enum for use with the OnSceneSimulationStartEvent and OnSceneSimulationFinishEvent AZ::OrderedEvent calls. + //! Higher values are called before lower values. + enum class PhysicsStartFinishSimulationPriority : int32_t + { + Default = 0, //!< All other systems (Game code). + Audio = 1000, //!< Audio systems (occlusion). + Scripting = 2000, //!< Scripting systems (script canvas). + Components = 3000, //!< C++ components (force region). + Animation = 4000, //!< Animation system (ragdolls). + Physics = 5000 //!< The physics system itself + }; + + //! Event triggers at the beginning of the Scene::StartSimulation call. + //! This will not trigger if the scene if not Enabled (Scene::IsEnabled() returns true). + //! When triggered the event will send a handle to the Scene that triggers the event and the delta time in seconds used to step this update. + //! @note This may fire multiple times per frame. + using OnSceneSimulationStartEvent = AZ::OrderedEvent; + using OnSceneSimulationStartHandler = AZ::OrderedEventHandler; + + //! Event triggers at the End of the Scene::FinishSimulation call. + //! This will not trigger if the scene if not Enabled (Scene::IsEnabled() returns true). + //! When triggered the event will send a handle to the Scene that triggers the event and the delta time in seconds used to step this update. + //! @note This may fire multiple times per frame. + using OnSceneSimulationFinishEvent = AZ::OrderedEvent; + using OnSceneSimulationFinishHandler = AZ::OrderedEventHandler; + + //! Event triggers during the Scene::FinishSimulation call before the OnSceneSimulationFinishEvent for a scene + //! and only if the SceneConfiguration::m_enableActiveActors is true. + //! This will not trigger if the scene is not Enabled (Scene::IsEnabled() must return true to trigger). + //! When triggered, the event will send a handle of the Scene that triggered the event and a list of SimulatedBodyHandles that were updated in this tick. + //! @note There may be a performance penalty for enabling the Active Actor Notification. + using OnSceneActiveSimulatedBodiesEvent = AZ::Event; + + //! Event triggers with an ordered list of all the collision Begin/Persist/End events that happened during a single sub simulation step. + //! When triggered the event will send a handle to the Scene that triggers the event and the list of collision events that occurred. + //! @note The event will trigger at the end of the Scene::FinishSimulation call and only if collision events were generated and will be + //! triggered before the OnSceneSimulationFinishEvent, SimulatedBodyEvents::OnCollisionBegin, SimulatedBodyEvents::OnCollisionPersist, and SimulatedBodyEvents::OnCollisionEnd. + //! This may fire multiple times per frame. + //! The CollisionEventList is only valid for the duration of the callback. + using OnSceneCollisionsEvent = AZ::Event; + + //! Event triggers with an ordered list of all the trigger Enter/Exit events that happened during single sub simulation step. + //! When triggered the event will send a handle to the Scene that triggers the event and the list of trigger events that occurred. + //! @note The event will trigger at the end of the Scene::FinishSimulation call and only if trigger events were generated and will be + //! triggered before the OnSceneSimulationFinishEvent, SimulatedBodyEvents::OnTriggerEnter and SimulatedBodyEvents::OnTriggerExit. + //! This may fire multiple times per frame. + //! The TriggerEventList is only valid for the duration of the callback. + using OnSceneTriggersEvent = AZ::Event; + + //! Event trigger when the gravity has been changed on the scene. + //! When triggered the event will send a handle to the Scene that triggers the event and the new gravity vector. + using OnSceneGravityChangedEvent = AZ::Event; + } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp new file mode 100644 index 0000000000..7cbe5b37fe --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp @@ -0,0 +1,305 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or +* a third party where indicated. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace AzPhysics +{ + AZ_CLASS_ALLOCATOR_IMPL(SceneQueryRequest, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(RayCastRequest, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(ShapeCastRequest, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(OverlapRequest, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(SceneQueryHit, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(SceneQueryHits, AZ::SystemAllocator, 0); + + namespace Internal + { + AZStd::vector> PopulateCollisionGroups() + { + AZStd::vector> elems; + const CollisionConfiguration& configuration = AZ::Interface::Get()->GetConfiguration()->m_collisionConfig; + for (const CollisionGroups::Preset& preset : configuration.m_collisionGroups.GetPresets()) + { + elems.push_back({ CollisionGroup(preset.m_name), preset.m_name }); + } + return elems; + } + } + + namespace SceneQuery + { + /*static*/ void ReflectSceneQueryObjects(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + if (auto* editContext = azrtti_cast(serializeContext->GetEditContext())) + { + editContext->Enum("Query Type Flags", "Object types to include in the query") + ->Value("Static", QueryType::Static) + ->Value("Dynamic", QueryType::Dynamic) + ->Value("Static and Dynamic", QueryType::StaticAndDynamic) + ; + } + } + + SceneQueryRequest::Reflect(context); + RayCastRequest::Reflect(context); + ShapeCastRequest::Reflect(context); + OverlapRequest::Reflect(context); + SceneQueryHits::Reflect(context); + } + } + + /*static*/ void SceneQueryRequest::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Field("MaxResults", &SceneQueryRequest::m_maxResults) + ->Field("CollisionGroup", &SceneQueryRequest::m_collisionGroup) + ->Field("QueryType", &SceneQueryRequest::m_queryType) + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("Scene Query Request", "Parameters for scene queries") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::ComboBox, &SceneQueryRequest::m_collisionGroup, "Collision Group", "The layers to include in the query") + ->Attribute(AZ::Edit::Attributes::EnumValues, &Internal::PopulateCollisionGroups) + ->DataElement(AZ::Edit::UIHandlers::ComboBox, &SceneQueryRequest::m_queryType, "Query Type", "Object types to include in the query") + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneQueryRequest::m_maxResults, "Max results", "The Maximum results for this request to return, this is limited by the value set in Physics Configuration") + ; + } + } + } + + /*static*/ void RayCastRequest::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Field("Distance", &RayCastRequest::m_distance) + ->Field("Start", &RayCastRequest::m_start) + ->Field("Direction", &RayCastRequest::m_direction) + ->Field("HitFlags", &RayCastRequest::m_hitFlags) + ->Field("ReportMultipleHits", &RayCastRequest::m_reportMultipleHits) + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("RayCast Request", "Parameters for raycast") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::Default, &RayCastRequest::m_start, "Start", "Start position of the raycast") + ->DataElement(AZ::Edit::UIHandlers::Default, &RayCastRequest::m_distance, "Distance", "Length of the raycast") + ->DataElement(AZ::Edit::UIHandlers::Default, &RayCastRequest::m_direction, "Direction", "Direction of the raycast") + ; + } + } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class("RayCastRequest") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "PhysX") + ->Property("Distance", BehaviorValueProperty(&RayCastRequest::m_distance)) + ->Property("Start", BehaviorValueProperty(&RayCastRequest::m_start)) + ->Property("Direction", BehaviorValueProperty(&RayCastRequest::m_direction)) + ->Property("Collision", BehaviorValueProperty(&RayCastRequest::m_collisionGroup)) + // Until enum class support for behavior context is done, expose this as an int + ->Property("QueryType", [](const RayCastRequest& self) { return static_cast(self.m_queryType); }, + [](RayCastRequest& self, int newQueryType) { self.m_queryType = SceneQuery::QueryType(newQueryType); }) + ; + } + } + + /*static*/ void ShapeCastRequest::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Field("Distance", &ShapeCastRequest::m_distance) + ->Field("Start", &ShapeCastRequest::m_start) + ->Field("Direction", &ShapeCastRequest::m_direction) + ->Field("ShapeConfiguration", &ShapeCastRequest::m_shapeConfiguration) + ->Field("HitFlags", &ShapeCastRequest::m_hitFlags) + ->Field("ReportMultipleHits", &ShapeCastRequest::m_reportMultipleHits) + ; + } + } + + namespace ShapeCastRequestHelpers + { + ShapeCastRequest CreateSphereCastRequest(float radius, + const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType /*= SceneQuery::QueryType::StaticAndDynamic*/, + CollisionGroup collisionGroup /*= CollisionGroup::All*/, + SceneQuery::FilterCallback filterCallback /*= nullptr*/) + { + AzPhysics::ShapeCastRequest request; + request.m_distance = distance; + request.m_start = startPose; + request.m_direction = direction; + request.m_shapeConfiguration = AZStd::make_shared(radius); + request.m_queryType = queryType; + request.m_collisionGroup = collisionGroup; + request.m_filterCallback = filterCallback; + return request; + } + + ShapeCastRequest CreateBoxCastRequest(const AZ::Vector3& boxDimensions, + const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType /*= SceneQuery::QueryType::StaticAndDynamic*/, + CollisionGroup collisionGroup /*= CollisionGroup::All*/, + SceneQuery::FilterCallback filterCallback /*= nullptr*/) + { + AzPhysics::ShapeCastRequest request; + request.m_distance = distance; + request.m_start = startPose; + request.m_direction = direction; + request.m_shapeConfiguration = AZStd::make_shared(boxDimensions); + request.m_queryType = queryType; + request.m_collisionGroup = collisionGroup; + request.m_filterCallback = filterCallback; + return request; + } + + ShapeCastRequest CreateCapsuleCastRequest(float capsuleRadius, float capsuleHeight, + const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType /*= SceneQuery::QueryType::StaticAndDynamic*/, + CollisionGroup collisionGroup /*= CollisionGroup::All*/, + SceneQuery::FilterCallback filterCallback /*= nullptr*/) + { + AzPhysics::ShapeCastRequest request; + request.m_distance = distance; + request.m_start = startPose; + request.m_direction = direction; + request.m_shapeConfiguration = AZStd::make_shared(capsuleHeight, capsuleRadius); + request.m_queryType = queryType; + request.m_collisionGroup = collisionGroup; + request.m_filterCallback = filterCallback; + return request; + } + + } // namespace ShapeCastRequestHelpers + + /*static*/ void OverlapRequest::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Field("Pose", &OverlapRequest::m_pose) + ->Field("ShapeConfiguration", &OverlapRequest::m_shapeConfiguration) + ; + } + } + + namespace OverlapRequestHelpers + { + OverlapRequest CreateSphereOverlapRequest(float radius, const AZ::Transform& pose, + SceneQuery::OverlapFilterCallback filterCallback /*= nullptr*/) + { + AzPhysics::OverlapRequest overlapRequest; + overlapRequest.m_pose = pose; + overlapRequest.m_shapeConfiguration = AZStd::make_shared(radius); + overlapRequest.m_filterCallback = filterCallback; + return overlapRequest; + } + + OverlapRequest CreateBoxOverlapRequest(const AZ::Vector3& dimensions, const AZ::Transform& pose, + SceneQuery::OverlapFilterCallback filterCallback /*= nullptr*/) + { + AzPhysics::OverlapRequest overlapRequest; + overlapRequest.m_pose = pose; + overlapRequest.m_shapeConfiguration = AZStd::make_shared(dimensions); + overlapRequest.m_filterCallback = filterCallback; + return overlapRequest; + } + + OverlapRequest CreateCapsuleOverlapRequest(float height, float radius, const AZ::Transform& pose, + SceneQuery::OverlapFilterCallback filterCallback /*= nullptr*/) + { + AzPhysics::OverlapRequest overlapRequest; + overlapRequest.m_pose = pose; + overlapRequest.m_shapeConfiguration = AZStd::make_shared(height, radius); + overlapRequest.m_filterCallback = filterCallback; + return overlapRequest; + } + + } // namespace OverlapRequestHelpers + + /*static*/ void SceneQueryHit::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Field("Distance", &SceneQueryHit::m_distance) + ->Field("Position", &SceneQueryHit::m_position) + ->Field("Normal", &SceneQueryHit::m_normal) + ->Field("BodyHandle", &SceneQueryHit::m_bodyHandle) + ->Field("EntityId", &SceneQueryHit::m_entityId) + ; + } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class("SceneQueryHit") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "PhysX") + ->Property("Distance", BehaviorValueProperty(&SceneQueryHit::m_distance)) + ->Property("Position", BehaviorValueProperty(&SceneQueryHit::m_position)) + ->Property("Normal", BehaviorValueProperty(&SceneQueryHit::m_normal)) + ->Property("BodyHandle", BehaviorValueProperty(&SceneQueryHit::m_bodyHandle)) + ->Property("EntityId", BehaviorValueProperty(&SceneQueryHit::m_entityId)) + ; + } + } + + /*static*/ void SceneQueryHits::Reflect(AZ::ReflectContext* context) + { + SceneQueryHit::Reflect(context); + + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Field("HitArray", &SceneQueryHits::m_hits) + ; + } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "PhysX") + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Property("HitArray", BehaviorValueProperty(&SceneQueryHits::m_hits)) + ; + } + } + +} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.h new file mode 100644 index 0000000000..6362374a89 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.h @@ -0,0 +1,312 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or +* a third party where indicated. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace AZ +{ + class ReflectContext; +} + +namespace Physics +{ + class Material; + class Shape; + class ShapeConfiguration; +} + +namespace AzPhysics +{ + struct SimulatedBody; + struct SceneQueryHit; + struct SceneQueryHits; + using SceneQueryHitsList = AZStd::vector; + + namespace SceneQuery + { + //! Enum to specify the hit type returned by the filter callback. + enum class QueryHitType : AZ::u8 + { + None, //!< The hit should not be reported. + Touch, //!< The hit should be reported but it should not block the query + Block //!< The hit should be reported and it should block the query + }; + + //! Enum to specify which shapes are included in the query. + enum class QueryType : AZ::u8 + { + Static, //!< Only test against static shapes + Dynamic, //!< Only test against dynamic shapes + StaticAndDynamic //!< Test against both static and dynamic shapes + }; + + //! Scene query and geometry query behavior flags. + //! + //! HitFlags are used for 3 different purposes: + //! + //! 1) To request hit fields to be filled in by scene queries (such as hit position, normal, face index or UVs). + //! 2) Once query is completed, to indicate which fields are valid (note that a query may produce more valid fields than requested). + //! 3) To specify additional options for the narrow phase and mid-phase intersection routines. + enum class HitFlags : AZ::u16 + { + Position = (1 << 0), //!< "position" member of the hit is valid + Normal = (1 << 1), //!< "normal" member of the hit is valid + UV = (1 << 3), //!< "u" and "v" barycentric coordinates of the hit are valid. Not applicable to ShapeCast queries. + //! Performance hint flag for ShapeCasts when it is known upfront there's no initial overlap. + //! NOTE: using this flag may cause undefined results if shapes are initially overlapping. + AssumeNoInitialOverlap = (1 << 4), + MeshMultiple = (1 << 5), //!< Report all hits for meshes rather than just the first. Not applicable to ShapeCast queries. + //! Report any first hit for meshes. If neither MeshMultiple nor MeshAny is specified, + //! a single closest hit will be reported for meshes. + MeshAny = (1 << 6), + //! Report hits with back faces of mesh triangles. Also report hits for raycast + //! originating on mesh surface and facing away from the surface normal. Not applicable to ShapeCast queries. + MeshBothSides = (1 << 7), + PreciseSweep = (1 << 8), //!< Use more accurate but slower narrow phase sweep tests. + MTD = (1 << 9), //!< Report the minimum translation depth, normal and contact point. + FaceIndex = (1 << 10), //!< "face index" member of the hit is valid. Required to get the per-face material data. + Default = Position | Normal | FaceIndex + }; + + //! Bitwise operators for HitFlags + inline HitFlags operator|(HitFlags lhs, HitFlags rhs) + { + return static_cast(static_cast(lhs) | static_cast(rhs)); + } + + inline HitFlags operator&(HitFlags lhs, HitFlags rhs) + { + return static_cast(static_cast(lhs) & static_cast(rhs)); + } + + //! Flag used to mark which members are valid in a SceneQueryHit object. + //! Example: if SceneQueryHit::m_resultFlags & ResultFlags::Distance is true, + //! then the SceneQueryHit::m_distance member would have a valid value. + enum ResultFlags : AZ::u8 + { + Invalid = 0, + + Distance = (1 << 0), + BodyHandle = (1 << 1), + EntityId = (1 << 2), + Shape = (1 << 3), + Material = (1 << 4), + Position = (1 << 5), + Normal = (1 << 6) + }; + //! Bitwise operators for ResultFlags + inline ResultFlags operator|(ResultFlags lhs, ResultFlags rhs) + { + return static_cast(static_cast(lhs) | static_cast(rhs)); + } + + inline ResultFlags operator|=(ResultFlags& lhs, ResultFlags rhs) + { + return (lhs = (lhs | rhs)); + } + + inline ResultFlags operator&(ResultFlags lhs, ResultFlags rhs) + { + return static_cast(static_cast(lhs) & static_cast(rhs)); + } + + //! Callback used for directed scene queries: RayCasts and ShapeCasts + using FilterCallback = AZStd::function; + + //! Callback used for undirected scene queries: Overlaps + using OverlapFilterCallback = AZStd::function; + + //! Callback for unbounded world queries. These are queries which don't require + //! building the entire result vector, and so saves memory for very large numbers of hits. + //! Called with '{ hit }' repeatedly until there are no more hits, then called with '{}', then never called again. + //! Returns 'true' to continue processing more hits, or 'false' otherwise. If the function ever returns + //! 'false', it is unspecified if the finalizing call '{}' occurs. + using UnboundedOverlapHitCallback = AZStd::function&&)>; + + using AsyncRequestId = int; + using AsyncCallback = AZStd::function; + using AsyncBatchCallback = AZStd::function; + + //! Helper used to reflect all required objects in PhysicsSceneQuery.h + void ReflectSceneQueryObjects(AZ::ReflectContext* context); + + } // namespace SceneQuery + + //! Base Scene Query request. + //! Not valid to be used with Scene::QueryScene functions + struct SceneQueryRequest + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(SceneQueryRequest, "{76ECAB7D-42BA-461F-82E6-DCED8E1BDCB9}"); + static void Reflect(AZ::ReflectContext* context); + virtual ~SceneQueryRequest() = default; + + AZ::u64 m_maxResults = 32; //!< The Maximum results for this request to return, this is limited by the value set in the SceneConfiguration + CollisionGroup m_collisionGroup = CollisionGroup::All; //!< Collision filter for the query. + SceneQuery::QueryType m_queryType = SceneQuery::QueryType::StaticAndDynamic; //!< Object types to include in the query + }; + using SceneQueryRequests = AZStd::vector>; + + //! Casts a ray from a starting pose along a direction returning objects that intersected with the ray. + struct RayCastRequest : + public SceneQueryRequest + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(RayCastRequest, "{53EAD088-A391-48F1-8370-2A1DBA31512F}", SceneQueryRequest); + static void Reflect(AZ::ReflectContext* context); + + float m_distance = 500.0f; //!< The distance to cast along the direction. + AZ::Vector3 m_start = AZ::Vector3::CreateZero(); //!< World space point where ray starts from. + AZ::Vector3 m_direction = AZ::Vector3::CreateZero(); //!< World space direction (Should be normalized) + SceneQuery::HitFlags m_hitFlags = SceneQuery::HitFlags::Default; //!< Query behavior flags + SceneQuery::FilterCallback m_filterCallback = nullptr; //!< Hit filtering function + bool m_reportMultipleHits = false; //!< flag to have the cast stop after the first hit or return all hits along the query. + }; + + //! Sweeps a shape from a starting pose along a direction returning objects that intersected with the shape. + struct ShapeCastRequest : + public SceneQueryRequest + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(ShapeCastRequest, "{52F6C536-92F6-4C05-983D-0A74800AE56D}", SceneQueryRequest); + static void Reflect(AZ::ReflectContext* context); + + float m_distance = 500.0f; //! The distance to cast along the direction. + AZ::Transform m_start = AZ::Transform::CreateIdentity(); //!< World space start position. Assumes only rotation + translation (no scaling). + AZ::Vector3 m_direction = AZ::Vector3::CreateZero(); //!< World space direction (Should be normalized) + AZStd::shared_ptr m_shapeConfiguration; //!< Shape information. + SceneQuery::HitFlags m_hitFlags = SceneQuery::HitFlags::Default; //!< Query behavior flags + SceneQuery::FilterCallback m_filterCallback = nullptr; //!< Hit filtering function + bool m_reportMultipleHits = false; //!< flag to have the cast stop after the first hit or return all hits along the query. + }; + + namespace ShapeCastRequestHelpers + { + //! Helper to create a ShapeCastRequest with a SphereShapeConfiguration as its shape configuration. + ShapeCastRequest CreateSphereCastRequest(float radius, + const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType = SceneQuery::QueryType::StaticAndDynamic, + CollisionGroup collisionGroup = CollisionGroup::All, + SceneQuery::FilterCallback filterCallback = nullptr); + + //! Helper to create a ShapeCastRequest with a BoxShapeConfiguration as its shape configuration. + ShapeCastRequest CreateBoxCastRequest(const AZ::Vector3& boxDimensions, + const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType = SceneQuery::QueryType::StaticAndDynamic, + CollisionGroup collisionGroup = CollisionGroup::All, + SceneQuery::FilterCallback filterCallback = nullptr); + + //! Helper to create a ShapeCastRequest with a CapsuleShapeConfiguration as its shape configuration. + ShapeCastRequest CreateCapsuleCastRequest(float capsuleRadius, float capsuleHeight, + const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType = SceneQuery::QueryType::StaticAndDynamic, + CollisionGroup collisionGroup = CollisionGroup::All, + SceneQuery::FilterCallback filterCallback = nullptr); + + } // namespace ShapeCastRequestHelpers + + //! Searches a region enclosed by a specified shape for any overlapping objects in the scene. + struct OverlapRequest : + public SceneQueryRequest + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(OverlapRequest, "{3DC986C2-316B-4C54-A0A6-8ABBB8ABCC4A}", SceneQueryRequest); + static void Reflect(AZ::ReflectContext* context); + + AZ::Transform m_pose = AZ::Transform::CreateIdentity(); //!< Initial shape pose + AZStd::shared_ptr m_shapeConfiguration; //!< Shape information. + SceneQuery::OverlapFilterCallback m_filterCallback = nullptr; //!< Hit filtering function + SceneQuery::UnboundedOverlapHitCallback m_unboundedOverlapHitCallback = nullptr; //!< When not nullptr the request will perform an unbounded overlap query. + }; + + namespace OverlapRequestHelpers + { + //! Helper to create a OverlapRequest with a SphereShapeConfiguration as its shape configuration. + OverlapRequest CreateSphereOverlapRequest(float radius,const AZ::Transform& pose, + SceneQuery::OverlapFilterCallback filterCallback = nullptr); + + //! Helper to create a OverlapRequest with a BoxShapeConfiguration as its shape configuration. + OverlapRequest CreateBoxOverlapRequest(const AZ::Vector3& dimensions, const AZ::Transform& pose, + SceneQuery::OverlapFilterCallback filterCallback = nullptr); + + //! Helper to create a OverlapRequest with a CapsuleShapeConfiguration as its shape configuration. + OverlapRequest CreateCapsuleOverlapRequest(float height, float radius, const AZ::Transform& pose, + SceneQuery::OverlapFilterCallback filterCallback = nullptr); + + } // namespace OverlapRequestHelpers + + //! Structure that contains information of an individual hit related to a SceneQuery. + struct SceneQueryHit + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_TYPE_INFO(SceneQueryHit, "{7A7201B9-67B5-438B-B4EB-F3EEBB78C617}"); + static void Reflect(AZ::ReflectContext* context); + + virtual ~SceneQueryHit() = default; + + explicit operator bool() const { return IsValid(); } + bool IsValid() const { return m_resultFlags != SceneQuery::ResultFlags::Invalid; } + + //! Flags used to determine what members are valid. + //! If the flag is true, the member will have a valid value. + SceneQuery::ResultFlags m_resultFlags = SceneQuery::ResultFlags::Invalid; + + //! The distance along the cast at which the hit occurred as given by Dot(m_normal, startPoint) - Dot(m_normal, m_position). + //! Valid if SceneQuery::ResultFlags::Distance is set. + float m_distance = 0.0f; + //! Handler to the simulated body that was hit. + //! Valid if SceneQuery::ResultFlags::BodyHandle is set. + AzPhysics::SimulatedBodyHandle m_bodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + //! The Entity Id of the body that was hit. + //! Valid if SceneQuery::ResultFlags::EntityId is set. + AZ::EntityId m_entityId; + //! The shape on the body that was hit. + //! Valid if SceneQuery::ResultFlags::Shape is set. + Physics::Shape* m_shape = nullptr; + //! The material on the shape (or face) that was hit. + //! Valid if SceneQuery::ResultFlags::Material is set. + Physics::Material* m_material = nullptr; + //! The position of the hit in world space. + //! Valid if SceneQuery::ResultFlags::Position is set. + AZ::Vector3 m_position = AZ::Vector3::CreateZero(); + //! The normal of the surface hit. + //! Valid if SceneQuery::ResultFlags::Normal is set. + AZ::Vector3 m_normal = AZ::Vector3::CreateZero(); + }; + + //! Structure that contains all hits related to a SceneQuery. + struct SceneQueryHits + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_TYPE_INFO(SceneQueryHits, "{BAFCC4E7-A06B-4909-B2AE-C89D9E84FE4E}"); + static void Reflect(AZ::ReflectContext* context); + + explicit operator bool() const { return !m_hits.empty(); } + + AZStd::vector m_hits; + }; +} + +namespace AZ +{ + AZ_TYPE_INFO_SPECIALIZE(AzPhysics::SceneQuery::QueryType, "{0E0E56A8-73A8-40B4-B438-B19FC852E3C0}"); + AZ_TYPE_INFO_SPECIALIZE(AzPhysics::SceneQuery::ResultFlags, "{E081DB48-CFC8-4480-BB69-AA5BFC8C5FEE}"); +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.cpp new file mode 100644 index 0000000000..c833bdf280 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.cpp @@ -0,0 +1,207 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +#include +#include +#include +#include + +namespace AzPhysics +{ + AZ_CLASS_ALLOCATOR_IMPL(SimulatedBody, AZ::SystemAllocator, 0); + + namespace Internal + { + template + Event* GetEvent(AZ::EntityId entityid, Function getEventFunc) + { + auto* physicsSystem = AZ::Interface::Get(); + auto* sceneInterface = AZ::Interface::Get(); + if (physicsSystem != nullptr && sceneInterface != nullptr) + { + auto [sceneHandle, bodyHandle] = physicsSystem->FindAttachedBodyHandleFromEntityId(entityid); + if (SimulatedBody* body = sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)) + { + auto func = AZStd::bind(getEventFunc, body); + return func(); + } + } + return nullptr; + } + } + + /*static*/ void SimulatedBody::Reflect(AZ::ReflectContext* context) + { + Automation::SimulatedBodyCollisionAutomationHandler::Reflect(context); + Automation::SimulatedBodyTriggerAutomationHandler::Reflect(context); + + if (auto* serializeContext = azdynamic_cast(context)) + { + serializeContext->Class() + ->Version(1) + ->Field("SceneOwner", &SimulatedBody::m_sceneOwner) + ->Field("BodyHandle", &SimulatedBody::m_bodyHandle) + ; + } + + // reflect the collision and trigger AZ::Events + if (auto* behaviorContext = azdynamic_cast(context)) + { + const AZStd::vector collisionEventParams = { + "Simulated Body Handle", + "Collision Event" + }; + + const AZ::BehaviorAzEventDescription onCollisionBeginEventDescription = + { + "On Collision Begin event", + collisionEventParams // Parameters + }; + const AZ::BehaviorAzEventDescription onCollisionPersistDescription = + { + "On Collision Persist event", + collisionEventParams // Parameters + }; + const AZ::BehaviorAzEventDescription onCollisionEndEventDescription = + { + "On Collision End event", + collisionEventParams // Parameters + }; + + const AZStd::vector triggerEventParams = { + "Simulated Body Handle", + "Trigger Event" + }; + const AZ::BehaviorAzEventDescription onTriggerEnterDescription = + { + "On Trigger Enter event", + triggerEventParams // Parameters + }; + const AZ::BehaviorAzEventDescription onTriggerExitDescription = + { + "On Trigger Exit event", + triggerEventParams // Parameters + }; + + const auto getOnCollisionBegin = [](AZ::EntityId id) -> SimulatedBodyEvents::OnCollisionBegin* + { + return Internal::GetEvent(id, &SimulatedBody::GetOnCollisionBeginEvent); + }; + const auto getOnCollisionPersist = [](AZ::EntityId id) -> SimulatedBodyEvents::OnCollisionPersist* + { + return Internal::GetEvent(id, &SimulatedBody::GetOnCollisionPersistEvent); + }; + const auto getOnCollisionEnd = [](AZ::EntityId id) -> SimulatedBodyEvents::OnCollisionEnd* + { + return Internal::GetEvent(id, &SimulatedBody::GetOnCollisionEndEvent); + }; + const auto getOnTriggerEnter = [](AZ::EntityId id) -> SimulatedBodyEvents::OnTriggerEnter* + { + return Internal::GetEvent(id, &SimulatedBody::GetOnTriggerEnterEvent); + }; + const auto getOnTriggerExit = [](AZ::EntityId id) -> SimulatedBodyEvents::OnTriggerExit* + { + return Internal::GetEvent(id, &SimulatedBody::GetOnTriggerExitEvent); + }; + + behaviorContext->Class("SimulatedBody") + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "Physics") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Method("GetOnCollisionBeginEvent", getOnCollisionBegin) + ->Attribute(AZ::Script::Attributes::AzEventDescription, AZStd::move(onCollisionBeginEventDescription)) + ->Method("GetOnCollisionPersistEvent", getOnCollisionPersist) + ->Attribute(AZ::Script::Attributes::AzEventDescription, AZStd::move(onCollisionPersistDescription)) + ->Method("GetOnCollisionEndEvent", getOnCollisionEnd) + ->Attribute(AZ::Script::Attributes::AzEventDescription, AZStd::move(onCollisionEndEventDescription)) + ->Method("GetOnTriggerEnterEvent", getOnTriggerEnter) + ->Attribute(AZ::Script::Attributes::AzEventDescription, AZStd::move(onTriggerEnterDescription)) + ->Method("GetOnTriggerExitEvent", getOnTriggerExit) + ->Attribute(AZ::Script::Attributes::AzEventDescription, AZStd::move(onTriggerExitDescription)) + ; + } + } + + void SimulatedBody::ProcessCollisionEvent(const CollisionEvent& collision) const + { + switch (collision.m_type) + { + case CollisionEvent::Type::Begin: + m_collisionBeginEvent.Signal(m_bodyHandle, collision); + break; + case CollisionEvent::Type::Persist: + m_collisionPersistEvent.Signal(m_bodyHandle, collision); + break; + case CollisionEvent::Type::End: + m_collisionEndEvent.Signal(m_bodyHandle, collision); + break; + default: + AZ_Warning("Physics", false, "[SimulatedBody::ProcessCollisionEvent] Unexpected collison type."); + break; + } + } + + void SimulatedBody::ProcessTriggerEvent(const TriggerEvent& trigger) const + { + switch (trigger.m_type) + { + case AzPhysics::TriggerEvent::Type::Enter: + m_triggerEnterEvent.Signal(m_bodyHandle, trigger); + break; + case AzPhysics::TriggerEvent::Type::Exit: + m_triggerExitEvent.Signal(m_bodyHandle, trigger); + break; + default: + AZ_Warning("Physics", false, "[SimulatedBody::ProcessTriggerEvent] Unexpected trigger type."); + break; + } + } + + Scene* SimulatedBody::GetScene() + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + return physicsSystem->GetScene(m_sceneOwner); + } + return nullptr; + } + + SimulatedBodyEvents::OnCollisionBegin* SimulatedBody::GetOnCollisionBeginEvent() + { + return &m_collisionBeginEvent; + } + + SimulatedBodyEvents::OnCollisionPersist* SimulatedBody::GetOnCollisionPersistEvent() + { + return &m_collisionPersistEvent; + } + + SimulatedBodyEvents::OnCollisionEnd* SimulatedBody::GetOnCollisionEndEvent() + { + return &m_collisionEndEvent; + } + + SimulatedBodyEvents::OnTriggerEnter* SimulatedBody::GetOnTriggerEnterEvent() + { + return &m_triggerEnterEvent; + } + + SimulatedBodyEvents::OnTriggerExit* SimulatedBody::GetOnTriggerExitEvent() + { + return &m_triggerExitEvent; + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h new file mode 100644 index 0000000000..d892e433bc --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h @@ -0,0 +1,170 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + class ReflectContext; +} + +namespace AzPhysics +{ + namespace Automation + { + class SimulatedBodyCollisionAutomationHandler; + class SimulatedBodyTriggerAutomationHandler; + } + class Scene; + struct CollisionEvent; + struct TriggerEvent; + + //! Base class for all Simulated bodies in Physics. + struct SimulatedBody + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(AzPhysics::SimulatedBody, "{BCC37A4F-1C05-4660-9E41-0CCF2D5E7175}"); + static void Reflect(AZ::ReflectContext* context); + + virtual ~SimulatedBody() = default; + + //! The current Scene the simulated body is contained. + SceneHandle m_sceneOwner = AzPhysics::InvalidSceneHandle; + + //! The handle to this simulated body + SimulatedBodyHandle m_bodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + + //! Flag to determine if the body is part of the simulation. + //! When true the body will be affected by any forces, collisions, and found with scene queries. + bool m_simulating = true; + + //! Helper functions for setting user data. + //! @param userData Can be a pointer to any type as internally will be cast to a void*. Object lifetime not managed by the SimulatedBody. + template + void SetUserData(T* userData); + //! Helper functions for getting the set user data. + //! @return Will return a void* to the user data set. + void* GetUserData() + { + return m_customUserData; + } + + //! Perform a ray cast on this Simulated Body. + //! @param request The request to make. + //! @return Returns the closest hit, if any, against this simulated body. + virtual AzPhysics::SceneQueryHit RayCast(const RayCastRequest& request) = 0; + + //! Helper to direct the CollisionEvent to the correct handler. + //! Will invoke the OnCollisionBegin or OnCollisionPersist or OnCollisionEnd event. + //! @param collision The collision data to be routed. + void ProcessCollisionEvent(const CollisionEvent& collision) const; + + //! Helper to direct the TriggerEvent to the correct handler. + //! Will invoke the OnTriggerEnter or OnTriggerExitevent event. + //! @param trigger The trigger data to be routed. + void ProcessTriggerEvent(const TriggerEvent& trigger) const; + + //! Helpers to register a handler for Collision events on this Simulated body. + //! OnCollisionBegin is when two bodies start to collide. + //! OnCollisionPersist is when two bodies continue to collide. + //! OnCollisionEnd is when two bodies stop colliding. + void RegisterOnCollisionBeginHandler(SimulatedBodyEvents::OnCollisionBegin::Handler& handler); + //! see RegisterOnCollisionBeginHandler + void RegisterOnCollisionPersistHandler(SimulatedBodyEvents::OnCollisionPersist::Handler& handler); + //! see RegisterOnCollisionBeginHandler + void RegisterOnCollisionEndHandler(SimulatedBodyEvents::OnCollisionEnd::Handler& handler); + + //! Helpers to register a handler for Trigger Events on this Simulated body. + //! OnTriggerEnter is when a body enters a trigger. + //! OnTriggerExit is when a body leaves a trigger. + void RegisterOnTriggerEnterHandler(SimulatedBodyEvents::OnTriggerEnter::Handler& handler); + //! see RegisterOnTriggerEnterHandler + void RegisterOnTriggerExitHandler(SimulatedBodyEvents::OnTriggerExit::Handler& handler); + + virtual AZ::Crc32 GetNativeType() const = 0; + virtual void* GetNativePointer() const = 0; + + //! Helper to get the scene this body is attached too. + //! @return Returns a pointer to the scene. + virtual Scene* GetScene(); + + // Temporary until LYN-438 work is complete - from old WorldBody Class + virtual AZ::EntityId GetEntityId() const = 0; + virtual AZ::Transform GetTransform() const = 0; + virtual void SetTransform(const AZ::Transform& transform) = 0; + virtual AZ::Vector3 GetPosition() const = 0; + virtual AZ::Quaternion GetOrientation() const = 0; + virtual AZ::Aabb GetAabb() const = 0; + + private: + friend class Automation::SimulatedBodyCollisionAutomationHandler; + friend class Automation::SimulatedBodyTriggerAutomationHandler; + + SimulatedBodyEvents::OnCollisionBegin m_collisionBeginEvent; + SimulatedBodyEvents::OnCollisionPersist m_collisionPersistEvent; + SimulatedBodyEvents::OnCollisionEnd m_collisionEndEvent; + SimulatedBodyEvents::OnTriggerEnter m_triggerEnterEvent; + SimulatedBodyEvents::OnTriggerExit m_triggerExitEvent; + + void* m_customUserData = nullptr; + + // helpers for reflecting to behavior context + SimulatedBodyEvents::OnCollisionBegin* GetOnCollisionBeginEvent(); + SimulatedBodyEvents::OnCollisionPersist* GetOnCollisionPersistEvent(); + SimulatedBodyEvents::OnCollisionEnd* GetOnCollisionEndEvent(); + SimulatedBodyEvents::OnTriggerEnter* GetOnTriggerEnterEvent(); + SimulatedBodyEvents::OnTriggerExit* GetOnTriggerExitEvent(); + }; + //! Alias for a list of non owning weak pointers to SimulatedBody objects. + using SimulatedBodyList = AZStd::vector; + + template + void SimulatedBody::SetUserData(T* userData) + { + m_customUserData = static_cast(userData); + } + + inline void SimulatedBody::RegisterOnCollisionBeginHandler(SimulatedBodyEvents::OnCollisionBegin::Handler& handler) + { + handler.Connect(m_collisionBeginEvent); + } + + inline void SimulatedBody::RegisterOnCollisionPersistHandler(SimulatedBodyEvents::OnCollisionPersist::Handler& handler) + { + handler.Connect(m_collisionPersistEvent); + } + + inline void SimulatedBody::RegisterOnCollisionEndHandler(SimulatedBodyEvents::OnCollisionEnd::Handler& handler) + { + handler.Connect(m_collisionEndEvent); + } + + inline void SimulatedBody::RegisterOnTriggerEnterHandler(SimulatedBodyEvents::OnTriggerEnter::Handler& handler) + { + handler.Connect(m_triggerEnterEvent); + } + + inline void SimulatedBody::RegisterOnTriggerExitHandler(SimulatedBodyEvents::OnTriggerExit::Handler& handler) + { + handler.Connect(m_triggerExitEvent); + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyAutomation.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyAutomation.cpp new file mode 100644 index 0000000000..e52291ad17 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyAutomation.cpp @@ -0,0 +1,260 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +#include +#include +#include + +namespace AzPhysics::Automation +{ + AZ_CLASS_ALLOCATOR_IMPL(SimulatedBodyCollisionAutomationHandler, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR_IMPL(SimulatedBodyTriggerAutomationHandler, AZ::SystemAllocator, 0); + + /*static*/ void SimulatedBodyCollisionAutomationHandler::Reflect(AZ::ReflectContext* context) + { + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->EBus("CollisionNotificationBus") + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "Physics") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation) + ->Handler() + ; + } + } + + SimulatedBodyCollisionAutomationHandler::SimulatedBodyCollisionAutomationHandler() + { + m_collisionBeginHandler = SimulatedBodyEvents::OnCollisionBegin::Handler( + [this]([[maybe_unused]] SimulatedBodyHandle bodyHandle, + const CollisionEvent& event) + { + OnCollisionBeginEvent(event); + }); + m_collisionPersistHandler = SimulatedBodyEvents::OnCollisionPersist::Handler( + [this]([[maybe_unused]] SimulatedBodyHandle bodyHandle, + const CollisionEvent& event) + { + OnCollisionPersistEvent(event); + }); + m_collisionEndHandler = SimulatedBodyEvents::OnCollisionEnd::Handler( + [this]([[maybe_unused]] SimulatedBodyHandle bodyHandle, + const CollisionEvent& event) + { + OnCollisionEndEvent(event); + }); + + SetEvent(&SimulatedBodyCollisionAutomationHandler::OnCollisionBegin, "OnCollisionBegin"); + SetEvent(&SimulatedBodyCollisionAutomationHandler::OnCollisionPersist, "OnCollisionPersist"); + SetEvent(&SimulatedBodyCollisionAutomationHandler::OnCollisionEnd, "OnCollisionEnd"); + } + + void SimulatedBodyCollisionAutomationHandler::Disconnect() + { + m_collisionBeginHandler.Disconnect(); + m_collisionPersistHandler.Disconnect(); + m_collisionEndHandler.Disconnect(); + } + + bool SimulatedBodyCollisionAutomationHandler::Connect(AZ::BehaviorValueParameter* id /*= nullptr*/) + { + if (id && id->ConvertTo()) + { + m_connectedEntityId = *id->GetAsUnsafe(); + auto* physicsSystem = AZ::Interface::Get(); + auto* sceneInterface = AZ::Interface::Get(); + if (physicsSystem != nullptr && sceneInterface != nullptr) + { + auto [sceneHandle, bodyHandle] = physicsSystem->FindAttachedBodyHandleFromEntityId(m_connectedEntityId); + if (SimulatedBody* body = sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)) + { + bool connected = false; + if (auto* collisionBeginEvent = body->GetOnCollisionBeginEvent()) + { + m_collisionBeginHandler.Connect(*collisionBeginEvent); + connected = true; + } + if (auto* collisionPersistEvent = body->GetOnCollisionPersistEvent()) + { + m_collisionPersistHandler.Connect(*collisionPersistEvent); + connected = true; + } + if (auto* collisionEndEvent = body->GetOnCollisionEndEvent()) + { + m_collisionEndHandler.Connect(*collisionEndEvent); + connected = true; + } + return connected; + } + } + } + + return false; + } + + bool SimulatedBodyCollisionAutomationHandler::IsConnected() + { + return m_collisionBeginHandler.IsConnected() || m_collisionPersistHandler.IsConnected() || m_collisionEndHandler.IsConnected(); + } + + bool SimulatedBodyCollisionAutomationHandler::IsConnectedId(AZ::BehaviorValueParameter* id) + { + if (id && id->ConvertTo()) + { + return m_connectedEntityId == *id->GetAsUnsafe() && IsConnected(); + } + return false; + } + + int SimulatedBodyCollisionAutomationHandler::GetFunctionIndex(const char* functionName) const + { + if (azstricmp(functionName, "OnCollisionBegin") == 0) + { + return FN_OnCollisionBegin; + } + if (azstricmp(functionName, "OnCollisionPersist") == 0) + { + return FN_OnCollisionPersist; + } + if (azstricmp(functionName, "OnCollisionEnd") == 0) + { + return FN_OnCollisionEnd; + } + return -1; + } + + void SimulatedBodyCollisionAutomationHandler::OnCollisionBeginEvent(const CollisionEvent& event) + { + Call(FN_OnCollisionBegin, event.m_body2->GetEntityId(), event.m_contacts); //send m_body2 entity id as that is the other body involved in the collision. + } + + void SimulatedBodyCollisionAutomationHandler::OnCollisionPersistEvent(const CollisionEvent& event) + { + Call(FN_OnCollisionPersist, event.m_body2->GetEntityId(), event.m_contacts); //send m_body2 entity id as that is the other body involved in the collision. + } + + void SimulatedBodyCollisionAutomationHandler::OnCollisionEndEvent(const CollisionEvent& event) + { + Call(FN_OnCollisionEnd, event.m_body2->GetEntityId()); //send m_body2 entity id as that is the other body involved in the collision. + } + + /*static*/ void SimulatedBodyTriggerAutomationHandler::Reflect(AZ::ReflectContext* context) + { + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->EBus("TriggerNotificationBus") + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "Physics") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation) + ->Handler() + ; + } + } + + SimulatedBodyTriggerAutomationHandler::SimulatedBodyTriggerAutomationHandler() + { + m_triggerEnterHandler = SimulatedBodyEvents::OnTriggerEnter::Handler( + [this]([[maybe_unused]] SimulatedBodyHandle bodyHandle, + const TriggerEvent& event) + { + OnTriggerEnterEvent(event); + }); + m_triggerExitHandler = SimulatedBodyEvents::OnTriggerExit::Handler( + [this]([[maybe_unused]] SimulatedBodyHandle bodyHandle, + const TriggerEvent& event) + { + OnTriggerExitEvent(event); + }); + + SetEvent(&SimulatedBodyTriggerAutomationHandler::OnTriggerEnter, "OnTriggerEnter"); + SetEvent(&SimulatedBodyTriggerAutomationHandler::OnTriggerExit, "OnTriggerExit"); + } + + void SimulatedBodyTriggerAutomationHandler::Disconnect() + { + m_triggerEnterHandler.Disconnect(); + m_triggerExitHandler.Disconnect(); + } + + bool SimulatedBodyTriggerAutomationHandler::Connect(AZ::BehaviorValueParameter* id /*= nullptr*/) + { + if (id && id->ConvertTo()) + { + m_connectedEntityId = *id->GetAsUnsafe(); + auto* physicsSystem = AZ::Interface::Get(); + auto* sceneInterface = AZ::Interface::Get(); + if (physicsSystem != nullptr && sceneInterface != nullptr) + { + auto [sceneHandle, bodyHandle] = physicsSystem->FindAttachedBodyHandleFromEntityId(m_connectedEntityId); + if (SimulatedBody* body = sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)) + { + bool connected = false; + if (auto* triggerEnterEvent = body->GetOnTriggerEnterEvent()) + { + m_triggerEnterHandler.Connect(*triggerEnterEvent); + connected = true; + } + if (auto* triggerExitEvent = body->GetOnTriggerExitEvent()) + { + m_triggerExitHandler.Connect(*triggerExitEvent); + connected = true; + } + return connected; + } + } + } + + return false; + } + + bool SimulatedBodyTriggerAutomationHandler::IsConnected() + { + return m_triggerEnterHandler.IsConnected() || m_triggerExitHandler.IsConnected(); + } + + bool SimulatedBodyTriggerAutomationHandler::IsConnectedId(AZ::BehaviorValueParameter* id) + { + if (id && id->ConvertTo()) + { + return m_connectedEntityId == *id->GetAsUnsafe() && IsConnected(); + } + return false; + } + + int SimulatedBodyTriggerAutomationHandler::GetFunctionIndex(const char* functionName) const + { + if (azstricmp(functionName, "OnTriggerEnter") == 0) + { + return FN_OnTriggerEnter; + } + if (azstricmp(functionName, "OnTriggerExit") == 0) + { + return FN_OnTriggerExit; + } + return -1; + } + + void SimulatedBodyTriggerAutomationHandler::OnTriggerEnterEvent(const TriggerEvent& event) + { + Call(FN_OnTriggerEnter, event.m_otherBody->GetEntityId()); + } + + void SimulatedBodyTriggerAutomationHandler::OnTriggerExitEvent(const TriggerEvent& event) + { + Call(FN_OnTriggerExit, event.m_otherBody->GetEntityId()); + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyAutomation.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyAutomation.h new file mode 100644 index 0000000000..00ec0e4478 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyAutomation.h @@ -0,0 +1,147 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + class ReflectContext; + struct BehaviorValueParameter; +} + +namespace AzPhysics::Automation +{ + //! Buses to expose Collision and Trigger event to Automation + //! @{ + class AutomationCollisionNotifications + : public AZ::ComponentBus + { + public: + virtual ~AutomationCollisionNotifications() = default; + virtual void OnCollisionBegin(AZ::EntityId entityId, const AZStd::vector& contacts) = 0; + virtual void OnCollisionPersist(AZ::EntityId entityId, const AZStd::vector& contacts) = 0; + virtual void OnCollisionEnd(AZ::EntityId entityId) = 0; + }; + using AutomationCollisionNotificationsBus = AZ::EBus; + + class AutomationTriggerNotifications + : public AZ::ComponentBus + { + public: + virtual ~AutomationTriggerNotifications() = default; + virtual void OnTriggerEnter(AZ::EntityId entityId) = 0; + virtual void OnTriggerExit(AZ::EntityId entityId) = 0; + }; + using AutomationTriggerNotificationsBus = AZ::EBus; + //! @} + + //! Collision Event Handler for Automation + //! @note this class is not using the usual AZ_EBUS_BEHAVIOR_BINDER macro as the signature + //! needs to be changed for script canvas. + class SimulatedBodyCollisionAutomationHandler + : public AutomationCollisionNotificationsBus::Handler + , public AZ::BehaviorEBusHandler + { + public: + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(AzPhysics::Automation::SimulatedBodyCollisionAutomationHandler, "{B0493CB7-9D20-44E1-B744-1419E54CAF67}", AZ::BehaviorEBusHandler); + static void Reflect(AZ::ReflectContext* context); + + SimulatedBodyCollisionAutomationHandler(); + + using EventFunctionsParameterPack = AZStd::Internal::pack_traits_arg_sequence< + decltype(&SimulatedBodyCollisionAutomationHandler::OnCollisionBegin), + decltype(&SimulatedBodyCollisionAutomationHandler::OnCollisionPersist), + decltype(&SimulatedBodyCollisionAutomationHandler::OnCollisionEnd) + >; + private: + // AutomationCollisionNotificationsBus::Handler Interface + void OnCollisionBegin([[maybe_unused]] AZ::EntityId entityId, [[maybe_unused]] const AZStd::vector& contacts) override {} + void OnCollisionPersist([[maybe_unused]] AZ::EntityId entityId, [[maybe_unused]] const AZStd::vector& contacts) override {} + void OnCollisionEnd([[maybe_unused]] AZ::EntityId entityId) override {} + + enum + { + FN_OnCollisionBegin, + FN_OnCollisionPersist, + FN_OnCollisionEnd, + FN_MAX + }; + + // AZ::BehaviorEBusHandler interface + void Disconnect() override; + bool Connect(AZ::BehaviorValueParameter* id = nullptr) override; + bool IsConnected() override; + bool IsConnectedId(AZ::BehaviorValueParameter* id) override; + int GetFunctionIndex(const char* functionName) const override; + + void OnCollisionBeginEvent(const CollisionEvent& event); + void OnCollisionPersistEvent(const CollisionEvent& event); + void OnCollisionEndEvent(const CollisionEvent& event); + + AZ::EntityId m_connectedEntityId; + SimulatedBodyEvents::OnCollisionBegin::Handler m_collisionBeginHandler; + SimulatedBodyEvents::OnCollisionPersist::Handler m_collisionPersistHandler; + SimulatedBodyEvents::OnCollisionEnd::Handler m_collisionEndHandler; + }; + + //! Trigger Event Handler for Automation + //! @note this class is not using the usual AZ_EBUS_BEHAVIOR_BINDER macro as the signature + //! needs to be changed for script canvas. + class SimulatedBodyTriggerAutomationHandler + : public AutomationTriggerNotificationsBus::Handler + , public AZ::BehaviorEBusHandler + { + public: + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(AzPhysics::Automation::SimulatedBodyTriggerAutomationHandler, "{0BFA757E-F270-40D7-8543-B21260A987D0}", AZ::BehaviorEBusHandler); + static void Reflect(AZ::ReflectContext* context); + + SimulatedBodyTriggerAutomationHandler(); + + using EventFunctionsParameterPack = AZStd::Internal::pack_traits_arg_sequence< + decltype(&SimulatedBodyTriggerAutomationHandler::OnTriggerEnter), + decltype(&SimulatedBodyTriggerAutomationHandler::OnTriggerExit) + >; + private: + // AutomationTriggerNotificationsBus::Handler Interface + void OnTriggerEnter([[maybe_unused]] AZ::EntityId entityId) override {} + void OnTriggerExit([[maybe_unused]] AZ::EntityId entityId) override {} + + enum + { + FN_OnTriggerEnter, + FN_OnTriggerExit, + FN_MAX + }; + + // AZ::BehaviorEBusHandler interface + void Disconnect() override; + bool Connect(AZ::BehaviorValueParameter* id = nullptr) override; + bool IsConnected() override; + bool IsConnectedId(AZ::BehaviorValueParameter* id) override; + int GetFunctionIndex(const char* functionName) const override; + + void OnTriggerEnterEvent(const TriggerEvent& event); + void OnTriggerExitEvent(const TriggerEvent& event); + + AZ::EntityId m_connectedEntityId; + SimulatedBodyEvents::OnTriggerEnter::Handler m_triggerEnterHandler; + SimulatedBodyEvents::OnTriggerExit::Handler m_triggerExitHandler; + }; +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyEvents.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyEvents.cpp new file mode 100644 index 0000000000..d00a381293 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyEvents.cpp @@ -0,0 +1,72 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include + +namespace AzPhysics +{ + namespace SimulatedBodyEvents + { + namespace Internal + { + //helper to register a handler + template + void RegisterHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + Handler& handler, Function registerFunc) + { + if (auto* sceneInterface = AZ::Interface::Get()) + { + if (AzPhysics::SimulatedBody* body = sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)) + { + auto func = AZStd::bind(registerFunc, body, AZStd::placeholders::_1); + func(handler); + } + } + } + } + + void RegisterOnCollisionBeginHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnCollisionBegin::Handler& handler) + { + Internal::RegisterHandler(sceneHandle, bodyHandle, handler, &SimulatedBody::RegisterOnCollisionBeginHandler); + } + + void RegisterOnCollisionPersistHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnCollisionPersist::Handler& handler) + { + Internal::RegisterHandler(sceneHandle, bodyHandle, handler, &SimulatedBody::RegisterOnCollisionPersistHandler); + } + + void RegisterOnCollisionEndHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnCollisionEnd::Handler& handler) + { + Internal::RegisterHandler(sceneHandle, bodyHandle, handler, &SimulatedBody::RegisterOnCollisionEndHandler); + } + + void RegisterOnTriggerEnterHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnTriggerEnter::Handler& handler) + { + Internal::RegisterHandler(sceneHandle, bodyHandle, handler, &SimulatedBody::RegisterOnTriggerEnterHandler); + } + + void RegisterOnTriggerExitHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnTriggerExit::Handler& handler) + { + Internal::RegisterHandler(sceneHandle, bodyHandle, handler, &SimulatedBody::RegisterOnTriggerExitHandler); + } + } // namespace SimulatedBodyEvents +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyEvents.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyEvents.h new file mode 100644 index 0000000000..5bf8847688 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBodyEvents.h @@ -0,0 +1,77 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AzPhysics +{ + struct CollisionEvent; + struct TriggerEvent; + + namespace SimulatedBodyEvents + { + //! Collision Events for Simulated bodies. + //! OnCollisionBegin is when two bodies start to collide. Will always be triggered before OnCollisionPersist and OnCollisionEnd. + //! OnCollisionPersist is when two bodies continue to collide. Can only be triggered after OnCollisionBegin and before OnCollisionEnd. + //! OnCollisionEnd is when two bodies stop colliding. Will always be triggered after OnCollisionBegin and OnCollisionPersist. + //! The SimulatedBodyHandle passed in the event will match CollisionEvent::m_bodyHandle1, CollisionEvent::m_bodyHandle2 will be the other body involved. + //! @note The CollisionEvent is only valid for the duration of the callback. + //! This may fire multiple times per frame. + using OnCollisionBegin = AZ::Event; + + //! see OnCollisionBegin + using OnCollisionPersist = AZ::Event; + + //! see OnCollisionBegin + using OnCollisionEnd = AZ::Event; + + //! Trigger Events for Simulated bodies. + //! OnTriggerEnter is when a body enters a trigger. + //! OnTriggerExit is when a body leaves a trigger. Will only be triggered after OnTriggerEnter. + //! These events will be triggered on both the trigger body and the body that entered/exited the trigger. + //! The SimulatedBodyHandle passed will be the body that the handler is registered to, which can be the Trigger or Other body. + //! @note The TriggerEvent is only valid for the duration of the callback. + //! This may fire multiple times per frame. + using OnTriggerEnter = AZ::Event; + + //! see OnTriggerEnter + using OnTriggerExit = AZ::Event; + + //! Helper to register a Collision Event handler. + //! @param sceneHandle A handle to the scene that owns the simulated body. + //! @param bodyHandle A handle to the simulated body. + //! @param handler The handle to register. + void RegisterOnCollisionBeginHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnCollisionBegin::Handler& handler); + + //! see RegisterOnCollisionBeginHandler + void RegisterOnCollisionPersistHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnCollisionPersist::Handler& handler); + + //! see RegisterOnCollisionBeginHandler + void RegisterOnCollisionEndHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnCollisionEnd::Handler& handler); + + //! Helper to register a Trigger Event handler. + //! @param sceneHandle A handle to the scene that owns the simulated body. + //! @param bodyHandle A handle to the simulated body. + //! @param handler The handle to register. + void RegisterOnTriggerEnterHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnTriggerEnter::Handler& handler); + + //! see RegisterOnTriggerEnterHandler + void RegisterOnTriggerExitHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle, + OnTriggerExit::Handler& handler); + } // namespace SimulatedBodyEvents +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h index b1afe2147a..5158da275e 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h @@ -11,33 +11,121 @@ */ #pragma once +#include +#include #include +#include +#include #include +namespace Physics +{ + class ColliderConfiguration; + class Shape; + class ShapeConfiguration; +} + namespace AzPhysics { - using SceneIndex = AZ::s8; + //! Default Scene Names and Crc32 + static constexpr const char* DefaultPhysicsSceneName = "DefaultScene"; + static constexpr const AZ::Crc32 DefaultPhysicsSceneId = AZ_CRC_CE(DefaultPhysicsSceneName); + static constexpr const char* EditorPhysicsSceneName = "EditorScene"; + static constexpr const AZ::Crc32 EditorPhysicsSceneId = AZ_CRC_CE(EditorPhysicsSceneName); - //! A handle to a Scene within the physics simulation. - //! A SceneHandle is a tuple of a Crc of the scenes name and the index in the Scene list. - using SceneHandle = AZStd::tuple; - + //! Default gravity. + static const AZ::Vector3 DefaultGravity = AZ::Vector3(0.0f, 0.0f, -9.81f); //! Helper for retrieving the values from the SceneHandle tuple. //! Example usage //! @code{ .cpp } //! SceneHandle someHandle; - //! AZ::Crc32 handleCrc = AZStd::get(someHandle); - //! SceneIndex index = AZStd::get(someHandle); + //! const AZ::Crc32 handleCrc = AZStd::get(someHandle); + //! const SceneIndex index = AZStd::get(someHandle); //! @endcode - enum SceneHandleValues + enum HandleTypeIndex { Crc = 0, Index }; + using SceneIndex = AZ::s8; + using SimulatedBodyIndex = AZ::s32; + static_assert(std::is_signed::value + && std::is_signed::value, "SceneIndex and SimulatedBodyIndex must be signed integers."); + + + //! A handle to a Scene within the physics simulation. + //! A SceneHandle is a tuple of a Crc of the scenes name and the index in the Scene list. + using SceneHandle = AZStd::tuple; static constexpr SceneHandle InvalidSceneHandle = { AZ::Crc32(), -1 }; //! Ease of use type for referencing a List of SceneHandle objects. using SceneHandleList = AZStd::vector; + + //! A handle to a Simulated body within a physics scene. + //! A SimulatedBodyHandle is a tuple of a Crc of the scene's name and the index in the SimulatedBody list. + using SimulatedBodyHandle = AZStd::tuple; + static constexpr SimulatedBodyHandle InvalidSimulatedBodyHandle = { AZ::Crc32(), -1 }; + using SimulatedBodyHandleList = AZStd::vector; + + //! Helper used for pairing the ShapeConfiguration and ColliderConfiguration together which is used when creating a Simulated Body. + using ShapeColliderPair = AZStd::pair; + + //! Flags used to specifying which properties of a body to compute. + enum class MassComputeFlags : AZ::u8 + { + NONE = 0, + + //! Flags indicating whether a certain mass property should be auto-computed or not. + COMPUTE_MASS = 1, + COMPUTE_INERTIA = 1 << 1, + COMPUTE_COM = 1 << 2, + + //! If set, non-simulated shapes will also be included in the mass properties calculation. + INCLUDE_ALL_SHAPES = 1 << 3, + + DEFAULT = COMPUTE_COM | COMPUTE_INERTIA | COMPUTE_MASS + }; + //! Bitwise operators for MassComputeFlags + inline MassComputeFlags operator|(MassComputeFlags lhs, MassComputeFlags rhs) + { + return aznumeric_cast(aznumeric_cast(lhs) | aznumeric_cast(rhs)); + } + + inline MassComputeFlags operator&(MassComputeFlags lhs, MassComputeFlags rhs) + { + return aznumeric_cast(aznumeric_cast(lhs) & aznumeric_cast(rhs)); + } + + //! Variant to allow support for the system to either create the Shape(s) or use the provide Shape(s) that have been created externally. + //! Can be one of the following. + //! @code{ .cpp } + //! // A ShapeColliderPair, which contains a ColliderConfiguration and ShapeConfiguration. + //! AzPhysics::StaticRigidBodyConfiguration staticRigidBodyConfig; + //! staticRigidBodyConfig.m_colliderAndShapeData = AzPhysics::ShapeColliderPair(&colliderConfig, &shapeConfig); + //! + //! // A pointer to a Physics::Shape. The Simulated Body will take ownership of the pointer. + //! AZStd::shared_ptr shapePtr /*Created through other means*/; + //! AzPhysics::StaticRigidBodyConfiguration staticRigidBodyConfig; + //! staticRigidBodyConfig.m_colliderAndShapeData = shapePtr; + //! + //! // A list of ShapeColliderPairs. + //! AZStd::vector shapeColliderPairList; + //! shapeColliderPairList.emplace_back(&colliderConfig, &shapeConfig); //add as many configs as required. + //! AzPhysics::StaticRigidBodyConfiguration staticRigidBodyConfig; + //! staticRigidBodyConfig.m_colliderAndShapeData = shapeColliderPairList; + //! + //! // A list of Physics::Shape pointers. The Simulated Body will take ownership of these pointers. + //! AZStd::vector> shapePtrList; + //! shapePtrList.emplace_back(/*Shape created through other means*/); + //! AzPhysics::StaticRigidBodyConfiguration staticRigidBodyConfig; + //! staticRigidBodyConfig.m_colliderAndShapeData = shapePtrList; + //! @endcode + using ShapeVariantData = AZStd::variant< + AZStd::monostate, + ShapeColliderPair, + AZStd::shared_ptr, + AZStd::vector, + AZStd::vector>>; } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/RigidBodyConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/RigidBodyConfiguration.cpp new file mode 100644 index 0000000000..80434e5dee --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/RigidBodyConfiguration.cpp @@ -0,0 +1,242 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include + +namespace AzPhysics +{ + namespace Internal + { + // Visibility functions. + AZ::Crc32 GetPropertyVisibility(AZ::u16 flags, RigidBodyConfiguration::PropertyVisibility property) + { + return (flags & property) != 0 ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; + } + + void SetPropertyVisibility(AZ::u16 flags, RigidBodyConfiguration::PropertyVisibility property, bool isVisible) + { + if (isVisible) + { + flags |= property; + } + else + { + flags &= ~property; + } + } + + bool RigidBodyVersionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) + { + if (classElement.GetVersion() <= 1) + { + const int elementIndex = classElement.FindElement(AZ_CRC("Centre of mass offset", 0x1e569a45)); + + if (elementIndex >= 0) + { + AZ::Vector3 existingCenterOfMassOffset; + AZ::SerializeContext::DataElementNode& centerOfMassElement = classElement.GetSubElement(elementIndex); + const bool found = centerOfMassElement.GetData(existingCenterOfMassOffset); + + if (found && !existingCenterOfMassOffset.IsZero()) + { + // An existing center of mass (COM) offset value was specified for this rigid body. + // Version 2 includes a new m_computeCenterOfMass boolean flag to specify the automatic calculation of COM. + // In this case set m_computeCenterOfMass to false so that the existing center of mass offset value is utilized correctly. + const int idx = classElement.AddElement(context, "Compute COM"); + if (idx != -1) + { + if (!classElement.GetSubElement(idx).SetData(context, false)) + { + return false; + } + } + } + } + } + + if (classElement.GetVersion() <= 2) + { + const int elementIndex = classElement.FindElement(AZ_CRC("Mass", 0x6c035b66)); + + if (elementIndex >= 0) + { + float existingMass = 0; + AZ::SerializeContext::DataElementNode& massElement = classElement.GetSubElement(elementIndex); + const bool found = massElement.GetData(existingMass); + + if (found && existingMass > 0) + { + // Keeping the existing mass and disabling auto-compute of the mass for this rigid body. + // Version 3 includes a new m_computeMass boolean flag to specify the automatic calculation of mass. + const int idx = classElement.AddElement(context, "Compute Mass"); + if (idx != -1) + { + if (!classElement.GetSubElement(idx).SetData(context, false)) + { + return false; + } + } + } + } + } + + if (classElement.GetVersion() <= 3) + { + classElement.RemoveElementByName(AZ_CRC_CE("Property Visibility Flags")); + } + + return true; + } + } + + AZ_CLASS_ALLOCATOR_IMPL(RigidBodyConfiguration, AZ::SystemAllocator, 0); + + void RigidBodyConfiguration::Reflect(AZ::ReflectContext* context) + { + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(4, &Internal::RigidBodyVersionConverter) + ->Field("Initial linear velocity", &RigidBodyConfiguration::m_initialLinearVelocity) + ->Field("Initial angular velocity", &RigidBodyConfiguration::m_initialAngularVelocity) + ->Field("Linear damping", &RigidBodyConfiguration::m_linearDamping) + ->Field("Angular damping", &RigidBodyConfiguration::m_angularDamping) + ->Field("Sleep threshold", &RigidBodyConfiguration::m_sleepMinEnergy) + ->Field("Start Asleep", &RigidBodyConfiguration::m_startAsleep) + ->Field("Interpolate Motion", &RigidBodyConfiguration::m_interpolateMotion) + ->Field("Gravity Enabled", &RigidBodyConfiguration::m_gravityEnabled) + ->Field("Simulated", &RigidBodyConfiguration::m_simulated) + ->Field("Kinematic", &RigidBodyConfiguration::m_kinematic) + ->Field("CCD Enabled", &RigidBodyConfiguration::m_ccdEnabled) + ->Field("Compute Mass", &RigidBodyConfiguration::m_computeMass) + ->Field("Mass", &RigidBodyConfiguration::m_mass) + ->Field("Compute COM", &RigidBodyConfiguration::m_computeCenterOfMass) + ->Field("Centre of mass offset", &RigidBodyConfiguration::m_centerOfMassOffset) + ->Field("Compute inertia", &RigidBodyConfiguration::m_computeInertiaTensor) + ->Field("Inertia tensor", &RigidBodyConfiguration::m_inertiaTensor) + ->Field("Maximum Angular Velocity", &RigidBodyConfiguration::m_maxAngularVelocity) + ->Field("Include All Shapes In Mass", &RigidBodyConfiguration::m_includeAllShapesInMassCalculation) + ->Field("CCD Min Advance", &RigidBodyConfiguration::m_ccdMinAdvanceCoefficient) + ->Field("CCD Friction", &RigidBodyConfiguration::m_ccdFrictionEnabled) + ; + } + } + + MassComputeFlags RigidBodyConfiguration::GetMassComputeFlags() const + { + MassComputeFlags flags = MassComputeFlags::NONE; + + if (m_computeCenterOfMass) + { + flags = flags | MassComputeFlags::COMPUTE_COM; + } + + if (m_computeInertiaTensor) + { + flags = flags | MassComputeFlags::COMPUTE_INERTIA; + } + + if (m_computeMass) + { + flags = flags | MassComputeFlags::COMPUTE_MASS; + } + + if (m_includeAllShapesInMassCalculation) + { + flags = flags | MassComputeFlags::INCLUDE_ALL_SHAPES; + } + + return flags; + } + + void RigidBodyConfiguration::SetMassComputeFlags(MassComputeFlags flags) + { + m_computeCenterOfMass = MassComputeFlags::COMPUTE_COM == (flags & MassComputeFlags::COMPUTE_COM); + m_computeInertiaTensor = MassComputeFlags::COMPUTE_INERTIA == (flags & MassComputeFlags::COMPUTE_INERTIA); + m_computeMass = MassComputeFlags::COMPUTE_MASS == (flags & MassComputeFlags::COMPUTE_MASS); + m_includeAllShapesInMassCalculation = + MassComputeFlags::INCLUDE_ALL_SHAPES == (flags & MassComputeFlags::INCLUDE_ALL_SHAPES); + } + + bool RigidBodyConfiguration::IsCCDEnabled() const + { + return m_ccdEnabled; + } + + AZ::Crc32 RigidBodyConfiguration::GetInitialVelocitiesVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::InitialVelocities); + } + + AZ::Crc32 RigidBodyConfiguration::GetInertiaSettingsVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::InertiaProperties); + } + + AZ::Crc32 RigidBodyConfiguration::GetInertiaVisibility() const + { + bool visible = ((m_propertyVisibilityFlags & RigidBodyConfiguration::PropertyVisibility::InertiaProperties) != 0) && !m_computeInertiaTensor; + return visible ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; + } + + AZ::Crc32 RigidBodyConfiguration::GetCoMVisibility() const + { + bool visible = ((m_propertyVisibilityFlags & RigidBodyConfiguration::PropertyVisibility::InertiaProperties) != 0) && !m_computeCenterOfMass; + return visible ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; + } + + AZ::Crc32 RigidBodyConfiguration::GetMassVisibility() const + { + bool visible = ((m_propertyVisibilityFlags & RigidBodyConfiguration::PropertyVisibility::InertiaProperties) != 0) && !m_computeMass; + return visible ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; + } + + AZ::Crc32 RigidBodyConfiguration::GetDampingVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::Damping); + } + + AZ::Crc32 RigidBodyConfiguration::GetSleepOptionsVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::SleepOptions); + } + + AZ::Crc32 RigidBodyConfiguration::GetInterpolationVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::Interpolation); + } + + AZ::Crc32 RigidBodyConfiguration::GetGravityVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::Gravity); + } + + AZ::Crc32 RigidBodyConfiguration::GetKinematicVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::Kinematic); + } + + AZ::Crc32 RigidBodyConfiguration::GetCCDVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::ContinuousCollisionDetection); + } + + AZ::Crc32 RigidBodyConfiguration::GetMaxVelocitiesVisibility() const + { + return Internal::GetPropertyVisibility(m_propertyVisibilityFlags, RigidBodyConfiguration::PropertyVisibility::MaxVelocities); + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/RigidBodyConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/RigidBodyConfiguration.h new file mode 100644 index 0000000000..5c43118f3d --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/RigidBodyConfiguration.h @@ -0,0 +1,106 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + class ReflectContext; +} + +namespace AzPhysics +{ + //! Configuration used to Add Rigid bodies to a Scene. + struct RigidBodyConfiguration + : public AzPhysics::SimulatedBodyConfiguration + { + public: + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(RigidBodyConfiguration, "{ACFA8900-8530-4744-AF00-AA533C868A8E}", AzPhysics::SimulatedBodyConfiguration); + static void Reflect(AZ::ReflectContext* context); + + RigidBodyConfiguration() = default; + + MassComputeFlags GetMassComputeFlags() const; + void SetMassComputeFlags(MassComputeFlags flags); + + bool IsCCDEnabled() const; + + // Basic initial settings. + AZ::Vector3 m_initialLinearVelocity = AZ::Vector3::CreateZero(); + AZ::Vector3 m_initialAngularVelocity = AZ::Vector3::CreateZero(); + AZ::Vector3 m_centerOfMassOffset = AZ::Vector3::CreateZero(); + + // Simulation parameters. + float m_mass = 1.0f; + AZ::Matrix3x3 m_inertiaTensor = AZ::Matrix3x3::CreateIdentity(); + float m_linearDamping = 0.05f; + float m_angularDamping = 0.15f; + float m_sleepMinEnergy = 0.005f; + float m_maxAngularVelocity = 100.0f; + + bool m_startAsleep = false; + bool m_interpolateMotion = false; + bool m_gravityEnabled = true; + bool m_simulated = true; + bool m_kinematic = false; + bool m_ccdEnabled = false; //!< Whether continuous collision detection is enabled. + float m_ccdMinAdvanceCoefficient = 0.15f; //!< Coefficient affecting how granularly time is subdivided in CCD. + bool m_ccdFrictionEnabled = false; //!< Whether friction is applied when resolving CCD collisions. + + bool m_computeCenterOfMass = true; + bool m_computeInertiaTensor = true; + bool m_computeMass = true; + + //! If set, non-simulated shapes will also be included in the mass properties calculation. + bool m_includeAllShapesInMassCalculation = false; + + //! Variant to support multiple having the system creating the Shape(s) or just providing the Shape(s) that have been created externally. + //! See ShapeVariantData for more information. + ShapeVariantData m_colliderAndShapeData; + + //Visibility helpers for use in the Editor when reflected. RagdollNodeConfiguration also uses these. + enum PropertyVisibility : AZ::u16 + { + InitialVelocities = 1 << 0, //!< Whether the initial linear and angular velocities are visible. + InertiaProperties = 1 << 1, //!< Whether the whole category of inertia properties (mass, compute inertia, inertia tensor etc) is visible. + Damping = 1 << 2, //!< Whether linear and angular damping are visible. + SleepOptions = 1 << 3, //!< Whether the sleep threshold and start asleep options are visible. + Interpolation = 1 << 4, //!< Whether the interpolation option is visible. + Gravity = 1 << 5, //!< Whether the effected by gravity option is visible. + Kinematic = 1 << 6, //!< Whether the option to make the body kinematic is visible. + ContinuousCollisionDetection = 1 << 7, //!< Whether the option to enable continuous collision detection is visible. + MaxVelocities = 1 << 8 //!< Whether upper limits on velocities are visible. + }; + + AZ::Crc32 GetInitialVelocitiesVisibility() const; + AZ::Crc32 GetInertiaSettingsVisibility() const; + AZ::Crc32 GetInertiaVisibility() const; + AZ::Crc32 GetMassVisibility() const; + AZ::Crc32 GetCoMVisibility() const; + AZ::Crc32 GetDampingVisibility() const; + AZ::Crc32 GetSleepOptionsVisibility() const; + AZ::Crc32 GetInterpolationVisibility() const; + AZ::Crc32 GetGravityVisibility() const; + AZ::Crc32 GetKinematicVisibility() const; + AZ::Crc32 GetCCDVisibility() const; + AZ::Crc32 GetMaxVelocitiesVisibility() const; + + AZ::u16 m_propertyVisibilityFlags = (std::numeric_limits::max)(); + }; +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.cpp index cbca68f0e1..db54eee2ce 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.cpp @@ -13,6 +13,7 @@ #include #include +#include #include namespace AzPhysics @@ -21,16 +22,47 @@ namespace AzPhysics /*static*/ void SceneConfiguration::Reflect(AZ::ReflectContext* context) { - Physics::WorldConfiguration::Reflect(context); - if (auto* serializeContext = azrtti_cast(context)) { serializeContext->Class() - ->Version(1) - ->Field("LegacyConfig", &SceneConfiguration::m_legacyConfiguration) - ->Field("LegacyId", &SceneConfiguration::m_legacyId) + ->Version(2) ->Field("Name", &SceneConfiguration::m_sceneName) + ->Field("WorldBounds", &SceneConfiguration::m_worldBounds) + ->Field("Gravity", &SceneConfiguration::m_gravity) + ->Field("EnableCcd", &SceneConfiguration::m_enableCcd) + ->Field("MaxCcdPasses", &SceneConfiguration::m_maxCcdPasses) + ->Field("EnableCcdResweep", &SceneConfiguration::m_enableCcdResweep) + ->Field("EnableActiveActors", &SceneConfiguration::m_enableActiveActors) + ->Field("EnablePcm", &SceneConfiguration::m_enablePcm) + ->Field("BounceThresholdVelocity", &SceneConfiguration::m_bounceThresholdVelocity) ; + + if (auto* editContext = serializeContext->GetEditContext()) + { + editContext->Class("Scene Configuration", "Default scene configuration") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneConfiguration::m_worldBounds, "World Bounds", "World bounds") + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneConfiguration::m_gravity, "Gravity", "Gravity") + ->ClassElement(AZ::Edit::ClassElements::Group, "Continuous Collision Detection") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneConfiguration::m_enableCcd, "Enable CCD", "Enabled continuous collision detection in the world") + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneConfiguration::m_maxCcdPasses, + "Max CCD Passes", "Maximum number of continuous collision detection passes") + ->Attribute(AZ::Edit::Attributes::Visibility, &SceneConfiguration::GetCcdVisibility) + ->Attribute(AZ::Edit::Attributes::Min, 1u) + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneConfiguration::m_enableCcdResweep, + "Enable CCD Resweep", "Enable a more accurate but more expensive continuous collision detection method") + ->Attribute(AZ::Edit::Attributes::Visibility, &SceneConfiguration::GetCcdVisibility) + ->ClassElement(AZ::Edit::ClassElements::Group, "") // end previous group by starting new unnamed expanded group + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneConfiguration::m_enablePcm, "Persistent Contact Manifold", "Enabled the persistent contact manifold narrow-phase algorithm") + ->DataElement(AZ::Edit::UIHandlers::Default, &SceneConfiguration::m_bounceThresholdVelocity, + "Bounce Threshold Velocity", "Relative velocity below which colliding objects will not bounce") + ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ; + } } } @@ -41,14 +73,28 @@ namespace AzPhysics bool SceneConfiguration::operator==(const SceneConfiguration& other) const { - return m_legacyId == other.m_legacyId - && m_sceneName == other.m_sceneName - && m_legacyConfiguration == other.m_legacyConfiguration - ; + return m_sceneName == other.m_sceneName + && m_enableCcd == other.m_enableCcd + && m_enableCcdResweep == other.m_enableCcdResweep + && m_enableActiveActors == other.m_enableActiveActors + && m_enablePcm == other.m_enablePcm + && m_kinematicFiltering == other.m_kinematicFiltering + && m_kinematicStaticFiltering == other.m_kinematicStaticFiltering + && m_customUserData == other.m_customUserData + && m_maxCcdPasses == other.m_maxCcdPasses + && AZ::IsClose(m_bounceThresholdVelocity, other.m_bounceThresholdVelocity) + && m_gravity.IsClose(other.m_gravity) + && m_worldBounds == other.m_worldBounds + ; } bool SceneConfiguration::operator!=(const SceneConfiguration& other) const { return !(*this == other); } + + AZ::Crc32 SceneConfiguration::GetCcdVisibility() const + { + return m_enableCcd ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; + } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.h index 471cfa7fc4..55e54f59a0 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SceneConfiguration.h @@ -11,11 +11,13 @@ */ #pragma once -#include +#include #include +#include #include +#include -#include //this will be removed with LYN-438. +#include namespace AZ { @@ -33,14 +35,28 @@ namespace AzPhysics static SceneConfiguration CreateDefault(); - // Legacy members Will be removed and replaced with LYN-438 work. - Physics::WorldConfiguration m_legacyConfiguration; - AZ::Crc32 m_legacyId; //use SceneConfiguration::m_SceneName instead + AZStd::string m_sceneName; //!< Name given to the scene. - AZStd::string m_sceneName = "DefaultScene"; //!< Name given to the scene. + AZ::Aabb m_worldBounds = AZ::Aabb::CreateFromMinMax(-AZ::Vector3(1000.f, 1000.f, 1000.f), AZ::Vector3(1000.f, 1000.f, 1000.f)); + AZ::Vector3 m_gravity = AzPhysics::DefaultGravity; + void* m_customUserData = nullptr; + bool m_enableCcd = false; //!< Enables continuous collision detection in the world. + AZ::u32 m_maxCcdPasses = 1; //!< Maximum number of continuous collision detection passes. + bool m_enableCcdResweep = true; //!< Use a more accurate but more expensive continuous collision detection method. + + //! Enables reporting of changed Simulated bodies on the OnSceneActiveSimulatedBodiesEvent event. + //! @note There may be a performance penalty for enabling the Active Actor Notification. + bool m_enableActiveActors = false; + bool m_enablePcm = true; //!< Enables the persistent contact manifold algorithm to be used as the narrow phase algorithm. + bool m_kinematicFiltering = true; //!< Enables filtering between kinematic/kinematic objects. + bool m_kinematicStaticFiltering = true; //!< Enables filtering between kinematic/static objects. + float m_bounceThresholdVelocity = 2.0f; //!< Relative velocity below which colliding objects will not bounce. bool operator==(const SceneConfiguration& other) const; bool operator!=(const SceneConfiguration& other) const; + + private: + AZ::Crc32 GetCcdVisibility() const; }; //! Alias for a list of SceneConfiguration objects, used for the creation of multiple Scenes at once. diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp new file mode 100644 index 0000000000..0e29263e30 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp @@ -0,0 +1,52 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +namespace AzPhysics +{ + namespace Internal + { + bool DeprecateWorldBodyConfiguration(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) + { + // WorldBodyConfiguration on serialized the name so capture that. + AZStd::string name = ""; + classElement.GetChildData(AZ::Crc32("name"), name); + //convert to the new class + classElement.Convert(context); + //add the captured name + classElement.AddElementWithData(context, "name", name); + return true; + } + } + + AZ_CLASS_ALLOCATOR_IMPL(SimulatedBodyConfiguration, AZ::SystemAllocator, 0); + + void SimulatedBodyConfiguration::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->ClassDeprecate("WorldBodyConfiguration", "{6EEB377C-DC60-4E10-AF12-9626C0763B2D}", &Internal::DeprecateWorldBodyConfiguration); + serializeContext->Class() + ->Version(1) + ->Field("name", &SimulatedBodyConfiguration::m_debugName) + ->Field("position", &SimulatedBodyConfiguration::m_position) + ->Field("orientation", &SimulatedBodyConfiguration::m_orientation) + ->Field("scale", &SimulatedBodyConfiguration::m_scale) + ->Field("entityId", &SimulatedBodyConfiguration::m_entityId) + ; + } + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h new file mode 100644 index 0000000000..47b05089de --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h @@ -0,0 +1,54 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + class ReflectContext; +} + +namespace AzPhysics +{ + //! Base Class of all Physics Bodies that will be simulated. + struct SimulatedBodyConfiguration + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(SimulatedBodyConfiguration, "{52844E3D-79C8-4F34-AF63-5C45ADE77F85}"); + static void Reflect(AZ::ReflectContext* context); + + SimulatedBodyConfiguration() = default; + virtual ~SimulatedBodyConfiguration() = default; + + // Basic initial settings. + AZ::Vector3 m_position = AZ::Vector3::CreateZero(); + AZ::Quaternion m_orientation = AZ::Quaternion::CreateIdentity(); + AZ::Vector3 m_scale = AZ::Vector3::CreateOne(); + + // Entity/object association. + AZ::EntityId m_entityId = AZ::EntityId(AZ::EntityId::InvalidEntityId); + void* m_customUserData = nullptr; + + // For debugging/tracking purposes only. + AZStd::string m_debugName; + }; + + //! Alias for a list of non owning weak pointers to SceneConfiguration objects. + //! Used for the creation of multiple SimulatedBodies at once with Scene::AddSimulatedBodies. + using SimulatedBodyConfigurationList = AZStd::vector; +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/StaticRigidBodyConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/StaticRigidBodyConfiguration.cpp new file mode 100644 index 0000000000..130193f412 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/StaticRigidBodyConfiguration.cpp @@ -0,0 +1,34 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include + +namespace AzPhysics +{ + AZ_CLASS_ALLOCATOR_IMPL(StaticRigidBodyConfiguration, AZ::SystemAllocator, 0); + + void StaticRigidBodyConfiguration::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1) + ->Field("ColliderAndShapeData", &StaticRigidBodyConfiguration::m_colliderAndShapeData); + ; + } + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/StaticRigidBodyConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/StaticRigidBodyConfiguration.h new file mode 100644 index 0000000000..6662c03e3c --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/StaticRigidBodyConfiguration.h @@ -0,0 +1,47 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + class ReflectContext; +} + +namespace Physics +{ + class ShapeConfiguration; + class ColliderConfiguration; + class Shape; +} + +namespace AzPhysics +{ + struct StaticRigidBodyConfiguration : public SimulatedBodyConfiguration + { + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(StaticRigidBodyConfiguration, "{E68A14C0-21DC-4FC7-9AD0-04BB9D972004}", SimulatedBodyConfiguration); + static void Reflect(AZ::ReflectContext* context); + + StaticRigidBodyConfiguration() = default; + virtual ~StaticRigidBodyConfiguration() = default; + + //! Variant to support multiple having the system creating the Shape(s) or just providing the Shape(s) that have been created externally. + //! See ShapeVariantData for more information. + ShapeVariantData m_colliderAndShapeData; + }; +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp index dbb3df0797..497d67bef1 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp @@ -13,17 +13,24 @@ #include #include +#include #include namespace AzPhysics { + namespace + { + const float TimestepMin = 0.001f; //1000fps + const float TimestepMax = 0.05f; //20fps + } + AZ_CLASS_ALLOCATOR_IMPL(SystemConfiguration, AZ::SystemAllocator, 0); /*static*/ void SystemConfiguration::Reflect(AZ::ReflectContext* context) { - if (auto serializeContext = azrtti_cast(context)) + if (auto* serializeContext = azdynamic_cast(context)) { - serializeContext->Class() + serializeContext->Class() ->Version(2) ->Field("AutoManageSimulationUpdate", &SystemConfiguration::m_autoManageSimulationUpdate) ->Field("MaxTimestep", &SystemConfiguration::m_maxTimestep) @@ -33,6 +40,34 @@ namespace AzPhysics ->Field("OverlapBufferSize", &SystemConfiguration::m_overlapBufferSize) ->Field("CollisionConfig", &SystemConfiguration::m_collisionConfig) ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("", "") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::Default, &SystemConfiguration::m_maxTimestep, "Max Time Step (sec)", "Max time step in seconds") + ->Attribute(AZ::Edit::Attributes::Min, TimestepMin) + ->Attribute(AZ::Edit::Attributes::Max, TimestepMax) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SystemConfiguration::OnMaxTimeStepChanged)//need to clamp m_fixedTimeStep if this value changes + ->Attribute(AZ::Edit::Attributes::Decimals, 8) + ->Attribute(AZ::Edit::Attributes::DisplayDecimals, 8) + ->DataElement(AZ::Edit::UIHandlers::Default, &SystemConfiguration::m_fixedTimestep, "Fixed Time Step (sec)", "Fixed time step in seconds. Limited by 'Max Time Step'") + ->Attribute(AZ::Edit::Attributes::Min, TimestepMin) + ->Attribute(AZ::Edit::Attributes::Max, &SystemConfiguration::GetFixedTimeStepMax) + ->Attribute(AZ::Edit::Attributes::Decimals, 8) + ->Attribute(AZ::Edit::Attributes::DisplayDecimals, 8) + ->DataElement(AZ::Edit::UIHandlers::Default, &SystemConfiguration::m_raycastBufferSize, + "Raycast Buffer Size", "Maximum number of hits from a raycast") + ->Attribute(AZ::Edit::Attributes::Min, 1u) + ->DataElement(AZ::Edit::UIHandlers::Default, &SystemConfiguration::m_shapecastBufferSize, + "Shapecast Buffer Size", "Maximum number of hits from a shapecast") + ->Attribute(AZ::Edit::Attributes::Min, 1u) + ->DataElement(AZ::Edit::UIHandlers::Default, &SystemConfiguration::m_overlapBufferSize, + "Overlap Query Buffer Size", "Maximum number of hits from a overlap query") + ->Attribute(AZ::Edit::Attributes::Min, 1u) + ; + } } } @@ -52,4 +87,15 @@ namespace AzPhysics { return !(*this == other); } + + AZ::u32 SystemConfiguration::OnMaxTimeStepChanged() + { + m_fixedTimestep = AZStd::GetMin(m_fixedTimestep, GetFixedTimeStepMax()); //since m_maxTimeStep has changed, m_fixedTimeStep might be larger then the max. + return AZ::Edit::PropertyRefreshLevels::AttributesAndValues; + } + + float SystemConfiguration::GetFixedTimeStepMax() const + { + return m_maxTimestep; + } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h index c78577f701..3de4dafd8c 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h @@ -26,7 +26,7 @@ namespace AzPhysics struct SystemConfiguration { AZ_CLASS_ALLOCATOR_DECL; - AZ_RTTI(SystemConfiguration, "{24697CAF-AC00-443D-9C27-28D58734A84C}"); + AZ_RTTI(AzPhysics::SystemConfiguration, "{24697CAF-AC00-443D-9C27-28D58734A84C}"); static void Reflect(AZ::ReflectContext* context); SystemConfiguration() = default; @@ -51,5 +51,10 @@ namespace AzPhysics bool operator==(const SystemConfiguration& other) const; bool operator!=(const SystemConfiguration& other) const; + + private: + // helpers for edit context + AZ::u32 OnMaxTimeStepChanged(); + float GetFixedTimeStepMax() const; }; } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Joint.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Joint.cpp index cd9116ab1c..965583c113 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Joint.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Joint.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace Physics { diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Joint.h b/Code/Framework/AzFramework/AzFramework/Physics/Joint.h index 9d82dfcca8..d78ce74611 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Joint.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Joint.h @@ -14,7 +14,11 @@ #include #include -#include + +namespace AzPhysics +{ + struct SimulatedBody; +} namespace Physics { @@ -43,10 +47,10 @@ namespace Physics AZ_CLASS_ALLOCATOR(Joint, AZ::SystemAllocator, 0); AZ_RTTI(Joint, "{405F517C-E986-4ACB-9606-D5D080DDE987}"); - virtual Physics::WorldBody* GetParentBody() const = 0; - virtual Physics::WorldBody* GetChildBody() const = 0; - virtual void SetParentBody(Physics::WorldBody* parentBody) = 0; - virtual void SetChildBody(Physics::WorldBody* childBody) = 0; + virtual AzPhysics::SimulatedBody* GetParentBody() const = 0; + virtual AzPhysics::SimulatedBody* GetChildBody() const = 0; + virtual void SetParentBody(AzPhysics::SimulatedBody* parentBody) = 0; + virtual void SetChildBody(AzPhysics::SimulatedBody* childBody) = 0; virtual const AZStd::string& GetName() const = 0; virtual void SetName(const AZStd::string& name) = 0; virtual const AZ::Crc32 GetNativeType() const = 0; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp index 949b6f8c88..5552cef448 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp @@ -71,7 +71,7 @@ namespace Physics AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(3, &VersionConverter) ->Field("SurfaceType", &MaterialConfiguration::m_surfaceType) ->Field("DynamicFriction", &MaterialConfiguration::m_dynamicFriction) @@ -88,7 +88,7 @@ namespace Physics { AZStd::unordered_set forbiddenSurfaceTypeNames; forbiddenSurfaceTypeNames.insert("Default"); - editContext->Class("", "") + editContext->Class("", "") ->ClassElement(AZ::Edit::ClassElements::EditorData, "Physics Material") ->DataElement(MaterialConfiguration::s_configLineEdit, &MaterialConfiguration::m_surfaceType, "Surface type", "Game surface type") // Uses ConfigStringLineEditCtrl in PhysX gem. ->Attribute(AZ::Edit::Attributes::MaxLength, 64) @@ -168,7 +168,7 @@ namespace Physics AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(2, &ClassConverters::MaterialLibraryAssetConverter) ->Attribute(AZ::Edit::Attributes::EnableForAssetEditor, true) ->EventHandler() @@ -178,7 +178,7 @@ namespace Physics AZ::EditContext* editContext = serializeContext->GetEditContext(); if (editContext) { - editContext->Class("", "") + editContext->Class("", "") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialLibraryAsset::m_materialLibrary, "Physics Materials", "List of physics materials") @@ -196,7 +196,7 @@ namespace Physics AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(1) ->Field("Asset", &MaterialLibraryAssetReflectionWrapper::m_asset) ; @@ -204,7 +204,7 @@ namespace Physics AZ::EditContext* editContext = serializeContext->GetEditContext(); if (editContext) { - editContext->Class("", "") + editContext->Class("", "") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AutoExpand, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) @@ -223,7 +223,7 @@ namespace Physics AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(1) ->Field("Asset", &DefaultMaterialLibraryAssetReflectionWrapper::m_asset) ; @@ -231,7 +231,7 @@ namespace Physics AZ::EditContext* editContext = serializeContext->GetEditContext(); if (editContext) { - editContext->Class("", "") + editContext->Class("", "") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AutoExpand, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) @@ -250,7 +250,7 @@ namespace Physics AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(1) ->Field("Configuration", &MaterialFromAssetConfiguration::m_configuration) ->Field("UID", &MaterialFromAssetConfiguration::m_id) @@ -259,7 +259,7 @@ namespace Physics AZ::EditContext* editContext = serializeContext->GetEditContext(); if (editContext) { - editContext->Class("", "") + editContext->Class("", "") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialFromAssetConfiguration::m_configuration, "Physics Material", "Physics Material properties") @@ -369,7 +369,7 @@ namespace Physics { if (auto serializeContext = azrtti_cast(context)) { - serializeContext->Class() + serializeContext->Class() ->Version(2, &ClassConverters::MaterialSelectionConverter) ->EventHandler() ->Field("Material", &MaterialSelection::m_materialLibrary) @@ -378,7 +378,7 @@ namespace Physics if (auto editContext = serializeContext->GetEditContext()) { - editContext->Class("Physics Material", "Select physics material library and which materials to use for the object") + editContext->Class("Physics Material", "Select physics material library and which materials to use for the object") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialSelection::m_materialLibrary, "Library", "Physics material library to use for this object") diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Material.h b/Code/Framework/AzFramework/AzFramework/Physics/Material.h index 6ef6dbdc55..72be2805f9 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Material.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Material.h @@ -49,7 +49,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(Material, AZ::SystemAllocator, 0); - AZ_RTTI(Material, "{44636CEA-46DD-4D4A-B1EF-5ED6DEA7F714}"); + AZ_RTTI(Physics::Material, "{44636CEA-46DD-4D4A-B1EF-5ED6DEA7F714}"); /// Enumeration that determines how two materials properties are combined when /// processing collisions. @@ -102,7 +102,7 @@ namespace Physics class MaterialConfiguration { public: - AZ_TYPE_INFO(MaterialConfiguration, "{8807CAA1-AD08-4238-8FDB-2154ADD084A1}"); + AZ_TYPE_INFO(Physics::MaterialConfiguration, "{8807CAA1-AD08-4238-8FDB-2154ADD084A1}"); static void Reflect(AZ::ReflectContext* context); @@ -140,7 +140,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(MaterialId, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(MaterialId, "{744CCE6C-9F69-4E2F-B950-DAB8514F870B}"); + AZ_TYPE_INFO(Physics::MaterialId, "{744CCE6C-9F69-4E2F-B950-DAB8514F870B}"); static void Reflect(AZ::ReflectContext* context); static MaterialId Create(); @@ -160,7 +160,7 @@ namespace Physics class MaterialFromAssetConfiguration { public: - AZ_TYPE_INFO(MaterialFromAssetConfiguration, "{FBD76628-DE57-435E-BE00-6FFAE64DDF1D}"); + AZ_TYPE_INFO(Physics::MaterialFromAssetConfiguration, "{FBD76628-DE57-435E-BE00-6FFAE64DDF1D}"); static void Reflect(AZ::ReflectContext* context); @@ -182,7 +182,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(MaterialLibraryAsset, AZ::SystemAllocator, 0); - AZ_RTTI(MaterialLibraryAsset, "{9E366D8C-33BB-4825-9A1F-FA3ADBE11D0F}", AZ::Data::AssetData); + AZ_RTTI(Physics::MaterialLibraryAsset, "{9E366D8C-33BB-4825-9A1F-FA3ADBE11D0F}", AZ::Data::AssetData); MaterialLibraryAsset() = default; virtual ~MaterialLibraryAsset() = default; @@ -231,7 +231,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(MaterialLibraryAssetReflectionWrapper, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(MaterialLibraryAssetReflectionWrapper, "{3D2EF5DF-EFD0-47EB-B88F-3E6FE1FEE5B0}"); + AZ_TYPE_INFO(Physics::MaterialLibraryAssetReflectionWrapper, "{3D2EF5DF-EFD0-47EB-B88F-3E6FE1FEE5B0}"); static void Reflect(AZ::ReflectContext* context); AZ::Data::Asset m_asset = @@ -243,7 +243,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(MaterialLibraryAssetReflectionWrapper, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(DefaultMaterialLibraryAssetReflectionWrapper, "{02AB8CBC-D35B-4E0F-89BA-A96D94DAD4F9}"); + AZ_TYPE_INFO(Physics::DefaultMaterialLibraryAssetReflectionWrapper, "{02AB8CBC-D35B-4E0F-89BA-A96D94DAD4F9}"); static void Reflect(AZ::ReflectContext* context); AZ::Data::Asset m_asset = @@ -263,7 +263,7 @@ namespace Physics friend class MaterialSelectionEventHandler; public: AZ_CLASS_ALLOCATOR(MaterialSelection, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(MaterialSelection, "{F571AFF4-C4BB-4590-A204-D11D9EEABBC4}"); + AZ_TYPE_INFO(Physics::MaterialSelection, "{F571AFF4-C4BB-4590-A204-D11D9EEABBC4}"); using SlotsArray = AZStd::vector; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.cpp b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.cpp new file mode 100644 index 0000000000..eee099244e --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.cpp @@ -0,0 +1,75 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or +* a third party where indicated. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include + +#include +#include + + +namespace AzPhysics +{ + AZ_CLASS_ALLOCATOR_IMPL(Scene, AZ::SystemAllocator, 0); + + /*static*/ void Scene::Reflect(AZ::ReflectContext* context) + { + if (auto* behaviorContext = azrtti_cast(context)) + { + const auto getOnGravityChange = [](const AZStd::string& sceneName) -> SceneEvents::OnSceneGravityChangedEvent* + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + SceneHandle sceneHandle = physicsSystem->GetSceneHandle(sceneName); + if (sceneHandle != AzPhysics::InvalidSceneHandle) + { + if (Scene* scene = physicsSystem->GetScene(sceneHandle)) + { + return scene->GetOnGravityChangedEvent(); + } + } + } + return nullptr; + }; + const AZ::BehaviorAzEventDescription gravityChangedEventDescription = + { + "On Gravity Changed event", + { + "Scene Handle", + "Gravity Vector" + } // Parameters + }; + + behaviorContext->Class("PhysicsScene") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "Physics") + ->Method("GetOnGravityChangeEvent", getOnGravityChange) + ->Attribute(AZ::Script::Attributes::AzEventDescription, gravityChangedEventDescription) + ; + } + } + + Scene::Scene(const SceneConfiguration& config) + : m_id(config.m_sceneName) + { + + } + + const AZ::Crc32& Scene::GetId() const + { + return m_id; + } + + SceneEvents::OnSceneGravityChangedEvent* Scene::GetOnGravityChangedEvent() + { + return &m_sceneGravityChangedEvent; + } +} // namespace AzPhysics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.h b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.h index f5de7712a0..db3ec15c83 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.h @@ -12,21 +12,232 @@ #pragma once #include - -#include // Temporary until LYN-438 work is complete +#include +#include +#include +#include +#include namespace AzPhysics { struct SceneConfiguration; + //! Interface to access a Physics Scene with a SceneHandle. + class SceneInterface + { + public: + AZ_RTTI(SceneInterface, "{912CE8D1-7E3E-496F-B7BE-D17F8B30C228}"); + + SceneInterface() = default; + virtual ~SceneInterface() = default; + AZ_DISABLE_COPY_MOVE(SceneInterface); + + //! Returns a Scene Handle connected to the given scene name. + //! @param sceneName The name of the scene to look up. + //! @returns Will return a SceneHandle to a Scene connected with the given name, otherwise will return InvalidSceneHandle. + virtual SceneHandle GetSceneHandle(const AZStd::string& sceneName) = 0; + + //! Start the simulation process. + //! As an example, this is a good place to trigger and queue any long running work in separate threads. + //! @param sceneHandle The SceneHandle of the scene to use. + //! @param deltatime The time in seconds to step the simulation for. + virtual void StartSimulation(SceneHandle sceneHandle, float deltatime) = 0; + + //! Complete the simulation process. + //! As an example, this is a good place to wait for any work to complete that was triggered in StartSimulation, or swap buffers if double buffering. + //! @param sceneHandle The SceneHandle of the scene to use. + virtual void FinishSimulation(SceneHandle sceneHandle) = 0; + + //! Enable or Disable this Scene's Simulation tick. + //! Default is Enabled. + //! @param sceneHandle The SceneHandle of the scene to use. + //! @param enable When true the Scene will execute its simulation tick when StartSimulation is called. When false, StartSimulation will not execute. + virtual void SetEnabled(SceneHandle sceneHandle, bool enable) = 0; + + //! Check if this Scene is currently Enabled. + //! @param sceneHandle The SceneHandle of the scene to use. + //! @return When true the Scene is enabled and will execute its simulation tick when StartSimulation is called. When false, + //! StartSimulation will not execute or the SceneHandle is invalid. + virtual bool IsEnabled(SceneHandle sceneHandle) const = 0; + + //! Add a simulated body to the Scene. + //! @param sceneHandle A handle to the scene to add the requested simulated body. + //! @param simulatedBodyConfig The config of the simulated body. + //! @return Returns a handle to the created Simulated body. Will return AzPhyiscs::InvalidSimulatedBodyHandle if it fails. + virtual SimulatedBodyHandle AddSimulatedBody(SceneHandle sceneHandle, const SimulatedBodyConfiguration* simulatedBodyConfig) = 0; + + //! Add a set of simulated bodied to the Scene. + //! @param sceneHandle A handle to the scene to Add the simulated bodies to. + //! @param simulatedBodyConfigs The list of simulated body configs. + //! @return Returns a list of handles to the created Simulated bodies. Will be in the same order as supplied in simulatedBodyConfigs. + //! If the scene handle is invalid, this will return an empty list. If one fails, that index will be set to AzPhyiscs::InvalidSimulatedBodyHandle. + virtual SimulatedBodyHandleList AddSimulatedBodies(SceneHandle sceneHandle, const SimulatedBodyConfigurationList& simulatedBodyConfigs) = 0; + + //! Get the Raw pointer to the requested simulated body. + //! @param sceneHandle A handle to the scene to get the simulated bodies from. + //! @param bodyHandle A handle to the simulated body to retrieve the raw pointer. + //! @return A raw pointer to the Simulated body. If the either handle is invalid this will return null. + virtual SimulatedBody* GetSimulatedBodyFromHandle(SceneHandle sceneHandle, SimulatedBodyHandle bodyHandle) = 0; + + //! Get the Raw pointer to the set of requested simulated bodies. + //! @param sceneHandle A handle to the scene to get the simulated bodies from. + //! @param bodyHandles A list of simulated body handles to retrieve the raw pointers. + //! @return A list of raw pointers to the Simulated bodies requested. If the scene handle is invalid this will return an empty list. + //! If a simulated body handle is invalid, that index in the list will be null. + virtual SimulatedBodyList GetSimulatedBodiesFromHandle(SceneHandle sceneHandle, const SimulatedBodyHandleList& bodyHandles) = 0; + + //! Remove a simulated body from the Scene.z + //! @param sceneHandle A handle to the scene to remove the requested simulated body. + //! @param bodyHandle A handle to the simulated body being removed. + virtual void RemoveSimulatedBody(SceneHandle sceneHandle, SimulatedBodyHandle bodyHandle) = 0; + + //! Remove a list of simulated bodies from the Scene. + //! @param sceneHandle A handle to the scene to remove the simulated bodies from. + //! @param bodyHandles A list of simulated body handles to be removed. + virtual void RemoveSimulatedBodies(SceneHandle sceneHandle, const SimulatedBodyHandleList& bodyHandles) = 0; + + //! Enable / Disable simulation of the requested body. By default all bodies added are enabled. + //! Disabling simulation the body will no longer be affected by any forces, collisions, or found with scene queries. + //! @param sceneHandle A handle to the scene to enable / disable the requested simulated body. + //! @param bodyHandle The handle of the simulated body to enable / disable. + virtual void EnableSimulationOfBody(SceneHandle sceneHandle, SimulatedBodyHandle bodyHandle) = 0; + virtual void DisableSimulationOfBody(SceneHandle sceneHandle, SimulatedBodyHandle bodyHandle) = 0; + + //! Make a blocking query into the scene. + //! @param sceneHandle A handle to the scene to make the scene query with. + //! @param request The request to make. Should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @return Returns a structure that contains a list of Hits. Depending on flags set in the request, this may only contain 1 result. + virtual SceneQueryHits QueryScene(SceneHandle sceneHandle, const SceneQueryRequest* request) = 0; + + //! Make many blocking queries into the scene. + //! @param sceneHandle A handle to the scene to make the scene query with. + //! @param requests A list of requests to make. Each entry should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @return Returns a list of SceneQueryHits. Will be in the same order as supplied in SceneQueryRequests. + virtual SceneQueryHitsList QuerySceneBatch(SceneHandle sceneHandle, const SceneQueryRequests& requests) = 0; + + //! Make a non-blocking query into the scene. + //! @param sceneHandle A handle to the scene to make the scene query with. + //! @param requestId A user defined value to identify the request when the callback is called. + //! @param request The request to make. Should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @param callback The callback to trigger when the request is complete. + //! @return Returns If the request was queued successfully. If returns false, the callback will never be called. + [[nodiscard]] virtual bool QuerySceneAsync(SceneHandle sceneHandle, SceneQuery::AsyncRequestId requestId, + const SceneQueryRequest* request, SceneQuery::AsyncCallback callback) = 0; + + //! Make a non-blocking query into the scene. + //! @param sceneHandle A handle to the scene to make the scene query with. + //! @param requestId A user defined valid to identify the request when the callback is called. + //! @param requests A list of requests to make. Each entry should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @param callback The callback to trigger when all the request are complete. + //! @return Returns If the request was queued successfully. If returns false, the callback will never be called. + [[nodiscard]] virtual bool QuerySceneAsyncBatch(SceneHandle sceneHandle, SceneQuery::AsyncRequestId requestId, + const SceneQueryRequests& requests, SceneQuery::AsyncBatchCallback callback) = 0; + + //! Registers a pair of simulated bodies for which collisions should be suppressed. + //! Making multiple requests with the same pair result are dropped. To remove the suppression call UnsuppressCollisionEvents with the pair. + //! The order of the bodies do not matter, {body0, body1} collision pair is equal to {body1, body0}. + //! @param sceneHandle A handle to the scene to register the collision pair with. + //! @param bodyHandleA A handle to a simulated body. + //! @param bodyHandleB A handle to a simulated body. + virtual void SuppressCollisionEvents(SceneHandle sceneHandle, + const SimulatedBodyHandle& bodyHandleA, + const SimulatedBodyHandle& bodyHandleB) = 0; + + //! Unregisters a pair of simulated bodies for which collisions should be suppressed. + //! Making multiple requests with the same pair result are dropped. To add a suppression call SuppressCollisionEvents with the pair. + //! The order of the bodies do not matter, {body0, body1} collision pair is equal to {body1, body0}. + //! @param sceneHandle A handle to the scene to unregister the collision pair with. + //! @param bodyHandleA A handle to a simulated body. + //! @param bodyHandleB A handle to a simulated body. + virtual void UnsuppressCollisionEvents(SceneHandle sceneHandle, + const SimulatedBodyHandle& bodyHandleA, + const SimulatedBodyHandle& bodyHandleB) = 0; + + //! Set the Gravity of the given Scene. + //! @param sceneHandle A handle to the scene to set the gravity vector of. + //! @Param The new gravity vector to be used in the Scene + virtual void SetGravity(SceneHandle sceneHandle, const AZ::Vector3& gravity) = 0; + + //! Get the Gravity of the given Scene. + //! @param sceneHandle A handle to the scene to get the gravity vector of. + //! @return A Vector3 of the gravity used in the Scene, will return a Zero Vector if sceneHandle is invalid or not found. + virtual AZ::Vector3 GetGravity(SceneHandle sceneHandle) const = 0; + + //! Register a handler to receive an event when the SceneConfiguration changes. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSceneConfigurationChangedEventHandler(SceneHandle sceneHandle, SceneEvents::OnSceneConfigurationChanged::Handler& handler) = 0; + + //! Register a handler to receive an event when a Simulated body is added to the Scene. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSimulationBodyAddedHandler(SceneHandle sceneHandle, SceneEvents::OnSimulationBodyAdded::Handler& handler) = 0; + + //! Register a handler to receive an event when a Simulated body is removed from the Scene. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSimulationBodyRemovedHandler(SceneHandle sceneHandle, SceneEvents::OnSimulationBodyRemoved::Handler& handler) = 0; + + //! Register a handler to receive an event when a Simulated body has its simulation enabled in the Scene. + //! @param sceneHandle A handle to the scene to register the event with. + //! This will only trigger if the simulated body was disabled, when first added to a scene SceneEvents::OnAnySimulationBodyCreated will trigger instead. + //! @param handler The handler to receive the event. + virtual void RegisterSimulationBodySimulationEnabledHandler(SceneHandle sceneHandle, SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler) = 0; + + //! Register a handler to receive an event when a Simulated body has its simulation disabled in the Scene. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSimulationBodySimulationDisabledHandler(SceneHandle sceneHandle, SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler) = 0; + + //! Register a handler to receive an event when Scene::StartSimulation is called. + //! @note This may fire multiple times per frame. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSceneSimulationStartHandler(SceneHandle sceneHandle, SceneEvents::OnSceneSimulationStartHandler& handler) = 0; + + //! Register a handler to receive an event when Scene::FinishSimulation is called. + //! @note This may fire multiple times per frame. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSceneSimulationFinishHandler(SceneHandle sceneHandle, SceneEvents::OnSceneSimulationFinishHandler& handler) = 0; + + //! Register a handler to receive an event with a list of SimulatedBodyHandles that updated this scene tick. + //! @note This will fire after the OnSceneSimulationStartEvent and before the OnSceneSimulationFinishEvent when SceneConfiguration::m_enableActiveActors is true. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSceneActiveSimulatedBodiesHandler(SceneHandle sceneHandle, SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler) = 0; + + //! Register a handler to receive all collision events in the scene. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSceneCollisionEventHandler(SceneHandle sceneHandle, SceneEvents::OnSceneCollisionsEvent::Handler& handler) = 0; + + //! Register a handler to receive all trigger events in the scene. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSceneTriggersEventHandler(SceneHandle sceneHandle, SceneEvents::OnSceneTriggersEvent::Handler& handler) = 0; + + //! Register a handler to receive a notification when the Scene's gravity has changed. + //! @param sceneHandle A handle to the scene to register the event with. + //! @param handler The handler to receive the event. + virtual void RegisterSceneGravityChangedEvent(SceneHandle sceneHandle, SceneEvents::OnSceneGravityChangedEvent::Handler& handler) = 0; + }; + + //! Interface of a Physics Scene class Scene { public: + AZ_CLASS_ALLOCATOR_DECL; AZ_RTTI(Scene, "{52BD8163-BDC4-4B09-ABB2-11DD1F601FFD}"); + static void Reflect(AZ::ReflectContext* context); - Scene() = default; + explicit Scene(const SceneConfiguration& config); virtual ~Scene() = default; + //! Get the Id of the Scene. + //! @return The Crc32 of the scene. + const AZ::Crc32& GetId() const; + //! Start the simulation process. //! As an example, this is a good place to trigger and queue any long running work in separate threads. //! @param deltatime The time in seconds to run the simulation for. @@ -39,7 +250,7 @@ namespace AzPhysics //! Enable or Disable this Scene's Simulation tick. //! Default is Enabled. //! @param enable When true the Scene will execute its simulation tick when StartSimulation is called. When false, StartSimulation will not execute. - virtual void Enable(bool enable) = 0; + virtual void SetEnabled(bool enable) = 0; //! Check if this Scene is currently Enabled. //! @return When true the Scene is enabled and will execute its simulation tick when StartSimulation is called. When false, StartSimulation will not execute. @@ -53,8 +264,217 @@ namespace AzPhysics //! @param config The new configuration to apply. virtual void UpdateConfiguration(const SceneConfiguration& config) = 0; - // Temporary until LYN-438 work is complete - virtual AZStd::shared_ptr GetLegacyWorld() const = 0; + //! Add a simulated body to the Scene. + //! @param simulatedBodyConfig The config of the simulated body. + //! @return Returns a handle to the created Simulated body. Will return AzPhyiscs::InvalidSimulatedBodyHandle if it fails. + virtual SimulatedBodyHandle AddSimulatedBody(const SimulatedBodyConfiguration* simulatedBodyConfig) = 0; + + //! Add a set of simulated bodied to the Scene. + //! @param simulatedBodyConfigs The list of simulated body configs. + //! @return Returns a list of handles to the created Simulated bodies. Will be in the same order as supplied in simulatedBodyConfigs. + //! If one fails, that index will be set to AzPhyiscs::InvalidSimulatedBodyHandle. + virtual SimulatedBodyHandleList AddSimulatedBodies(const SimulatedBodyConfigurationList& simulatedBodyConfigs) = 0; + + //! Get the Raw pointer to the requested simulated body. + //! @param bodyHandle A handle to the simulated body to retrieve the raw pointer for. + //! @return A raw pointer to the Simulated body. If the handle is invalid this will return null. + virtual SimulatedBody* GetSimulatedBodyFromHandle(SimulatedBodyHandle bodyHandle) = 0; + + //! Get the Raw pointer to the set of requested simulated bodies. + //! @param bodyHandles A list of simulated body handles to retrieve the raw pointers for. + //! @return A list of raw pointers to the Simulated bodies requested. If a simulated body handle is invalid, that index in the list will be null. + virtual SimulatedBodyList GetSimulatedBodiesFromHandle(const SimulatedBodyHandleList& bodyHandles) = 0; + + //! Remove a simulated body from the Scene. + //! @param bodyHandle A handle to the simulated body being removed. + virtual void RemoveSimulatedBody(SimulatedBodyHandle bodyHandle) = 0; + + //! Remove a list of simulated bodies from the Scene. + //! @param bodyHandles A list of simulated body handles to be removed. + virtual void RemoveSimulatedBodies(const SimulatedBodyHandleList& bodyHandles) = 0; + + //! Enable / Disable simulation of the requested body. By default all bodies added are enabled. + //! Disabling simulation the body will no longer be affected by any forces, collisions, or found with scene queries. + //! @param bodyHandle The handle of the simulated body to enable / disable. + virtual void EnableSimulationOfBody(SimulatedBodyHandle bodyHandle) = 0; + virtual void DisableSimulationOfBody(SimulatedBodyHandle bodyHandle) = 0; + + //! Make a blocking query into the scene. + //! @param request The request to make. Should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @return Returns a structure that contains a list of Hits. Depending on flags set in the request, this may only contain 1 result. + virtual SceneQueryHits QueryScene(const SceneQueryRequest* request) = 0; + + //! Make many blocking queries into the scene. + //! @param requests A list of requests to make. Each entry should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @return Returns a list of SceneQueryHits. Will be in the same order as supplied in SceneQueryRequests. + virtual SceneQueryHitsList QuerySceneBatch(const SceneQueryRequests& requests) = 0; + + //! Make a non-blocking query into the scene. + //! @param requestId A user defined valid to identify the request when the callback is called. + //! @param request The request to make. Should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @param callback The callback to trigger when the request is complete. + //! @return Returns if the request was queued successfully. If returns false, the callback will never be called. + [[nodiscard]] virtual bool QuerySceneAsync(SceneQuery::AsyncRequestId requestId, + const SceneQueryRequest* request, SceneQuery::AsyncCallback callback) = 0; + + //! Make a non-blocking query into the scene. + //! @param requestId A user defined valid to identify the request when the callback is called. + //! @param requests A list of requests to make. Each entry should be one of RayCastRequest || ShapeCastRequest || OverlapRequest + //! @param callback The callback to trigger when all the request are complete. + //! @return Returns If the request was queued successfully. If returns false, the callback will never be called. + [[nodiscard]] virtual bool QuerySceneAsyncBatch(SceneQuery::AsyncRequestId requestId, + const SceneQueryRequests& requests, SceneQuery::AsyncBatchCallback callback) = 0; + + //! Registers a pair of simulated bodies for which collisions should be suppressed. + //! Making multiple requests with the same pair result are dropped. To remove the suppression call UnsuppressCollisionEvents with the pair. + //! The order of the bodies do not matter, {body0, body1} collision pair is equal to {body1, body0}. + //! @param bodyHandleA A handle to a simulated body. + //! @param bodyHandleB A handle to a simulated body. + virtual void SuppressCollisionEvents( + const SimulatedBodyHandle& bodyHandleA, + const SimulatedBodyHandle& bodyHandleB) = 0; + + //! Unregisters a pair of simulated bodies for which collisions should be suppressed. + //! Making multiple requests with the same pair result are dropped. To add a suppression call SuppressCollisionEvents with the pair. + //! The order of the bodies do not matter, {body0, body1} collision pair is equal to {body1, body0}. + //! @param bodyHandleA A handle to a simulated body. + //! @param bodyHandleB A handle to a simulated body. + virtual void UnsuppressCollisionEvents( + const SimulatedBodyHandle& bodyHandleA, + const SimulatedBodyHandle& bodyHandleB) = 0; + + //! Set the Gravity of the Scene. + //! @Param The new gravity vector to be used in the Scene + virtual void SetGravity(const AZ::Vector3& gravity) = 0; + + //! Get the Gravity of the Scene. + //! @return A Vector3 of the gravity used in the Scene. + virtual AZ::Vector3 GetGravity() const = 0; + + //! Get the native pointer for a scene. Should be used with caution as it allows direct access to the lower level physics simulation. + //! @return A pointer to the underlying implementation of a scene if there is one. + virtual void* GetNativePointer() const = 0; + + //! Register a handler to receive an event when the SceneConfiguration changes. + //! @param handler The handler to receive the event. + void RegisterSceneConfigurationChangedEventHandler(SceneEvents::OnSceneConfigurationChanged::Handler& handler); + + //! Register a handler to receive an event when a Simulated body is added to the Scene. + //! @param handler The handler to receive the event. + void RegisterSimulationBodyAddedHandler(SceneEvents::OnSimulationBodyAdded::Handler& handler); + + //! Register a handler to receive an event when a Simulated body is removed from the Scene. + //! @param handler The handler to receive the event. + void RegisterSimulationBodyRemovedHandler(SceneEvents::OnSimulationBodyRemoved::Handler& handler); + + //! Register a handler to receive an event when a Simulated body has its simulation enabled in the Scene. + //! This will only trigger if the simulated body was disabled, when first added to a scene SceneEvents::OnAnySimulationBodyCreated will trigger instead. + //! @param handler The handler to receive the event. + void RegisterSimulationBodySimulationEnabledHandler(SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler); + + //! Register a handler to receive an event when a Simulated body has its simulation disabled in the Scene. + //! @param handler The handler to receive the event. + void RegisterSimulationBodySimulationDisabledHandler(SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler); + + //! Register a handler to receive an event when Scene::StartSimulation is called. + //! @note This may fire multiple times per frame. + //! @param handler The handler to receive the event. + void RegisterSceneSimulationStartHandler(SceneEvents::OnSceneSimulationStartHandler& handler); + + //! Register a handler to receive an event when Scene::FinishSimulation is called. + //! @note This may fire multiple times per frame. + //! @param handler The handler to receive the event. + void RegisterSceneSimulationFinishHandler(SceneEvents::OnSceneSimulationFinishHandler& handler); + + //! Register a handler to receive an event with a list of SimulatedBodyHandles that updated this scene tick. + //! @note This will fire after the OnSceneSimulationStartEvent and before the OnSceneSimulationFinishEvent when SceneConfiguration::m_enableActiveActors is true. + //! @param handler The handler to receive the event. + void RegisterSceneActiveSimulatedBodiesHandler(SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler); + + //! Register a handler to receive all collision events in the scene. + //! @param handler The handler to receive the event. + void RegisterSceneCollisionEventHandler(SceneEvents::OnSceneCollisionsEvent::Handler& handler); + + //! Register a handler to receive all trigger events in the scene. + //! @param handler The handler to receive the event. + void RegisterSceneTriggersEventHandler(SceneEvents::OnSceneTriggersEvent::Handler& handler); + + //! Register a handler to receive a notification when the Scene's gravity has changed. + //! @param handler The handler to receive the event. + void RegisterSceneGravityChangedEvent(SceneEvents::OnSceneGravityChangedEvent::Handler& handler); + + protected: + SceneEvents::OnSceneConfigurationChanged m_configChangeEvent; + SceneEvents::OnSimulationBodyAdded m_simulatedBodyAddedEvent; + SceneEvents::OnSimulationBodyRemoved m_simulatedBodyRemovedEvent; + SceneEvents::OnSimulationBodySimulationEnabled m_simulatedBodySimulationEnabledEvent; + SceneEvents::OnSimulationBodySimulationDisabled m_simulatedBodySimulationDisabledEvent; + SceneEvents::OnSceneSimulationStartEvent m_sceneSimuationStartEvent; + SceneEvents::OnSceneSimulationFinishEvent m_sceneSimuationFinishEvent; + SceneEvents::OnSceneActiveSimulatedBodiesEvent m_sceneActiveSimulatedBodies; + SceneEvents::OnSceneCollisionsEvent m_sceneCollisionEvent; + SceneEvents::OnSceneTriggersEvent m_sceneTriggerEvent; + SceneEvents::OnSceneGravityChangedEvent m_sceneGravityChangedEvent; + private: + // helper for behaviour context + SceneEvents::OnSceneGravityChangedEvent* GetOnGravityChangedEvent(); + + AZ::Crc32 m_id; }; - using SceneList = AZStd::vector; + using SceneList = AZStd::vector>; + + inline void Scene::RegisterSceneConfigurationChangedEventHandler(SceneEvents::OnSceneConfigurationChanged::Handler& handler) + { + handler.Connect(m_configChangeEvent); + } + + inline void Scene::RegisterSimulationBodyAddedHandler(SceneEvents::OnSimulationBodyAdded::Handler& handler) + { + handler.Connect(m_simulatedBodyAddedEvent); + } + + inline void Scene::RegisterSimulationBodyRemovedHandler(SceneEvents::OnSimulationBodyRemoved::Handler& handler) + { + handler.Connect(m_simulatedBodyRemovedEvent); + } + + inline void Scene::RegisterSimulationBodySimulationEnabledHandler(SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler) + { + handler.Connect(m_simulatedBodySimulationEnabledEvent); + } + + inline void Scene::RegisterSimulationBodySimulationDisabledHandler(SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler) + { + handler.Connect(m_simulatedBodySimulationDisabledEvent); + } + + inline void Scene::RegisterSceneSimulationStartHandler(SceneEvents::OnSceneSimulationStartHandler& handler) + { + handler.Connect(m_sceneSimuationStartEvent); + } + + inline void Scene::RegisterSceneSimulationFinishHandler(SceneEvents::OnSceneSimulationFinishHandler& handler) + { + handler.Connect(m_sceneSimuationFinishEvent); + } + + inline void Scene::RegisterSceneActiveSimulatedBodiesHandler(SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler) + { + handler.Connect(m_sceneActiveSimulatedBodies); + } + + inline void Scene::RegisterSceneCollisionEventHandler(SceneEvents::OnSceneCollisionsEvent::Handler& handler) + { + handler.Connect(m_sceneCollisionEvent); + } + + inline void Scene::RegisterSceneTriggersEventHandler(SceneEvents::OnSceneTriggersEvent::Handler& handler) + { + handler.Connect(m_sceneTriggerEvent); + } + + inline void Scene::RegisterSceneGravityChangedEvent(SceneEvents::OnSceneGravityChangedEvent::Handler& handler) + { + handler.Connect(m_sceneGravityChangedEvent); + } } // namespace AzPhysics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.cpp b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.cpp new file mode 100644 index 0000000000..289b5a940b --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.cpp @@ -0,0 +1,60 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or +* a third party where indicated. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +namespace AzPhysics +{ + void SystemInterface::Reflect(AZ::ReflectContext* context) + { + if (auto* behaviorContext = azrtti_cast(context)) + { + const auto getOnPresimulateEvent = []()->SystemEvents::OnPresimulateEvent* + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + return &physicsSystem->m_preSimulateEvent; + } + return nullptr; + }; + const AZ::BehaviorAzEventDescription presimulateEventDescription = + { + "Presimulate event", + {"Tick time"} // Parameters + }; + + const auto getOnPostsimulateEvent = []() -> SystemEvents::OnPostsimulateEvent* + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + return &physicsSystem->m_postSimulateEvent; + } + return nullptr; + }; + const AZ::BehaviorAzEventDescription postsimulateEventDescription = + { + "Postsimulate event", + {} // Parameters + }; + + behaviorContext->Class("System Interface") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "PhysX") + ->Method("GetOnPresimulateEvent", getOnPresimulateEvent) + ->Attribute(AZ::Script::Attributes::AzEventDescription, presimulateEventDescription) + ->Method("GetOnPostsimulateEvent", getOnPostsimulateEvent) + ->Attribute(AZ::Script::Attributes::AzEventDescription, postsimulateEventDescription) + ; + } + } +} // namespace AzPhysics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.h b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.h index f4c27d5284..e3ed449046 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.h @@ -35,6 +35,8 @@ namespace AzPhysics virtual ~SystemInterface() = default; AZ_DISABLE_COPY_MOVE(SystemInterface); + static void Reflect(AZ::ReflectContext* context); + //! Initialize the Physics system with the given configuration. //! @param config Contains the configuration options virtual void Initialize(const SystemConfiguration* config) = 0; @@ -83,6 +85,11 @@ namespace AzPhysics //! @return Returns a list of SceneHandle objects for each created Scene. Order will be the same as the SceneConfigurationList provided. virtual SceneHandleList AddScenes(const SceneConfigurationList& configs) = 0; + //! Returns a Scene Handle connected to the given scene name. + //! @param sceneName The name of the scene to look up. + //! @returns Will return a SceneHandle to a Scene connected with the given name, otherwise will return InvalidSceneHandle. + virtual SceneHandle GetSceneHandle(const AZStd::string& sceneName) = 0; + //! Get the Scene of the requested SceneHandle. //! @param handle The SceneHandle of the requested scene. //! @return Returns a SceneInterface pointer if found, otherwise nullptr. @@ -108,6 +115,12 @@ namespace AzPhysics //! Removes All Scenes. virtual void RemoveAllScenes() = 0; + //! Helper to find the SceneHandle and SimulatedBodyHandle of a body related to the requested EntityId. + //! @note This will search all scenes and maybe slow if there are many Scenes. + //! @param entityId The entity to search for. + //! @return Will return a AZStd::pair of SceneHandle and SimulatedBodyHandle of the requested entityid, otherwise will return AzPhysics::InvalidSceneHandle, AzPhysics::SimulatedBodyHandle. + virtual AZStd::pair FindAttachedBodyHandleFromEntityId(AZ::EntityId entityId) = 0; + //! Get the current SystemConfiguration used to initialize the Physics system. virtual const SystemConfiguration* GetConfiguration() const = 0; @@ -147,6 +160,12 @@ namespace AzPhysics //! Register to receive notifications when the Physics System simulation ends. //! @param handler The handler to receive the event. void RegisterPostSimulateEvent(SystemEvents::OnPostsimulateEvent::Handler& handler) { handler.Connect(m_postSimulateEvent); } + //! Register to receive notifications when the a new Scene is added to the simulation. + //! @param handler The handler to receive the event. + void RegisterSceneAddedEvent(SystemEvents::OnSceneAddedEvent::Handler& handler) { handler.Connect(m_sceneAddedEvent); } + //! Register to receive notifications when the a Scene is removed from the simulation. + //! @param handler The handler to receive the event. + void RegisterSceneRemovedEvent(SystemEvents::OnSceneAddedEvent::Handler& handler) { handler.Connect(m_sceneRemovedEvent); } //! Register to receive notifications when the SystemConfiguration changes. //! @param handler The handler to receive the event. void RegisterSystemConfigurationChangedEvent(SystemEvents::OnConfigurationChangedEvent::Handler& handler) { handler.Connect(m_configChangeEvent); } @@ -163,6 +182,8 @@ namespace AzPhysics SystemEvents::OnShutdownEvent m_shutdownEvent; SystemEvents::OnPresimulateEvent m_preSimulateEvent; SystemEvents::OnPostsimulateEvent m_postSimulateEvent; + SystemEvents::OnSceneAddedEvent m_sceneAddedEvent; + SystemEvents::OnSceneRemovedEvent m_sceneRemovedEvent; SystemEvents::OnConfigurationChangedEvent m_configChangeEvent; SystemEvents::OnDefaultMaterialLibraryChangedEvent m_onDefaultMaterialLibraryChangedEvent; SystemEvents::OnDefaultSceneConfigurationChangedEvent m_onDefaultSceneConfigurationChangedEvent; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp index cbf2416b3e..02cd96ac00 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp @@ -21,13 +21,13 @@ namespace Physics RagdollNodeConfiguration::RagdollNodeConfiguration() { m_propertyVisibilityFlags = - PropertyVisibility::InertiaProperties | - PropertyVisibility::Damping | - PropertyVisibility::SleepOptions | - PropertyVisibility::Interpolation | - PropertyVisibility::Gravity | - PropertyVisibility::ContinuousCollisionDetection | - PropertyVisibility::MaxVelocities; + RigidBodyConfiguration::PropertyVisibility::InertiaProperties | + RigidBodyConfiguration::PropertyVisibility::Damping | + RigidBodyConfiguration::PropertyVisibility::SleepOptions | + RigidBodyConfiguration::PropertyVisibility::Interpolation | + RigidBodyConfiguration::PropertyVisibility::Gravity | + RigidBodyConfiguration::PropertyVisibility::ContinuousCollisionDetection | + RigidBodyConfiguration::PropertyVisibility::MaxVelocities; } void RagdollNodeConfiguration::Reflect(AZ::ReflectContext* context) @@ -57,7 +57,7 @@ namespace Physics AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(2, &ClassConverters::RagdollConfigConverter) ->Field("nodes", &RagdollConfiguration::m_nodes) ->Field("colliders", &RagdollConfiguration::m_colliders) @@ -103,4 +103,4 @@ namespace Physics m_nodes.erase(m_nodes.begin() + configIndex.GetValue()); } } -} // namespace Physics \ No newline at end of file +} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h index a042ce3417..3f98ca9303 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h @@ -15,19 +15,21 @@ #include #include #include -#include -#include +#include #include #include +#include +#include +#include namespace Physics { class RagdollNodeConfiguration - : public RigidBodyConfiguration + : public AzPhysics::RigidBodyConfiguration { public: AZ_CLASS_ALLOCATOR(RagdollNodeConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(RagdollNodeConfiguration, "{A1796586-85AB-496E-93C9-C5841F03B1AD}", RigidBodyConfiguration); + AZ_RTTI(RagdollNodeConfiguration, "{A1796586-85AB-496E-93C9-C5841F03B1AD}", AzPhysics::RigidBodyConfiguration); static void Reflect(AZ::ReflectContext* context); RagdollNodeConfiguration(); @@ -37,11 +39,11 @@ namespace Physics }; class RagdollConfiguration - : public WorldBodyConfiguration + : public AzPhysics::SimulatedBodyConfiguration { public: AZ_CLASS_ALLOCATOR(RagdollConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(RagdollConfiguration, "{7C96D332-61D8-4C58-A2BF-707716D38D14}", WorldBodyConfiguration); + AZ_RTTI(RagdollConfiguration, "{7C96D332-61D8-4C58-A2BF-707716D38D14}", AzPhysics::SimulatedBodyConfiguration); static void Reflect(AZ::ReflectContext* context); RagdollConfiguration() = default; @@ -58,25 +60,26 @@ namespace Physics /// Represents a single rigid part of a ragdoll. class RagdollNode - : public WorldBody + : public AzPhysics::SimulatedBody { public: AZ_CLASS_ALLOCATOR(RagdollNode, AZ::SystemAllocator, 0); - AZ_RTTI(RagdollNode, "{226D02B7-6138-4F6B-9870-DE5A1C3C5077}", WorldBody); + AZ_RTTI(RagdollNode, "{226D02B7-6138-4F6B-9870-DE5A1C3C5077}", AzPhysics::SimulatedBody); - virtual RigidBody& GetRigidBody() = 0; + virtual AzPhysics::RigidBody& GetRigidBody() = 0; virtual ~RagdollNode() = default; virtual const AZStd::shared_ptr& GetJoint() const = 0; + virtual bool IsSimulating() const = 0; }; /// A hierarchical collection of rigid bodies connected by joints typically used to physically simulate a character. class Ragdoll - : public WorldBody + : public AzPhysics::SimulatedBody { public: AZ_CLASS_ALLOCATOR(Ragdoll, AZ::SystemAllocator, 0); - AZ_RTTI(Ragdoll, "{01F09602-80EC-4693-A0E7-C2719239044B}", WorldBody); + AZ_RTTI(Ragdoll, "{01F09602-80EC-4693-A0E7-C2719239044B}", AzPhysics::SimulatedBody); virtual ~Ragdoll() = default; /// Inserts the ragdoll into the physics simulation. @@ -131,8 +134,5 @@ namespace Physics /// Returns the number of ragdoll nodes in the ragdoll. virtual size_t GetNumNodes() const = 0; - - /// Returns the id of the world the ragdoll exists in. - virtual AZ::Crc32 GetWorldId() const = 0; }; } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/RigidBody.cpp b/Code/Framework/AzFramework/AzFramework/Physics/RigidBody.cpp deleted file mode 100644 index 4044f699c6..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/RigidBody.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include - -#include -#include - -namespace Physics -{ - float DefaultRigidBodyConfiguration::m_mass = 1.f; - bool DefaultRigidBodyConfiguration::m_computeInertiaTensor = false; - float DefaultRigidBodyConfiguration::m_linearDamping = 0.05f; - float DefaultRigidBodyConfiguration::m_angularDamping = 0.15f; - float DefaultRigidBodyConfiguration::m_sleepMinEnergy = 0.5f; - float DefaultRigidBodyConfiguration::m_maxAngularVelocity = 100.0f; - - void RigidBodyConfiguration::Reflect(AZ::ReflectContext* context) - { - if (auto serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Version(3, &ClassConverters::RigidBodyVersionConverter) - ->Field("Initial linear velocity", &Physics::RigidBodyConfiguration::m_initialLinearVelocity) - ->Field("Initial angular velocity", &Physics::RigidBodyConfiguration::m_initialAngularVelocity) - ->Field("Linear damping", &Physics::RigidBodyConfiguration::m_linearDamping) - ->Field("Angular damping", &Physics::RigidBodyConfiguration::m_angularDamping) - ->Field("Sleep threshold", &Physics::RigidBodyConfiguration::m_sleepMinEnergy) - ->Field("Start Asleep", &Physics::RigidBodyConfiguration::m_startAsleep) - ->Field("Interpolate Motion", &Physics::RigidBodyConfiguration::m_interpolateMotion) - ->Field("Gravity Enabled", &Physics::RigidBodyConfiguration::m_gravityEnabled) - ->Field("Simulated", &Physics::RigidBodyConfiguration::m_simulated) - ->Field("Kinematic", &Physics::RigidBodyConfiguration::m_kinematic) - ->Field("CCD Enabled", &Physics::RigidBodyConfiguration::m_ccdEnabled) - ->Field("Compute Mass", &Physics::RigidBodyConfiguration::m_computeMass) - ->Field("Mass", &Physics::RigidBodyConfiguration::m_mass) - ->Field("Compute COM", &Physics::RigidBodyConfiguration::m_computeCenterOfMass) - ->Field("Centre of mass offset", &RigidBodyConfiguration::m_centerOfMassOffset) - ->Field("Compute inertia", &RigidBodyConfiguration::m_computeInertiaTensor) - ->Field("Inertia tensor", &RigidBodyConfiguration::m_inertiaTensor) - ->Field("Property Visibility Flags", &RigidBodyConfiguration::m_propertyVisibilityFlags) - ->Field("Maximum Angular Velocity", &RigidBodyConfiguration::m_maxAngularVelocity) - ->Field("Include All Shapes In Mass", &RigidBodyConfiguration::m_includeAllShapesInMassCalculation) - ->Field("CCD Min Advance", &RigidBodyConfiguration::m_ccdMinAdvanceCoefficient) - ->Field("CCD Friction", &RigidBodyConfiguration::m_ccdFrictionEnabled) - ; - } - } - - AZ::Crc32 RigidBodyConfiguration::GetPropertyVisibility(PropertyVisibility property) const - { - return (m_propertyVisibilityFlags & property) != 0 ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; - } - - void RigidBodyConfiguration::SetPropertyVisibility(PropertyVisibility property, bool isVisible) - { - if (isVisible) - { - m_propertyVisibilityFlags |= property; - } - else - { - m_propertyVisibilityFlags &= ~property; - } - } - - AZ::Crc32 RigidBodyConfiguration::GetInitialVelocitiesVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::InitialVelocities); - } - - AZ::Crc32 RigidBodyConfiguration::GetInertiaSettingsVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::InertiaProperties); - } - - AZ::Crc32 RigidBodyConfiguration::GetInertiaVisibility() const - { - bool visible = ((m_propertyVisibilityFlags & PropertyVisibility::InertiaProperties) != 0) && !m_computeInertiaTensor; - return visible ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; - } - - AZ::Crc32 RigidBodyConfiguration::GetCoMVisibility() const - { - bool visible = ((m_propertyVisibilityFlags & PropertyVisibility::InertiaProperties) != 0) && !m_computeCenterOfMass; - return visible ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; - } - - AZ::Crc32 RigidBodyConfiguration::GetMassVisibility() const - { - bool visible = ((m_propertyVisibilityFlags & PropertyVisibility::InertiaProperties) != 0) && !m_computeMass; - return visible ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; - } - - AZ::Crc32 RigidBodyConfiguration::GetDampingVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::Damping); - } - - AZ::Crc32 RigidBodyConfiguration::GetSleepOptionsVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::SleepOptions); - } - - AZ::Crc32 RigidBodyConfiguration::GetInterpolationVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::Interpolation); - } - - AZ::Crc32 RigidBodyConfiguration::GetGravityVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::Gravity); - } - - AZ::Crc32 RigidBodyConfiguration::GetKinematicVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::Kinematic); - } - - AZ::Crc32 RigidBodyConfiguration::GetCCDVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::ContinuousCollisionDetection); - } - - AZ::Crc32 RigidBodyConfiguration::GetMaxVelocitiesVisibility() const - { - return GetPropertyVisibility(PropertyVisibility::MaxVelocities); - } - - Physics::MassComputeFlags RigidBodyConfiguration::GetMassComputeFlags() const - { - using Physics::MassComputeFlags; - - MassComputeFlags flags = MassComputeFlags::NONE; - - if (m_computeCenterOfMass) - { - flags = flags | MassComputeFlags::COMPUTE_COM; - } - - if (m_computeInertiaTensor) - { - flags = flags | MassComputeFlags::COMPUTE_INERTIA; - } - - if (m_computeMass) - { - flags = flags | MassComputeFlags::COMPUTE_MASS; - } - - if (m_includeAllShapesInMassCalculation) - { - flags = flags | MassComputeFlags::INCLUDE_ALL_SHAPES; - } - - return flags; - } - - void RigidBodyConfiguration::SetMassComputeFlags(MassComputeFlags flags) - { - using Physics::MassComputeFlags; - m_computeCenterOfMass = MassComputeFlags::COMPUTE_COM == (flags & MassComputeFlags::COMPUTE_COM); - m_computeInertiaTensor = MassComputeFlags::COMPUTE_INERTIA == (flags & MassComputeFlags::COMPUTE_INERTIA); - m_computeMass = MassComputeFlags::COMPUTE_MASS == (flags & MassComputeFlags::COMPUTE_MASS); - m_includeAllShapesInMassCalculation = - MassComputeFlags::INCLUDE_ALL_SHAPES == (flags & MassComputeFlags::INCLUDE_ALL_SHAPES); - } - - bool RigidBodyConfiguration::IsCCDEnabled() const - { - return m_ccdEnabled; - } - - RigidBody::RigidBody(const RigidBodyConfiguration& settings) - : WorldBody(settings) - { - } -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/RigidBody.h b/Code/Framework/AzFramework/AzFramework/Physics/RigidBody.h deleted file mode 100644 index 6ab15299d8..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/RigidBody.h +++ /dev/null @@ -1,239 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include -#include - -#include -#include - -namespace -{ - class ReflectContext; -} - -namespace Physics -{ - class ShapeConfiguration; - class World; - class Shape; - - /// Default values used for initializing RigidBodySettings. - /// These can be modified by Physics Implementation gems. - // LUMBERYARD_DEPRECATED(LY-114472) - DefaultRigidBodyConfiguration values are not shared across modules. - // Use RigidBodyConfiguration default values. - struct DefaultRigidBodyConfiguration - { - static float m_mass; - static bool m_computeInertiaTensor; - static float m_linearDamping; - static float m_angularDamping; - static float m_sleepMinEnergy; - static float m_maxAngularVelocity; - }; - - enum class MassComputeFlags : AZ::u8 - { - NONE = 0, - - //! Flags indicating whether a certain mass property should be auto-computed or not. - COMPUTE_MASS = 1, - COMPUTE_INERTIA = 1 << 1, - COMPUTE_COM = 1 << 2, - - //! If set, non-simulated shapes will also be included in the mass properties calculation. - INCLUDE_ALL_SHAPES = 1 << 3, - - DEFAULT = COMPUTE_COM | COMPUTE_INERTIA | COMPUTE_MASS - }; - - class RigidBodyConfiguration - : public WorldBodyConfiguration - { - public: - AZ_CLASS_ALLOCATOR(RigidBodyConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(RigidBodyConfiguration, "{ACFA8900-8530-4744-AF00-AA533C868A8E}", WorldBodyConfiguration); - static void Reflect(AZ::ReflectContext* context); - - enum PropertyVisibility : AZ::u16 - { - InitialVelocities = 1 << 0, ///< Whether the initial linear and angular velocities are visible. - InertiaProperties = 1 << 1, ///< Whether the whole category of inertia properties (mass, compute inertia, - ///< inertia tensor etc) is visible. - Damping = 1 << 2, ///< Whether linear and angular damping are visible. - SleepOptions = 1 << 3, ///< Whether the sleep threshold and start asleep options are visible. - Interpolation = 1 << 4, ///< Whether the interpolation option is visible. - Gravity = 1 << 5, ///< Whether the effected by gravity option is visible. - Kinematic = 1 << 6, ///< Whether the option to make the body kinematic is visible. - ContinuousCollisionDetection = 1 << 7, ///< Whether the option to enable continuous collision detection is visible. - MaxVelocities = 1 << 8 ///< Whether upper limits on velocities are visible. - }; - - RigidBodyConfiguration() = default; - RigidBodyConfiguration(const RigidBodyConfiguration& settings) = default; - - // Visibility functions. - AZ::Crc32 GetPropertyVisibility(PropertyVisibility property) const; - void SetPropertyVisibility(PropertyVisibility property, bool isVisible); - - AZ::Crc32 GetInitialVelocitiesVisibility() const; - /// Returns whether the whole category of inertia settings (mass, inertia, center of mass offset etc) is visible. - AZ::Crc32 GetInertiaSettingsVisibility() const; - /// Returns whether the individual inertia tensor field is visible or is hidden because the compute inertia option is selected. - AZ::Crc32 GetInertiaVisibility() const; - /// Returns whether the mass field is visible or is hidden because compute mass option is selected. - AZ::Crc32 GetMassVisibility() const; - /// Returns whether the individual centre of mass offset field is visible or is hidden because compute CoM option is selected. - AZ::Crc32 GetCoMVisibility() const; - AZ::Crc32 GetDampingVisibility() const; - AZ::Crc32 GetSleepOptionsVisibility() const; - AZ::Crc32 GetInterpolationVisibility() const; - AZ::Crc32 GetGravityVisibility() const; - AZ::Crc32 GetKinematicVisibility() const; - AZ::Crc32 GetCCDVisibility() const; - AZ::Crc32 GetMaxVelocitiesVisibility() const; - MassComputeFlags GetMassComputeFlags() const; - void SetMassComputeFlags(MassComputeFlags flags); - - bool IsCCDEnabled() const; - - // Basic initial settings. - AZ::Vector3 m_initialLinearVelocity = AZ::Vector3::CreateZero(); - AZ::Vector3 m_initialAngularVelocity = AZ::Vector3::CreateZero(); - AZ::Vector3 m_centerOfMassOffset = AZ::Vector3::CreateZero(); - - // Simulation parameters. - float m_mass = DefaultRigidBodyConfiguration::m_mass; - AZ::Matrix3x3 m_inertiaTensor = AZ::Matrix3x3::CreateIdentity(); - float m_linearDamping = DefaultRigidBodyConfiguration::m_linearDamping; - float m_angularDamping = DefaultRigidBodyConfiguration::m_angularDamping; - float m_sleepMinEnergy = DefaultRigidBodyConfiguration::m_sleepMinEnergy; - float m_maxAngularVelocity = DefaultRigidBodyConfiguration::m_maxAngularVelocity; - - // Visibility settings. - AZ::u16 m_propertyVisibilityFlags = (std::numeric_limits::max)(); - - bool m_startAsleep = false; - bool m_interpolateMotion = false; - bool m_gravityEnabled = true; - bool m_simulated = true; - bool m_kinematic = false; - bool m_ccdEnabled = false; ///< Whether continuous collision detection is enabled. - float m_ccdMinAdvanceCoefficient = 0.15f; ///< Coefficient affecting how granularly time is subdivided in CCD. - bool m_ccdFrictionEnabled = false; ///< Whether friction is applied when resolving CCD collisions. - - bool m_computeCenterOfMass = true; - bool m_computeInertiaTensor = true; - bool m_computeMass = true; - - //! If set, non-simulated shapes will also be included in the mass properties calculation. - bool m_includeAllShapesInMassCalculation = false; - }; - - /// Dynamic rigid body. - class RigidBody - : public WorldBody - { - public: - - AZ_CLASS_ALLOCATOR(RigidBody, AZ::SystemAllocator, 0); - AZ_RTTI(RigidBody, "{156E459F-7BB7-4B4E-ADA0-2130D96B7E80}", WorldBody); - - public: - RigidBody() = default; - explicit RigidBody(const RigidBodyConfiguration& settings); - - - virtual void AddShape(AZStd::shared_ptr shape) = 0; - virtual void RemoveShape(AZStd::shared_ptr shape) = 0; - virtual AZ::u32 GetShapeCount() { return 0; } - virtual AZStd::shared_ptr GetShape(AZ::u32 /*index*/) { return nullptr; } - - virtual AZ::Vector3 GetCenterOfMassWorld() const = 0; - virtual AZ::Vector3 GetCenterOfMassLocal() const = 0; - - virtual AZ::Matrix3x3 GetInverseInertiaWorld() const = 0; - virtual AZ::Matrix3x3 GetInverseInertiaLocal() const = 0; - - virtual float GetMass() const = 0; - virtual float GetInverseMass() const = 0; - virtual void SetMass(float mass) = 0; - virtual void SetCenterOfMassOffset(const AZ::Vector3& comOffset) = 0; - - /// Retrieves the velocity at center of mass; only linear velocity, no rotational velocity contribution. - virtual AZ::Vector3 GetLinearVelocity() const = 0; - virtual void SetLinearVelocity(const AZ::Vector3& velocity) = 0; - virtual AZ::Vector3 GetAngularVelocity() const = 0; - virtual void SetAngularVelocity(const AZ::Vector3& angularVelocity) = 0; - virtual AZ::Vector3 GetLinearVelocityAtWorldPoint(const AZ::Vector3& worldPoint) = 0; - virtual void ApplyLinearImpulse(const AZ::Vector3& impulse) = 0; - virtual void ApplyLinearImpulseAtWorldPoint(const AZ::Vector3& impulse, const AZ::Vector3& worldPoint) = 0; - virtual void ApplyAngularImpulse(const AZ::Vector3& angularImpulse) = 0; - - virtual float GetLinearDamping() const = 0; - virtual void SetLinearDamping(float damping) = 0; - virtual float GetAngularDamping() const = 0; - virtual void SetAngularDamping(float damping) = 0; - - virtual bool IsAwake() const = 0; - virtual void ForceAsleep() = 0; - virtual void ForceAwake() = 0; - virtual float GetSleepThreshold() const = 0; - virtual void SetSleepThreshold(float threshold) = 0; - - virtual bool IsKinematic() const = 0; - virtual void SetKinematic(bool kinematic) = 0; - virtual void SetKinematicTarget(const AZ::Transform& targetPosition) = 0; - - virtual bool IsGravityEnabled() const = 0; - virtual void SetGravityEnabled(bool enabled) = 0; - virtual void SetSimulationEnabled(bool enabled) = 0; - virtual void SetCCDEnabled(bool enabled) = 0; - - //! Recalculates mass, inertia and center of mass based on the flags passed. - //! @param flags MassComputeFlags specifying which properties should be recomputed. - //! @param centerOfMassOffsetOverride Optional override of the center of mass. Note: This parameter will be ignored if COMPUTE_COM is passed in flags. - //! @param inertiaTensorOverride Optional override of the inertia. Note: This parameter will be ignored if COMPUTE_INERTIA is passed in flags. - //! @param massOverride Optional override of the mass. Note: This parameter will be ignored if COMPUTE_MASS is passed in flags. - virtual void UpdateMassProperties(MassComputeFlags flags = MassComputeFlags::DEFAULT, - const AZ::Vector3* centerOfMassOffsetOverride = nullptr, - const AZ::Matrix3x3* inertiaTensorOverride = nullptr, - const float* massOverride = nullptr) = 0; - }; - - /// Bitwise operators for MassComputeFlags - inline MassComputeFlags operator|(MassComputeFlags lhs, MassComputeFlags rhs) - { - return aznumeric_cast(aznumeric_cast(lhs) | aznumeric_cast(rhs)); - } - - inline MassComputeFlags operator&(MassComputeFlags lhs, MassComputeFlags rhs) - { - return aznumeric_cast(aznumeric_cast(lhs) & aznumeric_cast(rhs)); - } - - /// Static rigid body. - class RigidBodyStatic - : public WorldBody - { - public: - AZ_CLASS_ALLOCATOR(RigidBodyStatic, AZ::SystemAllocator, 0); - AZ_RTTI(RigidBodyStatic, "{13A677BB-7085-4EDB-BCC8-306548238692}", WorldBody); - - virtual void AddShape(const AZStd::shared_ptr& shape) = 0; - virtual AZ::u32 GetShapeCount() { return 0; } - virtual AZStd::shared_ptr GetShape(AZ::u32 /*index*/) { return nullptr; } - }; -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/RigidBodyBus.h b/Code/Framework/AzFramework/AzFramework/Physics/RigidBodyBus.h index cb5d68c4e1..41e44b4f30 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/RigidBodyBus.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/RigidBodyBus.h @@ -13,12 +13,17 @@ #pragma once #include +#include #include -#include +#include + +namespace AzPhysics +{ + struct RigidBody; +} namespace Physics { - class RigidBody; class RigidBodyRequests : public AZ::ComponentBus @@ -69,9 +74,9 @@ namespace Physics virtual void SetSimulationEnabled(bool enabled) = 0; virtual AZ::Aabb GetAabb() const = 0; - virtual Physics::RigidBody* GetRigidBody() = 0; + virtual AzPhysics::RigidBody* GetRigidBody() = 0; - virtual Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) = 0; + virtual AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) = 0; }; using RigidBodyRequestBus = AZ::EBus; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ScriptCanvasPhysicsUtils.cpp b/Code/Framework/AzFramework/AzFramework/Physics/ScriptCanvasPhysicsUtils.cpp deleted file mode 100644 index 72856439dd..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/ScriptCanvasPhysicsUtils.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "ScriptCanvasPhysicsUtils.h" -#include - -namespace Physics -{ - namespace ReflectionUtils - { - CollisionNotificationBusBehaviorHandler::CollisionNotificationBusBehaviorHandler() - { - m_events.resize(FN_MAX); - SetEvent(&CollisionNotificationBusBehaviorHandler::OnCollisionBeginDummy, "OnCollisionBegin"); - SetEvent(&CollisionNotificationBusBehaviorHandler::OnCollisionPersistDummy, "OnCollisionPersist"); - SetEvent(&CollisionNotificationBusBehaviorHandler::OnCollisionEndDummy, "OnCollisionEnd"); - } - - void CollisionNotificationBusBehaviorHandler::Reflect(AZ::ReflectContext* context) - { - if (auto serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Version(1) - ->Field("Position", &Physics::Contact::m_position) - ->Field("Normal", &Physics::Contact::m_normal) - ->Field("Impulse", &Physics::Contact::m_impulse) - ->Field("Separation", &Physics::Contact::m_separation) - ; - - serializeContext->Class() - ->Field("Contacts", &Physics::CollisionEvent::m_contacts) - ; - } - - if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class("Contact") - ->Property("Position", BehaviorValueProperty(&Physics::Contact::m_position)) - ->Property("Normal", BehaviorValueProperty(&Physics::Contact::m_normal)) - ->Property("Impulse", BehaviorValueProperty(&Physics::Contact::m_impulse)) - ->Property("Separation", BehaviorValueProperty(&Physics::Contact::m_separation)) - ; - - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) - ->Property("Contacts", BehaviorValueProperty(&Physics::CollisionEvent::m_contacts)) - ; - - behaviorContext->EBus("CollisionNotificationBus") - ->Attribute(AZ::Script::Attributes::Module, "physics") - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Handler() - ; - } - } - - void CollisionNotificationBusBehaviorHandler::Disconnect() - { - BusDisconnect(); - } - - bool CollisionNotificationBusBehaviorHandler::Connect(AZ::BehaviorValueParameter* id) - { - return AZ::Internal::EBusConnector::Connect(this, id); - } - - bool CollisionNotificationBusBehaviorHandler::IsConnected() - { - return AZ::Internal::EBusConnector::IsConnected(this); - } - - bool CollisionNotificationBusBehaviorHandler::IsConnectedId(AZ::BehaviorValueParameter* id) - { - return AZ::Internal::EBusConnector::IsConnectedId(this, id); - } - - int CollisionNotificationBusBehaviorHandler::GetFunctionIndex(const char* functionName) const - { - if (strcmp(functionName, "OnCollisionBegin") == 0) return FN_OnCollisionBegin; - if (strcmp(functionName, "OnCollisionPersist") == 0) return FN_OnCollisionPersist; - if (strcmp(functionName, "OnCollisionEnd") == 0) return FN_OnCollisionEnd; - return -1; - } - - void CollisionNotificationBusBehaviorHandler::OnCollisionBeginDummy(AZ::EntityId /*entityId*/, const AZStd::vector& /*contacts*/) - { - // This is never invoked, and only used for type deduction when calling SetEvent - } - - void CollisionNotificationBusBehaviorHandler::OnCollisionPersistDummy(AZ::EntityId /*entityId*/, const AZStd::vector& /*contacts*/) - { - // This is never invoked, and only used for type deduction when calling SetEvent - } - - void CollisionNotificationBusBehaviorHandler::OnCollisionEndDummy(AZ::EntityId /*entityId*/) - { - // This is never invoked, and only used for type deduction when calling SetEvent - } - - void CollisionNotificationBusBehaviorHandler::OnCollisionBegin(const CollisionEvent& collisionEvent) - { - Call(FN_OnCollisionBegin, collisionEvent.m_body2->GetEntityId(), collisionEvent.m_contacts); - } - - void CollisionNotificationBusBehaviorHandler::OnCollisionPersist(const CollisionEvent& collisionEvent) - { - Call(FN_OnCollisionPersist, collisionEvent.m_body2->GetEntityId(), collisionEvent.m_contacts); - } - - void CollisionNotificationBusBehaviorHandler::OnCollisionEnd(const CollisionEvent& collisionEvent) - { - Call(FN_OnCollisionEnd, collisionEvent.m_body2->GetEntityId()); - } - - void WorldNotificationBusBehaviorHandler::Reflect(AZ::ReflectContext* context) - { - if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->EBus("WorldNotificationBus") - ->Handler() - ; - } - } - - void WorldNotificationBusBehaviorHandler::OnPrePhysicsTick(float deltaTime) - { - Call(FN_OnPrePhysicsTick, deltaTime); - } - - void WorldNotificationBusBehaviorHandler::OnPrePhysicsSubtick(float fixedDeltaTime) - { - Call(FN_OnPrePhysicsSubtick, fixedDeltaTime); - } - - void WorldNotificationBusBehaviorHandler::OnPostPhysicsSubtick(float fixedDeltaTime) - { - Call(FN_OnPostPhysicsSubtick, fixedDeltaTime); - } - - void WorldNotificationBusBehaviorHandler::OnPostPhysicsTick(float deltaTime) - { - Call(FN_OnPostPhysicsTick, deltaTime); - } - - int WorldNotificationBusBehaviorHandler::GetPhysicsTickOrder() - { - int order = WorldNotifications::Scripting; - CallResult(order, FN_GetPhysicsTickOrder); - return order; - } - } // namespace ReflectionUtils -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ScriptCanvasPhysicsUtils.h b/Code/Framework/AzFramework/AzFramework/Physics/ScriptCanvasPhysicsUtils.h deleted file mode 100644 index 5e11d4bbdc..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/ScriptCanvasPhysicsUtils.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include -#include -#include - -namespace Physics -{ - namespace ReflectionUtils - { - /// Behavior handler which forwards CollisionNotificationBus events to script canvas. - /// Note this class is not using the usual AZ_EBUS_BEHAVIOR_BINDER macro as the signature - /// needs to be changed for script canvas - class CollisionNotificationBusBehaviorHandler - : public CollisionNotificationBus::Handler - , public AZ::BehaviorEBusHandler - { - public: - - AZ_CLASS_ALLOCATOR(CollisionNotificationBusBehaviorHandler, AZ::SystemAllocator, 0); - AZ_RTTI(CollisionNotificationBusBehaviorHandler, "{A28ACB8F-3429-4F92-88DB-481ACF90EF21}", AZ::BehaviorEBusHandler); - static void Reflect(AZ::ReflectContext* context); - - CollisionNotificationBusBehaviorHandler(); - - // Script Canvas Signature - void OnCollisionBeginDummy(AZ::EntityId entityId, const AZStd::vector& contacts); - void OnCollisionPersistDummy(AZ::EntityId entityId, const AZStd::vector& contacts); - void OnCollisionEndDummy(AZ::EntityId entityId); - - using EventFunctionsParameterPack = AZStd::Internal::pack_traits_arg_sequence - < - decltype(&CollisionNotificationBusBehaviorHandler::OnCollisionBeginDummy), - decltype(&CollisionNotificationBusBehaviorHandler::OnCollisionPersistDummy), - decltype(&CollisionNotificationBusBehaviorHandler::OnCollisionEndDummy) - >; - - private: - enum - { - FN_OnCollisionBegin, - FN_OnCollisionPersist, - FN_OnCollisionEnd, - FN_MAX - }; - - // AZ::BehaviorEBusHandler - void Disconnect() override; - bool Connect(AZ::BehaviorValueParameter* id = nullptr) override; - bool IsConnected() override; - bool IsConnectedId(AZ::BehaviorValueParameter* id) override; - int GetFunctionIndex(const char* functionName) const override; - - - // CollisionNotificationBus - void OnCollisionBegin(const CollisionEvent& triggerEvent) override; - void OnCollisionPersist(const CollisionEvent& triggerEvent) override; - void OnCollisionEnd(const CollisionEvent& triggerEvent) override; - }; - - class WorldNotificationBusBehaviorHandler - : public WorldNotificationBus::Handler - , public AZ::BehaviorEBusHandler - { - public: - static void Reflect(AZ::ReflectContext* context); - AZ_EBUS_BEHAVIOR_BINDER(WorldNotificationBusBehaviorHandler, "{D8B108B8-9126-4C66-B857-377BA5DB3062}", AZ::SystemAllocator - , OnPrePhysicsTick - , OnPrePhysicsSubtick - , OnPostPhysicsSubtick - , OnPostPhysicsTick - , GetPhysicsTickOrder - ); - - // WorldNotificationBus ... - void OnPrePhysicsTick(float deltaTime) override; - void OnPrePhysicsSubtick(float fixedDeltaTime) override; - void OnPostPhysicsSubtick(float fixedDeltaTime) override; - void OnPostPhysicsTick(float deltaTime) override; - int GetPhysicsTickOrder() override; - }; - } // namespace ReflectionUtils -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Shape.h b/Code/Framework/AzFramework/AzFramework/Physics/Shape.h index 18b468bc77..115503c536 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Shape.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Shape.h @@ -17,6 +17,7 @@ #include #include #include +#include namespace AZ { @@ -83,7 +84,6 @@ namespace Physics using ShapeConfigurationList = AZStd::vector; struct RayCastRequest; - struct RayCastHit; class Shape { @@ -121,11 +121,11 @@ namespace Physics //! Raycast against this shape. //! @param request Ray parameters in world space. //! @param worldTransform World transform of this shape. - virtual Physics::RayCastHit RayCast(const Physics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform) = 0; + virtual AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform) = 0; //! Raycast against this shape using local coordinates. //! @param request Ray parameters in local space. - virtual Physics::RayCastHit RayCastLocal(const Physics::RayCastRequest& localSpaceRequest) = 0; + virtual AzPhysics::SceneQueryHit RayCastLocal(const AzPhysics::RayCastRequest& localSpaceRequest) = 0; //! Retrieve this shape AABB. //! @param worldTransform World transform of this shape. diff --git a/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/RigidBody.cpp b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/RigidBody.cpp new file mode 100644 index 0000000000..e0adea7a38 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/RigidBody.cpp @@ -0,0 +1,20 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include + +namespace AzPhysics +{ + AZ_CLASS_ALLOCATOR_IMPL(RigidBody, AZ::SystemAllocator, 0); +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/RigidBody.h b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/RigidBody.h new file mode 100644 index 0000000000..5b18887d43 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/RigidBody.h @@ -0,0 +1,101 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace Physics +{ + class ShapeConfiguration; + class Shape; +} + +namespace AzPhysics +{ + //! Dynamic rigid body. + struct RigidBody + : public SimulatedBody + { + public: + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(AzPhysics::RigidBody, "{156E459F-7BB7-4B4E-ADA0-2130D96B7E80}", AzPhysics::SimulatedBody); + + RigidBody() = default; + + virtual void AddShape(AZStd::shared_ptr shape) = 0; + virtual void RemoveShape(AZStd::shared_ptr shape) = 0; + virtual AZ::u32 GetShapeCount() { return 0; } + virtual AZStd::shared_ptr GetShape([[maybe_unused]]AZ::u32 index) { return nullptr; } + + virtual AZ::Vector3 GetCenterOfMassWorld() const = 0; + virtual AZ::Vector3 GetCenterOfMassLocal() const = 0; + + virtual AZ::Matrix3x3 GetInverseInertiaWorld() const = 0; + virtual AZ::Matrix3x3 GetInverseInertiaLocal() const = 0; + + virtual float GetMass() const = 0; + virtual float GetInverseMass() const = 0; + virtual void SetMass(float mass) = 0; + virtual void SetCenterOfMassOffset(const AZ::Vector3& comOffset) = 0; + + //! Retrieves the velocity at center of mass; only linear velocity, no rotational velocity contribution. + virtual AZ::Vector3 GetLinearVelocity() const = 0; + virtual void SetLinearVelocity(const AZ::Vector3& velocity) = 0; + virtual AZ::Vector3 GetAngularVelocity() const = 0; + virtual void SetAngularVelocity(const AZ::Vector3& angularVelocity) = 0; + virtual AZ::Vector3 GetLinearVelocityAtWorldPoint(const AZ::Vector3& worldPoint) = 0; + virtual void ApplyLinearImpulse(const AZ::Vector3& impulse) = 0; + virtual void ApplyLinearImpulseAtWorldPoint(const AZ::Vector3& impulse, const AZ::Vector3& worldPoint) = 0; + virtual void ApplyAngularImpulse(const AZ::Vector3& angularImpulse) = 0; + + virtual float GetLinearDamping() const = 0; + virtual void SetLinearDamping(float damping) = 0; + virtual float GetAngularDamping() const = 0; + virtual void SetAngularDamping(float damping) = 0; + + virtual bool IsAwake() const = 0; + virtual void ForceAsleep() = 0; + virtual void ForceAwake() = 0; + virtual float GetSleepThreshold() const = 0; + virtual void SetSleepThreshold(float threshold) = 0; + + virtual bool IsKinematic() const = 0; + virtual void SetKinematic(bool kinematic) = 0; + virtual void SetKinematicTarget(const AZ::Transform& targetPosition) = 0; + + virtual bool IsGravityEnabled() const = 0; + virtual void SetGravityEnabled(bool enabled) = 0; + virtual void SetSimulationEnabled(bool enabled) = 0; + virtual void SetCCDEnabled(bool enabled) = 0; + + //! Recalculates mass, inertia and center of mass based on the flags passed. + //! @param flags MassComputeFlags specifying which properties should be recomputed. + //! @param centerOfMassOffsetOverride Optional override of the center of mass. Note: This parameter will be ignored if COMPUTE_COM is passed in flags. + //! @param inertiaTensorOverride Optional override of the inertia. Note: This parameter will be ignored if COMPUTE_INERTIA is passed in flags. + //! @param massOverride Optional override of the mass. Note: This parameter will be ignored if COMPUTE_MASS is passed in flags. + virtual void UpdateMassProperties(MassComputeFlags flags = MassComputeFlags::DEFAULT, + const AZ::Vector3* centerOfMassOffsetOverride = nullptr, + const AZ::Matrix3x3* inertiaTensorOverride = nullptr, + const float* massOverride = nullptr) = 0; + }; + +} // namespace AzPhysics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/StaticRigidBody.cpp b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/StaticRigidBody.cpp new file mode 100644 index 0000000000..c5ce93868d --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/StaticRigidBody.cpp @@ -0,0 +1,31 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +namespace AzPhysics +{ + AZ_CLASS_ALLOCATOR_IMPL(StaticRigidBody, AZ::SystemAllocator, 0); + + /*static*/ void StaticRigidBody::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1) + ; + } + } +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/StaticRigidBody.h b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/StaticRigidBody.h new file mode 100644 index 0000000000..eb2bb8cde1 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Physics/SimulatedBodies/StaticRigidBody.h @@ -0,0 +1,47 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include + +namespace AZ +{ + class ReflectContext; +} + +namespace Physics +{ + class ShapeConfiguration; + class ColliderConfiguration; + class Shape; +} + +namespace AzPhysics +{ + //! Static rigid body. + struct StaticRigidBody + : public SimulatedBody + { + public: + AZ_CLASS_ALLOCATOR_DECL; + AZ_RTTI(StaticRigidBody, "{13A677BB-7085-4EDB-BCC8-306548238692}", SimulatedBody); + static void Reflect(AZ::ReflectContext* context); + + //Legacy API - may change with LYN-438 + virtual void AddShape(const AZStd::shared_ptr& shape) = 0; + virtual AZ::u32 GetShapeCount() { return 0; } + virtual AZStd::shared_ptr GetShape([[maybe_unused]]AZ::u32 index) { return nullptr; } + }; +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h b/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h index 244f326378..c303e14636 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h @@ -16,33 +16,31 @@ #include #include #include +#include namespace AZ { class Vector3; } +namespace AzPhysics +{ + struct SimulatedBody; + struct RigidBodyConfiguration; + struct RigidBody; +} + namespace Physics { - class World; class WorldBody; - class RigidBody; - class RigidBodyStatic; class Shape; class Material; class MaterialSelection; class MaterialConfiguration; - class MaterialLibraryAsset; - class WorldBodyConfiguration; - class RigidBodyConfiguration; class ColliderConfiguration; class ShapeConfiguration; class JointLimitConfiguration; class Joint; - struct RayCastRequest; - struct RayCastResult; - struct ShapeCastRequest; - struct ShapeCastResult; class CharacterConfiguration; class Character; @@ -71,9 +69,9 @@ namespace Physics /// Settings structure provided to DebugDrawPhysics to drive debug drawing behavior. struct DebugDrawSettings { - using DebugDrawLineCallback = AZStd::function& body, float thickness, void* udata)>; - using DebugDrawTriangleCallback = AZStd::function& body, void* udata)>; - using DebugDrawTriangleBatchCallback = AZStd::function& body, void* udata)>; + using DebugDrawLineCallback = AZStd::function& body, float thickness, void* udata)>; + using DebugDrawTriangleCallback = AZStd::function& body, void* udata)>; + using DebugDrawTriangleBatchCallback = AZStd::function& body, void* udata)>; DebugDrawLineCallback m_drawLineCB; ///< Required user callback for line drawing. DebugDrawTriangleBatchCallback m_drawTriBatchCB; ///< User callback for triangle batch drawing. Required if \ref m_isWireframe is false. @@ -84,8 +82,8 @@ namespace Physics bool m_drawBodyTransforms = false; ///< If enabled, draws transform axes for each body. void* m_udata = nullptr; ///< Platform specific and/or gem specific optional user data pointer. - void DrawLine(const DebugDrawVertex& from, const DebugDrawVertex& to, const AZStd::shared_ptr& body, float thickness = 1.0f) { m_drawLineCB(from, to, body, thickness, m_udata); } - void DrawTriangleBatch(const DebugDrawVertex* verts, AZ::u32 numVerts, const AZ::u32* indices, AZ::u32 numIndices, const AZStd::shared_ptr& body) { m_drawTriBatchCB(verts, numVerts, indices, numIndices, body, m_udata); } + void DrawLine(const DebugDrawVertex& from, const DebugDrawVertex& to, const AZStd::shared_ptr& body, float thickness = 1.0f) { m_drawLineCB(from, to, body, thickness, m_udata); } + void DrawTriangleBatch(const DebugDrawVertex* verts, AZ::u32 numVerts, const AZ::u32* indices, AZ::u32 numIndices, const AZStd::shared_ptr& body) { m_drawTriBatchCB(verts, numVerts, indices, numIndices, body, m_udata); } }; /// An interface to get the default physics world for systems that do not support multiple worlds. @@ -95,8 +93,8 @@ namespace Physics public: using MutexType = AZStd::mutex; - /// Returns the Default world managed by a relevant system. - virtual AZStd::shared_ptr GetDefaultWorld() = 0; + //! Returns a handle to the Default Scene managed by a relevant system. + virtual AzPhysics::SceneHandle GetDefaultSceneHandle() const = 0; }; typedef AZ::EBus DefaultWorldBus; @@ -108,8 +106,8 @@ namespace Physics public: using MutexType = AZStd::mutex; - /// Returns the Editor world managed editor system component. - virtual AZStd::shared_ptr GetEditorWorld() = 0; + //! Returns a handle to the Editor Scene managed by editor system component. + virtual AzPhysics::SceneHandle GetEditorSceneHandle() const = 0; }; using EditorWorldBus = AZ::EBus; @@ -142,8 +140,6 @@ namespace Physics ////////////////////////////////////////////////////////////////////////// //// General Physics - virtual AZStd::unique_ptr CreateStaticRigidBody(const WorldBodyConfiguration& configuration) = 0; - virtual AZStd::unique_ptr CreateRigidBody(const RigidBodyConfiguration& configuration) = 0; virtual AZStd::shared_ptr CreateShape(const ColliderConfiguration& colliderConfiguration, const ShapeConfiguration& configuration) = 0; /// Adds an appropriate collider component to the entity based on the provided shape configuration. @@ -177,7 +173,7 @@ namespace Physics virtual AZStd::vector GetSupportedJointTypes() = 0; virtual AZStd::shared_ptr CreateJointLimitConfiguration(AZ::TypeId jointType) = 0; virtual AZStd::shared_ptr CreateJoint(const AZStd::shared_ptr& configuration, - Physics::WorldBody* parentBody, Physics::WorldBody* childBody) = 0; + AzPhysics::SimulatedBody* parentBody, AzPhysics::SimulatedBody* childBody) = 0; /// Generates joint limit visualization data in appropriate format to pass to DebugDisplayRequests draw functions. /// @param configuration The joint configuration to generate visualization data for. /// @param parentRotation The rotation of the joint's parent body (in the same frame as childRotation). @@ -272,11 +268,7 @@ namespace Physics /// Creates the physics representation used to handle basic character interactions (also known as a character /// controller). virtual AZStd::unique_ptr CreateCharacter(const CharacterConfiguration& characterConfig, - const ShapeConfiguration& shapeConfig, World& world) = 0; - - /// Performs any updates related to character controllers which are per-world and not per-character, such as - /// computing character-character interactions. - virtual void UpdateCharacters(World& world, float deltaTime) = 0; + const ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle& sceneHandle) = 0; }; typedef AZ::EBus CharacterSystemRequestBus; @@ -301,16 +293,4 @@ namespace Physics typedef AZ::EBus SystemDebugRequestBus; - class SystemNotifications - : public AZ::EBusTraits - { - public: - virtual ~SystemNotifications() {} - - virtual void OnWorldCreated(World* /*world*/) {}; - virtual void OnPreWorldDestroy(World* /*world*/) {}; - }; - - using SystemNotificationBus = AZ::EBus; - } // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/TriggerBus.h b/Code/Framework/AzFramework/AzFramework/Physics/TriggerBus.h deleted file mode 100644 index 521db0dcc2..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/TriggerBus.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace Physics -{ - struct TriggerEvent; - - /// Services provided by the PhysX Trigger Area Component. - class TriggerNotifications - : public AZ::ComponentBus - { - public: - // Ebus Traits. ID'd on trigger entity Id - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; - static const bool EnableEventQueue = true; - using BusIdType = AZ::EntityId; - - virtual ~TriggerNotifications() {} - - /// Dispatched when an entity enters a trigger. The bus message is ID'd on the triggers entity Id. - virtual void OnTriggerEnter(const TriggerEvent& /*triggerEvent*/) {}; - - /// Dispatched when an entity exits a trigger. The bus message is ID'd on the triggers entity Id. - virtual void OnTriggerExit(const TriggerEvent& /*triggerEvent*/) {}; - }; - - /// Bus to service the PhysX Trigger Area Component event group. - using TriggerNotificationBus = AZ::EBus; -} // namespace PhysX diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Utils.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Utils.cpp index 6cb96d9bf4..ae8f4308df 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Utils.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Utils.cpp @@ -12,138 +12,33 @@ #include "Utils.h" -#include "RigidBody.h" -#include "World.h" #include "Material.h" #include "Shape.h" #include +#include #include #include #include #include -#include -#include -#include #include #include #include - +#include +#include #include #include +#include +#include #include +#include #include +#include +#include namespace Physics { namespace ReflectionUtils { - - /// Behavior handler which forwards TriggerNotificationBus events to script canvas. - /// Note this class is not using the usual AZ_EBUS_BEHAVIOR_BINDER macro as the signature - /// needs to be changed for script canvas - class TriggerNotificationBusBehaviorHandler - : public TriggerNotificationBus::Handler - , public AZ::BehaviorEBusHandler - { - public: - - AZ_CLASS_ALLOCATOR(TriggerNotificationBusBehaviorHandler, AZ::SystemAllocator, 0); - AZ_RTTI(TriggerNotificationBusBehaviorHandler, "{0519A121-16F9-4A97-8D54-092BCD963B95}", AZ::BehaviorEBusHandler); - - TriggerNotificationBusBehaviorHandler() { - m_events.resize(FN_MAX); - SetEvent(&TriggerNotificationBusBehaviorHandler::OnTriggerEnterDummy, "OnTriggerEnter"); - SetEvent(&TriggerNotificationBusBehaviorHandler::OnTriggerExitDummy, "OnTriggerExit"); - } - - static void Reflect(AZ::ReflectContext* context) - { - if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->EBus("TriggerNotificationBus") - ->Attribute(AZ::Script::Attributes::Module, "physics") - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Handler() - ; - } - } - - void OnTriggerEnterDummy(AZ::EntityId /*entityId*/) - { - // This is never invoked, and only used for type deduction when calling SetEvent - } - void OnTriggerExitDummy(AZ::EntityId /*entityId*/) - { - // This is never invoked, and only used for type deduction when calling SetEvent - } - - using EventFunctionsParameterPack = AZStd::Internal::pack_traits_arg_sequence - < - decltype(&TriggerNotificationBusBehaviorHandler::OnTriggerEnterDummy), - decltype(&TriggerNotificationBusBehaviorHandler::OnTriggerExitDummy) - >; - - private: - - enum - { - FN_OnTriggerEnter, - FN_OnTriggerExit, - FN_MAX - }; - - void Disconnect() override - { - BusDisconnect(); - } - - bool Connect(AZ::BehaviorValueParameter * id = nullptr) override - { - return AZ::Internal::EBusConnector::Connect(this, id); - } - - bool IsConnected() override - { - return AZ::Internal::EBusConnector::IsConnected(this); - } - - bool IsConnectedId(AZ::BehaviorValueParameter * id) override - { - return AZ::Internal::EBusConnector::IsConnectedId(this, id); - } - - int GetFunctionIndex(const char * functionName) const override - { - if (strcmp(functionName, "OnTriggerEnter") == 0) return FN_OnTriggerEnter; - if (strcmp(functionName, "OnTriggerExit") == 0) return FN_OnTriggerExit; - return -1; - } - - void OnTriggerEnter(const TriggerEvent& triggerEvent) override - { - Call(FN_OnTriggerEnter, triggerEvent.m_otherBody->GetEntityId()); - } - - void OnTriggerExit(const TriggerEvent& triggerEvent) override - { - Call(FN_OnTriggerExit, triggerEvent.m_otherBody->GetEntityId()); - } - }; - - void ReflectWorldBus(AZ::ReflectContext* context) - { - if (auto* behaviorContext = azrtti_cast(context)) - { - behaviorContext->EBus("WorldRequestBus") - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Attribute(AZ::Script::Attributes::Module, "physics") - ->Attribute(AZ::Script::Attributes::Category, "PhysX") - ->Event("GetGravity", &Physics::WorldRequestBus::Events::GetGravity) - ->Event("SetGravity", &Physics::WorldRequestBus::Events::SetGravity) - ; - } - } - void ReflectWorldBodyBus(AZ::ReflectContext* context) { if (auto* behaviorContext = azrtti_cast(context)) @@ -179,6 +74,29 @@ namespace Physics } } + void ReflectCharacterBus(AZ::ReflectContext* context) + { + if (auto behaviorContext = azrtti_cast(context)) + { + behaviorContext->EBus("CharacterControllerRequestBus", "Character Controller") + ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::RuntimeOwn) + ->Attribute(AZ::Edit::Attributes::Category, "PhysX") + ->Event("GetBasePosition", &Physics::CharacterRequests::GetBasePosition, "Get Base Position") + ->Event("SetBasePosition", &Physics::CharacterRequests::SetBasePosition, "Set Base Position") + ->Event("GetCenterPosition", &Physics::CharacterRequests::GetCenterPosition, "Get Center Position") + ->Event("GetStepHeight", &Physics::CharacterRequests::GetStepHeight, "Get Step Height") + ->Event("SetStepHeight", &Physics::CharacterRequests::SetStepHeight, "Set Step Height") + ->Event("GetUpDirection", &Physics::CharacterRequests::GetUpDirection, "Get Up Direction") + ->Event("GetSlopeLimitDegrees", &Physics::CharacterRequests::GetSlopeLimitDegrees, "Get Slope Limit (Degrees)") + ->Event("SetSlopeLimitDegrees", &Physics::CharacterRequests::SetSlopeLimitDegrees, "Set Slope Limit (Degrees)") + ->Event("GetMaximumSpeed", &Physics::CharacterRequests::GetMaximumSpeed, "Get Maximum Speed") + ->Event("SetMaximumSpeed", &Physics::CharacterRequests::SetMaximumSpeed, "Set Maximum Speed") + ->Event("GetVelocity", &Physics::CharacterRequests::GetVelocity, "Get Velocity") + ->Event("AddVelocity", &Physics::CharacterRequests::AddVelocity, "Add Velocity") + ; + } + } + void ReflectPhysicsApi(AZ::ReflectContext* context) { ShapeConfiguration::Reflect(context); @@ -189,33 +107,35 @@ namespace Physics PhysicsAssetShapeConfiguration::Reflect(context); NativeShapeConfiguration::Reflect(context); CookedMeshShapeConfiguration::Reflect(context); + AzPhysics::SystemInterface::Reflect(context); + AzPhysics::Scene::Reflect(context); AzPhysics::CollisionLayer::Reflect(context); AzPhysics::CollisionGroup::Reflect(context); AzPhysics::CollisionLayers::Reflect(context); AzPhysics::CollisionGroups::Reflect(context); AzPhysics::CollisionConfiguration::Reflect(context); + AzPhysics::CollisionEvent::Reflect(context); + AzPhysics::TriggerEvent::Reflect(context); AzPhysics::SceneConfiguration::Reflect(context); MaterialConfiguration::Reflect(context); MaterialLibraryAsset::Reflect(context); MaterialLibraryAssetReflectionWrapper::Reflect(context); DefaultMaterialLibraryAssetReflectionWrapper::Reflect(context); JointLimitConfiguration::Reflect(context); - WorldBodyConfiguration::Reflect(context); - RigidBodyConfiguration::Reflect(context); + AzPhysics::SimulatedBodyConfiguration::Reflect(context); + AzPhysics::RigidBodyConfiguration::Reflect(context); RagdollNodeConfiguration::Reflect(context); RagdollConfiguration::Reflect(context); CharacterColliderNodeConfiguration::Reflect(context); CharacterColliderConfiguration::Reflect(context); AnimationConfiguration::Reflect(context); CharacterConfiguration::Reflect(context); - ReflectWorldBus(context); + AzPhysics::SimulatedBody::Reflect(context); ReflectWorldBodyBus(context); CollisionFilteringRequests::Reflect(context); - TriggerNotificationBusBehaviorHandler::Reflect(context); - CollisionNotificationBusBehaviorHandler::Reflect(context); - RayCastHit::Reflect(context); - WorldNotificationBusBehaviorHandler::Reflect(context); + AzPhysics::SceneQuery::ReflectSceneQueryObjects(context); ReflectWindBus(context); + ReflectCharacterBus(context); } } @@ -249,22 +169,6 @@ namespace Physics } } - void DeferDelete(AZStd::unique_ptr worldBody) - { - if (!worldBody) - { - return; - } - - // If the body is in a world, remove it from the world and defer - // the deletion until after the next update to ensure trigger exit events get raised. - if (Physics::World* world = worldBody->GetWorld()) - { - world->RemoveBody(*worldBody); - world->DeferDelete(AZStd::move(worldBody)); - } - } - bool FilterTag(AZ::Crc32 tag, AZ::Crc32 filterTag) { // If the filter tag is empty, then ignore it diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Utils.h b/Code/Framework/AzFramework/AzFramework/Physics/Utils.h index 6252871f3f..d382b442d5 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Utils.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Utils.h @@ -22,10 +22,13 @@ namespace AZ class ReflectContext; } -namespace Physics +namespace AzPhysics { - class WorldBody; + struct SimulatedBody; +} +namespace Physics +{ namespace ReflectionUtils { void ReflectPhysicsApi(AZ::ReflectContext* context); @@ -47,13 +50,7 @@ namespace Physics , AZStd::string& stringInOut , AZ::u64 maxStringLength); - /// Defers the deletion of the body until after the next world update. - /// The body is first removed from the world, and then deleted. - /// This ensures trigger exit events are raised correctly on deleted - /// objects. - void DeferDelete(AZStd::unique_ptr body); - //! Returns true if the tag matches the filter tag, or the filter tag is empty bool FilterTag(AZ::Crc32 tag, AZ::Crc32 filter); } -} \ No newline at end of file +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/World.cpp b/Code/Framework/AzFramework/AzFramework/Physics/World.cpp deleted file mode 100644 index 864ab82ecf..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/World.cpp +++ /dev/null @@ -1,335 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include - -namespace -{ - const float TimestepMin = 0.001f; //1000fps - const float TimestepMax = 0.05f; //20fps -} - -namespace Physics -{ - bool WorldConfiguration::VersionConverter(AZ::SerializeContext& context, - AZ::SerializeContext::DataElementNode& classElement) - { - // conversion from version 1: - // - remove AutoSimulate - // - remove TerrainGroup - // - remove TerrainLayer - if (classElement.GetVersion() <= 1) - { - classElement.RemoveElementByName(AZ_CRC("AutoSimulate", 0xcce85fd9)); - classElement.RemoveElementByName(AZ_CRC("TerrainGroup", 0xca808c89)); - classElement.RemoveElementByName(AZ_CRC("TerrainLayer", 0x439be956)); - } - - // conversion from version 2: - // - remove TerrainMaterials - if (classElement.GetVersion() <= 2) - { - classElement.RemoveElementByName(AZ_CRC("TerrainMaterials", 0x6da24f86)); - } - - if (classElement.GetVersion() <= 3) - { - classElement.RemoveElementByName(AZ_CRC("HandleSimulationEvents", 0xba508787)); - } - - //clamping of time steps - if (classElement.GetVersion() <= 4) - { - if (AZ::SerializeContext::DataElementNode* maxTimeStepElement = classElement.FindSubElement(AZ_CRC("MaxTimeStep", 0x34e83795))) - { - float maxTimeStep = TimestepMax; - const bool foundMaxTimeStep = maxTimeStepElement->GetData(maxTimeStep); - if (foundMaxTimeStep) - { - //clamp maxTimeStep between max and min - maxTimeStep = AZ::GetClamp(maxTimeStep, TimestepMin, TimestepMax); - maxTimeStepElement->SetData(context, maxTimeStep); - } - - if (AZ::SerializeContext::DataElementNode* fixedTimeStepElement = classElement.FindSubElement(AZ_CRC("FixedTimeStep", 0xd748ea77))) - { - float fixedTimeStep = TimestepMax; - bool foundFixedTimeStep = fixedTimeStepElement->GetData(fixedTimeStep); - if (foundFixedTimeStep) - { - //clamp fixedTimeStep between maxTimeStep and min - fixedTimeStep = AZ::GetClamp(fixedTimeStep, TimestepMin, maxTimeStep); - fixedTimeStepElement->SetData(context, fixedTimeStep); - } - } - } - } - - return true; - } - - AZ::u32 WorldConfiguration::OnMaxTimeStepChanged() - { - m_fixedTimeStep = AZStd::GetMin(m_fixedTimeStep, GetFixedTimeStepMax()); //since m_maxTimeStep has changed, m_fixedTimeStep might be larger then the max. - return AZ::Edit::PropertyRefreshLevels::AttributesAndValues; - } - - float WorldConfiguration::GetFixedTimeStepMax() const - { - return m_maxTimeStep; - } - - AZ::Crc32 WorldConfiguration::GetCcdVisibility() const - { - return m_enableCcd ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; - } - - void WorldConfiguration::Reflect(AZ::ReflectContext* context) - { - if (auto serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Version(5, &VersionConverter) - ->Field("WorldBounds", &WorldConfiguration::m_worldBounds) - ->Field("MaxTimeStep", &WorldConfiguration::m_maxTimeStep) - ->Field("FixedTimeStep", &WorldConfiguration::m_fixedTimeStep) - ->Field("Gravity", &WorldConfiguration::m_gravity) - ->Field("RaycastBufferSize", &WorldConfiguration::m_raycastBufferSize) - ->Field("SweepBufferSize", &WorldConfiguration::m_sweepBufferSize) - ->Field("OverlapBufferSize", &WorldConfiguration::m_overlapBufferSize) - ->Field("EnableCcd", &WorldConfiguration::m_enableCcd) - ->Field("MaxCcdPasses", &WorldConfiguration::m_maxCcdPasses) - ->Field("EnableCcdResweep", &WorldConfiguration::m_enableCcdResweep) - ->Field("EnableActiveActors", &WorldConfiguration::m_enableActiveActors) - ->Field("EnablePcm", &WorldConfiguration::m_enablePcm) - ->Field("BounceThresholdVelocity", &WorldConfiguration::m_bounceThresholdVelocity) - ; - - if (auto editContext = serializeContext->GetEditContext()) - { - editContext->Class("World Configuration", "Default world configuration") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_worldBounds, "World Bounds", "World bounds") - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_maxTimeStep, "Max Time Step (sec)", "Max time step in seconds") - ->Attribute(AZ::Edit::Attributes::Min, TimestepMin) - ->Attribute(AZ::Edit::Attributes::Max, TimestepMax) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &WorldConfiguration::OnMaxTimeStepChanged)//need to clamp m_fixedTimeStep if this value changes - ->Attribute(AZ::Edit::Attributes::Decimals, 8) - ->Attribute(AZ::Edit::Attributes::DisplayDecimals, 8) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_fixedTimeStep, "Fixed Time Step (sec)", "Fixed time step in seconds. Limited by 'Max Time Step'") - ->Attribute(AZ::Edit::Attributes::Min, TimestepMin) - ->Attribute(AZ::Edit::Attributes::Max, &WorldConfiguration::GetFixedTimeStepMax) - ->Attribute(AZ::Edit::Attributes::Decimals, 8) - ->Attribute(AZ::Edit::Attributes::DisplayDecimals, 8) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_gravity, "Gravity", "Gravity") - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_raycastBufferSize, "Raycast Buffer Size", "Maximum number of hits from a raycast") - ->Attribute(AZ::Edit::Attributes::Min, 1u) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_sweepBufferSize, "Shapecast Buffer Size", "Maximum number of hits from a shapecast") - ->Attribute(AZ::Edit::Attributes::Min, 1u) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_overlapBufferSize, "Overlap Query Buffer Size", "Maximum number of hits from a overlap query") - ->Attribute(AZ::Edit::Attributes::Min, 1u) - ->ClassElement(AZ::Edit::ClassElements::Group, "Continuous Collision Detection") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_enableCcd, "Enable CCD", "Enabled continuous collision detection in the world") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_maxCcdPasses, - "Max CCD Passes", "Maximum number of continuous collision detection passes") - ->Attribute(AZ::Edit::Attributes::Visibility, &WorldConfiguration::GetCcdVisibility) - ->Attribute(AZ::Edit::Attributes::Min, 1u) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_enableCcdResweep, - "Enable CCD Resweep", "Enable a more accurate but more expensive continuous collision detection method") - ->Attribute(AZ::Edit::Attributes::Visibility, &WorldConfiguration::GetCcdVisibility) - ->ClassElement(AZ::Edit::ClassElements::Group, "") // end previous group by starting new unnamed expanded group - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_enablePcm, "Persistent Contact Manifold", "Enabled the persistent contact manifold narrow-phase algorithm") - ->DataElement(AZ::Edit::UIHandlers::Default, &WorldConfiguration::m_bounceThresholdVelocity, - "Bounce Threshold Velocity", "Relative velocity below which colliding objects will not bounce") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) - ; - } - } - } - - bool WorldConfiguration::operator==(const WorldConfiguration& other) const - { - constexpr const float timeStepTolerance = 0.0001f; - return m_enableCcd == other.m_enableCcd - && m_enableCcdResweep == other.m_enableCcdResweep - && m_enableActiveActors == other.m_enableActiveActors - && m_enablePcm == other.m_enablePcm - && m_kinematicFiltering == other.m_kinematicFiltering - && m_kinematicStaticFiltering == other.m_kinematicStaticFiltering - && m_customUserData == other.m_customUserData - && m_raycastBufferSize == other.m_raycastBufferSize - && m_sweepBufferSize == other.m_sweepBufferSize - && m_overlapBufferSize == other.m_overlapBufferSize - && m_maxCcdPasses == other.m_maxCcdPasses - && AZ::IsClose(m_maxTimeStep, other.m_maxTimeStep, timeStepTolerance) - && AZ::IsClose(m_fixedTimeStep, other.m_fixedTimeStep, timeStepTolerance) - && AZ::IsClose(m_bounceThresholdVelocity, other.m_bounceThresholdVelocity) - && m_gravity.IsClose(other.m_gravity) - && m_worldBounds == other.m_worldBounds - ; - } - - bool WorldConfiguration::operator!=(const WorldConfiguration& other) const - { - return !(*this == other); - } - - AZStd::vector World::OverlapSphere(float radius, const AZ::Transform& pose, - OverlapFilterCallback filterCallback) - { - SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = radius; - - OverlapRequest overlapRequest; - overlapRequest.m_pose = pose; - overlapRequest.m_shapeConfiguration = &shapeConfiguration; - overlapRequest.m_filterCallback = filterCallback; - return Overlap(overlapRequest); - } - - AZStd::vector World::OverlapBox(const AZ::Vector3& dimensions, const AZ::Transform& pose, - OverlapFilterCallback filterCallback) - { - BoxShapeConfiguration shapeConfiguration; - shapeConfiguration.m_dimensions = dimensions; - - OverlapRequest overlapRequest; - overlapRequest.m_pose = pose; - overlapRequest.m_shapeConfiguration = &shapeConfiguration; - overlapRequest.m_filterCallback = filterCallback; - return Overlap(overlapRequest); - } - - AZStd::vector World::OverlapCapsule(float height, float radius, const AZ::Transform& pose, - OverlapFilterCallback filterCallback) - { - CapsuleShapeConfiguration shapeConfiguration; - shapeConfiguration.m_height = height; - shapeConfiguration.m_radius = radius; - - OverlapRequest overlapRequest; - overlapRequest.m_pose = pose; - overlapRequest.m_shapeConfiguration = &shapeConfiguration; - overlapRequest.m_filterCallback = filterCallback; - return Overlap(overlapRequest); - } - - Physics::RayCastHit World::SphereCast(float radius, const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType, AzPhysics::CollisionGroup collisionGroup, FilterCallback filterCallback) - { - SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = radius; - - ShapeCastRequest request; - request.m_distance = distance; - request.m_start = startPose; - request.m_direction = direction; - request.m_shapeConfiguration = &shapeConfiguration; - request.m_queryType = queryType; - request.m_collisionGroup = collisionGroup; - request.m_filterCallback = filterCallback; - return ShapeCast(request); - } - - AZStd::vector World::SphereCastMultiple(float radius, const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType, AzPhysics::CollisionGroup collisionGroup, FilterCallback filterCallback) - { - SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = radius; - - ShapeCastRequest request; - request.m_distance = distance; - request.m_start = startPose; - request.m_direction = direction; - request.m_shapeConfiguration = &shapeConfiguration; - request.m_queryType = queryType; - request.m_collisionGroup = collisionGroup; - request.m_filterCallback = filterCallback; - return ShapeCastMultiple(request); - } - - Physics::RayCastHit World::BoxCast(const AZ::Vector3& boxDimensions, const AZ::Transform& startPose, - const AZ::Vector3& direction, float distance, QueryType queryType, AzPhysics::CollisionGroup collisionGroup, FilterCallback filterCallback) - { - BoxShapeConfiguration shapeConfiguration; - shapeConfiguration.m_dimensions = boxDimensions; - - ShapeCastRequest request; - request.m_distance = distance; - request.m_start = startPose; - request.m_direction = direction; - request.m_shapeConfiguration = &shapeConfiguration; - request.m_queryType = queryType; - request.m_collisionGroup = collisionGroup; - request.m_filterCallback = filterCallback; - return ShapeCast(request); - } - - AZStd::vector World::BoxCastMultiple(const AZ::Vector3& boxDimensions, const AZ::Transform& startPose, - const AZ::Vector3& direction, float distance, QueryType queryType, AzPhysics::CollisionGroup collisionGroup, FilterCallback filterCallback) - { - BoxShapeConfiguration shapeConfiguration; - shapeConfiguration.m_dimensions = boxDimensions; - - ShapeCastRequest request; - request.m_distance = distance; - request.m_start = startPose; - request.m_direction = direction; - request.m_shapeConfiguration = &shapeConfiguration; - request.m_queryType = queryType; - request.m_collisionGroup = collisionGroup; - request.m_filterCallback = filterCallback; - return ShapeCastMultiple(request); - } - - Physics::RayCastHit World::CapsuleCast(float capsuleRadius, float capsuleHeight, const AZ::Transform& startPose, - const AZ::Vector3& direction, float distance, QueryType queryType, AzPhysics::CollisionGroup collisionGroup, FilterCallback filterCallback) - { - CapsuleShapeConfiguration shapeConfiguration; - shapeConfiguration.m_height = capsuleHeight; - shapeConfiguration.m_radius = capsuleRadius; - - ShapeCastRequest request; - request.m_distance = distance; - request.m_start = startPose; - request.m_direction = direction; - request.m_shapeConfiguration = &shapeConfiguration; - request.m_queryType = queryType; - request.m_collisionGroup = collisionGroup; - request.m_filterCallback = filterCallback; - return ShapeCast(request); - } - - AZStd::vector World::CapsuleCastMultiple(float capsuleRadius, float capsuleHeight, const AZ::Transform& startPose, - const AZ::Vector3& direction, float distance, QueryType queryType, AzPhysics::CollisionGroup collisionGroup, FilterCallback filterCallback) - { - CapsuleShapeConfiguration shapeConfiguration; - shapeConfiguration.m_height = capsuleHeight; - shapeConfiguration.m_radius = capsuleRadius; - - ShapeCastRequest request; - request.m_distance = distance; - request.m_start = startPose; - request.m_direction = direction; - request.m_shapeConfiguration = &shapeConfiguration; - request.m_queryType = queryType; - request.m_collisionGroup = collisionGroup; - request.m_filterCallback = filterCallback; - return ShapeCastMultiple(request); - } -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/World.h b/Code/Framework/AzFramework/AzFramework/Physics/World.h deleted file mode 100644 index 148fb29383..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/World.h +++ /dev/null @@ -1,296 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -namespace Physics -{ - static AZ::Crc32 DefaultPhysicsWorldId = AZ_CRC("AZPhysicalWorld", 0x18f33e24); - static AZ::Crc32 EditorPhysicsWorldId = AZ_CRC("EditorWorld", 0x8d93f191); - - class RigidBody; - class WorldBody; - class WorldEventHandler; - class ITriggerEventCallback; - - //! Default world configuration. - class WorldConfiguration - { - public: - AZ_CLASS_ALLOCATOR(WorldConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(WorldConfiguration, "{3C87DF50-AD02-4746-B19F-8B7453A86243}") - static void Reflect(AZ::ReflectContext* context); - - virtual ~WorldConfiguration() = default; - - AZ::Crc32 GetCcdVisibility() const; - - AZ::Aabb m_worldBounds = AZ::Aabb::CreateFromMinMax(-AZ::Vector3(1000.f, 1000.f, 1000.f), AZ::Vector3(1000.f, 1000.f, 1000.f)); - float m_maxTimeStep = 1.f / 20.f; - float m_fixedTimeStep = AzPhysics::SystemConfiguration::DefaultFixedTimestep; - AZ::Vector3 m_gravity = AZ::Vector3(0.f, 0.f, -9.81f); - void* m_customUserData = nullptr; - AZ::u64 m_raycastBufferSize = 32; //!< Maximum number of hits that will be returned from a raycast. - AZ::u64 m_sweepBufferSize = 32; //!< Maximum number of hits that can be returned from a shapecast. - AZ::u64 m_overlapBufferSize = 32; //!< Maximum number of overlaps that can be returned from an overlap query. - bool m_enableCcd = false; //!< Enables continuous collision detection in the world. - AZ::u32 m_maxCcdPasses = 1; //!< Maximum number of continuous collision detection passes. - bool m_enableCcdResweep = true; //!< Use a more accurate but more expensive continuous collision detection method. - bool m_enableActiveActors = false; //!< Enables pxScene::getActiveActors method. - bool m_enablePcm = true; //!< Enables the persistent contact manifold algorithm to be used as the narrow phase algorithm. - bool m_kinematicFiltering = true; //!< Enables filtering between kinematic/kinematic objects. - bool m_kinematicStaticFiltering = true; //!< Enables filtering between kinematic/static objects. - float m_bounceThresholdVelocity = 2.0f; //!< Relative velocity below which colliding objects will not bounce. - - bool operator==(const WorldConfiguration& other) const; - bool operator!=(const WorldConfiguration& other) const; - private: - static bool VersionConverter(AZ::SerializeContext& context, - AZ::SerializeContext::DataElementNode& classElement); - - AZ::u32 OnMaxTimeStepChanged(); - float GetFixedTimeStepMax() const; - }; - - //! Callback for unbounded world queries. These are queries which don't require - //! building the entire result vector, and so saves memory for very large numbers of hits. - //! Called with '{ hit }' repeatedly until there are no more hits, then called with '{}', then never called again. - //! Returns 'true' to continue processing more hits, or 'false' otherwise. If the function ever returns - //! 'false', it is unspecified if the finalizing call '{}' occurs. - template - using HitCallback = AZStd::function&&)>; - - //! Physics world. - class World - : public AZ::EBusTraits - { - public: - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; - using BusIdType = AZ::Crc32; - using MutexType = AZStd::recursive_mutex; - - AZ_CLASS_ALLOCATOR(World, AZ::SystemAllocator, 0); - AZ_RTTI(World, "{61832612-9F5C-4A2E-8E11-00655A6DDDD2}"); - - virtual ~World() = default; - - virtual void Update(float deltaTime) = 0; - - //! Start the simulation process. This will spawn physics jobs. - virtual void StartSimulation(float deltaTime) = 0; - - //! Complete the simulation process. This will wait for the simulation jobs to complete, swap the buffers and process events. - virtual void FinishSimulation() = 0; - - //! Perform a raycast in the world returning the closest object that intersected. - virtual RayCastHit RayCast(const RayCastRequest& request) = 0; - - //! Perform a raycast in the world returning all objects that intersected. - virtual AZStd::vector RayCastMultiple(const RayCastRequest& request) = 0; - - //! Perform a shapecast in the world returning the closest object that intersected. - virtual RayCastHit ShapeCast(const ShapeCastRequest& request) = 0; - - //! Perform a shapecast in the world returning all objects that intersected. - virtual AZStd::vector ShapeCastMultiple(const ShapeCastRequest& request) = 0; - - //! Perform a spherecast in the world returning the closest object that intersected. - Physics::RayCastHit SphereCast(float radius, - const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType = QueryType::StaticAndDynamic, - AzPhysics::CollisionGroup collisionGroup = AzPhysics::CollisionGroup::All, - FilterCallback filterCallback = nullptr); - - //! Perform a spherecast in the world returning all objects that intersected. - AZStd::vector SphereCastMultiple(float radius, - const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType = QueryType::StaticAndDynamic, - AzPhysics::CollisionGroup collisionGroup = AzPhysics::CollisionGroup::All, - FilterCallback filterCallback = nullptr); - - //! Perform a boxcast in the world returning the closest object that intersected. - Physics::RayCastHit BoxCast(const AZ::Vector3& boxDimensions, - const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType = QueryType::StaticAndDynamic, - AzPhysics::CollisionGroup collisionGroup = AzPhysics::CollisionGroup::All, - FilterCallback filterCallback = nullptr); - - //! Perform a boxcast in the world returning all objects that intersected. - AZStd::vector BoxCastMultiple(const AZ::Vector3& boxDimensions, - const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType = QueryType::StaticAndDynamic, - AzPhysics::CollisionGroup collisionGroup = AzPhysics::CollisionGroup::All, - FilterCallback filterCallback = nullptr); - - //! Perform a capsule in the world returning all objects that intersected. - Physics::RayCastHit CapsuleCast(float capsuleRadius, float capsuleHeight, - const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType = QueryType::StaticAndDynamic, - AzPhysics::CollisionGroup collisionGroup = AzPhysics::CollisionGroup::All, - FilterCallback filterCallback = nullptr); - - //! Perform a capsule in the world returning all objects that intersected. - AZStd::vector CapsuleCastMultiple(float capsuleRadius, float capsuleHeight, - const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, - QueryType queryType = QueryType::StaticAndDynamic, - AzPhysics::CollisionGroup collisionGroup = AzPhysics::CollisionGroup::All, - FilterCallback filterCallback = nullptr); - - //! Perform an overlap query returning all objects that overlapped. - virtual AZStd::vector Overlap(const OverlapRequest& request) = 0; - - //! Perform an unbounded overlap query, calling the provided callback for each - virtual void OverlapUnbounded(const OverlapRequest& request, const HitCallback& cb) = 0; - - //! Perform an overlap sphere query returning all objects that overlapped. - AZStd::vector OverlapSphere(float radius, const AZ::Transform& pose, OverlapFilterCallback filterCallback = nullptr); - - //! Perform an overlap box query returning all objects that overlapped. - AZStd::vector OverlapBox(const AZ::Vector3& dimensions, const AZ::Transform& pose, OverlapFilterCallback filterCallback = nullptr); - - //! Perform an overlap capsule query returning all objects that overlapped. - AZStd::vector OverlapCapsule(float height, float radius, const AZ::Transform& pose, OverlapFilterCallback filterCallback = nullptr); - - //! Registers a pair of world bodies for which collisions should be suppressed. - virtual void RegisterSuppressedCollision(const WorldBody& body0, const WorldBody& body1) = 0; - - //! Unregisters a pair of world bodies for which collisions should be suppressed. - virtual void UnregisterSuppressedCollision(const WorldBody& body0, const WorldBody& body1) = 0; - - virtual void AddBody(WorldBody& body) = 0; - virtual void RemoveBody(WorldBody& body) = 0; - - virtual AZ::Crc32 GetNativeType() const { return AZ::Crc32(); } - virtual void* GetNativePointer() const { return nullptr; } - - virtual void SetSimFunc(std::function func) = 0; - - virtual void SetEventHandler(WorldEventHandler* eventHandler) = 0; - - virtual AZ::Vector3 GetGravity() const = 0; - virtual void SetGravity(const AZ::Vector3& gravity) = 0; - - virtual void SetMaxDeltaTime(float maxDeltaTime) = 0; - virtual void SetFixedDeltaTime(float fixedDeltaTime) = 0; - - virtual void DeferDelete(AZStd::unique_ptr worldBody) = 0; - - //! @brief Similar to SetEventHandler, relevant for Touch Bending. - //! - //! SetEventHandler is useful to catch onTrigger events when the bodies - //! involved were created with the standard physics Components attached to - //! entities. On the other hand, this method was added since Touch Bending, and it is useful - //! for the touch bending simulator to catch onTrigger events of Actors that - //! don't have valid AZ:EntityId. - //! - //! @param triggerCallback Pointer to the callback object that will get the On - //! @returns Nothing. - virtual void SetTriggerEventCallback(ITriggerEventCallback* triggerCallback) = 0; - - //! Returns this world's ID. - virtual AZ::Crc32 GetWorldId() const = 0; - }; - - using WorldRequestBus = AZ::EBus; - using WorldRequests = World; - - //! Broadcasts notifications for a specific Physics::World. - //! This bus is addressed on the id of the world. - //! Subscribe to the bus using Physics::DefaultPhysicsWorldId for the default world, - //! or Physics::EditorPhysicsWorldId for the editor world. - class WorldNotifications - : public AZ::EBusTraits - { - public: - enum PhysicsTickOrder - { - Physics = 0, //!< The physics system itself. Should always be first. - Animation = 100, //!< Animation system (ragdolls). - Components = 200, //!< C++ components (force region). - Scripting = 300, //!< Scripting systems (script canvas). - Audio = 400, //!< Audio systems (occlusion). - Default = 1000 //!< All other systems (Game code). - }; - - virtual ~WorldNotifications() = default; - - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::MultipleAndOrdered; - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; - using BusIdType = AZ::Crc32; - using MutexType = AZStd::recursive_mutex; - - //! Broadcast before each world simulation tick. - //! Each tick may include multiple fixed timestep subticks. For example, if the fixed timestep was set at 10ms, - //! and a game tick of 25ms occurred, 2 fixed timestep subticks would be performed this tick, and the - //! remaining 5ms would be accumulated for the subsequent tick. So, in this example, the events fired would be: - //! OnPrePhysicsTick (for the whole 25ms tick) - //! OnPrePhysicsSubtick (for the first 10ms subtick) - //! OnPostPhysicsSubtick (for the first 10ms subtick) - //! OnPrePhysicsSubtick (for the second 10ms subtick) - //! OnPostPhysicsSubtick (for the second 10ms subtick) - //! OnPostPhysicsTick (for the whole 25ms tick) - //! @param deltaTime The duration of the tick as a whole (which may contain multiple fixed timestep subticks). - virtual void OnPrePhysicsTick([[maybe_unused]] float deltaTime) {} - - //! Broadcast before each fixed timestep subtick. - //! @param fixedDeltaTime The duration for fixed timestep subticks. - virtual void OnPrePhysicsSubtick([[maybe_unused]] float fixedDeltaTime) {} - - //! Broadcast after each fixed timestep subtick. - //! @param fixedDeltaTime The duration for fixed timestep subticks. - virtual void OnPostPhysicsSubtick([[maybe_unused]] float fixedDeltaTime) {} - - //! Broadcast after each world simulation tick. - //! Each tick may include multiple fixed timestep subticks. - //! @param deltaTime The duration of the tick as a whole (which may contain multiple fixed timestep subticks). - virtual void OnPostPhysicsTick([[maybe_unused]] float deltaTime) {} - - //! Event fired when the gravity for a world is changed. - //! @param gravity The world's new value for gravity acceleration. - virtual void OnGravityChanged([[maybe_unused]] const AZ::Vector3& gravity) {} - - //! Specified the order in which a handler receives WorldNotification events. - //! Users subscribing to this bus can override this function to change - //! the order events are received relative to other systems. - //! @return a value specifying this handler'S relative order. - virtual int GetPhysicsTickOrder() { return Default; } - - //! Determines the order in which handlers receive events. - struct BusHandlerOrderCompare - { - //! Compare function used to control physics update order. - //! @param left an instance of the handler to compare. - //! @param right another instance of the handler to compare. - //! @return True if the priority of left is greater than right, false otherwise. - AZ_FORCE_INLINE bool operator()(WorldNotifications* left, WorldNotifications* right) const - { - return left->GetPhysicsTickOrder() < right->GetPhysicsTickOrder(); - } - }; - }; - - using WorldNotificationBus = AZ::EBus; -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/WorldBody.cpp b/Code/Framework/AzFramework/AzFramework/Physics/WorldBody.cpp deleted file mode 100644 index a9805094ac..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/WorldBody.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include - - -namespace Physics -{ - void WorldBodyConfiguration::Reflect(AZ::ReflectContext* context) - { - AZ::SerializeContext* serializeContext = azrtti_cast(context); - if (serializeContext) - { - serializeContext->Class() - ->Version(1) - ->Field("name", &WorldBodyConfiguration::m_debugName) - ; - } - } - - void WorldBody::SetUserData(void* userData) - { - m_customUserData = userData; - } -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/WorldBody.h b/Code/Framework/AzFramework/AzFramework/Physics/WorldBody.h deleted file mode 100644 index 5f66661197..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/WorldBody.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include -#include -#include -#include - -namespace Physics -{ - class WorldBody; - class World; - struct RayCastRequest; - struct RayCastHit; - - class WorldBodyConfiguration - { - public: - AZ_CLASS_ALLOCATOR(WorldBodyConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(WorldBodyConfiguration, "{6EEB377C-DC60-4E10-AF12-9626C0763B2D}"); - - WorldBodyConfiguration() = default; - WorldBodyConfiguration(const WorldBodyConfiguration& settings) = default; - virtual ~WorldBodyConfiguration() = default; - - static void Reflect(AZ::ReflectContext* context); - - // Basic initial settings. - AZ::Vector3 m_position = AZ::Vector3::CreateZero(); - AZ::Quaternion m_orientation = AZ::Quaternion::CreateIdentity(); - AZ::Vector3 m_scale = AZ::Vector3::CreateOne(); - - // Entity/object association. - AZ::EntityId m_entityId; - void* m_customUserData = nullptr; - - // For debugging/tracking purposes only. - AZStd::string m_debugName; - }; - - class WorldBody - { - public: - AZ_CLASS_ALLOCATOR(WorldBody, AZ::SystemAllocator, 0); - AZ_RTTI(WorldBody, "{4F1D9B44-FC21-4E93-83F0-41B6A78D9B4B}"); - - friend class World; - - public: - WorldBody() = default; - WorldBody(const WorldBodyConfiguration& /*settings*/) {}; - virtual ~WorldBody() = default; - - virtual AZ::EntityId GetEntityId() const = 0; - - void SetUserData(void* userData); - template - T* GetUserData() const; - - virtual Physics::World* GetWorld() const = 0; - - virtual AZ::Transform GetTransform() const = 0; - virtual void SetTransform(const AZ::Transform& transform) = 0; - - virtual AZ::Vector3 GetPosition() const = 0; - virtual AZ::Quaternion GetOrientation() const = 0; - - virtual AZ::Aabb GetAabb() const = 0; - virtual Physics::RayCastHit RayCast(const RayCastRequest& request) = 0; - - virtual AZ::Crc32 GetNativeType() const = 0; - virtual void* GetNativePointer() const = 0; - - virtual void AddToWorld(Physics::World&) = 0; - virtual void RemoveFromWorld(Physics::World&) = 0; - - private: - void* m_customUserData = nullptr; - }; - - template - T* WorldBody::GetUserData() const - { - return static_cast(m_customUserData); - } - -} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/WorldBodyBus.h b/Code/Framework/AzFramework/AzFramework/Physics/WorldBodyBus.h index 3f030e0955..943e03d0f3 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/WorldBodyBus.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/WorldBodyBus.h @@ -13,13 +13,17 @@ #pragma once #include +#include #include -#include +#include -namespace Physics +namespace AzPhysics { - class WorldBody; + struct SimulatedBody; +} +namespace Physics +{ //! Requests for generic physical world bodies class WorldBodyRequests : public AZ::ComponentBus @@ -36,11 +40,11 @@ namespace Physics //! Retrieves the AABB(aligned-axis bounding box) for this body virtual AZ::Aabb GetAabb() const = 0; - //! Retrieves current WorldBody* for this body. Note: Do not hold a reference to Physics::WorldBody* as could be deleted - virtual Physics::WorldBody* GetWorldBody() = 0; + //! Retrieves current WorldBody* for this body. Note: Do not hold a reference to AzPhysics::SimulatedBody* as could be deleted + virtual AzPhysics::SimulatedBody* GetWorldBody() = 0; //! Perform a single-object raycast against this body - virtual Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) = 0; + virtual AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) = 0; }; using WorldBodyRequestBus = AZ::EBus; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/WorldEventhandler.h b/Code/Framework/AzFramework/AzFramework/Physics/WorldEventhandler.h deleted file mode 100644 index 891f48ddfb..0000000000 --- a/Code/Framework/AzFramework/AzFramework/Physics/WorldEventhandler.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include - -namespace Physics -{ - class WorldBody; - class Shape; - - /// Trigger event raised when an object enters/exits a trigger shape. - struct TriggerEvent - { - Physics::WorldBody* m_triggerBody; ///< The trigger body - Physics::Shape* m_triggerShape; ///< The trigger shape - Physics::WorldBody* m_otherBody; ///< The other body that entered the trigger - Physics::Shape* m_otherShape; ///< The other shape that entered the trigger - }; - - /// Stores information about the contacts between two overlapping shapes. - struct Contact - { - AZ_CLASS_ALLOCATOR(Contact, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(Contact, "{D7439508-ED10-4395-9D48-1FC3D7815361}"); - - AZ::Vector3 m_position; ///< The position of the contact - AZ::Vector3 m_normal; ///< The normal of the contact - AZ::Vector3 m_impulse; ///< The impulse force applied to separate the bodies - AZ::u32 m_internalFaceIndex01; ///< Intenal face index of the first shape - AZ::u32 m_internalFaceIndex02; ///< Internal face index of the second shape - float m_separation; ///< The separation - }; - - /// A collision event raised when two objects, neither of which can be triggers, overlap. - struct CollisionEvent - { - AZ_CLASS_ALLOCATOR(CollisionEvent, AZ::SystemAllocator, 0); - AZ_TYPE_INFO(CollisionEvent, "{7602AA36-792C-4BDC-BDF8-AA16792151A3}"); - - Physics::WorldBody* m_body1; ///< The first body - Physics::Shape* m_shape1; ///< The shape on the first body - Physics::WorldBody* m_body2; ///< The second body - Physics::Shape* m_shape2; ///< The shape on the second body - AZStd::vector m_contacts; ///< The contacts between the two shapes - }; - - /// Implement this interface and call SetEventHandler on Physics::World - /// to receive events from that world. - /// CActionGame is the default handler for the default physics world which - /// translates these events into bus events. - class WorldEventHandler - { - public: - /// Raised when an object starts overlapping with a trigger shape. - virtual void OnTriggerEnter(const TriggerEvent& triggerEvent) = 0; - - /// Raised when an object stops overlapping with a trigger shape. - virtual void OnTriggerExit(const TriggerEvent& triggerEvent) = 0; - - /// Raised when two shapes come into contact with each other. - virtual void OnCollisionBegin(const CollisionEvent& collisionEvent) = 0; - - /// Raised when two shapes continue contact with each other. - virtual void OnCollisionPersist(const CollisionEvent& collisionEvent) = 0; - - /// Raised when two shapes stop contacting each other. - virtual void OnCollisionEnd(const CollisionEvent& collisionEvent) = 0; - }; - -} //namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp index ed8fd3a3af..5acf4e75d1 100644 --- a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp +++ b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp @@ -12,123 +12,133 @@ #include +#include #include #include -#include -#include #include #include #include #include #include -#include - -namespace AzFramework +namespace AzFramework::ProjectManager { - namespace ProjectManager + AZStd::tuple FindProjectAndEngineRootPaths(const int argc, char* argv[]) { - // Check for a project name, if not found, attempt to launch project manager and shut down - ProjectPathCheckResult CheckProjectPathProvided(const int argc, char* argv[]) + bool ownsAllocator = false; + if (!AZ::AllocatorInstance::IsReady()) { - // If we were able to locate a path to a project, we're done - if (HasProjectPath(argc, argv)) - { - return ProjectPathCheckResult::ProjectPathFound; - } + AZ::AllocatorInstance::Create(); + ownsAllocator = true; + } - if (LaunchProjectManager()) - { - AZ_TracePrintf("ProjectManager", "Project Manager launched successfully, requesting exit."); - return ProjectPathCheckResult::ProjectManagerLaunched; - } - AZ_Error("ProjectManager", false, "Project Manager failed to launch and no project selected!"); - return ProjectPathCheckResult::ProjectManagerLaunchFailed; + AZ::IO::FixedMaxPath projectRootPath; + AZ::IO::FixedMaxPath engineRootPath; + { + // AZ::CommandLine and SettingsRegistryImpl is in block scope to make sure + // that the allocated memory is cleaned up before destroying the SystemAllocator + // at the end of the function + AZ::CommandLine commandLine; + commandLine.Parse(argc, argv); + AZ::SettingsRegistryImpl settingsRegistry; + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(settingsRegistry); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(settingsRegistry, AZ_TRAIT_OS_PLATFORM_CODENAME, {}); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(settingsRegistry, commandLine, false); + engineRootPath = AZ::SettingsRegistryMergeUtils::FindEngineRoot(settingsRegistry); + projectRootPath = AZ::SettingsRegistryMergeUtils::FindProjectRoot(settingsRegistry); + } + if (ownsAllocator) + { + AZ::AllocatorInstance::Destroy(); } + return AZStd::make_tuple(projectRootPath, engineRootPath); + } - bool HasProjectPath(const int argc, char* argv[]) + // Check for a project name, if not found, attempt to launch project manager and shut down + ProjectPathCheckResult CheckProjectPathProvided(const int argc, char* argv[]) + { + auto [projectRootPath, engineRootPath] = FindProjectAndEngineRootPaths(argc, argv); + // If we were able to locate a path to a project, we're done + if (!projectRootPath.empty()) + { + return ProjectPathCheckResult::ProjectPathFound; + } + + if (LaunchProjectManager(engineRootPath)) + { + AZ_TracePrintf("ProjectManager", "Project Manager launched successfully, requesting exit."); + return ProjectPathCheckResult::ProjectManagerLaunched; + } + AZ_Error("ProjectManager", false, "Project Manager failed to launch and no project selected!"); + return ProjectPathCheckResult::ProjectManagerLaunchFailed; + } + + bool LaunchProjectManager([[maybe_unused]] const AZ::IO::FixedMaxPath& engineRootPath) + { + bool launchSuccess = false; +#if (AZ_TRAIT_AZFRAMEWORK_USE_PROJECT_MANAGER) + bool ownsSystemAllocator = false; + if (!AZ::AllocatorInstance::IsReady()) { - bool hasProjectPath = false; - bool ownsAllocator = false; - if (!AZ::AllocatorInstance::IsReady()) + ownsSystemAllocator = true; + AZ::AllocatorInstance::Create(); + } + { + const char projectsScript[] = "projects.py"; + + AZ_Warning("ProjectManager", false, "No project provided - launching project selector."); + + if (engineRootPath.empty()) { - AZ::AllocatorInstance::Create(); - ownsAllocator = true; + AZ_Error("ProjectManager", false, "Couldn't find engine root"); + return false; } + auto projectManagerPath = engineRootPath / "scripts" / "project_manager"; + + if (!AZ::IO::SystemFile::Exists((projectManagerPath / projectsScript).c_str())) { - AZ::CommandLine commandLine; - commandLine.Parse(argc, argv); - AZ::SettingsRegistryImpl settingsRegistry; - AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(settingsRegistry); - AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(settingsRegistry, commandLine, false); - auto sysGameFolderKey = AZ::SettingsRegistryInterface::FixedValueString( - AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path"; - AZ::IO::FixedMaxPath registryPath; - hasProjectPath = settingsRegistry.Get(registryPath.Native(), sysGameFolderKey); + AZ_Error("ProjectManager", false, "%s not found at %s!", projectsScript, projectManagerPath.c_str()); + return false; } - if (ownsAllocator) + AZ::IO::FixedMaxPathString executablePath; + AZ::Utils::GetExecutablePathReturnType result = AZ::Utils::GetExecutablePath(executablePath.data(), executablePath.capacity()); + if (result.m_pathStored != AZ::Utils::ExecutablePathResult::Success) { - AZ::AllocatorInstance::Destroy(); + AZ_Error("ProjectManager", false, "Could not determine executable path!"); + return false; } - return hasProjectPath; - } - - bool LaunchProjectManager() - { - bool launchSuccess = false; -#if (AZ_TRAIT_AZFRAMEWORK_USE_PROJECT_MANAGER) - bool ownsSystemAllocator = false; - if (!AZ::AllocatorInstance::IsReady()) + AZ::IO::FixedMaxPath parentPath(executablePath.c_str()); + auto exeFolder = parentPath.ParentPath(); + AZStd::fixed_string<8> debugOption; + auto lastSep = exeFolder.Native().find_last_of(AZ_CORRECT_FILESYSTEM_SEPARATOR); + if (lastSep != AZStd::string_view::npos) { - ownsSystemAllocator = true; - AZ::AllocatorInstance::Create(); + exeFolder = exeFolder.Native().substr(lastSep + 1); } + if (exeFolder == "debug") { - const char projectsScript[] = "projects.py"; - - AZ_Warning("ProjectManager", false, "No project provided - launching project selector."); - - AZ::IO::FixedMaxPath enginePath = Engine::FindEngineRoot(); - if (enginePath.empty()) - { - AZ_Error("ProjectManager", false, "Couldn't find engine root"); - return false; - } - auto projectManagerPath = enginePath / "scripts" / "project_manager"; - - if (!AZ::IO::SystemFile::Exists((projectManagerPath / projectsScript).c_str())) - { - AZ_Error("ProjectManager", false, "%s not found at %s!", projectsScript, projectManagerPath.c_str()); - return false; - } - char executablePath[AZ_MAX_PATH_LEN]; - AZ::Utils::GetExecutablePathReturnType result = AZ::Utils::GetExecutablePath(executablePath, AZ_MAX_PATH_LEN); - auto exeFolder = AZ::IO::PathView(executablePath).ParentPath().Filename().Native(); - AZStd::fixed_string<8> debugOption; - if (exeFolder == "debug") - { - // We need to use the debug version of the python interpreter to load up our debug version of our libraries which work with the debug version of QT living in this folder - debugOption = "debug "; - } - AZ::IO::FixedMaxPath pythonPath = enginePath / "python"; - pythonPath /= AZ_TRAIT_AZFRAMEWORK_PYTHON_SHELL; - auto cmdPath = AZ::IO::FixedMaxPathString::format("%s %s%s --executable_path=%s --parent_pid=%" PRId64, pythonPath.Native().c_str(), - debugOption.c_str(), (projectManagerPath / projectsScript).c_str(), executablePath, AZ::Platform::GetCurrentProcessId()); + // We need to use the debug version of the python interpreter to load up our debug version of our libraries which work with the debug version of QT living in this folder + debugOption = "debug "; + } + AZ::IO::FixedMaxPath pythonPath = engineRootPath / "python"; + pythonPath /= AZ_TRAIT_AZFRAMEWORK_PYTHON_SHELL; + auto cmdPath = AZ::IO::FixedMaxPathString::format("%s %s%s --executable_path=%s --parent_pid=%" PRId64, pythonPath.Native().c_str(), + debugOption.c_str(), (projectManagerPath / projectsScript).c_str(), executablePath.c_str(), AZ::Platform::GetCurrentProcessId()); - AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo; + AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo; - processLaunchInfo.m_commandlineParameters = cmdPath; - processLaunchInfo.m_showWindow = false; - launchSuccess = AzFramework::ProcessLauncher::LaunchUnwatchedProcess(processLaunchInfo); - } - if(ownsSystemAllocator) - { - AZ::AllocatorInstance::Destroy(); - } -#endif // #if defined(AZ_FRAMEWORK_USE_PROJECT_MANAGER) - return launchSuccess; + processLaunchInfo.m_commandlineParameters = cmdPath; + processLaunchInfo.m_showWindow = false; + launchSuccess = AzFramework::ProcessLauncher::LaunchUnwatchedProcess(processLaunchInfo); + } + if (ownsSystemAllocator) + { + AZ::AllocatorInstance::Destroy(); } - } // ProjectManager -} // AzFramework +#endif // #if defined(AZ_FRAMEWORK_USE_PROJECT_MANAGER) + return launchSuccess; + } + +} // AzFramework::ProjectManager diff --git a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.h b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.h index fe5c567e7b..cc79bd4184 100644 --- a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.h +++ b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.h @@ -11,33 +11,18 @@ */ #pragma once -#include -#include -#include +#include -namespace AzFramework +namespace AzFramework::ProjectManager { - namespace ProjectManager + enum class ProjectPathCheckResult { - constexpr AZ::IO::SystemFile::SizeType MaxBootstrapFileSize = 1024 * 10; - - // Check if any project name can be found anywhere - bool HasProjectPath(const int argc, char* argv[]); - // Check if any project name can be found on the command line - bool HasCommandLineProjectName(const int argc, char* argv[]); - // Check if a relative project is being used through bootstrap - bool HasBootstrapProjectName(AZStd::string_view projectFolder = {}); - // Search content for project name key - bool ContentHasProjectName(AZStd::fixed_string< MaxBootstrapFileSize>& bootstrapString); - enum class ProjectPathCheckResult - { - ProjectManagerLaunchFailed = -1, - ProjectManagerLaunched = 0, - ProjectPathFound = 1 - }; - // Check for a project name, if not found, attempts to launch project manager and returns false - ProjectPathCheckResult CheckProjectPathProvided(const int argc, char* argv[]); - // Attempt to Launch the project manager. Requires locating the engine root, project manager script, and python. - bool LaunchProjectManager(); - } -} // AzFramework + ProjectManagerLaunchFailed = -1, + ProjectManagerLaunched = 0, + ProjectPathFound = 1 + }; + // Check for a project name, if not found, attempts to launch project manager and returns false + ProjectPathCheckResult CheckProjectPathProvided(const int argc, char* argv[]); + // Attempt to Launch the project manager. Requires locating the engine root, project manager script, and python. + bool LaunchProjectManager(const AZ::IO::FixedMaxPath& engineRootPath); +} // AzFramework::ProjectManager diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.cpp b/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.cpp index a442b607e7..838ab0b6e2 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.cpp @@ -296,6 +296,95 @@ namespace AzFramework namespace Internal { + + static AZStd::string PrintLuaValue(lua_State* lua, int stackIdx, int depth = 0) + { + constexpr int MaxDepth = 4; + if (depth > MaxDepth) + { + return ""; + } + + const int elementType = lua_type(lua, stackIdx); + + switch (elementType) + { + case LUA_TSTRING: + return lua_tostring(lua, stackIdx); + case LUA_TBOOLEAN: + return lua_toboolean(lua, stackIdx) ? "true" : "false"; + case LUA_TNUMBER: + return AZStd::to_string(lua_tonumber(lua, stackIdx)); + case LUA_TTABLE: + { + AZStd::string tableStr = "{"; + AZStd::string keyValuePairs; + int keyCount = 0; + + // check if this lua table contains a meta-table + if(lua_getmetatable(lua, stackIdx)) + { + keyValuePairs += "Meta"; + keyValuePairs += PrintLuaValue(lua, lua_gettop(lua), depth+1); + lua_pop(lua, 1); + keyValuePairs += " "; + ++keyCount; + } + + if (depth < MaxDepth) + { + lua_pushnil(lua); + bool tableKeyExists = lua_next(lua, stackIdx); + while(tableKeyExists) + { + const int valueIndex = lua_gettop(lua); + const int keyIndex = valueIndex-1; + + const AZStd::string key = PrintLuaValue(lua, keyIndex, depth+1); + const AZStd::string value = PrintLuaValue(lua, valueIndex, depth+1); + keyValuePairs += key + AZStd::string("=")+value; + ++keyCount; + + lua_pop(lua, 1); // removes 'value'; keeps 'key' for next iteration + tableKeyExists = lua_next(lua, stackIdx); + if(tableKeyExists) + { + keyValuePairs += " "; + } + } + } + + tableStr += keyValuePairs.length() < 1024 ? keyValuePairs : AZStd::string::format("too many keys (%i)!", keyCount); + tableStr += "}"; + + return tableStr; + } + default: + return lua_typename(lua, elementType); + } + } + + #pragma warning( push ) + #pragma warning( disable : 4505 ) // StackDump is useful to debug the lua stack. Disable warning about this method being unused. + //========================================================================= + // DebugPrintStack + // Prints the Lua stack starting from the bottom. + //========================================================================= + static void DebugPrintStack(lua_State* lua, const AZStd::string& prefix = "") + { + AZStd::string dump = prefix; + const int stackSize = lua_gettop(lua); + for (int stackIdx = 1; stackIdx <= stackSize; ++stackIdx) + { + dump += PrintLuaValue(lua, stackIdx); + dump += " "; // add separator + } + + AZ_Warning("ScriptComponent", false, "Stack Dump: '%s'", dump.c_str()); + } + #pragma warning( pop ) + + //========================================================================= // Properties__IndexFindSubtable //========================================================================= @@ -373,7 +462,7 @@ namespace AzFramework // and script are not in sync and we added new properties. lua_getmetatable(lua, -2); // get the metatable which will be the top property table int entityProperties = lua_gettop(lua); - if (lua_getmetatable(lua, -1) == 0) // get the matateble of the property which will be the original table + if (lua_getmetatable(lua, -1) == 0) // get the metatable of the property which will be the original table { // we are looking at top level properties lua_pushvalue(lua, -2); // copy the key @@ -510,6 +599,16 @@ namespace AzFramework m_script = script; } + AZ::ScriptProperty* ScriptComponent::GetScriptProperty(const char* propertyName) + { + return m_properties.GetProperty(propertyName); + } + + const AZ::ScriptProperty* ScriptComponent::GetNetworkedScriptProperty(const char* propertyName) const + { + return m_netBindingTable->FindScriptProperty(propertyName); + } + void ScriptComponent::Init() { // Grab the script context @@ -681,17 +780,23 @@ namespace AzFramework // Point the __index of the Script table to itself // because it will be used as a metatable - lua_pushliteral(lua, "__index"); - lua_pushvalue(lua, -2); - lua_rawset(lua, -3); - - lua_pushlstring(lua, m_properties.m_name.c_str(), m_properties.m_name.length()); // load Property table name - lua_rawget(lua, -2); + // Stack = ScriptRootTable + lua_pushliteral(lua, "__index"); // Stack = ScriptRootTable __index + lua_pushvalue(lua, -2); // Stack = ScriptRootTable __index CopyOfScriptRootTable + + // raw set: t[k] = v, where t is the value at the given index, v is the value at the top of the stack, and k is the value just below the top. Both key and value are popped off the stack. + // ie: ScriptRootTable[__index] = CopyOfScriptRootTable + // Since __index value is a table and not a function, the final result is the result of indexing this table with key. However, this indexing is regular, not raw, and therefore can trigger another metamethod. + lua_rawset(lua, -3); // Stack = ScriptRootTable + + // load Property table name + lua_pushlstring(lua, m_properties.m_name.c_str(), m_properties.m_name.length()); // Stack = ScriptRootTable "Properties" + lua_rawget(lua, -2); // Stack = ScriptRootTable ThisScriptPropertiesTable if (lua_istable(lua, -1)) { // This property table will be used a metatable from all instances // set the __index so we can read values in case we change the script - // after we export the component (so the properties will not the default value) + // after we export the component lua_pushliteral(lua, "__index"); lua_pushlightuserdata(lua, m_netBindingTable); lua_pushcclosure(lua, &Internal::Properties__Index, 1); @@ -730,7 +835,7 @@ namespace AzFramework { const char* tableName = lua_tolstring(lua, -2, nullptr); if (strncmp(tableName, "__", 2) == 0 || // skip metatables - strcmp(tableName, propertyTableName) == 0 || // check if this is NOT the property table + strcmp(tableName, propertyTableName) == 0 || // Skip the Properties table strcmp(tableName, ScriptComponent::NetRPCFieldName) == 0) // Want to skip the RPC table as well { break; @@ -786,12 +891,11 @@ namespace AzFramework LSV_BEGIN(lua, -1); AZ_Error("Script", lua_istable(lua, -1), "%s", "Script did not return a table!"); - int baseTableIndex = lua_gettop(lua); - - // Stack: base + int baseStackIndex = lua_gettop(lua); - lua_pushlstring(lua, m_properties.m_name.c_str(), m_properties.m_name.length()); - lua_rawget(lua, baseTableIndex); + // Stack: ScriptRootTable + lua_pushlstring(lua, m_properties.m_name.c_str(), m_properties.m_name.length()); // Stack: ScriptRootTable "Properties" + lua_rawget(lua, baseStackIndex); // Stack: ScriptRootTable PropertiesTable AZ_Error("Script", lua_istable(lua, -1) || lua_isnil(lua, -1), "We should have the %s table for properties!", m_properties.m_name.c_str()); int basePropertyTable = -1; if (lua_istable(lua, -1)) @@ -799,31 +903,30 @@ namespace AzFramework basePropertyTable = lua_gettop(lua); } - // Stack: base, properties - lua_createtable(lua, 0, 1); // Create entity table; - int entityTableIndex = lua_gettop(lua); + int entityStackIndex = lua_gettop(lua); - // Stack: base, properties, entity + // Stack: ScriptRootTable PropertiesTable EntityTable // Create our network binding. - CreateNetworkBindingTable(baseTableIndex, entityTableIndex); + CreateNetworkBindingTable(baseStackIndex, entityStackIndex); if (basePropertyTable > -1) // if property table exists { CreatePropertyGroup(m_properties, basePropertyTable, lua_gettop(lua), basePropertyTable, true); + // Stack: ScriptRootTable PropertiesTable EntityTable{ PropertiesTable{__index __newIndex Meta{CopyOfPropertiesTable}} } } // replicate other tables to make sure we have table per instance. - CopyAndHookEntityTables(lua, baseTableIndex, lua_gettop(lua), m_properties.m_name.c_str()); + CopyAndHookEntityTables(lua, baseStackIndex, lua_gettop(lua), m_properties.m_name.c_str()); // set my entity id - lua_pushliteral(lua, "entityId"); - AZ::ScriptValue::StackPush(lua, GetEntityId()); - lua_rawset(lua, -3); + lua_pushliteral(lua, "entityId"); // Stack: ScriptRootTable PropertiesTable EntityTable{ PropertiesTable{__index __newIndex Meta{CopyOfPropertiesTable}} } "entityId" + AZ::ScriptValue::StackPush(lua, GetEntityId()); // Stack: ScriptRootTable PropertiesTable EntityTable{ PropertiesTable{__index __newIndex Meta{CopyOfPropertiesTable}} } "entityId" userdata + lua_rawset(lua, -3); // Stack: ScriptRootTable PropertiesTable EntityTable{ PropertiesTable{__index __newIndex Meta{CopyOfPropertiesTable}} entityId } // set the base metatable - lua_pushvalue(lua, baseTableIndex); // copy the "Base table" + lua_pushvalue(lua, baseStackIndex); // copy the "Base table" lua_setmetatable(lua, -2); // set the scriptTable as a metatable for the entity table // Keep the entity table in the registry @@ -836,7 +939,7 @@ namespace AzFramework // call OnActivate lua_pushliteral(lua, "OnActivate"); - lua_rawget(lua, baseTableIndex); // ScriptTable[OnActivate] + lua_rawget(lua, baseStackIndex); // ScriptTable[OnActivate] if (lua_isfunction(lua, -1)) { AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Script, "OnActivate"); @@ -894,11 +997,11 @@ namespace AzFramework // CreateNetworkBindingTable // [6/27/2016] //========================================================================= - void ScriptComponent::CreateNetworkBindingTable(int baseTableStack, int entityTableStack) + void ScriptComponent::CreateNetworkBindingTable(int baseStackIndex, int entityStackIndex) { if (m_netBindingTable) { - m_netBindingTable->CreateNetworkBindingTable(m_context, baseTableStack, entityTableStack); + m_netBindingTable->CreateNetworkBindingTable(m_context, baseStackIndex, entityStackIndex); } } @@ -916,21 +1019,26 @@ namespace AzFramework if (isRoot) { - // this is the root table (properties) it will be used as properties for all sub tables - lua_pushliteral(lua, "__index"); - lua_pushlightuserdata(lua, m_netBindingTable); - lua_pushcclosure(lua, &Internal::Properties__Index, 1); - lua_rawset(lua, -3); + // Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {} + // This is the root table (properties) it will be used as properties for all sub tables + // ScriptComponents can share the same lua script asset, but each instance's Properties table needs to be unique. + // This way the script can change a property at runtime and not affect the other ScriptComponents which are using the same script. + // For normal properties we will create new variable instances, but NetSynched variables aren't stored in Lua, and instead + // are retrieved using the __index and __newIndex metamethods. + // Ensure that this instance of Properties table has the proper __index and __newIndex metamethods. + lua_newtable(lua); // This new table will become the Properties instance metatable. Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {} {} + lua_pushliteral(lua, "__index"); // Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {} {} __index + lua_pushlightuserdata(lua, m_netBindingTable); // Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {} {} __index m_netBinding + lua_pushcclosure(lua, &Internal::Properties__Index, 1); // Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {} {} __index function + lua_rawset(lua, -3); // Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {} {__index=Internal::Properties__Index} lua_pushliteral(lua, "__newindex"); lua_pushlightuserdata(lua, m_netBindingTable); lua_pushcclosure(lua, &Internal::Properties__NewIndex, 1); - lua_rawset(lua, -3); - - lua_pushvalue(lua, metatableIndex); - lua_setmetatable(lua, -2); + lua_rawset(lua, -3); // Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {} {__index=Internal::Properties__Index __newindex=Internal::Properties__NewIndex} + lua_setmetatable(lua, -2); // Stack: ScriptRootTable PropertiesTable EntityTable "Properties" {Meta{__index=Internal::Properties__Index __newindex=Internal::Properties__NewIndex} } - metatableIndex = lua_gettop(lua); // this should the metatable for all subtables + metatableIndex = lua_gettop(lua); // This will be the metatable for all subtables } else { @@ -947,35 +1055,39 @@ namespace AzFramework lua_pushlstring(lua, prop->m_name.c_str(), prop->m_name.length()); lua_rawget(lua, propertyGroupTableIndex); + // Stack: ... SomePropertyInThePropertiesTable. This may be any basic lua type (number, string, table etc) if (lua_istable(lua, -1)) { - bool isPropertyHandled = false; + bool isNetworkedProperty = false; AZ::ScriptDataContext stackContext; // If we find a table value. We want to inspect it for information. if (m_context->ReadStack(stackContext)) { - lua_pushliteral(lua, "netSynched"); - lua_rawget(lua, -2); + // check if the current property, which is a table, has a sub-table called "netSynched" + lua_pushliteral(lua, "netSynched"); // Stack: ... SomePropertyInThePropertiesTable netSynched + lua_rawget(lua, -2); // Stack: ... SomePropertyInThePropertiesTable NetSynchedSubTable/nil if (stackContext.IsTable(-1)) { AZ::ScriptDataContext networkTableContext; - if (stackContext.InspectTable(-1, networkTableContext)) + if (stackContext.InspectTable(-1, networkTableContext)) // Stack: ... SomePropertyInThePropertiesTable NetSynchedSubTable NetSynchedSubTable nil nil { - isPropertyHandled = m_netBindingTable->RegisterDataSet(networkTableContext, prop); + // RegisterDataSet will make sure our __NewIndex function callback will be triggered whenever modifying netSynched Properties. + //isNetworkedProperty = true; + isNetworkedProperty = m_netBindingTable->RegisterDataSet(networkTableContext, prop); } } // Network binding table - lua_pop(lua, 1); + lua_pop(lua, 1); // Stack: ... SomePropertyInThePropertiesTable } - // Property name table + // Pop this PropertiesTable's property lua_pop(lua, 1); // If the property is networked, we don't want to copy it over into the table. - if (isPropertyHandled) + if (isNetworkedProperty) { continue; } @@ -1016,7 +1128,7 @@ namespace AzFramework lua_remove(lua, childPropertyGroupIndex); } - lua_rawset(lua, parentIndex); // set the table into the parent table + lua_rawset(lua, parentIndex); // Stack: ScriptRootTable PropertiesTable EntityTable{ PropertiesTable{Meta{__index __newIndex}} } } //========================================================================= diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.h b/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.h index ee4ac83608..4d15bc527d 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptComponent.h @@ -102,6 +102,9 @@ namespace AzFramework AZ_COMPONENT(AzFramework::ScriptComponent, "{8D1BC97E-C55D-4D34-A460-E63C57CD0D4B}", NetBindable); + /// \red ComponentDescriptor::Reflect + static void Reflect(AZ::ReflectContext* reflection); + ScriptComponent(); ~ScriptComponent(); @@ -111,6 +114,10 @@ namespace AzFramework const AZ::Data::Asset& GetScript() const { return m_script; } void SetScript(const AZ::Data::Asset& script); + // Methods used for unit tests + AZ::ScriptProperty* GetScriptProperty(const char* propertyName); + const AZ::ScriptProperty* GetNetworkedScriptProperty(const char* propertyName) const; + protected: ScriptComponent(const ScriptComponent&) = delete; ////////////////////////////////////////////////////////////////////////// @@ -145,18 +152,15 @@ namespace AzFramework void CreateEntityTable(); void DestroyEntityTable(); - void CreateNetworkBindingTable(int baseTableIndex, int entityTableIndex); + void CreateNetworkBindingTable(int baseStackIndex, int entityStackIndex); - void CreatePropertyGroup(const ScriptPropertyGroup& group, int prototypeParentIndex, int parentIndex, int metatableIndex, bool isRoot); - - /// \red ComponentDescriptor::Reflect - static void Reflect(AZ::ReflectContext* reflection); + void CreatePropertyGroup(const ScriptPropertyGroup& group, int propertyGroupTableIndex, int parentIndex, int metatableIndex, bool isRoot); AZ::ScriptContext* m_context; ///< Context in which the script will be running AZ::ScriptContextId m_contextId; ///< Id of the script context. AZ::Data::Asset m_script; ///< Reference to the script asset used for this component. int m_table; ///< Cached table index - ScriptPropertyGroup m_properties; ///< List with all properties that were tweaked in the editor and should override values in the m_scourceScriptName class inside m_script. + ScriptPropertyGroup m_properties; ///< List with all properties that were tweaked in the editor and should override values in the m_sourceScriptName class inside m_script. ScriptNetBindingTable* m_netBindingTable; ///< Table that will hold our networked script values, and manage callbacks }; } // namespace AZ diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.cpp b/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.cpp index 4275fe3c45..1ffbb59c0e 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.cpp +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.cpp @@ -1239,7 +1239,13 @@ namespace AzFramework } return canProxyExecute; - } + } + + const AZ::ScriptProperty* ScriptNetBindingTable::FindScriptProperty(const AZStd::string& name) const + { + const NetworkedTableValue* networkedTableValue = FindTableValue(name); + return networkedTableValue ? networkedTableValue->GetShimmedScriptProperty() : nullptr; + } void ScriptNetBindingTable::AssignDataSets() { diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.h b/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.h index 6a7a7e3b32..eec28b71b0 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.h +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptNetBindings.h @@ -43,7 +43,7 @@ namespace AzFramework friend class ScriptComponentReplicaChunk; friend class ScriptPropertyDataSet; - // Helper struct to keep track of a a ScriptConctext + // Helper struct to keep track of a a ScriptContext // and the entityTableReference. Mainly used for // calling in to functions in LUA where we want // to push in the table reference as the first parameter @@ -117,6 +117,8 @@ namespace AzFramework bool AssignValue(AZ::ScriptDataContext& scriptDataContext, const AZStd::string& propertyName); bool InspectValue(AZ::ScriptContext* scriptContext) const; + // Methods used for unit tests + const AZ::ScriptProperty* GetShimmedScriptProperty() const { return m_shimmedScriptProperty; } private: // This value will be used if we have a networked property, but don't have a valid chunk yet. @@ -202,6 +204,10 @@ namespace AzFramework void OnPropertyUpdate(AZ::ScriptProperty*const& scriptProperty, const GridMate::TimeContext& tc); bool OnInvokeRPC(AZStd::string functionName, AZStd::vector< AZ::ScriptProperty*> properties, const GridMate::RpcContext& rpcContext); + // Methods used for unit tests + const AZ::ScriptProperty* FindScriptProperty(const AZStd::string& name) const; + + private: void RegisterMetaTableCache(); diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/RootSpawnableInterface.h b/Code/Framework/AzFramework/AzFramework/Spawnable/RootSpawnableInterface.h new file mode 100644 index 0000000000..8c12104e72 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/RootSpawnableInterface.h @@ -0,0 +1,71 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include + +namespace AzFramework +{ + //! Notifications send when the root spawnable updates. Events will always be called from the main thread. + class RootSpawnableNotifications + : public AZ::EBusTraits + { + public: + virtual ~RootSpawnableNotifications() = default; + + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; + static const bool EnableEventQueue = true; + using MutexType = AZStd::recursive_mutex; + + //! Called when the root spawnable has been assigned a new value. This may be called several times without a call to release + //! in between. + //! @param rootSpawnable The new root spawnable that was assigned. + //! @param generation The generation of the root spawnable. This will increment every time a new spawnable is assigned. + virtual void OnRootSpawnableAssigned([[maybe_unused]] AZ::Data::Asset rootSpawnable, + [[maybe_unused]] uint32_t generation) {} + //! Called when the root spawnable has Released. This will only be called if there's no root spawnable assigned to take the + //! place of the original root spawnable. + //! @param generation The generation of the root spawnable that was released. + virtual void OnRootSpawnableReleased([[maybe_unused]] uint32_t generation) {} + }; + + using RootSpawnableNotificationBus = AZ::EBus; + + //! Interface to manage the root spawnable. All calls to this interface need to be made + //! from the main thread and all events are called from the main thread. + class RootSpawnableDefinition + { + public: + AZ_RTTI(AzFramework::RootSpawnableDefinition, "{6F3698F4-005D-4F26-BE99-5DC2E21FAD38}"); + + using OnRootSpawnableReadyEvent = AZ::Event < const AZ::Data::Asset&, bool>; + + //! Sets the provided spawnable as the new root spawnable. If a root spawnable has already + //! been assigned this will unload any entities spawned from it and replace it. The provided + //! spawnable will become the new root and all entities in it will be instanced into the + //! game entity context. + //! @return the generation of the root spawnable that has been assigned. + virtual uint64_t AssignRootSpawnable(AZ::Data::Asset rootSpawnable) = 0; + //! Releases the root spawnable if one is set, resulting in all entities spawned from it to + //! be deleted and the spawnable asset to be released. This call is automatically done when + //! AssignRootSpawnable is called while a root spawnable is assigned. + virtual void ReleaseRootSpawnable() = 0; + }; + + using RootSpawnableInterface = AZ::Interface; +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.cpp index 15af055d44..7ab2d48814 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.cpp +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.cpp @@ -16,8 +16,8 @@ namespace AzFramework { - Spawnable::Spawnable(const AZ::Data::AssetId& id) - : AZ::Data::AssetData(id) + Spawnable::Spawnable(const AZ::Data::AssetId& id, AssetStatus status) + : AZ::Data::AssetData(id, status) { } diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.h b/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.h index 6cc99f1602..5e507b3498 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/Spawnable.h @@ -33,9 +33,10 @@ namespace AzFramework using EntityList = AZStd::vector>; inline static constexpr const char* FileExtension = "spawnable"; + inline static constexpr const char* DotFileExtension = ".spawnable"; Spawnable() = default; - explicit Spawnable(const AZ::Data::AssetId& id); + explicit Spawnable(const AZ::Data::AssetId& id, AssetStatus status = AssetStatus::NotLoaded); Spawnable(const Spawnable& rhs) = delete; Spawnable(Spawnable&& other); ~Spawnable() override = default; diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableAssetHandler.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableAssetHandler.cpp index 0a1ceef880..735757db7d 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableAssetHandler.cpp +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableAssetHandler.cpp @@ -12,8 +12,8 @@ #include #include -#include #include +#include namespace AzFramework { diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesContainer.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesContainer.cpp new file mode 100644 index 0000000000..673701cac4 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesContainer.cpp @@ -0,0 +1,115 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include + +namespace AzFramework +{ + SpawnableEntitiesContainer::SpawnableEntitiesContainer(AZ::Data::Asset spawnable) + { + Connect(AZStd::move(spawnable)); + } + + SpawnableEntitiesContainer::~SpawnableEntitiesContainer() + { + Clear(); + } + + bool SpawnableEntitiesContainer::IsSet() const + { + return m_threadData != nullptr; + } + + uint64_t SpawnableEntitiesContainer::GetCurrentGeneration() const + { + return m_currentGeneration; + } + + void SpawnableEntitiesContainer::SpawnAllEntities() + { + AZ_Assert(m_threadData, "Calling SpawnAllEntities on a Spawnable container that's not set."); + SpawnableEntitiesInterface::Get()->SpawnAllEntities(m_threadData->m_spawnedEntitiesTicket); + } + + void SpawnableEntitiesContainer::SpawnEntities(AZStd::vector entityIndices) + { + AZ_Assert(m_threadData, "Calling SpawnEntities on a Spawnable container that's not set."); + SpawnableEntitiesInterface::Get()->SpawnEntities(m_threadData->m_spawnedEntitiesTicket, AZStd::move(entityIndices)); + } + + void SpawnableEntitiesContainer::DespawnAllEntities() + { + AZ_Assert(m_threadData, "Calling DespawnEntities on a Spawnable container that's not set."); + SpawnableEntitiesInterface::Get()->DespawnAllEntities(m_threadData->m_spawnedEntitiesTicket); + } + + void SpawnableEntitiesContainer::Reset(AZ::Data::Asset spawnable) + { + Clear(); + Connect(AZStd::move(spawnable)); + } + + void SpawnableEntitiesContainer::Clear() + { + if (m_threadData != nullptr) + { + m_monitor.Disconnect(); + m_monitor.m_threadData.reset(); + + SpawnableEntitiesInterface::Get()->Barrier(m_threadData->m_spawnedEntitiesTicket, + [threadData = m_threadData](EntitySpawnTicket&) mutable + { + threadData.reset(); + }); + + m_threadData.reset(); + // The generation is incremented here instead of Connect in order to make sure that any callback that checks the + // provided generation with the current generation is aware that the container has moved on to the next iteration + // of the container even though it's empty and unassigned at this point. + m_currentGeneration++; + } + } + + void SpawnableEntitiesContainer::Alert(AlertCallback callback) + { + AZ_Assert(m_threadData, "Calling DespawnEntities on a Spawnable container that's not set."); + SpawnableEntitiesInterface::Get()->Barrier(m_threadData->m_spawnedEntitiesTicket, + [generation = m_threadData->m_generation, callback = AZStd::move(callback)](EntitySpawnTicket&) + { + callback(generation); + }); + } + + void SpawnableEntitiesContainer::Connect(AZ::Data::Asset spawnable) + { + AZ::Data::AssetId spawnableId = spawnable.GetId(); + + AZ_Assert(m_threadData == nullptr, "Connecting a spawnable entities container that's already connected."); + AZ_Assert(m_monitor.m_threadData == nullptr, "Connecting a spawnable entities monitor that's already connected."); + + m_threadData = AZStd::make_shared(); + m_threadData->m_spawnedEntitiesTicket = EntitySpawnTicket(AZStd::move(spawnable)); + m_threadData->m_generation = m_currentGeneration; + + m_monitor.m_threadData = m_threadData; + m_monitor.Connect(spawnableId); + } + + void SpawnableEntitiesContainer::Monitor::OnSpawnableReloaded(AZ::Data::Asset&& replacementAsset) + { + AZ_Assert(m_threadData, "SpawnableEntitiesContainer is monitoring a spawnable, but doesn't have the associated data."); + + AZ_TracePrintf("Spawnables", "Reloading spawnable '%s'.\n", replacementAsset.GetHint().c_str()); + SpawnableEntitiesInterface::Get()->ReloadSpawnable(m_threadData->m_spawnedEntitiesTicket, AZStd::move(replacementAsset)); + } +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesContainer.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesContainer.h new file mode 100644 index 0000000000..5d14774b93 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesContainer.h @@ -0,0 +1,105 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + class Entity; +} + +namespace AzFramework +{ + //! A utility class to simplify the life-cycle management of entities created from a Spawnable. + //! This class will keep track of the created entities and take appropriate action when the spawnable changes. + //! Calls to this container should be done from the same thread, but multiple threads can create their own container for + //! the same Spawnable. This container is for simple use cases. Complex situations can directly call the + //! SpawnablesEntitesInterface and use the SpawnableMonitor if needed. + class SpawnableEntitiesContainer + { + public: + using AlertCallback = AZStd::function; + + //! Constructs a new spawnables entity container that has not been connected. + SpawnableEntitiesContainer() = default; + //! Constructs a new spawnables entity container that connects to the provided spawnable. + //! @param spawnable The Spawnable that will be monitored and used as a template to create entities from. + explicit SpawnableEntitiesContainer(AZ::Data::Asset spawnable); + ~SpawnableEntitiesContainer(); + + //! Returns true if the container has a spawnable set and can process requests, otherwise returns falls. + [[nodiscard]] bool IsSet() const; + //! Returns a number that identifies the current generation of the container with. The completion callback can still receive + //! calls from older generations as processing completes on those. The returned value can be used to help calls tell + //! older versions apart from newer ones. + [[nodiscard]] uint64_t GetCurrentGeneration() const; + + //! Puts in a request to spawn entities using all entities in the provided spawnable as a template. + void SpawnAllEntities(); + //! Puts in a request to spawn entities using the entities found in the spawnable at the provided indices as a template. + //! @param entityIndices A list of indices to the entities in the spawnable. + void SpawnEntities(AZStd::vector entityIndices); + //! Puts in a request to despawn all previous spawned entities. + void DespawnAllEntities(); + + //! Resets the spawnable and completion callback. This call will clear first if a spawnable has already been set. See + //! Clear for more details. + //! @param spawnable The Spawnable that will be monitored and used as a template to create entities from. + void Reset(AZ::Data::Asset spawnable); + //! Puts in a request to disconnect from the connected spawnable. This will immediately clear the internal + //! state to allow for a Reset, but the release of the spawnable itself will be delayed. As a result any pending and + //! in-flight requests will complete first. If a callback has been set it will be called one more time after this + //! function returns, possibly outliving the lifetime of the container. + void Clear(); + + //! Adds an alert that will trigger the provided callback once all previous calls to change the container have completed. + //! This includes calls to (de)spawn entities, reset the container or clear. The callback can be called from threads + //! other than the calling thread including the main thread. Note that because the alert is queued it can still be called + //! after the container has been deleted or can be called for a previously assigned spawnable. In the latter case check + //! if the current generation matches the generation provided with the callback. + void Alert(AlertCallback callback); + + private: + void Connect(AZ::Data::Asset spawnable); + + struct ThreadSafeData + { + AZ_CLASS_ALLOCATOR(SpawnableEntitiesContainer::ThreadSafeData, AZ::SystemAllocator, 0); + EntitySpawnTicket m_spawnedEntitiesTicket; + uint32_t m_generation{ 0 }; + }; + + class Monitor final : public SpawnableMonitor + { + public: + AZStd::shared_ptr m_threadData; + + protected: + void OnSpawnableReloaded(AZ::Data::Asset&& replacementAsset) override; + }; + + Monitor m_monitor; + AZStd::atomic_uint32_t m_currentGeneration{ 1 }; + AZStd::shared_ptr m_threadData; + }; +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.cpp new file mode 100644 index 0000000000..a528797f63 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.cpp @@ -0,0 +1,139 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +namespace AzFramework +{ + SpawnableEntityContainerView::SpawnableEntityContainerView(AZ::Entity** begin, size_t length) + : m_begin(begin) + , m_end(begin + length) + {} + + SpawnableEntityContainerView::SpawnableEntityContainerView(AZ::Entity** begin, AZ::Entity** end) + : m_begin(begin) + , m_end(end) + { + AZ_Assert(m_begin <= m_end, "SpawnableEntityContainerView created with a begin that's past the end."); + } + + AZ::Entity** SpawnableEntityContainerView::begin() + { + return m_begin; + } + + AZ::Entity** SpawnableEntityContainerView::end() + { + return m_end; + } + + const AZ::Entity* const* SpawnableEntityContainerView::cbegin() + { + return m_begin; + } + + const AZ::Entity* const* SpawnableEntityContainerView::cend() + { + return m_end; + } + + size_t SpawnableEntityContainerView::size() + { + return AZStd::distance(m_begin, m_end); + } + + + + SpawnableConstEntityContainerView::SpawnableConstEntityContainerView(AZ::Entity** begin, size_t length) + : m_begin(begin) + , m_end(begin + length) + {} + + SpawnableConstEntityContainerView::SpawnableConstEntityContainerView(AZ::Entity** begin, AZ::Entity** end) + : m_begin(begin) + , m_end(end) + { + AZ_Assert(m_begin <= m_end, "SpawnableConstEntityContainerView created with a begin that's past the end."); + } + + const AZ::Entity* const* SpawnableConstEntityContainerView::begin() + { + return m_begin; + } + + const AZ::Entity* const* SpawnableConstEntityContainerView::end() + { + return m_end; + } + + const AZ::Entity* const* SpawnableConstEntityContainerView::cbegin() + { + return m_begin; + } + + const AZ::Entity* const* SpawnableConstEntityContainerView::cend() + { + return m_end; + } + + size_t SpawnableConstEntityContainerView::size() + { + return AZStd::distance(m_begin, m_end); + } + + + + EntitySpawnTicket::EntitySpawnTicket(EntitySpawnTicket&& rhs) + : m_payload(rhs.m_payload) + { + rhs.m_payload = nullptr; + } + + EntitySpawnTicket::EntitySpawnTicket(AZ::Data::Asset spawnable) + { + auto manager = SpawnableEntitiesInterface::Get(); + AZ_Assert(manager, "Attempting to create an entity spawn ticket while the SpawnableEntitiesInterface has no implementation."); + m_payload = manager->CreateTicket(AZStd::move(spawnable)); + } + + EntitySpawnTicket::~EntitySpawnTicket() + { + if (m_payload) + { + auto manager = SpawnableEntitiesInterface::Get(); + AZ_Assert(manager, "Attempting to destroy an entity spawn ticket while the SpawnableEntitiesInterface has no implementation."); + manager->DestroyTicket(m_payload); + m_payload = nullptr; + } + } + + EntitySpawnTicket& EntitySpawnTicket::operator=(EntitySpawnTicket&& rhs) + { + if (this != &rhs) + { + if (m_payload) + { + auto manager = SpawnableEntitiesInterface::Get(); + AZ_Assert(manager, "Attempting to destroy an entity spawn ticket while the SpawnableEntitiesInterface has no implementation."); + manager->DestroyTicket(m_payload); + } + m_payload = rhs.m_payload; + rhs.m_payload = nullptr; + } + return *this; + } + + bool EntitySpawnTicket::IsValid() const + { + return m_payload != nullptr; + } +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h new file mode 100644 index 0000000000..ea19b3a0be --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h @@ -0,0 +1,181 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + class Entity; +} + +namespace AzFramework +{ + class SpawnableEntityContainerView + { + public: + SpawnableEntityContainerView(AZ::Entity** begin, size_t length); + SpawnableEntityContainerView(AZ::Entity** begin, AZ::Entity** end); + + AZ::Entity** begin(); + AZ::Entity** end(); + const AZ::Entity* const* cbegin(); + const AZ::Entity* const* cend(); + size_t size(); + + private: + AZ::Entity** m_begin; + AZ::Entity** m_end; + }; + + class SpawnableConstEntityContainerView + { + public: + SpawnableConstEntityContainerView(AZ::Entity** begin, size_t length); + SpawnableConstEntityContainerView(AZ::Entity** begin, AZ::Entity** end); + + const AZ::Entity* const* begin(); + const AZ::Entity* const* end(); + const AZ::Entity* const* cbegin(); + const AZ::Entity* const* cend(); + size_t size(); + + private: + AZ::Entity** m_begin; + AZ::Entity** m_end; + }; + + //! Requests to the SpawnableEntitiesInterface require a ticket with a valid spawnable that be used as a template. A ticket can + //! be reused for multiple calls on the same spawnable and is safe to use by multiple threads at the same time. Entities created + //! from the spawnable may be tracked by the ticket and so using the same ticket is needed to despawn the exact entities created + //! by a call so spawn entities. The life cycle of the spawned entities is tied to the ticket and all entities spawned using a + //! ticket will be despawned when it's deleted. + class EntitySpawnTicket + { + public: + friend class SpawnableEntitiesDefinition; + + EntitySpawnTicket() = default; + EntitySpawnTicket(const EntitySpawnTicket&) = delete; + EntitySpawnTicket(EntitySpawnTicket&& rhs); + explicit EntitySpawnTicket(AZ::Data::Asset spawnable); + ~EntitySpawnTicket(); + + EntitySpawnTicket& operator=(const EntitySpawnTicket&) = delete; + EntitySpawnTicket& operator=(EntitySpawnTicket&& rhs); + + bool IsValid() const; + + private: + void* m_payload{ nullptr }; + }; + + using EntitySpawnCallback = AZStd::function; + using EntityDespawnCallback = AZStd::function; + using ReloadSpawnableCallback = AZStd::function; + using ListEntitiesCallback = AZStd::function; + using ClaimEntitiesCallback = AZStd::function; + using BarrierCallback = AZStd::function; + + //! Interface definition to (de)spawn entities from a spawnable into the game world. + //! While the callbacks of the individual calls are being processed they will block processing any other request. Callbacks can be + //! issued from threads other than the one that issued the call, including the main thread. + //! Calls on the same ticket are guaranteed to be executed in the order they are issued. Note that when issuing requests from + //! multiple threads on the same ticket the order in which the requests are assigned to the ticket is not guaranteed. + class SpawnableEntitiesDefinition + { + public: + AZ_RTTI(AzFramework::SpawnableEntitiesDefinition, "{A9ED3F1F-4D69-4182-B0CD-EB561EEA7068}"); + + friend class EntitySpawnTicket; + + virtual ~SpawnableEntitiesDefinition() = default; + + //! Spawn instances of all entities in the spawnable. + //! @param spawnable The Spawnable asset that will be used to create entity instances from. + //! @param ticket Stores the results of the call. Use this ticket to spawn additional entities or to despawn them. + //! @param completionCallback Optional callback that's called when spawning entities has completed. This can be called from + //! a different thread than the one that made the function call. The returned list of entities contains all the newly + //! created entities. + virtual void SpawnAllEntities(EntitySpawnTicket& ticket, EntitySpawnCallback completionCallback = {}) = 0; + //! Spawn instances of some entities in the spawnable. + //! @param ticket Stores the results of the call. Use this ticket to spawn additional entities or to despawn them. + //! @param entityIndices The indices into the template entities stored in the spawnable that will be used to spawn entities from. + //! @param completionCallback Optional callback that's called when spawning entities has completed. This can be called from + //! a different thread than the one that made this function call. The returned list of entities contains all the newly + //! created entities. + virtual void SpawnEntities(EntitySpawnTicket& ticket, AZStd::vector entityIndices, + EntitySpawnCallback completionCallback = {}) = 0; + //! Removes all entities in the provided list from the environment. + //! @param ticket The ticket previously used to spawn entities with. + //! @param completionCallback Optional callback that's called when despawning entities has completed. This can be called from + //! a different thread than the one that made this function call. + virtual void DespawnAllEntities(EntitySpawnTicket& ticket, EntityDespawnCallback completionCallback = {}) = 0; + + //! Removes all entities in the provided list from the environment and reconstructs the entities from the provided spawnable. + //! @param ticket Stores the results of the call. Use this ticket to spawn additional entities or to despawn them. + //! @param spawnable The spawnable that will replace the existing spawnable. Both need to have the same asset id. + //! @param completionCallback Optional callback that's called when the entities have been reloaded. This can be called from + //! a different thread than the one that made this function call. The returned list of entities contains all the replacement + //! entities. + virtual void ReloadSpawnable(EntitySpawnTicket& ticket, AZ::Data::Asset spawnable, + ReloadSpawnableCallback completionCallback = {}) = 0; + + //! List all entities that are spawned using this ticket. + //! @param ticket Only the entities associated with this ticket will be listed. + //! @param listCallback Required callback that will be called to list the entities on. + virtual void ListEntities(EntitySpawnTicket& ticket, ListEntitiesCallback listCallback) = 0; + //! Claim all entities that are spawned using this ticket. Ownership of the entities is transferred from the ticket to the + //! caller through the callback. After this call the ticket will have no entities associated with it. The caller of + //! this function will need to manage the entities after this call. + //! @param ticket Only the entities associated with this ticket will be released. + //! @param listCallback Required callback that will be called to transfer the entities through. + virtual void ClaimEntities(EntitySpawnTicket& ticket, ClaimEntitiesCallback listCallback) = 0; + + //! Blocks until all operations made on the provided ticket before the barrier call have completed. + virtual void Barrier(EntitySpawnTicket& ticket, BarrierCallback completionCallback) = 0; + + protected: + [[nodiscard]] virtual void* CreateTicket(AZ::Data::Asset&& spawnable) = 0; + virtual void DestroyTicket(void* ticket) = 0; + + template + static T& GetTicketPayload(EntitySpawnTicket& ticket) + { + return *reinterpret_cast(ticket.m_payload); + } + + template + static const T& GetTicketPayload(const EntitySpawnTicket& ticket) + { + return *reinterpret_cast(ticket.m_payload); + } + + template + static T* GetTicketPayload(EntitySpawnTicket* ticket) + { + return reinterpret_cast(ticket->m_payload); + } + + template + static const T* GetTicketPayload(const EntitySpawnTicket* ticket) + { + return reinterpret_cast(ticket->m_payload); + } + }; + + using SpawnableEntitiesInterface = AZ::Interface; +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp new file mode 100644 index 0000000000..4e98616ef1 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp @@ -0,0 +1,457 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace AzFramework +{ + void SpawnableEntitiesManager::SpawnAllEntities(EntitySpawnTicket& ticket, EntitySpawnCallback completionCallback) + { + SpawnAllEntitiesCommand queueEntry; + queueEntry.m_ticket = &ticket; + queueEntry.m_completionCallback = AZStd::move(completionCallback); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = GetTicketPayload(ticket).m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + void SpawnableEntitiesManager::SpawnEntities(EntitySpawnTicket& ticket, AZStd::vector entityIndices, + EntitySpawnCallback completionCallback) + { + SpawnEntitiesCommand queueEntry; + queueEntry.m_ticket = &ticket; + queueEntry.m_entityIndices = AZStd::move(entityIndices); + queueEntry.m_completionCallback = AZStd::move(completionCallback); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = GetTicketPayload(ticket).m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + void SpawnableEntitiesManager::DespawnAllEntities(EntitySpawnTicket& ticket, EntityDespawnCallback completionCallback) + { + DespawnAllEntitiesCommand queueEntry; + queueEntry.m_ticket = &ticket; + queueEntry.m_completionCallback = AZStd::move(completionCallback); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = GetTicketPayload(ticket).m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + void SpawnableEntitiesManager::ReloadSpawnable(EntitySpawnTicket& ticket, AZ::Data::Asset spawnable, + ReloadSpawnableCallback completionCallback) + { + ReloadSpawnableCommand queueEntry; + queueEntry.m_ticket = &ticket; + queueEntry.m_spawnable = AZStd::move(spawnable); + queueEntry.m_completionCallback = AZStd::move(completionCallback); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = GetTicketPayload(ticket).m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + void SpawnableEntitiesManager::ListEntities(EntitySpawnTicket& ticket, ListEntitiesCallback listCallback) + { + AZ_Assert(listCallback, "ListEntities called on spawnable entities without a valid callback to use."); + + ListEntitiesCommand queueEntry; + queueEntry.m_ticket = &ticket; + queueEntry.m_listCallback = AZStd::move(listCallback); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = GetTicketPayload(ticket).m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + void SpawnableEntitiesManager::ClaimEntities(EntitySpawnTicket& ticket, ClaimEntitiesCallback listCallback) + { + AZ_Assert(listCallback, "ClaimEntities called on spawnable entities without a valid callback to use."); + + ClaimEntitiesCommand queueEntry; + queueEntry.m_ticket = &ticket; + queueEntry.m_listCallback = AZStd::move(listCallback); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = GetTicketPayload(ticket).m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + void SpawnableEntitiesManager::Barrier(EntitySpawnTicket& ticket, BarrierCallback completionCallback) + { + AZ_Assert(completionCallback, "Barrier on spawnable entities called without a valid callback to use."); + + BarrierCommand queueEntry; + queueEntry.m_ticket = &ticket; + queueEntry.m_completionCallback = AZStd::move(completionCallback); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = GetTicketPayload(ticket).m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + auto SpawnableEntitiesManager::ProcessQueue() -> CommandQueueStatus + { + AZStd::queue pendingRequestQueue; + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + m_pendingRequestQueue.swap(pendingRequestQueue); + } + + if (!pendingRequestQueue.empty() || !m_delayedQueue.empty()) + { + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + AZ_Assert(serializeContext, "Failed to retrieve serialization context."); + + // Only process the requests that are currently in this queue, not the ones that could be re-added if they still can't complete. + size_t delayedSize = m_delayedQueue.size(); + for (size_t i = 0; i < delayedSize; ++i) + { + Requests& request = m_delayedQueue.front(); + bool result = AZStd::visit([this, serializeContext](auto&& args) -> bool + { + return ProcessRequest(args, *serializeContext); + }, request); + if (!result) + { + m_delayedQueue.emplace_back(AZStd::move(request)); + } + m_delayedQueue.pop_front(); + } + + do + { + while (!pendingRequestQueue.empty()) + { + Requests& request = pendingRequestQueue.front(); + bool result = AZStd::visit([this, serializeContext](auto&& args) -> bool + { + return ProcessRequest(args, *serializeContext); + }, request); + if (!result) + { + m_delayedQueue.emplace_back(AZStd::move(request)); + } + pendingRequestQueue.pop(); + } + + // Spawning entities can result in more entities being queued to spawn. Repeat spawning until the queue is + // empty to avoid a chain of entity spawning getting dragged out over multiple frames. + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + m_pendingRequestQueue.swap(pendingRequestQueue); + } + } while (!pendingRequestQueue.empty()); + } + + return m_delayedQueue.empty() ? CommandQueueStatus::NoCommandLeft : CommandQueueStatus::HasCommandsLeft; + } + + void* SpawnableEntitiesManager::CreateTicket(AZ::Data::Asset&& spawnable) + { + auto result = aznew Ticket(); + result->m_spawnable = AZStd::move(spawnable); + return result; + } + + void SpawnableEntitiesManager::DestroyTicket(void* ticket) + { + DestroyTicketCommand queueEntry; + queueEntry.m_ticket = reinterpret_cast(ticket); + { + AZStd::scoped_lock queueLock(m_pendingRequestQueueMutex); + queueEntry.m_ticketId = reinterpret_cast(ticket)->m_nextTicketId++; + m_pendingRequestQueue.push(AZStd::move(queueEntry)); + } + } + + AZ::Entity* SpawnableEntitiesManager::SpawnSingleEntity(const AZ::Entity& entityTemplate, AZ::SerializeContext& serializeContext) + { + AZ::Entity* clone = serializeContext.CloneObject(&entityTemplate); + AZ_Assert(clone != nullptr, "Failed to clone spawnable entity."); + clone->SetId(AZ::Entity::MakeId()); + GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, clone); + return clone; + } + + bool SpawnableEntitiesManager::ProcessRequest(SpawnAllEntitiesCommand& request, AZ::SerializeContext& serializeContext) + { + Ticket& ticket = GetTicketPayload(*request.m_ticket); + if (ticket.m_spawnable.IsReady() && request.m_ticketId == ticket.m_currentTicketId) + { + size_t spawnedEntitiesCount = ticket.m_spawnedEntities.size(); + + const Spawnable::EntityList& entities = ticket.m_spawnable->GetEntities(); + size_t entitiesSize = entities.size(); + ticket.m_spawnedEntities.reserve(ticket.m_spawnedEntities.size() + entitiesSize); + ticket.m_spawnedEntityIndices.reserve(ticket.m_spawnedEntityIndices.size() + entitiesSize); + + for(size_t i=0; i(*request.m_ticket); + if (ticket.m_spawnable.IsReady() && request.m_ticketId == ticket.m_currentTicketId) + { + size_t spawnedEntitiesCount = ticket.m_spawnedEntities.size(); + + const Spawnable::EntityList& entities = ticket.m_spawnable->GetEntities(); + size_t entitiesSize = entities.size(); + ticket.m_spawnedEntities.reserve(ticket.m_spawnedEntities.size() + entitiesSize); + ticket.m_spawnedEntityIndices.reserve(ticket.m_spawnedEntityIndices.size() + entitiesSize); + + for (size_t index : request.m_entityIndices) + { + ticket.m_spawnedEntities.push_back(SpawnSingleEntity(*entities[index], serializeContext)); + ticket.m_spawnedEntityIndices.push_back(index); + } + ticket.m_loadAll = false; + + if (request.m_completionCallback) + { + request.m_completionCallback(*request.m_ticket, SpawnableConstEntityContainerView( + ticket.m_spawnedEntities.begin() + spawnedEntitiesCount, ticket.m_spawnedEntities.end())); + } + + ticket.m_currentTicketId++; + return true; + } + else + { + return false; + } + } + + bool SpawnableEntitiesManager::ProcessRequest(DespawnAllEntitiesCommand& request, + [[maybe_unused]] AZ::SerializeContext& serializeContext) + { + Ticket& ticket = GetTicketPayload(*request.m_ticket); + if (request.m_ticketId == ticket.m_currentTicketId) + { + for (AZ::Entity* entity : ticket.m_spawnedEntities) + { + if (entity != nullptr) + { + GameEntityContextRequestBus::Broadcast( + &GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendants, entity->GetId()); + } + } + + ticket.m_spawnedEntities.clear(); + ticket.m_spawnedEntityIndices.clear(); + + if (request.m_completionCallback) + { + request.m_completionCallback(*request.m_ticket); + } + + ticket.m_currentTicketId++; + return true; + } + else + { + return false; + } + } + + bool SpawnableEntitiesManager::ProcessRequest(ReloadSpawnableCommand& request, AZ::SerializeContext& serializeContext) + { + Ticket& ticket = GetTicketPayload(*request.m_ticket); + AZ_Assert(ticket.m_spawnable.GetId() == request.m_spawnable.GetId(), + "Spawnable is being reloaded, but the provided spawnable has a different asset id. " + "This will likely result in unexpected entities being created."); + if (ticket.m_spawnable.IsReady() && request.m_ticketId == ticket.m_currentTicketId) + { + // Delete the original entities. + for (AZ::Entity* entity : ticket.m_spawnedEntities) + { + if (entity != nullptr) + { + GameEntityContextRequestBus::Broadcast( + &GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendants, entity->GetId()); + } + } + + // Rebuild the list of entities. + ticket.m_spawnedEntities.clear(); + const Spawnable::EntityList& entities = request.m_spawnable->GetEntities(); + if (ticket.m_loadAll) + { + // The new spawnable may have a different number of entities and since the intent of the user was + // to load every, simply start over. + ticket.m_spawnedEntityIndices.clear(); + + size_t entitiesSize = entities.size(); + for (size_t i = 0; i < entitiesSize; ++i) + { + ticket.m_spawnedEntities.push_back(SpawnSingleEntity(*entities[i], serializeContext)); + ticket.m_spawnedEntityIndices.push_back(i); + } + } + else + { + size_t entitiesSize = entities.size(); + for (size_t index : ticket.m_spawnedEntityIndices) + { + ticket.m_spawnedEntities.push_back( + index < entitiesSize ? SpawnSingleEntity(*entities[index], serializeContext) : nullptr); + } + } + ticket.m_spawnable = AZStd::move(request.m_spawnable); + + if (request.m_completionCallback) + { + request.m_completionCallback(*request.m_ticket, SpawnableConstEntityContainerView( + ticket.m_spawnedEntities.begin(), ticket.m_spawnedEntities.end())); + } + + ticket.m_currentTicketId++; + return true; + } + else + { + return false; + } + } + + bool SpawnableEntitiesManager::ProcessRequest(ListEntitiesCommand& request, [[maybe_unused]] AZ::SerializeContext& serializeContext) + { + Ticket& ticket = GetTicketPayload(*request.m_ticket); + if (request.m_ticketId == ticket.m_currentTicketId) + { + request.m_listCallback(*request.m_ticket, SpawnableConstEntityContainerView( + ticket.m_spawnedEntities.begin(), ticket.m_spawnedEntities.end())); + ticket.m_currentTicketId++; + return true; + } + else + { + return false; + } + } + + bool SpawnableEntitiesManager::ProcessRequest(ClaimEntitiesCommand& request, [[maybe_unused]] AZ::SerializeContext& serializeContext) + { + Ticket& ticket = GetTicketPayload(*request.m_ticket); + if (request.m_ticketId == ticket.m_currentTicketId) + { + request.m_listCallback(*request.m_ticket, SpawnableEntityContainerView( + ticket.m_spawnedEntities.begin(), ticket.m_spawnedEntities.end())); + + ticket.m_spawnedEntities.clear(); + ticket.m_spawnedEntityIndices.clear(); + + ticket.m_currentTicketId++; + return true; + } + else + { + return false; + } + } + + bool SpawnableEntitiesManager::ProcessRequest(BarrierCommand& request, [[maybe_unused]] AZ::SerializeContext& serializeContext) + { + Ticket& ticket = GetTicketPayload(*request.m_ticket); + if (request.m_ticketId == ticket.m_currentTicketId) + { + if (request.m_completionCallback) + { + request.m_completionCallback(*request.m_ticket); + } + + ticket.m_currentTicketId++; + return true; + } + else + { + return false; + } + } + + bool SpawnableEntitiesManager::ProcessRequest(DestroyTicketCommand& request, [[maybe_unused]] AZ::SerializeContext& serializeContext) + { + if (request.m_ticketId == request.m_ticket->m_currentTicketId) + { + for (AZ::Entity* entity : request.m_ticket->m_spawnedEntities) + { + if (entity != nullptr) + { + GameEntityContextRequestBus::Broadcast( + &GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendants, entity->GetId()); + } + } + delete request.m_ticket; + + return true; + } + else + { + return false; + } + } + + bool SpawnableEntitiesManager::IsEqualTicket(const EntitySpawnTicket* lhs, const EntitySpawnTicket* rhs) + { + return GetTicketPayload(lhs) == GetTicketPayload(rhs); + } + + bool SpawnableEntitiesManager::IsEqualTicket(const Ticket* lhs, const EntitySpawnTicket* rhs) + { + return lhs == GetTicketPayload(rhs); + } + + bool SpawnableEntitiesManager::IsEqualTicket(const EntitySpawnTicket* lhs, const Ticket* rhs) + { + return GetTicketPayload(lhs) == rhs; + } + + bool SpawnableEntitiesManager::IsEqualTicket(const Ticket* lhs, const Ticket* rhs) + { + return lhs = rhs; + } +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h new file mode 100644 index 0000000000..29e9ed797b --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h @@ -0,0 +1,160 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + class Entity; + class SerializeContext; +} + +namespace AzFramework +{ + class SpawnableEntitiesManager + : public SpawnableEntitiesInterface::Registrar + { + public: + AZ_RTTI(AzFramework::SpawnableEntitiesManager, "{6E14333F-128C-464C-94CA-A63B05A5E51C}"); + + enum class CommandQueueStatus : bool + { + HasCommandsLeft, + NoCommandLeft + }; + + ~SpawnableEntitiesManager() override = default; + + // + // The following functions are thread safe + // + + void SpawnAllEntities(EntitySpawnTicket& ticket, EntitySpawnCallback completionCallback = {}) override; + void SpawnEntities(EntitySpawnTicket& ticket, AZStd::vector entityIndices, + EntitySpawnCallback completionCallback = {}) override; + void DespawnAllEntities(EntitySpawnTicket& ticket, EntityDespawnCallback completionCallback = {}) override; + + void ReloadSpawnable(EntitySpawnTicket& ticket, AZ::Data::Asset spawnable, + ReloadSpawnableCallback completionCallback = {}) override; + + void ListEntities(EntitySpawnTicket& ticket, ListEntitiesCallback listCallback) override; + void ClaimEntities(EntitySpawnTicket& ticket, ClaimEntitiesCallback listCallback) override; + + void Barrier(EntitySpawnTicket& spawnInfo, BarrierCallback completionCallback) override; + + // + // The following function is thread safe but intended to be run from the main thread. + // + + CommandQueueStatus ProcessQueue(); + + protected: + void* CreateTicket(AZ::Data::Asset&& spawnable) override; + void DestroyTicket(void* ticket) override; + + private: + struct Ticket + { + AZ_CLASS_ALLOCATOR(Ticket, AZ::ThreadPoolAllocator, 0); + static constexpr uint32_t Processing = AZStd::numeric_limits::max(); + + AZStd::vector m_spawnedEntities; + AZStd::vector m_spawnedEntityIndices; + AZ::Data::Asset m_spawnable; + uint32_t m_nextTicketId{ 0 }; //!< Next id for this ticket. + uint32_t m_currentTicketId{ 0 }; //!< The id for the command that should be executed. + bool m_loadAll{ true }; + }; + + struct SpawnAllEntitiesCommand + { + EntitySpawnCallback m_completionCallback; + EntitySpawnTicket* m_ticket; + uint32_t m_ticketId; + }; + struct SpawnEntitiesCommand + { + AZStd::vector m_entityIndices; + EntitySpawnCallback m_completionCallback; + EntitySpawnTicket* m_ticket; + uint32_t m_ticketId; + }; + struct DespawnAllEntitiesCommand + { + EntityDespawnCallback m_completionCallback; + EntitySpawnTicket* m_ticket; + uint32_t m_ticketId; + }; + struct ReloadSpawnableCommand + { + AZ::Data::Asset m_spawnable; + ReloadSpawnableCallback m_completionCallback; + EntitySpawnTicket* m_ticket; + uint32_t m_ticketId; + }; + struct ListEntitiesCommand + { + ListEntitiesCallback m_listCallback; + EntitySpawnTicket* m_ticket; + uint32_t m_ticketId; + }; + struct ClaimEntitiesCommand + { + ClaimEntitiesCallback m_listCallback; + EntitySpawnTicket* m_ticket; + uint32_t m_ticketId; + }; + struct BarrierCommand + { + BarrierCallback m_completionCallback; + EntitySpawnTicket* m_ticket; + uint32_t m_ticketId; + }; + struct DestroyTicketCommand + { + Ticket* m_ticket; + uint32_t m_ticketId; + }; + + using Requests = AZStd::variant; + + AZ::Entity* SpawnSingleEntity(const AZ::Entity& entityTemplate, AZ::SerializeContext& serializeContext); + + bool ProcessRequest(SpawnAllEntitiesCommand& request, AZ::SerializeContext& serializeContext); + bool ProcessRequest(SpawnEntitiesCommand& request, AZ::SerializeContext& serializeContext); + bool ProcessRequest(DespawnAllEntitiesCommand& request, AZ::SerializeContext& serializeContext); + bool ProcessRequest(ReloadSpawnableCommand& request, AZ::SerializeContext& serializeContext); + bool ProcessRequest(ListEntitiesCommand& request, AZ::SerializeContext& serializeContext); + bool ProcessRequest(ClaimEntitiesCommand& request, AZ::SerializeContext& serializeContext); + bool ProcessRequest(BarrierCommand& request, AZ::SerializeContext& serializeContext); + bool ProcessRequest(DestroyTicketCommand& request, AZ::SerializeContext& serializeContext); + + [[nodiscard]] static bool IsEqualTicket(const EntitySpawnTicket* lhs, const EntitySpawnTicket* rhs); + [[nodiscard]] static bool IsEqualTicket(const Ticket* lhs, const EntitySpawnTicket* rhs); + [[nodiscard]] static bool IsEqualTicket(const EntitySpawnTicket* lhs, const Ticket* rhs); + [[nodiscard]] static bool IsEqualTicket(const Ticket* lhs, const Ticket* rhs); + + AZStd::deque m_delayedQueue; //!< Requests that were processed before, but couldn't be completed. + AZStd::queue m_pendingRequestQueue; + AZStd::mutex m_pendingRequestQueueMutex; + }; +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableMonitor.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableMonitor.cpp new file mode 100644 index 0000000000..83a46c360e --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableMonitor.cpp @@ -0,0 +1,158 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +namespace AzFramework +{ + SpawnableMonitor::SpawnableMonitor(AZ::Data::AssetId spawnableAssetId) + { + AZ::Data::AssetBus::MultiHandler::BusConnect(spawnableAssetId); + m_isConnected = true; + } + + SpawnableMonitor::~SpawnableMonitor() + { + Disconnect(); + } + + bool SpawnableMonitor::Connect(AZ::Data::AssetId spawnableAssetId) + { + if (!m_isConnected) + { + AZ::Data::AssetBus::MultiHandler::BusConnect(spawnableAssetId); + m_isConnected = true; + return true; + } + else + { + return false; + } + } + + bool SpawnableMonitor::Disconnect() + { + if (m_isConnected) + { + AZ::Data::AssetBus::MultiHandler::BusDisconnect(); + m_isLoaded = false; + m_isConnected = false; + return true; + } + else + { + return false; + } + } + + bool SpawnableMonitor::IsConnected() const + { + return m_isConnected; + } + + bool SpawnableMonitor::IsLoaded() const + { + return m_isLoaded; + } + + void SpawnableMonitor::OnSpawnableLoaded() + { + } + + void SpawnableMonitor::OnSpawnableUnloaded() + { + } + + void SpawnableMonitor::OnSpawnableReloaded([[maybe_unused]] AZ::Data::Asset&& replacementAsset) + { + OnSpawnableUnloaded(); + OnSpawnableLoaded(); + } + + void SpawnableMonitor::OnSpawnableIssue([[maybe_unused]] IssueType issueType, [[maybe_unused]] AZStd::string_view message) + { + switch (issueType) + { + case IssueType::Error: + AZ_Error("Spawnables", false, "%.*s", AZ_STRING_ARG(message)); + break; + case IssueType::Cancel: + AZ_TracePrintf("Spawnables", "%.*s", AZ_STRING_ARG(message)); + break; + case IssueType::ReloadError: + AZ_TracePrintf("Spawnables", "%.*s", AZ_STRING_ARG(message)); + break; + } + } + + void SpawnableMonitor::OnAssetReady(AZ::Data::Asset asset) + { + AZ_Assert(!m_isLoaded, "Trying to load spawnable %s (%s) for a second time.", + asset.GetHint().c_str(), asset.GetId().ToString().c_str()); + m_isLoaded = true; + OnSpawnableLoaded(); + } + + void SpawnableMonitor::OnAssetReloaded(AZ::Data::Asset asset) + { + AZ_Assert(m_isLoaded, "Trying to reload a spawnable %s (%s) that wasn't loaded.", + asset.GetHint().c_str(), asset.GetId().ToString().c_str()); + OnSpawnableReloaded(AZStd::move(asset)); + } + + void SpawnableMonitor::OnAssetUnloaded([[maybe_unused]] const AZ::Data::AssetId assetId, + [[maybe_unused]] const AZ::Data::AssetType assetType) + { + AZ_Assert(m_isLoaded, "Trying to unload a spawnable %s that was never loaded.", assetId.ToString().c_str()); + m_isLoaded = false; + OnSpawnableUnloaded(); + } + + void SpawnableMonitor::OnAssetError(AZ::Data::Asset asset) + { + if (m_isLoaded) + { + m_isLoaded = false; + OnSpawnableUnloaded(); + } + + AZStd::string message = AZStd::string::format("An error occurred during the loading of spawnable '%s' (%s).", + asset.GetHint().c_str(), asset.GetId().ToString().c_str()); + OnSpawnableIssue(IssueType::Error, message); + } + + void SpawnableMonitor::OnAssetCanceled(AZ::Data::AssetId assetId) + { + if (m_isLoaded) + { + m_isLoaded = false; + OnSpawnableUnloaded(); + } + + AZStd::string message = AZStd::string::format("The loading of spawnable '%s' was canceled.", + assetId.ToString().c_str()); + OnSpawnableIssue(IssueType::Cancel, message); + } + + void SpawnableMonitor::OnAssetReloadError(AZ::Data::Asset asset) + { + if (m_isLoaded) + { + m_isLoaded = false; + OnSpawnableUnloaded(); + } + + AZStd::string message = AZStd::string::format("An error occurred while trying to reload spawnable '%s' (%s).", + asset.GetHint().c_str(), asset.GetId().ToString().c_str()); + OnSpawnableIssue(IssueType::ReloadError, message); + } +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableMonitor.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableMonitor.h new file mode 100644 index 0000000000..93fe04f230 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableMonitor.h @@ -0,0 +1,78 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include + +namespace AzFramework +{ + //! A utility class to make it easier to work with individual spawnables. + //! This class will monitor a spawnable for changes and provides a simplified interface to + //! respond to. + class SpawnableMonitor + : public AZ::Data::AssetBus::MultiHandler + { + public: + enum IssueType + { + Error, + Cancel, + ReloadError + }; + + SpawnableMonitor() = default; + //! Constructs the monitor to immediately start monitoring a specific spawnable. Depending on the state of the + //! spawnable this can result in immediate calls to OnSpawnable* functions. + explicit SpawnableMonitor(AZ::Data::AssetId spawnableAssetId); + //! Destroys the monitor, including disconnecting from the spawnable if connected. + virtual ~SpawnableMonitor(); + + //! Connects the monitor to start monitoring a specific spawnable. Depending on the state of the spawnable this + //! can result in immediate calls to OnSpawnable* functions. If the monitor is already connected this will do + //! nothing and return false. + virtual bool Connect(AZ::Data::AssetId spawnableAssetId); + //! Disconnects from the monitor if connected and otherwise does nothing and returns false. + virtual bool Disconnect(); + + //! Returns true if the monitor is connected and otherwise false. + [[nodiscard]] virtual bool IsConnected() const; + //! Returns true if the monitor tracked the spawnable able being ready for use, otherwise false. + [[nodiscard]] virtual bool IsLoaded() const; + + protected: + //! Called when a spawnable has been loaded and is ready for used. + virtual void OnSpawnableLoaded(); + //! Called when an spawnable has been unloaded and should no longer be used. + virtual void OnSpawnableUnloaded(); + //! Called when a spawnable has been reloaded. Note that if the replacement isn't used to replace + //! the original spawnable then the replacement asset will eventually run out of references and send + //! an OnSpawnableUnloaded event. + virtual void OnSpawnableReloaded(AZ::Data::Asset&& replacementAsset); + //! Called when an error occurred while the Asset Manager did an operation on the spawnable. + virtual void OnSpawnableIssue(IssueType issueType, AZStd::string_view message); + + private: + void OnAssetReady(AZ::Data::Asset asset) override; + void OnAssetReloaded(AZ::Data::Asset asset) override; + void OnAssetUnloaded(const AZ::Data::AssetId assetId, const AZ::Data::AssetType assetType) override; + void OnAssetError(AZ::Data::Asset asset) override; + void OnAssetCanceled(AZ::Data::AssetId assetId) override; + void OnAssetReloadError(AZ::Data::Asset asset) override; + + bool m_isConnected{ false }; + bool m_isLoaded{ false }; + }; +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.cpp index e04299b265..262f006f15 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.cpp @@ -46,28 +46,80 @@ namespace AzFramework services.push_back(AZ_CRC_CE("AssetCatalogService")); } + void SpawnableSystemComponent::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) + { + m_entitiesManager.ProcessQueue(); + RootSpawnableNotificationBus::ExecuteQueuedEvents(); + } + void SpawnableSystemComponent::OnCatalogLoaded([[maybe_unused]] const char* catalogFile) { - if (!m_rootSpawnableInitialized) + if (!m_catalogAvailable) { - auto registry = AZ::SettingsRegistry::Get(); - AZ_Assert(registry, "Unable to check for root spawnable because the Settings Registry is not available."); - if (registry->GetObject(m_rootSpawnable, RootSpawnableRegistryKey) && m_rootSpawnable.GetId().IsValid()) - { - AZ_TracePrintf("Spawnables", "Root spawnable '%s' used.\n", m_rootSpawnable.GetHint().c_str()); - if (!m_rootSpawnable.QueueLoad()) + m_catalogAvailable = true; + LoadRootSpawnableFromSettingsRegistry(); + } + } + + uint64_t SpawnableSystemComponent::AssignRootSpawnable(AZ::Data::Asset rootSpawnable) + { + uint64_t generation = 0; + + if (m_rootSpawnableId == rootSpawnable.GetId()) + { + AZ_TracePrintf("Spawnables", "Root spawnable wasn't updated because it's already assigned to the requested asset."); + return m_rootSpawnableContainer.GetCurrentGeneration(); + } + + if (rootSpawnable.QueueLoad()) + { + m_rootSpawnableId = rootSpawnable.GetId(); + + // Suspend and resume processing in the container that completion calls aren't received until + // everything has been setup to accept callbacks from the call. + m_rootSpawnableContainer.Reset(rootSpawnable); + m_rootSpawnableContainer.SpawnAllEntities(); + generation = m_rootSpawnableContainer.GetCurrentGeneration(); + AZ_TracePrintf("Spawnables", "Root spawnable set to '%s' at generation %zu.\n", rootSpawnable.GetHint().c_str(), + generation); + m_rootSpawnableContainer.Alert( + [newSpawnable = AZStd::move(rootSpawnable)](uint32_t generation) { - AZ_Error("Spawnables", false, "Unable to queue root spawnable for loading.\n"); - } - } - else - { - AZ_Warning("Spawnables", false, "No root spawnable assigned or root spawanble couldnt' be loaded.\n" - "The root spawnable can be assigned in the Settings Registry under the key '%s'.\n", RootSpawnableRegistryKey); - } + RootSpawnableNotificationBus::QueueBroadcast( + &RootSpawnableNotificationBus::Events::OnRootSpawnableAssigned, newSpawnable, generation); + }); + } + else + { + AZ_Error("Spawnables", false, "Unable to queue root spawnable '%s' for loading.", rootSpawnable.GetHint().c_str()); + } + + return generation; + } - m_rootSpawnableInitialized = true; + void SpawnableSystemComponent::ReleaseRootSpawnable() + { + if (m_rootSpawnableContainer.IsSet()) + { + m_rootSpawnableContainer.Alert( + [](uint32_t generation) + { + RootSpawnableNotificationBus::QueueBroadcast(&RootSpawnableNotificationBus::Events::OnRootSpawnableReleased, generation); + }); + m_rootSpawnableContainer.Clear(); } + m_rootSpawnableId = AZ::Data::AssetId(); + } + + void SpawnableSystemComponent::OnRootSpawnableAssigned([[maybe_unused]] AZ::Data::Asset rootSpawnable, + [[maybe_unused]] uint32_t generation) + { + AZ_TracePrintf("Spawnables", "New root spawnable '%s' assigned (generation: %i).\n", rootSpawnable.GetHint().c_str(), generation); + } + + void SpawnableSystemComponent::OnRootSpawnableReleased([[maybe_unused]] uint32_t generation) + { + AZ_TracePrintf("Spawnables", "Generation %i of the root spawnable has been released.\n", generation); } void SpawnableSystemComponent::Activate() @@ -83,14 +135,105 @@ namespace AzFramework &AZ::Data::AssetCatalogRequestBus::Events::AddExtension, Spawnable::FileExtension); AssetCatalogEventBus::Handler::BusConnect(); + RootSpawnableNotificationBus::Handler::BusConnect(); + AZ::TickBus::Handler::BusConnect(); + + auto registry = AZ::SettingsRegistry::Get(); + AZ_Assert(registry, "Unable to change root spawnable callback because Settings Registry is not available."); + m_registryChangeHandler = registry->RegisterNotifier([this](AZStd::string_view path, AZ::SettingsRegistryInterface::Type /*type*/) + { + if (path.starts_with(RootSpawnableRegistryKey)) + { + LoadRootSpawnableFromSettingsRegistry(); + } + }); } void SpawnableSystemComponent::Deactivate() { + m_registryChangeHandler.Disconnect(); + + AZ::TickBus::Handler::BusDisconnect(); + RootSpawnableNotificationBus::Handler::BusDisconnect(); AssetCatalogEventBus::Handler::BusDisconnect(); - AZ_Assert(AZ::Data::AssetManager::IsReady(), - "Spawnables can't be unregistered because the Asset Manager has been destroyed already or never started."); + if (m_catalogAvailable) + { + ReleaseRootSpawnable(); + + // The SpawnalbleSystemComponent needs to guarantee there's no more processing left to do by the + // entity manager before it can safely destroy it on shutdown, but also to make sure that are no + // more calls to the callback registered to the root spawnable as that accesses this component. + m_rootSpawnableContainer.Clear(); + SpawnableEntitiesManager::CommandQueueStatus queueStatus; + do + { + queueStatus = m_entitiesManager.ProcessQueue(); + } while (queueStatus == SpawnableEntitiesManager::CommandQueueStatus::HasCommandsLeft); + } + AZ::Data::AssetManager::Instance().UnregisterHandler(&m_assetHandler); } + + void SpawnableSystemComponent::LoadRootSpawnableFromSettingsRegistry() + { + AZ_Assert(m_catalogAvailable, "Attempting to load root spawnable while the catalog is not available yet."); + + auto registry = AZ::SettingsRegistry::Get(); + AZ_Assert(registry, "Unable to check for root spawnable because the Settings Registry is not available."); + + AZ::SettingsRegistryInterface::Type rootSpawnableKeyType = registry->GetType(RootSpawnableRegistryKey); + if (rootSpawnableKeyType == AZ::SettingsRegistryInterface::Type::Object) + { + AZ::Data::Asset rootSpawnable; + if (registry->GetObject(rootSpawnable, RootSpawnableRegistryKey) && rootSpawnable.GetId().IsValid()) + { + AssignRootSpawnable(AZStd::move(rootSpawnable)); + } + else + { + AZ_Warning("Spawnables", false, "Root spawnable couldn't be queued for loading"); + ReleaseRootSpawnable(); + } + } + else if (rootSpawnableKeyType == AZ::SettingsRegistryInterface::Type::String) + { + AZStd::string rootSpawnableName; + if (registry->Get(rootSpawnableName, RootSpawnableRegistryKey)) + { + AZ::Data::AssetId rootSpawnableId; + AZ::Data::AssetCatalogRequestBus::BroadcastResult( + rootSpawnableId, &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, rootSpawnableName.c_str(), + azrtti_typeid(), false); + if (rootSpawnableId.IsValid()) + { + AZ::Data::Asset rootSpawnable = AZ::Data::Asset(rootSpawnableId, azrtti_typeid()); + if (rootSpawnable.GetId().IsValid()) + { + AssignRootSpawnable(AZStd::move(rootSpawnable)); + } + else + { + AZ_Warning( + "Spawnables", false, "Root spawnable at '%s' couldn't be queued for loading.", rootSpawnableName.c_str()); + ReleaseRootSpawnable(); + } + } + else + { + AZ_Warning( + "Spawnables", false, "Root spawnable with name '%s' wasn't found in the asset catalog.", rootSpawnableName.c_str()); + ReleaseRootSpawnable(); + } + } + } + else if (rootSpawnableKeyType == AZ::SettingsRegistryInterface::Type::NoType) + { + AZ_Warning( + "Spawnables", false, + "No root spawnable assigned. The root spawnable can be assigned in the Settings Registry under the key '%s'.\n", + RootSpawnableRegistryKey); + ReleaseRootSpawnable(); + } + } } // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h index cb1afe5901..b29fbea5e4 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h @@ -13,15 +13,24 @@ #pragma once #include +#include +#include +#include #include +#include #include #include +#include +#include namespace AzFramework { class SpawnableSystemComponent : public AZ::Component + , public AZ::TickBus::Handler , public AssetCatalogEventBus::Handler + , public RootSpawnableInterface::Registrar + , public RootSpawnableNotificationBus::Handler { public: AZ_COMPONENT(SpawnableSystemComponent, "{12D0DA52-BB86-4AC3-8862-9493E0D0E207}"); @@ -35,23 +44,53 @@ namespace AzFramework SpawnableSystemComponent& operator=(const SpawnableSystemComponent&) = delete; SpawnableSystemComponent& operator=(SpawnableSystemComponent&&) = delete; + // + // Component + // + static void Reflect(AZ::ReflectContext* context); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services); static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services); static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& services); + // + // TickBus + // + + void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; + // // AssetCatalogEventBus // void OnCatalogLoaded(const char* catalogFile) override; + // + // RootSpawnableInterface + // + + uint64_t AssignRootSpawnable(AZ::Data::Asset rootSpawnable) override; + void ReleaseRootSpawnable() override; + + // + // RootSpawnbleNotificationBus + // + + void OnRootSpawnableAssigned(AZ::Data::Asset rootSpawnable, uint32_t generation) override; + void OnRootSpawnableReleased(uint32_t generation) override; + protected: void Activate() override; void Deactivate() override; + void LoadRootSpawnableFromSettingsRegistry(); + SpawnableAssetHandler m_assetHandler; - AZ::Data::Asset m_rootSpawnable; - bool m_rootSpawnableInitialized{ false }; + SpawnableEntitiesManager m_entitiesManager; + SpawnableEntitiesContainer m_rootSpawnableContainer; + AZ::SettingsRegistryInterface::NotifyEventHandler m_registryChangeHandler; + + AZ::Data::AssetId m_rootSpawnableId; + bool m_catalogAvailable{ false }; }; } // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.cpp b/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.cpp new file mode 100644 index 0000000000..b23bd7e42a --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.cpp @@ -0,0 +1,121 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "TestDebugDisplayRequests.h" + +namespace UnitTest +{ + TestDebugDisplayRequests::TestDebugDisplayRequests() + { + m_transforms.push(AZ::Transform::CreateIdentity()); + } + + const AZStd::vector& TestDebugDisplayRequests::GetPoints() const + { + return m_points; + } + + void TestDebugDisplayRequests::ClearPoints() + { + m_points.clear(); + } + + AZ::Aabb TestDebugDisplayRequests::GetAabb() const + { + return m_points.size() > 0 ? AZ::Aabb::CreatePoints(m_points.data(), m_points.size()) : AZ::Aabb::CreateNull(); + } + + void TestDebugDisplayRequests::DrawWireBox(const AZ::Vector3& min, const AZ::Vector3& max) + { + const AZ::Transform& tm = m_transforms.back(); + m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), min.GetY(), min.GetZ()))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), min.GetY(), max.GetZ()))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), max.GetY(), min.GetZ()))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), max.GetY(), max.GetZ()))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), min.GetY(), min.GetZ()))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), min.GetY(), max.GetZ()))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), max.GetY(), min.GetZ()))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), max.GetY(), max.GetZ()))); + } + + void TestDebugDisplayRequests::DrawSolidBox(const AZ::Vector3& min, const AZ::Vector3& max) + { + DrawWireBox(min, max); + } + + void TestDebugDisplayRequests::DrawWireQuad(float width, float height) + { + const AZ::Transform& tm = m_transforms.back(); + m_points.push_back(tm.TransformPoint(AZ::Vector3(-0.5f * width, 0.0f, -0.5f * height))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(-0.5f * width, 0.0f, 0.5f * height))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(0.5f * width, 0.0f, -0.5f * height))); + m_points.push_back(tm.TransformPoint(AZ::Vector3(0.5f * width, 0.0f, 0.5f * height))); + } + + void TestDebugDisplayRequests::DrawQuad(float width, float height) + { + DrawWireQuad(width, height); + } + + void TestDebugDisplayRequests::DrawPoints(const AZStd::vector& points) + { + const AZ::Transform& tm = m_transforms.back(); + for (const auto& point : points) + { + m_points.push_back(tm.TransformPoint(point)); + } + } + + void TestDebugDisplayRequests::DrawTriangles(const AZStd::vector& vertices, [[maybe_unused]] const AZ::Color& color) + { + DrawPoints(vertices); + } + + void TestDebugDisplayRequests::DrawTrianglesIndexed(const AZStd::vector& vertices, + [[maybe_unused]] const AZStd::vector& indices, [[maybe_unused]] const AZ::Color& color) + { + DrawPoints(vertices); + } + + void TestDebugDisplayRequests::DrawLine(const AZ::Vector3& p1, const AZ::Vector3& p2) + { + DrawPoints({ p1, p2 }); + } + + void TestDebugDisplayRequests::DrawLine(const AZ::Vector3& p1, const AZ::Vector3& p2, + [[maybe_unused]] const AZ::Vector4& col1, [[maybe_unused]] const AZ::Vector4& col2) + { + DrawPoints({ p1, p2 }); + } + + void TestDebugDisplayRequests::DrawLines(const AZStd::vector& lines, [[maybe_unused]] const AZ::Color& color) + { + DrawPoints(lines); + } + + void TestDebugDisplayRequests::PushMatrix(const AZ::Transform& tm) + { + m_transforms.push(m_transforms.back() * tm); + } + + void TestDebugDisplayRequests::PopMatrix() + { + if (m_transforms.size() == 1) + { + AZ_Error("TestDebugDisplayRequest", false, "Invalid call to PopMatrix when no matrices were pushed."); + } + else + { + m_transforms.pop(); + } + } +} // namespace UnitTest diff --git a/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.h b/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.h new file mode 100644 index 0000000000..0f3bebcd94 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.h @@ -0,0 +1,46 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once +#include + +namespace UnitTest +{ + //! Minimal implementation of DebugDisplayRequests to support testing shapes. + //! Stores a list of points based on received draw calls to delineate the exterior of the object requested to be drawn. + class TestDebugDisplayRequests : public AzFramework::DebugDisplayRequests + { + public: + TestDebugDisplayRequests(); + const AZStd::vector& GetPoints() const; + void ClearPoints(); + //! Returns the AABB of the points generated from received draw calls. + AZ::Aabb GetAabb() const; + + // DebugDisplayRequests ... + void DrawWireBox(const AZ::Vector3& min, const AZ::Vector3& max) override; + void DrawSolidBox(const AZ::Vector3& min, const AZ::Vector3& max) override; + void DrawWireQuad(float width, float height) override; + void DrawQuad(float width, float height) override; + void DrawTriangles(const AZStd::vector& vertices, const AZ::Color& color) override; + void DrawTrianglesIndexed(const AZStd::vector& vertices, const AZStd::vector& indices, const AZ::Color& color) override; + void DrawLine(const AZ::Vector3& p1, const AZ::Vector3& p2) override; + void DrawLine(const AZ::Vector3& p1, const AZ::Vector3& p2, const AZ::Vector4& col1, const AZ::Vector4& col2) override; + void DrawLines(const AZStd::vector& lines, const AZ::Color& color) override; + void PushMatrix(const AZ::Transform& tm) override; + void PopMatrix() override; + private: + void DrawPoints(const AZStd::vector& points); + AZStd::vector m_points; + AZStd::stack m_transforms; + }; +} // namespace UnitTest diff --git a/Code/Framework/AzFramework/AzFramework/azframework_files.cmake b/Code/Framework/AzFramework/AzFramework/azframework_files.cmake index 5f2af8c6de..66911010eb 100644 --- a/Code/Framework/AzFramework/AzFramework/azframework_files.cmake +++ b/Code/Framework/AzFramework/AzFramework/azframework_files.cmake @@ -82,8 +82,6 @@ set(FILES CommandLine/CommandLine.h CommandLine/CommandRegistrationBus.h Debug/DebugCameraBus.h - Engine/Engine.cpp - Engine/Engine.h Viewport/ViewportBus.h Viewport/ViewportBus.cpp Viewport/ViewportColors.h @@ -212,19 +210,41 @@ set(FILES StreamingInstall/StreamingInstall.cpp StreamingInstall/StreamingInstallRequests.h StreamingInstall/StreamingInstallNotifications.h - Physics/Configuration/CollisionConfiguration.h - Physics/Configuration/CollisionConfiguration.cpp + Physics/Common/PhysicsSceneQueries.h + Physics/Common/PhysicsSceneQueries.cpp Physics/Common/PhysicsEvents.h + Physics/Common/PhysicsSimulatedBody.h + Physics/Common/PhysicsSimulatedBody.cpp + Physics/Common/PhysicsSimulatedBodyAutomation.h + Physics/Common/PhysicsSimulatedBodyAutomation.cpp + Physics/Common/PhysicsSimulatedBodyEvents.h + Physics/Common/PhysicsSimulatedBodyEvents.cpp Physics/Common/PhysicsTypes.h + Physics/Collision/CollisionEvents.h + Physics/Collision/CollisionEvents.cpp Physics/Collision/CollisionLayers.h Physics/Collision/CollisionLayers.cpp Physics/Collision/CollisionGroups.h Physics/Collision/CollisionGroups.cpp + Physics/Configuration/CollisionConfiguration.h + Physics/Configuration/CollisionConfiguration.cpp + Physics/Configuration/RigidBodyConfiguration.h + Physics/Configuration/RigidBodyConfiguration.cpp + Physics/Configuration/StaticRigidBodyConfiguration.h + Physics/Configuration/StaticRigidBodyConfiguration.cpp + Physics/Configuration/SceneConfiguration.h + Physics/Configuration/SceneConfiguration.cpp + Physics/Configuration/SimulatedBodyConfiguration.h + Physics/Configuration/SimulatedBodyConfiguration.cpp Physics/Configuration/SystemConfiguration.h Physics/Configuration/SystemConfiguration.cpp - Physics/Configuration/SceneConfiguration.cpp - Physics/Configuration/SceneConfiguration.h + Physics/SimulatedBodies/RigidBody.h + Physics/SimulatedBodies/RigidBody.cpp + Physics/SimulatedBodies/StaticRigidBody.h + Physics/SimulatedBodies/StaticRigidBody.cpp Physics/PhysicsSystem.h + Physics/PhysicsSystem.cpp + Physics/PhysicsScene.cpp Physics/PhysicsScene.h Physics/AnimationConfiguration.cpp Physics/AnimationConfiguration.h @@ -236,20 +256,12 @@ set(FILES Physics/Material.h Physics/NameConstants.cpp Physics/NameConstants.h - Physics/RigidBody.cpp - Physics/RigidBody.h Physics/RigidBodyBus.h Physics/Shape.cpp Physics/Shape.h Physics/ShapeConfiguration.h Physics/ShapeConfiguration.cpp Physics/SystemBus.h - Physics/World.cpp - Physics/World.h - Physics/Casts.h - Physics/Casts.cpp - Physics/WorldBody.cpp - Physics/WorldBody.h Physics/WorldBodyBus.h Physics/ColliderComponentBus.h Physics/RagdollPhysicsBus.h @@ -261,19 +273,18 @@ set(FILES Physics/Utils.cpp Physics/Joint.h Physics/Joint.cpp - Physics/TriggerBus.h - Physics/CollisionNotificationBus.h Physics/ClassConverters.cpp Physics/ClassConverters.h Physics/MaterialBus.h - Physics/WorldEventhandler.h - Physics/ScriptCanvasPhysicsUtils.h - Physics/ScriptCanvasPhysicsUtils.cpp Process/ProcessCommunicator.cpp Process/ProcessCommunicator.h Process/ProcessWatcher.cpp Process/ProcessWatcher.h Process/ProcessCommon_fwd.h + Process/ProcessCommunicator.h + Process/ProcessWatcher.cpp + Process/ProcessWatcher.h + Process/ProcessCommon_fwd.h ProjectManager/ProjectManager.h ProjectManager/ProjectManager.cpp Render/GameIntersectorComponent.h @@ -283,12 +294,21 @@ set(FILES Render/Intersector.cpp Render/Intersector.h Render/IntersectorInterface.h + Spawnable/RootSpawnableInterface.h Spawnable/Spawnable.cpp Spawnable/Spawnable.h Spawnable/SpawnableAssetHandler.h Spawnable/SpawnableAssetHandler.cpp + Spawnable/SpawnableEntitiesContainer.h + Spawnable/SpawnableEntitiesContainer.cpp + Spawnable/SpawnableEntitiesInterface.h + Spawnable/SpawnableEntitiesInterface.cpp + Spawnable/SpawnableEntitiesManager.h + Spawnable/SpawnableEntitiesManager.cpp Spawnable/SpawnableMetaData.cpp Spawnable/SpawnableMetaData.h + Spawnable/SpawnableMonitor.h + Spawnable/SpawnableMonitor.cpp Spawnable/SpawnableSystemComponent.h Spawnable/SpawnableSystemComponent.cpp Terrain/TerrainDataRequestBus.h @@ -388,6 +408,8 @@ set(FILES FileTag/FileTagComponent.h FileTag/FileTagComponent.cpp UnitTest/FrameworkTestTypes.h + UnitTest/TestDebugDisplayRequests.h + UnitTest/TestDebugDisplayRequests.cpp Slice/SliceEntityBus.h Slice/SliceInstantiationBus.h Slice/SliceInstantiationTicket.h diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp index a3c74ded03..55f3b03e1e 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp @@ -10,7 +10,6 @@ * */ -#if AZ_TRAIT_OS_PLATFORM_APPLE #include #include #include @@ -242,4 +241,3 @@ namespace AzFramework } } // namespace AzFramework -#endif // AZ_TRAIT_OS_PLATFORM_APPLE diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessWatcher_Mac.cpp b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessWatcher_Mac.cpp index 93bfe57d54..4549ab928f 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessWatcher_Mac.cpp +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessWatcher_Mac.cpp @@ -11,7 +11,6 @@ */ -#if AZ_TRAIT_OS_PLATFORM_APPLE #include #include @@ -433,4 +432,3 @@ namespace AzFramework } } //namespace AzFramework -#endif // AZ_TRAIT_OS_PLATFORM_APPLE diff --git a/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp b/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp index 5214607edc..4bd4ed5a40 100644 --- a/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp +++ b/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp @@ -59,7 +59,8 @@ namespace AzGameFramework AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_TargetBuildDependencyRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); #if defined(AZ_DEBUG_BUILD) || defined(AZ_PROFILE_BUILD) - AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_UserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(registry, m_commandLine, true); #endif @@ -75,7 +76,8 @@ namespace AzGameFramework } #if defined(AZ_DEBUG_BUILD) || defined(AZ_PROFILE_BUILD) - AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_UserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(registry, m_commandLine, true); #endif } diff --git a/Code/Framework/AzNetworking/AzNetworking/Serialization/AzContainerSerializers.h b/Code/Framework/AzNetworking/AzNetworking/Serialization/AzContainerSerializers.h index 1d9371c284..70dc7847d2 100644 --- a/Code/Framework/AzNetworking/AzNetworking/Serialization/AzContainerSerializers.h +++ b/Code/Framework/AzNetworking/AzNetworking/Serialization/AzContainerSerializers.h @@ -19,6 +19,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include #include namespace AzNetworking @@ -238,4 +245,66 @@ namespace AzNetworking return SerializeAzContainer::Serialize(serializer, container); } }; + + // Az Types + template <> + struct SerializeObjectHelper + { + static bool SerializeObject(ISerializer& serializer, AZ::Vector2& value) + { + float values[4]; + value.StoreToFloat2(values); + serializer.Serialize(values[0], "xValue"); + serializer.Serialize(values[1], "yValue"); + value = AZ::Vector2::CreateFromFloat2(values); + return serializer.IsValid(); + } + }; + + template <> + struct SerializeObjectHelper + { + static bool SerializeObject(ISerializer& serializer, AZ::Vector3& value) + { + float values[4]; + value.StoreToFloat3(values); + serializer.Serialize(values[0], "xValue"); + serializer.Serialize(values[1], "yValue"); + serializer.Serialize(values[1], "zValue"); + value = AZ::Vector3::CreateFromFloat3(values); + return serializer.IsValid(); + } + }; + + template <> + struct SerializeObjectHelper + { + static bool SerializeObject(ISerializer& serializer, AZ::Vector4& value) + { + float values[4]; + value.StoreToFloat4(values); + serializer.Serialize(values[0], "xValue"); + serializer.Serialize(values[1], "yValue"); + serializer.Serialize(values[1], "zValue"); + serializer.Serialize(values[1], "wValue"); + value = AZ::Vector4::CreateFromFloat4(values); + return serializer.IsValid(); + } + }; + + template <> + struct SerializeObjectHelper + { + static bool SerializeObject(ISerializer& serializer, AZ::Quaternion& value) + { + float values[4]; + value.StoreToFloat4(values); + serializer.Serialize(values[0], "xValue"); + serializer.Serialize(values[1], "yValue"); + serializer.Serialize(values[1], "zValue"); + serializer.Serialize(values[1], "wValue"); + value = AZ::Quaternion::CreateFromFloat4(values); + return serializer.IsValid(); + } + }; } diff --git a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp index b9a770162a..78020cb09d 100644 --- a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp +++ b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocket.cpp @@ -157,7 +157,7 @@ namespace AzNetworking } else if (receivedBytes == 0) { - // Clean disconnect, force the endpoint to disconnect and cleanup + // Clean disconnect, force the endpoint to disconnect and cleanup return SocketOpResultDisconnected; } diff --git a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TlsSocket.cpp b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TlsSocket.cpp index 97db3f2407..e07815a48a 100644 --- a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TlsSocket.cpp +++ b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TlsSocket.cpp @@ -222,7 +222,7 @@ namespace AzNetworking } else if (receivedBytes == 0) { - // Clean disconnect, force the endpoint to disconnect and cleanup + // Clean disconnect, force the endpoint to disconnect and cleanup return SocketOpResultDisconnected; } return receivedBytes; diff --git a/Code/Framework/AzQtComponents/AzQtComponents/AzQtComponentsAPI.h b/Code/Framework/AzQtComponents/AzQtComponents/AzQtComponentsAPI.h index 8ee8f4fa44..42e76551b3 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/AzQtComponentsAPI.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/AzQtComponentsAPI.h @@ -14,7 +14,7 @@ /** * \mainpage * - * Introduced with Amazon Lumberyard version 1.25 and the release of UI 2.0, Lumberyard’s + * Introduced with Amazon Lumberyard version 1.25 and the release of UI 2.0, Lumberyard's * custom Qt widget library provides developers with access to the same UI components used * throughout Lumberyard. Using this library, UI developers can build their own tools and * extensions for Lumberyard, while maintaining a coherent and standardized UI experience. diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity.svg new file mode 100644 index 0000000000..54f0e10960 --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity.svg @@ -0,0 +1,10 @@ + + + + icon / outliner / entity / Default + Created with Sketch. + + + + + \ No newline at end of file diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_editoronly.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_editoronly.svg new file mode 100644 index 0000000000..e7007b6d62 --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_editoronly.svg @@ -0,0 +1,10 @@ + + + + icon / outliner / entity / Editor only - Default + Created with Sketch. + + + + + \ No newline at end of file diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_notactive.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_notactive.svg new file mode 100644 index 0000000000..2d206dd943 --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_notactive.svg @@ -0,0 +1,10 @@ + + + + icon / outliner / entity / Not active - Default + Created with Sketch. + + + + + \ No newline at end of file diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/layer.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/layer.svg new file mode 100644 index 0000000000..32676441ff --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/layer.svg @@ -0,0 +1,13 @@ + + + + icon / outliner / layer / default + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab.svg new file mode 100644 index 0000000000..71fc2c9c8c --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab.svg @@ -0,0 +1,7 @@ + + + icon / prefab / default + + + + \ No newline at end of file diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab_edit.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab_edit.svg new file mode 100644 index 0000000000..a7819953ba --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab_edit.svg @@ -0,0 +1,7 @@ + + + icon / prefab / edit + + + + \ No newline at end of file diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc b/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc index 3e4a57b1de..cc7ab1ad84 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc @@ -1,4 +1,12 @@ + + Entity/entity.svg + Entity/entity_editoronly.svg + Entity/entity_notactive.svg + Entity/layer.svg + Entity/prefab.svg + Entity/prefab_edit.svg + Notifications/checkmark.svg Notifications/download.svg diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorEntityAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorEntityAPI.h new file mode 100644 index 0000000000..f51af58c51 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorEntityAPI.h @@ -0,0 +1,58 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include + +namespace AzToolsFramework +{ + using EntityIdList = AZStd::vector; + + /*! + * EditorEntityAPI + * Handles basic Entity operations + */ + class EditorEntityAPI + { + public: + AZ_RTTI(EditorEntityAPI, "{3E217E21-046F-462E-8FA2-1347FBDDFDE7}"); + + /** + * Delete all currently-selected entities. + */ + virtual void DeleteSelected() = 0; + + /** + * Deletes the specified entity. + */ + virtual void DeleteEntityById(AZ::EntityId entityId) = 0; + + /** + * Deletes all specified entities. + */ + virtual void DeleteEntities(const EntityIdList& entities) = 0; + + /** + * Deletes the specified entity, as well as any transform descendants. + */ + virtual void DeleteEntityAndAllDescendants(AZ::EntityId entityId) = 0; + + /** + * Deletes all entities in the provided list, as well as their transform descendants. + */ + virtual void DeleteEntitiesAndAllDescendants(const EntityIdList& entities) = 0; + }; + +} // namespace AzToolsFramework + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h index a7588352bf..fc641cea33 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h @@ -588,13 +588,6 @@ namespace AzToolsFramework */ virtual const char* GetEngineVersion() const = 0; - /** - * Retrieves if Legacy Slice System is enabled - */ - virtual bool IsLegacySliceSystemEnabled() const = 0; - - virtual bool ShouldAssertForLegacySlicesUsage() const = 0; - /** * Creates and adds a new entity to the tools application from components which match at least one of the requiredTags * The tag matching occurs on AZ::Edit::SystemComponentTags attribute from the reflected class data in the serialization context diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.cpp new file mode 100644 index 0000000000..80d7fc7c5a --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.cpp @@ -0,0 +1,64 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +#include + +namespace AzToolsFramework +{ + void EditorEntityManager::Start() + { + m_prefabPublicInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabPublicInterface, "EditorEntityManager - Could not retrieve instance of PrefabPublicInterface"); + + AZ::Interface::Register(this); + } + + EditorEntityManager::~EditorEntityManager() + { + // Attempting to Unregister if we never registerd (e.g. if Start() was never called) throws an error, so check that first + EditorEntityAPI* editorEntityInterface = AZ::Interface::Get(); + if (editorEntityInterface == this) + { + AZ::Interface::Unregister(this); + } + } + + void EditorEntityManager::DeleteSelected() + { + EntityIdList selectedEntities; + ToolsApplicationRequestBus::BroadcastResult(selectedEntities, &ToolsApplicationRequests::GetSelectedEntities); + m_prefabPublicInterface->DeleteEntitiesInInstance(selectedEntities); + } + + void EditorEntityManager::DeleteEntityById(AZ::EntityId entityId) + { + DeleteEntities({entityId}); + } + + void EditorEntityManager::DeleteEntities(const EntityIdList& entities) + { + m_prefabPublicInterface->DeleteEntitiesInInstance(entities); + } + + void EditorEntityManager::DeleteEntityAndAllDescendants(AZ::EntityId entityId) + { + DeleteEntitiesAndAllDescendants({entityId}); + } + + void EditorEntityManager::DeleteEntitiesAndAllDescendants(const EntityIdList& entities) + { + m_prefabPublicInterface->DeleteEntitiesAndAllDescendantsInInstance(entities); + } +} + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h new file mode 100644 index 0000000000..580ad22bda --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h @@ -0,0 +1,39 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include +#include + +namespace AzToolsFramework +{ + class EditorEntityManager + : public EditorEntityAPI + { + public: + ~EditorEntityManager(); + + void Start(); + + // EditorEntityAPI... + void DeleteSelected() override; + void DeleteEntityById(AZ::EntityId entityId) override; + void DeleteEntities(const EntityIdList& entities) override; + void DeleteEntityAndAllDescendants(AZ::EntityId entityId) override; + void DeleteEntitiesAndAllDescendants(const EntityIdList& entities) override; + + private: + Prefab::PrefabPublicInterface* m_prefabPublicInterface = nullptr; + }; + +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp index 0ebba3a1d9..307d06129d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp @@ -68,6 +68,8 @@ #include #include #include +#include +#include #include AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // 4251: 'QFileInfo::d_ptr': class 'QSharedDataPointer' needs to have dll-interface to be used by clients of class 'QFileInfo' @@ -78,7 +80,6 @@ AZ_POP_DISABLE_OVERRIDE_WARNING #include #include - // Not possible to use AZCore's operator new overrides until we address the overall problems // with allocators, or more likely convert AzToolsFramework to a DLL and restrict overloading to // within the DLL. Since this is currently linked as a lib, overriding new and delete would require @@ -95,9 +96,6 @@ namespace AzToolsFramework static const char* s_startupLogWindow = "Startup"; - static const char* s_prefabSystemKey = "/Amazon/Editor/Preferences/EnablePrefabSystem"; - static const char* s_legacySlicesAssertKey = "/Amazon/Editor/Preferences/ShouldAssertForLegacySlicesUsage"; - template void DeleteEntities(const IdContainerType& entityIds) { @@ -341,8 +339,9 @@ namespace AzToolsFramework , m_isInIsolationMode(false) { ToolsApplicationRequests::Bus::Handler::BusConnect(); - m_engineConfigImpl.reset(new ToolsApplication::EngineConfigImpl(AzToolsFramework::Internal::s_startupLogWindow, - AzToolsFramework::Internal::s_engineConfigFileName)); + m_engineConfigImpl.reset(new ToolsApplication::EngineConfigImpl(AzToolsFramework::Internal::s_startupLogWindow, AzToolsFramework::Internal::s_engineConfigFileName)); + + m_undoCache.RegisterToUndoCacheInterface(); } ToolsApplication::~ToolsApplication() @@ -393,6 +392,11 @@ namespace AzToolsFramework { Application::Start(descriptor, startupParameters); InitializeEngineConfig(); + + m_editorEntityManager.Start(); + + m_editorEntityAPI = AZ::Interface::Get(); + AZ_Assert(m_editorEntityAPI, "ToolsApplication - Could not retrieve instance of EditorEntityAPI"); } void ToolsApplication::InitializeEngineConfig() @@ -416,7 +420,11 @@ namespace AzToolsFramework { FlushUndo(); - m_undoCache.Clear(); + auto undoCacheInterface = AZ::Interface::Get(); + if (undoCacheInterface) + { + undoCacheInterface->Clear(); + } delete m_undoStack; m_undoStack = nullptr; @@ -426,6 +434,19 @@ namespace AzToolsFramework m_highlightedEntities.set_capacity(0); m_dirtyEntities = {}; + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + if (isPrefabSystemEnabled) + { + // This resets the editor context thereby asking the systems that own the entities to destroy them. By doing this, we are + // duly giving the authority to delete the entities to the systems that owns them, rather than leaving it to the + // ComponentApplication to do the cleanup. + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequestBus::Events::ResetEditorContext); + } + GetSerializeContext()->DestroyEditContext(); Application::Stop(); @@ -554,7 +575,11 @@ namespace AzToolsFramework { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); - m_undoCache.PurgeCache(entity->GetId()); + auto undoCacheInterface = AZ::Interface::Get(); + if (undoCacheInterface) + { + undoCacheInterface->PurgeCache(entity->GetId()); + } MarkEntityDeselected(entity->GetId()); SetEntityHighlighted(entity->GetId(), false); @@ -724,7 +749,6 @@ namespace AzToolsFramework void ToolsApplication::SetEntityHighlighted(AZ::EntityId entityId, bool highlighted) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); - AZ_Assert(entityId.IsValid(), "Attempting to mark an invalid entity as highlighted."); auto foundIter = AZStd::find(m_highlightedEntities.begin(), m_highlightedEntities.end(), entityId); if (foundIter != m_highlightedEntities.end()) @@ -893,16 +917,34 @@ namespace AzToolsFramework void ToolsApplication::DeleteSelected() { + if (IsPrefabSystemEnabled()) + { + m_editorEntityAPI->DeleteSelected(); + return; + } + Internal::DeleteEntities(m_selectedEntities); } void ToolsApplication::DeleteEntityAndAllDescendants(AZ::EntityId entityId) { + if (IsPrefabSystemEnabled()) + { + m_editorEntityAPI->DeleteEntityAndAllDescendants(entityId); + return; + } + DeleteEntitiesAndAllDescendants({ entityId }); } void ToolsApplication::DeleteEntitiesAndAllDescendants(const EntityIdList& entities) { + if (IsPrefabSystemEnabled()) + { + m_editorEntityAPI->DeleteEntitiesAndAllDescendants(entities); + return; + } + const EntityIdSet entitiesAndDescendants = GatherEntitiesAndAllDescendents(entities); Internal::DeleteEntities(entitiesAndDescendants); } @@ -1367,11 +1409,23 @@ namespace AzToolsFramework void ToolsApplication::DeleteEntityById(AZ::EntityId entityId) { + if (IsPrefabSystemEnabled()) + { + m_editorEntityAPI->DeleteEntityById(entityId); + return; + } + DeleteEntities({ entityId }); } void ToolsApplication::DeleteEntities(const EntityIdList& entities) { + if (IsPrefabSystemEnabled()) + { + m_editorEntityAPI->DeleteEntities(entities); + return; + } + Internal::DeleteEntities(entities); } @@ -1572,7 +1626,6 @@ namespace AzToolsFramework else { // we're at the root - // only undo at bottom of scope (first invoked ScopedUndoBatch in // chain/hierarchy must go out of scope) CreateUndosForDirtyEntities(); @@ -1612,48 +1665,68 @@ namespace AzToolsFramework return; } - // If the current undo batch has commands in it, then we have to check that we do not add duplicates - // However if it starts out empty, we can just add things straight from the Set to the undo batch - bool mustCheckDuplicates = !m_currentBatchUndo->GetChildren().empty(); - - for (AZ::EntityId entityId : m_dirtyEntities) + if (!IsPrefabSystemEnabled()) { - AZ::Entity* entity = nullptr; - EBUS_EVENT_RESULT(entity, AZ::ComponentApplicationBus, FindEntity, entityId); + // If the current undo batch has commands in it, then we have to check that we do not add duplicates + // However if it starts out empty, we can just add things straight from the Set to the undo batch + bool mustCheckDuplicates = !m_currentBatchUndo->GetChildren().empty(); - if (entity) + for (AZ::EntityId entityId : m_dirtyEntities) { - EntityStateCommand* state = nullptr; + AZ::Entity* entity = nullptr; + EBUS_EVENT_RESULT(entity, AZ::ComponentApplicationBus, FindEntity, entityId); - if (mustCheckDuplicates) + if (entity) { - // Check if this entity is already in the current undo batch - state = azdynamic_cast(m_currentBatchUndo->Find( - static_cast(entityId), AZ::AzTypeInfo::Uuid())); - } + EntityStateCommand* state = nullptr; - if (!state) - { - state = aznew EntityStateCommand(static_cast(entityId)); - state->SetParent(m_currentBatchUndo); + if (mustCheckDuplicates) + { + // Check if this entity is already in the current undo batch + state = azdynamic_cast( + m_currentBatchUndo->Find(static_cast(entityId), AZ::AzTypeInfo::Uuid())); + } - // capture initial state of entity (before undo) - state->Capture(entity, true); + if (!state) + { + state = aznew EntityStateCommand(static_cast(entityId)); + state->SetParent(m_currentBatchUndo); + + // capture initial state of entity (before undo) + state->Capture(entity, true); + } + + // capture last state of entity (after undo) - for redo + state->Capture(entity, false); } - // capture last state of entity (after undo) - for redo - state->Capture(entity, false); + m_undoCache.UpdateCache(entityId); + } + } + else + { + auto prefabPublicInterface = AZ::Interface::Get(); + if (prefabPublicInterface) + { + // Compared to the preemptive undo cache, we can avoid the duplicate check. + // Multiple changes to the same entity are just split between different undo nodes. + for (AZ::EntityId entityId : m_dirtyEntities) + { + prefabPublicInterface->GenerateUndoNodesForEntityChangeAndUpdateCache(entityId, m_currentBatchUndo); + } } - - m_undoCache.UpdateCache(entityId); } } void ToolsApplication::ConsistencyCheckUndoCache() { - for (auto && entityEntry : m_entities) + auto undoCacheInterface = AZ::Interface::Get(); + if (undoCacheInterface) { - m_undoCache.Validate((entityEntry.second)->GetId()); + for (auto&& entityEntry : m_entities) + { + undoCacheInterface->Validate((entityEntry.second)->GetId()); + } } } @@ -1769,26 +1842,6 @@ namespace AzToolsFramework return m_engineConfigImpl->GetEngineVersion(); } - bool ToolsApplication::IsLegacySliceSystemEnabled() const - { - bool value = false; - if (auto* registry = AZ::SettingsRegistry::Get()) - { - registry->Get(value, Internal::s_prefabSystemKey); - } - return !value; - } - - bool ToolsApplication::ShouldAssertForLegacySlicesUsage() const - { - bool value = false; - if (auto* registry = AZ::SettingsRegistry::Get()) - { - registry->Get(value, Internal::s_legacySlicesAssertKey); - } - return value; - } - void ToolsApplication::CreateAndAddEntityFromComponentTags(const AZStd::vector& requiredTags, const char* entityName) { if (!entityName || !entityName[0]) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h index d9c3372ecb..a2773adf54 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h @@ -17,12 +17,19 @@ #include #include #include +#include +#include #include #pragma once namespace AzToolsFramework { + namespace UndoSystem + { + class UndoCacheInterface; + } + class ToolsApplication : public AzFramework::Application , public ToolsApplicationRequests::Bus::Handler @@ -145,8 +152,6 @@ namespace AzToolsFramework bool IsEditorInIsolationMode() override; const char* GetEngineRootPath() const override; const char* GetEngineVersion() const override; - bool IsLegacySliceSystemEnabled() const override; - bool ShouldAssertForLegacySlicesUsage() const override; void CreateAndAddEntityFromComponentTags(const AZStd::vector& requiredTags, const char* entityName) override; @@ -183,6 +188,12 @@ namespace AzToolsFramework class EngineConfigImpl; AZStd::unique_ptr m_engineConfigImpl; + + EditorEntityAPI* m_editorEntityAPI = nullptr; + + EditorEntityManager m_editorEntityManager; + + UndoSystem::UndoCacheInterface* m_undoCacheInterface = nullptr; }; } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp index 06b1c5bb92..1a55e162b9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.cpp index faa7919ff2..75761f3df0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include @@ -120,13 +120,14 @@ namespace AzToolsFramework void ProductAssetBrowserEntry::ThumbnailUpdated() { - // if source is displaying product's thumbnail, then it needs to also listen to its ThumbnailUpdated - if (m_parentAssetEntry) + if (EntryCache* cache = EntryCache::GetInstance()) { - if (EntryCache* cache = EntryCache::GetInstance()) + // if source is displaying product's thumbnail, then it needs to also listen to its ThumbnailUpdated + if (m_parentAssetEntry) { cache->m_dirtyThumbnailsSet.insert(m_parentAssetEntry); } + cache->m_dirtyThumbnailsSet.insert(this); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.cpp index 703f59247a..ada961711a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.cpp @@ -207,6 +207,7 @@ namespace AzToolsFramework auto source = azrtti_cast(itFile->second); source->m_sourceId = sourceWithFileIdEntry.second.m_sourceID; source->m_sourceUuid = sourceWithFileIdEntry.second.m_sourceGuid; + source->PathsUpdated(); // update thumbnailkey to valid uuid EntryCache::GetInstance()->m_sourceUuidMap[source->m_sourceUuid] = source; EntryCache::GetInstance()->m_sourceIdMap[source->m_sourceId] = source; return true; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.cpp index e0ec3e082e..007f7b7345 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.cpp @@ -170,7 +170,7 @@ namespace AzToolsFramework SharedThumbnailKey SourceAssetBrowserEntry::CreateThumbnailKey() { - return MAKE_TKEY(SourceThumbnailKey, m_fullPath.c_str()); + return MAKE_TKEY(SourceThumbnailKey, m_sourceUuid); } SharedThumbnailKey SourceAssetBrowserEntry::GetSourceControlThumbnailKey() const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.cpp index 6929a85e94..9b8a5c493c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include namespace AzToolsFramework @@ -37,6 +37,21 @@ namespace AzToolsFramework const AZ::Data::AssetType& ProductThumbnailKey::GetAssetType() const { return m_assetType; } + size_t ProductThumbnailKey::GetHash() const + { + return m_assetType.GetHash(); + } + + bool ProductThumbnailKey::Equals(const ThumbnailKey* other) const + { + if (!ThumbnailKey::Equals(other)) + { + return false; + } + // products displayed in Asset Browser have icons based on asset type, so multiple different products with same asset type will have same thumbnail + return m_assetId == azrtti_cast(other)->GetAssetId(); + } + ////////////////////////////////////////////////////////////////////////// // ProductThumbnail ////////////////////////////////////////////////////////////////////////// @@ -93,7 +108,7 @@ namespace AzToolsFramework // ProductThumbnailCache ////////////////////////////////////////////////////////////////////////// ProductThumbnailCache::ProductThumbnailCache() - : ThumbnailCache() {} + : ThumbnailCache() {} ProductThumbnailCache::~ProductThumbnailCache() = default; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.h deleted file mode 100644 index e40ff1f5ba..0000000000 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#if !defined(Q_MOC_RUN) -#include -#include -#endif - -namespace AzToolsFramework -{ - namespace AssetBrowser - { - class ProductThumbnailKey - : public Thumbnailer::ThumbnailKey - { - Q_OBJECT - public: - AZ_RTTI(ProductThumbnailKey, "{00FED34F-3D86-41B0-802F-9BD218DA1F0D}", Thumbnailer::ThumbnailKey); - - explicit ProductThumbnailKey(const AZ::Data::AssetId& assetId); - const AZ::Data::AssetId& GetAssetId() const; - const AZ::Data::AssetType& GetAssetType() const; - - protected: - AZ::Data::AssetId m_assetId; - AZ::Data::AssetType m_assetType; - }; - - class ProductThumbnail - : public Thumbnailer::Thumbnail - { - Q_OBJECT - public: - ProductThumbnail(Thumbnailer::SharedThumbnailKey key, int thumbnailSize); - - protected: - void LoadThread() override; - }; - - namespace - { - class ProductKeyHash - { - public: - size_t operator() (const Thumbnailer::SharedThumbnailKey& val) const - { - auto productThumbnailKey = azrtti_cast(val.data()); - if (!productThumbnailKey) - { - return 0; - } - return productThumbnailKey->GetAssetType().GetHash(); - } - }; - - class ProductKeyEqual - { - public: - bool operator()(const Thumbnailer::SharedThumbnailKey& val1, const Thumbnailer::SharedThumbnailKey& val2) const - { - auto productThumbnailKey1 = azrtti_cast(val1.data()); - auto productThumbnailKey2 = azrtti_cast(val2.data()); - if (!productThumbnailKey1 || !productThumbnailKey2) - { - return false; - } - // products displayed in Asset Browser have icons based on asset type, so multiple different products with same asset type will have same thumbnail - return productThumbnailKey1->GetAssetType() == productThumbnailKey2->GetAssetType(); - } - }; - } - - //! ProductAssetBrowserEntry thumbnails - class ProductThumbnailCache - : public Thumbnailer::ThumbnailCache - { - public: - ProductThumbnailCache(); - ~ProductThumbnailCache() override; - - const char* GetProviderName() const override; - - static constexpr const char* ProviderName = "Product Thumbnails"; - - protected: - bool IsSupportedThumbnail(Thumbnailer::SharedThumbnailKey key) const override; - }; - } // namespace AssetBrowser -} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.cpp index ecee9fae7b..47b15101ee 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.cpp @@ -39,6 +39,14 @@ namespace AzToolsFramework return m_isGem; } + bool FolderThumbnailKey::Equals(const ThumbnailKey* other) const + { + if (!ThumbnailKey::Equals(other)) + { + return false; + } + return m_isGem == azrtti_cast(other)->IsGem(); + } ////////////////////////////////////////////////////////////////////////// // FolderThumbnail ////////////////////////////////////////////////////////////////////////// @@ -68,7 +76,7 @@ namespace AzToolsFramework // FolderThumbnailCache ////////////////////////////////////////////////////////////////////////// FolderThumbnailCache::FolderThumbnailCache() - : ThumbnailCache() {} + : ThumbnailCache() {} FolderThumbnailCache::~FolderThumbnailCache() = default; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.h index 122d168242..d1f0a3d7b3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.h @@ -33,6 +33,7 @@ namespace AzToolsFramework FolderThumbnailKey(const char* folderPath, bool isGem); const AZStd::string& GetFolderPath() const; bool IsGem() const; + bool Equals(const ThumbnailKey* other) const override; protected: //! Absolute folder path @@ -50,36 +51,10 @@ namespace AzToolsFramework void LoadThread() override; }; - namespace - { - class FolderKeyHash - { - public: - size_t operator() (const SharedThumbnailKey& /*val*/) const - { - return 0; - } - }; - class FolderKeyEqual - { - public: - bool operator()(const SharedThumbnailKey& val1, const SharedThumbnailKey& val2) const - { - auto folderThumbnailKey1 = azrtti_cast(val1.data()); - auto folderThumbnailKey2 = azrtti_cast(val2.data()); - if (!folderThumbnailKey1 || !folderThumbnailKey2) - { - return false; - } - // There are only two thumbnails in this cache, one for gem icon and one for folder icon - return folderThumbnailKey1->IsGem() == folderThumbnailKey2->IsGem(); - } - }; - } //! FolderAssetBrowserEntry thumbnails class FolderThumbnailCache - : public ThumbnailCache + : public ThumbnailCache { public: FolderThumbnailCache(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.cpp new file mode 100644 index 0000000000..9994b19bb1 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.cpp @@ -0,0 +1,128 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include + +namespace AzToolsFramework +{ + namespace AssetBrowser + { + ////////////////////////////////////////////////////////////////////////// + // ProductThumbnailKey + ////////////////////////////////////////////////////////////////////////// + ProductThumbnailKey::ProductThumbnailKey(const AZ::Data::AssetId& assetId) + : ThumbnailKey() + , m_assetId(assetId) + { + AZ::Data::AssetInfo info; + AZ::Data::AssetCatalogRequestBus::BroadcastResult(info, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, m_assetId); + m_assetType = info.m_assetType; + } + + const AZ::Data::AssetId& ProductThumbnailKey::GetAssetId() const { return m_assetId; } + + const AZ::Data::AssetType& ProductThumbnailKey::GetAssetType() const { return m_assetType; } + + size_t ProductThumbnailKey::GetHash() const + { + return m_assetType.GetHash(); + } + + bool ProductThumbnailKey::Equals(const ThumbnailKey* other) const + { + if (!ThumbnailKey::Equals(other)) + { + return false; + } + // products displayed in Asset Browser have icons based on asset type, so multiple different products with same asset type will have same thumbnail + return m_assetId == azrtti_cast(other)->GetAssetId(); + } + + ////////////////////////////////////////////////////////////////////////// + // ProductThumbnail + ////////////////////////////////////////////////////////////////////////// + static const char* DEFAULT_PRODUCT_ICON_PATH = "Editor/Icons/AssetBrowser/DefaultProduct_16.svg"; + + ProductThumbnail::ProductThumbnail(Thumbnailer::SharedThumbnailKey key, int thumbnailSize) + : Thumbnail(key, thumbnailSize) + {} + + void ProductThumbnail::LoadThread() + { + auto productKey = azrtti_cast(m_key.data()); + AZ_Assert(productKey, "Incorrect key type, excpected ProductThumbnailKey"); + + QString iconPath; + AZ::AssetTypeInfoBus::EventResult(iconPath, productKey->GetAssetType(), &AZ::AssetTypeInfo::GetBrowserIcon); + if (!iconPath.isEmpty()) + { + // is it an embedded resource or absolute path? + bool isUsablePath = (iconPath.startsWith(":") || (!AzFramework::StringFunc::Path::IsRelative(iconPath.toUtf8().constData()))); + + if (!isUsablePath) + { + // getting here means it needs resolution. Can we find the real path of the file? This also searches in gems for sources. + bool foundIt = false; + AZStd::string watchFolder; + AZ::Data::AssetInfo assetInfo; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult(foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, iconPath.toUtf8().constData(), assetInfo, watchFolder); + + if (foundIt) + { + // the absolute path is join(watchfolder, relativepath); // since its relative to the watch folder. + AZStd::string finalPath; + AzFramework::StringFunc::Path::Join(watchFolder.c_str(), assetInfo.m_relativePath.c_str(), finalPath); + iconPath = QString::fromUtf8(finalPath.c_str()); + } + } + } + else + { + // no pixmap specified - use default. + iconPath = QString::fromUtf8(DEFAULT_PRODUCT_ICON_PATH); + } + + m_icon = QIcon(iconPath); + + if (m_icon.isNull()) + { + m_state = State::Failed; + } + } + + ////////////////////////////////////////////////////////////////////////// + // ProductThumbnailCache + ////////////////////////////////////////////////////////////////////////// + ProductThumbnailCache::ProductThumbnailCache() + : ThumbnailCache() {} + + ProductThumbnailCache::~ProductThumbnailCache() = default; + + const char* ProductThumbnailCache::GetProviderName() const + { + return ProviderName; + } + + bool ProductThumbnailCache::IsSupportedThumbnail(Thumbnailer::SharedThumbnailKey key) const + { + return azrtti_istypeof(key.data()); + } + + } // namespace AssetBrowser +} // namespace AzToolsFramework + +#include "AssetBrowser/Thumbnails/moc_ProductThumbnail.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h new file mode 100644 index 0000000000..5eb16dd436 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h @@ -0,0 +1,69 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#if !defined(Q_MOC_RUN) +#include +#include +#endif + +namespace AzToolsFramework +{ + namespace AssetBrowser + { + class ProductThumbnailKey + : public Thumbnailer::ThumbnailKey + { + Q_OBJECT + public: + AZ_RTTI(ProductThumbnailKey, "{00FED34F-3D86-41B0-802F-9BD218DA1F0D}", Thumbnailer::ThumbnailKey); + + explicit ProductThumbnailKey(const AZ::Data::AssetId& assetId); + const AZ::Data::AssetId& GetAssetId() const; + const AZ::Data::AssetType& GetAssetType() const; + size_t GetHash() const override; + bool Equals(const ThumbnailKey* other) const override; + + protected: + AZ::Data::AssetId m_assetId; + AZ::Data::AssetType m_assetType; + }; + + class ProductThumbnail + : public Thumbnailer::Thumbnail + { + Q_OBJECT + public: + ProductThumbnail(Thumbnailer::SharedThumbnailKey key, int thumbnailSize); + + protected: + void LoadThread() override; + }; + + //! ProductAssetBrowserEntry thumbnails + class ProductThumbnailCache + : public Thumbnailer::ThumbnailCache + { + public: + ProductThumbnailCache(); + ~ProductThumbnailCache() override; + + const char* GetProviderName() const override; + + static constexpr const char* ProviderName = "Product Thumbnails"; + + protected: + bool IsSupportedThumbnail(Thumbnailer::SharedThumbnailKey key) const override; + }; + } // namespace AssetBrowser +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp index 5b4e9a36a9..547c64a75d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -26,21 +27,29 @@ namespace AzToolsFramework ////////////////////////////////////////////////////////////////////////// // SourceThumbnailKey ////////////////////////////////////////////////////////////////////////// - SourceThumbnailKey::SourceThumbnailKey(const char* fileName) + SourceThumbnailKey::SourceThumbnailKey(const AZ::Uuid& sourceUuid) : ThumbnailKey() - , m_fileName(fileName) + , m_sourceUuid(sourceUuid) { - AzFramework::StringFunc::Path::Split(fileName, nullptr, nullptr, nullptr, &m_extension); } - const AZStd::string& SourceThumbnailKey::GetFileName() const + const AZ::Uuid& SourceThumbnailKey::GetSourceUuid() const { - return m_fileName; + return m_sourceUuid; } - const AZStd::string& SourceThumbnailKey::GetExtension() const + size_t SourceThumbnailKey::GetHash() const { - return m_extension; + return m_sourceUuid.GetHash(); + } + + bool SourceThumbnailKey::Equals(const ThumbnailKey* other) const + { + if (!ThumbnailKey::Equals(other)) + { + return false; + } + return m_sourceUuid == azrtti_cast(other)->GetSourceUuid(); } ////////////////////////////////////////////////////////////////////////// @@ -59,48 +68,54 @@ namespace AzToolsFramework auto sourceKey = azrtti_cast(m_key.data()); AZ_Assert(sourceKey, "Incorrect key type, excpected SourceThumbnailKey"); - // note that there might not actually be a UUID for this yet. So we don't look it up. - AZ::EBusAggregateResults results; - AssetBrowserInteractionNotificationBus::BroadcastResult(results, &AssetBrowserInteractionNotificationBus::Events::GetSourceFileDetails, sourceKey->GetFileName().c_str()); - // there could be multiple listeners to this, return the first one with actual image path - auto it = AZStd::find_if(results.values.begin(), results.values.end(), [](const SourceFileDetails& details) { return !details.m_sourceThumbnailPath.empty(); }); + bool foundIt = false; + AZStd::string watchFolder; + AZ::Data::AssetInfo assetInfo; + AssetSystemRequestBus::BroadcastResult(foundIt, &AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, sourceKey->GetSourceUuid(), assetInfo, watchFolder); QString iconPathToUse; - - if (it != results.values.end()) + if (foundIt) { - const char* resultPath = it->m_sourceThumbnailPath.c_str(); - // its an ordered bus, though, so first one wins. - // we have to massage this though. there are three valid possibilities - // 1. its a relative path to source, in which case we have to find the full path - // 2. its an absolute path, in which case we use it as-is - // 3. its an embedded resource, in which case we use it as is. - - // is it an embedded resource or absolute path? - if ((resultPath[0] == ':')||(!AzFramework::StringFunc::Path::IsRelative(resultPath))) - { - iconPathToUse = QString::fromUtf8(resultPath); - } - else - { - // getting here means its a relative path. Can we find the real path of the file? This also searches in gems for sources. - bool foundIt = false; - AZStd::string watchFolder; - AZ::Data::AssetInfo assetInfo; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, resultPath, assetInfo, watchFolder); + // note that there might not actually be a UUID for this yet. So we don't look it up. + AZ::EBusAggregateResults results; + AssetBrowserInteractionNotificationBus::BroadcastResult(results, &AssetBrowserInteractionNotificationBus::Events::GetSourceFileDetails, assetInfo.m_relativePath.c_str()); + // there could be multiple listeners to this, return the first one with actual image path + auto it = AZStd::find_if(results.values.begin(), results.values.end(), [](const SourceFileDetails& details) { return !details.m_sourceThumbnailPath.empty(); }); - AZ_WarningOnce("Asset Browser", foundIt, "Unable to find source icon file in any source folders or gems: %s\n", resultPath); - - if (foundIt) + if (it != results.values.end()) + { + const char* resultPath = it->m_sourceThumbnailPath.c_str(); + // its an ordered bus, though, so first one wins. + // we have to massage this though. there are three valid possibilities + // 1. its a relative path to source, in which case we have to find the full path + // 2. its an absolute path, in which case we use it as-is + // 3. its an embedded resource, in which case we use it as is. + + // is it an embedded resource or absolute path? + if ((resultPath[0] == ':') || (!AzFramework::StringFunc::Path::IsRelative(resultPath))) { - // the absolute path is join(watchfolder, relativepath); // since its relative to the watch folder. - AZStd::string finalPath; - AzFramework::StringFunc::Path::Join(watchFolder.c_str(), assetInfo.m_relativePath.c_str(), finalPath); - iconPathToUse = QString::fromUtf8(finalPath.c_str()); + iconPathToUse = QString::fromUtf8(resultPath); + } + else + { + // getting here means its a relative path. Can we find the real path of the file? This also searches in gems for sources. + foundIt = false; + AssetSystemRequestBus::BroadcastResult(foundIt, &AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, resultPath, assetInfo, watchFolder); + + AZ_WarningOnce("Asset Browser", foundIt, "Unable to find source icon file in any source folders or gems: %s\n", resultPath); + + if (foundIt) + { + // the absolute path is join(watchfolder, relativepath); // since its relative to the watch folder. + AZStd::string finalPath; + AzFramework::StringFunc::Path::Join(watchFolder.c_str(), assetInfo.m_relativePath.c_str(), finalPath); + iconPathToUse = QString::fromUtf8(finalPath.c_str()); + } } } } - else + + if (iconPathToUse.isEmpty()) { const char* engineRoot = nullptr; AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot); @@ -116,7 +131,7 @@ namespace AzToolsFramework // SourceThumbnailCache ////////////////////////////////////////////////////////////////////////// SourceThumbnailCache::SourceThumbnailCache() - : ThumbnailCache() {} + : ThumbnailCache() {} SourceThumbnailCache::~SourceThumbnailCache() = default; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.h index 01af9f3db3..41cbd4b254 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.h @@ -12,7 +12,6 @@ #pragma once #if !defined(Q_MOC_RUN) -#include #include #include #endif @@ -31,15 +30,13 @@ namespace AzToolsFramework public: AZ_RTTI(SourceThumbnailKey, "{4AF3F33A-4B16-491D-93A5-0CC96DC59814}", ThumbnailKey); - explicit SourceThumbnailKey(const char* fileName); - const AZStd::string& GetFileName() const; - const AZStd::string& GetExtension() const; + explicit SourceThumbnailKey(const AZ::Uuid& sourceUuid); + const AZ::Uuid& GetSourceUuid() const; + size_t GetHash() const override; + bool Equals(const ThumbnailKey* other) const override; protected: - //! absolute path - AZStd::string m_fileName; - //! file extension - AZStd::string m_extension; + AZ::Uuid m_sourceUuid; }; class SourceThumbnail @@ -56,41 +53,9 @@ namespace AzToolsFramework static QMutex m_mutex; }; - namespace - { - class SourceKeyHash - { - public: - size_t operator() (const SharedThumbnailKey& val) const - { - auto sourceThumbnailKey = azrtti_cast(val.data()); - if (!sourceThumbnailKey) - { - return 0; - } - return AZStd::hash()(sourceThumbnailKey->GetFileName()); - } - }; - - class SourceKeyEqual - { - public: - bool operator()(const SharedThumbnailKey& val1, const SharedThumbnailKey& val2) const - { - auto sourceThumbnailKey1 = azrtti_cast(val1.data()); - auto sourceThumbnailKey2 = azrtti_cast(val2.data()); - if (!sourceThumbnailKey1 || !sourceThumbnailKey2) - { - return false; - } - return sourceThumbnailKey1->GetFileName() == sourceThumbnailKey2->GetFileName(); - } - }; - } - //! SourceAssetBrowserEntry thumbnails class SourceThumbnailCache - : public ThumbnailCache + : public ThumbnailCache { public: SourceThumbnailCache(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBundle/AssetBundleComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBundle/AssetBundleComponent.cpp index 778fc10b52..61e144d338 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBundle/AssetBundleComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBundle/AssetBundleComponent.cpp @@ -307,6 +307,10 @@ namespace AzToolsFramework } } + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList) { AZ::u64 fileSize = 0; @@ -323,7 +327,7 @@ namespace AzToolsFramework AZ_Warning(logWindowName, false, "File (%s) size (%d) is bigger than the max bundle size (%d).\n", assetFileInfo.m_assetRelativePath.c_str(), fileSize, maxSizeInBytes); } - if (AzFramework::StringFunc::EndsWith(assetFileInfo.m_assetRelativePath, "level.pak")) + if (!usePrefabSystemForLevels && (AzFramework::StringFunc::EndsWith(assetFileInfo.m_assetRelativePath, "level.pak"))) { AZStd::string levelFolder; AzFramework::StringFunc::Path::GetFolderPath(assetFileInfo.m_assetRelativePath.c_str(), levelFolder); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.cpp index 868867fd46..e7037c8936 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,7 @@ namespace AzToolsFramework SliceMetadataEntityContextComponent::CreateDescriptor(), SliceRequestComponent::CreateDescriptor(), Prefab::PrefabSystemComponent::CreateDescriptor(), + Prefab::EditorPrefabComponent::CreateDescriptor(), Components::EditorEntityActionComponent::CreateDescriptor(), Components::EditorEntityIconComponent::CreateDescriptor(), Components::EditorInspectorComponent::CreateDescriptor(), diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.cpp index 477c14fb02..b8683741e4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.cpp @@ -16,7 +16,7 @@ #include "EntityTransformCommand.h" #include #include -#include "PreemptiveUndoCache.h" +#include namespace AzToolsFramework { @@ -31,6 +31,9 @@ namespace AzToolsFramework m_priorTransforms[*it] = current; m_nextTransforms[*it] = current; } + + m_undoCacheInterface = AZ::Interface::Get(); + AZ_Assert(m_undoCacheInterface, "Could not get UndoCacheInterface on TransformCommand construction."); } void TransformCommand::Post() @@ -46,7 +49,7 @@ namespace AzToolsFramework for (auto it = m_priorTransforms.begin(); it != m_priorTransforms.end(); ++it) { - PreemptiveUndoCache::Get()->UpdateCache(it->first); + m_undoCacheInterface->UpdateCache(it->first); } } @@ -55,7 +58,7 @@ namespace AzToolsFramework for (auto it = m_priorTransforms.begin(); it != m_priorTransforms.end(); ++it) { EBUS_EVENT_ID(it->first, TransformComponentMessages::Bus, SetLocalSRT, it->second); - PreemptiveUndoCache::Get()->UpdateCache(it->first); + m_undoCacheInterface->UpdateCache(it->first); } } @@ -64,7 +67,7 @@ namespace AzToolsFramework for (auto it = m_nextTransforms.begin(); it != m_nextTransforms.end(); ++it) { EBUS_EVENT_ID(it->first, TransformComponentMessages::Bus, SetLocalSRT, it->second); - PreemptiveUndoCache::Get()->UpdateCache(it->first); + m_undoCacheInterface->UpdateCache(it->first); } } @@ -87,4 +90,4 @@ namespace AzToolsFramework } } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.h index ab7ea10c0c..422f9fad8a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityTransformCommand.h @@ -25,6 +25,11 @@ namespace AzToolsFramework { + namespace UndoSystem + { + class UndoCacheInterface; + } + typedef AZStd::vector EntityList; // transform command specializes undo to just care about the transform of an entity instead of the entire thing, for performance. @@ -54,9 +59,12 @@ namespace AzToolsFramework CapturedTransforms m_priorTransforms; CapturedTransforms m_nextTransforms; + + private: + UndoCacheInterface* m_undoCacheInterface; }; } #endif // disabled -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp index 8aa1cfb127..8a451aa52b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp @@ -53,6 +53,11 @@ namespace AzToolsFramework s_cache->m_instance = this; } + void PreemptiveUndoCache::RegisterToUndoCacheInterface() + { + AZ::Interface::Register(this); + } + PreemptiveUndoCache::~PreemptiveUndoCache() { if (s_cache) @@ -60,6 +65,11 @@ namespace AzToolsFramework s_cache->m_instance = nullptr; s_cache.Reset(); } + + if (AZ::Interface::Get() == this) + { + AZ::Interface::Unregister(this); + } } PreemptiveUndoCache* PreemptiveUndoCache::Get() @@ -173,4 +183,4 @@ namespace AzToolsFramework return it->second; } -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h index bb43f998b6..4c515a59c3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h @@ -18,6 +18,8 @@ #include #include +#include + // Enable to generate warnings for entity data changes not caught by undo batches. #if defined(AZ_DEBUG_BUILD) && !defined(ENABLE_UNDOCACHE_CONSISTENCY_CHECKS) # define ENABLE_UNDOCACHE_CONSISTENCY_CHECKS @@ -29,6 +31,7 @@ namespace AzToolsFramework // so that the user does not have to inform us before they make a change, only after they make a change // it also allows us to detect errors with change notification and not have to do multiple snapshots (before and after) class PreemptiveUndoCache + : UndoSystem::UndoCacheInterface { public: AZ_CLASS_ALLOCATOR(PreemptiveUndoCache, AZ::SystemAllocator, 0); @@ -37,23 +40,21 @@ namespace AzToolsFramework PreemptiveUndoCache(); ~PreemptiveUndoCache(); + void RegisterToUndoCacheInterface(); + + // UndoCacheInterface... + void UpdateCache(const AZ::EntityId& entityId) override; + void PurgeCache(const AZ::EntityId& entityId) override; + void Clear() override; + void Validate(const AZ::EntityId& entityId) override; + // whenever an entity appears in the world, as an atomic operation (ie, after all of its loading is complete, and the entity is active) // we snapshot it here. then, whenever an entity changes, we have what it used to be. typedef AZStd::vector CacheLineType; - void Validate(const AZ::EntityId& entityId); - - // Store the new entity state or replace the old state - void UpdateCache(const AZ::EntityId& entityId); - - // remove the cache line for the entity, if there is one - void PurgeCache(const AZ::EntityId& entityId); - // retrieve the last known state for an entity const CacheLineType& Retrieve(const AZ::EntityId& entityId); - // clear the entire cache: - void Clear(); protected: typedef AZStd::unordered_map EntityStateMap; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp index 0dccf85471..1afc3a2cb8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp @@ -55,6 +55,7 @@ #include #include #include +#include namespace AzToolsFramework @@ -163,10 +164,10 @@ namespace AzToolsFramework //========================================================================= void EditorEntityContextComponent::Activate() { - m_isLegacySliceService = true; - - AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(m_isLegacySliceService, - &AzToolsFramework::ToolsApplicationRequests::IsLegacySliceSystemEnabled); + bool prefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(prefabSystemEnabled, + &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + m_isLegacySliceService = !prefabSystemEnabled; if (m_isLegacySliceService) { @@ -190,6 +191,7 @@ namespace AzToolsFramework EditorLegacyGameModeNotificationBus::Handler::BusConnect(); m_entityVisibilityBoundsUnionSystem.Connect(); + } //========================================================================= @@ -449,7 +451,8 @@ namespace AzToolsFramework } else { - AZ_Assert(!m_entityOwnershipService->m_shouldAssertForLegacySlicesUsage, "Not implemented"); + loadedSuccessfully = static_cast(m_entityOwnershipService.get())->LoadFromStream( + stream, AZStd::string_view(levelPakFile.toUtf8(), levelPakFile.size()) ); } LoadFromStreamComplete(loadedSuccessfully); @@ -495,7 +498,10 @@ namespace AzToolsFramework } else { - AZ_Assert(!m_entityOwnershipService->m_shouldAssertForLegacySlicesUsage, "Not implemented"); + auto* service = AZ::Interface::Get(); + AZ_Assert(service, "Start play in editor could not start because there was no implementation for " + "PrefabEditorEntityOwnershipInterface"); + service->StartPlayInEditor(); } m_isRunningGame = true; @@ -523,7 +529,10 @@ namespace AzToolsFramework } else { - AZ_Assert(!m_entityOwnershipService->m_shouldAssertForLegacySlicesUsage, "Not implemented"); + auto* service = AZ::Interface::Get(); + AZ_Assert(service, "Stop play in editor could not complete because there was no implementation for " + "PrefabEditorEntityOwnershipInterface"); + service->StopPlayInEditor(); } ToolsApplicationRequests::Bus::Broadcast(&ToolsApplicationRequests::SetSelectedEntities, m_selectedBeforeStartingGame); @@ -663,10 +672,6 @@ namespace AzToolsFramework // need to be associated with the root metadata info component. editorEntityOwnershipService->AssociateToRootMetadataEntity(entities); } - else - { - AZ_Assert(!m_entityOwnershipService->m_shouldAssertForLegacySlicesUsage, "Not implemented"); - } SetupEditorEntities(entities); } @@ -742,6 +747,11 @@ namespace AzToolsFramework } } + if (m_undoCacheInterface == nullptr) + { + m_undoCacheInterface = AZ::Interface::Get(); + } + // After activating all the entities, refresh their entries in the undo cache. // We need to wait until after all the activations are complete. Otherwise, it's possible that the data for an entity // will change based on other activations. For example, if we activate a child entity before its parent, the Transform @@ -749,7 +759,7 @@ namespace AzToolsFramework // out of sync with the child data. for (AZ::Entity* entity : entities) { - PreemptiveUndoCache::Get()->UpdateCache(entity->GetId()); + m_undoCacheInterface->UpdateCache(entity->GetId()); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.h index 936ecc151b..9a9a2dcff0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.h @@ -41,6 +41,11 @@ namespace AzFramework namespace AzToolsFramework { + namespace UndoSystem + { + class UndoCacheInterface; + } + /** * System component responsible for owning the edit-time entity context. * @@ -186,6 +191,8 @@ namespace AzToolsFramework //! Edit time visibility management integrating entities with the IVisibilitySystem. AzFramework::EntityVisibilityBoundsUnionSystem m_entityVisibilityBoundsUnionSystem; bool m_isLegacySliceService; + + UndoSystem::UndoCacheInterface* m_undoCacheInterface = nullptr; }; } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.cpp index 2beeaa7252..18b2dacefb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.cpp @@ -22,6 +22,7 @@ #include +#include #include #include #include @@ -116,6 +117,8 @@ namespace AzToolsFramework { EditorEntityModel::EditorEntityModel() { + AzFramework::ApplicationRequests::Bus::BroadcastResult(m_isPrefabEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + EntityCompositionNotificationBus::Handler::BusConnect(); EditorOnlyEntityComponentNotificationBus::Handler::BusConnect(); EditorEntityRuntimeActivationChangeNotificationBus::Handler::BusConnect(); @@ -562,7 +565,8 @@ namespace AzToolsFramework { //retrieve or add an entity entry to the table //the entry must exist, even if not connected, so children and other data can be assigned - auto& entityInfo = m_entityInfoTable[entityId]; + [[maybe_unused]] auto [it, inserted] = m_entityInfoTable.try_emplace(entityId, m_isPrefabEnabled); + auto& entityInfo = it->second; //the entity id defaults to invalid and must be set to match the requested id //disconnect and reassign if there's a mismatch @@ -878,7 +882,8 @@ namespace AzToolsFramework } } - EditorEntityModel::EditorEntityModelEntry::EditorEntityModelEntry() + EditorEntityModel::EditorEntityModelEntry::EditorEntityModelEntry(bool isPrefabEnabled) + : m_isPrefabEnabled(isPrefabEnabled) { } @@ -1208,13 +1213,28 @@ namespace AzToolsFramework auto childItr = m_childIndexCache.find(childId); if (childItr != m_childIndexCache.end()) { - m_children.erase(m_children.begin() + childItr->second); - - //rebuild index cache for faster lookup - m_childIndexCache.clear(); - for (auto childIdToCache : m_children) + if (m_isPrefabEnabled) + { + // Take the last entry and move it into the removed spot instead of deleting the entry and having to move all + // following entries one step down. + AZ::EntityId backEntity = m_children.back(); + m_children[childItr->second] = backEntity; + // Update cached index for the moved id to the new index. + m_childIndexCache[backEntity] = childItr->second; + // Now remove the deleted id from the children and cache. + m_childIndexCache.erase(childId); + m_children.erase(m_children.end() - 1); + } + else { - m_childIndexCache[childIdToCache] = static_cast(m_childIndexCache.size()); + m_children.erase(m_children.begin() + childItr->second); + + // rebuild index cache for faster lookup + m_childIndexCache.clear(); + for (auto childIdToCache : m_children) + { + m_childIndexCache[childIdToCache] = static_cast(m_childIndexCache.size()); + } } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.h index d35322a065..b6cceb85fe 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModel.h @@ -171,7 +171,7 @@ namespace AzToolsFramework , public PropertyEditorEntityChangeNotificationBus::Handler { public: - EditorEntityModelEntry(); + explicit EditorEntityModelEntry(bool isPrefabEnabled); ~EditorEntityModelEntry(); // Separately connect to EditorEntityInfoRequestBus and refresh Entity @@ -336,6 +336,7 @@ namespace AzToolsFramework bool m_visible = true; bool m_locked = false; bool m_connected = false; + bool m_isPrefabEnabled = false; AZStd::string m_name; AZStd::string m_sliceAssetName; AZStd::unordered_map m_childIndexCache; @@ -374,5 +375,6 @@ namespace AzToolsFramework AZ::EntityId m_postInstantiateBeforeEntity; AZ::EntityId m_postInstantiateSliceParent; bool m_gotInstantiateSliceDetails = false; + bool m_isPrefabEnabled = false; }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h index 77e126602c..f272c3b428 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h @@ -13,6 +13,7 @@ #pragma once #include +#include #include #include @@ -20,6 +21,7 @@ namespace AzToolsFramework { + class PrefabEditorEntityOwnershipInterface { public: @@ -33,7 +35,13 @@ namespace AzToolsFramework //! /return The optional reference to the prefab created. virtual Prefab::InstanceOptionalReference CreatePrefab( const AZStd::vector& entities, AZStd::vector>&& nestedPrefabInstances, - const AZStd::string& filePath, Prefab::Instance& instanceToParentUnder) = 0; + AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder = AZStd::nullopt) = 0; virtual Prefab::InstanceOptionalReference GetRootPrefabInstance() = 0; + + virtual bool LoadFromStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0; + virtual bool SaveToStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0; + + virtual void StartPlayInEditor() = 0; + virtual void StopPlayInEditor() = 0; }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index e62ea334cc..50ea9cf0b2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -11,14 +11,17 @@ */ #include +#include +#include +#include #include -#include #include -#include +#include #include +#include +#include #include - namespace AzToolsFramework { PrefabEditorEntityOwnershipService::PrefabEditorEntityOwnershipService(const AzFramework::EntityContextId& entityContextId, @@ -26,8 +29,8 @@ namespace AzToolsFramework : m_entityContextId(entityContextId) , m_serializeContext(serializeContext) { - AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult( - m_shouldAssertForLegacySlicesUsage, &AzToolsFramework::ToolsApplicationRequests::ShouldAssertForLegacySlicesUsage); + AzFramework::ApplicationRequests::Bus::BroadcastResult( + m_shouldAssertForLegacySlicesUsage, &AzFramework::ApplicationRequests::ShouldAssertForLegacySlicesUsage); AZ::Interface::Register(this); } @@ -46,7 +49,7 @@ namespace AzToolsFramework AZ_Assert(m_loaderInterface != nullptr, "Couldn't get prefab loader interface, it's a requirement for PrefabEntityOwnership system to work"); - m_rootInstance = AZStd::unique_ptr(m_prefabSystemComponent->CreatePrefab({}, {}, "/")); + m_rootInstance = AZStd::unique_ptr(m_prefabSystemComponent->CreatePrefab({}, {}, "NewLevel.prefab")); m_sliceOwnershipService.BusConnect(m_entityContextId); m_sliceOwnershipService.m_shouldAssertForLegacySlicesUsage = m_shouldAssertForLegacySlicesUsage; @@ -61,14 +64,33 @@ namespace AzToolsFramework void PrefabEditorEntityOwnershipService::Destroy() { + StopPlayInEditor(); m_editorSliceOwnershipService.BusDisconnect(); m_sliceOwnershipService.BusDisconnect(); - m_rootInstance.reset(); + + if (m_rootInstance != nullptr) + { + // Need to save off the template id to remove the template after the instance is deleted. + Prefab::TemplateId templateId = m_rootInstance->GetTemplateId(); + m_rootInstance.reset(); + if (templateId != Prefab::InvalidTemplateId) + { + // Remove the template here so that if we're in a Deactivate/Activate cycle, it can recreate the template/rootInstance + // correctly + m_prefabSystemComponent->RemoveTemplate(templateId); + } + } } void PrefabEditorEntityOwnershipService::Reset() { - // TBD + Prefab::TemplateId templateId = m_rootInstance->GetTemplateId(); + if (templateId != Prefab::InvalidTemplateId) + { + m_rootInstance->SetTemplateId(Prefab::InvalidTemplateId); + m_prefabSystemComponent->RemoveTemplate(templateId); + } + m_rootInstance->Reset(); } void PrefabEditorEntityOwnershipService::AddEntity(AZ::Entity* entity) @@ -97,15 +119,8 @@ namespace AzToolsFramework { AZ_Assert(IsInitialized(), "Tried to destroy an entity without initializing the Entity Ownership Service"); AZ_Assert(m_entitiesRemovedCallback, "Callback function for DestroyEntityById has not been set."); - AZStd::unique_ptr detachedEntity = m_rootInstance->DetachEntity(entityId); - if (detachedEntity) - { - AzFramework::SliceEntityRequestBus::MultiHandler::BusDisconnect(detachedEntity->GetId()); - m_entitiesRemovedCallback({ entityId }); - return true; - } - return false; - // The detached entity now gets deleted because the unique_ptr gets out of scope + OnEntityRemoved(entityId); + return true; } void PrefabEditorEntityOwnershipService::GetNonPrefabEntities(EntityList& entities) @@ -133,25 +148,121 @@ namespace AzToolsFramework m_entitiesAddedCallback(entities); } - bool PrefabEditorEntityOwnershipService::LoadFromStream(AZ::IO::GenericStream& /*stream*/, bool /*remapIds*/, - EntityIdToEntityIdMap* /*idRemapTable*/, const AZ::ObjectStream::FilterDescriptor& /*filterDesc*/) + bool PrefabEditorEntityOwnershipService::LoadFromStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) { + Reset(); + // Make loading from stream to behave the same in terms of filesize as regular loading of prefabs + // This may need to be revisited in the future for supporting higher sizes along with prefab loading + if (stream.GetLength() > Prefab::MaxPrefabFileSize) + { + AZ_Error("Prefab", false, "'%.*s' prefab content is bigger than the max supported size (%f MB)", AZ_STRING_ARG(filename), Prefab::MaxPrefabFileSize / (1024.f * 1024.f)); + return false; + } + const size_t bufSize = stream.GetLength(); + AZStd::unique_ptr buf(new char[bufSize]); + AZ::IO::SizeType bytes = stream.Read(bufSize, buf.get()); + + Prefab::TemplateId templateId = m_loaderInterface->LoadTemplateFromString(AZStd::string_view(buf.get(), bytes), filename); + if (templateId == Prefab::InvalidTemplateId) + { + AZ_Error("Prefab", false, "Couldn't load prefab content from '%.*s'", AZ_STRING_ARG(filename)); + return false; + } + + m_rootInstance->SetTemplateId(templateId); + m_rootInstance->SetTemplateSourcePath(m_loaderInterface->GetRelativePathToProject(filename)); + m_prefabSystemComponent->PropagateTemplateChanges(templateId); return true; } + bool PrefabEditorEntityOwnershipService::LoadFromStream( + [[maybe_unused]] AZ::IO::GenericStream& stream, + [[maybe_unused]] bool remapIds, + [[maybe_unused]] EntityIdToEntityIdMap* idRemapTable, + [[maybe_unused]] const AZ::ObjectStream::FilterDescriptor& filterDesc) + { + return false; + } + + bool PrefabEditorEntityOwnershipService::SaveToStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) + { + AZ::IO::Path relativePath = m_loaderInterface->GetRelativePathToProject(filename); + AzToolsFramework::Prefab::TemplateId templateId = m_prefabSystemComponent->GetTemplateIdFromFilePath(relativePath); + + m_rootInstance->SetTemplateSourcePath(relativePath); + if (templateId == AzToolsFramework::Prefab::InvalidTemplateId) + { + // This has not been loaded yet, this is the case of being saved with a different name. + // Create it + m_rootInstance->m_containerEntity->AddComponent(aznew Prefab::EditorPrefabComponent()); + HandleEntitiesAdded({m_rootInstance->m_containerEntity.get()}); + + AzToolsFramework::Prefab::PrefabDom dom; + bool success = AzToolsFramework::Prefab::PrefabDomUtils::StoreInstanceInPrefabDom(*m_rootInstance, dom); + if (!success) + { + AZ_Error("Prefab", false, "Failed to convert current root instance into a DOM when saving file '%.*s'", AZ_STRING_ARG(filename)); + return false; + } + templateId = m_prefabSystemComponent->AddTemplate(relativePath, std::move(dom)); + if (templateId == AzToolsFramework::Prefab::InvalidTemplateId) + { + AZ_Error("Prefab", false, "Couldn't add new template id '%i' when saving file '%.*s'", templateId, AZ_STRING_ARG(filename)); + return false; + } + } + else + { + // The template is already loaded, this is the case of either saving as same name or different name(loaded from before). + // Update the template with the changes + AzToolsFramework::Prefab::PrefabDom dom; + bool success = AzToolsFramework::Prefab::PrefabDomUtils::StoreInstanceInPrefabDom(*m_rootInstance, dom); + if (!success) + { + AZ_Error("Prefab", false, "Failed to convert current root instance into a DOM when saving file '%.*s'", AZ_STRING_ARG(filename)); + return false; + } + m_prefabSystemComponent->UpdatePrefabTemplate(templateId, dom); + } + + Prefab::TemplateId prevTemplateId = m_rootInstance->GetTemplateId(); + m_rootInstance->SetTemplateId(templateId); + + if (prevTemplateId != Prefab::InvalidTemplateId && templateId != prevTemplateId) + { + // Make sure we only have one level template loaded at a time + m_prefabSystemComponent->RemoveTemplate(prevTemplateId); + } + + AZStd::string out; + if (m_loaderInterface->SaveTemplateToString(m_rootInstance->GetTemplateId(), out)) + { + const size_t bytesToWrite = out.size(); + const size_t bytesWritten = stream.Write(bytesToWrite, out.data()); + return bytesWritten == bytesToWrite; + } + return false; + } + Prefab::InstanceOptionalReference PrefabEditorEntityOwnershipService::CreatePrefab( const AZStd::vector& entities, AZStd::vector>&& nestedPrefabInstances, - const AZStd::string& filePath, Prefab::Instance& instanceToParentUnder) + AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) { AZStd::unique_ptr createdPrefabInstance = m_prefabSystemComponent->CreatePrefab(entities, AZStd::move(nestedPrefabInstances), filePath); + if (!instanceToParentUnder) + { + instanceToParentUnder = *m_rootInstance; + } + if (createdPrefabInstance) { - Prefab::Instance& addedInstance = instanceToParentUnder.AddInstance(AZStd::move(createdPrefabInstance)); + Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(AZStd::move(createdPrefabInstance)); HandleEntitiesAdded({addedInstance.m_containerEntity.get()}); return addedInstance; } + HandleEntitiesAdded(entities); return AZStd::nullopt; } @@ -161,6 +272,12 @@ namespace AzToolsFramework return *m_rootInstance; } + void PrefabEditorEntityOwnershipService::OnEntityRemoved(AZ::EntityId entityId) + { + AzFramework::SliceEntityRequestBus::MultiHandler::BusDisconnect(entityId); + m_entitiesRemovedCallback({ entityId }); + } + void PrefabEditorEntityOwnershipService::SetEntitiesAddedCallback(OnEntitiesAddedCallback onEntitiesAddedCallback) { m_entitiesAddedCallback = AZStd::move(onEntitiesAddedCallback); @@ -176,6 +293,120 @@ namespace AzToolsFramework m_validateEntitiesCallback = AZStd::move(validateEntitiesCallback); } + void PrefabEditorEntityOwnershipService::StartPlayInEditor() + { + if (m_rootInstance && !m_playInEditorData.m_isEnabled) + { + // Construct the runtime entities and products + Prefab::TemplateReference templateReference = m_prefabSystemComponent->FindTemplate(m_rootInstance->GetTemplateId()); + if (templateReference.has_value()) + { + bool converterLoaded = m_playInEditorData.m_converter.IsLoaded(); + if (!converterLoaded) + { + converterLoaded = m_playInEditorData.m_converter.LoadStackProfile("PlayInEditor"); + } + if (converterLoaded) + { + // Use a random uuid as this is only a temporary source. + AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessorContext context(AZ::Uuid::CreateRandom()); + Prefab::PrefabDom copy; + copy.CopyFrom(templateReference->get().GetPrefabDom(), copy.GetAllocator(), false); + context.AddPrefab(DefaultMainSpawnableName, AZStd::move(copy)); + m_playInEditorData.m_converter.ProcessPrefab(context); + if (context.HasCompletedSuccessfully()) + { + static constexpr size_t NoRootSpawnable = AZStd::numeric_limits::max(); + size_t rootSpawnableIndex = NoRootSpawnable; + + // Create temporary assets from the processed data. + for (auto& product : context.GetProcessedObjects()) + { + if (product.GetAssetType() == AZ::AzTypeInfo::Uuid() && + product.GetId() == + AZStd::string::format("%s.%s", DefaultMainSpawnableName, AzFramework::Spawnable::FileExtension)) + { + rootSpawnableIndex = m_playInEditorData.m_assets.size(); + } + + AZ::Data::AssetInfo info; + info.m_assetId = product.GetAsset().GetId(); + info.m_assetType = product.GetAssetType(); + info.m_relativePath = product.GetId(); + + AZ::Data::AssetCatalogRequestBus::Broadcast( + &AZ::Data::AssetCatalogRequestBus::Events::RegisterAsset, product.GetAsset().GetId(), info); + m_playInEditorData.m_assets.emplace_back(product.ReleaseAsset().release(), AZ::Data::AssetLoadBehavior::Default); + } + + if (rootSpawnableIndex != NoRootSpawnable) + { + m_playInEditorData.m_entities.Reset(m_playInEditorData.m_assets[rootSpawnableIndex]); + m_playInEditorData.m_entities.SpawnAllEntities(); + } + } + else + { + AZ_Error("Prefab", false, "Failed to convert the prefab into assets."); + return; + } + } + else + { + AZ_Error("Prefab", false, "Failed to create a prefab processing stack from key 'PlayInEditor'."); + return; + } + + m_rootInstance->GetNestedEntities([this](AZStd::unique_ptr& entity) + { + AZ_Assert(entity, "Invalid entity found in root instance while starting play in editor."); + if (entity->GetState() == AZ::Entity::State::Active) + { + entity->Deactivate(); + m_playInEditorData.m_deactivatedEntities.push_back(entity.get()); + } + return true; + }); + } + } + + m_playInEditorData.m_isEnabled = true; + } + + void PrefabEditorEntityOwnershipService::StopPlayInEditor() + { + if (m_rootInstance && m_playInEditorData.m_isEnabled) + { + auto end = m_playInEditorData.m_deactivatedEntities.rend(); + for (auto it = m_playInEditorData.m_deactivatedEntities.rbegin(); it != end; ++it) + { + AZ_Assert(*it, "Invalid entity added to list for re-activation after play-in-editor stopped."); + (*it)->Activate(); + } + m_playInEditorData.m_deactivatedEntities.clear(); + + m_playInEditorData.m_entities.DespawnAllEntities(); + m_playInEditorData.m_entities.Alert( + [assets = AZStd::move(m_playInEditorData.m_assets)]([[maybe_unused]]uint32_t generation) mutable + { + for (auto& asset : assets) + { + if (asset) + { + // Explicitly release because this needs to happen before the asset is unregistered. + asset.Release(); + AZ::Data::AssetCatalogRequestBus::Broadcast( + &AZ::Data::AssetCatalogRequestBus::Events::UnregisterAsset, asset.GetId()); + } + } + AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequests::GarbageCollect); + }); + m_playInEditorData.m_entities.Clear(); + } + + m_playInEditorData.m_isEnabled = false; + } + ////////////////////////////////////////////////////////////////////////// // Slice Buses implementation with Assert(false), this will exist only during Slice->Prefab // development to pinpoint and replace specific calls to Slice system diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h index 855e5d069b..ad11547506 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h @@ -15,8 +15,10 @@ #include #include #include +#include #include #include +#include namespace AzToolsFramework { @@ -104,7 +106,9 @@ namespace AzToolsFramework using OnEntitiesRemovedCallback = AzFramework::OnEntitiesRemovedCallback; using ValidateEntitiesCallback = AzFramework::ValidateEntitiesCallback; - explicit PrefabEditorEntityOwnershipService( + static inline constexpr const char* DefaultMainSpawnableName = "Root"; + + PrefabEditorEntityOwnershipService( const AzFramework::EntityContextId& entityContextId, AZ::SerializeContext* serializeContext); ~PrefabEditorEntityOwnershipService(); @@ -154,27 +158,44 @@ namespace AzToolsFramework // To be removed in the future bool LoadFromStream(AZ::IO::GenericStream& stream, bool remapIds, EntityIdToEntityIdMap* idRemapTable = nullptr, - const AZ::ObjectStream::FilterDescriptor& filterDesc = AZ::ObjectStream::FilterDescriptor()); + const AZ::ObjectStream::FilterDescriptor& filterDesc = AZ::ObjectStream::FilterDescriptor()) override; void SetEntitiesAddedCallback(OnEntitiesAddedCallback onEntitiesAddedCallback) override; void SetEntitiesRemovedCallback(OnEntitiesRemovedCallback onEntitiesRemovedCallback) override; void SetValidateEntitiesCallback(ValidateEntitiesCallback validateEntitiesCallback) override; + bool LoadFromStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) override; + bool SaveToStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) override; + + void StartPlayInEditor() override; + void StopPlayInEditor() override; + protected: AZ::SliceComponent::SliceInstanceAddress GetOwningSlice() override; private: + struct PlayInEditorData + { + AzToolsFramework::Prefab::PrefabConversionUtils::PrefabConversionPipeline m_converter; + AZStd::vector> m_assets; + AZStd::vector m_deactivatedEntities; + AzFramework::SpawnableEntitiesContainer m_entities; + bool m_isEnabled{ false }; + }; + PlayInEditorData m_playInEditorData; ////////////////////////////////////////////////////////////////////////// // PrefabSystemComponentInterface interface implementation Prefab::InstanceOptionalReference CreatePrefab( const AZStd::vector& entities, AZStd::vector>&& nestedPrefabInstances, - const AZStd::string& filePath, Prefab::Instance& instanceToParentUnder) override; + AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) override; Prefab::InstanceOptionalReference GetRootPrefabInstance() override; ////////////////////////////////////////////////////////////////////////// + void OnEntityRemoved(AZ::EntityId entityId); + OnEntitiesAddedCallback m_entitiesAddedCallback; OnEntitiesRemovedCallback m_entitiesRemovedCallback; ValidateEntitiesCallback m_validateEntitiesCallback; @@ -185,7 +206,6 @@ namespace AzToolsFramework AZStd::string m_rootPath; AZStd::unique_ptr m_rootInstance; Prefab::PrefabSystemComponentInterface* m_prefabSystemComponent; - Prefab::PrefabLoaderInterface* m_loaderInterface; AzFramework::EntityContextId m_entityContextId; AZ::SerializeContext m_serializeContext; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialThumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialThumbnail.h index 556f43a54a..f7873ef765 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialThumbnail.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialThumbnail.h @@ -14,7 +14,7 @@ #if !defined(Q_MOC_RUN) #include -#include +#include #include #endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.cpp new file mode 100644 index 0000000000..5b8870b002 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.cpp @@ -0,0 +1,80 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +namespace AzToolsFramework +{ + namespace Prefab + { + void EditorPrefabComponent::Reflect(AZ::ReflectContext* context) + { + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class(); + + AZ::EditContext* editContext = serializeContext->GetEditContext(); + if (editContext) + { + editContext->Class("Prefab Component", "") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Hide) + ->Attribute(AZ::Edit::Attributes::HideIcon, true) + ->Attribute( + AZ::Edit::Attributes::SliceFlags, + AZ::Edit::SliceFlags::HideOnAdd | AZ::Edit::SliceFlags::PushWhenHidden | + AZ::Edit::SliceFlags::DontGatherReference); + } + } + } + + void EditorPrefabComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services) + { + services.push_back(AZ_CRC("EditorPrefabInstanceContainerService")); + } + + void EditorPrefabComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services) + { + services.push_back(AZ_CRC("EditorPrefabInstanceContainerService")); + } + + void EditorPrefabComponent::Activate() + { + PrefabPublicInterface* prefabPublicInterface = AZ::Interface::Get(); + if (prefabPublicInterface && prefabPublicInterface->IsLevelInstanceContainerEntity(GetEntityId())) + { + EntityOutlinerWidgetInterface* entityOutlinerWidgetInterface = AZ::Interface::Get(); + if (entityOutlinerWidgetInterface) + { + entityOutlinerWidgetInterface->SetRootEntity(GetEntityId()); + } + } + + PrefabInstanceContainerNotificationBus::Broadcast( + &PrefabInstanceContainerNotifications::OnPrefabComponentActivate, GetEntityId()); + } + + void EditorPrefabComponent::Deactivate() + { + PrefabInstanceContainerNotificationBus::Broadcast( + &PrefabInstanceContainerNotifications::OnPrefabComponentDeactivate, GetEntityId()); + } + + } // namespace Prefab +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.h new file mode 100644 index 0000000000..3f21a35292 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.h @@ -0,0 +1,35 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AzToolsFramework +{ + namespace Prefab + { + class EditorPrefabComponent : public AzToolsFramework::Components::EditorComponentBase + { + public: + AZ_COMPONENT(EditorPrefabComponent, "{756E5F9C-3E08-4F8D-855C-A5AEEFB6FCDD}", EditorComponentBase); + + static void Reflect(AZ::ReflectContext* context); + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services); + static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services); + + private: + void Activate() override; + void Deactivate() override; + }; + } // namespace Prefab +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp index 6b8a4b118a..26f50624aa 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp @@ -26,6 +26,11 @@ namespace AzToolsFramework namespace Prefab { Instance::Instance() + : Instance(AZStd::make_unique()) + { + } + + Instance::Instance(AZStd::unique_ptr containerEntity) { m_instanceEntityMapper = AZ::Interface::Get(); @@ -41,27 +46,16 @@ namespace AzToolsFramework "It is a requirement for the Prefab Instance class. " "Check that it is being correctly initialized."); - m_containerEntity = AZStd::make_unique(); + m_alias = GenerateInstanceAlias(); + m_containerEntity = containerEntity ? AZStd::move(containerEntity) + : AZStd::make_unique(); EntityAlias containerEntityAlias = GenerateEntityAlias(); RegisterEntity(m_containerEntity->GetId(), containerEntityAlias); } Instance::~Instance() { - // Clean up Instance associations. - if (m_templateId != InvalidTemplateId && - !m_templateInstanceMapper->UnregisterInstance(*this)) - { - AZ_Assert(false, - "Prefab - Attempted to unregister Instance from Template on file path '%s' with Id '%u'. " - "Instance may never have been registered or was unregistered early.", - m_templateSourcePath.c_str(), - m_templateId); - } - - ClearEntities(); - - m_nestedInstances.clear(); + Reset(); } void Instance::Reflect(AZ::ReflectContext* context) @@ -121,31 +115,31 @@ namespace AzToolsFramework return m_linkId; } - const AZStd::string& Instance::GetTemplateSourcePath() const + const AZ::IO::Path& Instance::GetTemplateSourcePath() const { return m_templateSourcePath; } - void Instance::SetTemplateSourcePath(AZStd::string sourcePath) + void Instance::SetTemplateSourcePath(AZ::IO::PathView sourcePath) { - m_templateSourcePath = AZStd::move(sourcePath); - - AZStd::string filename; - if (AZ::StringFunc::Path::GetFileName(m_templateSourcePath.c_str(), filename)) - { - m_containerEntity->SetName(filename); - } + m_templateSourcePath = sourcePath; + m_containerEntity->SetName(sourcePath.Filename().Native()); } bool Instance::AddEntity(AZ::Entity& entity) { EntityAlias newEntityAlias = GenerateEntityAlias(); - if (!RegisterEntity(entity.GetId(), newEntityAlias)) + return AddEntity(entity, newEntityAlias); + } + + bool Instance::AddEntity(AZ::Entity& entity, EntityAlias entityAlias) + { + if (!RegisterEntity(entity.GetId(), entityAlias)) { return false; } - if (!m_entities.emplace(AZStd::make_pair(newEntityAlias, &entity)).second) + if (!m_entities.emplace(AZStd::make_pair(entityAlias, &entity)).second) { return false; } @@ -167,6 +161,7 @@ namespace AzToolsFramework "This happens when the entity is not correctly removed from all the prefab system entity maps.", entityId.ToString().c_str(), m_templateSourcePath.c_str()); } + return DetachEntity(entityAliasToRemove); } @@ -217,6 +212,31 @@ namespace AzToolsFramework } } + void Instance::Reset() + { + // Clean up Instance associations. + if (m_templateId != InvalidTemplateId && !m_templateInstanceMapper->UnregisterInstance(*this)) + { + AZ_Assert( + false, + "Prefab - Attempted to unregister Instance from Template on file path '%s' with Id '%u'. " + "Instance may never have been registered or was unregistered early.", + m_templateSourcePath.c_str(), m_templateId); + } + + ClearEntities(); + + m_nestedInstances.clear(); + + if (m_containerEntity) + { + m_instanceEntityMapper->UnregisterEntity(m_containerEntity->GetId()); + m_containerEntity.reset(aznew AZ::Entity()); + RegisterEntity(m_containerEntity->GetId(), GenerateEntityAlias()); + } + + } + void Instance::RemoveEntities( const AZStd::function&)>& filter) { @@ -400,7 +420,9 @@ namespace AzToolsFramework } } - entities.reserve(entities.size() + currentInstance->m_entities.size()); + // Size increases by 1 for each instance because we have to count the container entity also. + entities.reserve(entities.size() + currentInstance->m_entities.size() + 1); + entities.push_back(m_containerEntity.get()); for (const auto& entityByAlias : currentInstance->m_entities) { entities.push_back(entityByAlias.second.get()); @@ -441,55 +463,53 @@ namespace AzToolsFramework return nestedInstanceAliases; } - EntityAlias Instance::GenerateEntityAlias() + AliasPath Instance::GetAbsoluteInstanceAliasPath() const { - return "Entity_" + AZ::Entity::MakeId().ToString(); - } + // Reset the path using our preferred separator + AliasPath aliasPathResult = AliasPath(s_aliasPathSeparator); + const Instance* currentInstance = this; - InstanceAlias Instance::GenerateInstanceAlias() - { - return "Instance_" + AZ::Entity::MakeId().ToString(); - } + // If no parent instance we are a root instance and our absolute path is empty + AZStd::vector pathOfInstances; - void Instance::InitializeNestedEntities() - { - InitializeEntities(); + while (currentInstance->m_parent) + { + pathOfInstances.emplace_back(currentInstance); + currentInstance = currentInstance->m_parent; + } + + pathOfInstances.emplace_back(currentInstance); - for (const auto&[instanceAlias, instance] : m_nestedInstances) + for (auto instanceIter = pathOfInstances.rbegin(); instanceIter != pathOfInstances.rend(); ++instanceIter) { - instance->InitializeNestedEntities(); + aliasPathResult.Append((*instanceIter)->m_alias); } + + return aliasPathResult; } - void Instance::InitializeEntities() + EntityAlias Instance::GenerateEntityAlias() { - for (const auto&[entityAlias, entity] : m_entities) - { - if (AZ::Entity::State::Constructed == entity->GetState()) - { - entity->Init(); - } - } + return AZStd::string::format("Entity_%s", AZ::Entity::MakeId().ToString().c_str()); + } + + InstanceAlias Instance::GenerateInstanceAlias() + { + return AZStd::string::format("Instance_%s", AZ::Entity::MakeId().ToString().c_str()); } - void Instance::ActivateNestedEntities() + void Instance::ActivateContainerEntity() { - ActivateEntities(); + AZ_Assert(m_containerEntity, "Container entity of instance is null."); - for (const auto&[instanceAlias, instance] : m_nestedInstances) + if (AZ::Entity::State::Constructed == m_containerEntity->GetState()) { - instance->ActivateNestedEntities(); + m_containerEntity->Init(); } - } - void Instance::ActivateEntities() - { - for (const auto&[entityAlias, entity] : m_entities) + if (AZ::Entity::State::Init == m_containerEntity->GetState()) { - if(AZ::Entity::State::Init == entity->GetState()) - { - entity->Activate(); - } + m_containerEntity->Activate(); } } @@ -545,5 +565,38 @@ namespace AzToolsFramework { return m_containerEntity->GetId(); } + + bool Instance::HasContainerEntity() const + { + return m_containerEntity.get() != nullptr; + } + + EntityOptionalReference Instance::GetContainerEntity() + { + if (m_containerEntity) + { + return *m_containerEntity; + } + return AZStd::nullopt; + } + + EntityOptionalConstReference Instance::GetContainerEntity() const + { + if (m_containerEntity) + { + return *m_containerEntity; + } + return AZStd::nullopt; + } + + void Instance::SetContainerEntity(AZ::Entity& entity) + { + m_containerEntity.reset(&entity); + } + + AZStd::unique_ptr Instance::DetachContainerEntity() + { + return AZStd::move(m_containerEntity); + } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h index 05cbfad926..d1c7a4d853 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h @@ -13,6 +13,7 @@ #pragma once #include +#include #include #include #include @@ -38,8 +39,10 @@ namespace AzToolsFramework class InstanceEntityMapperInterface; class TemplateInstanceMapperInterface; - using InstanceAlias = AZStd::string; + using AliasPath = AZ::IO::Path; + using AliasPathView = AZ::IO::PathView; using EntityAlias = AZStd::string; + using InstanceAlias = AZStd::string; class Instance; using EntityAliasOptionalReference = AZStd::optional>; @@ -47,6 +50,8 @@ namespace AzToolsFramework using InstanceOptionalConstReference = AZStd::optional>; using InstanceSet = AZStd::unordered_set; using InstanceSetConstReference = AZStd::optional>; + using EntityOptionalReference = AZStd::optional>; + using EntityOptionalConstReference = AZStd::optional>; // A prefab instance is the container for when a Prefab Template is Instantiated. class Instance @@ -62,6 +67,7 @@ namespace AzToolsFramework using EntityList = AZStd::vector; Instance(); + explicit Instance(AZStd::unique_ptr containerEntity); virtual ~Instance(); Instance(const Instance& rhs) = delete; @@ -72,14 +78,17 @@ namespace AzToolsFramework const TemplateId& GetTemplateId() const; void SetTemplateId(const TemplateId& templateId); - const AZStd::string& GetTemplateSourcePath() const; - void SetTemplateSourcePath(AZStd::string sourcePath); + const AZ::IO::Path& GetTemplateSourcePath() const; + void SetTemplateSourcePath(AZ::IO::PathView sourcePath); bool AddEntity(AZ::Entity& entity); + bool AddEntity(AZ::Entity& entity, EntityAlias entityAlias); AZStd::unique_ptr DetachEntity(const AZ::EntityId& entityId); void DetachNestedEntities(const AZStd::function)>& callback); void RemoveNestedEntities(const AZStd::function&)>& filter); + void Reset(); + Instance& AddInstance(AZStd::unique_ptr instance); AZStd::unique_ptr DetachNestedInstance(const InstanceAlias& instanceAlias); @@ -128,17 +137,7 @@ namespace AzToolsFramework */ AZStd::vector GetNestedInstanceAliases(TemplateId templateId) const; - /** - * Initializes all entities, including those in nested entities - */ - void InitializeNestedEntities(); - void InitializeEntities(); - - /** - * Activates all entities, including those in nested entities - */ - void ActivateNestedEntities(); - void ActivateEntities(); + void ActivateContainerEntity(); InstanceOptionalReference FindNestedInstance(const InstanceAlias& nestedInstanceAlias); @@ -158,6 +157,18 @@ namespace AzToolsFramework AZ::EntityId GetContainerEntityId() const; + bool HasContainerEntity() const; + + EntityOptionalReference GetContainerEntity(); + EntityOptionalConstReference GetContainerEntity() const; + + void SetContainerEntity(AZ::Entity& entity); + + AZStd::unique_ptr DetachContainerEntity(); + + static EntityAlias GenerateEntityAlias(); + AliasPath GetAbsoluteInstanceAliasPath() const; + protected: /** * Gets the entities owned by this instance @@ -165,6 +176,7 @@ namespace AzToolsFramework void GetEntities(EntityList& entities, bool includeNestedEntities = false); private: + static constexpr const char s_aliasPathSeparator = '/'; void ClearEntities(); @@ -174,7 +186,6 @@ namespace AzToolsFramework bool RegisterEntity(const AZ::EntityId& entityId, const EntityAlias& entityAlias); AZStd::unique_ptr DetachEntity(const EntityAlias& entityAlias); - static EntityAlias GenerateEntityAlias(); static InstanceAlias GenerateInstanceAlias(); // Provide access to private data members in the serializer @@ -202,7 +213,7 @@ namespace AzToolsFramework InstanceAlias m_alias; // The source path of the template this instance represents - AZStd::string m_templateSourcePath; + AZ::IO::Path m_templateSourcePath; // The unique ID of the template this Instance belongs to. TemplateId m_templateId = InvalidTemplateId; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.cpp index f4c8a8bbbc..8a72b221dc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.cpp @@ -11,7 +11,10 @@ */ #include +#include #include +#include + #include #include #include @@ -44,19 +47,15 @@ namespace AzToolsFramework if (!inputAlias.empty()) { - if (m_isEntityReference) - { - m_unresolvedEntityAliases[m_loadingInstance].emplace_back(inputAlias, &outputValue); - } - else - { - mappedValue = AZ::Entity::MakeId(); + AliasPath absoluteEntityPath = m_loadingInstance->GetAbsoluteInstanceAliasPath(); + absoluteEntityPath.Append(inputAlias); + absoluteEntityPath = absoluteEntityPath.LexicallyNormal(); - if (m_loadingInstance->RegisterEntity(mappedValue, inputAlias)) - { - m_resolvedEntityAliases[m_loadingInstance].emplace_back(inputAlias, mappedValue); - } - else + mappedValue = GenerateEntityIdForAliasPath(absoluteEntityPath, m_randomSeed); + + if (!m_isEntityReference) + { + if (!m_loadingInstance->RegisterEntity(mappedValue, inputAlias)) { mappedValue = AZ::EntityId(AZ::EntityId::InvalidEntityId); context.Report(JSR::Tasks::ReadField, JSR::Outcomes::DefaultsUsed, @@ -67,7 +66,7 @@ namespace AzToolsFramework outputValue = mappedValue; - return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Success, "Succesfully mapped Entity Id For Prefab Instance load"); + return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Success, "Successfully mapped Entity Id For Prefab Instance load"); } AZ::JsonSerializationResult::Result InstanceEntityIdMapper::MapIdToJson(rapidjson::Value& outputValue, @@ -77,9 +76,6 @@ namespace AzToolsFramework if (!m_storingInstance) { - AZ_Assert(false, - "Attempted to map an EntityId in Prefab Instance without setting the Storing Prefab Instance"); - return context.Report(JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, "Attempted to map an EntityId in Prefab Instance without setting the Storing Prefab Instance"); } @@ -104,8 +100,6 @@ namespace AzToolsFramework AZStd::string defaultErrorMessage = "Entity with Id " + inputValue.ToString() + " could not be found within its owning instance. Defaulting to invalid Id for Store."; - - AZ_Assert(false, defaultErrorMessage.c_str()); context.Report(JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, defaultErrorMessage); } } @@ -113,90 +107,45 @@ namespace AzToolsFramework outputValue.SetString(rapidjson::StringRef(mappedValue.c_str(), mappedValue.length()), context.GetJsonAllocator()); - return context.Report(JSR::Tasks::WriteValue, JSR::Outcomes::Success, "Succesfully mapped Entity Id For Prefab Instance store"); - } - - void InstanceEntityIdMapper::SetStoringInstance(const Instance& storingInstance) - { - m_storingInstance = &storingInstance; - GetAbsoluteInstanceAliasPath(m_storingInstance, m_instanceAbsolutePath); + return context.Report(JSR::Tasks::WriteValue, JSR::Outcomes::Success, "Successfully mapped Entity Id For Prefab Instance store"); } - void InstanceEntityIdMapper::SetLoadingInstance(Instance& loadingInstance) + void InstanceEntityIdMapper::SetEntityIdGenerationApproach(EntityIdGenerationApproach approach) { - m_loadingInstance = &loadingInstance; - } + m_entityIdGenerationApproach = approach; - void InstanceEntityIdMapper::FixUpUnresolvedEntityReferences() - { - // Nothing to resolve - if (m_unresolvedEntityAliases.empty()) + if (m_entityIdGenerationApproach == EntityIdGenerationApproach::Hashed) { - return; + m_randomSeed = SeedKey; } - - // Calculate the absolute path to each instance based on its position in the hierarchy - // We'll use this to generate the absolute paths of resolved and unresolved aliases - AZStd::unordered_map absoluteInstanceAliasPaths; - absoluteInstanceAliasPaths.reserve(m_resolvedEntityAliases.bucket_count()); - - // Also calculate the absolute path to each resolved entity based on its position in the hierarchy - AZStd::unordered_map resolvedAbsoluteEntityAliasPaths; - - for (auto& [instance, resolvedAliasIdList] : m_resolvedEntityAliases) + else if (m_entityIdGenerationApproach == EntityIdGenerationApproach::Random) { - AliasPath absoluteInstancePath; - GetAbsoluteInstanceAliasPath(instance, absoluteInstancePath); + m_randomSeed = AZ::Sfmt::GetInstance().Rand64(); - absoluteInstanceAliasPaths.emplace(instance, absoluteInstancePath); - - for (auto& [entityAlias, entityId] : resolvedAliasIdList) + // Sanity check to avoid collision with hashed mode + if (m_randomSeed == SeedKey) { - resolvedAbsoluteEntityAliasPaths.emplace(absoluteInstancePath / entityAlias, entityId); + m_randomSeed++; } } - - // Using the absolute paths of the instances containing the unresolved aliases - // Attempt to find a match within the resolved paths - // A match will allow us to update the unresolved reference id to match the id it's referencing - for (auto& [instance, unresolvedAliasIdList] : m_unresolvedEntityAliases) + else { - auto findResolvedInstance = absoluteInstanceAliasPaths.find(instance); + AZ_Assert(false, "Unsupported option in EntityIdGenerationApproach encountered." + " Defaulting to Hashed"); - if (findResolvedInstance != absoluteInstanceAliasPaths.end()) - { - AliasPath& absoluteInstancePath = findResolvedInstance->second; - - for (auto& [entityAlias, entityPointer] : unresolvedAliasIdList) - { - AliasPath absoluteEntityReferencePath = (absoluteInstancePath / entityAlias).LexicallyNormal(); - - auto foundResolvedPath = - resolvedAbsoluteEntityAliasPaths.find(absoluteEntityReferencePath); - - if (foundResolvedPath != resolvedAbsoluteEntityAliasPaths.end()) - { - *entityPointer = foundResolvedPath->second; - } - else - { - AZ_Warning("Prefabs", false, - "Unable to resolve entity reference alias path [%s] while loading Prefab instance. " - "The reference was likely made on a parent or sibling prefab without the use of an override. " - "Defaulting the reference to an invalid EntityId.", - absoluteEntityReferencePath.String().c_str()); - } - } - } - else - { - AZ_Assert(false, "Prefabs - " - "Attempted to resolve entity alias path(s) but the instance owning the unresolved reference has no entities. " - "An Entity Reference can only come from an entity/component property."); - } + m_randomSeed = SeedKey; } + } - return; + void InstanceEntityIdMapper::SetStoringInstance(const Instance& storingInstance) + { + m_storingInstance = &storingInstance; + m_instanceAbsolutePath = m_storingInstance->GetAbsoluteInstanceAliasPath(); + } + + void InstanceEntityIdMapper::SetLoadingInstance(Instance& loadingInstance) + { + m_loadingInstance = &loadingInstance; } EntityAlias InstanceEntityIdMapper::ResolveReferenceId(const AZ::EntityId& entityId) @@ -209,7 +158,7 @@ namespace AzToolsFramework AliasPath relativeEntityAliasPath; if (!owningInstanceReference) { - AZ_Assert(false, + AZ_Warning("Prefabs", false, "Prefab - EntityIdMapper: Entity with Id %s has no registered owning instance", entityId.ToString().c_str()); @@ -220,24 +169,16 @@ namespace AzToolsFramework // Build out the absolute path of this alias // so we can compare it to the absolute path of our currently scoped instance - GetAbsoluteInstanceAliasPath(owningInstance, relativeEntityAliasPath); + relativeEntityAliasPath = owningInstance->GetAbsoluteInstanceAliasPath(); relativeEntityAliasPath.Append(owningInstance->GetEntityAlias(entityId)->get()); return relativeEntityAliasPath.LexicallyRelative(m_instanceAbsolutePath).String(); } - void InstanceEntityIdMapper::GetAbsoluteInstanceAliasPath(const Instance* instance, AliasPath& aliasPathResult) + AZ::EntityId InstanceEntityIdMapper::GenerateEntityIdForAliasPath(const AliasPathView& aliasPath, uint64_t seedKey) { - // Reset the path using our preferred seperator - aliasPathResult = AliasPath(m_aliasPathSeperator); - const Instance* currentInstance = instance; - - // If no parent instance we are a root instance and our absolute path is empty - while (currentInstance->m_parent) - { - aliasPathResult.Append(currentInstance->m_alias); - currentInstance = currentInstance->m_parent; - } + const AZ::HashValue64 seed = aznumeric_cast(seedKey); + return AZ::EntityId(aznumeric_cast((AZ::TypeHash64(aliasPath.Native().data(), seed)))); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h index 01e05c7a11..590b2c94fe 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h @@ -25,41 +25,37 @@ namespace AzToolsFramework : public AZ::JsonEntityIdSerializer::JsonEntityIdMapper { public: + enum class EntityIdGenerationApproach + { + Hashed, //! Creates an entity id that's stable between runs. (Default) + Random //! Entities get a new randomly generate id. + }; + AZ_RTTI(InstanceEntityIdMapper, "{EA76C3A7-1210-4DFB-A1C0-2F8E8B0B888E}", AZ::JsonEntityIdSerializer::JsonEntityIdMapper); + static inline constexpr uint64_t SeedKey = 5915587277; // Random prime number + AZ::JsonSerializationResult::Result MapJsonToId(AZ::EntityId& outputValue, const rapidjson::Value& inputValue, AZ::JsonDeserializerContext& context) override; AZ::JsonSerializationResult::Result MapIdToJson(rapidjson::Value& outputValue, const AZ::EntityId& inputValue, AZ::JsonSerializerContext& context) override; + void SetEntityIdGenerationApproach(EntityIdGenerationApproach approach); + void SetStoringInstance(const Instance& storingInstance); void SetLoadingInstance(Instance& loadingInstance); - /** - * Fixes up any unresolved entity references by assigning them to the id value of the entity it references. - * This is done by computing the absolute alias paths of all EntityIds and EntityId references - * then matching the references to the id values they reference. - * During a load instance and alias information is stored to build out these paths, - * but will be incomplete until the whole Load call is finished. - * Calling this after Load and the mapper have finished will give complete information - * on all entities and references discovered in the load - */ - void FixUpUnresolvedEntityReferences(); + static AZ::EntityId GenerateEntityIdForAliasPath(const AliasPathView& aliasPath, uint64_t seedKey = SeedKey); private: - using AliasPath = AZ::IO::Path; - EntityAlias ResolveReferenceId(const AZ::EntityId& entityId); - void GetAbsoluteInstanceAliasPath(const Instance* instance, AliasPath& aliasPathResult); - AliasPath m_instanceAbsolutePath; const Instance* m_storingInstance = nullptr; Instance* m_loadingInstance = nullptr; - static constexpr const char m_aliasPathSeperator = '/'; + uint64_t m_randomSeed = SeedKey; - AZStd::unordered_map>> m_resolvedEntityAliases; - AZStd::unordered_map>> m_unresolvedEntityAliases; + EntityIdGenerationApproach m_entityIdGenerationApproach { EntityIdGenerationApproach::Hashed }; }; } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h index 2860cc3c93..39c53a72b9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h @@ -13,6 +13,7 @@ #pragma once #include +#include namespace AZ { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityScrubber.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityScrubber.cpp new file mode 100644 index 0000000000..e8fea0a6df --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityScrubber.cpp @@ -0,0 +1,28 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +namespace AzToolsFramework +{ + namespace Prefab + { + InstanceEntityScrubber::InstanceEntityScrubber(Instance::EntityList& entities) + : m_entities(entities) + {} + + void InstanceEntityScrubber::AddEntitiesToScrub(const EntityList& entities) + { + m_entities.insert(m_entities.end(), entities.begin(), entities.end()); + } + } +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityScrubber.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityScrubber.h new file mode 100644 index 0000000000..193d9ad496 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceEntityScrubber.h @@ -0,0 +1,44 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include +#include +#include + +namespace AZ +{ + class Entity; +} + +namespace AzToolsFramework +{ + using EntityList = AZStd::vector; + + namespace Prefab + { + //! Collects the entities added during deserialization + class InstanceEntityScrubber + { + public: + AZ_RTTI(InstanceEntityScrubber, "{0BC12562-C240-48AD-89C6-EDF572C9B485}"); + + explicit InstanceEntityScrubber(Instance::EntityList& entities); + + void AddEntitiesToScrub(const EntityList& entities); + + private: + Instance::EntityList& m_entities; + }; + } + } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp index 58a2b72fb2..fc57b5905e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp @@ -13,9 +13,11 @@ #include #include #include +#include #include #include #include +#include #include namespace AzToolsFramework @@ -46,8 +48,8 @@ namespace AzToolsFramework JSR::ResultCode result(JSR::Tasks::WriteValue); { AZ::ScopedContextPath subPathSource(context, "m_templateSourcePath"); - const AZStd::string* sourcePath = &instance->GetTemplateSourcePath(); - const AZStd::string* defaultSourcePath = defaultInstance ? &defaultInstance->GetTemplateSourcePath() : nullptr; + const AZStd::string* sourcePath = &(instance->GetTemplateSourcePath().Native()); + const AZStd::string* defaultSourcePath = defaultInstance ? &defaultInstance->GetTemplateSourcePath().Native() : nullptr; result = ContinueStoringToJsonObjectField(outputValue, "Source", sourcePath, defaultSourcePath, azrtti_typeid(), context); } @@ -64,7 +66,6 @@ namespace AzToolsFramework AZ::ScopedContextPath subPathEntities(context, "m_entities"); const Instance::AliasToEntityMap* entities = &instance->m_entities; const Instance::AliasToEntityMap* defaultEntities = defaultInstance ? &defaultInstance->m_entities : nullptr; - JSR::ResultCode resultEntities = ContinueStoringToJsonObjectField(outputValue, "Entities", entities, defaultEntities, azrtti_typeid(), context); @@ -116,6 +117,15 @@ namespace AzToolsFramework AZ_Assert(prefabSystemComponentInterface, "PrefabSystemComponentInterface could not be found. It is required to load Prefab Instances"); + PrefabLoaderInterface* loaderInterface = AZ::Interface::Get(); + + AZ_Assert( + loaderInterface, + "PrefabLoaderInterface could not be found. It is required to load Prefab Instances"); + + // Make sure we have a relative path + instance->m_templateSourcePath = loaderInterface->GetRelativePathToProject(instance->m_templateSourcePath); + TemplateId templateId = prefabSystemComponentInterface->GetTemplateIdFromFilePath(instance->GetTemplateSourcePath()); instance->SetTemplateId(templateId); @@ -125,25 +135,35 @@ namespace AzToolsFramework } { - // An already filled instance should be cleared if inputValue's Instances member is empty - // The Json serializer will not do this by default as it will not attempt to load a missing member - if (!instance->m_nestedInstances.empty() && !inputValue.HasMember("Instances")) - { - instance->m_nestedInstances.clear(); - } - - JSR::ResultCode instanceResult = - ContinueLoadingFromJsonObjectField(&instance->m_nestedInstances, azrtti_typeid(), inputValue, "Instances", context); + instance->m_nestedInstances.clear(); - if (instanceResult.GetProcessing() != JSR::Processing::Halted) + // Load nested instances iteratively + // We want to first create the nested instance object and assign its alias and parent pointer + // These values are needed for the idmapper to properly resolve alias paths + auto instancesMemberIter = inputValue.FindMember("Instances"); + if (instancesMemberIter != inputValue.MemberEnd() && instancesMemberIter->value.IsObject()) { - for (auto& nestedInstance : instance->m_nestedInstances) + for (auto& instanceIter : instancesMemberIter->value.GetObject()) { - nestedInstance.second->m_parent = instance; - nestedInstance.second->m_alias = nestedInstance.first; + const rapidjson::Value& instanceAliasValue = instanceIter.name; + + InstanceAlias instanceAlias(instanceAliasValue.GetString(), + instanceAliasValue.GetStringLength()); + + AZStd::unique_ptr nestedInstance = AZStd::make_unique(); + + nestedInstance->m_alias = instanceAlias; + nestedInstance->m_parent = instance; + + result.Combine( + ContinueLoading(&nestedInstance, azrtti_typeid(), + instanceIter.value, context)); + + instance->m_nestedInstances.emplace( + instanceAlias, + AZStd::move(nestedInstance)); } } - result.Combine(instanceResult); } // An already filled instance should be cleared if inputValue's Entities member is empty @@ -153,6 +173,7 @@ namespace AzToolsFramework if (instance->m_containerEntity) { instance->m_instanceEntityMapper->UnregisterEntity(instance->m_containerEntity->GetId()); + instance->m_containerEntity.reset(); } if (idMapper && *idMapper) @@ -168,7 +189,10 @@ namespace AzToolsFramework } { - result.Combine(ContinueLoadingFromJsonObjectField(&instance->m_entities, azrtti_typeid(), inputValue, "Entities", context)); + JSR::ResultCode entitiesResult = ContinueLoadingFromJsonObjectField( + &instance->m_entities, azrtti_typeid(), inputValue, "Entities", context); + AddEntitiesToScrub(instance, context); + result.Combine(entitiesResult); } { @@ -179,5 +203,29 @@ namespace AzToolsFramework result.GetProcessing() == JSR::Processing::Completed ? "Succesfully loaded instance information for prefab." : "Failed to load instance information for prefab"); } - } + + void JsonInstanceSerializer::AddEntitiesToScrub(const Instance* instance, AZ::JsonDeserializerContext& jsonDeserializerContext) + { + EntityList entitiesInInstance; + entitiesInInstance.reserve(instance->m_entities.size() + 1); + + if (instance->m_containerEntity->GetId().IsValid()) + { + entitiesInInstance.emplace_back(instance->m_containerEntity.get()); + } + + for (const auto& [entityAlias, entity] : instance->m_entities) + { + entitiesInInstance.emplace_back(entity.get()); + } + + InstanceEntityScrubber** instanceEntityScrubber = jsonDeserializerContext.GetMetadata().Find(); + if (instanceEntityScrubber && (*instanceEntityScrubber)) + + { + (*instanceEntityScrubber)->AddEntitiesToScrub(entitiesInInstance); + } + } + + } // namespace Prefab } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.h index 8a254980b7..319e31315c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.h @@ -34,6 +34,11 @@ namespace AzToolsFramework AZ::JsonSerializationResult::Result Load(void* outputValue, const AZ::Uuid& outputValueTypeId, const rapidjson::Value& inputValue, AZ::JsonDeserializerContext& context) override; + + private: + //! Adds the entities of an instance to a InstanceEntityScrubber object in the metadata of JsonDeserializerContext + //! so that they can be scrubbed later. + void AddEntitiesToScrub(const Instance* instance, AZ::JsonDeserializerContext& jsonDeserializercontext); }; } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplateInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplateInterface.h index f237e6ff1d..6fdcd7eb59 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplateInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplateInterface.h @@ -14,7 +14,10 @@ #include #include +#include +#include #include +#include namespace AzToolsFramework { @@ -40,12 +43,14 @@ namespace AzToolsFramework const PrefabDom& modifiedState, const LinkId linkId) = 0; //! Updates the affected template for a given entityId using the providedPatch - virtual void PatchEntityInTemplate(PrefabDomValue& providedPatch, const AZ::EntityId& entityId) = 0; + virtual bool PatchEntityInTemplate(PrefabDomValue& providedPatch, const AZ::EntityId& entityId) = 0; - virtual void PatchEntityInTemplate(PrefabDomValue& providedPatch, const EntityAlias& entityAlias, const TemplateId& templateId) = 0; + virtual bool PatchEntityInTemplate(PrefabDomValue& providedPatch, const EntityAlias& entityAlias, const TemplateId& templateId) = 0; + + virtual void AppendEntityAliasToPatchPaths(PrefabDom& providedPatch, const AZ::EntityId& entityId) = 0; //! Updates the template links (updating instances) for the given templateId using the providedPatch - virtual void PatchTemplate(PrefabDomValue& providedPatch, const AzToolsFramework::Prefab::TemplateId& templateId) = 0; + virtual void PatchTemplate(PrefabDomValue& providedPatch, const TemplateId& templateId) = 0; virtual void ApplyPatchesToInstance(const AZ::EntityId& entityId, PrefabDom& patches, const Instance& instanceToAddPatches) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.cpp index af059a7f42..dcc78bb45e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.cpp @@ -81,7 +81,7 @@ namespace AzToolsFramework bool InstanceToTemplatePropagator::GeneratePatch(PrefabDom& generatedPatch, const PrefabDom& initialState, const PrefabDom& modifiedState) { - //generate patch using jsonserialization CreatePatch + //generate patch using json serialization CreatePatch AZ::JsonSerializationResult::ResultCode result = AZ::JsonSerialization::CreatePatch(generatedPatch, generatedPatch.GetAllocator(), initialState, modifiedState, AZ::JsonMergeApproach::JsonPatch); @@ -107,11 +107,17 @@ namespace AzToolsFramework return result.GetProcessing() != AZ::JsonSerializationResult::Processing::Halted; } - void InstanceToTemplatePropagator::PatchEntityInTemplate(PrefabDomValue& providedPatch, const AZ::EntityId& entityId) + bool InstanceToTemplatePropagator::PatchEntityInTemplate(PrefabDomValue& providedPatch, const AZ::EntityId& entityId) { InstanceOptionalReference instanceOptionalReference = m_instanceEntityMapperInterface->FindOwningInstance(entityId); - AZ_Error("Prefab", instanceOptionalReference, - "Failed to find an owning instance for the entity with id %llu.", static_cast(entityId)); + + if (!instanceOptionalReference) + { + AZ_Error( + "Prefab", false, "Failed to find an owning instance for the entity with id %llu.", + static_cast(entityId)); + return false; + } //get template space associated with instance Instance& instance = instanceOptionalReference->get(); @@ -119,33 +125,95 @@ namespace AzToolsFramework //alias entity goes by in template -> get via owning instance map AZStd::optional entityAlias = instance.GetEntityAlias(entityId); - AZ_Error("Prefab", entityAlias != AZStd::nullopt, - "Failed to find an entity alias for the provided entity"); + + if (!entityAlias) + { + AZ_Error("Prefab", false, "Failed to find an entity alias for the provided entity"); + return false; + } PrefabDom& templateDomReference = m_prefabSystemComponentInterface->FindTemplateDom(templateId); - PatchEntityInTemplate(providedPatch, entityAlias.value(), templateId); + return PatchEntityInTemplate(providedPatch, entityAlias.value(), templateId); } - void InstanceToTemplatePropagator::PatchEntityInTemplate(PrefabDomValue& providedPatch, const EntityAlias& entityAlias, const TemplateId& templateId) + bool InstanceToTemplatePropagator::PatchEntityInTemplate(PrefabDomValue& providedPatch, const EntityAlias& entityAlias, const TemplateId& templateId) { PrefabDom& templateDomReference = m_prefabSystemComponentInterface->FindTemplateDom(templateId); //query into the template dom for the alias PrefabDomValueReference entityList = PrefabDomUtils::FindPrefabDomValue(templateDomReference, PrefabDomUtils::EntitiesName); + if (!entityList) + { + AZ_Error("Prefab", false, "Cannot patch entity in Template with id [%llu] because entity couldn't be found in the template", templateId); + return false; + } + PrefabDomValueReference entity = PrefabDomUtils::FindPrefabDomValue(entityList->get(), entityAlias.c_str()); - AZ_Error("Prefab", entity != AZStd::nullopt, "Failed to aquire entity value reference") + + if (!entity) + { + AZ_Error("Prefab", false, "Failed to aquire entity value reference"); + return false; + } //apply patch to section AZ::JsonSerializationResult::ResultCode result = AZ::JsonSerialization::ApplyPatch(entity->get(), templateDomReference.GetAllocator(), providedPatch, AZ::JsonMergeApproach::JsonPatch); - AZ_Error("Prefab", result.GetOutcome() == AZ::JsonSerializationResult::Outcomes::Success, - "Patch was not successfully applied") + AZ_Error("Prefab", result.GetOutcome() == AZ::JsonSerializationResult::Outcomes::Success, "Patch was not successfully applied") - //update the Dom and trigger propogation + //trigger propagation m_prefabSystemComponentInterface->PropagateTemplateChanges(templateId); + return true; + } + + void InstanceToTemplatePropagator::AppendEntityAliasToPatchPaths(PrefabDom& providedPatch, const AZ::EntityId& entityId) + { + if (!providedPatch.IsArray()) + { + AZ_Error("Prefab", false, "Patch is not an array of updates. Update failed."); + return; + } + + //create the prefix for the update - choosing between container and regular entities + AZStd::string prefix = "/"; + + //grab the owning instance so we can use the entityIdMapper in settings + InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + AZ_Assert(owningInstance != AZStd::nullopt, "Owning Instance is null"); + + bool isContainerEntity = entityId == owningInstance->get().GetContainerEntityId(); + + if (isContainerEntity) + { + prefix += PrefabDomUtils::ContainerEntityName; + } + else + { + EntityAliasOptionalReference entityAliasRef = owningInstance->get().GetEntityAlias(entityId); + prefix += PrefabDomUtils::EntitiesName; + prefix += "/"; + prefix += entityAliasRef->get(); + } + + //update all entities or just the single container + for (auto& patchValue : providedPatch.GetArray()) + { + auto pathIter = patchValue.FindMember("path"); + + if (pathIter == patchValue.MemberEnd() || !(pathIter->value.IsString())) + { + AZ_Error("Prefab", false, "Was not able to find path member within patch dom. " + "A non prefab dom patch may have been passed in."); + continue; + } + + AZStd::string path = prefix + pathIter->value.GetString(); + + pathIter->value.SetString(path.c_str(), path.length(), providedPatch.GetAllocator()); + } } void InstanceToTemplatePropagator::PatchTemplate(PrefabDomValue& providedPatch, const TemplateId& templateId) @@ -159,9 +227,10 @@ namespace AzToolsFramework AZ_Error("Prefab", result.GetOutcome() == AZ::JsonSerializationResult::Outcomes::Success, "Patch was not successfully applied"); - //update the Dom and trigger propogation + //trigger propagation if (result.GetOutcome() == AZ::JsonSerializationResult::Outcomes::Success) { + m_prefabSystemComponentInterface->SetTemplateDirtyFlag(templateId, true); m_prefabSystemComponentInterface->PropagateTemplateChanges(templateId); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h index cbfe7a14cf..c094d6be3b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h @@ -31,8 +31,10 @@ namespace AzToolsFramework bool GeneratePatch(PrefabDom& generatedPatch, const PrefabDom& initialState, const PrefabDom& modifiedState) override; bool GeneratePatchForLink(PrefabDom& generatedPatch, const PrefabDom& initialState, const PrefabDom& modifiedState, LinkId linkId) override; - void PatchEntityInTemplate(PrefabDomValue& providedPatch, const AZ::EntityId& entityId) override; - void PatchEntityInTemplate(PrefabDomValue& providedPatch, const EntityAlias& entityAlias, const TemplateId& templateId) override; + bool PatchEntityInTemplate(PrefabDomValue& providedPatch, const AZ::EntityId& entityId) override; + bool PatchEntityInTemplate(PrefabDomValue& providedPatch, const EntityAlias& entityAlias, const TemplateId& templateId) override; + + void AppendEntityAliasToPatchPaths(PrefabDom& providedPatch, const AZ::EntityId& entityId) override; InstanceOptionalReference GetTopMostInstanceInHierarchy(AZ::EntityId entityId); @@ -40,8 +42,11 @@ namespace AzToolsFramework void ApplyPatchesToInstance(const AZ::EntityId& entityId, PrefabDom& patches, const Instance& instanceToAddPatches) override; - private: void AddPatchesToLink(PrefabDom& patches, Link& link); + + private: + + InstanceEntityMapperInterface* m_instanceEntityMapperInterface; PrefabSystemComponentInterface* m_prefabSystemComponentInterface; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp index 780ea7b89e..ed06065d1d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp @@ -12,12 +12,16 @@ #include +#include #include +#include +#include #include #include #include #include #include +#include namespace AzToolsFramework { @@ -72,42 +76,81 @@ namespace AzToolsFramework bool InstanceUpdateExecutor::UpdateTemplateInstancesInQueue() { - const int instanceCountToUpdateInBatch = m_instanceCountToUpdateInBatch == 0 ? m_instancesUpdateQueue.size() : m_instanceCountToUpdateInBatch; - TemplateId currentTemplateId = InvalidTemplateId; - TemplateReference currentTemplateReference = AZStd::nullopt; bool isUpdateSuccessful = true; - - for (int i = 0; i < instanceCountToUpdateInBatch; ++i) + if (!m_updatingTemplateInstancesInQueue) { - Instance* instanceToUpdate = m_instancesUpdateQueue.front(); - TemplateId instanceTemplateId = instanceToUpdate->GetTemplateId(); - if (currentTemplateId != instanceTemplateId) + m_updatingTemplateInstancesInQueue = true; + + const int instanceCountToUpdateInBatch = + m_instanceCountToUpdateInBatch == 0 ? m_instancesUpdateQueue.size() : m_instanceCountToUpdateInBatch; + TemplateId currentTemplateId = InvalidTemplateId; + TemplateReference currentTemplateReference = AZStd::nullopt; + + if (instanceCountToUpdateInBatch > 0) { - currentTemplateId = instanceTemplateId; - currentTemplateReference = m_prefabSystemComponentInterface->FindTemplate(currentTemplateId); - if (!currentTemplateReference.has_value()) + EntityIdList selectedEntityIds; + ToolsApplicationRequestBus::BroadcastResult(selectedEntityIds, &ToolsApplicationRequests::GetSelectedEntities); + ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequests::SetSelectedEntities, EntityIdList()); + + // Disable the Outliner to avoid showing the propagation steps + EntityOutlinerWidgetInterface* entityOutlinerWidgetInterface = AZ::Interface::Get(); + if (entityOutlinerWidgetInterface) { - AZ_Error("Prefab", false, - "InstanceUpdateExecutor::UpdateTemplateInstancesInQueue - " - "Could not find Template using Id '%llu'. Unable to update Instance.", - currentTemplateId); + entityOutlinerWidgetInterface->SetUpdatesEnabled(false); + } + + for (int i = 0; i < instanceCountToUpdateInBatch; ++i) + { + Instance* instanceToUpdate = m_instancesUpdateQueue.front(); + TemplateId instanceTemplateId = instanceToUpdate->GetTemplateId(); + if (currentTemplateId != instanceTemplateId) + { + currentTemplateId = instanceTemplateId; + currentTemplateReference = m_prefabSystemComponentInterface->FindTemplate(currentTemplateId); + if (!currentTemplateReference.has_value()) + { + AZ_Error( + "Prefab", false, + "InstanceUpdateExecutor::UpdateTemplateInstancesInQueue - " + "Could not find Template using Id '%llu'. Unable to update Instance.", + currentTemplateId); + + isUpdateSuccessful = false; + } + } + + Template& currentTemplate = currentTemplateReference->get(); + Instance::EntityList newEntities; + if (!PrefabDomUtils::LoadInstanceFromPrefabDom( + *instanceToUpdate, newEntities, currentTemplate.GetPrefabDom())) + { + AZ_Error( + "Prefab", false, + "InstanceUpdateExecutor::UpdateTemplateInstancesInQueue - " + "Could not load Instance from Prefab DOM of Template with Id '%llu' on file path '%s'.", + currentTemplateId, currentTemplate.GetFilePath().c_str()); + + isUpdateSuccessful = false; + } + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, newEntities); + + m_instancesUpdateQueue.pop(); - isUpdateSuccessful = false; } - } - Template& currentTemplate = currentTemplateReference->get(); - if (!PrefabDomUtils::LoadInstanceFromPrefabDom(*instanceToUpdate, currentTemplate.GetPrefabDom(), true)) - { - AZ_Error("Prefab", false, - "InstanceUpdateExecutor::UpdateTemplateInstancesInQueue - " - "Could not load Instance from Prefab DOM of Template with Id '%llu' on file path '%s'.", - currentTemplateId, currentTemplate.GetFilePath().c_str()); + ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequests::SetSelectedEntities, selectedEntityIds); - isUpdateSuccessful = false; + // Enable the Outliner + AZ::SystemTickBus::QueueFunction([entityOutlinerWidgetInterface]() { + if (entityOutlinerWidgetInterface) + { + entityOutlinerWidgetInterface->SetUpdatesEnabled(true); + } + }); } - m_instancesUpdateQueue.pop(); + m_updatingTemplateInstancesInQueue = false; } return isUpdateSuccessful; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.h index b954caf88a..04bd189816 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.h @@ -46,6 +46,7 @@ namespace AzToolsFramework TemplateInstanceMapperInterface* m_templateInstanceMapperInterface = nullptr; int m_instanceCountToUpdateInBatch = 0; AZStd::queue m_instancesUpdateQueue; + bool m_updatingTemplateInstancesInQueue { false }; }; } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomTypes.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomTypes.h index a6b25f8bbb..e32f817227 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomTypes.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomTypes.h @@ -26,6 +26,7 @@ namespace AzToolsFramework using PrefabDomPath = rapidjson::Pointer; using PrefabDomList = AZStd::vector; + using PrefabDomReference = AZStd::optional>; using PrefabDomValueReference = AZStd::optional>; using PrefabDomValueConstReference = AZStd::optional>; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp index 346aeca6c5..f8f018f2f7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp @@ -10,12 +10,17 @@ * */ +#include #include +#include #include #include +#include #include #include +#include + namespace AzToolsFramework { namespace Prefab @@ -71,15 +76,21 @@ namespace AzToolsFramework return true; } - bool LoadInstanceFromPrefabDom(Instance& instance, const PrefabDom& prefabDom, bool shouldClearContainers) + bool LoadInstanceFromPrefabDom(Instance& instance, const PrefabDom& prefabDom, LoadInstanceFlags flags) { InstanceEntityIdMapper entityIdMapper; entityIdMapper.SetLoadingInstance(instance); + if ((flags & LoadInstanceFlags::AssignRandomEntityId) == LoadInstanceFlags::AssignRandomEntityId) + { + entityIdMapper.SetEntityIdGenerationApproach(InstanceEntityIdMapper::EntityIdGenerationApproach::Random); + } AZ::JsonDeserializerSettings settings; + // The InstanceEntityIdMapper is registered twice because it's used in several places during deserialization where one is + // specific for the InstanceEntityIdMapper and once for the generic JsonEntityIdMapper. Because the Json Serializer's meta + // data has strict typing and doesn't look for inheritance both have to be explicitly added so they're found both locations. settings.m_metadata.Add(static_cast(&entityIdMapper)); settings.m_metadata.Add(&entityIdMapper); - settings.m_clearContainers = shouldClearContainers; AZ::JsonSerializationResult::ResultCode result = AZ::JsonSerialization::Load(instance, prefabDom, settings); @@ -93,12 +104,54 @@ namespace AzToolsFramework return false; } - entityIdMapper.FixUpUnresolvedEntityReferences(); + return true; + } + + bool LoadInstanceFromPrefabDom( + Instance& instance, Instance::EntityList& newlyAddedEntities, const PrefabDom& prefabDom, LoadInstanceFlags flags) + { + InstanceEntityIdMapper entityIdMapper; + entityIdMapper.SetLoadingInstance(instance); + if ((flags & LoadInstanceFlags::AssignRandomEntityId) == LoadInstanceFlags::AssignRandomEntityId) + { + entityIdMapper.SetEntityIdGenerationApproach(InstanceEntityIdMapper::EntityIdGenerationApproach::Random); + } + + AZ::JsonDeserializerSettings settings; + // The InstanceEntityIdMapper is registered twice because it's used in several places during deserialization where one is + // specific for the InstanceEntityIdMapper and once for the generic JsonEntityIdMapper. Because the Json Serializer's meta + // data has strict typing and doesn't look for inheritance both have to be explicitly added so they're found both locations. + settings.m_metadata.Add(static_cast(&entityIdMapper)); + settings.m_metadata.Add(&entityIdMapper); + + InstanceEntityScrubber instanceEntityScrubber(newlyAddedEntities); + settings.m_metadata.Add(&instanceEntityScrubber); + + AZ::JsonSerializationResult::ResultCode result = + AZ::JsonSerialization::Load(instance, prefabDom, settings); + + if (result.GetProcessing() == AZ::JsonSerializationResult::Processing::Halted) + { + AZ_Error("Prefab", false, + "Failed to de-serialize Prefab Instance from Prefab DOM. " + "Unable to proceed."); + + return false; + } return true; } + void PrintPrefabDomValue( + [[maybe_unused]] const AZStd::string_view printMessage, + [[maybe_unused]] const PrefabDomValue& prefabDomValue) + { + rapidjson::StringBuffer prefabBuffer; + rapidjson::PrettyWriter writer(prefabBuffer); + prefabDomValue.Accept(writer); + qDebug() << printMessage.data() << "\n" << prefabBuffer.GetString(); + } } // namespace PrefabDomUtils } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h index 3159e12bb3..c4b988e36f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h @@ -13,6 +13,7 @@ #pragma once #include +#include #include namespace AzToolsFramework @@ -27,6 +28,7 @@ namespace AzToolsFramework inline static const char* SourceName = "Source"; inline static const char* LinkIdName = "LinkId"; inline static const char* EntitiesName = "Entities"; + inline static const char* ContainerEntityName = "ContainerEntity"; /** * Find Prefab value from given parent value and target value's name. @@ -45,6 +47,16 @@ namespace AzToolsFramework */ bool StoreInstanceInPrefabDom(const Instance& instance, PrefabDom& prefabDom); + enum class LoadInstanceFlags : uint8_t + { + //! No flags used during the call to LoadInstanceFromPrefabDom. + None = 0, + //! By default entities will get a stable id when they're deserialized. In cases where the new entities need to be kept + //! unique, e.g. when they are duplicates of live entities, this flag will assign them a random new id. + AssignRandomEntityId = 1 << 0 + }; + AZ_DEFINE_ENUM_BITWISE_OPERATORS(LoadInstanceFlags) + /** * Loads a valid Prefab Instance from a Prefab Dom. Useful for generating Instances. * @param instance The Instance to load. @@ -52,7 +64,21 @@ namespace AzToolsFramework * @param shouldClearContainers whether to clear containers in Instance while loading. * @return bool on whether the operation succeeded. */ - bool LoadInstanceFromPrefabDom(Instance& instance, const PrefabDom& prefabDom, bool shouldClearContainers); + bool LoadInstanceFromPrefabDom( + Instance& instance, const PrefabDom& prefabDom, LoadInstanceFlags flags = LoadInstanceFlags::None); + + /** + * Loads a valid Prefab Instance from a Prefab Dom. Useful for generating Instances. + * @param instance The Instance to load. + * @param newlyAddedEntities The new instances added during deserializing the instance. These are the entities found + * in the prefabDom. + * @param prefabDom the prefabDom that will be used to load the Instance data. + * @param shouldClearContainers whether to clear containers in Instance while loading. + * @return bool on whether the operation succeeded. + */ + bool LoadInstanceFromPrefabDom( + Instance& instance, Instance::EntityList& newlyAddedEntities, const PrefabDom& prefabDom, + LoadInstanceFlags flags = LoadInstanceFlags::None); inline PrefabDomPath GetPrefabDomInstancePath(const char* instanceName) { @@ -61,6 +87,15 @@ namespace AzToolsFramework .Append(instanceName); }; + /** + * Prints the contents of the given prefab DOM value to the debug output console in a readable format. + * @param printMessage The message that will be printed before printing the PrefabDomValue + * @param prefabDomValue The DOM value to be printed. A 'PrefabDom' type can also be passed into this variable. + */ + void PrintPrefabDomValue( + [[maybe_unused]] const AZStd::string_view printMessage, + [[maybe_unused]] const AzToolsFramework::Prefab::PrefabDomValue& prefabDomValue); + } // namespace PrefabDomUtils } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index e25911fc90..f7af12d0eb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -10,10 +10,16 @@ * */ -#include + #include +#include +#include +#include +#include + #include +#include #include #include @@ -30,6 +36,14 @@ namespace AzToolsFramework "It is a requirement for the PrefabLoader class. " "Check that it is being correctly initialized."); + auto settingsRegistry = AZ::SettingsRegistry::Get(); + AZ_Assert(settingsRegistry, "Settings registry is not set"); + + bool result = + settingsRegistry->Get(m_projectPathWithOsSeparator.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectPath); + AZ_Assert(result, "Couldn't retrieve project root path"); + m_projectPathWithSlashSeparator = AZ::IO::Path(m_projectPathWithOsSeparator.Native(), '/').MakePreferred(); + AZ::Interface::Register(this); } @@ -38,57 +52,114 @@ namespace AzToolsFramework AZ::Interface::Unregister(this); } - TemplateId PrefabLoader::LoadTemplate(const AZStd::string& filePath) + TemplateId PrefabLoader::LoadTemplateFromFile(AZ::IO::PathView filePath) { - AZStd::unordered_set progressedFilePathsSet; - TemplateId newTemplateId = LoadTemplate(filePath, progressedFilePathsSet); + AZStd::unordered_set progressedFilePathsSet; + TemplateId newTemplateId = LoadTemplateFromFile(filePath, progressedFilePathsSet); return newTemplateId; } - TemplateId PrefabLoader::LoadTemplate( - const AZStd::string& filePath, - AZStd::unordered_set& progressedFilePathsSet) + TemplateId PrefabLoader::LoadTemplateFromFile(AZ::IO::PathView filePath, AZStd::unordered_set& progressedFilePathsSet) { + if (!IsValidPrefabPath(filePath)) + { + AZ_Error( + "Prefab", false, + "PrefabLoader::LoadTemplateFromFile - " + "Invalid file path: '%.*s'.", + AZ_STRING_ARG(filePath.Native()) + ); + return InvalidTemplateId; + } + + auto readResult = AZ::Utils::ReadFile(GetFullPath(filePath).Native(), MaxPrefabFileSize); + if (!readResult.IsSuccess()) + { + AZ_Error( + "Prefab", false, + "PrefabLoader::LoadTemplate - Failed to load Prefab file from '%.*s'." + "Error message: '%s'", + AZ_STRING_ARG(filePath.Native()), + readResult.GetError().c_str() + ); + return InvalidTemplateId; + } + + return LoadTemplateFromString(readResult.GetValue(), filePath, progressedFilePathsSet); + } + + TemplateId PrefabLoader::LoadTemplateFromString( + AZStd::string_view content, AZ::IO::PathView originPath) + { + AZStd::unordered_set progressedFilePathsSet; + TemplateId newTemplateId = LoadTemplateFromString(content, originPath, progressedFilePathsSet); + return newTemplateId; + } + + TemplateId PrefabLoader::LoadTemplateFromString( + AZStd::string_view fileContent, + AZ::IO::PathView originPath, + AZStd::unordered_set& progressedFilePathsSet) + { + if (!IsValidPrefabPath(originPath)) + { + AZ_Error( + "Prefab", false, + "PrefabLoader::LoadTemplateFromString - " + "Invalid origin path: '%.*s'", + AZ_STRING_ARG(originPath.Native()) + ); + return InvalidTemplateId; + } + + AZ::IO::Path relativePath = GetRelativePathToProject(originPath); + // Cyclical dependency detected if the prefab file is already part of the progressed // file path set. - if (progressedFilePathsSet.contains(filePath)) + if (progressedFilePathsSet.contains(relativePath)) { - AZ_Error("Prefab", false, - "PrefabLoader::LoadTemplate - " - "Prefab file %s has been detected to directly or indirectly depend on itself." + AZ_Error( + "Prefab", false, + "PrefabLoader::LoadTemplateFromString - " + "Prefab file '%.*s' has been detected to directly or indirectly depend on itself." "Terminating any further loading of this branch of its prefab hierarchy.", - filePath.c_str()); + AZ_STRING_ARG(originPath.Native()) + ); return InvalidTemplateId; } // Directly return loaded Template id. - TemplateId loadedTemplateId = m_prefabSystemComponentInterface->GetTemplateIdFromFilePath(filePath); + TemplateId loadedTemplateId = m_prefabSystemComponentInterface->GetTemplateIdFromFilePath(relativePath); if (loadedTemplateId != InvalidTemplateId) { return loadedTemplateId; } // Read Template's prefab file from disk and parse Prefab DOM from file. - AZ::Outcome readPrefabFileResult = AzFramework::FileFunc::ReadJsonFile(AZ::IO::Path(filePath)); + AZ::Outcome readPrefabFileResult = AzFramework::FileFunc::ReadJsonFromString(fileContent); if (!readPrefabFileResult.IsSuccess()) { - AZ_Error("Prefab", false, - "PrefabLoader::LoadPrefabFile - Failed to load Prefab file from '%s'." + AZ_Error( + "Prefab", false, + "PrefabLoader::LoadTemplate - Failed to load Prefab file from '%.*s'." "Error message: '%s'", - filePath.c_str(), readPrefabFileResult.GetError().c_str()); + AZ_STRING_ARG(originPath.Native()), + readPrefabFileResult.GetError().c_str()); return InvalidTemplateId; } // Create new Template with the Prefab DOM. - TemplateId newTemplateId = m_prefabSystemComponentInterface->AddTemplate(filePath, readPrefabFileResult.TakeValue()); + TemplateId newTemplateId = m_prefabSystemComponentInterface->AddTemplate(relativePath, readPrefabFileResult.TakeValue()); if (newTemplateId == InvalidTemplateId) { - AZ_Error("Prefab", false, + AZ_Error( + "Prefab", false, "PrefabLoader::LoadTemplate - " - "Failed to create a template from instance with source file path '%s': " + "Failed to create a template from instance with source file path '%.*s': " "invalid template id returned.", - filePath.c_str()); + AZ_STRING_ARG(originPath.Native()) + ); return InvalidTemplateId; } @@ -97,7 +168,7 @@ namespace AzToolsFramework Template& newTemplate = newTemplateReference->get(); // Mark the file as being in progress. - progressedFilePathsSet.emplace(filePath); + progressedFilePathsSet.emplace(relativePath); // Get 'Instances' value from Template. bool isLoadedWithErrors = false; @@ -108,57 +179,58 @@ namespace AzToolsFramework // For each instance value in 'instances', try to create source Templates for target Template's nested instance data. // Also create Links between source/target Templates if source Template loaded successfully. - for (PrefabDomValue::MemberIterator instanceIterator = instances.MemberBegin(); instanceIterator != instances.MemberEnd(); ++instanceIterator) + for (PrefabDomValue::MemberIterator instanceIterator = instances.MemberBegin(); instanceIterator != instances.MemberEnd(); + ++instanceIterator) { const PrefabDomValue& instance = instanceIterator->value; if (!LoadNestedInstance(instanceIterator, newTemplateId, progressedFilePathsSet)) { isLoadedWithErrors = true; - AZ_Error("Prefab", false, + AZ_Error( + "Prefab", false, "PrefabLoader::LoadTemplate - " - "Loading nested instance '%s' in target Template '%u' from Prefab file '%s' failed.", - instanceIterator->name.GetString(), - newTemplateId, - filePath.c_str()); + "Loading nested instance '%s' in target Template '%u' from Prefab file '%.*s' failed.", + instanceIterator->name.GetString(), newTemplateId, + AZ_STRING_ARG(originPath.Native()) + ); } } } newTemplate.MarkAsLoadedWithErrors(isLoadedWithErrors); // Un-mark the file as being in progress. - progressedFilePathsSet.erase(filePath); + progressedFilePathsSet.erase(originPath); // Return target Template id. return newTemplateId; } bool PrefabLoader::LoadNestedInstance( - PrefabDomValue::MemberIterator& instanceIterator, - TemplateId targetTemplateId, - AZStd::unordered_set& progressedFilePathsSet) + PrefabDomValue::MemberIterator& instanceIterator, TemplateId targetTemplateId, + AZStd::unordered_set& progressedFilePathsSet) { const PrefabDomValue& instance = instanceIterator->value; + AZ::IO::PathView instancePath = AZStd::string_view(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength()); - if (instanceIterator->name.GetStringLength() == 0) + if (!IsValidPrefabPath(instancePath)) { - AZ_Error("Prefab", false, + AZ_Error( + "Prefab", false, "PrefabLoader::LoadNestedInstance - " - "There's an Instance without a name in the target Template on file path '%s'.", + "There's an Instance with an invalid path '%s' in the target Template on file path '%s'.", instanceIterator->name.GetString(), m_prefabSystemComponentInterface->FindTemplate(targetTemplateId)->get().GetFilePath().c_str()); return false; } // Get source Template's path for getting nested instance data. - PrefabDomValueConstReference sourceReference = - PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); - if (!sourceReference.has_value() || - !sourceReference->get().IsString() || - sourceReference->get().GetStringLength() == 0) + PrefabDomValueConstReference sourceReference = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); + if (!sourceReference.has_value() || !sourceReference->get().IsString() || sourceReference->get().GetStringLength() == 0) { - AZ_Error("Prefab", false, + AZ_Error( + "Prefab", false, "PrefabLoader::LoadNestedInstance - " - "Can't get '%s' string value in Instance value '%s'of Template's Prefab DOM from file '%s'.", + "Can't get '%s' string value in Instance value '%s' of Template's Prefab DOM from file '%s'.", PrefabDomUtils::SourceName, instanceIterator->name.GetString(), m_prefabSystemComponentInterface->FindTemplate(targetTemplateId)->get().GetFilePath().c_str()); return false; @@ -167,31 +239,36 @@ namespace AzToolsFramework AZStd::string_view nestedTemplatePath(source.GetString(), source.GetStringLength()); // Get Template id of nested instance from its path. - // If source Template is already loaded, get the id from Template File Path To Id Map, + // If source Template is already loaded, get the id from Template File Path To Id Map, // else load the source Template by calling 'LoadTemplate' recursively. - TemplateId nestedTemplateId = LoadTemplate(nestedTemplatePath, progressedFilePathsSet); + + TemplateId nestedTemplateId = LoadTemplateFromFile(nestedTemplatePath, progressedFilePathsSet); TemplateReference nestedTemplateReference = m_prefabSystemComponentInterface->FindTemplate(nestedTemplateId); - if (!nestedTemplateReference.has_value() || - !nestedTemplateReference->get().IsValid()) + if (!nestedTemplateReference.has_value() || !nestedTemplateReference->get().IsValid()) { - AZ_Error("Prefab", false, + AZ_Error( + "Prefab", false, "PrefabLoader::LoadNestedInstance - " "Error occurred while loading nested Prefab file '%.*s' from Prefab file '%s'.", - aznumeric_cast(nestedTemplatePath.size()), nestedTemplatePath.data(), - m_prefabSystemComponentInterface->FindTemplate(targetTemplateId)->get().GetFilePath().c_str()); + AZ_STRING_ARG(nestedTemplatePath), + m_prefabSystemComponentInterface->FindTemplate(targetTemplateId)->get().GetFilePath().c_str() + ); return false; } // After source template has been loaded, create Link between source/target Template. - LinkId newLinkId = m_prefabSystemComponentInterface->AddLink(nestedTemplateId, targetTemplateId, instanceIterator, AZStd::nullopt); + LinkId newLinkId = + m_prefabSystemComponentInterface->AddLink(nestedTemplateId, targetTemplateId, instanceIterator, AZStd::nullopt); if (newLinkId == InvalidLinkId) { - AZ_Error("Prefab", false, + AZ_Error( + "Prefab", false, "PrefabLoader::LoadNestedInstance - " - "Failed to add a new Link to Nested Template Instance '%s' which connects source Template '%.*s' and target Template '%s'.", - instanceIterator->name.GetString(), - aznumeric_cast(nestedTemplatePath.size()), nestedTemplatePath.data(), - m_prefabSystemComponentInterface->FindTemplate(targetTemplateId)->get().GetFilePath().c_str()); + "Failed to add a new Link to Nested Template Instance '%s' which connects source Template '%.*s' and target Template " + "'%s'.", + instanceIterator->name.GetString(), AZ_STRING_ARG(nestedTemplatePath), + m_prefabSystemComponentInterface->FindTemplate(targetTemplateId)->get().GetFilePath().c_str() + ); return false; } @@ -200,45 +277,136 @@ namespace AzToolsFramework return !nestedTemplateReference->get().IsLoadedWithErrors(); } - bool PrefabLoader::SaveTemplate(const TemplateId& templateId) + bool PrefabLoader::SaveTemplate(TemplateId templateId) + { + const auto& domAndFilepath = StoreTemplateIntoFileFormat(templateId); + if (!domAndFilepath) + { + return false; + } + + auto outcome = AzFramework::FileFunc::WriteJsonFile(domAndFilepath->first, GetFullPath(domAndFilepath->second)); + if (!outcome.IsSuccess()) + { + AZ_Error( + "Prefab", false, + "PrefabLoader::SaveTemplate - " + "Failed to save template '%s'." + "Error: %s", + domAndFilepath->second.c_str(), + outcome.GetError().c_str() + ); + return false; + } + m_prefabSystemComponentInterface->SetTemplateDirtyFlag(templateId, false); + return true; + } + + bool PrefabLoader::SaveTemplateToString(TemplateId templateId, AZStd::string& output) + { + const auto& domAndFilepath = StoreTemplateIntoFileFormat(templateId); + if (!domAndFilepath) + { + return false; + } + + auto outcome = AzFramework::FileFunc::WriteJsonToString(domAndFilepath->first, output); + if (!outcome.IsSuccess()) + { + AZ_Error( + "Prefab", false, + "PrefabLoader::SaveTemplateToString - " + "Failed to serialize template '%s' into a string." + "Error: %s", + domAndFilepath->second.c_str(), + outcome.GetError().c_str() + ); + return false; + } + return true; + } + + AZStd::optional> PrefabLoader::StoreTemplateIntoFileFormat(TemplateId templateId) { // Acquire the template we are saving TemplateReference templateToSaveReference = m_prefabSystemComponentInterface->FindTemplate(templateId); if (!templateToSaveReference.has_value()) { - AZ_Warning("Prefab", false, + AZ_Warning( + "Prefab", false, "PrefabLoader::SaveTemplate - Unable to save prefab template with id: '%llu'. " "Template with that id could not be found", - templateId); + templateId + ); - return false; + return AZStd::nullopt; } Template& templateToSave = templateToSaveReference->get(); if (!templateToSave.IsValid()) { - AZ_Warning("Prefab", false, + AZ_Warning( + "Prefab", false, "PrefabLoader::SaveTemplate - Unable to save Prefab Template with id: %llu. " "Template with that id is invalid", - templateId); + templateId + ); - return false; + return AZStd::nullopt; } // Make a copy of a our prefab DOM where nested instances become file references with patch data PrefabDom templateDomToSave; if (!templateToSave.CopyTemplateIntoPrefabFileFormat(templateDomToSave)) { - AZ_Error("Prefab", false, - "PrefabLoader::SaveTemplate - Unable to store a collapsed version of prefab Template while attempting to save to %s" + AZ_Error( + "Prefab", false, + "PrefabLoader::SaveTemplate - Unable to store a collapsed version of prefab Template while attempting to save to %s." "Save cannot continue", - templateToSave.GetFilePath().c_str()); + templateToSave.GetFilePath().c_str() + ); - return false; + return AZStd::nullopt; + } + + return { { AZStd::move(templateDomToSave), templateToSave.GetFilePath() } }; + } + + bool PrefabLoader::IsValidPrefabPath(AZ::IO::PathView path) + { + // Check for OS invalid character and paths ending on '/' '\\' separators as final char + AZStd::string_view pathStr = path.Native(); + + return !path.empty() && + (pathStr.find_first_of(AZ_FILESYSTEM_INVALID_CHARACTERS) == AZStd::string::npos) && + (pathStr.back() != '\\' && pathStr.back() != '/'); + } + + AZ::IO::Path PrefabLoader::GetFullPath(AZ::IO::PathView path) + { + AZ::IO::Path pathWithOSSeparator = AZ::IO::Path(path).MakePreferred(); + if (pathWithOSSeparator.IsAbsolute()) + { + return path; } - // Save the file - return AzFramework::FileFunc::WriteJsonFile(templateDomToSave, templateToSave.GetFilePath()).IsSuccess(); + return AZ::IO::Path(m_projectPathWithOsSeparator).Append(pathWithOSSeparator); + } + + AZ::IO::Path PrefabLoader::GetRelativePathToProject(AZ::IO::PathView path) + { + AZ::IO::Path pathWithOSSeparator = AZ::IO::Path(path.Native()).MakePreferred(); + if (!pathWithOSSeparator.IsAbsolute()) + { + return path; + } + + return AZ::IO::Path(path.Native(), '/').MakePreferred().LexicallyRelative(m_projectPathWithSlashSeparator); + } + + AZ::IO::Path PrefabLoaderInterface::GeneratePath() + { + return AZStd::string::format("Prefab_%s", AZ::Entity::MakeId().ToString().c_str()); } } // namespace Prefab diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h index 8eb0480889..d11cb62ca3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h @@ -14,15 +14,19 @@ #include +#include #include #include #include #include -namespace AzToolsFramework +namespace AZ { class Entity; +} // namespace AZ +namespace AzToolsFramework +{ namespace Prefab { class PrefabSystemComponentInterface; @@ -42,37 +46,81 @@ namespace AzToolsFramework /** * Load Prefab Template from given file path to memory and return the id of loaded Template. - * Converts Prefab Asset form into Prefab Template form by expanding source path and patch info + * Converts .prefab into Prefab Template form by expanding source path and patch info * into fully formed nested template info. * @param filePath A Prefab Template file path. - * @return A unique id of Template on filePath loaded. Return null id if loading Template on filePath failed. + * @return A unique id of Template on filePath loaded. Return invalid template id if loading Template on filePath failed. + */ + TemplateId LoadTemplateFromFile(AZ::IO::PathView filePath) override; + + /** + * Load Prefab Template from given content string to memory and return the id of loaded Template. + * Converts .prefab form into Prefab Template form by expanding source path and patch info + * into fully formed nested template info. + * @param content Json content of the prefab + * @param originPath Path that will be used for the prefab in case of saved into a file. + * @return A unique id of Template on filePath loaded. Return invalid template id if loading Template on filePath failed. + */ + TemplateId LoadTemplateFromString(AZStd::string_view content, AZ::IO::PathView originPath = GeneratePath()) override; + + /** + * Saves a Prefab Template to the the source path registered with the template. + * Converts Prefab Template form into .prefab form by collapsing nested Template info + * into a source path and patches. + * @param templateId Id of the template to be saved + * @return bool on whether the operation succeeded or not */ - TemplateId LoadTemplate(const AZStd::string& filePath) override; + bool SaveTemplate(TemplateId templateId) override; /** - * Saves a Prefab Template to the the source path registered with the template. - * Converts Prefab Template form into Prefab Asset form by collapsing nested Template info - * into a source path and patches. - * @param templateId Id of the template to be saved - * @return bool on whether the operation succeeded or not - */ - bool SaveTemplate(const TemplateId& templateId) override; + * Saves a Prefab Template into the provided output string. + * Converts Prefab Template form into .prefab form by collapsing nested Template info + * into a source path and patches. + * @param templateId Id of the template to be saved + * @param outputJson Will contain the serialized template json on success + * @return bool on whether the operation succeeded or not + */ + bool SaveTemplateToString(TemplateId templateId, AZStd::string& outputJson) override; + ////////////////////////////////////////////////////////////////////////// void RegisterPrefabLoaderInterface(); - void UnregisterPrefabLoaderInterface(); + //! Converts path into full absolute path. This will be used by loading/save IO operations. + //! The path will always have the correct separator for the current OS + AZ::IO::Path GetFullPath(AZ::IO::PathView path) override; + + //! Converts path into a relative path to the project, this will be the paths in .prefab file. + //! The path will always have '/' separator. + AZ::IO::Path GetRelativePathToProject(AZ::IO::PathView path) override; + + //! Returns if the path is a valid path for a prefab + static bool IsValidPrefabPath(AZ::IO::PathView path); + private: + /** * Load Prefab Template from given file path to memory and return the id of loaded Template. * @param filePath A path to a Prefab Template file. * @param progressedFilePathsSet An unordered_set to track if there's any cyclical dependency between Templates. * @return A unique id of Template on filePath loaded. Return invalid id if loading Template on filePath failed. */ - TemplateId LoadTemplate( - const AZStd::string& filePath, - AZStd::unordered_set& progressedFilePathsSet); + TemplateId LoadTemplateFromFile( + AZ::IO::PathView filePath, + AZStd::unordered_set& progressedFilePathsSet); + + /** + * Load Prefab Template from given string to memory and return the id of loaded Template. + * @param fileContent Json content of the template + * @param filePath Path that will be used for the template if saved to file. + * @param progressedFilePathsSet An unordered_set to track if there's any cyclical dependency between Templates. + * @return A unique id of Template on filePath loaded. Return invalid id if loading Template on filePath failed. + */ + TemplateId LoadTemplateFromString( + AZStd::string_view fileContent, + AZ::IO::PathView filePath, + AZStd::unordered_set& progressedFilePathsSet); /** * Load nested instance given a nested instance value iterator and target Template with its id. @@ -84,9 +132,14 @@ namespace AzToolsFramework bool LoadNestedInstance( PrefabDomValue::MemberIterator& instanceIterator, TemplateId targetTemplateId, - AZStd::unordered_set& progressedFilePathsSet); + AZStd::unordered_set& progressedFilePathsSet); + + //! Retrieves Dom content and its path from a template id + AZStd::optional> StoreTemplateIntoFileFormat(TemplateId templateId); PrefabSystemComponentInterface* m_prefabSystemComponentInterface = nullptr; + AZ::IO::Path m_projectPathWithOsSeparator; + AZ::IO::Path m_projectPathWithSlashSeparator; }; } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h index ce85f9c690..a4055fb15a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h @@ -13,6 +13,7 @@ #pragma once #include +#include #include #include @@ -20,6 +21,8 @@ namespace AzToolsFramework { namespace Prefab { + constexpr size_t MaxPrefabFileSize = 1024 * 1024; + /*! * PrefabLoaderInterface * Interface for saving/loading Prefab files. @@ -34,9 +37,19 @@ namespace AzToolsFramework * Converts Prefab Asset form into Prefab Template form by expanding source path and patch info * into fully formed nested template info. * @param filePath A Prefab Template file path. - * @return A unique id of Template on filePath loaded. Return null id if loading Template on filePath failed. + * @return A unique id of Template on filePath loaded. Return invalid template id if loading Template on filePath failed. + */ + virtual TemplateId LoadTemplateFromFile(AZ::IO::PathView filePath) = 0; + + /** + * Load Prefab Template from given content string to memory and return the id of loaded Template. + * Converts .prefab form into Prefab Template form by expanding source path and patch info + * into fully formed nested template info. + * @param content Json content of the prefab + * @param originPath Path that will be used for the prefab in case of saved into a file. + * @return A unique id of Template on filePath loaded. Return invalid template id if loading Template on filePath failed. */ - virtual TemplateId LoadTemplate(const AZStd::string& filePath) = 0; + virtual TemplateId LoadTemplateFromString(AZStd::string_view content, AZ::IO::PathView originPath = GeneratePath()) = 0; /** * Saves a Prefab Template to the the source path registered with the template. @@ -45,9 +58,31 @@ namespace AzToolsFramework * @param templateId Id of the template to be saved * @return bool on whether the operation succeeded or not */ - virtual bool SaveTemplate(const TemplateId& templateId) = 0; - }; + virtual bool SaveTemplate(TemplateId templateId) = 0; + + /** + * Saves a Prefab Template into the provided output string. + * Converts Prefab Template form into .prefab form by collapsing nested Template info + * into a source path and patches. + * @param templateId Id of the template to be saved + * @param outputJson Will contain the serialized template json on success + * @return bool on whether the operation succeeded or not + */ + virtual bool SaveTemplateToString(TemplateId templateId, AZStd::string& outputJson) = 0; + //! Converts path into full absolute path. This will be used by loading/save IO operations. + //! The path will always have the correct separator for the current OS + virtual AZ::IO::Path GetFullPath(AZ::IO::PathView path) = 0; + + //! Converts path into a relative path to the current project, this will be the paths in .prefab file. + //! The path will always have '/' separator. + virtual AZ::IO::Path GetRelativePathToProject(AZ::IO::PathView path) = 0; + + protected: + + // Generates a new path + static AZ::IO::Path GeneratePath(); + }; } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp index 1d895ae2de..44cfd568e1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp @@ -13,46 +13,55 @@ #include #include +#include +#include #include #include #include +#include #include +#include #include +#include #include +#include +#include #include -#include namespace AzToolsFramework { namespace Prefab { - PrefabPublicHandler::PrefabPublicHandler() + void PrefabPublicHandler::RegisterPrefabPublicHandlerInterface() { m_instanceEntityMapperInterface = AZ::Interface::Get(); - AZ_Assert(m_instanceEntityMapperInterface, "PrefabPublicHandler - Could not retrieve instance of InstanceEntityMapperInterface"); + AZ_Assert( + m_instanceEntityMapperInterface, "PrefabPublicHandler - Could not retrieve instance of InstanceEntityMapperInterface"); + + m_instanceToTemplateInterface = AZ::Interface::Get(); + AZ_Assert(m_instanceToTemplateInterface, "PrefabPublicHandler - Could not retrieve instance of InstanceToTemplateInterface"); + + m_prefabSystemComponentInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabSystemComponentInterface, "Could not get PrefabSystemComponentInterface on PrefabPublicHandler construction."); + + m_prefabUndoCache.Initialize(); AZ::Interface::Register(this); } - PrefabPublicHandler::~PrefabPublicHandler() + void PrefabPublicHandler::UnregisterPrefabPublicHandlerInterface() { AZ::Interface::Unregister(this); + + m_prefabUndoCache.Destroy(); } PrefabOperationResult PrefabPublicHandler::CreatePrefab(const AZStd::vector& entityIds, AZStd::string_view filePath) { // Retrieve entityList from entityIds EntityList inputEntityList; - inputEntityList.reserve(entityIds.size()); - - for (AZ::EntityId entityId : entityIds) - { - if (entityId.IsValid()) - { - inputEntityList.emplace_back(GetEntityById(entityId)); - } - } + EntityIdListToEntityList(entityIds, inputEntityList); // Find common root and top level entities bool entitiesHaveCommonRoot = false; @@ -80,7 +89,7 @@ namespace AzToolsFramework } // Retrieve the owning instance of the common root entity, which will be our new instance's parent instance. - InstanceOptionalReference commonRootEntityOwningInstance = GetCommonRootEntityOwningInstance(commonRootEntityId); + InstanceOptionalReference commonRootEntityOwningInstance = GetOwnerInstanceByEntityId(commonRootEntityId); AZ_Assert(commonRootEntityOwningInstance.has_value(), "Failed to create prefab : " "Couldn't get a valid owning instance for the common root entity of the enities provided"); @@ -101,7 +110,7 @@ namespace AzToolsFramework } InstanceOptionalReference instance = prefabEditorEntityOwnershipInterface->CreatePrefab( - entities, AZStd::move(instances), filePath, commonRootEntityOwningInstance->get()); + entities, AZStd::move(instances), filePath, commonRootEntityOwningInstance); if (!instance) { @@ -109,12 +118,6 @@ namespace AzToolsFramework "(A null instance is returned).")); } - auto prefabLoaderInterface = AZ::Interface::Get(); - if (prefabLoaderInterface == nullptr) - { - return AZ::Failure(AZStd::string("Could not create a new prefab out of the entities provided - internal error (PrefabLoaderInterface unavailable).")); - } - AZ::EntityId containerEntityId = instance->get().GetContainerEntityId(); AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero()); AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero()); @@ -128,50 +131,411 @@ namespace AzToolsFramework // Set container entity to be child of common root AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId); + // Assign the EditorPrefabComponent to the instance container + EntityCompositionRequests::AddComponentsOutcome outcome; + EntityCompositionRequestBus::BroadcastResult( + outcome, &EntityCompositionRequests::AddComponentsToEntities, EntityIdList{containerEntityId}, + AZ::ComponentTypeList{azrtti_typeid()}); + // Change top level entities to be parented to the container entity for (AZ::Entity* topLevelEntity : topLevelEntities) { AZ::TransformBus::Event(topLevelEntity->GetId(), &AZ::TransformBus::Events::SetParent, containerEntityId); } - // Register container entity to PrefabUiHandler - auto editorEntityUiInterface = AZ::Interface::Get(); + return AZ::Success(); + } + + PrefabOperationResult PrefabPublicHandler::InstantiatePrefab(AZStd::string_view /*filePath*/, AZ::EntityId /*parent*/, AZ::Vector3 /*position*/) + { + return AZ::Failure(AZStd::string("Prefab - InstantiatePrefab is yet to be implemented.")); + } + + PrefabOperationResult PrefabPublicHandler::SavePrefab(AZ::IO::Path filePath) + { + auto prefabSystemComponentInterface = AZ::Interface::Get(); + if (!prefabSystemComponentInterface) + { + AZ_Assert( + false, + "Prefab - PrefabPublicHandler - " + "Prefab System Component Interface could not be found. " + "Check that it is being correctly initialized."); + return AZ::Failure( + AZStd::string("SavePrefab - Internal error (Prefab System Component Interface could not be found).")); + } - if (editorEntityUiInterface != nullptr) + auto templateId = prefabSystemComponentInterface->GetTemplateIdFromFilePath(filePath.c_str()); + + if (templateId == InvalidTemplateId) { - editorEntityUiInterface->RegisterEntity(containerEntityId, 1); + return AZ::Failure( + AZStd::string("SavePrefab - Path error. Path could be invalid, or the prefab may not be loaded in this level.")); } - // Save Template - prefabLoaderInterface->SaveTemplate(instance->get().GetTemplateId()); + auto prefabLoaderInterface = AZ::Interface::Get(); + if (prefabLoaderInterface == nullptr) + { + return AZ::Failure(AZStd::string( + "Could not save prefab - internal error (PrefabLoaderInterface unavailable).")); + } + + if (!prefabLoaderInterface->SaveTemplate(templateId)) + { + return AZ::Failure(AZStd::string("Could not save prefab - internal error (Json write operation failure).")); + } return AZ::Success(); } - PrefabOperationResult PrefabPublicHandler::InstantiatePrefab(AZStd::string_view /*filePath*/, AZ::EntityId /*parent*/, AZ::Vector3 /*position*/) + PrefabEntityResult PrefabPublicHandler::CreateEntity(AZ::EntityId parentId, const AZ::Vector3& position) { - return AZ::Failure(AZStd::string("Prefab - InstantiatePrefab is yet to be implemented.")); + InstanceOptionalReference owningInstanceOfParentEntity = GetOwnerInstanceByEntityId(parentId); + if (!owningInstanceOfParentEntity) + { + return AZ::Failure(AZStd::string::format( + "Cannot add entity because the owning instance of parent entity with id '%llu' could not be found.", + static_cast(parentId))); + } + + EntityAlias entityAlias = Instance::GenerateEntityAlias(); + + AliasPath absoluteEntityPath = owningInstanceOfParentEntity->get().GetAbsoluteInstanceAliasPath(); + absoluteEntityPath.Append(entityAlias); + + AZ::EntityId entityId = InstanceEntityIdMapper::GenerateEntityIdForAliasPath(absoluteEntityPath); + AZStd::string entityName = AZStd::string::format("Entity%llu", static_cast(m_newEntityCounter++)); + + AZ::Entity* entity = aznew AZ::Entity(entityId, entityName.c_str()); + + Instance& entityOwningInstance = owningInstanceOfParentEntity->get(); + + PrefabDom instanceDomBeforeUpdate; + m_instanceToTemplateInterface->GenerateDomForInstance(instanceDomBeforeUpdate, entityOwningInstance); + + ScopedUndoBatch undoBatch("Add Entity"); + + entityOwningInstance.AddEntity(*entity, entityAlias); + + EditorEntityContextRequestBus::Broadcast(&EditorEntityContextRequestBus::Events::HandleEntitiesAdded, EntityList{entity}); + + AZ::Transform transform = AZ::Transform::CreateIdentity(); + transform.SetTranslation(position); + + EntityOptionalReference owningInstanceContainerEntity = entityOwningInstance.GetContainerEntity(); + if (owningInstanceContainerEntity && !parentId.IsValid()) + { + parentId = owningInstanceContainerEntity->get().GetId(); + } + + if (parentId.IsValid()) + { + AZ::TransformBus::Event(entityId, &AZ::TransformInterface::SetParent, parentId); + AZ::TransformBus::Event(entityId, &AZ::TransformInterface::SetLocalTM, transform); + } + else + { + AZ::TransformBus::Event(entityId, &AZ::TransformInterface::SetWorldTM, transform); + } + + + // Select the new entity (and deselect others). + AzToolsFramework::EntityIdList selection = {entityId}; + + SelectionCommand* selectionCommand = aznew SelectionCommand(selection, ""); + selectionCommand->SetParent(undoBatch.GetUndoBatch()); + + ToolsApplicationRequests::Bus::Broadcast(&ToolsApplicationRequests::SetSelectedEntities, selection); + + PrefabDom instanceDomAfterUpdate; + m_instanceToTemplateInterface->GenerateDomForInstance(instanceDomAfterUpdate, entityOwningInstance); + + // Generate the patch comparing the instance before and after the entity addition. + PrefabDom patch; + if (!m_instanceToTemplateInterface->GeneratePatch(patch, instanceDomBeforeUpdate, instanceDomAfterUpdate)) + { + return AZ::Failure(AZStd::string::format( + "A valid patch couldn't be created for adding an entity with id '%llu'", static_cast(entityId))); + } + + // create undo node + PrefabUndoInstance* state = aznew PrefabUndoInstance(AZStd::string::format("%llu", static_cast(entityId))); + state->Capture(instanceDomBeforeUpdate, instanceDomAfterUpdate, entityOwningInstance.GetTemplateId()); + state->SetParent(undoBatch.GetUndoBatch()); + + state->Redo(); + + return AZ::Success(entityId); } - bool PrefabPublicHandler::IsInstanceContainerEntity(AZ::EntityId entityId) + void PrefabPublicHandler::GenerateUndoNodesForEntityChangeAndUpdateCache( + AZ::EntityId entityId, UndoSystem::URSequencePoint* parentUndoBatch) { - AZ::Entity* entity = GetEntityById(entityId); - InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entity->GetId()); + // Create Undo node on entities if they belong to an instance + InstanceOptionalReference instanceOptionalReference = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + + if (instanceOptionalReference.has_value()) + { + PrefabDom beforeState; + m_prefabUndoCache.Retrieve(entityId, beforeState); + + PrefabDom afterState; + AZ::Entity* entity = GetEntityById(entityId); + if (entity) + { + m_instanceToTemplateInterface->GenerateDomForEntity(afterState, *entity); + + PrefabDom patch; + m_instanceToTemplateInterface->GeneratePatch(patch, beforeState, afterState); + + if (patch.IsArray() && !patch.Empty() && beforeState.IsObject()) + { + // Update the state of the entity + PrefabUndoEntityUpdate* state = aznew PrefabUndoEntityUpdate(AZStd::to_string(static_cast(entityId))); + state->SetParent(parentUndoBatch); + state->Capture(beforeState, afterState, entityId); + + state->Redo(); + } + + // Update the cache + m_prefabUndoCache.Store(entityId, AZStd::move(afterState)); + } + + } + } + + bool PrefabPublicHandler::IsInstanceContainerEntity(AZ::EntityId entityId) const + { + InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); return owningInstance && (owningInstance->get().GetContainerEntityId() == entityId); } - AZ::EntityId PrefabPublicHandler::GetInstanceContainerEntityId(AZ::EntityId entityId) + bool PrefabPublicHandler::IsLevelInstanceContainerEntity(AZ::EntityId entityId) const + { + // Get owning instance + InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + + // Get level root instance + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + if (!prefabEditorEntityOwnershipInterface) + { + AZ_Assert( + false, + "Could not get owning instance of common root entity :" + "PrefabEditorEntityOwnershipInterface unavailable."); + } + InstanceOptionalReference levelInstance = prefabEditorEntityOwnershipInterface->GetRootPrefabInstance(); + + return owningInstance + && levelInstance + && (&owningInstance->get() == &levelInstance->get()) + && (owningInstance->get().GetContainerEntityId() == entityId); + } + + AZ::EntityId PrefabPublicHandler::GetInstanceContainerEntityId(AZ::EntityId entityId) const { AZ::Entity* entity = GetEntityById(entityId); - InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entity->GetId()); - if (owningInstance) + if (entity) { - return owningInstance->get().GetContainerEntityId(); + InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entity->GetId()); + if (owningInstance) + { + return owningInstance->get().GetContainerEntityId(); + } } return AZ::EntityId(); } + AZ::EntityId PrefabPublicHandler::GetLevelInstanceContainerEntityId() const + { + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + if (!prefabEditorEntityOwnershipInterface) + { + AZ_Assert( + false, + "Could not get owning instance of common root entity :" + "PrefabEditorEntityOwnershipInterface unavailable."); + return AZ::EntityId(); + } + + auto rootInstance = prefabEditorEntityOwnershipInterface->GetRootPrefabInstance(); + + if (!rootInstance.has_value()) + { + return AZ::EntityId(); + } + + return rootInstance->get().GetContainerEntityId(); + } + + AZ::IO::Path PrefabPublicHandler::GetOwningInstancePrefabPath(AZ::EntityId entityId) const + { + AZ::IO::Path path; + InstanceOptionalReference instance = GetOwnerInstanceByEntityId(entityId); + + if (instance.has_value()) + { + path = instance->get().GetTemplateSourcePath(); + } + + return path; + } + + PrefabRequestResult PrefabPublicHandler::HasUnsavedChanges(AZ::IO::Path prefabFilePath) const + { + auto prefabSystemComponentInterface = AZ::Interface::Get(); + if (!prefabSystemComponentInterface) + { + AZ_Assert( + false, + "Prefab - PrefabPublicHandler - " + "Prefab System Component Interface could not be found. " + "Check that it is being correctly initialized."); + return AZ::Failure( + AZStd::string("HasUnsavedChanges - Internal error (Prefab System Component Interface could not be found).")); + } + + auto templateId = prefabSystemComponentInterface->GetTemplateIdFromFilePath(prefabFilePath.c_str()); + + if (templateId == InvalidTemplateId) + { + return AZ::Failure(AZStd::string("HasUnsavedChanges - Path error. Path could be invalid, or the prefab may not be loaded in this level.")); + } + + return AZ::Success(prefabSystemComponentInterface->IsTemplateDirty(templateId)); + } + + PrefabOperationResult PrefabPublicHandler::DeleteEntitiesInInstance(const EntityIdList& entityIds) + { + return DeleteFromInstance(entityIds, false); + } + + PrefabOperationResult PrefabPublicHandler::DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) + { + return DeleteFromInstance(entityIds, true); + } + + PrefabOperationResult PrefabPublicHandler::DeleteFromInstance(const EntityIdList& entityIds, bool deleteDescendants) + { + if (entityIds.empty()) + { + return AZ::Success(); + } + + if (!EntitiesBelongToSameInstance(entityIds)) + { + return AZ::Failure(AZStd::string("DeleteEntitiesAndAllDescendantsInInstance - Deletion Error. Cannot delete multiple " + "entities belonging to different instances with one operation.")); + } + + InstanceOptionalReference instance = GetOwnerInstanceByEntityId(entityIds[0]); + + // Retrieve entityList from entityIds + EntityList inputEntityList; + EntityIdListToEntityList(entityIds, inputEntityList); + + AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); + + UndoSystem::URSequencePoint* currentUndoBatch = nullptr; + ToolsApplicationRequests::Bus::BroadcastResult(currentUndoBatch, &ToolsApplicationRequests::Bus::Events::GetCurrentUndoBatch); + + bool createdUndo = false; + if (!currentUndoBatch) + { + createdUndo = true; + ToolsApplicationRequests::Bus::BroadcastResult( + currentUndoBatch, &ToolsApplicationRequests::Bus::Events::BeginUndoBatch, "Delete Selected"); + AZ_Assert(currentUndoBatch, "Failed to create new undo batch."); + } + + // In order to undo DeleteSelected, we have to create a selection command which selects the current selection + // and then add the deletion as children. + // Commands always execute themselves first and then their children (when going forwards) + // and do the opposite when going backwards. + EntityIdList selectedEntities; + ToolsApplicationRequestBus::BroadcastResult(selectedEntities, &ToolsApplicationRequests::GetSelectedEntities); + SelectionCommand* selCommand = aznew SelectionCommand(selectedEntities, "Delete Entities"); + + // We insert a "deselect all" command before we delete the entities. This ensures the delete operations aren't changing + // selection state, which triggers expensive UI updates. By deselecting up front, we are able to do those expensive + // UI updates once at the start instead of once for each entity. + { + EntityIdList deselection; + SelectionCommand* deselectAllCommand = aznew SelectionCommand(deselection, "Deselect Entities"); + deselectAllCommand->SetParent(selCommand); + } + + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "Internal::DeleteEntities:UndoCaptureAndPurgeEntities"); + + Prefab::PrefabDom instanceDomBefore; + m_instanceToTemplateInterface->GenerateDomForInstance(instanceDomBefore, instance->get()); + + if (deleteDescendants) + { + AZStd::vector entities; + AZStd::vector> instances; + + bool success = RetrieveAndSortPrefabEntitiesAndInstances(inputEntityList, instance->get(), entities, instances); + + if (!success) + { + return AZ::Failure(AZStd::string("DeleteEntitiesAndAllDescendantsInInstance")); + } + + for (AZ::Entity* entity : entities) + { + AZ::ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationRequests::DeleteEntity, entity->GetId()); + } + + for (auto& nestedInstance : instances) + { + nestedInstance.reset(); + } + } + else + { + for (AZ::EntityId entityId : entityIds) + { + InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + // If this is the container entity, it actually represents the instance so get its owner + if (owningInstance->get().GetContainerEntityId() == entityId) + { + auto instancePtr = instance->get().DetachNestedInstance(owningInstance->get().GetInstanceAlias()); + instancePtr.reset(); + } + else + { + instance->get().DetachEntity(entityId); + AZ::ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationRequests::DeleteEntity, entityId); + } + } + } + + Prefab::PrefabDom instanceDomAfter; + m_instanceToTemplateInterface->GenerateDomForInstance(instanceDomAfter, instance->get()); + + PrefabUndoInstance* command = aznew PrefabUndoInstance("Instance deletion"); + command->Capture(instanceDomBefore, instanceDomAfter, instance->get().GetTemplateId()); + command->SetParent(selCommand); + } + + selCommand->SetParent(currentUndoBatch); + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "Internal::DeleteEntities:RunRedo"); + selCommand->RunRedo(); + } + + if (createdUndo) + { + ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequests::EndUndoBatch); + } + + return AZ::Success(); + } + void PrefabPublicHandler::GenerateContainerEntityTransform(const EntityList& topLevelEntities, AZ::Vector3& translation, AZ::Quaternion& rotation) { @@ -231,19 +595,19 @@ namespace AzToolsFramework } } - InstanceOptionalReference PrefabPublicHandler::GetCommonRootEntityOwningInstance(AZ::EntityId entityId) + InstanceOptionalReference PrefabPublicHandler::GetOwnerInstanceByEntityId(AZ::EntityId entityId) const { if (entityId.IsValid()) { return m_instanceEntityMapperInterface->FindOwningInstance(entityId); } - // If the commonRootEntity is invalid, then the owning instance would be the root prefab instance of the + // If the entityId is invalid, then the owning instance would be the root prefab instance of the // PrefabEditorEntityOwnershipService. auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); if (!prefabEditorEntityOwnershipInterface) { - AZ_Assert(false, "Could not get owining instance of common root entity :" + AZ_Assert(false, "Could not get owning instance of common root entity :" "PrefabEditorEntityOwnershipInterface unavailable."); } return prefabEditorEntityOwnershipInterface->GetRootPrefabInstance(); @@ -368,5 +732,52 @@ namespace AzToolsFramework return true; } + + bool PrefabPublicHandler::EntitiesBelongToSameInstance(const EntityIdList& entityIds) const + { + if (entityIds.size() <= 1) + { + return true; + } + + InstanceOptionalReference sharedInstance = AZStd::nullopt; + + for (AZ::EntityId entityId : entityIds) + { + InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + // If this is the container entity, it actually represents the instance so get its owner + if (owningInstance->get().GetContainerEntityId() == entityId) + { + owningInstance = owningInstance->get().GetParentInstance(); + } + + if (!sharedInstance.has_value()) + { + sharedInstance = owningInstance; + } + else + { + if (&sharedInstance->get() != &owningInstance->get()) + { + return false; + } + } + } + + return true; + } + + void PrefabPublicHandler::EntityIdListToEntityList(const EntityIdList& inputEntityIds, EntityList& outEntities) + { + outEntities.reserve(inputEntityIds.size()); + + for (AZ::EntityId entityId : inputEntityIds) + { + if (entityId.IsValid()) + { + outEntities.emplace_back(GetEntityById(entityId)); + } + } + } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h index ad0e7cf029..1e3bef4532 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h @@ -14,18 +14,22 @@ #include #include + #include #include - - -using EntityList = AZStd::vector; +#include +#include namespace AzToolsFramework { + using EntityList = AZStd::vector; + namespace Prefab { class Instance; class InstanceEntityMapperInterface; + class InstanceToTemplateInterface; + class PrefabSystemComponentInterface; class PrefabPublicHandler final : public PrefabPublicInterface @@ -34,27 +38,48 @@ namespace AzToolsFramework AZ_CLASS_ALLOCATOR(PrefabPublicHandler, AZ::SystemAllocator, 0); AZ_RTTI(PrefabPublicHandler, "{35802943-6B60-430F-9DED-075E3A576A25}", PrefabPublicInterface); - PrefabPublicHandler(); - ~PrefabPublicHandler(); + void RegisterPrefabPublicHandlerInterface(); + void UnregisterPrefabPublicHandlerInterface(); + // PrefabPublicInterface... PrefabOperationResult CreatePrefab(const AZStd::vector& entityIds, AZStd::string_view filePath) override; PrefabOperationResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, AZ::Vector3 position) override; + PrefabOperationResult SavePrefab(AZ::IO::Path filePath) override; + PrefabEntityResult CreateEntity(AZ::EntityId parentId, const AZ::Vector3& position) override; + + void GenerateUndoNodesForEntityChangeAndUpdateCache(AZ::EntityId entityId, UndoSystem::URSequencePoint* parentUndoBatch) override; - bool IsInstanceContainerEntity(AZ::EntityId entityId) override; - AZ::EntityId GetInstanceContainerEntityId(AZ::EntityId entityId) override; + bool IsInstanceContainerEntity(AZ::EntityId entityId) const override; + bool IsLevelInstanceContainerEntity(AZ::EntityId entityId) const override; + AZ::EntityId GetInstanceContainerEntityId(AZ::EntityId entityId) const override; + AZ::EntityId GetLevelInstanceContainerEntityId() const override; + AZ::IO::Path GetOwningInstancePrefabPath(AZ::EntityId entityId) const override; + PrefabRequestResult HasUnsavedChanges(AZ::IO::Path prefabFilePath) const override; - private: + PrefabOperationResult DeleteEntitiesInInstance(const EntityIdList& entityIds) override; + PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) override; + private: + PrefabOperationResult DeleteFromInstance(const EntityIdList& entityIds, bool deleteDescendants); bool RetrieveAndSortPrefabEntitiesAndInstances(const EntityList& inputEntities, const Instance& commonRootEntityOwningInstance, EntityList& outEntities, AZStd::vector>& outInstances) const; - //! Gets the owning instance of a valid commonRootEntity and the root prefab instance for an invalid commonRootEntity. - InstanceOptionalReference GetCommonRootEntityOwningInstance(AZ::EntityId entityId); + InstanceOptionalReference GetOwnerInstanceByEntityId(AZ::EntityId entityId) const; + bool EntitiesBelongToSameInstance(const EntityIdList& entityIds) const; + static Instance* GetParentInstance(Instance* instance); static Instance* GetAncestorOfInstanceThatIsChildOfRoot(const Instance* ancestor, Instance* descendant); static void GenerateContainerEntityTransform(const EntityList& topLevelEntities, AZ::Vector3& translation, AZ::Quaternion& rotation); + static void EntityIdListToEntityList(const EntityIdList& inputEntityIds, EntityList& outEntities); + + InstanceEntityMapperInterface* m_instanceEntityMapperInterface = nullptr; + InstanceToTemplateInterface* m_instanceToTemplateInterface = nullptr; + PrefabSystemComponentInterface* m_prefabSystemComponentInterface = nullptr; + + // Caches entity states for undo/redo purposes + PrefabUndoCache m_prefabUndoCache; - InstanceEntityMapperInterface* m_instanceEntityMapperInterface; + uint64_t m_newEntityCounter = 1; }; } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h index 4f507f1708..81a5258d91 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h @@ -13,14 +13,24 @@ #pragma once #include +#include #include #include namespace AzToolsFramework { + using EntityIdList = AZStd::vector; + + namespace UndoSystem + { + class URSequencePoint; + } + namespace Prefab { typedef AZ::Outcome PrefabOperationResult; + typedef AZ::Outcome PrefabRequestResult; + typedef AZ::Outcome PrefabEntityResult; /*! * PrefabPublicInterface @@ -49,22 +59,91 @@ namespace AzToolsFramework * @return An outcome object; on failure, it comes with an error message detailing the cause of the error. */ virtual PrefabOperationResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, AZ::Vector3 position) = 0; + + /** + * Saves changes to prefab to disk. + * @param filePath The path to the prefab to save. + * @return Returns Success if the file was saved, or an error message otherwise. + */ + virtual PrefabOperationResult SavePrefab(AZ::IO::Path filePath) = 0; + + /** + * Creates a new entity under the entity with id 'parentId' and propagates a change to the template + * of the owning instance of parentId. + * + * @param parentId The id of the parent entity to parent the newly added entity under. + * @param position The transform position of the entity being added. + * @return Returns the entityId of the newly created entity, or an error message if the operation failed. + */ + virtual PrefabEntityResult CreateEntity(AZ::EntityId parentId, const AZ::Vector3& position) = 0; + + /** + * Store the changes between the current entity state and its last cached state into undo/redo commands. + * These changes are stored as patches to the owning prefab instance template, as appropriate. + * The function also triggers the redo() of the nodes it creates, triggering propagation on the next tick. + * + * @param entityId The entity to patch. + * @param parentUndoBatch The undo batch the undo nodes should be parented to. + */ + virtual void GenerateUndoNodesForEntityChangeAndUpdateCache( + AZ::EntityId entityId, UndoSystem::URSequencePoint* parentUndoBatch) = 0; /** * Detects if an entity is the container entity for its owning prefab instance. * @param entityId The entity to query. * @return True if the entity is the container entity for its owning prefab instance, false otherwise. */ - virtual bool IsInstanceContainerEntity(AZ::EntityId entityId) = 0; + virtual bool IsInstanceContainerEntity(AZ::EntityId entityId) const = 0; + + /** + * Detects if an entity is the container entity for the level prefab instance. + * @param entityId The entity to query. + * @return True if the entity is the container entity for the level prefab instance, false otherwise. + */ + virtual bool IsLevelInstanceContainerEntity(AZ::EntityId entityId) const = 0; /** * Gets the entity id for the instance container of the owning instance. * @param entityId The id of the entity to query. * @return The entity id of the instance container owning the queried entity. */ - virtual AZ::EntityId GetInstanceContainerEntityId(AZ::EntityId entityId) = 0; - }; + virtual AZ::EntityId GetInstanceContainerEntityId(AZ::EntityId entityId) const = 0; + + /** + * Gets the entity id for the instance container of the level instance. + * @return The entity id of the instance container for the currently loaded level. + */ + virtual AZ::EntityId GetLevelInstanceContainerEntityId() const = 0; + + /** + * Get the file path to the prefab file for the prefab instance owning the entity provided. + * @param entityId The id for the entity being queried. + * @return Returns the path to the prefab, or an empty path if the entity is owned by the level. + */ + virtual AZ::IO::Path GetOwningInstancePrefabPath(AZ::EntityId entityId) const = 0; + + /** + * Gets whether the prefab has unsaved changes. + * @param filePath The path to the prefab to query. + * @return Returns true if the prefab has unsaved changes, false otherwise. If path is invalid, returns an error message. + */ + virtual PrefabRequestResult HasUnsavedChanges(AZ::IO::Path prefabFilePath) const = 0; + /** + * Deletes all entities from the owning instance. Bails if the entities don't all belong to the same instance. + * @param entities The entities to delete. + * @return An outcome object; on failure, it comes with an error message detailing the cause of the error. + */ + virtual PrefabOperationResult DeleteEntitiesInInstance(const EntityIdList& entityIds) = 0; + + /** + * Deletes all entities and their descendants from the owning instance. Bails if the entities don't all belong to the same + * instance. + * @param entities The entities to delete. Their descendants will be discovered by this function. + * @return An outcome object; on failure, it comes with an error message detailing the cause of the error. + */ + virtual PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) = 0; + }; } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 6bea9add37..e021b10f12 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -21,6 +22,7 @@ #include #include #include +#include namespace AzToolsFramework { @@ -36,10 +38,14 @@ namespace AzToolsFramework m_prefabLoader.RegisterPrefabLoaderInterface(); m_instanceUpdateExecutor.RegisterInstanceUpdateExecutorInterface(); m_instanceToTemplatePropagator.RegisterInstanceToTemplateInterface(); + m_prefabPublicHandler.RegisterPrefabPublicHandlerInterface(); + AZ::SystemTickBus::Handler::BusConnect(); } void PrefabSystemComponent::Deactivate() { + AZ::SystemTickBus::Handler::BusDisconnect(); + m_prefabPublicHandler.UnregisterPrefabPublicHandlerInterface(); m_instanceToTemplatePropagator.UnregisterInstanceToTemplateInterface(); m_instanceUpdateExecutor.UnregisterInstanceUpdateExecutorInterface(); m_prefabLoader.UnregisterPrefabLoaderInterface(); @@ -80,18 +86,26 @@ namespace AzToolsFramework { } - AZStd::unique_ptr PrefabSystemComponent::CreatePrefab(const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, const AZStd::string& filePath) + void PrefabSystemComponent::OnSystemTick() { - if (GetTemplateIdFromFilePath(filePath) != InvalidTemplateId) + m_instanceUpdateExecutor.UpdateTemplateInstancesInQueue(); + } + + AZStd::unique_ptr PrefabSystemComponent::CreatePrefab(const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, + AZ::IO::PathView filePath, AZStd::unique_ptr containerEntity) + { + AZ::IO::Path relativeFilePath = m_prefabLoader.GetRelativePathToProject(filePath); + if (GetTemplateIdFromFilePath(relativeFilePath) != InvalidTemplateId) { AZ_Error("Prefab", false, "Filepath %s has already been registered with the Prefab System Component", - filePath.c_str()); + relativeFilePath.c_str()); return nullptr; } - AZStd::unique_ptr newInstance{ aznew Instance() }; + + AZStd::unique_ptr newInstance = AZStd::make_unique(AZStd::move(containerEntity)); for (AZ::Entity* entity : entities) { @@ -107,14 +121,14 @@ namespace AzToolsFramework newInstance->AddInstance(AZStd::move(instance)); } - newInstance->SetTemplateSourcePath(filePath); + newInstance->SetTemplateSourcePath(relativeFilePath); TemplateId newTemplateId = CreateTemplateFromInstance(*newInstance); if (newTemplateId == InvalidTemplateId) { AZ_Error("Prefab", false, "Failed to create a Template associated with file path %s during CreatePrefab.", - filePath.c_str()); + relativeFilePath.c_str()); newInstance = nullptr; } @@ -154,10 +168,6 @@ namespace AzToolsFramework void PrefabSystemComponent::UpdatePrefabInstances(const TemplateId& templateId) { m_instanceUpdateExecutor.AddTemplateInstancesToQueue(templateId); - const bool updateResult = m_instanceUpdateExecutor.UpdateTemplateInstancesInQueue(); - AZ_Assert(updateResult, - "Prefab - Error occurred while updating Instances of Template with id '%llu'.", - templateId); } void PrefabSystemComponent::UpdateLinkedInstances(AZStd::queue& linkIdsQueue) @@ -255,24 +265,26 @@ namespace AzToolsFramework return nullptr; } - Instance* newInstance = aznew Instance(); - if (!PrefabDomUtils::LoadInstanceFromPrefabDom(*newInstance, instantiatingTemplate->get().GetPrefabDom(), false)) + auto newInstance = AZStd::make_unique(); + Instance::EntityList newEntities; + if (!PrefabDomUtils::LoadInstanceFromPrefabDom(*newInstance, newEntities, instantiatingTemplate->get().GetPrefabDom())) { AZ_Error("Prefab", false, "Failed to Load Prefab Template associated with path %s. Instantiation Failed", instantiatingTemplate->get().GetFilePath().c_str()); - - delete newInstance; return nullptr; } - return AZStd::unique_ptr(newInstance); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, newEntities); + + return newInstance; } TemplateId PrefabSystemComponent::CreateTemplateFromInstance(Instance& instance) { // We will register the template to match the path the instance has - const AZStd::string& templateSourcePath = instance.GetTemplateSourcePath(); + const AZ::IO::Path& templateSourcePath = instance.GetTemplateSourcePath(); if (templateSourcePath.empty()) { AZ_Assert(false, @@ -290,7 +302,7 @@ namespace AzToolsFramework } // Generate a new template and store the dom data - const AZStd::string& instanceSourcePath = instance.GetTemplateSourcePath(); + const AZ::IO::Path& instanceSourcePath = instance.GetTemplateSourcePath(); TemplateId newTemplateId = AddTemplate(instanceSourcePath, AZStd::move(serializedInstance)); if (newTemplateId == InvalidTemplateId) { @@ -354,7 +366,7 @@ namespace AzToolsFramework } } - TemplateId PrefabSystemComponent::AddTemplate(const AZStd::string& filePath, PrefabDom prefabDom) + TemplateId PrefabSystemComponent::AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) { TemplateId newTemplateId = CreateUniqueTemplateId(); Template& newTemplate = m_templateIdMap.emplace( @@ -378,6 +390,7 @@ namespace AzToolsFramework } m_templateFilePathToIdMap.emplace(AZStd::make_pair(filePath, newTemplateId)); + newTemplate.MarkAsDirty(true); return newTemplateId; } @@ -451,6 +464,23 @@ namespace AzToolsFramework return; } + void PrefabSystemComponent::RemoveAllTemplates() + { + AZStd::vector templateIds; + templateIds.reserve(m_templateIdMap.size()); + + // Make a copy of the keys, we don't want to iterate over the map while we're removing items from it + for (const auto& [id, templateObject] : m_templateIdMap) + { + templateIds.emplace_back(id); + } + + for (auto id : templateIds) + { + RemoveTemplate(id); + } + } + LinkId PrefabSystemComponent::AddLink( const TemplateId& sourceTemplateId, const TemplateId& targetTemplateId, @@ -472,8 +502,8 @@ namespace AzToolsFramework Template& targetTemplate = targetTemplateReference->get(); AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength()); - const AZStd::string& targetTemplateFilePath = targetTemplate.GetFilePath(); - const AZStd::string& sourceTemplateFilePath = sourceTemplate.GetFilePath(); + const AZStd::string& targetTemplateFilePath = targetTemplate.GetFilePath().Native(); + const AZStd::string& sourceTemplateFilePath = sourceTemplate.GetFilePath().Native(); LinkId newLinkId = CreateUniqueLinkId(); Link newLink(newLinkId); @@ -518,6 +548,7 @@ namespace AzToolsFramework const TemplateId& linkTargetId, const TemplateId& linkSourceId, const InstanceAlias& instanceAlias, + const PrefabDomReference linkPatch, const LinkId& linkId) { if (linkTargetId == InvalidTemplateId) @@ -551,12 +582,6 @@ namespace AzToolsFramework newLinkId = CreateUniqueLinkId(); } - //setup initial link values - Link newLink(newLinkId); - newLink.SetTargetTemplateId(linkTargetId); - newLink.SetSourceTemplateId(linkSourceId); - newLink.SetInstanceName(instanceAlias.c_str()); - //get owner template and add the link Template& targetTemplate = targetTemplateRef->get(); @@ -590,12 +615,22 @@ namespace AzToolsFramework instancesValue->get().AddMember(rapidjson::StringRef(instanceAlias.c_str()), PrefabDomValue(), targetTemplateDom.GetAllocator()); - //setup the link dom Template& sourceTemplate = sourceTemplateRef->get(); + + //setup initial link values and link dom + Link newLink(newLinkId); + newLink.SetTargetTemplateId(linkTargetId); + newLink.SetSourceTemplateId(linkSourceId); + newLink.SetInstanceName(instanceAlias.c_str()); newLink.GetLinkDom().SetObject(); newLink.GetLinkDom().AddMember(rapidjson::StringRef(PrefabDomUtils::SourceName), rapidjson::StringRef(sourceTemplate.GetFilePath().c_str()), newLink.GetLinkDom().GetAllocator()); + if (linkPatch && linkPatch->get().IsArray() && !(linkPatch->get().Empty())) + { + m_instanceToTemplatePropagator.AddPatchesToLink(linkPatch.value(), newLink); + } + //update the target template dom to have the proper values for the source template dom if (!newLink.UpdateTarget()) { @@ -643,7 +678,7 @@ namespace AzToolsFramework return; } - TemplateId PrefabSystemComponent::GetTemplateIdFromFilePath(AZStd::string_view filePath) const + TemplateId PrefabSystemComponent::GetTemplateIdFromFilePath(AZ::IO::PathView filePath) const { auto found = m_templateFilePathToIdMap.find(filePath); if (found != m_templateFilePathToIdMap.end()) @@ -656,6 +691,28 @@ namespace AzToolsFramework } } + bool PrefabSystemComponent::IsTemplateDirty(const TemplateId& templateId) + { + auto templateRef = FindTemplate(templateId); + + if (templateRef.has_value()) + { + return templateRef->get().IsDirty(); + } + + return false; + } + + void PrefabSystemComponent::SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) + { + auto templateRef = FindTemplate(templateId); + + if (templateRef.has_value()) + { + templateRef->get().MarkAsDirty(dirty); + } + } + bool PrefabSystemComponent::ConnectTemplates( Link& link, TemplateId sourceTemplateId, @@ -677,7 +734,7 @@ namespace AzToolsFramework Template& targetTemplate = targetTemplateReference->get(); AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength()); - const AZStd::string& targetTemplateFilePath = targetTemplate.GetFilePath(); + const AZStd::string& targetTemplateFilePath = targetTemplate.GetFilePath().Native(); link.SetSourceTemplateId(sourceTemplateId); link.SetTargetTemplateId(targetTemplateId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index 6400b9ecaf..40780b9775 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -13,6 +13,7 @@ #pragma once #include +#include #include #include #include @@ -30,10 +31,13 @@ #include #include -namespace AzToolsFramework +namespace AZ { class Entity; +} // namespace AZ +namespace AzToolsFramework +{ using EntityList = AZStd::vector; namespace Prefab @@ -49,6 +53,7 @@ namespace AzToolsFramework class PrefabSystemComponent : public AZ::Component , private PrefabSystemComponentInterface + , private AZ::SystemTickBus::Handler { public: @@ -72,6 +77,9 @@ namespace AzToolsFramework static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); + // SystemTickBus... + void OnSystemTick() override; + ////////////////////////////////////////////////////////////////////////// // PrefabSystemComponentInterface interface implementation /** @@ -94,7 +102,7 @@ namespace AzToolsFramework * @param prefabDom A Prefab DOM presenting this Template. * @return A unique id for the new Template. */ - TemplateId AddTemplate(const AZStd::string& filePath, PrefabDom prefabDom) override; + TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) override; /** * Remove the Template associated with the given id from Prefab System Component. @@ -102,6 +110,11 @@ namespace AzToolsFramework */ void RemoveTemplate(const TemplateId& templateId) override; + /** + * Remove all Templates from the Prefab System Component. + */ + void RemoveAllTemplates() override; + /** * Generates a new Prefab Instance based on the Template referenced by templateId * @param templateId the id of the template being instantiated @@ -136,6 +149,7 @@ namespace AzToolsFramework const TemplateId& linkTargetId, const TemplateId& linkSourceId, const InstanceAlias& instanceAlias, + const PrefabDomReference linkPatch, const LinkId& linkId = InvalidLinkId) override; /** @@ -149,7 +163,22 @@ namespace AzToolsFramework * @param filePath A path to a Prefab Template file. * @return A unique id of Template on filePath. Return InvalidTemplateId if Template on filePath doesn't exist. */ - TemplateId GetTemplateIdFromFilePath(AZStd::string_view filePath) const override; + TemplateId GetTemplateIdFromFilePath(AZ::IO::PathView filePath) const override; + + /** + * Gets the value of the dirty flag of the template with the id provided. + * @param templateId The id of the template to query. + * @return The value of the dirty flag on the template. + */ + bool IsTemplateDirty(const TemplateId& templateId) override; + + /** + * Sets the dirty flag of the template to the value provided. + * @param templateId The id of the template to flag. + * @param dirty The new value of the dirty flag. + */ + void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override; + ////////////////////////////////////////////////////////////////////////// /** @@ -161,8 +190,8 @@ namespace AzToolsFramework * @param filePath the path to associate the template of the new instance to * @return A pointer to the newly created instance. nullptr on failure */ - AZStd::unique_ptr CreatePrefab(const AZStd::vector & entities, - AZStd::vector>&& instancesToConsume, const AZStd::string& filePath) override; + AZStd::unique_ptr CreatePrefab(const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, + AZ::IO::PathView filePath, AZStd::unique_ptr containerEntity = nullptr) override; PrefabDom& FindTemplateDom(TemplateId templateId) override; @@ -302,7 +331,7 @@ namespace AzToolsFramework AZStd::unordered_map m_templateIdMap; // A container for mapping Templates' file paths to their Template ids. - AZStd::unordered_map m_templateFilePathToIdMap; + AZStd::unordered_map m_templateFilePathToIdMap; // A container of Prefab Links mapped by their Link ids. AZStd::unordered_map m_linkIdMap; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index c8beade4da..8b94935cc1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -35,19 +35,24 @@ namespace AzToolsFramework virtual TemplateReference FindTemplate(const TemplateId& id) = 0; virtual LinkReference FindLink(const LinkId& id) = 0; - virtual TemplateId AddTemplate(const AZStd::string& filePath, PrefabDom prefabDom) = 0; + virtual TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) = 0; virtual void RemoveTemplate(const TemplateId& templateId) = 0; + virtual void RemoveAllTemplates() = 0; virtual LinkId AddLink(const TemplateId& sourceTemplateId, const TemplateId& targetTemplateId, PrefabDomValue::MemberIterator& instanceIterator, InstanceOptionalReference instance) = 0; //creates a new Link virtual LinkId CreateLink(const TemplateId& linkTargetId, const TemplateId& linkSourceId, - const InstanceAlias& instanceAlias, const LinkId& linkId = InvalidLinkId) = 0; + const InstanceAlias& instanceAlias, const PrefabDomReference linkPatch, + const LinkId& linkId = InvalidLinkId) = 0; virtual void RemoveLink(const LinkId& linkId) = 0; - virtual TemplateId GetTemplateIdFromFilePath(AZStd::string_view filePath) const = 0; + virtual TemplateId GetTemplateIdFromFilePath(AZ::IO::PathView filePath) const = 0; + + virtual bool IsTemplateDirty(const TemplateId& templateId) = 0; + virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0; @@ -55,7 +60,8 @@ namespace AzToolsFramework virtual AZStd::unique_ptr InstantiatePrefab(const TemplateId& templateId) = 0; virtual AZStd::unique_ptr CreatePrefab(const AZStd::vector& entities, - AZStd::vector>&& instancesToConsume, const AZStd::string& filePath) = 0; + AZStd::vector>&& instancesToConsume, AZ::IO::PathView filePath, + AZStd::unique_ptr containerEntity = nullptr) = 0; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp index ee1d9c660a..4c5e61e031 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp @@ -12,8 +12,8 @@ #include #include - #include +#include namespace AzToolsFramework { @@ -28,7 +28,6 @@ namespace AzToolsFramework AZ_Assert(m_instanceToTemplateInterface, "Failed to grab instance to template interface"); } - //PrefabInstanceUndo PrefabUndoInstance::PrefabUndoInstance(const AZStd::string& undoOperationName) : PrefabUndoBase(undoOperationName) @@ -85,12 +84,22 @@ namespace AzToolsFramework void PrefabUndoEntityUpdate::Undo() { - m_instanceToTemplateInterface->PatchEntityInTemplate(m_undoPatch, m_entityAlias, m_templateId); + bool isPatchApplicationSuccessful = + m_instanceToTemplateInterface->PatchEntityInTemplate(m_undoPatch, m_entityAlias, m_templateId); + AZ_Error( + "Prefab", isPatchApplicationSuccessful, + "Applying the undo patch on the entity with alias '%s' in template with id '%llu' was unsuccessful", m_entityAlias.c_str(), + m_templateId); } void PrefabUndoEntityUpdate::Redo() { - m_instanceToTemplateInterface->PatchEntityInTemplate(m_redoPatch, m_entityAlias, m_templateId); + bool isPatchApplicationSuccessful = + m_instanceToTemplateInterface->PatchEntityInTemplate(m_redoPatch, m_entityAlias, m_templateId); + AZ_Error( + "Prefab", isPatchApplicationSuccessful, + "Applying the redo patch on the entity with alias '%s' in template with id '%llu' was unsuccessful", m_entityAlias.c_str(), + m_templateId); } //PrefabInstanceLinkUndo @@ -100,7 +109,7 @@ namespace AzToolsFramework , m_sourceId(InvalidTemplateId) , m_instanceAlias("") , m_linkId(InvalidLinkId) - , m_link(Link()) + , m_linkDom(PrefabDom()) , m_linkStatus(LinkStatus::LINKSTATUS) { m_prefabSystemComponentInterface = AZ::Interface::Get(); @@ -111,14 +120,18 @@ namespace AzToolsFramework const TemplateId& targetId, const TemplateId& sourceId, const InstanceAlias& instanceAlias, - const LinkId& linkId, - const Link& link) + const PrefabDomReference linkDom, + const LinkId linkId) { m_targetId = targetId; m_sourceId = sourceId; m_instanceAlias = instanceAlias; m_linkId = linkId; - m_link = link; + + if (linkDom.has_value()) + { + m_linkDom = AZStd::move(linkDom->get()); + } //if linkId is invalid, set as ADD if (m_linkId == InvalidLinkId) @@ -169,21 +182,133 @@ namespace AzToolsFramework m_prefabSystemComponentInterface->PropagateTemplateChanges(m_targetId); } - void PrefabUndoInstanceLink::AddLink() + LinkId PrefabUndoInstanceLink::GetLinkId() { - m_linkId = m_prefabSystemComponentInterface->CreateLink(m_targetId, m_sourceId, m_instanceAlias, m_linkId); + return m_linkId; + } - //if data already exists, repopulate - if (m_linkStatus == LinkStatus::REMOVE) - { - LinkReference link = m_prefabSystemComponentInterface->FindLink(m_linkId); - link = m_link; - } + void PrefabUndoInstanceLink::AddLink() + { + m_linkId = m_prefabSystemComponentInterface->CreateLink(m_targetId, m_sourceId, m_instanceAlias, m_linkDom, m_linkId); } void PrefabUndoInstanceLink::RemoveLink() { m_prefabSystemComponentInterface->RemoveLink(m_linkId); } + + //PrefabUndoLinkUpdate + PrefabUndoLinkUpdate::PrefabUndoLinkUpdate(const AZStd::string& undoOperationName) + : PrefabUndoBase(undoOperationName) + , m_linkId(InvalidLinkId) + , m_linkDomNext(PrefabDom()) + , m_linkDomPrevious(PrefabDom()) + { + m_prefabSystemComponentInterface = AZ::Interface::Get(); + AZ_Assert(m_instanceToTemplateInterface, "Failed to grab interface"); + } + + void PrefabUndoLinkUpdate::Capture( + const PrefabDom& patch, + const LinkId linkId) + { + m_linkId = linkId; + + //acquire link and existing values + LinkReference link = m_prefabSystemComponentInterface->FindLink(m_linkId); + if (link == AZStd::nullopt) + { + AZ_Error("Prefab", false, "PrefabUndoLinkUpdate: Link not found"); + return; + } + + if (link.has_value()) + { + m_linkDomPrevious = AZStd::move(link->get().GetLinkDom()); + } + + //get source templateDom + TemplateReference sourceTemplate = m_prefabSystemComponentInterface->FindTemplate(link->get().GetSourceTemplateId()); + + if (sourceTemplate == AZStd::nullopt) + { + AZ_Error("Prefab", false, "PrefabUndoLinkUpdate: Source template not found"); + return; + } + + PrefabDomReference sourceDom = sourceTemplate->get().GetPrefabDom(); + + //use instance pointer to reach position + PrefabDomValueReference instanceDomRef = link->get().GetLinkedInstanceDom(); + + //copy the target instance the link is pointing to + PrefabDom instanceDom; + instanceDom.CopyFrom(instanceDomRef->get(), instanceDom.GetAllocator()); + + //apply the patch to the template within the target + AZ::JsonSerializationResult::ResultCode result = AZ::JsonSerialization::ApplyPatch(instanceDom, + instanceDom.GetAllocator(), patch, AZ::JsonMergeApproach::JsonPatch); + + //remove the link id placed into the instance + auto linkIdIter = instanceDom.FindMember(PrefabDomUtils::LinkIdName); + if (linkIdIter != instanceDom.MemberEnd()) + { + instanceDom.RemoveMember(PrefabDomUtils::LinkIdName); + } + + //we use this to diff our copy against the vanilla template (source template) + PrefabDom patchLink; + m_instanceToTemplateInterface->GeneratePatch(patchLink, sourceDom->get(), instanceDom); + + // Create a copy of patchLink by providing the allocator of m_linkDomNext so that the patch doesn't become invalid when + // the patch goes out of scope in this function. + PrefabDom patchLinkCopy; + patchLinkCopy.CopyFrom(patchLink, m_linkDomNext.GetAllocator()); + + m_linkDomNext.CopyFrom(m_linkDomPrevious, m_linkDomNext.GetAllocator()); + auto patchesIter = m_linkDomNext.FindMember(PrefabDomUtils::PatchesName); + + if (patchesIter == m_linkDomNext.MemberEnd()) + { + m_linkDomNext.AddMember( + rapidjson::GenericStringRef(PrefabDomUtils::PatchesName), patchLinkCopy, m_linkDomNext.GetAllocator()); + } + else + { + patchesIter->value = AZStd::move(patchLinkCopy.GetArray()); + } + } + + void PrefabUndoLinkUpdate::Undo() + { + UpdateLink(m_linkDomPrevious); + } + + void PrefabUndoLinkUpdate::Redo() + { + UpdateLink(m_linkDomNext); + } + + void PrefabUndoLinkUpdate::UpdateLink(PrefabDom& linkDom) + { + LinkReference link = m_prefabSystemComponentInterface->FindLink(m_linkId); + + if (link == AZStd::nullopt) + { + AZ_Error("Prefab", false, "PrefabUndoLinkUpdate: Link not found"); + return; + } + + PrefabDom moveLink; + moveLink.CopyFrom(linkDom, linkDom.GetAllocator()); + link->get().GetLinkDom() = AZStd::move(moveLink); + + //propagate the link changes + link->get().UpdateTarget(); + m_prefabSystemComponentInterface->PropagateTemplateChanges(link->get().GetTargetTemplateId()); + + //mark as dirty + m_prefabSystemComponentInterface->SetTemplateDirtyFlag(link->get().GetTargetTemplateId(), true); + } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h index a1d278b191..3c94c9275d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h @@ -64,6 +64,9 @@ namespace AzToolsFramework : public PrefabUndoBase { public: + AZ_RTTI(PrefabUndoEntityUpdate, "{6D60C5A6-9535-45B3-8897-E5F6382FDC93}", PrefabUndoBase); + AZ_CLASS_ALLOCATOR(PrefabUndoEntityUpdate, AZ::SystemAllocator, 0); + explicit PrefabUndoEntityUpdate(const AZStd::string& undoOperationName); void Capture( @@ -88,7 +91,6 @@ namespace AzToolsFramework { ADD, REMOVE, - UPDATE, LINKSTATUS }; @@ -99,12 +101,14 @@ namespace AzToolsFramework const TemplateId& targetId, const TemplateId& sourceId, const InstanceAlias& instanceAlias, - const LinkId& linkId = InvalidLinkId, - const Link& link = Link()); + const PrefabDomReference linkDom = PrefabDomReference(), + const LinkId linkId = InvalidLinkId); void Undo() override; void Redo() override; + LinkId GetLinkId(); + private: //used for special cases of add/delete void AddLink(); @@ -116,10 +120,35 @@ namespace AzToolsFramework InstanceAlias m_instanceAlias; LinkId m_linkId; - Link m_link; //data for delete/update + PrefabDom m_linkDom; //data for delete/update LinkStatus m_linkStatus; PrefabSystemComponentInterface* m_prefabSystemComponentInterface = nullptr; }; + + class PrefabUndoLinkUpdate + : public PrefabUndoBase + { + public: + explicit PrefabUndoLinkUpdate(const AZStd::string& undoOperationName); + + //capture for add/remove + void Capture( + const PrefabDom& patch, + const LinkId linkId = InvalidLinkId); + + void Undo() override; + void Redo() override; + + private: + void UpdateLink(PrefabDom& linkDom); + + LinkId m_linkId; + PrefabDom m_linkDomNext; //data for delete/update + PrefabDom m_linkDomPrevious; //stores the data for undo + + PrefabSystemComponentInterface* m_prefabSystemComponentInterface = nullptr; + }; + } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.cpp new file mode 100644 index 0000000000..7891e2c2e0 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.cpp @@ -0,0 +1,183 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace AzToolsFramework +{ + namespace Prefab + { + void PrefabUndoCache::Initialize() + { + m_instanceToTemplateInterface = AZ::Interface::Get(); + AZ_Assert(m_instanceToTemplateInterface, "PrefabUndoCache - Could not retrieve instance of InstanceToTemplateInterface"); + + m_instanceEntityMapperInterface = AZ::Interface::Get(); + AZ_Assert(m_instanceEntityMapperInterface, "PrefabUndoCache - Could not retrieve instance of InstanceEntityMapperInterface"); + + bool prefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + if (prefabSystemEnabled) + { + // By default, ToolsApplication will register the regular PreemptiveCache as the handler of this interface. + // Since the SettingsRegistry isn't active when ToolsApplication is constructed, and Start and StartCommon + // aren't called during tests, we have to resort to unregistering the Preemptive cache here, and registering + // the PrefabCache in its place. Both caches check if they're registered before unregistering on destroy. + auto preemptiveCache = AZ::Interface::Get(); + if (preemptiveCache) + { + AZ::Interface::Unregister(preemptiveCache); + } + AZ::Interface::Register(this); + } + } + + void PrefabUndoCache::Destroy() + { + if (AZ::Interface::Get() == this) + { + AZ::Interface::Unregister(this); + } + } + + void PrefabUndoCache::Validate(const AZ::EntityId& entityId) + { + (void)entityId; + +#if defined(ENABLE_UNDOCACHE_CONSISTENCY_CHECKS) + if (entityId == AZ::SystemEntityId) + { + return; + } + + PrefabDom oldData; + Retrieve(entityId, oldData); + + UpdateCache(entityId); + + PrefabDom newData; + Retrieve(entityId, newData); + + if (newData != oldData) + { + // display a useful message + AZ::Entity* entity = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(entity, &AZ::ComponentApplicationRequests::FindEntity, entityId); + + if (!entity) + { + AZ_Warning( + "Undo", false, + "Undo system wasn't informed about the deletion of entity %p - make sure you call DeleteEntity, instead of " + "directly deleting it.\n", + entityId); + return; + } + + AZ_Warning( + "Undo", false, + "Undo system has inconsistent data for entity %p (%s)\n Ensure that SetDirty is " + "being called (or WorldEditor::WorldEditorMessages::Bus, AddDirtyEntity...) for modified entities.", + entityId, entity->GetName().c_str()); + } + + // Clear out newly generated data and + // replace with original data to ensure debug mode has the same data as profile/release + // in the event of the consistency check failing. + m_entitySavedStates[entityId] = AZStd::move(oldData); + +#endif // ENABLE_UNDOCACHE_CONSISTENCY_CHECKS + } + + void PrefabUndoCache::UpdateCache(const AZ::EntityId& entityId) + { + AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); + + AZ::Entity* entity = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(entity, &AZ::ComponentApplicationRequests::FindEntity, entityId); + + if (!entity) + { + AZ_Warning( + "Undo", false, + "PrefabUndoCache was told to update the cache for entity of id %llu, but that entity is not available in " + "FindEntity", + static_cast(entityId) + ); + return; + } + + InstanceOptionalReference instanceOptionalReference = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + + if (!instanceOptionalReference.has_value()) + { + AZ_Warning( + "Undo", false, + "PrefabUndoCache was told to update the cache for entity of id %p (%s), but that entity does not have an owning instance.", + entityId, entity->GetName().c_str()); + return; + } + + // Capture it + PrefabDom entityDom; + m_instanceToTemplateInterface->GenerateDomForEntity(entityDom, *entity); + m_entitySavedStates.emplace(AZStd::make_pair(entityId, AZStd::move(entityDom))); + + AZLOG("Prefab Undo", "Correctly updated cache for entity of id %llu (%s)", static_cast(entityId), entity->GetName().c_str()); + + return; + } + + void PrefabUndoCache::PurgeCache(const AZ::EntityId& entityId) + { + m_entitySavedStates.erase(entityId); + } + + bool PrefabUndoCache::Retrieve(const AZ::EntityId& entityId, PrefabDom& outDom) + { + auto it = m_entitySavedStates.find(entityId); + + if (it == m_entitySavedStates.end()) + { + return false; + } + + outDom = AZStd::move(m_entitySavedStates[entityId]); + m_entitySavedStates.erase(entityId); + return true; + } + + void PrefabUndoCache::Store(const AZ::EntityId& entityId, PrefabDom&& dom) + { + m_entitySavedStates.emplace(AZStd::make_pair(entityId, AZStd::move(dom))); + } + + void PrefabUndoCache::Clear() + { + m_entitySavedStates.clear(); + } + + } // namespace Prefab +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.h new file mode 100644 index 0000000000..924c93f44b --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.h @@ -0,0 +1,63 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace AzToolsFramework +{ + namespace UndoSystem + { + class URSequencePoint; + } + + namespace Prefab + { + class InstanceEntityMapperInterface; + class InstanceToTemplateInterface; + + class PrefabUndoCache + : UndoSystem::UndoCacheInterface + { + public: + AZ_CLASS_ALLOCATOR(PrefabUndoCache, AZ::SystemAllocator, 0); + + void Initialize(); + void Destroy(); + + // UndoCacheInterface... + void UpdateCache(const AZ::EntityId& entityId) override; + void PurgeCache(const AZ::EntityId& entityId) override; + void Clear() override; + void Validate(const AZ::EntityId& entityId) override; + + // Retrieve the last known state for an entity + bool Retrieve(const AZ::EntityId& entityId, PrefabDom& outDom); + + // Store dom as the cached state of entityId + void Store(const AZ::EntityId& entityId, PrefabDom&& dom); + + private: + typedef AZStd::unordered_map EntityDomMap; + EntityDomMap m_entitySavedStates; + + InstanceEntityMapperInterface* m_instanceEntityMapperInterface = nullptr; + InstanceToTemplateInterface* m_instanceToTemplateInterface = nullptr; + }; + + } // namespace Prefab +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/EditorInfoRemover.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/EditorInfoRemover.cpp index 347d80e3b1..0a677804b7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/EditorInfoRemover.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/EditorInfoRemover.cpp @@ -40,18 +40,18 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils return; } - prefabProcessorContext.ListPrefabs([this, &serializeContext, &prefabProcessorContext](AZStd::string_view prefabName, PrefabDom& prefab) - { - auto result = RemoveEditorInfo(prefab, serializeContext, prefabProcessorContext); - if (!result) + prefabProcessorContext.ListPrefabs( + [this, &serializeContext, &prefabProcessorContext](AZStd::string_view prefabName, PrefabDom& prefab) { - AZ_Assert(false, - "Converting to runtime Prefab '%.*s' failed, Error: %s .", - AZ_STRING_ARG(prefabName), - result.GetError().c_str()); - return; - } - }); + auto result = RemoveEditorInfo(prefab, serializeContext, prefabProcessorContext); + if (!result) + { + AZ_Error( + "Prefab", false, "Converting to runtime Prefab '%.*s' failed, Error: %s .", AZ_STRING_ARG(prefabName), + result.GetError().c_str()); + return; + } + }); } void EditorInfoRemover::Reflect(AZ::ReflectContext* context) @@ -74,6 +74,12 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils } ); + if (instance->HasContainerEntity()) + { + auto containerEntityReference = instance->GetContainerEntity(); + result.emplace_back(&containerEntityReference->get()); + } + return result; } @@ -519,7 +525,8 @@ exportComponent, prefabProcessorContext); // convert Prefab DOM into Prefab Instance. AZStd::unique_ptr instance(aznew Instance()); - if (!Prefab::PrefabDomUtils::LoadInstanceFromPrefabDom(*instance, prefab, false)) + if (!Prefab::PrefabDomUtils::LoadInstanceFromPrefabDom(*instance, prefab, + Prefab::PrefabDomUtils::LoadInstanceFlags::AssignRandomEntityId)) { PrefabDomValueReference sourceReference = PrefabDomUtils::FindPrefabDomValue(prefab, PrefabDomUtils::SourceName); @@ -613,19 +620,28 @@ exportComponent, prefabProcessorContext); [&exportEntitiesMap](AZStd::unique_ptr& entity) { auto entityId = entity->GetId(); - entity.release(); entity.reset(exportEntitiesMap[entityId]); return true; } ); + if (instance->HasContainerEntity()) + { + if (auto found = exportEntitiesMap.find(instance->GetContainerEntityId()); found != exportEntitiesMap.end()) + { + instance->SetContainerEntity(*found->second); + } + } + // save the final result in the target Prefab DOM. - if (!PrefabDomUtils::StoreInstanceInPrefabDom(*instance, prefab)) + PrefabDom filteredPrefab; + if (!PrefabDomUtils::StoreInstanceInPrefabDom(*instance, filteredPrefab)) { return AZ::Failure(AZStd::string::format( "Saving exported Prefab Instance within a Prefab Dom failed.") ); } + prefab.Swap(filteredPrefab); return AZ::Success(); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.cpp index 7ab5ed5e39..5d8f1f35e3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -23,9 +24,11 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils { void PrefabCatchmentProcessor::Process(PrefabProcessorContext& context) { - context.ListPrefabs([&context](AZStd::string_view prefabName, PrefabDom& prefab) + AZ::DataStream::StreamType serializationFormat = m_serializationFormat == SerializationFormats::Binary ? + AZ::DataStream::StreamType::ST_BINARY : AZ::DataStream::StreamType::ST_XML; + context.ListPrefabs([&context, serializationFormat](AZStd::string_view prefabName, PrefabDom& prefab) { - ProcessPrefab(context, prefabName, prefab); + ProcessPrefab(context, prefabName, prefab, serializationFormat); }); } @@ -33,31 +36,61 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils { if (auto* serializeContext = azrtti_cast(context); serializeContext != nullptr) { - serializeContext->Class()->Version(1); + serializeContext->Enum() + ->Value("Binary", SerializationFormats::Binary) + ->Value("Text", SerializationFormats::Text); + + serializeContext->Class() + ->Version(2) + ->Field("SerializationFormat", &PrefabCatchmentProcessor::m_serializationFormat); } } - void PrefabCatchmentProcessor::ProcessPrefab(PrefabProcessorContext& context, AZStd::string_view prefabName, PrefabDom& prefab) + void PrefabCatchmentProcessor::ProcessPrefab(PrefabProcessorContext& context, AZStd::string_view prefabName, PrefabDom& prefab, + AZ::DataStream::StreamType serializationFormat) { - AZStd::string uniqueName = prefabName; - uniqueName += '.'; - uniqueName += AzFramework::Spawnable::FileExtension; + uniqueName += AzFramework::Spawnable::DotFileExtension; - auto serializer = [](AZStd::vector& output, const ProcessedObjectStore& object) -> bool + auto serializer = [serializationFormat](AZStd::vector& output, const ProcessedObjectStore& object) -> bool { AZ::IO::ByteContainerStream stream(&output); - return AZ::Utils::SaveObjectToStream(stream, AZ::DataStream::StreamType::ST_BINARY, - AZStd::any_cast(&object.GetObject()), object.GetObject().type()); + auto& asset = object.GetAsset(); + return AZ::Utils::SaveObjectToStream(stream, serializationFormat, &asset, asset.GetType()); }; - auto spawnable = SpawnableUtils::CreateSpawnable(prefab); - SpawnableUtils::SortEntitiesByTransformHierarchy(spawnable); - AZStd::any spawnableAny(AZStd::move(spawnable)); + auto&& [object, spawnable] = ProcessedObjectStore::Create( + AZStd::move(uniqueName), context.GetSourceUuid(), AZStd::move(serializer)); + AZ_Assert(spawnable, "Failed to create a new spawnable."); - context.GetProcessedObjects().emplace_back(AZStd::move(uniqueName), AZStd::move(spawnableAny), - AZStd::move(serializer), AZ::AzTypeInfo::Uuid()); + bool result = SpawnableUtils::CreateSpawnable(*spawnable, prefab); + if (result) + { + AzFramework::Spawnable::EntityList& entities = spawnable->GetEntities(); + for (auto it = entities.begin(); it != entities.end(); ) + { + (*it)->InvalidateDependencies(); + AZ::Entity::DependencySortOutcome evaluation = (*it)->EvaluateDependenciesGetDetails(); + if (evaluation.IsSuccess()) + { + ++it; + } + else + { + AZ_Error("Prefabs", false, "Entity '%s' %s cannot be activated for the following reason: %s", + (*it)->GetName().c_str(), (*it)->GetId().ToString().c_str(), evaluation.GetError().m_message.c_str()); + it = entities.erase(it); + } + } + SpawnableUtils::SortEntitiesByTransformHierarchy(*spawnable); + context.GetProcessedObjects().push_back(AZStd::move(object)); - context.RemovePrefab(prefabName); + context.RemovePrefab(prefabName); + } + else + { + AZ_Error("Prefabs", false, "Failed to convert prefab '%.*s' to a spawnable.", AZ_STRING_ARG(prefabName)); + context.ErrorEncountered(); + } } } // namespace AzToolsFramework::Prefab::PrefabConversionUtils diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.h index b4b535e30f..382fa46e8c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabCatchmentProcessor.h @@ -30,6 +30,13 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils AZ_RTTI(AzToolsFramework::Prefab::PrefabConversionUtils::PrefabCatchmentProcessor, "{F71E2FBA-22ED-44C7-B4C8-D2CF4B2C7B97}", PrefabProcessor); + //! The format the remaining spawnables are going to be stored in. + enum class SerializationFormats + { + Binary, //!< Binary is generally preferable for performance. + Text //!< Store in text format which is usually slower but helps with debugging. + }; + ~PrefabCatchmentProcessor() override = default; void Process(PrefabProcessorContext& context) override; @@ -37,6 +44,15 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils static void Reflect(AZ::ReflectContext* context); protected: - static void ProcessPrefab(PrefabProcessorContext& context, AZStd::string_view prefabName, PrefabDom& prefab); + static void ProcessPrefab(PrefabProcessorContext& context, AZStd::string_view prefabName, PrefabDom& prefab, + AZ::DataStream::StreamType serializationFormat); + + SerializationFormats m_serializationFormat{ SerializationFormats::Binary }; }; } // namespace AzToolsFramework::Prefab::PrefabConversionUtils + +namespace AZ +{ + AZ_TYPE_INFO_SPECIALIZE(AzToolsFramework::Prefab::PrefabConversionUtils::PrefabCatchmentProcessor::SerializationFormats, + "{0FBE2482-B514-4256-8716-EA3ECDF8CD49}"); +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.cpp index 5be24d465f..c4cbad701d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.cpp @@ -25,7 +25,30 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils auto registry = AZ::SettingsRegistry::Get(); AZ_Assert(registry, "PrefabConversionPipeline is created before the Settings Registry is available."); - return registry->GetObject(m_processors, registryKey); + bool result = registry->GetObject(m_processors, registryKey); + if (!result) + { + m_processors.clear(); + } + + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + + if (serializeContext) + { + m_fingerprint = CalculateProcessorFingerprint(serializeContext); + } + else + { + AZ_Error("PrefabConversionPipeline", false, "Failed to get serialization context"); + } + + return result; + } + + bool PrefabConversionPipeline::IsLoaded() const + { + return !m_processors.empty(); } void PrefabConversionPipeline::ProcessPrefab(PrefabProcessorContext& context) @@ -35,6 +58,26 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils processor->Process(context); } } + size_t PrefabConversionPipeline::CalculateProcessorFingerprint(AZ::SerializeContext* context) + { + size_t fingerprint = 0; + + for (const auto& processor : m_processors) + { + const AZ::SerializeContext::ClassData* classData = context->FindClassData(processor->RTTI_GetType()); + + if (!classData) + { + AZ_Warning("PrefabConversionPipeline", false, "Class data for processor type %s not found. Cannot get version for fingerprinting", processor->RTTI_GetType().ToString().c_str()); + continue; + } + + AZStd::hash_combine(fingerprint, processor->RTTI_GetType()); + AZStd::hash_combine(fingerprint, classData->m_version); + } + + return fingerprint; + } void PrefabConversionPipeline::Reflect(AZ::ReflectContext* context) { @@ -45,4 +88,9 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils serializeContext->RegisterGenericType(); } } + + size_t PrefabConversionPipeline::GetFingerprint() const + { + return m_fingerprint; + } } // namespace AzToolsFramework::Prefab::PrefabConversionUtils diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.h index 7d379124d8..bd2e9b6621 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabConversionPipeline.h @@ -31,12 +31,18 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils using PrefabProcessorList = AZStd::vector; bool LoadStackProfile(AZStd::string_view stackProfile); + bool IsLoaded() const; void ProcessPrefab(PrefabProcessorContext& context); - static void Reflect(AZ::ReflectContext* context); + size_t GetFingerprint() const; + static void Reflect(AZ::ReflectContext* context); + private: + size_t CalculateProcessorFingerprint(AZ::SerializeContext* context); + PrefabProcessorList m_processors; + size_t m_fingerprint{}; }; } // namespace AzToolsFramework::Prefab::PrefabConversionUtils diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.cpp index 6cc0de5887..eb206349d0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.cpp @@ -14,6 +14,10 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils { + PrefabProcessorContext::PrefabProcessorContext(const AZ::Uuid& sourceUuid) + : m_sourceUuid(sourceUuid) + {} + bool PrefabProcessorContext::AddPrefab(AZStd::string prefabName, PrefabDom prefab) { auto result = m_prefabs.emplace(AZStd::move(prefabName), AZStd::move(prefab)); @@ -76,9 +80,28 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils return m_products; } + void PrefabProcessorContext::SetPlatformTags(AZ::PlatformTagSet tags) + { + m_platformTags = AZStd::move(tags); + } + const AZ::PlatformTagSet& PrefabProcessorContext::GetPlatformTags() const { return m_platformTags; } + const AZ::Uuid& PrefabProcessorContext::GetSourceUuid() const + { + return m_sourceUuid; + } + + bool PrefabProcessorContext::HasCompletedSuccessfully() const + { + return m_completedSuccessfully; + } + + void PrefabProcessorContext::ErrorEncountered() + { + m_completedSuccessfully = false; + } } // namespace AzToolsFramework::Prefab::PrefabConversionUtils diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.h index 24616d0ad7..66368f335b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/PrefabProcessorContext.h @@ -33,6 +33,7 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils AZ_CLASS_ALLOCATOR(PrefabProcessorContext, AZ::SystemAllocator, 0); AZ_RTTI(PrefabProcessorContext, "{C7D77E3A-C544-486B-B774-7C82C38FE22F}"); + explicit PrefabProcessorContext(const AZ::Uuid& sourceUuid); virtual ~PrefabProcessorContext() = default; virtual bool AddPrefab(AZStd::string prefabName, PrefabDom prefab); @@ -44,7 +45,12 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils virtual ProcessedObjectStoreContainer& GetProcessedObjects(); virtual const ProcessedObjectStoreContainer& GetProcessedObjects() const; + virtual void SetPlatformTags(AZ::PlatformTagSet tags); virtual const AZ::PlatformTagSet& GetPlatformTags() const; + virtual const AZ::Uuid& GetSourceUuid() const; + + virtual bool HasCompletedSuccessfully() const; + virtual void ErrorEncountered(); protected: using NamedPrefabContainer = AZStd::unordered_map; @@ -53,6 +59,8 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils ProcessedObjectStoreContainer m_products; AZStd::vector m_delayedDelete; AZ::PlatformTagSet m_platformTags; + AZ::Uuid m_sourceUuid; bool m_isIterating{ false }; + bool m_completedSuccessfully{ true }; }; } // namespace AzToolsFramework::Prefab::PrefabConversionUtils diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.cpp index c48d329394..ee45c258ff 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.cpp @@ -11,25 +11,21 @@ */ #include -#include #include namespace AzToolsFramework::Prefab::PrefabConversionUtils { - ProcessedObjectStore::ProcessedObjectStore(AZStd::string uniqueId, AZStd::any object, SerializerFunction objectSerializer, - AZ::Data::AssetType assetType) + ProcessedObjectStore::ProcessedObjectStore(AZStd::string uniqueId, AZStd::unique_ptr asset, SerializerFunction assetSerializer) : m_uniqueId(AZStd::move(uniqueId)) - , m_object(AZStd::move(object)) - , m_objectSerializer(AZStd::move(objectSerializer)) - , m_assetType(AZStd::move(assetType)) - { - } + , m_assetSerializer(AZStd::move(assetSerializer)) + , m_asset(AZStd::move(asset)) + {} bool ProcessedObjectStore::Serialize(AZStd::vector& output) const { - if (m_objectSerializer) + if (m_assetSerializer) { - return m_objectSerializer(output, *this); + return m_assetSerializer(output, *this); } else { @@ -37,25 +33,38 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils } } - const AZStd::any& ProcessedObjectStore::GetObject() const + bool ProcessedObjectStore::HasAsset() const { - return m_object; + return m_asset != nullptr; } - AZStd::any ProcessedObjectStore::ReleaseObject() + const AZ::Data::AssetType& ProcessedObjectStore::GetAssetType() const { - return AZStd::move(m_object); + AZ_Assert(m_asset, "Called GetAssetType on ProcessedObjectStore when there was no valid asset."); + return m_asset->GetType(); } - uint32_t ProcessedObjectStore::BuildSubId() const + AZ::Data::AssetData& ProcessedObjectStore::GetAsset() { - AZ::Uuid subIdHash = AZ::Uuid::CreateData(m_uniqueId.data(), m_uniqueId.size()); - return azlossy_caster(subIdHash.GetHash()); + AZ_Assert(m_asset, "Called GetAsset on ProcessedObjectStore when there was no valid asset."); + return *m_asset; } - const AZ::Data::AssetType& ProcessedObjectStore::GetAssetType() const + const AZ::Data::AssetData& ProcessedObjectStore::GetAsset() const + { + AZ_Assert(m_asset, "Called GetAsset on ProcessedObjectStore when there was no valid asset."); + return *m_asset; + } + + AZStd::unique_ptr ProcessedObjectStore::ReleaseAsset() + { + return AZStd::move(m_asset); + } + + uint32_t ProcessedObjectStore::BuildSubId(AZStd::string_view id) { - return m_assetType; + AZ::Uuid subIdHash = AZ::Uuid::CreateData(id.data(), id.size()); + return azlossy_caster(subIdHash.GetHash()); } const AZStd::string& ProcessedObjectStore::GetId() const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.h index ab30d6bd61..a24d1f24c5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/ProcesedObjectStore.h @@ -13,10 +13,11 @@ #pragma once #include -#include -#include -#include #include +#include +#include +#include +#include namespace AzToolsFramework::Prefab::PrefabConversionUtils { @@ -31,26 +32,42 @@ namespace AzToolsFramework::Prefab::PrefabConversionUtils //! Constructs a new instance. //! @param uniqueId A name for the object that's unique within the scope of the Prefab. This name will be used to generate a sub id for the product - //! which requires that the name is stable between runs. - //! @param object The object that generated during processing of a Prefab. - //! @param objectSerializer The callback used to convert the provided object into a binary stream. - //! @param assetType The asset type of the asset. - //! @param storagePath The relative path where the asset will be stored if/when committed to disk. - ProcessedObjectStore(AZStd::string uniqueId, AZStd::any object, SerializerFunction objectSerializer, AZ::Data::AssetType assetType); - + //! which requires that the name to be stable between runs. + //! @param sourceId The uuid for the source file. + //! @param assetSerializer The callback used to convert the provided asset into a binary version. + template + static AZStd::pair Create(AZStd::string uniqueId, const AZ::Uuid& sourceId, + SerializerFunction assetSerializer); + bool Serialize(AZStd::vector& output) const; - uint32_t BuildSubId() const; - - const AZStd::any& GetObject() const; - AZStd::any ReleaseObject(); + static uint32_t BuildSubId(AZStd::string_view id); + bool HasAsset() const; const AZ::Data::AssetType& GetAssetType() const; + const AZ::Data::AssetData& GetAsset() const; + AZ::Data::AssetData& GetAsset(); + AZStd::unique_ptr ReleaseAsset(); + const AZStd::string& GetId() const; private: - AZStd::any m_object; - SerializerFunction m_objectSerializer; - AZ::Data::AssetType m_assetType; + ProcessedObjectStore(AZStd::string uniqueId, AZStd::unique_ptr asset, SerializerFunction assetSerializer); + + SerializerFunction m_assetSerializer; + AZStd::unique_ptr m_asset; AZStd::string m_uniqueId; }; + + template + AZStd::pair ProcessedObjectStore::Create(AZStd::string uniqueId, const AZ::Uuid& sourceId, + SerializerFunction assetSerializer) + { + static_assert(AZStd::is_base_of_v, + "ProcessedObjectStore can only be created from a class that derives from AZ::Data::AssetData."); + AZ::Data::AssetId assetId(sourceId, BuildSubId(uniqueId)); + auto instance = AZStd::make_unique(assetId, AZ::Data::AssetData::AssetStatus::Ready); + ProcessedObjectStore resultLeft(AZStd::move(uniqueId), AZStd::move(instance), AZStd::move(assetSerializer)); + T* resultRight = static_cast(&resultLeft.GetAsset()); + return AZStd::make_pair(AZStd::move(resultLeft), resultRight); + } } // namespace AzToolsFramework::Prefab::PrefabConversionUtils diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp index 65a3e5071b..713a5d8205 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp @@ -17,9 +17,10 @@ #include #include #include +#include +#include #include #include -#include namespace AzToolsFramework::Prefab::SpawnableUtils { @@ -27,22 +28,35 @@ namespace AzToolsFramework::Prefab::SpawnableUtils AzFramework::Spawnable CreateSpawnable(const PrefabDom& prefabDom) { AzFramework::Spawnable spawnable; - AZStd::unique_ptr instance(aznew Instance()); - if (!Prefab::PrefabDomUtils::LoadInstanceFromPrefabDom(*instance, prefabDom, false)) + [[maybe_unused]] bool result = CreateSpawnable(spawnable, prefabDom); + AZ_Assert(result, + "Failed to Load Prefab Instance from given Prefab DOM while Spawnable creation."); + return spawnable; + } + + bool CreateSpawnable(AzFramework::Spawnable& spawnable, const PrefabDom& prefabDom) + { + Instance instance; + if (Prefab::PrefabDomUtils::LoadInstanceFromPrefabDom(instance, prefabDom, + Prefab::PrefabDomUtils::LoadInstanceFlags::AssignRandomEntityId)) // Always assign random entity ids because the spawnable is + // going to be used to create clones of the entities. { - AZ_Assert(false, - "Failed to Load Prefab Instance from given Prefab DOM while Spawnable creation."); + AzFramework::Spawnable::EntityList& entities = spawnable.GetEntities(); + if (instance.HasContainerEntity()) + { + entities.emplace_back(AZStd::move(instance.DetachContainerEntity())); + } + instance.DetachNestedEntities( + [&entities](AZStd::unique_ptr entity) + { + entities.emplace_back(AZStd::move(entity)); + }); + return true; } else { - AzFramework::Spawnable::EntityList& entities = spawnable.GetEntities(); - instance->DetachNestedEntities([&entities](AZStd::unique_ptr entity) - { - entities.emplace_back(AZStd::move(entity)); - }); + return false; } - - return spawnable; } void OrganizeEntitiesForSorting( diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.h index 0929981e8e..74cbbcb1e4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.h @@ -18,6 +18,7 @@ namespace AzToolsFramework::Prefab::SpawnableUtils { AzFramework::Spawnable CreateSpawnable(const PrefabDom& prefabDom); + bool CreateSpawnable(AzFramework::Spawnable& spawnable, const PrefabDom& prefabDom); void SortEntitiesByTransformHierarchy(AzFramework::Spawnable& spawnable); } // namespace AzToolsFramework::Prefab::SpawnableUtils diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp index 89ef40515b..0511ee1f13 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp @@ -20,7 +20,7 @@ namespace AzToolsFramework { namespace Prefab { - Template::Template(const AZStd::string& filePath, PrefabDom prefabDom) + Template::Template(const AZ::IO::Path& filePath, PrefabDom prefabDom) : m_filePath(filePath) , m_prefabDom(AZStd::move(prefabDom)) { @@ -83,6 +83,16 @@ namespace AzToolsFramework m_isLoadedWithErrors = loadedWithErrors; } + bool Template::IsDirty() const + { + return m_isDirty; + } + + void Template::MarkAsDirty(bool dirty) + { + m_isDirty = dirty; + } + bool Template::AddLink(LinkId newLinkId) { if (newLinkId == InvalidLinkId) @@ -236,7 +246,7 @@ namespace AzToolsFramework return findInstancesResult->get(); } - const AZStd::string& Template::GetFilePath() const + const AZ::IO::Path& Template::GetFilePath() const { return m_filePath; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h index 9e7a4fd835..17147bc206 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h @@ -12,6 +12,7 @@ #pragma once +#include #include #include #include @@ -37,7 +38,7 @@ namespace AzToolsFramework using Links = AZStd::unordered_set; Template() = default; - Template(const AZStd::string& filePath, PrefabDom prefabDom); + Template(const AZ::IO::Path& filePath, PrefabDom prefabDom); Template(const Template& other); Template& operator=(const Template& other); @@ -47,10 +48,13 @@ namespace AzToolsFramework virtual ~Template() noexcept = default; bool IsValid() const; - bool IsLoadedWithErrors() const; + bool IsLoadedWithErrors() const; void MarkAsLoadedWithErrors(bool loadedWithErrors); + bool IsDirty() const; + void MarkAsDirty(bool dirty); + bool AddLink(LinkId newLinkId); bool RemoveLink(LinkId linkId); bool HasLink(LinkId linkId) const; @@ -64,7 +68,7 @@ namespace AzToolsFramework PrefabDomValueReference GetInstancesValue(); PrefabDomValueConstReference GetInstancesValue() const; - const AZStd::string& GetFilePath() const; + const AZ::IO::Path& GetFilePath() const; private: // Container for keeping links representing the Template's nested instances. @@ -74,10 +78,13 @@ namespace AzToolsFramework PrefabDom m_prefabDom; // File path of this Prefab Template. - AZStd::string m_filePath; + AZ::IO::Path m_filePath; // Flag to tell if this Template and all its nested instances loaded with any error. bool m_isLoadedWithErrors = false; + + // Flag to tell if this Template has changes that have yet to be saved to file. + bool m_isDirty = false; }; } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.cpp index 40bf6aeb7e..afcbe51a88 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "SliceMetadataEntityContextComponent.h" @@ -196,10 +197,10 @@ namespace AzToolsFramework SliceMetadataEntityContextNotificationBus::Broadcast(&SliceMetadataEntityContextNotifications::OnMetadataEntityAdded, metadataEntity.GetId()); // Register the metadata entity with the pre-emptive undo cache (if exists) so it has an initial state - auto* preemptiveUndoCache = PreemptiveUndoCache::Get(); - if (preemptiveUndoCache) + auto undoCacheInterface = AZ::Interface::Get(); + if (undoCacheInterface) { - preemptiveUndoCache->UpdateCache(metadataEntity.GetId()); + undoCacheInterface->UpdateCache(metadataEntity.GetId()); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.cpp index 0061763261..705ce5f71b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.cpp @@ -52,6 +52,15 @@ namespace AzToolsFramework return true; } + bool SourceControlThumbnailKey::Equals(const ThumbnailKey* other) const + { + if (!ThumbnailKey::Equals(other)) + { + return false; + } + return m_fileName == azrtti_cast(other)->GetFileName(); + } + ////////////////////////////////////////////////////////////////////////// // SourceControlThumbnail ////////////////////////////////////////////////////////////////////////// @@ -142,7 +151,7 @@ namespace AzToolsFramework // SourceControlThumbnailCache ////////////////////////////////////////////////////////////////////////// SourceControlThumbnailCache::SourceControlThumbnailCache() - : ThumbnailCache() + : ThumbnailCache() { } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.h index 5287145567..03b04a3fd9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/SourceControlThumbnail.h @@ -36,6 +36,8 @@ namespace AzToolsFramework bool UpdateThumbnail() override; + bool Equals(const ThumbnailKey* other) const override; + protected: //! absolute path AZStd::string m_fileName; @@ -107,7 +109,7 @@ namespace AzToolsFramework //! Stores products' thumbnails class SourceControlThumbnailCache - : public ThumbnailCache + : public ThumbnailCache { public: SourceControlThumbnailCache(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp index 0d9672f0c0..939ca813b6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp @@ -39,6 +39,16 @@ namespace AzToolsFramework return true; } + size_t ThumbnailKey::GetHash() const + { + return 0; + } + + bool ThumbnailKey::Equals(const ThumbnailKey* other) const + { + return RTTI_GetType() == other->RTTI_GetType(); + } + ////////////////////////////////////////////////////////////////////////// // Thumbnail ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h index 1bedee6a8f..671960bea5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h @@ -49,19 +49,23 @@ namespace AzToolsFramework virtual bool UpdateThumbnail(); -Q_SIGNALS: + virtual size_t GetHash() const; + + virtual bool Equals(const ThumbnailKey* other) const; + Q_SIGNALS: //! Updated signal is dispatched whenever thumbnail data was changed. Anyone using this thumbnail should listen to this. void ThumbnailUpdatedSignal() const; //! Force update mapped thumbnails void UpdateThumbnailSignal() const; + private: bool m_ready = false; }; typedef QSharedPointer SharedThumbnailKey; - #define MAKE_TKEY(type, ...) QSharedPointer(new type(__VA_ARGS__)) +#define MAKE_TKEY(type, ...) QSharedPointer(new type(__VA_ARGS__)) //! Thumbnail is the base class in thumbnailer system. /* @@ -92,7 +96,7 @@ Q_SIGNALS: SharedThumbnailKey GetKey() const; State GetState() const; -Q_SIGNALS: + Q_SIGNALS: void Updated() const; public Q_SLOTS: @@ -128,16 +132,44 @@ Q_SIGNALS: }; typedef QSharedPointer SharedThumbnailProvider; + } +} + +namespace AZStd +{ + // hash specialization + template <> + struct hash + { + AZ_FORCE_INLINE size_t operator()(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const + { + return key->GetHash(); + } + }; + + template <> + struct AZStd::equal_to + { + AZ_FORCE_INLINE bool operator()(const AzToolsFramework::Thumbnailer::SharedThumbnailKey& left, const AzToolsFramework::Thumbnailer::SharedThumbnailKey& right) const + { + return left->Equals(right.data()); + } + }; +} +namespace AzToolsFramework +{ + namespace Thumbnailer + { //! ThumbnailCache manages thumbnails of specific type, derive your custom provider from this /* ThumbnailType - type of thumbnails managed - HasherType - hashing function for storing thumbnail keys in the hashtable + Hasher - hashing function for storing thumbnail keys in the hashtable EqualKey - equality function for storing thumbnail keys in the hashtable - HasherType and EqualKey need to be provided on individual basis depending on + Hasher and EqualKey need to be provided on individual basis depending on what constitutes a unique key and how should the key collection be optimized */ - template + template, class EqualKey = AZStd::equal_to> class ThumbnailCache : public ThumbnailProvider , public AZ::TickBus::Handler @@ -157,7 +189,7 @@ Q_SIGNALS: protected: int m_thumbnailSize; - AZStd::unordered_map m_cache; + AZStd::unordered_map m_cache; //! Check if thumbnail key is handled by this provider, overload in derived class virtual bool IsSupportedThumbnail(SharedThumbnailKey key) const = 0; @@ -169,4 +201,5 @@ Q_SIGNALS: Q_DECLARE_METATYPE(AzToolsFramework::Thumbnailer::SharedThumbnailKey) + #include diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.inl b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.inl index adc147ec9d..3182248017 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.inl +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.inl @@ -16,21 +16,21 @@ namespace AzToolsFramework { namespace Thumbnailer { - template - ThumbnailCache::ThumbnailCache() + template + ThumbnailCache::ThumbnailCache() : m_thumbnailSize(0) { BusConnect(); } - template - ThumbnailCache::~ThumbnailCache() + template + ThumbnailCache::~ThumbnailCache() { BusDisconnect(); } - template - void ThumbnailCache::OnTick(float deltaTime, AZ::ScriptTimePoint /*time*/) + template + void ThumbnailCache::OnTick(float deltaTime, AZ::ScriptTimePoint /*time*/) { for (auto& kvp : m_cache) { @@ -38,9 +38,8 @@ namespace AzToolsFramework } } - template - bool ThumbnailCache::GetThumbnail( - SharedThumbnailKey key, SharedThumbnail& thumbnail) + template + bool ThumbnailCache::GetThumbnail(SharedThumbnailKey key, SharedThumbnail& thumbnail) { auto it = m_cache.find(key); if (it != m_cache.end()) @@ -57,8 +56,8 @@ namespace AzToolsFramework return false; } - template - void ThumbnailCache::SetThumbnailSize(int thumbnailSize) + template + void ThumbnailCache::SetThumbnailSize(int thumbnailSize) { m_thumbnailSize = thumbnailSize; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h index 8ca5d615c4..ebc721bb4c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h @@ -65,7 +65,7 @@ namespace AzToolsFramework static const bool EnableEventQueue = true; typedef AZStd::recursive_mutex MutexType; - virtual void RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) = 0; + virtual void RenderThumbnail(SharedThumbnailKey thumbnailKey, int thumbnailSize) = 0; virtual bool Installed() const { return false; } }; @@ -79,7 +79,7 @@ namespace AzToolsFramework { public: static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; - typedef AZ::Data::AssetId BusIdType; + typedef SharedThumbnailKey BusIdType; //! notify product thumbnail that the data is ready virtual void ThumbnailRendered(QPixmap& thumbnailImage) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.cpp index ec59a95fd5..7c4d72dbbf 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.cpp @@ -67,10 +67,7 @@ namespace AzToolsFramework incompatible.push_back(AZ_CRC_CE("LookAtService")); incompatible.push_back(AZ_CRC_CE("SequenceService")); incompatible.push_back(AZ_CRC_CE("ClothMeshService")); - incompatible.push_back(AZ_CRC_CE("PhysXColliderService")); - incompatible.push_back(AZ_CRC_CE("PhysXTriggerService")); incompatible.push_back(AZ_CRC_CE("PhysXJointService")); - incompatible.push_back(AZ_CRC_CE("PhysXShapeColliderService")); incompatible.push_back(AZ_CRC_CE("PhysXCharacterControllerService")); incompatible.push_back(AZ_CRC_CE("PhysXRagdollService")); incompatible.push_back(AZ_CRC_CE("WhiteBoxService")); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.h index fa02fb3990..73fa04d4be 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.h @@ -35,6 +35,7 @@ namespace AzToolsFramework public: AZ_EDITOR_COMPONENT(ScriptEditorComponent, "{b5fc8679-fa2a-4c7c-ac42-dcc279ea613a}") + static void Reflect(AZ::ReflectContext* context); static bool DoComponentsMatch(const ScriptEditorComponent* thisComponent, const ScriptEditorComponent* otherComponent); ScriptEditorComponent() = default; @@ -79,8 +80,6 @@ namespace AzToolsFramework float m_sortOrder; // Sort order of the property as defined by using the "order" attribute, by default the order is FLT_MAX which means alphabetical sort will be used }; - static void Reflect(AZ::ReflectContext* context); - void LoadProperties(); // make sure internal script (m_scriptComponent.m_script) is set before loading void LoadScript(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ToolsAssetCatalogComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ToolsAssetCatalogComponent.cpp index f3712f3d88..b9fdff024f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ToolsAssetCatalogComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ToolsAssetCatalogComponent.cpp @@ -196,7 +196,6 @@ namespace AssetProcessor AZ_UNUSED(autoRegisterIfNotFound); AZ_Assert(autoRegisterIfNotFound == false, "Auto registration is invalid during asset processing."); AZ_UNUSED(typeToRegister); - AZ_Assert(typeToRegister == AZ::Data::s_invalidAssetType, "Can not register types during asset processing."); AzFramework::SocketConnection* engineConnection = AzFramework::SocketConnection::GetInstance(); if (!engineConnection || !engineConnection->IsConnected()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp index f7e43796b8..2ceb97adfd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp @@ -23,9 +23,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -1054,11 +1056,32 @@ namespace AzToolsFramework AZ::u32 TransformComponent::ParentChanged() { + AZ::u32 refreshLevel = AZ::Edit::PropertyRefreshLevels::None; + + if (!m_parentEntityId.IsValid()) + { + // If Prefabs are enabled, reroute the invalid id to the level root + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + if (isPrefabSystemEnabled) + { + auto prefabPublicInterface = AZ::Interface::Get(); + + if (prefabPublicInterface) + { + m_parentEntityId = prefabPublicInterface->GetLevelInstanceContainerEntityId(); + refreshLevel = AZ::Edit::PropertyRefreshLevels::ValuesOnly; + } + } + } + auto parentId = m_parentEntityId; m_parentEntityId = m_previousParentEntityId; SetParent(parentId); - return AZ::Edit::PropertyRefreshLevels::None; + return refreshLevel; } AZ::u32 TransformComponent::TransformChanged() diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp index 2f2ca2d5a9..38e51b1e54 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp @@ -63,7 +63,12 @@ namespace AzToolsFramework void EditorEntityUiHandlerBase::PaintDescendantBackground(QPainter* /*painter*/, const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/, const QModelIndex& /*descendantIndex*/) const { - } + } + + void EditorEntityUiHandlerBase::PaintDescendantBranchBackground(QPainter* /*painter*/, const QTreeView* /*view*/, const QRect& /*rect*/, + const QModelIndex& /*index*/, const QModelIndex& /*descendantIndex*/) const + { + } void EditorEntityUiHandlerBase::PaintItemForeground(QPainter* /*painter*/, const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/) const { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h index 1b9ee18f8e..15701c7c21 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h @@ -20,6 +20,7 @@ #include class QPainter; +class QTreeView; namespace AzToolsFramework { @@ -50,6 +51,9 @@ namespace AzToolsFramework //! Paints the background of the descendants of the item in the Outliner. virtual void PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, const QModelIndex& descendantIndex) const; + //! Paints the background of the descendant branches of the item in the Outliner. + virtual void PaintDescendantBranchBackground(QPainter* painter, const QTreeView* view, const QRect& rect, + const QModelIndex& index, const QModelIndex& descendantIndex) const; //! Paints visual elements on the foreground of the item in the Outliner. virtual void PaintItemForeground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp index d9a1d8997f..053e9e50e0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp @@ -21,29 +21,17 @@ namespace AzToolsFramework { - const int LayerUiHandler::m_layerSquareSize = 20; - const int LayerUiHandler::m_layerStripeWidth = 1; - const int LayerUiHandler::m_layerDividerLineHeight = 1; - const int LayerUiHandler::m_lastEntityInLayerDividerLineHeight = 1; const QColor LayerUiHandler::m_layerBackgroundColor = QColor("#2F2F2F"); const QColor LayerUiHandler::m_layerDescendantBackgroundColor = QColor("#333333"); const QColor LayerUiHandler::m_layerBorderTopColor = QColor("#515151"); const QColor LayerUiHandler::m_layerBorderBottomColor = QColor("#252525"); - const QString LayerUiHandler::m_layerIconPath = QString(":/Icons/layer_icon.svg"); + const QString LayerUiHandler::m_layerIconPath = QString(":/Entity/layer.svg"); QString LayerUiHandler::GenerateItemInfoString(AZ::EntityId entityId) const { - QString result; - bool isLayerEntity = false; + AZ::Outcome layerBaseNameResult; AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( - isLayerEntity, - entityId, - &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer); - - if (!isLayerEntity) - { - return result; - } + layerBaseNameResult, entityId, &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerBaseFileName); bool hasUnsavedLayerChanges = false; AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( @@ -51,16 +39,28 @@ namespace AzToolsFramework entityId, &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasUnsavedChanges); + QString result = ""; + + if (layerBaseNameResult.IsSuccess()) + { + result += QString("(%1.layer").arg(layerBaseNameResult.GetValue().c_str()); + } + if (hasUnsavedLayerChanges) { - result = QObject::tr("*"); + result += QString("*"); } + if (layerBaseNameResult.IsSuccess()) + { + result += QString(")"); + } + + result += ""; + bool isLayerNameValid = false; AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( - isLayerNameValid, - entityId, - &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::IsLayerNameValid); + isLayerNameValid, entityId, &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::IsLayerNameValid); if (!isLayerNameValid) { @@ -75,22 +75,7 @@ namespace AzToolsFramework return QPixmap(m_layerIconPath); } - void LayerUiHandler::PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& /*index*/) const - { - QPainterPath backgroundPath; - backgroundPath.addRect(option.rect); - painter->fillPath(backgroundPath, m_layerBackgroundColor); - } - - void LayerUiHandler::PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& /*index*/, - const QModelIndex& /*descendantIndex*/) const - { - QPainterPath backgroundPath; - backgroundPath.addRect(option.rect); - painter->fillPath(backgroundPath, m_layerDescendantBackgroundColor); - } - - void LayerUiHandler::PaintItemForeground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const + void LayerUiHandler::PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { AZ::EntityId entityId(index.data(EntityOutlinerListModel::EntityIdRole).value()); @@ -99,11 +84,18 @@ namespace AzToolsFramework return; } + painter->save(); + painter->setRenderHint(QPainter::Antialiasing, false); + + // Dark Grey Background + QPainterPath backgroundPath; + backgroundPath.addRect(option.rect); + painter->fillPath(backgroundPath, m_layerBackgroundColor); + + // Left rect with the layer color QColor layerColor; AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( - layerColor, - entityId, - &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerColor); + layerColor, entityId, &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerColor); const QTreeView* outlinerTreeView(qobject_cast(option.widget)); int indentation = outlinerTreeView->indentation(); @@ -114,39 +106,31 @@ namespace AzToolsFramework if (isFirstColumn) { // Layer colored box - QPainterPath layerIconPath; + QPainterPath iconBackgroundPath; QPoint layerBoxOffset(0, (option.rect.height() - m_layerSquareSize) / 2); QRect layerIconRect(option.rect.topLeft() + layerBoxOffset, QSize(m_layerSquareSize, m_layerSquareSize)); - layerIconPath.addRect(layerIconRect); - painter->fillPath(layerIconPath, layerColor); + iconBackgroundPath.addRect(layerIconRect); + painter->fillPath(iconBackgroundPath, layerColor); // Left border PaintLayerStripeAndBorder( - painter, - option.rect.left(), - option.rect.top(), - option.rect.bottom(), - m_layerBorderBottomColor, - layerColor); + painter, option.rect.left() - 1, option.rect.top(), option.rect.bottom(), m_layerBorderBottomColor, layerColor); } QModelIndex nameColumn = index.sibling(index.row(), EntityOutlinerListModel::Column::ColumnName); QModelIndex sibling = index.sibling(index.row() + 1, index.column()); - painter->save(); - painter->setRenderHint(QPainter::Antialiasing, false); - QPoint lineBottomLeft(option.rect.bottomLeft()); QPoint lineTopLeft(option.rect.topLeft()); if (isFirstColumn) { - lineTopLeft.setX(lineTopLeft.x() + m_layerStripeWidth); + lineTopLeft.setX(lineTopLeft.x() + m_layerStripeWidth - 1); } QPen topLinePen(m_layerBorderTopColor, m_layerDividerLineHeight); painter->setPen(topLinePen); painter->drawLine(lineTopLeft, option.rect.topRight()); - + if (isFirstColumn) { lineBottomLeft.setX(lineBottomLeft.x()); @@ -156,11 +140,43 @@ namespace AzToolsFramework lineBottomLeft.setX(lineBottomLeft.x() + m_layerStripeWidth); } } - + QPen bottomLinePen(m_layerBorderBottomColor, m_layerDividerLineHeight); painter->setPen(bottomLinePen); painter->drawLine(lineBottomLeft, option.rect.bottomRight()); + + painter->restore(); + } + + void LayerUiHandler::PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& /*index*/, const QModelIndex& /*descendantIndex*/) const + { + QPainterPath backgroundPath; + backgroundPath.addRect(option.rect); + painter->fillPath(backgroundPath, m_layerDescendantBackgroundColor); + } + + void LayerUiHandler::PaintDescendantBranchBackground(QPainter* painter, const QTreeView* view, const QRect& rect, + const QModelIndex& index, const QModelIndex& /*descendantIndex*/) const + { + if (!painter) + { + return; + } + painter->save(); + painter->setRenderHint(QPainter::Antialiasing, false); + + QPainterPath backgroundPath; + + const int ancestorLeft = view->visualRect(index).left(); + + // Find the rect that extends fully to the left + QRect fullRect = rect; + fullRect.setLeft(ancestorLeft); + backgroundPath.addRect(fullRect); + + painter->fillPath(backgroundPath, m_layerDescendantBackgroundColor); painter->restore(); } @@ -182,7 +198,7 @@ namespace AzToolsFramework const QTreeView* outlinerTreeView(qobject_cast(option.widget)); bool isFirstColumn = descendantIndex.column() == EntityOutlinerListModel::ColumnName; bool isLastColumn = descendantIndex.column() == EntityOutlinerListModel::ColumnLockToggle; - int ancestorLeft = outlinerTreeView->visualRect(index).left(); + int ancestorLeft = outlinerTreeView->visualRect(index).left() - 1; // Draw the left stripe for this layer on the descendant's rect if (isFirstColumn) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h index 044deee2f6..0ccc137c4d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h @@ -32,7 +32,8 @@ namespace AzToolsFramework void PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; void PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, const QModelIndex& descendantIndex) const override; - void PaintItemForeground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; + void PaintDescendantBranchBackground(QPainter* painter, const QTreeView* view, const QRect& rect, + const QModelIndex& index, const QModelIndex& descendantIndex) const override; void PaintDescendantForeground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, const QModelIndex& descendantIndex) const override; @@ -43,12 +44,16 @@ namespace AzToolsFramework static QModelIndex GetLastVisibleChild(const QModelIndex& parent); static QModelIndex Internal_GetLastVisibleChild(const QAbstractItemModel* model, const QModelIndex& index); - static const int m_layerSquareSize; - static const int m_layerStripeWidth; - static const int m_layerDividerLineHeight; - static const int m_lastEntityInLayerDividerLineHeight; + static constexpr int m_layerSquareSize = 22; + static constexpr int m_layerStripeWidth = 1; + static constexpr int m_layerDividerLineHeight = 1; + static constexpr int m_lastEntityInLayerDividerLineHeight = 1; static const QColor m_layerBackgroundColor; + static const QColor m_layerBackgroundHoveredColor; + static const QColor m_layerBackgroundSelectedColor; static const QColor m_layerDescendantBackgroundColor; + static const QColor m_layerDescendantBackgroundHoveredColor; + static const QColor m_layerDescendantBackgroundSelectedColor; static const QColor m_layerBorderTopColor; static const QColor m_layerBorderBottomColor; static const QString m_layerIconPath; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss index 4617d13412..1ce3d4ef4f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss @@ -44,11 +44,11 @@ AzToolsFramework--EntityOutlinerCheckBox border: 0px solid transparent; border-radius: 0px; spacing: 0px; - padding: 0px; + padding: 0; + padding-right: 2px; line-height: 0px; font-size: 0px; margin: 0px; - background-color: transparent; max-height: 20px; max-width: 18px; } @@ -58,14 +58,15 @@ AzToolsFramework--EntityOutlinerCheckBox::indicator width: 16px; height: 16px; image-position:center; - border: 1px solid transparent; image: none; spacing: 0px; padding: 0px; line-height: 0px; font-size: 0px; - margin: 0; + margin: 3px 0 0 0; + max-width: 18px; + width: 18px; } AzToolsFramework--EntityOutlinerCheckBox#VisibilityMixed::indicator:checked @@ -83,7 +84,6 @@ AzToolsFramework--EntityOutlinerCheckBox#VisibilityMixed::indicator:checked { background: rgba(0, 0, 0, 80); border-radius: 5px; - padding-bottom: 1px; } @@ -99,6 +99,7 @@ AzToolsFramework--EntityOutlinerCheckBox#Visibility::indicator:unchecked , AzToolsFramework--EntityOutlinerCheckBox#VisibilityMixed::indicator:unchecked { image: url(:/visibility_on.svg); + margin-top: 3px; } AzToolsFramework--EntityOutlinerCheckBox#VisibilityOverridden::indicator:checked @@ -109,6 +110,7 @@ AzToolsFramework--EntityOutlinerCheckBox#VisibilityOverridden::indicator:checked AzToolsFramework--EntityOutlinerCheckBox#VisibilityOverridden::indicator:unchecked { image: url(:/visibility_on_transparent.svg); + margin-top: 3px; } AzToolsFramework--EntityOutlinerCheckBox#VisibilityHover::indicator:checked @@ -116,6 +118,7 @@ AzToolsFramework--EntityOutlinerCheckBox#VisibilityHover::indicator:checked , AzToolsFramework--EntityOutlinerCheckBox#VisibilityOverriddenHover::indicator:checked { image: url(:/visibility_default_hover.svg); + margin-top: 3px; } AzToolsFramework--EntityOutlinerCheckBox#VisibilityHover::indicator:unchecked @@ -123,6 +126,7 @@ AzToolsFramework--EntityOutlinerCheckBox#VisibilityHover::indicator:unchecked , AzToolsFramework--EntityOutlinerCheckBox#VisibilityOverriddenHover::indicator:unchecked { image: url(:/visibility_on_hover.svg); + margin-top: 3px; } @@ -132,6 +136,7 @@ AzToolsFramework--EntityOutlinerCheckBox#Lock::indicator:checked , AzToolsFramework--EntityOutlinerCheckBox#LockMixed::indicator:checked { image: url(:/lock_on.svg); + margin-top: 1px; } AzToolsFramework--EntityOutlinerCheckBox#Lock::indicator:unchecked @@ -148,6 +153,7 @@ AzToolsFramework--EntityOutlinerCheckBox#LockOverridden::indicator:checked AzToolsFramework--EntityOutlinerCheckBox#LockOverridden::indicator:unchecked { image: url(:/lock_default_transparent.svg); + margin-top: 1px; } AzToolsFramework--EntityOutlinerCheckBox#LockHover::indicator:checked @@ -155,6 +161,7 @@ AzToolsFramework--EntityOutlinerCheckBox#LockHover::indicator:checked , AzToolsFramework--EntityOutlinerCheckBox#LockOverriddenHover::indicator:checked { image: url(:/lock_on_hover.svg); + margin-top: 1px; } AzToolsFramework--EntityOutlinerCheckBox#LockHover::indicator:unchecked @@ -162,4 +169,5 @@ AzToolsFramework--EntityOutlinerCheckBox#LockHover::indicator:unchecked , AzToolsFramework--EntityOutlinerCheckBox#LockOverriddenHover::indicator:unchecked { image: url(:/lock_default_hover.svg); + margin-top: 1px; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp index 9a34c04148..7464136d7d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp @@ -1970,6 +1970,13 @@ namespace AzToolsFramework void EntityOutlinerItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { + // Customize option to prevent Qt from painting the default focus rectangle + QStyleOptionViewItem customOption{option}; + if (customOption.state & QStyle::State_HasFocus) + { + customOption.state ^= QStyle::State_HasFocus; + } + // Retrieve the Entity UI Handler AZ::EntityId entityId(index.data(EntityOutlinerListModel::EntityIdRole).value()); auto entityUiHandler = m_editorEntityFrameworkInterface->GetHandler(entityId); @@ -1977,6 +1984,9 @@ namespace AzToolsFramework const bool isSelected = (option.state & QStyle::State_Selected); const bool isHovered = (option.state & QStyle::State_MouseOver) && (option.state & QStyle::State_Enabled); + // Paint the Selection/Hover Rect + PaintSelectionHoverRect(painter, option, index, isSelected, isHovered); + // Paint Ancestor Backgrounds PaintAncestorBackgrounds(painter, option, index); @@ -1986,25 +1996,6 @@ namespace AzToolsFramework entityUiHandler->PaintItemBackground(painter, option, index); } - // Paint the Selection/Hover Rect - PaintSelectionHoverRect(painter, option, index, isSelected, isHovered); - - // Paint Ancestor Foregrounds - PaintAncestorForegrounds(painter, option, index); - - // Paint the Foreground - if (entityUiHandler != nullptr) - { - entityUiHandler->PaintItemForeground(painter, option, index); - } - - // Customize option to prevent Qt from painting the default focus rectangle - QStyleOptionViewItem customOption{ option }; - if (customOption.state & QStyle::State_HasFocus) - { - customOption.state ^= QStyle::State_HasFocus; - } - switch (index.column()) { case EntityOutlinerListModel::ColumnVisibilityToggle: @@ -2033,6 +2024,15 @@ namespace AzToolsFramework } break; } + + // Paint Ancestor Foregrounds + PaintAncestorForegrounds(painter, option, index); + + // Paint the Foreground + if (entityUiHandler != nullptr) + { + entityUiHandler->PaintItemForeground(painter, option, index); + } } void EntityOutlinerItemDelegate::PaintAncestorBackgrounds(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const @@ -2069,17 +2069,18 @@ namespace AzToolsFramework if (isSelected || isHovered) { - QPainterPath layerBGPath; - QRect layerBGRect(option.rect); - layerBGPath.addRect(layerBGRect); + QPainterPath backgroundPath; + QRect backgroundRect(option.rect); - QColor layerBG = m_hoverColor; + backgroundPath.addRect(backgroundRect); + + QColor backgroundColor = m_hoverColor; if (isSelected) { - layerBG = m_selectedColor; + backgroundColor = m_selectedColor; } - painter->fillPath(layerBGPath, layerBG); + painter->fillPath(backgroundPath, backgroundColor); } painter->restore(); @@ -2212,13 +2213,9 @@ namespace AzToolsFramework textWidthAvailable -= fontMetrics.horizontalAdvance(QObject::tr("...")); if (!infoString.isEmpty()) { - // The info string includes HTML markup, which can cause an issue computing the width. - // The markup on the text is light (just color, italic or bold), so an approximate width - // is computed by taking the width of the non-HTML portion of the string and padding it a bit. QString htmlStripped = infoString; htmlStripped.remove(htmlMarkupRegex); - const float layerInfoPadding = 1.2f; - textWidthAvailable -= fontMetrics.horizontalAdvance(htmlStripped) * layerInfoPadding; + textWidthAvailable -= fontMetrics.horizontalAdvance(htmlStripped) + 5; } entityNameRichText = fontMetrics.elidedText(optionV4.text, Qt::TextElideMode::ElideRight, textWidthAvailable); @@ -2226,7 +2223,12 @@ namespace AzToolsFramework if (!infoString.isEmpty()) { - entityNameRichText = QObject::tr("%1%2").arg(entityNameRichText).arg(infoString); + entityNameRichText = QString("") + + QString("
") + + QString(entityNameRichText) + + QString("") + + QString(infoString) + + QString("
"); } // delete the text from the item so we can use the standard painter to draw the icon @@ -2238,7 +2240,7 @@ namespace AzToolsFramework textDoc.setDefaultFont(optionV4.font); textDoc.setDefaultStyleSheet("body {color: white}"); textDoc.setHtml("" + entityNameRichText + ""); - painter->translate(textRect.topLeft() + QPoint(0, -1)); + painter->translate(textRect.topLeft()); textDoc.setTextWidth(textRect.width()); textDoc.drawContents(painter, QRectF(0, 0, textRect.width(), textRect.height())); @@ -2246,7 +2248,7 @@ namespace AzToolsFramework EntityOutlinerListModel::s_paintingName = false; } - QSize EntityOutlinerItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const + QSize EntityOutlinerItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& /*index*/) const { // Get the height of a tall character... // we do this only once per 'tick' @@ -2262,14 +2264,7 @@ namespace AzToolsFramework QTimer::singleShot(0, resetFunction); } - QSize sh = QSize(0, m_cachedBoundingRectOfTallCharacter.height() + EntityOutlinerListModel::s_OutlinerSpacing); - - if (index.column() == EntityOutlinerListModel::ColumnVisibilityToggle || index.column() == EntityOutlinerListModel::ColumnLockToggle) - { - sh.setWidth(m_toggleColumnWidth); - } - - return sh; + return QSize(0, m_cachedBoundingRectOfTallCharacter.height() + EntityOutlinerListModel::s_OutlinerSpacing); } bool EntityOutlinerItemDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx index a5e6ab5051..d706b1cd96 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx @@ -107,7 +107,7 @@ namespace AzToolsFramework }; // Spacing is appropriate and matches the outliner concept work from the UI team. - static const int s_OutlinerSpacing = 5; + static const int s_OutlinerSpacing = 7; static bool s_paintingName; @@ -358,8 +358,6 @@ namespace AzToolsFramework mutable CheckboxGroup m_visibilityCheckBoxes; mutable CheckboxGroup m_lockCheckBoxes; - const int m_toggleColumnWidth = 16; - // this is a cache, and is hence mutable mutable QRect m_cachedBoundingRectOfTallCharacter; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp index eba0bb030c..19d8b3e8b0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp @@ -183,8 +183,6 @@ namespace AzToolsFramework // Paint the branch background as defined by the entity's handler, or its closes ancestor's. PaintBranchBackground(painter, rect, index); - // Make sure the base class is called after the layer rect is drawn, - // so that the foldout arrow draws on top of the layer color. QTreeView::drawBranches(painter, rect, index); } @@ -209,12 +207,7 @@ namespace AzToolsFramework if (ancestorUiHandler != nullptr) { - int ancestorLeft = visualRect(ancestorIndex).left(); - QStyleOptionViewItem option; - option.rect = rect; - option.rect.setLeft(ancestorLeft); - - ancestorUiHandler->PaintDescendantBackground(painter, option, ancestorIndex, index); + ancestorUiHandler->PaintDescendantBranchBackground(painter, this, rect, ancestorIndex, index); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp index 9bbd719cf3..ad16423143 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp @@ -171,7 +171,7 @@ namespace AzToolsFramework const int autoExpandDelayMilliseconds = 2500; m_gui->m_objectTree->setSelectionMode(QAbstractItemView::ExtendedSelection); - m_gui->m_objectTree->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed); + m_gui->m_objectTree->setEditTriggers(QAbstractItemView::EditKeyPressed); m_gui->m_objectTree->setAutoExpandDelay(autoExpandDelayMilliseconds); m_gui->m_objectTree->setDragEnabled(true); m_gui->m_objectTree->setDropIndicatorShown(true); @@ -179,9 +179,11 @@ namespace AzToolsFramework m_gui->m_objectTree->setDragDropOverwriteMode(false); m_gui->m_objectTree->setDragDropMode(QAbstractItemView::DragDrop); m_gui->m_objectTree->setDefaultDropAction(Qt::CopyAction); + m_gui->m_objectTree->setExpandsOnDoubleClick(false); m_gui->m_objectTree->setContextMenuPolicy(Qt::CustomContextMenu); m_gui->m_objectTree->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_gui->m_objectTree->setAutoScrollMargin(20); + m_gui->m_objectTree->setIndentation(24); connect(m_gui->m_objectTree, &QTreeView::customContextMenuRequested, this, &EntityOutlinerWidget::OnOpenTreeContextMenu); // custom item delegate @@ -193,6 +195,7 @@ namespace AzToolsFramework // Link up signals for informing the model of tree changes using the proxy as an intermediary connect(m_gui->m_objectTree, &QTreeView::clicked, this, &EntityOutlinerWidget::OnTreeItemClicked); + connect(m_gui->m_objectTree, &QTreeView::doubleClicked, this, &EntityOutlinerWidget::OnTreeItemDoubleClicked); connect(m_gui->m_objectTree, &QTreeView::expanded, this, &EntityOutlinerWidget::OnTreeItemExpanded); connect(m_gui->m_objectTree, &QTreeView::collapsed, this, &EntityOutlinerWidget::OnTreeItemCollapsed); connect(m_gui->m_objectTree, &EntityOutlinerTreeView::ItemDropped, this, &EntityOutlinerWidget::OnDropEvent); @@ -223,8 +226,12 @@ namespace AzToolsFramework m_gui->m_objectTree->header()->setStretchLastSection(false); // resize the icon columns so that the Visibility and Lock toggle icon columns stay right-justified + m_gui->m_objectTree->header()->setStretchLastSection(false); + m_gui->m_objectTree->header()->setMinimumSectionSize(0); m_gui->m_objectTree->header()->setSectionResizeMode(EntityOutlinerListModel::ColumnName, QHeaderView::Stretch); - m_gui->m_objectTree->header()->setSectionResizeMode(EntityOutlinerListModel::ColumnVisibilityToggle, QHeaderView::ResizeToContents); + m_gui->m_objectTree->header()->setSectionResizeMode(EntityOutlinerListModel::ColumnVisibilityToggle, QHeaderView::Fixed); + m_gui->m_objectTree->header()->resizeSection(EntityOutlinerListModel::ColumnVisibilityToggle, 20); + m_gui->m_objectTree->header()->setSectionResizeMode(EntityOutlinerListModel::ColumnLockToggle, QHeaderView::Fixed); m_gui->m_objectTree->header()->resizeSection(EntityOutlinerListModel::ColumnLockToggle, 24); connect(m_gui->m_objectTree->selectionModel(), @@ -271,10 +278,12 @@ namespace AzToolsFramework ComponentModeFramework::EditorComponentModeNotificationBus::Handler::BusConnect( GetEntityContextId()); EditorEntityInfoNotificationBus::Handler::BusConnect(); + AZ::Interface::Register(this); } EntityOutlinerWidget::~EntityOutlinerWidget() { + AZ::Interface::Unregister(this); ComponentModeFramework::EditorComponentModeNotificationBus::Handler::BusDisconnect(); EditorEntityInfoNotificationBus::Handler::BusDisconnect(); EditorPickModeNotificationBus::Handler::BusDisconnect(); @@ -798,6 +807,8 @@ namespace AzToolsFramework #ifdef Q_OS_MAC // "Alt+Return" translates to Option+Return on macOS m_actionToRenameSelection->setShortcut(tr("Alt+Return")); +#elseif Q_OS_WIN + m_actionToRenameSelection->setShortcut(tr("F2")); #endif m_actionToRenameSelection->setShortcutContext(Qt::WidgetWithChildrenShortcut); connect(m_actionToRenameSelection, &QAction::triggered, this, &EntityOutlinerWidget::DoRenameSelection); @@ -860,6 +871,10 @@ namespace AzToolsFramework } } + void EntityOutlinerWidget::OnTreeItemDoubleClicked(const QModelIndex& /*index*/) + { + } + void EntityOutlinerWidget::OnTreeItemExpanded(const QModelIndex& index) { m_listModel->OnEntityExpanded(GetEntityIdFromIndex(index)); @@ -1075,6 +1090,30 @@ namespace AzToolsFramework SetEntityOutlinerState(m_gui, true); } + void EntityOutlinerWidget::SetRootEntity(AZ::EntityId rootEntityId) + { + // The proxy model needs a tick to initialize, else it will return an invalid index in mapFromSource. + QTimer::singleShot(0, this, [rootEntityId, this]() { + QModelIndex rootIndex = m_listModel->GetIndexFromEntity(rootEntityId); + QModelIndex proxyIndex = m_proxyModel->mapFromSource(rootIndex); + m_gui->m_objectTree->setRootIndex(proxyIndex); + }); + } + + void EntityOutlinerWidget::SetUpdatesEnabled(bool enable) + { + if (enable) + { + QTimer::singleShot(1, this, [this]() { + m_gui->m_objectTree->setUpdatesEnabled(true); + }); + } + else + { + m_gui->m_objectTree->setUpdatesEnabled(false); + } + } + void EntityOutlinerWidget::OnEntityInfoUpdatedAddChildEnd(AZ::EntityId /*parentId*/, AZ::EntityId childId) { QueueContentUpdateSort(childId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx index fa6b6c7091..14047ff9b4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx @@ -21,8 +21,9 @@ #include #include #include -#include #include +#include +#include #include #include @@ -60,12 +61,13 @@ namespace AzToolsFramework , private EditorEntityContextNotificationBus::Handler , private EditorEntityInfoNotificationBus::Handler , private ComponentModeFramework::EditorComponentModeNotificationBus::Handler + , private EntityOutlinerWidgetInterface { Q_OBJECT; public: AZ_CLASS_ALLOCATOR(EntityOutlinerWidget, AZ::SystemAllocator, 0) - EntityOutlinerWidget(QWidget* pParent = NULL, Qt::WindowFlags flags = Qt::WindowFlags()); + explicit EntityOutlinerWidget(QWidget* pParent = NULL, Qt::WindowFlags flags = Qt::WindowFlags()); virtual ~EntityOutlinerWidget(); private Q_SLOTS: @@ -103,6 +105,10 @@ namespace AzToolsFramework void EnteredComponentMode(const AZStd::vector& componentModeTypes) override; void LeftComponentMode(const AZStd::vector& componentModeTypes) override; + // EntityOutlinerWidgetInterface + void SetRootEntity(AZ::EntityId rootEntityId) override; + void SetUpdatesEnabled(bool enable) override; + // Build a selection object from the given entities. Entities already in the Widget's selection buffers are ignored. template QItemSelection BuildSelectionFromEntities(const EntityIdCollection& entityIds); @@ -138,6 +144,7 @@ namespace AzToolsFramework QAction* m_actionGoToEntitiesInViewport; void OnTreeItemClicked(const QModelIndex& index); + void OnTreeItemDoubleClicked(const QModelIndex& index); void OnTreeItemExpanded(const QModelIndex& index); void OnTreeItemCollapsed(const QModelIndex& index); void OnExpandEntity(const AZ::EntityId& entityId, bool expand); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidgetInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidgetInterface.h new file mode 100644 index 0000000000..7b8ad990a1 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidgetInterface.h @@ -0,0 +1,30 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include + +namespace AzToolsFramework +{ + class EntityOutlinerWidgetInterface + { + public: + AZ_RTTI(EntityOutlinerWidgetInterface, "{30C0F252-EC84-4196-BF59-EB9E73B8ADCB}"); + + virtual void SetRootEntity(AZ::EntityId rootEntityId) = 0; + virtual void SetUpdatesEnabled(bool enable) = 0; + }; + +} // namespace AzToolsFramework + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationBus.h new file mode 100644 index 0000000000..3a095b796e --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationBus.h @@ -0,0 +1,35 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace AzToolsFramework +{ + namespace Prefab + { + class PrefabInstanceContainerNotifications + : public AZ::EBusTraits + { + public: + virtual ~PrefabInstanceContainerNotifications() = default; + + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + + virtual void OnPrefabComponentActivate(AZ::EntityId entityId) = 0; + virtual void OnPrefabComponentDeactivate(AZ::EntityId entityId) = 0; + }; + using PrefabInstanceContainerNotificationBus = AZ::EBus; + } +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h new file mode 100644 index 0000000000..90a50f40d8 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h @@ -0,0 +1,39 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include + +namespace AzToolsFramework +{ + namespace Prefab + { + class PrefabIntegrationInterface + { + public: + AZ_RTTI(PrefabIntegrationInterface, "{B88AE045-7711-49BC-8336-45003D1C9116}"); + + /** + * Create a new entity at the position provided. + * @param position The position the new entity will be created at. + * @param parentId The id of the parent of the newly created entity. + * @return The id of the newly created entity. + */ + virtual AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) = 0; + }; + + } // namespace Prefab +} // namespace AzToolsFramework + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index 129e7d7fce..f945bc7039 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -24,6 +25,8 @@ #include #include #include +#include +#include #include #include @@ -36,6 +39,7 @@ namespace AzToolsFramework { namespace Prefab { + EditorEntityUiInterface* PrefabIntegrationManager::s_editorEntityUiInterface = nullptr; PrefabPublicInterface* PrefabIntegrationManager::s_prefabPublicInterface = nullptr; PrefabEditInterface* PrefabIntegrationManager::s_prefabEditInterface = nullptr; const AZStd::string PrefabIntegrationManager::s_prefabFileExtension = ".prefab"; @@ -54,8 +58,14 @@ namespace AzToolsFramework PrefabIntegrationManager::PrefabIntegrationManager() { - s_prefabPublicInterface = AZ::Interface::Get(); + s_editorEntityUiInterface = AZ::Interface::Get(); + if (s_editorEntityUiInterface == nullptr) + { + AZ_Assert(false, "Prefab - could not get EditorEntityUiInterface on PrefabIntegrationManager construction."); + return; + } + s_prefabPublicInterface = AZ::Interface::Get(); if (s_prefabPublicInterface == nullptr) { AZ_Assert(false, "Prefab - could not get PrefabPublicInterface on PrefabIntegrationManager construction."); @@ -63,7 +73,6 @@ namespace AzToolsFramework } s_prefabEditInterface = AZ::Interface::Get(); - if (s_prefabEditInterface == nullptr) { AZ_Assert(false, "Prefab - could not get PrefabEditInterface on PrefabIntegrationManager construction."); @@ -71,12 +80,32 @@ namespace AzToolsFramework } EditorContextMenuBus::Handler::BusConnect(); - AssetBrowser::AssetBrowserSourceDropBus::Handler::BusConnect(s_prefabFileExtension); + PrefabInstanceContainerNotificationBus::Handler::BusConnect(); + AZ::Interface::Register(this); + + bool prefabWipFeaturesEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled); + + if (prefabWipFeaturesEnabled) + { + AssetBrowser::AssetBrowserSourceDropBus::Handler::BusConnect(s_prefabFileExtension); + } } PrefabIntegrationManager::~PrefabIntegrationManager() { - AssetBrowser::AssetBrowserSourceDropBus::Handler::BusDisconnect(); + bool prefabWipFeaturesEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled); + + if (prefabWipFeaturesEnabled) + { + AssetBrowser::AssetBrowserSourceDropBus::Handler::BusDisconnect(); + } + + AZ::Interface::Unregister(this); + PrefabInstanceContainerNotificationBus::Handler::BusDisconnect(); EditorContextMenuBus::Handler::BusDisconnect(); } @@ -97,57 +126,65 @@ namespace AzToolsFramework void PrefabIntegrationManager::PopulateEditorGlobalContextMenu(QMenu* menu) const { - // Create Prefab + bool prefabWipFeaturesEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled); + + if (prefabWipFeaturesEnabled) { - AzToolsFramework::EntityIdList selectedEntities; - AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(selectedEntities, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntities); - - if (!selectedEntities.empty()) + // Create Prefab { - bool layerInSelection = false; + AzToolsFramework::EntityIdList selectedEntities; + AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult( + selectedEntities, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntities); - for (AZ::EntityId entityId : selectedEntities) + if (!selectedEntities.empty()) { - if (!layerInSelection) - { - AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( - layerInSelection, - entityId, - &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer); + bool layerInSelection = false; - if (layerInSelection) + for (AZ::EntityId entityId : selectedEntities) + { + if (!layerInSelection) { - break; + AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( + layerInSelection, entityId, + &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer); + + if (layerInSelection) + { + break; + } } } - } - // Layers can't be in prefabs. - if (!layerInSelection) - { - QAction* createAction = menu->addAction(QObject::tr("Create Prefab...")); - createAction->setToolTip(QObject::tr("Creates a prefab out of the currently selected entities.")); + // Layers can't be in prefabs. + if (!layerInSelection) + { + QAction* createAction = menu->addAction(QObject::tr("Create Prefab...")); + createAction->setToolTip(QObject::tr("Creates a prefab out of the currently selected entities.")); - QObject::connect(createAction, &QAction::triggered, createAction, [this, selectedEntities] { - ContextMenu_CreatePrefab(selectedEntities); - }); + QObject::connect(createAction, &QAction::triggered, createAction, [this, selectedEntities] { + ContextMenu_CreatePrefab(selectedEntities); + }); + } } } - } - // Instantiate Prefab - { - QAction* instantiateAction = menu->addAction(QObject::tr("Instantiate Prefab...")); - instantiateAction->setToolTip(QObject::tr("Instantiates a prefab file in the scene.")); + // Instantiate Prefab + { + QAction* instantiateAction = menu->addAction(QObject::tr("Instantiate Prefab...")); + instantiateAction->setToolTip(QObject::tr("Instantiates a prefab file in the scene.")); - QObject::connect(instantiateAction, &QAction::triggered, instantiateAction, [this] { - ContextMenu_InstantiatePrefab(); - }); + QObject::connect( + instantiateAction, &QAction::triggered, instantiateAction, [this] { ContextMenu_InstantiatePrefab(); }); + } + + menu->addSeparator(); } - menu->addSeparator(); + bool itemWasShown = false; - // Edit Prefab + // Edit/Save Prefab { AzToolsFramework::EntityIdList selectedEntities; AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult( @@ -159,17 +196,47 @@ namespace AzToolsFramework if (s_prefabPublicInterface->IsInstanceContainerEntity(selectedEntity)) { - QAction* editAction = menu->addAction(QObject::tr("Edit Prefab")); - editAction->setToolTip(QObject::tr("Edit the prefab in focus mode.")); + // Edit Prefab + if (prefabWipFeaturesEnabled) + { + bool beingEdited = s_prefabEditInterface->IsOwningPrefabBeingEdited(selectedEntity); - QObject::connect(editAction, &QAction::triggered, editAction, [this, selectedEntity] { - ContextMenu_EditPrefab(selectedEntity); - }); + if (!beingEdited) + { + QAction* editAction = menu->addAction(QObject::tr("Edit Prefab")); + editAction->setToolTip(QObject::tr("Edit the prefab in focus mode.")); + + QObject::connect(editAction, &QAction::triggered, editAction, [this, selectedEntity] { + ContextMenu_EditPrefab(selectedEntity); + }); + + itemWasShown = true; + } + } + + // Save Prefab + AZ::IO::Path prefabFilePath = s_prefabPublicInterface->GetOwningInstancePrefabPath(selectedEntity); + auto dirtyOutcome = s_prefabPublicInterface->HasUnsavedChanges(prefabFilePath); + + if (dirtyOutcome.IsSuccess() && dirtyOutcome.GetValue() == true) + { + QAction* saveAction = menu->addAction(QObject::tr("Save Prefab to file")); + saveAction->setToolTip(QObject::tr("Save the changes to the prefab to disk.")); + + QObject::connect(saveAction, &QAction::triggered, saveAction, [this, selectedEntity] { + ContextMenu_SavePrefab(selectedEntity); + }); + + itemWasShown = true; + } } } } - menu->addSeparator(); + if (itemWasShown) + { + menu->addSeparator(); + } } void PrefabIntegrationManager::HandleSourceFileType(AZStd::string_view sourceFilePath, AZ::EntityId parentId, AZ::Vector3 position) const @@ -289,7 +356,18 @@ namespace AzToolsFramework { s_prefabEditInterface->EditOwningPrefab(containerEntity); } - + + void PrefabIntegrationManager::ContextMenu_SavePrefab(AZ::EntityId containerEntity) + { + auto prefabPath = s_prefabPublicInterface->GetOwningInstancePrefabPath(containerEntity); + + auto savePrefabOutcome = s_prefabPublicInterface->SavePrefab(prefabPath); + + if (!savePrefabOutcome.IsSuccess()) + { + WarnUserOfError("Prefab Save Error", savePrefabOutcome.GetError()); + } + } void PrefabIntegrationManager::GenerateSuggestedFilenameFromEntities(const EntityIdList& entityIds, AZStd::string& outName) { @@ -891,5 +969,30 @@ namespace AzToolsFramework } return true; } + + void PrefabIntegrationManager::OnPrefabComponentActivate(AZ::EntityId entityId) + { + s_editorEntityUiInterface->RegisterEntity(entityId, m_prefabUiHandler.GetHandlerId()); + } + + void PrefabIntegrationManager::OnPrefabComponentDeactivate(AZ::EntityId entityId) + { + s_editorEntityUiInterface->UnregisterEntity(entityId); + } + + AZ::EntityId PrefabIntegrationManager::CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) + { + Prefab::PrefabPublicInterface* prefabPublicInterface = AZ::Interface::Get(); + auto createResult = prefabPublicInterface->CreateEntity(parentId, position); + if (createResult.IsSuccess()) + { + return createResult.GetValue(); + } + else + { + WarnUserOfError("Entity Creation Error", createResult.GetError()); + return AZ::EntityId(); + } + } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h index e2f7288895..cf844c7f54 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include namespace AzToolsFramework @@ -45,6 +47,8 @@ namespace AzToolsFramework class PrefabIntegrationManager final : public EditorContextMenuBus::Handler , public AssetBrowser::AssetBrowserSourceDropBus::Handler + , public PrefabInstanceContainerNotificationBus::Handler + , public PrefabIntegrationInterface { public: AZ_CLASS_ALLOCATOR(PrefabIntegrationManager, AZ::SystemAllocator, 0); @@ -62,6 +66,13 @@ namespace AzToolsFramework // EntityOutlinerSourceDropHandlingBus... void HandleSourceFileType(AZStd::string_view sourceFilePath, AZ::EntityId parentId, AZ::Vector3 position) const override; + // PrefabInstanceContainerNotificationBus... + void OnPrefabComponentActivate(AZ::EntityId entityId) override; + void OnPrefabComponentDeactivate(AZ::EntityId entityId) override; + + // PrefabIntegrationInterface... + AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) override; + private: // Manages the Edit Mode UI for prefabs PrefabEditManager m_prefabEditManager; @@ -73,6 +84,7 @@ namespace AzToolsFramework static void ContextMenu_CreatePrefab(AzToolsFramework::EntityIdList selectedEntities); static void ContextMenu_InstantiatePrefab(); static void ContextMenu_EditPrefab(AZ::EntityId containerEntity); + static void ContextMenu_SavePrefab(AZ::EntityId containerEntity); // Prompt and resolve dialogs static bool QueryUserForPrefabSaveLocation( @@ -109,6 +121,7 @@ namespace AzToolsFramework static const AZStd::string s_prefabFileExtension; + static EditorEntityUiInterface* s_editorEntityUiInterface; static PrefabPublicInterface* s_prefabPublicInterface; static PrefabEditInterface* s_prefabEditInterface; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp index 1f393709e3..79ab9e0d82 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp @@ -12,6 +12,8 @@ #include +#include +#include #include #include @@ -23,6 +25,8 @@ namespace AzToolsFramework { const QColor PrefabUiHandler::m_prefabCapsuleColor = QColor("#1E252F"); const QColor PrefabUiHandler::m_prefabCapsuleEditColor = QColor("#4A90E2"); + const QString PrefabUiHandler::m_prefabIconPath = QString(":/Entity/prefab.svg"); + const QString PrefabUiHandler::m_prefabEditIconPath = QString(":/Entity/prefab_edit.svg"); PrefabUiHandler::PrefabUiHandler() { @@ -33,6 +37,62 @@ namespace AzToolsFramework AZ_Assert(false, "PrefabUiHandler - could not get PrefabEditInterface on PrefabUiHandler construction."); return; } + + m_prefabPublicInterface = AZ::Interface::Get(); + + if (m_prefabPublicInterface == nullptr) + { + AZ_Assert(false, "PrefabUiHandler - could not get PrefabPublicInterface on PrefabUiHandler construction."); + return; + } + } + + QString PrefabUiHandler::GenerateItemInfoString(AZ::EntityId entityId) const + { + QString infoString; + + AZ::IO::Path path = m_prefabPublicInterface->GetOwningInstancePrefabPath(entityId); + + if (!path.empty()) + { + QString saveFlag = ""; + auto dirtyOutcome = m_prefabPublicInterface->HasUnsavedChanges(path); + + if (dirtyOutcome.IsSuccess() && dirtyOutcome.GetValue() == true) + { + saveFlag = "*"; + } + + infoString = QObject::tr("(%1%2)") + .arg(path.Filename().Native().data()) + .arg(saveFlag); + } + + return infoString; + } + + QString PrefabUiHandler::GenerateItemTooltip(AZ::EntityId entityId) const + { + QString tooltip; + + AZ::IO::Path path = m_prefabPublicInterface->GetOwningInstancePrefabPath(entityId); + + if (!path.empty()) + { + tooltip = QObject::tr("%1").arg(path.Native().data()); + } + + return tooltip; + } + + QPixmap PrefabUiHandler::GenerateItemIcon(AZ::EntityId entityId) const + { + if (m_prefabEditInterface->IsOwningPrefabBeingEdited(entityId)) + { + return QPixmap(m_prefabEditIconPath); + } + + return QPixmap(m_prefabIconPath); } void PrefabUiHandler::PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const @@ -57,40 +117,61 @@ namespace AzToolsFramework QPainterPath backgroundPath; backgroundPath.setFillRule(Qt::WindingFill); + QRect tempRect = option.rect; + tempRect.setTop(tempRect.top() + 1); + + if (!hasVisibleChildren) + { + tempRect.setBottom(tempRect.bottom() - 1); + } + + if (isFirstColumn) + { + tempRect.setLeft(tempRect.left() - 1); + } + + if (isLastColumn) + { + tempRect.setWidth(tempRect.width() - 1); + } + if (isFirstColumn || isLastColumn) { // Rounded rect to have rounded borders on top - backgroundPath.addRoundedRect(option.rect, m_prefabCapsuleRadius, m_prefabCapsuleRadius); + backgroundPath.addRoundedRect(tempRect, m_prefabCapsuleRadius, m_prefabCapsuleRadius); if (hasVisibleChildren) { // Regular rect, half height, to square the bottom borders - QRect bottomRect = option.rect; + QRect bottomRect = tempRect; bottomRect.setTop(bottomRect.top() + (bottomRect.height() / 2)); backgroundPath.addRect(bottomRect); } // Regular rect, half height, to square the opposite border - QRect squareRect = option.rect; + QRect squareRect = tempRect; if (isFirstColumn) { - squareRect.setLeft(option.rect.left() + (option.rect.width() / 2)); + squareRect.setLeft(tempRect.left() + (tempRect.width() / 2)); } else if (isLastColumn) { - squareRect.setWidth(option.rect.width() / 2); + squareRect.setWidth(tempRect.width() / 2); } backgroundPath.addRect(squareRect); } else { - backgroundPath.addRect(option.rect); + backgroundPath.addRect(tempRect); } + painter->save(); + painter->setRenderHint(QPainter::Antialiasing, true); painter->fillPath(backgroundPath.simplified(), backgroundColor); + painter->restore(); } - void PrefabUiHandler::PaintDescendantForeground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, + void PrefabUiHandler::PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, const QModelIndex& descendantIndex) const { if (!painter) @@ -100,8 +181,15 @@ namespace AzToolsFramework } AZ::EntityId entityId(index.data(EntityOutlinerListModel::EntityIdRole).value()); + + // We hide the root instance container entity from the Outliner, so avoid drawing its full container on children + if (m_prefabPublicInterface->IsLevelInstanceContainerEntity(entityId)) + { + return; + } + const QTreeView* outlinerTreeView(qobject_cast(option.widget)); - const int ancestorLeft = outlinerTreeView->visualRect(index).left() + (m_prefabBorderThickness / 2); + const int ancestorLeft = outlinerTreeView->visualRect(index).left() + (m_prefabBorderThickness / 2) - 1; const int curveRectSize = m_prefabCapsuleRadius * 2; const bool isFirstColumn = descendantIndex.column() == EntityOutlinerListModel::ColumnName; const bool isLastColumn = descendantIndex.column() == EntityOutlinerListModel::ColumnLockToggle; @@ -117,12 +205,17 @@ namespace AzToolsFramework // Find the rect that extends fully to the left QRect fullRect = option.rect; fullRect.setLeft(ancestorLeft); + if (isLastColumn) + { + fullRect.setWidth(fullRect.width() - 1); + } + // Adjust option.rect to account for the border thickness QRect rect = option.rect; rect.setLeft(rect.left() + (m_prefabBorderThickness / 2)); painter->save(); - painter->setRenderHint(QPainter::Antialiasing, false); + painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(borderLinePen); if (IsLastVisibleChild(index, descendantIndex)) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h index 6417b56c6b..0094dabc35 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h @@ -13,10 +13,15 @@ #pragma once #include -#include namespace AzToolsFramework { + namespace Prefab + { + class PrefabEditInterface; + class PrefabPublicInterface; + }; + class PrefabUiHandler : public EditorEntityUiHandlerBase { @@ -28,11 +33,17 @@ namespace AzToolsFramework ~PrefabUiHandler() override = default; // EditorEntityUiHandler... + QString GenerateItemInfoString(AZ::EntityId entityId) const override; + QString GenerateItemTooltip(AZ::EntityId entityId) const override; + QPixmap GenerateItemIcon(AZ::EntityId entityId) const override; void PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; - void PaintDescendantForeground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, + void PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, const QModelIndex& descendantIndex) const override; private: + Prefab::PrefabEditInterface* m_prefabEditInterface = nullptr; + Prefab::PrefabPublicInterface* m_prefabPublicInterface = nullptr; + static bool IsLastVisibleChild(const QModelIndex& parent, const QModelIndex& child); static QModelIndex GetLastVisibleChild(const QModelIndex& parent); static QModelIndex Internal_GetLastVisibleChild(const QAbstractItemModel* model, const QModelIndex& index); @@ -41,7 +52,7 @@ namespace AzToolsFramework static constexpr int m_prefabBorderThickness = 2; static const QColor m_prefabCapsuleColor; static const QColor m_prefabCapsuleEditColor; - - Prefab::PrefabEditInterface* m_prefabEditInterface = nullptr; + static const QString m_prefabIconPath; + static const QString m_prefabEditIconPath; }; } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp index b41addf4a7..ec3a4addf2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp @@ -31,6 +31,7 @@ AZ_POP_DISABLE_WARNING #include #include +#include #include #include #include @@ -47,6 +48,7 @@ AZ_POP_DISABLE_WARNING #include #include #include +#include #include #include #include @@ -331,8 +333,14 @@ namespace AzToolsFramework m_gui->m_entitySearchBox->setContextMenuPolicy(Qt::CustomContextMenu); AzQtComponents::LineEdit::applySearchStyle(m_gui->m_entitySearchBox); - QStandardItemModel*model = new QStandardItemModel(3, 1); - for (int row = 0; row < 3; ++row) + AzFramework::ApplicationRequests::Bus::BroadcastResult( + m_prefabsAreEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + m_itemNames = + m_prefabsAreEnabled ? QStringList{"Universal", "Editor only"} : QStringList{"Start active", "Start inactive", "Editor only"}; + int itemNameCount = m_itemNames.size(); + QStandardItemModel* model = new QStandardItemModel(itemNameCount, 1); + for (int row = 0; row < itemNameCount; ++row) { m_comboItems[row] = new QStandardItem(m_itemNames[row]); m_comboItems[row]->setCheckable(true); @@ -397,6 +405,8 @@ namespace AzToolsFramework CreateActions(); UpdateContents(); + m_prefabPublicInterface = AZ::Interface::Get(); + EditorEntityContextNotificationBus::Handler::BusConnect(); //forced to register global event filter with application for selection @@ -741,26 +751,42 @@ namespace AzToolsFramework isLayerEntity, selectedEntityId, &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer); + + bool isPrefabEntity = (m_prefabPublicInterface) ? m_prefabPublicInterface->IsInstanceContainerEntity(selectedEntityId) : false; + if (isLayerEntity) { if (result == SelectionEntityTypeInfo::None) { result = SelectionEntityTypeInfo::OnlyLayerEntities; } - else if(result == SelectionEntityTypeInfo::OnlyStandardEntities) + else if (result == SelectionEntityTypeInfo::OnlyStandardEntities) { result = SelectionEntityTypeInfo::Mixed; // An entity of both layer and non-layer type have been found, so break out of the loop. break; } } + else if (isPrefabEntity) + { + if (result == SelectionEntityTypeInfo::None) + { + result = SelectionEntityTypeInfo::OnlyPrefabEntities; + } + else if (result == SelectionEntityTypeInfo::OnlyStandardEntities) + { + result = SelectionEntityTypeInfo::Mixed; + // An entity of both prefab and non-prefab type have been found, so break out of the loop. + break; + } + } else { if (result == SelectionEntityTypeInfo::None) { result = SelectionEntityTypeInfo::OnlyStandardEntities; } - else if (result == SelectionEntityTypeInfo::OnlyLayerEntities) + else if (result == SelectionEntityTypeInfo::OnlyLayerEntities || result == SelectionEntityTypeInfo::OnlyPrefabEntities) { result = SelectionEntityTypeInfo::Mixed; // An entity of both layer and non-layer type have been found, so break out of the loop. @@ -857,7 +883,7 @@ namespace AzToolsFramework entityDetailsVisible = true; entityDetailsLabelText = GetEntityDetailsLabelText(); } - else if (selectionEntityTypeInfo == SelectionEntityTypeInfo::OnlyLayerEntities) + else if (selectionEntityTypeInfo == SelectionEntityTypeInfo::OnlyLayerEntities || selectionEntityTypeInfo == SelectionEntityTypeInfo::OnlyPrefabEntities) { // If a customer filter is not already in use, only show layer components. if (!m_customFilterSet) @@ -2477,9 +2503,10 @@ namespace AzToolsFramework return; } - for (auto& comboItem : m_comboItems) + size_t comboItemCount = StatusTypeToIndex(StatusItems); + for (size_t i=0; isetCheckState(Qt::Unchecked); + m_comboItems[i]->setCheckState(Qt::Unchecked); } bool allActive = true; @@ -2519,26 +2546,41 @@ namespace AzToolsFramework } } + if (m_prefabsAreEnabled) + { + if (allInactive) + { + AZ_Warning("Prefab", false, "All entities found to be inactive. This is an option that's not supported with Prefabs."); + allInactive = false; + allEditorOnly = true; + } + if (someInactive) + { + AZ_Warning("Prefab", false, "Some inactive entities found. This is an option that's not supported with Prefabs."); + someInactive = false; + } + } + m_gui->m_statusComboBox->setItalic(false); if (allActive) { - m_gui->m_statusComboBox->setHeaderOverride(m_itemNames[StatusType::StatusStartActive]); - m_gui->m_statusComboBox->setCurrentIndex(StatusType::StatusStartActive); - m_comboItems[StatusType::StatusStartActive]->setCheckState(Qt::Checked); + m_gui->m_statusComboBox->setHeaderOverride(m_itemNames[StatusTypeToIndex(StatusType::StatusStartActive)]); + m_gui->m_statusComboBox->setCurrentIndex(StatusTypeToIndex(StatusType::StatusStartActive)); + m_comboItems[StatusTypeToIndex(StatusType::StatusStartActive)]->setCheckState(Qt::Checked); } else if (allInactive) { - m_gui->m_statusComboBox->setHeaderOverride(m_itemNames[StatusType::StatusStartInactive]); - m_gui->m_statusComboBox->setCurrentIndex(StatusType::StatusStartInactive); - m_comboItems[StatusType::StatusStartInactive]->setCheckState(Qt::Checked); + m_gui->m_statusComboBox->setHeaderOverride(m_itemNames[StatusTypeToIndex(StatusType::StatusStartInactive)]); + m_gui->m_statusComboBox->setCurrentIndex(StatusTypeToIndex(StatusType::StatusStartInactive)); + m_comboItems[StatusTypeToIndex(StatusType::StatusStartInactive)]->setCheckState(Qt::Checked); } else if (allEditorOnly) { - m_gui->m_statusComboBox->setHeaderOverride(m_itemNames[StatusType::StatusEditorOnly]); - m_gui->m_statusComboBox->setCurrentIndex(StatusType::StatusEditorOnly); - m_comboItems[StatusType::StatusEditorOnly]->setCheckState(Qt::Checked); + m_gui->m_statusComboBox->setHeaderOverride(m_itemNames[StatusTypeToIndex(StatusType::StatusEditorOnly)]); + m_gui->m_statusComboBox->setCurrentIndex(StatusTypeToIndex(StatusType::StatusEditorOnly)); + m_comboItems[StatusTypeToIndex(StatusType::StatusEditorOnly)]->setCheckState(Qt::Checked); } else // Some marked active, some not { @@ -2546,15 +2588,15 @@ namespace AzToolsFramework m_gui->m_statusComboBox->setHeaderOverride("- Multiple selected -"); if (someActive) { - m_comboItems[StatusType::StatusStartActive]->setCheckState(Qt::PartiallyChecked); + m_comboItems[StatusTypeToIndex(StatusType::StatusStartActive)]->setCheckState(Qt::PartiallyChecked); } if (someInactive) { - m_comboItems[StatusType::StatusStartInactive]->setCheckState(Qt::PartiallyChecked); + m_comboItems[StatusTypeToIndex(StatusType::StatusStartInactive)]->setCheckState(Qt::PartiallyChecked); } if (someEditorOnly) { - m_comboItems[StatusType::StatusEditorOnly]->setCheckState(Qt::PartiallyChecked); + m_comboItems[StatusTypeToIndex(StatusType::StatusEditorOnly)]->setCheckState(Qt::PartiallyChecked); } } @@ -2563,6 +2605,54 @@ namespace AzToolsFramework m_gui->m_statusComboBox->style()->polish(m_gui->m_statusComboBox); } + size_t EntityPropertyEditor::StatusTypeToIndex(StatusType statusType) const + { + if (m_prefabsAreEnabled) + { + switch (statusType) + { + case StatusStartActive: + return 0; + case StatusStartInactive: + AZ_Assert(false, "StatusStartInactive is not supported when Prefabs are enabled."); + return 0; + case StatusEditorOnly: + return 1; + case StatusItems: + return 2; + default: + AZ_Assert(false, "StatusType for EntityPropertyEditor is out of bounds."); + return 1; + } + } + else + { + return statusType; + } + } + + EntityPropertyEditor::StatusType EntityPropertyEditor::IndexToStatusType(size_t index) const + { + if (m_prefabsAreEnabled) + { + switch (index) + { + case 0: + return StatusStartActive; + case 1: + return StatusEditorOnly; + default: + AZ_Assert(index < StatusType::StatusItems, "Index for EntityPropertyEditor::IndexToStatusType is out of bounds"); + return StatusEditorOnly; + } + } + else + { + AZ_Assert(index < StatusType::StatusItems, "Index for EntityPropertyEditor::IndexToStatusType is out of bounds"); + return aznumeric_cast(index); + } + } + void EntityPropertyEditor::OnDisplayComponentEditorMenu(const QPoint& position) { if (m_disabled) @@ -3649,12 +3739,12 @@ namespace AzToolsFramework { ScopedUndoBatch undo("Change Status"); - switch (index) + switch (IndexToStatusType(index)) { case StatusType::StatusStartActive: case StatusType::StatusStartInactive: { - bool entityIsStartingActive = index == StatusType::StatusStartActive; + bool entityIsStartingActive = index == StatusTypeToIndex(StatusType::StatusStartActive); for (AZ::EntityId entityId : m_selectedEntityIds) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx index c94259ec09..d11abbc447 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx @@ -68,6 +68,11 @@ namespace AzToolsFramework class ProductAssetBrowserEntry; } + namespace Prefab + { + class PrefabPublicInterface; + }; + namespace UndoSystem { class URSequencePoint; @@ -299,6 +304,7 @@ namespace AzToolsFramework None, OnlyStandardEntities, OnlyLayerEntities, + OnlyPrefabEntities, Mixed, LevelEntity }; @@ -480,9 +486,11 @@ namespace AzToolsFramework StatusItems }; - QStringList m_itemNames{ "Start active","Start inactive","Editor only" }; + QStringList m_itemNames; void UpdateStatusComboBox(); + size_t StatusTypeToIndex(StatusType statusType) const; + StatusType IndexToStatusType(size_t index) const; bool m_isBuildingProperties; @@ -541,6 +549,9 @@ namespace AzToolsFramework QStandardItem* m_comboItems[StatusItems]; EntityIdSet m_overrideSelectedEntityIds; + Prefab::PrefabPublicInterface* m_prefabPublicInterface = nullptr; + bool m_prefabsAreEnabled = false; + // When m_initiatingPropertyChangeNotification is set to true, it means this EntityPropertyEditor is // broadcasting a change to all listeners about a property change for a given entity. This is needed // so that we don't update the values twice for this inspector diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp index bbe5da4641..49a6dfedd6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp @@ -53,7 +53,7 @@ AZ_POP_DISABLE_WARNING #include #include #include -#include +#include #include #include @@ -1093,13 +1093,11 @@ namespace AzToolsFramework AZ::Data::AssetType assetType; const AZStd::string platformName = ""; // Empty for default AZStd::string rootFilePath; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystemRequestBus::Events::GetAssetInfoById, - assetID, assetType, platformName, assetInfo, rootFilePath); + AssetSystemRequestBus::BroadcastResult(result, &AssetSystemRequestBus::Events::GetAssetInfoById, assetID, assetType, platformName, assetInfo, rootFilePath); if (result) { - AZStd::string fullSourcePath = AZStd::string::format("%s/%s", rootFilePath.c_str(), assetInfo.m_relativePath.c_str()); - SharedThumbnailKey thumbnailKey = MAKE_TKEY(AzToolsFramework::AssetBrowser::SourceThumbnailKey, fullSourcePath.c_str()); + SharedThumbnailKey thumbnailKey = MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, assetID); m_thumbnail->SetThumbnailKey(thumbnailKey, Thumbnailer::ThumbnailContext::DefaultContext); return; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Undo/UndoCacheInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Undo/UndoCacheInterface.h new file mode 100644 index 0000000000..ee6e638f0b --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Undo/UndoCacheInterface.h @@ -0,0 +1,42 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include + +namespace AzToolsFramework +{ + namespace UndoSystem + { + class UndoCacheInterface + { + public: + AZ_RTTI(UndoCacheInterface, "{CC1E4411-A045-4906-AD39-2E0445B5EADA}"); + + //! Store the new entity state or replace the old state. + virtual void UpdateCache(const AZ::EntityId& entityId) = 0; + + //! Remove the cache line for the entity, if there is one. + virtual void PurgeCache(const AZ::EntityId& entityId) = 0; + + //! Clear the entire cache. + virtual void Clear() = 0; + + //! Verify if any changes to the entity was not correctly notified. + virtual void Validate(const AZ::EntityId& entityId) = 0; + }; + + } // namespace UndoSystem +} // namespace AzToolsFramework + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h index 8a4a561ca1..5f7fce3c84 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h @@ -34,7 +34,7 @@ #include #include #include - +#include #include @@ -42,6 +42,21 @@ AZ_PUSH_DISABLE_WARNING(4127, "-Wunknown-warning-option") // warning suppressed: #include AZ_POP_DISABLE_WARNING +#define AUTO_RESULT_IF_SETTING_TRUE(_settingName, _result) \ + { \ + bool settingValue = true; \ + if (auto* registry = AZ::SettingsRegistry::Get()) \ + { \ + registry->Get(settingValue, _settingName); \ + } \ + \ + if (settingValue) \ + { \ + EXPECT_TRUE(_result); \ + return; \ + } \ + } + namespace AZ { class Entity; @@ -51,6 +66,8 @@ namespace AZ namespace UnitTest { + constexpr AZStd::string_view prefabSystemSetting = "/Amazon/Preferences/EnablePrefabSystem"; + /// Test widget to store QActions generated by EditorTransformComponentSelection. class TestWidget : public QWidget @@ -122,7 +139,7 @@ namespace UnitTest if (!GetApplication()) { // Create & Start a new ToolsApplication if there's no existing one - m_app = AZStd::make_unique(); + m_app = AZStd::make_unique("ToolsApplication"); m_app->Start(AzFramework::Application::Descriptor()); } @@ -204,7 +221,7 @@ namespace UnitTest ToolsApplicationMessageHandler m_messageHandler; // used to suppress trace messages in test output private: - AZStd::unique_ptr m_app; + AZStd::unique_ptr m_app; // NewViewportInteractionModelEnabledRequestBus ... bool IsNewViewportInteractionModelEnabled() override diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/ToolsTestApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/ToolsTestApplication.cpp new file mode 100644 index 0000000000..d5cbac6e32 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/ToolsTestApplication.cpp @@ -0,0 +1,29 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + +namespace UnitTest +{ + ToolsTestApplication::ToolsTestApplication(AZStd::string applicationName) + : ToolsApplication() + , m_applicationName(AZStd::move(applicationName)) + { + } + + void ToolsTestApplication::SetSettingsRegistrySpecializations(AZ::SettingsRegistryInterface::Specializations& specializations) + { + Application::SetSettingsRegistrySpecializations(specializations); + specializations.Append("test"); + specializations.Append(m_applicationName); + } +} // namespace UnitTest diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/ToolsTestApplication.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/ToolsTestApplication.h new file mode 100644 index 0000000000..c1062320b6 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/ToolsTestApplication.h @@ -0,0 +1,30 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include +#include + +namespace UnitTest +{ + class ToolsTestApplication + : public AzToolsFramework::ToolsApplication + { + public: + explicit ToolsTestApplication(AZStd::string applicationName); + void SetSettingsRegistrySpecializations(AZ::SettingsRegistryInterface::Specializations& specializations) override; + + protected: + AZStd::string m_applicationName; + }; +} // namespace UnitTest diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 519839b639..ef1841bbc1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -2378,30 +2379,40 @@ namespace AzToolsFramework RegenerateManipulators(); }); - // duplicate selection - AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::Key_D) }, - /*ID_EDIT_CLONE =*/ 33525, - s_duplicateTitle, s_duplicateDesc, []() + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + bool prefabWipFeaturesEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled); + + if (!isPrefabSystemEnabled || (isPrefabSystemEnabled && prefabWipFeaturesEnabled)) { - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); + // duplicate selection + AddAction( + m_actions, {QKeySequence(Qt::CTRL + Qt::Key_D)}, + /*ID_EDIT_CLONE =*/33525, s_duplicateTitle, s_duplicateDesc, []() { + AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); - // Clear Widget selection - Prevents issues caused by cloning entities while a property in the Reflected Property Editor is being edited. - if (QApplication::focusWidget()) - { - QApplication::focusWidget()->clearFocus(); - } + // Clear Widget selection - Prevents issues caused by cloning entities while a property in the Reflected Property Editor + // is being edited. + if (QApplication::focusWidget()) + { + QApplication::focusWidget()->clearFocus(); + } - ScopedUndoBatch undoBatch(s_duplicateUndoRedoDesc); - auto selectionCommand = AZStd::make_unique(EntityIdList(), s_duplicateUndoRedoDesc); - selectionCommand->SetParent(undoBatch.GetUndoBatch()); - selectionCommand.release(); + ScopedUndoBatch undoBatch(s_duplicateUndoRedoDesc); + auto selectionCommand = AZStd::make_unique(EntityIdList(), s_duplicateUndoRedoDesc); + selectionCommand->SetParent(undoBatch.GetUndoBatch()); + selectionCommand.release(); - bool handled = false; - EditorRequestBus::Broadcast(&EditorRequests::CloneSelection, handled); + bool handled = false; + EditorRequestBus::Broadcast(&EditorRequests::CloneSelection, handled); - // selection update handled in AfterEntitySelectionChanged - }); + // selection update handled in AfterEntitySelectionChanged + }); + } // delete selection AddAction( diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake index 44179eb017..b9bbb896cb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake @@ -37,6 +37,7 @@ set(FILES API/EditorCameraBus.h API/EditorCameraBus.cpp API/EditorAnimationSystemRequestBus.h + API/EditorEntityAPI.h API/EditorLevelNotificationBus.h API/EditorVegetationRequestsBus.h API/EditorPythonConsoleBus.h @@ -48,6 +49,8 @@ set(FILES API/ViewPaneOptions.h Application/Ticker.h Application/Ticker.cpp + Application/EditorEntityManager.cpp + Application/EditorEntityManager.h Application/ToolsApplication.cpp Application/ToolsApplication.h Asset/AssetDebugInfo.h @@ -448,6 +451,7 @@ set(FILES UI/UICore/WidgetHelpers.h Undo/UndoSystem.cpp Undo/UndoSystem.h + Undo/UndoCacheInterface.h Commands/ComponentModeCommand.cpp Commands/ComponentModeCommand.h Commands/EntityManipulatorCommand.h @@ -584,8 +588,8 @@ set(FILES AssetBrowser/Search/SearchWidget.ui AssetBrowser/Thumbnails/FolderThumbnail.cpp AssetBrowser/Thumbnails/FolderThumbnail.h - AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.cpp - AssetBrowser/Thumbnails/AssetBrowserProductThumbnail.h + AssetBrowser/Thumbnails/ProductThumbnail.cpp + AssetBrowser/Thumbnails/ProductThumbnail.h AssetBrowser/Thumbnails/SourceThumbnail.cpp AssetBrowser/Thumbnails/SourceThumbnail.h AssetBrowser/AssetPicker/AssetPickerDialog.cpp @@ -609,6 +613,8 @@ set(FILES UI/PropertyEditor/Model/AssetCompleterModel.cpp UI/PropertyEditor/View/AssetCompleterListView.h UI/PropertyEditor/View/AssetCompleterListView.cpp + Prefab/EditorPrefabComponent.h + Prefab/EditorPrefabComponent.cpp Prefab/PrefabDomTypes.h Prefab/PrefabDomUtils.h Prefab/PrefabDomUtils.cpp @@ -623,6 +629,8 @@ set(FILES Prefab/Instance/Instance.cpp Prefab/Instance/InstanceSerializer.h Prefab/Instance/InstanceSerializer.cpp + Prefab/Instance/InstanceEntityScrubber.h + Prefab/Instance/InstanceEntityScrubber.cpp Prefab/Instance/InstanceEntityIdMapper.h Prefab/Instance/InstanceEntityIdMapper.cpp Prefab/Instance/InstanceEntityMapper.h @@ -666,6 +674,8 @@ set(FILES Prefab/Template/Template.cpp Prefab/PrefabUndo.h Prefab/PrefabUndo.cpp + Prefab/PrefabUndoCache.cpp + Prefab/PrefabUndoCache.h Prefab/PrefabPublicHandler.h Prefab/PrefabPublicHandler.cpp Prefab/PrefabPublicInterface.h @@ -673,6 +683,7 @@ set(FILES UI/Outliner/EntityOutlinerDisplayOptionsMenu.cpp UI/Outliner/EntityOutlinerTreeView.hxx UI/Outliner/EntityOutlinerTreeView.cpp + UI/Outliner/EntityOutlinerWidgetInterface.h UI/Outliner/EntityOutlinerWidget.hxx UI/Outliner/EntityOutlinerWidget.cpp UI/Outliner/EntityOutlinerCacheBus.h @@ -695,8 +706,10 @@ set(FILES UI/Prefab/PrefabEditInterface.h UI/Prefab/PrefabEditManager.h UI/Prefab/PrefabEditManager.cpp + UI/Prefab/PrefabIntegrationBus.h UI/Prefab/PrefabIntegrationManager.h UI/Prefab/PrefabIntegrationManager.cpp + UI/Prefab/PrefabIntegrationInterface.h UI/Prefab/PrefabUiHandler.h UI/Prefab/PrefabUiHandler.cpp PythonTerminal/ScriptHelpDialog.cpp diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframeworktestcommon_files.cmake b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframeworktestcommon_files.cmake index 324a4cb7ae..734a62cb90 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframeworktestcommon_files.cmake +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframeworktestcommon_files.cmake @@ -12,4 +12,6 @@ set(FILES UnitTest/AzToolsFrameworkTestHelpers.cpp UnitTest/AzToolsFrameworkTestHelpers.h + UnitTest/ToolsTestApplication.cpp + UnitTest/ToolsTestApplication.h ) diff --git a/Code/Framework/AzToolsFramework/Tests/ArchiveTests.cpp b/Code/Framework/AzToolsFramework/Tests/ArchiveTests.cpp index da2deaa6a3..b3b004d8ba 100644 --- a/Code/Framework/AzToolsFramework/Tests/ArchiveTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ArchiveTests.cpp @@ -18,10 +18,10 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -110,7 +110,7 @@ namespace UnitTest void SetUp() override { - m_app.reset(aznew AzToolsFramework::ToolsApplication); + m_app.reset(aznew ToolsTestApplication("ArchiveTest")); m_app->Start(AzFramework::Application::Descriptor()); // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash @@ -124,7 +124,7 @@ namespace UnitTest m_app.reset(); } - AZStd::unique_ptr m_app; + AZStd::unique_ptr m_app; QTemporaryDir m_tempDir {QDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)).filePath("ArchiveTests-")}; }; diff --git a/Code/Framework/AzToolsFramework/Tests/AssetFileInfoListComparison.cpp b/Code/Framework/AzToolsFramework/Tests/AssetFileInfoListComparison.cpp index 39f2ea8bb8..cec7179bd0 100644 --- a/Code/Framework/AzToolsFramework/Tests/AssetFileInfoListComparison.cpp +++ b/Code/Framework/AzToolsFramework/Tests/AssetFileInfoListComparison.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include namespace // anonymous @@ -51,7 +52,7 @@ namespace UnitTest void SetUp() override { using namespace AZ::Data; - m_application = new AzToolsFramework::ToolsApplication(); + m_application = new ToolsTestApplication("AssetFileInfoListComparisonTest"); AzToolsFramework::AssetSeedManager assetSeedManager; AzFramework::AssetRegistry assetRegistry; @@ -729,7 +730,7 @@ namespace UnitTest } - AzToolsFramework::ToolsApplication* m_application; + ToolsTestApplication* m_application; AzToolsFramework::PlatformAddressedAssetCatalog* m_pcCatalog; AZ::IO::FileIOBase* m_priorFileIO = nullptr; AZ::IO::FileIOBase* m_localFileIO = nullptr; diff --git a/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp b/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp index 13e4d15b96..7ecc577fae 100644 --- a/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp +++ b/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -57,7 +58,7 @@ namespace UnitTest void SetUp() override { using namespace AZ::Data; - m_application = new AzToolsFramework::ToolsApplication(); + m_application = new ToolsTestApplication("AssetSeedManagerTest"); m_assetSeedManager = new AzToolsFramework::AssetSeedManager(); m_assetRegistry = new AzFramework::AssetRegistry(); @@ -765,7 +766,7 @@ namespace UnitTest AzToolsFramework::AssetSeedManager* m_assetSeedManager; AzFramework::AssetRegistry* m_assetRegistry; - AzToolsFramework::ToolsApplication* m_application; + ToolsTestApplication* m_application; AzToolsFramework::PlatformAddressedAssetCatalog* m_pcCatalog; AzToolsFramework::PlatformAddressedAssetCatalog* m_es3Catalog; AZ::IO::FileIOStream m_fileStreams[s_totalTestPlatforms][s_totalAssets]; diff --git a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp index 2e93c9e1aa..cbc81ba9b8 100644 --- a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp @@ -289,6 +289,8 @@ namespace UnitTest TEST_F(EditorTransformComponentSelectionFixture, TestComponentPropertyNotificationIsSentAfterModifyingSlice) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Given AZ::Entity* grandParent = nullptr; diff --git a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntityContextComponentTests.cpp b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntityContextComponentTests.cpp index b275039c5f..d10eb639ce 100644 --- a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntityContextComponentTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntityContextComponentTests.cpp @@ -12,8 +12,8 @@ #include #include -#include #include +#include namespace AzToolsFramework { @@ -33,7 +33,8 @@ namespace AzToolsFramework { m_app.Stop(); } - AzToolsFramework::ToolsApplication m_app; + UnitTest::ToolsTestApplication m_app{ "EditorEntityContextComponent" }; // Shorted because Settings Registry specializations + // are 32 characters max. AZ::ComponentApplication::Descriptor m_descriptor; }; diff --git a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp index 569c1d5972..15a76c1dbb 100644 --- a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -23,6 +22,7 @@ #include #include #include +#include namespace AzToolsFramework { @@ -236,7 +236,7 @@ namespace AzToolsFramework m_app.Stop(); } - AzToolsFramework::ToolsApplication m_app; + UnitTest::ToolsTestApplication m_app{ "EditorEntitySearchComponentTests" }; AZ::ComponentApplication::Descriptor m_descriptor; AZStd::unordered_map m_entityMap; diff --git a/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp b/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp index e62f603a4f..086b6a1eb3 100644 --- a/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -99,7 +100,7 @@ namespace UnitTest private: - ToolsApplication m_app; + ToolsTestApplication m_app{ "EntityIdQLabelTest" }; }; diff --git a/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp b/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp index c139873c2b..0c38960647 100644 --- a/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp @@ -30,6 +30,7 @@ #include #include #include +#include // Inspector Test Includes #include @@ -273,7 +274,7 @@ namespace UnitTest { AZ::ComponentApplication::Descriptor componentApplicationDesc; componentApplicationDesc.m_useExistingAllocator = true; - m_application = aznew AzToolsFramework::ToolsApplication(); + m_application = aznew ToolsTestApplication("ComponentPaletteTests"); m_application->Start(componentApplicationDesc); // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash @@ -288,7 +289,7 @@ namespace UnitTest } public: - AzToolsFramework::ToolsApplication* m_application = nullptr; + ToolsTestApplication* m_application = nullptr; }; // Test pushing slices to create news slices that could result in cyclic diff --git a/Code/Framework/AzToolsFramework/Tests/ManipulatorViewTests.cpp b/Code/Framework/AzToolsFramework/Tests/ManipulatorViewTests.cpp index 7f15fe9424..60af247410 100644 --- a/Code/Framework/AzToolsFramework/Tests/ManipulatorViewTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ManipulatorViewTests.cpp @@ -18,6 +18,7 @@ #include #include +#include #include namespace UnitTest @@ -46,7 +47,7 @@ namespace UnitTest m_serializeContext.reset(); } - ToolsApplication m_app; + ToolsTestApplication m_app{ "ManipulatorViewTest" }; }; TEST_F(ManipulatorViewTest, ViewDirectionForCameraAlignedManipulatorFacesCameraInManipulatorSpace) diff --git a/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp b/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp index d1e625610e..328bf5dea5 100644 --- a/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -47,7 +47,8 @@ namespace UnitTest void SetUp() override { using namespace AZ::Data; - m_application = new AzToolsFramework::ToolsApplication(); + m_application = new ToolsTestApplication("AddressedAssetCatalogManager"); // Shorter name because Setting Registry + // specialization are 32 characters max. m_application->Start(AzFramework::Application::Descriptor()); // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash @@ -140,7 +141,7 @@ namespace UnitTest AzToolsFramework::PlatformAddressedAssetCatalogManager* m_PlatformAddressedAssetCatalogManager; - AzToolsFramework::ToolsApplication* m_application; + ToolsTestApplication* m_application; AZ::IO::FileIOBase* m_priorFileIO = nullptr; AZ::IO::FileIOBase* m_localFileIO = nullptr; AZ::IO::FileIOStream m_fileStreams[AzFramework::PlatformId::NumPlatformIds][s_totalAssets]; diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h index 63fd40145a..a9d7d804f4 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h @@ -58,7 +58,7 @@ namespace Benchmark AzToolsFramework::Prefab::InstanceUpdateExecutorInterface* m_instanceUpdateExecutorInterface = nullptr; const char* m_pathString = "path/to/template"; - AZStd::vector m_paths; + AZStd::vector m_paths; AZStd::unique_ptr m_mockIOActionValidator; }; diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabLoadBenchmarks.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabLoadBenchmarks.cpp index 65d1ece5bd..8e3233c8af 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabLoadBenchmarks.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabLoadBenchmarks.cpp @@ -35,7 +35,7 @@ namespace Benchmark for (int templateCounter = 0; templateCounter < numTemplates; ++templateCounter) { - m_prefabLoaderInterface->LoadTemplate(m_paths[templateCounter]); + m_prefabLoaderInterface->LoadTemplateFromFile(m_paths[templateCounter]); } state.PauseTiming(); diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.cpp index adaef416fc..5a7da92c14 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.cpp @@ -12,7 +12,9 @@ #include +#include #include +#include namespace UnitTest { @@ -38,7 +40,7 @@ namespace UnitTest } void MockPrefabFileIOActionValidator::ReadPrefabDom( - const AZStd::string& prefabFilePath, + AZ::IO::PathView prefabFilePath, const AzToolsFramework::Prefab::PrefabDom& prefabFileContentDom, AZ::IO::ResultCode expectedReadResultCode, AZ::IO::ResultCode expectedOpenResultCode, @@ -56,7 +58,7 @@ namespace UnitTest } void MockPrefabFileIOActionValidator::ReadPrefabDom( - const AZStd::string& prefabFilePath, + AZ::IO::PathView prefabFilePath, const AZStd::string& prefabFileContent, AZ::IO::ResultCode expectedReadResultCode, AZ::IO::ResultCode expectedOpenResultCode, @@ -65,8 +67,10 @@ namespace UnitTest { AZ::IO::HandleType fileHandle = m_fileHandleCounter++; + AZ::IO::Path prefabFullPath = AZ::Interface::Get()->GetFullPath(AZStd::string_view(prefabFilePath)); + EXPECT_CALL(*m_fileIOMock.get(), Open( - testing::StrEq(prefabFilePath.c_str()), testing::_, testing::_)) + testing::StrEq(prefabFullPath.c_str()), testing::_, testing::_)) .WillRepeatedly( testing::DoAll( testing::SetArgReferee<2>(fileHandle), diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.h b/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.h index aac73acd4c..74b4880c23 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/MockPrefabFileIOActionValidator.h @@ -26,7 +26,7 @@ namespace UnitTest ~MockPrefabFileIOActionValidator(); void ReadPrefabDom( - const AZStd::string& prefabFilePath, + AZ::IO::PathView prefabFilePath, const AzToolsFramework::Prefab::PrefabDom& prefabFileContentDom, AZ::IO::ResultCode expectedReadResultCode = AZ::IO::ResultCode::Success, AZ::IO::ResultCode expectedOpenResultCode = AZ::IO::ResultCode::Success, @@ -34,7 +34,7 @@ namespace UnitTest AZ::IO::ResultCode expectedCloseResultCode = AZ::IO::ResultCode::Success); void ReadPrefabDom( - const AZStd::string& prefabFilePath, + AZ::IO::PathView prefabFilePath, const AZStd::string& prefabFileContent, AZ::IO::ResultCode expectedReadResultCode = AZ::IO::ResultCode::Success, AZ::IO::ResultCode expectedOpenResultCode = AZ::IO::ResultCode::Success, diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabEntityAliasTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabEntityAliasTests.cpp index f2f367c6cc..0cf39a3572 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabEntityAliasTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabEntityAliasTests.cpp @@ -49,26 +49,27 @@ namespace UnitTest AZStd::unique_ptr secondInstance = m_prefabSystemComponent->InstantiatePrefab(newInstance->GetTemplateId()); - // Activate the entities so that we can find them via the component application bus - secondInstance->InitializeEntities(); - secondInstance->ActivateEntities(); - - AZ::Entity* secondNewEntity = nullptr; - - AZ::ComponentApplicationBus::BroadcastResult(secondNewEntity, - &AZ::ComponentApplicationBus::Events::FindEntity, secondInstance->GetEntityId(newEntityAlias)); - - ASSERT_TRUE(secondNewEntity); - - PrefabTestComponent* secondComponent = secondNewEntity->FindComponent(); - ASSERT_TRUE(secondComponent); - - // Validate that the entity reference is preserved in the second instance - ASSERT_TRUE(secondComponent->m_entityIdProperty.IsValid()); - ASSERT_EQ(secondComponent->m_entityIdProperty, secondInstance->GetEntityId(referencedEntityAlias)); + bool found = false; + secondInstance->GetConstEntities([&](const AZ::Entity& entity) + { + if (entity.GetId() == secondInstance->GetEntityId(newEntityAlias)) + { + PrefabTestComponent* secondComponent = entity.FindComponent(); + EXPECT_NE(nullptr, secondComponent); + if (secondComponent) + { + // Validate that the entity reference is preserved in the second instance + EXPECT_TRUE(secondComponent->m_entityIdProperty.IsValid()); + EXPECT_EQ(secondComponent->m_entityIdProperty, secondInstance->GetEntityId(referencedEntityAlias)); + } + found = true; + } + return true; + }); + EXPECT_TRUE(found); } - TEST_F(PrefabEntityAliasTests, PrefabEntityAlias_ReferenceNotInSameHierarchy_ReferenceGoesToNull) + TEST_F(PrefabEntityAliasTests, DISABLED_PrefabEntityAlias_ReferenceNotInSameHierarchy_ReferenceGoesToNull) { // Make a new entity with a test component AZ::Entity* newEntity = CreateEntity("New Entity", false); @@ -98,21 +99,19 @@ namespace UnitTest AZStd::unique_ptr secondInstance = m_prefabSystemComponent->InstantiatePrefab(firstInstance->GetTemplateId()); - // Activate the entities so that we can find them via the component application bus - secondInstance->InitializeEntities(); - secondInstance->ActivateEntities(); - - AZ::Entity* secondNewEntity = nullptr; - - AZ::ComponentApplicationBus::BroadcastResult(secondNewEntity, - &AZ::ComponentApplicationBus::Events::FindEntity, secondInstance->GetEntityId(newEntityAlias)); - - ASSERT_TRUE(secondNewEntity); - - PrefabTestComponent* secondComponent = secondNewEntity->FindComponent(); - ASSERT_TRUE(secondComponent); - - ASSERT_FALSE(secondComponent->m_entityIdProperty.IsValid()); + size_t count = 0; + secondInstance->GetConstEntities([&](const AZ::Entity& entity) + { + count++; + PrefabTestComponent* secondComponent = entity.FindComponent(); + EXPECT_NE(nullptr, secondComponent); + if (secondComponent) + { + EXPECT_FALSE(secondComponent->m_entityIdProperty.IsValid()); + } + return true; + }); + EXPECT_EQ(1, count); } TEST_F(PrefabEntityAliasTests, PrefabEntityAlias_ReferenceEntityFoundInNestedInstance_ReferencePersists) @@ -165,29 +164,27 @@ namespace UnitTest ASSERT_TRUE(secondRootInstance); - // Activate the entities so that we can find them via the component application bus - secondRootInstance->InitializeNestedEntities(); - secondRootInstance->ActivateNestedEntities(); - // Find the new instances versions of the new and referenced entities using the aliases we saved AZ::EntityId secondNewEntityId = secondRootInstance->GetEntityId(newEntityAlias); InstanceOptionalReference secondNestedInstance = secondRootInstance->FindNestedInstance(nestedAlias); ASSERT_TRUE(secondNestedInstance); - AZ::EntityId secondReferencedEntityId = secondNestedInstance->get().GetEntityId(referencedEntityAlias); - AZ::Entity* secondNewEntity = nullptr; - AZ::ComponentApplicationBus::BroadcastResult(secondNewEntity, - &AZ::ComponentApplicationBus::Events::FindEntity, secondNewEntityId); - - ASSERT_TRUE(secondNewEntity); - - PrefabTestComponent* secondComponent = secondNewEntity->FindComponent(); - ASSERT_TRUE(secondComponent); - - EXPECT_TRUE(secondComponent->m_entityIdProperty.IsValid()); - EXPECT_EQ(secondComponent->m_entityIdProperty, secondReferencedEntityId); + size_t count = 0; + secondRootInstance->GetConstEntities([&](const AZ::Entity& entity) + { + count++; + PrefabTestComponent* secondComponent = entity.FindComponent(); + EXPECT_NE(nullptr, secondComponent); + if (secondComponent) + { + EXPECT_TRUE(secondComponent->m_entityIdProperty.IsValid()); + EXPECT_EQ(secondComponent->m_entityIdProperty, secondReferencedEntityId); + } + return true; + }); + EXPECT_EQ(1, count); } TEST_F(PrefabEntityAliasTests, PrefabEntityAlias_ReferenceEntityFoundInParentInstance_ReferencePersists) @@ -244,7 +241,8 @@ namespace UnitTest m_instanceToTemplateInterface->GeneratePatch(patch, entityDomBeforeUpdate, entityDomAfterUpdate); // Patch the nested prefab to reference an entity in its parent - m_instanceToTemplateInterface->PatchEntityInTemplate(patch, newEntity->GetId()); + ASSERT_TRUE(m_instanceToTemplateInterface->PatchEntityInTemplate(patch, newEntity->GetId())); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Using the aliases we saved grab the updated entities so we can verify the entity reference is still preserved InstanceOptionalReference updatedNestedInstance = rootInstance->FindNestedInstance(nestedAlias); @@ -253,10 +251,6 @@ namespace UnitTest AZ::EntityId updatedNewEntityId = updatedNestedInstance->get().GetEntityId(entityAlias); AZ::Entity* updatedNewEntity = nullptr; - // Activate the entities so that we can find them via the component application bus - rootInstance->InitializeNestedEntities(); - rootInstance->ActivateNestedEntities(); - AZ::ComponentApplicationBus::BroadcastResult(updatedNewEntity, &AZ::ComponentApplicationBus::Events::FindEntity, updatedNewEntityId); diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstanceToTemplatePropagatorTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstanceToTemplatePropagatorTests.cpp index 03ac556c30..595827e5e3 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstanceToTemplatePropagatorTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstanceToTemplatePropagatorTests.cpp @@ -67,11 +67,10 @@ namespace UnitTest m_instanceToTemplateInterface->GeneratePatch(patch, entityDomBeforeUpdate, entityDomAfterUpdate); //update template - m_instanceToTemplateInterface->PatchEntityInTemplate(patch, entityId); + ASSERT_TRUE(m_instanceToTemplateInterface->PatchEntityInTemplate(patch, entityId)); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); - //activate the entity so we can access via transform bus - secondInstance->InitializeNestedEntities(); - secondInstance->ActivateNestedEntities(); + ValidateInstanceEntitiesActive(*secondInstance); //get the entity id AZ::EntityId secondEntityId = secondInstance->GetEntityId(newEntityAlias); @@ -121,6 +120,7 @@ namespace UnitTest //update template m_instanceToTemplateInterface->PatchTemplate(patch, templateId); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); //get the entity id AZStd::vector entityIdVector; @@ -171,6 +171,7 @@ namespace UnitTest //update template m_instanceToTemplateInterface->PatchTemplate(patch, templateId); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); //get the entity id AZStd::vector entityIdVector; @@ -219,6 +220,7 @@ namespace UnitTest //update template m_instanceToTemplateInterface->PatchTemplate(patch, templateId); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); EXPECT_NE(secondInstance->FindNestedInstance(addedAlias), AZStd::nullopt); } @@ -238,7 +240,7 @@ namespace UnitTest //get template id TemplateId templateId = firstInstance->GetTemplateId(); - //instantiate second instance for checking if propogation works + //instantiate second instance for checking if propagation works AZStd::unique_ptr secondInstance = m_prefabSystemComponent->InstantiatePrefab(templateId); ASSERT_TRUE(secondInstance); @@ -259,6 +261,7 @@ namespace UnitTest //update template m_instanceToTemplateInterface->PatchTemplate(patch, templateId); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); EXPECT_EQ(secondInstance->FindNestedInstance(addedAlias), AZStd::nullopt); } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstantiateTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstantiateTests.cpp index 51d6b53ba3..f6030af212 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstantiateTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabInstantiateTests.cpp @@ -24,20 +24,22 @@ namespace UnitTest TEST_F(PrefabInstantiateTest, PrefabInstantiate_NoNestingTemplate_InstantiateSucceeds) { AZ::Entity* newEntity = CreateEntity("New Entity"); - + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{newEntity}); AZStd::unique_ptr firstInstance = m_prefabSystemComponent->CreatePrefab({ newEntity }, {}, "test/path"); ASSERT_TRUE(firstInstance); AZStd::unique_ptr secondInstance = m_prefabSystemComponent->InstantiatePrefab(firstInstance->GetTemplateId()); ASSERT_TRUE(secondInstance); - CompareInstances(*firstInstance, *secondInstance); + CompareInstances(*firstInstance, *secondInstance, true, false); } TEST_F(PrefabInstantiateTest, PrefabInstantiate_TripleNestingTemplate_InstantiateSucceeds) { AZ::Entity* newEntity = CreateEntity("New Entity"); - + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{newEntity}); // Build a 3 level deep nested Template AZStd::unique_ptr firstInstance = m_prefabSystemComponent->CreatePrefab({ newEntity }, {}, "test/path1"); ASSERT_TRUE(firstInstance); @@ -56,13 +58,14 @@ namespace UnitTest ASSERT_TRUE(fourthInstance); - CompareInstances(*thirdInstance, *fourthInstance, false); + CompareInstances(*thirdInstance, *fourthInstance, true, false); } TEST_F(PrefabInstantiateTest, PrefabInstantiate_Instantiate10Times_InstantiatesSucceed) { AZ::Entity* newEntity = CreateEntity("New Entity"); - + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{newEntity}); AZStd::unique_ptr firstInstance = m_prefabSystemComponent->CreatePrefab({ newEntity }, {}, "test/path"); // Store the generated instances so that the unique_ptrs are destroyed at the end of the test @@ -76,7 +79,7 @@ namespace UnitTest ASSERT_TRUE(newInstance); - CompareInstances(*firstInstance, *newInstance); + CompareInstances(*firstInstance, *newInstance, true, false); newInstances.push_back(AZStd::move(newInstance)); } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabLoadTemplateTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabLoadTemplateTests.cpp index e4c09cce4b..bbf3d35e12 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabLoadTemplateTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabLoadTemplateTests.cpp @@ -30,7 +30,7 @@ namespace UnitTest mockIOActionValidator.ReadPrefabDom( templateData.m_filePath, PrefabTestDomUtils::CreatePrefabDom()); - templateData.m_id = m_prefabLoaderInterface->LoadTemplate(templateData.m_filePath); + templateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(templateData.m_filePath); PrefabTestDataUtils::ValidateTemplateLoad(templateData); } @@ -54,7 +54,7 @@ namespace UnitTest mockIOActionValidator.ReadPrefabDom( targetTemplateData.m_filePath, PrefabTestDomUtils::CreatePrefabDom({ targetTemplateInstanceData })); - targetTemplateData.m_id = m_prefabLoaderInterface->LoadTemplate(targetTemplateData.m_filePath); + targetTemplateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(targetTemplateData.m_filePath); sourceTemplateData.m_id = m_prefabSystemComponent->GetTemplateIdFromFilePath(sourceTemplateData.m_filePath); LinkData linkData = PrefabTestDataUtils::CreateLinkData( @@ -74,7 +74,7 @@ namespace UnitTest MockPrefabFileIOActionValidator mockIOActionValidator; mockIOActionValidator.ReadPrefabDom(templateData.m_filePath, templatePrefabDom); - templateData.m_id = m_prefabLoaderInterface->LoadTemplate(templateData.m_filePath); + templateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(templateData.m_filePath); templateData.m_isLoadedWithErrors = true; PrefabTestDataUtils::ValidateTemplateLoad(templateData); @@ -120,7 +120,7 @@ namespace UnitTest targetTemplateData.m_filePath, targetTemplatePrefabDom); // Load target and source Templates and get their Ids. - targetTemplateData.m_id = m_prefabLoaderInterface->LoadTemplate(targetTemplateData.m_filePath); + targetTemplateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(targetTemplateData.m_filePath); sourceTemplateData.m_id = m_prefabSystemComponent->GetTemplateIdFromFilePath(sourceTemplateData.m_filePath); // Because of cyclical dependency, the two Templates should be loaded with errors. @@ -149,7 +149,7 @@ namespace UnitTest MockPrefabFileIOActionValidator mockIOActionValidator; mockIOActionValidator.ReadPrefabDom(templateData.m_filePath, templatePrefabDom); - templateData.m_id = m_prefabLoaderInterface->LoadTemplate(templateData.m_filePath); + templateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(templateData.m_filePath); PrefabTestDataUtils::ValidateTemplateLoad(templateData); } @@ -166,7 +166,7 @@ namespace UnitTest MockPrefabFileIOActionValidator mockIOActionValidator; mockIOActionValidator.ReadPrefabDom(templateData.m_filePath, templatePrefabDom); - templateData.m_id = m_prefabLoaderInterface->LoadTemplate(templateData.m_filePath); + templateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(templateData.m_filePath); PrefabTestDataUtils::ValidateTemplateLoad(templateData); } @@ -188,7 +188,7 @@ namespace UnitTest templateInstanceData.m_source, PrefabTestDomUtils::CreatePrefabDom(), AZ::IO::ResultCode::Success, AZ::IO::ResultCode::Error); - templateData.m_id = m_prefabLoaderInterface->LoadTemplate(templateData.m_filePath); + templateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(templateData.m_filePath); PrefabTestDataUtils::ValidateTemplateLoad(templateData); } @@ -222,7 +222,7 @@ namespace UnitTest } } - templatesData.back().m_id = m_prefabLoaderInterface->LoadTemplate(templatesData.back().m_filePath); + templatesData.back().m_id = m_prefabLoaderInterface->LoadTemplateFromFile(templatesData.back().m_filePath); for (int i = nestedHierarchyLevel - 2; i >= 0; i--) { templatesData[i].m_id = m_prefabSystemComponent->GetTemplateIdFromFilePath(templatesData[i].m_filePath); @@ -264,7 +264,7 @@ namespace UnitTest mockIOActionValidator.ReadPrefabDom( targetTemplateData.m_filePath, PrefabTestDomUtils::CreatePrefabDom(targetTemplateInstancesData)); - targetTemplateData.m_id = m_prefabLoaderInterface->LoadTemplate(targetTemplateData.m_filePath); + targetTemplateData.m_id = m_prefabLoaderInterface->LoadTemplateFromFile(targetTemplateData.m_filePath); for (int i = 0; i < numInstances; i++) { sourceTemplatesData[i].m_id = m_prefabSystemComponent->GetTemplateIdFromFilePath(sourceTemplatesData[i].m_filePath); @@ -279,13 +279,63 @@ namespace UnitTest TEST_F(PrefabLoadTemplateTest, LoadTemplate_LoadCorruptedPrefabFileData_InvalidTemplateIdReturned) { const AZStd::string corruptedPrefabContent = "{ Corrupted PrefabDom"; - const AZStd::string pathToCorruptedPrefab = "path/to/corrupted/prefab/file"; + AZ::IO::Path pathToCorruptedPrefab("path/to/corrupted/prefab/file"); + pathToCorruptedPrefab.MakePreferred(); MockPrefabFileIOActionValidator mockIOActionValidator; mockIOActionValidator.ReadPrefabDom(pathToCorruptedPrefab, corruptedPrefabContent); - auto tmeplateId = m_prefabLoaderInterface->LoadTemplate(pathToCorruptedPrefab); + TemplateId templateId = m_prefabLoaderInterface->LoadTemplateFromFile(pathToCorruptedPrefab); - EXPECT_EQ(tmeplateId, AzToolsFramework::Prefab::InvalidTemplateId); + EXPECT_EQ(templateId, AzToolsFramework::Prefab::InvalidTemplateId); + } + + TEST_F(PrefabLoadTemplateTest, LoadTemplate_LoadFromString_InvalidPathReturnsInvalidTemplateId) + { + PrefabDom emptyPrefabDom = PrefabTestDomUtils::CreatePrefabDom(); + AZStd::string emptyPrefabDomStr = PrefabTestDomUtils::DomToString(emptyPrefabDom); + EXPECT_EQ(m_prefabLoaderInterface->LoadTemplateFromString(emptyPrefabDomStr, "|?<>"), AzToolsFramework::Prefab::InvalidTemplateId); + EXPECT_EQ(m_prefabLoaderInterface->LoadTemplateFromString(emptyPrefabDomStr, "notAFile/"), AzToolsFramework::Prefab::InvalidTemplateId); + } + + TEST_F(PrefabLoadTemplateTest, LoadTemplate_LoadFromString_LoadsEmptyPrefab) + { + TemplateData templateData; + templateData.m_filePath = "path/to/empty/prefab"; + + PrefabDom emptyPrefabDom = PrefabTestDomUtils::CreatePrefabDom(); + AZStd::string emptyPrefabDomStr = PrefabTestDomUtils::DomToString(emptyPrefabDom); + templateData.m_id = m_prefabLoaderInterface->LoadTemplateFromString( + emptyPrefabDomStr, + templateData.m_filePath + ); + + PrefabTestDataUtils::ValidateTemplateLoad(templateData); + } + + TEST_F(PrefabLoadTemplateTest, LoadTemplate_LoadFromString_TemplateDependingOnItself_LoadedWithErrors) + { + TemplateData templateData; + templateData.m_filePath = "path/to/self/dependency"; + + PrefabDom selfDependentPrefab = PrefabTestDomUtils::CreatePrefabDom( + { PrefabTestDataUtils::CreateInstanceDataWithNoPatches("instance", templateData.m_filePath) } + ); + + AZStd::string selfDependentPrefabStr = PrefabTestDomUtils::DomToString(selfDependentPrefab); + templateData.m_id = m_prefabLoaderInterface->LoadTemplateFromString( + selfDependentPrefabStr, + templateData.m_filePath); + + templateData.m_isLoadedWithErrors = true; + + PrefabTestDataUtils::ValidateTemplateLoad(templateData); + } + + TEST_F(PrefabLoadTemplateTest, LoadTemplate_LoadFromString_CorruptedReturnsInvalidTemplateId) + { + AZStd::string corruptPrefab = "{ Corrupted PrefabDom"; + TemplateId templateId = m_prefabLoaderInterface->LoadTemplateFromString(corruptPrefab); + EXPECT_EQ(templateId, AzToolsFramework::Prefab::InvalidTemplateId); } } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.cpp index a0644d7c18..783f66f8e9 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.cpp @@ -22,6 +22,7 @@ namespace UnitTest { serializeContext->Class()-> Field("BoolProperty", &PrefabTestComponent::m_boolProperty)-> + Field("IntProperty", &PrefabTestComponent::m_intProperty)-> Field("EntityReferenceProperty", &PrefabTestComponent::m_entityIdProperty); } } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.h b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.h index 3914251f31..710af09e2b 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestComponent.h @@ -28,6 +28,7 @@ namespace UnitTest static void Reflect(AZ::ReflectContext* reflection); bool m_boolProperty = false; + int m_intProperty = 0; AZ::EntityId m_entityIdProperty; }; } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestData.h b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestData.h index 9a849cce5f..7ffa056f9f 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestData.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestData.h @@ -12,6 +12,7 @@ #pragma once +#include #include #include #include @@ -27,7 +28,7 @@ namespace UnitTest InstanceData& operator=(const InstanceData& other); AZStd::string m_name; - AZStd::string m_source; + AZ::IO::Path m_source; AzToolsFramework::Prefab::PrefabDom m_patches; }; @@ -36,7 +37,7 @@ namespace UnitTest AzToolsFramework::Prefab::TemplateId m_id = AzToolsFramework::Prefab::InvalidTemplateId; bool m_isValid = true; bool m_isLoadedWithErrors = false; - AZStd::string m_filePath; + AZ::IO::Path m_filePath; AZStd::unordered_map m_instancesData; }; diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.cpp index 9dab6d89b3..d6c9a6d2ef 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.cpp @@ -38,7 +38,7 @@ namespace UnitTest InstanceData CreateInstanceDataWithNoPatches( const AZStd::string& name, - const AZStd::string& source) + AZ::IO::PathView source) { InstanceData newInstanceData; newInstanceData.m_name = name; diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.h b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.h index 1141e380a8..04b76a969e 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDataUtils.h @@ -26,7 +26,7 @@ namespace UnitTest InstanceData CreateInstanceDataWithNoPatches( const AZStd::string& name, - const AZStd::string& source); + AZ::IO::PathView source); void ValidateTemplateLoad( const TemplateData& expectedTemplateData); diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.cpp index 2148b3eff1..79b24365f5 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.cpp @@ -24,7 +24,6 @@ namespace UnitTest { namespace PrefabTestDomUtils { - void SetPrefabDomInstance( PrefabDom& prefabDom, const char* instanceName, @@ -64,7 +63,8 @@ namespace UnitTest const TemplateId& templateId, const PrefabDomValue& expectedContent, const PrefabDomPath& contentPath, - bool isContentAnInstance) + bool isContentAnInstance, + bool shouldCompareContainerEntities) { TemplateInstanceMapperInterface* templateInstanceMapper = AZ::Interface::Get(); @@ -86,7 +86,7 @@ namespace UnitTest if (isContentAnInstance) { - ComparePrefabDoms(*actualContent, expectedContent, false); + ComparePrefabDoms(*actualContent, expectedContent, false, shouldCompareContainerEntities); } else { @@ -108,7 +108,8 @@ namespace UnitTest void ValidatePrefabDomInstances( const AZStd::vector& instanceAliases, const AzToolsFramework::Prefab::PrefabDom& prefabDom, - const AzToolsFramework::Prefab::PrefabDom& expectedNestedInstanceDom) + const AzToolsFramework::Prefab::PrefabDom& expectedNestedInstanceDom, + bool shouldCompareContainerEntities) { PrefabDomValueConstReference templateInstances = PrefabDomUtils::FindPrefabDomValue(prefabDom, "Instances"); ASSERT_TRUE(templateInstances.has_value()); @@ -116,11 +117,13 @@ namespace UnitTest { PrefabDomValueConstReference actualNestedInstanceDom = PrefabDomUtils::FindPrefabDomValue(templateInstances->get(), instanceAlias.c_str()); ASSERT_TRUE(actualNestedInstanceDom.has_value()); - ComparePrefabDoms(actualNestedInstanceDom, expectedNestedInstanceDom, false); + ComparePrefabDoms(actualNestedInstanceDom, expectedNestedInstanceDom, false, shouldCompareContainerEntities); } } - void ComparePrefabDoms(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB, bool shouldCompareLinkIds) + void ComparePrefabDoms( + PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB, bool shouldCompareLinkIds, + bool shouldCompareContainerEntities) { ASSERT_TRUE(valueA.has_value()); ASSERT_TRUE(valueB.has_value()); @@ -129,40 +132,52 @@ namespace UnitTest if (shouldCompareLinkIds) { - EXPECT_EQ(AZ::JsonSerialization::Compare(valueADom, valueBDom), AZ::JsonSerializerCompareResult::Equal); + PrefabDomValueConstReference actualNestedInstanceDomLinkId = + PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabDomUtils::LinkIdName); + PrefabDomValueConstReference expectedNestedInstanceDomLinkId = + PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabDomUtils::LinkIdName); + ComparePrefabDomValues(actualNestedInstanceDomLinkId, actualNestedInstanceDomLinkId); } - else + + if (shouldCompareContainerEntities) { - // Compare the source values of the two DOMs. - PrefabDomValueConstReference actualNestedInstanceDomSource = - PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabDomUtils::SourceName); - PrefabDomValueConstReference expectedNestedInstanceDomSource = - PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabDomUtils::SourceName); - ComparePrefabDomValues(actualNestedInstanceDomSource, expectedNestedInstanceDomSource); - - // Compare the entities values of the two DOMs. - PrefabDomValueConstReference actualNestedInstanceDomEntities = - PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabTestDomUtils::EntitiesValueName); - PrefabDomValueConstReference expectedNestedInstanceDomEntities = - PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabTestDomUtils::EntitiesValueName); - ComparePrefabDomValues(actualNestedInstanceDomEntities, expectedNestedInstanceDomEntities); - - // Compare the instances values of the two DOMs, which involves iterating over each expected instance and comparing it - // with its counterpart in the actual instance. - PrefabDomValueConstReference actualNestedInstanceDomInstances = - PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabDomUtils::InstancesName); - PrefabDomValueConstReference expectedNestedInstanceDomInstances = - PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabDomUtils::InstancesName); - if (expectedNestedInstanceDomInstances.has_value()) + PrefabDomValueConstReference actualNestedInstanceDomContainerEntity = + PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabDomUtils::ContainerEntityName); + PrefabDomValueConstReference expectedNestedInstanceDomContainerEntity = + PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabDomUtils::ContainerEntityName); + ComparePrefabDomValues(actualNestedInstanceDomContainerEntity, expectedNestedInstanceDomContainerEntity); + } + + // Compare the source values of the two DOMs. + PrefabDomValueConstReference actualNestedInstanceDomSource = + PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabDomUtils::SourceName); + PrefabDomValueConstReference expectedNestedInstanceDomSource = + PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabDomUtils::SourceName); + ComparePrefabDomValues(actualNestedInstanceDomSource, expectedNestedInstanceDomSource); + + // Compare the entities values of the two DOMs. + PrefabDomValueConstReference actualNestedInstanceDomEntities = + PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabTestDomUtils::EntitiesValueName); + PrefabDomValueConstReference expectedNestedInstanceDomEntities = + PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabTestDomUtils::EntitiesValueName); + ComparePrefabDomValues(actualNestedInstanceDomEntities, expectedNestedInstanceDomEntities); + + // Compare the instances values of the two DOMs, which involves iterating over each expected instance and comparing it + // with its counterpart in the actual instance. + PrefabDomValueConstReference actualNestedInstanceDomInstances = + PrefabDomUtils::FindPrefabDomValue(valueADom, PrefabDomUtils::InstancesName); + PrefabDomValueConstReference expectedNestedInstanceDomInstances = + PrefabDomUtils::FindPrefabDomValue(valueBDom, PrefabDomUtils::InstancesName); + if (expectedNestedInstanceDomInstances.has_value()) + { + ASSERT_TRUE(actualNestedInstanceDomInstances.has_value()); + for (auto instanceIterator = expectedNestedInstanceDomInstances->get().MemberBegin(); + instanceIterator != expectedNestedInstanceDomInstances->get().MemberEnd(); ++instanceIterator) { - ASSERT_TRUE(actualNestedInstanceDomInstances.has_value()); - for (auto instanceIterator = expectedNestedInstanceDomInstances->get().MemberBegin(); - instanceIterator != expectedNestedInstanceDomInstances->get().MemberEnd(); ++instanceIterator) - { - ComparePrefabDoms(instanceIterator->value, - PrefabDomUtils::FindPrefabDomValue(actualNestedInstanceDomInstances->get(), instanceIterator->name.GetString()), - shouldCompareLinkIds); - } + ComparePrefabDoms( + instanceIterator->value, + PrefabDomUtils::FindPrefabDomValue(actualNestedInstanceDomInstances->get(), instanceIterator->name.GetString()), + shouldCompareLinkIds, shouldCompareContainerEntities); } } } @@ -180,14 +195,6 @@ namespace UnitTest } } - void PrintPrefabDom(const AzToolsFramework::Prefab::PrefabDomValue& prefabDom) - { - rapidjson::StringBuffer prefabBuffer; - rapidjson::PrettyWriter writer(prefabBuffer); - prefabDom.Accept(writer); - std::cout << prefabBuffer.GetString() << std::endl; - } - void ValidateEntitiesOfInstances( const AzToolsFramework::Prefab::TemplateId& templateId, const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom, @@ -215,8 +222,29 @@ namespace UnitTest PrefabTestDomUtils::GetPrefabDomInstance(expectedPrefabDom, nestedInstanceAlias); ASSERT_TRUE(nestedInstanceValue != nullptr); - PrefabTestDomUtils::ValidateInstances(templateId, *nestedInstanceValue, nestedInstancePath, true); + PrefabTestDomUtils::ValidateInstances(templateId, *nestedInstanceValue, nestedInstancePath, true, false); } } + + void ValidateComponentsDomHasId(const PrefabDomValue& componentsDom, AZ::u64 componentId) + { + AZStd::string componentValueName = AZStd::string::format("Component_[%llu]", componentId); + PrefabDomValueConstReference entityComponentValue = PrefabDomUtils::FindPrefabDomValue(componentsDom, componentValueName.c_str()); + ASSERT_TRUE(entityComponentValue); + + PrefabDomValueConstReference entityComponentIdValue = + PrefabDomUtils::FindPrefabDomValue(entityComponentValue->get(), PrefabTestDomUtils::ComponentIdName); + + EXPECT_EQ(componentId, entityComponentIdValue->get().GetUint64()); + } + + AZStd::string DomToString(const AzToolsFramework::Prefab::PrefabDom& dom) + { + rapidjson::StringBuffer prefabFileContentBuffer; + rapidjson::PrettyWriter writer(prefabFileContentBuffer); + dom.Accept(writer); + + return AZStd::string(prefabFileContentBuffer.GetString()); + } } } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.h b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.h index a1d6efe8d7..54f3c3f6db 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestDomUtils.h @@ -125,7 +125,8 @@ namespace UnitTest const TemplateId& templateId, const PrefabDomValue& expectedContent, const PrefabDomPath& contentPath, - bool isContentAnInstance = false); + bool isContentAnInstance = false, + bool shouldCompareContainerEntities = true); PrefabDom CreatePrefabDom(); PrefabDom CreatePrefabDom(const AZStd::vector& instancesData); @@ -142,16 +143,13 @@ namespace UnitTest */ void ValidatePrefabDomInstances(const AZStd::vector& instanceAliases, const PrefabDom& prefabDom, - const PrefabDom& expectedNestedInstanceDom); + const PrefabDom& expectedNestedInstanceDom, + bool shouldCompareContainerEntities = true); - void ComparePrefabDoms(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB, bool shouldCompareLinkIds = true); + void ComparePrefabDoms(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB, bool shouldCompareLinkIds = true, + bool shouldCompareContainerEntities = true); void ComparePrefabDomValues(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB); - /** - * Prints the contents of the given prefab DOM to the console in a readable format. - */ - void PrintPrefabDom(const PrefabDomValue& prefabDom); - void ValidateEntitiesOfInstances( const AzToolsFramework::Prefab::TemplateId& templateId, const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom, @@ -161,7 +159,11 @@ namespace UnitTest const AzToolsFramework::Prefab::TemplateId& templateId, const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom, const AZStd::vector& nestedInstanceAliases); - + + void ValidateComponentsDomHasId(const PrefabDomValue& componentsDom, AZ::u64 componentId); + + //! Serializes Dom into a string + AZStd::string DomToString(const AzToolsFramework::Prefab::PrefabDom& dom); } } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.cpp index 6173a8651e..3a8d9cc7eb 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.cpp @@ -26,19 +26,15 @@ namespace UnitTest AZ::Entity* systemEntity = GetApplication()->FindEntity(AZ::SystemEntityId); EXPECT_TRUE(systemEntity); - // Acquire the prefab system component to gain access to its APIs for testing m_prefabSystemComponent = systemEntity->FindComponent(); EXPECT_TRUE(m_prefabSystemComponent); - // Acquire the interface of PrefabLoader to gain access to its APIs for testing m_prefabLoaderInterface = AZ::Interface::Get(); EXPECT_TRUE(m_prefabLoaderInterface); - // Acquire the interface of InstanceUpdateQueueInterface to gain access to its APIs for testing m_instanceUpdateExecutorInterface = AZ::Interface::Get(); EXPECT_TRUE(m_instanceUpdateExecutorInterface); - // Acquire the interface of InstanceToTemplate to gain access to its APIs for testing m_instanceToTemplateInterface = AZ::Interface::Get(); EXPECT_TRUE(m_instanceToTemplateInterface); @@ -60,7 +56,7 @@ namespace UnitTest } void PrefabTestFixture::CompareInstances(const AzToolsFramework::Prefab::Instance& instanceA, - const AzToolsFramework::Prefab::Instance& instanceB, bool shouldCompareLinkIds) + const AzToolsFramework::Prefab::Instance& instanceB, bool shouldCompareLinkIds, bool shouldCompareContainerEntities) { AzToolsFramework::Prefab::TemplateId templateAId = instanceA.GetTemplateId(); AzToolsFramework::Prefab::TemplateId templateBId = instanceB.GetTemplateId(); @@ -81,10 +77,11 @@ namespace UnitTest ASSERT_TRUE(AzToolsFramework::Prefab::PrefabDomUtils::StoreInstanceInPrefabDom(instanceB, prefabDomB)); // Validate that both instances match when serialized - PrefabTestDomUtils::ComparePrefabDoms(prefabDomA, prefabDomB); + PrefabTestDomUtils::ComparePrefabDoms(prefabDomA, prefabDomB, true, shouldCompareContainerEntities); // Validate that the serialized instances match the shared template when serialized - PrefabTestDomUtils::ComparePrefabDoms(templateA->get().GetPrefabDom(), prefabDomB, shouldCompareLinkIds); + PrefabTestDomUtils::ComparePrefabDoms(templateA->get().GetPrefabDom(), prefabDomB, shouldCompareLinkIds, + shouldCompareContainerEntities); } void PrefabTestFixture::DeleteInstances(const InstanceList& instancesToDelete) @@ -96,4 +93,20 @@ namespace UnitTest instanceToDelete = nullptr; } } + + void PrefabTestFixture::ValidateInstanceEntitiesActive(Instance& instance) + { + AZStd::vector entityIdVector; + instance.GetNestedEntityIds([&entityIdVector](AZ::EntityId entityId) { + entityIdVector.push_back(entityId); + return true; + }); + for (AZ::EntityId entityId : entityIdVector) + { + AZ::Entity* entityInInstance = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(entityInInstance, &AZ::ComponentApplicationBus::Events::FindEntity, entityId); + ASSERT_TRUE(entityInInstance); + EXPECT_EQ(entityInInstance->GetState(), AZ::Entity::State::Active); + } + } } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.h b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.h index 8dd1cc6987..af90309867 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabTestFixture.h @@ -47,11 +47,14 @@ namespace UnitTest AZ::Entity* CreateEntity(const char* entityName, const bool shouldActivate = true); - void CompareInstances(const Instance& instanceA, - const Instance& instanceB, bool shouldCompareLinkIds = true); + void CompareInstances(const Instance& instanceA, const Instance& instanceB, bool shouldCompareLinkIds = true, + bool shouldCompareContainerEntities = true); void DeleteInstances(const InstanceList& instancesToDelete); + //! Validates that all entities within a prefab instance are in 'Active' state. + void ValidateInstanceEntitiesActive(Instance& instance); + PrefabSystemComponent* m_prefabSystemComponent = nullptr; PrefabLoaderInterface* m_prefabLoaderInterface = nullptr; InstanceUpdateExecutorInterface* m_instanceUpdateExecutorInterface = nullptr; diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp index 16c28ebe99..2122b116d8 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp @@ -15,11 +15,13 @@ #include +#include + namespace UnitTest { using PrefabUndoLinkTests = PrefabTestUndoFixture; - TEST_F(PrefabUndoLinkTests, PrefabUndoLinkAdd) + TEST_F(PrefabUndoLinkTests, PrefabUndoLink_Add) { AZStd::unique_ptr firstInstance = nullptr; AZStd::unique_ptr secondInstance = nullptr; @@ -36,6 +38,7 @@ namespace UnitTest PrefabUndoInstanceLink undoLink("Undo Link Add Node"); undoLink.Capture(firstTemplateId, secondTemplateId, aliases[0]); undoLink.Redo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); AZStd::unique_ptr newInstance = m_prefabSystemComponent->InstantiatePrefab(firstTemplateId); AZStd::vector instances = newInstance->GetNestedInstanceAliases(secondTemplateId); @@ -45,6 +48,7 @@ namespace UnitTest //undo the parenting undoLink.Undo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); newInstance = m_prefabSystemComponent->InstantiatePrefab(firstTemplateId); instances = newInstance->GetNestedInstanceAliases(secondTemplateId); @@ -53,10 +57,249 @@ namespace UnitTest //undo the parenting undoLink.Redo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); newInstance = m_prefabSystemComponent->InstantiatePrefab(firstTemplateId); instances = newInstance->GetNestedInstanceAliases(secondTemplateId); ASSERT_TRUE(instances.size() == 1); } + + TEST_F(PrefabUndoLinkTests, PrefabUndoLink_InitialPatchData_ContainerTarget_PatchSucceeds) + { + //create two instances + AZStd::unique_ptr nestedInstance = nullptr; + AZStd::unique_ptr rootInstance = nullptr; + TemplateId nestedTemplateId = InvalidTemplateId; + TemplateId rootTemplateId = InvalidTemplateId; + + SetupInstances(nestedInstance, rootInstance, nestedTemplateId, rootTemplateId); + nestedInstance->ActivateContainerEntity(); + + AZ::EntityId nestedContainerEntityId = nestedInstance->GetContainerEntityId(); + AZ::EntityId rootContainerEntityId = rootInstance->GetContainerEntityId(); + + AZ::Entity* nestedContainerEntity = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + //generate a patch to add a component to the nested instance + PrefabDom initialEntityDom; + m_instanceToTemplateInterface->GenerateDomForEntity(initialEntityDom, *nestedContainerEntity); + + nestedContainerEntity->Deactivate(); + PrefabTestComponent* nestedTestComponent = nestedContainerEntity->CreateComponent(); + ASSERT_TRUE(nestedTestComponent); + nestedContainerEntity->Activate(); + + PrefabDom modifiedEntityDom; + m_instanceToTemplateInterface->GenerateDomForEntity(modifiedEntityDom, *nestedContainerEntity); + + PrefabDom patch; + m_instanceToTemplateInterface->GeneratePatch(patch, initialEntityDom, modifiedEntityDom); + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, nestedContainerEntityId); + + //apply the patch + PrefabDom& templateDomReference = m_prefabSystemComponent->FindTemplateDom(nestedTemplateId); + AZ::JsonSerializationResult::ResultCode result = AZ::JsonSerialization::ApplyPatch(templateDomReference, + templateDomReference.GetAllocator(), patch, AZ::JsonMergeApproach::JsonPatch); + + AZ_Error("Prefab", result.GetOutcome() == AZ::JsonSerializationResult::Outcomes::Success, + "Patch was not successfully applied"); + + //nest the second instance under the first instance + rootInstance->AddInstance(AZStd::move(nestedInstance)); + AZStd::vector aliases = rootInstance->GetNestedInstanceAliases(nestedTemplateId); + + //create patch for nesting + m_instanceToTemplateInterface->GenerateDomForEntity(initialEntityDom, *nestedContainerEntity); + nestedTestComponent->m_entityIdProperty = rootContainerEntityId; + m_instanceToTemplateInterface->GenerateDomForEntity(modifiedEntityDom, *nestedContainerEntity); + m_instanceToTemplateInterface->GeneratePatch(patch, initialEntityDom, modifiedEntityDom); + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, nestedContainerEntityId); + + //create an undo node to apply the patch and prep for undo + PrefabUndoInstanceLink undoInstanceLinkNode("Undo Link Patch"); + undoInstanceLinkNode.Capture(rootTemplateId, nestedTemplateId, aliases[0], patch, InvalidLinkId); + undoInstanceLinkNode.Redo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); + + //verify the application worked + InstanceOptionalReference nestedInstanceRef = rootInstance->FindNestedInstance(aliases[0]); + AZ::EntityId nestedContainerId = nestedInstanceRef->get().GetContainerEntityId(); + + AZ::Entity* nestedContainer = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(nestedContainer, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerId); + ASSERT_TRUE(nestedContainer); + + PrefabTestComponent* nestedComponent = nestedContainer->FindComponent(); + ASSERT_EQ(nestedComponent->m_entityIdProperty, rootInstance->GetContainerEntityId()); + } + + TEST_F(PrefabUndoLinkTests, PrefabUndoLink_InitialPatchData_UpdateLinkEntity_PatchSucceeds) + { + //create two instance + AZStd::unique_ptr nestedInstance = nullptr; + AZStd::unique_ptr rootInstance = nullptr; + TemplateId nestedTemplateId = InvalidTemplateId; + TemplateId rootTemplateId = InvalidTemplateId; + + SetupInstances(nestedInstance, rootInstance, nestedTemplateId, rootTemplateId); + nestedInstance->ActivateContainerEntity(); + + AZ::EntityId nestedContainerEntityId = nestedInstance->GetContainerEntityId(); + AZ::EntityId rootContainerEntityId = rootInstance->GetContainerEntityId(); + + AZ::Entity* nestedContainerEntity = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + //add a component for testing to the instance that will be nested + PrefabDom initialEntityDom; + m_instanceToTemplateInterface->GenerateDomForEntity(initialEntityDom, *nestedContainerEntity); + + nestedContainerEntity->Deactivate(); + PrefabTestComponent* nestedTestComponent = nestedContainerEntity->CreateComponent(); + ASSERT_TRUE(nestedTestComponent); + nestedContainerEntity->Activate(); + + PrefabDom modifiedEntityDom; + m_instanceToTemplateInterface->GenerateDomForEntity(modifiedEntityDom, *nestedContainerEntity); + + //create patch + PrefabDom patch; + m_instanceToTemplateInterface->GeneratePatch(patch, initialEntityDom, modifiedEntityDom); + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, nestedContainerEntityId); + m_instanceToTemplateInterface->PatchTemplate(patch, nestedTemplateId); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); + + //instantiate a new nested instance + nestedInstance = m_prefabSystemComponent->InstantiatePrefab(nestedTemplateId); + nestedContainerEntityId = nestedInstance->GetContainerEntityId(); + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + //nest the second instance under the first instance + m_instanceToTemplateInterface->GenerateDomForEntity(initialEntityDom, *nestedContainerEntity); + + rootInstance->AddInstance(AZStd::move(nestedInstance)); + nestedTestComponent->m_entityIdProperty = rootContainerEntityId; + + m_instanceToTemplateInterface->GenerateDomForEntity(modifiedEntityDom, *nestedContainerEntity); + + //create patch + PrefabDom linkPatch; + m_instanceToTemplateInterface->GeneratePatch(linkPatch, initialEntityDom, modifiedEntityDom); + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(linkPatch, nestedContainerEntityId); + + AZStd::vector aliases = rootInstance->GetNestedInstanceAliases(nestedTemplateId); + + //create an undo node to apply the patch and prep for undo + PrefabUndoInstanceLink undoInstanceLinkNode("Undo Link Patch"); + undoInstanceLinkNode.Capture(rootTemplateId, nestedTemplateId, aliases[0], linkPatch, InvalidLinkId); + undoInstanceLinkNode.Redo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); + + LinkId linkId = undoInstanceLinkNode.GetLinkId(); + + rootInstance = m_prefabSystemComponent->InstantiatePrefab(rootTemplateId); + aliases = rootInstance->GetNestedInstanceAliases(nestedTemplateId); + + //verify the link was created + InstanceOptionalReference nestedInstanceRef = rootInstance->FindNestedInstance(aliases[0]); + nestedContainerEntityId = nestedInstanceRef->get().GetContainerEntityId(); + + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + //update the property on the nested component + m_instanceToTemplateInterface->GenerateDomForEntity(initialEntityDom, *nestedContainerEntity); + + nestedTestComponent = nestedContainerEntity->FindComponent(); + nestedTestComponent->m_boolProperty = true; + + m_instanceToTemplateInterface->GenerateDomForEntity(modifiedEntityDom, *nestedContainerEntity); + + //create patch + PrefabDom updatePatch; + m_instanceToTemplateInterface->GeneratePatch(updatePatch, initialEntityDom, modifiedEntityDom); + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(updatePatch, nestedContainerEntityId); + + //create the update link undo/redo node + PrefabUndoLinkUpdate undoLinkUpdateNode("Undo Link Update"); + undoLinkUpdateNode.Capture(updatePatch, linkId); + undoLinkUpdateNode.Redo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); + + //verify the update worked + rootInstance = m_prefabSystemComponent->InstantiatePrefab(rootTemplateId); + aliases = rootInstance->GetNestedInstanceAliases(nestedTemplateId); + nestedInstanceRef = rootInstance->FindNestedInstance(aliases[0]); + nestedContainerEntityId = nestedInstanceRef->get().GetContainerEntityId(); + + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + nestedTestComponent = nestedContainerEntity->FindComponent(); + ASSERT_EQ(nestedTestComponent->m_boolProperty, true); + + //undo the update + undoLinkUpdateNode.Undo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); + + //verify the undo update worked + rootInstance = m_prefabSystemComponent->InstantiatePrefab(rootTemplateId); + aliases = rootInstance->GetNestedInstanceAliases(nestedTemplateId); + nestedInstanceRef = rootInstance->FindNestedInstance(aliases[0]); + nestedContainerEntityId = nestedInstanceRef->get().GetContainerEntityId(); + + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + nestedTestComponent = nestedContainerEntity->FindComponent(); + ASSERT_EQ(nestedTestComponent->m_boolProperty, false); + + //redo the update so we can test if updating previously changed values matter + undoLinkUpdateNode.Redo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); + + rootInstance = m_prefabSystemComponent->InstantiatePrefab(rootTemplateId); + aliases = rootInstance->GetNestedInstanceAliases(nestedTemplateId); + nestedInstanceRef = rootInstance->FindNestedInstance(aliases[0]); + nestedContainerEntityId = nestedInstanceRef->get().GetContainerEntityId(); + + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + //update the property on the nested component + m_instanceToTemplateInterface->GenerateDomForEntity(initialEntityDom, *nestedContainerEntity); + + nestedTestComponent = nestedContainerEntity->FindComponent(); + nestedTestComponent->m_intProperty = 1; + + m_instanceToTemplateInterface->GenerateDomForEntity(modifiedEntityDom, *nestedContainerEntity); + + //create patch + PrefabDom updatePatchIntField; + m_instanceToTemplateInterface->GeneratePatch(updatePatchIntField, initialEntityDom, modifiedEntityDom); + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(updatePatchIntField, nestedContainerEntityId); + + //create the update link undo/redo node + PrefabUndoLinkUpdate undoIntFieldNode("Undo Link Update"); + undoIntFieldNode.Capture(updatePatchIntField, linkId); + undoIntFieldNode.Redo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); + + //verify the update worked + rootInstance = m_prefabSystemComponent->InstantiatePrefab(rootTemplateId); + aliases = rootInstance->GetNestedInstanceAliases(nestedTemplateId); + nestedInstanceRef = rootInstance->FindNestedInstance(aliases[0]); + nestedContainerEntityId = nestedInstanceRef->get().GetContainerEntityId(); + + AZ::ComponentApplicationBus::BroadcastResult(nestedContainerEntity, &AZ::ComponentApplicationBus::Events::FindEntity, nestedContainerEntityId); + ASSERT_TRUE(nestedContainerEntity); + + nestedTestComponent = nestedContainerEntity->FindComponent(); + ASSERT_EQ(nestedTestComponent->m_intProperty, 1); + } } // namespace UnitTest diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoTests.cpp index 4ee6d83688..94dcfe59f6 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoTests.cpp @@ -75,18 +75,18 @@ namespace UnitTest EntityAlias entityAlias = entityAliasRef.value(); //update template - m_instanceToTemplateInterface->PatchEntityInTemplate(patch, entityAlias, templateId); + ASSERT_TRUE(m_instanceToTemplateInterface->PatchEntityInTemplate(patch, entityAlias, templateId)); //undo change instanceEntityUndo.Undo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // verify template updated correctly //instantiate second instance for checking if propogation works AZStd::unique_ptr secondInstance = m_prefabSystemComponent->InstantiatePrefab(templateId); ASSERT_TRUE(secondInstance); - secondInstance->InitializeNestedEntities(); - secondInstance->ActivateNestedEntities(); + ValidateInstanceEntitiesActive(*secondInstance); //get the values from the transform on the entity AZ::EntityId secondNewEntity = secondInstance->GetEntityId(entityAlias); @@ -136,6 +136,7 @@ namespace UnitTest //undo change instanceEntityAddUndo.Undo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); //get the entity id AZStd::vector entityIdVector; @@ -188,6 +189,7 @@ namespace UnitTest //undo change instanceEntityRemoveUndo.Undo(); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); //get the entity id AZStd::vector entityIdVector; diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateInstancesTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateInstancesTests.cpp index 87ec37b826..d9fb30858e 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateInstancesTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateInstancesTests.cpp @@ -10,6 +10,7 @@ * */ +#include #include #include #include @@ -67,6 +68,8 @@ namespace UnitTest // Create a Template from an Instance owning a single entity. using namespace AzToolsFramework::Prefab; AZ::Entity* entity1 = CreateEntity("Entity 1"); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity1}); AZStd::unique_ptr newInstance = m_prefabSystemComponent->CreatePrefab({ entity1 }, {}, PrefabMockFilePath); TemplateId newTemplateId = newInstance->GetTemplateId(); EXPECT_TRUE(newTemplateId != InvalidTemplateId); @@ -89,6 +92,8 @@ namespace UnitTest // Add another entity to the Instance and use it to update the PrefabDom of Template. AZ::Entity* entity2 = CreateEntity("Entity 2"); newInstance->AddEntity(*entity2); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity2}); newTemplateEntityAliases = newInstance->GetEntityAliases(); EXPECT_EQ(newTemplateEntityAliases.size(), 2); @@ -110,6 +115,8 @@ namespace UnitTest // Create a Template with single entity. using namespace AzToolsFramework::Prefab; AZ::Entity* entity = CreateEntity("Entity"); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity}); AZStd::unique_ptr newNestedInstance = m_prefabSystemComponent->CreatePrefab({ entity }, {}, NestedPrefabMockFilePath); TemplateId newNestedTemplateId = newNestedInstance->GetTemplateId(); EXPECT_TRUE(newNestedTemplateId != InvalidTemplateId); @@ -162,16 +169,20 @@ namespace UnitTest { // Create a Template from an Instance owning a single entity. AZ::Entity* entity = CreateEntity("Entity", false); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity}); AZStd::unique_ptr newInstance = m_prefabSystemComponent->CreatePrefab({ entity }, {}, PrefabMockFilePath); TemplateId newTemplateId = newInstance->GetTemplateId(); PrefabDom& newTemplateDom = m_prefabSystemComponent->FindTemplateDom(newTemplateId); AZStd::vector newTemplateEntityAliases = newInstance->GetEntityAliases(); ASSERT_EQ(newTemplateEntityAliases.size(), 1); - // Validate that the entity doesn't have any components under it. + // Validate that the entity has 1 component under it. This is added through the scrubbing of entities in + // EditorEntityContextComponent, which gets called through HandleEntitiesAdded during loading of entities in Prefab Instances. const PrefabDomValue* entityComponents = PrefabTestDomUtils::GetPrefabDomComponents(newTemplateDom, newTemplateEntityAliases.front()); - ASSERT_TRUE(entityComponents == nullptr); + ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsObject()); + EXPECT_EQ(entityComponents->MemberCount(), 1); // Instantiate Instances and validate if all Instances have the entity. const int numberOfInstances = 3; @@ -187,22 +198,20 @@ namespace UnitTest // Add a component to the Instance and use it to update the PrefabDom of Template. PrefabTestComponent* prefabTestComponent = aznew PrefabTestComponent(true); + entity->Deactivate(); entity->AddComponent(prefabTestComponent); auto expectedComponentId = prefabTestComponent->GetId(); PrefabDom updatedDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*newInstance, updatedDom)); newTemplateDom.CopyFrom(updatedDom, newTemplateDom.GetAllocator()); - // Validate that the entity does have a component under it. + // Validate that the entity now has 2 components under it. entityComponents = PrefabTestDomUtils::GetPrefabDomComponents(newTemplateDom, newTemplateEntityAliases.front()); - ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsArray()); - EXPECT_EQ(entityComponents->GetArray().Size(), 1); + ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsObject()); + EXPECT_EQ(entityComponents->MemberCount(), 2); // Extract the component id of the entity in Template and verify that it matches with the component id of the Instance. - PrefabDomValueConstReference findEntityComponentIdValueResult = - PrefabDomUtils::FindPrefabDomValue(*entityComponents->Begin(), PrefabTestDomUtils::ComponentIdName); - ASSERT_TRUE(findEntityComponentIdValueResult.has_value()); - EXPECT_EQ(expectedComponentId, findEntityComponentIdValueResult->get().GetUint64()); + PrefabTestDomUtils::ValidateComponentsDomHasId(*entityComponents, prefabTestComponent->GetId()); // Update Template's Instances and validate if all Instances have the new component under their entities. m_instanceUpdateExecutorInterface->AddTemplateInstancesToQueue(newTemplateId); @@ -211,7 +220,6 @@ namespace UnitTest PrefabTestDomUtils::ValidateInstances(newTemplateId, *entityComponents, PrefabTestDomUtils::GetPrefabDomComponentsPath(newTemplateEntityAliases.front())); - } TEST_F(PrefabUpdateInstancesTest, UpdatePrefabInstances_DetachEntity_UpdateSucceeds) @@ -220,6 +228,8 @@ namespace UnitTest using namespace AzToolsFramework::Prefab; AZ::Entity* entity1 = CreateEntity("Entity 1"); AZ::Entity* entity2 = CreateEntity("Entity 2"); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity1, entity2}); AZStd::unique_ptr newInstance = m_prefabSystemComponent->CreatePrefab( { entity1, entity2 }, {}, @@ -267,6 +277,8 @@ namespace UnitTest // Create a Template with single entity. using namespace AzToolsFramework::Prefab; AZ::Entity* entity = CreateEntity("Entity"); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity}); AZStd::unique_ptr newNestedInstance = m_prefabSystemComponent->CreatePrefab({ entity }, {}, NestedPrefabMockFilePath); TemplateId newNestedTemplateId = newNestedInstance->GetTemplateId(); EXPECT_TRUE(newNestedTemplateId != InvalidTemplateId); @@ -327,23 +339,22 @@ namespace UnitTest AZ::Entity* entity = CreateEntity("Entity", false); PrefabTestComponent* prefabTestComponent = aznew PrefabTestComponent(true); entity->AddComponent(prefabTestComponent); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity}); AZStd::unique_ptr newInstance = m_prefabSystemComponent->CreatePrefab({ entity }, {}, PrefabMockFilePath); TemplateId newTemplateId = newInstance->GetTemplateId(); PrefabDom& newTemplateDom = m_prefabSystemComponent->FindTemplateDom(newTemplateId); AZStd::vector newTemplateEntityAliases = newInstance->GetEntityAliases(); ASSERT_EQ(newTemplateEntityAliases.size(), 1); - // Validate that the entity has exactly 1 component under it. + // Validate that the entity has 2 components under it. One of them is added through HandleEntitiesAdded() in EditorEntityContext. const PrefabDomValue* entityComponents = PrefabTestDomUtils::GetPrefabDomComponents(newTemplateDom, newTemplateEntityAliases.front()); - ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsArray()); - EXPECT_EQ(entityComponents->GetArray().Size(), 1); + ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsObject()); + EXPECT_EQ(entityComponents->MemberCount(), 2); // Extract the component id of the entity in the Template and verify that it matches with the component id of the entity's component. - PrefabDomValueConstReference entityComponentIdValue = - PrefabDomUtils::FindPrefabDomValue(*entityComponents->Begin(), PrefabTestDomUtils::ComponentIdName); - ASSERT_TRUE(entityComponentIdValue.has_value()); - EXPECT_EQ(prefabTestComponent->GetId(), entityComponentIdValue->get().GetUint64()); + PrefabTestDomUtils::ValidateComponentsDomHasId(*entityComponents, prefabTestComponent->GetId()); // Instantiate Instances and validate if all Instances have the entity. const int numberOfInstances = 3; @@ -359,15 +370,18 @@ namespace UnitTest newTemplateId, *entityComponents, PrefabTestDomUtils::GetPrefabDomComponentsPath(newTemplateEntityAliases.front())); // Remove a component from the Instance's entity and use the Instance to update the PrefabDom of Template. + entity->Deactivate(); entity->RemoveComponent(prefabTestComponent); delete prefabTestComponent; + entity->Activate(); PrefabDom updatedDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*newInstance, updatedDom)); newTemplateDom.CopyFrom(updatedDom, newTemplateDom.GetAllocator()); - // Validate that the entity does not have any component under it. + // Validate that the entity only has 1 component under it. entityComponents = PrefabTestDomUtils::GetPrefabDomComponents(newTemplateDom, newTemplateEntityAliases.front()); - ASSERT_TRUE(entityComponents == nullptr); + ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsObject()); + EXPECT_EQ(entityComponents->MemberCount(), 1); // Update Template's Instances and validate if all Instances have no component under their entities. m_instanceUpdateExecutorInterface->AddTemplateInstancesToQueue(newTemplateId); @@ -375,7 +389,6 @@ namespace UnitTest EXPECT_TRUE(updateResult); PrefabTestDomUtils::ValidateEntitiesOfInstances(newTemplateId, newTemplateDom, newTemplateEntityAliases); - } TEST_F(PrefabUpdateInstancesTest, UpdatePrefabInstances_ChangeComponentProperty_UpdateSucceeds) @@ -384,23 +397,22 @@ namespace UnitTest AZ::Entity* entity = CreateEntity("Entity", false); PrefabTestComponent* prefabTestComponent = aznew PrefabTestComponent(true); entity->AddComponent(prefabTestComponent); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{entity}); AZStd::unique_ptr newInstance = m_prefabSystemComponent->CreatePrefab({ entity }, {}, PrefabMockFilePath); TemplateId newTemplateId = newInstance->GetTemplateId(); PrefabDom& newTemplateDom = m_prefabSystemComponent->FindTemplateDom(newTemplateId); AZStd::vector newTemplateEntityAliases = newInstance->GetEntityAliases(); ASSERT_EQ(newTemplateEntityAliases.size(), 1); - // Validate that the entity has exactly 1 component under it. + // Validate that the entity has 2 components under it. One of them is added through HandleEntitiesAdded() in EditorEntityContext. const PrefabDomValue* entityComponents = PrefabTestDomUtils::GetPrefabDomComponents(newTemplateDom, newTemplateEntityAliases.front()); - ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsArray()); - EXPECT_EQ(entityComponents->GetArray().Size(), 1); + ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsObject()); + EXPECT_EQ(entityComponents->MemberCount(), 2); // Extract the component id of the entity in the Template and verify that it matches with the component id of the entity's component. - PrefabDomValueConstReference entityComponentIdValue = - PrefabDomUtils::FindPrefabDomValue(*entityComponents->Begin(), PrefabTestDomUtils::ComponentIdName); - ASSERT_TRUE(entityComponentIdValue.has_value()); - EXPECT_EQ(prefabTestComponent->GetId(), entityComponentIdValue->get().GetUint64()); + PrefabTestDomUtils::ValidateComponentsDomHasId(*entityComponents, prefabTestComponent->GetId()); // Instantiate Instances and validate if all Instances have the entity. const int numberOfInstances = 3; @@ -425,12 +437,16 @@ namespace UnitTest // Validate that the prefabTestComponent in the Template's DOM doesn't have a BoolProperty. // Even though we changed the property to false, it won't be serialized out because it's a default value. entityComponents = PrefabTestDomUtils::GetPrefabDomComponents(newTemplateDom, newTemplateEntityAliases.front()); - ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsArray()); - EXPECT_EQ(entityComponents->GetArray().Size(), 1); + ASSERT_TRUE(entityComponents != nullptr && entityComponents->IsObject()); + EXPECT_EQ(entityComponents->MemberCount(), 2); - PrefabDomValueConstReference entityComponentBoolPropertyValue = - PrefabDomUtils::FindPrefabDomValue(*entityComponents->Begin(), PrefabTestDomUtils::BoolPropertyName); - EXPECT_FALSE(entityComponentBoolPropertyValue.has_value()); + AZStd::string componentValueName = AZStd::string::format("Component_[%llu]", prefabTestComponent->GetId()); + PrefabDomValueConstReference wheelEntityComponentValue = PrefabDomUtils::FindPrefabDomValue(*entityComponents, componentValueName.c_str()); + ASSERT_TRUE(wheelEntityComponentValue); + + PrefabDomValueConstReference wheelEntityComponentBoolPropertyValue = + PrefabDomUtils::FindPrefabDomValue(wheelEntityComponentValue->get(), PrefabTestDomUtils::BoolPropertyName); + ASSERT_FALSE(wheelEntityComponentBoolPropertyValue.has_value()); // Update Template's Instances and validate if all Instances have no BoolProperty under their prefabTestComponents in entities. m_instanceUpdateExecutorInterface->AddTemplateInstancesToQueue(newTemplateId); @@ -438,7 +454,6 @@ namespace UnitTest EXPECT_TRUE(updateResult); PrefabTestDomUtils::ValidateInstances(newTemplateId, *entityComponents, entityComponentsPath); - } } diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateTemplateTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateTemplateTests.cpp index 831a0d16e9..ba239dfb92 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateTemplateTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateTemplateTests.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -65,6 +66,7 @@ namespace UnitTest PrefabDom updatedWheelInstance; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*wheelIsolatedInstance, updatedWheelInstance)); m_prefabSystemComponent->UpdatePrefabTemplate(wheelTemplateId, updatedWheelInstance); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that the wheel template has the same entities(2) as the updated instance. wheelTemplateEntityAliases = wheelIsolatedInstance->GetEntityAliases(); @@ -85,6 +87,8 @@ namespace UnitTest { // Create a single entity wheel instance and create a template out of it. AZ::Entity* wheelEntity = CreateEntity("WheelEntity1"); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{wheelEntity}); AZStd::unique_ptr wheelIsolatedInstance = m_prefabSystemComponent->CreatePrefab({ wheelEntity }, {}, WheelPrefabMockFilePath); const TemplateId wheelTemplateId = wheelIsolatedInstance->GetTemplateId(); @@ -116,13 +120,14 @@ namespace UnitTest PrefabDom updatedAxleInstanceDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*axleInstance, updatedAxleInstanceDom)); m_prefabSystemComponent->UpdatePrefabTemplate(axleTemplateId, updatedAxleInstanceDom); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that there are 2 wheel instances under axle wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId); ASSERT_EQ(wheelInstanceAliasesUnderAxle.size(), 2); // Validate that the wheels under the axle have the same DOM as the wheel template. - PrefabTestDomUtils::ValidatePrefabDomInstances(wheelInstanceAliasesUnderAxle, axleTemplateDom, wheelTemplateDom); + PrefabTestDomUtils::ValidatePrefabDomInstances(wheelInstanceAliasesUnderAxle, axleTemplateDom, wheelTemplateDom, false); // Validate that the axles under the car have the same DOM as the axle template. PrefabTestDomUtils::ValidatePrefabDomInstances(axleInstanceAliasesUnderCar, carTemplateDom, axleTemplateDom); @@ -170,17 +175,15 @@ namespace UnitTest PrefabDom updatedWheelInstanceDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*wheelIsolatedInstance, updatedWheelInstanceDom)); m_prefabSystemComponent->UpdatePrefabTemplate(wheelTemplateId, updatedWheelInstanceDom); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that the wheel entity does have a component under it. wheelEntityComponents = PrefabTestDomUtils::GetPrefabDomComponentsPath(entityAlias).Get(wheelTemplateDom); - ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsArray()); - EXPECT_EQ(wheelEntityComponents->GetArray().Size(), 1); + ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsObject()); + EXPECT_EQ(wheelEntityComponents->MemberCount(), 1); // Extract the component id of the entity in wheel template and verify that it matches with the component id of the wheel instance. - PrefabDomValueReference wheelEntityComponentIdValue = - PrefabDomUtils::FindPrefabDomValue(*wheelEntityComponents->Begin(), PrefabTestDomUtils::ComponentIdName); - ASSERT_TRUE(wheelEntityComponentIdValue.has_value()); - EXPECT_EQ(expectedComponentId, wheelEntityComponentIdValue->get().GetUint64()); + PrefabTestDomUtils::ValidateComponentsDomHasId(*wheelEntityComponents, expectedComponentId); // Validate that the wheels under the axle have the same DOM as the wheel template. PrefabTestDomUtils::ValidatePrefabDomInstances(wheelInstanceAliasesUnderAxle, axleTemplateDom, wheelTemplateDom); @@ -225,6 +228,7 @@ namespace UnitTest PrefabDom updatedWheelInstanceDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*wheelIsolatedInstance, updatedWheelInstanceDom)); m_prefabSystemComponent->UpdatePrefabTemplate(wheelTemplateId, updatedWheelInstanceDom); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that the wheel template only has 1 entity now. wheelTemplateEntityAliases = wheelIsolatedInstance->GetEntityAliases(); @@ -242,6 +246,8 @@ namespace UnitTest { // Create a single entity wheel instance and create a template out of it. AZ::Entity* wheelEntity = CreateEntity("WheelEntity1"); + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{wheelEntity}); AZStd::unique_ptr wheelIsolatedInstance = m_prefabSystemComponent->CreatePrefab({ wheelEntity }, {}, WheelPrefabMockFilePath); const TemplateId wheelTemplateId = wheelIsolatedInstance->GetTemplateId(); @@ -275,6 +281,7 @@ namespace UnitTest PrefabDom updatedAxleInstanceDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*axleInstance, updatedAxleInstanceDom)); m_prefabSystemComponent->UpdatePrefabTemplate(axleTemplateId, updatedAxleInstanceDom); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that there is only 1 wheel instances under axle wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId); @@ -282,7 +289,7 @@ namespace UnitTest EXPECT_EQ(wheelInstanceAliasesUnderAxle.front(), aliasOfWheelInstanceToRetain); // Validate that the wheels under the axle have the same DOM as the wheel template. - PrefabTestDomUtils::ValidatePrefabDomInstances(wheelInstanceAliasesUnderAxle, axleTemplateDom, wheelTemplateDom); + PrefabTestDomUtils::ValidatePrefabDomInstances(wheelInstanceAliasesUnderAxle, axleTemplateDom, wheelTemplateDom, false); // Validate that the axles under the car have the same DOM as the axle template. PrefabTestDomUtils::ValidatePrefabDomInstances(axleInstanceAliasesUnderCar, carTemplateDom, axleTemplateDom); @@ -307,14 +314,11 @@ namespace UnitTest AZStd::string entityAlias = wheelTemplateEntityAliases.front(); PrefabDomValue* wheelEntityComponents = PrefabTestDomUtils::GetPrefabDomComponentsPath(entityAlias).Get(wheelTemplateDom); - ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsArray()); - EXPECT_EQ(wheelEntityComponents->GetArray().Size(), 1); + ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsObject()); + EXPECT_EQ(wheelEntityComponents->MemberCount(), 1); // Extract the component id of the entity in wheel template and verify that it matches with the component id of the wheel instance. - PrefabDomValueReference wheelEntityComponentIdValue = - PrefabDomUtils::FindPrefabDomValue(*wheelEntityComponents->Begin(), PrefabTestDomUtils::ComponentIdName); - ASSERT_TRUE(wheelEntityComponentIdValue.has_value()); - EXPECT_EQ(prefabTestComponent->GetId(), wheelEntityComponentIdValue->get().GetUint64()); + PrefabTestDomUtils::ValidateComponentsDomHasId(*wheelEntityComponents, prefabTestComponent->GetId()); // Create an axle with 0 entities and 1 wheel instance. AZStd::unique_ptr wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId); @@ -337,6 +341,7 @@ namespace UnitTest PrefabDom updatedWheelInstanceDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*wheelIsolatedInstance, updatedWheelInstanceDom)); m_prefabSystemComponent->UpdatePrefabTemplate(wheelTemplateId, updatedWheelInstanceDom); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that the wheel entity does not have a component under it. wheelEntityComponents = PrefabTestDomUtils::GetPrefabDomComponentsPath(entityAlias).Get(wheelTemplateDom); @@ -370,14 +375,11 @@ namespace UnitTest AZStd::string entityAlias = wheelTemplateEntityAliases.front(); PrefabDomValue* wheelEntityComponents = PrefabTestDomUtils::GetPrefabDomComponentsPath(entityAlias).Get(wheelTemplateDom); - ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsArray()); - EXPECT_EQ(wheelEntityComponents->GetArray().Size(), 1); + ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsObject()); + EXPECT_EQ(wheelEntityComponents->MemberCount(), 1); // Extract the component id of the entity in wheel template and verify that it matches with the component id of the wheel instance. - PrefabDomValueReference wheelEntityComponentIdValue = - PrefabDomUtils::FindPrefabDomValue(*wheelEntityComponents->Begin(), PrefabTestDomUtils::ComponentIdName); - ASSERT_TRUE(wheelEntityComponentIdValue.has_value()); - EXPECT_EQ(prefabTestComponent->GetId(), wheelEntityComponentIdValue->get().GetUint64()); + PrefabTestDomUtils::ValidateComponentsDomHasId(*wheelEntityComponents, prefabTestComponent->GetId()); // Create an axle with 0 entities and 1 wheel instance. AZStd::unique_ptr wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId); @@ -400,15 +402,16 @@ namespace UnitTest PrefabDom updatedWheelInstanceDom; ASSERT_TRUE(PrefabDomUtils::StoreInstanceInPrefabDom(*wheelIsolatedInstance, updatedWheelInstanceDom)); m_prefabSystemComponent->UpdatePrefabTemplate(wheelTemplateId, updatedWheelInstanceDom); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that the prefabTestComponent in the wheel template DOM doesn't have a BoolProperty. // Even though we changed the property to false, it won't be serialized out because it's a default value. wheelEntityComponents = PrefabTestDomUtils::GetPrefabDomComponentsPath(entityAlias).Get(wheelTemplateDom); - ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsArray()); - EXPECT_EQ(wheelEntityComponents->GetArray().Size(), 1); + ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsObject()); + EXPECT_EQ(wheelEntityComponents->MemberCount(), 1); PrefabDomValueReference wheelEntityComponentBoolPropertyValue = - PrefabDomUtils::FindPrefabDomValue(*wheelEntityComponents->Begin(), PrefabTestDomUtils::BoolPropertyName); + PrefabDomUtils::FindPrefabDomValue(wheelEntityComponents->MemberBegin()->value, PrefabTestDomUtils::BoolPropertyName); ASSERT_FALSE(wheelEntityComponentBoolPropertyValue.has_value()); // Validate that the wheels under the axle have the same DOM as the wheel template. diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateWithPatchesTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateWithPatchesTests.cpp index 920715db9c..aef3cad5f3 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateWithPatchesTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUpdateWithPatchesTests.cpp @@ -16,6 +16,7 @@ #include #include +#include namespace UnitTest { @@ -34,8 +35,10 @@ namespace UnitTest AZ::Entity* wheelEntity = CreateEntity("WheelEntity1", false); PrefabTestComponent* prefabTestComponent = aznew PrefabTestComponent(true); wheelEntity->AddComponent(prefabTestComponent); - wheelEntity->Init(); - wheelEntity->Activate(); + AZ::ComponentId prefabTestComponentId = prefabTestComponent->GetId(); + + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, AzToolsFramework::EntityList{wheelEntity}); AZStd::unique_ptr wheelIsolatedInstance = m_prefabSystemComponent->CreatePrefab({ wheelEntity }, {}, WheelPrefabMockFilePath); const TemplateId wheelTemplateId = wheelIsolatedInstance->GetTemplateId(); @@ -45,18 +48,15 @@ namespace UnitTest // Validate that the wheel template has the same entities(1) as the instance it was created from. ASSERT_EQ(wheelTemplateEntityAliases.size(), 1); - // Validate that the wheel entity has 1 component under it. + // Validate that the wheel entity has 2 components. One of them is added through HandleEntitiesAdded() in EditorEntityContext. EntityAlias wheelEntityAlias = wheelTemplateEntityAliases.front(); PrefabDomValue* wheelEntityComponents = PrefabTestDomUtils::GetPrefabDomComponentsPath(wheelEntityAlias).Get(wheelTemplateDom); - ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsArray()); - EXPECT_EQ(wheelEntityComponents->GetArray().Size(), 1); + ASSERT_TRUE(wheelEntityComponents != nullptr && wheelEntityComponents->IsObject()); + EXPECT_EQ(wheelEntityComponents->MemberCount(), 2); // Extract the component id of the entity in wheel template and verify that it matches with the component id of the wheel instance. - PrefabDomValueReference wheelEntityComponentIdValue = - PrefabDomUtils::FindPrefabDomValue(*wheelEntityComponents->Begin(), PrefabTestDomUtils::ComponentIdName); - ASSERT_TRUE(wheelEntityComponentIdValue.has_value()); - EXPECT_EQ(prefabTestComponent->GetId(), wheelEntityComponentIdValue->get().GetUint64()); + PrefabTestDomUtils::ValidateComponentsDomHasId(*wheelEntityComponents, prefabTestComponentId); // Create an axle with 0 entities and 1 wheel instance. AZStd::unique_ptr wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId); @@ -77,10 +77,6 @@ namespace UnitTest const AZStd::vector axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId); PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId); - //activate the entity so we can access via transform bus - axleInstance->InitializeNestedEntities(); - axleInstance->ActivateNestedEntities(); - InstanceOptionalReference nestedWheelInstanceRef = axleInstance->FindNestedInstance(wheelInstanceAliasesUnderAxle[0]); ASSERT_TRUE(nestedWheelInstanceRef); @@ -97,7 +93,19 @@ namespace UnitTest // Retrieve the entity pointer from the component application bus. AZ::Entity* wheelEntityUnderAxle = nullptr; - AZ::ComponentApplicationBus::BroadcastResult(wheelEntityUnderAxle, &AZ::ComponentApplicationBus::Events::FindEntity, wheelEntityIdUnderAxle); + axleInstance->GetNestedEntities([&wheelEntityUnderAxle, wheelEntityIdUnderAxle](AZStd::unique_ptr& entity) + { + if (entity->GetId() == wheelEntityIdUnderAxle) + { + wheelEntityUnderAxle = entity.get(); + return false; + } + else + { + return true; + } + }); + ASSERT_NE(nullptr, wheelEntityUnderAxle); //create document with before change snapshot PrefabDom entityDomBefore; @@ -117,6 +125,7 @@ namespace UnitTest InstanceOptionalReference wheelInstanceUnderAxle = axleInstance->FindNestedInstance(wheelInstanceAliasesUnderAxle.front()); m_instanceToTemplateInterface->GeneratePatchForLink(patches, entityDomBefore, entityDomAfter, wheelInstanceUnderAxle->get().GetLinkId()); m_instanceToTemplateInterface->ApplyPatchesToInstance(wheelEntityIdUnderAxle, patches, topMostInstanceInHierarchy->get()); + m_instanceUpdateExecutorInterface->UpdateTemplateInstancesInQueue(); // Validate that the prefabTestComponent in the wheel instance under axle doesn't have a BoolProperty. // Even though we changed the property to false, it won't be serialized out because it's a default value. @@ -124,8 +133,13 @@ namespace UnitTest PrefabTestDomUtils::GetPrefabDomInstancePath(wheelInstanceAliasesUnderAxle.front()).Get(axleTemplateDom); wheelEntityComponents = PrefabTestDomUtils::GetPrefabDomComponentsPath(wheelEntityAlias).Get(*wheelInstanceDomUnderAxle); ASSERT_TRUE(wheelEntityComponents != nullptr); + + AZStd::string componentValueName = AZStd::string::format("Component_[%llu]", prefabTestComponentId); + PrefabDomValueReference wheelEntityComponentValue = PrefabDomUtils::FindPrefabDomValue(*wheelEntityComponents, componentValueName.c_str()); + ASSERT_TRUE(wheelEntityComponentValue); + PrefabDomValueReference wheelEntityComponentBoolPropertyValue = - PrefabDomUtils::FindPrefabDomValue(*wheelEntityComponents->Begin(), PrefabTestDomUtils::BoolPropertyName); + PrefabDomUtils::FindPrefabDomValue(wheelEntityComponentValue->get(), PrefabTestDomUtils::BoolPropertyName); ASSERT_FALSE(wheelEntityComponentBoolPropertyValue.has_value()); // Validate that the axles under the car have the same DOM as the axle template. diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableCreateTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableCreateTests.cpp index 3e8cd94119..2e1cd14b2a 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableCreateTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableCreateTests.cpp @@ -23,7 +23,8 @@ namespace UnitTest { AZStd::vector entitiesCreated; AZStd::unordered_set expectedEntityNameSet; - for (int i = 0; i < 3; i++) + const int normalEntityCount = 3; + for (int i = 0; i < normalEntityCount; i++) { entitiesCreated.push_back(CreateEntity(AZStd::string::format("Entity_%i", i).c_str())); expectedEntityNameSet.insert(entitiesCreated.back()->GetName()); @@ -33,17 +34,21 @@ namespace UnitTest m_prefabSystemComponent->CreatePrefab(entitiesCreated, {}, "test/path")); ASSERT_TRUE(instance); + ASSERT_TRUE(instance->HasContainerEntity()); + auto& containerEntity = instance->GetContainerEntity()->get(); + expectedEntityNameSet.insert(containerEntity.GetName()); + //Create Spawnable auto& prefabDom = m_prefabSystemComponent->FindTemplateDom(instance->GetTemplateId()); auto spawnable = ::AzToolsFramework::Prefab::SpawnableUtils::CreateSpawnable(prefabDom); - EXPECT_EQ(spawnable.GetEntities().size(), 3); + EXPECT_EQ(spawnable.GetEntities().size() - 1, normalEntityCount); // 1 for container entity const auto& spawnableEntities = spawnable.GetEntities(); AZStd::unordered_set actualEntityNameSet; - for (int i = 0; i < 3; i++) + for (const auto& spawnableEntity : spawnableEntities) { - actualEntityNameSet.insert(spawnableEntities[i]->GetName()); + actualEntityNameSet.insert(spawnableEntity->GetName()); } EXPECT_EQ(expectedEntityNameSet, actualEntityNameSet); @@ -53,7 +58,8 @@ namespace UnitTest { AZStd::vector entitiesCreated; AZStd::unordered_set expectedEntityNameSet; - for (int i = 0; i < 3; i++) + const int normalEntityCount = 3; + for (int i = 0; i < normalEntityCount; i++) { entitiesCreated.push_back(CreateEntity(AZStd::string::format("Entity_%i", i).c_str())); expectedEntityNameSet.insert(entitiesCreated.back()->GetName()); @@ -72,17 +78,21 @@ namespace UnitTest m_prefabSystemComponent->CreatePrefab({ entitiesCreated[2] }, MakeInstanceList(AZStd::move(secondInstance)), "test/path3")); ASSERT_TRUE(thirdInstance); + ASSERT_TRUE(thirdInstance->HasContainerEntity()); + auto& containerEntity = thirdInstance->GetContainerEntity()->get(); + expectedEntityNameSet.insert(containerEntity.GetName()); + //Create Spawnable auto& prefabDom = m_prefabSystemComponent->FindTemplateDom(thirdInstance->GetTemplateId()); auto spawnable = ::AzToolsFramework::Prefab::SpawnableUtils::CreateSpawnable(prefabDom); - EXPECT_EQ(spawnable.GetEntities().size(), 3); + EXPECT_EQ(spawnable.GetEntities().size() - 1, normalEntityCount); // 1 for container entity const auto& spawnableEntities = spawnable.GetEntities(); AZStd::unordered_set actualEntityNameSet; - for (int i = 0; i < 3; i++) + for (const auto& spawnableEntity : spawnableEntities) { - actualEntityNameSet.insert(spawnableEntities[i]->GetName()); + actualEntityNameSet.insert(spawnableEntity->GetName()); } EXPECT_EQ(expectedEntityNameSet, actualEntityNameSet); diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.cpp index dac2eeb787..152d09e9b7 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.cpp @@ -211,7 +211,7 @@ namespace UnitTest EXPECT_EQ(expectedResult, actualResult); AZStd::unique_ptr convertedInstance(aznew Instance()); - ASSERT_TRUE(AzToolsFramework::Prefab::PrefabDomUtils::LoadInstanceFromPrefabDom(*convertedInstance, m_prefabDom, false)); + ASSERT_TRUE(AzToolsFramework::Prefab::PrefabDomUtils::LoadInstanceFromPrefabDom(*convertedInstance, m_prefabDom)); convertedInstance->DetachNestedEntities( [this](AZStd::unique_ptr entity) diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.h b/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.h index 297a50f87c..ee84dab84a 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/SpawnableRemoveEditorInfoTestFixture.h @@ -117,7 +117,7 @@ namespace UnitTest AZ::SerializeContext* m_serializeContext{ nullptr }; PrefabSystemComponent* m_prefabSystemComponent{ nullptr }; PrefabConversionUtils::EditorInfoRemover m_editorInfoRemover; - PrefabConversionUtils::PrefabProcessorContext m_prefabProcessorContext; + PrefabConversionUtils::PrefabProcessorContext m_prefabProcessorContext{ AZ::Uuid::CreateRandom() }; PrefabDom m_prefabDom; }; } diff --git a/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp b/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp index f90c79666b..5533ab65fb 100644 --- a/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -209,7 +210,7 @@ namespace UnitTest m_app.Stop(); } - ToolsApplication m_app; + ToolsTestApplication m_app{ "PropertyTreeEditorTests" }; AZ::SerializeContext* m_serializeContext = nullptr; }; diff --git a/Code/Framework/AzToolsFramework/Tests/Slice.cpp b/Code/Framework/AzToolsFramework/Tests/Slice.cpp index 5086e39ca6..33160b9c20 100644 --- a/Code/Framework/AzToolsFramework/Tests/Slice.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Slice.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include namespace UnitTest { @@ -40,7 +42,7 @@ namespace UnitTest { AZ::ComponentApplication::Descriptor componentApplicationDesc; componentApplicationDesc.m_useExistingAllocator = true; - m_application = aznew AzToolsFramework::ToolsApplication(); + m_application = aznew ToolsTestApplication("SlicePushCyclicDependencyTest"); m_application->Start(componentApplicationDesc); // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash @@ -118,7 +120,7 @@ namespace UnitTest public: AZ::IO::LocalFileIO m_localFileIO; - AzToolsFramework::ToolsApplication* m_application = nullptr; + ToolsTestApplication* m_application = nullptr; AZStd::unordered_map> m_sliceAssets; }; @@ -128,6 +130,8 @@ namespace UnitTest // time. TEST_F(SlicePushCyclicDependencyTest, PushTwoSlicesToDependOnEachOther) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Entity* entity = aznew AZ::Entity("TestEntity0"); entity->CreateComponent(); AZ::Data::AssetId sliceAssetId0 = SaveAsSlice(entity); @@ -170,6 +174,8 @@ namespace UnitTest TEST_F(SlicePushCyclicDependencyTest, PushMultipleEntitiesOneOfChildrenCauseCyclicDependency) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Entity* tempAssetEntity = aznew AZ::Entity("TestEntity0"); tempAssetEntity->CreateComponent(); AZ::Data::AssetId sliceAssetId0 = SaveAsSlice(tempAssetEntity); @@ -275,6 +281,8 @@ namespace UnitTest TEST_F(SlicePushCyclicDependencyTest, PushSliceWithNewDuplicatedChild) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Entity* entity = aznew AZ::Entity("TestEntity0"); entity->CreateComponent(); AZ::Data::AssetId sliceAssetId0 = SaveAsSlice(entity); @@ -319,6 +327,8 @@ namespace UnitTest // (e.g. they would create a circular dependency). TEST_F(SlicePushCyclicDependencyTest, SlicePush_DontPushSomeChildren_ChildrenRemovedFromChildOrderArray) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Data::AssetManager& assetManager = AZ::Data::AssetManager::Instance(); // Create a slice @@ -471,6 +481,8 @@ namespace UnitTest // If the bug is present, a warning will be thrown which fails this unit test. TEST_F(SliceActivationOrderTest, ActivationOrderShouldNotAffectUndoCache) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create a parent entity with a transform component AZ::Entity* parentEntity = aznew AZ::Entity("TestParentEntity"); parentEntity->CreateComponent(); @@ -552,6 +564,8 @@ namespace UnitTest TEST_F(SlicePushWidgetTest, SlicePushWidget_CalculateLevelReferences_ReferenceCountCorrect) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create an entities and make it a slice. AZ::Entity* entity0 = aznew AZ::Entity("TestEntity0"); entity0->CreateComponent(); diff --git a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityCreateTests.cpp b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityCreateTests.cpp index d0de3d3816..fa2c2ca17e 100644 --- a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityCreateTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityCreateTests.cpp @@ -17,6 +17,8 @@ namespace UnitTest { TEST_F(SliceStabilityTest, CreateSlice_ValidSingleParentEntityWithValidChildEntity_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Generate Parent entity AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId parent = CreateEditorEntity("Parent", liveEntityIds); @@ -38,6 +40,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_ValidGrandparentParentChildHierarchy_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Build Grandparent->Parent->Child and link parent entities between them AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId grandparent = CreateEditorEntity("Grandparent", liveEntityIds); @@ -61,6 +65,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_10DeepParentChildHierarchy_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AzToolsFramework::EntityIdList liveEntityIds; // Build a 10 entity deep hierarchy @@ -86,6 +92,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_ValidParentWith10ValidChildren_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AzToolsFramework::EntityIdList liveEntityIds; // Create the parent entity and hold on to its id @@ -111,6 +119,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_ValidParentEntityWithValidChildEntity_OnlyChildEntityAddedToSlice_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AzToolsFramework::EntityIdList liveEntityIds; // Build parent and child entities and connect child to parent @@ -133,6 +143,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_EntityWithExternalReference_ExternalReferenceEntityAutoAddedToSlice_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Generate a root entity that will be referenced externally by the entities used to create the slice AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId externalRootId = CreateEditorEntity("ExternalRoot", liveEntityIds); @@ -174,6 +186,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_2ValidWithSharedParent_ParentNotIncludedInSliceCreate_ParentIsGenerated_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create a shared parent that won't be included in the CreateSlice call // Including a shared parent will validate that the generated parent becomes a child of the original parent // A generated parent is made because CreateSlice will not have a parent entity to work with and one is required @@ -273,6 +287,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_TestSubsliceOfSameType_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create a Root entity AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId rootEntity = CreateEditorEntity("Root", liveEntityIds); @@ -308,6 +324,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_TestSubsliceOfDifferentType_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create a root entity to be used in Slice1 AzToolsFramework::EntityIdList slice1Entities; AZ::EntityId slice1Root = CreateEditorEntity("Slice1Root", slice1Entities); @@ -365,6 +383,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_Test10DeepSliceAncestry_EntityStateRemainsTheSame_InstanceAncestryIntact_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::u32 totalAncestors = 10; // Generate a Root entity @@ -396,6 +416,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_Test5DeepSliceAncestryWithSubslices_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Generate a Root entity AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId rootEntity = CreateEditorEntity("Root", liveEntityIds); @@ -426,6 +448,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, CreateSlice_TestOverride_OverrideAppliesSuccesfully_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Generate a Root entity AzToolsFramework::EntityIdList liveEntityIds; ASSERT_TRUE(CreateEditorEntity("Root", liveEntityIds).IsValid()); diff --git a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityPushTests.cpp b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityPushTests.cpp index f75db3ae7f..08eac063c6 100644 --- a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityPushTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityPushTests.cpp @@ -16,6 +16,8 @@ namespace UnitTest { TEST_F(SliceStabilityTest, PushToSlice_PushSingleEntityToSlice_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create an entity to be used in a slice AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId sliceEntity = CreateEditorEntity("SliceEntity", liveEntityIds); @@ -48,6 +50,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, PushToSlice_PushSingleParentEntityWithChildEntity_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create an entity to be used as a slice root AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId sliceEntity = CreateEditorEntity("SliceEntity", liveEntityIds); @@ -86,6 +90,8 @@ namespace UnitTest // Disabled in SPEC-3077 TEST_F(SliceStabilityTest, DISABLED_PushToSlice_PushGrandparentParentChildHierarchy_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create an entity to be used as a slice root AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId sliceEntity = CreateEditorEntity("SliceEntity", liveEntityIds); @@ -124,6 +130,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, PushToSlice_Push10DeepParentChildHierarchy_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create an entity to be used as a slice root AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId sliceEntity = CreateEditorEntity("SliceEntity", liveEntityIds); @@ -161,6 +169,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, PushToSlice_Push10Children_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create an entity to be used as a slice root AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId sliceEntity = CreateEditorEntity("SliceEntity", liveEntityIds); @@ -200,6 +210,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, PushToSlice_PushNestedSliceOfDifferentType_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create an entity to be used for Slice1's root AzToolsFramework::EntityIdList slice1Entities; AZ::EntityId slice1Root = CreateEditorEntity("slice1Root", slice1Entities); @@ -254,6 +266,8 @@ namespace UnitTest TEST_F(SliceStabilityTest, PushToSliceAndCreateSlice_ValidateCombinationOfPushCreateOperations_EntityStateRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Create Slice1 root AzToolsFramework::EntityIdList slice1Entities; AZ::EntityId slice1Root = CreateEditorEntity("Slice1Root", slice1Entities); diff --git a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityReParentTests.cpp b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityReParentTests.cpp index a48859e5b8..20ea983743 100644 --- a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityReParentTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityReParentTests.cpp @@ -17,6 +17,8 @@ namespace UnitTest { TEST_F(SliceStabilityTest, ReParent_SliceEntityMovedFromOneInstanceToAnother_EntityIDRemainsTheSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AzToolsFramework::EntityIdList instance1Entities; AZ::EntityId instance1Root = CreateEditorEntity("Slice1Root", instance1Entities); ASSERT_TRUE(instance1Root.IsValid()); @@ -54,6 +56,8 @@ namespace UnitTest */ TEST_F(SliceStabilityTest, ReParent_NestedSliceCreatedFromSliceInstanceChild_SliceHierarchyRemainsSame_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AzToolsFramework::EntityIdList instance1Entities; AZ::EntityId instance1Root = CreateEditorEntity("Slice1Root", instance1Entities); ASSERT_TRUE(instance1Root.IsValid()); diff --git a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.cpp b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.cpp index 420104a58b..8455e6d669 100644 --- a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.cpp +++ b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.cpp @@ -667,6 +667,8 @@ namespace UnitTest // Sanity check test to confirm validator will catch differences TEST_F(SliceStabilityTest, ValidatorCompare_DifferenceInObjects_DifferenceDetected_FT) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Generate a root entity AzToolsFramework::EntityIdList liveEntityIds; AZ::EntityId rootEntityId = CreateEditorEntity("Root", liveEntityIds); diff --git a/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp b/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp index 36c320a283..2c17334043 100644 --- a/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp @@ -17,6 +17,7 @@ #include #include #include +#include namespace UnitTest { @@ -74,7 +75,7 @@ namespace UnitTest m_app.Stop(); } - AzToolsFramework::ToolsApplication m_app; + ToolsTestApplication m_app{ "ThumbnailerTests" }; AZ::ComponentApplication::Descriptor m_descriptor; AZ::Entity* m_testEntity = nullptr; diff --git a/Code/Framework/AzToolsFramework/Tests/ToolsComponents/EditorLayerComponentTests.cpp b/Code/Framework/AzToolsFramework/Tests/ToolsComponents/EditorLayerComponentTests.cpp index 777c880548..7b03b63dd0 100644 --- a/Code/Framework/AzToolsFramework/Tests/ToolsComponents/EditorLayerComponentTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ToolsComponents/EditorLayerComponentTests.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -25,6 +24,8 @@ #include #include #include +#include +#include #include #include @@ -203,6 +204,22 @@ namespace AzToolsFramework return true; } + class SliceToolsTestApplication : public UnitTest::ToolsTestApplication + { + public: + explicit SliceToolsTestApplication(AZStd::string applicationName) + : ToolsTestApplication(applicationName) + { + } + + protected: + bool IsPrefabSystemEnabled() const override + { + return false; + } + }; + + class EditorLayerComponentTest : public ::testing::Test , public UnitTest::TraceBusRedirector @@ -211,6 +228,7 @@ namespace AzToolsFramework void SetUp() override { m_app.Start(m_descriptor); + // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash // in the unit tests. @@ -231,8 +249,12 @@ namespace AzToolsFramework m_layerEntity.m_layer->CleanupLoadedLayer(); } m_editorLayerComponentTestHelperDescriptor->ReleaseDescriptor(); + + m_app.Stop(); AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); + + } // A few tests save a layer and want to check the state after saving. @@ -337,7 +359,7 @@ namespace AzToolsFramework } const char* m_entityName = "LayerEntityName"; - AzToolsFramework::ToolsApplication m_app; + SliceToolsTestApplication m_app{ "EditorLayerComponentTest" }; EntityAndLayerComponent m_layerEntity; AZ::ComponentApplication::Descriptor m_descriptor; AZ::ComponentDescriptor* m_editorLayerComponentTestHelperDescriptor = nullptr; @@ -1368,6 +1390,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RootSliceEntityEraseRestore_EntitiesRemovedAndRestoredCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity"); AZ::TransformBus::Event( childEntity->GetId(), @@ -1405,6 +1429,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_NestedLayersDoNotSaveLayersInLayers_LayersLoadCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + const AZStd::string childLayerName = "ChildLayerName"; EntityAndLayerComponent childLayer = CreateEntityWithLayer(childLayerName.c_str()); @@ -1440,6 +1466,8 @@ namespace AzToolsFramework // be saved to the LayerEntityName. TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadLayerLayerEntityHierarchy_LayersAndEntityLoadCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + const AZStd::string childLayerName = "ChildLayer"; EntityAndLayerComponent childLayerEntityAndComponent = CreateEntityWithLayer(childLayerName.c_str()); AZ::EntityId childLayerEntityId = childLayerEntityAndComponent.m_entity->GetId(); @@ -1512,6 +1540,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_SliceInstanceAddedToLayer_LayerHasUnsavedChanges) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance(); AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice); m_layerEntity.m_layer->ClearUnsavedChanges(); @@ -1533,6 +1563,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadInstanceInLayer_InstanceLoadsCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance(); AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice); AZ::TransformBus::Event( @@ -1675,6 +1707,8 @@ namespace AzToolsFramework */ TEST_F(EditorLayerComponentTest, LayerTests_DuplicateEntitiesInSceneAndLayer_DuplicateEntityIsDeleted) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity"); AZ::TransformBus::Event( childEntity->GetId(), @@ -1717,6 +1751,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_DuplicateEntitiesInLayer_DuplicateEntityIsDeleted) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity"); AZ::TransformBus::Event( childEntity->GetId(), @@ -1763,6 +1799,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RestoreNullLayer_FailsToRestore) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::EntityId invalidParentId; Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(nullptr, "RecoveredLayerName", invalidParentId); EXPECT_FALSE(recoveryResult.IsSuccess()); @@ -1770,6 +1808,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RestoreEmptyLayer_RestoresCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId(); // Check that the layer is in the scene. AZ::SliceComponent* rootSlice; @@ -1816,6 +1856,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerButLayerStillInScene_FailsToRestore) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId(); // Check that the layer is in the scene. AZ::SliceComponent* rootSlice; @@ -1851,6 +1893,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithEntityChild_RestoresCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId(); AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity"); @@ -1943,6 +1987,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithEntityChildStillInScene_FailsToRestore) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId(); AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity"); @@ -2019,6 +2065,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithSliceInstance_RestoresCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId(); // First, set up a layer with a slice instance in it. AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance(); @@ -2092,6 +2140,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithSliceInstanceStillInScene_FailsToRestore) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId(); // First, set up a layer with a slice instance in it. AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance(); @@ -2163,6 +2213,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_AttemptToCopyLayerComponent_IsNotCopyable) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + AZ::Entity::ComponentArrayType components; components.push_back(m_layerEntity.m_layer); @@ -2173,6 +2225,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_CheckOverwriteFlag_IsSetCorrectly) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + // Check layer created with correct value EXPECT_FALSE(m_layerEntity.m_layer->GetOverwriteFlag()); //check direct call works correctly @@ -2187,6 +2241,8 @@ namespace AzToolsFramework TEST_F(EditorLayerComponentTest, LayerTests_UndoRedoRestoreLayerWithChildren_AllRestoredEntitiesCorrect) { + AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true) + const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId(); AZ::SliceComponent* rootSlice; diff --git a/Code/Framework/Tests/CMakeLists.txt b/Code/Framework/Tests/CMakeLists.txt index d9a4d0f30a..c6bd51de47 100644 --- a/Code/Framework/Tests/CMakeLists.txt +++ b/Code/Framework/Tests/CMakeLists.txt @@ -9,12 +9,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -add_subdirectory(Physics) - if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) - ly_get_list_relative_pal_filename(common_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/Common) ly_add_target( NAME AzFrameworkTestShared STATIC diff --git a/Code/Framework/Tests/EngineTests.cpp b/Code/Framework/Tests/EngineTests.cpp deleted file mode 100644 index ff05020277..0000000000 --- a/Code/Framework/Tests/EngineTests.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include - -//////////////////////////////////////////////////////////////////////////////////////////////////// -namespace EngineTests -{ - - //////////////////////////////////////////////////////////////////////////////////////////////// - class EngineTest : public ::testing::Test - { - protected: - //////////////////////////////////////////////////////////////////////////////////////////// - void SetUp() override - { - - } - - //////////////////////////////////////////////////////////////////////////////////////////// - void TearDown() override - { - - } - - }; - - //////////////////////////////////////////////////////////////////////////////////////////////// - TEST_F(EngineTest, FindEngineRoot_EngineBelowExecutable_Success) - { - // We assume in this test that our engine lives above our binaries. If that's not the case we should pass in - // a valid path to a folder below the engine root to verify this functionality - auto foundRoot = AzFramework::Engine::FindEngineRoot(); - EXPECT_FALSE(foundRoot.empty()); - } - -#if AZ_TRAIT_DISABLE_FAILED_FRAMEWORK_TESTS - TEST_F(EngineTest, DISABLED_FindEngineRoot_StartTempFolder_NoRootFound) -#else - TEST_F(EngineTest, FindEngineRoot_StartTempFolder_NoRootFound) -#endif // AZ_TRAIT_DISABLE_FAILED_FRAMEWORK_TESTS - { - UnitTest::ScopedTemporaryDirectory tempDir; - auto foundRoot = AzFramework::Engine::FindEngineRoot(tempDir.GetDirectory()); - EXPECT_TRUE(foundRoot.empty()); - } - -} // namespace EngineTests diff --git a/Code/Framework/Tests/EntityOwnershipService/EntityOwnershipServiceTestFixture.cpp b/Code/Framework/Tests/EntityOwnershipService/EntityOwnershipServiceTestFixture.cpp index 02c096311c..dbaee9f543 100644 --- a/Code/Framework/Tests/EntityOwnershipService/EntityOwnershipServiceTestFixture.cpp +++ b/Code/Framework/Tests/EntityOwnershipService/EntityOwnershipServiceTestFixture.cpp @@ -14,6 +14,8 @@ #include #include +#include + namespace UnitTest { void EntityOwnershipServiceTestFixture::SetUpEntityOwnershipServiceTest() @@ -40,6 +42,9 @@ namespace UnitTest AZ::ComponentTypeList EntityOwnershipServiceTestFixture::EntityOwnershipServiceApplication::GetRequiredSystemComponents() const { AZ::ComponentTypeList defaultRequiredComponents = AzFramework::Application::GetRequiredSystemComponents(); + + defaultRequiredComponents.emplace_back(azrtti_typeid()); + auto findComponentIterator = AZStd::find(defaultRequiredComponents.begin(), defaultRequiredComponents.end(), azrtti_typeid()); if (findComponentIterator != defaultRequiredComponents.end()) diff --git a/Code/Framework/Tests/Physics/CMakeLists.txt b/Code/Framework/Tests/Physics/CMakeLists.txt deleted file mode 100644 index b833b4d8f5..0000000000 --- a/Code/Framework/Tests/Physics/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) - - ly_add_target( - NAME AzPhysicsTests HEADERONLY - NAMESPACE AZ - FILES_CMAKE - azphysicstests_files.cmake - INCLUDE_DIRECTORIES - INTERFACE - .. - BUILD_DEPENDENCIES - INTERFACE - AZ::AzFramework - ) - -endif() \ No newline at end of file diff --git a/Code/Framework/Tests/Physics/PhysicsComponentBusTests.inl b/Code/Framework/Tests/Physics/PhysicsComponentBusTests.inl deleted file mode 100644 index ed10109bd6..0000000000 --- a/Code/Framework/Tests/Physics/PhysicsComponentBusTests.inl +++ /dev/null @@ -1,988 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -namespace Physics -{ - TEST_F(PhysicsComponentBusTest, SetLinearDamping_DynamicSphere_MoreDampedBodyFallsSlower) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); - - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::SetLinearDamping, 0.1f); - Physics::RigidBodyRequestBus::Event(sphereB->GetId(), - &Physics::RigidBodyRequests::SetLinearDamping, 0.2f); - - UpdateDefaultWorld(60); - - float dampingA, dampingB; - Physics::RigidBodyRequestBus::EventResult(dampingA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetLinearDamping); - Physics::RigidBodyRequestBus::EventResult(dampingB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetLinearDamping); - EXPECT_NEAR(dampingA, 0.1f, 1e-3f); - EXPECT_NEAR(dampingB, 0.2f, 1e-3f); - - float zA = GetPositionElement(sphereA, 2); - float zB = GetPositionElement(sphereB, 2); - EXPECT_GT(zB, zA); - - AZ::Vector3 vA = AZ::Vector3::CreateZero(); - AZ::Vector3 vB = AZ::Vector3::CreateZero(); - Physics::RigidBodyRequestBus::EventResult(vA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetLinearVelocity); - Physics::RigidBodyRequestBus::EventResult(vB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetLinearVelocity); - EXPECT_GT(static_cast(vA.GetLength()), static_cast(vB.GetLength())); - - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, SetLinearDampingNegative_DynamicSphere_NegativeValueRejected) - { - ErrorHandler errorHandler("Negative linear damping value"); - - auto sphere = AddSphereEntity(AZ::Vector3::CreateZero(), 0.5f); - - float damping = 0.0f, initialDamping = 0.0f; - Physics::RigidBodyRequestBus::EventResult(initialDamping, sphere->GetId(), - &Physics::RigidBodyRequests::GetLinearDamping); - - // a negative damping value should be rejected and the damping should remain at its previous value - Physics::RigidBodyRequestBus::Event(sphere->GetId(), - &Physics::RigidBodyRequests::SetLinearDamping, -0.1f); - Physics::RigidBodyRequestBus::EventResult(damping, sphere->GetId(), - &Physics::RigidBodyRequests::GetLinearDamping); - - EXPECT_NEAR(damping, initialDamping, 1e-3f); - EXPECT_TRUE(errorHandler.GetWarningCount() > 0); - - delete sphere; - } - - TEST_F(PhysicsComponentBusTest, SetAngularDamping_DynamicSphere_MoreDampedBodyRotatesSlower) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 1.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 1.0f), 0.5f); - auto floor = AddStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); - - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::SetAngularDamping, 0.1f); - Physics::RigidBodyRequestBus::Event(sphereB->GetId(), - &Physics::RigidBodyRequests::SetAngularDamping, 0.2f); - - float dampingA, dampingB; - Physics::RigidBodyRequestBus::EventResult(dampingA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetAngularDamping); - Physics::RigidBodyRequestBus::EventResult(dampingB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetAngularDamping); - EXPECT_NEAR(dampingA, 0.1f, 1e-3f); - EXPECT_NEAR(dampingB, 0.2f, 1e-3f); - - AZ::Vector3 impulse(10.0f, 0.0f, 0.0f); - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::ApplyLinearImpulse, impulse); - Physics::RigidBodyRequestBus::Event(sphereB->GetId(), - &Physics::RigidBodyRequests::ApplyLinearImpulse, impulse); - - UpdateDefaultWorld(10); - auto angularVelocityA = AZ::Vector3::CreateZero(); - auto angularVelocityB = AZ::Vector3::CreateZero(); - - for (int timestep = 0; timestep < 10; timestep++) - { - Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - EXPECT_GT(static_cast(angularVelocityA.GetLength()), static_cast(angularVelocityB.GetLength())); - UpdateDefaultWorld(1); - } - - delete floor; - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, SetAngularDampingNegative_DynamicSphere_NegativeValueRejected) - { - ErrorHandler errorHandler("Negative angular damping value"); - - auto sphere = AddSphereEntity(AZ::Vector3::CreateZero(), 0.5f); - - float damping = 0.0f, initialDamping = 0.0f; - Physics::RigidBodyRequestBus::EventResult(initialDamping, sphere->GetId(), - &Physics::RigidBodyRequests::GetAngularDamping); - - // a negative damping value should be rejected and the damping should remain at its previous value - Physics::RigidBodyRequestBus::Event(sphere->GetId(), - &Physics::RigidBodyRequests::SetAngularDamping, -0.1f); - Physics::RigidBodyRequestBus::EventResult(damping, sphere->GetId(), - &Physics::RigidBodyRequests::GetAngularDamping); - - EXPECT_NEAR(damping, initialDamping, 1e-3f); - EXPECT_TRUE(errorHandler.GetWarningCount() > 0); - - delete sphere; - } - - TEST_F(PhysicsComponentBusTest, AddImpulse_DynamicSphere_AffectsTrajectory) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); - - AZ::Vector3 impulse(10.0f, 0.0f, 0.0f); - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::ApplyLinearImpulse, impulse); - - for (int i = 1; i < 10; i++) - { - float xPreviousA = GetPositionElement(sphereA, 0); - float xPreviousB = GetPositionElement(sphereB, 0); - UpdateDefaultWorld(10); - EXPECT_GT(GetPositionElement(sphereA, 0), xPreviousA); - EXPECT_NEAR(GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); - } - - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, SetLinearVelocity_DynamicSphere_AffectsTrajectory) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); - - AZ::Vector3 velocity(10.0f, 0.0f, 0.0f); - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::SetLinearVelocity, velocity); - - for (int i = 1; i < 10; i++) - { - float xPreviousA = GetPositionElement(sphereA, 0); - float xPreviousB = GetPositionElement(sphereB, 0); - UpdateDefaultWorld(10); - EXPECT_GT(GetPositionElement(sphereA, 0), xPreviousA); - EXPECT_NEAR(GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); - } - - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, AddImpulseAtWorldPoint_DynamicSphere_AffectsTrajectoryAndRotation) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); - - AZ::Vector3 impulse(10.0f, 0.0f, 0.0f); - AZ::Vector3 worldPoint(0.0f, -5.0f, 0.25f); - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::ApplyLinearImpulseAtWorldPoint, impulse, worldPoint); - - AZ::Vector3 angularVelocityA = AZ::Vector3::CreateZero(); - AZ::Vector3 angularVelocityB = AZ::Vector3::CreateZero(); - - for (int i = 1; i < 10; i++) - { - float xPreviousA = GetPositionElement(sphereA, 0); - float xPreviousB = GetPositionElement(sphereB, 0); - UpdateDefaultWorld(10); - EXPECT_GT(GetPositionElement(sphereA, 0), xPreviousA); - EXPECT_NEAR(GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); - - Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - EXPECT_FALSE(angularVelocityA.IsClose(AZ::Vector3::CreateZero())); - EXPECT_NEAR(static_cast(angularVelocityA.GetX()), 0.0f, 1e-3f); - EXPECT_NEAR(static_cast(angularVelocityA.GetZ()), 0.0f, 1e-3f); - EXPECT_TRUE(angularVelocityB.IsClose(AZ::Vector3::CreateZero())); - } - - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, AddAngularImpulse_DynamicSphere_AffectsRotation) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); - - AZ::Vector3 angularImpulse(0.0f, 10.0f, 0.0f); - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::ApplyAngularImpulse, angularImpulse); - - for (int i = 1; i < 10; i++) - { - float xPreviousA = GetPositionElement(sphereA, 0); - float xPreviousB = GetPositionElement(sphereB, 0); - UpdateDefaultWorld(10); - EXPECT_NEAR(GetPositionElement(sphereA, 0), xPreviousA, 1e-3f); - EXPECT_NEAR(GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); - - AZ::Vector3 angularVelocityA = AZ::Vector3::CreateZero(); - AZ::Vector3 angularVelocityB = AZ::Vector3::CreateZero(); - Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - EXPECT_FALSE(angularVelocityA.IsClose(AZ::Vector3::CreateZero())); - EXPECT_NEAR(static_cast(angularVelocityA.GetX()), 0.0f, 1e-3f); - EXPECT_NEAR(static_cast(angularVelocityA.GetZ()), 0.0f, 1e-3f); - EXPECT_TRUE(angularVelocityB.IsClose(AZ::Vector3::CreateZero())); - } - - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, SetAngularVelocity_DynamicSphere_AffectsRotation) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); - - AZ::Vector3 angularVelocity(0.0f, 10.0f, 0.0f); - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::SetAngularVelocity, angularVelocity); - - for (int i = 1; i < 10; i++) - { - float xPreviousA = GetPositionElement(sphereA, 0); - float xPreviousB = GetPositionElement(sphereB, 0); - UpdateDefaultWorld(10); - EXPECT_NEAR(GetPositionElement(sphereA, 0), xPreviousA, 1e-3f); - EXPECT_NEAR(GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); - - AZ::Vector3 angularVelocityA = AZ::Vector3::CreateZero(); - AZ::Vector3 angularVelocityB = AZ::Vector3::CreateZero(); - Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetAngularVelocity); - EXPECT_FALSE(angularVelocityA.IsClose(AZ::Vector3::CreateZero())); - EXPECT_NEAR(static_cast(angularVelocityA.GetX()), 0.0f, 1e-3f); - EXPECT_NEAR(static_cast(angularVelocityA.GetZ()), 0.0f, 1e-3f); - EXPECT_TRUE(angularVelocityB.IsClose(AZ::Vector3::CreateZero())); - } - - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, GetLinearVelocity_FallingSphere_VelocityIncreasesOverTime) - { - auto sphere = AddSphereEntity(AZ::Vector3(0.0f, 0.0f, 0.0f), 0.5f); - Physics::RigidBodyRequestBus::Event(sphere->GetId(), - &Physics::RigidBodyRequests::SetLinearDamping, 0.0f); - - float previousSpeed = 0.0f; - - for (int timestep = 0; timestep < 60; timestep++) - { - UpdateDefaultWorld(1); - AZ::Vector3 velocity; - Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), - &Physics::RigidBodyRequests::GetLinearVelocity); - float speed = velocity.GetLength(); - EXPECT_GT(speed, previousSpeed); - previousSpeed = speed; - } - - delete sphere; - } - - TEST_F(PhysicsComponentBusTest, SetSleepThreshold_RollingSpheres_LowerThresholdSphereTravelsFurther) - { - auto sphereA = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 1.0f), 0.5f); - auto sphereB = AddSphereEntity(AZ::Vector3(0.0f, 5.0f, 1.0f), 0.5f); - auto floor = AddStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); - - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::SetAngularDamping, 0.75f); - Physics::RigidBodyRequestBus::Event(sphereB->GetId(), - &Physics::RigidBodyRequests::SetAngularDamping, 0.75f); - - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::SetSleepThreshold, 1.0f); - Physics::RigidBodyRequestBus::Event(sphereB->GetId(), - &Physics::RigidBodyRequests::SetSleepThreshold, 0.5f); - - float sleepThresholdA, sleepThresholdB; - Physics::RigidBodyRequestBus::EventResult(sleepThresholdA, sphereA->GetId(), - &Physics::RigidBodyRequests::GetSleepThreshold); - Physics::RigidBodyRequestBus::EventResult(sleepThresholdB, sphereB->GetId(), - &Physics::RigidBodyRequests::GetSleepThreshold); - - EXPECT_NEAR(sleepThresholdA, 1.0f, 1e-3f); - EXPECT_NEAR(sleepThresholdB, 0.5f, 1e-3f); - - AZ::Vector3 impulse(0.0f, 0.1f, 0.0f); - Physics::RigidBodyRequestBus::Event(sphereA->GetId(), - &Physics::RigidBodyRequests::ApplyAngularImpulse, impulse); - Physics::RigidBodyRequestBus::Event(sphereB->GetId(), - &Physics::RigidBodyRequests::ApplyAngularImpulse, impulse); - - UpdateDefaultWorld(300); - - EXPECT_GT(GetPositionElement(sphereB, 0), GetPositionElement(sphereA, 0)); - - delete floor; - delete sphereA; - delete sphereB; - } - - TEST_F(PhysicsComponentBusTest, SetSleepThresholdNegative_DynamicSphere_NegativeValueRejected) - { - ErrorHandler errorHandler("Negative sleep threshold value"); - - auto sphere = AddSphereEntity(AZ::Vector3(0.0f, -5.0f, 1.0f), 0.5f); - - float threshold = 0.0f, initialThreshold = 0.0f; - Physics::RigidBodyRequestBus::EventResult(initialThreshold, sphere->GetId(), - &Physics::RigidBodyRequests::GetSleepThreshold); - Physics::RigidBodyRequestBus::Event(sphere->GetId(), - &Physics::RigidBodyRequests::SetSleepThreshold, -0.5f); - Physics::RigidBodyRequestBus::EventResult(threshold, sphere->GetId(), - &Physics::RigidBodyRequests::GetSleepThreshold); - - EXPECT_NEAR(threshold, initialThreshold, 1e-3f); - EXPECT_TRUE(errorHandler.GetWarningCount() > 0); - - delete sphere; - } - - TEST_F(PhysicsComponentBusTest, SetMass_Seesaw_TipsDownAtHeavierEnd) - { - auto floor = AddStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); - auto pivot = AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 0.7f), AZ::Vector3(0.4f, 1.0f, 0.4f)); - auto seesaw = AddBoxEntity(AZ::Vector3(0.0f, 0.0f, 0.95f), AZ::Vector3(20.0f, 1.0f, 0.1f)); - auto boxA = AddBoxEntity(AZ::Vector3(-9.0f, 0.0f, 1.5f), AZ::Vector3::CreateOne()); - auto boxB = AddBoxEntity(AZ::Vector3(9.0f, 0.0f, 1.5f), AZ::Vector3::CreateOne()); - - Physics::RigidBodyRequestBus::Event(boxA->GetId(), &Physics::RigidBodyRequests::SetMass, 5.0f); - float mass = 0.0f; - Physics::RigidBodyRequestBus::EventResult(mass, boxA->GetId(), - &Physics::RigidBodyRequests::GetMass); - EXPECT_NEAR(mass, 5.0f, 1e-3f); - - UpdateDefaultWorld(30); - EXPECT_GT(1.5f, GetPositionElement(boxA, 2)); - EXPECT_LT(1.5f, GetPositionElement(boxB, 2)); - - Physics::RigidBodyRequestBus::Event(boxB->GetId(), &Physics::RigidBodyRequests::SetMass, 20.0f); - Physics::RigidBodyRequestBus::EventResult(mass, boxB->GetId(), - &Physics::RigidBodyRequests::GetMass); - EXPECT_NEAR(mass, 20.0f, 1e-3f); - - UpdateDefaultWorld(60); - EXPECT_LT(1.5f, GetPositionElement(boxA, 2)); - EXPECT_GT(1.5f, GetPositionElement(boxB, 2)); - - delete floor; - delete pivot; - delete seesaw; - delete boxA; - delete boxB; - } - - TEST_F(PhysicsComponentBusTest, GetAabb_Sphere_ValidExtents) - { - AZ::Vector3 spherePosition(2.0f, -3.0f, 1.0f); - auto sphere = AddSphereEntity(spherePosition, 0.5f); - - AZ::Aabb sphereAabb; - Physics::RigidBodyRequestBus::EventResult(sphereAabb, sphere->GetId(), - &Physics::RigidBodyRequests::GetAabb); - - EXPECT_TRUE(sphereAabb.GetMin().IsClose(spherePosition - 0.5f * AZ::Vector3::CreateOne())); - EXPECT_TRUE(sphereAabb.GetMax().IsClose(spherePosition + 0.5f * AZ::Vector3::CreateOne())); - - // rotate the sphere and check the bounding box is still correct - AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); - AZ::TransformBus::Event(sphere->GetId(), &AZ::TransformInterface::SetWorldTM, - AZ::Transform::CreateFromQuaternionAndTranslation(quat, spherePosition)); - sphere->Deactivate(); - sphere->Activate(); - - Physics::RigidBodyRequestBus::EventResult(sphereAabb, sphere->GetId(), - &Physics::RigidBodyRequests::GetAabb); - - EXPECT_TRUE(sphereAabb.GetMin().IsClose(spherePosition - 0.5f * AZ::Vector3::CreateOne())); - EXPECT_TRUE(sphereAabb.GetMax().IsClose(spherePosition + 0.5f * AZ::Vector3::CreateOne())); - - delete sphere; - } - - TEST_F(PhysicsComponentBusTest, GetAabb_Box_ValidExtents) - { - AZ::Vector3 boxPosition(2.0f, -3.0f, 1.0f); - AZ::Vector3 boxDimensions(3.0f, 4.0f, 5.0f); - auto box = AddBoxEntity(boxPosition, boxDimensions); - - AZ::Aabb boxAabb; - Physics::RigidBodyRequestBus::EventResult(boxAabb, box->GetId(), - &Physics::RigidBodyRequests::GetAabb); - - EXPECT_TRUE(boxAabb.GetMin().IsClose(boxPosition - 0.5f * boxDimensions)); - EXPECT_TRUE(boxAabb.GetMax().IsClose(boxPosition + 0.5f * boxDimensions)); - - // rotate the box and check the bounding box is still correct - AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); - AZ::TransformBus::Event(box->GetId(), &AZ::TransformInterface::SetWorldTM, - AZ::Transform::CreateFromQuaternionAndTranslation(quat, boxPosition)); - box->Deactivate(); - box->Activate(); - - Physics::RigidBodyRequestBus::EventResult(boxAabb, box->GetId(), - &Physics::RigidBodyRequests::GetAabb); - - AZ::Vector3 expectedRotatedDimensions(3.5f * sqrtf(2.0f), 3.5f * sqrtf(2.0f), 5.0f); - EXPECT_TRUE(boxAabb.GetMin().IsClose(boxPosition - 0.5f * expectedRotatedDimensions)); - EXPECT_TRUE(boxAabb.GetMax().IsClose(boxPosition + 0.5f * expectedRotatedDimensions)); - - delete box; - } - - TEST_F(PhysicsComponentBusTest, GetAabb_Capsule_ValidExtents) - { - AZ::Vector3 capsulePosition(1.0f, -3.0f, 5.0f); - float capsuleHeight = 2.0f; - float capsuleRadius = 0.3f; - auto capsule = AddCapsuleEntity(capsulePosition, capsuleHeight, capsuleRadius); - - AZ::Aabb capsuleAabb; - Physics::RigidBodyRequestBus::EventResult(capsuleAabb, capsule->GetId(), - &Physics::RigidBodyRequests::GetAabb); - - AZ::Vector3 expectedCapsuleHalfExtents(capsuleRadius, capsuleRadius, 0.5f * capsuleHeight); - - EXPECT_TRUE(capsuleAabb.GetMin().IsClose(capsulePosition - expectedCapsuleHalfExtents)); - EXPECT_TRUE(capsuleAabb.GetMax().IsClose(capsulePosition + expectedCapsuleHalfExtents)); - - // rotate the capsule and check the bounding box is still correct - AZ::Quaternion quat = AZ::Quaternion::CreateRotationY(0.25f * AZ::Constants::Pi); - AZ::TransformBus::Event(capsule->GetId(), &AZ::TransformInterface::SetWorldTM, - AZ::Transform::CreateFromQuaternionAndTranslation(quat, capsulePosition)); - capsule->Deactivate(); - capsule->Activate(); - - Physics::RigidBodyRequestBus::EventResult(capsuleAabb, capsule->GetId(), - &Physics::RigidBodyRequests::GetAabb); - - float rotatedHalfHeight = 0.25f * sqrtf(2.0f) * capsuleHeight + (1.0f - 0.5f * sqrt(2.0f)) * capsuleRadius; - expectedCapsuleHalfExtents = AZ::Vector3(rotatedHalfHeight, capsuleRadius, rotatedHalfHeight); - EXPECT_TRUE(capsuleAabb.GetMin().IsClose(capsulePosition - expectedCapsuleHalfExtents)); - EXPECT_TRUE(capsuleAabb.GetMax().IsClose(capsulePosition + expectedCapsuleHalfExtents)); - - delete capsule; - } - - TEST_F(PhysicsComponentBusTest, ForceAwakeForceAsleep_DynamicSphere_SleepStateCorrect) - { - auto floor = AddStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); - auto boxA = AddBoxEntity(AZ::Vector3(-5.0f, 0.0f, 1.0f), AZ::Vector3::CreateOne()); - auto boxB = AddBoxEntity(AZ::Vector3(5.0f, 0.0f, 100.0f), AZ::Vector3::CreateOne()); - - UpdateDefaultWorld(60); - bool isAwakeA = false; - bool isAwakeB = false; - Physics::RigidBodyRequestBus::EventResult(isAwakeA, boxA->GetId(), - &Physics::RigidBodyRequests::IsAwake); - Physics::RigidBodyRequestBus::EventResult(isAwakeB, boxB->GetId(), - &Physics::RigidBodyRequests::IsAwake); - - EXPECT_FALSE(isAwakeA); - EXPECT_TRUE(isAwakeB); - - Physics::RigidBodyRequestBus::Event(boxA->GetId(), &Physics::RigidBodyRequests::ForceAwake); - Physics::RigidBodyRequestBus::Event(boxB->GetId(), &Physics::RigidBodyRequests::ForceAsleep); - - UpdateDefaultWorld(1); - - Physics::RigidBodyRequestBus::EventResult(isAwakeA, boxA->GetId(), - &Physics::RigidBodyRequests::IsAwake); - Physics::RigidBodyRequestBus::EventResult(isAwakeB, boxB->GetId(), - &Physics::RigidBodyRequests::IsAwake); - - EXPECT_TRUE(isAwakeA); - EXPECT_FALSE(isAwakeB); - - UpdateDefaultWorld(60); - - Physics::RigidBodyRequestBus::EventResult(isAwakeA, boxA->GetId(), - &Physics::RigidBodyRequests::IsAwake); - Physics::RigidBodyRequestBus::EventResult(isAwakeB, boxB->GetId(), - &Physics::RigidBodyRequests::IsAwake); - - EXPECT_FALSE(isAwakeA); - EXPECT_FALSE(isAwakeB); - - delete boxA; - delete boxB; - delete floor; - } - - TEST_F(PhysicsComponentBusTest, DisableEnablePhysics_DynamicSphere) - { - using namespace AzFramework; - - auto sphere = AddSphereEntity(AZ::Vector3(0.0f, 0.0f, 0.0f), 0.5f); - Physics::RigidBodyRequestBus::Event(sphere->GetId(), &Physics::RigidBodyRequests::SetLinearDamping, 0.0f); - - AZ::Vector3 velocity; - float previousSpeed = 0.0f; - for (int timestep = 0; timestep < 30; timestep++) - { - UpdateDefaultWorld(1); - Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), &Physics::RigidBodyRequests::GetLinearVelocity); - previousSpeed = velocity.GetLength(); - } - - // Disable physics - Physics::RigidBodyRequestBus::Event(sphere->GetId(), &Physics::RigidBodyRequests::DisablePhysics); - - // Check speed is not changing - for (int timestep = 0; timestep < 60; timestep++) - { - UpdateDefaultWorld(1); - Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), &Physics::RigidBodyRequests::GetLinearVelocity); - float speed = velocity.GetLength(); - EXPECT_FLOAT_EQ(speed, previousSpeed); - previousSpeed = speed; - } - - // Check physics is disabled - bool physicsEnabled = true; - Physics::RigidBodyRequestBus::EventResult(physicsEnabled, sphere->GetId(), &Physics::RigidBodyRequests::IsPhysicsEnabled); - EXPECT_FALSE(physicsEnabled); - - // Enable physics - Physics::RigidBodyRequestBus::Event(sphere->GetId(), &Physics::RigidBodyRequests::EnablePhysics); - - // Check speed is increasing - for (int timestep = 0; timestep < 60; timestep++) - { - UpdateDefaultWorld(1); - Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), &Physics::RigidBodyRequests::GetLinearVelocity); - float speed = velocity.GetLength(); - EXPECT_GT(speed, previousSpeed); - previousSpeed = speed; - } - - delete sphere; - } - - TEST_F(PhysicsComponentBusTest, Shape_Box_GetAabbIsCorrect) - { - Physics::ColliderConfiguration colliderConfig; - Physics::BoxShapeConfiguration shapeConfiguration; - shapeConfiguration.m_dimensions = AZ::Vector3(20.f, 20.f, 20.f); - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); - const AZ::Aabb localAabb = shape->GetAabbLocal(); - EXPECT_TRUE(localAabb.GetMin().IsClose(-shapeConfiguration.m_dimensions / 2.f) - && localAabb.GetMax().IsClose(shapeConfiguration.m_dimensions / 2.f)); - - AZ::Vector3 worldOffset = AZ::Vector3(0, 0, 40.f); - AZ::Transform worldTransform = AZ::Transform::Identity(); - worldTransform.SetTranslation(worldOffset); - const AZ::Aabb worldAabb = shape->GetAabb(worldTransform); - EXPECT_TRUE(worldAabb.GetMin().IsClose((-shapeConfiguration.m_dimensions / 2.f) + worldOffset) - && worldAabb.GetMax().IsClose((shapeConfiguration.m_dimensions / 2.f) + worldOffset)); - } - - TEST_F(PhysicsComponentBusTest, Shape_Sphere_GetAabbIsCorrect) - { - const float radius = 20.f; - Physics::ColliderConfiguration colliderConfig; - Physics::SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = radius; - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); - const AZ::Aabb localAabb = shape->GetAabbLocal(); - EXPECT_TRUE(localAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -radius)) - && localAabb.GetMax().IsClose(AZ::Vector3(radius, radius, radius))); - - AZ::Vector3 worldOffset = AZ::Vector3(0, 0, 40.f); - AZ::Transform worldTransform = AZ::Transform::Identity(); - worldTransform.SetTranslation(worldOffset); - const AZ::Aabb worldAabb = shape->GetAabb(worldTransform); - EXPECT_TRUE(worldAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -radius) + worldOffset) - && worldAabb.GetMax().IsClose(AZ::Vector3(radius, radius, radius) + worldOffset)); - } - - TEST_F(PhysicsComponentBusTest, Shape_Capsule_GetAabbIsCorrect) - { - const float radius = 20.f; - const float height = 80.f; - Physics::ColliderConfiguration colliderConfig; - Physics::CapsuleShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = radius; - shapeConfiguration.m_height = height; - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); - const AZ::Aabb localAabb = shape->GetAabbLocal(); - EXPECT_TRUE(localAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -height / 2.f)) - && localAabb.GetMax().IsClose(AZ::Vector3(radius, radius, height / 2.f))); - - AZ::Vector3 worldOffset = AZ::Vector3(0, 0, 40.f); - AZ::Transform worldTransform = AZ::Transform::Identity(); - worldTransform.SetTranslation(worldOffset); - const AZ::Aabb worldAabb = shape->GetAabb(worldTransform); - EXPECT_TRUE(worldAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -height / 2.f) + worldOffset) - && worldAabb.GetMax().IsClose(AZ::Vector3(radius, radius, height / 2.f) + worldOffset)); - } - - TEST_F(PhysicsComponentBusTest, WorldBodyBus_RigidBodyColliders_AABBAreCorrect) - { - // Create 3 colliders, one of each type and check that the AABB of their body is the expected - AZStd::unique_ptr box = AZStd::unique_ptr(AddBoxEntity(AZ::Vector3(0, 0, 0), AZ::Vector3(32, 32, 32))); - AZ::Aabb boxAABB; - Physics::WorldBodyRequestBus::EventResult(boxAABB, box->GetId(), &Physics::WorldBodyRequests::GetAabb); - EXPECT_TRUE(boxAABB.GetMin().IsClose(AZ::Vector3(-16, -16, -16)) && boxAABB.GetMax().IsClose(AZ::Vector3(16, 16, 16))); - - AZStd::unique_ptr sphere = AZStd::unique_ptr(AddSphereEntity(AZ::Vector3(-100, 0, 0), 16)); - AZ::Aabb sphereAABB; - Physics::WorldBodyRequestBus::EventResult(sphereAABB, sphere->GetId(), &Physics::WorldBodyRequests::GetAabb); - EXPECT_TRUE(sphereAABB.GetMin().IsClose(AZ::Vector3(-16 -100, -16, -16)) && sphereAABB.GetMax().IsClose(AZ::Vector3(16 -100, 16, 16))); - - AZStd::unique_ptr capsule = AZStd::unique_ptr(AddCapsuleEntity(AZ::Vector3(100, 0, 0), 128, 16)); - AZ::Aabb capsuleAABB; - Physics::WorldBodyRequestBus::EventResult(capsuleAABB, capsule->GetId(), &Physics::WorldBodyRequests::GetAabb); - EXPECT_TRUE(capsuleAABB.GetMin().IsClose(AZ::Vector3(-16 +100, -16, -64)) && capsuleAABB.GetMax().IsClose(AZ::Vector3(16 +100, 16, 64))); - } - - TEST_F(PhysicsComponentBusTest, WorldBodyBus_StaticRigidBodyColliders_AABBAreCorrect) - { - // Create 3 colliders, one of each type and check that the AABB of their body is the expected - AZStd::unique_ptr box = AZStd::unique_ptr(AddStaticBoxEntity(AZ::Vector3(0, 0, 0), AZ::Vector3(32, 32, 32))); - AZ::Aabb boxAABB; - Physics::WorldBodyRequestBus::EventResult(boxAABB, box->GetId(), &Physics::WorldBodyRequests::GetAabb); - EXPECT_TRUE(boxAABB.GetMin().IsClose(AZ::Vector3(-16, -16, -16)) && boxAABB.GetMax().IsClose(AZ::Vector3(16, 16, 16))); - - AZStd::unique_ptr sphere = AZStd::unique_ptr(AddStaticSphereEntity(AZ::Vector3(-100, 0, 0), 16)); - AZ::Aabb sphereAABB; - Physics::WorldBodyRequestBus::EventResult(sphereAABB, sphere->GetId(), &Physics::WorldBodyRequests::GetAabb); - EXPECT_TRUE(sphereAABB.GetMin().IsClose(AZ::Vector3(-16 -100, -16, -16)) && sphereAABB.GetMax().IsClose(AZ::Vector3(16 -100, 16, 16))); - - AZStd::unique_ptr capsule = AZStd::unique_ptr(AddStaticCapsuleEntity(AZ::Vector3(100, 0, 0), 128, 16)); - AZ::Aabb capsuleAABB; - Physics::WorldBodyRequestBus::EventResult(capsuleAABB, capsule->GetId(), &Physics::WorldBodyRequests::GetAabb); - EXPECT_TRUE(capsuleAABB.GetMin().IsClose(AZ::Vector3(-16 +100, -16, -64)) && capsuleAABB.GetMax().IsClose(AZ::Vector3(16 +100, 16, 64))); - } - - using CreateEntityFunc = AZStd::function(const AZ::Vector3&)>; - - void CheckDisableEnablePhysics(AZStd::vector entityCreations) - { - // Fake Pointer for filling result to make sure that m_body has changed - Physics::WorldBody* fakeBody = (Physics::WorldBody*)(0x1234); - - int i = 0; - for (CreateEntityFunc entityCreation : entityCreations) - { - AZ::Vector3 entityPos = AZ::Vector3(128.f * i, 0, 0); - AZStd::unique_ptr entity = entityCreation(entityPos); - - Physics::RayCastHit hit; - Physics::RayCastRequest request; - request.m_start = entityPos + AZ::Vector3(0, 0, 100); - request.m_direction = AZ::Vector3(0, 0, -1); - request.m_distance = 200.f; - - Physics::WorldBodyRequestBus::Event(entity->GetId(), &Physics::WorldBodyRequests::DisablePhysics); - - bool enabled = true; - Physics::WorldBodyRequestBus::EventResult(enabled, entity->GetId(), &Physics::WorldBodyRequests::IsPhysicsEnabled); - EXPECT_FALSE(enabled); - - hit.m_body = fakeBody; - Physics::WorldRequestBus::BroadcastResult(hit, &Physics::WorldRequests::RayCast, request); - EXPECT_FALSE(hit); - - Physics::WorldBodyRequestBus::Event(entity->GetId(), &Physics::WorldBodyRequests::EnablePhysics); - - enabled = false; - Physics::WorldBodyRequestBus::EventResult(enabled, entity->GetId(), &Physics::WorldBodyRequests::IsPhysicsEnabled); - EXPECT_TRUE(enabled); - - hit.m_body = nullptr; - Physics::WorldRequestBus::BroadcastResult(hit, &Physics::WorldRequests::RayCast, request); - EXPECT_TRUE(hit && hit.m_body->GetEntityId() == entity->GetId()); - - ++i; - } - } - - TEST_F(PhysicsComponentBusTest, WorldBodyBus_EnableDisablePhysics_StaticRigidBody) - { - AZStd::vector entityCreations = - { - [this](const AZ::Vector3& position) { return AZStd::unique_ptr(AddStaticBoxEntity(position, AZ::Vector3(32, 32, 32))); }, - [this](const AZ::Vector3& position) { return AZStd::unique_ptr(AddStaticSphereEntity(position, 16)); }, - [this](const AZ::Vector3& position) { return AZStd::unique_ptr(AddStaticCapsuleEntity(position, 16, 16)); } - }; - CheckDisableEnablePhysics(entityCreations); - } - - TEST_F(PhysicsComponentBusTest, WorldBodyBus_EnableDisablePhysics_RigidBody) - { - AZStd::vector entityCreations = - { - [this](const AZ::Vector3& position) { return AZStd::unique_ptr(AddBoxEntity(position, AZ::Vector3(32, 32, 32))); }, - [this](const AZ::Vector3& position) { return AZStd::unique_ptr(AddSphereEntity(position, 16)); }, - [this](const AZ::Vector3& position) { return AZStd::unique_ptr(AddCapsuleEntity(position, 16, 16)); } - }; - CheckDisableEnablePhysics(entityCreations); - } - - TEST_F(PhysicsComponentBusTest, WorldBodyRayCast_CastAgainstStaticBox_ReturnsHit) - { - AZStd::unique_ptr staticBoxEntity(AddStaticBoxEntity(AZ::Vector3(0.0f), AZ::Vector3(10.f, 10.f, 10.f))); - - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - Physics::RayCastHit hit; - Physics::WorldBodyRequestBus::EventResult(hit, staticBoxEntity->GetId(), &Physics::WorldBodyRequests::RayCast, request); - - EXPECT_TRUE(hit); - - bool hitIncludeSphereEntity = (hit.m_body->GetEntityId() == staticBoxEntity->GetId()); - EXPECT_TRUE(hitIncludeSphereEntity); - } - - using RayCastFunc = AZStd::function; - class PhysicsRigidBodyRayBusTest - : public Physics::GenericPhysicsInterfaceTest - , public ::testing::WithParamInterface - { - }; - - TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstNothing_ReturnsNoHit) - { - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit hit = rayCastFunction(AZ::EntityId(), request); - - EXPECT_FALSE(hit); - } - - TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstSphere_ReturnsHit) - { - AZStd::unique_ptr sphereEntity(AddSphereEntity(AZ::Vector3(0.0f), 10.0f)); - - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit hit = rayCastFunction(sphereEntity->GetId(), request); - - EXPECT_TRUE(hit); - - bool hitsIncludeSphereEntity = (hit.m_body->GetEntityId() == sphereEntity->GetId()); - EXPECT_TRUE(hitsIncludeSphereEntity); - } - - TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstBoxEntityWithLocalOffset_ReturnsHit) - { - const AZ::Vector3 boxExtent = AZ::Vector3(10.0f, 10.0f, 10.0f); - const AZ::Vector3 box1Offset(0.0f, 0.0f, 30.0f); - const AZ::Vector3 box2Offset(0.0f, 0.0f, -30.0f); - - MultiShapeConfig config; - config.m_position = AZ::Vector3(0.0f, 100.0f, 20.0f); - config.m_shapes.AddBox(boxExtent, box1Offset); - config.m_shapes.AddBox(boxExtent, box2Offset); - - auto shapeWithTwoBoxes = AddMultiShapeEntity(config); - - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 100.0f, 50.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); - - EXPECT_TRUE(result); - - bool hitIncludeEntity = (result.m_body->GetEntityId() == shapeWithTwoBoxes->GetId()); - EXPECT_TRUE(hitIncludeEntity); - } - - TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstBoxEntityWithMultipleShapesLocalOffset_ReturnsHits) - { - // Entity at (0, 100, 20) with two box childs with offsets +30 and -30 in Z. - // Child boxes world position centers are at (0, 100, 50) and (0, 100, -10) - // 4 rays tests that should retrieves the correct boxes - - const AZ::Vector3 boxExtent = AZ::Vector3(10.0f, 10.0f, 10.0f); - const AZ::Vector3 box1Offset(0.0f, 0.0f, 30.0f); - const AZ::Vector3 box2Offset(0.0f, 0.0f, -30.0f); - - MultiShapeConfig config; - config.m_position = AZ::Vector3(0.0f, 100.0f, 20.0f); - config.m_shapes.AddBox(boxExtent, box1Offset); - config.m_shapes.AddBox(boxExtent, box2Offset); - - AZStd::unique_ptr shapeWithTwoBoxes(AddMultiShapeEntity(config)); - AZStd::vector> shapes; - PhysX::ColliderComponentRequestBus::EventResult(shapes, shapeWithTwoBoxes->GetId(), &PhysX::ColliderComponentRequests::GetShapes); - - // Upper box part z=50 (-x to +x) - { - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 100.0f, 50.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); - - EXPECT_TRUE(result); - bool hitIncludesEntity = (result.m_body->GetEntityId() == shapeWithTwoBoxes->GetId()); - EXPECT_TRUE(hitIncludesEntity); - bool hitIncludesShape = (result.m_shape == shapes[0].get()); - EXPECT_TRUE(hitIncludesShape); - } - - // Lower box part z=-10 (-x to +x) - { - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 100.0f, -10.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); - - EXPECT_TRUE(result); - bool hitIncludesEntity = (result.m_body->GetEntityId() == shapeWithTwoBoxes->GetId()); - EXPECT_TRUE(hitIncludesEntity); - bool hitIncludesShape = (result.m_shape == shapes[1].get()); - EXPECT_TRUE(hitIncludesShape); - } - - // Trace Vertically from top, it should retrieve the upper box shape - { - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 100.0f, 80.0f); - request.m_direction = AZ::Vector3(0.0f, 0.0f, -1.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); - - EXPECT_TRUE(result); - bool hitIncludesEntity = (result.m_body->GetEntityId() == shapeWithTwoBoxes->GetId()); - EXPECT_TRUE(hitIncludesEntity); - bool hitIncludesShape = (result.m_shape == shapes[0].get()); - EXPECT_TRUE(hitIncludesShape); - } - - // Trace Vertically from bottom, it should retrieve the lower box shape - { - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 100.0f, -80.0f); - request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); - - EXPECT_TRUE(result); - bool hitIncludesEntity = (result.m_body->GetEntityId() == shapeWithTwoBoxes->GetId()); - EXPECT_TRUE(hitIncludesEntity); - bool hitIncludesShape = (result.m_shape == shapes[1].get()); - EXPECT_TRUE(hitIncludesShape); - } - } - - TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstBoxEntityLocalOffsetAndRotation_ReturnsHits) - { - // Entity at (0,0,0) rotated by 90 degrees and child box offset (0,100,0). - // World position of the child should be (-100, 0, 0). - // This tests raycasts from (0, 0, 0) to (-200, 0 ,0) checking that collides with the box - - const AZ::Vector3 boxExtent = AZ::Vector3(10.0f, 10.0f, 10.0f); - const AZ::Vector3 boxOffset(0.0f, 100.0f, 0.0f); - - MultiShapeConfig config; - config.m_position = AZ::Vector3(0.0f, 0.0f, 0.0f); - config.m_rotation = AZ::Vector3(0, 0, AZ::Constants::HalfPi); - config.m_shapes.AddBox(boxExtent, boxOffset); - - AZStd::unique_ptr shapeWithOneBox(AddMultiShapeEntity(config)); - AZStd::vector> shapes; - PhysX::ColliderComponentRequestBus::EventResult(shapes, shapeWithOneBox->GetId(), &PhysX::ColliderComponentRequests::GetShapes); - - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(-1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - auto rayCastFunction = GetParam(); - RayCastHit result = rayCastFunction(shapeWithOneBox->GetId(), request); - - EXPECT_TRUE(result); - bool hitIncludesEntity = (result.m_body->GetEntityId() == shapeWithOneBox->GetId()); - EXPECT_TRUE(hitIncludesEntity); - bool hitIncludesShape = (result.m_shape == shapes[0].get()); - EXPECT_TRUE(hitIncludesShape); - } - - static const RayCastFunc RigidBodyRaycastEBusCall = [](AZ::EntityId entityId, const Physics::RayCastRequest& request) - { - Physics::RayCastHit ret; - Physics::RigidBodyRequestBus::EventResult(ret, entityId, &Physics::RigidBodyRequests::RayCast, request); - return ret; - }; - - static const RayCastFunc WorldBodyRaycastEBusCall = [](AZ::EntityId entityId, const Physics::RayCastRequest& request) - { - Physics::RayCastHit ret; - Physics::WorldBodyRequestBus::EventResult(ret, entityId, &Physics::WorldBodyRequests::RayCast, request); - return ret; - }; - - INSTANTIATE_TEST_CASE_P(, PhysicsRigidBodyRayBusTest, - ::testing::Values(RigidBodyRaycastEBusCall, WorldBodyRaycastEBusCall), - // Provide nice names for the tests runs - [](const testing::TestParamInfo& info) - { - const char* name = ""; - switch (info.index) - { - case 0: - name = "RigidBodyRequestBus"; - break; - case 1: - name = "WorldBodyRequestBus"; - break; - } - return name; - }); - - -} // namespace Physics diff --git a/Code/Framework/Tests/Physics/PhysicsGenericInterfaceTests.inl b/Code/Framework/Tests/Physics/PhysicsGenericInterfaceTests.inl deleted file mode 100644 index 7f1cee44b1..0000000000 --- a/Code/Framework/Tests/Physics/PhysicsGenericInterfaceTests.inl +++ /dev/null @@ -1,919 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include - -namespace Physics -{ - static auto GetEntityInRayCastHitCallBack = [](AZ::EntityId entityId) - { - return [entityId](const RayCastHit& hit) - { - return hit.m_body->GetEntityId() == entityId; - }; - }; - - TEST_F(GenericPhysicsInterfaceTest, World_CreateNewWorld_ReturnsNewWorld) - { - EXPECT_TRUE(CreateTestWorld() != nullptr); - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_CastAgainstNothing_ReturnsNoHits) - { - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - RayCastHit hit; - WorldRequestBus::BroadcastResult(hit, &WorldRequests::RayCast, request); - - EXPECT_FALSE(hit); - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_CastAgainstSphere_ReturnsHits) - { - auto sphereEntity = AddSphereEntity(AZ::Vector3(0.0f), 10.0f); - - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - RayCastHit hit; - WorldRequestBus::BroadcastResult(hit, &WorldRequests::RayCast, request); - - EXPECT_TRUE(hit); - - bool hitsIncludeSphereEntity = (hit.m_body->GetEntityId() == sphereEntity->GetId()); - EXPECT_TRUE(hitsIncludeSphereEntity); - - delete sphereEntity; - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_CastAgainstSphere_ReturnsCorrectShapeAndMaterial) - { - auto sphereEntity = AZStd::shared_ptr(AddSphereEntity(AZ::Vector3(0.0f), 10.0f)); - - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - RayCastHit result; - WorldRequestBus::BroadcastResult(result, &WorldRequests::RayCast, request); - - ASSERT_TRUE(result); - - RigidBody* rigidBody; - Physics::RigidBodyRequestBus::EventResult(rigidBody, sphereEntity->GetId(), &RigidBodyRequestBus::Events::GetRigidBody); - - ASSERT_NE(rigidBody->GetShape(0), nullptr); - ASSERT_NE(result.m_material, nullptr); - ASSERT_EQ(result.m_shape, rigidBody->GetShape(0).get()); - ASSERT_EQ(result.m_material, rigidBody->GetShape(0).get()->GetMaterial().get()); - - const AZStd::string& typeName = result.m_material->GetSurfaceTypeName(); - ASSERT_EQ(typeName, AZStd::string("Default")); - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_CastAgainstStaticObject_ReturnsHits) - { - auto boxEntity = AZStd::shared_ptr(AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 0.0f), AZ::Vector3(10.0f, 10.0f, 10.0f))); - - RayCastRequest request; - request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 200.0f; - - RayCastHit result; - WorldRequestBus::BroadcastResult(result, &WorldRequests::RayCast, request); - - EXPECT_TRUE(result); - - bool hitsIncludeEntity = (result.m_body->GetEntityId() == boxEntity->GetId()); - EXPECT_TRUE(hitsIncludeEntity); - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_CastAgainstFilteredSpheres_ReturnsHits) - { - auto entity1 = AddSphereEntity(AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f, CollisionLayer(0)); - auto entity2 = AddCapsuleEntity(AZ::Vector3(0.0f, 0.0f, 20.0f), 10.0f, 2.0f, CollisionLayer(1)); - auto entity3 = AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 30.0f), AZ::Vector3(20.0f, 20.0f, 20.0f), CollisionLayer(2)); - - CollisionGroup group = CollisionGroup::All; - group.SetLayer(CollisionLayer(0), true); - group.SetLayer(CollisionLayer(1), false); - group.SetLayer(CollisionLayer(2), true); - - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); - request.m_distance = 200.0f; - request.m_collisionGroup = group; - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::RayCastMultiple, request); - - ASSERT_TRUE(hits.size() == 2); - EXPECT_TRUE(hits[1].m_body->GetEntityId() == entity1->GetId()); - EXPECT_TRUE(hits[0].m_body->GetEntityId() == entity3->GetId()); - - delete entity1; - delete entity2; - delete entity3; - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_AgainstStaticOnly_ReturnsStaticBox) - { - auto dynamicSphere = AddSphereEntity(AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f); - auto staticBox = AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 30.0f), AZ::Vector3(20.0f, 20.0f, 20.0f)); - - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); - request.m_queryType = Physics::QueryType::Static; - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::RayCastMultiple, request); - - ASSERT_EQ(hits.size(), 1); - ASSERT_EQ(hits[0].m_body->GetEntityId(), staticBox->GetId()); - - delete dynamicSphere; - delete staticBox; - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_AgainstDynamicOnly_ReturnsDynamicSphere) - { - auto dynamicSphere = AddSphereEntity(AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f); - auto staticBox = AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 30.0f), AZ::Vector3(20.0f, 20.0f, 20.0f)); - - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); - request.m_queryType = Physics::QueryType::Dynamic; - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::RayCastMultiple, request); - - ASSERT_EQ(hits.size(), 1); - ASSERT_EQ(hits[0].m_body->GetEntityId(), dynamicSphere->GetId()); - - delete dynamicSphere; - delete staticBox; - } - - TEST_F(GenericPhysicsInterfaceTest, RayCast_AgainstStaticAndDynamic_ReturnsBothObjects) - { - auto dynamicSphere = AddSphereEntity(AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f); - auto staticBox = AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 30.0f), AZ::Vector3(20.0f, 20.0f, 20.0f)); - - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); - request.m_queryType = Physics::QueryType::StaticAndDynamic; - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::RayCastMultiple, request); - - ASSERT_EQ(hits.size(), 2); - ASSERT_EQ(hits[0].m_body->GetEntityId(), staticBox->GetId()); - ASSERT_EQ(hits[1].m_body->GetEntityId(), dynamicSphere->GetId()); - - delete dynamicSphere; - delete staticBox; - } - TEST_F(GenericPhysicsInterfaceTest, RayCast_AgainstMultipleTouchAndBlockHits_ReturnsClosestBlockAndTouches) - { - auto dynamicSphere = AddSphereEntity(AZ::Vector3(20.0f, 0.0f, 0.0f), 10.0f); - auto staticBox = AddStaticBoxEntity(AZ::Vector3(40.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); - auto blockingSphere = AddSphereEntity(AZ::Vector3(60.0f, 0.0f, 0.0f), 5.0f); - auto blockingBox = AddStaticBoxEntity(AZ::Vector3(80.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); - auto farSphere = AddSphereEntity(AZ::Vector3(120.0f, 0.0f, 0.0f), 10.0f); - - RayCastRequest request; - request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_queryType = Physics::QueryType::StaticAndDynamic; - request.m_filterCallback = [&](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) - { - if (body->GetEntityId() == blockingBox->GetId() || body->GetEntityId() == blockingSphere->GetId()) - { - return QueryHitType::Block; - } - return QueryHitType::Touch; - }; - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::RayCastMultiple, request); - - ASSERT_EQ(hits.size(), 3); - - ASSERT_EQ(1, AZStd::count_if(hits.begin(), hits.end(), GetEntityInRayCastHitCallBack(dynamicSphere->GetId()))); - ASSERT_EQ(1, AZStd::count_if(hits.begin(), hits.end(), GetEntityInRayCastHitCallBack(staticBox->GetId()))); - ASSERT_EQ(1, AZStd::count_if(hits.begin(), hits.end(), GetEntityInRayCastHitCallBack(blockingSphere->GetId()))); - - delete dynamicSphere; - delete staticBox; - delete blockingSphere; - delete blockingBox; - delete farSphere; - } - - TEST_F(GenericPhysicsInterfaceTest, ShapeCast_CastAgainstNothing_ReturnsNoHits) - { - Physics::RayCastHit hit; - WorldRequestBus::BroadcastResult(hit, &WorldRequests::SphereCast, - 1.0f, - AZ::Transform::CreateTranslation(AZ::Vector3(-20.0f, 0.0f, 0.0f)), - AZ::Vector3(1.0f, 0.0f, 0.0f), - 20.0f, Physics::QueryType::StaticAndDynamic, - Physics::CollisionGroup::All, - nullptr - ); - - EXPECT_FALSE(hit); - } - - TEST_F(GenericPhysicsInterfaceTest, ShapeCast_CastAgainstSphere_ReturnsHits) - { - auto sphereEntity = AddSphereEntity(AZ::Vector3(0.0f), 10.0f); - - Physics::RayCastHit hit; - WorldRequestBus::BroadcastResult(hit, &WorldRequests::SphereCast, - 1.0f, - AZ::Transform::CreateTranslation(AZ::Vector3(-20.0f, 0.0f, 0.0f)), - AZ::Vector3(1.0f, 0.0f, 0.0f), - 20.0f, Physics::QueryType::StaticAndDynamic, - Physics::CollisionGroup::All, - nullptr - ); - - EXPECT_TRUE(hit); - EXPECT_EQ(hit.m_body->GetEntityId(), sphereEntity->GetId()); - - // clear up scene - delete sphereEntity; - } - - TEST_F(GenericPhysicsInterfaceTest, ShapeCast_SphereCastAgainstStaticObject_ReturnsHits) - { - auto boxEntity = AZStd::shared_ptr(AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 0.0f), AZ::Vector3(1.0f, 1.0f, 1.0f))); - - Physics::RayCastHit hit; - WorldRequestBus::BroadcastResult(hit, &WorldRequests::SphereCast, - 1.5f, - AZ::Transform::CreateTranslation(AZ::Vector3(-20.0f, 0.0f, 0.0f)), - AZ::Vector3(1.0f, 0.0f, 0.0f), - 20.0f, Physics::QueryType::StaticAndDynamic, - Physics::CollisionGroup::All, - nullptr - ); - - EXPECT_TRUE(hit); - EXPECT_EQ(hit.m_body->GetEntityId(), boxEntity->GetId()); - } - - TEST_F(GenericPhysicsInterfaceTest, ShapeCast_SphereCastAgainstFilteredObjects_ReturnsHits) - { - auto entity1 = AddSphereEntity(AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f, CollisionLayer(0)); - auto entity2 = AddCapsuleEntity(AZ::Vector3(0.0f, 0.0f, 20.0f), 10.0f, 2.0f, CollisionLayer(1)); - auto entity3 = AddStaticBoxEntity(AZ::Vector3(0.0f, 0.0f, 30.0f), AZ::Vector3(20.0f, 20.0f, 20.0f), CollisionLayer(2)); - - CollisionGroup group = CollisionGroup::All; - group.SetLayer(CollisionLayer(0), true); - group.SetLayer(CollisionLayer(1), false); - group.SetLayer(CollisionLayer(2), true); - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::SphereCastMultiple, - 1.5f, - AZ::Transform::CreateTranslation(AZ::Vector3(0.0f, 0.0f, 0.0f)), - AZ::Vector3(0.0f, 0.0f, 1.0f), - 200.0f, Physics::QueryType::StaticAndDynamic, - group, - nullptr - ); - - ASSERT_TRUE(hits.size() == 2); - EXPECT_TRUE(hits[1].m_body->GetEntityId() == entity1->GetId()); - EXPECT_TRUE(hits[0].m_body->GetEntityId() == entity3->GetId()); - - delete entity1; - delete entity2; - delete entity3; - } - - TEST_F(GenericPhysicsInterfaceTest, ShapeCast_AgainstMultipleTouchAndBlockHits_ReturnsClosestBlockAndTouches) - { - auto dynamicSphere = AddSphereEntity(AZ::Vector3(20.0f, 0.0f, 0.0f), 10.0f); - auto staticBox = AddStaticBoxEntity(AZ::Vector3(40.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); - auto blockingSphere = AddSphereEntity(AZ::Vector3(60.0f, 0.0f, 0.0f), 5.0f); - auto blockingBox = AddStaticBoxEntity(AZ::Vector3(80.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); - auto farSphere = AddSphereEntity(AZ::Vector3(120.0f, 0.0f, 0.0f), 10.0f); - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::SphereCastMultiple, - 1.5f, - AZ::Transform::CreateTranslation(AZ::Vector3(0.0f, 0.0f, 0.0f)), - AZ::Vector3(1.0f, 0.0f, 0.0f), - 200.0f, Physics::QueryType::StaticAndDynamic, - Physics::CollisionGroup::All, - [&](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) - { - if (body->GetEntityId() == blockingBox->GetId() || body->GetEntityId() == blockingSphere->GetId()) - { - return QueryHitType::Block; - } - return QueryHitType::Touch; - } - ); - - ASSERT_EQ(hits.size(), 3); - - ASSERT_EQ(1, AZStd::count_if(hits.begin(), hits.end(), GetEntityInRayCastHitCallBack(dynamicSphere->GetId()))); - ASSERT_EQ(1, AZStd::count_if(hits.begin(), hits.end(), GetEntityInRayCastHitCallBack(staticBox->GetId()))); - ASSERT_EQ(1, AZStd::count_if(hits.begin(), hits.end(), GetEntityInRayCastHitCallBack(blockingSphere->GetId()))); - - delete dynamicSphere; - delete staticBox; - delete blockingSphere; - delete blockingBox; - delete farSphere; - } - - TEST_F(GenericPhysicsInterfaceTest, Overlap_OverlapMultipleObjects_ReturnsHits) - { - AZStd::shared_ptr sphereEntity(AddSphereEntity(AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f)); - AZStd::shared_ptr boxEntity(AddBoxEntity(AZ::Vector3(7.0f, 4.0f, 0.0f), AZ::Vector3(1.0f))); - AZStd::shared_ptr capsuleEntity(AddCapsuleEntity(AZ::Vector3(15.0f, 0.0f, 0.0f), 3.0f, 1.0f)); - - BoxShapeConfiguration overlapShape; - overlapShape.m_dimensions = AZ::Vector3(3.0f); - - OverlapRequest request; - request.m_pose = AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f)); - request.m_shapeConfiguration = &overlapShape; - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::Overlap, request); - - EXPECT_EQ(hits.size(), 2); - - // boxEntity shouldn't be included in the result - EXPECT_FALSE(AZStd::any_of(hits.begin(), hits.end(), - [idToFind = boxEntity->GetId()](const OverlapHit& hit) { return hit.m_body->GetEntityId() == idToFind; })); - - } - - TEST_F(GenericPhysicsInterfaceTest, Overlap_OverlapMultipleObjectsUseFriendlyFunctions_ReturnsHits) - { - AZStd::shared_ptr sphereEntity(AddSphereEntity(AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f)); - AZStd::shared_ptr boxEntity(AddBoxEntity(AZ::Vector3(7.0f, 4.0f, 0.0f), AZ::Vector3(1.0f))); - AZStd::shared_ptr capsuleEntity(AddCapsuleEntity(AZ::Vector3(15.0f, 0.0f, 0.0f), 3.0f, 1.0f)); - - AZStd::shared_ptr defaultWorld; - DefaultWorldBus::BroadcastResult(defaultWorld, &DefaultWorldRequests::GetDefaultWorld); - - { - AZStd::vector hits = defaultWorld->OverlapBox(AZ::Vector3(3.0f), AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f))); - - EXPECT_EQ(hits.size(), 2); - - // boxEntity shouldn't be included in the result - EXPECT_FALSE(AZStd::any_of(hits.begin(), hits.end(), - [idToFind = boxEntity->GetId()](const OverlapHit& hit) { return hit.m_body->GetEntityId() == idToFind; })); - } - - { - AZStd::vector hits = defaultWorld->OverlapSphere(3.0f, AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f))); - - EXPECT_EQ(hits.size(), 2); - - // boxEntity shouldn't be included in the result - EXPECT_FALSE(AZStd::any_of(hits.begin(), hits.end(), - [idToFind = boxEntity->GetId()](const OverlapHit& hit) { return hit.m_body->GetEntityId() == idToFind; })); - - } - } - - TEST_F(GenericPhysicsInterfaceTest, Overlap_OverlapMultipleObjectsUseFriendlyFunctionsCustomFiltering_ReturnsHits) - { - AZStd::shared_ptr sphereEntity(AddSphereEntity(AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f)); - AZStd::shared_ptr boxEntity(AddBoxEntity(AZ::Vector3(7.0f, 4.0f, 0.0f), AZ::Vector3(1.0f))); - AZStd::shared_ptr capsuleEntity(AddCapsuleEntity(AZ::Vector3(15.0f, 0.0f, 0.0f), 3.0f, 1.0f)); - - AZStd::shared_ptr defaultWorld; - DefaultWorldBus::BroadcastResult(defaultWorld, &DefaultWorldRequests::GetDefaultWorld); - - // Here we do an overlap test that covers all objects in the scene - // However we provide a custom filtering function that filters out a specific entity - { - AZ::EntityId entityIdToFilterOut = capsuleEntity->GetId(); - - AZStd::vector hits = defaultWorld->OverlapCapsule(100.0f, 30.0f, AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f)), - [entityIdToFilterOut](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) - { - return body->GetEntityId() != entityIdToFilterOut; - }); - - EXPECT_EQ(hits.size(), 2); - - EXPECT_FALSE(AZStd::any_of(hits.begin(), hits.end(), - [entityIdToFilterOut](const OverlapHit& hit) { return hit.m_body->GetEntityId() == entityIdToFilterOut; })); - } - } - - TEST_F(GenericPhysicsInterfaceTest, Overlap_OverlapMultipleObjects_ReturnsFilteredHits) - { - AZStd::shared_ptr sphereEntity(AddSphereEntity(AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f, CollisionLayer(0))); - AZStd::shared_ptr boxEntity(AddStaticBoxEntity(AZ::Vector3(12.0f, 0.0f, 0.0f), AZ::Vector3(1.0f), CollisionLayer(1))); - AZStd::shared_ptr capsuleEntity(AddCapsuleEntity(AZ::Vector3(14.0f, 0.0f, 0.0f), 3.0f, 1.0f, CollisionLayer(2))); - - BoxShapeConfiguration overlapShape; - overlapShape.m_dimensions = AZ::Vector3(1.0f); - - OverlapRequest request; - request.m_pose = AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f)); - request.m_shapeConfiguration = &overlapShape; - request.m_collisionGroup = CollisionGroup::All; - request.m_collisionGroup.SetLayer(CollisionLayer(0), false); // Filter out the sphere - request.m_collisionGroup.SetLayer(CollisionLayer(1), true); - request.m_collisionGroup.SetLayer(CollisionLayer(2), true); - - AZStd::vector hits; - WorldRequestBus::BroadcastResult(hits, &WorldRequests::Overlap, request); - - EXPECT_EQ(hits.size(), 2); - EXPECT_FALSE(AZStd::any_of(hits.begin(), hits.end(), - [sphereEntity](const OverlapHit& hit) - { - // Make sure the sphere was not included - return hit.m_body->GetEntityId() == sphereEntity->GetId(); - })); - - } - - TEST_F(GenericPhysicsInterfaceTest, Gravity_DynamicBody_BodyFalls) - { - auto world = CreateTestWorld(); - auto rigidBody = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 0.0f, 100.0f)); - UpdateWorld(world.get(), 1.0f / 60.f, 60); - - // expect velocity to be -gt and distance fallen to be 1/2gt^2, but allow quite a lot of tolerance - // due to potential differences in back end integration schemes etc. - EXPECT_NEAR(rigidBody->GetLinearVelocity().GetZ(), -10.0f, 0.5f); - EXPECT_NEAR(rigidBody->GetTransform().GetTranslation().GetZ(), 95.0f, 0.5f); - EXPECT_NEAR(rigidBody->GetCenterOfMassWorld().GetZ(), 95.0f, 0.5f); - EXPECT_NEAR(rigidBody->GetPosition().GetZ(), 95.0f, 0.5f); - } - - TEST_F(GenericPhysicsInterfaceTest, World_SplitSimulation_BodyFallsTheSameInBothWorlds) - { - auto worldA = CreateTestWorld(); - auto worldB = CreateTestWorld(); - - AZ::Vector3 initialPosition(0.0f, 0.0f, 100.0f); - - auto rigidBodyA = AddUnitBoxToWorld(worldA.get(), initialPosition); - auto rigidBodyB = AddUnitBoxToWorld(worldB.get(), initialPosition); - - Physics::WorldConfiguration worldConfiguration; - float deltaTime = worldConfiguration.m_fixedTimeStep; - - AZ::u32 numSteps = 60; - - UpdateWorld(worldA.get(), deltaTime, numSteps); - UpdateWorldSplitSim(worldB.get(), deltaTime, numSteps); - - // expect velocity to be -gt and distance fallen to be 1/2gt^2, but allow quite a lot of tolerance - // due to potential differences in back end integration schemes etc. - EXPECT_NEAR(rigidBodyA->GetLinearVelocity().GetZ(), -10.0f, 0.5f); - EXPECT_NEAR(rigidBodyA->GetTransform().GetTranslation().GetZ(), 95.0f, 0.5f); - EXPECT_NEAR(rigidBodyA->GetCenterOfMassWorld().GetZ(), 95.0f, 0.5f); - EXPECT_NEAR(rigidBodyA->GetPosition().GetZ(), 95.0f, 0.5f); - - // Verify simulation results are the same - EXPECT_TRUE(rigidBodyA->GetLinearVelocity().IsClose(rigidBodyB->GetLinearVelocity())); - EXPECT_TRUE(rigidBodyA->GetTransform().GetTranslation().IsClose(rigidBodyB->GetTransform().GetTranslation())); - EXPECT_TRUE(rigidBodyA->GetCenterOfMassWorld().IsClose(rigidBodyB->GetCenterOfMassWorld())); - EXPECT_TRUE(rigidBodyA->GetPosition().IsClose(rigidBodyB->GetPosition())); - } - - TEST_F(GenericPhysicsInterfaceTest, IncreaseMass_StaggeredTowerOfBoxes_TowerOverbalances) - { - auto world = CreateTestWorld(); - - // make a tower of boxes which is staggered but should still balance if all the blocks are the same mass - auto boxA = AddStaticUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 0.0f, 0.5f)); - auto boxB = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.3f, 0.0f, 1.5f)); - auto boxC = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.6f, 0.0f, 2.5f)); - - // check that the tower balances - UpdateWorld(world.get(), 1.0f / 60.0f, 60); - EXPECT_NEAR(2.5f, boxC->GetPosition().GetZ(), 0.01f); - - // increasing the mass of the top block in the tower should overbalance it - boxC->SetMass(5.0f); - EXPECT_NEAR(1.0f, boxB->GetMass(), 0.01f); - EXPECT_NEAR(1.0f, boxB->GetInverseMass(), 0.01f); - EXPECT_NEAR(5.0f, boxC->GetMass(), 0.01f); - EXPECT_NEAR(0.2f, boxC->GetInverseMass(), 0.01f); - boxB->ForceAwake(); - boxC->ForceAwake(); - UpdateWorld(world.get(), 1.0f / 60.0f, 300); - EXPECT_GT(0.0f, static_cast(boxC->GetPosition().GetZ())); - } - - TEST_F(GenericPhysicsInterfaceTest, GetCenterOfMass_FallingBody_CenterOfMassCorrectDuringFall) - { - auto world = CreateTestWorld(); - auto boxStatic = AddStaticUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 0.0f, 0.0f)); - auto boxDynamic = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 0.0f, 2.0f)); - auto tolerance = 1e-3f; - - EXPECT_TRUE(boxDynamic->GetCenterOfMassWorld().IsClose(AZ::Vector3(0.0f, 0.0f, 2.0f), tolerance)); - EXPECT_TRUE(boxDynamic->GetCenterOfMassLocal().IsClose(AZ::Vector3(0.0f, 0.0f, 0.0f), tolerance)); - UpdateWorld(world.get(), 1.0f / 60.0f, 300); - EXPECT_NEAR(static_cast(boxDynamic->GetCenterOfMassWorld().GetZ()), 1.0f, 1e-3f); - EXPECT_TRUE(boxDynamic->GetCenterOfMassLocal().IsClose(AZ::Vector3(0.0f, 0.0f, 0.0f), tolerance)); - } - - TEST_F(GenericPhysicsInterfaceTest, SetLinearVelocity_DynamicBox_AffectsTrajectory) - { - auto world = CreateTestWorld(); - auto boxA = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, -5.0f, 10.0f)); - auto boxB = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 5.0f, 10.0f)); - - boxA->SetLinearVelocity(AZ::Vector3(10.0f, 0.0f, 0.0f)); - for (int i = 1; i < 10; i++) - { - float xPreviousA = boxA->GetPosition().GetX(); - float xPreviousB = boxB->GetPosition().GetX(); - UpdateWorld(world.get(), 1.0f / 60.0f, 10); - EXPECT_GT(static_cast(boxA->GetPosition().GetX()), xPreviousA); - EXPECT_NEAR(boxB->GetPosition().GetX(), xPreviousB, 1e-3f); - } - } - - TEST_F(GenericPhysicsInterfaceTest, ApplyLinearImpulse_DynamicBox_AffectsTrajectory) - { - auto world = CreateTestWorld(); - auto boxA = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 0.0f, 100.0f)); - auto boxB = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 10.0f, 100.0f)); - - boxA->ApplyLinearImpulse(AZ::Vector3(10.0f, 0.0f, 0.0f)); - for (int i = 1; i < 10; i++) - { - float xPreviousA = boxA->GetPosition().GetX(); - float xPreviousB = boxB->GetPosition().GetX(); - UpdateWorld(world.get(), 1.0f / 60.0f, 10); - EXPECT_GT(static_cast(boxA->GetPosition().GetX()), xPreviousA); - EXPECT_NEAR(boxB->GetPosition().GetX(), xPreviousB, 1e-3f); - } - } - - // allow a more generous tolerance on tests involving objects in contact, since the way physics engines normally - // handle multiple contacts between objects can lead to slight imbalances in contact forces - static constexpr float ContactTestTolerance = 0.01f; - - TEST_F(GenericPhysicsInterfaceTest, GetAngularVelocity_DynamicCapsuleOnSlope_GainsAngularVelocity) - { - auto world = CreateTestWorld(); - AZ::Transform slopeTransform = AZ::Transform::CreateRotationY(0.1f); - auto slope = AddStaticFloorToWorld(world.get(), slopeTransform); - auto capsule = AddCapsuleToWorld(world.get(), slopeTransform.TransformPoint(AZ::Vector3::CreateAxisZ())); - - // the capsule should roll down the slope, picking up angular velocity parallel to the Y axis - float angularVelocityMagnitude = capsule->GetAngularVelocity().GetLength(); - UpdateWorld(world.get(), 1.0f / 60.0f, 60); - angularVelocityMagnitude = capsule->GetAngularVelocity().GetLength(); - for (int i = 0; i < 60; i++) - { - world->Update(1.0f / 60.0f); - auto angularVelocity = capsule->GetAngularVelocity(); - EXPECT_TRUE(angularVelocity.IsPerpendicular(AZ::Vector3::CreateAxisX(), ContactTestTolerance)); - EXPECT_TRUE(angularVelocity.IsPerpendicular(AZ::Vector3::CreateAxisZ(), ContactTestTolerance)); - EXPECT_TRUE(capsule->GetAngularVelocity().GetLength() > angularVelocityMagnitude); - angularVelocityMagnitude = angularVelocity.GetLength(); - } - } - - TEST_F(GenericPhysicsInterfaceTest, SetAngularVelocity_DynamicCapsule_StartsRolling) - { - auto world = CreateTestWorld(); - auto floor = AddStaticFloorToWorld(world.get()); - auto capsule = AddCapsuleToWorld(world.get(), AZ::Vector3::CreateAxisZ()); - - // capsule should remain stationary - for (int i = 0; i < 60; i++) - { - world->Update(1.0f / 60.0f); - EXPECT_TRUE(capsule->GetPosition().IsClose(AZ::Vector3::CreateAxisZ(), ContactTestTolerance)); - EXPECT_TRUE(capsule->GetLinearVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); - EXPECT_TRUE(capsule->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); - } - - // apply an angular velocity and it should start rolling - auto angularVelocity = AZ::Vector3::CreateAxisY(10.0f); - capsule->SetAngularVelocity(angularVelocity); - EXPECT_TRUE(capsule->GetAngularVelocity().IsClose(angularVelocity)); - - for (int i = 0; i < 60; i++) - { - float xPrevious = capsule->GetPosition().GetX(); - world->Update(1.0f / 60.0f); - EXPECT_TRUE(capsule->GetPosition().GetX() > xPrevious); - } - } - - TEST_F(GenericPhysicsInterfaceTest, GetLinearVelocityAtWorldPoint_FallingRotatingCapsule_EdgeVelocitiesCorrect) - { - auto world = CreateTestWorld(); - - // create dynamic capsule and start it falling and rotating - auto capsule = AddCapsuleToWorld(world.get(), AZ::Vector3::CreateAxisZ()); - float angularVelocityMagnitude = 1.0f; - capsule->SetAngularVelocity(AZ::Vector3::CreateAxisY(angularVelocityMagnitude)); - capsule->SetAngularDamping(0.0f); - UpdateWorld(world.get(), 1.0f / 60.0f, 60); - - // check the velocities at some points on the rim of the capsule are as expected - for (int i = 0; i < 60; i++) - { - world->Update(1.0f / 60.0f); - auto position = capsule->GetPosition(); - float fallingSpeed = capsule->GetLinearVelocity().GetZ(); - float radius = 0.5f; - AZ::Vector3 z = AZ::Vector3::CreateAxisZ(radius); - AZ::Vector3 x = AZ::Vector3::CreateAxisX(radius); - - auto v1 = capsule->GetLinearVelocityAtWorldPoint(position - z); - auto v2 = capsule->GetLinearVelocityAtWorldPoint(position - x); - auto v3 = capsule->GetLinearVelocityAtWorldPoint(position + x); - - EXPECT_TRUE(v1.IsClose(AZ::Vector3(-radius * angularVelocityMagnitude, 0.0f, fallingSpeed))); - EXPECT_TRUE(v2.IsClose(AZ::Vector3(0.0f, 0.0f, fallingSpeed + radius * angularVelocityMagnitude))); - EXPECT_TRUE(v3.IsClose(AZ::Vector3(0.0f, 0.0f, fallingSpeed - radius * angularVelocityMagnitude))); - } - } - - TEST_F(GenericPhysicsInterfaceTest, GetPosition_RollingCapsule_OrientationCorrect) - { - auto world = CreateTestWorld(); - auto floor = AddStaticFloorToWorld(world.get()); - - // create dynamic capsule and start it rolling - auto capsule = AddCapsuleToWorld(world.get(), AZ::Vector3::CreateAxisZ()); - capsule->SetLinearVelocity(AZ::Vector3::CreateAxisX(5.0f)); - capsule->SetAngularVelocity(AZ::Vector3::CreateAxisY(10.0f)); - UpdateWorld(world.get(), 1.0f / 60.0f, 60); - - // check the capsule orientation evolves as expected - for (int i = 0; i < 60; i++) - { - auto orientationPrevious = capsule->GetOrientation(); - float xPrevious = capsule->GetPosition().GetX(); - world->Update(1.0f / 60.0f); - float angle = 2.0f * (capsule->GetPosition().GetX() - xPrevious); - EXPECT_TRUE(capsule->GetOrientation().IsClose(orientationPrevious * AZ::Quaternion::CreateRotationY(angle))); - } - } - - TEST_F(GenericPhysicsInterfaceTest, OffCenterImpulse_DynamicCapsule_StartsRotating) - { - auto world = CreateTestWorld(); - auto floor = AddStaticFloorToWorld(world.get()); - AZ::Vector3 posA(0.0f, -5.0f, 1.0f); - AZ::Vector3 posB(0.0f, 0.0f, 1.0f); - AZ::Vector3 posC(0.0f, 5.0f, 1.0f); - auto capsuleA = AddCapsuleToWorld(world.get(), posA); - auto capsuleB = AddCapsuleToWorld(world.get(), posB); - auto capsuleC = AddCapsuleToWorld(world.get(), posC); - - // all the capsules should be stationary initially - for (int i = 0; i < 10; i++) - { - world->Update(1.0f / 60.0f); - EXPECT_TRUE(capsuleA->GetPosition().IsClose(posA)); - EXPECT_TRUE(capsuleA->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); - EXPECT_TRUE(capsuleB->GetPosition().IsClose(posB)); - EXPECT_TRUE(capsuleB->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); - EXPECT_TRUE(capsuleC->GetPosition().IsClose(posC)); - EXPECT_TRUE(capsuleC->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); - } - - // apply off-center impulses to capsule A and C, and an impulse through the center of B - AZ::Vector3 impulse(0.0f, 0.0f, 10.0f); - capsuleA->ApplyLinearImpulseAtWorldPoint(impulse, posA + AZ::Vector3::CreateAxisX(0.5f)); - capsuleB->ApplyLinearImpulseAtWorldPoint(impulse, posB); - capsuleC->ApplyLinearImpulseAtWorldPoint(impulse, posC + AZ::Vector3::CreateAxisX(-0.5f)); - - // A and C should be rotating in opposite directions, B should still have 0 angular velocity - for (int i = 0; i < 30; i++) - { - world->Update(1.0f / 60.0f); - EXPECT_TRUE(capsuleA->GetAngularVelocity().GetY() < 0.0f); - EXPECT_TRUE(capsuleB->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); - EXPECT_TRUE(capsuleC->GetAngularVelocity().GetY() > 0.0f); - } - } - - TEST_F(GenericPhysicsInterfaceTest, ApplyAngularImpulse_DynamicSphere_StartsRotating) - { - auto world = CreateTestWorld(); - auto floor = AddStaticFloorToWorld(world.get()); - - AZStd::shared_ptr spheres[3]; - for (int i = 0; i < 3; i++) - { - spheres[i] = AddSphereToWorld(world.get(), AZ::Vector3(0.0f, -5.0f + 5.0f * i, 1.0f)); - } - - // all the spheres should start stationary - UpdateWorld(world.get(), 1.0f / 60.0f, 10); - for (int i = 0; i < 3; i++) - { - EXPECT_TRUE(spheres[i]->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero())); - } - - // apply angular impulses and they should gain angular velocity parallel to the impulse direction - AZ::Vector3 impulses[3] = { AZ::Vector3(2.0f, 4.0f, 0.0f), AZ::Vector3(-3.0f, 1.0f, 0.0f), - AZ::Vector3(-2.0f, 3.0f, 0.0f) }; - for (int i = 0; i < 3; i++) - { - spheres[i]->ApplyAngularImpulse(impulses[i]); - } - - UpdateWorld(world.get(), 1.0f / 60.0f, 10); - - for (int i = 0; i < 3; i++) - { - auto angVel = spheres[i]->GetAngularVelocity(); - EXPECT_TRUE(angVel.GetProjected(impulses[i]).IsClose(angVel, 0.1f)); - } - } - - TEST_F(GenericPhysicsInterfaceTest, StartAsleep_FallingBox_DoesNotFall) - { - auto world = CreateTestWorld(); - - // Box should start asleep - RigidBodyConfiguration config; - config.m_startAsleep = true; - - // Create rigid body - AZStd::shared_ptr box; - SystemRequestBus::BroadcastResult(box, &SystemRequests::CreateRigidBody, config); - world->AddBody(*box); - - UpdateWorld(world.get(), 1.0f / 60.0f, 100); - - // Check the box is still at 0 and hasn't dropped - EXPECT_NEAR(0.0f, box->GetPosition().GetZ(), 0.01f); - } - - TEST_F(GenericPhysicsInterfaceTest, ForceAsleep_FallingBox_BecomesStationary) - { - auto world = CreateTestWorld(); - auto floor = AddStaticFloorToWorld(world.get()); - auto box = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 0.0f, 10.0f)); - UpdateWorld(world.get(), 1.0f / 60.0f, 60); - - EXPECT_TRUE(box->IsAwake()); - - auto pos = box->GetPosition(); - box->ForceAsleep(); - EXPECT_FALSE(box->IsAwake()); - UpdateWorld(world.get(), 1.0f / 60.0f, 30); - EXPECT_FALSE(box->IsAwake()); - // the box should be asleep so it shouldn't have moved - EXPECT_TRUE(box->GetPosition().IsClose(pos)); - } - - TEST_F(GenericPhysicsInterfaceTest, ForceAwake_SleepingBox_SleepStateCorrect) - { - auto world = CreateTestWorld(); - auto floor = AddStaticFloorToWorld(world.get()); - auto box = AddUnitBoxToWorld(world.get(), AZ::Vector3(0.0f, 0.0f, 1.0f)); - - UpdateWorld(world.get(), 1.0f / 60.0f, 60); - EXPECT_FALSE(box->IsAwake()); - - box->ForceAwake(); - EXPECT_TRUE(box->IsAwake()); - - UpdateWorld(world.get(), 1.0f / 60.0f, 60); - // the box should have gone back to sleep - EXPECT_FALSE(box->IsAwake()); - } - - TEST_F(GenericPhysicsInterfaceTest, GetAabb_Box_ValidExtents) - { - auto world = CreateTestWorld(); - AZ::Vector3 posBox(0.0f, 0.0f, 0.0f); - auto box = AddUnitBoxToWorld(world.get(), posBox); - - EXPECT_TRUE(box->GetAabb().GetMin().IsClose(posBox - 0.5f * AZ::Vector3::CreateOne())); - EXPECT_TRUE(box->GetAabb().GetMax().IsClose(posBox + 0.5f * AZ::Vector3::CreateOne())); - - // rotate the box and check the bounding box is still correct - AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); - box->SetTransform(AZ::Transform::CreateFromQuaternionAndTranslation(quat, posBox)); - - AZ::Vector3 boxExtent(sqrtf(0.5f), sqrtf(0.5f), 0.5f); - EXPECT_TRUE(box->GetAabb().GetMin().IsClose(posBox - boxExtent)); - EXPECT_TRUE(box->GetAabb().GetMax().IsClose(posBox + boxExtent)); - } - - TEST_F(GenericPhysicsInterfaceTest, GetAabb_Sphere_ValidExtents) - { - auto world = CreateTestWorld(); - AZ::Vector3 posSphere(0.0f, 0.0f, 0.0f); - auto sphere = AddSphereToWorld(world.get(), posSphere); - - EXPECT_TRUE(sphere->GetAabb().GetMin().IsClose(posSphere - 0.5f * AZ::Vector3::CreateOne())); - EXPECT_TRUE(sphere->GetAabb().GetMax().IsClose(posSphere + 0.5f * AZ::Vector3::CreateOne())); - - // rotate the sphere and check the bounding box is still correct - AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); - sphere->SetTransform(AZ::Transform::CreateFromQuaternionAndTranslation(quat, posSphere)); - - EXPECT_TRUE(sphere->GetAabb().GetMin().IsClose(posSphere - 0.5f * AZ::Vector3::CreateOne())); - EXPECT_TRUE(sphere->GetAabb().GetMax().IsClose(posSphere + 0.5f * AZ::Vector3::CreateOne())); - } - - TEST_F(GenericPhysicsInterfaceTest, GetAabb_Capsule_ValidExtents) - { - auto world = CreateTestWorld(); - AZ::Vector3 posCapsule(0.0f, 0.0f, 0.0f); - auto capsule = AddCapsuleToWorld(world.get(), posCapsule); - - EXPECT_TRUE(capsule->GetAabb().GetMin().IsClose(posCapsule - AZ::Vector3(0.5f, 1.0f, 0.5f))); - EXPECT_TRUE(capsule->GetAabb().GetMax().IsClose(posCapsule + AZ::Vector3(0.5f, 1.0f, 0.5f))); - - // rotate the bodies and check the bounding boxes are still correct - AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); - capsule->SetTransform(AZ::Transform::CreateFromQuaternionAndTranslation(quat, posCapsule)); - - AZ::Vector3 capsuleExtent(0.5f + sqrt(0.125f), 0.5f + sqrt(0.125f), 0.5f); - EXPECT_TRUE(capsule->GetAabb().GetMin().IsClose(posCapsule - capsuleExtent)); - EXPECT_TRUE(capsule->GetAabb().GetMax().IsClose(posCapsule + capsuleExtent)); - } - - TEST_F(GenericPhysicsInterfaceTest, Materials_BoxesSharingDefaultMaterial_JumpingSameHeight) - { - auto world = CreateTestWorld(); - - auto boxA = AddStaticFloorToWorld(world.get()); - auto boxB = AddUnitBoxToWorld(world.get(), AZ::Vector3(1.0f, 0.0f, 10.0f)); - auto boxC = AddUnitBoxToWorld(world.get(), AZ::Vector3(-1.0f, 0.0f, 10.0f)); - - auto material = boxC->GetShape(0)->GetMaterial(); - material->SetRestitution(1.0f); - - UpdateWorld(world.get(), 1.0f / 60.0f, 150); - - // boxB and boxC should have the same material (default) - // so they should both bounce high - EXPECT_NEAR(boxB->GetPosition().GetZ(), boxC->GetPosition().GetZ(), 0.5f); - } - - TEST_F(GenericPhysicsInterfaceTest, World_GetNativePtrByWorldName_ReturnsNativePtr) - { - void* validNativePtr = nullptr; - WorldRequestBus::EventResult(validNativePtr, Physics::DefaultPhysicsWorldId, &WorldRequests::GetNativePointer); - EXPECT_TRUE(validNativePtr != nullptr); - - void* invalidNativePtr = nullptr; - WorldRequestBus::EventResult(invalidNativePtr, AZ_CRC("Bad World Name"), &WorldRequests::GetNativePointer); - EXPECT_TRUE(invalidNativePtr == nullptr); - } - - TEST_F(GenericPhysicsInterfaceTest, Collider_ColliderTag_IsSetFromConfiguration) - { - const AZStd::string colliderTagName = "ColliderTestTag"; - Physics::ColliderConfiguration colliderConfig; - colliderConfig.m_tag = colliderTagName; - Physics::SphereShapeConfiguration shapeConfig; - - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfig); - - EXPECT_EQ(shape->GetTag(), AZ::Crc32(colliderTagName)); - } - -} // namespace Physics diff --git a/Code/Framework/Tests/Physics/PhysicsTests.h b/Code/Framework/Tests/Physics/PhysicsTests.h deleted file mode 100644 index 0f5bd020e1..0000000000 --- a/Code/Framework/Tests/Physics/PhysicsTests.h +++ /dev/null @@ -1,168 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Physics -{ - class GenericPhysicsFixture - : protected Physics::DefaultWorldBus::Handler - { - public: - // Helper functions for setting up test worlds using API only - // These can be implemented here as they should not require any gem specific functions - AZStd::shared_ptr CreateTestWorld(); - void DestroyTestScene(); - - void SetUpInternal(); - void TearDownInternal(); - - // Helper functions for setting up entities used in tests - // These need to be implemented in the gem as they may require gem specific components etc. - AZ::Entity* AddSphereEntity(const AZ::Vector3& position, const float radius, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); - AZ::Entity* AddBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); - AZ::Entity* AddCapsuleEntity(const AZ::Vector3& position, const float height, const float radius, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); - - AZ::Entity* AddStaticSphereEntity(const AZ::Vector3& position, const float radius, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); - AZ::Entity* AddStaticBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); - AZ::Entity* AddStaticCapsuleEntity(const AZ::Vector3& position, const float height, const float radius, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); - - // Helper function for creating multishape entity - struct MultiShapeConfig - { - AZ::Vector3 m_position; // Position of entity - AZ::Vector3 m_rotation = AZ::Vector3(0.f, 0.f, 0.f); // Euler rotation of entity in radians - AzPhysics::CollisionLayer m_layer = AzPhysics::CollisionLayer::Default; // Collision layer - - struct ShapeList - { - struct ShapeData - { - struct Box - { - AZ::Vector3 m_extent; - }; - struct Sphere - { - float m_radius; - }; - struct Capsule - { - float m_height; - float m_radius; - }; - - AZ::Vector3 m_offset; - AZStd::variant m_data; - }; - - void AddBox(AZ::Vector3 extent, AZ::Vector3 offset) - { - ShapeData box; - ShapeData::Box boxData{ extent }; - box.m_data = boxData; - box.m_offset = offset; - m_shapesData.push_back(box); - } - void AddSphere(float radius, AZ::Vector3 offset) - { - ShapeData sphere; - ShapeData::Sphere sphereData{ radius }; - sphere.m_data = sphereData; - sphere.m_offset = offset; - m_shapesData.push_back(sphere); - } - void AddCapsule(float height, float radius, AZ::Vector3 offset) - { - ShapeData capsule; - ShapeData::Capsule capsuleData{ height, radius }; - capsule.m_data = capsuleData; - capsule.m_offset = offset; - m_shapesData.push_back(capsule); - } - - AZStd::vector m_shapesData; - }; - ShapeList m_shapes; - }; - AZStd::unique_ptr AddMultiShapeEntity(const MultiShapeConfig& config); - - protected: - // DefaultWorldBus - AZStd::shared_ptr GetDefaultWorld(); - - AzPhysics::Scene* m_defaultScene = nullptr; - AzPhysics::SceneHandle m_testSceneHandle = AzPhysics::InvalidSceneHandle; - }; - - /// Class to contain tests which any implementation of the AzFramework::Physics API should pass - /// Each gem which implements the common physics API can run the generic API tests by: - /// - including this header file and the appropriate .inl files. - /// - deriving from AZ::Test::ITestEnvironment and extending the environment functions to set up the gem system component etc. - /// - implementing the helper functions required for the tests using gem specific components etc. - /// - adding a AZ_UNIT_TEST_HOOK with the derived environment class - class GenericPhysicsInterfaceTest - : protected GenericPhysicsFixture - , public testing::Test - { - public: - void SetUp() override - { - SetUpInternal(); - } - void TearDown() override - { - TearDownInternal(); - - DestroyTestScene(); //cleanup any physics scene if created. - } - }; - - - - class PhysicsComponentBusTest - : public GenericPhysicsInterfaceTest - { - void SetUp() override - { - GenericPhysicsInterfaceTest::SetUp(); - } - - void TearDown() override - { - GenericPhysicsInterfaceTest::TearDown(); - } - }; - - // helper functions - AZStd::shared_ptr AddStaticFloorToWorld(World* world, const AZ::Transform& transform = AZ::Transform::CreateIdentity()); - AZStd::shared_ptr AddStaticUnitBoxToWorld(World* world, const AZ::Vector3& position); - - AZStd::shared_ptr AddUnitBoxToWorld(World* world, const AZ::Vector3& position); - AZStd::shared_ptr AddSphereToWorld(World* world, const AZ::Vector3& position); - AZStd::shared_ptr AddCapsuleToWorld(World* world, const AZ::Vector3& position); - - void UpdateScene(AzPhysics::Scene* scene, float timeStep, AZ::u32 numSteps); - float GetPositionElement(AZ::Entity* entity, int element); -} // namespace Physics diff --git a/Code/Framework/Tests/Physics/PhysicsTests.inl b/Code/Framework/Tests/Physics/PhysicsTests.inl deleted file mode 100644 index 6673913966..0000000000 --- a/Code/Framework/Tests/Physics/PhysicsTests.inl +++ /dev/null @@ -1,149 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "PhysicsTests.h" -#include -#include -#include -#include -#include - -namespace Physics -{ - // helper functions - AZStd::shared_ptr GenericPhysicsFixture::CreateTestWorld() - { - if (auto* physicsSystem = AZ::Interface::Get()) - { - AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = AZ_CRC_CE("testWorld"); - sceneConfiguration.m_legacyConfiguration.m_gravity = AZ::Vector3(0.0f, 0.0f, -10.0f); - m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); - m_defaultScene = physicsSystem->GetScene(m_testSceneHandle); - return m_defaultScene->GetLegacyWorld(); - } - return nullptr; - } - - void GenericPhysicsFixture::DestroyTestScene() - { - //clean up the test scene - if (auto* physicsSystem = AZ::Interface::Get()) - { - physicsSystem->RemoveScene(m_testSceneHandle); - } - } - - AZStd::shared_ptr AddStaticFloorToWorld(World* world, const AZ::Transform& transform) - { - WorldBodyConfiguration rigidBodySettings; - AZStd::shared_ptr floor; - SystemRequestBus::BroadcastResult(floor, &SystemRequests::CreateStaticRigidBody, rigidBodySettings); - - Physics::ColliderConfiguration colliderConfig; - Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(20.0f, 20.0f, 1.0f)); - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); - floor->AddShape(shape); - - world->AddBody(*floor); - floor->SetTransform(transform); - return floor; - } - - AZStd::shared_ptr AddStaticUnitBoxToWorld(World* world, const AZ::Vector3& position) - { - WorldBodyConfiguration rigidBodySettings; - rigidBodySettings.m_position = position; - AZStd::shared_ptr box; - SystemRequestBus::BroadcastResult(box, &SystemRequests::CreateStaticRigidBody, rigidBodySettings); - - Physics::ColliderConfiguration colliderConfig; - Physics::BoxShapeConfiguration shapeConfiguration; - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); - box->AddShape(shape); - - world->AddBody(*box); - return box; - } - - AZStd::shared_ptr AddUnitBoxToWorld(World* world, const AZ::Vector3& position) - { - RigidBodyConfiguration rigidBodySettings; - rigidBodySettings.m_linearDamping = 0.0f; - AZStd::shared_ptr box; - SystemRequestBus::BroadcastResult(box, &SystemRequests::CreateRigidBody, rigidBodySettings); - - Physics::ColliderConfiguration colliderConfig; - Physics::BoxShapeConfiguration shapeConfiguration; - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); - box->AddShape(shape); - - world->AddBody(*box.get()); - box->SetTransform(AZ::Transform::CreateTranslation(position)); - return box; - } - - AZStd::shared_ptr AddSphereToWorld(World* world, const AZ::Vector3& position) - { - RigidBodyConfiguration rigidBodySettings; - rigidBodySettings.m_linearDamping = 0.0f; - AZStd::shared_ptr sphere; - SystemRequestBus::BroadcastResult(sphere, &SystemRequests::CreateRigidBody, rigidBodySettings); - - Physics::ColliderConfiguration colliderConfig; - Physics::SphereShapeConfiguration shapeConfiguration; - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); - sphere->AddShape(shape); - - world->AddBody(*sphere.get()); - sphere->SetTransform(AZ::Transform::CreateTranslation(position)); - return sphere; - } - - AZStd::shared_ptr AddCapsuleToWorld(World* world, const AZ::Vector3& position) - { - RigidBodyConfiguration rigidBodySettings; - AZStd::shared_ptr capsule = nullptr; - SystemRequestBus::BroadcastResult(capsule, &SystemRequests::CreateRigidBody, rigidBodySettings); - - Physics::ColliderConfiguration colliderConfig; - colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi); - Physics::CapsuleShapeConfiguration shapeConfig(2.0f, 0.5f); - AZStd::shared_ptr shape; - SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfig); - capsule->AddShape(shape); - - world->AddBody(*capsule.get()); - capsule->SetTransform(AZ::Transform::CreateTranslation(position)); - return capsule; - } - - void UpdateScene(AzPhysics::Scene* scene, float timeStep, AZ::u32 numSteps) - { - for (AZ::u32 i = 0; i < numSteps; i++) - { - scene->StartSimulation(timeStep); - scene->FinishSimulation(); - } - } - - float GetPositionElement(AZ::Entity* entity, int element) - { - AZ::Transform transform = AZ::Transform::CreateIdentity(); - AZ::TransformBus::EventResult(transform, entity->GetId(), &AZ::TransformInterface::GetWorldTM); - return transform.GetTranslation().GetElement(element); - } -} // namespace Physics diff --git a/Code/Framework/Tests/Physics/azphysicstests_files.cmake b/Code/Framework/Tests/Physics/azphysicstests_files.cmake deleted file mode 100644 index d2b1ac38a7..0000000000 --- a/Code/Framework/Tests/Physics/azphysicstests_files.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(FILES - PhysicsTests.h - PhysicsTests.inl - PhysicsGenericInterfaceTests.inl - PhysicsComponentBusTests.inl -) diff --git a/Code/Framework/Tests/Script.cpp b/Code/Framework/Tests/Script.cpp deleted file mode 100644 index 95a2a50e2d..0000000000 --- a/Code/Framework/Tests/Script.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "EntityTestbed.h" - -namespace UnitTest -{ - using namespace AZ; - using namespace AzFramework; - - class EntityScriptTest - : public EntityTestbed - { - public: - - ScriptContext* m_scriptContext; - - ~EntityScriptTest() - { - } - - void OnDestroy() override - { - delete m_scriptContext; - m_scriptContext = nullptr; - } - - void run() - { - int argc = 0; - char* argv = nullptr; - Run(argc, &argv); - } - - void OnReflect(AZ::SerializeContext& context, AZ::Entity& systemEntity) override - { - (void)context; - (void)systemEntity; - } - - void OnSetup() override - { - m_scriptContext = aznew AZ::ScriptContext(); - - auto* catalogBus = AZ::Data::AssetCatalogRequestBus::FindFirstHandler(); - if (catalogBus) - { - // Register asset types the asset DB should query our catalog for. - catalogBus->AddAssetType(AZ::AzTypeInfo::Uuid()); - - // Build the catalog (scan). - catalogBus->AddExtension(".lua"); - } - } - - void OnEntityAdded(AZ::Entity& entity) override - { - // Add your components. - entity.CreateComponent(); - entity.Activate(); - } - }; - - TEST_F(EntityScriptTest, DISABLED_Test) - { - run(); - } - - class ScriptComponentTest - : public ::testing::Test - { - static int mySubValue; - static int myReloadValue; - - public: - void run() - { - { - ComponentApplication app; - ComponentApplication::Descriptor appDesc; - appDesc.m_memoryBlocksByteSize = 100 * 1024 * 1024; - //appDesc.m_recordsMode = AllocationRecords::RECORD_FULL; - //appDesc.m_stackRecordLevels = 20; - Entity* systemEntity = app.Create(appDesc); - - systemEntity->CreateComponent(); - systemEntity->CreateComponent("{CAE3A025-FAC9-4537-B39E-0A800A2326DF}"); // JobManager component - systemEntity->CreateComponent(); - systemEntity->CreateComponent(); - systemEntity->CreateComponent("{A316662A-6C3E-43E6-BC61-4B375D0D83B4}"); // Usersettings component - systemEntity->CreateComponent(); - - systemEntity->Init(); - systemEntity->Activate(); - - // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is - // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash - // in the unit tests. - AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize); - - ScriptComponent::CreateDescriptor(); // descriptor is deleted by app - - ScriptContext* scriptContext = nullptr; - EBUS_EVENT_RESULT(scriptContext, ScriptSystemRequestBus, GetContext, DefaultScriptContextId); - - BehaviorContext* behaviorContext = nullptr; - EBUS_EVENT_RESULT(behaviorContext, AZ::ComponentApplicationBus, GetBehaviorContext); - - // make sure script instances don't can read only share data, but don't modify the source table - { - Data::Asset scriptAsset = Data::AssetManager::Instance().CreateAsset(Uuid::CreateRandom()); - AZStd::string script = "test = {\ - --[[test with no properties table as this should work too!]]\ - state = {\ - mysubstate = {\ - mysubvalue = 2,\ - },\ - myvalue = 0,\ - },\ - }\ - function test:OnActivate()\ - self.state.mysubstate.mysubvalue = 5\ - end\ - return test;"; - scriptAsset.Get()->m_scriptBuffer.insert(scriptAsset.Get()->m_scriptBuffer.begin(), script.begin(), script.end()); - EBUS_EVENT(Data::AssetManagerBus, OnAssetReady, scriptAsset); - app.Tick(); - app.TickSystem(); - - Entity* entity1 = aznew Entity(); - entity1->CreateComponent()->SetScript(scriptAsset); - - entity1->Init(); - entity1->Activate(); - - Entity* entity2 = aznew Entity(); - entity2->CreateComponent()->SetScript(scriptAsset); - - entity2->Init(); - entity2->Activate(); - - behaviorContext->Property("globalMySubValue", BehaviorValueProperty(&mySubValue)); - scriptContext->Execute("globalMySubValue = test.state.mysubstate.mysubvalue", "Read my subvalue"); - AZ_TEST_ASSERT(mySubValue == 2); // we should not have changed test. table but the instance table of each component. - - delete entity1; - delete entity2; - - scriptAsset.Reset(); - } - - // Test script reload - { - behaviorContext->Property("myReloadValue", BehaviorValueProperty(&myReloadValue)); - Data::Asset scriptAsset1 = Data::AssetManager::Instance().CreateAsset(Uuid::CreateRandom()); - AZStd::string script1 ="local testReload = {}\ - function testReload:OnActivate()\ - myReloadValue = 1\ - end\ - function testReload:OnDeactivate()\ - myReloadValue = 0\ - end\ - return testReload;"; - - scriptAsset1.Get()->m_scriptBuffer.insert(scriptAsset1.Get()->m_scriptBuffer.begin(), script1.begin(), script1.end()); - EBUS_EVENT(Data::AssetManagerBus, OnAssetReady, scriptAsset1); - - app.Tick(); - app.TickSystem(); // flush assets etc. - - Entity* entity = aznew Entity(); - entity->CreateComponent()->SetScript(scriptAsset1); - - entity->Init(); - entity->Activate(); - - // test value, it should set during activation of the first script - AZ_TEST_ASSERT(myReloadValue == 1); - - AZStd::string script2 ="local testReload = {}\ - function testReload:OnActivate()\ - myReloadValue = 5\ - end\ - return testReload"; - - // modify the asset - Data::Asset scriptAsset2(aznew ScriptAsset(scriptAsset1.GetId()), AZ::Data::AssetLoadBehavior::Default); - scriptAsset2.Get()->m_scriptBuffer.insert(scriptAsset2.Get()->m_scriptBuffer.begin(), script2.begin(), script2.end()); - - // When reloading script assets from files, ScriptSystemComponent would clear old script caches automatically in the - // function `ScriptSystemComponent::LoadAssetData()`. But here we are changing script directly in memory, therefore we - // need to clear old cache manually. - AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequestBus::Events::ClearAssetReferences, scriptAsset1.GetId()); - - // trigger reload - Data::AssetManager::Instance().ReloadAssetFromData(scriptAsset2); - - // ReloadAssetFromData is (now) a queued event - // Need to tick subsystems here to receive reload event. - app.Tick(); - app.TickSystem(); - - // test value with the reloaded value - EXPECT_EQ(5, myReloadValue); - - delete entity; - - scriptAsset1.Reset(); - scriptAsset2.Reset(); - } - - app.Destroy(); - ////////////////////////////////////////////////////////////////////////// - } - } - }; - - TEST_F(ScriptComponentTest, ScriptComponentTestExecution) - { - run(); - } - - int ScriptComponentTest::mySubValue = 0; - int ScriptComponentTest::myReloadValue = 0; -} // namespace UnitTest diff --git a/Code/Framework/Tests/Script/ScriptComponentTests.cpp b/Code/Framework/Tests/Script/ScriptComponentTests.cpp new file mode 100644 index 0000000000..a463192dd0 --- /dev/null +++ b/Code/Framework/Tests/Script/ScriptComponentTests.cpp @@ -0,0 +1,290 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "EntityTestbed.h" + +extern "C" { +# include +# include +} + +namespace UnitTest +{ + using namespace AZ; + using namespace AzFramework; + + // Global Properties used for Testing + int mySubValue = 0; + int myReloadValue = 0; + + class ScriptComponentTest + : public testing::Test + { + public: + AZ_TYPE_INFO(ScriptComponentTest, "{85CDBD49-70FF-416A-8154-B5525EDD30D4}"); + + void SetUp() override + { + ComponentApplication::Descriptor appDesc; + appDesc.m_memoryBlocksByteSize = 100 * 1024 * 1024; + //appDesc.m_recordsMode = AllocationRecords::RECORD_FULL; + //appDesc.m_stackRecordLevels = 20; + Entity* systemEntity = m_app.Create(appDesc); + + systemEntity->CreateComponent(); + systemEntity->CreateComponent("{CAE3A025-FAC9-4537-B39E-0A800A2326DF}"); // JobManager component + systemEntity->CreateComponent(); + systemEntity->CreateComponent(); + systemEntity->CreateComponent("{A316662A-6C3E-43E6-BC61-4B375D0D83B4}"); // Usersettings component + systemEntity->CreateComponent(); + + systemEntity->Init(); + systemEntity->Activate(); + + EBUS_EVENT_RESULT(m_scriptContext, ScriptSystemRequestBus, GetContext, DefaultScriptContextId); + EBUS_EVENT_RESULT(m_behaviorContext, AZ::ComponentApplicationBus, GetBehaviorContext); + EBUS_EVENT_RESULT(m_serializeContext, AZ::ComponentApplicationBus, GetSerializeContext); + + NetBindable::Reflect(m_serializeContext); + + AzToolsFramework::Components::ScriptEditorComponent::CreateDescriptor(); // descriptor is deleted by app + AzToolsFramework::Components::ScriptEditorComponent::Reflect(m_serializeContext); + + ScriptComponent::CreateDescriptor(); // descriptor is deleted by app + ScriptComponent::Reflect(m_serializeContext); + } + + void TearDown() override + { + m_app.Destroy(); + } + + Data::Asset CreateAndLoadScriptAsset(const AZStd::string& script) + { + Data::Asset scriptAsset = Data::AssetManager::Instance().CreateAsset(Uuid::CreateRandom()); + scriptAsset.Get()->m_scriptBuffer.insert(scriptAsset.Get()->m_scriptBuffer.begin(), script.begin(), script.end()); + EBUS_EVENT(Data::AssetManagerBus, OnAssetReady, scriptAsset); + + m_app.Tick(); + m_app.TickSystem(); // flush assets etc. + + return scriptAsset; + } + + static ScriptComponent* BuildGameEntity(const Data::Asset& scriptAsset, Entity& gameEntity) + { + // We first setup the ScriptEditorComponent. + // After a script asset is loaded the ScriptEditorComponent builds the properties table. + // BuildGameEntity() hands off the properties table to the game runtime ScriptComponent. + Entity editorEntity; + auto* scriptEditorComponent = editorEntity.CreateComponent(); + scriptEditorComponent->SetScript(scriptAsset); + editorEntity.Init(); + editorEntity.Activate(); + + scriptEditorComponent->BuildGameEntity(&gameEntity); + + auto* scriptComponent = gameEntity.FindComponent(); + return scriptComponent; + } + + static void OverwriteScriptBuffer(Data::Asset scriptAsset, AZStd::string newScript) + { + scriptAsset.Get()->m_scriptBuffer.insert(scriptAsset.Get()->m_scriptBuffer.begin(), newScript.begin(), newScript.end()); + } + + ComponentApplication m_app; + ScriptContext* m_scriptContext = nullptr; + BehaviorContext* m_behaviorContext = nullptr; + SerializeContext* m_serializeContext = nullptr; + }; + + + TEST_F(ScriptComponentTest, ScriptInstancesCanReadButDontModifySourceTable) + { + // make sure script instances don't can read only share data, but don't modify the source table + const AZStd::string script = "test = {\ + --[[test with no properties table as this should work too!]]\ + state = {\ + mysubstate = {\ + mysubvalue = 2,\ + },\ + myvalue = 0,\ + },\ + }\ + function test:OnActivate()\ + self.state.mysubstate.mysubvalue = 5\ + end\ + return test;"; + + Data::Asset scriptAsset = CreateAndLoadScriptAsset(script); + + auto* entity1 = aznew Entity(); + entity1->CreateComponent()->SetScript(scriptAsset); + + entity1->Init(); + entity1->Activate(); + + auto* entity2 = aznew Entity(); + entity2->CreateComponent()->SetScript(scriptAsset); + + entity2->Init(); + entity2->Activate(); + + m_behaviorContext->Property("globalMySubValue", BehaviorValueProperty(&mySubValue)); + m_scriptContext->Execute("globalMySubValue = test.state.mysubstate.mysubvalue", "Read my subvalue"); + AZ_TEST_ASSERT(mySubValue == 2); // we should not have changed test. table but the instance table of each component. + + delete entity1; + delete entity2; + } + + + TEST_F(ScriptComponentTest, ScriptReloads) + { + // Test script reload + m_behaviorContext->Property("myReloadValue", BehaviorValueProperty(&myReloadValue)); + const AZStd::string script1 ="local testReload = {}\ + function testReload:OnActivate()\ + myReloadValue = 1\ + end\ + function testReload:OnDeactivate()\ + myReloadValue = 0\ + end\ + return testReload;"; + Data::Asset scriptAsset1 = CreateAndLoadScriptAsset(script1); + + auto* entity = aznew Entity(); + entity->CreateComponent()->SetScript(scriptAsset1); + + entity->Init(); + entity->Activate(); + + // test value, it should set during activation of the first script + AZ_TEST_ASSERT(myReloadValue == 1); + + const AZStd::string script2 ="local testReload = {}\ + function testReload:OnActivate()\ + myReloadValue = 5\ + end\ + return testReload"; + + // modify the asset + Data::Asset scriptAsset2(aznew ScriptAsset(scriptAsset1.GetId()), AZ::Data::AssetLoadBehavior::Default); + OverwriteScriptBuffer(scriptAsset2, script2); + + // When reloading script assets from files, ScriptSystemComponent would clear old script caches automatically in the + // function `ScriptSystemComponent::LoadAssetData()`. But here we are changing script directly in memory, therefore we + // need to clear old cache manually. + AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequestBus::Events::ClearAssetReferences, scriptAsset1.GetId()); + + // trigger reload + Data::AssetManager::Instance().ReloadAssetFromData(scriptAsset2); + + // ReloadAssetFromData is (now) a queued event + // Need to tick subsystems here to receive reload event. + m_app.Tick(); + m_app.TickSystem(); + + // test value with the reloaded value + EXPECT_EQ(5, myReloadValue); + + delete entity; + } + + TEST_F(ScriptComponentTest, LuaPropertiesAreDiscovered) + { + const AZStd::string script = "local test = {\ + Properties = {\ + myNum = { default = 2 },\ + },\ + }\ + function test:OnActivate()\ + self.Properties.myNum = 5\ + end\ + return test"; + + const Data::Asset scriptAsset = CreateAndLoadScriptAsset(script); + Entity editorEntity, gameEntity; + auto* scriptComponent = BuildGameEntity(scriptAsset, gameEntity); + + EXPECT_NE(scriptComponent->GetScriptProperty("myNum"), nullptr); + } + + TEST_F(ScriptComponentTest, UpdateNetSynchedProperty) + { + // Make sure altering a netsynched property in script only affects the single entity instance + const AZStd::string script = "local test = {\ + Properties = {\ + myNetSynchedNum = { default = 41, netSynched ={} },\ + doUpdate = { default = false },\ + },\ + }\ + function test:OnActivate()\ + self.tickBusHandler = TickBus.Connect(self, self.entityId)\ + end\ + function test:OnDeactivate()\ + self.tickBusHandler:Disconnect()\ + end\ + function test:OnTick(deltaTime, timePoint)\ + if self.Properties.doUpdate then\ + self.Properties.myNetSynchedNum = self.Properties.myNetSynchedNum+1\ + end\ + end\ + return test"; + + + const Data::Asset scriptAsset = CreateAndLoadScriptAsset(script); + Entity entity1, entity2; + ScriptComponent* scriptComponentInstance1 = BuildGameEntity(scriptAsset, entity1); + ScriptComponent* scriptComponentInstance2 = BuildGameEntity(scriptAsset, entity2); + + // Change the value of entity1's doUpdate to true. + // This way entity1's myNetSynchedNum should be incremented during OnTick + auto* doUpdateScriptProperty = azrtti_cast(scriptComponentInstance1->GetScriptProperty("doUpdate")); + ASSERT_NE(doUpdateScriptProperty, nullptr); + doUpdateScriptProperty->m_value = true; + + entity1.Init(); + entity2.Init(); + entity1.Activate(); + entity2.Activate(); + + // Tick in order to call OnTick in our lua script. + m_app.Tick(); + m_app.TickSystem(); + + // Ensure Entity1's myNetSynchedNum updated, but not Entity2 + auto* netSynchedProperty1 = scriptComponentInstance1->GetNetworkedScriptProperty("myNetSynchedNum"); + auto* netSynchedProperty2 = scriptComponentInstance2->GetNetworkedScriptProperty("myNetSynchedNum"); + ASSERT_NE(netSynchedProperty1, nullptr); + ASSERT_NE(netSynchedProperty2, nullptr); + + auto* num1 = azrtti_cast(netSynchedProperty1); + auto* num2 = azrtti_cast(netSynchedProperty2); + + ASSERT_NE(num1, nullptr); + ASSERT_NE(num2, nullptr); + + EXPECT_EQ(num1->m_value, 42); + EXPECT_EQ(num2->m_value, 41); + } +} // namespace UnitTest diff --git a/Code/Framework/Tests/Script/ScriptEntityTests.cpp b/Code/Framework/Tests/Script/ScriptEntityTests.cpp new file mode 100644 index 0000000000..8944aafc2e --- /dev/null +++ b/Code/Framework/Tests/Script/ScriptEntityTests.cpp @@ -0,0 +1,85 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "EntityTestbed.h" + +namespace UnitTest +{ + using namespace AZ; + using namespace AzFramework; + + class EntityScriptTest + : public EntityTestbed + { + public: + + ScriptContext* m_scriptContext; + + ~EntityScriptTest() + { + } + + void OnDestroy() override + { + delete m_scriptContext; + m_scriptContext = nullptr; + } + + void run() + { + int argc = 0; + char* argv = nullptr; + Run(argc, &argv); + } + + void OnReflect(AZ::SerializeContext& context, AZ::Entity& systemEntity) override + { + (void)context; + (void)systemEntity; + } + + void OnSetup() override + { + m_scriptContext = aznew AZ::ScriptContext(); + + auto* catalogBus = AZ::Data::AssetCatalogRequestBus::FindFirstHandler(); + if (catalogBus) + { + // Register asset types the asset DB should query our catalog for. + catalogBus->AddAssetType(AZ::AzTypeInfo::Uuid()); + + // Build the catalog (scan). + catalogBus->AddExtension(".lua"); + } + } + + void OnEntityAdded(AZ::Entity& entity) override + { + // Add your components. + entity.CreateComponent(); + entity.Activate(); + } + }; + + TEST_F(EntityScriptTest, DISABLED_Test) + { + run(); + } +} // namespace UnitTest diff --git a/Code/Framework/Tests/frameworktests_files.cmake b/Code/Framework/Tests/frameworktests_files.cmake index caebf6d921..cf02b007b4 100644 --- a/Code/Framework/Tests/frameworktests_files.cmake +++ b/Code/Framework/Tests/frameworktests_files.cmake @@ -17,7 +17,6 @@ set(FILES BinToTextEncode.cpp ComponentAddRemove.cpp ComponentAdapterTests.cpp - EngineTests.cpp EntityContext.cpp EntityTestbed.h FileFunc.cpp @@ -32,7 +31,8 @@ set(FILES OctreePerformanceTests.cpp OctreeTests.cpp Slices.cpp - Script.cpp + Script/ScriptComponentTests.cpp + Script/ScriptEntityTests.cpp AssetCatalog.cpp AssetProcessorConnection.cpp NetBindingSystemImplTest.cpp diff --git a/Code/LauncherUnified/Launcher.cpp b/Code/LauncherUnified/Launcher.cpp index 0401802b26..1d7f592fdd 100644 --- a/Code/LauncherUnified/Launcher.cpp +++ b/Code/LauncherUnified/Launcher.cpp @@ -555,6 +555,14 @@ namespace LumberyardLauncher } systemInitParams.bDedicatedServer = IsDedicatedServer(); + if (IsDedicatedServer()) + { + AZ::Interface::Get()->PerformCommand("sv_isDedicated true"); + } + else + { + AZ::Interface::Get()->PerformCommand("sv_isDedicated false"); + } bool remoteFileSystemEnabled{}; AZ::SettingsRegistryMergeUtils::PlatformGet(*settingsRegistry, remoteFileSystemEnabled, diff --git a/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp b/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp index 72ec533336..71f6467bd6 100644 --- a/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp +++ b/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp @@ -191,6 +191,8 @@ void LevelEditorMenuHandler::Initialize() m_viewPaneManager, &QtViewPaneManager::registeredPanesChanged, this, &LevelEditorMenuHandler::ResetToolsMenus); + m_levelExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); + m_topLevelMenus << CreateFileMenu(); auto editMenu = CreateEditMenu(); @@ -230,6 +232,11 @@ bool LevelEditorMenuHandler::MRUEntryIsValid(const QString& entry, const QString return false; } + if (!entry.endsWith(m_levelExtension)) + { + return false; + } + const QDir gameDir(gameFolderPath); QDir dir(entry); // actually pointing at file, first cdUp() gets us the parent dir while (dir.cdUp()) @@ -473,8 +480,18 @@ void LevelEditorMenuHandler::PopulateEditMenu(ActionManager::MenuWrapper& editMe // editMenu->addAction(ID_EDIT_PASTE); // editMenu.AddSeparator(); - // Duplicate - editMenu.AddAction(ID_EDIT_CLONE); + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + bool prefabWipFeaturesEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled); + + if (!isPrefabSystemEnabled || (isPrefabSystemEnabled && prefabWipFeaturesEnabled)) + { + // Duplicate + editMenu.AddAction(ID_EDIT_CLONE); + } // Delete editMenu.AddAction(ID_EDIT_DELETE); @@ -701,8 +718,15 @@ QMenu* LevelEditorMenuHandler::CreateGameMenu() gameMenu.AddAction(ID_SWITCH_PHYSICS); gameMenu.AddSeparator(); - // Export to Engine - gameMenu.AddAction(ID_FILE_EXPORTTOGAMENOSURFACETEXTURE); + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (!usePrefabSystemForLevels) + { + // Export to Engine + gameMenu.AddAction(ID_FILE_EXPORTTOGAMENOSURFACETEXTURE); + } // Export Selected Objects gameMenu.AddAction(ID_FILE_EXPORT_SELECTEDOBJECTS); diff --git a/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.h b/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.h index f7f6a37afb..b9cc70436e 100644 --- a/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.h +++ b/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.h @@ -42,7 +42,7 @@ public: void Initialize(); - static bool MRUEntryIsValid(const QString& entry, const QString& gameFolderPath); + bool MRUEntryIsValid(const QString& entry, const QString& gameFolderPath); void IncrementViewPaneVersion(); int GetViewPaneVersion() const; @@ -119,6 +119,7 @@ private: ActionManager::MenuWrapper m_layoutsMenu; ActionManager::MenuWrapper m_macrosMenu; + const char* m_levelExtension = nullptr; int m_viewPaneVersion = 0; QList m_topLevelMenus; diff --git a/Code/Sandbox/Editor/CryEdit.cpp b/Code/Sandbox/Editor/CryEdit.cpp index bf03c96645..5184ff4ba3 100644 --- a/Code/Sandbox/Editor/CryEdit.cpp +++ b/Code/Sandbox/Editor/CryEdit.cpp @@ -187,24 +187,11 @@ AZ_POP_DISABLE_WARNING #include -static const char defaultFileExtension[] = ".ly"; -static const char oldFileExtension[] = ".cry"; - static const char lumberyardEditorClassName[] = "LumberyardEditorClass"; static const char lumberyardApplicationName[] = "LumberyardApplication"; static AZ::EnvironmentVariable inEditorBatchMode = nullptr; -const char* GetCryEditDefaultFileExtension() -{ - return defaultFileExtension; -} - -const char* GetCryEditOldFileExtension() -{ - return oldFileExtension; -} - RecentFileList::RecentFileList() { m_settings.beginGroup(QStringLiteral("Application")); @@ -985,8 +972,9 @@ CCrySingleDocTemplate::Confidence CCrySingleDocTemplate::MatchDocType(LPCTSTR lp } // see if it matches our default suffix - const QString strFilterExt = GetCryEditDefaultFileExtension(); - const QString strOldFilterExt = GetCryEditOldFileExtension(); + + const QString strFilterExt = EditorUtils::LevelFile::GetDefaultFileExtension(); + const QString strOldFilterExt = EditorUtils::LevelFile::GetOldCryFileExtension(); const QString strSliceFilterExt = AzToolsFramework::SliceUtilities::GetSliceFileExtension().c_str(); // see if extension matches @@ -1267,6 +1255,9 @@ void CCryEditApp::InitPlugins() // aren't set up yet. If in doubt, wrap it in a QTimer::singleShot(0ms); void CCryEditApp::InitLevel(const CEditCommandLineInfo& cmdInfo) { + const char* defaultExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); + const char* oldExtension = EditorUtils::LevelFile::GetOldCryFileExtension(); + if (m_bPreviewMode) { GetIEditor()->EnableAcceleratos(false); @@ -1295,7 +1286,8 @@ void CCryEditApp::InitLevel(const CEditCommandLineInfo& cmdInfo) QTimer::singleShot(0, QCoreApplication::instance(), &QCoreApplication::quit); return; } - else if ((cmdInfo.m_strFileName.endsWith(GetCryEditDefaultFileExtension(), Qt::CaseInsensitive)) || (cmdInfo.m_strFileName.endsWith(GetCryEditOldFileExtension(), Qt::CaseInsensitive))) + else if ((cmdInfo.m_strFileName.endsWith(defaultExtension, Qt::CaseInsensitive)) + || (cmdInfo.m_strFileName.endsWith(oldExtension, Qt::CaseInsensitive))) { auto pDocument = OpenDocumentFile(cmdInfo.m_strFileName.toUtf8().constData()); if (pDocument) @@ -2328,7 +2320,7 @@ int CCryEditApp::ExitInstance(int exitCode) // if we're aborting due to an unexpected shutdown then don't call into objects that don't exist yet. if ((gEnv) && (gEnv->pSystem) && (gEnv->pSystem->GetILevelSystem())) { - gEnv->pSystem->GetILevelSystem()->UnLoadLevel(); + gEnv->pSystem->GetILevelSystem()->UnloadLevel(); } if (GetIEditor()) @@ -2574,6 +2566,15 @@ void CCryEditApp::DisplayLevelLoadErrors() ////////////////////////////////////////////////////////////////////////// void CCryEditApp::ExportLevel(bool bExportToGame, bool bExportTexture, bool bAutoExport) { + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (usePrefabSystemForLevels) + { + AZ_Assert(false, "Prefab system doesn't require level exports."); + return; + } + if (bExportTexture) { CGameExporter gameExporter; @@ -2606,6 +2607,15 @@ void CCryEditApp::OnEditFetch() ////////////////////////////////////////////////////////////////////////// bool CCryEditApp::UserExportToGame(bool bNoMsgBox) { + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (usePrefabSystemForLevels) + { + AZ_Assert(false, "Export Level should no longer exist."); + return false; + } + if (!GetIEditor()->GetGameEngine()->IsLevelLoaded()) { if (bNoMsgBox == false) @@ -2645,6 +2655,15 @@ bool CCryEditApp::UserExportToGame(bool bNoMsgBox) void CCryEditApp::ExportToGame(bool bNoMsgBox) { + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (usePrefabSystemForLevels) + { + AZ_Assert(false, "Prefab system no longer exports levels."); + return; + } + CGameEngine* pGameEngine = GetIEditor()->GetGameEngine(); if (!pGameEngine->IsLevelLoaded()) { @@ -3982,6 +4001,10 @@ void CCryEditApp::OnUpdatePlayGame(QAction* action) ////////////////////////////////////////////////////////////////////////// CCryEditApp::ECreateLevelResult CCryEditApp::CreateLevel(const QString& levelName, QString& fullyQualifiedLevelName /* ={} */) { + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + // If we are creating a new level and we're in simulate mode, then switch it off before we do anything else if (GetIEditor()->GetGameEngine() && GetIEditor()->GetGameEngine()->GetSimulationMode()) { @@ -4004,7 +4027,7 @@ CCryEditApp::ECreateLevelResult CCryEditApp::CreateLevel(const QString& levelNam QString cryFileName = levelName.mid(levelName.lastIndexOf('/') + 1, levelName.length() - levelName.lastIndexOf('/') + 1); QString levelPath = QStringLiteral("%1/Levels/%2/").arg(Path::GetEditingGameDataFolder().c_str(), levelName); - fullyQualifiedLevelName = levelPath + cryFileName + GetCryEditDefaultFileExtension(); + fullyQualifiedLevelName = levelPath + cryFileName + EditorUtils::LevelFile::GetDefaultFileExtension(); //_MAX_PATH includes null terminator, so we actually want to cap at _MAX_PATH-1 if (fullyQualifiedLevelName.length() >= _MAX_PATH-1) @@ -4050,10 +4073,13 @@ CCryEditApp::ECreateLevelResult CCryEditApp::CreateLevel(const QString& levelNam if (GetIEditor()->GetDocument()->Save()) { - m_bIsExportingLegacyData = true; - CGameExporter gameExporter; - gameExporter.Export(); - m_bIsExportingLegacyData = false; + if (!usePrefabSystemForLevels) + { + m_bIsExportingLegacyData = true; + CGameExporter gameExporter; + gameExporter.Export(); + m_bIsExportingLegacyData = false; + } GetIEditor()->GetGameEngine()->LoadLevel(GetIEditor()->GetGameEngine()->GetMissionName(), true, true); GetIEditor()->GetSystem()->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_PRECACHE_START, 0, 0); @@ -4062,6 +4088,7 @@ CCryEditApp::ECreateLevelResult CCryEditApp::CreateLevel(const QString& levelNam GetIEditor()->GetSystem()->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_PRECACHE_END, 0, 0); } + if (!usePrefabSystemForLevels) { // No terrain, but still need to export default octree and visarea data. CGameExporter gameExporter; @@ -5412,8 +5439,8 @@ void CCryEditApp::StartProcessDetached(const char* process, const char* args) // separate the string based on spaces for paths like "-launch", "lua", "-files"; // also separate the string and keep spaces inside the folder path; - // Ex: C:\dev\Foundation\dev\Cache\SamplesProject\pc\samplesproject\scripts\components\a a\empty.lua; - // Ex: C:\dev\Foundation\dev\Cache\SamplesProject\pc\samplesproject\scripts\components\a a\'empty'.lua; + // Ex: C:\dev\Foundation\dev\Cache\AutomatedTesting\pc\automatedtesting\scripts\components\a a\empty.lua; + // Ex: C:\dev\Foundation\dev\Cache\AutomatedTesting\pc\automatedtesting\scripts\components\a a\'empty'.lua; AZStd::string currentStr(args); AZStd::size_t firstQuotePos = AZStd::string::npos; AZStd::size_t secondQuotePos = 0; diff --git a/Code/Sandbox/Editor/CryEditDoc.cpp b/Code/Sandbox/Editor/CryEditDoc.cpp index a6dc41f6ce..f446c50bd6 100644 --- a/Code/Sandbox/Editor/CryEditDoc.cpp +++ b/Code/Sandbox/Editor/CryEditDoc.cpp @@ -22,9 +22,11 @@ #include #include #include +#include // AzFramework #include +#include #include // AzToolsFramework @@ -32,6 +34,7 @@ #include #include #include +#include // CryCommon #include @@ -147,7 +150,6 @@ CCryEditDoc::CCryEditDoc() m_bDocumentReady = false; GetIEditor()->SetDocument(this); CLogFile::WriteLine("Document created"); - m_pTmpXmlArchHack = 0; RegisterConsoleVariables(); MainWindow::instance()->GetActionManager()->RegisterActionHandler(ID_FILE_SAVE_AS, this, &CCryEditDoc::OnFileSaveAs); @@ -336,35 +338,39 @@ void CCryEditDoc::Save(CXmlArchive& xmlAr) void CCryEditDoc::Save(TDocMultiArchive& arrXmlAr) { - m_pTmpXmlArchHack = arrXmlAr[DMAS_GENERAL]; - CAutoDocNotReady autoDocNotReady; - QString currentMissionName; + bool isPrefabEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); - if (arrXmlAr[DMAS_GENERAL] != NULL) + if (!isPrefabEnabled) { - (*arrXmlAr[DMAS_GENERAL]).root = XmlHelpers::CreateXmlNode("Level"); - (*arrXmlAr[DMAS_GENERAL]).root->setAttr("WaterColor", m_waterColor); + CAutoDocNotReady autoDocNotReady; + QString currentMissionName; - char version[50]; - GetIEditor()->GetFileVersion().ToString(version, AZ_ARRAY_SIZE(version)); - (*arrXmlAr[DMAS_GENERAL]).root->setAttr("SandboxVersion", version); + if (arrXmlAr[DMAS_GENERAL] != NULL) + { + (*arrXmlAr[DMAS_GENERAL]).root = XmlHelpers::CreateXmlNode("Level"); + (*arrXmlAr[DMAS_GENERAL]).root->setAttr("WaterColor", m_waterColor); - SerializeViewSettings((*arrXmlAr[DMAS_GENERAL])); + char version[50]; + GetIEditor()->GetFileVersion().ToString(version, AZ_ARRAY_SIZE(version)); + (*arrXmlAr[DMAS_GENERAL]).root->setAttr("SandboxVersion", version); - // Fog settings /////////////////////////////////////////////////////// - SerializeFogSettings((*arrXmlAr[DMAS_GENERAL])); - // Serialize Missions ////////////////////////////////////////////////// - SerializeMissions(arrXmlAr, currentMissionName, false); - //! Serialize material manager. - GetIEditor()->GetMaterialManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); - //! Serialize LensFlare manager. - GetIEditor()->GetLensFlareManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); + SerializeViewSettings((*arrXmlAr[DMAS_GENERAL])); - SerializeShaderCache((*arrXmlAr[DMAS_GENERAL_NAMED_DATA])); - SerializeNameSelection((*arrXmlAr[DMAS_GENERAL])); + // Fog settings /////////////////////////////////////////////////////// + SerializeFogSettings((*arrXmlAr[DMAS_GENERAL])); + // Serialize Missions ////////////////////////////////////////////////// + SerializeMissions(arrXmlAr, currentMissionName, false); + //! Serialize material manager. + GetIEditor()->GetMaterialManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); + //! Serialize LensFlare manager. + GetIEditor()->GetLensFlareManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); + + SerializeShaderCache((*arrXmlAr[DMAS_GENERAL_NAMED_DATA])); + SerializeNameSelection((*arrXmlAr[DMAS_GENERAL])); + } } AfterSave(); - m_pTmpXmlArchHack = 0; } @@ -378,18 +384,28 @@ void CCryEditDoc::Load(CXmlArchive& xmlAr, const QString& szFilename) ////////////////////////////////////////////////////////////////////////// void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename) { + bool isPrefabEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + m_hasErrors = false; // Register a unique load event QString fileName = Path::GetFileName(szFilename); - QString levelHash = GetIEditor()->GetSettingsManager()->GenerateContentHash(arrXmlAr[DMAS_GENERAL]->root, fileName); + QString levelHash; + if (!isPrefabEnabled) + { + levelHash = GetIEditor()->GetSettingsManager()->GenerateContentHash(arrXmlAr[DMAS_GENERAL]->root, fileName); + } + else + { + levelHash = szFilename; + } SEventLog loadEvent("Level_" + Path::GetFileName(fileName), "", levelHash); // Register this level and its content hash as version GetIEditor()->GetSettingsManager()->AddToolVersion(fileName, levelHash); GetIEditor()->GetSettingsManager()->RegisterEvent(loadEvent); LOADING_TIME_PROFILE_SECTION(gEnv->pSystem); - m_pTmpXmlArchHack = arrXmlAr[DMAS_GENERAL]; CAutoDocNotReady autoDocNotReady; HEAP_CHECK @@ -421,13 +437,23 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename) // Start recording errors const ICVar* pShowErrorDialogOnLoad = gEnv->pConsole->GetCVar("ed_showErrorDialogOnLoad"); CErrorsRecorder errorsRecorder(pShowErrorDialogOnLoad && (pShowErrorDialogOnLoad->GetIVal() != 0)); - AZStd::string levelPakPath; - if (AzFramework::StringFunc::Path::ConstructFull(szLevelPath.toUtf8().data(), "level", "pak", levelPakPath, true)) + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (!usePrefabSystemForLevels) { - //Check whether level.pak is present - if (!gEnv->pFileIO->Exists(levelPakPath.c_str())) + AZStd::string levelPakPath; + if (AzFramework::StringFunc::Path::ConstructFull(szLevelPath.toUtf8().data(), "level", "pak", levelPakPath, true)) { - CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, "level.pak is missing. This will cause other errors. To fix this, re-export the level."); + // Check whether level.pak is present + if (!gEnv->pFileIO->Exists(levelPakPath.c_str())) + { + CryWarning( + VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, + "level.pak is missing. This will cause other errors. To fix this, re-export the level."); + } } } @@ -465,16 +491,20 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename) HEAP_CHECK - // multiple missions are no longer supported, only load the current mission (last used) - SerializeMissions(arrXmlAr, currentMissionName, false); + if (!isPrefabEnabled) + { + // multiple missions are no longer supported, only load the current mission (last used) + SerializeMissions(arrXmlAr, currentMissionName, false); + } HEAP_CHECK if (GetIEditor()->Get3DEngine()) { - CAutoLogTime logtime("Load Terrain"); - bool terrainLoaded = GetIEditor()->Get3DEngine()->LoadCompiledOctreeForEditor(); - AZ_Assert(terrainLoaded, "Failed to load Terrain data file."); + if (!isPrefabEnabled) + { + GetIEditor()->Get3DEngine()->LoadCompiledOctreeForEditor(); + } } { @@ -482,36 +512,39 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename) GetIEditor()->GetGameEngine()->LoadLevel(currentMissionName, true, true); } - ////////////////////////////////////////////////////////////////////////// - // Load water color. - ////////////////////////////////////////////////////////////////////////// - (*arrXmlAr[DMAS_GENERAL]).root->getAttr("WaterColor", m_waterColor); - - ////////////////////////////////////////////////////////////////////////// - // Load materials. - ////////////////////////////////////////////////////////////////////////// + if (!isPrefabEnabled) { - CAutoLogTime logtime("Load MaterialManager"); - GetIEditor()->GetMaterialManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); - } + ////////////////////////////////////////////////////////////////////////// + // Load water color. + ////////////////////////////////////////////////////////////////////////// + (*arrXmlAr[DMAS_GENERAL]).root->getAttr("WaterColor", m_waterColor); + + ////////////////////////////////////////////////////////////////////////// + // Load materials. + ////////////////////////////////////////////////////////////////////////// + { + CAutoLogTime logtime("Load MaterialManager"); + GetIEditor()->GetMaterialManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); + } - ////////////////////////////////////////////////////////////////////////// - // Load LensFlares. - ////////////////////////////////////////////////////////////////////////// - { - CAutoLogTime logtime("Load Flares"); - GetIEditor()->GetLensFlareManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); - } + ////////////////////////////////////////////////////////////////////////// + // Load LensFlares. + ////////////////////////////////////////////////////////////////////////// + { + CAutoLogTime logtime("Load Flares"); + GetIEditor()->GetLensFlareManager()->Serialize((*arrXmlAr[DMAS_GENERAL]).root, (*arrXmlAr[DMAS_GENERAL]).bLoading); + } - ////////////////////////////////////////////////////////////////////////// - // Load View Settings - ////////////////////////////////////////////////////////////////////////// - SerializeViewSettings((*arrXmlAr[DMAS_GENERAL])); + ////////////////////////////////////////////////////////////////////////// + // Load View Settings + ////////////////////////////////////////////////////////////////////////// + SerializeViewSettings((*arrXmlAr[DMAS_GENERAL])); - ////////////////////////////////////////////////////////////////////////// - // Fog settings - ////////////////////////////////////////////////////////////////////////// - SerializeFogSettings((*arrXmlAr[DMAS_GENERAL])); + ////////////////////////////////////////////////////////////////////////// + // Fog settings + ////////////////////////////////////////////////////////////////////////// + SerializeFogSettings((*arrXmlAr[DMAS_GENERAL])); + } { QByteArray str; @@ -534,8 +567,9 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename) ForceSkyUpdate(); - // Serialize Shader Cache. + if (!isPrefabEnabled) { + // Serialize Shader Cache. CAutoLogTime logtime("Load Level Shader Cache"); SerializeShaderCache((*arrXmlAr[DMAS_GENERAL_NAMED_DATA])); } @@ -560,8 +594,11 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename) } } - // Name Selection groups - SerializeNameSelection((*arrXmlAr[DMAS_GENERAL])); + if (!isPrefabEnabled) + { + // Name Selection groups + SerializeNameSelection((*arrXmlAr[DMAS_GENERAL])); + } { CAutoLogTime logtime("Post Load"); @@ -580,7 +617,6 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename) #endif LogLoadTime(GetTickCount() - t0); - m_pTmpXmlArchHack = 0; // Loaded with success, remove event from log file GetIEditor()->GetSettingsManager()->UnregisterEvent(loadEvent); } @@ -943,10 +979,18 @@ bool CCryEditDoc::OnOpenDocument(const QString& lpszPathName) bool CCryEditDoc::BeforeOpenDocument(const QString& lpszPathName, TOpenDocContext& context) { CTimeValue loading_start_time = gEnv->pTimer->GetAsyncTime(); - //ensure we close any open packs - if (!GetIEditor()->GetLevelFolder().isEmpty()) + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (!usePrefabSystemForLevels) { - GetIEditor()->GetSystem()->GetIPak()->ClosePack((GetIEditor()->GetLevelFolder() + "\\level.pak").toUtf8().data()); + // ensure we close any open packs + if (!GetIEditor()->GetLevelFolder().isEmpty()) + { + GetIEditor()->GetSystem()->GetIPak()->ClosePack((GetIEditor()->GetLevelFolder() + "\\level.pak").toUtf8().data()); + } } // restore directory to root. @@ -977,6 +1021,9 @@ bool CCryEditDoc::DoOpenDocument(TOpenDocContext& context) { CTimeValue& loading_start_time = context.loading_start_time; + bool isPrefabEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + // normalize the path so that its the same in all following calls: QString levelFilePath = QFileInfo(context.absoluteLevelPath).absoluteFilePath(); context.absoluteLevelPath = levelFilePath; @@ -985,20 +1032,28 @@ bool CCryEditDoc::DoOpenDocument(TOpenDocContext& context) auto pIPak = GetIEditor()->GetSystem()->GetIPak(); - // if the level pack exists, open that, too: QString levelFolderAbsolutePath = QFileInfo(context.absoluteLevelPath).absolutePath(); - QString levelPackFileAbsolutePath = QDir(levelFolderAbsolutePath).absoluteFilePath("level.pak"); - // we mount the pack (level.pak) using the folder its sitting in as the mountpoint (first parameter) - pIPak->OpenPack(levelFolderAbsolutePath.toUtf8().constData(), levelPackFileAbsolutePath.toUtf8().constData()); - TDocMultiArchive arrXmlAr = {}; - if (!LoadXmlArchiveArray(arrXmlAr, levelFilePath, levelFolderAbsolutePath)) + if (!isPrefabEnabled) { - m_bLoadFailed = true; - return FALSE; + // if the level pack exists, open that, too: + QString levelPackFileAbsolutePath = QDir(levelFolderAbsolutePath).absoluteFilePath("level.pak"); + + // we mount the pack (level.pak) using the folder its sitting in as the mountpoint (first parameter) + pIPak->OpenPack(levelFolderAbsolutePath.toUtf8().constData(), levelPackFileAbsolutePath.toUtf8().constData()); } + TDocMultiArchive arrXmlAr = {}; + + if (!isPrefabEnabled) + { + if (!LoadXmlArchiveArray(arrXmlAr, levelFilePath, levelFolderAbsolutePath)) + { + m_bLoadFailed = true; + return FALSE; + } + } if (!LoadLevel(arrXmlAr, context.absoluteLevelPath)) { m_bLoadFailed = true; @@ -1273,6 +1328,7 @@ bool CCryEditDoc::SaveLevel(const QString& filename) CAutoCheckOutDialogEnableForAll enableForAll; QString fullPathName = Path::ToUnixPath(filename); + QString originaLevelFilename = Path::GetFile(m_pathName); if (QFileInfo(filename).isRelative()) { // Resolving the path through resolvepath would normalize and lowcase it, and in this case, we don't want that. @@ -1331,7 +1387,9 @@ bool CCryEditDoc::SaveLevel(const QString& filename) continue; } - bool skipFile = sourceName.endsWith(".cry", Qt::CaseInsensitive) || sourceName.endsWith(".ly", Qt::CaseInsensitive); // level file will be written out by saving, ignore the source one + bool skipFile = sourceName.endsWith(".cry", Qt::CaseInsensitive) || + sourceName.endsWith(".ly", Qt::CaseInsensitive) || + sourceName == originaLevelFilename; // level file will be written out by saving, ignore the source one if (skipFile) { continue; @@ -1378,81 +1436,112 @@ bool CCryEditDoc::SaveLevel(const QString& filename) QFile(tempSaveFile).setPermissions(QFile::ReadOther | QFile::WriteOther); QFile::remove(tempSaveFile); - CPakFile pakFile; + // Save AZ entities to the editor level. - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "CCryEditDoc::SaveLevel Open PakFile"); - if (!pakFile.Open(tempSaveFile.toUtf8().data(), false)) - { - gEnv->pLog->LogWarning("Unable to open pack file %s for writing", tempSaveFile.toUtf8().data()); - return false; - } - } + bool contentsAllSaved = false; // abort level save if anything within it fails + + auto tempFilenameStrData = tempSaveFile.toStdString(); + auto filenameStrData = fullPathName.toStdString(); - AZStd::vector editorEntities; - AzToolsFramework::EditorEntityContextRequestBus::Broadcast( - &AzToolsFramework::EditorEntityContextRequestBus::Events::GetLooseEditorEntities, - editorEntities); + bool isPrefabEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); - AZStd::vector layerEntities; - AZ::SliceComponent::SliceReferenceToInstancePtrs instancesInLayers; - for (AZ::Entity* entity : editorEntities) + if (!isPrefabEnabled) { - AzToolsFramework::Layers::LayerResult layerSaveResult(AzToolsFramework::Layers::LayerResult::CreateSuccess()); - AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( - layerSaveResult, - entity->GetId(), - &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::WriteLayerAndGetEntities, - newLevelFolder, - layerEntities, - instancesInLayers); - layerSaveResult.MessageResult(); - } + AZStd::vector entitySaveBuffer; + bool savedEntities = false; + CPakFile pakFile; - bool pakContentsAllSaved = false; // abort level pak save if anything within it fails + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "CCryEditDoc::SaveLevel Open PakFile"); + if (!pakFile.Open(tempSaveFile.toUtf8().data(), false)) + { + gEnv->pLog->LogWarning("Unable to open pack file %s for writing", tempSaveFile.toUtf8().data()); + return false; + } + } - // Save AZ entities to the editor level pak. - bool savedEntities = false; - AZStd::vector entitySaveBuffer; - AZ::IO::ByteContainerStream > entitySaveStream(&entitySaveBuffer); - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "CCryEditDoc::SaveLevel Save Entities To Stream"); - EBUS_EVENT_RESULT(savedEntities, - AzToolsFramework::EditorEntityContextRequestBus, - SaveToStreamForEditor, entitySaveStream, layerEntities, instancesInLayers); - } + + AZStd::vector editorEntities; + AzToolsFramework::EditorEntityContextRequestBus::Broadcast( + &AzToolsFramework::EditorEntityContextRequestBus::Events::GetLooseEditorEntities, + editorEntities); + + AZStd::vector layerEntities; + AZ::SliceComponent::SliceReferenceToInstancePtrs instancesInLayers; + for (AZ::Entity* entity : editorEntities) + { + AzToolsFramework::Layers::LayerResult layerSaveResult(AzToolsFramework::Layers::LayerResult::CreateSuccess()); + AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult( + layerSaveResult, + entity->GetId(), + &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::WriteLayerAndGetEntities, + newLevelFolder, + layerEntities, + instancesInLayers); + layerSaveResult.MessageResult(); + } - for (AZ::Entity* entity : editorEntities) - { - AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event( - entity->GetId(), - &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData); - } + AZ::IO::ByteContainerStream> entitySaveStream(&entitySaveBuffer); + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "CCryEditDoc::SaveLevel Save Entities To Stream"); + EBUS_EVENT_RESULT( + savedEntities, AzToolsFramework::EditorEntityContextRequestBus, SaveToStreamForEditor, entitySaveStream, layerEntities, + instancesInLayers); + } - if (savedEntities) - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "CCryEditDoc::SaveLevel Updated PakFile levelEntities.editor_xml"); - pakFile.UpdateFile("LevelEntities.editor_xml", entitySaveBuffer.begin(), entitySaveBuffer.size()); + for (AZ::Entity* entity : editorEntities) + { + AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event( + entity->GetId(), &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData); + } - // Save XML archive to pak file. - bool bSaved = xmlAr.SaveToPak(Path::GetPath(tempSaveFile), pakFile); - if (bSaved) + if (savedEntities) { - pakContentsAllSaved = true; + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::AzToolsFramework, "CCryEditDoc::SaveLevel Updated PakFile levelEntities.editor_xml"); + pakFile.UpdateFile("LevelEntities.editor_xml", entitySaveBuffer.begin(), entitySaveBuffer.size()); + + // Save XML archive to pak file. + bool bSaved = xmlAr.SaveToPak(Path::GetPath(tempSaveFile), pakFile); + if (bSaved) + { + contentsAllSaved = true; + } + else + { + gEnv->pLog->LogWarning("Unable to write the level data to file %s", tempSaveFile.toUtf8().data()); + } } else { - gEnv->pLog->LogWarning("Unable to write the level data to file %s", tempSaveFile.toUtf8().data()); + gEnv->pLog->LogWarning("Unable to generate entity data for level save %s", tempSaveFile.toUtf8().data()); } + + pakFile.Close(); } else { - gEnv->pLog->LogWarning("Unable to generate entity data for level save %s", tempSaveFile.toUtf8().data()); + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + if (prefabEditorEntityOwnershipInterface) + { + AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); + AZ_Assert(fileIO, "No File IO implementation available"); + + AZ::IO::HandleType tempSaveFileHandle; + AZ::IO::Result openResult = fileIO->Open(tempFilenameStrData.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary, tempSaveFileHandle); + contentsAllSaved = openResult; + if (openResult) + { + AZ::IO::FileIOStream stream(tempSaveFileHandle, AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary, false); + contentsAllSaved = prefabEditorEntityOwnershipInterface->SaveToStream(stream, AZStd::string_view(filenameStrData.data(), filenameStrData.size())); + stream.Close(); + } + } } - pakFile.Close(); - if (!pakContentsAllSaved) + if (!contentsAllSaved) { + AZ_Error("Editor", false, "Error when writing level '%s' into tmpfile '%s'", filenameStrData.c_str(), tempFilenameStrData.c_str()); QFile::remove(tempSaveFile); return false; } @@ -1628,45 +1717,73 @@ bool CCryEditDoc::SaveSlice(const QString& filename) bool CCryEditDoc::LoadEntitiesFromLevel(const QString& levelPakFile) { + bool isPrefabEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + bool loadedSuccessfully = false; - auto pakSystem = GetIEditor()->GetSystem()->GetIPak(); - bool pakOpened = pakSystem->OpenPack(levelPakFile.toUtf8().data()); - if (pakOpened) + if (!isPrefabEnabled) { - const QString entityFilename = Path::GetPath(levelPakFile) + "LevelEntities.editor_xml"; - - CCryFile entitiesFile; - if (entitiesFile.Open(entityFilename.toUtf8().data(), "rt")) + auto pakSystem = GetIEditor()->GetSystem()->GetIPak(); + bool pakOpened = pakSystem->OpenPack(levelPakFile.toUtf8().data()); + if (pakOpened) { - AZStd::vector fileBuffer; - fileBuffer.resize(entitiesFile.GetLength()); - if (fileBuffer.size() > 0) + const QString entityFilename = Path::GetPath(levelPakFile) + "LevelEntities.editor_xml"; + + CCryFile entitiesFile; + if (entitiesFile.Open(entityFilename.toUtf8().data(), "rt")) { - if (fileBuffer.size() == entitiesFile.ReadRaw(fileBuffer.begin(), fileBuffer.size())) + AZStd::vector fileBuffer; + fileBuffer.resize(entitiesFile.GetLength()); + if (fileBuffer.size() > 0) { - AZ::IO::ByteContainerStream > fileStream(&fileBuffer); + if (fileBuffer.size() == entitiesFile.ReadRaw(fileBuffer.begin(), fileBuffer.size())) + { + AZ::IO::ByteContainerStream> fileStream(&fileBuffer); - EBUS_EVENT_RESULT(loadedSuccessfully, AzToolsFramework::EditorEntityContextRequestBus, LoadFromStreamWithLayers, fileStream, levelPakFile); + EBUS_EVENT_RESULT( + loadedSuccessfully, AzToolsFramework::EditorEntityContextRequestBus, LoadFromStreamWithLayers, fileStream, + levelPakFile); + } + else + { + AZ_Error( + "Editor", false, "Failed to load level entities because the file \"%s\" could not be read.", + entityFilename.toUtf8().data()); + } } else { - AZ_Error("Editor", false, "Failed to load level entities because the file \"%s\" could not be read.", entityFilename.toUtf8().data()); + AZ_Error( + "Editor", false, "Failed to load level entities because the file \"%s\" is empty.", entityFilename.toUtf8().data()); } + + entitiesFile.Close(); } else { - AZ_Error("Editor", false, "Failed to load level entities because the file \"%s\" is empty.", entityFilename.toUtf8().data()); + AZ_Error( + "Editor", false, "Failed to load level entities because the file \"%s\" was not found.", + entityFilename.toUtf8().data()); } - entitiesFile.Close(); + pakSystem->ClosePack(levelPakFile.toUtf8().data()); } - else + } + else + { + AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); + AZ_Assert(fileIO, "No File IO implementation available"); + + AZ::IO::HandleType fileHandle; + AZ::IO::Result openResult = fileIO->Open(levelPakFile.toUtf8().data(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary, fileHandle); + if (openResult) { - AZ_Error("Editor", false, "Failed to load level entities because the file \"%s\" was not found.", entityFilename.toUtf8().data()); + AZ::IO::FileIOStream stream(fileHandle, AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary, false); + AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult( + loadedSuccessfully, &AzToolsFramework::EditorEntityContextRequests::LoadFromStreamWithLayers, stream, levelPakFile); + stream.Close(); } - - pakSystem->ClosePack(levelPakFile.toUtf8().data()); } return loadedSuccessfully; @@ -1697,14 +1814,21 @@ bool CCryEditDoc::LoadEntitiesFromSlice(const QString& sliceFile) bool CCryEditDoc::LoadLevel(TDocMultiArchive& arrXmlAr, const QString& absoluteCryFilePath) { - auto pIPak = GetIEditor()->GetSystem()->GetIPak(); + bool isPrefabEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + auto pIPak = GetIEditor()->GetSystem()->GetIPak(); + QString folderPath = QFileInfo(absoluteCryFilePath).absolutePath(); OnStartLevelResourceList(); // Load next level resource list. - pIPak->GetResourceList(AZ::IO::IArchive::RFOM_NextLevel)->Load(Path::Make(folderPath, "resourcelist.txt").toUtf8().data()); + if (!isPrefabEnabled) + { + pIPak->GetResourceList(AZ::IO::IArchive::RFOM_NextLevel)->Load(Path::Make(folderPath, "resourcelist.txt").toUtf8().data()); + } + GetIEditor()->Notify(eNotify_OnBeginLoad); CrySystemEventBus::Broadcast(&CrySystemEventBus::Events::OnCryEditorBeginLoad); //GetISystem()->GetISystemEventDispatcher()->OnSystemEvent( ESYSTEM_EVENT_LEVEL_LOAD_START,0,0 ); @@ -1719,7 +1843,10 @@ bool CCryEditDoc::LoadLevel(TDocMultiArchive& arrXmlAr, const QString& absoluteC GetISystem()->GetISystemEventDispatcher()->OnSystemEvent(ESYSTEM_EVENT_LEVEL_LOAD_END, 0, 0); // We don't need next level resource list anymore. - pIPak->GetResourceList(AZ::IO::IArchive::RFOM_NextLevel)->Clear(); + if (!isPrefabEnabled) + { + pIPak->GetResourceList(AZ::IO::IArchive::RFOM_NextLevel)->Clear(); + } SetModifiedFlag(FALSE); // start off with unmodified SetModifiedModules(eModifiedNothing); SetDocumentReady(true); @@ -2309,23 +2436,33 @@ void CCryEditDoc::CreateDefaultLevelAssets(int resolution, int unitSize) } else { - AZ::Data::AssetCatalogRequestBus::BroadcastResult(m_envProbeSliceAssetId, &AZ::Data::AssetCatalogRequests::GetAssetIdByPath, m_envProbeSliceRelativePath, azrtti_typeid(), false); + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); - if (m_envProbeSliceAssetId.IsValid()) + if (!isPrefabSystemEnabled) { - AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().FindOrCreateAsset(m_envProbeSliceAssetId, AZ::Data::AssetLoadBehavior::Default); - if (asset) + AZ::Data::AssetCatalogRequestBus::BroadcastResult( + m_envProbeSliceAssetId, &AZ::Data::AssetCatalogRequests::GetAssetIdByPath, m_envProbeSliceRelativePath, + azrtti_typeid(), false); + + if (m_envProbeSliceAssetId.IsValid()) { - m_terrainSize = resolution * unitSize; - const float halfTerrainSize = m_terrainSize / 2.0f; + AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().FindOrCreateAsset( + m_envProbeSliceAssetId, AZ::Data::AssetLoadBehavior::Default); + if (asset) + { + m_terrainSize = resolution * unitSize; + const float halfTerrainSize = m_terrainSize / 2.0f; - AZ::Transform worldTransform = AZ::Transform::CreateIdentity(); - worldTransform = AZ::Transform::CreateTranslation(AZ::Vector3(halfTerrainSize, halfTerrainSize, m_envProbeHeight / 2)); + AZ::Transform worldTransform = AZ::Transform::CreateIdentity(); + worldTransform = AZ::Transform::CreateTranslation(AZ::Vector3(halfTerrainSize, halfTerrainSize, m_envProbeHeight / 2)); - AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusConnect(); - GetIEditor()->SuspendUndo(); - AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Broadcast( - &AzToolsFramework::SliceEditorEntityOwnershipServiceRequests::InstantiateEditorSlice, asset, worldTransform); + AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusConnect(); + GetIEditor()->SuspendUndo(); + AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Broadcast( + &AzToolsFramework::SliceEditorEntityOwnershipServiceRequests::InstantiateEditorSlice, asset, worldTransform); + } } } } diff --git a/Code/Sandbox/Editor/CryEditDoc.h b/Code/Sandbox/Editor/CryEditDoc.h index 058ed94a5e..9f954f31d8 100644 --- a/Code/Sandbox/Editor/CryEditDoc.h +++ b/Code/Sandbox/Editor/CryEditDoc.h @@ -188,8 +188,6 @@ protected: //! Remove existing mission from map. void RemoveMission(CMission* mission); void LogLoadTime(int time); - //! For saving binary data (voxel object) - CXmlArchive* GetTmpXmlArch(){ return m_pTmpXmlArchHack; } struct TSaveDocContext { @@ -228,7 +226,6 @@ protected: std::vector m_missions; std::list m_listeners; bool m_bDocumentReady; - CXmlArchive* m_pTmpXmlArchHack; CLevelShaderCache* m_pLevelShaderCache; ICVar* doc_validate_surface_types; int m_modifiedModuleFlags; diff --git a/Code/Sandbox/Editor/CryEditPy.cpp b/Code/Sandbox/Editor/CryEditPy.cpp index d7c204a9db..135dd9878c 100644 --- a/Code/Sandbox/Editor/CryEditPy.cpp +++ b/Code/Sandbox/Editor/CryEditPy.cpp @@ -33,9 +33,6 @@ #include "UndoConfigSpec.h" #include "ViewManager.h" -const char* GetCryEditDefaultFileExtension(); -const char* GetCryEditOldFileExtension(); - ////////////////////////////////////////////////////////////////////////// namespace { @@ -111,6 +108,9 @@ namespace bool PyOpenLevel(const char* pLevelName) { + const char* oldExtension = EditorUtils::LevelFile::GetOldCryFileExtension(); + const char* defaultExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); + QString levelPath = pLevelName; if (!QFile::exists(levelPath)) @@ -130,10 +130,10 @@ namespace levelPath = levelsDir / levelPath / levelFileName; // make sure the level path includes the cry extension, if needed - if (!levelFileName.endsWith(GetCryEditOldFileExtension()) && !levelFileName.endsWith(GetCryEditDefaultFileExtension())) + if (!levelFileName.endsWith(oldExtension) && !levelFileName.endsWith(defaultExtension)) { - QString newLevelPath = levelPath + GetCryEditDefaultFileExtension(); - QString oldLevelPath = levelPath + GetCryEditOldFileExtension(); + QString newLevelPath = levelPath + defaultExtension; + QString oldLevelPath = levelPath + oldExtension; // Check if there is a .cry file, otherwise assume it is a new .ly file if (QFileInfo(oldLevelPath).exists()) diff --git a/Code/Sandbox/Editor/Dialogs/PythonScriptsDialog.cpp b/Code/Sandbox/Editor/Dialogs/PythonScriptsDialog.cpp index b6abac4810..c642671aba 100644 --- a/Code/Sandbox/Editor/Dialogs/PythonScriptsDialog.cpp +++ b/Code/Sandbox/Editor/Dialogs/PythonScriptsDialog.cpp @@ -186,10 +186,9 @@ void CPythonScriptsDialog::OnExecute() if (ui->treeView->IsFile(selectedItem)) { - QString workingDirectory = QDir::currentPath(); - const QString scriptPath = QStringLiteral("%1/%2").arg(workingDirectory).arg(ui->treeView->GetPath(selectedItem)); + auto scriptPath = AZ::IO::FixedMaxPath(AZ::Utils::GetEnginePath()) / ui->treeView->GetPath(selectedItem).toUtf8().constData(); using namespace AzToolsFramework; - EditorPythonRunnerRequestBus::Broadcast(&EditorPythonRunnerRequestBus::Events::ExecuteByFilename, scriptPath.toUtf8().constData()); + EditorPythonRunnerRequestBus::Broadcast(&EditorPythonRunnerRequestBus::Events::ExecuteByFilename, scriptPath.Native()); } } diff --git a/Code/Sandbox/Editor/EditorFileMonitor.cpp b/Code/Sandbox/Editor/EditorFileMonitor.cpp index 4a53759057..93ada53e0f 100644 --- a/Code/Sandbox/Editor/EditorFileMonitor.cpp +++ b/Code/Sandbox/Editor/EditorFileMonitor.cpp @@ -148,7 +148,7 @@ void CEditorFileMonitor::MonitorDirectories() QString RemoveGameName(const QString &filename) { // Remove first part of path. File coming in has the game name included - // eg (SamplesProject/Animations/Chicken/anim_chicken_flapping.i_caf)->(Animations/Chicken/anim_chicken_flapping.i_caf) + // eg (AutomatedTesting/Animations/Chicken/anim_chicken_flapping.i_caf)->(Animations/Chicken/anim_chicken_flapping.i_caf) int indexOfFirstSlash = filename.indexOf('/'); int indexOfFirstBackSlash = filename.indexOf('\\'); diff --git a/Code/Sandbox/Editor/EditorToolsApplication.cpp b/Code/Sandbox/Editor/EditorToolsApplication.cpp index add0bb4ff2..97caaf612a 100644 --- a/Code/Sandbox/Editor/EditorToolsApplication.cpp +++ b/Code/Sandbox/Editor/EditorToolsApplication.cpp @@ -181,15 +181,15 @@ namespace EditorInternal AzFramework::StringFunc::Path::Join(GetGameFolder().c_str(), levelPath.c_str(), levelPath); // make sure the level path includes the cry extension, if needed - if (!levelFileName.ends_with(OldFileExtension) && !levelFileName.ends_with(DefaultFileExtension)) + if (!levelFileName.ends_with(GetOldCryLevelExtension()) && !levelFileName.ends_with(GetLevelExtension())) { AZStd::size_t levelPathLength = levelPath.length(); - levelPath += OldFileExtension; + levelPath += GetOldCryLevelExtension(); // Check if there is a .cry file, otherwise assume it is a new .ly file if (!AZ::IO::SystemFile::Exists(levelPath.c_str())) { - levelPath.replace(levelPathLength, sizeof(OldFileExtension) - 1, DefaultFileExtension); + levelPath.replace(levelPathLength, sizeof(GetOldCryLevelExtension()) - 1, GetLevelExtension()); } } @@ -243,6 +243,27 @@ namespace EditorInternal return AZStd::string(GetIEditor()->GetGameEngine()->GetLevelPath().toUtf8().data()); } + const char* EditorToolsApplication::GetLevelExtension() const + { + bool prefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + if (!prefabSystemEnabled) + { + return ".ly"; + } + else + { + return ".prefab"; + } + } + + const char* EditorToolsApplication::GetOldCryLevelExtension() const + { + return ".cry"; + } + void EditorToolsApplication::Exit() { // Adding a single-shot QTimer to PyExit delays the QApplication::closeAllWindows call until diff --git a/Code/Sandbox/Editor/EditorToolsApplication.h b/Code/Sandbox/Editor/EditorToolsApplication.h index a90bc0e1cc..171d292ce5 100644 --- a/Code/Sandbox/Editor/EditorToolsApplication.h +++ b/Code/Sandbox/Editor/EditorToolsApplication.h @@ -63,9 +63,10 @@ namespace EditorInternal AZStd::string GetCurrentLevelName() const override; AZStd::string GetCurrentLevelPath() const override; + const char* GetOldCryLevelExtension() const override; + const char* GetLevelExtension() const override; + private: - static constexpr char DefaultFileExtension[] = ".ly"; - static constexpr char OldFileExtension[] = ".cry"; static constexpr char DefaultLevelFolder[] = "Levels"; bool m_StartupAborted = false; diff --git a/Code/Sandbox/Editor/EditorToolsApplicationAPI.h b/Code/Sandbox/Editor/EditorToolsApplicationAPI.h index 1c1abf6fdf..515e8f7c8b 100644 --- a/Code/Sandbox/Editor/EditorToolsApplicationAPI.h +++ b/Code/Sandbox/Editor/EditorToolsApplicationAPI.h @@ -41,6 +41,11 @@ namespace EditorInternal virtual AZStd::string GetCurrentLevelName() const = 0; virtual AZStd::string GetCurrentLevelPath() const = 0; + //! Retrieve old cry level file extension (With prepending '.') + virtual const char* GetOldCryLevelExtension() const = 0; + //! Retrieve default level file extension (With prepending '.') + virtual const char* GetLevelExtension() const = 0; + virtual void Exit() = 0; virtual void ExitNoPrompt() = 0; }; diff --git a/Code/Sandbox/Editor/EditorViewportWidget.cpp b/Code/Sandbox/Editor/EditorViewportWidget.cpp index 69c955aa60..c09a428b3f 100644 --- a/Code/Sandbox/Editor/EditorViewportWidget.cpp +++ b/Code/Sandbox/Editor/EditorViewportWidget.cpp @@ -112,20 +112,17 @@ namespace AZ::ViewportHelpers class EditorEntityNotifications : public AzToolsFramework::EditorEntityContextNotificationBus::Handler - , public AzToolsFramework::EditorEvents::Bus::Handler { public: EditorEntityNotifications(EditorViewportWidget& renderViewport) : m_renderViewport(renderViewport) { AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusConnect(); - AzToolsFramework::EditorEvents::Bus::Handler::BusConnect(); } ~EditorEntityNotifications() override { AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect(); - AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect(); } // AzToolsFramework::EditorEntityContextNotificationBus @@ -137,12 +134,6 @@ namespace AZ::ViewportHelpers { m_renderViewport.OnStopPlayInEditor(); } - - // AzToolsFramework::EditorEvents::Bus - void PopulateEditorGlobalContextMenu(QMenu* menu, const AZ::Vector2& point, int flags) override - { - m_renderViewport.PopulateEditorGlobalContextMenu(menu, point, flags); - } private: EditorViewportWidget& m_renderViewport; }; @@ -519,26 +510,17 @@ void EditorViewportWidget::Update() PushDisableRendering(); // draw debug visualizations + if (m_debugDisplay) { - const AzFramework::DisplayContextRequestGuard displayContextGuard(m_displayContext); - - const AZ::u32 prevState = m_displayContext.GetState(); - m_displayContext.SetState( + const AZ::u32 prevState = m_debugDisplay->GetState(); + m_debugDisplay->SetState( e_Mode3D | e_AlphaBlended | e_FillModeSolid | e_CullModeBack | e_DepthWriteOn | e_DepthTestOn); - AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus; - AzFramework::DebugDisplayRequestBus::Bind( - debugDisplayBus, AzToolsFramework::ViewportInteraction::g_mainViewportEntityDebugDisplayId); - AZ_Assert(debugDisplayBus, "Invalid DebugDisplayRequestBus."); - - AzFramework::DebugDisplayRequests* debugDisplay = - AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus); - AzFramework::EntityDebugDisplayEventBus::Broadcast( &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, - AzFramework::ViewportInfo{ GetViewportId() }, *debugDisplay); + AzFramework::ViewportInfo{ GetViewportId() }, *m_debugDisplay); - m_displayContext.SetState(prevState); + m_debugDisplay->SetState(prevState); } QtViewport::Update(); @@ -571,8 +553,6 @@ void EditorViewportWidget::Update() // 3D engine stats GetIEditor()->GetSystem()->RenderBegin(); - InitDisplayContext(); - OnRender(); ProcessRenderLisneters(m_displayContext); @@ -825,6 +805,23 @@ void EditorViewportWidget::OnRender() } FUNCTION_PROFILER(GetIEditor()->GetSystem(), PROFILE_EDITOR); +} + +void EditorViewportWidget::OnBeginPrepareRender() +{ + if (!m_debugDisplay) + { + AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus; + AzFramework::DebugDisplayRequestBus::Bind(debugDisplayBus, GetViewportId()); + AZ_Assert(debugDisplayBus, "Invalid DebugDisplayRequestBus."); + + m_debugDisplay = AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus); + } + + if (!m_debugDisplay) + { + return; + } float fNearZ = GetIEditor()->GetConsoleVar("cl_DefaultNearPlane"); float fFarZ = m_Camera.GetFarPlane(); @@ -838,8 +835,7 @@ void EditorViewportWidget::OnRender() Camera::CameraRequestBus::EventResult(fNearZ, m_viewEntityId, &Camera::CameraComponentRequests::GetNearClipDistance); Camera::CameraRequestBus::EventResult(fFarZ, m_viewEntityId, &Camera::CameraComponentRequests::GetFarClipDistance); LmbrCentral::EditorCameraCorrectionRequestBus::EventResult( - lookThroughEntityCorrection, m_viewEntityId, - &LmbrCentral::EditorCameraCorrectionRequests::GetTransformCorrection); + lookThroughEntityCorrection, m_viewEntityId, &LmbrCentral::EditorCameraCorrectionRequests::GetTransformCorrection); } m_viewTM = cameraObject->GetWorldTM() * AZMatrix3x3ToLYMatrix3x3(lookThroughEntityCorrection); @@ -902,332 +898,69 @@ void EditorViewportWidget::OnRender() bool levelIsDisplayable = (ge && ge->IsLevelLoaded() && GetIEditor()->GetDocument() && GetIEditor()->GetDocument()->IsDocumentReady()); - //Handle scene render tasks such as gizmos and handles but only when not in VR - if (!m_renderer->IsStereoEnabled()) - { - DisplayContext& displayContext = m_displayContext; - - PreWidgetRendering(); - - RenderAll(); - - // Draw Axis arrow in lower left corner. - if (levelIsDisplayable && !GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - DrawAxis(); - } - - // Draw 2D helpers. - TransformationMatrices backupSceneMatrices; - m_renderer->Set2DMode(m_rcClient.right(), m_rcClient.bottom(), backupSceneMatrices); - displayContext.SetState(e_Mode3D | e_AlphaBlended | e_FillModeSolid | e_CullModeBack | e_DepthWriteOn | e_DepthTestOn); - - // Display cursor string. - RenderCursorString(); - - if (gSettings.viewports.bShowSafeFrame) - { - UpdateSafeFrame(); - RenderSafeFrame(); - } - - const AzFramework::DisplayContextRequestGuard displayContextGuard(displayContext); - - AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus; - AzFramework::DebugDisplayRequestBus::Bind( - debugDisplayBus, AzToolsFramework::ViewportInteraction::g_mainViewportEntityDebugDisplayId); - AZ_Assert(debugDisplayBus, "Invalid DebugDisplayRequestBus."); - - AzFramework::DebugDisplayRequests* debugDisplay = - AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus); - - AzFramework::ViewportDebugDisplayEventBus::Event( - AzToolsFramework::GetEntityContextId(), &AzFramework::ViewportDebugDisplayEvents::DisplayViewport2d, - AzFramework::ViewportInfo{ GetViewportId() }, *debugDisplay); - - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - RenderSelectionRectangle(); - } - - m_renderer->Unset2DMode(backupSceneMatrices); - - PostWidgetRendering(); - } - - // TODO: Move out this logic to a controller and refactor to work with Atom - //ColorF viewportBackgroundColor(pow(71.0f / 255.0f, 2.2f), pow(71.0f / 255.0f, 2.2f), pow(71.0f / 255.0f, 2.2f)); - //m_renderer->ClearTargetsLater(FRT_CLEAR_COLOR, viewportBackgroundColor); - DrawBackground(); - - if (!m_renderer->IsStereoEnabled()) - { - GetIEditor()->GetSystem()->RenderStatistics(); - } -} - -////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::RenderSelectionRectangle() -{ - if (m_selectedRect.isEmpty()) - { - return; - } - - Vec3 topLeft(m_selectedRect.left(), m_selectedRect.top(), 1); - Vec3 bottomRight(m_selectedRect.right() +1, m_selectedRect.bottom() + 1, 1); - - m_displayContext.DepthTestOff(); - m_displayContext.SetColor(1, 1, 1, 0.4f); - m_displayContext.DrawWireBox(topLeft, bottomRight); - m_displayContext.DepthTestOn(); -} - -////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::InitDisplayContext() -{ - FUNCTION_PROFILER(GetIEditor()->GetSystem(), PROFILE_EDITOR); + PreWidgetRendering(); - // Draw all objects. - DisplayContext& displayContext = m_displayContext; - displayContext.settings = GetIEditor()->GetDisplaySettings(); - displayContext.view = this; - displayContext.renderer = m_renderer; - displayContext.engine = m_engine; - displayContext.box.min = Vec3(-100000.0f, -100000.0f, -100000.0f); - displayContext.box.max = Vec3(100000.0f, 100000.0f, 100000.0f); - displayContext.camera = &m_Camera; - displayContext.flags = 0; + RenderAll(); - if (!displayContext.settings->IsDisplayLabels() || !displayContext.settings->IsDisplayHelpers()) - { - displayContext.flags |= DISPLAY_HIDENAMES; - } - - if (displayContext.settings->IsDisplayLinks() && displayContext.settings->IsDisplayHelpers()) - { - displayContext.flags |= DISPLAY_LINKS; - } + // Draw 2D helpers. + TransformationMatrices backupSceneMatrices; + m_debugDisplay->DepthTestOff(); + //m_renderer->Set2DMode(m_rcClient.right(), m_rcClient.bottom(), backupSceneMatrices); + auto prevState = m_debugDisplay->GetState(); + m_debugDisplay->SetState(e_Mode3D | e_AlphaBlended | e_FillModeSolid | e_CullModeBack | e_DepthWriteOn | e_DepthTestOn); - if (m_bDegradateQuality) + if (gSettings.viewports.bShowSafeFrame) { - displayContext.flags |= DISPLAY_DEGRADATED; + UpdateSafeFrame(); + RenderSafeFrame(); } - if (displayContext.settings->GetRenderFlags() & RENDER_FLAG_BBOX) - { - displayContext.flags |= DISPLAY_BBOX; - } + AzFramework::ViewportDebugDisplayEventBus::Event( + AzToolsFramework::GetEntityContextId(), &AzFramework::ViewportDebugDisplayEvents::DisplayViewport2d, + AzFramework::ViewportInfo{GetViewportId()}, *m_debugDisplay); - if (displayContext.settings->IsDisplayTracks() && displayContext.settings->IsDisplayHelpers()) - { - displayContext.flags |= DISPLAY_TRACKS; - displayContext.flags |= DISPLAY_TRACKTICKS; - } + m_debugDisplay->SetState(prevState); + m_debugDisplay->DepthTestOn(); - if (m_bAdvancedSelectMode && !GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - displayContext.flags |= DISPLAY_SELECTION_HELPERS; - } + PostWidgetRendering(); - if (GetIEditor()->GetReferenceCoordSys() == COORDS_WORLD) + if (!m_renderer->IsStereoEnabled()) { - displayContext.flags |= DISPLAY_WORLDSPACEAXIS; + GetIEditor()->GetSystem()->RenderStatistics(); } } -////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::PopulateEditorGlobalContextMenu(QMenu* /*menu*/, const AZ::Vector2& /*point*/, int /*flags*/) -{ - m_bInMoveMode = false; -} - ////////////////////////////////////////////////////////////////////////// void EditorViewportWidget::RenderAll() { - // Draw all objects. - DisplayContext& displayContext = m_displayContext; - - displayContext.SetState(e_Mode3D | e_AlphaBlended | e_FillModeSolid | e_CullModeBack | e_DepthWriteOn | e_DepthTestOn); - GetIEditor()->GetObjectManager()->Display(displayContext); - - RenderSelectedRegion(); - - RenderSnapMarker(); - - if (gSettings.viewports.bShowGridGuide - && GetIEditor()->GetDisplaySettings()->IsDisplayHelpers()) - { - RenderSnappingGrid(); - } - - if (displayContext.settings->GetDebugFlags() & DBG_MEMINFO) - { - ProcessMemInfo mi; - CProcessInfo::QueryMemInfo(mi); - int MB = 1024 * 1024; - QString str = QStringLiteral("WorkingSet=%1Mb, PageFile=%2Mb, PageFaults=%3").arg(mi.WorkingSet / MB).arg(mi.PagefileUsage / MB).arg(mi.PageFaultCount); - m_renderer->TextToScreenColor(1, 1, 1, 0, 0, 1, str.toUtf8().data()); - } - - { - const AzFramework::DisplayContextRequestGuard displayContextGuard(displayContext); - - AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus; - AzFramework::DebugDisplayRequestBus::Bind( - debugDisplayBus, AzToolsFramework::ViewportInteraction::g_mainViewportEntityDebugDisplayId); - AZ_Assert(debugDisplayBus, "Invalid DebugDisplayRequestBus."); - - AzFramework::DebugDisplayRequests* debugDisplay = - AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus); - - // allow the override of in-editor visualization - AzFramework::ViewportDebugDisplayEventBus::Event( - AzToolsFramework::GetEntityContextId(), &AzFramework::ViewportDebugDisplayEvents::DisplayViewport, - AzFramework::ViewportInfo{ GetViewportId() }, *debugDisplay); - - m_entityVisibilityQuery.DisplayVisibility(*debugDisplay); - - if (GetEditTool()) - { - // display editing tool - GetEditTool()->Display(displayContext); - } - - if (m_manipulatorManager != nullptr) - { - using namespace AzToolsFramework::ViewportInteraction; - - debugDisplay->DepthTestOff(); - m_manipulatorManager->DrawManipulators( - *debugDisplay, GetCameraState(), - BuildMouseInteractionInternal( - MouseButtons(TranslateMouseButtons(QGuiApplication::mouseButtons())), - BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()), - BuildMousePickInternal(WidgetToViewport(mapFromGlobal(QCursor::pos()))))); - debugDisplay->DepthTestOn(); - } - } -} - -////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::DrawAxis() -{ - AZ_Assert(m_cameraSetForWidgetRenderingCount > 0, - "DrawAxis was called but viewport widget rendering was not set. PreWidgetRendering must be called before."); - - DisplayContext& dc = m_displayContext; - - // show axis only if draw helpers is activated - if (!dc.settings->IsDisplayHelpers()) - { - return; - } - - Vec3 colX(1, 0, 0), colY(0, 1, 0), colZ(0, 0, 1), colW(1, 1, 1); - Vec3 pos(50, 50, 0.1f); // Bottom-left corner - - float wx, wy, wz; - UnProjectFromScreen(pos.x, pos.y, pos.z, &wx, &wy, &wz); - Vec3 posInWorld(wx, wy, wz); - float screenScale = GetScreenScaleFactor(posInWorld); - float length = 0.03f * screenScale; - float arrowSize = 0.02f * screenScale; - float textSize = 1.1f; - - Vec3 x(length, 0, 0); - Vec3 y(0, length, 0); - Vec3 z(0, 0, length); - - int prevRState = dc.GetState(); - dc.DepthWriteOff(); - dc.DepthTestOff(); - dc.CullOff(); - dc.SetLineWidth(1); - - dc.SetColor(colX); - dc.DrawLine(posInWorld, posInWorld + x); - dc.DrawArrow(posInWorld + x * 0.9f, posInWorld + x, arrowSize); - dc.SetColor(colY); - dc.DrawLine(posInWorld, posInWorld + y); - dc.DrawArrow(posInWorld + y * 0.9f, posInWorld + y, arrowSize); - dc.SetColor(colZ); - dc.DrawLine(posInWorld, posInWorld + z); - dc.DrawArrow(posInWorld + z * 0.9f, posInWorld + z, arrowSize); - - dc.SetColor(colW); - dc.DrawTextLabel(posInWorld + x, textSize, "x"); - dc.DrawTextLabel(posInWorld + y, textSize, "y"); - dc.DrawTextLabel(posInWorld + z, textSize, "z"); - - dc.DepthWriteOn(); - dc.DepthTestOn(); - dc.CullOn(); - dc.SetState(prevRState); -} - -////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::DrawBackground() -{ - DisplayContext& dc = m_displayContext; - - if (!dc.settings->IsDisplayHelpers()) // show gradient bg only if draw helpers are activated + if (!m_debugDisplay) { return; } - int heightVP = width(); - int widthVP = height(); - Vec3 pos(0, 0, 0); + // allow the override of in-editor visualization + AzFramework::ViewportDebugDisplayEventBus::Event( + AzToolsFramework::GetEntityContextId(), &AzFramework::ViewportDebugDisplayEvents::DisplayViewport, + AzFramework::ViewportInfo{ GetViewportId() }, *m_debugDisplay); - Vec3 x(widthVP, 0, 0); - Vec3 y(0, heightVP, 0); + m_entityVisibilityQuery.DisplayVisibility(*m_debugDisplay); - float height = m_rcClient.height(); - - auto NegY = [](const Vec3& v, float y) -> Vec3 + if (m_manipulatorManager != nullptr) { - return Vec3(v.x, y - v.y, v.z); - }; - - Vec3 src = NegY(pos, height); - Vec3 trgx = NegY(pos + x, height); - Vec3 trgy = NegY(pos + y, height); - - QColor topColor = palette().color(QPalette::Window); - QColor bottomColor = palette().color(QPalette::Disabled, QPalette::WindowText); - - ColorB firstC(topColor.red(), topColor.green(), topColor.blue(), 255.0f); - ColorB secondC(bottomColor.red(), bottomColor.green(), bottomColor.blue(), 255.0f); + using namespace AzToolsFramework::ViewportInteraction; - TransformationMatrices backupSceneMatrices; - - m_renderer->Set2DMode(m_rcClient.right(), m_rcClient.bottom(), backupSceneMatrices); - m_displayContext.SetState(e_Mode3D | e_AlphaBlended | e_FillModeSolid | e_CullModeBack | e_DepthWriteOn | e_DepthTestOn); - dc.DrawQuadGradient(src, trgx, pos + x, pos, secondC, firstC); - m_renderer->Unset2DMode(backupSceneMatrices); + m_debugDisplay->DepthTestOff(); + m_manipulatorManager->DrawManipulators( + *m_debugDisplay, GetCameraState(), + BuildMouseInteractionInternal( + MouseButtons(TranslateMouseButtons(QGuiApplication::mouseButtons())), + BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()), + BuildMousePickInternal(WidgetToViewport(mapFromGlobal(QCursor::pos()))))); + m_debugDisplay->DepthTestOn(); + } } ////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::RenderCursorString() -{ - if (m_cursorStr.isEmpty()) - { - return; - } - - const auto point = WidgetToViewport(mapFromGlobal(QCursor::pos())); - - // Display hit object name. - float col[4] = { 1, 1, 1, 1 }; - m_renderer->Draw2dLabel(point.x() + 12, point.y() + 4, 1.2f, col, false, "%s", m_cursorStr.toUtf8().data()); - - if (!m_cursorSupplementaryStr.isEmpty()) - { - float col2[4] = { 1, 1, 0, 1 }; - m_renderer->Draw2dLabel(point.x() + 12, point.y() + 4 + CURSOR_FONT_HEIGHT * 1.2f, 1.2f, col2, false, "%s", m_cursorSupplementaryStr.toUtf8().data()); - } -} ////////////////////////////////////////////////////////////////////////// void EditorViewportWidget::UpdateSafeFrame() @@ -1285,14 +1018,14 @@ void EditorViewportWidget::RenderSafeFrame() ////////////////////////////////////////////////////////////////////////// void EditorViewportWidget::RenderSafeFrame(const QRect& frame, float r, float g, float b, float a) { - m_displayContext.SetColor(r, g, b, a); + m_debugDisplay->SetColor(r, g, b, a); const int LINE_WIDTH = 2; for (int i = 0; i < LINE_WIDTH; i++) { - Vec3 topLeft(frame.left() + i, frame.top() + i, 0); - Vec3 bottomRight(frame.right() - i, frame.bottom() - i, 0); - m_displayContext.DrawWireBox(topLeft, bottomRight); + AZ::Vector3 topLeft(frame.left() + i, frame.top() + i, 0); + AZ::Vector3 bottomRight(frame.right() - i, frame.bottom() - i, 0); + m_debugDisplay->DrawWireBox(topLeft, bottomRight); } } @@ -2917,195 +2650,6 @@ void EditorViewportWidget::OnStopPlayInEditor() } } -////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::RenderConstructionPlane() -{ - DisplayContext& dc = m_displayContext; - - int prevState = dc.GetState(); - dc.DepthWriteOff(); - // Draw Construction plane. - - CGrid* pGrid = GetViewManager()->GetGrid(); - - RefCoordSys coordSys = COORDS_WORLD; - - Vec3 p = m_constructionMatrix[coordSys].GetTranslation(); - Vec3 n = m_constructionPlane.n; - - Vec3 u = Vec3(1, 0, 0); - Vec3 v = Vec3(0, 1, 0); - - - if (gSettings.snap.bGridUserDefined) - { - Ang3 angles = Ang3(pGrid->rotationAngles.x * gf_PI / 180.0, pGrid->rotationAngles.y * gf_PI / 180.0, pGrid->rotationAngles.z * gf_PI / 180.0); - Matrix34 tm = Matrix33::CreateRotationXYZ(angles); - - if (gSettings.snap.bGridGetFromSelected) - { - CSelectionGroup* sel = GetIEditor()->GetSelection(); - if (sel->GetCount() > 0) - { - CBaseObject* obj = sel->GetObject(0); - tm = obj->GetWorldTM(); - tm.OrthonormalizeFast(); - tm.SetTranslation(Vec3(0, 0, 0)); - } - } - - u = tm * u; - v = tm * v; - } - - float step = pGrid->scale * pGrid->size; - float size = gSettings.snap.constructPlaneSize; - - dc.SetColor(0, 0, 1, 0.1f); - - float s = size; - - dc.DrawQuad(p - u * s - v * s, p + u * s - v * s, p + u * s + v * s, p - u * s + v * s); - - int nSteps = int(size / step); - int i; - // Draw X lines. - dc.SetColor(1, 0, 0.2f, 0.3f); - - for (i = -nSteps; i <= nSteps; i++) - { - dc.DrawLine(p - u * size + v * (step * i), p + u * size + v * (step * i)); - } - // Draw Y lines. - dc.SetColor(0.2f, 1.0f, 0, 0.3f); - for (i = -nSteps; i <= nSteps; i++) - { - dc.DrawLine(p - v * size + u * (step * i), p + v * size + u * (step * i)); - } - - // Draw origin lines. - - dc.SetLineWidth(2); - - //X - dc.SetColor(1, 0, 0); - dc.DrawLine(p - u * s, p + u * s); - - //Y - dc.SetColor(0, 1, 0); - dc.DrawLine(p - v * s, p + v * s); - - //Z - dc.SetColor(0, 0, 1); - dc.DrawLine(p - n * s, p + n * s); - - dc.SetLineWidth(0); - - dc.SetState(prevState); -} - -////////////////////////////////////////////////////////////////////////// -void EditorViewportWidget::RenderSnappingGrid() -{ - // First, Check whether we should draw the grid or not. - CSelectionGroup* pSelGroup = GetIEditor()->GetSelection(); - if (pSelGroup == nullptr || pSelGroup->GetCount() != 1) - { - return; - } - if (GetIEditor()->GetEditMode() != eEditModeMove - && GetIEditor()->GetEditMode() != eEditModeRotate) - { - return; - } - CGrid* pGrid = GetViewManager()->GetGrid(); - if (pGrid->IsEnabled() == false && pGrid->IsAngleSnapEnabled() == false) - { - return; - } - if (GetIEditor()->GetEditTool() && !GetIEditor()->GetEditTool()->IsDisplayGrid()) - { - return; - } - - DisplayContext& dc = m_displayContext; - - int prevState = dc.GetState(); - dc.DepthWriteOff(); - - Vec3 p = pSelGroup->GetObject(0)->GetWorldPos(); - - AABB bbox; - pSelGroup->GetObject(0)->GetBoundBox(bbox); - float size = 2 * bbox.GetRadius(); - float alphaMax = 1.0f, alphaMin = 0.2f; - dc.SetLineWidth(3); - - if (GetIEditor()->GetEditMode() == eEditModeMove && pGrid->IsEnabled()) - // Draw the translation grid. - { - Vec3 u = m_constructionPlaneAxisX; - Vec3 v = m_constructionPlaneAxisY; - float step = pGrid->scale * pGrid->size; - const int MIN_STEP_COUNT = 5; - const int MAX_STEP_COUNT = 300; - int nSteps = std::min(std::max(FloatToIntRet(size / step), MIN_STEP_COUNT), MAX_STEP_COUNT); - size = nSteps * step; - for (int i = -nSteps; i <= nSteps; ++i) - { - // Draw u lines. - float alphaCur = alphaMax - fabsf(float(i) / float(nSteps)) * (alphaMax - alphaMin); - dc.DrawLine(p + v * (step * i), p + u * size + v * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - dc.DrawLine(p + v * (step * i), p - u * size + v * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - // Draw v lines. - dc.DrawLine(p + u * (step * i), p + v * size + u * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - dc.DrawLine(p + u * (step * i), p - v * size + u * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - } - } - else if (GetIEditor()->GetEditMode() == eEditModeRotate && pGrid->IsAngleSnapEnabled()) - // Draw the rotation grid. - { - int nAxis(GetAxisConstrain()); - if (nAxis == AXIS_X || nAxis == AXIS_Y || nAxis == AXIS_Z) - { - RefCoordSys coordSys = GetIEditor()->GetReferenceCoordSys(); - Vec3 xAxis(1, 0, 0); - Vec3 yAxis(0, 1, 0); - Vec3 zAxis(0, 0, 1); - Vec3 rotAxis; - if (nAxis == AXIS_X) - { - rotAxis = m_constructionMatrix[coordSys].TransformVector(xAxis); - } - else if (nAxis == AXIS_Y) - { - rotAxis = m_constructionMatrix[coordSys].TransformVector(yAxis); - } - else if (nAxis == AXIS_Z) - { - rotAxis = m_constructionMatrix[coordSys].TransformVector(zAxis); - } - Vec3 anotherAxis = m_constructionPlane.n * size; - float step = pGrid->angleSnap; - int nSteps = FloatToIntRet(180.0f / step); - for (int i = 0; i < nSteps; ++i) - { - AngleAxis rot(i* step* gf_PI / 180.0, rotAxis); - Vec3 dir = rot * anotherAxis; - dc.DrawLine(p, p + dir, - ColorF(0, 0, 0, alphaMax), ColorF(0, 0, 0, alphaMin)); - dc.DrawLine(p, p - dir, - ColorF(0, 0, 0, alphaMax), ColorF(0, 0, 0, alphaMin)); - } - } - } - dc.SetState(prevState); -} - ////////////////////////////////////////////////////////////////////////// EditorViewportWidget::SPreviousContext EditorViewportWidget::SetCurrentContext(int /*newWidth*/, int /*newHeight*/) const { @@ -3320,7 +2864,10 @@ void EditorViewportWidget::UpdateScene() AzFramework::SceneSystemRequestBus::BroadcastResult(scenes, &AzFramework::SceneSystemRequests::GetAllScenes); if (scenes.size() > 0) { - m_renderViewport->SetScene(scenes[0]); + AZ::RPI::SceneNotificationBus::Handler::BusDisconnect(); + auto scene = scenes[0]; + m_renderViewport->SetScene(scene); + AZ::RPI::SceneNotificationBus::Handler::BusConnect(m_renderViewport->GetViewportContext()->GetRenderScene()->GetId()); } } diff --git a/Code/Sandbox/Editor/EditorViewportWidget.h b/Code/Sandbox/Editor/EditorViewportWidget.h index 2723541973..cf5ce4c5b5 100644 --- a/Code/Sandbox/Editor/EditorViewportWidget.h +++ b/Code/Sandbox/Editor/EditorViewportWidget.h @@ -36,6 +36,7 @@ #include #include #include +#include #endif #include @@ -76,6 +77,7 @@ class SANDBOX_API EditorViewportWidget , public AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler , public AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler , public AzFramework::AssetCatalogEventBus::Handler + , public AZ::RPI::SceneNotificationBus::Handler { AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING @@ -187,10 +189,6 @@ public: virtual void OnStartPlayInEditor(); virtual void OnStopPlayInEditor(); - // AzToolsFramework::EditorEvents::Bus (handler moved to cpp to resolve link issues in unity builds) - // We use this to determine when the viewport context menu is being displayed so we can exit move mode - void PopulateEditorGlobalContextMenu(QMenu* /*menu*/, const AZ::Vector2& /*point*/, int /*flags*/); - // AzToolsFramework::ViewportInteractionRequestBus AzFramework::CameraState GetCameraState(); bool GridSnappingEnabled(); @@ -353,13 +351,8 @@ protected: void RenderConstructionPlane(); void RenderSnapMarker(); - void RenderCursorString(); - void RenderSnappingGrid(); void RenderAll(); - void DrawAxis(); - void DrawBackground(); - void InitDisplayContext(); struct SPreviousContext { @@ -381,6 +374,7 @@ protected: void PreWidgetRendering() override; void PostWidgetRendering() override; + void OnBeginPrepareRender() override; // Update the safe frame, safe action, safe title, and borders rectangles based on // viewport size and target aspect ratio. @@ -392,9 +386,6 @@ protected: // Draw one of the safe frame rectangles with the desired color. void RenderSafeFrame(const QRect& frame, float r, float g, float b, float a); - // Draw the selection rectangle. - void RenderSelectionRectangle(); - // Draw a selected region if it has been selected void RenderSelectedRegion(); @@ -634,6 +625,7 @@ private: bool m_updatingCameraPosition = false; AZ::RPI::ViewportContext::MatrixChangedEvent::Handler m_cameraViewMatrixChangeHandler; AZ::RPI::ViewportContext::MatrixChangedEvent::Handler m_cameraProjectionMatrixChangeHandler; + AzFramework::DebugDisplayRequests* m_debugDisplay = nullptr; AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING }; diff --git a/Code/Sandbox/Editor/GameEngine.cpp b/Code/Sandbox/Editor/GameEngine.cpp index 258ed52dbc..a6293bbd81 100644 --- a/Code/Sandbox/Editor/GameEngine.cpp +++ b/Code/Sandbox/Editor/GameEngine.cpp @@ -61,10 +61,6 @@ // Including this too early will result in a linker error #include - -static const char defaultFileExtension[] = ".ly"; -static const char oldFileExtension[] = ".cry"; - // Implementation of System Callback structure. struct SSystemUserCallback : public ISystemUserCallback @@ -274,7 +270,7 @@ AZ_POP_DISABLE_WARNING m_hSystemHandle = 0; m_bJustCreated = false; m_levelName = "Untitled"; - m_levelExtension = defaultFileExtension; + m_levelExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); m_playerViewTM.SetIdentity(); GetIEditor()->RegisterNotifyListener(this); AZ::Interface::Register(this); @@ -541,14 +537,17 @@ void CGameEngine::SetLevelPath(const QString& path) m_levelName = m_levelPath.mid(m_levelPath.lastIndexOf('/') + 1); + const char* oldExtension = EditorUtils::LevelFile::GetOldCryFileExtension(); + const char* defaultExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); + // Store off if - if (QFileInfo(path + oldFileExtension).exists()) + if (QFileInfo(path + oldExtension).exists()) { - m_levelExtension = oldFileExtension; + m_levelExtension = oldExtension; } else { - m_levelExtension = defaultFileExtension; + m_levelExtension = defaultExtension; } if (gEnv->p3DEngine) @@ -576,12 +575,20 @@ bool CGameEngine::LoadLevel( // directory is wrong QDir::setCurrent(GetIEditor()->GetPrimaryCDFolder()); - QString pakFile = m_levelPath + "/level.pak"; - // Open Pak file for this level. - if (!m_pISystem->GetIPak()->OpenPack(m_levelPath.toUtf8().data(), pakFile.toUtf8().data())) + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (!usePrefabSystemForLevels) { - CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, "Level Pack File %s Not Found", pakFile.toUtf8().data()); + QString pakFile = m_levelPath + "/level.pak"; + + // Open Pak file for this level. + if (!m_pISystem->GetIPak()->OpenPack(m_levelPath.toUtf8().data(), pakFile.toUtf8().data())) + { + CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, "Level Pack File %s Not Found", pakFile.toUtf8().data()); + } } // Initialize physics grid. diff --git a/Code/Sandbox/Editor/GameExporter.cpp b/Code/Sandbox/Editor/GameExporter.cpp index 35f633c5e8..e56563cf6d 100644 --- a/Code/Sandbox/Editor/GameExporter.cpp +++ b/Code/Sandbox/Editor/GameExporter.cpp @@ -108,151 +108,162 @@ bool CGameExporter::Export(unsigned int flags, [[maybe_unused]] EEndian eExportE bool exportSuccessful = true; CrySystemEventBus::Broadcast(&CrySystemEventBus::Events::OnCryEditorBeginLevelExport); - pEditor->Notify(eNotify_OnBeginExportToGame); - CObjectManager* pObjectManager = static_cast(pEditor->GetObjectManager()); + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); - QDir::setCurrent(pEditor->GetPrimaryCDFolder()); - - // Close all Editor tools - pEditor->SetEditTool(0); - - QString sLevelPath = Path::AddSlash(pGameEngine->GetLevelPath()); - if (subdirectory && subdirectory[0] && strcmp(subdirectory, ".") != 0) + if (usePrefabSystemForLevels) { - sLevelPath = Path::AddSlash(sLevelPath + subdirectory); - QDir().mkpath(sLevelPath); + // Level.pak and all the data contained within it is unused when using the prefab system for levels, so there's nothing + // to do here. + + CCryEditDoc* pDocument = pEditor->GetDocument(); + pDocument->SetLevelExported(true); } + else + { + CObjectManager* pObjectManager = static_cast(pEditor->GetObjectManager()); - m_levelPak.m_sPath = QString(sLevelPath) + GetLevelPakFilename(); + QDir::setCurrent(pEditor->GetPrimaryCDFolder()); - m_levelPath = Path::RemoveBackslash(sLevelPath); - QString rootLevelPath = Path::AddSlash(pGameEngine->GetLevelPath()); + // Close all Editor tools + pEditor->SetEditTool(0); - // Make sure we unload any unused CGFs before exporting so that they don't end up in - // the level data. - pEditor->Get3DEngine()->FreeUnusedCGFResources(); + QString sLevelPath = Path::AddSlash(pGameEngine->GetLevelPath()); + if (subdirectory && subdirectory[0] && strcmp(subdirectory, ".") != 0) + { + sLevelPath = Path::AddSlash(sLevelPath + subdirectory); + QDir().mkpath(sLevelPath); + } - CCryEditDoc* pDocument = pEditor->GetDocument(); + m_levelPak.m_sPath = QString(sLevelPath) + GetLevelPakFilename(); - if (flags & eExp_Fast) - { - m_settings.SetLowQuality(); - } - else if (m_bAutoExportMode) - { - m_settings.SetHiQuality(); - } + m_levelPath = Path::RemoveBackslash(sLevelPath); + QString rootLevelPath = Path::AddSlash(pGameEngine->GetLevelPath()); - CryAutoLock autoLock(CGameEngine::GetPakModifyMutex()); + // Make sure we unload any unused CGFs before exporting so that they don't end up in + // the level data. + pEditor->Get3DEngine()->FreeUnusedCGFResources(); - // Close this pak file. - if (!CloseLevelPack(m_levelPak, true)) - { - Error("Cannot close Pak file " + m_levelPak.m_sPath); - exportSuccessful = false; - } + CCryEditDoc* pDocument = pEditor->GetDocument(); - if (exportSuccessful) - { - if (m_bAutoExportMode) + if (flags & eExp_Fast) { - // Remove read-only flags. - CrySetFileAttributes(m_levelPak.m_sPath.toUtf8().data(), FILE_ATTRIBUTE_NORMAL); + m_settings.SetLowQuality(); + } + else if (m_bAutoExportMode) + { + m_settings.SetHiQuality(); } - } - ////////////////////////////////////////////////////////////////////////// - if (exportSuccessful) - { - if (!CFileUtil::OverwriteFile(m_levelPak.m_sPath)) + CryAutoLock autoLock(CGameEngine::GetPakModifyMutex()); + + // Close this pak file. + if (!CloseLevelPack(m_levelPak, true)) { - Error("Cannot overwrite Pak file " + m_levelPak.m_sPath); + Error("Cannot close Pak file " + m_levelPak.m_sPath); exportSuccessful = false; } - } - if (exportSuccessful) - { - if (!OpenLevelPack(m_levelPak, false)) + if (exportSuccessful) { - Error("Cannot open Pak file " + m_levelPak.m_sPath + " for writing."); - exportSuccessful = false; + if (m_bAutoExportMode) + { + // Remove read-only flags. + CrySetFileAttributes(m_levelPak.m_sPath.toUtf8().data(), FILE_ATTRIBUTE_NORMAL); + } } - } + ////////////////////////////////////////////////////////////////////////// + if (exportSuccessful) + { + if (!CFileUtil::OverwriteFile(m_levelPak.m_sPath)) + { + Error("Cannot overwrite Pak file " + m_levelPak.m_sPath); + exportSuccessful = false; + } + } - //////////////////////////////////////////////////////////////////////// - // Inform all objects that an export is about to begin - //////////////////////////////////////////////////////////////////////// - if (exportSuccessful) - { - GetIEditor()->GetObjectManager()->GetPhysicsManager()->PrepareForExport(); - GetIEditor()->GetObjectManager()->SendEvent(EVENT_PRE_EXPORT); - } + if (exportSuccessful) + { + if (!OpenLevelPack(m_levelPak, false)) + { + Error("Cannot open Pak file " + m_levelPak.m_sPath + " for writing."); + exportSuccessful = false; + } + } - //////////////////////////////////////////////////////////////////////// - // Export all data to the game - //////////////////////////////////////////////////////////////////////// - if (exportSuccessful) - { - ExportVisAreas(sLevelPath.toUtf8().data(), eExportEndian); + //////////////////////////////////////////////////////////////////////// + // Inform all objects that an export is about to begin + //////////////////////////////////////////////////////////////////////// + if (exportSuccessful) + { + GetIEditor()->GetObjectManager()->GetPhysicsManager()->PrepareForExport(); + } //////////////////////////////////////////////////////////////////////// - // Exporting map setttings + // Export all data to the game //////////////////////////////////////////////////////////////////////// - ExportOcclusionMesh(sLevelPath.toUtf8().data()); + if (exportSuccessful) + { + ExportVisAreas(sLevelPath.toUtf8().data(), eExportEndian); - //! Export Level data. - CLogFile::WriteLine("Exporting LevelData.xml"); - ExportLevelData(sLevelPath); - CLogFile::WriteLine("Exporting LevelData.xml done."); + //////////////////////////////////////////////////////////////////////// + // Exporting map setttings + //////////////////////////////////////////////////////////////////////// + ExportOcclusionMesh(sLevelPath.toUtf8().data()); - ExportLevelInfo(sLevelPath); + //! Export Level data. + CLogFile::WriteLine("Exporting LevelData.xml"); + ExportLevelData(sLevelPath); + CLogFile::WriteLine("Exporting LevelData.xml done."); - ExportLevelLensFlares(sLevelPath); - ExportLevelResourceList(sLevelPath); - ExportLevelUsedResourceList(sLevelPath); - ExportLevelShaderCache(sLevelPath); + ExportLevelInfo(sLevelPath); - ////////////////////////////////////////////////////////////////////////// - // End Exporting Game data. - ////////////////////////////////////////////////////////////////////////// + ExportLevelLensFlares(sLevelPath); + ExportLevelResourceList(sLevelPath); + ExportLevelUsedResourceList(sLevelPath); + ExportLevelShaderCache(sLevelPath); - // Close all packs. - CloseLevelPack(m_levelPak, false); - // m_texturePakFile.Close(); + ////////////////////////////////////////////////////////////////////////// + // End Exporting Game data. + ////////////////////////////////////////////////////////////////////////// - pEditor->SetStatusText(QObject::tr("Ready")); + // Close all packs. + CloseLevelPack(m_levelPak, false); + // m_texturePakFile.Close(); - // Reopen this pak file. - if (!OpenLevelPack(m_levelPak, true)) - { - Error("Cannot open Pak file " + m_levelPak.m_sPath); - exportSuccessful = false; + pEditor->SetStatusText(QObject::tr("Ready")); + + // Reopen this pak file. + if (!OpenLevelPack(m_levelPak, true)) + { + Error("Cannot open Pak file " + m_levelPak.m_sPath); + exportSuccessful = false; + } } - } - if (exportSuccessful) - { - // Commit changes to the disk. - _flushall(); + if (exportSuccessful) + { + // Commit changes to the disk. + _flushall(); - // finally create filelist.xml - QString levelName = Path::GetFileName(pGameEngine->GetLevelPath()); - ExportFileList(sLevelPath, levelName); + // finally create filelist.xml + QString levelName = Path::GetFileName(pGameEngine->GetLevelPath()); + ExportFileList(sLevelPath, levelName); - pDocument->SetLevelExported(true); + pDocument->SetLevelExported(true); + } } // Always notify that we've finished exporting, whether it was successful or not. - pEditor->Notify(eNotify_OnExportToGame); CrySystemEventBus::Broadcast(&CrySystemEventBus::Events::OnCryEditorEndLevelExport, exportSuccessful); if (exportSuccessful) { // Notify the level system that there's a new level, so that the level info is populated. - gEnv->pSystem->GetILevelSystem()->Rescan("levels", ILevelSystem::TAG_MAIN); + gEnv->pSystem->GetILevelSystem()->Rescan(ILevelSystem::GetLevelsDirectoryName()); CLogFile::WriteLine("Exporting was successful."); } diff --git a/Code/Sandbox/Editor/GameExporter.h b/Code/Sandbox/Editor/GameExporter.h index f9862f0d2b..87e24ef844 100644 --- a/Code/Sandbox/Editor/GameExporter.h +++ b/Code/Sandbox/Editor/GameExporter.h @@ -17,6 +17,7 @@ #include "Util/PakFile.h" #include "Util/Image.h" +#include enum EGameExport { @@ -26,7 +27,6 @@ enum EGameExport }; -class CTerrainLightGen; class CWaitProgress; class CUsedResources; @@ -61,21 +61,33 @@ class SANDBOX_API CGameExporter public: CGameExporter(); ~CGameExporter(); - static const char* GetLevelPakFilename() { return "level.pak"; } SGameExporterSettings& GetSettings() { return m_settings; } - SLevelPakHelper& GetLevelPack() { return m_levelPak; } - // In auto exporting mode, highest possible settings will be chosen and no UI dialogs will be shown. void SetAutoExportMode(bool bAuto) { m_bAutoExportMode = bAuto; } bool Export(unsigned int flags = 0, EEndian eExportEndian = GetPlatformEndian(), const char* subdirectory = 0); - bool OpenLevelPack(SLevelPakHelper& lphelper, bool bCryPak = false); - bool CloseLevelPack(SLevelPakHelper& lphelper, bool bCryPak = false); static CGameExporter* GetCurrentExporter() { return m_pCurrentExporter; } private: + bool OpenLevelPack(SLevelPakHelper& lphelper, bool bCryPak = false); + bool CloseLevelPack(SLevelPakHelper& lphelper, bool bCryPak = false); + + static const char* GetLevelPakFilename() + { + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (usePrefabSystemForLevels) + { + AZ_Assert(false, "Level.pak should no longer be used when prefabs are used for levels."); + return ""; + } + + return "level.pak"; + } + void ExportLevelData(const QString& path, bool bExportMission = true); void ExportLevelInfo(const QString& path); diff --git a/Code/Sandbox/Editor/IEditor.h b/Code/Sandbox/Editor/IEditor.h index 6b96ce6a59..7715e64fe5 100644 --- a/Code/Sandbox/Editor/IEditor.h +++ b/Code/Sandbox/Editor/IEditor.h @@ -144,8 +144,6 @@ enum EEditorNotifyEvent eNotify_OnMissionChange, // Send when the current mission changes. eNotify_OnBeginLoad, // Sent when the document is start to load. eNotify_OnEndLoad, // Sent when the document loading is finished - eNotify_OnBeginExportToGame, // Sent when the level starts to be exported to game - eNotify_OnExportToGame, // Sent when the level is exported to game // Editing events. eNotify_OnEditModeChange, // Sent when editing mode change (move,rotate,scale,....) @@ -818,7 +816,6 @@ struct IEditor virtual void LoadPlugins() = 0; virtual bool IsNewViewportInteractionModelEnabled() const = 0; - virtual bool IsPrefabSystemEnabled() const = 0; }; //! Callback used by editor when initializing for info in UI dialogs diff --git a/Code/Sandbox/Editor/IEditorImpl.cpp b/Code/Sandbox/Editor/IEditorImpl.cpp index f2ceea58bc..965d15f30c 100644 --- a/Code/Sandbox/Editor/IEditorImpl.cpp +++ b/Code/Sandbox/Editor/IEditorImpl.cpp @@ -90,9 +90,6 @@ AZ_POP_DISABLE_WARNING #include "Editor/AssetDatabase/AssetDatabaseLocationListener.h" #include "Editor/AzAssetBrowser/AzAssetBrowserRequestHandler.h" -#include "Editor/Thumbnails/TextureThumbnailRenderer.h" -#include "Editor/Thumbnails/StaticMeshThumbnailRenderer.h" -#include "Editor/Thumbnails/MaterialThumbnailRenderer.h" #include "Editor/AssetEditor/AssetEditorRequestsHandler.h" // EditorCommon @@ -213,9 +210,6 @@ CEditorImpl::CEditorImpl() SetPrimaryCDFolder(); gSettings.Load(); - // retrieve this after the settings have been loaded - m_isPrefabSystemEnabled = gSettings.prefabSystem; - m_pErrorReport = new CErrorReport; m_pClassFactory = CClassFactory::Instance(); m_pCommandManager = new CEditorCommandManager; @@ -451,10 +445,6 @@ void CEditorImpl::SetGameEngine(CGameEngine* ge) m_pMaterialManager->Set3DEngine(); m_pAnimationContext->Init(); - - m_thumbnailRenderers.push_back(AZStd::make_unique()); - m_thumbnailRenderers.push_back(AZStd::make_unique()); - m_thumbnailRenderers.push_back(AZStd::make_unique()); } void CEditorImpl::RegisterTools() @@ -2087,11 +2077,6 @@ bool CEditorImpl::IsNewViewportInteractionModelEnabled() const return m_isNewViewportInteractionModelEnabled; } -bool CEditorImpl::IsPrefabSystemEnabled() const -{ - return m_isPrefabSystemEnabled; -} - void CEditorImpl::OnStartPlayInEditor() { if (SelectionContainsComponentEntities()) diff --git a/Code/Sandbox/Editor/IEditorImpl.h b/Code/Sandbox/Editor/IEditorImpl.h index d540392a81..9e3b3abc66 100644 --- a/Code/Sandbox/Editor/IEditorImpl.h +++ b/Code/Sandbox/Editor/IEditorImpl.h @@ -360,7 +360,6 @@ public: void DestroyQMimeData(QMimeData* data) const override; bool IsNewViewportInteractionModelEnabled() const override; - bool IsPrefabSystemEnabled() const override; protected: @@ -469,7 +468,6 @@ protected: ::AssetDatabase::AssetDatabaseLocationListener* m_pAssetDatabaseLocationListener; AzAssetBrowserRequestHandler* m_pAssetBrowserRequestHandler; AssetEditorRequestsHandler* m_assetEditorRequestsHandler; - AZStd::vector> m_thumbnailRenderers; IImageUtil* m_pImageUtil; // Vladimir@conffx ILogFile* m_pLogFile; // Vladimir@conffx @@ -478,6 +476,5 @@ protected: static const char* m_crashLogFileName; bool m_isNewViewportInteractionModelEnabled = true; - bool m_isPrefabSystemEnabled = false; }; diff --git a/Code/Sandbox/Editor/Include/Command.h b/Code/Sandbox/Editor/Include/Command.h index 4bf77adbab..3a6fc2674a 100644 --- a/Code/Sandbox/Editor/Include/Command.h +++ b/Code/Sandbox/Editor/Include/Command.h @@ -768,12 +768,12 @@ QString CCommand6::Execute(const CCommand::CArgs& args) return ""; } - P1 p1; - P2 p2; - P3 p3; - P4 p4; - P5 p5; - P6 p6; + P1 p1 = 0; + P2 p2 = 0; + P3 p3 = 0; + P4 p4 = 0; + P5 p5 = 0; + P6 p6 = 0; bool ok = FromString_(p1, args.GetArg(0).c_str()) && FromString_(p2, args.GetArg(1).c_str()) && FromString_(p3, args.GetArg(2).c_str()) @@ -782,9 +782,7 @@ QString CCommand6::Execute(const CCommand::CArgs& args) && FromString_(p6, args.GetArg(5).c_str()); if (ok) { - AZ_PUSH_DISABLE_WARNING(4703, "-Wunknown-warning-option") m_functor(p1, p2, p3, p4, p5, p6); - AZ_POP_DISABLE_WARNING } else { diff --git a/Code/Sandbox/Editor/Include/ObjectEvent.h b/Code/Sandbox/Editor/Include/ObjectEvent.h index 4c56400b27..3f6addb736 100644 --- a/Code/Sandbox/Editor/Include/ObjectEvent.h +++ b/Code/Sandbox/Editor/Include/ObjectEvent.h @@ -43,8 +43,6 @@ enum ObjectEvent EVENT_PHYSICS_RESETSTATE,//!< Signals that physics state must be reseted on objects. EVENT_PHYSICS_APPLYSTATE,//!< Signals that the stored physics state must be applied to objects. - EVENT_PRE_EXPORT, //!< Signals that the game is about to be exported, prepare any data if the object needs to - EVENT_FREE_GAME_DATA,//!< Object should free game data that its holding. EVENT_CONFIG_SPEC_CHANGE, //!< Called when config spec changed. EVENT_HIDE_HELPER, //!< Signals that happens when Helper mode switches to be hidden. diff --git a/Code/Sandbox/Editor/LevelFileDialog.cpp b/Code/Sandbox/Editor/LevelFileDialog.cpp index dee31a21c0..7b76e19af0 100644 --- a/Code/Sandbox/Editor/LevelFileDialog.cpp +++ b/Code/Sandbox/Editor/LevelFileDialog.cpp @@ -15,6 +15,8 @@ #include "LevelFileDialog.h" +#include + // Qt #include #include @@ -22,6 +24,7 @@ // Editor #include "LevelTreeModel.h" #include "CryEditDoc.h" +#include "API/ToolsApplicationAPI.h" AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING @@ -30,10 +33,6 @@ AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING static const char lastLoadPathFilename[] = "lastLoadPath.preset"; -// File name extension for the main level file -static const char kLevelExtension[] = "ly"; -static const char kOldLevelExtension[] = "cry"; - // Folder in which levels are stored static const char kLevelsFolder[] = "Levels"; @@ -49,10 +48,8 @@ static const char* kLevelFolderNames[] = static const char* kLevelFileNames[] = { "level.pak", - "terraintexture.pak", "filelist.xml", "levelshadercache.pak", - "terrain\\cover.ctc" }; CLevelFileDialog::CLevelFileDialog(bool openDialog, QWidget* parent) @@ -164,7 +161,7 @@ void CLevelFileDialog::OnOK() } } - m_fileName = levelPath + "/" + Path::GetFileName(levelPath) + "." + kLevelExtension; + m_fileName = levelPath + "/" + Path::GetFileName(levelPath) + EditorUtils::LevelFile::GetDefaultFileExtension(); } SaveLastUsedLevelPath(); @@ -209,9 +206,12 @@ bool CLevelFileDialog::IsValidLevelSelected() QString levelPath = GetLevelPath(); m_fileName = GetFileName(levelPath); - QString currentExtension = Path::GetExt(m_fileName); + QString currentExtension = "." + Path::GetExt(m_fileName); + + const char* oldExtension = EditorUtils::LevelFile::GetOldCryFileExtension(); + const char* defaultExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); - bool isInvalidFileExtension = (currentExtension != kLevelExtension && currentExtension != kOldLevelExtension); + bool isInvalidFileExtension = (currentExtension != defaultExtension && currentExtension != oldExtension); if (!isInvalidFileExtension && CFileUtil::FileExists(m_fileName)) { @@ -246,10 +246,13 @@ QString CLevelFileDialog::GetFileName(QString levelPath) if (CheckLevelFolder(levelPath, &levelFiles) && levelFiles.size() >= 1) { + const char* oldExtension = EditorUtils::LevelFile::GetOldCryFileExtension(); + const char* defaultExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); + // A level folder was entered. Prefer the .ly/.cry file with the // folder name, otherwise pick the first one in the list QString path = Path::GetFileName(levelPath); - QString needle = path + "." + kLevelExtension; + QString needle = path + defaultExtension; auto iter = std::find(levelFiles.begin(), levelFiles.end(), needle); if (iter != levelFiles.end()) @@ -258,7 +261,7 @@ QString CLevelFileDialog::GetFileName(QString levelPath) } else { - needle = path + "." + kOldLevelExtension; + needle = path + oldExtension; iter = std::find(levelFiles.begin(), levelFiles.end(), needle); if (iter != levelFiles.end()) { @@ -379,7 +382,7 @@ void CLevelFileDialog::ReloadTree() } ////////////////////////////////////////////////////////////////////////// -// Heuristic to detect a level folder, also returns all .cry files in it +// Heuristic to detect a level folder, also returns all .cry/.ly files in it ////////////////////////////////////////////////////////////////////////// bool CLevelFileDialog::CheckLevelFolder(const QString folder, QStringList* levelFiles) { @@ -392,28 +395,13 @@ bool CLevelFileDialog::CheckLevelFolder(const QString folder, QStringList* level { const QString fileName = fileData.fileName(); - // Have we found a folder? - if (fileData.isDir()) + if (!fileData.isDir()) { - // Skip the parent folder entries - if (fileName == "." || fileName == "..") - { - continue; - } + QString ext = "." + Path::GetExt(fileName); - for (unsigned int i = 0; i < sizeof(kLevelFolderNames) / sizeof(char*); ++i) - { - if (fileName == kLevelFolderNames[i]) - { - bIsLevelFolder = true; - } - } - } - else - { - QString ext = Path::GetExt(fileName); + const char* defaultExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); - if (ext == kLevelExtension || ext == kOldLevelExtension) + if (ext == defaultExtension) { bIsLevelFolder = true; @@ -422,14 +410,6 @@ bool CLevelFileDialog::CheckLevelFolder(const QString folder, QStringList* level levelFiles->push_back(fileName); } } - - for (unsigned int i = 0; i < sizeof(kLevelFileNames) / sizeof(char*); ++i) - { - if (fileName == kLevelFileNames[i]) - { - bIsLevelFolder = true; - } - } } } diff --git a/Code/Sandbox/Editor/LevelTreeModel.cpp b/Code/Sandbox/Editor/LevelTreeModel.cpp index 7dcf08de12..e8ff6fe101 100644 --- a/Code/Sandbox/Editor/LevelTreeModel.cpp +++ b/Code/Sandbox/Editor/LevelTreeModel.cpp @@ -131,7 +131,8 @@ void LevelTreeModel::ReloadTree(QStandardItem* root, bool recurseIfNoLevels) QDir currentDir(parentFullPath); currentDir.setFilter(QDir::NoDot | QDir::NoDotDot | QDir::Dirs); const QStringList subFolders = currentDir.entryList(); - foreach (const QString &subFolder, subFolders) { + foreach (const QString &subFolder, subFolders) + { auto child = new QStandardItem(subFolder); child->setData(parentFullPath + "/" + subFolder, FullPathRole); child->setEditable(false); diff --git a/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h b/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h index 2fbbaa00d2..a290ef5de5 100644 --- a/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h +++ b/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h @@ -211,7 +211,6 @@ public: MOCK_METHOD0(UnloadPlugins, void()); MOCK_METHOD0(LoadPlugins, void()); MOCK_CONST_METHOD0(IsNewViewportInteractionModelEnabled, bool()); - MOCK_CONST_METHOD0(IsPrefabSystemEnabled, bool()); MOCK_METHOD1(GetSearchPath, QString(EEditorPathName)); MOCK_METHOD0(GetEditorPanelUtils, IEditorPanelUtils* ()); diff --git a/Code/Sandbox/Editor/MainWindow.cpp b/Code/Sandbox/Editor/MainWindow.cpp index ed6bdcc4b4..d4f948544c 100644 --- a/Code/Sandbox/Editor/MainWindow.cpp +++ b/Code/Sandbox/Editor/MainWindow.cpp @@ -812,9 +812,17 @@ void MainWindow::InitActions() .SetStatusTip(tr("Save Resources")) .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateDocumentReady); am->AddAction(ID_IMPORT_ASSET, tr("Import &FBX...")); - am->AddAction(ID_FILE_EXPORTTOGAMENOSURFACETEXTURE, tr("&Export to Engine")) - .SetShortcut(tr("Ctrl+E")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateDocumentReady); + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (!usePrefabSystemForLevels) + { + am->AddAction(ID_FILE_EXPORTTOGAMENOSURFACETEXTURE, tr("&Export to Engine")) + .SetShortcut(tr("Ctrl+E")) + .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateDocumentReady); + } + am->AddAction(ID_FILE_EXPORT_SELECTEDOBJECTS, tr("Export Selected &Objects")) .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelected); am->AddAction(ID_FILE_EXPORTOCCLUSIONMESH, tr("Export Occlusion Mesh")); @@ -980,10 +988,20 @@ void MainWindow::InitActions() .SetShortcut(QKeySequence::Delete) .SetStatusTip(tr("Delete selected objects.")) ->setShortcutContext(Qt::WidgetWithChildrenShortcut); - am->AddAction(ID_EDIT_CLONE, tr("Duplicate")) - .SetShortcut(tr("Ctrl+D")) - .SetToolTip(tr("Duplicate (Ctrl+D)")) - .SetStatusTip(tr("Duplicate selected objects.")); + + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + bool prefabWipFeaturesEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled); + + if (!isPrefabSystemEnabled || (isPrefabSystemEnabled && prefabWipFeaturesEnabled)) + { + am->AddAction(ID_EDIT_CLONE, tr("Duplicate")) + .SetShortcut(tr("Ctrl+D")) + .SetToolTip(tr("Duplicate (Ctrl+D)")) + .SetStatusTip(tr("Duplicate selected objects.")); + } } // Modify actions @@ -1091,7 +1109,7 @@ void MainWindow::InitActions() .SetApplyHoverEffect(); am->AddAction(ID_OBJECTMODIFY_ALIGN, tr("Align to object")).SetCheckable(true) #if AZ_TRAIT_OS_PLATFORM_APPLE - .SetStatusTip(tr("⌘: Align an object to a bounding box, ⌥ : Keep Rotation of the moved object, Shift : Keep Scale of the moved object")) + .SetStatusTip(tr(u8"\u2318: Align an object to a bounding box, \u2325 : Keep Rotation of the moved object, Shift : Keep Scale of the moved object")) #else .SetStatusTip(tr("Ctrl: Align an object to a bounding box, Alt : Keep Rotation of the moved object, Shift : Keep Scale of the moved object")) #endif diff --git a/Code/Sandbox/Editor/Material/Material.h b/Code/Sandbox/Editor/Material/Material.h index c9366bf4db..b311744e14 100644 --- a/Code/Sandbox/Editor/Material/Material.h +++ b/Code/Sandbox/Editor/Material/Material.h @@ -304,10 +304,10 @@ private: int m_propagationFlags; //! Material Used in level. - int m_bDummyMaterial : 1; // Dummy material, name specified but material file not found. - int m_bIgnoreNotifyChange : 1; // Do not send notifications about changes. - int m_bRegetPublicParams : 1; - int m_bKeepPublicParamsValues : 1; + unsigned int m_bDummyMaterial : 1; // Dummy material, name specified but material file not found. + unsigned int m_bIgnoreNotifyChange : 1; // Do not send notifications about changes. + unsigned int m_bRegetPublicParams : 1; + unsigned int m_bKeepPublicParamsValues : 1; bool m_allowLayerActivation; }; diff --git a/Code/Sandbox/Editor/Mission.cpp b/Code/Sandbox/Editor/Mission.cpp index b2f8f430c4..57f2033f3b 100644 --- a/Code/Sandbox/Editor/Mission.cpp +++ b/Code/Sandbox/Editor/Mission.cpp @@ -51,10 +51,6 @@ CMission::CMission(CCryEditDoc* doc) m_numCGFObjects = 0; - m_minimap.vCenter = Vec2(512, 512); - m_minimap.vExtends = Vec2(512, 512); - m_minimap.textureWidth = m_minimap.textureHeight = 1024; - m_reentrancyProtector = false; } @@ -85,10 +81,6 @@ void CMission::Serialize(CXmlArchive& ar, bool bParts) ar.root->getAttr("Name", m_name); ar.root->getAttr("Description", m_description); - //time_t time = 0; - //ar.root->getAttr( "Time",time ); - //m_time = time; - XmlNodeRef objects = ar.root->findChild("Objects"); if (objects) { @@ -105,35 +97,13 @@ void CMission::Serialize(CXmlArchive& ar, bool bParts) m_Animations = ar.root->findChild("MovieData"); - /* - XmlNodeRef expData = ar.root->findChild( "ExportData" ); - if (expData) - { - m_exportData = expData; - } - */ SerializeEnvironment(ar); - - XmlNodeRef minimapNode = ar.root->findChild("MiniMap"); - if (minimapNode) - { - minimapNode->getAttr("CenterX", m_minimap.vCenter.x); - minimapNode->getAttr("CenterY", m_minimap.vCenter.y); - minimapNode->getAttr("ExtendsX", m_minimap.vExtends.x); - minimapNode->getAttr("ExtendsY", m_minimap.vExtends.y); - // minimapNode->getAttr( "CameraHeight",m_minimap.cameraHeight ); - minimapNode->getAttr("TexWidth", m_minimap.textureWidth); - minimapNode->getAttr("TexHeight", m_minimap.textureHeight); - } } else { ar.root->setAttr("Name", m_name.toUtf8().data()); ar.root->setAttr("Description", m_description.toUtf8().data()); - //time_t time = m_time.GetTime(); - //ar.root->setAttr( "Time",time ); - QString timeStr; int nHour = floor(m_time); int nMins = (m_time - floor(m_time)) * 60.0f; @@ -154,15 +124,6 @@ void CMission::Serialize(CXmlArchive& ar, bool bParts) SerializeTimeOfDay(ar); SerializeEnvironment(ar); } - - XmlNodeRef minimapNode = ar.root->newChild("MiniMap"); - minimapNode->setAttr("CenterX", m_minimap.vCenter.x); - minimapNode->setAttr("CenterY", m_minimap.vCenter.y); - minimapNode->setAttr("ExtendsX", m_minimap.vExtends.x); - minimapNode->setAttr("ExtendsY", m_minimap.vExtends.y); - // minimapNode->setAttr( "CameraHeight",m_minimap.cameraHeight ); - minimapNode->setAttr("TexWidth", m_minimap.textureWidth); - minimapNode->setAttr("TexHeight", m_minimap.textureHeight); } } @@ -190,15 +151,6 @@ void CMission::Export(XmlNodeRef& root, XmlNodeRef& objectsNode) m_timeOfDay->setAttr("Time", m_time); root->addChild(m_timeOfDay); - XmlNodeRef minimapNode = root->newChild("MiniMap"); - minimapNode->setAttr("CenterX", m_minimap.vCenter.x); - minimapNode->setAttr("CenterY", m_minimap.vCenter.y); - minimapNode->setAttr("ExtendsX", m_minimap.vExtends.x); - minimapNode->setAttr("ExtendsY", m_minimap.vExtends.y); - // minimapNode->setAttr( "CameraHeight",m_minimap.cameraHeight ); - minimapNode->setAttr("TexWidth", m_minimap.textureWidth); - minimapNode->setAttr("TexHeight", m_minimap.textureHeight); - IObjectManager* pObjMan = GetIEditor()->GetObjectManager(); ////////////////////////////////////////////////////////////////////////// @@ -211,19 +163,6 @@ void CMission::Export(XmlNodeRef& root, XmlNodeRef& objectsNode) objectsNode = root->newChild("Objects"); pObjMan->Export(path, objectsNode, true); // Export shared. pObjMan->Export(path, objectsNode, false); // Export not shared. - - /* - CObjectManager objectManager; - XmlNodeRef loadRoot = root->createNode("Root"); - loadRoot->addChild( m_objects ); - - std::vector classes; - GetIEditor()->GetObjectManager()->GetClasses( classes ); - objectManager.SetClasses( classes ); - objectManager.SetCreateGameObject(false); - objectManager.Serialize( loadRoot,true,SERIALIZE_ALL ); - objectManager.Export( path,objects,false ); - */ } ////////////////////////////////////////////////////////////////////////// @@ -321,13 +260,6 @@ void CMission::SetLayersNode(XmlNodeRef& node) m_layers = node->clone(); } -////////////////////////////////////////////////////////////////////////// -void CMission::SetMinimap(const SMinimapInfo& minimap) -{ - m_minimap = minimap; -} - - ////////////////////////////////////////////////////////////////////////// void CMission::SaveParts() { @@ -427,9 +359,3 @@ void CMission::SerializeEnvironment(CXmlArchive& ar) } } -////////////////////////////////////////////////////////////////////////// -const SMinimapInfo& CMission::GetMinimap() const -{ - return m_minimap; -} - diff --git a/Code/Sandbox/Editor/Mission.h b/Code/Sandbox/Editor/Mission.h index facc737f56..f0773a0be7 100644 --- a/Code/Sandbox/Editor/Mission.h +++ b/Code/Sandbox/Editor/Mission.h @@ -16,16 +16,6 @@ #pragma once -struct SMinimapInfo -{ - Vec2 vCenter; - Vec2 vExtends; - // float RenderBoxSize; - int textureWidth; - int textureHeight; - int orientation; -}; - /*! CMission represent single Game Mission on same map. Multiple Missions share same map, and stored in one .cry or .ly file. @@ -82,11 +72,6 @@ public: void OnEnvironmentChange(); int GetNumCGFObjects() const { return m_numCGFObjects; }; - ////////////////////////////////////////////////////////////////////////// - // Minimap. - void SetMinimap(const SMinimapInfo& info); - const SMinimapInfo& GetMinimap() const; - private: //! Document owner of this mission. CCryEditDoc* m_doc; @@ -115,8 +100,6 @@ private: int m_numCGFObjects; - SMinimapInfo m_minimap; - bool m_reentrancyProtector; }; diff --git a/Code/Sandbox/Editor/QuickAccessBar.cpp b/Code/Sandbox/Editor/QuickAccessBar.cpp index 56d591f8e9..f7dd4495c1 100644 --- a/Code/Sandbox/Editor/QuickAccessBar.cpp +++ b/Code/Sandbox/Editor/QuickAccessBar.cpp @@ -64,6 +64,8 @@ void CQuickAccessBar::OnInitDialog() // Make this window 50% alpha. setWindowOpacity(0.5); + m_levelExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); + CollectMenuItems(MainWindow::instance()->menuBar()); AddMRUFileItems(); @@ -143,7 +145,7 @@ void CQuickAccessBar::AddMRUFileItems() { QString mruText; pMRUList->GetDisplayName(mruText, i, ""); - if (mruText.isEmpty()) + if (mruText.isEmpty() || !(*pMRUList)[i].endsWith(m_levelExtension)) { continue; } diff --git a/Code/Sandbox/Editor/QuickAccessBar.h b/Code/Sandbox/Editor/QuickAccessBar.h index 18f4bd30cb..156a056e98 100644 --- a/Code/Sandbox/Editor/QuickAccessBar.h +++ b/Code/Sandbox/Editor/QuickAccessBar.h @@ -60,6 +60,7 @@ private: QStringListModel* m_model; QScopedPointer m_ui; + const char* m_levelExtension = nullptr; }; #endif // CRYINCLUDE_EDITOR_QUICKACCESSBAR_H diff --git a/Code/Sandbox/Editor/RenderViewport.cpp b/Code/Sandbox/Editor/RenderViewport.cpp index 479413ac05..34d8b73a0b 100644 --- a/Code/Sandbox/Editor/RenderViewport.cpp +++ b/Code/Sandbox/Editor/RenderViewport.cpp @@ -92,7 +92,7 @@ #include AZ_CVAR( - bool, ed_visibility_use, false, nullptr, AZ::ConsoleFunctorFlags::Null, + bool, ed_visibility_use, true, nullptr, AZ::ConsoleFunctorFlags::Null, "Enable/disable using the new IVisibilitySystem for Entity visibility determination"); AZ_CVAR( bool, ed_visibility_logTiming, false, nullptr, AZ::ConsoleFunctorFlags::Null, diff --git a/Code/Sandbox/Editor/Settings.cpp b/Code/Sandbox/Editor/Settings.cpp index 316a8aad86..b3efb52440 100644 --- a/Code/Sandbox/Editor/Settings.cpp +++ b/Code/Sandbox/Editor/Settings.cpp @@ -27,6 +27,9 @@ #include #include +// AzFramework +#include + // AzToolsFramework #include @@ -34,9 +37,6 @@ #include "CryEdit.h" #include "MainWindow.h" -// Editor Preferences Settings Registry keys -constexpr char prefabSystemKey[] = "/Amazon/Editor/Preferences/EnablePrefabSystem"; - #pragma comment(lib, "Gdi32.lib") ////////////////////////////////////////////////////////////////////////// @@ -694,7 +694,8 @@ void SEditorSettings::Save() // --- Settings Registry values // Prefab System UI - SetSettingsRegistry_Bool(prefabSystemKey, prefabSystem); + AzFramework::ApplicationRequests::Bus::Broadcast( + &AzFramework::ApplicationRequests::SetPrefabSystemEnabled, prefabSystem); SaveSettingsRegistryFile(); } @@ -943,7 +944,9 @@ void SEditorSettings::Load() } // Load from Settings Registry - GetSettingsRegistry_Bool(prefabSystemKey, prefabSystem); + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabSystem, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + } ////////////////////////////////////////////////////////////////////////// @@ -1178,11 +1181,11 @@ void SEditorSettings::SaveSettingsRegistryFile() AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings; dumperSettings.m_prettifyOutput = true; - dumperSettings.m_jsonPointerPrefix = "/Amazon/Editor/Preferences"; + dumperSettings.m_jsonPointerPrefix = "/Amazon/Preferences"; AZStd::string stringBuffer; AZ::IO::ByteContainerStream stringStream(&stringBuffer); - if (!AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(*registry, "/Amazon/Editor/Preferences", stringStream, dumperSettings)) + if (!AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(*registry, "/Amazon/Preferences", stringStream, dumperSettings)) { AZ_Warning("SEditorSettings", false, R"(Unable to save changes to the Editor Preferences registry file at "%s"\n)", editorPreferencesFilePath.c_str()); diff --git a/Code/Sandbox/Editor/Settings.h b/Code/Sandbox/Editor/Settings.h index 5d9da37582..918647388a 100644 --- a/Code/Sandbox/Editor/Settings.h +++ b/Code/Sandbox/Editor/Settings.h @@ -499,7 +499,7 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING SSliceSettings sliceSettings; - bool prefabSystem = false; ///< Toggle to enable the Prefab system for level entities. + bool prefabSystem = true; ///< Toggle to enable/disable the Prefab system for level entities. private: void SaveValue(const char* sSection, const char* sKey, int value); diff --git a/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.cpp b/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.cpp deleted file mode 100644 index a7d183d336..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "EditorDefs.h" - -#include "ThumbnailsSampleWidget.h" - -// Qt -#include - -// AzToolsFramework -#include -#include -#include -#include - -// Editor -#include "QtViewPaneManager.h" // for RegisterQtViewPane - - -AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING -#include -AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING - -const int MAX_PRODUCTS_TO_DISPLAY = 20; - -ThumbnailsSampleWidget::ThumbnailsSampleWidget(QWidget* parent) - : QWidget(parent) - , m_ui(new Ui::ThumbnailsSampleWidgetClass()) - , m_filterModel(new AzToolsFramework::AssetBrowser::AssetBrowserFilterModel(parent)) -{ - m_ui->setupUi(this); - m_ui->m_searchWidget->Setup(true, true); - - using namespace AzToolsFramework::AssetBrowser; - AssetBrowserComponentRequestBus::BroadcastResult(m_assetBrowserModel, &AssetBrowserComponentRequests::GetAssetBrowserModel); - AZ_Assert(m_assetBrowserModel, "Failed to get filebrowser model"); - m_filterModel->setSourceModel(m_assetBrowserModel); - m_filterModel->SetFilter(m_ui->m_searchWidget->GetFilter()); - - m_ui->m_assetBrowserTreeViewWidget->setModel(m_filterModel.data()); - - auto layout = static_cast(m_ui->m_thumbnailScrollAreaRoot->layout()); - layout->addStretch(1); - - connect(m_ui->m_assetBrowserTreeViewWidget, &AssetBrowserTreeView::selectionChangedSignal, - this, &ThumbnailsSampleWidget::SelectionChangedSlot); - connect(m_ui->m_searchWidget->GetFilter().data(), &AzToolsFramework::AssetBrowser::AssetBrowserEntryFilter::updatedSignal, - m_filterModel.data(), &AzToolsFramework::AssetBrowser::AssetBrowserFilterModel::filterUpdatedSlot); -} - -ThumbnailsSampleWidget::~ThumbnailsSampleWidget() = default; - -void ThumbnailsSampleWidget::RegisterViewClass() -{ - QtViewOptions options; - options.preferedDockingArea = Qt::NoDockWidgetArea; - options.canHaveMultipleInstances = true; - RegisterQtViewPane(GetIEditor(), "Thumbnails Demo", LyViewPane::CategoryTools, options); -} - -void ThumbnailsSampleWidget::SelectionChangedSlot(const QItemSelection& /*selected*/, const QItemSelection& /*deselected*/) const -{ - UpdateThumbnail(); -} - -void ThumbnailsSampleWidget::UpdateThumbnail() const -{ - auto layout = static_cast(m_ui->m_thumbnailScrollAreaRoot->layout()); - // delete any previous thumbnails - qDeleteAll(m_ui->m_thumbnailScrollAreaRoot->findChildren("", Qt::FindDirectChildrenOnly)); - - auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets(); - if (selectedAssets.size() > 0) - { - using namespace AzToolsFramework::AssetBrowser; - //get all products from selected entry (it can be a folder, source or product asset and can contain 0 or more products) - AZStd::vector products; - selectedAssets.front()->GetChildrenRecursively(products); - - // because thumbnails are displayed via individual widgets, limit to 10 otherwise it can take ages - - int productsLeft = MAX_PRODUCTS_TO_DISPLAY; - for (const auto* product : products) - { - // create thumbnail widget - auto thumbnailWidget = new AzToolsFramework::Thumbnailer::ThumbnailWidget(m_ui->m_thumbnailScrollArea); - thumbnailWidget->SetThumbnailKey(MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, product->GetAssetId())); - thumbnailWidget->setMinimumSize(100, 100); - thumbnailWidget->setMaximumSize(100, 100); - // insert it before space to align on top - layout->insertWidget(layout->count() - 1, thumbnailWidget); - // add label indicating name of the asset - auto label = new QLabel(product->GetName().c_str(), m_ui->m_thumbnailScrollArea); - layout->insertWidget(layout->count() - 1, label); - // do not render more than 10 thumbnails at a time - productsLeft--; - if (productsLeft <= 0) - { - break; - } - } - } - return; -} -#include diff --git a/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.h b/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.h deleted file mode 100644 index 258f8c159c..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#if !defined(Q_MOC_RUN) -#include -#include -#include -#include - -#include -#include -#endif - -class QItemSelection; - -namespace Ui -{ - class ThumbnailsSampleWidgetClass; -} - -namespace AzToolsFramework -{ - namespace AssetBrowser - { - class ProductAssetBrowserEntry; - class AssetBrowserEntry; - class AssetBrowserFilterModel; - class AssetBrowserModel; - } -} - -class ThumbnailsSampleWidget - : public QWidget -{ - Q_OBJECT -public: - AZ_CLASS_ALLOCATOR(ThumbnailsSampleWidget, AZ::SystemAllocator, 0); - - explicit ThumbnailsSampleWidget(QWidget* parent = nullptr); - ~ThumbnailsSampleWidget() override; - - static void RegisterViewClass(); - -private: - QScopedPointer m_ui; - QScopedPointer m_filterModel; - AzToolsFramework::AssetBrowser::AssetBrowserModel* m_assetBrowserModel; - - void UpdateThumbnail() const; - -private Q_SLOTS: - void SelectionChangedSlot(const QItemSelection& selected, const QItemSelection& deselected) const; -}; diff --git a/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.ui b/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.ui deleted file mode 100644 index 04ea08c475..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/Example/ThumbnailsSampleWidget.ui +++ /dev/null @@ -1,101 +0,0 @@ - - - ThumbnailsSampleWidgetClass - - - - 0 - 0 - 567 - 513 - - - - Thumbnails Sample - - - - - - - - - 0 - 0 - - - - - - - - - 1 - 0 - - - - QAbstractItemView::DragOnly - - - - - - - - - Qt::Vertical - - - - - - - - 200 - 0 - - - - - 200 - 16777215 - - - - Qt::ScrollBarAlwaysOn - - - true - - - - - 0 - 0 - 181 - 493 - - - - - - - - - - - AzToolsFramework::AssetBrowser::AssetBrowserTreeView - QTreeView -
AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h
-
- - AzToolsFramework::AssetBrowser::SearchWidget - QWidget -
AzToolsFramework/AssetBrowser/Search/SearchWidget.h
- 1 -
-
- - -
diff --git a/Code/Sandbox/Editor/Thumbnails/MaterialThumbnailRenderer.cpp b/Code/Sandbox/Editor/Thumbnails/MaterialThumbnailRenderer.cpp deleted file mode 100644 index 8093a392fa..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/MaterialThumbnailRenderer.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "EditorDefs.h" - -#include "MaterialThumbnailRenderer.h" - -// AzCore -#include -#include - -// AzToolsFramework -#include - -// CryCommon -#include - -// Editor -#include "Util/Image.h" -#include "Controls/PreviewModelCtrl.h" -#include "Material/MaterialManager.h" - - -const char* MATERIAL_PREVIEW_MODEL_FILE = "Editor/Objects/MtlSphere.cgf"; - -MaterialThumbnailRenderer::MaterialThumbnailRenderer() -{ - m_previewControl = AZStd::make_unique(); - m_previewControl->SetGrid(false); - m_previewControl->SetAxis(false); - m_previewControl->SetClearColor(ColorF(0, 0, 0, 0)); - - EBusFindAssetTypeByName result("Material"); - AZ::AssetTypeInfoBus::BroadcastResult(result, &AZ::AssetTypeInfo::GetAssetType); - m_assetType = result.GetAssetType(); - - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusConnect(m_assetType); - AZ::SystemTickBus::Handler::BusConnect(); -} - -MaterialThumbnailRenderer::~MaterialThumbnailRenderer() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusDisconnect(); - AZ::SystemTickBus::Handler::BusDisconnect(); -} - -void MaterialThumbnailRenderer::OnSystemTick() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::ExecuteQueuedEvents(); -} - -void MaterialThumbnailRenderer::RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) -{ - m_previewControl->setFixedSize(thumbnailSize, thumbnailSize); - - // get asset type name - AZ::Data::AssetInfo info; - AZ::Data::AssetCatalogRequestBus::BroadcastResult(info, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, assetId); - AZ::Data::AssetType assetType = info.m_assetType; - QString assetTypeName; - AZ::AssetTypeInfoBus::EventResult(assetTypeName, assetType, &AZ::AssetTypeInfo::GetAssetTypeDisplayName); - - QPixmap thumbnail; - - if (Render(thumbnail, assetId, thumbnailSize)) - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, thumbnail); - } - else - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); - } -} - -bool MaterialThumbnailRenderer::Installed() const -{ - return true; -} - -bool MaterialThumbnailRenderer::Render(QPixmap& thumbnail, AZ::Data::AssetId assetId, int thumbnailSize) const -{ - // get filepath - AZStd::string path; - AZ::Data::AssetCatalogRequestBus::BroadcastResult( - path, - &AZ::Data::AssetCatalogRequests::GetAssetPathById, - assetId); - - auto material = GetIEditor()->GetMaterialManager()->LoadMaterial(path.c_str(), false); - m_previewControl->LoadFile(MATERIAL_PREVIEW_MODEL_FILE); - m_previewControl->SetMaterial(material); - m_previewControl->FitToScreen(); - - gEnv->p3DEngine->Update(); - gEnv->pSystem->GetStreamEngine()->Update(); - - m_previewControl->Update(true); - m_previewControl->repaint(); - CImageEx img; - m_previewControl->show(); - // ensure all the initial (might be first time show) event handling is done for m_previewControl - QCoreApplication::sendPostedEvents(m_previewControl.get()); - m_previewControl->GetImageOffscreen(img, QSize(thumbnailSize, thumbnailSize)); - m_previewControl->hide(); - - if (img.IsValid()) - { - // this can fail if the request to draw the thumbnail was queued up but then the window - // was hidden or deleted in the interim. - thumbnail = QPixmap::fromImage(QImage(reinterpret_cast(img.GetData()), - img.GetWidth(), img.GetHeight(), QImage::Format_ARGB32)).copy(); - img.Release(); - return true; - } - - return false; -} diff --git a/Code/Sandbox/Editor/Thumbnails/MaterialThumbnailRenderer.h b/Code/Sandbox/Editor/Thumbnails/MaterialThumbnailRenderer.h deleted file mode 100644 index 934a7223d4..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/MaterialThumbnailRenderer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include -#include -#include - -#include - -class CPreviewModelCtrl; - -//! Loads thumbnails that require acccess to renderer -class MaterialThumbnailRenderer - : public AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler - , public AZ::SystemTickBus::Handler -{ -public: - AZ_CLASS_ALLOCATOR(MaterialThumbnailRenderer, AZ::SystemAllocator, 0) - - MaterialThumbnailRenderer(); - ~MaterialThumbnailRenderer(); - - ////////////////////////////////////////////////////////////////////////// - // TickBus - ////////////////////////////////////////////////////////////////////////// - void OnSystemTick() override; - - ////////////////////////////////////////////////////////////////////////// - // ThumbnailerRendererRequests - ////////////////////////////////////////////////////////////////////////// - void RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) override; - bool Installed() const override; - -private: - AZ::Data::AssetType m_assetType; - AZStd::unique_ptr m_previewControl; - - bool Render(QPixmap& thumbnail, AZ::Data::AssetId assetId, int thumbnailSize) const; -}; diff --git a/Code/Sandbox/Editor/Thumbnails/StaticMeshThumbnailRenderer.cpp b/Code/Sandbox/Editor/Thumbnails/StaticMeshThumbnailRenderer.cpp deleted file mode 100644 index 47baceeda9..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/StaticMeshThumbnailRenderer.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "EditorDefs.h" - -#include "StaticMeshThumbnailRenderer.h" - -// AzCore -#include - -// AzToolsFramework -#include - -// CryCommon -#include - -// Editor -#include "Controls/PreviewModelCtrl.h" -#include "Util/Image.h" - - -StaticMeshThumbnailRenderer::StaticMeshThumbnailRenderer() -{ - m_previewControl = AZStd::make_unique(); - m_previewControl->SetGrid(false); - m_previewControl->SetAxis(false); - m_previewControl->SetClearColor(ColorF(0, 0, 0, 0)); - - EBusFindAssetTypeByName result("Static Mesh"); - AZ::AssetTypeInfoBus::BroadcastResult(result, &AZ::AssetTypeInfo::GetAssetType); - m_assetType = result.GetAssetType(); - - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusConnect(m_assetType); - AZ::SystemTickBus::Handler::BusConnect(); -} - -StaticMeshThumbnailRenderer::~StaticMeshThumbnailRenderer() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusDisconnect(); - AZ::SystemTickBus::Handler::BusDisconnect(); -} - -void StaticMeshThumbnailRenderer::OnSystemTick() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::ExecuteQueuedEvents(); -} - -void StaticMeshThumbnailRenderer::RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) -{ - m_previewControl->setFixedSize(thumbnailSize, thumbnailSize); - - // get asset type name - AZ::Data::AssetInfo info; - AZ::Data::AssetCatalogRequestBus::BroadcastResult(info, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, assetId); - AZ::Data::AssetType assetType = info.m_assetType; - QString assetTypeName; - AZ::AssetTypeInfoBus::EventResult(assetTypeName, assetType, &AZ::AssetTypeInfo::GetAssetTypeDisplayName); - - QPixmap thumbnail; - - if (Render(thumbnail, assetId, thumbnailSize)) - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, thumbnail); - } - else - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); - } -} - -bool StaticMeshThumbnailRenderer::Installed() const -{ - return true; -} - -bool StaticMeshThumbnailRenderer::Render(QPixmap& thumbnail, AZ::Data::AssetId assetId, int thumbnailSize) const -{ - // get filepath - AZStd::string path; - AZ::Data::AssetCatalogRequestBus::BroadcastResult( - path, - &AZ::Data::AssetCatalogRequests::GetAssetPathById, - assetId); - - m_previewControl->SetMaterial(nullptr); - m_previewControl->LoadFile(path.c_str()); - m_previewControl->FitToScreen(); - - gEnv->p3DEngine->Update(); - gEnv->pSystem->GetStreamEngine()->Update(); - - m_previewControl->Update(true); - m_previewControl->repaint(); - CImageEx img; - // getimageoffscreen actually requires a real operating system window handle resource, which hiding the window can cause - // to be lost. - m_previewControl->GetImageOffscreen(img, QSize(thumbnailSize, thumbnailSize)); - m_previewControl->hide(); - - if (img.IsValid()) - { - // this can fail if the request to draw the thumbnail was queued up but then the window - // was hidden or deleted in the interim. - thumbnail = QPixmap::fromImage(QImage(reinterpret_cast(img.GetData()), - img.GetWidth(), img.GetHeight(), QImage::Format_ARGB32)).copy(); - img.Release(); - return true; - } - - return false; -} diff --git a/Code/Sandbox/Editor/Thumbnails/StaticMeshThumbnailRenderer.h b/Code/Sandbox/Editor/Thumbnails/StaticMeshThumbnailRenderer.h deleted file mode 100644 index c8bf91d63b..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/StaticMeshThumbnailRenderer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include -#include -#include - -#include - -class CPreviewModelCtrl; - -//! Loads thumbnails that require acccess to renderer -class StaticMeshThumbnailRenderer - : public AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler - , public AZ::SystemTickBus::Handler -{ -public: - AZ_CLASS_ALLOCATOR(StaticMeshThumbnailRenderer, AZ::SystemAllocator, 0) - - StaticMeshThumbnailRenderer(); - ~StaticMeshThumbnailRenderer(); - - ////////////////////////////////////////////////////////////////////////// - // TickBus - ////////////////////////////////////////////////////////////////////////// - void OnSystemTick() override; - - ////////////////////////////////////////////////////////////////////////// - // ThumbnailerRendererRequests - ////////////////////////////////////////////////////////////////////////// - void RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) override; - bool Installed() const override; - -private: - AZ::Data::AssetType m_assetType; - AZStd::unique_ptr m_previewControl; - - bool Render(QPixmap& thumbnail, AZ::Data::AssetId assetId, int thumbnailSize) const; -}; diff --git a/Code/Sandbox/Editor/Thumbnails/TextureThumbnailRenderer.cpp b/Code/Sandbox/Editor/Thumbnails/TextureThumbnailRenderer.cpp deleted file mode 100644 index f6ab7992cf..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/TextureThumbnailRenderer.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "EditorDefs.h" - -#include "TextureThumbnailRenderer.h" - -// AzCore -#include - -// AzToolsFramework -#include - -// Editor -#include "Util/Image.h" -#include "Util/ImageUtil.h" - - -TextureThumbnailRenderer::TextureThumbnailRenderer() -{ - EBusFindAssetTypeByName result("Texture"); - AZ::AssetTypeInfoBus::BroadcastResult(result, &AZ::AssetTypeInfo::GetAssetType); - m_assetType = result.GetAssetType(); - - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusConnect(m_assetType); - AZ::SystemTickBus::Handler::BusConnect(); -} - -TextureThumbnailRenderer::~TextureThumbnailRenderer() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusDisconnect(); - AZ::SystemTickBus::Handler::BusDisconnect(); -} - -void TextureThumbnailRenderer::OnSystemTick() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::ExecuteQueuedEvents(); -} - -void TextureThumbnailRenderer::RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) -{ - QPixmap thumbnail; - - if (Render(thumbnail, assetId, thumbnailSize)) - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, thumbnail); - } - else - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); - } -} - -bool TextureThumbnailRenderer::Installed() const -{ - return true; -} - -bool TextureThumbnailRenderer::Render(QPixmap& thumbnail, AZ::Data::AssetId assetId, int thumbnailSize) const -{ - // get filepath - AZStd::string path; - AZ::Data::AssetCatalogRequestBus::BroadcastResult( - path, - &AZ::Data::AssetCatalogRequests::GetAssetPathById, - assetId); - - CImageEx img; - if (!CImageUtil::LoadImage(path.c_str(), img)) - { - return false; - } - - unsigned int* data = img.GetData(); - - if (!data) - { - img.Release(); - return false; - } - - if (0 == img.GetWidth() || 0 == img.GetHeight()) - { - img.Release(); - return false; - } - - thumbnail = QPixmap::fromImage(QImage(reinterpret_cast(data), img.GetWidth(), img.GetHeight(), QImage::Format_ARGB32) - .scaled(thumbnailSize, thumbnailSize, Qt::IgnoreAspectRatio)).copy(); - - return true; -} diff --git a/Code/Sandbox/Editor/Thumbnails/TextureThumbnailRenderer.h b/Code/Sandbox/Editor/Thumbnails/TextureThumbnailRenderer.h deleted file mode 100644 index 403a6658d1..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/TextureThumbnailRenderer.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include -#include - -#include - -//! Loads thumbnails that require acccess to renderer -class TextureThumbnailRenderer - : public AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler - , public AZ::SystemTickBus::Handler -{ -public: - AZ_CLASS_ALLOCATOR(TextureThumbnailRenderer, AZ::SystemAllocator, 0) - - TextureThumbnailRenderer(); - ~TextureThumbnailRenderer(); - - ////////////////////////////////////////////////////////////////////////// - // TickBus - ////////////////////////////////////////////////////////////////////////// - void OnSystemTick() override; - - ////////////////////////////////////////////////////////////////////////// - // ThumbnailerRendererRequests - ////////////////////////////////////////////////////////////////////////// - void RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) override; - bool Installed() const override; - -private: - AZ::Data::AssetType m_assetType; - - bool Render(QPixmap& thumbnail, AZ::Data::AssetId assetId, int thumbnailSize) const; -}; diff --git a/Code/Sandbox/Editor/Thumbnails/ThumbnailRenderer.cpp b/Code/Sandbox/Editor/Thumbnails/ThumbnailRenderer.cpp deleted file mode 100644 index 95f005985d..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/ThumbnailRenderer.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "EditorDefs.h" - -#include -#include -#include -#include -#include - -const char* MATERIAL_PREVIEW_MODEL_FILE = "Editor/Objects/MtlSphere.cgf"; - -ThumbnailRenderer::ThumbnailRenderer() -{ - m_previewControl = std::make_unique(); - m_previewControl->SetGrid(false); - m_previewControl->SetAxis(false); - m_previewControl->SetClearColor(ColorF(0, 0, 0, 0)); - - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestsBus::Handler::BusConnect(); - AZ::SystemTickBus::Handler::BusConnect(); -} - -ThumbnailRenderer::~ThumbnailRenderer() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestsBus::Handler::BusDisconnect(); - AZ::SystemTickBus::Handler::BusDisconnect(); -} - -void ThumbnailRenderer::OnSystemTick() -{ - AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestsBus::ExecuteQueuedEvents(); -} - -void ThumbnailRenderer::RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) -{ - m_previewControl->setFixedSize(thumbnailSize, thumbnailSize); - - // get asset type name - AZ::Data::AssetInfo info; - AZ::Data::AssetCatalogRequestBus::BroadcastResult(info, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, assetId); - AZ::Data::AssetType assetType = info.m_assetType; - QString assetTypeName; - AZ::AssetTypeInfoBus::EventResult(assetTypeName, assetType, &AZ::AssetTypeInfo::GetAssetTypeDisplayName); - - // get filepath - AZStd::string path; - AZ::Data::AssetCatalogRequestBus::BroadcastResult( - path, - &AZ::Data::AssetCatalogRequests::GetAssetPathById, - assetId); - - bool success = false; - QPixmap thumbnail; - - if (assetTypeName == "Static Mesh") - { - success = RenderMesh(thumbnail, path.c_str(), thumbnailSize); - } - else if (assetTypeName == "Material") - { - success = RenderMaterial(thumbnail, path.c_str(), thumbnailSize); - } - else if (assetTypeName == "Texture") - { - success = RenderTexture(thumbnail, path.c_str(), thumbnailSize); - } - - if (success) - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationsBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, thumbnail); - } - else - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationsBus::Event(assetId, - &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); - } -} - -bool ThumbnailRenderer::RenderMesh(QPixmap& thumbnail, const char* path, int thumbnailSize) const -{ - m_previewControl->SetMaterial(nullptr); - m_previewControl->LoadFile(path); - m_previewControl->FitToScreen(); - - gEnv->p3DEngine->Update(); - gEnv->pSystem->GetStreamEngine()->Update(); - - m_previewControl->Update(true); - m_previewControl->repaint(); - m_previewControl->hide(); - - CImageEx img; - m_previewControl->GetImageOffscreen(img, QSize(thumbnailSize, thumbnailSize)); - - thumbnail = QPixmap::fromImage(QImage(reinterpret_cast(img.GetData()), - img.GetWidth(), img.GetHeight(), QImage::Format_ARGB32)).copy(); - - img.Release(); - return true; -} - -bool ThumbnailRenderer::RenderMaterial(QPixmap& thumbnail, const char* path, int thumbnailSize) const -{ - auto material = GetIEditor()->GetMaterialManager()->LoadMaterial(path, false); - m_previewControl->LoadFile(MATERIAL_PREVIEW_MODEL_FILE); - m_previewControl->SetMaterial(material); - m_previewControl->FitToScreen(); - - gEnv->p3DEngine->Update(); - gEnv->pSystem->GetStreamEngine()->Update(); - - m_previewControl->Update(true); - m_previewControl->repaint(); - m_previewControl->hide(); - - CImageEx img; - m_previewControl->GetImageOffscreen(img, QSize(thumbnailSize, thumbnailSize)); - - thumbnail = QPixmap::fromImage(QImage(reinterpret_cast(img.GetData()), - img.GetWidth(), img.GetHeight(), QImage::Format_ARGB32)).copy(); - - img.Release(); - - return true; -} - -bool ThumbnailRenderer::RenderTexture(QPixmap& thumbnail, const char* path, int thumbnailSize) const -{ - CImageEx img; - if (!CImageUtil::LoadImage(path, img)) - { - return false; - } - - unsigned int* pData = img.GetData(); - - if (!pData) - { - img.Release(); - return false; - } - - if (0 == img.GetWidth() || 0 == img.GetHeight()) - { - img.Release(); - return false; - } - - thumbnail = QPixmap::fromImage(QImage(reinterpret_cast(pData), img.GetWidth(), img.GetHeight(), QImage::Format_ARGB32) - .scaled(thumbnailSize, thumbnailSize, Qt::IgnoreAspectRatio)).copy(); - - return true; -} diff --git a/Code/Sandbox/Editor/Thumbnails/ThumbnailRenderer.h b/Code/Sandbox/Editor/Thumbnails/ThumbnailRenderer.h deleted file mode 100644 index fcfe16da8d..0000000000 --- a/Code/Sandbox/Editor/Thumbnails/ThumbnailRenderer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include -#include -#include - -#include - -class CPreviewModelCtrl; - -//! Loads thumbnails that require acccess to renderer -class ThumbnailRenderer - : public AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestsBus::Handler - , public AZ::SystemTickBus::Handler -{ -public: - AZ_CLASS_ALLOCATOR(ThumbnailRenderer, AZ::SystemAllocator, 0) - - ThumbnailRenderer(); - ~ThumbnailRenderer(); - - ////////////////////////////////////////////////////////////////////////// - // TickBus - ////////////////////////////////////////////////////////////////////////// - void OnSystemTick() override; - - ////////////////////////////////////////////////////////////////////////// - // ThumbnailerRendererRequests - ////////////////////////////////////////////////////////////////////////// - void RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) override; - -private: - AZStd::unique_ptr m_previewControl; - - bool RenderMesh(QPixmap& thumbnail, const char* path, int thumbnailSize) const; - bool RenderMaterial(QPixmap& thumbnail, const char* path, int thumbnailSize) const; - bool RenderTexture(QPixmap& thumbnail, const char* path, int thumbnailSize) const; -}; diff --git a/Code/Sandbox/Editor/TrackView/CaptureKeyUIControls.cpp b/Code/Sandbox/Editor/TrackView/CaptureKeyUIControls.cpp index a51c8e7724..dc6813c816 100644 --- a/Code/Sandbox/Editor/TrackView/CaptureKeyUIControls.cpp +++ b/Code/Sandbox/Editor/TrackView/CaptureKeyUIControls.cpp @@ -27,10 +27,8 @@ public: CSmartVariableArray mv_table; CSmartVariable mv_duration; CSmartVariable mv_timeStep; - CSmartVariableEnum mv_format; CSmartVariable mv_prefix; CSmartVariable mv_folder; - CSmartVariableEnum mv_captureBufferType; CSmartVariable mv_once; virtual void OnCreateVars() @@ -38,23 +36,11 @@ public: mv_duration.GetVar()->SetLimits(0, 100000.0f); mv_timeStep.GetVar()->SetLimits(0.001f, 1.0f); - // mv_format enumerations must match ICaptureKey::CaptureFileFormat enum - mv_format.SetEnumList(NULL); - mv_format->AddEnumItem("jpg", "jpg"); - mv_format->AddEnumItem("tga", "tga"); - mv_format->AddEnumItem("tif", "tif"); - - mv_captureBufferType.SetEnumList(NULL); - mv_captureBufferType->AddEnumItem("Color", ICaptureKey::Color); - mv_captureBufferType->AddEnumItem("Color+Alpha", ICaptureKey::ColorWithAlpha); - AddVariable(mv_table, "Key Properties"); AddVariable(mv_table, mv_duration, "Duration"); AddVariable(mv_table, mv_timeStep, "Time Step"); - AddVariable(mv_table, mv_format, "Output Format"); AddVariable(mv_table, mv_prefix, "Output Prefix"); AddVariable(mv_table, mv_folder, "Output Folder"); - AddVariable(mv_table, mv_captureBufferType, "Buffer(s) to capture"); AddVariable(mv_table, mv_once, "Just one frame?"); } bool SupportTrackType(const CAnimParamType& paramType, [[maybe_unused]] EAnimCurveType trackType, [[maybe_unused]] AnimValueType valueType) const @@ -98,10 +84,8 @@ bool CCaptureKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKe mv_duration = captureKey.duration; mv_timeStep = captureKey.timeStep; - mv_format = captureKey.GetFormat(); mv_prefix = captureKey.prefix.c_str(); mv_folder = captureKey.folder.c_str(); - mv_captureBufferType = captureKey.captureBufferIndex; mv_once = captureKey.once; bAssigned = true; @@ -132,25 +116,7 @@ void CCaptureKeyUIControls::OnUIChange(IVariable* pVar, CTrackViewKeyBundle& sel SyncValue(mv_duration, captureKey.duration, false, pVar); SyncValue(mv_timeStep, captureKey.timeStep, false, pVar); - if (pVar == mv_format.GetVar()) - { - if (QString::compare(mv_format, "jpg") == 0) - { - captureKey.FormatJPG(); - } - else if (QString::compare(mv_format, "bmp") == 0) - { - captureKey.FormatBMP(); - } - else if (QString::compare(mv_format, "hdr") == 0) - { - captureKey.FormatHDR(); - } - else - { - captureKey.FormatTGA(); - } - } + if (pVar == mv_folder.GetVar()) { QString sFolder = mv_folder; @@ -161,14 +127,12 @@ void CCaptureKeyUIControls::OnUIChange(IVariable* pVar, CTrackViewKeyBundle& sel QString sPrefix = mv_prefix; captureKey.prefix = sPrefix.toUtf8().data(); } - if (pVar == mv_captureBufferType.GetVar()) - { - captureKey.captureBufferIndex = static_cast(static_cast(mv_captureBufferType)); - } + SyncValue(mv_once, captureKey.once, false, pVar); bool isDuringUndo = false; - AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(isDuringUndo, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::IsDuringUndoRedo); + AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult( + isDuringUndo, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::IsDuringUndoRedo); if (isDuringUndo) { diff --git a/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.cpp b/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.cpp index 9146034738..73f8ce7344 100644 --- a/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.cpp +++ b/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.cpp @@ -59,18 +59,13 @@ namespace { int fps; const char* fpsDesc; - }; - SFPSPair fps[] = { + } fps[] = { {24, "Film(24)"}, {25, "PAL(25)"}, {30, "NTSC(30)"}, {48, "Show(48)"}, {50, "PAL Field(50)"}, {60, "NTSC Field(60)"} }; - // The text and ordering of these strings need to match ICaptureKey::CaptureFileFormat. These strings are used - // both for the comboBox UI strings as well as the file extension strings - const char* imageFormats[ICaptureKey::NumCaptureFileFormats] = { "jpg", "tga", "tif" }; - - // The text and ordering of these strings need to match ICaptureKey::CaptureBufferType - const char* buffersToCapture[ICaptureKey::NumCaptureBufferTypes] = { "Color", "Color+Alpha" }; + // currently supported file extensions + const char* imageFormatExtensions[] = {"dds", "ppm"}; const char defaultPresetFilename[] = "defaultBatchRender.preset"; @@ -170,7 +165,6 @@ void CSequenceBatchRenderDialog::OnInitDialog() connect(m_ui->m_fpsCombo, static_cast(&QComboBox::currentIndexChanged), this, &CSequenceBatchRenderDialog::OnFPSChange); connect(m_ui->m_renderList->selectionModel(), &QItemSelectionModel::selectionChanged, this, &CSequenceBatchRenderDialog::OnRenderItemSelChange); connect(m_ui->m_resolutionCombo, activated, this, &CSequenceBatchRenderDialog::OnResolutionSelected); - connect(m_ui->m_buffersToCaptureCombo, activated, this, &CSequenceBatchRenderDialog::OnBuffersSelected); connect(m_ui->m_startFrame, editingFinished, this, &CSequenceBatchRenderDialog::OnStartFrameChange); connect(m_ui->m_endFrame, editingFinished, this, &CSequenceBatchRenderDialog::OnEndFrameChange); connect(m_ui->m_imageFormatCombo, static_cast(&QComboBox::currentIndexChanged), this, &CSequenceBatchRenderDialog::OnImageFormatChange); @@ -219,25 +213,18 @@ void CSequenceBatchRenderDialog::OnInitDialog() m_ui->m_resolutionCombo->setCurrentIndex(0); // Fill the FPS combo box. - for (int i = 0; i < arraysize(fps); ++i) + for (int i = 0; i < AZStd::size(fps); ++i) { m_ui->m_fpsCombo->addItem(fps[i].fpsDesc); } m_ui->m_fpsCombo->setCurrentIndex(0); // Fill the image format combo box. - for (int i = 0; i < arraysize(imageFormats); ++i) + for (int i = 0; i < AZStd::size(imageFormatExtensions); ++i) { - m_ui->m_imageFormatCombo->addItem(imageFormats[i]); + m_ui->m_imageFormatCombo->addItem(imageFormatExtensions[i]); } - m_ui->m_imageFormatCombo->setCurrentIndex(ICaptureKey::Jpg); - - // Fill the buffers-to-capture combo box. - for (int i = 0; i < arraysize(buffersToCapture); ++i) - { - m_ui->m_buffersToCaptureCombo->addItem(buffersToCapture[i]); - } - m_ui->m_buffersToCaptureCombo->setCurrentIndex(0); + m_ui->m_imageFormatCombo->setCurrentIndex(0); m_ui->BATCH_RENDER_FILE_PREFIX->setText("Frame"); m_ui->BATCH_RENDER_FILE_PREFIX->setValidator(m_prefixValidator.data()); @@ -333,13 +320,8 @@ void CSequenceBatchRenderDialog::OnRenderItemSelChange() m_customFPS = item.fps; m_ui->m_fpsCombo->setCurrentText(QString::number(item.fps)); } - // capture buffer type - m_ui->m_buffersToCaptureCombo->setCurrentIndex(item.bufferIndex); // prefix m_ui->BATCH_RENDER_FILE_PREFIX->setText(item.prefix); - // format - m_ui->m_imageFormatCombo->setCurrentIndex(item.formatIndex); - OnBuffersSelected(); m_ui->m_disableDebugInfoCheckBox->setChecked(item.disableDebugInfo); @@ -702,8 +684,7 @@ void CSequenceBatchRenderDialog::SaveOutputOptions(const QString& pathname) cons // Capture options (format, buffer, prefix, create_video) XmlNodeRef imageNode = batchRenderOptionsNode->newChild("image"); - imageNode->setAttr("format", m_ui->m_imageFormatCombo->currentIndex() % arraysize(imageFormats)); - imageNode->setAttr("bufferstocapture", m_ui->m_buffersToCaptureCombo->currentIndex()); + imageNode->setAttr("format", m_ui->m_imageFormatCombo->currentIndex() % arraysize(imageFormatExtensions)); const QString prefix = m_ui->BATCH_RENDER_FILE_PREFIX->text(); imageNode->setAttr("prefix", prefix.toUtf8().data()); bool disableDebugInfo = m_ui->m_disableDebugInfoCheckBox->isChecked(); @@ -803,9 +784,6 @@ bool CSequenceBatchRenderDialog::LoadOutputOptions(const QString& pathname) imageNode->getAttr("format", curSel); m_ui->m_imageFormatCombo->setCurrentIndex(curSel); curSel = CB_ERR; - imageNode->getAttr("bufferstocapture", curSel); - m_ui->m_buffersToCaptureCombo->setCurrentIndex(curSel); - OnBuffersSelected(); m_ui->BATCH_RENDER_FILE_PREFIX->setText(imageNode->getAttr("prefix")); bool disableDebugInfo = false; imageNode->getAttr("disabledebuginfo", disableDebugInfo); @@ -919,25 +897,7 @@ void CSequenceBatchRenderDialog::CaptureItemStart() } // Set specific capture options for this item. - m_renderContext.captureOptions.captureBufferIndex = renderItem.bufferIndex; m_renderContext.captureOptions.prefix = renderItem.prefix.toUtf8().data(); - switch (renderItem.formatIndex) - { - case ICaptureKey::Jpg: - m_renderContext.captureOptions.FormatJPG(); - break; - case ICaptureKey::Tga: - m_renderContext.captureOptions.FormatTGA(); - break; - case ICaptureKey::Tif: - m_renderContext.captureOptions.FormatTIF(); - break; - default: - // fall back to tga, the most general of the formats - gEnv->pLog->LogWarning("Unhandled file format type detected in CSequenceBatchRenderDialog::CaptureItemStart(), using tga"); - m_renderContext.captureOptions.FormatTGA(); - break; - } Range rng = nextSequence->GetTimeRange(); m_renderContext.captureOptions.duration = rng.end - rng.start; @@ -967,6 +927,9 @@ void CSequenceBatchRenderDialog::CaptureItemStart() ++i; } + // create a new folder before writing any files + QDir().mkdir(finalFolder); + m_renderContext.captureOptions.folder = finalFolder.toUtf8().data(); // Change the resolution. @@ -1131,17 +1094,18 @@ void CSequenceBatchRenderDialog::OnUpdateEnd(IAnimSequence* sequence) sequence->SetFlags(m_renderContext.flagBU); sequence->SetTimeRange(m_renderContext.rangeBU); sequence->SetActiveDirector(m_renderContext.pActiveDirectorBU); + + const auto imageFormat = m_ui->m_imageFormatCombo->currentText(); SRenderItem renderItem = m_renderItems[m_renderContext.currentItemIndex]; - if (m_bFFMPEGCommandAvailable - && renderItem.bCreateVideo) + if (m_bFFMPEGCommandAvailable && renderItem.bCreateVideo) { // Create a video using the ffmpeg plug-in from captured images. m_renderContext.processingFFMPEG = true; AZStd::string outputFolder = m_renderContext.captureOptions.folder; auto future = QtConcurrent::run( - [renderItem, outputFolder] + [renderItem, outputFolder, imageFormat] { AZStd::string outputFile; AzFramework::StringFunc::Path::Join(outputFolder.c_str(), renderItem.prefix.toUtf8().data(), outputFile); @@ -1158,15 +1122,14 @@ void CSequenceBatchRenderDialog::OnUpdateEnd(IAnimSequence* sequence) // Create the input file string, leave the %06d unexpanded for the mpeg tool. inputFile += "%06d."; - inputFile += imageFormats[renderItem.formatIndex]; + inputFile += imageFormat; // Replace the input file command = command.replace(inputFileDefine, inputFile); // Run the command GetIEditor()->ExecuteCommand(command); - } - ); + }); // Use a watcher to set a flag when the mpeg processing is complete. connect(&m_renderContext.processingFFMPEGWatcher, &QFutureWatcher::finished, this, [this]() @@ -1339,8 +1302,9 @@ void CSequenceBatchRenderDialog::OnKickIdle() if (canBeginFrameCapture()) { + const AZStd::string fileName = AZStd::string::format("Frame_%06d", m_renderContext.frameNumber); + AZStd::string filePath; - AZStd::string fileName = AZStd::string::format("Frame_%06d.dds", m_renderContext.frameNumber); AzFramework::StringFunc::Path::Join( m_renderContext.captureOptions.folder.c_str(), fileName.c_str(), filePath, /*caseInsensitive=*/true, /*normalize=*/false); @@ -1352,13 +1316,34 @@ void CSequenceBatchRenderDialog::OnKickIdle() GetIEditor()->GetMovieSystem()->ControlCapture(); }; + const auto imageFormatExtension = m_ui->m_imageFormatCombo->currentText(); // readback result callback (how the image should be captured) - // currently only .dds - const auto readbackCallback = [filePath](const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult) { - if (const AZ::Render::FrameCaptureOutputResult result = AZ::Render::DdsFrameCaptureOutput(filePath, readbackResult); - result.m_errorMessage.has_value()) + // currently only .dds and .ppm + const auto readbackCallback = [filePath, + imageFormatExtension](const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult) { + const auto imageFormatExtensionUtf8 = imageFormatExtension.toUtf8(); + const auto imageFormatExtensionCstr = imageFormatExtensionUtf8.constData(); + + const AZStd::string fileName = AZStd::string::format("%s.%s", filePath.c_str(), imageFormatExtensionCstr); + if (AZ::StringFunc::Equal(imageFormatExtensionCstr, "dds")) + { + if (const AZ::Render::FrameCaptureOutputResult result = AZ::Render::DdsFrameCaptureOutput(fileName, readbackResult); + result.m_errorMessage.has_value()) + { + AZ_Printf("TrackView", "Dds frame capture failed: %s", result.m_errorMessage.value().c_str()); + } + } + else if (AZ::StringFunc::Equal(imageFormatExtensionCstr, "ppm")) { - AZ_Printf("TrackView", "Frame capture failed: %s", result.m_errorMessage.value().c_str()); + if (const AZ::Render::FrameCaptureOutputResult result = AZ::Render::PpmFrameCaptureOutput(fileName, readbackResult); + result.m_errorMessage.has_value()) + { + AZ_Printf("TrackView", "Ppm frame capture failed: %s", result.m_errorMessage.value().c_str()); + } + } + else + { + AZ_Printf("TrackView", "Image format .%s not supported", imageFormatExtensionCstr); } }; @@ -1454,15 +1439,6 @@ void CSequenceBatchRenderDialog::OnLoadBatch() // fps itemNode->getAttr("fps", item.fps); - // format - int intAttr; - itemNode->getAttr("format", intAttr); - item.formatIndex = (intAttr <= ICaptureKey::NumCaptureFileFormats) ? static_cast(intAttr) : ICaptureKey::Jpg; - - // capture buffer type - itemNode->getAttr("bufferstocapture", intAttr); - item.bufferIndex = (intAttr <= ICaptureKey::NumCaptureBufferTypes) ? static_cast(intAttr) : ICaptureKey::Color; - // prefix item.prefix = itemNode->getAttr("prefix"); @@ -1515,12 +1491,6 @@ void CSequenceBatchRenderDialog::OnSaveBatch() // fps itemNode->setAttr("fps", item.fps); - // format - itemNode->setAttr("format", item.formatIndex); - - // capture buffer type - itemNode->setAttr("bufferstocapture", item.bufferIndex); - // prefix itemNode->setAttr("prefix", item.prefix.toUtf8().data()); @@ -1581,12 +1551,8 @@ bool CSequenceBatchRenderDialog::SetUpNewRenderItem(SRenderItem& item) { item.fps = fps[m_ui->m_fpsCombo->currentIndex()].fps; } - // capture buffer type - item.bufferIndex = static_cast(m_ui->m_buffersToCaptureCombo->currentIndex()); // prefix item.prefix = m_ui->BATCH_RENDER_FILE_PREFIX->text(); - // format - item.formatIndex = static_cast(m_ui->m_imageFormatCombo->currentIndex() % arraysize(imageFormats)); // disable debug info item.disableDebugInfo = m_ui->m_disableDebugInfoCheckBox->isChecked(); // create_video @@ -1632,36 +1598,13 @@ void CSequenceBatchRenderDialog::AddItem(const SRenderItem& item) QString CSequenceBatchRenderDialog::GetCaptureItemString(const SRenderItem& item) const { - return QString::fromLatin1("%1_%2_%3-%4(%5x%6,%7,%8)%9").arg(item.pSequence->GetName()) + return QString::fromLatin1("%1_%2_%3-%4(%5x%6,%7)%8").arg(item.pSequence->GetName()) .arg(item.pDirectorNode->GetName()) .arg(int(item.frameRange.start * m_fpsForTimeToFrameConversion)) .arg(int(item.frameRange.end * m_fpsForTimeToFrameConversion)) - .arg(getResWidth(item.resW)).arg(getResHeight(item.resH)).arg(item.fps).arg(buffersToCapture[item.bufferIndex]) + .arg(getResWidth(item.resW)).arg(getResHeight(item.resH)).arg(item.fps) .arg(item.bCreateVideo ? "[v]" : ""); } -void CSequenceBatchRenderDialog::OnBuffersSelected() -{ - int curSel = m_ui->m_buffersToCaptureCombo->currentIndex(); - const ICaptureKey::CaptureBufferType bufferType = (curSel >= ICaptureKey::NumCaptureBufferTypes ? ICaptureKey::Color : static_cast(curSel)); - - switch (bufferType) - { - case ICaptureKey::Color: - // allow any format for color buffer - m_ui->m_imageFormatCombo->setEnabled(true); - break; - case ICaptureKey::ColorWithAlpha: - // only tga supports alpha for now - set it and disable the ability to change it - m_ui->m_imageFormatCombo->setCurrentIndex(ICaptureKey::Tga); - m_ui->m_imageFormatCombo->setEnabled(false); - break; - default: - gEnv->pLog->LogWarning("Unhandle capture buffer type used in CSequenceBatchRenderDialog::OnBuffersSelected()"); - break; - } - - CheckForEnableUpdateButton(); -} void CSequenceBatchRenderDialog::UpdateSpinnerProgressMessage(const char* description) { diff --git a/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.h b/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.h index 7db1d5efb6..3f98158d44 100644 --- a/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.h +++ b/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.h @@ -62,7 +62,6 @@ protected: void OnEndFrameChange(); void OnLoadBatch(); void OnSaveBatch(); - void OnBuffersSelected(); void OnKickIdle(); void OnCancelRender(); @@ -80,8 +79,6 @@ protected: Range frameRange; int resW, resH; int fps; - ICaptureKey::CaptureFileFormat formatIndex; - ICaptureKey::CaptureBufferType bufferIndex; QString folder; QString prefix; QStringList cvars; @@ -99,8 +96,6 @@ protected: && frameRange == item.frameRange && resW == item.resW && resH == item.resH && fps == item.fps - && formatIndex == item.formatIndex - && bufferIndex == item.bufferIndex && folder == item.folder && prefix == item.prefix && cvars == item.cvars diff --git a/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.ui b/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.ui index 27a42e25ab..18905a775b 100644 --- a/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.ui +++ b/Code/Sandbox/Editor/TrackView/SequenceBatchRenderDialog.ui @@ -162,60 +162,51 @@ Capture Options + + + + Create a video (mp4) + + + - + - Buffer(s) to capture: + File prefix: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - + + - File prefix: + Format: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - + Disable Debug Info - - - - Create a video (mp4) - - - - - - - Format: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + QComboBox::AdjustToContentsOnFirstShow @@ -244,8 +235,8 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:4.125pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8.25pt;"><br /></p></body></html>
false diff --git a/Code/Sandbox/Editor/Util/EditorUtils.cpp b/Code/Sandbox/Editor/Util/EditorUtils.cpp index 40aba321fa..37327859c2 100644 --- a/Code/Sandbox/Editor/Util/EditorUtils.cpp +++ b/Code/Sandbox/Editor/Util/EditorUtils.cpp @@ -15,6 +15,8 @@ #include "EditorUtils.h" +#include "EditorToolsApplicationAPI.h" + // Qt #include #include @@ -278,5 +280,26 @@ namespace EditorUtils return false; } + + const char* LevelFile::GetOldCryFileExtension() + { + const char* oldCryExtension = nullptr; + EditorInternal::EditorToolsApplicationRequestBus::BroadcastResult( + oldCryExtension, &EditorInternal::EditorToolsApplicationRequests::GetOldCryLevelExtension); + + AZ_Assert(oldCryExtension, "Cannot retrieve file extension"); + return oldCryExtension; + } + + const char* LevelFile::GetDefaultFileExtension() + { + const char* levelExtension = nullptr; + EditorInternal::EditorToolsApplicationRequestBus::BroadcastResult( + levelExtension, &EditorInternal::EditorToolsApplicationRequests::GetLevelExtension); + + AZ_Assert(levelExtension, "Cannot retrieve file extension"); + return levelExtension; + } + } // namespace EditorUtils diff --git a/Code/Sandbox/Editor/Util/EditorUtils.h b/Code/Sandbox/Editor/Util/EditorUtils.h index 33d8fc7017..c04d4ed9e6 100644 --- a/Code/Sandbox/Editor/Util/EditorUtils.h +++ b/Code/Sandbox/Editor/Util/EditorUtils.h @@ -176,6 +176,13 @@ namespace EditorUtils AZStd::string m_window; }; + namespace LevelFile + { + //! Retrieve old cry level file extension (With prepending '.') + const char* GetOldCryFileExtension(); + //! Retrieve default level file extension (With prepending '.') + const char* GetDefaultFileExtension(); + } }; ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.cpp b/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.cpp index 168e0a2e85..29c94d2b4f 100644 --- a/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.cpp +++ b/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.cpp @@ -147,6 +147,8 @@ WelcomeScreenDialog::WelcomeScreenDialog(QWidget* pParent) setMinimumSize(minimumSize().width(), newGeometry.height()); resize(newGeometry.size()); } + + m_levelExtension = EditorUtils::LevelFile::GetDefaultFileExtension(); } @@ -209,34 +211,29 @@ void WelcomeScreenDialog::SetRecentFileList(RecentFileList* pList) int recentListSize = pList->GetSize(); for (int i = 0; i < recentListSize; ++i) { - if (CFileUtil::Exists(pList->m_arrNames[i], false)) + const QString& recentFile = pList->m_arrNames[i]; + if (recentFile.endsWith(m_levelExtension)) { - QString sCurEntryDir = pList->m_arrNames[i].left(nCurDir); - - if (sCurEntryDir.compare(sCurDir, Qt::CaseInsensitive) != 0) + if (CFileUtil::Exists(recentFile, false)) { - //unavailable entry (wrong directory) - continue; + QString sCurEntryDir = recentFile.left(nCurDir); + if (sCurEntryDir.compare(sCurDir, Qt::CaseInsensitive) == 0) + { + QString fullPath = recentFile; + QString name = Path::GetFileName(fullPath); + + Path::ConvertSlashToBackSlash(fullPath); + fullPath = Path::ToUnixPath(fullPath.toLower()); + fullPath = Path::AddSlash(fullPath); + + if (fullPath.contains(gamePath)) + { + m_pRecentListModel->setStringList(m_pRecentListModel->stringList() << QString(name)); + m_levels.push_back(std::make_pair(name, recentFile)); + } + } } } - else - { - //invalid entry (not existing) - continue; - } - - QString fullPath = pList->m_arrNames[i]; - QString name = Path::GetFileName(fullPath); - - Path::ConvertSlashToBackSlash(fullPath); - fullPath = Path::ToUnixPath(fullPath.toLower()); - fullPath = Path::AddSlash(fullPath); - - if (fullPath.contains(gamePath)) - { - m_pRecentListModel->setStringList(m_pRecentListModel->stringList() << QString(name)); - m_levels.push_back(std::make_pair(name, pList->m_arrNames[i])); - } } ui->recentLevelList->setCurrentIndex(QModelIndex()); diff --git a/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.h b/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.h index af098478e1..73e9d75ea3 100644 --- a/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.h +++ b/Code/Sandbox/Editor/WelcomeScreen/WelcomeScreenDialog.h @@ -57,6 +57,7 @@ private: RecentFileList* m_pRecentList; News::ResourceManifest* m_manifest = nullptr; News::ArticleViewContainer* m_articleViewContainer = nullptr; + const char* m_levelExtension = nullptr; bool m_waitingOnAsync = true; bool m_messageScrollReported = false; diff --git a/Code/Sandbox/Editor/editor_lib_files.cmake b/Code/Sandbox/Editor/editor_lib_files.cmake index 3ff96cd84c..2cf82c478e 100644 --- a/Code/Sandbox/Editor/editor_lib_files.cmake +++ b/Code/Sandbox/Editor/editor_lib_files.cmake @@ -341,15 +341,6 @@ set(FILES AzAssetBrowser/Preview/LegacyPreviewer.ui AzAssetBrowser/Preview/LegacyPreviewerFactory.cpp AzAssetBrowser/Preview/LegacyPreviewerFactory.h - Thumbnails/MaterialThumbnailRenderer.cpp - Thumbnails/MaterialThumbnailRenderer.h - Thumbnails/StaticMeshThumbnailRenderer.cpp - Thumbnails/StaticMeshThumbnailRenderer.h - Thumbnails/TextureThumbnailRenderer.cpp - Thumbnails/TextureThumbnailRenderer.h - Thumbnails/Example/ThumbnailsSampleWidget.cpp - Thumbnails/Example/ThumbnailsSampleWidget.h - Thumbnails/Example/ThumbnailsSampleWidget.ui AssetDatabase/AssetDatabaseLocationListener.h AssetDatabase/AssetDatabaseLocationListener.cpp AssetImporter/AssetImporterManager/AssetImporterDragAndDropHandler.cpp diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp index bec39adc84..17face523b 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp @@ -152,7 +152,10 @@ ComponentEntityEditorPlugin::ComponentEntityEditorPlugin([[maybe_unused]] IEdito LyViewPane::CategoryTools, levelInspectorOptions); - if (GetIEditor()->IsPrefabSystemEnabled()) + bool prefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + if (prefabSystemEnabled) { // Add the new Outliner to the Tools Menu diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp index 50c8bd7c65..ee7904fc9c 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -96,12 +97,10 @@ void CComponentEntityObject::UpdatePreemptiveUndoCache() { using namespace AzToolsFramework; - PreemptiveUndoCache* preemptiveUndoCache = nullptr; - ToolsApplicationRequests::Bus::BroadcastResult(preemptiveUndoCache, &ToolsApplicationRequests::GetUndoCache); - - if (preemptiveUndoCache) + auto undoCacheInterface = AZ::Interface::Get(); + if (undoCacheInterface) { - preemptiveUndoCache->UpdateCache(m_entityId); + undoCacheInterface->UpdateCache(m_entityId); } } diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp index 552a6d8aef..ab7f84bc28 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -199,6 +200,12 @@ void SandboxIntegrationManager::Setup() AZ_Assert((m_editorEntityUiInterface != nullptr), "SandboxIntegrationManager requires a EditorEntityUiInterface instance to be present on Setup()."); + m_prefabIntegrationInterface = AZ::Interface::Get(); + + AZ_Assert( + (m_prefabIntegrationInterface != nullptr), + "SandboxIntegrationManager requires a PrefabIntegrationInterface instance to be present on Setup()."); + AzToolsFramework::Layers::EditorLayerComponentNotificationBus::Handler::BusConnect(); } @@ -259,10 +266,11 @@ void SandboxIntegrationManager::SaveSlice(const bool& QuickPushToFirstLevel) // This event handler is queued on main thread. void SandboxIntegrationManager::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId) { - bool isLegacySliceSystemEnabled = true; - AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult( - isLegacySliceSystemEnabled, &AzToolsFramework::ToolsApplicationRequests::IsLegacySliceSystemEnabled); - if (isLegacySliceSystemEnabled) + bool prefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + + if (!prefabSystemEnabled) { AZ::SliceComponent* editorRootSlice = nullptr; AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult( @@ -652,18 +660,21 @@ void SandboxIntegrationManager::PopulateEditorGlobalContextMenu(QMenu* menu, con }); } - menu->addSeparator(); + bool prefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); - action = menu->addAction(QObject::tr("Create layer")); - QObject::connect(action, &QAction::triggered, [this] { ContextMenu_NewLayer(); }); + if (!prefabSystemEnabled) + { + menu->addSeparator(); - SetupLayerContextMenu(menu); - AzToolsFramework::EntityIdSet flattenedSelection; - GetSelectedEntitiesSetWithFlattenedHierarchy(flattenedSelection); - AzToolsFramework::SetupAddToLayerMenu(menu, flattenedSelection, [this] { return ContextMenu_NewLayer(); }); + action = menu->addAction(QObject::tr("Create layer")); + QObject::connect(action, &QAction::triggered, [this] { ContextMenu_NewLayer(); }); + + SetupLayerContextMenu(menu); + AzToolsFramework::EntityIdSet flattenedSelection; + GetSelectedEntitiesSetWithFlattenedHierarchy(flattenedSelection); + AzToolsFramework::SetupAddToLayerMenu(menu, flattenedSelection, [this] { return ContextMenu_NewLayer(); }); - if (!GetIEditor()->IsPrefabSystemEnabled()) - { SetupSliceContextMenu(menu); } else @@ -674,11 +685,18 @@ void SandboxIntegrationManager::PopulateEditorGlobalContextMenu(QMenu* menu, con AzToolsFramework::EditorContextMenuBus::Broadcast(&AzToolsFramework::EditorContextMenuEvents::PopulateEditorGlobalContextMenu, menu); } - action = menu->addAction(QObject::tr("Duplicate")); - QObject::connect(action, &QAction::triggered, action, [this] { ContextMenu_Duplicate(); }); - if (selected.size() == 0) + bool prefabWipFeaturesEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled); + + if (!prefabSystemEnabled || (prefabSystemEnabled && prefabWipFeaturesEnabled)) { - action->setDisabled(true); + action = menu->addAction(QObject::tr("Duplicate")); + QObject::connect(action, &QAction::triggered, action, [this] { ContextMenu_Duplicate(); }); + if (selected.size() == 0) + { + action->setDisabled(true); + } } action = menu->addAction(QObject::tr("Delete")); @@ -1268,41 +1286,47 @@ AZ::EntityId SandboxIntegrationManager::CreateNewEntityAtPosition(const AZ::Vect { using namespace AzToolsFramework; - ScopedUndoBatch undo("New Entity"); + bool prefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); AZ::EntityId newEntityId; - const AZStd::string name = AZStd::string::format("Entity%d", GetIEditor()->GetObjectManager()->GetObjectCount() + 1); - - EditorEntityContextRequestBus::BroadcastResult(newEntityId, &EditorEntityContextRequests::CreateNewEditorEntity, name.c_str()); - - if (newEntityId.IsValid()) + if (!prefabSystemEnabled) { - m_unsavedEntities.insert(newEntityId); + const AZStd::string name = AZStd::string::format("Entity%d", GetIEditor()->GetObjectManager()->GetObjectCount() + 1); + EditorEntityContextRequestBus::BroadcastResult(newEntityId, &EditorEntityContextRequests::CreateNewEditorEntity, name.c_str()); - AZ::Transform transform = AZ::Transform::CreateIdentity(); - transform.SetTranslation(pos); - if (parentId.IsValid()) + if (newEntityId.IsValid()) { - AZ::TransformBus::Event(newEntityId, &AZ::TransformInterface::SetParent, parentId); - AZ::TransformBus::Event(newEntityId, &AZ::TransformInterface::SetLocalTM, transform); - } - else - { - AZ::TransformBus::Event(newEntityId, &AZ::TransformInterface::SetWorldTM, transform); - } + m_unsavedEntities.insert(newEntityId); - // Select the new entity (and deselect others). - AzToolsFramework::EntityIdList selection = { newEntityId }; + AZ::Transform transform = AZ::Transform::CreateIdentity(); + transform.SetTranslation(pos); + if (parentId.IsValid()) + { + AZ::TransformBus::Event(newEntityId, &AZ::TransformInterface::SetParent, parentId); + AZ::TransformBus::Event(newEntityId, &AZ::TransformInterface::SetLocalTM, transform); + } + else + { + AZ::TransformBus::Event(newEntityId, &AZ::TransformInterface::SetWorldTM, transform); + } - auto selectionCommand = - AZStd::make_unique(selection, ""); - selectionCommand->SetParent(undo.GetUndoBatch()); - selectionCommand.release(); + // Select the new entity (and deselect others). + AzToolsFramework::EntityIdList selection = {newEntityId}; - EBUS_EVENT(AzToolsFramework::ToolsApplicationRequests::Bus, SetSelectedEntities, selection); - } + ScopedUndoBatch undo("New Entity"); + auto selectionCommand = AZStd::make_unique(selection, ""); + selectionCommand->SetParent(undo.GetUndoBatch()); + selectionCommand.release(); + EBUS_EVENT(AzToolsFramework::ToolsApplicationRequests::Bus, SetSelectedEntities, selection); + } + } + else + { + newEntityId = m_prefabIntegrationInterface->CreateNewEntityAtPosition(pos, parentId); + } return newEntityId; } diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h index 3aaef05475..e35fb5087a 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h @@ -83,6 +83,11 @@ namespace AzToolsFramework { class AssetSelectionModel; } + + namespace Prefab + { + class PrefabIntegrationInterface; + } } ////////////////////////////////////////////////////////////////////////// @@ -383,6 +388,7 @@ private: AzToolsFramework::Prefab::PrefabIntegrationManager m_prefabIntegrationManager; AzToolsFramework::EditorEntityUiInterface* m_editorEntityUiInterface = nullptr; + AzToolsFramework::Prefab::PrefabIntegrationInterface* m_prefabIntegrationInterface = nullptr; // Overrides UI styling and behavior for Layer Entities AzToolsFramework::LayerUiHandler m_layerUiOverrideHandler; diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Base.cpp b/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Base.cpp index 8fdb341f92..702bc2d1c2 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Base.cpp +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Base.cpp @@ -55,8 +55,6 @@ namespace ProjectSettingsTool ->Attribute(Attributes::FuncValidator, ConvertFunctorToVoid(&Validators::FileNameOrEmpty)) ->Attribute(Attributes::PropertyIdentfier, Identfiers::ProductName) ->Attribute(Attributes::LinkedProperty, Identfiers::ExecutableName) - ->DataElement(Handlers::QValidatedLineEdit, &BaseSettings::m_sysDllGame, "Game Dll Name", "The name of the project's dll.") - ->Attribute(Attributes::FuncValidator, ConvertFunctorToVoid(&Validators::FileNameOrEmpty)) ->DataElement(Handlers::QValidatedLineEdit, &BaseSettings::m_projectOutputFolder, "Output Folder", "The folder the packed project will be exported to.") ->DataElement(Handlers::QValidatedLineEdit, &BaseSettings::m_codeFolder, "Code Folder (legacy)", "A legacy setting specifing the folder for this project's code.") ; diff --git a/Code/Tools/AssetBundler/source/utils/applicationManager.cpp b/Code/Tools/AssetBundler/source/utils/applicationManager.cpp index 3c09f318de..172a479c45 100644 --- a/Code/Tools/AssetBundler/source/utils/applicationManager.cpp +++ b/Code/Tools/AssetBundler/source/utils/applicationManager.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -38,7 +39,7 @@ #include #include #include -#include +#include namespace AssetBundler { @@ -163,6 +164,7 @@ namespace AssetBundler components.emplace_back(azrtti_typeid()); components.emplace_back(azrtti_typeid()); + components.emplace_back(azrtti_typeid()); for (auto iter = components.begin(); iter != components.end();) { @@ -2665,9 +2667,9 @@ namespace AssetBundler AZ_Printf(AppWindowName, "\n"); AZ_Printf(AppWindowName, "Some args in this tool take paths as arguments, and there are two main types:\n"); AZ_Printf(AppWindowName, " \"path\" - This refers to an Engine-Root-Relative path.\n"); - AZ_Printf(AppWindowName, " - Example: \"C:\\Lumberyard\\dev\\SamplesProject\\test.txt\" can be represented as \"SamplesProject\\test.txt\".\n"); + AZ_Printf(AppWindowName, " - Example: \"C:\\Lumberyard\\dev\\AutomatedTesting\\test.txt\" can be represented as \"AutomatedTesting\\test.txt\".\n"); AZ_Printf(AppWindowName, " \"cache path\" - This refers to a Cache-Relative path.\n"); - AZ_Printf(AppWindowName, " - Example: \"C:\\Lumberyard\\dev\\SamplesProject\\Cache\\pc\\animations\\skeletonlist.xml\" is represented as \"animations\\skeletonlist.xml\".\n"); + AZ_Printf(AppWindowName, " - Example: \"C:\\Lumberyard\\dev\\AutomatedTesting\\Cache\\pc\\animations\\skeletonlist.xml\" is represented as \"animations\\skeletonlist.xml\".\n"); AZ_Printf(AppWindowName, "\n"); OutputHelpSeeds(); diff --git a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp index 7a119dc739..c477ec2c9e 100644 --- a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp +++ b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp @@ -1302,7 +1302,8 @@ namespace AssetBuilderSDK ->Field("Patterns", &AssetBuilderDesc::m_patterns) ->Field("BusId", &AssetBuilderDesc::m_busId) ->Field("Version", &AssetBuilderDesc::m_version) - ->Field("AnalysisFingerprint", &AssetBuilderDesc::m_analysisFingerprint); + ->Field("AnalysisFingerprint", &AssetBuilderDesc::m_analysisFingerprint) + ->Field("ProductsToKeepOnFailure", &AssetBuilderDesc::m_productsToKeepOnFailure); serializeContext->RegisterGenericType>(); } diff --git a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.h b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.h index d090b16703..a11cc9a80d 100644 --- a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.h +++ b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.h @@ -272,7 +272,7 @@ namespace AssetBuilderSDK * If your analysis fingerprint DOES change, then all source files will be sent to your CreateJobs function regardless of modtime changes. * This does not necessarily mean that the jobs will need doing, just that CreateJobs will be called. * For best results, make sure your analysis fingerprint only changes when its likely that you need to re-analyze source files for changes, which - * may result in job fingerprints to be diffent (for example, if you have changed your logic inside your builder). + * may result in job fingerprints to be different (for example, if you have changed your logic inside your builder). **/ AZStd::string m_analysisFingerprint; @@ -282,6 +282,10 @@ namespace AssetBuilderSDK AZStd::unordered_map m_flagsByJobKey; + // If BF_DeleteLastKnownGoodProductOnFailure is raised, ALL specified product keys will be deleted on failure + // use this set to keep specific products in the job, if necessary + AZStd::unordered_map> m_productsToKeepOnFailure; + void AddFlags(AZ::u8 flag, const AZStd::string& jobKey); bool HasFlag(AZ::u8 flag, const AZStd::string& jobKey) const; diff --git a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.cpp b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.cpp index e9b64628e4..f84f80050e 100644 --- a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.cpp +++ b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.cpp @@ -151,7 +151,7 @@ namespace AssetBuilderSDK bool GatherProductDependencies( AZ::SerializeContext& serializeContext, - void* obj, + const void* obj, AZ::TypeId typeId, AZStd::vector& productDependencies, ProductPathDependencySet& productPathDependencySet, @@ -176,7 +176,7 @@ namespace AssetBuilderSDK return enumerateResult; } - bool OutputObject(void* obj, AZ::TypeId typeId, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext, const DependencyHandler& handler) + bool OutputObject(const void* obj, AZ::TypeId typeId, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext, const DependencyHandler& handler) { if (!serializeContext) { diff --git a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.h b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.h index 3f15da6461..8f8a1423f2 100644 --- a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.h +++ b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/SerializationDependencies.h @@ -57,7 +57,7 @@ namespace AssetBuilderSDK bool GatherProductDependencies( AZ::SerializeContext& serializeContext, - void* obj, + const void* obj, AZ::TypeId typeId, AZStd::vector& productDependencies, ProductPathDependencySet& productPathDependencySet, @@ -66,7 +66,7 @@ namespace AssetBuilderSDK template bool GatherProductDependencies( AZ::SerializeContext& serializeContext, - AZ::Data::Asset* obj, + const AZ::Data::Asset* obj, AZ::TypeId typeId, AZStd::vector& productDependencies, ProductPathDependencySet& productPathDependencySet, @@ -79,7 +79,7 @@ namespace AssetBuilderSDK template bool GatherProductDependencies( AZ::SerializeContext& serializeContext, - T* obj, + const T* obj, AZStd::vector& productDependencies, ProductPathDependencySet& productPathDependencySet, const DependencyHandler& handler = &UpdateDependenciesFromClassData) @@ -87,18 +87,18 @@ namespace AssetBuilderSDK return GatherProductDependencies(serializeContext, obj, azrtti_typeid(), productDependencies, productPathDependencySet, handler); } - bool OutputObject(void* obj, AZ::TypeId typeId, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext = nullptr, + bool OutputObject(const void* obj, AZ::TypeId typeId, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext = nullptr, const DependencyHandler& handler = &UpdateDependenciesFromClassData); template - bool OutputObject(T* obj, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext = nullptr, + bool OutputObject(const T* obj, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext = nullptr, const DependencyHandler& handler = &UpdateDependenciesFromClassData) { return OutputObject(obj, azrtti_typeid(), outputPath, assetType, subId, jobProduct, serializeContext, handler); } template - bool OutputObject(AZ::Data::Asset* obj, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext = nullptr, + bool OutputObject(const AZ::Data::Asset* obj, AZStd::string_view outputPath, AZ::Data::AssetType assetType, AZ::u32 subId, JobProduct& jobProduct, AZ::SerializeContext* serializeContext = nullptr, const DependencyHandler& handler = &UpdateDependenciesFromClassData) { AZ_Error("AssetBuilderSDK", false, "Can't output dependencies for AZ::Data::Asset* - Use T* or another underlying type"); diff --git a/Code/Tools/AssetProcessor/native/AssetManager/PathDependencyManager.cpp b/Code/Tools/AssetProcessor/native/AssetManager/PathDependencyManager.cpp index 40ff212768..78c49b1940 100644 --- a/Code/Tools/AssetProcessor/native/AssetManager/PathDependencyManager.cpp +++ b/Code/Tools/AssetProcessor/native/AssetManager/PathDependencyManager.cpp @@ -464,8 +464,8 @@ namespace AssetProcessor if (isExactDependency) { // Search for products in the cache platform folder - // Example: If a path dependency is "test1.asset" in SamplesProject on PC, this would search - // "SamplesProject/Cache/pc/test1.asset" + // Example: If a path dependency is "test1.asset" in AutomatedTesting on PC, this would search + // "AutomatedTesting/Cache/pc/test1.asset" m_stateData->GetProductsByProductName(productNameWithPlatform, productInfoContainer); } diff --git a/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp b/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp index c78e77cba8..a8e03bd3ac 100644 --- a/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp +++ b/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp @@ -725,6 +725,14 @@ namespace AssetProcessor { AzToolsFramework::AssetDatabase::ProductDatabaseEntryContainer products; m_stateData->GetProductsByJobID(job.m_jobID, products); + + auto keepProductsIter = description.m_productsToKeepOnFailure.find(jobEntry.m_jobKey.toUtf8().constData()); + if (keepProductsIter != description.m_productsToKeepOnFailure.end()) + { + // keep some products + AZStd::erase_if(products, [&](const auto& entry) { return !keepProductsIter->second.contains(entry.m_subID); }); + } + DeleteProducts(products); } } @@ -1569,7 +1577,7 @@ namespace AssetProcessor // this might be interesting, but only if its a known product! // the dictionary in statedata stores only the relative path, not the platform. // which means right now we have, for example - // d:/SamplesProject/Cache/ios/textures/favorite.tga + // d:/AutomatedTesting/Cache/ios/textures/favorite.tga // ^^^^^^^^^ projectroot // ^^^^^^^^^^^^^^^^^^^^^ cache root // ^^^^^^^^^^^^^^^^^^^^^^^^^ platform root @@ -1701,7 +1709,19 @@ namespace AssetProcessor AZ_TracePrintf(AssetProcessor::ConsoleChannel, "Deleting file %s because either its source file %s was removed or the builder did not emit this job.\n", fullProductPath.toUtf8().constData(), source.m_sourceName.c_str()); AssetProcessor::ProcessingJobInfoBus::Broadcast(&AssetProcessor::ProcessingJobInfoBus::Events::BeginCacheFileUpdate, fullProductPath.toUtf8().data()); - successfullyRemoved &= QFile::remove(fullProductPath); + bool wasRemoved = QFile::remove(fullProductPath); + + // Another process may be holding on to the file currently, so wait for a very brief period and then retry deleting + // once in case we were just too quick to delete the file before. + if (!wasRemoved) + { + constexpr int DeleteRetryDelay = 10; + AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(DeleteRetryDelay)); + wasRemoved = QFile::remove(fullProductPath); + } + + successfullyRemoved &= wasRemoved; + AssetProcessor::ProcessingJobInfoBus::Broadcast(&AssetProcessor::ProcessingJobInfoBus::Events::EndCacheFileUpdate, fullProductPath.toUtf8().data(), false); if(productFileInfo.absoluteDir().entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot).empty()) @@ -1805,10 +1825,9 @@ namespace AssetProcessor { if (!DeleteProducts(products)) { - // try again in a while. Achieve this by recycling the item back into - // the queue as if it had been deleted again. - CheckSource(FileEntry(normalizedPath, true)); - AZ_TracePrintf(AssetProcessor::ConsoleChannel, "Delete failed on %s. Will retry!. \n", normalizedPath.toUtf8().constData()); + // DeleteProducts will make an attempt to retry deleting each product + // We can't just re-queue the whole file with CheckSource because we're deleting bits from the database as we go + AZ_TracePrintf(AssetProcessor::ConsoleChannel, "Delete failed on %s.\n", normalizedPath.toUtf8().constData()); } } else diff --git a/Code/Tools/AssetProcessor/native/AssetManager/assetScannerWorker.cpp b/Code/Tools/AssetProcessor/native/AssetManager/assetScannerWorker.cpp index 1b0b057bef..a54e9b3c38 100644 --- a/Code/Tools/AssetProcessor/native/AssetManager/assetScannerWorker.cpp +++ b/Code/Tools/AssetProcessor/native/AssetManager/assetScannerWorker.cpp @@ -105,6 +105,16 @@ void AssetScannerWorker::ScanForSourceFiles(const ScanFolderInfo& scanFolderInfo AZ::u64 fileSize = isDirectory ? 0 : entry.size(); AssetFileInfo assetFileInfo(absPath, modTime, fileSize, &rootScanFolder, isDirectory); + // Skip over the Cache folder if the file entry is the project cache root + QDir projectCacheRoot; + AssetUtilities::ComputeProjectCacheRoot(projectCacheRoot); + QString relativeToProjectCacheRoot = projectCacheRoot.relativeFilePath(absPath); + if (QDir::isRelativePath(relativeToProjectCacheRoot) && !relativeToProjectCacheRoot.startsWith("..")) + { + // The Cache folder should not be scanned + continue; + } + // Filtering out excluded files if (m_platformConfiguration->IsFileExcluded(absPath)) { @@ -136,7 +146,5 @@ void AssetScannerWorker::EmitFiles() m_folderList.clear(); Q_EMIT ExcludedFound(m_excludedList); m_excludedList.clear(); - -} - +} diff --git a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp index 8f9f82c127..25b349d5cd 100644 --- a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp +++ b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp @@ -157,7 +157,7 @@ namespace AssetProcessor { AssetBuilderSDK::AssetBuilderDesc builderDesc; builderDesc.m_name = "Settings Registry Builder"; - builderDesc.m_patterns.emplace_back("*/bootstrap.cfg", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard); + builderDesc.m_patterns.emplace_back("*/engine.json", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard); builderDesc.m_builderType = AssetBuilderSDK::AssetBuilderDesc::AssetBuilderType::Internal; builderDesc.m_busId = m_builderId; builderDesc.m_createJobFunction = AZStd::bind(&SettingsRegistryBuilder::CreateJobs, this, AZStd::placeholders::_1, AZStd::placeholders::_2); @@ -195,7 +195,9 @@ namespace AssetProcessor response.m_createJobOutputs.push_back(AZStd::move(job)); } - response.m_sourceFileDependencyList.emplace_back("*.setreg", AZ::Uuid::CreateNull(), + AZ::IO::Path settingsRegistryWildcard = AZ::SettingsRegistryInterface::RegistryFolder; + settingsRegistryWildcard /= "*.setreg"; + response.m_sourceFileDependencyList.emplace_back(AZStd::move(settingsRegistryWildcard.Native()), AZ::Uuid::CreateNull(), AssetBuilderSDK::SourceFileDependency::SourceFileDependencyType::Wildcards); response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; } @@ -294,10 +296,11 @@ namespace AssetProcessor AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_GemRegistries(registry, platform, specialization, &scratchBuffer); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectRegistry(registry, platform, specialization, &scratchBuffer); - // Merge the Developer User settings registry only in non-release builds + // Merge the Project User and User home settings registry only in non-release builds if (!specialization.Contains("release")) { - AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_UserRegistry(registry, platform, specialization, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(registry, platform, specialization, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectUserRegistry(registry, platform, specialization, &scratchBuffer); } AZ::ComponentApplicationBus::Broadcast([®istry](AZ::ComponentApplicationRequests* appRequests) @@ -336,6 +339,7 @@ namespace AssetProcessor file.Close(); response.m_outputProducts.emplace_back(outputPath, m_assetType, productSubID + aznumeric_cast(i)); + response.m_outputProducts.back().m_dependenciesHandled = true; outputPath.erase(extensionOffset); } diff --git a/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp b/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp index c1c56447ac..281d5a24fa 100644 --- a/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp +++ b/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp @@ -120,7 +120,7 @@ namespace AssetProcessor QString canonicalTempDirPath = AssetUtilities::NormalizeDirectoryPath(m_data->m_temporarySourceDir.canonicalPath()); m_data->m_temporarySourceDir = QDir(canonicalTempDirPath); m_data->m_scopedDir.Setup(m_data->m_temporarySourceDir.path()); - m_data->m_gameName = AssetUtilities::ComputeProjectName("SamplesProject"); // uses the above file. + m_data->m_gameName = AssetUtilities::ComputeProjectName("AutomatedTesting"); // uses the above file. AssetUtilities::ResetAssetRoot(); QDir newRoot; // throwaway dummy var - we just want to invoke the below function diff --git a/Code/Tools/AssetProcessor/native/tests/AssetProcessorMessagesTests.cpp b/Code/Tools/AssetProcessor/native/tests/AssetProcessorMessagesTests.cpp index baa8b980e3..1b3bac2897 100644 --- a/Code/Tools/AssetProcessor/native/tests/AssetProcessorMessagesTests.cpp +++ b/Code/Tools/AssetProcessor/native/tests/AssetProcessorMessagesTests.cpp @@ -105,8 +105,8 @@ namespace AssetProcessorMessagesTests m_batchApplicationManager = AZStd::make_unique(&argC, nullptr, nullptr); m_batchApplicationManager->BeforeRun(); - // Override Game Name to be "SamplesProject" - AssetUtilities::ComputeProjectName("SamplesProject", true); + // Override Game Name to be "AutomatedTesting" + AssetUtilities::ComputeProjectName("AutomatedTesting", true); m_batchApplicationManager->m_platformConfiguration = new PlatformConfiguration(); m_batchApplicationManager->InitAssetProcessorManager(); @@ -150,7 +150,7 @@ namespace AssetProcessorMessagesTests connectionSettings.m_assetProcessorIp = "127.0.0.1"; connectionSettings.m_assetProcessorPort = AssetProcessorPort; connectionSettings.m_branchToken = appBranchToken; - connectionSettings.m_projectName = "SamplesProject"; + connectionSettings.m_projectName = "AutomatedTesting"; connectionSettings.m_assetPlatform = "pc"; connectionSettings.m_connectionIdentifier = "UNITTEST"; connectionSettings.m_connectTimeout = AZStd::chrono::seconds(15); diff --git a/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp b/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp index 6b4a2ac746..6c2bf754c1 100644 --- a/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp +++ b/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp @@ -227,7 +227,7 @@ void AssetProcessorManagerTest::SetUp() SetArgReferee<0>(m_data->m_databaseLocation), Return(true))); - m_gameName = AssetUtilities::ComputeProjectName("SamplesProject", true); + m_gameName = AssetUtilities::ComputeProjectName("AutomatedTesting", true); AssetUtilities::ResetAssetRoot(); QDir newRoot; @@ -1665,7 +1665,7 @@ TEST_F(PathDependencyTest, NoLongerProcessedFile_IsRemoved) m_sharedConnection->GetProductsBySourceName("test1.txt", products); ASSERT_EQ(products.size(), 0); - ASSERT_FALSE(QFile::exists(m_normalizedCacheRootDir.absoluteFilePath("pc/samplesproject/test1.asset1").toUtf8().constData())); + ASSERT_FALSE(QFile::exists(m_normalizedCacheRootDir.absoluteFilePath("pc/automatedtesting/test1.asset1").toUtf8().constData())); } TEST_F(PathDependencyTest, AssetProcessed_Impl_SelfReferrentialProductDependency_DependencyIsRemoved) diff --git a/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp b/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp index 24f028a3a7..076a1c2448 100644 --- a/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp +++ b/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp @@ -586,7 +586,7 @@ TEST_F(PlatformConfigurationUnitTests, Test_GemHandling) QTemporaryDir tempEngineRoot; QDir tempPath(tempEngineRoot.path()); AssetUtilities::ResetAssetRoot(); - AssetUtilities::ComputeProjectName("SamplesProject", true); + AssetUtilities::ComputeProjectName("AutomatedTesting", true); QDir computedEngineRoot; ASSERT_TRUE(AssetUtilities::ComputeAssetRoot(computedEngineRoot, &tempPath)); @@ -666,7 +666,7 @@ TEST_F(PlatformConfigurationUnitTests, PlatformConfigFile_IsPresent_Found) QTemporaryDir tempEngineRoot; QDir tempPath(tempEngineRoot.path()); AssetUtilities::ResetAssetRoot(); - AssetUtilities::ComputeProjectName("SamplesProject", true); + AssetUtilities::ComputeProjectName("AutomatedTesting", true); auto settingsRegistry = AZ::SettingsRegistry::Get(); ASSERT_NE(nullptr, settingsRegistry); diff --git a/Code/Tools/AssetProcessor/native/unittests/AssetProcessorManagerUnitTests.cpp b/Code/Tools/AssetProcessor/native/unittests/AssetProcessorManagerUnitTests.cpp index ae68d5f872..a336997068 100644 --- a/Code/Tools/AssetProcessor/native/unittests/AssetProcessorManagerUnitTests.cpp +++ b/Code/Tools/AssetProcessor/native/unittests/AssetProcessorManagerUnitTests.cpp @@ -70,7 +70,7 @@ namespace AssetProcessor namespace { - constexpr const char* AssetProcessorManagerTestGameProject = "SamplesProject"; + constexpr const char* AssetProcessorManagerTestGameProject = "AutomatedTesting"; /// This functions sorts the processed result list by platform name /// if platform is same than it sorts by job description void sortAssetToProcessResultList(QList& processResults) diff --git a/Code/Tools/AssetProcessor/native/utilities/GUIApplicationManager.cpp b/Code/Tools/AssetProcessor/native/utilities/GUIApplicationManager.cpp index 78be834dba..dc0786d918 100644 --- a/Code/Tools/AssetProcessor/native/utilities/GUIApplicationManager.cpp +++ b/Code/Tools/AssetProcessor/native/utilities/GUIApplicationManager.cpp @@ -669,6 +669,7 @@ void GUIApplicationManager::FileChanged(QString path) AZ::SettingsRegistryInterface* settingsRegistry = AZ::SettingsRegistry::Get(); AZ_Assert(settingsRegistry, "Unable to retrieve global SettingsRegistry, it should be available now"); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(*settingsRegistry); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(*settingsRegistry, AZ_TRAIT_OS_PLATFORM_CODENAME, {}); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(*settingsRegistry, *m_frameworkApp.GetAzCommandLine(), false); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*settingsRegistry); } diff --git a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp index 28adb622d6..3007d3f8b3 100644 --- a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp +++ b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp @@ -1011,6 +1011,7 @@ namespace AssetProcessor } AZ::IO::FixedMaxPathString projectPath = AZ::Utils::GetProjectPath(); + AZ::IO::FixedMaxPathString projectName = AZ::Utils::GetProjectName(); AZ::IO::FixedMaxPath engineRoot(AZ::IO::PosixPathSeparator); settingsRegistry->Get(engineRoot.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_EngineRootFolder); @@ -1061,6 +1062,7 @@ namespace AssetProcessor AZ::StringFunc::Replace(scanFolderEntry.m_scanFolderDisplayName, "@ROOT@", assetRootPath.c_str()); AZ::StringFunc::Replace(scanFolderEntry.m_scanFolderDisplayName, "@PROJECTROOT@", projectPath.c_str()); + AZ::StringFunc::Replace(scanFolderEntry.m_scanFolderDisplayName, "@PROJECTNAME@", projectName.c_str()); AZ::StringFunc::Replace(scanFolderEntry.m_scanFolderDisplayName, "@ENGINEROOT@", engineRoot.c_str()); QStringList includeIdentifiers; diff --git a/Code/Tools/AssetProcessor/native/utilities/assetUtils.h b/Code/Tools/AssetProcessor/native/utilities/assetUtils.h index e0633068a7..201911eb96 100644 --- a/Code/Tools/AssetProcessor/native/utilities/assetUtils.h +++ b/Code/Tools/AssetProcessor/native/utilities/assetUtils.h @@ -97,7 +97,7 @@ namespace AssetUtilities bool ShouldUseFileHashing(); - //! Determine the name of the current project - for example, SamplesProject + //! Determine the name of the current project - for example, AutomatedTesting //! Can be overridden by passing in a non-empty projectNameOverride //! The override will persist if the project name wasn't set previously or //! force=true is supplied diff --git a/Code/Tools/AzTestRunner/Platform/Android/android_project.json b/Code/Tools/AzTestRunner/Platform/Android/android_project.json index 957f408ef2..dbea35299f 100644 --- a/Code/Tools/AzTestRunner/Platform/Android/android_project.json +++ b/Code/Tools/AzTestRunner/Platform/Android/android_project.json @@ -1,4 +1,5 @@ { + "project_name" : "AzTestRunner", "product_name" : "AzTestRunner Project", "android_settings": { "package_name" : "com.lumberyard.tests", diff --git a/Code/Tools/CrashHandler/CMakeLists.txt b/Code/Tools/CrashHandler/CMakeLists.txt index 4b13c7556e..7c8229b8a4 100644 --- a/Code/Tools/CrashHandler/CMakeLists.txt +++ b/Code/Tools/CrashHandler/CMakeLists.txt @@ -9,10 +9,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -if(NOT PAL_TRAIT_BUILD_HOST_TOOLS) - return() -endif() - ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) @@ -72,9 +68,10 @@ ly_add_target( Uploader/include/Uploader BUILD_DEPENDENCIES PRIVATE - 3rdParty::Crashpad::Handler AZ::AzCore AZ::CrashSupport + PUBLIC + 3rdParty::Crashpad::Handler ) add_subdirectory(Tools) diff --git a/Code/Tools/CrashHandler/Tools/CMakeLists.txt b/Code/Tools/CrashHandler/Tools/CMakeLists.txt index 738536d614..390ff7b07d 100644 --- a/Code/Tools/CrashHandler/Tools/CMakeLists.txt +++ b/Code/Tools/CrashHandler/Tools/CMakeLists.txt @@ -9,6 +9,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +if(NOT PAL_TRAIT_BUILD_HOST_TOOLS) + return() +endif() + ly_add_target( NAME ToolsCrashHandler STATIC NAMESPACE AZ diff --git a/Code/Tools/CryCommonTools/SummedAreaFilterKernel.cpp b/Code/Tools/CryCommonTools/SummedAreaFilterKernel.cpp index 9f2529ffd6..3ee26df3bd 100644 --- a/Code/Tools/CryCommonTools/SummedAreaFilterKernel.cpp +++ b/Code/Tools/CryCommonTools/SummedAreaFilterKernel.cpp @@ -125,7 +125,7 @@ bool CSummedAreaFilterKernel::CreateFromSincCalc(const unsigned long indwSize) float r2 = r1 * 8.0f; // http://home.no.net/dmaurer/~dersch/interpolator/interpolator.html - // weight = [ sin(x*�) / (x*�) ] * [ sin(x*� / 8) / (x*�/8) ] + // weight = [ sin(x*pi) / (x*pi) ] * [ sin(x*pi / 8) / (x*pi/8) ] // http://www.binbooks.com/books/photo/i/l/57186AF8DE // sinc(x) = sin(pi * x) / (pi * x) diff --git a/Code/Tools/HLSLCrossCompiler/src/toGLSL.c b/Code/Tools/HLSLCrossCompiler/src/toGLSL.c index c5b7289a69..283eeabca8 100644 --- a/Code/Tools/HLSLCrossCompiler/src/toGLSL.c +++ b/Code/Tools/HLSLCrossCompiler/src/toGLSL.c @@ -17,7 +17,10 @@ #include "../offline/hash.h" #if defined(_WIN32) && !defined(PORTABLE) +#include +AZ_PUSH_DISABLE_WARNING(4115, "-Wunknown-warning-option") #include +AZ_POP_DISABLE_WARNING #pragma comment(lib,"d3dcompiler.lib") #endif //defined(_WIN32) && !defined(PORTABLE) diff --git a/Code/Tools/News/NewsShared/LogType.h b/Code/Tools/News/NewsShared/LogType.h index 9f61eef25e..52f4b2d405 100644 --- a/Code/Tools/News/NewsShared/LogType.h +++ b/Code/Tools/News/NewsShared/LogType.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Code/Tools/RC/Config/rc/RCJob_Build_SamplesProject.xml b/Code/Tools/RC/Config/rc/RCJob_Build_SamplesProject.xml deleted file mode 100644 index 81b5c86659..0000000000 --- a/Code/Tools/RC/Config/rc/RCJob_Build_SamplesProject.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Code/Tools/RC/Config/rc/RCJob_Generic_MakeAuxiliaryContent.xml b/Code/Tools/RC/Config/rc/RCJob_Generic_MakeAuxiliaryContent.xml index bcb4e679cf..d6c0e36096 100644 --- a/Code/Tools/RC/Config/rc/RCJob_Generic_MakeAuxiliaryContent.xml +++ b/Code/Tools/RC/Config/rc/RCJob_Generic_MakeAuxiliaryContent.xml @@ -4,7 +4,7 @@ --> diff --git a/Code/Tools/RC/Config/rc/RCJob_Generic_MakePaks.xml b/Code/Tools/RC/Config/rc/RCJob_Generic_MakePaks.xml index 714c3ccf37..da76bc0f1b 100644 --- a/Code/Tools/RC/Config/rc/RCJob_Generic_MakePaks.xml +++ b/Code/Tools/RC/Config/rc/RCJob_Generic_MakePaks.xml @@ -5,7 +5,7 @@ --> +#include #include #include @@ -2407,23 +2408,30 @@ void ResourceCompiler::ScanForAssetReferences(std::vector& outReferences } } - std::vector levelPaks; - FileUtil::ScanDirectory(scanRoot, "level.pak", levelPaks, true, string()); - for (size_t i = 0; i < levelPaks.size(); ++i) + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (!usePrefabSystemForLevels) { - const string path = PathHelpers::GetDirectory(levelPaks[i].c_str()) + "\\resourcelist.txt"; - if (reader.LoadFromPak(GetPakSystem(), path, lines)) + std::vector levelPaks; + FileUtil::ScanDirectory(scanRoot, "level.pak", levelPaks, true, string()); + for (size_t i = 0; i < levelPaks.size(); ++i) { - for (size_t j = 0; j < lines.size(); ++j) + const string path = PathHelpers::GetDirectory(levelPaks[i].c_str()) + "\\resourcelist.txt"; + if (reader.LoadFromPak(GetPakSystem(), path, lines)) { - const char* const line = lines[j]; - if (references.find(line) == references.end()) + for (size_t j = 0; j < lines.size(); ++j) { - strings.push_back(line); - references.insert(strings.back().c_str()); + const char* const line = lines[j]; + if (references.find(line) == references.end()) + { + strings.push_back(line); + references.insert(strings.back().c_str()); + } } + ++numSources; } - ++numSources; } } diff --git a/Code/Tools/RC/ResourceCompiler/main.cpp b/Code/Tools/RC/ResourceCompiler/main.cpp index a33668f6cf..3dd326f37e 100644 --- a/Code/Tools/RC/ResourceCompiler/main.cpp +++ b/Code/Tools/RC/ResourceCompiler/main.cpp @@ -558,10 +558,14 @@ int rcmain(int argc, char** argv, [[maybe_unused]] char** envp) RCLog("Initializing System"); { - // Create a local SettingsRegistry to read the bootstrap.cfg settings if the appRoot hasn't been overriden + // Create a local SettingsRegistry to read the bootstrap.cfg settings if the engine root hasn't been overridden // on the command line + AZ::CommandLine commandLine; + commandLine.Parse(argc, argv); AZ::SettingsRegistryImpl settingsRegistry; AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(settingsRegistry); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(settingsRegistry, AZ_TRAIT_OS_PLATFORM_CODENAME, {}); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(settingsRegistry, commandLine, false); string projectPath = config.GetAsString("gameroot", "", ""); if (!projectPath.empty()) diff --git a/Code/Tools/RC/ResourceCompilerPC/StatCGFCompiler.cpp b/Code/Tools/RC/ResourceCompilerPC/StatCGFCompiler.cpp index 87a3493ba2..29300fe3ae 100644 --- a/Code/Tools/RC/ResourceCompilerPC/StatCGFCompiler.cpp +++ b/Code/Tools/RC/ResourceCompilerPC/StatCGFCompiler.cpp @@ -1074,7 +1074,7 @@ bool CStatCGFCompiler::CompileCGF(AssetBuilderSDK::ProcessJobResponse& response, // Check if our material name is just a name, or if it contains a path if (strstr(materialName.c_str(), "/") || strstr(materialName.c_str(), "\\")) { - // The material path is already relative to devroot, for example "samplesproject/materials/foo.mtl" + // The material path is already relative to devroot, for example "automatedtesting/materials/foo.mtl" // We need to convert this to the cache path AP generates. In this case, cut off the game project name. AZStd::string materialRelativePath = materialName; EBUS_EVENT(AzFramework::ApplicationRequests::Bus, NormalizePath, gameFolder); diff --git a/Code/Tools/RC/ResourceCompilerPC/Tests/test_Main.cpp b/Code/Tools/RC/ResourceCompilerPC/Tests/test_Main.cpp index 2944dde60d..19d1e380e1 100644 --- a/Code/Tools/RC/ResourceCompilerPC/Tests/test_Main.cpp +++ b/Code/Tools/RC/ResourceCompilerPC/Tests/test_Main.cpp @@ -212,7 +212,7 @@ TEST_F(CGFBuilderTest, CGF_MaterialInSameFolder) } // In this case, we load a basic CGF where the material path is absolute from the dev/ folder, -// for example "samplesproject/materials/test.mtl". +// for example "automatedtesting/materials/test.mtl". TEST_F(CGFBuilderTest, CGF_MaterialInDifferentFolder) { AZStd::string cgfName = "gs_block.cgf"; diff --git a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExportContexts.cpp b/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExportContexts.cpp deleted file mode 100644 index 6c585ce16e..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExportContexts.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include - -namespace AZ -{ - namespace RC - { - ChrGroupExportContext::ChrGroupExportContext(SceneAPI::Events::ExportEventContext& parent, - const SceneAPI::DataTypes::ISkeletonGroup& group, Phase phase) - : m_products(parent.GetProductList()) - , m_scene(parent.GetScene()) - , m_outputDirectory(parent.GetOutputDirectory()) - , m_group(group) - , m_phase(phase) - { - } - - ChrGroupExportContext::ChrGroupExportContext(SceneAPI::Events::ExportProductList& products, const SceneAPI::Containers::Scene& scene, - const AZStd::string& outputDirectory, const SceneAPI::DataTypes::ISkeletonGroup& group, Phase phase) - : m_products(products) - , m_scene(scene) - , m_outputDirectory(outputDirectory) - , m_group(group) - , m_phase(phase) - { - } - - ChrGroupExportContext::ChrGroupExportContext(const ChrGroupExportContext& copyContext, Phase phase) - : m_products(copyContext.m_products) - , m_scene(copyContext.m_scene) - , m_outputDirectory(copyContext.m_outputDirectory) - , m_group(copyContext.m_group) - , m_phase(phase) - { - } - } -} \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExportContexts.h b/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExportContexts.h deleted file mode 100644 index 701a4a89ca..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExportContexts.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include - -namespace AZ -{ - namespace SceneAPI - { - namespace DataTypes - { - class ISkeletonGroup; - } - namespace Events - { - class ExportProductList; - } - } - - namespace RC - { - // Called to export a specific Skeleton (Chr) Group - struct ChrGroupExportContext - : public SceneAPI::Events::ICallContext - { - AZ_RTTI(ChrGroupExportContext, "{294BB98B-DE9D-4B03-B219-A8A94657E81E}", SceneAPI::Events::ICallContext); - - ChrGroupExportContext(SceneAPI::Events::ExportEventContext& parent, - const SceneAPI::DataTypes::ISkeletonGroup& group, Phase phase); - ChrGroupExportContext(SceneAPI::Events::ExportProductList& products, const SceneAPI::Containers::Scene& scene, - const AZStd::string& outputDirectory, const SceneAPI::DataTypes::ISkeletonGroup& group, Phase phase); - ChrGroupExportContext(const ChrGroupExportContext& copyContent, Phase phase); - ChrGroupExportContext(const ChrGroupExportContext& copyContent) = delete; - ~ChrGroupExportContext() override = default; - - ChrGroupExportContext& operator=(const ChrGroupExportContext& other) = delete; - - SceneAPI::Events::ExportProductList& m_products; - const SceneAPI::Containers::Scene& m_scene; - const AZStd::string& m_outputDirectory; - const SceneAPI::DataTypes::ISkeletonGroup& m_group; - const Phase m_phase; - }; - } -} \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExporter.cpp b/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExporter.cpp deleted file mode 100644 index 4057bf422b..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExporter.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -namespace AZ -{ - namespace RC - { - namespace SceneContainers = AZ::SceneAPI::Containers; - namespace SceneDataTypes = AZ::SceneAPI::DataTypes; - - ChrExporter::ChrExporter(IConvertContext* convertContext) - : m_convertContext(convertContext) - { - BindToCall(&ChrExporter::ProcessContext); - ActivateBindings(); - } - - SceneEvents::ProcessingResult ChrExporter::ProcessContext(SceneEvents::ExportEventContext& context) - { - const SceneContainers::SceneManifest& manifest = context.GetScene().GetManifest(); - auto valueStorage = manifest.GetValueStorage(); - auto view = SceneContainers::MakeDerivedFilterView(valueStorage); - - SceneEvents::ProcessingResultCombiner result; - for (const SceneDataTypes::ISkeletonGroup& skeletonGroup : view) - { - AZ_TraceContext("Skeleton Group", skeletonGroup.GetName()); - result += SceneEvents::Process(context, skeletonGroup, Phase::Construction); - result += SceneEvents::Process(context, skeletonGroup, Phase::Filling); - result += SceneEvents::Process(context, skeletonGroup, Phase::Finalizing); - } - return result.GetResult(); - } - } // namespace RC -} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExporter.h b/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExporter.h deleted file mode 100644 index e00759fa90..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrExporter.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include - -struct IConvertContext; - -namespace AZ -{ - namespace SceneAPI - { - namespace Events - { - class ExportEventContext; - } - } - - namespace RC - { - namespace SceneEvents = AZ::SceneAPI::Events; - - class ChrExporter - : public SceneEvents::CallProcessorBinder - { - public: - ChrExporter(IConvertContext* convertContext); - ~ChrExporter() override = default; - - SceneEvents::ProcessingResult ProcessContext(SceneEvents::ExportEventContext& context); - - private: - IConvertContext* m_convertContext; - }; - } // namespace RC -} // namespace AZ \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrGroupExporter.cpp b/Code/Tools/RC/ResourceCompilerScene/Chr/ChrGroupExporter.cpp deleted file mode 100644 index 98a2a8a646..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrGroupExporter.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include // Needed for CGFContent.h -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace AZ -{ - namespace RC - { - namespace SceneUtil = AZ::SceneAPI::Utilities; - namespace SceneContainer = AZ::SceneAPI::Containers; - namespace SceneDataTypes = AZ::SceneAPI::DataTypes; - - const AZStd::string ChrGroupExporter::fileExtension = "chr"; - - ChrGroupExporter::ChrGroupExporter(IAssetWriter* writer, IConvertContext* convertContext) - : m_assetWriter(writer) - , m_convertContext(convertContext) - { - BindToCall(&ChrGroupExporter::ProcessContext); - ActivateBindings(); - } - - SceneEvents::ProcessingResult ChrGroupExporter::ProcessContext(ChrGroupExportContext& context) const - { - if (context.m_phase != Phase::Filling) - { - return SceneEvents::ProcessingResult::Ignored; - } - - AZStd::string filename = SceneUtil::FileUtilities::CreateOutputFileName(context.m_group.GetName(), context.m_outputDirectory, fileExtension); - if (filename.empty()) - { - AZ_TracePrintf(SceneUtil::ErrorWindow, "Invalid filename, can not be an empty value.\n"); - return SceneEvents::ProcessingResult::Failure; - } - if (!SceneUtil::FileUtilities::EnsureTargetFolderExists(filename)) - { - AZ_TracePrintf(SceneUtil::ErrorWindow, "Invalid filename, target folder does not exist. ('%s')\n", filename.c_str()); - return SceneEvents::ProcessingResult::Failure; - } - - - SceneEvents::ProcessingResultCombiner result; - - CContentCGF cgfContent(filename.c_str()); - AZStd::unordered_map boneNameIdMap; - SkeletonExportContext skeletonContextConstruction(context.m_scene, context.m_group.GetSelectedRootBone(), *cgfContent.GetSkinningInfo(), boneNameIdMap, Phase::Construction); - ConfigureChrContent(cgfContent); - result += SceneEvents::Process(skeletonContextConstruction); - result += SceneEvents::Process(context.m_scene, context.m_group.GetSelectedRootBone(), *cgfContent.GetSkinningInfo(), boneNameIdMap, Phase::Filling); - result += SceneEvents::Process(context.m_scene, context.m_group.GetSelectedRootBone(), *cgfContent.GetSkinningInfo(), boneNameIdMap, Phase::Finalizing); - - AZ_Assert(m_assetWriter != nullptr, "Unable to write CHR due to invalid asset writer."); - if (m_assetWriter) - { - if (m_assetWriter->WriteCHR(&cgfContent, m_convertContext)) - { - static const AZ::Data::AssetType skeletonAssetType("{60161B46-21F0-4396-A4F0-F2CCF0664CDE}"); - - auto& list = context.m_products.GetProducts(); - bool isFirst = AZStd::find_if(list.begin(), list.end(), - [](const SceneAPI::Events::ExportProduct& it) -> bool - { - return it.m_assetType == skeletonAssetType; - }) == list.end(); - - SceneAPI::Events::ExportProduct& product = context.m_products.AddProduct(AZStd::move(filename), context.m_group.GetId(), skeletonAssetType, - AZStd::nullopt, AZStd::nullopt); - - // Previously only a single skeleton would be exported that was named after the source file. This was changed to exporting all - // skeletons now named after the root node. This means that the first skeleton would previously have been known under - // another name. - if (isFirst) - { - AZStd::string legacyName = product.m_filename; - AzFramework::StringFunc::Path::ReplaceFullName(legacyName, context.m_scene.GetName().c_str(), fileExtension.c_str()); - product.m_legacyFileNames.emplace_back(AZStd::move(legacyName)); - } - } - else - { - AZ_TracePrintf(SceneUtil::ErrorWindow, "Failed writing CHR file ('%s')\n", filename.c_str()); - result += SceneEvents::ProcessingResult::Failure; - } - } - else - { - AZ_TracePrintf(SceneUtil::ErrorWindow, "Failed writing CHR file ('%s')\n", filename.c_str()); - result += SceneEvents::ProcessingResult::Failure; - } - - return result.GetResult(); - } - - void ChrGroupExporter::ConfigureChrContent(CContentCGF& content) const - { - CExportInfoCGF* exportInfo = content.GetExportInfo(); - AZ_Assert(exportInfo != nullptr, "Invalid export info from %s.", content.GetFilename()); - - exportInfo->bMergeAllNodes = true; - exportInfo->bUseCustomNormals = false; - exportInfo->bCompiledCGF = false; - exportInfo->bHavePhysicsProxy = false; - exportInfo->bHaveAutoLods = false; - exportInfo->bNoMesh = true; - exportInfo->b8WeightsPerVertex = false; - exportInfo->bWantF32Vertices = false; - exportInfo->authorToolVersion = 1; - } - } // namespace RC -} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrGroupExporter.h b/Code/Tools/RC/ResourceCompilerScene/Chr/ChrGroupExporter.h deleted file mode 100644 index dbbd8ffcc0..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Chr/ChrGroupExporter.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include - -struct IConvertContext; -class CContentCGF; - -namespace AZ -{ - namespace RC - { - struct ChrGroupExportContext; - - namespace SceneEvents = AZ::SceneAPI::Events; - - class ChrGroupExporter - : public SceneEvents::CallProcessorBinder - { - public: - ChrGroupExporter(IAssetWriter* writer, IConvertContext* convertContext); - ~ChrGroupExporter() override = default; - - SceneEvents::ProcessingResult ProcessContext(ChrGroupExportContext& context) const; - - static const AZStd::string fileExtension; - - protected: - void ConfigureChrContent(CContentCGF& content) const; - - IAssetWriter* m_assetWriter; - IConvertContext* m_convertContext; - }; - } // namespace RC -} // namespace AZ \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExportContexts.cpp b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExportContexts.cpp deleted file mode 100644 index c3fc5b8912..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExportContexts.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include - -namespace AZ -{ - namespace RC - { - SkinGroupExportContext::SkinGroupExportContext(SceneAPI::Events::ExportEventContext& parent, - const SceneAPI::DataTypes::ISkinGroup& group, Phase phase) - : m_products(parent.GetProductList()) - , m_scene(parent.GetScene()) - , m_outputDirectory(parent.GetOutputDirectory()) - , m_group(group) - , m_phase(phase) - { - } - - SkinGroupExportContext::SkinGroupExportContext(SceneAPI::Events::ExportProductList& products, const SceneAPI::Containers::Scene& scene, - const AZStd::string& outputDirectory, const SceneAPI::DataTypes::ISkinGroup& group, Phase phase) - : m_products(products) - , m_scene(scene) - , m_outputDirectory(outputDirectory) - , m_group(group) - , m_phase(phase) - { - } - - SkinGroupExportContext::SkinGroupExportContext(const SkinGroupExportContext& copyContext, Phase phase) - : m_products(copyContext.m_products) - , m_scene(copyContext.m_scene) - , m_outputDirectory(copyContext.m_outputDirectory) - , m_group(copyContext.m_group) - , m_phase(phase) - { - } - } -} \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExportContexts.h b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExportContexts.h deleted file mode 100644 index 8efb49b03c..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExportContexts.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include - -struct CSkinningInfo; - -namespace AZ -{ - namespace SceneAPI - { - namespace DataTypes - { - class ISkinGroup; - } - } - - namespace RC - { - // Called to export a specific Skin Group - struct SkinGroupExportContext - : public SceneAPI::Events::ICallContext - { - AZ_RTTI(SkinGroupExportContext, "{F2C0DF6D-84F7-4692-9626-C981FA599755}", SceneAPI::Events::ICallContext); - - SkinGroupExportContext(SceneAPI::Events::ExportEventContext& parent, - const SceneAPI::DataTypes::ISkinGroup& group, Phase phase); - SkinGroupExportContext(SceneAPI::Events::ExportProductList& products, const SceneAPI::Containers::Scene& scene, - const AZStd::string& outputDirectory, const SceneAPI::DataTypes::ISkinGroup& group, Phase phase); - SkinGroupExportContext(const SkinGroupExportContext& copyContent, Phase phase); - SkinGroupExportContext(const SkinGroupExportContext& copyContent) = delete; - ~SkinGroupExportContext() override = default; - - SkinGroupExportContext& operator=(const SkinGroupExportContext& other) = delete; - - SceneAPI::Events::ExportProductList& m_products; - const SceneAPI::Containers::Scene& m_scene; - const AZStd::string& m_outputDirectory; - const SceneAPI::DataTypes::ISkinGroup& m_group; - const Phase m_phase; - }; - } -} \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExporter.cpp b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExporter.cpp deleted file mode 100644 index cd27570f3b..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExporter.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include - -namespace AZ -{ - namespace RC - { - namespace SceneContainers = AZ::SceneAPI::Containers; - namespace SceneDataTypes = AZ::SceneAPI::DataTypes; - - SkinExporter::SkinExporter(IConvertContext* convertContext) - : m_convertContext(convertContext) - { - BindToCall(&SkinExporter::ProcessContext); - ActivateBindings(); - } - - SceneEvents::ProcessingResult SkinExporter::ProcessContext(SceneEvents::ExportEventContext& context) - { - const SceneContainers::SceneManifest& manifest = context.GetScene().GetManifest(); - auto valueStorage = manifest.GetValueStorage(); - auto view = SceneContainers::MakeDerivedFilterView(valueStorage); - - SceneEvents::ProcessingResultCombiner result; - for (const SceneDataTypes::ISkinGroup& skinGroup : view) - { - AZ_TraceContext("Skin Group", skinGroup.GetName()); - result += SceneEvents::Process(context, skinGroup, Phase::Construction); - result += SceneEvents::Process(context, skinGroup, Phase::Filling); - result += SceneEvents::Process(context, skinGroup, Phase::Finalizing); - } - return result.GetResult(); - } - } // namespace RC -} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExporter.h b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExporter.h deleted file mode 100644 index b575222f7f..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinExporter.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include - -namespace AZ -{ - namespace SceneAPI - { - namespace Events - { - class ExportEventContext; - } - } -} - -struct IConvertContext; - -namespace AZ -{ - namespace RC - { - namespace SceneEvents = AZ::SceneAPI::Events; - - class SkinExporter - : public SceneEvents::CallProcessorBinder - { - public: - SkinExporter(IConvertContext* convertContext); - ~SkinExporter() override = default; - - SceneEvents::ProcessingResult ProcessContext(SceneEvents::ExportEventContext& context); - - private: - IConvertContext* m_convertContext; - }; - } // namespace RC -} // namespace AZ \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinGroupExporter.cpp b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinGroupExporter.cpp deleted file mode 100644 index c17dde631e..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinGroupExporter.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include // Needed for CGFContent.h -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace AZ -{ - namespace RC - { - namespace SceneUtil = AZ::SceneAPI::Utilities; - namespace SceneContainer = AZ::SceneAPI::Containers; - - const AZStd::string SkinGroupExporter::s_fileExtension = "skin"; - - SkinGroupExporter::SkinGroupExporter(IAssetWriter* writer, IConvertContext* convertContext) - : m_assetWriter(writer) - , m_convertContext(convertContext) - { - BindToCall(&SkinGroupExporter::ProcessContext); - ActivateBindings(); - } - - SceneEvents::ProcessingResult SkinGroupExporter::ProcessContext(SkinGroupExportContext& context) const - { - if (context.m_phase != Phase::Filling) - { - return SceneEvents::ProcessingResult::Ignored; - } - - AZStd::string filename = SceneUtil::FileUtilities::CreateOutputFileName(context.m_group.GetName(), context.m_outputDirectory, s_fileExtension); - AZ_TraceContext("Skin filename", filename); - if (filename.empty() || !SceneUtil::FileUtilities::EnsureTargetFolderExists(filename)) - { - AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Invalid file name for skin"); - return SceneEvents::ProcessingResult::Failure; - } - - SceneEvents::ProcessingResultCombiner result; - - CContentCGF cgfContent(filename.c_str()); - ConfigureSkinContent(cgfContent); - // Process mesh - // For each selected mesh, find its skinned skeleton's root bone. Make sure the root bone is consistent through all selected skin meshes. - const SceneContainer::SceneGraph& graph = context.m_scene.GetGraph(); - AZStd::vector targetNodes = SceneUtil::SceneGraphSelector::GenerateTargetNodes(graph, - context.m_group.GetSceneNodeSelectionList(), SceneUtil::SceneGraphSelector::IsMesh); - result += ProcessSkins(context, cgfContent, targetNodes); - - if (m_assetWriter) - { - if (m_assetWriter->WriteSKIN(&cgfContent, m_convertContext, true)) - { - static const AZ::Data::AssetType skinnedMeshAssetType("{C5D443E1-41FF-4263-8654-9438BC888CB7}"); // from MeshAsset.h - context.m_products.AddProduct(AZStd::move(filename), context.m_group.GetId(), skinnedMeshAssetType, 0, AZStd::nullopt); - } - else - { - AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Writing Skin has failed."); - result += SceneEvents::ProcessingResult::Failure; - } - } - else - { - AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "No asset writer found. Unable to write skin to disk"); - result += SceneEvents::ProcessingResult::Failure; - } - return result.GetResult(); - } - } // namespace RC -} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinGroupExporter.h b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinGroupExporter.h deleted file mode 100644 index 7796965959..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinGroupExporter.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include - -struct IConvertContext; - -namespace AZ -{ - namespace RC - { - struct SkinGroupExportContext; - - namespace SceneEvents = AZ::SceneAPI::Events; - - class SkinGroupExporter - : public SceneEvents::CallProcessorBinder - { - public: - SkinGroupExporter(IAssetWriter* writer, IConvertContext* convertContext); - ~SkinGroupExporter() override = default; - - SceneEvents::ProcessingResult ProcessContext(SkinGroupExportContext& context) const; - - static const AZStd::string s_fileExtension; - - protected: - IAssetWriter* m_assetWriter; - IConvertContext* m_convertContext; - }; - } // namespace RC -} // namespace AZ \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinLodExporter.cpp b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinLodExporter.cpp deleted file mode 100644 index 29d23e5b53..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinLodExporter.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include // Needed for CGFContent.h -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace AZ -{ - namespace RC - { - namespace SceneUtil = AZ::SceneAPI::Utilities; - namespace SceneContainer = AZ::SceneAPI::Containers; - namespace SceneDataTypes = AZ::SceneAPI::DataTypes; - - const AZStd::string SkinLodExporter::s_fileExtension = "skin"; - - SkinLodExporter::SkinLodExporter(IAssetWriter* writer, IConvertContext* convertContext) - : m_assetWriter(writer) - , m_convertContext(convertContext) - { - BindToCall(&SkinLodExporter::ProcessContext); - ActivateBindings(); - } - - SceneEvents::ProcessingResult SkinLodExporter::ProcessContext(SkinGroupExportContext& context) const - { - if (context.m_phase != Phase::Filling) - { - return SceneEvents::ProcessingResult::Ignored; - } - - AZStd::shared_ptr lodRule = context.m_group.GetRuleContainerConst().FindFirstByType(); - if (!lodRule) - { - return SceneEvents::ProcessingResult::Ignored; - } - - SceneEvents::ProcessingResultCombiner result; - - for (size_t index = 0; index < lodRule->GetLodCount(); ++index) - { - AZ_TraceContext("Skin lod level", static_cast(index)); - - AZStd::string filename = SceneUtil::FileUtilities::CreateOutputFileName( - context.m_group.GetName() + "_LOD" + AZStd::to_string(static_cast(index + 1)), context.m_outputDirectory, s_fileExtension); - - AZ_TraceContext("Skin lod filename", filename); - - if (filename.empty() || !SceneUtil::FileUtilities::EnsureTargetFolderExists(filename)) - { - AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Invalid file name for skin"); - result += SceneEvents::ProcessingResult::Failure; - break; - } - - CContentCGF cgfContent(filename.c_str()); - ConfigureSkinContent(cgfContent); - // Process mesh - // For each selected mesh, find its skinned skeleton's root bone. Make sure the root bone is consistent through all selected skin meshes. - const SceneContainer::SceneGraph& graph = context.m_scene.GetGraph(); - AZStd::vector targetNodes = SceneUtil::SceneGraphSelector::GenerateTargetNodes(graph, - lodRule->GetSceneNodeSelectionList(index), SceneUtil::SceneGraphSelector::IsMesh); - result += ProcessSkins(context, cgfContent, targetNodes); - - if (m_assetWriter) - { - if (m_assetWriter->WriteSKIN(&cgfContent, m_convertContext, false)) - { - static const AZ::Data::AssetType skinnedMeshLodsAssetType("{58E5824F-C27B-46FD-AD48-865BA41B7A51}"); - // Using the same guid as the parent group/cgf as this needs to be a lod of that cgf. - // Setting the lod to index+1 as 0 means the base mesh and 1-6 are lod levels 0-5. - context.m_products.AddProduct(AZStd::move(filename), context.m_group.GetId(), skinnedMeshLodsAssetType, index + 1, AZStd::nullopt); - } - else - { - AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Writing Skin has failed."); - result += SceneEvents::ProcessingResult::Failure; - break; - } - } - else - { - AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "No asset writer found. Unable to write skin to disk"); - result += SceneEvents::ProcessingResult::Failure; - break; - } - } - return result.GetResult(); - } - } // namespace RC -} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinLodExporter.h b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinLodExporter.h deleted file mode 100644 index e6116e02c8..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinLodExporter.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include - -struct IConvertContext; -class CContentCGF; - -namespace AZ -{ - namespace RC - { - struct SkinGroupExportContext; - - namespace SceneEvents = AZ::SceneAPI::Events; - - class SkinLodExporter - : public SceneEvents::CallProcessorBinder - { - public: - SkinLodExporter(IAssetWriter* writer, IConvertContext* convertContext); - ~SkinLodExporter() override = default; - - SceneEvents::ProcessingResult ProcessContext(SkinGroupExportContext& context) const; - - static const AZStd::string s_fileExtension; - - protected: - IAssetWriter* m_assetWriter; - IConvertContext* m_convertContext; - }; - } // namespace RC -} // namespace AZ \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinUtils.cpp b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinUtils.cpp deleted file mode 100644 index a88badcfdf..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinUtils.cpp +++ /dev/null @@ -1,194 +0,0 @@ - - -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include // Needed for CGFContent.h -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace AZ -{ - namespace RC - { - void ConfigureSkinContent(CContentCGF& content) - { - CExportInfoCGF* exportInfo = content.GetExportInfo(); - - exportInfo->bMergeAllNodes = true; - exportInfo->bUseCustomNormals = false; - exportInfo->bCompiledCGF = false; - exportInfo->bHavePhysicsProxy = false; - exportInfo->bHaveAutoLods = false; - exportInfo->bNoMesh = true; - exportInfo->b8WeightsPerVertex = false; - exportInfo->bWantF32Vertices = false; - exportInfo->authorToolVersion = 1; - } - - void MergeToFirstNodeMesh(CContentCGF& content) - { - AZ_Assert(content.GetNodeCount() > 0, "Skin Mesh has no node to merge"); - if (content.GetNodeCount() == 0) - { - return; - } - CMesh* mergedMesh = content.GetNode(0)->pMesh; - AZ_Assert(mergedMesh, "Failed to retrieve merged mesh for content root node"); - if (!mergedMesh) - { - return; - } - for (size_t nodeIndex = 0; nodeIndex < content.GetNodeCount(); ++nodeIndex) - { - CNodeCGF* node = content.GetNode(nodeIndex); - AZ_Assert(node, "Failed to retrieve node at index %i", nodeIndex); - if (!node) - { - continue; - } - if (!node->bIdentityMatrix) - { - AZ_Assert(node->pMesh, "No mesh node set on CGF node at index %i", nodeIndex); - if (!node->pMesh) - { - continue; - } - for (size_t vertexIndex = 0; vertexIndex < node->pMesh->GetVertexCount(); ++vertexIndex) - { - node->pMesh->m_pPositions[vertexIndex] = node->worldTM.TransformPoint(node->pMesh->m_pPositions[vertexIndex]); - node->pMesh->m_pNorms[vertexIndex].RotateSafelyBy(node->worldTM); - } - } - if (nodeIndex > 0) - { - mergedMesh->Append(*node->pMesh); - - // Keep color stream in sync size with vertex/normals stream. Reference to CGFNodeMerger::MergeNodes - if (mergedMesh->m_streamSize[CMesh::COLORS][0] > 0 && mergedMesh->m_streamSize[CMesh::COLORS][0] < mergedMesh->GetVertexCount()) - { - int colorCount = mergedMesh->m_streamSize[CMesh::COLORS][0]; - mergedMesh->ReallocStream(CMesh::COLORS, 0, mergedMesh->GetVertexCount()); - memset(mergedMesh->m_pColor0 + colorCount, 255, (mergedMesh->GetVertexCount() - colorCount) * sizeof(SMeshColor)); - } - } - } - - // We already used the transform during merge, so clear it out - content.GetNode(0)->worldTM.SetIdentity(); - } - - void RemoveRedundantNodes(CContentCGF& content) - { - while (content.GetNodeCount() > 1) - { - CNodeCGF* deleteNode = content.GetNode(content.GetNodeCount() - 1); - content.RemoveNode(deleteNode); - } - } - - SceneAPI::Events::ProcessingResult ProcessSkins(SkinGroupExportContext& context, CContentCGF& content, AZStd::vector& targetNodes) - { - namespace SceneEvents = SceneAPI::Events; - - if (targetNodes.empty()) - { - AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "No nodes selected for mesh exporting."); - return SceneEvents::ProcessingResult::Ignored; - } - - SceneEvents::ProcessingResultCombiner result; - - ContainerExportContext containerContext(context.m_scene, context.m_outputDirectory, context.m_group, content, Phase::Construction); - result += SceneEvents::Process(containerContext); - result += SceneEvents::Process(containerContext, Phase::Filling); - - const EPhysicsGeomType physicalizeType = PHYS_GEOM_TYPE_NONE; - AZStd::string rootBoneName; - const SceneAPI::Containers::SceneGraph& graph = context.m_scene.GetGraph(); - - AZStd::string currentRootBoneName; - for (const AZStd::string& nodeName : targetNodes) - { - AZ_TraceContext("Skin mesh", nodeName); - - SceneAPI::Containers::SceneGraph::NodeIndex index = graph.Find(nodeName.c_str()); - if (index.IsValid()) - { - // Pick the target skeleton from the first node, then make sure all the remaining meshes are referencing the same skeleton - // as the skins need to merged to a single mesh at the end. - SceneEvents::ProcessingResult rootNameResult = SceneEvents::Process(currentRootBoneName, context.m_scene, index); - if (rootNameResult != SceneEvents::ProcessingResult::Success || currentRootBoneName.empty()) - { - AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Selected skin has no weight data."); - continue; - } - - if (rootBoneName.empty()) - { - rootBoneName = currentRootBoneName; - // The skeleton has been established so fill up the skinning information for it as there's still - // a strong link between skin and skeleton. - SceneEvents::ProcessingResult skinInfoResult = SceneEvents::Process( - *content.GetSkinningInfo(), context.m_scene, rootBoneName); - if (skinInfoResult != SceneEvents::ProcessingResult::Success) - { - // Without the skinning info further processing will cause a crash so early out here. - AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Unable to link bones to skin."); - return SceneEvents::ProcessingResult::Failure; - } - } - else if (rootBoneName != currentRootBoneName) - { - AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Skin doesn't belong to the same skeleton as the rest of the meshes in the group."); - continue; - } - - CNodeCGF* node = new CNodeCGF(); // will be auto deleted by CContentCGF cgf - SetNodeName(nodeName, *node); - result += SceneAPI::Events::Process(containerContext, *node, nodeName, index, physicalizeType, rootBoneName, Phase::Construction); - result += SceneAPI::Events::Process(containerContext, *node, nodeName, index, physicalizeType, rootBoneName, Phase::Filling); - content.AddNode(node); - result += SceneAPI::Events::Process(containerContext, *node, nodeName, index, physicalizeType, rootBoneName, Phase::Finalizing); - - currentRootBoneName.clear(); - } - } - - if (content.GetNodeCount() > 0) - { - // CharacterCompiler expects all skin sub-meshes to be merged and stored in a single CNodeCGF - MergeToFirstNodeMesh(content); - result += SceneAPI::Events::Process(containerContext, Phase::Finalizing); - RemoveRedundantNodes(content); - } - else - { - AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "No valid skin information found that could be added to this container."); - result += SceneAPI::Events::Process(containerContext, Phase::Finalizing); - } - - return result.GetResult(); - } - } -} \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinUtils.h b/Code/Tools/RC/ResourceCompilerScene/Skin/SkinUtils.h deleted file mode 100644 index 9c9b3123c0..0000000000 --- a/Code/Tools/RC/ResourceCompilerScene/Skin/SkinUtils.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include - -class CContentCGF; -struct CNodeCGF; - -namespace AZ -{ - namespace RC - { - struct SkinGroupExportContext; - void ConfigureSkinContent(CContentCGF& content); - void MergeToFirstNodeMesh(CContentCGF& content); - void RemoveRedundantNodes(CContentCGF& content); - AZ::SceneAPI::Events::ProcessingResult ProcessSkins(SkinGroupExportContext& context, CContentCGF& content, AZStd::vector& targetNodes); - } // namespace RC -} // namespace AZ \ No newline at end of file diff --git a/Code/Tools/RC/ResourceCompilerScene/resourcecompilerscene_files.cmake b/Code/Tools/RC/ResourceCompilerScene/resourcecompilerscene_files.cmake index 30b035cd81..7ec21afee6 100644 --- a/Code/Tools/RC/ResourceCompilerScene/resourcecompilerscene_files.cmake +++ b/Code/Tools/RC/ResourceCompilerScene/resourcecompilerscene_files.cmake @@ -52,20 +52,4 @@ set(FILES Cgf/CgfExporter.cpp Cgf/CgfUtils.h Cgf/CgfUtils.cpp - Chr/ChrExportContexts.h - Chr/ChrExportContexts.cpp - Chr/ChrGroupExporter.h - Chr/ChrGroupExporter.cpp - Chr/ChrExporter.h - Chr/ChrExporter.cpp - Skin/SkinExportContexts.h - Skin/SkinExportContexts.cpp - Skin/SkinGroupExporter.h - Skin/SkinGroupExporter.cpp - Skin/SkinLodExporter.h - Skin/SkinLodExporter.cpp - Skin/SkinExporter.h - Skin/SkinExporter.cpp - Skin/SkinUtils.h - Skin/SkinUtils.cpp ) diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp index 0b677f80d9..64314dc081 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -38,8 +39,10 @@ namespace AZ namespace FbxSceneBuilder { const char* AssImpAnimationImporter::s_animationNodeName = "animation"; - const FbxSDKWrapper::FbxTimeWrapper::TimeMode AssImpAnimationImporter::s_defaultTimeMode = - FbxSDKWrapper::FbxTimeWrapper::frames30; + + // Downstream only supports 30 frames per second sample rate. Adjusting to 60 doubles the + // length of the animations, they still play back at 30 frames per second. + const double AssImpAnimationImporter::s_defaultTimeStepSampleRate = 1.0 / 30.0; AssImpAnimationImporter::AssImpAnimationImporter() { @@ -51,7 +54,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class()->Version(1); + serializeContext->Class()->Version(2); // [LYN-2281] Skinned mesh loading fixes } } @@ -115,13 +118,13 @@ namespace AZ } // These variables are named using AssImp naming convention for consistency - unsigned int mNumPositionKeys{}; + AZ::u32 mNumPositionKeys{}; aiVectorKey* mPositionKeys{}; - unsigned int mNumRotationKeys{}; + AZ::u32 mNumRotationKeys{}; aiQuatKey* mRotationKeys{}; - unsigned int mNumScalingKeys{}; + AZ::u32 mNumScalingKeys{}; aiVectorKey* mScalingKeys{}; AZStd::vector m_ownedPositionKeys{}; @@ -156,7 +159,6 @@ namespace AZ return AZStd::make_pair(animation, anim); } - Events::ProcessingResult AssImpAnimationImporter::ImportAnimation(AssImpSceneNodeAppendedContext& context) { AZ_TraceContext("Importer", "Animation"); @@ -181,11 +183,11 @@ namespace AZ // all the animations for a given node // In the case of bone animations, the data is copied into a ConsolidatedNodeAnim so we can // do fix-ups later without affecting the original data - auto mapAnimationsFunc = [](unsigned numChannels, auto** channels, const aiAnimation* animation, auto& map) + auto mapAnimationsFunc = [](AZ::u32 numChannels, auto** channels, const aiAnimation* animation, auto& map) { map.reserve(numChannels); - for (unsigned channelIndex = 0; channelIndex < numChannels; ++channelIndex) + for (AZ::u32 channelIndex = 0; channelIndex < numChannels; ++channelIndex) { auto* nodeAnim = channels[channelIndex]; AZStd::string name = GetName(nodeAnim); @@ -194,13 +196,13 @@ namespace AZ } }; - for (unsigned animIndex = 0; animIndex < scene->mNumAnimations; ++animIndex) + for (AZ::u32 animIndex = 0; animIndex < scene->mNumAnimations; ++animIndex) { const aiAnimation* animation = scene->mAnimations[animIndex]; mapAnimationsFunc(animation->mNumChannels, animation->mChannels, animation, boneAnimations); - for (unsigned channelIndex = 0; channelIndex < animation->mNumMorphMeshChannels; ++channelIndex) + for (AZ::u32 channelIndex = 0; channelIndex < animation->mNumMorphMeshChannels; ++channelIndex) { auto* nodeAnim = animation->mMorphMeshChannels[channelIndex]; AZStd::string name = GetName(nodeAnim); @@ -280,7 +282,7 @@ namespace AZ } Events::ProcessingResultCombiner combinedAnimationResult; - for (unsigned meshIndex = 0; meshIndex < currentNode->mNumMeshes; ++meshIndex) + for (AZ::u32 meshIndex = 0; meshIndex < currentNode->mNumMeshes; ++meshIndex) { aiMesh* mesh = scene->mMeshes[currentNode->mMeshes[meshIndex]]; @@ -321,7 +323,7 @@ namespace AZ DataTypes::MatrixType localTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(combinedTransform); context.m_sourceSceneSystem.SwapTransformForUpAxis(localTransform); context.m_sourceSceneSystem.ConvertUnit(localTransform); - for (unsigned time = 0; time <= animation->mDuration; ++time) + for (AZ::u32 time = 0; time <= animation->mDuration; ++time) { createdAnimationData->AddKeyFrame(localTransform); } @@ -408,15 +410,8 @@ namespace AZ anim->mNumPositionKeys, anim->mNumRotationKeys, anim->mNumScalingKeys); return Events::ProcessingResult::Failure; } - - unsigned numAnimationKeys = anim->mNumPositionKeys; - - if (numAnimationKeys <= 1) - { - numAnimationKeys = AZStd::GetMax(anim->mNumRotationKeys, anim->mNumScalingKeys); - } - - auto sampleKeyFrame = [](const auto& keys, unsigned numKeys, double time) + + auto sampleKeyFrame = [](const auto& keys, AZ::u32 numKeys, double time, AZ::u32& lastIndex) { AZ_Error("AnimationImporter", numKeys > 0, "Animation key set must have at least 1 key"); @@ -427,9 +422,10 @@ namespace AZ auto returnValue = keys[0].mValue; - for (unsigned keyIndex = 0; keyIndex < numKeys; ++keyIndex) + for (AZ::u32 keyIndex = lastIndex; keyIndex < numKeys; ++keyIndex) { const auto& key = keys[keyIndex]; + lastIndex = keyIndex; // We want to return the key that exactly matches the time if possible, otherwise we'll keep track of the previous time // If we don't find an exact match and end up going past the desired time (or run out of keyframes) then we return the previous key @@ -437,7 +433,7 @@ namespace AZ { returnValue = key.mValue; } - else if (key.mTime == time) + else if (AZ::IsClose(key.mTime, time)) { return key.mValue; } @@ -450,16 +446,34 @@ namespace AZ return returnValue; }; + // Resample the animations at a fixed time step. This matches the behaviour of + // the previous SDK used. Longer term, this could be data driven, or based on the + // smallest time step between key frames. + // AssImp has an animation->mTicksPerSecond and animation->mDuration, but those + // are less predictable than just using a fixed time step. + const double duration = animation->mDuration / animation->mTicksPerSecond; + + AZ::u32 numKeyFrames = AZStd::max(AZStd::max(anim->mNumScalingKeys, anim->mNumPositionKeys), anim->mNumRotationKeys); + if (!AZ::IsClose(duration / s_defaultTimeStepSampleRate, numKeyFrames, 1)) + { + double dT = duration / s_defaultTimeStepSampleRate; + numKeyFrames = AZStd::ceilf(dT) + 1; // +1 because the animation is from [0, duration] - we have a keyframe at the end of the duration which needs to be included + } + AZStd::shared_ptr createdAnimationData = AZStd::make_shared(); - createdAnimationData->ReserveKeyFrames(animation->mDuration + 1); // +1 because we start at 0 and the last keyframe is at mDuration instead of mDuration-1 - createdAnimationData->SetTimeStepBetweenFrames(1.0 / animation->mTicksPerSecond); - - for (unsigned time = 0; time <= animation->mDuration; ++time) + createdAnimationData->ReserveKeyFrames(numKeyFrames); + createdAnimationData->SetTimeStepBetweenFrames(s_defaultTimeStepSampleRate); + + AZ::u32 lastScaleIndex = 0; + AZ::u32 lastPositionIndex = 0; + AZ::u32 lastRotationIndex = 0; + for (AZ::u32 frame = 0; frame < numKeyFrames; ++frame) { - auto scale = sampleKeyFrame(anim->mScalingKeys, anim->mNumScalingKeys, time); - auto position = sampleKeyFrame(anim->mPositionKeys, anim->mNumPositionKeys, time); - auto rotation = sampleKeyFrame(anim->mRotationKeys, anim->mNumRotationKeys, time); + double time = frame * s_defaultTimeStepSampleRate * animation->mTicksPerSecond; + aiVector3D scale = sampleKeyFrame(anim->mScalingKeys, anim->mNumScalingKeys, time, lastScaleIndex); + aiVector3D position = sampleKeyFrame(anim->mPositionKeys, anim->mNumPositionKeys, time, lastPositionIndex); + aiQuaternion rotation = sampleKeyFrame(anim->mRotationKeys, anim->mNumRotationKeys, time, lastRotationIndex); aiMatrix4x4 transform(scale, rotation, position); @@ -555,9 +569,9 @@ namespace AZ aiAnimMesh* aiAnimMesh = mesh->mAnimMeshes[meshIdx]; AZStd::string_view nodeName(aiAnimMesh->mName.C_Str()); - const unsigned maxKeys = keys.size(); - unsigned keyIdx = 0; - for (unsigned time = 0; time <= animation->mDuration; ++time) + const AZ::u32 maxKeys = keys.size(); + AZ::u32 keyIdx = 0; + for (AZ::u32 time = 0; time <= animation->mDuration; ++time) { if (keyIdx < maxKeys - 1 && time >= keys[keyIdx+1].m_time) { diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.h index cd9cca825f..72180dea1a 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.h @@ -45,9 +45,10 @@ namespace AZ const aiMeshMorphAnim* meshMorphAnim, const aiMesh* mesh); + static const double s_defaultTimeStepSampleRate; + protected: static const char* s_animationNodeName; - static const FbxSDKWrapper::FbxTimeWrapper::TimeMode s_defaultTimeMode; }; } // namespace FbxSceneBuilder } // namespace SceneAPI diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBitangentStreamImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBitangentStreamImporter.cpp index 5c146a14d8..b5bcab31e6 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBitangentStreamImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBitangentStreamImporter.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class()->Version(1); + serializeContext->Class()->Version(2); // LYN-2576 } } @@ -56,15 +57,13 @@ namespace AZ aiNode* currentNode = context.m_sourceNode.GetAssImpNode(); const aiScene* scene = context.m_sourceScene.GetAssImpScene(); - AZStd::shared_ptr parentData = - context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition); - if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid())) + GetMeshDataFromParentResult meshDataResult(GetMeshDataFromParent(context)); + if (!meshDataResult.IsSuccess()) { - AZ_Error(Utilities::ErrorWindow, false, - "Tried to construct bitangent stream attribute for invalid or non-mesh parent data"); - return Events::ProcessingResult::Failure; + return meshDataResult.GetError(); } - const SceneData::GraphData::MeshData* const parentMeshData = azrtti_cast(parentData.get()); + const SceneData::GraphData::MeshData* const parentMeshData(meshDataResult.GetValue()); + size_t vertexCount = parentMeshData->GetVertexCount(); int sdkMeshIndex = parentMeshData->GetSdkMeshIndex(); diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBlendShapeImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBlendShapeImporter.cpp index d49f80988c..71b77225fd 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBlendShapeImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpBlendShapeImporter.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -43,7 +44,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class()->Version(1); + serializeContext->Class()->Version(3); // LYN-2576 } } @@ -68,13 +69,24 @@ namespace AZ return Events::ProcessingResult::Ignored; } + GetMeshDataFromParentResult meshDataResult(GetMeshDataFromParent(context)); + if (!meshDataResult.IsSuccess()) + { + return meshDataResult.GetError(); + } + const SceneData::GraphData::MeshData* const parentMeshData(meshDataResult.GetValue()); + int parentMeshIndex = parentMeshData->GetSdkMeshIndex(); + Events::ProcessingResultCombiner combinedBlendShapeResult; - for (int meshIdx = 0; meshIdx < numMesh; meshIdx++) + for (int nodeMeshIdx = 0; nodeMeshIdx < numMesh; nodeMeshIdx++) { - int meshId = context.m_sourceNode.GetAssImpNode()->mMeshes[meshIdx]; - aiMesh* aiMesh = context.m_sourceScene.GetAssImpScene()->mMeshes[meshId]; - if (!aiMesh->mNumAnimMeshes) + int sceneMeshIdx = context.m_sourceNode.GetAssImpNode()->mMeshes[nodeMeshIdx]; + const aiMesh* aiMesh = context.m_sourceScene.GetAssImpScene()->mMeshes[sceneMeshIdx]; + + // Each mesh gets its own node in the scene graph, so only generate + // morph targets for the current mesh. + if (parentMeshIndex != nodeMeshIdx || !aiMesh->mNumAnimMeshes) { continue; } @@ -96,9 +108,22 @@ namespace AZ int firstMeshVertexIndex = -1; int previousMeshVertexIndex = -1; - int verticesInMeshFace = 0; + AZStd::bitset uvSetUsedFlags; + for (AZ::u8 uvSetIndex = 0; uvSetIndex < SceneData::GraphData::BlendShapeData::MaxNumUVSets; ++uvSetIndex) + { + uvSetUsedFlags.set(uvSetIndex, aiAnimMesh->HasTextureCoords(uvSetIndex)); + } + AZStd::bitset colorSetUsedFlags; + for (AZ::u8 colorSetIndex = 0; colorSetIndex < SceneData::GraphData::BlendShapeData::MaxNumColorSets; + ++colorSetIndex) + { + colorSetUsedFlags.set(colorSetIndex, aiAnimMesh->HasVertexColors(colorSetIndex)); + } + blendShapeData->ReserveData( + aiAnimMesh->mNumVertices, aiAnimMesh->HasTangentsAndBitangents(), uvSetUsedFlags, colorSetUsedFlags); + for (int vertIdx = 0; vertIdx < aiAnimMesh->mNumVertices; ++vertIdx) { AZ::Vector3 vertex(AssImpSDKWrapper::AssImpTypeConverter::ToVector3(aiAnimMesh->mVertices[vertIdx])); @@ -106,7 +131,7 @@ namespace AZ context.m_sourceSceneSystem.SwapVec3ForUpAxis(vertex); context.m_sourceSceneSystem.ConvertUnit(vertex); - + // Add normals AZ::Vector3 normal; if (aiAnimMesh->HasNormals()) { @@ -116,6 +141,39 @@ namespace AZ } blendShapeData->AddVertex(vertex, normal); blendShapeData->SetVertexIndexToControlPointIndexMap(vertIdx, vertIdx); + + // Add tangents and bitangents + if (aiAnimMesh->HasTangentsAndBitangents()) + { + // Vector4's constructor that takes in a vector3 sets w to 1.0f automatically. + const AZ::Vector4 tangent(AssImpSDKWrapper::AssImpTypeConverter::ToVector3(aiAnimMesh->mTangents[vertIdx])); + const AZ::Vector3 bitangent = AssImpSDKWrapper::AssImpTypeConverter::ToVector3(aiAnimMesh->mBitangents[vertIdx]); + blendShapeData->AddTangentAndBitangent(tangent, bitangent); + } + + // Add UVs + for (AZ::u8 uvSetIdx = 0; uvSetIdx < SceneData::GraphData::BlendShapeData::MaxNumUVSets; ++uvSetIdx) + { + if (aiAnimMesh->HasTextureCoords(uvSetIdx)) + { + const AZ::Vector2 vertexUV( + aiAnimMesh->mTextureCoords[uvSetIdx][vertIdx].x, + // The engine's V coordinate is reverse of how it's stored in assImp. + 1.0f - aiAnimMesh->mTextureCoords[uvSetIdx][vertIdx].y); + blendShapeData->AddUV(vertexUV, uvSetIdx); + } + } + + // Add colors + for (AZ::u8 colorSetIdx = 0; colorSetIdx < SceneData::GraphData::BlendShapeData::MaxNumColorSets; ++colorSetIdx) + { + if (aiAnimMesh->HasVertexColors(colorSetIdx)) + { + SceneAPI::DataTypes::Color color = + AssImpSDKWrapper::AssImpTypeConverter::ToColor(aiAnimMesh->mColors[colorSetIdx][vertIdx]); + blendShapeData->AddColor(color, colorSetIdx); + } + } } // aiAnimMesh just has a list of positions for vertices. The face indices are on the original mesh. diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpColorStreamImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpColorStreamImporter.cpp index 25add385c4..55c14fd5d7 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpColorStreamImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpColorStreamImporter.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class()->Version(1); + serializeContext->Class()->Version(2); // LYN-2576 } } @@ -56,15 +57,13 @@ namespace AZ aiNode* currentNode = context.m_sourceNode.GetAssImpNode(); const aiScene* scene = context.m_sourceScene.GetAssImpScene(); - AZStd::shared_ptr parentData = - context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition); - if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid())) + GetMeshDataFromParentResult meshDataResult(GetMeshDataFromParent(context)); + if (!meshDataResult.IsSuccess()) { - AZ_Error(Utilities::ErrorWindow, false, - "Tried to construct color stream attribute for invalid or non-mesh parent data"); - return Events::ProcessingResult::Failure; + return meshDataResult.GetError(); } - const SceneData::GraphData::MeshData* const parentMeshData = azrtti_cast(parentData.get()); + const SceneData::GraphData::MeshData* const parentMeshData(meshDataResult.GetValue()); + size_t vertexCount = parentMeshData->GetVertexCount(); int sdkMeshIndex = parentMeshData->GetSdkMeshIndex(); diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpMaterialImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpMaterialImporter.cpp index ba23ff7522..a63c2406f4 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpMaterialImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpMaterialImporter.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpSkinWeightsImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpSkinWeightsImporter.cpp index f72d7ccd6d..bcfbaa9624 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpSkinWeightsImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpSkinWeightsImporter.cpp @@ -16,8 +16,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -41,7 +43,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class()->Version(1); + serializeContext->Class()->Version(3); // LYN-2576 } } @@ -57,11 +59,29 @@ namespace AZ return Events::ProcessingResult::Ignored; } + GetMeshDataFromParentResult meshDataResult(GetMeshDataFromParent(context)); + if (!meshDataResult.IsSuccess()) + { + return meshDataResult.GetError(); + } + const SceneData::GraphData::MeshData* const parentMeshData(meshDataResult.GetValue()); + + int parentMeshIndex = parentMeshData->GetSdkMeshIndex(); + Events::ProcessingResultCombiner combinedSkinWeightsResult; - for(unsigned m = 0; m < currentNode->mNumMeshes; ++m) + for(unsigned nodeMeshIndex = 0; nodeMeshIndex < currentNode->mNumMeshes; ++nodeMeshIndex) { - auto mesh = scene->mMeshes[currentNode->mMeshes[m]]; + if (nodeMeshIndex != parentMeshIndex) + { + // Only generate skinning data for the parent mesh. + // Each AssImp mesh is assigned to a unique node, + // so the skinning data should be generated as a child node + // for the associated parent mesh. + continue; + } + int sceneMeshIndex = currentNode->mMeshes[nodeMeshIndex]; + const aiMesh* mesh = scene->mMeshes[sceneMeshIndex]; // Don't create this until a bone with weights is encountered Containers::SceneGraph::NodeIndex weightsIndexForMesh; @@ -80,7 +100,7 @@ namespace AZ if (!weightsIndexForMesh.IsValid()) { skinWeightName = s_skinWeightName; - skinWeightName += AZStd::to_string(m); + skinWeightName += AZStd::to_string(nodeMeshIndex); RenamedNodesMap::SanitizeNodeName(skinWeightName, context.m_scene.GetGraph(), context.m_currentGraphPosition); weightsIndexForMesh = diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTangentStreamImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTangentStreamImporter.cpp index 87a647447a..88177a04a0 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTangentStreamImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpTangentStreamImporter.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class()->Version(1); + serializeContext->Class()->Version(2); // LYN-2576 } } @@ -56,15 +57,13 @@ namespace AZ aiNode* currentNode = context.m_sourceNode.GetAssImpNode(); const aiScene* scene = context.m_sourceScene.GetAssImpScene(); - AZStd::shared_ptr parentData = - context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition); - if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid())) + GetMeshDataFromParentResult meshDataResult(GetMeshDataFromParent(context)); + if (!meshDataResult.IsSuccess()) { - AZ_Error(Utilities::ErrorWindow, false, - "Tried to construct tangent stream attribute for invalid or non-mesh parent data"); - return Events::ProcessingResult::Failure; + return meshDataResult.GetError(); } - const SceneData::GraphData::MeshData* const parentMeshData = azrtti_cast(parentData.get()); + const SceneData::GraphData::MeshData* const parentMeshData(meshDataResult.GetValue()); + size_t vertexCount = parentMeshData->GetVertexCount(); int sdkMeshIndex = parentMeshData->GetSdkMeshIndex(); diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp index ea54a5fc78..6dca863329 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -43,7 +44,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class()->Version(1); + serializeContext->Class()->Version(2); // LYN-2576 } } @@ -57,16 +58,14 @@ namespace AZ aiNode* currentNode = context.m_sourceNode.GetAssImpNode(); const aiScene* scene = context.m_sourceScene.GetAssImpScene(); - AZStd::shared_ptr parentData = - context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition); - if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid())) + GetMeshDataFromParentResult meshDataResult(GetMeshDataFromParent(context)); + if (!meshDataResult.IsSuccess()) { - AZ_Error(Utilities::ErrorWindow, false, - "Tried to construct uv stream attribute for invalid or non-mesh parent data"); - return Events::ProcessingResult::Failure; + return meshDataResult.GetError(); } - const SceneData::GraphData::MeshData* const parentMeshData = - azrtti_cast(parentData.get()); + const SceneData::GraphData::MeshData* const parentMeshData(meshDataResult.GetValue()); + int parentMeshIndex = parentMeshData->GetSdkMeshIndex(); + size_t vertexCount = parentMeshData->GetVertexCount(); int sdkMeshIndex = parentMeshData->GetSdkMeshIndex(); diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.cpp index 50456d563c..59821336e0 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.cpp @@ -15,9 +15,11 @@ #include #include #include +#include #include #include #include +#include #include namespace AZ::SceneAPI::FbxSceneBuilder @@ -95,4 +97,34 @@ namespace AZ::SceneAPI::FbxSceneBuilder return true; } + + GetMeshDataFromParentResult GetMeshDataFromParent(AssImpSceneNodeAppendedContext& context) + { + const DataTypes::IGraphObject* const parentData = + context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition).get(); + + if (!parentData) + { + AZ_Error(Utilities::ErrorWindow, false, + "GetMeshDataFromParent failed because the parent was null, it should only be called with a valid parent node"); + return AZ::Failure(Events::ProcessingResult::Failure); + } + + if (!parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid())) + { + // The parent node may contain bone information and not mesh information, skip it. + if (parentData->RTTI_IsTypeOf(SceneData::GraphData::BoneData::TYPEINFO_Uuid())) + { + // Return the ignore processing result in the failure. + return AZ::Failure(Events::ProcessingResult::Ignored); + } + AZ_Error(Utilities::ErrorWindow, false, + "Tried to get mesh data from parent for non-mesh parent data"); + return AZ::Failure(Events::ProcessingResult::Failure); + } + + const SceneData::GraphData::MeshData* const parentMeshData = + azrtti_cast(parentData); + return AZ::Success(parentMeshData); + } } diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h index 8606749cd8..c0b5c044cb 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h @@ -12,6 +12,8 @@ #pragma once +#include + struct aiNode; struct aiScene; @@ -37,12 +39,16 @@ namespace AZ { class IGraphObject; } - + struct AssImpSceneNodeAppendedContext; class FbxSceneSystem; + namespace FbxSceneBuilder { bool BuildSceneMeshFromAssImpMesh(aiNode* currentNode, const aiScene* scene, const FbxSceneSystem& sceneSystem, AZStd::vector>& meshes, const AZStd::function()>& makeMeshFunc); + + typedef AZ::Outcome GetMeshDataFromParentResult; + GetMeshDataFromParentResult GetMeshDataFromParent(AssImpSceneNodeAppendedContext& context); } } } diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/SceneUtilities.cpp b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/SceneUtilities.cpp new file mode 100644 index 0000000000..f5bb9d28a6 --- /dev/null +++ b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/SceneUtilities.cpp @@ -0,0 +1,100 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace SceneAPI + { + namespace Utilities + { + DataTypes::MatrixType ConcatenateMatricesUpwards(const Containers::SceneGraph& graph, Containers::SceneGraph::NodeIndex nodeIndex) + { + DataTypes::MatrixType outTransform = DataTypes::MatrixType::Identity(); + while (nodeIndex.IsValid()) + { + auto view = Containers::Views::MakeSceneGraphChildView(graph, nodeIndex, graph.GetContentStorage().begin(), true); + auto result = AZStd::find_if(view.begin(), view.end(), Containers::DerivedTypeFilter()); + if (result != view.end()) + { + // Check if the node has any child transform node + const DataTypes::MatrixType& azTransform = azrtti_cast(result->get())->GetMatrix(); + outTransform = azTransform * outTransform; + } + else + { + // Check if the node itself is a transform node. + AZStd::shared_ptr transformData = azrtti_cast(graph.GetNodeContent(nodeIndex)); + if (transformData) + { + outTransform = transformData->GetMatrix() * outTransform; + } + } + + if (graph.HasNodeParent(nodeIndex)) + { + nodeIndex = graph.GetNodeParent(nodeIndex); + } + else + { + break; + } + } + + return outTransform; + } + + SCENE_CORE_API DataTypes::MatrixType DetermineWorldTransform(const Containers::Scene& scene, const Containers::SceneGraph::NodeIndex nodeIndex, const Containers::RuleContainer& ruleContainer) + { + auto coordinateSystemRule = ruleContainer.FindFirstByType(); + if (coordinateSystemRule && coordinateSystemRule->GetUseAdvancedData()) + { + SceneAPI::DataTypes::MatrixType matrix = SceneAPI::DataTypes::MatrixType::CreateIdentity(); + if (coordinateSystemRule->GetTranslation() != Vector3(0.0f, 0.0f, 0.0f) || !coordinateSystemRule->GetRotation().IsIdentity()) + { + matrix = DataTypes::MatrixType::CreateFromQuaternionAndTranslation(coordinateSystemRule->GetRotation(), coordinateSystemRule->GetTranslation()); + } + if (coordinateSystemRule->GetScale() != 1.0f) + { + float scale = coordinateSystemRule->GetScale(); + matrix.MultiplyByScale(Vector3(scale, scale, scale)); + } + if (!coordinateSystemRule->GetOriginNodeName().empty()) + { + auto rootIndex = scene.GetGraph().Find(coordinateSystemRule->GetOriginNodeName()); + if (rootIndex.IsValid()) + { + auto worldMatrix = ConcatenateMatricesUpwards(scene.GetGraph(), rootIndex); + worldMatrix.InvertFull(); + matrix *= worldMatrix; + } + } + return matrix; + } + return ConcatenateMatricesUpwards(scene.GetGraph(), nodeIndex); + } + } // Utilities + } // SceneAPI +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/SceneUtilities.h b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/SceneUtilities.h new file mode 100644 index 0000000000..2a2bd200a7 --- /dev/null +++ b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/SceneUtilities.h @@ -0,0 +1,35 @@ +#pragma once + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include + +namespace AZ +{ + namespace SceneAPI + { + namespace Containers + { + class Scene; + class RuleContainer; + } + namespace Utilities + { + SCENE_CORE_API DataTypes::MatrixType DetermineWorldTransform( + const Containers::Scene& scene, + const Containers::SceneGraph::NodeIndex nodeIndex, + const Containers::RuleContainer& ruleContainer); + } // Utilities + } // SceneAPI +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/Views/SceneGraphDownwardsIterator.inl b/Code/Tools/SceneAPI/SceneCore/Containers/Views/SceneGraphDownwardsIterator.inl index aa0a189d1c..2acdddf48e 100644 --- a/Code/Tools/SceneAPI/SceneCore/Containers/Views/SceneGraphDownwardsIterator.inl +++ b/Code/Tools/SceneAPI/SceneCore/Containers/Views/SceneGraphDownwardsIterator.inl @@ -125,7 +125,7 @@ namespace AZ template void SceneGraphDownwardsIterator::IgnoreNodeDescendants() { - m_ignoreDescendants = true; + m_ignoreDescendants = -1; } template diff --git a/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/ICoordinateSystemRule.h b/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/ICoordinateSystemRule.h index fe97608551..bab67c54b3 100644 --- a/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/ICoordinateSystemRule.h +++ b/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/ICoordinateSystemRule.h @@ -43,5 +43,12 @@ namespace AZ::SceneAPI::DataTypes virtual CoordinateSystem GetTargetCoordinateSystem() const = 0; virtual const CoordinateSystemConverter& GetCoordinateSystemConverter() const = 0; + + // advanced coordinate settings + virtual bool GetUseAdvancedData() const = 0; + virtual const AZStd::string& GetOriginNodeName() const = 0; + virtual const Quaternion& GetRotation() const = 0; + virtual const Vector3& GetTranslation() const = 0; + virtual float GetScale() const = 0; }; } // namespace AZ::SceneAPI::DataTypes diff --git a/Code/Tools/SceneAPI/SceneCore/DllMain.cpp b/Code/Tools/SceneAPI/SceneCore/DllMain.cpp index 85b18eab8d..49cea83dff 100644 --- a/Code/Tools/SceneAPI/SceneCore/DllMain.cpp +++ b/Code/Tools/SceneAPI/SceneCore/DllMain.cpp @@ -144,6 +144,7 @@ namespace AZ if (context && (context->IsRemovingReflection() || !context->FindClassData(AZ::SceneAPI::DataTypes::IGroup::TYPEINFO_Uuid()))) { AZ::SceneAPI::DataTypes::IManifestObject::Reflect(context); + AZ::SceneAPI::Events::CallProcessorBinder::Reflect(context); // Register components AZ::SceneAPI::SceneCore::BehaviorComponent::Reflect(context); AZ::SceneAPI::SceneCore::LoadingComponent::Reflect(context); diff --git a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.cpp b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.cpp index 83c033006d..2193cfcca8 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.cpp @@ -10,6 +10,7 @@ * */ +#include #include namespace AZ @@ -48,6 +49,14 @@ namespace AZ m_bindings.clear(); } + void CallProcessorBinder::Reflect(AZ::ReflectContext* context) + { + SerializeContext* serializeContext = azrtti_cast(context); + if (serializeContext) + { + serializeContext->Class()->Version(1); + } + } } // namespace Events } // namespace SceneAPI } // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.h b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.h index 5e0a8a62b8..661526cab6 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.h +++ b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBinder.h @@ -20,6 +20,8 @@ namespace AZ { + class ReflectContext; + namespace SceneAPI { namespace Events @@ -55,6 +57,8 @@ namespace AZ CallProcessorBinder() = default; SCENE_CORE_API virtual ~CallProcessorBinder(); + static void Reflect(AZ::ReflectContext* context); + protected: CallProcessorBinder(const CallProcessorBinder&) = delete; @@ -133,4 +137,4 @@ namespace AZ } // namespace SceneAPI } // namespace AZ -#include \ No newline at end of file +#include diff --git a/Code/Tools/SceneAPI/SceneCore/scenecore_files.cmake b/Code/Tools/SceneAPI/SceneCore/scenecore_files.cmake index 0ca5fac8b4..e169f74a80 100644 --- a/Code/Tools/SceneAPI/SceneCore/scenecore_files.cmake +++ b/Code/Tools/SceneAPI/SceneCore/scenecore_files.cmake @@ -94,6 +94,8 @@ set(FILES Containers/Utilities/ProxyPointer.inl Containers/Utilities/Filters.h Containers/Utilities/Filters.inl + Containers/Utilities/SceneUtilities.h + Containers/Utilities/SceneUtilities.cpp Containers/Utilities/SceneGraphUtilities.h Containers/Utilities/SceneGraphUtilities.inl Containers/Utilities/SceneGraphUtilities.cpp diff --git a/Code/Tools/SceneAPI/SceneData/Behaviors/ScriptProcessorRuleBehavior.cpp b/Code/Tools/SceneAPI/SceneData/Behaviors/ScriptProcessorRuleBehavior.cpp index 8a74d9e5c2..7fbbb9e758 100644 --- a/Code/Tools/SceneAPI/SceneData/Behaviors/ScriptProcessorRuleBehavior.cpp +++ b/Code/Tools/SceneAPI/SceneData/Behaviors/ScriptProcessorRuleBehavior.cpp @@ -53,19 +53,19 @@ namespace AZ //////////////////////////////////////////////////////////////////////////////////////////// // AzToolsFramework::EditorPythonConsoleNotifications - void OnTraceMessage(AZStd::string_view message) override + void OnTraceMessage([[maybe_unused]] AZStd::string_view message) override { using namespace AZ::SceneAPI::Utilities; AZ_TracePrintf(LogWindow, "%.*s \n", AZ_STRING_ARG(message)); } - void OnErrorMessage(AZStd::string_view message) override + void OnErrorMessage([[maybe_unused]] AZStd::string_view message) override { using namespace AZ::SceneAPI::Utilities; AZ_TracePrintf(ErrorWindow, "[ERROR] %.*s \n", AZ_STRING_ARG(message)); } - void OnExceptionMessage(AZStd::string_view message) override + void OnExceptionMessage([[maybe_unused]] AZStd::string_view message) override { using namespace AZ::SceneAPI::Utilities; AZ_TracePrintf(ErrorWindow, "[EXCEPTION] %.*s \n", AZ_STRING_ARG(message)); diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp index 121d80f948..e9b2ebaf4c 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp +++ b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp @@ -30,6 +30,61 @@ namespace AZ return static_cast(m_positions.size()-1); } + void BlendShapeData::AddTangentAndBitangent(const Vector4& tangent, const Vector3& bitangent) + { + m_tangents.push_back(tangent); + m_bitangents.push_back(bitangent); + } + + void BlendShapeData::AddUV(const Vector2& uv, AZ::u8 uvSetIndex) + { + if (uvSetIndex >= MaxNumUVSets) + { + AZ_ErrorOnce("SceneGraphData", false, "uvSetIndex %zu is greater or equal than the maximum uv sets %zu.", uvSetIndex, MaxNumUVSets); + return; + } + m_uvs[uvSetIndex].push_back(uv); + } + + void BlendShapeData::AddColor(const SceneAPI::DataTypes::Color& color, AZ::u8 colorSetIndex) + { + if (colorSetIndex >= MaxNumColorSets) + { + AZ_ErrorOnce("SceneGraphData", false, "colorSetIndex %zu is greater or equal than the maximum color sets %zu.", colorSetIndex, MaxNumColorSets); + return; + } + m_colors[colorSetIndex].push_back(color); + } + + void BlendShapeData::ReserveData( + unsigned int numVertices, bool reserveTangents, const AZStd::bitset& uvSetUsedFlags, + const AZStd::bitset& colorSetUsedFlags) + { + m_positions.reserve(numVertices); + m_normals.reserve(numVertices); + if (reserveTangents) + { + m_tangents.reserve(numVertices); + m_bitangents.reserve(numVertices); + } + + for (AZ::u8 uvSetIndex = 0; uvSetIndex < MaxNumUVSets; ++uvSetIndex) + { + if (uvSetUsedFlags[uvSetIndex]) + { + m_uvs[uvSetIndex].reserve(numVertices); + } + } + + for (AZ::u8 colorSetIndex = 0; colorSetIndex < MaxNumColorSets; ++colorSetIndex) + { + if (colorSetUsedFlags[colorSetIndex]) + { + m_colors[colorSetIndex].reserve(numVertices); + } + } + } + void BlendShapeData::AddFace(const Face& face) { m_faces.push_back(face); @@ -47,7 +102,7 @@ namespace AZ int BlendShapeData::GetControlPointIndex(int vertexIndex) const { auto iter = m_vertexIndexToControlPointIndexMap.find(vertexIndex); - AZ_Assert(iter != m_vertexIndexToControlPointIndexMap.end(), "Vertex index %i doesn't exist", vertexIndex); + AZ_Assert(iter != m_vertexIndexToControlPointIndexMap.end(), "Vertex index %i doesn't exist.", vertexIndex); // Note: AZStd::unordered_map's operator [] doesn't have const version... return iter->second; } @@ -92,6 +147,45 @@ namespace AZ return m_normals[index]; } + const Vector2& BlendShapeData::GetUV(unsigned int vertexIndex, unsigned int uvSetIndex) const + { + AZ_Assert(uvSetIndex < MaxNumUVSets, "uvSet index out of range"); + AZ_Assert(vertexIndex < m_uvs[uvSetIndex].size(), "uvSet index out of range"); + return m_uvs[uvSetIndex][vertexIndex]; + } + + AZStd::vector& BlendShapeData::GetTangents() + { + return m_tangents; + } + + const AZStd::vector& BlendShapeData::GetTangents() const + { + return m_tangents; + } + + AZStd::vector& BlendShapeData::GetBitangents() + { + return m_bitangents; + } + + const AZStd::vector& BlendShapeData::GetBitangents() const + { + return m_bitangents; + } + + const AZStd::vector& BlendShapeData::GetUVs(AZ::u8 uvSetIndex) const + { + AZ_Assert(uvSetIndex < MaxNumUVSets, "uvSet index out of range"); + return m_uvs[uvSetIndex]; + } + + const AZStd::vector& BlendShapeData::GetColors(AZ::u8 colorSetIndex) const + { + AZ_Assert(colorSetIndex < MaxNumColorSets, "colorSet index out of range"); + return m_colors[colorSetIndex]; + } + unsigned int BlendShapeData::GetFaceVertexIndex(unsigned int face, unsigned int vertexIndex) const { AZ_Assert(face < m_faces.size(), "GetFaceVertexPositionIndex face index not in range"); diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h index cbf4c15bbc..b9c48507ac 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h +++ b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h @@ -16,6 +16,7 @@ #include #include #include +#include #include namespace AZ @@ -30,8 +31,19 @@ namespace AZ public: AZ_RTTI(BlendShapeData, "{FF875C22-2E4F-4CE3-BA49-09BF78C70A09}", SceneAPI::DataTypes::IBlendShapeData) + // Maximum number of color sets matches limitation set in assImp (AI_MAX_NUMBER_OF_COLOR_SETS) + static constexpr AZ::u8 MaxNumColorSets = 8; + // Maximum number of uv sets matches limitation set in assImp (AI_MAX_NUMBER_OF_TEXTURECOORDS) + static constexpr AZ::u8 MaxNumUVSets = 8; + SCENE_DATA_API ~BlendShapeData() override; SCENE_DATA_API virtual unsigned int AddVertex(const Vector3& position, const Vector3& normal); + SCENE_DATA_API void AddTangentAndBitangent(const Vector4& tangent, const Vector3& bitangent); + SCENE_DATA_API void AddUV(const Vector2& uv, AZ::u8 uvSetIndex); + SCENE_DATA_API void AddColor(const SceneAPI::DataTypes::Color& color, AZ::u8 colorSetIndex); + SCENE_DATA_API void ReserveData( + unsigned int numVertices, bool reserveTangents, const AZStd::bitset& uvSetUsedFlags, + const AZStd::bitset& colorSetUsedFlags); //assume consistent winding - no stripping or fanning expected (3 index per face) SCENE_DATA_API virtual void AddFace(const Face& face); @@ -48,6 +60,14 @@ namespace AZ SCENE_DATA_API const Vector3& GetPosition(unsigned int index) const override; SCENE_DATA_API const Vector3& GetNormal(unsigned int index) const override; + SCENE_DATA_API const Vector2& GetUV(unsigned int vertexIndex, unsigned int uvSetIndex) const; + + SCENE_DATA_API AZStd::vector& GetTangents(); + SCENE_DATA_API const AZStd::vector& GetTangents() const; + SCENE_DATA_API AZStd::vector& GetBitangents(); + SCENE_DATA_API const AZStd::vector& GetBitangents() const; + SCENE_DATA_API const AZStd::vector& GetUVs(AZ::u8 uvSetIndex) const; + SCENE_DATA_API const AZStd::vector& GetColors(AZ::u8 colorSetIndex) const; SCENE_DATA_API unsigned int GetFaceVertexIndex(unsigned int face, unsigned int vertexIndex) const override; @@ -56,6 +76,11 @@ namespace AZ protected: AZStd::vector m_positions; AZStd::vector m_normals; + AZStd::vector m_tangents; + AZStd::vector m_bitangents; + AZStd::vector m_uvs[MaxNumUVSets]; + AZStd::vector m_colors[MaxNumColorSets]; + AZStd::vector m_faces; AZStd::unordered_map m_vertexIndexToControlPointIndexMap; diff --git a/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.cpp b/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.cpp index a2c15eebe8..6c457cf94b 100644 --- a/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.cpp +++ b/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.cpp @@ -30,49 +30,56 @@ namespace AZ::SceneAPI::SceneData void CoordinateSystemRule::UpdateCoordinateSystemConverter() { - switch (m_targetCoordinateSystem) + if (m_useAdvancedData) { - case ZUpPositiveYForward: + m_coordinateSystemConverter = {}; + } + else + { + switch (m_targetCoordinateSystem) { - // Source coordinate system, use identity for now, which will currently just assume LY's coordinate system. - const AZ::Vector3 sourceBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f), - AZ::Vector3( 0.0f, 1.0f, 0.0f), - AZ::Vector3( 0.0f, 0.0f, 1.0f) }; + case ZUpPositiveYForward: + { + // Source coordinate system, use identity for now, which will currently just assume LY's coordinate system. + const AZ::Vector3 sourceBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f), + AZ::Vector3( 0.0f, 1.0f, 0.0f), + AZ::Vector3( 0.0f, 0.0f, 1.0f) }; - // The target coordinate system, with X and Y inverted (rotate 180 degrees over Z) - const AZ::Vector3 targetBasisVectors[3] = { AZ::Vector3(-1.0f, 0.0f, 0.0f), - AZ::Vector3( 0.0f,-1.0f, 0.0f), - AZ::Vector3( 0.0f, 0.0f, 1.0f) }; + // The target coordinate system, with X and Y inverted (rotate 180 degrees over Z) + const AZ::Vector3 targetBasisVectors[3] = { AZ::Vector3(-1.0f, 0.0f, 0.0f), + AZ::Vector3( 0.0f,-1.0f, 0.0f), + AZ::Vector3( 0.0f, 0.0f, 1.0f) }; - // X, Y and Z are all at the same indices inside the target coordinate system, compared to the source coordinate system. - const AZ::u32 targetBasisIndices[3] = { 0, 1, 2 }; + // X, Y and Z are all at the same indices inside the target coordinate system, compared to the source coordinate system. + const AZ::u32 targetBasisIndices[3] = { 0, 1, 2 }; - m_coordinateSystemConverter = CoordinateSystemConverter::CreateFromBasisVectors(sourceBasisVectors, targetBasisVectors, targetBasisIndices); - } - break; + m_coordinateSystemConverter = CoordinateSystemConverter::CreateFromBasisVectors(sourceBasisVectors, targetBasisVectors, targetBasisIndices); + } + break; - case ZUpNegativeYForward: - { - // Source coordinate system, use identity for now, which will currently just assume LY's coordinate system. - const AZ::Vector3 sourceBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f), - AZ::Vector3( 0.0f, 1.0f, 0.0f), - AZ::Vector3( 0.0f, 0.0f, 1.0f) }; + case ZUpNegativeYForward: + { + // Source coordinate system, use identity for now, which will currently just assume LY's coordinate system. + const AZ::Vector3 sourceBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f), + AZ::Vector3( 0.0f, 1.0f, 0.0f), + AZ::Vector3( 0.0f, 0.0f, 1.0f) }; - // The target coordinate system, which is the same as the source, so basically we won't do anything here. - const AZ::Vector3 targetBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f), - AZ::Vector3( 0.0f, 1.0f, 0.0f), - AZ::Vector3( 0.0f, 0.0f, 1.0f) }; + // The target coordinate system, which is the same as the source, so basically we won't do anything here. + const AZ::Vector3 targetBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f), + AZ::Vector3( 0.0f, 1.0f, 0.0f), + AZ::Vector3( 0.0f, 0.0f, 1.0f) }; - // X, Y and Z are all at the same indices inside the target coordinate system, compared to the source coordinate system. - const AZ::u32 targetBasisIndices[3] = { 0, 1, 2 }; + // X, Y and Z are all at the same indices inside the target coordinate system, compared to the source coordinate system. + const AZ::u32 targetBasisIndices[3] = { 0, 1, 2 }; - m_coordinateSystemConverter = CoordinateSystemConverter::CreateFromBasisVectors(sourceBasisVectors, targetBasisVectors, targetBasisIndices); - } - break; + m_coordinateSystemConverter = CoordinateSystemConverter::CreateFromBasisVectors(sourceBasisVectors, targetBasisVectors, targetBasisIndices); + } + break; - default: - AZ_Assert(false, "Unsupported coordinate system conversion"); - }; + default: + AZ_Assert(false, "Unsupported coordinate system conversion"); + }; + } } void CoordinateSystemRule::SetTargetCoordinateSystem(CoordinateSystem targetCoordinateSystem) @@ -94,22 +101,74 @@ namespace AZ::SceneAPI::SceneData return; } - serializeContext->Class()->Version(1) - ->Field("targetCoordinateSystem", &CoordinateSystemRule::m_targetCoordinateSystem); + serializeContext->Class()->Version(2) // LYN-2442 + ->Field("targetCoordinateSystem", &CoordinateSystemRule::m_targetCoordinateSystem) + ->Field("useAdvancedData", &CoordinateSystemRule::m_useAdvancedData) + ->Field("originNodeName", &CoordinateSystemRule::m_originNodeName) + ->Field("rotation", &CoordinateSystemRule::m_rotation) + ->Field("translation", &CoordinateSystemRule::m_translation) + ->Field("scale", &CoordinateSystemRule::m_scale); AZ::EditContext* editContext = serializeContext->GetEditContext(); if (editContext) { - editContext->Class("Coordinate system change", "Modify the target coordinate system, applying a transformation to all data (transforms and vertex data if it exists).") + editContext->Class("Coordinate system change", + "Modify the target coordinate system, applying a transformation to all data (transforms and vertex data if it exists).") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "") - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &CoordinateSystemRule::m_targetCoordinateSystem, "Facing direction", "Change the direction the actor/motion will face by applying a post transformation to the data.") + ->DataElement(AZ::Edit::UIHandlers::Default, &CoordinateSystemRule::m_useAdvancedData, + "Use Advanced Settings", + "Toggles on the advanced settings for transforming the mesh group.") + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) + ->DataElement(AZ::Edit::UIHandlers::ComboBox, &CoordinateSystemRule::m_targetCoordinateSystem, + "Facing direction", + "Change the direction the actor/motion will face by applying a post transformation to the data.") ->EnumAttribute(CoordinateSystem::ZUpNegativeYForward, "Do nothing") - ->EnumAttribute(CoordinateSystem::ZUpPositiveYForward, "Rotate 180 degrees around the up axis"); + ->EnumAttribute(CoordinateSystem::ZUpPositiveYForward, "Rotate 180 degrees around the up axis") + ->Attribute(AZ::Edit::Attributes::Visibility, &CoordinateSystemRule::GetBasicVisibility) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ->DataElement("NodeListSelection", &CoordinateSystemRule::m_originNodeName, + "Relative Origin Node", + "Select a Node from the scene as the origin for this export.") + ->Attribute("DisabledOption", "") + ->Attribute("DefaultToDisabled", false) + ->Attribute("ExcludeEndPoints", true) + ->Attribute(AZ::Edit::Attributes::Visibility, &CoordinateSystemRule::GetAdvancedVisibility) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) + ->DataElement(AZ::Edit::UIHandlers::Default, &CoordinateSystemRule::m_translation, + "Translation", + "Moves the group along the given vector.") + ->Attribute(AZ::Edit::Attributes::Visibility, &CoordinateSystemRule::GetAdvancedVisibility) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ->DataElement(AZ::Edit::UIHandlers::Default, &CoordinateSystemRule::m_rotation, + "Rotation", + "Sets the orientation offset of the processed mesh in degrees. Rotates the group after translation.") + ->Attribute(Edit::Attributes::LabelForX, "P") + ->Attribute(Edit::Attributes::LabelForY, "R") + ->Attribute(Edit::Attributes::LabelForZ, "Y") + ->Attribute(AZ::Edit::Attributes::Visibility, &CoordinateSystemRule::GetAdvancedVisibility) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ->DataElement(AZ::Edit::UIHandlers::Default, &CoordinateSystemRule::m_scale, + "Scale", + "Sets the scale offset of the processed mesh.") + ->Attribute(Edit::Attributes::Min, 0.0001) + ->Attribute(Edit::Attributes::Max, 1000.0) + ->Attribute(AZ::Edit::Attributes::Visibility, &CoordinateSystemRule::GetAdvancedVisibility) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues); } } + AZ::Crc32 CoordinateSystemRule::GetBasicVisibility() const + { + return (m_useAdvancedData) ? AZ::Edit::PropertyVisibility::Hide : AZ::Edit::PropertyVisibility::Show; + } + + AZ::Crc32 CoordinateSystemRule::GetAdvancedVisibility() const + { + return (m_useAdvancedData) ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; + } + bool CoordinateSystemRule::ConvertLegacyCoordinateSystemRule(AZ::SerializeContext& serializeContext, AZ::SerializeContext::DataElementNode& classElement) { @@ -155,4 +214,54 @@ namespace AZ::SceneAPI::SceneData return true; } + + bool CoordinateSystemRule::GetUseAdvancedData() const + { + return m_useAdvancedData; + } + + void CoordinateSystemRule::SetUseAdvancedData(bool useAdvancedData) + { + m_useAdvancedData = useAdvancedData; + } + + const AZStd::string& CoordinateSystemRule::GetOriginNodeName() const + { + return m_originNodeName; + } + + void CoordinateSystemRule::SetOriginNodeName(const AZStd::string& originNodeName) + { + m_originNodeName = originNodeName; + } + + const Quaternion& CoordinateSystemRule::GetRotation() const + { + return m_rotation; + } + + void CoordinateSystemRule::SetRotation(const Quaternion& rotation) + { + m_rotation = rotation; + } + + const Vector3& CoordinateSystemRule::GetTranslation() const + { + return m_translation; + } + + void CoordinateSystemRule::SetTranslation(const Vector3& translation) + { + m_translation = translation; + } + + float CoordinateSystemRule::GetScale() const + { + return m_scale; + } + + void CoordinateSystemRule::SetScale(float scale) + { + m_scale = scale; + } } // namespace AZ::SceneAPI::SceneData diff --git a/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.h b/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.h index e8db6ea5ef..ddd4471632 100644 --- a/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.h +++ b/Code/Tools/SceneAPI/SceneData/Rules/CoordinateSystemRule.h @@ -39,12 +39,34 @@ namespace AZ::SceneAPI::SceneData SCENE_DATA_API const CoordinateSystemConverter& GetCoordinateSystemConverter() const override { return m_coordinateSystemConverter; } - static void Reflect(AZ::ReflectContext* context); + SCENE_DATA_API static void Reflect(AZ::ReflectContext* context); SCENE_DATA_API static bool ConvertLegacyCoordinateSystemRule(AZ::SerializeContext& serializeContext, AZ::SerializeContext::DataElementNode& classElement); + // advanced coordinate settings + SCENE_DATA_API bool GetUseAdvancedData() const override; + SCENE_DATA_API void SetUseAdvancedData(bool useAdvancedData); + SCENE_DATA_API const AZStd::string& GetOriginNodeName() const override; + SCENE_DATA_API void SetOriginNodeName(const AZStd::string& originNodeName); + SCENE_DATA_API const Quaternion& GetRotation() const override; + SCENE_DATA_API void SetRotation(const Quaternion& rotation); + SCENE_DATA_API const Vector3& GetTranslation() const override; + SCENE_DATA_API void SetTranslation(const Vector3& translation); + SCENE_DATA_API float GetScale() const override; + SCENE_DATA_API void SetScale(float scale); + protected: + AZ::Crc32 GetBasicVisibility() const; + AZ::Crc32 GetAdvancedVisibility() const; + CoordinateSystemConverter m_coordinateSystemConverter; CoordinateSystem m_targetCoordinateSystem; + + // advanced coordinate settings + bool m_useAdvancedData = false; + AZStd::string m_originNodeName; + AZ::Quaternion m_rotation = AZ::Quaternion::CreateIdentity(); + AZ::Vector3 m_translation = AZ::Vector3::CreateZero(); + float m_scale = 1.0f; }; } // namespace AZ::SceneAPI::SceneData diff --git a/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp b/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp index 782dc0f6a0..17a1b0d19a 100644 --- a/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp +++ b/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include @@ -87,6 +87,7 @@ namespace AZ AZ::SceneAPI::RegisterDataTypeReflection(m_serializeContext.get()); AZ::SceneAPI::Containers::SceneManifest::Reflect(m_serializeContext.get()); AZ::SceneAPI::DataTypes::IManifestObject::Reflect(m_serializeContext.get()); + m_serializeContext->Class()->Version(1); AZ::SceneAPI::MockRotationRule::Reflect(m_serializeContext.get()); m_jsonRegistrationContext = AZStd::make_unique(); @@ -174,5 +175,53 @@ namespace AZ EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(0.27)")); EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(0.65)")); } + + TEST_F(SceneManifest_JSON, LoadFromString_CoordinateSystemRule_ReturnsTrue) + { + AZ::SceneAPI::SceneData::CoordinateSystemRule foo; + EXPECT_FALSE(foo.GetUseAdvancedData()); + + using namespace SceneAPI::Containers; + + constexpr const char* jsonCoordinateSystemRule = { R"JSON( + { + "values": [ + { + "$type": "CoordinateSystemRule", + "useAdvancedData": true, + "originNodeName": "test_origin_name", + "translation": [1.0, 2.0, 3.0], + "rotation": { "yaw" : 45.0, "pitch" : 18.5, "roll" : 215.0 }, + "scale": 10.0 + } + ] + })JSON" }; + + SceneManifest loaded; + auto loadFromStringResult = loaded.LoadFromString(jsonCoordinateSystemRule, m_serializeContext.get(), m_jsonRegistrationContext.get()); + EXPECT_TRUE(loadFromStringResult.IsSuccess()); + EXPECT_FALSE(loaded.IsEmpty()); + + auto writeToJsonResult = + SceneManifestContainer::SaveToJsonDocumentHelper(loaded, m_serializeContext.get(), m_jsonRegistrationContext.get()); + ASSERT_TRUE(writeToJsonResult.IsSuccess()); + + AZStd::string jsonText; + auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText); + ASSERT_TRUE(writeToStringResult.IsSuccess()); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("$type": "CoordinateSystemRule")")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("useAdvancedData": true,)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("originNodeName": "test_origin_name",)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("rotation": [)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(0.028)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(-0.40)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(0.85)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(-0.33)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("translation": [)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(1.0)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(2.0)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(3.0)")); + EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("scale": 10.0)")); + } } } diff --git a/Code/Tools/UniversalRemoteConsole/Readme.txt b/Code/Tools/UniversalRemoteConsole/Readme.txt deleted file mode 100644 index 4a5e284f6c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/Readme.txt +++ /dev/null @@ -1,89 +0,0 @@ -Universal Remote Console ------------------------- - -Important: for the tool to work properly, the configuration files -* filters.xml -* params.xml - -need to be in the same directoy where the .exe is found. - -The build process will copy these files in the correct directory. In case you accidentally delete them, -you can find these files in RemoteConsole/config-files. -Feel free to modify this files to your requirements. - - -================================ Overview ====================================== - -In a nutshell, this tool allows you to: -* connect remotely to the game (multiple platforms) and the editor -* process and filter the game's console output -* execute a macro or OS command when certain log is received -* execute CVars and macros, take videos, snapshots, ... -* process (offline) existing log files (drag & drop) [new!] -* modify in-game parameters while the game is running using sliders -* MIDI input devices supported (KORG at the moment) to execute macros and sliders -* MIDI input has the extra advantage of not requiring a change of focus in the application -* fully customisable via XML files that you can change the tool parameters on-the-fly. -* get some statistics - -Any comments/questions/requests, just let me know (Dario [dariop]) - -================ Filter Configuration Quick Guide ======================================= - File: filters.xml - -It needs to be located in the SAME DIRECTORY as the application. - - This file allows you to define your own filters and associated accions. - Feel free to add/remove/modify the contents of this file to suit your needs. - The initial content is intended to be an example of usage. - - How does this work? - - * - This attribute is used to specify the filter. In this example, any log that - contains the word "Example" will be added to this filter's tab. - - * - This parameter is optional. If included it will be used to label the filter Tab. - Otherwise, the "Name" attribute in Filter will be used. - - * FF0000 - Optional. Specifies the color of the text in the filter. Format R8G8B8. - - * \!(\w*)\] - Optional. Specifies a regular expression to be used as filter. The given example - would would added to this filter's tab any log that contains something of the - kind "...!....]", i.e. has an exclamation mark and at certain point later a "]" - - * dir c: - Optional. Specifies an action to be taken if a particular filter is activated. - It can be used for instance to trigger a snapshot or a video when certain log - message is sent (e.g. a debugging message). - It can be very useful for debugging and QA. - There are two types of actions that can be executed: - + ScreenShot - Executes a Macro (in this case ScreenShot, defined in this file) - + dir c: - Executes a dos command (in this case "dir c:") - -================ Menu Configuration Quick Guide ======================================= - File: params.xml - -It needs to be located in the SAME DIRECTORY as the application. - -This file defines the menu of the applciation. You can add: -* Targets (IPs of the devices you want to connect to) -* Macros (set of CVars you want to sent at once to the game) -* GamePlay-specific commands (e.g. SetViewMode:FlyOn) -* Buttons (Macros that are places as separate buttons) -* Sliders (Macros whose parameters change with the slider value) - -You can assign MIDI codes to each entry so they can be controlled via an external MIDI input. - -All this data will become part of your menu so you can customize what you really need. - - -... and some more stuff to be discovered :-) - -Cheers -Dario \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole.sln b/Code/Tools/UniversalRemoteConsole/RemoteConsole.sln deleted file mode 100644 index 06ca99907f..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole.sln +++ /dev/null @@ -1,41 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteConsole", "RemoteConsole\RemoteConsole.csproj", "{1C86D237-2FDE-4303-835F-4A4E1F17E0C5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|Any CPU.ActiveCfg = Debug|x86 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|Any CPU.Build.0 = Debug|x86 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|x64.ActiveCfg = Debug|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|x64.Build.0 = Debug|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|x86.ActiveCfg = Debug|x86 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Debug|x86.Build.0 = Debug|x86 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|Any CPU.ActiveCfg = Release|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|Any CPU.Build.0 = Release|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|Mixed Platforms.Build.0 = Release|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|x64.ActiveCfg = Release|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|x64.Build.0 = Release|x64 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|x86.ActiveCfg = Release|x86 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = RemoteConsole\RemoteConsole.csproj - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Common.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Common.cs deleted file mode 100644 index ad6b902904..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Common.cs +++ /dev/null @@ -1,128 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -using System; -using System.Collections.Generic; -using System.Text; - -namespace RemoteConsole -{ - public static class Common - { - public static readonly string FiltersFileFullPath = System.IO.Path.Combine( System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath), "filters.xml"); - public static readonly string MenusFileFullPath = System.IO.Path.Combine( System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath), "params.xml"); - public static readonly string IconsPath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + System.IO.Path.PathSeparator + "Icons" + System.IO.Path.PathSeparator; - public static T Clamp(this T val, T min, T max) where T : IComparable - { - Comparer comp = Comparer.Default; - if (comp.Compare(val, min) <= 0) return min; - else if (comp.Compare(val, max) >= 0) return max; - else return val; - } - - public static int AddImageFileToImageList(string path, System.Windows.Forms.ImageList imgList) - { - if (path != null) - { - System.IO.FileInfo fileInfo = new System.IO.FileInfo(path); - if (fileInfo.Exists) - { - System.Drawing.Image img = System.Drawing.Image.FromFile(path); - imgList.Images.Add(img); - return imgList.Images.Count - 1; - } - } - - return -1; - } - - public static bool IsRunningOnMono () - { - return Type.GetType ("Mono.Runtime") != null; - } - } - - public class CSettings - { - public enum EMode - { - eM_Full = 0, // Normal mode (connected to target) - eM_CommandsOnly, // Connected to target but not reading the log - eM_FileOnly, // Parse a file (not connected to target) - } - - public bool DebugMidi = false; - public EMode Mode = EMode.eM_Full; - } -} - -#if __MonoCS__ - -/** - * As of 2014/11/28, Mono lacks an implementation of System.Windows.Forms.DataVisualization.Charting.Chart. - * This code functions as a proxy to work around that. - */ -namespace System.Windows.Forms.DataVisualization.Charting -{ - /** - * Various System.Windows.Forms.DataVisualization.Charting.*Collection member methods throw NotImplemented on use. - * JunkCollection provides the same method interface with implicit conversion operators to avoid complicating code. - */ - public class JunkCollection : List - { - public static implicit operator ChartAreaCollection(JunkCollection list) - { - return new ChartAreaCollection (); - } - public static implicit operator LegendCollection(JunkCollection list) - { - return new LegendCollection (); - } - public static implicit operator SeriesCollection(JunkCollection list) - { - return new SeriesCollection (); - } - - static T s_value; - - public T this[string key] - { - get { return s_value; } - set { } - } - - public void Add(string ignore) - { - } - } - - public class Chart : System.Windows.Forms.Control, System.ComponentModel.ISupportInitialize - { - public ChartDashStyle BorderlineDashStyle; - public JunkCollection< ChartArea > ChartAreas = new JunkCollection< ChartArea > (); - public JunkCollection< Legend > Legends = new JunkCollection< Legend > (); - public JunkCollection< Series > Series = new JunkCollection< Series > (); - - #region System.ComponentModel.ISupportInitialize - public void BeginInit() - { - } - - public void EndInit() - { - } - #endregion - } -} - -#endif diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FilterFileReader.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FilterFileReader.cs deleted file mode 100644 index 524fa73f11..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FilterFileReader.cs +++ /dev/null @@ -1,139 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace RemoteConsole -{ - class FilterData - { - public string Tag { get; private set; } // tag to search for in the log string - public string RegExpText; // customize reg exp search - public string Label; // tab label - public EMessageType MsgType { get; private set; } // text type (error, warning, message...) - public List Execute { get; private set; } // Commands to Execute - public int TextColor = Convert.ToInt32("FFFFFF", 16); // White color by default - - public class Exec - { - public enum EExecType - { - eET_None = 0, - eET_Macro, - eET_DosCmd - } - - public Exec(string typeStr_, string cmd_) - { - string s = typeStr_.ToLower(); - if (s == "macro") - Type = EExecType.eET_Macro; - else if (s == "doscmd") - Type = EExecType.eET_DosCmd; - else - Type = EExecType.eET_None; - - Command = cmd_; - } - - public EExecType Type { get; private set; } - public string Command { get; private set; } - } - - public FilterData(string tabName_, EMessageType type) - { - this.Tag = tabName_; - this.Label = tabName_; - this.MsgType = type; - - Execute = new List(); - } - - public void AddExecCommand(Exec e) - { - if (e != null) - { - if (Execute.Find(x => x.Command.ToLower() == e.Command.ToLower()) == null) - { - Execute.Add(e); - } - } - } - } - - class FilterFileReader - { - public List CreateStandardFilters() - { - List filterDataList = new List(); - FilterData data = new FilterData("[*Error*]", EMessageType.eMT_Error); - data.Label = "Errors"; - data.TextColor = Convert.ToInt32("FF0000", 16); - filterDataList.Add(data); - data = new FilterData("[*Warnings*]", EMessageType.eMT_Warning); - data.Label = "Warnings"; - data.TextColor = Convert.ToInt32("0000FF", 16); - filterDataList.Add(data); - - return filterDataList; - } - - private int ExtractColor(string text) - { - Regex rx = new Regex("#?([0-9A-Fa-f]{6})"); - Match match = rx.Match(text); - if (match.Success && match.Groups.Count == 2) - { - string hexColor = match.Groups[1].Value; - return Convert.ToInt32(hexColor, 16); - } - return 0; - } - - public List GetXmlFilters(string path) - { - if (System.IO.File.Exists(path) == false) - { - return null; - } - - List filterDataList = new List(); - System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); - xd.Load(path); - System.Xml.XmlNodeList nodelist = xd.SelectNodes("/Filters/Filter"); - foreach (System.Xml.XmlNode node in nodelist) // for each node - { - FilterData filter = new FilterData(node.Attributes.GetNamedItem("Name").Value, EMessageType.eMT_Message); - System.Xml.XmlNode n = node.SelectSingleNode("Label"); - if (n != null) { filter.Label = n.InnerText; } - n = node.SelectSingleNode("Color"); - if (n != null) { filter.TextColor = ExtractColor(n.InnerText); } - n = node.SelectSingleNode("RegExp"); - if (n != null) { filter.RegExpText = n.InnerText; } - n = node.SelectSingleNode("Exec"); - if (n != null) - { - filter.AddExecCommand( - new FilterData.Exec(n.Attributes.GetNamedItem("Type").Value, - n.InnerText) - ); - } - - filterDataList.Add(filter); - } - return filterDataList; - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.Designer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.Designer.cs deleted file mode 100644 index bd3f608db3..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.Designer.cs +++ /dev/null @@ -1,844 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -namespace RemoteConsole -{ - partial class MainForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); - System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); - this.topToolStrip = new System.Windows.Forms.ToolStrip(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.cmsGraph = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); - this.logPanel = new System.Windows.Forms.Panel(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.tabControlTop = new System.Windows.Forms.TabControl(); - this.tabPage2 = new System.Windows.Forms.TabPage(); - this.logChart = new System.Windows.Forms.DataVisualization.Charting.Chart(); - this.contextMenuHistoryChart = new System.Windows.Forms.ContextMenuStrip(this.components); - this.historyChartViewMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.historyChartClear = new System.Windows.Forms.ToolStripMenuItem(); - this.tabFullLog = new System.Windows.Forms.TabPage(); - this.fullLogConsole = new System.Windows.Forms.RichTextBox(); - this.contextMenuTabs = new System.Windows.Forms.ContextMenuStrip(this.components); - this.actionSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.actionCopy = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.actionClear = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.actionClearAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.actionEditFiltersFile = new System.Windows.Forms.ToolStripMenuItem(); - this.lalala = new System.Windows.Forms.ToolStripTextBox(); - this.lalala2 = new System.Windows.Forms.ToolStripTextBox(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.panelHelp = new System.Windows.Forms.Panel(); - this.richTextBox1 = new System.Windows.Forms.RichTextBox(); - this.tabPageMidi = new System.Windows.Forms.TabPage(); - this.lvMidiLog = new System.Windows.Forms.ListView(); - this.cHNum = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.cHLog = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.cHChannel = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.chMode = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.chCode = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.chVelocity = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.tabControlFilters = new System.Windows.Forms.TabControl(); - this.commandPanel = new System.Windows.Forms.Panel(); - this.label1 = new System.Windows.Forms.Label(); - this.editInput = new System.Windows.Forms.TextBox(); - this.imgList = new System.Windows.Forms.ImageList(this.components); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.statusStrip1 = new System.Windows.Forms.StatusStrip(); - this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusLabelTarget = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusLabelIp = new System.Windows.Forms.ToolStripStatusLabel(); - this.labelSeparator = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLabel4 = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusLabelMode = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLabel5 = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusLabelMidi = new System.Windows.Forms.ToolStripStatusLabel(); - this.forceRightAlignment = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusMenuLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.menuStatusText = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusLabelFilters = new System.Windows.Forms.ToolStripStatusLabel(); - this.filtersTextStatus = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusConnectedImg = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusLabelConnected = new System.Windows.Forms.ToolStripStatusLabel(); - this.bottomPanel = new System.Windows.Forms.Panel(); - this.bodyPanel = new System.Windows.Forms.Panel(); - this.imgList32 = new System.Windows.Forms.ImageList(this.components); - this.topToolStrip.SuspendLayout(); - this.cmsGraph.SuspendLayout(); - this.logPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.tabControlTop.SuspendLayout(); - this.tabPage2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.logChart)).BeginInit(); - this.contextMenuHistoryChart.SuspendLayout(); - this.tabFullLog.SuspendLayout(); - this.contextMenuTabs.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.panelHelp.SuspendLayout(); - this.tabPageMidi.SuspendLayout(); - this.commandPanel.SuspendLayout(); - this.statusStrip1.SuspendLayout(); - this.bottomPanel.SuspendLayout(); - this.bodyPanel.SuspendLayout(); - this.SuspendLayout(); - // - // topToolStrip - // - this.topToolStrip.Dock = System.Windows.Forms.DockStyle.None; - this.topToolStrip.ImageScalingSize = new System.Drawing.Size(32, 32); - this.topToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripSeparator1}); - this.topToolStrip.Location = new System.Drawing.Point(3, 9); - this.topToolStrip.Name = "topToolStrip"; - this.topToolStrip.Size = new System.Drawing.Size(18, 25); - this.topToolStrip.TabIndex = 0; - this.topToolStrip.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.topToolStrip_ItemClicked); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); - // - // cmsGraph - // - this.cmsGraph.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem3}); - this.cmsGraph.Name = "contextMenuStrip1"; - this.cmsGraph.Size = new System.Drawing.Size(134, 26); - // - // toolStripMenuItem3 - // - this.toolStripMenuItem3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem3.Image"))); - this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(133, 22); - this.toolStripMenuItem3.Text = "Next Graph"; - // - // logPanel - // - this.logPanel.AutoSize = true; - this.logPanel.Controls.Add(this.splitContainer1); - this.logPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.logPanel.Location = new System.Drawing.Point(0, 0); - this.logPanel.Name = "logPanel"; - this.logPanel.Padding = new System.Windows.Forms.Padding(3); - this.logPanel.Size = new System.Drawing.Size(884, 503); - this.logPanel.TabIndex = 1; - // - // splitContainer1 - // - this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.Location = new System.Drawing.Point(3, 3); - this.splitContainer1.Name = "splitContainer1"; - this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.tabControlTop); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.tabControlFilters); - this.splitContainer1.Size = new System.Drawing.Size(878, 497); - this.splitContainer1.SplitterDistance = 204; - this.splitContainer1.TabIndex = 2; - // - // tabControlTop - // - this.tabControlTop.Controls.Add(this.tabPage2); - this.tabControlTop.Controls.Add(this.tabFullLog); - this.tabControlTop.Controls.Add(this.tabPage1); - this.tabControlTop.Controls.Add(this.tabPageMidi); - this.tabControlTop.Dock = System.Windows.Forms.DockStyle.Fill; - this.tabControlTop.Location = new System.Drawing.Point(0, 0); - this.tabControlTop.Name = "tabControlTop"; - this.tabControlTop.SelectedIndex = 0; - this.tabControlTop.Size = new System.Drawing.Size(874, 200); - this.tabControlTop.TabIndex = 2; - // - // tabPage2 - // - this.tabPage2.Controls.Add(this.logChart); - this.tabPage2.Location = new System.Drawing.Point(4, 22); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(866, 174); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "Chart"; - this.tabPage2.UseVisualStyleBackColor = true; - // - // logChart - // - this.logChart.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash; - chartArea1.Name = "ChartArea1"; - this.logChart.ChartAreas.Add(chartArea1); - this.logChart.ContextMenuStrip = this.contextMenuHistoryChart; - this.logChart.Dock = System.Windows.Forms.DockStyle.Fill; - legend1.Name = "Legend1"; - this.logChart.Legends.Add(legend1); - this.logChart.Location = new System.Drawing.Point(3, 3); - this.logChart.Name = "logChart"; - this.logChart.Size = new System.Drawing.Size(860, 168); - this.logChart.TabIndex = 16; - // - // contextMenuHistoryChart - // - this.contextMenuHistoryChart.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.historyChartViewMenu, - this.toolStripSeparator3, - this.historyChartClear}); - this.contextMenuHistoryChart.Name = "contextMenuStrip1"; - this.contextMenuHistoryChart.Size = new System.Drawing.Size(102, 54); - this.contextMenuHistoryChart.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuHistoryChart_Opening); - // - // historyChartViewMenu - // - this.historyChartViewMenu.Image = ((System.Drawing.Image)(resources.GetObject("historyChartViewMenu.Image"))); - this.historyChartViewMenu.Name = "historyChartViewMenu"; - this.historyChartViewMenu.Size = new System.Drawing.Size(101, 22); - this.historyChartViewMenu.Text = "View"; - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(98, 6); - // - // historyChartClear - // - this.historyChartClear.Image = ((System.Drawing.Image)(resources.GetObject("historyChartClear.Image"))); - this.historyChartClear.Name = "historyChartClear"; - this.historyChartClear.Size = new System.Drawing.Size(101, 22); - this.historyChartClear.Text = "Clear"; - this.historyChartClear.Click += new System.EventHandler(this.historyChartClear_Click); - // - // tabFullLog - // - this.tabFullLog.Controls.Add(this.fullLogConsole); - this.tabFullLog.Location = new System.Drawing.Point(4, 22); - this.tabFullLog.Name = "tabFullLog"; - this.tabFullLog.Padding = new System.Windows.Forms.Padding(3); - this.tabFullLog.Size = new System.Drawing.Size(866, 174); - this.tabFullLog.TabIndex = 0; - this.tabFullLog.Text = "Full Log"; - this.tabFullLog.UseVisualStyleBackColor = true; - // - // fullLogConsole - // - this.fullLogConsole.BackColor = System.Drawing.SystemColors.WindowText; - this.fullLogConsole.ContextMenuStrip = this.contextMenuTabs; - this.fullLogConsole.Dock = System.Windows.Forms.DockStyle.Fill; - this.fullLogConsole.ForeColor = System.Drawing.Color.Silver; - this.fullLogConsole.Location = new System.Drawing.Point(3, 3); - this.fullLogConsole.Name = "fullLogConsole"; - this.fullLogConsole.ReadOnly = true; - this.fullLogConsole.Size = new System.Drawing.Size(860, 168); - this.fullLogConsole.TabIndex = 0; - this.fullLogConsole.Text = ""; - // - // contextMenuTabs - // - this.contextMenuTabs.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.actionSelectAll, - this.actionCopy, - this.toolStripSeparator2, - this.actionClear, - this.toolStripSeparator4, - this.actionClearAll, - this.toolStripSeparator5, - this.actionEditFiltersFile, - this.lalala, - this.lalala2, - this.toolStripSeparator6}); - this.contextMenuTabs.Name = "contextMenuStrip1"; - this.contextMenuTabs.Size = new System.Drawing.Size(176, 188); - // - // actionSelectAll - // - this.actionSelectAll.Name = "actionSelectAll"; - this.actionSelectAll.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); - this.actionSelectAll.Size = new System.Drawing.Size(175, 22); - this.actionSelectAll.Text = "Select All"; - this.actionSelectAll.Click += new System.EventHandler(this.actionSelectAll_Click); - // - // actionCopy - // - this.actionCopy.Image = ((System.Drawing.Image)(resources.GetObject("actionCopy.Image"))); - this.actionCopy.Name = "actionCopy"; - this.actionCopy.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); - this.actionCopy.Size = new System.Drawing.Size(175, 22); - this.actionCopy.Text = "Copy"; - this.actionCopy.Click += new System.EventHandler(this.actionCopy_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(172, 6); - // - // actionClear - // - this.actionClear.Image = ((System.Drawing.Image)(resources.GetObject("actionClear.Image"))); - this.actionClear.Name = "actionClear"; - this.actionClear.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.actionClear.Size = new System.Drawing.Size(175, 22); - this.actionClear.Text = "Clear"; - this.actionClear.Click += new System.EventHandler(this.actionClear_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(172, 6); - // - // actionClearAll - // - this.actionClearAll.Image = ((System.Drawing.Image)(resources.GetObject("actionClearAll.Image"))); - this.actionClearAll.Name = "actionClearAll"; - this.actionClearAll.Size = new System.Drawing.Size(175, 22); - this.actionClearAll.Text = "Clear ALL Filters"; - this.actionClearAll.Click += new System.EventHandler(this.actionClearAll_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(172, 6); - // - // actionEditFiltersFile - // - this.actionEditFiltersFile.Image = ((System.Drawing.Image)(resources.GetObject("actionEditFiltersFile.Image"))); - this.actionEditFiltersFile.Name = "actionEditFiltersFile"; - this.actionEditFiltersFile.Size = new System.Drawing.Size(175, 22); - this.actionEditFiltersFile.Text = "-- Edit Filters File --"; - this.actionEditFiltersFile.Click += new System.EventHandler(this.actionEditFiltersFile_Click); - // - // lalala - // - this.lalala.Enabled = false; - this.lalala.Name = "lalala"; - this.lalala.Size = new System.Drawing.Size(100, 23); - this.lalala.Text = "PORT"; - // - // lalala2 - // - this.lalala2.Name = "lalala2"; - this.lalala2.Size = new System.Drawing.Size(100, 23); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(172, 6); - // - // tabPage1 - // - this.tabPage1.Controls.Add(this.panelHelp); - this.tabPage1.Location = new System.Drawing.Point(4, 22); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(866, 174); - this.tabPage1.TabIndex = 2; - this.tabPage1.Text = "About/Help"; - this.tabPage1.UseVisualStyleBackColor = true; - // - // panelHelp - // - this.panelHelp.Controls.Add(this.richTextBox1); - this.panelHelp.Dock = System.Windows.Forms.DockStyle.Fill; - this.panelHelp.Location = new System.Drawing.Point(3, 3); - this.panelHelp.Name = "panelHelp"; - this.panelHelp.Size = new System.Drawing.Size(860, 168); - this.panelHelp.TabIndex = 0; - // - // richTextBox1 - // - this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.richTextBox1.Location = new System.Drawing.Point(0, 0); - this.richTextBox1.Name = "richTextBox1"; - this.richTextBox1.ReadOnly = true; - this.richTextBox1.Size = new System.Drawing.Size(860, 168); - this.richTextBox1.TabIndex = 0; - this.richTextBox1.Text = resources.GetString("richTextBox1.Text"); - // - // tabPageMidi - // - this.tabPageMidi.Controls.Add(this.lvMidiLog); - this.tabPageMidi.Location = new System.Drawing.Point(4, 22); - this.tabPageMidi.Name = "tabPageMidi"; - this.tabPageMidi.Padding = new System.Windows.Forms.Padding(3); - this.tabPageMidi.Size = new System.Drawing.Size(866, 174); - this.tabPageMidi.TabIndex = 3; - this.tabPageMidi.Text = "Midi Debug"; - this.tabPageMidi.UseVisualStyleBackColor = true; - // - // lvMidiLog - // - this.lvMidiLog.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.cHNum, - this.cHLog, - this.cHChannel, - this.chMode, - this.chCode, - this.chVelocity}); - this.lvMidiLog.Dock = System.Windows.Forms.DockStyle.Fill; - this.lvMidiLog.Location = new System.Drawing.Point(3, 3); - this.lvMidiLog.Name = "lvMidiLog"; - this.lvMidiLog.Size = new System.Drawing.Size(860, 168); - this.lvMidiLog.TabIndex = 0; - this.lvMidiLog.UseCompatibleStateImageBehavior = false; - this.lvMidiLog.View = System.Windows.Forms.View.Details; - // - // cHNum - // - this.cHNum.Text = "#"; - // - // cHLog - // - this.cHLog.Text = "Log"; - this.cHLog.Width = 278; - // - // cHChannel - // - this.cHChannel.Text = "Channel"; - // - // chMode - // - this.chMode.Text = "Mode"; - // - // chCode - // - this.chCode.Text = "Code"; - // - // chVelocity - // - this.chVelocity.Text = "Vel"; - // - // tabControlFilters - // - this.tabControlFilters.Dock = System.Windows.Forms.DockStyle.Fill; - this.tabControlFilters.Location = new System.Drawing.Point(0, 0); - this.tabControlFilters.Name = "tabControlFilters"; - this.tabControlFilters.SelectedIndex = 0; - this.tabControlFilters.Size = new System.Drawing.Size(874, 285); - this.tabControlFilters.TabIndex = 1; - // - // commandPanel - // - this.commandPanel.AutoSize = true; - this.commandPanel.Controls.Add(this.label1); - this.commandPanel.Controls.Add(this.editInput); - this.commandPanel.Dock = System.Windows.Forms.DockStyle.Top; - this.commandPanel.Location = new System.Drawing.Point(0, 0); - this.commandPanel.MaximumSize = new System.Drawing.Size(0, 26); - this.commandPanel.MinimumSize = new System.Drawing.Size(0, 26); - this.commandPanel.Name = "commandPanel"; - this.commandPanel.Padding = new System.Windows.Forms.Padding(3); - this.commandPanel.Size = new System.Drawing.Size(884, 26); - this.commandPanel.TabIndex = 2; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(5, 7); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(92, 13); - this.label1.TabIndex = 1; - this.label1.Text = "Type a command:"; - // - // editInput - // - this.editInput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.editInput.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; - this.editInput.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; - this.editInput.BackColor = System.Drawing.Color.Black; - this.editInput.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.editInput.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); - this.editInput.Location = new System.Drawing.Point(103, 0); - this.editInput.Name = "editInput"; - this.editInput.Size = new System.Drawing.Size(6768, 23); - this.editInput.TabIndex = 0; - this.editInput.KeyUp += new System.Windows.Forms.KeyEventHandler(this.editInput_KeyUp); - // - // imgList - // - this.imgList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgList.ImageStream"))); - this.imgList.TransparentColor = System.Drawing.Color.Transparent; - this.imgList.Images.SetKeyName(0, "red.png"); - this.imgList.Images.SetKeyName(1, "green.png"); - this.imgList.Images.SetKeyName(2, "clear.png"); - this.imgList.Images.SetKeyName(3, "copy.png"); - this.imgList.Images.SetKeyName(4, "pc"); - this.imgList.Images.SetKeyName(6, "UnknownTarget"); - this.imgList.Images.SetKeyName(7, "videoClipRecord"); - this.imgList.Images.SetKeyName(8, "screenShoot"); - this.imgList.Images.SetKeyName(9, "PcMouseImg"); - this.imgList.Images.SetKeyName(10, "EditIpImg"); - this.imgList.Images.SetKeyName(11, "IpImg"); - this.imgList.Images.SetKeyName(12, "ModeFullImg"); - this.imgList.Images.SetKeyName(13, "ModeCmdImg"); - this.imgList.Images.SetKeyName(14, "ModeFileImg"); - this.imgList.Images.SetKeyName(15, "PortImg"); - this.imgList.Images.SetKeyName(16, "WinLogoImg16"); - this.imgList.Images.SetKeyName(17, "provo"); - // - // statusStrip1 - // - this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripStatusLabel2, - this.toolStripStatusLabel1, - this.statusLabelTarget, - this.statusLabelIp, - this.labelSeparator, - this.toolStripStatusLabel4, - this.statusLabelMode, - this.toolStripStatusLabel5, - this.statusLabelMidi, - this.forceRightAlignment, - this.statusMenuLabel, - this.menuStatusText, - this.statusLabelFilters, - this.filtersTextStatus, - this.toolStripStatusLabel3, - this.statusConnectedImg, - this.statusLabelConnected}); - this.statusStrip1.Location = new System.Drawing.Point(0, 26); - this.statusStrip1.Name = "statusStrip1"; - this.statusStrip1.Size = new System.Drawing.Size(884, 24); - this.statusStrip1.TabIndex = 3; - this.statusStrip1.Text = "statusStrip1"; - // - // toolStripStatusLabel2 - // - this.toolStripStatusLabel2.Name = "toolStripStatusLabel2"; - this.toolStripStatusLabel2.Size = new System.Drawing.Size(0, 19); - // - // toolStripStatusLabel1 - // - this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; - this.toolStripStatusLabel1.Size = new System.Drawing.Size(43, 19); - this.toolStripStatusLabel1.Text = "Target:"; - // - // statusLabelTarget - // - this.statusLabelTarget.Name = "statusLabelTarget"; - this.statusLabelTarget.Size = new System.Drawing.Size(54, 19); - this.statusLabelTarget.Text = "[Not Set]"; - // - // statusLabelIp - // - this.statusLabelIp.Name = "statusLabelIp"; - this.statusLabelIp.Size = new System.Drawing.Size(25, 19); - this.statusLabelIp.Text = "[IP]"; - // - // labelSeparator - // - this.labelSeparator.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right))); - this.labelSeparator.BorderStyle = System.Windows.Forms.Border3DStyle.Etched; - this.labelSeparator.Name = "labelSeparator"; - this.labelSeparator.Size = new System.Drawing.Size(4, 19); - // - // toolStripStatusLabel4 - // - this.toolStripStatusLabel4.Name = "toolStripStatusLabel4"; - this.toolStripStatusLabel4.Size = new System.Drawing.Size(41, 19); - this.toolStripStatusLabel4.Text = "Mode:"; - // - // statusLabelMode - // - this.statusLabelMode.ImageTransparentColor = System.Drawing.Color.Magenta; - this.statusLabelMode.Name = "statusLabelMode"; - this.statusLabelMode.Size = new System.Drawing.Size(38, 19); - this.statusLabelMode.Text = "Mode"; - // - // toolStripStatusLabel5 - // - this.toolStripStatusLabel5.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left; - this.toolStripStatusLabel5.BorderStyle = System.Windows.Forms.Border3DStyle.Etched; - this.toolStripStatusLabel5.Name = "toolStripStatusLabel5"; - this.toolStripStatusLabel5.Size = new System.Drawing.Size(38, 19); - this.toolStripStatusLabel5.Text = "Midi:"; - // - // statusLabelMidi - // - this.statusLabelMidi.Name = "statusLabelMidi"; - this.statusLabelMidi.Size = new System.Drawing.Size(118, 19); - this.statusLabelMidi.Text = "toolStripStatusLabel6"; - // - // forceRightAlignment - // - this.forceRightAlignment.Name = "forceRightAlignment"; - this.forceRightAlignment.Size = new System.Drawing.Size(177, 19); - this.forceRightAlignment.Spring = true; - // - // statusMenuLabel - // - this.statusMenuLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left; - this.statusMenuLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched; - this.statusMenuLabel.Name = "statusMenuLabel"; - this.statusMenuLabel.Size = new System.Drawing.Size(45, 19); - this.statusMenuLabel.Text = "Menu:"; - // - // menuStatusText - // - this.menuStatusText.Name = "menuStatusText"; - this.menuStatusText.Size = new System.Drawing.Size(48, 19); - this.menuStatusText.Text = "Missing"; - // - // statusLabelFilters - // - this.statusLabelFilters.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left; - this.statusLabelFilters.BorderStyle = System.Windows.Forms.Border3DStyle.Etched; - this.statusLabelFilters.Name = "statusLabelFilters"; - this.statusLabelFilters.Size = new System.Drawing.Size(45, 19); - this.statusLabelFilters.Text = "Filters:"; - // - // filtersTextStatus - // - this.filtersTextStatus.Name = "filtersTextStatus"; - this.filtersTextStatus.Size = new System.Drawing.Size(48, 19); - this.filtersTextStatus.Text = "Missing"; - // - // toolStripStatusLabel3 - // - this.toolStripStatusLabel3.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left; - this.toolStripStatusLabel3.BorderStyle = System.Windows.Forms.Border3DStyle.Etched; - this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; - this.toolStripStatusLabel3.Size = new System.Drawing.Size(46, 19); - this.toolStripStatusLabel3.Text = "Status:"; - // - // statusConnectedImg - // - this.statusConnectedImg.Image = ((System.Drawing.Image)(resources.GetObject("statusConnectedImg.Image"))); - this.statusConnectedImg.Name = "statusConnectedImg"; - this.statusConnectedImg.Size = new System.Drawing.Size(16, 19); - // - // statusLabelConnected - // - this.statusLabelConnected.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; - this.statusLabelConnected.BorderStyle = System.Windows.Forms.Border3DStyle.Etched; - this.statusLabelConnected.Name = "statusLabelConnected"; - this.statusLabelConnected.Size = new System.Drawing.Size(83, 19); - this.statusLabelConnected.Text = "Disconnected"; - // - // bottomPanel - // - this.bottomPanel.Controls.Add(this.commandPanel); - this.bottomPanel.Controls.Add(this.statusStrip1); - this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom; - this.bottomPanel.Location = new System.Drawing.Point(0, 503); - this.bottomPanel.Name = "bottomPanel"; - this.bottomPanel.Size = new System.Drawing.Size(884, 50); - this.bottomPanel.TabIndex = 4; - // - // bodyPanel - // - this.bodyPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.bodyPanel.Controls.Add(this.logPanel); - this.bodyPanel.Controls.Add(this.bottomPanel); - this.bodyPanel.Location = new System.Drawing.Point(0, 53); - this.bodyPanel.Name = "bodyPanel"; - this.bodyPanel.Size = new System.Drawing.Size(884, 553); - this.bodyPanel.TabIndex = 1; - // - // imgList32 - // - this.imgList32.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgList32.ImageStream"))); - this.imgList32.TransparentColor = System.Drawing.Color.Transparent; - this.imgList32.Images.SetKeyName(0, "Spanner"); - this.imgList32.Images.SetKeyName(1, "TargetImg1"); - this.imgList32.Images.SetKeyName(2, "TargetImg3"); - this.imgList32.Images.SetKeyName(3, "GamePlayImg2"); - this.imgList32.Images.SetKeyName(4, "ExtraMacrosImg"); - this.imgList32.Images.SetKeyName(5, "ModeFilesImg32"); - this.imgList32.Images.SetKeyName(6, "ListImg"); - this.imgList32.Images.SetKeyName(7, "GamePlayImg3"); - this.imgList32.Images.SetKeyName(8, "TargetImg3"); - this.imgList32.Images.SetKeyName(9, "ModeImg32"); - this.imgList32.Images.SetKeyName(10, "ModeImg32_Cmd"); - this.imgList32.Images.SetKeyName(11, "ModeImg32_File"); - this.imgList32.Images.SetKeyName(12, "AnalogImg32"); - this.imgList32.Images.SetKeyName(13, "GamePlayImg"); - this.imgList32.Images.SetKeyName(14, "TargetImg2"); - this.imgList32.Images.SetKeyName(15, "RadImg32"); - this.imgList32.Images.SetKeyName(16, "EarthImg32"); - this.imgList32.Images.SetKeyName(17, "SettingsImg32"); - this.imgList32.Images.SetKeyName(18, "SlidersImg32"); - this.imgList32.Images.SetKeyName(19, "ToolsImg32"); - this.imgList32.Images.SetKeyName(20, "ModeCmdImg32"); - this.imgList32.Images.SetKeyName(21, "ModeFullImg32"); - this.imgList32.Images.SetKeyName(22, "EmptyImg32"); - this.imgList32.Images.SetKeyName(23, "FileImg32"); - this.imgList32.Images.SetKeyName(24, "FullImg32"); - this.imgList32.Images.SetKeyName(25, "NoImg32"); - this.imgList32.Images.SetKeyName(26, "OkImg32"); - this.imgList32.Images.SetKeyName(27, "BubbleImg32"); - this.imgList32.Images.SetKeyName(28, "UpIcon32"); - // - // MainForm - // - this.AllowDrop = true; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(884, 606); - this.Controls.Add(this.topToolStrip); - this.Controls.Add(this.bodyPanel); - this.DoubleBuffered = true; - this.HelpButton = true; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(715, 250); - this.Name = "MainForm"; - this.Text = "Universal Remote Console"; - this.Load += new System.EventHandler(this.Form1_Load); - this.DragDrop += new System.Windows.Forms.DragEventHandler(this.MainForm_DragDrop); - this.DragEnter += new System.Windows.Forms.DragEventHandler(this.MainForm_DragEnter); - this.topToolStrip.ResumeLayout(false); - this.topToolStrip.PerformLayout(); - this.cmsGraph.ResumeLayout(false); - this.logPanel.ResumeLayout(false); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.tabControlTop.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.logChart)).EndInit(); - this.contextMenuHistoryChart.ResumeLayout(false); - this.tabFullLog.ResumeLayout(false); - this.contextMenuTabs.ResumeLayout(false); - this.contextMenuTabs.PerformLayout(); - this.tabPage1.ResumeLayout(false); - this.panelHelp.ResumeLayout(false); - this.tabPageMidi.ResumeLayout(false); - this.commandPanel.ResumeLayout(false); - this.commandPanel.PerformLayout(); - this.statusStrip1.ResumeLayout(false); - this.statusStrip1.PerformLayout(); - this.bottomPanel.ResumeLayout(false); - this.bottomPanel.PerformLayout(); - this.bodyPanel.ResumeLayout(false); - this.bodyPanel.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Panel logPanel; - private System.Windows.Forms.RichTextBox fullLogConsole; - private System.Windows.Forms.Panel commandPanel; - private System.Windows.Forms.TextBox editInput; - private System.Windows.Forms.ImageList imgList; - private System.Windows.Forms.ContextMenuStrip contextMenuTabs; - private System.Windows.Forms.ToolStripMenuItem actionSelectAll; - private System.Windows.Forms.ToolStripMenuItem actionCopy; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem actionClear; - private System.Windows.Forms.ToolTip toolTip1; - private System.Windows.Forms.TabControl tabControlFilters; - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.ContextMenuStrip cmsGraph; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; - private System.Windows.Forms.StatusStrip statusStrip1; - private System.Windows.Forms.Panel bottomPanel; - private System.Windows.Forms.ToolStripStatusLabel statusLabelConnected; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; - private System.Windows.Forms.ToolStripStatusLabel labelSeparator; - private System.Windows.Forms.ToolStripStatusLabel forceRightAlignment; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3; - private System.Windows.Forms.ToolStripStatusLabel statusLabelTarget; - private System.Windows.Forms.ToolStripStatusLabel statusConnectedImg; - private System.Windows.Forms.ToolStripStatusLabel statusLabelIp; - private System.Windows.Forms.Panel bodyPanel; - private System.Windows.Forms.TabControl tabControlTop; - private System.Windows.Forms.TabPage tabFullLog; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.DataVisualization.Charting.Chart logChart; - private System.Windows.Forms.ContextMenuStrip contextMenuHistoryChart; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripMenuItem historyChartClear; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private System.Windows.Forms.ToolStripMenuItem actionClearAll; - private System.Windows.Forms.ToolStripStatusLabel statusLabelFilters; - private System.Windows.Forms.ToolStripStatusLabel filtersTextStatus; - private System.Windows.Forms.ToolStripStatusLabel statusMenuLabel; - private System.Windows.Forms.ToolStripStatusLabel menuStatusText; - private System.Windows.Forms.ToolStripMenuItem historyChartViewMenu; - private System.Windows.Forms.ImageList imgList32; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.Panel panelHelp; - private System.Windows.Forms.RichTextBox richTextBox1; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private System.Windows.Forms.ToolStripMenuItem actionEditFiltersFile; - private System.Windows.Forms.ToolStripTextBox lalala2; - private System.Windows.Forms.ToolStripTextBox lalala; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel4; - private System.Windows.Forms.ToolStripStatusLabel statusLabelMode; - private System.Windows.Forms.ToolStrip topToolStrip; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel5; - private System.Windows.Forms.ToolStripStatusLabel statusLabelMidi; - private System.Windows.Forms.TabPage tabPageMidi; - private System.Windows.Forms.ListView lvMidiLog; - private System.Windows.Forms.ColumnHeader cHNum; - private System.Windows.Forms.ColumnHeader cHLog; - private System.Windows.Forms.ColumnHeader cHChannel; - private System.Windows.Forms.ColumnHeader chMode; - private System.Windows.Forms.ColumnHeader chCode; - private System.Windows.Forms.ColumnHeader chVelocity; - private System.Windows.Forms.Label label1; - } -} - diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.cs deleted file mode 100644 index 9b5ed6f48e..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.cs +++ /dev/null @@ -1,1154 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : * Main Screen (Form) - - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Windows.Forms; -using System.Text.RegularExpressions; -using System.IO; - -namespace RemoteConsole -{ - public delegate void DelSendCommandToTarget(ParamsFileInfo.CEntryTag tag); - public delegate void DelSettingsChange(CSettings newSettings); - - public partial class MainForm : Form, IRemoteConsoleClientListener - { - private const string kAppTitle = "Universal Remote Console v1.0"; - - private CSettings currentSettings = new CSettings(); - - private Timer timer = new Timer(); - - private RemoteConsole rc; - private List recentCommands = new List(); - private int currRecent = 0; - - private Regex rgxRemoveSpaceBegin = new Regex("^\\s*"); - private Regex rgxRemoveNewLine = new Regex("\\n"); - private Regex rgxGetIpPort = new Regex("([.\\w]+):([\\d]+)"); - - private DateTime lastModificationMacros; - private DateTime lastModificationFilters; - private string ipAddress = "localhost"; - private string currentHostName = "localhost"; - private string currentPort = ""; - - private ParamsFileInfo.CData paramsFileData; - private LogBuffer logBuffer = new LogBuffer(); - private LogChart logChartMgr; - private LogFilterManager logFilterMgr = new LogFilterManager(); - - private List midiInputDevice; - private List scheduledMidiLogs = new List(); - - private FormButtons formButtons = new FormButtons(); - private FormSliders formSliders = new FormSliders(); - private FormSettings formSettings = new FormSettings(); - private FormAbout formAbout = new FormAbout(); - - private bool bConfigFilesOk = true; - - private object lockerMidiLog = new object(); - - public void DelSendCommandToTarget(ParamsFileInfo.CEntryTag tag) - { - sendMenuCommand(tag); - } - - public void DelSettingsChange(CSettings newSettings) - { - currentSettings.DebugMidi = newSettings.DebugMidi; - if (currentSettings.Mode != newSettings.Mode) - ModifyMode(newSettings.Mode); - } - - public MainForm() - { - InitializeComponent(); - updateConfig(true); - - rc = new RemoteConsole(); - rc.SetListener(this); - updateIp(); - rc.Start(); - currentPort = rc.Port.ToString(); - - logChartMgr = new LogChart(logChart); - logFilterMgr.SetFullLogTab(tabFullLog); - - formSettings.SetSettingsChangeDelegate(DelSettingsChange); - - InitMidi(); - } - - // ---- Main Events ---- - // ---------------------------------------------------------- - private void Form1_Load(object sender, EventArgs e) - { - timer.Interval = 100; - timer.Tick += new EventHandler(onTimer); - timer.Enabled = true; - } - - public void OnLogMessage(SLogMessage message) - { - System.Drawing.Color col = System.Drawing.Color.White; - switch (message.Type) - { - case EMessageType.eMT_Message: col = System.Drawing.Color.White; break; - case EMessageType.eMT_Warning: col = System.Drawing.Color.Yellow; message.Message = "[WARNING] " + message.Message; break; - case EMessageType.eMT_Error: col = System.Drawing.Color.Red; message.Message = "[ERROR] " + message.Message; break; - } - addLine(message.Message, col, message.Type); - } - - public void OnAutoCompleteDone(List autoCompleteList) - { - AutoCompleteStringCollection col = new AutoCompleteStringCollection(); - for (int i = 0; i < autoCompleteList.Count; ++i) - col.Add(autoCompleteList[i]); - editInput.AutoCompleteCustomSource = col; - } - - public void OnConnected() - { - setConnected(true); - } - - public void OnDisconnected() - { - setConnected(false); - } - - protected override void OnFormClosing(FormClosingEventArgs e) - { - rc.Stop(); - } - - // ---- Update ---- - // ---------------------------------------------------------- - private void onTimer(Object myObject, EventArgs myEventArgs) - { - List toBeExecuted = new List(); - rc.PumpEvents(); - - // - if (currentSettings.Mode != CSettings.EMode.eM_Full) - { - logBuffer.clear(); - updateConfig(false); - updateFilters(false); - return; - } - - logBuffer.addToTextBox(fullLogConsole, false); - - updateConfig(false); - updateFilters(false); - - logFilterMgr.UpdateTabs(logBuffer, ref toBeExecuted); - - updateGraph(); - - logBuffer.clear(); - - // Apply Commands - System.Threading.Tasks.Parallel.ForEach(toBeExecuted, exec => - { - switch (exec.Type) - { - case FilterData.Exec.EExecType.eET_Macro: - ParamsFileInfo.CEntryTag tag = GetCommandTagFromMacroName(exec.Command); - if (tag != null) - sendMenuCommand(tag); - break; - case FilterData.Exec.EExecType.eET_DosCmd: - System.Diagnostics.Process.Start("cmd.exe", @"/C " + exec.Command); - break; - } - } - ); - - // midi logs - UpdateMidiLogUi(); - } - - private void WarnAboutMissingFiles() - { - if (bConfigFilesOk == true) - { - bConfigFilesOk = false; - const string message = - "Please place filters.xml and params.xml in the same folder as the executable."; - const string caption = "Missing Config Files!!"; - var result = MessageBox.Show(message, caption, - MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - - private void updateConfig(bool force) - { - System.IO.FileInfo fileInfo = new System.IO.FileInfo(Common.MenusFileFullPath); - - if (fileInfo.Exists == false) - { - menuStatusText.Text = "Missing"; - - WarnAboutMissingFiles(); - return; - } - - bConfigFilesOk = true; - - if (!force && fileInfo.LastWriteTime == lastModificationMacros) - return; - - // Read Params File - ParamsFileReader paramsFileReader = new ParamsFileReader(Common.MenusFileFullPath); - paramsFileData = paramsFileReader.GetXmlParams(); - - // Clear tools bar - this.topToolStrip.Items.Clear(); - - // Put groups into tool bar - - // Default ones - CreateStandardMenus(); - - // Custom Menus - foreach (ParamsFileInfo.CGroup g in paramsFileData.Groups) - { - CreateMenuComponent(g); - } - - lastModificationMacros = fileInfo.LastWriteTime; - - menuStatusText.Text = paramsFileData.Groups.Count.ToString(); - } - - private void updateFilters(bool force) - { - System.IO.FileInfo fileInfo = new System.IO.FileInfo(Common.FiltersFileFullPath); - - if (fileInfo.Exists == false) - { - filtersTextStatus.Text = "Missing"; - return; - } - - if (!force && fileInfo.LastWriteTime == lastModificationFilters) - return; - - FilterFileReader filterReader = new FilterFileReader(); - List filters = null; - - // stats - int totalNumFilters = 0; - - // clear tabs - tabControlFilters.TabPages.Clear(); - logFilterMgr.Clear(); - - logChartMgr.ClearSeries(); - logChartMgr.AddSeries(LogFilterManager.TotalCountSeriesName); - logFilterMgr.StatsHistory.AddSeries(LogFilterManager.TotalCountSeriesName); - - // Create Default tabs - filters = filterReader.CreateStandardFilters(); - foreach (FilterData filter in filters) - { - logFilterMgr.AddFilter(filter, tabControlFilters, this.contextMenuTabs); - logFilterMgr.StatsHistory.AddSeries(filter.Label); - logChartMgr.AddSeries(filter.Label); - } - totalNumFilters += filters.Count; - - // Create custom filters - filters = filterReader.GetXmlFilters(Common.FiltersFileFullPath); - foreach (FilterData filter in filters) - { - logFilterMgr.AddFilter(filter, tabControlFilters, this.contextMenuTabs); - logFilterMgr.StatsHistory.AddSeries(filter.Label); - logChartMgr.AddSeries(filter.Label); - } - totalNumFilters += filters.Count; - - - lastModificationFilters = fileInfo.LastWriteTime; - filtersTextStatus.Text = totalNumFilters.ToString(); - } - - private void updateGraph() - { - LogFilterManager.History history = logFilterMgr.StatsHistory; - for (int i = 0; i < history.Data.Count; ++i) - { - LogFilterManager.SingleFilterHistory h = history.Data[i]; - - int idx = 0; - - h.ResetIterator(); - do - { - logChartMgr.SetYValue(h.Name, idx++, h.Buffer[h.Iterator]); - - if (idx >= LogFilterManager.SingleFilterHistory.BufferSize) - idx = LogFilterManager.SingleFilterHistory.BufferSize - 1; // it should never happen, but just in case - - } while (h.NextIterator()); - } - logChartMgr.Refresh(); - - } - - // ---- Log Context menu ---- - // ---------------------------------------------------------- - private void actionClear_Click(object sender, EventArgs e) - { - Control ctrl = ((ContextMenuStrip)(((ToolStripMenuItem)sender).Owner)).SourceControl; - logFilterMgr.ExecuteContextMenu(ctrl, LogFilterManager.EContextMenuAction.eCM_Clear); - } - - private void actionClearAll_Click(object sender, EventArgs e) - { - //logFilterMgr.ClearTextBoxes(); - logFilterMgr.ExecuteContextMenu(null, LogFilterManager.EContextMenuAction.eCM_ClearAllLogs); - } - - private void actionCopy_Click(object sender, EventArgs e) - { - Control ctrl = ((ContextMenuStrip)(((ToolStripMenuItem)sender).Owner)).SourceControl; - logFilterMgr.ExecuteContextMenu(ctrl, LogFilterManager.EContextMenuAction.eCM_Copy); - } - - private void actionSelectAll_Click(object sender, EventArgs e) - { - Control ctrl = ((ContextMenuStrip)(((ToolStripMenuItem)sender).Owner)).SourceControl; - logFilterMgr.ExecuteContextMenu(ctrl, LogFilterManager.EContextMenuAction.eCM_SelectAll); - } - - private void actionEditFiltersFile_Click(object sender, EventArgs e) - { - // edit filters file - System.Diagnostics.Process.Start(/*"notepad.exe", */Common.FiltersFileFullPath); - } - - // ---- Chart Context menu ---- - // ---------------------------------------------------------- - private void historyChartClear_Click(object sender, EventArgs e) - { - logFilterMgr.ClearHistory(); - logChartMgr.ClearData(); - } - - private void contextMenuHistoryChart_Opening(object sender, CancelEventArgs e) - { - // Clear Series - historyChartViewMenu.DropDownItems.Clear(); - - // Populate series items - foreach (var s in logChartMgr.GetSeries()) - { - ToolStripMenuItem item = new ToolStripMenuItem(s.Name); - item.CheckOnClick = true; - item.ToolTipText = "Click to Toggle. Ctrl-Click to Toggle all. Shift-Click makes selected item the only one selected/deselected"; - item.Click += new System.EventHandler(this.showHideLegend); - - if (s.IsVisibleInLegend) - { - item.Checked = true; - } - historyChartViewMenu.DropDownItems.Add(item); - } - } - - private void showHideLegend(object sender, EventArgs e) - { - System.Windows.Forms.ToolStripMenuItem b = (System.Windows.Forms.ToolStripMenuItem)sender; - if (b != null) - { - logChartMgr.ShowHideLegend(b.Text, b.Checked); - } - } - - // ---- Menu Selection ---- - // ---------------------------------------------------------- - private void editInput_KeyUp(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - sendUserTypedCommand(editInput.Text); - editInput.Text = ""; - currRecent = 0; - } - if (e.KeyCode == Keys.Up && e.Shift) - { - if (recentCommands.Count - currRecent > 0) - { - editInput.Text = recentCommands[recentCommands.Count - ++currRecent]; - editInput.SelectionStart = editInput.Text.Length; - } - } - if (e.KeyCode == Keys.Down && e.Shift) - { - if (currRecent > 1) - { - editInput.Text = recentCommands[recentCommands.Count - --currRecent]; - editInput.SelectionStart = editInput.Text.Length; - } - } - } - - private void editIpTB_KeyUp(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - ipAddress = ((ToolStripTextBox)sender).Text; - updateIp(); - } - else if (e.KeyCode == Keys.Escape) - { - ((ToolStripTextBox)sender).Undo(); - } - } - - private void portTB_KeyPressed(object sender, KeyPressEventArgs e) - { - e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar); - } - - private void portTB_KeyUp(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - currentPort = ((ToolStripTextBox)sender).Text; - updateIp(); - rc.SetPort(currentPort); - UpdateUiStatus(); - } - else if (e.KeyCode == Keys.Escape) - { - ((ToolStripTextBox)sender).Undo(); - } - } - - private void ModifyMode(CSettings.EMode newMode) - { - currentSettings.Mode = newMode; - UpdateUiStatus(); - - if (newMode == CSettings.EMode.eM_FileOnly) - { - rc.Stop(); - } - else - { - rc.Start(); - } - } - - private void genericMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - // Select a preset target - if (e.ClickedItem.Tag != null) - { - ParamsFileInfo.CEntryTag tag = (ParamsFileInfo.CEntryTag)e.ClickedItem.Tag; - sendMenuCommand(tag); - } - else - { - // edit macros file - System.Diagnostics.Process.Start(Common.MenusFileFullPath); - } - } - - private void macroButton_ItemClicked(object sender, EventArgs e) - { - // Select a preset target - System.Windows.Forms.ToolStripButton b = (System.Windows.Forms.ToolStripButton)sender; - if (b.Tag != null) - { - ParamsFileInfo.CEntryTag tag = (ParamsFileInfo.CEntryTag)b.Tag; - sendMenuCommand(tag); - } - } - - // ---- Helper Functions ---- - // ---------------------------------------------------------- - private void ParseIpPort(string ipPort, ref string ip, ref string port) - { - Match match = rgxGetIpPort.Match(ipPort); - if (match.Success && match.Groups.Count == 3) - { - ip = match.Groups[1].Value; - port = match.Groups[2].Value; - } - else - { - ip = "localhost"; - port = "0"; - } - } - - private void sendMenuCommand(ParamsFileInfo.CEntryTag tag) - { - List commands = (tag.ModCmds == null || tag.ModCmds.Count == 0) ? tag.Entry.Data : tag.ModCmds; - - if (tag.GroupSubType == ParamsFileInfo.CGroup.EGroupSubType.eSGT_Targets) - { - if (commands.Count > 0) - { - ParseIpPort(commands[0], ref ipAddress, ref currentPort); - currentHostName = tag.Entry.Name; - updateIp(); - rc.SetPort(currentPort); - //editIpTB.Text = tag; - UpdateUiStatus(); - return; - } - } - - switch (tag.GroupType) - { - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosMenu: - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosButton: - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosSlider: - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosToggle: - { - for (int k = 0; k < commands.Count; ++k) - rc.ExecuteConsoleCommand(commands[k]); - } - break; - case ParamsFileInfo.CGroup.EGroupType.eGT_GamePlayMenu: - { - for (int k = 0; k < commands.Count; ++k) - rc.ExecuteGameplayCommand(commands[k]); - } - break; - } - } - - private System.Drawing.Image GetTargetImage(string targetName) - { - int idx = imgList.Images.IndexOfKey("UnknownTarget"); - if (targetName.Length > 0) - { - string tgt = targetName; - if (targetName[0] == '[' && targetName[targetName.Length-1] == ']') - { - tgt = targetName.Substring(1, targetName.Length - 2); - } - - if (tgt.ToLower() == "pc") - idx = imgList.Images.IndexOfKey("WinLogoImg16"); - else if (tgt.ToLower() == "provo") - idx = imgList.Images.IndexOfKey("provo"); - else if (tgt.ToLower() == "custom_ip") - idx = imgList.Images.IndexOfKey("IpImg"); - else if (tgt.ToLower() == "custom_port") - idx = imgList.Images.IndexOfKey("PortImg"); - } - - return imgList.Images[idx]; - } - - private void CreateStandardMenus() - { - int imgIdx = -1; - System.Windows.Forms.ToolStripDropDownButton menuItem = new System.Windows.Forms.ToolStripDropDownButton(); - - // ---------- Tools ----------------- - System.Windows.Forms.ToolStripDropDownButton windowsItem = new System.Windows.Forms.ToolStripDropDownButton(); - windowsItem.Text = "Tools"; - imgIdx = imgList32.Images.IndexOfKey("ToolsImg32"); - if (imgIdx >= 0) - { - windowsItem.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; - windowsItem.Image = imgList32.Images[imgIdx]; - } - - ContextMenuStrip windowsMenuItem = new ContextMenuStrip(); - windowsMenuItem.ImageList = imgList32; - // Sliders - windowsMenuItem.Items.Add("Sliders"); - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Tag = CSettings.EMode.eM_Full; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ToolTipText = "Sliders window"; - imgIdx = imgList32.Images.IndexOfKey("SlidersImg32"); - if (imgIdx > -1) windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ImageIndex = imgIdx; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Click += new System.EventHandler(this.openSlidersWindowBt_Click); - - // Toggle Buttons - windowsMenuItem.Items.Add("Toggle Buttons"); - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Tag = CSettings.EMode.eM_Full; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ToolTipText = "Opens the Toggle Buttons window"; - imgIdx = imgList32.Images.IndexOfKey("UpIcon32"); - if (imgIdx > -1) windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ImageIndex = imgIdx; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Click += new System.EventHandler(this.openToggleButtonsWindow_Click); - - // Settings - windowsMenuItem.Items.Add("Settings"); - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Tag = CSettings.EMode.eM_Full; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ToolTipText = "Opens the settings window"; - imgIdx = imgList32.Images.IndexOfKey("SettingsImg32"); - if (imgIdx > -1) windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ImageIndex = imgIdx; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Click += new System.EventHandler(this.openSettingsWindow_Click); - - // About - windowsMenuItem.Items.Add("About"); - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Tag = CSettings.EMode.eM_Full; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ToolTipText = "Opens the about window"; - imgIdx = imgList32.Images.IndexOfKey("BubbleImg32"); - if (imgIdx > -1) windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].ImageIndex = imgIdx; - windowsMenuItem.Items[windowsMenuItem.Items.Count - 1].Click += (sender, e) => { formAbout.Show(); }; - - // Add Menu to Stripe - windowsItem.DropDown = windowsMenuItem; - this.topToolStrip.Items.Add(windowsItem); - - // ------------------------------------- Toggle Window ------------------------------------------------------------------ - if (paramsFileData.ShouldGroupShowInMenuBar("toggles")) - { - System.Windows.Forms.ToolStripButton toggleMenu = new System.Windows.Forms.ToolStripButton(); - toggleMenu.Text = "Toggles"; - imgIdx = imgList32.Images.IndexOfKey("UpIcon32"); - if (imgIdx >= 0) - { - toggleMenu.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; - toggleMenu.Image = imgList32.Images[imgIdx]; - } - toggleMenu.Tag = CSettings.EMode.eM_Full; - toggleMenu.ToolTipText = "Opens the Toggle Buttons window"; - toggleMenu.Click += new System.EventHandler(this.openToggleButtonsWindow_Click); - - // Add Menu to Stripe - this.topToolStrip.Items.Add(toggleMenu); - } - - // ------------------------------------- Sliders Window ------------------------------------------------------------------ - if (paramsFileData.ShouldGroupShowInMenuBar("sliders")) - { - System.Windows.Forms.ToolStripButton slidersMenu = new System.Windows.Forms.ToolStripButton(); - slidersMenu.Text = "Sliders"; - imgIdx = imgList32.Images.IndexOfKey("SlidersImg32"); - if (imgIdx >= 0) - { - slidersMenu.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; - slidersMenu.Image = imgList32.Images[imgIdx]; - } - slidersMenu.Tag = CSettings.EMode.eM_Full; - slidersMenu.ToolTipText = "Opens the Toggle Buttons window"; - slidersMenu.Click += new System.EventHandler(this.openSlidersWindowBt_Click); - - // Add Menu to Stripe - this.topToolStrip.Items.Add(slidersMenu); - } - } - - private void CreateMenuComponent(ParamsFileInfo.CGroup group) - { - if (group != null && group.Name.Length > 0) - { - bool isTargetGroup = group.GType == ParamsFileInfo.CGroup.EGroupType.eGT_Targets; - bool isMacroGroup = group.GType == ParamsFileInfo.CGroup.EGroupType.eGT_MacrosMenu; - - // Create menu item - switch (group.GType) - { - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosMenu: - case ParamsFileInfo.CGroup.EGroupType.eGT_GamePlayMenu: - case ParamsFileInfo.CGroup.EGroupType.eGT_Targets: - { - System.Windows.Forms.ToolStripDropDownButton menuItem = new System.Windows.Forms.ToolStripDropDownButton(); - - // Create and Populate DropDown menu - ContextMenuStrip contextMenu = new ContextMenuStrip(); - foreach (ParamsFileInfo.CEntry item in group.Entries) - { - contextMenu.Items.Add(item.Name); - contextMenu.Items[contextMenu.Items.Count - 1].Tag = item.GenerateEntryTag(group); - contextMenu.Items[contextMenu.Items.Count - 1].ToolTipText = item.GetDataAsString(); - if (isTargetGroup) - { - contextMenu.Items[contextMenu.Items.Count - 1].Image = GetTargetImage(item.Name); - } - } - - if (isTargetGroup) - { - ToolStripSeparator sep = new System.Windows.Forms.ToolStripSeparator(); - contextMenu.Items.Add(sep); - - contextMenu.Items.Add("Custom IP"); - contextMenu.Items[contextMenu.Items.Count - 1].Enabled = false; - contextMenu.Items[contextMenu.Items.Count - 1].Image = GetTargetImage("custom_ip"); - - // Add edit IP text box - ToolStripTextBox ip = new ToolStripTextBox("editIpTb"); - ip.AcceptsReturn = true; - ip.BackColor = System.Drawing.Color.LightGray; - ip.BorderStyle = BorderStyle.FixedSingle; - ip.KeyUp += new System.Windows.Forms.KeyEventHandler(this.editIpTB_KeyUp); - contextMenu.Items.Add(ip); - contextMenu.Items[contextMenu.Items.Count - 1].ToolTipText = "Set custom IP"; - - ToolStripSeparator sep2 = new System.Windows.Forms.ToolStripSeparator(); - contextMenu.Items.Add(sep2); - - contextMenu.Items.Add("Custom Port"); - contextMenu.Items[contextMenu.Items.Count - 1].Enabled = false; - contextMenu.Items[contextMenu.Items.Count - 1].Image = GetTargetImage("custom_port"); - - // Add edit Port text box - ToolStripTextBox port = new ToolStripTextBox("portTb"); - port.AcceptsReturn = true; - port.BackColor = System.Drawing.Color.LightGray; - port.BorderStyle = BorderStyle.FixedSingle; - port.Text = "4600"; - port.KeyUp += new System.Windows.Forms.KeyEventHandler(this.portTB_KeyUp); - port.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.portTB_KeyPressed); - contextMenu.Items.Add(port); - contextMenu.Items[contextMenu.Items.Count - 1].ToolTipText = "Set custom port"; - } - - // Register ItemClicked Event - contextMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.genericMenu_ItemClicked); - // Assign drop down menu element to menu - menuItem.DropDown = contextMenu; - menuItem.Name = "menu" + group.Name; - menuItem.Text = group.Name; - - int imgIndex = -1; - if (group.IconPath != null) - { - string fullPath = Common.IconsPath + group.IconPath; - imgIndex = Common.AddImageFileToImageList(fullPath, imgList32); - } - - if (imgIndex == -1) - { - // Hard coded images - if (group.Name.ToLower() == "maps") imgIndex = imgList32.Images.IndexOfKey("EarthImg32"); - else if (isMacroGroup) imgIndex = imgList32.Images.IndexOfKey("RadImg32"); - else if (group.Name.ToLower() == "gameplays") imgIndex = imgList32.Images.IndexOfKey("GamePlayImg"); - else if (isTargetGroup) imgIndex = imgList32.Images.IndexOfKey("TargetImg2"); - else imgIndex = imgList32.Images.IndexOfKey("ExtraMacrosImg"); - } - - if (imgIndex >=0) - { - menuItem.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; - menuItem.Image = imgList32.Images[imgIndex]; - } - - // Add menu to menu strip - this.topToolStrip.Items.Add(menuItem); - } - break; - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosButton: - { - // Generate a Button per entry - foreach (ParamsFileInfo.CEntry item in group.Entries) - { - System.Windows.Forms.ToolStripButton button = new System.Windows.Forms.ToolStripButton(); - // Assign drop down menu element to menu - //menuItem.Name = "menu" + group.name; - button.Text = item.Name; - button.DisplayStyle = ToolStripItemDisplayStyle.Text; - button.Enabled = true; - button.Visible = true; - button.Tag = item.GenerateEntryTag(group); - button.ToolTipText = item.GetDataAsString(); - // Register ItemClicked Event - button.Click += new System.EventHandler(this.macroButton_ItemClicked); - // Add menu to menu strip - this.topToolStrip.Items.Add(button); - - if (item.IconPath != null) - { - string fullPath = Common.IconsPath + item.IconPath; - int imgIndex = Common.AddImageFileToImageList(fullPath, imgList32); - if (imgIndex >= 0) - { - button.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; - button.Image = imgList32.Images[imgIndex]; - } - } - - // Generate button -// System.Windows.Forms.Button b = new System.Windows.Forms.Button(); -// b.Text = item.Name; -// b.Tag = item.GenerateEntryTag(group); -// b.FlatStyle = FlatStyle.Flat; -// b.Click += new System.EventHandler(this.macroButton_ItemClicked); -// -// formButtons.AddButton(b); - } - } - break; - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosSlider: - { - // Set up slider window - formSliders.SetEntries(group.Entries, DelSendCommandToTarget); - } - break; - case ParamsFileInfo.CGroup.EGroupType.eGT_MacrosToggle: - { - // Set up slider window - formButtons.SetEntries(group.Entries, DelSendCommandToTarget); - } - break; - default : - break; - } - - // Create separator - //System.Windows.Forms.ToolStripSeparator separator = new System.Windows.Forms.ToolStripSeparator(); - // Add separator to menu strip - //this.topToolStrip.Items.Add(separator); - } - } - - private string getCurrHostName() - { - return currentHostName; - } - - private ParamsFileInfo.CEntryTag GetCommandTagFromMacroName(string macroName) - { - ParamsFileInfo.CGroup group = paramsFileData.GetGroup("Macro"); - ParamsFileInfo.CEntry entry = paramsFileData.GetItem("Macro", macroName); - if (group != null && entry != null) - { - return entry.GenerateEntryTag(group); - } - return null; - } - - private void addLine(string line, System.Drawing.Color color, EMessageType msgType) - { - // remove white spaces at the beginning and new line - line = rgxRemoveSpaceBegin.Replace(line, ""); - line = rgxRemoveNewLine.Replace(line, ""); - logBuffer.addLine(line, color, msgType); - } - - private void UpdateUiStatus() - { - // Host, Ip, etc... - string currHost = getCurrHostName(); - statusLabelTarget.Text = currHost; - statusLabelTarget.Image = GetTargetImage(currHost); - statusLabelIp.Text = getCurrentHostIp(); - this.Text = kAppTitle + " (" + currHost + ")"; - if (rc != null) - { - statusLabelIp.Text += ":" + rc.Port.ToString(); - this.Text += ":" + rc.Port.ToString(); - } - - // Mode - int idx = -1; - switch (currentSettings.Mode) - { - case CSettings.EMode.eM_Full: - statusLabelMode.Text = "[Net] Full Mode"; - idx = imgList32.Images.IndexOfKey("FullImg32"); - - break; - case CSettings.EMode.eM_CommandsOnly: - statusLabelMode.Text = "[Net] Command Mode"; - idx = imgList32.Images.IndexOfKey("EmptyImg32"); - break; - case CSettings.EMode.eM_FileOnly: - statusLabelMode.Text = "[Offline] File Mode"; - idx = imgList32.Images.IndexOfKey("FileImg32"); - break; - } - if (idx > -1) statusLabelMode.Image = imgList32.Images[idx]; - } - private void setConnected(bool connected) - { - UpdateUiStatus(); - if (connected) - { - statusLabelConnected.Text = "Connected"; - statusConnectedImg.Image = imgList.Images[1]; -// rc.ExecuteGameplayCommand("SetViewMode:" + lastViewMode.ToString()); -// rc.ExecuteGameplayCommand("SetFlyMode:" + lastFlyMode.ToString()); - } - else - { - statusConnectedImg.Image = imgList.Images[0]; - statusLabelConnected.Text = "Connecting..."; - } - } - - private void sendUserTypedCommand(string command) - { - if (recentCommands.Count == 0 || recentCommands[recentCommands.Count - 1] != command) - recentCommands.Add(command); - rc.ExecuteConsoleCommand(command); - } - - private string getCurrentHostIp() - { - return ipAddress; - } - - private void updateIp() - { - if (paramsFileData == null) - return; - - // Find current host name from target group - ParamsFileInfo.CGroup targetGroup = paramsFileData.GetTargetsGroup(); - if (targetGroup != null) - { - string fullAddr = ipAddress + ":" + currentPort; - foreach (ParamsFileInfo.CEntry e in targetGroup.Entries) - { - currentHostName = ""; - if (e.Data.Count > 0 && e.Data[0] == fullAddr) - { - currentHostName = e.Name; - break; - } - } - } - - rc.SetServer(getCurrentHostIp()); - } - - private void MainForm_DragDrop(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop)) - { - string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); - if (files.Length > 0) - { - ProcessLogFile(files[0]); - } - } - } - - private void MainForm_DragEnter(object sender, DragEventArgs e) - { - if (currentSettings.Mode == CSettings.EMode.eM_FileOnly && e.Data.GetDataPresent(DataFormats.FileDrop)) - e.Effect = DragDropEffects.All; - else - e.Effect = DragDropEffects.None; - } - - private void ProcessLogFile(string filePath) - { - updateFilters(true); - - List toBeExecuted = new List(); - LogBuffer fileBuffer = new LogBuffer(); - // read file and add process each line - System.IO.StreamReader file = null; - try - { - file = new System.IO.StreamReader(filePath); - } - catch (System.Exception) - { - return; - } - - // Parse it - Regex rgxWarning = new Regex("\\[Warning\\]"); - Regex rgxError = new Regex("\\[Error\\]"); - - EMessageType msgType = EMessageType.eMT_Message; - string line; - while ((line = file.ReadLine()) != null) - { - // Parse line to infer message type - if (rgxError.IsMatch(line)) - msgType = EMessageType.eMT_Error; - else if (rgxWarning.IsMatch(line)) - msgType = EMessageType.eMT_Warning; - else - msgType = EMessageType.eMT_Message; - - fileBuffer.addLine(line, System.Drawing.Color.Black, msgType); - } - - fileBuffer.addToTextBox(fullLogConsole, false, true); // add full text to the full log view - logFilterMgr.UpdateTabs(fileBuffer, ref toBeExecuted); - } - - private void openSlidersWindowBt_Click(object sender, EventArgs e) - { - formSliders.Show(); - } - - private void openSettingsWindow_Click(object sender, EventArgs e) - { - formSettings.Show(); - } - - private void openToggleButtonsWindow_Click(object sender, EventArgs e) - { - formButtons.Show(); - } - - // ----------------------------------------------------------------------------------------- - // ----------------------------------------------------------------------------------------- - // MIDI - // ----------------------------------------------------------------------------------------- - // ----------------------------------------------------------------------------------------- - - private void InitMidi() - { - lvMidiLog.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - lvMidiLog.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - lvMidiLog.Items.Clear(); - - if (Midi.InputDevice.InstalledDevices.Count == 0) - { - UpdateMidiUi(); - return; - } - - midiInputDevice = new List(); - for (int i = 0; i < Midi.InputDevice.InstalledDevices.Count; ++i ) - { - if (Midi.InputDevice.InstalledDevices[i] == null) - { - Console.WriteLine("No input devices {0}", i); - continue; - } - else - { - midiInputDevice.Add(Midi.InputDevice.InstalledDevices[i]); - Console.WriteLine("Adding MIDI Input Device {0} - {1}", i, midiInputDevice[midiInputDevice.Count - 1].Name); - } - midiInputDevice[i].MidiTrigger += new Midi.InputDevice.MidiHandler(this.OnMidi); - try - { - midiInputDevice[i].Open(); - midiInputDevice[i].StartReceiving(); - } - catch (System.Exception) - { - Console.WriteLine("[Error] Device {0} - {1} is already open!!", i, midiInputDevice[midiInputDevice.Count - 1].Name); - } - } - - UpdateMidiUi(); - } - - private void UpdateMidiUi() - { - int numDevConnected = midiInputDevice != null ? midiInputDevice.Count : 0; - - statusLabelMidi.Text = numDevConnected.ToString() + (numDevConnected != 1 ? " Devices" : " Device"); - int idx = imgList32.Images.IndexOfKey(numDevConnected > 0 ? "OkImg32" : "NoImg32"); - if (idx > -1) statusLabelMidi.Image = imgList32.Images[idx]; - } - - public void OnMidi(Midi.MidiMessage msg) - { - bool buttonPad = (msg.Mode == 9); // button pad with button pressed - bool sliderPad = (msg.Mode == 11); - bool isSlider = (msg.Code < 8 || (msg.Code > 15 && msg.Code < 24)) && sliderPad; ; - bool isButtonPressed = buttonPad || (sliderPad && !isSlider && msg.Velocity == 127); - - if (!isSlider && !isButtonPressed) - return; - - ParamsFileInfo.CEntry entry = null; - ParamsFileInfo.CEntryTag tag = null; - - //Console.WriteLine("MSG: CH {0} - Mode {1} - Code {2} - Vel {3} {4} {5}", msg.Channel, msg.Mode, msg.Code, msg.Velocity, isSlider ? "- Slider" : "", isButtonPressed ? "- Button" : ""); - - int pad = buttonPad ? 0 : sliderPad ? 1 : -1; - - int key = ParamsFileInfo.CMidiInfo.CreateStaticKey(msg.Code, pad); - entry = ParamsFileInfo.CMidiMapping.GetEntry(key); - if (entry != null) - { - tag = entry.GenerateEntryTag(); - if (tag != null) - { - if (isButtonPressed) - { - sendMenuCommand(tag); - } - else if (isSlider && entry.SliderParams != null) - { - float t = (float)msg.Velocity / 127f; - float v = entry.SliderParams.Lerp(t); - // Send commands - tag.ModCmds = new List(); - for (int k = 0; k < tag.Entry.Data.Count; ++k) - { - string s = v.ToString().Replace(',', '.'); - tag.ModCmds.Add(tag.Entry.Data[k].Replace("#", s)); - } - sendMenuCommand(tag); - } - } - } - - MidiLogRequest(isSlider ? "Slider" : isButtonPressed ? "Button" : "", msg); - } - - private void MidiLogRequest(string text, Midi.MidiMessage msg) - { - if (currentSettings.DebugMidi == true) - { - ListViewItem lvi = new ListViewItem(lvMidiLog.Items.Count.ToString()); - lvi.SubItems.Add("["+msg.Device.Name+"] " + text); - lvi.SubItems.Add(msg.Channel != -1 ? msg.Channel.ToString() : ""); - lvi.SubItems.Add(msg.Channel != -1 ? msg.Mode.ToString() : ""); - lvi.SubItems.Add(msg.Channel != -1 ? msg.Code.ToString() : ""); - lvi.SubItems.Add(msg.Channel != -1 ? msg.Velocity.ToString() : ""); - - lock (lockerMidiLog) - { - scheduledMidiLogs.Add(lvi); - } - } - } - - private void UpdateMidiLogUi() - { - if (currentSettings.DebugMidi == true && scheduledMidiLogs.Count > 0) - { - lock (lockerMidiLog) - { - foreach (var log in scheduledMidiLogs) - { - lvMidiLog.Items.Add(log); - } - scheduledMidiLogs.Clear(); - } - lvMidiLog.EnsureVisible(lvMidiLog.Items.Count - 1); - } - } - - private void topToolStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.resx b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.resx deleted file mode 100644 index 38d1b4432f..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Form1.resx +++ /dev/null @@ -1,4145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 473, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAPjtJREFUeF7t - nQd0FNeWrnvuunPfe7Nmzbw7b+5Y3UqAwWBLLQEiR4WWhEACEQUKRAFCgMg5GDAOZIyNAzYm52wMBkw0 - 2BiDDZgoco4mOQeh/f596lTpdHV1qwX4OnHW2gskVVdX1f+df+99qlqyPR6Px59+tGwZ9rf4jJDZ8ekh - mzhc6SHLXemh77gygyfg3/5xGcFproxSNZJaBvxDvuTx+CONuIyQFq6MEErpWvpKw86lrjfMLnUlsV3o - HVdm6E/8fbfIDL0hIAEc8RmhTR9D8QcYcenBrVnc0aur0EubqmmxUYux66rQ8KWVqN/bEZQzKexWm8Hl - LiZ3KX3VBMcxxJS4zJB4dhO528fj9zJg/5ks5Ni1VWjunnY0a3c6vf1RS3pzZzN6/cPGNH1HQ5q8NZrG - f1BTQPHixqr0/PoqNHh+Reoy4em7zfKevKQAcSc+M/hthmHUKNtf5Fs8Hr/loQPwwrqq9OGp6XTixjY6 - fm0zHb7yHu2/uIJ2n51NW/On0tpDw2nh3q6AI41eAxhTtsQABgCxoSqNfa8K9Xk7orD1wHLX47NCv5cw - XEANMTwxM9Qu3+rx+C0OHYAX11WjdUdG0Mdn36a95+dD/GV06Mq7lH99i4BCD4bjswuLaUv+FFq+v68A - 4tXtDeEQtTUYkDZ6veEsaNbryevYbyHiZ8TchKzgcPmWj8ejH6P+EhQWXdYeFpMYEBaTaw+Ped7ujJ1h - D4tbbQ+P3WQPj9trd7qO4P/b5QuMoQMwbn01mrKtBr28vTZN21GfXv0wFjM9nt7c1Yhm72lDKw/2gRNM - ok/OzaajV9/XgLjOQHxAn5ydA4cYSTM/TqdXtichVVSnF96vSiNQP7R9tvy9hKzQH/g90FGsRNH5jHzr - x+NBR2Bk3FMBYXHtIPTbdmfcZ47wuB8hLhnhdBUGVm5cEFIjs6BMvVwqU787BUWlksMZf0vuwhgGABuq - 09QdNbXYrsUUPQDGZBkvb69L03cm0pw96fT+0TH06bl5whUYhmOA4ePTM2nlgUEApwVN2lwfIFShUasr - U/ZLFb5LaBv6A97vviszZH5s26BAeQiPR3EjxFnn7xA5zeGMme1wum7pQgdWSi6AuIUVkl+iiLQ5FNVx - A1Xvvpdq9ztJdRB1+2vB/y+fNMoSAMzKXAZgwqYaNO3DWka8rIcOhQRDBWLSVgaiHr2+syEt29+T9pyb - S8c5ZQCGA5dW0fuHn0eKaEOTN8caIHR4vsJ38ZlIC5kh36JgHPq4c/AyHFEp/4bZnQHh1+Lfn3XBy8UP - oYhW71C1rjuF0Cywa8gpShl1hpo9f47Sx5+nDlMuUM/XL9PQ2VdoxNyraOOu0DPJY60BSA/JYwAmfVCD - Xt1Vm17ZWcstpnGoUKgw6M4AEBiGqdvq0hs7U+jdQ0NRQywXIBy5uhH1wlR65+NMmgIQuIPg1rLVwHJf - 8/sijvJCkzycxyMoPC4Cok+HjX/LogdVaV5QodFLVKXTRqrd9wTVG3CSkkacppbPn6VOUy8KgV9Ze5Pm - b71D735yj7Z/8Q19dPRbEbuOfkO7jnxDU9bcoPDGz1NgRIJXACZvrkHTP6rtFgyEHmYgGAbVFVQQJm6p - DmeIpfmfZiNFzDdA2HDkRXprZ2sav7GOKBb7znRSw06lvuG0EJ8eOulP7QYBztgkzPQPWXRHROL9pxKG - U+UO6yH6SYoeeIqajDlL7SZfoDGLrtHMTbdo/b57QlxdbI4P9n9NqwHBoh13xDZTVt+ksYuvU+83r1BE - 6osUFOkdgKlba9Lru+uIeO1jPWqLMANhwKC6ghcQpm6Lplm724jaIP/6Vjp46V1afWA4Td/eBG5QjUav - qUxZI58SRSJA2BOdERgkD+3PMRxhsSn2iPjDYrZHNb8f3vwNqpF3kOrC3hvD1ttNPE/jlt+gpTvv0I5D - X0NontXf0vq9X9G8rbdp0qqb1G/mFeo6/RJ1mnaJ2sH+MyddoFbjzlOzF85R4+fOUqPRZ6lSi3EUXDHx - FhH9i3xrMXQApm2rRW98UqcoJAzuULjDoLqCGwgyNegQTNhcnSZvqUtzP2mPFnIpQNhGu8/MwdedaNKm - WHpuXRTlvR5OKBJ/xLHcdmWGNpKH98cd9oi4unZn/D4WPqRam/sRredTzT75FIPZ3gK5fAjy94Jtt4Xo - PNO3wdoXbr8jZnTua5epPYTOmHiB0hEseNspF6k9UkLHly9Rh5cvUtbki+JnLV86T6nYX5W0iRRSKbHA - GwCvbK9FMz6tS2/uMcUnyOsmIFQYrByBU4OVGzAIU7fF0PL9/eiLy2vp6JWNtB6F4mvbU2ns+qo0ZHFF - apJb+juREjJCxv0hVxODImMDkd8X6DPe2WoW1eydj0LuNKVDrIkrbtC6T+/RzsOa6Au23aFhc69RJ4jK - greZcF78qwvOs77Lq5co57VLlIvCr/ubl6nbG5cpG9/jn7fBts2x3+ptJlNIxQTo7wWAHbXprb31jJjx - qR7eYbACwagRVDcwQTD+g2r06vYGtC1/GuVfgxucnk1v78qklzbUptHvRlHmiKf0peXFf6C6YNRfHM7Y - Hpj13zoiEgqfbjyJavQ6IvJ7Gwg07d2btPHzr2gnZvvaPfcECJ0hbjoEZzvXRefZnf3KJWH5uRC6x4zL - 1OutK9T77avUZyYq/nfwL/7fY8YV6jz9MrUFBGkTLlDNjCkCAHkwxsBF7s0X++299WnmPi3e3lfPCHcg - TDAUA4LZDcwQTNxchxbuzaFDl9ehNlhLi/f2RjfiojFro6jzhKd5FZFjQ3TLf/y7PNzf57A/HRtqj0gQ - BV7pet2pas4nVAfFXYux52jcsuua8JjxKz++R8PmXKW2sG+27tZo6bJg7/pM10XPg+gseF8I3n/WVRqI - 1wyGSwzhmHdNfN0brV83OEJ7ANMa8HgDIC4zuC8DMOvz+vSOHp9pMZNDAcISBhMIJYVg3CZ2g4a069Rb - dOzqZnrvi7E0bUuygCB3WhjFZ4bcd2UE745u4/hveci/r4HqvqWY9ZFJhc60OcjzJ6jB8DOU98YlWr37 - rhB+FYQfCtFY7BYvnKc2LDwqfp7tbO/dkPP1mc4zfMDsqzRozjUh+lAIzjFswXURQxGD8P0+2C4X1X8H - uEWbSRepVuZUCo6M9wrA7APRNHt/UcziUICwgoFB0B2BU0NRjWByA5kSvEHAt6Anbq4H8cfQ8Wtb6YOj - U+m1bc1o9NoquE7hFJ8VUoBjPPK7giAsrOXfUN2/zbO+VO1sMet50Ybt/s31X4ri7t1PvtKExwxt+aKc - 8RCeCzkWnnN6TwjP1q7OdFXw4XosLIrB8wEAts9FGuj46mVKn3KJ6nWe5ROAuQdjRMzRg4FQoDDDYAmC - mxuUHIJxm2rSwk9z6QiKw50n36I3dqQJCHi9ICEr5GcUhvt+F+ngH2HRAQ5ngqjwyzd6Cbn+OCUOO01D - Zl2h9/d9RdsOfk1T19yE1V8QrVorQME5niv7zpixbN2q8Dzb2drFbJfCD1MEN2KR9u+g+dcFAN3hGB3h - HulIIfU6v0NBES6vAMz7IsYtdCAMKCQMhjMoIBSlBnc38EgJPiDgVMAQvLihGs3Y2YoOXFyN4nAuvb69 - pSgMhROIdBDywW+6MHRExJS3OxOuOiIbFEa0WUK1YPmpY87Q9LXarF/y4V3KRS5vitasOcRPQ4HHs17P - 8d2R49nqRX4XVq/N+sEQnyEYgtk9dIEGwlCIzcEwGAEIBkkH6PbWVQBwBQBcorrZvgFYcDjWiPmHikIF - QnUGNxBkangYCMZ/ICGQzxhM355Cn19YRR+fnoM2sSWNAgS5057hzoALw8W/yRbRERFb2RERfzewUkph - 5U5bxWJOFqr4xTvu0FbM+rEQJw2zPWXMWYiv5Xp2ARaf27geaOF6oXjri/zN4g/kgPic0wdBfI7B89ji - r9MQAMChQ6DGAGzTa/Y16oZCsQM7APZfFw4QGBHnAQAKrGEMwKIjcbTQiFgRZiA8QJCOwKlBdQM1JXiD - wCgMAQBDoBaF/NQR305+ZVtyEQTbWtCoNVHUaVwFhoB46Viewm9j2J2x9RxO1/fo7QujsndRLNq7Xij0 - 2PLfQ1vXHbbOwjdG6IWeh/g881l8zN7+EJBjAOx/AAAYCPE5BASY4QzBYAAgAqJzDJH/9sc2AgDpABnT - LlO9rrMEAKVKRf9vechi8IXkC7r4WJwWR+NokR4KEN5AsHIDfyAwugO4AENgrgfYBfgO4rStSfTZ+RW0 - I38GuoMm9OzqSpQ58il2AUAQ0lKexq87xHKu0/VzSPUMqtJ1jxCf78TxrJ+z+ZYo8pJGnhHis+3rxZ5q - +3ko2Lh16zMTAQj6AoK+cIB+ELIfIOgPCBiEAXO1GT4AAAzkAACDTNEP2+TNukY57ACvX6HMVy5T/Zw5 - AoAnIhL+Rx62GDoAS4+7RCzR45jLHQhfIOhuoEDAbuALAqNFLCYV8N3DaVsa0f4La2jD4Yk0eVMSjVhV - iVJ7lObO4OvEzKCy8lR+nREQ7oqG+AWi0u/2GbkGn6LnkKO50BuPHr8pev3EEWcoeTTER94XOR/tnqj0 - RV9/RSza5GH294JgvZD7ewMAzuEcAgLUAQxBPwDAIWDwAgH/vy9+1hPgdMX+OmL/mdOvUD0A4HB6B2DZ - iXgt8rVYmq8AIWGwAsHDDbxAUFQTaN2BSAUMgakecHMBmQoYgtd2NKcvLq2nFZ8NpZfW1adBCyMpsV1o - gSszZO+vVhQGPBMThpz/nZj53Q5Qg6GnadzS67TlwNc0Yt5VMevj0fM3GnWGUgGCUe2jKuelWq72u6NX - ZwB6AgCOPLgAQ9ALEPQWEKCgg5h9AEBfAQFmOATurwcA6L/gBg0wAh2ADgD20wH7z0QdUL/bbJ8ArDiZ - QMtPxmuhwyCBYBgMEKQjcGrwCgHXBRbpQIXAox4wpQKzC4xdV5Xe2dWeDl3aQHM+yqEx71anHq+F/Xr1 - gCPMFeKISPwyKKpZYVTn3WLmT15xgzbv/5oGQkhu+1wAIunZM9TkuXPUAn0+L+vycm4ntHpdIAqv2fPK - Hvfr3LL1gPg9MWvzIFweAOgF8Tl6MwA6BJj9IpDn+0H8fhC8vwwWn4HoDQC6z74OAK4BgKsA4IpIAb4A - WHk6gVae0mIFhw6EBQhGajC5gTcncOsOAABD4CsVaC6gQaC6AN8wWrgnDzXBKnp9WxqNXFWZskY/pUGQ - EZwgT+mXH6UqRv/fwIik047IhoWVOm6n6AEnaezCa7Tps69Q+F0WT+jEDDlNiZj9XPhxr58m8v5FsTSb - /epl6goAusIBcjBDuyF0CLoDgh6oA3oCgp6AIA8uwAUdQ9AbAPSGA/ThgMh9GQABwQ0R/RfeoL6AoJcA - AA7wzjXqiEIwC2kgpscCnwCsPpMoYhUHwyCBMGBQQVDdwA8I3FpEUz2gu4CRCny6QBV6YX1N2nh4Em09 - 9hpN2phEw5ZXpOQupQriM0MupnRx/Js8rV9yjPqLIzJpp8MZT5GZa6lO3xM0EKJ98PlX1B22Hj3oFEUP - xuyHAzTE7E/F7Od1fb41y7O/4zQAgNzfGdEFAHQFMDl8Bw8AcORCsO5wgR4CgGuimBMBQXvNgbgQn2c4 - A9AH4jMEIiB8X0DQZ/4NAHCDumNbDYBr1PaNq+TqvdwagIyQlxPbhv685mwD0kIDwQwDg6A6guoGWkqw - gEAWhmqL6C0V+CoIVRfgZwcmboyjveeW0bK9g2js2jronsK19YHM4AnytH654YhMfIlX+MJazKGavU4I - 0Xnm93vrsrizV2/gSYoFAFz4paDw4wWftHEXKAOFXzvk/o6o/DvhNdnTL1NnuABD0AUztCtcIGeGtniT - CwAYgu6AoAdcoAfE74nZn4foxSEhECBA8D4sPAccgP/Nw/dzsU0XgNMR+2k34xrF910uHiS1AqBhp1Lf - rz3fgDjePaeFCoMBgskNvEGgdgfGOoG5HjC7AEPgpwuMeS9KrAt8fn4NUkEbGrGyEqUPK8cQFPyiXYEj - PDbBHh5X+GTcUKreM5+yxp+jDejzn517leJg+bzWX3+QnvvPGvbfenwRAO35gQ3UAB0BQSe4QDYgyAYE - nQFBF0DQFS6QAwh4EScXAORiFneHkGzpPTCre8rIm6vN9F4AoDcHhOfoheiJ7+dimy6zrlNH1AHt4ALx - /XwDsO5iEr13oSjcYSgCQXUDDwhkOlALQ7UoVF2gKBV4dwG3jkCuCzAAzwGAMe9VpaV7B9Lmo6/ShPcT - aeDCCO4K7sdnhK6Xp/ZoB+d9FH13g6ulo+I/TMkjTtPSD+/Q5JU3KBGCiyd0UQtw7k8YzvZ/VjyO1Zxv - 8kwAAMj/fG9eQAAXYAg6wAV4rb4TevVshIAALtAVAOQAgBwA0E1AgFAhwOzuiVnOMz0P4nMwCCw+Rw8G - gB0AhWAnQNB+5nVKGLhaABBcPt4hT0kMHYD1lxrSekDAocKgg6A6glcIZE2gdgdWqcCrCygdQXFpgG8X - v7C+Du0+vQBdQS4Kwijq+JK2SuhqE1JHnt6jG46KjdaIvN9uM8Vgpk9bfYNmbrglQKjVV3v2vj5SQCxg - SID9Nxx1lpqg9WuB/N8a1X86AMhCDZAFB2gLANpNu0ztUQwWQQAngAN0hgNwdAEE3MblwAG6QfxciJ8L - QTm3axBoM51DQADh8xbexL83qTu+7obvd8V2DEAHAJAoAeBPEGlnpA0dgA2XGxLH+xwSBgZBh6EIBOkG - VhDIwlBtEd1SgdeC0LcLeEsDo9+tjFSQRp+cWUyTN6bQ4CWRlNQxlG8YfSxP79GMAGdMQ7545ZOnUo2e - J6j365doze57lAZ7r9XnpPZBDGH/p4T9J6L/5wcxGQB+HIufyElHCkgHBBlwAIYgiyFAGmgPADQIrlAn - OEAnQJANF+gMB+gC++ZCToPgOnUDAGzt3SE+B8/0HhC7J9s+8n8egv/tga8ZgC7YJnv2DeqA1yYO0gB4 - IiLa7TN6GgClv994tRGJuNKINlzxBMEKAsMJ9JpAdgd6PeDmArIreDAXsE4Do+ECY9ZWo/cPTaDFewbS - qNXVKXuC5gIJWaGx8hQfbvwjLPrfHRFJt4OrZ8L6j1LLsWfF2n7uKxfFc/r67K87gKt/ADDsjAAgecw5 - CcAFAQA/ldMGAPCt2YyplyiTneCVy9QWLtB++hVqDwA6AICO6Ns7AYBsOIAGAZyAIYALMADdAADbey7s - n2c6BwuuQXAT/4cDILrh+10BQfacG9QRr2sw2DcAH1xLJo5N1xrRJhMInB58QqAXhmgRrVKBNxdQOwK3 - dQFTMegrDYxaU5kmbIinXSfn0JRNqTRkmeYCOK8d8hQfbjgqJb+Cwo8isjZSNIR+a/2X9NKS6+LpXX66 - h5/b59lfF1/HMADo/YUD8I0fdADNUAO0RBHYauJFaj3pYhEEACATLpAFF2gLB2iHaI86QEAAADoBgGwA - 0Bku0AUAdMUszmEAODCzeYbnIgQEELwHiy+jOzsAAzD/JnWed5M6AYKkIdYAuDKCZzIAm28k0+brWniA - IN3ACgJRGFqkAksXYADcOoLi04DPboABQBrgj5yt2DcCReEQGrmyGrV/vrxwgbg2QRHyNB9sOMJcIfaI - +IIyqPqrdj9OOS9fpPlbblMyBK7Zu2j218Hsr8cAoACMYwdAAdgQKSBl7HlqCgCaow1sAQhawgVaAYLW - qAXawAXSAUEGXCATLpAFB2iLaAcI2sMFOgAC7uE7vX2NspHDO7+jVfVdIGZXAJAD8VnkXBksOoufi+jG - ASgEAPhZNrZtONQagLiMkHmNAMDWmym0heNGCukwCBB8QMCFoVs9oLqA7Ao8XKAEacBbN2CuA56FC4x/ - 30UfnZxHE99PpoGLuCMIuY9zmyVP88GGo1LjDY6IBlSx0x5qMPQULd1xhzpNPi/EN89+zv8xyP9x6AAS - Rp6lJACQ/BzSwAuAAAA0BwAt4AItAUCryZcobcolQHAZEFwWEGTAAXjNPgsAtEMd0B4AdIALdAQAneAC - 2UgBnTH7ubLn4s4NAojN0Z0BWKRD8CV1xfe6CAhuUpNRG30CsO3LxrTtyxTaijBAUNxAh0BNB24uIFOB - Xy5QXBrw0g14qwMYgGfhAsv3Dae5H+XRsBWVqfXQsvwE0Q9JGWX/Q55qyYbDGV2Be/5ySRNEzz8Kvf7L - q26IW71i9uvFn5z99QefFgC40AEwAA1Gn6NGACAFdUAqXKApf1JHQAAnYAjgAmlwgTZwgTYAIB0AZMAB - MgFA1htXqS0AaA8H6IAQEMABsuEADEFnuAAXeJzjcyAuz3ae9bmLvhTRjQMA5OB7XRFdEKljt/gEYMft - xrT9lhYCBDME0glETQAAGAI9FXh1AaUjMNYF/EgDftcBEgCuA0aurkTj1rto0+FX6KV1iZSnrQ6SKz24 - mzzVko3ASqmbHZFJVDH7M2oy8jSt2HmXWqKvr9ELs1+xfy7+6snl39hh7ABnKP7ZM9Rg1DlqiEIw+fnz - 1AQApKIYbAoAmk24SM0BQEu4QEsA0ArtYBoA0CC4AgiuAoKrlIU00HbGNQ0CpICOAIBbOi7qOkP8Lsjt - PLt5lucIABTxF+PrxQAA0ZUD32v6vG8APrzThDh0ENgRhBuYIBCFoTcXUGsBL2nAWzdgVQdYrQp6KwQZ - gJGro+jd/S/S61szafDSSErOKV3oygz5XJ6q/4N/AYM2+8eL2T9h6XUaPPMK1YLwAgAL+49G/tcdIB41 - QsIoLQ00ggOkIA00fvECpSIVpI6/SE0BQbNJl6iFgOCyhOAKtQEA6XCBDLhAJgDIggu0xexvx3f1UAhy - O9cJ9p8NADivc37vAvF5lufA+nMgPIvO4ndbIkN+3eKl7QKAwLDoivI0xUARuCC5c+nvdt1LpZ13NQg4 - DAgUJ9BTgdkF9FqguDRg1Q14qwP8WQ8wAOA6AADwgyJTNjahNfufp5GrahrFoKttmRB5uv6NwMqpSxwR - iVSx46fUeMRpmrf5FjVCbq+el+8OgGL/DEAsCkB2ABdSQAIKQU4DSUgDjVAMJgOCFEDQWIcA9UAzANAc - tUCRE1yh1gKCq4AATsAQwAE0CK5Te7hAx9lo6+ACDAFX+OwCbPE8y3PE7NfFv0XdlhZFi3E7LAGIzwxd - lNKl9HcffZVKHwECFQQ9HXBNwIWhLxfwlgZKUgd4FIImAEQhaLEgpAIwZk1N2vDFFBq/vhH1ma2lgfiM - 0H7ydIsfQWGJ/2WPSPj5ybiRVDU3n55feI0GzLgM4fMBgLR/U/5n++fZLwAQDgAA4ACJSAEMQEOkgUYM - ANIAA9AEDmAAAPFboBBshRSQ9qoGQBuIn4E6IBMpQAAA8dtB/PZwgA4Qv6NwAK2468w5HsKz1edA+Bwp - fO6youi+/Ba1mqABwE8wyVMVgwFo3qPs3d1fN6WPEToEajpQU4HZBbymAS91gFU7aC4EDQCUQrDYTkAC - MHxlRZqzqwfSQDuxMpjSrXQhisFd8nSLH46KjQfyhXJmbqUG6Ovnb75NDZHbqyEV+Mr/OgAiBWD2JwKA - BgwAUgADkIw6QACAOiCVAUAd0AyzvwUAaInZ3wqzP43Fx+xPh/gZmP2Z+uzXxefZD/E7KeKLmS/ELxKe - Be++/Db1WFEUaRM1AJ4Ii3VbIRMA9Cx755Nvm9Lub4ogsHQBWQvwiqHoCCQAbmnAog7wpxAsrhMwA6B3 - AmorqAPwwto4WrlvNI1YUYMyntXuEvrdDTgqpVwNqdGeKnU9Rn1ev0TD3rlCNTDzVQC85X9h/yoAPPth - /zz7k2H/KTz7Yf+pmP1Npf3z7GcALGc/xNdnvxAfs5/Fz1Zmvqf4UvSVt6knxyot0iZ5B6BFXtk7n37X - jAQEDADSgeoCei2gpwEDAJkGvNYBpkLQAEAvBC06AQMAuIA/S8IqAFwIMgAjVlYVxeAL7yVQ7uviswSE - YjdZnrL3wc/180Uq3/htqts7n15bi/4ZHUC1Hmz/pvxvAsCc/xOR/1UA/LJ/FIDpDIDV7Fetn/t7w/aL - xFeFz1t1h/JW36FeMtpM/tAnAHu/b057vgUE7AISAHYBIw2Y6wATAHod8CgBEK2gGwCeawFWAAxdzmkg - DwVhc+q/0MmfLSyMywieKE/Z+wiMajFb3PHruJ+aPXuaXlp0jWoDBA8ATP2/CoBf+b84+zflfnX2u1k/ - F3tm8THbhfBrEO/eod4y2kwpAQBKGlDrAHMh+NAAoBD8pQAYvz6J5n7UmwaiDkjtVYZvDh2Up+x9BFZs - dDe0Tk+qDPsfPQft2AvnqEr34xIA6wJQXwDyVQAWl/992b+a+9XZL9o91fZV8aXofdbepT7v3aW+iA4z - 9pcIgGId4FEA8As6wKhVtWjxJ0NQB9Q06oDo9qXcPhTjNrg9EvafOpvqQegJS65RPOy9anc4APK/GQCr - AlAHwGcBWFz+92L/nRgAi9nPBR/PfmH7uvi68Ou06Lf+HnV8+4A1ABkhy/QagAEQhaApBfzeagAGYOiy - ijT/4/409l0XdZ6if5yslFsL7DaCo1q9wBfI2W4PNUHvPxzFH898DwAeqAPwXgAWl//N9t+F1/hl7ldn - P+d8tn0x86X4LHz/97XInnVIAMCPtclTFgMXZmMLdAFm+3cvAr10AQDAowsAAMV2AQCgpF2APwDoXQAD - wLeF39zWkcata0R5M+XnBzJCMuVpe47Ays1PBFfLosjso9T/DVjz6LMUlXvcbwA8OgAA4K0D8FkA+sr/ - FvZvnv1s+6r4Azbco4Ebv6Iucw57BYDbQKMFtCoAi1kH0ADwXA7+tdYBGIDBAGD8umR6eWMa9V+kFYJe - P0DCH5i0O+Pvl4l/nqpB9FHI//HI7yoAXtcAStgCeusAfBaAXvK/Yf/I/Vzpq7NfFX/Qpq+oqwSAn26S - py2GDgDbviq+txbQ5/0Atn/TSqAGgMVKIAAodiUQAPhzS1hdCdQAiBQAjF4Fd9neRQDQqEupQld66Cp5 - 2u7jiYjoGnxxKjRfRtF9T9DIWej9IfoDA2BqAQ0AvLWAXjoArwWgOf/rAPDsBwD67NfFH7z5a8qZJx0g - LK61PG0xdABYeLP45tnvLf/rBaAAQM//ft4LMADA7H8U9wKGrSgCYPjyqvTKpnTRCjbtXYZcmaHH5Wm7 - Dz3/h7f7lFKR/ztOOE+Vc47/vgDg/P8AAMSlh2xpmVf2ti68h/hK7ldnv+UqoI8C0A0Atn/Lm0Fa/ncD - QOZ/FYAXzHcDAQAXgGYABi6JoAGY/QxA2hDxfMA9edruIyiq9W7UABTR6SjlToVYw049HAC/pRQAAAZ9 - gBQw1zcALLouvHErWLV+i4dCPGa/pf373wGU+HkAAKA+D6ADMIQBWFoEQL+F4ZQxSrSCZPmbRQIrpX4Z - WiePKqIA7PfaRXL1P+kBwD+lCPQGAIpAb2sAJS4CLQBo1bvcl7rwxsMgUnyj8JPW7+2xMLfZX4LnAs0F - oBsAbh2ACoCW/80PhHD+dwNgcREA7V/UPkSakPWk2wdjtN/mFR5XWCb+RarW7Tj1nHaBqnc//kgA4DbQ - CgC/2kATAH63gTINmCHoOu+YVwAyBpa/yjPeLLwx871Yvzr7/XkYxN/8/yA3gtQ1AG4BBy2NKAJgQTh1 - mKA9G+Dxp2u0hz9iqVyTuVQ3L1+kAL4RxKuBlgAUtxBkAkBdCLICQF0I8nUfoNiFIHUV0AQBR+7is94B - GFD+qij0pPBqzldnPouvWr+v5wF92r+a/03275b/fRSA3jsACQDb/2LkfwlA9mT98wImALTP+6EDaPke - xfU7QRnPn6WKXSQAcASxFGwBgF/PApgA8FgKNgHwsEvBwgUUCPRlYI7cxecFAHA7t8UQBiCxbejXrfs+ - dc5XpBlR9lxan6JoqUZvLVqokVf2XPO8J92j55PnmpmjhxZNRZQRkcrR3T2a5HKUdouUbu6RzJFTFI1y - Sp1rmF3qGgMQmx5UTZ66NoKqtBH3/5/J2EWNhpyiJsNPeQKg3Ayyuhdg3AwyAyDvBXAa0G8G+fUsgJc6 - wDMNuLuAGwRyVZBB4MhZZA0ALsp4/c/G/jnCtBwcWDVzOl+Y8A5HqMmw05Q06CRV7HxMSwMWAHjcDlYB - 4DqAAVBbQRMAD3M72EgDigsU1QJFEIh0oIDAkbPwnCUAf/oRWKXNGkdkIwpvf4RSMfs5DbgBwHUAAOA0 - YAmARSto9TyAr0LQ7zSguID6NFBRKpAQyM6AQdBh6DpfAuCM6SJP/fHgEVil9UeBUS0FAM1GwtZ75VMk - A8BpQO8EVAAeoBPwWQcUlwZMLmDUAnoqUJzACgTdFTrPk0VgeEyePPXHg0dg5VYHgqpmUBgAaPnsaarZ - 47gnACXtBIqpA4pLA74eCzNSgV4QeoFAB0GL25Q95zEAlgOzPz+oaqYBQHUIzncEvRWCVp1AsXWAn2nA - 14OhHqlAcQL9+UBRGCogqNFx1hmvAHy5wFbtziLbpj9L3F5kGypPXQMguGZXCmunAVAFogsASlIIWtQB - fqcBKxdQagHLVGAFgXQDNxAEDFp0eOe0VgOExfSRp+427iyxvYULQ3eW2n76aq3tSxHveok1Sqw2xSqL - WGkRK5RYbhHLTLHUFEssYpEpFppige3L2wtt9xFz5GlLAGp0pWfaHRYARHU5SnxPwGch6KMO8CcN+OMC - RkegpwKGQKYCHQK9JuDCUHQHuhtIEAQMMjrPu0pP1m1T4HC6bjvCXB6flKFRtr/cXWH77PZiG/18wEZ0 - GnEKcRJxApGPOI44ijiCOIw4hDiI4O05Pkd8htiH2IvYg/gEsRvxMeIjxC7ETsQOxHbENsRWxGbEB4hN - iI2IDYj3EesR7yHWIt5FrEGsRqyUsRyxDLEUsQQBiGkhYgFiPmIeYi5iDmIWAF9oK7i1yPayPG0BwHFO - Ac+0PUypfBNIAuBvHeBvGvDqAqZaQO8IPFKBqR5wg0C6gRsI0hUYCD3Spx+i4CrJDMEp/p1H8hIY48ZS - 27/fWW67Aheg+yxyceJ/gXgU4m9BPArxAa8v8ekdGwmXW2grejAksHLLz4OqZBgA6A7gqw4oSRrw1wX0 - jsAjFZghkE5QHAgCBj0Agwj8v9mLO8kRkXDf7ozbxvdB5GUwxu2ltpDbS2zf38UFLmTBH0T8TxGPQvx1 - iEch/mwExC+cqQFwa6Gt6KNigVFpuwABPQ0AUoacoqo5x8jZUQLwMGnASzFodgG9I7BMBUo94AGByQ3M - IIgADFaRNGSNqAcCwmPfkZfBbXy5yFYdF+o+6gCiY4g/gPgE8QukAyDNFd0PCYpqvZoXgp7OOkwNB52g - 6gKAIyVOAyV1Ab0j8FYQekCgOAEXhtwd6CnBDIIBg4+o2/V1WRTGDpeXwm0gFbTji/UNC/MoxP8Q8SjE - X4F4APHpbdQ2egpYYqsnT5MBSJvGF6JC1iGK74s2D1bPy8J+pYGSuoDSEbitC+ipQC4O+YRA6Q50NxAg - KI6ghwqEGvrPo1o9K1vDuDR5OdzG3eW28XzBvmfBzOLvR/yzxF+FeEjx6S0b/Yg6gM/n3lJb0a/Kc1Ru - 3oMvwlOtdlLdnsepTg8NAK9poLhi0MoFlI7AfV1AgQAuoNYD3iDQF4qEGyggGI6gwOAzsE3mm5fomQbd - 7zuccT+hM7D85Yp3l9nW80X7kcX8HYtPM2z0Hb6Pc/kZx/JXeXo2G39QggEom7pG2H8cXICXhdU04NMF - 9GLQ5ALmjsBtXcCcCpR6wDsERd2BgEC6gQcIOgx6QGi3kN/nbThav3KGytTR2kPzL5HkgQv+N3QFR2Cb - VMAiP6z43O49CvEBZUnEpzds9DW2u7PIdlKemjaecLrKMABlGs6iSpjxDQacEItCPl1AFoP+1AJu6wJe - UoFaD/iCQHUDFQQ3R+CQdYIeOhjq98Q2cvum4w+iPUwpsDtdZ/j3I8hLY4yvFtr+GxB8CTeg+9zeqeLz - 149CfG73HoX43O5ZiM9xd77t/q1FthXytOSIjv6rPTz+fmjMC/RM5iFKHnxSLAqZXcAoBr24gLkW8FgX - UFOBaW3AKwR6YcjdgZUb6CDI+sCAQQLhM7ANbysCr2v47IdoD+MLHeGuXVbt4ZcLbRXuLLb9eA+iFLLo - vzPxC1/X8r9bC6gPR8XUa8E1u1P5jEPUaBAAQEvI9wbcikF/XEBZF7AsCE1dgdoaFgeB6gYqCKoj6DCw - Mxju4CXENnJ78VrsI6b3ShSFcYAgdom8NG7j7lJbPFqowq9ZLF/ic7v3KMTndu8RiE8Q/yd8zQDcXmjz - rHUclVrucFRqTuXTuRM4IYQXaaAkLiA7Am8FoVU94BUCtTsACPo6ge4G3kAwYFDcwTKUbfTX8T54X9Xb - v6Z1BmExo+XlcRtwgZ58Ib9l8UoqPsc/S/w3EVJ8mo4CUGsBC66stXn+VRFHxWaj+KTLtfqIauQcpWoo - Bv1yAaUjsCwIGQKZCtR6wGgN/YRAdQOjNtBBMMFQBEQRFJ6h/VzfnkPfB++zYvMx2hpBeGyWvERu4/YS - 2wyG4AcWtDjxueJ/FOJzxf+A4tOraP3m2QpRAO6Rp+A+7OHRVfiESzdaRJEQPbpXvlgZtHIBc0fgsTro - JRXoELALeIPAvSYoWjIWKUG6gRsISmoww6CHKrIqtBHydWIf2BfvM3XiOSqf0JOXi382/1IpHnzjCF3B - VobgJxb5Ny5+IQLOVYgYKU/BfYjPBjjjC0Kin6OnRBrIpwpZh91cwKMjUFcHfaQCoyswFYX+QqC6gVEb - 6CBYwaC4gxsYytci5Hb8GvFaBO+H98f7TnnhBJWulY7OIO4rfnReXipjiBtHS2xncFGpgAUvifjc7j0K - 8bndK0Z8esVGP+L7DCs/9yAP33MEVmx2KDAqncq1OUQxecfF0jC7gEdHwBBIF/CVCvSuwB8IjMJQbxE9 - UoJ0AxUEPTVYwGAA4SP07cRr5Ot5P7w/3je/R4OR+9EeNi6wR7jOOZ6K9vjb/bfm24JwYe+hOKRCFv1h - xeeK/1GI/xpCik/T0P/jNSj+brJzyUP3HOgEnuU0ULbFToqC0FHZR4pcwLQuYBSEFqlA7wrUesCtKDR1 - Br4g0N3ACgSRGrzAYADhI/TthOBSdF143rf+PrEDuD1MvI/uYI9Ve3h3gS0KufWnr1jA36D4hYg7/BDI - Itur8pCtR0BY3DMMQKmEGSINsAtUQFvITsAu4LUglKlA7wos6wG1KPRRExiLRWpKMLmBOTVYwqCHLq45 - lG34NfxaIboUnvfN76G/X62cFUp7OMpjFt1daGvF7eE3LKguPrd7j0J8jgcUn16G/eP7bP+A1KOW8RiO - yOQbQdW7UrnWX1B0z+NiXaBCppYKPApCmQr0rsBrPeAHBEaLCBAYAtUNrEDwCYMEwoDCIlSx9dBELxJe - fx9+T3aiqIw3tM7AGfucvFxuAxd4BF/o71nghxWf272HEf/Vf0X8L6KpsP85tkIc1xWf9q8PR2TqNLvT - RU+22E1RHQ9TBARnF7AqCM1dgWc9YA2BOR2YIbB0A5kWdBBEavAKgwaEHqrI7kJzaNvrrzdER/B78Hvx - e/J78zGENx6tQRAW21leMrdxd7FtEUPwI4v9a4nPM3/GP4T49+EAXP3fWmSzhNZj6Gkg1PWqcIE6ucfE - 4pBwAVMq8FoP+AmB3iKa1wlUNzBqAwUE4Qg+YODQBS0u1NfoM90QnkWXwvN78zHwb0EvF9uzkNtDh9Pl - kpfNGKjg/4YL/ilf9J9ZdBaf271HIT63e37Z/r/gZ/+PaDLcCNsCSO7/S8lDLH7YIxufDozKoLJpX1Dt - bhoAairQuwKPeoAh0FcJGQKjKPQDAl9uYAJBpAZvMEggDCh8hCE2Bwuuis7BouvCC/HPimOJGXKMStXM - 4jWCr/mPasjLZgy+cYR64BK3h/d9zXxu9x6F+NzuKTmfZpcV4nPcmS+eAN4gD82/4YhokMsuUDplHYVh - 1tfoclQUhQICfO21HvATAr1FFOsEvFikpATVDbyC4AMGAwgOXVRvIbczBNdnugxDdCk8HwMfCx9T3T77 - KCiqCd9CvmTVHvIDF4Dg23uY4YX/TPGnYvbPeopoEtIQfu538acO8WfinAk/BNXqR0+2+oLqQkheGxCp - QO8K3FpDL52Bj3TgBkExbuAGQjEwGEBwsKC+Qm6nv85tpptE14XXj4ePrUa3rWgPG9wHBJ87olI81tfR - GcRCgIKv2eb9FZ/bvQcWHzEvEjP/LwKAe/Ns928ttFn/Uqjihj0y5U0uBks3/ZAiYfmVIfJTOgR6PWBV - FPqCQFknsEwJihsYtYEFCN5gUIHQQ4BhEeo24jXy9Vaim4XnY+Jj42OMasd/jziuEI65wqo9RPHVmWfh - twyBN/HVXv9hxJ+Gqn9BNW32oybg98X7t5CHUrIRGBEdZA933Q+uO1K4QGwvuACKQgGBXg9YFIUPAoGl - G3gBwScMEggDCj10cRWR9dC3V/dhKbpJeD42diw+VmfLGaIzcITHWv7pdogwmcX4warge1TiT0EsjYb4 - SAETjNl/wq/Wz9twRCYvsjsT4AK74AJHqEqnI54QyKLQKwRcE8gWUV8ssqwLFDfQawMPEPyAQQ9VUF9h - fp030fm9zcLzMfKx8jGXT3pOrhHEdZWXzxgsAgAQzxX+5K/43O6VRPwZwdhPhBD/R2zzULNfHwEVo0ux - CwTBBcq0PEiJffJFZyAgsOgMSgyBNzdQQVAcQdQIPmBQgShpqPvwJjofg1l4PlY+5pq98qlMdC9uDwvs - YTGJ8hIag28coSg8goKssOBhxOd2zyw+LJ/eSxPiFyLuLrAVoPLf91CzXx/2iIZzuRYo1XgLVUj/gupD - PAEBXMA3BEWFob5YZJUSVDcoFgTFFTxgUIHQQxXVKpRtdcF9ic7H4CE8jpWPmaNa9y8opEZbtIeub59w - upzyEhrj5iKbAwDcvAsICnXxueJ/WPFXJuFnfycab6Pv8Bqe/T7v+pVkPBGR8D/oCH4MrJFHpVscpLi8 - 46IQfFgI3NzArTbQ0oIZBFEj+IDBAIJDimiA4SX07fTX6fvxKroX4fmY+dj5HCp32UuBUU0LHOGuK+im - AuRlNAbfOIJA39/jNPAoxH8rFB0GAID49/G1uOmz0LZIvt2jGfaIxKGc30IaLKEnkQoSeueLwtASAo/u - wEdKUNzAMy2YQCgOBgmEAYUeqrBqKNvorzP240N0S+ERfOwMMp9LRFutPYQTfM4ttbyMxkBx1hwQFH7D - aeBBxeeFnil/JdrSU4hP42z01WxbIcT/6uu5NvdfBPmwQ3tYpMEFR8XmVKrpXqqEWV6z69HiIZCLRea6 - wM0N1NpATQsKCHpq8AaDCoQBhRq6sIrAauivE/uQ+/MuuvuMV4Xnc+BzYbCfSdMeLg1wxq6xag8h1EC2 - 6u84DbD4XPGXRHye/TsG4Pv/KcT/Advx/u4stnWQb/FohyMspjZcoDCo7mgq1fwgxfQ8TuGZh4ogMBeG - CgSWKUFxA4+0wGFyBJ8wqEDooQtZXCivUQXnsBS9GOH5XPic+Nyeaqy1hwFhsa/Iy+g2UA/MZtH441ol - Fn8tir7ZlYT49ydq1o+qf6Pc9S8z7M7EGaCaghssExAk9D4OAA66Q8AtIkDQ7yCa6wJLNygOBJMrWMGg - hypgScK8H5+i45jMwrOTCeERfE58bnyOZVxjtTUCZ2wPeRmNIW4cLbTt4M7gZ3YAs/jc7lmJv6g20fp2 - QnyOe7PFwx530Wl41ByPdPByJyA476jYlEJTd1M5iM5OwC2iVwi8pgTNDTzSAocKgh8wFAGhQaGHWVSr - KNpee726T2+i8zF5zHiEKjwHn2N4h8MUWrcPrxQWOsJiU+SlNMa9pbb/AgBn72IG32cHKE78Wc8Q7Rym - if+Sjb5F3SCtv4nc5S87xN8VdLoKHNV7UGiz/VQRs7te7jEPCMx1gYcb+AJBdYTiYFCBMEFRopCv1wX3 - JbqY7RbC6+Kzwwm3wznyuT6d9TkFVdXaQ8czrkryUhpD3DhaaLt3dz7aQwbAm/gzQoj2TUa/j+IP4v+I - 7Vh8hOUK5C82Apwu8WnioOhJgOAA1e12jGp2gd2ZIbBKCRa1gZoWzCC4uYIFDAYQHCyYCoaEwzKUbfTX - uQnO4UN0PjbPGS+FR/C58TnyufI5l2/9MTkqNePPHl7jZXZ5KY0BF4iGkD+jgi+0FP8NB9FnU/H//yPE - /xnfBzSF6Ci2PJIFn5IOR3jCIq4HglxzKbTpAYrreYyicOJlWhz03w0sQTA5gi8YFCAMKDhUEREGIDLM - P9dfp+9H7LMY0d2FLzp+N+ERfK58znzuZZt9QPaIJH6O4LBVe8gVPM/ob7k1dJv5pYi+mInv/YcQv4CL - Pl7tW2Q7wylEvvyfO7Q/MpWwz+6MLwxOXCEgSOyDnAiL9wqBdAO1U/AAQcLAF9XDFUwwqEB4QFGSkK/T - 98P71PfvXXQvwuP8+Zz43ATsOFc+Zz53vgZlkvnuYfx9OCgqdsv28EWG4AfuCnTxj8w1xL/PS73zhfg3 - +HcZyZf9OoM/Ru1wJp4E1YXBSRtEOkgekE+VcDF41ZAh8OoGelooBgSfMKhAKFAYYPgR6mv0/aiCc3gT - Xc/x6oz3EB7B58znzteAr0Vo/JtaZxAe+5q8lMZgO0c6WMGdwU9cDE76V8P2hfjzRMX/LX7uUUv8KoN/ - 3x6c4Lo9sklhcKNtAoLGA1BVZwMCtIpmN/AFgpoaRLHoBwx6qIKJ0IUsLkyvM+/Xp+g4Rl/Ci1nP56qI - LyYFrklw/RckBJ6/tZQ/vAmBP+fevoBTgUl89Pu15Ka/jRHwTEwYUsG39kppgGCrSAdJffOpTs5RsV4g - 3MAqLZhAcKsR/IChCAgNCisw/A399fr+1PfwKXpJhEfwteBrUgodVGANrT20h8U0l5fSGNzTIx1cYbv/ - CUWhvMN3+zcnvj5gZ7Uczvi79sjUwqAG71NIkwMU2/M4isPjcIIDwg28pgUrEIqDQQXCBIUaRYC4h9W2 - IuT+dMGLFV0RXrd6b8LzNSgFh2SXDMEkCWm8jxxRHfgTR9/bnTFR8lIag22eZzzXBIhLN5fayssf/TaH - dIJr9oiU+4EJqyi4yX6q0/UoNRtykp5K08hX04IKggEDg+AHDCoQblBIMNQwIJFh/rn6Wn1/huAcPkTX - izuz8Ib4uvAIFp7dMST1AD3Z4gAFNd5PQQ13kb1ic24Pb1j9+lrM+hSAsOeR3+D5pYZWE8SfsTsb3A90 - LaZgnGQkLlyr4aeocvvD4iL4BYIvGBQgDCg4pGACjBKEKrQhNge/h5+i68Lr5+NN+FBEXI9j1KhfPgWm - IA0kf06O6HdEPYDYZ9UZ/Cp9/sMMfkw6wOk6aA93FTrqvyxIL40L0GTgCS0lSBvUQTCnhuJgUIHwgEIP - VUhfob5G7kffryE4hw/RVeENq1eF50BKLA8XbDr4hHDFwOT95Gj0Odnr8cfNXKgFXOf5z/fLS/j7H7zQ - AVtbLSrdGgMoKHmPAKFet6PUesQpqoQZxxdHgIAwQPAHBhUIMxR6qEL6CuU1qthmwTm8iS5muw/hQ1L3 - U10UxGnDTlI49ilmfcO9ZK8xWJ/5G61+M9kfYjjC4vgvkhXaK7a8Hxi/hoJge0/jYrbCxUjud4LK4QLy - hdJBcHMFCxhUIDyg4NCFQxiAeAl1W4/9INT3KU50vbjTrZ6F5xooMusQtRp6kmK7H6PgFAjPsz5+Pdkr - teXFoMIAZ8w4K9v/Qw2cZP2AcNcVXgFz1BlPgY0+E7UBW2HGs6eofrdjSAsSBD9gMAPBoYqlhpWwHFbb - cpj3q76nT9FV4XFu5VsdpEZohZsPPklPw/qF8A33kb32OMz4eL4xdMPhjPnn3MH7LQz+3fx2Z9wyYXmV - 0wsC41eLPFgKF65B7+OUPvIU1epyBLUCQOAL6Q0GFQgTFHqYRfQnPPYj968LXqzomO268El98qk1it5q - HQ4Lu7c3RLjW4rwzCqTlz7X6WwV/isHUo++9yo9LcQ50JO0UIHAq4AvHjhCde0y0SVr+1C60gEEFwgIK - PQw4/Az1tW5ic+iCc3gRnWubCNQTfPzpqG9qdjqMmkcKn7id7NWHQHSc759t1nsb/1U26T/4UzSO8Lif - 7BENChx1JqAo2i1mSzmIEJ93nLJGnaaGsNCKyKFcRAkYFCBUh9DDAINDFdFXKK9R92WIzSEFN4vOnU2t - zkdFjueo0fEw8vx+IXxAg91kr8XLvQm80POj3Rk75U87672NoKfjy9nD4kSnYI9oWGCvM1GAwPkyFKKL - i4tisQ1mFd9uDk//AiJAABluUChgGHD4EeprjP2oYiuCc5QBHNU6HhH5PWvUKWqI9OXEcYnZzsIn7qKA - OpO08+HiNzxm/hMRCaXlKT8eVkP+jsJ1GgiJBfZaY8iesFmAwMFFVGz3o9QGeTUTzsAXvzpEqIDvsygs - kAgFDg4DEC9h3l7fjy42dyylAERE5iGqxyuag05Qu9GnKaVfvpjtIdhGiJ6EcK2nALZ6Z4Ke59fx01Py - FB8Pf4Z43AwzRny8ilukKl0L7NGzyJ6EnhkXmmEoj1qhducjlDogn9pCjIxnT4u7jzFos3hmskuUhbWz - eCJUQdXQfy6DV+gqoAuo2PYw1cw+QglIQy2GaIJz/56Ir6PamURP/IgC6r1F4jiF6HE/wOpnPBER7f7n - 2R+Pko2gyNhA/jMuuKAXxYV1NvjZXq1/YUD0XMCA3CrtloGogKqbZ6OrxzFqOvCEKCLbjzkthEsfcVKI - 2ASwpPQ7IYP/ny9mc/PBJ4S4/Breni29JXJ5wz7HKbrbUYpEYecmeNJniug9kdvFgx0s/AWHM3bwH3Yx - 59cbo/6CQjGeZxUu8i3tYsffD4jq/HNA7YkUELsMxdanQhwdCo4gdBVlmx+g8DZfUCUUkdXRjtXsdMQt - eDZXbntI5G9OMaFIAUVCS7ERTyQgp0fPp4CaYyigcoefVNHtYTGTMNtryIN9PH7RER39V15QgjO8GBAe - e1ATQQPCXqn19wHsELUnUUD9OfRE3FptpkoRi4snGiDit9MTsSsxu2dQQK0XKaBq30J7xVY/4D34nj3/ - dTGIH7uH3/+x6L+BEeKs8/eA8JhGLAhifYAz7nIRFHqg945I/tFeKe07xPf2Shnf2aM6/2ivnKl9Hdnq - e/FzY1Ybr7sP1znL+0UMDwiLi+FnIOVbPx6/1fH3KNd/aoVkbFMI11vAwenDGbsQ39tkDkd47FL+Oa/H - 8yd3ApyxSfw3g6x+Hezj8Xj8AYfN9v8Bci6WpzuY5BoAAAAASUVORK5CYII= - - - - 695, 17 - - - - iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAPjtJREFUeF7t - nQd0FNeWrnvuunPfe7Nmzbw7b+5Y3UqAwWBLLQEiR4WWhEACEQUKRAFCgMg5GDAOZIyNAzYm52wMBkw0 - 2BiDDZgoco4mOQeh/f596lTpdHV1qwX4OnHW2gskVVdX1f+df+99qlqyPR6Px59+tGwZ9rf4jJDZ8ekh - mzhc6SHLXemh77gygyfg3/5xGcFproxSNZJaBvxDvuTx+CONuIyQFq6MEErpWvpKw86lrjfMLnUlsV3o - HVdm6E/8fbfIDL0hIAEc8RmhTR9D8QcYcenBrVnc0aur0EubqmmxUYux66rQ8KWVqN/bEZQzKexWm8Hl - LiZ3KX3VBMcxxJS4zJB4dhO528fj9zJg/5ks5Ni1VWjunnY0a3c6vf1RS3pzZzN6/cPGNH1HQ5q8NZrG - f1BTQPHixqr0/PoqNHh+Reoy4em7zfKevKQAcSc+M/hthmHUKNtf5Fs8Hr/loQPwwrqq9OGp6XTixjY6 - fm0zHb7yHu2/uIJ2n51NW/On0tpDw2nh3q6AI41eAxhTtsQABgCxoSqNfa8K9Xk7orD1wHLX47NCv5cw - XEANMTwxM9Qu3+rx+C0OHYAX11WjdUdG0Mdn36a95+dD/GV06Mq7lH99i4BCD4bjswuLaUv+FFq+v68A - 4tXtDeEQtTUYkDZ6veEsaNbryevYbyHiZ8TchKzgcPmWj8ejH6P+EhQWXdYeFpMYEBaTaw+Ped7ujJ1h - D4tbbQ+P3WQPj9trd7qO4P/b5QuMoQMwbn01mrKtBr28vTZN21GfXv0wFjM9nt7c1Yhm72lDKw/2gRNM - ok/OzaajV9/XgLjOQHxAn5ydA4cYSTM/TqdXtichVVSnF96vSiNQP7R9tvy9hKzQH/g90FGsRNH5jHzr - x+NBR2Bk3FMBYXHtIPTbdmfcZ47wuB8hLhnhdBUGVm5cEFIjs6BMvVwqU787BUWlksMZf0vuwhgGABuq - 09QdNbXYrsUUPQDGZBkvb69L03cm0pw96fT+0TH06bl5whUYhmOA4ePTM2nlgUEApwVN2lwfIFShUasr - U/ZLFb5LaBv6A97vviszZH5s26BAeQiPR3EjxFnn7xA5zeGMme1wum7pQgdWSi6AuIUVkl+iiLQ5FNVx - A1Xvvpdq9ztJdRB1+2vB/y+fNMoSAMzKXAZgwqYaNO3DWka8rIcOhQRDBWLSVgaiHr2+syEt29+T9pyb - S8c5ZQCGA5dW0fuHn0eKaEOTN8caIHR4vsJ38ZlIC5kh36JgHPq4c/AyHFEp/4bZnQHh1+Lfn3XBy8UP - oYhW71C1rjuF0Cywa8gpShl1hpo9f47Sx5+nDlMuUM/XL9PQ2VdoxNyraOOu0DPJY60BSA/JYwAmfVCD - Xt1Vm17ZWcstpnGoUKgw6M4AEBiGqdvq0hs7U+jdQ0NRQywXIBy5uhH1wlR65+NMmgIQuIPg1rLVwHJf - 8/sijvJCkzycxyMoPC4Cok+HjX/LogdVaV5QodFLVKXTRqrd9wTVG3CSkkacppbPn6VOUy8KgV9Ze5Pm - b71D735yj7Z/8Q19dPRbEbuOfkO7jnxDU9bcoPDGz1NgRIJXACZvrkHTP6rtFgyEHmYgGAbVFVQQJm6p - DmeIpfmfZiNFzDdA2HDkRXprZ2sav7GOKBb7znRSw06lvuG0EJ8eOulP7QYBztgkzPQPWXRHROL9pxKG - U+UO6yH6SYoeeIqajDlL7SZfoDGLrtHMTbdo/b57QlxdbI4P9n9NqwHBoh13xDZTVt+ksYuvU+83r1BE - 6osUFOkdgKlba9Lru+uIeO1jPWqLMANhwKC6ghcQpm6Lplm724jaIP/6Vjp46V1afWA4Td/eBG5QjUav - qUxZI58SRSJA2BOdERgkD+3PMRxhsSn2iPjDYrZHNb8f3vwNqpF3kOrC3hvD1ttNPE/jlt+gpTvv0I5D - X0NontXf0vq9X9G8rbdp0qqb1G/mFeo6/RJ1mnaJ2sH+MyddoFbjzlOzF85R4+fOUqPRZ6lSi3EUXDHx - FhH9i3xrMXQApm2rRW98UqcoJAzuULjDoLqCGwgyNegQTNhcnSZvqUtzP2mPFnIpQNhGu8/MwdedaNKm - WHpuXRTlvR5OKBJ/xLHcdmWGNpKH98cd9oi4unZn/D4WPqRam/sRredTzT75FIPZ3gK5fAjy94Jtt4Xo - PNO3wdoXbr8jZnTua5epPYTOmHiB0hEseNspF6k9UkLHly9Rh5cvUtbki+JnLV86T6nYX5W0iRRSKbHA - GwCvbK9FMz6tS2/uMcUnyOsmIFQYrByBU4OVGzAIU7fF0PL9/eiLy2vp6JWNtB6F4mvbU2ns+qo0ZHFF - apJb+juREjJCxv0hVxODImMDkd8X6DPe2WoW1eydj0LuNKVDrIkrbtC6T+/RzsOa6Au23aFhc69RJ4jK - greZcF78qwvOs77Lq5co57VLlIvCr/ubl6nbG5cpG9/jn7fBts2x3+ptJlNIxQTo7wWAHbXprb31jJjx - qR7eYbACwagRVDcwQTD+g2r06vYGtC1/GuVfgxucnk1v78qklzbUptHvRlHmiKf0peXFf6C6YNRfHM7Y - Hpj13zoiEgqfbjyJavQ6IvJ7Gwg07d2btPHzr2gnZvvaPfcECJ0hbjoEZzvXRefZnf3KJWH5uRC6x4zL - 1OutK9T77avUZyYq/nfwL/7fY8YV6jz9MrUFBGkTLlDNjCkCAHkwxsBF7s0X++299WnmPi3e3lfPCHcg - TDAUA4LZDcwQTNxchxbuzaFDl9ehNlhLi/f2RjfiojFro6jzhKd5FZFjQ3TLf/y7PNzf57A/HRtqj0gQ - BV7pet2pas4nVAfFXYux52jcsuua8JjxKz++R8PmXKW2sG+27tZo6bJg7/pM10XPg+gseF8I3n/WVRqI - 1wyGSwzhmHdNfN0brV83OEJ7ANMa8HgDIC4zuC8DMOvz+vSOHp9pMZNDAcISBhMIJYVg3CZ2g4a069Rb - dOzqZnrvi7E0bUuygCB3WhjFZ4bcd2UE745u4/hveci/r4HqvqWY9ZFJhc60OcjzJ6jB8DOU98YlWr37 - rhB+FYQfCtFY7BYvnKc2LDwqfp7tbO/dkPP1mc4zfMDsqzRozjUh+lAIzjFswXURQxGD8P0+2C4X1X8H - uEWbSRepVuZUCo6M9wrA7APRNHt/UcziUICwgoFB0B2BU0NRjWByA5kSvEHAt6Anbq4H8cfQ8Wtb6YOj - U+m1bc1o9NoquE7hFJ8VUoBjPPK7giAsrOXfUN2/zbO+VO1sMet50Ybt/s31X4ri7t1PvtKExwxt+aKc - 8RCeCzkWnnN6TwjP1q7OdFXw4XosLIrB8wEAts9FGuj46mVKn3KJ6nWe5ROAuQdjRMzRg4FQoDDDYAmC - mxuUHIJxm2rSwk9z6QiKw50n36I3dqQJCHi9ICEr5GcUhvt+F+ngH2HRAQ5ngqjwyzd6Cbn+OCUOO01D - Zl2h9/d9RdsOfk1T19yE1V8QrVorQME5niv7zpixbN2q8Dzb2drFbJfCD1MEN2KR9u+g+dcFAN3hGB3h - HulIIfU6v0NBES6vAMz7IsYtdCAMKCQMhjMoIBSlBnc38EgJPiDgVMAQvLihGs3Y2YoOXFyN4nAuvb69 - pSgMhROIdBDywW+6MHRExJS3OxOuOiIbFEa0WUK1YPmpY87Q9LXarF/y4V3KRS5vitasOcRPQ4HHs17P - 8d2R49nqRX4XVq/N+sEQnyEYgtk9dIEGwlCIzcEwGAEIBkkH6PbWVQBwBQBcorrZvgFYcDjWiPmHikIF - QnUGNxBkangYCMZ/ICGQzxhM355Cn19YRR+fnoM2sSWNAgS5057hzoALw8W/yRbRERFb2RERfzewUkph - 5U5bxWJOFqr4xTvu0FbM+rEQJw2zPWXMWYiv5Xp2ARaf27geaOF6oXjri/zN4g/kgPic0wdBfI7B89ji - r9MQAMChQ6DGAGzTa/Y16oZCsQM7APZfFw4QGBHnAQAKrGEMwKIjcbTQiFgRZiA8QJCOwKlBdQM1JXiD - wCgMAQBDoBaF/NQR305+ZVtyEQTbWtCoNVHUaVwFhoB46Viewm9j2J2x9RxO1/fo7QujsndRLNq7Xij0 - 2PLfQ1vXHbbOwjdG6IWeh/g881l8zN7+EJBjAOx/AAAYCPE5BASY4QzBYAAgAqJzDJH/9sc2AgDpABnT - LlO9rrMEAKVKRf9vechi8IXkC7r4WJwWR+NokR4KEN5AsHIDfyAwugO4AENgrgfYBfgO4rStSfTZ+RW0 - I38GuoMm9OzqSpQ58il2AUAQ0lKexq87xHKu0/VzSPUMqtJ1jxCf78TxrJ+z+ZYo8pJGnhHis+3rxZ5q - +3ko2Lh16zMTAQj6AoK+cIB+ELIfIOgPCBiEAXO1GT4AAAzkAACDTNEP2+TNukY57ACvX6HMVy5T/Zw5 - AoAnIhL+Rx62GDoAS4+7RCzR45jLHQhfIOhuoEDAbuALAqNFLCYV8N3DaVsa0f4La2jD4Yk0eVMSjVhV - iVJ7lObO4OvEzKCy8lR+nREQ7oqG+AWi0u/2GbkGn6LnkKO50BuPHr8pev3EEWcoeTTER94XOR/tnqj0 - RV9/RSza5GH294JgvZD7ewMAzuEcAgLUAQxBPwDAIWDwAgH/vy9+1hPgdMX+OmL/mdOvUD0A4HB6B2DZ - iXgt8rVYmq8AIWGwAsHDDbxAUFQTaN2BSAUMgakecHMBmQoYgtd2NKcvLq2nFZ8NpZfW1adBCyMpsV1o - gSszZO+vVhQGPBMThpz/nZj53Q5Qg6GnadzS67TlwNc0Yt5VMevj0fM3GnWGUgGCUe2jKuelWq72u6NX - ZwB6AgCOPLgAQ9ALEPQWEKCgg5h9AEBfAQFmOATurwcA6L/gBg0wAh2ADgD20wH7z0QdUL/bbJ8ArDiZ - QMtPxmuhwyCBYBgMEKQjcGrwCgHXBRbpQIXAox4wpQKzC4xdV5Xe2dWeDl3aQHM+yqEx71anHq+F/Xr1 - gCPMFeKISPwyKKpZYVTn3WLmT15xgzbv/5oGQkhu+1wAIunZM9TkuXPUAn0+L+vycm4ntHpdIAqv2fPK - Hvfr3LL1gPg9MWvzIFweAOgF8Tl6MwA6BJj9IpDn+0H8fhC8vwwWn4HoDQC6z74OAK4BgKsA4IpIAb4A - WHk6gVae0mIFhw6EBQhGajC5gTcncOsOAABD4CsVaC6gQaC6AN8wWrgnDzXBKnp9WxqNXFWZskY/pUGQ - EZwgT+mXH6UqRv/fwIik047IhoWVOm6n6AEnaezCa7Tps69Q+F0WT+jEDDlNiZj9XPhxr58m8v5FsTSb - /epl6goAusIBcjBDuyF0CLoDgh6oA3oCgp6AIA8uwAUdQ9AbAPSGA/ThgMh9GQABwQ0R/RfeoL6AoJcA - AA7wzjXqiEIwC2kgpscCnwCsPpMoYhUHwyCBMGBQQVDdwA8I3FpEUz2gu4CRCny6QBV6YX1N2nh4Em09 - 9hpN2phEw5ZXpOQupQriM0MupnRx/Js8rV9yjPqLIzJpp8MZT5GZa6lO3xM0EKJ98PlX1B22Hj3oFEUP - xuyHAzTE7E/F7Od1fb41y7O/4zQAgNzfGdEFAHQFMDl8Bw8AcORCsO5wgR4CgGuimBMBQXvNgbgQn2c4 - A9AH4jMEIiB8X0DQZ/4NAHCDumNbDYBr1PaNq+TqvdwagIyQlxPbhv685mwD0kIDwQwDg6A6guoGWkqw - gEAWhmqL6C0V+CoIVRfgZwcmboyjveeW0bK9g2js2jronsK19YHM4AnytH654YhMfIlX+MJazKGavU4I - 0Xnm93vrsrizV2/gSYoFAFz4paDw4wWftHEXKAOFXzvk/o6o/DvhNdnTL1NnuABD0AUztCtcIGeGtniT - CwAYgu6AoAdcoAfE74nZn4foxSEhECBA8D4sPAccgP/Nw/dzsU0XgNMR+2k34xrF910uHiS1AqBhp1Lf - rz3fgDjePaeFCoMBgskNvEGgdgfGOoG5HjC7AEPgpwuMeS9KrAt8fn4NUkEbGrGyEqUPK8cQFPyiXYEj - PDbBHh5X+GTcUKreM5+yxp+jDejzn517leJg+bzWX3+QnvvPGvbfenwRAO35gQ3UAB0BQSe4QDYgyAYE - nQFBF0DQFS6QAwh4EScXAORiFneHkGzpPTCre8rIm6vN9F4AoDcHhOfoheiJ7+dimy6zrlNH1AHt4ALx - /XwDsO5iEr13oSjcYSgCQXUDDwhkOlALQ7UoVF2gKBV4dwG3jkCuCzAAzwGAMe9VpaV7B9Lmo6/ShPcT - aeDCCO4K7sdnhK6Xp/ZoB+d9FH13g6ulo+I/TMkjTtPSD+/Q5JU3KBGCiyd0UQtw7k8YzvZ/VjyO1Zxv - 8kwAAMj/fG9eQAAXYAg6wAV4rb4TevVshIAALtAVAOQAgBwA0E1AgFAhwOzuiVnOMz0P4nMwCCw+Rw8G - gB0AhWAnQNB+5nVKGLhaABBcPt4hT0kMHYD1lxrSekDAocKgg6A6glcIZE2gdgdWqcCrCygdQXFpgG8X - v7C+Du0+vQBdQS4Kwijq+JK2SuhqE1JHnt6jG46KjdaIvN9uM8Vgpk9bfYNmbrglQKjVV3v2vj5SQCxg - SID9Nxx1lpqg9WuB/N8a1X86AMhCDZAFB2gLANpNu0ztUQwWQQAngAN0hgNwdAEE3MblwAG6QfxciJ8L - QTm3axBoM51DQADh8xbexL83qTu+7obvd8V2DEAHAJAoAeBPEGlnpA0dgA2XGxLH+xwSBgZBh6EIBOkG - VhDIwlBtEd1SgdeC0LcLeEsDo9+tjFSQRp+cWUyTN6bQ4CWRlNQxlG8YfSxP79GMAGdMQ7545ZOnUo2e - J6j365doze57lAZ7r9XnpPZBDGH/p4T9J6L/5wcxGQB+HIufyElHCkgHBBlwAIYgiyFAGmgPADQIrlAn - OEAnQJANF+gMB+gC++ZCToPgOnUDAGzt3SE+B8/0HhC7J9s+8n8egv/tga8ZgC7YJnv2DeqA1yYO0gB4 - IiLa7TN6GgClv994tRGJuNKINlzxBMEKAsMJ9JpAdgd6PeDmArIreDAXsE4Do+ECY9ZWo/cPTaDFewbS - qNXVKXuC5gIJWaGx8hQfbvwjLPrfHRFJt4OrZ8L6j1LLsWfF2n7uKxfFc/r67K87gKt/ADDsjAAgecw5 - CcAFAQA/ldMGAPCt2YyplyiTneCVy9QWLtB++hVqDwA6AICO6Ns7AYBsOIAGAZyAIYALMADdAADbey7s - n2c6BwuuQXAT/4cDILrh+10BQfacG9QRr2sw2DcAH1xLJo5N1xrRJhMInB58QqAXhmgRrVKBNxdQOwK3 - dQFTMegrDYxaU5kmbIinXSfn0JRNqTRkmeYCOK8d8hQfbjgqJb+Cwo8isjZSNIR+a/2X9NKS6+LpXX66 - h5/b59lfF1/HMADo/YUD8I0fdADNUAO0RBHYauJFaj3pYhEEACATLpAFF2gLB2iHaI86QEAAADoBgGwA - 0Bku0AUAdMUszmEAODCzeYbnIgQEELwHiy+jOzsAAzD/JnWed5M6AYKkIdYAuDKCZzIAm28k0+brWniA - IN3ACgJRGFqkAksXYADcOoLi04DPboABQBrgj5yt2DcCReEQGrmyGrV/vrxwgbg2QRHyNB9sOMJcIfaI - +IIyqPqrdj9OOS9fpPlbblMyBK7Zu2j218Hsr8cAoACMYwdAAdgQKSBl7HlqCgCaow1sAQhawgVaAYLW - qAXawAXSAUEGXCATLpAFB2iLaAcI2sMFOgAC7uE7vX2NspHDO7+jVfVdIGZXAJAD8VnkXBksOoufi+jG - ASgEAPhZNrZtONQagLiMkHmNAMDWmym0heNGCukwCBB8QMCFoVs9oLqA7Ao8XKAEacBbN2CuA56FC4x/ - 30UfnZxHE99PpoGLuCMIuY9zmyVP88GGo1LjDY6IBlSx0x5qMPQULd1xhzpNPi/EN89+zv8xyP9x6AAS - Rp6lJACQ/BzSwAuAAAA0BwAt4AItAUCryZcobcolQHAZEFwWEGTAAXjNPgsAtEMd0B4AdIALdAQAneAC - 2UgBnTH7ubLn4s4NAojN0Z0BWKRD8CV1xfe6CAhuUpNRG30CsO3LxrTtyxTaijBAUNxAh0BNB24uIFOB - Xy5QXBrw0g14qwMYgGfhAsv3Dae5H+XRsBWVqfXQsvwE0Q9JGWX/Q55qyYbDGV2Be/5ySRNEzz8Kvf7L - q26IW71i9uvFn5z99QefFgC40AEwAA1Gn6NGACAFdUAqXKApf1JHQAAnYAjgAmlwgTZwgTYAIB0AZMAB - MgFA1htXqS0AaA8H6IAQEMABsuEADEFnuAAXeJzjcyAuz3ae9bmLvhTRjQMA5OB7XRFdEKljt/gEYMft - xrT9lhYCBDME0glETQAAGAI9FXh1AaUjMNYF/EgDftcBEgCuA0aurkTj1rto0+FX6KV1iZSnrQ6SKz24 - mzzVko3ASqmbHZFJVDH7M2oy8jSt2HmXWqKvr9ELs1+xfy7+6snl39hh7ABnKP7ZM9Rg1DlqiEIw+fnz - 1AQApKIYbAoAmk24SM0BQEu4QEsA0ArtYBoA0CC4AgiuAoKrlIU00HbGNQ0CpICOAIBbOi7qOkP8Lsjt - PLt5lucIABTxF+PrxQAA0ZUD32v6vG8APrzThDh0ENgRhBuYIBCFoTcXUGsBL2nAWzdgVQdYrQp6KwQZ - gJGro+jd/S/S61szafDSSErOKV3oygz5XJ6q/4N/AYM2+8eL2T9h6XUaPPMK1YLwAgAL+49G/tcdIB41 - QsIoLQ00ggOkIA00fvECpSIVpI6/SE0BQbNJl6iFgOCyhOAKtQEA6XCBDLhAJgDIggu0xexvx3f1UAhy - O9cJ9p8NADivc37vAvF5lufA+nMgPIvO4ndbIkN+3eKl7QKAwLDoivI0xUARuCC5c+nvdt1LpZ13NQg4 - DAgUJ9BTgdkF9FqguDRg1Q14qwP8WQ8wAOA6AADwgyJTNjahNfufp5GrahrFoKttmRB5uv6NwMqpSxwR - iVSx46fUeMRpmrf5FjVCbq+el+8OgGL/DEAsCkB2ABdSQAIKQU4DSUgDjVAMJgOCFEDQWIcA9UAzANAc - tUCRE1yh1gKCq4AATsAQwAE0CK5Te7hAx9lo6+ACDAFX+OwCbPE8y3PE7NfFv0XdlhZFi3E7LAGIzwxd - lNKl9HcffZVKHwECFQQ9HXBNwIWhLxfwlgZKUgd4FIImAEQhaLEgpAIwZk1N2vDFFBq/vhH1ma2lgfiM - 0H7ydIsfQWGJ/2WPSPj5ybiRVDU3n55feI0GzLgM4fMBgLR/U/5n++fZLwAQDgAA4ACJSAEMQEOkgUYM - ANIAA9AEDmAAAPFboBBshRSQ9qoGQBuIn4E6IBMpQAAA8dtB/PZwgA4Qv6NwAK2468w5HsKz1edA+Bwp - fO6youi+/Ba1mqABwE8wyVMVgwFo3qPs3d1fN6WPEToEajpQU4HZBbymAS91gFU7aC4EDQCUQrDYTkAC - MHxlRZqzqwfSQDuxMpjSrXQhisFd8nSLH46KjQfyhXJmbqUG6Ovnb75NDZHbqyEV+Mr/OgAiBWD2JwKA - BgwAUgADkIw6QACAOiCVAUAd0AyzvwUAaInZ3wqzP43Fx+xPh/gZmP2Z+uzXxefZD/E7KeKLmS/ELxKe - Be++/Db1WFEUaRM1AJ4Ii3VbIRMA9Cx755Nvm9Lub4ogsHQBWQvwiqHoCCQAbmnAog7wpxAsrhMwA6B3 - AmorqAPwwto4WrlvNI1YUYMyntXuEvrdDTgqpVwNqdGeKnU9Rn1ev0TD3rlCNTDzVQC85X9h/yoAPPth - /zz7k2H/KTz7Yf+pmP1Npf3z7GcALGc/xNdnvxAfs5/Fz1Zmvqf4UvSVt6knxyot0iZ5B6BFXtk7n37X - jAQEDADSgeoCei2gpwEDAJkGvNYBpkLQAEAvBC06AQMAuIA/S8IqAFwIMgAjVlYVxeAL7yVQ7uviswSE - YjdZnrL3wc/180Uq3/htqts7n15bi/4ZHUC1Hmz/pvxvAsCc/xOR/1UA/LJ/FIDpDIDV7Fetn/t7w/aL - xFeFz1t1h/JW36FeMtpM/tAnAHu/b057vgUE7AISAHYBIw2Y6wATAHod8CgBEK2gGwCeawFWAAxdzmkg - DwVhc+q/0MmfLSyMywieKE/Z+wiMajFb3PHruJ+aPXuaXlp0jWoDBA8ATP2/CoBf+b84+zflfnX2u1k/ - F3tm8THbhfBrEO/eod4y2kwpAQBKGlDrAHMh+NAAoBD8pQAYvz6J5n7UmwaiDkjtVYZvDh2Up+x9BFZs - dDe0Tk+qDPsfPQft2AvnqEr34xIA6wJQXwDyVQAWl/992b+a+9XZL9o91fZV8aXofdbepT7v3aW+iA4z - 9pcIgGId4FEA8As6wKhVtWjxJ0NQB9Q06oDo9qXcPhTjNrg9EvafOpvqQegJS65RPOy9anc4APK/GQCr - AlAHwGcBWFz+92L/nRgAi9nPBR/PfmH7uvi68Ou06Lf+HnV8+4A1ABkhy/QagAEQhaApBfzeagAGYOiy - ijT/4/409l0XdZ6if5yslFsL7DaCo1q9wBfI2W4PNUHvPxzFH898DwAeqAPwXgAWl//N9t+F1/hl7ldn - P+d8tn0x86X4LHz/97XInnVIAMCPtclTFgMXZmMLdAFm+3cvAr10AQDAowsAAMV2AQCgpF2APwDoXQAD - wLeF39zWkcata0R5M+XnBzJCMuVpe47Ays1PBFfLosjso9T/DVjz6LMUlXvcbwA8OgAA4K0D8FkA+sr/ - FvZvnv1s+6r4Azbco4Ebv6Iucw57BYDbQKMFtCoAi1kH0ADwXA7+tdYBGIDBAGD8umR6eWMa9V+kFYJe - P0DCH5i0O+Pvl4l/nqpB9FHI//HI7yoAXtcAStgCeusAfBaAXvK/Yf/I/Vzpq7NfFX/Qpq+oqwSAn26S - py2GDgDbviq+txbQ5/0Atn/TSqAGgMVKIAAodiUQAPhzS1hdCdQAiBQAjF4Fd9neRQDQqEupQld66Cp5 - 2u7jiYjoGnxxKjRfRtF9T9DIWej9IfoDA2BqAQ0AvLWAXjoArwWgOf/rAPDsBwD67NfFH7z5a8qZJx0g - LK61PG0xdABYeLP45tnvLf/rBaAAQM//ft4LMADA7H8U9wKGrSgCYPjyqvTKpnTRCjbtXYZcmaHH5Wm7 - Dz3/h7f7lFKR/ztOOE+Vc47/vgDg/P8AAMSlh2xpmVf2ti68h/hK7ldnv+UqoI8C0A0Atn/Lm0Fa/ncD - QOZ/FYAXzHcDAQAXgGYABi6JoAGY/QxA2hDxfMA9edruIyiq9W7UABTR6SjlToVYw049HAC/pRQAAAZ9 - gBQw1zcALLouvHErWLV+i4dCPGa/pf373wGU+HkAAKA+D6ADMIQBWFoEQL+F4ZQxSrSCZPmbRQIrpX4Z - WiePKqIA7PfaRXL1P+kBwD+lCPQGAIpAb2sAJS4CLQBo1bvcl7rwxsMgUnyj8JPW7+2xMLfZX4LnAs0F - oBsAbh2ACoCW/80PhHD+dwNgcREA7V/UPkSakPWk2wdjtN/mFR5XWCb+RarW7Tj1nHaBqnc//kgA4DbQ - CgC/2kATAH63gTINmCHoOu+YVwAyBpa/yjPeLLwx871Yvzr7/XkYxN/8/yA3gtQ1AG4BBy2NKAJgQTh1 - mKA9G+Dxp2u0hz9iqVyTuVQ3L1+kAL4RxKuBlgAUtxBkAkBdCLICQF0I8nUfoNiFIHUV0AQBR+7is94B - GFD+qij0pPBqzldnPouvWr+v5wF92r+a/03275b/fRSA3jsACQDb/2LkfwlA9mT98wImALTP+6EDaPke - xfU7QRnPn6WKXSQAcASxFGwBgF/PApgA8FgKNgHwsEvBwgUUCPRlYI7cxecFAHA7t8UQBiCxbejXrfs+ - dc5XpBlR9lxan6JoqUZvLVqokVf2XPO8J92j55PnmpmjhxZNRZQRkcrR3T2a5HKUdouUbu6RzJFTFI1y - Sp1rmF3qGgMQmx5UTZ66NoKqtBH3/5/J2EWNhpyiJsNPeQKg3Ayyuhdg3AwyAyDvBXAa0G8G+fUsgJc6 - wDMNuLuAGwRyVZBB4MhZZA0ALsp4/c/G/jnCtBwcWDVzOl+Y8A5HqMmw05Q06CRV7HxMSwMWAHjcDlYB - 4DqAAVBbQRMAD3M72EgDigsU1QJFEIh0oIDAkbPwnCUAf/oRWKXNGkdkIwpvf4RSMfs5DbgBwHUAAOA0 - YAmARSto9TyAr0LQ7zSguID6NFBRKpAQyM6AQdBh6DpfAuCM6SJP/fHgEVil9UeBUS0FAM1GwtZ75VMk - A8BpQO8EVAAeoBPwWQcUlwZMLmDUAnoqUJzACgTdFTrPk0VgeEyePPXHg0dg5VYHgqpmUBgAaPnsaarZ - 47gnACXtBIqpA4pLA74eCzNSgV4QeoFAB0GL25Q95zEAlgOzPz+oaqYBQHUIzncEvRWCVp1AsXWAn2nA - 14OhHqlAcQL9+UBRGCogqNFx1hmvAHy5wFbtziLbpj9L3F5kGypPXQMguGZXCmunAVAFogsASlIIWtQB - fqcBKxdQagHLVGAFgXQDNxAEDFp0eOe0VgOExfSRp+427iyxvYULQ3eW2n76aq3tSxHveok1Sqw2xSqL - WGkRK5RYbhHLTLHUFEssYpEpFppige3L2wtt9xFz5GlLAGp0pWfaHRYARHU5SnxPwGch6KMO8CcN+OMC - RkegpwKGQKYCHQK9JuDCUHQHuhtIEAQMMjrPu0pP1m1T4HC6bjvCXB6flKFRtr/cXWH77PZiG/18wEZ0 - GnEKcRJxApGPOI44ijiCOIw4hDiI4O05Pkd8htiH2IvYg/gEsRvxMeIjxC7ETsQOxHbENsRWxGbEB4hN - iI2IDYj3EesR7yHWIt5FrEGsRqyUsRyxDLEUsQQBiGkhYgFiPmIeYi5iDmIWAF9oK7i1yPayPG0BwHFO - Ac+0PUypfBNIAuBvHeBvGvDqAqZaQO8IPFKBqR5wg0C6gRsI0hUYCD3Spx+i4CrJDMEp/p1H8hIY48ZS - 27/fWW67Aheg+yxyceJ/gXgU4m9BPArxAa8v8ekdGwmXW2grejAksHLLz4OqZBgA6A7gqw4oSRrw1wX0 - jsAjFZghkE5QHAgCBj0Agwj8v9mLO8kRkXDf7ozbxvdB5GUwxu2ltpDbS2zf38UFLmTBH0T8TxGPQvx1 - iEch/mwExC+cqQFwa6Gt6KNigVFpuwABPQ0AUoacoqo5x8jZUQLwMGnASzFodgG9I7BMBUo94AGByQ3M - IIgADFaRNGSNqAcCwmPfkZfBbXy5yFYdF+o+6gCiY4g/gPgE8QukAyDNFd0PCYpqvZoXgp7OOkwNB52g - 6gKAIyVOAyV1Ab0j8FYQekCgOAEXhtwd6CnBDIIBg4+o2/V1WRTGDpeXwm0gFbTji/UNC/MoxP8Q8SjE - X4F4APHpbdQ2egpYYqsnT5MBSJvGF6JC1iGK74s2D1bPy8J+pYGSuoDSEbitC+ipQC4O+YRA6Q50NxAg - KI6ghwqEGvrPo1o9K1vDuDR5OdzG3eW28XzBvmfBzOLvR/yzxF+FeEjx6S0b/Yg6gM/n3lJb0a/Kc1Ru - 3oMvwlOtdlLdnsepTg8NAK9poLhi0MoFlI7AfV1AgQAuoNYD3iDQF4qEGyggGI6gwOAzsE3mm5fomQbd - 7zuccT+hM7D85Yp3l9nW80X7kcX8HYtPM2z0Hb6Pc/kZx/JXeXo2G39QggEom7pG2H8cXICXhdU04NMF - 9GLQ5ALmjsBtXcCcCpR6wDsERd2BgEC6gQcIOgx6QGi3kN/nbThav3KGytTR2kPzL5HkgQv+N3QFR2Cb - VMAiP6z43O49CvEBZUnEpzds9DW2u7PIdlKemjaecLrKMABlGs6iSpjxDQacEItCPl1AFoP+1AJu6wJe - UoFaD/iCQHUDFQQ3R+CQdYIeOhjq98Q2cvum4w+iPUwpsDtdZ/j3I8hLY4yvFtr+GxB8CTeg+9zeqeLz - 149CfG73HoX43O5ZiM9xd77t/q1FthXytOSIjv6rPTz+fmjMC/RM5iFKHnxSLAqZXcAoBr24gLkW8FgX - UFOBaW3AKwR6YcjdgZUb6CDI+sCAQQLhM7ANbysCr2v47IdoD+MLHeGuXVbt4ZcLbRXuLLb9eA+iFLLo - vzPxC1/X8r9bC6gPR8XUa8E1u1P5jEPUaBAAQEvI9wbcikF/XEBZF7AsCE1dgdoaFgeB6gYqCKoj6DCw - Mxju4CXENnJ78VrsI6b3ShSFcYAgdom8NG7j7lJbPFqowq9ZLF/ic7v3KMTndu8RiE8Q/yd8zQDcXmjz - rHUclVrucFRqTuXTuRM4IYQXaaAkLiA7Am8FoVU94BUCtTsACPo6ge4G3kAwYFDcwTKUbfTX8T54X9Xb - v6Z1BmExo+XlcRtwgZ58Ib9l8UoqPsc/S/w3EVJ8mo4CUGsBC66stXn+VRFHxWaj+KTLtfqIauQcpWoo - Bv1yAaUjsCwIGQKZCtR6wGgN/YRAdQOjNtBBMMFQBEQRFJ6h/VzfnkPfB++zYvMx2hpBeGyWvERu4/YS - 2wyG4AcWtDjxueJ/FOJzxf+A4tOraP3m2QpRAO6Rp+A+7OHRVfiESzdaRJEQPbpXvlgZtHIBc0fgsTro - JRXoELALeIPAvSYoWjIWKUG6gRsISmoww6CHKrIqtBHydWIf2BfvM3XiOSqf0JOXi382/1IpHnzjCF3B - VobgJxb5Ny5+IQLOVYgYKU/BfYjPBjjjC0Kin6OnRBrIpwpZh91cwKMjUFcHfaQCoyswFYX+QqC6gVEb - 6CBYwaC4gxsYytci5Hb8GvFaBO+H98f7TnnhBJWulY7OIO4rfnReXipjiBtHS2xncFGpgAUvifjc7j0K - 8bndK0Z8esVGP+L7DCs/9yAP33MEVmx2KDAqncq1OUQxecfF0jC7gEdHwBBIF/CVCvSuwB8IjMJQbxE9 - UoJ0AxUEPTVYwGAA4SP07cRr5Ot5P7w/3je/R4OR+9EeNi6wR7jOOZ6K9vjb/bfm24JwYe+hOKRCFv1h - xeeK/1GI/xpCik/T0P/jNSj+brJzyUP3HOgEnuU0ULbFToqC0FHZR4pcwLQuYBSEFqlA7wrUesCtKDR1 - Br4g0N3ACgSRGrzAYADhI/TthOBSdF143rf+PrEDuD1MvI/uYI9Ve3h3gS0KufWnr1jA36D4hYg7/BDI - Itur8pCtR0BY3DMMQKmEGSINsAtUQFvITsAu4LUglKlA7wos6wG1KPRRExiLRWpKMLmBOTVYwqCHLq45 - lG34NfxaIboUnvfN76G/X62cFUp7OMpjFt1daGvF7eE3LKguPrd7j0J8jgcUn16G/eP7bP+A1KOW8RiO - yOQbQdW7UrnWX1B0z+NiXaBCppYKPApCmQr0rsBrPeAHBEaLCBAYAtUNrEDwCYMEwoDCIlSx9dBELxJe - fx9+T3aiqIw3tM7AGfucvFxuAxd4BF/o71nghxWf272HEf/Vf0X8L6KpsP85tkIc1xWf9q8PR2TqNLvT - RU+22E1RHQ9TBARnF7AqCM1dgWc9YA2BOR2YIbB0A5kWdBBEavAKgwaEHqrI7kJzaNvrrzdER/B78Hvx - e/J78zGENx6tQRAW21leMrdxd7FtEUPwI4v9a4nPM3/GP4T49+EAXP3fWmSzhNZj6Gkg1PWqcIE6ucfE - 4pBwAVMq8FoP+AmB3iKa1wlUNzBqAwUE4Qg+YODQBS0u1NfoM90QnkWXwvN78zHwb0EvF9uzkNtDh9Pl - kpfNGKjg/4YL/ilf9J9ZdBaf271HIT63e37Z/r/gZ/+PaDLcCNsCSO7/S8lDLH7YIxufDozKoLJpX1Dt - bhoAairQuwKPeoAh0FcJGQKjKPQDAl9uYAJBpAZvMEggDCh8hCE2Bwuuis7BouvCC/HPimOJGXKMStXM - 4jWCr/mPasjLZgy+cYR64BK3h/d9zXxu9x6F+NzuKTmfZpcV4nPcmS+eAN4gD82/4YhokMsuUDplHYVh - 1tfoclQUhQICfO21HvATAr1FFOsEvFikpATVDbyC4AMGAwgOXVRvIbczBNdnugxDdCk8HwMfCx9T3T77 - KCiqCd9CvmTVHvIDF4Dg23uY4YX/TPGnYvbPeopoEtIQfu538acO8WfinAk/BNXqR0+2+oLqQkheGxCp - QO8K3FpDL52Bj3TgBkExbuAGQjEwGEBwsKC+Qm6nv85tpptE14XXj4ePrUa3rWgPG9wHBJ87olI81tfR - GcRCgIKv2eb9FZ/bvQcWHzEvEjP/LwKAe/Ns928ttFn/Uqjihj0y5U0uBks3/ZAiYfmVIfJTOgR6PWBV - FPqCQFknsEwJihsYtYEFCN5gUIHQQ4BhEeo24jXy9Vaim4XnY+Jj42OMasd/jziuEI65wqo9RPHVmWfh - twyBN/HVXv9hxJ+Gqn9BNW32oybg98X7t5CHUrIRGBEdZA933Q+uO1K4QGwvuACKQgGBXg9YFIUPAoGl - G3gBwScMEggDCj10cRWR9dC3V/dhKbpJeD42diw+VmfLGaIzcITHWv7pdogwmcX4warge1TiT0EsjYb4 - SAETjNl/wq/Wz9twRCYvsjsT4AK74AJHqEqnI54QyKLQKwRcE8gWUV8ssqwLFDfQawMPEPyAQQ9VUF9h - fp030fm9zcLzMfKx8jGXT3pOrhHEdZWXzxgsAgAQzxX+5K/43O6VRPwZwdhPhBD/R2zzULNfHwEVo0ux - CwTBBcq0PEiJffJFZyAgsOgMSgyBNzdQQVAcQdQIPmBQgShpqPvwJjofg1l4PlY+5pq98qlMdC9uDwvs - YTGJ8hIag28coSg8goKssOBhxOd2zyw+LJ/eSxPiFyLuLrAVoPLf91CzXx/2iIZzuRYo1XgLVUj/gupD - PAEBXMA3BEWFob5YZJUSVDcoFgTFFTxgUIHQQxXVKpRtdcF9ic7H4CE8jpWPmaNa9y8opEZbtIeub59w - upzyEhrj5iKbAwDcvAsICnXxueJ/WPFXJuFnfycab6Pv8Bqe/T7v+pVkPBGR8D/oCH4MrJFHpVscpLi8 - 46IQfFgI3NzArTbQ0oIZBFEj+IDBAIJDimiA4SX07fTX6fvxKroX4fmY+dj5HCp32UuBUU0LHOGuK+im - AuRlNAbfOIJA39/jNPAoxH8rFB0GAID49/G1uOmz0LZIvt2jGfaIxKGc30IaLKEnkQoSeueLwtASAo/u - wEdKUNzAMy2YQCgOBgmEAYUeqrBqKNvorzP240N0S+ERfOwMMp9LRFutPYQTfM4ttbyMxkBx1hwQFH7D - aeBBxeeFnil/JdrSU4hP42z01WxbIcT/6uu5NvdfBPmwQ3tYpMEFR8XmVKrpXqqEWV6z69HiIZCLRea6 - wM0N1NpATQsKCHpq8AaDCoQBhRq6sIrAauivE/uQ+/MuuvuMV4Xnc+BzYbCfSdMeLg1wxq6xag8h1EC2 - 6u84DbD4XPGXRHye/TsG4Pv/KcT/Advx/u4stnWQb/FohyMspjZcoDCo7mgq1fwgxfQ8TuGZh4ogMBeG - CgSWKUFxA4+0wGFyBJ8wqEDooQtZXCivUQXnsBS9GOH5XPic+Nyeaqy1hwFhsa/Iy+g2UA/MZtH441ol - Fn8tir7ZlYT49ydq1o+qf6Pc9S8z7M7EGaCaghssExAk9D4OAA66Q8AtIkDQ7yCa6wJLNygOBJMrWMGg - hypgScK8H5+i45jMwrOTCeERfE58bnyOZVxjtTUCZ2wPeRmNIW4cLbTt4M7gZ3YAs/jc7lmJv6g20fp2 - QnyOe7PFwx530Wl41ByPdPByJyA476jYlEJTd1M5iM5OwC2iVwi8pgTNDTzSAocKgh8wFAGhQaGHWVSr - KNpee726T2+i8zF5zHiEKjwHn2N4h8MUWrcPrxQWOsJiU+SlNMa9pbb/AgBn72IG32cHKE78Wc8Q7Rym - if+Sjb5F3SCtv4nc5S87xN8VdLoKHNV7UGiz/VQRs7te7jEPCMx1gYcb+AJBdYTiYFCBMEFRopCv1wX3 - JbqY7RbC6+Kzwwm3wznyuT6d9TkFVdXaQ8czrkryUhpD3DhaaLt3dz7aQwbAm/gzQoj2TUa/j+IP4v+I - 7Vh8hOUK5C82Apwu8WnioOhJgOAA1e12jGp2gd2ZIbBKCRa1gZoWzCC4uYIFDAYQHCyYCoaEwzKUbfTX - uQnO4UN0PjbPGS+FR/C58TnyufI5l2/9MTkqNePPHl7jZXZ5KY0BF4iGkD+jgi+0FP8NB9FnU/H//yPE - /xnfBzSF6Ci2PJIFn5IOR3jCIq4HglxzKbTpAYrreYyicOJlWhz03w0sQTA5gi8YFCAMKDhUEREGIDLM - P9dfp+9H7LMY0d2FLzp+N+ERfK58znzuZZt9QPaIJH6O4LBVe8gVPM/ob7k1dJv5pYi+mInv/YcQv4CL - Pl7tW2Q7wylEvvyfO7Q/MpWwz+6MLwxOXCEgSOyDnAiL9wqBdAO1U/AAQcLAF9XDFUwwqEB4QFGSkK/T - 98P71PfvXXQvwuP8+Zz43ATsOFc+Zz53vgZlkvnuYfx9OCgqdsv28EWG4AfuCnTxj8w1xL/PS73zhfg3 - +HcZyZf9OoM/Ru1wJp4E1YXBSRtEOkgekE+VcDF41ZAh8OoGelooBgSfMKhAKFAYYPgR6mv0/aiCc3gT - Xc/x6oz3EB7B58znzteAr0Vo/JtaZxAe+5q8lMZgO0c6WMGdwU9cDE76V8P2hfjzRMX/LX7uUUv8KoN/ - 3x6c4Lo9sklhcKNtAoLGA1BVZwMCtIpmN/AFgpoaRLHoBwx6qIKJ0IUsLkyvM+/Xp+g4Rl/Ci1nP56qI - LyYFrklw/RckBJ6/tZQ/vAmBP+fevoBTgUl89Pu15Ka/jRHwTEwYUsG39kppgGCrSAdJffOpTs5RsV4g - 3MAqLZhAcKsR/IChCAgNCisw/A399fr+1PfwKXpJhEfwteBrUgodVGANrT20h8U0l5fSGNzTIx1cYbv/ - CUWhvMN3+zcnvj5gZ7Uczvi79sjUwqAG71NIkwMU2/M4isPjcIIDwg28pgUrEIqDQQXCBIUaRYC4h9W2 - IuT+dMGLFV0RXrd6b8LzNSgFh2SXDMEkCWm8jxxRHfgTR9/bnTFR8lIag22eZzzXBIhLN5fayssf/TaH - dIJr9oiU+4EJqyi4yX6q0/UoNRtykp5K08hX04IKggEDg+AHDCoQblBIMNQwIJFh/rn6Wn1/huAcPkTX - izuz8Ib4uvAIFp7dMST1AD3Z4gAFNd5PQQ13kb1ic24Pb1j9+lrM+hSAsOeR3+D5pYZWE8SfsTsb3A90 - LaZgnGQkLlyr4aeocvvD4iL4BYIvGBQgDCg4pGACjBKEKrQhNge/h5+i68Lr5+NN+FBEXI9j1KhfPgWm - IA0kf06O6HdEPYDYZ9UZ/Cp9/sMMfkw6wOk6aA93FTrqvyxIL40L0GTgCS0lSBvUQTCnhuJgUIHwgEIP - VUhfob5G7kffryE4hw/RVeENq1eF50BKLA8XbDr4hHDFwOT95Gj0Odnr8cfNXKgFXOf5z/fLS/j7H7zQ - AVtbLSrdGgMoKHmPAKFet6PUesQpqoQZxxdHgIAwQPAHBhUIMxR6qEL6CuU1qthmwTm8iS5muw/hQ1L3 - U10UxGnDTlI49ilmfcO9ZK8xWJ/5G61+M9kfYjjC4vgvkhXaK7a8Hxi/hoJge0/jYrbCxUjud4LK4QLy - hdJBcHMFCxhUIDyg4NCFQxiAeAl1W4/9INT3KU50vbjTrZ6F5xooMusQtRp6kmK7H6PgFAjPsz5+Pdkr - teXFoMIAZ8w4K9v/Qw2cZP2AcNcVXgFz1BlPgY0+E7UBW2HGs6eofrdjSAsSBD9gMAPBoYqlhpWwHFbb - cpj3q76nT9FV4XFu5VsdpEZohZsPPklPw/qF8A33kb32OMz4eL4xdMPhjPnn3MH7LQz+3fx2Z9wyYXmV - 0wsC41eLPFgKF65B7+OUPvIU1epyBLUCQOAL6Q0GFQgTFHqYRfQnPPYj968LXqzomO268El98qk1it5q - HQ4Lu7c3RLjW4rwzCqTlz7X6WwV/isHUo++9yo9LcQ50JO0UIHAq4AvHjhCde0y0SVr+1C60gEEFwgIK - PQw4/Az1tW5ic+iCc3gRnWubCNQTfPzpqG9qdjqMmkcKn7id7NWHQHSc759t1nsb/1U26T/4UzSO8Lif - 7BENChx1JqAo2i1mSzmIEJ93nLJGnaaGsNCKyKFcRAkYFCBUh9DDAINDFdFXKK9R92WIzSEFN4vOnU2t - zkdFjueo0fEw8vx+IXxAg91kr8XLvQm80POj3Rk75U87672NoKfjy9nD4kSnYI9oWGCvM1GAwPkyFKKL - i4tisQ1mFd9uDk//AiJAABluUChgGHD4EeprjP2oYiuCc5QBHNU6HhH5PWvUKWqI9OXEcYnZzsIn7qKA - OpO08+HiNzxm/hMRCaXlKT8eVkP+jsJ1GgiJBfZaY8iesFmAwMFFVGz3o9QGeTUTzsAXvzpEqIDvsygs - kAgFDg4DEC9h3l7fjy42dyylAERE5iGqxyuag05Qu9GnKaVfvpjtIdhGiJ6EcK2nALZ6Z4Ke59fx01Py - FB8Pf4Z43AwzRny8ilukKl0L7NGzyJ6EnhkXmmEoj1qhducjlDogn9pCjIxnT4u7jzFos3hmskuUhbWz - eCJUQdXQfy6DV+gqoAuo2PYw1cw+QglIQy2GaIJz/56Ir6PamURP/IgC6r1F4jiF6HE/wOpnPBER7f7n - 2R+Pko2gyNhA/jMuuKAXxYV1NvjZXq1/YUD0XMCA3CrtloGogKqbZ6OrxzFqOvCEKCLbjzkthEsfcVKI - 2ASwpPQ7IYP/ny9mc/PBJ4S4/Breni29JXJ5wz7HKbrbUYpEYecmeNJniug9kdvFgx0s/AWHM3bwH3Yx - 59cbo/6CQjGeZxUu8i3tYsffD4jq/HNA7YkUELsMxdanQhwdCo4gdBVlmx+g8DZfUCUUkdXRjtXsdMQt - eDZXbntI5G9OMaFIAUVCS7ERTyQgp0fPp4CaYyigcoefVNHtYTGTMNtryIN9PH7RER39V15QgjO8GBAe - e1ATQQPCXqn19wHsELUnUUD9OfRE3FptpkoRi4snGiDit9MTsSsxu2dQQK0XKaBq30J7xVY/4D34nj3/ - dTGIH7uH3/+x6L+BEeKs8/eA8JhGLAhifYAz7nIRFHqg945I/tFeKe07xPf2Shnf2aM6/2ivnKl9Hdnq - e/FzY1Ybr7sP1znL+0UMDwiLi+FnIOVbPx6/1fH3KNd/aoVkbFMI11vAwenDGbsQ39tkDkd47FL+Oa/H - 8yd3ApyxSfw3g6x+Hezj8Xj8AYfN9v8Bci6WpzuY5BoAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGeYUxB9wAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6AAAUggAARVYAAA6lwAAF2/XWh+QAAAACXBIWXMAAAsMAAALDAE/QCLIAAAztUlE - QVR4Xu2dB3gU1dfG596Z3fRGQglJKIHQew/SkSpNpCkoiF1EQRBRmiAgUkQBURD/IFasKCrYsKCCSg01 - IbTQAyEQWvr7nTO7E2fyjRRJQpCc53lJ7rKZnZ3fOeeee+fOjAKgSDexbF8s0s0j2xeLdPPI9sUi3Tyy - fbFIN49sXyzSzSPbF4t088j2xSLdPLJ9sUg3j2xfLNLNI9sXi3TzyPbFIt08sn3RrGs04ZbMJX6tyPLH - jGNulsUsfM0NO/0Ls/1Qk2kkh/unSrrUe4vsn804zmbZGQccH+ucwLPwNTfsdBVm2Qn6xBKNpGzf3s93 - WM8yEdO7FA+Z2NLpGFRSUerSf4eQ2AmcJA/X24sywxWY5Ri7TVIUBdIBDAtXlNoNFaUlHeAW9elnHSmb - +ChKefoDP3ofH2s94Cx8zQ07XYGZd8qjnqK0eyKq4usr7rk7fu+smVnnP1qGjBXLkfbxhzj68kv45cEH - zr7aqOGaO3x9J4UqShP6mwD+O5IXiXeyyBGsZj6+utFBKk7HudWtivL0CEV5a5ZQ/ljg5Xn8A3+/CyvL - lkn/tmb19C9LFM9YrkqM0dQ/KNLC6M+8SRx0eeYAOTtGxDybStHztdatftg9c2Z21k8/ABv/BP78Hfj1 - R+Cnb4Efvga+/xL49ktkfvw+Tr00Ez/17ZMyukyZz2ooyh20meIkdgLe0RxvJd2sZgEfTBCbKUrfoYry - 5quqjP2aAG9q0Rxx9w7CoYkTcGrJYpz7/jucW7USB0c9he8jwjFBiE0VhOhDf84OEEji45onDpCzY7XI - E+c2afxDwmvzCfp6YOsmAv8b8NtPyP75O2T/sArZBD175XJkf/kxspZ/AHz2HvDJO8Cyt3BhzixsGXRP - 9vORkd/UVJR+tMkSJHYCw2NvtoyQ810pArwpnbcZrCivL9LUhJ/LlsXOHt1xeNxYJL/9FlK+WoFzP63G - hXW/k9bi+Ly5WBvdBNOFSLhFUV6SQmlNm6lGKkviTJsnDsBAeGv+94WETNsybmxq9nqK9u0xwIZ1yF63 - Btm/Mvzvkb2a4H/H8D8n+J8g+/NlyPrkXWR9uARZ7y1C9tsLgKXkOIvnInX6ZGzp2xsTwsK+iVKU7vQR - QSTqwvSsYNQI/1Vj6Dnfr5SihFN6f3SqoqxZGVwsa1ubVjg8ehSS3nwDpz9ehuRPP8apTz/CGXKAlG9X - IXH+q9jYpjXmSZHUXlHepYM2gDbTnNSARIdTz64cUHwcr8kB9J2kfFJ+Xv26q5M/+RiI2wnEbED2X2sJ - /q/I5sj/heD/+I0L/ioX/CyG/ynDfwtZ77+JrKWvI2vxPGS9MRvZr89A9vwXgTlTcf7ZEfitTeuMBwMC - 3qW9jqaP4wLGl8R1wn+tW7CAjxBKpbsVZcoiVe5bWyESe/r1xfFpUwn8QiQteRMn/7cIJ99ajFMfvIcz - XyzHCcq6MZ06YbGn80JPRVlBEfMIbYZ8R6EEwMlZj3zqPf6GT7LyNTfsZDL9jyPIo95v325bxlrq32N3 - IHvzX8heT/D/YPg//w3/+6+Q/c0XyP7qU2R98aEL/kdu+BT5WUsI/qKXkUXwM+e9gMyXJyFr1nhg5hhk - Tx6FE4P7Y1m1qkdvVbVn6WP5i7AjcEYwuoUb3XK+A3252pTm576jqcfXV6+GA4MHIZHAn5j3Co7PmY3E - ua9QlM/DCcoAye+/i5MLXseu3r3wob9/1r2K8iuNrKgWVDqSOOp5lFWBxF0pH7P/FzgWvuaGndzGfyz8 - qZB4s9ktazOpv0Hsdjd8SvsM/3eCv2Y1sqngM+Bnfe2GT31+1kdLkfWBAf9VN/yZyGL4rzyPTIKfOe0Z - ZE4eicyJw5D93FCkD78PO9u2xKSgoDU0xOlM+8CFDH8pT9KNmg1y9pkiviKBf/l9pyNlU83qODDoHhx7 - fqIe9UenTsbRF6fi2MzpOP7KbJxctBAnyAniqej7qlRJUDG4sbyiTKDNdCG1INHIT0/31IMohEo/RjlR - bzYLX3PDTm7TNzI4JPi5M599qqf97C3rkc19PlX62b//Qv2+Gz5V+9nfrLDC/5jh/w9Z7yxE1lsE/81X - kLVgJjJfneaGPwGZLz6LzClP6fAzxg1BxjMPIuvpwcgafjeSe3XGF5HlznRR1Sm0G5wN+Asa2eBGcYKc - /SwlRBil+slvq+qxDVEVsb//XTj67GgcGT8WR8aOwZEJ43CEHOHoC1Nw/OVZODF3Dg48NgQ/VqiA8Yqy - h4rll2gzlPWVViQa+iuVSaVJHCCXrZksfM0NO5HpO07/BC3v1y8WO7dRn7+R4P9B/T7BX8fwf6Sij+Cv - Xomsbwn+ys+QteIjqvjfJ/hvI2vZYjf8+W74s5A5n+DPmYzMlwj+dII/1Qo/46l7kT6sPzKG9kXWkDuQ - 1r8Tttauhme8vVZTymOPN7IBp7jC3CXw8dOPIXmrX1dFGfqGEHv/oGHa3h7dcPiJx3B4xHAcenI4Dj41 - EofJEQ6PIyfgTEDRf4iGdH/Vr0cFnnKqjaK8Q9vgAo9+1edQuMKn5KgXzEY/z8cix9nszMLX3LATmb4x - 2mrYD0OGnOZ+H5z6dfhc8TN8Gu5RxZ9FRZ8OXx/uEfxP3PDffYOKPoL/vznIXMjwXzTBH0PwRyFz0nBk - jH8MGc8+RPAHU/ofgHSCn/7w7Ui/vwsyB3dE1l1tcKxJDbzl73+kiRBDaLe4n+PhDXt9YewSdMekfwTR - 6jZNUdb+HBKM3W1a4uB99+LgIw8hgXRwyBAcHPY4DrIjPD0KRyc+R5ngWWxv3w7LfHwy71SU74jwo7Qp - KvL1Ao+SQE6Bx5nwqibQLHzNDTuR8UZ54z7TatX8ImPV166qXy/6CD4VfVk/uuGvWu6C//kHVPS944L/ - HsN/jSp+gv/GS8h8jeDPnYzM2c8hcwbBf8EFP9OAP4oiPwd+Tx1++sAOSO/fGhl9myG7VxOkNKuKn4ID - svoJucCDKmfaN84GfCBs+7zrYDn7UFYoNUYpygcrvbywo25tHOjTi/r6u7F/IImKvQMPPICERx9GwlBy - gpFP4ghlgD139cMPYWF4WlF2Uj8/kTZzG4mzHhd4kSQe1vHI6F9NmFn4mht2IuON84c4qZNp+Fbz5nGp - H3/omuz5/Udk/UTwvyf433yOrK9ouPeFGz6P9d9fpMPPpHG+C/50gj/FDX8swX8amc8/icwJQ5Ex5mGC - fx8ynryb4PdD+iMMvyvSBzH8Nkgn+Ok9GyG9a11kdqmBi80isT3EF88K8UuwEBwVnAa5NjCi4XoYHysd - RjEhAu8UyrPvamriprJlsKd9W+zvcwf2kQPs69cH+wb0x/5BA7H//sE48NCDlAGewIEHH8CGunUwX4oz - 1LkvpQ3xxBhP5jQisaOHkvg7XtOQ2MLX3LCT2/iAclXpF6IozSZFRa05OGki8O1XAPf93O9/zfBprP+Z - Mdwj+G+/jswlBH/RbBf8eVNpuDcRmTMJ/jSCP9kE/2mGfw/SHyf4j96B9AcI/r0dkT7ADf+ORkjrVhdp - naojrW0U0luXQ3p0KSSU9MJ86lOjhOCDxSnROLfAB6ggLcfpGgml8yyh/LkmMACxDeph320dsafbbdjT - vSv23NEDe/v0xl6K8r13D8B+6goSHnkYsZ074uugQDyoKH/SMX6CNmOk++okGn3rDp4nk2IWvuaGnUzG - H8xph8/kVe/k6fHSFx3an0p55SWAIh8rP0H2cq74XWP9zHcY/jwXfH2sb8AfR/BHE/wRyHzucWSMdcMf - QZFvwH+Q4VPkD2iL9H7NCX5jN/waSGsXhbRWZXGxaSguNimBtMbFkVjGF5+oMqWpEE/RvnGUGNVwQdQF - OVEfKkT4A0J59SunIyumfFnEt7gF8RT5u1md2iO+KzlBj+7kBD2xpy9lAeoG9tEIYEON6lzkJTdWlAW0 - GaO6r0fi8bw53TP4a/4+Fr7mhp1Mxh/Mwy6uvKkQV8qSJ3R/uHjxFb/37Jl5/uUZAI318QkN+d5b6IL/ - 5svIXEDwX+Wx/iQa7hH8Fwn+FBP80fcT/HuQ8cSdbvjdkD64E9LvdsFP60Xwu9dDWmeKfB1+OVy8JQwX - GpXAuQbFca5eCM7XD8bJ8r740SHRU8g5vG8kjpj8rgv0SKR/5C1C9KHUHftHUAB21aqO+GbRiGveFHEt - myGubWvEUUG3u3Mn7O7aBfG398C+O/shrmN7fF88BI8ryhaiPJw21Y7EUc/VPZ/A4WyW53MeFr7mhp1y - Ge8EH1AecnAm4CFINSpU7n+mVMk1m8izz784CaDhXvZScoA3aKw/n+DPIfgvjXfDH4mMiU/QcO9RF/yR - A5ExjOAP6YX0h7r/Df9Oht/EBf82ivz2lZDWujxSbwnH+UYlcbZ+cZwl+GdqF8PpmkE4UysISZG++NNT - xb1CfuQUoirtWzFSfjgBb0uHHy5F+ZFSvL3K6URMeCji6tSktF8XuxrVx67oRohtxk7QEnG3tkVch/bY - 3eU27CUH2EpDu/c8nBkdFGUZbYbP2HFfz5M5XOTxsTWfDMtTs/A1N+xkY/zl2SO5n+WChGeeOOLq1FCU - EZNDQ9dvpb7u4sTRAFX82fMp9c/m4d4zyJhK8Ccx/EdorP8ADfcY/l1If6y3C/59nZF+T1uk3dkCab0Z - fn03/MpIbR1JhV8ELjQupcNPqRuC07WDcbpGMZyqFoikqgE4VdUfJyO9EeOtYYSUqwOF4EkSdgLOWnk1 - aZQDpL0q+yxU5Z51fj7YUb4MdlWvgp01qmJn7ZrYWb8OOUFD7GoajV3NmyO2dSvsZgegTPBHuTKYKZRj - FRVlKm2GK3yewuW+3oj6ayryLmcWvuaGnS5hfCA4sriv5XTLM1HlSA2p8xo7s3Tojh3U7118eihARV/W - 9NHIeH4YjfUp8nX4g5AxvD8yGP7DPVzwB976N/weBL9LTaR1qILUNhVwoXlZnG8SSvBLIKWOC35yzWJI - YvhVAnCikj8So/yQWNEXx8vSkMtHw/NSrg8Rgg8uRxQ767U6gQ6f+vrSD0m5YKVDw5ZigdhZLgI7KpbD - 9qgK2F61ErbXqIYddWpjR4P62Nm4EXZxFmjTCjujG2M1FXqc8osJ5THaFJ+44QkdnsLlOQ1jdjPPo95s - Fr7mhp0uY0Yq5J3mlMXRxt0C9QpK0+ZCTJ4fWmpvbNuWSH1iMLInDkXWeIr+UW74Q93w778NaQPbIe0u - gt8nOgd+KsG/2CaK4JfDuSZhSGlQAmcYfi2CT5HP8E/mwCfwFXxwtKw3yQtHIzwR66thtpTxJYXgippH - CP92mJjz/kZSdJ6nyh3rPBzYFhyA7WElsS0iFNvICbZVICeoHIVt1atie62a2FGvDnY2aoDYW6IRU70a - lnt5gCq8rzQh7qJNccrnQo+zJx+3Aju/YeFrbtjpCo13mneeDy57sVEfVKBc1rqDlLMXlyxxdG+LJkh9 - sDeyRw1E5jAe67vhDyL4/VsR/KZI69kAaV1rI7VjNZxvWwnnW5THuehwnG1QiuAXRzLBTyL4J6sG4UTl - AALvj+MV/XAskuCX88aRCC8cDvfUdSTME7soE8yVck+4ELzGgPeLU+zVOIH+viAhAgaqctoKTc3Y6OXE - 1iBfbA0JREzJYMSULoGYiNLYSpX/1ooVsK1KZT0LbK9TCzsb1scGSvn/09QL0YqykDbVjcSTOjybx1mz - wOcuLHzNDTtdpRmOwH2YMWTkMWwUdcId75By8YfBxZIPRdehvr4Tsh7loq+DC35fht8QqV3r4CKN9S/c - WhnnWkYipWkEUhqGuuDXtMI/TvCPEfyjVPwdIfiHKeoPE/RDpITSpFAPJJTyQBxlgkWqPF5GiL60Lzys - 4mEi7+OlDjp/Fz0aI6VoMEOTv/3iUBHj44mtAd7YEuCDLYF+2BLMTlAcMWGhiCkTgZjI8tgaVRHbqlXR - nWAtVfkzpHKsvFCeo03xKVuu8vnkDY+kjJSf71FvNgtfc8NO/9LMGYELMD7oZUiVqKO7414hPl8ZGJBx - vEFlpPdphswBlPp7NUIqjfXP01j//K1VCH5FnG1aBmcalsZpgn+K4J+qngt+BYbv44JPEc/gDzL40h44 - QPD3l/TAvpJO7C/hRCxlAnKCRHICnjC6nBPoQOg/ZA9VPvyuJk+td2rY6uuBLX5e2OxLop+bqPjbTMO+ - zSHB2FKqJLaElcaWshGUBSJ1/ejvh5FC2UH9/VDaHPf3PKPHY3sODGNSp0Dhs1n4mht2ukYzHIEPNKc6 - 9np2hGpULQ4eqShrfqcDeap+JNK71aPor41z7aoipVUUUm4phzONwnC6bkkkceRXK4YTBD+xUiClfH8c - JfhHaOx/pJwPRb4XDurwXeAPUNTr8Is7sYcV4sTeYAd2+qh44/JOoP9OhV7YU6r69neaxGZPjSLfA5tJ - m3R5YhM5AWsjQd5EheAmivTNoSUpC4RjMznCSk8PDBTKGhqO3kOb47N3Rn/PBbPR318Xs/A1N+yUR8aO - wN7OX5z7YGPoWLeOooyaoSixMcE+ONOgHC60rYyU5pFIbhyOU3VLUeSH4CTBP1nFBf8YwT/ihn+YCr5D - bvgW8BTxe93g44Od2F3MgThSfJAD270sTsCVNzsBZyoGokdjXSnbcKH3O8GPIfhbvBzYrMuJTd4e2Ojt - qWuTNzmAj3eOE2yhrmAjZYNPKFt0EcqntKleJJ7V4+VZPMQr8P7ezix8zQ075aHxweUvzn2eZejoQUO1 - Tooy520pk+JL+iG5LqV9Sv1JtYrjBEc+wT/uhn800g+HGX4ZHxwM99L7ej3dE/x9Jf6GH6/Dd2A3QY8j - xQY6sCtAQyxpm6eKBaqaWFoKLsjYCXhfVNo5jz6qfPozVZ7bwPA9VGzSpWGTpwMbdTmxgar5DV4uJ9jA - 8qWuIDAAf/n54i1NpkYLwcVeVxIPQXlWjx2ea6IC7+/tzMLX3LBTPpjZEXjoyMMzjo4KIULpPlhRvvje - qWYfCvVFUtVg3QF0+BUCKOr9caicLw6VJfgR3jjA8Bk89fO2Ue8GHxtA6Z/A7/TXsMNPwy5fFVucErNV - dW8pIXipWTH6WX2Uqn6+WqWU7xD6/28ibdSlkjRspKHfRg9yAHKC9ZTiWS5H8MZa+v1VTSZXlWI6bY/8 - WWlK4mKPHcxYrHHd4bNZ+JobdspH44NhFIocHdwn84ihWlVFDJkiRMxGbweOhvvSUC+QIp/gl/XDQYKf - 4IbvinoCTzL6+t0c9Sb4HPUG+B00GthOdcA20nZvFesdEi+oamy0Kp+do6p71qkEnl7bzNDJCTZqLIkN - VP1vcGjYQE6wwenABnKE9eQI7AAbSb86HJimycNhQoyh/ec5B57c4WKPnbugTkpdsVn4mht2KgAzHIGL - sZz6gIqnpp2EeOVdKZN3BzhpfM+R74uE8Fzw/yHqdxlRz+Dd8Bn8NgK/lUW1wDZPid8J8pcU9X8RaD3q - yQFc4AU2kEOw1tP/rdfIYVjkCOvJCXQHcDrxE7Wf0WR8iBCP035zpc/TzzwRdt2LvX8yC19zw04FaNwt - GFPLPDPG3UIkpeZeTwj54y+UhvcVo3F9aS8dvh71BP5qol4HT4oh+FsIvi4PTvmuqN+UE/Vu8Czp0l/s - JCSXE5ADaBq+U1U8rsotPkI8QPtqrvSN+fzrWuz9k1n4mht2KmAz6gNzt8AzijWjpRy3QMrDDG8fRbtR - 6FnAkxj8paI+xssN3RDBt0S9OfIZvFBconaOAxD4r+n3e1X5m0PoizR5WpcGNPq+FopK/1Jm4Wtu2Ok6 - We5ugRd5lAsSosMgKZfz2DyWCjke1lmi3gR+O/2/Jeqp8jeiXgdvpPtcUW+A12XAJ/0pyAGkxJ+kFfT5 - NFr4lvapN4mHeca0bl6edcw3s/A1N+x0nc0YLfCUKRdUHGFV60gxcq4qE7hCjyPgPLTjyN9Ov2//p6g3 - wJMY/CWj3hz5DJ8O018kdoJPKfI7qeIj2g9eudOSxKdxC9Uw73Jm4Wtu2KkQmJENOK1yeuWDXSZQiFsH - qfKzbygl8+QOD+2MqDfgm/v6K416C3gT/HX0+7uazGytyqX0+Xxiicf4vOjEmNMvNMO8y5mFr7lhp0Jk - RpFozB1wyq1SR0o9G/CQjod2OnyOegbvjvhLRb1R6NlFvQF/LUX+Uk1mNFHlG/SZvICjGalQjvGvxCx8 - zQ07FTIzsoH53EIEZYN2D6vy62+pb46hKN9qwKffrzbqc8NfQ/BfVdUzVaR8mT6LZw458nmJtnFCp9AN - 8y5nFr7mhp0KqbEjmLMBDxmrNVPlpIWqTOQ5fAv8f4p6LuxswJsd4Ad63zhNPaQJ5T76DB7nc8HHkX9D - wmez8DU37FSILXdtwCOFiFAp+r+sqSd/Jcib3OCvJuotDkCv80jgG3r/IE39kbbPRR8v3+JJHv7cGybt - m83C19yw0w1gDIFhOGmYWOlBVX70hSrTOcr/TdQbMv5/vXQ5wXIqNturch59Dk/xctfDGaDQjvUvZRa+ - 5oadbgDTIURIUe0FTV27hoZpmwz49HODO+KvJur/luvvNtJ2/iAtdqhplaTku3Bwl8OzlTdkFrDwNTfs - VMhNh19XlS3ma2o8n8wx0r416q1g7cDzkC/nPRz17DT090bXsZm2+RtpuqYeLSEEn+3jLocnqW6Isb/Z - LHzNDTsVUuMDrh/0Dqrs/76qJvNULUe+Dt4d8Tp8gnk5+Ob/N6LegG/UEFxMxtBI4gcqMJ+gTEPDEL5S - 15gDuKGKQQtfc8NOhdCMaBN9VfkU9fcZDOxao17v603gc+ATdIbPIwoeWsaQPneo6Kmqb9E+8FU8N9yI - wMLX3LBTITM95atC8RyoyjnfUH+vg3JDN3QlUW/Ad833u//WDN4d9bwohCeSdPieUp913ERa4lAzG0j9 - YlSenuZ6gOcmboiuwMLX3LBTITIdPvW/waM09WNeucPgdfhuBzBDvzLwJHIWI+L/Kep5KplPJsXwTKOP - a9p5Hf0+XdNOlHJdb8CzkjdMPWDha27YqZCYDj9cijLTHOrPv0gXfAb2b6J+A+kP0mc0tFuhn94l4Lmj - 3kj5DJ8ins8t8LoCPtnEZx3jAjT84KVhmKb+RaHPF3XyOYoboh6w8DU37FQITIdfVorqczR1228E+2qj - 3vz/DH8d/d07msyiAvKz/qr8mcf4PF/AK4IsUe8Gz1HPJ5r4NDOfdeRTz3GBrlPRn1Bm6KrKRbSLxr35 - Cv38gIWvuWGn62icSvUDGSnFLQscasJagr4xJ+KvLOp5Otf4/40kHioupf472gWNT+l266nKZcs4ExB8 - Po+gp3uCzyeWGL4OnqJ+lw7ftf6A4e8NdmJbMQcWOLWMakLwxZ5GPVCo5wcsfM0NO11H0+HXk7LTG5p6 - mCdijGLPDJ1lCz7XezaSs/ypR76a1cQFn5dt80oevp9u7S6qfPVtTc3+g6J/hxH1DJ/AG1GvgyfxErQ9 - ISwnDpb0wLpAJ8Y71EPFhH6uwLjer9DWAxa+5oadroPlRH4LVXZ/T1PPMLicyM8F1hY+y3iP/rf0Ov38 - kMbwbVX5Hm2a767Jp3SrkHglMkdu+ZaqnPimQ81YS9Efy+Bz4P8d9bsp6hk8r0nk5ei8LP1QaQ987efA - Par8hnbcuA6AT1QVynrAwtfcsFMBG8PXo6aLJgd9QPD/IHCu6VwT1H8Cb/p/FjuMUd1/Tim+myq/pE1z - 1c7w+ZQurznklTw5y9LrSzl8rkM9t9ZHw25TX89RH09Rz2sR9xZ3XYiiX3xK8I+Ee2J/mCeWUFEYLeUk - 2g5f/saniwvl0NDC19ywUwFaDvzumnzgE03N4KjdkAs8yxY+y3iP7jAu8NxtrCL492jqr7RpXsPHl2Zz - 5DNwYwKHxb/zqeXQKlI8NN2hJq4hJ9hLfTwvOefrDjjq97uj/gCBP1Ta03VFcoQXTpbzwtZQTzzvUJNp - aNiDtsPnCwrl0NDC19ywUwFZLvgy/U8CzxX7ZcHneo8O3g2fh3Y8X/CkQ411CmUgbZ4XcPIaPmMljzlF - 8++8jp+LuBJlhbjzBU1L/JVS+wE93fMVSK7LzQ+GsTz1exEcLeOFYwT/eHkvJFf0wffBHrhPqr/TxmrT - dvh8QaEbGlr4mht2KgD7//AZZC6wtvBZxntMUc/ikze/Up8/TVOTQoR+3z1et88XaRpQeEFJbmNQnLb5 - fH8Jvp/AJE07sJqc4CCDp6hn8Bz1R9zgj5X3xokK3jhZwQfJlXyQGOWDxT4OtJRiBm2Db5ljdAWFZmho - 4Wtu2CmfzQL/Y4LPEzRm+LbgTf/P7zVHvQ7fIfAnOcBCh5pWQUq+ERPffo0na7jY4/7+Umv4GBQD46uG - S4QK0Xmspu79ngrBo9TXc8Qb8I9HEvyKBJ+gnyL4yVV8cLGGL3aRUzznUE+XEHq9wZ9ZqLoCC19zw075 - aHww9Kiwg89ZwA6+MZunK1fU82SOfnUP6UPq92kUwSt4+dRtYxJfsXOlwzPeLx7LM7gSpYXoOEZT9/xA - BWEigU8kwIkE/ySlfB18ZR+cruqLlGq+OFfTDxl1/PF9qBcGSPkTbcjIOoVmVGDha27YKR9Nh99Bk305 - 7Rvw/wl8DnT3+3JHvWv+nqLfKbDSIdFPVX+mzd9O4oq/IulqJ2jMTlCcneBZdoJiTurrvXEqikTwT1fx - xRkCf7aGH84T/AsEP6OeP87U8sciXwcaScG3huGugAvMQjEqsPA1N+yUT6bDb67Kbm9r8jSvuV/PoOmn - HXxz1DN4c9TnnLlzSn1F8M8En0Dtp2ruXvoIXsPHa/e54ucCT//cqzCGZXaCDrTtfb+V8MQ5d8SnVKeo - Z/i1/HCxrj9SSfwzq14AdkT68HP7jlFf0oH+nrsCzkB2tUeBmoWvuWGnfDA9AiKlaLbYoSblwLfRlUT9 - RvdZOz5Pv45+ztXUC2FS8HOG2pK4Er/WSRmzE4RQYXj7BE1NXFvaC6kU8Rz1FynqGbwBn9ustDoBWBXi - ybev5buF8NCzUKwltPA1N+yUx6Z/8XJS1HjNoR78/RLwc6KehoP/FPV8aZgBfxPpA4eKaFW+SR/BEceX - afMsH1+vd60XblgyQTkaHYx3qCc2l/OhSDfBd4PnbuB8bXqNfh6v6ofXPLWMKkLwAx94gui6ryi28DU3 - 7JSHpsMPEyLsJYe6mS+4sIN/NVFvwOcTONzv91XVn+gjeBKG787BZ+e4ks+r6ttwAt5mCAG9f4pTO7uL - CsHs+gE69AsEncGzzrGoDkinLLAx3AuPq+o2SkFcjPIEkTESuS5m4Wtu2CmPTAfgJ4QfDY9W/khAeQz/ - j/Dtot4N3zhXb6zS4RU6azxU0FDtIHXyg+ljuN/ndJsf42/eluEEJRoKMfxlT0fG/kq+yKQ+X4dP0FkM - 31BKDX986u9EKylm098ZT/z4NzVJnpiFr7lhpzwwhi+EUOR9mrrwOyn1yDc7wCWjnlO9XuH/HfXG+XqG - v4H0ulNNKy8Fz8Fzv8/X6XO/n1/r9BiaMU8Q2lqK5xd5O3GMUn0aZQEGframSyksgn+hVgD2UUH4ItU8 - NBThs5BGQXhd5gYsfM0NO+WB6V5+hyZH8K1YdOBu8JeNegN+rqjf4j5Xz4s1PnGqaKfKD+kjeLzPN2Lk - fjYv+v1LmdkJwrtKufB9PxoeVqdhIGUB3QEIPMNnnSGdo9d+CfZAPyFX0N/wyMRw0gLPAha+5oadrtH0 - L1dXle0/0NTUtfRxRr9vjnpjUaYB/lJRbyzU4Js+/uCp4mFVjSHKfL99Y7xfUEUWZxf93AF9yQr3SPnl - V0EeOnyGzdDPVPfHabdSyDmORfliKXUZVD/wE8+uW0Fo4Wtu2OkaTP9SEVJEztHk3l/t4BtRb4A3R70B - 3wRev7ETwedFmX/Qz+kONaWEEE/Sx/DCjhqkgu5b2Qk4ioNonFlruCrX/1rCk4aGAX87QDWWH5JJnBW2 - hnphpFS30Q5ytjIKwvzoqv7RLHzNDTtdgwkpFI+nNfWL1QzZDP6fop6UsyjTSPcEn8Eba/N2+vI9ezW8 - 69TQUEp+xo4xz88H83qceePP488NChWi7WRNPRIT7k1O4K93CQz+FNUHLP49qYofvvJ1ornQ7ydoFIQF - OkNo4Wtu2Olfmh6BvTQ5eoWq5vT7Vxr15nSvgyfpy7MIfKy/hlWeGgao6u/0ETzVy0M+PpA8Rr8eRRV/ - HtcbXHcUqyzEgPkO9dy+8j56xBvwWQyfM8LeMt6YqcnEAEW/xIznKgp0htDC19yw078wHUCkFI0Wa+oZ - nun7+7z+lUW9eSm2a0Wu6+ZPvEJnnY+GSZp6IlDoj0rn8/tcUF3vU678ndn5GGRIOymf/8jboff5nP4Z - /Em3TlQmZ6jij98CPHC7kO/Q+3llEs8QFljXZeFrbtjpX5ignOj1nKb+/LOQLvhXE/WmCzCMqOd1ebwO - fxv9XEJVfzUh+OHJvACTr88rLGfa2Am4oAugXyL6SfnhDwFOgk0OQNF/ksAzfFYSOQDf8vZ/DvVCSddN - q/lMZV5OWl3SLHzNDTtdpeke3EOTI1fQkE8f07NM8HXwl4n6HPDupdi8IJNv+vyVl4bequQbNfCtWqJJ - fJatMN2ajb8/R3Ig/VNjjCq3bCzugeSq/jr4RFYlPxyPYofwx6ZiHrhfym/o/VzAsiMXyLDQwtfcsNNV - mA6gtBSVF2rqybWc6hn+1UZ9rgswGD6vy1tLzjBeU49TyfwgfYwx22ec4r1eqd/OOBNxRgoME0rHuZp6 - Kj7cS0/7Ony3A/DvhykLfOhU08sKwTOYBZYFLHzNDTtdhQnaa3G/pi5arakEmy+5cl+8mTvq3fAvFfXG - Uuw9BH87Rf//nFp2dSFm0efknu0rTPDZGB4XdDy8C2oixfDPPFT9FvcnCPoxgs86WpGdwB/bgz3xsJTf - 0Xt54QhfU5Dv38nC19yw0xWa7rE1pYh+16Gm/unhwCa+rTrfZt0E/2qinpdi8/3+94ZQ6vfW0EvmpH6+ - E7exuic/Z/uuxXifjKIw9C4p3/vNz4FEfriVGz4/8YR/Hinnh888NM4CfBMq7tJ4cihfs4CFr7lhpys0 - QS6rDtfkez8S+M38RA1+uoYnO4J61VGvr8Mv5sSB4k78Qa+No9RPHb2R+vn+fIX+8isyjmKuBwI8FVH9 - eVXdtiPEU496/YknrEhyiIr+2BnkgUcKMAtY+JobdroC0yFUpWHfO04tdWOAH7b4eevP19HlTQ5BxZsr - 6l2TOjlRT+BzR71xAcZ+gh8b4sSbHlq2u+o3p37uYwtb6rczox4IqChEz3cc6rkD4T469MP85BO3DkX4 - YLlDTY/4/1kgX8zC19yw0xUYO4AYKMU8fkrW9rBS2BIc4Hqsmp8XYvw8EOPrxFYfh+liS9UV9QQ+d9Tr - l10R/ISSTnzt68CdqlxD2+fVteaqv7Cmfjsz6oFit0kxfQ0/BKO8Gzz9ZB2OpCwQ4IFBQvCJonwfEVj4 - mht2uhILEaL0PId6eGPZCOyoUA7byAm2Fg/E1iAfbA3wwrYAT2z39yBRQcdR74Zvjnq+2NK47OpQKQ9s - oNcmONSTQULhlTRG1c8LKwt76s9tvK+8z1wPRD4n5fpdNPw7UsEfBwl+jkr78Erm8xT6fPUSO7oxIshz - s/A1N+x0GdNBtBTi3i8D/LGrbi3srF4ZOyuWw46IUtheMoiqXF9sL+aNHcW8qK/zxK5AD/2+/nGBmrvQ - cyLefdkVPwGEr7fbSw6wxFNDfSleo83zXL95wudGSP25zagH/KKoK/jUIS8khPlQ9PsjgYrABH4UTjl/ - bKNM2UOIxfQ+dnbu6vJldtDC19yw02WMHUAOE8q7v0WWxZ7m0YitXwu7alZGbOVy2FU2FDtDg7CzuB92 - hfhQn+6NuBAvxNHQh6+y1a+5o5TPT/syLrbkJ39+S91Cf1X+RRvnx67xkzb5ESyFueq/EjNOGhXrLeX8 - DdQVHCL4Bwj+ftIBdoQSXlioyiMeQn/ukLm7y1Oz8DU37HQ5CxZK+CsO9dC2Jg2w79aWiL+lIXY3rI24 - WlUQV6U84iJLIy48GLGl/BBX0gfxurwRX8KTot71nL8DLL7YMtxTv/TqLSoaawl9+RRfzsX35i3wM2b5 - YLzvnNL9PIWoNluVu/ZSICRQ5O8v44t9pIQIX/xFma+RFBPpfby2gc9x5HmXZ+FrbtjpEqbvVLRQei8P - DsL+7p2wr3M77G3bnDJBI+xpXBt76lbBnmqRiI8KQ3yZEMSX9sfeUPqypVk+JC+KetcTPxm867IrTyzy - 0rKoah5LmzfO9HEkXO+5/rwwTudc3PnVlGLQaoeanUDHgR1gL8HfV4ayAXWRz0q5lt7DN67gpWN53u1Z - +JobdrqE6Q5A5fm0NVUr4/Dd/bC/Zxfsv60d9rdvgf0tG2NfdB3sa1AV+2pGYl+VcOyLLI59EQE4EEHp - Tpev/uRPvrz6SIQnjpV1XXP3hrcjs5wQI2jzxkEojDN+/9aMUUHxB6RcFksjnQMEnh2AlRDqg680NTVE - KP3pPcbK5jztBix8zQ07XcL4rJ/HaKF8ur5FUxx76F4cvKsXEnp1RUK39kjo2BIJrZsgoVldHGhUDQfq - VkBCtXAkRBVHQvlA6v9oLMzi5/+W98Fxvso20nXN3Rs+jszyQgynzzDG/Td6+jcbfw9O637FhGi0VJWH - DwR7YQ8FRHwYOUE4dZVUH3QRgh9OkS/FoIWvuWGnS5igDq3YFE3duOP2Ljg+9EEcGTwAhwf0wuE+3XCo - Rwcc6twSh26NxqEW9XAoujoONaiIw7UicLhqSRyuGISjFQNwjMRPAj8R5YukKB+cjPLGQl/dAYbRZxhX - 9vyXHICNYXJq928lxVP8ZPL91BXEh/tiNzlAAo2WZki5jf6f1znytHeeLhuz8DU37HQJE5SXSr3o4Yzb - d+8AJI4cimOP3oej9w/A0Xt64Wi/bjhyRwcc6dIaRztE42ib+jjarAaONo7CsbplcKxGKRyvws8FDtR1 - smoAknnlTBXfm8EB+Lu4ugIqoidI+dN+PxoSc/RTFkgo4YPvVJle3PXkcWOha551Axa+5oadLmGcAcKn - e3ocPvDo/Tg59ikkjngUiUPvo+5gAI7f2wfH7+qOY7074lj3Vjje+RYcb9cAiS1rIbFpJZxoWBYn6pTC - yRohOFUjCMmklJqBSKruj9lejszI/7YDsHEW4O/lFyZEx69VeTaBh8il/bCbCuU9NBpoLQU/poa7AV4x - xO/Nk27AwtfcsNMlTLIDTPPy2H9w2BCcmjIOJ8cMx8mnhuDEE/cj8ZG7kTi4L07c3QMn+nXCyZ5tcLLr - LUjq2BBJbWshqUVlnGpSDsn1Q3G6TgjO1AnGubrBSK4ViJnkABX+dgDjy//XHIDNmBsI6Cnli3EeGvYQ - /F3kBIf8PPCUlN/T/xnXOObZaMDC19yw0yWMHaD0VOoCDgx/DGdmTcGp55/BqXEjkPT0Y0ga9gCShtyD - pAf64tSg25F0V2ec6t0WyT2aIfm2hjjdvjbOtK6KlGaRONs4DOcalMDFhsWRUi8YU70caQGuy7z+6w7A - 30mfG/AQStQcVW465OfUHeAg1QGLVbmX/o8nhXgozBNheVIHWPiaG3a6hKm058HjVbEu9pH7cO712Tg9 - YyJOT3kWyRNGIHn0UCSPeADJQwfi9MP9cPq+23H6nttwut+tSOnVHGe7NcbZznVwrl01XGhdARebhSMj - uiSO1Q7GeA/tNHV4vFaOT4/yJNCNNv9/NcZRrU8TVxKi92+qTNsf4o39VAd8o8pUP0VfM2icAs+TOsDC - 19yw0yVMpT33fERRlm28szdSly5AypxpODNzEs688CzOTByJlDFDkfLUg0gZNggpQ+7E2Qd74uygLjg3 - oB3O922BCz2b4GK3ukjrVB1pt1ZEVqsy2FUlCMM1NY5cnRd/8B29+AQQR8l/2YyuoNjdUi7YS/3//pK+ - WO9Qs2q4LnwxbnKRJ4Fg4Wtu2OkSpqejFory3OqWt+Die2/i7MJXcHbui0h5aRJSXhyDs5NG4uy4x3Fu - 9EM4N2IQzg29C+cfvgMX7u+K1IHtkdq/JdL6RCOtRz2kdq6O7PaVsK5CMfRQBC+O4CXf7Pl5PhFSCC2n - K3AKUfU1KbcfoxpgBzlCEykm0OvG42nzpCu08DU37HQJ49Sl1lSUTktKl8w+s/g1XHhnIc6/8TLOz5+O - 8y8/j3MzxuL8lFG48NzjuDDmYVwcNRipw/oj9bFeSH+oG9IHd0Ba/1ZI7R2N1O7kBJ1q4NMSfqivKPx0 - Lj7//1+aBr6c8fHUp4krS9FvrSbT96mSHYDvdmJcTFroHMBBOSl8jBQ742kYmPnFB7iw9HVcePMVXHx9 - Bi7OmYyLs8YhddooXHx+GNLGP4L00YORPnIA0h/vjbSHKBMM6kCZoBUy+jbF8bY18IKH4wKFPC//4ur3 - vzYNfDlzzQ1QV3CnKmf9qKogZ+DH0/OzCvnmloXKAdh4hz26KMqLq1o0ReaqT5D60RKkvvs6UhfPQerC - GUibNwVps8cjffrTSJ8yHBkTHkX6M/chfcQApA2l2oEywUVyguyBt2JtjTLoqyi/0DY7km6GAjC38ffk - 7+tPHl+ukSqHUr9Qj9p8JTF3hYWqBmDj1OxB47QGU5xa0oEZk4HvliPt4yVIf38h0t+ai/RFM5Hx2hRk - zBmPjBmjdSdIJydIIydIe3IAdQe9kfFIDyT1aYX5fp4ZFPLP0DaNS72NNQA3k3G241EBf3fu/jj1cyHM - 8wB50hVa+JobdrqM8c5yWvLpoChTl9WoijTKAlkrP0bGp28hc9lCZL49F5lvznI5wSuUCdxOkDaenGA0 - OQFlgoxh/bC6almOfr63X2cSe32BXSlTCI1Bc7QzdB4d8HHgIjFPjoWFr7lhpysw3lkf2ssKQxXlz5/7 - 9QR+XYWsVR8h8zN2gjfICeYhg53g9alIdztB2mSqCSYMQfaER7C9QzTGSpFIOe4h2hZHP/d5nPL4S98s - 6T+3MWw+tobyLBAsfM0NO12B8Y7pExlhNHQbK5Qjfz4yGFizkrqDT8kJluqZIOMdlxOkzycneHkCMmaN - QfbM0Yi7oz1mOR0XKigK3+OHb/RgzP/frNGf72bha27Y6QpNzwKkoLKKcvvTihL/XZf2SPlwCfDTCmDV - h8j+bDGy3n8d2UvnAktm4/yLz2B9u2aY5lBPV1GUafS3vPiTF4CY7+1XZPlgFr7mhp2u0DhNc7rmwiWE - xiutaOzy1WslQ7LXUpeQMHUskua+gJOzJuLIuOHY1LMT3gktDsr3MdTRj6S/4Ys+eNhnLIe+mSr/AjcL - X3PDTldhZifgEziVKbIful1Rlj+jqfEv+HienebteX6cUztAzvFTdSoa6T18U8fmJF72bVwdy0VlUerP - R7PwNTfsdJVmOAGncJ644HRejXJ5Gwrp20m96Xe+yodX+/JMH9/bh6d7jSdtceQXwc9ns/A1N+z0L4yd - gPtvLuI4ormg4+jmyp4XN/C0JkPnaV4Gz6tdeLjDf1MEvwDMwtfcsNO/NHYChsnZgEcIPL3JzsCnNFn8 - O2cJY3zLRWRRn19AZuFrbtjpGs1wBAbMEc6w+SfLgF4EvoDNwtfcsFMemQE6t4rsOpiFr7lRpJtPti8W - 6eaR7YtFunlk+2KRbh7Zvlikm0e2Lxbp5pHti0W6WQTl/wB4IKKvfyDngQAAAABJRU5ErkJggg== - - - - 227, 17 - - - - iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAd0SU1FB9gB - DAosCQh19DYAAARxSURBVHhe7ZrbbxRVHMcrKihBohgUohAeNFGDiYmJIWoffOiDD9aWUqpQbaoIspVL - fDDxwcQH2C3blos+mugfUHqjhJBaSEXa2hZULuXWq7HX3R14oXtpOj38vmdmsDWzZJlzZvdMMr/kk+12 - d75z5tOZ3f39unl++eWXX3759eAKBoPPVtcefD8UPlCaDbAv7NPcfW4rVBt681BN8G51+CDLJtgn9m0u - I3dVU1d98XhDvT47O8uyVbqus1/b23Ts21xG7or+GvrAwC2+KE3TWCwWc51UKsWmp6dwJujmMnJXOB0H - hwbY3NwcGxv7NyvMzMywSHSaXwrmMnJXvgAuYNAUMMZpbDrOjv14WCrItPINARH1BIyPj3GuXL3Menq7 - pYJMKz8e9wWoJWDIFDAxMc5pam6wPY1FQKaVH4/HWVRlAW6jrIDJyQnOuXMd/EVLJsi08hMJX4DaAtxG - PQHDhoCpqUlOc0uj7QuZCMi08hOJhNoC+q9dZX0XeqSCTGUFDI8McQFoUMC16/206F7HdHV3stNtp9jJ - U633aT/Txv7o6eZcvnKJ9fb1cAF284KHRWi+YCdA5BI48kMdC9eG+MFlE8fzBWwMAbo+xyKRKWF+/uUn - 1tBYzzwzX1gsYJpz/vxv/JObE5DnqfkCFjxiCohSiwo6O8UEeKq9thMggocF6HQAEU7LiSbbF7hMMAQY - b6uemC9wAaOGgFgswrlx8zq7+GefIxYK8ER7bQgYNgVEOYaAC47wtABNi3JOtIpdAp6aL9gJEMFOgNsI - CxgdHeECbt+Ocbq6fuefBjPlxs3++9suFGB1f0q3176ARQI0YewEuI24gH8MAXfuaMJwAV6aL2RDgNLz - BdpIH6V3gfn5efpEdVcYLEL2fMEOZFr5XAB9fnEiYGm4JvhXc0uDjgXLKDsBbl0CogIeI5YH9gbeO1QT - nMHGspA5X8iEZNL5GfA4saKgoODlPfsD27/aFwh8WbVz7xe7Pvu68vOKbyoqP/m2/NNt320r/+j7so9L - D2zZWlJdUlocLi4pqivaXHikqLjw6IfFHxzDLe7j94sFiM8X0oFMK19EgFWPEk8QTxPPES8QG4iXiFeJ - 14k3CIyc3iI2EW8T7xDvmre4vwmLkDlfSAcyrXwIQA8jIuD/9QiBS2QZsZxYSawiVhNriLXEi8Q6Yr35 - M6SttRPgNm4IcFz/CZAzX0gHMq38ZDKpmACJ84V0INPKV1CAvPlCOgwBRr6yAqwWWWS+kA5kWvmplOIC - 3EY5ATLb60zgAjSjFTeXkbvyBSwSYD8zkA3+M6SWAIntdSZAgOYLUEeA1PlCJqD1Nt8Fcv7la+nzhUwK - ss92tOvU1v9Na1iBdfDVZLlcmy9kAva5Y9eOAlrDM1gHsYTIekmfL+Dx0rKSEJ6P7bA9cpCHXOTvrtpZ - kZ+f/xrtGx1rzg5+YUmbLxB4HM/D8zcSrxDIQR5y0aI/RUA+2ngly/F8gXiewBegIBPX95MEDhaSlT1g - v/zyS4XKy7sHPLaEupZZNaoAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGeYUxB9wAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6AAAUggAARVYAAA6lwAAF2/XWh+QAAAACXBIWXMAAAsMAAALDAE/QCLIAAAAGnRF - WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMUfzQjcAADJ7SURBVHhe7V0HeBRVF00PLRASCCUkBEIo - oYMCdsQCYkFQbKiggIiAIkUURWmKiIIiFhAEBKWJCCgC0kvovYeEkkZIQnrZ3Zn3zn/v7E5c8g9lIISg - ud93vpTduTs759ZXZlxKpERKpERKpERKpERKpERKpERKpERKpERKpERKpERKpERK5L8tAK4Hrg64FQD/ - z+j9Jbh+6NfcGRe9x5QUPPgqYPihTvAgeDp+uhMu994SXBr6dXaG0fvY4fha5zueKeEDrhIXnYQCBOwQ - 4uFVmVkDF5+N+Wx5UvKoDVZbj0SgOb1eicBG4EXwJlx0giW4JC66xg64qYAvXe/AWKDpTuC+vcC9u+nn - PiHaZAO1JOBD7+NrrTmcg9qrE8eHXA7OJ+W9B3joy8iT3z82+6eoWoMGizJPPwOPxzrB66muqPrW27hn - 6rSsN3bs3PxrVtboBKANHVOBjyOUJvBJlhjCxfg/0q1AZbrObf8Ghn0OzB4kseO13Lzzz2Zk5nY4c9b2 - 0MHDtkfPJymdVIGxirrDRsZBx5UhsNMVmgHkn5gASm0Vssvr69avrTN4sHS7rx1cmt8Ol9vvgMtdbeFy - 30NwafcIXB54FC4PPQr3p55DxbcH4775CzLHnT275BDwFOmpTGAj4BPNt1aC0Wf/F3AR8SlE4mbg2cnA - jDdUceIRIrjZxk0I+3EmAj8ciYrde6DsAw+ibPsOqDH+MzwQE4uRUu6LkvIZOp4NwJfA17VQDCD/xA6Q - Jfbftn1t0Ot9ifSWcGnUjIi/Ey533gfXex+Ea7v2cCXSXTt0guujT8Gt07NwefJ5uHTpBpdnXkbpAYPQ - ZOZs+UF09KqDwHOkM4DARqBb7H8tIuR/VwrtZSict5sBfN9TUWPuPXMG9Zf8juqjx8D3xZfh0/ExlL3v - fpRufQehDQL69UebiG0YKmXMFmCikLif9IQTahI40haKATAhLulA+enJyZ82GT3G4tqSvD28MVxatIZr - 67vheheT/wBc7yfyH2TynyDyu8D1iWfg1uUFuHXtDrfne8L1xdfg8hIZTo/+8B76PprMX4iRcXGrIoFO - 9BkVCWUJHBX0GsHofP4NYNLzv985oAaF9zfeAzZ3SLkgGq5dj+rjxsPv1V6o8NQz8O38FCp2fhrlyQB8 - HmqPyn3fQPO169BPyAurgJ8p779Ieu4h3EYII3B0ZYfi63hdBqCdZBwVFv12713n2+UpuITVh0vjFnC9 - rQ2Rfxdc2fPvIfLbPmwnv72dfDcmvzOT/zLcnnsVbi/1gVuPfnDrNRCufYbAte87cBnwHsp8/DnuXLtO - mZqe/nMScAd9Hhcw5QhcJ/zb0sJFxMdI1P0J+LinKk63iYpG7XnzETDsPSK+N/y6vwr/V3rC/+UeqPjs - 8yj/eCdUoqjbeMUK9Miz5i4GlqcCfUnPg4S7CE0I7Pn+hHzyCQ5mr1L4AAe0g2PIop5btfqwRxvK73Ub - wLXpbXBtSeS3YvLv/Yf8BzrC9eHH4dqxM9we72on/2kH+eT5bt2J/J5vwY3Id+/3LtzfGgG3QaPgMngs - XN8fj0oz5uKZI0fP/a0qw+lz+YuwIXBE0NOC87ndisj/Dmeoeqcw/3U3RT3f8vARBM+YicpEfKV+byJg - wEBU7v8meXk/VKII4PvcC/B/rQ/qLVyErhkZ4kdgC3VWg0lPBwJ7PXdZoQROpXzN/s9xTInjID7YNYMK - iVc3b9nmTvnGpW64g3wK+0z+HUT+3ffDlQo+nXy3RxzkU853e/oluD2rk/+Gg/zBcGPy3/wA7kS++7BP - 4P7+BLh/OAmuH02G58TpqL9mA0akpm6mFqcjnQMXMvylShFu1WiQf87k8XWI+C+fs9oymx08jOCZs1Hl - gw81r6/63vuo+s57qDJ4KALeHAj/nr1RiYwglIq+jucSQcXg3lPAR6TnMcK9hJYEDvdVCeUJfI3yvd4Z - psRxkKZkRnLKyPJPdtbCvmuTlnDlnE+Vvusd91Ded5BP1b7rw49dTP5TTP4rcOvWG24vE/mvvgm31wbD - /Y1hDvJHwv2dj+E+/DONfI/RU+DxyVS4fToDbhN/gu+iP/F49OmM5ar6MZ0HRwP+gno0uFWMIP88z0kZ - SKF+7Iuqmtgi8iRqzv0ZVT8eh2qjxqDamLGoNnI0qpEhVH13OALeGoRK/Qcg+OspaBsVhVFANBXLE0lP - F0Jbwu2EeoTqBHaQK9ZMpoQO0E5cUlHWad68Ey71G1LOb07kt6K8T+S3ZvLbUtFH5N/fAW4PEfkdnoTb - Y09Txf8ckf8i3J7p4SC/r4P8QXDvS+QPeB/ubxP5Q4n89y4m3+OzH+E5aS48Js+H25Rf4TV3BRrtP4JP - cnLXUchji9ejAYe44pwS+Ppp15D6cZ9lwIBeUp5qRW1arSVLUf3Lr1H984kI/GIianw2AdXJEKqPJiPg - SEDeH0gt3W2791CBh9S1wFzSwQVeOwKPoXCFX4PABbOe5/laXNYpTAkdoCmjXj+w3ZQp6Zz3XTj0a+Rz - xc/kU7tHFb8bFX0a+Vq7R+R3cZD/Qi8q+oj8VwbAvTeT/44T+WOJ/PFwHzERHqO+hsfH3xP5Myj8z4En - ke/53W/w/GE53Gf8Bbef16LKtkN4OSMjYZuU/ei8OM9xe8NWXxxTgmaYdO1ctwFPDAO23ZucgjprN6DG - 9B9R49vvEUSoMWUKakz6CjXYED4dj6offkSR4GOEr1qNZ7Kz1V+Av6nAe4N0PUzgAq8xQS/wOBKaGkAz - JXQAK2XlZYcdOLjMo/0j9qpfK/qIfCr63No6yG/fyU7+E89S0dfNTv7zTP7rVPET+b3ehvvrRH5/In/g - R3AfQuS/ayffXSd/PHl+PvmLNfI9Z62E59x18Ji/Ga6LtsFn81Hcl5Iu5kkx1UKVM50bRwO+EIY57yYg - /xzOSDQaD8zvkJuLBnv3I3jBIsr1P6HmLAIVe8HTpiHom+8QNJmMYMIXqEYRoPbP89AuLg6fAscoz1PU - x6MEjnpc4NUmcFvHndE1DZiZEjqAlfOHeMVTvnl506ZI76e62gd77mgLt/uI/AeI/IefgFtHavced5DP - vf5zPTXy3anPt5M/lMgf7iB/DJH/Kdw/+ALuIyfDY+x3RP50eHzxE5E/D57fMvnL4DmTyV8LTyLfc/EO - eC7bC/flh1BqczTCk7PwsZSbUqRkr+AwyLWB7g3/98WLAHytNDIuSOn7i8TwFxQ1qdmZs6i9ag1qLvgV - IWQAIfMWIGTOXNScOQs1f5iB4O+nUgT4EsFTp6HF3n3oK2TGeuAnSrs8MMaDOa0IbOjVCPwdr6slNiWO - g/iCclXpkwzcPSIycnONER/C5aGOcOHcz3n/ESafev0n9XaPyH+xD9y7E/k9B9rJ7/cetXsfwn0wkT+M - yH/fifxPmfzZ8PyKyP/mV3hOI/J//Auecxzk/7oDXkv3wmvFYXitiYTnutPwjDiHoMRc9KWcGiklXywO - ifrcAl+gi774DUa+0e2Q6DhIYufdaemou2sPQv74C7WX/oHavy9D7V+XoNaChahFXl7rpzmoSakg6Nvv - UPfPv/BIahqmAjvpGr9FevRw35AQRGADL5RBMVPidCB/MIcdnslruCLPMvHxlatSfd58Gy7k+S4dusC1 - E1f89l7fvRuT389Ovtbr6+SPJvLHEfmfw/2jr+AxxkH+5+T5OvlTmXzy/Dlr4DlvE5G/3UH+IXitjoTX - +jMotTUBpbadh9f2JFQ+m4UuqsjcKuVQOjf2Er0avmYvMYF8r0+QssY0iW86Wm2i8akzCN24BaHk+XUY - K1YhdBkZwZLfyQgWo/Z8igKUBkKoA2hx6DAXeWnbwfznV/ctCNzPO4d7Jv66v48pcTqQP5jbLq68qxBq - kqV2+i4pafkdixerZd4aAhfq9V26UMv3fG87+a++BffXiPw3uNcfQe0ekf8OkT/cifxxPxD5s+Hx5S8O - 8pfCc8YKeP5kJ99rEZH/+x54/Umer5F/GqW2xKH0jvMouysJZfcko8zuFPifykJbm8BiKahF1gokfSj5 - RtYFmidSkee2RcpnKHSfaJWajnoHDiN0cwTCNm1F2IbNCFuzDmFU0NX5cwXqLFuO0N+WIOSXeQj7axUe - SErGV8CBJOBt0vUQgb2eq3uewOFoVuhjHqakwMF8EnxBueXgSMAtSDgVKr0+OZe4uRlZdpl3RsCF2j3X - l8gAelGv35fIH0Dkvz3KQf4EeHz4JbV739jJnzALHpOI/CmL4Pn97/+Q/wuTv81O/h/k+atOwGvdKXhv - iUWZHYkotzsJ5Yj88vsvoMLBVJQ/kAq/6CzcnqfiRykWWaVsQOfmR7gRRsC6NPJjhaw1Qcg57a1WNI5N - QNi+gxT296Lejt2oF7EDdTezEWxA2N9rELZyFeos/wO1yAAaUWv3vMWqrAQWkB6eseNcz4M5XOTxtXWe - DDM6h2uGKTFQwF+eLZLzLBckPPLEHtfsEDD4/YSE3Y0o15X6cBxcqOJ37UuhfyC3e5/A4z0ifwST/y31 - +tOo3WPyf4bn1wvt5E//E56z18Drl43wWsjk73aQfxze66Kp8ItB6e3nNPJ99iajwv4UVDh0ARWPpMHv - aDoqHs2Af3QOGuco+FyIdWlS8iAJGwFHrcIaNMonZJUqnumtiujWmdlocOos6h0+hvqHjqL+/oOov3sf - GcFO1NsagXqbNqHuuvWowwZAkaDV6bMYLJF4EviE9HCFz0O4nOt1r7+uIu9KMCVGChzgC8GexbmWwy2P - RIUQbt8DfDA4PuFoA8p7pT6dDBcq+tyGjoPHB5Oo1yfP18ifCY+Jc+HB5H+3xE7+rL//IX8Jkb/8ILxW - HoP32iiU3nQGZbYlEPnn4bPPTr7vwQvwY/KPpaPSiQxUjsxE5ZNZCDhDLVe2gg+E2J0sJV9c9ig21us1 - Ao18yvXVvxdiagebgiYX0lD/dAwanDyN8MgohB89gfBDR9Bg33402LUb9bfvQD2OAmvXo37EdtxPhR6H - /AsS/UkXT9zwgA4P4fKYhj66Wehe7wxTYqTACXoo5JPmkMXexmmhFuHOTVKO7Ztw7lTdNRvg/eUMuH44 - GW6jyPvHO8if7CD/hz/gNWs1vH4m8hdE5JPvTeSXWhtJ5J9G2W1x8Nl1HuWZ/ANEPnk+k++fTz4RH5WN - qmdyCLmoGpOHulkKBgoRlSglV9TcIVxrm5j//h1CduyniqOtLTY0TElHeFwiGsYkoCEZQcMoMoLjkWh4 - +CjCDxxEgz37UH/HLtTdEoHGh4+gU64Fi4E/FSlfIF0c8rnQ4+jJ163I5jdMiZECA/BJ88nzxWUr1uuD - UAt90ZVCTOqReP5crY3b4D11IVzHz4L7JO71HeTPJPLnrifyt8Jr8S54LdsP77+OoMyaEyiz8RTKRsSi - 3K5zRH4SfIl8PyLf/2gqKh1PJ+IzEHAyE1WiifzTOagWk4vqsXkaqsXloR5Fgv5CRMdKyWsM+Lz0hRFX - awTa+1KlrDBLFZ8+pqhK81wrGqVmoVFyGhonpqBx/Hk0jolHI6r8G52MQsNjx7UoEL7vAOrv3I0WFPJf - UdTcCGAa6XqCwIM6PJrHUbPIxy5MiZGCy0A3BM5hesvIPWxYJtDhVyFmdk25kBYYsY9y/Qq4fcNF30o7 - +fOZ/J3wXrYPpajXL/33cZTdEA2frTHw2ZlgJ//gxeQHEPlViPyqVPxVI/Krk9dXJ9IDCUHxhAQLgs5Z - EEaRoKcqzp+V8lk6F26ruE3kc7zcRefvonljtJC3DVHE1ntsKhpn56FReg6apGejSVommqSwESShcVwC - Gp+NQePoU2gUeRINjxzTjKANVflDBBJPSYwkXTxly1U+T95wJ6WH/Bvu9c4wJUYKrgLOEYELML7owYS6 - 54GnfpRyaYe0dCVg13F4LtgM9zkU+hftgDf1+mWo1y/z9zEi/yTKbT2L8jvjUYHIr0jkVzxcgPwoJj/b - Tj55PBNfg4mPtyCYyK+ZaEFIohU1z1tRlyIBGUESGQEPGF3JCDRCuL1boorXX1BEakurgkZZFjTJzEXT - LAL9bEbFX1Nq+5omp6DJuUQ0iYtHkzMxFAWiNbTNyMQEiaOU7weQPs73PKLHvT07hj6oU6TkM0yJkQIT - 0A1B7xjY6tkQwk8Dr04ANt9BF7Li7mh4Lt1D3r8fZVcfhc/6SPhsOY3yO+JQYW8i/Njzj1xAJSK/8ok0 - CvkZqErkV6Pev9rpbPL8XNTQyLcTH0xer5GfZEVtRrIVtVJsqJ+toteVjUD7nQq9wM9Udc6DikDTPIU8 - 34KmhGYa8tCMjIDRnEhuRoVgM/L0pgmJFAVi0ZQMoUOeBbMkNlM7+jLp49k7Pd9zwazne+drVWQwJUYK - rgFsCGzt/MU5B+utY/N9wDtDgBONU7JRftdplF5zHD6bouG7PRYV954jz0+GP5Hvf8xOfhUiv5qD/OpU - 8AU6yL+IePL4Wg7iQ1OsqHPBhjBCaKoN4bkXGQFX3mwEHKmYEM0b9wrRjgu9O4j8xkR+k1wbmmqwolmO - Bc1z8jQ0yyEDyM7JN4ImlAqaUzToQtFiucRvpOtpAo/q8fIsbvGKPN8bwZQYKbhG8MXlL84576LW0UKt - 2gpg8otCXAhNzITvXgr7FPr9DiShEns+kR/gIL9qdCaqM/lns1EjNlfL9Vq4J/JDzv9DfqhGvg11iPQw - Qt00G+qlK6hLaJin4jVVTYoXkgsyNgI+F3cK+d4LVDHsSVVkt2DyLSqaaVDQLM+G5hqsaEHVfItcuxG0 - YGRRKkhLx22ZWXhZEZYIKbnYe5zALSiP6rHBc01U5PneCKbESMF1wtkQuHXk9oy9IzRZotMMYNkDVlUG - JmTB72iKZgAa+VHp5PUZCDydhcAzRH5MDoKZfCae8ryh1zuIr5tO4Z+Ir5+hoEGmgnpZKppYBQaq6qlz - UvJSMz/62XC8qi69X6WQb5Pa680IzTWoBAXNqfVrbiEDICNoSSGeYTeEHLSh399QRNpRIT8jfY8Q7iRw - sccGpi/WuOnkM0yJkYJCAl8MvVBk7+CczB1D+FHIfsOlPNg8x4aqsVnU6qWR5xP5ZzJRg8gPcpBv93oi - nqDn+jrs9U7ks9frxDegbiCc6oCGhPAcFS1tAu+q6okIVQwfoKrRrVUinv7XlEknI2iuMARaUPXfwqag - BRlBC6sNLcgQWpIhsAE0J9xls2GYIuLjpHyfzp/HHHhwh4s9Nu6impS6apgSIwWFDN0QuBjLrw+oeLpz - hZRfvSBEWp10K/X37PlZCIotQP4lvL6e7vVMvIN8Jr4hEd+IQbVAwzyBO4jkR8nrbyOiNa8nA7ATL9GC - DILRkl5rqZDBMMgQWpIRaAZgteI++vsTRUQlS/kmnTdX+jz8zANhN73YuxRMiZGCGwROC/rQMo+McVqo - TaH56S+lWH8PheGQC9TXx+dq5GteT8Sb8XqNeEJjIr8Jka/BwiHf7vXN8r3eQTxD2HEbGwnBbgRkAIqC - B1UVX6niQLaUvelcnSt9fTz/phZ7l4IpMVJwA6HXB85pgUcUG0cIMeI1IeKZvBDydr3Qu4h4AhN/Oa9v - nOsgXQeRf5HXO3s+Ey9hB/2dbwBE/CP0+4+q2Eo2w4s0eVi3meNci0WlfzmYEiMFRYCCaYEXeYSkStl+ - phC/c29elwo5busu8non4sPp9Yu8nip/3es14vVwX8DrdeI16OQTbpdkAELgdsJj9PnULaymc+pK4DZP - H9YtzFnHGwZTYqSgCKF3CzxkygUVe1iDfUIO6a+KGK7Qw4hwbu3Y88Pp9/BLeb1OPIGJv6zXO3s+k08f - ypvs2Ag6k+evUOUi+pNX7txH4GncYtXmXQmmxEhBEUOPBhxWObzyxQ5Ok/LBmapY8jCFZB7c4dZO93qd - fOdcf7VefxHxTuS3pt9fUIS6ThU/0Z88scQ9Pi860cf0i02bdyWYEiMFNwl6kaiPHXDIrb9PCC0acEvH - rZ1GPns9E+/w+Mt5vV7oGXm9Tn4b8vyXFKFsU8UP9Ccv4LibUCx7/KuBKTFScBOhRwPnuYUgigYPfaeK - FQ9Rbm5MXt5IJ59+N+v1Bcm/m8h/Q1UzjgnxJf3JI4fs+bxEW5/QKXZt3pVgSowUFAOwIThHA24Zwzer - YnRvVSTxGP5F5F/K67mwMyDe2QDa0ftGK2ocHdqT/uQ+nws+9vxbknyGKTFSUExQsDbgTiEoQchubylq - yl1EcjMH8Wa8/iIDoP9zJ/AwvX+moq6nf3HRx8u3eJCHP/eWCfvOMCVGCooZmAQmw4vaxLpTVbHocVXY - 2Muvxet16K+3FHYj6ETF5ipVTKGXeIiXUw9HgGLb618OpsRIQTGDRkKMkOHvKuq2u6lNa6aTTz9bODze - jNf/A/txzUlPK0IPm2o9IQTfhYNTDo9W3pJRwJQYKShG0Mjfq4p7+ypqFE/m6GH/Yq+/mFgj4rnly38P - ez0bDR2vp46mpPNOwlBFPXdeSp7t45TDg1S3RO/vDFNipKAYgC+4dtFXqqLbc6qaxkO17Pka8Q6P18gn - Mq9EvvPrutfr5Os1BBeTjamTaEcF5pcUaSz2nbr6GMAtVQyaEiMFNxm6t7nOV8VQyvcKE3a9Xq/leifi - 88kn0pl87ii4tWxMeMKmYrGqziYVvIvnlusITImRgpsILeQTN6VmqWLyw5TvNaIIGnkOXI3X6+Tbx/sd - xzoT7/B6XhTCA0ka+XlCG3VsRuhuU9VdQtuMysPTXA/w2MQtkQpMiZGCmwSNfMq//uMV9VdeucPEa+Q7 - DMCZ9KsjnkDGonv8pbyeh5J5MqkxjzRm24edW9PvQxUl+Zx9vwGPSt4y9YApMVJwE6CRHytk8DCbuvEe - YSefCbsWr29BaEV4klq7x7TpXSK8oNfrIZ/JJ4/nuQVeV8CTTTzrGJauoF2ugkmKuovqAd7UyXMUt0Q9 - YEqMFBQxNPLPCNlwgKIevpPINuv1zq8z+a3puG6KEFRALpmrio3c4/N4Aa8IusjrHcSz1/NEE08z86wj - Tz2HpdmnortQZFimiun0Mfq9+Yr9+IApMVJQROBQql3IaCHves2mxrQh0pvne/zVeT0P5+qvNydwq/gS - 5e8IO2k8pfvEYlUseIYjAZHP8whauCfyeWKJydeIJ6+vp5FvX3/A5NdKsaLhBRtesyrKESl5s6deDxTr - 8QFTYqSgiKCRv0eIR3opajwPxOjFnjPpDEPiC7ynORnL7Zrnq2KbnXxets0redhGmi5XxTcvKqpsRd7f - QPd6Jp+I171eI57AS9BqJzOsqJFoQes0K0bZ1LgLUpsr0Pf7Fdt6wJQYKbjByPf8jaro9LyiZjBx+Z5f - gFhD8hn6e7Rj6f/0syv18GtU8Qu9zHfX5Cnd+gReicyeW2uDKka9alOVNuT9dZn4fPL/8fo65PVMPK9J - 5OXovCw9MN6CRzJtmK2KVfRR+j4AnqgqlvWAKTFScAPB5Gtes1wRPZ4l8lsRcfbhXCdSL0W80+sMNhi9 - un+CQvxSVfxBb+OqncnnKV1ec8grefKXpe8W4u3+NjW7TbaCOk65nr0+lLye1yLWSrJvRNE2nxL51WLz - UDMuD92pKIwQYjTp4e1vPF1cLFtDU2Kk4AYhn/zfFdG7i6Iq7LUtChDPMCSfob9HMxg78Zw22hP5sxV1 - C72F1/Dx1mz2fCZcH8Bh8O88tVztmJB9htrUpLvJCGpRjucl57zvgL2+psPrg4n4wPg8+47kmFz4n85F - o4Q8fGBT06g1fJL08HxBsWwNTYmRghuAAuQL2+1EPFfsVyS+wHs04h3kc2vH4wVf2NQTVonu9HZewMlr - +PSVPM4hmn/ndfxcxAWckfL5dxUl6S4K7cFauOcdSPbt5jXiGHnavQiqns1FFSI/4FQufE9m44EUC6YL - qjGpriA9PF9Q7FpDU2KkoJDx/+QzkQWINSSfob/HyesZPHlzF+X8YYp6IVlq993jdfu8SVMnhReUFDwX - JorDNs/3B/D9BEYoytn7yQhqMPHk9Uw8e301B/FVTuWgUlQO/KOy4XsiG5Ujs9Ej24YNQk4gHXzLHD0V - FJvW0JQYKShEXET+U0Q+D9A4k29IvNPr/F5nr9fIt0ncTgbQ26Zao4TgGzHx7dd4sIaLPc73l1vDx0Qx - YbxrOCBByo5jFPXUA1QIVqVczx6vkx8QTeSfJPKJ9IpEvu+xbJQ6lIV6ZBQf2dT081KrN/gzi1UqMCVG - CgoJfDE0rzAin6OAEfn6aJ6GAl7Pgzna7h5CV8r71EXwCl6eum1N4B07V9ue8XlxL8/EBcRL2WGsoka3 - o4KwMhFfmQiuTOT7U8jXiD+ejQpHs+BzJAtlD2bCY18GHkjIxRwhNlAm06NOsekKTImRgkKCRv5KRTzL - YV8n/1LE55PueF9Br7eP35P3U7LvYBOYp6ob6bDOBK746xDMDtA4G0FlNoKP2QguWCnX56BiJIHIr3As - C+WJ+HKHMlGGyC9N5HvsyUD5AxnomWXDDiH51jCcCrjALBZdgSkxUlAI0MjfpIonXlREOq+55/h8NV7P - xDt7ff7MnVVoK4LvJfKJqDN5wCt0KK/h47X7XPFzgad9rgkwWc5G0J50n77zfB7KOjze5zB5PZN/IBOl - 9mbAm8A/3fako0F0Nj+3LzENaE/HcyrgCGRUexQpTImRguuE5gHRQt7dw6ZeyCffAFfj9c0ds3Y8T9+a - fvZX1Nw4Ifk5Qw8QuBK/3kEZZyOoRIVh55GKmtQmPhfe5PHs9aXI65l4nXz+m+G1Lx3tk/P49rV8txBu - PYvFWkJTYqTgOqB98dNCNnrdpsbecRny872ekuilvJ63hunkNyM8a1MRoYoZdDh7HKvhUT7er3e9Gzcu - igSnqTsYZVOTm57OJk93It9BPKeBMvvpf/Qz4GgmXs9TlGNS8gMfeIDopq8oNiVGCq4RGvlxUga+bVP3 - 84YLI/LNeL1OPk/gcN6fr6obSAUPwvDdOXh2jiv5wqq+dSNgnZWI0F7DrUpWPSoEXXena6SXJtKZeEZZ - BtUBnhQFmsfm4itVPazai1EeINI7EaPPueEwJUYKrgEaAZlS+lB79FdbIpR7+EuSb+T1DvL1uXp9lQ6v - 0LnbooJaNWrS8Cqp4bzP4fZG9N+sSzeCgJ1Svv1Wnk2peSIL7pTzNfKJdAaTr8PnUAY6Z1ixXshJdJz+ - xI9rqUkKBabESIFJMPmu5PBu0xV12oNCaJ7vbACX9XoO9VqF/4/X6/P1TH4LQh+raj0lJI/Bc97nffqc - 92/UOj0mTR8nqLZOyDE9c6yoQqHei6IAE17uoB0+DCK/9IF0hFBB+A7VPBfss5B6QXhTxgZMiZECk9Cs - /FdFDOZbsWiEE67K63XyC3h9E8dcPS/W6GJVsVoVC0kV9/t8I0bOs4WR9y8HZyOosUyIac9lUnt4mNpA - igKaARDxTD6jPKEs/e+eFAvmSbGcjuHORDfSIo8CpsRIgQloX26vKh5+VlEtfOckPe87e72+KFMn/nJe - ry/U4Js+tstT8Z2qHiQVfL99vd8vqiKLo4s2d0C2GzpbiD86plo08plsJr384QxUcMCHjKNKZBZeopRB - 9QM/8eymFYSmxEjBVUL7UjFC1h6giFN8g9z/I1/3ep14Z6/XyXciXruxE5HPizJb0c+hNjXzvJSDSCUv - 7GhEKOrcykbAXlwxB2gyURW77zqfR61h+j8GcISRCV8CR4VGCbmYINTD9NU5WukFYZGOEJoSIwVXCVfi - 1vtTRV12P5NM/7ii1xPyF2Xq4Z7IZ+L1tXn1s/ievQpesCrYKQQ/Y0cf5+eLeTNm3vjz+HMrJkj5wPuK - mtA4NoeMIENLCUx8RaoPGPy737FMdMyyYpPU7ieoF4RFOkJoSowUXAU0D1ykiHcfU9X8vH+1Xu8c7jXi - CdryLCK+boaC9nkK5qhqBKnkoV5u+fhCco9+M4oq/jyuN7ju8Dsu5Yt9bWp2yKlszeN18hlMPkeEWmdz - MFgRSenQtpjxWEWRjhCaEiMFV4BGQLSQrXooagaP9P0zr391Xu+8FNu+Itd+8ydeodM6W8EIRU1Ok9qj - 0nl+nwuqmz3lyt+ZjY+JrLRaiDFP59i0nM/hn4n3d6DScTKGYxm4M92C36SYS+/nlUk8QlhkqcuUGCm4 - AlxVyosfKerGe6Wwk2/G6502YOhez+vyeB1+Q/rZnar+I1Lyw5N5ASbvzysuM21sBFzQVaCvHDRPiIXt - 0q1ENhkAeb8/Ec/kM/zIAPiWt6/Y1NxE+02reaayMAetLgtTYqTgMtAseIkihjxGLZ/W0zOcyNeIv4LX - 5xPvWIrNCzL5ps8dcxUsVAXfqIFv1XIHgWfZitOt2fj7syf75lFROlYVB5onWeB7NEMjvjLjRCYCItkg - MtDsggU/CLGK3s8FLBtykbSFpsRIwSWgERAvZL3eiprShkM9k2/W6wtswGDyeV1eGzKGUYp6Pgt4jT5H - H+3Tp3hvVug3Akcijki+cRId+itqamhsrhb2NfIdBsC/V6co0NWq2s5IySOYRRYFTImRgkvAlfh2/UFR - p9+vqEQ2b7lybN4s6PUO8i/n9fpS7NpEfjh5/ytWRR6W8gv6nIKjfcWJfAaTxwUdt3cVtwn59pMWVbvF - fSUivQqRz6h6ko0gA+EpefhOiL/pvbxwhPcU3PDvZEqMFBhAs9iDQt7xgk213G6xoRnfVp1vs+5Evhmv - 56XYfL//WskU+nMULBL5oZ/Hk/TVPTdytO96wOekF4XVfhbilzszbajMD7dykF+VH3dDP6udzsSTFoWj - AN+EilMaDw7d0ChgSowUGMCV6jz3iYr4pS0R35SfqMFP18hjQ1BNe722Dv+CFcFJVrSi/42m0J/5T+jn - +/MV++1XBL0eqJAH2fADVT3cIDlP83rtiSeMaDKIkxmon2rBt0UYBUyJkYIC0Eg4Sm1fN6tiaZ6eiSaZ - OdrzdTTkkEFQ8Wb3evugTr7XE/EFvV7fgFGTyK+bbMWrFkU6qn7n0M85triFfiPo9UCFk1J26WZTs4Nj - szXSq/OTTxwIjMlGJ5tqi/n/KGCk87phSowUFAAbgOssIafwU7LC486hSUq6/bFqmblonGlB4ywrGmXb - nDZbqnavJ+ILer227YrID0q04pEsG35RxWbSz6trnav+4hr6jaDXA35/CPnZ3fwQjFMO4ukno3o0RYF0 - C2ZKyRNFN7wjMCVGCgoiWcrq/WxqfPMzMWgQdRoNyQgaJaWhUWo2GqXnomF6HsIzLAQq6NjrHeQ7ez1v - ttS3XQWes6AF/W+kTU1JleCVNHrVzwsri3voLwg+Vz5nrgdqfyTE7nrU/lWLykANIj8f8dm8kjkn1b57 - iQ1d7wiMdF4XTImRAidoRGyQ8pVH0zNQb+8B1D98HPVPnkaDmHMIT0ylKjcL4Rdy0OBCLuW6PNRLs2j3 - 9Q9LUxyFnhWhjm1X/AQQ3m9Xiwyge56C3UJ+R/p5rN95wOdWCP0FodcDPpGUCjrbRG5QXDZ5fwaCqAgM - 4kfhnM5AQ4qUS6ScSe9jY+dUd0NGB02JkQInsAG4TZL4+c7oM6i9KQJ1dx9AvYPHUff4adQ7k4D6Camo - n5SJesnZlNNzEJacizBqfXiXrbbnjkI+P+1L32zJT/58iNLCXFXsoraSH7vGE4n8CJbiXPVfDfRJI7+F - QnzbglJBIJEfTOTXJASzIZzPRW9VJFik9twh53RnpO+aYUqMFDgjRaLGmzY1ruG2XQj5ewNCt+xEnZ37 - EXbgGMKOnUJYdDzCYlNQ91wmwhKzEaohB6Hn88jr7c/5C2bwZsvYPG3r1ctUNB6Q2vIp3s7F9+Yt8hmz - GwA+dw7pPnlShg9UxfFa5AhB5Pk1z2YhhBAUk4XbKPLtEHIUvY/XNvAcR6GnPFNipMAB7aQiJLp2SklF - zd9XIOTP1ai1ZhNFgh2ovX0/au89htpHohEaGYfQs8kIjc9ArQT6svGMbEIueb39iZ9MvH3bVR565iqC - quYPSL8+08eecLPH+gsDHM65uPM5KGSP+22qDKLrwAZQi8gPOUvRgFLkx0Jso/fwBCovHSv0tGdKjBQ4 - oBnA78Cndx89juo/zUPNxctR84/VqLlqI2pu2I6QiH0I2XUUIQejEXIsFiHRSQiJSUdwDIU7DVnUAuVq - 26urxeShyhn7nrteOTb1tJSDSb9+EYrjiN+1Qu8KKk8TYkFd6nSCiXg2AEZQQjY6KqolWaIbvUdf2Vyo - acCUGClwgGf9vMdJ/NZy41ZU+f5H1Ph5EYIWLUPQ0lUI+msDgtZtQ9DmvQjecQTBe6MQdCQWQZFJCDqV - RvmPemHGqSxUO5WNAN5lG23fc9cr26aekvJt+gy977/Vw78z+HtwWPe5IGWrl1QRH5ySi9rkEKFxZASx - lCqpPlguJT+c4oYUg6bESIEDrjYqaIYr6t4Gvy1HwOSpqDZjDqrPWYTqC5YicMlKBP65AYF/RyBw4x4E - RhxG4K6TqH4gBtWPJqL6yVRUPZmOKgR+EnilyCz4RWbDPzIHvbM0AxhIn6Hv7Pk3GQCDyeTQXn69kEP5 - yeQ1KRWExmahDhlAEHVLQ4Q4TK/zOkce9i7UZWOmxEiBA64KkfOOxRoZ8uMcVJ4wGVW+mY6qP8xB1dmL - UHXeUlT7dSWqLV+HqisjUHXtblTdfAhVt0eiyt6zqHLoHAKO8XOB0zT4H02HL6+cOZb1XzAA/i72VEBF - 9EghNtTMpJaYvZ+iQND5bDyoCluS/cnj+kLXQksDpsRIgQMcAWoMzbPEB3/zA/zHfIbKn3+DypOnUzqY - g4AfFyDg599RZeFfqPL7egT8uQUBq3eh8oYDqLz1BCrtPINK+87B/1AyKh5KhS/B52Aa/A5nYGCuTY3+ - dxsAg6MAfy+fOCk7PKKKrCBukeMzUYcK5drUDawTkh9Tw2mAVwzxewslDZgSIwUOuLEBDMu1nKkxaQoq - Dh8N/7ET4f/ZFFT68gdU/vYnVJ4xH5V+WoJK81bAf/Fa+C/bAr+/dsJvzQH4bTyOittOw3d3AirsS0b5 - fSkouzcFvgfSMJgMIOofA9C//L/NABj62ECFxUKMD7MoqE3k1yMjCMy04DMh1tBrvKSS1w0WWjdgSowU - OMAGUP09SgHBE79G+UHDUfGDT1Bx9Ofw+/Rr+E2aBr8ps+E3bT4qzvwNfj//iYoL18B3yWb4/rETFVbt - R/l1R+GzORrltseh7K7zKLUzCT57UvBers2abt/m9W83AP5O2tiARSJsgCr2BWZaNQOoQXVAD1Wcotd4 - UIhbYR4IK5Q6wJQYKXDAnQzAf5Qqt9f9djrK9hmICkM+RIXhH8N35OfwHTcZvp9Pg+/kWajw3TxUmP4b - Ksz+AxXm/Q2fRZtQbul2lPtzH8quPoLS66JQanMsPCISUWV/CkZZlHSqL3itHE+P8iDQrTb+bwbs1dow - 8Qkpu96pCmvN5BzUpDrgYVVYMqGtGdSnwAulDjAlRgoccBd04t8CC5r/shDeL70GnwHDUH7wCJR/92OU - /3ACfMZOhs9nU+EzaSZ8pvyCclMXo9zM5Sg7ZzXKzN+I0ou3odTSvfBacRhef5+E2/qzqHcsFRMVNZJa - TF78wXf04gmgGzY1WkyQP0z8kxBTa1H+r5mYhZY2VRyyb3zRb3JRKI5gSowUOKCFo43AyPs3bEGp519F - ud5volz/d+Dz9gj4vDMW5UZMQLnRX6HsuO9R9vOZKDv5Z5T57leU/mEZvGetgvfcDfBaEAGvJXvg/edh - uK46gdZRF7AEkhdH8JJvtvxCHwgphshPBVYpG7wuxJEqVAM0IEPYJuRH9H/98bSFkgpNiZECBzh0uR8E - HukenyjL93gdpbv1Rpleb6FM36Eo89YHKDtkDMoMH4/SH32F0mO/Q6nxM+A9aS68v14Ez++XwnPGSnjN - XQ/vhRHw/p2MYMUhdD6fid0AP52L5///TcPAVwJfT22Y+LiQz7VRhC1EFWwAfLcTfTNpsTMATyt1AmOF - PBZKbaD748+i9Et9UPrVN1GqzxCUGvA+Sg0aDe9h41Hqg0nwGvUtPMfNgOeEOfD8aiG8vqdIMHMlRYL1 - 8Ji/FQFrDuFdiy03zb78i6vff9sw8JVgHxugVPCLKr5oq6ogY+DH0/OzCvnmlsXKABh8wt7LgfHtN26F - e/su8H66O7xf6APvHgPg3XsIvPoNh9fAUfAc+ik8h0+Ex8hv4PnJdHh+Pgdek6l2oEhQiozAddbfaHPo - LOYDm0hnB8J/oQAsCP6e/H3LU30VskMVA6jQbkF/805iToXFqgZgcGj2TgRuG25VLgQPeR8uD3aC11Pd - 4flcb3i+3B+ePQfD4/Xh8BgwCh5DxmlG4ElG4EVG4PXFHEoHC+Hx7RL4LViPvpl5SizwHunUt3rrawCM - PvvfCr0r4O/O6Y9DPxfCPA5QrNpABp8sh6WyK4FPnjl0FF4UBdw6PAWPzi/D/ZnecH+xP9xfHWQ3gjcp - EjiMwGsUGcE4MgKKBB6T5uH+o2fY+/nefh0JbPVFtlOmGIKJZm9n0rk74OvARWKhXAtTYqSgAPhky2YD - oZOBnffOWwyXu9rDrf3TcH+SjaAXGUE/eLAR9HkPng4j8HqfaoKRU+A68luEr4zAGCGTKPf3IV3s/Zzz - imSXTDEGk83XVkehOYIpMVJQAHxi2kBGHLVuYyQSbv92Blzu7kDpoDMZwUtaJPDoZjcCz75kBG+NhMeg - sXAdPA5hv67CIKstNwrge/zwjR708f//qvffcJgSIwUG0KIAoeIZoPOnQNSDy1fBp2t3uNz3GFzad4Xr - kz3g9lwfuL7UHy7dB6LMO5+g5erNGGZT048BdIi2+JMXgDjf28/os0pwnTAlRgoMwGGawzUXLpXOUySY - A/z5emKybEMpIei9MfDr/y78B32IaqMnotniFeiWkITvgYMJwBA6hjd9cNunL4f+L1X+RQ5TYqTgEnA2 - Ap7AqUee3ec34PdPFDXq3ey8rGE5eTmjrcpZMo4Nh6lopPfwTR3vIfCyb313LBeVJaH/BsKUGCm4DHQj - 4BDOAxcczsMVoJ2VUgOhK/3Ou3x4tS+P9PG9fXi4V3/SFnt+Cfk3GKbESMEVwEbA+ZuLOPZoLujYu7my - 58UNPKzJpPMwLxPPq1243eFjSsgvApgSIwVXATYCJpOjAXcIPLzJxsBTmgz+naOE3t9yEVmS84sIpsRI - gQnohsAEs4cz2fyToZNeQnwRw5QYKbgG6EQXhNF7S3CDUSIlUiIlUiIlUiIlUiIlUiIlUiL/UXFx+R9B - FEfhihLWeAAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGeYUxB9wAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6AAAUggAARVYAAA6lwAAF2/XWh+QAAAACXBIWXMAAAsMAAALDAE/QCLIAAAztUlE - QVR4Xu2dB3gU1dfG596Z3fRGQglJKIHQew/SkSpNpCkoiF1EQRBRmiAgUkQBURD/IFasKCrYsKCCSg01 - IbTQAyEQWvr7nTO7E2fyjRRJQpCc53lJ7rKZnZ3fOeeee+fOjAKgSDexbF8s0s0j2xeLdPPI9sUi3Tyy - fbFIN49sXyzSzSPbF4t088j2xSLdPLJ9sUg3j2xfLNLNI9sXi3TzyPbFIt08sn3RrGs04ZbMJX6tyPLH - jGNulsUsfM0NO/0Ls/1Qk2kkh/unSrrUe4vsn804zmbZGQccH+ucwLPwNTfsdBVm2Qn6xBKNpGzf3s93 - WM8yEdO7FA+Z2NLpGFRSUerSf4eQ2AmcJA/X24sywxWY5Ri7TVIUBdIBDAtXlNoNFaUlHeAW9elnHSmb - +ChKefoDP3ofH2s94Cx8zQ07XYGZd8qjnqK0eyKq4usr7rk7fu+smVnnP1qGjBXLkfbxhzj68kv45cEH - zr7aqOGaO3x9J4UqShP6mwD+O5IXiXeyyBGsZj6+utFBKk7HudWtivL0CEV5a5ZQ/ljg5Xn8A3+/CyvL - lkn/tmb19C9LFM9YrkqM0dQ/KNLC6M+8SRx0eeYAOTtGxDybStHztdatftg9c2Z21k8/ABv/BP78Hfj1 - R+Cnb4Efvga+/xL49ktkfvw+Tr00Ez/17ZMyukyZz2ooyh20meIkdgLe0RxvJd2sZgEfTBCbKUrfoYry - 5quqjP2aAG9q0Rxx9w7CoYkTcGrJYpz7/jucW7USB0c9he8jwjFBiE0VhOhDf84OEEji45onDpCzY7XI - E+c2afxDwmvzCfp6YOsmAv8b8NtPyP75O2T/sArZBD175XJkf/kxspZ/AHz2HvDJO8Cyt3BhzixsGXRP - 9vORkd/UVJR+tMkSJHYCw2NvtoyQ810pArwpnbcZrCivL9LUhJ/LlsXOHt1xeNxYJL/9FlK+WoFzP63G - hXW/k9bi+Ly5WBvdBNOFSLhFUV6SQmlNm6lGKkviTJsnDsBAeGv+94WETNsybmxq9nqK9u0xwIZ1yF63 - Btm/Mvzvkb2a4H/H8D8n+J8g+/NlyPrkXWR9uARZ7y1C9tsLgKXkOIvnInX6ZGzp2xsTwsK+iVKU7vQR - QSTqwvSsYNQI/1Vj6Dnfr5SihFN6f3SqoqxZGVwsa1ubVjg8ehSS3nwDpz9ehuRPP8apTz/CGXKAlG9X - IXH+q9jYpjXmSZHUXlHepYM2gDbTnNSARIdTz64cUHwcr8kB9J2kfFJ+Xv26q5M/+RiI2wnEbED2X2sJ - /q/I5sj/heD/+I0L/ioX/CyG/ynDfwtZ77+JrKWvI2vxPGS9MRvZr89A9vwXgTlTcf7ZEfitTeuMBwMC - 3qW9jqaP4wLGl8R1wn+tW7CAjxBKpbsVZcoiVe5bWyESe/r1xfFpUwn8QiQteRMn/7cIJ99ajFMfvIcz - XyzHCcq6MZ06YbGn80JPRVlBEfMIbYZ8R6EEwMlZj3zqPf6GT7LyNTfsZDL9jyPIo95v325bxlrq32N3 - IHvzX8heT/D/YPg//w3/+6+Q/c0XyP7qU2R98aEL/kdu+BT5WUsI/qKXkUXwM+e9gMyXJyFr1nhg5hhk - Tx6FE4P7Y1m1qkdvVbVn6WP5i7AjcEYwuoUb3XK+A3252pTm576jqcfXV6+GA4MHIZHAn5j3Co7PmY3E - ua9QlM/DCcoAye+/i5MLXseu3r3wob9/1r2K8iuNrKgWVDqSOOp5lFWBxF0pH7P/FzgWvuaGndzGfyz8 - qZB4s9ktazOpv0Hsdjd8SvsM/3eCv2Y1sqngM+Bnfe2GT31+1kdLkfWBAf9VN/yZyGL4rzyPTIKfOe0Z - ZE4eicyJw5D93FCkD78PO9u2xKSgoDU0xOlM+8CFDH8pT9KNmg1y9pkiviKBf/l9pyNlU83qODDoHhx7 - fqIe9UenTsbRF6fi2MzpOP7KbJxctBAnyAniqej7qlRJUDG4sbyiTKDNdCG1INHIT0/31IMohEo/RjlR - bzYLX3PDTm7TNzI4JPi5M599qqf97C3rkc19PlX62b//Qv2+Gz5V+9nfrLDC/5jh/w9Z7yxE1lsE/81X - kLVgJjJfneaGPwGZLz6LzClP6fAzxg1BxjMPIuvpwcgafjeSe3XGF5HlznRR1Sm0G5wN+Asa2eBGcYKc - /SwlRBil+slvq+qxDVEVsb//XTj67GgcGT8WR8aOwZEJ43CEHOHoC1Nw/OVZODF3Dg48NgQ/VqiA8Yqy - h4rll2gzlPWVViQa+iuVSaVJHCCXrZksfM0NO5HpO07/BC3v1y8WO7dRn7+R4P9B/T7BX8fwf6Sij+Cv - Xomsbwn+ys+QteIjqvjfJ/hvI2vZYjf8+W74s5A5n+DPmYzMlwj+dII/1Qo/46l7kT6sPzKG9kXWkDuQ - 1r8Tttauhme8vVZTymOPN7IBp7jC3CXw8dOPIXmrX1dFGfqGEHv/oGHa3h7dcPiJx3B4xHAcenI4Dj41 - EofJEQ6PIyfgTEDRf4iGdH/Vr0cFnnKqjaK8Q9vgAo9+1edQuMKn5KgXzEY/z8cix9nszMLX3LATmb4x - 2mrYD0OGnOZ+H5z6dfhc8TN8Gu5RxZ9FRZ8OXx/uEfxP3PDffYOKPoL/vznIXMjwXzTBH0PwRyFz0nBk - jH8MGc8+RPAHU/ofgHSCn/7w7Ui/vwsyB3dE1l1tcKxJDbzl73+kiRBDaLe4n+PhDXt9YewSdMekfwTR - 6jZNUdb+HBKM3W1a4uB99+LgIw8hgXRwyBAcHPY4DrIjPD0KRyc+R5ngWWxv3w7LfHwy71SU74jwo7Qp - KvL1Ao+SQE6Bx5nwqibQLHzNDTuR8UZ54z7TatX8ImPV166qXy/6CD4VfVk/uuGvWu6C//kHVPS944L/ - HsN/jSp+gv/GS8h8jeDPnYzM2c8hcwbBf8EFP9OAP4oiPwd+Tx1++sAOSO/fGhl9myG7VxOkNKuKn4ID - svoJucCDKmfaN84GfCBs+7zrYDn7UFYoNUYpygcrvbywo25tHOjTi/r6u7F/IImKvQMPPICERx9GwlBy - gpFP4ghlgD139cMPYWF4WlF2Uj8/kTZzG4mzHhd4kSQe1vHI6F9NmFn4mht2IuON84c4qZNp+Fbz5nGp - H3/omuz5/Udk/UTwvyf433yOrK9ouPeFGz6P9d9fpMPPpHG+C/50gj/FDX8swX8amc8/icwJQ5Ex5mGC - fx8ynryb4PdD+iMMvyvSBzH8Nkgn+Ok9GyG9a11kdqmBi80isT3EF88K8UuwEBwVnAa5NjCi4XoYHysd - RjEhAu8UyrPvamriprJlsKd9W+zvcwf2kQPs69cH+wb0x/5BA7H//sE48NCDlAGewIEHH8CGunUwX4oz - 1LkvpQ3xxBhP5jQisaOHkvg7XtOQ2MLX3LCT2/iAclXpF6IozSZFRa05OGki8O1XAPf93O9/zfBprP+Z - Mdwj+G+/jswlBH/RbBf8eVNpuDcRmTMJ/jSCP9kE/2mGfw/SHyf4j96B9AcI/r0dkT7ADf+ORkjrVhdp - naojrW0U0luXQ3p0KSSU9MJ86lOjhOCDxSnROLfAB6ggLcfpGgml8yyh/LkmMACxDeph320dsafbbdjT - vSv23NEDe/v0xl6K8r13D8B+6goSHnkYsZ074uugQDyoKH/SMX6CNmOk++okGn3rDp4nk2IWvuaGnUzG - H8xph8/kVe/k6fHSFx3an0p55SWAIh8rP0H2cq74XWP9zHcY/jwXfH2sb8AfR/BHE/wRyHzucWSMdcMf - QZFvwH+Q4VPkD2iL9H7NCX5jN/waSGsXhbRWZXGxaSguNimBtMbFkVjGF5+oMqWpEE/RvnGUGNVwQdQF - OVEfKkT4A0J59SunIyumfFnEt7gF8RT5u1md2iO+KzlBj+7kBD2xpy9lAeoG9tEIYEON6lzkJTdWlAW0 - GaO6r0fi8bw53TP4a/4+Fr7mhp1Mxh/Mwy6uvKkQV8qSJ3R/uHjxFb/37Jl5/uUZAI318QkN+d5b6IL/ - 5svIXEDwX+Wx/iQa7hH8Fwn+FBP80fcT/HuQ8cSdbvjdkD64E9LvdsFP60Xwu9dDWmeKfB1+OVy8JQwX - GpXAuQbFca5eCM7XD8bJ8r740SHRU8g5vG8kjpj8rgv0SKR/5C1C9KHUHftHUAB21aqO+GbRiGveFHEt - myGubWvEUUG3u3Mn7O7aBfG398C+O/shrmN7fF88BI8ryhaiPJw21Y7EUc/VPZ/A4WyW53MeFr7mhp1y - Ge8EH1AecnAm4CFINSpU7n+mVMk1m8izz784CaDhXvZScoA3aKw/n+DPIfgvjXfDH4mMiU/QcO9RF/yR - A5ExjOAP6YX0h7r/Df9Oht/EBf82ivz2lZDWujxSbwnH+UYlcbZ+cZwl+GdqF8PpmkE4UysISZG++NNT - xb1CfuQUoirtWzFSfjgBb0uHHy5F+ZFSvL3K6URMeCji6tSktF8XuxrVx67oRohtxk7QEnG3tkVch/bY - 3eU27CUH2EpDu/c8nBkdFGUZbYbP2HFfz5M5XOTxsTWfDMtTs/A1N+xkY/zl2SO5n+WChGeeOOLq1FCU - EZNDQ9dvpb7u4sTRAFX82fMp9c/m4d4zyJhK8Ccx/EdorP8ADfcY/l1If6y3C/59nZF+T1uk3dkCab0Z - fn03/MpIbR1JhV8ELjQupcNPqRuC07WDcbpGMZyqFoikqgE4VdUfJyO9EeOtYYSUqwOF4EkSdgLOWnk1 - aZQDpL0q+yxU5Z51fj7YUb4MdlWvgp01qmJn7ZrYWb8OOUFD7GoajV3NmyO2dSvsZgegTPBHuTKYKZRj - FRVlKm2GK3yewuW+3oj6ayryLmcWvuaGnS5hfCA4sriv5XTLM1HlSA2p8xo7s3Tojh3U7118eihARV/W - 9NHIeH4YjfUp8nX4g5AxvD8yGP7DPVzwB976N/weBL9LTaR1qILUNhVwoXlZnG8SSvBLIKWOC35yzWJI - YvhVAnCikj8So/yQWNEXx8vSkMtHw/NSrg8Rgg8uRxQ767U6gQ6f+vrSD0m5YKVDw5ZigdhZLgI7KpbD - 9qgK2F61ErbXqIYddWpjR4P62Nm4EXZxFmjTCjujG2M1FXqc8osJ5THaFJ+44QkdnsLlOQ1jdjPPo95s - Fr7mhp0uY0Yq5J3mlMXRxt0C9QpK0+ZCTJ4fWmpvbNuWSH1iMLInDkXWeIr+UW74Q93w778NaQPbIe0u - gt8nOgd+KsG/2CaK4JfDuSZhSGlQAmcYfi2CT5HP8E/mwCfwFXxwtKw3yQtHIzwR66thtpTxJYXgippH - CP92mJjz/kZSdJ6nyh3rPBzYFhyA7WElsS0iFNvICbZVICeoHIVt1atie62a2FGvDnY2aoDYW6IRU70a - lnt5gCq8rzQh7qJNccrnQo+zJx+3Aju/YeFrbtjpCo13mneeDy57sVEfVKBc1rqDlLMXlyxxdG+LJkh9 - sDeyRw1E5jAe67vhDyL4/VsR/KZI69kAaV1rI7VjNZxvWwnnW5THuehwnG1QiuAXRzLBTyL4J6sG4UTl - AALvj+MV/XAskuCX88aRCC8cDvfUdSTME7soE8yVck+4ELzGgPeLU+zVOIH+viAhAgaqctoKTc3Y6OXE - 1iBfbA0JREzJYMSULoGYiNLYSpX/1ooVsK1KZT0LbK9TCzsb1scGSvn/09QL0YqykDbVjcSTOjybx1mz - wOcuLHzNDTtdpRmOwH2YMWTkMWwUdcId75By8YfBxZIPRdehvr4Tsh7loq+DC35fht8QqV3r4CKN9S/c - WhnnWkYipWkEUhqGuuDXtMI/TvCPEfyjVPwdIfiHKeoPE/RDpITSpFAPJJTyQBxlgkWqPF5GiL60Lzys - 4mEi7+OlDjp/Fz0aI6VoMEOTv/3iUBHj44mtAd7YEuCDLYF+2BLMTlAcMWGhiCkTgZjI8tgaVRHbqlXR - nWAtVfkzpHKsvFCeo03xKVuu8vnkDY+kjJSf71FvNgtfc8NO/9LMGYELMD7oZUiVqKO7414hPl8ZGJBx - vEFlpPdphswBlPp7NUIqjfXP01j//K1VCH5FnG1aBmcalsZpgn+K4J+qngt+BYbv44JPEc/gDzL40h44 - QPD3l/TAvpJO7C/hRCxlAnKCRHICnjC6nBPoQOg/ZA9VPvyuJk+td2rY6uuBLX5e2OxLop+bqPjbTMO+ - zSHB2FKqJLaElcaWshGUBSJ1/ejvh5FC2UH9/VDaHPf3PKPHY3sODGNSp0Dhs1n4mht2ukYzHIEPNKc6 - 9np2hGpULQ4eqShrfqcDeap+JNK71aPor41z7aoipVUUUm4phzONwnC6bkkkceRXK4YTBD+xUiClfH8c - JfhHaOx/pJwPRb4XDurwXeAPUNTr8Is7sYcV4sTeYAd2+qh44/JOoP9OhV7YU6r69neaxGZPjSLfA5tJ - m3R5YhM5AWsjQd5EheAmivTNoSUpC4RjMznCSk8PDBTKGhqO3kOb47N3Rn/PBbPR318Xs/A1N+yUR8aO - wN7OX5z7YGPoWLeOooyaoSixMcE+ONOgHC60rYyU5pFIbhyOU3VLUeSH4CTBP1nFBf8YwT/ihn+YCr5D - bvgW8BTxe93g44Od2F3MgThSfJAD270sTsCVNzsBZyoGokdjXSnbcKH3O8GPIfhbvBzYrMuJTd4e2Ojt - qWuTNzmAj3eOE2yhrmAjZYNPKFt0EcqntKleJJ7V4+VZPMQr8P7ezix8zQ075aHxweUvzn2eZejoQUO1 - Tooy520pk+JL+iG5LqV9Sv1JtYrjBEc+wT/uhn800g+HGX4ZHxwM99L7ej3dE/x9Jf6GH6/Dd2A3QY8j - xQY6sCtAQyxpm6eKBaqaWFoKLsjYCXhfVNo5jz6qfPozVZ7bwPA9VGzSpWGTpwMbdTmxgar5DV4uJ9jA - 8qWuIDAAf/n54i1NpkYLwcVeVxIPQXlWjx2ea6IC7+/tzMLX3LBTPpjZEXjoyMMzjo4KIULpPlhRvvje - qWYfCvVFUtVg3QF0+BUCKOr9caicLw6VJfgR3jjA8Bk89fO2Ue8GHxtA6Z/A7/TXsMNPwy5fFVucErNV - dW8pIXipWTH6WX2Uqn6+WqWU7xD6/28ibdSlkjRspKHfRg9yAHKC9ZTiWS5H8MZa+v1VTSZXlWI6bY/8 - WWlK4mKPHcxYrHHd4bNZ+JobdspH44NhFIocHdwn84ihWlVFDJkiRMxGbweOhvvSUC+QIp/gl/XDQYKf - 4IbvinoCTzL6+t0c9Sb4HPUG+B00GthOdcA20nZvFesdEi+oamy0Kp+do6p71qkEnl7bzNDJCTZqLIkN - VP1vcGjYQE6wwenABnKE9eQI7AAbSb86HJimycNhQoyh/ec5B57c4WKPnbugTkpdsVn4mht2KgAzHIGL - sZz6gIqnpp2EeOVdKZN3BzhpfM+R74uE8Fzw/yHqdxlRz+Dd8Bn8NgK/lUW1wDZPid8J8pcU9X8RaD3q - yQFc4AU2kEOw1tP/rdfIYVjkCOvJCXQHcDrxE7Wf0WR8iBCP035zpc/TzzwRdt2LvX8yC19zw04FaNwt - GFPLPDPG3UIkpeZeTwj54y+UhvcVo3F9aS8dvh71BP5qol4HT4oh+FsIvi4PTvmuqN+UE/Vu8Czp0l/s - JCSXE5ADaBq+U1U8rsotPkI8QPtqrvSN+fzrWuz9k1n4mht2KmAz6gNzt8AzijWjpRy3QMrDDG8fRbtR - 6FnAkxj8paI+xssN3RDBt0S9OfIZvFBconaOAxD4r+n3e1X5m0PoizR5WpcGNPq+FopK/1Jm4Wtu2Ok6 - We5ugRd5lAsSosMgKZfz2DyWCjke1lmi3gR+O/2/Jeqp8jeiXgdvpPtcUW+A12XAJ/0pyAGkxJ+kFfT5 - NFr4lvapN4mHeca0bl6edcw3s/A1N+x0nc0YLfCUKRdUHGFV60gxcq4qE7hCjyPgPLTjyN9Ov2//p6g3 - wJMY/CWj3hz5DJ8O018kdoJPKfI7qeIj2g9eudOSxKdxC9Uw73Jm4Wtu2KkQmJENOK1yeuWDXSZQiFsH - qfKzbygl8+QOD+2MqDfgm/v6K416C3gT/HX0+7uazGytyqX0+Xxiicf4vOjEmNMvNMO8y5mFr7lhp0Jk - RpFozB1wyq1SR0o9G/CQjod2OnyOegbvjvhLRb1R6NlFvQF/LUX+Uk1mNFHlG/SZvICjGalQjvGvxCx8 - zQ07FTIzsoH53EIEZYN2D6vy62+pb46hKN9qwKffrzbqc8NfQ/BfVdUzVaR8mT6LZw458nmJtnFCp9AN - 8y5nFr7mhp0KqbEjmLMBDxmrNVPlpIWqTOQ5fAv8f4p6LuxswJsd4Ad63zhNPaQJ5T76DB7nc8HHkX9D - wmez8DU37FSILXdtwCOFiFAp+r+sqSd/Jcib3OCvJuotDkCv80jgG3r/IE39kbbPRR8v3+JJHv7cGybt - m83C19yw0w1gDIFhOGmYWOlBVX70hSrTOcr/TdQbMv5/vXQ5wXIqNturch59Dk/xctfDGaDQjvUvZRa+ - 5oadbgDTIURIUe0FTV27hoZpmwz49HODO+KvJur/luvvNtJ2/iAtdqhplaTku3Bwl8OzlTdkFrDwNTfs - VMhNh19XlS3ma2o8n8wx0r416q1g7cDzkC/nPRz17DT090bXsZm2+RtpuqYeLSEEn+3jLocnqW6Isb/Z - LHzNDTsVUuMDrh/0Dqrs/76qJvNULUe+Dt4d8Tp8gnk5+Ob/N6LegG/UEFxMxtBI4gcqMJ+gTEPDEL5S - 15gDuKGKQQtfc8NOhdCMaBN9VfkU9fcZDOxao17v603gc+ATdIbPIwoeWsaQPneo6Kmqb9E+8FU8N9yI - wMLX3LBTITM95atC8RyoyjnfUH+vg3JDN3QlUW/Ad833u//WDN4d9bwohCeSdPieUp913ERa4lAzG0j9 - YlSenuZ6gOcmboiuwMLX3LBTITIdPvW/waM09WNeucPgdfhuBzBDvzLwJHIWI+L/Kep5KplPJsXwTKOP - a9p5Hf0+XdNOlHJdb8CzkjdMPWDha27YqZCYDj9cijLTHOrPv0gXfAb2b6J+A+kP0mc0tFuhn94l4Lmj - 3kj5DJ8ins8t8LoCPtnEZx3jAjT84KVhmKb+RaHPF3XyOYoboh6w8DU37FQITIdfVorqczR1228E+2qj - 3vz/DH8d/d07msyiAvKz/qr8mcf4PF/AK4IsUe8Gz1HPJ5r4NDOfdeRTz3GBrlPRn1Bm6KrKRbSLxr35 - Cv38gIWvuWGn62icSvUDGSnFLQscasJagr4xJ+KvLOp5Otf4/40kHioupf472gWNT+l266nKZcs4ExB8 - Po+gp3uCzyeWGL4OnqJ+lw7ftf6A4e8NdmJbMQcWOLWMakLwxZ5GPVCo5wcsfM0NO11H0+HXk7LTG5p6 - mCdijGLPDJ1lCz7XezaSs/ypR76a1cQFn5dt80oevp9u7S6qfPVtTc3+g6J/hxH1DJ/AG1GvgyfxErQ9 - ISwnDpb0wLpAJ8Y71EPFhH6uwLjer9DWAxa+5oadroPlRH4LVXZ/T1PPMLicyM8F1hY+y3iP/rf0Ov38 - kMbwbVX5Hm2a767Jp3SrkHglMkdu+ZaqnPimQ81YS9Efy+Bz4P8d9bsp6hk8r0nk5ei8LP1QaQ987efA - Par8hnbcuA6AT1QVynrAwtfcsFMBG8PXo6aLJgd9QPD/IHCu6VwT1H8Cb/p/FjuMUd1/Tim+myq/pE1z - 1c7w+ZQurznklTw5y9LrSzl8rkM9t9ZHw25TX89RH09Rz2sR9xZ3XYiiX3xK8I+Ee2J/mCeWUFEYLeUk - 2g5f/saniwvl0NDC19ywUwFaDvzumnzgE03N4KjdkAs8yxY+y3iP7jAu8NxtrCL492jqr7RpXsPHl2Zz - 5DNwYwKHxb/zqeXQKlI8NN2hJq4hJ9hLfTwvOefrDjjq97uj/gCBP1Ta03VFcoQXTpbzwtZQTzzvUJNp - aNiDtsPnCwrl0NDC19ywUwFZLvgy/U8CzxX7ZcHneo8O3g2fh3Y8X/CkQ411CmUgbZ4XcPIaPmMljzlF - 8++8jp+LuBJlhbjzBU1L/JVS+wE93fMVSK7LzQ+GsTz1exEcLeOFYwT/eHkvJFf0wffBHrhPqr/TxmrT - dvh8QaEbGlr4mht2KgD7//AZZC6wtvBZxntMUc/ikze/Up8/TVOTQoR+3z1et88XaRpQeEFJbmNQnLb5 - fH8Jvp/AJE07sJqc4CCDp6hn8Bz1R9zgj5X3xokK3jhZwQfJlXyQGOWDxT4OtJRiBm2Db5ljdAWFZmho - 4Wtu2CmfzQL/Y4LPEzRm+LbgTf/P7zVHvQ7fIfAnOcBCh5pWQUq+ERPffo0na7jY4/7+Umv4GBQD46uG - S4QK0Xmspu79ngrBo9TXc8Qb8I9HEvyKBJ+gnyL4yVV8cLGGL3aRUzznUE+XEHq9wZ9ZqLoCC19zw075 - aHww9Kiwg89ZwA6+MZunK1fU82SOfnUP6UPq92kUwSt4+dRtYxJfsXOlwzPeLx7LM7gSpYXoOEZT9/xA - BWEigU8kwIkE/ySlfB18ZR+cruqLlGq+OFfTDxl1/PF9qBcGSPkTbcjIOoVmVGDha27YKR9Nh99Bk305 - 7Rvw/wl8DnT3+3JHvWv+nqLfKbDSIdFPVX+mzd9O4oq/IulqJ2jMTlCcneBZdoJiTurrvXEqikTwT1fx - xRkCf7aGH84T/AsEP6OeP87U8sciXwcaScG3huGugAvMQjEqsPA1N+yUT6bDb67Kbm9r8jSvuV/PoOmn - HXxz1DN4c9TnnLlzSn1F8M8En0Dtp2ruXvoIXsPHa/e54ucCT//cqzCGZXaCDrTtfb+V8MQ5d8SnVKeo - Z/i1/HCxrj9SSfwzq14AdkT68HP7jlFf0oH+nrsCzkB2tUeBmoWvuWGnfDA9AiKlaLbYoSblwLfRlUT9 - RvdZOz5Pv45+ztXUC2FS8HOG2pK4Er/WSRmzE4RQYXj7BE1NXFvaC6kU8Rz1FynqGbwBn9ustDoBWBXi - ybev5buF8NCzUKwltPA1N+yUx6Z/8XJS1HjNoR78/RLwc6KehoP/FPV8aZgBfxPpA4eKaFW+SR/BEceX - afMsH1+vd60XblgyQTkaHYx3qCc2l/OhSDfBd4PnbuB8bXqNfh6v6ofXPLWMKkLwAx94gui6ryi28DU3 - 7JSHpsMPEyLsJYe6mS+4sIN/NVFvwOcTONzv91XVn+gjeBKG787BZ+e4ks+r6ttwAt5mCAG9f4pTO7uL - CsHs+gE69AsEncGzzrGoDkinLLAx3AuPq+o2SkFcjPIEkTESuS5m4Wtu2CmPTAfgJ4QfDY9W/khAeQz/ - j/Dtot4N3zhXb6zS4RU6azxU0FDtIHXyg+ljuN/ndJsf42/eluEEJRoKMfxlT0fG/kq+yKQ+X4dP0FkM - 31BKDX986u9EKylm098ZT/z4NzVJnpiFr7lhpzwwhi+EUOR9mrrwOyn1yDc7wCWjnlO9XuH/HfXG+XqG - v4H0ulNNKy8Fz8Fzv8/X6XO/n1/r9BiaMU8Q2lqK5xd5O3GMUn0aZQEGframSyksgn+hVgD2UUH4ItU8 - NBThs5BGQXhd5gYsfM0NO+WB6V5+hyZH8K1YdOBu8JeNegN+rqjf4j5Xz4s1PnGqaKfKD+kjeLzPN2Lk - fjYv+v1LmdkJwrtKufB9PxoeVqdhIGUB3QEIPMNnnSGdo9d+CfZAPyFX0N/wyMRw0gLPAha+5oadrtH0 - L1dXle0/0NTUtfRxRr9vjnpjUaYB/lJRbyzU4Js+/uCp4mFVjSHKfL99Y7xfUEUWZxf93AF9yQr3SPnl - V0EeOnyGzdDPVPfHabdSyDmORfliKXUZVD/wE8+uW0Fo4Wtu2OkaTP9SEVJEztHk3l/t4BtRb4A3R70B - 3wRev7ETwedFmX/Qz+kONaWEEE/Sx/DCjhqkgu5b2Qk4ioNonFlruCrX/1rCk4aGAX87QDWWH5JJnBW2 - hnphpFS30Q5ytjIKwvzoqv7RLHzNDTtdgwkpFI+nNfWL1QzZDP6fop6UsyjTSPcEn8Eba/N2+vI9ezW8 - 69TQUEp+xo4xz88H83qceePP488NChWi7WRNPRIT7k1O4K93CQz+FNUHLP49qYofvvJ1ornQ7ydoFIQF - OkNo4Wtu2Olfmh6BvTQ5eoWq5vT7Vxr15nSvgyfpy7MIfKy/hlWeGgao6u/0ETzVy0M+PpA8Rr8eRRV/ - HtcbXHcUqyzEgPkO9dy+8j56xBvwWQyfM8LeMt6YqcnEAEW/xIznKgp0htDC19yw078wHUCkFI0Wa+oZ - nun7+7z+lUW9eSm2a0Wu6+ZPvEJnnY+GSZp6IlDoj0rn8/tcUF3vU678ndn5GGRIOymf/8jboff5nP4Z - /Em3TlQmZ6jij98CPHC7kO/Q+3llEs8QFljXZeFrbtjpX5ignOj1nKb+/LOQLvhXE/WmCzCMqOd1ebwO - fxv9XEJVfzUh+OHJvACTr88rLGfa2Am4oAugXyL6SfnhDwFOgk0OQNF/ksAzfFYSOQDf8vZ/DvVCSddN - q/lMZV5OWl3SLHzNDTtdpeke3EOTI1fQkE8f07NM8HXwl4n6HPDupdi8IJNv+vyVl4bequQbNfCtWqJJ - fJatMN2ajb8/R3Ig/VNjjCq3bCzugeSq/jr4RFYlPxyPYofwx6ZiHrhfym/o/VzAsiMXyLDQwtfcsNNV - mA6gtBSVF2rqybWc6hn+1UZ9rgswGD6vy1tLzjBeU49TyfwgfYwx22ec4r1eqd/OOBNxRgoME0rHuZp6 - Kj7cS0/7Ony3A/DvhykLfOhU08sKwTOYBZYFLHzNDTtdhQnaa3G/pi5arakEmy+5cl+8mTvq3fAvFfXG - Uuw9BH87Rf//nFp2dSFm0efknu0rTPDZGB4XdDy8C2oixfDPPFT9FvcnCPoxgs86WpGdwB/bgz3xsJTf - 0Xt54QhfU5Dv38nC19yw0xWa7rE1pYh+16Gm/unhwCa+rTrfZt0E/2qinpdi8/3+94ZQ6vfW0EvmpH6+ - E7exuic/Z/uuxXifjKIw9C4p3/vNz4FEfriVGz4/8YR/Hinnh888NM4CfBMq7tJ4cihfs4CFr7lhpys0 - QS6rDtfkez8S+M38RA1+uoYnO4J61VGvr8Mv5sSB4k78Qa+No9RPHb2R+vn+fIX+8isyjmKuBwI8FVH9 - eVXdtiPEU496/YknrEhyiIr+2BnkgUcKMAtY+JobdroC0yFUpWHfO04tdWOAH7b4eevP19HlTQ5BxZsr - 6l2TOjlRT+BzR71xAcZ+gh8b4sSbHlq2u+o3p37uYwtb6rczox4IqChEz3cc6rkD4T469MP85BO3DkX4 - YLlDTY/4/1kgX8zC19yw0xUYO4AYKMU8fkrW9rBS2BIc4Hqsmp8XYvw8EOPrxFYfh+liS9UV9QQ+d9Tr - l10R/ISSTnzt68CdqlxD2+fVteaqv7Cmfjsz6oFit0kxfQ0/BKO8Gzz9ZB2OpCwQ4IFBQvCJonwfEVj4 - mht2uhILEaL0PId6eGPZCOyoUA7byAm2Fg/E1iAfbA3wwrYAT2z39yBRQcdR74Zvjnq+2NK47OpQKQ9s - oNcmONSTQULhlTRG1c8LKwt76s9tvK+8z1wPRD4n5fpdNPw7UsEfBwl+jkr78Erm8xT6fPUSO7oxIshz - s/A1N+x0GdNBtBTi3i8D/LGrbi3srF4ZOyuWw46IUtheMoiqXF9sL+aNHcW8qK/zxK5AD/2+/nGBmrvQ - cyLefdkVPwGEr7fbSw6wxFNDfSleo83zXL95wudGSP25zagH/KKoK/jUIS8khPlQ9PsjgYrABH4UTjl/ - bKNM2UOIxfQ+dnbu6vJldtDC19yw02WMHUAOE8q7v0WWxZ7m0YitXwu7alZGbOVy2FU2FDtDg7CzuB92 - hfhQn+6NuBAvxNHQh6+y1a+5o5TPT/syLrbkJ39+S91Cf1X+RRvnx67xkzb5ESyFueq/EjNOGhXrLeX8 - DdQVHCL4Bwj+ftIBdoQSXlioyiMeQn/ukLm7y1Oz8DU37HQ5CxZK+CsO9dC2Jg2w79aWiL+lIXY3rI24 - WlUQV6U84iJLIy48GLGl/BBX0gfxurwRX8KTot71nL8DLL7YMtxTv/TqLSoaawl9+RRfzsX35i3wM2b5 - YLzvnNL9PIWoNluVu/ZSICRQ5O8v44t9pIQIX/xFma+RFBPpfby2gc9x5HmXZ+FrbtjpEqbvVLRQei8P - DsL+7p2wr3M77G3bnDJBI+xpXBt76lbBnmqRiI8KQ3yZEMSX9sfeUPqypVk+JC+KetcTPxm867IrTyzy - 0rKoah5LmzfO9HEkXO+5/rwwTudc3PnVlGLQaoeanUDHgR1gL8HfV4ayAXWRz0q5lt7DN67gpWN53u1Z - +JobdrqE6Q5A5fm0NVUr4/Dd/bC/Zxfsv60d9rdvgf0tG2NfdB3sa1AV+2pGYl+VcOyLLI59EQE4EEHp - Tpev/uRPvrz6SIQnjpV1XXP3hrcjs5wQI2jzxkEojDN+/9aMUUHxB6RcFksjnQMEnh2AlRDqg680NTVE - KP3pPcbK5jztBix8zQ07XcL4rJ/HaKF8ur5FUxx76F4cvKsXEnp1RUK39kjo2BIJrZsgoVldHGhUDQfq - VkBCtXAkRBVHQvlA6v9oLMzi5/+W98Fxvso20nXN3Rs+jszyQgynzzDG/Td6+jcbfw9O637FhGi0VJWH - DwR7YQ8FRHwYOUE4dZVUH3QRgh9OkS/FoIWvuWGnS5igDq3YFE3duOP2Ljg+9EEcGTwAhwf0wuE+3XCo - Rwcc6twSh26NxqEW9XAoujoONaiIw7UicLhqSRyuGISjFQNwjMRPAj8R5YukKB+cjPLGQl/dAYbRZxhX - 9vyXHICNYXJq928lxVP8ZPL91BXEh/tiNzlAAo2WZki5jf6f1znytHeeLhuz8DU37HQJE5SXSr3o4Yzb - d+8AJI4cimOP3oej9w/A0Xt64Wi/bjhyRwcc6dIaRztE42ib+jjarAaONo7CsbplcKxGKRyvws8FDtR1 - smoAknnlTBXfm8EB+Lu4ugIqoidI+dN+PxoSc/RTFkgo4YPvVJle3PXkcWOha551Axa+5oadLmGcAcKn - e3ocPvDo/Tg59ikkjngUiUPvo+5gAI7f2wfH7+qOY7074lj3Vjje+RYcb9cAiS1rIbFpJZxoWBYn6pTC - yRohOFUjCMmklJqBSKruj9lejszI/7YDsHEW4O/lFyZEx69VeTaBh8il/bCbCuU9NBpoLQU/poa7AV4x - xO/Nk27AwtfcsNMlTLIDTPPy2H9w2BCcmjIOJ8cMx8mnhuDEE/cj8ZG7kTi4L07c3QMn+nXCyZ5tcLLr - LUjq2BBJbWshqUVlnGpSDsn1Q3G6TgjO1AnGubrBSK4ViJnkABX+dgDjy//XHIDNmBsI6Cnli3EeGvYQ - /F3kBIf8PPCUlN/T/xnXOObZaMDC19yw0yWMHaD0VOoCDgx/DGdmTcGp55/BqXEjkPT0Y0ga9gCShtyD - pAf64tSg25F0V2ec6t0WyT2aIfm2hjjdvjbOtK6KlGaRONs4DOcalMDFhsWRUi8YU70caQGuy7z+6w7A - 30mfG/AQStQcVW465OfUHeAg1QGLVbmX/o8nhXgozBNheVIHWPiaG3a6hKm058HjVbEu9pH7cO712Tg9 - YyJOT3kWyRNGIHn0UCSPeADJQwfi9MP9cPq+23H6nttwut+tSOnVHGe7NcbZznVwrl01XGhdARebhSMj - uiSO1Q7GeA/tNHV4vFaOT4/yJNCNNv9/NcZRrU8TVxKi92+qTNsf4o39VAd8o8pUP0VfM2icAs+TOsDC - 19yw0yVMpT33fERRlm28szdSly5AypxpODNzEs688CzOTByJlDFDkfLUg0gZNggpQ+7E2Qd74uygLjg3 - oB3O922BCz2b4GK3ukjrVB1pt1ZEVqsy2FUlCMM1NY5cnRd/8B29+AQQR8l/2YyuoNjdUi7YS/3//pK+ - WO9Qs2q4LnwxbnKRJ4Fg4Wtu2OkSpqejFory3OqWt+Die2/i7MJXcHbui0h5aRJSXhyDs5NG4uy4x3Fu - 9EM4N2IQzg29C+cfvgMX7u+K1IHtkdq/JdL6RCOtRz2kdq6O7PaVsK5CMfRQBC+O4CXf7Pl5PhFSCC2n - K3AKUfU1KbcfoxpgBzlCEykm0OvG42nzpCu08DU37HQJ49Sl1lSUTktKl8w+s/g1XHhnIc6/8TLOz5+O - 8y8/j3MzxuL8lFG48NzjuDDmYVwcNRipw/oj9bFeSH+oG9IHd0Ba/1ZI7R2N1O7kBJ1q4NMSfqivKPx0 - Lj7//1+aBr6c8fHUp4krS9FvrSbT96mSHYDvdmJcTFroHMBBOSl8jBQ742kYmPnFB7iw9HVcePMVXHx9 - Bi7OmYyLs8YhddooXHx+GNLGP4L00YORPnIA0h/vjbSHKBMM6kCZoBUy+jbF8bY18IKH4wKFPC//4ur3 - vzYNfDlzzQ1QV3CnKmf9qKogZ+DH0/OzCvnmloXKAdh4hz26KMqLq1o0ReaqT5D60RKkvvs6UhfPQerC - GUibNwVps8cjffrTSJ8yHBkTHkX6M/chfcQApA2l2oEywUVyguyBt2JtjTLoqyi/0DY7km6GAjC38ffk - 7+tPHl+ukSqHUr9Qj9p8JTF3hYWqBmDj1OxB47QGU5xa0oEZk4HvliPt4yVIf38h0t+ai/RFM5Hx2hRk - zBmPjBmjdSdIJydIIydIe3IAdQe9kfFIDyT1aYX5fp4ZFPLP0DaNS72NNQA3k3G241EBf3fu/jj1cyHM - 8wB50hVa+JobdrqM8c5yWvLpoChTl9WoijTKAlkrP0bGp28hc9lCZL49F5lvznI5wSuUCdxOkDaenGA0 - OQFlgoxh/bC6almOfr63X2cSe32BXSlTCI1Bc7QzdB4d8HHgIjFPjoWFr7lhpysw3lkf2ssKQxXlz5/7 - 9QR+XYWsVR8h8zN2gjfICeYhg53g9alIdztB2mSqCSYMQfaER7C9QzTGSpFIOe4h2hZHP/d5nPL4S98s - 6T+3MWw+tobyLBAsfM0NO12B8Y7pExlhNHQbK5Qjfz4yGFizkrqDT8kJluqZIOMdlxOkzycneHkCMmaN - QfbM0Yi7oz1mOR0XKigK3+OHb/RgzP/frNGf72bha27Y6QpNzwKkoLKKcvvTihL/XZf2SPlwCfDTCmDV - h8j+bDGy3n8d2UvnAktm4/yLz2B9u2aY5lBPV1GUafS3vPiTF4CY7+1XZPlgFr7mhp2u0DhNc7rmwiWE - xiutaOzy1WslQ7LXUpeQMHUskua+gJOzJuLIuOHY1LMT3gktDsr3MdTRj6S/4Ys+eNhnLIe+mSr/AjcL - X3PDTldhZifgEziVKbIful1Rlj+jqfEv+HienebteX6cUztAzvFTdSoa6T18U8fmJF72bVwdy0VlUerP - R7PwNTfsdJVmOAGncJ644HRejXJ5Gwrp20m96Xe+yodX+/JMH9/bh6d7jSdtceQXwc9ns/A1N+z0L4yd - gPtvLuI4ormg4+jmyp4XN/C0JkPnaV4Gz6tdeLjDf1MEvwDMwtfcsNO/NHYChsnZgEcIPL3JzsCnNFn8 - O2cJY3zLRWRRn19AZuFrbtjpGs1wBAbMEc6w+SfLgF4EvoDNwtfcsFMemQE6t4rsOpiFr7lRpJtPti8W - 6eaR7YtFunlk+2KRbh7Zvlikm0e2Lxbp5pHti0W6WQTl/wB4IKKvfyDngQAAAABJRU5ErkJggg== - - - - - /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAkGBhIQDw8PDw8PDw8QDxAQDg4ODw4ODRAQFRAVFBQQEhQX - HCYeFxwjGRISHy8gIycpLCwsFR4xNTAqNSYrLCn/2wBDAQkKCg4MDhoPDxoqHB8kLSwsKTAsLC8uLCk0 - KSwpLCksKSkpLCkpLCkpKSwsLCwpNSkpLC4sKSwsLSwsLCwtKSz/wAARCAELAL0DASIAAhEBAxEB/8QA - HAABAAIDAQEBAAAAAAAAAAAAAAQFAQMGAgcI/8QAPRAAAgEDAgMFBQUGBQUAAAAAAAECAwQRBSESMUET - IlFhsQYyUnGhQsHC0fAHFVNigeFzgpKishYjNENj/8QAGwEBAAIDAQEAAAAAAAAAAAAAAAQFAQIDBgf/ - xAAtEQACAgEDAgQGAQUAAAAAAAAAAQIDEQQhMQUSEzJBYSJRscHh8BQjcYGh0f/aAAwDAQACEQMRAD8A - +4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8uRpnXwAb3I8uoQKt8l1IdTVEuoBddq - ZVQ5/wDe68TdT1RPqAXikZK6jep9SXCtkA3AwmZAAAAAAAAAAAAAAAAAAAB4nPAnPBX3d3gA93F2kU15 - qyWdyDqerYzuRbek/fqe8+Ufh+fmDKWTTe6/jqU1fXpPl9TZrWlcLdSmu7znH4fNeXp6UrZo5Mk11Ray - 9yd++anivqb6HtDJe8v6plS2eWzXuZ0dUX6Ha6fr6l9o6Ky1JPqfKIVXF5Twy+0jXd1GTw/o/kbqWSPO - px3XB9RoXGSTFnMabqWcbl9b18mxxJQMJmQAAAAAAAAAAAAAeJzPUmQrqvhAGu7usJnMatquM7m3VtTx - ncrbW1bfaVPe5wi/s+b8/T0GUsi0tXntKnvfZi/s+b8/QkykJSNM5mp04E5HP6rpvDmpTXd+1FfZ815e - hdSkapSDWTaMnFnKNnlssNS0/hzOC7v2o/D5ryK1s5tYJUWpLKDZ54sbow2eWwbHTaDrP2ZPvL6rxO70 - 29ylufH6VZxkpLmmd57P6lxRi88zpF5IVtfa8rg7+jPJuK6yrZSLCLNjiZAAAAAAAAAANVSpgA816mCg - 1S9wnuS7+9wnuchql5KpLggnKUnhJGG0lljk30aXE+0lv1guaXm/M3SkLHSeyp8PE5Tb4pPL4c+EV0Rq - qPG3Ui0aqu/PY+P3P9iRKuUEsmJzNMpCUjVKRJNBKRqlISkapSMmBKRTahY8OZQ93qvDzXkWkpGuTMNZ - Mxm4vKOebPLZNvrPHejy6rw/sQWzm1gmxkpLKDZe+y11iTh5pr+vMoGyy9nn/wB//K/VGY8mtqzBn1fS - quUi7pvY53R3sjoKXI6lebQAAAAAADVUqYAFSpgq729xncze3uEzltR1FylwQzKUnhJGG0llgxqOoOcu - CHelJ4SRK07TlSTb71SXvS/DHy9Rp+nqmsvvVJe9Lw/lj5epMPK9Q6g7n4dfl+v4LSijs+KXP0BGvbZS - WeUl16PyZJbxuyDXrcT8un5lP/KemanB7/v+iZ4Ss2fBVzZplIsLihxLb3vXyKue2z2PYdP6hXrK8raS - 5X76FVfRKqWHx6CUjVKQlI1uRZEcSka2xKR4bBgSZV3tpjvR93qvD+xYtnhsNZNoTcXlFI2Xfstb5nKX - yivV/cVtzZvOYcm+Xh/Y672asOGMV+mzSMdzvbYnDb1Ox0mnsi9prYrtPpYSLOKOhEPQAAABqqVMACpU - wVl7e4TF7e4T3OX1LUnJ8EMylJ4SXNsw2kssGNR1FylwQzKUnhJc2SdP09U1xS71SXvS6L+WPl6jTtP7 - NcUu9Ul70uiXwx8vUmHluodQdz8Ovy/X8Fpp6Oz4pc/QBsNkKvX4tly9SittVaJ0Y9zFevxfL9bmoAq5 - ScnlkpLGyBGvLTjWVtJfXyZJB00+os09isreGjScI2R7ZHO1Nm09muaNTZd39j2iytprl5+TKKaabTWG - uafNH0Xp/UK9bXlbSXK+X4KC+iVMsPj0MNnhsNnhssiMGzw2GzNGk5vCAPdrbOpJJcurO70WywkVei6V - jGx19ja4SBgm21PCJR4pxPYAANVSpgAVKmCsvb3C5mb29xnc5bUtScnwxzKTeElzbMN43YGpak5PhjmU - m8JLm2b9O07s1xS71SXvS6JfDH9bjTtO7PvS71SXN9Ir4Y/rcmnluodQ8Z+HX5fr+Cz0+n7PilyA2CHc - V87Ll6lHZYq1lk6MXJivXzsuXqaQCqlJyeWSksLCAANTIAMN43YAbKTU5KpLMVy24vi+ZuvL3j7sdo/8 - iKWWjc9PNWxeH+8ka7Fi7XwV8jw2TLmkmm+TS59CPb2zqPCXzZ7/AEerjqq+5bP1KK6p1SwzxSoubwjp - 9H0fGNj3pOjYxsdXY2OEtiYcTFjY4S2LalTwKVLBuSAAAAPE54Ky9u8IlXVXCOX1W8eeFZbeyS5tmG8b - sETU9SbfDHLk3hJc2zdp2ndn3pd6o+b6RXwx/MzYWHB35b1HzfSK+FfmTDy/UOoeL/Tr8vr7/gs9Pp+3 - 4pcgAiXFxnZcur8SissUFlk6MXJi4r52XL1NABVTm5vLJSSSwgADUyADEpYWXslzYAbxu9l1ZVXl7x7L - aPr5sxeXnHstor6+bIxMqqxuzjOedkDDYbJFlYuo02tui+8uNFop6qeFtFcv99SJdcql7mq3spVWsru9 - F97Ok07RksbEzTdLxjYvbe1we0qqhTBQgsJFNObm8sj2ljjoWNOlg9xpns6moSAAAAABUajUwmc5a1OK - tPyhn/ckXuqvZnP6LvcVU/4X44kbVQ76ZR+aOlTxNMsQbZW7+ZCu6jTcOXj+R4e+MqI9000XcGpvCZ5u - LjOy5dX4kcAppzc3lkyKSWEAAaGQAYlJJNt4S5sASkksvZLmypvLxzeFtFdPHzZi8vHN4W0VyXj5sjk2 - qrt3fJxnPOyBhsNkqxsXUabW3RFvotDPVS+UVy/+e5EuuVS9zFjYuo02tuiOt03TcY2M6bpuEti9t7fB - 7WqqFUFCCwkU0pOTyxQt8EmMTMYmToagAAAAAAAAFBqvJlBoX/k1f8L8cS+1bkzlrDVKVC5fb1Y0lVj2 - cJTfDFz4k+Fy5LZPng52eVm0OTrCo1KGKmfFJ/d9xbGi9tuOO3vLdfkef6lp3fQ4x5W6/wAfgstPYoTy - ymAawDwxcAA8zmkm28Jc2AJSSTbeEubKm7u3N4W0VyXj5sXd25vwiuS+9kcm1Vdu75OM552QMNhsl2Fg - 6jTa26IuNDoZaqXyiuX9l7kO65VL3MWFg6jTa26I63TdNxjYabpuMbF7QoYPaVVRqioQWEinlJyeWKFD - BKSCRk6GoAAAAAAAAAAABQaqtmfI/wBoy7lP/F/BI+w6lDZnyX9plLFOk/8A7fgkAVfsh+0KtZONKrxV - 7XlwN5qUl40m+n8r28MH2LTtRp3FKFahNVKc1mMo/VNc011T3R+cC+9kfa6rp9bijmdCbXb0c7SXxR8J - ro/6M4WVd265OkJ42Z9xurJT35S8ej+ZW1bSUecXjxW6LLT9Qp3FKFajJTp1I8UZL6pro08pro0STz+r - 6XTe+7yy9vuixq1MoLHKOcnNRTbeEiou7tzfhFcl97Oj9paOaHEl7s4t7b4eV6tHKlBbov41na3kmxu8 - RZ4BhsEyw05zabW3RE/Q6GWql8orl/Ze5HvvVS9zFhYObTa26I63TtNwlsZ07TsY2LyhQwezrrjVFQgs - JFPKTk8sUKGCSkEjJ0NQAAAAAAAAAAAAAACvu6WUcF7c+yk7ynCFOcYOFTjbmpNNcMljb5n0ipDJCr2e - QD4VV/ZvWj/7qb+UZmh+wNb+JD/TM+21dKT6Gh6MvAA4D2Kp3GnynGbVW3qbunHKlGp0nFvbdbNddvA6 - 7/qlfwKn+qBP/cq8B+5V4HOVcZPLN1NorqntHGcXGVvUcZJppyjumUs7XL7kZpdFPGV/VczrVoy8DdT0 - lLoRrtDRd50dI3zjwzmrLR22mzpLDTcY2J1CwS6E2lRwSq641xUILCRylJyeWeaFDBJSCQUeb8eZuamQ - AAAAAAAAAAAAAAAAADy4HoAGt0jHYm0AGnsB2BuABq7EyqRsAB5UD1gAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//2Q== - - - - ================================ Overview ====================================== - -In a nutshell, this tool allows you to: -* connect remotely to the game (multiple platforms) and the editor -* process and filter the game's console output -* execute a macro or OS command when certain log is received -* execute CVars and macros, take videos, snapshots, ... -* process (offline) existing log files (drag & drop) [new!] -* modify in-game parameters while the game is running using sliders -* MIDI input devices supported (KORG at the moment) to execute macros and sliders -* MIDI input has the extra advantage of not requiring a change of focus in the application -* fully customisable via XML files that you can change on-the-fly. -* get some statistics - -Any comments/questions/requests, just let me know (Dario [dariop]) - -================ Filter Configuration Quick Guide ======================================= - File: filters.xml - -It needs to be located in the SAME DIRECTORY as the application. - - This file allows you to define your own filters and associated accions. - Feel free to add/remove/modify the contents of this file to suit your needs. - The initial content is intended to be an example of usage. - - How does this work? - - * <Filter Name="Example"> - This attribute is used to specify the filter. In this example, any log that - contains the word "Example" will be added to this filter's tab. - - * <Label>My Example</Label> - This parameter is optional. If included it will be used to label the filter Tab. - Otherwise, the "Name" attribute in Filter will be used. - - * <Color>FF0000</Color> - Optional. Specifies the color of the text in the filter. Format R8G8B8. - - * <RegExp>\!(\w*)\]</RegExp> - Optional. Specifies a regular expression to be used as filter. The given example - would would added to this filter's tab any log that contains something of the - kind "...!....]", i.e. has an exclamation mark and at certain point later a "]" - - * <Exec Type="DosCmd">dir c:</Exec> - Optional. Specifies an action to be taken if a particular filter is activated. - It can be used for instance to trigger a snapshot or a video when certain log - message is sent (e.g. a debugging message). - It can be very useful for debugging and QA. - There are two types of actions that can be executed: - + <Exec Type="Macro">ScreenShot</Exec> - Executes a Macro (in this case ScreenShot, defined in this file) - + <Exec Type="DosCmd">dir c:</Exec> - Executes a dos command (in this case "dir c:") - -================ Menu Configuration Quick Guide ======================================= - File: params.xml - -It needs to be located in the SAME DIRECTORY as the application. - -This file defines the menu of the applciation. You can add: -* Targets (IPs of the devices you want to connect to) -* Macros (set of CVars you want to sent at once to the game) -* GamePlay-specific commands (e.g. SetViewMode:FlyOn) -* Buttons (Macros that are places as separate buttons) -* Sliders (Macros whose parameters change with the slider value) - -You can assign MIDI codes to each entry so they can be controlled via an external MIDI input. - -All this data will become part of your menu so you can customize what you really need. - - - 136, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACS - FQAAAk1TRnQBSQFMAgEBEgEAAXgBBAF4AQQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo - AwABQAMAAVADAAEBAQABCAYAARQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA - AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 - AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA - AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm - AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM - AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA - ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz - AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ - AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM - AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA - AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA - AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ - AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ - AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA - AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm - ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ - Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz - AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA - AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM - AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM - ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM - Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA - AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM - AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ - AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz - AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm - AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw - AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/xEAAfMBiwymAYsB8ycA - AfQBBwLtAQcB9AMAAYsOpgGLJgAB8wHqARUBFAIVAW0DABCmIAAB8wHvAvEB8AHsAe8B6wQUARMB8wIA - EKYgAAHzARIDFQEUAesB7wEVAxQBFQHwAgAFpgG7Af8JpiEAAewEFAETAfABFQQUAewCAAWmAbsB/wmm - IQABBwQUARUBBwFtAesB7QGSAuwB9AEABaYBuwH/AYsIpiEAAfIFFAHsAfMBBwHsAesB7AH3AfQBAAWm - AbsD/wEJAYsFpiIAAe8B7AFtAesB7QEHAbwBFQQUAZIBAAWmAbsB/wGLAa0B/wG1BaYiAAH3AW0C7AFt - ARQB8AESBBQBbQH0BaYBuwH/AqYB8QHdBaYiAAHxARUEFAH3AewBFAEVAxQB8gWmAbsB/wGtAbQB/wG0 - BaYiAAHzARMEFAFtAQcBFAQVAQcFpgG7Av8B9AG1BqYjAAHsBRQBvAHrAe8C8QIHEKYjAAHvARQDFQET - AfAB9AUAEKYkAAHyAbwB7wHxAfQHAAGLDqYBizAAAfMBiwymAYsB8yAAC/8BGgIsCf8CLAF6CP8B8wGS - Ce0B7AL/BIcMAAn/AfYB/wH2AiwBTQj/AiwBegj/AfIB7AEACQ8BEwH/BIcMAAj/AXUBLAH2Av8BJgEs - E/8B8gHrARAJ/wEOAf8EhwwACP8BFgIsAv8BTQIsCv8B9gf/AfIB6wEQCf8BDgH/AYcDowwABf8BbwP/ - AiwB9gL/AiwF/wMyAVkCMgF6Bv8B8gHrARAJ/wEOAf8BowOoDAAF/wIsAv8BwwIsAv8CLAX/AVkFMgf/ - AfIB6wEQCf8BDgH/BKgMAAH/AXUBGgL/AiwD/wIsAv8CLAj/AfYJ/wHyAesBEAn/AQ4B/wqoAfQFAAF1 - AiwB9gH/AiwB9gL/AiwC/wEmASwD/wF6AZoH/wLDBP8B8gHrARAJ/wEOAf8OqAIAAf8CLAL/AiwD/wIs - Av8BJgEsA/8DegX/A3oE/wHyAesBEAn/AQ4B/wGoA6kGAAH0BKkBAAT/AfYCLAL/AcMCLAL/AiwE/wl6 - Bf8B8gHrARAJ/wEOAf8BqAOpCQADqQT/ARoBLAGUAv8CLAHDAv8CLAH/AZoD/wH2BXoBwwP/AfYC/wHy - AesBEAT/AfIDvAHwAQ4B/wGoA6kJAAOpCP8BTQIsAv8BlAEsASYB9gKaAfYK/wKaAv8B8gHrARAD/wH0 - Ae0BDgIAAQ4BDwH/BKkJAAOpCP8CLAH2Av8CLAL/A5oB9gf/AcMDmgL/AfIB6wEQA/8B9AHsAZIC/wEA - Av8EqQgAA6kBZwz/AywD/w2aA/8B8gHrARAD/wH0AewBkgH0ARED/wWpAYwC8gapAbYBAAv/AUcCLAb/ - CZoF/wHyAewBEAP/AfQBkgH3Ae0E/wypAfMDAAz/AvYH/wL2AcMBmgHDCv8B8wXvBv8FAAHKDgABDgER - BGwBSQEQBAAG/wHzARMB6wFtARIG/w8AEP8DAAEPAWwBkQW5AXEBFAEOAgAF/wHqAe0CkgLtAfcBvAT/ - DwAB/wHyAwcBvAEbCf8CAAEPAWwBuQe/AZABbAEOAQAE/wESBfcBkgHtAe8E/w8AAfQB7AFDARoBmgIx - AQcI/wIAAWwBuQm/AZABFQEABP8B9wbvAfcBkgETA/8PAAH0ARwBGgM4AjEB7QEbBv8BAAERAZAKvwHf - AWwBDgP/Au8FBwLvAfcBkgP/BAAI/wMAAfYBHAF6BTgCMQG8Bf8BAAEUAr8B3wG/ArkBugG5Ar8B3wG/ - AbkBDQP/Ae0CBwO8AgcD7wP/AwAJ/wMAAf8B8QF6AlkEOAIxAfcB8gP/AQ4BbAPgAb8BDQMAAboDvwHg - ARUE/wEHAbwE8AG8AQcB7wETA/8HAAX/AwAC/wHzAfcCWQU4AXMB7AHvAfQB/wEOAZAB4AHoAeABugUA - AugB4AHoARQE/wHzAfAD8QHwAbwCBwT/BgAG/wMAA/8B9AG8AlkDOAHtA+wB7QH0AQABkALoAeABkAUA - AbkD6AEVBP8BvAHxAfQB8gH/AfIB8QHvAfEE/wUAA/8BAAP/AwAF/wHyAXMBWQF6ARwC7QLsAW4BvAEA - AWwC6AK5BAABDgK5AugBEAT/ARMB8gHzAf8BEgH0AfEBvAHxBP8EAAP/AgAD/wMABv8B8wPvAvcDbgG8 - AQABEAHhA7kBbAMAAZACuQLoAQ4F/wHyAfQB8QHsAfAB8QHwARIE/wMAA/8DAAL/BAAH/wHzAe8BBwHv - A24B7wH0AgAB4QiQAYEBkAG6AWwBAAX/Ae8B8wH0AvAB8Qb/BAAB/wQAAf8FAAn/AfEB7wHsAfcB8AL/ - AgABDgG5CYEB4QEOAQAH/wHzAe8B8wP/AQcB7wL/DwAQ/wMAARAIBgG6AQ4CAAv/AfEF/w8AEP8EAAEO - AboCawEGAWsBbAGRAQ4DAAj/Au8E/wHxAv8PABD/EAAw/wEAD/8B8wF3DE4BdwHzEAAE/wH0ARoEkwEH - AfIE/wEAAf8D6wX/AZIC6wH0Av8Bdw5OAXcHAAHyAfMHAAP/ARsBkwFvBEYBbwGTAbwB9AL/AQAB/wMO - BP8BEwQOAfMB/xBOBgAC8AEHAfMGAAL/ARsBkwhGAW8BBwL/AQAB/wMOBP8GDgH/EE4GAAHwAQAB/wG8 - BgAC/wEHCkYBbwEaAf8BAAH/Aw4E/wEOAQ8BbQMOAf8ETgF3Af8BCAJOAQgB9QFVBE4GAAH/AfMB8QH/ - BgAB/wHwAW8LRgGTAfQBAAH/Ag4BDwHrAe8C/wEOAQ8BbQMOAf8FTgGYAf8CdwH/AZ0FTgYAAf8C9AH/ - BgAB9gG8BkYBRQZGAb0BAAH/BQ4BbQH/Ag4BbQPqAf8FTgFUAfMBCALCBk4GAAHyAv8B8gYAAfYBkwTp - Ab0D/wFFAekBRgHpAUYBvAEAAf8EDgIPAf8CDgFtBP8GTgGXAv8BdwZOBgAB8gIAAfIGAAH/AW8BRQHp - AkUF/wJFAukBvAEAAf8DDgFDAQ8BDgH/Ag4BbQT/Bk4BdwL/AVUGTgYAAvQBAAHzAf8FAAH/AW8D6QFv - Bf8BRgHpAUUB6QG8AQAB/wMOAUMBDgEPAf8CDgFtAw4B/wZOAcIC8wEIBk4HAAG8AfMBAALzBAAB/wGU - AekBRQJGBf8CRgFFAekBGwEAAf8DDgFDAg4B/wIOAW0DDgH/BU4BnQH/Ap0B/wF3BU4DAAH0AewCkgEA - AvIBAAHyAf8DAAH/ARoBAQJvARcBkwP/AW8CFwEBAUUB9AEAAf8EDgEPAQ4B/wMOAQ8CDgH/BE4BVAH0 - AcICTgLzAVQETgMAAfMB8AEAAQcC/wEHAQAB8wH0AwAB/wH0AUQBbwHjAm8B4wFvBOMBRQGTAf8BAAH/ - BQ4BBwH/ARIEDgL/EE4DAAH/Ae0C/wIHAv8BvAQAAv8B8wFvCRYBAQL/AQAB/wS8AfMD/wO8A/8QTgQA - Af8C7wEHArwB8AH/BAAC/wH0AfMIFgFvAfYC/wEAD/8Bdw5OAXcHAAL/BwAF/wFEBZQB6gT/EAAB8wF3 - DE4BdwHzEAAM/wH2A/8EAAH/ARoBlAEWAeMBFgG9AfQIAAH/AfIBmAF4AZcBmAEIAfQnAAH/AUcH+QGU - Af8FAAH/AVYHVQEIAf8EAAH/AZQBTBIAAfMH7AH/AgAB9AFHCfkBlAH/AwAB9AFWCVUBmAH/AwABkwHj - AUcB/wcAAbwJAAHsB/MCAAH/DPkBlAIAAf8MVQEIAwAB7wFGASUB/wYAASAB/wkAAewH8wIAAb0N+QH/ - AQABCA1VAfQDAAMgBQAB/wEmCgAB7AHzBe0B8wIAARcN+QG9AQABlw1VAQgDAAFvAiAB8gMAAf8BJgH/ - BQAB8wXsB/MBAAH/DvkBlAH/DlUBmAQAAyAB/wEAAf8BJgEgBgAB7ATzAewB8wXtAfMBAAH/DvkBFgH/ - DlUBmAUAAyAB/wEgASUB/wYAAewE8wHsB/IBAAH/DvkBFgH/DlUBmAYAAekDIAH/BwAB7AHzA+0B7AHy - Be0B8gIAAUcN+QGUAQABVg1VAQgGAAG8AyAB/wcAAewE8wGSB/8CAAGUDfkBGwEAAZgNVQEbBAAB/wEm - ASUBIAHyAiAB/wYAAewB8wXtAfMHAAHzDPkBRwH/AQAB8wxVAVYB/wIAAf8C4wFHASYB8wIAASABRgHz - BQAB7AfyBwAB/wG9CvkBRwH/AgAB/wEIClUBlwH/AgAB/wG9AZQBFgHjAf8FAAFvAekB/wMAAewB8gXt - AfIJAAG9CfkB9AUAAQgJVQH0BQABvQEcCQABbwHxAgAB7wf/CQAB/wHzARYBRwP5ARcBlAH/BgAB/wHz - AZgEVQGXAQgB/yoAAf8B9A4AAf8B9CcAAUIBTQE+BwABPgMAASgDAAFAAwABUAMAAQEBAAEBBQABgAEC - FgAD/wEAAv8GAAH+AQcGAAH8AQcHAAEDBwABAwYAAYABAwYAAYABAQYAAYABAQYAAcABAQYAAcAHAAHA - BwABwAcAAeAHAAHgAR8GAAHwAX8GAAL/DAABDwH/BgABDwH/BgABDwH/BgABDwH/BgABDwH/BgABDwH/ - BwABHwcAAQMGAAEPAcEGAAEPAfgGAAEPAfgGAAEPAfgGAAEPAfAHAAEBBwABBwYAAfsB/4QAAv8GAAH+ - AX8GAAH8AT8GAAH9AT8GAAH8AT8GAAH8AT8GAAH8AT8GAAH9Ab8GAAH8AZ8GAAH+AU8GAAHhAScGAAHk - AScGAAHgAQ8GAAHwAQ8GAAH+AX8GAAL/AgAB8AEPAfABDwT/AeABAwHgAQMBxwH/Af4BAAHAAQEBwAEB - AcMB+wH+AQEBgAEBAYABAQHDAfMB/gEBAYABAAGAAQAB4wHnAf4BAQGAAQABgAEAAeEBxwHAAQEEAAHw - AY8BwAEBBAAB+AEPAcABAQQAAfwBHwHAAQEBgAEAAYABAAH8AR8BwAEBAYABAAGAAQAB8AEPAcABPwGA - AQABgAEAAcABxwHAAT8BgAEBAYABAQGBAfEBwAE/AeABAwHgAQMB5wH8AcABPwHgAQcB4AEHBP8B/gF/ - Af4BfwT/Cw== - - - - 376, 17 - - - 579, 17 - - - - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1 - MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAACwwAAAsMAT9AIsgAAAFPSURBVEhLrdZBRwVRGMbxISIi - IlpFtGoVcVd9gLi06htcotUlolW0anuJ6DNEHyAiWrWNVtEqWrWKiFT/Z5xznDnzds2ZzuLHnXfOed65 - c+eeM9V3VeVYxWZSm8osRtZwggf8JN5whSGsuTWziAWc4wtpsOUeA7SyWgXoqp9gBU3ziX008hoHULi+ - uhXQ1QFCZhw+j0dYk3Lotm6j1eAU1oQ+njGLEL6Md1iD+xojNDhyxZL0aIcGd65Y2opvUPr2eEOF609l - nSxhpAZLSbGksRroceq6JOTa9b9Bn6Whi4FvoIXNGvAfWnJmfIMtVyzpAnW4dw1rYB9aWbU5NRpsQCes - Cbm0rtW5cQMZwZqQ4wb1QidpAzmENbGLWywi5MXBMe2zr7BC/nKGcOVe4yChDUgb/gusQPnAJdZhZdhF - g15V9nCMifu8gzlY452q+gWD5cr/iIl0CAAAAABJRU5ErkJggg== - - - - 887, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADK - qAEAAk1TRnQBSQFMAgEBHQEAAcABAQHAAQEBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA - BAABAQIAAQEBAAEgBwABAv8A/wD/AP8AKQADkwH/A2wB/wNrAf8DbAH/A2wB/wNsAf8DbAH/A2wB/wNs - Af8DbAH/A2wB/wNtAf8DbQH/A20B/wNtAf8DbQH/A20B/wNtAf8DbQH/A2wB/wNrAf8DhAH//wClAAPF - Af8DaAH/AzgB/wM4Af8DOgH/AzoB/wM6Af8DOgH/AzoB/wM6Af8DOgH/AzoB/wM7Af8DOwH/AzsB/wM7 - Af8DOwH/AzsB/wM7Af8DOwH/AzkB/wM4Af8DWAH/A7cB//8ApQADbwH/Az8B/wNAAf8DQgH/A0IB/wNC - Af8DQgH/A0IB/wNCAf8DQgH/A0IB/wNCAf8DQgH/A0IB/wNCAf8DQgH/A0IB/wNCAf8DQgH/A0EB/wND - Af8DYgH/A7sB//8AqQADxQH/A8YB/wQAA8YB/wPFAf8DxAH/A8QB/wPEAf8DxAH/AcQCwwH/A8MB/wPD - Af8DwwH/A8MB/wPDAf8DxAH/A8YB/wPGAf8DxgH//wD/AP8AxwABqgKoAf8BggKAAf8BgwKBAf8BgwKB - Af8BggKAAf8BgwKBAf8BggKAAf8BgAJ7Af8BgwKBAf8BhAKCAf8BggKAAf8BowKhAf//ANEAAYACewH/ - AUECPwH/AUUCQwH/AUYCRAH/AUQCQgH/AUQCQgH/AUQCQgH/AUUCQwH/AUcCRQH/AUYCRAH/AUICQAH/ - AXQCcgH//wDRAAF2AnQB/wE5AjcB/wE/Aj0B/wFAAj4B/wE+AjwB/wE7AjkB/wE9AjsB/wE+AjwB/wE+ - AjwB/wE8AjoB/wE7AjkB/wFxAm8B//8A0QABdQJzAf8BOgI4Af8BQAI+Af8BQQI/Af8BQAI+Af8BPwI9 - Af8BQAI+Af8BQAI+Af8BPgI8Af8BPQI7Af8BPQI7Af8BcwJxAf//ANEAAXUCcwH/AToCOAH/AUACPgH/ - AUACPgH/AUACPgH/AUACPgH/AUACPgH/AT4CPAH/AT4CPAH/AT4CPAH/AT4CPAH/AXQCcgH//wDRAAF2 - AnQB/wE6AjgB/wE/Aj0B/wE/Aj0B/wE/Aj0B/wE+AjwB/wE+AjwB/wE9AjsB/wE+AjwB/wE9AjsB/wE9 - AjsB/wFzAnEB//8A0QABdwJ1Af8BOgI4Af8BPgI8Af8BPgI8Af8BPgI8Af8BPQI7Af8BPwI9Af8BPwI9 - Af8BPwI9Af8BPQI7Af8BOwI5Af8BcAJuAf//ANEAAXMCcQH/ATsCOQH/AT0COwH/AT4CPAH/ATwCOgH/ - AT4CPAH/AT8CPQH/AT0COwH/AT4CPAH/AT4CPAH/ATwCOgH/AWwCagH//wCtAAO3Af8DlQH/A44B/wOR - Af8DkgH/A5QB/wGWApUB/wGVApMB/wGLAokB/wFZAlcB/wE9AjsB/wE9AjsB/wE8AjoB/wE9AjsB/wE/ - Aj0B/wE/Aj0B/wE8AjoB/wE+AjwB/wFAAj4B/wFAAj4B/wFWAlQB/wGEAoIB/wGTApEB/wGUApIB/wOS - Af8DlAH/A5MB/wOQAf8DkwH/A7IB//8AiQADtgH/A2gB/wNDAf8DQAH/A0IB/wFEAkMB/wFFAkMB/wFE - AkIB/wFDAkEB/wFAAj4B/wE/Aj0B/wE/Aj0B/wE9AjsB/wE/Aj0B/wFBAj8B/wFAAj4B/wE/Aj0B/wE/ - Aj0B/wFAAj4B/wFAAj4B/wFBAj8B/wFDAkEB/wFFAkMB/wFDAkIB/wNCAf8DQgH/A0AB/wNEAf8DZwH/ - A7AB//8AjQADqgH/A18B/wM9Af8DOgH/AT4CPQH/AT8CPgH/AT4CPAH/AT0COwH/AT4CPAH/AUACPgH/ - AUACPgH/AUACPgH/AUECPwH/AUACPgH/AT8CPQH/AT8CPQH/AT4CPAH/AT8CPQH/AT4CPAH/AT4CPAH/ - AT8CPQH/AT4CPAH/AT0COwH/AT0CPAH/AzoB/wM+Af8DYgH/A6wB//8AlQADpwH/A14B/wM9Af8BPgI9 - Af8BQQI/Af8BPwI9Af8BPgI8Af8BQAI+Af8BQAI+Af8BPwI9Af8BQAI+Af8BQQI/Af8BPwI9Af8BPgI8 - Af8BPwI9Af8BPwI9Af8BPwI9Af8BPgI8Af8BPgI8Af8BPwI9Af8BPwI9Af8BPgI9Af8DPAH/AzkB/wNe - Af8DqwH//wCdAAOoAf8DYAH/Az8B/wE/Aj0B/wE/Aj0B/wE+AjwB/wE/Aj0B/wE/Aj0B/wE/Aj0B/wE/ - Aj0B/wE/Aj0B/wFAAj4B/wE/Aj0B/wE/Aj0B/wFAAj4B/wFAAj4B/wE/Aj0B/wE+AjwB/wE9AjsB/wE+ - AjwB/wE+AjwB/wE+Aj0B/wNaAf8DpgH//wClAAOpAf8BXQJcAf8BQAI+Af8BQAI+Af8BQAI+Af8BPwI9 - Af8BPwI9Af8BQAI+Af8BPwI9Af8BPwI9Af8BQAI+Af8BPgI8Af8BPwI9Af8BQAI+Af8BQgJAAf8BQgJA - Af8BQAI+Af8BPgI8Af8BPAI6Af8BQQJAAf8BYAJfAf8DqgH//wCtAAGlAqQB/wFZAlcB/wE/Aj0B/wE9 - AjsB/wE/Aj0B/wE/Aj0B/wE+AjwB/wE/Aj0B/wE/Aj0B/wE+AjwB/wE/Aj0B/wFAAj4B/wFAAj4B/wE/ - Aj0B/wE/Aj0B/wFAAj4B/wE/Aj0B/wFBAj8B/wFiAmAB/wOrAf//ALUAAZ4CnAH/AVYCVAH/AToCOAH/ - ATsCOQH/AT4CPAH/AT4CPAH/AT4CPAH/AT8CPQH/AT4CPAH/AUACPgH/AUECPwH/AUACPgH/AT4CPAH/ - AT0COwH/ATwCOgH/AT4CPAH/AV0CWwH/AaoCqQH//wC9AAGfAp0B/wFYAlYB/wE+AjwB/wE+AjwB/wFA - Aj4B/wFAAj4B/wE/Aj0B/wE/Aj0B/wE+AjwB/wE/Aj0B/wE/Aj0B/wE/Aj0B/wE9AjsB/wE9AjsB/wFb - AlkB/wGmAqUB//8AxQABoAKeAf8BWgJYAf8BPwI9Af8BPwI9Af8BPwI9Af8BPgI8Af8BPwI9Af8BPwI9 - Af8BPgI8Af8BPgI8Af8BPgI8Af8BQQI/Af8BYAJeAf8BqAKnAf//AM0AAZgClgH/AVMCUQH/ATsCOQH/ - AT0COwH/AT4CPAH/AUACPgH/AUECPwH/AT8CPQH/AT0COwH/AUECPwH/AWMCYQH/AasCqQH//wDVAAGT - ApIB/wFQAk4B/wE9AjsB/wE/Aj0B/wFBAj8B/wFBAj8B/wE+AjwB/wE9AjsB/wFcAlsB/wGlAqMB//8A - 3QABlQKTAf8BUgJQAf8BPwI9Af8BPgI8Af8BPQI7Af8BPQI7Af8BWQJXAf8BowKhAf//AOUAAZQCkgH/ - AVACTgH/ATsCOQH/AT4CPAH/AVsCWQH/AaYCpAH//wDtAAGMAosB/wFJAkcB/wFbAlkB/wGnAqUB//8A - 9QABmgKYAf8BqwKpAf//AP8A/wD/AGQAAwMBBAMXASADFwEgAxcBIAMXASADWQHHA74B/wPBAf8DzQH/ - A1kBxwMXASADFwEgAxcBIAMGAQiQAAP0Af//ADEAAyoBQAM2AVgDuwH/A48B/wNBAf8DHAH/AxEB/wMW - Af8DGQH/AxMB/wMYAf8DPAH/A4IB/wO3Af8DQAFwAyoBQCwAAd0C3AH/A50B/wFRAlAB/wM6Af8BOgI5 - Af8BOgI5Af8DPAH/AzsB/wM7Af8DOwH/AzsB/wM7Af8DOwH/AzsB/wE7AjoB/wE7AjoB/wE7AjoB/wE7 - AjoB/wE7AjoB/wE7AjoB/wE7AjoB/wE5AjgB/wE8AjsB/wFKAkkB/wGOAo0B/wPIAf8D8AH/NAADbAH/ - A2gB/+gAAzQBVAO0Af8DXgH/AywB/wMbAf8DIwH/AykB/wMoAf8DJQH/AyUB/wMnAf8DKgH/AyQB/wMX - Af8DJwH/A1kB/wOpAf8DOgFgJAABxQLDAf8BUAJOAf8BHQIbAf8BJAIiAf8BKAImAf8BKAImAf8BKAIm - Af8BJQIjAf8BKwIpAf8BKAImAf8BKAImAf8BKAImAf8BKAImAf8BKAImAf8BKAImAf8BKAImAf8BJwIl - Af8BJwIlAf8BJwIlAf8BJwIlAf8BJwIlAf8BJwIlAf8BKQInAf8BJwIlAf8BJwIlAf8BIAIeAf8BNwI1 - Af8BpAKiAf8B7wLtAf8oAAO0Af8DSwH/AyMB/wOAAf/gAAMyAVADRwGAA2IB7wM1Af8DIQH/AygB/wMn - Af8DIwH/AyUB/wMtAf8DMAH/AzQB/wMqAf8DIgH/AyIB/wMmAf8DJwH/AyQB/wMvAf8DXgH/A0ABcBwA - AdUC0wH/AVICUAH/AScCJQH/ASsCKQH/ASwCKgH/ASoCKAH/ASsCKQH/ASoCKAH/ASgCJgH/ASsCKQH/ - ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASsCKQH/ASsCKQH/ASsCKQH/ - ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASoCKAH/ASsCKQH/ASoCKAH/AScCJQH/ATUCMwH/AbUCswH/ - KAADWQH/Ay4B/wMjAf8DqQH/4AADUQGfA0sB/wMnAf8DJQH/AycB/wMqAf8DPwH/A2gB/wOiAf8DSQGI - AzoBYAM6AWADOgFgA0kBiAOAAf8DSAH/AygB/wMlAf8DKQH/AyIB/wNUAfMDUQGfAzsBYxAAAfUC9AH/ - AZQCkgH/ASQCIgH/ASkCJwH/AS0CKwH/ASkCJwH/ASgCJgH/ASsCKQH/ASwCKgH/ASsCKQH/ASoCKAH/ - ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASsCKQH/ASoCKAH/ASoCKAH/ASoCKAH/ - ASoCKAH/ASoCKAH/ASoCKAH/ASkCJwH/ASoCKAH/ASgCJgH/ASkCJwH/ASwCKgH/ASQCIgH/AUYCRAH/ - A+QB/yAAA6UB/wM2Af8DKwH/AzcB/+AAAzoBYANcAecDIQH/AykB/wMqAf8DNQH/A5QB/wNXAbcDKgFA - AyoBQAMMARAMAAMMARADKgFAA1EBoAOZAf8DPQH/AyIB/wMnAf8DIwH/A0EB/wNRAZ8QAAPpAf8BSwJJ - Af8BJgIkAf8BKQInAf8BLgIsAf8BKwIpAf8BLAIqAf8BLAIqAf8BLAIqAf8BLwItAf8BKwIpAf8BKgIo - Af8BKgIoAf8BKgIoAf8BKgIoAf8BKgIoAf8BKgIoAf8BKwIpAf8BLAIqAf8BLAIqAf8BLAIqAf8BLAIq - Af8BLAIqAf8BLAIqAf8BLQIrAf8BLAIqAf8BKQInAf8BLQIrAf8BLAIqAf8BKwIpAf8BIgIgAf8BzgLN - Af8gAAOAAf8DLwH/AywB/wM/Af9gAAPeAf8D1gH/A9gB/wPYAf8D2gH/A9oB/wPYAf8D2QH/A9kB/wPZ - Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPaAf8D2gH/A9cB/wPh - Af8DVwG4AzwBZgM8AWYMAAM0AVQDYgHvAyUB/wMrAf8DLAH/AyoB/wNAAf8DWQHHAw8BFCAAAwwBEAMX - ASADWQHHA0gB/wMjAf8DJwH/AyUB/wNSAfMDQAFwDAAB4gLhAf8BMgIwAf8BKQInAf8BKAImAf8BLAIq - Af8BLAIqAf8BKwIpAf8BJwIlAf8BKAImAf8BLQIrAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKgIoAf8BKgIoAf8BKgIoAf8BKgIoAf8BKgIoAf8BKgIoAf8BKgIo - Af8BKQInAf8BKgIoAf8BKgIoAf8BKwIpAf8BJwIlAf8BHgIcAf8BwQLAAf8gAANQAf8DLgH/Ay8B/wM0 - Af9cAAPtAf8DhAH/A0QB/wNKAf8DTAH/A0kB/wNKAf8DSgH/A0oB/wNKAf8DSgH/A0oB/wNKAf8DSgH/ - A0oB/wNKAf8DSgH/A0oB/wNKAf8DSgH/A0oB/wNKAf8DSwH/A0oB/wNIAf8DhAH/A0oBiRAAAyoBQAOQ - Af8DJAH/AygB/wMoAf8DJgH/AycB/wMkAf8DRgH/A1EBnywAA1wB3wNKAf8DHwH/AysB/wMoAf8DZgH/ - AzoBYAgAAeIC4QH/AS0CKwH/ASwCKgH/ASsCKQH/ASwCKgH/ASoCKAH/ASoCKAH/ASkCJwH/ASoCKAH/ - ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASwCKgH/ASsCKQH/ASsCKQH/ - ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASwCKgH/ASwCKgH/ASkCJwH/AS0CKwH/ASwCKgH/ - ASkCKAH/AyAB/wPBAf8gAAM9Af8DLQH/Ay8B/wMlAf8DoQH/WAAD7AH/A08B/wMdAf8DIAH/AyEB/wMh - Af8DIAH/AyMB/wMiAf8DIwH/AyMB/wMjAf8DIwH/AyMB/wMjAf8DIwH/AyMB/wMjAf8DIwH/AyMB/wMj - Af8DIgH/AyIB/wMlAf8DJQH/A1IB/wNKAYkMAAMDAQQDNgFYAzAB/wMlAf8DKgH/AykB/wMoAf8DJgH/ - AykB/wMlAf8DUwH/A0wBkAMJAQwoAANcAd8DQAH/AyMB/wMlAf8DNgH/A7EB/wMqAUAEAAPiAf8BLQIr - Af8BKQInAf8BKwIpAf8BLAIqAf8BKgIoAf8BKQInAf8BLAIqAf8BKgIoAf8BJAIiAf8BJwIlAf8BKwIp - Af8BKgIoAf8BKgIoAf8BKQInAf8BKgIoAf8BKwIpAf8BKQInAf8BKgIoAf8BKwIpAf8BLAIqAf8BLAIq - Af8BKwIpAf8BKwIpAf8BLAIqAf8BLAIqAf8BKQInAf8BLAIqAf8BLAIqAf8BKwIqAf8DHAH/A8IB/xwA - A5YB/wM2Af8DLgH/Ay8B/wMoAf8BXwJeAf8BtAKzAf9UAAPtAf8DUQH/AzAB/wOeAf8DsAH/A7AB/wOu - Af8DsgH/A64B/wOvAf8DrwH/A68B/wOvAf8DrwH/A68B/wOvAf8DrwH/A68B/wOvAf8DrwH/A68B/wOt - Af8DrAH/A5oB/wMjAf8DVAH/A0oBiQwAAxcBIAOEAf8DGQH/AyYB/wMyAf8DUgH/Ay8B/wMnAf8DJQH/ - AycB/wMqAf8DXgH/A0kBiAMMARAoAANZAccDNgH/AycB/wMkAf8DYgH/AyoBQAQAA+IB/wEtAisB/wEp - AicB/wEpAicB/wErAikB/wEsAioB/wErAikB/wEsAioB/wEwAi4B/wFKAkgB/wEiAiAB/wElAiMB/wEq - AigB/wEqAigB/wErAikB/wEqAigB/wEoAiYB/wEoAiYB/wEqAigB/wErAikB/wEtAisB/wEtAisB/wEp - AicB/wEpAicB/wErAikB/wErAikB/wErAikB/wErAikB/wEqAigB/wMqAf8DIAH/A8IB/xAAA68B/wNl - Af8DPgH/AzQB/wMtAf8BLgItAf8BMAIvAf8BMAIuAf8BMgIxAf8BNQIzAf8BOAI2Af8BOAI2Af8BNQIz - Af8BNQI0Af8BNQI0Af8BNgI0Af8BNQI0Af8BNgI0Af8BNgI0Af8DNQH/AzQB/wM1Af8DTgH/A5kB/xwA - A+0B/wNPAf8DMAH/A98B/wP4Af8D8gH/A/UB/wP0Af8D+gH/A/cB/wP2Af8D9gH/A/gB/wP5Af8D9AH/ - A/MB/wPzAf8D+QH/A/kB/wP0Af8D9gH/A/YB/wP5Af8D1wH/AxkB/wNWAf8DSgGJDAADQgF0AzQB/wMo - Af8DIAH/A2cB/wNXAbcDXwHzAyoB/wMlAf8DJgH/AyYB/wMnAf8DXAH/A0kBiAMJAQwkAAMXASADkAH/ - AycB/wMmAf8DLgH/A0kBiAMJAQwD4gH/AS0CKwH/ASkCJwH/ASkCJwH/ASwCKgH/ASoCKAH/ASsCKQH/ - ASoCKAH/AVwCWgH/AcsCygH/AasCqQH/AU4CTAH/AS0CKwH/ASYCJAH/ASkCJwH/ASwCKgH/AS0CKwH/ - ASsCKQH/AS8CLQH/AS0CKwH/AS4CLAH/ASwCKgH/ASoCKAH/ASwCKgH/ASsCKQH/ASsCKQH/ASsCKQH/ - ASsCKQH/ASoCKAH/ASsCKgH/ASECIAH/A8IB/wwAA6gB/wNDAf8DLwH/AysB/wMrAf8DLwH/AzAB/wEy - AjAB/wEwAi4B/wEtAisB/wEsAioB/wEtAisB/wEuAiwB/wEsAioB/wEsAioB/wEsAioB/wEsAioB/wEs - AioB/wEsAioB/wEsAioB/wMqAf8DKQH/AyoB/wMtAf8DNwH/A4IB/xgAA+4B/wNPAf8DLwH/A9sB/wOh - Af8DJAH/Ax8B/wNHAf8D1wH/A1oB/wMgAf8DJAH/A4YB/wPNAf8DQgH/AygB/wMkAf8DlwH/A8gB/wMk - Af8DIAH/Az0B/wPKAf8D3gH/AxkB/wNVAf8DSgGJDAADpAH/AyMB/wMmAf8DLwH/A1UBsAMXASADQAFw - A5cB/wMqAf8DIwH/AygB/wMoAf8DIQH/A1IB/wNMAZAkAAMMARADUQGgA0AB/wMoAf8DGQH/A5cB/wMX - ASAD4gH/AS0CKwH/ASkCJwH/ASkCJwH/ASwCKgH/ASsCKQH/ASgCJgH/ATcCNQH/Aa8CrQH/AfcC9gH/ - AfwC+gH/Ad0C3AH/AawCqgH/AVICUAH/ASQCIgH/ASYCJAH/AS8CLQH/ASsCKQH/ASwCKgH/ASsCKQH/ - ASsCKQH/ASsCKQH/ASwCKgH/AS0CKwH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASoCKAH/ASwCKgH/ - ASICIAH/A8IB/wwAA0gB/wMpAf8DLAH/Ay4B/wMvAf8DLwH/ATACLwH/ATACLgH/ATECLwH/ATECLwH/ - ATECLwH/ATACLgH/ATACLgH/ATACLgH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ - AzAB/wMvAf8DLQH/Ay0B/wMtAf8DMwH/A40B/xQAA+4B/wNPAf8DMgH/A94B/wOgAf8DLAH/AyIB/wNG - Af8D2wH/A1wB/wMlAf8DKAH/A4cB/wPOAf8DPgH/AyQB/wMlAf8DmAH/A8UB/wMjAf8DJQH/Az0B/wPM - Af8D2gH/AxcB/wNUAf8DSgGJDAADZwH/AyIB/wMgAf8DTgH/AzoBYAgAAzoBYAOVAf8DKgH/AyUB/wMq - Af8DJwH/AyAB/wNeAf8DUQGfJAADKgFAA18B/wMlAf8DJAH/A00B/wMXASAD4gH/AS0CKwH/ASkCJwH/ - ASkCJwH/ASoCKAH/ASgCJgH/AScCJQH/AVgCVgH/AdsC2QH/Af4C/QX/A/4B/wH5AvgB/wHhAuAB/wGp - AqcB/wE7AjkB/wEhAh8B/wEoAiYB/wErAikB/wEtAisB/wEpAicB/wErAikB/wEpAicB/wEsAioB/wEt - AisB/wErAikB/wErAikB/wErAikB/wEqAigB/wEsAioB/wEiAiAB/wPCAf8IAAOGAf8DLwH/AzAB/wMx - Af8DMAH/AzAB/wMvAf8DLwH/ATECLwH/ATECLwH/ATACLgH/ATECLwH/ATACLgH/AS8CLQH/ATACLgH/ - ATACLgH/ATECLgH/ATECLwH/ATECLgH/ATECLgH/ATACLgH/Ay4B/wMwAf8DLwH/Ay8B/wMwAf8DLQH/ - A0YB/xQAA+4B/wNPAf8DMQH/A9oB/wOjAf8DMAH/AykB/wNHAf8D2wH/A1sB/wMnAf8DKQH/A4YB/wPM - Af8DPwH/AycB/wMmAf8DmgH/A8UB/wMoAf8DJQH/Az8B/wPMAf8D3AH/AxkB/wNUAf8DSgGJCAADWQG/ - A1IB/wMhAf8DIwH/A4IB/wM6AWAMAAM2AVgDmQH/Ay8B/wMpAf8DJgH/AyYB/wMnAf8DVgH/A1IBpyAA - AyoBQAOZAf8DHwH/AykB/wMjAf8DFwEgA+IB/wEtAisB/wEpAicB/wEpAicB/wEsAioB/wErAikB/wEy - AjAB/wGsAqoB/wH+Av0C/wL+Af8B/gL9Af8D/AL/Av0C/wL9Af8B/gL8Af8B8gLwAf8BjwKNAf8BMgIw - Af8BKgIoAf8BKgIoAf8BLAIqAf8BLAIqAf8BLgIsAf8BLAIqAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKgIoAf8BLAIqAf8BIgIgAf8DwgH/CAADVQH/AywB/wMtAf8DMAH/AzIB/wMwAf8DLwH/AS8CLgH/ - ATICMAH/ATICMAH/ATACLgH/ATACLgH/ATMCMQH/ATICMAH/ATICMAH/ATECLwH/ATECLwH/ATECLwH/ - ATECLwH/ATECLwH/ATECLwH/AzAB/wMwAf8DMAH/Ay4B/wMuAf8DLQH/AzMB/wOhAf8QAAPuAf8DTwH/ - Ay4B/wPbAf8DoQH/Ay0B/wMkAf8DRgH/A9wB/wNaAf8DJgH/AykB/wOHAf8DzQH/Az8B/wMmAf8DKAH/ - A5sB/wPFAf8DJgH/AyYB/wM/Af8DzAH/A9sB/wMVAf8DVwH/A0oBiQgAA+IB/wNFAf8DJgH/Ay4B/wOb - Af8DOgFgDAADAwEEAzYBWAOaAf8DKgH/AycB/wMoAf8DJgH/AyMB/wNeAfsDUgGnHAADBgEIA0IBdAMk - Af8DJwH/AxMB/wMXASAD4gH/AS0CKwH/ASkCJwH/ASkCJwH/ASgCJgH/ASkCJwH/AU0CSwH/Ae8C7gL/ - Av4B/wH+Av0B/wHeAtwB/wHKAsgB/wHwAu8B/wH+AvwC/wL9Af8D/gH/A/wB/wHgAt4B/wGaApgB/wFM - AkoB/wEtAisB/wEnAiUB/wErAikB/wEqAigB/wEsAioB/wErAikB/wErAikB/wErAikB/wEqAigB/wEs - AioB/wEiAiAB/wPCAf8IAANBAf8DKgH/ASwCKwH/AS4CLQH/ATECMAH/ATICMQH/ATACLwH/AS8CLgH/ - ATICMAH/ATICMAH/ATECLwH/ATECLwH/ATMCMQH/ATICMAH/ATECLwH/ATICMAH/ATICMAH/ATICMAH/ - ATICMAH/ATICMAH/ATICMAH/ATECMAH/ATECMAH/Ay8B/wEvAi4B/wMvAf8DLQH/Ay0B/wOEAf8QAAPu - Af8DTwH/Ay0B/wPdAf8DowH/Ay0B/wMmAf8DRQH/A9sB/wNcAf8DJQH/AyoB/wOKAf8DzwH/Az8B/wMp - Af8DJgH/A5sB/wPGAf8DKQH/AykB/wM+Af8DywH/A9kB/wMWAf8DVgH/A0oBiQgAA9kB/wM6Af8DJwH/ - AzMB/wOpAf8DOgFgFAADOgFgA4oB/wMnAf8DJgH/AygB/wMnAf8DJAH/A1EB/wNRAZ8cAAM5AWADJAH/ - Ay0B/wMXAf8DzgH/A+IB/wEuAi0B/wEpAicB/wEpAicB/wEnAiUB/wEoAiYB/wGyArEG/wL+Af8B+AL3 - Af8BYAJeAf8BQAI/Af8BlAKTAf8BzwLOAf8D9QH/Af4C/QH/AfwC+wX/AfUC9AH/Ac8CzgH/AZUClAH/ - AUACPgH/ARQCEwH/ASYCJQH/ASoCKAH/ASsCKQH/ASsCKQH/ASoCKAH/ASkCJwH/ASsCKQH/ASMCIQH/ - AcMCwgH/BAADsAH/AzcB/wEvAi0B/wExAi8B/wEwAi8B/wExAi8B/wExAjAB/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEtAiwB/wNo - Af8QAAPuAf8DTwH/AywB/wPcAf8DogH/AykB/wMnAf8DRgH/A9oB/wNaAf8DJAH/AygB/wOKAf8D0AH/ - A0IB/wMrAf8DJQH/A5kB/wPFAf8DKQH/AygB/wM9Af8DzAH/A9oB/wMbAf8DVQH/A0oBiQgAA9gB/wM6 - Af8DJQH/AzIB/wOkAf8DOgFgGAADQAFwA18B8wMrAf8DKgH/AyoB/wMpAf8DKQH/A2AB/wNMAZADCQEM - FAADOQFgAyYB/wMnAf8DGAH/A9YB/wPhAf8DKwH/AScCJgH/ASsCKQH/ASMCIQH/AVgCVgH/AewC6gL/ - Av4C/wL+Af8BxALCAf8BJgIlAf8DJAH/Ay0B/wNIAf8DjgH/A9EB/wP6Af8D/gX/A/0B/wP0Af8DxwH/ - A2MB/wM9Af8BKAImAf8BJwIlAf8BKgIoAf8BKgIoAf8BKgIoAf8BLAIqAf8BIgIgAf8DwgH/BAADrQH/ - AzUB/wEwAi4B/wEyAjAB/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEyAjAB/wEtAiwB/wNnAf8QAAPuAf8DTwH/ - Ay0B/wPaAf8DowH/AysB/wMkAf8DRgH/A9sB/wNYAf8DJAH/AysB/wOHAf8D0AH/A0EB/wMrAf8DJQH/ - A5kB/wPHAf8DKgH/AycB/wM8Af8DzgH/A9kB/wMaAf8DVwH/A0oBiQgAA+UB/wNEAf8DIwH/AyYB/wOU - Af8DOgFgHAADQwF3A2IB7wMqAf8DJAH/AyoB/wMnAf8DIwH/A1gB/wNJAYgDDAEQDAADDAEQA0kBiAMj - Af8DKQH/AxoB/wNZAccD4AH/AysB/wEpAigB/wEqAigB/wEtAisB/wG+Ar0B/wH9AvwF/wHwAu8B/wFi - AmAB/wErAikB/wMoAf8DKQH/AycB/wMoAf8DOAH/A5oB/wPaAf8D9gH/A/4B/wP+Af8D+wH/A/AB/wPF - Af8BjAKLAf8BPQI7Af8BIgIgAf8BKQInAf8BLAIqAf8BKwIpAf8BIgIgAf8DwgH/BAADrQH/AzUB/wEw - Ai4B/wEyAjAB/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEyAjAB/wEtAiwB/wNnAf8QAAPuAf8DTwH/AzAB/wPb - Af8DogH/AysB/wMpAf8DRwH/A9sB/wNaAf8DJQH/AysB/wOHAf8DzQH/Az8B/wMoAf8DKAH/A5gB/wPI - Af8DKQH/AycB/wM+Af8DzQH/A9kB/wMZAf8DWAH/A0oBiQgAA1EBnwNUAf8DJAH/AyIB/wOCAf8DOgFg - IAADQwF3A18B8wMjAf8DKQH/AywB/wMqAf8DIwH/A2AB/wNJAYgDCQEMCAADKgFAA5UB/wMdAf8DKAH/ - AykB/wMXASAD4QH/Ay0B/wEpAigB/wEoAiYB/wFOAkwB/wHtAusC/wL+Av8C/gH/AcMCwgH/AT8CPQH/ - ASsCKQH/AyYB/wMpAf8DKAH/AycB/wMnAf8DKAH/A0UB/wOjAf8D6wX/A/4F/wP8Af8D8QH/AccCxQH/ - AYUCgwH/ASgCJgH/ASsCKQH/ASsCKQH/AR8CHQH/AcICwQH/BAADrQH/AzUB/wEwAi4B/wEyAjAB/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wEyAjAB/wEtAiwB/wNnAf8QAAPuAf8DTwH/Ay0B/wPdAf8DowH/AyoB/wMm - Af8DSAH/A9sB/wNcAf8DJgH/AygB/wOIAf8DzAH/Az8B/wMnAf8DJgH/A5kB/wPDAf8DKwH/AygB/wM9 - Af8DzgH/A9kB/wMbAf8DVgH/A0oBiQwAA4QB/wMjAf8DJAH/A00B/wM6AWAkAANAAXADhwH/AygB/wMo - Af8DKwH/AykB/wMsAf8DgAH/A0wBkAgAAyoBQANbAf8DIQH/AyIB/wNUAf8DFwEgA+IB/wMqAf8BJgIl - Af8BKwIpAf8BLAIqAf8BWAJWAf8B0ALOAf8B3wLeAf8BXwJdAf8BJwIlAf8BLgIsAf8DLAH/AyoB/wMr - Af8DKQH/AykB/wMtAf8DJAH/AyQB/wNCAf8DqAH/A+oB/wP5Af8D/QX/Af0C/AH/AfgC9gH/AZQCkgH/ - ASICIAH/ASsCKQH/ASACHgH/A8IB/wQAA60B/wM1Af8BMAIuAf8BMgIwAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMgIwAf8BLQIsAf8DZwH/EAAD7gH/A08B/wMrAf8D2gH/A6IB/wMmAf8DIgH/A0IB/wPYAf8DWAH/ - AyMB/wMnAf8DiQH/A9AB/wM9Af8DJAH/AyQB/wOZAf8DxAH/AyIB/wMhAf8DOgH/A8YB/wPWAf8DGAH/ - A1YB/wNKAYkMAAOvAf8DJwH/AygB/wMoAf8DWwHDAxwBKCQAAzoBYAOTAf8DKgH/AyYB/wMoAf8DJwH/ - AygB/wNXAf8DUQGfAw8BFANXAbcDOQH/AygB/wMYAf8DnAH/AxcBIAPiAf8DLAH/ASYCJQH/ASoCKAH/ - ASwCKgH/ASUCIwH/ARoCGAH/AVECTwH/ATQCMgH/ASkCJwH/ASoCKAH/AyYB/wEmAiUB/wEoAicB/wEq - AikB/wErAioB/wMqAf8DLAH/ASkCKAH/ASUCJAH/AxEB/wM3Af8BswKyAf8B4wLiAf8B+QL4Av8C/gH/ - AekC5wH/AUQCQgH/ASoCKAH/ASsCKgH/ASICIAH/A8IB/wQAA60B/wM1Af8BMAIuAf8BMgIwAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMgIwAf8BLQIsAf8DZwH/EAAD7gH/A08B/wMyAf8D3gH/A7cB/wNZAf8DVgH/ - A4UB/wPcAf8DkgH/A1QB/wNaAf8DpAH/A9cB/wOAAf8DUwH/A1QB/wOzAf8D0gH/A1YB/wNRAf8DZAH/ - A9cB/wPXAf8DHgH/A1cB/wNKAYkMAAM2AVgDOQH/AyUB/wMiAf8DXwH/AyoBQCgAAzYBWAOTAf8DJwH/ - AyYB/wMpAf8DJwH/AyEB/wNRAf8DWQHHA5AB/wMoAf8DJQH/AzIB/wPJAf8DFwEgA+EB/wMtAf8BKAIn - Af8BKAImAf8BKAImAf8BKwIpAf8BLAIqAf8BJwIlAf8BKQInAf8BLQIrAf8BKQInAf8BKgIoAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKgIoAf8BLAIqAf8BKwIpAf8BKwIpAf8BKQInAf8BKQInAf8BKAImAf8BKQIn - Af8BXwJdAf8BtQKzAf8B4ALeAf8BqQKnAf8BKwIpAf8BKAImAf8BJwImAf8DHgH/A8IB/wQAA60B/wM1 - Af8BLwIuAf8DMAH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ - ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/ - ATECLwH/ATECLwH/ATECLwH/ATECLwH/ATECLwH/AzAB/wMsAf8DZwH/EAAD7gH/A08B/wMwAf8D1wH/ - A+wB/wPuAf8D7QH/A+0B/wPxAf8D7QH/A/AB/wPqAf8D7QH/A/EB/wPsAf8D7QH/A+wB/wPxAf8D8AH/ - A+4B/wPqAf8D6gH/A/AB/wPUAf8DGQH/A1UB/wNKAYkMAAMXASADiQH/AxYB/wMpAf8DLQH/A2QB5wMU - ARwkAAMDAQQDNgFYA4oB/wMjAf8DJgH/AykB/wMnAf8DJAH/A0UB/wM4Af8DJgH/AyIB/wNnAf8DNgFY - AwMBBAPhAf8DKgH/ASkCKAH/ASwCKgH/ASsCKQH/ASkCJwH/ASsCKQH/ASoCKAH/ASsCKQH/ASsCKQH/ - ASsCKQH/ASwCKgH/ASwCKgH/ASoCKAH/ASsCKQH/ASwCKgH/ASoCKAH/ASsCKQH/ASsCKQH/ASkCJwH/ - ASoCKAH/ASsCKQH/ASkCJwH/ASkCJwH/ATkCNwH/AVkCVwH/AUcCRQH/AScCJQH/ASoCKAH/ASoCKQH/ - AxwB/wPBAf8EAAOtAf8DNQH/Ay8B/wMwAf8BMQIvAf8BMAIuAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIwAf8BMAIvAf8DLAH/A2cB/xAA - A+4B/wNQAf8DJwH/A2UB/wOLAf8DjQH/A40B/wOLAf8DjQH/A40B/wOLAf8DiwH/A4sB/wOKAf8DiQH/ - A4wB/wOLAf8DigH/A4sB/wOKAf8DjgH/A4wB/wOKAf8DZAH/Ax8B/wNYAf8DSgGJEAADKgFAAzYB/wMn - Af8DJQH/AzcB/wPHAf8sAAM6AWADjwH/AywB/wMrAf8DKQH/AyoB/wMhAf8DKQH/AycB/wM9Af8DvgH/ - AyoBQAQAA+IB/wMtAf8BJwImAf8BKgIoAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKgIoAf8BKAImAf8BKgIoAf8BKgIoAf8BKwIpAf8BKgIp - Af8DHAH/A8MB/wQAA60B/wM2Af8DMAH/AzAB/wEwAi4B/wEvAi0B/wEwAi4B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wEyAjAB/wEyAjAB/wExAi8B/wEyAjAB/wExAi8B/wEyAjAB/wMuAf8DKgH/A2cB/xAA - A+0B/wNaAf8DLQH/AycB/wMoAf8DKAH/AycB/wMnAf8DKAH/AygB/wMpAf8DKAH/AygB/wMoAf8DJwH/ - AykB/wMnAf8DKAH/AygB/wMoAf8DKQH/AygB/wMpAf8DKwH/AzIB/wNcAf8DSgGJEAADJgE4A2AB6wMo - Af8DJgH/AyIB/wNEAf8DzQH/AxQBHCgAA0ABcANfAfMDJgH/AysB/wMoAf8DKgH/AykB/wMoAf8DYgHv - AzQBVAgAA98B/wMtAf8BKAInAf8BKgIoAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKQInAf8BLAIqAf8BLwItAf8BKwIpAf8BKQInAf8BKgIo - Af8BHwIeAf8BxQLEAf8EAAOzAf8DOQH/AysB/wEwAi8B/wExAi8B/wEwAi4B/wEwAi4B/wEyAjAB/wEw - Ai4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEw - Ai4B/wEwAi4B/wEwAi4B/wEwAi4B/wExAi8B/wExAi8B/wEwAi4B/wEwAi4B/wExAi8B/wMvAf8DKwH/ - A2gB/xAAA/MB/wOuAf8DmAH/A5gB/wOYAf8DmAH/A5kB/wOZAf8DmQH/A5oB/wOaAf8DmgH/A5oB/wOa - Af8DmgH/A5oB/wOaAf8DmgH/A5oB/wOaAf8DmgH/A5kB/wObAf8DmwH/A5YB/wOxAf8DSgGJFAADLgFI - A1wB3wMqAf8DJgH/Ax8B/wM5Af8DZAHnAyoBQAMcASgkAANRAZ8DQwH/AygB/wMnAf8DKwH/AyEB/wNc - AecDOgFgDAAD4AH/AyoB/wEmAiUB/wEpAicB/wEqAigB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEoAiYB/wEsAioB/wEqAigB/wEu - AiwB/wEhAh8B/wHCAsEB/wgAA0QB/wErAioB/wExAi8B/wEyAjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEyAjAB/wEwAi4B/wEwAi4B/wEzAjEB/wEwAi8B/wEv - Ai4B/wOJAf94AANZAcIDRQF8A0UBfBAAAzIBUANaAdsDJgH/AyYB/wMlAf8DLwH/A2UB/wNbAcMDOgFg - AzoBYAM6AWADOgFgAzoBYAM6AWADOgFgAzoBYAM6AWADWwHDAy8B/wMqAf8DKQH/AyUB/wNKAf8DUQGf - EAAD5gH/A0AB/wEnAiYB/wEuAiwB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wEsAioB/wEsAioB/wEpAicB/wErAikB/wEuAiwB/wEm - AiQB/wHLAsoB/wgAA1oB/wEsAioB/wEvAi0B/wEzAjEB/wEyAjAB/wExAi8B/wEwAi4B/wEwAi4B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wExAi8B/wEx - Ai8B/wExAi8B/wExAi8B/wExAi8B/wEwAi4B/wExAi8B/wEwAi4B/wEyAjAB/wEvAi0B/wE0AjMB/wOo - Af+YAAMyAVADXAHfAykB/wMnAf8DKAH/AyAB/wMrAf8DVAH/A4wB/wOnAf8DtAH/A7gB/wOoAf8DlAH/ - A1cB/wM1Af8DIgH/AyQB/wMmAf8DIQH/A1cB/wNcAd8DMgFQEAAD7wH/A4QB/wElAiQB/wEvAi0B/wEs - AioB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEs - AioB/wErAikB/wEpAicB/wEpAicB/wEpAicB/wEhAh8B/wE6AjgB/wPfAf8IAAOUAf8BMgIxAf8BLgIs - Af8BMgIwAf8BMgIwAf8BLwItAf8BLwItAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIv - Af8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BMQIvAf8BLwItAf8BLwIt - Af8BMAIuAf8BMAIuAf8BMAIuAf8BKQInAf8BTgJNAf+gAAMuAUgDYAHrAykB/wMaAf8DKgH/AyYB/wMj - Af8DJwH/AzEB/wM5Af8DOwH/AzQB/wMsAf8DIQH/AyYB/wMnAf8DHQH/AyQB/wOKAf8DOgFgAy4BSBgA - A8EB/wE7AjoB/wEmAiQB/wErAikB/wEsAioB/wEsAioB/wEsAioB/wEsAioB/wEsAioB/wEsAioB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wEqAigB/wEtAisB/wEqAigB/wEoAiYB/wEkAiIB/wGbApkB/wP2 - Af8MAAFPAk0B/wExAi8B/wEwAi4B/wExAi8B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEw - Ai4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEwAi4B/wEw - Ai4B/wEtAisB/wEwAi4B/wEwAi4B/wEwAi4B/wEuAiwB/wE5AjcB/wGdApsB/6QAAyYBOAMqAUADXQH/ - Ay4B/wMnAf8DJQH/AyMB/wMjAf8DJQH/AyAB/wMlAf8DJgH/AyIB/wMiAf8DLAH/A2AB/wM2AVgDKgFA - IAAD8QH/A6gB/wE+Aj0B/wEhAiAB/wEmAiUB/wEsAisB/wMrAf8DKgH/ASsCKgH/ASsCKgH/AyoB/wMq - Af8DKgH/AyoB/wMqAf8DKgH/ASoCKQH/ASoCKQH/ASoCKQH/ASoCKQH/ASoCKQH/ASoCKQH/ASoCKQH/ - ASoCKQH/AygB/wEoAicB/wEjAiIB/wMwAf8BiQKIAf8B4wLiAf8UAAFWAlQB/wE7AjkB/wE2AjQB/wEw - Ai4B/wEyAjAB/wExAi8B/wEyAjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEy - AjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEyAjAB/wEzAjEB/wEzAjEB/wEyAjAB/wEzAjEB/wFJ - AkcB/wGXApUB/7AAAygBPAPRAf8DnAH/A18B/wNEAf8DMwH/AzEB/wMuAf8DNQH/Az8B/wNeAf8DkwH/ - A0IBdAMXASADAwEEKAAD8AH/A78B/wNiAf8DOAH/AyEB/wMgAf8DHgH/AxsB/wMfAf8DHgH/Ax4B/wMe - Af8DHgH/Ax4B/wMeAf8DHgH/Ax4B/wMeAf8DHgH/Ax4B/wMeAf8DHgH/Ax4B/wMgAf8DMQH/A1gB/wOq - Af8D5AH/HAABlQKUAf8BZgJlAf8BWwJZAf8BWwJZAf8BWwJaAf8BXAJaAf8BXAJaAf8BXAJaAf8BXAJa - Af8BXAJaAf8BXAJaAf8BXAJaAf8BXAJaAf8BXAJaAf8BXAJaAf8BXAJaAf8BXAJaAf8BXAJaAf8BXAJa - Af8BXgJcAf8BYAJeAf8BgwKBAf8BsgKxAf/AAANHAYAD4QH/A9YB/wPRAf8D1QH/A9YB/wPlAf8DUQGf - QAAD6wH//wAdAAPkAf98AAPkAf//AHkAA7QB/wMwAf8DjAH/A+wB/wwAA98B/wNjAf8DPQH/A7wB/1QA - A7QB/wMwAf8DjAH/A+wB/wwAA98B/wNjAf8DPQH/A7wB/7QAA+8B/wPjAf8D5gH/AeUC5AH/AeUC5AH/ - AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/ - AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/AeUC5AH/A+QB/wHkAuMB/wPh - Af8D8QH/NAADswH/Aw8B/wM5Af8DxAH/DAADsAH/AzMB/wMnAf8DzAH/VAADswH/Aw8B/wM5Af8DxAH/ - DAADsAH/AzMB/wMnAf8DzAH/sAAD8gH/A58B/wNAAf8DQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/ - AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/ - AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/AUQCQgH/A0IB/wNDAf8DNQH/A7wB/zQAA9cB/wM2 - Af8DHQH/A1cB/wOvAf8DwAH/A6cB/wNIAf8DFwH/A1oB/wPwAf9UAAPXAf8DNgH/Ax0B/wNXAf8DrwH/ - A8AB/wOnAf8DSAH/AxcB/wNaAf8D8AH/sAAD8QH/A5AB/wMiAf8DJQH/AScCJQH/AScCJQH/AScCJQH/ - AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/ - AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/AyUB/wMmAf8DBgH/A6kB/zQA - A/MB/wOdAf8DLgH/AyIB/wNTAf8DqAH/AzUB/wMhAf8DQAH/A9AB/1gAA/MB/wOdAf8DLgH/AyIB/wNT - Af8DqAH/AzUB/wMhAf8DQAH/A9AB/7QAA/EB/wOSAf8DJgH/AykB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEqAikB/wEqAikB/wMIAf8DqgH/ - OAAD8wH/A8AB/wNGAf8DYgH/A84B/wNIAf8DjwH/A+QB/2AAA/MB/wPAAf8DRgH/A2IB/wPOAf8DSAH/ - A48B/wPkAf+4AAPxAf8DkgH/AyYB/wMpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8DCAH/A6oB/zwAA+4B/wNTAf8DUwH/ - A5kB/wNAAf8DoQH/A+UB/wP0Af9gAAPuAf8DUwH/A1MB/wOZAf8DQAH/A6EB/wPlAf8D9AH/PAAD3gH/ - A9YB/wPYAf8D2AH/A9oB/wPaAf8D2AH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/ - A9kB/wPZAf8D2QH/A9kB/wPZAf8D2gH/A9oB/wPXAf8D4QH/A1cBuAM8AWYDPAFmCAAD8QH/A5IB/wMm - Af8DKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ - ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ - ASsCKQH/ASsCKQH/ASoCKQH/AwcB/wOpAf80AAPxAf8DzAH/A5EB/wMyAf8DQAH/A0EB/wMsAf8DNwH/ - A1YB/wOHAf8DrAH/A+IB/1AAA/EB/wPMAf8DkQH/AzIB/wNAAf8DQQH/AywB/wM3Af8DVgH/A4cB/wOs - Af8D4gH/MAAD7QH/A4QB/wNEAf8DSgH/A0wB/wNJAf8DSgH/A0oB/wNKAf8DSgH/A0oB/wNKAf8DSgH/ - A0oB/wNKAf8DSgH/A0oB/wNKAf8DSgH/A0oB/wNKAf8DSgH/A0sB/wNKAf8DSAH/A4QB/wNKAYkQAAPx - Af8DkgH/AyYB/wMpAf8BKwIpAf8BWgJZAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKg - Af8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKg - Af8BoQKgAf8BoQKgAf8BKwIpAf8BKgIpAf8DBwH/A6kB/zAAA9oB/wOHAf8DPAH/AyYB/wMmAf8DJwH/ - AycB/wMoAf8DJwH/AyEB/wMXAf8DJgH/A1MB/wOtAf8D6AH/RAAD2gH/A4cB/wM8Af8DJgH/AyYB/wMn - Af8DJwH/AygB/wMnAf8DIQH/AxcB/wMmAf8DUwH/A60B/wPoAf8oAAPsAf8DTwH/Ax0B/wMgAf8DIQH/ - AyEB/wMgAf8DIwH/AyIB/wMjAf8DIwH/AyMB/wMjAf8DIwH/AyMB/wMjAf8DIwH/AyMB/wMjAf8DIwH/ - AyMB/wMiAf8DIgH/AyUB/wMlAf8DUgH/A0oBiRAAA/EB/wOSAf8DJgH/AykB/wErAikB/wGhAqBJ/wEr - AikB/wEqAikB/wMHAf8DqQH/LAABxALDAf8BTQJMAf8BKQIoAf8BJQIjAf8BKQIoAf8BKQIoAf8BKQIo - Af8BKgIpAf8BKQIoAf8BKQInAf8BKgIpAf8BLgItAf8DJwH/AyQB/wMzAf8DhQH/A98B/zwAAcQCwwH/ - AU0CTAH/ASkCKAH/ASUCIwH/ASkCKAH/ASkCKAH/ASkCKAH/ASoCKQH/ASkCKAH/ASkCJwH/ASoCKQH/ - AS4CLQH/AycB/wMkAf8DMwH/A4UB/wPfAf8kAAPtAf8DUQH/AzAB/wOeAf8DsAH/A7AB/wOuAf8DsgH/ - A64B/wOvAf8DrwH/A68B/wOvAf8DrwH/A68B/wOvAf8DrwH/A68B/wOvAf8DrwH/A68B/wOtAf8DrAH/ - A5oB/wMjAf8DVAH/A0oBiRAAA/IB/wGTApEB/wEnAiYB/wEqAikB/wErAikB/wFaAlkB/wGhAqAB/wGh - AqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGh - AqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wErAikB/wEqAikB/wMGAf8DqQH/ - KAABqgKoAf8BNAIyAf8BKQInAf8BKwIpAf8BKgIoAf8BJwIlAf8BKAImAf8BKwIpAf8BKgIoAf8BKgIo - Af8BKwIpAf8BKwIpAf8BKwIqAf8DKQH/AykB/wMoAf8DIwH/A4kB/wP1Af80AAGqAqgB/wE0AjIB/wEp - AicB/wErAikB/wEqAigB/wEnAiUB/wEoAiYB/wErAikB/wEqAigB/wEqAigB/wErAikB/wErAikB/wEr - AioB/wMpAf8DKQH/AygB/wMjAf8DiQH/A/UB/yAAA+0B/wNPAf8DMAH/A98B/wP4Af8D8gH/A/UB/wP0 - Af88AAPXAf8DGQH/A1YB/wNKAYkQAAPyAf8BkwKRAf8BJwIlAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8DBgH/ - A6kB/yAAAfMC8gH/Aa4CrAH/ATICMAH/ASoCKAH/AS4CLAH/ASwCKgH/ASsCKQH/ASoCKAH/ASkCJwH/ - ASoCKAH/AS0CKwH/ASsCKQH/ASoCKAH/AS4CLAH/ASoCKQH/AykB/wMpAf8DKwH/A2cB/wPeAf8wAAHz - AvIB/wGuAqwB/wEyAjAB/wEqAigB/wEuAiwB/wEsAioB/wErAikB/wEqAigB/wEpAicB/wEqAigB/wEt - AisB/wErAikB/wEqAigB/wEuAiwB/wEqAikB/wMpAf8DKQH/AysB/wNnAf8D3gH/JAAD7gH/A08B/wMv - Af8D2wH/A6EB/wMkAf8DHwH/A0cB/zwAA94B/wMZAf8DVQH/A0oBiRAAA/IB/wGTApEB/wEnAiUB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wMGAf8DqQH/IAADygH/AUUCQwH/ASYCJAH/ASoCKAH/ASwCKgH/AS0CKwH/ - ASwCKgH/AS0CKwH/ASoCKAH/ASoCKAH/AS4CLAH/ASwCKgH/ASkCJwH/ASsCKQH/AykB/wMnAf8DIQH/ - A18B/wPfAf80AAPKAf8BRQJDAf8BJgIkAf8BKgIoAf8BLAIqAf8BLQIrAf8BLAIqAf8BLQIrAf8BKgIo - Af8BKgIoAf8BLgIsAf8BLAIqAf8BKQInAf8BKwIpAf8DKQH/AycB/wMhAf8DXwH/A98B/ygAA+4B/wNP - Af8DMgH/A94B/wOgAf8DLAH/AyIB/wNGAf88AAPaAf8DFwH/A1QB/wNKAYkQAAPyAf8BkwKRAf8BJwIl - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8DBgH/A6kB/xwAA+wB/wFaAlkB/wEmAiQB/wErAikB/wErAikB/wEs - AioB/wEqAigB/wErAikB/wEtAisB/wEtAisB/wErAikB/wEsAioB/wEsAioB/wErAikB/wEpAicB/wMm - Af8DJgH/A18B/wPZAf80AAPsAf8BWgJZAf8BJgIkAf8BKwIpAf8BKwIpAf8BLAIqAf8BKgIoAf8BKwIp - Af8BLQIrAf8BLQIrAf8BKwIpAf8BLAIqAf8BLAIqAf8BKwIpAf8BKQInAf8DJgH/AyYB/wNfAf8D2QH/ - LAAD7gH/A08B/wMxAf8D2gH/A6MB/wMwAf8DKQH/A0cB/zwAA9wB/wMZAf8DVAH/A0oBiRAAA/IB/wGT - ApEB/wEnAiUB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wMGAf8DqQH/HAADsgH/AR4CHQH/ASkCJwH/ASsCKQH/ - ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASoCKAH/ASoCKAH/ASoCKAH/ASoCKAH/AS4CLAH/ASsCKQH/ - ASkCJwH/Ax4B/wNhAf8D4AH/OAADsgH/AR4CHQH/ASkCJwH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ - ASsCKQH/ASoCKAH/ASoCKAH/ASoCKAH/ASoCKAH/AS4CLAH/ASsCKQH/ASkCJwH/Ax4B/wNhAf8D4AH/ - MAAD7gH/A08B/wMuAf8D2wH/A6EB/wMtAf8DJAH/A0YB/zwAA9sB/wMVAf8DVwH/A0oBiRAAA/IB/wGT - ApEB/wEnAiUB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wErAikB/wMpAf8DKQH/AwYB/wOpAf8cAAM9Af8BJAIjAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BLAIqAf8BKwIpAf8BLQIrAf8BKAImAf8BLAIqAf8BLAIqAf8BHwId - Af8DSwH/A9wB/zwAAz0B/wEkAiMB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEs - AioB/wErAikB/wEtAisB/wEoAiYB/wEsAioB/wEsAioB/wEfAh0B/wNLAf8D3AH/NAAD7gH/A08B/wMt - Af8D3QH/A6MB/wMtAf8DJgH/A0UB/zwAA9kB/wMWAf8DVgH/A0oBiRAAA/IB/wGTApEB/wEnAiUB/wEr - AikB/wErAikB/wFaAlkB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGh - AqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGhAqAB/wGgAp8B/wOg - Af8DKgH/AyoB/wMHAf8DqgH/GAADwQH/AyEB/wEpAigB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wErAikB/wEsAioB/wEsAioB/wEtAisB/wEsAioB/wEqAigB/wElAiMB/wFTAlEB/wPeAf88AAPB - Af8DIQH/ASkCKAH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASwCKgH/ASwCKgH/ - AS0CKwH/ASwCKgH/ASoCKAH/ASUCIwH/AVMCUQH/A94B/zgAA+4B/wNPAf8DLAH/A9wB/wOiAf8DKQH/ - AycB/wNGAf88AAPaAf8DGwH/A1UB/wNKAYkQAAPyAf8BkwKRAf8BJwIlAf8BKwIpAf8BKwIpAf8BoQKg - Sf8DKgH/AykB/wMGAf8DqQH/GAADlQH/AygB/wMrAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BLAIqAf8BLAIqAf8BLQIrAf8BLAIqAf8BJwIlAf8BKgIoAf8BYgJgAf8B3ALaAf9AAAOVAf8DKAH/ - AysB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEsAioB/wEsAioB/wEtAisB/wEsAioB/wEn - AiUB/wEqAigB/wFiAmAB/wHcAtoB/zwAA+4B/wNPAf8DLQH/A9oB/wOjAf8DKwH/AyQB/wNGAf88AAPZ - Af8DGgH/A1cB/wNKAYkQAAPyAf8BkwKRAf8BJwIlAf8BKwIpAf8BKwIpAf8BWgJZAf8BoQKgAf8BoQKg - Af8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKg - Af8BoAKfAf8BoAKfAf8BoQKgAf8BoQKgAf8BoQKgAf8BoQKgAf8BKgIoAf8BKgIpAf8DBgH/A6cB/xQA - A/UB/wOFAf8DJgH/AyoB/wErAikB/wErAikB/wErAikB/wErAikB/wEsAioB/wEsAioB/wEsAioB/wEr - AikB/wEpAicB/wEqAigB/wFGAkQB/wHPAs4B/0AAA/UB/wOFAf8DJgH/AyoB/wErAikB/wErAikB/wEr - AikB/wErAikB/wEsAioB/wEsAioB/wEsAioB/wErAikB/wEpAicB/wEqAigB/wFGAkQB/wHPAs4B/0AA - A+4B/wNPAf8DMAH/A9sB/wOiAf8DKwH/AykB/wNHAf88AAPZAf8DGQH/A1gB/wNKAYkQAAPyAf8BkwKR - Af8BJwIlAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BLgIsAf8BLAIq - Af8BKwIpAf8BLAIqAf8BKgIoAf8BKwIqAf8DCAH/A6oB/xQAA/AB/wNnAf8DJwH/AykB/wErAikB/wEr - AikB/wErAikB/wEsAioB/wEsAioB/wEsAioB/wEqAigB/wEsAioB/wEnAiUB/wEoAiYB/wE9AjsB/wG0 - ArIB/wH2AvUB/zwAA/AB/wNnAf8DJwH/AykB/wErAikB/wErAikB/wErAikB/wEsAioB/wEsAioB/wEs - AioB/wEqAigB/wEsAioB/wEnAiUB/wEoAiYB/wE9AjsB/wG0ArIB/wH2AvUB/zwAA+4B/wNPAf8DLQH/ - A90B/wOjAf8DKgH/AyYB/wNIAf88AAPZAf8DGwH/A1YB/wNKAYkQAAPyAf8BkwKRAf8BJwIlAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKgIoAf8BKwIpAf8BKQInAf8BKgIoAf8BKwIpAf8BKwIp - Af8BLAIqAf8BKgIoAf8DBwH/A6gB/xQAA/IB/wNkAf8DJAH/AykB/wErAikB/wErAikB/wEsAioB/wEs - AioB/wEsAioB/wEsAioB/wEsAioB/wEhAh8B/wFVAlMB/wGDAoEB/wEkAiIB/wFMAkoB/wHOAswB/wPd - Af84AAPyAf8DZAH/AyQB/wMpAf8BKwIpAf8BKwIpAf8BLAIqAf8BLAIqAf8BLAIqAf8BLAIqAf8BLAIq - Af8BIQIfAf8BVQJTAf8BgwKBAf8BJAIiAf8BTAJKAf8BzgLMAf8D3QH/A+IB/wQAA+0B/wPvAf8D3wH/ - A9oB/yAAA+4B/wNPAf8DKwH/A9oB/wOiAf8DJgH/AyIB/wNCAf88AAPWAf8DGAH/A1YB/wNKAYkQAAPy - Af8BkwKRAf8BJwIlAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKAImAf8BGwIZ - Af8BFQITAf8BEwIRAf8BEQIPAf8BEwIRAf8BEwIRAf8DAAH/A6oB/xQAA/MB/wOEAf8DJQH/AykB/wMm - Af8DKwH/AykB/wMoAf8DJgH/ASYCJQH/AR4CHQH/A1QB/wPfAf8D8QH/A6QB/wOMAf8DiwH/AzkB/wNf - AegDBQEHMAAD8wH/A4QB/wMlAf8DKQH/AyYB/wMrAf8DKQH/AygB/wMmAf8BJgIlAf8BHgIdAf8DVAH/ - A98B/wPxAf8DpAH/A4wB/wOLAf8DOQH/A0MB/wOiAf8D0gH/A74B/wPvAf8DZwH/A+IB/xwAA+4B/wNP - Af8DMgH/A94B/wO3Af8DWQH/A1YB/wOFAf88AAPXAf8DHgH/A1cB/wNKAYkQAAPyAf8BkgKRAf8BJwIl - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BJgIkAf8BUwJSAf8BswKxAf8BygLIAf8BxALC - Af8BxgLEAf8ByALGAf8BxALDAf8DYgH/A74B/xgAA48B/wMlAf8DJwH/AywB/wMpAf8DLAH/AywB/wMk - Af8DJgH/A1QB/wPZAf8IAAP0Af8DpwH/AzAB/wMjAf8DJwH/AywB/wMAAQEwAAOPAf8DJQH/AycB/wMs - Af8DKQH/AywB/wMsAf8DJAH/AyYB/wNUAf8D2QH/CAAD9AH/A6cB/wMwAf8DIwH/AycB/wMsAf8DrwH/ - A50B/wPXAf8DiAH/A5sB/xwAA+4B/wNPAf8DMAH/A9cB/wPsAf8D7gH/A+0B/wPtAf88AAPUAf8DGQH/ - A1UB/wNKAYkQAAPyAf8DkQH/AyUB/wMqAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKgIoAf8BLAIqAf8BKwIpAf8BKgIoAf8BLAIqAf8BKgIoAf8BKAImAf8BNQI0Af8DsgH/ - A/cJ/wP8Af8D8QH/A7sB/wOoAf8D5gH/GAADuQH/AyUB/wMqAf8DKwH/AysB/wMpAf8DKwH/AycB/wNh - Af8D2gH/DAAD9AH/A5cB/wMpAf8DJgH/AyoB/wMuAf8DkAH/MAADuQH/AyUB/wMqAf8DKwH/AysB/wMp - Af8DKwH/AycB/wNhAf8D2gH/DAAD9AH/A5cB/wMpAf8DJgH/AyoB/wMuAf8DkAH/A2QB/wPBAf8DkwH/ - A1AB/wPqAf8YAAPuAf8DUAH/AycB/wNlAf8DiwH/A40B/wONAf8DiwH/A40B/wONAf8DiwH/A4sB/wOL - Af8DigH/A4kB/wOMAf8DiwH/A4oB/wOLAf8DigH/A44B/wOMAf8DigH/A2QB/wMfAf8DWAH/A0oBiRAA - A/IB/wORAf8DJQH/AyoB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wErAikB/wEr - AikB/wEtAisB/wEsAioB/wEqAigB/wEtAisB/wErAikB/wEpAicB/wE7AjoB/wO7Af8D+gX/A/0B/wPz - Af8DswH/A6MB/wPkAf8cAAPqAf8DLQH/AyoB/wMoAf8DKQH/AyYB/wMeAf8DWQH/A9cB/xQAA7sB/wMy - Af8DHwH/Ax8B/wM7Af8DXwHoMAAD6gH/Ay0B/wMqAf8DKAH/AykB/wMmAf8DHgH/A1kB/wPXAf8UAAO7 - Af8DMgH/Ax8B/wMfAf8DOwH/A40B/wNOAf8DyAH/A2IB/wNDAf8D3QH/GAAD7QH/A1oB/wMtAf8DJwH/ - AygB/wMoAf8DJwH/AycB/wMoAf8DKAH/AykB/wMoAf8DKAH/AygB/wMnAf8DKQH/AycB/wMoAf8DKAH/ - AygB/wMpAf8DKAH/AykB/wMrAf8DMgH/A1wB/wNKAYkQAAPyAf8DkQH/AyUB/wMpAf8BKwIpAf8BKwIp - Af8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BKwIpAf8BLAIqAf8BKgIoAf8BKQInAf8BLAIq - Af8BKgIoAf8BKAImAf8BOwI6Af8DugH/A/cB/wP9Af8D9AH/A6wB/wOiAf8D8AH/JAADiQH/AxkB/wMp - Af8DKAH/AyAB/wNNAf8D3QH/HAADCgEOA1kB/wNkAf8DXgHZOAADiQH/AxkB/wMpAf8DKAH/AyAB/wNN - Af8D3QH/GAAD8QH/A7UB/wNZAf8DZAH/A5kB/wNGAf8DWAH/A80B/wM1Af8DSAH/A98B/xgAA/MB/wOu - Af8DmAH/A5gB/wOYAf8DmAH/A5kB/wOZAf8DmQH/A5oB/wOaAf8DmgH/A5oB/wOaAf8DmgH/A5oB/wOa - Af8DmgH/A5oB/wOaAf8DmgH/A5kB/wObAf8DmwH/A5YB/wOxAf8DSgGJEAAD8QH/A5EB/wMlAf8DKQH/ - ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/ASsCKQH/AS0CKwH/ASwCKgH/ - ASsCKQH/AS0CKwH/ASsCKQH/ASkCJwH/ATsCOgH/A7oB/wP5Af8D7QH/A58B/wOqAf8sAAPhAf8DPAH/ - AyMB/wMmAf8DWgH/A98B/2gAA+EB/wM8Af8DIwH/AyYB/wNaAf8D3wH/GAAD5wH/A7sB/wPIAf8DxwH/ - A6QB/wM6Af8DNgH/A7IB/wOTAf8DIwH/A4AB/wPvAf+AAANZAcIDRQF8A0UBfAgAA/EB/wORAf8DJQH/ - AykB/wEsAioB/wEtAisB/wEtAisB/wEtAisB/wEtAisB/wEtAisB/wEtAisB/wEsAioB/wEtAisB/wEs - AioB/wEqAigB/wEtAisB/wErAikB/wEpAicB/wE6AjkB/wO+Af8D5wH/A5MB/wO2Af80AAO0Af8DMgH/ - A1YB/wPbAf9wAAO0Af8DMgH/A1YB/wPbAf8cAAPyAf8D0QH/A44B/wNCAf8DNQH/A2UB/wO6Af8DnQH/ - AzMB/wMnAf8DuQH/mAAD8QH/A5EB/wMlAf8DKQH/ASgCJgH/AScCJQH/AScCJQH/AScCJQH/AScCJQH/ - AScCJQH/AScCJQH/AScCJQH/ASgCJgH/ASgCJgH/ASYCJAH/ASkCJwH/AScCJQH/ASUCIwH/AzoB/wOi - Af8DjwH/A74B/zgAA/AB/wO1Af8D0wH/dAAD8AH/A7UB/wPTAf8gAAPYAf8DvQH/A8gB/wPUAf8DygH/ - A7MB/wOAAf8DLgH/AyUB/wNhAf+cAAPzAf8DpAH/A0sB/wNNAf8DSgH/AUoCSQH/AUoCSQH/AUoCSQH/ - AUoCSQH/AUoCSQH/AUoCSQH/A0oB/wFLAkoB/wFLAkoB/wNKAf8BSwJKAf8BSwJKAf8DSgH/A08B/wNl - Af8DywH/6AAD6wH/A6kB/wOAAf8DUAH/AzoB/wMjAf8DGwH/Az4B/wOLAf8D6AH/oAAD7wH/A+QB/wPm - Af8D5wH/A+cB/wPnAf8D5wH/A+cB/wPnAf8D5wH/A+gB/wPoAf8D6AH/A+gB/wPoAf8D6AH/A+gB/wPn - Af8D7gH/8AAD8wH/A9AB/wOfAf8DhgH/A44B/wOfAf8DxgH/A+0B//8A7QAD9AH/A/IB/wP2Af//AF0A - A/EB/wPwAf//AOkAA+cB/wPLAf8D0wH/A8gB/wOJAf8DhQH/A4sB/wOcAf8DtgH/A9UB/wPvAf9YAAP2 - Af8MAAPjAf8DzQH/A90B/wPsAf/IAAPhAf8DtAH/A90B/4AAA+EB/wOkAf8DWQH/AzIB/wNdAf8DvwH/ - Ay0B/wMSAf8DGQH/AxIB/wMlAf8DPgH/A4EB/wO9Af8D8QH/SAAD6AH/A8AB/wOeAf8D7QH/CAADjAH/ - AzQB/wNBAf8DXwH/A+sB/zwAA7EB/wNVAf8DXwH/A8wB/wwAA4oB/wNdAf8DYQH/A9EB/wgAA+4B/wOP - Af8DWQH/A2IB/wPdAf8MAAPUAf8DYwH/A1gB/wODAf8gAAPgAf8DXwH/AycB/wNeAf8D4QH/OAAD4AH/ - A7sB/wPjAf80AAPAAf8DTQH/AysB/wMjAf8DIwH/AzwB/wPbAf8DvAH/A1gB/wMcAf8DIgH/AycB/wMk - Af8DJgH/AzUB/wOFAf8D1QH/QAADwQH/A1EB/wMvAf8DLwH/A7IB/wP2Af8D3wH/AzcB/wMgAf8DIAH/ - AysB/wPhAf8IAAP1Af8wAAOLAf8DGAH/AyIB/wO2Af8MAANEAf8DHQH/AygB/wO7Af8IAAPlAf8DRwH/ - Ax0B/wMpAf8DyAH/DAADvwH/Ay0B/wMeAf8DOgH/IAADsQH/AywB/wMnAf8DJQH/A2UB/wPtAf8wAAPz - Af8DRAH/AygB/wNbAf8D6gH/KAAD7gH/A4wB/wMrAf8DJQH/AyUB/wMpAf8DKQH/AyoB/wO0Af8D+gH/ - A9oB/wOmAf8DTAH/AyYB/wMmAf8DJgH/AyQB/wMiAf8DOgH/A7oB/zwAA6sB/wMfAf8DJAH/ASUCJAH/ - ARcCFgH/Aw0B/wMTAf8DJgH/AyYB/wMnAf8BKgIpAf8BnwKeAf8B2gLZAf8DvwH/Ax0B/wOIAf8D4wH/ - KAADjAH/Ax8B/wMmAf8DtQH/DAADRAH/AyEB/wMwAf8DwAH/CAAD5gH/A08B/wMkAf8DMwH/A8oB/wwA - A8AB/wMvAf8DJQH/Az8B/yAAA8sB/wNDAf8DJQH/AyQB/wMgAf8DZQH/A+gB/ygAA9AB/wNBAf8DJAH/ - AygB/wMjAf8DtgH/JAAD4wH/A4EB/wMlAf8DJwH/AyYB/wMrAf8DJwH/AyYB/wMkAf8DTgH/A+QB/wP9 - Af8D/gH/A+IB/wOTAf8DSQH/AycB/wMnAf8DKgH/AyIB/wMyAf8DrwH/KAAD9gH/A+oB/wgAA6sB/wEs - AisB/wErAikB/wElAiMB/wErAikB/wEsAioB/wErAikB/wEpAicB/wEpAicB/wErAikB/wEnAiUB/wEd - AhsB/wE+AjwB/wE8AjoB/wMmAf8DJQH/A14B/wPbAf8kAAONAf8DHgH/AyYB/wO2Af8MAANGAf8DJQH/ - AzMB/wO/Af8IAAPkAf8DUQH/AyIB/wMyAf8DygH/DAADwQH/AzAB/wMjAf8DQgH/JAADswH/AzMB/wMl - Af8DJAH/AyoB/wOQAf8kAAPLAf8DTAH/AyMB/wMmAf8DGgH/AzYB/wPUAf8kAAOOAf8DJgH/AyYB/wMo - Af8DJAH/AyUB/wMmAf8DJAH/AyUB/wMsAf8DuAH/A/0B/wP9Bf8D+AH/A88B/wNfAf8DIwH/AygB/wMn - Af8DIgH/AzYB/wPCAf8kAAPCAf8DYgH/A6wB/wOtAf8DRAH/ASkCKAH/ASkCJwH/ASkCJwH/ASoCKAH/ - ASsCKQH/ASkCJwH/ASwCKgH/ASoCKAH/ASsCKQH/ASYCJAH/AScCJQH/ASYCJAH/AScCJQH/AyUB/wMk - Af8DPAH/A9AB/yQAA44B/wMgAf8DJwH/A7UB/wwAA0QB/wMmAf8DMgH/A78B/wgAA+UB/wNMAf8DIwH/ - AzEB/wPKAf8MAAPAAf8DLwH/AycB/wNAAf8kAAP0Af8DqAH/AyIB/wMkAf8DIwH/AygB/wOlAf8cAAPU - Af8DSAH/AyQB/wMjAf8DJgH/AzYB/wO0Af8kAAOyAf8DJwH/AyYB/wMnAf8DJgH/AyQB/wMmAf8DJQH/ - AyYB/wMmAf8DKQH/A6cB/wP7Af8D/gH/A/wB/wP7Af8D/QH/A+EB/wNEAf8DJAH/AyUB/wMnAf8DIwH/ - AzsB/wPiAf8cAAPZAf8DTAH/AyQB/wMrAf8DLQH/AyYB/wEoAiYB/wEoAiYB/wEnAiUB/wEsAioB/wEr - AikB/wEqAigB/wErAikB/wEpAicB/wEpAicB/wElAiMB/wEoAiYB/wEoAiYB/wEnAiUB/wMlAf8DKAH/ - A4gB/wPvAf8kAAOMAf8DHwH/AyUB/wO3Af8MAANHAf8DJQH/AzIB/wPAAf8IAAPmAf8DTwH/AyMB/wMx - Af8DywH/DAADwAH/AzIB/wMkAf8DPwH/LAADlQH/AyYB/wMoAf8DIwH/Ay4B/wO0Af8UAAPaAf8DOgH/ - AyQB/wMnAf8DIwH/AzoB/wPEAf8kAAPqAf8DOQH/AyIB/wMmAf8DKAH/AygB/wMqAf8DJwH/AykB/wMn - Af8DJwH/A0QB/wPdAf8D/gH/A/4B/wP9Af8D/AH/A+8B/wOxAf8DLgH/AyYB/wMnAf8DJAH/AygB/wMj - Af8DmAH/HAADhAH/AxoB/wMoAf8DJwH/AyQB/wMoAf8BKQIoAf8BKQInAf8BLQIrAf8BIwIhAf8BJwIl - Af8BLgIsAf8BKQInAf8BLAIqAf8BKAImAf8BJAIiAf8BKwIpAf8BKAImAf8BKgIoAf8BKQIoAf8DKAH/ - A00B/wPRAf8D8wH/A+oB/xwAA40B/wMeAf8DJgH/A7cB/wgAA+4B/wNEAf8DJQH/AzMB/wO1Af8D8QH/ - BAAD5wH/A1MB/wMjAf8DMQH/A8wB/wwAA8EB/wMwAf8DJQH/A0AB/ywAA/QB/wOPAf8DHAH/AyIB/wMn - Af8DNwH/A7YB/wwAA8UB/wNCAf8DJgH/AyUB/wMgAf8DKwH/A9UB/ygAA6MB/wEmAiUB/wMlAf8DJwH/ - AycB/wMnAf8DKgH/AycB/wEmAiUB/wEmAiUB/wElAiQB/wGDAoIB/wHzAvIB/wH+Av0B/wP9Af8D/AH/ - A9oB/wNfAf8DJwH/AyYB/wMlAf8DJwH/AykB/wMqAf8DKgH/A0QB/wPQAf8YAAG3ArYB/wE5AjgB/wEm - AiUB/wEnAiYB/wMlAf8BJwImAf8BJwImAf8BKAInAf8BLgItAf8BVAJTAf8BmgKZAf8BxgLFAf8BzwLO - Af8BwgLAAf8BlAKSAf8BSgJJAf8BJwImAf8BJgIlAf8BJwImAf8BKAInAf8DKAH/ASUCJAH/AVYCVQH/ - AY0CjAH/A10B/wPfAf8YAAONAf8DHgH/AyYB/wO1Af8EAAPZAf8DiAH/Ay4B/wMiAf8DKwH/A0kB/wOt - Af8EAAPoAf8DUwH/AyQB/wMxAf8DzAH/CAAD3QH/A5wB/wMtAf8DJQH/AzsB/wPRAf8D8QH/KAAD6AH/ - A4EB/wMjAf8DKAH/AyQB/wM3Af8DwgH/BAADwgH/A0QB/wMiAf8DJwH/AycB/wNEAf8DxQH/KAAD4gH/ - AVMCUQH/ASoCKAH/ASgCJgH/ASoCKAH/ASYCJAH/ASkCJwH/ASsCKQH/ASkCJwH/ASkCJwH/ASgCJgH/ - AScCJQH/AV0CWwH/AeQC4wX/A/4B/wP2Af8BugK4Af8BRAJCAf8BJAIiAf8BKAImAf8BKAImAf8BKAIm - Af8DKQH/AygB/wMoAf8DKQH/A58B/xgAAfEC8AH/AYYChAH/ASQCIgH/ASsCKQH/ASkCJwH/ASoCKAH/ - ASUCJAH/AzcB/wOuAf8D6wH/FAAD4QH/A5EB/wMtAf8DJQH/ASsCKQH/ASkCJwH/ASsCKQH/ASUCIwH/ - ASQCIgH/AR8CHQH/AZYClQH/GAADjQH/Ax4B/wMmAf8DtAH/BAADzgH/AzoB/wMlAf8DJgH/AycB/wMZ - Af8DigH/BAAD5wH/A1EB/wMjAf8DMQH/A8sB/wgAA5wB/wMwAf8DKgH/AygB/wMnAf8DUQH/A9IB/ywA - A+MB/wNiAf8DIQH/AykB/wMeAf8DQgH/A6kB/wNGAf8DIgH/AyYB/wMoAf8DTAH/A8gB/ywAA8YB/wE2 - AjUB/wEoAiYB/wEoAiYB/wEpAicB/wEoAiYB/wEpAicB/wEpAicB/wEoAiYB/wEpAicB/wEpAicB/wEm - AiQB/wEtAisB/wGXApUB/wHtAusB/wHlAuMB/wGuAqwB/wEzAjEB/wEkAiIB/wEnAiUB/wEoAiYB/wEq - AigB/wEnAiYB/wMmAf8DJQH/AyYB/wMgAf8DXQH/A+sB/xQAAeUC5AH/AU4CTAH/ASICIAH/ASgCJgH/ - ASoCKAH/AScCJQH/AToCOQH/A7QB/yAAA+4B/wOTAf8DKAH/ASUCIwH/ASYCJAH/ASsCKQH/ASsCKQH/ - ASgCJgH/ASICIAH/AUoCSAH/A+kB/xQAA40B/wMeAf8DJgH/A7YB/wQAA8kB/wMzAf8DIgH/AyYB/wMo - Af8DEgH/A4gB/wQAA+YB/wNOAf8DIQH/AzEB/wPLAf8IAAOOAf8DIAH/AyYB/wMoAf8DJgH/AzsB/wPN - Af8wAAPhAf8DPgH/Ax8B/wMrAf8DJgH/AyoB/wMoAf8DKAH/AyIB/wM7Af8DzgH/MAADrAH/ATICMQH/ - AScCJQH/ASgCJgH/ASgCJgH/ASkCJwH/ASoCKAH/AScCJQH/AScCJQH/ASkCJwH/ASgCJgH/ASQCIgH/ - ATcCNQH/AUQCQgH/AWYCZAH/AVkCVwH/ATMCMQH/ASQCIgH/ASkCJwH/ASoCKAH/ASoCKAH/ASoCKAH/ - AScCJgH/AygB/wMoAf8DJAH/AyAB/wNIAf8D2QH/DAADwgH/A4QB/wFZAlcB/wEoAiYB/wEoAiYB/wEn - AiUB/wEpAicB/wEvAi0B/wGfAp4B/ygAA+gB/wNjAf8BJAIjAf8BKwIpAf8BLAIqAf8BKwIpAf8BJgIk - Af8BKAImAf8BVQJUAf8D4wH/FAADjQH/Ax4B/wMmAf8DtgH/BAAD7QH/A8kB/wM9Af8DJAH/Ay4B/wOb - Af8D1gH/BAAD5gH/A08B/wMlAf8DMgH/A8sB/wgAA5QB/wMeAf8DJwH/AygB/wMjAf8DPQH/A84B/zQA - A9YB/wNBAf8DIwH/AyoB/wMlAf8DIwH/AycB/wNCAf8D3wH/NAADkAH/ASYCJAH/ASgCJgH/ASgCJgH/ - ASgCJgH/ASoCKAH/ASoCKAH/ASYCJAH/ASUCIwH/AScCJQH/ASUCIwH/AUUCQwH/AZ4CnAH/AU0CSwH/ - ASkCJwH/ASsCKQH/ASYCJAH/ASkCJwH/ASkCJwH/ASwCKgH/ASoCKAH/AScCJQH/ASoCKAH/AyoB/wMo - Af8DJwH/AyUB/wMzAf8DxQH/CAAD8gH/A4kB/wMcAf8BJwIlAf8BKQInAf8BJwIlAf8BKQInAf8BJAIi - Af8BQgJAAf8B3ALbAf8sAAPDAf8BNwI1Af8BJwIlAf8BKAImAf8BKQInAf8BIAIeAf8BmgKYAf8B8QLw - Af8YAAONAf8DHgH/AyYB/wO3Af8MAANHAf8DJQH/AzIB/wPAAf8IAAPlAf8DUgH/AyUB/wMwAf8DzAH/ - CAAD9gH/A7gB/wMvAf8DJQH/A0QB/wPxAf88AAOaAf8DJwH/AykB/wMnAf8DJAH/AzEB/wPEAf80AAPz - Af8DgAH/ASACHwH/ASsCKQH/ASkCJwH/AScCJQH/ASoCKAH/ASoCKAH/ASgCJgH/ASQCIgH/ATICMAH/ - AZkCmAH/AZ4CnAH/AYYChAH/ATACLgH/ASkCJwH/ASgCJgH/AScCJQH/ASoCKAH/ASoCKAH/ASgCJgH/ - ASwCKgH/ASkCJwH/ASkCJwH/AyYB/wMlAf8DJwH/AyUB/wMiAf8DtQH/CAAD7gH/A14B/wMiAf8BKQIo - Af8BKAInAf8BKAImAf8BKAImAf8BIwIhAf8BYAJeAf8wAAPjAf8BTAJLAf8BJwIlAf8BKQInAf8BKwIp - Af8BHQIbAf8BrwKuAf8cAAGQAo8B/wEhAh8B/wEnAiYB/wO2Af8MAANFAf8DJAH/AzAB/wPAAf8IAAPm - Af8DUQH/AyQB/wMvAf8DzAH/DAADwQH/AzAB/wMkAf8DQwH/PAADuAH/Az8B/wMoAf8DKQH/AyYB/wMm - Af8DKgH/A4oB/zQAA/IB/wNjAf8BIAIfAf8BKgIoAf8BKgIoAf8BJwIlAf8BKQInAf8BKgIoAf8BKwIp - Af8BJAIiAf8BTwJNAf8D3wH/AZwCmwH/ASACHgH/ATgCNgH/AUgCRgH/AScCJQH/ASYCJAH/ASoCKAH/ - ASgCJgH/ASgCJgH/ASkCJwH/ASoCKAH/ASoCKQH/AycB/wMmAf8DKAH/AyYB/wMfAf8DswH/CAAD6wH/ - A1kB/wMdAf8DKQH/AScCJgH/ASoCKAH/ASgCJgH/ASgCJgH/AZUClAH/NAABXQJbAf8BJgIkAf8BJQIj - Af8BKQInAf8BIgIgAf8DhgH/A+UB/xgAAZACjgH/ASACHgH/ASgCJgH/AbcCtgH/DAADRgH/AyQB/wMw - Af8DwAH/CAAD5gH/A00B/wMjAf8DMQH/A8oB/wwAA8IB/wMwAf8DJAH/A0EB/xgAA+0B/wPMAf8cAANX - Af8DIAH/AykB/wMmAf8DIgH/AyYB/wMoAf8DIAH/A5gB/zAAA/IB/wOFAf8BIwIhAf8BKgIoAf8BKgIo - Af8BKQInAf8BKQInAf8BKQInAf8BLAIqAf8BLQIrAf8BkQKQAf8B7gLtAf8B6ALnAf8BrAKrAf8BvQK8 - Af8ByQLIAf8BhAKDAf8BJAIjAf8BJAIjAf8BKAInAf8DJgH/AScCJgH/ASkCKAH/AyYB/wMnAf8DKgH/ - AygB/wMlAf8DKgH/A78B/wwAA+4B/wPLAf8DLgH/ASYCJQH/ASwCKgH/ASgCJgH/ASkCJwH/AZkCmAH/ - NAABYgJgAf8BJgIkAf8BKQInAf8BKQInAf8BLAIqAf8DHgH/AxsB/wObAf8D9QH/EAABjQKLAf8BIwIh - Af8BKAImAf8DswH/DAADRQH/AyYB/wMxAf8DvwH/CAAD5gH/A08B/wMlAf8DMgH/A8sB/wwAA78B/wMv - Af8DJAH/A0EB/xQAA9YB/wNGAf8DLQH/A74B/xQAA8IB/wMuAf8DIQH/AyEB/wNXAf8DmgH/AzIB/wMl - Af8DKQH/Ax4B/wOcAf8D9AH/LAADlwH/AS0CKwH/ASgCJgH/ASkCJwH/ASkCJwH/ASoCKAH/ASgCJgH/ - ASoCKAH/AUkCRwH/AcsCygH/A/kB/wP+Df8D4gH/A5gB/wNLAf8DLgH/Ay8B/wMnAf8DJgH/AyYB/wMo - Af8DKAH/AyUB/wMhAf8DOQH/A8wB/xQAAUsCSgH/ASQCIwH/ASkCJwH/ASkCJwH/ASMCIQH/AWECXwH/ - MAAD5AH/AU4CTAH/ASgCJgH/ASsCKQH/ASoCKAH/ASoCKAH/ASkCKAH/AycB/wOaAf8D9gH/EAABjgKM - Af8BIgIgAf8BKgIoAf8DtQH/DAADRwH/AyQB/wMxAf8DvwH/CAAD5wH/A1IB/wMjAf8DMQH/A8sB/wwA - A8EB/wMvAf8DJAH/A0EB/xAAA9QB/wNXAf8DIgH/AykB/wNVAf8D4wH/CAAD7wH/A7MB/wM/Af8DIAH/ - AzMB/wNfAf8D2gH/A/MB/wOXAf8DKgH/AyUB/wMoAf8DNQH/A6sB/wPyAf8oAAO5Af8BLwIuAf8BKAIm - Af8BKQInAf8BJwIlAf8BJwIlAf8BJgIkAf8BKwIpAf8BkAKPAf8D/Qn/A/sB/wP8Af8D/gH/A/4B/wP4 - Af8D1wH/A4sB/wNXAf8DKgH/AyUB/wMmAf8DJgH/AyUB/wMkAf8DKwH/A0wB/wPhAf8QAAP2Af8BUAJO - Af8BJAIiAf8BKgIoAf8BKQInAf8BIwIhAf8BRQJDAf8B3wLeAf8sAAPHAf8BNgI0Af8BKQInAf8BJwIl - Af8BKQInAf8BJgIkAf8BIQIfAf8BJwIlAf8DrQH/FAABkgKQAf8BIwIhAf8BKQInAf8DvAH/DAADRgH/ - AyQB/wMxAf8DvwH/BAAD8AH/A74B/wNJAf8DJQH/Ay8B/wOmAf8D6gH/CAADwQH/AzAB/wMkAf8DQQH/ - EAADnAH/AyQB/wMnAf8DKgH/A2AB/wPfAf8D8QH/A9QB/wOIAf8DMgH/AyQB/wM3Af8DtgH/A+sB/wgA - A+YB/wNlAf8DIQH/AygB/wMmAf8DMgH/A1YB/wOWAf8DhAH/A1YB/wNeAf8DyAH/FAAD1gH/AUECPwH/ - ASYCJAH/ASgCJgH/ASkCJwH/ASgCJgH/ASkCJwH/ASYCJAH/AZQCkgH/A/kB/wP9Af8D/gH/A/4B/wP+ - Af8D/gH/A/UB/wPnAf8D/AH/A/gB/wOlAf8DKQH/AzcB/wNRAf8DNAH/AzgB/wM+Af8DJwH/A4sB/wPy - Af8MAAPhAf8DYgH/ASgCJgH/AScCJQH/ASYCJAH/ASgCJgH/ASoCKAH/AS0CKwH/AagCpwH/KAAD8AH/ - A4gB/wEpAigB/wEqAigB/wEoAiYB/wEoAiYB/wEuAiwB/wFfAl0B/wGFAoQB/wPSAf8MAAHoAucB/wE+ - AjwB/wEmAiQB/wEnAiUB/wEnAiUB/wMjAf8DUgH/CAADSwH/AyQB/wMxAf8DvwH/BAADxgH/AyIB/wMq - Af8DJwH/AycB/wMeAf8DmQH/CAADvwH/Ay8B/wMkAf8DQQH/EAAD1AH/A00B/wMdAf8DIQH/AzEB/wNQ - Af8DWwH/AzEB/wMnAf8DJQH/Ax4B/wO/Af8UAAPeAf8DSgH/AyQB/wMoAf8DIQH/AyMB/wMmAf8DIgH/ - AxsB/wMgAf8DNAH/A7cB/xAAA/EB/wGMAooB/wEpAicB/wEqAigB/wEtAisB/wEqAigB/wEnAiUB/wEo - AiYB/wFNAksB/wHdAtwB/wP6Af8D/gH/A/0B/wP9Af8D+gH/A8AB/wOAAf8D8gH/A9EB/wNNAf8DIgH/ - A5kB/wPhAf8DqQH/A70B/wOPAf8DLwH/A7sB/xAAA8sB/wMyAf8BKAImAf8BKQInAf8BKwIpAf8BJwIl - Af8BKAImAf8BKAImAf8BQQJAAf8DxQH/JAADpgH/AywB/wEmAiUB/wEqAigB/wEoAiYB/wElAiMB/wFa - AlgB/xgAAegC5wH/ASwCKgH/ASkCJwH/ASkCJwH/AScCJQH/AyUB/wNUAf8IAANDAf8DIQH/AzAB/wPA - Af8EAAPBAf8DGgH/AyQB/wMoAf8DJAH/AxkB/wOVAf8IAAPBAf8DLwH/AyQB/wNBAf8UAAPVAf8DtQH/ - A4YB/wMdAf8DJQH/AyUB/wMnAf8DJgH/AyQB/wOLAf8cAAPEAf8DKAH/AycB/wMnAf8DJQH/AyoB/wMp - Af8DJgH/AyQB/wMgAf8DQAH/A9kB/xAAAckCxwH/ASYCJAH/ASsCKQH/ASwCKgH/ASkCJwH/ASgCJgH/ - ASgCJgH/AVICUAH/AeIC4QH/A/4J/wP9Af8DzgH/A0wB/wMiAf8DvwH/A5kB/wM/Af8DIwH/A6YB/wPu - Af8D4gH/A+oB/wNVAf8DUwH/A+YB/xAAA+8B/wNhAf8BHgIcAf8BJAIiAf8BKwIpAf8BKQInAf8BJQIj - Af8BKgIoAf8BJwImAf8DPQH/A7oB/wPvAf8UAAPoAf8DoAH/AzAB/wMkAf8BLAIrAf8BKQInAf8BKQIn - Af8BJAIiAf8BoQKfAf8YAAHnAuYB/wErAikB/wEpAicB/wEpAicB/wEpAicB/wMnAf8DVQH/CAADRQH/ - AyQB/wMwAf8DvwH/BAADzgH/AzwB/wMwAf8DJQH/AycB/wMzAf8DqQH/CAADwQH/Ay8B/wMkAf8DQQH/ - HAADnwH/AxoB/wMnAf8DKAH/AycB/wMhAf8DRgH/A9oB/xwAA/AB/wNBAf8DIgH/AygB/wMlAf8DKwH/ - Az0B/wNNAf8DOgH/AyQB/wMsAf8DpwH/FAABgAJlAf8BJAIiAf8BKwIpAf8BJgIkAf8BKAImAf8BKwIp - Af8BhQKEAf8D/AH/A/oB/wP9Af8D/gH/A/4B/wPDAf8DRwH/AzMB/wNEAf8DowH/A1cB/wMjAf8DpAH/ - A/MB/wP3Af8DqQH/Ax0B/wO/Af8YAAPCAf8BTgJNAf8BZAJjAf8DPwH/ASoCKQH/AScCJgH/AycB/wEp - AigB/wEkAiIB/wExAjAB/wGEAoIB/wG2ArUB/wHNAswB/wHXAtYB/wHNAswB/wGxArAB/wFbAloB/wEr - AioB/wElAiQB/wEnAiYB/wElAiQB/wEpAigB/wEoAicB/wElAiQB/wFUAlMB/wPnAf8UAAH1AvQB/wG0 - ArIB/wFXAlUB/wEmAiQB/wEpAicB/wOGAf8DwgH/CAADRQH/AyMB/wMvAf8DvgH/BAAD9QH/A80B/wNN - Af8DJQH/AzIB/wO2Af8D7wH/CAADwAH/AzAB/wMkAf8DQQH/HAADqAH/AxoB/wMnAf8DKAH/AycB/wMj - Af8DXgH/A+kB/xwAA+4B/wNCAf8DJAH/AygB/wMgAf8DRQH/A78B/wPdAf8DxwH/Az4B/wMkAf8DjgH/ - A/MB/xAAA+YB/wNJAf8DKgH/AzAB/wM0Af8DMQH/A2QB/wPWAf8D9gH/A/4B/wP7Af8D9AH/A+wB/wPT - Af8DlwH/A1sB/wOPAf8DNQH/A0IB/wPmAf8D9QH/A7gB/wMvAf8DiQH/HAAD9QH/A+QB/wPtAf8DqAH/ - AykB/wMqAf8DJQH/ASoCKQH/ASoCKAH/ASgCJgH/ASsCKQH/ASwCKgH/ATQCMgH/ATwCOgH/ATYCNAH/ - AS4CLAH/ASMCIQH/ASsCKQH/ASkCJwH/ASkCJwH/AygB/wMmAf8DJQH/AycB/wMYAf8DvgH/HAABkAKO - Af8BIAIeAf8BJgIkAf8BtgK1Af8MAANGAf8DIwH/AzAB/wPAAf8IAAPlAf8DUQH/AyMB/wMzAf8DywH/ - DAADwQH/AzAB/wMkAf8DQQH/HAAD0wH/Az0B/wMeAf8DKgH/AycB/wMoAf8DPAH/A5UB/wPcAf8YAAPX - Af8DLAH/AyYB/wMlAf8DJQH/A9QB/wwAA7QB/wMmAf8DhAH/A+8B/xQAA8YB/wNQAf8DLgH/Ay0B/wMs - Af8DMgH/A1UB/wOgAf8DzAH/A+gB/wPJAf8DkwH/A4gB/wONAf8DnwH/A0gB/wNEAf8DwwH/A9wB/wOb - Af8DQQH/A1oB/wPmAf8oAAPyAf8DQwH/AycB/wMnAf8BKgIpAf8BKAImAf8BJQIjAf8BKAImAf8BKAIm - Af8BLAIqAf8BLAIqAf8BKgIoAf8BJwIlAf8BKwIpAf8BKQInAf8BJgIkAf8BJwIlAf8BIwIiAf8DLgH/ - AycB/wMhAf8DWwH/A+4B/xwAAY8CjQH/ASICIAH/ASoCKAH/A7YB/wwAA0cB/wMmAf8DMgH/A8AB/wgA - A+UB/wNQAf8DIQH/AzEB/wPLAf8MAAPBAf8DLwH/AyQB/wNBAf8gAAPiAf8DZQH/Ay4B/wMhAf8DJQH/ - AygB/wMfAf8DGQH/AzgB/wOJAf8D5AH/DAADwwH/AyQB/wMnAf8DHwH/A8UB/xQAA6QB/wOPAf8D8gH/ - GAAD0wH/A5wB/wNUAf8DQAH/AywB/wMrAf8DMwH/A1IB/wO1Af8DqAH/A08B/wNSAf8DgQH/A4wB/wNd - Af8DjgH/A5sB/wNIAf8DKAH/A2YB/wPbAf8sAAOwAf8DJgH/AyoB/wMoAf8BJwImAf8BKQInAf8BKQIn - Af8BKAImAf8BKAImAf8BKAImAf8BJwIlAf8BJgIkAf8BKQInAf8BKwIpAf8BKgIoAf8BJgIkAf8BKgIo - Af8DPwH/A7YB/wOOAf8DWAH/A9IB/yAAAZACjgH/ASACHgH/AScCJQH/AbYCtQH/DAADRwH/AyYB/wMv - Af8DvwH/CAAD5gH/A1AB/wMhAf8DMQH/A8wB/wwAA8EB/wMxAf8DJAH/A0EB/yQAA+oB/wOvAf8DUgH/ - AzYB/wMjAf8DGgH/AyAB/wMbAf8DCwH/A8UB/wwAA8MB/wMkAf8DJAH/AxwB/wPJAf8UAAPyAf8D6wH/ - IAAD3wH/A5AB/wMqAf8DKQH/AycB/wMmAf8DQgH/A4oB/wNMAf8DOgH/A0IB/wONAf8DqAH/A7AB/wOS - Af8DKQH/AyIB/wOWAf8D5AH/MAADvwH/AzIB/wMhAf8DJwH/ATACLwH/ASUCIwH/ASMCIQH/ASYCJAH/ - ASkCJwH/ASUCIwH/AScCJQH/ASgCJgH/ASgCJgH/ASoCKAH/ASgCJgH/ASMCIQH/AUMCQQH/A8QB/wQA - A/AB/wPmAf8kAAGPAo0B/wEiAiAB/wEoAiYB/wG4ArcB/wwAA0UB/wMlAf8DLgH/A8AB/wgAA+cB/wNR - Af8DJAH/AzMB/wPLAf8MAAPCAf8DMAH/AyQB/wNBAf8sAAPiAf8DvgH/A5wB/wOCAf8DVwH/A00B/wOA - Af8D6QH/DAADywH/AykB/wMmAf8DHQH/A50B/0AAA+8B/wOkAf8DKgH/AyEB/wMmAf8DKAH/AzEB/wMx - Af8DLgH/AygB/wNFAf8DPwH/AzEB/wMSAf8DSQH/A9AB/zwAA8wB/wNDAf8DSgH/A8YB/wHEAsIB/wFW - AlQB/wElAiMB/wErAikB/wEpAicB/wElAiMB/wEkAiIB/wEyAjAB/wEkAiIB/wEoAiYB/wEoAiYB/wE3 - AjUB/wPOAf8wAAOQAf8BIQIgAf8BKAInAf8DtgH/DAADSAH/AyUB/wMxAf8DwQH/CAAD5QH/A1AB/wMl - Af8DNAH/A8wB/wwAA8IB/wMyAf8DJwH/A0EB/zgAA/MB/wPqAf8D5QH/A+4B/xAAA+wB/wM8Af8DJAH/ - AykB/wMhAf8DnQH/A/EB/0AAA+8B/wOzAf8DhwH/A1QB/wNAAf8DOQH/AzcB/wM5Af8DQAH/A1oB/wOR - Af8DzgH/SAAD6gH/A+QB/wgAAb8CvQH/ARACDgH/ASkCKAH/AScCJQH/AV8CXgH/AcgCxgH/AdgC1gH/ - AYMCggH/AR4CHQH/ASwCKgH/AVgCVwH/A9sB/zAAA4wB/wMXAf8DIQH/A7QB/wwAA0AB/wMfAf8DLAH/ - A74B/wgAA+kB/wNNAf8DHAH/AywB/wPHAf8MAAPBAf8DKwH/AxsB/wM5Af9cAAOzAf8DLQH/AyAB/wMb - Af8DHAH/A1wB/wPeAf9IAAPjAf8D0QH/A8oB/wPFAf8DzAH/A9YB/wPqAf9gAAPMAf8DNgH/AzsB/wMq - Af8DqAH/CAAD1QH/A2AB/wO4Af8D6QH/NAADpQH/A0MB/wNMAf8DxQH/DAADZgH/A0kB/wNVAf8DzgH/ - CAAD7QH/A4UB/wNJAf8DUgH/A9YB/wwAA88B/wNWAf8DSgH/A1sB/2AAA74B/wNmAf8DTwH/A1cB/wOO - Af8D2wH/xAAD9gH/A9oB/wPJAf8DvwH/A+QB/0wAA+4B/wPpAf8D6QH/A/UB/wwAA+0B/wPmAf8D6gH/ - EAAD7gH/A+kB/wPtAf8QAAP2Af8D7QH/A+wB/wPrAf9oAAP2Af//AP8AIgABTwHKAf4B/wFPAcoB/gH/ - AVABywL/AU8BygH+Af8BTwHKAf4B/wFOAcoB/gH/AUEBrAHfAf8BQAGpAdoB/wFOAcUB+AH/AVABzAH+ - Af8BUQHLAv8BUQHMAv8BUQHMAf4B/wFKAbsB7gH/ATcBlgHHAf8BNQGOAb4B/wE3AZIBwQH/AT0BngHQ - Af8BTAHBAfMB/wE/AacB0gH/ASABRwGDAf8BNAGOAboB/wFQAcwB/gH/AVABywH+Af8BUQHMAv8BUAHM - Af4B/wFQAc0B/gH/AVABzAL/AVABzAH9Af8BTwHMAf0B/wFPAcwB/gH/AU4BywH+Af//AIEAAT0BwgH+ - Af8BPAHCAf4B/wE8AcIB/gH/ATwBwgH+Af8BPAHCAf4B/wEuAZ8B2wH/AgABIAH/AgABGwH/ARUBSQGX - Af8BPgHEAf4B/wE+AcUB/gH/AT4BxQH+Af8BMwGqAeMB/wIAASsB/wIAAS0B/wEBARQBRQH/AQABEQFB - Af8CAAEdAf8BBQElAVYB/wEvAaQB1wH/ARYBUQGWAf8BCQE3AWIB/wE9AcQB/gH/AT4BxgH+Af8BPgHF - Af4B/wE9AcQB/gH/AT0BxAH9Af8BPQHFAf4B/wE8AcQB/QH/ATwBxAH9Af8BOgHDAf0B/wE6AcMB/gH/ - pAAD5gH/A+UB/wPmAf8D5wH/A+cB/wPmAf8D5QH/A+QB/wPmAf8D5gH/A+cB/wPoAf8D5gH/A+4B/6QA - AToBwAH+Af8BOgG/Af4B/wE6Ab8B/gH/ATkBvwH+Af8BOQG+Af0B/wEEASABUgH/AQABBQExAf8BDwE3 - AYcB/wIAASEB/wEzAawB6AH/ATwBwgH9Af8BPAHCAf4B/wEiAYIBuwH/AgABGAH/ASwBnAHVAf8BOgHB - Af0B/wE7AcEB/gH/AQ8BNQGCAf8CAAEjAf8BMQGpAeAB/wEdAWMBrAH/AQABFwE9Af8BOgHBAfwB/wE7 - AcMB/QH/ATsBwwH9Af8BPAHCAf4B/wE6AcIB/QH/AToBwwH9Af8BOgHDAf4B/wE5AcIB/gH/ATgBwQH9 - Af8BNwHBAf0B/6AAA5MB/wM6Af8DQgH/A0MB/wNHAf8DSQH/A0sB/wNMAf8DSwH/A0kB/wNIAf8DRgH/ - A0YB/wNAAf8DZAH/A+oB/0AAA+EB/wPUAf8D9AH/LAAB2ALXAf8B3gLdAf8gAAE2Ab0B/gH/ATcBvQH+ - Af8BOQG+Af4B/wE3Ab4B/QH/ASQBjgHLAf8CAAETAf8BHAFbAa4B/wEzAbAB7gH/AgABJAH/AQ0BNgGC - Af8BOQG/Af0B/wE6AcAB/gH/AR8BYwG3Af8CAAEUAf8BMAGnAeMB/wE6Ab8B/gH/AToBvwH+Af8BEAE6 - AYYB/wIAAR8B/wExAawB5gH/ASEBigG7Af8BAAEbAT8B/wErAaEB2wH/ATgBwQH+Af8BOQHCAf4B/wE5 - AcEB/gH/ATgBvwH+Af8BOAHAAf4B/wE2Ab8B/gH/ATUBvgH9Af8BNAG+Af0B/wE0Ab0B/QH/oAADiwH/ - AysB/wMzAf8DMAH/AysB/wMgAf8DIQH/Ax4B/wMkAf8DHwH/AycB/wMyAf8DMgH/AzAB/wNcAf8D6QH/ - PAABwwLCAf8DRgH/A0gB/wPVAf8oAAHgAt4B/wFPAk0B/wE4AjYB/wGlAqMB/wHlAuQB/xgAATUBuwH+ - Af8BNQG7Af4B/wE1AbsB/gH/ATYBuQH8Af8BAAEYAUEB/wEAAQkBMAH/ATUBuAH5Af8BNQG8Af4B/wEV - AUwBngH/AgABFgH/ASwBngHaAf8BNgG9Af0B/wEdAWABtgH/AgABEgH/ASwBowHhAf8BNwG9Af4B/wE2 - Ab0B/gH/AQ4BOAGDAf8CAAEfAf8BMAGuAewB/wElAZIByAH/AQkBNQFfAf8BFAFRAZ4B/wE0Ab0B/QH/ - ATUBvgH+Af8BNgG+Af0B/wE2Ab0B/QH/ATUBvAH9Af8BNAG9Af4B/wE0Ab0B/gH/ATMBvAH+Af8BMgG7 - Af4B/6QAA+UB/wPlAf8D5QH/A6IB/wMZAf8DJgH/AyQB/wMlAf8DJgH/A4UB/wPeAf8D5QH/A+UB/wPv - Af84AAHoAucB/wGLAokB/wEmAiQB/wMlAf8DJAH/A5EB/wP0Af8gAAP0Af8BngKcAf8BLQIrAf8BJwIl - Af8BIQIfAf8BRgJEAf8BxgLEAf8UAAEzAbcB/gH/ATMBuAH+Af8BMwG4Av8BKgGgAeMB/wEIASkBWAH/ - ASABhwHCAf8BNAG6Af4B/wE0AboC/wEyAbIB9gH/AQsBNgGCAf8BHgFjAbcB/wE2AboB/gH/ASgBlwHX - Af8BDgE6AYgB/wExAa4B8AH/ATUBuwH+Af8BNQG6Af4B/wEhAYEBvAH/ARMBRwGYAf8BLwGwAfIB/wEm - AZcB0wH/ARQBUAGbAf8BAgEkAUsB/wEyAboB/gH/ATIBuwH+Af8BMgG7Af4B/wEyAbsB/gH/ATIBugH9 - Af8BMgG6Af4B/wEyAboB/gH/ATIBugH+Af8BMQG5Af4B/7AAA68B/wMSAf8DJgH/AyYB/wMpAf8DJwH/ - A44B/wPzAf9AAAHpAucB/wGBAmUB/wEfAh0B/wEmAiQB/wMlAf8DJAH/Ay4B/wPSAf8gAAHUAtMB/wE7 - AjkB/wEkAiIB/wEoAiYB/wEnAiUB/wEhAh8B/wE8AjoB/wPEAf8QAAExAbUB/gH/ATEBtQH+Af8BMQG1 - Af4B/wExAbUB/gH/ATEBtQH+Af8BMgG2Af4B/wEyAbcC/wEzAbgC/wEzAbgC/wEzAbgC/wEzAbgB/gH/ - ATMBuAH+Af8BMwG3Av8BMwG4Av8BMwG4Av8BMwG5Af4B/wEzAbgC/wEzAbgC/wEzAbcC/wEvAbEB9wH/ - AScBmwHbAf8BGAFcAawB/wEAAQ0BMQH/AS4BsQH3Af8BMAG4Af4B/wExAbgB/gH/ATEBuAH+Af8BMQG4 - Af4B/wEwAbcB/gH/ATEBuAL/ATABtwH+Af8BMAG3Af4B/wwAA/IB/wPTAf8DxgH/A9YB/wPvAf9AAAPx - Af8D1wH/A8gB/wPUAf8D8wH/PAADrAH/AxUB/wMlAf8DJwH/AygB/wMlAf8DjAH/A/MB/0AAAZwCmgH/ - ASoCKAH/ASQCIgH/AScCJQH/AyQB/wMnAf8DHAH/A4gB/yAAA4UB/wEgAh4B/wEpAicB/wEnAiUB/wEn - AiUB/wEnAiUB/wEjAiEB/wNBAf8D6QH/DAABLwGyAf4B/wEvAbIB/gH/AS8BswH+Af8BLwGzAf0B/wEw - AbQB/gH/ATEBtQH+Af8BMQG1Af4B/wExAbUB/gH/ATEBtQH+Af8BMgG2Av8BMgG2Af4B/wExAbUB/gH/ - ATEBtQH+Af8BMQG1Af4B/wExAbUB/gH/ATEBtQH+Af8BMQG1Af4B/wExAbUB/gH/ATEBtQH+Af8BLwGx - AfkB/wEnAZ4B4gH/ARsBgAG7Af8BAAEdAUIB/wEeAYkBygH/AS8BtgH9Af8BLwG2Af4B/wEvAbYB/gH/ - AS8BtgH+Af8BLwG2Af4B/wEvAbYB/gH/AS8BtgH+Af8BLgG1Af4B/wgAA+0B/wOYAf8DMAH/Ax0B/wM3 - Af8DjwH/A9gB/zgAA94B/wORAf8DOgH/AyAB/wMyAf8DmwH/A+oB/zgAA7EB/wMVAf8DKAH/AyYB/wMl - Af8DIAH/A4sB/wPzAf88AAHWAtQB/wEmAiQB/wEoAiYB/wEoAiYB/wEmAiQB/wMlAf8DIwH/AyQB/wMs - Af8D4QH/GAAD4AH/AxoB/wEiAiAB/wEoAiYB/wEpAicB/wEoAiYB/wEnAiYB/wEmAiUB/wMdAf8DhgH/ - DAABLAGuAf0B/wEsAa8B/QH/AS0BrwH9Af8BLQGwAf4B/wEuAbAB/gH/AS8BsgH9Af8BLwGzAf0B/wEv - AbMB/QH/AS8BswH9Af8BLwGzAf0B/wEwAbQB/QH/AS8BswH9Af8BLwGzAf0B/wEvAbMB/QH/AS8BswH9 - Af8BLwGzAf0B/wEwAbQB/QH/AS8BswH9Af8BLwGzAf0B/wEvAbAB+gH/AScBnwHmAf8BHAGHAcYB/wEI - ATgBgQH/AQoBPQGNAf8BLAGyAf0B/wEtAbIB/gH/AS0BsgH9Af8BLQGyAf0B/wEtAbIB/gH/ASwBsQH+ - Af8BLAGxAf4B/wEsAbEB/gH/BAAD9QH/A6kB/wEsAisB/wEjAiIB/wEmAiUB/wEiAiEB/wEkAiMB/wFU - AlMB/wHgAt8B/zAAA+QB/wFfAl0B/wEoAicB/wEhAiAB/wElAiQB/wEjAiEB/wErAioB/wGfAp4B/yAA - A/MB/wPzAf8D8QH/A/AB/wPxAf8D8AH/A6QB/wMYAf8DIwH/AyMB/wMiAf8DIgH/A4UB/wPhAf8D7wH/ - A/AB/wPyAf8D8wH/A/MB/yQAA/MB/wFDAkIB/wEhAh8B/wEpAicB/wEpAicB/wEmAiQB/wMoAf8DJAH/ - AyUB/wMhAf8DjQH/FAAD7wH/A10B/wEmAiUB/wEoAiYB/wEqAigB/wEmAiQB/wEqAigB/wEoAicB/wMm - Af8DJgH/AyoB/wPLAf8IAAEqAasB/QH/ASsBrAH9Af8BKwGsAf0B/wErAa0B/QH/ASsBrQH9Af8BLAGu - Af0B/wEsAa4B/QH/ASwBrwH9Af8BLAGvAf0B/wEtAa8B/QH/AS0BsAH9Af8BLQGwAf0B/wEtAbAB/QH/ - AS0BsAH9Af8BLQGwAf0B/wEtAbAB/QH/AS0BsAH9Af8BLgGxAf0B/wEtAbAB/gH/ASwBrQH8Af8BJgGg - AesB/wEdAYsBzgH/AQ8BSwGcAf8BAAEZAUQB/wEqAa0B/AH/ASoBrgH9Af8BKwGvAf4B/wErAa8B/gH/ - ASoBrgH+Af8BKgGuAf0B/wEqAa4B/QH/ASoBrgH+Af8EAAPhAf8DVAH/ASYCJQH/ASYCJAH/ASoCKAH/ - ASgCJgH/ASQCIgH/ASQCIgH/AWECXwH/A+8B/ygAA/EB/wOAAf8BKQInAf8BKgIoAf8BKwIpAf8BJwIl - Af8BJgIkAf8BIwIhAf8BRwJGAf8D2QH/CAAD2gH/A8MB/wO5Af8DrQH/A6MB/wOWAf8DjgH/A4gB/wOT - Af8BkAKPAf8BlAKTAf8DQwH/AysB/wE3AjYB/wE8AjsB/wE1AjQB/wEqAikB/wFBAkAB/wGJAogB/wGB - AoAB/wGVApQB/wGIAocB/wOHAf8DjgH/A5cB/wOiAf8DrQH/A7kB/wPPAf8QAAO5Af8BJgIkAf8BJwIl - Af8BKQInAf8BJwIlAf8BJwIlAf8DJQH/AygB/wMnAf8DJAH/AzoB/wPQAf8QAAO9Af8DMQH/AScCJgH/ - ASgCJgH/ASgCJgH/ASgCJgH/ASgCJgH/AScCJgH/AyYB/wMkAf8DKQH/A5gB/wgAAScBqQH7Af8BKAGp - AfwB/wEoAakB/AH/ASkBqgH8Af8BKgGqAfwB/wEpAaoB/AH/ASoBqwH9Af8BKgGrAf0B/wEqAasB/QH/ - ASoBqwH9Af8BKwGsAf0B/wErAawB/QH/ASsBrQH8Af8BKwGsAf0B/wErAawB/QH/ASoBrAH9Af8BKwGs - Af0B/wErAawB/QH/ASsBrAH+Af8BKgGrAfwB/wElAaAB7gH/AR4BjgHWAf8BEQFUAasB/wEAAQwBLwH/ - ASQBnQHtAf8BJwGsAfwB/wEoAawB/QH/ASkBrQH9Af8BKAGsAf4B/wEoAawB/QH/ASgBqwH9Af8BKAGr - Af0B/wQAA8AB/wMxAf8BIwIiAf8BKQInAf8BJQIjAf8BKAImAf8BKQInAf8BLgIsAf8BKAImAf8DnAH/ - A/UB/yQAA6AB/wMlAf8BJwIlAf8BKQInAf8BJgIkAf8BJwIlAf8BJgIkAf8BJwIlAf8BKAInAf8DuAH/ - BAAD7QH/A4EB/wMzAf8DMgH/AzEB/wMsAf8DJAH/AyEB/wMlAf8DmQH/AYUChAH/AasCqQH/AScCJQH/ - AZsCmQH/AcoCyAH/AdMC0gH/AcMCwQH/AYQCggH/AUICQAH/AasCqQH/AT4CPAH/AaQCogH/AS8CLQH/ - AR0CHAH/AyQB/wMlAf8DKQH/Ay0B/wMwAf8DWQH/A+UB/wgAA/YB/wGKAokB/wEnAiUB/wEoAiYB/wEq - AigB/wEqAigB/wEoAiYB/wMmAf8DKgH/AygB/wMmAf8DIgH/A4kB/wPzAf8IAAPnAf8DXAH/AyMB/wMm - Af8BKQInAf8BKQInAf8BKQInAf8BKQInAf8BKAInAf8BKAInAf8DJQH/AyYB/wNcAf8D5wH/BAABJQGl - AfgB/wEkAaYB+QH/ASYBpgH5Af8BJQGmAfoB/wEmAacB+gH/AScBqAH7Af8BJwGoAfoB/wEnAagB+gH/ - ASgBqQH7Af8BKAGpAfsB/wEoAakB+wH/ASgBqQH7Af8BKAGpAfsB/wEoAakB+wH/ASgBqQH8Af8BKAGp - AfsB/wEoAakB+wH/ASgBqQH8Af8BKAGpAfwB/wEoAakB+wH/ASUBoAHxAf8BHgGPAdoB/wEUAVoBtwH/ - AQABHwFHAf8BEgFVAbIB/wElAaYB+gH/ASUBpwH6Af8BJgGnAfoB/wEmAagB+wH/AScBqAH8Af8BJwGo - AfsB/wEnAagB+wH/BAADpgH/AyYB/wEkAiMB/wEnAiUB/wEpAicB/wEqAigB/wEoAiYB/wEnAiUB/wEp - AigB/wM+Af8DyQH/A/QB/wP0Af8D8wH/A/UB/wP0Af8D8wH/A/QB/wPzAf8D0gH/AzoB/wMfAf8BKAIm - Af8BJgIkAf8BIwIhAf8BKwIpAf8BKgIoAf8BJwIlAf8BJAIjAf8DoQH/BAAD6wH/A1MB/wMdAf8DJQH/ - AyQB/wMjAf8DJgH/AyMB/wMlAf8DPgH/ATsCOQH/AUMCQQH/ASECHwH/ATcCNQH/AVECTwH/AVcCVQH/ - AU0CSwH/ATECLwH/ATACLgH/AUgCRgH/ASsCKQH/AUcCRQH/ASwCKgH/ASICIQH/AyYB/wMkAf8DJwH/ - AycB/wMhAf8DTAH/A94B/wgAAeIC4QH/AVMCUQH/AScCJQH/ASYCJAH/ASkCJwH/ASkCJwH/ASkCJwH/ - AycB/wMmAf8DKQH/AyYB/wMiAf8DMgH/A8YB/wgAA6wB/wMsAf8DJwH/ASYCJQH/AScCJQH/AScCJQH/ - AScCJQH/AScCJQH/AScCJQH/AScCJQH/AygB/wMjAf8DSAH/A9sB/wQAAQsBQQGaAf8BDQFHAaEB/wEf - AZMB5AH/AQwBQQGaAf8BDAFEAZsB/wEdAZAB3QH/ASUBpQH5Af8BJQGmAfkB/wElAaYB+QH/ASUBpgH5 - Af8BGgGFAdAB/wElAaYB+QH/ASUBogH1Af8BEQFTAbIB/wEQAVEBrQH/ASEBmAHnAf8BJQGmAfoB/wEm - AacB+gH/ASYBpwH6Af8BJQGnAfkB/wEjAaAB8gH/AREBUAGvAf8BDgFIAZ8B/wEAAQ8BNAH/AQABCQEx - Af8BEgFNAacB/wEHATEBgwH/AQ4BSQGkAf8BDwFJAaEB/wElAaUB+QH/ASQBpQH6Af8BJAGlAfoB/wQA - A5oB/wMfAf8BJgIkAf8BKQInAf8BJwIlAf8BKQInAf8BJQIjAf8BIwIhAf8BJAIiAf8DKAH/A1kB/wOT - Af8DkwH/A5EB/wOUAf8DkwH/A5MB/wOUAf8DlQH/A1sB/wMsAf8DJQH/ASkCJwH/ASgCJgH/ASYCJAH/ - ASkCJwH/ASgCJgH/ASkCJwH/ASQCIwH/A4wB/wQAA+sB/wNVAf8DDwH/A5YB/wPPAf8DywH/A8oB/wPO - Af8DywH/A8sB/wHQAs8B/wHNAssB/wHNAssB/wHNAssB/wHLAskB/wHMAssB/wHNAssB/wHPAs0B/wHN - AssB/wHLAskB/wHQAs4B/wHKAsgB/wHNAssB/wPLAf8DzQH/A84B/wPMAf8DnwH/Ax0B/wNOAf8D4AH/ - CAAB1ALTAf8BQwJBAf8BJgIkAf8BJwIlAf8BKgIoAf8BKAImAf8BJgIkAf8DJAH/AyMB/wMjAf8DJwH/ - AyUB/wMVAf8DhgH/A/IB/wPtAf8DYAH/AxkB/wMnAf8DIgH/ASgCJgH/ASgCJgH/ASgCJgH/ASgCJgH/ - ASgCJgH/ASgCJgH/AyYB/wMjAf8DPwH/A8wB/wQAARcBYwHHAf8BBgEwAYAB/wEKAT0BlQH/ARkBhgHS - Af8BIAGZAewB/wELAUEBmgH/ASMBoQH1Af8BIwGiAfYB/wEjAaIB9gH/ASIBogH1Af8BFAFbAb0B/wES - AVQBsQH/ARYBXQHBAf8BGQGAAckB/wEkAZgB6QH/AQsBQwGbAf8BJQGjAfcB/wEkAaMB+AH/ASQBowH3 - Af8BJAGjAfcB/wEaAYYB1AH/AQsBPAGTAf8BCAE7AZAB/wECAS0BXQH/AQABCQEwAf8BCQEwAYEB/wEQ - AU8BqwH/ASEBoAH3Af8BDgFGAZ8B/wEiAaEB+AH/ASMBogH4Af8BIwGjAfkB/wP1Af8DkgH/Ax0B/wMn - Af8BJQIkAf8BJgIkAf8BJgIkAf8BOAI2Af8BRgJEAf8BOgI4Af8BJgIlAf8BIgIhAf8BIQIgAf8BIAIf - Af8BIQIgAf8BHgIdAf8BIAIfAf8BHwIeAf8BHwIeAf8BIwIiAf8BIgIhAf8BJgIlAf8BKAInAf8BJgIk - Af8BKQInAf8BKAImAf8BKQInAf8BKgIoAf8BKQIoAf8DJAH/A4gB/wQAA+sB/wNYAf8DCgH/A7YB/wP9 - Af8D/Rb/Av4B/wH+AvwC/wL+Av8C/gL/Av0G/wL+Av8C/QH/Af4C/QL/Av4C/wL+Av8C/gH/A/4B/wP+ - Af8D/gH/A/4B/wPCAf8DGAH/A00B/wPgAf8IAAPSAf8BQQI/Af8BJgIkAf8BKwIpAf8BJwIlAf8BJwIl - Af8BJgIkAf8DJQH/AyUB/wMmAf8DKAH/AyYB/wNZAf8DvgH/A5oB/wOYAf8DxQH/A2QB/wMlAf8BKAIn - Af8BKQInAf8BKQInAf8BKQInAf8BKQInAf8BKQInAf8BKQInAf8DJgH/AyUB/wM7Af8DygH/BQABFQFA - Af8BAAEmAVwB/wEQAVUBtwH/AQMBNAGJAf8BBwE8AZcB/wEPAU4BrQH/ASABnwH0Af8BIgGfAfUB/wEh - AaAB9QH/AR4BlQHpAf8BFAFdAcEB/wECAScBXAH/AQ8BSwGpAf8BDgFIAaAB/wETAVgBugH/AQwBSAGk - Af8BIgGgAfYB/wEjAaEB9wH/ASMBoQH1Af8BIQGhAfUB/wEgAZoB7gH/AQQBMgGGAf8BEwFYAbgB/wEA - AR4BSwH/AgABHgH/AQ4BTQGtAf8BCgFEAZ8B/wEPAUoBpwH/ARIBXQHAAf8BIgGgAfUB/wEiAaAB9gH/ - ASIBoAH2Af8EAAOZAf8DHwH/AycB/wMmAf8BKQInAf8BiAKGAf8BxwLFAf8B2ALWAf8BzALKAf8BjQKL - Af8BMwIxAf8BKAImAf8BKgIoAf8BKgIoAf8BKAImAf8BKAImAf8BJwIlAf8BKAImAf8BKgIoAf8BKQIn - Af8BJAIiAf8BHgIcAf8BIgIgAf8BKgIoAf8BKgIoAf8BKgIoAf8BKwIpAf8DKAH/AyMB/wOTAf8EAAPr - Af8DVwH/AwoB/wOzAf8D/gH/A/4N/wP+Bv8C/gX/A/4B/wH+Av0C/wL+Bv8C/QL/Av4B/wH+Av0K/wL+ - Af8D/gH/A/4B/wP+Af8D/gH/A8MB/wMaAf8DTwH/A+AB/wgAAdUC1AH/ATwCOgH/ARoCGAH/AR0CGwH/ - AR4CHAH/ARsCGQH/ARwCGgH/AxgB/wMaAf8DHAH/Ax0B/wMjAf8DtgH/A2QB/wMSAf8DFAH/A4EB/wO9 - Af8DMgH/AxkB/wEcAhoB/wEcAhoB/wEcAhoB/wEcAhoB/wEcAhoB/wEcAhoB/wEaAhkB/wMVAf8DNgH/ - A9AB/wQAARkBkgHlAf8BGQGOAeEB/wEUAWIBxwH/ARwBlAHqAf8BHAGUAegB/wEeAZsB8gH/AR8BnAHy - Af8BHwGdAfMB/wEfAZ0B8wH/AR4BlwHsAf8BGQGHAdQB/wEYAYYB1AH/AR0BlwHsAf8BGgGJAdgB/wEa - AYYB1QH/AR8BnQHxAf8BIAGfAfQB/wEhAZ8B9QH/ASEBnwH1Af8BIAGeAfQB/wEfAZwB8gH/ARsBkgHk - Af8BFwGDAc8B/wELAVABrgH/AQABCgEvAf8BBQE9AZcB/wEdAZsB8gH/AR8BnAHzAf8BIAGcAfQB/wEg - AZwB9AH/AR8BnAH0Af8BHwGdAfQB/wQAA6UB/wMkAf8DJwH/AyMB/wGOAowB/wHlAuMB/wG4ArYB/wGK - AogB/wGvAq0B/wHpAucB/wGXApUB/wEqAigB/wErAikB/wEmAiQB/wEmAiQB/wEoAiYB/wEnAiUB/wEo - AiYB/wEuAiwB/wEnAiUB/wE6AjgB/wFfAl0B/wFIAkYB/wElAiMB/wEmAiQB/wEmAiQB/wEmAiQB/wMq - Af8DJwH/A6QB/wQAA+oB/wNVAf8DBwH/A68B/wP+Af8D/gH/A/0O/wL+Av8C/gL/Av4C/wL+Av8C/gL/ - Av4G/wL+Av8C/gL/Av4C/wL+Ef8D/QH/A/4B/wPEAf8DFQH/A00B/wPfAf8IAAPrAf8DvwH/AbQCswH/ - A7MB/wO0Af8DtAH/AbQCswH/A7QB/wOxAf8DrwH/A68B/wO6Af8D0AH/A0IB/wMfAf8DJQH/A0MB/wPN - Af8DvwH/A7YB/wGzArIB/wGzArIB/wGzArIB/wGzArIB/wGzArIB/wOzAf8DsgH/A7EB/wPBAf8D7AH/ - BAABGwGZAe8B/wEHAT4BlgH/AwAB/wEXAYkB2AH/ARwBmwHxAf8BHQGbAfEB/wEcAZoB8AH/AR0BmwHx - Af8BHQGbAfEB/wEeAZwB8gH/AR0BmwHxAf8BEwFgAcUB/wEAAQkBLQH/ARoBjwHhAf8BHgGcAfIB/wEe - AZwB8gH/AR4BnAHyAf8BHgGcAfIB/wEfAZ0B8wH/AR4BnAHxAf8BHQGaAfEB/wEaAZIB5gH/ARYBhQHT - Af8BDQFSAbIB/wIAAQgB/wEAARUBRQH/ARwBlwHxAf8BHQGYAfIB/wEdAZkB8QH/AR0BmAHzAf8BHQGX - AfMB/wEdAZYB8gH/BAADwQH/AzcB/wMfAf8BQwJCAf8B4wLhAf8BjQKLAf8BEgIQAf8BHwIdAf8BGAIW - Af8BgAJkAf8B3ALaAf8BRQJDAf8BJwIlAf8BKwIpAf8BKQInAf8BJwIlAf8BKAImAf8BKAImAf8BJwIl - Af8BJQIjAf8BjQKLAf8B6QLnAf8BqQKnAf8BIwIhAf8BJwIlAf8BJwIlAf8BJwIlAf8DJAH/AycB/wO0 - Af8EAAPrAf8DVQH/AwcB/wOyAf8D/gH/A/5J/wP+Cf8DwgH/AxcB/wNMAf8D4QH/OAAD9gH/A5EB/wMv - Af8DKwH/A48B/wPyAf80AAEXAZYB7AH/ARQBiwHeAf8BCQFMAa0B/wEZAZYB7AH/ARoBmAHuAf8BGgGY - Ae8B/wEaAZgB7gH/ARsBmAHuAf8BGwGZAe8B/wEcAZkB7wH/ARsBmQHvAf8BFAGBAc8B/wEAASIBUAH/ - ARkBkAHkAf8BGwGZAfAB/wEcAZoB8AH/ARsBmQHwAf8BGwGaAe8B/wEbAZoB8AH/ARwBmQHvAf8BGwGX - Ae8B/wEYAZEB5gH/ARQBhAHVAf8BDgFYAbwB/wEFAToBkQH/AQABBQErAf8BFwGCAekB/wESAV0B7gH/ - AQ0BTAHsAf8BCAE4AeoB/wEAASIB5wH/AQABDAHlAf8EAAPYAf8DSQH/ARsCGgH/AWMCYQH/Ad4C3AH/ - AUgCRgH/ASMCIQH/AScCJQH/AScCJQH/AUQCQgH/AdcC1QH/AV0CWwH/ASgCJgH/ASoCKAH/ASkCJwH/ - ASgCJgH/ASkCJwH/ASkCJwH/ATgCNgH/AagCpgH/AcgCxgH/AZACjgH/AcsCyQH/AbICsQH/AUQCQgH/ - ASQCIgH/ASgCJgH/ASQCIgH/AToCOQH/A88B/wQAA+sB/wNVAf8DBwH/A7IB/wP+Af8D/kn/A/4J/wPC - Af8DFwH/A0wB/wPhAf84AAPyAf8D1wH/A7oB/wO4Af8D1gH/A/MB/zUAASABTwH/AQABLgFjAf8BAgE7 - AZIB/wEJAUcBowH/AQoBUQGyAf8BDQFYAb4B/wERAV8ByQH/ARMBgAHQAf8BEwGFAdYB/wEUAYgB2gH/ - ARUBiwHeAf8BFAGKAdwB/wEVAYoB3QH/ARQBiAHZAf8BFQGIAdoB/wEUAYQB1QH/AREBYgHLAf8BDwFc - AcMB/wEMAVIBtAH/AQoBRwGkAf8BBQE+AZkB/wEBAS4BgQH/AQABHgFMAf8BAAEMATMB/wEBATUBjAH/ - AQABCAE0Af8CAAGrAf8CAAHaAf8CAAHbAf8CAAHcAf8CAAHcAf8CAAHbAf8EAAPpAf8DZQH/ASECHwH/ - AWMCYQH/Ad4C3AH/AUkCRwH/AR8CHQH/ASMCIQH/AScCJQH/AUMCQQH/AdkC1wH/AVsCWgH/ASQCIgH/ - ASkCJwH/ASUCIwH/ASoCKAH/ASkCJwH/ASUCIwH/ATYCNAH/AcICwQH/AdcC1QH/AUoCSAH/Ac4CzAH/ - AdIC0AH/AUoCSAH/ASQCIgH/ASoCKAH/AR8CHQH/AVcCVgH/A+sB/wQAA+sB/wNVAf8DBwH/A7IB/wP+ - Af8D/kn/A/4J/wPCAf8DFwH/A0wB/wPhAf84AAPGAf8DWgH/A4oB/wOJAf8DZAH/A8oB/zUAARwBSwH/ - AQABEgE6Af8BAAEGASkB/wMAAf8CAAELAf8CAAEIAf8CAAEBAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AgABAQH/AgABAgH/AwAB/wIAARAB/wIAARwB/wIAARMB/wIAAQgB/wEAARgBSAH/AQABIgFV - Af8BAAEoAV4B/wEEAT0BmgH/AQABGAFSAf8CAAFcAf8CAAHVAf8CAAHWAf8CAAHWAf8CAAHbAf8BAAES - Ad4B/wgAA68B/wEsAioB/wFCAkAB/wHXAtUB/wGgAp4B/wEqAigB/wEfAh0B/wEoAiYB/wGUApIB/wHW - AtQB/wFFAkMB/wElAiMB/wEmAiQB/wEmAiQB/wEpAicB/wEnAiUB/wEmAiQB/wEpAicB/wE+AjwB/wGc - ApoB/wHXAtUB/wGwAq4B/wE+AjwB/wEuAiwB/wEmAiQB/wEnAiUB/wEoAiYB/wGkAqMB/wgAA+sB/wNV - Af8DBwH/A7IB/wP+Af8D/kn/A/4J/wPCAf8DFwH/A0wB/wPhAf80AAPtAf8DXwH/AyEB/wMmAf8DJAH/ - AyIB/wOAAf8D7gH/MAABEgGOAeYB/wERAY4B5gH/ARABiQHeAf8CAAEKAf8BEQGDAdQB/wETAY0B4wH/ - ARIBiwHiAf8BEQGIAd0B/wEQAYYB2gH/ARABhAHWAf8BDAFbAcQB/wIAAQwB/wEPAYMB1gH/AREBiAHc - Af8BEgGKAd8B/wESAYoB4QH/AQEBMQGGAf8BFAGPAeUB/wEUAY8B5wH/AQkBUwG4Af8BAAEGASgB/wER - AYoB4wH/AQ8BhAHaAf8BDAFeAckB/wEGAUwBsQH/AQABLAGEAf8CAAEzAf8BBwE/AeIB/wEEATcB4gH/ - AQgBQAHlAf8BFQGJAewB/wEVAYwB6wH/CAAD4AH/AUcCRQH/ASUCIwH/AZcClQH/AeEC3wH/AbcCtQH/ - AZUCkwH/Aa4CrAH/AeMC4QH/AZ0CmwH/ASwCKgH/ASgCJgH/ASkCJwH/ASkCJwH/ASgCJgH/ASgCJgH/ - ASYCJAH/AScCJQH/ASICIAH/AVQCUgH/AbkCtwH/AWUCYwH/ARwCGgH/AScCJQH/ASkCJwH/ASMCIQH/ - AUUCQwH/AdoC2QH/CAAD6wH/A1UB/wMHAf8DsgH/A/4B/wP+Sf8D/gn/A8IB/wMXAf8DTAH/A+EB/zQA - A6kB/wMnAf8DJwH/AycB/wMmAf8DJAH/AyUB/wOrAf8wAAESAY4B5gH/ARIBjgHmAf8BCwFgAcwB/wIA - AQ8B/wERAYwB4gH/ARMBjwHnAf8BEwGPAecB/wETAZAB6AH/ARMBkAHoAf8BEwGQAegB/wEQAYQB1wH/ - AgABEAH/ARIBjgHkAf8BFAGRAegB/wEUAZEB6QH/ARMBjwHoAf8BAwE2AY4B/wETAY4B5wH/ARMBkAHn - Af8BDwGDAdYB/wIAAREB/wERAYkB4QH/AQ8BhQHbAf8BCwFfAcwB/wEHAVABtwH/AQABNwGRAf8CAAEo - Af8BCAFLAdQB/wERAYIB6QH/AQABKgHcAf8BFAGLAeoB/wETAY0B6gH/DAABoQKfAf8BIgIhAf8BKAIn - Af8BhAKCAf8B0wLRAf8B5ALjAf8B1wLWAf8BigKIAf8BLwItAf8BJwIlAf8BJgIkAf8BKAImAf8BKwIp - Af8BKgIoAf8BJgIkAf8BKQInAf8BJwIlAf8BJwIlAf8BKAImAf8BKAImAf8BJwIlAf8BKQInAf8BKAIm - Af8BKwIpAf8BJwImAf8BqAKmAf8MAAPrAf8DVQH/AwcB/wOyAf8D/gH/A/5J/wP+Cf8DwgH/AxcB/wNM - Af8D4QH/MAAD6QH/AzgB/wMhAf8DJwH/AyUB/wMmAf8DJQH/AyAB/wMyAf8D7AH/LAABEQGNAeUB/wEQ - AYwB5AH/AQUBSwGwAf8BAAEFAScB/wEPAYwB4wH/AREBjQHlAf8BEgGOAeYB/wESAY4B5gH/ARIBjwHn - Af8BEgGPAecB/wEPAYMB1gH/AgABEAH/ARABjAHiAf8BEgGPAeYB/wESAY8B5wH/ARIBjQHmAf8BAwE2 - AY8B/wERAYwB5gH/ARIBjgHlAf8BEAGLAeMB/wIAARQB/wELAWIBzwH/AQ4BhAHcAf8BCgFgAc8B/wEH - AVIBuwH/AQABPQGcAf8BAAEGATgB/wEAASgBpAH/ARABhgHmAf8BAAEoAdkB/wERAYcB6AH/AREBjAHm - Af8QAANaAf8DIQH/AxgB/wMTAf8DEwH/AxIB/wEfAh0B/wEmAiQB/wEkAiIB/wEgAh4B/wEhAh8B/wEh - Ah8B/wEjAiEB/wElAiMB/wEiAiAB/wEmAiQB/wEkAiIB/wEmAiQB/wEmAiUB/wMnAf8DJwH/AyYB/wMe - Af8DYAH/A+0B/wwAA+oB/wNXAf8DCAH/A7BR/wP+Af8D/AX/A8EB/wMXAf8DTAH/A+AB/zAAA5IB/wMa - Af8DIwH/AyUB/wMlAf8DJwH/AyUB/wMoAf8DGQH/A5gB/ywAAQ8BiwHjAf8BDgGKAeIB/wEAATgBkgH/ - AQABFgFCAf8BDQGKAeIB/wEQAYwB5AH/ARABjAHkAf8BEAGMAeQB/wEQAY0B5QH/AREBjQHlAf8BDgGB - AdQB/wIAAQ0B/wEPAYoB4AH/ARABjQHkAf8BEQGNAeUB/wEQAYwB5AH/AQABMwGKAf8BEQGLAeIB/wEQ - AYwB5AH/AQ4BigHjAf8BAAEKATAB/wEFAUwBsAH/AQwBgwHcAf8BCgFhAdEB/wEHAVUBvwH/AQEBQgGl - Af8BAAEXAVMB/wEAAQYBVAH/AQ0BhQHkAf8BCAFSAeAB/wENAYEB5QH/ARABigHkAf8QAAPYAf8DSAH/ - AyAB/wMnAf8DJAH/AycB/wEmAiQB/wEvAi0B/wFCAkAB/wFAAj4B/wFCAkAB/wFDAkEB/wFDAkEB/wFE - AkIB/wFFAkMB/wFEAkIB/wEzAjEB/wElAiMB/wEmAiQB/wMmAf8DJwH/Ax4B/wM3Af8D1wH/EAAD6wH/ - A1cB/wMKAf8DsVH/A/4B/wP8Af8D/gH/A8YB/wMWAf8DTAH/A+AB/ywAA9IB/wM6Af8DJAH/AyUB/wMl - Af8DJAH/AyYB/wMoAf8DJgH/AygB/wM4Af8DzwH/KAABDQGJAeEB/wENAYgB4QH/AQABJQFaAf8BAAEo - AV0B/wEMAYgB4QH/AQ0BigHiAf8BDgGLAeMB/wEOAYsB4wH/AQ8BjAHkAf8BDgGMAeQB/wENAYEB1AH/ - AgABCwH/AQ4BiAHeAf8BDgGLAeMB/wEOAYsB4wH/AQ8BiwHjAf8BBgFLAbAB/wENAYoB4QH/AQ8BiwHj - Af8BDAGIAeIB/wEAAR4BUAH/AQABNAGMAf8BCwGDAdsB/wEJAWEB0gH/AQUBVgHCAf8BAgFHAawB/wEA - ASkBggH/AgABLAH/AQsBYAHfAf8BDAGGAeIB/wENAYcB4wH/AQ4BiQHjAf8UAAPKAf8DUQH/AyAB/wMh - Af8BHwIeAf8BMQIvAf8BoAKeAf8B1ALSAf8B1QLUAf8B1QLUAf8B1gLUAf8B1gLVAf8B1ALSAf8B1wLW - Af8B0wLSAf8BowKiAf8BLQIrAf8BIQIfAf8DHgH/AyMB/wNOAf8DxAH/FAAD6wH/A1UB/wMFAf8DsQH/ - A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/ - A/4B/wP+Af8D/gH/A/4J/wP9Af8D/gH/A8UB/wMVAf8DTAH/A+AB/ygAA+kB/wNkAf8DJwH/AyUB/wMl - Af8DJwH/AyYB/wMlAf8DKAH/AygB/wMiAf8DJwH/A14B/wPmAf8kAAEMAYgB4AH/AQsBhwHgAf8BAAEX - AUQB/wEAATsBlgH/AQsBhwHgAf8BDQGJAeEB/wENAYkB4QH/AQwBiQHhAf8BDQGKAeIB/wENAYoB4gH/ - AQ0BZAHSAf8CAAELAf8BDQGHAd0B/wENAYkB4QH/AQ0BigHiAf8BDQGJAeEB/wENAYkB4gH/AQ4BiQHh - Af8BDQGIAeIB/wEMAYgB4AH/AQABNgGQAf8BAAEkAVkB/wEJAYMB3AH/AQgBYQHTAf8BBQFYAcQB/wEC - AUoBsgH/AQABNAGPAf8CAAEoAf8BBgFVAcsB/wELAYQB4QH/AQsBhgHhAf8BDAGHAeEB/xgAA+IB/wOs - Af8DgQH/A4MB/wHAAr8B/wHyAvEB/yAAAfIC8AH/Ab8CvQH/AYgChgH/A2UB/wOqAf8D4AH/GAAD6wH/ - A1MB/wMIAf8DtFn/A/4B/wPDAf8DFgH/A0wB/wPgAf8oAAOsAf8DKwH/AyIB/wMpAf8DKAH/AykB/wMm - Af8DIQH/AyYB/wMmAf8DJgH/AyMB/wMnAf8DqQH/JAABCwGHAd8B/wELAYYB3wH/AQkBYwHVAf8BBwGD - AdkB/wEKAYYB3wH/AQsBhwHfAf8BDAGIAeAB/wENAYkB4QH/AQ0BiQHhAf8BDAGIAeEB/wENAYUB3AH/ - AQABOwGbAf8BCgGHAd4B/wEMAYgB4AH/AQwBiAHgAf8BDAGIAeAB/wENAYkB4QH/AQwBiAHgAf8BDAGH - AeAB/wEMAYYB4QH/AQoBhQHdAf8BCgGDAdsB/wEJAYMB2wH/AQgBYgHUAf8BBgFYAccB/wECAU0BtQH/ - AQABOAGZAf8BAAEHAT4B/wEAASQBlAH/AQUBTwHcAf8BCgGDAeAB/wEKAYUB4AH/IAAD9AH/A/UB/zAA - A/UB/wP0Af8gAAPqAf8DVAH/AwgB/wO2Uf8D/gn/A8MB/wMWAf8DTAH/A+AB/yQAA+MB/wNBAf8DIAH/ - AykB/wMmAf8DJgH/AygB/wMoAf8DKAH/AyYB/wMlAf8DKAH/AyIB/wMfAf8DPQH/A90B/yAAAQkBgwHb - Af8BAQFBAaEB/wEAATkBkwH/AQIBSAGqAf8BCQGFAd4B/wEKAYYB3gH/AQoBhgHeAf8BCwGHAd8B/wEL - AYcB3wH/AQsBhwHfAf8BCwGFAd0B/wEMAYQB2wH/AQoBhQHdAf8BCgGGAd4B/wELAYcB3wH/AQsBhwHf - Af8BCwGHAd8B/wELAYcB3wH/AQsBhgHgAf8BCgGGAeAB/wEKAYQB3wH/AQUBVQHEAf8BCAGAAdgB/wEH - AWIB1QH/AQUBWgHJAf8BAQFPAbkB/wEAARwBmwH/AQABCgFUAf8BAAELAUsB/wEAARoBzgH/AQUBUgHd - Af8BCQGDAd8B/4AAA+sB/wNXAf8DEwH/A5kB/wPTAf8D0wH/A9MB/wPTAf8D0wH/A9MB/wPTAf8D0gH/ - A9IB/wPSAf8D0gH/A9IB/wPSAf8D0gH/A9IB/wPSAf8D0gH/A9IB/wPSAf8D0gH/A84B/wPRAf8D0AH/ - A6EB/wMdAf8DSwH/A+AB/yQAA+gB/wNZAf8DJAH/AxwB/wMkAf8DIwH/AyYB/wMjAf8DKAH/AygB/wMn - Af8DJAH/Ax4B/wMkAf8DXAH/A+gB/yAAAQQBWQHGAf8BAAE4AZQB/wEBAVMBvgH/AQABFwFHAf8BBwFd - AckB/wEJAYUB3QH/AQoBhgHeAf8BCgGGAd4B/wELAYcB3wH/AQkBYwHUAf8BAAEaAVAB/wEAASsBggH/ - AQABGAFJAf8BBgFeAcwB/wEKAYYB3gH/AQoBhgHeAf8BCgGFAd8B/wEKAYUB3wH/AQoBhQHfAf8BCQGE - Ad4B/wEIAYMB3QH/AQABKgGBAf8BBQFbAckB/wEGAWIB1gH/AQUBXAHLAf8BAgFRAb0B/wEAARcBoAH/ - AQABIAGCAf8BAAEDASsB/wEAASwBzwH/AQMBSwHZAf8BCAGCAd0B/4AAA+wB/wNXAf8DHgH/Ax8B/wMT - Af8DEwH/AxMB/wMTAf8DEwH/AxMB/wMTAf8DEwH/AxMB/wMTAf8DEwH/AxMB/wMTAf8DEwH/AxMB/wMT - Af8DEwH/AxMB/wMTAf8DFAH/AxQB/wMUAf8DFwH/Ax8B/wMmAf8DTwH/A+EB/ywAA94B/wOlAf8DWAH/ - Az0B/wMuAf8DKAH/AycB/wMtAf8DPAH/A10B/wOmAf8D4gH/KAABBQFXAcYB/wEAAQ4BOQH/AQABJgFe - Af8BAAEfAVQB/wEHAWMB1AH/AQgBhAHcAf8BCQGFAd0B/wEKAYYB3gH/AQkBhQHdAf8BCAGEAd0B/wEH - AYEB2AH/AQABNwGWAf8BAAEJATEB/wEGAV4BzAH/AQgBhAHcAf8BCQGFAd0B/wEJAYQB3QH/AQkBhAHe - Af8BCAGDAd0B/wEIAYIB3AH/AQABNAGQAf8BAAEkAWEB/wEEAVcByQH/AQUBYgHWAf8BBAFdAc0B/wEC - AVMBwAH/AQABMwGsAf8BAAEIAYkB/wIAAS4B/wEAARABrgH/AQYBXAHcAf8BBwGAAdwB/4QAA7IB/wOR - Af8DlAH/A5MB/wOTAf8DkwH/A5QB/wOUAf8DlAH/A5QB/wOUAf8DlAH/A5QB/wOUAf8DlAH/A5QB/wOU - Af8DlAH/A5QB/wOUAf8DlAH/A5QB/wOTAf8DkwH/A5MB/wOTAf8DkwH/A5MB/wOvAf8D7wH/NAAD7AH/ - A9kB/wPMAf8DxAH/A8MB/wPMAf8D2QH/A+wB/zAAAQIBXAHKAf8BAAEZAUsB/wEAASMBWgH/AQABJwFi - Af8BBgFjAdQB/wEHAYMB2wH/AQgBhAHcAf8BCAGEAdwB/wEIAYQB3AH/AQgBgAHWAf8BAAEeAVQB/wEA - ATcBlAH/AQABDwE7Af8BBQFfAc4B/wEHAYMB2wH/AQcBgwHbAf8BBwGDAdwB/wEHAYIB3AH/AQcBggHc - Af8BBwGBAdwB/wECAVQBwgH/AQABGgFTAf8BAwFbAc4B/wEGAWIB1gH/AQQBXQHPAf8BAwFXAcYB/wEC - AVIBvwH/AQEBTwG5Af8BAAFOAboB/wEDAV4B1AH/AQYBYwHaAf8BBgFjAdkB/4gAA/MB/wPyAf8D8wH/ - A/MB/wPzAf8D8wH/A/MB/wP0Af8D9AH/A/QB/wP0Af8D9AH/A/QB/wP0Af8D9AH/A/QB/wP0Af8D9AH/ - A/QB/wP0Af8D9AH/A/QB/wP0Af8D9AH/A/QB/wP0Af8D9AH/jAABBgGBAdoB/wEEAYAB2QH/AQUBgQHZ - Af8BBQGBAdkB/wEGAYIB2gH/AQcBgwHbAf8BBwGDAdwB/wEHAYIB3AH/AQgBhAHcAf8BBwGDAdsB/wEG - AWAB0QH/AQIBVgHEAf8BBAFdAc0B/wEGAYEB2gH/AQcBgwHbAf8BBwGDAdsB/wEHAYMB2wH/AQYBggHb - Af8BBgGBAdsB/wEGAYEB2wH/AQYBZAHaAf8BBgFjAdkB/wEGAWMB2QH/AQYBYgHYAf8BBQFiAdcB/wEG - AWIB2AH/AQUBYgHYAf8BBQFiAdgB/wEFAWIB2AH/AQUBYgHYAf8BBQFiAdgB/wEFAWIB2AH//wCVAAHr - Ae0B7gH/Ad4B4AHhAf8B2AHaAdsB/wHRAdMB1AH/AckBywHMAf8BwQHDAcQB/wG+Ab8BwAH/Ab0BvgG/ - Af8BvwHAAcEB/wG9Ab4BvwH/AbsBvAG9Af8CvAG9Af8BvAK9Af8BvgG/AcAB/wG9Ab4BvwH/Ab0BvgG/ - Af8BvAG+Ab8B/wHEAcYBxwH/AcwBzgHPAf8B0wHVAdYB/wHuAfAB8QH/KAADNwFaAYUBigGIAf8BhQGK - AYgB/wGFAYoBiAH/AYUBigGIAf8BhQGJAYgB/wGFAYkBiAH/AYUBiQGIAf8BhQGJAYgB/wGFAYoBiAH/ - AYQBiQGHAf8BhAGJAYcB/wGFAYoBiAH/AYUBigGIAf8BhQGKAYgB/wGFAYkBiAH/AYUBigGIAf8BhQGJ - AYgB/wGFAYoBiAH/AYUBiQGIAf8BhQGKAYgB/wGFAYkBiAH/AYUBigGIAf8DOAFdIAADNwFaAYUBigGI - Af8BhQGKAYgB/wGFAYoBiAH/AYUBigGIAf8BhQGJAYgB/wGFAYkBiAH/AYUBiQGIAf8BhQGJAYgB/wGF - AYoBiAH/AYQBiQGHAf8BhAGJAYcB/wGFAYoBiAH/AYUBigGIAf8BhQGKAYgB/wGFAYkBiAH/AYUBigGI - Af8BhQGJAYgB/wGFAYoBiAH/AYUBiQGIAf8BhQGKAYgB/wGFAYkBiAH/AYUBigGIAf8DOAFdIAADNwFa - AYUBigGIAf8BhQGKAYgB/wGFAYoBiAH/AYUBigGIAf8BhQGJAYgB/wGFAYkBiAH/AYUBiQGIAf8BhQGJ - AYgB/wGFAYoBiAH/AYQBiQGHAf8BhAGJAYcB/wGFAYoBiAH/AYUBigGIAf8BhQGKAYgB/wGFAYkBiAH/ - AYUBigGIAf8BhQGJAYgB/wGFAYoBiAH/AYUBiQGIAf8BhQGKAYgB/wGFAYkBiAH/AYUBigGIAf8DOAFd - JAAB8gH0AfUB/wHtAe8B8AH/AeoB7AHtAf8B5wHpAeoB/wHkAeYB5wH/AeIC5AH/Ac0CzgH/A5oB/wOa - Af8DmgH/A5oB/wOaAf8DmgH/A5oB/wOaAf8CwgHDAf8B4AHhAeIB/wHiAeQB5QH/AeUB5wHoAf8B6AHq - AesB/wHzAfUB9gH/KAADBAEGAx4BKwMfAS0DHwEtAx8BLQMfAS0DHwEtAx8BLQMfAS0DQQFyATUBOgE4 - Af8BNQE6ATgB/wE1AToBOAH/ATUBOgE4Af8DQQFyAx8BLQMfAS0DHwEtAx8BLQMfAS0DHwEtAx8BLQMe - ASsDBAEGIAADBAEGAx4BKwMfAS0DHwEtAx8BLQMfAS0DHwEtAx8BLQMfAS0DQQFyATUBOgE4Af8BNQE6 - ATgB/wE1AToBOAH/ATUBOgE4Af8DQQFyAx8BLQMfAS0DHwEtAx8BLQMfAS0DHwEtAx8BLQMeASsDBAEG - IAADBAEGAx4BKwMfAS0DHwEtAx8BLQMfAS0DHwEtAx8BLQMfAS0DQQFyATUBOgE4Af8BNQE6ATgB/wE1 - AToBOAH/ATUBOgE4Af8DQQFyAx8BLQMfAS0DHwEtAx8BLQMfAS0DHwEtAx8BLQMeASsDBAEGQAADzQH/ - A8wB/wPMAf8DzAH/A8wB/wPMAf8DzAH/A8wB/wHvAfAB8QH/YAADNAFUASwBMQEvAf8BLAExAS8B/wEs - ATEBLwH/ASwBMQEvAf8DNAFUaAADNAFUASwBMQEvAf8BLAExAS8B/wEsATEBLwH/ASwBMQEvAf8DNAFU - aAADNAFUASwBMQEvAf8BLAExAS8B/wEsATEBLwH/ASwBMQEvAf8DNAFUZAACvQG+Af8DtgH/A7YB/wO2 - Af8DtgH/A7YB/wO2Af8DtgH/AfQB9QH2Af80AAMXASADQgF0A1ABmwNRAaADUQGgA1EBoANRAaADUQGg - A1EBoANRAaADUQGgA1kBvwFBAkQB/wFAAkMB/wE/AUMBQgH/AT8BQgFBAf8DWQG/A1EBoANRAaADUQGg - A1EBoANRAaADUQGgA1EBoANRAaADUAGdA0MBeAMYASIQAAMXASADQgF0A1ABmwNRAaADUQGgA1EBoANR - AaADUQGgA1EBoANRAaADUQGgA1kBvwFBAkQB/wFAAkMB/wE/AUMBQgH/AT8BQgFBAf8DWQG/A1EBoANR - AaADUQGgA1EBoANRAaADUQGgA1EBoANRAaADUAGdA0MBeAMYASIQAAMXASADQgF0A1ABmwNRAaADUQGg - A1EBoANRAaADUQGgA1EBoANRAaADUQGgA1kBvwFBAkQB/wFAAkMB/wE/AUMBQgH/AT8BQgFBAf8DWQG/ - A1EBoANRAaADUQGgA1EBoANRAaADUQGgA1EBoANRAaADUAGdA0MBeAMYASI4AAHKAssB/wO9Af8DvQH/ - A70B/wO9Af8DvQH/A70B/wPBAf80AAM+BGoB+QGRApUB/wGYApwB/wGWAZsBmgH/AZQCmQH/AZIBmAGX - Af8BkAKWAf8BjgKUAf8BjQKTAf8BiwKRAf8BigGQAY8B/wGIAo4B/wGGAY0BjAH/AYUBiwGKAf8BgwKJ - Af8BgQGIAYcB/wGAAoYB/wFYAoQB/wFXAYMBggH/AVUCgQH/AVMBgAFZAf8BUAJYAf8BTwFXAVYB/wFO - AVUBVAH/AUwCUwH/AUoCUQH/AUQBSQFIAf8BYwFmAWUB+QM/AW0IAAM+BGoB+QGRApUB/wGYApwB/wGW - AZsBmgH/AZQCmQH/AZIBmAGXAf8BkAKWAf8BjgKUAf8BjQKTAf8BiwKRAf8BigGQAY8B/wGIAo4B/wGG - AY0BjAH/AYUBiwGKAf8BgwKJAf8BgQGIAYcB/wGAAoYB/wFYAoQB/wFXAYMBggH/AVUCgQH/AVMBgAFZ - Af8BUAJYAf8BTwFXAVYB/wFOAVUBVAH/AUwCUwH/AUoCUQH/AUQBSQFIAf8BYwFmAWUB+QM/AW0IAAM+ - BGoB+QGRApUB/wGYApwB/wGWAZsBmgH/AZQCmQH/AZIBmAGXAf8BkAKWAf8BjgKUAf8BjQKTAf8BiwKR - Af8BigGQAY8B/wGIAo4B/wGGAY0BjAH/AYUBiwGKAf8BgwKJAf8BgQGIAYcB/wGAAoYB/wFYAoQB/wFX - AYMBggH/AVUCgQH/AVMBgAFZAf8BUAJYAf8BTwFXAVYB/wFOAVUBVAH/AUwCUwH/AUoCUQH/AUQBSQFI - Af8BYwFmAWUB+QM/AW00AAHWAtcB/wPHAf8DxwH/A8cB/wPHAf8DxwH/A8cB/wHOAs8B/zAAAy8BSQN/ - Af4BqgGyAbEB/wG2Ar4B/wG0ArwB/wGyAroB/wGvArgB/wGtArcB/wGrArUB/wGpArMB/wGnArEB/wGl - Aq8B/wGjAq0B/wGhAqsB/wGfAqkB/wGdAqgB/wGaAqYB/wGYAqQB/wGWAqIB/wGUAqAB/wGSAp4B/wGQ - ApwB/wGOApoB/wGMApgB/wGKApcB/wGIAZYBlQH/AYYBlAGTAf8BhAGSAZEB/wGCAZABjwH/AVIBggGB - Af8BPQI/Af8DMAFLAy8BSQN/Af4BqgGyAbEB/wG2Ar4B/wG0ArwB/wGyAroB/wGvArgB/wGtArcB/wGr - ArUB/wGpArMB/wGnArEB/wGlAq8B/wGjAq0B/wGhAqsB/wGfAqkB/wGdAqgB/wGaAqYB/wGYAqQB/wGW - AqIB/wGUAqAB/wGSAp4B/wGQApwB/wGOApoB/wGMApgB/wGKApcB/wGIAZYBlQH/AYYBlAGTAf8BhAGS - AZEB/wGCAZABjwH/AVIBggGBAf8BPQI/Af8DMAFLAy8BSQN/Af4BqgGyAbEB/wG2Ar4B/wG0ArwB/wGy - AroB/wGvArgB/wGtArcB/wGrArUB/wGpArMB/wGnArEB/wGlAq8B/wGjAq0B/wGhAqsB/wGfAqkB/wGd - AqgB/wGaAqYB/wGYAqQB/wGWAqIB/wGUAqAB/wGSAp4B/wGQApwB/wGOApoB/wGMApgB/wGKApcB/wGI - AZYBlQH/AYYBlAGTAf8BhAGSAZEB/wGCAZABjwH/AVIBggGBAf8BPQI/Af8DMAFLBAACtQG2Af8CtQG2 - Af8CtQG2Af8CtQG2Af8CtQG2Af8CtQG2Af8CtQG2Af8CtAG1Af8BtQG0AbUB/wK1AbYB/wKzAbQB/wGa - AZkBmgH/AYoCiQH/AYoCiQH/AYoCiQH/AYoCiQH/AYoCiQH/AYoCiQH/A5MB/wKzAbQB/wK1AbYB/wK1 - AbYB/wK0AbUB/wK1AbYB/wK1AbYB/wK1AbYB/wK1AbYB/wK1AbYB/wK1AbYB/wK1AbYB/wQAA1gBwQGj - AqkB/wG6AsIB/wGvArcB/wGnAq8B/wGmAq0B/wGkAawBqwH/AaECqgH/AZ8CqAH/AZ0CpwH/AZwCpQH/ - AZoBpAGjAf8BmQKiAf8BlwGhAaAB/wGVAZ8BngH/AZMCnQH/AZEBnAGbAf8BjwGaAZkB/wGNApgB/wGM - ApcB/wGKApUB/wGIApMB/wGHApIB/wGFApAB/wGDAY8BjgH/AYEBjgGNAf8BgAGMAYsB/wFYAYsBigH/ - AVkBjQGLAf8BgQGQAY8B/wFLAlMB/wNbAcYDWAHBAaMCqQH/AboCwgH/Aa8CtwH/AacCrwH/AaYCrQH/ - AaQBrAGrAf8BoQKqAf8BnwKoAf8BnQKnAf8BnAKlAf8BmgGkAaMB/wGZAqIB/wGXAaEBoAH/AZUBnwGe - Af8BkwKdAf8BkQGcAZsB/wGPAZoBmQH/AY0CmAH/AYwClwH/AYoClQH/AYgCkwH/AYcCkgH/AYUCkAH/ - AYMBjwGOAf8BgQGOAY0B/wGAAYwBiwH/AVgBiwGKAf8BWQGNAYsB/wGBAZABjwH/AUsCUwH/A1sBxgNY - AcEBowKpAf8BugLCAf8BrwK3Af8BpwKvAf8BpgKtAf8BpAGsAasB/wGhAqoB/wGfAqgB/wGdAqcB/wGc - AqUB/wGaAaQBowH/AZkCogH/AZcBoQGgAf8BlQGfAZ4B/wGTAp0B/wGRAZwBmwH/AY8BmgGZAf8BjQKY - Af8BjAKXAf8BigKVAf8BiAKTAf8BhwKSAf8BhQKQAf8BgwGPAY4B/wGBAY4BjQH/AYABjAGLAf8BWAGL - AYoB/wFZAY0BiwH/AYEBkAGPAf8BSwJTAf8DWwHGAwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEIAQQBBQH/A18B+wG0AbsBugH/AbwCxAH/ - AVgBhAGDAf8BMAE0ATEB/wE3AToBNgH/ATYBOgE2Af8BNgE6ATYB/wE2AToBNgH/ATcBOgE3Af8BNwE6 - ATYB/wE3AToBNgH/ATcBOgE2Af8BNgE6ATYB/wE3ATkBNwH/ATcBOgE2Af8BNwE6ATYB/wE3AToBNgH/ - ATcBOgE3Af8BNwE6ATYB/wE3ATkBNgH/ATYBOQE2Af8BMwE4ATYB/wE2ATkBNgH/ATcBOgE2Af8BNwE6 - ATYB/wE2AToBNgH/ATABNQExAf8BQQFKAUkB/wGDAZEBkAH/AVUBhwGGAf8BNQI3AfwDXwH7AbQBuwG6 - Af8BvALEAf8BWAGEAYMB/wEuATIBLwH/ATIBNQExAf8BMgE1ATEB/wEyATUBMQH/ATIBNQExAf8BMgE1 - ATIB/wEzATUBMQH/ATMBNQExAf8BMwE1ATEB/wEyATUBMQH/ATIBNQEyAf8BMwE1ATEB/wEyATUBMQH/ - ATIBNQExAf8BMwE1ATEB/wEzATUBMQH/ATMBNQExAf8BMgE1ATEB/wEzATUBMQH/ATMBNQExAf8BMgE1 - ATEB/wEzATUBMQH/ATIBNQExAf8BLgEzAS8B/wFBAUoBSQH/AYMBkQGQAf8BVQGHAYYB/wE1AjcB/ANf - AfsBtAG7AboB/wG8AsQB/wFYAYQBgwH/AS4BMgEvAf8BMgE1ATEB/wEyATUBMQH/ATIBNQExAf8BMgE1 - ATEB/wEyATUBMgH/ATMBNQExAf8BMwE1ATEB/wEzATUBMQH/ATIBNQExAf8BMgE1ATIB/wEzATUBMQH/ - ATIBNQExAf8BMgE1ATEB/wEzATUBMQH/ATMBNQExAf8BMwE1ATEB/wEyATUBMQH/ATMBNQExAf8BMwE1 - ATEB/wEyATUBMQH/ATMBNQExAf8BMgE1ATEB/wEuATMBLwH/AUEBSgFJAf8BgwGRAZAB/wFVAYcBhgH/ - ATUCNwH8AwAB/wErAikB/wFTAVIBUwH/AVMBUgFTAf8BUwFSAVMB/wFTAVIBUwH/AVMBUgFTAf8BUwFS - AVMB/wFTAVIBUwH/AVMBUgFTAf8BUwFSAVMB/wFUAlMB/wFUAVMBVAH/AVQBUwFUAf8BUwFSAVMB/wFT - AVIBUwH/AVMBUgFTAf8BVAFTAVQB/wFVAVMBVAH/AVUCVAH/AVQBUwFUAf8BVAFTAVQB/wFUAVMBVAH/ - AVQBUwFUAf8BVAFTAVQB/wFUAVMBVAH/AVQBUwFUAf8BVAFTAVQB/wFUAVMBVAH/AVQBUwFUAf8BIAId - Af8DAAH/AY4CkAH/AbgCvwH/Ab0CxQH/AVkBhQGEAf8BpwGpAadZ/wGkAaYBowH/AUMBSwFJAf8BhQGT - AZIB/wFYAYsBigH/AT0CPwH/AY4CkAH/AbgCvwH/Ab0CxQH/AVkBhQGEAf8BpgGoAaZZ/wGgAaEBngH/ - AUMBSwFJAf8BhQGTAZIB/wFYAYsBigH/AT0CPwH/AY4CkAH/AbgCvwH/Ab0CxQH/AVkBhQGEAf8BpgGo - AaZZ/wGgAaEBngH/AUMBSwFJAf8BhQGTAZIB/wFYAYsBigH/AT0CPwH/AwAB/wGiAaEBogH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BigGJAYoB/wMAAf8BjwKSAf8BuwHB - AcAB/wHAAsYB/wGAAYYBhQH/AagBqgGoWf8BpQGmAaQB/wFEAUsBSgH/AYcBlQGUAf8BgQKMAf8BPgJA - Af8BjwKSAf8BuwHBAcAB/wHAAsYB/wGAAYYBhQH/AagBqgGoJf8B+AH7Af4B/wGFAcEB/QH/AUgBtgH9 - Af8B6AHzAf0l/wGhAaIBnwH/AUQBSwFKAf8BhwGVAZQB/wGBAowB/wE+AkAB/wGPApIB/wG7AcEBwAH/ - AcACxgH/AYABhgGFAf8BqAGqAagN/wP9Af8C6AHpAf8BzAHLAc0B/wLGAccB/wLGAccB/wLGAccB/wLG - AccB/wLGAccB/wLGAccB/wLGAccB/wLGAccB/wLGAccB/wLIAckB/wPqFf8BoQGiAZ8B/wFEAUsBSgH/ - AYcBlQGUAf8BgQKMAf8BPgJAAf8DAAH/AaIBoQGiAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5 - AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/ - AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5 - AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/ - AfcB+QH6Af8B9wH5AfoB/wGKAYkBigH/AwAB/wGQApMB/wG8AcIBwQH/AcEByAHHAf8BgQGHAYUB/wGo - AakBpzn/AfsB/AH+Af8BxQHXAfsB/wGqAcUB+wH/AfoB/AH9Ef8BpQGmAaQB/wFEAUwBSwH/AYkBlgGV - Af8BggKOAf8BPwJBAf8BkAKTAf8BvAHCAcEB/wHBAcgBxwH/AYEBhwGFAf8BpwGoAaYl/wHBAd8B/AH/ - AQABWQH+Af8BAAFZAv8BhAHBAfwl/wGhAaIBnwH/AUQBTAFLAf8BiQGWAZUB/wGCAo4B/wE/AkEB/wGQ - ApMB/wG8AcIBwQH/AcEByAHHAf8BgQGHAYUB/wGnAagBpg3/A/gB/wK/AcAB/wFZAYEBggH/ATMBNAE1 - Af8CLwExAf8BLwEuATEB/wEvAS4BMQH/AS8BLgExAf8BLwEuATEB/wEvAS4BMQH/AS8BLgExAf8BLwEu - ATEB/wEwAS8BMAH/A1YB/wPuAf8D/g3/AaEBogGfAf8BRAFMAUsB/wGJAZYBlQH/AYICjgH/AT8CQQH/ - AwAB/wGiAaEBogH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/ - AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/AYQBhQGGAf8B9wH5 - AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/ - AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGKAf8DAAH/AZIBlQGUAf8BvgHEAcMB/wHDAcoByQH/ - AYIBhwGGAf8BpQGmAaQ5/wGyAcoB+QH/AQABNQH7Af8BAAEwAf0B/wGHAa0B+gH/AfwB/QH+Df8BpQGm - AaQB/wFEAU0BSwH/AYsClwH/AYQCjwH/AUECQwH/AZIBlQGUAf8BvgHEAcMB/wHDAcoByQH/AYIBhwGG - Af8BoQGiAZ8l/wHgAe8B/AH/AQABjAH9Af8BAAGEAf0B/wG1AdkB/CX/AaEBogGfAf8BRAFNAUsB/wGL - ApcB/wGEAo8B/wFBAkMB/wGSAZUBlAH/Ab4BxAHDAf8BwwHKAckB/wGCAYcBhgH/AaEBogGfDf8D9wH/ - AbMBtAG1Af8BLAEuAS8B/wFNAU4BTwH/A7YB/wG3ArYB/wG3ArYB/wG3ArYB/wG3ArYB/wG3ArYB/wG3 - ArYB/wG3ArYB/wO2Af8DiAH/A54B/wP+Df8BoQGiAZ8B/wFEAU0BSwH/AYsClwH/AYQCjwH/AUECQwH/ - AwAB/wGiAaEBogH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/ - AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/AYQBhQGGAf8B9wH5 - AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/ - AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGKAf8DAAH/AZMBlgGVAf8BwAHFAcQB/wHGAcwBywH/ - AYMBiAGGAf8BpQGmAaQp/wL+Af0B/wHiAewB/AH/Aa8ByAH5Af8B+QH7AfwB/wH4AvwB/wGIAa4B+QH/ - AQABLwH8Af8BAAExAfsB/wGsAcYB+QH/Af0B/wH+Cf8BpQGmAaQB/wFFAU4BTAH/AY0CmQH/AYUBkQGQ - Af8BQgJEAf8BkwGWAZUB/wHAAcUBxAH/AcYBzAHLAf8BgwGIAYYB/wGhAaIBnyH/Af4H/wHrAfQB/QH/ - AeEB8AH9Af8D/iX/AaEBogGfAf8BRQFOAUwB/wGNApkB/wGFAZEBkAH/AUICRAH/AZMBlgGVAf8BwAHF - AcQB/wHGAcwBywH/AYMBiAGGAf8BoQGiAZ8N/wP3Af8BswG0AbUB/wEnASkBKwH/AaMCpQH/Af4B/wH+ - A/8B/QP/Af0D/wH9A/8B/QP/Af0D/wH9A/8B/QP/Af4B/wO/Af8DlhH/AaEBogGfAf8BRQFOAUwB/wGN - ApkB/wGFAZEBkAH/AUICRAH/AwAB/wGiAaEBogH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/ - Af8DAAH/AwAB/wMAAf8DAAH/AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/Af8DAAH/AwAB/wMA - Af8DAAH/AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGKAf8DAAH/AZQClwH/ - AcEBxwHGAf8ByAHOAc0B/wGDAYkBhwH/AagBqQGnKf8BzAHcAfsB/wEAAUAB+wH/AQABMAH9Af8BjAGx - AfoB/wH9Av4B/wH4AfsB/QH/ATUBjwH6Af8BAAEtAf4B/wEAAUUB+gH/AesB8gH8Cf8BpQGmAaQB/wFG - AU4BTQH/AY4CmgH/AYcCkgH/AUMBRQFGAf8BlAKXAf8BwQHHAcYB/wHIAc4BzQH/AYMBiQGHAf8BpwGp - Aacd/wHxAfoB/QH/AUQByQH8Af8BywHsAfwB/wH4AfwB/gH/AfwC/gH/AegB9gH9Af8BiwHVAfwB/wHY - AfEB/R3/AaEBogGfAf8BRgFOAU0B/wGOApoB/wGHApIB/wFDAUUBRgH/AZQClwH/AcEBxwHGAf8ByAHO - Ac0B/wGDAYkBhwH/AacBqQGnDf8D9wH/AbIBtAG2Af8BJgEoASwB/wKkAaUl/wO/Af8DlhH/AaEBogGf - Af8BRgFOAU0B/wGOApoB/wGHApIB/wFDAUUBRgH/AwAB/wGiAaEBogH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/ - Af8DAAH/AwAB/wMAAf8DAAH/AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGK - Af8DAAH/AZYCmAH/AcMByQHIAf8ByQHPAc4B/wGEAYoBiAH/AagBqgGoHf8B9QH4Af0B/wHfAekB+gX/ - AfoB+wH9Af8BgAGoAfgB/wEAAS0B/AH/AQABNQH7Af8BzgHeAfsB/wH8Af4B/QH/AdcB5AH7Af8BAAE2 - AfsB/wEAAS0B/AH/AZYBtwH5Cf8BpAGmAaQB/wFHAU8BTgH/AZACnAH/AYoClAH/AUUCRwH/AZYCmAH/ - AcMByQHIAf8ByQHPAc4B/wGEAYoBiAH/AagBqgGoHf8BnAHaAfwB/wEAAaUB/QH/AQABpwH9Af8BAAGx - Af0B/wEHAbQB/QH/AQABqgH9Af8BAAGlAf0B/wEsAcAB+wH/AfwC/hn/AaEBogGfAf8BRwFPAU4B/wGQ - ApwB/wGKApQB/wFFAkcB/wGWApgB/wHDAckByAH/AckBzwHOAf8BhAGKAYgB/wGoAaoBqA3/A/cB/wGz - AbUBuAH/ASYBKQEtAf8CpAGlJf8DwAH/A5YR/wGhAaIBnwH/AUcBTwFOAf8BkAKcAf8BigKUAf8BRQJH - Af8DAAH/AaIBoQGiAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/AwAB/wMA - Af8BhAGFAYYB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/AwAB/wMAAf8BhAGFAYYB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BigGJAYoB/wMAAf8BlwGaAZkB/wHFAcoByQH/AcsB0QHQ - Af8BhQGKAYgB/wGpAaoBqBn/AeMB7AH6Af8BFwFUAfkB/wEAAUAB+gH/AdcB5QH7Af8B/gH/Af4B/wHz - AfcB/AH/AQ4BTwH6Af8BAAEtAf4B/wFBAZgB+wH/Af0B/gH9Af8B/AH9Af4B/wEoAYcB+QH/AQABLQH+ - Af8BGwFZAfoB/wL+Bv8BogKkAf8BRwFQAU4B/wGSAp4B/wGLAZUBlgH/AUYCSAH/AZcBmgGZAf8BxQHK - AckB/wHLAdEB0AH/AYUBigGIAf8BqQGqAagd/wH2AfsB/gH/AZAB1gH8Af8BBQGzAfwB/wEAAacB/QH/ - AQABpwH9Af8BAAGsAf0B/wE4AcUB/AH/AdgB8QH9Af8B/hv/AaEBogGfAf8BRwFQAU4B/wGSAp4B/wGL - AZUBlgH/AUYCSAH/AZcBmgGZAf8BxQHKAckB/wHLAdEB0AH/AYUBigGIAf8BqQGqAagN/wP3Af8BswG1 - AbgB/wEmASkBLQH/AqQBpSX/A8AB/wOWEf8BoQGiAZ8B/wFHAVABTgH/AZICngH/AYsBlQGWAf8BRgJI - Af8DAAH/AaIBoQGiAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/AwAB/wMA - Af8BhAGFAYYB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/AwAB/wMAAf8BhAGFAYYB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BigGJAYoB/wMAAf8BmAKbAf8BxgHMAcsB/wHNAdMB0gH/ - AYUBiwGJAf8BqAGqAagJ/wH6AfwB/QH/AdoB5gH7Af8B5gHuAfsB/wH+A/8B+AH6AfwB/wEsAYgB+QH/ - AQABLQH+Af8BQgGXAfkB/wH9Av4B/wH9Af4B/QH/AYwBsAH6Af8BAAEtAv8BAwFHAfoB/wH2AfkB/QP/ - Af4B/wGKAa8B+QH/AQABLQL/AQABPAH8Af8B+wH8Bv8BoAGjAaQB/wFIAVABTwH/AZMCnwH/AY0ClwH/ - AUcCSQH/AZgCmwH/AcYBzAHLAf8BzQHTAdIB/wGFAYsBiQH/AagBqgGoFf8B+QH9Af4B/wHNAe0B/QH/ - Av4G/wH4AfwB/gH/AeQB9QH9Af8B3gHzAf4B/wHwAfkB/QH/Af4H/wH7Af0B/gH/AewB+AH9Ff8BoQGi - AZ8B/wFIAVABTwH/AZMCnwH/AY0ClwH/AUcCSQH/AZgCmwH/AcYBzAHLAf8BzQHTAdIB/wGFAYsBiQH/ - AagBqgGoDf8D9wH/AbMBtQG4Af8BJgEpAS0B/wKkAaUl/wO/Af8DlhH/AaEBogGfAf8BSAFQAU8B/wGT - Ap8B/wGNApcB/wFHAkkB/wMAAf8BogGhAaIB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wG8Ab4BvwH/ - AwAB/wMAAf8DAAH/AwAB/wGEAYUBhgH/AfcB+QH6Af8B9wH5AfoB/wG8Ab4BvwH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/Ai4BLwH/AbwBvgG/Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGKAf8DAAH/AZoCnAH/AcgBzgHNAf8BzgHUAdMB/wGGAYwBigH/ - AakBqgGoCf8BggGpAfoB/wEAATIB+wH/AQABOwH8Af8BwQHVAfoB/wP+Af8BpgHDAfsB/wEAASwB/QH/ - AQUBSAH6Af8B+AH6Af4B/wP+Af8BswHLAfsB/wEAAS0B/gH/AQABOQH8Af8B7AHyAf0F/wGmAcIB+wH/ - AQABLQH+Af8BAAE0Af4B/wH5AfsG/wGeAaIBpAH/AUkBUQFQAf8BlQKhAf8BjgKZAf8BSAJKAf8BmgKc - Af8ByAHOAc0B/wHOAdQB0wH/AYYBjAGKAf8BqQGqAagV/wG7AecB/QH/AUIBygH+Af8BqgHgAf0B/wHy - AfoB/gH/Af4P/wH+Af8B/gH/AesB9wH9Af8BmAHaAf0B/wGBAdIB/gH/AfUB+wH+Ef8BoQGiAZ8B/wFJ - AVEBUAH/AZUCoQH/AY4CmQH/AUgCSgH/AZoCnAH/AcgBzgHNAf8BzgHUAdMB/wGGAYwBigH/AakBqgGo - Df8D9wH/AbMBtQG4Af8BJgEpAS0B/wKkAaUl/wPAAf8DlhH/AaEBogGfAf8BSQFRAVAB/wGVAqEB/wGO - ApkB/wFIAkoB/wMAAf8BogGhAaIB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wG8Ab4BvwH/AwAB/wMA - Af8DAAH/AwAB/wGEAYUBhgH/AfcB+QH6Af8B9wH5AfoB/wG8Ab4BvwH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BoQKjAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5 - AfoB/wGKAYkBigH/AwAB/wGbAp0B/wHKAdABzwH/AdAB1gHVAf8BhwGMAYoB/wGoAaoBqAn/AUUBmgH5 - Af8BAAEuAfwB/wEAATEB+wH/AbAByQH5Af8B/gH/Af4B/wGoAcMB+wH/AQABLQH9Af8BBQFIAfoB/wH4 - AfoB/gH/Av4B/QH/AasBxgH6Af8BAAEtAv8BAAE7AfsB/wHuAfQB/gH/Af4B/wH+Af8BogHBAfsB/wEA - AS0C/wEAATUB/QH/AfoB+wb/AZ8BogGkAf8BSgFSAVAB/wGXAqMB/wGQAZsBmgH/AUoCTAH/AZsCnQH/ - AcoB0AHPAf8B0AHWAdUB/wGHAYwBigH/AagBqgGoFf8BuAHmAf0B/wFCAcoB/gH/AT8ByQL/AU0BzgH+ - Af8BngHcAf0B/wG8AecB/QH/AcQB6gH9Af8BuAHmAf0B/wGWAdoB/QH/AUcBzAH+Af8BPwHJAv8BRwHM - Af4B/wHaAfIB/RH/AaEBogGfAf8BSgFSAVAB/wGXAqMB/wGQAZsBmgH/AUoCTAH/AZsCnQH/AcoB0AHP - Af8B0AHWAdUB/wGHAYwBigH/AagBqgGoDf8D9wH/AbMBtQG4Af8BJgEpAS0B/wKkAaUl/wPAAf8DlhH/ - AaEBogGfAf8BSgFSAVAB/wGXAqMB/wGQAZsBmgH/AUoCTAH/AwAB/wGiAaEBogH/AfcB+QH6Af8B9wH5 - AfoB/wH3AfkB+gH/AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/ - AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8B1gHX - AdgB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wGKAYkBigH/AwAB/wGcAp8B/wHMAdEB0AH/AdMB2AHX - Af8BiAGNAYsB/wGoAaoBqAn/AfIB9gH8Af8BtQHNAfoB/wHHAdkB+gH/AfsB/QH+Af8B+AH6AfwB/wEt - AYoB+gH/AQABLQH+Af8BPwGXAfoB/wP+Af8B/QH+Af0B/wFKAZ4B+gH/AQABLQL/ARQBUwH6Af8B+gH7 - Af4B/wH+Af8B/gH/AYIBqAH5Af8BAAEtAv8BAAFCAfsB/wH8Af0G/wGhAqQB/wFLAVIBUQH/AZgCpAH/ - AZECnAH/AUsCTQH/AZwCnwH/AcwB0QHQAf8B0wHYAdcB/wGIAY0BiwH/AagBqgGoDf8B/gP/Af4D/wH+ - A/8B0gHvAf0B/wGEAdQB/QH/AUEBygH+Af8BPwHJAv8BPwHJAv8BPwHJAv8BPwHJAv8BPwHJAv8BQgHK - Af4B/wGOAdcB/QH/Ad8B9AH9Bf8B/g//AaEBogGgAf8BSwFSAVEB/wGYAqQB/wGRApwB/wFLAk0B/wGc - Ap8B/wHMAdEB0AH/AdMB2AHXAf8BiAGNAYsB/wGoAaoBqA3/A/cB/wGzAbUBuAH/ASYBKQEtAf8CpAGl - Df8D/gH/A/4B/wP+Af8D/gH/A/4B/wP9Af8DwAH/A5YR/wGhAaIBoAH/AUsBUgFRAf8BmAKkAf8BkQKc - Af8BSwJNAf8DAAH/AaIBoQGiAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/ - AwAB/wMAAf8BhAGFAYYB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/AwAB/wMAAf8BhAGF - AYYB/wH3AfkB+gH/AeQB5gHnAf8BUAJRAf8DAAH/AwAB/wMAAf8DAAH/AZMBlAGVAf8B9wH5AfoB/wH3 - AfkB+gH/AfcB+QH6Af8BigGJAYoB/wMAAf8BnQKgAf8BzgHTAdIB/wHUAdoB2QH/AYkBjgGMAf8BqAGq - AagL/wH+Af8B/gP/Af4B/wH+Bf8B0AHfAfoB/wEAAUAB+QH/AQABPwH5Af8B1wHlAfsB/wH+A/8B3QHo - AfwB/wEAAT0B+wH/AQABLQH+Af8BiwGwAfkB/wH9Av4B/wH6AfwB/gH/ARsBVwH5Af8BAAEsAf4B/wEv - AYwB+gH/Af4H/wGkAaYBpAH/AUsBUwFSAf8BmgKmAf8BkwKeAf8BTAJOAf8BnQKgAf8BzgHTAdIB/wHU - AdoB2QH/AYkBjgGMAf8BqAGqAagN/wHXAfAB/QH/AdEB7gH9Af8B/QH+Bv8B+wH9Af4B/wHdAfMB/QH/ - AbcB5QH9Af8BoAHdAf4B/wGaAdsB/gH/AaMB3gH9Af8BvQHnAf0B/wHkAfUB/QH/Af0C/gX/AfYB+wH+ - Af8BvwHoAf0B/wH1AfsB/gn/AaEBogGgAf8BSwFTAVIB/wGaAqYB/wGTAp4B/wFMAk4B/wGdAqAB/wHO - AdMB0gH/AdQB2gHZAf8BiQGOAYwB/wGoAaoBqA3/A/gB/wGzAbYBuAH/ASYBKQEtAf8CpAGlDf8B/QH8 - Af0B/wHsAesB7AH/A9sB/wPaAf8D2gH/A9kB/wOtAf8DlgH/A/4N/wGhAaIBoAH/AUsBUwFSAf8BmgKm - Af8BkwKeAf8BTAJOAf8DAAH/AaIBoQGiAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMA - Af8DAAH/AwAB/wMAAf8BhAGFAYYB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/AwAB/wMA - Af8BhAGFAYYB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wMAAf8DAAH/AwAB/wMAAf8BhAGFAYYB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wGKAYkBigH/AwAB/wGfAqEB/wHQAdUB1AH/AdYB3AHbAf8BigGP - AY0B/wGpAaoBqBn/Av4C/wHmAe4B/AH/AdQB4gH6Af8B/gH/Af4B/wHlAe4B/AH/AR0BWQH6Af8BAAEt - Af4B/wEFAUcB+gH/AeoB8QH8Af8C/gH9Af8BxQHYAfoB/wEAATIB/AH/AQABLwH8Af8BsgHLAfsJ/wGl - AaYBpAH/AUwBVAFTAf8BnQKoAf8BlQKfAf8BTQJQAf8BnwKhAf8B0AHVAdQB/wHWAdwB2wH/AYoBjwGN - Af8BqQGqAagJ/wH6Af0C/wGkAd8B/QH/AZsB3AH+Af8BvgHoAf0B/wHxAfoB/gH/Af4P/wH+D/8B/QL+ - Af8B4QH0Af0B/wGpAeEB/QH/AZkB3AH+Af8BxAHqAf4J/wGhAaIBoAH/AUwBVAFTAf8BnQKoAf8BlQKf - Af8BTQJQAf8BnwKhAf8B0AHVAdQB/wHWAdwB2wH/AYoBjwGNAf8BqQGqAagN/wP4Af8BtAG2AbkB/wEm - ASkBLQH/AqQBpQ3/AfQB8wH1Af8BuQG4AboB/wE/AT4BQAH/AyUB/wMlAf8DJwH/AzoB/wOcAf8D/g3/ - AaEBogGgAf8BTAFUAVMB/wGdAqgB/wGVAp8B/wFNAlAB/wMAAf8BogGhAaIB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wG8Ab4BvwH/AwAB/wMAAf8DAAH/AwAB/wGEAYUBhgH/AfcB+QH6Af8B9wH5AfoB/wG8 - Ab4BvwH/AwAB/wMAAf8DAAH/AwAB/wGEAYUBhgH/AfcB+QH6Af8B5AHmAecB/wGEAYUBhgH/AwAB/wMA - Af8DAAH/AwAB/wGEAYUBhgH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGKAf8DAAH/AaACogH/ - AdIB1wHWAf8B2QHeAd0B/wGLAZABjgH/AakBqgGoJf8C/gL/AaABvwH4Af8BAAE9AfoB/wEAAT0B+gH/ - AcQB1wH7Af8B/gH/Af4B/wHxAfYB/AH/ARoBVwH6Af8BAAEtAv8BHQFZAfoB/wH2AfkB/Qn/AaUBpgGk - Af8BTQJUAf8BnwKpAf8BlwKhAf8BTwJRAf8BoAKiAf8B0gHXAdYB/wHZAd4B3QH/AYsBkAGOAf8BqQGq - AagN/wHaAfIB/gH/AaAB3gH+Af8BmgHcAf4B/wGfAd4B/gH/Ab0B6AH9Af8B3AHyAf0B/wHwAfkB/gH/ - AfgB/AL/AfkB/QH+Af8B9gH8Af4B/wHqAfcB/gH/AdEB7gH9Af8BrwHjAf4B/wGbAdwB/gH/AZoB3AH+ - Af8BqgHhAf0B/wHsAfgB/gn/AaEBogGgAf8BTQJUAf8BnwKpAf8BlwKhAf8BTwJRAf8BoAKiAf8B0gHX - AdYB/wHZAd4B3QH/AYsBkAGOAf8BqQGqAagN/wP4Af8BtAG2AbkB/wEnASoBLQH/AqQBpQ3/AfEB8AHx - Af8BoAGfAaEB/wEeAR0BHgH/A8gB/wPLAf8DhAH/A0UB/wPrAf8D/g3/AaEBogGgAf8BTQJUAf8BnwKp - Af8BlwKhAf8BTwJRAf8DAAH/AaIBoQGiAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMA - Af8DAAH/AwAB/wMAAf8BhAGFAYYB/wH3AfkB+gH/AfcB+QH6Af8BvAG+Ab8B/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wHJAssB/wH3AfkB+gH/AfcB+QH6Af8B9wH5 - AfoB/wGKAYkBigH/AwAB/wGhAaQBowH/AdMB2AHXAf8B2gHfAd4B/wGLAZABjwH/AagBqgGoKf8D/gH/ - AecB7gH9Af8B3AHnAfwB/wP+Af8B8QH2AfwB/wE7AZMB+gH/AQABLQH+Af8BAAE9AfoB/wHTAeEB+wP/ - Af4J/wGlAaYBpAH/AU4BVQFUAf8BoQKrAf8BmQKiAf8BUAJSAf8BoQGkAaMB/wHTAdgB1wH/AdoB3wHe - Af8BiwGQAY8B/wGoAaoBqBH/Ae0B+AH9Af8BuAHlAf0B/wGbAdwB/gH/AZoB3AH+Af8BmgHcAf4B/wGb - AdwB/gH/AZ4B3QH9Af8BnwHdAf4B/wGdAdwB/QH/AZoB3AH+Af8BmgHcAf4B/wGZAdwB/gH/AZ8B3gH9 - Af8ByAHrAf0B/wH4AfwB/g3/AaEBogGgAf8BTgFVAVQB/wGhAqsB/wGZAqIB/wFQAlIB/wGhAaQBowH/ - AdMB2AHXAf8B2gHfAd4B/wGLAZABjwH/AagBqgGoDf8D+AH/AbUBtgG5Af8BKAEpAS0B/wGjAaQBpQH/ - Af4L/wLxAfIB/wGhAaABoQH/AycB/wPwAf8DlwH/A1cB/wPvAf8D/hH/AaEBogGgAf8BTgFVAVQB/wGh - AqsB/wGZAqIB/wFQAlIB/wMAAf8BogGhAaIB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wG8Ab4BvwH/ - AwAB/wMAAf8DAAH/AwAB/wGEAYUBhgH/AfcB+QH6Af8B9wH5AfoB/wG8Ab4BvwH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BPwJAAf8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wGKAYkBigH/AwAB/wGiAqUB/wHVAdoB2QH/AdwB4QHgAf8BjAGRAY8B/wGnAakBpzn/ - AbEBygH5Af8BAAE9AfsB/wEAATsB+wH/AboB0QH6Af8B/gH/Af4N/wGlAaYBpAH/AU8BVgFVAf8BowKt - Af8BmwKkAf8BUQFTAVQB/wGiAqUB/wHVAdoB2QH/AdwB4QHgAf8BjAGRAY8B/wGmAacBpRX/Af0B/gL/ - AekB9wH9Af8BxgHrAf0B/wGsAeIB/gH/AZ8B3QH+Af8BmgHcAf4B/wGaAdwB/gH/AZsB3AH+Af8BoQHe - Af4B/wGyAeQB/QH/AdAB7gH9Af8B8gH6Af4V/wGhAaIBoAH/AU8BVgFVAf8BowKtAf8BmwKkAf8BUQFT - AVQB/wGiAqUB/wHVAdoB2QH/AdwB4QHgAf8BjAGRAY8B/wGmAacBpQ3/A/gB/wK3AboB/wEpASoBLgH/ - AaACogH/AfsC/AH/A/wB/wP8Af8D8AH/A6UB/wMoAf8DVwH/A5gB/wP2Af8D/RX/AaEBogGgAf8BTwFW - AVUB/wGjAq0B/wGbAqQB/wFRAVMBVAH/AwAB/wGiAaEBogH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/ - AbwBvgG/Af8DAAH/AwAB/wMAAf8DAAH/AYQBhQGGAf8B9wH5AfoB/wH3AfkB+gH/AbwBvgG/Af8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BHgIfAf8BoQKjAf8B9wH5AfoB/wH3AfkB+gH/ - AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGKAf8DAAH/AaQCpgH/AdYB2wHaAf8B3gHjAeIB/wGN - AZIBkAH/AacBqAGmOf8D/gH/AekB8AH9Af8B3wHpAfwB/wP+Ef8BpQGmAaQB/wFPAVcBVQH/AaQCrgH/ - AZ0CpgH/AVMCVQH/AaQCpgH/AdYB2wHaAf8B3gHjAeIB/wGNAZIBkAH/AaUBpwGkIf8C/gL/AfkB/QL/ - AfUB/AL/AfUB+wL/AfYB/AL/AfsB/QL/Af4f/wGhAaIBnwH/AU8BVwFVAf8BpAKuAf8BnQKmAf8BUwJV - Af8BpAKmAf8B1gHbAdoB/wHeAeMB4gH/AY0BkgGQAf8BpQGnAaQN/wP8Af8C4QHjAf8BkwGUAZgB/wE2 - AjcB/wNHAf8DRwH/A0cB/wNFAf8DPQH/Ay8B/wO+Af8D/R3/AaEBogGfAf8BTwFXAVUB/wGkAq4B/wGd - AqYB/wFTAlUB/wMAAf8BogGhAaIB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AYoBiQGKAf8DAAH/AaUBqAGnAf8B2AHdAdwB/wHfAeQB4wH/AY0BkwGRAf8BpgGnAaVZ/wGl - AaYBpAH/AVABWAFWAf8BpgKwAf8BngKnAf8BVAJWAf8BpQGoAacB/wHYAd0B3AH/Ad8B5AHjAf8BjQGT - AZEB/wGjAaQBoln/AaEBogGfAf8BUAFYAVYB/wGmArAB/wGeAqcB/wFUAlYB/wGlAagBpwH/AdgB3QHc - Af8B3wHkAeMB/wGNAZMBkQH/AaMBpAGiGf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/iX/AaEBogGf - Af8BUAFYAVYB/wGmArAB/wGeAqcB/wFUAlYB/wMAAf8BogGhAaIB/wH3AfkB+gH/AfcB+QH6Af8B9wH5 - AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/ - AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5 - AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/ - AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGKAf8DAAH/AacCqQH/AdkB3gHdAf8B4QHmAeUB/wGO - AZMBkQH/AVUBWAFWAf8BpgGoAaUB/wGmAagBpQH/AaYBqAGlAf8BpgGnAaUB/wGmAagBpQH/AaYBqAGl - Af8BpgGoAaUB/wGmAacBpQH/AaYBpwGmAf8BpgGoAaUB/wGmAacBpQH/AaYBqAGlAf8BpgGnAaUB/wGm - AacBpgH/AaYBqAGlAf8BpgGnAaUB/wGmAacBpQH/AaMCpQH/AaYBpwGlAf8BpgGnAaUB/wGmAacBpQH/ - AaYBpwGmAf8BVAFWAVQB/wFRAVgBVwH/AagCsgH/AZ8CqAH/AVYCWAH/AacCqQH/AdkB3gHdAf8B4QHm - AeUB/wGOAZMBkQH/AVMBVgFUAf8BogGjAaEB/wGiAaMBoQH/AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/ - AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/AaIBowGhAf8BogGj - AaAB/wGiAaMBoQH/AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/AaIBowGhAf8BogGjAaAB/wGiAaMBoAH/ - AaIBowGgAf8BogGjAaEB/wFRAVMBUAH/AVEBWAFXAf8BqAKyAf8BnwKoAf8BVgJYAf8BpwKpAf8B2QHe - Ad0B/wHhAeYB5QH/AY4BkwGRAf8BUwFWAVQB/wGiAaMBoQH/AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/ - AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/AaIBowGhAf8BogGj - AaEB/wGiAaMBoAH/AaIBowGhAf8BogGjAaEB/wGiAaMBoQH/AaIBowGhAf8BogGjAaEB/wGiAaMBoAH/ - AaIBowGgAf8BogGjAaAB/wGiAaMBoQH/AVEBUwFQAf8BUQFYAVcB/wGoArIB/wGfAqgB/wFWAlgB/wMA - Af8BogGhAaIB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6 - Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3 - AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AfcB+QH6Af8B9wH5AfoB/wH3AfkB+gH/AYoBiQGK - Af8DAAH/A2EB4QHRAdUB1AH/AeMB6AHnAf8BsgG3AbYB/wGOAZMBkQH/AY0BkgGQAf8BjQGRAZAB/wGM - AZEBjwH/AYsBkAGOAf8BigGPAY0B/wGJAY4BjAH/AYgBjQGLAf8BhwGMAYoB/wGGAYsBigH/AYUBiwGJ - Af8BhAGKAYgB/wGEAYkBhwH/AYMBiAGGAf8BggGHAYYB/wGBAYYBhQH/AYABhgGEAf8BWAGFAYQB/wFY - AYQBgwH/AVcBgwGCAf8BVgGCAYEB/wFWAYIBgQH/AVUBgQGAAf8BUwGAAVkB/wGOApYB/wGpArMB/wGa - AqIB/wNlAeUDYQHhAdEB1QHUAf8B4wHoAecB/wGyAbcBtgH/AY4BkwGRAf8BjQGSAZAB/wGNAZEBkAH/ - AYwBkQGPAf8BiwGQAY4B/wGKAY8BjQH/AYkBjgGMAf8BiAGNAYsB/wGHAYwBigH/AYYBiwGKAf8BhQGL - AYkB/wGEAYoBiAH/AYQBiQGHAf8BgwGIAYYB/wGCAYcBhgH/AYEBhgGFAf8BgAGGAYQB/wFYAYUBhAH/ - AVgBhAGDAf8BVwGDAYIB/wFWAYIBgQH/AVYBggGBAf8BVQGBAYAB/wFTAYABWQH/AY4ClgH/AakCswH/ - AZoCogH/A2UB5QNhAeEB0QHVAdQB/wHjAegB5wH/AbIBtwG2Af8BjgGTAZEB/wGNAZIBkAH/AY0BkQGQ - Af8BjAGRAY8B/wGLAZABjgH/AYoBjwGNAf8BiQGOAYwB/wGIAY0BiwH/AYcBjAGKAf8BhgGLAYoB/wGF - AYsBiQH/AYQBigGIAf8BhAGJAYcB/wGDAYgBhgH/AYIBhwGGAf8BgQGGAYUB/wGAAYYBhAH/AVgBhQGE - Af8BWAGEAYMB/wFXAYMBggH/AVYBggGBAf8BVgGCAYEB/wFVAYEBgAH/AVMBgAFZAf8BjgKWAf8BqQKz - Af8BmgKiAf8DZQHlAwAB/wMAAf8BCwEHAQgB/wELAQcBCAH/AQsBBwEIAf8BCwEHAQgB/wELAQcBCAH/ - AQsBBwEIAf8BCwEHAQgB/wELAQcBCAH/AQsBBwEIAf8BCwEHAQgB/wELAQcBCAH/AQsBBwEIAf8BCwEH - AQgB/wELAQcBCAH/AQsBBwEIAf8BCQEFAQYB/wEHAgQB/wEHAgQB/wEHAgQB/wEHAgQB/wEHAgQB/wEH - AgQB/wEHAgQB/wEHAgQB/wEHAgQB/wEHAgQB/wEIAQQBBQH/AQgBBAEFAf8DAAH/AwAB/wNIAYMBtAG3 - AbYB/wHiAecB5gH/AeIB5wHmAf8B4QHmAeUB/wHfAeQB4wH/Ad0B4gHhAf8B2wHgAd8B/wHZAd4B3QH/ - AdcB3AHbAf8B1AHaAdkB/wHSAdgB1wH/Ac8B1QHUAf8BzQHTAdIB/wHMAdIB0QH/AcoB0AHPAf8ByAHO - Ac0B/wHGAcwBywH/AcQBygHJAf8BwQHIAccB/wG+AsYB/wG8AsQB/wG6AsIB/wG5AsEB/wG2Ar4B/wG1 - Ar0B/wGzArsB/wGwArkB/wGtArcB/wGpArMB/wGIAosB/wNJAYgDSAGDAbQBtwG2Af8B4gHnAeYB/wHi - AecB5gH/AeEB5gHlAf8B3wHkAeMB/wHdAeIB4QH/AdsB4AHfAf8B2QHeAd0B/wHXAdwB2wH/AdQB2gHZ - Af8B0gHYAdcB/wHPAdUB1AH/Ac0B0wHSAf8BzAHSAdEB/wHKAdABzwH/AcgBzgHNAf8BxgHMAcsB/wHE - AcoByQH/AcEByAHHAf8BvgLGAf8BvALEAf8BugLCAf8BuQLBAf8BtgK+Af8BtQK9Af8BswK7Af8BsAK5 - Af8BrQK3Af8BqQKzAf8BiAKLAf8DSQGIA0gBgwG0AbcBtgH/AeIB5wHmAf8B4gHnAeYB/wHhAeYB5QH/ - Ad8B5AHjAf8B3QHiAeEB/wHbAeAB3wH/AdkB3gHdAf8B1wHcAdsB/wHUAdoB2QH/AdIB2AHXAf8BzwHV - AdQB/wHNAdMB0gH/AcwB0gHRAf8BygHQAc8B/wHIAc4BzQH/AcYBzAHLAf8BxAHKAckB/wHBAcgBxwH/ - Ab4CxgH/AbwCxAH/AboCwgH/AbkCwQH/AbYCvgH/AbUCvQH/AbMCuwH/AbACuQH/Aa0CtwH/AakCswH/ - AYgCiwH/A0kBiAEmAiQB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wE6ATcBOAH/AwcBCgNZAccBtAG3AbYB/wHQAtQB/wHZAd0B3AH/AdgB3AHb - Af8B1gHaAdkB/wHUAtgB/wHSAdcB1gH/AdAB1QHUAf8BzgHTAdIB/wHMAdEB0AH/AckBzwHOAf8BxwHN - AcwB/wHFAcsBygH/AcMByQHIAf8BwQHHAcYB/wHAAcUBxAH/Ab4BxAHDAf8BvAHCAcEB/wG5AcABvwH/ - AbcCvgH/AbUCvAH/AbMCugH/AbEBuQG4Af8BsAK3Af8BrgK1Af8BqwGzAbIB/wGiAagBqQH/AYoCjgH/ - A10BygMJAQwDBwEKA1kBxwG0AbcBtgH/AdAC1AH/AdkB3QHcAf8B2AHcAdsB/wHWAdoB2QH/AdQC2AH/ - AdIB1wHWAf8B0AHVAdQB/wHOAdMB0gH/AcwB0QHQAf8ByQHPAc4B/wHHAc0BzAH/AcUBywHKAf8BwwHJ - AcgB/wHBAccBxgH/AcABxQHEAf8BvgHEAcMB/wG8AcIBwQH/AbkBwAG/Af8BtwK+Af8BtQK8Af8BswK6 - Af8BsQG5AbgB/wGwArcB/wGuArUB/wGrAbMBsgH/AaIBqAGpAf8BigKOAf8DXQHKAwkBDAMHAQoDWQHH - AbQBtwG2Af8B0ALUAf8B2QHdAdwB/wHYAdwB2wH/AdYB2gHZAf8B1ALYAf8B0gHXAdYB/wHQAdUB1AH/ - Ac4B0wHSAf8BzAHRAdAB/wHJAc8BzgH/AccBzQHMAf8BxQHLAcoB/wHDAckByAH/AcEBxwHGAf8BwAHF - AcQB/wG+AcQBwwH/AbwBwgHBAf8BuQHAAb8B/wG3Ar4B/wG1ArwB/wGzAroB/wGxAbkBuAH/AbACtwH/ - Aa4CtQH/AasBswGyAf8BogGoAakB/wGKAo4B/wNdAcoDCQEMhAADBwEKA0gBgwNhAeEBpwKpAf8BpQKn - Af8BowKlAf8BogKkAf8BoQKjAf8BnwKhAf8BnQKgAf8BnAGfAZ4B/wGbAp0B/wGZAZwBmwH/AZgCmgH/ - AZYCmQH/AZUBmAGXAf8BkwKWAf8BkgKVAf8BkQKTAf8BjwKSAf8BjgGRAZAB/wGNAo8B/wGLAo4B/wGK - AowB/wGIAosB/wGHAYoBiQH/AYYCiQH/A2UB5QNJAYcDCQEMCAADBwEKA0gBgwNhAeEBpwKpAf8BpQKn - Af8BowKlAf8BogKkAf8BoQKjAf8BnwKhAf8BnQKgAf8BnAGfAZ4B/wGbAp0B/wGZAZwBmwH/AZgCmgH/ - AZYCmQH/AZUBmAGXAf8BkwKWAf8BkgKVAf8BkQKTAf8BjwKSAf8BjgGRAZAB/wGNAo8B/wGLAo4B/wGK - AowB/wGIAosB/wGHAYoBiQH/AYYCiQH/A2UB5QNJAYcDCQEMCAADBwEKA0gBgwNhAeEBpwKpAf8BpQKn - Af8BowKlAf8BogKkAf8BoQKjAf8BnwKhAf8BnQKgAf8BnAGfAZ4B/wGbAp0B/wGZAZwBmwH/AZgCmgH/ - AZYCmQH/AZUBmAGXAf8BkwKWAf8BkgKVAf8BkQKTAf8BjwKSAf8BjgGRAZAB/wGNAo8B/wGLAo4B/wGK - AowB/wGIAosB/wGHAYoBiQH/AYYCiQH/A2UB5QNJAYcDCQEMBAAM/wP+Af8B1gLXAf8BhQGKAYgB/wGF - AYkBiAH/AYUBigGIAf8BhQGJAYgB/wGFAYkBiAH/AYUBiQGIAf8BhQGKAYgB/wGFAYoBiAH/AYUBigGI - Af8BhAGJAYcB/wGEAYkBhwH/AYUBigGIAf8BhAGJAYcB/wGFAYoBiAH/AYUBiQGIAf8BhQGKAYgB/wGF - AYkBhwH/AYUBigGIAf8BhQGJAYgB/wGFAYkBhwH/AYUBiQGIAf8BhQGKAYgB/wHXAdgB1w3/A/4R/wP3 - Af8B6wHqAewB/wHNAcwBzgH/AccBxgHIAf8BxwHGAcgB/wHHAcYByAH/AccBxgHIAf8BxwHGAcgB/wHH - AcYByAH/AccBxgHIAf8BxwHGAcgB/wHHAcYByAH/AccBxgHIAf8BxwHGAcgB/wHHAcYByAH/AccBxgHI - Af8BxwHGAcgB/wHHAcYByAH/AccBxgHIAf8BxwHGAcgB/wHHAcYByAH/AcUBxAHFAf8D3wH/A/0R/5wA - AaUBpgGoAf8BiQGLAY0B/wOPAf8CjAGLAf8BgwKEAf8DVgH/A08B/wJKAUsB/wFGAkUB/wE7ATwBPgH/ - AS0BMAEyAf8BQgJDAf8DRwH/A0wB/wNSAf8DWQH/A4cB/wGPApAB/wGCAYUBiAH/AZsBnQGeAf8BqwGs - Aa4B/xAAEP8B+wL8Af8D7QH/AewC7QH/AewC7QH/AewC7QH/AewC7QH/AewC7QH/AewC7QH/AewC7QH/ - AcMBxQHEAf8BLgEzATEB/wEuATMBMQH/AS4BMwExAf8BLgEzATEB/wHDAcUBxAH/AewC7QH/AewC7QH/ - AewC7QH/AewC7QH/AewC7QH/AewC7QH/AewC7QH/A+0B/wP9Cf8D/hH/A/4B/wPuAf8ByQHKAcsB/wKd - AZ8B/wKQAZIB/wKRAZIB/wKQAZIB/wGQAY8BkgH/AZABjwGSAf8BkAGPAZIB/wGQAY8BkgH/AZABjwGS - Af8BkAGPAZIB/wGQAY8BkgH/AZABjwGSAf8BkAGPAZIB/wGQAY8BkgH/AZABjwGSAf8BkAGPAZIB/wGQ - AY8BkgH/AZABjwGSAf8BkAGPAZIB/wOKAf8DhwX/A/4B/wP8Af8D/gX/lAACpwGoAf8BRgFKAVAB/wIA - AQUB/wMAAf8CAAEFAf8BRQFIAUsB/wNBAf8DOAH/Ay8B/wIoAScB/wEWARkBHQH/AwAB/wMAAf8CAAEJ - Af8DJAH/AysB/wMzAf8DOwH/AUQBRQFGAf8BLAEwATMB/wIAAQIB/wECAQUBDQH/ASoBLQE1Af8BmAGZ - AZwB/wOtAf8IAAj/A/4F/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wHNAs4B/wEl - ASoBKAH/ASUBKgEoAf8BJQEqASgB/wElASoBKAH/Ac0BzgHNAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+ - Af8D/gH/A/4h/wP9Af8D5QH/AbwBvgG/Af8BjAGOAY8B/wFKAUwBTQH/ATQBNgE3Af8BIQEjASQB/wIg - ASIB/wEiASEBIwH/ASIBIQEjAf8BIgEhASMB/wEiASEBIwH/ASIBIQEjAf8BIgEhASMB/wEiASEBIwH/ - ASIBIQEjAf8BIgEhASMB/wEiASEBIwH/ASIBIQEjAf8BIgEhASMB/wEiASEBIwH/ASIBIQEjAf8BIQEg - ASEB/wMnAf8DgAX/A/4J/5QAAVgBgQGFAf8DAAH/AwAB/wMAAf8DAAH/ASwBMQE3Af8BkgGTAZEB/wOM - Af8DhgH/A1kB/wIAAQEB/wMAAf8DAAH/AwAB/wEvATIBNQH/AYICgwH/A4gB/wGPAo4B/wGJAYoBjAH/ - AgABAwH/AQcBDgEYAf8BHAEgASsB/wELAQ8BGwH/ARIBFQEcAf8MAAj/A/EB/wHJAsoB/wG4AroB/wG3 - ArgB/wG2ArcB/wG1ArYB/wG0ArYB/wGzArUB/wGyArQB/wGyArMB/wGxArIB/wGbAp0B/wE6AT0BPAH/ - ATkCPAH/ATgBPAE7Af8BOAE7AToB/wGYApkB/wGsAq0B/wGrAqwB/wGqAqsB/wGpAqoB/wGoAqkB/wGn - AqkB/wGmAqgB/wGmAqcB/wGmAqcB/wO6Af8D7QH/A/4R/wP9Af8D4AH/AbQBtgG3Af8BVQFXAVgB/wE1 - ATcBOAH/AwAB/wMAAf8HAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMlAf8D+gH/A/wF/5cAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwA - AUIBRwFMAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwAATcBOgFBAf8DAAH/AQMBCQEUAf8BJgErATQB/wEn - ASwBNQH/AQgBDAEXAf8BRQFIAU4B/wgAA/4B/wHQAtEB/wGLAo0B/wGRApUB/wGXApwB/wGWAZsBmgH/ - AZQCmQH/AZIClwH/AZAClgH/AY4ClAH/AY0CkwH/AYsCkQH/AYoCkAH/AYgCjgH/AYYCjAH/AYUBiwGK - Af8BgwKJAf8BgQGIAYcB/wGAAoYB/wFRAoQB/wFQAYMBggH/AU4CgQH/AUwBgAFSAf8BSQFRAVAB/wFI - AVABTwH/AUcBTgFNAf8BRQFMAUsB/wFDAkoB/wE8AUIBQQH/ATkCPAH/AcACwgH/A/4N/wP9Af8D4wH/ - AbYBuAG5Af8BSgFMAU0B/wEcAR4BHwH/AwAB/wH7Af0B/j3/A/4F/wPNAf8DAA3/EAADDgETAxwBJwMU - ARsDCwEPAwUBBwMCAQMDAAEBZAABgwGEAYgB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wElASoBMgH/ - CwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ASUBKQEwAf8LAAH/AwAB/wIAAQEB/wESARcBIAH/ASgBLQE2 - Af8BFwEbASgB/wIAAQgB/wgAA+AB/wGMAY8BjgH/AaoBsgGxAf8BtgK+Af8BtAK8Af8BsgK6Af8BrwK4 - Af8BrQK3Af8BqwK1Af8BqAKyAf8BpwKxAf8BpQKvAf8BowKtAf8BoQKrAf8BnwKpAf8BnQKoAf8BmgKm - Af8BmAKkAf8BlgKiAf8BlAKgAf8BkgKeAf8BkAKcAf8BjgKaAf8BjAKYAf8BigKXAf8BiAGWAZUB/wGG - AZQBkwH/AYQBkgGRAf8BggKPAf8BSwGCAYEB/wE2AjkB/wHUAtUN/wP9Af8D4gH/AbYBuAG5Af8BSgFM - AU0B/wEcAR4BHwH/AwAB/wH8Af4I/wH+A/8B/gP/Af4D/wH+A/8B/gP/Af4D/wH+A/8B/gP/Af4D/wH+ - A/8B/gP/Af4D/wH+A/8B/gn/A84B/wMADf8MAAMCAQMDRgF+A1UBtQNMAZMDPgFrAzABTQMoATwDHgEr - AxQBHAMMARADBgEIAwIBAwMAAQFQAAETARgBIQH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wIA - AQsB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AgABBwH/AwAB/wMAAf8DAAH/AwAB/wIA - AQMB/wEJARABGQH/AQYBDwEYAf8CAAEBAf8IAAGpAqsB/wGjAqkB/wG6AsIB/wGvArcB/wGnAq8B/wGm - Aq0B/wGkAawBqwH/AaEBqgGpAf8BnwKoAf8BnQKnAf8BnAKlAf8BmgGkAaMB/wGZAqIB/wGXAaEBoAH/ - AZUBnwGeAf8BlAKdAf8BkQGcAZsB/wGPAZoBmQH/AY0BmQGYAf8BjAKXAf8BigKVAf8BiAKTAf8BhwKS - Af8BhQKQAf8BgwGPAY4B/wGBAY4BjQH/AYABjAGLAf8BUQKKAf8BUgGMAYsB/wGBAo8B/wFEAkwB/wGJ - AosN/wP9Af8D4wH/AbUBuAG6Af8BSQFMAU4B/wEbAR4BIAH/AwAB/wH9Bf8B/gP/Af0D/wH+A/8B/QP/ - Af0D/wH+A/8B/QP/Af4D/wH9A/8B/QP/Af4D/wH9A/8B/gP/Af0D/wH+Cf8DzwH/AwAN/wwAAwUBBwNe - AdkBTQGeAdgB/wFPAaEB3AH/AUwBnQHWAf8DWQH1A14B2AFWAlcBuAJNAU4BlQM/AW8DMQFPAygBPQMf - ASwDFQEdAwwBEAMGAQgDAgEDAwABAT4AAQkB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8BoQGkAacB/wQAAZECkwH/AbQBuwG6Af8BvALEAf8BUQGEAYMB/wElASoBJgH/ASgBKgEl - Af8BKAEqASUB/wEoASoBJQH/ASgBKgEmAf8BKAEqASYB/wEoASoBJQH/ASgBKgEmAf8BKAEqASUB/wEo - ASoBJQH/ASgBKQEmAf8BKAEqASYB/wEoASoBJQH/ASgBKgElAf8BKQEqASYB/wEoASoBJgH/ASgBKgEm - Af8BKAEqASUB/wEoASoBJQH/ASgBKgEmAf8BKAEqASYB/wEoASoBJQH/ASgBKgElAf8BJgEqASYB/wE6 - AUMBQgH/AYMBkQGQAf8BTgGHAYYB/wE6Aj0N/wP9Af8D4gH/AbQBtwG7Af8BRwFLAVAB/wEaAR0BIQH/ - AwAB/wP+Rf8DzwH/AwAN/wwAAxEBFwFfAWIBhAH7AVEBoQHZAf8BVAGeAcAB/wFZAaQB0AH/AVUBpQHa - Af8BTwGhAdsB/wFQAaEB2wH/AUwBngHaAf8BSQGbAdYB/wNiAfYBWwJeAdkBVgJYAbkDTgGYA0EBcwMy - AVADKQE+Ax8BLQMWAR4DDQERAwcBCQMDAQQDAAEBJAABpwGjAaQB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BCQEN - ARcB/wEMAQ0BEQH/AQsBDAEQAf8DAAH/AwAB/wMAAf8DAAH/AZoBmwGfAf8EAAGOAZEBkAH/AbgCvwH/ - Ab0CxQH/AVIBhQGEAf8BRwEwARwB/wGhATgBCQH/AaIBOAEIAf8BogE4AQgB/wGhATgBCAH/AaEBOAEI - Af8BoQE4AQkB/wGhATgBCAH/AaEBOAEIAf8BogE3AQgB/wGhATgBCAH/AaEBOAEIAf8BoQE4AQkB/wGh - ATgBCAH/AaEBOAEIAf8BoQE4AQgB/wGhATgBCAH/AaEBOAEJAf8BoQE4AQkB/wGhATgBCAH/AaEBOAEI - Af8BoQE4AQgB/wGiATgBCQH/AUYBMAEbAf8BPAFEAUIB/wGFAZMBkgH/AVEBiwGKAf8BNgI4Df8D/QH/ - A+IB/wG0AbcBuwH/AUcBSwFQAf8BGgEdASEB/wMAAf8D/kX/A88B/wMADf8MAAMtAUUBUwGhAdgB/wFW - AaQB1wH/ATgBSQEvAf8BPQFIASwB/wFFAVQBPwH/AU4BhgFYAf8BUwGRAZkB/wFWAZoBtAH/AVcBoQHL - Af8BUgGgAdMB/wFMAZ0B1gH/AUkBmwHVAf8BSAGaAdYB/wFGAZgB0wH/AlwBbgH4AVwCYQHcAVYCWAG8 - Ak8BUQGcA0IBdgMzAVIDKgFAAyABLgMWAR8DDQESAwgBCwMKAQ0DAgEDEAABUAFKAUwB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8CAAEJAf8BQgFBAUMB/wEnASYBKQH/AwAB/wEEAQgBDwH/AQUBCAEOAf8BAgEEAQoB/wGY - AZoBnwH/BAABjwKSAf8BugLAAf8BwALGAf8BgAGGAYUB/wFIATEBGwH/AaUBOQEHAf8BpQE5AQcB/wGl - ATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEH - Af8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGl - ATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BSAEwARoB/wE9AUQBQwH/AYcBlQGU - Af8BgQKMAf8BNwI5Df8D/AH/A+IB/wG5AbwBwAH/AUwBTwFUAf8BHAEfASMB/wMAAf8D/kX/A9EB/wMA - Df8LAAEBA0MBdwFVAaMB1wH/AVIBnAG/Af8BOwFIASoB/wFAAUsBLgH/AUkBUwE4Af8BPAFGASkB/wE7 - AUYBKAH/ATsBRgEpAf8BPgFLAS8B/wFFAVMBPwH/AU0BhgFXAf8BVAGRAZoB/wFYAZwBtgH/AYIBpwHT - Af8BTgGcAdIB/wFIAZoB1AH/AUgBnQHZAf8BSgGiAd8B/wFMAaUB3wH/AmoBbgH5A14B3QFXAlkBvwNQ - AZ4DQwF4AzYBWQM/AW0DFwEgAwABAQwAAVIBSgFMAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ASEBJAEuAf8BMgEz - ATcB/wEoASoBLgH/AgABAwH/AwAB/wJCAUAB/wIsAS0B/wGHAYgBiwH/BAABkAKTAf8BvAHCAcEB/wHB - AcgBxwH/AYEBhwGFAf8BSAExARsB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEH - Af8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGh - ATwBDgH/AZoBRAEiAf8BmgFFASIB/wGaAUQBIgH/AZoBRAEjAf8BmgFFASMB/wGaAUUBIgH/AZsBRAEh - Af8BpAE5AQgB/wGlATkBBwH/AUcBMQEaAf8BPQFFAUQB/wGJAZYBlQH/AYICjgH/ATgCOg3/A/wB/wPi - Af8BuQG8AcAB/wFMAU8BVAH/ARwBHwEjAf8DAAH/A/5F/wPRAf8DAA3/CAADAQECA1MBpQFYAaUB2QH/ - AU4BlAGmAf8BPQFIASsB/wFOAVcBPQH/AZ4BpQGTAf8BiwGTAVcB/wFOAVcBPQH/ATwBRwEpAf8BOwFG - ASgB/wE7AUYBKAH/ATsBRgEoAf8BOwFGAScB/wE6AUYBKAH/AUsBVQE8Af8BvQHDAcAB/wG/Ac0B0wH/ - AZsBtwHFAf8BhgGtAcUB/wGCAagB0gH/AVMBogHYAf8BTwGgAdoB/wFKAZsB1QH/AUsBnAHVAf8BQgGU - AdEB/wFAAYMBqAH9A20B9wM7AWMDCgEODAABVgFMAU4B/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8CAAEOAf8DAAH/ - AwAB/wMAAf8BFAEWAR4B/wE8AT4BQgH/AS8BMQE2Af8BiAGJAY0B/wQAAZIClAH/Ab4BxAHDAf8BwwHK - AckB/wGBAYcBhgH/AUgBMQEbAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BmQFI - ASoB/wHcAd8B3gH/Ad8B4gHhAf8B3wLiAf8B3wLiAf8B3wLiAf8B3wHiAeEB/wHFAcgBxwH/AaABPgET - Af8BpQE5AQcB/wFIATABGgH/AT0BRgFEAf8BiwKXAf8BhAKPAf8BOgI8Df8D/AH/A+IB/wG5AbwBwAH/ - AUsBTgFTAf8BHAEfASMB/wMAAf8D/kX/A9EB/wMADf8IAAMFAQcDYAHUAYIBqQHbAf8BSwGKAY0B/wE+ - AUgBLAH/AU8BWAFAAf8BswG4AasB/wFOAVgBPgH/AT0BSAErAf8BPQFIASsB/wE9AUgBKgH/AT0BRwEq - Af8BPQFHASoB/wE8AUcBKQH/ATwBRwEpAf8BOwFGASgB/wE7AUYBKAH/AUgBUwE4Af8BmAGfAY0B/wGw - AbcBqgH/AUgBUwE6Af8BQQFOATYB/wE7AUsBQwH/AUABVwGGAf8BQwGQAcAB/wFJAZkB0gH/AZYBtwHk - Af8BqQHEAecB/wNdAdIDFgEfDAABWAFOAVAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AQEBBwEPAf8DAAH/AwAB/wFHAUsBUQH/BAABkwGWAZUB/wHAAcYBxQH/AcYBzAHLAf8BgwGIAYYB/wFI - ATEBGwH/AaUBOQEHAf8BpQE5AQcB/wGjAToBCQH/AaMBOQEIAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEH - Af8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AZwBQwEfAf8BrgGkAZkB/wGv - AaUBmgH/Aa8BpQGaAf8BrwGmAZoB/wGvAaYBmgH/Aa8BpQGaAf8BpgGaAY4B/wGiATsBDgH/AaUBOQEH - Af8BRwEwARoB/wE+AUcBRQH/AY0CmQH/AYUCkQH/ATsCPQ3/A/0B/wPjAf8BtwG6Ab4B/wFIAUwBUQH/ - ARoBHQEhAf8DAAH/A/5F/wPPAf8DAA3/CAADDwEUAVMBawF1AfoBhQGrAdoB/wFFAVcBSwH/AUABSwEv - Af8BmwGiAZAB/wGsAbIBogH/AT4BSQEtAf8BPgFJAS0B/wE+AUgBLAH/AT4BSAEsAf8BPQFIASwB/wE9 - AUgBKwH/AT0BSAErAf8BPQFIASsB/wE9AUgBKgH/AT0BSAEqAf8BPQFHASoB/wE8AUcBKQH/ATwBRwEp - Af8BOwFGASgB/wEyAT0BIQH/ASQBMQElAf8BQgGIAacB/wGLAa4B3gH/AagBxAHpAf8BtQHNAewB/wGz - AcsB6wH/A14B1QMOARMMAAGBAU8BUQH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wIAARUB/wEAASQBNQH/AQsBOQFGAf8BCAE4AUUB/wEAARMBIgH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8CAAENAf8CAAEGAf8DAAH/AwAB/wMAAf8DAAH/AUoBTgFXAf8EAAGUApcB/wHBAccBxgH/AccBzQHM - Af8BgwGJAYcB/wFIATEBGgH/AaUBOQEHAf8BpQE5AQcB/wGcAYkBSQH/AakBoQGXAf8BmAFJASsB/wGi - AToBDAH/AaUBOQEGAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEH - Af8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGl - ATkBBwH/AaUBOQEHAf8BRwExARoB/wE/AUcBRgH/AY4CmgH/AYcCkgH/ATwBPgE/Df8D/QH/A+MB/wG3 - AboBvgH/AUgBTAFRAf8BGgEdASEB/wMAAf8D/kX/A88B/wMADf8IAAMqAUEBjgGzAeMB/wGGAaoB0gH/ - AUABTgE3Af8BQAFKAS8B/wFAAUsBLwH/AUYBUAE2Af8BPwFKAS4B/wE/AUoBLgH/AT8BSgEuAf8BPwFJ - AS0B/wE/AUkBLQH/AT4BSQEtAf8BPgFJAS0B/wE+AUgBLAH/AT4BSAEsAf8BPQFIASwB/wE9AUgBKwH/ - AT0BSAErAf8BPQFIASsB/wE+AUgBLAH/AUACVAH/AYIBowHLAf8BoAG+AeYB/wGuAccB5wH/AbgBzgHq - Af8BqwHFAegB/wNZAccDCgEOEAABgAFOAVEB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8CAAEP - Af8BDgE5AUwB/wEmAZgBpgH/AS8BrQG5Af8BRAGaAaIB/wFSAYgBjQH/AUsBgAGEAf8BPgGGAYkB/wEc - AVMBhAH/AgABAQH/AwAB/wEHAS8BOgH/ATsBhQGOAf8BUQGEAYkB/wFTAVcBgAH/AT4BSgFOAf8BDAEi - ASsB/wMAAf8DAAH/AUUBSQFSAf8EAAGWApgB/wHDAckByAH/AckBzwHOAf8BhAGKAYgB/wFIATEBGgH/ - AaUBOQEHAf8BpAE5AQcB/wGjAZMBhAH/AesC7QH/Ad4C4AH/AbgBtwGzAf8BmgGEAUIB/wGdAT8BFwH/ - AaQBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wFHATABGgH/ - AUABSAFHAf8BkAKcAf8BiQKUAf8BPgJADf8D/QH/A+MB/wG3AboBvgH/AUgBTAFRAf8BGgEdASEB/wMA - Af8D/kX/A9EB/wMADf8IAANBAXIBlAG3AeQB/wGDAaMBvwH/AUIBTAEyAf8BpQGrAZsB/wGnAa0BnQH/ - AUcBUAE2Af8BSgFTAToB/wFAAUoBLwH/AUABSgEvAf8BQAFKAS4B/wE/AUoBLgH/AT8BSgEuAf8BPwFK - AS4B/wE/AUoBLgH/AT8BSQEtAf8BPwFJAS0B/wE+AUkBLQH/AT4BSQEtAf8BPgFIASwB/wE/AUoBLwH/ - AYkBogG0Af8BpgHBAeUB/wG1AcwB6gH/Ab8B0wHuAf8BpwHDAekB/wGIAa8B4QH/A0gBhQMCAQMQAAGE - AU8BUQH/AwAB/wMAAf8DAAH/AwAB/wMAAf8CAAEOAf8BFwFRAYkB/wEvAbABvgH/ATABswHDAf8BMAG1 - AcEB/wFSAagBrAH/AZgCnAH/AoYBggH/AwAB/wMAAf8BGgEuATUB/wETAUcBVQH/AQ4BQQFOAf8BOwGW - AaAB/wGXAZsBnAH/AZEBkwGSAf8BCAELAQkB/wMAAf8BCgEVARYB/wEXAUABRQH/AwAB/wFNAVIBWAH/ - BAABlwKZAf8BxQHLAcoB/wHLAdEB0AH/AYUBigGIAf8BSAExARoB/wGlATkBBwH/AaUBOQEHAf8BnAGI - AUgB/wHWAdkB2AH/AesC7QH/AesC7gH/AekC6wH/AcgBywHJAf8BpAGZAY0B/wGZAUYBJQH/AaIBOgEK - Af8BpAE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGl - ATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AUcBMQEaAf8BQAFJAUcB/wGSAp4B/wGLApUB/wE+ - AkEN/wP9Af8D4wH/AbcBugG+Af8BSAFMAVEB/wEaAR0BIQH/AwAB/wP+Rf8D0QH/AwAN/wQAAwEBAgNS - AaMBlQG3AeQB/wGAAZoBqgH/AUUBTwE2Af8BVQGEAUcB/wGYAZ8BjAH/AUQBTQEzAf8BSAFRATcB/wFC - AUwBMQH/AUIBSwEwAf8BQgFLATAB/wFBAUsBMAH/AUEBSwEvAf8BQAFKAS8B/wFAAUoBLwH/AUABSgEu - Af8BPwFKAS4B/wE/AUoBLgH/AT8BSgEuAf8BPwFKAS4B/wE/AUkBLQH/AUsBWAFEAf8BuQHMAeAB/wG+ - AdEB5QH/AYsBnwGiAf8BWAGlAdcB/wGEAasB4AH/AzQBVAMAAQEQAAGEAUwBTQH/AwAB/wMAAf8DAAH/ - AwAB/wEAARABJQH/AS8BqgG5Af8BLwG2AcQB/wE1AbgByAH/ATUBuQHJAf8BNgG5AcYB/wGkAa4BsgH/ - AbsCuQH/ARoBGQEYAf8DAAH/AwAB/wMAAf8BLAGTAZwB/wElAZ4BqQH/AZMBpgGtAf8BtAK4Af8DPgH/ - AwAB/wMAAf8DAAH/ARQBOQE9Af8BBwEtATkB/wKMAZEB/wQAAZgBmwGaAf8BxgHMAcsB/wHNAdMB0gH/ - AYUBiwGJAf8BSAExARsB/wGlATkBBwH/AaUBOQEHAf8BowE5AQoB/wGaAUQBIwH/AaABkgGDAf8BwQHD - AcEB/wHkAuYB/wHrAu0B/wHrAu0B/wHZAdwB2wH/AbIBsAGqAf8BmQFRATkB/wGfAT0BEgH/AaUBOQEH - Af8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGl - ATkBBwH/AUgBMQEaAf8BQQFJAUgB/wGTAaABnwH/AY0ClwH/AUACQg3/A/0B/wPjAf8BtwG6Ab4B/wFI - AUwBUQH/ARoBHQEhAf8DAAH/A/5F/wPRAf8DAA3/BAADBAEGA10B0gGXAbgB5QH/AVQBkAGSAf8BTAFV - AT0B/wGwAbYBqAH/AZwBogGRAf8BQgFNATIB/wFCAUwBMgH/AUIBTAEyAf8BQgFMATEB/wFCAUwBMQH/ - AUIBTAExAf8BQgFMATEB/wFCAUwBMQH/AUIBSwEwAf8BQgFLATAB/wFBAUsBMAH/AUEBSwEvAf8BQAFK - AS8B/wFAAUoBLwH/AUABSgEuAf8BQAFKAS4B/wGCAY8BgQH/AVEBhQFMAf8BQwFWAUkB/wFYAaUB2QH/ - AVgBZgF7AfwDGwEmFAABhwFKAUwB/wMAAf8DAAH/AgABAwH/AgABBwH/ASgBjAGdAf8BMgG7AcgB/wE6 - AbwBywH/ATMBvwHOAf8BNgG/Ac4B/wE+Ab4BzgH/AbkBxAHFAf8B1AHWAdUB/wEjASIBJAH/AwAB/wMA - Af8DAAH/ASwBlgGZAf8BKQGgAa4B/wGnAbsBugH/AdUC0wH/A04B/wMAAf8DAAH/AwAB/wEcATkBQQH/ - AQ8BSgFTAf8IAAGaApwB/wHIAc4BzQH/Ac4B1AHTAf8BhgGMAYoB/wFIATEBGwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BpAE4AQcB/wGfAT0BEQH/AZgBTgE1Af8BrgGpAaIB/wHRAdQB0wH/ - AesC7QH/AewB7QHuAf8B5gLoAf8BogGXAYoB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wFIATEBGgH/AUIBSgFJAf8BlQKh - Af8BjgKZAf8BQQJDDf8D/QH/A+MB/wG3AboBvgH/AUgBTAFRAf8BGgEdASEB/wMAAf8D/kX/A9EB/wMA - Df8EAAMNARECagF3AfkBmQG7AeQB/wFMAYMBUQH/AUUBTwE1Af8BSQFSAToB/wFHAVEBOAH/AUQBTgE0 - Af8BRAFOATQB/wFDAU0BMwH/AUMBTQEzAf8BQwFNATMB/wFCAU0BMgH/AUIBTAEyAf8BQgFMATIB/wFC - AUwBMQH/AUIBTAExAf8BQgFMATEB/wFCAUwBMQH/AUIBTAExAf8BQgFLATAB/wFCAUsBMAH/AUEBSwEw - Af8BQQFLAS8B/wFAAUoBLwH/AUoBhwGIAf8BWAGmAdkB/wNcAd8DDAEQFAABjwFJAUwB/wMAAf8CAAED - Af8BAAECARQB/wECAQ0BHgH/AQMBHgEwAf8BMAGbAakB/wE5AcUB0QH/ATkBxgHVAf8BNwHHAdUB/wE5 - AcYB1QH/AbAB0AHVAf8B9ALsAf8BywHMAc0B/wMLAf8DAAH/ATMBNgE6Af8BKgGbAaEB/wEdAYwBmwH/ - AZMBuwG+Af8B6QLnAf8D4gH/Ax8B/wMAAf8BHwEiASMB/wEmAVcBhAH/ARUBSQFSAf8IAAGbAp0B/wHK - AdABzwH/AdAB1gHVAf8BhwGMAYoB/wFIATEBGwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEH - Af8BpQE5AQYB/wGlATkBBwH/AaMBOAEIAf8BmQFCAR8B/wGWAZIBigH/AcgBywHKAf8B6wHuAe0B/wHr - Au0B/wGqAZ8BkwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AUgBMAEaAf8BQgFLAUkB/wGXAqMB/wGQAZsBmgH/AUMCRQ3/ - A/0B/wPjAf8BtwG6Ab4B/wFIAUwBUQH/ARoBHQEhAf8DAAH/A/5F/wPRAf8DAA3/BAADKAE8AZoBuQHi - Af8BmQG6Ad4B/wFHAVMBPgH/AUgBUQE4Af8BWAGHAUoB/wFRAYABQgH/AUcBUQE4Af8BRQFPATUB/wFF - AU8BNQH/AUUBTgE1Af8BRAFOATQB/wFEAU4BNAH/AUQBTgE0Af8BQwFNATMB/wFDAU0BMwH/AUMBTQEz - Af8BQgFNATIB/wFCAUwBMgH/AUIBTAEyAf8BQgFMATEB/wFCAUwBMQH/AUIBTAExAf8BQgFMATEB/wFC - AUwBMQH/AVABkgGhAf8BgQGmAdgB/wNWAbQDBgEIEAABBAEAAb8B/wEOAQABgAH/AQICAAH/AgABCgH/ - AQgBFAEmAf8BIgEuATsB/wEjAS4BPgH/AQ0BGwEtAf8BDAErAT4B/wEkAYoBnAH/AToBwAHQAf8BOwHM - AdoB/wFKAc0B2AH/Ac4B4gHkAf8D4wH/A8oB/wGoAq4B/wFDAZ4BpwH/AQABDQEgAf8BAAEPASIB/wEx - AaABqwH/AbwB0QHTAf8B5ALmAf8CzwHOAf8BrwKyAf8BSQGPAZIB/wEXAVIBWQH/ATcBSwFUAf8IAAGc - AZ8BngH/AcwB0QHQAf8B0gHYAdcB/wGIAY0BiwH/AUgBMQEbAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEH - Af8BpQE5AQcB/wGgATwBEQH/AZgBTQEyAf8BrAGnAZ4B/wHQAdMB0gH/AeoC7AH/AesC7QH/AegC6gH/ - AccBygHIAf8BnAGGAUQB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wFHATEBGwH/AUQBSwFKAf8BmAKkAf8BkQKcAf8BRAJG - Df8D/gH/A+QB/wG3AboBvgH/AUgBTAFRAf8BGgEdASEB/wMAAf8D/hX/A/4B/wP9Cf8D/gX/A/4B/wP+ - Af8D/gH/A/4J/wPSAf8DAA3/BAADQAFvAZ0BvAHiAf8BkwGyAcoB/wFGAVEBOQH/AVIBgQFFAf8BmwGi - AZEB/wFLAVQBPQH/AUcBUQE4Af8BRwFQATcB/wFGAVABNwH/AUYBUAE2Af8BRgFPATYB/wFGAU8BNgH/ - AUUBTwE1Af8BRQFPATUB/wFFAU4BNQH/AUUBTgE1Af8BRAFOATQB/wFEAU4BNAH/AUMBTQEzAf8BQwFN - ATMB/wFDAU0BMwH/AUIBTQEyAf8BQgFMATIB/wFCAUwBMQH/AVcBnQG6Af8BgwGoAdkB/wNIAYYDAgED - FgABsQH/AgABIwH/AgABDQH/AQcBFgEmAf8BLwE7AUkB/wFBAUwBgAH/ATcBQQFPAf8BGAElATUB/wEA - AQgBHAH/AgABEQH/AQABHwE3Af8BFAFLAYkB/wErAZUBpwH/AU4BrQG8Af8BTgGhAa4B/wEcAUcBVAH/ - AgABDAH/AwAB/wMAAf8BAAEZASgB/wEjAZABmgH/AUIBpAGtAf8BSwGhAakB/wEtAYwBkQH/AQgBNwFC - Af8CAAEIAf8MAAGdAqAB/wHOAdMB0gH/AdQB2gHZAf8BiQGOAYwB/wFIATEBGwH/AaUBOQEHAf8BpQE5 - AQcB/wGcAUEBGwH/AZ8BjwGAAf8BvwHBAb4B/wHjAuUB/wHrAu0B/wHsAu0B/wHdAeAB3wH/AbcBtgGx - Af8BmgGDAUAB/wGeAT4BFQH/AaQBOAEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGl - ATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BSAExARsB/wFEAUwBSwH/AZoCpgH/ - AZMBngGdAf8BRQJHDf8D/gH/A+QB/wG3AboBvgH/AUgBTAFRAf8BGgEdASEB/wMAAf8D/hX/A/4F/wP7 - Hf8D/gX/A9AB/wMADf8DAQECA1ECoAG/AeQB/wGMAaUBsgH/AUgBUgE6Af8BowGoAZkB/wGFAY0BUwH/ - AUgBUQE5Af8BSAFRATkB/wFHAVEBOQH/AUcBUAE4Af8BRwFQATgB/wFHAVABOAH/AUcBUAE3Af8BRwFQ - ATcB/wFHAVABNwH/AUYBUAE2Af8BRgFPATYB/wFGAU8BNgH/AUUBTwE1Af8BRQFPATUB/wFFAU4BNQH/ - AUUBTgE1Af8BRAFOATQB/wFEAU4BNAH/AUIBTgE1Af8BiAGsAdUB/wJ/AZAB/gM2AVgDAAEBDAABDQEO - AcMB/wIAAbcB/wIAAaEB/wIAAa8B/wIAAUkB/wEAAQEBKAH/AR8BJwFGAf8BPQFFAYkB/wFGAU4BkQH/ - ATMBPgGBAf8BEwEfAUAB/wEAAQIBKAH/AgABGQH/AgABEwH/AgABEwH/AgABEwH/AgABEQH/AgABEQH/ - AgABDgH/AgABDAH/AgABCwH/AgABCgH/AgABDQH/AgABIAH/AgABGwH/AgABCgH/AgABAgH/AQ8BEwEt - Af8MAAGfAqEB/wHQAdUB1AH/AdYB2wHaAf8BigGPAY0B/wFIATEBGwH/AaUBOQEHAf8BpQE5AQcB/wGh - AZIBgQH/AesC7QH/AesC7QH/AeoC7AH/Ac0B0AHOAf8BqAGgAZUB/wGZAUgBKQH/AaIBOgELAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BRwExARsB/wFFAU0BTAH/AZ0CqAH/AZUCnwH/ - AUYBSAFJDf8D/gH/A+QB/wG3AboBvgH/AUkBTAFRAf8BGgEdASEB/wMAAf8D/hX/A/4F/wP0Af8D4AH/ - A9EB/wPOAf8DzgH/A84B/wPOAf8DzgH/A9EB/wPVAf8DygH/AwAB/wP+Cf8DBAEGA1wBzQGkAcEB5QH/ - AYABlAGWAf8BQgFLATUB/wFHAU8BOQH/AUgBUAE5Af8BSAFSAToB/wFJAVIBOgH/AUgBUgE6Af8BSAFS - AToB/wFIAVEBOQH/AUgBUQE5Af8BSAFRATkB/wFHAVEBOQH/AUcBUAE4Af8BRwFQATgB/wFHAVABOAH/ - AUcBUAE3Af8BRwFQATcB/wFHAVABNwH/AUYBUAE2Af8BRgFQATYB/wFGAU8BNgH/AUUBTwE1Af8BSQFZ - AUsB/wGNAbEB3gH/AV8BbQGFAfsDHQEqFAABmAGXAeIB/wEfARMBiAH/AgABngH/AgABkAH/AgABngH/ - AgABpQH/AgABrwH/AgABtAH/AgABuwH/AgABwQH/AgABxgH/AgABygH/AgABzQH/AgABzwH/AgAB0QH/ - AgAB0QH/AgAB0QH/AgAB0AH/AgABzQH/AgABxwH/AgABwwH/AgABvQH/AgABtAH/AgABrwH/AgABqQH/ - AgABoQH/AgABlwH/DAABoAKiAf8B0gHXAdYB/wHYAd0B3AH/AYsBkAGOAf8BSAExARsB/wGlATkBBwH/ - AaUBOQEHAf8BowGTAYMB/wHiAeUB4wH/AbwBvQG5Af8BnQGJAUkB/wGdAUABGgH/AaQBOQEIAf8BpQE5 - AQcB/wGlATkBBwH/AaQBOAEGAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGkATkBBwH/AUgBMAEbAf8BRgFO - AU0B/wGfAqkB/wGXAqEB/wFHAUkBSg3/A/4B/wPkAf8BugG9AcAB/wFMAU8BVAH/ARsBHgEiAf8DAAH/ - A/4W/wH+Av8B/gH9Av8B4AHfAeEB/wG8AbsBvQH/AZgBlwGZAf8BggGBAYIB/wOAAf8DgAH/A4MB/wOD - Af8DVAH/A1gB/wPMAf8DAAH/A/0J/wMKAQ4DYgH2AacBwgHlAf8BWAGUAZoB/wE/AU0BQQH/ATsBRQEz - Af8BPAFEATEB/wE9AUUBMQH/AUABSAEzAf8BQgFLATUB/wFEAU0BNwH/AUcBTwE5Af8BSAFRAToB/wFJ - AVIBOgH/AUgBUgE6Af8BSAFSAToB/wFIAVEBOQH/AUgBUQE5Af8BSAFRATkB/wFHAVEBOQH/AUcBUAE4 - Af8BRwFQATgB/wFHAVABOAH/AUcBUAE3Af8BRwFQATcB/wFRAYsBiAH/AZABtAHhAf8DYQHhAw0BERgA - AY0BTwFRAf8BBwIAAf8DAAH/BAABGgEnAUgB/wECAQwBNQH/ASMBLAFRAf8BOwFDAY4B/wE9AUUBkQH/ - ASkBMQFZAf8BBQEPATsB/wIAASIB/wIAARYB/wIAARIB/wIAARIB/wIAARIB/wIAARIB/wIAAQ4B/wIA - AQ8B/wIAAQ0B/wIAAQsB/wIAAQoB/wIAAQcB/wIAAQcB/wGaAZ0BtQH/EAABoQGkAaMB/wHTAdgB1wH/ - AdoB3wHeAf8BiwGQAY8B/wFIATEBGwH/AaUBOQEHAf8BpQE5AQcB/wGaAUwBLwH/AZkBSwEwAf8BoQE7 - AQ4B/wGkATkBBgH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BSAEwARsB/wFHAU4BTQH/AaECqwH/AZkCogH/AUkCSw3/A/4B/wPk - Af8BugG9AcAB/wFMAU8BVAH/ARsBHgEiAf8DAAH/A/4W/wH+Av8B9AHzAfUB/wHMAcsBzQH/AZYBlQGX - Af8BQQFAAUIB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DhAH/AwAF/wP+Bf8DHgErAawBxQHm - Af8BrAHGAecB/wGtAccB6gH/AakBwwHkAf8BnwG5AdUB/wGQAakBvAH/AYABlQGeAf8BSwGCAYEB/wFA - AU0BQwH/ATsBRQE0Af8BPAFEATEB/wE9AUUBMQH/AUABSAEzAf8BQgFLATUB/wFEAU0BNwH/AUcBTwE5 - Af8BSAFSAToB/wFJAVIBOgH/AUgBUgE6Af8BSAFSAToB/wFIAVEBOQH/AUgBUQE5Af8BSAFRATkB/wFH - AVEBOQH/AVgBlgGgAf8BkwG4AeMB/wNXAbgDBwEJHAABlgGTAZUB/wFZAVcBWAH/CAABJAEvAT0B/wEN - ARoBLAH/ATABOgFKAf8BRgFQAYEB/wFCAUsBWAH/ASEBLAE6Af8BAAEHARwB/wIAAQcB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BnQGgAaMB/xQAAaICpQH/AdUB2gHZAf8B3AHh - AeAB/wGMAZEBjwH/AUgBMQEbAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wFIATEBGwH/AUgBTwFOAf8BowKtAf8BmwKkAf8BSgFMAU0N/wP+Af8D5AH/ - AbsBvgHBAf8BTQFQAVUB/wEcAR8BIwH/AwAB/wP+Fv8B/gL/AfEB8AHyAf8BxQHEAcYB/wGEAYMBhQH/ - BAADNAH/A8IB/wPBAf8DwQH/A8YB/wO7Af8DLgH/AwAB/wPoDf8DBAEGAzcBWwNKAYwDWgG9A10B8AG7 - AdEB7gH/AbMBzwHvAf8BsAHOAe8B/wGsAckB7AH/AaUBwQHjAf8BmgG0AdEB/wGPAagBvQH/AYABlQGg - Af8BTAKDAf8BQQFOAUQB/wE7AUYBNQH/ATwBRAExAf8BPQFFATEB/wE/AUcBMwH/AUIBSgE1Af8BRAFN - ATcB/wFHAU8BOAH/AUgBUQE6Af8BSQFSAToB/wFIAVIBOgH/AYkBpAG6Af8BlwG8AeYB/wNKAY0DAwEE - HAADogH/A4UB/wwAAUoBUwGEAf8BCgEWASgB/wEhAS4BQAH/AS8BOQFKAf8BHwEpATsB/wEAAQkBHwH/ - AgABCAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8CAAENAf8cAAGkAqYB/wHWAdsB2gH/ - Ad4B4wHiAf8BjQGSAZAB/wFIATEBGwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BSAExARoB/wFIAVABTgH/AaQCrgH/AZ0CpgH/AUsCTg3/A/4B/wPk - Af8BuwG+AcEB/wFNAVABVQH/ARwBHwEjAf8DAAH/A/4W/wH+Av8B8QHwAfIB/wHFAcQBxgH/AYUBhAGG - Af8EAAKbAZwN/wP8Af8DDAH/AwAB/wP3Bf8D/gn/EwABAQMaASUDNgFYA0kBiANXAboDXQHtAbYBzQHs - Af8BrAHGAekB/wGoAcMB5gH/AaUBwQHkAf8BoQG9Ad8B/wGaAbQB0wH/AY0BpgG8Af8BWAGTAZ0B/wFK - AYEBgAH/AT4BTAFBAf8BOQFEATMB/wE7AUQBMAH/AT0BRQExAf8BPwFHATMB/wFBAUsBOAH/AZYBtAHV - Af8BmwG+AeYB/wM4AV0DAAEBHAADrAH/A4oB/xQAASkBNQFDAf8BBwEVASgB/wEDAREBJQH/AgABFQH/ - AgABBgH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wFMAVIBgAH/IAABpQGoAacB/wHYAd0B3AH/ - Ad8B5AHjAf8BjQGTAZEB/wFJATEBGwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/ - AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5AQcB/wGlATkBBwH/AaUBOQEHAf8BpQE5 - AQcB/wGlATkBBwH/AaUBOQEHAf8BSAExARoB/wFJAVABTwH/AaYCsAH/AZ4CpwH/AU0CTw3/A/4B/wPk - Af8BuwG+AcEB/wFNAVABVQH/ARwBHwEjAf8DAAH/A/4W/wH+Av8B8QHwAfIB/wHFAcQBxgH/AYYBhQGH - Af8EAAKcAZ0B/wP+Bf8D/QH/AwAB/wMAAf8D+wH/A/0F/wP+Cf8oAAMYASIDMwFSA0gBhANXAbcDXAHq - AX8BgQGgAf4BqwHGAekB/wGnAcMB5wH/AaYBwgHmAf8BpAG/AeIB/wGeAboB2QH/AY0BqAG+Af8BWAGV - AaEB/wFLAYQBhQH/AUwBiAGHAf8BnQG8AeEB/wGfAb0B5QH/Ax8BLCQAA40B/xwAAVEBgQGNAf8BDQEa - ASsB/wIAAQYB/wMAAf8DAAH/AwAB/wIAAQ4B/wEnATABOwH/AZYBmQGiAf8oAAGnAqkB/wHZAd4B3QH/ - AeEB5gHlAf8BjgGTAZEB/wE0AS0BIwH/AUkBMQEbAf8BSQExARsB/wFJATEBGwH/AUkBMQEbAf8BSQEx - ARsB/wFJATEBGwH/AUgBMQEbAf8BSQExARsB/wFIATEBGwH/AUgBMQEbAf8BSAExARsB/wFIATEBGwH/ - AUgBMQEbAf8BSAEwARsB/wFIATEBGwH/AUgBMAEbAf8BSAExARsB/wFIATEBGwH/AUgBMAEbAf8BSAEw - ARsB/wFIATABGgH/AUgBMAEbAf8BMwEtASIB/wFKAVEBUAH/AacCsQH/AZ8BqQGoAf8BTwJRDf8D/gH/ - A+QB/wG9Ab4BwQH/AU8BUAFVAf8BHgEfASMB/wMAAf8B/AL+Gf8D8wH/A8YB/wOHAf8DAAH/A5kB/wP8 - Af8D8QH/AwAB/wMCAf8D/hn/PAADFQEdAzEBTQNHAYADVQGyA2EB5AKoAakB/QGxAcoB6wH/AakBxQHq - Af8BpgHDAegB/wGkAcEB5wH/AaABvQHiAf8DZAHnAw0BEiQAA5EB/2gAAbMCtQH/AdEB1QHUAf8B4wHo - AecB/wGyAbcBtQH/AY4BkwGRAf8BjQGSAZAB/wGMAZEBjwH/AYwBkQGPAf8BiwGQAY4B/wGKAY8BjQH/ - AYkBjgGMAf8BiAGNAYsB/wGHAYwBiwH/AYYBiwGKAf8BhQGLAYkB/wGEAYoBiAH/AYQBiQGHAf8BgwGI - AYYB/wGCAYcBhgH/AYEBhgGFAf8BUgGGAYQB/wFRAYUBhAH/AVEBhAGDAf8BUAGDAYIB/wFPAYIBgQH/ - AU8BggGBAf8BTgGBAYAB/wFMAYABUgH/AY4ClgH/AakCswH/AZoCogH/AY4Cjw3/A/4B/wPkAf8BvQG+ - AcEB/wFPAVABVQH/AR4BHwEjAf8DAAH/AfwC/hn/A/MB/wPGAf8DhwH/AwAB/wOcAf8D4gH/AwAB/wMt - Af8D/gH/A/wZ/08AAQEDEgEZAy8BSgNFAX0DVgGxA2EB4gGwAckB6QH/A1YBtAMEAQUkAAOTAf9oAAHT - AtQB/wG0ArcB/wHiAecB5gH/AeIB5wHmAf8B4QHmAeUB/wHfAeQB4wH/Ad0B4gHhAf8B2wHgAd8B/wHZ - Ad4B3QH/AdcB3AHbAf8B1AHaAdkB/wHSAdgB1wH/Ac8B1QHUAf8BzQHTAdIB/wHLAdEB0AH/AcoB0AHP - Af8ByAHOAc0B/wHGAcwBywH/AcQBygHJAf8BwQHIAccB/wG+AsYB/wG8AsQB/wG6AsIB/wG5AsEB/wG3 - Ar8B/wG1Ar0B/wGzArsB/wGwArkB/wGtArcB/wGpArMB/wGIAosB/wG+Ar8R/wPkAf8BxAHFAckB/wJV - AYIB/wEfASABJAH/AwAB/wH3AvkV/wP+Af8D9QH/A9QB/wOYAf8DAAH/A6cB/wMAAf8DkSX/ZAADEAEV - AxABFSgAA5QB/2gAA/sB/wG9Ar4B/wG0AbcBtgH/AdAC1AH/AdkB3QHcAf8B1wHcAdsB/wHWAdoB2QH/ - AdQB2AHXAf8B0gHXAdYB/wHQAdUB1AH/Ac4B0wHSAf8BzAHRAdAB/wHJAc8BzgH/AccBzQHMAf8BxQHL - AcoB/wHDAckByAH/AcIBxwHGAf8BwAHFAcQB/wG+AcMBwgH/AbwBwgHBAf8BuQHAAb8B/wG3Ar4B/wG1 - ArwB/wGzAroB/wGxArgB/wGwArcB/wGuArUB/wGrAbMBsgH/AaIBqAGpAf8BigKOAf8BngKfAf8B+QL6 - Ef8D9gH/At8B4wH/AZ8BoAGlAf8BNwE4ATwB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8D3yn/lAADlAH/aAAD/gH/A/sB/wHTAtQB/wGzArUB/wGnAqkB/wGl - AqcB/wGjAqUB/wGiAqQB/wGhAqMB/wGfAqEB/wGdAqAB/wGcAZ8BngH/AZoCnQH/AZkBnAGbAf8BmAKa - Af8BlgKZAf8BlQKXAf8BkwKWAf8BkgKVAf8BkQKTAf8BjwKSAf8BjgGRAZAB/wGNAo8B/wGLAY4BjQH/ - AYoCjAH/AYkCiwH/AYcCiQH/AYcCiQH/AZQClgH/AcACwQH/A/oR/wP+Bf8B/QH+Av8C+wL/AfkB+gH9 - Af8B5gLoAf8BrgKwAf8BsgKzAf8DswH/A7MB/wOzAf8DswH/A7EB/wOuAf8DsAH/A64B/wOwAf8D/i3/ - lAADkwH/cAADCgENA1EBoANlAfQDXwHgAzIBUJAAAwEBAgMJAQwDFgEeAyYBOAMuAUgDLgFIAyUBNwMU - ARwDBwEKAwABAVgAAwEBAgMJAQwDFgEeAyYBOANYAcADWAHRAy8BSgMUARwDBwEKAwABASwAA50B/gP2 - Af8D6wH/A+MB/wPXAf8D0AH/A8kB/wPDAf8DvQH/A7kB/wOzAf8DrwH/A6sB/wOpAf8DpwH/A6UB/wOl - Af8DpgH/A6cB/wOpAf8DrAH/A7AB/wOzAf8DuQH/A74B/wPEAf8DygH/A9AB/wPcAf8D5QH/A+8B/wP0 - Af8EAAMOARMDWgHKA8gB/wPMAf8DzAH/A1wB+AMvAUmEAAMJAQwDLwFJA1ABngNeAdgDXAH4A/IB/wPZ - Af8D5QH/A/IB/wNcAfgDYAHWA1ABmgMrAUMDBwEKSAADCgENAy8BSQNQAZ4DXgHYA1wB+APyAf8DAAH/ - AwAB/wPUAf8DXAH4A2AB1gNQAZoDKwFDAwcBCiQAA5EB/gPWAf8BxQLGAf8BswG4AbcB/wGpAqsB/wGe - AaEBnwH/AZUBmAGWAf8BTAFPAUsB/wGHAoUB/wFRAlAB/wNHAf8DQAH/AzgB/wMzAf8BMQIvAf8BJgEo - ASQB/wMAAf8BKwExAS4B/wMwAf8DNAH/AzoB/wNBAf8DRwH/A1EB/wGBAYcBhgH/AUEBTgFLAf8BmAGf - AZwB/wGnAqUB/wGwAawBrQH/AboCuQH/A8cB/wPdAf8DEwEaA1sB1gPJAf8DygH/A8QB/wPMAf8DzAH/ - A2IB9gMsAUR4AAMHAQkDNgFZA14BzgODAf4M/wP5Af8DyAH/A9MB/wP5Df8DgwH+A10BygMyAVEDBAEG - OAADBwEJAzYBWQNeAc4DhAH+DP8D+QH/AwAB/wMAAf8D4g3/A4QB/gNdAcoDMgFRAwQBBhwAA4kB/gPJ - Af8DtwH/AasBpgGnAf8BmgKbAf8DAAH/AwAB/wMAAf8BMwE2ATEB/wM5Af8DMQH/AyoB/wMhAf8DGgH/ - ARABEQEOAf8DAAH/AwAB/wMAAf8DFAH/AxsB/wMgAf8DKQH/AzEB/wM7Af8BAAEEAQMB/wENASMBHgH/ - AREBJgEhAf8BCQEYARYB/wGXAZ0BnAH/AagCqQH/A7cB/wPNAf8DTgGZA8cB/wPMAf8DnQH/A5wB/wOY - Af8DwwH/A8wB/wNZAfUDKQE/cAADGQEjA1UBsgOoAf0E/wP7Af8DuQH/AzkB/wMDAf8DAAH/AwAB/wMA - Af8DAAH/AwMB/wM5Af8DuQH/A/sF/wOoAf0DUwGqAxQBHDAAAxkBIwNVAbIDqAH9BP8D+wH/A7kB/wM5 - Af8DAwH/AwAB/wMAAf8DAAH/AwAB/wMDAf8DOQH/A7kB/wP7Bf8DqAH9A1MBqgMUARwYAAOVAf4D4wH/ - A9AB/wG9AcQBwwH/AQABDAEJAf8DAAH/AwAB/wMAAf8DAAH/AY8BkAGPAf8DiQH/A4MB/wFQAk8B/wJL - AUoB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A0wB/wNQAf8DhAH/A4oB/wKPAY4B/wMAAf8BEQEbARgB/wEu - AUEBPAH/ARYBNgExAf8BBQEXARQB/wHCAsUB/wPTAf8B4wLkAf8DWQHxA9EB/wPMAf8DrAH/A7MB/wO/ - Af8DlAH/A7kB/wPMAf8DZwHyAycBOmcAAQEDKAE8A2AB3gT/A/4B/wOpAf8DAAH/AwAB/wMAAf8DAAH/ - AxAB/wMWAf8DGgH/AxAB/wMAAf8DAAH/AwAB/wMAAf8DqQH/A/4F/wNeAdkDIgExJwABAQMoATwDYAHe - BP8D/gH/A6kB/wMAAf8DAAH/AwAB/wMAAf8DDAH/AwAB/wMAAf8DEAH/AwAB/wMAAf8DAAH/AwAB/wOp - Af8D/gX/A14B2QMiATEUAAOiAf4D+QH/A/MB/wEAAQ4BCgH/AQABDwEJAf8BAAEQAQYB/wEAARQBCwH/ - AQABAwEAAf8DAAH/ARcBHwEYAf8BxAHIAccB/wHGAcUBxwH/AccBxAHDAf8BrQG5AbEB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/Ab4BwwG/Af8DxAH/A8cB/wPKAf8DAAH/AwAB/wEVARsBFgH/ATABOQEzAf8BMAFF - AUAB/wEYAS0BKAH/AQABCwEHAf8B8gLzAf8B+AH9AfwB/wNcAecD3AH/A9MB/wPLAf8DmQH/A8MB/wPJ - Af8DnAH/A7QB/wPMAf8DXQHwAyQBNWAAAygBPQNfAegE/wPqAf8DIAH/AwAB/wMAAf8DNgH/A8QB/wP6 - Bf8D2QH/A+UF/wP6Af8DwwH/AzYB/wMAAf8DAAH/AyAB/wPrBf8DYQHkAyIBMR8AAQEDKAE9A18B6AT/ - A+oB/wMgAf8DAAH/AwAB/wM2Af8DxAH/A/oB/wPfAf8DAAH/AwAF/wP6Af8DwwH/AzYB/wMAAf8DAAH/ - AyAB/wPqBf8DYQHkAyIBMRAAA6MB/gT/Af4D/wEAAQ8BCAH/AQABEQELAf8BAAEFAQAB/wEAAQEBAAH/ - AQABGAELAf8DAAH/AwAB/wHxAfcB8QH/AfQB9gH0Af8B8AH1AfMB/wEEASABFQH/AQABFAEHAf8DAAH/ - AwAB/wMAAf8BAAEYAQgB/wMAAf8B+AH3AfQB/wP0Af8D7AH/AwAB/wMAAf8BCQEQAQsB/wEiASMBHwH/ - AS4BNwE0Af8BLAE+ATkB/wEFAR4BGQH/AfoC/gX/AzgBXQNTAfsD3AH/A9QB/wPGAf8DmQH/A8gB/wPM - Af8DowH/A7IB/wPMAf8DYQHuAyEBMVgAAxsBJgNcAd8E/wPfAf8DAAH/AwAB/wMbAf8D3BH/A88B/wPb - Ef8D3AH/AxsB/wMAAf8DAAH/A98F/wNeAdkDFAEcGAADGwEmA1wB3wT/A98B/wMAAf8DAAH/AxsB/wPc - Df8D1wH/AwAB/wMAEf8D3AH/AxsB/wMAAf8DAAH/A98F/wNeAdkDFAEcDAABnwKjAf4B/wH+Av8DAAH/ - AwAB/wEAARYBEAH/AQABGQENAf8DAAH/AwAB/wMAAf8DAAH/AQABCwEAAf8B4AHvAekB/wEAAQcBAAH/ - AQABHgEUAf8BAAEcARMB/wEAARMBCwH/AwAB/wMAAf8BAAENAQMB/wEAARIBCQH/AQABEAEIAf8B5wHu - Ae0B/wEAAQ8BCQH/AwAB/wMAAf8DAAH/AQwBEwEOAf8BHwEpAScB/wEoATMBLQH/ARMBLAEhAf8BpAGv - AakC/wH+Av8EAAMzAVMDRwH5A9gB/wPVAf8DwwH/A50B/wPJAf8DzAH/A6cB/wOvAf8DzAH/A2AB6wMf - AS1QAAMIAQsDVgG2BP8D6gH/AwAB/wMAAf8DSAH/A/wF/wP6Af8DrAH/AyQB/wMAAf8DAAH/AwAB/wMA - Af8DJAH/A6wB/wP6Bf8D/AH/A0gB/wMAAf8DAAH/A+oF/wNTAaoDBAEGEAADCAELA1YBtgT/A+oB/wMA - Af8DAAH/A0gB/wP8Bf8D+gH/A6wB/wMkAf8DAAH/AwAB/wMAAf8DAAH/AyQB/wOsAf8D+gX/A/wB/wNI - Af8DAAH/AwAB/wPqBf8DUwGqAwQBBggAAZ8CowH+Af8B/QL/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AQIBHAETAf8BAAEfARUB/wEAARkBDwH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BAAEZ - AQ8B/wEAARYBDQH/AQABFwELAf8BAAEBAQAB/wMAAf8DAAH/AwAB/wMAAf8BAQELAQkB/wEEARABCQH/ - AQABDQEEAf8DAAX/CAADLwFJA0gB9gPUAf8D1wH/A8QB/wOfAf8DyAH/A8wB/wOpAf8DrQH/A8wB/wNf - AegDHQEpSwABAQM6AWEDggT+Af8DIAH/AwAB/wNICf8DywH/AwYB/wMAAf8DAAH/AwAB/wMBAf8DBQH/ - AwAB/wMAAf8DAAH/AwYB/wPLCf8DSAH/AwAB/wMgAf8D/gH/A6gB/QMyAVEPAAEBAzoBYQODBP4B/wMg - Af8DAAH/A0gJ/wPLAf8DBgH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DBgH/A8sJ/wNI - Af8DAAH/AyAB/wP+Af8DqAH9AzIBUQgAAaMBogGjAf4C/wH+Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wEDASYBFgH/AQABIwESAf8BAAEeARMB/wEAASABEwH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8BAAEiARMB/wEAARkBDAH/AQABGAEPAf8BAAEBAQAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/Af4D/wwAAyoBQANZAfIDzwH/A9kB/wPFAf8DnwH/A8cB/wPMAf8DqwH/A6sB/wPMAf8DZQHl - AxoBJUQAAw0BEQNdAdME/wOpAf8DAAH/AxsB/wP8Bf8DsgH/AwAB/wMAAf8DJQH/A8YB/wP8Af8D2QH/ - A+UB/wP8Af8DxgH/AyUB/wMAAf8DAAH/A7MF/wP8Af8DGwH/AwAB/wOpBf8DXQHKAwcBCggAAw0BEQNd - AdME/wOpAf8DAAH/AxsB/wP8Bf8DswH/AwAB/wMAAf8DJQH/A8YB/wOdAf8DAAH/Ax8B/wP8Af8DxgH/ - AyUB/wMAAf8DAAH/A7MF/wP8Af8DGwH/AwAB/wOpBf8DXQHKAwcBCgQAAaMBogGjAf4C/wH+Af8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEEARcBCgH/AQABIQESAf8BAAEP - AQIB/wMAAf8DAAH/AQABJgEXAf8DAAH/AQABAgEAAf8BAAEdARAB/wEAARsBDgH/AQABCAEAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8BAAEHAQQB/wH+AvwB/xAAAyUBNwNUAe4DygH/A9oB/wPHAf8DnwH/ - A8YB/wPMAf8DrQH/A6kB/wPMAf8DYQHiAxgBIUAAAzMBUwODAf4D+wH/AwAB/wMAAf8D3AX/A8sB/wMA - Af8DAAH/A6YN/wLMAdcB/wLXAeMN/wOmAf8DAAH/AwAB/wPLBf8D3AH/AwAB/wMAAf8D+wH/A4MB/gMr - AUMIAAMzAVMDhAH+A/sB/wMAAf8DAAH/A9wF/wPLAf8DAAH/AwAB/wOmCf8D5wH/ApIBmgH/ApQBnA3/ - A6YB/wMAAf8DAAH/A8sF/wPcAf8DAAH/AwAB/wP7Af8DhAH+AysBQwQAAaMBogGjAf4B/wH+Af0B/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BAAECAQAB/wEAAQEBAAH/AQABAQEAAf8BAAEBAQAB/wMA - Af8BAAEMAQEB/wEAASoBGgH/AQABJQEbAf8BAAEkARoB/wEEASUBGAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A/4B/xQAAyABLwNYAekDxAH/A9wB/wPIAf8DnwH/ - A8UB/wPMAf8DrwH/A6cB/wPMAf8DXAHfAxYBHjgAAwIBAwNTAagE/wO5Af8DAAH/AzYF/wP6Af8DBgH/ - AwAB/wOmBf8C/AL/ApEB7AH/AgAB2gH/AgABtAH/AgABvgH/AgAB2gH/ApEB7QH/AvwG/wOmAf8DAAH/ - AwYB/wP6Bf8DNQH/AwAB/wO5Bf8DTgGZAwABAQMCAQMDUwGoBP8DuQH/AwAB/wM2Bf8D+gH/AwYB/wMA - Af8DpgX/AvwC/wKRAewB/wIAAdoB/wIAAbQB/wIAAb4B/wIAAdoB/wKRAe0B/wL8Bv8DpgH/AwAB/wMG - Af8D+gX/AzYB/wMAAf8DuQX/A04BmQMAAQEBowGiAaMB/gL/Af4B/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AQABAQEAAf8BAAEDAQAB/wEAAQQBAAH/AQABAwEAAf8BBgEpAR0B/wEIASUBGgH/ - AQABAgEAAf8BAAECAQAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8B+wP/GAADHAEoA1gB4wO9Af8D3gH/A8kB/wOfAf8DxAH/A8wB/wOxAf8DpQH/A8sB/wNf - AdsDFAEbNAADDQESA1wB3wT/AzkB/wMAAf8DwwX/A6sB/wMAAf8DJQX/AvwC/wIcAeIB/wIAAdQB/wIA - AboB/wIAAYUB/wIAAY0B/wIAAboB/wIAAdQB/wIcAeIB/wL8Bv8DJQH/AwAB/wOsBf8DwwH/AwAB/wM5 - Bf8DYAHWAwcBCgMNARIDXAHfBP8DOAH/AwAB/wPEBf8DrAH/AwAB/wMlBf8C/AL/AhwB4gH/AgAB1AH/ - AgABugH/AgABhQH/AgABjQH/AgABugH/AgAB1AH/AhwB4gH/AvwG/wMlAf8DAAH/A6wF/wPDAf8DAAH/ - AzkF/wNgAdYDBwEKAaMBogGjAf4C/wH+Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wIAAQEB/wIAAQIB/wIA - AQIB/wMAAf8BAAEFAQAB/wEAAQUBAAH/AQABBAEAAf8BDgErAR0B/wEAAQYBAAH/AQABAwEAAf8BAAEC - AQAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wQAAf8B/gL/ - HAADGAEhA1gB3QO2Af8D4QH/A8kB/wOgAf8DwgH/A8wB/wOzAf8DowH/A8sB/wNdAdcDEgEYMAADHgEr - A2oB+QT/AwMB/wMAAf8D+gX/AyQB/wMAAf8DxgX/ApEB7QH/AgAB1AH/AgABoQH/AgABsQH/AgABtAH/ - AgABvgH/AgABsQH/AgABoQH/AgAB1AH/ApEB7QX/A8YB/wMAAf8DJAX/A/oB/wMAAf8DAwX/A20B9wMU - ARwDHgErA14B+gT/AwMB/wMAAf8D+gX/AyQB/wMAAf8DxgX/ApEB7AH/AgAB1AH/AgABoQH/AgABsQH/ - AgABtAH/AgABvgH/AgABsQH/AgABoQH/AgAB1AH/ApEB7QX/A8YB/wMAAf8DJAX/A/oB/wMAAf8DAwX/ - A20B9wMUARwBoQGiAaMC/gH/Af4B/wMAAf8DAAH/AwAB/wMAAf8CAAEBAf8CAAEDAf8DAAH/AQABBgEA - Af8BAAEHAQAB/wEAAQYBAAH/AQABBgEAAf8BAAEDAQAB/wMAAf8BAAEFAQAB/wMAAf8DAAH/AQABAgEA - Af8BAAEBAQAB/wEAAQEBAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAF/yAA - AxQBGwNbAdYDrgH/A+IB/wPKAf8DoQH/A8AB/wPMAf8DtQH/A6EB/wPKAf8DXAHUAxABFSwAAy4BSAPy - Af8D+QH/AwAB/wMQCf8DAAH/AwAB/wP8Bf8CAAHaAf8CAAG6Af8CAAGxAf8CAAHUAf8CAAGJAf8CAAGR - Af8CAAHUAf8CAAGxAf8CAAG6Af8CAAHaBf8D/AH/AwAB/wMACf8DDwH/AwAB/wP5Af8D8gH/AyQBNgNG - AYEDQgH/A0UB/wMAAf8DAAH/A0gB/wNIAf8DAAH/AwAB/wNHAf8DvwH/AgAB2gH/AgABugH/AgABsQH/ - AgAB1AH/AgABiQH/AgABkQH/AgAB1AH/AgABsQH/AgABugH/AgAB2gX/A70B/wMAAf8DAAH/A0gB/wNI - Af8DAAH/AwAB/wNFAf8DQgH/A08BmwGhAaIBowH+Av8B/gH/AgABAwH/AwAB/wIAAQEB/wIAAQIB/wIA - AQIB/wMAAf8DAAH/AQ0BNgEmAf8BCQEyASMB/wEAAQYBAAH/AQABBwEAAf8BAAEBAQAB/wMAAf8BAAEC - AQAB/wMAAf8DAAH/AwAB/wEAAQMBAAH/AQABAwEAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/A/4B/yQAAxABFgNZAc8DpgH/A+QB/wPLAf8DogH/A74B/wPMAf8DtwH/A58B/wPJ - Af8DWQHPAw0BEigAAzYBWQPkAf8D0gH/AwAB/wMaAf8D5AH/A9oB/wMAAf8DBQH/A+QB/wLWAeEB/wIA - Ab0B/wIAAY0B/wIAAb0B/wIAAZEB/wIAAZcB/wIAAaAB/wIAAZEB/wIAAb0B/wIAAY0B/wIAAb0B/wLW - AeEB/wPkAf8DBQH/AwAB/wPaAf8D5AH/AxoB/wMAAf8D0gH/A+QB/wMuAUcDAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AjQBOQH/AgABvQH/AgABjQH/AgABvQH/AgABkAH/AgABlwH/ - AgABoAH/AgABkQH/AgABvQH/AgABjQH/AgABvQH/AtYB4QH/AzsB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wGhAaIBowH+Av8B/gH/AwAB/wIAAQEB/wIAAQIB/wIAAQEB/wIAAQMB/wEM - ATUBLQH/AQsBOAEoAf8BCwE6ASgB/wEKATcBJwH/AQABDQEAAf8BAAEKAQAB/wEAAQoBAAH/AQABAwEA - Af8DAAH/AQgBEgEGAf8DAAH/AwAB/wEAAQMBAAH/AQABCAEAAf8DAAH/AwAB/wMAAf8DAAH/AwIB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AfwB/wH9Af8oAAMNAREDWQHHA54B/wPmAf8DzAH/A6MB/wO9Af8DzAH/ - A7kB/wOeAf8DxwH/A1gBywMMARAEAAMCAQMDLQFFAz8BbwM8AWgDIwE0DAADNgFZA9kB/wPIAf8DAAH/ - AxYB/wPZAf8DzwH/AwAB/wMCAf8D2QH/AswB1wH/AgABtAH/AgABhgH/AgABtAH/AgABigH/AgABjwH/ - AgABmAH/AgABigH/AgABtAH/AgABhgH/AgABtAH/AswB1wH/A9kB/wMBAf8DAAH/A88B/wPZAf8DFgH/ - AwAB/wPIAf8D2QH/Ay4BSANYAcsDNQH/Ay0B/wMAAf8DAAH/AzUB/wMwAf8DAAH/AwAB/wM1Af8CmQGh - Af8CAAG0Af8CAAGGAf8CAAG0Af8CAAGKAf8CAAGPAf8CAAGYAf8CAAGKAf8CAAG0Af8CAAGGAf8CAAG0 - Af8CzAHXAf8DowH/AwAB/wMAAf8DMAH/AzUB/wMAAf8DAAH/Ay0B/wM1Af8DUAGkAaABoQGjAv4B/wH9 - Af8CAAEBAf8CAAECAf8CAAEEAf8CAAECAf8CAAEDAf8BFQE/ATAB/wEJAT8BLgH/AQwBPAEsAf8BCwE8 - ASwB/wEOAToBLQH/AgABBwH/AQABAQEHAf8BggGIAYMB/wOLAf8BSgFNAU4B/wFKAUwBTQH/ATcCNQH/ - AwAB/wMAAf8BAAEFAQAB/wMAAf8BjgGLAY0B/wGIAYUBhwH/A1AB/wNLAf8BHgEjASEB/wMAAf8DAAH/ - AwAB/wH2AfkB9wH/LAADCgENA1cBvwOVAf8D5wH/A80B/wOlAf8DuwH/A8wB/wO7Af8DnQH/A8YB/wNY - AcYDPwFvA2AB3gOvAf8DzAH/A8oB/wOeAf8DVwG/AxIBGQQAAy8BSQP1Af8D+gH/AwIB/wMaCf8DAAH/ - AwAB/wP8Bf8CAAHaAf8CAAG6Af8CAAGxAf8CAAHUAf8CAAGJAf8CAAGRAf8CAAHUAf8CAAGxAf8CAAG6 - Af8CAAHaBf8D/AH/AwAB/wMACf8DEQH/AwAB/wP6Af8D9QH/AyYBOAMvAUkD9QH/A/oB/wMCAf8DGgn/ - AwAB/wMAAf8D/AX/AgAB2gH/AgABugH/AgABsQH/AgAB1AH/AgABiQH/AgABkQH/AgAB1AH/AgABsQH/ - AgABugH/AgAB2gX/A/wB/wMAAf8DAAn/AxEB/wMAAf8D+gH/A/UB/wMmATgBogGhAaMB/gH9Af4B/AH/ - AgABAgH/AgABAgH/AgABBAH/AQABCAEAAf8BAAEJAQAB/wEAAQkBAAH/ARkBPQEyAf8BEwE+ATAB/wEL - AUABLwH/AQwBQAEuAf8BDwEzATEB/wGhAaIBnwH/AaYBowGlAf8BpwGoAacB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wGgAZ8BmwH/AZ8BpAGgAf8BoQGlAaIB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wH7 - Af4B/AH/MAADBwEJA1UBtQOMAf8D5wH/A84B/wOnAf8DuAH/A8wB/wO9Af8DtwH/A8wB/wPFAf8DzAH/ - A8wB/wPMAf8DzAH/A8wB/wPKAf8DWAHRAwYBCAMgAS4DYAH6BP8DPAH/AysB/wP7Bf8DNAH/AwAB/wPI - Bf8CkQHtAf8CAAHUAf8CAAGhAf8CAAGyAf8CAAG0Af8CAAG+Af8CAAGxAf8CAAGhAf8CAAHUAf8CkQHt - Bf8DxgH/AwAB/wMrBf8D+wH/AykB/wM8Bf8DXAH4AxYBHgMgAS4DYAH6BP8DPAH/AysB/wP7Bf8DNAH/ - AwAB/wPIBf8CkQHsAf8CAAHUAf8CAAGhAf8CAAGxAf8CAAG0Af8CAAG+Af8CAAGxAf8CAAGhAf8CAAHU - Af8CkQHsBf8DxgH/AwAB/wMrBf8D+wH/AykB/wM8Bf8DXAH4AxYBHgOjAf4B/QL+Af8DAAH/AgABBQH/ - AgABCAH/AgABCwH/AQABBgENAf8CAAEGAf8DAAH/AwAB/wENAUIBMwH/AQ8BQwExAf8BEAFCATQB/wGw - AbEBrwH/A7wB/wMAAf8DAAH/AwAB/wMAAf8CGwEZAf8DAAH/AQABAQEAAf8BrwGzAbEB/wO+Af8DAAH/ - AwAB/wMAAf8DAAH/ASwBOgE0Af8BAAEbAQ8B/wEAARABCAX/NAADBAEGA1QBqwODAf8D6AH/A88B/wOq - Af8DtgH/A8wB/wPMAf8DzAH/A8wB/wPMAf8DzAH/A8wB/wPMAf8DzAH/A8wB/wO8Af8DPgFsAw8BFANh - AeEE/wOZAf8DJQH/A9UF/wPEAf8DJQH/A4sF/wL8Av8CMwHmAf8CAAHaAf8CAAHAAf8CAAGOAf8CAAGV - Af8CAAG/Af8CAAHZAf8CLQHlAf8C/Ab/A4gB/wMkAf8DxAX/A9UB/wMlAf8DmQX/A14B2AMIAQsDDwEU - A2EB4QT/A5kB/wMlAf8D1QX/A8QB/wMlAf8DiwX/AvwC/wIzAeYB/wIAAdoB/wIAAcAB/wIAAY4B/wIA - AZUB/wIAAb8B/wIAAdkB/wItAeUB/wL8Bv8DiAH/AyQB/wPEBf8D1QH/AyUB/wOZBf8DXgHYAwgBCwGh - AqMB/gT/AwAB/wEAAQUBAAH/AQQBDwEHAf8BCQEVAQkB/wEJAQ8BCgH/AwAB/wEAAQ8BBAH/AwAB/wEf - AUgBOgH/ARIBSAE1Af8BFAFGATgB/wHDAcQBwgH/A9UB/wMAAf8DAAH/AwAB/wMAAf8BKAEvASgB/wEA - AQoBAAH/AwAB/wHPAcsBygH/A9YB/wMAAf8DAAH/AwAB/wMAAf8BOAFGAT8B/wEAARcBCwH/ARABIwEc - Af8D/gH/OAADAwEEA1EBoQNDAf8D5wH/A9AB/wO9Af8DzAH/A8wB/wPMAf8DzAH/A8wB/wPMAf8DpwH/ - A7wB/wPMAf8DzAH/A8wB/wNZAcIDAwEEA1UBrQT/A80B/wMlAf8DlwX/A/wB/wM+Af8DJQH/A8AF/wL9 - Av8CsQHyAf8CLAHkAf8CEwHJAf8CEwHRAf8CLAHkAf8CsQHyAf8C/Qb/A8AB/wMlAf8DPgH/A/wF/wOX - Af8DJQH/A80F/wNQAZ4DAQECAwMBBANVAa0E/wPNAf8DJQH/A5cF/wP8Af8DPgH/AyUB/wPABf8C/QL/ - ArEB8gH/AiwB5AH/AhMByQH/AhMB0QH/AiwB5AH/ArEB8gH/Av0G/wPAAf8DJQH/Az4B/wP8Bf8DlwH/ - AyUB/wPNBf8DUAGeAwEBAgOjAf4E/wGWAZcBlgH/AQMBDAEBAf8BAQEOAQIB/wEdAScBHgH/AQABAQEA - Af8BDgEWAQ0B/wEFAQQBAAH/AwAB/wEeAUkBOwH/ARIBSwE4Af8BFAFJATsB/wHbAeAB3gH/A+oB/wPu - Af8DAAH/AwAB/wMAAf8BNQE7ATcB/wMAAf8DAAH/AdIB0AHRAf8D7AH/A+oB/wMAAf8DAAH/AwAB/wEH - ARsBEgH/AQABGwEPAf8B6gL0Av8B/QL/PAADAQECA00BlgM7Af8D5gH/A84B/wPMAf8DzAH/A8wB/wPM - Af8DzAH/A74B/wMKAf8DGAH/A0YB/wO5Af8DzAH/A10B8AQAAzcBWwOGAf4D/AH/AzkB/wMoAf8D5gX/ - A9oB/wMpAf8DKAH/A8AN/wLbAeIB/wLiAeoN/wPAAf8DKAH/AykB/wPaBf8D5gH/AygB/wM5Af8D/AH/ - A4YB/gMvAUkIAAM3AVsDhgH+A/wB/wM5Af8DKAH/A+YF/wPaAf8DKQH/AygB/wPADf8C2wHiAf8C4gHr - Df8DwAH/AygB/wMpAf8D2gX/A+YB/wMoAf8DOQH/A/wB/wOHAf4DLwFJBAADogT+Af8B/QP/AR4BPwE0 - Af8BBQEEAQAB/wEfASEBHQH/AS8BMQEtAf8BHwEkASIB/wE1AU0BSAH/AwAB/wEXAVEBQQH/ARUBTQE6 - Af8BDwFPAToB/wEdAUABNQH/A/UB/wPsAf8D0wH/A7IB/wGLAZoBkgH/AwAB/wMAAf8DAAH/ARUBJAEX - Af8D7gH/A+gB/wPPAf8DsgH/AZgBoAGdAf8BAAEeARIB/wEAARYBCwH/AfkC/gH/Af0B/gL/QwABAQNK - AYoDLwH/A9kB/wPMAf8DzAH/A8wB/wPMAf8DzAH/A2IB8QMrAUMDTgGUA04B8AMRAf8DQgH/AysB/AQA - AxABFQNeAdgE/wPCAf8DJQH/A4QB/wP9Bf8DyAH/AykB/wMlAf8DiwH/A9YB/wP9Af8D5AH/A+wB/wP9 - Af8D1gH/A4sB/wMlAf8DKQH/A8kF/wP9Af8DhAH/AyUB/wPCBf8DXgHOAwkBDAgAAxABFQNeAdgE/wPC - Af8DJQH/A4QB/wP9Bf8DyQH/AykB/wMlAf8DiwH/A9YB/wPNAf8DEQH/A0YB/wP9Af8D1gH/A4sB/wMl - Af8DKQH/A8kF/wP9Af8DhAH/AyUB/wPCBf8DXgHOAwkBDAQAA6MB/gj/AR8BQQE4Af8BLwGGAUkB/wFQ - AZsBkgH/AUABRAE/Af8BPgFOAUcB/wFDAZwBkQH/AS4BjAFPAf8BGwGIAUcB/wEXAVEBPwH/ARkBUQE+ - Af8BGAGDAUEB/wEJATIBIwH/Ac8B3wHUAf8BwwHJAcQB/wGDAZ4BlQH/AQIBOwEsAf8DAAH/AwAB/wMA - Af8BAAEEAQAB/wMAAf8BzwHXAc0B/wHDAsEB/wE2ATsBNQH/AwAB/wEAAQkBAAH/AQEBDwEJAf8D+gX/ - SAADUQGhA8MB/wPMAf8DzAH/A8wB/wPMAf8DqQH/A0MBdwgAAwgBCwM6AWEDUgGoAy0BRQcAAQEDPgFr - A4QE/gH/A4cB/wMlAf8DpAn/A9oB/wM+Af8DJQH/AyUB/wMuAf8DOwH/Az0B/wMuAf8DJQH/AyUB/wM+ - Af8D2gn/A6QB/wMlAf8DhwH/A/4B/wOoAf0DNgFZDwABAQM+AWsDhQT+Af8DhwH/AyUB/wOkCf8D2gH/ - Az4B/wMlAf8DJQH/AwsB/wMAAf8DAAH/Ay4B/wMlAf8DJQH/Az4B/wPaCf8DpAH/AyUB/wOHAf8D/gH/ - A6gB/QM2AVkIAAOjAf4I/wHlAfUB7wH/AS0BhgFJAf8BRgGYAYwB/wGIAa4BogH/AZ0BuAGuAf8BjQGx - AaUB/wFNAZ4BlAH/ASkBPwE3Af8BIgGIAUwB/wEVAYIBQAH/AR8BTAE7Af8BGgFAATIB/wETAUsBOgH/ - AQ0BSQE3Af8BDgFEATMB/wEPATYBKgH/AwAB/wMAAf8BAAEGAQAB/wEAAQUBAAH/AQABBAEAAf8BAAEB - AQAB/wMAAf8DAAH/AwAB/wMAAf8B/gH/Af4J/0gAA0wBkwPSAf8DzAH/A8wB/wPMAf8DygH/A1gB3QMF - AQcgAAMLAQ8DWQG/BP8D8AH/AzkB/wMlAf8DpAH/A/0F/wP8Af8DxAH/A4oB/wMvAf8DIgH/AyMB/wMv - Af8DigH/A8QB/wP8Bf8D/QH/A6QB/wMlAf8DOQH/A/AF/wNVAbIDBwEJEAADCwEPA1kBvwT/A/AB/wM5 - Af8DJQH/A6QB/wP9Bf8D/AH/A8QB/wOKAf8DFQH/AwAB/wMAAf8DLwH/A4oB/wPEAf8D/AX/A/0B/wOk - Af8DJQH/AzkB/wPwBf8DVQGyAwcBCQgAA6MB/gj/AfsB/gH8Af8BJgFNAUAB/wE2AY8BhgH/AYQBpQGe - Af8BlQG3Aa0B/wGiAb4BtQH/AYsBtwGuAf8BNQEzATEB/wETASoBIwH/ARoBigFJAf8BFwE0AScB/wEf - AT8BMgH/ARQBSwE6Af8BEQFJATYB/wEJAUYBMgH/AQkBRQEzAf8DAAH/AQcBDQEGAf8BAAEIAQAB/wEA - AQQBAAH/AQABAwEAAf8DAAH/AwAB/wMAAf8DAAH/AQABFwEPDf9IAANUAa4D3AH/A8wB/wPMAf8DzAH/ - A40B/wMzAVIoAAMhATADYQHkBP8D6AH/AzkB/wMlAf8DhAH/A+YR/wPdAf8D5RH/A+YB/wOEAf8DJQH/ - AzkB/wPoBf8DYAHeAxkBIxgAAyEBMANhAeQE/wPoAf8DOQH/AyUB/wOEAf8D5g3/A88B/wMAAf8DABH/ - A+YB/wOEAf8DJQH/AzkB/wPoBf8DYAHeAxkBIwwAA6MB/gz/AfIC+wH/AQ4BFwEeAf8BKwE2AT0B/wFK - AZcBjgH/AZkBugGwAf8BoQHAAbYB/wGMAbgBqwH/ATMBSAFAAf8BAAEQAQgB/wMAAf8DAAH/AQABDAEE - Af8BAAEQAQMB/wEAAQ8BAAH/AQABDgEAAf8BAAELAQAB/wEAAQgBAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wH5Af0B+g3/SAADUwGsA9gB/wPMAf8DzAH/A8gB/wNZAcwvAAEBAy8BSgNdAe0E/wPw - Af8DhwH/AyUB/wMoAf8DlwH/A9UB/wP7Bf8D5AH/A+wF/wP7Af8D1QH/A5cB/wMoAf8DJQH/A4cB/wPw - Bf8DXwHoAygBPB8AAQEDLwFKA10B7QT/A/AB/wOHAf8DJQH/AygB/wOXAf8D1QH/A/sB/wPfAf8DAAH/ - AwAF/wP7Af8D1QH/A5cB/wMoAf8DJQH/A4cB/wPwBf8DXwHoAygBPBAAA6MB/gj/AfsE/wH+Av8B5AHo - AesB/wEOAisB/wFCAZsBjAH/AYwBsAGiAf8BnAG7AbIB/wGbAbsBsgH/AYYBrgGjAf8BEwEWAREB/wMA - Af8DAAH/AwAB/wMAAf8BAAEDAQkB/wEAAQIBBwH/AQABAQEHAf8CAAEGAf8CAAEFAf8CAAEDAf8DAAH/ - AwAB/wMAAf8BAAEDAQAB/wH5Af0B+gL/Af4D/wH+Cv9IAANMAZMDwAH/A8wB/wPMAf8DzAH/A6YB/wNR - AaIDDgETKAADAQECAy8BSgNhAeQE/wP+Af8DwgH/AzkB/wMlAf8DJQH/AysB/wNFAf8DgAH/A4MB/wNF - Af8DKwH/AyUB/wMlAf8DOQH/A8IB/wP+Bf8DXAHfAygBPQMAAQEgAAMBAQIDLwFKA2EB5AT/A/4B/wPC - Af8DOQH/AyUB/wMlAf8DKwH/Az0B/wMAAf8DAAH/A0UB/wMrAf8DJQH/AyUB/wM5Af8DwgH/A/4F/wNc - Ad8DKAE9AwABARAAA6MB/hD/A/4B/wG8AcQBxwH/ARgBNwE1Af8BRwGcAZIB/wGRAbIBqgH/AZQBuAGt - Af8BjAG0AacB/wEdASYBIwH/AQgCAAH/AQABDAEVAf8BAAEFARIB/wEAAQEBBwH/ARMBPgE5Af8BAAEf - AR0B/wEAAQEBBQH/AgABBQH/AQABCwEMAf8DAAH/AwAB/wMAAf8DAAH/AfYB+wH2Ff9IAAMzAVIDRgH/ - A9MB/wPMAf8DzAH/A8wB/wPIAf8DXwHoAzUBVysAAQEDIQEwA1kBvwOEAf4E/wP8Af8DzQH/A5kB/wM8 - Af8DJwH/AyIB/wMjAf8DJwH/AzwB/wOZAf8DzQH/A/wF/wOEAf4DVgG2AxsBJi8AAQEDIQEwA1kBvgOF - Af4E/wP8Af8DzQH/A5kB/wM8Af8DJwH/AwAB/wMAAf8DJwH/AzwB/wOZAf8DzQH/A/wF/wOFAf4DVgG2 - AxsBJgMAAQEUAAOjAf4S/wH8Af8B/gP/AfIB+AH6Af8BDwEiASkB/wEoATcBOAH/AYsBqAGjAf8BhQGt - AaIB/wEmASgBJgH/ATMBSgFEAf8BAAEPARMB/wEAAQUBDgH/AgABCgH/AQABGQEUAf8BEQE7ATUB/wEA - AQgBCgH/AQABAgEDAf8BAAEZARUB/wEEASQBIAH/AgABBwH/AwAB/wH2AvoC/wH+Fv9IAAMEAQYDXgHa - A7oB/wPOAf8DzAH/A8wB/wPMAf8DzAH/A7EB/wNTAaosAAMLAQ8DPgFrA14B2AOGAf4M/wP7Af8D2AH/ - A98B/wP7Df8DhQH+A10B0wM6AWEDCAELOAADCwEPAz4BawNeAdgDhgH+DP8D+wH/AwAB/wMAAf8D4w3/ - A4YB/gNdAdMDOgFhAwgBCxwAA6MB/hz/A/0B/wMAAf8BGwEPAREB/wEmAR0BHwH/ARcBGAEWAf8BLQFR - AUkB/wEXAUIBOwH/ARABOgE0Af8BFwE7ATIB/wEFASMBIQH/AgABBgH/AgABBwH/AgABBQH/AgABAQH/ - AQABAQEKAf8DAAH/A/4d/0wAAyEBMANZAesDoAH/A9cB/wPgAf8D4gH/A84B/wNAAf0DRgGAMwABAQMQ - ARUDNwFbA1QBrgNhAeEDYAH6A/UB/wPkAf8D7AH/A/UB/wNgAfoDXAHfA1MBqAM0AVQDDQERAwABAUMA - AQEDEAEVAzcBWwNVAa0DYQHhA2AB+gP1Af8DAAH/AwAB/wPWAf8DYAH6A1wB3wNTAagDNAFUAw0BEQMA - AQEgAAOjAf4o/wE4AVABTAH/AScBTwFHAf8DAAH/AQABBwEQAf8BAAECAQsB/wEAAQEBDAH/AgABBwH/ - AgABBgH/AgABBwH/AgABBQH/AQABAQEAAf8B+wP/Afsj/1AAAxMBGgNMAZIDXwHgAysB/ANXAegDUAGj - AyEBMUAAAwMBBAMQARUDIAEuAy8BSgM3AVoDNgFZAy4BSAMeASsDDQESAwIBA1gAAwMBBAMQARUDIAEu - Ay8BSgNRAaIDUwGsAzMBUwMeASsDDQESAwIBAywAA6MB/iD/AfkE/wH9Af4C/wH+Av8B+wH/Af4B/wH8 - AfgB9wH/AeMB6QHuAf8BLwE1AToB/wEAAQEBCgH/ATsBSgFMAf8B5wLxAf8B+QH+Av8B9gH6AfsB/wH7 - Af4B+QL/Av4F/wH+H/8BQgFNAT4HAAE+AwABKAMAAYAEAAEBAgABAQEAAQEGAAEQFgAD/wEABP8MAAT/ - DAAB+AIAAR8MAAHwAgABDwwAAfgCAAEPDAAB/AGAAQABfwwABP8MAAH/AcABAwH/DAAB/wHAAQMB/wwA - Af8BwAEDAf8MAAH/AcABAwH/DAAB/wHAAQMB/wwAAf8BwAEDAf8MAAH/AcABAwH/DAAB/wHAAQMB/wwA - AYACAAEBDAABgAIAAQEMAAHAAgABAwwAAeACAAEHDAAB8AIAAQ8MAAH4AgABHwwAAfwCAAE/DAAB/gIA - AX8MAAH/AgAB/wwAAf8BgAEBAf8MAAH/AcABAwH/DAAB/wHgAQcB/wwAAf8B8AEPAf8MAAH/AfgBHwH/ - DAAB/wH8AT8B/wwAAf8B/gF/Af8MAAT/DAAF/wGAAQEE/wHvCf8CAAH/AeACAAEDAf8B5wb/Af4CAAF/ - AcACAAEBAf8Bhwb/AfgCAAE/AYACAAEBAf8Bhwb/AfgCAAEPBAAB/wEPBv8B8AEBAcABDwQAAf8BDwL/ - AfADAAHgAQ8B8AEHBAAB/wEPAv8B4AIAAQMBwAEPAf4BAwQAAf8BBwL/AeACAAEDAYABAwH/AQEEAAH+ - AQMC/wHgAgABAwGAAQEB/wGBBAAB8AIAAQ8B4AIAAQMBgAEAAf8BgAQAAeACAAEHAeACAAEDAYABAAH/ - AYAEAAHgAgABAwHgAgABAwGDAQABfwHABAABwAIAAQMB4AIAAgMBgAE/AcAEAAHAAgABAQHgAgACAwGA - AR8BwAQAAcACAAEBAeACAAIDAeABDwHgBAABgAIAAQEB4AIAAgMB8AEDAeAEAAGAAgABAQHgAgACAwH4 - AQEBwAQAAYACAAEBAeACAAIDAfwBAAHABAABgAIAAQEB4AIAAQMBgwH+AQABwAQAAYACAAEBAeACAAED - AYEB/wYAAYACAAEBAeACAAEDAYEB/wGABQABgAIAAQEB4AIAAQMBgAH/AYAFAAGAAgABAQHgAgABAwHA - Af8B4AEBBAABgAIAAQEB4AIAAQMBwAE/AfABAwQAAYACAAEBAeACAAEDAeABDwH4AQcEAAHAAgABAQP/ - AfgB8AIAAQ8EAAHAAgABAQT/AfgCAAEPBAABwAIAAQME/wH8AgABHwGAAwAB4AIAAQME/wH+AgABfwGA - AgABAQHwAgABBwX/AYABAAH/AcACAAEDAfgCAAEPBf8B8AEPAf8B9wj/AfcD/wH3C/8B4QHDAv8B4QHD - Bf8B4AIAAQMB/wHhAcMC/wHhAcMF/wHAAgABAwH/AeABAwL/AeABAwX/AcACAAEDAf8B4AEHAv8B4AEH - Bf8BwAIAAQMB/wHwAQ8C/wHwAQ8F/wHAAgABAwH/AfgBBwL/AfgBBwH/AfADAAHAAgABAwH/AeABAQL/ - AeABAQH/AeACAAEDAcACAAEDAf8BwAEAAX8B/wHAAQABfwHgAgABAwHAAgABAwH/AYABAAE/Af8BgAEA - AT8B4AIAAQMBwAIAAQMB/wIAAR8B/wIAAR8B4AEfAf8BwwHAAgABAwH8AgABPwH8AgABPwHgAR8B/wHD - AcACAAEDAfwCAAF/AfwCAAF/AeABHwH/AcMBwAIAAQMB+AIAAf8B+AIAAf8B4AEfAf8BwwHAAgABAwH4 - AQABAQH/AfgBAAEBAf8B4AEfAf8BwwHAAgABAwH4AQABAwH/AfgBAAEDAf8B4AEfAf8BwwHAAgABAwHw - AQABBwH/AfABAAEHAf8B4AEfAf8BwwHAAgABAwHwAQABDwH/AfABAAEPAf8B4AEfAf8BwwHAAgABAwHg - AQABHwH/AeABAAEfAf8B4AEfAf8BwwHAAgABAwHgAQABDwH/AeABAAEPAf8B4AEfAf8BwwHAAgABAwHg - AQABBwH/AeABAAECAR8B4AEfAf8BwwHAAgABAwHgAQABAQH/AeACAAEPAeABHwH/AcMBwAIAAQMB8AEB - AYAB/wHwAQEBgAEPAeABHwH/AcMBwAIAAQMB8AEDAYAB/wHwAQMBgAEHAeACAAEDAcACAAEHAfABBwHA - Af8B8AEHAcABBwHgAgABAwHAAgABDwH4AQ8B4QH/AfgBDwHAAQcB4AIAAQMBwAIAAT8B+AEfAv8B+AEf - AYABBwP/AfgBwAIAAX8B/AE/Av8B/AE/AYABDwT/AcACAAH/AfwBfwL/AfwBfwGAAR8E/wHAAQABAQf/ - AYABHwT/AeABAAEDB/8BwAE/Dv8B+Ar/Af4Bfw7/AeABAwL/AfcBDwX/AfwBfwP/AYABAAL/AcMBBwH/ - AfAB4QGDAYcB+AE/Af8BHwH/AgABfwH/AYABBgH/AfAB4QGDAYcB+AEfAf4BDwH8AgABPwH/AYABAAE/ - AfAB4QGDAYcB+AEPAfwBDwH4AgABHwH5AYABAAEfAfAB4QGDAYcB/AEPAfgBDwH4AgABDwH4AgABHwHw - AeEBgwGHAfwBBwHwAR8B8AIAAQcB8AIAAR8B8AHhAYMBhwH/AQMB4AE/AeACAAEHAfACAAEHAfABwAGD - AYcB/wEBAcABfwHgAgABAwHwAgABAwHwAYABgwEBAf8CgAH/AcACAAEDAfABAwHgAQMB8AGAAYMBAQH/ - AcABAQH/AcACAAEBAfABDwHwAQEB8AGAAYMBAQH/AeABAwH/AcACAAEBAcABHwH4AQEB8AGAAYMBAQH/ - AfABBwH/AcACAAEBAYABHwH8AQMB8AHhAYMBAwH/AfgBDwH/AYACAAEBAYABPwH8AQcB8AHhAYMBhwH/ - AfABDwH/AYACAAEBAYABPwH+AQMB8AHhAYMBhwHnAfABBwH/AYACAAEBAcABPwH+AQAB8AHhAYMBhwHD - AeABAQH/AcACAAEBAfABPwH8AQAB8AHhAYMBhwGBAYABAAH/AcACAAEBAeABHwH8AQEB8AHhAQEBhwGA - AQEBgAEHAcACAAEBAcABHwH4AQEBwAFhAQEBhwGAAQcBwAEDAcACAAEDAcABDwH4AQ8BwAFhAQEBhwHA - AQ8B4AEBAeACAAEDAcABAwHgAQ8BwAFhAQEBhwHwAQ8B4AEBAfACAAEHAeACAAEHAcABYQEBAYcB8AEP - AeABAAHwAgABDwHgAgABBwHwAeEBgwGHAfABBwHgAXAB+AIAAQ8B/AIAAQcB8AHhAYMBhwH4AQAB4AH4 - AfwCAAEfAfwCAAEPAfAB4QGDAYcB/AEAAeAB+QH+AgABPwH8AgABnwHwAeEBgwGHAf8BAAHgAv8CAAH/ - Af4CAAH/AfAB4QGDAYcB/wHhAeABPwH/AcABAwL/ATABAAH/AfAB4QGDAYcC/wHwAR8B/wH4AQ8C/wHw - AWEB/wHwAeEBgwGHAv8B+AEfBf8B8AF/Af8B8AHjAccBhwL/Af4R/wQADP8EAAX/AYABAQX/BAAF/wIA - Av8BHwH8Af8EAAX/AgAB/wH+AR8B+AE/BAAF/wGAAQEB/wH4AQ8B8AEfBAAF/wHwAQ8B/wHwAQ8B8AEP - BAAB4AL/AQcB/wHwAQ8B/wHwAQ8B8AEHBAABwAF/Af4BAwH/AfABDwH/AeABBwHgAQcEAAGAAT8B/AED - AfwCAAF/AcABBwHAAQMEAAGAAR8B+AEBAYACAAEDAcABAwHAAQMEAAGAAQ8B+AEBAwABAQGAAQEBgAEB - BAABgAIAAQEDAAEBAYABAQGAAQEEAAGAAgABAQMAAQEBgAIAAQEHAAEBAwABAQGAAgABAQQAAYACAAEB - AwABAQGAAgABAQQAAYACAAEBAwABAQGAAgABAQQAAYACAAEBAwABAQH/AfgBHwH/BAABgAIAAQEDAAEB - Af8B+AEfAf8EAAGAAgABAQMAAQEB/wH4AR8B/wQAAcACAAEDAwABAQH/AfABDwH/BAABwAIAAQMDAAEB - Af8B8AEPAf8EAAHgAgABBwMAAQEB/wHgAQcB/wQAAfACAAEHAwABAQH/AeABBwH/BAAB8AIAAQ8DAAEB - Af8BwAEDAf8EAAH4AgABHwMAAQEB/wGAAQEB/wQAAfwBDwHwAT8DAAEBAf8BgAEBAf8EAAH/AT8B/AH/ - AwABAQH/AgAB/wQABP8DAAEBAf8CAAH/BAAE/wMAAQEB/wHAAQMB/wQABP8BgAIAAQEB/wHwAQ8B/wQA - BP8BwAIAAQcE/wQADP8B+AIAAT8B8AIAAQ8B8AIAAQ8B8AIAAQ8B+AIAAT8B8AIAAQ8B8AIAAQ8B8AIA - AQ8B/wHwAQcC/wH4AR8C/wH4AR8C/wH4AR8C/wHwAQcB/wHAAgABAwHAAgABAwHAAgABAwH/AfABDwH/ - AYACAAEBAYACAAEBAYACAAEBAf8B8AEPAf8MAAGAAgABAf8AjQAE/wGAAgABAQGAAgABAQGAAgABAQgA - BP8B/gIAAQ8IAAT/AfgCAAEDCAAE/wH4AgABBwUAASACAAT/AfgBHAEOAQMIAAHwAR8C/wHwAQwBBgED - CAAB4AEAAv8B8AIAAQMIAAHgAQABBwH/AfACAAEBCAAB4AIAAT8B4AIAAQEIAAHgAgABAQHgAgABAQgA - AcADAAHgAgABAQgAAcADAAHgAgABAQgAAcADAAHgAgABAQgAAcADAAHgAgABAQgAAcACAAEBAeACAAEB - CAABwAIAAQEB4AIAAQEIAAGAAgABAQHgAgABAQgAAYACAAEDAeACAAEDCAABgAIAAQMB4AIAAQMIAAGA - AgABAwHAAgABAwgAAYACAAEDAeACAAEHCwABAwGAAgABBwsAAQcBwAIAAQcLAAEHAeICAAEPCwABBwHz - AgABHwYAARAEAAEHAfMBgAEAAX8GAAEQAQAB8AIAAQcB8wHgAQAB/wYAARABAAH/AcABAAEPAfsB+AED - Af8IAAH/Af4BAAEPAfsD/wgAAv8B4AEPAfsD/wgAA/8BnwH7A/8IAAT/AfsD/wgABP8B+wP/AcEE/wHg - AQcC/wHgAQcB/wQAAYAE/wGAAQEC/wGAAQEB/wUAAX8C/wH+AgABfwH+AgABfwUAAT8C/wH8AgABPwH8 - AgABPwUAAR8C/wHwAgABHwHwAgABHwUAAQ8C/wHwAgABDwHgAgABDwUAAQcC/wHgAgABBwHgAgABBwQA - AYABAwL/AcACAAEDAcACAAEDBAABwAEBAv8BgAIAAQMBgAIAAQMEAAHgAQAC/wGAAgABAQGAAgABAQQA - AfABAAF/Af8BgAIAAQEBgAIAAQEEAAH4AQABPwH/DAAB/AEAAR8B/wsAAQIB/gEAAQ8B/wwAAf8BAAEH - Af8MAAH/AYABAwH/DAAB/wHAAQEBBwwAAf8B4AEAAQEMAAH/AfAOAAH/AfgOAAH/AfwOAAH/Af4CAAGA - AgABAQGAAgABAQQAAv8CAAGAAgABAQGAAgABAQQAAv8BwAEwAYACAAEDAYACAAEDBAAC/wHAAT8BwAIA - AQMBwAIAAQMEAAL/AcABfwHgAgABBwHgAgABBwQAAv8BwAH/AeACAAEPAeACAAEPBAAC/wHAAT8B8AIA - AQ8B8AIAAQ8EAAL/AcABHwH4AgABPwH4AgABHwQAAv8BwAEPAf4CAAF/Af4CAAF/BAAC/wHgAQ8B/wIA - Av8CAAH/BAAC/wHwAR8B/wHgAQcC/wHgAQcB/wQACw== - - - - 98 - - - - AAABAAoAEBAQAAEABAAoAQAApgAAACAgEAABAAQA6AIAAM4BAAAwMBAAAQAEAGgGAAC2BAAAEBAAAAEA - CABoBQAAHgsAACAgAAABAAgAqAgAAIYQAAAwMAAAAQAIAKgOAAAuGQAAEBAAAAEAIABoBAAA1icAACAg - AAABACAAqBAAAD4sAAAwMAAAAQAgAKglAADmPAAAAAAAAAEAIAB6PgAAjmIAACgAAAAQAAAAIAAAAAEA - BAAAAAAAwAAAAAAAAAAAAAAAEAAAAAAAAAAAAAD/AACA/wCAAP8AgID/gAAA/4AAgP+AgAD/gICA/8DA - wP8AAP//AP8A/wD/////AAD//wD/////AP//////BwcHB/gHBwcHBwcHiHBwcHBwcHB/d4BwBwcHBwj/ - 9wdwclBwcXj4B/cEN4+HcH9wj3d/h3cAf3d4//gGd3ePcFJ/+Hd3j/dwUlj//////4clKId3d3j3cFJX - 9wd3CPcHJSV///f/cHBwcHeP/4cHBwcHBwd2FhYWYWFhYWFhYWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAEAAAA - AACAAgAAAAAAAAAAAAAQAAAAAAAAAAAAAP8AAID/AIAA/wCAgP+AAAD/gACA/4CAAP+AgID/wMDA/wAA - //8A/wD/AP////8AAP//AP////8A//////8HBwcHB0NDR/+DQ0NDBwcHQ0NDQ0NDQ0OP9zQ0NHBwcDQ0 - NDQ0NDQ0f/hDQ0MHBwdDQ0NDQ1JSUlj/cHQ0cHBwNDQ0NDQlJSUn//cI+AcHByUlJSUlNhYWF4/4f/9w - cHBSUlJSUkFhYWB/////dwcHYWFhYWFyUlJXB////4BwcBYWFhYWBwcHAHB4+P/4BwdwcHBxYXAHB3cH - Bwd//3Bw+AcHBhYHiP//9wcHB/+AcP+HAHUlf///iIBwcHf/9wf/+HcCCP/4hHBwcHBwj/dwj//3dY// - hwN4hwcHB//3B0f/////+AcHj/dwcH//hwdweP////NDQ0d3Bwj/+HBwBweP///3QHBwcHf//4cHB3Bw - d////4d3h4////+Ih3AHBwf///////////////8HQ0ND//j////////////4cDQ0NI/3N4iP+P+PiP/3 - cHAHBwd/+EBwcHc1YWf/9wcHcHBwf/9zQ0NAcHB4/4cHB3BwcHj/9wcHePcHf/9wcHAHBwcHj/+HeP+A - eP/3cHBwcHBwcH/////4eP//hwcHBwcHBwcHj///////+AcHBwcHBwcHBwiP////+HBwcHBwcHBwcHBw - d4iIh3YWFhYWFmFhYWFhYWFhYWFhYWFhYWEWFhYWFhYWFhYWFhYWFhYWYWFhYWFhYWFhYWFhYWFhYQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAKAAAADAAAABgAAAAAQAEAAAAAAAABgAAAAAAAAAAAAAQAAAAAAAAAAAAAP8AAID/AIAA/wCA - gP+AAAD/gACA/4CAAP+AgID/wMDA/wAA//8A/wD/AP////8AAP//AP////8A//////9DQ0NDQ0NDBwcH - Bwj//3cWFhYHBwcHBwcWFhYWFhYWUlJSUlL//4BhYWFwcHBwcHBhYWFhYWUlJSUlJSV//4dwUlIHBwcH - Bwc0NDQ0MHBwcHBwcHB///gHJSVwcHBwcHBDQ0NDRwcHBwcHBwcI//9wUlICUlJSUlI0NDQ0NDQ0NDQ0 - NDQ2//+HBwdXYWFhZSVDQ0NDQ0NDQ0NDQ0NDf//3cH//8HBwcHA0NDQ0NDQ0NDQ0NDQ0f///gH//9wcH - BwdDRwcHBwcHBwcHBwcHB///+I//93BwcHAlJSUlJSUlJSUlJQcHB4//////+AcHBwdSUlJSUlJSUlJS - UnBwcHj/////+HBwcHAlJSUlJSUlJSUlJQcHBweP/////3cHBwdQcHBwcFJSUlJSUnBwcHB3//////cH - BwcnBwcHByUlJSUlJQcHBwcHB3d///9wcHB1JSUlJQcHBwcHB3d3d0NDQ0NI//+AcHD4cHBwclJSUhZ4 - j////3YWFhYW///3Bwf/hwcHBSUlJXj//////4FhYWFhf//4Bwf//3FhYWFhaP////iIeCUlJSUlKP// - cHD///dhZwcHj///+Hc0MFYWFgcWB///c0P///+HAHB4////cHBwdyFhYXBheP//dDSP////d3eP//+A - cHB//4VwcGFwf///cHAH//////////gHBweP//cHBxYI///3BwdweP///////4BwcHB/j4YWFgeP//+H - BwdwcI///////4Q0NDQ0dwcHB3j///hwcHAHBwf//////4A0NHBwNAcHeP///4cHBwcHBwcY//////dw - cAcHQ3eP////+HNDcHBwcHBwf//////4iIiIj////////4j/hDQHBwcHf/////////////////////// - g0NwcHBwf///////////////////////93A0NDQ0f///iP//////////////////hwdDQ0NDT//4B3iI - //////////////h0cHA0NDQ0OP//cHB2d3h4iIeHd3eP//cHBwdHB0NDR///gHBwcHBwcDQ0NDf///Q0 - NDQHBwcHB///90NBYQcHB0NDQ0j//3NDQ0NwcHBwcI///zQ2FnFgeHBwcH///3Q0NDQ0NDQ0ND///4cB - YQYY/4cHCP//90NDQ0NDQ0NDQ0f///h2FniP/3cHf///hwcHBwcHBwcHBwd/////////93B/////cHBw - cHBwcHBwcHB4////////h3/////3BwcHBwdwcHBwcHBwj/////////////9wcHBwcHAHBwcHBwcHB/// - /////////4Q0NDQ0NDQHBwcHBwcHB0j/////////h0NDQ0NDQ0NwcHBwcHBwcHB3j/////iHBwcHBwcH - BwdhYWFhYWFhYWFhYXd3d3BwcHBwcHBwcHAWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhZhYWFhYWFhYWFh - YWFhYWFhYWFhYWFhYWEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhZhYWFhYWFhYWFhYWFhYWFhYWFhYWFh - YWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAEAAAACAAAAABAAgAAAAAAEABAAAAAAAAAAAAAAAB - AAAAAAAAAAAA/4AAAP8AgAD/gIAA/wAAgP+AAID/AICA/8DAwP/A3MD/psrw//Dw8P///5n/mdSZ/5nU - ////zP///5mZ/yIiMP8AABH/AAAi/wAARP8AAFX/AAB3/wAAiP8AAKr/AADd/wAA7v8AEQD/ACIA/wBE - AP8AVQD/AHcA/wCIAP8AqgD/AN0A/wDuAP8RAAD/IgAA/0QAAP9VAAD/dwAA/5AAAP+qAAD/3QAA/+4A - AP8AADP/AABm/wAAmf8AAMz/ADMA/wAzM/8AM2b/ADOh/wAzzP8AM///AGYA/wBmM/8AZmb/AGaZ/wBm - zP8AZv//AJkA/wCZM/8AmWb/AJmZ/wCZzP8Amf//AMwA/wDMM/8AzGb/AMyZ/wDMzP8AzP//AP8z/wD/ - Zv8A/5n/AP/M/zMAAP8zADP/MwBm/zMAmf8zAMz/MwD//zMzAP8zMzv/MzNm/zMzmf8zM8z/MzP//zNm - AP8zbjP/M2Zm/zNmmf8zZsz/M2b//zOZAP8zmTP/M5lm/zOZmf8zmcz/M5n//zPMAP8zzDP/M8xm/zPM - mf8zzMz/M8z//zP/AP8z/zP/M/9m/zP/mf8z/8z/M////2YAAP9mADP/ZgBm/2YAmf9mAMz/ZgD//2Yz - AP9mMzP/ZjNm/2Yzmf9mM8z/ZjP//2ZmAP9mZjP/ZmZm/2Zmmf9mZsz/Zmb//2aZAP9mmTP/Zplm/2aZ - mf9mmcz/Zpn//2bMAP9mzDP/Zsxm/2bMmf9mzMz/Zsz//2b/AP9m/zP/Zv9m/2b/mf9m/8z/Zv///5kA - AP+ZADP/mQBm/5kAmf+ZAMz/mQD//5kzAP+ZMzP/mTNm/5kzmf+ZM8z/mTP//6FmAP+ZZjP/mWZm/5lm - mf+ZZsz/mWb//5mZAP+ZmTP/mZlm/5mZmf+Zmcz/mZn//5nMAP+ZzDP/mcxm/5nMmf+ZzMz/mcz//5n/ - AP+Z/zP/mf9m/5n/mf+Z/8z/mf///8wAAP/MADP/zABm/8wAmf/MAMz/1Aj//8wzAP/MMzP/zDNm/8wz - mf/MM8z/zDP//8xmAP/MZjP/zGZm/8xmmf/MZsz/zGb//8yZAP/MmTP/zJlm/8yZmf/Mmcz/zJn//8zM - AP/MzDP/zMxm/8zMmf/MzMz/zMz//8z/AP/M/zP/zP9m/8z/mf/M/8z/zP////8AM///AGb//wCZ//8A - zP//MwD//zMz//8zZv//M5n//zPM//8z////ZgD//2Yz//9mZv//Zpn//2bM//9m////mQD/3d3d//+Z - zP//zGb/iAAA/8wA//8AM5n/M2Yz/5lmAP8zMzP///vw/6CgpP+AgID//wAA/wD/AP///wD/AAD///8A - //8A//////////X19Vp39fV+/6n1WvV3WvX1fvX19Vr19dTt9fX19fV39fVa9Vp39fV+/6mpB/Va9fX1 - 9Xf19Vr19ff///9+9fV+9Vr1WvX19X71+PcKB/X1Cn719fX41Art+PX1qf9+9f//9/Wp/9R++Pj19X7/ - 9/V3B/8K/9T19ff49X7t7Vr1WvWp///t+Ph+qdT///f49fX19e0KCv//////////B/X19fUHCn5+qfj4 - +Pf/9/X19Vr1+P/39fWp+PXUCn719fX1fvX3/wrt//ft//j1fvX19fX19fjt////1H719fX1fvVa9X71 - Wn5+flr1Wnda9fX19fX19fX19fX19fX19fUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAIAAAAAACABAAAAAAAAAAA - AAAAAQAAAAAAAAAAAP+AAAD/AIAA/4CAAP8AAID/gACA/wCAgP/AwMD/wNzA/6bK8P/w8PD///+Z/5nU - mf+Z1P///8z///+Zmf8iIjD/AAAR/wAAIv8AAET/AABV/wAAd/8AAIj/AACq/wAA3f8AAO7/ABEA/wAi - AP8ARAD/AFUA/wB3AP8AiAD/AKoA/wDdAP8A7gD/EQAA/yIAAP9EAAD/VQAA/3cAAP+QAAD/qgAA/90A - AP/uAAD/AAAz/wAAZv8AAJn/AADM/wAzAP8AMzP/ADNm/wAzof8AM8z/ADP//wBmAP8AZjP/AGZm/wBm - mf8AZsz/AGb//wCZAP8AmTP/AJlm/wCZmf8Amcz/AJn//wDMAP8AzDP/AMxm/wDMmf8AzMz/AMz//wD/ - M/8A/2b/AP+Z/wD/zP8zAAD/MwAz/zMAZv8zAJn/MwDM/zMA//8zMwD/MzM7/zMzZv8zM5n/MzPM/zMz - //8zZgD/M24z/zNmZv8zZpn/M2bM/zNm//8zmQD/M5kz/zOZZv8zmZn/M5nM/zOZ//8zzAD/M8wz/zPM - Zv8zzJn/M8zM/zPM//8z/wD/M/8z/zP/Zv8z/5n/M//M/zP///9mAAD/ZgAz/2YAZv9mAJn/ZgDM/2YA - //9mMwD/ZjMz/2YzZv9mM5n/ZjPM/2Yz//9mZgD/ZmYz/2ZmZv9mZpn/ZmbM/2Zm//9mmQD/Zpkz/2aZ - Zv9mmZn/ZpnM/2aZ//9mzAD/Zswz/2bMZv9mzJn/ZszM/2bM//9m/wD/Zv8z/2b/Zv9m/5n/Zv/M/2b/ - //+ZAAD/mQAz/5kAZv+ZAJn/mQDM/5kA//+ZMwD/mTMz/5kzZv+ZM5n/mTPM/5kz//+hZgD/mWYz/5lm - Zv+ZZpn/mWbM/5lm//+ZmQD/mZkz/5mZZv+ZmZn/mZnM/5mZ//+ZzAD/mcwz/5nMZv+ZzJn/mczM/5nM - //+Z/wD/mf8z/5n/Zv+Z/5n/mf/M/5n////MAAD/zAAz/8wAZv/MAJn/zADM/9QI///MMwD/zDMz/8wz - Zv/MM5n/zDPM/8wz///MZgD/zGYz/8xmZv/MZpn/zGbM/8xm///MmQD/zJkz/8yZZv/MmZn/zJnM/8yZ - ///MzAD/zMwz/8zMZv/MzJn/zMzM/8zM///M/wD/zP8z/8z/Zv/M/5n/zP/M/8z/////ADP//wBm//8A - mf//AMz//zMA//8zM///M2b//zOZ//8zzP//M////2YA//9mM///Zmb//2aZ//9mzP//Zv///5kA/93d - 3f//mcz//8xm/4gAAP/MAP//ADOZ/zNmM/+ZZgD/MzMz///78P+goKT/gICA//8AAP8A/wD///8A/wAA - ////AP//AP/////////1WvX19Vr1fvX19VT1WvX4//8K9fX1WvVa9fX19fX19fX183j19fX183jzd/V3 - 9fXt///49fV39fV3WvV+9Vr183j19X1U83j19VT1WvVa9fj//9T19Vr19Vr19fX19fX19Vr19fX18/V+ - 9fX19fX1ftT///j19fV+9fV+9fV+9X719fXzePN49fX183jzePP1qf//7X71BwrU9fVa9fX19Vp39VT1 - 9fVa9Xj19fX19VT17f//7ant//9+9fV+9Vr19fVad/P1fvX18/Xz9Xjzd/V+Cv////////j19fX19fV+ - 9fX1VPX19X71VHdU8/VU8/X4////////B/Vad1r19fX19X719X1U9fX18/X19fX19fV+B+3t////9/X1 - 9fV+9Vr19fVa9fV9VPX19X5+fn5+9fX1WvWp////fvVad//39fV+9fV3WvX1fvfUCv///+1+VPV3WvUH - ///U9fX1//8H9fX1WvX19fcK/////+3U93319Vr19X4K//9+9Vr////tfvX19fUH////Cql+9fX19Vr1 - d/X19dT///f19e3///8KqX5+9////wd+9fX47Qd+9fVa9fX4Cv//+PX19an////////////39fVa9dT/ - /6la9fX1+Ar//wf19fX19X7t////////Cn719fX1fvj49fX1fvf////tfvVad/Va9X7U////////+PX1 - 9fX19fX1fvcK////7X719fX19fX19fWp//////8KB6mpqakH1Ar///////8H99T39Vpad1r19X4K//// - ///////////////////////////19fX19Xf1fgr//9T/////////////////////////1PV+9fVa9Vr1 - 7f//+PX499QK7QoK7QoK7e3U////9353WvX1fvX19fX3///U9fX19fV+WndafvV+9X7///9+9fX19fX1 - 9Xda9X7///+p9fVa9fX19fj19fX11P//7fX19X719Vp3WvV39QcK/wr49fX19X7U/3719Qf////49fVa - 9fX19fX19Vr1fgr////3qffUCv8H9X4H////B/Va9fX19fV+9fV39fX1fgr/////////7fgHCv///wf1 - 9fX1fvVa9fX1WvVa9Vr1fu3////////////////NWvVad1r19fX1WvV39fV39fX19fft///////////U - fvX1d/X19fV+9fV3WvVa9Vr1Wnda9X74B9Tt7dT3fn71WvVa9Vp3WvX19fX19Xf19fX19fX19fX19fX1 - 9fX19fX1d/X19fX19X5a9X71WvV+9Vr1fvVa9X71WvV+9Vr1fvVa9X71Wnda9fX19fX19fX19fX19fX1 - 9fX19fX19fX19fX19fX19fX1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAMAAAAGAAAAABAAgAAAAAAIAKAAAAAAAAAAAAAAAB - AAAAAAAAAAAA/4AAAP8AgAD/gIAA/wAAgP+AAID/AICA/8DAwP/A3MD/psrw//Dw8P///5n/mdSZ/5nU - ////zP///5mZ/yIiMP8AABH/AAAi/wAARP8AAFX/AAB3/wAAiP8AAKr/AADd/wAA7v8AEQD/ACIA/wBE - AP8AVQD/AHcA/wCIAP8AqgD/AN0A/wDuAP8RAAD/IgAA/0QAAP9VAAD/dwAA/5AAAP+qAAD/3QAA/+4A - AP8AADP/AABm/wAAmf8AAMz/ADMA/wAzM/8AM2b/ADOh/wAzzP8AM///AGYA/wBmM/8AZmb/AGaZ/wBm - zP8AZv//AJkA/wCZM/8AmWb/AJmZ/wCZzP8Amf//AMwA/wDMM/8AzGb/AMyZ/wDMzP8AzP//AP8z/wD/ - Zv8A/5n/AP/M/zMAAP8zADP/MwBm/zMAmf8zAMz/MwD//zMzAP8zMzv/MzNm/zMzmf8zM8z/MzP//zNm - AP8zbjP/M2Zm/zNmmf8zZsz/M2b//zOZAP8zmTP/M5lm/zOZmf8zmcz/M5n//zPMAP8zzDP/M8xm/zPM - mf8zzMz/M8z//zP/AP8z/zP/M/9m/zP/mf8z/8z/M////2YAAP9mADP/ZgBm/2YAmf9mAMz/ZgD//2Yz - AP9mMzP/ZjNm/2Yzmf9mM8z/ZjP//2ZmAP9mZjP/ZmZm/2Zmmf9mZsz/Zmb//2aZAP9mmTP/Zplm/2aZ - mf9mmcz/Zpn//2bMAP9mzDP/Zsxm/2bMmf9mzMz/Zsz//2b/AP9m/zP/Zv9m/2b/mf9m/8z/Zv///5kA - AP+ZADP/mQBm/5kAmf+ZAMz/mQD//5kzAP+ZMzP/mTNm/5kzmf+ZM8z/mTP//6FmAP+ZZjP/mWZm/5lm - mf+ZZsz/mWb//5mZAP+ZmTP/mZlm/5mZmf+Zmcz/mZn//5nMAP+ZzDP/mcxm/5nMmf+ZzMz/mcz//5n/ - AP+Z/zP/mf9m/5n/mf+Z/8z/mf///8wAAP/MADP/zABm/8wAmf/MAMz/1Aj//8wzAP/MMzP/zDNm/8wz - mf/MM8z/zDP//8xmAP/MZjP/zGZm/8xmmf/MZsz/zGb//8yZAP/MmTP/zJlm/8yZmf/Mmcz/zJn//8zM - AP/MzDP/zMxm/8zMmf/MzMz/zMz//8z/AP/M/zP/zP9m/8z/mf/M/8z/zP////8AM///AGb//wCZ//8A - zP//MwD//zMz//8zZv//M5n//zPM//8z////ZgD//2Yz//9mZv//Zpn//2bM//9m////mQD/3d3d//+Z - zP//zGb/iAAA/8wA//8AM5n/M2Yz/5lmAP8zMzP///vw/6CgpP+AgID//wAA/wD/AP///wD/AAD///8A - //8A//////////V3WvV+9fX18/V49Vr1Wnda9X719Vr1qf////+p9fV+9fX1WvVa9Xf1d/X19fV39fXz - 9fX1VH1U9VTz9fV39fX19fX1Wnf1fu3////U9fX19X719fX1WvVa9Vr1fvVa9fV49VR99fX1ffX1ePVa - 9Vp3WvV+9fX19an///8KfvVa9fX1d1p39fX19Xf19Xf19fXz9fVU83jzVPXz9fX19fX19fX19Vp3Wn7t - ////B/X1fvVa9fVa9X71WvVa9fVa9VT1ePN39fX19fX1fvV+9Vr1d1r1fvX19fUH/////3719fX19fX1 - 9fX19fV3WvV39fXz9VT1WvV+9X719fX19Xf1WvX19fVa9fV+/////9T1WvX1fn5+fvV+9fX19Vr1WvV4 - 9fV99fX19fX19Vp3WvVa9fX1d1p39fX19//////39fV+Cv//7fX1WvVad/X19fXz9Vr19X71Wnda9fX1 - 9Xf19X71WvX1WvX1fu3/////9/V+/////3719Xf1WvV+9fV49fV+9fX19fX19X719Vr1WvV39fX19X71 - 9an//////+0H//////j19Vr19fX19fXz9VT19Vp3WvVa9fX1fvX19fVa9fV+9fX1fvXU//////////// - /wf19Xda9X71WvVUffX1fvX19fX1d1r19fV3WvV3WvX19Vr19fX17f///////////wr1WvX19fX19fX1 - 9Vr19fVa9X719fV+9Vr19fVa9Xdad/X1fvX1ftT///////////+p9fVad1p39fV+9fX19X719fX1WvX1 - 9fX1fvV39Vr19Vr19Vr19X737f//Cv//////qfX19fVa9fX1WvV+9fX1fvX19X71WvX19Vr19fX19fX1 - 9fX1fvX1fvj4fvf/////Cn719Xf19ff19fX19Vr19fV+9fX19Xda9fX19X5++Kn4qfj19fX19fX19fUH - /////wf1WvVa9f/UfvX1d/V+9Vr19Vp3WvX19fgH7Qr///////+p9Vr1fvVa9Vp37f////9+9fX19f// - Cn71WvX19fVad/X19fX47f////////////8H9fX19fX19fX1+P////8H9fV+9f///wr49fVa9Xf19Vr1 - 9dT/////////Cu0Hqala9fV+9Vr1fvX19dT///8KfvX19f//////B/X19fVa9fV+7f///////+34fvX1 - 9fX1fvX19fX19Xda9an/////9/Va9f///////9R+9fX19fXt///////t+PX19fV++H719Vr1fvX1WvX1 - 9dT/////+PX19Qf///////8K935++O3//////wf19fV+9fgK///UfvX19Vp39fX19//////tfvV+9fX4 - 7f//////////////////9/X1fvX19e3/////+PX1d/Va9fWp//////+p9fX19Vr1ftT///////////// - ///U9Vr19fVa9X7UCv8Hd1r1WvX19Qf//////wf19Xda9fX19fX3//////////////+p9fV3WvV39fV+ - fvX19fX19fX4Cv//////1H71WvX19fV+9Vr1+O3////////////U9fVa9fX1WvX19fX19fV+qe3///// - ///UfvX19fV+9fX19fX19X4H////////////qfX19fX19fX1Wn5+qdQK/////////9R+9X5+9fX19fX1 - Wndad1r19////////////wrUBwcHBwft7Qr//////////////+3t7QoK1PVa9fV+9fX19fX1+P////// - ////////////////////////////////////////Cn719fX19fVad1r1fv////////////////////// - /////////////////////////3719fVad1r19fX1fv/////UBwr///////////////////////////// - //////8K7X71WvX19fX1d1r1fgr////t9X749+0K////////////////////////////B35+d/X19fV+ - 9fVa9fX19dT/////fvX19fV+fqmp9/f3B/cH9/f3qfj4fgr/////fvX1WvV+9fX1WvX1d1r19fj///// - B/X1WvXzVPX19fX1WvX19fX19fX1fv/////tWvX19fX19fX19X719fV3Wn4K/////3719fV39fV9VHf1 - 9fX19X71WvX11P////+p9fVad1p39Xda9fX19Vr19fX3/////+1+9fVa9Vr19fX1fu2p9fX19fX3//// - /wp+fvX19fVa9fX1d1r1fvX1WvV+Cv/////UfhD19fX19VqpCv8KWvX19an///////f19fV+9fX19Vr1 - WvX19fV+9fX1+P//////7fh+9X749+3///+p9fV+9///////7fX1WvX19fV+9fV39fV+9fX19X719QcK - //////8KCv//////Cqn19fjt///////tfvV+9fV+9Vr19fX1WvX1WvVa9fX1WvUH//////////////8K - B/j37f///////wr49fX19Vr19fX19fVa9Xf19Xf1fvX1d/VaB///////////////////////////7X71 - 9Vr1d/X1WvV+9fV39Vr1WvVa9fX1WvX19fgK//////////////////////8HfvVa9Xf1WvV+9fX19fVa - 9fV39Xf19X719Xda9fV+Bwr/////////////////1Pj19Xf1WvX19fX19X71WvX1fvVa9Vr1WvVa9Vr1 - 9fX19X731Ar/////////7Qd+fvVa9Vr19fV+9Vp3WvX19fX19fV39fV39fX1d/X1fvX19fX19X5+qfj3 - qX5+d/X19fX1d/X1fvX19fX19fV+9fV+9Vr1WvVa9X71WvVa9Vr1fvVa9Vr19Vr19Vr1WvVa9X71WvVa - 9Vr1fvVad1r19fX19fV39fX19fX19Xf19fX19fX1d/X19fX19fV39fX19fX19Xf19fX19fX19fX1flr1 - fvVa9X71WvV+9Vr1fvVa9X71WvV+9Vr1fvVa9X71WvV+9Vr1fvVa9X71Wnda9fX19fX19fX19fX19fX1 - 9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA - AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAABBQED/QUBA/0FAQP9BQED/QUBA/0FA - QP89PDz/X15e//39/f+WlZX/OTg4/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/zw7O//ExMT/3d3d/0FAQP8+PT3/QD8//0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP88Ozv/aWho//7+/v+gn5//lZSU/7m4uP9APz//QUBA/0FAQP8/Pj7/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QD8//zk4OP+hoaH////////////39/f/VVRU/z49Pf9BQED/T05O/zw7 - O/9BQED/QUBA/0FAQP87Ojr/Pjw8/0tKSv9TUlL/RkVF/4eHh/+trKz/9fX1/7u7u/8+PT3/QUBA/+np - 6f95eHj/OTg4/z49Pf88Ozv/eHh4/8vLy//o5+f/1tbW/3h4eP81NDT/NDMz/4uKiv//////cnFx/zw7 - O//v7+///////5ybm/9PTk7/lJSU//7+/v/Ozs7/cXBw/4iHh/9vbm7/Pj09/zg3N/9lZGT//////52c - nP85ODj/UE9P/7e3t///////9fX1///////Ly8v/OTg4/zY1Nf+lpaX/iYmJ/zg3N/9vbm7/4uLi/9/f - 3/9QT0//Pz4+/z49Pf89PDz/jo2N//j4+P//////4uLi/319ff9ycXH/dnZ2/5OTk//Kysr//Pz8//z8 - /P+mpaX/bWxs/z8+Pv9BQED/QD8//z8+Pv/f3t7/8vLy/+vr6/////////////////////////////// - /////////f39/7u7u/89PDz/QUBA/0FAQP87Ojr/wcHB/+rq6v9XVlb/bGtr/4eGhv+KiYn/jo6O/4SD - g/+dnZ3//////5+env9APz//QUBA/0FAQP9BQED/PDs7/3Nycv//////rq2t/0A/P/9BQED/hYWF/3d2 - dv8+PT3/ysrK//Ly8v9VVVX/PTw8/0FAQP9BQED/QUBA/0FAQP88Ozv/oaCg///////o6Oj/6Ojo//X1 - 9f+ura3/4eHh//z8/P+Af3//Ozo6/0FAQP9BQED/QUBA/0FAQP9BQED/QD8//z49Pf+FhYX/3d3d//39 - /f/+/v7/+/v7/9DQ0P9vbm7/Ozo6/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Ozo6/0VE - RP9gX1//amlp/1taWv9APz//PDs7/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9APz//PTw8/zw7O/8+PT3/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgAAAAQAAAAAEA - IAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAABBQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/zs6Ov99fHz////////////m5eX/SUhI/0A/P/9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QD8//0RDQ//V1dX///////39/f91dXX/Ozo6/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/OTg4/4WEhP///////////8fH - x/89PDz/QUBA/0FAQP9APz//Pz4+/z8+Pv9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9APz//R0ZG/+Hg - 4P///////f39/3p5ef84Nzf/QUBA/0ZFRf9QT0//TUxM/0A/P/9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP86ODj/iYiI////////////6Ojo/11cXP81NDT/vr6+/+/v7//MzMz/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0A/P/9CQUH/0tHR////////////6Ojo/5KRkf/r6+v///////f39/9ZWFj/Pj09/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/zw7O/9jYmL/8/Pz/////////////////////////////////39/ - f/85ODj/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/zo5Of96eXn/9PT0//////////////////// - ////////w8LC/z8+Pv9APz//QUBA/0FAQP9BQED/PDs7/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0A/P/8/Pj7/PTw8/zw7O/88Ozv/Pj09/zs6Ov9nZmb/wL+//+Tk - 5P/Z2Nj//Pz8////////////o6Oj/zo5Of9BQED/QUBA/0FAQP9ycXH/PTw8/0A/P/9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/z08PP85ODj/QUBA/1JRUf9iYWH/bGxs/25tbf9XVlb/Pz4+/zw7 - O/89PDz/SEdH/z49Pf+UlJT////////////6+vr/aWho/zw7O/9BQED/QUBA//7+/v+jo6P/QD8//z49 - Pf9BQED/QUBA/0FAQP9BQED/QUBA/0A/P/86OTn/XFtb/5+fn//U1NT/8PDw//39/f///////////+rq - 6v9OTU3/Pz4+/0FAQP9APz//QD8//zs6Ov+5ubn////////////ExMT/PTw8/0FAQP9BQED///////// - ///CwcH/Tk1N/zs6Ov9BQED/QUBA/0FAQP8/Pj7/QkFB/6Cfn//09PT/////////////////+vr6/9/e - 3v/Ix8f/rKur/0lISP9APz//QUBA/0FAQP9BQED/PTw8/1hXV//x8fH///////v6+v9mZWX/PTw8/0FA - QP/////////////////d3d3/ZmVl/zg3N/89PDz/PDs7/z8+Pv+6urr/////////////////6+vr/56d - nf9fXl7/Pz4+/zs6Ov83Njb/PTw8/0FAQP9BQED/QUBA/0FAQP9BQED/Ojk5/87Nzf///////////6Kh - of85ODj/QUBA/9XV1f/////////////////z8/P/l5aW/11dXf9hYGD/tra2/////////////////7u7 - u/9TUlL/ODc3/zo5Of+Hh4f/09PT/8fHx/9lZGT/PTw8/0FAQP9BQED/QUBA/zg3N/98e3v/9/f3//// - ////////d3Z2/zs6Ov9BQED/QUBA/5eWlv/4+Pj/////////////////+vr6//z8/P////////////// - //+srKz/PTw8/z08PP9BQED/Pz4+/8/Ozv///////////5SUlP86OTn/QUBA/z49Pf85ODj/fn5+//T0 - 9P///////////8DAwP8+PT3/QUBA/0FAQP9APz//OTg4/29ubv/j4+P///////////////////////// - ////////+Pj4/1ZVVf89PDz/QUBA/0FAQP8/Pj7/UlFR/4SEhP94d3f/Q0JC/zs6Ov85ODj/VFNT/62s - rP/9/f3////////////g4OD/UlFR/z49Pf9BQED/QUBA/0FAQP9BQED/Ojk5/1FQUP+/vr7///////// - ///////////////////9/f3/f39//zY1Nf85ODj/OTg4/zk4OP83Njb/MjEx/zg3N/9MS0v/cHBw/66t - rf/u7u7/////////////////19fX/1VUVP82NTX/Pj09/0FAQP9BQED/QUBA/0FAQP9BQED/Pj09/z49 - Pf+YmJj//f39///////////////////////19PT/ubm5/5ybm/+UlJT/l5aW/6Ghof+zs7P/zs3N/+rq - 6v////////////////////////////z8/P/DwsL/s7Ky/8XExP+ioqL/Pj09/0FAQP9BQED/QUBA/0FA - QP9BQED/PTw8/1VUVP/39/f///////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+jo6P9GRUX/QD8//0FA - QP9BQED/QUBA/0FAQP8/Pj7/UVBQ//Dw8P///////f39/9DPz//s7Oz///////////////////////// - ///////////////////////////////////////////////////////////////////29fX/0dHR/0xL - S/9APz//QUBA/0FAQP9BQED/QUBA/0A/P/9CQUH/2dnZ////////////g4OD/0lISP90c3P/oaGh/8jI - yP/f39//6enp/+vr6//u7u7/7+/v/+7t7f/q6en/4+Pj/9nY2P/Qz8//+vr6////////////rKur/1NS - Uv9EQ0P/QD8//0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/zk4OP+oqKj////////////R0dH/PTw8/zo5 - Of85ODj/PTw8/0VERP9LSkr/TUxM/05NTf9LSkr/T05O/0xLS/9HRkb/PDs7/2VkZP/5+fn///////z8 - /P9lZGT/OTg4/0A/P/9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/PTw8/2RjY//6+vr///////// - //+NjIz/NzY2/0FAQP9BQED/QD8//z8+Pv86OTn/RURE/25tbf9BQED/Pz4+/z49Pf9APz//y8vL//// - ////////0dDQ/0A/P/9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Ozo6/7a1 - tf////////////X19f94eHj/NzY2/zk4OP85ODj/PDs7/2FgYP/Jycn//////2xra/83Njb/QD8//7Cw - sP////////////39/f92dXX/Ozo6/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP8+PT3/UVBQ/+Tk5P////////////j4+P+urq7/lpWV/6GgoP/Ix8f/9/f3//////+0tLT/Pj09/11d - Xf/GxcX/////////////////rq6u/zw7O/9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP87Ojr/ZWRk/+vr6///////////////////////////////////////2NjY/42M - jP+7urr/9vb2/////////////////8DAwP9EQ0P/Pz4+/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP87Ojr/YF9f/9fW1v////////////////////////////// - ///8/Pz///////////////////////7+/v+sq6v/Q0JC/z49Pf9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP88Ozv/SEdH/5qZmf/n5+f///////// - //////////////////////////////39/f/Pzs7/dXR0/zw7O/8/Pj7/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP8/Pj7/Ojg4/01M - TP9+fX3/rq2t/8rKyv/X19f/1NTU/8LCwv+enZ3/amlp/0FAQP87Ojr/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/Pz4+/zo5Of85ODj/PTw8/0FAQP9APz//PDs7/zk4OP88Ozv/QD8//0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QD8//0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAMAAAAGAA - AAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAQUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/zs6 - Ov+gn5///////////////////////46Ojv85ODj/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/z49Pf9UU1P/6enp/////////////////8jIyP8+PT3/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP84Nzf/mpqa//////////////////r6+v9lZGT/PDs7/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP8+PT3/VVRU//Hx8f////////////// - //+2trb/Ojk5/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Ojk5/66u - rv/////////////////4+Pj/ZWVl/zs6Ov9BQED/QUBA/0FAQP8+PT3/PTw8/zw7O/89PDz/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/PTw8/11cXP/29vb/////////////////zs3N/0FAQP8/Pj7/QUBA/0FAQP9XVlb/ZWRk/29u - bv9gX1//Pz4+/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/zo5Of+sq6v//////////////////////6moqP87Ojr/PDs7/1NS - Uv/r6ur//f39///////d3d3/REND/0A/P/9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/z49Pf9UU1P/7e3t//////////////////// - //+rqqr/Q0JC/2JhYf/////////////////6+vr/X19f/z08PP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP85ODj/jYyM//// - ////////////////////////3t7e/8jHx///////////////////////iomJ/zk4OP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9APz//Pz4+/8HBwf//////////////////////////////////////////////////////ubm5/zo5 - Of9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/Pj09/05NTf/a2tr///////////////////////////////////////// - ////////4+Pj/0RDQ/8/Pj7/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/zw7O/9WVVX/1dXV//////////////////// - /////////////////////////f39/6Cfn/88Ozv/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP88Ozv/SklJ/6Wk - pP/q6ur////////////19fX///////////////////////////+Li4v/Ojk5/0FAQP9BQED/QUBA/0FA - QP9BQED/Ojk5/0A/P/9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9APz//Pj09/zw7O/86OTn/OTg4/zk4OP85ODj/Ozo6/0A/ - P/9BQED/Pz4+/zo5Of9PTk7/cHBw/3Rzc/9VVFT/rq6u///////////////////////y8vL/XFtb/z08 - PP9BQED/QUBA/0FAQP9BQED/oaCg/0dGRv89PDz/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9APz//Ozo6/zo5Of9FRET/WllZ/3Bvb/+CgYH/jo2N/5OS - kv+RkZH/fHx8/0NCQv9APz//QUBA/0FAQP8/Pj7/PDs7/zs6Ov89PDz/Pz4+/76+vv////////////// - ////////vb29/zw7O/9BQED/QUBA/0FAQP9BQED//////83Nzf9VVFT/Ojk5/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QD8//zo5Of9GRUX/d3d3/7Kysv/e3t7/9vb2//// - /////////////////////////////5OTk/86OTn/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Pj09/01L - S//h4eH/////////////////+/v7/2ppaf88Ozv/QUBA/0FAQP9BQED////////////k5OT/bGtr/zk4 - OP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP8+PT3/QD8//4eGhv/c29v///////// - /////////////////////////////////////////////7a2tv86OTn/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/zo4OP95eXn//f39/////////////////7u7u/87Ojr/QUBA/0FAQP9BQED///////// - ////////9vb2/4qKiv87Ojr/Pz4+/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/zw7O/9RUFD/xMTE//// - ///////////////////////////////////y8vL/0tHR/7Oysv+enp7/jo2N/1NSUv8/Pj7/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0A/P/8/Pj7/0NDQ//////////////////b19f9bWlr/Pj09/0FA - QP9BQED///////////////////////////+srKz/REND/zw7O/9BQED/QUBA/0FAQP9BQED/PDs7/1VU - VP/c3Nz/////////////////////////////////z8/P/4eGhv9VVFT/Pz4+/zc2Nv8zMjL/NDMz/z49 - Pf9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP84Nzf/kI+P//////////////////// - //+enZ3/OTg4/0FAQP9BQED/////////////////////////////////zc3N/1pZWf84Nzf/PDo6/z08 - PP84Nzf/SUhI/9PT0////////////////////////////9zc3P95eXn/QD8//zk4OP8+PT3/PDs7/1hX - V/93dnb/bm1t/0dGRv8+PT3/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0A/P/8+PT3/wMDA//// - //////////////////+Qj4//Ojk5/0FAQP9BQED/t7e3//39/f///////////////////////////+/u - 7v+fn5//bW1t/2VkZP+DgoL/19fX////////////////////////////sbCw/0lISP86OTn/QD8//0FA - QP88Ozv/iIiI//Hx8f///////////9XV1f9WVVX/Pj09/0FAQP9BQED/QUBA/0FAQP9BQED/QD8//zo5 - Of+fn5///////////////////////+np6f9OTU3/Pz4+/0FAQP9BQED/OTg4/3l5ef/p6en///////// - //////////////////////////////7+/v////////////////////////////7+/v+dnZ3/Ozo6/z8+ - Pv9BQED/QUBA/0FAQP89PDz/0dHR//////////////////////+BgID/Ojk5/0FAQP9BQED/QUBA/0FA - QP8+PT3/PDs7/5ycnP///////////////////////////4yLi/85ODj/QUBA/0FAQP9BQED/QUBA/zo4 - OP9WVlb/yMjI/////////////////////////////////////////////////////////////////8nI - yP88Ozv/QD8//0FAQP9BQED/QUBA/0FAQP89PDz/bm1t/9fX1//19fX/7u3t/7Gxsf9JSEj/QD8//0FA - QP9BQED/QD8//zk4OP9PTk7/uLi4////////////////////////////wsLC/z8/P/9APz//QUBA/0FA - QP9BQED/QUBA/0FAQP89PDz/QkFB/6Kiov/9/f3///////////////////////////////////////// - /////////////5+fn/84Nzf/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/PDs7/0RDQ/9XVlb/UFBQ/zw7 - O/8/Pj7/QUBA/z49Pf85ODj/RURE/4aFhf/k5OT////////////////////////////a2tr/Tk1N/z49 - Pf9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QD8//zo5Of95eHj/6Ojo//////////////////// - /////////////////////////////8bFxf86OTn/Pj09/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0A/ - P/89PDz/PDs7/zs6Ov85ODj/Pj09/1dWVv+RkJD/2tra/////////////////////////////////9ra - 2v9VVFT/Ojk5/z49Pf8/Pj7/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP86OTn/VVRU/8XE - xP////////////////////////////////////////////39/f+dnZ3/TUxM/z49Pf87Ojr/Ojk5/zo5 - Of87Ojr/PTw8/0A/P/9JR0f/WFdX/3Nycv+ampr/ysrK//Tz8/////////////////////////////// - ///+/v7/y8vL/1ZVVf9EQ0P/UE9P/1hXV/9RUFD/QD8//0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/PTw8/z8+Pv+op6f/////////////////////////////////////////////////7Ozs/9DQ - 0P/Av7//uLi4/7i4uP++vb3/x8fH/9XU1P/l5eX/9fX1//////////////////////////////////// - ///////////////////+/f3/39/f/93d3f/n5ub/7u7u//X19f/Q0ND/QUBA/0A/P/9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/zk4OP92dXX///////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////v7+//UE9P/z8+ - Pv9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/zs6Ov9zcnL///////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////aGdn/zw7O/9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/z08PP9jYmL//Pz8//// - /////////////9nZ2f+8vLz/7+/v//////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////T09P/a2tr/YmFh/z08PP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/z8+ - Pv9OTU3/7Ozs/////////////////9bW1v89PDz/UlFR/3l5ef+lpKT/09LS//Hx8f////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////+8vLz/b29v/1dWVv9DQkL/Pz4+/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP89PDz/ycnJ//////////////////z8/P9qaWn/OTg4/zs6Ov85ODj/QD8//1RT - U/9ubW3/hoaG/5iYmP+ioqL/pKOj/6enp/+tra3/rq6u/66trf+pqan/o6Oj/5ubm/+SkZH/hISE/3V0 - dP9tbGz/6Ojo//////////////////39/f9mZWX/NjU1/z49Pf9APz//QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP85ODj/kJCQ//////////////////////+6urr/Ojk5/0FA - QP9BQED/QUBA/z8+Pv88Ozv/Ojk5/zk4OP85ODj/OTg4/zk4OP85ODj/OTc3/zk4OP85ODj/OTg4/zk4 - OP85ODj/Ojk5/zU0NP9mZWX/+Pj4/////////////////+Hh4f9GRkb/QD8//0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP8+PT3/VVRU//Hx8f////////////// - ///7+/v/c3Nz/zk4OP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP89PDz/Q0JC/z08 - PP9BQED/QUBA/0FAQP9BQED/QD8//0FAQP/Pzs7//////////////////////5+fn/85ODj/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Ojk5/6qq - qv//////////////////////5OTk/1RTU/88Ojr/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Pz4+/zg3 - N/9vb2//2NjY/46Njf8+PT3/QUBA/0FAQP9APz//OTg4/6Ghof//////////////////////8fHx/1ZV - Vf8+PT3/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/Pj09/1NTU//s7Oz//////////////////////9XV1f9SUVH/OTg4/z49Pf8+PT3/Pj09/zs6 - Ov84Nzf/SklJ/5mYmP/29vb//////+/v7/9MS0v/Pz4+/z8+Pv86OTn/lZWV//7+/v////////////// - ////////nJyc/zk4OP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/zk4OP+GhYX////////////////////////////g4OD/dnV1/1hX - V/9UVFT/XFtb/3Rzc/+lpKT/5OPj/////////////////4+Ojv87Ojr/OTg4/0lISP+trKz///////// - ///////////////////U1NT/RURE/0A/P/9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP88Ozv/ra2t//////////////////// - //////////////b29v/z8/P/+Pj4///////////////////////6+vr/lpaW/zQzM/9IR0f/g4KC/97d - 3f///////////////////////////+zs7P9dXFz/PDs7/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP8/Pj7/QkFB/7m4 - uP////////////////////////////////////////////////////////////v7+/+1tLT/gH9//66u - rv/j4+P/////////////////////////////////7u7u/2tra/86OTn/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/Pz4+/0FAQP+rqqr///////////////////////////////////////////////////////7+ - /v/7+/v////////////////////////////////////////////g4OD/ZWRk/zo5Of9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/z8+Pv88Ozv/hYWF/+vr6/////////////////////////////// - /////////////////////////////////////////////////////////////7q6uv9RUFD/Ozo6/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Ojk5/1VUVP+rqqr/8fHx//// - ///////////////////////////////////////////////////////////////////Q0ND/d3Z2/z08 - PP8+PT3/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/z49 - Pf86OTn/V1ZW/5STk//Ozc3/8fHx//////////////////////////////////r6+v/h4eH/sbCw/3Fw - cP9BQED/Ozo6/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/Pj09/zk4OP8/Pj7/VFNT/21sbP+Dg4P/kZCQ/5STk/+Li4v/eXh4/2Bf - X/9HRkb/Ojk5/zs6Ov9APz//QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/Pz4+/zw7O/86OTn/OTg4/zk4 - OP85ODj/Ozo6/z08PP9APz//QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FAQP9BQED/QUBA/0FA - QP9BQED/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABc - cqhmAAAAAXNSR0IArs4c6QAAPjRJREFUeAHtnQeYVEXW94ugIBkBBQGZkQHJGQkqYREDoqKCCV1XVNA1 - rLrvGnDX9dnvedU1++ouxmUVwbAmUBAQlRxdck5DlKRkBhCEr35nLGyGCX27b+yuep47t6f73gqnqv51 - 6tQJxbp06XpU2WQpYCmQlhQonpatto22FLAUEApYALADwVIgjSlgASCNO9823VLAAoAdA5YCaUwBCwBp - 3Pm26ZYCFgDsGLAUSGMKWABI4863TbcUsABgx4ClQBpTwAJAGne+bbqlgAUAOwYsBdKYAhYA0rjzbdMt - BSwA2DFgKZDGFLAAkMadb5tuKWABwI4BS4E0poAFgDTufNt0SwELAHYMWAqkMQUsAKRx59umWwpYALBj - wFIgjSlgASCNO9823VLAAoAdA5YCaUyBkmnc9rRr+tGjRxUXyXw293iJUaxYMXmUe+zFl+a3ePOyzwVP - AQsAwfeBqzUwEzr2zsQsUaKEOvnkk49d5cqVU+XLl1fcS5UqpcqUOUXXo5gqWbKkqlixotSJ9w4ePKj2 - 7t0j/x86dFgdOHBA5eTs09/tU3v27NGfc9ShQ4fk+8OHDx8DFt4tXrz4MZBwtZE2M9coYAHANVIGkxET - /ciRI/o6qiebUieddJI65ZRTVOXKldWpp56qateupapWraaqVDlV1ahRQ1WrVk2VLl1aLiY+FxPVSWLC - //TTT2r//gMaIA4IEGzatElt3bpV7dy5U61bt14+b9++Xe3evVtAhDoaUHBanpO62WedUcACgDN6Bf50 - 7oSHlT8idSlbtqyqVKmSOvPMM9VZZ52lMjIyZNJXr15dr+plBAzcrjQgw0XZJjVo0MB8VD///LPat2+f - 2rVrl1q/foNau3aNvtap1atXq82bNwsowC0ABIZLOPay/eArBYrZwCC+0juhwn5d5Y8IC1+lShWVmZmp - mjZtqho0OFsmPWw7LH6YE9wAXMLChYvUsmXL1NKlSwUQ2E5oqcQxQAhzG1KtbpYDCGmPmknPHTb9jDPO - UI0aNVItWrRQTZo0Flae76OUKlSooLiysrKk2mwXVq5cqebOnavmzZunsrPXCHdAm5FZsGWwyVsKWA7A - W/o6zp29Miw0q3nNmjX1hG+u2rRpI5O/atWqKTspECayRZg1a5Zcq1dnyzbCyA0sGDgeSnG9YAEgLjJ5 - +xArHpOeQY7grlmzZuq8886TyX/aaad5W3gIc9+7d69asmSJmjp1moDBhg0bhD6WK3C/sywAuE/TuHM0 - E5+jt4yMOnrSn6+vc1XdunXlOC7ujFL4wS1btqgZM2aob78drxYtWiTHjgCBPUlwp9MtALhDR0e5mInP - Hp59/YUXXqg6dGivj+qqOMonnR7myHHu3DlqzJgxmiv4Tk4YLBAkPwIsACRPw7hzMBOfc/imTZuoyy+/ - XJ1zzjlyXBd3Jmn+IMeHcAIjR45UU6ZM00CwUwSGliNIbGBYAEiMbo7eYuIzcJn4zZs3U1dccYVq27at - J2f0jioW4YcRli5YsFADwRcaCKYKR8BWygoLnXWqBQBn9HL8NBMfVhXB3pVXXimsPkBgkzsUyAWCBerT - Tz/TQsOpIiNAScmm+ChgASA+Ojl+yhzn1alTR/Xp00d1737BcZpzjjO0LxRKAYB25syZ6r333lPz5y8Q - mwSA16bCKWABoHD6JPQruvIovPTo0UNdffVVooOfUEb2JccUQJ8A+cBHH32sNm7cKKcpdltQMBktABRM - G8e/sOqz32/evLm65ZbfqVatWjnOw77gDgUwSHr//ffVuHHjtNHSfnusWgBZLQAUQBinX7PqY4F33XXX - ipAPM1ubgqUAYDxlyhQ1ePC/xfbACglP7I8SGRmZj5/4tf0mXgqYvX7Lli3Vww8/pLp16xZ6o5x42xb1 - 52D9sZLs2LGD+CxYtWqVnMbYI8Nfe9YCwK+0cPwJwRPKPAj57rvvD9oMt7bjPOwL3lMAs+V27dqp6tVr - iL3Bjh075GTG+5LDX4IFgAT7CJafCc/Ev+aaPnLGn2BW9jUfKAA3kJVVV+QyW7duEf8EfMeVzskCgMPe - N9p8aPANHPiIgvW3KToUQE7ToUMHbVx0WPsjWCb3dN4SWABwMHbZ7zNY0OS7//77NEtZ3cHb9tGwUABT - azQxq1atotWKl2iz471puyWwABDnqMRcF197t912m+rX7xarxhsn3cL6GKx//fr1Vb16WWr58hXqhx9+ - SEsQsAAQxwhF2FetWlX1wAMPqMsu62lNUeOgWVQewdMS+hp4I8LvQLppD1oAKGKkIuzjKGngwIGydyzi - cftzBCmAU1VkOjgsxSsR27x0EQ5aAChkwDL569evpx599M/ih6+QR+1PEacAHpTbtTtH4h3gsJSUDiBg - AaCAgcvkP/vss9Vf/vLnY04sC3g05b9G+Dlx4kTxyrN58yZtertb/P8TGwCWOezeiOPtINqB/0WCn+Bz - gBOfVAcB6xU4n9HB5Od476GHHlS1atXK54n0+gqWuEmTJmrx4sXqpZf+T3TrMWnGFTnHangyYpuEWzPu - nI7g2zCKCRC4444BotcxbNgwCbqSyiBgbQHyjFJWtSZNmqrHH3/MWvHloQ3/Tp8+Q/3zn/9UqNWy+rNK - cpH4H1Ya78WZmRmqYcOG4vIMH4dRs42gTe+8847YEdC2VAUBuwWgd39JSPsZtI8+OtCu/IYoee5wRJyh - IzBbv369THomPhcJ7gl//6tXZ6vvvvtOtg2TJ0/WgLFar6Y/i5l0FByiMOEJvMKCsHDhQmlbKoKABQDp - WiVGIqxUjz32mLCyv3xtb/lQAF8HeC/GUSfRfVgtmRzmYssAIHBHf+LHH3+UPTVyhEmTJiviCMJqI33H - Qi+sifqzFdy/P0dAwLQvrPVNpF4WADTVWPlZ2f7850fTXuAX7yDC7dY557SViYxvPmiY3wrJd0wkJjo7 - BbiDBQsWiFBx/vz5ssIiQ2DrEMZE3XHntm3bNm1SvPwYpxPGuiZSp7QHAFYoVqIHH/yThN1KhIjp+g6T - m8lRqVJFCe8Fu8yEKSgZMIA7YKuA4s306dPFlRfquAAB3EXYEuBFO7Ozs7UR0dqUAoG0BgCOtzDnveuu - u9RvftM1bOMuMvXhuJTQ48T3w/tOYSBgGgUYGLkBYcT/+9//SiSgPXv2SEi02MjD5p0g78gtmjVrKv4G - CXBq6h5kndwoO20BwEiuf/vbm7Q57zVu0DKt8yA0ObEMCdrBOXo8IADBDFfA80QPnjNnjoQDO3LkqN6W - 1RSADgthOclAToTzUcKfx9vGsNQ/v3qkLQCwZ73ggm7qzjvvDLUgKr9OC+t3eECuUKG8mj17doEygcLq - zoTigiNgkiErqFixggBLWCYbsRrRcSBcWUFyj8LaGLbfwiuC9ZBS7D+xBLvjjjtCtcLAleDVdt++HBGO - safes2e3BL0gYCYJQRp70vLly4n0/aSTTtZ751PF5XipUqW1MO2UQNt02WWXCQcwaNBrcuzHCu805QoM - j8qWYsWK5Rqou6u+fW8QIHCalxfPd+/eXa1Zs0YNGfKuF9n7mmfaAQD7fjTYfv/7O9Xpp5/uK7ELKmzl - ylWKs3LUbDdt2qxwWXXw4EEBAdhpAAthpUmx++dixYrLpEeKzr4ZzTzahUZeZmaGYsXi8vPsvXfv3lra - v0u9+27uBEkEBHiHk4aDB39SI0aM0Hvv+eqmm24Sri0M++8bb+yr6DecjkY5EEnaaQIykVD1vOGGG8x8 - CuwOCzlq1CitcTZEFGvgAGB1zYTJey+oorwXe/Eck4RJj1S9du1aWsGpkQix4HwACa8T3Mvf//60BPN0 - Y4JAK3QHevS4RN18882ibeh1G4rKH8vBgQMfVd9//31khYJpJQNgJe3YsaOs/rCZQSb2uYMGDZLJD3tP - fZi0Zh9sgAAQiOcy75GHWSEBO/LesGGjrKAo4cyYMV2Os+CEypcv7xlnQB2aNGks9gMo/pg6JUpz2ked - MdJBMy8jI0NzOqclmp0r7wGk0BB5AHUzgO1K5j5lkjYAwGSANcaPX7Vq1Xwib/7FYG761FNPqQkTJh6b - 8Pk/mfi3BjSYOEw+7tAAzzcY9RBQc+bMWVpL7wfR02cwuz2A2ZZkZp4lE8QNqTn1oy2oISMkhLvJyspy - vd5OqJ6ZmSlbN/wLJgtyTsp169m0AADYYwbPgAH9Vfv27d2iXUL5sGdk8i9fvkJYWrcnXWGVoiwDCIAB - 2m1z5szV8ocpotdfvnwFYa15xq0E2CKbmDFjpmxT3GgvEw3OBhA4cOCghFoPiqODVhwNYvewffsOoa9b - tPMjn7QAAPaP5557rrr99tsDQ+mjR4+o4cOHqxdeeFGvutsDFxwZMGAAo7yDTv+kSZO0dDtbhIZuckno - CKA8A+fjFriQDyCGcJC8W7ZsEdjpB9sAtCHRaqROboCcH5OfMlIeANibwd4+9NBDMrD9ImxsOQyKIUOG - qtdff12k+0GtVrF1iv3MgGVVRXC3YsVKMdhhq4B9hBuquUzWRo0ayd59y5YtroEA9eZavny5HMu1aNE8 - sAjMnLoQjBTOzi2Qi+0jrz6nPACw+l9//fVyfOQVEQvLl0n1xhtvqKFDh4qgKMz7RAMEBw8ekMmKwLB4 - 8RJ6H5+ZtLIUHpXXrl0j+bo5QUyd0dPnbB7rvSDUiGkTgWLgAlBndrONhY2vZH9LaQBg8qOnjg9/P8/B - Tacw+Vn1P/jgQ1mpojIozKTC9RcSbiYXWn7JePlBDjNq1JeSlxd0AFiJCIx3X7YDZcv6H5wVozLGHHYN - 0DAKKWUBgAHHoLj77rv1GXgD3/sCtp+otO+9936kJn8socxEBQDwBFSmTFkReJnvY58t6vO6deu0YtBQ - sa33anLQ3zgpwfkInEAQXogASoyiOKlIhE5F0dHt31MWADjzJwTULbf8LhDBHxMfl1KkKAyEggaW4QZg - a5G679y5QzVu3MSRwA3Nxueee17vj70/KjMgADeAq2+/OT+sS7mmTZsWCd2AlAQAVn/2nPfee08gEXtH - jx4tfvPgAqI8+WNBgXZAVxRx8AeI6zRUqotKu3btUk8++ZQ29Z2atByhqLLM74AAdvt4IgIE3NBENHnH - c69Z8wyhk3GZFs87QT2TkgDAPqxr165i5uv3BGT/98wzz4pRDwMxlZLhBmDnFyyYr8Nq1StUqQrlH449 - x48f7/skpN9XrlwpqzCRf7zaduTXv5zycDSI5mXYNQRTDgAgeLlyZbW67+8VYZ/8TLCd//u//yv7v7Ad - 9blJB4ANJaLZs+dIbL38gqSiqPPiiy+psWPH+j75aauZ8Og3oNNAgBc/E2OP40nkJ2FeCFIOANj7d+rU - SfXp09tX9hsz3qefflo8xmC0kuqJQQ17P3fuXPEGhK4F32G9uGLFCvXyy69oj8DfyndmMvpNE8qFG1y0 - aKG4evfTdgAOhG3o+PET/G62o/KCtYhxVNWiH2aPCuuFTbqfKzDlDh06TAQ/6TD5TU9AY6Tdf/vb/xNd - AcJt79mzV2QEePfxsw9MnfLeASVUdF955RX1xBNPiO+EvM949X/r1q1V8+bNRU3YbzlEvG1KKQ4AtG/f - vp269tprfWW7pk6dJpZ9P/8cTYuweAdLfs+x0iHsRB13zZq1AghwYWFie6kLFonUi/h/fnEkAGCJEiXF - 14NfZebXR4V9557VR2Gl+PAbqzDHLxdddJEY2fhQpBSBaivKPmwB/BY4+tXGosphcDPYWeW4h5EO1O2L - L74QwVxR7XHzdxakevWyZCviZr5u5ZUyAMDqf/bZ9SXWu1vEKSofBI4ot3AsxsC3KbwUAKTQzHzzzbfE - JNqvmrIl7dKlqxyh+lWmk3JSBgBg837zm9+IDMAJAZJ5FmWPMWPGhordTaY9qf4uIL169SpF0E8/U+fO - ncQXBVulsKWUAAAIy1EUmn9+JSTgOIXMyUkN99B+0S3ocgCBkSNH6dOLeb5VBSMhoihZAPCI5LDiSFwJ - TuFXGjlypHjWsay/XxR3pxzkEygooabNkaVfqUuXLnIsiKwqTCnyHAAE5byVYJV+CZ/Wr9+gPv30M+nH - sEp3wzTIwlYXQJvYBQQr9Ss1btxYDKnCxgVEHgAgaEZGHW2g0tivvhTPPm44uvStwrag4ygAaB8+/LP6 - +ONPJBrRcT969A+WiR06tA+dMDDyAAAH0KpV67gMU9zoW7TcUG/FUYZN0aVAyZIlxA2an1xA27ZtJRAt - W9awpEgDAJMf7y9t2rT2hZ6Ux94fl94lSkSadL7QK8yFwAXAPX7xxUhxMOpHXfGslKHdmVsAcInadCB+ - 6wh24UfCvBMPun7JGvxoUzqXgSwAR6X4OfAj4SadCMMsJGFJkdZegZBNmzb1jf3HuAXNvyhK/osadOZ3 - I9Q0/zNQj/8s3yQ0fk3e5uXY/2M/5/e7+c7NO2WiHvzll6PFazSapF6nZs2aa89KH4tSUn5t9rr8vPlH - GgDosBYtWuRtkyf/49VmwoTwWXYxOc0ENayl+Z8BxgXHgqKU+czdPGOIZdR4zdGYmQx8n/uZcpT+fLJW - +cXa0ckqlstu435cFy2J8nNy9ks9+IyWHvfYC+1OkvnOfJYv9R/aQeIe+9l8Jz8W8Qfa4DcA5yF+mI/X - q5clOitrtAPTMNhLRBYAGOxVq1YVPesi+tiVnzk2wtglqE4zk8BMchrFoGeC4vaKSYoLbxxTEqL75JNL - iVYk/ur5Ltd7TzGZwLSB/EziM+wp7xCNmJ+IPkzCupHfzPP875QDop5I3fE2TOJ/2oGbMRKfOZvnznOH - D+cGQyXAKECDhSHv7t9/QGwuWLUPHSJy8l75HzsMwAXAyP2N3w9JfqbeUtAvfyifi8RzBE9FZdePRF/g - m4C4gkGNpdh2RhYA2P9nZdUVFcvYBnnxmbLw7sIqxYTzIzEZuBjADFbKZRIzyQlxVrNmTW3aWkWvWjVk - ACMM5TcmK2BQvDgD/Jfl1o8K+1gGNIE29AcXkZQBAD5z3717j/ZVsFNfuzWw5ILEzp07JWIxoHPgwH6J - KAS3g7OQ/v1v9w0AmPQEah079isfKVZwUZEFACYFLr+drkYFk6LgXzZs2CARaLxCbDOgGdS0izYx2Rmc - BJyAbaxR4wyJ8otrbs6U08nvQN6egUb0BQpgXPGkvIAB17B37z5N19O1u/Mq8WTh2jOMWzgOuB7aEmSK - JAAwYVjlcEzpRyJ+HpFy3AQABiScBYnJjLcaTjSysuoJi8gKz56UyW5PHZLvZWjIVslvL8H51bxmzRoC - 7nAjbo6p/Moq6rvIAgArIZPE68S+0oR/TqazAC0mPBPfrPBM+AYNGshJBqs8K36uwM3rVtn8g6RAxYqV - hKvjCDKZMeVGGyIJAEwi9r4IAb1OsP84lnTSUXqu6737rys8E569OYCVkZEhkWvwqAsAxMvCet1Om79/ - FIAbufrqqyWOIMJAFgcS2wF+4+7X1iCSAADBzjyzji/s3JIlSxRHgEWx4WaF586Exz9ezZooKcHS11eZ - WgsM4Z0bwTb9G6q2JK8oAOf3978/Jf4COV36/vuN+vpeBJWYmhtu0WtQiCQAMBkJweRHwm6cbUB+0n+z - j6eTEOpg991QhyHDMAlBDyy9XeH96KVoloEPi549e0rlGWPIBFhs1q5dJ5GGcSm+ceMG7W9xmxgtcdrB - AmNAoahFKR6qRA4AIAD75Fq1vN//0xkoicSyY7GTHlfYsPIEnmjevJnKyMiUmATxEN4+YykQSwG4RsYT - 11lnnSU/MdY5rcD2ZP36Ddr13EoFt8C2AaE0npfhFBifbFFjx2ls3oV9jiQAsNqivOF1wtMtbq8hLAhN - Mooc55zTToyQatc+U0vx/dEN8Lq9Nv9wUYBxh34HF9xlx44dhAOAU8AcncVpxYqVEoAEK1X0IJxyBZEE - APbRuZpt3nYYCMtZLRwHKz323O3bt1cZWpCX35bA29rY3C0FcgWFjH8utpkkFJpGjx4jrunZJjjhBCIJ - AH4J0xA0Xn/9dWJvgNERknybLAXCRgF0G3r1ukLCkn/11VeOFqdIAgBsOHsmrxPKOQMGDPC6GJu/pYAr - FGBbjNzASYqkV4uKFSs4aaN91lIgLSiAzMppihwAIOQ47bTTnbbTPm8pkNIUwAhqy5ZcgbWThkYOADju - qFLlVCdttM9aCqQ8BbB2xFmN01OASAEA+xsAwArjUn482wY6pAB6AVg3pjQAQBMAoGRJe+7ucHzYx1Oc - AtnZa8QvgtNmRo4DMB5qnDbUPm8pkMoUgP1HWc2JDgD0iBQAUGE4gJNO8v4IkLJsshSIAgVQT9+4cWNC - VY0cAIBwTlEuIcrYlywFIkIBtFU3bfo+oXkRKQBACFimzCm++W+LSP/baqY5Bfbu3autCHc6FgBCtkgB - QJr3s22+pUC+FMAwCB8CiXDGFgDyJan90lIgOhTYtGmzWAImUuOIAoAzfedECGPfsRSICgVwGpLICQDt - ixQAwOLs25cjft+j0jm2npYCXlKAEwB8Vjg1AjJ1ihQAgHI0NDfohWmCvVsKpC8FcnI4AXBuA2AoFokD - dSY9kx+f+f363eKbP0BDpDDecQUFXXAAEU/K1Z/I1aBEXTQRgVE85dhn/KUA6r+oASfan6EHAOPz7KKL - LtK2+f19cQXmbxeeWBoeXgicuXv3Lu0ldqf4fsM/4fbtO7S+9x6JkcfZL6BoYvmdmMvx36BBiSs1WEYc - SODlCIWq0qU5Vi0nbqcqVKionZiW1lcZ+b9cubLi1JR3eT7RQXZ8TVLvPxPgw9DIqT5+MhTZsmWrOBNN - tMxQAwCBG3H+cfPNN6urrrpStACTIVZY36Wd69evF48uq1fjCXajTHyOdnAKia83JjuT14vExObCyUqu - rUVJmfBly5bRehe5PumwwMTLcaVKlcUas0aNGuKWjchFAAvvpWvCN9+HH36om19MwJWArJo5ExAFbNmy - cuc7ALZs2XLCvfEc4IrnaO64mTv55FL6WcD5pCKd3rA4jh8/XsZIovQPJQDA2jIpGjdupO655x6JnJOK - g2vjxu/VnDmz1ZQpU5WJP2AmuZmUZtU1E9QrOkBzBhQXgAOHQchsvo9Nph4MWi58M9aseYb4aKhdu5b2 - 1lxbAALvNOlitdm8eXNNs0Pq1VdfVYsXLxHOyvQbtIv9zEptJiuTnM/czYSHZgAq9185sFICJoAEznDg - NDCImzFjuho37uuEFIBMnxbr0qXr8T1sfgnozgCEKD169FC33XaruEkOqCqeFbtu3Tr18ccfq+nTZ4gN - N21mYCTKxnlW0QIyBhQMMJjP3Ok3BidcgQGFevWyJCgKcQ6rVasqW44Cso3819u2bVP//Ocg9fXXX8uk - z68/Dd1MY2P/N7T89bdjnyQ/gIQ8uXOxSELzWIAxb8R7DxUA0CDYzNtvv10DwCXxtiFSz02cOFF7b31V - AQJ0nunQSDWigMqawcwdToY77WPlIpZj9eqnq7p160qkJO4m+GkB2UXya4Syw4a9p69hIqClj91Mhsbk - mczEN3UKBQAwWFgF27Zto+666y4t7c8y9Uup+4gRn6t//OOfes+2r8j9XSo1nEFrQIF2MSlwaw0A4G69 - RYvmAgr87/aECYqOX345Wtx0I7z1w4Ftou0MHAAQbiEg6d27t7rpphtTdt/4zTffqKee+rv4cE+VQZ7o - oMsLCEwQOAS4gjZtWqtmzZrJUW/Uw6rNmjVLPfPMsxLzjz1+GFNgAMAgYPJn6CAbHO+df/75YaSPK3Ui - assjjwyU/X6YVwNXGptAJnkBAe4gUwdTPeectqp169YSKiuqYLB48WL19NPPSBSfMIJAiYyMzMcT6LOk - XjH7wy5duqhHHx0owTSTyjDEL7MnfPHFl9TChQtF0hviqgZWNfayXMgLuKAZ6q2zZ89WEyZMVP/9738l - Ph4CRo6FeSYqCZlWy5atJHwXbQob9+c7ACDoA+Fvu+02deedd/gS4ivIwTJ16lQ1dOgwGeBuCG2CbItf - ZceCAeMFc1dAADBYsGChSL8rVqwkR2N+1SmZcjjvb9u2rY76u1auMIGAbwBgWH7imT388EOqe/cLQoeG - yXRyfu8eOnRYDR48WAdwXBFqQVB+dQ/Ld7FgAGfAJAJUufCDhx5CFLgCjkaRb6xZsyZUIOALACDhpyM5 - 2mPym/DHYRlkXtWDo74hQ4YIS2tX/+SpDA3N6omW5Lx58zVXMEEi5KJhV7Vq1VADLco9yDRyOYHcY+Dk - qZJcDp4DACxclSpVhN3v169fZNi25Mia+zZSYII1MnAtALhB0dw8oCVyAMAArgBVXPQrFi1aqL8voYjp - iO5BGJMBgTVrso/pggRZT88AwLD8rVq1EkHfueeem3aTYNy4cWru3LnHVq0gOzpVyzZcAYLl9es3aLXq - KVpeMFs396jCXgHBYdgSINCyZUvZGmL3YbiaIOrpCQAY1darr75K/fGPD4jCRxCNC7JMAHDUqC9ldQqy - g4OkgZ9lGyCgTIJkTps2XdtZzBG9/Jo1a4buBKZs2bIKG4JFixaLLCOoMeI6ABiW/w9/uFf17dtXlHz8 - HAhhKQsAGD9+glq9enWgCB8WevhVD7M9oDyEhAABk6xy5UraPqFmqLhQjH4aNmwkXCIag0Ecb7oGAAx4 - Jn/Dhg2F5e/YsWOoiO3XAIwtBwFVKgEAfUzinvfieyZfWJLhCKjnhg0b5NRgw4b12lqxZqgMzNCAzNDK - cDNnzhSzXr9BwBUAMIo9F1xwgdZ4e1gaFJaBEFQ9GIDz5s0T89Cg2Ds32m7sNLiXKFFcVLXR42D1go1F - Q4/2odUZ67MgLGBggIDFadmy5cIRHDlyVDQNwyIoRFYBhzJjxixtE+M8vFcy/Zy0PwA6ncGAHv9VV10V - SqFLMgRK5l2QPaqTHzkOq2flypVFR79p06ZaP/9M8cgEAKDWWqxYcZn0eCVi383xFvbwy5evEDdVCOLC - ovrMyspFPQcNGiQrbr9+t6gmTZok08WuvYvHq82bt4jeCHT3C0ATBgAqyeTHgOPuu+8STSfXqJEiGdWt - myUrJl59/GbtEiWh4ebq1KmjLrigm2Irx+eiVstGjRpJkYwJpPGzZs0UZxXLli2T78PSfgCZsQvLjYJW - nz699dVHOJlEaebGe0z466+/TisKZeuj43FF0tuNMskjoS2AGSTduv1GWH60+2w6kQJwRhwDsgeNAifA - 5GV1v+GG68Usm6NbdDic1J2JDjvbuHFj1alTJ7Hyy85erf0a7tX5hEOH32wL9u/fr+0N5uiTmhUKbo22 - Bpnglho0aChjBuciTuieaL0dA4Bh+W+55Xfaim+AqGEmWniqvwebDL2mT58uTfWLrUuEruyRmQRoal56 - 6aXi1SeRfGLfwcwbIGjRooVWelkrOv1h4QSoJ3WhT9auXSccQYUK5YWjDbKfcr0p1dSyimnims3rusQN - AIblr1cvSw+ShxV7lrDs72IHXdg+4+Ri0aJFoeYCACn293/962Oe+F9ERbdNm7ZaCLcsdCDABGOlxbMv - Ltp2796t2M4EqUCEOzX6BIUmrwEzLgAwAqELL7xQPfTQw9qLS2p67PECPNg7c/4MosNyet2hTtsAsCPJ - /9OfHpSV2un78T7PiUG9evW1pHtGUm6s4y3P6XP0C+N84cJFYlvQsGGDQC1V69evL0pkCFa93AoUCQCw - hlhb9e9/u7r11lvFK6lT4qb786effro+KSmnvvvuOxlkXrN1TujNStOtWzcRQHldL1yLA4LIRbwuywkN - zLPUCSDAiAstwjp1MkSd2Pzu553tI1wZCwcemr1aOAoEAMPy5yr2PKK6du3qKRL5SdwgygLRCcSBkwto - G5YJwOrCEa5fFprscSdPnixKL2GhQd7xAE1wiY4xF+7N8U4URGLrpDFJFg7K94Je+QIArBCF9ezZU7P8 - DwoSBkGAVCoTerK3JEgECkJhAAFOczBMufLKXr5FXGJvPXnyFDmP92pVc2PcAAKsvIBAuXLltXS+gRvZ - Os4DYF6yZLFnMqQT9ABg+TkOQcp/2WWX2VXfcZcV/ELuanuT2Ee88cZbWnX6p8DpCzBRL78SZcHeRiEh - 5EaH4+WXX5Y7x6N+JwC6b98b1dKly3Ud3N8KHOMADMuPZhTqvJzhhhmh/e4It8qDptCYs/L58xeIl+Ag - 6Yxa7Hnnnat15Gu51cRC80ET79NPP5PV1QuWttDCE/iRvoEjhms7+eSTPDklKapa1atXF81KHIy6PVYE - ABAEIa1GI+qBB+5XZ555ZlF1Ct3vABghrRAycedigEGwMA40lKegM1Jnjp78XIVN50EXOL7KlU/VHnjP - MV97eucUYMyYsZ6W4Xbm0AkQmDt3nubeSvmuPkz5tWpxkjRdxoqbIFCSiVK7dm3x2NO5c2e3aedJfkx2 - NKXWrVuvre1W6f3RRoU5JdF09+8/cKxMjp7QbCMkFSrLXKi1BnnGe6xy+gOu0NluvfDCi1qHfvEv+vVa - 6uNjYjARyuriiy/yPCDL3r171fDhIwSco6ZDAp1YKF9//Q2t/3KSwteFn4k5ypb8jTfecFV+VOzhhx85 - 2r9/fy3pzPCzPQmV9eOP27VyxHeChOhxAwIHDhzU6HxY8stvpTfCNvadSKCNv/lOnTpr4POH7S2qsbkG - Kq8WGlOuqDyS+R0uAA4ARSCcbHqVMMJ5//0PXGdjvapvfvnCCaDh+Mc//lErw12Y3yOefbd9+3bR11i+ - fLlrSngldMSax4PWgS6KYsRA//TTT8SKa+TIUaKoAduMFBupOuwzFyid9zLfAwQHDhyQKC1oWOE6auvW - LbL3RWc/yASn0qFDe2Evly5dJtsYP7cElIW9wvr1G/Qet5nrfhvx2/fOO+/oENr/cXX1CqLPGF8AJjIB - JPR+yU5oKwpbCI7RJyHlt+DJDw7+lPjb3/72uIPnfX0UQo8aNUo9//wL6ttvv1U7d+6URptJ7YQAPMtl - AALVT/bf7EmRtBKjLsgES4yLqPr166ns7DXHjsmctDGZ+kOXNdpl9YIFC+RI0C3vOatWrdJS9FeE9c8F - 7HAYBCVLK2RNbNuwc8Cph18JpbLvvpulhYI/ylhOttwSj+uUbCZevI8nnZde+j/1wQcfyv6eCcIgdWtC - GCAAVGbMmClSaaTzQR9RMfGwwgPpV61aLasNdfUjUQ7bkSlTpopZKpwR3KFTboSJzsSH3X/ttdfFFsLQ - 2492+FEG7UHuhKpu+/btfTMnZrHCJTqaimZRS6a9xTRrnOvnKZlcXHyXPdbnn3+u3n13qISHYuK7NekL - qiYDlqtHjx7q/vvvkz1eQc/69T3dgqvrwYP/fcyxqF9AQNn0A1sTTisIaIFVH6sPqx0nRqZPeBbhGJNh - 69Zt2uBnqR6ccyUUGt+l2sTP2/9wqb16XaHuu+8+1/blecvI+z+c2v/8z58ErJ2Cc968QgUA7PXffPNN - 8aXPhEy2cXkbW9j/DGTKvPHGvhK2zK/JVlid+A1BJ3tntkIgvx+AaOpkgIDJjuALmxA4AoDBAABefzh5 - QXWWCY/ijOm7sNDQtMeLOzSCFvfee69oVHpRRt48oe8TTzypj1PHJA06oQEADETQuEIIBhv+6wDL23zv - /oewTLAHH3zQdwlvUa1CaWjo0KGimsqqAzj6SSMGugFJ7rGJenAx4f2sU2wdgvwMt4Te/hNPPKFVhv1x - jsPRLSBA2cnQPBQyAFj+Z599Ts7zY9lLvzsVQsLOLl26VEvDm2j9gWp+V6HA8mC/O3U6XyTPP/zwg7B/ - P//MKYg/8gFow0V5gE/sxXfpOvnpMNrOqRTHdLhQQ2PQ64R8BsUgs81KtLxAAQBji0GDXpV9LlJVVt+g - E53JCQHhptq2bSMOT4Oukykf+mRmZogC0Rln1NB+7zfLoINzMRPUPGvv/lKAccNRKopnyEvoDy8TwkC8 - LBHzIJmtcmAAgM31k08+pcaOHSsICgHDkqgLQSXWr1+v2rVrFwqhYCxt0GREOIcm4WmnVdPHo7sECAw7 - 6PXgi62L/ZxLAWgO/TlFgVNDTuJlojwmPlGSjdp7IuUFMutwvYRnIc7gg2T5CyMYcgh8+b3yyitayJVT - 2KOB/YZADvuNZ599Rsy2iTwLPZERMBht8p8CKOv4dZTMQgUQJAP4vvLcsKr/+c9H6l//+pdIixmsYU6w - 3KNHj9EcSglFqDPYrjAmpPOXXHKJ6tKli7YwJGT2RBEWwsUgsGOghInDCiMN3agT4zsrq65sA9zIr7A8 - KItTAGQPyQCObwCAws2rr76mvvzyS2lXGPb7hRGY3wybNXLkSPl87733hBYEqC+rD1sWLrZYcFqwiOiO - I9cgubFqSEb2z3EUAGiZiOz//QBbFOVmzfouqf0/DfAFANAKe+GFF0RBBCIlw7IcR3Uf/qGugBUgQCcT - BCVo24F4mo2pMdcVV1wmkXoYLBy1Zmdny6rBaYfhDKLUH/G0PYhnWJE5CiSCkh/p66+/ER8ByS6kngMA - 2mzogm/atEn2p34Qx+0yDCeAMg4mx/fff79vLrSSbUupUqVlUDIwUdLJDd+1WHT+V6/OFqEV3wNuJMMh - 8NkCA1SILyFzYfVHldvrxNZu0qRJrvSPZwDACjNs2DBR6eWIL5l9itcEjSd/wwlMnDhJVlDMQf1ypBlP - /eJ5BhkGTl65evXqJScHnHTgr3/lylUaHNaIkQn7SgY0fUii7bGXKcsCRC4lAE/kWdhwJLsiG9oWdoeb - 27hxY9LsP2V4ogmIWij7fYQUDBI/9kSFEczt35CyGycquE5LhXT06BENbHuErdy8ebOYTa9Zs1ZUkVE2 - QQ0Zhx7mhAGWl4vEBIjlIGK5iFSgTVFtAChZDJ5//jlRlS7q+WR+P3jwJ/XYY38Rgy03FlXXOQAcdWC+ - izQ6avv9eDuGdqH0gSrmas1GX3NNn1ALB+NpF5F+cQbCheckkxjcTHyEiPv25YhjSoCC/9kOoY2IQhdH - pZyB46WJOz4AOKdOBy6B3ZPx7mTo5tWd+ZWs8k9s3VwFgPHjJ+hz85clzHHYj/hiiZDIZ1g9tjaDBw8W - Kfvtt9+mtfSC8R+fSP3jfYd2cszIVVRCIQV1WFSpOT5FjwLOIJVBgK3S6adXk0jKRdHHjd8nTpxwzCjM - jfxcAQDYwg8++EDv99+VVcIN1sSNxnmdB6wuAxxBJ8cyBNjo3r17ZIWdydIL0MeDLRc28h9//LF6++13 - ktJUS7ZOXr8PALAN9MORLtayHOu6CahJA8COHdu1Pn/ufh9i+yEE8bpTneRPZwB433//vXruuefFuQhA - ELSHISdt8OJZzIf79u0rcoX33nvPFYGVF/VMJk8mP5GD8CPhh5xr6tQpYjCXjO5/3vYmpQrM+f5f/vJX - fUY+KiWFfXmJVdj/dApCMVyXoeaMIw+EoemerrjickWEZCZLqiX6m4C5WVlZnjcNOcy4cV/rkxl36Zgw - AHAcNnDgo6Jcgvmjm2yJ59T0qABoAAeEuS6yASLufv75FyIk86jI0GfLdgDZiDklCH2F46wgwlFOgnr2 - vNSXsY8jUGQrJUu6G8XJ8RaA/f6HH36ohgxhv78v8uf7cfa3o8cMi5Z7IvK8HIdefvnl4vk3ClqEjhpb - xMOwxhUrVijiqWj9DJiVKFFcYgMAAl4n5tzYsV/JyYrb8jVHAJCrz/+q1ucfLW1Ot/2+046GPgwWXEjj - QbZevSztaehiMRdFbTQdEmyysUNIlfay+rdu3UoHU7nYlyYtXLhQOG0v5lvcAIAO+YsvviThrdPlfNeN - 3jXbAibC4sVLxOUZ0vEu2nKva9cuokDihwDJjbYkkgdHpQR0SZVEP8LR/O53t0igGa/bhewEA7pkrf4K - qmdcAIDrIezi0SN3mwUpqGKp9r0BAtqF+i2BMnCF1rJlCzlGwr982AO0JNInKAZxQpIqIMeEvOKKXjoe - QPNEyOH4HTxT4bbebCsdZ1DEC4UCAOzr8OHDdTyyNz1DoCLql5I/m85EvRarrkmTJotAicAgbdu2VY0a - NUwZMJg2baoEdDFtjnKHshdv2bKluvbaa3wR/DH/sELlNMmrhbdAAMjJ2S+OOz755BMxCvFi/xHlweBG - 3VkVuWAr2WJxrIrFIcdmWJa1atVSItHinDSK9MdgBeFVKiRWfmIi9O9/u6hL+9EmxgSnbV6CZ74AgC73 - SzoqDyaHDFAvK+AHIcNeBtsDaMyFgInAD2gWjh49WhRNMjIyBAjOPru+yAwqV64c+j5hwnBSBAhEEbxi - xwwrMX2EYpNf9v6Uz2LAkbJXqz9lnAAAS5Ys0cY8z6slS5Z6WjCF23QiBWLBgIGHHwX20KiAYs6LnIBz - 9YyMOjqO4NmaW6ghIEHk47AANfUeNuw9cfgaljqdSOn4v4H1x+XalVf2iv+lJJ/ERHvMmLGe9+lxAIAx - D8E5cDjgJeokSZu0ed2AgWkwFnZYISJYmzBBSTRhvM9WrVpFG6RUl0i1OKTAUzAqqrio5nfUcv0SwmEM - RACTzz4bLtp/fpVraOT2ncnPdmzAgP6+2Xho/JRgqtDSa6M6AQD2oOhrv/32EB1CO/rOO9weBGHJzwCC - 3ilIYruAbgYDZdmy5fo7thLFZdAw8eEY2C6wd8XMF4s+9A8qVaoo/gPxFlS2bJljz5MpLsfjWbUJtX7k - CCHXc7SCyk+ipIKmGmrhKEAx8aM++aEvAVnuu+8PvgaJWbJksRiY+bF1KsngwUsvKqukeDpfHrR/AqcA - gMCVd6KxauHEg77lyBGWnGSexcsxQEFfM+Hh9sqUOYUnhKsoWbLoyDZogZLvwYMHtLXfIQEAExfQj4Er - DfLwDzIMnKzeeecd+lSmkYclHZ81oPPRRx8JsPvBhZfEcIX9BoOIAWJT9ClggKGgluD95/BhrsN6BT8g - jxmQMPeC3jXfx44VU14qrPq0D44YkLzllt+pbt26mSb7ckfnf/LkKb4txCWZ/HbV96VvQ1NI3skbmoqF - oCIAINc11/SWoCuxtPK6enBQ77//gThv9WP1pz3F7eT3ultt/lGiAKw/9v233trP9+NLwuTNmTPHVwF8 - wubAUepUW1dLgXgogOyki7bRuOeeu32PB4m+BFGz4t2CxdOeeJ457hgwnhfsM5YCYaWAmTyGjTeyCepb - FCvP5D///PPUAw/c73lgz7z0g+tAbyIIWxsLAHl7w/4fGQqYiY7Qjs9sZzk3RykK3QcEnJxWIOzk4hkj - 7DaAwHf8hl+/Bx/8U1zOT90mEEFyv/rqq0BkcRYA3O5Nm5+nFGDCMuG5mOzoN6D8lJmZoRWhamsNyQxR - gipdupQAAIY0hE9ndV24cIG4cce01gAC+XXuHNzkp364j8NsOojjUwsAng5Xm7lbFEDp6OefD4uADC88 - zZs30ya5LbQ6dH1RbmLVzy9larVpk5Cyo1qN0hTq1T/8sE2z++XUjTfeEMjKD/i89977Wu1+ia+CP0MP - 7hYAYqlhP4eOAqz07JGZ4BjidNVOVFq3bqM19E5zXFc0Iwl6Ehv4xHEmLr6AsR3m9kGs/KYZFgAMJew9 - VBQwe3NUmjt27KguvbSHWESyt0+FhE0HfjaQU1gASIUetW1wjQKs+AjpWrdura677jrVpk3rwFhk1xoV - kxH7/UGDXhUfEH4p/MQUf9xHywEcRw77T9AU4DgOk2e87uBJuaC9fdD1TKb8oUOHia+NoCc/bbAAkExP - 2nddo4Bh+fGR2L//AL3fb+Ja3mHKCI/ahNEzx5BB180CQNA9YMs/5jfgqquuVP369QtEIu9HN0yfPkOz - /oPEcjIsKvgWAPzoeVtGgRRgv49JMhO/T5/egQrECqykCz8QG+LZZ58VM+0ghX55m2IBIC9F7P++UQBl - HBR57r33Homx51vBPhc0d+5c9eSTT4mnrTBNfshgAcDnwWCLy6UAwr4aNWpo3fsHJGRaqtKFiL7PPfe8 - 2rp1Wyi5GwsAqTryQtwuVn5cnw8c+Iho84W4qglXDQWmESM+V6+//roism/YVn7TMGsObChh775QgMmP - n71HHnk4ZSc/hMSd97///W+JixgWgV9+HWwBID+q2O88oQACP/b8mNwSYSeVE/r9BEUN8+SH/hYAUnkU - hqhtsMSo8eJhF9XeVE9Eg8aNe1jO+wuitwWAgihjv3eNAkx+VsIBAwaoCy64wLV8w5oR+v0E1gn75Id+ - FgDCOopSqF4AQJ8+fXyNrBMk+TA5JnhLXnftQdapoLItABREGfu9KxT46aeftLedzurmm38biQnhRqPx - tL1r107LAbhBTJtHdCnAWf/ZZ5+t7r779xKlKLotib/m2DQAAJx22C1A/HSzT6YYBZD4V658qnjYReEn - XRKmvrlh2qLRYrsFiEY/RaqWrILsf2+++aaUP+7L2zG4GuOKwv6fulsAyNuD9v+kKQDrj+su7PnTLS1d - yv5/lwWAdOt4295cCrD3zczM0JF1bhWvvelEFzif5ctz9/9RabflAKLSUxGoJxPAmPbWqlUrAjV2t4p7 - 9+6T/X8UhH+m5RYADCXsPWkKsPpffPHF2s9+56TzimIGhGJHB8ACQBR7z9Y5KQow+bOystRvf3tT6PTf - 4Uy4vE6rVq1UBB2JigAQelhzYK9HRRrkz+RCz5+Iuqed5txfvxckIuLO8uUrtER+o2jlXX/9dap69epe - FCV5ou04f/4COf8Pg7PPeBtqASBeStnnCqQAq3+PHpcEbuRz8OABNW/efDVhwkSFF54tW7aqnJx9Euzz - wgsv9BQAWPlXrVoVqdWfDrUAUOCwtj/EQwEUfhD49e17Q2CsP3XA4eYnn3yiFixYoCd9jkxEWHHiB/L7 - 1q1bVOPGjeJpUkLPZGdny/4/Suw/DbUAkFB325egAKw/Aq9rrrlGB+gMRuqP0c277w5R48dPkImP5528 - LDj2CCjneJk4/ycScdjt//PSwAJAXorY/+OmAKw/0XsuuuiiuN9x88FvvvlWvfnmm3qPv05cbuWd+KYs - 9uc7duw0/7p+hw44ACGAqbZ6jlSyABCp7gpPZVn9CbZ500036j12GV8rxor+zjvvqA8//I+E1S5o4ptK - wZZv3bpVC+h+1kDh/gzdvn27Wrlypd52FDNFRuZuASAyXRWuiqLue8kll6hWrVr5WjHUbP/xj3+o0aPH - yPYjHmebbFM2b96kwSJHlS9f3vX6ZmevUZw6RG3/DyEsALg+HFI/Q1hqjvtw8uHnoMfR5jPPPKumTJki - LH+8Cjc8t3PnLh2J96AnALB06VLhRKK2/2ekWk3A1J+vrrcQqfpll/VUZ52V6XreBWX4448/qKefflpN - nuxs8pMfAICAbseO7QVln/D3cEL4//ND0SjhShbyogWAQohjfzqRAkz+OnXqqJ49e574o0ffcMb+9NPP - qqlTp+ljvZMcq9oCAPjpQw7gdoL1RwU4Xm7E7fKTzc8CQLIUTKP3zSp35ZW9fNP4w7Puyy+/Imx/UcK+ - grqCyclKvWPHjoIeSfj7FStWqm3btvm6FUq4svm8aAEgH6LYr/KnAKt//fr1fPPsi6zhrbf+pcaMGZN0 - ZB3qjmag2wn3X3AXlgNwm7I2v1BRgNUfIVfv3r19C989YsQI9dFHH8nqmuwE433O6jmzdytxHIkAMMrJ - cgBR7j0f684K2rRpU3X++ef7Uurs2bNl9WfCJjv5qTDHhXPmzNHhut5WnNsfOvRT0oK71atX/3L+H91p - ZI8BfRnO0S6E1R+d+uuuu1YMa7xuzZYtW9Qrr/xDH93tTJr1N3UFRNhSDBkyRH377TeqSpUq2nlJabFi - LF26lIQsK1OmrD4mLCdtpL04N8HKsWzZsuqUU06Rz7yDMtGaNWvUa6+9JmASxeM/QxcLAIYS9l4gBViF - 27Vrp9q2bVvgM279QFlvvfWWuNZmErqZAAGu9es3qLVr12kOgNxz7Rn4ZDiN3HsxvfUoJgAEECCA5ASi - VKlT9FaomAj+9uzZGzndf9oZmywAxFLDfj6BAqz+rH69evUSLuCEB1z+Ag2/ceO+PsGgx81iWLHjXbUB - JE4QSOYUhHvx4vHn4Wbd3c7LAoDbFE2x/JgA7du300Y/3qv8wlYPHjxYBHXxTlCvyW24Bq/LCSr/6Eov - gqJYGpXLSsceGPfebrPjeckI0Lz99jv6qG5L3Ktz3jzs/84pYAHAOc3S5g0mZbNmzcTk1+tGT5o0SXvy - meCa0M/r+qZK/hYAUqUnXW4Hqz+Crx49eog03OXsj8sOC7+hQ4cpztWNIO64B+w/nlHAAoBnpI12xpz7 - N2rUSPv56+B5Q4YPHyEKNYmq+npewRQuwAJACnduok3LlXIXV5de2sPzqL4Y0nz22WeR1aVPlMZhec8C - QFh6IkT1QGEGU9/zzjvP81rh1ccK/jwnc4EFWAAokDTp+wMcABF+KlSo4CkRsKP/5ptvrODPUyoXnrkF - gMLpk3a/svc/44wzPA/vBcgMHz48UpF0U3EwWABIxV5Nok2w/126dPY0iAbVW7JkqTj4CIvCTxIki/Sr - FgAi3X3uVp7JX6lSJc/t/Vn9P/98hDjo8NOnoLvUSo3cLACkRj+60goUfzp0aK/q1q3rSn4FZbJ48RLx - 7WdX/4Io5N/3FgD8o3WoS2JVxs8/QT68XJUpZ+TIkXb1D8losAAQko4Iuhqs/s2bNxOnH17WhQAa06ZN - s/r+XhLZQd4WABwQK1UfZVWGHe/evbvnar9jx36l8O/vJZeRqv3kRbtSBgBS3WzTi843eSL8w9W31w4/ - cMtNUA+r728oH/zdAkDwfRB4DQCAzp07q1NPPdXTukycOFGi9Frhn6dkdpR5ygAAg5jLJmcUQPGncuXK - qlMnb5195uTkaF983yrKsyk8FEgZAAgPSaNTk9y9f0kJ8nnWWWd5WvG5c+cpgmjY1d9TMjvO3AKAY5Kl - zgsAQMOGDbTV36WeTkx86n399dcqJ2e/3f+HbPhYAAhZh/hVHSY/7q7x81+jRnVPi+Xob+7cuRpk7HDz - lNAJZG57JAGipcIrsOLNmzdX557b0VN/f+z5Z86cJf7z7dFf+EaOBYDw9YnnNWL1r1mzpuratate/Wt4 - Wt7GjRvVjBkzrPDPUyonnrkFgMRpF9k3sfNv06aN1vpr4qn/fQi0fPlyHYRjrVX8CelosQAQ0o7xolqs - /MTIy8zMFADw+tx/37592tffMrV//34vmmPzdIECFgBcIGJUsmAPXrVqVdWiRQtx+eW1r/8NGzZIiC/k - AFb7L5yjxAJAOPvFk1oR5ANff0T5RfnHy4SL71WrVqlNmzZ5WYzNO0kK/H+6oda4SM7f8AAAAABJRU5E - rkJggg== - - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.Designer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.Designer.cs deleted file mode 100644 index 031d56c31d..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.Designer.cs +++ /dev/null @@ -1,149 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -namespace RemoteConsole -{ - partial class FormAbout - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.panel1 = new System.Windows.Forms.Panel(); - this.label1 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.rtbMidi = new System.Windows.Forms.RichTextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // panel1 - // - this.panel1.BackgroundImage = global::RemoteConsole.Properties.Resources.fractal; - this.panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.panel1.Location = new System.Drawing.Point(1, 2); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(228, 147); - this.panel1.TabIndex = 0; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.ForeColor = System.Drawing.SystemColors.HotTrack; - this.label1.Location = new System.Drawing.Point(12, 152); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(199, 17); - this.label1.TabIndex = 1; - this.label1.Text = "Universal Remote Console"; - this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(107, 178); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(109, 13); - this.label3.TabIndex = 3; - this.label3.Text = "Author: Dario Sancho"; - this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.Location = new System.Drawing.Point(12, 178); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(94, 13); - this.label2.TabIndex = 4; - this.label2.Text = "(c) Crytek 2014"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // rtbMidi - // - this.rtbMidi.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.rtbMidi.BackColor = System.Drawing.SystemColors.Control; - this.rtbMidi.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.rtbMidi.Location = new System.Drawing.Point(15, 231); - this.rtbMidi.Name = "rtbMidi"; - this.rtbMidi.ReadOnly = true; - this.rtbMidi.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; - this.rtbMidi.Size = new System.Drawing.Size(201, 57); - this.rtbMidi.TabIndex = 5; - this.rtbMidi.TabStop = false; - this.rtbMidi.Text = "The Midi code is based on Tom Lokovic\'s [https://code.google.com/p/midi-dot-net/]" + - " project, adapted by Ramon Villadomat and Dario Sancho."; - this.rtbMidi.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.rtbMidi_LinkClicked); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.Location = new System.Drawing.Point(62, 210); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(92, 13); - this.label4.TabIndex = 6; - this.label4.Text = "Acknoledgements"; - this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // FormAbout - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(228, 300); - this.Controls.Add(this.label4); - this.Controls.Add(this.rtbMidi); - this.Controls.Add(this.label2); - this.Controls.Add(this.label3); - this.Controls.Add(this.label1); - this.Controls.Add(this.panel1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.Name = "FormAbout"; - this.Text = "About"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormAbout_FormClosing); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.RichTextBox rtbMidi; - private System.Windows.Forms.Label label4; - } -} \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.cs deleted file mode 100644 index f849897246..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.cs +++ /dev/null @@ -1,45 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace RemoteConsole -{ - public partial class FormAbout : Form - { - public FormAbout() - { - InitializeComponent(); - rtbMidi.SelectAll(); - rtbMidi.SelectionAlignment = HorizontalAlignment.Center; - } - - private void FormAbout_FormClosing(object sender, FormClosingEventArgs e) - { - e.Cancel = true; - this.Hide(); - } - - private void rtbMidi_LinkClicked(object sender, LinkClickedEventArgs e) - { - System.Diagnostics.Process.Start(e.LinkText); - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.resx b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.resx deleted file mode 100644 index 1af7de150c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormAbout.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.Designer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.Designer.cs deleted file mode 100644 index d31bc943d7..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.Designer.cs +++ /dev/null @@ -1,77 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -namespace RemoteConsole -{ - partial class FormButtons - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.lvToggles = new System.Windows.Forms.ListView(); - this.SuspendLayout(); - // - // lvToggles - // - this.lvToggles.CheckBoxes = true; - this.lvToggles.Dock = System.Windows.Forms.DockStyle.Fill; - this.lvToggles.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.lvToggles.Location = new System.Drawing.Point(0, 0); - this.lvToggles.MultiSelect = false; - this.lvToggles.Name = "lvToggles"; - this.lvToggles.Size = new System.Drawing.Size(283, 354); - this.lvToggles.TabIndex = 3; - this.lvToggles.UseCompatibleStateImageBehavior = false; - this.lvToggles.View = System.Windows.Forms.View.Details; - this.lvToggles.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.lvToggles_ItemChecked); - // - // FormButtons - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(283, 354); - this.Controls.Add(this.lvToggles); - this.Name = "FormButtons"; - this.Text = "Toggle Buttons"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormButtons_FormClosing_1); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.ListView lvToggles; - } -} \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.cs deleted file mode 100644 index 836c14c81a..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.cs +++ /dev/null @@ -1,142 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; -using System.Windows.Forms; - -namespace RemoteConsole -{ - public partial class FormButtons : Form - { - DelSendCommandToTarget delSendCommand; - - public FormButtons() - { - InitializeComponent(); - } - - public void SetEntries(List entries, DelSendCommandToTarget callabck) - { - delSendCommand = null; - lvToggles.Clear(); - - lvToggles.FullRowSelect = true; - lvToggles.GridLines = true; - lvToggles.Location = new System.Drawing.Point(3, 3); - lvToggles.UseCompatibleStateImageBehavior = false; - lvToggles.View = System.Windows.Forms.View.Details; - // lvToggles.ContextMenuStrip = contextMenu; - - ColumnHeader columnHeader0 = new ColumnHeader(); - columnHeader0.Text = "Toggle"; - columnHeader0.Width = -1; - - lvToggles.Columns.AddRange(new ColumnHeader[] { columnHeader0 }); - lvToggles.Width = -1; // autosize it to the width of the widest element in the column - - foreach (var entry in entries) - { - if (entry.ToggleParams != null) - { - // Populate List View - ListViewItem lvi = new ListViewItem(entry.Name); - lvi.Tag = entry; - //lvi.ToolTipText = - - ListViewGroup group; - int gIdx = GetGroupIndex(entry.ToggleParams.GroupName); - if (gIdx < 0) - { - group = new ListViewGroup(entry.ToggleParams.GroupName); - lvToggles.Groups.Add(group); - } - else - { - group = lvToggles.Groups[gIdx]; - } - - group.Items.Add(lvi); - - lvToggles.Items.Add(lvi); - } - } - - lvToggles.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - lvToggles.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - delSendCommand = callabck; - } - - // ------------------------------------------------------------------------ - - private void SendSliderCommand(ParamsFileInfo.CEntry entry, int value) - { - if (delSendCommand != null) - { - ParamsFileInfo.CEntryTag tag = entry.GenerateEntryTag(); - - // Send commands - tag.ModCmds = new List(); - for (int k = 0; k < tag.Entry.Data.Count; ++k) - { - string s = value.ToString(); - tag.ModCmds.Add(tag.Entry.Data[k].Replace("#", s)); - } - delSendCommand(tag); - } - } - - // ------------------------------------------------------------------------ - - private int GetGroupIndex(string name) - { - int index = -1; - for (int i = 0; i < lvToggles.Groups.Count; ++i) - { - ListViewGroup g = lvToggles.Groups[i]; - if (g.Header == name) - { - index = i; - break; - } - } - - return index; - } - - // ------------------------------------------------------------------------ - - private void lvToggles_ItemChecked(object sender, ItemCheckedEventArgs e) - { - if (e.Item.Tag != null && delSendCommand != null) - { - ParamsFileInfo.CEntry entry = (ParamsFileInfo.CEntry)e.Item.Tag; - if (entry.ToggleParams != null) - { - int value = e.Item.Checked ? entry.ToggleParams.On : entry.ToggleParams.Off; - SendSliderCommand(entry, value); - } - } - } - - // ------------------------------------------------------------------------ - - private void FormButtons_FormClosing_1(object sender, FormClosingEventArgs e) - { - e.Cancel = true; - this.Hide(); - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.resx b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.resx deleted file mode 100644 index 1af7de150c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormButtons.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.Designer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.Designer.cs deleted file mode 100644 index c482d1ee8c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.Designer.cs +++ /dev/null @@ -1,164 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -namespace RemoteConsole -{ - partial class FormSettings - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.cbMode = new System.Windows.Forms.ComboBox(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.btEditFilters = new System.Windows.Forms.Button(); - this.btEditMenus = new System.Windows.Forms.Button(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.cbDebugMidi = new System.Windows.Forms.CheckBox(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.groupBox3.SuspendLayout(); - this.SuspendLayout(); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.cbMode); - this.groupBox1.Location = new System.Drawing.Point(12, 12); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(229, 53); - this.groupBox1.TabIndex = 1; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Operation Mode"; - // - // cbMode - // - this.cbMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cbMode.FormattingEnabled = true; - this.cbMode.Location = new System.Drawing.Point(6, 19); - this.cbMode.Name = "cbMode"; - this.cbMode.Size = new System.Drawing.Size(207, 21); - this.cbMode.TabIndex = 0; - this.cbMode.SelectedIndexChanged += new System.EventHandler(this.cbMode_SelectedIndexChanged); - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.btEditFilters); - this.groupBox2.Controls.Add(this.btEditMenus); - this.groupBox2.Location = new System.Drawing.Point(12, 71); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(229, 61); - this.groupBox2.TabIndex = 2; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Edit Configuration Files"; - // - // btEditFilters - // - this.btEditFilters.FlatAppearance.BorderSize = 2; - this.btEditFilters.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btEditFilters.Location = new System.Drawing.Point(138, 20); - this.btEditFilters.Name = "btEditFilters"; - this.btEditFilters.Size = new System.Drawing.Size(75, 35); - this.btEditFilters.TabIndex = 1; - this.btEditFilters.Text = "Filters"; - this.btEditFilters.UseVisualStyleBackColor = true; - this.btEditFilters.Click += new System.EventHandler(this.btEditFilters_Click); - // - // btEditMenus - // - this.btEditMenus.FlatAppearance.BorderSize = 2; - this.btEditMenus.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btEditMenus.Location = new System.Drawing.Point(6, 20); - this.btEditMenus.Name = "btEditMenus"; - this.btEditMenus.Size = new System.Drawing.Size(75, 35); - this.btEditMenus.TabIndex = 0; - this.btEditMenus.Text = "Menus"; - this.btEditMenus.UseVisualStyleBackColor = true; - this.btEditMenus.Click += new System.EventHandler(this.btEditMenus_Click); - // - // groupBox3 - // - this.groupBox3.Controls.Add(this.cbDebugMidi); - this.groupBox3.Location = new System.Drawing.Point(18, 139); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(200, 51); - this.groupBox3.TabIndex = 3; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "Debug"; - // - // cbDebugMidi - // - this.cbDebugMidi.AutoSize = true; - this.cbDebugMidi.Location = new System.Drawing.Point(7, 20); - this.cbDebugMidi.Name = "cbDebugMidi"; - this.cbDebugMidi.Size = new System.Drawing.Size(45, 17); - this.cbDebugMidi.TabIndex = 0; - this.cbDebugMidi.Text = "Midi"; - this.cbDebugMidi.UseVisualStyleBackColor = true; - this.cbDebugMidi.CheckedChanged += new System.EventHandler(this.cbDebugMidi_CheckedChanged); - // - // FormSettings - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(251, 202); - this.Controls.Add(this.groupBox3); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBox1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.HelpButton = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "FormSettings"; - this.Text = "Settings"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormSettings_FormClosing); - this.groupBox1.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox3.ResumeLayout(false); - this.groupBox3.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.ComboBox cbMode; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Button btEditFilters; - private System.Windows.Forms.Button btEditMenus; - private System.Windows.Forms.GroupBox groupBox3; - private System.Windows.Forms.CheckBox cbDebugMidi; - } -} \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.cs deleted file mode 100644 index a27a6facf4..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.cs +++ /dev/null @@ -1,110 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace RemoteConsole -{ - public partial class FormSettings : Form - { - private DelSettingsChange delSettingsChange; - private CSettings settings = new CSettings(); - - public FormSettings() - { - InitializeComponent(); - - cbMode.Items.Clear(); - cbMode.Items.Add("Online [Full]"); - cbMode.Items.Add("Online [Commands Only]"); - cbMode.Items.Add("Online [Files Only]"); - cbMode.SelectedIndex = 0; - cbMode.Select(); - } - - public void SetSettingsChangeDelegate(DelSettingsChange callback) - { - delSettingsChange = callback; - } - - private void WarnAboutMissingFiles(string fileName) - { - string message = - "Missing file: " + fileName + "\nPlease please the file in the given directory (same folder as the executable)."; - const string caption = "Missing Config File!"; - var result = MessageBox.Show(message, caption, - MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - - private void btEditMenus_Click(object sender, EventArgs e) - { - System.IO.FileInfo fileInfo = new System.IO.FileInfo(Common.MenusFileFullPath); - - if (fileInfo.Exists == true) - { - System.Diagnostics.Process.Start(/*"notepad.exe", */Common.MenusFileFullPath); - } - else - { - WarnAboutMissingFiles(Common.MenusFileFullPath); - } - } - - private void btEditFilters_Click(object sender, EventArgs e) - { - System.IO.FileInfo fileInfo = new System.IO.FileInfo(Common.FiltersFileFullPath); - - if (fileInfo.Exists == true) - { - System.Diagnostics.Process.Start(/*"notepad.exe", */Common.FiltersFileFullPath); - } - else - { - WarnAboutMissingFiles(Common.FiltersFileFullPath); - } - } - - private void FormSettings_FormClosing(object sender, FormClosingEventArgs e) - { - e.Cancel = true; - this.Hide(); - } - - private void cbMode_SelectedIndexChanged(object sender, EventArgs e) - { - UpdateSettings(); - if (delSettingsChange != null) delSettingsChange(settings); - } - - private void cbDebugMidi_CheckedChanged(object sender, EventArgs e) - { - UpdateSettings(); - if (delSettingsChange != null) delSettingsChange(settings); - } - - private void UpdateSettings() - { - settings.DebugMidi = cbDebugMidi.Checked; - if (cbMode.SelectedIndex >= 0) - settings.Mode = (CSettings.EMode)cbMode.SelectedIndex; - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.resx b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.resx deleted file mode 100644 index 1af7de150c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSettings.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.Designer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.Designer.cs deleted file mode 100644 index 58d9ebdc11..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.Designer.cs +++ /dev/null @@ -1,218 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -namespace RemoteConsole -{ - partial class FormSliders - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSliders)); - this.panelSlider = new System.Windows.Forms.Panel(); - this.layoutPanelSlider = new System.Windows.Forms.TableLayoutPanel(); - this.trackBar1 = new System.Windows.Forms.TrackBar(); - this.lblMax = new System.Windows.Forms.Label(); - this.lblMin = new System.Windows.Forms.Label(); - this.lblName = new System.Windows.Forms.Label(); - this.rtbValue = new System.Windows.Forms.TextBox(); - this.lvSliders = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.rtbDescription = new System.Windows.Forms.RichTextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.panelSlider.SuspendLayout(); - this.layoutPanelSlider.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); - this.SuspendLayout(); - // - // panelSlider - // - this.panelSlider.Controls.Add(this.layoutPanelSlider); - this.panelSlider.Location = new System.Drawing.Point(251, 12); - this.panelSlider.Name = "panelSlider"; - this.panelSlider.Size = new System.Drawing.Size(300, 90); - this.panelSlider.TabIndex = 0; - // - // layoutPanelSlider - // - this.layoutPanelSlider.ColumnCount = 3; - this.layoutPanelSlider.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 15F)); - this.layoutPanelSlider.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 70F)); - this.layoutPanelSlider.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 15F)); - this.layoutPanelSlider.Controls.Add(this.trackBar1, 1, 1); - this.layoutPanelSlider.Controls.Add(this.lblMax, 2, 1); - this.layoutPanelSlider.Controls.Add(this.lblMin, 0, 1); - this.layoutPanelSlider.Controls.Add(this.lblName, 1, 0); - this.layoutPanelSlider.Controls.Add(this.rtbValue, 1, 2); - this.layoutPanelSlider.Dock = System.Windows.Forms.DockStyle.Fill; - this.layoutPanelSlider.Location = new System.Drawing.Point(0, 0); - this.layoutPanelSlider.Name = "layoutPanelSlider"; - this.layoutPanelSlider.RowCount = 3; - this.layoutPanelSlider.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.layoutPanelSlider.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); - this.layoutPanelSlider.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.layoutPanelSlider.Size = new System.Drawing.Size(300, 90); - this.layoutPanelSlider.TabIndex = 1; - // - // trackBar1 - // - this.trackBar1.Dock = System.Windows.Forms.DockStyle.Fill; - this.trackBar1.Location = new System.Drawing.Point(48, 23); - this.trackBar1.Name = "trackBar1"; - this.trackBar1.Size = new System.Drawing.Size(204, 34); - this.trackBar1.TabIndex = 0; - this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll); - // - // lblMax - // - this.lblMax.AutoSize = true; - this.lblMax.Dock = System.Windows.Forms.DockStyle.Fill; - this.lblMax.Location = new System.Drawing.Point(258, 20); - this.lblMax.Name = "lblMax"; - this.lblMax.Size = new System.Drawing.Size(39, 40); - this.lblMax.TabIndex = 2; - this.lblMax.Text = "1"; - this.lblMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // lblMin - // - this.lblMin.AutoSize = true; - this.lblMin.Dock = System.Windows.Forms.DockStyle.Fill; - this.lblMin.Location = new System.Drawing.Point(3, 20); - this.lblMin.Name = "lblMin"; - this.lblMin.Size = new System.Drawing.Size(39, 40); - this.lblMin.TabIndex = 1; - this.lblMin.Text = "0"; - this.lblMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // lblName - // - this.lblName.AutoSize = true; - this.lblName.Dock = System.Windows.Forms.DockStyle.Fill; - this.lblName.Location = new System.Drawing.Point(48, 0); - this.lblName.Name = "lblName"; - this.lblName.Size = new System.Drawing.Size(204, 20); - this.lblName.TabIndex = 3; - this.lblName.Text = "Slider Name"; - this.lblName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // rtbValue - // - this.rtbValue.Dock = System.Windows.Forms.DockStyle.Fill; - this.rtbValue.Location = new System.Drawing.Point(48, 63); - this.rtbValue.Name = "rtbValue"; - this.rtbValue.Size = new System.Drawing.Size(204, 20); - this.rtbValue.TabIndex = 4; - this.rtbValue.Text = "0"; - this.rtbValue.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - this.rtbValue.KeyUp += new System.Windows.Forms.KeyEventHandler(this.rtbValue_KeyUp); - // - // lvSliders - // - this.lvSliders.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1}); - this.lvSliders.FullRowSelect = true; - this.lvSliders.GridLines = true; - this.lvSliders.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.lvSliders.HideSelection = false; - this.lvSliders.Location = new System.Drawing.Point(13, 12); - this.lvSliders.Name = "lvSliders"; - this.lvSliders.Size = new System.Drawing.Size(213, 184); - this.lvSliders.TabIndex = 1; - this.lvSliders.UseCompatibleStateImageBehavior = false; - this.lvSliders.View = System.Windows.Forms.View.Details; - this.lvSliders.SelectedIndexChanged += new System.EventHandler(this.lvSliders_SelectedIndexChanged); - // - // columnHeader1 - // - this.columnHeader1.Text = "Select a Slider"; - // - // rtbDescription - // - this.rtbDescription.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.rtbDescription.Enabled = false; - this.rtbDescription.Location = new System.Drawing.Point(251, 136); - this.rtbDescription.Name = "rtbDescription"; - this.rtbDescription.Size = new System.Drawing.Size(300, 60); - this.rtbDescription.TabIndex = 2; - this.rtbDescription.Text = ""; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(372, 120); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(59, 13); - this.label1.TabIndex = 3; - this.label1.Text = "Commands"; - // - // FormSliders - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(561, 208); - this.Controls.Add(this.label1); - this.Controls.Add(this.rtbDescription); - this.Controls.Add(this.lvSliders); - this.Controls.Add(this.panelSlider); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormSliders"; - this.Text = "Sliders"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormSliders_FormClosing); - this.panelSlider.ResumeLayout(false); - this.layoutPanelSlider.ResumeLayout(false); - this.layoutPanelSlider.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Panel panelSlider; - private System.Windows.Forms.TableLayoutPanel layoutPanelSlider; - private System.Windows.Forms.TrackBar trackBar1; - private System.Windows.Forms.Label lblMax; - private System.Windows.Forms.Label lblMin; - private System.Windows.Forms.Label lblName; - private System.Windows.Forms.TextBox rtbValue; - private System.Windows.Forms.ListView lvSliders; - private System.Windows.Forms.RichTextBox rtbDescription; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.Label label1; - } -} \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.cs deleted file mode 100644 index 1da09dc538..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.cs +++ /dev/null @@ -1,193 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace RemoteConsole -{ - public partial class FormSliders : Form - { - DelSendCommandToTarget delSendCommand; - - public FormSliders() - { - InitializeComponent(); - - lvSliders.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - lvSliders.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - } - - public void SetEntries(List entries, DelSendCommandToTarget callabck) - { - lvSliders.Items.Clear(); - - foreach (var entry in entries) - { - // Populate List View - ListViewItem lvi = new ListViewItem(entry.Name); - //lvi.BackColor = System.Drawing.Color.Aqua; - lvi.Tag = entry; - - lvSliders.Items.Add(lvi); - } - - // select first element - if (entries.Count > 0) - { - lvSliders.SelectedIndices.Add(0); - lvSliders.Select(); - } - - delSendCommand = callabck; - } - - private void SendSliderCommand(bool forceTextBoxValue = false) - { - if (delSendCommand != null) - { - ListView.SelectedListViewItemCollection items = this.lvSliders.SelectedItems; - if (items.Count > 0) - { - ParamsFileInfo.CEntry entry = (ParamsFileInfo.CEntry)items[0].Tag; - ParamsFileInfo.CEntryTag tag = entry.GenerateEntryTag(); - - // Update UI - if (forceTextBoxValue) - { - entry.SliderParams.CurrentValue = float.Parse(rtbValue.Text); - entry.SliderParams.CurrentValue = Common.Clamp(entry.SliderParams.CurrentValue, entry.SliderParams.Min, entry.SliderParams.Max); - } - else - { - float v = CalculateSliderValue(entry); - entry.SliderParams.CurrentValue = Common.Clamp(v, entry.SliderParams.Min, entry.SliderParams.Max); - } - rtbValue.Text = entry.SliderParams.CurrentValue.ToString(); - UpdateSliderPosition(); - - // Send commands - tag.ModCmds = new List(); - for (int k = 0; k < tag.Entry.Data.Count; ++k) - { - string s = rtbValue.Text.Replace(',', '.'); - tag.ModCmds.Add(tag.Entry.Data[k].Replace("#", s)); - } - delSendCommand(tag); - } - } - } - private void trackBar1_Scroll(object sender, EventArgs e) - { - // Send command - SendSliderCommand(); - } - - private void UpdateSliderPosition() - { - - } - - private void lvSliders_SelectedIndexChanged(object sender, EventArgs e) - { - ListView.SelectedListViewItemCollection items = this.lvSliders.SelectedItems; - if (items.Count > 0) - { - ParamsFileInfo.CEntry entry = (ParamsFileInfo.CEntry)items[0].Tag; - setSliderUi(entry); - foreach (var s in entry.Data) - rtbDescription.Text = s; - } - } - - private float CalculateSliderValue(ParamsFileInfo.CEntry entry) - { - if (entry.SliderParams != null) - { - if (entry.SliderParams.ForceInt) - { - return (float)trackBar1.Value; - } - else - { - float t = (float)(trackBar1.Value) / 1000f; - float v = entry.SliderParams.Lerp(t); - return v; - } - } - return 0f; - } - - private void setSliderUi(ParamsFileInfo.CEntry entry) - { - lblName.Text = entry.Name; - - if (entry.SliderParams != null) - { - if (entry.SliderParams.ForceInt) - { - trackBar1.TickFrequency = (int)(entry.SliderParams.Delta); - trackBar1.Minimum = (int)entry.SliderParams.Min; - trackBar1.Maximum = (int)entry.SliderParams.Max; - trackBar1.Value = (int)entry.SliderParams.CurrentValue; - } - else - { - float size = entry.SliderParams.Max - entry.SliderParams.Min; - float w = size > 0f ? size / (entry.SliderParams.Delta > 0 ? entry.SliderParams.Delta : 1f) : 1f; - trackBar1.TickFrequency = (int)(1000f / w); - trackBar1.Minimum = 0; - trackBar1.Maximum = 1000; - int v = (int)(1000f * (entry.SliderParams.CurrentValue - entry.SliderParams.Min) / size); - trackBar1.Value = Common.Clamp(v, 0, 1000); - } - - lblMin.Text = entry.SliderParams.Min.ToString(); - lblMax.Text = entry.SliderParams.Max.ToString(); - - rtbValue.Text = entry.SliderParams.CurrentValue.ToString(); - } - } - - private void rtbValue_KeyUp(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - try - { - float v = float.Parse(rtbValue.Text, System.Globalization.CultureInfo.InvariantCulture); - SendSliderCommand(true); - } - catch (System.Exception) - { - } - } - else if (e.KeyCode == Keys.Escape) - { - ((RichTextBox)sender).Undo(); - } - } - - private void FormSliders_FormClosing(object sender, FormClosingEventArgs e) - { - e.Cancel = true; - this.Hide(); - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.resx b/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.resx deleted file mode 100644 index 1eb1d7d577..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/FormSliders.resx +++ /dev/null @@ -1,2064 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAkAMDAAAAEACACoDgAAlgAAACAgAAABAAgAqAgAAEAPAAAYGAAAAQAIAMgGAADoFwAAEBAAAAEA - CABoBQAAsB4AAAAAAAABACAA510BABgkAAAwMAAAAQAgAKglAAAAggEAICAAAAEAIACoEAAAqKcBABgY - AAABACAAiAkAAFC4AQAQEAAAAQAgAGgEAADYwQEAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAA - AAAAAQAAAAEAAAAAAAAZHBQAHR4ZABgkFAAaKRYAHyAaAB0rGQAeMBkAIiQcACQpHgAiNBwAJDkeACUn - IAAmKiAAKCwiACYzIAArMSUAJjogACo8JAAuMykALTwpADAzKgAzOywANjwxADg7MwA9PjoAH0QaAB5K - GQAdWBgAJEIdACZMHwAiVRwAIVsaABNhEAAbZRYAG2kWAB9nGgAeahkAG3MVABd/EgAafBUAHXMYAB18 - GAAiYhwAImkbACBzGgAgfhoAJkUgACpCIwAmSyAAKUwjAC5DKAAtTSkAMUQrADRILAArUCQAJ1sjAClc - IgAvUioANFAuADBdLAA1QDAAOkM0ADdLMgA4SzMAPkQ6ADxMOQA2UDIAPVE3AD5SOgA9WDgAJGIgACVr - IQAraycAMmQtADNoLgAtdSgALH4oADtrNwA/YToAPGo4ADd3MwA6dTYAO3o3ADx9OABAQjsAQUw8AEJT - PQBBXDwAQmQ9AEFxPQBCej4ARERAAEZNQQBIS0MASVJEAEdeQwBOU0oATVtJAFFVTQBSXE4AVVtSAFpZ - VgBbXlgARWRBAEllRQBIaEMATGRIAExrSABSZU4AUWhMAEZxQgBJcUUASn1HAE5+SgBUZFEAVmtTAFhp - VQBdYVsAXGxaAFR2UQBYdVUAXnFbAFt+WgBhY14AYG1eAGBxXQBkZGIAZWtjAGhsZgBqbmkAZXJkAGhy - ZwBrcWoAb3JzAHJ0cwB3eHIAc3d4AHV5egB5fHwAE5cPABSaDwAVgBEAGoMVABaKEgAZixQAH4UbABWS - EQAYkxQAFpwRABmZFQAcnhgAJJgfABGqDQARswwAE7wPABWiEAAZpBUAFKgQABmqFQAeqBkAG7UWABu8 - FgAdtRkAHroaACKjHQAhqR0AI70fACeOIgApjCQAM4suACqZJgAtmSkAMJwsADaCMgA2kjMANJswACWk - IgAooyQAJKohACiqJQAtqyoAKrEnADakMwA4ojYAPKI7AEKEPwBBij4AD8ILAA7LCQAVwREAFs0SABrJ - FwBDg0AAToJLAE2OSwBEk0IAU4VRAIOFfwB9gYIAepqGAIKDgwCHhokAhYiJAIqLjQCRk44AjIyQAI+R - kgCSkpIAkZKUAJWTlgCTlZYAlJWVAJSVmQCYlpoAl5icAJqanACdnaEAoJ6iAJ+hogCgoKIAoaWiAKKh - pACkoqYApKSmAKSlqACop6kAp6ipAKurrACtrrAAsK+wAK6xswCys7QAt7i2ALe3uQC2uLkAuru7AL7E - vgC/vsAAwL/BAL3BwgDCwsMAx8jHAMjHyADHysoAy8vMANDPzwDQ0M8A09PTANfZ1wDX19gA2dnaAOPk - 4wDs7OwA9vb2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3OIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADQ0NDY2Nzk6e/v7/Lv7u7vAAAAAAAAAAAAAAAAAAAAAAAAANDQ0NDW2Njc3Ojo5OHY2NXY3OTk6Ojm - 6e7p7u7x3AAAAAAAAAAAAADJycnQ2OTo6Obh3NjV0M7Ozs7Ozs7OztXc5OLk5OTo6/Dx8u3v3M4AAAAA - AAAAAM7OzsjOztXZ2dzc2dnVzs7Ozs7O1dXb4efu7Ozn5N3YzcaIge7u2soAAAAAAAAA+M7OzsjO1dzk - 5ufm4dnYzsmLh4WBZmFeGRcVFRMTExMTExMTEObx3M4AAAAAAAAA9dWHh4J/Z2NcGBUODAUFBQUFCQUM - BQ4FDhMTEhISEhISEhISEujx3M4AAAAAAAAA9dUBAgUJCQkGBgcGBwcHBwoKCgoKCgoREhIUFRUVFRUV - FRUVE+nx3NIAAAAAAAAA9dUDCgoPCQkGBQUFBQUFBQkFBQkODg4OFRUWFDU1NTU1NTU1Nenx4tYAAAAA - AAAA9dUBDhAPDwoaCwoHBwcKCgoKCwoKCgowNT09PRcXFxgYGBgYGOnx3NoAAAAAAAAA9dUDDxMPDhGZ - GwkFBQkFCQUOCRAMEA8qOz4+PkBAQEBAQD8/QOnx3NwAAAAAAAAA9dUBDxUSDyyaJhEKCgoKCgoKCgoS - CiC9TEJCQUFLSkFBQVVBQe7x4uoAAAAAAAAA9dgDExUVFJSPjw4FBQ4FEA0QEA0QECmfqFZWVkWYoEVF - RUVFRe7u3O4AAAAAAAAA9dgDEjUUOJ04lAsKCgoKCg8KERERGp1NpVheXkWlo1BYX15eXu7x4u4AAAAA - AAAA9dkDFD01j0g1lAYFDgUQEAkTDRMQMpdPpVlfYFigs6O+UVhOU+3y4u4AAAAAAAAA9dUhlZ2XnTo0 - jBsKCgsfJicnJyYwKqlgq65iYWmyWaqqoFSjsvHy4u8AAAAAAAAA9dkGOjybSRkPjhsODRCMlCMsJZwg - llBjVKtiYlqzamlptKKqavHy4u8AAAAAAAAA9eEENUJKQDUPjiMKChqMHxIwMCqXnWhtb7NsZVSwZWZl - cKRqZvLy4u4AAAAAAAAA+OQCFxkZQQ4MIiYQDRGWEhAQEzCaqWVlbrRwc6+vbW1tbnBubfL14ukAAAAA - AAAA+OYEQEJCPQcKHJALESCMEhESMDA5anNzc626c7C6Z2dnZ2dnZ/X35O8AAAAAAAAA+usBGVxcDgwM - C5QKECQmExMTExVBZWd8Z7uwd7Vxd3dzd3d3dPX45O8AAAAAAAAA+ugFQl81DwoRGpUeMJEsMzMzNTZX - d3d3d8K1eLV4Z3x8fHx8fPf55vUAAAAAAAAA+ugFXFwODA4OE5AxE5YyFRYYGD5kfHyBfHm2wrV4fnd3 - d3d3d/j75u8AAAAAAAAA+usFRRQKDxELC5YkLZw3MzM2NkR1fH58fn61xLV+gYGBfIF8fPn85O8AAAAA - AAAA+ugFGQ4MDg4QECwqmZEWFhgWGF+AgYOBgX64uLh+d3d8fn5+fvn85PIAAAAAAAAA++gGDwcLDwsR - ESSXlTczMzY2Nm5+foF+g4HEp7iDgYGDgYGBgfn85u8AAAAAAAAA+egCBQ4ODg4QEx6akRYWGBYYVn+C - goGBgYPFv8SDg4GDg4F+g/v95PUAAAAAAAAA++sGCgoRChESEh6+KjMzMzY2a35+hX6Dg4N7wMODg4KC - gYOCgvz95PUAAAAAAAAA+ugCDA4OEBAQEBKcORYYGDVBdoKIgoWFhYKDuXuFg4WDhYODg/z95vUAAAAA - AAAA++gGCgoRChISEjA5MjMzNjZXfoR+hYWFg4OFg4SFhYWFhYWFhfz95vUAAAAAAAAA++YFDg4OExAT - ExMWFhYYNT5kgoiChYWFhYWFhYWFhYWFhYWFhfz96PUAAAAAAAAA++YGDwoPERISEjMUNTM+NVd2hISE - hISEhISEhISEg4OFg4WDhf396PUAAAAAAAAA++YFBQ4JDgkQExMTExQWGFVmfH9/fH98f3x8fHd8fGdn - f2d/Z/z+5AAAAAAAAAAA++iGhomJiYmHh4uLx8bGxsbGysrKysrNzc3Q0NDX09nb2+Pj5P39AAAAAAAA - AAAA/O7u7vHv8u/17+/y8vX29vb4+Pj5+fn5+fn7+/v8/Pz8/P39/f3+AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA//////// - AAD///////8AAP///////wAA////////AAD///////8AAP/////5/wAA////AAD/AAD/4AAAAH8AAOAA - AAAAPwAAwAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/ - AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAA - AAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/ - AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAH8AAIAA - AAAA/wAAgAAAAAD/AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// - AAAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAABAAAAAAAAHx8aABomFgAcJRcA - HyEaAB0mGQAeKhkAHiwZABw8GAAgIRsAISUcACQmHwAgKxsAIC0bACIpHQAkKR8AIS0cACUtHwAiMRwA - JDEeACI2HAAkNR4AIzwdACYnIAAmKCEAJi4gACksIwArLSgAJTEgACY0IAAoMyMAKDYiACwxJgAqNSUA - JTogACg5IgAoPSIAKjkkACw5JgAtPSYALjAoAC05KAAuPSoAMDIrADE0KwAzNiwANDcuADE9KQAwOywA - NTktADI+LQA3PS8ANjsyADk8MgA5PjQAG1IWACNEHQAkSB0AJFUdACRdHgAZbBUAH20ZABx2FwAaexUA - IWIcACJtGwAgdBoAInoeACZBIAArQyUAJUsgACtLJAAvQCkAM0IrADNPLgAqXiYALFkoADVDMQA4RTMA - N0gwADxMNgA9SjkANlQyAD9dOgAmYSEAKXcjACd6IwAsfScAMX4sADpmNQA4czQAP3A7ADx9OABAQjsA - QEY7AEFCPABBRTwAREk9AENSPgBBZj0AREdBAERLQQBJVUQARV1AAEtYRQBOUEoATVpKAFFeTQBUU1IA - V1pTAFZZVABYWVQAWVlYAFpcWgBcX1oAXV9dAEdnRABJZEUAUWJNAEd0QwBJd0YARn1DAEp+RwBRdU4A - VmNTAFlmVgBcZVkAXWpaAFlyVgBbcVgAYW9eAGFiYABjZmEAZGZhAGZmZABjbWEAaWpnAGpuaQBsbmsA - bm9tAGVxZABocmYAanFpAHd4dgAXgBIAGIUTABeNEgAcihcAHYEZAB6NGQAYkRMAGJ0TACKYHgATpQ8A - E68OABG2DQAVohEAHa0YABW0EQAgrBsAILAcACuIJwAxhywAMo8tACedIwAulyoAL5osADCSLQA9hTkA - Poo7ADaTMgA5kzYAOJ41AD2QOgA2ozMAM6kwAEGaPgBIlUYAWINXAIGDgQCDgoYAhoqEAImMhgCGhIgA - i4qOAIyLjwCNjY0AjJGJAIiWjwCPlIwAkJOPAI2OkgCPnZYAkZGSAJKVkACRkZUAlJSWAJWakwCTlJgA - lZWYAJiWmgCXmZ0AmZmZAJmdmgCZmZwAnJudAJycnACPso0AmKmWAJ2doACioqEAoqShAKGhpACjqaIA - qK2mAKOmqQClpagAqaerAKapqACoqKkAqaqsAK2rrgCsra0Aq7CqALGxrwCtrbAAsK+yALCwsgCyt7EA - sbK0ALSztACytLUAtbW1ALa6tQC3uboAurq6ALy7uwC5vbgAu76/AL29vQC9wbwAvL/AAL/CxADBwcEA - x8fHAMXIyQDJyssAz9HSANLT1ADX2dkA29vcAN/g4QDh4eEA6uvrAPb29gAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM7Ox87T2+js2wAAAAAA - AAAAAAAAzsfHusfHztPY0cfH0djb6Ojo7OzzyAAAAAAAzsG8v8HHztHOx7q/ur/Hydjo6OHa08684PO0 - AAAAAAC/x8DHx8e6tI+Lg3FuaWQ0LisrKyAgICC187cAAAAAAMcYCwsKBQUHBQUSEBAQEB0mJiYmJiYm - JrbzugAAAAAAxwIdEBAQCwEKCxAQEh0SJiZNMjJNMjIyvPPBAAAAAADHAiAdHZASBQcQEAsXGBhUTk5N - Tk5PT06988gAAAAAAMcKJitAmSISEBASHR0gOp5QYGBXUGRgYL3z2QAAAAAAxwomJpWUORASEiASHSI/ - mFliYp1YU2JiyvPbAAAAAADHCExLQ1Q3EBciIjlEJpVaomhnpKCgY1jP9ugAAAAAAMc3Q55ORjwXHZI/ - P5U6oWqlanSndVygp9D24gAAAAAA0xdQUk0IPxIikSYmQJpbdqV2d6hvbap20vPiAAAAAADbEFBeHRKR - HUY/JiYkVnZ8q3ipeXx8fHzV9tsAAAAAAOgYZDYXHT8iQEAmJDJifX16rat7fn5+fdb47AAAAAAA4hdl - HRcXPyRCRzIxTm+Dh4GsrIB+gX6B3/joAAAAAADoHTQdIiJBQZlFMjJQf4eHf66ujIeLg4jg+egAAAAA - AOEXHR0dHTqZQTIyT2iHh4iMrq+Mf4eMh+j56AAAAAAA6AUSHR0mRp5HMkpPfY2MjIywr4yMjIyM6fns - AAAAAADoChgXGCsgmTIyMWGIiI6OjrKxjo6OjYzs/OwAAAAAAOIFHR0mJiZHMjJPa42Ojo6Ojo6Ojo6O - jvD87AAAAAAA4gUdHR0mJjJJMk9/jY6NjY2MjY6Ojo6N8PzsAAAAAADhKxsrKywyLDVOYGxwcXFxcXFy - cXJycoPs+wAAAAAAAOzh7O7s8e7z9fb2+Pj4+Pj5+fn5/P39/f3+AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// - ///////////////////AH/wAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAP - gAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAH4AAAB////////////////////// - KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAAAAAeKBkAICobACEqHAAiLB0A - JC4eACA3GwAlMR8AJjEgACY0IAAoMiMAKTQiACo3JQAsNiYAJz8hACs5JAAtOSUAKz4kAC02KAAvOioA - Lz8qADE2KwA0Ny0AMDoqADE+KgA0PS8ANj8yAD0+NwAeVxoAI08dACBSGwAgVRsAIlodABxjFwAZahUA - G2wWAB1sFwAfZxkAGnAUAB1zFwAcdhcAGn0UAB90GgAgbBoAI2wfACB2GgAjcB0AKUMiAChHIQAuRicA - MkEqADFGKgAwQywANEEsADZELgAqVCUAKlglADdCMgA4QzIAOkczADlCNQA7RjQAOU01AD1GOgA/SjoA - P0w6ACR5IAA4fTQAP3M7AD91OgBASzoAQk07AEFKPgBEWD8AQl09AEdJQwBNT0oARVZAAEhTQgBRXE0A - VFZRAFVfUQBXWlYAWF1YAF1fXABJYkUAT2VMAFNhTwBRZE0ASHJFAEN8QABQck0AWWNVAFlkVgBab1cA - X2RdAF5oWwBfaFwAWX1XAFhwWABgaV0AYW5fAGFlYABiamEAZGpjAGNsYQBlbmMAZmplAGVuZABoaWYA - aGxnAGhsaABkdWMAaHBmAGpyaQByc3AAd3l3AHl5eQAcgRcAHIQXABmOFQAXnhIAHJoYAB+eGgAgqhsA - J4IiACqDJQAriicAK48nADCUKwA1iDEAOYs1ADqSNwA/lDwAJ6IjAC2xKgA3ojUAQIE8AECePgBDhUAA - SYxHAHiAewCCiYYAh4aIAIqKjQCOjY8AjY2QAI+RlQCSkpMAkpGUAJWUlgCXl5sAlpicAJiZmgCanZoA - nJ6eAJ+doQChoqMAoqSiAKCgpACko6cApaanAKeppwCnp6oApqipAKipqgCrrKwArq6uAK+usACvsbEA - sbKyALOytAC1s7YAtbW2ALe3uAC2uLgAubm5AL29vQC/wMAAwMHAAMXGxQDJyckAzs/OANXW1QDb3NsA - 4eLhAObm5gDp6ukA7u7uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZlJKRlJ2osLCysgAAAAAAj46UnaOdl5KRkpOYpaql - pZ2ZspIAAAAAkY11dXNtVFBMSxsWFhITEBAQsJQAAAAAUgIEBAECAQQEBAQLExMXFxcXsJkAAAAAUgoK - HAYCBAQEBgs3OTk5Ojo6sJ8AAAAAVAsSeBwEBAQLCh17QEZ+QEBGsqUAAAAAUxM4LCEEBAsKCyp/SU18 - gElKsq0AAAAAY0J7NCIEHykoLH1ERFWCRYaBtaoAAAAAZjo+CygELA4Qd0NWg1laUYlWtagAAAAAaz8a - BCIKKBAQMVZchItbXF1dtbAAAAAAbUYLCiExKBAyRmFkhYVeZGRkt7AAAAAAbxoKBiB3LDIyT2tkjIhk - a2tkuK8AAAAAawQKCzF5MRc+YXFrYodwa3BrubAAAAAAbwQKCxB4FzZOcXFxcIpxcXFxurAAAAAAawYL - CxAxMjZccnJycnJycnJyu7IAAAAAbQQLCxAXMjphbWtra2tra2tru7UAAAAAnZmcmZ2dpaWlqqmqra2t - srK1vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A/4APAIAABwCAAAcAgAAHAIAABwCAAAcA - gAAHAIAABwCAAAcAgAAHAIAABwCAAAcAgAAHAIAABwCAAAcAgAAHAIAADwD///8A////AP///wAoAAAA - EAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAB8/GgAgJxsAIigcACQrHgAhLRwA - JS0fACQyHgAlOx4AJi8gACUwIQAmNCAAKDAhACg2IgAqMSUAKTQkAC02JwArOiQALDslAC42KQAvOisA - Mz0rADQ/LAA1OjEANj0wAB1bFwAjTx0AJUwfACFUGwAkVR4AIVodACJcHAAeYBkAHWoZACBjGgAidxwA - KkQjACtIJQAuRSkAMEMpADZFLgAlVyEANUIwADREMAA8SzUAPUU5ACZqIQAldiEALn0pADN+LwA5ezUA - QUw8AERLQQBJXUUATVRKAE9YSgBWXlIAV11VAFxeWgBObkoASHZEAER7QQBMcEkAWmBWAFluVgBcYFwA - XGlaAGBqXQBka2MAYm1gAGlvZwBncGYAaXFnAGlyaABwcnAAdnh1AHx/fAAchxYAK4EnAC+QKwAwkCwA - Opg3ADakMwBFmEMAYpxfAHuEeQCDhYIAgouAAIuPiQCMjY0Aj5aOAJOTkwCSkpQAlJWWAJOZkwCXmJcA - lZSYAJmamgCYmZ0AnJudAJydnACioaIAp6apAKmqqQCrrK0Ara2tALOztQC4t7kAurm7ALy9vADCwsIA - ysrKAN3d3gDi4uMA5eXmAOfn6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaQAAAABZWVxcXGBiYmlpaWliAABwQTo5NjQtGBMTEBA/ZQAA - cAUKAQIFBQkmKioqQ2YAAHAKKSEFBRAaTjMwM0hqAABwHi8eBSIgLjI1UE9UbAAAcRQqGQgeJDE9PD47 - VWsAAHEYEBwcJRU5QFFAQlduAABxEAcbTScsQ0VSRUVZbgAAcwIMESMVN0hIU0dHWm8AAHEHEBEnKENI - SEhISF5vAABzSEtLTFZcXmJiYmVtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA - //8AAP/3AACAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAcAAP//AAD//wAA - iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA/45JREFUeF7s/Qd4 - ntWR/o9DCGDj3mX13nuxLatXd8lWl2XL6nLvHWxjwPRueq8JhACh9957C71DKJvsbjabbLaG+X3u876P - LBubjfPdC8j/L65rrvP059WD5z5zZu6ZOeSQgf8GvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNf - YOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4 - AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDA - Fxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUG - vsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w - 8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAFxj4AgNfYOALDHyBgS8w8AUGvsDAF/i/+gJPPPHEYY89 - 8cTUa6+94lHkH5C/IDYgA9/g/4//DUgHfof8/B//8R+z/umf/unw/yt9+1E95+mnnjrsySefbHj88cc/ - euyxx+yxRx+1J5588i9PPvXUNxy3J594wp5Cnnj8cSePcv6Rhx/+5nGueeqZZ7556umn7ZlnnrFnn33W - tP2U7kEe4/4nnnrqL89y7oUXXrCXXn7ZXnrxRXuO7Weee86e84T7nnnqKXuGe59j+2lGyTNsP+u/Rs94 - imv0fN33PKJr9C7kG859w9/hu0bC8ad98g3yF52T6B1P85t53zfP+X7bf/G8/3jxuef+C/nmRX7bi/xG - T1566SV75ZVXJN+8+uqrtj957bXXrL+8/vrrdiB544037Lvk17/+9TeISd58883+8g37f/GLvfXWW068 - a7z9fce3337b9pV33nnnG8T6y7vvvmt++QvjX7xr+h33zmv8H8l77733DWKS999/f1/5hmPffPDBB/bh - hx/aRx991Ccff/yxSXRM4yeffGKffvqpffbZZ270tj///PNvfvOb35jkiy++2Eu+/PJL++qrr775+uuv - JfYP//APffK73/3O/PIN4ze//e1vTaJjKHLfqG3kG//oznniPcO//1+MHwAALf/8z/886EelvP8XP+bh - hx5Ke/DBB3/9wP332wMPPGAPPfigPcj2/ffdZ/fde6/d7wn7D7D9gEZdq+u4XtsPMT788MP2EAI42GOI - gOJRAAOgMMDEgYjAxIGK/xhA4zvmF79C+xTbr/Ao7B7F9ivxs/2AxnveXvf6QUvvlHgA4IGL9vUMAY7A - xJPvAAAHBAcCAe/4vkCg/f2Bwf8CAg4ADgAETun3p/BS9AMdPwAQ9IGAFF2AcACFd0quc57C7zvuBwD6 - AKE/CHhg4IGAlN8TT/EFBBIAYL/KLzAQAEjxAYE+0b4HBlJgT+k1CiD2UWpDoftkP8CwFyD4geAPAMDi - 3//+90P+L/TuR/OMhx566IJ77r7b7vXLfffcYxId8wBAo3fcjQICgUA/AUSMZzkBVJwIDB555BF7BDB4 - jPFxxsexMpw1IatiX/HAod+4l2ILGPwg4lkanpXiWSqe0nujO+5ZBH7rQkDgAYBniQgE9gUAWQIvY7m8 - 8orEWQL/KxDsaxEcyDo4EAj0V/6/BQgEAv3BYH/Kr2NSeG/0rIH9AcCBlP4AM79TfCn9viLl96T/7O9Z - AAcCAM8K0Oif+d3obfdX/P4A0H/G31f5pdAeAPSf9fc9rmt0DMV3I/t/+pd/+Ze6P/7xj4d5CnzZZZcd - +qNR5r/lh6CoX0ip3czeT3TsXj8Q3HvXXXZPn9xp2td5WQme+O71WRECAwcAnjzsAwEHAAIDQEBAoG0P - DFiC9G0/+STggNI+8cQeC0HX6Rrd9+hjPONxP5Bw7MknEN0vcPE/+wnOP77PNU/x3D4rwA8CWl7IEnju - 2efsheefx/zfexkgENBSwAcErzC+wv7Lbt8TZx3sZSG8tpe1IBB4VbKf5cH+gMCn+G/0WQG6Zt9lwYEs - hLfeenMvs99bKrz1liyEva0EDyh8YOADBE/2sgjeOfjZ/7sAoL8l4FkA3nLAswA09ld+b+bXrN9/26f0 - PmtAM/3XWg74zf69zHpn4v+T/e4ffUuBf+wb95j+HgD0v0/KL/EAAwB4/t/+7d8yPF27/PLL/84B4MEH - f6fZ/0AAIBDwnUOx7/eJ9u+/V4IlwKh9LQce8p9/6KGHWRI8Yo9qKcD48EMAgEDgEfkPHmGZwXKBa2QV - PPHoYyivlgFPIU+zPMDkd/I0gAAQPCb/g99aeJJrOO7EXaulBSCh+3UN8rh3bZ914fwEPp8A13oA8ORT - eobfr/AsIPCMAOBF/BUvOXn++ZfsOeT551+25194GWDwZv/XAAKZ9m/Ya5LX3rDX33gT+TXbr/v9Ad7Y - 3z+AbwBF1nWvv677fee80dvWNb/+9ZtO4d217nruQ95g2wMDHwDIT/C2vdmn3J6SS5F9Sv3WW++4a3zK - z7YfBLzZ/y2/NaBzewDAd++778r095n/e8S37n933/U/s37/pcDeALDHKpDye8sCbX/88acsAz5lxCeA - X8AHCB/38wf4lwLyB3wunwD7LA/2+AWcP8C++vor37IAAPhSoID0X///9nf/aJLf+Wd/p+QsFf7pn1Dw - 3/9+ryWBN/NrxOR3om0BAQBgAMDJ+062sgT+Lq2BB1FeAUDfWt+/5tcxzfKPPfqImyFfeO4F5HnnhHv6 - KZniUlzNuI875XoWBZLSvPAcSoQ8++wLKNsz7tpnmXmfZ/uF57mGGfZ552x7yV5CsV7WyCz7ihxuL79k - ryKvMbu+xkz7ipOXmV3lgJPCvO6U4K1f84/+9TftNY6//AIz9PMv2MuapTVD61qnnFLIX3Pf6+4ZL7/0 - or3q3vGKvcYxnX+dZ7z+xltOgd/gnl875dM7XkNpXrO33nzD3sakfvedt/hH/w7/wN+1Dz78wP1DdQ6r - Tz6zDz/62P2Dfp/z73DdO1orO6cY/9A/lLPrU0zfT9j/iGd8wDXvIbpGzjPu++DjPfI+21z3wQcfoXAf - OOXzXedzsr33wXv2wXvv9znW9Ds+wpH2oedU47d8JFP7I5/jzSnTx5/ZJ5/KwSb5jX3y2ecc+8SncCja - x1zzsdvXtpTRd62Oec473/N8zjvdp20prRNdh3yIfMDx/ma+d92nWtejvJ//Bmfel1/Zl199bb/54kuU - +Qs3fq7tLzj+5dd98vXXcuxp/Y64GR0F/get7eXk+yf77T/+M8rsX8f/8+9R4n/xm+oy2zXT+0ZPaf/l - D/9qkj/86x/tj8i//vGP9gdE4x//+CeE/T/8YS8g0L0eAHijHwDeAxBm/v8ECGj2lnnvTPp+Tj8BwF13 - 3ml333m73XH7L+zu23/GdTdwza3M9Hcxsz+I3IeZf6898uDdzOZ3MyPfZ88gzz19L8L4zANOXn7hYXvt - xcdR7sfsjdeesDd//ZS989bTKPETKP5D9tJz99mLz99rLz53F9fdY6+//ADyCEr7CMcfsWefeoDn3kO0 - 4C6277AXnr3TXuX6V1/g2c89xPN1re/5r7z4KAr+qL3+6mP2a57/Fu9649UnAJQn7PVXnrJfv/qsvfnG - c/bOm8/ZB28/Zx+++wLK+4K99/az9u6bT9hH7zxpn3/0nP3DFy/b1795xb767FX74pPXUPbX7T2uffvN - Z+wdnvne20/Z++8+Y++9g3Dve2+/yPar9v47r3H8dfvofeTD1+2zT960zz992z79+C376INf86437OMP - 38LJ9QEz2YfIB/blbz60L7/QNsDy8dsAzK/t88/est99+b7949cf2m+//gj50P7hK4Trvvz8PfvNZ2/z - 297m3re4D/nsTfvNpzyXY3rGp5+8hXK+ZZ9+9Ba/4W1+w/vuXZ99+h7H3rbPPn6fYx/ZF7/5hHs+ZvzY - vvryU/v6y8/5LZ9znUDuQ34n5zj2NbPs1yjuVzK3mW2/+uoL++qLT+0rfvOXiO797T/8hln1S/vH38oc - 1zr9NxzXvciXnzFD/wYF/orrOP81zjze8+UXXMP2b3/7NQr7WxQW0cz7z5p9NUNjsv/ut/ZP7P/hD8y+ - f0Jh//RvKC5K61fmP/7rH9j+PfLP9m9s//u//dH+49//zf79z8i/SbT/J/vv//iz/dd//dn+g/Hf2f/3 - P/+J2fyP9qc//iv3Chz+tQ8A9lX8/gDw5z//+S8sN/CXP5jdHwT+Lq0AAOAbDwD6O/ruRvlvuvFG233O - 2bZ+w0pbu26F7Th2ix1/3BbbtWurnXjcJtu5Y53tPHadnbBzo5104hY77bRtdsbpO+ysM7fbOWfvRE60 - s846yc49+xQ7+6xT7JxzTrbzd59mF114ul100el2wQWn2TnnnmpnnHmynXHGyXb66Sfa6afuslNOOd5O - PnmHncA7tm9fYzu2r3XvPfnk7XbKSdvs1JN5z2nH8sydvGunnXnGsXYm41lnHmfnnrMLOYHfvcsu2H2i - XXzhyXbRBafahbxL4yUXnmqXXXKKXXHpKXb1ZafZtVedadddfa5de/UFduXlF9rVV15i11x1ueNAXH31 - pXYFxy655Fyec5ZddP6ZdsF5p9t5/A3nncMzzzvFLr3oVLuYZ+vvuvD8s+yyi8+1Ky87166+4lyec779 - 7JqL7XrkasnVPPuay+3Gn19lN990jd1689WMV7J/Jd/6Grvll9fazb+8Drne7rztF/bAPbfYfXffbLff - dqP96tYb7e47bsb/8isstlvtHnfuVrd91503A9Q3212cv+22X9odt92E/Nxuv/V6+9Ut19vtv7rB7r7r - Fq7lXjfewlLudnv4gTuI4NzOEu5WlnC32OOP3IlFd7c9+giW38N32xMP38sS7V6WUAD7EwDw4/fY04/f - i0V3vz0HKD8vkH/6fsYHAfFH7VWBPED80guP2gvPPAygP2QvPvOgPf/E/Thddc+DAPkD9iz7z/CcZx6/ - j+fdZ8/zrBef5RnPP2yvPP+4vYy8+Pxj7EuYJF4ExF9+GlBn0njtWXvr9eeZPF5AGF97zt564wXA+2UH - vh+9/2v7GKD9HBD8/ON37NMP3nL7n34EELP/2Sfv2CcA4Mfvv4n8GuvuDSaD15mUXsPiesdFC/Y38+/H - Evh3Il13XXLJJTUo/t8vR4A1/v9I2b0ogDfq2C9+dp1dfvEFtn7jJuvo6rHly9cABhtt7foNtnr1Glu+ - coUtW7GccbWtWrPW1qxfx7n1tmYt22vXuWtWcG7lqrW2bt1GW79+o61Zt8HWrt1iK9du5twG7l1nK1as - tVWMa1ev47pNtmrVBlu2fK0t5X3Ll612smI5ILRqna1fvcFdq/MrVuj5+h28g3et4zdIVvP+VavXI+sQ - 9lett7Vr1tmGDRtsA79Pv2XtGj1nA/dtAty28Ns2u79z40bG9Vv5/Vu5d4utWXO0bdi03TZv3W5HH73d - jjl6h23evM3Wc88a/o5Nm7bZMdt22PYdxwJWkh22dctW27hhM8862jZvOca2bdtuO3bstB07j7VtXLd1 - 6zbu28q5rbbl6GNsK889dtvxgOkJPOc4O/qYY919xxyzA9A93o49bpcdu/N4O/6EXXbSrlPsWK47hndt - 49pjd+6y448/CQA+xU459XQ76eRT7LjjTnBywgkncs+JduKukwDJMwHMcxjPAWBPsxNPPtlOOe00O/nU - U+3U0wDhM86wM88+08499xyA9AwA9jQ7jWtOPw3wPvsMO+/cswG5c+38884HAM+zc846F4A/204/8yye - e7btPu88QP0Cu/jiCwHb82z3ubvdsy44bzdAvNsdv+KyS+3Siy/j39QldvklFwPGFwDK5/vPXQxwXmJX - XXGFXXUVcvllXHuhXeaOXWY/A5B/dt3VgOk1dsP119sN/Nu84eds/+xqu+GGawHPGwHUXwB4N9stN99k - t916i9u/le2bGe+843ZAEIv27rvsLo13af92u/POO+yOO26zu+6+E+f1/d8y+b/LEsCZ/U+XXnrpkwDA - QuTIv8UJ/4Pfg5n/n3fdcUc/L7/P4y8AuIOPeP11V9iCBQssIT7RYmNibHJOlk3KybbszCxLTU21dEl6 - GtspbszMSLdJWZk2KTPDMrMyLDUtxTLSM9z1malploZkaZ/nZHB9GvdnpqVZRgbbKamM6e4ZqSm+azM5 - n5acbMmJyZaayLUZGb73pfFers9MT3f7KXp/KvemZVhGWrp7ZxbX6tnuGSn6fbqWa3QulXOMGTrGfbon - jWfqN2Xz2zN4dzq/QeczeE5qcqolJ/O3ZGZadjZ/C6Puz87ItCzuTef9qUmp/G1ZSCb3+96t43puCvem - JCVbCr8jFdFz3W/X38E5vStdv8f9dv5+7k3Vt8rKsnS+R1JKkvvGaelcr2+lv0m/kXsydQ+/MZvfNInv - msX5HH5Xdk6OZU/Kcsdz+H+Sl5NruTl5bE+yLP0dnJ88ZYpNmTQZybWcKYxTplphfq4VTJ3K9mTfeca8 - KXmWl5tvhQX5VpCfb7m5uTY1L88mTeaZ3JOfV2CFSGlJiZUUFFtBXqHlTS1A8m0qUlxQZGUlpVxTyPkS - rqu0kmL28wutuKjEyovLrIz9ivJyq6ystOmV0620uNxKSsqtgu2ZM2fajOkzOD7TnZs2bYbNnDXLZsyY - abNmz7SqqjlWXVVtc2dXW9WcaqupqbN5c2s5NtfmVs+1mrp6a2psssb6ZquZV2sNdQ38u15o8+cvsOam - FmtEFrW2uSXAgZS+/3H5Aghj/xeK/yfkZaQJGfaDK/TB/oA777jjz3feDhq69b5PBAAChYdY2//ixp9b - eVm5HfaTw4xn25FHHGGDBg+2wwcNssMO/6n99LCf2E9+cqgd+pND7IgjfmpHDjrSBh812AYPOcoGMR52 - 5BH20yMOtyMYD+fewwcfyfFBdtSQwXbk4EGcO5LnHG4/QQ7jusOPOsKOHDKIc4PtiEG8h/t+wnsO5dmH - HXmk/XSQnnGEHcFzjjhS90uO4F5+C9fqnsFHHeXer3EQv/MI7tH7j9R7hw2xocOG2bChQ23o8GE2dOgw - O2roEHf8KPaHjxxhI0aPsJGjRrKNuHGEDR8+woaOGG7DdGzMaBsxdoyNHM3I+WEjhnJ+mI3g/MiRw20E - 1w8bMYpjw204x4bwvqHDuGYk4yidH2kjR4xkHM17RtnoMaN41kgbPWq0jWF/1Cj9hpE2avQoNw4fw+9h - e/S4sTZ6/BiOcT3XDecd7ln8Bvccfs8oPYt36PnD9LfofZzXPaNHj+X8aHfd8BEj+Jv5nfxdI/ido0eP - sVFjOc+5kbxvOH/HEI4PGjqc64baEL7XMPf38I2QYcOH2KAhQ/j/rf/XQ2zYML6N3un/m4/iux4++Cj+ - n/D/Sf8e+H8xhO885Kgh7vrBnD+C80cM0r8Tvv1Regf/b3j2UL7TEMYjdb/+//H/Uu8fihzFewbzewbp - /zHX6xmD+fcyhGODh3DNkGEc5zzvGDR4qDt/JM84kuuH8tv0O4ccxf9zvZPr9O9E79a9gaFBf5XyCwjk - MMQC+Aal/wvyb8hTyFzEsQX/biICKPxfBABSeIkAQKOOPfLgPXbTTb8Aocvs0EMO5X/GkTZ6YoCNDpxg - IwLG2YgJ4234uHE2FGUYPo5/WBwbPXGCjQrkGq4bFTTeRgaOtzFBATYmeIKNCWEMDbRxyPiQIBsbGmzj - wkJsbIjGUBsfHmITItmOCHHb48M5FhbMiESFWUBMmI3n3Dj2x4UF2QT+h42P0LFQmxgZZhO5ZmJ0BBJm - gVHhFhQdzna4BUZHWkhslIXERVpoTISFxkZaMNeFxLCfEGPhKTEWnRZvsamJjEkWnZJgMWlYPGzHpCdZ - HLNuYk66JUxKt8SsNEvISLV4ibazsAyymckn51jm1CmWnT/JsgtzbVJhvuWXMrPNYPbS7FQzz+bW19q8 - hnqrrZc0WH1jIzMPs9L8+dbU0mzNGpHG5mZr0PGmRqtrbrT65iZr0DE3NlltQ4PVNDDD1dXa3Noa33Z9 - nc2tq7GqmrnIPJvDOGdetc2eW2WzahnZnzW32mbOY3/uHJtRPcem8bumVTGLSqo1zrYZs2fZ9DnMslUz - rHK2RNuIOzaT/enu+PQ5nJvFMc5P077Enee47uV8xaxpTnz3TOdbVFrFDI7N9h2vmFlp5TM1TnPnyqYz - 22ufc2UzKrhW57nHXYtM1/0cm1XJu3nuLJ7L963s9wzfcyoQjb579Rv1e7W91/P4LeWIrtdvmV1bdVAA - IL4LSwCWKZcJCP6M3IJMPdhJ+Ae9XrP97b/6FU6j25zSe6L9B/H23/Dz652pptl/OLNPXGaaRWcmW2Rq - nEWhMFGYsFGpyRadiuKk+cYoJ5xLR6HSky02I8Vis1MtLifNYlGaOJQmPpsxO8MSMFmTJmdb0tRJljwl - G8myRMnkTLZzLDl3kqXkT7GMwqmWUZxraYVTLBklS8rNsRTOpXEurYhzJXmcZxvlSyuYbKn5kzk+xVKR - tOKplsn5TMYMzmdwPo3zGTwrk3szS/Mtp6zAJpcWWDaSw352GeK2JUU2ubIQYawotsllhTalVPvFNgXJ - rSyxqdNKLHdGqU3lH27BzAorlUKgfNUopxR8QesiW9TWYZ0d3dbd3Ws9PYttSe9SW7YEH8qSlbZi6Spb - ucwnq5bjU9lHVq7g3D6yYgX37UeWr1hhTvDR7CvLVi63Adn/N1i5btVBAcC9RM0uvvhiAYDkv5F/QM5D - 4n5QpT6Yl9/VDwCk9B4QaHzgrjvsumuutOLiQh8ATBhrScyE8YBARGoCys3syHZcZorFoeQxzIoxmUhW - ikVnAAjpHEdidI7jcVJ+jboeQIgFBOKZPZMYNcMm5WS4MXESo5NMS5qCTMXfMDXbJ3koPgCQMnWyJQs0 - kFSU2olfsVPzOFYAOKDgkvRCAKGIfc6nCyB03G1zTgDBmNJ3rUAh19IBk3TGDIGLROCDpHv7Oleaa1ml - AIsDn6k+wCgrcoBQBBBUMqNWMTM3NM+3lv4A0NVrvd1L/moA2J/y69gAAPzfgtnq9Wv+XwBASwGBwIfI - em8pcDC6+INcqxlfFoAnHgho/348pNdfeyXOmCIHAENYS8ajzHHM8GEJ0ZjPsRaZHIfEWERSnIUnJVhE - MgI4RGAhRCTHW2QS4sYEi0LciIkdyTVRaT4Qkbkdw36stpHYDFkNyQAHFoWsiAyZ5uwLcPR+gESWRCyW - hLMmtA1gxGf5wCNBQDJZghWRK2E7F4ARmORiXSDJEgAlWYCCaPS2BTKpgEyfODABRBABhxO3PwlAwJIQ - YAAsWSU+q2FyeZEVzMCZhWk9F3O/qaUFC6DN2to7rauzx7q7FltvzxJbLAtgsSyAFd9pAQwAwP+toh/I - AjpYAFCeC2FAzwLQKBD4d+SBvxsr4E5m+ttuvXUvEPDAQBbATT+7FidgmQOAo3AOybyPTIkDAGKchCfG - ItG+MQlASEHZJVJ6gQPA4AMJDwgYU3UNACArAuX3RAoeg+XgGwEBLAWNPiDAouBcrITjWobEyJLA2vBZ - FLImWJOzTk/wr9e90QcGGSw1GAEBiQcGDgSQFIkHBm4bK8O/L2tCyt5f+QUAnvWgMbNEADDVLRmmVODZ - Zp06fd4cq2mst2aiKK2LOqy9o8u6mP17uhfb4p6lWADLBgDgR7QkWb3u4CwAJbPtAwAeCHwGADT+IDP6 - wb6UMOBfBACe9LcGHrr3LrgA11t5ZTle/p/Y0IBRFp6B8qcjiSg/Ci/Fj0hBmPEj0wCADE/B/UAgZZfg - ZIvMYOZn1td+FIovcbM7s3xMJiLll8JnMmYBACh3bDaS4xvjsv3HpPQsIeLxKcRNwgpAtB0/CQBAyRNQ - cDdOBgyQxCmyAKT8gAAWQdJUWQK+MTlfVsA+4gAAyddyA2tAAIBFIL+BFL9PmP09IBAAZAAA2SUFNpUl - QAlOpek42+T0a2pZ6AOA9i5m/wEA+LH6IFauOTgfgFLW9wMAcgj+B3Ic8tOD1cfv/Xq8/n/sDwD9tx+6 - /2678frriMUW22GE+4YPG2NRkTj4YpIsPCrWwqIw/WNQ/Lh4C49B+aPiLTqamV0Si6JzPCqObSSa/eg4 - ZnFJLJLgk5gkvyQysyckWxzx/jji/rHExmNwLsbCI4jD0RhH3DueWHxcMkpN/DuBOHkCse9EYvYJxMkT - iYUnwAFISsehmJnNcWZ6eAiJ2Yw4GyVJxMKTiKsnEcdP5njyZHwLufgVkBQcjqlIyhRm/snyMfiWBs6f - ID+Dxjw5D33+gz4/AttyLMqfkIV/IJtlQG5FiRXjCBQAzAUAmok3ywHYgQUgAND6/9sWwMoDOgEHlgDf - zxJgKdbIX8MB8MKAKoLjjwL0XwZ4268AAEd87wp9sC8k5PfPv7rlFhhUt/RZAd6S4KF777GfAwDFRUV2 - 6GGH2LAhoy06DHMcEAgPxQIIQyJjLSqcNX8YQBAaZ9HhzOzRSBSKHykBFCIYIwAOzkVHcT8AIhCIicGU - j2V2BxRiY1F29uPjky0+kWMJOBMhzsSyHRfP7I7EJTImofApKDRAkJSCQiej0IkIx5OS2U9hNk9DwVM5 - lpqDoNwcS9GYJkGxOadrUtNYw6ciaTj80pEMlDuTMcsvbGdk4vxDMrKQ7KmWDpkmbQrbuTj/2M7IzrOs - SfmWOWmqZUF8ySkstNzSYiuaBgDMrrJ5tQ3W3IwF0OqLAHRp/T8AAD/KSMTyVSv+agD4V/IGlCbujwDs - b3yfc4MPVh+/9+uxAP7sAUD/UUuBB4gQXHXpFVZQWGCHDMUHkD7cQmfh7KuItaBC4uyFYRZcRFy9MJqR - WDvbwaXRFlIebWHFMRbC8dCiKLYZS2LY9ksxS4cSnITFWA5sR3A8osh/rJzwYlm8RZRiQZQylrFfAoAU - J1pkOccqGSsAj3KAoQyAQGIkpQBLuU9iKjhXzjVlAArbiWVYCxU4CisZEe3HlWNRlGI1OAE8SgCPcsCl - ku2KDEsuBSRKsiylDBBBUssAjEoApBwLowwLoRwnYLmOM5awz7H0aZMte1aeTZ1NFKC60qbVzrKqplqr - W9Bk89uxArrbrWNxt/UswwewDB/AMnwAUKmXuXAd4yocgvwjXOGEEN8qPP1uZH+ltrluNeI/v9J/7Uqu - kyzj2uUrdb1Plq1mRFY64X5keb/nLnfPR7jHhQsJKa7Se7zQonsn5/Re9xt4DvsrNeo9er7Oca/vN/t/ - 9wqo23oPv9X7Lcv91+p9K1dB3ebZvt8N1VvPZHuVhOjGKu5f5f8tOu+Oc/1qKN9roH+vhv4t8V2n+xhF - R2d/DbTy1Vyzyn+d736frIZavhZxz3D3+ijmK5atcOc3QFX38v/3N/a3DgQASuH+DgAQQ3DM967QB/tC - EX8OBAD3w5m+/LxLbUr2FDtkFCzAsiEW0oGCN0VZQB2kncYQC2gIRSDgNELGqUMaIN40RlhQE4ScJo4j - gc2AxXyONUdYoM7Xs98EGWd+lAW3ABwtkHJ0Hglp0THewbmwllgLXQCYLIDEw37IfIBkPs7HFoBkIYCx - gG2Nbb7RbbdilXA8fCH3teKc5FxkGyDSDuC0sSRZhLTij2A7oh3p5HiHtrFiGCM7ABu2JZFIdBfWSif+ - CSfaBmTakU6slx72FwM0Xex3AzzdRCmQxG5ApAdZmmFpK3Msay1U2g1FVrIJAssxUFd3wA/YOc+qd821 - 6hNrbO5JEIRORE6os1qk7njG47Rdb/N21SBzrW4XQILUHg+J6DiEa+p2+aR+V4PVnthoNSfWWz33NBzf - YHWMNVxfw/31Os75ul2Izul6RPv1xzdaw3FNVofUHufbr9/Jdcc1WCPHGhjr2K8/HiISY+OxXM/YtLOZ - 883WxDWNx7K9k5Fn61lN2j+e/RN0fr41Iw07W6yZe5p3Qr1lX9fMP7bFWnZAx5VwXtKyg/Mcd9ceu9Ca - de5Ywqjct4D9lm3I9oVue8GOVluwDdm+wBZyrHX7IlvIMTdu80nrtjZbtL3dWo9hPLrd2o9pt0U6JjmG - aza32sKNrdZ5XKetOmX1QQGAajN8BwDo3PiD1cfv/fq7CAPuDwC0DLjvHgDggkstJ32SHfLTQ2xQ7DCL - 1OxcFG/BhShsPgqbjwLnRVmoExSUWT+MGT2sFOUt8VkCbh8LQLO9xtBSpIJjlRyr5HkVKOE0n2URqREJ - m872DJRwGgo7HcWcIWEfiZ6ZaBGzWXLM5twslHAWVsFslHYW56r8Mofj1ZyvZn8uS4xqZC7+BbZj5qHM - tSgsEluD0s5DmdmOrudcHdZDPRyFes43cr4Wv0NNGteyLKlnCdKYbnHNHGvBopiPFdHAsWa4ES0c51jc - AqyOVqwKJLkdXn4XXPnF8N+XQw5aN90qNs2y2Vvgqm9DmXfCBkSZGlA8KU69U0SOobyeYkqRGlB67ded - oHONDgTqdIztendOxxGUugZAkOLXChh0Hc9y17IvcKk9AVAAbGpO5LqTEI0AxLxdEpiFAIZkHqBUczKj - AIr75nL/PP+z3TF3ne9ZtTxD1889iWMnwng8CXDjXgGbpPpk3+g7r+O+a7Qv4Kvxj/N0nmurGau4v8pt - A5Inw25kf84pMBx3zbMqvYPtmpN57ym1VnVSNdfNs3lcU30q156i67lWz2B7rneMcQ77s0+dY7NPgR15 - cpXN3jXbZp2Ar+a8Guu5dPFBAYDqPf4vADD6e1fog32hwoC/Qtn3BwIPEAW44tKLbTLJIgoDit8ejaMu - CgmLRUlZ/0fKBxCBcrLWj4xBmePkFPRJVAzKhz8gBp9BdBTrf/ZjElDWJHwEiXIOQreNRZniWO/Ha62P - gmrdj2MwDidgXBIKhS8gIREFS0JImInHAZhIsoxzBGqbpJsEzkkSSYxJQJJIhEnKwAeAgzBJ+yTnpHAs - FQdgCg7ARJKZkkmSScnGpMcxmEKiUgrHnPOPBJlU/t5UtlMnITl4/yfBKETSOJ5B0kw6CTDp+AHSOZaR - jR+AMR1iUlYufgB8AxmMmSTKTCnEF1BeYdNmzrEqElPqGpptwcI26+7otWW9K2zl0jU4/pDlfvN2Jebr - SrIpV5C9SMbjGpm6ZDfKO71qtcxYTFsJx9dwfjXby9ewdFizzJnjyr5cTeblKmVhemb/Gi0FWFqsXcYy - QKaulgKYvTq+doUtWb8MWW5L2dazVqzhd2m5wPkl65fa4vUQlhiXrkO4xl3HUmXZau7jmUt0fiOygSXN - Wl2zxF27eAOOTqSH891um/PrllnvOo5tYAnEvp7du6HHejd1M+Ic1XUbF1v3xl7r3Iwwdm/CcboZ3wn7 - XZt8xzo3dlvnFo6z34N0b+7hPPwKyZYeziE6toV7thJ63cr9Trrcfe2bO23RJqIyjG2b223BxkXWsaPH - jj5320EBwF9hAYw6WH383q+H+PONZvv9AcAj9+ADIB1zEpTbQw89lISSMRaNtz4KCcPrHxbN+p0xAjBQ - NCA8nm0pfzyi6EAsDsBYKb4cg77IQHQ89wMCUf4IgRQ/NgGPPxGBWM55YxyZf3ECBcb4ZDn/5ATkGBl3 - CTgA5QQUMGjbKX8ijkE5BxE5ApNSAIA0gABJFgAoezEDJc+ERpyJIzADRUd0XFGBFCjJqdkoPOdTyZZL - zcbTjwgE0siGSycrLgPFl7MvIweRQ3CyFB9gyOUc57PIisvGIZiVA7V4CnwAsuLyS8vhtWP2V8+z+tr5 - tqi5w7pbF9vyLpR+MUq8FKUHBNYtXW8bl5GOvIw04qXIkk22YdkGW7dCst7WM25YttE2LNnIuc22aekW - riOVeTlp1MtIk+ba9cs3cIzzHNf2hhWkYDPq/Dp3zXrbsJTjXKNnrVsO0HC/7tWx9Rxbz/Pde3Rez+Se - jbqP7Y0c28jv3LCY7cX8Vj1H7+R3b+advndv5jdusk38Rnfe/3u0v6lX57hGfyfXb1jMecTdxz36u7St - 37PWvdP3zE080wnXrF++kbW87+/RMzbyvE2Mm/huul7faSN/9wau27iS37V8i21eRtq2vivn1+le/oZ1 - fAe9R+9d08nfyPc87YRTDwoAVG+RmoD7swJECFI4cNz3rtAH+8Lbb7vtvw8EAI+RH33t1VfZJGa7Qw/9 - Cck/43xcf0g8HhEoDBZgeLKPDyBegBiBTiD/SPoIQB4rUCxARxQSE1BcAB/Bx8f280mMknAcH8Anjgsg - ES9ATEDoxKIjO1qxxwb0iEBQixOUY6BRtGJi/wl+ccxAjwNAvoEjAzmqse+4jxm4RzwikBsLcnw5BvsS - goqVc+DnA5QABkh6CdZAKaSg8nxyBXAIQgqaVjPbqltqrKG9yRZ0MeMs6bbFK3AC+h17PieY6hr4Zl9v - Bte+m/0RbcsacKPEf48sAe9eHfPu9e7znGByAvqeh6zR8/zOMRxo7hn+d7jr+51bIwca5yWew9E51ZzF - IWuE+g8Sd43PApGTTsdW+8+tXSGLRvsc1z046ySydJzI6tE1eoa7H4ce1+vYOic+sFqDE0+/Tc/VOT3P - gaCzmFT7ATClFsRaRldfQrUgqCPh3ierSVYVv30N9SSUbyHra9mSZc6y2r5z+7dqA/YvH96/UIicgCqc - egAA+E8/K/DH7wO4/fbb/32/TkCsgscfeRgq8NU2GZP2ELIBlQEYRXJPZEriHgDwCEEiBXkAsK/ieyzA - PoagQMDHBHQAIJafKL9Sfj8d2I0w/MT6c+IBgLYFBCID+ZXf0YE9IpDHAhQj0JGA/CAAFThhKhZCHgqf - x5jvJwX5QcBjBDoA8BOA+gPAXrRgPxXYowQ7YhAgIEagyyFAMgCCLHIFJlf4aMEV1TNtTsM8q1vIMqAT - p1MvZu8yzGUHAH5Pv99s71NwT9F/5KMAa3+/2S01XPTh2+e9Zci+YLfvc7zr+oPet67pA0zfexy4OfED - JqPvt3jREH+kxB/9WLxyCUuaFbZ607q/GgBUQ1A9Gg4AAMoJkAUQdLAT8vd+PbP/H/cHAHfc9ivKQT1C - uaxrKICR40sGmggRCJaeMgGVC9BHB5byywqAEeiNfXTgftRgXw6AmIE+AHDbLmNwz+zvtsUM9GjBMAId - K1AZhf0AwVGAlWHoF9GAnQAEjgKM4scjGpUHkJjPthMsggKfJAIISYjLC4AM1EcL9lOA9wcA+9KBPVag - U/5+AOCBgLIK86eVWumcaTaDVNy5zTAD2xZYW3eH9S4lIxArYCmhwBWE0v7eFL/v9/a3Sn5sYOWBQL/f - 5YUmvfDnEn1/AdXa1QcFACoH75yAl/rFlxXopQdrjER+3GXDb7/11j/96uab+4hAHhgoSejpJx+jrt1V - EGXSfU7AkWMdOScqAQCIAQDi8OTHsgSQH4C1vxP5A+J9yT+RiYyJ7CPRVBSKSmDGx/nnzpEkFMUyQEsB - n1OQGV+SjDXAMkMswBiNSgKSsO8YgeTmxyJxysdnGRBP9Zt4qvjEwwpMyETBSQhyoqxFgYBy+D0AKGa/ - hKUDklAAkSgPgSKcxBIhmZRkl47clxvgYwI6RiDimIBKEPKSgTwrwE8N9gBAWYP9JZNsQaUSF8EMVHLQ - nHpCevACZAX0aBmwnNnHxdG9WXLv2bL/zPVdALG/WfZbM6WfH9D/uC+Wv/eSY3/nnenvn809boC33PBm - 8eWaif2zcZ+S9Zt5/7ff3/9vcArpcQv8HAbvmf8vQNn3u/Q3+y2ApYDwynUsKzYcnAWgjlCOCdgn/cDA - BwpR3/uMfrAvvONXv/rPfQFAPoG7qKH20vNPUyTzcspQpfkAYDD1ACJT8PqzBAjDCRiB8ocTCQhDsWED - RjFGhBMJgAEYiedf1OAoCfsxUexHx1tMNAqOQ1AOQkUJojgeFY2CiwmIxMUx00MHjhEtWE5AIgSx8XL+ - obQJhNpw+MWKEhyPkidA801A8ZHERLEA5QDkGGMyrMBEnH8JUIITcjItHrM/FvJP7HREZKBCwnQovpx/ - oggnExFI9SIBzgFIejERADkBUxQNgCKcijM0XTUIcAqmyQGI809OwPQ8f3pxAduqXZAHCCCZSHYBZbOK - Cq0QZmA5hSlkBdRCD16wcKF1d3bbEtafHgFH5BhHaGFUBECibY80o3+8HglGa2Xf2t4j1Ph8CKvZ1/rZ - I7p4a3Yfgcf3LEeg0TU833feBwLeeXesj6jjI+l4xzzlX0bEwBeB8JOXRPrxK7vIStp2v83/HM+v4D3L - +SP8z+3zffTzbThFlVXkfpuIRRIfackDLAcY+4CX5+f4Fkh4AOb/W109S8hXssCWAMLKBNx8zJb9tQTr - swr6+wC0BFBvBuUCCAT2BoI+UJh4sPr4vV8vxl9/KrBHCb6bVOBf0xLr+muutTRm2UMOJx04mmxAOAAR - U+IsJAumXxakncwIC8vBGpgEByAbAs9k3xiWCQ8gEyJOFtYBEp4DYEyC8TcJxyDb4ZORDCyITKyEyUQL - kIjJnGOMQdyxLJYC2QDHZJYFUwGIXIBhMvH6KVgMMv2VBTiZECLH4iYTf8/l2FSiBDL9mfnjpzDb5yGl - aRY1O9UiGwhBzudZxPfjqsQQTLWkAsAAv0ByPpGCAkbN+goBTlYoEEXPVd0BOQaJFOAITMcSEACkKgxI - Xbx0lDxNOQKuFoHPQkinpl4GIgDIBAByoFLnVVDfbsYMm1aNM7C2lso/C62jHQugm9AZRUFWqBjIUpRS - UQHHVhOjTew1nFdycvm9/fLoO2eYnGtybOlaoghrl+7x9K/Dgy6Rt1z3u3NLiCY47zdOMfZ1r5xrLoLA - /nr/cZ1zz/cz6tZyvyIBLpKgqIFz5KGMmj3lv/DP+KsYHfgIXPhNusZ53BXJ8N7r/z2rl/GbeK7Oe891 - z/a/Z63O6ze7v4nj/Pa1eO3dd3D36vf5thUN8L1Hv1tORTn7xPTzXadjcvit4do1KrLiAZKf7bhsGSBG - SvY6isRupXjr/pqFesf2BQBFAS7tBwAeEPQbf/xU4P4cAJcIpJwARAzB997+td3685soMJllh4441AZV - DLeQNhh8jZTaEuuvjjJd9cE+FmC9nwmosTbUgjin80Ew/4IaYACK/VcLeaiOsZ6R/cBaWIKcC0HCOBZc - z7PrKNOFhNQidZCLGgAUjXVYG41IHYDSAPhwPEzSBLBobCQM2RBnoRobiVK4EZkP0HTGWPDqaAvcxu8+ - PtQCd/LODYDT4miLWEQ5sJZEyD2EIZtYcgAOPmG/wUf+iatnrAOAGEUKiqvFEuF4Qj1AI6nDCpmHpVHN - 8RqAh/3EeoTrEthPqqVcWANRgWb8AQspiNmFP2AZ/oA1sPbWwXJbDxttPRWD1sNS29huC7cgW9lmbN/S - aR3Eq7uIhXdvIrZNDLxjk+9Y52bi2ux3rycevm6xE213E1t31xIj72J/MbF3xehd7J1Y+xLi8L2Iru11 - cXvN5nACVnOeGH4v8fmedf5za32z/DJi/suI4+sZitN3E7fvQjq2dMOoI6Z+NMlO+p16Ju9byrVL18I1 - 4LniDIjmvJRxKc/zcQn81YpkLeg6ZvMl8BV0rWjGq6WsqoCkmV/FT5zi4qjjnBTagRjA5yi/frBcA/i4 - sCaAs57woYBHiu+uEQ0YcHUhTwBlw2KdwwKiEtOy3pW2YdVG23nM8X1NRPt1Ge471r9gqCwAUYEvoSLQ - fhTfHfveZ/O/5YW/wgK4VclA/VKCb7vlVldC+f333rZbbvylTcmcbIcOPtSGZ42z8FnM8hUocBkKXMlY - iUJPQ9HLtR3JdrgFz5Cg0LNQtNkcq+LcbLbnYDHMQcm1zxg0l/0aFH5upIVVo+hzefY8hDFU+1L8eijB - tVgTNbAHUXwpdkSDlB4QaOQatsPr8Un4lT+skf1mzkMXFpU4TDTh5VE2cVuojd0dYMNvGmsjbhhrAacH - W+hagGMJ1/eIJuyj/kZCB47qwFIQNdhRhUULZl804S4J29CCo7q5zglLGqjAkd0c7+FaJ1guSFQP9/ey - /OlNtoSlLDlWZlraaioqr8+1vC2FVrodv8Dx1Ks7YbbNPHGOzToJORlmGtuzYbfNgQU3h3H2KXNs5ulc - c+oszvvO+SjEYsvNtZmnVNkMZKYYbrDb5nDNnJO5/0Tf/bO4f9ZpPJfzc9ieJ3Yc9+r8bO73seIQrq0S - PRmZC+NOTD8x96rd+zjmGHm6h7qCEp41/YxZNu1sagCeS82/s6fbjFN5P8+vFcMP1uG8E2D7afTozaIw - i8EI+1GsR7EUxVYUDbmG7Rqd3wlzUXRk0ZbFgBT9mPOiJjdCEW4Q1diTndRQhCbcJPrwDijGSMOOZijF - UIu3a59zUIVbkPnHQC1GWo5eCE0YajG04uajoR5vbrG2Y9tt8zmbDwoA1Bvyoosu2h8A/A8A8M3foo/f - +z23/epX3zgA6JcNqG3VCnzv7TftRpqDZMoCwAcwdvwEx+STsy+U9b/PD8AsG8GsHMnI8bB4zPw4/AIQ - fdw6H/JPVDzKhCPQiwy4aACOv0jSfiNx+kUp/Zfwoq+MmL+eIJEC1QeIJgIQjcc/KodZeRKEIcz6GFdb - kLW8Fw7UPmZ/tEz+Kb6lQDxLgbg8lgeVKRYJaIQsjrTxpwba8DvH2vDbxlgglkDUQohJ83j3DJYNOAgT - i/AdFLIMKMTkL4BMVAhrsJhjJAolkgwkSSEBKLmU82wnV7BcqKQsWSV+hJncNws/wgwchtMgFU2HdDSD - Z8xmnJNtadVwA2rzLLehyApbyqyyY6ZVL4Gnvxru/Dr+UW5ss9bNVA3axMwPO60NC6Dt6DYsAETHt3RY - 28YuZv8Oa93aZgu2wn0/upXZF06730po2wqzbWsH/7Db+IeOAhwNt/4Y/vHzD751C1YG0sI/+KZtKIlT - IClIi9tvPgbZjhJtF69f+QBQkI+FnnwsyngseQEoWD2KJTqxaLczAZSKs6E3X1BqRZcT6ry82MrOL7MZ - Z86w2aeR6wAVtxoQcbkLUmLlH3BvDTkOTrQtYHC5DqIb+8HmBO4DNHwANxeqsAdEoiLX825dBx2YZ1cD - UHpHFWAzh98k0JvtKMA+sBKNuMqB3DzATWAI9fdEgAugnX0SgCiwPYViqIDwrNOrrPuqJQcFAKICqybg - fiyAf+fY/3zvyvy3vBBz/xvnBPQsAD8QCADepk/ez2jAkIL3XU7A0WMhAuGci8B5F0oqcFgIQgqwQEBU - 4IhoQABqcLi2/c6/6EjW3Ihz+DmnH0qnYzj/oiOJKCAxUSh2HKMcgKQEx5AyHIuzMC6GtXosyo3EQAmO - wwmYEEfprziceowJLk3YxwiMT8IExxEoRmAS24nUBlBIUBmBEfWJFtwrAAi2kXeNtZG3jbWJJ4Qx68dZ - LDkDCUVpzgmYloyTLxGHXioOwAzW+RnsKyU4g7U+KcMZSaT+ppAGnJ5HyrAvPTgrC8nIs+y0fJuUWmg5 - qRQW5Vi20oMnKWWYezIL6ZMAK3ASrMA8Zvxy/mHPqbeWuoXWuaDblrVj8rZjnnbCTusWG491s9bxmLli - 3fkYc5i1Eq2Hl2C+LoHwonWvzNwlGiWYxvIHaN0sExeqsW/97zunLDn5Bdx6eAnv45p1epZMaWdyiyCj - 5+peXcP1+CVWcV7kmeWY4ovXLIXeuxhabactIHln1nkzbdJN9BP4eb7NPWuOS+bp2Aq9V9RhnGzyFSjG - Lo++KMlLV0FbVjMZZStCYV7K0mSJnrlWS47FtpRtyRLO6fgSliiLeV+3RDRiZPFqKMQS/5KnS79nPfRf - ALKL5Y9+n5YyPf7lUCfHOjjnO4+sh0q8rsvaNgCyyMLVZGoCsD07lvY1FPUai/YfvVbh8gVoCeB8AH4H - 4D7jnwUAyN+HD0AWgFcIxLME1AL8LdoliQmoZhYCgJEBY108PoIQXmgc5ne8jwsQngQQiBAkNiB1Ah0h - SExASoe52oCqFiQ+gOoDKjTo1QnUMXECVEEYcpHCftE0wHDCMY8UFKtwoGoFYiX0hQIJA4oX4ByBiCvT - rZAgxUEUAowj9BddxG+dm2ihPTE24dgQG/mz8XbU8yNsyBOjbOyFEy14baRFtCRY3CwcgqQFJ4og5AqR - KhyoisSMKhbiLw/mCpJ69QLlDJTzT6OrQAxgFOMEpPio4wCo4KiiAhrZT6ViUGZFvuVNp1gI5aynEw2o - a2ywlkWt1t4Lr31xry1ZTEhwuT/tVutfOQZhqnkFQF3ard95peNe5WBtK63VHUPhVjE6paajkta+7jrn - uPOl1UqhnVIDELrGe4cbtc97RU/W+dUCAW1zv1KNl+In6EXBOlj3N5/QYiVXFlv441EWe1+iTbtwujvW - AThora/nObDhOWugPa8FiNYBLJ5TUOAjcFonsAKQ1iI67xydfgegrpWT0gGSRl2n36U1vQMovz9AAOcA - z/d79fetcc8RzVrX6H6/09TvGHTfppe/q3uFe7buV4vxA4nXIfhbAHAJUYC95d/Y/28A4MefDITif3Pr - PjwAgcG9tFB6hy651159paUQnxcAjKAqsCr8qtinAwBEJv/e9QH7AYAHAgDBnjqB/lJhHkFI5cEg/vhK - jHu0YN9SwJUIU3kwxwoEAEQI6k8L1hJAAEDJMFcizCMD5QIEePdjCPuFNzL7r4mycedPtCFPjbCffjXI - Dv9wiA2/mWXAjnC3zo/FsZdIvQBxAxK4V1WI+yjB/QqH9hGDVCbMefz9pcL6FQrtqxUoerDYgX5mYBpj - dnmB5UIKyqdicOnc6Tarca41tM231p5261zCrCli0HIKhfrLeXuls/ZX3tsLY/U50/YqAc7syux7oPuk - yKo/sGSVZmkcdAeqy6ekH9Uo4Nly4C1mhu5m9mwlvbbh5CarOqPaJt04ySa8GGghT4TblOvybM5ZVdZw - YgNLjjZm6x5m+aX+WgM+8PJKlqsOgqsvINDxROAmMPNAztUd0HlftSQBmwM7ndffwChw1HFZL95zXKhQ - 9QR03g+U/YHUvdeVWOc7UZehd+lS53gULfu7AGBfC0BLADfzKxLgpA8I/oXt/0Am/C1W+fd6DzP+fx8I - AN4lCiAASIa84ywAmnyImx8B668PAEQGEghgBfgKhO4RZwX48wL2ygnYhxosn4ADAFkAogV79OD+1GB/ - boC37nejnxnYlw9AdWBHCZ7sA4C46Sk4AhMscHOUjb5ygg1+dagd9ic6CP3uSBvy8EibeGIIzrtYi6nB - gij3MQXFDdiXGeiKhu7DDuxfNfhA7EAPDEQSEjkoBwCYRMXgvIpSSobRsKIGK2A+ytJObkAPhUKW4qFf - LoXcf03/Ayv0/q6X4n4XCPji4AeS/u/S71m6kgjBakxt/A0Ld7Za7akNVnn+DEv6VaqNe3G8hTwVZpm/ - mGwV50+z2lPqbOHRi7AU6Ce5BqsGs7//ew7u7/h/+xYH+vtE/lkK2PbCAeiGku3ozBvWHhQAyAnofAB9 - AOABwSW/59i/IwHfqzL/LS/DB/Dv/QHAWwqoSeiH77/rlgBJOOwEAGMnTsRUT0Kp/QAACzCMfoECAGf6 - kw3oRIVCxQCU8vtHHyvQb/57SwABQaKcgSoV7lsGyPR34ujBPjBwXXow/2PUZMTv+OvLDeiXFxCr5CDx - A6YghVgFM8hapEDIxC1hNuqq8Tb4FQDgXw73AcDjI2zcGYFECAgDwg+Ir/DRhdWYxGf6+8uGe8zA/wMA - yFTRUDUVqcRxRkcaVzS0sc6aFtGXrrvLepewvqVKkKjB3z2D+5RCium77tuKvuf4gUFg/8qxzzO1dlcI - D0tBa/QOHJRNFAKpOmOe5V9dbCGPhduQd4ZZwHNBlv7LLCu5rNyqT59LkY6Fbg2udb7u91U++m5A2l8T - k72BaA9gfde1f23RUQHAYpRfshIi0LotGw4KAMQEVBRAZKD+guJjAVyCBXDJ34UF8Ke9iEBKDXZLgLvt - kw/ftV/ccD1sOx8AjBsVBIsPAMDJFxZJHN3PBAwjCqBIgHMAUizUUYOjfI5Bsf8krj4gDsBIHIGqGyAR - IzAap18kNQGjqAWg+gCiDEerTgASw7EYUoVVKNTVCXRFQX3iUoRVHwCJw0cRS+NM+QccLViZgJjysZQF - U2WgiceE2qirAYCXh9lP/pFehV8MsqFYAOPOw3RdG2XRzfgBphEJgBqcPAnPPYzAJNiDe8DA7wtw3Yh8 - 4isS6hPnA5C4oqF7+gb0WQCuOQmlw2ke4sqG002oEGpwBaSgOY1kCC6abwu1DFC5sMUqFwYIuNnZU/L+ - s6CnBL5zvuv2BoH+9+0PCDzg6H//vvfoue7Zmr2RpSwXFuN0a6WijqoJTd8907J+mW2j3hhrh375Uxv2 - +hiLvyPZpl5dYDN2z7am4+cTsehh2cAyA7/BEgBkST+Lw1Ng/T6ByxIsDFkZ31JegY/e/11LFf8z/rdr - fH+jANYnS1B8JWQtBghWblhjG7dttq+++mov+frrr80Tr3W45wNQMtD+AAAw+FfkP5EffzYgs/+fvDCg - IwW52gBUAwIAPnrvLbvhumvxrCe7ikCjYwIsMtvH4w91jUEAAZyAoUnE65PxB9BjT3325BQMZ2ngywkg - MqCy4coQlFOQtX8490dQM8DlBpAXEM6MH6FlgAsPIuQaxLDsiKNGQJwqA0tSCAeSEyAQcLUBkHhqA7hK - wQIACoi4YiHkLbjCIDgCY0ooXEJ5sMBtYTb62gAb9CoA8E80GP1ysA15DAC4KNCCN0Za1AIsgBms/WX+ - U1E4mboBSVCIVTBEdOBkqMDJk3AKqmCIKxJCarCjBuPcow6AKxyCuAIhKhg6laiB6gRQJETiowZTJCQf - AIAZOIVOS/kVZfSpo2YgXWxVNrxtEd7pDjzYtAxTuzAxA0WAkedda11Xuw7p2xc5Rk5C1bXTelbncCC6 - 5YNba2sdLOegz7Gnaz0l953XOa2bdR1AotRklMPX8p31sN7rnIt6ngBARKMet/6fd2qdlV9Ubkl3pNqw - d0baIb87xH76yRE28ckQy7lhMgAww5UL69zQ7Tz6eq4SbqTcfX4A99w9fgH5PgQSPmX3g5q/vZlPYXmO - HwxEWPKsib0Aw2+pHNDs9y9llrLMcgDQZwEAAOtX2dadR38LAPoDgiICXnqwogBvv/22XXjhhd+yAFD8 - PyL/hYz9W6zy7/WeW375y//0iEB9AAAI3HfPPfbum2/YNZdeScgt3g4ZiRNw5hgLoUZfcHWkBcyk5t8s - yECzYdZVIRwLhOATPBsSkI4jwTNh8zniD8IoUlAwZKCgWRCAdG42o7Y1zqTm3wzIPbNi3bFQRKSjCPbD - OR46A8CZBbDMBEhmAiIzAQ7GyBmASiVSodJhWBIzWTZQMiy6mnyFljibuJLw3ykhNvqmcTb49WGY/3Qs - /nqQDXppqI34xTjOhVrYiljowQkWPxNLgzyBeByC8dCEE0kaEgcgCV5AYhE8gAqAoYKYfxlAUQ4noFQN - Q/b0DkhTFIBjKeUSrIRizlE/QP0JXfegUpyCFBPNqpxqk6fTPARn4GxaWtc30juQSkGLKBsuX0DvcsJh - KIiqBckLr7DfKjzXUkg58KT08lrr+PoeQoeECuUdV39Bn9LiFOO+NQrz9fpCgqIZL1+KY8yLAHC9PPNr - FuM9XwwjbomAgnCkzis6sIQIAtcoDCi2nJRVjMJF29pt7mm1VnxJicXflWjD3xxlh3xNd2hkzKvjLPOW - HJt57mzq+TVb91p8AMuX8zyiAfo7evjNftHzV/FOvX9tr+/4mh5+q34vkQG9V6K/ax3n1nfztzCu836z - i074PP/6Rut7FR71RRq0v0q/W45D3q19vWdVL9fz3hX0YnQgIEtrMaDXvdLVFti+Y/t3AoAsgP4AoDDg - hRcAABezBOgvl1zyJ5T/v/8uAODmX/5y7yhAvyXAuxCBrrrkMouJiLZDBpMOnD/awqDiBlVBqZ0TbgHV - 0H2rQ1B8mIBS7Goov3PZhgos6u/EWqTGTwGuARwktVGcAyyafBThYOjBogAHNXAM1l9QM0Kh0KBmGIKN - COdC/EVGdS6YoqGhC30FQsOa8T8ASKHM8ioeGkIR0FCovaEdnIf4E7gm3CYcF2yjLw6wYXePsUFv0i76 - E9qSf0Qk4H1aSj9NS+4rA2ziLn7LBujIUIMjuwETMf4WYaFQQFRFQsUSjGCMhCEYxXZUGyAjafeNMYuI - ULSxXOnASmmDtKRtCofGLvJJTBuEpHaWKBxPYDuhQ/UCMy29J9MmLZtieetUMLTcpm2ZYXOoFzj3aMgu - 26nRtxPyy3GUEoOIUwshp2F7oyPrzIfc07ythUKbIupA2tlB6XGOL8Dx1gp9uBUS0XzIP00i/YgQBOut - ZTMpyOug7G6ELASVeNEWCmJuoWORimJuXkQ8nLLl6ymXhbStF+mI50BOWiRikiMfdfCcFqujfmDFedNt - 0vWTLfqBGAAAC+A3tG//4ic28o0xlnBXshVeWgK7sMoaYeLp/nbu71pH3sNqKMtrKOm1hvJc7HdDN+5m - X8d6AYveVZjkyBIch0sUddCyYwW0Yi0NsCCclYIl4Fkmy2RByPJZijUhobrvCkBMIgBYDcCsWgywCdwW - A5yLBTrQhXt9YLSqG7BE+QUAqwCOTeu/2wLYFwBUEswHABfvCwL/ASD8BfnxhwEBAPOcgH15Af4w4Pvv - vm1XXH6JxUXHOB/AqACYgLD2tMYPoSlICH6AUMAhVOXB5AR0ywD2qRIU5nUNkhNQZj8dhcKzfBIhyWQm - JxEoSkuKHM6TYBQ+BYXL5Tm5HJuEck3CQagkoQKO5XN9PscLkCJ8BwXM8kVcU4wCqiR4GbM/5cMjS1HS - GYkWPk9VggGTjVCAzwcAHhhtR75Oz/gX6TH/3FA78h36yj830sZeHGhBW1H+HtiL+AKiKBIaU4PiVkt4 - 5jwEJ6ESiJQLEM25GAqFxjYwNiOt+CpQ+phWfksr+wuQFpYlFAeNXYjonEBgEduAQnwHQNAOCHSlW8pi - QGB5jk1ZnWdFm1gSHE3loGOg026fZTOPg8p7PIy242n/DT1WRTgdiw2a70wYbNoWzbfqBNhunJvJ9jRY - bdNOnW7TTpthM06j+Khjv/npwNCAp51Ci+zTaJl92nQKY+J/4BmzRUGG1qvrK86g5fbpvP80shahHTt6 - 8i7O8c6KM6ZbybmllntxgaX/PMdi70iy4KdC7ah3h9khnwMAnx1uw94aYSGPhlvajRlWcFGRlUINnnka - z4AyLEZeFc+qOh623i6fqLjnHLH6TvTTll2xURh+x8H+U/FSwK/6ePbdd+AYMo9qynMdMPqkZifXHYto - 5HgdFZPrdiDbEICzbgcACXDWbYfNuAN2I9v123SMCsZb2d9MIdatVDkG3BbubLcvv/xyL9ESQMc07gsA - yga8SEsABwB7yf+w/w3y4y8J9subbtoDAH5KsIDgHnIB3n33Lbvs8oto4BHlAGDM+EDH2IvA4edYgMEo - exAzbgjKCy04PFz0YMz0ULbZjwxFoUNQcjUOoTlIhIqHqnsQY3QYSiWhaKiYgZEUDY1ijHVMQRQmwscK - jFWqMO+MReLVOIQiorGkCMsPIAdgrPwAYgnG4fiLhQAEW1BOwJginIpUCA5dEmnjzp1oQ1nzy+wfev9I - G3rPGDvqheE25KFRRAKCyAWIhQwED4B2YeooJEdgcpYajKipCKZ8Emv+ZNbzKWQGwhBMUe1ArfuzMOlp - JpKRzvo+jTqBaiJC9qB8AK6OoKshiOmf468nKF+A6zgMc7CYDkJlOANdAxH1EOQfYQvlrduYMbUMWMIy - QL0DmPE0E2ptvNg5y1ivO6+6bx27eCWx+TUSkn40gxKq64ElJ7Zcz2rYces6McW73LFekXg4ptm2h9m4 - k1m4faOsAhJ5NpDIo30YcrISWjm2cNMim7+JstxbRR9GUahiPAua79RLCyzu9iQb9/xEG/TeUPvJZ0fY - T35zuA1/a5SFPRhpmddNspLdFQDVXKfEDXD7m7ZjrWxDIbFs6rWNYkoppZyiGtdKSVFcWTN6z1yUep4U - XnTh46ALHwsQ+i0igUKVEyjDfnBw1wCG1YBJFXRi5TTMBnRESRbQOMqwy3WABixgO9FXDXjmCVU2/TjA - 8lRACQ7DF198cUCRD8DLDPSYgAoD7gcAvGM//nRgLQFu8ROB9lQG8gHAeyQDXXXlpSgpSwBFAUKJAuCw - E/FHLMBQmoI6NqC4AH4+gMcDEC9A9QL7QoE49uT4czkBrmmoPywoQpALEcr5B1iwHeUKhPjZgWodhtUR - gxMwjryBWP+2ioK4KkGudRhjiq9YiNqVx5IHEE0DkfB6livrwh0D8Mg3fbP/iF+OtaG/HGdHPT7Kht4H - I3D3RAshUzCa7D9xAZQanKi+gbQOU4uxZKohpQAIahmmgiGpOAOdI1CVg12dAEZqBLi2YaQPq1Coioeq - g5CrHoyj0IsOZFI3IGsKHYQpGDoply7C+YVWUAY9mKrBc2pq8QU0WesCogHtvba0E8psD+Ys69VlmLcS - reG1Ll/DWnYVZqxM2xV0Fpb569bUMnsxc7VuXonpq3PLkJWLMY0xgVdw3jOPV7Hul3msdbjW+Cu1buaZ - eo7zFziTGeH9apyxVPHytd2UKG+2aefPdPH/Ea8ApG8Nt6HM/Ed+dJQNe3ukRd0XZwWXlVCiGy4AIUOZ - 90sApmU43JYv9cXeHRlIDkv9Te73+46rOErvCqIggJ7zzgNuLoIAAPZwvHsVywX/MqIHp2Qv53sZu9cA - dIBcB2DXsQZn6mqWGBzr4bxArYNlTed6zrEE6ljLUodrO1d1W9vqDlu0FirwKnItyKxcyLLoYABAFoAA - wJP9AEHs9+rQ+1teBgD8Z98SwLMAGGkZZh+xBLjmcnwAxPoFAOPDglzMXnF/jwrs2IAeAEAH7isS6q8R - 2L9OYB89WMxAlQMTD8CrE6hRDUSRKJqIih3oKxKK8osEJB6AWIFOfMVCXcFQr0yY+ABKFqJmQLRmf/oF - hNFEZMKWEBt2F+v/t4ZA/hlhI68Yb8OvAwAewhK4f5SN0RJgQyThQvICcCDGl2BJEA5UMVEXBvS3FE8W - O1CcAH8zUa9xaF8HYY8Z6G8lvlcT0X0ainrdhHNK810j0UKvaGhTjdW10kWoi6jA4k4qBrEWRjnURch1 - EsJxtT9xDi2cbTonRVrm316ikXx3Obvk8ZZjUWtpXxEMjutadSdSTrxf5LTT/WLILZNicn4x90j5lFA0 - j1r9pZdUWuzdSTbk1yNs+KujbQIcgJGvjbXRr46xmAdiLe/qIurz17jEpB6lIWvtvtTXBl3v0SiAkqzq - 1egDsRUAnGuV7oGPzguoACV3HDASKOm8wGu1QJCxzwcgMPFfp2t1nSIqAs4VAhsBIcfdiCzlfA9dmhd3 - k4Lsz4c4GADweAAXX7QHBPoDAtuZf4tOfq/3AAB/lAXQFwr0gwBdg+2jD961Ky+9hIo9viXAeCwAzfBh - KH1ILM65WBxyfkpwHy1YILBX6/B+lYK9isGuZbgfAPpG5QT4Kga7YqEiA/mJQH2EoH6tw7224f0BQLUD - XcEQSEDRs1iq4BwcvyPYht452oY+OdJG3TDOxrAcGHXVOBvC7D8MGXNJgAVtiqCDEJGA2YQdi/H+q1ag - VzHYA4D/hRjUlyOgLsIHKBvWHxQEAlkllAuDGVgwo8wq5pJF10izC38bsfYeyoeTH9ADPdhrI3YgAPAd - F0B4sn+g+Pb9mnX7A4u2xUaU+J7VS8HMbpYVi6AAN5JqO/vsaiu4soSZPtYp/1iWAaGPRwICwTbh2UCL - vj/Wcq+bajPPUiRgvnM4ajZ2MzvPFelmiQBN72Cmd6E4Hde+Azqcft7fw74DL9dGDYGyuwfMfMDVtw9Y - 6byuc959AZf/XQ4g+877nrdUrEukq5e6Br09Lk9i7foN9pvf/Ga/ImAQH8CrE6AlgJiACgM6ANifXHxx - yfeqzH/LywCA3zsA8IOABwQqCPIBUYDLMXEiI8N9S4CwYGeqh0r5Y8JQfrz0sb6cAI398wL6Jwf1sQL7 - A4BLBOpnAag2oNdKPF3tw305Aj5qcL+KwV5+gCwAWQaI10bcAcAkZn9ZAChzOFGBgBOCbPgdMvdH2pjL - JtiE04NszOUTbBiz/zCsgNEwBAOPDbfwLgCA0GF8KQ46Coa69uGUERcQJLPdv2jo/qjB/QHAtRL/K0Ag - AxBQ0dC8GaVWXk1uQB0RgCa6Cbfise+i4MdizFg/APxvVsDeIPBdALA3SOz9XL9CSnH6AwBm/CJ8Amof - Vrl7lk25Nt+iiACMeXGiBT5FPsWjMRbwbKiNeWGihT8cadk35rj6AI2kE7dtWITXHx/ESnwUftadG/1K - 3zf2P/c9bCvvQt9W37hjSRdLjeW24eiN9vnnn39LBAo6vi8AyAK44IILUP6LDgQC5X+LTn6v9wAAv9sf - ACgb8L133rBLLjxvDwBMZAkAQ08swNAoPOdRFOuADRiq/Uhmfth/YUQMHD3YP4bTPETiioUirk6AmoJQ - I2Av6X/MXzw0Gl9AdLInmP7QkCWOGKR1P+w/BwJKEoIGLJ9ATA6AQXRAbcNCFwEAJwXaiLtGEgUAAC4Z - b+NODiIxKNCG3TvKBr02DEtgtI07LYQQYAzefwCA9OGEQlULlvL7gUAAoAzBfpWDlSzklgH9MwS1DNh3 - KbBP8VCvhLhGOQQnlRaSIVhmZXPIEKzFW95I2E+lw7tYl/IPs3sZITJ/I1E1E5Wia9bee+b+7hn/2+Dh - zby+WdInHjD4Z2n/O7TO1pq5dVObK+Ax7dyZAMBUi7o/2sa/GEQSUKRF35dgE58Owx8wwsa+MN5Sb0m1 - it3TnDNPffc61rCcWYkVcADF7qVZqmQvgHD7+x7zfuvfMDog3XOfAEDShZXV3tPpSEhbjtm6XwDwQEGR - AC89WH0B5APYAwACgT75xg8Kxd+rMv8tLwMA/rQXAPgdgvfdc7e9/y5UxwvPp9BnpC8KEBbgMgHDCQFK - qdX9J4IxjChBCFWCQ1H8cERg4KMFEx0ACMIpECLRta5tuCjBrmCougX5AMEVD1GxUCIEvpoBmPJEAKLj - 2IaK7GjBaimuOgH+SIDahql4aCyViuMTiArQPjwuHadgHhbA9AQLJg9g/EnBNvwuLAC8/2POwwLYGWLj - TyY1+EaowW8Ot0HQg8eQGhy6NJqegTxbdQLVJESNQ2gftkdgBsoZCAvQiYqFTlb9QJ+4VmJTmfnF/iMS - 4ByCsASdE9A5Av2FQyka6ksjhhpcSNHQYjIEy8kNmDXNKuYR3qNqcO38RpvfttDaKR3es5SZE1O1T4md - Kes3+T3z2PMNOLPXM5e1/veBhQDEu99bTuzZ358ycT3m9GIISTLflTM/H86AKvaU755uOXAAIh+ItnEv - BVgYWYAJd6RY6MNRNhSfwJA3h1n0PdGuUIiq/cix1rGGvwOnmwhOnrL3V/ie5QK5vS2E3mUCDKjE+4DG - /sFClN79gciev02zff93a1/fthPzv4N07F74BhuP3mKfffbZXtLfIpAF0B8ARAU+AAD8DwAgEMj7W3Ty - e73HiwK4JYBfFA1wyUDvvWOXXnCRRYQBAKPJBqwca6HzUPYKnGbT6Lo7DaVHgssh3ZTC/CujXXg5UkLJ - r2JKgJXB/CvzlQ8L4nxIIT6DIvwHJRB6SigDxnaYWogXs6QoxprQdgHXsB2aD88gD/AoIJIgDkAeYDMV - EMlHCuAG5CHwBaImAwpTAAFM/5g8Zn/ov5GwBUOpHxhACHDs6QE29O7RzuQfTUmwCcfT1fikEBt7AdWB - IAcNeXKEjblhvAVvwJSFBxBTBQiopThFQpJULHQyzj9Khid5ZcP9IOC1EUtzbcT6Vw1G6dUrMMvfN5Ci - Ia6VGG3D0igi6tqLsS/JolhIzmQAoAA/QDnxeajBs2fhCJxL2fCGdute0GNLOnHIEQ1YitNqmRxnPXjp - u/D4Q2JxRBZ6DC6npp289sv83v6V7K/ogfrr7sEJxjUrcLYtV2SA4yu7fV5+HRcTTpECOcZ0rWSpnHXa - XoL3HdNdnvQFcgDSHLTkggpL/mU6Mz4m/0sTLOrBGEu7hToKgEDw41CuXxpr4Q9EWuElpUQMGiEUofwr - iATICckzl/QCXou1TTRAzj+9j9+gc753+gFO13CtO44jz4Ge8wP4lH0pv80dc2t5gdweBRdg6pzvGsKh - AjIAphtA6WZbwKbEq26ky78E6NZvXL/iWwDQHxBkAXjpwp4FICJQv5l/3+0Czv24+wKICNRnAfSBgIqC - 3mUffPC2XXb+RRYWFGqHjCcXYE6AhdDiO5h23xHU2lPL7fBWfAL1FNyE8acin2oX7oqE0jI8kO3A+hAL - qmGbIqKOHdgIe7DZ1zI8UKy/RgkMQpiB7th8/6j24v6W4cGwAtU6PFjiWokDIGolzjViBoa4+n8ACDN+ - SFu0BS2GAQgBaNwJsACvxOH36Cg76rERNgLnn5yASgISO3DEjYQEHxrB8gBn4HkTbSLOwNAVgFAvOQ7t - WCsLqFDcBChQUyCmDqChs3A0HYaVPhyHaIx12+ogDEeBoqCJNeQhzEXYTphLbsI8ioJWE1qcBZV4NssK - SoQlzcGy4FjSHKyKKioRVeVYdnWeFcwrs5JalgILZltVN70ElzbawhWLrH1ZJ+aq/lFDx0UJujCnO1f5 - wl2auZzio9jyajtlwSJQ2Ez/8OX8WilPuwpfcN4poVMmOcbg5stb3uNTxOU9Aguf0shrvxRlVLps16oe - WwAfQDH5vMuKiPVH2ZA3sKhIA46DEJRxY7Zl3pADCCRbEOSgiIdiLO+KItfefNGGNsJ5PE/efwFTJ558 - CnCsEvuO36QogGPjdbLdQUZeB2HMDmjP7C/vIlqg6wC61V1QfjuJCCArOefu4Xev4JpV7K/shFbMuAZw - WwVILlcIlfO634VTu3gv79b1y3j/Us4t7l1uvd0ARCe9GvUswqH7WgD990UI8hKD/vCHP5jqAQgALrrw - om+JHxQEAId9rzP6wb7swACgKMA77g8LYu1/yGGH2oT4MNcVKIY+fmmTMywLk1dVcpR+Gzkp3pUEV6nw - kHSUKIvZnXLhoRyLmMxMPpXtfM4haiEens9xZne1Cw8rYRlRLEtA1gFLiCK1EWfZQAvx8On4FaaRfoyl - ETaT+8gLCKddePgMnsO+8gnCqrEK5koAJKoHh7STAbgyzMYDAMNvGWOD32CtDwCMvggfAHUBlQY8Fj/A - iJ8Tx354uB2Ff2DkpeO5PsRCjsZqISyoKsKhUINVUTgCWnAkhUMiCRVGLOTdbId3IhQFVbHQCLYjVTy0 - myUMxUAjuxjZjqaAaDRFQ6N6AA6Kg0Yv9hUM1TXRPSxTulnicC5mCRThFVgcqwCEdZmWtWGK5W8psrKj - KRq6E/bermlWfnKlVZ46w6afSEmxXTNh0qm1dbXNhNiiY9MkJ1HbTmy74yDAwJir2klBUIgysyC7zD4B - tt1OGHXHwqQTycYx6Hx047kcd0Sb7XARjoYxBzOuAanbRv0/iDyzINdMh11Ycm6Zpfwiw0Yyyx/x3mAb - 8/x4i7or3pJuSbOUm6jAdE+cTXhmogU9HmIZN2RZ8TllNod3N0D4cfUJN1KMcx2047VUQF5LnUIchAsl - 7C9c02qta6mORGy+Yw3+D8XoV0FJZvnQsbrT2lcgy6EPL8cxinQym3csBwTdPrP7EpYRKqiCWd/LtkBM - lkAvgLYMS2IZ4LYEhV/KqP2lPYAg0tvJNe1LHGDo+Keffvot+eSTT0yyfwC4YL8A4AeFbMa/UwvgDgDg - 4/ftwvMvsOCQYNcbcGJQOKm9idTlS7OstEk2OZMwlrrkpk2mPh8gwNpdLMCwYF+9wPAwtRBnqeBSglEe - agc6Uedg9qN0zN8gJEbdg13DEAQHoSQaUlA0UYdo1v9KEY4mU9A5BV3XIGZmyEHqNOyaiKidOOv/aNb/ - 4dQBUBnxwPWhNuxOOAAfUQHonlEWcFwQ1YFYjqzH4tgZ5qICQ+5n3coSYdw5ZAZuJhqwmiSkZYAJVYFj - oAInKCpAE5H4Imb0EmZ2egy4bX8R0USKiCYUI+WYwZUcn6aR2X06yweKgyZPJ4twGr6DWTgU53A/ksjM - LysgmdlfY0o1ZcPrKBgyH3ZgC12EFkELXjzDZq2kdPgGnIIbYchthLoKbbVpCwU9GeuPloIixyBbYdId - DfX1GJh1iBR53naYcZId0GlR+nkocy3KXYWiz4ZmLBEgeFIFYMzh2MzjqS58vBhyFMs8kT4G0IbLT59m - BeeUWs7lUyzyLvj/L4+yES+PseBHwi36jgRLuBXH6a/IvMT0H/XCWEAgwBJvTbacS6daESBQyf3TT4ae - DHDNQmbu4tl6PtWQZ/GuWcfxvuNnu/3pHJ/GNdqeDW1Y4OW7RvToOTYDEYNvDiA3G4DTb64C5LQvwKva - AfjtgFKMVG+nGOg29rfBBNzO+R2M/P21sBFrjpEAfpupjrwZxiL+igaiHJ6y729UKNDLDvyXf/kX5wQU - FXhv2csaSD3YCfl7v36/FoC/L8CH8AAuuuB8CwnGAsAJGBCOeQcbT225MmHA5eLAysOLnUPtuyTacqnt - VyhFQkIUGlRYUAVDIAmFq2CInIBqIU7egNtWGzG1ERf7T5WDqQ8QhcMvUinEEiIBPmagnIAAAK3D5QyM - hiHoRQPiVE1YXYSSFBFQjUCuK/A5AMPpFTDhmGAb9hje/reG2shrx1EZKMxClvC7en0MwTHnj8cHACX4 - BayD6ya4ngFBW/FlHB1uoZQRU7+ABLIDk6kVqJCg6MEp6Tj9aD+eyphKunCyHIL4AFJgDaZBE85Ih/0H - PTgNmrAcgWIKOiowRUQzsygSKp+A6MH+rkJyEGZNzbfJeRQNLSy30nKUbhb/wGupGNxCubB2Emk64AMw - U2n28pnxzF6Y54sRt35mZluGCaulwGLWvZ7omiVaB1NrcDGzm9a9Wkr0sF72OcF86+luZk2tjzuZSZ2s - oGgmTrtFsOZa1i+0hi3N5CXUWMl55Sh6kk14ijoKD4db8s3plnX9JMu+lgxHxrjbE238s9RaxBeQdV2O - lZ01zXH9xdUXSDVtaramzQAYz6vfyrhV+1CBt4iXj9WxBbqxE+jAgFUtSirgmrcNa2UHygpVeO529pG5 - HKt2yo5FI0HZq49h5LgsnFk7AYqdAIzGY6H/HosVJIvoOADOAcksZ0lVHoeFdSz5D1QFrjm98TsBQOFA - L1dAAKBsQNUD+DYI9IFC+veu0Af7wgMCAGHAD997DyLQpczk+AAcEzDYle1KAACy8WIXlBZbcWW55ZcW - 4eTKhoZL7F0koBgcfJCEPF5AuFcwtB87sK9qkL+NuCjDfeQgVy/QIwWJE+CvGeiVDXMlw7wmogACoUBX - PjyX68rIOZhLI5D2CBt3EjkAT4ywo54YbmNOC7CAVTgiewCADkBqRbiNPxMH4eNEAt6HJSgfwc/H28hr - xlM8ZALnCHEBAlENpAlXQg7CCnDRATkFiQ44lqDYgV5okLCgKMFewRA3uiWSr3agC/9RLKSvlZhXRMSN - AEIhLcQA0wK+Z8lM/ADV/INsaKJoKGXBOyEFdbPelyKj0BqX+BVfoLAE0Xp9iRTcOc/8gMBadxnbcrwt - 5pwcb8tw/GkNvJw1sbLglrO+1jMW+58pINE6ewXr6MX4BQQGLRsXwemnBNi5Myz9piwLfJRSakQBJl0/ - xYrI/Cu+mDqHlAZPuyXTgp6QDyAKOnCRK9/dQh5BB3TbrqVkA8rhKIemM8dZh/Obl/kdgs4ZKYegfq/A - DcdeD/kQ7m/mGrEiVbqrWz4JjSJJ4cDT2E09xe5lUH5ZEmhp0I3/o4PlQucy9hk7WD60rSDnYQWZjpLl - 0IKdkOW4vN1allNenWzIJdtWfCcAKCLgMQX3AgDnB9hLvvHvTzlYffzerz8QAKgewMcffujCgB4AjIMK - rMq9CcTbs/gHLgAomz7NSisrLbcoH8XIoMY/PAFCgiExOOlEE96HFfituoH9yEF7gUA/hqDHDPTVDfQY - gh5V2F89GPCJnopQFyCknjJgvRE25lQKgT4ywpGAZA0E9xC9UKOQBdQcWBxFRIAy4beMtcG/Jk34PXIF - XhnmwoJDsBpGQxGWxRDO+j+GqsHxxazR6Syc7IGAYwZ+d9mw/hwBEYMcEOxTQNRjB2ZQNHRSWYGjBhdQ - Lai8aoZV15NI00q1IGoGtnXxD7gXVp3+sftJLG4WR0l8s/kecTM662BJ/+Nu9vfu0X1O/Mf89zsrQd5x - ntG+ktLfrNFrWGbMPGW2FVxabHF3JtrY5yZYBGG/ydfkWslFdD6+oNw5/VJuzbCQJ+m38HA0gFBIIk41 - /Qaafet4FLFHlosDLEAK+q2ASWvxpd06JksGxe8F3Ny2/xjnBFhL3PVYNzyjV2v5LoQIyZIOrmXUc7Te - l7joAed1jwM7zi2Wc1Pv1nO6EJ67uIsuR51YPBRikXN048Yt9vHHH39LPvroI5PsFwDkABQA7C3/w75A - IPd7V+iDfeH+nYA32/333mefffKRXXbJxWT7+SyAsRFBTgHjAIB0ymbnVRRS1YbwFTHsQspdZ0KMiYeb - H8pMHxQHALiy4Yjowf7koL4W4hQWdSXD/UVDXQlx5QgoH6A/Q9BRg8UK9OUHOPEzA30UYVkAONJEAAIA - oipZhlAnYCKz/dgzsQDw8g/V+p+cgLA2ZnRahamzUDA1AwK2htroSwOoCzDcDqdM2BEfDsZfMNQGva4l - w3jXTSic5ULMXDIOy9VQ1N9S3JUO90qG/e8gsN8CovsQhDLgBOSU5NsUagaKGVhahflcRyRgQTOcAJxk - AoBuAIBZz2Ox7av43r6n/P2BoO+YHxjcOU/6AYV3rHMp5J817dZI/F/r6cqzp1nmzyc7E/8oagBGQATK - vSyPsCAWiwDgsnwcgWkWDACEAw5TrsgnFXiW1ZLdNx8QaV/dbh3M0l3e+/2j23ezOOHGpbQzE8BpH9F2 - Jx2U9Te7bUqmdVMyrVvA5UY/yLHvrveL2ya+r+c5HoX/eT293IfoXDcU4M5erIMeLIJOiEpYGus2bXKK - fiBRRMDjBfz+97+3d955xzEAFQnYR3wAcMGFfxe5APsJA97seACfffqRXU178LBQHwBMmBji1uFxrLfT - Wfvm0fW2shIK63RyyRnzCgpJkc102X2hZBCGiCkoP4Anni+A9X+4TH6VBlOWoFc41N9SXOt+lQrrvyRw - ywB/4dC98gQAhJhs0oipHRCV76sFoAIhE9fg5DsH5cbLP+zekTZ+Mx7+BTj48A1E1fB+CocErMcPsDuQ - ZYCy2YbY4GdwCL440o784Cgb+sBwCzgtCIIQSUJ1OBipGeh6B2AF9OUJOIrwvgCAn4CuQvtlCToLYP80 - YV/NQNKEsQImTyuyotmVNrOm2mqb8covoHMQVsAiQKBLdQP9s3V/pd7LAthHyb6l/Puc3y9w4F1ftLaT - iMB8IgFzrYz03tRb0m3I21hI7wy3OHwB+RcXWfm5lZyrtIKLiy39hmwLeCrIJjwdaFk/m0SrsGnk8FPy - bFOrteHR72AZ4JTPr/BO6aXw3u/xFF8K7xcBgBRf+97onXP3Ed93wNHvnr5tP6B865yf/CMCkKQNwlUH - 7+gl6/BgAOBDLGSF+y6EDrwPAPzFv598sBPy9359fwtAfACPEyAA+JzQx5VkA4YGEwX4yU9sYmC4K+4Z - F5lmmeTG508utuklM21OJc6V8iorK5xmuRkFlhqZaTEh1PkLRtFcbQBCaUQEVB8gKgjlRiJoJR5NnYBI - 1QIQ+4/tmFCUOZhZXKP25RiMYV8txOkWpI5Bvq5BePuJOkRTTDRGxUNJGY4nIiArILICCwBFD8DbP/Iy - GoGQ9z/8jtGuOlCImotWEVmYhqNwXqKF4AuYsJ2CofABRBQa+bMJNvxWX+bgoDcH29hrAix0FYBRyzun - pVgSbcIScwEAUoWTs/2+AAAgRTRhJ3j8kRT5A1j/p6iVOKw/ZwGoeKiWAV7hUK395RdQ7wCvZFgRVYPJ - EJxUUUDvABKE5kENbsKBtoCKP1QObgUA2viH2unNmChP34zaz+z/3xTeOy/l67+E6DsupcIZuAjTXY45 - 5dyXnldh8Zj/I1/nWz4RbJlXT7YinILTaAVWefZMdz4Hn8D45wPsKEAi6t44K7yoxPUflLNvAaE9rcG/ - BQD+2V2/xcn+FPn/+th+AKBd/gR4E1JqT/qDgY715wTIAtD5PQAgEPiWZAIEP/nelfpgXugBgKf8/QHg - U9ZDl194sQUGTLRDAqj5VhoEww8zmlh9IuvijLocmzq/0EpaMQMXlFnB/GKbVDWVunkZZORRNWgK8XQk - KNvXQjx0kq9FuNtWC3G1Fac6UBhtwsOzlAYMSGT4qgepYpD2XQoxiULh+BZ8zUMQeAjyRaioqKjCUUQm - YrLYhxkYNhvOQDvZaRQCVRmwIz9QDQAiAPACwvANRBIijCkCPOD8R1bHWxAtw8QO1GwfQOuw0VQPGnrv - aOoHsgwgjTh4S4SrCBSj/oHUBVQkIDUFpU9G0SWp9AHMRLLYxvuf6gTFTkdUMCTbxwpMQ7KoEZBB2zCx - ABUJyJjMNi3EJFmTaSE2BWbgVDEDFV0ptQosq+p5hKeaUKBW2lctYqZq5x9qF84x1sqLWUtrPd3b43eU - YcbqeJ94+4wyfX2OM5/57JnDulYg4JTfm4FlHqOMrSvbrGFDM5yCuVZC37+YexNs/AsBloC3f+ol8BTw - 8qvij6oHlZ1eafk4/kKfiLAj3x9KpCDIJl81lT58swGAeltAB+S2VSQ47aXkWhIAaFgGfab+Psrum/Vl - +ktk5vcDCS0P/gbQ8GZ+b1yEBdAuYN0HAPqDgbb7cwRUGbgPAAiVK1zuZG8QyGX/74MI1H/2FyX4/rvv - sc8BgKsvvNRCJmABhEIFrhlvAQtCLbQ10mKom5e4ONXSVmRZzqpcm7yairer+Ae/NMviILiEY4YHwQic - UAf1FlE78YB6H1NQEizGoNiBjiGIwAIMgtnnWolTSzCwTq3EAZB5HKeWYCDtwtVJWDUFg9Q1eB70YboK - h1azXePrIhzM/YFLEJx3Yy+kCvBLQ1jXH+WKf47bHuTOhbb6uglHUCxEy4DgFTAOqQcYuIUah7uC8BtA - EGL9P+QJEoioIjT+bFKgl0Za5HyAZh5LgenE+vEHxCHxJcS/AZMEHIQJNBZNzIfhR0PRBDUTLQYkilQ/ - QJECQoZYA+nOIlBUAEtAs7/yA1RFWGFBwoVZVBLOKphqk4gI5OJgLa+cYXNn1VljDbN/E7X5WlCgVnwA - MNfkyFrWAbOtAyYdHn15751jSwQXHF1yjC2n56BkWQfhwU6AossPGjrfgXOtnYgA5/QsByLdyo1HKEYi - gGjHU960QUuAeX4AiLXxzwVY8q9SrPCCYjgCM6naQ8x9Zw2cgVlWem65pf4yw8Y9N9EtBXKumYwFMMdx - F9qUESivPr+hl3f06H3IUraX4ozz3t1LVWT9FgdisPR6u9lHerhO92nt7hOOca1E93T37AMOuoZj3T1a - 7wMarPc7qbQkC8St/WX+kwSkRKBWoiwdAEkHdOAPPvhgL+kPAnIQevwAAYC2nQXQHwD23p7Eub8DIpDo - wP7agFL+W34JANx3r33x6cd2FWHAiKAwO+RInIBpNNKAlx+XjxOQDrk506daXm2BFbdgASyqsKIFxTa1 - odAy50AMmpZu4eVx5AiQJ6B8ANqHKy8gmP1gcgFCy1HYCpRZbcSpFhxCK/HgWYyqDoyEziZUNwc/AoVG - XTFRKT9jEEVCg+vIP6jlXAPPgCYcMl/CuU6UeH2Ijds1kaIfMABfGmZH4eAbdckEG3d8IOegIC/DIunC - QYkTULP/RJYGEzcATFuxAgCAMWdPtBHXjCV6AEOQVmKjAIPA7cFUDWIJsRTrhfJhSh2O7EQ6EOoIRLTh - uIQW7ViBKiDKflQbUYoFLEkWssTRNoVDY9iOXqjagVgUqh9IncA+WQiZaYFqCeJraIER2JpjOR25VtBL - bb0VlTZjFdyA1cS919Za7Qb8AhuJoW8kli7ZAEFoPc7CNbTAXoO/AJZdM9stbM9fTRvs1RT+XIUjEVpx - 60p8CSsBE8JiC5nhWzm+aAVNMpeyvEA6CJ1pX9fP39BCTB0HIIqu9X7MPSRXPTfeYu9MsqnsV5wOQKlG - H9fMPAkAOLvMcuAEhD4KoBIOzKY02MyTZ0FaaoLtR6UjwnS9aoEmpUWZHYgBNsucV16sPHj6Hb7jSx3A - AWLy8HcCVMiSdoCi3QdeSwGupYtW2pI2bePd5/hizruoQDvgxrikA5CB5af7xPZbvEjPB1QAIdF/u+FX - dLYDDJRkF3B28rv2BQDtv//+++74vgAgXoAYf/sBgL9w7Bsk6WCs8R/kWrcE6AcA3vaD999PFOADfAAA - QJivHsB4nIBi9SVSky8rnWq2U3ACFU2zGTNgZM3GDzCT+mpls6wwv4yyV1Ncw84IyDzKCOzvDPS6B4Xj - /AvHCRgO8cf1EJBDkPCfayaaJh6AagT4S4iJG8CyIIICotE5LAMyOYf3PwoHYBQ05Kh8zpMEFLyI+P/G - IBtxITkARACG/2q0jT+G2b8XEpCqCFerrDjLiwruo4x4xDx+XxP0Y5YNwSsjLACfwJiLVS8Ah+ADJAqd - P8GRhsK6WT5AA1ZeQHQtKck0HY2lgGhsPaI8gQakGeWmtFgMBUNjGyEnNaPgzSw3WhgpFhpNodBoVyCU - d2tU5WBVEqZQaHQnYyfXdZHZ2EvUYTEhx2VZlrV2iuVuzLO8LcVWtK3USnZQQmwnxTtPmGkVSPkuiCwn - UAj0eLgDMOx8x6db5fGszU+AVOSX6Rx3wvXTj4M2DBFmGm2xpx3PPexP3wFDb4dIMxBlYNrpWRWn4tzb - XWzZl02xlBvTLeQRyqu/MsrC74+yjKtzXIHQ4rMA/zPhguwuspzLqJl4U6oFPEnKNZTgRLbzLiywstPK - HdNvzjHVNm8rPo1NtAwHtBrX+sCrbhPbWBoNayjSuc4HZs3r5tv8tbQu98BsNdWNV823llUA2koAbTlg - tqyNERBbodRpaikuYUankpLy++VwFKAtWiLzHj5At5ZOPougS5ZAF5YAxzqIAHS0kQ6scCO5CVL2/YkA - oL9PQOXBRQpSFOCC889HLugTFP8/EYFAzA+i1AfzUgFAHwi42V+AcLM9iAWgMOAlmDjh/ijAeCjBUmg5 - 3NKpjTe1kP+5ZRS1nA7jisKWs2bxj2fGHCurnGZ5xZCDaKqRAEsvUjUBoljvk0bsagX4S4i5NGHXRcjX - Ttx1DCJC0McGVI0AsQRFE1ZHIdUQwOkXRfcg1RJwFOB4zHLGKMBAFYNDa6gBsJq1/DkoMd5/JfwEYeaH - 1aLA5dwzGcWkdmAiBUUT1U2YPIb4ApR2Gv6DhjgLWgY/gKIhI2+H7no75a5OhPVGbkEESUDqFZCs7kHK - DqRzUBKOwBSRgrIY8QGkiRXIuRQ5AtVduMDXQcilB1NTULyA5CJ/vwC6CKubsOsepC7CcgbSUyC9EpnO - smAmxKDZ0ILnVdi0xtk2cxEg2wmrrrfWGpfPt+YVrSgDM7xmfWb5+WtarHnDAiwCWHYoUcNaKMLrUSz2 - GzY1Wu0WGHQoXw1jzWYYdlugCyPVW6AGbwW8j6HKMEy6KmTWdioBo7Clp5Zb7vlUAb46y6Jvj7WRL44m - 53+YRd4bBc13ik25iJDl2aVWcHaxTbmQlulXZ1vMbfE2Bp7AGCyFuF8mWNZlRIvOzbfi03BqnkDKM1KO - lMHAm3Ys4LMTNh7ANAPW3jRAqPJ4gdt0H6gBTJU7AaJjAbnjOMa5ihMIOwN2lbD3pnF8GvdPlxyra3Ud - 93Ot7p0BoE3fDr14BzTi7dCNdzBB8Z6ZHJuzhZyJLTAEN3F802z8HDXWenL7QQOA6gD6AGAv+U/2/wIo - /H0AgFN6fyagWwoAAA/cd599/tmn8AAutbDAEKIAh1pARAgON5hx1OfLZD2bR8iqlOYW02h0OW02M8sc - 6JVV/E+dOcOK6XwziW44Kdk4BAnfRaL0oVJ8EYPECdi3qzBlxb0Con3tw/uXDfNqB/aFB/uRgjKJOFBS - PKwCC4AlQQAWwKhLMOMfRIlvGGsTWcOrTHgk52Ny1W1YeQNqJ84IIMRNBRTK4LLXsmRZAgCcDEGIHILh - 9wMAVA0O6cVJWQd4VCSRIgwIqH0YNOCkDJQfB6AAQB2FUjNRaNKDffUC1EnIN6q7UBp0YFdENAdFV7pw - NrRhFQ3VtgQfQGYuzkBShlU0NCev0KYWwLQkTXgGRUPnzquz+oZmW9RMoc2FmLFtmLzQg3twCPZoncwa - 35m+rOuXLpI5DFtOZq7WyTovk5h7lnGuF3PZ3Yd0Id0dbGN69yI9mMftONdaVtEAlJl6Ok68wgtKLObO - eBtMCfChNAJJ/3kGiUlYfiQYVZF3UE3OwTQshoLdpZZ2Q6YF0iEo4EkiBddmWslZZfgHZjqKbu0mli5r - m93M37gOYGJb0rTBB1b1zPz1GwGrDfD0yX+oWw8dGKnZBHhtRDRuAriQuRtrrGozXP+jAa+joflq3Ere - wDYmomNQ7KMZOTZzGzkHlFmXTN9GvgEyne3K7TOsfAdgtKPSyrdTjp1EquZzFlAI9739iiyA/v4AWQBa - AsgHcMF5KP/e8h/sAwDnRx/MZPyDXNt/9nfrf1cm3FcP4KOPPrRLL7vUggMD7dAjDrOgaMKAeOITUZxM - CmBMLS6xEpiAlbNB5FmYnBKAYNpswkIVlTa1BCuAEFgilXojMfddBWEpfj/lFyB47EAHAH75Vs1AEYT6 - KMLy/PsbiooYxDJA9QLC6B4U3Eoq8CYsgAvH27CHRzsHYOAyTHgsgAiyCGPgCihcGEtL8Vg1ElW78SmA - ALUAI+ZhAcAgHH8iZcQeYrZ7Hf+BfABroTZDIIqaQwi0lFoByg1QOFD1AlU2zF86TGXE9mUH9lGFVT3I - qyCEdSBrwBcW3NNfMKNAlGDyBgoJB8IJmEwfwYJpsC1nUV9/LolBaiS6cIEtIj+gvctn1jpzlrET07az - 02faOunGKabzGjF9u+RI84OFogjKLRBo9CAuquC2BRqwAAGNNiiyjSikkmwKz6cG4IOxdtQHw6kDEGx5 - F+eTXTjH8fUXbMDnsKHV5pJYU3Ey1YIun+p8AMoHmHLFFJt+Co5CyEBN62hCsgxKML9Na/KlArA2fgNr - 8h7/b+5pF1CxD3j1tAFMRDx0fXcXMXrGHlh7ukbsva5OzHe+QRu1E9vk0ON8B39/B01WOxzBB/qvzi1m - edDLUmAxtF9E2629bdaypM3m9y6yBZLuhbZg2SLr2bT8gAAgYBAAeD4ClQdXVOAAAPDfAMA3SOgPotQH - 81JXEMS/DNgDABCBqAj0yYfv2+7d59iECePs0ME/taBYQmKE4UQFTsPMnQIRqHQ6aaoCABRfAFABj72C - 7TKkcFqpTaLwZQrMOQFHcALEII8V6KcIOwDwcgTUQ1CMwH1bivevH+hAwJcroGdGUkE4Ep+AioSEOACI - sAkbgm0chUCGUfd/FAAwcQ389DrW/bAEoyka4gAgu1+nYaoJxxakUkkYEpFSifEDqFjIkR+riegIagZy - fxv3VyfQcBQ+gCMDkRvgxMcK3Isc5O8o7KoIe6ISYv07DAMGogZ/iyXouAGQgvhu4gRMrSyyYqoGV1bP - cszAOqoFNbexDu7Cead/4PyDb4fNJkabRkmb9p2nmzr//mPevhsJeWn0VcPpcWvkdkeK4XrW0K1LqQC0 - eqFT6kqy+HJh+YU9GmWjXhuNAzDBis8rcVl6NXQwms/M3Ywjspqsw0oAYNKVudQJDCZcOIHU4XQrJIV4 - Fkk4dcz+81csdIrZg/J2S+mh4HYjXQIuHesg1IdjTtLjH7tQdp+FAgBIKJnedw0AoescYAgY2O5ywCaA - 4zoBCqJzSqjq4Lje09XGuUUAXSv7i3AELqT0GscXU0uhvwXw7rvv0hvDJ2L9eQ5B+QgEAOIFHAAAPIvg - 76IvwF/6LwF8FgFLgHuJAuAD2L37XJswbjzNQX9qgaGkA9P+O5aYfCoddCfn51tpKeZTJeutmZhWMzCt - pmMBzMC5NGuWlQMOBWWllgn5xecQZJbuP/v7Kwg7Z6AEIBCLMEIiWnCfsuMLkMKrcKiowa6EOPuAkQ8A - 1DEI5aWPYCBJQBOOZglwLUuAZ4fZiOvHkASEAmMBaJ0fnQ8A0HVoDwCokChOuHwAABah8gQC10Xa6Msh - tBBGHPIsjMDTgy0Mr38ENQNjIBElFeA/QPkTJ0v2qSDsqgjvxxIACPYCgP3UEuxfSFSWgKyA3LIiK5xB - liC5ATNqsAIa4AUsxEHWRf68nx7sKXn/sb/y7w8EpPD73ucDAOrjL22zZgCgCtO+4rQKm3xFroVSBGQ8 - ab7Jv0hxef6zSMOt3VzLzN7o/Axzydabjsd/yuW5MAEn2uB3hriMwRwsgmmkFdccXWPNmPuLmGk1C6vs - uUZVP1Yozv0W7TNLK+fBbXvHHYj5QnYe0DmQ85/XrK9zbdyn4+3a90sHSVTuvKwFxjbo1G4b558Kr4pd - ubCTFmi8T6xCKfr+RI1ApfgeQKg6sGjBcgKef955Ti7YS9yyIAz58YcB+y8DPGLQA/c9QOYTPgBag4XI - B3DITy1gHFGAwBiLpdtPeny25WVDBsln/V+KExAm4KwSpAgpQIpxrpTMsfJiLIE8ogJpuZYYmWGRwShZ - EGQddRaik5DaikeGo8gwAyVRSEQETT1UG0AswBiUDiZgTCTCGM1+NA5B10Kc1uHOv6A+AmQChs+Jt8Au - cgCY/Yc8N8wVAhl1wQQL7Iy0iDkAF23DZO6rn4DyGURpjsUfEKNlAH6AaLUTxxEYSCGQcScFUTac3gGP - 00X4XPwAhP8iavADVFK8A7CQ4jvpVzg0SXUEtRxwAIAw6/dJP2sghd4CfX0FcBRq27ME9iQLTbKMksmW - U07VYCypktm+moFVDWIG0jugk+IaxK/1D1hU1v2BwMEcU1NSBwBLOwkXtuF9X2BV22og+FTYpCsmWciD - LI2eDnLRgLIzy0iv1axON6M1Ws+3oOANpNmSMEQ0IIIowRF0DBr10jjLuD7TRROqyMdvWE96M892Ci5L - xQ9CPsWU5SLF9ym6tn3iU1onex0jXMkxkXj6jnvX+Ued6zvf75y7r4tQKLKQ4qsLOoko8OxFgN/+lL+/ - JeBtewAgJ+D5uwGA/uIHBEAh7mCs8R/k2r4ogJ8G7O0/8tBD9tWXn9mlODlcMtDoQ21sDtTYfKrA5kXB - iycjcOZkm1qNp7qOUlb1zFI1FVZWVWGlcyWEh6o4NqfSSnAUTiHRJVkOQQp5hNJbIFidhVyyEGtzvP3h - FAYJp2qwCxEqLIj3PwJFjyLs6NqHofh9VYTZjoUSHEersBhYgJH4ASKIAMiJN2FFGKW/qPVHxd/hD4+i - yg98/haaflbGo+SqZeArHhofA3kHiaOYaBwRgXhVFVYtgVkJ5Az4+gkMv4tagpQTExlIKcTRtBqLLwQA - aD2emIGCp8EApH1YKk7AVNUKyBAb0OcQTBFVGEklKqCCoa6IKM5BOQZTiQi49uKuxTj3SHRMEQORgygs - 6qIHnhWgtGusgIq50K7rfcuA+YtYU3cQv2cWc7PaPjOfmwHdLLlnGbDXNf2WDN51AoBFmP8LVi+yesJy - s1DyIrz8GddMstCH6LL8bBAWQIZj/elcDbn8TUQhGolCzMN5Jy97GRZDxs8ybeyLAVQOGmdJN6ZaKY5A - 5eLXwipsgWPQqtnfP3vvrbwou39Wdoq7l9L6ldkpryc+ANR+/2u9bd85331OvH038jv8ALCQ79jOUqil - p/2gAEA+APEAvgUAe8Ag4QdR6oN5qVN4HH9e/P+Wm3z7Dz/0gH39xed24ZkX4gOAChxNTcB6MuTmE0+n - Ll8MZJekrjRLpcNt5tIcy1rBbLUcs3XpZMtmO2sFx5bk2OQlk23SYta1XZmQXJhhoeMGzYUoUg37bw5s - QI10Gw6azTFaik+cDVlnJkU5IAhpTR8qUhDlwEKmq304Mo39Mo6XYkGUQy2egTUBaShY3YWXwADcFWhD - 7iKGLxLPleT1H0fnHxiAIg+FT6f2Pw1EY3EExk7FB6BiolgE0bkIocAolggR/L7gLoqJnkgxkfuIBDwq - NiDVgiANRTZjRVBsJJ6CoXGa+TMyLCUNZ16GCoNK8SHwOBEQIOlZnOM8tOC+CIEKiGbi6FMvwVSqKUEd - dnRhIgEZtBtLhxacnk0YMCPXsrIJBcK1yCukajDh1oppM6yqikIhNShSI6b0AkxiSCwdrJ3lAOvS+ljr - XUZXRASPfqfi3axvJVpz67jSXztwrMk56O6TU80dIwOwV/nxbXjjmx0fYOp5RZZMea/gx+BIPBOEZz8b - bgHFS4+pwYNPXJ54fNPyhS70OJsCHeU0IJ1ySZ6FPeKzGJKIGJScU47FgNOQ0GQTy4tWOeWk4H7FXaSZ - 3c3mPtHSxuU9+Gd3+Tr0u5zPQ9f6QaKV863dPA/x+UP2BgJ3nxS9m3u/BQCY/pxrYfZf0MG3JPLRBgnq - QEuAfY/LAhAxSCSg/QDAf3PsGyTqYHTxB7lWAKAGoR4AeIDw8IP329dffm7nnb3bxo0cb4eOO8zG5UGo - KaAuIDz/5MoMS59LKatGlHzhVMtdhMOqFR77QoTt3FaknfTWDv4Rd02yrE5667VgAWBGh8D8C6yCEjwP - mQsAqJ14nSi/yDyAgCKiQSoqSgFSUYRVSFRFQ4NpF+4VFlXx0IkqIIrX3zEAl+N4Onoi3n8VAYUBCJNv - BJGAcadSCGRTmE0AHCZ0ULF4IZwA2o/LKgihpbjah4VCBAqhk3BwF63LSSOecAxVg88LsqGPjLIhzwy3 - kTQPCaDNeDDPCSNMGKZiqPPxQ9RhnUACUsdgN9axXMFPEFtNufLZLCuqsFKqWWpoexZhx9lYGjOgEs+g - NNgMKMOUDUucwZJhJksFxuRyQKSC71SBpVBOhSG2MyugBs+gTsCsUiucw3KrhmUALcTqF8y3pnaWAaoV - wFKgDeV1sz3jIu3LKmD9297J8TaUGwXv9AOFUyDRX2HBObDAKSZQaOvosAU9rP9R6Dpm92nQeyddmkfd - v1gb8foY1vZBlnthPqG2KpsHG7FlKX4IKSGe9KbV83Ea+sKBU7gmlCWDCEEZV0+yUjoSzzlmrjWtpLYB - ytrRwW9yDDwAqRXQ4v1d/MYumHqdbRyX6PcCTO46nH0O5Pyic+1tWAsd/I2InueuAczc+p6/r2+dz1q/ - nfOL+Nv0N/ctC7imtdMHAC18x0VYJd0UL1WVH4nW/N8lKg8uKrAIQOfv3r0vCPwJ5RcI/F1EAb4FAAID - FQT54vNPaH10gY0eMdIOP/xIC6I8eEhElMvSS0/NtMlT86ywtATiD7HUaaxRSQkur4DkgfOvHDKQjmks - pQNuSWWF5ZcUYw5DKklHgVKYzZMRIgOhjKFpzOaZCIlBYZlINkuDHLUTZ4ZX4tAU9nNxIlIuPKwQ34HK - g8P+Cy1HkedA68UqCVhBfv+ZhP/uGUmdPyyAswGArRT26PFVFFaeQSjVgkLn8NwqlhoUEhU/ILyW5zTx - HBqJBFFKPGATLcWhBA99eKQNhvgy7I4xRBVUIIQ8iFWAh4qFqrAIeQVhGqEDSxQpiIQK7AqIUlNQxUEj - AAtJeCejiohSQFRjRDfLFo1d3NPDtZyP7NCIJdKlQqKACTkVcRQPjV9MWbIlWZaBNZWzMtemrim04nUs - sTbhgN0Cg0/x7y2Kg/tj4Rvxv0B0mYXM3kSsfgMEH2oLVq+Ht7+eGDpStRYK72qKgK5usto1DTZvDeQg - pGod5bR4XtmJZHbuLrTkn6Xb+Ccn2k8/PtLGwe+fcj6O312kKhNvr1kHN2ElTL7VjcTl6yDeQB46udyR - fwIfwRqjaGjy9emWf3oJRJ3ZLAFkAVActAfg0qyMUvqUmuVKu0ABEGJchNJ2AlwCrPZWxoWAhPPYo+SA - g65rx/LpaiU1eiHhywV4/lvw6i8AMDgvcFDOhONLtHK+lfDmAqoEcb07zzO7OC/rqW0hVsMCgWGvLVu1 - Zi+l98Bgf6MAQE5AJf+cdy4A0F927/4joPBfSOAPMqsfzEsVBuy/BPAcgndTFPTzTzBxAIARw4bbT488 - wkJpECI2XzQMvpT0dJuSS1/7YgpYlqH85YT/EG2XlZEjjrjjZRwrZeYibbi0mJRRauEnJaexpkfpcAKG - +guIhoWi3FEoewTKpaYikYTd1FacNGIn2lcjEfkF5ATEL6AmIeEQg8LIJAwvxnQnT2DMMSjurRCAqPQz - 5mT6APSitNX4AACMqEx4ACokCjsxBuehiojG0nw0Xo5ACpmop2DkTHwUC2ETouxDb6Wl+Pv4Eh6laOiu - EFdEJLKRJQThwlj6D8RyfVwhXAKWBKoYFKekIGoGqHhI/DS2K2hXDnswrhz/wnSEDMpYrIEYLAO3jUTT - xDS2mn1KjseQohxTj9LXcW0t5+exDa04bgHViNrSLb0z27J7c23K0gIrXFVspetgxW2FDnwM31hyNOSW - bfx/YLtsO8B7rBh3lVZ6fKUVH1duxdCIRX6p3DHDSrfhr5FAhCk9lv9fnCvZWW5Fx5dbwSlFlnU++RxX - p1nEbTE28nmaqVJXMZiin2mXYc3tzrW8UwGhXfh4YN6V8I7iXWWWd3qBZV0w2RJ/lmITmP1HvTbGIm+P - sfRLs2zKOflWchJVjiHhTNsKMw+izmxAq2oTZJ4tFPjcTKHSTYwbGAGsuRsAq3XIGioTk/9QI4BinLcW - khDbNSshCgE+DSsXWP0KCETLkWUQi5ZCLFrSYo1LWZ4sgS25uNXmLybO30MuhJYL7Tj+WPPL869Q6gIs - qIUUXGkDbJYuW2Vq9vHXiPoDKAzoAYBAoJ/8me3/BhQCDkYXf5BrUfj/FgDsLVgAqgfw2cd29jln2+hR - oxwPIBgiUBiMvWgkmSKgUwryLb8MMhB17EqZ4TXT9xd3fLpmf/7hudJhVI4pKrY06LPxOO9cm3GKh6p0 - mOsxKKGQiLfd13Kc9znnoIqJqsWYqgoDICokEo7lEErZ8dACLR0o8LGZCACKO/zmMTb6ZHwAvRQCmY0F - wTXiF0TjXIyOVachFI9qw7FxEpQtUREBQoGFRCnmUVCE3gIqIz74RdpfP0vLK2oEBnWSCk2kIQ42YFwG - pnwqfgBSg5OSkRRMeSSZ/UQkmfV/UhomfjqRAiQJh2EyqcOJaeynsM+9ifgQErOQTJYE6dyLpOIzkIhd - mMQ5UY6VLZiVyxIrv8hKSkS8whlYO9fqm4gGtLaSKsw/5FbWwQsp4tnRas0QW5p6oAYz07aI6MI//qbu - FqvvhhqMYjSgKHX0HKhfgixFiZZRhHM5FsIqaMBYDDOgzhaeWmIZF+dY7C8p9Pk4qdJPTbSkG1ItZzf/ - z08pcaBRcTQMu6NnW+UxJALtJOR7IvkA5+Va0nWpAAC9F14Za5F30DjkikysiTwrPolKR1zngZBj4wFW - pYBSmcBqG/9GAK5yjldsB9AkO6ZbCe9yYEYOhMbSnfw7k7Bd4vb9x/WbBH4O1HzgJinnmgqeU87zK7cR - pj6GfImj4a4cTbh6M1TjTUxQ22da1Qk1+1V+Vf/dVwQAng9gH+UXEPwF+QYZ9YMo9cG8VO3BpfzyAzi5 - 8Ua7+Rc32QP338cS4FMX3xwfEEA2IDyAKNbAAgC89Emw+1QYtJBCllLwkmmIxn3Ff1xAINpwYSkhQSrh - JsELUGxfkYCQOF+XYW/saz2ucmLQhh1RiBJifQ1HiSK4LsXJKD7Lg+ACGpPgNJzQGmxjthG/v5MyYL+k - 0u+JLAEWUwq8GrOdZYOWGJGQjSL7FSB1jELVFqDGQFQ2FkdxHBmIPK+NoqEwAofePdKOonDoaPoGBKyi - rBipyJElRCXgDsRlAQRED+LS0xx4xDOKYhyXJpoxFgAgqWvi+VYJWEwJgIauSUjzb+t4Fttc50BCkQWo - xRoFComcUyQhHfpwJiAwGXpwYTFgCt9iThXlwmpJmmmAFNRIrv181sKkC8sxKOmcD7GmibV1M6ZuM6av - ZD5r/vmYyZzrZLuz2b/dglnM/Yta8AF0tpJr0AKVdp4VnFliaddmWdj9LP0eCcW0z3Z8+3nr4SIsWwDI - MLPSynx+N/ewr2VGJYo2+YI8C+L68UoIujGFXAAqR8HNn8esXrcSOrBm6V58GIBUYw+AxHbj4hY31mkW - X8Y+Y/1ylhcrmmzeCujAklUNLFuoDLyaqsBrWMqsgQ68FsFSmLOWst/rqq2a7VmbfEufWRv9I0uh6Vgd - lVtQfiymyq2Q1iRYTBVI6RbAAhCpOH3WfgHgjTfesH1FDUKUHCQn4H4AwDt21MHo4g9yLQDwlz7lBwBu - AgBuuvEX9ghRgC9/8ykmzvk2kYpAhw46wgKiQqnzhzecmTcpm5LQEHzyKA1eVFFKdWBCgSi/N34LCKZj - DQAARVw3mXx3WQGqLhwBGSiYbsPB6jTcDwhC4n2g0Ecc6iMN+ZQ/XFYByhyagwOPIiXqSjRhCUk8rPsH - PwNnHStg9A4sgC4AYA5LlwKsh2wsh1QAQDkGfpKRSEU+QhFCpmE414XQcCS4iUIhWwgF3kBI8V78CReP - s4B1OAJJPQ6r5DnwDqKzMdvVpRjpa1MuTkEW4OBoxih/NsuB/pLj3/ePCXxHhRWdQC5KgFzkZJJPxClQ - hSGVEssswfyHGVg0G1NazkA4ATXNZNZRMUjFQ5vbyZjDodXSTrYc1YRbkQVtmMGLEEaZuwsWyVog7r0I - 73gbprCu4fx87pmP8jctmY8vAFovCTZa7yf+PBVlxtmKQmdfkg2nfqbzGTRjVrdgQi9s871nfi+5A2sa - 8R/MtalnF1nIAzhTn1AUINUlC8k/UMd9Ldzn1v4LWIcDRAKldrbb5yOMHbRD60S6WhiRDqQNpl57K848 - 1u5OdL1AS+v3NpyQ+ltbCeUtUr0EgG4hwtjWDqhBm17Yzt+Ip1+/dVEr+/qbOdbStcCaJR0LXERgIdGJ - fWd6LQfUAWhfEQDICajSX+edc+7esmc58OO3AKT8N/3iF/ZLv/zihhvthp//3B59+EH7h68+sfOgAgcE - BNlPjzjCgsJpCU4j0Chm5RTM0xxSfqfmMyuVQFQpK6Omvc/c77MGytmuQPErtDTQMsEHEvnEtSdR+ELd - hdTgIxhlD44l3x5wkRXgRM5BLACPK+CSiAQCfiqxlD8sHQDIBUDoVRjYRCuwjRNt2G30Afh0sA0jm2/c - GgpTtLMEIIQYnucDAJdqrKKjyi1wBUiVcuxnFZJTEFZAzsJ0LAvCisopGE424RCciiMvGEs9AQCgld9F - 6DFiKksJAYBakvcDAGcRyDLoJ98CgX1AoQ8A/ErvlF+AIACAWZhC6XGVFsuEFzCpLM/yZ9JOfN50qMHE - 4mEG1s9n1iQq0EzVICm6AMAJywH9w3fH/CKAaG4ne9B/XtepEWlTJ0sEZtxqlH86s2PB6YWWcl2GBT0c - RiOQsRZ8X4RNPm8qa/jpzLTzrHY5Dj1m7WYYiU3dC9x+9cZaAKLKcs8pgDgUZiNpHhJ5V7TlXDLFik+u - wFnJ72UW12wvS6MVJZRSLmANvoBRa3EpqwMnCUothV0kJQesnOj4Qim8FJ9oB7JI12kEADS6+1gOuWNc - J0ef9nXcnfPf456DA3BRi98BSURhf+b+gQDA8wHs3hcA9uwH/SCz+sG8VADwixtu8M38jNq+4Wc/s4e1 - BIAJeO65Z9u40eNt0GGDqQxEbH58pEUF4wSMT7fJGVOtYAoklXzM0gLWV/mYVUg57EDtlxWx/mLNWl6M - eVWIc4qagRUFrPk4XlRYYpPIhktMSWc9z1IgFOUP4/k4GuUIVHvxUKUPS1zrcdbwrP11PJwio/IHhDGb - hxIdCKnEe9+C1/lYXxnwwe8dZaMgAwVgEUxU+LCE51GOLDzDl2vQV3XYSy5yAAAQkFUYSmQhDL5AKP0K - AzZTVwBfwlHPD7FhN6quAI5A/AChRBAiivx5BeQUOBBwLcp9s78nfSAga0BLASm+Zn7PCvADQR8A+JW+ - DwAc1RiBYSgacXoxIFBGGu40ll0QrmbUzbF5aifezDoeenBzGwoJQahvxkehvO0+AFgESHgWgc4DDPOR - xq4WzO8mZ1JXslaeck6uRd0Wa8N+rUjIcIu+Kd4KTqYGJKb03FV1+BDIAUDxm2EkOgDAnyDzeybZdvln - 0j/wvkjKsQ1xkYC0azNcJKBy20wAhsgD1zZ283vxVYjROL9D4gMtt99P+kBM5xEHYORC6J4WQMQBnAd4 - 7OuYex7XedaQs3wQ3e/E/c38dj2H7zGf77GQcKZasnumfn8geO2112xfkQUgAFA5cAHA/gTL4O+ABwAA - 3IjC34ji38jM/wvk59f/zO679y77DU7AM884w0aNxBsecJQFZmAKJsKrT4nmH3MyWWvkA0ynqaWq2E4r - c+Z/Ea2ui7EGSpj9i8t9Y0kZUoJ1UMpai7GUsaik3KZOLbJM6ufFJ6ZQLwCFDgcAAIKwUPLvKSYaGoLS - hnM8wkcbjlC7cbYj2NYxLR9CczDZsQACWgjdnTDBjoK+O+xuZv8dNPvsDGG2JqrANWEouzoROQcitQdE - K3Ytyr12ZK4NOcfoLxCKHyCIkmMBy0Nt5HVjKRI62C0rxp4+kUpCOELnUFugCJ+BiEQofAyRhBjalWn9 - HwvF2JM41vjqouQBwX6XAx4gMO5lCWgZkIvy5wIYbCdRWiy1DBCYBrFqBt+8mvz6ullW1Uxfv/mE4xbi - 4GMJ0KilQCv/sJnV9Q9cgCDRvvuH7/7B+8Qdl2ACaz1eu4TWYayl5aTLvCDHgu4Oh1E5wgIoAppBaK8Q - T/+MjRT1WFHPLM46HquhqUNWAJ54AGEuoUWl3xacVmzxNyU78Bj++kiWAfgBzipy1oPW7g29WA8d/E6/ - ovYpcD/LpU9ZvWP9rRj+Fk+5PQtGf19/pe//TPctvG/gt3i879LE8UadQ/lFBvJm+/5r/ldffdX2FbUI - 83wABwIAjv/4qcAy/W+4/npn9mvmFwj8/LrrSQe+yz6nJNhpJ59qw4YMtSMzB6FkITa+PtB1/w1nLRy/ - INGSO9ItoxNPdU+2pffCfIMZKMkgZJXZTtfbRTADW1m/UuIqq43tNszYVuLZC8h7b4T2WpNFwU0sgArW - 3aUQfiAaBeZB2Mkjdj+Z8l1Tid/nQwxiVIHR4Fxm4EmMk4jpFzK7wwwMogPx+O6JNuoMmnxQxWc4NQDG - bJ1oE5ZhsldRC4BmpGGTAA+WDHImqtCoegwKEKJEO6bIiURNTaIoLhrKMiAIdmEQnYbVUUgZgYNeHGqj - KRUWvDjENSiNpq6A2pHFJ6HgriiJtnEGimYc76MZx8ehxAk4/vD6y/uvKEFiMtuJbCex7T/uHIM4CV3U - QNEBjYoO5BAdmCQAIAxIT4LkMiyBWXzLKrgA8wgD1k6zWU3VNnc+voD59AVsIddelgApw57MX4hiIC0L - UX6WCH1CqfH5Eo5JCRq6SOhZUmez18EBOK7C0gjdBd1HVIXEHjnytK4vIuw3GyWvWcYMLiceStwkv0Mn - AAB4KFw3Y+scK8JSyLw024IeApQpDpJwY7KLAsjTXwX3oHYxFksnlX8AEN9yxK+8zhLwlig6tmfGd7O1 - H9ScsvsBzTeb+/YdsHnbHnD4LYb+QOgBgo5J+ev1zXhvN52W9wcAr7zyiu0rAgBlB8pJvvvscxCsAE/2 - WASJB2ON/yDX/uLGG//ys2uvZdYHBPwAcN0110IEusu++uIzO/PU0230UIg1UUNtYhm180pg7VHfL4p1 - chItsdNbUPRF/KPslIKTwNIGELRlOeXP7IYG2wsgdDF7dcIcBCQyuql405tjGRQPTVuK1xuSSxTkmdBm - 0nApFDqhDkZffZCNb4B4g2IHNlBcopbCokhAjdqOIxQXndAUbAELqUHfxT3LJ9rYzeNt6MWYq0+KuEMa - 8NljbOwOeABLKUC6AEChNbmKiyoiIFAIqcLvoJHuwsGzAJGZ2iYSMQ8gkvlPabGAVRGEEmkjTkbhEEhB - w+/CsjghwAIX4a+gEGkEnYuj6GIcxXJAPQmiJY5iDDhMUpYhkgtATKJwqLz9rOmdYzALhVdEQMdQfAcA - 7LtIAKFAFRpxoUHChC6CIF+AmpJQZzG+jm/WDB+gOdfyG/AF1NMpuJHmlg0U1aBgSFMLRJsWTNpm1reN - rHmRBU2srefj9FqAydzCts5RZLS1ibF5kTW3oARtzOC9DU7By+ADpF+SZaF4/wMfD7XkazDhiftXosA1 - K5jBCSk2aykBqCxcwNqdUZbAPEKLc7i/FM7BZJYQqiI0Eesh4YZkm3x2vgvpVQMAdV1YKx1EMAAPNzP7 - gUnK3ET5c1kwTa0AixSabWfJIE0scRrayITUu72Z3H/OZ83sAYA+66efqe9ARGDjtwgc8GEx1WE9yRHY - RVXg/a33X375ZdtXVA5M9QHOg/fvA4C95Bv/fsYPotQH81IcgP9x3dVX288FAtdd54Dg2muuoSTYPfYP - JAOddfqZFjB+gg0dSl58MDNyaASmc4wlEMfPpDKOuAAFMPzECCzCGVhcUoZTsMTtF1bQ5qqy2ArKiy2v - spBa90VWgOTPZJxdYvnVBTaFMuLp02gsSUEOOeqCmekDp6DkSNBUlJbko6ACpBhLQEVFKznPrD9xOjRi - 6MQT5iM9wTZ2E4VAL6SIBwAw/DYiAOeOtfEcm9BDRWKWB8HQiYPruV9FRV11YZ6pCsSNXjVi9lWVeAEC - ZXjiMsJYpBWLWeiSi3AEqo34CKIBYzdQYJTzgd08cxGOUVGL5+OwbIEmDMU4jG01IVF/AlGOwxuxPMgy - DGthuaLrqE0YTlXiiHqckLAQI+bif6AYSUQN+0gU9QZVe0Bly9XyPJL+hJEL1HocK2YDy5ltpDZvTbSU - tbAxF+dbUQ+JQt3E5LspHNrLkqCbJUEHzTaZoeuZaWvbifN3st+Js7AdKwElauSctuU3aED5a3thAa6q - tWmUyCrYVWrJV6TT/RcfyhMTLeE6TPjTCgibTbd5K3k21oIUtHkB3nOApRXAkdKKZzBvZY0jI005Ewox - JCAtH+JuTLLJZwIAxODn8g4pv8BjAeCj+xc14YhrxDsPICmk2droGxc2cB6gWjCfEeDS2NLMcb1zITRe - 3itQa+H4ggU+0THftt/C4T3uXQs5B2fCAYMsJECnGcuoaQF/fzMFVeUXgRq8LwBo7X8gABAPQHkA534b - AP7iB4CCg9HFH+RaOAD/eQ3df673A4CsgeuuuoaSYPeQDPSZnX3GWRYYRPecYSMtgMYgE0PCWIvHQOSh - KhDlr6ZSvqoojygAjsDSfNb5jEX5JK9IOF46lTU/UpKHH6BA1xAtcNfiJESKp+ILyMQXkDrFtR2PVEvx - QBQqECUKkrDep7FIGGnDYgqKIRgGCUjhweB0nH9FVPaldPi4xZTxOpc8ALj7w38mhx196ltJXKrkWUQK - 1H8gAsZgpEKBMAIlETqm/gNQjiMmEwIU1RhOQVgFvoW5WCTtcAG2Elokv0B8gKF3Aixn0kWYZUAIYCFa - cTg1CCKxhiKIDIRXo9TQiyMpPBou5a3hmBNFFfhbsHKUdxBGazInJBeFU3/AJ7x3IWMr1/opxqE9WCcr - AKb1/I3HEFY7LcTG0KxkxB1jbdzPJlrY7ghLODHJ0ndiERyDc/BoKggdA/BuhZy1he+9FT/MVnwzW/jm - m+k3uJFvvhFyzGZki0acshuJhW/EMXs0HI3jcMyemm+pF+VYGMo7gvX/iBdGWdQvYi3rPGr77aIAzDGQ - bdZT/m31LNe+fM5yWnMvm2uzVhB3XwvLb8t095xMGIHB97KEoIZA+G3Rln5RFk7EIpsGeahqNdEArA2B - kgCqsR0TXLNxG+DUijK6JQz+BZSzGQWfLyV2Vo0PBBwQCHTm4/AUIAASbQ40OO4Hg4UCh/kCGQCmAYAB - ZAQwLU08rxlw4FmtHFsAyDTXL8QSIqWanIT9Ofxeeukl21dkAQgAVApMAHAAmQkQ/Lgbg+D9/++rrrjC - BAKa/a9n9r/2yqsgAt1rX339Gzv11JMtYALVdcaMskCYgIGRzHiE7UShTSPVVU1BC2UBlGMBUPxDs78s - AieE+3S8ELZgIeeKGGUlKGxYgBThLCzmeH5hEVlvU2m5nemYeooCBEcye0aiMOQehDHKCSggCAcgHAgQ - BQjJ4roylIO+AmPXQQH+5Sg7Utx9ioGMX8r6nxle8f8wtSBTYVGlFcMCdHRi0YrpchRNLYLYcEz1mGSi - EXAB5BcgIhBBk5FQlgQTSSKSH2AYvIJhtwAsOBcVIYgogxA1BUahvP7Qi12bckAxLoVGoqly/iGOJCRi - EOepoxibxnkdw/uv4qRxZCLGqigpS4T4HI6z1o+fiiOxmOOlJBipanEtoclWah2upCDHWcEuQenIN6lz - cOcECzszypK2EY3ZSPnw1URjVqLkq1DqVRTFXA3LbY0E8ss6yC/riM6sAwDWo/gCAaR8g0+Kj4bGuxMW - 3ym5lrabvg7X0QAUxT3i48E24kUA4OcxgAJh3zNJ/z4ekNlBkZJt/D9Fio7h/yP352/HojuuyKaeSD3D - M6ZY4pVUB34YUH6Ooqz3hVjsz+It7RJ+6xk4ME+go/A2JgFAp0zABBOvAjASaOl3OVDaIIGht56Cn2sp - NrOaen5rqPMnoUT6jJUcW0EdCoBnzooaq14OpXgp2wDS3GVQiJfAbFxc46yh2i7ABpFV1Ajg1HXIKsIi - AnjqFrG9kOMsYVQirL+zT2Cg/RdffPFboi7BWgI4ADgLAOgvewChBmA44geZ2f/al95w3XX/c8Ull9jV - gIBmf1kC1151ta8xyG8+thNOOMFGDIdZBwCE0PI7SAAAFyBOlYFz4HhD6imgPXhBmU/h86kDqNGJjmH+ - 51dg9lPZxrtO9OE8zuVXABA0FdVSYbLjBZAyTHXfMJh/wXAAQhCVEQuViC6s+gFeSbEswn+F/J5q/BKQ - fUafOs6OfJ4uv3SlGX4hM2R3CA1E8NgXcx/XhsMalPPPkYAECJCZVH1IPQjVizDS35dQ51VyPDwPfgJ+ - AgcAZBQO/dUofAujbezxWBYsE8JmMtNThixa1YVQ7hgAIFZVioloxCb72ICxqSg5eQ9xOAflGHTCfjz1 - B+IAiXhCoAqDJiax9k9AcA4mJPv9AgBI7GTYkpXkO7CECKGfwfjdQTb4FTUyHWzDH6Fr0TmRlrIx2wp6 - aNLRApWVkGB9Pc412IGa6Rb4xZv1mpqZUZtZS88nWsDs2oTTsKG10eb11NrM5Tj/Nky3fBQ85Yo0ynr7 - WnyF3BNhGedPsvyTKAGPws7QzM+1s5fB2V+OaPZHpKCyJEqwEPJOKLL0C+VEDCOBaKJF3BFpidclWcYF - WZZ7EnkMUn4skHIskXIUvnQTFqKsFSwVgUAxzDxtF2/FsgRcJAKZomM4hoVTBPA4S4f9Qkqlq1x6AQCU - t4PjOwBC9nW8YCv/vo5me4dvvwhrSKw/AU8x7yvRezZhsW4oczTkcqoS78/j/10AICfguWedvY/0AUIt - wDDor9XFH+Q61v5/uZTe5lfQAER+APkDrr36Grv79jvtk4/et10n7LJBg48EAEZC2InBAgiHrx/BrJdk - adBUcwGAPAAgX4LyewDQf1/H8krwAeg8voECAEBkoHwHEPyPJHQoIFGl4WSYcUrUCWMmDoUYJJKQxwoU - AIgcFJYikx6AKIKySz2Bcb2BNvKcsXbky0OdE3DUMTAACQEGVfNboQCHcq04AxFpPg6AqzsoMBAhqL+I - F0Brsgj6DHihQAHAaABAPQKGPA8l+MIJFtBD9AE/QlhZjEXlqU8BhCB1KE73tShz2xKxBPflB8AU7KMQ - O2tAsz9gIG8/loCUPg6rIJaqQ5EqVU4x0sCVmP+0Mh/1y/F2JJ2ODvv94XbEO4Nt9G0BFnlagmWvzbXi - LjL0WkQMYo3ehEmNssvUlcI3NwEI9QBCPeYzMh+Tt6UBM7gRpxhmdP0iUnmZKWeumWXFO8ss/bIsC3yU - lOhnx1vSNamWj0+gYgvxf2bUhoX4DXiuAxhMbpnQ8xu1luY5rO3nLq63mWvnWP6JxRZ1c7yNfTrAgUjK - VVnkEBRb5QZozDynTj4KTH75H+rbmZUROeS0BNC5mi6Sf7pJ+mGs6aQasPaRql6Sg7i/aglLjyVQgJdS - 1hwwEijNXDnHWT3lAFGZrBuSpSqxfip4Z9laljlrsYDWcc5ZQCg8gFeyjpD0Oh8AlG6v6PP2e0Ag7/8L - L7zwLdnbAtgXAPr25wEOh/8giv3XvlRKfzEopso/P5P5z1Lg6suvsLvuvMM+/fhDO2nXLjty0CAbPgoA - gIATGIUHPIaCICipOgFPoS5gXjHK7YEA/QDyyA/wKfseUNAxn4DUUn4/AOQJHMoxHQEIsQNTKSAaj/JI - QcPFBHSWABaAqMECAOUMKH1YOQCE9wKoJTBWAHD2OBv87FAb+guaeayAAdjBEkCFRfK4R70HpfRqR+4V - HT1Q9WEBAJRgLR2UZjwRR5+6Cg2HXzD4vSFkGZIXvxKnYi0+gEr4AFMBABiETvklHhC47X1own6i0LeY - gkQF4gUEAgCiBrF0Xoou4xvQxTgEP8DEY2hWcpnamJOWjVl+2FdH2E8/O9KGP4EVcCHKtTXTpi5nhm6f - YbNbKSG+iFBbKyYvpcP6Sx2zvRNM3voWKVyT1aB4VYth/2FSa6bNPY3KTVenW+DDhFYfm+jCgYXHAgCb - YB72orjc3zAfTzzAMr8JgAFEBDaNAEMdZnU1SjsTM73gOLgA1yfbKNiAw14ZY7E3JTpH4rQNWCrqbQDo - zG8BSFiLtwAirQDTQtbqrQ04/XAAtrBen8+6XoVP5tczCsDcMQqWOiDjmgZE4AMgyaKpX0RJcRye87rI - FQDQavgtzs8A0LjvIIunGXDkd8/HR9BIxKSW6krzWuA14AwVQcpz+PUP+z3//PO2r6gk+J4lwAEBYCYA - 8OOuCXj9VVd9cxEFDS6hscE1LAOuu/JKu5IlwT133WVfUhHolJNPtCGDaLA5dIyFBOOUCuAfPkSdWLLp - 0lOJAkwhO4wstWIcfkVTkVxMr6nM7Pl4/qkanE/LcLH+Cqhxn1/EMoBS4vlkBGos4HghzkLtF1L1Rk0x - c+iVl0J4LAaTXGy/0Bi1GUei/csAZQ8KDDJwABbQBZjiIWO7cdSdoU7A/M6ryNxbGWATFwZD6cXrD29A - 9QUiZAH4Z35fw9F9rAB/34EINSTFKRiWh5NxFj6ANirbbKbM+OX0C3yOVuP34QfYRrMQogeiDKsacVQ2 - IIDfINpT/r4RABAIII4cJADwy15WACxBlz8AAMTJB1BEWjIlzMI1+9OVaOw5RDgoUz6IOnuDXxsOJ2GY - Hf4+5KRXh9v464MtZhfm9brJVthbZtMBgHkLYOr5lbx+PmvcFurrO54ASsC+pK4FxQAA5rbXW3XPPKtc - RQbgdqo4n5mL1z/ZJjweaOMen2DpFwMAmNfyFczuqbHaRSjWAhSL0JlPqTSSqNNGkk5Xrc1eXG2V62kV - vyvfkq5KcVbEoHeHWtADITgSs61kO12CAIhqQKdG0Qnub0Qpm/DEN+L4awAY6hegqCxTGuaj2IQotS26 - cyN050YslgZAp7GJYyi06iPW8ndUd9YDUGQzYg1Md5YAPoN1pBwvg7fAe/RbBVyNjSx9ZPlgwTRjBTXW - 85w6HI84E9vJHzgYAFCRUPkAzjnz7G+Jf1lQ+tdOxD/Ydcz4/33BOec4K0DLgOsAgcsuvggi0D32269+ - YyfsPM5GjwHFA0ZRFhxCDj6AkGiagyb5LIBJ+VQDIiGoAEeeFL8wH8XOQ8FR+LxCAIBcgaJCjrNfyFhQ - wHW6VqDAtYUAhqRgKtuAiNqN5dB2LDkBh2AUSwGcfyHBvoiAgCc8TO3GcezJEpiCgs4hAtCGeXwqlF3I - OiOuGGVjlxKmoyFpCD0InfLLsUfdwQjqC0bi/BMbMArmn+tCBAEoUh2G6TSk0QFDOsoHdTiE/oUTcSRO - WAkAnBTo8gscy/CkAAtaiH8BJ2FkEc9SazLoxNHUJoyBSejEAwH/MmCvhCE5Dr2kIeUMMPu7PgUqT87s - rwYkCgOGdkXTvjzEtSw/EuU/6vVhdCwebSOpdTCIaMfhHxxlwx4fbaHnR1rSVtKzl1OsY9F0m70AXsBC - lJTZrbbZp/watb9HOAZIVGMtzO6psgqchQU7S8n1z8FrH2UjXqUGwlMTWLdnO4ddBeazAKCmFaeanoXi - 1nlAApjUtmKit9XanB78ASwlCogE6N6w26Ncl6CAR6kneGm6FTsAmA1QkM3XxrMW+oCpVsrM7xGw1EoW - sI3S9hcPcHRNDbN9NaBT3cGSoKvGpuOPKFtLAVrW9lPwM2SeMwVnJCnIW8lBWD4biwDHYDtLCe6pWSRA - wCrgnfOa+N2N9S4K0UY7Mc/b7wHBc889Z/sTWQCqGKQw4DlnnrUfcaCQ/YMp9l/7YgDgf847+2y7ACvg - YqqbXHnZZQDAJfYAFYF++9sv7KQtuwj/TbBB6UNs3NyJNm5eoE2oplkmTTuj5yVYYmOqpVDqK20BaatI - BsSg9GaIQJQKy6pH6qgP2ABZiGPZjRST0LEauuDOo37gXJiB1fyPmpPrZHIV5cNm0hSjlC46BZkWQxHP - sGwcgpj8gQnM5omE9JJYz+PQC8nCAagIQCOm6hI6+p5BM9Dn4QBcNdrGLGMJQNdhAUC4zH/lDqD84Wo/ - RiTAAQERAFeFmArE0RHM4FQdFuCIHhytiAHAEEamYfAMKMH4E+T8UxRgKCSjsZCBgprCYAQCACwBosgh - kCNRVpFYgaox4JyB+ElUgEQ04ViiA3EpKDsOQjEInZNQEQL5AUQXZnTEIYqORs/kdzTH4/mPtHG0LR9K - f4MjXx/huhWNIS157CUU3LwZp+crgAJ+j4Brgyxxe7LlLMu1onbougtpddWCsmLaumxBgYBEigoYOGBg - nIfyVS1CeXpnsyaWA7DQUi9JIwIwwY78aLCNR2kzdk/GAVdu09ZCOEK556Lodcz4dSiozGdnXUiBAZy5 - rVQa6p6Ho5BiottI+z4da+KqNHwAELewKBKvSsJJV2rT8OLPBEykwHpOnZRfgCKFd6DybZGyeuJmfZR4 - LvdXdQBgcB8U6VDBk5zT8xxvIfQuHNWMuSfks3zBP7KKCAGWjgMdLYMc6FDJqBkAIavSsQG7F30r5v/s - s8/a/kTVgFQp6MAA4EAh/q/Vwx/suutYAuwGAM5HLsIKUC/Ay6h1fj9LgN/+7ks7edsu+gIQB08eZuMq - AYBpUIFnMrvOgQ1Im+24VtpldaRZShcFMmH7pXbgzWY/mYKhyT200VqCV3sZ//hXJlnCSqrvrCRMthx2 - 2/JkS1xKhd1eWmz30Gyjm+u7obt2wXprZ01MF92oFtbAFPNUodDxM2H+zYb0UwUjkDqCATAEx3dCAFof - YKOPG2fDrmSWpBvwkJuJ1VMTYNwy6hdCEgqaA7W4AvG6EpdiFQgYCgETLIiwXKwK/AQRyhZEwnORKVgY - LAFCSllm0IJcRKMxJ9FrkEjAEGbgMadOpPw4AENr8rBScQiUTETV4URCigIAJB5qsHoWxggMaKYaD8dB - FYjjkQTRhaEIx8XC7Iv1HVOIUBZADOa/qgSFwwnQ2n/kz8VtIApzD8xG6hSOOwWWJKAw4Xy6F/2KoqWP - jbCJ10G22QYALM21wvZSm9GCH4AuQrUNKFIDsx1jAyxBSV09a3giBXWNzKKAQFUrALCYUl6E3KacMNXi - rkqkByDEp18Pt8ib42wyPoHizSwtVsyy6nbCagIRp7QoEAVJahvZJhmpFqWcy/JgLjOyogK6Z9JJU92s - H3gPfprHJljsNfE2ZSf9JLEAZqK01ShvzSIAimdqSeKe6cBJwLJH+qwNgQNSg39DUo0yV3VSg2D5HCtl - ps+Fw5DIsmMMLcyHkMAUdme4ZZ4xiSgAS5j1LAkWUzOAdyp92ntHDcBY3SQAEDtx4V8NALIAVCJc9QD3 - bwE4APjxMwGvxeQ/76yzHABoGXChHIJEBe694w66n35qxx13rI0YQT48IBAYDEMuiBJbkZQGd0VB0i2T - 1l9TiikAShurqUUUBGV7cgVtrWb4ZvWseVTBbaSP3iKAoRPl7iXs1UOhi7Y0S2uGJtwEJbiBsQELoolk - l2bow1gLyQ1cB9U4uooYOM68AEBn4kwfAEych8ynDfhSyk6h7MN3j7WjaAQ66K0hNvTmUTYaEtD4NVSx - 6QI0uG5CE6ChwqJQiAMpNqqCo5rBJyKBHA9iPS/6bzDknkBEGYQTFyAk/oxfHmKjjoZ8cx5Kcd8Iio1C - jrmSMOMuIg0bg23CYhyCFCcNhVkYWsUyBcdhGHkEETMAhmmECmmRHlmCxVHK8oLehGpQGl3GDF+iZqZY - H9QViMrHGuGacBqThGNVqTmJCEBjd9NggySkI98mtInzcTw9CyfQpSjgeP6eM1j2XD8W64C+BTcFWcxx - 9GtcPtnyO4qtooXqwUQDalH0+loUnjVuYz3r31rW17U6hiIBBHWYv5q1ZyyeYyXE47NPnmJR18fZ6Keo - ffBQkKWfn+1CbhVraE3WRYRhYR3rb9bmrJsb61hL1+IArCG0yH4DkQcpUw0WQVUHbEDumXocFsWF9Aq8 - F7B+dKLFXZNkuRyrJJRY3Y0iAhi1+BNU2ai+kRkeP0B9EyAFONU2a/kiMJDSN7uxBmBwwlJhLhbHbJYc - swCSMnwOelfmWZQvvz3SDvv8CDvkH39CKHOcJcBHmHIy5cgINU5bge+hE8vDs4xkBWEhzW2SVSCW5II+ - APCWAs8884ztT2QBuFwAlgAiy52zPznzrAJA4MdNBLoak383AHAefgBZABdqKUCVk1tv/qWLAuzadYId - eeRgGzVqnAUFoyBBVAWCqBODKZ2akGWTKG2dn83afjLr+BwcfZPYzi10acJ5OAdzaW+VVUVN/PZMS1hB - R53FqZbammGZAENO5VTCfyp1BYDkAx74C1T2Ki+P+yYX2CTKZafCh49NYkYkBBkiB2AiYcF0ePvQgwNq - mZmX4iAjAjAIB93gt4e4vP1xOAUDUfqQ6bqO66ci9DIQb0ASWuQflSZMMZFQLIJQ1vuhKj0+k/dg9rsc - AUJ9EzD/x2yeaCPPZyYmKejIV+gW9CuqDcE6HIdfYNxm/A1LoAVTSjyQtmTyDQRToDSEZCm1KQumU1EQ - rccDcSYGkV+gegIhi3hXG0uYTo4hIW1cy/1qYhqwlpDfdv6us/i78DkMeusoO/JVAOAmyE2UJZtwEoB2 - apCNvQByEue1DBj21GgLvjzM4o6FnLWB/yerplrhUoqGLJ5uM3rpKNTDjNuF2Y3M6JSw3ynqMCGz5TOs - iFj4pJPzLBHzP4hZc9RzRBfuDbXMM7Msb2uBlaytdFZCVQcONWZeKWaNZn4pLtsNjLICnPKz9JjVXu18 - CnkQg1IupKbA3XA1Hg6kxmCy5cEzmLaKZqGs2+tQ/gaUXcAkQJFDrqkOB18tgEK1owbApaGGfaQBAFOu - Q129DyRqsBaqsABm4PTTOn/SqaSWX4HTEeryYV8cbof88yE26MPBFkwIMvNs6hFsLrXKlXAYOqTw/A2A - nwBL6/+5gGWDAACK9L6Mv+8CAI8JePYZZwICnpzlAMEPCuUAw48bAK669NJvBABuCYDyyxdwIah2M/UB - Pgbhdu0EAA47wkaO4x8ZVXsCo3EC4oWPxuRVyaosyntNLlILq0LLpfnHVCk0Mf3JbOewns9sILbPciDy - BDruXIly7A63uE1YD1gDafgGsqdPcfc55Qc48icTOgQ88nNpOT0pz7JwCCZSeyAqDIcg3YRCwwn/UUFI - LMCgWXAAOlj/n0kW4Eush2njpSpAEygOElwRYeGECsNpRx7JGj8yEqH5SAQ04nAJtOJIfAFRak3OGIFD - UJmB0QnMziIHwQ8In8S7SBIKhBI8biepxneMtCNwvA16mvdcNo7ZGCujl3yAWoCEKkHhxTzHzfbM/iQJ - hZeyrGDWD6cnYbi8+tM4Pot9qhJHzOYc9QXdthx+UIEDe7F0NmLl0Mxk1GVENZ7hb6IY5wicgKPPwvQ/ - ActnB3Is1s9p/N03Evp8Yyj/0Kl/cP8YCz2Xb3scOQLbsyxr61Sbupn/F1uQTQWWt5FvuxEG33qiMOsB - 2U2FNvlouBfHT7GUM7Mt/tJkC7kt0kYQthuM137iQ4GWdAGAcnK2TdoJ2WsLTtyNEG+oRly6CvIOrMPS - lcTaVxJbX05sfTkjLMSSNRVWsIGIzrEFlnFmjsVdmWiB9/H/6fEAi74hzrLOpqv0dsg6itEvBZwApFkd - rM/bqFyMP0JOSTcuZLnB+nyerApARjN1DVmPc+fDAViIs1HKv7iKpUulW+cnX5pK0ZJQli4j7acfHWWH - fn64/QRLYOxTAZZ2PpEMSEAVK/BjtOEbaeSZJE/V1OHLmEs0pIrmpQ2ADdbNvqSfp59+2vYnsgAcADgL - oD8A7LVdxrkfdxgQAPh3LQHkCLzw3HOdCAx+QWbgJ1AdTzjuRBt21BAbPn4ktQCgAidgMidTFowwXAL0 - 1Uw63E4qYyafVoDpz0jZqkmltLmupNlFDQUuOzItdl2iBV0UQXHN0S6WPfEyUmpJaInDB5DSiMNwFg7B - cpx/JYAJXAAlGOWynJhCb7zsfKwACmNGYwVE4ACUBRCUjiWSj2OQ7MBxePxHnIt5Lg4ATrox6+gD0AwJ - qBywIX04Ah6BvP5ScEk42+HRSKyvwKiKkXjnYuT8AxyiAAHVK3R1BCqwBFgSjINqPOQ6AAAr4wj+gQ27 - f6SNPYVko6XM4o2+RiURMuWnci804ijalbvoAH0LoyZh9pM+HD1JJj++DeoIRJExqDF6Mtv0K1Tj0vAG - nI40IJEFMOJGSpu9ibXxwnAbdz7sw3VYDx0ADV2LwhdhpbBECDgl1EbcO9otEUbdPc6iTqQC79oMm7QM - C6CH2H0HNOAOqLTtcPTboAV30SKbWb9sMUSY5RBg1qKo5A9knUIF4IuSLfguHI7vEGp8e4SF3hxtaWcA - JCcB0NuI8mwstqkbsNLWEsFZRwSH/fwNyHodB/wBmKmbWQZuA1h25lvmaTmWeGGKRfycNmsP40B9caQF - 3RVq8ZenWCrPzQB4Ju9g4tgCGAFMek7RGgEMYWG2NRZD0BGglKyCsbcaFuBqIkZr9G6iRZtLLHdHvmWf - Svfpy5JgHQbBXBzqIiODX8dyepMoyYdYhDg0Y65O5PdM5u8gl2EFS4FuCtd0YAG1UjqdegqzG+cBPIQR - F9T2EX48IPguAFBJMLcEIGHuACCQ94M59/7aFwMAf5Ty9weAc888034GI/D999+24489wcZh/g8LGmUT - UsnSSwUA0jS74mXlH3E6aao5FXjwKVKRM411P9vZlXj+59ANqImGF6z5o5nxAy8NsaN+PdQO+/oIG/bE - aAu4KNgit8RawqJUS6smdbiSNOFSogV0x51Ee2yRglQ7MAeASacTsUp3R6kCcDIzfyaputQCmECob+xK - TGWtzyncOfwSMvVWkKzTGAwAoLgAQGgqa3KvsKiKi/oLirq6AI4M5B/FDFRTUhUMFTtQoUAVG8FpqKYl - E5aFwDZkqfEIMfgvB9sgzPIRl+CV34Fjbh0mLkVEgxt551xMfPgDoSwhwvEJqHhIKGnHYXOwRlSchGpD - EdQ/kCUQNotIA2MoKchhJAmFahmxnlJalxA7h/I76EPecTu8A7oUhSwFyMgejCJCEDWP++hhELKWENul - UHYB1TE3T7DI42MtdWWm5bUX2vRGSnfVYLIzu9XPxlRH6uYwziVjr46ZFc+3IgXKIJR5rNk64qZoZ/6L - AJSymxTgzcz2q+k9AGjMXgTtdz7K0gADr2mezWlFFs61mQtg4KFIEi0tpi2hQjC5CPlHF1sGIBCLco6/ - LxCQGmITHiQScGmaZZ0IqGwli3QDOQFYEyXLJCj6CgBASo4Ury73gQCKX8R2wVqBDUCDNTNpG8vKXdSS - AEgSsFJCbw2zo+gD+ZNPD7dhr46yMY8yKTyLX+gtErhwaAbcHmLRV8Rb8tlYrLsm25RtAA8WUO5GJpmN - +KwAtnxyGsrJR/BYf/0B4KmnnrJ9RdWAZAX0AYBA4Nsy5a/Vwx/sOvIA/m03Cu9Cgcz+knNOP92ugg34 - 5puv2c6tOyyQmoBDw0bahBwAYDIAMJkYeH40ufAUB61IsYxZhPbmEtqr8il+RhWhwDpm/0XZFov3P/x4 - ElluVMfYoXboH35qh1Ozb/Rd4y3sZIqK0PgiVWFCuuNklmVbFmWvsmVFFAMALC1ysADSp+BEJIEmOotl - QCr/8LNx1BXB0Kul9PTq8WTrUbfvUToB7cZTvhQLAN9AkBqG5KCIAIZXS7BP+T0Q8I8+INgjLl9AlGFI - QWpEEowyB3RBCMLkH3bbaDvic2YZTO+hV462USdReRgQCFiPY44KQhOJDgS04xNox8HYSRSC/cAu37aO - BeMLCMEnoDV/sN8HELwYxV8FiNCLYPwuXyXiIz4+yoY8AefgTKIu63Ey0nQkWqnCM3wpwmHz8SMACmN3 - 08LsyVE2/IHRFnRBmMVsT7Ks5blW2oYPoGmmzaqvsuo6YuB1mM81KP48wmf1Cn1R/GMhBKBeSDtHF1r6 - OdkWcWOcjXuILMPbwizzlBwrdmt/1s0tdCWuZ80uAJnNOnwWTrpqfACYzzVzWE9XsV2lNft8q8WsntWi - 58IFgIufcUaOhdwaTn+FoTbmyfGWekG6FRAhmLYM8x/Tf3YzQCQwquW38buqGjH/69nHMz+nGZDhWVXN - UH61Db9hRhvxfu4t3ETm4k5IY2dmWtBtoW7GH/baKAvG3xD+Cxiid2NFvYjFyb+5cY8FWMwViZZ2eqbl - cE/eZlkxWBHrYKauwVdFj4UiwK6CJise488DAvkAPCugPwgIAJQRKCLQWaef4WQ/APDjjwJccfHF/7mb - sl9aBogQdD4iALjykkvttVdftuO37rQJ1AOQBBTwj7yIf+Cl1MaDZReOtzuOVlgpdRmWISVuwIsvj34j - 4TwcfQm9KO2GBAvaTWHJxwnT8Y/gsE8G2WG/ORJW3QgLOj+U0CBVhRZkWjqgkV0+iZbYLAeKploOIpqx - ug9lTlUjTRKFCJOFU9o7JAeFKcZDT+GQUWsJz10yCu88HADqAYgWHDCXJQAcgZBJKAnly8QbkBXgFRb1 - yoy7URaAyD8eAHhsQfIGHCsQUz6UmoNqRTZhAzUCf4XJ/fVgO/KLIZQfowEJzsGxJxJ2hCcw5thACpPg - GFwXSBSCwiZEIiasY+3OfeOoL6iogUqLT4RKHLCWKMQ61vsb8JBvRSD8jN2F8+8iai88MdyOwqk5+mKK - j6D8IV38RrUhw4cQRRQhguYl4TRCDeukf8HpIcx2/P3MgONunmiRJ2EFrCdHo4fGHQsxd1sg3VAwZE49 - IbA6lKiBsl3M5DMWzGGJMNuKVhKu2wnx6rx0C78p1sY9QgPY28Ix/Se5JUJlL63fYRfOxlSu0jNQzrlY - ENW1jIjGqlrW6zpG6FHNS2fNxwnYNdOK8BnksISIvp7WYijjiOdGuzBj3jFEAliPz+z4/9o7CzCtyu3t - f9/f4xFQGqa7ixlm6KFhhu5OMVHsRqW7Q0JAwFZMlBSRVEQEBLu7W491LHi+3/3s/QybceBgnL+e871c - 17p2vjGbd93PinutRTkxPn13ZSx6YKl0wzeXAC49AKoenOtJFqN7D1KF3YkBAC5dBtKzACujBd+tcASl - y/MLTNgWiqRoPRZBDCD95iyTuRyX6rZME7aVRYe+hNWeCLMZiPoTcI0uIxZwDtWSuEViTXYA3DpixfQk - 9qA+B6UBQCQg8QCCILBjxw7bD1B9ARUDcABQxvav3xMQC+CgBQBZAD4AzCOoITrw3j27zNjLR5uqleiw - g4T35IfcHelJv72BmKWsZkn8CNMZZaXcfQ6SdSp5/dPIe59LDvwyfqyjU03NW6I8CuszDNlgVSsPo608 - Ja01744wySNTTdbptWxrsLpFkIIaY/7Xa2Lq12lsGhYQCyhQNoCYQh2CVbTKUumtmntGNU80NftSA3Ap - 0flFNOvYiAWwsJoJ53tFF6M01vz324ozVCQefz8+hW0qypSJYmuoiFqLS7AEdM5aCHINRAtWk1DcgERa - icXLnYD7Hw63oPItUHJZnY//ppy3SpMZqEgZcqU7qplKK8jL31LdVLmhpql0fU1TeXlNzHlkSQ3bSKQq - swqrzYsw1WfTwYjRYzXmhbPPudlwGThXdSl8CywZ1RxUWg8TjwnFMWfyjKkG1MqfQh/ClOb8uGEKJjKp - OJ4JRlHj4kylTYASr6nyUHUTP5MeAVfkmjpnFZrmAED7AdTfo/RSTAFAJ5S4fT8EslDrM4jUsxIWTCYG - sLCWib0/0VTFdI5ZywyAyfUpL2ZVJG7QfrBn/nfgdfKXu/QhEIdFILHvq2NW7k5c79gXdwDQaY2f3Yxg - YF1M9cwlOSgnz253dayMVFN/IoQl/HtZHx1OpqRXrgWFTJ0H8NpBXU0HPq8DXAYVN3Vh5dcsRH1+e7IL - rVHexle2MPXGExuam29iVieaE14CMGEuJmHB5GBh5C5gAVpU28Tfk2wqPQGL9UkCpAQ4cxfWNvXH08j2 - ClyP82hkeyaNaomRFBMf6XImn0Vqsizev845IHAWgQBAbcGsBTADC0DiWwJsD/j74X+aaX+sH6xS4Gsc - AMgFAARkDSxfvMg8/tgOM+HS8aZKeVhoSOWFNUyVGfyQp9Qw1WYgc0iFzcFEnY1FMBUfeBrm7RSUBdM+ - diZKeA2rHL5/xYeo1MP/P/FhSDr4qpUYuf13kLnCvkomfGm0SaLLTeYZpAd7ExBsiyuBFVCHEdn1kLqN - iClQH1CXwRi169alTx5Vco0yTDSdgWoMIT03glz4jQAAxTpV6QIU2RulYUqQfP8EugknQhtOZOxYgkaP - xWpL9D8W5Y5DuTmXFI+yI4mJ3vgxjSFLSvR7B0APVgWhSEHxFP5EYwXUpPNwxZUEmaAdl4OFJ5LOiY/g - a6K4J22pRFdi9rdDGNpOGzVIOhUkcAdOpJuQcvYVN0En3ljVsvtO0r1UGVZk7kAlmo1U3EaaEQbeCQSy - qt1e00ReAtlIo807Yf4z1Ti1MUFD2JEp4hBgBcQPpDhreCKNSwkYqk6Bz41cHGtSr8oy+ec2NE2HFJk2 - A3AD+lIth+J3EgDgw6uPYLvBnW0wsBGBO5nRsXcn2lW64lNVTMI9Sda8bnE+UX4FDgUAVvGxAALKbwGA - 97RgoPMCmj5MFurXicIkmHn47vUJ9NW6hlQgbkXVnQAAcYZ6UxqYpgT6ivj89qcIYLqYtkM6E5ijB8BQ - +hYMI6twBl2mtUqf0tm0G8L0Ie5ryf2NCT7WndDI5MyjYxHKX+4lfP+3y+O6EF9YlGvycV3ysV7yZ3iZ - jfCHcNv2EReAiJQIxyFnLv0qATe9R32yIA0VvLyIWhbYghqt5kz/0paAzjsgEAiUCQAOCA5t//rDQZfD - /JPJb8lAvgWwgPpmFQc9vutRM+l8+gGcgPIj5YiqVtjH6v04P3yi7uWovy+3h0m88NI1jvukR/kR8yOs - +DA/bpSiogSz729vnGiOf0mrGkGz21nt6GhTHuU5jh97hZ2VTRggEDeeINcVdOs9G+bcqbAEB8AS7M+2 - Lw0xeyM9sS56QwzqR+vu/vjkys/DAqw8H2XTNGBSgBreEaY6AHoJygqIprGoGojGk7GIzVMBkTgEBAXl - EviiFV9WgIKB1gJQxkBUYTUNyYA2jEtgB5U2UdCOFRc/vgYDR6vOBAjnhbGqh5uqFApVXcbKv5yVnpW/ - yo1cu57YhCwALILKEHYq3451cDdWwl0o2T08F+YXKp5w0lpkA67EA8hGfNZN9B6kBXn4OAaawBWI74y5 - z6qf0ojnompBaghSlUkQsQi3IPacVFNjFj9ygEWWVdU1YSZ5UrrJZ0R74aktTOt++PG9yfv3AASYI9Cp - nyLfKNXJBOvORUFRgvRrs1CQMLIbJ5qqj4WZjOtoAnpVM1N0Dg05pKAykwGRzgCHQKBzT4CkF0DSm3PO - unAAwLkOfVHYkwEAVtn6I2ADzoYNuI7g5mM1rH9edyIAcAlDZYfRCOR0lB7FLzqT7lDDyEwQpVfQr/n5 - BCCHka0YCldBoDC0rWl6IUNlyEgUoOAZS7NN9UfDrDtZCQVPuzEdS6aeqTcGxR4NpXysgoQFJg4wO2kf - lZzEAsI2Egy8jjJ2QCB3Tl2TS5CyYBKNa8fWJ5UI94RGJUEA0KpfVimwgEABQI0HWxS0AH4JAH/9GMCy - RYs8FyAAAJYVuHCBeWL/42bMmWNNlXIMxkBORMmksBW2o3Dkwsvvpgf/XgkU3CdZ5fazz6pe4amKptzT - pJOe9Ez9v79ZwZzEtZp3EqBbhB+Mwtcgh11hT2XKWssBFFVNxLWAwChA4AI67TA5N+MUGm2czBZKcObJ - UIiHcHw6KzfXos9NM+H405Wn0Qh0Fd+HH654AJWXQgKCtFODJqFhp+B/kw6MwCKI6kFzUfoGRGkcOeXD - kUwRskIlYWR3pAuBTXoHRHVCKC7SNqYjAiFIPICYjgiU4KiBsAMZNhrOhCARgMKu4nPoPlx9NGb9GPx/ - qgSrj9SW8yPY0k5MfQXDRuM2Mbq8ukQ05XERJmxCOGxC7iHnX2MSFGuCfzXZVh/Ha3n/aEhECV3gMLDy - J6lISDUD6ihEHYFqCFLIwKS0gTlIzUDkVcwxvDucZw0wE1uJuzbR5F1YxxQOJu3Vq61p1wUF7oLiMk6s - cw/M7D6suABAMxRUCpN2fbqp/gggtremDQTWnkSHoQtJI6q8uB99BlH2Tt0Bjx5YAN15j64AQFeOuwEA - BBg7k23o1F0WBiDTU9YG1XgCgHNoDjocC2AGpjpuhTIM8XcmkwKsZ5peTLs4AKYVit2CKsZm5yud2Nw0 - uJo04kiPv9AUvoJN/+GKNAUUGg33V/+5eSb+7iQoy4A/bcti7k0weaz49UY2NoVE9pVGbMTr6wAIafAQ - qvG3Hc9043LKRDxI9eStpGWJFSTflGnSl/IbW5ANCYpmq8xCLF34cyQAEBXYAgCkudkzZpbIHPYPyay/ - fhpw+aJFP5cAgF8ToHiAAOCpp/eaceeOMzVrYOojlcfi205iO6maqUb5raiqNRdQeLOEDr7X00DyBn7s - N/NDXsGPfEW4qcFqX/0utvdBmqGHXcz8OBM/jlVtNKvxZApdbo2gvRVAAW877IYIk3hRmkkfTFagEx2E - i0HoFuSLSTPmtyCrQIYgtx2dcTuTVuxHsceZSabaREp0N2KZPEm+nJZdVSaFmbChROQpEIrqTASeJqKK - FUS3QpkhBkW35bg9lkEnttCLJZEdPRCIEhh0Y8t+hL8VdTgSqnBkf87RWDSS1V8AEHEhNQg0Bq0JAFQn - uFdDIDASUBjuBQGro/g1oCNrNkE1wKGGQIGSYonGlYeN5BnhSlQfyzH7Cg6GkUVQkDFiOEIAMWqozH8s - GPoJJkErTi4mAwCtOBmSUVJrXBbOxTOgJI4eglFXEBBVbcCG6lhhAC3PPX1Upql3Op2DB9JVpy/mdB9W - 8p6wABkmUkx2oNXpmNOk1mqzAibenmZqbA1nlY41WQuZ+YgiNTuXYBldhjr1gD7bjch8Z0z8jgT9JJ0I - /HUks8B+t05E7ztRlcd+504EALtiGQAGbbEyWp5RbApJ3eVNq2MzAdVwARJuSzYF4+tjAfC9WOFbsfI3 - H0ZDGNJxBRPJ6S8A5FDKWnNqA05KF2KmQ2hqIL7C2ELApMAk3pqKpULmh/ZvYZsohFpAzEP38lmyHFqc - zSj6C+gyNZL752AFYHVUfKKq+Z/3/kZJdUUAgf87UoU1ICfV3EKAeyO1HdtZIDYllNB+nc9fFgDonADA - xgAIAqpzdokEwABgaHKsrvifdh8A8KNNA/psQK3+2r+OysBnnt1nxl8whkagBP2Qqv1R6NN4aEP5EQ+L - sdHsuPMpCrqYzjiX4atewY8Vgk/CGIJvozG9ryYNNxxffBSEnBFcv4xutucRzDoH8/USeu9PwS9cgyVA - XXs1QCJuBL0GWe0FAPnNyCg0IK1I49G6tYkBFBAXqA+3AFDI6sjY6n5ErMcSMVe33nvhAExnFsD59AGg - UCiWTsIx+QQBoQ57zUQx+f1pQnbeYLo/WUjTidVhyLoDmjSkxiHexKF4VRFSiajeAJo+rKCijQXQBUgW - gVqMRyHRPYl50GnY1hoAEhGDEZqRRp4MwCCRp2AxnM6WLkLhdBcSbTjiHPbP457zuIdagwhSgOEXcXwR - rguZgQi2MdwXfQZgRapQKcM46MPxohAP4rP13rxn1FnwIeAN1JgIkMwHeHAzTnqYeMJ6YiHXxpm0sbVM - reGQeS6BBHMeq+N5EHnOb2YaXsLqOIJnOQWa9SLl6UklPklNweZwk7w03dTifH36DDY5hxLtU2ijdXKx - KR5MwKwfBBpiCsUD2PaHYNQXUCHN2J4V31oVvRnA2Zfr3NdqUDvT/KxWpsFVWACzsABWsmI/yrTgW5MA - HXpJks9vei70cZRfIJFPUC9tMZOIH4LXQSwici3UZnz6PBS+Nit57alMTJ6Tb5JvwFqhT4HiJCdh+ife - nopFQT0KKb0WZxPYGwL5aQDtyQjsNcPFqUfOP2sBFYkriRnh3lTeQxxL1g4pyWr0K6xKBqUylknlF1nQ - dkWWAICrADwaAAgENBfwMADwwOAAchBp8Kcp9rF+8NJrrz0MACwpCABYysijp5/aa8ZeMtpEMh1YUrMD - pcCdWaG6ssKyUsb1ZUzYoHTMdUz0UzHRkfQzKH0dSrR6KOWxZAfST9N5z6RPH5RtMvqTIRhIrztM+UQA - I2oR9e78aCsQTAtbRkAQKyCTFT6HHvi1m1EgxGDM2o0I7MAFyCtkvkAx6cXupAOpla9Bs84THyD2QBCw - 6gjScafjYrRHcRgaElOLQCSU5ZLRYkwSShAYaMIQAT+NG0tQVkAjxxIIDiKiCysQKKagxo9ralBKEqai - SoeZSpTIeaULNWBE3YQT6B2Y6HcXjhftWN2Hraii0OsslEAWIa4Bn6MYQjPOM3QkvhnnVPxjV3O+BzTi - +Dbc05bv0o7zzBtI1DV4FkmteB/8/WS2Sa35HqQB46lXiKcjcTyVkrEML4m8GAoxrkS1m6DxEpM58TEy - CDdFmwRSglkjeI5Xwq+4GCC9CBC9vKHJH40yTeI5zoVBdxfTf3DflNmo9nBNk3A9U5/m4CePKzAFV+l+ - ArGXkZpFGtB6rOFF0LwvZFW+iGzNRbA/L2J1vgCT/TyINecCMBdw7mJYnZeQvh1Z32TPoNLxuiwTvi6B - iDz1JCsBpgWA/FQKycZi4Y3FsoNunHZttolYEwMLsaL5P5/8zVqFNbZGARzMolzGorGUZ83KL0vlBLoi - nfBKBXz6KEBDXZHx4fkuLU8na9GfuAUgpB6JrU5vawrJ89cZK74AxWgASgbWRSLxgvhbCAbfwoJ1kwS3 - cyVEoRW1fxUAqC2YpgKVAQA/+CBQ71j18E+7D/7/j/NcDMBXftUGLFt0rXli9y4z6sqRphqjwSQRTTCT - mmEKQ8KJa5lgkmifnd4px2R3pxS4JwMtelLBR7AuuzclwL1yTRaSw7mcHqQIuxLE68S1jvxHdKEMth8g - cDaNN8kcVHmwOj3u8OHX4SNeTb9B+f4oea0iKgabIoWkdhqS2mE/G2DI7EUq8NxkXBCadVKhV/E2zH8B - wBAyEm35jhCVovPIQmSzcvptxWxTUV9kAVhOgET7sgj8dKDdkja0Y8SULtSWlKFVfEccEm+A7EBybW25 - XwJnIJl2YklqO6b0Ifs6lyCgUC9CmoXYQaRMIk7M58esFuUQm5IYSZ6k10I8SvGnFKvjcho9BFJzVE4M - cKZiFqcQA0jD/6fMWL0F0tRPgIBgSlN6JvSAHYl1UXMe6da9xGaexTS+OcpkXJll6p5JMPAUpvr0ZyXv - DeNuIME0fO76lzKheTzm8R2J8OcBDaL/0QTMsmblmfxRsOWwEpoOg313FrUDZ8gSoMjrDEgzZ7Jin8X2 - bNq4netJw3NQ/GGw6s5pYhoCAPUuQ/mxIGqNqWMyZtFt+QZ6A6LM5Z+DsbglwsTfTDHZwgyTOY+/cz7P - YFm6ibwfpiiW4PEEhpVeLQ+tV7MFZeZXI4Jf8wFIX5jsJ7xyojmOdmhVdtGhisxF0tIMkz4DS4HW6PWu - AJgugOV3Plvo0A0vwnK8kmDgOABvMoG/qQxanQbwEZSUZM3k9zQ9z+ROY7rV3HqmkPFlu4jwWyH3r2i/ - An6lrYBgENCzAGaUkpkOAOr8aYp9rB8M9/+nYAzA1gX4FsDjjz1qRo8YYU6iFkASVRezsx5mZz0AoBEP - v2mmyWxd29Rqy8NtL2F0Fft5+Oo5mPG1OM5t60mtYh5+EYGWNmzx43O6AwCnZprYkUmm+h0RdLuFyEN6 - MGoaTC4GYKT1IzDTHkugmaf8JQDQnv+8fgDA+VgA11ARB2uu4gp4CldTngsHQNOLYoj8q2+gLADbPszv - JWi3bt+NHqfK8DCmYJAu7BReACClD7YU05RhTReWslsg8I99GnHJ7AFrIYhT4PEK1HE4ScdOOE7mHrUV - SxYYsJ/CqPKS/oLspwEMablYUmo/TutxK+ofQGvxVIKE8cQJos9INuFT40zFLXACyAbUIN2aPjLL1AEA - mvZjjFhXIu4dWRm7U/uPOV94Lmb3iHom6WZM892kyVhN01HIAuYLFGL6t6KkuB3+f6fOBPvaEfxrQ5Cv - I80+8PPbdyLS35m8fNcupl134gpIuy606e6GkAEoIg3YYhCr71l0dxpOyo4gYBR1BuXpaiTzPv42GKBz - WThQwMxZgNiSdIJzUbacuwIxoRqAhFZ3AYJ6Hx7/Ku3PbDC5vPk/9EM8CX8+fkUi2QueyRzeZwKgNYLp - VJei8Jc2NAWXMUT1EprPXM4kqqvrm7yx9Uwm92RMRabTqwHAyJxKPGkaixL72TPhsVzLIgV/oHT1n4Cg - NAgoPqA04CeffGIWMAp81rQZhwmAAADMwA2Y8dcfDUYJcAkAOPPfxgCIbu4SD2DMGFPxBPytKjD3kvF5 - kRjmA8TBrEtiJctBOWsX4qPJVKc3gJWm1Pjjq9duwXkGiOpaHtNt85qwbY4w404BvXQp8gWpJnw2EX2I - LzYWQPAw5hLiCnItOtEopIgeAoUARyMsB6YHZXYmAo4rEXt5sqm5HBYgufPKAECN4fxoBgAAzBeMhino - XICSrsIovsaOu87C1veXBSAAcKPH/e2RKMP2vGMPqmZAlGE7YRjRfvC4pNuwN37cjSNPBgjUPESzB5Kx - CjxRP0GvpZisALtVezG1FVOXYToOpQoUbLdh9Rj0zmkugdyCeKYKxQAAUVQKVr0NYhQuVTViKwlTUkyt - 8+nbeBom+gBW877w7Aezgp9D7fxwyD8oQOT9+P97KNC6jxFgk+HKX1bIKk8DDUzpdoBFByl7RzIHHVB4 - pEMHovwAQsf2MAo7EPTrKGDwQKJzO4pqOtChh2ttuxAEHNDWNDkbE5x4Q9KNBOL2k0l6vjIR/ESTM5OF - g1U5B1cgBQugJkovHr9M/PhbiReRmYiE41+F3gQViPSrwu//fPl/zHHvH2/CH4gGOMj5j6FuBEumiViP - g0gb9qEisS+Bxf50AMbSaQkRqsWpRabx6RQOnY2LgpVSfxgks/OpWcGNqX8xxUQ+aKgwqd7YJiXdfxwQ - iP7rQMDxAMQKfOutt2wWoCwAABB+Qg4if30eAE1ASlwAVxRkLYBFi5mVvt+MBQAqnwTvvTIkk1hM6xhM - a8aDJaZQC0DbrFrMtcvPpxYgHz+RSb916oC+dUHfuviOsPd0rm4u9QF5nK8NSucjBRA18Olz2uabpJOx - AoZDsLmJtmPQWfXjjWEMdyoNMdO61jJZrbAWqAasRf/BnGasGHTLSRrMj2MsdesbKJmFYFSVCb7hF5L2 - U/6f4aIKANrOweobSP9CzTOQ8mtrg4CaKpzldRwusQoECKILSxx1mPscO1CKX1JU5FsGv1B6BwLBbWAE - eRIVhlZyVG4sIED5cw9JCtdS6LacwrkUugqn5EkCHYdt52EAwIKDhpLwLJhfoJiBxpJFEUCsAduwEoSj - yrhV0bNgBVIdWGcovvvJdG8eSOXdaaTZLm5kcsfl4++nmoqw8+R3x9yZYGqPpJcAJnQTTP1W/Qj89aB1 - djfy8EgbpLgL0pV9tm26UmHYzRMdF3fBYuhK152uWAPc27oHQcCBxaYxbkTdK2kNxkpdgwBfeYKNEevo - YLSQdnKzcWtIwUWuicVtgUj1BCXngEPaQtyeOVg3sBOTlwNudwEEBOyUMj4R6yaeTEIuq3oD4hFNzyCd - OKAdFgiEp7YAVlusFsBIoNTRWiqkJPWde2D99GTbHU5Bt3bMVIRs1Le9aUmatIghq+0oZiqCHu2Cfx4A - 7DSPPPKILQQKUoF1TgCgGMCCa35pAfjKL6sg8lgt8T/tvusWLPjBxQCc+W+ZgDQGfeONV8zEERNNlXBW - 5xzKUosIALYmSt2CentSawk00kglQJXRjpW6Pb56e0z1dihrGywArfItcAewBHKb4x5ISOnlNeYaA0C0 - n9mxtkkaiE98MVF0hl6IPHQiPmwY6cXEMwnMQPrJLGal4P5adbEAiAFktocEQ7us8KmQX3bCyINvUH0x - PfoYAqr0XmwdLJRUlJ6JQmoiGhfFVk1F49nGwjOIIQDEhKG4eBQe0fShBBqciDWYkMQKn8JWo8rpI+Cy - BQnqD0hcIMHFCkQcEn1YI8clqiNwQ0ec8ssCcBaBLS7yLQF73tsPKr/dV2dhNRfVVsqP2V8CAIe1G/cb - j9YFAOgolEB6UKPHos8HSBcQF4EVeCLVhBE3xZi0y1kpz65vGpzG/IYh+O5nMIXpkoYmW6u/LdKBt0H5 - b/JyCDqXEUw7B6UaAlW2FxN7uqAoSHHndig5hB0J+0VWdIxCaWv3ERStuBsKhkJJwZoPbmMaygIg8Jg9 - CTLQ3QQCoRrXIO2WcGMSGQieAQE5dSA6gRW+Ck1IE5dn8t1w+yZgKRLck/meNYXfyXLqHlaRHbkrCf89 - z9S7nCwFq3oz2I6t+hH4667vymd3AZD4Hm0FULglFqz4TsU9yFz05O/gPgti3QE2QKEVQNWyB38rYNAK - gHArvxRe+9u3b7fy8MMPl4iOVQrssgCzpk1H2UuLdQsS/zTFPtYPxgI4WDYALDLvvsdcgCsnmohYaq3r - wd3vQfqPSrvwbgiluDE03oin800So6tSTqEnHj69JJVVPZWJv6lD+CGfDLuPwZZpAzgeyD7btP6cp99f - /Onksc+juGcUeWxaX1em356KWqrQejt8Oqs5rkDSaVgCvVAEKuFS+vL6IRTnXEhOWfP6YCBWfAj/FX59 - 5OUE/2jtFQUwRVMtGJ1NDl1mv8CA1V/NTGKTAQGUPiGBzwUc4mkuogYjCRo/pm2s13E4EcpwvDIDZA4S - yRwk0DxUI8lEGU6GJqxsgrIF6jCcRGYgWY1FxBy0nYb90WOMOEuW6Jw6D9NsxE4i0hjyTDUd5TyNRK3i - s+rLMkhG4bWfbC0EZwnw3JzyAwolsQE6DycTR1CvgSQakcR3TzPRpAXDpjLHES7ACRRdVWd8WNKYNFPr - vAJT52yCYqfDdjubfPoV5NvxfaOooqtI7Xw1uugo8l9P6cJhAMAgZgv2ZGwXcYPWHZFOxA+k9J2C4gFA - UWeU/jCB3NMFBl93THDciEZnNicjQLHRBKi7K1jJCd7V3BhhYm5PIBoPsxLX4yQCkJUw/+Mg92TMYSFB - 6etcTjXohTSVuZiAojIXo6guncDCQUCv3qV0oRrmKb8+o6g3io9itxb4YJEUSwRGPiAJlKx05ftLAIMi - FL9I1gBbjVkv6oPVwnvs3KnV3lvxHRhs27atBAi0LxEAqBrQugBTUf7S4gFC9rHq4Z923xIov44HELQA - YAiat7EAJo0db1OAlcPVFhzlQrFiclAuKLUJhURz8UGzi4j2tyGoghWQ2Z6gCnn6rG6kXLqRHuyGGY8p - n9GVgA2Vg2m9JPyQ+6EImPIJw8irX6nmFhT23FndlMOkr4A5WO1Wqg8hysRciaVxAco5jM87DwWmT37Y - ZOq9odWeBBNRbbNqsOrVHAeRBl5C+MmQaiAChVMRGElDUDUSFdlH6cEITRRuw3E7cu5tiBUUkbtvgVDh - GN2Ev6057g1TiMUjiCXIGdeAEWCASXweYCFeQR0sAySO4zhxBogZpBAgTNE4MSmw+gnoWG3GlULULEIA - QQBgj+k6rLRiagp/fwIKrAYkNA1NzmQ/lXPMJ9TswlTtc16vTYWOnMr1VDoOpyCpWZjHdByWpNIkRRaC - GpAkMEVIFOmoi8mq3Iw79SRNS7ZXM1FUYmYMp7PPuSjOmSgVCp5L27C0GTAq74VOzeobfW+8yR4L8Qbf - uBCQaN4XxZJCsfq37tgeAPBX/U4ojAUBKZOUjWus/hYErBuAEgEUrTqRbejehswDLbpPY1Ao6cOcCXAB - cDMUBKy+KdLEkn2I5rjyo9VtkK/a9pomBYugFkpeQOS+vlKKZ+C3n0nJLhkH8Rgans85uAyNcVGayUoZ - CH8fxbUmPZ9rLRJZAEhxJx8AHBDo+/lAZS0FfX9rMehvwIUg3iFLxpX8CgC8/Z1W4UuLA4CFAMBMlF9S - BhDU+tMU+1g/WISfIwHAyy8+RwxgpKlSBf/sRCYDYU5LoqMhxcTx4yc/np1Gf78sfH78fOff16lNLKCW - JwV5BAVrY84xRkydfXILcAHyEXz63MakYQCMFKyC+POJYlNYpCKa8rTArkY33MjhsSZuKGa7rIi+/Nj7 - Y+pSlx9BjEDdclWDUOVerIUpMOewFmJORwF6Q7qBpxDRCRDwJQJWYARUYHUTDqehaFgvz4KJJGagtuKK - HajLcCTUYTUTiewLSGDd2Gv9eQ3baCSyF8DRh/Ns1XZcdOJYNQMVGaiL6MN8B6jEsTQAEVkojgYg8e1x - JYoQOgbFt/QkjnmFCU2wIhrgOiBJdBVOoHOQ9hPgDCSQEUgiO6A4QKpcAqwBrfw2MMix5hCmqvtwpjIC - XGc0WXJz3oP2YrFD0kzYuBiqI3GPsKaq3Y9ZPSnN5JzL/xMZgQKKhHKuoKpyZiYuANyBh8NM3K1MF7qS - xi5DqZTrR7pQZn87TOg2FOgU4UMX0+ijLSZ0OxQMH7ttG0xrSXuUinPKLhR35LgDisfrijgn16F5n2LT - 8FQAAF89ayIuwF2s9jToqE5/wOg7+X/EpC//DL0PlNNfR9PQGVSFjoSbT0/DxlgOTQaTgkSaDaFL0KnE - L04HDE4nHXkyA2gG8j370pYMs751N6yOzqziAiNfqQVSAigrOm/BywMzKx09aWUtHM8tEJCp1FcSBIIj - AYAyARoD7gAgsP2Z/YNIzrHq4Z92n4p+jgQAzz7zlBkzehTKT162akUTTUAtMhFOPPMB4xkQqpUuMwt/ - rTaEDir1CupAOCHAV5ugYB7npPj5eWQCagEAtThmW8A23+4LCEgXEt3PLGZaLgoeczmBPQJ6FZjBp+KW - iEm0DsNKUJvsTKblprclXkDKK/bcRDrhMA2YDEBVquaiocImEjRMhkSThBIpWBeLLx+DyW8DgLQRU2MQ - BQajsV5iaGmmLEFMHkqqlGEDzsP0i23I6s+qH1PINZqORtNzIIq0YpSshbYoeBuO2wMC1AlEEm+IltIz - mjyKUuEoQCGqD/tyQ9RtmDZi6iEQRXdhu+3Pawbz2kEetdjWFeiYJqLR7EcN4JzuU0diOhRH9+E7QLSS - RPfiewEy8T2Qrnxn2pHHqtuQLxplHtcbEFKj0fMoW6au4ESKjI6nRuKkXbRyg2yVNJKsynCyKCNoT84k - ocRF8Cg2Upn5OJbdHfEmayzt3c5l3Dv1A816MKW3A6tqW2bqtUXp20jRUZL2SDEA0IpUX0sUvjXAoG0R - 9xRRuSfhWlud57UtUcwm/VqaelgdOaNp3IELcNJu2HebcdkI7IWv4XvC56+8s4ZJvInA3jjKdS8kDUlH - I6vcuCACo9YEI5v3am2a9iaL0RPrpAcrv2+htETxW/nKrO9sxSm5rJEuXMeFsYKyt8Q6kYWi45ad2XJO - +wKKtqQ9SwPAo7gDRwIAWQGaCjxz6rSAWGvge+QAkv6nKfaxfjBBwDIBAIagee6p/WbC+HEAAFV/lRnv - lMoPNpEfKqnARPzrFFafdNJSOfUAgUZQNhug2EwMzkO02tciRSjJrauV34vka+xXbn3O1UP5G6D8heRm - izBne2abuGEpJow6eVUVqhlmNcpcoy/iRw/tN7WzBAXvg6/LsMzqS0kBbsH/v417aMml8ykEJJVDVw/A - OHz5uBhWWwKAaiYar31NF5IQDFQsQNt4jhOiMOejWX0JECYQIIwXa9AvI06KUtkwpj9BwniChHH0E4hX - P0E1EsX/txRjkYegEFtCkEaQKSCo6D8rufoJaFWPb8jrC32moLbN+T7FgBKdi2MkFB3FdeCYisMY2ofF - otSxtBeLQdljZGEwoSgGUIiV9Of+ARwDKjGD1WkY4DgDC4VmI7KOwmYyy/AeKi7hVpyIm1SV/oIqwopj - mnD8NfzdS6Eir44k507x1jOVTfi9USZpNn0ZxkCouQzQppKw7jAyOGQP6p2G23AK8YMhmOCnQLIBIBoP - xDS3wiqNgjfuRYqxF52g+2Ca90JJezHBtw+rNvyDhqdAOz6fxq4od/SdAAAKX+lhsjYrqY3YwLSlPbhw - m2gYSjYg/0oamdDHoOlA0pBdiUG0Z3Vuw8oNCLXGAmndHgGIithvW4ypj2VS1BpwaoG10orjllgfLXFP - igkCcq1NayySlqzsrXiPYoJ8bVD2dii73hNp3cZ7r6IOcmkALTIGZbX/OpoFoBFgM6cAAIfLt4DCT0jK - serhn3bfUlkAPvknGAOQZfDCM/vN6JGjGQ9O1VW1ynYwaCSrfwwAoDbdKXTPTYe1lsN8gLz6vokvZfel - Fkqu6L13TBQf5ZdYIOBctoZiQmZJbwEZpGuOiaftVQQdbyupTPYJehAwjjtiAmWxw/g8OPDJ/VG2U2n3 - dDmNK+iaW3ErJcACgMvisACwSKiOS1WTzRxNF0bBlAbEUtFcQSval8gqcPsKDCYRX8BisA1DSG/GMYtQ - Ek82IFHThJQR0HUAQJIElTgZX150YWUMEpFkaMTJCZo2hE/OtCHbcVg+PudSEvhecZjzSArXbMBQMQFN - JeJ+e574gMqPbWCQPgTJ+PtpxARSk4kFYPK7LEKydQUQgC6FIGBKAz5HA03ogJTQle8MNVjukAKjlamT - qLSFjsJ30FSU7ksJc7hnLmBCC/Gq20ir0XPwxN3VTOwyIvJ0E85ivFjupVBzL4C7cR5AgEWQT+wg71yO - z8eSuwBK9oUI29rnAfRwDHLP5/9d9/Ka/PPJ+nCcxzUd176YVO9V+SZjPD0c5maYMFb8CjD7NOKsIj7/ - SZSKlyMFWfmRGiZ+aTL30TAU8k7d86Adnw7VeAjMwsE0GgVsmvSnGegAOAwDAKB+tPQCdJr3oF9gN0qH - O1EAhLTs2Ma06EBvQbbWvG+LwrdC4Vuj7EVYBq0RgKC4FaABWAgcilsgHHeA6NS+bdcS899ZAjt2HNkC - UBDwCADwTwDhZyQD+Wt3BSbY93NZAKBqwBdeeNpcdcVVzAakgCKCApNkzH+sgOgU0oBE1pMJeKUTuc5i - vp1d9Z3yy9eXBSAAqMNKj9LnsM3GUtAwkewCzjEGPJsS1yzorBlN+KG3Q3E1CQg3oMZ1NN1gdT9pB3zw - a8NNNFH/WKr/4k9nlQQMwiC8VLpLrgKr281htp9eAgGwJDrlpBXClhO5hsCbQMqCgOMBMGXY8gF8TkDJ - eTEGNYFY3ABHGfZZg5YoVLqlmPgBogarl4BPDPLIQ6IMKy2IuLQggUFZAzayD2AqE1AiZAZsRkAKr62U - XwFEAoFWOJ9CADCFCUMpAoMktslYS1CDFSRUcDANqnBamkACQKgHgBTDqwAMI0YxMJWeAyc9wrRkWIFx - KH/KRMBrGlbMtZj/67GgIACFr6SabiRcjqEE3gbTgak3DTK6srJ3xPfuTJluN0xvFK2JpGdLU9gb+m9f - tihhw37w/gcig6AB89p6J9O5aTD1A0OI/5zWyBQMo4nLZaTxRgIA09NMxF00h6GAR3Te4+lgpO7KJ6g6 - j6xA3BJSylMAoVEsEFewaFwMmFwIiAA4eRdhWV4E6FyEe8m5/AtJDwqEzuU84JQHAOXafer7z+az+Vvq - nAUjcCgxD+Iedc7AmqEysoEABT5EI75zI/udsWIG8P35m5v0J67Qv02JBXAIAHYcNQgoF2AGq78T3xL4 - ie1BJAf5a88FWLZ48T/LigFoStALLz1rRo4aYcLDw00VDQaJAgAgAkXGUnGXQIUfpraGdmTnMhqMdl25 - +fxH1IH2i7JL+XNY9WUd5MjXR7I5J+XPpMFndj0E4MhmWm4GzS7SivkR98F0PzfJDsCoSAedcrTFrkIP - PtW7x5ABkH+rarmatM9SPwKNf5IrEAUHIA6zWGWyKbTl1sqYLOquCD9BZRcQBEhBdj8gwXqBw2oHHFvQ - MQYdQahUc9Fgr8GSHoMCAlGG1WRUVGKkbMag2pD5rEJ7v7gCAAQMQcseFI1YwKaovz32mYNiDWIN2PmE - ygYU0SQENyGKsuKq91TzegQQUwm7LQoQIKMxDxdjKfTrNRGm6qaaJvZ6egdcwpDXk1lpUfBm7am/b435 - 3YIVtCUmeCvM5Basms0xlZshbFtjUtsVFWnV2l9lW5JPZ795Eey7Ypp6tGU+QOciU4hLUB/3oTYKnTwn - 09RcTU3A03D+6ax8PM1VK9EqPu5maL0TCABexOp/OsVGAykwGoi70R8F7QdxieN6g7EIBuOGYBE0wBWR - a1L3VM9FUXajzplw/s8CMIZhoZwFULDNO0eWDFsAQqlQz1phYboAgLkQTgrAkovVkn0ex5fzGmjLjvBz - LACgpiClAcAHggNsDyJ5f5ppf6wfDAD8dCQAeO7Zp82okSNMRE3KKBkPHl2TKHtNlDCMICCjwlUll07K - KieVB5jOwyYbkJdNvjaHB54NgmeDzlkAAhOEamVxD+dyOc7NYD+L/wgCiFnZpAkZnZ3ZEFZYER2E++IG - XEmjy9tZ4Wk+ciKts2oCCNE00Yy6iEg+NfdVb4ABSH9BdQGqyZy+6DOJxhMgS2qBKa5e/BTiJIubXysA - AI4LoMlCsgSCyi+Q0DlXO1DKChCfoKR4yBUR+duj0oZFFirdcRjroIRBeETmoA8AljnoWxA+fVi9Ci0I - iDJsiUJkANhPoI4gkUGlCVQNJlAcFAspqDo9BtWspfyL1FnQLzDiRiYm3RBvqq0i24LiVQcA4uensZrW - NQ1QrsY9ibR3JsoOCDRvi2ndTspMb/5WnlILGFoWYWazr23L1kixtgTsMLVbYWK34pxAo2Ur7mtLz4Eu - 0HD7wgUYSiZgDGW5yxNNRaoVj/uonCn36knEIqJtRiIPd6H+INiKXVmJ+ewWbbzPsABTRMCuJZ8j4f1b - tGEr0ffQ52u/HefbAzodKDHuSPyhExmEzkhXpJu3lWXTsBuA0hMLoDeWQF9owX2gBCPqntTg1KYlFoDY - fhIBwZFiABoMotHgMyZPLVumTPvrVwMq3++KgYIxAFkAT+3fa0ZcNtxUqUFDz3S6qbSkbXUTUmMN6FhT - H6Ujcp5UiBXAjLvMZpjzTVntCerVaoB5T/uqWgT7apH+y8bcz2IkdlYe52tB6VXmAEColU1hD4UtWVS3 - STIZkZ3Sjnz2mbQRnwwzkNW/AhN/q95T3USO4jMvBgDoulOZ5psVaElW5TasgwuxRvolm8QigoCs/KkM - 9bB5eEvIYcUloCcfXxKD1SIyUKz8fBiA3r4vAgR/Py41QBEOVhAGqwixAoI1BCV1As4tCFgHpVuOuy7E - RwWCkroCnz5cQiN21OEAk1BEIlUYEg9IaKIZg7hSZATC6RNQmZFiFWyrNgg4tGavcQ/WE5H/v6tN92Zy - 79NRPszo+gMbmsbd8a87wRZsj7/djmAeQNCsDdIWYb8J26ZtUbA2h0TXmrcXWCACDUkbhHMtOrbmPcnh - Y3KrSWk2rkDCtSnU49c0f3sXWi9domJhBGaOxoU8B7Yi9xV2x7cXAOk9ingPLAoLAACKQMYCD/vecXAf - oMBikVigaAEgtAC0WvJ630pp2ZxzzbiG2NcCJs30GewXE1TU6xzjzwGAtkcCANGBFQM4IgBMntroWBfi - P+0+AUBZTMAlC+abfY/vNFecf6kpX628+Z/6jFnqT5ebPnSz6cFEHBiByonHkMKKJ0CXOBjW3EB8TKXj - Bnj7yQy5TBbhhwh9Uk9WQ4pWktTbviupvS5sierbbrcM0UzW2Cw63CTS4SaGKH/YBCLETPr5+0sVbIvs - mszCi6Avf80ZNIxYCWX4UchCNxKXOI/uxJj/8e2oTaD+PkVjukWmSVZgjc+zNf9i/AECUSh9BCawMgHw - GOw5ZQNEGVa2INrPFogmTN8Aib1uj9VchHNqLqK+AhIFBhUgVCaAzEBCOudceTH7JV2HRR1WabHfjdiV - Fyc5a0CrfHBfdGFXZORqCQQAtlMxyq6t3IMAnbgEAOhFEA8YRvN/IkuqxhKAdGMNAqZkTFbSCGMttFvq - /yso+n9/tEmfmG1yzy4wdfs1tKtj445E9ItZMREpugUAq/AAANZAU50v5hhpUoTLwDmr/IjdR3EtYHTg - Xlbhpt0VuGtuffFaw2ubxIUMH9lGKzcKfGqQ+0+cA0fhMpiKp1HY059Vme/QrAPv247XA0ICHPt+Om7v - HdvP98+XXLffj8/Tdf+eZkW8pojX870k2m/amuPWuDlYGM1b872RZpxvyXGTFq1KGH/HAgCiAlsX4EgW - wOSpTf80xT7WDz4SAGhO4L49u80Vl15mTjipvPlb5Ikmog5pwNpIAYpPvjyO8VyJkFxSyL+nMtk2WRNv - NOuOZhUJPVBqlD6pNz9+JKEXAhAkMAEngQk6Cf1QKAJ38f1QXujEcYNZoTUw4zz81ysxU2n2cdIdVcwJ - NA89gVLQimuhrDIApBJKX34TDSwwbQUEYRNhDNJCK/I02HykyuwUHpFw2qLoaufNWPBY8vnRTBKKakz8 - oj5bUYVVM8CEIY0Zi9GwUZqGihcQW4uteAIZvIcyASh5HJaBsgNSdp1TqjDB0YXVQESpQUSpQ0snBlzU - jVgNR3QtUc1EmE8oGnEy9GGbQrTNRxG/CanNDEAdtpThdO5VYNDPCFgqsYKHAgnNLczmWSugaOnDfp8B - 9SKoC+BptLkAgGcbeTnPEb5EBSYxVWDKcJW1AIGah1J1WYUsQMyyBJMxhsj7mfjevSkY6gbLDgBo3NYD - ACvaR9HtfhvAoZ22ges+UEjpmggofOWU8jZGkRtjejciYl9nMAFBfPEkYhBVN4dhfYSb2CVQfxlkooyC - zP+G3bEAOhKAbIsb4ityyWfpewQ+t3Ex31Pfx36vQ9d0TtccgJX8He4ef+ssGf1tur95B4CgY9GvsgAU - AxARaDoA4MQHgwP+tvhY9fBPu28Z+f6yLIDFUByf2rfPDL/yClOeasDy5UgDhjORJxLSSyz9AGLxuWMy - TAZpqmxm3edgzmflIHkE+WTSZxHkq6VjKMFE+9NwATJo6Z2pLY0w0uoiRK3TCFylMRsvtRk/ZnW96UiU - ehDm62UxptpMWn6tgin27ImmHIMyK99IV1263lTYSvqIzjeV7iSKTc+98PPJf2saz0AqASHTRDPiO1qE - Go0DV4UgLD/1CQzrS/+9PlCFsWLCkQjmHFhWoBh/3KN9NQ0N60GLra7qfATbryuA1wHmH0SgyHYSgAYq - cRSkoBiaosTSc9CbOgzgNIa0IwpxQywLBovG0U04jo7Eog7H0kUoHp5AIr58vA1QAg7MKvA6EAOWWAdK - AUr57SBT2pbbFCJ0YoFGEulIpQ1TlTaERpySiCTJyvEkiftsJ2MVGolZyHOMGcrosDl02RG7UpWWNGEt - 9xQ198+caGqsCjOJs1JN9qVUCw6uZ+p3a2QatScajkI0bclq2YIVldWycREKpXNsm6IoduVH0Z3SWSVE - Oa3SsS0sJo4gJRRQkElohN9dH2Cp15esAEG6lOkZ8A54znfGmeTpTJa6mBLkMxqYBn1R/q5yQXh9e0+5 - 7XujsE6p7WdIgf3PsZ8FWJQoOWDQuBXNRVsDIg4sBF4OwAQW/rH9OzjWvfobFT9oTgrxFy7Ajn/tAkyf - NMUcEsBg0tQDPiB0+dMU+1g/mHz/gbIAQENCn3vmSXP5ZZeaylXpuFMdXnkcq2eCiEAAAD51Ij/cNHzu - zFpE81F+KXw2AKBtDj5+TibCNhvJyqBeIJMaASQ7nW06YJCO358CWCSzT3orDb89nSKX1Fbk8aluizg3 - zhb9lN/vjciueGs1U2Ux9e70Dii3gxQgQzciT6MoCXacxnwnwuhLrkOOXk031ImnDit1fViBnI9pgHJi - tUQ15G8o5G8oRJmbodjFfn1AMYouEdMPBVftQHhngAP6sJqGhtNZOLyn6MCc6wdoDGCrBiRQhdUPMALq - cFh/ftgDOBZ9GLG0YVGIGVWu6xF9BEikUZk1qJ6C0T0Bka5YIOpCjMR2Aiw68l07cE3kIKwXSxsmuKkR - ZQmFbCERqfVYYn0ARC3H+DvVgShBouYjnEsUL0AWED0EwyaQMr2Xkl9y78e/hyX3yd/JvdN04x7IPxMz - TO7QOqZe90LTqA1EnuYE4BqjCA3g8SPNGhabZg0wnxviJzciGFiIT92I62ybNeZ8ISZ/E8zoxqyeTQCN - ZlgAvEezplxDmrekFh8la9SOoFtXIvfEGXIuzjepEwAxPjsTZmIuoFC3H9H90sqvFV6rvsAFJS8BAe0D - EAKrwrakJBF7XdIO5QcU7DnuKWzjg5EFMY6LuIZI8d1xIwBAINCyA38zVoAz/S0QPOLJkWIArzE8V0HA - wwHAgsFB/9yAY9XDP+0+TP2vy8oCWAAgCzD8yuGmeo3qpmoYs+cgAIkGbBuDUGWnuvpUItBiA2ZB6snK - R9hm5hMQ1JaVX0M9JZl0sMmEwJJOq6v0XM5BIBKHIB3SjiQNEzcFSZXyqm8eQzU1T6/6ZOiqmyoBAKxg - q6qaKozlPpE++uXIAFRaEkbzTcCoHS4FjTuT8LtTWT3TtDJaAg5CJV9iDAoRifIoBoDlEqvyYJiBsZEe - EzA2mnOcV2Awzg8Qyv9X0DAmCdE4ctqLyTWIzQRImJJsOw4xJDUWkIltgLKx6mv1j2YoSQzFRNEt2cr9 - aIswRi0O6yEKxVbb8ehuKDwSq07EAgUAJEYUYtGFoQRHEleJFtOPrsDRSBR0YVGKtW+PLXWYezln6cSO - Sszro/UeWEIaWx52FWy7WQRN78BtYsrwcZ+cYI77+njbaqvKA2Emdh79AobTeu0MBrL0wwfvSfqN1bp+ - F6LjHUnHtcUsL0J5W5GOQxq3RolaENRrgfI1g4zTBIVvjJVQyCrM1grnmgsYAA1JEwBCoNAYxWvQoZmp - 15PqvgHk50+GNt4f7kF3/H6t1s2xOJryfgBJMwEK7yGQEcC0aAroWJDh/XWPQEZgw34TbVvwelZ+rf4l - 0tLbl8I3Kub7FyEaYc/fYUHCl4Zs6wMYzbuQQcAFCALAIw97mYAjAcDrr7/OUJ05ZQGAOzcUIDj+T1Pu - Y/ngRfPnf3YkAHgGF+CqKyECVYO+CRNQDMBo2ICyAGJSfDaggm45kIFoDJJJv3opfSZmv/YzSO9ZRS8R - AYADAfW9g8RCUCtdLgGmcQoBrxTluxuxemsF0ySey/gB38JUXqWzdtCYZDX8AMpd5QJUuRYAGEKD0i4o - YmNWSqX9NA7cjvwCEBR0kw8uH92y+3yFpp4hJl6Cb08vgDiJXxpcEhRUYBCqsPoIxMZ5vQQ8KjFgE837 - KYhIHCBOE4cIHiZGYcLHYt6LMqxGo5oypJJhf/JQEuXFNmgIp8BOIFaQUOPJ5dsrxUdePx4wiZNoVceS - SaIjsV31Wf2tBUBTUTULjdPg07ZYClgLsZ0AGBUfsY3GEoruwf8PNQmaVixqcM3xDGJhSImmFGko63Gf - /91UoP9idToGiR2YNB4rjmrBjAv5PzuPtljnYK0NY/8srLozseiY7pzFjEft55yORTeE7M0ppHBPRYZ4 - kjeYFPAA8u+ASO2+KHc/isP6QsTpXWjyiS3U6Yn0pilMH3LtKH8eQ2PzTgV0+lOh2AOCTmdABiVsKAWV - Sa5VuTnbJs1RegKCsiaaIbIsAILmWCPN6mFxINra40KAoB5Sn+MGgIXO1wN8GnKuES5MI8CigfYFVAAG - 0rSQLVIIcDUnI9CY4KDL/wddgaNlAa6ZfVQAOAMAKHcsevin3YMF8EWZMQCCgE/uftxcSRrwpIrEAKqc - aFf9aBQ/ComhNDjesgFZcVFkt9JL4TO0wttV3hNv1S8ltdTjzpNUXp9KKiuNoFaammGIQy+ufGeKj4bS - 5moBlX8Qf/7+Iq4AMwaPf47iJMCgBnMAIljxouj3HyvTWO28ydmLASixAGCZeur0ow5AKE2qWpoFhGCf - ioUO4waID+AYg44z4KjDaitGu3FLFNJWKUO1HwdgXG2AsgI2W4AoM2DPWxDymo4oKJgEfVhTiJLTAAD8 - exsgxFrRVgFD0YxT5NNLiAGojNh2KFagUOXFChIq3alrqf55wDiRZ2DdAlqYy/KIGQLvfwTPkCKrck+d - ZI4n/VaJxivRDGJJGAWT81wIOFLgvvA3GO4qJc1nX6Pd8wZwfgjnTmY465A6JucUAADJRXmzzyCFeyaW - 3pmAAyCRfTbbc9gOo+GrDyBZZ3MPxwKUbGZFZpzH7+ECFoaL2F4k0MH941z22fR+ZDRcLQCm1mkeuOjz - 7GcPgvknGUAnKUBF2Yo6fQCT7vQI6E6n4+6MkGMydd0uEIMYUW+tlnZYMmwbFCOtOW4BwDT3pLA5FkBz - LIOmWC1YLoX1cAfqyvVpaxpjcQQBwFoAyNGKgQQA0yZOsTI9KF5cYDBywp+m3MfyweT7v5/njwYL8gCU - BdhNT8ArLr/UlKvAMEwKgpiL/qQAAF3LSURBVGLw+9VpJzqBHxamcQLmcio/unSaVQYVv2TF57wUXx1u - 7RZlt9e0j9mfSjTbbhGt/qkof6p646kcFj82jlbZ0ZizNccTDFxD7pqmkse9Cwg8T60747U0BUg+uQZ/ - xGGGx2MBOOXXVpZAYkknH+9aTFopAADUrIkfZAk65S9NG/aJQmUShvz2YiV9Bh17UOAjzoBE5wROfC/b - XkyDSB1fwH5XgAHltmlCJEniZwBsRkBBQh0LACzXwQcI9RwgeKj+AcmyKvQ+BBzVojy2A/9nZFiixtP8 - gyGi4uFXXxFmEpjBkI5i5vUjANgGJWnC6itpjIKw8jZqxvwAKQ7bxihLo5YQaIo8l6BhG9yEdvj0bWHn - tYVIg+LV60zRT1eUsysWAGPi87uy2qOcBT1R3l7UBvShRmAQhLDBCNOgJXmnASSnASoMla11KhTgU9k/ - HcBAcs4EDACQ7KEcDwVAsEIykKxz2B/G/tlYKcMEHgAPAKLzmQIeACnHCq9jq5mTWadzz2ne8NpaWDA5 - g/l8QC9/ICDH318b0CsYIGul4WGdf2QFHA0AXn31VTOXQbrTJk4uJR4gIIMAhb8dix7+afeoIYibDRgE - gEXz55ndu3aaq6++0pzwd1o1/9+TTGwYP6gamObhKE0ULgBVdmkUsmQm8JDJBmQkqXU1M/0yvGBfOtu0 - NJRera3VzIIfaBoFL2l2Xw0wUHh+xKnw4FNZ0dKU3uJHnwxdVjn9JHrnq94+/Dwmy5ICLP9ERXPcZ+VI - YzHy+Zoa+Ln0ASBAF90MBS4QALD62zHgWqEx78Xgs4NAxOTjmpTQ7xMYTWNTuTNqcGoBQExBbV2xUCma - cEkB0THQh52ilzQcLcUePGxMeZBOXNa48qM1Hy3ddsy2JxPlGDBR1oG4iNyF+O6AABTrmssY7nIfz41h - rkmMV8scTA0AClsfxa7fDGXXOHaksBBzvBBFb4I04nwjwIBjXWvcGN8aKbmnMatqY0z2RpxrxJbX6n6B - SMOmHDf13qdRIeBC7KBBCz6rBYDRkgrDVnxeS3+FxvxvUMT5NtB7JQKXjqzqHXElOrLSd0ZBu2GdsOoX - dMPVELD0RnkBl9qAS23fYskdCNAMxIIQ0OCqZAMs2XJdkGxAJccHlIyzAA3AI0eggpWSeWFtk4Y14lb7 - klZg248cBHz55ZeDAHAQIJAEweAUjv/atQBqCFImABAEfGLXbnP1FVebchWxAGJPMFGN1BaciHg+Kbda - KA5BMfXBT1HXWgm0VLWwzsgGoYnwpyPqZJMhARhUzJKmNFa8UlcoPZImUxeTNz0OAEFS4zgPxVh57hR8 - 4ESi4FFEzTVX7ySm6J7wDgBASrAG8/UiVINfzI+7nhp6ouCY4wkyv5WzJ6BnK/tQaOXx3VbnYokFSPkF - AtYdkFsgS0BC67CYLIRgn13pXS2BowuXphH7jUZL5g8cpe14WXTiw6jEbjZBGSzCEqLQLxqOHk4tTtR1 - YgpqU55A96IExQ8gWolroUKrqHEETS+jcvIUCm9QnrwOtN9qhQndHKVrAa8eqd8MRWzKVorajHPsW2lO - aXBzlBap39S7R9cbNONcYxQZMJAlUb8JpnhTgntNUWq2AgAPGHxgKRTQwPUHVAQWCiI2BkA8sOHehtzb - EMCQiY5FIvBwwNKoAce8Ru9dCGg1BJQa8bmyXGTByGpp0BKrBHCp14p9CzJkGQRybTxrpW4HUpIdcCEA - l3y2slzq9aGWAFDZunWbFQcA2h4tCxCwAMoCgNP+tJX9WD9YPQHLAgCNCX9y7xNm5CUjTMUapJAalzM1 - B5E/JwVWkkfvrTSX2IBEuWHjxUHEie8t4cfWAyEoldgVU7wjQmcckXOSJEzDUWechGaauovSNsR/hsGW - iMmaxDgupfKS6kEiUnccIulKl4VB9qmqFOCaSqbyzZj/tAFX55+YJnye2pOhrIkE5hIIyImjYEXBOySe - qL9tDhohNqB3HBvD90NiolF+uA0xdDmKjUVEF8bNcRkA7VtR2bCsA3z9w0qLBTCKB/htx23rcVdLIEuE - CkPbadi5AdrHVbFClWEJAGg0maoO/Wu2sCg4iESFRBo6om2p+gIbVJTiOzahrUZUalCpQqQ5x/wfiISV - CDszdQD8jR6kZTuyirYhYNec+v/GAEBjT6EldZqgGE0Bhqac9xXdXavbjP77iABBov2CZvjivM6CBiDi - 3eNdl9RvjvIJWBygCGi414IHomsCFYlApKFVbgDEv67jBgKORofAppEsFM4VyrqQ6wJw6J76hbyPtrJc - GnJPQ0AIscABsDQARBqwbchxPc7r3iZNFQxsabZuQ+FZ9YPNQI9eC0AMYAKr/gRWf4lnARzwt/2PVQ// - tPsWLVjwbZkAMO8as3//bjPi8qtMZWYCVEyEdw8DMJLVPxorIKqpiDAoThE9+1iFk2h/lYi/mUCnnDi6 - 5MQQiY6lS43Gh8WS4oom1aUUlQZeOrGkHUvc0ZbrEv/eKPLoEs3WizgLks5VtK+awiju2TVN9ek1GbrJ - INCzGEwKgSdaAz/5HmL7RcP2iynkezHAJLoOx0gsTL8YUnaaFhSN5RKdQcxA7D6i/zHEM6IT1OOA75nE - 65QZAERiSBnGCCAoeirJBJA2jCOdGEsDkVgBiU0f8joBjb0mYOEZKIPgZxfUeVi0YbEEbT8BBQJFG5aI - PahsgCjEuAk2fhGcTSAQUKORgFgAsNOHfGGlt7UF/uASDR9JEisQ0fQhzTZMpF4jsTUWQSdcq65YW5rm - xIQlDWup3YouTc0AgcYofBOU2ooPAEEQQHEFBgKGgsaU2AbAQefymQehc1bRkbq8T4F9vQcWsjBKwARA - 0XFBC4DHB5MgoFgwcNaHD0j1WwUAxAGKLBbulVshV8KCkT7PfqZASFaKB2B1fSumASBXtxBpzPthPQj0 - tN+oJcNEsSS2qQMwqb+HHz7UDfhfA8AkAGASACApAQMzZdzEbii2+gGUlj9N33/xwaQBPy0rC3AtALCP - CShXDb/CVKoMAJwED4BVMiYGJUFsPh0FSCINlqbcO/XoCgaqPFjkoDTq1eXrq821JedAU03hB6kBGOpr - n0ynnERSd3FE++3MPJh0CTDq4ltgSbTh/cmZR4qJB/kmAisjgo43YYz9rnkRQzAvRi5kTuGZAMAg9fJT - 3z4sk/5i+nnTgSOxTsJh9qmTcc2ejAyD4RfBe4V3w4rpgnRCOvMatmEdIPZ04FoxWxGDGC4SVQQAqR0Y - ZCERhyIbIgBfJG3D1D4spgDFzxU/gOeh7ALxA9GH5TpYS0GdhlH+RNUUCABUV6DCJMAhiTRiUiSrdrQY - fwIHVmZSigmkEhMjOBeG4qo7EY1HkhLUkYjzMAOTYnmWcBsU+VdDEcv+8/dtdoB4ig0EElNJIZ5iS5AB - CqUTEykSSm7B/1Er+Bit8HtbEhBrSUSf9u21W1JHj/JKges0xcduSvCOFb1Oc45boPBS1BYoP8f5gEV+ - c6QFCs81regWGHQvYu/Ta7Aq7Pv55/V+el/vM5BmHmgUNOGcgAIAsgDhv599T6u8nmViwcm3RByY1LH3 - HrIyBCJ6jQUdwKAOIGNFFo2uCWx03d+3W//7NCiGrYi78LDN/e+wAOBA4F8BwNQJkwxyEDngbwUIAMCE - jsWtWisGUBYI/DWAgWnAH5cJALgAjz/6mBk5YhRNQfG9iQPYoBmrZJRWTPLoscoEwI9PI+osX1+BvvQM - FB/fX00qUinKSSPQl842nR9rGp1xLDlHP1q/g47iAaK2pvIDT+HHnqTUmO26w76GeLJixmWjUGLyteKz - Rcelm2+kxn7Tz8+u9EgM/H7VJ0TXw89FWaMVr0B5w5uh1C1g6LUASJDIloiUHIWv0SES5QcAAISaXQCK - zkg3xkZT7BTRm4Kn3ow8Vxt0gCSslwcuNfsBHIBNeG/eU81EkTBYgmG0SpdEdAd41ICURqSRHQERmIRR - 0If1mbYLsUaX8XfEqT4BKnE0cxZjGwEW9bA6GDAaVwfJFcmILX+3jRvYGQW4SBLNLRR92AeFZNuBSM/T - 6zCUGsdzjuH/AEmJpVRY6UPFWQCIdNiX2VRi5uRSjUllZn5tinAY4FIvHyVC6tdh5a7DysyQl3p1OK7L - Clof5WmA4jREGnlSpxHKquNCrfIoNmJXXZRUyuwpIoqNkgsMrLBvQUaKD3jkt/SAxL5eoGO3vMYHHF2z - 4KH30GsFFAKYlnwOUiALgs/LD1gpde37c97fSrkL+F4FgITuFYg4gNBWFkrtxnwPLBrFCupjRbgS4O0l - AHDkIKBXDjxHSu8UvwQABAqTAYCBffv//VcAwP++pbBg9uyPj+QC7KIt8lVXXWUqViL3flK5kii5DaCJ - DETwTHn2FFaaVDjoVpTX13QbdatVIM+eQ/BLU2wHHESRfvzWZIBDPfXVPktVe+qx7xXPqO8+K6MKbejh - n6iiHPnVFOrEsvLaluQw8WxxDgSeWJnZMPsSIjnGNI+NU9di38+niUmsb7l4/r2AixUbAIumpkHmv7oc - RWUg2UgW4JKtICcEo9oobV2fQkz5c6Tow7gYcjMELpGkH6OKASXcj/A2WBDtAYQOKD+KH9mF6+pCLKuD - 2oIIuhGrLkEdiC092K8/iBjIPqlONQqNYLRZlGjDWC+2S7FEcRYyHVEQfKK78X1VmwBtOIpW59GwCkUb - tj0Fi4iFMKglDkp0fHOeHTwAUYYToEGLDi2mZGIDAKIhFhrbLDoJq2lLfj0UrwDlqovyNEA5meZUR+PY - 8wCAXMzkfMZn1QYgcpHaHEty8alz8aNrsQLX1vQn7tX5PACDexvUxiTn9fUKWLULfHDJ5xqAUr8eIFOf - 8wBL3bps67KthwAydRry2YhAJr8RoIBiWmCQy2H3UWgbb9DWs1LysTRqCyysC+JZJQW+BWItFVktgEU+ - YJAPwOTrtZyT5PN6AUBeYX1cDkqWee9H4P5Ltm9XIFByZABQOTAAcHDqeAsAkp/9rSwCAUCnolatlQaU - FXAk+XOtg4Vz5nw6d8YMOxD0sDQgWYDHGY00HBeg/IlMZK0AAFDqGoN56wGAF0FXqk3BJ5vLt0qPoksI - Qrn9ZI6l8ElSeruv6jaX51aZrB/wCvjBCQqe2c47En7UVvxqPUzvODIQcSLw+HX8cartlx8vth+MRVkn - 8s9tIFBTgcTok9UCOETHYiko8Ecq07k0CgbaoKDOcS1Wx3JzSHXGwgJUTEAUYssIFGvQMQg1YITgo2II - dvhIqaYisTyf6Fq8l1yGugAPq3yMKhGZXxhbn+NGfB86EMe05BiLQAVGUcWcs41CRR1G4WE6qt5BFOJo - OhBHEmPxWpp7rL8YKipFJ1ZnYVubIJowgBJJXYKOI0WWUqEUJcIaIRZHMDCJaswkBrUkD8Ja6I/lNgB+ - BhObM3qSHpP0JrXbnRRaN/LpzHnIYeZDDgNga7XTiHaIQsXk+VvhPjQll84syNpNIe0oFqAVtSEKWx9l - BFzqouCyJqTsdeqh8JK8RhYsrDhQsVaIrgEmtQCLbATQERDpvO4TANUFSOrYe4k38L716nNO7wmAFWgs - HZZJHYkABaApwFrJL0TxGznRii/3g2NARQBQWwBDzCGPc4+w8ku2ofzbbEDwlzMB3GAQWw48e+4BAMAD - gfGTfvK3hq2ZMHqsioGOC8jRgMBd+1eA8MfGDxZec80XZQGAsgCaDnzVVSMtAPwdFyAWAFCe3AGAtpq8 - k5iOfw9JJTWo9BqQ4YOB2IJa9ZNQdLHz7AANthrDbQk7vnmr/ZLcvXL4jtWnuX0CBDvqW6k5FEKSiWJZ - pZPyeem86FQUwqb1PMKProv8o/NK+0UloShO1N9Qw07ECVCNgxOXItQgVNUCqCZA1oP6BygjIEKUmowI - BLA+FATUNTuOzFokXuDQXlM/Ab3O9hNQHwGovIoHKE2pmIAdUQbIydLB7bFUYj0XRfotiYnshkhC6kHI - MJL4As4pAJjPe0mU6lO2BMpwXFP+f5oCKs35fKyB2Nbs0yw0pg377QFQ6isSu/Je3XAZegLQffh/YEpT - MkCQoilOQ7De2KaeSkzndI5PB9glHKecyv8n51JPB+hPJbZzGq7GqQjpRE2FStH+YEBkIDJAgAI/pC+c - kD6Qc+yoeEg5SBZj3zU4JlsToruQl2dcfE4HYhEMlsllcnReawClJdJMg2URVvZ8VmhJAcBSUB+lrYel - INelwLNW6ggIkHyAokAgYi0YgAELpi4gUgfAkVtTYsnoGpaKrhXkARx6Tb2mJo/327ZtqxW5ANsFAGUM - BQlMBjpILQCKPxEAmKjtzz4YeAAwygKALIDScqygcDQw+GOAgCDgN3OmT/+FBSAA2P34Y2bE1SNMpUoU - 4lSne4sKYVA0l0O3eXQUKI5VWOw29eGzpr1WeSm9v9oHV337Y1arLK36TuFRdB1LwQ8j79gR3r7577bK - uwfEjv5SAE4KT3zCWSYldF/OW4W37cwDyq9z/rEjBZX8XT5YBM97hCFRoD2+gKMK22OfSGTPOcqwIxS5 - c7JQ4CnEOvqwKMSIKMSWs6BmIwIHzSUUl8HyGVBY1RVAHba9Bfy5haIOW5HL5HoK4OfbDsZyp2ADClzt - KDKVF6vsGJBOIjCoASPpdVnp6diUXZ9Vne5NtZpojiPEGWY5ZjOMNbsIpbSj3Fn926G8HZBOKHBnAoia - +MRo90zSiBk94G70QeH7AgxYEKkofepAXIzBgAbj4bS1wKIxcQCEJEVgMoStAOY0ziMesJCeBFy8+3Q/ - rz9Z78X3xUpJZ4ZkWn+2fTjuQ4wJYEnjszO6AzJMoMrszvfrwncHUHI1o5Ix9TlkOezf0UyzKaE1K+Yg - C0Vg0ghwwUqpbQfZAgANAADcny1bt1qxacCyAeBgcDSYDwAovpTfggDK78m4EaM6o6UqBnJSFhjo3LEA - wpHA4PcBAePBvz2SBbBn7+Nm1CjSgCfRuvm46ia+CitMdczNCJQnhtUTU1qms/Lr8aTGVPCi2nb94CzH - nYBeEj/eZH6cSfwA9SN0q30iP+hEUmHxUgJx6W3unPdhX0M4pfhW0WVSW7KNLxzLCvAsAd/ct3RezyqI - TmclL6XA1seXBFd/BwbapvC3+EVOFhSQoJVT4vLI7XHWhU8h1rGjEZeAgWs8WlYHYv/ckRqQlkwrtgxG - sRpLUYnts1HK0Esd2vShwNQWF+mZes/Ys654/qIGCySQJP5PUpShyUGBc1B+CFsa2JLPxOZ8TWxmenNe - noa5aB8TmXOa6JTHwJfauk7TVw2AyW+A4iB5DTjPlOf8+mzZ1wj4WrgDtWgNpxHxtZuzT6YhpxW03tZS - SBS0PaDCim/dCrY5WAKZWAUZjI3L7ClQYR8lz2AwbFo/AECAMghQYL5kymAEYBGAJAEkiWew6JyOZcL8 - yGRAJOkMrBkBi7an8ZvDetF9yQCQRNZN2mDel/fLAFA0fDa9L5+H61MLmnIGlspWawH4Zr9iAL8EgRIA - +OCDD1QNeHAKyu+L9qX8sgjMmKtHdkc7VQugQKAkCAba/y3WwR+bPVAx0JEAQFTgK4cPN5UYDXZiYkUb - XY/En41Md6snyqa6APncTA1yuXUBQQopK0WqkxXZV1WceulH8R8RyXmGbdgotrrmkAZLxL/WcI548uiJ - pMiUMlOOXvl0zw+X7+378jK1bSsvBfL4bEaVK5dv8/mJnthjlS5LmYMrv/bdyo/SlwCDr/QCAnfOgohE - 7oC2chV8sSDgagoce9C3DByj8EjU4cNmEzhaschErsDIkYh8clEJe7BUD8ISYpHjDQSIQ79oVOpfk+Ul - wpAaiaapYpNqzZx8b05Drka3oejq6ly7AIWug5+PstvzjHPLL8DHLxF8aExwSR0CiAoiFgAY2tYGRGoD - It4oeG9cnMbHC0xqsy8pqIPw2gJM+Xz89vy6XOfztFV7+XzAxK7QhYBPIcDSiCazTJWu1RQQEaC0xFIp - woVojcBnyGmnuZTMH+iMFaA5lABKOjMp0wGTNPbTesNI1Wi5fvz+AJWUgYAELehTZKEACHJf0ilWSh6a - YbZs24z57wKAR7YCNBXok08+8QBg3MQDyM9WUH5fzKgrrxYAqBpQIiBwcqyAcDTLIAgEv90KoO7/02vK - CAKKB7CLoQhXXkRT0PDK5n+a0BPw1Gj6AlJjTkosvHcUVFy68XQjN0/qLKwrke4u3ky+SFJgUZ1Ib7UB - FFqhqApwEZ2OayzBYmD0Vhxpvdg6SD7ncnEjVGtPzb1d+aUQ+NgeUYfXsx+NeR+LwtuIfiTXAAux9+J0 - 7AfuoulYHFOd+8M4FwEARKK0EroYx9TE/w9HwSORKP98NFtE90Vpn5bn0fGIGp/Ecx/NT6ITvdSnK4VW - nMAe+xaHzf1L/DoCSyXGVbKioKWbReDPHrDHSmuWNZvAr0osbR2U1BTIZXJWQbBVubMCyqASB8HAul7+ - qHINF1EfB/VuUNPWHOY4qG17jhq51ifYp5Hs2ko044FtbkOUkOlPuRoCg2g/j9Vfkuuf18CXPEAkrx7V - hfaaf299HaPg1pqQJSGFx4oQ2AAQmiFZwBi5PFkZgIUDjzp5AAQzJq1FIjDhnnyd08zJXF6v8wIRfPzc - 2nyG5lDynnkWTDiWAFw6rlWPQSV8z5xGSGP+zib8XYX83QBLbtt6JhMw2Vpi/vtWALTgMuIABwUAn332 - mY0BoPg/BURAIBKQufryKzuimRV8cUBQGgyOZCEcKW4QDCQ6EPjtAEAQ8JOyAEANQXYxF+2qS640lapW - Nn+LKmcJMNENSHkVkgdvjrRCilD+InLkxRBw2gEAdNFR2kvpK3W/iWSIpk2FkTePhEasVFekOucol04l - XzgtuiJp1WWj2j2IYAMiYR0BmI7co5RayVRfzrVE+NwIcvtRdCeObAANWXn/OtyXz/vlITl8LoASqa1v - qUSywkcmc5xIRFwdjWJRch8EIqO5huhYoBGjtufVec8a3FeT84CDpRDTEl3nY2ui2LRGs69XpkCMQDIF - tncALMAYAoJiE8aITuxXT9oOxP4q74qNtOJbEBAguJbkmmEoAFTpsoR5hnargSW+WFpxgEpc4iLovE8l - tsxBdScOFhrpmBhNAgCQ6AdsM+gnKCvAAoAmN2lYixXNdWC11WAXKb+mOOl6fXV79re6T4NeEPta7eu6 - jgUiPiBoPwcwyREQACC5Ghcn8PDfX5+RA1DonMbF2S2v1XUNl7FuBufyUF4LPBpAA4i442wslBxZKrJe - UP5aWB+18jyrRYqfA7jUyuU9agEYAImskzwBjdwdSS0Agmv14EAIZOT7qwqwROmPDAAHsQAEACj/hCAA - CBAsAFx+0SUdY2NiKqGdJ/riwKB8wDIoyzo4WtzAWQVBIPjtAEDq74gAsOfxR81I5gJUoB/A8ceX9zvl - UpzDChmpASEoTpQkDiVKImeuQJki8WytSyCGnJpukvaKg6wjibXpL5RIZB3Gcau3nh2+STuuqGIaWQAi - Uv7wzj5jT+QaOP+R9OgLl6XRS5YH12H3hXVHAJvw7gBQ9whTvXu4qd4twtTAKgnTvbD8araD3NMRgfQT - 3gb2YGvudQKghDXnXDMAqBFA1IjPrsfn1QXIarOfy34eVGM6ACm+EJnm/41kF6xrgLWg1KEYf8oOKNqv - eQmx4bJCOGarTkRxdCRS1+GECJQwDKmJ/y7OgptbqPoFUYlxhSTKCKhvQIKyBuzb4KDfaESBQPn5aiZi - /Xx/1Y9H2SWqhlQdgQcGPo1Y8wpL6MR8FvvJZBBUeq0WbAKBLIa1ZBEUzGog8QKE2reKbdu8s69z2jrl - d4DhA4G9lylQ6gZl9wOAks37W0ABJHKwJg4DHPd6gQsKrvsEJlmySuyKzTFzJC2Y6LWyTnTckHs4Z8UC - kM551z2g0vvpPXS/3tcDNX22Z914n6VtPunCXEDG8QCU/ttKLEBSygJQDMBaAH4MgBVfADDBbQGACWIB - mkvOv6Bt1SpVq6CdFX056QhgEASEoJvwr4DAgcBvBwB6AXw2t6wsABbAHrIAV1IOXJ7pwH8rV96uYpq4 - a81jgoBqDuoFA1Fi7YtYw4ppc+rKweO3i5CjH3SShm2qY66GdtpW2ygHW9thF58/Qe24RNBR6k5BP+sG - KJ3H+2WxzUVqo3D54vZ7PP/I+qz8hazssgaaAARNpNBISxS3iOM2SFukHeDRXqw/lF3WRVfAoSfHSDgg - InqwwKQmxxLL+uuB2POAiMCEfbEFnXUSDn3YWjwSPkdMPxGCNFE4EglvyrOAQhxLD0L1IoymA3GsZfgh - 6jysikPcBtslSJ2HZSW49CEpQzuoFMBQcDVOHYgAERsfiQAAwoiphHmxlARiKepElAitODESIc6SwL5i - KxZI7BxDNRgl7iJRpoBgoEqw0zRaLAtXIBtXgLZtWQVq6SYl9gEBpXLAkKOMgY61ymvOg7YCBsQDDQGE - lNaBiAMS/36dlwhAUFxnPdhzdlKUp8BWmQUc/hzJTBRU5zxl1uu8CVM5eo11Xbz7vWlTHlDYrbVo/H2B - hQMF3e//HZkCNFksAogmdU0mf4uIP478I3dAEgAAKf+BAAAELAALAj8iJQBwwbBz26KZAgCJLAHJvwKD - I8UMysokOGvgdwHAR2UCAGnAPbt3mathAparUN6cUOlEywNQIMyl1WxePRgxVx4dn9nyA7AAlJ7TViW4 - NoUlSqvSXyrEAUiUAlMLbVswI3KNzGdlFqg1sO23bIEN7yE2n6r3qD3QcRwxABsLwPeX3x7rYgDWGvF9 - eAX8ZO4rMKhWZqzekRkoKUw/Mf4iJT7bT0VO4YBJeEOuS8T9b8L9zQAYqMPWxWmDi1PsWSdhWCeyLsK7 - UGsg4NCcBIBCDUTD5fKoC7HrRCwaMWASoaaiuDxhog5DLxZt2HYchjGo7sOWPdiWfdGGcXuiZRmpFkHA - YoucABD1HJTlVJ/nU8DzywccKHQSQ1IrfpxGodmeB17XoQRNORb4AgKJUn7akwkIUhNIp8UQJJMkEiCj - l0MmNOGcFFbDZEznFBQinf10Vkh1fNYgl0xMcjvhyZvylJPDPbkIg16ycjmW1Ebh8lBEAovar8UYOKvI - HFsll3VQsu+v8g09YHCuQ5YARUBCqjKLLtLp1urwFZnzUtpM7rfKa60WzulY+1JsRPvunEDAnrOf4YGC - AMOChvpWqpcl1xXzyOQzH3pok5VtUvzDlV9AIOUvAYAPP/zQAsDksRMkP/pbgoKeBXD26WeqLXh1pBpS - NQAGlUsBgrMMgi7Cv7IKgjGC3w4A186d+/YR04C0BLuanoDlAYDyxAHiCDzFBsg0ZaXKDsvD+ykzm85T - Gk8pPJfOc7l8/7wFC+XXAQybwxcJJ5Dfj5Ei20i/F4QThdcG7LA+HJvPWiW+WyJgiFEAMMIP+OGz2wCg - Oxeua7JYPP8/CqvFFjupPBgAUiBQWQYBj/bt58nsp5JQLoG2og9rX25CFPMSovMJPBKTiK4L6w4ltZ2H - G6PAjflcOP9R1AJE4OpEUGgU0QZFV7vxTgAGgVPVDkR15b2oJVBrcsVNbNk1BU6WEkysxMZNFEeRQCUW - +y+azsOiGFv6MK9T8VQU7xHdxacL8xnR6jJM2zRZKDGwDNUkRKXY8bYAC6BQoRAzFdPrAwQoZIZWdKY0 - ZTK4NROrIBOlVv1Atp3spE7PKDjAUEugkAFIMOoth30BQ3Yaip/KPqJxcbrHXuc12q+VxmsFLoBJbjZb - vV+OpkRxP1u9v4BF8yYlWbV5neZKIln5KCm9Jz0QQZg7GVR2CwC+NWABwFodtChjBqWk5F7Oq0W9A4YM - FF/gkM49Gx/aaKWM1V8AYFOAPg/g4EcffWQBYNKY8T8iP0gAgQOIkZw6aEhLNDMMqeFLWWBQ2jI4Wryg - LPfg93Ucggj05pEA4AksgMsuu8ycCBOwQtVKHuHGNgY9lFMPgsBhvfYCffcEAFLuIIGnZN/22PN79Smn - HiT2uHSbH1dwMQYXZziMuBNk9InZV5r1B3C4yL5NDTpOAPELgUg0ym4VXaDig4sFFlkXvgTBxoKEAoe6 - 5oOGrBJrqahEWE1HlcGwVGHPwrFuDpaQUoVuarFN/0kU5KMAqGRIiXV5cCFU5KTqQyyAaHofRKkIqjmg - 1JqtZhOo75/KoTsi1AYIRGRZCASiAAPNRIiiJblak2v+gVqWe/Rgrg8CKAbxPjQLiVY/hwF8x8G4DUx3 - 0uAWO7xFg1wY6JIo6YW70QWXguEvKR1IoTEMJqUDOfq2bIvYtiTH3gyXgmnP6U3ZNiUlV4gwAj5TxCPN - hfAzD2oim0MreXERbIESYKDZEtmIwEAt5bNT2M+Q5aFjAQmSDjgALtkASDbzJQUYVtR6XrMmOZcFkNgZ - FYCWwCuDtvWZfE5mLQ88BCIZtoGtOlezTyNbWQbp7D+44QGzdctmq+Q2BuAFAUsUPwgAjAc/OGfGrJ99 - 5f/eB4CDDgAG9x8oCyASCfelNBjIKnCWgbMKnItQGghKuwZBXsFvtwAEAEfKAuzDArj8isvNSQwGUVeg - GH91/rUA4IDBKndpcSt+sFGnC7L59QZ6fbD+4BeWhxTekX/8OoXDiD3K75ci/ticv3/ey/UDBC737/L/ - jgOgOITfEdmCg22N7m+VFnTcA/ESXCtx/V3qPizegmjBFgSwoII0YvUN8GsJRAcWtdjdW3JenAj1EVBA - UPES3adzuFMlE4nUYFQEIOX7RRdWd+RcFBhASWAwSbwCr8QhYmldLlEVZbRKsdWUhclOcWrW0pH7oAkn - aXwbk53ie8HJ6MtxPw8M4gdyjpFvGsOeMIjjwcjJCLMH4hjnpslOGugSz4g4e01bXR/Id+hP3IL3SeL9 - EvvwHnZSVKpJ5nOS1DCGkXApHcjRMyYuuS05ekacp7UiPtHEA5SMxjD+GiKNvCGyGVgm6Zj56TLn5QJg - JWSh3OkQnNI1bxIwycJCyaQtXQbzKLLSuc6xk2xcnUxmU0iysEgEFjlMt87idesfeMBmArbZzkBlugHW - FSAIeJBaAB8AxmEFWJEboNXfgsCQgYM7oZkxSJQPBBEBIKh5BKugtHtwLEDw2wEAJuD7RyoGkgUwYsQI - VrQ4xoOVsyuVqwXQql0mW05BvICSB5Xfrfq6fiRrwZ0vbVk41yIIBEFgcOcPY/sFmX9H23dEoFIsQMsQ - dKDgWxWH0aAdaAU7DTu6cClikMcS9PsOBghAh00pFn3YDStVGzPowHHEXbS1XYZtJkBWhEchtvRg22tA - /j5bAYGoxNxnswg6jyT6GQRlExQU1DaewGCiZWuieLADUzPVy0Et3Fm5C9gSCExH0ayfLeqwVnEUMJ0p - Tmn0FchogUK2hGSDoqa2hmXHWLiUjkhnypM78d6yFLqh0NQc2NFwKH68wKQ/INCf78TsyIQhAgliRIMp - KxdgCFgAEQGJBzICFP7OARxrjJzABOskvi/XGBwTzzj5xN4AlsbQqcZBsyWZiJQIkCTxfZLbEChlZHxy - K02dQlrwPRvz99Xn78DFSa3L3yKLBAsgi0BhhiyAjQ9aNuD2I0T/fWugNABgBTgAGA8AjAcAxgMAg3qi - mXFIrA8E0aXAQBaBswrkHkiCsYKgexCME5SOD/x2AKAn4Gdzy+gKLB7Avn27zc033mSmT5tphl91tVm0 - 5Dozm1lowy44z3Tu1dO07tDB9Orfzww+7VTTe0B/2/TRNt3kx6424XWpulLuVvReBwolpr8PAtY1UMTf - 793nYgBlgYSuHWrm6RX7lAaMIACUgIi/YrtrQXApOcc9ZYHHkeIch8c6vPoAT5S5CB77+2UxBf8FZbiE - FixuQEAOIwaJCShSUKnOw25IaclW92hQqtqTiypsR5MhnBNtO5X+DWmpXhOXDIAgKwsT2U5y0kQnz8e3 - ZjarZCYmtncO09ua7Zjx2nI+k6lQGbneQBjNhsjW6szAmIwCT+nSiTFkFrI6N2HFbsp9TQARpkuntUAx - i+hhwOqfUsz3wRJI6oCCd2LLINmkbig2sybjsRxkPcQDKKpqjAMY4qhyjFeVIwBhqx0lQ9g/BZfqZEAX - ibVbLCGuyTqJA2Bi1CexD6/tzWBZKMbJtErbtGWTTwcmA3A4CNj0nwMAegEcVBDQcwE85fcsAAsAVgb0 - 6dezXLlyyWhnAhLvA4EDg7KsAsUKgkDgwCCYPQhaBI5D8NsBYOmiRZ+XyQQkC3D/yvvM5k3bzEMbHzIP - 4Btt2vSQ2YJ/tHnzJvPggw9yvIljiic2bzFr1qwxt9x2u7npltvMPfeuNKtWrTG3rbjDTANcrrhqhBkx - aqzdn0LK8azzzjUdu3djYmuRadu5o+nRr4/p0aeP7dmuOgCBhMqLBR45dfI9UHFWhUxrP1YQVMLSiipl - PpryHu1aEBR+PQD8UvlLaMFKo/rgcNjKX1YHYtdsNEgNdqPK/fbiv+g+7OjCZXUhDp5TibXcBTEILT1Y - nZhRPNvLgZUdXoAYgnaykwa9SFBiKyi0FQKCkiyUPQs/2/rfdj4k+/jcOpeJSW7nRhIEzBZYsC8QycbH - 1zaHgKGChjl0j7b3Wf9d9/B6QEXvpwaznj/vvaeAJR0wUUBPQctUjZRvSAyiEVZMIcfEHlIUiwBQUrBU - EhikklDE3yerAMtEYJLYDQuoB78z3Jw4WRK4KKojSDwt3WwGALZs3ewpfxkkINyCAxK5AB9//LEFgIke - AFiZPIbVfwwAgPTp0av7CX8/IQ3tFAgkBYAgaBUICCRHcg/KihEErYHfN3hk2ZIlH5YFAPQJMLOmTjWL - GBN+94oVZu3995n77r3H3HPH3eyvNtt5UI/t2GYee3SreXTHFrPz0YfN47seNTt3PoJsp5LwEbN3706z - 74ldHO+w/dXVamnnzp0wrQCVhx4EWDYBIlvNxo2b8b0eNLcDGDfefAvbO60ITCZOmWEupyT5ckDkStyR - q0aONEPPPce06dzJNGR6jEY7t+vSybTv0tk2tnRugUBEuW39kI/krvxWgDjMPXFxiqBbE7AAjkXRy7rn - iMVCtkLSX/VLb/+V4pe6bklEAIF6DNrGLZrUpBkOVvm9AJknPgjYcW+++Cm0Q9c0+LWU6HU6JxPb31pg - 0RQpAYRGyKHMFkAUoAM8ZEGoUCmTDICCdgreCRyyBCAZnh+vcxZsAJ1MfPiMVHWh5l5dRzIFNPLtU7mW - BoghalPvQErvn0EthKjQaRZQACrSgGnEEx7atNGCwLbtHgfADwI6LsBBzv3sAEBZAADgRwGAL8oGHECM - pHvnrj1Q7HREIJASAIJEHwzKcg+CQOCyB8E0omIEChQKBJQ2/J0AsHjx62UBgJqDzJgyhc4m5DTHg2jk - NSezP3UC+xxPmzTZzJw6A5CYaWZPm23mz5prrlu8yFy/fJlZtnSZueG6G8ytt9xp1q1Zb7aQV92ymdQK - hRY7GLb41JPPmFdefs288NzzdgDpk/t2mf1P7DR79whAdtjpLLtoRrJ792Nm7+5HzWM7GdBAo8bt23ew - /7h5lFZl+s/ZtHkzlgjWyQMbzfr1G81tt99trr/xVnPzrbeb65YuR663AHLBJcPNmeecZ84cdrY569xz - zYAhJ9v58HVoDqmusy2Yaa/jArrQxAYCjipjliUi6+NfWgJHA4Bfseo7MPBSp6qQ/KWUCQC/Uvm9KkJW - R7/DsP7WFM1o1Og26xf7KcAgACjtZiUIDkFAOKTwJcDgQCAIDu6csgJkB2x6zgcIl7KzW8UefCvksPNc - S8dKkWQAIiWiOZRyP7BArIJrMpWOs/0sACCQydRqAUuGXxFpAYW0ZE4GRCCskfXr17E4bbSNQLZu24IV - gPi5f2f+OwCwWYDpM39A+R0IaF9ZAQsAndp3EABkIRkBIEgtAwjkHggMFDB0cYLSQBCMDziX4PcDwNJr - r91bFgDMBwCumTXLKEA4C7N9BtbArGnTjEhDc3SO4ykT4TyPHevJ+HGAwhSjuejTRk02U0ZONJNGAhj4 - QtMmTTIzpk8zc5iiMn8OQLHwWnPdokVWli9bZm6/9VZz3z33mtW4DWtWrTbrVq/COlhntm3ZAGBsNo9j - Veze9YjZs2eHefrJ3YDH0+adN180r7J94bn95tln9zHIdL955aVnzPMc79+31zxBS/MnnpDstWCyk7qG - HRQ37XpsN2DyGFbHVtyah8y69Q+ates2mFWr12Nx3GkWLr7eXDN/sZk6Y5aZOn2mGTV2ohl23iXm5NOG - WuCQdO3d0zQvbk2hC1xyeOx16DgjyYHoEjTxVY+vlVVKrABgrFwZJ6WPbezEK30OyjGDwK8EgJI6gQAA - JNHCLZkmrukUClk3oJSiiyXoibMKPOZgUA6zGJzlcNStR8ZxgGEVXsrvFD8IAACCDU4qnhAUmxUInBM4 - 6LrO2XH03vvZc35w0+47EJEFwOqvgOB9990HADx0eFnwIQCwKUEBgGIA7733ngCA1X8sACCxQFACAK2a - t1A/gFpIjg8EmaWAIGgVBOMEDghcClGBQmUNHAgIAGQBKBj4+0aPMRdg9WyUuazGoAIAnZ83e7YVHTuZ - G9i/ZtYMo0DiNSjMrAkzzOSRk8zEUVgMYyab6eM1Iw1QAAQmAxKTxyEAxiRkghUAAktjPsHFxQwpuRaX - 49p5yDXzrfuxCLBYtmSpuX7ZcnPTjdcTlLze3Hj9DeaG5TeYW2661dx7zz1m7Sr+0x5cax4GsXc+ipuB - hbB/3xPm5RefNG+88rR5+/VnzWsvP2WeeWov1scewGKvef2VJwGPx80zT+4ELGR97DJPPbXfPPP0k+bp - p/YBNPvNk/v3c20f7swTVvbs3otLsx+XZxeWx1az8r51FjSW33Czue666838hdeZ8RNnmCuuHmsuYqbi - hZdeboadfzFB0qGme9/+pmOPbqa4UwfTvE1ra3nkwD3PptDGVtYh8m+DIJHgjwjTih8EAnvsi2cNaCai - +gNo67sHLjhYqmqw9HASLwZApNwfOJJqAcCLjHviKadMeDsBWspkweGQm3AIFALuwjEp/6E4g4s1/ELx - SwGBU1q7+kupfSUuaxt8r1+ARvB1ckMgDKXyt91x153EuDbb2NZWVn+fCux4AJYK7ABAFsDsQwAgIMAC - GKtYABbAOFqW1W2HguYhuT4QZLOVCAhkFcg1kEXggMC5Bi5gGEwhiksgl0AxAVdgJPP/900fph/AxBmT - J9sV3Sm8pgVLggp/tH2BxHxW92umzTKTJ0004+eOMOOXX24mXneVmTp7gpk9FeDATZiNBTFnKoIVMRuR - RTGD45lsF5J1WH7dEivXL1libkCWX4fi404sX7rULF282CxdtNgsYbt40bUWGBYz1mzh/AVmAWCxcD7g - sdC7TlzDvu6G5TcCFrea2265AyvjTnPrzbgH119vbrp+ud2/9+77zOrVD5j1a9ebbZvWmYe3rCW2sZbA - 5wPm0Ye3mn17d1sL400A5PWXnzQvPcfx8/vMyy+9YN568zXz2qsvmmef2UPrNPrIbaeOnMDR5s3Ipi02 - MLpFLsqGB826dQ9iYWwgULoBoNrMdr1Zee8qczPfa/7CZWYBwDFvwSIzc84Ca3GcDWicfMZQM+T00wGP - M02/waeaTj16kXVpR+C0NSO6GWhBp9taWB/ZmORZBEplmqcwpVnAEJxBqH6NmjNo5xHa/ooy+70sgHUD - BACMFEuiMjAFySANmAEApFuijDP3feUXacaa3ACABYTDQeIws/8IAOCUMnivO6fYw78CgEP3HlrBjwYC - x3pNDEJZCnfeeZelAG/1AWDLFusC2Oi/CwAqDoAFcMAHgB8njmb1l4wa+0+2P00a7QFAg7r1VA6cj9T2 - xQGBLIJjAQLnFihIGAQAxQC0+osM9PuYgNctXNh2zrRp/5RyzvPN/mNVfHeflH/edIYkTp5iRs69xIxZ - c5aZtv9MM+GRM8z46y810wGXBVPnm/kz52BRzLTgIovCgoyVWQZCkrkRd+CWG1jZb7zRyq033WRuu/lm - u5Xczv6KW24xK2671dx5+212e9stN2MJ3IRlcKOVW7hH9+l9bly+HBBYbpZdd50VAYmOb+LaDcQIli2+ - DisDAJk7FxCZx9YX9uUCLZjN+TnXYJFgnWCVXA8g3XH77bgr95hV9600D21YDVBsNDu2Pmge3Y48/JDZ - 9egms/vRjWbf7gfN3l0PsN3EhKXtZs+uLbgyD5m9j2/DEtlpXnxun3lq/14CpzuxKDSEchuWy3ZcHmId - 2x42jz7yqBUFobYAKg+sx11ZtxHXaDMZlrXmzrvuJy17E67KQmQ+sY5ZZhJAO3zEOHPaWeeZPgMGkZrt - hwzE+hiA5dHZNGJUlvrv59FsI5dOPuoKbCmyljabb9K02uarOtCb9izTXJVztrpP3HxMagFAFlZLDiZz - LdFpfUX3KgDFuxf/3zfrnXsgLoG1HqRknqLpvTMkgRXe+fTe1lvhD4ln1v+rVf9fWQRBsz8IJln8nfo+ - a9eutQAgxZcF4AAApQ8CwE8CAIhAB7AAnPILAH4AAA5YAEBaNWvRGwWtixT4QCAwCFoERwKCYNZAIOAA - QC6AVn/5/jL9Xcdhdn/jPwAgihX8Ea3Gpc38YwECrf4LZ6HYU+eYCZPGmYuvO9VctbOnmf7OADPhhX5m - zD1nmakzx5t5U+abeTPm4Cr47oJchoAbITDQoFIp6fUAwfUo6o1ardlq1b5VgCDFFhiwf5vAwYLBbYDB - 7VYx72BfW51TXEFbKzpHJsNeQ/Q6vY/kJt5bn7kM5ZaFofjE4gULUfy5xD9wabBQFAydQXxj5hTFQabb - WMckXJexo0aZ8SNHmwkjx9EGagLXp/Ca6YCc/kbPypnL/rXXTDdLF0w3Ny6dDzgtM3fccoO56/abzOp7 - bzNrVt5oNqy+xTy6dZXZv3uLeXrfTvP8s7vMay/uNm+9utu88/oe8+Yre7BE9uCC7LSNWveyfZL7FBd5 - hOq1Rx7eAWgoy6KA6WPco+Dpbq4/zo/4YeId28zqtQ9heTxoA6Yr71ttbr39XjN/0c1m4tSFZtzkOYDH - TDOGRpaXXjXKDDnzbOuy9B7Yz/QbMsT0HTwE96WHaVzUzPb+l9S3U4IaUK+vphsq7IGnb4tt1B/A5+T7 - lXZeEY6qAlVwUwAPX/citozXAYYLIPrcfZ+iK8BRlF6gYS0Ea7p7W2+/LBFwHAKQoNI71yEIJHqfLL6/ - iEDy/0X3leI78Vd/AYATWQAHaQt+YNa0GYcAgNU/CABdO3Y687j/Oa6+DwIOCAQGsggcEDgQULDQxQhc - oDCBc+INCAAUA6iCiAfgTH9VA6opyG//x4/4eAJ9p/4eAFjAyr5g6jwzYeo4c+7CweaMta3NqP3dzbjd - /c3E+843M6+ZZOZNm2ethMMAQCCAKJ4wh61AQIFBWQI3ONGK7QRlvVkWgrMSpMSAghT6don2fVkhAPDB - oAQEfGAQkNzK/e51FlgAFVkG+ixZDvoO1y+V5bDEuh8WGLBSZKnQRMXGPKZOINA5dhyVX+MJghLzYKsY - x0QJ5yUTJPIJoYZOoknEhDFjzViGrYy5+mpaRl1lRg6/2oy5cgzXmS4zyXOP5s4AaKZOtmByPZmMFfAr - Vq283axffatZv+oWQONms/LOm809K24xD65dYR5/5D7AYx2ynmlOGwCKrebJJ3aY555+zLzyAvGOl/ea - V1/aQ1zkcWIde5AniIU8iQWyHzdnD3GOPcQ4cGV2P0Hc41nz4osvmXffedu89+475oUXXzH7n3zR7Hr8 - GbNr95PmMWIhW7BQ7l652sxbdKMZPXG+GTVuJkBCwJTs0AWXXQpgnGyKO3cxHYh5dOvb23SBNNaqQxvb - htsqvDoIqUMQVohEwVMprLMSMq05LvGzA7IeBB7WJfHAwLofAStCIGFjFbbKT+8n8YN/WDNp1q3xt2WA - hsqIM7BUZHFpOpBtDuqDQBkAYIOAb7/9tgUAuv9KfrCCBTDRtwD69+pzefny5QvRToFAvVJAUNoakEvg - QMClDQUAigPI/FcqUKa/U/7gxKHfDgBCkPOHDas2deLEW36LBSAFnjdztlkwfZ6ZyY/30jnnmJOXdzDD - 1/Y3Ux48x8y5Y6xZMJ/rM+YSJGRlJIMg5bFBw4AIAHRtMbGAGzDXLQjIZNfWN+WtNeAk4Crc7IDAdxuc - teDAwLkRshqsOyFXQa+R28D7WAFcrOLrs/jM4P71fA/FJpYBBMv977acOMNCXAVZMfNxYWQJOYtGz1Fu - hYBCW7kTc2fOwiKYgaDkKPZcsgy6XxmV2VgZ04idTFKAFCWaolFTGjJJ4FTAMmH0KGSkmTBujAWZ6WRf - ZuJuzZLFMX2yWTBzMs92opkzbRLv552by3berOlm+eL55s6bl5hVd91gNqy63Wx+4G6zacM9Ztcja82r - L2wjQLrLvP3mPvPW60+a11990rz6yn5iG/vMG68TPH3zVfMuIPD+B++ZDz78wLzD/nvvAQzvvW8+/vgT - 5FPz+WefIB/TH+8j8+FHH9Ek42POf2w+/fQT89FHH5jnX3gR0HjKbNz8hFm7YafZvG0X1sgGc8MtK7AM - F8Hv4DczfKIZAVBefvUV5vRhQ027bp0Z8lFomhQXQxTrAM+jo2la1BrlzmcCNalKXJRsACCHbkECi1Tl - 89XYBBBxHY0yiYt4Cu9nBJQNcK6FrInDAogeD0B0YDsXECkFAAoGBi0ACwDvvPPOQQDgpwmjxgAAY74f - P2rMdwAAVgDgj/Ts1v0SiEACgAa+BIGgDueC1oDLFsgKcOQhmf/KBDjTX36/gn5u5f/9LcF8E+LvgwYM - yJg2efI2fpSUOB76Mf/LfV+ZZd7Pn3WNmTpnorlywflm/C0XmzkrxpqFy2aaRSjCfBTAKn8AABwQuHNS - BimPRpbfKOWXO4DCSQHlFkgp3QothQ0qsFZvWQZW+bV1+348wcUVFCewAOArvVyAklVfn6nP80XKroCi - F4BcZEUgING+tQSUKhUIHiFbEnx+8wQUZQRXLRiWer21imy6dRpZFLIpBGpn4ILMVNAU4Ydn3ZEZU6ZZ - sLA8DdWhY5WIuzF1IseAybhRY8woSFRjkPG4LJPGjOH6OAKyAMTMaYDXDOIgM/mb5pjbblhoVt+91DyA - lfHA2tvNxvUrzM6HV5p9e1abZ/evN688t53syW7z0QfPm398/rr5/ps3zA/fvWn++d175vvvPzLfffeF - +fqbf5jPv/hC/fLMt998br799nPz4SdfmPc++BwQ+dh8BDgINL788nPzj398ab75+gvu+4L9z80nn37K - dYADYPkEAFHHnaefe8E8vPNJ88BDe8zKtY8CItvNrZDE5hCTuXzEJHPGuSPMGeddieVxpTnz3KG4LX0B - i+ZW+QuIdxS2bm4K27SwrcA1oSqNQGcagc5k5lN6MQ/xBWQ5EEjFAti8CaYrovx/GTEARwSyQUDfAhAA - SACA0f+cMHqMXAIAYKxp2az5EPSrMSIQaFgGEARBQAFCuQMCALkAWv1l+ivy7/z+P1z5ZToIRRRNrNKp - Q4fmY0eO3MAP7/vDFZ+gnUDBBe3KAggUXGSghQTN5s3Hf76WH9e1swiusQLOhlPg+/4lIODAIAAK+sHL - BJ6PYi1HyW5EAUsUEuUssQr8fSmvBQUb2ffkFolzE6TkAQCwgcLAii9rwgGAtTIc4BwFABwQwJ+w7sB8 - Vnh9b2vN/BrgLH2vHxgtDRDzFGBVwBQrQqLj0p9jU7I+uARf71kdZFt80PDAQyCitOxkm4Idz0olF2Wi - 0rETp9j7yW374MK9AM0CUrTLIHndfAPZE+IXdxK/UAzjrhU3kUm5w2xYv8bsfGQLLscOXI6d5uUXdpk3 - XnvSvP/eS1gDb5hvv3rdHPj+VfPzD28AFu+YH5HPv3gHi+Fd88Xn7wMAH5rv//mx+eGHzy14fPLpF+bT - z74w33zzFcDytfnH14DK518gAg3Of/sP3ucbe+2HH3TPVxx/Zb4EUD7mtR989JkFk1defxNCz2Nm9bqH - zY23bjXLbtpgblmx1iygpmXMhLFYGxeZ7v2HmX6DLjSnnX2B6XvyALPxQfoBIF4KELHBQI/+64uYgBYA - JNYCGIkFMHLMD8SDvgcIfvYB4CBpwH7oVZMACDQKAIGzBgQCcgcEAHIDxBwUbVimv/x+Mf8U9JOOauV3 - pr909w/5pze0AKAPrpWT0+3cs8++H5fgi1nTpv4sk5WtTdWJECQFtYpqFRdT1rcAFDCTzCMguGjOQrN4 - DgoyewGgMA+TVKu/Z/Y7APBej+KUsgjseX7QS1Au5wq4mIDzzZ1r4CwCFyiUMts0n3x5Jyi2AwUvBRgQ - 36KQyW+tDGUKlH4MiFvtSxTftwRkpShoqSyC/obfDQD/AjyO5p45y6I0X8MDjtmGAbBWxO609yjDAcgK - wCSL519jrZn5NhPCPqur/i6lWZdeK4vnOi8OgixZtIRUq44JmsLPkCiAai00+2y9Z6+YzJ2s1Pfcc5dZ - vfJOYhXIAyutrF19t1l1P+m2TSvNc/s2EJ94xLzy4i6A43FiDhC9XoLUJbLXG8+ab7581fzw/QdYCp+Z - b776BLD4xBw88Ln56cC35rvvv0PpvzZfIF9/86354uuvzfuffmXe/1DWxueAyFfmiy+/Qb4yX3/9FRbK - PyxY/PTTt8h35mfe4+efPfnxx2/MZ59/YmnAtiGI/H9lASwQHAYAP/kAcPD1118HAKZb5Ue+LwEA6l4A - ggP1Cur2R6eaHgUEXFxAACAXQNwAZQCk/CL/SCf/rcovBCmxANhPQBomJiSe2a9P77uGX3bZq5MnTvx6 - zvRpP6KsB+ZMm3oA//PgNGQmoDBrKn4oq4mi5NPxV6djds6YMplcP5FwUlJzyf3PYl/Rca1CXoDLU/zZ - Eh0HzgkgrJ/sZyT0A1T6TrwAK7II/NXfgcHN/PBKAoP+yl+i/C6LEAgkOt8+CCYy9a3wGc7ED5r6VvlR - eCm9Eym/A4CFUt7/BRD4PRaGdVF8ce6GsypU9yFAEAkLYpj9u5bwt+rvtmDox2JuWq4grJeNUQBVUpKZ - uUEZlZtRfgVUlbq92VaS3sBrlsLJWLpEfA5ZZMq+KGir7Izeg2Neeyvnb78V0LhzhVkJaKxceS9yj1mz - +j7zIBbGlo3rqT15kNqTh6CNPwzJazdWBnGKN543H773nPny02fNF58+bz77CPfk45fMV1/iovzzHWPM - e+bgwXfYf9d89Y+PAIpPAY5/mG8tGGBJ/BNg+PZr89U3/wQkvvMzAB4JyKUCAylArf4OAA689hoAMHWG - lN+KBYCRY34iHUhmaMwP2ZlZKgduVgYIOHdAAKA4gDICCgCKEKSo//+a8jsAkG+hCGP0CSecUKdmzZq9 - 0tMzhvfo3uvWKy6/8vHZM2e/sXTRdZ/esGTp18sXL/t+2XXLflq2ZNmBpYuXHFTqzJrCrDRaicQKVJBL - SizFnz55IgIVWD4sMhOA0HkLGvY65wGPmaIL23vYal+gIcKQb1rPt8G22WYRK9l1/EhJX9ofqrZSVue3 - y1qwZn5A6bXyO3HcABtcdKu+DwB2tS8t/orvAMApvtsqM6Axas6S+T1K+u98bWkAkDvnAKBkKKz+Fp7t - IgcAgIAAwMVf9FxdCjaYZr3rjhXmnjvvNHcjd91xB67BHebuO/x9zt2p8/71u++6i3vvxnWgsOyuu62V - cMft3MP2bo7F7LwHuZP77uA1K26/w6yAxKX3ux/uhai697FdxXY1soqK1VWrVpG/X2M2blhndmxZDx/j - AbNjG9vtG3zQ2ERadKt1UV4jhvHma3tgiO4j6LnfvPe2gOMlQOBd3IiPcRk0D3C7t/r7XIAAAMgNsCAg - 8//113EBppIFwAWQ8iPfSfEBgIOjhl/1RkxUtBqCNA+AQOl4gFKDtRGZ/vL7y1J+l+v/fek+aXpZ//r1 - GygXQL6FIowKOKQdf/zxLatUqTo4JTl1RNOmLRb36z9o1cUXX75r2rTZr9x004oP7713zed33XX/16tW - rft+7ZoHDqyDR79mzQNw+debe++6l3z8HSD7bXYluIWV4P577+c/8C5rFuoHdJMN6F1vFXA5/tiyJYut - El07b47HEhRj0GcKzsTKkM9qrQ1AwVoTiOjLuk8WiFKYEr1GJu61ZBKkmFrNBBBatRXMc4FFyzWQaHVz - 4GG/i28B+FsX/Fum4J9fu1AaAPT++iwBlDIZ/04l/j3vfUwAwP/BQh8EZH3JCvBYlV42Ria+BQHHwVCq - FREP405AQEAgABAQOLlHCo9Ise+7525W93usWDIVq/yaVfcjq/jt3G9W34/Y/VWs/Kttifm61WvMerbr - 162nZmMdzM3VyCqzinOr1qxlf41Zzf5qf38t13V+zeq1Zh2knrVr1/HatWbDA+vgQHjHa+11Xq+6E649 - sJ6CNYrVHqW6VVWrGgcmJqBLAwZcAEsG4rwFgGAMAOX/p28BfC8L4JSBg+dWq1pNVOAWpawAFxDU6i/T - /2jK/2/x+UvjgJDFxQEUbZT/IZOkDTIIuQAZcdxxx00EGKZXrVr1mvi4+MWZmVnLO3bqcl/fvgPWjRs3 - 6clZc+a/vHDhktfvvmf1l+vXb/7nQ5sf+QECyo8Pbdz+4+7H9x3YvXvfwd3kn/eIV79rL6bcLlhx5KD3 - 7DNPPglP/5ln4Og/C+HlOai2L1t5nuMXn3/ecvItL58c9qNK04DOa1auNPezityKSbpoPhwDl4qzaUk4 - BWpy4q9yNoBJDEKByHmagkQgTSChpieyXkpWcwGGFN1ZAS7yL0XQvnxg3/cXqMgqkOia3k++9W9Kpf6e - 4OGveG3QBZAFYGMBTvy05bWKC/j+v3MDggBQwtAUCQu5AwC4QyQr5E6kRPlReq32JXK3Vv1DAGBBQP+H - rOJOtKqvEghI+X1ZKxBAkbXKy5K4HS6HrAntW1DhNVLm9Sj2Btp5bYR6/eBGGJNE8jdBxxavX+Qedfrd - yPkNuk4vC3dO5zds2AAoACKAhlqCiwugfgDW//eCgI4F6LY2CEgM4CAu7k/jRo525r+NA4y9auQnndt3 - vAIOgHoCqjGoswIUEBQABJU/aPa7gF/paP+R1u8/7LxAQGgjkoEIBwmIfBOBgCKZQ5GLkCuQq5CRyChk - DDIWGY9MQCYhk5GpFSpUmFWpUuW5kZFRC1u0bHlrt27d7x41cvT26TNmPn7zLbe/tHr1uvcfemjzh88+ - +8L3b7zx9s/vvvvBwfff+9DmkT8iXfThBx+Zjz8in/zJp+azTz8jdfS5+QJRJPhLIsVfEhW2W8mXX9ot - 3Gzz/rvvwd1/3bz0wguYfM/4gLGVgqFV5t47MU/5wS5fLMVdaK2OBXOJrqMMij/YaL7z5ZXxsG4NOX2U - REEyax77loVWSKssgI8sDVqr2XsOAwC9r6+gJeePlkn5Fcr8W6yBwwDATztaGrQvChTqb9LfUhIH8LkP - jplpAcCPAWj1DwLAYau/Vn4UXnK3r/wlAHDvvfSWQAAAz6T3QEDKb8W3ArSaP8Cqvw6Rwt/IZ2ur+1fS - dEbvp33dL7dAoPGQlN8qvCdqWiMREBxJtNJvBiw2bdpsi358+q8U33cDDqMBWzdALMBXX30VF2D6jwDA - 98g/x40Y/R3y9dDTzrgR/7//3/72tyIfAFqwVSxALoA4AW7ll/JrwXWpvrLy/H+Ykh/tjZwVIH9DUUcR - DwQCsgT0xVXUIF6zLIJTkDMQgcLZyDnI+YgshYuRS5HLkeGIwOJq5F8CBtbFjGrVqs3Fsrhu0KBB9541 - 9Ox1866Zv+umm295ds2adW/s2bP3S9hq/3jllVcBjLd+AiQOWhD40gOAf9itAwUPEL784kvzhQMJ9h1g - fOGDx/sQWsR4ewPAeB7L45mnnzZb+bFsYMVZiblquQOYu/MsmceLqKuWwWZBLIMRawPLQ+cFEsoEKI5B - BsWLbfgpNwVAbXrNvc5lThwhqrTi/xtcibJ4Cg7cDrMC5D45AJD7pECggq8+ScryKAI0bEe/lgUQBABr - 9vuKLxBw+/ei+Ct95b9fACArwLcEgspv3QBkvQCA/w/FHG7D1Xj00UfN44+rJ4Qay3i1E1JaAYGAZiNK - bwUgkARB4Ehg4Jn6UvItAAD+P+a/GoMKACS2E/D27Qc92fazXAC1AwMAfoaH8QNK/4MHAKO+veyCi3Y0 - b9L0PCxl6UxrxFkAWv2l/FpYZfYr2q/af+nav4Xhx/v+qn8OBGR+CARUdqgvqOCEcpQyW4RgLfw/TNZB - e0SBjq6Imh8IJGQxDEAGIyJCnIb84YDBe06jXfncGjVrLgAwVg496+x1o0eP2X7twkXPLl26/OWNGx/6 - ZMuWbZ89+8xz3xKs+RHW1s8lFkMJKHiA8cUXWBeAwhdYF95WOWd3Xuc8+QAL463X3yB49Bq0WhXzPAmF - dhd8/O0UBj0INXeFpSKrslExCZtzJ+g5A9aemqmImDNVTD/bUGXSoXv8TIqtyuRexTacRWLToiWpVi/9 - Wtbq71KAZbogAY7BL3gGPr/AgoDcALlFzgXwAUCZGMeOLCFcqTDLr72wdRhyARQAZIVWQNACgBNMdZnr - FgQcALCV4q/yxVkAigM481/b9fjnMs9vE42bz9mN8u/dS7+Hffsp337KvPjSS+YZwPsBzH9ddyu/A4Bj - BQGsg4OyEAQwUno7FtyOB5fya1qwjrfbwSAAwM9YomICWgAYLwAYMfr7EZcNf6Vn1+4TEhMS+vz9+OM1 - FcgBgFKBivw75VeeXyQfKb/q+oOFPX8Iu+9XaX7g5qAlIHdAyKQvKTqiaIn64gIEkRXEWBJzSeBQ2//j - FNUUyonwILCQ9dDCfxB/OmAcf/zfZ1eocOK84uI2tw8efPLaSy+9bDMpqmevv/7GlzbhjuzatefL5557 - 4Zt3333v5w/e//CAI584ANDWuiLaBva/+FwuiuemeFuE65/AenvrzbfMm2+8YZ7Futj/xD4CTTusWSvR - qiZegtwJgcQ0ZUioAXCBT1kRAgrSrpbZJ+CYFAAPBzK2WMk1bHH1FT5oyFIJBifl97ty7xLQCMYBAAAF - Al1sxLIffQCwNRk+v0JugL6/lF++vxPFAFzgr2QrxVfwT8qPwlsLwAGATHg/om+DgBIUXgFAiQJ0sgBU - zHUTlsdWlFQdo3agqI9R9OT1bNhr3QSBhFvxgwBQljVQljsgS4DOUwel/BYAAk1BAYIDgIAFALkAsixp - CXZg5pRp38sCGH3liM9OGzTk+jq188/A/dXqL/O/la8DTvmV6lPNv/RJC6wKe/4yyu9wwIGAYgKyBgQE - +qIKEFZBFCOQzyKWkooU1LpIaCZrQWkMAUUCIrCQmSPAEMGhLMCQVVEaMGQyCTmPBhgDuf5vtzDw4WZW - qlRpfsOGjW4CMNYNHXrWpvkLFj6zePHSl1euvP9tynS/2LFj51cvv/zKj2+//Q7TYolXWBD4HFLJZ5YO - KzD47FOOiWNYced03om95sU6BBivvfKK/WE/Tiejxx+j+cgDG+zAintpVqHAmxRRKVSBg0BCLoearbha - Au17dGA6NiHuPpta9bMnyqK4DEoJKUsBVKwFWQE25iF3wLcClGa1AKAsjiu7lgXgK/9dCgC6DIAf9bcp - PWf++wBgff6A73+f7/fb6L/LAthI/2q78iuwJzdAn7Ocz7+fexS020AgTworF0CBOlkWAgApu0z9sgCg - LGugFBAcZDLwQa32PgDIJeDY9gPwAGCrdQEsAHz66acWAMZePeqrc4eevaZxw0bnh9Wsqdy/frv6DWsB - 1GIon1+/f+mFdEZ69G8n+PAZv/mfM0Pc9FHFBgQGYgwKsdyUEjfLTAAhU0YWg+tlrj9SKCcL4tcAhgoh - BBhCy9IWxl8aMPi+0yueVHF+UmLSsv79B6w9/4KLtsGa23/HnXe9ev/9q96kl+GXTz359HfvvPXOTx99 - 9DFdZT85GAQGAcKnATDQ/qef6Nyn9vxhW8BGAVIV6yjo+QpZkyf27LUlwA+hHA+iOFpZbdk0Ij6FtSjo - 6agqRlkVjm8hV0XgoBSrGJ+KV9giLwVABQQKfGIJuGzADSJYqSTbL7lWGlD+v1Z8m+dXtN839e2KX0rh - pfTByH9pxXcuwDoBAMouN+AO3v86QOhWlFy+/l1+AFBAId6ArAO5AIrwH0n53XkXCygVE5ALcNDL/dug - n9v6sQGxAbeg/Jt/5r6f/vEP0ZM//wkA+OHS8y7c2bxx00ujIiL7EMuSW6zVX5F/p/z6PavLjwg+f1qk - /7eigQOD0qDg+AOyFIKDCgUUTo4VMPRQSgOGHtaxWBi/BTD0HyQf7UgxjKNZGOfyOgU9L0R+c9CT104T - YJQrV35ulapVF/Xq1eu+wYOGPDRy5Ohdt61Y8dq6dRve3b37iS+eefrZb1997fUfqMCjD72XFfGAwAMA - ZtSzlRza1zlZIzr/CcU12ve2n1Di+x7Vfq9S9fcq7c283olKrW5i5RRoaBWXMsvnd/Rny3i0wUEvQ3Cd - OjapKvPGQK2FFBBAUAxAvr7NAKCYdwMEd2nrWwM6JwvApvxY9Usi/y76j0JL8a1g+su3FwBohS8p/UbR - b+WzblFfB+QG3JJlfF9lCNwqfzQgOEKGwMYAvIyAjQc4QJDi4/dvtsovwU34Cf9fWYBPqaN4sW1R8ajY - mJgBfzvuuA78nyr11wKR2V8bkbssy1gWsxbHP7yc97cq9u99XWlgKOvYWRBuK7D4dwOG/KugSyLkTUCc - S/K/BRhn8ZnKkvyhgKHAZ1pa+vKePXvdM2rU6Idnzpyz555773v1oU1b3nviiX2fvvzya9++/sab3wMY - PyulapXfAoIHBCrjPXSskt5DopjFoWOvrFfp2DdxS94g+Pn8s8/ZwKd6Cux4mDHa+MjKv69HUe+nbfzt - dGiy1GBflLNfscJr1mKbtshl8AHGxgocMChA6McHZBlYYpAfA5AboC49ige4GIHcAIlecxcWh+IDErkX - xwIAR88QbCpRfuZfHPBEK/8WrfwHsBp+Jgh5AAD4jiDk/nbFba6Kiowc8D//9//K75fp75RfGTT91lya - z0X6g8y+fw+77/dq9r/p9f9NgCGfThHdI7kkzsLQilBWlkQWxsnIKYjLkhwNMMS/+FVpVe63FgYyA8BY - 2r59h7suvfTyrRPGT3z8tttuf4F26u8+smPnh88889xXL7306j/feftdUlue0nsgUGofTobOq5xX1z76 - iHs4hyvjy0cKill56623LWi8RrbkRfgYz0PmUqBO8iidmWV6i5AjV+A+lH2llNmnADuC0H0wA6XkLl4g - U1+WgCwCiVwDZx0oAKhrNjbgn5cFEBSt+kdyDUq5BL4lYAfgHOSaFV/5D/A+P0Na+5nV/00sjqU1qtfo - i/Kr+29Q+RUYV+xLcTHFzMoK9v2b1Oy/523/aMBw7oiLYYh0caQYxtFcEmdhCNll2gUtDBE7yrIwfg1g - 6MdUOq16JMAYdgQL41gBYyKvd+StKexPlcTExi5o0aLlLRdddPH6KVOnP3rjTTfv37hx0xs7d+56/+mn - n/vixZdf/e6NN9/68f33Pjj4ARbCIRDwwUB1/w4YgvucE8h8+CHNQ9wWwHj3Pchbb71lYNaZFyxgvECa - b59N92mQzBZN68E0Xwttd5ULEGIVeICA4vugICCQpSCLQddKiwDjSK6BAMIPCFqF5/Oc4luLgHN29d+9 - e/eBl1566R9wER7q27fvsP/5n//R/5fcyRaIAtqq6lPw20X6g8G+PzXF998DDWX/Jf/NgCH6qIgkiior - SxK0MPQD7IYEeRi/xsK4hNdehjjQuJJ9R+Aawb4jcY1m3zE/x7I/DhEDdDyZkql16tZbOmzYOfdNnjx1 - 25Lrlu25777VLzy4cfNbe5/Y/8lLL73yDWzP7997/8OfP/oQK8JXfgsSgIE9BggEDLIgPIA4JAIZuSJO - 3oXA9eYbb2JlvGnbl734wkvMhniWWZZQzXFPiNqTwtvqUXzlPvj1A2vWKLNArYBcjBIgUbpRNQIWNA7y - moOAhBW3r61Wft77ZwDqh717n3h8+vTp+tud8ivgp/p+Ba2V5gtG+v/Xab3/7Yr+R/19/22AocYSziX5 - tYAh4pZYnnJLTkWC5C25JkFLQ4zPixAFQF0QVADiQMQBiXNZHJiIEVoiLVu2mk9a9eYpU6auXb78+odX - r1m3f8eOx97Yv/+pD1544aUvXn/9re/eeee9H99/PwgGHwICEu/cBx+yb8UDBwHFB3ZflHK3Zf/9D704 - BoDxMinWF1580TwHecgNjtHAGFkYsg7WrVtz0FoO69YdhINwELfhIHyDA08//fTPr7zyyo/79u17eunS - pbNzc3NFeNPKL1AW/0VpPhfp/68K9v1RCvef/j7/6YAh+qlWKAWnjuaStOC642Gomk1xjKBb0ovjPoia - XcjScMAh1mcQPM7k2MU1RBeXuICoo44LTJRNEaAEQUXAIsukRLKysicMGDhw4ejRo1csWbL0oVX3r9mz - ecu2F554Yv/bzz/34sevv/HW1xC4fngfAtcHFgB8EVBYYHDndBy4Xmqf97CWhba0/bZCwE/uyVco/1Pz - 5s2b6Su/fH4x/AS8SvPJHVS6W8G+vxy55z9d+f7Tvv+xgIUjXAUzJUfLkhwphqEAU2kexm+NYTjilmN6 - CjTk0zrQCFoZju0pJRBoiPVWOr3ahXPdELknDjj6su/o4qUB5BSuBUFEFHIBiUS1JwIUJ8qwHFHCwyMu - 7NdvAHSHycuXLb+e0MHah6GGk/nc/9rTTz/73gsvvPzp66+/+e3bb7/7owUIgOCTT1U7oi5D35mvvvqO - 1mPfH/zq629+wHX5aMOGjfcOHTpUgKSgrlJ9YroKSBXzCQX7/tM09C/2fX8PYAQ5GI6wFSRtlQ56Hitg - BJmexxr4lBlcGjSULZGJLB9ZufHS7omsDSmU42UonSaLw4FHdx9AxLBTrYmsDwciskLkvjggkTUiEUtU - 7kxpkZVSWkruyaudf1FhYeNLevfuO+ayy4fPPHvYOaN79Oh1caPCxgIiBWbFGxHQ6e9QpL90sC/k7//F - FOu/9ev8bwKGothBC8OxPatwXlIVcWzPIHnraKBR2tIIsj6DLsqRgKMFn+mCoQ48nLviUq8CEee6SHm7 - IUEwEaA4kXUSFJ2X1aLXacUXOEnxterrO+n7JiAK9snacmW8suZCkf7/Vq37D/67fg9g/BrilkutlmVl - uFoSAYZy48cCGq6uRJF1gYZLs8pFcXRxZ3GULkoLcjSCVoci9g5AZH1I5LoISOTXO9E5gUzpSj59D1fJ - 9/89uec/WCdCX/0oT+CPBIyjuSWixf4W0JB7cizWRhA4RMxxHA25Ks7qcDGO2pxzwVG5LdoXqOhevVYR - fim+An2Oz6+4TJDZF/pRhZ7A/7dP4FhAozQ1/NfUkwSL0I5G4nKWRhX+J5x7EixIOxpwOGKXLA/ti+wl - V0aAo/fSe8slCkX5/7/9mYf+8D/qCRwLYBwtU3IsrsnRQONImRMBhxMpvMx8Kb2sleCKH/L3/6hfQuh9 - Qk/gGJ7AbwWMoJVxrKAh4JBI4RXZl5mv1waVXt8n9C/0BEJP4C/6BI4VMMqyMoKuSun3+Yv+uaGvFXoC - oSfwe59AWaDxe98z9PrQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQ - Ewg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQ - Ewg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQ - Ewg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQ - Ewg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYHQ - Ewg9gdATCD2B0BMIPYHQEwg9gdATCD2B0BMIPYH/gCfw/wAdUoO/hAh1MgAAAABJRU5ErkJgggAoAAAA - MAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+PjwGPj48C - aGhoA19fXwREREQGLy8vCSkpKQsICAgMREREBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAFdXVwEAAAACAAAAAwAAAAYAAAAIExMTDB8fHxAHBwcWAAAAHAAAACMAAAAq - AAAAMQAAADkAAAA/CwsLShoZGVklJSVkQEBAeElISIJbWlmIKCgnUQAAABRBQUEBAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAI - AAAACwAAABAAAAAVAAAAHQAAACQAAAAtAAAANwAAAEEAAABLAgICVx0cHGwqKip9QEBAj1RTU6BjY2Os - eXh4vH59fcWUk5PTnJuc3LKysei+vb3zwcHB+MXFxf3FxMT+wcHB/r6+vv69vb3+v7+/6ygnKFgAAAAb - MDAwAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFxcHAAAAGwAAACUAAAAuAAAANwAAAEEGBgZO - DQwMXBkZGWswLy+APj4+j1dXV6JjYmOwdnV2v4CAgcyKiYvXmJia5J2dn+ywr7L5s7O1/qurrv+kpKf/ - nJyf/5aWmv+UlJf/m5ud/6Skpv+qqqv/ra2t/6+vsP+ysrP/r6+v/7a2tv+5ubn/urq6/7y8vP6/v7/+ - wsLC/JCOkdYNDQ1KAAAAIAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAFJSUgQWFhZTSklKsGJhYshvbW/W - hoSH45WVl+6mpaj1s7O2/bGxtP6trbD/paWp/p+fo/6YmJz+lJSY/5GRlv6MjJD+jIyQ/4yMkP6MjJD+ - jY2R/4yMkP6MjJD+jY2R/4+Pk/6VlZj+np6h/6Wlp/6op6n+qamq/6ysrf6vr7D/sLGy/ra4uf69wcL/ - wcXG/sfKyv7AwMD/wcHB/J6doPlGRUiaAAAAOQAAACIAAAAHAAAAAAAAAAAAAAAAAAAAAHR0dSl/gIPm - jIyQ/oyLkP96nIf/jIuQ/4uLkP+Wlpr/nJyg/5+fov+goKP/oKCj/56eof+amp7/l5ea/42Nkf+Li4// - ioqO/4mIjf+Lio//jo+U/5CTmP+Ul5v/mp2h/6Kmqv+usrX/uby+/7q9vf+5vLv/sLSz/6itq/+hpaL/ - m52a/5GTjv+DhX//d3hy/2ttZv+4ubj/wcHB/Z+dofpcWl+7AAAANwAAAC8AAAAdBgYGBgAAAAAAAAAA - AAAAALGxtJWNjZH+i4uP/4qKj/56mYb+jo2R/5SUmP6ioqX+qKmr/6ytr/6wsLL/ra2v/qanqP6enqD+ - mJiZ/4yNjf6Ag4L+en17/3R3dP5ucm7+Zmhj/1pbVf5QUUv+RkhA/z0/Nv43OjL+MjYt/y8zKv4uMin+ - LjIp/y4yKP4uMSj/LTEn/i0xJ/4tMSf/LTEn/i4xJ/6ys7L/wcHB/aCfo/tcWl+2AAAALQAAACYAAAAe - AAAAEX9/fwMAAAAAAAAAALKytaqWlpr+dHV0/3FzcP5rbWn+ZWZi/1tdWP5PUUv+RUdA/zo8Nf4wMiv/ - KCsj/iMmHv4gIxv+ICMb/yAjG/4hJBz+IiQc/yMlHf4jJR3+JCUe/yUmH/4lKB/+JSge/ycsIf4sMyb+ - LTYn/yw4J/4sOyb+LDwm/ys9Jv4qPSX/Kj4l/io+JP4qPST/Kj0k/is/Jf60trT/wcHB/aKgpPthX2S0 - AAAAHgAAABgAAAASAAAADX9/fwQAAAAAAAAAALGxtKqVlpn+GBoU/x8gGv4hIxz+Iyce/yIpHf4gKhv+ - Hywb/x4tGf4dLhj/HS8Y/h0xGP4eMRn+HjEZ/x4xGv4gMRr+ITEb/yExG/4hMxz+IjMc/yM1Hf4jNR3+ - JDUe/yg4I/4sOif+LTko/y43Kf4uNSn+LzQq/y8zKv4wMir/MDIq/jAyKv4wMir/MDIq/jA0Kv61trX/ - wcHB/qOhpftlY2evAAAAEAAAAAwAAAAJAAAABn9/fwIAAAAAAAAAALGxtayVlZn/GCYU/x8xGv8jNB// - JDIf/yIvHv8iKx3/ISgc/yAlG/8gIhr/HyAa/x8fGv8fIBr/ICEb/yIjHP8iJBz/IyUd/yMlHf8kJx7/ - JSgf/yUpH/8mKiD/KC0h/y81Kv8xOSz/MTss/zE+LP8wPyz/MUEr/zBCLP8wQyz/MEMr/zBFKv8wRCr/ - MEMr/zJELP+3uLb/wsLC/qSipvxqaGyvAAAABgAAAAUAAAADAAAAAgAAAAAAAAAAAAAAALGxtauVlZn+ - GRwU/yUqIP4oLyT+JzAi/yUwIP4jMh7+H0Qa/yA4G/4gMRv/HzAa/h4wGf4fMRr+IDIa/yExG/4hMxv+ - ITQc/yI1Hf4jNR3+JDYe/yU3H/4lNx/+KEAi/zFDLP40QS/+NUAw/zY/Mf42PTL+Nzwy/zc6Mv44OjP/ - ODoz/jg6M/44OzL/ODoy/jk7Mv64ubj/wcHB/qOipf1zcXatAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAA - AAAAALKyta6WlZr+GCQT/yYzIf4qNSX+KTIk/ygvI/4lOyH+EaoN/x9OGf4kJh//IiQd/iEjHP4iJRz+ - IyUd/yMlHf4kJh7+JSgf/yYoIP4mKSD+Jyoh/ygqIv4mMyD+HX4Z/zRQLv46QjX+OkQ1/zhGM/44SDP+ - N0sy/zdMMv44TDP/N0wz/jdMM/43TDL/N0wy/jlMM/65urj/wcHB/qOhpf57eX2xAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAALKytq6Wlpr/GR8U/ykxJP8sNyf/Kzgm/yg4JP8fZxr/ELYL/xtyFv8kNx// - ITIb/yAyG/8hMhv/ITIb/yM0HP8jNR3/JDYe/yQ3H/8lOB//Jjkg/yU7H/8hXBv/DssJ/y11KP89Sjj/ - Pkc5/z9GOf9ARjr/M2gu/zRkL/9ARDv/QUI8/0BBPP9AQTv/QEI7/0FEPP+6u7r/wsLC/6Sjpv+Vk5ev - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALOztq6XmJz+GSMV/yozJf4wNyv+LzQq/yw5KP4YlRT+ - G4EX/xt/F/4nLCL/IyQd/iMkHf4kJR7+JScf/yUoH/4mKSD+Jyoh/ygqIv4oKyL+KSwi/ykwI/4ddhj+ - GaoV/yeOIv5ATTv+Qkw9/0FNPP4/Ujr+JJgf/x6oGf49WDj/P1M6/j9TOv4+Uzn/PlI6/kBUOv67vLv/ - wcHB/qWkp/6XlpqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKytq+am5/+GiMV/ys5J/4wPyz+ - Lz8r/ydbI/4XnhP+JGIg/xmQFP4hORv/ITIb/iEzHP4iNB3+IzUd/yQ3H/4lOB/+JTgf/yY6H/4mOiD+ - Jzsh/yZFIP4XoRL+LH4o/yGjHf5BWTz+RU9B/0ZOQf5EUz/+I6Ed/xq1Fv48aDf/QF87/kdPQv5JS0T/ - SEtD/khMQ/69vb3/wsLC/qalqP6enKCmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKytq6YmJ3/ - GSYV/y1AKP8yRS7/MkIt/x+FG/8layH/LUYp/xaREv8hMBv/JCUe/yQmHv8lKB//Jiog/yctIf8nLiH/ - KC8h/ykxIv8qMCT/Ky8l/yZOIP8cnhj/P2E6/yGoHf9AZjv/SVJE/0hURP9DYD7/IKwb/yKlH/8ctRf/ - FcER/zd3M/9DXj//O243/zp1Nv++wr7/ycnJ/6inqf+gn6KlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAALOztq6Ylpz+E2EQ/xiaFP4aoBb+G5sX/ximE/4vUir+Lksq/xOXD/4eSRn/IjQd/iM1Hf4kNx7+ - IFMb/xp5Ff4afBT+GYAU/xmGFP4ecBn+KEMi/x57GP4oiyP+R15D/yqZJv42gjL+TFhI/01WSf5FY0H+ - JqEj/0BwPP40ii//NIkv/iOpH/47ejf/HbUZ/iijJP6/xr//zMzM/qmoqv6hoKOoAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAALS0t66cm5/+GS8V/y1PKf4wXSz+E7wP/ytrJ/45PDX+KjIl/xWAEf4fSRn/ - Jigf/iYpIP4nLyH+FpIR/xaUEf4daxj+H2gZ/x9sGf4VpBD+Jlcf/xqYFf48ajj+UFdN/zx9OP4tmSn+ - TVxJ/05bS/5Ccz7+Jagh/0llRf5LYUj/SGhE/iWnIf4bvBb/Mo8u/khpQ/7CxML/x8fH/qmoqv6ioaSn - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALW1uK+lpan/GScV/zNEL/84TDX/MGQs/zZQMv8zRC// - IjUc/xd/Ev8baRb/JDce/yU3H/8jQh3/FJoP/yJWHP8nPiL/KT8i/ylCIv8eexj/FqAR/xqmFv9GZUL/ - UF9N/0ZxQv8krCH/TWdJ/1RcUP9Cej7/MJks/1RdUf9XWVP/V1pT/0lyRP8euhr/TGtI/1dZU//FxcT/ - ycnJ/6inqf+YlpmqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALu7va6qq63+GxwX/zk6Nv4/Pzz+ - P0A8/z8/O/4qKyT+JCYe/xtlFv4achT/Jysg/igqIv4lQR7+FpMS/yg5Iv4sMCX+LTAm/y4yJ/4qRSP+ - E7EO/yuOJv5UXVH+V1xU/1BnTf4oqiX+SnFH/1RiUf43kTT+NpQy/1NlT/5TZFD/U2RP/lFoTP5KcUb/ - UWdN/lJmTv7HyMf/zMzM/qmoqv6WlZitAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMHBw66ur7H+ - GigX/zdJNP48TTn+PU06/zNEL/4hMhz+IjUc/x1YGP4WihL/JDwe/iY5H/4hWxr+FpIS/yhBIv4qPiP+ - Kz8k/yw/Jf4sQiX+K18k/0NmP/5VZFH+VmRT/1VmUv4wny3+QoQ//1ZmVP4zmzD+Q4NA/1phWP5bX1j/ - XF5Z/lxeWf5cXln/XF5Z/l1eWf7Ly8r/z8/P/qqqq/6gn6KpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAMXFxq6ys7X/HBwY/z4+O/9EREH/QUE+/ygpIv8kJh7/JScf/yM+Hf8VkRD/JjUg/yktI/8faRn/ - HXYX/y0zJv8uMif/LzMo/y80KP8wNir/PEI2/1ZaU/9dYVr/XWJa/1tjWf9Bij7/NZsx/1ZtUv8tqCr/ - Sn1H/1loVv9aaFb/WGlV/1hqVf9YalX/V2pU/1drVP/Mzsz/09PT/6yrrf+mpqijAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAMXFxq+0tLb+GigX/zxNOf5CUj/+MkMu/yM1Hf4kNx7+JTgf/yVFHv4VmhD/ - Jkwf/ilBI/4aixX+I2kd/y5DJ/4vQyj+MEQp/zFFKv40Ryz+RVY//1poVv5ca1n+XWpa/11pW/5Ofkr+ - Lasp/1R1Uf4tqir+U3dQ/2FmXv5hZV7/YWRe/mJjX/5iY1//YmNf/mJjXv7Q0M//2NjY/q2srv6np6ij - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMbGx6+ztLX+Hh8a/0REQP5DRED+Jyki/yUoH/4nKiH+ - KCsi/ykzIv4YjBT/J0gh/iw5Jf4YlRT+Kk8j/zI2K/4zOCz+NTot/zY7Lv47QTP+U1dP/2NmYP5jZ2D+ - Y2hg/2JoX/5YdVX+KrEn/06CS/4rrin+VnZU/11sW/5dbFv/XG1a/lttWf5bblj/Wm5X/lpuWP7S09L/ - 3Nzc/q+ur/6lpKWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMbGx6+0tLf/HCkZ/z9QPP8vPyr/ - IzUd/yQ3Hv8lOCD/Jzog/yc+If8ZjRP/IWoa/yBzGv8UphD/K1Ek/y5EKP8xRSn/MkYr/zRILP89UTf/ - WGhV/2BuXv9gbl7/YG1f/2FtX/9dclv/L6st/0WQQv8triv/X3Bc/2VpY/9laGP/ZWdj/2ZnZP9mZmT/ - ZmZk/2VlYv/V1dX/39/f/6+vr/+enp+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMbGx6+ztLX+ - Hh8b/zs9OP4lJyD+JSgg/ycpIf4oKyL+Ki0j/yswJP4fbhr/HX4Y/hSoEP4cixf+MTwq/zM5K/41Oi3+ - Njwu/zg/MP5MUkb+ZGhh/2drZf5ma2T+ZWtj/2VsY/5ib2D+NqMz/zalM/42pTP+YHFd/2JuYP5hbl// - YW9e/mBvXv5gb13/X29d/l9xXP7X2df/4uLi/q6trv6qqquoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAMbGx66ysrX/GygX/yc4If8iNR3/JDce/yU4H/8mOR//Jzsh/yk9Iv8iYhz/FqER/xeeEv8rUCT/ - L0Qo/zFFKf8zRiv/NEcs/zpMMv9TY0//Y3Bh/2RwYv9kcGL/ZW9j/2RvY/9kb2L/RpJD/yO9H/84ojb/ - ZG5j/2ZsZf9na2b/Z2tm/2dqZv9oamf/aGpn/2hqZv/a29r/5ubm/66trv+goKGqAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAMbGx66ztLb+HB0Y/yQlHv4lKB/+Jykh/ygqIv4pLCP+Ky4l/y0xJf4oTCH/ - ErIN/h2HF/4xOin+Mzgs/zU6Lf42PC7+Nz4v/0RLPv5hZV/+aW1n/2ltZ/5pbmf+aG5n/2huZ/5nbmb+ - U4VR/xbNEv5Dl0H+ZHFj/2VwZP5kcGP/ZHFj/mNxYv5jcWL/YnJh/mJyYP7c3dz/6enp/q6urv6sq6yo - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHyK60tbf+HCgY/yI0HP4jNh7+JTgf/yY5H/4nOiH+ - KTwi/yo9I/4oTSL/D8IL/iB+Gv4vRCj+MUUp/zJGK/4zRyv+Nkov/01eSP5jcWD+ZnNk/2ZyZf5mcmT+ - Z3Jl/2ZxZf5ncWX+W35a/xrJF/5Njkv+aHBn/2hwZ/5pb2j/aW9o/mpuaf5qbmn/am1p/mtuav7g4OD/ - 6urq/q+vr/6srK2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHyK+0tbf/Hh8a/yUlH/8mKCD/ - KCoi/yorIv8rLST/LTAl/y4xJv8uPCb/FqMR/yhbIv8zOCz/NTot/zY8Lv83Pi//P0U3/11hWf9rbmr/ - bG5r/2xva/9rb2r/a29q/2pvaf9qcGn/ZXVj/zyiO/9cflv/aXFo/2hxZ/9ocmf/aHJn/2dyZv9nc2b/ - ZnNl/2VzZP/h4uH/7Ozs/7CvsP+xsLGfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfHyK6ys7X+ - HSoa/yM2Hf4kOB7+JTkf/yY6IP4oPCL+Kj4j/ys+JP4sQiX/KFsh/i1KJ/4xRSn+MkYq/zNIK/40SSz+ - RFY+/2BvXv5mdGX+Z3Rm/2d0Zv5odGf+aHRn/2hzZ/5oc2f+aHRn/2V3Y/5odGf+anJo/2pyaf5qcWn/ - a3Fq/mxxav5scWv/bHBr/m1xa/7k5eT/7e3t/rCvsP6zs7SiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAMfHya6srbD+ICIb/yUqH/4nLCH+KCwi/yovI/4rMCX+LTIm/y4zJ/4vNij/MTkq/jI6K/40Oyz+ - Nj0t/zY/Lv46QjL+VFpP/2tuaf5ucWz+bXFs/21xbP5tcWz+bHFr/2xya/5scWv+bHFr/2xya/5scmr+ - bHJq/2tya/5rcmr/a3Jp/mtyav5rdGr/anNp/mt0af7m5ub/7u7u/rGxsf6srKyjAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAMjIya2trbD/Hysb/yM0Hv8lNh//Jjcg/yg5Iv8pOyP/Kzwk/y0+Jv8uPyf/ - L0Ao/zBCKf8yQyr/NEUs/zVGLf9AUTr/XGdY/2ZwZP9ocmf/Z3Nn/2dzZv9nc2b/Z3Rm/2dzZf9mc2X/ - ZnNl/2ZzZv9nc2X/Z3Nm/2dzZv9ncmb/aHJn/2hyZ/9ocmf/aHJn/2lyaP/m5+b/7+/v/6+vr/+urq6Z - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMnJy6+vsLL+HyEc/yImHP4kJx3+JSkf/ycrIf4pLSL+ - Ki8j/ywwJP4tMib/LjQn/jA2Kf4yOCv+NDot/zY7L/5BRTv+WlhX/2JgYf5lYmT+ZGNj/2NiYf5hYmD+ - YWJf/2BiXv5fYV7+X2Fe/19hXv5fYV3+X2Fd/15gXf5eYV3/XmFd/l5hXf5eYF3/X2Fd/l9hXv7m5ub/ - 7+/v/qysrPnMzMxHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMzq6wsbP+cHN0/29yc/5zeHj+ - d3p7/3Z5ev5zd3j+cnZ3/3R4ef53e3z/eHx+/nyAgf5/goT+foKC/32Bgv6Ag4T+goWF/4WIiP6GiYr+ - iIuM/4iLjP6Ii4v+jI6P/42Pj/6PkZL+kZOU/5GTlP6TlZb+lJaX/5SWmP6Zmpv/nZ6f/p+hov6kpab/ - p6ip/qipqf7q6ur/7+/v+8fHx2zw8PABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0ZG6urv+ - urq8/729vf6/v8D+w8PD/8TDxP/FxcX/xcXF/8TExP7Dw8T+xcXG/sjIyf7MzMz/0M/P/9HR0f/R0dH/ - 0tLS/9PT0/7U1NT/1dTU/tbW1v/X1tb/19fX/9jY2P7Z2Nj+2dnZ/tva2v7b29v+3d3d/+Dg4P/i4uL/ - 5eXl/+fn5/7q6ur+7Ovr/+zs7P7s7Oz+8fHxmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAPj4+Abs7e0u7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v - 7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v - 7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0v7O3tL+zt7S/s7e0r/f39AQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA - /////gD/AAD//+AAAD8AAP4AAAAAHwAAwAAAAAAPAACAAAAAAAcAAIAAAAAAAwAAgAAAAAABAACAAAAA - AAEAAIAAAAAAAQAAgAAAAAADAACAAAAAAA8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAA - gAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAA - AD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAAPwAA - gAAAAAA/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAA/AACAAAAAAD8AAIAAAAAA/wAAgAAAAAD/AAD///// - //8AAP///////wAA////////AAD///////8AAP///////wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvr68B - n5+fAoODgwRzc3MHX19fC0NDQxAzMzMWHx8fGwsLCx8zMzMNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAD8/PwE/Pz8CPz8/BT8/Pwg/Pz8NKysrFB8fHx0fHx8nAAAAMgYGBkAaGhpW - Li4uaz8/P31RUFCQXl5eoWtra7B9fX3AjIyMzJqamtitrKzmt7a27Xh4eKIICAgcb29vAQAAAAAAAAAA - AAAAAAAAAAAfHx8PBAQEPRYVFVUrKytrQEBAf1FQUZReXl+nZ2dpt3R0dciBgYPWiYmL4pWUl+6hoKP4 - paWo/p2dof+Wlpr/lJSX/56eof+oqKr/ra2u/7Gxsv+ysrL/tra2/7u7u/++vr7+wsHC+zU0N4MAAAAg - AAAAAwAAAAAAAAAAAAAAAFFRU5OPjpH6iJaP/42Nkv+QkJT/mJic/52doP+enqH/mpqd/5SUmP+Li4// - i4qO/4uLj/+Oj5P/kZOX/5eZnf+jpqn/sbO0/7O1tv+srq7/pqmo/6Kkof+ZnZr/kJOP/6yurP/AwMD8 - ZWNozAAAADYAAAAeOzs7AwAAAADx8fIUjo6S/ZWVmf+PnZb/lZWX/5aXmP+RkpL/jY2N/4GDgf93eHb/ - bm9t/2NlYv9cX1r/VllU/05QSv9DRT7/OTwz/zQ3Lv8xNCv/LjIp/y4xKf8uMCj/LTAn/y0xJ/8sMyb/ - hoqE/8HBwv1pZ2zNAAAAKAAAAB0AAAANAAAAAPHx8RyTlJj/Jich/yQmH/8iJh3/IScc/x8pG/8eKhn/ - HSsZ/x4sGf8fLBr/IC0b/yEtHP8iLRz/Iy8d/yQwHv8lMh//Kzgm/y06KP8tOyf/LTso/y07J/8tOyf/ - LTon/y04J/+JjIb/wsLC/m5scckAAAATAAAADAAAAAYAAAAA8fHxHZKSl/8aJhb/JDAg/yUvIP8jKh7/ - Iigd/yAiG/8fHxr/HyEa/yEkHP8iKRz/Ii0c/yMwHf8kMx7/JDQe/yk3I/8xPiz/Mj8t/zI+Lf8zPy7/ - Mj8u/zM/Lf8zQC3/Mz8t/4yRif/CwsP+dHJ3yAAAAAUAAAADAAAAAQAAAADx8fIek5OX/xwlF/8pNCT/ - KDMj/yU5If8XgRL/IjMc/yAtG/8gLRv/Iiwc/yMqHf8kKR//Jigg/ycoIf8nLSH/JmAh/zk/NP85QjT/ - OEQz/zdHMv84RzP/OEcz/zhHM/84RjL/j5SM/8HBwf59e4DKAAAAAAAAAAAAAAAAAAAAAPHx8h+UlJj/ - HCcY/y04KP8rNif/IWAd/xOlD/8kOx//IS0c/yIuHP8iLx3/JDEe/yUyH/8mNCD/JzUg/yJTHP8VtxH/ - PE83/0BGO/9BRjz/LH0n/z5NOf9CQj3/QUM8/0FEPP+SlZD/wsHC/5KQlcgAAAAAAAAAAAAAAAAAAAAA - 8fHyH5aWmv8eJhr/MDss/y49Kv8cihf/HYEZ/yJGHf8hLhz/Ii8d/yQxHv8mMyD/JjMg/yc1If8oNiL/ - HHsX/yKYHv86ZjX/RFA//0JVPf8drRj/MX4s/z9dOv9EUj//RFE//5Wak//CwsL/lJKWwwAAAAAAAAAA - AAAAAAAAAADx8fIflZWZ/xw8GP8sWSj/Kl4m/yJ6Hv8mYiL/HVEX/yMpHv8lLR//JTYf/yQ+Hv8lQh7/ - JkEg/yg9Iv8ejRn/OHM0/zGHLf9JVUT/RV1A/yedI/8grRv/IKwc/0FmPf8xhyz/j7KN/8jIyf+ZmJvE - AAAAAAAAAAAAAAAAAAAAAPLy8h+Xlpv/GVQV/yd6I/8VshH/M08u/yVLIP8ZbBX/JS0f/yYvIP8XjRL/ - Gn4V/xx6Fv8YkRP/Jlcf/yuIJ/9NXEn/Lpcq/05ZS/9HZ0T/MJIt/0lkRf88fTj/ILAc/zKPLf+YqZb/ - yMjI/5uancQAAAAAAAAAAAAAAAAAAAAA8/PzH6CgpP8hKh3/Okc3/zZUMv80QDD/ITob/xh6E/8lMx// - JT0e/xiFE/8oOyL/Kjsj/yRdHv8Trw7/P3A7/1JfT/8vmiz/UGNN/0d0Q/89hTn/WFlU/1dbU/82kzL/ - UmFO/6GioP/Hx8f/lpSXxgAAAAAAAAAAAAAAAAAAAAD09PQfqaqs/yItH/89STr/Pkk6/yc0Iv8iNhz/ - F4AT/yU1H/8kSB3/HHcX/yo5JP8sOiX/LD4m/yl3I/9RY07/VmJU/zmRNf9Jd0b/Poo7/0Z9Q/9WZFP/ - VmRT/1ZlU/9WZFP/o6mi/8vLy/+XlpnHAAAAAAAAAAAAAAAAAAAAAPT09B+wsLL/JSgi/0RHQf82PTP/ - Iywd/yUxH/8YfhT/Jjwg/yFiG/8iZBz/LT0m/y4+J/8vQCn/Q1I+/1pmVv9aZlf/Sn5H/z2QOv86ljf/ - UXVO/1tnWP9bZ1j/W2dY/1pnV/+orab/0NDQ/6CfocEAAAAAAAAAAAAAAAAAAAAA9PT0H7Gxs/8nLyP/ - REtB/ygvIv8mLCD/KC0i/x11F/8pQCP/IHQa/yxIJf8zNiz/NTgt/zk9Mf9XWVP/ZGZh/2NnYP9bcVj/ - OJ41/zieNf9Zclb/X2pc/15qW/9da1v/XGpZ/6uwqv/V1dX/oJ+hwwAAAAAAAAAAAAAAAAAAAAD09PQf - srK0/ycxI/80QC//JDIe/yY0IP8oNiH/H20Z/yFsGv8VpBH/LUcn/zJCKv80Qyz/PUw3/15pW/9ibGD/ - Y2xh/2FvXv81pDP/N6I0/2JsYP9maGT/Zmdk/2ZnZf9mZmT/sbGv/9jY2P+enZ/FAAAAAAAAAAAAAAAA - AAAAAPT09B+wsbL/Iiwf/yUxH/8lMh//JjQg/yg2Iv8lVh7/FqAR/yNuHf8wQCn/M0Ir/zVELf9LWEX/ - ZG5i/2RvYv9kbmL/Y29h/zejNP8zqDD/YXBg/2NvYf9jb2H/Ym9h/2JuYP+yt7H/2tra/5+foMYAAAAA - AAAAAAAAAAAAAAAA9PT0H7Gxs/8eJxn/JDEe/yY0IP8nNiH/KTkj/yhKIv8Rtg3/LE0l/zJBKv80RCz/ - N0gw/1llVf9mcWT/ZnFk/2ZxZP9lcWT/QZo+/zOrMP9kcWP/ZXFk/2VwZP9lcWT/ZHBj/7a6tf/d3d3/ - paWmwwAAAAAAAAAAAAAAAAAAAAD09PUfsrO1/yAhG/8mJyD/KCki/yosJP8tLyb/LTgm/xidE/8yPCr/ - NTot/zc9L/9EST3/aWpn/2xua/9sbmv/a25q/2pvaf9Yg1f/SJVG/2pwaf9pcGj/aXBo/2lxZ/9ncWb/ - ub24/9/f3/+oqKi/AAAAAAAAAAAAAAAAAAAAAPX19R+wsLL/ICsb/yUzH/8mNSD/KDgi/ys6JP8tPSb/ - LE0l/zFCKv8zQyz/NUYu/1BdTP9ocmf/anNp/2pyaf9qcmn/a3Jp/2pzaf9qc2j/bHFr/2xxa/9tcGv/ - bXBs/2xva/+9v73/4ODg/6mpqcEAAAAAAAAAAAAAAAAAAAAA9fX1H62tsP8hKxz/JTIf/yc0If8pNyP/ - LDkl/y47J/8wPin/MkAq/zRDLP87SjT/Xmdb/2lxaP9pcmj/aHNn/2dzZv9nc2b/Z3Nm/2dzZv9nc2b/ - Z3Nm/2d0Zv9odGb/Z3Nm/73BvP/g4OD/qKiovQAAAAAAAAAAAAAAAAAAAAD19fUfsLCz/yssKP8sLyj/ - LjAp/zAyK/8xMyv/MzYt/zQ3L/83OjL/Oj00/0BCO/9UU1L/WlhZ/1pZWf9ZWln/WlpY/1lbWf9aW1n/ - WlxZ/1tcWv9bXVv/XV9d/19gXv9hYmD/uru6/97e3v3FxcVhAAAAAAAAAAAAAAAAAAAAAPb29ha4uLn7 - sbS1/re5uv68v8D/vL6//7u+v/68v8D+v8LE/sXIyf7Iysv+yszN/83Pz//P0dL+0dPU/tHT1P/T1dX+ - 1dfX/tfZ2f7Z2tv+29zd/9/g4f7k5eX+6Onp/urs7P7s7Oz+7u7uhQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAPT09Bfy8/Mf8vPzH/Lz8x/y8/Mf8vPzH/Lz8x/y8/Mf8vPzH/Lz8x/y8/Mf8vPzH/Lz8x/y8/Mf - 8vPzH/Lz8x/y8/Mf8vPzH/Lz8x/y8/Mf8vPzH/Lz8x/y8/Mf8vPzH/Lz8x4AAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////+AH/gAAAeAAAAD - gAAAAQAAAAEAAAABAAAAAQAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAP - AAAADwAAAA8AAAAPAAAADwAAAA8AAAAfgAAAP////////////////ygAAAAYAAAAMAAAAAEAIAAAAAAA - YAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxcXARcXFwN5eXkH - enp6DGdnZxNSUlIbQEBAIzk4ODI4ODhDNDMzO09PTwUAAAAAAAAAAAAAAAAAAAAAFRUVCAAAABQAAAAe - BAQELBISEj4lJSVTNjY2aEJCQ31NTU6SWVlapmVlZ7pycXPLg4KE2ZiYmeWqqqvwuLi4+r6+vv6+vr7+ - v7+/+TEwMmUoKCgKAAAAAAAAAACxsbELW1pdunZ9eueMjI/zo6Km/Kenqv6goKT+l5eb/o2Nkf6Li4/+ - jI2R/o+Rlf6WmJz+p6ir/rCxsv6rra3+p6mn/qKkov6anZr+vr6+/nh2etIAAAAwHR0dCwAAAADY2NpQ - iYmM/3iAe/55eXn/d3l3/3JzcP5oaWb/XV9c/1RWUf5NT0r/R0lD/z0+N/80Ny3+MTYr/y02KP4tNyf/ - LDcm/ys3Jf4sNyb/uru6/oB+gtgAAAAiAAAAFL+/vwHY2NpVV1tW/yEqHP4jLB7/ISoc/x8oGv4eKBn/ - Hyga/yErG/4iKxz/Iy0d/yQvHv8pNCP+Lzoq/y86K/4wOiv/MDsr/zA7Kv4wOyr/vLy8/oWEiNUAAAAK - AAAABQAAAADY2NpWV1pX/icwIv4nMCP+Hlca/iA3G/4gKhv+ISsb/iIsHP4kLh7+JS8f/iYzIP4qVCX+ - N0Iy/jdDMv43QzL+OEMz/jhDM/44QzL+vb29/o2Lj9YAAAAAAAAAAAAAAADZ2dpXWFxY/yw1J/4rNyf/ - GI0U/yBVG/4iKxz/Iywd/yQuHv4mMCD/JzIh/yNPHf8fnhr+P0s6/0BLOv4qgyX/P0w6/z9KO/5ASzv/ - vr++/52cn9UAAAAAAAAAAAAAAADY2NpXWV9Z/y8/Kv4qWCX/I2wf/xxjF/4iLB3/JC8e/yYzIP4nNCH/ - KTUi/x90Gv8riif+RFg//0VWQP4gqhv/K48n/0JcPv5CXj3/wcLB/6OipdIAAAAAAAAAAAAAAADZ2dtX - WHBY/yR5IP4cmhj/MEMs/xlqFf4kLh7/IFIb/xp9FP4cdhf/IGwa/yeCIv8/czv+P3Q7/0liRf41iDH/ - P3c6/yeiI/4wlCv/xcfF/6akp9MAAAAAAAAAAAAAAADb291XYWVg/jlCNf45TTX+KTMj/hpwFP4mMSD+ - HWwX/ic/If4rOST+HIQX/jh9NP5PZUz+OYs1/khyRf5DfED+VV9R/kCBPP5RZE3+yMjI/qCfodUAAAAA - AAAAAAAAAADh4eFXZWll/z1GOv42PzL/Iy0d/xtsFv4mNiD/HXMX/ys5JP4tOib/MUYq/1NhT/9ZZFb+ - OpI3/0OFQP5Qck3/WmRX/1pkV/5aZFf/zs/O/6emqNIAAAAAAAAAAAAAAADi4uJXaGxn/kFKPv4oMiP+ - JjEg/h9nGf4pQyL+IHYa/jA9Kf4zQCv+Qk07/l9oXP5gaV3+P5Q8/j+UPP5ab1f+X2lc/l9oXP5eaFv+ - 1dbV/qqpq9EAAAAAAAAAAAAAAADi4uNXaGxo/zQ9L/4lLx//JzIh/yJaHf4cgRf/I3Ad/zI/Kv41Qi3/ - UVxN/2NsYf9jbGH+SYxH/zeiNf5hbl//Y2th/2NrYf5ia2D/29zb/6mpqtMAAAAAAAAAAAAAAADi4uNX - Z2tm/yQuH/4mMSD/KDQi/yhHIf4XnhL/MEIo/zRALP46RzP/YGld/2ZvZf9mbmX+WX1X/y2xKv5lb2T/ - Zm5k/2VuZP5lbmP/4eLh/6qqqtQAAAAAAAAAAAAAAADj4+NXaGxo/iQuHv4nMSH+KjUj/is+JP4bjxb+ - Mj8q/jVCLf5IU0L+aHBm/mlxZ/5ocGf+ZHVj/kCePv5ocGf+aXBn/mlwZ/5ocGf+5ubm/q+vr88AAAAA - AAAAAAAAAADj4+RXZ2tm/yUxH/4nNCH/Kjck/y06Jv4uRif/M0Er/zZELv5ZY1X/anNp/2pyaf9qcmn+ - anJp/2lzaP5rcmr/a3Jp/2tyav5rcmr/6erp/7CwsNAAAAAAAAAAAAAAAADk5ORXZ2pm/yQuHv4nMSD/ - KjUj/y04Jf4vOyn/Mz4r/ztGNP5fZF3/Zmpl/2VqY/9ja2L+Y2pi/2NqYv5jamL/Y2li/2NpYv5kamP/ - 6urq/7W1tbYAAAAAAAAAAAAAAADm5udPpaan/piamv6dnp/+nJ6e/pyfn/6goqP+pqio/qipqv6rrKz+ - rq+v/q+xsf6ys7P+tLa2/ra4uP65urv+v8DA/sXGxv7Jysr+7e3t5Onp6RsAAAAAAAAAAAAAAAD9/f0B - 9fb2F/X29hf19vYX9fb2F/X29hf19vYX9fb2F/X29hf19vYX9fb2F/X29hf19vYX9fb2F/X29hf19vYX - 9fb2F/X29hf19vYX+vr6CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD/wAcA - gAADAAAAAQAAAAAAAAABAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcA - AAAHAAAABwAAAA8A////AP///wAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAACfn58Bn5+fBZKSkgxPT08WGBgYJW1tbTp0dHROb25uYGdnZ3NkY2OD - SUlJMwAAAAAAAAAAjo6PKExPTqNiYmS6eXl7zoWFh9+Kio3tk5KW+ZiZnf6Zmp7/q6yt/6ytrf+pqqn/ - ra6t/oeGiNIAAAAeAAAAAMHBw4tcYFz/XF5a/1ddVf9NVEr/REtB/z1FOf82PTD/Lzcq/y42Kf8tNij/ - LTYn/1pgVv+XlZjkAAAAGX9/fwXCwsSOISwc/yUxIP8fPxr/ICcb/yIpHP8kKx7/Ji8g/y5FKf81QTD/ - NUMw/zVDMP9ha13/nZyf5EBAQAIAAAAAw8PGjyYwIv8lVyH/HWoZ/yIuHP8kMR7/JjQg/yNPHf8rgSf/ - QUw8/y59Kf9CTT3/a3Fn/6qqrOIAAAAAAAAAAMTDxo8iWR7/JXYh/yBbHP8lLR//HmAZ/yBjGv8maiH/ - OXs1/0ldRf8wkCz/L5Ar/2KcX/+xsLLhAAAAAAAAAADMzM6PLzor/zREMP8dWxf/JTse/yJcHP8qRCP/ - M34v/0R7Qf9IdkT/THBJ/05uSv97hHn/sK+x4wAAAAAAAAAA0tLTjzU6Mf8qMSX/IVQb/yRVHv8rSCX/ - Mz0r/1ZeUv9Zb1b/Opg3/1luVv9caVr/gouA/7m5uuAAAAAAAAAAANPT1I8pNCT/JTMf/yVMH/8chxb/ - MUMp/zxLNf9ibGD/Y25h/zakM/9jbWH/ZGtj/4uPif+8vLziAAAAAAAAAADT09SPIigd/ygwIf8rOiT/ - Incc/zQ/LP9PWEr/aW9n/2hwZ/9FmEP/Z3Bm/2dwZv+Plo7/wsLC4AAAAAAAAAAA0tLTjyIvHf8oNiL/ - LDsl/zBDKf82RS7/YGpd/2lzaP9pc2j/aHNn/2pyaP9qcmn/k5mT/8TExN8AAAAAAAAAANXV1oxwcnD+ - dXh1/3d5dv58f3z+g4WC/pOTk/6Vlpb+l5iX/pmamv6cnZz+oqOi/ry9vP7h4eF5AAAAAAAAAAD8/PwF - +Pn5D/j5+Q/4+fkP+Pn5D/j5+Q/4+fkP+Pn5D/j5+Q/4+fkP+Pn5D/j5+Q/4+fkPAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAP//AAD//wAA4AMAAAABAAAAAAAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAA - AAcAAP//AAA= - - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogBuffer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogBuffer.cs deleted file mode 100644 index a2fa741805..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogBuffer.cs +++ /dev/null @@ -1,178 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Stores and splits the log string into types message warning error -// Functionality to adds the latest log to a textbox and to query some info about the log - - -using System.Collections.Generic; -using System.Drawing; -using System.Runtime.InteropServices; - -namespace RemoteConsole -{ - class LogBuffer - { - private System.Text.StringBuilder sb = new System.Text.StringBuilder(4048); - private List selColors = new List(); - private List selIndex = new List(); - private List colors = new List(); - private System.Text.StringBuilder sbSingleLine = new System.Text.StringBuilder(256); - - private List linesMessage = new List(); - private List linesError = new List(); - private List linesWarning = new List(); - - public LogBuffer() - { - colors.Add(Color.Black); - colors.Add(Color.White); - colors.Add(Color.Blue); - colors.Add(Color.Green); - colors.Add(Color.Red); - colors.Add(Color.LightBlue); - colors.Add(Color.Yellow); - colors.Add(Color.Magenta); - colors.Add(Color.Orange); - colors.Add(Color.LightGray); - } - - public void clear() - { - sb.Clear(); - linesMessage.Clear(); - linesError.Clear(); - linesWarning.Clear(); - } - - public List GetLinesInBuffer(EMessageType msgType) - { - switch (msgType) - { - case EMessageType.eMT_Message: return linesMessage; - case EMessageType.eMT_Warning: return linesWarning; - case EMessageType.eMT_Error: return linesError; - } - - return null; - } - - public int GetNumLinesInBuffer() - { - return linesMessage.Count + linesWarning.Count + linesError.Count; - } - - public bool IsBufferEmpty() - { - return sb.Length == 0; - } - - public bool IsTagInBuffer(string tag) - { - return sb.ToString().Contains(tag); - } - - public void addLine(string line, Color color, EMessageType msgType) - { - sbSingleLine.Clear(); - - // color input - selColors.Add(color); - int len = sb.Length; - selIndex.Add(len); - - // append new line - int f = 0; - for (int i = 0; i < line.Length && line[i] != '\0'; ++i) - { - if (line[i] == '$' && i + 1 < line.Length && line[i + 1] >= '0' && line[i + 1] <= '9') - { - int colIdx = int.Parse(line[i + 1].ToString()); - selColors.Add(colors[colIdx]); - selIndex.Add(len + i - f); - f += 2; - i++; - } - else - { - sb.Append(line.Substring(i, 1)); - sbSingleLine.Append(line.Substring(i, 1)); - } - } - sb.Append("\n"); - sbSingleLine.Append("\n"); - switch (msgType) - { - case EMessageType.eMT_Message: linesMessage.Add(sbSingleLine.ToString()); break; - case EMessageType.eMT_Warning: linesWarning.Add(sbSingleLine.ToString()); break; - case EMessageType.eMT_Error: linesError.Add(sbSingleLine.ToString()); break; - default: linesMessage.Add(sbSingleLine.ToString()); break; - - } - } - - [DllImport("user32.dll")] - public static extern int SendMessage(System.IntPtr hWnd, System.Int32 wMsg, bool wParam, System.Int32 lParam); - private const int WM_SETREDRAW = 11; - - public void addToTextBox(System.Windows.Forms.RichTextBox b, bool bClear = true, bool bFlatColor = false) - { - if (sb.Length > 0) - { - if (!Common.IsRunningOnMono()) - SendMessage(b.Handle, WM_SETREDRAW, false, 0); - - int selStart = b.SelectionStart; - int selLen = b.SelectionLength; - - int length = b.TextLength; - int lenAdd = sb.Length; - string text = sb.ToString(); - b.AppendText(text); - if (bClear) - { - sb.Clear(); - } - selIndex.Add(lenAdd); - - if (bFlatColor == true) - { - b.SelectionColor = Color.White; - } - else - { - for (int i = 0; i < selColors.Count; ++i) - { - b.Select(length + selIndex[i], selIndex[i + 1] - selIndex[i]); - b.SelectionColor = selColors[i]; - } - } - - if (selStart == length) - { - selStart = length + lenAdd; - selLen = 0; - } - - b.Select(selStart, selLen); - b.ScrollToCaret(); - - selColors.Clear(); - selIndex.Clear(); - if (!Common.IsRunningOnMono()) - SendMessage(b.Handle, WM_SETREDRAW, true, 0); - b.Refresh(); - } - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogChart.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogChart.cs deleted file mode 100644 index 156f675574..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogChart.cs +++ /dev/null @@ -1,103 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -namespace RemoteConsole -{ - class LogChart - { - private System.Windows.Forms.DataVisualization.Charting.Chart chart; - - public LogChart(System.Windows.Forms.DataVisualization.Charting.Chart theChart) - { - chart = theChart; - if (chart != null) - { - chart.ChartAreas.Clear(); - chart.ChartAreas.Add("Full"); - } - } - - public System.Windows.Forms.DataVisualization.Charting.SeriesCollection GetSeries() { return chart.Series; } - public void ClearSeries() { if (chart!=null) chart.Series.Clear(); } - public void AddSeries(string seriesName) - { - if (chart != null && !Common.IsRunningOnMono()) - { - chart.Series.Add(seriesName); - for (var i = 0; i < LogFilterManager.SingleFilterHistory.BufferSize; ++i) - { - chart.Series[seriesName].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(i, 0)); - } - chart.Series[seriesName].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; - chart.ChartAreas["Full"].AxisY.IntervalAutoMode = System.Windows.Forms.DataVisualization.Charting.IntervalAutoMode.VariableCount; - chart.ChartAreas["Full"].AxisY.Maximum = 10; - chart.ChartAreas["Full"].AxisY.Minimum = 0; - chart.ChartAreas["Full"].AxisX.Minimum = 0; - } - } - - public void ClearData() - { - if (chart != null) - { - foreach (var serie in chart.Series) - { - for (var i = 0; i < LogFilterManager.SingleFilterHistory.BufferSize; ++i) - { - serie.Points[i].SetValueY(0); - } - } - } - } - - public void Refresh() - { - if (chart != null) chart.Refresh(); - } - - public void SetYValue(string seriesName, int pointIndex, float value) - { - if (chart != null && !Common.IsRunningOnMono()) chart.Series[seriesName].Points[pointIndex].SetValueY(value); - } - - public void ShowHideLegend(string seriesName, bool isChecked) - { - if (chart != null) - { - if (System.Windows.Forms.Control.ModifierKeys == System.Windows.Forms.Keys.Control) - { - // Select All - foreach (var s in chart.Series) - { - s.IsVisibleInLegend = s.Enabled = isChecked; - } - } - else if (System.Windows.Forms.Control.ModifierKeys == System.Windows.Forms.Keys.Shift) - { - // Toggle All - foreach (var s in chart.Series) - { - s.IsVisibleInLegend = s.Enabled = !isChecked; - } - } - - // Toggle Selected - var selected = chart.Series[seriesName]; - if (selected != null) - { - selected.IsVisibleInLegend = selected.Enabled = isChecked; - } - } - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogDisplayControl.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogDisplayControl.cs deleted file mode 100644 index 5e548d201f..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogDisplayControl.cs +++ /dev/null @@ -1,143 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Control to display the log data it could be either a LISTVIEW or a RICHTEXTBOX - - -using System.Windows.Forms; - -namespace RemoteConsole -{ - class LogDisplayControl - { - private ListView lv = null; - private RichTextBox rtb = null; - - public enum EType - { - eT_ListView = 0, - eT_RichTextBox - } - - public Control GetControl() - { - if (lv != null) - return lv; - else - return rtb; - } - - public LogDisplayControl(EType controlType, ContextMenuStrip contextMenu, int textColor) - { - if (controlType == EType.eT_ListView) - { - lv = new ListView(); - lv.Dock = System.Windows.Forms.DockStyle.Fill; - lv.FullRowSelect = true; - lv.GridLines = true; - lv.Location = new System.Drawing.Point(3, 3); - lv.Size = new System.Drawing.Size(797, 118); - lv.UseCompatibleStateImageBehavior = false; - lv.View = System.Windows.Forms.View.Details; - lv.ContextMenuStrip = contextMenu; - - lv.Columns.Add("I"); - lv.Columns.Add("Description"); - lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - lv.ForeColor = System.Drawing.Color.FromArgb(textColor); - } - else - { - rtb = new RichTextBox(); - rtb.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - rtb.BackColor = System.Drawing.SystemColors.WindowText; - rtb.ContextMenuStrip = contextMenu; - rtb.ForeColor = System.Drawing.Color.Silver; - rtb.Location = new System.Drawing.Point(3, 6); - rtb.ReadOnly = true; - rtb.Size = new System.Drawing.Size(700, 233); - rtb.TabIndex = 1; - rtb.Text = ""; - rtb.ScrollBars = RichTextBoxScrollBars.Both; - rtb.Dock = DockStyle.Fill; - rtb.ForeColor = System.Drawing.Color.FromArgb(textColor); - } - - } - - public int GetNumItems() - { - return (lv != null) ? lv.Items.Count : rtb.Lines.Length; - } - - public void AddLine(string line) - { - if (lv != null) - { - ListViewItem lvi = new ListViewItem(lv.Items.Count.ToString()); - lvi.SubItems.Add(line); - lv.Items.Add(lvi); - lv.EnsureVisible(lv.Items.Count - 1); - } - else - { - rtb.AppendText(line); - } - } - - public void Clear() - { - if (lv != null) - lv.Items.Clear(); - else if (rtb != null) - rtb.Clear(); - } - - public void Copy() - { - if (lv != null) - { - Clipboard.Clear(); - string fullText = ""; - foreach (ListViewItem item in lv.SelectedItems) - { - fullText += item.SubItems[1].Text;// +Environment.NewLine; - } - Clipboard.SetText(fullText); - } - else if (rtb != null) - { - rtb.Copy(); - } - } - - public void SelectAll() - { - if (lv != null) - { - foreach (ListViewItem item in lv.Items) - { - item.Selected = true; - } - } - else - { - rtb.SelectAll(); - } - } - - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogFilterManager.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogFilterManager.cs deleted file mode 100644 index 60192f23d6..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/LogFilterManager.cs +++ /dev/null @@ -1,381 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -/* - * Project: Universal Remote Console - * File: LogFilterManager.cs - * Author: Dario Sancho (2014) - * - * Description: - * Manages the display of log data - * Adds log display controls to the Main Form, keeps statistic data buffer, - * handles context menus on display log controls - */ - -#define USE_LIST_BOX - -using System.Collections.Generic; -using System.Text.RegularExpressions; -using System.Windows.Forms; - -namespace RemoteConsole -{ - class LogFilterManager - { - public const string TotalCountSeriesName = "Total"; - private const string strFullLogTabName = "Full Log"; - - public History StatsHistory { get; private set; } - private TabPage fullLogTabPtr; - private List customFilters; - private List standardFilters; - - public enum EContextMenuAction - { - eCM_SelectAll = 0, - eCM_Clear, - eCM_Copy, - eCM_ClearAllLogs, - } - - class LogData - { - public TabPage TabPtr { get; private set; } - public LogDisplayControl ControlPtr { get; private set; } - public FilterData Data { get; private set; } - public int LineCountPerTick { get; private set; } - - public LogData(LogDisplayControl ctrl, TabPage tab, FilterData data) - { - TabPtr = tab; - ControlPtr = ctrl; - Data = data; - LineCountPerTick = 0; - } - - public void AddLine(string line) - { - ControlPtr.AddLine(line); - ++LineCountPerTick; - } - - public void ClearPerTickCounter() { LineCountPerTick = 0; } - - public void UpdateFilterLabel() - { - TabPtr.Text = Data.Label + "[" + ControlPtr.GetNumItems() + "]"; - } - public void Clear() - { - ControlPtr.Clear(); - LineCountPerTick = 0; - UpdateFilterLabel(); - } - } - - public class SingleFilterHistory - { - public const int BufferSize = 600; - public string Name { get; private set; } - public int Back { get; private set; } - public int Front { get; private set; } - public List Buffer { get; private set; } - - public int Iterator { get; private set; } - - public SingleFilterHistory(string name) - { - Name = name; - Buffer = new List(BufferSize); - for (int i = 0; i < BufferSize; ++i) - { - Buffer.Add(0); - } - Back = 0; Front = 0; - } - public void Clear() - { - Back = Front = 0; - ResetIterator(); - for (int i = 0; i < BufferSize; ++i) - Buffer[i] = 0; - } - - public void Add(float value) - { - Buffer[Front++] = value; - if (Front >= BufferSize) - { - Front = 0; - } - - if (Front <= Back) - Back = Front + 1; - - if (Back >= BufferSize) - Back = 0; - } - - public void ResetIterator() { Iterator = Back; } - public bool NextIterator() - { - if (++Iterator >= BufferSize) - Iterator = 0; - - return (Iterator != Front); - } - } - - public class History - { - public List Data { get; private set; } - - public History() { Data = new List(); } - - public void Clear() - { - foreach (var h in Data) - h.Clear(); - } - public void AddSeries(string name) - { - if (GetSeries(name) == null) - { - Data.Add(new SingleFilterHistory(name)); - } - } - public SingleFilterHistory GetSeries(string name) - { - string lowerName = name.ToLower(); - foreach (var h in Data) - { - if (h.Name.ToLower() == lowerName) - { - return h; - } - } - return null; - } - } - - public LogFilterManager() - { - customFilters = new List(); - standardFilters = new List(); - StatsHistory = new History(); - } - - public void SetFullLogTab(TabPage tp) { fullLogTabPtr = tp; } - - public void Clear() - { - customFilters.Clear(); - standardFilters.Clear(); - StatsHistory.Data.Clear(); - } - - public void ClearHistory() - { - StatsHistory.Clear(); - } - - public void AddFilter(FilterData data, TabControl targetTabControl, ContextMenuStrip contextMenuStrip) - { - // Create Tab - TabPage tab = new TabPage(data.Label); - - // Create Control to display the log info -#if USE_LIST_BOX - LogDisplayControl ctl = new LogDisplayControl(LogDisplayControl.EType.eT_ListView, contextMenuStrip, data.TextColor); -#else - LogDisplayControl ctl = new LogDisplayControl(LogDisplayControl.EType.eT_RichTextBox, contextMenuStrip, data.TextColor); -#endif - // Add tab to tab controller - tab.Controls.Add(ctl.GetControl()); - targetTabControl.TabPages.Add(tab); - targetTabControl.Dock = DockStyle.Fill; - - // keep track - LogData logData = new LogData(ctl, tab, data); - - if (data.MsgType == EMessageType.eMT_Message) - customFilters.Add(logData); - else - standardFilters.Add(logData); - } - - public bool UpdateTabs(LogBuffer buffer, ref List execList) - { - bool res = false; - int totalCount = 0; - - if (buffer.IsBufferEmpty() == false) - { - // Full Log Tab - fullLogTabPtr.Text = "Full Log [" + ((RichTextBox)fullLogTabPtr.Controls[0]).Lines.Length.ToString() + "]"; - - // Standard Tabs - foreach (LogData filter in standardFilters) - { - List lines = buffer.GetLinesInBuffer(filter.Data.MsgType); - foreach (string line in lines) - { - filter.AddLine(line); - totalCount++; - res = true; - } - filter.UpdateFilterLabel(); - } - - // Custom Tabs - List lines1 = buffer.GetLinesInBuffer(EMessageType.eMT_Message); - foreach (LogData filter in customFilters) - { - foreach (string line in lines1) - { - bool found = false; - // Check Label - if (line.Contains(filter.Data.Tag)) - { - found = true; - } - // Check RegExp - else if (filter.Data.RegExpText != null && filter.Data.RegExpText.Length > 0) - { - Regex rgx = new Regex(filter.Data.RegExpText); - if (rgx.IsMatch(line)) - { - found = true; - } - } - - if (found) - { - filter.AddLine(line); - totalCount++; - res = true; - - // Apply Exec Commands - if (filter.Data.Execute != null) - { - foreach (FilterData.Exec e in filter.Data.Execute) - { - if (e.Type != FilterData.Exec.EExecType.eET_None) - execList.Add(e); - } - } - } - - } - filter.UpdateFilterLabel(); - } - } - - foreach (var f in standardFilters) - { - if (f.Data.Label != null) - StatsHistory.GetSeries(f.Data.Label).Add(f.LineCountPerTick); - - f.ClearPerTickCounter(); - } - - foreach (var f in customFilters) - { - if (f.Data.Label != null) - StatsHistory.GetSeries(f.Data.Label).Add(f.LineCountPerTick); - - f.ClearPerTickCounter(); - } - - var h = StatsHistory.GetSeries(LogFilterManager.TotalCountSeriesName); - if (h != null) - h.Add(totalCount); - - return res; - } - - private void ExecuteContextMenu_InternalFullLog(Control ctrl, EContextMenuAction action) - { - switch (action) - { - case EContextMenuAction.eCM_SelectAll: - ((RichTextBox)ctrl).SelectAll(); - return; - case EContextMenuAction.eCM_Clear: - ((RichTextBox)ctrl).Clear(); - return; - case EContextMenuAction.eCM_Copy: - ((RichTextBox)ctrl).Copy(); - return; - } - } - - private void ExecuteContextMenu_Internal(LogData data, EContextMenuAction action) - { - switch (action) - { - case EContextMenuAction.eCM_SelectAll: - data.ControlPtr.SelectAll(); - return; - case EContextMenuAction.eCM_Clear: - data.Clear(); - return; - case EContextMenuAction.eCM_Copy: - data.ControlPtr.Copy(); - return; - } - } - - public void ExecuteContextMenu(Control ctrl, EContextMenuAction action) - { - if (action == EContextMenuAction.eCM_ClearAllLogs) - { - ((RichTextBox)fullLogTabPtr.Controls[0]).Clear(); - fullLogTabPtr.Text = strFullLogTabName + " [0]"; - - foreach (LogData data in customFilters) - data.Clear(); - foreach (LogData data in standardFilters) - data.Clear(); - - return; - } - - if (fullLogTabPtr.Controls[0] == ctrl) - { - ExecuteContextMenu_InternalFullLog(ctrl, action); - fullLogTabPtr.Text = strFullLogTabName + " [0]"; - return; - } - - foreach (LogData data in customFilters) - { - Control c = data.ControlPtr.GetControl(); - if ( c== ctrl) - { - ExecuteContextMenu_Internal(data, action); - return; - } - } - - foreach (LogData data in standardFilters) - { - Control c = data.ControlPtr.GetControl(); - if (c == ctrl) - { - ExecuteContextMenu_Internal(data, action); - return; - } - } - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/DeviceBase.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/DeviceBase.cs deleted file mode 100644 index 0cfc96f6da..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/DeviceBase.cs +++ /dev/null @@ -1,72 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// Copyright (c) 2009, Tom Lokovic -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -namespace Midi -{ - /// - /// Common base class for input and output devices. - /// - /// This base class exists mainly so that input and output devices can both go into the same - /// kinds of MidiMessages. - public class DeviceBase - { - /// - /// Protected constructor. - /// - /// The name of this device. - protected DeviceBase(string name) - { - Name = name; - } - - /// - /// The name of this device. - /// - public string Name { get; private set; } - } - - /// - /// Exception thrown when an operation on a MIDI device cannot be satisfied. - /// - public class DeviceException : System.ApplicationException - { - /// - /// Constructs exception with a specific error message. - /// - /// - public DeviceException(string message) { } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/InputDevice.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/InputDevice.cs deleted file mode 100644 index 608d56c1c6..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/InputDevice.cs +++ /dev/null @@ -1,385 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// Copyright (c) 2009, Tom Lokovic -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Collections.ObjectModel; -using System.Text; - -namespace Midi -{ - /// - /// A MIDI input device. - /// - public class InputDevice : DeviceBase - { - #region Delegates - - /// - /// Delegate called when an input device receives a midi message. - /// - public delegate void MidiHandler(MidiMessage msg); - - #endregion - - #region Events - - /// - /// Event called when an input device receives a midi message. - /// - public event MidiHandler MidiTrigger; - - /// - /// Removes all event handlers from the input events on this device. - /// - public void RemoveAllEventHandlers() - { - MidiTrigger = null; - } - - #endregion - - #region Public Methods and Properties - - /// - /// List of input devices installed on this system. - /// - public static ReadOnlyCollection InstalledDevices - { - get - { - lock (staticLock) - { - if (installedDevices == null) - { - installedDevices = MakeDeviceList(); - } - return new ReadOnlyCollection(installedDevices); - } - } - } - - /// - /// True if this device has been successfully opened. - /// - public bool IsOpen - { - get - { - if (isInsideInputHandler) - { - return true; - } - lock (this) - { - return isOpen; - } - } - } - - /// - /// Opens this input device. - /// - /// The device is already open. - /// The device cannot be opened. - /// Note that Open() establishes a connection to the device, but no messages will - /// be received until is called. - public void Open() - { - if (isInsideInputHandler) - { - throw new InvalidOperationException("Device is open."); - } - lock (this) - { - CheckNotOpen(); - CheckReturnCode(Win32API.midiInOpen(out handle, deviceId, - inputCallbackDelegate, (UIntPtr)0)); - isOpen = true; - } - } - - /// - /// Closes this input device. - /// - /// The device is not open or is still - /// receiving. - /// The device cannot be closed. - public void Close() - { - if (isInsideInputHandler) - { - throw new InvalidOperationException("Device is receiving."); - } - lock (this) - { - CheckOpen(); - CheckReturnCode(Win32API.midiInClose(handle)); - isOpen = false; - } - } - - /// - /// True if this device is receiving messages. - /// - public bool IsReceiving - { - get - { - if (isInsideInputHandler) - { - return true; - } - lock (this) - { - return isReceiving; - } - } - } - - /// - /// Starts this input device receiving messages. - /// - public void StartReceiving()//Clock clock) - { - if (isInsideInputHandler) - { - throw new InvalidOperationException("Device is receiving."); - } - lock (this) - { - CheckOpen(); - CheckNotReceiving(); - CheckReturnCode(Win32API.midiInStart(handle)); - isReceiving = true; - //this.clock = clock; - } - } - - /// - /// Stops this input device from receiving messages. - /// - /// - /// This method waits for all in-progress input event handlers to finish, and then - /// joins (shuts down) the background thread that was created in - /// . Thus, when this function returns you can be sure that no - /// more event handlers will be invoked. - /// It is illegal to call this method from an input event handler (ie, from the - /// background thread), and doing so throws an exception. If an event handler really needs - /// to call this method, consider using BeginInvoke to schedule it on another thread. - /// - /// The device is not open; is not receiving; - /// or called from within an event handler (ie, from the background thread). - /// The device cannot start receiving. - public void StopReceiving() - { - if (isInsideInputHandler) - { - throw new InvalidOperationException( - "Can't call StopReceiving() from inside an input handler."); - } - lock (this) - { - CheckReceiving(); - CheckReturnCode(Win32API.midiInStop(handle)); - //clock = null; - isReceiving = false; - } - } - - #endregion - - #region Private Methods - - /// - /// Makes sure rc is MidiWin32Wrapper.MMSYSERR_NOERROR. If not, throws an exception with an - /// appropriate error message. - /// - /// - private static void CheckReturnCode(Win32API.MMRESULT rc) - { - if (rc != Win32API.MMRESULT.MMSYSERR_NOERROR) - { - StringBuilder errorMsg = new StringBuilder(128); - rc = Win32API.midiInGetErrorText(rc, errorMsg); - if (rc != Win32API.MMRESULT.MMSYSERR_NOERROR) - { - throw new DeviceException("no error details"); - } - throw new DeviceException(errorMsg.ToString()); - } - } - - /// - /// Throws a MidiDeviceException if this device is not open. - /// - private void CheckOpen() - { - if (!isOpen) - { - throw new InvalidOperationException("Device is not open."); - } - } - - /// - /// Throws a MidiDeviceException if this device is open. - /// - private void CheckNotOpen() - { - if (isOpen) - { - throw new InvalidOperationException("Device is open."); - } - } - - /// - /// Throws a MidiDeviceException if this device is not receiving. - /// - private void CheckReceiving() - { - if (!isReceiving) - { - throw new DeviceException("device not receiving"); - } - } - - /// - /// Throws a MidiDeviceException if this device is receiving. - /// - private void CheckNotReceiving() - { - if (isReceiving) - { - throw new DeviceException("device receiving"); - } - } - - /// - /// Private Constructor, only called by the getter for the InstalledDevices property. - /// - /// Position of this device in the list of all devices. - /// Win32 Struct with device metadata - private InputDevice(UIntPtr deviceId, Win32API.MIDIINCAPS caps) - : base(caps.szPname) - { - this.deviceId = deviceId; - this.caps = caps; - this.inputCallbackDelegate = new Win32API.MidiInProc(this.InputCallback); - this.isOpen = false; - //this.clock = null; - } - - /// - /// Private method for constructing the array of MidiInputDevices by calling the Win32 api. - /// - /// - private static InputDevice[] MakeDeviceList() - { - #if __MonoCS__ - return new InputDevice[0]; - #else - uint inDevs = Win32API.midiInGetNumDevs(); - InputDevice[] result = new InputDevice[inDevs]; - for (uint deviceId = 0; deviceId < inDevs; deviceId++) - { - Win32API.MIDIINCAPS caps = new Win32API.MIDIINCAPS(); - Win32API.midiInGetDevCaps((UIntPtr)deviceId, out caps); - result[deviceId] = new InputDevice((UIntPtr)deviceId, caps); - } - return result; - #endif - } - - /// - /// The input callback for midiOutOpen. - /// - private void InputCallback(Win32API.HMIDIIN hMidiIn, Win32API.MidiInMessage wMsg, - UIntPtr dwInstance, UIntPtr dwParam1, UIntPtr dwParam2) - { - isInsideInputHandler = true; - try - { - if (wMsg == Win32API.MidiInMessage.MIM_DATA) - { - int channel; - int mode; - int code; - int velocity; - UInt32 win32Timestamp; - - if (MidiTrigger != null) - { - ShortMsg.DecodeMsg(dwParam1, dwParam2, out channel, out mode, out code, out velocity, out win32Timestamp); - MidiTrigger(new MidiMessage(this, channel, mode, code, velocity)); - } - } - } - finally - { - isInsideInputHandler = false; - } - } - - #endregion - - #region Private Fields - - // Access to the global state is guarded by lock(staticLock). - private static Object staticLock = new Object(); - private static InputDevice[] installedDevices = null; - - // These fields initialized in the constructor never change after construction, - // so they don't need to be guarded by a lock. We keep a reference to the - // callback delegate because we pass it to unmanaged code (midiInOpen) and unmanaged code - // cannot prevent the garbage collector from collecting the delegate. - private UIntPtr deviceId; - private Win32API.MIDIINCAPS caps; - private Win32API.MidiInProc inputCallbackDelegate; - - // Access to the Open/Close state is guarded by lock(this). - private bool isOpen; - private bool isReceiving; - //private Clock clock; - private Win32API.HMIDIIN handle; - - /// - /// Thread-local, set to true when called by an input handler, false in all other threads. - /// - [ThreadStatic] - static bool isInsideInputHandler = false; - - #endregion - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/Messages.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/Messages.cs deleted file mode 100644 index 9e9019826d..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/Messages.cs +++ /dev/null @@ -1,101 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// Copyright (c) 2009, Tom Lokovic -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -using System; - -namespace Midi -{ - /// - /// Base class for messages relevant to a specific device. - /// - public abstract class DeviceMessage - { - /// - /// Protected constructor. - /// - protected DeviceMessage(DeviceBase device)//, float time) : base(time) - { - if (device == null) - { - throw new ArgumentNullException("device"); - } - Device = device; - } - - /// - /// The device from which this message originated, or for which it is destined. - /// - public DeviceBase Device { get; private set; } - } - - /// - /// Note On message. - /// - public class MidiMessage : DeviceMessage - { - /// - /// Constructs a Midi message. - /// - public MidiMessage(DeviceBase device, int channel, int mode, int code, int velocity) - :base(device) - { - Channel = channel; - Mode = mode; - Code = code; - Velocity = velocity; - } - - /// - /// Channel. - /// - public int Channel { get; private set; } - - /// - /// Mode. - /// - public int Mode { get; private set; } - - /// - /// Code. - /// - public int Code { get; private set; } - - /// - /// Velocity. - /// - public int Velocity { get; private set; } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/ShortMsg.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/ShortMsg.cs deleted file mode 100644 index 1290ee1b3a..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/ShortMsg.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// Copyright (c) 2009, Tom Lokovic -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - - -using System; -using System.Collections.Generic; - -namespace Midi -{ - /// - /// Utility functions for encoding and decoding short messages. - /// - static class ShortMsg - { - /// - /// Decodes a Note On short message. - /// - public static void DecodeMsg(UIntPtr dwParam1, UIntPtr dwParam2, - out int channel, out int mode, out int code, out int velocity, out UInt32 timestamp) - { - channel = (int)dwParam1 & 0x0f; - mode = ((int)dwParam1 & 0xf0) >> 4; - code = ((int)dwParam1 & 0xff00) >> 8; - velocity = ((int)dwParam1 & 0xff0000) >> 16; - timestamp = (UInt32)dwParam2; - } - - /// - /// Encodes a Note On short message. - /// - public static UInt32 EncodeMsg(int channel, int code, int velocity) - { - return (UInt32)(0x90 | (channel) | (code << 8) | (velocity << 16)); - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/Win32API.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/Win32API.cs deleted file mode 100644 index 9e831f5fb5..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Midi/Win32API.cs +++ /dev/null @@ -1,428 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// Copyright (c) 2009, Tom Lokovic -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Runtime.InteropServices; -using System.Text; - -namespace Midi -{ - /// - /// C# wrappers for the Win32 MIDI API. - /// - /// Because .NET does not provide MIDI support itself, in C# we must use P/Invoke to wrap the - /// Win32 API. That API consists of the MMSystem.h C header and the winmm.dll library. The API - /// is described in detail here: http://msdn.microsoft.com/en-us/library/ms712733(VS.85).aspx. - /// The P/Invoke interop mechanism is described here: - /// http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx. - /// - /// This file covers the subset of the MIDI protocol needed to manage input and output devices - /// and send and receive Note On/Off, Control Change, Pitch Bend and Program Change messages. - /// Other portions of the MIDI protocol (such as sysex events) are supported in the Win32 API - /// but are not wrapped here. - /// - /// Some of the C functions are not typesafe when wrapped, so those wrappers are made private - /// and typesafe variants are provided. - static class Win32API - { - #region Constants - - // The following constants come from MMSystem.h. - - /// - /// Max length of a manufacturer name in the Win32 API. - /// - public const UInt32 MAXPNAMELEN = 32; - - /// - /// Status type returned from most functions in the Win32 API. - /// - public enum MMRESULT : uint - { - // General return codes. - MMSYSERR_BASE = 0, - MMSYSERR_NOERROR = MMSYSERR_BASE + 0, - MMSYSERR_ERROR = MMSYSERR_BASE + 1, - MMSYSERR_BADDEVICEID = MMSYSERR_BASE + 2, - MMSYSERR_NOTENABLED = MMSYSERR_BASE + 3, - MMSYSERR_ALLOCATED = MMSYSERR_BASE + 4, - MMSYSERR_INVALHANDLE = MMSYSERR_BASE + 5, - MMSYSERR_NODRIVER = MMSYSERR_BASE + 6, - MMSYSERR_NOMEM = MMSYSERR_BASE + 7, - MMSYSERR_NOTSUPPORTED = MMSYSERR_BASE + 8, - MMSYSERR_BADERRNUM = MMSYSERR_BASE + 9, - MMSYSERR_INVALFLAG = MMSYSERR_BASE + 10, - MMSYSERR_INVALPARAM = MMSYSERR_BASE + 11, - MMSYSERR_HANDLEBUSY = MMSYSERR_BASE + 12, - MMSYSERR_INVALIDALIAS = MMSYSERR_BASE + 13, - MMSYSERR_BADDB = MMSYSERR_BASE + 14, - MMSYSERR_KEYNOTFOUND = MMSYSERR_BASE + 15, - MMSYSERR_READERROR = MMSYSERR_BASE + 16, - MMSYSERR_WRITEERROR = MMSYSERR_BASE + 17, - MMSYSERR_DELETEERROR = MMSYSERR_BASE + 18, - MMSYSERR_VALNOTFOUND = MMSYSERR_BASE + 19, - MMSYSERR_NODRIVERCB = MMSYSERR_BASE + 20, - MMSYSERR_MOREDATA = MMSYSERR_BASE + 21, - MMSYSERR_LASTERROR = MMSYSERR_BASE + 21, - - // MIDI-specific return codes. - MIDIERR_BASE = 64, - MIDIERR_UNPREPARED = MIDIERR_BASE + 0, - MIDIERR_STILLPLAYING = MIDIERR_BASE + 1, - MIDIERR_NOMAP = MIDIERR_BASE + 2, - MIDIERR_NOTREADY = MIDIERR_BASE + 3, - MIDIERR_NODEVICE = MIDIERR_BASE + 4, - MIDIERR_INVALIDSETUP = MIDIERR_BASE + 5, - MIDIERR_BADOPENMODE = MIDIERR_BASE + 6, - MIDIERR_DONT_CONTINUE = MIDIERR_BASE + 7, - MIDIERR_LASTERROR = MIDIERR_BASE + 7 - } - - /// - /// Flags passed to midiInOpen() and midiOutOpen(). - /// - public enum MidiOpenFlags : uint - { - CALLBACK_TYPEMASK = 0x70000, - CALLBACK_NULL = 0x00000, - CALLBACK_WINDOW = 0x10000, - CALLBACK_TASK = 0x20000, - CALLBACK_FUNCTION = 0x30000, - CALLBACK_THREAD = CALLBACK_TASK, - CALLBACK_EVENT = 0x50000, - MIDI_IO_STATUS = 0x00020 - } - - /// - /// Values for wTechnology field of MIDIOUTCAPS structure. - /// - public enum MidiDeviceType : ushort - { - MOD_MIDIPORT = 1, - MOD_SYNTH = 2, - MOD_SQSYNTH = 3, - MOD_FMSYNTH = 4, - MOD_MAPPER = 5, - MOD_WAVETABLE = 6, - MOD_SWSYNTH = 7 - } - - /// - /// Flags for dwSupport field of MIDIOUTCAPS structure. - /// - public enum MidiExtraFeatures : uint - { - MIDICAPS_VOLUME = 0x0001, - MIDICAPS_LRVOLUME = 0x0002, - MIDICAPS_CACHE = 0x0004, - MIDICAPS_STREAM = 0x0008 - } - - /// - /// "Midi Out Messages", passed to wMsg param of MidiOutProc. - /// - public enum MidiOutMessage : uint - { - MOM_OPEN = 0x3C7, - MOM_CLOSE = 0x3C8, - MOM_DONE = 0x3C9 - } - - /// - /// "Midi In Messages", passed to wMsg param of MidiInProc. - /// - public enum MidiInMessage : uint - { - MIM_OPEN = 0x3C1, - MIM_CLOSE = 0x3C2, - MIM_DATA = 0x3C3, - MIM_LONGDATA = 0x3C4, - MIM_ERROR = 0x3C5, - MIM_LONGERROR = 0x3C6, - MIM_MOREDATA = 0x3CC - } - - #endregion - - #region Handles - - /// - /// Win32 handle for a MIDI output device. - /// - [StructLayout(LayoutKind.Sequential)] - public struct HMIDIOUT - { - public Int32 handle; - } - - /// - /// Win32 handle for a MIDI input device. - /// - [StructLayout(LayoutKind.Sequential)] - public struct HMIDIIN - { - public Int32 handle; - } - - #endregion - - #region Structs - - /// - /// Struct representing the capabilities of an output device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711619(VS.85).aspx - [StructLayout(LayoutKind.Sequential)] - public struct MIDIOUTCAPS - { - public UInt16 wMid; - public UInt16 wPid; - public UInt32 vDriverVersion; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)MAXPNAMELEN)] - public string szPname; - public MidiDeviceType wTechnology; - public UInt16 wVoices; - public UInt16 wNotes; - public UInt16 wChannelMask; - public MidiExtraFeatures dwSupport; - } - - /// - /// Struct representing the capabilities of an input device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711596(VS.85).aspx - [StructLayout(LayoutKind.Sequential)] - public struct MIDIINCAPS - { - public UInt16 wMid; - public UInt16 wPid; - public UInt32 vDriverVersion; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)MAXPNAMELEN)] - public string szPname; - public UInt32 dwSupport; - } - - #endregion - - #region Functions for MIDI Output - - /// - /// Returns the number of MIDI output devices on this system. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711627(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern UInt32 midiOutGetNumDevs(); - - /// - /// Fills in the capabilities struct for a specific output device. - /// - /// NOTE: This is adapted from the original Win32 function in order to make it typesafe. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711621(VS.85).aspx - public static MMRESULT midiOutGetDevCaps(UIntPtr uDeviceID, out MIDIOUTCAPS caps) - { - return midiOutGetDevCaps(uDeviceID, out caps, - (UInt32)Marshal.SizeOf(typeof(MIDIOUTCAPS))); - } - - /// - /// Callback invoked when a MIDI output device is opened, closed, or finished with a buffer. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711637(VS.85).aspx - public delegate void MidiOutProc(HMIDIOUT hmo, MidiOutMessage wMsg, UIntPtr dwInstance, - UIntPtr dwParam1, UIntPtr dwParam2); - - /// - /// Opens a MIDI output device. - /// - /// NOTE: This is adapted from the original Win32 function in order to make it typesafe. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711632(VS.85).aspx - public static MMRESULT midiOutOpen(out HMIDIOUT lphmo, UIntPtr uDeviceID, - MidiOutProc dwCallback, UIntPtr dwCallbackInstance) - { - return midiOutOpen(out lphmo, uDeviceID, dwCallback, dwCallbackInstance, - dwCallback == null ? MidiOpenFlags.CALLBACK_NULL : MidiOpenFlags.CALLBACK_FUNCTION); - } - - /// - /// Turns off all notes and sustains on a MIDI output device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/dd798479(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern MMRESULT midiOutReset(HMIDIOUT hmo); - - /// - /// Closes a MIDI output device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711620(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern MMRESULT midiOutClose(HMIDIOUT hmo); - - /// - /// Sends a short MIDI message (anything but sysex or stream). - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711640(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern MMRESULT midiOutShortMsg(HMIDIOUT hmo, UInt32 dwMsg); - - /// - /// Gets the error text for a return code related to an output device. - /// - /// NOTE: This is adapted from the original Win32 function in order to make it typesafe. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711622(VS.85).aspx - public static MMRESULT midiOutGetErrorText(MMRESULT mmrError, StringBuilder lpText) - { - return midiOutGetErrorText(mmrError, lpText, (UInt32)lpText.Capacity); - } - - #endregion - - #region Functions for MIDI Input - - /// - /// Returns the number of MIDI input devices on this system. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711608(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern UInt32 midiInGetNumDevs(); - - /// - /// Fills in the capabilities struct for a specific input device. - /// - /// NOTE: This is adapted from the original Win32 function in order to make it typesafe. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711604(VS.85).aspx - public static MMRESULT midiInGetDevCaps(UIntPtr uDeviceID, out MIDIINCAPS caps) - { - return midiInGetDevCaps(uDeviceID, out caps, - (UInt32)Marshal.SizeOf(typeof(MIDIINCAPS))); - } - - /// - /// Callback invoked when a MIDI event is received from an input device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711612(VS.85).aspx - public delegate void MidiInProc(HMIDIIN hMidiIn, MidiInMessage wMsg, UIntPtr dwInstance, - UIntPtr dwParam1, UIntPtr dwParam2); - - /// - /// Opens a MIDI input device. - /// - /// NOTE: This is adapted from the original Win32 function in order to make it typesafe. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711610(VS.85).aspx - public static MMRESULT midiInOpen(out HMIDIIN lphMidiIn, UIntPtr uDeviceID, - MidiInProc dwCallback, UIntPtr dwCallbackInstance) - { - return midiInOpen(out lphMidiIn, uDeviceID, dwCallback, dwCallbackInstance, - dwCallback == null ? MidiOpenFlags.CALLBACK_NULL : MidiOpenFlags.CALLBACK_FUNCTION); - } - - /// - /// Starts input on a MIDI input device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711614(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern MMRESULT midiInStart(HMIDIIN hMidiIn); - - /// - /// Stops input on a MIDI input device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711615(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern MMRESULT midiInStop(HMIDIIN hMidiIn); - - /// - /// Resets input on a MIDI input device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711613(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern MMRESULT midiInReset(HMIDIIN hMidiIn); - - /// - /// Closes a MIDI input device. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711602(VS.85).aspx - [DllImport("winmm.dll", SetLastError = true)] - public static extern MMRESULT midiInClose(HMIDIIN hMidiIn); - - /// - /// Gets the error text for a return code related to an input device. - /// - /// NOTE: This is adapted from the original Win32 function in order to make it typesafe. - /// - /// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711605(VS.85).aspx - public static MMRESULT midiInGetErrorText(MMRESULT mmrError, StringBuilder lpText) - { - return midiInGetErrorText(mmrError, lpText, (UInt32)lpText.Capacity); - } - - #endregion - - #region Non-Typesafe Bindings - - // The bindings in this section are not typesafe, so we make them private and privide - // typesafe variants above. - - [DllImport("winmm.dll", SetLastError = true)] - private static extern MMRESULT midiOutGetDevCaps(UIntPtr uDeviceID, out MIDIOUTCAPS caps, - UInt32 cbMidiOutCaps); - - [DllImport("winmm.dll", SetLastError = true)] - private static extern MMRESULT midiOutOpen(out HMIDIOUT lphmo, UIntPtr uDeviceID, - MidiOutProc dwCallback, UIntPtr dwCallbackInstance, MidiOpenFlags dwFlags); - - [DllImport("winmm.dll", SetLastError = true)] - private static extern MMRESULT midiOutGetErrorText(MMRESULT mmrError, StringBuilder lpText, - UInt32 cchText); - - [DllImport("winmm.dll", SetLastError = true)] - private static extern MMRESULT midiInGetDevCaps(UIntPtr uDeviceID, out MIDIINCAPS caps, - UInt32 cbMidiInCaps); - - [DllImport("winmm.dll", SetLastError = true)] - private static extern MMRESULT midiInOpen(out HMIDIIN lphMidiIn, UIntPtr uDeviceID, - MidiInProc dwCallback, UIntPtr dwCallbackInstance, MidiOpenFlags dwFlags); - - [DllImport("winmm.dll", SetLastError = true)] - private static extern MMRESULT midiInGetErrorText(MMRESULT mmrError, StringBuilder lpText, - UInt32 cchText); - - #endregion - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/ParamsFileReader.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/ParamsFileReader.cs deleted file mode 100644 index 7fe2ab0ca3..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/ParamsFileReader.cs +++ /dev/null @@ -1,607 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : * Reads the config file that defines the menus, including the macros, target devices, etc. -// * It also defines the data structures to store this information - - -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace RemoteConsole -{ - namespace ParamsFileInfo - { - static class Tools - { - private static Dictionary mapGroupName2Type = new Dictionary(); - - public static void AddDefinitionItem(string groupName, string groupDefType) - { - CGroup.EGroupType eGroupType = GroupTypeStr2GroupType(groupDefType); - mapGroupName2Type.Add(groupName, eGroupType); - } - - public static void ClearDefinitions() - { - mapGroupName2Type.Clear(); - } - - public static CGroup.EGroupType GroupName2GroupType(string groupName) - { - CGroup.EGroupType eType; - if (groupName != null && mapGroupName2Type.TryGetValue(groupName, out eType)) - { - return eType; - } - return CGroup.EGroupType.eGT_MacrosMenu; - } - - public static CGroup.EGroupType GroupTypeStr2GroupType(string typeStr) - { - if (typeStr != null) - { - string t = typeStr.ToLower(); - if (t == "menumacro") return CGroup.EGroupType.eGT_MacrosMenu; - else if (t == "menugameplay") return CGroup.EGroupType.eGT_GamePlayMenu; - else if (t == "buttonmacro") return CGroup.EGroupType.eGT_MacrosButton; - else if (t == "slidermacro") return CGroup.EGroupType.eGT_MacrosSlider; - else if (t == "togglemacro") return CGroup.EGroupType.eGT_MacrosToggle; - else if (t == "menutarget") return CGroup.EGroupType.eGT_Targets; - } - - return CGroup.EGroupType.eGT_MacrosMenu; - } - - public static CGroup.EGroupSubType GroupName2GroupSubType(string groupName) - { - return groupName.ToLower() == "targets" ? - ParamsFileInfo.CGroup.EGroupSubType.eSGT_Targets : - ParamsFileInfo.CGroup.EGroupSubType.eSGT_None; - } - } - - static class CMidiMapping - { - private static Dictionary mapMidi2Entry = new Dictionary(); - - public static void Clear() { mapMidi2Entry.Clear(); } - public static void Insert(CMidiInfo midiInfo, CEntry entry) - { - if (mapMidi2Entry.ContainsKey(midiInfo.CreateKey()) == false) - mapMidi2Entry.Add(midiInfo.CreateKey(), entry); - } - public static CEntry GetEntry(int key) - { - CEntry entry; - if (mapMidi2Entry.TryGetValue(key, out entry)) - return entry; - return null; - } - - private static int CreateKey(CMidiInfo midiInfo) - { - if (midiInfo != null) - return midiInfo.Midi | (midiInfo.Pad << 16); - - return -1; - } - } - public class CEntryTag - { - // e.g. - // [Macro=ScreenShot] - // r_getscreenshot 2 - public CEntryTag(CGroup.EGroupType groupType, CGroup.EGroupSubType groupSubType, CEntry e) { GroupType = groupType; Entry = e; GroupSubType = groupSubType; } - public CGroup.EGroupType GroupType { get; private set; } // e.g. eGT_MacrosMenu - public CGroup.EGroupSubType GroupSubType { get; private set; } // e.g. eSGT_None - public CEntry Entry { get; private set; } // ptr to entry it belongs to - public List ModCmds; // modified commands (e.g. when t_scale #) - - } - - public class CSliderParams - { - public CSliderParams(float min, float max, float delta, float current, bool forceInt) { Min = min; Max = max; Delta = delta; ForceInt = forceInt; CurrentValue = current; } - public bool ForceInt = false; - public float Min = 0; - public float Max = 1; - public float Delta = 0.2f; - public float CurrentValue = 0; - - public float Lerp(float t) - { - t = Common.Clamp(t, 0f, 1f); - return (1f - t) * Min + t * Max; - } - } - - public class CToggleParams - { - public CToggleParams(int on, int off, string groupName, string itemName) { On = on; Off = off; GroupName = groupName; ItemName = itemName; } - public int On = 0; - public int Off = 1; - public string GroupName; - public string ItemName; - } - - public class CMidiInfo - { - public CMidiInfo(int code, int pad) { Midi = code; Pad = pad; } - public int Midi { get; private set; } // Midi ASCI value associated with the key/slider pressed - public int Pad { get; private set; } // Midi ASCI value associated with the key/slider pressed - - public int CreateKey() { return CMidiInfo.CreateStaticKey(Midi, Pad); } - - public static int CreateStaticKey(int midiCode, int pad) - { - return midiCode | (pad << 16); - } - } - public class CEntry - { - public CMidiInfo MidiInfo { get; private set; } - public string IconPath { get; private set; } - public string Group { get; private set; } // e.g. Macro - public string Name { get; private set; } // e.g. ScreenShot - public CGroup.EGroupType GroupType { get; private set; } // e.g. eGT_MacrosMenu - public CGroup.EGroupSubType GroupSubType { get; private set; } // e.g. eSGT_None - public List Data { get; private set; } // e.g. r_getscreenshot 2 - public CSliderParams SliderParams; - public CToggleParams ToggleParams; - - // e.g. - // [Macro=ScreenShot] - // r_getscreenshot 2 - public CEntry(string group, string name, CMidiInfo midiInfo, string iconPath, CSliderParams sliderParams = null, CToggleParams toggleParams = null) - { - IconPath = iconPath; - MidiInfo = midiInfo; - Group = group; Name = name; Data = new List(); - GroupType = Tools.GroupName2GroupType(group); - GroupSubType = Tools.GroupName2GroupSubType(group); - if (sliderParams != null) SliderParams = sliderParams; - if (toggleParams != null) ToggleParams = toggleParams; - } - - public string GetDataAsString() - { - string str = ""; - foreach (string s in Data) str += s + '\n'; - return str; - } - - public CEntryTag GenerateEntryTag(CGroup group) - { - return new CEntryTag(group.GType, group.GSubType, this); - } - - public CEntryTag GenerateEntryTag() - { - return new CEntryTag(GroupType, GroupSubType, this); - } - } - - // Gathers information about a group - public class CGroup - { - public enum EGroupType - { - eGT_MacrosMenu = 0, - eGT_Targets, - eGT_GamePlayMenu, - eGT_MacrosButton, - eGT_MacrosSlider, - eGT_MacrosToggle - } - - public enum EGroupSubType - { - eSGT_None = 0, - eSGT_Targets - } - - public string IconPath { get; private set; } - public string Name { get; private set; } - public EGroupType GType { get; private set; } - public EGroupSubType GSubType { get; private set; } - public List Entries { get; private set; } - public bool ShowOnMenu { get; private set; } - - public CGroup(string groupName, EGroupSubType subType, string iconPath, bool showOnMenu) - { - IconPath = iconPath; - Name = groupName; Entries = new List(); GSubType = subType; - GType = Tools.GroupName2GroupType(groupName); - ShowOnMenu = showOnMenu; - } - - public void Add(CEntry entry) { Entries.Add(entry); } - public CEntry GetEntry(string name) - { - string lowerName = name.ToLower(); - foreach (CEntry e in Entries) - { - if (e.Name.ToLower() == lowerName) - { - return e; - } - } - return null; - } - - } - - // Params file full data - class CData - { - public CData() { Groups = new List(); } - public List Groups { get; private set; } - - public void DeleteGroup(string groupName) - { - string lowerGroupName = groupName.ToLower(); - foreach (CGroup g in Groups) - { - if (g.Name.ToLower() == lowerGroupName) - { - Groups.Remove(g); - return; - } - } - } - public CGroup GetGroup(string groupName) - { - string lowerGroupName = groupName.ToLower(); - foreach (CGroup g in Groups) - { - if (g.Name.ToLower() == lowerGroupName) - { - return g; - } - } - return null; - } - - public CGroup GetTargetsGroup() - { - return GetGroup("targets"); - } - - public bool AddItem(CEntry item, CGroup.EGroupSubType subType, string iconPath, bool showOnMenu) - { - // add item in a group - CGroup g = GetGroup(item.Group); - if (g == null) - { - g = new CGroup(item.Group, subType, iconPath, showOnMenu); - //g.SetType(type); - Groups.Add(g); - } - - g.Add(item); - - return g != null; - } - - public CEntry GetItem(string group, string name) - { - CGroup g = GetGroup(group); - if (g != null) - { - return g.GetEntry(name); - } - - return null; - } - - public bool ShouldGroupShowInMenuBar(string group) - { - bool ret = false; - var g = GetGroup(group); - if (g != null) - { - ret = g.ShowOnMenu; - } - - return ret; - } - } - } - - // ------------------------------------------------------------- - - class ParamsFileReader - { - private string path; - - public ParamsFileReader(string INIPath) - { - path = INIPath; - } - - public ParamsFileInfo.CData GetXmlParams() - { - if (System.IO.File.Exists(path) == false) - { - return null; - } - - ParamsFileInfo.CData res = new ParamsFileInfo.CData(); - ParamsFileInfo.CEntry entry = null; - string iconPath = null; - - System.Xml.XmlDocument xd = new System.Xml.XmlDocument(); - try - { - xd.Load(path); - } - catch (System.Exception) - { - return null; - } - - // read group types - ParamsFileInfo.Tools.ClearDefinitions(); - ParamsFileInfo.CMidiMapping.Clear(); - - System.Xml.XmlNode nodeDefs = xd.SelectSingleNode("/root/Definitions"); - foreach (System.Xml.XmlNode def in nodeDefs) // for each , , etc... node - { - ParamsFileInfo.Tools.AddDefinitionItem(def.Attributes.GetNamedItem("group").Value, def.Attributes.GetNamedItem("type").Value); - } - - // read groups - System.Xml.XmlNode nodeParams = xd.SelectSingleNode("/root/Parameters"); - foreach (System.Xml.XmlNode group in nodeParams) // for each , , etc... node - { - bool isSlidersGroup = group.Name.ToLower() == "sliders"; - bool isToggleGroup = group.Name.ToLower() == "toggles"; - bool showOnMenu = true; - - // check group attributes - if (group.Attributes != null) - { - System.Xml.XmlNode n = group.Attributes.GetNamedItem("icon"); - iconPath = n != null ? n.InnerText : null; - if (isSlidersGroup || isToggleGroup) - { - n = group.Attributes.GetNamedItem("onMenu"); - showOnMenu = n != null && n.InnerText.ToLower().Trim() == "true"; - } - } - ParamsFileInfo.CGroup.EGroupSubType subType = ParamsFileInfo.Tools.GroupName2GroupSubType(group.Name); - - foreach (System.Xml.XmlNode node in group) // e.g. for each node - { - if (node.NodeType != System.Xml.XmlNodeType.Element || node.Attributes.Count < 1 ) - continue; - - // header - - // MIDI - int midi = -1, pad = 0; - System.Xml.XmlNode n = node.Attributes.GetNamedItem("midi"); - if (n != null && IsNumeric(n.Value.Trim())) midi = int.Parse(n.Value.Trim()); - n = node.Attributes.GetNamedItem("pad"); - if (n != null && IsNumeric(n.Value.Trim())) pad = int.Parse(n.Value.Trim()); - ParamsFileInfo.CMidiInfo midiInfo = new ParamsFileInfo.CMidiInfo(midi,pad); - - // icon - string entryIconPath = null; - if (node.Attributes != null) - { - System.Xml.XmlNode nIcon = node.Attributes.GetNamedItem("icon"); - entryIconPath = nIcon != null ? nIcon.InnerText : null; - } - - // Create entry - entry = new ParamsFileInfo.CEntry(group.Name, node.Attributes.GetNamedItem("name").Value, midiInfo, entryIconPath); - - if (midi > -1) - { - ParamsFileInfo.CMidiMapping.Insert(midiInfo, entry); - } - - if (subType == ParamsFileInfo.CGroup.EGroupSubType.eSGT_Targets) - { - string addr = "localhost:0"; - try - { - string ip = node.Attributes.GetNamedItem("ip").Value; - string port = node.Attributes.GetNamedItem("port").Value; - addr = ip + ":" + port; - } - catch (System.Exception){ } - - entry.Data.Add(addr); - } - else - { - foreach (System.Xml.XmlNode cvar in node) // e.g. for each node - { - entry.Data.Add(cvar.InnerText); - } - - if (isSlidersGroup) - { - GetSliderParams(node, ref entry.SliderParams); - } - else if (isToggleGroup) - { - GetToggleButtonParams(node, ref entry.ToggleParams); - } - } - - // commit entry - res.AddItem(entry, subType, iconPath, showOnMenu); - entry = null; - } - } - - return res; - } - - // ----------- Helper Functions ---------------- - private bool IsNumeric(string stringToTest) - { - float result; - return float.TryParse(stringToTest, out result); - } - - private void GetSliderParams(System.Xml.XmlNode node, ref ParamsFileInfo.CSliderParams sliderParams) - { - float min = 0f, max = 0f, delta = 0f, current = 0f; - bool forceInt = false; - int count = 0; - System.Xml.XmlNode n = node.Attributes.GetNamedItem("min"); - if (n != null && IsNumeric(n.InnerText.Trim())) { ++count; min = float.Parse(n.InnerText.Trim(), System.Globalization.CultureInfo.InvariantCulture); } - n = node.Attributes.GetNamedItem("max"); - if (n != null && IsNumeric(n.InnerText.Trim())) { ++count; max = float.Parse(n.InnerText.Trim(), System.Globalization.CultureInfo.InvariantCulture); } - n = node.Attributes.GetNamedItem("delta"); - if (n != null && IsNumeric(n.InnerText.Trim())) { ++count; delta = float.Parse(n.InnerText.Trim(), System.Globalization.CultureInfo.InvariantCulture); } - n = node.Attributes.GetNamedItem("forceInt"); - if (n != null) { forceInt = n.InnerText.Trim().ToLower() == "true"; } - n = node.Attributes.GetNamedItem("default"); - if (n != null) { current = float.Parse(n.InnerText.Trim(), System.Globalization.CultureInfo.InvariantCulture); } else { current = min; } - if (count == 3) - { - current = (current < min) ? min : (current > max) ? max : current; - sliderParams = new ParamsFileInfo.CSliderParams(min, max, delta, current, forceInt); - } - } - - private void GetToggleButtonParams(System.Xml.XmlNode node, ref ParamsFileInfo.CToggleParams toggleParams) - { - int on = 1, off = 0; - string groupName = "default"; - string itemName = ""; - System.Xml.XmlNode n = node.Attributes.GetNamedItem("group"); - groupName = (n != null) ? n.InnerText.Trim() : "default"; - n = node.Attributes.GetNamedItem("name"); - itemName = (n != null) ? n.InnerText.Trim() : "missing name"; - - n = node.Attributes.GetNamedItem("on"); - if (n != null && IsNumeric(n.InnerText.Trim())) { on = int.Parse(n.InnerText.Trim(), System.Globalization.CultureInfo.InvariantCulture); } - n = node.Attributes.GetNamedItem("off"); - if (n != null && IsNumeric(n.InnerText.Trim())) { off = int.Parse(n.InnerText.Trim(), System.Globalization.CultureInfo.InvariantCulture); } - - toggleParams = new ParamsFileInfo.CToggleParams(on, off, groupName, itemName); - } - - - - // ------------------------------------------------------------- - // Gets the list of all macros of certain type - // e.g. type = GamePlay - // [GamePlay=Fly On] - // ------------------------------------------------------------- -#if OLD_STUFF - public ParamsFileInfo.CData Parse() - { - - return GetXmlParams(); - - ParamsFileInfo.CData res = new ParamsFileInfo.CData(); - ParamsFileInfo.CEntry entry = null; - string line; - - Regex rgxWellFormedHeader = new Regex("\\[([\\w-]+)=(.+)\\]"); // e.g. [GroupName it belongs to = Item Name] - Regex rgxHeader = new Regex("\\[(.*)\\]"); // e.g. [anything] - - // Can we open the parameters file? - System.IO.StreamReader file = null; - try - { - file = new System.IO.StreamReader(this.path); - } - catch (System.Exception) - { - return res; - } - - // Parse it - while ((line = file.ReadLine()) != null) - { - // Is it a comment? - string l = line.Trim(); - if (l.Length > 0 && l[0] == '#') - { - continue; - } - - Match match = rgxWellFormedHeader.Match(line); - if (match.Success && match.Groups.Count == 3) - { - if (entry != null) - { - // commit current entry - res.AddItem(entry); - entry = null; - } - - if (entry == null) - { - // line = proper header [GroupType=EntryName] - e.g. [Macro=ScreenShot] - entry = new ParamsFileInfo.CEntry(match.Groups[1].Value, match.Groups[2].Value); - } - - } - else if (entry != null && line.Length > 0) - { - // is this a new header? - bool isMatch = rgxHeader.IsMatch(line); - if (isMatch == false) - { - // still data, so I add it e.g. 10.11.110.202 or r_displayInfo=1 - entry.Data.Add(line); - } - } - } - - if (entry != null) - { - res.AddItem(entry); - entry = null; - } - - file.Close(); - - // Adjust Group Types - if (res != null) - { - ParamsFileInfo.CGroup definitions = res.GetGroup("DefGroup"); - if (definitions != null) - { - foreach (ParamsFileInfo.CEntry def in definitions.Entries) - { - ParamsFileInfo.CGroup group = res.GetGroup(def.Name); // group to set the type to - List info = def.Data; // type - if (info.Count > 0) - { - group.SetType(info[0]); - } - } - - // Delete the Definition group - res.DeleteGroup("DefGroup"); - } - - } - - // Return results - return res; - } -#endif - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/PerfCenterCpl.ico b/Code/Tools/UniversalRemoteConsole/RemoteConsole/PerfCenterCpl.ico deleted file mode 100644 index 2faeb5c42b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/PerfCenterCpl.ico +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a944cbb9c7b4062d4106d6101b54d3265c969c6ab7f700711c60c11d2ac1946 -size 116288 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Program.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Program.cs deleted file mode 100644 index b0fc7fca2c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Program.cs +++ /dev/null @@ -1,29 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -namespace RemoteConsole -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [System.STAThread] - static void Main() - { - System.Windows.Forms.Application.EnableVisualStyles(); - System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false); - System.Windows.Forms.Application.Run(new MainForm()); - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/AssemblyInfo.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/AssemblyInfo.cs deleted file mode 100644 index 8a2b3d2855..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -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("RemoteConsole")] -[assembly: AssemblyDescription("Amazon Lumberyard Remote Console Tool")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Amazon.com, Inc.")] -[assembly: AssemblyProduct("Amazon Lumberyard Remote Console")] -[assembly: AssemblyCopyright("Copyright (c) Amazon.com, Inc., its affiliates or its licensors")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("6b942c3d-7deb-42fc-b146-6e316a397b7c")] - -// 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")] diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Resources.Designer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Resources.Designer.cs deleted file mode 100644 index 97b6512ae5..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Resources.Designer.cs +++ /dev/null @@ -1,235 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace RemoteConsole.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RemoteConsole.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap clear { - get { - object obj = ResourceManager.GetObject("clear", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap connected { - get { - object obj = ResourceManager.GetObject("connected", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap connected_commands { - get { - object obj = ResourceManager.GetObject("connected_commands", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap copy { - get { - object obj = ResourceManager.GetObject("copy", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap copy1 { - get { - object obj = ResourceManager.GetObject("copy1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap edit { - get { - object obj = ResourceManager.GetObject("edit", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap file { - get { - object obj = ResourceManager.GetObject("file", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap fractal { - get { - object obj = ResourceManager.GetObject("fractal", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap fractal1 { - get { - object obj = ResourceManager.GetObject("fractal1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap green { - get { - object obj = ResourceManager.GetObject("green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap green1 { - get { - object obj = ResourceManager.GetObject("green1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap img_record { - get { - object obj = ResourceManager.GetObject("img_record", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap logo_pc { - get { - object obj = ResourceManager.GetObject("logo_pc", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap logo_pc1 { - get { - object obj = ResourceManager.GetObject("logo_pc1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap pie { - get { - object obj = ResourceManager.GetObject("pie", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap red { - get { - object obj = ResourceManager.GetObject("red", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Resources.resx b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Resources.resx deleted file mode 100644 index aa7485f607..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Resources.resx +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\res\red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\connected.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\connected_commands.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\img_record.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\fractal.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\edit.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\pie.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\logo_pc.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\file.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\logo_pc.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\res\fractal.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Settings.Designer.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Settings.Designer.cs deleted file mode 100644 index 47be491df1..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Settings.Designer.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.17379 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace RemoteConsole.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Settings.settings b/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Settings.settings deleted file mode 100644 index 39645652af..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/RemoteConsole.cs b/Code/Tools/UniversalRemoteConsole/RemoteConsole/RemoteConsole.cs deleted file mode 100644 index 10ba30e995..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/RemoteConsole.cs +++ /dev/null @@ -1,468 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Socket connection with game. See CryEngine's RemoteConsole.cpp for information on the Server - - -using System.Collections.Generic; -using System.Net.Sockets; -using System.Threading; - -namespace RemoteConsole -{ - static class Constants - { - public const int DEFAULT_PORT = 4600; - public const int DEFAULT_BUFFER = 4096; - public const int RECONNECTION_TIME = 3000; - } - - public enum EMessageType - { - eMT_Message = 0, - eMT_Warning, - eMT_Error, - } - - public class SLogMessage - { - public SLogMessage(EMessageType type, string message) - { - Type = type; - Message = message; - } - public EMessageType Type; - public string Message; - } - - interface IRemoteConsoleClientListener - { - void OnLogMessage(SLogMessage message); - void OnAutoCompleteDone(List autoCompleteList); - void OnConnected(); - void OnDisconnected(); - } - - interface IRemoteConsoleClient - { - void Start(); - void Stop(); - void SetServer(string ip); - void ExecuteConsoleCommand(string command); - void ExecuteGameplayCommand(string command); - void SetListener(IRemoteConsoleClientListener listener); - void PumpEvents(); - } - - class SRemoteConsoleClientListenerState - { - public IRemoteConsoleClientListener listener = null; - public bool connected = false; - public bool autoCompleteSent = false; - - public void SetListener(IRemoteConsoleClientListener listener) - { - this.listener = listener; - Reset(); - } - - public void Reset() - { - autoCompleteSent = false; - } - } - - - class RemoteConsole : IRemoteConsoleClient - { - private enum EConsoleEventType - { - eCET_Noop = 0, - eCET_Req, - eCET_LogMessage, - eCET_LogWarning, - eCET_LogError, - eCET_ConsoleCommand, - eCET_AutoCompleteList, - eCET_AutoCompleteListDone, - - eCET_Strobo_GetThreads, - eCET_Strobo_ThreadAdd, - eCET_Strobo_ThreadDone, - - eCET_Strobo_GetResult, - eCET_Strobo_ResultStart, - eCET_Strobo_ResultDone, - - eCET_Strobo_StatStart, - eCET_Strobo_StatAdd, - eCET_Strobo_IPStart, - eCET_Strobo_IPAdd, - eCET_Strobo_SymStart, - eCET_Strobo_SymAdd, - eCET_Strobo_CallstackStart, - eCET_Strobo_CallstackAdd, - - eCET_GameplayEvent, - } - - private class SCommandEvent - { - public SCommandEvent(EConsoleEventType type, string command) - { - Type = type; - Command = command; - } - public EConsoleEventType Type; - public string Command; - } - - public int Port { get; private set; } - private Thread thrd = null; - private System.Net.Sockets.TcpClient clientSocket = null; - byte[] inStream = new byte[Constants.DEFAULT_BUFFER]; - - private string server = ""; - private List commands = new List(); - private List autoComplete = new List(); - private List messages = new List(); - - private SRemoteConsoleClientListenerState listener = new SRemoteConsoleClientListenerState(); - - private object locker = new object(); - private object clientLocker = new object(); - - private volatile bool running = false; - private volatile bool stopping = false; - private volatile bool isConnected = false; - private volatile bool autoCompleteIsDone = false; - private volatile bool resetConnection = false; - private int ticks = 0; - - public RemoteConsole() - { - clientSocket = null; - Port = Constants.DEFAULT_PORT; - } - - public bool SetPort(string port_) - { - int port = -1; - try - { - port = System.Convert.ToInt32(port_); - } - catch (System.Exception) - { - } - - if (port != -1 && (!isConnected || resetConnection)) - { - Port = port; - return true; - } - return false; - } - - public void Start() - { - if (!running) - { - running = true; - thrd = new Thread(threadFct); - thrd.Start(); - } - } - - public void Stop() - { - if (running) - { - running = false; - stopping = true; - lock (clientLocker) - { - if (clientSocket != null) - { - clientSocket.Close(); - clientSocket = new System.Net.Sockets.TcpClient(); - } - } - while (stopping) - System.Threading.Thread.Sleep(10); - thrd = null; - } - } - - public void SetServer(string ip) - { - if (listener.listener != null) - { - listener.listener.OnDisconnected(); - listener.connected = false; - } - lock (locker) - { - server = ip; - ticks = 0; - autoCompleteIsDone = false; - listener.Reset(); - resetConnection = true; - } - } - - public void ExecuteConsoleCommand(string command) - { - lock (locker) - { - commands.Add(new SCommandEvent(EConsoleEventType.eCET_ConsoleCommand, command)); - } - } - - public void ExecuteGameplayCommand(string command) - { - lock (locker) - { - commands.Add(new SCommandEvent(EConsoleEventType.eCET_GameplayEvent, command)); - } - } - - public void SetListener(IRemoteConsoleClientListener listener) - { - lock (locker) - { - this.listener.SetListener(listener); - } - } - - public void PumpEvents() - { - List msgs = null; - List autoCmplt = null; - bool sendConn = false; - bool isConn = false; - IRemoteConsoleClientListener l = null; - lock (locker) - { - l = listener.listener; - msgs = new List(messages); - messages.Clear(); - if (autoCompleteIsDone && !listener.autoCompleteSent) - { - autoCmplt = new List(autoComplete); - autoComplete.Clear(); - listener.autoCompleteSent = true; - } - if (isConnected != listener.connected && !resetConnection) - { - listener.connected = isConnected; - sendConn = true; - isConn = isConnected; - } - } - if (l != null) - { - if (sendConn) - { - if (isConn) - l.OnConnected(); - else - l.OnDisconnected(); - } - if (msgs != null) - { - for (int i = 0; i < msgs.Count; ++i) - l.OnLogMessage(msgs[i]); - } - if (autoCmplt != null) - { - l.OnAutoCompleteDone(autoCmplt); - } - } - } - - private void threadFct() - { - while (running) - { - if (!isConnected || resetConnection) - { - clearCommands(); - if (ticks++ % Constants.RECONNECTION_TIME == 0) - { - lock (clientLocker) - { - if (clientSocket != null && clientSocket.Connected) - clientSocket.Close(); - clientSocket = new System.Net.Sockets.TcpClient(); - } - try - { - clientSocket.Connect(server, Port); - NetworkStream stream = clientSocket.GetStream(); - stream.ReadTimeout = 3000; - stream.WriteTimeout = 3000; - ticks = 0; - } -#if DEBUG - catch (System.Exception ex) - { - addLogMessage(EMessageType.eMT_Message, ex.Message); - } -#else - catch (System.Exception) { } -#endif - } - - isConnected = clientSocket != null ? clientSocket.Connected : false; - if (!isConnected) - autoCompleteIsDone = false; - if (resetConnection) - resetConnection = false; - } - else - { - isConnected = processClient(); - } - } - stopping = false; - } - - private bool readData(ref EConsoleEventType id, ref string data) - { - try - { - NetworkStream stream = clientSocket.GetStream(); - int ret = 0; - while (true) - { - ret += stream.Read(inStream, ret, Constants.DEFAULT_BUFFER - ret); - if (inStream[ret - 1] == '\0') - break; - } - string returndata = System.Text.Encoding.ASCII.GetString(inStream); - id = (EConsoleEventType)(returndata[0] - '0'); - int index = returndata.IndexOf('\0'); - data = returndata.Substring(1, index - 1); - } - catch (System.Exception) - { - return false; - } - return true; - } - - bool sendData(EConsoleEventType id, string data = "") - { - char cid = (char)((char)id + '0'); - string msg = ""; - msg += cid; - msg += data; - msg += "\0"; - try - { - byte[] outStream = System.Text.Encoding.ASCII.GetBytes(msg); - NetworkStream stream = clientSocket.GetStream(); - stream.Write(outStream, 0, outStream.Length); - stream.Flush(); - } - catch (System.Exception) - { - return false; - } - return true; - } - - private void addLogMessage(EMessageType type, string message) - { - lock (locker) - { - messages.Add(new SLogMessage(type, message)); - } - } - - private void addAutoCompleteItem(string item) - { - lock (locker) - { - autoComplete.Add(item); - } - } - - private bool getCommand(ref SCommandEvent command) - { - bool res = false; - lock (locker) - { - if (commands.Count > 0) - { - command = commands[0]; - commands.RemoveAt(0); - res = true; - } - } - return res; - } - - private void autoCompleteDone() - { - lock (locker) - { - autoCompleteIsDone = true; - } - } - - private void clearCommands() - { - lock (locker) - { - commands.Clear(); - } - } - - private bool processClient() - { - EConsoleEventType eventType = EConsoleEventType.eCET_Noop; - string data = ""; - if (!readData(ref eventType, ref data)) - return false; - - switch (eventType) - { - case EConsoleEventType.eCET_LogMessage: - addLogMessage(EMessageType.eMT_Message, data); - return sendData(EConsoleEventType.eCET_Noop); - case EConsoleEventType.eCET_LogWarning: - addLogMessage(EMessageType.eMT_Warning, data); - return sendData(EConsoleEventType.eCET_Noop); - case EConsoleEventType.eCET_LogError: - addLogMessage(EMessageType.eMT_Error, data); - return sendData(EConsoleEventType.eCET_Noop); - case EConsoleEventType.eCET_AutoCompleteList: - addAutoCompleteItem(data); - return sendData(EConsoleEventType.eCET_Noop); - case EConsoleEventType.eCET_AutoCompleteListDone: - autoCompleteDone(); - return sendData(EConsoleEventType.eCET_Noop); - case EConsoleEventType.eCET_Req: - SCommandEvent command = null; - if (getCommand(ref command)) - return sendData(command.Type, command.Command); - else - return sendData(EConsoleEventType.eCET_Noop); - default: - return sendData(EConsoleEventType.eCET_Noop); - } - } - } -} diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/RemoteConsole.csproj b/Code/Tools/UniversalRemoteConsole/RemoteConsole/RemoteConsole.csproj deleted file mode 100644 index 569c792e39..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/RemoteConsole.csproj +++ /dev/null @@ -1,255 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {1C86D237-2FDE-4303-835F-4A4E1F17E0C5} - WinExe - Properties - RemoteConsole - RemoteConsole - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - v4.0 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - ..\..\..\..\Tools\RemoteConsole\win32\ - TRACE - prompt - 4 - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - prompt - false - false - 4 - false - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - prompt - false - false - Auto - 4 - - - RemoteConsole.Program - - - PerfCenterCpl.ico - - - - - - - - - - - - - - - - - Form - - - FormAbout.cs - - - Form - - - FormButtons.cs - - - Form - - - FormSettings.cs - - - Form - - - FormSliders.cs - - - - - Form - - - Form1.cs - - - - - - - - - - - - - - - Form1.cs - Designer - - - FormAbout.cs - - - FormButtons.cs - - - FormSettings.cs - - - FormSliders.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - False - Microsoft .NET Framework 4 Client Profile %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/config-files/filters.xml b/Code/Tools/UniversalRemoteConsole/RemoteConsole/config-files/filters.xml deleted file mode 100644 index d3e4c2ab41..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/config-files/filters.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - #000088 - \!(\w*)\] - - - - - - FF8C00 - - - - - - #000000 - - - - - - - - #000000 - - - - - #000000 - - - - - #000000 - - - - - #000000 - - - diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/config-files/params.xml b/Code/Tools/UniversalRemoteConsole/RemoteConsole/config-files/params.xml deleted file mode 100644 index bfdf8a491e..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/config-files/params.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - r_displayInfo=1 - profile=1 - - - - r_displayInfo=0 - profile=0 - - - - sys_pakloginvalidFileAccess 0 - - - - r_getscreenshot 2 - - - - sv_timeofdayenabled 1 - - - - - - - - - r_displayinfo 0 - /g_cheats 1 - /g_godMode 1 - r_colorgradingchartimage 'chr' textures/colorcharts/kosovo2.dds - r_ColorGradingCharts 2 - - - r_displayinfo 0 - /g_cheats 1 - /g_godMode 1 - r_colorgradingchartimage 'chr' textures/colorcharts/default_char_l2_cch.tif - r_colorgradingchartimage 'env' textures/colorcharts/default_env_cch.tif - - - - r_colorgradingchartimage 'chr' - r_colorgradingchartimage 'env' - - - - r_ColorGradingMultiTarget 1 - - - - r_ColorGradingMultiTarget 0 - - - - r_autogenMips 1 - - - - r_autogenMips 0 - - - - - - - - - i_grammar_enable archers 0 - - - - i_debugdigitalButtons 127 - - - - - - - - - - SetViewMode:0 - - - SetViewMode:1 - - - SetViewMode:2 - - - GotoTagPoint:0 - - - - - - - - - map airfield - - - map forest - - - - - - - - - > - r_getscreenshot 2 - - > - RecordClip - - - - - - - - - log_verbosity # - - - t_scale # - - - cl_fov # - - - r_width # - - - r_height # - - - e_TimeOfDay # - - - i_debugdigitalButtons # - - - - - - r_colorgradingmultitarget # - - - r_colorgradingcharts # - - - r_displayInfo # - - - profile # - - - e_ShadowsCascadesDebug # - - - r_ShadowsStaticMap # - - - - - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/filters.xml b/Code/Tools/UniversalRemoteConsole/RemoteConsole/filters.xml deleted file mode 100644 index d3e4c2ab41..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/filters.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - #000088 - \!(\w*)\] - - - - - - FF8C00 - - - - - - #000000 - - - - - - - - #000000 - - - - - #000000 - - - - - #000000 - - - - - #000000 - - - diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/params.xml b/Code/Tools/UniversalRemoteConsole/RemoteConsole/params.xml deleted file mode 100644 index bfdf8a491e..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/params.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - r_displayInfo=1 - profile=1 - - - - r_displayInfo=0 - profile=0 - - - - sys_pakloginvalidFileAccess 0 - - - - r_getscreenshot 2 - - - - sv_timeofdayenabled 1 - - - - - - - - - r_displayinfo 0 - /g_cheats 1 - /g_godMode 1 - r_colorgradingchartimage 'chr' textures/colorcharts/kosovo2.dds - r_ColorGradingCharts 2 - - - r_displayinfo 0 - /g_cheats 1 - /g_godMode 1 - r_colorgradingchartimage 'chr' textures/colorcharts/default_char_l2_cch.tif - r_colorgradingchartimage 'env' textures/colorcharts/default_env_cch.tif - - - - r_colorgradingchartimage 'chr' - r_colorgradingchartimage 'env' - - - - r_ColorGradingMultiTarget 1 - - - - r_ColorGradingMultiTarget 0 - - - - r_autogenMips 1 - - - - r_autogenMips 0 - - - - - - - - - i_grammar_enable archers 0 - - - - i_debugdigitalButtons 127 - - - - - - - - - - SetViewMode:0 - - - SetViewMode:1 - - - SetViewMode:2 - - - GotoTagPoint:0 - - - - - - - - - map airfield - - - map forest - - - - - - - - - > - r_getscreenshot 2 - - > - RecordClip - - - - - - - - - log_verbosity # - - - t_scale # - - - cl_fov # - - - r_width # - - - r_height # - - - e_TimeOfDay # - - - i_debugdigitalButtons # - - - - - - r_colorgradingmultitarget # - - - r_colorgradingcharts # - - - r_displayInfo # - - - profile # - - - e_ShadowsCascadesDebug # - - - r_ShadowsStaticMap # - - - - - - \ No newline at end of file diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ConsoleImg.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ConsoleImg.jpg deleted file mode 100644 index 23622e9824..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ConsoleImg.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29fb19ed587c235576a89d5c607ed3267ca526ccfb2fb3d2a4f0580c91c57acc -size 33602 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/List.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/List.png deleted file mode 100644 index 47ab71eb6a..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/List.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98da8772daf76603fb1c94fcd9454b842cd55818da057bf2cb7f06b885708434 -size 13707 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/List32.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/List32.png deleted file mode 100644 index 8898b2d935..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/List32.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a650b3b463de1821d405e0abe53cf6211a344b161adae68f9d13489df3380c9a -size 1848 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/analog.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/analog.png deleted file mode 100644 index f7a53ab521..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/analog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a69b97bc980f8b1f2e192939a90b8261fc723647c953b06fee35bd712d6664dc -size 2625 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/bubble.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/bubble.png deleted file mode 100644 index bce1235d0a..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/bubble.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b47c077fd86f5a112ddccefe4eb8593269f85307ca0bb55b24c5852e29c44d9f -size 908 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/clear.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/clear.png deleted file mode 100644 index f8ac6dab14..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/clear.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2878fa41fe5a8e04a913ded70e951b50c12c79332336ddab0571d9d5acafe8d9 -size 10286 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/connected.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/connected.jpg deleted file mode 100644 index 3a0989590b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/connected.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1711e2798aaef6609b9a6e775668389f9375d0d2717aa06398655adf22a1d181 -size 5423 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/connected_commands.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/connected_commands.jpg deleted file mode 100644 index 027311e30d..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/connected_commands.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17a96d90c2bb2aed6fb51c4b937dc646dbfbdea762278c7959259cf7f8f7ebfa -size 4846 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/copy.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/copy.jpg deleted file mode 100644 index 2a979c1600..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/copy.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:206d6e40e4dc113fd69137a69eb681820ec74a264b1192908af10f34c1ee773a -size 2077 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/copy.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/copy.png deleted file mode 100644 index e8c9ab77db..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/copy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69dcd18b3c1d7e8e8fd8129d155433483e9507844c300a061bc0b236d085dc34 -size 1307 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/edit.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/edit.jpg deleted file mode 100644 index a4f60a3037..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/edit.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9537f60abafda241ed7ab5723bc5f6bbbe3b0f00d0ab54ca7df23019dbb399c0 -size 3204 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/file.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/file.png deleted file mode 100644 index c764684c9b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/file.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:735532a02ec90c12919d2a95504c4610771d758153ccc91b59bc848f1316ecbd -size 17078 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/files.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/files.jpg deleted file mode 100644 index 5d1c3622c8..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/files.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c523083c4b801b9356de8581d79b52739dccacdb48f702f708d3d2107349a903 -size 1453 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/fractal.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/fractal.png deleted file mode 100644 index 7e295610d7..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/fractal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3698fdb7642125042a15f99af3386a9b77a811452f2ec17cb57d8ebd358791dd -size 78620 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost.jpg deleted file mode 100644 index 11622f65be..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:649beae00ec3f8474f250345469e0a532410b08aa7583586e5eca699bce461f6 -size 6442 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost2.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost2.jpg deleted file mode 100644 index 4b7a2a3f4c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8350f66bee4a27057bca036a0f77d2fa58805855638934af580e9d4594132899 -size 6120 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost2.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost2.png deleted file mode 100644 index e8a9c5659f..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ghost2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b9bf4823753884fc1f740e2960c29b3bb8d71c8ab6a3eadedd1b04e786d4d04 -size 2240 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/green.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/green.png deleted file mode 100644 index 472e456db6..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/green.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4895e019db635088a737f98e6b5ae315eff0d6b69d877aff77c390c9e480502 -size 461 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/icon.ico b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/icon.ico deleted file mode 100644 index e4de92c2da..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/icon.ico +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:204d620bad73bbb109d25751ad03eaeccc9f9630ea3d4a80b60e76e0e58ca168 -size 370070 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/img_record.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/img_record.jpg deleted file mode 100644 index 4122cc1cd8..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/img_record.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27b4fb98e685c1b91505296467eef79b5a0affdb497e0292ef7d22411581cc7e -size 3005 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/img_screenshot.jpg b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/img_screenshot.jpg deleted file mode 100644 index b96b70997e..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/img_screenshot.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a00543853ef9397616c9623b7e981bf827710465875bb18df51bb45cddc87fee -size 2712 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ip32.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ip32.png deleted file mode 100644 index 8584312e5b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ip32.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb2fd585e63469215f04d83b25d823b2baf64e3873748034f3201e3105f898dc -size 688 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/letter_p.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/letter_p.png deleted file mode 100644 index 2e0b79979f..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/letter_p.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a55085462185bd996b10e937790cc6e384c070c8a3d6c15fdd1d32acdfa1166b -size 2082 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/logo_pc.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/logo_pc.png deleted file mode 100644 index 2d8014f22b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/logo_pc.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ff2a567827ba1dd6144e5bbffa2c7b6aa1436af2700a15270c5db8a08ec3d58 -size 11635 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/logo_unknown.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/logo_unknown.png deleted file mode 100644 index 6c6eecfa4b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/logo_unknown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e72232e7cd1e7fd33bef073d87af76002c31c6346976cfdfedfc728529ee20e5 -size 19973 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32.png deleted file mode 100644 index b10f1e963a..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea58f4896239eb4fee8065c7b90b517b996d1e58dda931e7b6e6b0f4d1948c85 -size 2451 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32_cmd.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32_cmd.png deleted file mode 100644 index 3a08c2cc0f..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32_cmd.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfaca89f734f3b033e8c65455f7b3b701dbb04f24acc5be3d44dd9850ce6b89e -size 2340 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32_file.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32_file.png deleted file mode 100644 index ce3f29f06d..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/mode32_file.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4c9ec3cc6f6f6f2eb70bc1d3a6355ea70d35645c326ecc553d395985d491815 -size 2191 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/pie.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/pie.png deleted file mode 100644 index 092a9eb9e5..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/pie.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f2311f3b80ed9dba3bef64fb58ac48f0343cb624be9d1682e46d2250c5c93ad -size 13613 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/red.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/red.png deleted file mode 100644 index 60b5e24ff2..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/red.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d102651736e931e824562ef1b086a328d47f8aa14e1079093f2701b7a76ac297 -size 432 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ryse.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ryse.png deleted file mode 100644 index bd96c7055b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/ryse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b60c12b45bdd183c1ac08ab2cc045e57921d7664d8aec4d46dbe1123128e044e -size 787 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-camera.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-camera.png deleted file mode 100644 index c4c1e5c71b..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-camera.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:763df664ca322ab581013ef282ef51559558453a64abe85c5d32bf691f519931 -size 1383 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-controller.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-controller.png deleted file mode 100644 index e2f130c4df..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-controller.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1786401fb707fc77030704ea3974c0801e5b0cf17f5a7a59e866e1cfd88b98a9 -size 1436 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-dice.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-dice.png deleted file mode 100644 index eb9d43f276..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-dice.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d77a11889fa116bf296716c9d61a60f65899739335cbe9191a1a03ee72b7d25 -size 2283 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-earth.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-earth.png deleted file mode 100644 index bc778f6905..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-earth.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bae5f3a8ebb14da7f0532dbea78e02ebd161c59037c9674f4d03ae3f7290dfba -size 1803 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-empty.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-empty.png deleted file mode 100644 index 0703805cb5..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-empty.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c87a96b784358f85fd927618b9c85a22365f2bb6ec6b7ae95b077e0fa9cd85e4 -size 901 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-file.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-file.png deleted file mode 100644 index fa67ef0c83..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-file.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9975ac9b25764eb93b7c1a93a502f54533de5fbd715506b93e58660c30c97331 -size 842 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-film.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-film.png deleted file mode 100644 index 9fed115bd8..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-film.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47615653d3b0d3fce41e43f1345d239438e9361a17c394bf08122fe34e840c69 -size 1215 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-full.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-full.png deleted file mode 100644 index e68863b225..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-full.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8aa11d2572227c071f5affbcf38cf7fe562cc2975d149c9cdc52de3347a2a0cc -size 1200 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-gear.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-gear.png deleted file mode 100644 index 055e7a8b8c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-gear.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:375b20b401e194dc007714e04a9e996a001c6942dc25b0124e19f8428a584f21 -size 1646 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-monitor.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-monitor.png deleted file mode 100644 index db0a97ac6a..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-monitor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07c8e1c9a2540f8c6b510fceadf7d85b4887cc8084c6042f16cb0f7719fff7a8 -size 1210 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-no.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-no.png deleted file mode 100644 index 6de2c1d832..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-no.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b27d81c5bc4fa8846e8948dd1443750993be3844ad5768f7781f0c386a4485ab -size 1859 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-ok.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-ok.png deleted file mode 100644 index 52360b7451..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-ok.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ef2fcef20ab2e3e2e9821fff6190259a4cc51214122af43cd80a0132b6a803f -size 1561 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-parabolic_off.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-parabolic_off.png deleted file mode 100644 index baf4812763..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-parabolic_off.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:565935636543c658edc8366e1665e0f263340417bf054ac00e9b6e2e15b410da -size 1512 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-parabolic_on.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-parabolic_on.png deleted file mode 100644 index eccc54a571..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-parabolic_on.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c897278e539cd224a7cd620e718ca445698a727f46caf00c2c36734e662b5010 -size 1467 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-radioactive.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-radioactive.png deleted file mode 100644 index d9667235b2..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-radioactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db0880ca911d21e430186741bdc9d2368110ffd79dc93cac401e5eb773893de1 -size 1353 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-sliders.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-sliders.png deleted file mode 100644 index 46eec3e3e5..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-sliders.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4190552275785881b2fe72936cde2aa5475b41176a35a12dffd468bb993b9e99 -size 1420 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-tools.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-tools.png deleted file mode 100644 index e0d10f0760..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-tools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96bd1b29e78b36d77e32e05fd13ed93b6f45ead3e147e9b2a096bf6617156187 -size 1347 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-winlogo.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-winlogo.png deleted file mode 100644 index 66e759c870..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-winlogo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de2d2673ec0b9e6dd8cc295562eaff47cef4d308d2043021c69840314dfe1c8 -size 1636 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-winlogo16.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-winlogo16.png deleted file mode 100644 index 7d854c8c9c..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/s1-winlogo16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f958882714d585d2f2a4e8686736ce6371934e29c11dc38a36bcaec28b30036 -size 671 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/signal_full.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/signal_full.png deleted file mode 100644 index 3fa632c87a..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/signal_full.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:497a658103d0839d380cb93a195744c833497707f5dcd3182b2a5231b0a0d3cf -size 1705 diff --git a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/upIcon32.png b/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/upIcon32.png deleted file mode 100644 index 1e853462c9..0000000000 --- a/Code/Tools/UniversalRemoteConsole/RemoteConsole/res/upIcon32.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80c39f9d24ea9085fb15a89629cbce8ab1006e6066ea62f611ced4dd38001186 -size 1036 diff --git a/Editor/Translation/scriptcanvas_en_us.ts b/Editor/Translation/scriptcanvas_en_us.ts index 67b5261b92..a7d29e2dbc 100644 --- a/Editor/Translation/scriptcanvas_en_us.ts +++ b/Editor/Translation/scriptcanvas_en_us.ts @@ -41918,39 +41918,6 @@ An Entity can be selected by using the pick button, or by dragging an Entity fro HANDLER_WORLDNOTIFICATIONBUS_CATEGORY PhysX - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_NAME - Class/Bus: WORLDNOTIFICATIONBUS Event/Method: OnPrePhysicsSubtick - On Pre Subtick - - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_TOOLTIP - Notifies before a fixed physics subtick. Source is the name of the world, e.g. AZPhysicalWorld. - - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_CATEGORY - - - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_OUT_NAME - - - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_OUT_TOOLTIP - - - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_OUTPUT0_NAME - Fixed Delta Time - - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_IN_NAME - - - - HANDLER_WORLDNOTIFICATIONBUS_ONPREPHYSICSSUBTICK_IN_TOOLTIP - - HANDLER_WORLDNOTIFICATIONBUS_ONPOSTPHYSICSSUBTICK_NAME Class/Bus: WORLDNOTIFICATIONBUS Event/Method: OnPostPhysicsSubtick @@ -97765,79 +97732,6 @@ You can call "Redo Drag" from a script after the script has caused dro The current context - - Handler: PhysicsSystemEventBus - - HANDLER_PHYSICSSYSTEMEVENTBUS_NAME - Physics System - - - HANDLER_PHYSICSSYSTEMEVENTBUS_TOOLTIP - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_CATEGORY - Physics (Legacy) - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPREPHYSICSUPDATE_NAME - Class/Bus: PhysicsSystemEventBus Event/Method: OnPrePhysicsUpdate - On Pre Update - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPREPHYSICSUPDATE_TOOLTIP - Notifes before a physics update - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPREPHYSICSUPDATE_CATEGORY - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPREPHYSICSUPDATE_OUT_NAME - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPREPHYSICSUPDATE_OUT_TOOLTIP - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPREPHYSICSUPDATE_IN_NAME - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPREPHYSICSUPDATE_IN_TOOLTIP - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPOSTPHYSICSUPDATE_NAME - Class/Bus: PhysicsSystemEventBus Event/Method: OnPostPhysicsUpdate - On Post Update - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPOSTPHYSICSUPDATE_TOOLTIP - Notifes after a physics update - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPOSTPHYSICSUPDATE_CATEGORY - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPOSTPHYSICSUPDATE_OUT_NAME - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPOSTPHYSICSUPDATE_OUT_TOOLTIP - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPOSTPHYSICSUPDATE_IN_NAME - - - - HANDLER_PHYSICSSYSTEMEVENTBUS_ONPOSTPHYSICSUPDATE_IN_TOOLTIP - - - EBus: UiScrollBarBus diff --git a/Engine/Registry/Platform/Windows/streamer.editor.setreg b/Engine/Registry/Platform/Windows/streamer.editor.setreg index acfab2100a..0f7eb3e63d 100644 --- a/Engine/Registry/Platform/Windows/streamer.editor.setreg +++ b/Engine/Registry/Platform/Windows/streamer.editor.setreg @@ -32,7 +32,10 @@ // Unbuffered reads bypass the OS file cache for faster file reads. This helps speed up initial file loads // and is best for applications that only read a file once such as the game. For applications that frequently // re-read files such as the editor it's better to turn this feature off. - "EnableUnbufferedReads": false + "EnableUnbufferedReads": false, + // If true, only information that's explicitly requested or issues are reported. If false, status information + // such as when drives are created and destroyed is reported as well. + "MinimalReporting": false }, { "$type": "AzFramework::RemoteStorageDriveConfig", diff --git a/Engine/Registry/Platform/Windows/streamer.game.setreg b/Engine/Registry/Platform/Windows/streamer.game.setreg index 530fb6e4d4..f45f009b03 100644 --- a/Engine/Registry/Platform/Windows/streamer.game.setreg +++ b/Engine/Registry/Platform/Windows/streamer.game.setreg @@ -34,7 +34,10 @@ // results in a faster read the first time a file is read, but subsequent reads will possibly be slower as // those could have been serviced from the faster OS cache. During development or for games that reread // files frequently it's recommended to set this option to false, but generally it's best to be turned on. - "EnableUnbufferedReads": true + "EnableUnbufferedReads": true, + // If true, only information that's explicitly requested or issues are reported. If false, status information + // such as when drives are created and destroyed is reported as well. + "MinimalReporting": false }, { "$type": "AZ::IO::ReadSplitterConfig", diff --git a/Engine/Registry/Platform/Windows/streamer.test.setreg b/Engine/Registry/Platform/Windows/streamer.test.setreg index 83f52cb3bc..a87dc599c8 100644 --- a/Engine/Registry/Platform/Windows/streamer.test.setreg +++ b/Engine/Registry/Platform/Windows/streamer.test.setreg @@ -5,6 +5,7 @@ { "Streamer": { + "ReportHardware": false, "Profiles": { "Generic": @@ -21,7 +22,8 @@ "MaxMetaDataCache": 1024, "Overcommit": 8, "EnableFileSharing": false, - "EnableUnbufferedReads": true + "EnableUnbufferedReads": true, + "MinimalReporting": true }, { "$type": "AZ::IO::ReadSplitterConfig", diff --git a/Engine/Registry/prefab.tools.setreg b/Engine/Registry/prefab.tools.setreg index 9e823dcd81..14010561e7 100644 --- a/Engine/Registry/prefab.tools.setreg +++ b/Engine/Registry/prefab.tools.setreg @@ -9,10 +9,18 @@ { "Stack": { - "GameObjectCreation": + "PlayInEditor": [ { "$type": "AzToolsFramework::Prefab::PrefabConversionUtils::EditorInfoRemover" }, { "$type": "AzToolsFramework::Prefab::PrefabConversionUtils::PrefabCatchmentProcessor" } + ], + "GameObjectCreation": + [ + { "$type": "AzToolsFramework::Prefab::PrefabConversionUtils::EditorInfoRemover" }, + { + "$type": "AzToolsFramework::Prefab::PrefabConversionUtils::PrefabCatchmentProcessor", + "SerializationFormat": "Binary" // Options are "Binary" (default) or "Text". Prefer "Binary" for performance. + } ] } } diff --git a/Engine/Registry/streamer.setreg b/Engine/Registry/streamer.setreg index c2330f8b66..79e80bbf5c 100644 --- a/Engine/Registry/streamer.setreg +++ b/Engine/Registry/streamer.setreg @@ -7,6 +7,8 @@ { // Whether to use all available hardware or restrict to known paths. "UseAllHardware": true, + // Whether to report hardware information + "ReportHardware": true, "Profiles": { "Generic": diff --git a/Engine/Registry/streamer.test.setreg b/Engine/Registry/streamer.test.setreg index 01a6b69d39..21504f659a 100644 --- a/Engine/Registry/streamer.test.setreg +++ b/Engine/Registry/streamer.test.setreg @@ -5,6 +5,7 @@ { "Streamer": { + "ReportHardware": false, "Profiles": { "Generic": diff --git a/Gems/AWSClientAuth/Code/CMakeLists.txt b/Gems/AWSClientAuth/Code/CMakeLists.txt index 8a5f6ddfb2..e9f2a4ed84 100644 --- a/Gems/AWSClientAuth/Code/CMakeLists.txt +++ b/Gems/AWSClientAuth/Code/CMakeLists.txt @@ -34,7 +34,6 @@ ly_add_target( ly_add_target( NAME AWSClientAuth ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} NAMESPACE Gem - OUTPUT_NAME Gem.AWSClientAuth.c74f2756f5874c0d8d29646dfc9cb0ad.v0.1.0 FILES_CMAKE awsclientauth_shared_files.cmake INCLUDE_DIRECTORIES diff --git a/Gems/AWSClientAuth/Code/Include/Public/Authentication/AuthenticationProviderBus.h b/Gems/AWSClientAuth/Code/Include/Public/Authentication/AuthenticationProviderBus.h index f736ced590..693adf1e65 100644 --- a/Gems/AWSClientAuth/Code/Include/Public/Authentication/AuthenticationProviderBus.h +++ b/Gems/AWSClientAuth/Code/Include/Public/Authentication/AuthenticationProviderBus.h @@ -152,7 +152,7 @@ namespace AWSClientAuth //! @param userCode Unique code generated for user for the session. //! @param verificationUrl Verification URL to enter user code in after signing in for the provider. //! @param codeExpiresInSeconds Code expiry in seconds. - virtual void OnDeviceCodeGrantSignInSuccess(const AZStd::string& userCode, const AZStd::string& verificationUrl, const int codeExpiresInSeconds) + virtual void OnDeviceCodeGrantSignInSuccess(const AZStd::string& userCode, const AZStd::string& verificationUrl, int codeExpiresInSeconds) { AZ_UNUSED(userCode); AZ_UNUSED(verificationUrl); diff --git a/Gems/AWSClientAuth/Code/Source/AWSClientAuthSystemComponent.cpp b/Gems/AWSClientAuth/Code/Source/AWSClientAuthSystemComponent.cpp index 885027ef0f..20efa354cc 100644 --- a/Gems/AWSClientAuth/Code/Source/AWSClientAuthSystemComponent.cpp +++ b/Gems/AWSClientAuth/Code/Source/AWSClientAuthSystemComponent.cpp @@ -155,8 +155,8 @@ namespace AWSClientAuth } m_cognitoIdentityProviderClient = - std::make_shared(clientConfiguration); - m_cognitoIdentityClient = std::make_shared(clientConfiguration); + std::make_shared(Aws::Auth::AWSCredentials(), clientConfiguration); + m_cognitoIdentityClient = std::make_shared(Aws::Auth::AWSCredentials(), clientConfiguration); } std::shared_ptr AWSClientAuthSystemComponent::GetCognitoIDPClient() diff --git a/Gems/AWSClientAuth/Code/Tests/AWSClientAuthGemMock.h b/Gems/AWSClientAuth/Code/Tests/AWSClientAuthGemMock.h index 70b32443cc..3ae87b254b 100644 --- a/Gems/AWSClientAuth/Code/Tests/AWSClientAuthGemMock.h +++ b/Gems/AWSClientAuth/Code/Tests/AWSClientAuthGemMock.h @@ -313,7 +313,7 @@ namespace AWSClientAuthUnitTest : public Aws::CognitoIdentity::CognitoIdentityClient { public: - CognitoIdentityClientMock() + CognitoIdentityClientMock() : Aws::CognitoIdentity::CognitoIdentityClient(Aws::Auth::AWSCredentials()) { ON_CALL(*this, GetId(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityClientMock::GetIdMock)); ON_CALL(*this, GetCredentialsForIdentity(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityClientMock::GetCredentialsForIdentityMock)); @@ -392,7 +392,7 @@ namespace AWSClientAuthUnitTest MOCK_METHOD1(OnPasswordGrantMultiFactorSignInFail, void(const AZStd::string& error)); MOCK_METHOD1(OnPasswordGrantMultiFactorConfirmSignInSuccess, void(const AWSClientAuth::AuthenticationTokens& authenticationToken)); MOCK_METHOD1(OnPasswordGrantMultiFactorConfirmSignInFail, void(const AZStd::string& error)); - MOCK_METHOD3(OnDeviceCodeGrantSignInSuccess, void(const AZStd::string& userCode, const AZStd::string& verificationUrl, const int codeExpiresInSeconds)); + MOCK_METHOD3(OnDeviceCodeGrantSignInSuccess, void(const AZStd::string& userCode, const AZStd::string& verificationUrl, int codeExpiresInSeconds)); MOCK_METHOD1(OnDeviceCodeGrantSignInFail, void(const AZStd::string& error)); MOCK_METHOD1(OnDeviceCodeGrantConfirmSignInSuccess, void(const AWSClientAuth::AuthenticationTokens& authenticationToken)); MOCK_METHOD1(OnDeviceCodeGrantConfirmSignInFail, void(const AZStd::string& error)); diff --git a/Gems/AWSCore/Code/Include/Public/Framework/AWSApiClientJobConfig.h b/Gems/AWSCore/Code/Include/Public/Framework/AWSApiClientJobConfig.h index 30da6bfbe7..34011e4b14 100644 --- a/Gems/AWSCore/Code/Include/Public/Framework/AWSApiClientJobConfig.h +++ b/Gems/AWSCore/Code/Include/Public/Framework/AWSApiClientJobConfig.h @@ -28,6 +28,10 @@ namespace Aws { class HttpClient; } + namespace Auth + { + class AWSCredentials; + } } @@ -118,7 +122,7 @@ namespace AWSCore else { // If no explict credenitals are provided then AWS C++ SDK will perform standard search - return std::make_shared(GetClientConfiguration()); + return std::make_shared(Aws::Auth::AWSCredentials(), GetClientConfiguration()); } } diff --git a/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorDynamoDB.cpp b/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorDynamoDB.cpp index bee641d3ff..7d0d0e7a9f 100644 --- a/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorDynamoDB.cpp +++ b/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorDynamoDB.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include diff --git a/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorLambda.cpp b/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorLambda.cpp index 73fa07f0ca..b279e1189d 100644 --- a/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorLambda.cpp +++ b/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorLambda.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff --git a/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorS3.cpp b/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorS3.cpp index 6e6de1c917..742a6826af 100644 --- a/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorS3.cpp +++ b/Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorS3.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include #include diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md b/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md index e79778d31b..578592f77c 100644 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md @@ -57,7 +57,7 @@ $ python resource_mapping_tool.py Update `resource_mapping_tool.cmd` with your virtualenv full path. * **VIRTUALENV_PATH**: Fill this variable with your virtualenv full path. - + Then you can launch the resource mapping tool by running the batch script directly. ``` diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py index 4ca062d885..be7bde3b6d 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py @@ -182,11 +182,10 @@ class ViewEditController(QObject): notification_label_text.VIEW_EDIT_PAGE_SAVING_SUCCEED_MESSAGE.format(config_file)) def _search_complete_callback(self) -> None: - self._view_edit_page.set_notification_page_text(ViewEditPageConstants.NOTIFICATION_SELECT_CONFIG_FILE_TEXT) self._reset_page() def _start_search_config_files_async(self, config_directory: str) -> None: - self._view_edit_page.set_notification_page_text(ViewEditPageConstants.NOTIFICATION_LOADING_TEXT) + self._view_edit_page.set_notification_page_text(notification_label_text.NOTIFICATION_LOADING_MESSAGE) self._view_edit_page.set_current_main_view_index(ViewEditPageConstants.NOTIFICATION_PAGE_INDEX) self._config_file_json_source.clear() self._table_view.reset_view() @@ -233,12 +232,11 @@ class ViewEditController(QObject): self._view_edit_page.save_changes_button.clicked.connect(self._save_changes) self._view_edit_page.search_filter_input.returnPressed.connect(self._filter_based_on_search_text) self._view_edit_page.cancel_button.clicked.connect(self._cancel) - self._view_edit_page.notification_prompt_create_new_button.clicked.connect(self._create_new_config_file) - self._view_edit_page.notification_prompt_rescan_button.clicked.connect(self._rescan_config_directory) + self._view_edit_page.create_new_button.clicked.connect(self._create_new_config_file) + self._view_edit_page.rescan_button.clicked.connect(self._rescan_config_directory) def _setup_page_start_state(self) -> None: configuration: Configuration = self._configuration_manager.configuration - self._view_edit_page.set_notification_page_text(ViewEditPageConstants.NOTIFICATION_SELECT_CONFIG_FILE_TEXT) self._view_edit_page.set_current_main_view_index(ViewEditPageConstants.NOTIFICATION_PAGE_INDEX) self._view_edit_page.set_config_files(configuration.config_files) self._view_edit_page.set_config_location(configuration.config_directory) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py index e1a8b66705..7b55c118cd 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py @@ -12,6 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. from __future__ import annotations import logging +from PySide2.QtGui import QPixmap from PySide2.QtWidgets import (QMainWindow, QStackedWidget, QWidget) from model import (error_messages, view_size_constants) @@ -42,6 +43,7 @@ class ViewManager(object): def __init__(self) -> None: if ViewManager.__instance is None: self._main_window: QMainWindow = QMainWindow() + self._main_window.setWindowIcon(QPixmap(":/stylesheet/img/ly_application_icon.png")) self._main_window.setWindowTitle("Resource Mapping") self._main_window.setGeometry(0, 0, view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py index 1c375975e3..d8f1d1821c 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py @@ -9,7 +9,31 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ +NOTIFICATION_LOADING_MESSAGE: str = "Loading..." + +VIEW_EDIT_PAGE_CONFIG_FILE_TEXT: str = "Config File" +VIEW_EDIT_PAGE_CONFIG_LOCATION_TEXT: str = "Config Location:" +VIEW_EDIT_PAGE_ADD_ROW_TEXT: str = "Add Row" +VIEW_EDIT_PAGE_DELETE_ROW_TEXT: str = "Delete Row" +VIEW_EDIT_PAGE_SAVE_CHANGES_TEXT: str = "Save Changes" +VIEW_EDIT_PAGE_CANCEL_TEXT: str = "Cancel" +VIEW_EDIT_PAGE_CREATE_NEW_TEXT: str = "Create New" +VIEW_EDIT_PAGE_RESCAN_TEXT: str = "Rescan" + +VIEW_EDIT_PAGE_CONFIG_FILES_PLACEHOLDER_TEXT: str = "Found {} config files" VIEW_EDIT_PAGE_SEARCH_PLACEHOLDER_TEXT: str = "Search by Key Name, Type, Name/ID, Account ID or Region" +VIEW_EDIT_PAGE_IMPORT_RESOURCES_PLACEHOLDER_TEXT: str = "Import Additional Resources" + +VIEW_EDIT_PAGE_SELECT_CONFIG_FILE_MESSAGE: str = "Please select the Config file you would like to view and modify..." +VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE: str = \ + "

Unable to locate a resource mapping config file.

"\ + "

We can either make this file for you or you can rescan your directory.

" VIEW_EDIT_PAGE_SAVING_SUCCEED_MESSAGE: str = "Config file {} is saved successfully." +IMPORT_RESOURCES_PAGE_BACK_TEXT: str = "Back" +IMPORT_RESOURCES_PAGE_AWS_SEARCH_TYPE_TEXT: str = "AWS Resource Type" +IMPORT_RESOURCES_PAGE_SEARCH_TEXT: str = " Search" +IMPORT_RESOURCES_PAGE_IMPORT_TEXT: str = "Import" + IMPORT_RESOURCES_PAGE_SEARCH_PLACEHOLDER_TEXT: str = "Search for resources by Type or Name/ID" +IMPORT_RESOURCES_PAGE_AWS_SEARCH_TYPE_PLACEHOLDER_TEXT: str = "Please select" diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/resource_table_model.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/resource_table_model.py index 7facb363dd..873dbc0d00 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/resource_table_model.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/resource_table_model.py @@ -20,7 +20,7 @@ from model.resource_mapping_attributes import (ResourceMappingAttributes, Resour logger = logging.getLogger(__name__) _TABLE_HORIZONTAL_HEADER_NAMES: List[str] =\ - ["Key Name*", "Type*", "Name/ID*", "Account ID", "Region", "Status"] + ["Key Name", "Type", "Name/ID", "Account ID", "Region", "Status"] class ResourceTableConstants(object): @@ -70,16 +70,6 @@ class ResourceTableModel(ResourceAbstractModel, QAbstractTableModel, metaclass=R return resource.status.value return "" - def _get_resource_attribute_tooltip(self, row: int, column: int) -> str: - if 0 <= row < len(self._resources): - resource: ResourceMappingAttributes = self._resources[row] - attribute: str = self._get_resource_str_type_attribute(resource, column) - if attribute: - return attribute - elif column == ResourceTableConstants.TABLE_STATE_COLUMN_INDEX: - return resource.status.descriptions_in_tooltip() - return "" - def _set_resource_attribute(self, row: int, column: int, value: str) -> None: if 0 <= row < len(self._resources): resource: ResourceMappingAttributes = self._resources[row] @@ -113,11 +103,17 @@ class ResourceTableModel(ResourceAbstractModel, QAbstractTableModel, metaclass=R """QAbstractTableModel override""" row: int = index.row() column: int = index.column() - if role == Qt.DisplayRole or role == Qt.EditRole: - return self._get_resource_attribute(row, column) - - if role == Qt.ToolTipRole: - return self._get_resource_attribute_tooltip(row, column) + if 0 <= row < len(self._resources): + resource: ResourceMappingAttributes = self._resources[row] + attribute: str = self._get_resource_str_type_attribute(resource, column) + if attribute: + if role == Qt.DisplayRole or role == Qt.EditRole or role == Qt.ToolTipRole: + return attribute + elif column == ResourceTableConstants.TABLE_STATE_COLUMN_INDEX: + if role == Qt.ToolTipRole: + return resource.status.descriptions_in_tooltip() + if role == Qt.DisplayRole: + return resource.status.value def headerData(self, section: int, orientation: int, role: int = Qt.DisplayRole) -> object: """QAbstractTableModel override""" diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py index 2e90e1d94a..dea4cea773 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py @@ -13,54 +13,33 @@ TOOL_APPLICATION_MAIN_WINDOW_WIDTH: int = 920 TOOL_APPLICATION_MAIN_WINDOW_HEIGHT: int = 600 MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT: int = 10 -MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM: int = 20 +MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM: int = 15 INTERACTION_COMPONENT_HEIGHT: int = 25 -ICON_FRONT_SIZE: int = 12 """view edit page related constants""" -VIEW_EDIT_PAGE_HEADER_FOOTER_AREA_HEIGHT: int = 75 -VIEW_EDIT_PAGE_CENTER_AREA_HEIGHT: int = 450 +VIEW_EDIT_PAGE_HEADER_AREA_HEIGHT: int = 65 +VIEW_EDIT_PAGE_CENTER_AREA_HEIGHT: int = 500 +VIEW_EDIT_PAGE_FOOTER_AREA_HEIGHT: int = 50 -VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y: int = 25 +VIEW_EDIT_PAGE_MARGIN_TOPBOTTOM: int = 10 # header area -CONFIG_FILE_LABEL_X: int = 25 -CONFIG_FILE_LABEL_WIDTH: int = 60 - -CONFIG_FILE_COMBOBOX_X: int = 95 -CONFIG_FILE_COMBOBOX_WIDTH: int = 200 - -CONFIG_LOCATION_LABEL_X: int = 620 -CONFIG_LOCATION_LABEL_WIDTH: int = 80 - -CONFIG_LOCATION_TEXT_X: int = 705 -CONFIG_LOCATION_TEXT_WIDTH: int = 150 - -CONFIG_LOCATION_BUTTON_X: int = 860 +CONFIG_FILE_LABEL_WIDTH: int = 70 +CONFIG_FILE_COMBOBOX_WIDTH: int = 250 +CONFIG_LOCATION_LABEL_WIDTH: int = 110 +CONFIG_LOCATION_TEXT_WIDTH: int = 190 +HEADER_AREA_SEPARATOR_WIDTH: int = 5 # center area -NOTIFICATION_PAGE_PROMPT_HEIGHT: int = 100 -NOTIFICATION_PAGE_PROMPT_BUTTON_WIDTH: int = 75 - TABLE_VIEW_PAGE_INTERACTION_AREA_HEIGHT: int = 40 -ADD_ROW_BUTTON_X: int = 10 -ADD_ROW_BUTTON_WIDTH: int = 75 - -DELETE_ROW_BUTTON_X: int = 90 -DELETE_ROW_BUTTON_WIDTH: int = 75 - -IMPORT_RESOURCES_LABEL_X: int = 185 -IMPORT_RESOURCES_LABEL_WIDTH: int = 40 - -IMPORT_RESOURCES_COMBOBOX_X: int = 225 -IMPORT_RESOURCES_COMBOBOX_WIDTH: int = 150 +ADD_ROW_BUTTON_WIDTH: int = 90 +DELETE_ROW_BUTTON_WIDTH: int = 90 +IMPORT_RESOURCES_COMBOBOX_WIDTH: int = 180 +TABLE_VIEW_PAGE_SEARCH_FILTER_WIDGET_WIDTH: int = 370 -TABLE_VIEW_PAGE_SEARCH_FILTER_WIDGET_X: int = 565 -TABLE_VIEW_PAGE_SEARCH_FILTER_WIDGET_WIDTH: int = 300 - -TABLE_VIEW_PAGE_TABLE_VIEW_AREA_HEIGHT: int = 400 +TABLE_VIEW_PAGE_TABLE_VIEW_AREA_HEIGHT: int = 450 RESOURCE_TABLE_HEADER_CELL_MAXIMUM: int = 450 RESOURCE_TABLE_HEADER_CELL_MINIMUM: int = 40 @@ -72,43 +51,31 @@ RESOURCE_TABLE_ACCOUNTID_COLUMN_WIDTH: int = 100 RESOURCE_TABLE_REGION_COLUMN_WIDTH: int = 100 # footer area -SAVE_CHANGES_BUTTON_X: int = 710 -SAVE_CHANGES_BUTTON_WIDTH: int = 85 - -CANCEL_BUTTON_X: int = 800 -CANCEL_BUTTON_WIDTH: int = 75 - +SAVE_CHANGES_BUTTON_WIDTH: int = 90 +CREATE_NEW_BUTTON_WIDTH: int = 90 +RESCAN_BUTTON_WIDTH: int = 90 +CANCEL_BUTTON_WIDTH: int = 90 """import resources page related constants""" -IMPORT_RESOURCES_PAGE_HEADER_AREA_HEIGHT: int = 55 -IMPORT_RESOURCES_PAGE_SEARCH_AREA_HEIGHT: int = 55 -IMPORT_RESOURCES_PAGE_VIEW_AREA_HEIGHT: int = 450 +IMPORT_RESOURCES_PAGE_HEADER_AREA_HEIGHT: int = 65 +IMPORT_RESOURCES_PAGE_SEARCH_AREA_HEIGHT: int = 50 +IMPORT_RESOURCES_PAGE_VIEW_AREA_HEIGHT: int = 500 +IMPORT_RESOURCES_PAGE_FOOTER_AREA_HEIGHT: int = 50 -IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y: int = 15 +IMPORT_RESOURCES_PAGE_MARGIN_TOPBOTTOM: int = 10 +# back area BACK_BUTTON_WIDTH: int = 100 -TYPED_RESOURCES_LABEL_X: int = 10 -TYPED_RESOURCES_LABEL_WIDTH: int = 100 - -TYPED_RESOURCES_COMBOBOX_X: int = 115 +# search area +TYPED_RESOURCES_LABEL_WIDTH: int = 125 TYPED_RESOURCES_COMBOBOX_WIDTH: int = 150 - -SEARCH_BUTTON_WIDTH: int = 80 -IMPORT_BUTTON_WIDTH: int = 80 - -TYPED_RESOURCES_SEARCH_BUTTON_X: int = 310 -TYPED_RESOURCES_IMPORT_BUTTON_X: int = 395 - -CFN_STACKS_SEARCH_BUTTON_X: int = 10 -CFN_STACKS_IMPORT_BUTTON_X: int = 95 - -IMPORT_RESOURCES_PAGE_SEARCH_FILTER_WIDGET_X: int = 565 +SEARCH_BUTTON_WIDTH: int = 90 +IMPORT_BUTTON_WIDTH: int = 90 IMPORT_RESOURCES_PAGE_SEARCH_FILTER_WIDGET_WIDTH: int = 300 -IMPORT_RESOURCES_PAGE_TREE_VIEW_X: int = 50 -IMPORT_RESOURCES_PAGE_TREE_VIEW_WIDTH: int = 800 -IMPORT_RESOURCES_PAGE_TREE_VIEW_HEIGHT: int = 400 +# tree view area +IMPORT_RESOURCES_PAGE_TREE_VIEW_HEIGHT: int = 450 -RESOURCE_STACK_HEADER_CELL_MAXIMUM: int = 400 -RESOURCE_STACK_HEADER_CELL_MINIMUM: int = 200 +RESOURCE_STACK_HEADER_CELL_MAXIMUM: int = 500 +RESOURCE_STACK_HEADER_CELL_MINIMUM: int = 300 diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py index 6a05e472e8..8febe76111 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py @@ -19,9 +19,11 @@ from manager.configuration_manager import ConfigurationManager from manager.controller_manager import ControllerManager from manager.thread_manager import ThreadManager from manager.view_manager import ViewManager +from style import azqtcomponents_resources +from utils import file_utils # logging setup -logging.basicConfig(stream=sys.stdout, level=logging.INFO, +logging.basicConfig(filename="resource_mapping_tool.log", filemode='w', level=logging.INFO, format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s', datefmt='%H:%M:%S') logging.getLogger('boto3').setLevel(logging.CRITICAL) logging.getLogger('botocore').setLevel(logging.CRITICAL) @@ -30,11 +32,19 @@ logging.getLogger('urllib3').setLevel(logging.CRITICAL) logger = logging.getLogger(__name__) if __name__ == "__main__": - import sys QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) app: QApplication = QApplication(sys.argv) + try: + style_sheet_path: str = file_utils.join_path(file_utils.get_parent_directory_path(__file__), + 'style/base_style_sheet.qss') + with open(style_sheet_path, "r") as in_file: + style_sheet: str = in_file.read() + app.setStyleSheet(style_sheet) + except FileNotFoundError: + logger.warning("Failed to load style sheet for resource mapping tool") + logger.info("Initializing configuration manager ...") configuration_manager: ConfigurationManager = ConfigurationManager() configuration_manager.setup() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/__init__.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/__init__.py new file mode 100644 index 0000000000..79f8fa4422 --- /dev/null +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/__init__.py @@ -0,0 +1,10 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/azqtcomponents_resources.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/azqtcomponents_resources.py new file mode 100644 index 0000000000..e0792c4b35 --- /dev/null +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/azqtcomponents_resources.py @@ -0,0 +1,186248 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" + +from PySide2 import QtCore + +qt_resource_data = b"\ +\x00\x00*\x22\ +\x00\ +\x01\x0c`x\x9c\xed}\xfds\xdb6\xd2\xf0\xcf\xedL\ +\xff\x07\x9c57\x97\xa4\x92-\xc9\xb2c+\x93w\xce\ +\xb1\xe3Kf\x92\xc6\x89\xdd\xf6}^\xcf\x8d\x87\x92h\ +\x8bgJTI\xca\x1f\xbd\xe9\xff\xfe\xee\xe2\x83\xc4'\ +\x09Jr\xda\xeb=r\xec\xd8$\xb0\xbbX,\x16\x8b\ +\xc5b\xb1\xf3\x82\xbc^\xe7C^\xec|\xf7\xed\xce\x0b\ +\xf2\x8f8\x19\x051\xc9\xf2\xc78\xccH\xd3\x0f\x07\xb2\ +>%/\xbe\xfb\xf6\xdf\xdf}\xfb\xcd(\x18\xdf\xde\xa4\ +\xc9r>\xe9\x8c\x938I\x87\xe4\xef?G\xf3Ir\ +\xff\xa6xq\x8c\xcf_AY^\x80\xfc\xfd\x22|\xc8\ +\xc5\xd3\xdf\xbe\xfb\xf6\xbbo?\x7f\x0c\xa29\xab\xd7&\ +\x9fO\xa2 Nn\x18|\x01T\xae\xd2\x04)\x03\x7f\ +\x92\x8co\x7f\x8e&7a\xaeB-\x9fo\x0a\xfep\ +\x98Gy\x1c\x12\xc0\x82\xec\xce\x01l'\x88\xa3\x9b\xf9\ +\x90\xc4\xe1u\xfe\x8a=.\x11\x14D \xf8\x0b\xac\xfa\ +&H\x05p,\xba\x08&\x93h~\xd3\xc1\xdaC\xb2\ +\xb7x(\x90~\x08Fa\xbcI.]$I\x0c\xd8\ +\xc9\xff!2l\x99\xd6<\x0d\xe6\xd9\x22H\xc3y^\ +\xd6\x02\x9co'Q^EI\x92NBx\xda[<\ +\x90,\x89\xa3\x09\xf9\xfbY0\x0fc\x8b\x8c(\x9cq\ +\x14bx\xff\x01\xcf\x16o\x92\x07\xc1q\x8a\x1f9f\ +%\xe1:\x99\xe7\x9d\xfb0\xba\x99\xe6\xc3Q\x12O\x8a\ +gY\xf4k\x08\x94\xed/\xca\x16}\x88\xb2\xfc\xa7(\ +\xbc\xbf\x1c\xc7A\x96\xbd\xde:\x07\xfe\xc7\xe1\x97\xf0\x97\ +e\x94\x86\x93\xf30\x0e\xc7y\x94\xcc\xb7\xfe9\x1cF\ +y8\x1bf\xf4I8\x11\x9dn67\xbd\x19\x05\xcf\ +\xfa{{m\xd2\xdb\xdbm\x93n\x9b\xc0\x1f\xcfWE\ +(\xf0\xcc\x82\xf4&\x9a3<\xddR0~\x08\xf3\xb3\ +4\x99%y\x98\x9e\x8f\x934d\xc3I\x1dV2\x9b\ +[\xbb\xf4SW\xfdl\x99M\xdf,\xf3<\x99_~\ +\x09r\xa0\x90\xfd\xf1z+O\x97\xe1\xd6?\xdbJ\x09\ +\xde\x10\xb9\xe0\x870\xb8\x83r.\xb5\xd1\xba\xde\xc7/\ +IO\x8cb(T\x8aO'\xa5\x9d'qU/\xc0\ +\x86\x08\xbe\x17M\xfa\xa6|\x99'\x0b\xe7\xbbQ\x02\x04\ +\xce\xb4\xd7\xdf\xf8\xf3\xc3\xd2\xdaw\xc9]\x98V\xb4\xf6\ +\xf4\xf4x\xd0\xed\xfeqZ\xbbVc\xcf\xd20\xcb*\ +\x1b{\xf4\xb2?\xf8\x8fi\xac\xd0h\xed\xf2W\xd1\xea\ +\xe3d6\x03\xe5\x07j\xe7Mx\x0dU\xccFCs\ +\xdf\xd0\x8f\xa5\xb9\x14k=^\x13\xd9\xd1un\x93\xa6\ +!\xb9\x9f\x82Bpar\xe1\xa1\xca\xfd\xf2\x87\xb3s\ +\xfa\x8b\x18\xc0\x0c8\xd5\x89\xd7\xc1,\x8a\x1f\x87d\xeb\ +\xd3\x22\x9c\x93s\xd0\xf9[\xba\xbe\xec\xd7\xeb\x9b\x02\xcd\ +G\x90\x8e\xe0&\x5c\x0d\xd1\xae4\xe3]\xa4a(\xeb\ +\xc9\x93\xe5\x22\x8e\xc6A\x1e\x1eeY\x98\xbf\x9f-\x92\ +\x14\x88\x10\xa5P]\x8e`\xc2\x1aO9\xdf\x98DD\ +3\xa0eH\x96i\xfcl\x9e\xcc\xc3\xed\xc5\xfcF\xd2\ +\xc4\x94f\x0e^\x81J\xdf4%~@\x89\x17\x9d\xd3\ +zK?\x1e\xc8N#\xb0\xed8\xdb|qB\xe7\xc3\ +\xbcV\x87\x93Y)V\xa4\xac\xdf\xb6\xfei\x1b\xedJ\ +A\xf6\xaa\x86.r\x1e\xce\x22\xa4\xa8\x8e)\x87\xf4\x83\ +O\xa8\xb1\x94M\x030Q\x86\xa4K\xba\xdb`\xed\xe0\ +\xc0\xc5w\xf7\xd1$\x9f\x0e\xc9\xcb}\xf6\xe7\x94\xcd\xe4\ +\xa4\x7f\xc0\xfe\xe6V\xd2\x90\x17_\xab\xadg)\x88H\ +\xfa\x08S\x1aZv\xb4`\x0d\x0c\xf6\x1b\x83\x02\xa3u\ +\x13\x187\x00l\xbd\xee\xf1\xe8\x8cC\xbf\xce\x10=-\ +t\xd5f:g8\x89\xb2`\x14\x87\x93\xaf\xdfK\x16\ +\xd4\x9b\x84\xfaG\xeb\xb7r\x84nN\x85|\x00\xd3\xf5\ +\xf7Q$%\x1b\x0e\xf6\xfcu\x09\xb3\xc1\xa9Zfm\ +<\x03\xcd,\xa6\xb8\xf2\xe5Z3\x9dKq\x7f\x13\x87\ +9\xb0\xac\x03\x0b\xaf1\xa5\xab\xbb=x\xe9I\xdaI\ +\x1a\xdc\x1c\xcd''i\xb2\xd8$m\xa7\xf4\xe3\xa0M\ +f[\x1e\xe4\xcb\x0c\xd6\x94\xefa\xd9\xe2t\x188\xd7\ +\x82\xe6\xb2\xf1|\x9c&q<\x0aR\xc7\xaaPA\x08\ +\x92\x17\x8doqL\xa9\x8d\xae\x82\xfb.\x98Op\x0d\ +\xbe\x0a\xf4\xe1\x14\x8d~'\x0e\xba\xbc.\x17\x07oh\ +\x89\xaa\xd5\xba^A%\x8a\xd3\xf4i\x99\xc7\xd1\xbc\xb4\ +z\x84\xcd3\x9c\x06Yg<\x8d\xe2\x09\xac\xd6\x87\xe3\ +8\xc9\xb8f\xc1\x95\xa3d\x03\x0dw\xc0x[\x84i\ +\xfe\x88\xa6g\x92\xee|\x09\xb3d\x99\x8e\xc3l\x07\x91\ +-\xaeXU\xc5L\xf2\xc3\x09P\xe7+a\xc4\x8a\x12\ +>\x1d[\x013\x9b&\xf7\x9dI\x086g\x80\xcb\xe3\ +\x8eX\x87\x0f\xbb\x82\xd0\x8dx\xba\x00\xc89s\xb6\x05\ +\x0b\xb07a\x9d\x9fO\x81\xce\x9b)Y\xa4\xc9M\x1a\ +\xccf\x80~\x1c\xc4\xf1#P\x90\x83\x19\x8f\xcf\xb1}\ +\x91\xf0\xcfm\xcc\xe9V\x12C`\xf5A\x16\xcb8\x0b\ +\xc9\x14\xd4W\x8c*\x8c\xdcS\xcd\x9c\x91g\x09gY\ +\xf9\xaeM\xc2|\xfc\x9c\x02\x11\xfcdz\x9c\x08}~\ +\x86\xc0\xde\x89\xf2\xca\x88Q]V\x85|~\x0c\xe7K\ +\x1c\x09\xe7\x9c\xef\xcaX\xd1\xb1|\x80?\x0a7\x91\xee\ +\x03\xe3\x0a\x85\xaa\x14[\xed\xd6\xec\x0af\xc7E\x1c<\ +\x82p`_g\x05\x98_8\xb3\x1f;\xd18\x99\x0b\ +\x09c\xde\xd1i\x18\xe6;\xd1\xecf\xe7\xc7\xf7\xfd\xee\ +\x0e\xac\xa5\x96\x9d1,\xa8\xc2\x14\xe49\xbb\xa3\xf2e\ +\x828g\x1a\xef\x00\xa7\x0c6#\xa8e\xae\xe3 G\ +O\xd8\xb2\xb0e\x8e~\xc5\x91\x9a\x9d\x82(\x84\xf7I\ +z\xdb\xe9\xbc\x9d\xe7Q\xfe\xf8~b\xb6z\x16\xf3\xc8\x92\xbec$\xdfE\xd9\ +\x12$\xfbW\xc4^p\x1dd}\x09\xc2\x8fS}\x1a\ +M& \x08\xd7i2\xc3\x0e\x8apt\x84\xd7\xc1H\ +\x94\xf1$\x8e[\x81\xad\x1f\xa0H\xa5{\xdc\xd1\x1d\xbf\ +#\xe1\x1aweu\xf2vN\x97I\xc6&\xd2\xefA\ +\xe8\xe5\xfb\xecS\x01M\x1a\xff\x9f\xf3B43\x18\xfd\ +\xa0\xc4\x80\x10Kglj\xf47\xd0\xb32gp\xf0\ +\xa7I\x92\x93\xe4\xbaT\x0e\x85Z@\xbe\x91\x1bh\xdb\ +F4\x81E+\x9a\xec\xfc\x02\xc4\x14\x15\xa4]\xa8\xb5\ +ye\xf2\x81\xeee\xc1/3y\xe6i\xd4P1\xbc\ +\xfe\xef\xe6\x95\xf9\xcd\xe8Y\xef`\xd0\xde\xeb\xc1?n\ +\x067&\xeb\x7f\x9e\x84\xac\xc1A\xbb\xdf=h\xf7\xfa\ +\xddU\xe9\xfa\x7fOB\xd7\xfe~\xbb\xb7\xbb\xdb\xee\x0f\ +\x06\xcf\xad\xdd\xcdf`\x8d\x22{w[\x8b\xb6(\xf1\ +\xec\xd5I\x98\x83qb\xb3A\xe9V/:\xed\x87\xe4\ +\x08\x7f=\xa6\xe6\xe6\xab'\x11\xe0\x0c\xd6\x9f0H\x97\ +\xd9\x94\xfc\xf8\x9e/\x0f\xcc\xc6\x9cc)\xf4\xc6(S\ +\xc2%\xddj6&\xe9\xf5)\xf4 \x80\xfd\xdf\xfa9\ +H\xe7\xa8\x14\xc1:q\x1b\x90\xad\xd3\xbd\xa3\xfd\xfe\xae\ +\x13\xf8\x0f\xc9\xf14\x98\xdf\x84T\x0b\xc3\xf2\xa0\xc2\x14\ +\xa5{\xb0\xdd6~\xedu\x9f\xbb\xe9\xd5AZ\xd5P\ +\xe1\x16\xc9_\x91\xb5YGta\x0e`\xf0w\xdb\xe2\ +[\xde*\xf6`\xef\x170\x9c\x12\xe66\xb0N\x9f\xce\ +Y\xc2\x84-\x99W\xd4\xcf\xa3M\xca\x1e~\x14\xc5\xc7\ +\xd1\x08\x0bi\x9d\x87A:\x9e\xd2\x82\x14\xe5J\xd5\xd1\ +J(\x1d\x06b'\xbdc\x15\x8fg}P \xe4\xf0\ +\xb0M\xbabi\xa8,R\xf7\xc3\x97\xdd\x97\xbdWM\ +\x1c\x1a\x19%B834\xc1L\xc3E\x88k\xc9y\ +\xc2\x7f5\x8b,\x92,B\x82\x95\xe8\x91\xc2R\xeb\xb3\ +\xaf\xc1\xaa\xbc=\x8e\xe1?MT\x1c\x0b]\xb9\xbfq\ +\xdbLU\xc0j\x5c\x88}\xfc\x99e\xca\xee\xf0(\xe2\ +\x03\xd0\xafO\xa8CK\xf1g\xf9\xf3\x0d}P\x15:\ +\xa6\xd5\xa7\x1f\x959b\xdfCW\x1e\xfdbe\xc3\xdd\ +5\x0ag\x8bN\xde\x03c\xfc\x80\x1c\xb8x\xd6\x1a\xf4\ +\x0f\xf6N\x07\x1e\xfc*\x89[\xa1\xd1<\xd4Evq\ +\x1a\x04\xd4\x81e=\xe1\xb5\x22,\x17}\xb6X\x9ag\ +8Nw\x07\xf0\xbd\xf7\x5c)W\xac\x1a\xa5\x85W-\ +A\xa4\xa5=\xf8!\xc9\xa3k\xdcW\x8e\xa4qa\xe1\ +g\xef\xe8\xf4\xe4x\xb7\x7f\xf2JmO\xbf\x82\xf8\x96\ +R\xe3\xa9\x88&\xadwa\x00\x90iuR\xd1\x04\xcb\ +\xb8U\xc7\xf8F\x88y?\xae\xe4\xe3\xd7!\x82\x1a<\ +kS\xb1\xf3\xe2\x05\xbc|A4T\x8c\xdd$\xcaH\ +@>3\xae\xdfG\xf9\x14\xffz\xf7&y\xf8\x10<\ +\xc2\x10gn-\xe0\x05\x18\x8f\xf3\x8c\xae\xb0\xaea\xb2\ +L\xee\xa9kFx\xcd)\xf8\xd6\xdb\x87\x05L\xa0\x88\ +\x1d@\x1cO\xc3\xf1-\x80!\xcb,\x9c\x90\x00\x91\x80\ +\xe1\x16\x86$\xe4\xa5\xb6\xb6Y\xad\xf7\xd4\x03\x1ap\x8b\ +\x85p\x97)\x82\x0f\xe6\x04}\x9b\xdb\xe4\x02\xb0\xe2o\ +H+z\xab\xe9\x02x\xfc\xfd\xf7\x1c\x02\xe5\x92\x1d\x04\ +n\xaa\xf1R\xc7\xd0\x06\xf8\x0b\xad\x09Z\xb6\xdc\xecc\ +$\xe6\x09\x89\x83\xe5|\x8c\x0c\x18\xb3\xb2\x04\xbd\xaf\xb4\ +\xba\xc3N\xb5rt5]!iQ\xeb\x08\xab\xd3\xdd\ +~\xf2\xc6\xfb\xbcUn\xcb\x18\xd4\xf6\xbf\x06\xb5\xda{\ +>\x076\x1a:fS.Sx\xf4i\x1e?\xbe\xc6\ +\xf9\xdf\xea\xe1\xf5\x9bl\xc5\xa6\xf6\xd5\x94\xe2\xa8\xb1\x84\ +\xd8\xff\x9d\x87\xc7\x8d\x90~\x1d\xc4Y%\xed+1\x89\ +\x0e\x11\xcd\xefC1\xe9\xeb(\xcbz\xb5N\xed\xacO\ +\x89mA\xb7\x02!\x9bX4\xa8\xc4\x0a\x8dV\x90\xc6\ +w\xe1\xa5M\x10\xcb\xbe\xc8\x9f\xc0\x1a]I\xc8\x0a\xfd\ +\x1f2g\xe7p\x8cs\xc0\x8a;\xb8\xda~\xea:d\ +\xfce\x1d:,;\xc9\xde\x94(6\x84\x97\xe8\xd8\xf4\ +\xebF\x87\x1fw`\xfc\x01)\x93\xe6\xe7\xff\xa2u\x1d\ +Z\x18W`\xdb\xac&`\xef\xc2x\xf1_\xc4\xac)\ +4\xd7\x12\xfaJZ?,g|>\x093\xf3L\x85\ +k.(\xe6\x1a\xba\xb6\xddE+\x87\xa8\xf1b-\xea\ +\xa8z\x17\x85)z\x1e\x1e\x05 o\x8b\xdc\x03\x96\xee\ +\xa9k:\xc9\xb96\x96\xbc\xb0\xaa\xe1{\xab\xa0?\xe1\ +\x00V\xc3\xaft\xdc\xca48\xe7y?\x1a\xb8\xe2\xe1\ +\xaer\x95\x1d\x9b\xe04\x8fa\x83\xb5\x90@\xc5\x95\xb0\ +\xde\xf5_\x03\x99\xe4\x0b\xd9\xac$\xd9\xe1~\x88\xe6\xb7\ +V`\xb0\xba\x0c\xd3\x0d\x0d,;\xac\xa7\x1eX\x95X\ +\xd7\x1bX\x14\xb4<\xba\xfcpk}`\x09=(\x00\ +\x8b\xe1\x22\x00s\xb1a{D\xf5\x1es\x04aq\x93\ +\x9f%\x8b\xe5\x82\xc5s\x0a7\xdcG\xba\xaa,\xfd\xe1\ +\x08\xb08\x02\x86\x11\x07\x18\xa5Y\xfeV\x01I\x8eY\ +6\x03\x18\xc0P!\x87\xf0\xcd\xffW\xbc[\xfc\xac\x8d\ +\xe4\xa9RN1\xfc\xedm\x9a&\xe9\xdf\xfeI\xfe-\ +\xd8$f\x9c3\x0c\x95\x03\xce\xd0\x02\xaf\xc8oz\xc5\ +\x9fan\x06\xecUUy\x11Z\x19\xaa\x1b\x11\xc6\x7f\ +\xc3\x11\x82\x00,C\x86\xd5i\x09\x90\x1f\x839t\x11\ +\xee\xd3\xe9\xa2\xbd\xf3\x82\xef\xc6\xe0\xe7b\xca\xbc$\xcc\ +Y\x13\x81%\x8c\x15\xae\xce\xbe|:{\xfb\xe5\xe2\x7f\ +0p\x84O\x9byB\xba\xcc\xb92\x09\xaf\x83e\x9c\ +\xb38\x02\xf4\xb2tz\xed\x12\xe2\xfd4\x1aOA\x5c\ +\xa3\x9b\x9b0\x05\xd8\xc9,\xa4\x1b\xef\xcb\x9c\xb9\xa9F\ +\x01\xfaO\x929\xf7\x0e\x01:\x9cP\xb7\xc9\x1b\xe1>\ +J`a+Q8\x0d\x16`\xdcgd\x89V:\x07\ +\x17\x8d\x97\xb3,\x0fX\x04X\xb6D/L\x06\x88C\ +t\xceP_\x10)\xa3\xe3\x90\xf0\x0c\x05T\x00d\xdd\ +\x9c\x11\x0c\xc8*\xc3c\x90\x1a\xd6\xd2mr\xc4\x9eR\ +\xc0\x08\x88\xfd\x81\xabO\xa0l\x1c,3\x9c~\x048\ +\x89o\x80i\x14\x8a\x10\xca6-\xc9B\x10\xe8\xd6\x06\ +)vN1\x16\x01\xabQ\xaf\x11V\x82\xf5\xfc\xed6\ +\x03\x89\xce#\xd5>c\xc0\x87\xa4\xcb\xc5\xd1\xd6\xc5\xd4\ +\x81\xad\xfa\xffJ[\x85\xca\xb2\xbc\x87\xa7\x1e\x12u\x03\ +\xe5!\xffA\xaa\x1e\xc7d#D\x0a\xe1\xab\xa9,;\ +\xcf\x1a\x8dD~f\xae\x0e\x13WGmb{\xfbB\ +\x0c\x1d^\x0aG\x8f\xae?\xa1\xd3\xf5P!\xfb.\x86\ +\xd2\xfeJ\x9a.\xe4#\xd2f\x98y\xf1t\xad\x9dh\ ++\xe6/\xe15\xa8\x92)\x0a\x9e\xd6\xd0\x8br~W\ +\x14\xb1\x15\x0c*\x16\xd6g5|\x15*\xa9n\xed\xa0\ +\xcc\xeevaz:\xae|fk \x16\xc9\x9d\xb1\xa5\ +\x86\xbf\x1c\xac\x13\xbfaa\x888\xefN[n\xb8{\ +\x8b\xf3\x9c\xbb\xc6\x1b>\x1e\xcc\x17\xec\xec\xe8n\xcd8\ +\xb9@\xeb@\xb4\xba\xd4/\x18c\xfe\x0f\xb0\xa9\x87\x84\ +\xfa\xf8\xect\xd7@UOmk\xf4\xf6\x0c'1k\ +\xba\xd9\x0e\xb5\xe9\x158i/\x81\xc1:\xcf\x95Em\ +\x85\x0f\xbd\xa7\xefYu\xe8\x141\xc4\x9dI\x98\x1e\xd4\ +W\xc2\xc7\xa1W\xa99\xce\xe1Ep\x11\x1a\xebU\xfa\ +4\xc1C\xa7v\x0b\x86\xdaA\xe2\x97?D\xdb\x18\xb5\ +\xba\xc1\x81\x91\xdf\x1c\xeb\xe0@\xd2\xa5\x0f\xd6\xa7\xb2\xe6\ +\x97\x1a\xe6\x1c\xa5\x8d\x08+g\xa2\x86F!\x1ba\xd2\ +L\xe4\xc0y\xa4\xa8\x16\xab\xf4\x99\x86\xf6I\x90\xde6\ +f;\xc7dN\xd2\x9bF\x80\xaaS\x9aM6\x05^\ +\x80\x15\x13\x96j (l7\x15H\xbd\x8a\xd0\xa9W\ +gd\xa1\xdd\xba\xe5*e#<\x12\xb6\xc8S\xe1\xf9\ +\x10\xc2\xfc\xfd1I\xc3\xa7\xea\xec\x12\x81\xdb\x84\xb1\xdb\ +C}\xcd\xb2\xf152-\x98K\xdb\xe3\xa9\x9aI\xdb\ +f7l\x8a2zWn\x88\x84\x8bdaW\x0f\xe4\ +w\xd3\xe0o\xe8\xb4\xbbZC\xad\xed\xa8E\xa5\x8d\xc6\ +\xc6\x18\xed\xe2\xf8D\x16\xb5\xa0y-\x81\x90\x86\x8b\xb0\ +rjWP\x82W\xb2\xdd\xd6\x1c\xab\x1c\xbaK\x8f\x85\ +\xe0\x11\x91/\xc9=-\x93\xa9\xe7\xbc<\xe8\x90L\xe9\ +M\x0f\x0d'\x22\xc3f\x7f\x12\x8c\xaa\x11\xdb4\xb7\x94\ +/\xfc\xa1\xe8\x85\xaa.]\xb9!\xc5\xf6\xc7Sq\xca\ +\x5c^n\x0a\xc3y\x0e\x85\xcd\xa9T3\xee\xf9\xaa\xc9\ +\x07\x12;\xcb\xac\xc7E=\x81\xea\xd0\xa9\xdb\xd7'H\ +\xdf\x11O\x09\x7f{GO\xa8\xb4D\xaa4\xf2\xefo\ +\xccu\xbc`g\x93\x14h\xbf\xd3\xecbo\xd4\x0b\xd3\ +\xb2(f\x0f\xd2\x10\x96\xc5TQ\xad\x0f\xe7\xca\xa29\ +\xaa\xf7s\xe1\xace\x0b\x8c\xb5\x9c,\x0e\x1c\xe7\xcb\xf1\ +8\x0c'e\xba5\x19\xf8\x19\x8d\x97\xbe\x0bW\x86~\ +\x1aD\xb1\x1d4\xf5\x5c7\x84\xcb\x17X\x85\x90\xaa\x02\ +\x16\xcd7%_\xb6\xe5\x94o\xd3\xed~\x8f\xca\xd9P\ +-j\xbaH\xfcP\x7f\xa6\xa8\xd9\x0cV3\xb7\xac5\ +\xact<\xc3\xebd\xbc,\xa6\x00c\xff\xdd\xb5c\xa5\ +\x16\xaeL\xd7@\xf3\xa1\x85\x93\x8d\x11\xec3)6\x9f\ +~\x8f\xd3\x10@\x9e\x84\x8b8y\xe4nM\xb1\xca\xd0\ +\xa7\x95\x22\x8bZ\x9dh\x990\xf9p\xaf\x9a\xaf\xcc5\ +\x937\xbe\x0f\x09\x9d\x0f\xe9\xd8t\xacX\xe4\x22\xd5k\ +\x1b\xb5d\xa5\xe3\x5c+K\xffS\x8e\x9a\xa8\x19>W\ +\x99\xf1\xeb0\xd8\xdc'+\xe8+\x8e\xa6\xba\x99^|\ +3\x8d\x92\x8d1\xc1\xa3\x13\x9c|\xa9\xd8\x1a\x09\xa29\ +\x0e\xdaQ`\xf7!Z\xad\x82\xcd)m/\xc2\xac^\ +9\xb7\xdb|('\x02\xad\x85\xdd:\x9aL~\x08\xef\ +5\xe8.\xef\x92\xddF\xa8\xd8ja\xcfD\xca'|\ +r\x13\xd1$Y\xe6\x96>gUk\x8f~\x1a\xc2\xc5\ +\xf4\xa9TeZ\x0fd\xae1\x8fYx\xbd\x12]L\ +\x8d\xeb2\xb6\xee\x0e\x80}\x22\xc0$\x97\x83\xdd\xea\xfd\ +\xb7ZR\xcb\x19\xa7*\x04\xa2\xb1\x5c\x9bx\x8b\xdc\xb6\ +\xae\xfe+;\xa5:\x06\x0f\x8f\xa9\xe3\x19\xaa5\xe6\xc3\ +:\xea\xec\xbd\xc8\x829\xa4\xefW\x88\xa0\x11\xef\x99\x16\ +\xb3\x040\x91\xa6&\xb32\xb8\xcf\x83\xbbp\xa5\xa1]\ +\xbb\xa5,c9\x01\x1e\xe5\x0e<\xbe\xaa\xe2\xab\xe9$\ +\x95?\xf45\x9a\xe8\xa90\xdc\xec\xf8\x1a\xf1\xe3x\x99\ +b\x18\x12\xac\x83\xae\xa3\xd8\xb0wV\x22\x94\x83,\xad\ +\xaaj\xa8.~\xb9\xb1\xfd\xb8\x98\xc0P\xe7\x8e\x81\xd2\ +\x87\xe1i\xac\xad\x82\xc4a\x0e\xfa\xba\x02\x14X_w\ +\x05c\xa2\xde\xfc\xea\xc5\x85\xe3\x89\x16\x02\x0a:\xee\x17\ +\xf2]\xb8s9g\x9a2)\xf4\x01\x7f,\xc0p\x0b\ +i\xb7\xdc\xca,\xc2\xe2u\xabI\x9bi\x0d\xf8\xb8C\ +,B\xee4,\xceHIP\xb1 ]R\xfes\xc7\ +\xd4yz\x80_\xb6Z\xe4h\x16\xfc\x0a\xcb\xbe\x0e}\ +\xf6s\x18\x8f\x93\x99\x16R$\x80\x0c\xe8\xc7=?\x17\ +H\xf0\xbd\xe4o\xeb\x97\x9cX3\x9f\x84\x9c0\xd3\xb3\ +%\xf2\xc2b\xdd\x86\xf4v=\x1a\xf2\xa1<\xce^\x91\ +\x83\xb2\x86z\xb6qm%\xbeH\x06\xfa\x14\xc4\xfb\xf4\ +\x82\x17\xf3G\xb8\xc8W#:\xc5(\xe8\x97g\x86\xd5\ +\x14\xce\xb5\xf0\xfc%\xbc\xc8Fv\x19\xcd\x17\xcb\xfc'\ +L\xb6f?\xccf\x89\xda\x11\x0b\x22J\xe4+\x17\xf1\ +\xe6RT\xa3L9\xae\x80gi\xb2\x1dZ|\x139\ +\x13\xe8\xbc\xa8\xd9\xd0|\xae\xecW\xe5\x15\xa3\xb9 \xf6\ +\xbam\xd2\xdb\xdf\xc5\x1f\xdd\xe7^\x1cc\x8e\xa5\xea\x14\ +$\x00\x17@\xf6{\x07\xf8\xe3e\x09\x97G#c\xff\ +\xa1]HU\xcbI|s\xccN\x0b\x87i\x9b\xd4\x16\ +\x11%\xdcs\x03M-2x\xd9&\x83}\xf6\xad\x90\ + \x9a\xd6\x02\x9dJs$\xb2$\x11Z\x08\xf3&s\ +h\xb8\xc4@\xcb\xde\xf8\xd5\x92hH\x0a\x84u\xd5\x1e\ +\xbd\xa8C\xbb\xad\xa3\x5c\x90\x9bi)\x87x\x08\x09\x83\ +R\xf1\xdc\xb9\xe4\x94\xe0\xcd+\xb3\xce\xffkq\xf3\xdc\ +\x07`\xd5\x9a\x9f\x02%\x0e\xa6\xd1\xf3\xd6\x12\xcb\xa4\xf4\ +n}L\xf0\xe6\xd7\x1c-\x0c~\x05\x1a\xaeDVV\ +\xf5\xb4Q%Vm\x1cm\x0ek\xe9\xa2m\x05\x98\x8e\ +\xfa\xe2qQ\x98\x16+\xe3c\xc3\xc5\xc1k\xfc\xea{\ +\xe1\x1fV\xca\x0e\x19\xaa\xb2\xe3\x07r\xbd\xeec\x0d[\ +\x81\x95kv`\x15\xde\x9d\x17\x9b\xfc0b\xaa>\x9f\ +s\xc2\x14 4g\xa3\xa8Y\x1e\x04\x1f\x95\xfdl\x0f\ +4\xf5\x1eL\x18{\x87B\xc0*l\x8e\xe2\xb5\xd8\x86\ +e\xd7\xcc\xb0N\xa3\x87M\xaa\x82\xe1h\x86\xb7b\x82\ +xn\xd1\x89\xdd\x01\xa8C\xfeC\xbc\x97\xb3\xd7\xea\x91\ +N\x96k<8\x15\xea\xba\xa9\xc8 \xde3\xfc^\xc5\ +\x0dG\xf4\xbbg\x9b\xb9\xed\x87\x9a\x14D\xc65MR\ +\xab\xf6\xa1\xb9\x98=\x8e\xc8\xe9\xe3\xb4\xea\x0b\xb6\xa9\xe3\ +]\x9b\xa5\x93%\xfa=Um\xba\xbdC\xc1\xe6\xc1\x08\ +o;\xd3\xef\x0eS\x9eY\xd0\x19]\xa0kT]\x93\ +\x88\xd3\xdb\x05\xab\x97\xa31\xf3z\xe8\xb6\x12\x19\xcb\x96\ +\xadT.\x81\xd7\x18;\xcc{\x84\x17`+\xff\xce\xcb\ +\xa2CX\xac[\xf1\xa74\xa9o\x19\xa3\xe2s\x0fG5f\x0b\x88<\ +\x9as\xa4:\x8fM'\x87\x9a\xcfj\xd0m\x0fz\xed\ +A\xbf2\x9b\x95\xc5\x8a\xeb\xd7R#\x12GT\xdeM\ +\xf7\xac?\xd8m\xf7\xfa\x87\xed\xfe\xe1\xea\x14Hy\x07\ +\xdbR\xce\x22\x0b7J`\xd4c_\xb8\x82\x0etI\ +\xac\x10-\x09\x9bU*\xd5\xee6JK\x146\xac^\ +\xdc\xfd\x22ApH\xcc\xdfE\x01q\xf6TqJi\ +p\x87\xc5\x90\xd6\x9cf\xbd=\xd3i\xb6\xa7\xc9S\xd1\ +O\x076\x8de(,,\x9dt\x96s\xbbeg\xa7\ +J\x17\xa4z\xf8\x8d\xa0\xd3N\x18b\xce\xa8\x86Xh\ +E/\x14z/\xd5\xc3\x165T\xf0E\xb7K\xb0\xcf\ +\x824\x8f\xf0\x0a\x88c\x95~\xd1\x87=\x97\xe3\xd3r\ +QHq\xa7\x9bu\x0c~SE\xf68\x99\x8d\x92\x0e\ +\xccGY\x1e\xe4a=\xd9?\xea\xfc\xae\xa5\xd7\xaeC\ +\xe4\x14\x87\x95T\xcb\xbe]+EM\xf9W\xd7\x91\x8c\ +#\xbc\x95\xf5\x0c)\x04\xd0\x90\x96\x159C39\xf7\ +\xd1@\xec\x1d\xe2\x8f\xfdJ\x05\xcb\x97V\xfc\x1e@\x9f\ +\x89\xd6S\xb7rwW\x95\xd9\xcf\xf2)\xc2\xf7\xc1\xf3\ +\xca\xd6\xa8\xe5\x84*c\x89_+\xd7\x16\xe5=\xa3\x8d\ +\x80\x97\xa0AI\xa4\xd1\xaf\xe8\xee\x8a\x05\x96\xa2\x0f\x06\ +\xe6\x04\xd5gS\x94\x05\xce\x1df\xfb\x1e\x97PD\xdf\ +Z\x80\xe8\xb3\x5c\x09d8\xa5)n+\xda[\x043\ +\xc8\xede\x97Q\x95-\xde\xeb\xc1\xc2\xae\x0f\xdf>\x92\ +a`\xaf`\x89tl\xac\x04\x1b\ +BXK\xf0F\xfb]\x9d#\xc5\x09\xf4\x0e\x9e$\xee\ +\x1cz\x19pL\xa2;\x0c\x90j\xc0\xa9H\x1a\xd9\xf7\ +\x0aT\x87\x9d\x8f\x0e\x17_kF\xb4l\x97\xec\xe1\x97\ +4D\xcf\xf9\xadCr6\x02L\xdc\x1bG\xe3(\x8f\ +\x1fYB\x17x\x99\x15IO0]\xcc\x0b\x9a?\x98\ +&\x0d\x0en\xf9\xa5E\x09\x09\xc6c !\xa7%\x03\ +v\xe4\x0bs\xf9\xb6\xc1\x9c xn\x1e\xaa\xcd\x02\xbc\ +\x01,\xc3\x0c4x\x8b\x0b\x9e\xc1\x806\xb2\x94\xbf\x09\ +\xbd\xd0`\xb1\x00x\xdbLE`\x13U7\xac\xb6\xfe\ +u\x9b\x97\xfa~\xea\x9e\xf1Fs\xa1\xe9A\x8c\xb2\xb8\ +\x94t\xb8\xbc\xb4Z\x96q\xb9\x86\xcb_\xa3\xc6\x92\xf2\ +\x1aY\x08\xb3\xb5\xb2\xbd\x22\xa6\x9c\xd2\xad,\xa5\xef\xa5\ +\xe7\xdd\xf9\xff\xaa\xd4C\xeb\x9c\x81\xbf\xf8\xce\xb9;N\ +\xdf\x16B\xd4\xc5/\xf5=c\x90\x138\x7f\xed\x86\xcf\ +\x0b\x08\x14jZ\xe3\xcf\xc7\xb8 \x92\x1c3\x85\x05\xfd\ +RG$\xc6uO7zd\xe1P\x5c\xf4\xfbE\x04\ +\xa4\x8a\xabL\x1f\xaa\x1c\xbd\xa82\x99+\x01\x0c\xab\xce\ +:\xda\xcdnu\x99a\xf7\xd8\x17\xd8\xbc\xa9\x5c\x15\x03\ +^\x87\x98\xe5\xd5\xa7D\xff\x93\xee\x12\xb04LU+\ +\xca\xfd\x86/\xedm\xaa\x86d(\x06O\x8e\xe9\x8a\xa3\ +\x84\xef\xb3dU\xb3l\x97\xf9\x0a\xaa\xc0\xb9LP\xeb\ +\xea\xb2\xa7\xec\xc5\xdb\xa0\xd5\xac\xcd\xfa\xb6\xf16\xc4+\ +!;\x93\xe4\xbe\x8ch\xddy\xf1\x82\x08?$\x81I\ +$\x8a\xc9}Hp\x87)\x98\x13\xba\x83[d\xd7\xb2\ +\x05\xe2\xc9\xb0\x01l'H\xd3\xe4\xdeg\xa6EJ\xb0\ +F\xb63I\x96\x80\xfc\x8a\xd6\xcc4W\x8c\x05x\xa3\ +\xf9\xdc\x81\xe5\xca\xe1\xc1\xb3\xa1\xfb\x0b\xdez(\x87\x92\ +\xfa\xe2\xbb\x9f3lMp\xac\xdc8\x81\xac\xaee\x8e\ +I\x91\x19\xa0{h\xcb\xb1\x1f\x96\x88\x1a\xa9\xe8K0\ +U\x0f\xba\xf0\xdd+Q\xd0\x8d\x7f<\x98\xa2\xcf$\xce\ +\xb5\xb2\x12'\xbc\xa7?\xe6\x06\xc4\x9e\xec\x00\xe3\x1b\xa4\ +4atg\xc4\xb7\xae\xb0\x8e\x85Y\x0d\xeey\xf9\x5c\ +^X\x1c\x15I\x1e}7t\xbfv\xe4\x01\x0b\xed\x13\ +w\xfa>A\xf4A\x11\xf0\xa5\xec\xd1\xd4D\x15\xd8\xcf\ +\x86\xab\xb1\x06\x127G1\xc8U\xc1~\x81P\x9d`\ +mE\x7f\xa2q$\x948\x83LKF\xedJ\x13\x95\ +%\x98\xd9\xd5\xcd\x1b\x97}\xe5\xf4\xf5lQ\x0a\xb7\xaa\ +H,\xec\x94\x1a\x0b\xc2\xbd\xb1U\x05\xb5f\x85\xd6\xeb\ +\xd2%%\xfe\xd8\xadv\xe1Z\xe5\xdb\x8a\xb9B\x8d\x98\ +Q)\xfe:\xe4h\x94\xe5)\xac`\xcea-R\xa3\ +\xad\xa0f\xd7\x1aL(\xe38\x84\x22\xec\xdb\xd2\x9c\xcb\ +\xeb8\xb8K\xd2\xd7[=z\xa7d!M\xe8\xaf{\ +?\xc7\x1b \xcb\x0b\x86%9Pb\x1a\xd1w\xdf\xc7\ +\xae\xb2\xf1\xab@\xd07\x11|^\x86Y\x0d\xf4\x9a\xde\ +(\xa0\xef\xda\xc8g\xd7@\x0b\xe02\xcd\xb8\xe9p\x00\ +\xd2\xb0\xaf\xaf\xd7\xdd\x85\x5c\x98\x07&\xe6\x9f\x14\xbc&\ +\xe4\x03`V\x8fv\xc9n\xd9\xed\xec:\x01~\xe9\x9f\ +<\xa4]\xa1\xb2\xd6\xf8K!<\x98\xa7\xb7\xda\x84\xb6\ +\x8biq\x88\xc2\x11\xc1\x8a\xfd\xb1\x0f5\xf6\x8b\x1a\xf2\ +(\xc3\xf0]\xf1C\x1fe\x92\xc9m\xd8\xd6\xd6\x06\xa9\ +%\x1d\x01\xbbJ\xad6\x19X\xc6\x91`\x85u+K\ +\xdf\xe5(\x17\xba\x85&\xad\xbao\xabvo\xaf\x9e\x94\ +\x06\x9b\xba\x15\xfbuU\x18\x5c\xbbu\x0d\xdb\xba\xcan\ +\x9d#\x11\x8f%\xf7\x88\x1a\xa2\xf6M\xd5\x5c\xf0M\xb9\ +d\xabF5\xd4\x9c\xe8\xc5\xa61omy\x8a@\x0b\ +_\xa9\x815\x8c\x83,o[\xd3\x0c\xc9\xa5\xd0{\xd5\ +\x01\xa9\xb7\xa06\xae\xcdzA\x8a4\x1b\x1b\xb8(k\ +\x1b\x01\x96G4\xee\xe9\xa9'\x8a@d\xc1'cX\ +\xd9\x8c\xc2\xe2J\xaaD<\xa7\x8e6,Ia\xb4\xa2\ +\xe6\xb7f\xb1\xd4\xc5%\xf6E\xf40\x0b\x16\x0c\x5c\xce\ +\xaf\xd0\x9ak\xd7@\x0f\x87\xf25\xd0\x96\x9b\xb5\xa0.\ +3u\xb3a\xc9\x1d\xce\x05qY3\x06\x06\xbe\x11w\ +6\xd2\x8b\x9a\x15\xce!\x14~\xbf\x96z\x03u\x99.\ +Gu\xc6\xf1\xb3{.\xaf\x1e\xfa\x84P\xdbs\xb4\xc3\ +!G|\xce\x825\xc9\xf7\xe5\x9bc\xb4\xb6\xd9\xeb/\ +X\x99e+/\xf7\xc1\x9c\x14\x15\xb9n\x00\x0f\xf2y\ +\x8e\x13r\x5c\xcaJ9\x8e\x98\xd8\xdc\xe0 \x04\x18\xd4\ +\xeb9\x0bnC\x92-\xd3\x10\xb4z\xccdCX\xcc\ +d\x1a\xdc\x85\xf2\x98\xe3&\xf7\x0b\x09b\xb6-\x1e\xee\ +\xb8\xe6\x90-\x09Ba\xfb\xb9\x1as9I\x83\xfb\xf3\ +h\xb6(\xef\xd6um\x5c\xf4\xfb=\x18\xed\xfcG\x11\ +H\xab\xa5\xbf\xe0\xec\x7f\x17\xa4\x93q\x82)o\x80\xa3\ +\x05\xc7).\x1c\xdbLRD\x13t?kG@\xf9\ +1\x03\xe6\x867\x01\xe6\xc7)\x92{\xe3\xb8\xb8\xbeF\ +\x99VpS\xa7\xf1m\x18.@\xea\xa0X\xc6\xc3)\ +\xc3\x89\x81\xa6T4\x14\xc9\xcdUF\x9b_\x08)\x93\ +\x83\xec\xfd\xfc,z\x08\xe3\xccC \xf8]\x12t\xbc\ +\xfd[\xe1\x0b\x93\xd6\xbe.\x94\xec\xaeY)\xc5U;\xc2\ +|\xa0w.\x05\xack\x14\xfbX\xa9\x1e*,\x0dV\ +\xad\xf8\xd9\x86\xb0?K\xed\x0b\x17+BE\x95\xbbm\ +X]\xff\xc8\x86\x8b\xb4eQ\x86x\xf4\xe4\xf4\xbc\x0f\ +\xb6\xa7\xb2/V-ly,\xa5\xda\x07\xf1=gk\ +l\xea\xe8\x97\x0eiW\xb6m\x9b:bD\x0b\x85D\ +w\x98s\x87M\xbe\x95\xb2_\x0e\x02\xdd\xa3\xe3\x81V\ +\xf5\xf1\xac\x8d\xfcJ\x0f7\xf4!A\x8b}^\x9f\x08\ +\x0a\xb0R\x1bX\xc8\xd8\x9e\x04\xe9\xed\xe6h@h\xcd\ +\xf8@\x09x\x92\xfeX\x99\x98\xa7\xe9\x19\x9d\x9c:\x82\ +`\xe4E3\x18X\x06\x19\xe2E3JD-o\x86\ +\x88\x0a\x8e\xbeY\x8f\x8a\x86#\xa6\xa0\xc5\xd55kR\ +\xd3t\xe8\x14\xcc\xb4\x8e\x9e5\x89i$\xb6\x0a%O\ +\xd8U\xebP\xf5\x94\x9d\xd6xT\xc1\xaa\x09k\x1b\xb4\ +\xf0\xe7\x0di\xe1\xb5\xfc\x19\xc3+\xb8zj-*\x9a\ +\x0e*A\x8b\xb3\x7f\xd6\xa3\xa6\xf1\xa0\x12\xcc\xb4\x0f\xaa\ +\xf5\x88i&\xbe2%O\xd8U\xebP\xf5\x94\x9d\xe6\ +7\xa8\xd8~\x9c\xb9tA/H\x1c\xc2\xdb\xd3(\x8e\ +\xb3\x9f\x99\xa5)g\xcc\xd6\x81\xb1\xf6\x9dDw4J\ +\xd1\xb4y\xab<\x83E\x0b&\xac\xba|\xe0Z2\x7f\ +\xfb6\xeb\xb7o7~\x07v\xe3w\xe06lYJ\ +\x84\x22\x09\xc4\xbb {\xfb@\xbd\xc91MZ\xa1/\ +\xfa\x15W\xfb\xa0M\x0ev\xdb\xe4e\xdf\xc9\xebZ\xe8\ +|\x91i\xdb\xd4=\xc4\x8d\x1f\xfe\xc3\x8d\x00Y:a\ +W\xd3eE\x96Q\x1b\xb5\xd5\x9e\xea'\xf4i{\x92\ +\xect\xbb\xda\x12!\xfa\xc1\xb4_\xd3C\xa3\xd8\xcc\xe0\ +6\xb1\xec\xd4\xb6\xadU\x86\xeaI\xe9\xcc\xfd\x08eK\ +\xbd\x22\xa8\xbfr`\xb0+\xd3\ +\xdd\xf3+V\xe1\x8aV\xa0\xcaO\xe4\xb8\xd2f\xb2\xbe\ ++&\xca\xb81\xcf\x14\xe2&gR\x8d\xedEY@\ +\x0d\xad\xac=\xe4*\xb94%|X\xa7\xc5_\xad\xc3\ +\xc0+\x0a\xca\xc6\xc6f\xaa\xc5\x14\x03+\x91fTo\ +#\x90\xee8\xf9\xb5x\x00\xeb\xbd\xb9\x8d\x05\x9b!\xba\ +\x8cV\xd6\xc27\xf6m\x823\xf0\xd3lV<\x8d\x22\ +\x97U~X\xc2\x96WEn\xf6NS2\xae\x96\xf3\ +\xeb$v\xa6T\x13C\x83\xfdu\x9e\xa7\xd1\x82o\xcd\ +\x9fFif\xa8\x16\xe3\x106\xacR\xd9AlK\xd4\ +]\x15\xa9\x5ckf\x14\xa1\xd0\xa1E\x1c\xd2\xd5\xe8F\ +\xc9\xe1W3?\xe21\x19\xd4\x08\x96\x80L\xf5\xa0K\ +u\xa1\xaas:5'm(`g\x98(\xea%\xf3\ +\xad\x90\x5c3\xd3m\xff\xa5d\xc04\xe8+\xbf\x0c.\ +\x9b\xed\xb3\xca\x1e\xdb\x10G\xcdI\xc6\xce\xd1\x0d\x89\x83\ +g\x1a w7hV\xc6\xff\xb2w3\xece\xb9t\ +\xffsT\xd2\x06\xba\xc6\x5c#<\xb9.\x11\x5c\xfe\xb3\ +*\x13_\x96\xae-\xa6\x86\x1a\xf8\x930\xd0w~\xb3\ +1\xd0\x93\x85\x1f\x82\xff$\xd3\x83\xb5\xbfN\x1b\xd6\x94\ +\xfa\x9dG=\xe3\xf8\x7f\xe7\x98\xb7\x1a\x82\xebu\xea\xca\ +\xca\x83\xf7\xc3\x9fTu\xfc1\xfaA,\xb4D/\x8c\ +\x93\xf9\x84&\x04\x952\xd9{,\x82\x8bjb\x19|\ +S\xe9Aq\xb9\x017\xecA\xd9\xe0U\xac\x9a\x0bF\ +\x1c\xf6n\xe4\x82\xa9\xe0\xb5\xdb\x03\x81\x07\x90\xcb\x10\xfc\ +\x84d \x084\xa6\xfd_\xcb\x19\xa6\xa4\xd0\x0f\x13\x99\ +N\x85c\x81\x86\xa6\xd4\x15\x8e@\xe1\xf51\xb6%\xfa\ +\xbdWU\x03m\xd0\xc5}G\xf8\xaeO\xf6\xd4\xe0\xc0\ +\x9d\x85\xbdv_Ap\xa3%\xd6\x97\xf2\x96\xed\x91\x01\ +\xd9-\x1d^\x18f*X\x0d\x85\xca{\x80$\xd1\x96\ +\xcf/\xf59Y\xfdn\xd7&L\xbb\x9b\x11&\x1f\xf2\ +\xb4\x04\xe4\xf2\xf9\xb0\x9e8Q\xd7\xdd\x7fB\x22)\x89\ +\xad\xd9\xd58\x0e\x83\xf4\x94\xe6\x15\xcf\xb4\xab\x9e\xdc\xb7\ +\xc6\xd8\xaa\xb9[\xd4\x1b\xe0\x89\xea\x83C\xe7m\x01\x82\ +GT\x90\xc2Ii\x0a\x89mL]\xb9\x14c\xb3t\ +h\x17\x85\xd4\x94\xdb\xa6\xf0\x1d\xe0\xb7&\xff\xd2\xf14\ +\xeb\x05\x0a\xb6\xb7\xd6\xa3K\x0df%ZBr\xff{\ +1f\xc5\xb5\xb6\x8c\xcb\x12\x93T\x89\x91\xe5\x1f\xfd\xcb\ +\x06\x10[\x12\x92\x9a\x88\xb3Y\x10\xc7_\x1c\x82\xb0\xab\ +\x09B\xef\xd0\x14\x842\xf1\xd0\x83\xf1H\x89\xef~%\ +\xe2\xf6\xff(RpE\xdb\xde\x8cA\x9b\x10\x08\x0a\xd1\ +O,\xde\xa0\x8f5\xe4\xd1Xe\xf7h\xf9\xf4\x8ca\ +\xd8\xad\xb4\xcee\x98\xe7HKC\xc0\xea\x00\xe7\x0f\x8a\ +\xac\xf9\xe2\x81\xacC\xbb\xd5\xcb\x05\x0bAzvqN\ +_\x15\x8f{\xfb\x0f\xbd\xfd\x1d\x0eL\xf0\x9a^\xc1\xa1\ +$\xc5@0\x95\xa9\xc9\x1d\x1d\xbf\xb9q\xc9\xfa\xdf\x1c\ +\x9d\xdf}\xcb/\xc1:\x1f\xa7a(.V\xfa\xac^\ +\xc7h7\xc6\x8a[\x95\xe8G\xb4\xd2\x92w\xb5b\x1e\ +\xdb\xf2\x1cm\xbfUS\xca\x8e\xa18\x89\x96neP\ +\xe8\xdb\x95\xcc\xab\x0a\xe0\xa3d\xf2\xe8f\x88\x03\xb6\x9c\ +M\xd2\x0d\xfb\x12!\xd1\xd0\x04\xe8{~\xdb&6e\ +\x0b\xb3\xd8\xe9M\xf3(<\x01\xb3\x13\x8d\x0fz\x96\x0b\ +\xe7t+\xc9\xfb\x0e\x92\x07^$sQ\x85\xaa\xb7.\ +\x1b\xa758<\xec\xbe\xedW\x02\xb3\xdc\xec\xeb\xc1V\ +\xf9\xdc\x8d\x9dF5o\xd2\xea\xf4\xd1s\x85\xad;\x00\ +U\xdc1Uq\xb9\x95\xaf\xb8Z\xa0^b\xf6l\xb0\ +\xb5x\xcf\xc2j`\x8e\x83\xdf\x1a\x88B\xc3\x07{\x07\ +\xddvo\xf7\xb0\x8d\xc1\x83{\x7fu'\xbbh\xbd\x19\ +\x1c\xbc)F\xe6(y\xe0\xb1)\xcc<\x1f\xe0\x8d\x22\ +\x0c`\xb7\x8d_{\xdd\xbf>\xaf\xa4\x9d_\xc1\xc5\xc9\ +\xfdIn\xc3\x97$\xb1\xdf\xfe\xfd\x0b\xf6\x1e,\xa4\xf8\ +\xb1\xd5g\x0f\xbda\x97<\xc2\x8f6y\xe8\xe3\xaf\xf0\ +c\x1b\x16\xfd\xb8\x1e\x1arrz\xddn{\x7f\xaf\xdd\ +\xdb\x1fP\x9a\xf8\xcb\x9eL+\x14\xf9\xeb\xf3jjY\ +\x0e\xa9\xa34\x0cZ\xa0?\x91\xe3\xf8\xfb\x06\xba\xd0\xce\ +\x06\x5c\xd8lL>\xa8Z\xd7n\xc6\xf3\x01\xa9\xaf\xb3\ +N-w\x99\x95k\xc6\x16\x1e\xbdf\xaf,w\x0f_\ +#z\xf56\xe8\xdf\xef\xf6\xb3\xec\xee\x0fq\xfb\x99\x17\ +\x7f\x8b\x1b\xe4\xce\xf8\xc1\xeb\xc2\x05\x00\x08\xd2\x148\x08\ +\x8a.\x851:\x0b\xc9-\x18\x1b\x98\xbd\x16\x16n\xe9\ +\x84{\x1cv\xc4\xe9d\xd4\x8c\x84}\xd0SP\xa6\xbb\ +\x9d%w\xe2H|\x1e\xdc\x10~n\x9e\x9eZ\x9e\xd1\ +\x84\x99r\xbd\x19XS\x19\xbd\xc3Q:\xbf\xacF\x02\ +V\x84|\xdb%\xc8\xeb&1\x0c\xcc\x97f\x1cW\xc0\ +y_},\x1c\x1f\x1b\xa5\xa9\xfav1\xf3r1*\ +\xec\x9b\xb8]\xa7\xc9\xa8\xa4\x13xl\xde\x83\xad\xf9\xfa\ +\xbc\xa0\x19gv\x1f@A\x81M\xc9\x90\xd0\x85\xbd\xe5\ +\xc6m=#\xcf\xee\xa0\x99\xe4\xfbbm\xeaF\xb0#\ +?N\x81+i\x14hF\x84\x16\x02_N\x8dN\x8f\ +\xab2g\x1et\xf1\xcbi\x96\xb6\xfao\xf1\xab\x09e\ +\xbck\xdb\xbe\xa5-\x86\x91y\xe4y\x8d\xe9@\xc3\xd7\ +\x02\x15\x827\x8f:\xae\xd5\xae\x1d\x87\x1e\xe4\xab\xa7\xa8\ +W;\xf0\xac\xab\x8d\x9e=-\xbf\xfcX\xd6qF\xbc\ +m}\xf3\xd8\xaaNM\x09&1\xe9A\xb7I\x0dR\ +*\x8e\x88K\xb0[A\x9e\x07\xe3i8\xe1\xa9\xfe\x14\ +\x14b\x07B\xc5`y\xda\x8c\x1c\x9a\x9b\x19\x15f\x1e\ +-\xa8\xd5MXg\xd0\xf9a\x9b\xdb\xf99{O\xff\ +x\xbd\xc5W\x1a\x9c\xba\xe2\x8e\x1f\x04r\x11-\xf0\xd2\ +\x0e\x8a\x93]\x97\xab/\xf0l\x0bH\xc5a\xb9\xdf\xed\ +b\xe2\x83\xe3\xf3s02\xd8\xfd\xcd\xe4.\x88\x97!\ +\x9b\xb0j\xae\xba\xb3S|>M\xd2|\xbc\xcc7N\ +4O>\x1c\xe50\xab\x8e_\xd5\xd2g\xa7\x8e\xdb\x8c\ +\x9b Nl\xc3\xd4]\x08\xc8\xb4\xb4\xa0\xe3\xf5Vy\ +KzA\x85\x0c\xa2 \xa5,G\xd1\x88\x04\xd1\x22R\ +\xbdL\x82,-y[\xbc\xae\x05\xae\xeeGS\xe1\xa9\ +\xa4\xe2n\xca\x97\xe4\xfe\xf5\xd6\xa7\x89\x93H^\x06J\ +\xb8\xab\xbf\xbd\x0b\xe75\xf5\xb1\x88\x00\x00\xa3\xe3\xf5:\ +\x1f:\x8e0\xfd9J\x0a\xc9\x16\xe18\xba\x8e\xc6\xb8\ +\xef\x836\x1bOR\x9c\x92\x9a\x0f\x07\xb2>%E\xe6\ +\xcf\xd6\xec*\x19\xfd\x0bL\x22|0\x1c\x8e0\x01\xfe\ +T7\x86\x94\xc4\xb7\x955\x87C\x0c\x8d\xb5\x9fLa\ +\x97Y\x9f\x84\xd7\xc12\xceY\x08-7\xe2\xbd\x00\xff\ +e\x1ad\x1d\x91\xedj\x1d\x0a\xe9$2\x19V\x81\xb3\ +\x11\xcc\xaa)$\x7f\xe2\xddV\x18\x9cE:U\x8eK\ +\xe4h\xfe\xee\xdb6q\x17V\xd29W\x17\xd5\xe0\x0e\ +1\xeb\xfd]\xd8\x00|Q\xc3\xe5J\xd0O\x22\x966\ +\xd7W\x1a\x02wQ\x16\x8d\xa28\xca\x1f\xe9\xf2%N\ +\xc6\xb7t\xe1\x90mx\x08\x94\xdd'.\xbe\xb2\x19W\ +\xdc\x08\xb4x\xfa]\xfb\xd8\xa5\x0b\xda\x12\xadmwa\ +iNQ\xa6\xc4\xed\xf9\xf7\xfb\xd4GS\xb5\x15+\xed\ +X(\x8b*I\x15\xeb\x0do\xfdT\xf0\xfc#^\xad\ +i\xc9U(\x8b\x98O\xb5\x22\xd4\xa8iE\xf8-\x04\ +\xeb\x11\xec\x94 \x0f}*\xbf\xa3\x1e\xf1\xd5(6\xea\ +6\x22\xdb\xa8]O\xfb\x07\x90\xe6F,\xb6V\xa8\xa6\ +\xd2Z\xa5\x01i\x8d\x18\xea\xae\xe5Id\x1d\x13\xb5!\ +\xa9\xdf\xd3\x89!\x07\x87\x85\x9e\xb2\x0c\xcc]\xb7\xd8{\ +\xb6\xd1\xbbQ\xf5\xad0\xcdt\x8b\x89N\xe7\xa0\xd2\xc3\ +P\xb8\x16\x5c\x8c0u\x93:)>\xadR\xf2S+\ +\x16V\xb7++\xb8\x84\xb0\xba\x96khy\xd4rK\ +\xbd\xdb4\x80\xa9\xeaj\x1c\xa5\xe38\xbc\x9a0+\xc1\ +j\x1e\xd4\xf0\xa3\x90\xa9\x86\x1c\xf1\xac\xe7\xd6\x1e\xabp\ +E\x1a\x00\xd5|I\xe6W?$`y\x15\xb2\xe9\xcb\ +\x9a\x0f\xc1c\x98\x8a\x9c\xa5\x8d\xfbR\xa9\xbdf\x9f\xe6\ +\x1b$\xde\x93\xe9\xd5\xe47a\xbe7\xf1\xa8\x89\xbd)\ +\xc5\xc2\xcd\x04\xb1z\x02\xab\xac\xb1Z\xfb\xd1`l4\ +*u\x064m~\xd3\xc6\xaf\xd4t\xdf\x867\x1cv\ +\x88p5\x995j\xae\xdf[\x8dDv\x155QO\ +s\x036\xbb\xa8-\xbf6{C\x86\xf9\x01\x12\xff\x17\ +\x83\x07\x06\xc0q\xa1\xe4\xcc\x8e22N\x16Q8!\ +\xd7i2#\xc7A:\xd9\xfe%\xcbH\x87f\xda\xfe\ +[Fw\xe3~|\xdf\xdf\x06\xeb2\x9fB\xe9\x88=\ +\xc2\xc5\xd6=\x14\xc6\xea\xb3E\x90\x8bu*M\xd9\xfd\ +\xe3\xfb\xdev\x17P\xfd9x\xf6\xf4\x18\xec\x89\xb9\xb1\ +/\xb4}\x07\x16\x9c\x80\xae\xc4\x22\xaa\xcb\xb9\xa3\xe3q\ +z\xc0\x99\xb9\xdeF\xca\xe5\x14\xb4\x04\xddvg\x97B\ +Z\xd7#\x92&\x10\x11\x09\xa4.\xdb-\x02\x07E\x8d\ +\x1e\x10\x1a\x99S\xb1\xab\xdf\xea\x1d\x9d\x9e\x1c\xef\xf6O\ +Lw\x80\xce\x8e\xbd\x0av\xb4\x14 \xcd\xd8 SJ\ +Z,\xd5\x94\x1a\x8c`q\xd96\x02d\xd9\x0b3\xcb\ +\xa3\x02\xf6*H\xb7&\xbc\x03%d~\x19Y\xfa\xc9\ +\x0b\xaa\x1f\x18\xa9\x9bH\xd4?\xa40[\xec\xee\x0fD\ +\x09 \xc4\x0c\xc5r\xf3\x07\x88d+O\xc3\x10/\xc6\ +\xa4\xa5\xb6\xb6Y\xad\xf7\xcds\xf3S\x157\xfe\xfe{\ +\x0e\xe1\x82\xa7\xe3\xb7\x80\xe0y\xf7\xb1\x14\xdd\x8bx\xc8\ +\xe9\x1d\x91X\xb6\xdc\xc2+\xae\x0f\x88\x03\x9c\xe0\xe1\xe5\ +\x98\x95%\xb8\xa1N\xab;\x076c\xa29\xbc\xab\xd6\ +\xa4\xb6\x8eq\xc3&\xadrk\xc2\x07\x8f\xb9\xf1k\x0f\ +\xf85W\xd4^\xdb\xad\xdb\x8b\x14j\xa6\x8f\x96\xc6\xd7\ +\xde!\xb8\x9d\x85x\x8e\xc4\xb7\xb6\xc7fo\x09\xe72\ +\x85\xff>\xcd\xe3G~\xd5\xad\xce5g\x5c\x0d\xfb\xbf\ +\xf3\xf0\xd8\x04\x07\x0d\x182\x91T\xb2\xb8\xb6\x9f\xd5!\ +\xee:\xdd\xb3&\x9f8\x1a=\xfa\xd5G\xa1\x94s\x97\ +r#!\x1f\xe8\xdbb\xf87\x82i\xf1\xe2x\x8d!\ +\xcb\xa6\xaf\xee\x1e\xf6\xdaOV\x9f:Z$\x99\xd3\xcd\ +\xfc^\x96\x11hq2U\x22\x94\x8c\x7f\xafr\xe5\x9d\ +\xdb\xbe\x15\xe8).\xfb\xf2\x00\xc5&\xa3\x81\x0b`:\ +v\xf9\x9f\xd8\xa5\x8b2_\x8c_+\xe4\x85\x97gI\ +\xff\x96\x94UVk\x0b\xdf\x07\xabJ\xfc\x22\x0f\xa0\x8a\ +9[\x14\xf99H\xf1B\x17%\xe4dU\x89Y{\ +\xc0K3\x9f-\x042F-\xc8S\xba:H\xf09\ +\x1c\xe2\x1e\xe2zN\xd1\xaa\x22>\x00\xeb\xbb\x95\x1eN\ +\x00\x8bA\x8e\xab\xd1\xe3s|\xb5\xf2\xbb0^\xfc\x97\ +\xb0m\x0aM\xdd\x14\xcb\xb4\xf07?\xe4\x96\xb3\x1b\xdb\ +\xe6u\xde\xc2\xb8P\xaf\xbb\xb2\x11DZ\xe7\xa2\xb6\x19\ +\xdf\xae\x84N\xbd\xd4\xa6\x1f\xf9z$\xe5\xb9\x96,\xd6\ +\x99\xd8\xd0\xd7\xc8\xbb\x14\xdb\xd8\x22\xb1\xb0~\x94Y\xb4\ +\xf6\xed\xde\xcb\x83~\xd1Z\xb6\ +\xde\x9e\xbc\xbf\xf8\xf4e\xc8\x5c\xd7\x8a*8F\x81\xa1\ +\xb7\xd4M\xaez\xfbEf\xda\xf5\x19\x85\xc6n\x05\xb7\ +\xd6e\x93\x09^a\xd2Sp\x09#--<\xd2\x93\ +\xd5\xdf\xe09;zc\x9b\xb8\x9aS\x0f\xda6\xd7\xfc\ +\xbb\xf4\xf3\xca:\x89u\xe9G}\xc7#M\xa9KO\ +}\xa3\xa4&q)\x1c\xd5\x94\xee\x1fH\x0fm\x07\xff\ +,s\x7f\xd7|Q\x5c9\xb6'\xbf+W\x91\xfb\xe2\ +\x12\xb3^\xb7K:\xe4\x99|c\x1a\xf9^\xbd9\xef\ +9w\x1fI\xdaC\x5c\xcahd\xbf,.I\xab\x08\ +\xab.{\xe52I#q\x0e\x92\xdf}\xacv\xd3\xf6\ +E0\xfa\x18M&\xb1\xcd\x19\xd9\x10\x0ef\xb8\xb1\xdb\ +N\xe8 \x8d\x0d\xbaZ7Z\x03\xd8\xfclu\xb9\xf6\ +nP\x97\x1f\xc8.jW\x118\xa0\x9f\x1a]\x8bx\ +c\x0c!\x12\xc7W\x8d\xa9\xef\xfa\xfa\xdaf\x142\x95\ +\xc1s\x91\x88s}\xb3+\xa0;\xca\x1f\x99\x1de\x8b\ +u\xb4\xde\xd5\xbcQ\xab\xf4+\x1b\x95\xff\x1f\xf6}\xdc\ +\xaa\ +\x00\x00\x08\xf2\ +\x0d\ +\x0a{\x0d\x0a\x09\x22Stylesheet\ +Variables\x22 : {\x0d\x0a\ +\x09\x09\x22WindowBackgro\ +undColor\x22 : \x22#39\ +3a3c\x22,\x0d\x0a\x09\x09\x22Panel\ +BackgroundColor\x22\ + : \x22#303030\x22,\x0d\x0a\x09\ +\x09\x22DockWidgetText\ +Color\x22 : \x22#ccccc\ +c\x22,\x0d\x0a\x09\x09\x22DockWind\ +owTitleBarColor\x22\ + : \x22#222326\x22,\x0d\x0a\x09\ +\x09\x22TextColor\x22 : \x22\ +#cccccc\x22,\x0d\x0a\x09\x09\x22To\ +olButtonPressedB\ +ackgroundColor\x22 \ +: \x22rgba(255, 153\ +, 0, 128)\x22,\x0d\x0a\x09\x09\x22\ +ToolButtonPresse\ +dBorderColor\x22 : \ +\x22#D9822E\x22,\x0d\x0a\x09\x09\x22T\ +oolButtonHoverBa\ +ckgroundColor\x22 :\ + \x22rgba(255, 153,\ + 0, 64)\x22,\x0d\x0a\x09\x09\x22To\ +olButtonHoverBor\ +derColor\x22 : \x22#D9\ +822E\x22,\x0d\x0a\x09\x09\x22ToolB\ +uttonCheckedBack\ +groundColor\x22 : \x22\ +rgba(255, 153, 0\ +, 32)\x22,\x0d\x0a\x09\x09\x22Menu\ +BorderColor\x22 : \x22\ +#4E4E4E\x22,\x0d\x0a\x09\x09\x22Me\ +nuItemSelectedCo\ +lor\x22 : \x22#D9822E\x22\ +,\x0d\x0a\x09\x09\x22MenuEnable\ +dTextColor\x22 : \x22#\ +ffffff\x22,\x0d\x0a\x09\x09\x22Men\ +uDisabledTextCol\ +or\x22 : \x22#C0C0C0\x22,\ +\x0d\x0a\x09\x09\x22ScrollbarBa\ +ckgroundColor\x22 :\ + \x22 #2D2D2D\x22,\x0d\x0a\x09\x09\ +\x22ScrollbarBorder\ +Color\x22 : \x22000000\ +\x22,\x0d\x0a\x09\x09\x22Scrollbar\ +HandleBackground\ +Color\x22 : \x22 #3535\ +35\x22,\x0d\x0a\x09\x09\x22Scrollb\ +arHandleBorderCo\ +lor\x22 : \x22 #4E4E4E\ +\x22,\x0d\x0a\x09\x09\x22Component\ +PanelFrameColor\x22\ + : \x22#383A3B\x22,\x0d\x0a\x09\ +\x09\x22ViewportTitleS\ +earchBackgroundU\ +rl\x22 : \x22url(:/vie\ +wpanes/editwithb\ +utton_dark.png)\x22\ +,\x0d\x0a\x09\x09\x22TextErrorC\ +olor\x22: \x22#f44642\x22\ +,\x0d\x0a\x09\x09\x22TextPositi\ +veColor\x22: \x22#43d9\ +6a\x22,\x0d\x0a\x09\x09\x22TextWar\ +ningColor\x22: \x22#F0\ +C32D\x22,\x0d\x0a\x09\x09\x22TextI\ +nfoColor\x22: \x22#428\ +5F4\x22,\x0d\x0a\x09\x09\x22DarkPa\ +nelBackgroundCol\ +or\x22: \x22#212225\x22,\x0d\ +\x0a\x09\x09\x22LinkColor\x22 :\ + \x22#4285F4\x22,\x0d\x0a\x09\x09\x22\ +LabelTextColor\x22 \ +: \x22#999999\x22,\x0d\x0a\x09\x09\ +\x22PushButtonDisab\ +ledColor\x22 : \x22#66\ +6666\x22,\x0d\x0a\x09\x09\x22Check\ +BoxDisabledColor\ +\x22 : \x22#666666\x22,\x0d\x0a\ +\x09\x09\x22ResourceGroup\ +HighlightColor\x22 \ +: \x22#D9822E\x22,\x0d\x0a\x09\x09\ +\x22CToolTipText\x22 :\ + \x22#ff000000\x22,\x0d\x0a\x09\ +\x09\x22CToolTipBackgr\ +ound\x22 : \x22#ffffff\ +ff\x22,\x0d\x0a\x09\x09\x22CTableR\ +owOdd\x22 : \x22#ffede\ +ded\x22,\x0d\x0a\x09\x09\x22CTable\ +RowEven\x22 : \x22#fff\ +fffff\x22,\x0d\x0a\x09\x09\x22Slic\ +eRootBackgroundC\ +olor\x22 : \x22#1E252F\ +\x22,\x0d\x0a\x09\x09\x22SliceRoot\ +NameColor\x22 : \x22#F\ +FFFFF\x22,\x0d\x0a\x09\x09\x22Sele\ +ctedSliceRootBac\ +kgroundColor\x22 : \ +\x22#47487B\x22,\x0d\x0a\x09\x09\x22S\ +electedSliceRoot\ +BorderColor\x22 : \x22\ +#2F306D\x22,\x0d\x0a\x09\x09\x22Sl\ +iceEntityColor\x22 \ +: \x22#4285F4\x22,\x0d\x0a\x09\x09\ +\x22SliceOverrideCo\ +lor\x22 : \x22#FF7B00\x22\ +,\x0d\x0a\x09\x09\x22LayerBackg\ +roundColor\x22 : \x22#\ +2F2F2F\x22,\x0d\x0a\x09\x09\x22Lay\ +erChildBackgroun\ +dColor\x22: \x22#33333\ +3\x22,\x0d\x0a\x09\x09\x22LayerBor\ +derTop\x22: \x22#51515\ +1\x22,\x0d\x0a\x09\x09\x22LayerBor\ +derBottom\x22: \x22#25\ +2525\x22,\x0d\x0a\x09\x09\x22Layer\ +MenuSelected\x22: \x22\ +#424242\x22,\x0d\x0a\x09\x09\x22La\ +yerMenuDisabled\x22\ + : \x22#A0A0A0\x22,\x0d\x0a\x09\ +\x09\x22NewLayerDefaul\ +tColor\x22: \x22#51515\ +1\x22,\x0d\x0a\x09\x09\x22Hierarch\ +yLinesSlices\x22: \x22\ +#425E88\x22,\x0d\x0a\x09\x09\x22Hi\ +erarchyLinesSlic\ +esSelected\x22: \x22#5\ +779AB\x22,\x0d\x0a\x09\x09\x22Hier\ +archyLinesNonSli\ +ceEntities\x22: \x22#5\ +C5C5C\x22,\x0d\x0a\x09\x09\x22Hier\ +archyLinesNonSli\ +ceEntitiesSelect\ +ed\x22: \x22#7B7B7B\x22,\x0d\ +\x0a\x09\x09\x22OutlinerSele\ +ctionColor\x22: \x22#5\ +65A5B\x22,\x0d\x0a\x09\x09\x22Laye\ +rBGSelectionColo\ +r\x22: \x22#444545\x22,\x0d\x0a\ +\x09\x09\x22LayerChildBGS\ +electionColor\x22: \ + \x22#464747\x22\x0d\x0a\x09}\x0d\x0a\ +}\ +\x00\x00\x02z\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>icon / Gen\ +eral / caret / o\ +pen\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\x06\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ +icon / general /\ + caret / closed<\ +/title>\x0d\x0a Created with \ +Sketch.\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x01\xde\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ +icon / general /\ + caret / closed<\ +/title>\x0d\x0a Created with \ +Sketch.\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x04\x08\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / Gener\ +al / Image\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22icon-/-Pre\ +ferences-/-Files\ +\x22 transform=\x22tra\ +nslate(0.000000,\ + 0.273859)\x22 fill\ +=\x22#FFFFFF\x22>\x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x03\x04\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Folder / De\ +fault\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\x90\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>icon / Gen\ +eral / caret / c\ +losed\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x14\xa0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \ +Artboard<\ +/title>\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + <\ +/use>\x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02\x16\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xe0\x06\ +\x10\x0a;\x14.6\xad\x8e\x00\x00\x01\xb5IDAT\ +(\xcfm\x93OO\x1bA\x0c\xc5\x7f\x9e\xd9\x15!A\ +\x88S\x85T\xb5D\x85\xc0\xa1\x04\xfa\xfd?\x04\x15\xea\ +\xa1\x0d\x09\x07T\xe0@OT\xcd\xeef\x93\xf1\xeba\ +\xff4Q\xf1\x1cf\xc6\xe3\xf7\xfc\xc6\xb2M\x12\xdbv\ +u\xfdEEQ\x90\xe79y\x9eS\xd75)%\x86\ +\x07#nonl;\xd6\xb6\xc1\xa7g\x13\x8dON\ +8>>&F#%'\xc6HJ\x89\xa7\xe7g\x1e\ +\x1f\x9fX\xcc\xef\xec?\xf0\xa7\xd33M//13\ +\xca\xb2\xc0\xdd\xbb\x10b\x0c\x8c\x86C\xca\xd5\x8a\xd9\xec\ +\x8e\xfb\xc5\xdcz\xf0\xe7\xe9\xb5\xc6\x1f\xdfS\xd7kv\ +\xbfa]\x0a\x90\x11bs\x7fx\xf8\xc9\xec\xc7w\xb3\ +\xf1\xc5\x95>\xbc;\x22\xcfs\xcc@\x02C\xc8\xb6\xe0\ +\x1d\x9f\x19`TU\xc5\xcb\xaf\x17\xb2\x81\xad\xc9b\x00\ +\x84\xbc\x01\x89\x86\xc5\x00W\x8bQ\xc7\xec\x84\x10\x90\x8b\ +\xcc\xccP\x97R]\x16\xb5\xcb\x1a\xc9\xdeJ\x07p#\ +\xcb\x02\xc9\x9dl\x93\x12\xb87\x81\x9d\x5cY\x1fl\x0e\ +\xfd\xab\x0c\xc3\x11\x10c [\x87\x01\xde\x15\xa9\xc5\x08\ +o\xf7FM\xa3\xb8\x03\x1a\x92H\xc9\xc9\xc2zIJ\ +\x07\x84\x18\x1by\xad\x09!\xb3\x86\xc0\xffy1Q\xaf\ +\xd6\xc4\x10\x08\xf7\x8b\xb9\xfdY.A\xea\x7f*y#\ +N\x8e\xa4\xb6\x1c\xc2\xdbsQ\x16H\x22\x00\xacV5\ +UU5\x04\x12.\xc0\x9b\x1a\xe2\xb4~G\x82\xe5\xb2\ +`Y\x94,\x16s\xeb;lr~\xa1\xa3\xc3C\xf6\ +\x06{\xbci\x82\xa2*y}\xfd\xbd\xdba}oO\ +\xce5\x1a\xee3\xdc\xdf'\xc6\xd8\xfb7\x9bDQ\x96\ +\x94U\xc5\xe2nfo\x0e\x06\xc0\xf4\xeaZUU!\ +\x093\xc3\xdd\x0910\x18\x0c\xf9v\xfbug\xaa\xfe\ +\x02M\xd1\x1f\xa6\xf7\xa6\xb3\x84\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x02i\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0eu\x00\x00\x0eu\ +\x01\xb9cQ2\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xe6ID\ +AT(\x91\x95\x93\xbfO\x13a\x18\xc7\xbf\xef\xfb\xde\ +\x91\xb6wM\xaf\x0e\xd2\x84\x10\xa1M\x5c-\x18d\xaa\ +Jt1u\x05\x95\xf8c0\xf5?0A\xa7\x8e\x0e\ +\x0en\x0eV\x1bLjB\x98u\x02\x1b\x18\x1cZb\ +\x99\x1c0\x5c\xd30\x11b\xee\xda\xde\xd1\x83{\x7f\xb8\ +\x00\xa9\xa6$\xe53=\xc3\xf3\xc9\xf3M\x9e\xe7!\xe8\ +\xa7\xa8\xe8\x0d\xcf~\x18\x8f\xd2B(U\xf68D|\ +DGWg\xa4\xd1\xed\xc9\x0f5#\xbd\x82\x22\x91\xa7\ +\xed\xe4\xb4\xb8\xfe\xf2w\xc6\x1ca\xdfRI}l1\ +\x970\xa6\xd2\x11X\x06\x83\xe3\x094\x9a\x01\xbel\xb6\ +\xfd}\x97\xef\x1d\x8a0_\x7fs\xd5F\xbf\x98{e\ +\xbb\x9f\xab\x0e\x97R\x0dDH\xa5>\xad;a\xee\xb5\ +\xed\xcc,\xed\xa4\x01\x80\xcd\xcf+\x16^n\xffx~\ +7\x99z:g1B0\x10B\x80\xa9\xc9\x08\x05!\ +\xda\xafVx\xafu\xe7\xdd{\xda\xbab?H%\xf5\ +\xb1'\xb7-6X\xfb\x97gs\x966ji\xe3\xb3\ +\xde\xee\x025c\xf4\xc5\xe3[\x09\xe3\xbc\x89\xffC\x09\ +\xb0x3a\x18QV\xa0B\xa8\xec\xb5\x89\xc8p\xe6\ +\x09\xd9\xc9\x08\xb8T\xd3\xf48\x84\x99\x88\x0d\x95\xf8\x8c\ +\xa4\xc1\x10reR]G\xd7\xf5\xc5\x85d\xc7\x17\xd0\ +5\xe2Q\x8d\x92\x9f\xdb\xcd\xe0Br\xc3\xeeA\xa7t\ +\x8bz\x81,U6\xdb\xbeT\xc3\x89R\x01\x95\x8d\xb6\ +\xdf\x09x\x89\xd6\x8c\xf4\xca\xbe\xcb\xf7\x96\xab.\x1fF\ +.\xaf\xbb\xfc\xa0#Zu#\xb3JQ$\xf2P\x84\ +\xf9\xf2\x9a\xe3\x97\xbf\xbb\xfc\xbc\x04R\x01\x1f\xd7\x5c\xbe\ +\x5cu\xbc#\x81<\x8aD\x9emwfi'\x1dc\ +\xfa\xd7QK\x1b\x7ftr\xdb\x97L\x86?]\x81\xed\ +f\x80\xca\x86\xeb\x1ftD\xabwD\xee\xd7\xdeN4\ +\x81\xbe\xc7\x00\x00\x14\x15\x9d\xf5v\x17\x8c(+p\xa9\ +\xa6\xc3\x10q]G\x97Q\xba\xe5\x05\xbcT72\xab\ +\xfd_\xf5\x17e\x1f\xe5\xce Jo\x90\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x00\xf0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00mID\ +AT(\x91\xed\xcd\xb1\x11\x830\x14\x83\xe1_\xef\x18\ +\x82d\x060\xab0\x06\x84\x81\xd2\x90\xf5\xcc\x0c\xaeD\ +\xc5\x1d\xa5\xe3.wQ\xa5\xe6\x934\x0d\xc3L\xc4\x1b\ +\xe8\xa9\x8c\xed#`U\x1a\xc7,\xe9Q\x0bo\x039\ +Z \x80\xa4g\xb4\xc0+\x7f\xfc3\xb8\xbb\xcak\xdb\ +\xaa@)\x85\xcf\xbe\x03\xa0)%\xb7>\x87\xed\xa3\x05\ +\xda\xce\x11\xb0~;`;#-'\x9e\x9e#\x8a\xf7\ +\xe8\x00\xf2\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xa7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00O\x00\x00\x00E\x08\x06\x00\x00\x00\x0b\xaf\xbb\xe0\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02$ID\ +ATx\x9c\xed\xdc\xcdjSA\x1c\x86\xf1\xe74\x89\ +M#\x05]\xd8\xe8^\xf06\xdae\xaf\xd6K\xb0\xd7\ +\xe1\x0d\x88\x16\x14\x94\xc6\xc6&9]\xfc\xcf\x98\x999\ +i]\xbcR\x0a\xf3\xfe \xa4\x1f\x09\x84\x87IO6\ +};J]uo{}u\xcft\xb8\xcf\xa3u\xc0\ +Q\xf6u\xeb\xfa\xe1\xb6#\x0b\x07\xf4y\xa0\x0e\x98d\ +\xb7)\xfb\x88\xadJ\xd16\xc06\xbb\xf5P\x9e\xbc\x14\ +l\x0e\x9c\x00\xc7\xc3\xf7\xe9$\xb6&\x9d\xb4\x0d\xb0\x06\ +~\x03\xb7\xc3\xef\xb6@_\xc7;\x06^\x01g\xc0)\ +\xf0\x02\xb8\xc9\x9e\xd4\x929\xf0\x12\xf8\x03\xfc\x02\xbe\x01\ +?\xc8\xde\xc2\xf9\xc9\x9a\x00\x0b`\x09\xbc\x1f\x9e\xf4\x09\ +\xb8~\xf2\x97\xfd|\x9c\x01\x17\xc0\xdb\xe1\xfb5p\xc7\ +p\xf2&\x94\xa7\xee\x14xG\x9c\xb8\x8fD\xf1\x96\xdd\ +\x00\x9f\x81\x0f\xc4i\xfbI\x04\xdc\x00\xbb\xf4\xb7,\x9d\ +\xbe)0\x03\xae\x88\xc2\x16\x1d\xae\x88.\xc5E4\xbf\ +\x10\xa4\x80+\xe2\xfdm{_\x89\x0bF\xf1\xe9\xa3\xbe\ +\x8av\xc3\x83llE\xf5\xb1\xed\xd0G\x90\xfe\xc0\xcf\ +\xec@\x97\x16?\xbf\xfd7\x8e'p<\x81\xe3\x09\x1c\ +O\xe0x\x02\xc7\x138\x9e\xc0\xf1\x04\x8e'p<\x81\ +\xe3\x09\x1cO\xe0x\x02\xc7\x138\x9e\xc0\xf1\x04\x8e'\ +p<\x81\xe3\x09\x1cO\xe0x\x02\xc7\x138\x9e\xc0\xf1\ +\x04\x8e'p<\x81\xe3\x09\x1cO\xe0x\x02\xc7\x138\ +\x9e\xc0\xf1\x04\x8e'p<\x81\xe3\x09\x1cO\xe0x\x02\ +\xc7\x138\x9e\xc0\xf1\x04\x8e'p<\x81\xe3\x09\x1cO\ +\xe0x\x02\xc7\x138\x9e\xe0P\xbc\x96Gh\x1e3\xea\ +R\xc7\xeb\x89A\x1a\x1b[P\xfd\xb7w\x1e/\x8d\xad\ +,\x88=\x11\xdb[\x12\x87\xaa\xd8\x93J\xf1\xf2\xcd\xa4\ +;b\x88e\xf6\xc4/\xf0\xb9\x9a\x01\xe7\xc4H\xcf\x86\ +,`\x1a\xa5I\xb7)Q\xf8\x0d1\xc4rM\x0c\xb3\ +\xb4j\x09\x5c\x12\x01\xbf\x00\xdf\x89\xf5\x8f-\xd9\x8a\xd9\ +\xd1\xf0\x809\xf0\x9arKjE\x9bs!'\xc4\x96\ +\xd4\x9arK\xea\x96xw\xee\xf2S\xe7\x15\xb3\xd2C\ ++fi\x0e\xce\xfby\xff\xf0\xe8~^=s\xe9\xe5\ +\xc6\xb1z\xb9\xf1\xef\xfce\x1d\xc7\x9b\xa1\x0f\x1bm\x86\ +\xde\x03\x8dTq\xf6\x14E}\xb7\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01\x1a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x06\x00\x00\x00\x0a\x08\x06\x00\x00\x00\x97\x0e/3\ +\x00\x00\x00\xe1IDAT\x08\x99U\xc9\xbbN\xc2P\ +\x00\x80\xe1\xbf=\xcdI \x1d<\x94\xa1\x97\xed\x1c\xd3\ +\xc5\xe8D\x1c\xd4UM\xd0\xc8b\xc0\xc4Aer\xf1\ +5\x9cx\x00Cu\x92\xb8\xc3\x0b\x10w\x06x\x04\xd4\ +\x1a6\x8b7\x12\x92\xa6\x0eL~\xebgi\x13\x13F\ +\x91\x00\x12\xa0\x0c\x9c\xbf\xa7i\xee\x00\xd8\xb6\xddi5\ +O\xaf\xa4\x94<\xf6\x9e2\xe0Zlln\x9d5N\ +\x8e;{\xbb;\x04\xbe\x8f\xeb\xba\xb5\xd7\xb74\x15\xf5\ +\xfa\xd1\xe0\xf0`_I)\x01\xf0*\x1e\xd9|\xbem\ +i\x13\x8f\x00\x0d(V2`\xe6\x84QT\xe2\xbf\x02\ +X:\xebF\xaf\xb5\xdb\x97\xaa\x5cZ\xfd\xefb\xa1\x92\ +\xe4\xe1[|~\xfd|T\xbdj\xc3\x18\x0d\xc0p\xf8\ +L\xbf?\xb8\x11\xaa\xe2\x8d\xc7\x93\x89\x1f\x84Am:\ +}\xa1\xdb\xbd\xbf+\x8a\xe2\xd6\xd2&\x06\x10@\x0f\xc8\ +\x81\x0b \xff\x03s\xf6>m\x1a:\xda\xae\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01!\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x0a\x08\x06\x00\x00\x00\x89\xc7\x1f\x80\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\x9eID\ +AT\x18\x95\x95\x8e=\x0a\xc2@\x10\x85\xdfc+o\ +\x90\xdd\x9c\xc2\x9dMe\xa5\xe8}\x04A\x11\xc4\x14\x11\ +\x7f*/d\xa3\x90\xce\xe4\x18\x99\x9c@\xecbc$\ +h\x1a\xbfj\xf8\xde\xf0f\x0c:\x88$Y\xe4\xec\xa8\ +V\xbd\xb5\xce\xb4\x83\xf7!\x05\xb1%8q.nT\ +\xab\xebgAD\x16 \xf7\x9d\xb2\xb1s\xf1@\xb5\xba\ +\xd0\xfb0\x07qF\x0f\x04O}\xfe?8\x14Y\x11\ +<\xf6\x9fh\xd6\xa6V\xcd#g\x9f\x04\xa7_\xe9\xa6\ +,\x8a\x83\x01\x80Z5\xb7\xd6=@\xcc\xde\xcf\xa5e\ +q\xdf\xfdT\xfa\x10\x96\x22I\xd6u/d\xab)\xa9\ +$\xdag>\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x00X\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x02\x00\x00\x00\x0e\x08\x06\x00\x00\x00\x05t\xcd_\ +\x00\x00\x00\x1fIDAT\x08\x99cTRV)\xd7\ +\xd2\xd6f`a``\xe8`````b\x80\x02\ +:0\x00\xeb\xe3\x02\x061\xdbT\x15\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x00\xd1\ +<\ +svg xmlns=\x22http:\ +//www.w3.org/200\ +0/svg\x22 width=\x2224\ +\x22 height=\x2224\x22 vi\ +ewBox=\x220 0 24 24\ +\x22>\x0d\x0a \x0d\x0a\x0d\x0a\ +\ +\x00\x00\x02\x22\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x01\ +\xdcIDAT(\x15mS\xbfO\x14Q\x10\x9ey\ +\xf7\x83\x04V\x0a$6\xd0Aa\xa1\x95!\xe1G\xa1\ +\xdcA\xc3_\x804@\x8cR\x12\xed8.\xc4\x18\xee\ +\x12:(\xd5\x04B%\x84\x96\xe2\x0aX\xa4@\xf9e\ +E\x8b\x09\xb1\xa2\x00L`\x95\xe2\xee\xde\xf0\xcdf\xdf\ +f!\xf7\x92\xdd\x99\xf9\xe6\xfb\xee\xcd\xcc\xce158\ +\xafJ7\xcf\x0c\x9b>\x12i#\xe6+S\x93\xfd\xad\ +9\xef\xe4!\x95\x93@n\xfe\xba\x9f\xd8,\x02\xebI\ +\xe2\xea\x83x,b\xa7\xfdb\xeb\x0f\x97\x8b\xc5\xf9r\ +0.B_\x91\xc8\xb8d\x03[e\xa6\xb7\xdb\x05o\ +UsF_z#\x84_\xe0:\xe1\xa1\xb14lL\ +\xba\x8b\xc4\x0e\x00_S\x1eNFya\x85\x08Bq\ +Tj6L\x13\xfd\xb1\xd5\xff\xf9\xdb\xec\xed\x81\x95\xda\ +\xcbT&u\xe6\xcfz\xafIh3\xcag#>\x99\ +\xa1O\xc1s\x80q\x8f\xe8c\xfd\xfb\xc7'AS\xad\ +y\x01\x82\xe5z\x8d\x8a*B\xb9[\x91XM\x8f\x0e\ +5m\xd3\xdc\x8b\xa9\xc68\xbc\xb1\x5c)\xc8\x11I7\ +\xc0\xaa0U4)$O\xc3\xb1EL\xfd\x1ai\xc0\ +\x8f\xa3\xd8\x99\x0e8\xfa\x08\x1b\x1a\xf1gZ*\xf9\xd2\ +\xcd\xa8\x10\xbfq\x04\xb5\x22\xd2\x8e\x9e\xf92\x09:\x1f\ +7\xeen\xcfx\x15T1\x01\xe17\xe0n\x98!\x85\ +\x99/\x8c.\x80\x13$-\x0b5\x0f\x96\xfe\xbd\x03\xf6\ +>\x89;_uF7G\x17\xc0\x81\x09{\xcab\xff\ +\xa2\xd9\xf3\x04\xe6\xdc#\xd5\x85\x9f\x0a$\xfd\xf5\xba\xcb\ +\x84\x96\xe9\xc4/>\xda\xc0\x98\x7f\xdf\xc3\xc13b?\ +(\x16oX\xae\x1cL\xe2\x96\xcf\xc0\xa2\xde\xf8TX\ +\xceP>\xa6L\x9dJ\xc6\xa9B1\xe5\x17\xbc\x15\x0d\ +b\xb1\x06\x83\xe5\xeb\x01\x16\xb3\x04\xf7\x85\xc6\x0f\xce/\ +a;\xbdSh\xdds\xf8=\xb1\x03uq\xea)\xee\ +c\x966\x11\xbeJ\xd5\xe5g\xa3\x7f\xd5\x1d; \xa7\ +\xb8\x13\x92\xf3}\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x05\xdf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x11\x08\x06\x00\x00\x00\xc7xl0\ +\x00\x00\x04\x19iCCPkCGColor\ +SpaceGenericRGB\x00\ +\x008\x8d\x8dU]h\x1cU\x14>\xbbsg#$\ +\xceSl4\x85t\xa8?\x0d%\x0d\x93V4\xa1\xb4\ +\xba\x7f\xdd\xdd6n\x96I6\xda\x22\xe8d\xf6\xee\xce\ +\x98\xc9\xce83\xbb\xfd\xa1OEP|1\xea\x9b\x14\ +\xc4\xbf\xb7\x80 (\xf5\x0f\xdb>\xb4/\x95\x0a%\xda\ +\xd4 (>\xb4\xf8\x83P\xe8\x8b\xa6\xeb\x99;3\x99\ +i\xba\xb1\xdee\xee|\xf3\x9d\xef\x9e{\xee\xb9g\xef\ +\x05\xe8\xb9\xaaX\x96\x91\x14\x01\x16\x9a\xae-\x172\xe2\ +s\x87\x8f\x88=+\x90\x84\x87\xa0\x17\x06\xa1WQ\x1d\ ++]\xa9L\x026O\x0bw\xb5[\xdfC\xc2{_\ +\xd9\xd5\xdd\xfe\x9f\xad\xb7F\x1d\x15 q\x1fb\xb3\xe6\ +\xa8\x0b\x88\x8f\x01\xf0\xa7U\xcbv\x01z\xfa\x91\x1f?\ +\xeaZ\x1e\xf6b\xe8\xb71@\xc4/z\xb8\xe1c\xd7\ +\xc3s>~\x8dif\xe4,\xe2\xd3\x88\x05USj\ +\x88\x97\x10\x8f\xcc\xc5\xf8F\x0c\xfb1\xb0\xd6_\xa0M\ +j\xeb\xaa\xe8\xe5\xa2b\x9bu\xdd\xa0\xb1p\xefa\xfe\ +\x9fm\xc1h\x85\xf3m\xc3\xa7\xcf\x99\x9f>\x84\xefa\ +\x5c\xfb+5%\xe7\xe1Q\xc4K\xaa\x92\x9fF\xfc\x08\ +\xe2km}\xb6\x1c\xe0\xdb\x96\x9b\x91\x11?\x06\x90\xdc\ +\xde\x9a\xaf\xa6\x11\xefD\x5c\xac\xdb\x07\xaa\xbe\x9f\xa4\xad\ +\xb5\x8a!~\xe7\x846\xf3,\xe2-\x88\xcf7\xe7\xca\ +S\xc1\xd8\xab\xaa\x93\xc5\x9c\xc1v\xc4\xb75Z\xf2\xf2\ +;\x04\xc0\x89\xba[\x9a\xf1\xc7r\xfbmS\x9e\xf2\xe7\ +\xe5\xea5\x9a\xcb{yD\xfc\xfa\xbcyH\xf6}r\ +\x9f9\xed\xe9|\xe8\xf3\x84\x96-\x07\xfc\xa5\x97\x94\x83\ +\x15\xc4\x83\x88\x7f\xa1FA\xf6\xe7\xe2\xfe\xb1\xdcJ\x10\ +\x03\x19j\x1a\xe5I\x7f.\x92\xa3\x0e[/\xe3]m\ +\xa6\xe8\xcfK\x0c\x177\xd4\x1fK\x16\xeb\xfa\x81R\xa0\ +\xffD\xb3\x8br\x80\xafY\x06\xabQ\x8c\x8dO\xda-\ +\xb9\xea\xeb\xf9Q\xc5\xce\x17|\x9f|\x856\xab\x81\x7f\ +\xbe\x0d\xb3\x09\x05(\x980\x87\xbd\x0aMX\x03\x11d\ +(@\x06\xdf\x16\xd8h\xa9\x83\x0e\x062\x14\xad\x14\x19\ +\x8a_\xa1f\x17\x1b\xe7\xc0<\xf2:\xb4\x99\xcd\xc1\xbe\ +\xc2\x94\xfe\xc8\xc8_\x83\xf9\xb8\xce\xb4*d\x87>\x82\ +\x16\xb2\x1a\xfc\x8e\xac\x16\xd3e\xf1\xab\x85\x5cc\x13?\ +~,7\x02?&\x19 \x12\xd9\x83\xcf^2I\xf6\ +\x91q2\x01\x22y\x8a@\xff\xab\x00g\x8d\x7f\x01\xa0\x9f|\ +U\x03\x5c\x0b\xef\x00\x00\x01\x81IDAT8\x11\xad\ +\x92\xa1\xab\xc2P\x14\xc6\xfd;T\xb4.\x0c\x0c\x16\x85\ +1\x18\x03\xc1 \x82A0\x18D\x16\x16\x06\x96\x05\x83\ +ia\xc1`\xb0Z\x17\x87A\xa3\x7f\x87E\x04\x93A\ +\x83(\xe8`\xca\xbe\xc7\x19\xef\xca\xae\xdb\x83\xa7\xee\x84\ +\x9d{\xb9\xdf\xf9}\xbb\xf7\x9cL&\xe5\x10\x04\x01\xab\ +\xd5\x0a\x92$!\x9b\xcd\x22U\xbc(\x8aX\xaf\xd7\xa0\ +8\x9dNP\x14%=\x83R\xa9\x84\xcdf\x13\xc2\xd9\ +g>\x9f\xa7cP.\x97\xb1\xdb\xed\x187\xcc\xcb\xe5\ +\x12\xc5b\xf1{\x83J\xa5\x82\xfd~\xcf\xc1]\xd7E\ +\xa1P\xf8\x1eN\x8d<\x1c\x0e\x1c\xdcq\x1c\xe4\xf3\xf9\ +8\x9c\xfe\xe4\x9d\x8eS\x03\xa9\x91\xd1\x98\xcdf\xc8\xe5\ +rq\x8em\xdb\xb8\xdf\xef\xe8v\xbb\xf1\xc3\x04\xd7Z\ +\xad\x86\xf3\xf9\x1cec:\x9d&\xd7N&\x93\xa7\xf0\ +\xf1x@\xd3\xb4d\xe1\xafQ\xa3\xd1\xc0\xf5z}\xd6\ +\xd0b<\x1e\xff]\xd3\xef\xf7A`\x16A\x10\xc00\ +\x8c\xc4\x82V\xab\x85\xdb\xed\xc6\xa4a\xb6,+Q\xcb\ +]\x9c\x9e\xc6\xf7}\xae\xd04M\xae\xb0\xd3\xe9\xc44\ +\xc3\xe1\x90\xd3p\xd0\xd7M\xbb\xdd\x86\xe7y\x9c\xc9h\ +4\x0a\x01\xbd^/\xecQ\xf4p0\x18\xfc\x1f\xce\xcc\ +\x9a\xcdf\xec\x09\x16\x8b\x05\xe8\xd9X\xd0Z\xd7\xf5\xf7\ +\xe1\xcc\xa4^\xaf\xe3r\xb90\x1e\x97i\xd2\xe86L\ +\xfbqVU56\xe3\xd4#\xea\xc3\xc7\xd0\xd7BY\ +\x96q<\x1e\xc3\x1b\xd0\xe4\xd0\x04\xbdj\xbe\xdeW\xab\ +Ul\xb7[\xd0\xec\x7f\x0a\xfb\x01\x10s\xb34\xbfi\ +\xa2\xd1\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03.\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a arrow\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x00X\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x02\x00\x00\x00\x0e\x08\x06\x00\x00\x00\x05t\xcd_\ +\x00\x00\x00\x1fIDAT\x08\x99cTRV)\xd7\ +\xd2\xd6f`a``\xe8`````b\x80\x02\ +:0\x00\xeb\xe3\x02\x061\xdbT\x15\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x02\xd3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x02\x9aIDAT8\x8du\x94\xbdo\x13A\ +\x10\xc5\x7f\xbbw&9\x02\x12q Q\x8c\x13 !\ +\xa4F\x14)i@H\xa0\xf4HTP\xd3\xa7\xa0F\ +\x82>)\x11\x05\x0d\xff\x00\x05B4t\xa9R\x07|\ +V>L\x05q\x94;\xdb\xb1\xbd\xe7\x19\x8a\xfb\xb0\x1d\ +\x99\x95\xeev\xefn\xe7\xdd\x9byo\xc7\xdcYYe\ +\xc2\xb8\x05<\x07\x9e\x02w\x81\xeb\xc0_ \x04\xbe\x00\ +\x9f\x81C\x80zX+\x82\xcc\x05\xb0\x00x\x0b\xbc^\ +Z\xaa\x96\xe6\xcae\x82 \xa0T*\xe1\x9c\xe3\xfc\xfc\ +\x9c\x93f\x93\xe3\xe3\x86\x03v\x807\xf5\xb0\xd6\x99\x04\ +v\x03\xf8Z\xad\xde\xbc\xbfT\xad\xd2\xeb\xf5\xe8\xf5z\ +$I\x82\x88`\xad\xc5\xf3<\xa6\xa7\x03\xa6\xa6.q\ +\xdc\xf8M\xa3\xd1\xd8\x03\x9e\xd4\xc3\xda\x9fQ\xb0K\xc0\ +\x8f\xe5\xe5\xe5\x8d\xf2\xec5\xda\xed6\xa2\x82\xc1\x80*\ +\x18\x03(dwk\x0c33W8==\xe5\xf0\xe8\ +x\x17xX\x0fk=\x9b\xb1z_\xa9,n\x5c\x0e\ +\xa6\x89\xe3\x18\x11\x01\x05UE\xc9fMqQED\ +\x89\xe3\x98 \x08\xa8T\x167\x80w9\xb3e \x5c\ +\xbf\xb7\xe6;\xe7\xd2\xdc\x0b\x1e\x17\x86\x01\xa3\xa0\xd9\x06\ +c\xc0\xf7K\xec\xff\xfc\x95\x00k\x16x\xb5\xb00\xef\ +\xbb~?MCAT\x8b\xb5f\x8b\x9c\x95\x02H\xfa\ +A\x14\xfa\xce\xb1\xb00\xef\x03/}\xe0\x915\x16Q\ +\xc5\xa8\x02\x065ijd\xcf(`\x04U\x03*\x19\ +uE\xd5`\x00\xcfZ\x80\xc7>\xb0\xe2{\x1e\xa0E\ +\xecX\x8e\xaa\x08iz\x85\x08\x9an\x83\x94\xa9\xef{\ +\x00\xeb>0g\xacAu\x18\xa7\xac\xa2(\xa6\xd5n\xef\x02\ +[\x009X\x1f\xd8\x8c[\xad\xbd\xe8,\x1a\x06\xe6\xca\ +\xe5v\x199\xab\xd1YD\xdcj\xed\x01\x9b\xf5\xb0\xd6\ +\x03\xf0fg\xcb\xb9\xca\x1d\xe0S\xdf\xb9\xab\xadV\xfb\ +\x01\x8a5\x98\xccG\x06\x11\xa1\xef\x12:\x9d\x0e\xcd\xe6\ +i\xd2wn\x1bxQ\x0fkg\x85\xa1\xfe\xd3io\ +\x93v\xdag\xc0*\x93;\xed\x01\x8cw\xda\x7f\xd9\x09\ +\xcb\xc0.Yr}\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x01>\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xf8IDAT8\x11\xc5R\xbd\x0e\x01A\x10\xbe\xdd\ +\x9c\xe7\xf0\x0c\xf7\xd3\xab\xd1\x89h\xbc\x85\x9a\x93\xf0.\ +D\xa2\xd2\xa9\x14\x94w\xa7\xf0\x02\x1ao@\x14d\xcf\ +7\x17\xb3\x19G\xe4Dq\x93l\xe6\x9bo~vf\ +v\x1d\xa7jQq\x1c\xef\x95R\xf5\x92\x8d\x1c\x82 \ +h\xc8XWk=6\xc6,A\xd6\xa4\xa3\x88q\xc9\ +\x19\xdc\xb0\xc8k\xdf\xf7W {8\xb7\xa2\x93mJ\ +\xce\xb2\xac\x89\xdb\xb7\xcc\xb1V\x0c\x92$\xe9 h\x01\ +\xdbe\x8e4\x92/8-\xcf\xf3v\x92gl\x0b\x10\ +\x91\xa6i\x17\xe3\xcc\x01\xb9\xc8\x15\xb8\x1d\x86\xe1\x06\xbb\ +\x1a\x01Op\xa4DZZ\x18\x87v\xb1\x16\xdc\x8c\x92\ +\xc9\x86\x9eBE\xc2\x17\x11\xc77Y\x1e\xed\x1a\x8c\x92\ +\xdb\x84\xad\x03\x80\x12\xd0IN=\x0b\xdaVe\xdcW\ +\xcc\x89\x1c\xf42\x02\x93\xbf\xe8\xb7\x02h\xff\xf8W\x01\ +\xbc\xf5\x00\xb3\xd3s\x96\x92OK\xbc\xa3\x8b>\xfe\x05\ +\xfd\xbcS\xa9*\x95\x06=\x00\xd2TH\xf4R\xe6\x83\ +\x99\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x04\x00\x00\x00\x08\x08\x06\x00\x00\x00\xde3^\x05\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\ +\x9bx\x00\x00\x01\xcbiTXtXML:co\ +m.adobe.xmp\x00\x00\x00\x00\x00\ +\x0a \ + \x0a \x0a ww\ +w.inkscape.org\ +\x0a 1\ +\x0a \x0a \x0a\x0a\x18\xcbUX\x00\x00\x003IDA\ +T\x08\x1dc\xf8\xff\xff\x7f=\x032\x00\x0a\x80\x00B\ +\x10\xc2G\x082\x82\x98H:\x1a\x99\x908\x10&\x92\ +\x96r\xb0\x08T\x00\xc2\x01\x89\x00\x05\x10\x1c \x1f\x00\ +\xf0S19\x84U<\xda\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\xc9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0b\x08\x06\x00\x00\x00\xa9\xacw&\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x83IDAT\x18\x19c\xb4o\xfe\xb1\xf5\xff\xff\xff\ +^\x0c\x04\x00##\xe36&b\x14\x82\xcc\x01\xa9c\ +\x22` \x8a4I\x8aY`Z9Y\x19\x18\x94D\ +\xff\xc2\xb8p\xfa\xe1[&\x86/?\x19\xc1|\xb8b\ +)\xc1\x7f\x0c\xadA\xbf\xe0\x8a`\x8c\x96-l\x0cg\ +\x1e0\xa3*~\xf6\x9e\x89\xa1z\x1d\x1bL\x0d\x9c\x06\ +\x99\x0c\x03p\x93\xbf\xfff`\xb8\xfa\x0cb\x02L\x12\ +\x9dFhC\x97\xc1\xc2'M1(f\xb0\x18\x82!\ +\x04R\x07\x00\xf2\xeb!\xfaX\xc1\xbb\xf7\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x00\xda\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x04\x08\x06\x00\x00\x00\xb3\xcd~\xf0\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00WID\ +AT\x08\x99c,*))bd`le``\ +\xe0`@\x07\xff\x19\xea\x99\x8f\x1f;v\xdc\xda\xca\xe6\ +\x0f\x03\x03\x83\x0b\x8a$#CSoOw#3\x03\ +\x03\x03\xc3\xb1cG\x8fZ[\xd9|c``p\x85\ +\xc81\xf4\xf4\xf6tWa\x98X\x5c\x5cV\x5c\x5c\x5c\ +\xda\x8e,\x06\x00#3\x16\xf2\x93\xf54\x1c\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x00\x88\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x05\x00\x00\x00\x08\x08\x06\x00\x00\x001\xf15;\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x00*IDAT\x08\x99c\ +8s\xe6\xcc\x7f\x06$p\xe6\xcc\x99\xffL0\x062\ +\xcd\x88\xcca```011aD\xd1\x86\x9dC\ +\x1d3\x01\xde\x84)\xe5\x93\xc7'\xb0\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x03\x8a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x03QIDATH\x89\xad\x96\xc1n\x1cE\ +\x10\x86\xbf\x9e\xb5\xbck\xc5\xb1\x9d\xb1\x97$\x17G\xd8\ +f#9N$'\xbc\x80\x85\xec\x5c\x10\xe4d\x0cG\ +\xa4p\xe5\x80\x90y\x03\xc8\x05\xee\x90#R\xb4>\x85\ +\x0bp \xc4>B\x88\x84\xe2\xb5\xe4\x09;C0H\ +\x84\xddM\x847#\x87U\xe4.\x0e\xdd=\xd3\x93\xac\ +M\x90\xd2\xd2\x8cz\xaa\xab\xea\xaf\xfa\xbb\xaa{\xd4\xcb\ +S\xd3\x1c2&\x81w\x80\x05`\x16\xa8\x02O\x80?\ +\x80\xdf\x80u\xa0\x9e\xc4\xcd_\x0fr\xa0\x0e\x00\x98\x04\ +>\x01\x96\xcf\x9d;[:y\xe2$cc\xa3T*\ +\x15\xb4\xd6\xec\xed\xed\x91\xa6)\x7f\xde\xbf\xcf\x9d;\x9b\ +\x1a\xa8\x03\x1f%qs\xe7y\x00\xde\x00\xbe|\xf5\xc2\ +\x85\xa3g\xe7\xce\xb0\xaf5Z4\xa2AD\x1b#\xa5\ +PJQ\x0a\x02T\x10\xd0hl\xf1\xd3\xed\xdb)\xf0\ +^\x127\xaf\x1d\x06\xf0>\xf0\xe9\xd2\xe2k\xc1\xf1\xe3\ +'\xd8\xdf\xdf\xef\x9b\xb6\x00J\x00e\xbeK\xa5\x80\x07\ +\x0f\x1e\xf2\xf57\xdf\x0a\xf0A\x127?\xeb\x07\xf0\x16\ +p\xed\xd2\xa57\xd5\xd0P\x05D\x01\x82{+\x04\x94\ +2\xde\x0d\x04\xe2dVc\xef\xf1c\xae_\xffJ\x80\ +\xb7\x93\xb8Y\x07\x08<\xce\xaf^\x5cZTC\x95\x8a\ +\xe7$\x7f\x0b \x22\x88\x9b\xdb\x15D@\xcc\xdaP\xa5\ +\xc2\xc5\xa5E\x05\x5c\x9d\x9a\x9e\x99\xf4\x01>>??\ +?\x1c\x86a_J\xfe\xcf\x08\xc3\x90\xf3\xf3\xf3\xc3\xc0\ +\x15\x07p\x0aX\xa9\xd5f\xbc\x88\xf3\xc8Lt\x9e\xbc\ +0$S\xf5'\xb5\xda+\x00\xcbS\xd33\xa7\x02`\ +evv6\x80\x00\xf1\xd2\x15@\x94 \xca\xa1X\xb9\ +\x18D3''Lr\x1aAa|\xb22\x00,T\ +\xab\x13^\xec^\xac\x85\xb0\xe5\xbf\xc4\x05\xa1\xf1\xc9B\ +\x00\xcc\x8d\x8d\x8c\x16\x22\xefo)\x1e\x17\xbe\x8eg#\ +\xceL\x18\x1b\x1d\x05\x98\x1b\x00&\x06\xcb\x83\x05%\xb1\ +ehj4w\xaa2\x0a\xec\xbc\x00\xe5\xe4\x0a\x11\x18\ +\x1c,\x03T\x07\xccj\xbe\x9b\xb6\xfcQh\xdbP\xca\ +\xec\x83\xe0\x81\x82FPJ\xd9P4\x22\xb6\xeb\xac\x9d\ +\xeb\xfa\x00\xe8\xfc\xd3\xeb\xe5\xf4\x88\x97\xb6\xcb\xc6\x95|\ +\xb6\x99\xaez\xdc\x86?KW\xaf\xd7\x03h\x07\xc0\xd6\ +n\xb7\xcb\x8b\x1e\xbb\xbb]\x80F\x00|\xdf\xfa\xab\xe5\ +\xc2-tq\xa1\x17l\xf4\xde\xaa\x89\xde\xefl\x97\x9d\ +@\xab\xdd\x02\xb8\x19\x00\xf5\xed(\xd2Z;e[\xdf\ +\x92\x1b\x16h\xf2\xfb cF\xb2\xf8\x10\xd0\xa2\xd9\xde\ +\x8e4P\x0f\x80{\xc0Z\x14\xdd}a\xf4X_k\ +I\xdc\xbc\xe7\xce\xa2\xd5\xcdF#m\xb7;^7\xfa\ +T\xe4\xec=ME\x96\x84Umw:l6\x1a)\ +\xb0\x0a\xf9a\xb7\x03\x5c^\xdf\xd8\x90Gv\xc3\x8bT\ +\x08\xca~+\x8f\x8al_\xec\x93\xa6)\xeb\xeb\x1b\x02\ +\x5cv\xb7[\xe9\xd8\xb1\xec\x04m\x00\x7f\xc7q\xb2\x14\ +\x8e\x87\xea\xc8\xf0\x11\xd3\x03Y\xe2\x02\xca]6\xca\xdc\ +8\xae\xf6\x95\xd0\xe9<\xe4\xbb\x1b7\x04\xf80\x89\x9b\ +_8+\x1f\x00\xe0\x07\xe0\xe7\x9d\x9d\xdf_/\x05\xa5\ +\xf2\xf8x\x98\xddZJ\xf59)l\xa6Q\xf4\x0b?\ +\xde\xba\x95\x02\xef&q\xf3s\x7f\xfd\xb0K\xff\x0a\xb0\ +|\xfat-\xa8NT\x19\x199J\xb9\x5c\x06L\x13\ +u\xbb\x8fhw\xdaD\xd1]\x0d\xac\x01\xab\xcf{\xe9\ +?\x0d\xe4~[\xce\x00/Yy\x0b\xd8\x02nb\xaa\ +%9\xc8\xc1\xbf\xe0\xe6\xfc\x9b\x04\x1e;o\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x00\xbf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x04\x08\x06\x00\x00\x00\x87\xb4\xbf\xec\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\x86\x88\x04DT\x10\xab\xb3\x10/\xd9\ +\x1bg\x96[\xb9\xdb\xc4\x81\xbd\xd9\xf9\xe6\xfbv\xe7f\ +\x07!go\xcd\xf5\x99a\xa8\x8f\x00a\x0b\x08V\xb3\ +\xd4\x03\xfbn00g\xd5\x9b\xfbOGG\xb7yi\ +m\xb4\x88\xe8\x82\xe3i\x87\x15n\x9f\x83\ +\xf4\x89Z\xbe\xbe\xfd\x90\x89`B\xa1\x0b\x8a`\x89o\ +\x5c\xf4\x84$\x5c\xabq\x89\xe7\x9d\xc6.\xef/y\x94\ +\xa6\x1c\x96\xf7|\xea\x97B\xdc+\x8c\x9c#\xfc\x0d9\ +P\x93\xbbYc<\xe1\x83\x1e\x09\xa8\x17\x0c\xd2\xd3\xfc\ +\x90\xff\x02\xce\x94vS\x82\xbcEV\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x00\xb9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x04\x00\x00\x00\x10\x08\x06\x00\x00\x001\xb6\xde\xf3\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x006ID\ +AT\x18\x95cTTT\x8ca``0```\ +``dd<\xcf\xc2\xc0\xc0`jii\x99\xc7\xc0\ +\xc0\xc0p\xfc\xf8\xf1IL\x0ch\x80\x11]\x0b\x86\x8a\ +!l\x06\x00(.\x19\xbd[*\x0a\x09\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01\x07\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xc1IDAT(\x15c`\x18(\xc0\x88n\xf1\xcc\ +\x993E\x18\x19\x19k\x80\xe26\xff\xff\xffW\x07\xb2\ +o\x02\xd9G\x80\xec\x96\xf4\xf4\xf47\xc8\xeaQ4\xcf\ +\x9e=\xdb\x01\xa8h\x05\x10\x8b#+\x02\xb1\x81\x86\xbc\ +\x04\xe2\x88\xd4\xd4\xd4\x0309\xb8f\xa8\x8dW\xb0i\ +\x84+\x06\x1a\x00\x94\xd7\x81\xb9\x80\x09I\xa2\x06\x9fF\ +\x90:\x90<\xd4K`mp\xcd@\x9e\x0dX\x840\ +\x01W\x07\xd7\x0c4U\x9d\xb0>\xb0\xedpup\xcd\ +\xd0P%\xa8\x1fY\x1d\x5c3P\xd7\x11\x82:!\x0a\ +\xe0\xea\xe0\x9a\x81\xcen\x01\x9a\xfa\x12\x9f\x01 y\x90\ +:\x98\x1a\xb8fP\xf0\x03%#p\x19\x00\x12\x07\xc9\ +\xc3\xa2\x09d\x00<\x9ea\xa6\x91\x92\xc2`z\xe8O\ +\x03\x00C\xedR\xe3\xd8\xa3\xb3\xa5\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01\x02\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0b\x08\x06\x00\x00\x00\xa9\xacw&\ +\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x00\ +\xbcIDAT\x18\x19u\x90]\x0a\xc20\x10\x84\x9b\ +\x5cJP\xf4Y\x14\x8f\x91\xb4\x07P\xd4\x1bT\xf4\x00\ +is\x0d\x15\x9f\x15\xaf\xd58S\x18I\x8b\x06\x96\xdd\ +\xee|\xfb\xd7\xa2\xc0\x8b1\xce\xe9\xff=\xe9\x86A\xd7\ +u\xcf\x94\xd2\xa1\xaa\xaa\xd3\xb8 \x84\xb07\xc6\xd4\xd6\ +\xda\x85u\xce\xbd\xf0\xb1c\x82B\x0e\x0b\xa4\xdes\x12\ +\xdb\xb6\xdd\xa2\xfbY\x13r\xd0{\x7f!g\x04\xd3\xab\ +\x00\xe1\x03\xb6dG\x81\xd4\x070\x13(\xb8\xa1\xfb\x0a\ +\xe0\x1d\xe0\x9a9=\xab\x80\x9e\xa3\x09\xc2\xae\xf4\xe3\x1b\ +\xbep\xbe#\xfe\xca\x86+\xc0\x06G\xf7k\xe4`\xbe\ +cv\xc3\xb1,\xcb\xda 1\xc5\xc8\xf7\xf8\x18\xad\xa7\ +\x02\xe8\xb3>\xd74\xcdD\xe2//\xfd\x03\xa1\x0cs\ +q\xd5\xccH\x8c\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\xa9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01&ID\ +AT(\x91\x9d\x93\xbdJ\x03Q\x10F\xcf]n\x9a\ +\x94f\x95\xb54o \x11\xf5%,\x95\xc4:M\xde\ +`\xcb[\xa4\xc8#\xa4\xd8>\x8a6\xfa\x12\x0a\xae>\ +\x82\xb1J\x11\xb4[R,\xd9\xf9,dE\x04\x7f\xb2\ +\x07\x06\x86a\x0e_3\xe3\xf8B\x08!*\xcb\xb2\xef\ +\x9c\x1b\x00= \x06^\x81\x1c\x98\xb5Z\xad\xcb\x10\x82\ +\xd5\xfb\xaen\xd24\xed:\xe7\xae\x81}~\xe6I\xd2\ +\xe9d2y\xfe\x94\xd34\xed\x02\xf7\xc0\xf6/b\xcd\ +\xd2{\x7f<\x1e\x8f\xe7.\x84\x10\xadV\xab\xfc\x8f\xc4\ +\xef<\xb6\xdb\xedC_\x14E\xdf9\xb7\x89\x08\xd0+\ +\x8a\xe2\xccK:\x97\xb4\xa1\x0b\xc0\xc0K\xea51\x81\ +\x03/i\xab\xa1\xdc\xf1f\xf6\x06\xec6\x90_#I\ +\xb9$6-3{\xf0\x92f\x92N\x1a$_D\x9d\ +N\xe7R\xd2\xd3\x86\xc9y\x1c\xc7W\x0e`4\x1au\ +\x81;`\xe7\x1f\x89KIG\xd3\xe9\xf4\xe5\xf3\xb6\x87\ +\xc3\xe1\x9e\xf7\xfe\x8a\x8f\x87\xf8\x89|\xbd^\x9feY\ +6\x07\x88\xeai\x96e\xf3$I\x0e\xab\xaa\x1a\x98\xd9\ +\xad\x99-\xcc\xac4\xb3EUU7\x92\xfaI\x92\x1c\ +\xd5\x22\xc0;\x1a(\xcb\xdc\x81\xe7hA\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x00\xdf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00?\x00\x00\x00\x16\x08\x06\x00\x00\x00w\xfcD!\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x00\x81IDATX\x85\xed\ +\xd81\x12\x830\x0cD\xd1\x95\xe4\x9aq\x8a\xd0\x13\xee\ +\x7f1\xd2\x92\x98\x19\xb0\x9d\x82\xc9\x15\xacb\xf5N\xb0\ +\xbf]Y^k\x07\x99d\x86y~\x22\x01@\xbbN\ +\xef=C\x9d\xb5b\xdb\xdew|\xce\xd9{\xcfP\xad\ +5\xec\xdf\x02\xf5\x1e\xe2A\xf5\xce\xa6\x8c\xff\x8bxV\ +\x11\xcf*\xe2YE<\xab\x88g\x15\xf1\xac\x22\x9e\x15\ +u|R\x11\xf4\xceu\xe3]\xb5\xc2\xcc\x90 \x82O\ +9\xbc\xf7\x0c\xa5\xaax\xe4\x09?\xca\x0e\x19\xb9\xbeZ\ +;?\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xbc\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\xb9\x00\x00\x00\x0a\x08\x02\x00\x00\x00g\x91h\xd0\ +\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xe0\x06\ +\x1b\x0f\x01\x06)\xecGU\x00\x00\x01[IDAT\ +X\xc3\xedX\xbbN\xc3@\x10\x9cq\x1c\x14\xe2@C\ +\x015\x0d4@\x05\x12\x82\x0f\xa1\xe0\xe7\xe0\x8fh\xf2\ +\x11@\x0ad\xb0\xa28\xbe\xa18\x9f\x1f\x89\xb0\x13\xa4\ +P\xa0\x9d\xc2\xb2\xec\xb9\xdd\xd9\xf1\xf9\xee\xb4\xbc\xbd\xbb\ +O\xd3\xd49\x07\x00\x10\x00\x80\xe1\x9e\xe1\xfa\x0b\xac\x0f\ +\xec\x0d\xd8$\xfcD\xeb\xd6\xd3\xabv\x93\xa2\xbaSo\ +U\xc5V\xda6\xd4\xac\xf0\xfco\xb2T\xf3\x01\xf1\xec\ +}\x96MN\xdd\xe8\x08\x06\xc3\xcf`1\x8f?\xce\x1e\ +\x17'7\xe6\x85\xa1\x1b\xe3\xe9s\xb48\xbe6#\x0c\ +}\x1b\x94\x1b\xbe\xbdD \xcd\x0aC7\x06\xd9\xeb\x88\ +ydF\x18\xfa\x0f+\xf9'\xc9\x88\x8b\xd4\xbc0t\ +\xc3\xed\x1d.\x8b\x22N\xa6O\xf3\xf3\x07\x17'\xff`\ +O\x05m\x99\xdc\x0d\x86I\x1e\x8dxqy\x95e_\ +\x84\x9dZ\x0c\x9dK\x8b\x14'\x07\x93\xfd\xf1\xd8\xb9\xa2\ +\xd1\xc5! \x81\x0c\xfd\x19\x09 \x09\x09 ((t\ +m\xa8\xba}'\x82\x92j\x06@\x01>J#x\xfd\ +R\x00\xd5\x9a\xa4\xadN\x12\x01\x84\x5c\x5c\xa1\x89\xf2\xb9\ +\xc9\xa0\xd0\x0f\xf1\x83\xaa\xf1(EW1\x09\x95\xb5\x95\ +A))\xa8o\xfd2^\xbbB\xd0\xba=\xd5nw\ +\x09\x80HV\xa9X2\x05\xb1Q\x03j\xe3\xc8R\xbb\ +g\xae[\xeaY\x90\xbc\xc2\x95\xcfQ\x19\xbe\xfb,e\ +\x85\xd1`\x90/\xf3o\xb1\xc7\xbec\xc4\xc3\xb2\xa3\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x010\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xadID\ +AT(\x91\x9d\xd3\xbbm\xc3@\x10E\xd1\xa7\x0d\x5c\ +\x83BSM\xe9\xd3\xa0\x1d\xfaS\x86>]H\x02\x0d\ +\xbb\x00:9\x0eD\x02\x92@\x98\xf6\xded\xa2\x8b\x99\ +\xd9y\x9b\x5c\x81\x82\x0d\xdeq\xc2w_\xdf\xb0F\xc9\ +\x18X\xe0\xe0w\xf6X\x8c\x89\x1f\x13\xe2@\x8b\xe6z\ +\xd4\xa9\x8e\xf7\xecP\xd2\xefX\xc3\xaa$\xd9\x8c>\xc2\ +4\xeb\x19\xceI\xe6\x15\xf2i\x86.\xc9C\x85\xdc\x95\ +$_\x15b\x92|\x96$\xbbJy[\x92\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Group 21 C\ +opy\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +polygon id=\x22Comb\ +ined-Shape\x22 fill\ +=\x22#222222\x22 point\ +s=\x224.71685208 27\ +.3162691 6.78569\ +864 29.4075399 2\ +0.3222509 16.012\ +0555 6.78569864 \ +2.55992502 4.716\ +85208 4.66722318\ + 15.8741367 16.0\ +120555\x22>\x0d\x0a \ +\x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\ +\x00\x00\x01\x03\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xbdIDAT8\x11c`\x18h\xc0\xf8\xff\xff\xff\ +\xf3@G\xc8\x13\xe9\x90\xcb\x8c\x8c\x8c\xf6(j\x81\x06\ +\xf8\x01\xf1/ &\x04>\x03\x15\xd8\xa2h\x86q\x80\ +\x12\x01@\x8c\xcf\x10\x90f\x1b\x98z\xac4PA\x10\ +\x10\xff\x06bt\xf0\x05(`\x07\xc4L\xd80\x8aa\ +@\x05!@\x8cl\xc87 \xdf\x11\xa4\x08H\xd7\x02\ +1:\xa8E1\x00\xaap\x0b\x92\xaa9\xc8\x0a\x80\xe2\ +\xc8\x86\x805\xb3 +\x80\xb2\xff!\x89!\xb3\x19\x80\ +1\xd0\x0c4\x04,\x0db\x83\x18\xd8\x0c@\xd2\x8f\xc9\ +\x84i\x84\xc90\xc1\x18\xe4\xd2\xd8\x0cx@\x8aa\xd8\ +\x0c(\x02\x1a\xb0\x92XC0\xc2\x00\xe8\xc7?\xc0\x80\ +\x8a\x06\x1a\xf0\x05\x88\x9f\x12k\xd0\xc0\xa9\x03\x00\xda\xad\ +\xe4L\x94\xc6\x1eG\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x00\xac\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x04\x08\x06\x00\x00\x00\xb3\xcd~\xf0\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00)ID\ +AT\x08\x99c\xf8\xff\xff\x7f\xf9\x7f\xdc\xa0\x9e\x81\x81\ +\x81\x81\x01\x87\x22\x88$\x0c\xa0)B\x95DR\xd4\xf0\ +\xff\xff\xff\x06d1\x00\xa5\xbaK\x9b\x88\xa03\x88\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00j\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0e\x00\x00\x00\x02\x08\x06\x00\x00\x00h\x8a\xed\xaa\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x00\x1cIDAT\x08\x99c\ +TRV\xf9\xcf@*\xf8\xcfP\xc1\xa2\xa5\xadM\xba\ +\xbe\xff\x0c\x0c\x00\x16\xc3\x05c\xb0\xd3\xa2<\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x00\xca\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x04\x08\x06\x00\x00\x00\xb3\xcd~\xf0\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00GID\ +AT\x08\x99e\x8c1\x0a\x80@\x10\xc4r\x9d\x0f\xda\ +\x97)\x87\xa5 \x88\x22>-\xf7\xa6\xb5\xd0B\xbc\xe9\ +&\x13\xa6\xa8#\xb0\x01\x03}\x96\x02\xa0\xce\xc0\xf1\x1b\ +\xd7\x88x\x04\x80\xd6Z\xcd\xcc\xf3\xadWD\xd4\xeeO\ +\x9d\xd4\xfd\xcbn\x83\xc2\x16\xa8\x9f\xa6\x10T\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x00\x8c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x05\x08\x06\x00\x00\x00x\x91\xadU\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x00.IDAT\x08\x99c\ +8s\xe6\xcc\xff3g\xce\xfcg\x80\x02t>VA\ +d>#\xb2 \x03\x03\x03\x83\x89\x89\x09#2\x9f\xa0\ +\x09\xf8%\x19\x18\x18\x002\x99=\x95c\x8a\xfb\xa5\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03u\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x03_\ +\xd2w\x9d\x01_\xb4\xf3\xd9\xf7\x97\x11|\x0c\xdc\x1f5\ +\x07nrx\x88s\x09b\x8d\x9e!1\x1b\x86\xcb\x18\ +\x86\x99\xb1\x5c,\xb9x\xf9\xc2\x80O\xda\xf9lZ\x13\ +\x1c\x01\xa7\x07\x07\x07\x93+W\x0e3\xe06x\x0dX\ +\xb9\xb5\xd5_.\x17\x5c\x5c\x5c,\x80[\xed|v\xe6\ +\xf3\xcc\xd7!\x84\xc9x<\xc1\xcc\xf2\xa3\xea=\x09\xc7\ +R\x82\x8dz\xdc6\xec\xc6\xe3\x09!\x84\x09\xf0m\xf1\ +\xe0m\xa0\xbdz\xf5\xbaw\xceU\xaa\xb6\xd5\xd5\xcd\xf2\ +\x8c\xcb\xfem\xda\x9a\x19\xe7\xe7\xcf\x04\xdc\x0c\xc0\xed\xfd\ +\xfd\xc6\x978\xa6,\xaa\x22\xb9<\x14\x09\xbc\x0e\x9f6\ +l\xf6\xf7\x1b\xdfu\xab\xdb\x018i\x9a&\xd7vN\ +\xe2\xa5\xb1\xb7\xad\x9e\xed N\xadi\x1a\xbanu\x12\ +\x80c\xef}\xc6\xdd^TW\x0f\xe0\xaa\xfe\x06\xe8v\ +X\x0d\xef\x1d\xc0q\x00\xde\x00\xb7\xde\x9d\x9b\xc0\x06\xe6\ +\x06\xe0\xb5\x97J\xc3\x1bd\x1a\x96\x00\xcey\x80\x1b\x01\ +@\xb6\xe9\xbe[\x93dUVyU\xd9\xca\xc0\xb9!\ +_i\x8b\xa4<\x9a\x92]\x00\xfe5\xc5\xb7\x1c.\xd5\ +\x86\xb3\xad}U6\x96\xa5\xa9\xcc\xe3\x94A+\x8fK\ +m!+3\xffx\xe04\xc6\x98j\x1aA\xa9s\x0c\ +)\xf7\xcd0\x192\x922\xa5}\x22\xb3\xf4\x88\xcaF\ +\x98\x89>\xf6\x00O<\xf0k\x8c11f\xc3\xb2\xb0\ +\x90\xa1\xacq\xbd\xf9Rx,\xbf$19\xd9\xca\xeb\ +c\x04x\xe4\x81i\xdfw\x92\x84H\xaa\x92BC$\ +Uf\x02)\x91YR\xc9\xda\xdb\x9c\x0c\x03)\x0b\x00\ +\xfa\xbe\x130\xf5\xc0S\xe0a\xec\xbb\xcaMK{\xad\ +\xa8\xc9\x8a\xa5\xe1\x98\xd0\xda\x13\xe5p\x09\xcb\xb5\x14\xbb\ +\x15\xc0\xc3v>{Z\xce\xa2{}\xec\x17VB\xf5\ +\xcaY\xa4\x14\x1e\x12IBN\xe0(y\x9a\x22hH\ +=}\xec\x17\xc0=\x80Bp\x06\xdc\xed\xfa\xce\x14S\ +\x98\x8c\xa22\xbfc\x98\x06R!(6%\xe9\x8a\xe5\ +N\xb8[n\xb7\xbdk\xd7\xae\x97\xb2~\x02\x9c\x9b\xe9\ +}\x5c>\xf6\xf2\x0dS*\xd7\xe5\x1f+\x97gu7\ +\xa4\xc4\xf6\x06|\xd9\xceg?\x16\xd0\x9a\x00\xe0w\xe0\ +\xb1\x99>\xc0\xdc(\xd10\xec\x0b\xea\xee\xf0+\x09S\ +\x5c\x00w\xda\xf9\xec\x87\xda\xd6\xf3j\xfb\x058\x96\xc5\ +\x071v\x92bN\xe4p\xeec\xa9,%\xa1\xd8\xcb\ +L\x0fH\x17\xcc\xcf\xdb`\xbb\xbe*J\xab?[n\ +\x01o\xe6\xf1\xbf\x81S\xe0\x11\xa9Z\xda]\x00\xff\x01\ +~w\xa3\x97\x83\xd5^\xe2\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x053\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Search\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\ + \x0d\x0a\ +\x0d\x0a\ +\x00\x00\x03\xc4\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a <\ +!-- Generator: S\ +ketch 57.1 (8308\ +8) - https://ske\ +tch.com -->\x0d\x0a \ + Icons / \ +System / Window \ +Controls / Close\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x03\xc2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Window Co\ +ntrols / Close\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\ +\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x02\xb3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x02zIDAT8\x8d\x8d\x94Mk\x13Q\ +\x14\x86\x9f{\x9b\xc4J?\xa05\x11\x84\xa25)H\ +\x13;\x93\xd4E\xff@E\xa8\x7f@p\xa5\xeb\xee\xbb\ +p-\xe8\xbe]\x8a\x0b7n\xa5\xb8\x10qW\x17\xdd\ +\x18h>l\xc8d\xa8\xd6\x85\xa15XSK\xc7\x99\ +\xdc\xebb>\x92\x89)x`\xee\x99s\xe7\xde\xf7\xbc\ +\xe7\xbc\xcc\x117\xb39F\xd8\x0d\xe0\x01\xb0\x06,\x00\ +i\xe0\x18h\x01o\x81\xd7\xc0\x17\x00\xbbeE\x97\xc4\ +\x10\xd8e\xe0)\xb0n,-%\xe7\xe6\xe6\x98\x9e\x9e\ +b||\x9c\xf3\xf3s\xba\xdd.\x87\x87\xdf\xd8\xabT\ +\x5c`\x0bxb\xb7\xac\xb3Q`\x19\xe0\xdd\xedB\xa1\ +\xb4\xbc\x5c\x02@)\x85\xd6\x80V \x04R\x08\xc4\x98\ +\x04\x0d\x9f\xcae\xaa\xd5Z\x19\xb8g\xb7\xac#\x00\x19\ +\x00\xa5\x80\xed\xa2i\x96J\xa5\x22\xae\xe7\xe1\xba\x9e\x0f\ +\xa6\x14\x1a\x8dR\x9a^O\xe1\xfe\xf1p]\x97R\xb1\ +H\xd14K\xc0v6\xb7pi\x10\xecy~qq\ +\xa5P\xc8\xe3y\x1e\x01\x1d\xb4\xd6h\xb4\x1f\xfao\x80\ +\x06\xc0\xf3<\x0a\x85<\xf9\xfc\xe2\x0a\xf0,\x04\xbb\x0e\ +\xac\x9b\xa6\x81Rj\x94\x18\x17\x9aR\x0a\xd30\x00\xd6\ +\xb3\xb9\x85y\x09<6\x0c#\xa1u\x98\xd5gD\xc4\ +CC\xc408\xa3u\xc0\xcf7\xd34\x12\xc0\xa3\x04\ +\xb0z5\x93\x06\x82\xea\x02\x0bK\x8bVM\xfc\xcc\x00\ +`&\x93\x01\xb8+\x81\xec\xc4\xc4$\x03\xed\xe8\x03\x0e\ +\xf9\xfe\xbe\x8e}\x9d\x9e\x9c\x02\xb8\x95\x00\xae\xa4RI\ +\xa2<\xff\x0d\xd8_\x93\xa9$\xc0\xac\x04~8\x8e\xe3\ ++\xa7\xe3\x0a\xf6\xf7\x82\xb2\xb4\x8e\xfc\xe0\xe38\x0e@\ +G\x02\xf6\xe9\xe9\xef\x11iul\xe3\x22\x86\x00\xddn\ +\x17\xa0!\x81\x0f\xedv\xbbO\x5c\x13c\xc6\x00\xbb0\ +\xf6\x15\x0d\x9c\xd6\xb4\xbf\xb7\x01\xdeK\xe0E\xad^\xf7\ +z=5 \xfdpW\xe2q\x94\x10\x8dR\x8aj\xbd\ +\xee\x01/%\xf0\x15\xd8\xdc\xabT.\xee\xfe?\xb0}\ +5\xfd{l\xd9-\xeb \xfc\x9d6\x9aMk\xb7V\ +\xfb\xd2\xe3\xe8\xc0N4\ +\xb0~y\x01\xcfNk!$\ +\xd9\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x13\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x90ID\ +AT(\x91\x8d\x93\xb1n\x13A\x10\x86\xbf\x99\xb5\x10\ +\xc1\xae \xa4H(\xc0A\x01\xd1 c;\xb1\x84(\ +Q\x1e\x00\x19\xc5\x14\xbc\x00\x05m*\xb4t.x\x0f\ +\x0b%<\x80\xeb4\x91/!T\x09\x8a\x84A\x224\ +\xd6\x91\xca\x8e\x88\xb1w(\xc0\xd6\x9duQ\xf8\xab\xdd\ +\x7f\xe6\x9b\xd9]\xed\x08Iy\xd3\xd5~w\x03\xa1\x81\ +P\xc6\x98G\x881\xf6\x80V'_|\x8f\x970I\ +\x97\xc9\xa2\xbay\x5c\x94\x90\xdb\xc6\xac\xc4\x052\xf8\x88\ +\x1b\xd7\xa3\xe6Jw\x0aW7\x8f\x8b2v\xbb\xc0\xcd\ +\x8b\xc0\x84z\x98\xabu\xde\xdd\xfe\xaaxS\x09\xb9\xed\ +\xff\x04\x01\x16\xd0\xf1\x16\xde\xd4\xadV^6\x80W\xc9\ +\xa8\x08\xd2\xe3\xe8\xc0N4\ +\xb0~\x0d\x0a\x0d\x0a \x0d\x0a \ + Search\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x01\xf3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x02\x00\x00\x00K\xd6\xfbl\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x01\x88IDAT8O\x9dTIr\ +\xc20\x10\xf4W\x82\x81\xdcBQ\x857I^d\xe4\ +\x14\x17\xf2\x86\xfc\xff\x15\xe9\x9e\x91m\xd9U9@{\ +\x96\xee\x19\xb9\x8b\x83pf\x9d;\xe4\xc7\x8fC\xfev\ +d\xe7\xf3\xe7=\x84\xdfw\xf1|\xfed\xf9\xf14x\ +?M\xd37R!l\x95{\x0e%\x81\xe7{z<\ +\x1e\xb4pm\x1b\xb0Djh\x99e\xca\x85\xea\x94]\ +\x06\x93X8\x17\x00lR\xa4r\xbb\x12\x93\x99\x86 \ +\x16\xd6\xdd\x81\x80\x081R\xb9\xe1\xd2\xd8\xf9\xa8\xa6\x85\ +\xb5\x96\xe7\x88q\x1c#\x13\xa4r\xb7ZA\x0bc,\ +\xd68\xa2\x10\xb6\xca-W\xe0\xc5H\x90\xb4h\x8c\xf1\ +~\xf4\x92lD*W.\x12\x0d@\x91>z\xb5h\ +\xbc\x1f\x86\x01\xc9\xeeQS\x99\xf2HtN\xa0\x8bE\ +\xd3\xe0\xd4\x0b\xe8cW\xd0\xa2\xae\xeb\xbe\xef\x07d\x82\ +T\xae<2i3\xa7EU\xd5]\xd7\xf3\xe9;\x82\ +5\x91\xfb\x95\x14\xbeL\x0e\xc0\xe2XVU\xdbv\x1d\ +\xb2]r#\x17\x8e\x17\xa4rF\xc8@-J\x1c\xc0\ +5\x8fE\x90\xca\x0dG\x97\x9cG.\xc3?\xbd,K\ +\xdcq\x01\xd7\xa8\xc2\x01\x95\x8a\xddJ \x8a\x16\x05,\ +\xf0\xd9PX\x87\xcb\x9a\xca\xcd*\x122\x16\xa4\xb3b\ +Q\x14\x10+p[\xff\x07wF*\xc1\xa3\xb4\xb8\xdd\ +\x0ar<\xac\xb2Me\xc2\x09\x1dE\xf0d\xb40\x06\ +\xb7<&k\x22\xb79\xb7\xa54&;\x9d\xcf_\x97\ +\x0b\xae\x06\x22B\xb8J%K`\xc5\xed<\x07\xbb^\ +\xafYQ\x94\xf8!\xbb/\xea\x0bq\xc8\xff\x00{\xd3\ +V\xf4\xcf\x11\xefU\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x02\x22\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x01\ +\xdcIDAT(\x15mS\xbfO\x14Q\x10\x9ey\ +\xf7\x83\x04V\x0a$6\xd0Aa\xa1\x95!\xe1G\xa1\ +\xdcA\xc3_\x804@\x8cR\x12\xed8.\xc4\x18\xee\ +\x12:(\xd5\x04B%\x84\x96\xe2\x0aX\xa4@\xf9e\ +E\x8b\x09\xb1\xa2\x00L`\x95\xe2\xee\xde\xf0\xcdf\xdf\ +f!\xf7\x92\xdd\x99\xf9\xe6\xfb\xee\xcd\xcc\xce158\ +\xafJ7\xcf\x0c\x9b>\x12i#\xe6+S\x93\xfd\xad\ +9\xef\xe4!\x95\x93@n\xfe\xba\x9f\xd8,\x02\xebI\ +\xe2\xea\x83x,b\xa7\xfdb\xeb\x0f\x97\x8b\xc5\xf9r\ +0.B_\x91\xc8\xb8d\x03[e\xa6\xb7\xdb\x05o\ +UsF_z#\x84_\xe0:\xe1\xa1\xb14lL\ +\xba\x8b\xc4\x0e\x00_S\x1eNFya\x85\x08Bq\ +Tj6L\x13\xfd\xb1\xd5\xff\xf9\xdb\xec\xed\x81\x95\xda\ +\xcbT&u\xe6\xcfz\xafIh3\xcag#>\x99\ +\xa1O\xc1s\x80q\x8f\xe8c\xfd\xfb\xc7'AS\xad\ +y\x01\x82\xe5z\x8d\x8a*B\xb9[\x91XM\x8f\x0e\ +5m\xd3\xdc\x8b\xa9\xc68\xbc\xb1\x5c)\xc8\x11I7\ +\xc0\xaa0U4)$O\xc3\xb1EL\xfd\x1ai\xc0\ +\x8f\xa3\xd8\x99\x0e8\xfa\x08\x1b\x1a\xf1gZ*\xf9\xd2\ +\xcd\xa8\x10\xbfq\x04\xb5\x22\xd2\x8e\x9e\xf92\x09:\x1f\ +7\xeen\xcfx\x15T1\x01\xe17\xe0n\x98!\x85\ +\x99/\x8c.\x80\x13$-\x0b5\x0f\x96\xfe\xbd\x03\xf6\ +>\x89;_uF7G\x17\xc0\x81\x09{\xcab\xff\ +\xa2\xd9\xf3\x04\xe6\xdc#\xd5\x85\x9f\x0a$\xfd\xf5\xba\xcb\ +\x84\x96\xe9\xc4/>\xda\xc0\x98\x7f\xdf\xc3\xc13b?\ +(\x16oX\xae\x1cL\xe2\x96\xcf\xc0\xa2\xde\xf8TX\ +\xceP>\xa6L\x9dJ\xc6\xa9B1\xe5\x17\xbc\x15\x0d\ +b\xb1\x06\x83\xe5\xeb\x01\x16\xb3\x04\xf7\x85\xc6\x0f\xce/\ +a;\xbdSh\xdds\xf8=\xb1\x03uq\xea)\xee\ +c\x966\x11\xbeJ\xd5\xe5g\xa3\x7f\xd5\x1d; \xa7\ +\xb8\x13\x92\xf3}\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x00\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x04\x00\x00\x00\x10\x08\x06\x00\x00\x001\xb6\xde\xf3\ +\x00\x00\x00MIDAT\x18\x95cTTR\xf6d\ +``\x98\xcb\x00\x01\xc9\x8c\x8aJ\xca\xcf\x1c\x1c\xec%\ +\x19\x18\x18\x18\x0e\x1c8\xf8\x9c\x85\x81\x81\x81\xe1\xd7\xaf\ +_P\x05\x0c\x8c\x8c\x8aJ\xca^P-\x7f\x19\x18\x18\ +\xd2\x18\xff\xff\xff\xcf\x80\x0c\x98\x18\xd0\x00\xe3\x90\xb1\x05\ +\x00\x8f\xb3+\xe4\xb9\xb3\x94\x87\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01\xa8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0e\x00\x00\x00\x0e\x08\x06\x00\x00\x00\x1fH-\xd1\ +\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x01\ +bIDAT(\x15\x9dR\xb1J\x03A\x10}3\ +w\xd7j\xa3\x95\xa5h\xc4B\xfd\x05\xb5U\x9b\x10!\ + \x82\xb6\x22H\x1a\x1b?B\xc5\xc2&`\x11H!\ +i\x844\x829\x15[\xfb\x10\xc4Nl\xac\x92.w\ +{\xe3\xec\xe5\x16\x96@\x82\xb8\xcd\xdc\xbcyov\xee\ +\xed\x10\xbcS\x8d\xabs\x89\x845\x08\xed\x80d\xd9\x96\ +\x08\xe8\x0a\xe4!\x22s\xdd\xdcl\xfe8\xba\xe2\xa3S\ +\xee\x1c\x94\x09\x5c\x07d\xd6ac\xb1\xaf\x0d\x8e[[\ +\x8d\x96\xc5s\xe1HD\xf7.\x1f\x13\xf8\xa9\xa8\xb8b\ +\xc5Ty=\x9a\x974\xfd\xd0\xea\x8c\xcf\x98\xf2\xdd7\ +\x09\x96X\xd2\xe4\xf4/\x22\x1d\xcd\x8e\xf8n\xb9A\x84\ +3&\xd0\xde\x94\xeeE\x89\x9aa\x96\x9e\xe8\xff\x079\ +\xa0\xe6\xb1\x00+S\x85\x22\x0d\x22\xae%\x1c>\xaa%\ +\x1b9\x97\xa4\xc4\x9e(#B\xec\xe5P'\xeeB\x93\ +\x9e\x8b\x98'\xc5\xd7\xbc\xdaPGE\xb7\x00\xbe\x0d\xb2\ +C\xf5\xf9\xd6\xe6:I\x9dA\x17i\x18Y\xd1j\xc1\ +q\xe13\xb4\x8f\xab#\xac+\xb2@\xc2\xcf\x99\x98m\ +\xe6\xe0E\x90\xbde\xe0\x8e6\xce\x17\xc1)\x8a\xd8f\ +\x93\xd0\x8d&}\x0b(i\x91)\x88a\xe4\x8b\x85\xe3\ +\x09\x22\xfb\x1c\x97Z\x03\xfe\xb3\x00\xb99\xf9&\x10\xed\ +k\x8f\x81m4\xe1\x0c\xdc\xd6\xd8z~\xa3#\xba%\ +WpW\xcd))>T\x97z`\xb4#\xa4W\xfe\ +\x92\xff\x02\xcc\xf9\x88,\xe6h\xea|\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01|\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xf9ID\ +AT(\x91\x8d\x921r\x830\x14D\x9fH\xee\x00\ +F3\xe8\x04\xd8F\x1d\x9c\x22\xbaE|\x8b\xdc\x227\ +r:HOE#\xa0v\xba\xe0Q\x9a\x98\x08\x22{\ +\xd8\xf2\xef\x7f\xab\xf9;\x12\xc7<\x7fqB\xbc\x03\x09\ +[\xe5\x5c/\xe0$\x0eyn\x11b\xb7\x19\xfc\x93\x8d\ +|p\x97\xa6\x0f\xb7W~\x1a\xf9\x861\x86B\xeb \ +Xh\x8d1\x86\xd4\x0bxJ\xe2\xf8\x0d\xe0\xebr\xe1\ +{\x9a\xa8\xaa\x8a\xe9ze\xe8\xfb\x05X\x96%\x1f\xe7\ +3m\xdb\xce\xf3g?\xfd\xb3i\x00\xa8\xaa\x0a\x80\xa6\ +\xae\x17`\xf3\xeb\x07\xe1u\x80\x94\x92,\xcb\x82`\x10\ +\xbe\x05H)QJ\xd1u]\x10\x04\x88B\xc3B\xeb\ +\x19TJ\xdd-\xf1\xdf\xcb\xeb\x1b\x8fE\xb1\xe8\xe0.\ +\x1c*\xc7\xef@\x00\xb5\x170\xc3I\x92\xdcm\xd5\x0f\ +\xb0\xd62\x0c\x03\x00\xe2\xb0\xdf\xbb\xdbR\x1c\xc7\x8c\xe3\ +\x18\xbc/\xe4G87\xff\x86G`\xc0\xb7\x91\x80\x93\ +\x1f\xb0Q\xd6\xc1\xeb\x0f\xf4\xc5z\x90\x0f!\xd2\xd2\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01'\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xe1IDAT8\x11\xd5\x911\x0e\xc2 \x18\x85K\ +\x0b\x89\xc6\x1b\xb8\xa8\x83\x89\x93\x04\xcb\xe6\xe8\xe6\xeah\ +\xe2Q4z\x13\x17'/\xa13\xed\x05<\x86v2\ +P\xdf\xbf4\x0c\xc0\xe0\xa4$\xa4\xf0\xbd\xff\x7f\xc0k\ +\x96\xfd\xfd`\xc6\x983cL&^\xd2\x94e\xb9\x8c\ +\xe9\x1c\xcd\xd3\xb6mS\x06\xcfX3q\x8e\xb9\xcb\xf3\ +|\x10+*\x8a\xc2\xc64\xe2,%\xfaZUU[\ +\xec\x0f>\xc3\xcdo\x94\xc1\x05P\xf9\x82\xbf\xc6\x13)\ +\x03M\x0c\xb5{|\x8e\xb4\x06\xbfs\xce\xd7\x94\xc1\x18\ +N3\x82\xa1\x01\xad\xcb@k}\x82\x095\xaf\xa8Y\ +J\xd9\xb0\xba\xaeG\xce\xb9~\xa8\x99\x18e\xa0\x94z\ +\xf8:L\x04\xcc\xde>\xfbz\xcd\x10\xce\x15\xd7\x5c$\ +\x1c^8m\x1e\xd3\xe97\x0e1'\xb1\x02\xf0.\x83\ +P\x0d\xc7\xe9\x1b!D/$\x12\xb3\xd6\xba\x98\xf6\x1b\ +\xfc\x033\x1dD\xb5\xb1\x05\x02\xde\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x05\xd9\ +\x00\ +\x00;\x93x\x9c\xed\x9b{l\x14E\x1c\xc7\x17D\x84\ +\xd6\x02\xc5DH\x0d\xb8.\x01yto\x1fw\xd7\xbb\ +\xdb\xdcm\xa9\xbd\xd6\x96p\xb5\x94\x12\xda\x0a\x91\xed\xee\ +\x5c\xbb\xe9\xdd\xee\xb2\xbb\xed]\x1b\xe4\x19\x08*\x1a\x8b\ +\x09\x12,&\xfe\x81\x89\x06HTb\xa4`\x10\x94\x87\ +6\xb6%1B >\xa2\xc4\x141\x02\xc6\x80\xfe\x01\ +8{\x8f\xf6z\x8f\xda\x04\x8c\xff\xcc${{\xfb\x9b\ +\xf9~?\xb33\xf3\x9b\x9b\x7f\xee\xa5\xda\x9ag\x0b\xf2\ +\x8a\xf20\x0c+\xa8\xae\xf2\xd7\xc1{\x91uM\x99\x0c\ +?\xdf[\xb6\xbc\x1f\xde\xa6jU\x8d\x06\x86\xe5?f\ +]\x13\xb0}=\xb31\xcc3 \xd77\x98\x0d\x81\xe5\ +\x9c\xa8\x86m\x82\xa46\x03[4\xacaV\xf1\x96F\ +5Al\x03&\xde\x0cZd\xc5G\x5c?v\x82\xc0\ +e\xc9G\xacv\x06\xe8\x80V\x0eZ\xe5\xaa.\x1d\xac\ +\xec\xaa\xa9\x17\xbb\xdaD\x8fD\x94\xf2y\xde(\x07\x0d\ +\xc2\xc0\x14\xf0h8\xa4\x18\x5c\xd4G\xc4|9\xf8\xdd\ +\x0aS\x04\x1ekb\xb6\xf9\x882\xab\x02o\x08\xd4\xe2\ +\xe5\xaa\x0ep\xa7\xcdI\x8a4\xcb\xe0.\x8f\x8dq:\ +<\x0cS\x8c\xb34c\xa7\x18\x9ab=$\xc3p\x0e\ +\x17\xc7\x94\xe0\x89B\xf0y\xf0\xd3\xabKA\xae\xce_\ +\x99\xc0\xc1'\x1f\xd1j\x9a\x1aGQ\x91H\xc4\x16\xb1\ +\xdbT\xbd\x85b<\x1e\x0fE\xb3\x14\xcb\x92\xb0\x05i\ +t*\xa6\x10%\x15c^\xdc$\xe9\xe3\x07\x86\xa8\xcb\ +\x9a)\xab\x0an=\x0b\xcdj\xbb\xe9#\x88<<\xa5\ +$\xde+\xac\x0d\x83\x14#1vp\x14\xa9\xa8\xa0Q\ +\x8c\x8d\xa6\xb2\x89$qX\xa3\xb5\xeb\xa1X\xd7$\x91\ +\x02!\x10\x06\x8ai@\x1d\x93U\xa7\xb5\xaa\xa6j\xb4\ +\xaa9\x90\xc3\xd59\xc1\xb0\xb7\x81\xc0\xd8\xfd\x0d\x87\xb3\ +*\x0d\xb3\xa2\xc3\x1c[i\xd4wj\x80\xaa\x03\x86\xda\ +\xae\x8b\xa0\xa2\x03\xbe\xca\xbclV\xa6\x1c\x0cfw\xb2\ +jr\xf6\x1dD\xe5\x1c2\xab&.\xe3Gt^\xf8\ +\xae\x5c\xb9\x0e\x04S\xd5\xebU5\xc4\xc7WYmr\ +\x8c\xf0\xf2r|\xe1jY\x91\xd4\x88\xb1\xc8K\xa5\xb7\ +\xcef\x04\xfc\xf0\xe2\xe1Rt\x914C2\xaez\x86\ +\xe6\x1c4g=\xba9\x9aN1\x89\xb7L\xf3\x08\xa8\ +\x92\x1c\xec\xcc\xf0prN7\x07\x17d\x8aGJ\xcb\ +t\x0f\x98:\x92`\x0a\xe3rIm\x9b\xe2#\x89\x5c\ +P\xd5\xc3\x82\xc9\xcba\xa1\x05P\x9a\xd2\xe2\xa5F\x82\ +)-\x87\x17\x14W\xae\x86T\x1dv\x0b\xf0v/\x95\ +-<\xba\x9f\x81\x00W\xad\x18\xa6\xa0\x88\xa0\xda\xcf\xc3\ +\x80M\x96%\x8eux\x80Ch\xf6\x90\xcdt\xb3\x83\ +tH\x0e\x17\xd9\xcc\x08\x1e\x92u\xb9\xdd.\xa7\x87\x15\ +\xd8\x12w\xac\xeb\xa3\xe5\x19\xd6~Ul\xb7\x12%a\ +-Ak\xc1)\xb0A\xa9\x04\x90\x0c\xeb\x0a\x92\xac\xdd\ +\xe1 \xddv7 i@\xbbX\xe0r\xb8\xd8`I\ +\xd2:E\x9ea\xfd\x9c.\xc3MN\x08\xdd'\x22\x8b\ +M\x06\xaaJ6\xe0b\xeb\xe4G-\xf5\xd8\xf6\xb3\x12\ +\xac\x1f\x1dMV\x84\xe4\xd8v\xa4\x09\xba\x01\xacd\xf3\ +\x11\xc9l#2\x04\x96&\x96\xb4\x9c Z\x1b\x19/\ +\xc6\x16\xa6\xe4\xa5FEs\xcb\xe4\xcc\x09\x1c\xdf\x10d\ +\xc8s3\x22\xad@\x19+\xa1RZ\xe561\xd4\xa0\ +\x19\x11tP\xd6\x02G\xfa_\xd2<\x9b\x22c\xa8\xa9\ +\xf8X\xff\x07s`\x08\x1d\xf77\x03\xe3K\xa1\xfb\x99\ +\x81\xb4\x8d\xe4\x7f\x99\x81\x11g\xb1UPZ\x80\xc4S\ +Ia20\xbeI\x8bGG\xe7S2G3\xf3\xcf\ +k\xfd\xfeX\xb9\x0b\xfb$\xc4\xe6\x86\xf1R\x19\xb1\xf4\ +\xf6\x0d\xd6\xfc\x87\xdacu.\x96\x86\x05\x1eThk\ +\xec2\xaa\xd3\xa5\x8dcK\x1b\xc7\x90\x8eT\xadRd\ +\x93g\x13\x92\xb4p\x8a\xca\xfa\x91\x8c\xef\xd7+\xe1y\ +\x0e\xf0%N\xa7\xdd\xe9\xa5\xd2\xc3\xe9\x8aZ9\x0aB\ +\x0d~\x19\xeeb\x86\xd5\x0f\xb6$\xa1I\xaf\xc8*l\ +\xcc%l\xcc\x10\xc6\xa7*\xe5\xe4\x15?\xd6Q\x89s\ +\x1d5w\xda\xe0\xdd\x9bw\xf4\xc2\x83\ +S\x8e\x14\xbe>\xf9m\xed\xd5\x81\xad\x97\x8a\xfa\xb5\xd9\ +K\x8e\x15_>C\xd8\x1d\x0f\xb1\x8b\xb6\xec\xbc}\xa1\ +\xfb\xc2\xce\xdee\x87\xdb\xb6w,\xc3K\x85\xfdG{\ +\xa5\xc1\x8dC\xf8\xf9\xa3\xdb\xaco\x1dC\x0b\x0b\x1d}\ +\x97\xdf\xcf\xdb\xb7\xe3\xf7\xf9[\x83\x9dO\xae*\xfb|\ +p\x9b\x7f\xb0\xf8\xfa\x81\xc5C\xfc\x919\x8f\xdb^i\ +\xbarr\xed\xaa\xda\xd2\xfe\xd35=o4M\xbdR\ +\xfc\xc7\x99\xe8\x9a\xf6\x96\xbd\x15\xd3]\xe7V\x9f\xbfv\ +\xe6b`\x0b\xc8_\x10Zq{\xe3\xd9%\xbd\x1f\xac\ +}\xda\xdd4\xa9o\x0f\xfd\x95\xbd\xa7\xffd\xef'k\ +o\xfd\xd8'>\xfci\xf4\xeeb\xb6\xf2\xe3/\xfa\xaa\ +w\xfc\xbc\xd9{p\xe6\x9f\x9b\xf2\x9b\x02\x1b\xa6c\xc2\ +9\x10\xf1]\xd9t\xdb\xfa\xdbluE\x8d\xff\xf03\ +\xeb\xb6\xfe\x03W\x9b\xb2y\ +\x00\x00\x010\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xadID\ +AT(\x91\x9d\xd3\xbbm\xc3@\x10E\xd1\xa7\x0d\x5c\ +\x83BSM\xe9\xd3\xa0\x1d\xfaS\x86>]H\x02\x0d\ +\xbb\x00:9\x0eD\x02\x92@\x98\xf6\xded\xa2\x8b\x99\ +\xd9y\x9b\x5c\x81\x82\x0d\xdeq\xc2w_\xdf\xb0F\xc9\ +\x18X\xe0\xe0w\xf6X\x8c\x89\x1f\x13\xe2@\x8b\xe6z\ +\xd4\xa9\x8e\xf7\xecP\xd2\xefX\xc3\xaa$\xd9\x8c>\xc2\ +4\xeb\x19\xceI\xe6\x15\xf2i\x86.\xc9C\x85\xdc\x95\ +$_\x15b\x92|\x96$\xbbJy[\x92\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Artboard\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x01\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\xb9\x00\x00\x00\x0a\x08\x06\x00\x00\x00\xe8\xf3\xff\x87\ +\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xe0\x06\ +\x1b\x0e:\x16\x09+\xd2>\x00\x00\x01%IDAT\ +X\xc3\xed\x99aO\xc2@\x0c\x86\x9f\x96\x03\x94\xa0\x06\ +~\x8f\x09\xff\xff\xc7\xb0\x98\x08\x06\x06\xc9\xcb\x07\x0e\x99\ +\xcb\xb2\xe0\xa2Q\xcf>_\xb6\xee\x9a\xb6\xd75\xcd\xad\ +\xb3\xe7\xd5J\x9b\xd7\x0du]sF\x80\xb5\xae\xe4\xfb\ +.\xd4ZS\x87n\x97N\xd3f\x9f\x0d\xf5\xf8\xee\xf2\ +q\xab\xfe-\xb6\x86\xeew\xa8\xbf\xcf\xee\xf5\xab\xfc\x7f\ +W,\xed5\x06\xd6J\xdf\xbb\xa0\xa3^\xcf\xfa\x93\xc9\ +\x84\xf9\xc3\x9c\xb4\xddny\xa9*\x90\x08\x82\x92x3\ +\xc3\xdcH\xf5nOJ#\xc6)\x81Yd&(\x03\ +\x89\xc3\xf1H\xbd\xdb\x93\x94\xdb\xfa8\xa5HLP\x14\ +\xe6\x8e\x00\xbf\x9ek\x82\xa0\xc8\x96\x8e\xa38\xa2\x04%\ +\xd7\xb8E'\x0f\xfeA'ww\x14\x93\x95\xa0\xc8o\ +O\xe1\xee\xa4\xfb\xd9\x8cj\xbd\xe6p8FV\x82\xc2\ +z8,\x1f\x9fH\xd3\xbb)\x8b\xe5\x22W>\x98Y\ +\x9e\xa7\xeb]S\x96E\x83\xe6\x0f\x22\xc9\xce\x92\x09\x13\ +\x08\xc3PV\xb1\x86\x0d\xcb\xcf\x94\xc7\x94\xba\x8e\xec\x95\ +mf\x07\xfa\x10\xe2U\xe7b\xe2\xe2_\x8dx\xacC\ +\xfe\xeb\xfb\x19\x1c\xbf\xfd\xa2X~8\x97\xe3Q\x02w\ +Nb\xdc\xc7\xdf\x22\x0c\x15\xb0\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x02\xd2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a arrow\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x01<\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x11\x00\x00\x00\x16\x08\x06\x00\x00\x00&hwB\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc2\x00\x00\x0e\xc2\x01\x15(\ +J\x80\x00\x00\x00\xd1IDAT8O\xed\x94]\x0b\ +\x820\x14\x86\xcf6\xed\x03?\x92\xc2\xee\xcb\xba\x8b\xfa\ +\xff?B#\x89\xfa\x1faI\xa8[\xceM\xa4r\x85\ +\x8bn\xa2\x07\x0e{\xcf\x0b{\xd9\xd88h6\x0f\x18\ +hB\x08\x81\xa9\xefC\x15B\xf3L\xda\xdd@\x08\x83\ +\xd1\xeb\x89\x10\xd7\xb6\xa4\xdd\x0dJ)$\x97\x14\xb0\xec\ +\xb5\xc0Xl\xff(\xa4\xe6\x1f\xf2\x8c2\xc4r<\xb0\ +Gcp\xbcIU\x5cs\xaf\x0d\xe5?Y\xad7R\ +5\x14y\x01\xc7\xc3^v\x82SrV\x9fd\x1bE\ +R5\xc4\xf1N\xaa{\x94!\xa6A \x0cC\xd9A\ +\xa5\xb9\xd7\xc6\xdbo\x9f^3@\xe5:\xe8\x9b\xc2x\ +\xe0\xe5uj\x86\xe5fU@\xcdw\x9f\xb8\x0b\xbf\x16\ +\x82\x11\x02\xc6\x98Vey^\xcdY\x14,\x96\xda\x83\ +\x9aO6\xcfu\xe0\x06\x12\xd2X\xe3cfy\x05\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\x8c\ + \ +\x0d\ +\x0a \x0d\x0a \x0d\x0a <\ +/path>\x0d\x0a\x09 \x0d\x0a.loader{\x0d\x0a m\ +argin: 0 0 2em;\x0d\ +\x0a height: 100px\ +;\x0d\x0a width: 20%;\ +\x0d\x0a text-align: \ +center;\x0d\x0a paddi\ +ng: 1em;\x0d\x0a marg\ +in: 0 auto 1em;\x0d\ +\x0a display: inli\ +ne-block;\x0d\x0a ver\ +tical-align: top\ +;\x0d\x0a}\x0d\x0asvg path,\x0d\ +\x0asvg rect{\x0d\x0a fi\ +ll: #4AA1C7;\x0d\x0a}\x0d\ +\x0a \x0d\x0a \x0d\x0a\x0d\x0a\x09\x0d\x0a\ +\x00\x00\x00\x9f\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x04\x08\x06\x00\x00\x00\x87\xb4\xbf\xec\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x00QIDAT\x18\x95\x8d\ +\xce\xb1\x0d\x800\x0c\x00\xc17b\x08D\xe9qh\xc9\ +\x06\xac\x85W\x00:\xa6I\xc1 \x8ei(#\xe1/\ +\xafzQ\xd5%\x90\x1d\xa0\x09\xdbS\xeb\x0d\x90\xf51\ +\x10+e\x9d\x9a;\xc7y\x190\x03d}\x10p:\ +e]\xbe%\x03\xa2\xb3\xfa\xeb/\x83\xadB\x89\xcc\x9b\ +\xd2W\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04\x9b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x04RIDATH\x0d\xb5UKH\x9cg\ +\x14=\xa33\x13\xc5W\xecH\xd5\x85\x8f\x9a\x086\x8d\ +\x22jh\x1c\xa5c\x17\x0d\xba\x12E\x0d\xb8\x107U\ +h\xb0\x01\x17\x8d\xa6\xa4\x9d(tl\xd0\x0a\xa6MW\ +\xe9\xcaE\x9a\x92\x8a\x10\xad\x16+\xf1\x05\xa9\x9a.4\ +\x15\xd1\x11_\x15\xc4\xf73\xea\x8c:\xfd\xce-3\xcc\ +\xf8\xc2,\xfa\xc1\xcc\xf7\xcf\xfc\xdf\x7f\xcf\xb9\xe7\x9e{\ +\x7fMF\xc6\xc7\x0e\xfc\x8fK{\x9e\xd8\x0e\x87\x03\xfb\ +\xfb\xfb888p\x1d\xf7\xf2\xf2\x82V\xab\x05\xf7\xb3\ +\xd6\x99\x00\x0cl\xb3\xd9\x10\x14\x14\x84\xb8\xb88\x5c\xba\ +\x14\x83\xc0\xc0@\xec\xec\xec`zz\x06###X\ +XX\x80N\xa7;\x15\xe8T\x00\xb2%\xc3\x9b7\x0b\ +\x90\x93\x93\x83\xc8\xc8\xc8cD\x97\x96\x96\xd0\xd6\xd6\x86\ +'O~\xc6\xda\xda\x9a\x00\x1d=\xa49\xa9\x06\x0c\x1e\ +\x10\x10\x80\xbbw+\x91\x96\x96\xe6\xf1\xcc\xe1\xe1!&\ +'\xa7\x10\x12b\x90\xccxs|\xdc\x8a\xaa\xaa*\xf5\ +\xff\xe41\x10\xef\xe8\xe8\xf7\xcc\xee\x11(\x0b\x99\xdf\xbf\ +o\x86\xd1h\x94[\x83\x83\x83\x18\x1d\x1d\x15\xb9\x0c\x06\ +\x83\x92g\x0a\xd5\xd5\xd5XZZ\xc6\x95+\xef#4\ +\xf4]\x5c\xbb\x96\x82\x9e\x9e\x1eloo{\xc8u\x0c\ +\x80\x9a\x17\x14\xe4#77\x17d\xfb\xf0\xe1\xf7\xa8\xad\ +\xadCgg\xa7\xc81<<\x8c\x8c\x8c\x0cX\xad\x13\ +hllT`\xd3*K\xa3\xca(\x04\xc1\xc1\xc1x\ +\xf1\xa2\x0b\xde\xde\xde.\xce\x1e\x00dOi***\ +d\xa7\xbe\x0d\x0d\x0d\xd0h4\xf2\x00\xa5\x9b\x9a\x9aB\ +{\xfb\xef\x22\x07\x03\xfd\x97\xd9\x1eRSS\x11\x15\x15\ +\x85\xbe\xbe>,..\xba@<\x8al\xb7\xdb%\xe5\ +\xf0\xf0p\xec\xee\xee\xe1\xd9\xb3_\x11\x1b{\x19\xf1\xf1\ +\xf1\xcaA\x97a0\xbc\xe3r\x8c\xe2\x02\xbb\xdd\x86\xad\ +\xad-\xc9\x94\xe0t\xd3\x8d\x1b\x9f`~~\x1e{{\ +{B\xca\x03\x80\x92\x90\x05\x97\xc3q\x88;w\xbe\x90\ +\xdfz\xbd^\xfe;\xcfWaa!233QW\ +W'r\xb9\x00\x18\x9c,\xc2\xc2\xc2$\x8e\xaf\xaf\xaf\ +b\x1f+\xd7+++X]]\x95\xeb\x0b\x17|T\ +/\x04H?\x1c\x05\xdc\xdc\xdcT\x99\xef\xc2\xdf\xdf\x1f\ +o\xde\xec\x88\xb4\x02@i|||PZZ\x8a\xec\ +\xecl\x8f\xe7ZZZ\xf1\xe8\xd1\x0f\x22\x19o\xb0N\ +\x04g_\xa4\xa4\xa4\xa8\x82\x9b\x94|\x97\xe4\x19\x02X\ +,5\x98\x9d\x9d\x157Q2\xef\xd0\xd00stt\ +4\xcc\xe6\xafE?w\x07\xf0\xa9\xe6\xe6f\xbc|\xf9\ +\xa7\xe8\xcb,\xd9\x17&\xd3G\x18\x1b\x1b\x13Wut\ +tHQ\xaf^\xfd@\x9c\xc4\xbd\xad\xad\x1d\x1b\x1b\x1b\ +bW\xef\xf2\xf2rsee\x05bbb\x84]o\ +o\x1f\x06\x06\x06\xe4\xb0\x9f\x9f\x9f\x14yffF\xdc\ +C7\x95\x95\x95!++\x0b\xcb\xcb\xcb\x18\x1a\x1a\x12\ +\x19\xb8\xbf~\xfd7\xae_\xff\x104\x08\xcd\xd0\xd5\xd5\ +-\x00\x1a\x95\xb2LS\xb6z}}=::\xfeP\ +\xee\xb0\xcb\xecy\xf0\xe0[\xa9\x09\x7f?\x7f\xde\x82\xd6\ +\xd6\x165{\x16EN\xce \xf7E7\x15\x17\x17\xe3\ +\xd6\xad\xcf\x14\xfbM\x14\x15\x15I\xdd\x04`ll\x5c\ +ig\x11O\xb3\x16\x5c6\x9b]9(\x02%%%\ +\xd2\xd1N'q\xfe\xd0\xe7\xb5\xb5\xb5J\xa6q\xe9z\ +r\xe4\xb4\xad\xa9\xb1 ==\x1d\xbd\xbd\xbdj\xcc|\ +)\xbd\xa0\xa5\xc6\x8f\x1f\xff$);\x83\x13@\xaf\xd7\ +\xa9b\xfd\x83{\xf7\xbe\x12\xf9\xa8mDD$.^\ +\x0c\x12\x8f\xaf\xad\xadKPg\xf0\xbc\xbc<\xa9\x0f\x9d\ +\xf8\xf4\xe9/\xd2\x1b\xac\xa7\xc6hLsp\xf6\x9c5\ +\xd7\x9d\xef\x02\x06c\x1d\x9c\xbb\xc9d\x12\xcf\xebtZ\ +$%%\x89tMMM\xaa\x07\xbes\x0d=\xad3\ +u\xb2>m\x91\x00?\xce\xc5.\xcd\xcf\xcf\xc7\xed\xdb\ +\x9f{\x10\xb3Z\xad\xca\xd2?\xba\xc6\x04\xcf\x9f\xfd:\ +rFt\xdbY\xf0\xc4\xc4D)&\xb3\x9e\x98\x98\x10\ +yy\xe4\xd5\xab\xbf\xc0^pW\xe3\xad\x00(\x8dV\ +\xabS\x85\xffT\xd5H\x8f\xfe\xfe~u]\xaa\xdc\xf5\ +\x1b\xe6\xe6\xe6088\xe0\xc1\x9e\xa0'\xbepx\xe3\ +\xa4Ei\xa8\xbb\xc5\xf2\x0d\xd6\xd7\xd7%8\x03\x13\x8c\ +\x1f\x8ez\x92p_o\x95\x01[?77G\x9e\xe7\ +\x08\xe1\xbb\x80\xff1(g\xd0\xd1\xe0\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Artboard\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xb5\ +<\ +svg id=\x22Layer_1\x22\ + data-name=\x22Laye\ +r 1\x22 xmlns=\x22http\ +://www.w3.org/20\ +00/svg\x22 viewBox=\ +\x220 0 24 24\x22>help<\ +g id=\x22Final\x22>\ +\x00\x00\x02\x9e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x02eIDAT8\x8dm\x949o\x14A\ +\x10\x85\xbf\xee\x9d\x03\xcb\xc8\x8b8\x02'\x1c6\x161\ +\x91\x13K$ $\x90sR\x88\xc9\x1d\x10#Aj\ +\xe1\xff\xc0\x1f @\x88\x84\xcc\x91c\xa4\xdd\x95!5\ + \x19\x19\xf0\xeet\xbf\x22\xe8\x9e\xc3\xe0\x0a\xa6\xe7\xa8\ +~\xf3\xde\xeb\xaar\xb7\xd6\xd69'n\x00O\x80G\ +\xc0m\xe0*\xf0\x0d\x98\x02\xef\x80\xb7\xc0\x17\x80\xd9t\ +\xd2mr\xff\x80-\x01/\x81\xe7\xde\xfb\xd2;\x0f\x0e\ +\x1c\x0e\xc3\xc0@&$5\xc0\x1e\xf0b6\x9d\xfc>\ +\x0f\xec\x1a\xf0\xde{\x7f\xb7(\x0a\xaa\xaa\xa6,K\xbc\ +\x1f\xe1\xbdC\x12\x92\xd14s\x16\x8b\x05!\x04$\x1d\ +\x00\x0fg\xd3\xc9\xd1\x10\xac\x02>y\xe77\x97/.\ +S\xd7K=u\xc0\xa0\xbb&\x9ep:?\xe5\xd7\xc9\ +\x092\xed\x03\xf7f\xd3\xc9\xdc\xe7\x8c\xd7\xde\xfb\xcd\x95\ +\xf1\x98\xaa\xba\x80\x99a\x12fB\xa6\xf4l\xe4\xd5\x90\ +\x89\xaa\xaaY\x19_\xc2{\xbf\x09\xbcj\x99]\x07\xa6\ +\xe3\x95q1*\x8a\xcc%mt.y\xd5z\xe6:\ +\x9e./F\x0c\x81\xe3\x9f\xc7\x01\xd8(\x80geY\ +\x15~4\xc2\xcc\xba\xa4\xe4\xb7a\xddvCy\xc5,\ +\xfdS\xe0G#\xca\xb2*\x9af\xf1\xb4\x00\xee\xd7u\ +\x8d\xd4z\x92\x93\x01,1q\xb8\x0eH]NR\xe0\ +\x0c\xea\xba\xa6i\x16\x0f\x0a`\xcd97`\xd5+\x01\ +\x0d\xf6%\xa1g\xbe%\x9e\xe0<\xc0\x9d\x02\xb8\xd2\xd6\ +\x8f\xcb\xd4\xdbh\x09&\x06\xd6\xc9mU\x82\xf5\xd8p\ +\xb9\x00\xbeGi\xd59\xb0\x81\xac!\x10f\x0c\xa0z\ +F9\x94\x92\x7f\x14\xc0,\xc6\xb8:\xf2#p9\xd5\ +\x94\x7f\x97O\xb1\x95\x9aO\x98\xf6X\xb2oR\x04\xf8\ +\xec\x81\x8f1\x86\xb6M0\x09\x99a2$\x81\xac{\ +N5\x96jP\xb2T\x87\x88\xa0\x00\xf0\xa1\xab\xb3\xba\ +^*\x18\xc6\xc0\x8c\xc1mo\xa6\xebOj>\xff\x13\ +\x80\x0d\x0f|\x05\xde\x84\xb0\xe8+_\xea*\xbd\xef\x86\ +\xc4T\xb9\x0b\xd2{\x08a\x01\xb07\x9bN\x0e\xdbv\ +\xda\x891\xee\x87\xd0\xa0l\xa8\xc8Rs+\xb5 H\ +\xa9\x98e\x84\xd8\x10c\xdc\x07v\x00Z\xb0\x05\xb0-\ +\xc5\x03\xc5&\xd1\x97\x92\xcdJf[.j\xb3\x1eH\ +\x8a\x07\xc0\xf6l:\x99\x0f\xc1\x00\x8e\x80-I\xbb!\ +4!*b\x8a\x89\x85\x09\xb2\xcc\xa8H\x88M0\xd3\ +.\xb0\xd5\x8e\x1f\xf8\x7f8\xb6q\x934i\x1f\x03\xeb\ +\x9c?i\x0f\xe1\xec\xa4\xfd\x0b\xfa\xea\xc3e>\x82\xe3\ +\x10\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xc9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0b\x08\x06\x00\x00\x00\xa9\xacw&\ +\x00\x00\x00\x90IDAT\x18\x95\x8d\xcf\xb1\x09\xc2@\ +\x14\x06\xe0/\x87`c\x5c\xc0J\x5c\xc3\xda%\xacL\ +\xf6\x10\x1c#M\xb0\xd0%\xac\x1d\xc0\x05t\x88\x88\xad\ +\xda\xdcA\x08\x17\xf1\x87\xc7q\x8f\x8f{\xef\x8a\xa6i\ +dR\xe2\xd6\xbb/0\x0d9\x89'V\xb1\xf6(\xf0\ +\x1a\xc3)[\xb4\xa8\xf1\xf8\x85\x13\xacp\x821\x5c`\ +\x17\xe195'\x98\xa3\xeb\xc1\x8076\xf1LY\x07\ +\x5c\x07\xa3/\xf1\xe5>\x84.\x0c`\x8b#>\xb9\xdd\ +\xc2\x00\xd6\xe93cx\xf9\x0fLx\x16\xc7\x1ep\x8f\ +U\xe6\xf0\x17\xd8f\x1c,\xfb\x0bt\x13\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x00\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x04\x00\x00\x00\x10\x08\x06\x00\x00\x001\xb6\xde\xf3\ +\x00\x00\x00MIDAT\x18\x95cTTR\xf6d\ +``\x98\xcb\x00\x01\xc9\x8c\x8aJ\xca\xcf\x82\x02\x03$\ +\x19\x18\x18\x18\xd6\xad\xdf\xf0\x9c\x85\x81\x81\x81\x81\x89\x99\ +\x19\xaa\x80\x81\x91QQI\xd9\x0b\xaa\xe5/\x03\x03C\ +\x1a\xe3\xff\xff\xff\x19\x90\x01\x13\x03\x1a`\x1c2\xb6\x00\ +\x00)\xf0#2\xab\xa9+Z\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x03\xb5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x03|IDATH\x89\x8d\x96\xcfo\xdcD\ +\x14\xc7?c\xefz\xd9(\x88\x96n\x91\x12\xd2\x94\xfc\ +\x80C\xb2\xe5\x7f\xc8\x85\x13B\xe2\xd2F\x1c\x91\xca\x95\ +\x03B\xe5?\x00\x0e\xd0;\x5cAh\xfbGP\x0e\x5c\ +\xb8!H\x0e\xc0\xda\x09)\xa2\x12\xcd\xd2d\xbd\xf1\xae\ +\xbd\xf6<\x0e\x9e\xb1g\xb7\xd9\x8a\x91Vk{f\xde\ +\xfb\xfex\xf3l\xb5\xb1\xb9\xc5s\xc6:\xf0\x1e\xb0\x07\ +\xec\x00\xd7\x81)\xf0\x17\xf0'\xf0\x03\xd0\x8b\xc2\xfe\xd1\ +\xa2\x00jA\x82u\xe03\xe0\xf6\xfa\x8d\x1b\xfe\x95+\ +/\xb1\xb4\xb4D\xb3\xd9DDH\xd3\x94I\x9ar~\ +v\xce\xc9\xa3G\x1a\xe8\x01\x9fDa\xff\xe4\xff$x\ +\x07\xf8fc\xe3\xb5\x17WWV\x98L\xc6L\xd2\x8c\ +<\x9f\x22\x85 @\xc3\xf7\xf1\x1b\x1e\xad\xa0\xc5\x0b\xed\ +6\x7f?~\xcc\xd1\xd1\xf1\x08\xf8 \x0a\xfb\xdf=/\ +\xc1\x87\xc0\x97\xbb;;\x9e\xe7A2\x9e\xa0\x16qw\ +F\xbb\xddF)\xc5/\xbf\x1e\x08\xf0Q\x14\xf6\xef\xdb\ +9\xcfYw\x07\xb8\xff\xe6\xad\xae\x97e)\xc9x\x8c\ +B\x10\x11@@0\xff\x82\x98\xdb\xf2'$IB\x92\ +$\xdc\xeav\x15\xf0\xc5\xe6\xd6\xf6\x9dy\x06\xeb\xc0\xe1\ +\x1b\xafo/\xe7E\x8e\xb2\xb8\x05.\xb9\xbct\xd8y\ +\xdf\xf7\xf8\xfd\x8fp\x04\xecFa\xff\xc42\xf8tm\ +mu\xb9\xc8s\x03\xd2AlP\x97l\xca91,\ +0\x0c\xcc\x04\x22BQh\xd6^]]\x06>\xb7\x12\ +\xdd\x04\xf6[AP.\xa6\xde(\x94{\xb5\xf9\x17\xb4\ +}\x8a h\x03D*\xc1@D\xd3\x0a\x02\x80\xdb\x9b\ +[\xdb7=`\xbf\xd3\xb9\xe6i=\x8b\xd0E\x85\x98\ +t5\xa1\x99\xf9*\xbca\xa6E\xe8t\xaey\xc0~\ +\x03\xd8\xf3}\xbf\xa6\x0b(QhU\x06T(D\x81\ +\xaa\x90\xaa\xf2Za\xa4S\xd5>)\x1f\x1a/|\x80\ +\xbd\x06\xd0\x0d\xcc\x01\xb2Fi\xb4\x09\xee\x14Oe\xe5\ +\x9c=\xaa\x9a\xa4\x14S!@\xd0l\x00t\x1b@G\ +)\x0f\x912\xb3(Um\x10@\xa92\xadXW\x1d\ +\x9f\x9e\xb9U5\x1aOy\x00\xd7=k\x0c\xc6L\xab\ +\xb7E\xa9\x05\xb4\xd6\x95\x99\xe2T\x13R\x89SW\x9e\ +\xd4\xc5a\xab\xe8T\xeb\xa2*\xb7\x19\x83\x99\xbf\xb6\x88\ +\xb5#\x95\xaeK\xd6\x96\xaf\x08\x85.\x00\x9ex\xc0a\ +\x96\xe5N\x99\xcd\xd7\xbbE\xe4\xdc[63k\x99\x01\ +\x98e\x19\xc0\x81\x07|\x9f\xa6i\xb9P\xeb\x1au\x95\ +\xd0-\xddJ\x05DSK\x22\xf5\xd9\xb0\xfc&i\x0a\ +\xf0\xd0\x03z\xc38\xd65\x0a'H\x15\x85:@\x95\ +\xdc\xf1\xca2\xd4b\xfc\x14\xe2x\xa4\x81\x9e\x07\x1c\x03\ +\x0f\x86q\xfc,m\xdcVp\xb9\x14\xee\xc1,\x1b\x8a\ +b\x18\xc7\x00\x0f\xa2\xb0\x7fl{\xd1\xbd\xe10\x1e\xa5\ +i\xe6\x98Z\xca`\x009\xfdgV\x0ak\xbeM\x92\ +NR\x86\xc3x\x04\xdc\xb3U\x04p\x02\xdc=\x1d\x0c\ +d\x9a\xe7\x97HQ\x1f1\x97\xa1\xd5\xd3\xa6\x9c\x169\ +\xa7\x83\x81\x00w\xed\xdb\xcd\xbfz\xf5e{L\x0e\x80\ +\xb3\x8b$y+\x08\x9a\xaa\xd1h\xd4\x86 \xa65\xd8\ +\x96\xad\xaac.JP\x02\xd9t\xca\x93\xd3\x81\x00\x1f\ +Ga\xffk\x1b\xd4M\x00\xf0\x13\xf0\xf3x\x01\xc0o\ +\xc0\xb7Y\x96\xad\x8cF\x17;\xc69\x94R\xe0\x95\xaf\ +\xa2\xbc(\x98N\xa7$\xe31\xff>}\xaa\xb3,\xeb\ +\x01\xefFa\xff\xc7\xf9`\x8b\xbe*\xecp?[v\ +\x81W\xcc\xf3\x7f\x80C\xe0!e\xb5D\x8b\x02\xfc\x07\ +\xec\x13\xc1g\xc5\x0e\xef\x80\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01\x02\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0b\x08\x06\x00\x00\x00\xa9\xacw&\ +\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x00\ +\xbcIDAT\x18\x19u\x90]\x0a\xc20\x10\x84\x9b\ +\x5cJP\xf4Y\x14\x8f\x91\xb4\x07P\xd4\x1bT\xf4\x00\ +is\x0d\x15\x9f\x15\xaf\xd58S\x18I\x8b\x06\x96\xdd\ +\xee|\xfb\xd7\xa2\xc0\x8b1\xce\xe9\xff=\xe9\x86A\xd7\ +u\xcf\x94\xd2\xa1\xaa\xaa\xd3\xb8 \x84\xb07\xc6\xd4\xd6\ +\xda\x85u\xce\xbd\xf0\xb1c\x82B\x0e\x0b\xa4\xdes\x12\ +\xdb\xb6\xdd\xa2\xfbY\x13r\xd0{\x7f!g\x04\xd3\xab\ +\x00\xe1\x03\xb6dG\x81\xd4\x070\x13(\xb8\xa1\xfb\x0a\ +\xe0\x1d\xe0\x9a9=\xab\x80\x9e\xa3\x09\xc2\xae\xf4\xe3\x1b\ +\xbep\xbe#\xfe\xca\x86+\xc0\x06G\xf7k\xe4`\xbe\ +cv\xc3\xb1,\xcb\xda 1\xc5\xc8\xf7\xf8\x18\xad\xa7\ +\x02\xe8\xb3>\xd74\xcdD\xe2//\xfd\x03\xa1\x0cs\ +q\xd5\xccH\x8c\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\x01\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xbbIDAT8\x11c`\x18\xf2\x80\xf1\xff\xff\xff\ +\x0b\x81\xbe\xd0\xc7\xe3\x93\xaf\x8c\x8c\x8c\xd6\xb8\xe4Y\x80\ +\x12\xaa\x04\x0c\xf8\x8cK3H\x1c\xe4\x02\x15 \xcd\x8d\ +G\xd1_\xa0\x0b\xae\xe0\x92g\xc4%\x81.\x0e\xb4(\ +\x1a(V\x8f&~\x10\xe4\x82e@AC4\x09d\ +.(\x0cL@\x02@\xb5u@\xaa\x11*y\x08H\ +{\x81\x04\x8f\x011>\xf0\x09\xaa\x01L\x01\x15\xd6\x01\ +\xf1A \x06{\x1b\xe4\x02y\xa0\x0c'\xb2\x2246\ +(\x0cn#\x8b\x01\xf5\xb0\x02\xc5~#\x8b\x91\xcd\x06\ +\xb9`\x0dP\xb7\x11\x1e\x13\xbe\x00m\xd3\xc3%\x0fJ\ +\x07R@\xac\x88K\x01P\x9c`:\x90\x04*\xe2\xc0\ +c\xc0?\xa0\x0b\x1e\xe2\x91\x1f`)\x00Z\xce[\xfc\ +\xbaej\xe6\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\xa8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0e\x00\x00\x00\x0e\x08\x06\x00\x00\x00\x1fH-\xd1\ +\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x01\ +bIDAT(\x15\x9dR\xb1J\x03A\x10}3\ +w\xd7j\xa3\x95\xa5h\xc4B\xfd\x05\xb5U\x9b\x10!\ + \x82\xb6\x22H\x1a\x1b?B\xc5\xc2&`\x11H!\ +i\x844\x829\x15[\xfb\x10\xc4Nl\xac\x92.w\ +{\xe3\xec\xe5\x16\x96@\x82\xb8\xcd\xdc\xbcyov\xee\ +\xed\x10\xbcS\x8d\xabs\x89\x845\x08\xed\x80d\xd9\x96\ +\x08\xe8\x0a\xe4!\x22s\xdd\xdcl\xfe8\xba\xe2\xa3S\ +\xee\x1c\x94\x09\x5c\x07d\xd6ac\xb1\xaf\x0d\x8e[[\ +\x8d\x96\xc5s\xe1HD\xf7.\x1f\x13\xf8\xa9\xa8\xb8b\ +\xc5Ty=\x9a\x974\xfd\xd0\xea\x8c\xcf\x98\xf2\xdd7\ +\x09\x96X\xd2\xe4\xf4/\x22\x1d\xcd\x8e\xf8n\xb9A\x84\ +3&\xd0\xde\x94\xeeE\x89\x9aa\x96\x9e\xe8\xff\x079\ +\xa0\xe6\xb1\x00+S\x85\x22\x0d\x22\xae%\x1c>\xaa%\ +\x1b9\x97\xa4\xc4\x9e(#B\xec\xe5P'\xeeB\x93\ +\x9e\x8b\x98'\xc5\xd7\xbc\xdaPGE\xb7\x00\xbe\x0d\xb2\ +C\xf5\xf9\xd6\xe6:I\x9dA\x17i\x18Y\xd1j\xc1\ +q\xe13\xb4\x8f\xab#\xac+\xb2@\xc2\xcf\x99\x98m\ +\xe6\xe0E\x90\xbde\xe0\x8e6\xce\x17\xc1)\x8a\xd8f\ +\x93\xd0\x8d&}\x0b(i\x91)\x88a\xe4\x8b\x85\xe3\ +\x09\x22\xfb\x1c\x97Z\x03\xfe\xb3\x00\xb99\xf9&\x10\xed\ +k\x8f\x81m4\xe1\x0c\xdc\xd6\xd8z~\xa3#\xba%\ +WpW\xcd))>T\x97z`\xb4#\xa4W\xfe\ +\x92\xff\x02\xcc\xf9\x88,\xe6h\xea|\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x02hL\ +G\ +IF89a\x96\x00\x96\x00\xf7\xff\x00\x7f\xac\xf8\xee\ +\xf4\xfeV\x92\xf5\x8e\xb6\xf8\x9e\xc0\xf9\x94\xba\xf9\x87\xb2\ +\xf8f\x9c\xf6`\x98\xf6\xf2\xf6\xfeY\x94\xf5\xe8\xf0\xfe\ +\x98\xbc\xf9r\xa4\xf7\x82\xae\xf8\x9b\xbe\xf9{\xaa\xf7S\ +\x90\xf5y\xa8\xf7u\xa6\xf7\xc0\xd6\xfbG\x88\xf4\xaa\xc8\ +\xfa\x92\xb8\xf9M\x8c\xf5\xe2\xec\xfdo\xa2\xf7\xdc\xe8\xfd\ +]\x96\xf6c\x9a\xf6\xec\xf3\xfe\xd3\xe2\xfc\xd5\xe4\xfd\xd8\ +\xe6\xfdH\x89\xf4\xb6\xd0\xfb\xcc\xde\xfc\x85\xb0\xf8\x8b\xb4\ +\xf8\xc6\xda\xfc\xdf\xea\xfd\xb1\xcc\xfaL\x8c\xf5h\x9e\xf6\ +\xb9\xd2\xfbj\x9f\xf6\xd0\xe0\xfc\xb4\xce\xfb\xbc\xd4\xfb\xfd\ +\xfd\xff\xa4\xc4\xfa\x8a\xb4\xf8\xea\xf2\xfe\x86\xb1\xf8d\x9a\ +\xf6B\x85\xf4\xe6\xef\xfen\xa2\xf7\xe5\xee\xfd\x90\xb8\xf9\ +\xf0\xf6\xfeR\x90\xf5\xc9\xdc\xfc\xad\xca\xfa\xc8\xdc\xfc\xf7\ +\xf9\xfe\x80\xac\xf8\xe0\xeb\xfd^\x97\xf6\xa7\xc6\xfa\xc3\xd8\ +\xfc\x9c\xbf\xf9t\xa5\xf7\xa8\xc7\xfa\xce\xe0\xfc\xac\xca\xfa\ +\xc2\xd8\xfb\xf7\xfa\xfe\xa0\xc2\xf9\xd4\xe3\xfc\xa2\xc3\xfa\xbe\ +\xd4\xfb\xd4\xe4\xfd\xb2\xcd\xfb\x96\xbc\xf9z\xa9\xf7\xda\xe7\ +\xfd\xb2\xcc\xfaX\x93\xf5\xa0\xc2\xfa\xc1\xd7\xfc~\xac\xf7\ +\x8f\xb7\xf8n\xa0\xf6\xe4\xee\xfe\xfd\xfe\xff\x96\xbb\xf9\xb8\ +\xd0\xfb\xc4\xd9\xfcX\x92\xf5\xa2\xc3\xf9^\x97\xf5\xe6\xef\ +\xfd\x9c\xc0\xf9L\x8b\xf5\x5c\x96\xf5\xb8\xd1\xfb\x89\xb3\xf8\ +R\x8e\xf5t\xa5\xf7\x80\xad\xf8\xf0\xf5\xfe\xbe\xd6\xfbz\ +\xaa\xf8k\xa0\xf6\x8d\xb6\xf8h\x9c\xf6O\x8e\xf4\xe6\xee\ +\xfd\xe0\xec\xfd\xda\xe8\xfd\x86\xb2\xf8\xab\xc9\xfa\x9e\xc0\xfa\ +\xe9\xf1\xfe\x93\xba\xf9\xaf\xcc\xfap\xa4\xf7\xcd\xdf\xfc\xfa\ +\xfb\xff\xe3\xed\xfd\xa4\xc4\xf9F\x87\xf4\xa2\xc2\xf9\xe8\xf0\ +\xfd\xd1\xe2\xfcd\x9b\xf6\xa5\xc5\xfaa\x99\xf6\xec\xf4\xfe\ +Z\x94\xf6\xbe\xd5\xfb\xf3\xf8\xfe\x83\xaf\xf8}\xab\xf7\xe2\ +\xec\xfe`\x98\xf5^\x96\xf5\x84\xb0\xf7X\x93\xf6W\x92\ +\xf6\xa6\xc6\xf9\xd7\xe6\xfd\x93\xb9\xf9\xd7\xe5\xfd\x9d\xc0\xf9\ +\x9b\xbf\xfa\xf9\xfc\xff\xd1\xe1\xfc\xc8\xdc\xfbk\x9f\xf6\x8d\ +\xb5\xf8[\x95\xf6g\x9d\xf6E\x87\xf4b\x9a\xf5D\x86\ +\xf4J\x8a\xf4T\x91\xf5C\x86\xf4P\x8e\xf5K\x8b\xf5\ +R\x8f\xf5l\xa0\xf6\xf9\xfb\xff\xfa\xfc\xff\xfe\xfe\xffI\ +\x8a\xf4\xf4\xf8\xfe\xff\xff\xff\x81\xae\xf8\xfb\xfc\xff\xf7\xfa\ +\xffm\xa1\xf6\xf6\xf9\xfe\xf8\xfb\xffn\xa1\xf7K\x8b\xf4\ +\xfc\xfd\xff\xf5\xf8\xfe\xfe\xff\xffD\x87\xf4Q\x8e\xf5\xc5\ +\xda\xfc\xc7\xdb\xfc\x9f\xc1\xf9\xcb\xde\xfcU\x92\xf5\xdd\xe9\ +\xfdm\xa0\xf6[\x95\xf5\xbb\xd3\xfb\x99\xbd\xf9w\xa8\xf7\ +K\x8a\xf4\xf8\xfa\xfe\xf9\xfb\xfe\xf8\xfb\xfel\xa0\xf7\x9f\ +\xc1\xfa\xf6\xf9\xff\x99\xbe\xf9\xf3\xf7\xfem\xa0\xf7\xbb\xd4\ +\xfb\xfa\xfc\xfe\xf4\xf8\xffx\xa7\xf7\xf5\xf8\xffJ\x8b\xf4\ +U\x91\xf5[\x96\xf5P\x8f\xf5Q\x8f\xf4l\xa1\xf6\x83\ +\xb0\xf8\xe3\xed\xfe\x9f\xc2\xfa\xeb\xf2\xfel\xa1\xf7\xdd\xea\ +\xfd\xa5\xc5\xf9\xe1\xec\xfd\xe3\xee\xfd\xf9\xfa\xffa\x9a\xf6\ +[\x96\xf6\xc7\xdb\xfbw\xa7\xf7I\x89\xf4\x9f\xc2\xf9\xaf\ +\xcb\xfa\xe9\xf1\xfd\xa3\xc3\xfaK\x8c\xf4O\x8d\xf5E\x86\ +\xf4a\x9a\xf5\xf4\xf9\xfeP\x8e\xf4\xc7\xdc\xfb\xa5\xc6\xfa\ +V\x91\xf6\xcb\xdd\xfcw\xa8\xf8\xff\xff\xff!\xff\x0bN\ +ETSCAPE2.0\x03\x01\x00\x00\x00!\ +\xff\x0bXMP DataXMP \ + <\ +/rdf:Description\ +> \x01\xff\xfe\ +\xfd\xfc\xfb\xfa\xf9\xf8\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0\xef\xee\ +\xed\xec\xeb\xea\xe9\xe8\xe7\xe6\xe5\xe4\xe3\xe2\xe1\xe0\xdf\xde\ +\xdd\xdc\xdb\xda\xd9\xd8\xd7\xd6\xd5\xd4\xd3\xd2\xd1\xd0\xcf\xce\ +\xcd\xcc\xcb\xca\xc9\xc8\xc7\xc6\xc5\xc4\xc3\xc2\xc1\xc0\xbf\xbe\ +\xbd\xbc\xbb\xba\xb9\xb8\xb7\xb6\xb5\xb4\xb3\xb2\xb1\xb0\xaf\xae\ +\xad\xac\xab\xaa\xa9\xa8\xa7\xa6\xa5\xa4\xa3\xa2\xa1\xa0\x9f\x9e\ +\x9d\x9c\x9b\x9a\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90\x8f\x8e\ +\x8d\x8c\x8b\x8a\x89\x88\x87\x86\x85\x84\x83\x82\x81\x80\x7f~\ +}|{zyxwvutsrqpon\ +mlkjihgfedcba`_^\ +]\x5c[ZYXWVUTSRQPON\ +MLKJIHGFEDCBA@?>\ +=<;:9876543210/.\ +-,+*)('&%$#\x22! \x1f\x1e\ +\x1d\x1c\x1b\x1a\x19\x18\x17\x16\x15\x14\x13\x12\x11\x10\x0f\x0e\ +\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00\x00!\ +\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\ +\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*D\ +\xb8\xc0\x93\x1a'3 \xdd\x22\x02\xac\x1e\x9a\x1b\xb3f\ +\xf9\x82\x05\xeb\x0bG\x8f\xb0f-\x1cI\xb2\xa4\xc9\x93\ +(S\x16\x14\xa4\xe6B\x03U\xa6b\xa6\x9a\x99\xea\x86\ +M\x9b\x197v\xfc\x12\x83\x97\xcfZ\xb5|\xc6\x80\xa5\ +\xb2\xa8\xd1\xa3H\x0f\xeaH\xb1\x05\x15)R\xbfbJ\ +\xa5Y\xf3&F\x8d\x1fy\xfa\xe4\x05\xf4\xd5+W`\ +_\xf1\x22\x9a\xb4\xac\xd9\xb3\x02A0@\xf0\xb4-T\ +\xa92\xa9Z\xcd\x99u+\xd7Z^\xc1\xe6j\xd6\xcc\ +V\xaek_\xd0\x0a\x1e;\ +T\x18\xff\x1f\x8f<\xf9c\x9a\xcdu>\x97m\xb96\ +u\xce\xd6\xa9\xc9\xa7\x96\xa0\x09h\xef\xf8\x07z\xe8\xa3\ +B\x84\x88\xf1\xc7\xa9\xe6\x16kq\xcd\x94\xdeN\xd0\xfd\ +\xd4\xdet\x9a\xe1\x06\xdfu\xf3% !\x0f\xb8\xdc\x97\ +\x1fp\xb88Q\x8f\x7f\x1c\x02\x88Zym\x11\xb8\x1c\ +z\xafa\xf5\x5cO\x0a^\x96\x99-\xd5]\xe7H\x84\ +\x12\xbe!c\x10\xdc]8X#\xc8\xbc\xc3a\x87\x1e\ +\xa6f^k\x06\x96\xb8\xd1\x89\xb2yE\x1b\x83,>\ +\x88\x9d|\x12&\xc0\x83\x8co\x04\xf0\x86+6\x0a\xa6\ +\xc32\xb1\xbc\xa3\xe5\x8e\xfe\xf5\x08b[\xca\xb9&\xd9\ +\x90Z\xfd\xa4\x22_\x9b)\x09c\x02P\x06\xe0\xa6\x07\ +\x09\xf0ReR\xbcXPG,Yn\xc9e\x8f\x89\ +1\xf6\x16\x90\x91]E&\x8a\x5c\x9d\xd9\xa0\x9aLN\ +\xd8\xe6\x9b\x1ex \x8dHs\xaa\x84C\x1b\xa7\x9c\x82\ +g\x9e:\xee\xe9\xe1\x97\x7f\x16\x18hFu\x15\xf9\x15\ +\x92-.I_\x8c2\xba\x19@\xa3\x1e\x90C\xce\x1b\ +rF\xffzR#\x11TZ\xe9\xa5z\xee\xe8\xa5\x80\ +\x8d\x9d\x17\xa4d\xa1\xdeeh\x92\xb8\xb8\x08\xe3\x93\xa9\ +2\xda*94\x90c\x8b\xac$\xbdr\x81\xad\xb6\xe2\ +\x9a+\x8f\x00\xf2\xdai\x81\xcd\x05\xdb\xd5\x91\xb69\x18\ +_\xa2l&\xbbj\xa3\xae\xd2\xc0\xc7\xba\x09\xfc\x06-\ +B|\xfc\xb1\xcb.\xd4\xde\x8a\xe7\xb5]n\xaam\x98\ +\xbf^\xe5\xed\xb0\xa5\x1ek.\xab\xae2\xbb.\x1f\x0b\ +x\x10\xeb\xbb\x04a\x22\xca*\xab\xcc[\xaf\xa5\x98j\ +\x9a\xad\xb6\x04\x92\x08ll\x85\x8e\xbabn\x10\x92\xbb\ +\xe8\xb9\xcb\xaa\xbb\xee\x02(/\x10\x08\xc3\x03\x89\xc1\x0a\ +\xc4\x10KL\xad\xb5\x99bK\xde\x8f#\xfe\x0a*\xc7\ +\x0bf&n\xc8\xa7\x22\xab*\xc1\x06\x9f\x8c2\x0e8\ +,\xf0,\xc3)`\x80\x06\xcc1Ol\xad\xc5\xe4\xf1\ +\x9a\xb1\xc6;\xafg\xe6\xa8\xef\xe9&\xcb\x8b\xa7\x96\x1b\ +\xa5\xb2\xe9\x1e\x9c2\xd28\xe8@\xcd\xbbE\xa8\x80\xc6\ +\xdbPG,u\xc5\xba^\xcc\x98\xaf\x91eM(^\ +\xb4}\xff\xcc\x19\xd0\x8a\x8eMr\xd9F/\x80\xb6\x0e\ +:x\x91\x80\xac\xd1\xa8\xe0\xf8\xdbO\xc3,s\xb5\xf7\ +\xd6\x9co\xb6w\x03Z\xe2G(vU[\x9a\xe36\ +92\xbaE#|4\xd2\x88{!\x88 o\xcc\x19\ +\x0d\x06\x188\xee6\xdc\x92\xd3;3\xdd6\x7fh\xb5\ +\xaf\x9bw\xd4\xb9\xa1-\x0a,8\xd1&\x9f\x8dz\xe2\ +\xab\xaf\xde\xfa\x85E\xc0\x0e\xbb\xec\x90Cm\xfb\xed\xf8\ +\xea; \xef\x1b\x97\xb9`\xd7\x80\x8bMv\xe9\xa7\xa7\ +\x8d|\xf2\x19\xa0\xc3C~M;\xff\xfc\xec\xb4G}\ +{\x9eT\x7fx=\x90\xbd'\xd81\xa9^\x83\x1d\xf8\ +\xd0%\x9b}z\xea\xaa[]\xf9\xd01\x84\xc5u\xc7\ +\x07uP\x9f\xf3\x1e\x17\xbd\x98M\xcf^Z\xb2\xdc\xa6\ +\x18\xc3\x8a\x09\x14\xe0\x07\xc1\xd0\x84\x17\xa8\x81\x0b\x81d\ +$k\xbcxE\xdf\xfa\xf23\x18-\x8ah\xfe3\xdc\ +\xf1\x02(\x88\x01\x0e\xe1\x85\xbd\x08N\x08\xb8Q\x8fz\ +(p}\x0dt\xe0\xfb\xaaW5,\xd4`\x048(\ +\x0a,\xffb\xf0\x0au$)tN\x1aX\xffL\xa7\ +B\xf1\xb1\xd0\x85/D\xc1\x10\x9a!\x1arp\xa0\x86\ +5\xbca\xec\xd8'\xbdzUN\x82\xc6YA\x12\x86\ +\x80\x16X\xd4\xa2\x09\xbb1a\xb2Hg2\xd3\x1dn\ +|-D\x07\x01\xa3\x88\x02\x14\xa0\xa3\x16\x84yE\x03\ +\xb0\x88E-20r\xee\xa3\x5c\xf5\x22\xc0\x002\x8a\ +\xe6\x0b\xce\xc0\xce\xfe\x06G\x0e\xff\xbd\xf1\x89r|\xe1\ +\x10\xeaXGc\x08\xa2Ff\xc9\x04\x1f\xf9\xe8G.\ +Jn\x875+\xc5\x0b\xa8\xe8\x9dY\xbc\x82>J$\ +\x9c\xf1RG\xbeH\xd2\x11\x05\xc6\x88\xa51\xf8 \x18\ +\x0alr\x93\x9d\xcc\xe1\xe4(\xb6%E\xc0`a\xf9\ +\x99E'\xd8\xc4(U\xfe\x0f\x8eP\x9cd%e\xb9\ +\x81\x0d\xac\xcd,|P@\x1d\xeap\xcb>\xde\xf0\x8f\ +\x9f\xbc]\x04~\x80GY\xcd\xa2\x19Q\x22\x9d#\x9d\ +\xd8\xca9*\x13\x96\xb1l\xa6:_Q\x96/\xb8C\ +\x15\xaa\x98f5\xad\xa9>l\x06\xd2R\xa10 \xc3\ +`A\xff\x8d%\x86\x0f\x99\xae<'3\xd5i\x05+\ +\xa0\x03RG\xf9\x01<\xe1)\xcfy\xdaP\x81\x0c\xec\ +\xe2)\xca\x00\x08\x96\x15\xe4\x15\x1e(^\x13\x01:G\ +J\xa2\xd3\x18\x04-\xa8\x15B\xe0\x01\xa4\xe0@\x00\x0b\ +ehC\xaby\xcd\xd9I\xaf\x06\xcf\xb4(A`\x91\ +\x00&\xa2\x0e\x92\x1d]f:\x9b)\xd2\x91\x86\xc0\x0a\ +T2\x0a$R\x9a\xd2\x95\xde\xb2\xa5\xb4\xab\xc7\x0bd\ +\x9a\x10i\x1c\xb3\x9c\xaf\x1c(O\x0b\x1a\x82\xaa\x86@\ +\x13\xe80\x0a\x05\xbe\x01\x0c`\x10U\xa5\x0eE*\x1a\ +D\xa1\x09\xa6*\xe4\x15\x86C\x5c+%II\xa9\xf6\ +\xd4\xaa\x9a\x88\xab&\x96\x87\x12[ \xe2\x1bx\xed\xea\ +W\xe3IM\x96B\x14\x0d\x07\x08\xa2Y\x15\xc2\x0b>\ +\x8c\xaf|l\xd5iH}ZU\xb9j\x02\x04V\xb0\ +PI\x12\x81\xd7\xca\xea\xf5\xabF\xe5d=5\xa0\xcf\ +\xc1&\xe4\x0b\xf2\x10\xa09\xdb\x0a\xd2\xc5\xc2U\xae \ +H-\x08hy\x12\x0f`\x81\x15\x95\xb5\xacW\x89\x9a\ +Yz\xffb`\x02\xb2\xf0,I@\x8bX:\xba\x95\ +\xaa\xa7\x8d\xabjA\xf0\x04\x10\xb0\xd3$\x0f`\x85r\ +a\x1b[\xae\xee\xb5\xb6Y\xfcC\x0cu\xbb[C$\ +\xf6\xb7\x8cu\xecp\x9f\xc0\xdd'\x98\xc1$|\x10\xc0\ +r\x97\xdb\xdc\xcb\x16\xb5\xaf\x9b\x1c\xc5\xf9\xa8[\x92\x18\ +x\x81\xb4\xa5}kc\x85\xab\xda\xeer\xf7\x03O\x08\ +\xeaH\x94\xd1\x83\x1e\x8cW\xb9\xcdu.f7\xc9\x01\ +\xc1\xb2\xb7$\xb5\xc8\x00:M;_\xfa\x12\xd7\xbe\x1f\ +\x88\xf0\x07\x04A\x92\x00( \x02\x11\xe8\xef\x7f\x99\x1b\ +\xdb\xd9\x9e\xb7\x86\x11(\xeb\x81Ob\x0bX2\xf8\xaa\ +\x0e~\xf0}%\xec\x09O|\xe0\xb8\x0a)\x02\x86g\ +\xac\xe1\xff\x96\xd7\xc3`]\xea\x88Q\xc2\x83\xa9f7\ +\xc5\x10fq\x8b[\xfc]\x85\xe4B\x113Nr\x8d\ +\xc7[\xde\xaf\xaea\xc7*Y\x80H\x83[\xdf\xeeJ\ +\xf8\x03Cn\xb1\x0b\x5c\xf0\x01\xc9\x16\x84VI\x0e\xf3\ +\x92\x01\xdca\x0f#\x22\xa6P6I\x0cP@\xe5\xd4\ +\x069\xff\xc2Y\xf6\xc4\x96\xb7\xac\x84\x92&\x04\x02a\ +\xces\x86\xfd\xcb\xe4\x0e\xc3\xd3\x05iVI/P\xec\ +`+\x0bY\xcbsV\x02 \x16\x1d\x82\x84d\x00\x15\ +\x90\xd6\xb3\x98\xf9L\xde\xd8^ \xd0E\xc1A\xa1W\ +\x0c\xe7!\xcf\xd9\x05\x8a^\xf4\xa2I\xd0\xc1\x83@\x01\ +\xd2\xa8F\x85\xa4iLi2\xa7\xa1\xb3\x986\x09/\ +B\xe0fCc\xd9\xd3\x89\x16\xf5\xa8I@\x02\x0a\x1f\ +\xa4\x05\xdcH5\xaaW\x8d\xe11\xb3b\x0a\xb1.\x8a\ +\x07\xde\x9c\xe5\x5c\xeb\x9a\xd7\xbc&\x061P\xf1t\xb3|\xe0/\xf7\ +A\xcc\x85\xc1ta\x18\xf8\x1fk\xc0\xb9\xd4s\xbes\ +m\x0f#\xe8E\x11\xc4\xca1N\xf0\x8d/\xbd\xe9M\ +?\x81\x88\x05\x82\x88\xa9\x9b]\xe7\x0aGuV\xb1\x9e\ +\x12\x5c\x1c=\xe3^\x979\xd8\x85q\x82\xba\xd7\xbd\x1f\ +\x03\xd1\x81%\xf6n\x09\xb3O\x1d\xed\xf3\x9e\x00\xdb\x8b\ +\x02\x02\xa4\xc7}\xeev\xaf{0\x16/\x061HC\ + \x8d\xc0\x02\xdf'\xefw\x9c\x03>\x1e\x83\x97\x94\xcb\ +\xbd>w\xba\xdb}\xf1\xc1h\xbc\xe8\xc5\xb0\x00\x81\x1c\ +\x01\x0b\xa8O\xfd\xe4\xf7^\xf9\x9b\x17\xc3\x0b\x99O\x89\ +-\x94.\xf7\xb0\x7f\x9e\xf1\xa3\x17\xbd\x11\x8c\xb0\x01\x81\ +\x00 \xf5\xc0W\xfd\xea\xfd~\x8b\xd8\xab\xc4\x05\xb6W\ +<\xees/\x86\xdd;\xdf\x08\x1dWD\xf0\xa7\x0f\xfc\ +\xe1\xdf\xfc\x01\xc6O\x09\x0an\xcf\xfc\xc6?\xdf\x08L\ +\x08?\xff\x13\xb4\xa0\x85\x13\xfc\x83\x1c\xd4O\x7f\xf0W\ +/\x86\xec\xa3\x84\x1c\xa1g\xfe\xf7\xc5?~\xf2\xdb\x9f\ +\xfc\xcd\x00\x81\xfa\xf7?}r\xb8\xff$\xb9\xa0{\xcf\ +'~\xf7W\x80\xe4G\x01\x08\xf8\x06Z\xa0\x00\x0c\xa8\ +\x00\xfc\xa7~\x07\xf0\x7f(\xd1\x0e\xbbG\x80\x06h\x7f\ +\x08\x98\x81\x1ah\x08z\xd0\x80\x1e\xe8\x81\x0f\x88\x05\x8f\ + \x81'\xe1\x09\x17\xa8\x05\x1a\x98\x82\x19\xd8\x08,\xd8\ +\x08\xc6\xc0\x00\x1f\x18\x8328}WG\x82%\xb1\x01\ +\x07\xa8\x82+\xd8\x82<\xc8\x83\x9a`\x022\x18\x84B\ +8\x026X\x12\x82\xa0\x81=\x98\x84=\x08\x03L\x08\ +\x03\x9e\x00\x09\x8c\x10\x85R\xc8\x08B\x18\x84$P\x84\ +$A\x0eJ\xd8\x82M\xd8\x85^\xc8\x84\xfd\xd0\x00S\ +8\x86d(\x851\xd8{X\xb8\x10\x09\xf0\x85l\xd8\ +\x85\xc9\xf0\x86p\x98\x0cb\xd0\x02\xc8P\x87vh\x87\ +e\x98\x87\xa5\x97\x86\x0a\x81\x0bn\x18\x87\x80\x18\x88q\ +\xa8\x05\x88p\x87\x86x\x88\x88X\x87\xb9\xc5\x87\x09\xf1\ +\x0a\x82\xff\x18\x88,\x10\x89\x928\x89,\xd0\x08\x1d\x90\ +\x88\x98\x88\x88M\xc0\x88\x09\xc1\x0b\x94\xf8\x89\xa0\xf8\x89\ +0\x90\x89\xa4x\x87\x9c\xa8\x10j\x90\x8a\xaa\xb8\x8a\xac\ +\xd8\x8a\xabX\x8a\xb0x\x8a\x09\xe1\x8a\xb4X\x8bj\x80\ +\x08i\x90\x8b\xba\xb8\x8b\xbc\xd8\x8b\xba\xb8\x89\xb2X\x10\ +\xbc0\x02\xc4X\x8c\xc6x\x8c\xc8X\x8c,p\x00\xbe\ +\xd8\x8c\xce8]\xc18\x10\xaf\x90\x8c\xd4X\x8d\xc9\x00\ +\x0a\xce\x98\x8d\xba\xc8\x01\x1c\xc0Z\xd1(\x10\xd2\xf0\x02\ +\xe28\x8e\xe4X\x8e/@\x8d\xc9\xd0\x06\xbc\xc8\x8d\xec\ +\xd8\x8e\xee\xe8\x8e(\xf0\x8d\x03\xf1\x06S`\x8e\xf6x\ +\x8f\xe2H\x01n\xf0\x8e\xfc\xd8\x8eD\xf0\x8f\x00I\x04\ +\x15%\x8f\xff`\x08Sp\x90\x08\x99\x90\x09\x89\x8f/\ + \x06\x03\xe0\x8e\x01\x19\x91\x12\x19\x90,@\x90\xff`\ +\x0c)\x90\x91\x1a\xa9\x90\x1c\xd9\x91>\xf0\x00\x13\x19\x92\ +\x229\x0f\x16\xe9\x09\xf1\x10\x0f~\xe0\x07\x1a\xb9\x92+\ +\xd9\x91\x07\xe9\x02? \x922\x19\x91\x06`\x91Fp\ +\x928\xff\x99\x93)\xa9\x92,\xd9\x93\x9a\xc0\x043\x19\ +\x92\x080\x94C\x09\x0d\x16\xf9\x02?\x90\x94J\x99\x93\ +Ly\x92;\xb9\x92\xe8\xa0\x09AI\x94TY\x95\x08\ +\xe0\x7f\xdf\x88\x0bz\xb0\x95[\xb9\x04K\xa0\x94`\xd9\ +\x94LI\x0e\x1e \x91Vy\x96V)\x0c\xf2\x88\x0e\ +\x16\xd0\x96\x5c\xf9\x96^\x09\x96a\x99\x93\x1d\xb4\x02h\ +y\x97V\xa9\x08P \x8f$\x90\x04m\xf9\x97n\xf9\ +\x96\x5c\x19\x97r\x89l\xffP\x02xy\x97\x8a\xb0\x98\ +\x8b\xe9\x0e\xf2\xf8\x02I\x10\x99\x91\x09\x98\x7f)\x98p\ +\xf9\x95\xf9\xf6\x0fY\x90\x98T\xc9\x98\x9e\xc9\x98O\xc7\ +\x89\x09p\x09EP\x9aE \x99\x92I\x99\x81)\x98\ +\x03\xa9\x05x\xf9\x99\xb0\xe9\x99D\x18\x8c \x90\x08\xb6\ +y\x09\xa4Y\x9a\xa8\x99\x9a\xaai\x01[\x19\x8f\xff\x80\ +\x03y\x19\x9b\xc4Y\x0a\xc6\xe9\x06\xd18\x022 \x03\ +\xb6\xd9\x9c\xb9\xa9\x9b\xbb\xe9\x97\x94\xa9O\xd0\x80\x00\xc4\ +y\x9d\xc6\x99\x9d\xa5\xd0\x01\xb0w\x8ao\x00\x05\xf3\xb0\ +\x9c\xcb\xff\xd9\x9c\xb7\xf9\x9c\xa7\x19\x9d\x16\xe0\x07\x04q\ +\x01\xd7\x09\x9b\xdai\x9c\x1d\x10\x9f\x1dP\x04\xb2\xd8\x0f\ +Y\x00\x05\xf8\x19\x9e\xe2I\x9e\x89\x80\x9b\xa6\x09\x9d\x91\ +i\x04\x04\x91\x0c\xed\xb9\x98\xef\xb9\x9d\xf2\x19\x9f\x88\xa0\ +\x01+\xc3\x88\xbcP\x04N\xe0\x04\xf7\x89\x9fP \x9e\ +\xe3\xc9\x9f\xfei\x9aI`\x05\x04\xc1\x07\xd8\xf9\x9e\x09\ +\xaa\xa0\x880\xa2\x88\xd0\x08\x9c\xa8\x09\xc3\x10\xa1\x11\x9a\ +\x05\x13\x0a\x9e\x16\xca\x9c\x18\x9a\x9b\xf0\xe6\x0e\x9fy\xa0\ +\x08\x9a\xa0$\x9a\xa3U\xf0p\xff\x07\x0b?0\x0c@\ +\xaa\xa2+J\xa1.j\xa1\xfc\x99\x08\x86I\x10E\xa0\ +\x086z\xa3\xf2\x99\xa3P\x8a\x08\x07\xa0\x96i\xb8\x01\ +@z\xa5A\xaa\xa2,J\xa4\xfa\xb9\x9f\xb6y\x85\x05\ +a\x0c\x07\x1a\xa2\x22\x1a\xa5#z\x00hZ\x05\xdf\xf6\ +\x7f_\xa0\x07\x04@\x00Xz\xa5B*\xa1-Z\xa4\ +\xe2I\x03\x071\x01\xf0I\xa6f\x9a\xa3h\xfa\xa7\x07\ +\x00\x03X(\x05\x9b\xb0\x09o\x0a\xa7q\x9a\xa2B\xba\ +\xa5\x14\xff:\x0f\xe1\x89y\x07a\x01d\xda\x01}J\ +\xa2\x80\x0a\xa8\x0d\x00o\xd9g\x0bdP\xa8\x85z\xa8\ +\x89\x9a\xa5ZZ\xa7`j\x10^\x80\xa3\x95z\xa6\x97\ +\x8a\xa6\xa3\xd0\xaa5(\x81Zp\x04\xb2\xea\xa9\x86\xfa\ +\xa6\xa1\xaa\xa8\x8bz\x9fte\x105@\xa9\xa9*\xa5\ +\xabz\x00\xad:\xac\xa3\x00\x02\x12(\x08\x9c \xab\xca\ +\xea\xa9\x87\x8a\xa8\x89:\xa7N0\x9b\x08!\x06\xbf\x1a\ +\xac\xacJ\xac\xadZ\x05\xa5f|\xb9p\x09\x0f\xc0\x09\ +\xc9\xba\xac\xcc\x0a\xaa\xb7\xaa\xa2h\x88\x10\xae\xf0\x07}\ +j\xad\xc2\x8a\xad\xa3\xb0\x02\xf0\x8a}\xd9\x07\x03\x0fP\ +\xaf\xdf\x1a\xae\xb3:\xae\xb6z\xabI\xd0M\x09\xe1\x07\ +P\xca\xae\xed\xea\xae\xf0Z\xb0\x99\x99yO\xa0\x0c\xf6\ +j\xaf\xf8\x9a\xaf\x9fJ\xaeq:\x90\x0a\xf1\x06-\xa0\ +\xaa\xd6\xea\xae\xadZ\xb0\x05\xdb\x02\xba`\x0c\x99\xb7\x00\ +\x9c\xa0\x0c\x22\xbb\xb0\xf7\xaa\xac\x0e[\xab\xfb\x0a\xa4d\ +\xb0\xad\x0a1\x0f\x02;\xb0\xd8\xaa\xb1\xf0\xda\x024\xeb\ +\x0e\xde\xff\x88r\xd4\xe0\x04\x22\xbb\xb3$\xfb\xad&{\ +\x04\xb4\x8a\xb2\x88\x1a\x0c%\xe1\x01+p\xb1\x18+\xb3\ +3K\xb3\xa0\x00\x0an\xa0\xa9\xb1&\x0dI\xc0\x00\x0c\ +\xb0\xb3#K\xb2\xe0\xfa\xb3A\x0b\xaaP\x8b\x10\x89\xb0\ +\xaa\x18\xfb\xaeJK\xb3L\x0b\x0ar \x07k\xc0\xb2\ +\xb1\xe6\x0az@\xb5nk\xb5\x0a\x8b\xb5?\x0b\xb4\xb4\ +J\x00\xe6g\x12o\x00\x0a\x7f\x1a\xb6b+\xb3d\xdb\ +\x02M+\x07\xad0\xb8s\xa0\xb6i\xe6\x0a?\x00\x06\ +`\xe0\xb6T\x0b\xb7=\x9b\xb5Z[\xa8N\x00\x8d%\ +\x91\x020\x1b\xb3J\xbb\x02\x7f\x1b\xb8\x83;\xb8\xb7\xb0\ +\x06\x8b\x18h\xb6`\x01\x8a\xab\xb8T\xc0\xb8\x8e\xfb\xb8\ +\x0dK\xb7\xa5j\x12\xcd\xe0\x0ea\x9b\xb9\x9b\xcb\xb9\x9d\ +{\x0b\xb7\xa0\x0b\x8f`gP\x96\x00\x89P\x00\x05P\ +\xba`p\xbao\x9b\xba\x0b\x0b\xb9\xcaZ\x040v\x12\ +'@\xb0\xb2K\xb6\x81+\xb8\xb5k\xbb\xba\x90\x03\x10\ +\x00\x9c#\x86\x03G\xd0\x07\xbe\xfb\xbb\xa5+\xbc\xc3\xcb\ +\xb3\xaa\xff\xab\xac\x1cZ\x14s@\xac\x99\xab\xb9\xcek\ +\xb6\xd0\xeb\xb9\xd2;\xbd\x1a\xd0\x00\x02z`\x1f\x00\x06\ +\x99\x90\x09\xdb\xcb\xbd\xa6\xcb\xb8UK\xbc\x0c\x9b\xac\xd2\ +\xaa\x12|p\x0c}\xeb\xb7\xb3{\xb6\x9d{\x0c\xb6{\ +\xbb\xee\xab\x01\x1a\xf0\x07P@sf\xe5\x0a-Q\xbf\ +\xf5{\xbf\xc0\xbb\xb8\xa8\xcb\xbf\xf6:\x0c\xebe\x14j\ +p\xbe\x7f\x0b\xb8\xea{\xc0\x09\xac\x0b\x0b\xdc\xc0\x7f\xd0\ +\x00\x0e\xd0hf\x85\x0e\x9bp\x010L\xc1\xf6\xbb\xbd\ +\x17\xac\xbfp\x1b\xb7\x0b\x0bhH\xf1\x0530\xb6\xe9\ +;\xc2\x83\x8b\xc0\xed\x9b\x03\x0c\x8c\xc2)\xdc\x00\x0dP\ +\x04\xa1\xfb.\xb8\xc0\x02\x5c\xc0\x050\x1c\xc3\x14l\xc1\ +\xc0k\xc37l\xafS\x80IEA\x0e\x0d\xb0\xb1\xb3\ +k\xb6\x9d\xdb\x0aB\xac\xc0D\x5c\xc4\x7fp\xc4H\xdc\ +\x00\x10@\x01kz!\xbc@\x02`\xf0\xc4O\x1c\xc5\ +2\xac\xbd4\x5c\xc5Vl\xb5\x0f0\x0c\xb0v\x14>\ +\xb0\xb4\xe9k\xc0$<\xc4E\x8c\xc2i\x9c\xc6m\xd0\ +\x065\xff@\x02<\x0a\x1c\xb0\x00\x02g0\x00\x92,\ +\xc7;@\xc7\x14l\xc7\xbe[\xc3y\xbc\xb3\xe3{\x16\ +\x83\x10\xc2\xcf\x1b\xc6cl\xc2e\xcc\xc0g|\xc8\x88\ +\x9c\xc8\x13\xb0\x06'\x90\xbc\xc0\xf1\x0a.p\x04\xa1\x10\ +\x0as0\xc9\x94l\xc9\xf5\x8b\xc9\xf8\xab\xb8\xfa\xbb\xbf\ +\x22{\xb0gQ\x0bkP\xb6@\x1c\xc4%|\xc2F\ +\x8c\xca\x0d\x90\xc8\xaa<\x01\x13\xe0\x06/\xb0\x87\xa1\xa1\ +\x85\x99`\x02\xb3L\xcb\x92<\x00r\x0c\xc5\xb8\x9c\x09\ +\xba\xac\xc9\x19\xfc\x03m\x9c\x14\x01\xe0\x0eM[\xccb\ +|\xcc9P\xca\x86\x8c\xca\xcc\xdc\x06\xce\xec\xcc\xee0\ +\xcf\x17@\x017\x9b\x14\x1e \x0c\xc3\xb0\x063`\x02\ +\xfe|\xcd\xb5\xac\xcd\xb7,\xc5SL\xc5\xa5\xdb\xcbN\ +\xd0\xb5e\x81\x02\x0d\x80\xce\xa3L\xca\x85|\xca\xca\xfc\ +\xce\xf1<\xcf\xf3,\x01\x18]\x03\x16@\x02\x01P\x14\ +o\xe0\x09S\xd0\x07\x06`\x00kP\xd2\xfdl\xcd\xb3\ +\x1c\xd0\x02\xfd\xc4\x95L\xd0\x15l\xd0\xf9K\xb5Gp\ +\xcf\x83\xff\xe1\x09\xad\xb0\xbe\xe9\xdc\xbe\xc8,\xd1\xee\xcc\ +\xcc\xf1<\x01\x16\xbd\x0c\x18-\x01UP\xd4\x10P\x03\ +\x040\x02b'\x08\x01 \x0dA\xf5\x0a\xb6\x10\x00:\ +`\x05>\xc0\x02\x89\xc0\x055\x90\xd5#M\xd2&\xfd\ +\xcf\x00\x9d\xcd\xdb\x1c\xc5\x17 \xc33|\xc7\xddK\xb5\ +\x1e\xdb\x1d\x8d \xca\xc7\xbc\xd3<}\xc8\x14]\xd1\x17\ +=\xd4E]\x05\x10p\xd7\x90\x90\xd7[\xb0\x05\x00\xe0\ +\x06~M\x0b\xb4\xe0\x00\x8f0\xd8\x94P\x02%\x90\xd5\ +5\xb0\xd5%\xcd\xcf\xfe\x8c\xd2\xb3\x0c\xd6\x03\xed\xd2e\ +\x9d\xc9\xc0K\x05\x1d\xe7\x1d#`\xcc:\xcd\xceg\x8c\ +\xc6p\xed\xd3r=\xd7D]\xd7w\x0d\x01y\x0d\x09\ +{\xdd\xd7\x7f\x1d\xd8\x83\xfd\x08\x85}\xd8Z\xad\xd8]\ +\xed\xd8\xd8l\xcb,\xdd\xcd\xde|\xbf\xbb\x8cw\x17\x12\ +\x0f\x0f\x8d\xcc\xed\xdc\xd3\xa0-\xcf\xa2=\xdav]\xda\ +\xa7\xcd\xd7\xaa\xed\x06\x80-\xd8\x84]\xd8\x88\x9d\xd8#\ +\xbd\xd8'M\xdb\x90-\xc7bM\xd6\xba\xcc\xbdwk\ +#)\xff\xb0\xd9\x85\x9c\xcc\x13=\xdc@m\xd1Cm\ +\xdc\xc8\x9d\xdc\x00\xb0\xdc\xcd\xdd\xda\x94\xf0\xda\x88-\xdb\ +\xb3}\xcd\xb5\xbd\xd2\x5c\xd0\xd2\x92\xbd\xdd\xdd]%#\ +`\xc2\xd3\xcb\xd9o\x9d\xca\xe4m\xd1\xee@\xd7\xa4\x8d\ +\xd7\xea\xcd\xde\xac\xed\xde\x86\x1d\xdf\xf2]\xdd\xf4\xad\xd2\ +\xdb\x8c\xdfc-\xc3\xf7\xcb\xdb\xb2\xd2\x08\xff\x1d\xd1\x01\ +.\xe0\xf0\x1c\xda\x05n\xe0F\x8d\xe0\xa8\xad\xdc~\xcd\ +\xdc\x0bN\xd8\x0d\x1e\xdb\xd3=\xdb\xb4-\xe1a\x8d\xdb\ +3\xac\xc3\xef\xe2\x02m\xc0\xe1\x9e\xfd\xd9\x03n\xde\x22\ +^\xda\xa6\xad\xd7&\xbe\xda\xce\xad\xe2\xb0\xcd\xe2\x8b\xcd\ +\xd8^\x9d\xd2\xd7}\xdf\xd9-\xc3`p\xae\x0c\x83\x02\ +\x10`\xc6\x1d\xbe\xccq\x0d\xe2\x22~\xdc$\x9e\xda\x0a\ +>\xe4\xae\xbd\xe2FN\xdd\x8d\x1d\xe1K\xce\xe4\xb8|\ +\x04\xa1\xc90\x01\x10\x0a\xe2=\xde;^\xdcu\xad\xe5\ +?^\xe2\xeb}\xe2\xcd=\xe4\xef\x0d\xe6[\xcd\xd5\xf3\ +M\xe6\xb6}\xdbt\x9c\x04\x0a\x0d-\xb5\x90\x04Un\ +\xe5\xe4\xff]\xdep~\xe0sN\xe7]\x8e\xe7\xf0\xcd\ +\xe2|\x8e\xe4/\x9e\xcd\xf6M\xe1\xbf\xc4^\xfd \x01\ +\xca\x8c\xc4\xef\xfc\xe1\xc4=\xcfB\xdd\xe3\xe9\x0d\xe4u\ +.\xe4\x90\x0e\xe6\xd2=\xe9\x10\xee\xe7\xf6\xcd\xe4\x0c0\ +v\xec\xe5\x01.!\xdc\xcd\x8c\xe5Y\xee\xe3\xa7\xed\xe8\ +v\x1e\xd8\xa9^\xe4\xab\xce\xeac\xfe\xd5en\x01\x1d\ +\xe2$\xce\ +\xeb\xa8\xde\xda_\x0e\xec{~\xe4\xadN\xec+]\x00\ +\xfd\xd0\xc8\xd4E\x0e`\xe0\xe9W\xee\xec\xe7m\xdcr\ +\xbe\xeb\xa9}\xe2(\xee\x00^\x1e\xe9\x92\x8e\xed\xd9^\ +\xdf\xda\xac\x07\x1d\xado\xfd@\x0b\xe3\xae\xe8\xcf\x0e\xed\ +s\xbe\xd7|\xad\xeewN\xed\xafm\xed\xf2M\xe9\xf4\ +]\xdb\xca`\xacA\x97\x0b# \x01\xb7\xee\xec!\x8e\ +\xd1q\xae\xeb\xc9\x1d\xe4\xd3\xee\xde\xee\x1e\xec\xd8\xde\xd8\ +/\x9e\x09b\xe0\xca(\xf7\x06?\xb0\x0c?\xad\xef\xe5\ +>\xf1\xa5.\xed\x17\xff\xdc\xaa~\xed\x1b\x9f\xe4\x5c\x90\ +\x0c\x83\xdd\x0eq\x01\xa0\x07\x12\x00\xf1\xe7\x1d\xe7\xe7^\ +\xf1\xa7\xbe\xf2\xae\x9d\xf1{.\xec\x8d\xcd\x05,\xd0\xc7\ +\xc6G\x0dj \x04\x04>\xea\x12\x8f\xf2\xd1\xce\xe5\x00\ +\xef\xeb\x02\x9f\xf1\x1aO\xdd\xfd\x9c\x09L\xb0\xc46\xe8\ +\x0a\xc4\x00\x06\xc5m\xee>\xde\xe8P\xdf\xeb\xec>\xf5\ +\x86M\xf0-\xbe\xd8\x89\xf0b\xc1\xb8\x00/`\x009\ +\xcf\xe8Oo\xf1\xeb\xee\xe5\xd5\x8e\xf6\xd3M\x05\x8d\x80\ +\x95\x04\x89\x0e/`\x02:O\xf1<\xbf\xdcuO\xed\ +?\xdf\xf2#\xad\x0c0\xa0\x03\x16y\x10\xf9<\x0f\x94\ +\xb0\xf3\x83\x1f\xf5eo\xf6E\xce\x05z\xc0\xd1\x8dO\ +\x12|@\x02S\xf0\x00\x8f\x80\xeec\x8f\xea\xedN\x09\ +\xa1\x00\x05j\xe0\x09|\xbf\xf9)\xf1\x06(\x00\x080\ +\x10\x0f\xe7\xc0\x09\x17\xb0\x06\x06P\x03~]\x03k`\ +\x02\x05\xb0\x07I0\x05\x14\xe0\x09C\xb0\xab\x07\x16\x10\ +\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\x00\ +\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13\ +*D\xc8\xe7\x1f\x0b2&\xfeiP\x14\xe1[\xbd_\ +\xa60\xa8b\x85\xe0\x16\x84\x19N\xd4\xb8X\xb0\xb0\xa4\ +\xc9\x93(S\xaa\x5cy0\xd3?V\x15b\x12\x22D\ +\xaa\xa6M\x8c\xa6r\x9aJ\xc5\x93\xe7\x8d\x1b\xf54\x5c\ +\x985\x8b\xa5\xd1\xa3H\x93\x22\x9c\xe2F@\xcc\xa7O\ +g\xda\xbc\xa93gO\x9f?\x7f\x12\x85\x05\x8b\xa8\xd2\ +\xaf`\xc3\x0e\xd4\xa4\xac\x94\x88\xb3\x22\xa0B\x9dIs\ +*N\x9dWSe\xd5\xea\x8b\xeb\x97\xbb_|\x89\xdd\ +\xcb\xb7$\xba#e\xde\xa1E\xabvm[\xaaU\xe3\ +\xce\xbd1\xab.\xac\xbb1xI\xfe\x02\xab\xaf\xe5\xbe\ +\xc9\x1a\xc4\x8a\xf5\xae\xf3\xe0\xb4\x85e\x1e\xae\xf9\xd6j\ +\xcf\xc5D\x1dC\x96\xcc\xabV-^_\x8a^\x9e}\ +\xd4\x89\xa5S\xa76s\x16\xfc9t\x05\xa9n\xab\xee\ +<=w\xeb\xe3\xbb\xac[\xd7z\xf5\xca\x15/\xbd\xb4\ +\xa3\x9b\xccT\x0f7n\xdd\x9e{\x87\x06\x8e\x18.\xf1\ +\xac\xc6W\xb3\xff^\xce\xdc\x95\xab\x5c\xbc*K__\ +\x10L\x9d]\xd6\xado\xee\xcc\x9b\xf0\xf6\xd1\xa4J\x0f\ +\xc7\x0a^\xf5\x97\xc8\x92\xb9V\x9ey\xb94c\xcb+\ +\xea\xb1G\x9b-P|\xb3\xca*\xbb\xc0\x17\x1fv\xf5\ +\x9d\xe5\x1bw\xa4\x09w\x15j\xfe%G^s\xe7\x15\ +h\x8b-\xd2\x5c#\x9b\x82}Q0\x09\x1a\x0f>(\ +\xa1|\xf3Uhaa\x18\xe6\xa7\xe1w\x8c5v\xdc\ +\x17\x1e\x0ex\x9e\x81#\xe2\x82K\x13\xbc\xa0\xb8\x17\x0e\ +U\xa0\xa1$\x8b.\xbex\xddn2\xde7\x95\x8d\x89\ +\xe1\x18\xde\x7f\xe3\x91g\xde\x8f#J#$.\xbd4\ +\xf1\x85\x91_\xe9\x11\x81\x0a*,\xd9\x22\x84\xf1\xe5\x16\ +\xa3v4N\xa9\xdf\x86\xfd\xd9\x85e\x80\xcc\x81(b\ +\x90B\xf6\xd2\x8b,\xb2\xb8B\xe6Q\x0bL\x80\x01\x06\ +h\xa6\xa9d\x8b\x11\xb6\xf9\xe6`\x17\x8e6'\x7ft\ +\xd9\x99\xa5\x8f{~\x09&\xa0\x8eP\x83\xcb\x98\x83\xa6\ +D\x81%\x87\x1e\x8a\xa6\x9a\x8c:\xfa\xa8}jaX\ +\x1a\x9du\x8a\xff\xa7\xdc\x80{\xda\xf2\xe5\x9f\x80R\xa3\ ++5\xaf\x84zR\x1f\xa5\x06{\xea\xa2MN\xb8\xea\ +\x8c\xadJZ%\xa5W\x02\xd8\x1a\xa6@j\x8a\xeb\xae\ +\xd4$\x90@\x13'\xfaj\x10\x0dm\xd4SO\xb0\xa6\ +*\xca\xa4\x8b\xaaf\xc7\xaaa\xc1y\xc7\xec,\x96\x06\ +\xa8%\x97|n*K\xa7\xbaZ\x9b\x00\x0f\xd4\x80\xaa\ +-A!\x10\xe1\xad\xb7\xe0\x22*.\xa3NR\x08)\ +\x8d\xca\xaa+W\x9d\xc7\x8d\xc7\x5c \x04F{k\xae\ +\xf5\xda\xfb\xc6\x1b<\x14\xb9\xaf@'p\xf3\xef\xbf\x01\ +\x0f\xbb\xa6\x93n\x9a\x8blT\x09\x9b\xc6l]\xb2\xbe\ +[\xeb\xc4\xb2Pk\xf1\xc5o\x04 \xe8\xbeS\xa8\xf2\ +1\xc8\xe0\x0e;n\xa30\x9a\x0c\x1a\xba\xdd\xed\xb7\xb0\ +V\xed\xce\xaa\xa7\xc4\xf2\xd2[\xad\xb5<\xd0\x1c\xc0\xd4\ +\xb6h\x9bD\x1du\xec\xcc\xb3\xb0\x03\x93\x0b\xe3n\x07\ +\xb7\x9a\xae\xcaG_\xe9\xf0\xd2LO[\xf1\xbdRO\ +\x1d\x80\x07\xd2\x84\x9a\x85*\xaa`\xad5\xc0=\xa3\x0a\ +a\xc1`\x9f\xff\x1b\xd5\xd8\xfb\x15\xa7\x9a\xb3.\xa7M\ +q\xc5Q_\xec\xf6\xdb\x1ex\x80\x0b\x99s\xd3]w\ +\xd6w\xf7\xdc5\x9bAG)\xf6T\xcb\x0a\xde\xb0\xbb\ + \xba\xd2\x8c\xe11\xafMs\xcdS7\xde89\xb2\ +\xa0\x98\x84\xe4\x92\xdb\xadu\xc8\x8a2\xca\x8c\xb1&\xc7\ +\xc9\xb9\xba\x9e#\x87\xe7\xd2\xf1\xaa\xfdt\x02\xa7\xbb\xad\ +\xba\x07\xe4\x90C\x836\xecM\xf1\x0d0\xb0\xd3M\xf9\ +\xec\x5c\xeb\xcdw\xee\xc9\xee\xaerqv\x11N\xab\x81\ +^\xca+3\xdb\x8a\xa7\xaez\xf24\xf0\xc1G\xdc\xd1\ +\xf5\xd3\xc37\xcfG_\xf7\xdd\xdfV\xff\xf3\xedOb\ +\xcf\x8d;`\xc4s\xc2?: \x08.\xa8\xa1\x03M\ +\x04\xe3\x07\x05h\x03+\xc2\x03\xa0\xc2\x05\xefpPk\ +\x1b\xe3V\xa7<\xf5\xa9\xaf\x19\xb4\xb1\x02\x16\xe0\x07?\ +\xe8Eoz;\xcb\x1b\xb10\x97?\xc1 c\x0dj\ +8\xcaV|\xf7,\xe0\x85Ox3C\xdd\x04\x91W\ +A\x0b.\x80\x0f\xbd\xba\x0c\x02X\xc1\xc1\x0e~\x10\x84\ +[\x0b\x17\xaa\xff\xf8\x06\x8a\x7f\xa0C,\xec\x8a\xccr\ +\x22\xf6\xc0]\xc5pq\xe7\xab\xa1\xfa\x16@E>h\ +\x8c/\x13`\x85\x16{\x18?\xd8\xc9.\x84\xf6K\xd5\ +),\xa1\x0c\xda\xc0\x82\x17.\xec\x13\x04\xc9'\xc3(\ +\xa6\xcf\x86T\x5c\x00\x0e\xc8\x01\x1d\xb1\x80A\x8bx\xe4\ +!\x07=\x18; \xe2\xadT]\xdb\x05\x22P\x14\x83\ +NH\x0c\x86l4\x1e\x05\xdf8E*\xe2\xe0\x918\ +x\xc3^\xb4\x10\x81\x1e\xf4 \x8fz\xf4\xa1\x17\xfdX\ +?!\xb2\xa8\x03\xa1\xe2E.&F\xaf'\x9a\x8f\x86\ +\x8c\xe4C\x1c!\x89\x03\x1d\xe8\xe0qaIC\x04f\ +y\xc9<\xf6\x90\x8f\xd2\xf3\xa3\xe5,\x11\x8f}\xd5B\ +|\x15\x93\xa0\x1b-\xa8JGB\xd2\x95^0\xc3\x15\ +\x93R\x85Y:\xb3\x96x\xbc\xe5\x0f\xa9W\xaa\x01l\ +L \xbexF\xe9\x9e\x968E\xa2\x12\x8e\xc6l%\ +2\x05!\x08y|%\x1e\xceL\xa7%m\xb9\xc7i\ +\x82Q\x11\xd7,\x08/b\x16\xc16.\x12\x9cr|\ +\xa4+u\xe0\xff\x05r\x923\x01JAF:\xd5\x09\ +\xcdLv1vw[C<\x0f\x82\x0bk\xb5m\x98\ +\x8d\xcc\xa7>\xf9\xd9O\x7ff@\x10\xb5@\x8a\x1bP\ +\x81\x8a\x81\xaa\x13\x93\xed\xf4\xe2\xc7\xbe1\x82\x85\x22\xc4\ +\x15\x0f\xbdgDY9N\x8bf \x03\xe8h\xc8Q\ +8JS\x8f\xd2\x12\xa4!\x95\x9e\xb7\x88`R\x85\xf0\ +\x82\x07\x8aD\x1f8\x8f\xd9Rr\xbe\x14\x1d\xe8\x18\xc2\ +\x10\x1ca\x94Qp\x83\xa6\x1c\xb5i%\x0b*\xcd\xd8\ +\xad\xa0\xa7\x0b\x89A\x02\x18'\xd4\x95N\xd4\x0b\x15\x15\ +\xc4Q\x93\xaa\xd4!\x08\x82%E\xe0\x86Z\x9f\x0aU\ +\xa9R5\xa7\x0d\xc0jI`\xf1\x86ozU\x9ca\ +\x15+L\xc9\xaaT\x14\xa0 \x00+a\xc4Z\xd7\xda\ +V\x9b\xbe\xd5\x87\xee\xe8\x85\x5c\xe7\xfa\x06)\x86\x13\xaf\ +\xfe\x14+R\xcb:\x04\xbf\xfau\x08\xcb,\xc9\x11\x04\ +P\x8c\xc1\xaa\x15\xaa\x1d\xf5\xe8:\xb7\xc8\xc1\xb8.\xd6\ +$\xb0\x08\xc0]\x8b\xaa\xd7\xc9\x96\xd5\xb2(0\x861\ +\xc8\x91\x12d\xff\x08\xe0\xb6\x9d\xf5laEk\xcb\x16\ +\x00\xf4\xb4&\xf9\x82\x07V\xf9\xd5\xc8\xee\x95\xb2\xb0\x8d\ +\xadl\xcd\x91Q\x93<\xe0\xb6\xd0\xcd\xadnk\xca[\ +-\x22\x00\xb8)\xe1\x85*\x89\x1a\xd6\xb1\xbe\x16\xb6\xb2\ +\x95\xed\x066 \xd3\x92\xa4\x01\xba\xe8\x95.aw\xfb\ +LV\x08\x00\xbb*\xe9Dq-\xea\xda\xbeZ6\xbc\ +\xc6\x18\xefx\x8d\x91\xd9\x83$\xc1\x12\x96@oz=\ +\xcb\xd6\xa8z\xb4\xa4\xf0M\x096\x8azT\xe4\xde7\ +\xbc\xfa\x1d\xaf\x15\xac\xe0\x81\x92 \x02\xc0\x00\x16pt\ +\x09\xcc\xdeP$x%\x01\xe8n}\xc1\x0b\xe1\x08O\ +x\xc2\xc6X\x08\x05\xb0\xc0b,`8\xc0\x1aVo\ +\x81C;\x8a\xd6}8%_0Ck\x1d\xac\x5c\xf1\ +\x9a\xf8\xc4V\x08A\x08$\x99\x10\x00\xb4\xb8\xc5/\xd6\ +0g\xa7\xcbQO\xdcx%M8\xae}\xfd\x8a\xdf\ +\x1f\x9fX\xc8B>\x22B\x04q\xe4.'9\xc6\xba\ +\xed\xc3\x93Y\xe2\x81\xefR\xb9\xc4\x12\x062\x96\x85\xac\ +\x09M\xe4\x02\xff!\x89\xe8\xb2\x9c\xbf,\xe0\xc1^w\ +\xcc,\xc9@e\xcf\xec\xe34Ox\xcdln\xb3&\ +\xca[\x90V\xc8\xf9\xd0.\xce\xb0\x86\xd5\xfa\x02<\xb3\ +$\x01|\xce\xaf~\xd5\xbcfA\x0b\x1a\x04V8\xc8\ +\x06\x14\xc0iD\xcfY\xd1\xe8\x05\x87\xa3Y\xe2\x8b\x0c\ +\xa0\x19\xc8A\xae\xb4\xa5A\xc0jV\xb3\x8f d\xe0\ +\xb4\xac\x15\xe0\xe9#c\x18\xbdZ\x185K\xa8!\xe9\ +\x0dP\x1a\xcb\x96ns\xab[\xfd\x043\x18\xe4\x0f\xb3\ +Nv\xad\x91\x1c`]\xe8\x9a%\xb3\x18\x82\xaf\xaf\xac\ +\xeaK\x0f\x1b\x04O\xc8\xf6\x132]\x10F$\xfb\xdb\ +\xb4^\xb6%X\xf0l\x96\xbc\x81\xda\x81\xb6\xf6\xb0\xb5\ +\xcd\xee\x0f\xdcL j`\x84\xbc\xbd\x0dnY\xd7z\ +\x90\xe5^\x09,\x8cQmM\x5c\x1b\xdb\xec~\xc2\x07\ +\x06>p\xda\x0e$\x14\xc8\x98\xf7\xbc\xebmo9;\ +!\xdf,\xe1C\x08\x82}\xed\x80\x0b\x9c\xe0\x03?\x84\ +'P@\x90Q \xe3\xe3\x09W\xb8\xbc\x19\x1en\x16\ +g\x00\xe2+\xff\xc9\x85\xbaYmq\x8cg\xdc\x130\ +\xf7\xc4\x13\x08\x02\xf2\x9a\x7f\x5c\xe4\xf4\xae\xb7;P\xce\ +\x12c\xac\xbb\xdd.\xd7x\xcc\x87\xee\x02\x0c\xfe\x83\x02\ +6O\xfa\xcdE\xfe\xed)\xf0|%\xe4\x00\xb8\xb6\x83\ +>\xf4\x98\xbb\xe0\xeaX\xaf\xf0?\x86\xa1\xf4\xae/}\ +\xe1\x9c\x0e\xe0\xd3S\x92\x8b\xa9c\xbc\xea0\xc7\xba\xda\ +]\xa0\x04%\x9c\xfc\x1f\x0e\xf0\xba\xdc\xbfn\xda\xb1\xa7\ +$\x04\x04\x17:\xd1\xd7\xcev%\x00\xe2\xef\x7f\xe7\xf6\ +\x01\xd2@\xf84\xcc\xdd\xeb\x9b\xb0\xbbJ\xbc\x80v\xbe\ +\xb7\x1d\xf0\x90\x07\xbc\x0b\xfe\xe1\x81\xc2[\xbe\xf0\x87\x07\ +y0\x14\x9f\x927\xa4}\xed~\x8f<\xe4I@\xfa\ +\xd2\xbbB\x13\x97O\xfd\xe5\xbd\xce\xf9\x94\xb8\x02\xeb\xa1\ +\x17= JO{\x12\x10\xe3\xf6\xfd\x00(\x07v\xaf\ +\xfa\xdec\xfe\xe3Wm=J> \xfa\xda\x97\xfe\xf6\ +\xc4\xe8\x87\xf2\x97\xdf\x0fr\xfc`\xf7\xd0\x8f>\x07|\ +\x7f\xf9\x1a\x08\x1f%V\x98\xbd\xf1q\xcf\xfc\xee3_\ +\x10\x0f \x02\xff\x11\xa4O\xfe\xe8\xab\x1e\x0a\xd7?I\ +\x06l\x9f|\xef{\xdf\x07\xf0\x8f?\xfc\x8d1\x00\xf1\ +\xdb\xff\xfe\xe2/?\xf9S\x98\xfe\x92,\xc0\xfd\xfd \ +\x7f\x02\x08\x7f@P\x80\x05\x18\x02\xb4\x80\x7f\x0a\xb8\x80\ +\xf9\x07}\xfdg\x12o0\x80\xf1g\x80\x06(\x0c\x16\ +x\x81\x17\xf8\x04\x13\xc0\x80\x1c\xb8\x80)\xf6\x80\x0a\xe1\ +\x08\x14\x88\x81$X\x82$\xe8\x02\xd5\xd0\x81*h\x7f\ + \xb8\x10\xb6`\x82\x17x\x0228\x834H\x83\xfd\ +0\x0a+\xb8\x82-\xe8S5\xd8\x83\xc1\xf0\x83@\x18\ +\x84@\x08\x04\xa3\x80\x00Fx\x84H\x98\x84H\x88\x7f\ +U\xb3\x83\x08!\x06P\x18\x85R8\x85T\x18\x85\xc2\ +\xa0\x84X\x98\x85H\xe8\x84\x09Q\x85^\xf8\x85b\xa0\ +\x85b\xa8\x84\x5c\x88\x10Fp\x86h\x98\x86j\xb8\x86\ +iX\x84c\xf8\x86MX\x86\x04\xa1\x05tX\x87v\ +x\x87v\xc8\x04z\xa8\x87\xc1\xb0\x02o\x88\x85\x8a\x10\ +\x88\x81\x08Kr(\x10\xb5\x80\x87\x88\x98\x88u(\x06\ +9 \x88\x8e\xff\xf8\x88\x90\x08\x89\x06W\x88\xff`\x0b\ +\x14p\x89\x98\x98\x89\x9a\xb8\x89\x14@\x87\xed \x01\x91\ +\x18\x8a\xa2H\x89\x03\x91\x00\x8dp\x8a\xa8x\x8a\x9c\xb8\ +\x8a\x14\x00\x04\x8f \x8a\xb0\xf8\x88\xa4(\x10\xe4\x00\x03\ +0\x90\x8a\xb8\x98\x8b\xb9H\x01\x80p\x01\xb1\x18\x89\xa5\ +\x10\x8c\xc2\x98\x0c\xb3\x98\x01\xb6x\x8c\xc8\x88\x8c\xba\x98\ +\x8a\x87p\x04\xa2(\x8c\xd0\x18\x8d\xc2\x98\x08\xb3\x18\x02\ +\xc9p\x8d\xd8x\x8d\xc9\xb8\x8d\xca\xa8\x09~ \x8d\xe0\ +\x18\x8d\x1d0\x8e\xe4\x18\x11\xa4H\x0c,\x90\x8e,\x90\ +\x8d\xec\x88\x8d\xdc\x08\x03\xc6 \x06\xe1(\x8c\xe4X\x8f\ +\xf6\xd8\x01\x7f0\x8b\x8d\xa0\x06\xea\xd8\x8f\xea\xd8\x8e\x00\ +i\x06!\x00\x8d\xf7X\x90\xe3\x88\x08\x08\x99\x90Z'\ +\x87A\xa0\x06\x0e\xf9\x90\x0e\xe9\x8f\xfe\x08\x90\x80e\x90\ +\xf6\x98\x90\x18\x99\x91>@\x8980\x02\x1e\xe9\x91\x10\ +\x19\x92\x12\xe9\x8fU\x03\x0d\xf7\x98\x91(\x99\x922@\ +\x89O\xf0\x91.\xf9\x91!\x09\x91\xfe\xd8\x08\x02a\x00\ +\x1d\x90\x928\xff\x89\x92\x07p\x00q@\x89\x8d\xf0\x02\ +@\xf9\x02/9\x941\xf9\x90\x1b\xf9\x0f2\x90\x939\ +\xb9\x93L\xb9\x93\x85H\x0dS0\x05A9\x95CI\ +\x94\x0f\x09\x02\x02a\x04J\x89\x91M\xd9\x95N)\x87\ +V\x10\x95b)\x95S\x09\x94U\xf9\x92g%\x10J\ +\xe9\x95l\xb9\x93\x94 \x87p\x90\x02r9\x96QY\ +\x96Ay\x966\xf6\x0f\x7f\x90\x91m\xd9\x96\xa3\xf0\x97\ +\xa3 v;\x98\x00\xf1P\x98~ \x97)@\x97u\ +i\x97B\xe9\x91\xc48\x10\x05\x80\x08}\xc9\x96\x80Y\ +\x99\xa3`\x01\x5c\xe8\x09?\xf0\x03\x85i\x98\x88\x99\x98\ +t\xc9\x98/@\x0c\x04\xd1\x08\x93\xd9\x94\x96\x99\x9am\ +\x90C-8\x05z\xb0\x04\x9b\xd9\x99\x9e\x89\x98\x8aI\ +\x96@\xc9q\x04q\x9a\xa9\x99\x9a+\xd0\x9b\xb9\xd6\x82\ +\x1b`\x01z0\x9c\xb0\x19\x9b\xb2y\x98\xb4\xa9\x98/\ +\xa0X\x04\x01\x01\x94\xb9\x9b\x95\xd9\x9b\xd2\xb9\x02[\xb0\ +\x83#`\x01\xd89\x9c\xc4\xb9\x99\x9c)\x9b\x9f\x09\x9a\ +Q\x09\x03\x06\xff\x91\x04\xa8\x09\x9d\xd19\x9d\xd3\x09\x04\ + \x88\x02I\xd0\x9e\xd8)\x9c\xdaY\x9c\xdd\xe9\x9d\x9f\ +9\x053g\x10\x07`\x9e\xe7\x89\x9e\xd2\xd9\x02-P\ +\x9d\x0f8\x05EP\x04\xed\x99\x04\xef\x09\x9f\xdbi\x9c\ +\xf4\x99\x02\x0bI\x10U\xa0\x9f\xa3\xc0\x9f\xd3\xe9\x9f\x14\ +J\x93\xe9\x87\x09\x89\x90\x08\x970\xa0\x05z\xa0\xda\xf9\ +\x9a\xdc9\x9f\x85\xc9\x7f\x06\xf1\x03\xd0)\xa1\x13J\xa1\ +-\x00\x0a\xa00\x01\xe9\xd7\x0c\x16 \x03\x19\xaa\xa1\x1c\ +\xea\x9e\xef\xf9\xa1 \xaa\xa0\xf7i\x10:\xc0\x9b(\xba\ +\x02*\xea\x9f,\x0a\x0ar\xd0\x0adp}b\x00\x05\ +2\xb0\xa43\xba\xa1\x04\xda\xa17\x1a\x9f\xf2\xf9[\x07\ +a\x02\x7f\xf9\xa3\xbd\x19\xa4+\xca\xa2rP\xa4\xad\xd0\ +\x0a\x9a\xd0z:\x90\x05P\x00\x05\xf3\xb0\xa42\x9a\xa1\ +NZ\xa0\x06\x1a\xa5\xf1I\x01\x0aq\x02X\x0a\xa4A\ +:\xa4]\xfa\xa5x\x0a\xa0v\xe7\x0az\xe0\x04N@\ +\xa6f\x8a\xa6MZ\xa36\x9a\x9d\xda\x89\x9b\x091\x01\ +(\xaa\xa5v\xff\xea\xa5xz\x0b\x90\xba\x07\x8aG\x01\ +\xc30\x0c~\xfa\xa7e*\xa8\x83\xfa\xa4\x85\x8a\x9dS\ +\xd0_\x051\x05\xfc\xc9\xa8\x8d\x8a\xa7\xadp\x0c\x90z\ +\x0b\xba\xa0\x0b\xbf\xc9s\x9aP\xa9\x95z\xa9\x80z\xa6\ +L\xaa\xa6k\x0a\xa5\x16\xb0\xa3\x0a\xa1\x0b\xfdY\xa7\xa5\ +j\xaa\xa9\xaa\xaa\xba\x90\x03u\x87r\xb0z\xac\xb2Z\ +\xa6\xb4\x9a\xa6\x1az\xab\xed\xb9\x04q\xa8\x10\x89@\xa7\ +\xbeJ\xa4\x8e\xfa\xa5\xa8\x9a\xaa\xab\x9a\x03\x1a\xa0\x01\x10\ +0\x89\xcf&\x0b\xe7\xb0\x09\x04@\x00\xc7j\xa9~\x0a\ +\xa8J\xaa\xa9\xcdZ\xa3\xfd\x80\x12\xbaP\xad]z\xad\ +\xad\x10\xac\xab:\xac\xdd\xda\xadoYn\xb6\xb0\x04\x9b\ +\xf0\xaf\xe5z\xae\x97\x8a\xa9\x81Z\xab\xb6J\xa0yY\ +\x12I@\xa1Cj\xad\xa6z\xaa\xf6:\xac\xdc\x9a\xaf\ +\x7f\xf0\x07\xa1\x10\xadx\x96\x02G\xb0\xb1\x00k\xae\x02\ +\x9b\xaeeZ\xb0\xcc\xaa\xa1\xef\x9a\x12\x1a\xd0\xb0w\xfa\ +\xb0\x11\x8b\xaf\xf9\xaa\x01\x15\xdb\x00\x0dp\x01\x18{c\ +S\xc0\x09\x1b\xff\xcb\xb1\xe4\x1a\xb0\xc8\x9a\xac\xca\xaa\xa9\ +I@\x88'1\x05\x5c\x9a\xb2x\x9a\xad\x90z\xaf\x13\ +K\xb1\x7f\x00\xb30kMx\x16\x0f\x0f\xf0\x00\x9c`\ +\xb38\x9b\xb3\xe7\x8a\xae\x7f:\xabh*\x03N\xb6\x12\ +\x10@\xb4\x8f\x1a\xb19\x90\xb4.\xfb\xb2L\x0b\xb3\x06\ +0fI\xa0\x0cQ+\xb5T{\x04\xffj\xb5\x1f\x0b\ +\xb2=\xfb\x03\xcd\xa5\x12@\xf0\xb0\x10\xab\xad\xdbJ\xb6\ +\x15\xbb\xb4g\x0b\xb3m\xe0\x06C\x90`\x0b\x00\x05\xca\ +\xc0\xb6m;\xb57\x1b\xb7:;\xb7\x04\x0b\x05\x1f\xc8\ +\x12\x17\x00\xac+K\xb6e\x0b\xb8\x81\xdb\x06\x9c\xeb\x0e\ +\x9b\x07\x5cO\xf0\x00\x89\x9b\xb8m\xeb\xb6\x8d\xdb\xb1\x1e\ +\xbb\xb3 KnH\xd1\x00{{\xb4}\xdb\xb2\x99\x1b\ +\xb8\x82\xcb\xb9\x9c;\x01\xd4\xb8X,\xc0\x00\xbc;\xba\ +\x8a\xbb\xb8\xa7\xdb\xb1W\x8b\xb5\x83@\xa5F\xc1\x02\xc1\ +*\xac\x12+\xbb\x7fK\xbb\x0d`\xbb\xb7;\x01\x13P\ +\x03\xdc\xb6P\x820\x0f`\xc0\xbb\xbd;\xba\xa5+\xb5\ +7\x0b\xb7\xc2\xff{\xb5~\xfa\x01_1\x00|\xcb\xb2\ +-\xdb\xbc\xb4\x0b\xbdm \xbd\xd2\xeb\x0e\xee\x80\x99\xd7\ +d\x0b0\x00\x06\xf6\x9b\xbd\xda\xeb\xbb\xdd\xfb\xb6\xe0\x9b\ +\xb3\xa9\x0b\xab\x08\xf6\x15\x13\x80\xb4\x98;\xbb\xeb\x0b\xbd\ +\xee;\x01\xf0\x0b\xbfn\xc0\x04\xfb\x02\x08\x0fP\x00\x05\ +p\xbf\xf8\xbb\xbd\xa4[\xba\xfc\xeb\xb8\x8f;\x0c\x83@\ +\x0da\xd1\x0f\xb1\x9b\xbe\xea{\xc0\xd1\xeb\xbe\x0b\xec\x0e\ +\x12 \x01&\x00\x08\x83\xa2\x09Y\x90\x09} \xc1\x13\ +l\xbfT\xa0\xbd\x0c\xa0\xbf\x18\xfc\xbd\x1a\x9c\xba\x1b\xb0\ +\x17\x890\xb6\xcc;\xc2\x9b\x8b\xc0&\xbc\xc0)\x9c\xc2\ +U\x10\x0a\xea\xb9\x1e\xb5\xf0\x01Yp\x01\x99\x10\xc52\ +L\xc16\xec\xbb\xbf\x1b\xb5\x19\xac\xc1\xc3 \x06}\x11\ +\x0aA\xac\xb9$\x5c\xc2\x0al\xc4G\x5c\x05f\x5c\x05\ +\x940\x02\x84\xc6\x17\x1e\xa0\x05\x0cp\x01p\x1c\xc50\ +<\xc5\xf7[\xc58\x0c\xbc\xc1K\xaeNg\x19\x10\xa0\ +\xb4`<\xc4\xb6\x9b\xc0c\x0c\xbfG,\x01g\x0c\x01\ +\x88\x0c\x09`\xff\xd0\xaa\x1f<\x08\x5c\xf0\xc8;\x10\xc7\ +r,\xc33l\xbfv\xcc\xbd9\xac\xc3\x9bp\x0e\x09\ +\xbb\x17C0\x01\x06\xec\xbc\xec+\xc8'\x5c\xc8g\x5c\ +\x05\x88\x0c\x01\x90\xb0\xca[`\x02?\xc0\xc2G\xf1\x01\ +#\xc0\x00\xa10\x00\xb6\xfc\xc8\x5c\x00\xc7P<\xc9\x12\ +L\xc15\x9c\xbfw\x8c\xc5\xdf{\x04\x0f\x17\x1d\x0d`\ +\xb6\xa2L\xc4E\x0c\xbf\xcb`\xcaf\x9c\xca\xaa\xcc\xca\ +[\x00\x00n\xe0\x063\x00\x05j\xe0\x03V\x10@\x07\ +B\x10o\x80\x03\xff@\x020\x90\x04\x05`\x02&\x10\ +\x0a\xe8l\xcb\x03\x80\xcb\x91\xbc\xcbQ\x1c\xc3\xbd\x5c\xc7\ +\x97|\xc1x\xbc\xb1\x88:\x1b\x14\xf0\xc7g\xcb\xbe\xed\ +\xbb\xcc\x84\x5c\xc6\x87\x9c\xc8\xab\x0c\x09\xd3L\xcd\xd5L\ +\x0b\xb4\xe0\x00\x8f\xb0\xd0\x94P\x02%P\x03\x10m\x00\ +\x12\xbd\x06\x14=\x03\xe6\x8c\xce\xa10\x07\xb7\x8c\xcb\xba\ +,\xc7\x99@\xc9T\x0c\xcc\x98\x9c\xc9\xe4\xbb\x1ej\xe0\ +\xbc\xcf;\xca\x09\x5c\xca\x00\xfd\xcc\xa9<\xd0[P\xd0\ +\xd5\xec\x06\x09\xff\xad\xd0\x0c\xed\xd0\x10]\x03\x12m\x00\ +\x14\xbd\x06\x16}\xce\xe8\xac\xd1\x1b\xcd\x05\xed\xec\xd1\xf0\ +\x5c\xc9\x96,\xd2\xf4\xbc\xb8\xb0\xdc\xd9w\xbd\xde\xcf\xbd\xd5\x94\xa0\ +\xe0\x9b\xcd\xd9\xd5m\xe2\xf4\xcd\xd1\xbe-\xe1\x14|\x04\ +!\x90`\x05p\xc24.\xe0\x03N\xd9\xce\xfd\xe1:\ +\xce\xe3=\x9e\xdb%\xee\xd9\x0f\x9e\xe2\xda\xbd\xe2t\xfc\ +\x03\xc6\x8b]\x14\x00\x01d\xbc\xdc\xcc\xdd\xe1X\x0d\xe5\ +\x09.\xe5\xf1-\xdf&~\xe5\x8f\xac\xcb\x11N\xc9\xca\ +\x80\xda7\xa6\x0cK~\xcau\xcd\xe1d~\xe0\xd0\xbd\ +\xe3}\xed\xd7Tn\xce\xd6}\xe2(N\xd4\xbe\xfd\xdb\ +\xf1@d\x8e\xff\x06\x085\xe0\xdaw\xce\xe11\x8d\xe3\ +f~\xe6}>\xe5=\xdd\xe0@\xce\xe6\xd9\x9d\xe5\xd1\ +\x10\xa6\xe5\xe6\x0a,\x00\x09L\xbe\xe1\x8e.\xd3\xb3\x0d\ +\xe2\x5c\x8d\xe6iN\xe2\xbb\xfd\xd9\x83\x9e\xddr\x0c\x06\ +\xc20v\xf1\x00\x09\xa7l\xe3N^\xe6\x98\xcd\xd0\xa8\ +\xee\xe3\x96n\xe5\xd8\xed\xe6`\x00\x07\xad7\xeb\x8d\x9e\ +\xde\xeam\xe0\x07\x9d\xeb\xa7>\xe9\xd3\xfd\xe7\xab\xce\xe6\ +\x84]\x00\xe2\x99~,@\x09c\x9e\xe7\xa5\xbe\xe7\xbb\ +N\xdd\xd5\x1d\xe8\xac\x8e\xcb\x5c\xa0\x0c'\xc0\x9c\x0f\x08\ +\x08\xca`\xec\xd8~\xd9\xca\xce\xe7\x9a\xdd\xe3\xdc\xde\xeb\ +\xbe\x0e\xdaI\x80\x95r\xa8\x06\xa1 \xcd\xa4\x9e\xecZ\ +\xad\xed\xcc\x9e\xe6>\x0d\xef'\xfe\x00Z\xd0\xa0\x85\x98\ +\x01#\xb0\x03\x05\xfe\xe4\xca\xbe\xec\xed\xde\xec\x95\x0e\xf0\ +\x9b@\x01\xc66\x8b\x07\xe1\x03\x89\xb0\x06\xb8n\xea\xb6\ +\xdd\xf0\xfe\xde\xed`\xe0\x07J\x80\xe8\x14\xaf\x10\xe4\x00\ +\x08/\xb0\x07k\xb0\xf0]\xcd\xf1>~\x01\x97\x90\x0c\ +\x1f@\xf0#%\xaf\x12C\xe0\x09\x140\x05I\x10\x0d\ +`0\x07\xa1\xb0\x06\x0fm\x02\xeb\xac\x0cP\xa0\x07/\ +\xc0\x04\x1f\x80\x0e]~Z\x01\x01\x00!\xf9\x04\x05\x03\ +\x00\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\ +\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*Lx(\xd9\xa0\ +Pn\x1a \x12\x80\xea[\x85\x0a\xaa\x22p+\xa5\x01\ +\x92\x092,<-\x1cI\xb2\xa4\xc9\x93(S\x1ed\ +\x01f\x02\xb7X0\xdf\xbd\x13A\xb3\xe6\xc5\x9b7\x09\ +\xe9$E\xea[\x83Lj2\xa8\x1cJ\xb4\xa8\xd1\x83\ +8^8@v\xaaiS\x98\xb1d\xd6\xb4\x893'\ +!\x9eXI\xfd2\x15\x01R\x0a\x1dG\xc3\x8a\x1dK\ +\xf0\x01\xa2Uhw\xedr\xfa4\xaa\xd4\xa9U\xadf\ +\xe5\xb9\xd5\x94]SD\xc0\x80 \xcb\xb7\xef\xc8\x0c\x9b\ +J\xa1\x19\x8c6-\xdbS1\xdfR\x8d\xbbsn\xdd\ +\xbb\xa9\x22#S\x86\xc2\xafe\xbf0&`P\xc1\x99\ +p\xe1\xb5l\x13\xcf\x84\x1b\xb7B\xe3\xac\x8f\xedF^\ +}\xe3\x98\x1a[\x97c\x17\x9d\xc7\x08\x83\xed\xcd*\x06\ +\xa3\xf9|\x18\xaab\x9a\xa5M_u|W5\xeb\x1b\ +\xc8\xeb\x1c\x99%\xbby\xc9\x02\x11\xea\xdd\xb6\xdd\xd9\xf3\ +\xaa]\xccB'\x9e*\x22\xf8i\xba\xc5M\xad\xff\x8e\ +\x8c\xbc\xfc\xacY\xbe\x98;__\x90A\x8fz\xf0\xa7\ +\xe3\xce\xbd\x9b\xb7S\xdf\xa3\x17W\xfd\xae5\xfc\xf8T\ +\xe5!w\x1e,\x04\xaa\xc7^s2p\x03\xdf\x82\xd2\ +MW]a\xd7\xf5\xe6\x16w\xde\x0d\x87Uj\xe2\x1d\ +g\x1ez\x04~\xf1\x05,\x07\xc6\xa6\x85\x22\x0c2(\ +_u\xf5E\xa8\xddo\xdd\x95f\xe1\x85\xc5\xfd\x17\xe0\ +\x0d\xe7\xf9\xd2\xe1\x171\xf0\x02b\x88|A\xa2\x8a*\ +u\x94\x18\xdf\x89\xf4}\x96\xdd}\x13\x92\xb6\xdf\x8b<\ +\xf9\xa7\xa1y6\xc2\xe2\xe1\x17\xbcT\xf9\x85/<\x86\ +\xf5\x83\x00?\x02\x19\xa4\x90DZ\xa7b[,\xba\xc8\ +$\x86\xe3\xcdX\xe3\x8d9V\xc9K-_dY\x94\ +\x04\xc0t\xf9\xe3\x97%\x86i\x1dhd\xfef&q\ +1>Ic\x94S\xba\xf9f-\xaf\xf0\x82\xa5\x9c'\ +i!\xca7u\xdaY\x07\x9e&:X\xa4aH&\ +\x09\x1ccg\x06J^\x80kJ\x89\xa3\xa1\x88\xbe\xf2\ +\x8a+q2J\x12\x18\xdf\xb4\x0a\xa9\x9d@\x0a\xff\xd9\ +\xe0m\x0fb\x8a\xa4\x9f\x9c\x02j\xdc\xa7P\xdeH\xa5\ +\x9b\xb5\x94z\xaa+\xbc\xa8\xaa\x109\x13\xb0\xc2\x8a\xab\ +\xafJ*\xab\xa5\xba\xd9\xd7\xa7\x928\xf1\xe7$\xaf4\ +r(j\x9b\x87\x9a:\xac+\xb9\xb8\xb2\xa3\xb1\x04Y\ +\xa1\x88\xb2\xcb\xba\x1ai\x97\x94.\xa8\xa7\xb4\x88i\xda\ +\xe2\x92\xa8y\x0a \xa8\xb3\xf8Jj\xa9\xae\xf4\x9bK\ +3\x00\xa7J\xee?\xc2(\xd0\x03\xba\xe9\xb6\xba\xee\x9d\ +\xcf\xd2z\xe9\x98\xf1\xe2\xba\x9f\xae\x19b\x1b\xaa\x87\xfb\ +\x9a\x1a\x88\xbf\xff\xda\xe2q\xb1\xe4\xbe\x80J\x04\x11\x1c\ +\x8c.\xb3\x0bO\x0a\xa6\x83{\xae\x98\xdf\xbc\xd5R\x9c\ +\xe6\x86l\x02+l\xbf\xe06\xe3\xb1-\xb8\xe0R\x8b\ +\xb1\x16\x90,\xb4\xc9\xca\xaa\x0bk\xbbCR\xf70\x9f\ +\xdb\xe9\x97\xd3\x5c\xd7\xaaI\xe8\xafU\x06k*\xce\x1d\ +{\xdcs\xcf\xaf0*\x83\xd0C\x13\x9dp\xcaHC\ +\x9b\x22\x9f\x88I\x1csV\xf6\xe2[s\xd5\xfc\xfa\x0b\ +\xb0\xc7\xd2l\x8dK/\xced\x09\xc5\xc8`\x93\xff,\ +6\xca\xce\xe6\xc9\xf2\xd9+R{\xd1w\xa9\x09\xaa-\ +\xc6\xc0z+\xb7\xceZo\xdd\x8b,\xb2\xe4}\xa0\x1e\ +\xa8d\xde\xb7\xdf\x08\x1b\x1dx\xa5J{\x86vL\x86\ +\x0bW/d\x16\xe7\xbb\xad\xcdW\xcb\xbd\xb3\xdd\x93S\ +N\x8d+\xec\xbd\xc0\x0d7\x99\xf3\xdd\xf7\xdf\x0a\x7f\xee\ +\xae\xc3\xd6\x1d\x19q~\xb9\xc2\xb8\xeb\xbd\x02N\xcd\xfa\ +\xb7Y\xf3,9\xe5\xb2P#=\xed\xce\x09p;\xee\ +\x9ao\xce{\xb3\x0c\x0bN]\xcbXT\xc1@\x0a\xff\ +\x84\x90\xd0\x09\xf1\x80\xe1\x0e*\xa4x\xea\xb6\xa8\xa4:\ +\x9e\xf3\xeb\xcf\xcb.=5\x09\xfc,[\x1a\xd7\xdf\x9e\ +\xfb\xe6%;\x99\xab$\xd5.\xb3q\xc0\x04, \x0a\ +\x0eFP\x03\x01T\x0cT\xca\x83[\xeb\xfe\x059\xd8\ +A\xef~\xf8K@\x02@\xe6\x17\x0fL\xa4\x18\xfd\xc3\ +\x9e\xee\xc0F4\xcfu\x0ft\x18\xc8\x81\x05\x842\x96\ +!\x14a\x14\xc8\xa3\xd1\x8d\x96\x875\xc8\xd5\xadg\xb1\ +\x8b\xde\xfd4\xc8C\x81\xf1E\x02\x02\x08\x22\x08\xff\xfb\ +\xf7\xbf\xddu\xaew\xec\xca\x13#8\x81\x8e\xd8\xa0\x00\ +\x0cu\x18T\x87\xb8U\xaa\x8d\xcd\xcf\x167\xbc\xdb\x05\ +w\xc8\xc37\xbc\x81\x1a\x06\x1a\x0b\x03\x82HF\xeb\x11\ +1{$<\xe27|7\x8a\x11\xb0\xa7\x19SP\x1d\ +\xe3\xba5\xac\xe6\xd5O\x87\xd2\xe3!\x0f\xbc\xe8E\x5c\ +\xf0\x85\x09\x96\xb0D\x19\x85x\xc6\x11r\xaehHd\ +\xd8\x01\x1a!\xa7|\x8d\xaaj\x13\x84\x9c\xf3\xb4h\xbf\ +,\x0a$\xb0\xc0\xcb@\x0a\xb2\x8c\xa3\x14\xa1\xf6N\ +\xf9\xa3\x0b\x0cL \xb3\xf8\x82\xd5\xeaXA\x1cn\xd1\ +\x92\x09\xc0\xa4\x17m\x19\x00\x0f$ ,S\xe0\xa56\ +}9\xc8`\x161\x8d\x88D\x84\x0b\x8eI\x10X \ +\xcau\x93\xc4\xc53y\x98\x00ZR\xb3\x9a\x1e\xf0\x80\ +4\x8c\xb2\x802h\xf3\x9e\xa0\x1cd!7w\xff\xb2\ +P8\x82\x9c\x05\x99E-\xae\x98\xc5\xd8qQ\x83\xee\ +\xa4f<\x17\xcaA\x95<\xe2\x9e\x10\xcdg\x19\xf7\x99\ +Fn\x004!\xbc\x90d\xfd\x0e*\xcdZ\xdar\xa1\ +\xf1$\x079\xde@\x14&(@\x01\x10\xc5\xa7D\x83\ +HQ\xa1\xad\xc3|\x17E\xc8\x17t\xb6QhvT\ +\xa1\x0b\x15\xa9Hi\x00\x1b\x95\x80\xe2\xa4(M\xe96\ +\x7fIFo\xea\xee\x16\x0b\x88\xa9B`\xd1\x04g\xe2\ +q\x96\xd3\xfc(HuJ\x03\x1a\xf0\x81\x1c\xe32\x89\ +\x05\x80\x0aT\xa1\xf6\x92\xa8\x84\xbc\x9e\xe6&\xa0\xd4\x91\ +\xf8\xa2\x09\x06\xb5i&\xa5\x1aR\xaa\xf2\xe1\xad|\x90\ +\x05J\x02P\x06\xaev\xd5\xab\x9f\x04\xab7\xe3PV\ +\x92\x9c\xf5\xa9\x08]\xab&\xa7\xbaS\xb8\xbeu\x01\x0b\ +\x88\xc1I\x08\xc0\x88\xc6\xda\xf5\xa4x]\xa9\x19\xb9\xe1\ +\x0e?\xf6\xd5\xac\xb8\x80\xa6`\xe1\xd9VrT\xd5\xb0\ +|@\xec\x02\xaeY\x12\x1a\x94\x01\x19\x8du\xecc\xbd\ +*Yn\xdc\xe2\xb2&\x81\x85,.\xb9Y\xc2\xffz\ +\x16\xb4\xa2\x15mC\x15\xb2\x09d\xf8\x16\xb5\xaa\xb5k\ +d\x89\x8a\x08\xd8\x9e\xe4\x0b\xd4\x90&[=\xe0V\xc3\ +\xe6v\x018\x88.IG\xf2\x06E\xfc\xf6\xb7\xa9}\ +lPS\x0aJd\xc0\xd4\xb8%\xe1\x85`mkU\ +\xb8>7\xba\xe8\xc5\x01I\xf4p\xdd\xeb\xa6\x96\x11\xda\ +\x15j \xc1\x9b\x92\x5c\xe0\x94\xb9\x85u\xaeh\xd3\x8b\ +\x03\x1d\xf8\x97\xb4\x09q\xc5(\xda\xdb\xde\xf7\xae6\xa5\ +\x5c\xa0oJd\xc1Y\xfc\x96\xd7\xbc\xfbM\xaf\x7f\xfd\ +\xeb\x053d\xd5 ZH\x03\x81\x09l`\xe1j\xb3\ +\x05\x0aN\x09,\xe0\xd9\xdc\xc3F\x18\xbd\x13\xd6\x81\x17\ +\xbc \x08A\xc85!\x0eH\x83\x8c5\xbca\xecf\ +\x97\xab\xda\x0c\xb1J^\xe1`\xfd\x22\x96\xbf\x13^q\ +\x8b\x87,\x0f\x85\xcc\xf8\xc85\xb61|\xed\x0a\x06\x1d\ +\xab\x84\x1a\xb75\xf1\x8f%La\x16\x0f\xb9\xc5\x19\xc8\ +@\xd7\x0eR\x04\x0e\x1c\x19\xc9I\x06\xee\x92\x15P\x5c\ +'\xa7\xe4\x0b\xe4\x800t\xa9\xacb+_9\xff\xcb\ +\x19@\xc7t\x0d\xd2\x00\x0e\xd8\xd9\xcb_\x96q\x98\xb3\ +\xebF3\xa7D\x1a\xa1=q\x7f\xab|eA\xc09\ +\xce\xe8@\x07X\x0eB\x84;\xdf9\xcfzN2#\ +4\xe0g\x95\xcc\x82\x1cS\x8en\x90\x0bm\xe8,'\ +\x1a\x1dC\x08\xf5\x10\x9aa\x90D\x10\xe1\xd4\x8dv4\ +\x9e\xbf\x9cd&TZ%\xd2\xa0\xb2\x90\xdf\xec\xe9D\ +\x8b\xfa\xd6\x1e0\xc8\x04P\xcdkU\xaf\x1a\xcc\xbfm\ +\xc0\xab\x87\xc2\x87A\xcfz\xc8p\xfe\xf4\xadC\x8d\x82\ +f\x0b\xa2 |\xe0\xb5\xb4O\xadjH\xff6\x19\xc3\ +V\x89,T\x5c\xe8d\xdbz\xd9\xcd\x0ew\xb3\xb7,\ +\x90dL\xfb\xdc\xa9~\xf4\x97G\x91\xed\xa1\xd8\x81\xd6\ +\xca\x06\xb7\xb8\x9bm\x8cz\xf3\x80 ;@\xb7\xbe\xab\ +-\xe3A\xb4[%o\xe84\xa2\x97=\x84y\xd3\xbb\ +\xde\x08O\xea@\xa0\x81\x80\x86\xeb\x1b\xdd\x8eN\xc3\xb3\ +\xff\x8d\x92W\x0c\x5c\xde\xe2F\xb8\xc6\x8d\xb1\x81\x0dT\ +F 8h\xb8\xc8E\xfe\xf0is\x00\x02\x14\xffW\ +\x89!nmp\x14l\xbc\xde\x1d\x8fy\xc7\xa9\xa7\x85\ +\x91\xdb\x9c\xe4%'\xc2\x0bR\x9e\x12\x1e\x14|\xde/\ +\xe7\xb8\xccen\x05+\x906\x0b7O:\xce\xcf\xad\ +^\x9e\x9f\xe4\x15\x19\xdf\xf8\xd0\x89^\xf4\xaa\xf3A \ +%P\xba\xd6\x97N\x8468=%\x19x\xf9\xd4;\ +^\xf5\xb2W\x9d\x85-P\x84\xda\xb7\xce\xf6h|\x1d\ +%\xe4\x80\xf9\xd4\xcd^\xf6\x10\xd8\xfd\xeeV\x10\x88\xda\ +\xf7\xcew\xb6\xdb\x5c\x18o?\x095\x86N\xf7\xa2\xdf\ +\xfd\xf0\x88\xef\x1a\xdf\x17\xcf\xf8\xad\x07\xfe$\xb5(\xbc\ +\x15\x10OyMX\xfe\xf2\xbd\x10\x03\xe37\xbf\xf9\x91\ +W\xe3\xf1'1\x86\xe1)\x7f\xf7\xcb\x9b\xfe\xf4o\x88\ +\x07\xe7W\xbf\xf95\x80\xde$\x91\xa8\xfc\xe9g\xaf\x09\ +\x10\xd8\xde\xf6|\x08L)J\xc1\xfa\xde'\xe2\xf5%\ +\xe1\x03\xedM\x7f\xfb\xe2\x1b\x1f\x04:\xb8\xc0\xee\x97\xcf\ +\xfc\xe5\xf7^\x11\xd8\x06\xfeH\x02@\xfc\xe3\x1f_\x0a\ +Rx\x82\xf6\xb5?\x04J4\xff\xfb\xe0w\xbe\xff\xda\ +\x01!\xfd\x91P\xc3\xfa \xc8\xfe\xf6\xd7\xcf~\xed\x1b\ +\xa3\x0a\x1d\x88\xbf\xfc\xe7\x1f\xfe\xef\x7f\xbc\xfc\x09\x91F\ +\xfb\xf7\xdf\xfe\x0f\xf8\xdf\xff!\xd0\x00\xf37\x80\x04X\ +\x80\x1dP\x0aW\x87\x7f\x01\xc6~\xff\xd7\x80\x0e\xf8\x80\ +\x1f\xa0\x09\xe5`\x80\x14X\x80\xbd\xa0\x80\x0a\x01\x81\x0f\ +x\x08\x1c\xd8\x81\x9e\xf0\x81\x1f\xf8\x04\xad\x80\x08$X\ +\x82&x\x82(X\x82\x18\x98\x10_\x00\x82.\xf8\x82\ +0\x08\x83\x1f\x90\x824X\x83e\xb6\x82\x07\x11\x83.\ +\xe8\x02<\xd8\x83>\xe8\x836\x18\x84&\x88\x83\x08\xf1\ +\x83Fx\x84G8\x82B\x18\x84Dh\x101\x00\x08\ +P\x18\x85R8\x85T\x18\x85\x9e\xa0\x0b&x\x00Z\ +\xb8\x85\x5c\xd8\x85]\xd8\x84\x05\xc1\x0bU8\x86d\xe8\ +\x09m\xe0\x85h\x98\x86[\x08\x86\x04\xe1\x0a$\xf0\x86\ +p\x18\x87r8\x87p\xe8\x09\x10\xa0\x86x\xd8\x85C\ +\xc0\x86\x02!\x0b\xfd\xf0\x87\x80\xf8\x87\xc40\x88\x848\ +\x88tH\x02O`\x00y\xb8\x88\x07 \x12|\xff\x18\ +\x00>\x10\x88\x928\x89\x94H\x0c\x9aP\x00\x8cx\x00\ +\xa3\xb0\x89\x9c\xd8\x890\xc0\x87\xff\xb0\x00@\x00\x04>\ +P\x8a\xa6h\x8a\x948\x89V0\x0c\x5c\xd8\x89\xae\xf8\ +\x8a\xae\x98\x04\xa08\x04\xc2P\x8b\xb68\x8a\xb8x\x8a\ +\xba\x18\x89\x7f\x88\x02S\x00\x8b\xc0\x18\x8c\x03\x00\x8a \ +p\x02\xc6h\x8b\xc8\x88\x8c\xb88\x8a\xba(\x08'\x10\ +\x8c\xd08\x0a+0\x8d+@V|\xe8\x03\xc1\x90\x8d\ +\xc1`\x8c\xdc\x98\x8c\xdeX\x8b\xa3H\x03\xff\x10\x8d\x9c\ +H\x8d\xe6h\x8e|\x98\x0bb\xb0\x8e\xec(\x06\xda\xb8\ +\x8d\xdcx\x8c\xdfxM\xc0x\x8e\xf6h\x8f\xfd\xc0\x86\ +|`\x04\xfch\x04\xed\xd8\x8e\xef\x08\x8f\xf1X\x8b\xb9\ +\xf0\x0f\x0d \x8d\xf7\x98\x90\xf6\xd8\x02E\xc0\x86V\xa0\ +\x05Z\xc0\x04\x12\xd9\x8f\xfe\xf8\x8f\xec\x18\x90'\xe0\x03\ +\x02\x11\x0a\x0a\xa9\x90-\xf0\x91 \xb9\x05l\xe8\x03\x10\ +Y\x92\x119\x91\xfdh\x91\x00\xf9\x04\x02q\x09\x1di\ +\x8e \x19\x93 \x09\x0a\x0a\x87\x83\xb8@\x018\xff\x89\ +\x93&\x09\x91\x12\x89\x92\xfch\x91\xc6 \x10b\xd0\x91\ +2)\x93\xa0p\x94\xa0 \x07\x09D\x84C\xd0\x08N\ +\xd9\x089\xa9\x93;y\x92L@\x91\xfe\xa8p\x0b\xb0\ +\x90E9\x93H\x99\x94r\xf0\x95\x06\xd0\x84>\x00\x03\ +0\xf0\x94N\x19\x95R\xb9\x93=\xc9\x8f\x96\xf5\x0f\x13\ +\xb0\x95F\xd9\x95_\xf9\x95\xadP\x97\xad`\x068(\ +\x0b\xc9@\x96|i\x96P\x89\x96S\x09\x91\xed@\x10\ +\x0c\x00\x97]y\x94si\x97\x8ay\x0c?\x80\x83!\ +\x90\x0c\x90\xb9\x97|Y\x96~\x89\x96\x14`\x92,9\ +\x10\x14\x10\x97H9\x97r\xa0\x98\x8ay\x0b\xa2\xe9\x0f\ +8\xd8\x08,p\x9a\x91)\x99}Y\x99\x96\xe9\x05\x04\ +A\x0e-p\x98^I\x97\xa0Y\x97\xc7 \x9a\xb8\xa9\ +\x0bF\x80\x81C\xa0\x06\xbey\x9a\xa8\x19\x99\x93I\x99\ +\xacI\x01m)\x10n\xd0\x99\x89Y\x9b\xadp\x9b\xb8\ +)\x9a\xba\x10\x9d\x8f\x80\x81Z0\x02#\xe0\x9bj\x00\ +\x9c,\x90\x9a\xaaI\x96~\xd9\x08\x80W\x10z\xff\xe0\ +\x99\xcci\x9b\xcfy\x0b\xd1\x19\x9d9\x90\x03\x1a\x90\x8f\ +\xe5'\x0e\xd6\x19\x9f\xd8\x99\x9d\xc0\xc9\x9d\xc3\xf9\x94y\ +W\x10(\xf0\x99\xe5\xe9\x9c\xcf\x99\x9e\xba\xb0\x9e\x1a0\ +\xa0\x0eP~\xb0\xd0\x08/\xf0\x02\xf1i\x9d\xf3\xa9\x9d\ +\xf69\x9csF\x10[P\x9b\xfe\xf9\x9f\xe9)\xa0\x03\ +\x9a\xa1Z }\xc60\x05\x09\x9a\xa0\x0b\xca\xa0\xd8\xe9\ +\xa0\xa9I\x96b\x80\x10~\xb0\x98\xe7\x89\x9e\x00\x8a\xa1\ +\x19\xaa\x01\x7f\xf0\x07U\x00|\xae0\x02Sp\xa3\x1f\ +\xaa\xa0!\xda\xa0$\x0a\x99\xf9i\x10f\xd0\x9c+\xca\ +\xa2\xea\xe9\xa2\x19\x1a\xa31\xda\x00\xbf\x07z$\x90\x02\ +Nz\xa3\x1e\xfa\xa1!z\x9d#J\xa2\xd4\x90\x10\x5c\ +\xb0\xa2-\xca\x9e/:\xa0H\xfa\x07\x0d\x10\xa6\x0d\xf0\ +]_\xc7\x07\xf1p\xa6O\x0a\xa59:\xa5\xf3I\x9f\ +,\xa0\x91\x09!\x0c\xb9\xb9\xa5]\xea\xa5H*\xa6b\ +Z\xa0\x817\x02?\xf0\x03g\xea\x07i\x8a\xa3R\xca\ +\xa6#\xea\x9a\x0a\xe1\x0f\x00\x1a\xa0\x5c\xda\xa5_\xff\x8a\ +\xa7\x8eZ\x08o'\x0cz\xa0\x07}z\xa6\xf1\xe0\xa4\ +)\xa0\xa6kJ\xa8\x8c\xb4\x10#p\xa1\x8b\xca\xa8w\ +\xea\xa8b\xda\x06mp\xa2<\xb7\x01\x16`\x01\x93\xba\ +\x04\x95\x1a\x0f\x80\x9a\xa9\x9a:\xa8!\xfa\xa3\x09\x91\x00\ +\x0d`\xa4/\xda\xa8\xa4Z\xaa\xa6\xea\x0e\xf7\xd7n\xe4\ +`\x01I\xb0\xaa\x93J\xa9~\xfa\xa7\x81\x1a\xa5\xb4z\ +\x9d\xa46\x12IP\xa7v\x9a\xa4\xbd\xea\xab\xa6\xda\x06\ +n@q\xbd\xf0\x03E\x90\x04\xc5j\xacz\xe0\xaa\xc9\ +z\xa9\xcb\x9a\xa3:\xfa\x01&\xd1\x00\xa2:\xaa\xd5z\ +\xad\xd7:\x01\x13\xb0\x06/\xf6j\xcd\xf0\x02\x89p\x09\ +E\xd0\xad\xdfz\xac\xaf\x0a\xab\x98\x0a\xa5\xcc\xaa\xa0\xc7\ +\xb9\x10\x16p\xa4\xbcZ\xad\x0d\xe0\xae\xa6\x0a\xaf\xf0j\ +L\xaf\x16\x08# \x032\x90\x08\x89\x90\xaf\xde\x0a\xae\ +\xe1\xda\xaf\xb1\x0a\xb0Q\x8a\xae'\xd1\x06_\x0a\xa6\x08\ +\x9b\xb0\x0a\xcb\xb0\xf0\xea\x0e\xee\xd0d\x956\x02P0\ +\x0f\x12K\xb1\xf8z\xb1\x18\xdb\xa7\xe3\xfa\xafP\xff:\ +\x02=e\x12#\xc0\xae\x08\xab\xb0m`\xb2\x13\x80\xb2\ +(\xeb\xb0:V\xafN\x90\x05-\xfb\xb2\xf7\xaa\xaf\xfb\ +\xda\xaa\x1ak\xb3\x9aP_n \xb2#\xeb\xb3@+\ +\xb4(+\x01\xa1\xa0c\xd4\x10\x0f\xc3\xe0\x04G\x9b\xb4\ +\x13\xbb\xb4\xfa\xba\xaa\xac:\xa94k\xa9\xb1\xaa\x06\xbb\ +U\x12\xfd0\xb2$[\xb2&\x8b\xb5\xee \x01v[\ +\x02\x0a\xc6\x07\x970\x0c|\x0b\xb6H\xeb\xb2c\x8b\xaf\ +e\x8b\xb1\xe2j\xa9\x97\xcaB*Q\x00=+\xb7s\ +\x8b\xb5vk\xb7U\x00\x09\xe1yY\x9a0\x0c\x04\xc0\ +\xb7}\x1b\xb6P\xa0\xb4\x15\xcb\xb4\x84\x9b\xb6\xf1\xb0\x9b\ +DA\x03\x13@\xaa>\xfb\xb3W\xeb\xb8\x8f[\x05\xac\ +[\x05\xb2\xd8W\x8d\xb0\x09\x9b@\x00\x97\x8b\xb9~\x0b\ +\x05\x9b;\xb6K\xeb\xad\xdfz\xb6\x19\xfb\x03Sp\xa5\ +E\x01\x03\x8ez\xba@\x1b\xb4\xaa\xbb\xba\xad\x0b\x01&\ +\xb0\x011\xe5\x05Ip\x04G \xbb\xb4\x8b\xb9_\xab\ +\xb9\x9c+\xb82\xeb\xbb\xaeJ\xa6Dq\x01\xd6\xff\xea\ +\xae\xc7K\xb7\x8f\x0b\xb9\xcb\x0b\x01\xe8\xfb\x03\x17xL\ +\x14\xf0\x00\x9c \xbd\xd3;\xbb\xd6{\xbdH\x9b\xbb\x81\ +k\xb1\xdb;\xa9\x9dz\x14\x1eP\x05\xa7\x8b\xba\x8d+\ +\xb4\xe5+\x01\xad[\x05\xe8\x8b\xbe\x90\x00\x09%\x80\xaa\ +\x8c\x12\x03\x9e\xe0\x04\x0f\x10\xc1\xef\x1b\xbf\xf2k\xbd\xb7\ +k\xbf0\x8b\xbf\xbd\xeb\x07\xf3z\x14\x80`\xb5\xe3\x9b\ +\xbc\xe6\xcb\xba\x07\x0c\x01\x09\x9c\xc0[\xc0\x05\xe3\x94%\ +!p\x09\xca\xa0\x0c\x11\xec\xbe\xf0K\xbd\xb5k\xbb\xd8\ +\xab\xb4\xda+\xb3{H\x16\x16 \xbe!,\xc0\xe5[\ +\xc0\x06|\xc0'\xbc\x05[\x00\x00\x00p\x01\xee\xb9\x1e\ +O\x90\x08\x0c\xf0\xc2/\x1c\xc3\x13\x1c\xbf\xd5k\xc17\ +\xac\xbb1\xeb\xadK<\x16\xbc\xc0\x05\x0b\xfb\xc3Y\x1b\ +\xc4\x05\x5c\xc2'\x0c\x09F\x8c\xc4n\xe0\x06k\xb0\x94\ +\x97\x11\x00b\xb0\x09T\xc0\x00r\x0c\xc51,\xc3\xd2\ +K\xc3V\xac\xb9\x80K\xb1d\xcb\x02\x8a\xe5\x17\x00\x00\ +\xc6a\xac\xbc\xe7\x8b\xc0E|\xc4\x00\x90\xc6n\xff@\ +\x0b\xb4\xe0\x00\xca \x06\xe4@\x16\x01\x00\x08IP\x00\ +`p\xc9r\xfc\xc4t,\xc13\x8c\xc76\xac\xc7\xd9\ +\x1b\x0f\xeb\xeb\x17\xe8P\x05\x01\x0c\xc4bL\xc2d|\ +\xc8h\x9c\xc6\x8c\xec\x00\x8f\x10\xcb;\x90\x02\x9e\x10\xa1\ +'\x91\x00 \xc0\x02{\x90\x09\x05\xd0\xcb\x97\x0c\x06q\ +<\xc7Q,\xc5\x9d\x5c\xc1\x9f\x5c\xbf{\x9c\x08I\x90\ +k\xb1\xf1\x04\x0cK\xb7u;\xc0B\xbc\xca(\x8c\xc8\ +\x8a\xfc\xca\xb0\x1c\xcb\x94P\x02%P\x03\x5cP\x04\xc9\ +\x90\x8f8`\xcb\x02\xb1\x00\xc6\xa0\x04\x14\xf0\x03\x0fp\ +\x01\x17\x90\x09\xee\xdc\x07\xbdl\xc9\x98,\xcc\xc3\xcc\xc9\ +w<\xbb5\x9c\xb9\xa0<\xb1\x88+\x22\xc8+\xc2#\ +\xac\xca\x86\xcc\xca\x89\xec\xca\x8d\x9c\xcd\x8f\xb0\xcd\xdd\x5c\ +\x035`\x00\x0e\xbd\x06\x10=\x03&`\x02\xa1P\xd1\ +\x03p\xd1\x5c\x90\xd1\xec\xdc\xce\xee\x1c\xcf\xbf\x9c\xc9\x9a\ +\x0c\xc3\xc4\xdc\xc9U|\xcc\xb8\xeb\xb2{\xb1\x1e\xc9@\ +\xbe\xd2<\xc6\xd4l\xc6\xd6|\xcd\x0e\x80\xd0\x09\xff\xcd\ +\xcd\x0c\xdd\xd0\x0f\x1d\xd1\x13]\xd1\xa10\x07\x18\xad\xd1\ +\xec\xec\xce\xbc\xec\xcb\x1fM\xcf\x22m\xcf\x14\x5c\xd2\xfa\ +\x5c\xbf\x8eX;\xa8L\xc8\x02=\xd00\x1d\xd3\x8b|\ +\xd0\xb1\x9c\xd0\xdb|\xd38m\x00\x10\xbd\x06\x12M\xd1\ +\x15\xed\xd3\x03\x90\xd1\x5c\xb0\x03A\xfd\xce\x1e=\xcfF\ +]\xc7S,\xbb\xf8<\xbf`{\xb4$\x90%#\xe0\ +\x0e\xcb\xd0\xd2.-\xd50\xdd\xca\x06=\xd3W\xad\xd0\ +Z\xed\xd0\x5c\xad\xd3`\xdd\xd3?]\xd6g\xdd\xd1D\ +\xad\xd6P|\xd4v|\xcfom\xc5s-'\xd6\x80\ +\xd7\x85,\xd5FL\xd5\xd8|\xd55\xbd\xd0[=\xd8\ +^\xbd\xd3a}\xd8f\x9d\xd8i\xad\xd6!\xed\xd8S\ +L\xc5\xf9\xcc\xb7M-'F\x90\xcaQm\xc2e|\ +\xc6\x05\xdd\xd7\x08M\x09\x80\xcd\xd0\x82\xdd\xd5\xa1]\xd8\ +bM\xd6\x5c\xb0\xd1B\x0d\xcf\x8b\x1d\xcc\xa9]\xc7\x8f\ +\xed\xd6J-\x05\x03\xf3\x01\x90@\xc0y\xad\xd7\x99\xcd\ +\xd7\x9b\xfd\xd7\xbb\xbd\xd5\xbe\xfd\xd5<\x1d\xdcd\xffM\ +\xdcB}\xda`\x00\xd2\x8d\xcd\xd6m\x8d\xc7d\xb0\xc3\ +\x03\x83\x0e\x940\xcd/]\xdd\xb7]\xd5~\xfd\xd76\ +}\xd3\xbd\xdd\xd5\xdc=\xdac\xfd\xdd\x89=\xd4\xf2\x8c\ +\xda\x8d\xad\xda\xf0\x9b\xd4\xe7\x90\x80\xe4\xf4\x06`p\xd9\ +\xb4}\xc8T-\xdf4\x9d\xdd\xda\x1d\xd1\xf9m\xd8\xa4\ +\xdd\xdf\xc6\xfd\xdf\xe3\x9d\xc9\xe5\xcd\xd6\xc5<\x05\x1d\x0c\ +P?0\xc4D\x5c\xdb\xb6\xad\xc8\x0e\xce\xd9\xba]\xdf\ +\xbc\x9d\xd3\xbf\x0d\xdc\x17\xbd\xdf\x88\x9d\xd8\x17\xfe\xcb\x19\ +n\xd4\xaa\xdd\xd6\xa2\xdbWJ\xf0\x08/\xbd\xd7|}\ +\xe2\xd8\xad\xe2\x82\x0d\xda_\xed\xe2\x15\xde\xdf\xf1\x8c\xe1\ +\xe4\xbd\xc9#M\x06\xb6\xdaW\x01\xa0\x0c\xd4]\xe2\xd7\ +|\xd0\x0f\xae\xe2\x9f\x8d\xdf\x13m\xe40>\xdc\x16.\ +\xdeK\xce\xe4\x12\xbcs!\xa6\x05nP\xc6>\x1e\xdf\ +\xd7\xad\xcd\x10>\xe4Z.\xda\x16}\xd8^\xce\xd1h\ +\xbd\xd8\xc0\x1c\xe6\x8eM\x00\xaf\xad`\x1e@\x00\x0c\xfe\ +\xe3\x8cl\xd5A\xee\xd9YN\xd8\x85\x1d\x0a/\xff.\ +\xdc\xa5M\xe7\xfe\xad\xe4\x1a\xbe\xe1d^i.\xb0\x06\ +\xf0\xad\xe6V\x8e\xe2\xdcL\xe8\xf7m\xe8\xdf\x83\x1e\xd8\ +\x9b\xde\xe2\x9dN\xec\xc2\xbd\xd1\x8c\x9e\xe44>\xde\x0f\ +@\x01\xc2\x0bz0\xb0\x06\x81.\xed\xda\x9c\xe9\xd4\xce\ +\xe2\xd6\x0e\xeb\xb1n\xec\x17\xfe\xdf\x9b\xe0\x03\x03\x0bz\ +\x81\xe0\x09\x9b0\xd3\x0f\xae\xd0\x9a^\xedE~\xed\x89\ +N\xd6\xb2^\xdc\xdc\xfe\x03QK\x84|\x90\x0c;\x80\ +\xe2\x10^\xe8\xaf\xae\xdf]\x1e\xf0\xe1]\x00Y\xc0\xc0\ +|(\x08,P\x00X\x8d\xe5\x0c\xbf\xee\x0e\xff\xe9\xa0\ +\x0e\x05LP\x93\xa0H\x10\x01@\x0c\x160\x00\xfb\xce\ +\xef[\xee\xefr>\xe7\x0f\xf0\x02{>\xf2\x0a8\xe1\ +\x09j\x00\x05\x03\x10\xec\xc2\xce\xf20\x0e\x06\x16\xd0\x08\ + \x10\x002O\x14<\x80\x0e\x1f\xc0\x04#\xb0\x042\ +\xf0\x00\xee\xcc\x05\x13}\x01\x96L\x00\x97\x90\x02j\x10\ +\x0cO0q\xf4\x15\x10\x00!\xf9\x04\x05\x03\x00\xff\x00\ +,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1c\ +H\xb0\xa0\xc1\x83\x08\x13*L\xf8\x01F\x22.\x0e\xda\ +\x1cPP\x09\xd5\xa9S\x11\x04`A\xd4\xc0M\xa8A\ +\xc9\xfe\xf1YH\xb2\xa4\xc9\x93(S\xaa,\xe8%\x19\ +\x03\x09\x950`P\x81\xa6\xe6\xaa\x9b\xabv]\xdc\x19\ +\xab\xe7\xbbw\x22\x82Fh\xd3g\xa5\xd1\xa3H\x93.\ +\xa4\xc4\xa1\x9e\xcc\xa73i\xa2\xc1\x99s\xe7\xc5\x9e\xb1\ +~\x06\xdd*\xa2B\x05\x01\x00\xa6(\x1dK\xb6,\xc1\ +\x10\x9bF\xd5[\xcb\x16j\xd4\x9aSo\xea\xb4\xeaS\ ++W\xafx\xbd*b`\xb6\xaf_\x93\xd1\x0e\xa8\xaa\ +\xc3\xb6\xb0[\x15R\xe3V\xa5\x9b\xd5\xee\xd6\xbc\x90\x09\ +\xa5y0\xe4\xafe\xcb\xeeTi\x1e\x5c\xb8-T\xc4\ +pq\xce\xe5\xd9\x98kP\xc8x\x09\xa9&EJ\x03\ +\x8b\xcb\xb0\x93&\x22\xf2\x0d\xd8\xe6\xc1\x84;\x1fN,\ +\xda\xea\xa9\xba\xa6\xbb\xa2\xae\xb0\x9a5kV\x04\x02\xc4\ +^n\x12\x8c\xa5o\xd0m\xdf\xce\xad\xfb)h\x9br\ +}\x037=\x9c8!\xe3\xc6\x7f\xbd\xff\x1b\xb0\x80\xb9\ +y\x83\xca\x04\xb0b\x05\x1d\xfam\xce\x9d\x9d~\x0e\x9d\ +\x9d\xb1\xe3\xd3\xdd\x8b\x83\xffe\xca\x94\x88\x0b4\x9cg\ +\xde%\x0a\xf4\xb0\x1e{\xedI\xa7Y\x1d\xd4yf\x1d\ +}\x8b\x91v\x9fp\xa8\xe9\x17^\x7f\x182C\x00.\ +\x02\xc2\x86H\x04\x11\x18x`\x82\xef5\xb8\xd6n\xd8\ +ExUiw\x0dg!k\xfcahJ*\xa9\x14\ +\x13R\x87}\x09\x01\xe2\x8e\x22\x22\x18\xddt\xf1\xa1\xa8\ +\xd8h+N\x98\xdfw\xfb\xc9\xd8\x1f\x8d4\xb6!\x08\ +\x8ec\xf9\x81\xcc\x8e<\x1e\xe8\xa3\x82\xb8\x05i\x9dT\ +\xbd\xd9\x07T\x8b\x91!\x99\xa4\x8cL2\xf9N\x11\xbc\ +@y\x14\x04\xa8\xb4I%\x88=\xb6\xf7M\x89Z\xca\ +t]\x97+\xb2\x88_\x85b^Hf\x997\x04z\ +\x0b\x0ej\xaaD\x047\xdc\xb4\x89\xca\x9b!\x8e\xf8\xe3\ +f&\xca\xf7\xe0\x90\x8ce\xc5\x9d\x8b}\x92\x12#\x86\ +e\xa6\x12\xe8\xa7*\xccR\xa8I\xca \x8a\xa8\xa2\x8c\ +\xc6\xf9\xe8\x82u\xdaI\x1f\x91\xdb=\xff\xc6'x0\ +*\xd9\xe9\xa7\x9f\xce\x22\xea\xa8\x0aU!@1\xa6&\ +\xea\xe6\x9b\xaa\xd6\x06du\xaeb\x07\xab\x9e{\xe6\xf5\ +\xe2\xa6K\x02\x8a\xeb\x0d\xba\xfa\x02\xcb\xae\xbc\x16\x84\x88\ +\x00\xdc\x06+\xec\xa2T\x16\x8be\xa4\xf3)\xeb\xe5\xa5\ +\x91\xd1\xaa\xa9\xadLNK\xed,\xd6\xc2rm\xb6\x03\ +\x01\xc1\x01\xb7\xf8\x06\x8b*\xb1\x8e\x1a\xcb*\xb2o\xc5\ +\xb5\xec}\x98\xd2\x0a\xed\x8c\xd2\xe2\x0a\xaf\xbc\xb0|\xf1\ +\x85/\xf4\x8e\x80\x85%\x96\xe0\xfb\xab\xbe\xc3V\xb9\x1e\ +\x89\x90\x02|\xa7\x8a\xb1R\xe8l\xa6\x07'\x9c\xeb\xc2\ +\x0d;\x1c\x03,\xbc.\x81\xc5\xc4\x14[\x0c\xac\xa9\xfb\ +j\xec\xe3\xb1\x0e\x06\x5c_\x91_6\x9b\x9a\xba\xec\xb6\ +\xab0\xca\x0e\x7f\x11\x03/\xbc\xb0\xacf\x22/\xbf\x1c\ +\xb3\xcc4g\x0cg\xbf\x0a\x92;\xe9\xce\xbf1;\xeb\ +\x98\x9c\x0a}r\xbc)\x1f\x8d4/_@\xc9t\xd3\ +NWl1\xc6\xe0\xda\xbc*|9s\x99\x133\x12\ +\xf6,\xb2W/\x06\xed\xe9\xb4(\xa7\xff\xfc\xc5\xd8H\ +\xd7\x12C\x87?\xa0\x8d\xf6\xd3\xf9F\xcd\xef\xc6\xab\x9a\ +X.Nt\x17\x89\xee\xcf\x5c#\xecu\xa0\xd5\xca[\ +4\xe0\xbc\xd4R\xcb+e\x9b7\x82\x02\x0a\x18\xde4\ +\xe2\x17\x9f*u\xa3\x8cW\xedq\x8a\x91gm\xf7\xd6\ +~FK#\xdfD;\xcc\xb9\xe7\xaf\xf4\x9e\xe6r$\ + C:\xe9\xa6\xc3\x0c\xb5\xeam\xb3~s\xc7\x85\x89\ +\x02\xc1\x03S\x08\xf3\x0f\xa1\xb6\x14\x14\xc2?~\xbc\x84\ +\x05\xed\xebv}y\xe6~\xef\xfey\xef\xae\xb8\x12\xfa\ +e\x1bH2\xfc\xf0\xc5\xa3\x8e\xf1\xe2\x1cs\x86@(\ +\xc9\x94g\x94\x1a\x06(\x80\xb7\xc1\x7f\xde\xaep\xbcE\ +\x13[\xe0\xc6\xf7\x8a\xf2\x95\xef|\x7f\x19\x05#\x18\xb1\ +>\xe2\x99Nm\x89\xfb\xd6\x9b\x1c%\x9d\x06,\xc1/\ +IXA\xe5L\xf6.\x86\xa9\x0cp\xbc#_\xf9r\ +\x91\x0bu(\xcd/\x90@\xc6\x02\x19\xd8\xc0\xf6\x1dO\ +\x82\x1a\x83\x0e\x116\x11\x9b!0\x80\x15\xdd\xb3\xdd\xde\ +0\x97;\x01v\x8e\x80\x06$a3\xff\x9a\xe1\x8a\xbf\ +<\x00\x19H\x5ca\x03Kg8\xd4\xcdLX\x13d\ +E\x0b\xd4\x90\x0b\x01\x11\xc1{;\xc4\x1c\x00\x8d\x06B\ + \x8e0\x17C\xb4\x85-^\xd1\x171 \xf1\x8c*\ +\x5c`\x0b\x9b\x08A\x01\xbcoG-\xa0\x00\x94\xbe\xc0\ +\x02\x0eX\x8eo[\xfc\xdb\xd8BX\xc0\x11\x86Q\x8c\ +\xb6\xc0\xc5\xef\xc6B\x03D\xa0\xf1\x8cJ\x5c\xdf\x03\xdb\ +\x18\xb5E\x11A,\xa3\xaa\x85\x05\xea\xe0?\x1ejN\ +w{\xf4\xa2+\xc0\xd8\x0c@J\x03\x17\xa0n\xf2\x8f\x81\x04%\ +(\x9b0\x96\x17\xa4\xe1\x97\xa5L\xa2\x1a\x15\x99Jn\ +\xcdl\x05\x9ep%A\x88\x81\x05-^\x92\x96\xaf\x08\ +D\x10q\xa9KP\xf6\xa2\x17dLJ)~\x09\xcc\ +`\xa6q\x8d\x87[\xdb\x00d\xa1\xcc\x82P\xc3\x01=\ +\xcc\xa4\x087\x09F@\xe6R\x97\xbd\x90\x85<\x11\xa8\ +\x92\x1ap\x80\x9b\xdc\xf4\xe60Q\x19\xffN\x01(@\ +\x0d\xe5D\xc8,.)\xc0\x10\x06\xb1\x9db\xfc$<\ +\xe3)OGp\xc8(F\xe0\x80D\xf1\xd9\xcdR\xee\ +\xd3\x81\x87CD@\x152\x8b\x0f\x0ep\x9d\x9c\x04d\ +5q\xc1PyR\xe3\xa4\xb50J\x0e\x88 \xd1\x89\ +\xe2S\x9f\x175\xdc\x1f6\xba\x90Y\x14t|\xd3\xec\ +\xa4\x18\xabyMy\xca\xc2\x11'=\xa9# \x96\x92\ +%\x10\xe1\xa8-\xbd'E\x83yJ&bA\x02\xd4\ +\xa0iM\x8ffP?\xeaT\xa1\xd6\xf4\xa9,\x82\x1a\ +\xd4\x044C%\x1d8\xaaX\x93\xbaT\xa6\xb2\x90x\ +\x90x\xa8T9\xda9\x90\xea\xf4\x9dYm(W\xa9\ +\x91\x80\xba&@\x94$\xc9\x82X\xf7\xca\xd2\x96\x96\xf5\ +\x90\xfb\xac\xc2ZM2\x0b^\xd8\x12\xa1p-\xe9V\ +\xb9j\xd7\xba\xf2@\xad$!GX\xf9\xbaW\xbf\xbe\ +\xd4\xa2\x0c\x9c\xe9`\x09[\xc0\x90\xee\x14\x9e>\x9d+\ +]\xed\xca\x837\x98\x96\x9e\x09\xc9\x02\x02\x10@\xd9\xca\ +Z6\x9f\x80\x1d\x85\xfd6[\x12_\xff\xb8\xe2\x8f<\ +-\xe9\x5c\x1b\x9b\x80\xd2\x9a\xf6\x0d\x90U\xc8\x01V\xbb\ +\xda\xd6\x8e\xd5\xa5\xb0=c\x19h\x9b\x92/\x88\x14\xb4\ +&elc}\xfb\xdb7\x04\x00\xb5\x06\xf9\x01q\xb7\ +k\x5c\xa4\x227\x0dh|\x0dsQ\xc2\x8b\xc4\x86\xb6\ +\xab\xd3\xad\xaei\x03\xc0\xde\xe0\x1e\x04\x1a\xdb\x8dow\ +_\x0b\xcc\x0b\x8cW%\xce\x88\xebb\xd1\xebX\xf5Z\ +\x97\xbd\x00^\x88\x11\xe2K`\xd6\x1a\xf7\xb5\x1a\xb8\xaf\ +J|\xd1\x04\x86\x02\x95\xbf\xbdU/\x80'\xec\x01\x0f\ +|5!5P\x84\x22\x0a,\xdf\x03O\xf4\x03\x0aV\ +\x09/\xa2{\xd2\xf4Vw\xc2\xec\xad\xb0\x8ay\x90\x10\ +/h\xf8\xc5\x1c\xe6nk%\xaa\x8c\x10\xaf\xe4\x19\xd2\ +\x8d\xf0\x89Q\xac\xe2\x1e\x93c\x90\x05\xb1\xc0\x8b\x87\xbc\ +\xe1\x18\x1b\x98\xaf+\xb0\xf1J`\x01\xd4\xc6J\x98\xc7\ +=\xae09\xa6L\xce\x83\xb4\x81\xc8D6\xf2\x91\x8f\ +\x0aP%\xab\xc4\x15v}2\x85\xa3<\xe52\xd3`\ +\x11\x071\x06\x96\xd7\xac\xe5\xa3\xb6\xc1\xff\xcbF\xa1\x06\ +u\xff\x0b\xe0({\xa0\xccS\xa6\x81\x9e\xf9\xc0\x87l\ +\x12\xa4\x08\xa5(\xc5\x9a\xd9\x1cc1\xc0y%\xae\xf8\ +-\x94}\x8c\xe7=\xf3\x99\xcfQ-\x88\x04\x02M\xe9\ +Ag\x99\xc0\xee8\xb4Q\x12\xb0h)7\x9a\x06\x8f\ +\x0e5\x1f\xc8a\x90\x0et\x80\xd2\xa8\xb6\xf4\x90\xb7\x0b\ +\x03M\xaf\xa4\x19)&\xb3\x99A-j>,\xe0\xd6\ +\xb7\x062\x0cL\xcdkTWZ\xd5\x1b\x86\x86\xabW\ +\xe2\x8b\x000:\xcf\xb4\x165\xae\x97\xbd\x00i\x10$\ +\x13\xbc\x8e\xf6\xa9}-hK_b\xd8+\x91\x85\xa7\ +\xf3\x5ck[3\xfb\xd68\x08\xb7r\x06\xf2\x07D \ +B\xda\xd2\xa6\xf6\x9a\xb1\xbd\x12^\xcc\xba\xd6\xdf\x06w\ +\xb8\xe7=\xdb\x7f\x98\xfb\xde\xe6Fw\xaf}\xfdb\x00\ +\xb0{%\x01H\xf6\xa3\xe3=\xef\x82\x87[\x07:H\ +\xe9?\x8c\x80\xef\x86\xe7[\xdf\xd4\x1e\xc1\xbfU\xa2\x8d\ +P\x7f\xdb\xe0\x05G\xb8\xc6u\xd0\x0b\x81\xc8\xc0\xe1 \ +\x7f8\xba\x03=q\x11\x13\x1c\xe38\xff\xd88\xc2\xbd\ +\xc0r/\xbcA k\x08\xb9\xccEnj\x09\x94\x5c\ +%\xe4\x907\xc6U\xae\x83\x96{A\x10@\x17\x84<\ +\x04\x92\x83\x03\x18}\xe63\xef\xc0\x0f\xba\xd4\x81\xae\x03\x81\x18\xfd\xeaXGz\ +\xc3}\xc0t\x94H#\xe5*o\xf9\xd4\xc7\x0e\xf4\x0c\ +d\x80\x17!\xc0\xba\xda\xd7>s\x0ft\xfd$\xbcX\ +9\xcb\xc9>u\xb3\xdb=\x03\xe8@G\x13\x82\xb1\xf6\ +\xbe\xf7\x1d\xdf\x0dx;J\xec@\xf7\xb2\xdf\x1d\xefy\ +O<:\x86@\x8d)\xf8\xfd\xf1}\x9f\x83\xe0OB\ +\x03\xa9\x1f^\xf1\x89\x1f\x82\xe67\xaf\xf978a\x14\ +\xa0\x1f\x05\xe4!_\x84\xc9\x9b$\x00v\xc7\xfc\xe29\ +\xcfz\xd6{\x00\x0c\xa1\x8f\xbd\xecE\x0f\xf9V\x9b\x9e\ +$\xd4X}\xebw\x8f\x82\xde\xfb\xbe\xf7\x0bX\xc3\xec\ +\x87O|\xda\xbb\xe0\xf6$\xc1\x05\xef\x7f\xcf\xfc\xe6\xa3\ +\xc0\x0c\x90(\xbe\xf4e\x8f|\x92\xe4\xc2\xf9\xd8\xff\xbd\ +1\xb6\xbf\xfd\x0cL`\xfa\xe0\x1fE\xff\xf5\x17\xf2\x0a\ +\xe6s\xff\xfc\xe8O\xbf1\x86\xd0\x80\x15\xb8\xff\xfd\xf0\ +w?\xf8\xc7\xaf\x90/\xa8\xff\xfe\xea\xdf\xc0\x06\x8c\xf1\ +\x87\xf8\xfb\xff\xff\xfeG\x7f\x0a\xa1\x7f\x04X\x80\x06x\ +\x80\x05h\x0c\x00\xb8\x80\x00(\x80\x09\x81\x80\x10\x18\x81\ +\x1b\xc0\x80\x14\x08\x7f\x0e\x88\x10V\x90\x81\x1a\xb8\x81\x1c\ +\xd8\x81\x1b\xd8\x7f\x15H\x81\x17h\x10_\x10\x02&\x18\ +\x02\x1e\x98\x82\x1c\xb8\x01m\xd0\x02.\xf8\x820\x18\x83\ +2\xf8\x82#X\x101p\x828\x98\x83:\xa8\x83V\ +\xb0\x0c3\xf8\x83@\xe8v5(\x10\xaf\xa0\x09Fx\ +\x84Hx\x84;\x88\x83\x1b\xe0\x06@\x08\x0aP\x18\x85\ +R8\x85C8\x10A\x00\x02I\x98\x85Z\x98\x84\xc6\ +`\x02S\xf8\x85_(\x07b8\x86rp\x08U\xf8\ +\x0f\xd4\x00\x02j\xb8\x86l\xc8\x86[h\x8464\x85\ +d8\x87d\xd8\x0avx\x87rT\x85\x1e\xf0\x04|\ +\xd8\x87R\xd0\x86\x80\x08\x88\x910\x08t8\x86wx\ +\x88\x88x\x87zp\x86f\xf0\x01}\xff\xf8\x88\x90\xc8\ +\x87\x7f\x18\x88:\xf0\x02\x89x\x89\x98x\x0c\xb7p\x0b\ +\xadT\x85\xe6\xf0\x01\xa0\x18\x8a\xa1\x18\x89\xa4\xc8\x87|\ + \x0c\x98\x98\x88\xc7\xa0\x89\x9b\xd8\x8a\x9b(XU\xf8\ +\x04\x9e0\x8b\x9ep\x08\x87 \x8a\xb8\xe8\x88\xa4\x18\x00\ +V\x90\x89\xae\xf8\x8b\xbf\xa8\x0b\xba0n#\xe8\x0a.\ +\xe0\x02\xb4\x98\x8c\xb3h\x8b\xb9\x88\x8bO \x0b\x01\xd0\ +\x0a\xab\x08\x8c\xd4x\x0b\xc2x\x8d\xd7\x08\x08C\x18\x00\ +Jp\x8c\xdex\x8c\xca\x98\x8c\xcc\x88\x8bd\xe4\x0e\xd5\ +\xd8\x8a\xd8\x88\x8d9\xb0\x8e9\xa0\x01\x160\x84\x19\x00\ +\x08\xf2\x08\x08J\xd0\x8d\xdf\x08\x8e\xe1H\x8b\x87 \x05\ +\x02\xc1\x05\xc0\x98\x8e\xea\xb8\x8e\x1a0\x90\x04\xf9\x08C\ +\xf8\x04$@\x02\xf3\xb8\x90\xf6x\x8f\xc8\xa8\x8c\x1b \ +\x10\x16`\x8d\x00)\x8c\xec\xd8\x8e\x04\x99\x91\x049\x12\ +\x17h\x0b\xfd@\x0c\x09\x19\x92\x0b9\x8f\xf5\xe8\x90\xe0\ +\xf8$\xff \x0c\x00y\x91\x1a\xd9\x92\x1a\xf0\x070i\ +{\x0e\x88\x03\xfdP\x935\x09\x92!\xff\xa9\x90#I\ +\x8f\x0dy\x8cB\xf8\x0f\xbap\x91\x18\xe9\x92\x04\x09\x93\ +F\xf9\x07\x0d\x10\x0a#\xf8\x04>\xd0\x946y\x938\ +)\x92;\xc9\x93\xd5#\x10U@\x94-y\x940\xd9\ +\x00\x5c\xc9\x95\x84\x22\x80\xb8 \x0c\xc2\x00\x04@\xd0\x94\ +>\xf0\x947\x99\x93\x099\x92\xc94\x10\x0f\x80\x95/\ +\xa9\x95H\xd9\x95t\x99\x02\x0e\x88\x02' \x96bI\ +\x96f\x89\x96\x1f\x19\x95\x22i\x0c\x04\xa1\x05.)\x97\ +sI\x97\x88\x09\x09\x02\xf8\x05>\x10\x0c'\xf0\x98z\ +9\x96e\xe9\x94~\x09\x98\x1c9\x10\x19i\x98\x88\xb9\ +\x99t\x19\x0c\xf4\x87\x03b\x10\x9a\xc1\xe0\x98y\x19\x99\ +|\xd9\x97hI\x0c\xc4pa\x03A\x09\x9a\xc9\x99\xb0\ +\xd9\x06m`\x00\xe3\xe7\x0b\xc4`\x04F\x10\x9a\xa2\xf9\ +\x98\xa5\xa9\x97\x93\x89\x9a5\x09b\x05\x11\x0fG\x09\x9b\ +\xc6)\x9b\xc8I\x02\xd5\xb7\x00Z\xa0\x05L\x80\x9b\xba\ +)\x06\xa3\xc9\x9b\x919\x96f\xe9\x94\xe8`\x10Cp\ +\x98\xc6\x89\x98\xc8\xf9\x9d\xb3Y}>\xff@\x01\xcd\xe9\ +\x9c\xd0\xa9\x9b\xd3\x09\x99\xa6\xf9\x9b\x91V\x10\x0e\xd0\x9d\ +\xde\x09\x9e\xb29\x01\xf4\xc9\x04\xb7'\x08\x8d@\x01\xfa\ +Y\x9e\xcfy\x9e\xa2I\x9a\xbd\xb9\x97J\x80\x10S\x00\ +\x9f\x5c)\x9f\xf3I\x9f\xf4\xb9\x05U\xf6v\xaf\xa0\x05\ +\x8d\x10\xa1\xfaI\x9e\xcd\xc9\x04\xfd\x19\x9d\xe9\xa9\x9e\xc2\ +P\x19\x07\x81\x03\xdd\x89\xa0\x09\xaa\xa0\xf4\xe9\x0eI0\ +yO\x00\x030\x10\xa1\xf99\xa1\xfcy\xa1\x18\x0a\xa0\ +\xc2\xe0^\x03\x91\x09\x9c\x09\xa2m \xa2\x22\xea\x0e:\ +j\x05o\xe7\x01\xc9\x90\x0c(\x9a\xa2\x12\xca\xa2\x15\xda\ +\x9f\xb9\x89\x9e\x8e)\x9c\x08\xe1\x03\xf1\x89\xa08\xaa\xa0\ +:\x1a\xa55\xd0u\x0f\xca\x02?\x0a\xa4(\xaa\xa2\x13\ +J\xa1\xcei\xa4\xd1)\x06\x97\x89\x10\x90\xd0\x006\x1a\ +\xa29\x1a\xa5Q*\x01\x89\xc0t.\xa0\x06j\xc0\x02\ +V\xfa\xa3A\xaa\xa5\xfb\xd9\xa2\xb8y\xa4\x5c\xb7\x10j\ +P\xa6O:\xa2h\xea\x0e\x12\x10\xa8\x12p\x02%7\ +\x04#0\x02n\x0a\xa7q:\xa7t\xff\xca\xa5\x15z\ +\xa7\x1c\xba\x10\xcb\xe0\xa4}\xfa\xa7:*\xa8\x81\x0a\x09\ +\x91:l\x01p\xa8\x87\xea\xa6o\x1a\xa7X*\xa4C\ +\xea\xa8\xce)\x06ED\x12z\x00\x9e}:\x01\x96\x0a\ +\xa8\x98*\x01UP\x05%\xf0\x93\x9a&\x0d,\xf0\x02\ +/\xe0\xa9\xa0\xaa\xa8W\xca\xa8\xa5Z\x9eZ\xc0\xa3%\ +\x11\x00\xee`\xa68\xfa\xaa\xb1*\xab\xb3Z\x05J\xe9\ +j\xb9\xd0\x08S\xa0\xab\xbb\xca\xab\xa1*\xaa\xc0\xba\xa2\ +\xfb\xc9\x04\xbcd\x12?\xd0\xaa\xaej\xa9\xcb\xda\xac\xcd\ +\x0a\x01`\xa0i\xaf@\x01)0\x05\xd3\xaa\xab\x9e\x8a\ +\xa8\x89\x0a\xa7\xbf\x9a\xa5\x8dJ\xac&\xc1\x03U\xf0\xa4\ +\xaf\x0a\xab\x98J\xaeU\x00\x01\x00\x0b\x015\xe6e\x0f\ +\x1a\x0f~\xb0\xae\xecJ\xad\xef\x1a\xaf\xd8\x9a\xadZP\ +E(\xa1\x06\xc9*\xae\xe3J\xae\x01\x0b\xb0\x90\x00\x06\ +\x1d\x17b\xae\x00\x03?\x10\x0f\x06\x8b\xb0\xedZ\xad\x9f\ +\xca\xb0\xf3J\xaf\x82\x99\x12\xae\xf0\x08~J\xb1\xfd\xea\ +\xaf\x17\x0b\x01\x900\xb3\x17@\x8c\xcc\xff%\x0bj\xa0\ +\x07z\xf0\xb1!\x8b\xb0\x0ak\xad\xd7z\xa5\xa3jh\ ++A\x02\xfb\xba\x0c\x15k\xb1\x17;\xb33\xbb\x05k\ +\x90\x01\xe3E\x0e)`\x01\x16\xa0\xb3<{\xb0>\xeb\ +\xae\x0bk\xb2r\x0a\x03_\xb9\x12\xca\xe0\xb2/\xab\xb4\ +\x01\xcb\xb4\x90\xb0\x05h\xeb\x00y:XV\x90\x04n\ +K\xb5V\x0b\xb2\xf1\x90\x02Y\xab\xb5%\x1b\xb4?\xaa\ +\x9cGA\x0e\x10\x10\xa5H\x9b\xb4\xe5\xba\xb4L\x8b\xb6\ +[\x00\x00\x00\xe0\x06z\xc0\x9a\x01\xf5\x0aF\x90\x08\x89\ +P\x04o[\xb5;+\xb7t\xcb\xae#\xbb\xb5\x0c\x0b\ +\x032\x8a\x12\x14p\xa9\x80\x1b\xb8e;\xb8hk\xb8\ +nP\xba\x5c\x90\xb2\xe5d\x07? \x032\x90\x08\x97\ +\x00\xb9I\x00\xb7\x93\x0b\xb2\x95\x9b\xb0v{\xb7p\x8a\ +\x02c\x01\x06\xcb\xca\xacd\x1b\xba\xa2K\xba\xa5\xeb\x06\ +\xb4@\x0b)\xb0\xb98\xd2\x0cb\xe0\x04P0\x0f\xad\ +\xeb\xba\xb0+\xbb<;\xb7\x22\xfb\xb3@+=d\xe1\ +\x06\xb1\xea\xaf\xff\x1a\xb3f{\xb6\x85\xff{\xb8\xc3[\ +\xbc\x0e\xe0\x00&\x80\xbd\x85\xf2\x05Op\x0eN\xe0\x04\ +Y\xd0\xbc\xcf[\x04\x90K\xb5\x92;\xbd\xb5;\xb2$\ +{\xa8\xc9\x80\xbc*\xa1\x04\x82\xca\xbd\xdd+\xb8\xc1+\ +\xbe\xa5K\xbe\x0e\xf0\x08\x08\x5c\x00\x1f\x80W\xe6\xb1\x01\ +\x160\x0c\x10\xdc\xbe\xef\xcb\xba\x8e+\xbf\xb1+\xb9\xb3\ +K\xbd\x96K\xad\xf9[uf\xf1\x03\xbe\xfb\xbb\x18k\ +\xb6\xa3+\xbc\x05L\x0b\xe5\x8b\xc0\x8f@\x09\x94\x00\x06\ +\xdax\x1e\x9a\xa0\x07\x9b@\x00\x10\x1c\xc1\xef\xeb\xbc\xad\ +\xfb\xba\x91\xab\xb3\x19|\xbf\x1c|\xa8Jj\x16\x05\xc0\ +\xbd1+\xb3$\x5c\xc2\xc3K\xbc(|\xc0*L\x09\ +%P\x025\xc0\x05\xc9@j\xb0!\x0c\x83p\x04\x9b\ +0\xc34\x1c\xc1\xee\x0b\xbf\x8e\xab\xc3\x17\xac\xb3K`\ +\xbf>\xac\xabb\x80]J\xf1\x06% \xc2F,\xba\ +\xe1\x9b\xc4\x06\xac\xc2+\xec\xc4P\x5c\x035`\x00\x04\ +\x80\xbee\xe1\x02?\xf0\x00\x0f\xc0\x09G\x80\xc53\x5c\ +\xc3\xc3\xd0\xbeP\x00\x05\x14\x0c\xbd;\xff\xac\x07cL\ +\xb9>\xcc\x02\xcef\x19\x19\x00\x00\xb3Z\xc4\xdfK\xb8\ +&|\xc2)\xdc\xc4Ol\xc7wl\x00\xa0\xbc\x06\x05\ +\xf0\x02A\xac\x12\x9a\x00\x03P\xa0\x0c\xca\xe0\xc7\x7f\x1c\ +\xc8YL\x00[\x5c\xc8]\x8c\xc8\xf1\x1b\xbd\x92\xdb\xc8\ + \x8b\xb5\xec:\x026\xfb\x17 P\xc4m\xdc\xb4H\ +\x0c\xc7K,\xc7,\xdc\xc9v\x0c\xca\x06\xb0\x06\xcc<\ +\x03&`\x02``\x01\x8d\x00\x08\xc6P\x1e\x8a\xdb\x0c\ +\x09\xf0\x0f(\xe0\x09F0\x05\xd1@\x05\x0c\xc0\x00\xaa\ +\xbc\xca\xac\x1c\xc8\x82\x1c\xcb\xb2|\xc3\x89l\xc1a\xcc\ +\xc8\xd3\xab\xcbf\xc0\x1cb\xe0\xbdG\x1c\xbe\x04\xac\xc4\ +\x9b\x8c\xc0\xc7\x5c\xc7\xc9\x1c\xca\xcd\xfc\xcc\xa1\x10\xd0s\ +0\x00\x03\xc0\x05\x06}\x01\x08\x9d\x09\x0a]\x00\x0c\x0d\ +\x06\x0e\x1d\xce\xe2\xac\xca\xac\x0c\xc8\xe7\x8c\xce\x86L\xcb\ +_\x0c\xbb\xed\x8c\xcb!\x1b\x91\xe6\xd1\x08\xc0+\xcc\xf6\ +L\xcc\xc5\xdc\xc4t\xec\xc9\xca\xbc\xcc\xffl\x02\x01\x1d\ +\x0a\x03]\xd0\x07\x9d\xd0\x0b\xdd\xd0\x0f\xff\x1d\xce\xe3<\ +\xd1\xe6\xfc\xca\x84,\xc1\x87\x9c\xc8`L\xbfb<\xbd\ +\x98\xd0!j\x10\xcc\x22\x9d\xc9\xf8\xcc\xc4\xfa|\xd2(\ +\xed\xcf\xcc\xfc\xcc,-\xd0\x04m\xd0\x5c\x80\xd0\x17\xa0\ +\xd0\x99\xc0\xd0\x05\xe0\xd0`\x00\xd17\x8d\xd3\x15\xbd\xd3\ +]\x8c\xc3\x19\x1d\xb9\xb7\xfc\xb1O\x00%,p\xc9\xc3\ +<\xbeK\xac\xd4s\x8c\xcc\x9f\xec\xd4\xce\x0c\xd0R\x0d\ +\xd3U-\xd3YM\xd3]m\xd3_\xdd\xca\xae<\xc8\ +5\xdc\xbe\xcc\xeb\xc5\x15l\xcb\xb7\x5c\xca\x02\xd2\x08n\ +\x8c\xd4\xc5[\xd2K-\xd7s\xad\xd2kP\xd7-\x1d\ +\x0a\x04\x8d\xd7V\x8d\xd5Z\xcd\xd5\xe0\xec\xd7\xe4\xec\xc7\ +9\xad\xc5b\xfd\xbe\x18\x0d\xbd\xb6\xac\xb3 \xc0+\xc1\ +\x00\x00\x98\xec\xd8\x90\x1d\xd9\xfc<\xd7\xcc\xbc\xd2-\xfd\ +\xd2\x9a\xad\xd7\x9d\xcd\xd5^-\xd1`}\xce\x84\x9c\xce\ +\xf0\xfb\xbc\xafk\xcb\xf6:* \xf0\x08#M\xcc\xe5\ +\x0b\xd7\xfb\xec\xc9\x93]\xdbu\x1d\xd5.\x9d\xd9T\xbd\ +\xd9\x0a\xdd\x07\xbb\xdd\xd7\x11\xed\xdb\x80\xff\x1d\xd6\x83}\ +\xd1d\xad\xc8I\xa0\x07(I/\x19\xb0\x06\xb0\x1d\xdb\ ++\xfc\xc4\xb3\x9d\xd2\xd2\x0d\xd5\xb7=\xd5\xd7\xad\xd7\xda\ +\xcd\xd7\xbd\xed\xdd\x80\x9d\xc5\xa4\x1d\xde\xa6\x9d\xc8\xd0\xeb\ +\x07T\x5cN\xca\x90\xc4\x9a\x9c\xcfq\xfd\xde\xca\x5c\xdb\ +\x95-\xdfwM\xd5y}\xd5\xd9\xbd\xdd\x10\xdd\xdd\xac\ +\xfc\xdd\xafl\xd1<=\xde\x89\xc0\x02\x1b\xbbQS\xc0\ +\xdc\x08\xde\xde\x92\x0d\xdf\xf1M\xdd\xd5\x8d\xd7\x11\x8e\xd5\ +{\xbd\xd5\x0e\xfd\xd9\xdd\x1d\xda\x9c@\xd1\xfc\x0d\xcb\xa5\ +}\xc8d\xbd\xb6R\xe5\x09\x06\xa0\xc4\xec\xfd\xdc\xd0m\ +\xe2\x0dn\xd7\x0f^\xdf\x12>\xd3.^\xd31~\xe1\ +\x14\x0d\xde\xfe\xdd\xd3I\x80\xba\x9b\xb5\x07\x06\x0c\xd7$\ +\xae\xe0N=\xe4(n\xddF\xce\xe2\xdb\xcd\xdd\x16\xfe\ +\xdb5\xae\xe1]\xac\x06\xed\xc9\x5cbP\x03#\x0e\xe4\ +M\x9d\xe5\xd3=\xdf\xf4\x1d\xd3G\xde\xe2\x5c\x0d\xe6\xe3\ +\x1c\xda\x18\xde\xdf\xe1-\x03\x0b\xacdY \xc7\x09\x8e\ +\xe5n\xee\xe0)\xae\xe2\xd8\x8d\xe4I\xff^\xe1w\xce\ +\xe4\xa3\xad\xe7\x85\xac\x06\xd9\x0cg\x9e\xc0\x05&\xed\xde\ +A\xbe\xe0'\x8e\xe2\xb8\x0d\xe1\x87\xde\xe2I\x0e\xe3\x8b\ +>\xd1M\x9e\xe15\x9c\x04\x1e\xedj\x14`\x00\xfb<\ +\xdb\xd1\x9d\xe9\x97\xbd\xe9]\xce\xd9_\xae\xe8\x7f\x9d\xe7\ +ZL\x06/\xfco#`\x00\x96\xde\xe6\x83N\xe4\x85\ +\xce\xe9z\xed\xe9uN\xeb\xfa\xdd\xe4\x82<\x0c\x84\xda\ +u\xbb\x0e\xdd\xad\xee\xeap\x8e\xd7;\xd0\xe9\xf7\x9d\xe4\ +v^\xeb\xdf\xed\x04D+x\xb2@\x01\x5c\xd0\xcf\x98\ +\xbe\xd2(\x9e\xe2\x10>\xed\xc3^\xed\xc5\x9e\xdf\xc7~\ +\x04\x83@\x0c\xe3\xf7\x0a\x87P\x08)M\xd9Z\xfe\xea\ +\x5cn\xd0\xe6>\xe7\xe8\xee\xd9\xc6\x8e\xe7S`\x05\x0a\ +'\x804\xd0\x08`@\xef\xf5\x1e\xed\xe5N\xedZm\ +\xed\xfd\xfe\x00\x89 \x0c\xbd<\x82^\x00\x03\x0f\xd0\xcc\ +o\x8e\xf0T\x9d\xef,N\xec\xbc\xdd\xdbE\xb0\xecg\ +x\x10\x80\x10\x0f\x05@\xe8\xc1\x9e\xf1\x9d\xce\xf15=\ +\x0ca\xf0\x04,\x16\xf2$\xe1\x01\x1f:\x90\x0cE\x90\ +\x09w\xad\xe2\x1a\xef\xe5\x9d\xcd\x09\xf1\xa0\x05\x9a\x00\xf3\ +H\x91\x00\x19 \x05\xc1\xa0\x06)\x90\x04N\x10\xce`\ +\x80\xd0`0\x0d\x0f0\x0fz\xf0\x020\x00\x04\x9a\xe0\ +\x05g\xbeY\x01\x01\x00!\xf9\x04\x05\x03\x00\xff\x00,\ +\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\ +\xb0\xa0\xc1\x83\x08\x13*L\xf8\xe4_\x91\x0b\x8f&\xac\ +\x10%\xaaR=\x0c\x02\x14\x88\x1a5\x81\x16\x97D\xff\ +>,\x1cI\xb2\xa4\xc9\x93(S\x1e\x841\xad\x8a(\ +U0\xeb\xd4\xa9G\xb3\xe6E\x0c81\xa8P\x81\xa6\ +\xe7\xaaU\x02\xdc\x81a!H\xa5\xd1\xa3H\x93\x22\x1c\ +Q\x03\xc1\xb7\xa7\xc0`J\x9di\x93fN\x9c;}\ +\xfe\x5c\xb5\xeb\x94W\x05\xb4\x94\x8a\x1dK\xd6\xe009\ +=X\xa9}\xfaTj\xcc\xaaV\xaf\xf2\xd4\xfa\xb3\xab\ +W\xaf\xb1b!R\xa6\xa9\xac\xdf\xbf#\x05\x15\x1a\x15\ +\xa1pZ\xb5\xac\xd8F\x9d\x0a\xf7f\xce\xb9h\xb6\xee\ +\xb2{7\xef\xbb\xcbe8\x01\xde\x0c\xb8\x19\x858\xa8\ +\x0a\x8b\x8e\x8081T\xb7T\xab^\xd5\xd93r]\ +\xca\xa7\xf2\xc6\xba\xfcN\x84\xed\x06\xc98\xebF\xfa\xe6\ +\x92\x22T\xc0G\x1bF\xac\x18uc\xb9\x90%\xdf\xc5\ +k\xb9\xb6\xed\xe7\x11\x86\xed\x9e^\x92\x862F\xdc\xb2\ +\x03\x0f=\xfa\xb0\xe9o\x8bc\xa6\xff\xae\x89\xbc\xb5\xf2\ +\xe5\xcd\x9d?\x17Q\xa1\x02\x1a.|\xa8\xcb7x\x04\ +\x99\x80b\xd9\xb9m\x17\xee\xbd\xf8\xd4\xf1qa\x95\x5c\ +]\xcb\xc56\xdbe\xeb\xb1\xd7^{\xbbdB\xce|\ +\xf2%\x91\x86\x00\x14\x0a\x90\x9f~\xc1uG\xdci\xe2\ +\xc1U\x1e]\xb0\xc9\x86`\x82\x0b\x96\x88\x81t\x10r\ +f\xc4\x0a\x96XR\xe1}\xf9\xed\xa7\xe1Z\x1c\xbe\xa5\ +\xdacsI\x16bs$\x96\xe8#\x160\xa4\xe8\xd7\ +\x02\x8f`\x81E\x8b/Z\x18#w\xa2\xf5W\xa3*\ +\x00:\xa6S\x8e\x04\xa2w\xa0z\xb6\xf9X\x22!\x5c\ +N\xe0\x85\x90bMQ\x86\x91F\x22Y!~\xdae\ +(\xda\x86\xe0\x19w\xa3\x80 \x16\xc8c\x8fZV\xc0\ +%)\xa4\xa0\x91\x04\x98G\xf1\x01\x00\x99\x80\xba\xf8\xe2\ +\x92L\x0eGcxPz\x88c\x9c\x95\xcd\xf9\x5c\x9d\ +\xed\xdd\x89'\x9e\x1a\xf0\x99\x92\x11\xa5(\xa0\x00\xa0e\ +\x0aJ\xe1\x85j\x1a\xfa\x9d\x9b6}x\x1es\xb4\xd1\ +\xe9#\x97\x84L:i\x1d\xb9Y\xffJ\xd2\x03\x9aj\ +\xcai\xa7g\x12*\x1c\x9b\xe1E)\x97yU\xa2\x8a\ +\xa5\x82uJ\xea*)\xbf\x98\x12\xca+\xb2&\xe4\x01\ +\x04\x8c\xd4j+\xa7f~\xba$\x7f4\xb6ic\xa9\ +\x8f\x01;\x99\x95#>Z\xac\xb1\x93&k\x8a)\xa0\ +\xc4\xd7lA\x1b\xac\xc0\xc8\xbb\xd2nJ\xad\xa7hb\ +X\xa8\x93\xbd\x02\xf8\xabV;\x1e\xa8\xea\x96\xad\x1e\xfb\ +\x8b\xb9\xe7F\x00\xc2\xba\x03\xf9\xa0\x082\xc8\xbc\x1bm\ +\xad\xb7V\xabd\x9a3\x9a\x86\xa8\xbe\xdd\xba\xc6\x15\xb8\ +\xc3BJn\xb9\xe7\x86l\xca)Z \xfcO\x1a\x0c\ +3\x0c\xaf\xb4\x11\xd3{\xedhl\x92\x1a k\x1a\xef\ +\x18n\x96\xe3\x1e\x8b\xac\xc8\xe7\xa6\x92\xca/z4\x1b\ +O\xcaD\xaf\x0c1\xb5\x83\xa6yo\xb6\xbd\xbeI\xf3\ +\xa9\x06\xde\xecq\xc0\xae\x0e\xcc\xb3)>\xfb\x0c\x85\xa5\ +\x12\xa2L\xb4\xca\x0fO\x1b\xa8\xcb\x147\xb9a\xd3\xdc\ +b\xc5h\xd4\x1d\xe7,\xf0\xd5Yg\xad\x0c\x98E\xa4\ +a\xf7\xd7`\x87-o\xa0Ic\xff\xb8\xeb\xa1\x8c\xa5\ +\xfd\xf4\xc6\x8dJ\xedv\xd5p\xc7\x9d\xca\x0d7\xcc\x0d\ +a<\x1c\xd8}7\xde\x0e\xb3\xe2\ +\xb9\xaf\x81G\xfc\xc2\x17`\xe1\x97` \xe0\x8cLl\ +\x22\xfd*\xf8\xba\x1b\x1e\xc9\x12\xb7(\x19\x98\x92!\x89\ +H\xbdMd]4\xdd\x17W\xc8B1~!\x06d\ +\x1c\x0b9V\x80\xc63\xaaq\x8d5L\xd9\x05\xc9T\ +\x8a\x17\xacK\x0f\xac8\xe0\xce\xb8xB\xf6\xa9\x90\x8f\ +~\xfc#/x\xe1\xc2\xa4<\xa2\x90h<\xe4\x13]\ +\xa7H\xcb\x81\x81\x1a&\x13H\x09)\xe9\xb3\x22\x82\xb1\ +\x8f~\xdc\xe4&c \x96\x11(\x02\x94\xa1T\xe3(\ +\xdbX\xabV\xa4\x92 $@\xc6$YY:/\xbe\ +\x12\x89b\x8c\x81,e\x99D\xa4\xf0a\x14\x8a\xb8%\ +.\x0d\xd9\xc4]F\xf1\x02\xbf4\xc8#\x86XL=\ +\x1e\xd3\x8f\xca\x5cf-\xc6\xe9\x0b\xa4\xac!\x9a\xe8\x9c\ +f\x1aeh\xcd\x94q\xc0\x8a\xd94H\x0a* <\ +\x22z\x93\x8f\xc8\xfc\xc2279\xff\xceZ\xbc\x82\x17\ +G\x11\x03:\x07\xaaN]2\x0f\x8a+\xb0B<\x11\ +\xf2\x84\x08\xe41\x85\xaf\x04\xe7>\xfb\xf9\x8a\x8a\xbe\xa2\ +\x99(iF\x03\x06\xca\xd1i\x1a\xb4\x82mX\xa8B\ +t\xa0\x08{2\x10\x93\xc9\x9c\xe88-\xfa\x0aW\x04\ +\xa2\x93%\x89G)J\xc1Q\x82z\x94\x9d\x07\x85\x84\ +H\x17\xc2\x83\x15t3\x85\xf8\x8c\xa5JY\xea\x8a\xa2\ +\xba\x02\xa0(\x19\xc5LgZ\xd3h\x16\x14\xa7\x1cp\ +\xc3NG\x22\x0b]x1\xa8\x9a\x14\xe7J+\x1a\x08\ +\xa3\xba\x22\x17\xb9@\x89\x0c:\xb0T\xa66U\x9a\xa0\ +\xac\xa6N\xa7J\xd5Q\xb4\x0f\xa5Y\x95\xe5V+\xea\ +\xd5\xaf\xe6\xa2\x19\xb58\xc9\x01:\xc0\xd7\xb2\xd2\xb4\xa9\ +7\x9d\xdf\x04\xd8Z\x927\x181\x9f*\xf5']\xbd\ +\x0a\xd6f4\xc3\x16\xb6\x08\xe4H\xa0\xc0\xd7\xca\x92\xb5\ +\xacg\xbd\xa9\x1c\x08k\x92\x88\x8aq\xa8\x16e\xec]\ +\x1f\x0bY[0\x8b$-@\x04\x22,\xdb\xd7\xa5f\ +\x16\x97\x1dP(gK2\x0bd\xff\x86\x93\x9f\x8a]\ +lQ\x1b\xeb\xd8\xd2\xdaB\x1a\xb8\x90lB\xfc\xa0\xda\ +\xe2\xb2\xf6\xb2f\xad)(c5\xdb\x92\xf8B\x9fZ\ +\x0d-c\x1dKZ\xc8\x02\x17\x17\xb8\xb8\xc6H\xfeP\ +\xdc\xee\x1e\x17\xb3\xca=c\x01\x9a\x8b\x12\xe8\xf2b\xae\ +-5\xeah\xab\xfb[\xec\xba\x17\x170-\x88\x18\xba\ +K\xdf\xd5Z\xd6\xafMm\x00yQ2\x0b\xdcJw\ +\xb7\xa3\xf5\xed{\xdd\xdb\x8b^\xe45!k8@}\ +\xe9\xcbZ\xf0\x0e\xb4!\xfb=\x09,r\xdbU\x00\xf7\ +\xb6\xb4\x03\xc6n\x81e!\x8b&$D\x07\x07\x08\xb1\ +\x82\x17l\xdc\xfb\xba6\x9a\x9a\x890Jx\xa1[\xde\ +\x0a8\xc3\x1b\xe60\x871Z\x10=\x88\xf8\xc6$V\ +m\x83\x97\x0a\x0aT\xaa\xf8$\xb3\x98.{a\x1cc\ +\x19S\x83\x1a\xcf@\x88\x04n\xcc\xe4\x1c\xdb\xb7\xb23\ +\x85\xe7\x8fO\xc2\x8b\xaf^\x18\xb2D\x961\x87\x1dq\ +\xe4#\xcb\x02!L\x0es\x88sl\xd9lLY%\ +\xae\x18\xf2\x80\x8b,\x0b.w\xf9\xff\xcdH%\x88\x05\ +F1\x0a1\x87\x99\xcc\x1d\x08\xc6\x99S\xc2\x0b\x0c\xbf\ +\x97\xcd\xb2x\xb3\xa0\x13\x90\x00\x0f\x17\x04\x12tN\xb4\ +\x9dq\xbc\xe0*\xecY%\xb9Xs/\xb4\xecfA\ +S\x83\xd0\x98\xf6\xf1@h\x90\xe8N\xd3y\xd1\x22\xa6\ +o#\x1e\xcdg\x02O\xda\xc8\x96\xbe4\xa6W\xcd\x03\ +\x1a7\xc2\xd3\xb0\xae3\xa8U\xab\x81@\x90\x9a\xbf\xb8\ +8\xf5\x96S\xbdjL\xf3\x80\x07o\x08\xb6+\x08\x02\ +\x86X\x1b\x1b\xd4{\xba5J\x9c\x81\xeaA\xf7:\x01\ +\xbf\x0e\xb6\xb4\xdf\xf0\xe5\x81Hd\x05\xc6>v\x98\xbf\ +\xa4\xec\x93|\x81\xd7\xcf\x06\xf6\xb4\xc7\xfd\x86\x81,`\ +\x05\xe8N7\xb6\xb3\xedi\x11?\xa2\xdb)\xc1E\x97\ +\xc3-nr\xbf!\x00\xf8\xc67R\xc5\xa0\xee~\xa3\ +\x9b\xdd\x9d\x86wJ\x5c\x11n{\x07;\xdf\x08\xc7w\ +X\x1d\xe2\xef\x86\xff;\xdb\x0b\x10\xb8\xb7}m\xf0\x84\ +[\xdc\x03\x1e\xa8v(\x1c\xce\xf1\x87'\x1a\x02\x12G\ +I\x02\xecm\xf1\x84c\xfc\xe4\x1e\xff\xe0\x81@\xda\xd0\ +\x82\x96\xb7\xa0\xe3\x1c\x1f\x05HBn\x12\x5cH\xbb\xe4\ +\xf9F\xb9\xce1\x1e\x80\x7f\x04\xc0\xe5@w9\xcc\xd5\ +\xdd\x0f\x9a\x9b\xc4\x158\xdf\xb9\xd2\xc9\xc1tr\xc4\xc0\ +\x0aA\x8fz\xd09nt\x93|!\xe7JGy\xd3\ +\xb7\xde\xf4W\x08\x03\x14`\x07\xbb\xd4\xc7\xfert\x0f\ +\xb6\xea%\x09@\xd6\xb9\xcev\x1a\xb8\xdd\xed\xb6xA\ +\xd8\xe7Nw\xb2\xbb\x1c\x9bh'I\x02N\xce\xf6\xa6\ +\xbf\xdd\xed|\x08\xbc\xe0\xf9 \x8bA\xc8\xe1\xf0\x88\x97\ +\x03\xdd\x17\x0f\x8a\xa0\x1b/\xefT\xe5\xfa\xdf\x07O\xf9\ +\xca'@\x19\xad\xc8|+\x12\xcf\xf9\xc33\x1e\xec\xa3\ +\x86\xfcB\xa4\x01\xf8\xca\x9b\x9e\xf2\x0bH}\x00B\xa1\ +\xf9\xd6\xbb>\xf3\x9dO\xbc'D\xbf\x10W\x9c^\xf0\ +\xa9\xcf\xbd\xeeu\xef\x01Z\xbc\xfe\xf7\xc0\xd7\xfc\x10h\ +\xaf\x90W\xf0a\xf7\xc8O\xfe\xeeiP\x85c8?\ +\xf8\xd0\xcf<\x0d\x88\x9f\x10^(_\xf78\xc8\xbe\xf6\ +\xb7\x9f\xfd\x05\xb8\xe3\x16\xe0\x0f\xbf\xff\xf8\xc7\x0f~\xe7\ +??\xf3\xb8\xa0~B\xb8\xcf\xfe\xf6\xb3\x7f\x01\x13 \ +\xbf\xfc\xe7\x1f\xfef\xa8\xff \xb0p?\xf7u\xc0\xff\ +\xfe\xfb_\x078\xa0\x0b\x028\x80\xba@\x7f\xf4w\x7f\ +\x08\xf1\x7f\x0a\xb8\x80\x0bH\x80\x0e\xf8\x80\x108\x80\x08\ +x\x10^P\x81\x16x\x81\x18\x98\x81\x178\x019\xd0\ +\x81\x1e\xf8\x81 \x18\x82\x1eh\x7f\x138\x10\xb0 \x08\ +(\x98\x82*\xb8\x82,\x98\x82^\xe0\x0e\x1a\x10\x832\ +8\x834X\x832X\x82\x04\xf1\x05\x19\xb0\x83<\xd8\ +\x82>\x98\x82:\x00\x0168\x84D\x88\x83\x03\xc1\x0b\ +\xe8\x90\x84J\xc8\x83L\xd8\x84N\xa8\x03\x8f@\x84R\ +8\x83\x7f\xd0CF\xe8\x0aC\x90\x85Z\x98\x85J\xd8\ +\x85^\xd8\x85f0\x00R\xf8\x07dX\x86fh\x86\ +\x22a\x84\xb8\x80\x02[\xd8\x86n\xf8\x86\xe8`\x08\x9c\ +p\x86tX\x87d\xd8\x00x\xd8\x00r\x84\x83\x09\x80\ +\x02~\xf8\x87\x80\xc8\x86o\xd8\x86|p\x09vX\x86\ +y\x98\x88\x8a\xd8\x00?`\x84\xff\xff@\x0e\xc6\x10\x89\ +\xc6\x10\x88\x94H\x89Z\xe8\x01#p\x87\x8b\xb8\x89\x9c\ +H\x05\x8e\xa8\x03\x92\x18\x8a\xa1X\x89\x94\x18\x00>\xc0\ +\x89\xa8\xb8\x89k\x85\x83(\xb0\x01\xae\xf8\x8a\xa2\x18\x8b\ +\x91\x18\x88\xd4\xb0\x01\xa9x\x8b\x89h\x84\xb5`\x05\xbc\ +\xf8\x8a\xbe\x08\x8b\xb2\x18\x8aA\xf0\x0f\xb8\x88\x8amp\ +\x8cm\xa0\x04|\xc8\x8b\xcc\xc8\x8c\xbf\xf8\x8c\xb1\x98W\ +UP\x8cx\x88\x8c\xd6x\x8c\x8dX\x82\x0b\x10\x02\xdc\ +\x18\x02\xcd\xf8\x8d\xcf\xf8\x8b\xc6 \x10\x99\x90\x8a\xd7x\ +\x8e\xc8X\x038h\x0c\x9a\xa0\x09\xdd\xf8\x8e\xdf\xd8\x8c\ +\xcf\xe8Az\xb0\x88\xe8x\x8fm0\x01\xfaX\x82\xae\ +\xd0\x8e\xfe\xd8\x8e\xef\xd8\x8d\xf1\xf8\x8d\xear\x8a\xf8x\ +\x8f\xfa\x98\x90\xfa\x18z\xf7G\x0e \xf0\x90 \xf0\x8f\ +\x00\x19\x90\xdc8\x90\x09 \x10|p\x90\xd7\xa8\x90\x1c\ +9\x01\x5c0\x81\x1b\xf0\x04O\x00\x91\x0f)\x91\x13I\ +\x91\xdeh\x05\xc3&\x10[p\x90\x1d\xf9\x92\xee\xe0\x0e\ +\x11\xa7~M\xf0\x01\x22y\x93$\xffY\x92&I\x91\ +\x1b@\x10\xc3p\x8e/\x09\x931\x19\x93\x8e\xa4~:\ +\xf0\x01Hi\x937\xf9\x04R\x90\x93&9\x91\xdc&\ +\x10b\x80\x8cA\xd9\x91Cy\x95\xee\x10\x16\xea\xf7\x04\ +\x9e\xe0\x09\x87\x90\x94Jy\x93M\xe9\x94\x12\xd9s\x03\ +\xe1\x01U\xc9\x91X\x89\x95\x12 \x01\xc2@}\xe4\xe0\ +\x02.\xd0\x95]\xf9\x95I\xb9\x94L\x99\x93\x11\xd9\x8e\ +\xb6F\x10k\x90\x96k\xc9\x96m)\x01&@} \ +\x00\x08r9\x97ti\x97H\x89\x97yI\x92=Y\ +\x10S \x94\x81\x19\x93\x83y\x99\x12\x00\x08\xb4\xe7\x01\ +\x80\xd0\x99\x80\xa0\x04\x89I\x97^\x09\x96\x8e9\x92 \ +0\x93\x05\xa1\x90\x95y\x95\x989\x98UP\x05\x85)\ +z\x1f@\x02\xb4\xe9\x99\xa0)\x97\xa2\xe9\x09`\x19\x96\ +7)\x0d\x07Q\x03\xab9\x94\xad\xe9\x9a\xaf\xf9\x9ab\ +\x00y\x0b\xd0\x0f\xfd@\x0c\xb4I\x02\xb6\x99\x98\x8aY\ +\x97\xbb)\x92!\xb0\x14\xc19\x9cmY\x9c\xda\xf9n\ +hW\x0b$\xe0\x03\xca\xb9\x9c\xcd\xff\xf9\x9c\xa1)\x9a\ +\x8c\xf9\x01f\x80\x10\xde\x17\x98\xd8)\x01\xdaY\x9c\x10\ +\x10\x9fASu\x1b \x0c@\xe0\x03\xe0\xa9\x9c\xccY\ +\x9b\xe4\x19\x9d\xd2\xf9\x01\x86v\x10`\xc0\x9a\xed\xf9\x9e\ +\xf0\x19\x9f\xf1\x19\x99!\xf7\x06' \x0c\x0ez\x9f\xf9\ +)\x9e\xfc\xd9\x99\xb7\x89\x9bt\xa9\xa0\x07A\x0c\x96Y\ +\xa0\x06Z\x05\x08\x8a\xa0\x90\x10\x9b\x12W\x0b\xfd\x10\x0c\ +'\xd0\xa0\xf6\x89\x9f\xe1)\xa1\xce\xd9\x9f\x8ai\x96\x08\ +\xf1\x0a\x8f\xc0\xa1\x06\xfa\xa1 \x0a\x09\x90\x90l\x02\xa7\ +\x09b \x06&\x8a\xa2)\x1a\xa1,\xea\x99\x9f\x99\x98\ +\x1f@c\x07\xc1\x02\xc3\xd9\xa1\x1ej\xa3\x10\x80\xa3P\ +\x0a\x09\xda\x03o:\xc0\x04F\xd0\xa3>z\xa2\x0e\x1a\ +\xa4+\xba\x9f-J\xa1.\x90\x9e#\x01\x09\x97\xc9\xa4\ +N\xfa\xa4Q\x0a\x09[\xb0\x05\xb4\x00B\xca\xc6\x03L\ +\xa0\x05Vz\xa5>j\xa2[\x0a\xa1B\xea\xa5\x9e\xe9\ +\x02\xa7\xb5\x10\xf1\x90\x9df\xea\xa4i\xaa\xa6k\x0a\x00\ +k\xa0l\xcd \x06\x14@\x01Z\xff \xa7t\x9a\xa5\ +@\x0a\xa1+\xda\x0f\xcd\xe9\x9cnJ\x12\x90\x10\xa86\ +:\xa8\x84\xba\x05\x00\x00\x00n\x90\x09\xbd\xf0h\xae\x00\ +\x04\x8d\xd0\x08\x8b\xda\xa8s\xda\xa3\xc1`\xa7w\xaa\xa2\ +\xe1\xb9\x9f\x80\xb0\x92$\x91\x025z\xa6\x83\xba\xa6\x9e\ +\xfa\xa9n\xd0\xab\xca@\x82?V\x0b>\x00\x030p\ +\xaa\xa9\xea\xa8\x8f\xfa\xa3\xaf\x0a\xab\xfa9|&\x91\x00\ +[p\xa0\x82\x9a\xab\x85\x0a\xaa\xbd\xda\xab\xb4\xb0\x07\xc0\ +\xba_\xc2\x9a\x0c\xc9@\xac\xc6\xca\xa8\xaa\x9a\xac\xca\xfa\ +\xa0\xf8\x99\x9f$@\xab%\xc1\x02\xafy\xa6h\x9a\xa6\ +\xba\xca\xab\xd7\xea\x06\xb4@\x0b\x0e\xf0\x00\xe9\xb7_\xaf\ +p\x02,\xc0\x02\xde\x0a\xae\xa8z\xac\xab\xca\xaaZ\xba\ +\xac>\xe0A(\xb1\x06\xb8J\xad\xd5:\xaf\xf4j\xaf\ +\x0e\xf0\x08`\xb0_\xb8\xa0\x05j\xa0\x06\xfd\xfa\xaf\xc5\ +\x1a\xb0\xe2\xca\x04V\x8a\xa5\xadZ\xb0\xf6\x09\x04.`\ +\x14\x800\xad\xf0Z\xad\xd6z\xad\xf5\xea\x00\x11\xfb\x08\ +\x8f0\x00\x08\xcbV\x01\x90\x0c#\xff0\x02\x17\x9b\xb1\ +\xdf\xba\xb1\x8b*\xae\xc8\x0a\xb2\x22+\x0c\x0fb\x14G\ +p\xa3)\xab\xb2\x0e\xdb\xb2/\x0b\xb3\x8f`\x00$@\ +X(0\x02/p\xb38\x8b\xb1\xfe\xba\xb3\xa7\x1a\xb0\ +\x8d\xfa\xb3\xac\xaa\xac\x07s\x14\x1e\xe0\x06\xef\x1a\xa5\xba\ +\xba\xab\x0e\xfb\xb0.\xcb\xb40K\x09\x94P\x02\xf10\ +U\xc40\x05S\xf0\x02S{\xb39{\xb5\x00\xcb\xb1\ +\xaa\xfa\xb1@+\x0c\xdc\x83\x14Z\xc0\xa9\xf1*\xaf\xf3\ +\xaa\xb4K\xfb\x08l[\x02%P\x03\x05\x80\x02\xf1\xc4\ +\x07j\x90\x02) \xb7tK\xb5w\xab\xb1Y\xdb\xb3\ +[;\xb0>\x1a\x95H\xf1\x00d;\xb8+\xcb\xb2\x10\ +{\xb8\x89\xbb\xb85\x90\xbaE\x890\xb9\xd0\x0f?\x10\ +\x0f\xf10\xb9s[\xb9vk\xb5\x1a\xcb\xb3\xc7\xca\xb5\ +\x9ePNJ\x11\x00\x94\x80\xa3e\xfb\xa9\xa3\x8b\xad\xa5\ +\xab\xb6\xa7\x9b\xba\xa9k\x00\x06\xc0\x05>\xb0.!\x10\ +\x0fz\xb0\x04\xaf\x1b\xbb\x94K\xbbU\xab\xb3\xc4\x8a\xbb\ +>\xeb\xb1Fp\x02\x7f+\x16\x9e\xff\xd0\xa9\xbb:\xbc\ +h\x9b\xb6\xc6\xab\xb8\xa8[\x03\xca\xab\xbck\xa0\x0c\x10\ +&$(\xf0\x02I`\x01z\xa0\x07?\xf0\xba\x92[\ +\xbdT{\xbdx\x9b\xb7\x9a\xab\xaa\xeaB\x16)\x80\xb4\ +gk\xb8j\x8b\xb8m\x9b\xbe\xea\xcb\xbek\xd0\xc0\x9c\ +P\xb2\xf2\xc1\x0bV0\x05\x89P\x04\xf3K\xbf\xf6\x0b\ +\xbb\xf9;\xbb\xfb{\xb9;\xbb\xb1z\xab\x05\xd5\xf9\x17\ +\xca \xbc\x05l\xc0\xc6\x9b\xc0\xc8\xbb\xc0\x0c\xbc\x063\ +`\x02&\x90\x09\x14\xe0\x01\xba\xf1\x06\xfd\x90\x042 \ +\x03\x89p\x09\x16l\x01\xf4+\xbd\x1a\x5c\xbdu[\xbb\ +\xd8\xeb\xbf\x8b\xaa\x99\x9b\xb1\x06\xe4[\xaf\xc5\x9b\xc2\x8a\ +\xbb\xc2,\xdc\xc0\x0d\xfc\xc2&\x10\x0aVL\x06\xfd@\ +\xc3d\xf1\x06\x1f0\x05N\xe0\x04P0\x0f:\xcc\xc3\ +I0\xbf\xf5;\xbd~ \xbbt;\xc4\x17k\xbb\x1f\ +\x9c\xb9b\xb0\xad~!\x08\x94\x90\xb4(\xcc\xb4\xa7\xab\ +\xc0\xebk\x00RL\xc5Ul\xc5s0\x00\x03\xf0\x00\ +j\xf0\x04\x17\xa9\x12\xd4`\x05\x14\xffP\x04\xc3\xd0\xc8\ +_\x9c\x05P\xa0\xc3;\xdc\xc3?<\xbd\x1b\xbc\xc6\x96\ +\xeb\xc1X\xdb\x08Zp\xc8\x9c\xa1\x09\x85{\xc7k\x9b\ +\xc0z\xbc\xbeR\xec\xc20l\xc5V,\xc8\x03\xc0\x05\ +\xae|\x01\x0f\x10\x0fZ\xe0\x09\x8e\xeb\xc9\xffP\x0ba\ +\xc5\x07C\xf0\x04'0\x02\x89p\x04G\xb0\x09\x04@\ +\x00\x8d<\x0cN\x00\xc9b<\xc9e\x8c\xc1@\x1c\xbb\ +jl\xbdm\xac\xb3X\x1b\xc0\xbaq\x02\xc4\xdb\xc4x\ +|\xbc+\xbc\xc7}\x0c\xc3\x7f\x1c\x0a\x81\xdc\xca\xae\xcc\ +\x05\x17P\xce\x99\x90\x09}P\x00\x05\x00\x06\xec\xcc\x00\ +\xee\xac\x0c\xf0\xfc\x00\xf2\xcc\x09\xc0\xbc\x09\xc2\x5c\xcc_\ +\x0c\x05\x91\x9c\x08\xca\xec\xc3g\x0c\xbbi,\xb7\x1c\x9c\ +\xc9n\xfc\xad\x97:\x1d\x14\xc0\xc4.{\xb8\xa3\xfc\xc4\ +\xdbl\xca\xdd\xfc\xcd\xe0,\xc8\xe3\xbc\x03\xe6|\xce\xe9\ +\xbc\xce\xed\xfc\xce\xf1<\xcf\xf5|\xcf\x8e|\xcc\x91<\ +\xc6\x16|\xc1\xd1k\xc9\xcf<\xc4U\xeb\xc6\xe3\x08!\ +\xc9\x80\xcd\xd9\x8c\xbe\x0f\xdd\xc2\xa8\xff\x9c\xca\xaa\xcc\xca\ +\x15}\xd1\xe8\xac\xce\xec\x0c\x06\xee\xcc\x00\xf0\xac\x0c\xf2\ +\xfc\x00\xf4\x1c\xcc \x1d\xd2a,\xc9d\xec\xcf\xf6\x8b\ +\xd2B\xdc\xc1w+[)\x92\x0c\xe6\xeb\xc4\x0e\x8d\xbc\ +\xdc\x1c\xd1\xdf\x1c\xce\xe2L\xce:\xad\xce\x1a\xed\xd3\x1c\ +-\xd4\x1e]\xcf\xc3\x8c\xcf\x22\x9d\xc3\xcal\xd2\x19\xac\ +\xc1)\x0d\xd5, \xd5B\xa2\x05\x07\x8c\xc02=\xd3\ +|\xdc\xc7T\xac\xca\x13\xdd\xd5^}\x01\xe7\x9c\x09`\ +\xdd\xd3?\x1d\xd4C\xfd\x00\xc0l\xd4\xc4\x1c\xd2\xc8\xac\ +\xd4\x94\x5c\xbf\xcd\x1c\xd0Om\xb9\x18\x0a&@\x90\xc2\ +*\x8c\xd7y=\xc5\xde\xac\xca\x5c\x9d\xd3_\xcd\xd3\x1b\ +\x0d\xd4\x86]\xd6\xf6\xbc\xd8H=\xd2k\xcd\xd4\xf7\xeb\ +\xd6\x02\x8d\xc97\xeb\xb8\xeb\xa2\x09\x06\x80\xc0\xa4\x0c\xc5\ +Y=\xc5{\xed\xd98\xed\xca\x16\x0d\xd8\x81=\xd8\xa3\ +M\xdadM\xd4\x1f}\xd6\x8c\x9d\xd4\xfcL\xc6f|\ +\xd2\xb0\xeb\xccO\xad\x06\xa8\xb9.\x820\x00y\x8c\xdb\ +\x10\xad\xd5|\x1d\xce\xe3\xfc\xd7\x81\xff-\xd8\xa2-\xd6\ +c=\xd4E}\xda\xa8\xfd\xc8IM\xd2\xcb\xcc\xcch\ +|\xc9/\x90\x0c0j2\x09\xb0\x09w\x8d\xd5\xb9\xed\ +\xc2\xbb\x0d\xc8\xbd\xfd\xca:\x0d\xdea\xfd\xd3\xc4M\xde\ +\x89}\xda\xc5l\xcci\xed\xd8\xeb}\xc6N-\xb7L\ +\xe0\x9b\xf1\xc4\x0b/\xa0\xc0\xc9\x9b\xdd\x9cm\xd3\xfaM\ +\xd1\xbe]\xce\xc0\xbd\xd3\xe1\x0d\xe0\xa5m\xdc\xc7]\xe0\ +\xe8-\xc6\xea\xcd\xd6\xcd\x0c\xdd.@K;\xf5\x01\xa1\ +\xa0\xd9\xa7<\x03~\xbc\xdd\x18\x9e\xe1:\x9d\xd1\xff]\ +\xd8\x1dm\xda\xc2\x8c\xda\x06\xae\xcfj\xbd\xda\xec\x0d\xd0\ +/`\x85l\xf5\x06P0\xe1\x14^\xd3\x12\xfd\xd9\xa0\ +\xbd\xe16N\xd88^\xdc n\xde\x22.\xd2\xc9\x0c\ +\xe4\xf5\xdb\xd4\xb2\x5cm\xb3u\x02&\xb0\xc7\x9b\x8d\xdf\ +\x9d\xcd\xdb3\xee\xdd\xc1-\xdc\xe2\x1d\xe0\x02\x1e\xe2h\ +\x0d\xc9\xaa\x8d\xe5\xd1\x9b\x02#\xbc_\x01\x90\x08I\x1e\ +\xe32\xee\xd7\xbf\xbd\xe1\xfe}\xe3\xe3\xbd\xe6\x8a\xcd\xe3\ +#\x8e\xe0\x17L\xbfZ\xa0i*\xff\xf6\x01\x05p\xca\ +bn\xe1}\xad\xe7\x1a\xfe\xdd`\xed\xe7\xc4]\xdcE\ +\x1d\xe8U\xde\xd8\x84n\x01S\xe0\xac\x8f\xc6\x04s\xa0\ +\xddy\x0e\xe9\xfd=\xe9P>\xd6\x96>\xe0;^\xe5\ +`\xfc\xe6d\xac\x07\x1fp`\xb7F\x0d,\x10\x0a0\ +>\xe6\x17^\xe6\x1a\xce\xe7h\x9e\xe6A-\xe5\x97N\ +\xe5m\x9e\xde\xfc\x9c\x04\xfd\x90\xaf\x12\xc7\x02\x03\x80\xeb\ +\x8f\xde\xdd{\xee\xe4\xbd\xee\xe1\x1f\x0e\xe2\x98>\xec#\ +\x9d\x04@\xc0\xe5F\xc7\x04\x99\xc0\xd7\xcd\xde\xe4\xdf\xfd\ +\xe4\xa7^\xe9\x87\x1d\xec\xab\x8e\xd6\x22\x9d\x04.\xe0\xe0\ +\xa2\xf7\x04\x97\x90\xeb\xa4\xce\xe7\xe2>\xdc\xbf^\xee\xaa\ +\x8e\xdch=\x02\x95M|\xe4@\x01\x0f\xb0\xdf\xfc\xdd\ +\xdf\xf3\xee\xeb\xd3n\xee\xe7>\x0c\x16@\x0c\x8e(\x10\ +f@\x01\x04\xd0\xdd\x7f\xcd\xeb\xd1\x1e\xe5\xc0n\xee\xc3\ +\xbc\x04>@\xcd\x0b/\x10o\xe0\x09\xe1\xf3\xec\x92>\ +\xf1\xa8~\xd8\xd4~\x0e\xc9\x00\x02\xb6\xbc\xf1\x08\x11\x00\ + \xd0\x08z\xa0\x0c!\x1f\xde\x04.\xff\xe1N\xf0\x02\ +b\x10\x02\xe5\xa6\xf2F!\x08\x9a \x0c0\xf0\x02z\ + \x03\x9bp\x06\x0f\xe0\xd3\x9c@\xccI\xe0\x07j@\ +\x01\xfd\x10\x02b:[\x01\x01\x00!\xf9\x04\x05\x03\x00\ +\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\ +\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*DH\xe3_\xa3$\ +\x05\x0cT\x01Gd\x92\xa8o\xdfDq\xe0\xd0\xc2\x1d\ +\xa5\x0bE`,\x1cI\xb2\xa4\xc9\x93(S\x1e\xd4\xd1\ +\xe8\x08$\x04\xa8\x22\xc8\x9c\xd9\x83\x95M\x8c\xdf\x80\xa9\ +\xda\xa9\xaaN\x9dz@\x15H`\x90L\xa5\xd1\xa3H\ +\x93\x22\x5c\xa0f\x0d\x22nP\xb9\xa1\x9a:Sf\xcd\ +\x9b\x18u\xf2\xf4\x09\xb4k=\x0c\x18D=z\x81C\ +\xa9\xd9\xb3h\x07Zq\xa2K\x80[\x01\xc5\xa2N\x8d\ +Y\xf5*+\x9cZwr\xf5\xfa\x15\xac\xdf\x03\x9c\xd2\ +\x0a\x1e\x5cR\x86\x1c,X,\xbd\x85+\x97j]\x9b\ +w\xb3\xf2\xec\xc9\x17\xa8_\xb0*T\xa0A\xa3h\x13\ +\xe1\xcf\x9f\xb5@BL\xda\x92\xe2\xb7\x8d\xe9\xd2\x84\x8c\ +w\xf2\xcf\xca\x971d\xde\x8cf\xd5\xaa6\xa0s+\ +Mr@\x01\xe9\xd2\xa7\xddF\x95\xaa\xda*k\xc9[\ ++\xf7\xf5;\xbb\xb6\xedU\xbb\xc68\xd1M\xbd$\xb9\ +\x07e\x14h\xf7\xfd;\xf1\xe2\xe1\x8eWc\xff\xcd\xe9\ +\x1a\xf6\xe5\xe6\xcem\xef:u\xaa\xde\x85\xea\xf0\x0d\x06\ +\x18V\x86\x11\xa3\xed\xdc\x7f\x9b~\x1b\x17jx\xe3\xe3\ +\xe5E\x19_\xb1\xa1\xf7\xdc.\xeb\xb1\xd7^\x01\xf1\xc5\ +g\x81\x22\xc8 c\x1f~\xdd%\x16\x9c\x00\xa9=\x16\ +`y\x04\x9e\xa7Yz\xd0)\xa8`,uL\xd7 \ +hb\x80\x12\xe1\x8a\x13nW\xe1\x85\x19\x8a\x17\x19y\ +\xc9u\xc8\x1cm\x07&8b,\xb1\xbc\x83\xcc\x89\x84\ +\xd5\x90\xc6\x8a,\xde\xe7bw06VU\x04\xc7\xd1\ +\xd8\xd3k^y\x88\xa3z\x22\xb2\xc7\xe3;X\x8a\xe0\ +\x0e\x90g\xbdPJ\x1aC\x12\x19a\x8b\xda!\x19\x5c\ +\x7f\xc4-\xd9d^{uU\xe0\x87\xcf\x85(\x22\x8f\ +=f)B=\x16p\x89\x94\x03\x1c\x80\x09\xa6\x98\x12\ +\x1aY&\x92\xdf\xf9W\x1c\x93\x1b\xeae\xde\x8d\x9b\x1d\ +\xc8L\x95W\xda)\xc2\xa4\x0d\xe8\x99\x92\x18\xa3l\xd4\ +\xa7\x9f\x80\x92\xf9b\xa1ij\xd8\x9a\xa26\xca\xf6a\ +z:Z\x19\xe9\xa4\xacN\xfa\x8dH\x96\x8e\xffT\xcb\ +&D\xd4\xba\x91\x9fa\x12If~\x88\xed'\x9c\xa1\ +\xc5]5\xea\x80Q2\x07\xa7z\xa9\x9e\x12\xe9;\xad\ +NZ\xc1\xb3\x5c\xc4\xba\x90\x1b\xb5V{+\xa7bz\ +J\xa8[\xfd\xcd%*r\xc4\xbail\xa3T\xce\xb9\ +j\xb3\xcf\xa6{\x8b\xb4\x08\xddR\xad\xb5\xd7\xe6Z$\ +\x85\xfa\x81\xfa\x9f\xb0\x18q(.\xa3\xa8BZ'\xb3\ +\xe8\xa6\xfb\xac\x00\x9a\xb0;P?\x07 \xf0.\xbc\xb8\ +v*\xa8\x99\xa8\x19\xfa\xed7\xfaZ6n\xbf\xe6\xd6\ +\xd9\xac\x08\x02\x0b\x8c\x01\x13\x06\xb3\xa0\x08\x02$/l\ +\xeb\xa6\x7f\xea\xfa\xf0\xb6\x18J,\x1eN\x15/g*\ +\xb9r\xee()\xab\x1dw,\xc2\x0f\xd2\xa6@\xf2\xcf\ +\x0a/\xac)\xb6\xba\xd2[\x1a\x7f.\x03\x08s\x8d\xfb\ +\xca6%\x82\x19\xdf\xecl\xce\xe9\x12B\x88\x0c\x96>\ +\x08\xf4\xcf&\xc7+o\xa0G\x1e\xcdm\xd2\x11\xe0K\ +1\xd3\x16cFs\xb2\xe7\xb6Ju\xd5V\x93\x12\x18\ +\x90\x0f*2\xf2\xd6A\xbf\x1bo\xa7F[\xff\x18q\ +\xa8e\x8f\x87\xb6\xcc\xcd\x1dh.\x96\x00\xe3\xfcv\x05\ +V\x13B\xca\xe3\x0f\x9c8\x85\xdd\x94\xe3\x9d7\xc3)\ +\xcf;\xa8\xd8-\x03n\xf6\xe0\xe7=\xed\xaf\xd4\x1c\xbf\ +\xdd\xf8\xe3\xa8c\x0d\x9f\xc8\x94W\xbeu\xd7(\x7f-\ +(\xaf\xc1)9\x93\xe0\xa46}l\xcd\xca\xfe\x1b0\ +\xd5\xa7\xa3\x8e\xba\x1e\xd5\xb9\x80H)\xad\xbb\x0e4\xec\ +D\x8f\xb9r\xaf\xa7\xc5U\x0a-\x04\x8c\xd0\x8f\x15\xff\ +8b\x90\x15@\xfc\xf3\x00$\x1c,W8t\x8f\xda\ +\x9c\xf8\xd4\xc0\xc7-\xbc\xf0\xc1P\xb7B)\xf0'o\ +7\xde\xccg>f\xd8\xbd\x8erA#G-\xf0O\ +(D\xd8]\xaa\xda\xa6\xb8\xf4\xad\x0fu\xbf0\xc5.\ +\x0a\xf6\x99\x00h\xa0\x03\xf0\x8b\x9f\xfc\xe8\xa77\x94e\ +ke\xeeH\x81`2`\x01]\x18\xce|\xbf\xcb\x99\ +\xfa\x0e\x98@S\x98\x22\x02|\xf8\xcc#:\xc0\xc2\x08\ +\x22o\x82\xaf\xab`\xf3$\xa4\x9d\x038A\x10\xbay\ +\x00\x16\x0ew\xbe\xd2\x19\xf0\x80\xa4(\xa1\x09\xffM\xd1\ +\x82W\x0c\xc6\x09\x88`\xa1\x12#(\xbf\xbb-O\x86\ +\xf6cD\x03\x8a\xd2 D\xa8\xeaf\x8b\x1b\xa1\xf0~\ +!\xc4!\x9a\x22\x14\x82\x11\x06\x22\xc6\x98\xc4%J\xb0\ +u\x14\xd4\x1b\xd1\xfe\x002.\xc1\xe0\x1e\x1as\xdb\x0f\ +\xd7\xc7E/\x0e1\x15\xa9\xa0\xe2Y\x8eA\xc61*\ +\x11\x82gT\x1e\xd7\xa0\x98\x86\x03\x8c\x80\x17\xd2\xfaA\ +\x04B(\xb0\xe0m\xb1\x8bw\xc4#\x06\xcab\x96\x1a\ +\xf4\x91\x8c\x7fdb\xf2\xd2x\xb24(\xc3`\x02I\ +\x80\x09\x0a\xd81G\x22\x10\x92&\xc4\xa3*o\xf1\x05\ +\xa5\xa8\xe1\x00\x97\xc4\xa4\x19\x03\xe9\xc4AVK\x03\x1f\ +\x00%A\x00\xc1\x01\x1f6R\x8b\x8fC\xa5)TI\ +\xccT\x14A)-8\x802c\xe9\xc7\x16jR\x90\ +%\xab\x15\x83ti\x90\x12\xcc\x11\x81vLe1S\ +q\x83\x1b\xbc\x03\x87G\x09\x852\xc7\xc9\xcc2:\xf3\ +\x85\xd0$\x82\x22\xf4H\xcd\x82L\x81\x19\xbf$a6\ +\x87\xb9\xcdnv\xb3RF\x11\xc68\xf7\x09\xff\xcbX\ +f\x92\x96@[W;\x13\x02\x02\x01<\x0b\x98A\x9c\ +g=\xediO\x16\x18\xc5\x1d\xfc\xdc'3\xff\x89\xce\ +\xf9! \x1b)\x1chB\xccP\x0a\x84\xa2r\x9b\xdc\ +d\xa8=\x05\xa0\x92)\x8cb\x14\x11%\xe7D\xcf\x99\ +<\x00h\x94$-\x90\xa7\x1dA*R\x86\xceb\x16\ +(yC+Nz\xd2\x94.\xd3\x9f,\xb5\x1b%^\ +Z\x12\x0dl1\x9b\x0b\xad\xe9\x0dn:\x0b_\xe0\xd4\ +$E\xe0\xa9T}\xbaR@\x22\xcf\x0dD5IL\ +\x13\xeaE\x9a*\x95\xa9\xbe\xf0\x05,`a\x12\x0f\x80\ +B\xaah\xa5\xea%3)\x01jd\xd5$\x08@j\ +1\x95\xba\xd4\x9b\x86u\xacc}\xeaH\x12\xb1\x82\x15\ +\xa0u\xaa)]\xa9\x062\xfaV\x92, \x02]\x9d\ +\xebW\xed\x8aWX|\xe1\x0bd%\x89.\xfa\xda\xd7\ +\xbf\xf2T\xad}<\xc0\x06\x0a{\x92'\x88@\x9b\xaa\ +\xa4+X\x1b\xfb\xd8\xd2\xea5!S\xa0\xacj-\xdb\ +\xd3\x88^\x12V\x9c5I<\x92jS\xc6\xff\xe2\xb5\ +\xb4\x8f\x8d\x01/Z\xb9\x90\x09\xa8\xf6\xb7\xacU+\x03\ +b\x9b\x12\x07\x84v\xb1w\x1d+n\xbf\xa0[^8\ +w!'\xf8\xadt\xfdj\xd9\x94\xba\xa3\x17\xc4E\x09\ +5\x14\x10R\x91\x8eV\xb9\xb8m\xaes\x9d\xcb[\x84\ +\x84\xa2\x05\xe8\x9d\xeej\xab\xbbO\x10d7%\xc4\xa8\ +\xe9w\xc1\x9b\xdb\xf1\xda\xf7\xb9\x081\x03z\xf7\xdb\x02\ +\xf5R\x96\xbd\x07 \xc0{Ub\x80\xda\x8a\xf5\xb6\xa5\ +\x15\xef}k\xc1\xe0\xc8\x1a$\x1e\xa0\xe0\xef~\xfd[\ +\xd9\xbfj`\xc0*yC=\xeaz`\xfa2\xf7\xbe\ +\xcee\xb0\x88_\x81\xc8\x83@\x02\x14(\x96\xf0\x84\xfd\ +\x8bV\xd8b\xf8$\xb6\xf50\x88C<\xe2W\xd8\xb8\ +\x16\x07A\x81\x1cP\xcc\xe3\x08\xab\x98\xc2'\x85\xc0\x8b\ +\x8d\xd2\xe1\x04\xcfX\xc4\xb5\xb0\xb1\x92m\xec\x0a\x07\x0f\ +\xe4\x07r\x88\xf2\x8e{\xecc\x09\xfbW\x18CV\xc9\ +,\x1c[_\x10#y\xc9Lv\x85\x98KL\x107\ +\xb4\xe2\xccR\x9e2\x8fU\xdc\xdf\xdfn!\xff\xcbF\ +\xe9\xf2\x82\x19\x0c\xe6W\x88\xf9\xceb6\x22A\xc8q\ +\xe6>\xf7Y\xcaT\xfe1e\xb5\x00g\x95\xc0\xc2\xcb\ +t\x063\x9e\xef\x9c\x8bF\xe7\xc2\xc9\x14\xf0\xb3\xa4\xd1\ +\x1c\xe5@K\xb8\x0dz.4J\xec[c%\x07b\ +\xd1\xaept.\x9aAj2{\xef\x16\xb78\xc61\ +&\xedg@\xafy\xbf\xc4\xd3tJ\xbe\xd0i\x1b\x7f\ +z\xd1\x8e&5\xa9m\xc1\xebN\x10\xc4\x1f\xa8\x0ev\ +\xaaY\xfd\xe7J\xafY\x07\xb2N\x09,\x92\xeciP\ +\xe7Z\xd7\xbc\x8e\xb6-\x9aA\x10a[\x1b\xd5\xab&\ +6\xa0k\x90l\x95\xf0\x22\xcc\x8cn\xb4\xae\x9b!m\ +iK\x03\x17\xb8\x88\xac0t\xc1n]\x5c[\xd8\xaa\ +\xd6\xb6C\xbb\xbdi\xf1\x80\xb7{\xe0\xc3\xc6\xaa\xc1Q\xe2\x0a\x85\x97\x9b\ +\xe1\x0eox/z\xd1\x04\x81\xb8C\x03(\xffG9\ +\xc5+n\xf1w'a\xe3(yE\xb9C\x1e\xf2\x91\ +\x8f\x5c\x168\xc7\xee?R\xces\x9e\xaf<\x07\x16\x17\ +8\x09`~\x12^\x80\x9c\xe66\xef\x05\xce\x97\xcet\ +Xl\xa0\xe7P\xef\xf9\xcf\x01\x1e\x00\xa2\x9b\x04\x16H\ +\xbf9\xd3\xb7.\x0bG8\x82\x1a\xd4\xe0\x85\x0f\xfe\xf0\ +\x87\xa8\x9b\xdd\xe7\x13\x8f\x83\xd5O\x82n\x9bs\x9d\xe9\ +^\x07\xbb\xdc\xe5\xfe\x8a\x11\x90\xfd\xeex?;\xd4\xa7\ +\xb9v\x924\xe1\xed]\x9f\xbb\xe0\x07\xff\x8cK\xe0\xfd\ +\xf0\x88/{\xd4y\xd6w\x928\xa3\xeb_\x1f\xbc\xe4\ +\x05\x9f\x80\x04\x04\xe1\x08\x0d\xc8\xbc\xe63\x9f\xf8\xce\xff\ +\x81\xd0\x8d\x1f\xc9+&O\xf9\xca\x9b\xfe\xf4\x09\xc0\x05\ +\x176\xcf\xfa\xd6s\x1e\xf1\xb9\x0c\xfdBx1w\xd4\ +\xdb\xfe\xf6\x95\x97E\x0d\x5c\xcf\xfb\xde\xa3C\xf6\xb3\xc7\ +\xfd\xedy@\xfc\xe2\xbf\xe1\xf8\x09\x00@\xef\x97\xcfz\ +r\x00_!_\xa8|\xf1\x89\x7f\xfc\xea[\xff\xfa\xd5\ +O@\x15\x98\xcf}|>\x1f!\xb0\xc0\xbe\xff\xf8\xc7\ +_}\x1el\xbf\xfb\xcb\xff~B|A~\xeb\x07\xe0\ +\xfd\xf0\x8f\x7f\x00\xde\x80~\xe6\xab?!\xf2\xcf\xbf\xfe\ +\xf5\xdf\x86\xfe\xfb\xff\xff\x00\x18\x80\xffw\x7f\x08\xb1\x7f\ +\x06\xb8\x7fU \x80\x0a\xb8\x80\x04x\x10\x1e\xf0\x80\x10\ +\x18\x81\x128\x81\x10\x18\x00\x10\xb0\x80\x18\x08\x80\x0dX\ +\x10\xb0@\x81\x1e\xf8\x81\x01\xe0\x06\x19\xa8\x80\x13P\x82\ +%\xb8\x81\x04\x11\x03\xe4\xb0\x82,\xd8\x82.\xf8\x82\xe4\ +\xf0\x80\x01`\x00&X\x836x\x837\x08N(X\ +\x0b|@\x03>\xf8\x834\x00\x83BH\x0e\x01\xd0\x07\ +8x\x84H\xf8\x04((\x10\xb9\xc0\x07N\xf8\x84P\ +\x08\x85@8\x85\xe4\xf0\x06\xc3\x80\x84XX\x83\xee \ +\x06K\xf8\x0f\xda\xb0\x00`\x18\x85b8\x86O\xf8\x06\ +\x16\x90\x85&\xe8\x0ej\xb8\x86l8\x05]\x98\x00`\ +\x18\x87r\x18\x87d\x08\x85\x09\xc0\x027\xc8\x86z\xb8\ +\x87k\x189K\xe8\x018\x10\x8880\x87\x84H\x88\ +O(\x0b\xc4\xc0\x87\x8a\xb8\x88\x8f\xd0\x85\x0b\xff \x88\ +\x90\x08\x89\x85H\x88\xd2`\x0c\x8bx\x89\x12\x90\x89\x9a\ +\xb8\x84\xbc\xa0\x03\x9e\xf8\x89\x91\x18\x8a\x83H\x88\xae\xf0\ +\x06\x97\xb8\x86\xcb\xa0\x89\xaa\xa8\x8a\x9e\x80\x82\xb8 \x08\ +\x82\xe0\x05\xb2\xf8\x89\xa0(\x8a\xa1\x88H\x00\xb0\x87\xa9\ +\xb8\x8a\xbc\xb8\x8a\x1a\xb4\x81\x01\x00\x8b\xc2\x18\x8b\xb2\xe8\ +\x05\xb4X\x8b\x91\xe8?\xff\xc0\x00\xee\xb0\x8b\xbd\xf8\x8c\ +\x12P\x05\xd2X\x05`\xb4\x81f\x90\x01\xd88\x8c\xc3\ +X\x8c\xc6x\x8c:\x10\x88\x1e \x10)\x00\x8d\xbd8\ +\x8d\xe6(\x8d\x0dA\x80\xaf0\x04\xe8\xd0\x8e\xd8\x98\x01\ +\xda\xb8\x8d\xc5x\x8co \x10\xfd@\x8e\x99x\x8e\xfa\ +(\x8d\xa0w\x7f<0\x04\x00\xc9\x8e\xed\x88\x0e\xef\x18\ +\x8f\xf2(\x8b:\xf7\x0f\xcf\xb8\x8f\xfb\x08\x01\x0e\xc9w\ +\xea\xa7\x03(\x80\x02\x01\x19\x90\x03\xf9\x8e\xf0h\x90\xb0\ +\x88c\x02\xf1\x08\x9a\xc8\x90\x0d\xe9\x90\x22)d\xf7\xe7\ +\x0a\xc60\x91(Y\x91\x009\x90\x04Y\x90\xc3\x88l\ +\x03A\x06 y\x8e#Y\x93\x0e9\x02\xf7\xff\xe7\x01\ +\xc6\xb0\x93'\x89\x92\x14\xa9\x92\x02\xe9\x8e\x05\x19\x8e\x03\ +q\x023Y\x056Y\x93\x90\xb0\x94\xdc\xf6}\xb0\x80\ +\x02\x1b\xb0\x01<\xb9\x93>\xf9\x93*\xc9\x92\xd8\xe8V\ +\x04\xc1\x90I9\x92K\xf9\x95K\xe9\x03\xdf\xf7\x06V\ +\x10\x95Q9\x95=\xe9\x93@\x19\x94\x1c9\x10\xa1`\ +\x8e]\xe9\x95`\xf9\x95[\xb0\x03\xcf7\x0b(`\x05\ +zi\x96g9\x95Ui\x95\x01\x09\x93\x04\xf1\x02q\ +)\x97s\xb9\x94[\x90\x98[\xe0\x02\xc0\x97\x00!\xf0\ +\x98z\xb9\x97f\x89\x96i\xa9\x96CPu\x05\x91\x01\ +\x85y\x98`\xa9\x98[\x00\x00\x00\x10-\xb2g\x0c\x9a\ +\xf0\x98\x90\x19\x99|)\x95h\xf9\x97\xd4f\x10&\x90\ +\x94\x9cI\x97\x8a\x09\x9a\xa0\xe9\x06X\xd6x\x1e\x00\x02\ +\x9a\xb0\x9b\xa6\x19\x02\x91Y\x96|I\x99(\x99\x01\x08\ +\xa1\x06\x86\xc9\x99\x9e\xf9\x99\xb4\xe9\x06\xcci\x00\x09I\ +t\xbc\xa0\x09 0\x9d\xbbY\x9a\xa6\xf9\x9b\xc09\x99\ +h\x89\x99\x07\x01\x01\xb1)\x9b\xb3\xb9\x9c\xcc\xff9\x9e\ +~\xd0w\x82\xf0\x04O0\x9d\xbaY\x9d\xbd\x89\x9d\xa9\ +\xa9\x9a\xc6\xe0\x0a\x09\xf1=\xb1\x99\x9c\xb4\x09\x00\xe39\ +\x9e\xb4\xb0\x9f\xc6`u\xd4\xf0\x01\x1f\x80\x9e\xe9I\x9d\ +\xecy\x9d\xbf\xf9\x9e^\xa0\x10\x80\x80\x9c\x9ey\x9f\xf9\ +\xa9\x9f\xfb\xe9\x00\x5c`\x0b0\x17\x9d\x9e\x00\xa0\x01\x8a\ +\x9e\xeaY\x9d\xd6y\x9a\x07\x1a\x95\x09\xb0\x10\x06\xd0\x99\ +\x0d*\x9e\x0f\xba\x9f\xb4\xe0\x00*\xfa\x08K\x00s(\ +\xe0\x02\x9e\xe0\x09\x87\x00\xa0\x02*\x05\x1bZ\xa0\x1e\x1a\ +\x99(0\x120\x00\x09\xc9\xa9\x9c\xb5\xf9\xa0n\x80\xa2\ +)\xba\xa2\x8f\xf0\x08\xfd`p4\x00\x08.\x00\xa31\ +\x8a\xa1\x02\xaa\x9e\xeb\xc9\x9b\xed\xa9\x97D\xa9\x10\xd4\xf0\ +\x08%\x1a\xa4B\x8a\xa2*\xea\x00G\x1a\xa65\xa0\x83\ +\x9aF\x0d\x80p\xa6J\xd0\xa41:\xa3\x19\xaa\xa17\ +J\xa5\xa6\x89\x07\xa6\x86Z\x89\xe9\xa0B:\xa4\x11\xfa\ +\xa5az\xa4\x94@\x09\x5c\xc0\x9dp\xe6\x0a.@\x02\ +$\x80\xa6j\xfa\xa44\x1a\xa5o\xda\xa1\xca\xff8\x12\ +o\xe0\x00&z\xa2^j\xa4{\xda\xa7%P\x02`\ +\x80\x0b\x85V\x0b\x1f\xd0\x0f\xfd@\xa8g\xca\xa4N*\ +\xa3P\xea\xa6\x04Z\x9dV\x90i#\xf1\x02\xf8y\xa7\ +xZ\xa4\x94\x1a\xa6\x96z\xa950\x0cp\xc6\x0b\x1f\ +\xe0\x03>\xe0\xa9\xc4\x00\xaa\x80\x90\xa6\xa3Z\xaa\xa6:\ +\xa5\x8dZ\x12\xe1p\xa7D\xaa\xa7{\xfa\x08}J\x09\ +\xb4Z\x03\xd0\x0a\x05C\x86\xab\xc2 \x0c@\xb0\xab\xfd\ +\xd0\xab\x85\xfa\xab\x87J\xaa\x89:\xac\x98\xd0\x96%\xd1\ +\x08\x92\x9a\xa7\xb1\xca\xa7\xce\xfa\xac\xd0Z\x03\x06`\xab\ +\x03V\x0b.\x10\x0c'P\xad\xd7\xea\xa9\x9f\xba\xad\xa2\ +\x1a\xac\xc2j\xa3 @X'1\x07\x10j\xae\xcb\x8a\ +\xae\x97Z\x02\xeb\x0a\xad\x06\x90\xb0\x0fP\x8f\xc4\xd5\x04\ +$ \x06b \xaf\xf4\x8a\xad\xf7\x1a\xaa\xc0\x1a\xa3\xde\ +\xda\xa6O`\x05\xe5u\x12.\xf0\xaa\xb0\x0a\xa6\x03;\ +\xab\x06{\xb0\x09\x9b\xb0k\xd0\x07\x09\xcaY\x09p\x02\ +L`\x04\x10+\xb1\xd6J\xb1\xdaj\xa8\xdd\xff\x8a\xa1\ +\x19\xca\xb0*\x91\x05\x93z\xae\xccJ\xb2\x07\xcb\xae'\ +\xbb\x06D\x1b\x0aJPX^\xa0\x05J\xfb\xb21;\ +\xaf3k\xaf5{\xa6M:\xaal\xfa\x01;\x8a\x14\ +5\xf0\xa5\x22\xbb\xac$[\xb2\xebz\xb2\x06@\xb4D\ +;\x03&\xf0\x02\xb9\xf0R\xb5\xf0\x04\x8d@\x01\x14\xb0\ +\xb40\x1b\xb1N{\xad\xd8\x1a\xb5\xdc:\xaa2\xfa\x04\ +g\x8b\x14b\xa0\xac\x5c\x9b\xae\xea\x8a\xb0C+\xb63\ +@\xb6&\xf0\x00C0P\x1e`\x040\xd0\x08k\xdb\ +\xb6Z\xc0\xb4p;\xb1s\xeb\xabu;\xaa\xfej\x14\ +\xb0\xb0\x07\x03\xfb\xb3~\x1b\xb4B\x8b\xb2b\xbb\x06\x84\ +\x1b\x0a\xa4\xab\x06\xba\xe4\x0aO\xc0\x02\xc9\x00\x03\x8b\xdb\ +\xb8n\xdb\xb4\x92k\xaf\x84\x8a\xafS\xeb\x09\x9bu\x16\ +k\xd0\xb7\x9d\x1b\xb4`\x1b\xba\xa2k\x02\xc0K\xba\xa1\ +0\x07`0t\xd2\x82\x020\xa0\x06,\xa0\xba\xac\xcb\ +\xb8l\xab\xb4F\xf0\xb62+\xb7PK\xb9iz\x08\ +\xf2y\x16\x1fP\xa9@\xcb\xbb\x81+\xb8\xc0\xffk\x02\ +\xc2;\xbc\x030\x00\xc3\xe0^\x5c\x22\x0e\x8d0\x02#\ +\xa0\x06\xca\x9b\x0c\xab\xbb\xb8\xcf\xfb\xb8\xd1\x0b\xbb3K\ +\xb3\xd6\x0b\xa8f\xf1\x02\x04[\xb0\x9e\x0b\xb6a\x0b\xbe\ +\xc1+\xbcsP\xbe\x03\xc0\x05\x5c\x10\x0d\x1f \xae\xba\ +\x81\xbc/\xf0\x02\xec\xdb\xbe\xcb\x0b\xbf\xad;\xbf\x90\x1b\ +\xb9\xf7[\xbd\xdbz\xb8\x83\xb1\x09]\xfb\xbf\xbd+\xb8\ +\x84+\xbe\xa4[\xc0\xe5\x8b\xc0\x5c\xb0\x03\x17\xa0\x0cm\ +\x04\x1a\x09\xf0\x01#\x90\x02S0\x05\x0f\xcc\xbe\xee;\ +\xc1\xcd\xeb\xba\xf4\x0b\xb1\x18,\x0c\xba\xaa\xc1\x9a\xe0d\ +h\x91\x00\x5cP\xb0^\xfb\xb5!,\xc0$\x5c\xc2'\ +\x8c\xc2\x17\xf0\xc4\x99\x90\x09E\x00\x08\xfa\x9b\x14\x09\xa0\ +\x09\xc9\xb0\x04?\x10\x0f) \xc35l\xc3\x13\x1c\xbf\ +\xce\xeb\xb8\x17,\xb3Ok\xaf\x9e\x90\xbd\x84\xa1\x03k\ +\xf0\xb7\x80\xfb\xbdc\x1b\xbe\xe3k\xc2\x07\x8c\xc0*\x0c\ +\xc5Q\x5c\x00\x05\x10\x0d\xc9\xc0@Fa\x0c'\x90\x02\ +I`\x01z\xa0\x07[\xcc\xc53\xfc\xc57\xff\xac\xba\ +b\xac\xc3e\xec\xb4\x19L\x02\xb2\xa0\x1b!\xe0\xb9\x9f\ +\x0b\xbaJ<\xbe\xa1`\xc0(\xcc\x05O|\x01Q\x9c\ +\xc7z\x0c\x06\xa4\xec\x04S \x06\x1f0\x04)\x94\x0b\ +\xe2J\x0d\xe4\x90\x01 \xe0\x03,`\x012\x90\x08\x89\ +P\x04\x83L\xc8\x87,\xc34\x0c\xc16\xac\xbc\xcc[\ +\xc1\x8e\xbb\xc3\xf6{\xbfUL\x18>\xe0\xbdp\xfc\xbb\ +rL\xc0\x9c\xec\xc4x\x9c\x09}0\xca\xa4L\x05\x0c\ +\xc0\x00\xca\x90\xcd\x0f\xb0\xcd\x9cp\x04G\xb0\x09\x9b@\ +\x00\xc30\xceN\x90\x05PP\xcb\xb7\x9c\x04\x83\xac\x07\ +Z\x1c\x0f~\xc0\xcb_,\xc1\x8c\x9c\xc3\xf3K\xcc=\ +\x0c\x04\x94T\x1dF\x80\xc4\xcb<\xb8\xcd\xcc\xc4Ml\ +\xc7\xd1\x9c\x09z\x5c\x00\xa4\x0c\x06\xd7\x8c\xcd\xda\xcc\xcd\ +\xde\x0c\xce\xe2L\xce\xe6,\x03\xb5|\x09\xeaL\xc8\x86\ +\x1c\x0f\x88\xdc\xcb\x11\xbc\xc8\x14,\xccn\xfb\xb6\x18,\ +\x0e'\x12\x05\x97\x1c\xc0\xa1;\xc2\x9aL\xc7\x9d\xfc\xc9\ +\xa1L\xd0\xd4\x8c\xd0\xd7\x9c\xcd\xca\xb0\xcd\x0f\xff\xd0\xcd\ +\xdf\x1c\xce\xe3<\x0cN\xe0\x04P0\x0f\x13\x8d\xcb\x16\ +@\xc8\xed\xdc\xc5\x89\xec\xcb\xed\xfb\xbe\x8d\xec\xc8\xf5\xdb\ +\xb4\x1c|\x22\x8d\x90\xc4J\xbc\xc4\xe4\x1b\xd0)\xcc\xd2\ +Q<\xcd/\x9d\xd02M\xd36\xed\xd09\xbd\xd3=\ +\x8d\xce@-\xd4\xbb\x5c\xd4\x1b\x0d\xcc\x1d=\xc6d\xbc\ +\xd4\xc1\xd0\xd4@\x22\x06\x98\x1c\xd5sl\xc0u\x8c\xc0\ +V-\xca\x06}\xd0Z\xbd\xd05\xdd\xd08M\xce\xe5\ +|\xce\xb6\x8c\xcb\xeb|\xd1\x5c\x0c\xcfF\xcd\xd1\x8d\xcc\ +\xb6k\x0d\xb3\x91 -\xfd\xe0\xbb\xa2\x8b\xd2sM\xd5\ +w\x0c\xca\xa1\x5c\xd0z\xbd\xd73\xcd\xd07\xfd\xd0:\ +\x1d\xd8\x12\x9d\x08\x970\xd6\xec\xbc\xc5\xefl\xd6\xbf\x1c\ +\xc6\xac\xeb\xd1n\xbb\xb2\xd2\x12\x02s \xc2\xff\x0c\xd0\ +um\xd7\x03\x8d\xd5y\x0d\xd3\x0a\xcd\xd7]\xfd\xd7\xa1\ +\x1d\xd1?\x9d\xcb\x85\xbc\xcb\x88}\xd6\xac\xdd\xba:l\ +\x04\xce\x07J:\x90\x09\x93\x1d\xbeR=\x07*\x8d\xc2\ +\x97\xdd\xd2\x9a\xbd\xd9\xbd\xdd\xd9}\xfd\xd99\xff\xad\xd3\ +\xe6\xec\xd3\x83]\xd1\xc5\x8d\xda\x88\x9d\xd8h\x9d\xd4l\ +{\x02!\xdaN\x850\xc2R=\xd5\xb7\xed\xc9w\xed\ +\xd2\xbb\xcd\xdb[\xcd\xd5~\x0d\xda\xa1\x1d\xd6\xe3M\xdc\ +\xed\x9c\xd1\x1a\xbd\xda\x8c\xbc\xd8$\xd0\x9a\x03\xa5\x06\xb5\ +-\xdf\xb7}\xdd\xa1\xac\xdb\x07m\xcd1\xcd\xd7\xdd\xed\ +\xd5_\xcd\xd3\x82M\xda\xa6m\xd8D\xdd\xcb\xe8\x9d\xdc\ +\x8b\xab\x09\x1d;POp\x01\xf1]\xdd\xd0<\xd0\x05\ +\xbd\xdb\x09\xdd\xdb4]\xe1\xe1\x0c\xda;-\xdc\x1aN\ +\xde\x86\x5c\xd6\xaa}\xd4\xcb;\xcf\x14P\xacYu\x09\ +\x95m\xd9\xf5\x0d\xe1\xda\xed\xe2\xfa\xfd\xd92.\xdab\ +]\xd1d\x8d\xd1\x1d\xfe\xc0\x1f\xce\xc8\xfd\xa0\xa9\xc4\xe5\ +\x03\x170\xbc(\x8e\xdb*\x9e\xdd\xa4\xdc\xe2\xf9\xed\xd9\ +\x0e\x9d\xe4\xe1-\xd6\x1b\xfe\x03\xe6]\xd4F\xad\xe30\ +p\xb5\x03f\x01t\xdc\xe0\xf5m\xdf\xf7\xcd\xd9\xdcm\ +\xd3H~\xe1cn\xcb\xa5m\xe3\x01\xfe\xe4\xf1\xec\xbe\ +\xfd\xf0\x9c\x03\x06\x02\xca@\xd5\xf4\x9d\xdb\x5c\xff\xce\xdb\ +\xdb}\xe4w\x0e\xd8c>\xdc\x00~\xc8\xa9\xed\xe1\x11\ +\xdc\x08\xb0\x9de\xaf \x06\x99\xd0\xc9\x97\x8d\xd9x=\ +\xe7t\xce\xe8a\xfe\xdd`}\xceKN\xdc7\xee\xe4\ +\xe7\xad\x06V0\xa7\x85\x06\x03\x9b~\xe8\x9e\xfe\xe9\x07\ +\xad\xe82]\xe7\xde\xdc\xe8\x8en\xea\x83\xbd\xe1}\x0e\ +\xcf#\xf0\x04\x14\xbaq\x09\x00\x03}\xf0\xc9\xb3\xae\xdb\ +\xa0>\xe1\xdc\xdd\xdd\xba\x1e\xdc\xfe]\xe3\xa8.\xe9]\ +\xfc\x02\x9e@\xe5V\xd7\x0b'\xa0\x0c\xb3.\xe7\xb5.\ +\xe1\xcc\xfe\xe2v>\xeax\x1e\xed{>\xed\x87<\x02\ + \x80\xe0\xa1\x07\x02z\x80\xdd\x89\xee\xe5_\xee\xec\xe4\ +\xbe\xeb>}\xeaA]\xc8Z\xac\x05C\xe0\xea\xb2\xe7\ +\x01b\x10\x0d\xca^\xeb\xf2N\xe1\xe3\x1e\xe3\xa4\x1e\xd8\ +\xbc~\xcb\x84\x1d\xd4#\xe0\x09\xed\xbd\x84\x0b`\x042\ +p\xdf\xb6>\xef\x07O\x00\xfc\xbd\xd3\x18>\xda5>\ +\x02.p\xa5]X\x100L\x00]\x1e\xea\xa2n\xe1\ +\x80\xad\xe4\x89\xb0\x04Z`\x05Z9\xf2#=\xa1\x09\ +L\xe0\x07\x04\xb0\xe8)\x0f\xdc\x80]\x04j\xe0\x03\x1b\ +\xc0\x032\x7f\x14\xd4\xa0\x03!\xd0\x0f\x14\xa0\x06S`\ +\x01d@\x06N\xe0\xcdd0\x08\xe7\xa0\x07/\x90\x0c\ +F\x00\x08V`\x08\xda\x13[\x01\x01\x00!\xf9\x04\x05\ +\x03\x00\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\ +\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*DH\x0e\x04\ +\x05=T\xd6@\xd0\xd0A\x11\x11n\xdc\x88 Pt\ +\xabJ\x8d\x02I\x1a=YH\xb2\xa4\xc9\x93(S\xaa\ +4h\x86\x02\x01Z\xa5\xb0\xc8\x94iI\x80M\x01\xc5\ +0rC\xc53\x82O\x9f=Xq\x800\x0d\xc6\xca\ +\xa3H\x93*M\xc8\x22\xd4(\x05P\x15\xcc\x9cY\xf3\ +fN\x8c\xfe\x18\xa4\x97h\xac\xb2\xca7z\x88\x99T\ +\x09\x8a\x04z&\x9a.\xde'\xdc\x93\xe3\x1dwc\x9c\ +>Yy\xe5zZny\xa7\x97z\xea\xd9\x86\x9f*\ +\x09\x03\x8a\xa0\x82\xa2\xc9\xe4\x84k\x22Z#M\x8b\xe6\ +\x18\xe0\x9c\x9ce9\x9d\xa4]\xe6Y\xe9.\xbbD\xff\ +\x80\xe9IY\x94R\x0a\xa7\x81z\xaaf\xa8\xe1%J\ +\x15]\x8cv\xf8M\x8f\x06\xb2\x8ag\xa5\xab\xecr\xca\ +\xb2\x17\xcc\xba\xd0#\x1d\xd8z+\xae\xbaJ\xe8d\xaf\ +\xbeB6\xa5\xa9\x5c\xed\xa5\x9e\xaa\xed\xd9\xd9*\xb2\xca\ +.\xbb\xac\x06\xce\x1ed\xcc\x1f\x1dD+-\xae\x83*\ +\xa9\xe6\xa1\x16f\x8b\x1c\x8e\x93U)\xe0\xa3\x05\xae*\ +.\xa5\xaf\x96k\xee)\x0a\xa4K\x10\x09- \xd2\xae\ +\xbb\xd3rZ-\xa8\xf4\xa6v\xa1\xa2pr\x9bWz\ +tF:\xe2\xa4\xae\xea)\xb0\xb9\xb1\xc4R\x87\x11\x06\ +'s\x00\x22(/\xfc.\xb5K\xce\xcb&[\xd9\xca\ +\xb5m\xber~E\xac\xbf\x1b\x1f\xfb\xea\xc0\xcb\x86\x1c\ +\xcb;\xa7\xc4\xe3\xec\x0b(\x17\xbd0\xc3,\xb7lm\ +\x8c\xfa\xc5\x0c\xac\xc5V~\xab1\x97:'\xcb\x0c\xcf\ +>\xbf\xa3\xf5;\x89`\xfa`\xd1F\xab\xdcp\xa7J\ +C\xcc&\x8d\x14\xe3\x0b[\x04Qg\x8c3\x90U'\ +\x8bu\xd6Z\x8b \xc2&b\xeaq\xc0\xde`\xa7\xff\ +\xdc\xee\xca\x0e\x97m\xe8\xd9\x13\x93Z1\xcd\x17\xefK\ +\x1b\xb8\xb7\xfd\xdb\xb1\xdcs\xff\x5c\xb7\xdd\x22\x1c\x81\xe2\ +\x0b{\xf3\xdd\xb7\xc2\x7f\xdb\x9at\x9af7=\xea\xd3\ +\x88\xeb\x85\xd9\xcd\x8do<\xae\xc7W\x0fL\xf7;\x94\ +S\xdeu|&g\xaey\xdfb\x8f\x1d/\xe8\x83W\ +\x08\xf3\xe83\xc3f:\xbf\xc5\xaa\x0e\xb0\xc7\x91o\x1d\ +;\xe5\x15\xfc\x80\x9d'+\x8cb\xfb\xed`\x8b\xfd\xf9\ +\xa7/2=\xa3[\x07<\xe2\xc4?\xc4\xfc\xb3\x80,\ +\x04\x91\xffO?/l\x02\x00\x02\x1eF\xf76\xc7;\ +\xbb\x1e\xb2\xf2\xcb\x8bP\xc1\xfd'\xf0\x86\xc2-\xa3\xf4\ +?\xfd\xc9\xb8\xeb\x9c\xee\x08\x15\xba\xb5\xb4\x00>|@\ +\x8a5\x06\xa0\x08H\x85\x8bj\x1d\xfb\xd8)^W?\ +\xfb\xdd\xaf\x02\xf5\xe0M\x1b\xfa\xc7\xc1\xffm.w\x9f\ +k\x92i 0\x05/\x0cf\x09\x1ax_\x97\xc8\x95\ +<\xd8\xd5\xef\x82\x17\x14\xc0hj\xc0\xc1\x1az0\x80\ +\xee\xba\x9e\x84F!\x03\xde\xa0\xe3\x08\xa2\x10\x11\xdc\xff\ +\x8e'A\xbaU\x10\x860lEa\x06\xb1\x82\xe8\xd5\ +\xd0\x7f\xd3\xfb`\xe7BH\x84\xdc\xb8\x22>\xb9\x18\xc1\ +\x01 \x18?\x90\xcdor\xb1C\x22\x12\x070\x18\x1f\ +4\xb1\x89O\x84\xa2\xed\xa4\x98\xc3\xc0!`\x02b\xf0\ +S#\x10\xb1:\xc8\xf5\xec\x8b.\x0c\xa3\x18\x91\xa8\x1b\ +\xb2x\xa0\x01gDc\x1aoX=\xa4u\xaa\x05j\ +HW<,\x11\xc1\xb9\xd1O\x8f{\xbc !Ta\ +\x16\x13\x04\xf2\x8ci\x94^\x14\x03\xe89Aq\xc2`\ +\x03\x99\x03\xf2\xe4\xf7H\xe6ER\x92\x84 \x04\xba\x96\ +\xc2\x82\x16\xb4\xe0\x92\x98|\x22!\xfd\x96\xc36\x8c\x04\ +\x94\x04A@\xeb\xeeXJ\xbb\x9d\xf2~\xa9L%)\ +H\x91\x84\xa5h\xc0\x95\xaf\x84\xa5\x13m\xb8\xc9\xb0E\ +\x8b\x01\xbd\xc0\xa5Aj\xe0E\xc9\xbd\xf0\x97\xc1$\xc4\ +0I\xb1\x0b\x13\x22\xe5\x02\xc8D\xa623\xd9\xcc\x94\ +\x1d\xa0H\xd2<\xc8\x0b0`\xc4\xe5\xfd\xb2\x02\xc1\xdc\ +\xe66/u\x14 \x80\xe2\x9e\xe1L\xe6%\xc9\xb9\xff\ +\xc6\xa2\xfda\x03\xe9T\x88\x02\xac\xe9\xceSfS\x9e\ +\xf2\xcf\x08\x0a\xc4\xaad\ +\x1b\xa8\xac\xabc\xef\x0aY\xbc\xa6B\x04\x1e \xc9\x08\ +t\xa1\x8b\xcaV6\xb0\x82-)aW\x00\x07\xcf\xff\ +\xa6$\x05\xc0\x14\xadcKk\xdaT\xf8\xf6\xa6\x0b\x91\ +\x00kY\xebZ\xbf\xc26\xb3\xe1l\xe2\x03l\xab\x92\ +G\x80\x15\xa1\xa4\xe5\xad)|K\xddT\xb0\xe2D\x09\ +\x01B\x0er0\x5c\xe2\x16\xf7\xb8\x83ue\x15@\xca\ +\xdc\x94 #\xac\xd1-mu\xd7\x9b\xc8\x84\xec@\x03\ +\x1a\xd8.w\x87[\xdc[\x80\x97\xad\x9a(\xafJH\ +\xb0[\xe9\xaew\xbd7\xd0EBp\x00\xdf\x02\xcb\xb7\ +\xbb\xadum`\xd7Z\x08\xfd\xaed\x0d4\x95\xeet\ +\xffK\xdd\x1bX\xf8\x06(@\xc8\x14\x0a\xcc\xe1\xf8\xce\ +\x97\xbe\x0a\xc6\xec\x04\x1c|\x94o<\x16\xb2\x14\xf6\xed\ +\x85W\xcc\x00\x84\xd0\xe2\x0f\x1d\xe6\xf0\x81A\xfc\xda\xa9\ +\xa2\x93\xc4)\xf9\x81\x7fS\xbc\xe2\x1ec\xe1 C\xf8\ +\x83\x90\x85\x1cc\x03\x7f8\xc1\xafu\x03\x8eW\xc2\x0b\ +\x0e\xa0\x98\xc7=\x8e\xf2-\x09\x12\x8f![\xb9\xc8\xf0\ +\xddnw]\xeb\x83%\xaf\x84\x05c\x85r\x94{<\ +\x8b2\x1b\xa4\x04\x0dH\xb3\x95\x87\x8c\xe5\x19\xb7\xd6\xff\ +\x01^^\xc9\x17\x88 \xe61[\xb8\xccx\xf6EA\ +\xfe\x98\xe6>7`\xcdD.\xb2\x96uA\xb28\xab\ +d\x0a\x00\xb6\xf3\x85\xf1\x5cf_8\x1a\x16\xb3 \x88\ +\x11\xfcL\xe9?\x03Z\xd0U0\xf4Jr\xe1\x0d\x15\ ++\xfa\x06\x8c\x9e\xc5\xa3aAjH\x13d\x13\x95N\ +\xf5\xa5;,4M\xab\x04\x0c\x9ff\xb4\xa3}Q\xea\ +Z\x7f\x01\x16\x04\x81D\xaawm\xe9+\xc3\x17\x07\xae\ +V\x09\x0a\xc6,\xebQ\xdb\xfa\x0b\xc8F\xf6@\xf8\xc0\ +\xebf\xaby\xc8&\x08\xf6J\x0e\xb0\xe8<\xd3\xba\xd6\ +\xb0H\xb6\xb6\x91\x1d\x83H\xff\xc3\x07mp\xb6\xb8\xff\ +\xd0Gi\x9f\xe4\x12\xc5\xc6v\xb6\xb7\xcd\xed\x18\xf0\xe2\ +\xdd\xb8\xfe\xc7\x0f\xda@\xefz\x8b;\xd5\x0947J\ +\x1a}\xedR\xb3\x9b\xdb\xef\x0ex\xc0\xbf \x90\x02\xd4\ +\xfb\xe0\xf6\xbe7%\xf4\xad\x92co;\x06\xee\x16\xb8\ +\xc4\x03.\x10\x08 \xfc\xe2\x07\xe7u\x9f\x18\x8e\x92u\ +k\x1b\xe2\x13\x0f\xf9\xbbkQ\x0b\x81`\xfc\xe4\x08\xff\ +\xa74 8\x8e\x12_\x00\x5c\xe4\x13'\xb9\xccI>\ +\x0bcL\xe0\xe6\x13@\xb9\xce\xe9\xcd\xf2}\xc3<\xe0\ +3\x0f\xfa+\x86\xfe\x0aX\xf4\x03\xe7H\xc7\xf9\xce\xeb\ +\x0d\x80\x9e\xa3$\xe4A'9\xd1\xa7>\xf5/\xb0 \ +\xe9X\xc7:\xc6[\xect\x93|!\xea\xb5\xa0\xba\xd8\ +\x89\x1e\x08W\xb8\x82\x17\x16\xc8\xba\xda\xd5\xde\x86Vw\ +\x9d$1\x08\xfb\xd8\xa7^v\xb3\xdb\xfd\xee\xbc\x18\xc6\ +\xda\xf7\x9e\xf4B\xbf}!_\xa0z\xdd\xefN\xf8\xc2\ +\xbb\xa2\x16\x05p\x87\xe2\x17\xafx\xbe'}\xca\x7fO\ +\xc8\x17\x0cO\xf9\x5cX\xfe\xf2\x97\x7f\x85\x09\x18\xcf\xf9\ +\xce3>\xe9\x19\x88\xfcB`qw\xcc\x9b>\x17\xcd\ +H\xbd\xeaW\xef\x8aGx\xfe\xf5\xb0O\xad\xe8\x13\x02\ +\x0b\xd4\xaf\xfe\xf6\xb7\xb7\x85\xeew\xaf\xfbf\x00\x00\xf6\ +\xc0\xe7\xfc\xec\x15\xe2\x0b\xde\x1b\xff\xf8\xc8\xdf=\x00$\ +\xc0|\x09,\xe3\xf9\xcb\x08>\xe7s1|\x84\xcc\x22\ +\xf9\xc6\x97\x86\xf6\xa5\x81\x8b\xee{\xbf\xfb\xcd\x0f\xbf\xff\ +\xf8\xc7O\xfe\xea'\xe4\xfb\xe8O\xbf\xfa\xbdO\xfe\xf6\ +\xbb_\x02\xe6G\xc8\xfa\xe7\xbf\xfe\xe5\xbf\xff\xfe\xcc\xa7\ +~\xfc\x092\x8b^\xf8\xff\xff\x00\x18\x80\x02\x08\x80n\ +\x80\x7fUp\x80\x08\x98\x80\x07\xd8\x04\xfbG\x10\xbe \ +\x0b\x10\x18\x81\x128\x81\x14\x18\x81\xbdP\x03\x0a\x98\x81\ +\x1a\x98\x81\x01\xd0\x80\x03\x01\x0b\xd4\x10\x82\x22\xe8\x08\x8e\ +P\x81&(\x0b\xb8\x10\x0a\x1b\xb8\x82\x1a\xe8\x81\x03\xc1\ +\x0b\x22\x18\x8328\x833\xd8\x0b\x0c\xc0\x828\x08\x01\ +:\x98_.X\x0b\x09\x90\x004\x18\x844\x88\x0bd\ +\xc0\x82:x\x84H\x98\x84\xf9\xe3\x82\xae\xf0\x83N\xf8\ +\x84O(\x84!\x88\x0b?\x90\x84Vx\x85V\xf8\x02\ +.\xf8\x0f\xb8\xf0\x06<\xf0\x85P\x18\x86b\x08\x84M\ +\x00\x03Xx\x86I\x08\x09\x90\x00\x5c\x1e\xe8\x08o\xf0\ +\x86p\x08\x87_\xc8\x03c\xf8\x84\xcd\x00\x08hh\x85\ +j\xb8\x87{8T.\xf8\x06\x01\x10\x87\x828\x88s\ +H\x87N\xf8\x0a(p\x86|\xb8\x88\x8c\x08\x09o\xff\ +\xe0\x81_\x10\x00\x928\x89\x928\x88\x96(\x87\xbc\xf0\ +\x0fG\xd8\x88\x9c\xc8\x88[\xf0\x01\x1e\xe8\x0a\x1e\xe0\x01\ +\x94X\x8a\x93x\x89pHp\x94\xd0\x89\x9d\xb8\x05\xae\ +\xf8\x8aZ\xd8\x80\xb20\x8a\xb48\x8a\xa6h\x8a\x82\xc8\ +\x03\x02q\x04\xac\xb8\x87\xaf\xf8\x8b\xae\x08\x00\x00PV\ +\xfb\x17\x00\xe4p\x8c\xb5\x98\x8c\xb7X\x8a\xd4 \x10/\ +\xd0\x8a\xc0\xf8\x8a\xc28\x8d\x00\xe0\x06P\x15\x7f\xbc@\ +\x034p\x8c\xdc\x98\x8c\xcax\x8b\xe4E\x02|\x18\x8d\ +\xbfH\x8d\xc2\xe8\x06\xe8\x88\x8e~W}\xda\xc0\x07\xee\ +\xc8\x07\xda\xc8\x8d\xc8\xe8\x8d\xb58\x89\xfaG\x0e\xe4(\ +\x8d\xe6X\x8d\xe9\xd8\x8f\xca\xb0\x7f\x1e\xb0\x00\xef\xf8\x8e\ +\xf1(\x8f\xe4@\x8f\xb4\x98\x89\x02\xb1\x06\xc0\xb8\x8f\xfc\ +\xd8\x8f\x10I\x0b\xb4\x90o\xc3W\x0b\x0bp\x91\x179\ +\x90\xee\xa8\x8d\xdbh\x90\xcaH\x10\x89\xb0\x05\x0e\xf9\x90\ +\x10\x99\x8e\x12y\x92,`~\x09\x80\x038\x80\x91\x18\ +\xa9\x91\x1b\xd9\x91\x1e\xd9\x8c\x03\x01\x04\xe6X\x92%\xff\ +y\x92\x12\xe9\x00\xa0\x05F \x06\xae\xdb\xb8\x90\xdb\x0f\xb4\ +\x1b\xb3\x14;\xb5\xdd\xfa\xadV{\xb5Lz\x16j\xff\ +\xe0\xb7`\x1b\xb6D;\xb6d{\xb4\xa4k\xba\xa6[\ +\x00\xec\x0b\x06\x89\x00y\xd7!\x08\xc2@\x01\x14\xa0\x05\ +L\x10\xbdb\x00\xbb\xd5\x0b\xb7\x13;\xb9\xdc\xba\xbd7\ +\xdb\xa8{E\x18N\xf0\xb5\xa0{\xb2\xe6;\xba\xc5\xab\ +\xbe\x99\xc0\xbe\x05\x00\x06\x10\x0c\x06\xc3 \x06zK\x18\ +\xd4\x10\x02\x14\x00\x03\x8d\xd0\x08\xf5k\xbf\xd2\xfb\xba\x8e\ ++\xbb\x91\x8b\xbd\xfeK\xb7\xc3j\xb5C0\x1a\x99\xf0\ +\xb7\xd4\x1a\xb8\x09\x5c\xb6\x0b\xac\xbe\xc8\xdb\xbe\x10\xcc\x00\ +6\xac\x0cz\x90\xbagA\x0d\xc6\x10\x0c,\xc0\x02\xc9\ +\x00\x03\x1aL\xbf\xf6\x8b\xbf \x1c\xbbn\xfb\xb4Q\x9b\ +\xbd\xb7\x8b\xbb\x8bj\x05\xbcK\x18f\xc0\x05\x07\x8c\xc0\ +\xa2K\xbc1\xbc\xbe4\x5c\xc37\xac\x0c\xca\xf0\x002\ +\xd0\x08!\xe0\xb1'\xd1\x0b\xe8\x00\x08\xc90\x02#\xa0\ +\x06j\x00\xc4A\xbc\xc1\x1d|\xbf\xd3\xeb\xb8\xd5K\xbb\ +\x92[\xc2\xb8\xab\x09\x1c:\x1aV\xd0\xc2\xc2;\xbc0\ +l\xb8\x0c<\xc3\x0f\xcc\xc5]\xfc\xc5\x0f\xf0\x00\x9c\xff\ +p\x04\x83\xa0\x06\xc2\x00\x02\x19@\x0e\xd4\xb0\xb4\x02q\ +E\x1e\xa0\x03\xda*\x06#\x90\x02S0\x05/\xa0\xc6\ +k\xfc\xc3A<\xc4\x1dl\xc4\xfa\x9b\xc4v\x1c\xb7\x15\ +\x8b\xafT\xfb\xbd\xbc\xd1\x0f\xe4[\xbeW\x1c\xc8\xc6\xab\ +\xc5\x85l\xc8^\x8c\xc8\x8a|\x04G\xb0\x09\x9b@\x00\ +\xc3\x10\xccN\xe0\x04P0\x0f2\x90\x08\x97P\x04I\ +`\x01z\xb0\x04?\x10\x0f\x9c\xec\xc9\x9f\x1c\xca@,\ +\xc4p\xac\x05E,\xbd'\x00\xbb\x22\xac\xc41k\xbb\ +M,\xac\xbby\x1d'\xe0\xc2\xb3\x8c\xbe\xc5[\xcb\x0e\ +|\xcbT`\xc3\x0c\x90\xcb\x89\xbc\xcb\xbd\xfc\xcb\xc1<\ +\x0c\xc3\x5c\xcc\xc7\x9c\xcc\xcb\xac\x07z\xf0\xcc)\xc0\xc9\ +/0\xcdl\xec\xc6\x1a\xcc\xc1\xa5\xfc\xc1\xa7\x9c\xc4\xfc\ +\x0b\xce\xacL\x91\xf1\xa1\x05V\x0c\xc8H\x9b\xce\x83\xec\ +\xc0\x11\x0c\x06\xee\x9c\xcb\xba\xbc\xc8\xf3\x0c\xcc\xc2L\xcc\ +\xc6\x8c\xcc\xca\xcc\xcc\xfd\x1c\x0f~\x00\xd0\xd3L\xcd\xa3\ +|\xcd\xd9<\xc7\x8f\x9b\xc4\xde\xdc\xbf\xab\xfc\x01\x0f\xff\ +k$\x10]\xb4\x12M\xb8Yl\xcb\xec\x9c\xd1^\x1c\ +\xcf\xf2\xec\xcb\x1em\xcf \x9d\xcf#\xcd\xcf\xcf\x0c\xcd\ +\x9d\x1c\xd0j\xdc\xc6\x04\x0d\xc7q\x8c\xbf\xdb\x1c\xc2\xa8\ +\xcc\xbfL\xec\x095-&\xc2\x80\xd3\x83\xab\xd3;M\ +\xc8\x17\xed\xce\xef\xfc\xd3\x89\xcc\xd1\xbdL\x00C}\xcf\ +!\xad\xcf\x16\xc0\xccI\x1d\xcdL\xbd\xc6N\xbd\xd2\x1c\ +\x8c\xcdr\xec\xd2m[\xd5K<\xb3\x03\x8c)\x80p\ +\xce^-\xc8\x0c\xbc\xcea}\xc8\x1b\xcd\xcbB\x9d\xd6\ +E-\xd2\xcb\xcc\xccK\x10\x0fJ-\xcd\xa0<\xd7o\ +l\xd0vm\xcat\x0c\xd3P\xbb\xc4\x0e\x8d)V\x90\ +\x09]M\xba\xb5\xdc\xc0\x16\x1d\xc1b\xad\xd1\xf1\xcc\xd1\ +\x89]\xcfN\x90\x05\xf8\xcc\xd8m\xdd\xcc\xfe\x8c\xd2\x93\ +\xdd\xc6\xc9@\xd7Q\x8d\xd0\xa7\xec\xb4\xde\xec\x02\x15<\ ++f\xa0\x0c\x0a\xfc\xd5\x84m\xda>\xad\xcbAM\xcf\ +\xac\xed\xdak=\xd2\x8e\xfd\xcc'\xbd\xd4\x02=\xd7\xd6\ +l\xd9-}\xc4H\xcc\xdb$\xe0\x09\xe6\x83K\xd4\xff\ +P\x04\xe8\xbc\xd3\xa4\xbd\xc5\x18}\xdc\x87\x8d\xd8\xca-\ +\xcc\xccm\xd4\x8d-\xdb\x90\x0d\xd7)M\xd9\xd5\xdd\xc1\ +\xd0\x8b\xd9/\x9d\xc4\x9a@\xc9\xe9\x94\x0c\xa2\xcd\xc0\x99\ +@\xc8\xb7\x5c\xde\x86\x9d\xda\xbc\xdc\xd1\xf5l\xcf\xeb\x9d\ +\x08\x89\xa0\xcc\xfb\x5c\xd2\x91\x1d\xd7rM\xd0\x05M\xc4\ +\xd7=\xd5/\xdd\x0f\xf6IT\x9a\xc0\x00\xe2]\xdc\x86\ +<\xd6d]\xd6\xe8\x8d\xd6\x07\xde\xda\xaf\xbd\xe0I\xd0\ +\xe0o\x8d\xd2\xd3-\xca\xb8\x8d\xcd\x15\xee\xb8\xc2@\x02\ +\xe3LT<`\x01\xa3\xbd\xce\x01~\xda\xf0L\xe0\x1d\ +\xad\xd8\xae-\x03\xc7\x8c\xe2*\xfe\xde\xf0=\xd9.>\ +\xdf\xb9\x8d\xd0\xc2\xf0\x04\xcdP^$\x00\x062\xec\xe1\ +`\xd0\xce\xe6\xed\xe3?\xce\xda&.\xe4\x0a\xce\xe0$\ +\xed\xcc&}\xe4MM\xdd\x13N\xe1w\x1d\x0c\xc2 \ +\x0e$\xf6\x06\xf1\xc0\xd3\x17-\xe0 \x8e\xdcf\xbd\xda\ +\x1f\x1d\xe4C\xee\xe5\xcf\x1d\xe6\xd2]\xdbI^\xe6\x97\ +-\xbdO\xb0\xc7$\xa6\x09\xd1@\xe5V>\xe0X\xff\ +.\xd4%\xbe\xe5w\x9e\xe2\xb1\x0d\xe6\x0f\x0e\xe1\xf2]\ +\xe6q\xec\x03\x9d\xbdd\xc2\xc0\x00\x01\x0e\xe7\x1a-\xe7\ +\xe8\x9d\xdeDm\xe7]\xee\xe8y\x0e\xcdb\x1e\xe1\x12\ +\x0e\xd5\xd0\x9b\xc2\xe6F\x01\x0cP\xd8\x88.\xe2#>\ +\xd4\xa1\x0e\x05\x5c\xbe\xe0\xce\x8d\xd4F\xbe\xe7c\xde\xe7\ +\xd7l\x05\xbe\xda\xea\xca\x00\xe7q\x0e\xd4s\xfe\xcb\xb4\ +>\xcc\xa2\x8e\xeb\xed\xed\xe0\xd1-\xcd\xf1=\xe9\x14\xa0\ +\x09\x0c\xe8t\xb8\x00\x04\xc3`\xde\x9e>\xeb\x8b\xbe\xec\ +E\x90\xeb\xfd\x0c\xdd\xf0\x1d\xed.\xae\x05\xc6\xa0\xdf]\ +W\x0b!\x10\x0f\xc5n\xec\x05N\xe7un\xebC\xce\ +\xd6_\xbe\xe2\xbc\x8e\xea>\x10&\xf1\x17\x00\xc2\x90\x08\ +!.\xcf\xf3\x8c\xec\xdd.\xef\x0aN\xef\xfc\x0c\xe9\xff\ +|\xef#@\x01c\xbc\x85\x02q\x02I\x90\xe8\x8a>\ +\xf0\xb7\xae\xcf\x0d\x8e\xf0\xe3>\xed\xbf\xed\xf0\x09\xf0\x04\ +,0\x08\xef.\xf0\x8b\x0e\x05\x04\xcf\xd8\xed\x8d\xf1S\ +\xa0\x06\x18\xde\xdd\x0e\xaf\x10o\x10\x02b\xf0\x02\x834\ +@\xe2ZN\xcc%o\xf1\xb1\xdd\xcf/\xa0\x05\x9e0\ +\x04d\xdc\xf2(a\x06x\x00\x08F\x90\xc6\xf1\x90\xe2\ +\x97 \xe4n\xfd\x02\xd6`\x04>\xf0\x04(\xc0\x07\xc7\ +\x89X\x01\x01\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\ +\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\ +\xc1\x83\x08\x13*L\xa8I\xcb\x0fe\xa1\xdc\xb49\x80\ +H\x91\x02\x05\x8a: j\x00i\x0d\x15\x0b\x14@\xd0\ +XH\xb2\xa4\xc9\x93(S\xaa,\x88CK\x96G\xa3\ +\xd2\xc8DF\x93&#F\x17/b\xd9\xc9\xd3\x92%\ +\x01\x02\x14m9\xd2\xc8\xcb\xca\xa3H\x93*E\x98\x8c\ +\x8b\x1c\x22D8H\x95\x99\xa6\xa6M\x9c9y\xf6\x04\ +\x0a\xb4\x18\xb7\xaf\xa5\xd6,\x1dK\xb6l\xc1\x0d\x97\xdc\ +!\x80\xca6*\x07\xaaV\x91\xdd\xcc\xa9@\xeb\xce\x9f\ +\x5c\xbd~E\xc57\x82\x9caf\x03\x0b.\xa9#I\ +\x1b\x04\x88\xd7\xb6u\x0b7.V\x9dv\xf1\x02\xfd\xba\ +\xb7o\x84\xcb\xa3\xb2d\x18\xccYp.1\x94\x14)\ +J\x8cx1\xe3\x99\x8e\xe9\xda\xc5\x22Y\x00en\x96\ +/_\xee\xc1JB\xa3\xce\xb8\x95\xfe\xa8&Z4\xe9\ +\xd2m\xa7\xa2\xb6\xfa\xb8\xaeV\x9f\x5c]WF%{\ +6\xab\xe7\xac\x88$\xcaM\xdd\xa4\x87,\xa3J\xf5\xee\ +\xfd{\xb1\xf0\xe16U\x1f\xffoM\x99/\xf3\xe6\xb4\ +\xa1\x7f\xfb&\x00L\xf5\xf7\x07e\x1c\xe8PJ\xfb\xf6\ +\xd1\xa4M\x7fO\x9du|\xde\xf2\xb19\xf7\xdcz\xeb\ +\xa9\x82\x8a2\x1e\xc0\xf7^<-t\xe0`}\xf6q\ +\xd7]po\x81'\xd7c\x91I\xa6\x17l\xe7\xc9\x96\ +\xde\x80\xeb\x01\xa3\xca\x88\x02L\xa7`g\xc2\xb4\x81\xc8\ +\x8a\x0e\xd2\x17\xa1\x84\x89yWaU\xc4ax\x5cr\ +\xaf\x05\x18\xc1\x87\x04~#\xe2\x88\xaa\xd4\xa1\x08\x05'\ +\x0af\xc2\x8aH\xb6\x08\xe1}\x13\xb2\xb5_\x8d\xfdm\ +\xc5\x15\x80\x1d\x0a\xc8\x0a\x81?\x02YG=\xf5@P\ +$Yj\xb4@\x11\x92,>\xf8\x22~1R\xd8X\ +MsA&\xe5d\xcb\xa1\x07\xdd\x95!\x02\x19\xe4\x96\ +\x5c\xa2\xb2\xc4\x97H\x91\xb3\xc6\x01\x80\x92Y\xa6\x8bg\ +6\x09\x95p\x8e\xd9\xf8\xe6\x86:\xf2X\xa7\x9dxr\ +\xc9\xa5;\x0b\xf0\x99\x12\x10\xba\x00\xaa\xa9\xa0\x88(Y\ +h~j\xd2\xc8\xa6\xa2w\xfdWYs\x11\xcc\x89%\ +\xa4\x91JZ\xcf\x18\xb7Y\xffZ\xd2<\xa3\x8c\xa2\xe9\ +\xa6dz\xfa)pN\xce\x08\xa5\x9b\xa5\xc2\xc9a\x95\ +\x8e\xfahg\x90\xae\xba\x8a\x01\x06\x99\xc8\xbaP\x0d\xb5\ +\xdaz\xeb\x98\xb9\x9a\xc9$\xa8\x87\xfa:j\x94\xacI\ +\x06 \xaa\xc5fyg\xb2\x5c.\xbbl\x03\xce\x1e\x84\ +B\x1b\xd1\xd6:-\xb5\x83.\x09#\xaf\xa7\x89z!\ +\xb7\xc8\x09\xab\xa3z\x8fjIn=\xe6\x9a\x9bF\x08\ +\xe9\x0e\x04\xc8-+\xb4\xeb\xee\xb4\x82zz-\xbdQ\ +\xady/\xb0\xe4\x9d\xea!\xbf\xc6\xfa\xfbo\xc0\xcb\xaa\ +\xd0\x83\x18\x05\xc3\xd0\xc2\x0a$+,-\xaeIZ\xbb\ +\x1d\xb6\xd9\x82\xd7\xa6q\xc1\x0a\xa0\x97yr\x82(n\ +\x1d\xadJ\xca1\x06*\xf4\x8cA\x0a\xce\x8e@\xf2\xd0\ +&\xbf\xdb\xb0\xca\xbe\xb1\x8c\xe8\xb6\x14\x9b\xba/\x88\x19\ +\x8f\x98s\xb9\x1c\xf7\xac\x02\x1aX_b)\x83C\x13\ +\xad0\xc3G\xd7\xf7\xb0b-\xdb\xfb\xf2\x8d\xfa\x12\x8b\ +1\xab\x1b\x07l5\xd6h\xac\xb2J4_2\xd8\xc2\ +\xc8]'\xfc\xf5\xadG\xbb\xff\xb8r\x9ae\x9b\x8d\xef\ +\x94\x16\x0b\xb8\xaa\xc6\xc9\xee\xdc3\xdcr\xcb\xbd\xc7\x89\ +#\x80r\xf7\xddy\xeb\xdd.\xd8)\x8b=/\xd9\x11\ +\xbb\xf1\x06\x80\x91\x5c4!\ +8\x18\xc5\x18m\xc9Q]~\xf4\x9a\x15\xa8\x002V\ +2\x02\x92\xfa\xd4\xa4\xdd\xbc\xe7\x14\xc3y\xc5\x1a\xbc\xb4\ +$\x1a\xd8\xa8\x0b\x0dzS\x11\xe4\xf4\xa9NP\xc9\x04\ +\x1a\xd0\x00\x9f\x92\x14\xa8\x0fU$Q%g\x82\xa3\x9a\ +\xa4\x0d4]jG\xdd\xd9\xd4\xa7>\x15\x03)Y\x02\ +U\xd7jU\xacf5\xa2\x15\x04\x85\x01\xbcz\x12\x0d\ +\xd4\xd4\xa3\x1f5\xab^\x9be\x92\x00Lu\xadl\xfd\ +\xa9I\xdf:T\x0a\xba\x81\xae(AD\x13\xc7\xba\xcb\ +\xb2\xea\xd5\xac\xdb8\x89\x1e\x00K\xd9\xb6\x0e\xd6\x9b\xa8\ +l\x85\x04\x5c\x8aX\x93(\x00\x97\x84$k^\x1f\xfb\ +\xd8\x1d\x98\xc4\x1d\x94M\xade\x1b\xfa\xd6?X\xb4\xb3\ +'\x01\x01\x06\xc6\xeaX\xd2\xff>v\x17&I\xadn\ +\xab*\xd8z\x0e\x13\x80\xb0E\xc9\x14\xf0zP\xdb\x92\ +\x96\x10\x84 I \xb6\xd0\x866\xecV\xb5W\x1d\xac\ +.\x1e\x17\xdc\x94\x94\xa0\xb1\xc55\xae^\x91\x8b\x5cn\ +,\xa4\x1f\xcd\x0d\xefs\x01\xbbZnn\xa1\xba+\xe1\ +@v\xb5\xfbT\xee\x22\x97\x14\xa4XH\x01\xc2K\xdf\ +\xf1\x066\xba\x1a@\xefJ\x00\xf1N\xf6\xb6\xd7\xbd\xf0\ +\x85o~\x11\xb2\x00\xfa\x1a\xd8\xb9\xf6\xe5-Ce\xa0\ +\xdf\x95\x98\xc0\xa9\xfe\xad\x00\x80\x03L\xe1\x84\xbc`\x02\ +\x076p\x82\xabZ\x85\x06\x1f\x85\x15\xfe\x9d0\x85)\ +l\xce\x83\xd4`\x02(\xc6p\x86\xc5;^\x7fz8\ +%\xf1\xd0\xae\x88GL\xe1\x9d\x1e$\xc58^1\x8b\ +S\xfb\x88\x17\x1fE\x12\x8f\x9d1\x8dG\xfc\x0b)\x18\ +d\x0a8N\xb2\x8aW\x9c\xda~\xf8x%\xc90\xab\ +\x90\x87\x0c\xdf_X\xd9\x14\xee)\xc8\x1a\x94\xcce\x1d\ +\xaf\xd5\xa8O^\x89\x22$\xcc]*\x13\xf9\xca\xa6H\ +3\x11\x0c\xe2\x8e6sY\xff\xc9:n\x03\xc8\xc2\xbc\ +\x922\x9b\xb9\xcahN\xb3\x9eM\xf1\xc1\x81\x88\xa1\xcd\ +\x80v\xf3\x9bS|\xe0\xf3\xd2y%\xac\xb83\x9e\xf7\ +\xcc\xe84\x1fo N\x08\xb4\xa4\xdd1hB7w\ +\x0a\x87^\x09\x03\xcc\x9c\xe7F3\x1a\x12\x04q\xc0\xa4\ +G]i\x0cg\xfa(4\xee\xb4\xa7\x19\x9d\x0aV\x10\ +D\x02\x12\x18\xb5\xac)\xadd5\x9eZ%+X\xf4\ +\xaa\x1b\x9d\x8a^\xfbz3\xff\xe8\x07\xac\x87-\x81e\ +\xccZ\xd28\x8e\xd5\xadQ\x92\x84_\xec\x9a\xd5\xbe\x8e\ +v\xafG \x90\x14\x10\xfb\xda\xc5>6\xa0'\xb0l\ +\x95d\xe0\xd9\xa6\x90\xb6\xb8}m\xda\x7f0\x00\xdb\xe8\ +\x86\xf5\xac\xc5\xd2\xed\x94\x10\x81\xd7\xe3\x8ew\xaf\x07\xec\ +\x86t\xdb[\xdd\x81~t\xbbOr\x01=\xcb;\xde\ +7\x08\xf8\x0d\xd0\xfa\x86*\x18\xfc\xe0\xf7N\xb7;\x5c\ +\xb0o\x944\xe2\xdf\xd2\x16\xb8\xc4\x05\xce\x87\x7f\x1c\xfc\ +\xe2\x18O8\xac\x1b\x8e\x12>\xc8{\xe2 \x9f\xb8\x0b\ +\x00\x81\xf1\x92\x97\x1c\xdd=\xff\xe6\xf8Iz\xe0\xeb\x90\ +\xbb\x1c\xe4jH\x86\xc9g>s\x09\x1cA\xe5'i\ +\xc3\xcbw>q\x02\xfc\x00\x02@\xa7\xb9\xd0\x0d\x8ei\ +\x9c\x97\xa4\x00<\x07\xf9,\x96\xce\xf4\xa5\x0f\x02\xe8P\ +\x8f:\xd4\x87^\x85`\x18\xbd$?xy\xd3\xb7\xce\ +t_x\xdd\x17\xca\x90\xba\xd8\xc7>u\x83/\xf3\xea\ +\x0b\x09\x06\xd7\xb7\xfe\xf5\xb6{\x1d\x16p\x87\xfb\x00\xc8\ +N\xf7\xb1\x0b\x02\xed\x0bY\xba\xdb\xdf\x1e\xf7\xbe\xfb\xbd\ +\xef\x06\xa8\xbb\xe0\xa1\x8e\xf7\xbc\xff\xfd\xf0~\xff\x82\xe2\ +\x17\xff\x05J@\xe2\xf1\x90\x8f\xbc\xe4\x1f?\xf6\xc2+\ +d\x16\xb0`\xbc\xe67\xcfy\xc5?b\xf2\xa0\x0f=\ +\xe4-\xaf\x90\xce\x9b\x9e\xf11H}\x0cD\xcf\xfa\xc9\ +\x93>!\xbc\x88\xbd\xecgO\xfb\xda\xcf\xbe\xf5\xb8\x7f\ +\xfc\xeb\x11b\xfb\xde\xfb\x9e\x17\x94\xd8\x82\xf0\x87O\xfc\ +\xe2\x1b\x7f\xf8\xbb?\xc8\xef\x97?\xfb\x1a\x1c\xff\xf9\xd0\ +\xb7E\xf2\x092\x8bZX\xff\xfa\xd8\xcf\xbe\xf6\xb1\xbf\ +\x86\xe1\x03\xe0\xfb\xe0\x0f\xbf\xff\xf8\xc7?}\x82\xf8\xe2\ +\x15\xe8O\xbf\xfa\xd3\xbf\xfd\xec_`\xfc\xf0\x0f\xbf\x1b\ +\xe6O\x7f7\xf4\xb9\xfc\xb0pE \xd6\xcf\xff\xfe\xab\ +\xbf\x16\x0f\xf0}\xf57\x80\x04X\x80\x11T~_\xe0\ +\x0a\x0a\xb8\x80\x0c\xc8\x80\xfb\xe7\x7f\xbcp\x09\x058\x81\ +\x14\x08?\xe5\xf7\x0f\xbc\x90\x0b\x1a\x98\x0b\x0d\xd8\x81\x1e\ +\xa8\x80\xb5\x90\x02\x148\x82\xf3G\x0b&\xa8\x06\x17\xf8\ +\x0f\xb5\xd0\x0c,\xd8\x82\x1b\xf8\x82\x1f\xb8\x80\xbc\xd0\x08\ +$X\x82&x\x838H\x0bP\x90\x82\xae`\x0b>\ +\xf8\x83-\x18\x84\xcd\xf0\x820\xe8\x0a\xbc\xe0\x02\x03\x98\ +\x83Jh\x82\x0e\xd0\x84N\x18\x0a)\x18\x04\xb8 \x0d\ +\xd2\xf0\x83V\x08\x84B\xe8\x82\xb9\xc0\x0bC\xb0\x849\ +\xe8\x84`\xe8\x84\x8f0\x86\x17\x08\x0b\xb8p\x86hx\ +\x86Ux\x85l\x18\x84_\xf0\x0f_\x18\x86r8\x86\ +tH\x87OP~\xbc\xd0\x0b\xbd\x90\x86|\x88\x86k\ +\xc8\x86>\x08\x0b\xff\xb0\x06r\x08\x86ux\x88\x87H\ +m\xd3\xe7\x0c\xb2\xd0\x88z\xff\xb8\x87}\xd8\x87Th\ +\x85\x02\x11\x0da\x88\x88\x98X\x87\x94@\x09Y\x96|\ +\xbd@\x0d\x8d\x18\x8a\x8e\xa8\x87\x91\xd8\x87\xcd \x10#\ +\x90\x89\xaa\xf8\x08\x9b\xd8\x8a\x94P\x02\x09\xb2{_@\ +\x0d\xb4H\x8b\x8e \x8a\xa1\xf8\x88\xa5\x88\x0b\x81 \x10\ +.\xb0\x8a\x9a\xe8\x8a\xafX\x02\xc4X\x02'\x90|\xae\ +\x90\x00\xb5\xb8\x8c\xd4p\x8b\xb8(\x0b\x8f\x08\x89g\xc8\ +\x0b\x03\xb1\x8a\xc28\x8c\xc5H\x8c5P\x03\x9b\x90|\ +\xb2\x90\x00\xe0\xa8\x8c\xccX\x8b\xce\xf8\x8c\x8f\xf8\x86\x02\ +\x11\x0a\x87x\x8d\xd8\x98\x8d\xdb\xf8\x8e5\xc0Y\x85\xc7\ +\x0bo\xc0\x03<\x10\x8e\xe08\x8e\xcbX\x8e\xa1\x88\x0b\ +\x04a\x01\xacx\x8d\xd9\xe8\x8e\xf0\x08\x8f0\xf0z\xb8\ +\xf0\x06\x0aY\x8f\xf8\x18\x8e\xfaH\x8e\x8d\xd8\x04\x04\xd1\ +\x0f\xc28\x90\xc5X\x90\x05i\x00\x06Pn\x85\xe7\x0b\ +o\x10\x00\x0b\xb9\x90\xf7\xd8\x90\xe2\xf8\x90\xafP\x10\xed\ +H\x90\x18\xf9\x8e\x1a\xd9\x92\x06\x00\x08\x96\xd7\x0c\x010\ +\x933\x19\x92\x0a9\x92\x0d\xff\xa9\x8f\xe88\x10`0\ +\x90+\x99\x91.\xd9\x92%\x86wo\xe0\x01\x1e@\x93\ +5i\x93\x0cI\x92\xb5(\x0b\x06\x91\x0c\xda\xf8\x93,\ +\x19\x94-\xb9\x06Vy\x87h\xd7\x0c\xe4`\x94F\x89\ +\x94Ii\x938\x89\x8f\xa7X\x10^ \x95\xdbH\x95\ +Ui\x95j\xa9\x0c;\xa9r\xb3\x10\x00\xe4\x10\x97\x5c\ +y\x94^\xa9\x94\xf5\x18\x96\xd4h\x10\x05\xf0\x93h\xa9\ +\x91j\xf9\x97k0\x03$pu\xd2\xc0\x074@\x03\ +q\xb9\x95s\xe9\x95 \xa9\x94\xf6H\x0d\x08\xd1\x08@\ +\xd9\x97\x80\xa9\x9630\x03&\xc0W*\xf7\x05|\xd0\ +\x99\x86\x89\x98r\xb9\x98u\xa9\x94\x12y\x104p\x96\ +}\xe9\x97\x95\x19\x98\x98i\x02\xae\xa9\x88\x1c\xc7\x03\x0b\ +\xb0\x00\x9ei\x98\x89\xa9\x98\x5c\xc9\x98\x8d\xa9\x90y\x19\ +\x1f\xa9i\x00\xab\xc9\x9a\xae\xe9\x9a\xa1P\x9cC\xc0q\ +\xb9\x80\x0380\x9b\xb4\xe9\x99\xa0\x19\x9a\xa2\x89\x94o\ +\x00\x99\x09q\x08h\x19\x9c\xc29\x9c&P\x9c\xc5\xa9\ +\x0c\x0d\xf7\x05\x86\xa0\x9c\xcb\xff\xc9\x9c\xb5\xf9\x9c\xb8\x99\ +\x9bH\xe9\x0a\x0bq\x01.\x89\x9d\x97\xa9\x9d\xdb\xc9\x9d\ +\xc59\x07/\xb0o\x01\xe0\x05: \x9e\xe3\xd9\x9c\xce\ +y\x9bs\xd9\x95 \xe9\x0b\x0b\xa1\x05\xaa\xb9\x9a\xef\xa9\ +\x9d\xf2\xc9\x9ds0\x00\x03\xc0p\xcbF\x0d\x82 \x08\ +\xf8\x99\x9f\xca\xc9\x9c\xfc\xd9\x99\xe6\xf9\x9f\x1e\xe0\x8f$\ +\x11\x0a\xc1y\x99\xad9\x9c\x09\x1a\x0a\x0b\xca\xa0\x03\x90\ +\x09\xf7wh\xb9\x90\x01\x11*\xa1:@\xa1\x15J\x9e\ +\xe5\xe9\x9f\x5c\xd9\x96\x09\xa1\x06\x95\x09\xa2\xf09\xa2$\ +j\xa2\x03\xc0\x05\x5c\xa0\x0co\x90i\xbc \x08\xe8\x90\ +\x01,\x1a\xa1\x13\xaa\x9f\x16Z\x9e\x19\xea\x94&\xe1\xa1\ +V\xa9\xa3\x08:\xa2sP\xa2\x0c\x0a\xa4@\x9a\x05\xd2\ +ph\x820\x04Cp\xa4I\xea\xa20\xba\x9f\x17\xfa\ +\x99\x89\x89\x12,\xc0\x9a!*\xa2V\xea\xa3Z\x0a\xa4\ +;p\x01E\xa0\x9e>\xf6\x05:\x80\x02(\x00\xa6\xe8\ +p\xa4-\xea\x05K*\x9eM\xea\xa4\xd4y\x12\x03\xd0\ +\xa6\xc4i\xa5X\xfa\xa3q\xff:\xa7\x17p\x01z`\ +\xa7\x0d\xf6\x05^`\x0c\xc6\xa0\xa7`\x1a\xa6cJ\xa6\ +L:\xa8\x9dI\x0e6J\x12F\xb0\xa3<\xba\xa8\x8c\ +\xaa\xa5\x8ez\x01\x99\x90\x09I }\x0d&\x08\x1b`\ +\xa9\x97\xba\xa7|\x8a\xa4\x7f\xfa\xa2e\xea\xa9P\x8a\x12\ +\x81\xc0\x00n\x9a\xa0W\x0a\xa7q\xca\x05\xa9\xba\xaa\xab\ +\x9a\x08\x09\x80^\xaf0\x04V\xb0\x01\xb1j\xa9\x98Z\ +\xabc\x0a\xa8/\xaa\x9ffJ\x0e\x82\xa8\x12O\x10\x9f\ +o*\xacq\xfa\xa8\x8fj\xac\xabZ\x00\x9b\x80\x03\xc1\ +%\x0d\x1b\x10\x02V\xd0\xac\xcf:\xab\x99\xda\xa7\x9b:\ +\xa1\xb9:\x9b]z\x14\x16\xa0\xa8>z\xaar\x0a\xae\ +\xaa*\xae\x05\xf0\xaf\x0c\xf0\x01\x9d\x15\x00\x98\xa0\x09!\ +\xa0\xae\xec*\xabzJ\xab\xf0:\xad\x81*\x9e\x01\xa0\ +\x14\x5c \x9f\xc1j\xa2\xc3J\xac\xfc*\xae\x99\xf0\xaf\ +\xff\x0a\x06`@I^%\x08 \x00\x02\x9a`\xb0\x08\ +\xeb\xac\x0a\x1b\xad\x9a\x1a\xaf\xb8Z\xa1\xbdy\x14>0\ +\x9f\xa6z\xb1\xa9\xda\xaf\xc6\xff\xca\xb1\x05\xe0\xb1\x1e+\ +\x03w\xf7O\xd4\x80\x09O\xf0\x04#[\xb2\x07\xbb\xae\ +(\x0b\xad*+\xa6-*\xa1KZ\xa8Iq\x09\x15\ +k\xb1\xc3Z\xb3\x1a\x8b\xb3:\x0b\x06\x0c\x90\xb5p\xc0\ +L\xbc\x90\x01\x9e\xf0\x01\x1f\xf0\x04R@\xb2&{\xb2\ +\xed\xba\xb0\xef\xea\xa7\x7f\x8a\x9f\xe4P\x16\x05\x90\xaf4\ +\x9b\xb1\xfe\xca\xb1W\x9b\xb5Y\xab\x0c\xc3\xe0\x09x$\ ++|\xf0\x01.\xe0\x09_\x1b\xb4C[\xb6F{\xb6\ +I\xab\xb4-j\x06/\xab\x14\x9a \xb5S+\xb77\ +K\xb7:K\x05v\xab\x0c\x96\xab\x0cI`\x05|B\ +\x0e\x1f\x00\x08\x80\xf0\xb7_\x1b\xb6BK\xb6E[\xb8\ +)K\xaba\x8a\xb8\x82\xd0\x0b\x81\xc1\x02\xfa\xaa\xa5\xfc\ +j\xb3\xab\xda\x07V\xab\xb3v\xcb\x00\x97\xfb\x00\xbak\ +\x01\x9a\x00\x1f\x9cy\x08\xfd@\x02$\x00\x08J\x00\xba\ +`+\xb8\xa4\x8b\xb0\x09\x8b\xb4\xa8\xbb\xb2\x82\x10\xb1\x82\ +q\x09\x8f\x0b\xb9\xb3[\xbb\x1e{\xbb\xb9\xab\xbb\x0f\xc0\ +\x09G0\x08@\x90\x1b\xb8\xff\x80\x02\xc4\x00\x04>\xd0\ +\x0f\xc1\xeb\xb9.\xf0\xb7\x87 \xbac[\xb2&\xbb\xae\ +\xcb;\xab\x87k\x08\x9cA\x0d\xca\x80\xaa\xb1\xab\xb1\xb4\ ++\xb9\xd7[\xb9\xd9\xbb\xbdG\x10\xc0\x9b@\x00)\xf0\ +\x01CZ\x16\xb8 \x08J \x06' \x0c\xc2P\xbe\ +\xc1;\xbc\xc5\x0b\xb8\xc7;\xba\xee[\xba\xf1\xbb\xb0\xa8\ +\x9b\x0e\x8bk\x168P\x00\x18K\xbd\x99\xb0\xbf\x1d;\ +\xb9\xd8k\xb9\xda\x0b\xc0G\xb0\x09\x03<\x0c.l\x01\ +L\xb0=G\x81\x0bf\x00\x02'\xa0\x05L`\x04b\ +\x10\x0c\x0dL\xbe\xe6;\xbc\x9fk\xbc\xa2;\xb8\x07\xab\ +\xbcG+\xbf{\x8a\x0e\xb9\x90\x1b\x1bP\xb3\xb2;\xc2\ +\xd6\xdb\xbfw\xfb\xbf\xdc+\xc0-\xec\xc2N\xe0\x04P\ +0\x0fz\x00\x03\x80`\x05:\xe0\x01\xb2\x10\x08y\xc9\ +\x0b\xaf\xd0\x0bo\xc0\x07C\xa0\x09$\xa0\x050\xd0\x08\ +\x8d@\x01Z\xa0\x05:\xcc\xc0\x0e\x0c\xc1\xc2\x8b\xbe\xea\ ++\xba\x16L\xb8\xa6\xcb\xbc(\xc0\xba\xd4\x01\x08\x22L\ +\xc29[\xb7\xfe\x8b\xc2\xda\xff[\xc5,L\x00\x04\xe0\ +\xc2\xc3\xe0\x04Y\x00\x052 \x03\x89P\x04I`\x01\ +\x16\xa0\x07?\x10\x0f\xf1\x90\x02S0\x05/0\x02#\ +\xa0\x06j\xc0\x02\xc9\x00\x03oL\x01r\xcc\x04b\xb0\ +\xc3=\x8c\xc7\x9e;\xc1\xa1\x8b\xbc\xc9k\xc4\x86\x9b\xac\ +\xef\x01\x04\xe1Z\xb5Q|\xbb\xb8K\xc5\x01\xbc\xc2W\ +\x1c\xc9\x92L\xc9\x89p\xc9\x99\xbc\xc9\x9d\xfc\xc9\xa1<\ +\xca\xa5|\xca\xa9\xbc\xca\xad\xac\xc3<|\xc7?\x0c\xc4\ +\xe9K\xc1CL\xb6~\xec\xac\xed\x0a\xbd\xf0a\x04\x1a\ +\xbb\xb1Q\x8c\xb5\x89\xac\x0c)\xcc\xc8\x03\xfc\xc8X\xac\ +\xc5\xf3`\xc9\xca\xac\xc9\x9c\xec\xc9\xa0,\xca\xa4l\xca\ +\xa8\x9c\xcap,\xc7t\xfc\xca\x0d,\x0c>|\xbe\xc4\ +\x0b\xba\xeb\xdb\xcd\x17\x8c\xcb\xb1\x1a\x8b'\x22\x06s\xcb\ +\xbfR\x1c\xcc\x8a\xac\xbbUL\xcc\x8e\x0c\xc9Y\xbc\xc5\ +\x96|\x09\x98L\xcf\xcd|\xcf\xd0\x5c\xca\xfb\xfc\xc6q\ +<\xc7\xae\x0c\xcb\x02\x8d\xc7\xda,\xc4A\xdb\xc7\xef[\ +\xb8\x0c]$>0\xae\xe7\xff\x0c\xcc\x97\xab\xce\x8b<\ +\xcc\x8d\x0c\xc9\x91<\xc9\x95\x9c\x08\x1c\x9d\xc9zP\xcf\ +\xce\x8c\xcf\xf9\xcc\x02\xa8L\xd2\xac\x8c\xc3\xd6\x1c\xd0>\ + \xcb\x05\xcd\xd2\xa3{\xcb\xf0+\xce|\xe2\x028{\ +\xc8&\x9c\xce\xeb\xac\xd3\xed\x8c\xd1\xc7\xfc\xd3\x97\x90\x04\ +BM\xd4 \x0d\xcd\xa7\x9c\xd4\xd4<\xc7u|\xcd\x03\ +\x9d\xc7A\x0c\xb8\x07m\xcbD[\xb4Vm)\x1b\xc0\ +\x00\x10\x8d\xceS\xfc\xbf*l\xd1<\x9d\xd1\xc8\xac\xcc\ +e\xfd\xd1\xcf\x8c\xd6H=\xcd\xfd\xcc\xd6\xaf|\xcd\x0f\ +\xac\xd2z\xcc\xcd-=\xb8\x06k\x05N\xeb,\x0b@\ +\x00Z\x1d\xd1\x12\x8d\xd3\x14\xed\xd5\x17\x0d\xd6\x1a\x9d\xcc\ +\x98\x5c\xd8\xf6|\xd8\xf9,\xcd\xfc\x5c\xd2L\x0d\xd0\x0e\ +<\xd0\xc4\x00\xc4\xb4\x5c\xcb\xc8[\xb2VP\xaf\xe7\xa4\ +\x07\x88\x9c\xce\x9e\xfd\xd7\x8d\xec\xce\xc6<\xc9\xf1L\xda\ +d\xbd\xc9f\x8d\xda\xd1<\xd2\xfd\x5c\xcd\x8d\xed\xd4\x90\ +\x1d\xd7\x9e0\xd7S\x8d\x02'\xf9R\x8d\xe0\xb1\x94{\ +\xc2\x13\xed\xdb;\x0d\xd6>\xff\xbd\xd1\x1dm\xdc\x86-\ +\xcah\xad\xda\xaa\x1c\xc7\xfe\xdc\xd6\x01\x0d\xdb\xb2\xbd\xcd\ +\xb4-\xb4:\x90\xadG\x15\x02G`\xd3~\xcd\xdd\xa1\ +\xfd\xceP@\xc9\xe0\xbd\xccz\xb0\x04\xe3\xfd\x02\xe5\x9d\ +\xd8\xe7\xcd\xda9\x0c\xd0\xb1l\xbe\x11\x1c\xd9\x92\xad\x09\ +\x07\x8cX\x09\x10\x0f\xbc\xdd\xd5\xa0\x0d\xdcY,\xdc\xf2\ +\x1c\xd4\xf4\x0c\xe0\xf1\xe0\x07g\x9d\xda\x04\xae\xd4\xcc\x8d\ +\xd2\x8fm\xbe\xb1=\xcb\xee\xbd\xbe\xc6 \xa9\xb0\x05\x08\ +\x0f\xd0\xd9)\x8c\xdf\xc0\x1d\xdc\xa3\x0d\xd4\xc5\xbd\xc9\x1c\ +\xee\xe1\xc8-\xd2\xca\x8d\xdel\xdd\xd4\xaf\x0d\xc1\x0b^\ +\xd0\x14\xcc\x07\x02\xda`Sp\xd3\xeb\x5c\xd1\xbf\x1d\xd8\ +a-\xcf\xa5\xbd\xe1\x9d\xac\xe3\xe4M\xca<\x9e\x0c\xab\ +\xbd\xd4\xadM\xe2Om\xe2@\x1c\xc4\xc6\xb0\xc4>\x16\ +\x02\xf3\xd0\xdb\xdc\xfd\xd5\xa2\xcd\xdf\xc4\xed\xdf9\xfe\xe1\ + \x8e\xe5\x05\xee\xcf\x07N\xe2\x03=\xe4O\x10\xd3O\ +\xd6\x0f\x04\xb0\xc8L\x8e\xe6\xef\x8c\xe1\xfd]\xd6m\xbe\ +\xe3\xfa\x0c\xe7\x22\xfe\xe3\x08\xff~\xc7\x10\x1c\xdb.\xa0\ +\x03{\x9bi\xb2 \x06\x9bp\xe6\xf9M\xe3\xc3\x0d\xd4\ +Q>\xd4?0\xe5n\x9e\xdcj\xbd\xdc&\xad\xdeA\ +\xfe\xc3C\xc0\xe2\xb7F\x0dF0\x0c^]\xcc\x7f^\ +\xe3\x1a.\xde\x9cN\xe8i\x0d\xe7\xa0\xbe\xe5\x8e\xed\xc3\ +( \xe6*G\x0c\x83`\xd13\x9e\xc5Z\xac\xe6\x98\ +\xee\xdf\x9c\x1c\xebU\x0e\xe2#}\xe8t\x5c\xc7'\xd0\ +\xc0$ \x08\xd5\x8dvV\xf0\x02~N\xe3\xc2\x1e\xe5\ +\xb0\xde\xe1g=\xe0\xc9^\xebs\x1e\x0c\x1f\xc0\x07\x8f\ +Nz>`\x01N\x0e\xe8kN\xcf\xc5\xae\xed\x87\xcd\ +\xed\x86\xee\xedF\xd0\x0f(\xc0\xa1\x17\xc8\x07>\xf0\x03\ +\xc0\x8e\xe1\xc9\x1c\xd4\xc4\xbe\xe9\xecN\xde!]\xe8\x8a\ +\xed\xe3\xfd`\x0c\xba\x9c\x82\x06\xa1\x09\x8d\x90\x04\xc2\xce\ +\xef\xea\xde\xccT.\xe0\x01?\xeb\xe7m\x04\x1f\xe0\x05\ +\xf4\x8e\xf0\x0b\xb1\x01>\x90\x0c\x16\xe0\xf0\xe2\xed\xc9\x11\ +/\xe0V\xae\xcf\x8d\xd0\x0f\x9a\xa0\x03\xbb\xaa\xf1*!\ +\x0b|\x80\x02\x1f\xe0\x03F\x1a\xd0\x08j \xe0S\xe0\ +\xe1\xa3\xcc\x02\x8d\x10\x0c\xfdp\x08V\xe0\x05\x1e\xe0\xaa\ +\xb0\x15\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\ +\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\ +\x83\x08\x13*D\xe8\xe1\x9f\x91xG\xb8\ +y\x5c\x94\x1d2\xf7\xe1s\x07\xfah\xe7\x9d\x11\xf4\xc0\ +\xca\xa4\x12\xf0\xb9R?m\x80\xf2'\xa0J.\xa9_\ +\x932\xa6v(\x9b\x1c\xde\xe5a\x9c\xe9\xadG'\x90\ +\x90F:)+\xdf\x88\xffB\x81\xa5'%\xd2\x8a\x1c\ +rh\x0ah\xa0.\x0e\x8a&q\x86\xca\x85\xa8\xa9\x03\ +.*g\xa3Y\xb6*\xe9\xab\xdf4\x0b\x06\xad\x0a\x05\ +`B+\xd4\xe6\xaa\xeb\x98\x9d\xbe\x08j\xa1\x19\x02X\ +*eoV\xc9h\x8f\x0a>\x8a\xe7\xab\xb06\xfb\x0d\ +0m\xc8\x07\xadAU\x1cCm\xb5\xd7b+\xe8\xa7\ +\xbf\x12\xd7-k\xdf.\x17.\xaa\x06\xda\xe6\xa8\x96\xe7\ +N\xaa\xee\xba\xaa\xa8\x82\xc0\xbb\x04\xb9\xd0\xc0-\xb7\xcc\ +{\xab\xb5\x9c\xde\x0bc\xbe\xfe\x8d\x8a\xc0\x8d\xfe\xc2\xc9\ +\xa3\xc0\xe5\x12\xec*\xb3\xcd\x02\x03L\xc2\xaa\x08\x10\x0c\ +\xc3\x14h\x001\xc4\x12\xe3Zo\xb6\xbeZ\x08\xec\xbe\ +\xa4NV,\xc0\xd1\xad*r\x04\xe8\x1e|2\xca\xaa\ +x3\x05\xb4j\xe8\xa2\xf4\xcb\x11\xcfKq\xc5I\xd6\ +\xdc\x1f\xce\x1b\xe7\xe4\xa6^\xcd=\xb7^\x96\x22/\x9b\ +n\xc9D\xabRG\x1d\xf5$a\xe9\x14\x1a\xe4\xa0\xb4\ +./\xcb\xeb\xf4\xcc\x16\x9fi3cT\xb7vu\xd6\ +\xe3\x0a\xe03\xa4^\x7f\xff=4\xcac\xd7#x\x16\ +_\xa2\xadA\xdak\xb7\xed\xf4\xd3\xbcz*w\xa84\ +\xf2{\xd5\xdd\xc6\xa6Gn\x9d]\x93\x8cp\xd8d\x0b\ +.x4)\x86y\xf8\xe1j/\x0d\xb1\xdb\xb7\xc2\x1d\ +5\xbe\x18\xa3\xa6\xb1\xdd\xe0\xe2-\xe7\xd6\xe5\xf2\xad\xf9\ +\xe6\x80{\xae\xbb\xd9\xf3Q\xf0\xc7\x1f\xa3\x93\x9e8\xcc\ +oo\xda\xb8\xd4\xdc\xaa&\xb9\x80\xff\xeex,{!\ +C\x1a4\xd8D\x07\xae\xbb\xe7)\x5c\xf7D\x03\xbf\x03\ +\x1f|\xe9l\x13O\xaf\xf1\x16\x13Jw)\xb7\x98\x90\ +H2\x80\x18\x93\x10\x09j\x90Q\xc2(<\x83\x5c\xa7\ +\xed\x06S\x0fx\xe7\xd7\xd7\x83\x01\x06\xd7q\x07\xf7\xba\ +\x17<\xc4\x85O|2\x83Z\xaf.f\xb3\x06<\x80\ +\x09\xeeZ\x09\x1f\x1a\x91\x89\x15T\xa2\xaf\x84\xa5\x18\xd5\xf6\x08\x92dT!\xa0\ +\xe8\xe5/?\x0a\xd2]\x9c\xe2\x14\x1c`\x89\x1aLj\ +R\x94\xee\x13\x853\x90\xc5KK\xd2\x00w\x1e\x14\x98\ +\xc1T\xe8*Bj\xd3\x9b\x9e\x82\x0c*\xe1A\x1c\xdc\ +\xc1S\x88\xa2t\xa2y$ \x17l1\xd4\x92\xf4\xc2\ +\x1dr|'R\xb5\xa9\xd4\x90:\xd5\xa9\xf9h\x08J\ +f\xe8\x8e\xb6V\xf5\xa4\x12U\xe9\x1fB\xc1\xd5\xaez\ +\xb5\xa83MjM\xcf\xca\xd7\x02\xa4\xa4\x0am\x0d\xec\ +[\xe1\xaa\xcfgya\x05\ +\x91\xb3\xa0\xe7L\xe7&g7\x90x^\xc9\x0b\xfa\xab\ +f\x11\xf8\xf9\xd1Y6\x03A\x841\xe8J\x17z\xb8\ +\x0eH4K\x5c\xc1\x8dFC\xfa\xd3~ \xc89 \ +\x01\x89J[\x1a\xcc/\xd04K\x94a\xe4O\xbb\xba\ +\x02\x00 \x88\x01HM\xebR\x9bZ\xceK&\x8b\xaa\ +U2\x845\xbf\xda\xd5\xdc\x18\x089jMlR\xdf\ +:\xce\x12V\xed\xaeW\x22\x87_;;\xcb\x9d\xf9\x07\ +\x09\x8aMm[\xdf\x1a\xa0\xcbF\xc9\xb3]M\x88n\ +\x0f\xe4\x05[\xa8\xb6\xb8+\x1d\xc1l\x9fD\x10\xdbf\ +s\xb7\xd7\xbdn;\xfe\xe3\x0c[\x88\xb7\xbc\xc5Mm\ +/\x0f\xc0\xdc+A\x80\xb3\xd9\xcdoR\xf8\x1b\xc25\ +\x90\xb7\xc0\xe7MoZ\x1f\x0d\xdf)\xc9\xc4\xa7\xf9\xbd\ +n\x7f;\xdc\xe1\xaa\x10\x08\x00&\x0e\x80\x81[<\xdc\ +\xd5\xfe\x00\xc2U\xa2n\x86\x13\xe2\xe1 \x07\xf9?P\ +@\xf1\x92S\xfc\xe2\x02\xff\xafuu6\x8e\x12\x86\x87\ +\xfc\xe5!\xf7\x84\x0b\xdc@s\x9a\x9b\xfc\xe6(\xbf3\ +\xcbO\xc2\x0d\x98\xfb\xfc\xe5,\xa0@\xcd\x87N\xf4\x9b\ +\x97<\xde\xa0\xdb\xf9I&\xf0\xf3\xa6;|\x18) \ +\xba\xd4\xa7\xee\x06\x93\x8f@\xe9'\x01\x83\xd3\x1f\xfe\x8b\ +\xae{\xbd\xeb3\xb8\x04\xd5\xc7>uDc}!\xf1\ +\x80\xf9\xd7\xbfn\x8a\xb6\xbb\xbd\xed\x10\xd8\x04-hA\ +\xf6\xba\xbb\xe1\xc0g_\xc8\x09\xd6\xde\xf5\xb7\xfb\xfd\xef\ +m\xbfE\x1f\xe6N\xf8\xc2\x1b\x9e\xec^\xc8\xfbB4\ +\x01\xf8\xc6;\x1e\x01\xa10\xbc\xe4'/\xf9\x00(^\ +!:p\xbc\xe6\xfd\xce\x8d58\xe0\xf3\xa0\x0f\xbd\xe8\ +Co\xf8\xba^\xfe \xd4\xd8\xbc\xeaMQ\x0f\x03\x8c\ +\xfe\xf5\xb0\x07\xbd+N\x8f\x10\x5c\xb8=\x15\xb8\xcf\xbd\ +\xeew\xcf{\x15<\xe2\xf7\xc0\x0f\xbe\xf0\x87\x1f|\xda\ +'\x84\xf7\xc8O\xbe\xee\x89\xcf\xfc\xe6\xd7\xd7\xf8\x07Q\ +\xbe\xf4y\xbf\x06\xe7[\x1f\xf8\xb3\x87>Ap1\xfd\ +\xee\xa7B\x05&\xb8>\xff\xf1)A~\xf2k\xbf \ +\xd4\xb8\x81\xfa\xd7\xcf\xfe\xf6\xbb\x7f\xfd\x18\xe0B\xf9\xe7\ +O\xff\xfa\xd7\x7f\xe5\xe7\xff\xc7\x02\xde\xcf\xff\xfeG\x00\ +\x0c\xf6G~%0\x80\x04X\x80\x06\x18C\xf9\x17\x02\ +\xfd\xb7\x80\xedG\x04\xd1`\x80\x10\x18\x81\x05X\x035\ + \x18\xf9\xf7\x0f\xb3\x90\x81\x19\xc8\x80\xfd\xd7\x0a\x16 \ +\x81\x04H\x81\x228\x82#\xd8\x0f\x17\x88\x81\xbe\x90\x82\ +\x1a\xb8\x82,\xd8\x7fU\xf0\x02%@\x8228\x83$\ +\x08`\x17\x08\x0b8\x98\x83\xb0\x90\x82<\xe8\x0b,\xf8\ +\x83\x19\xa8\x0548\x84$h\x00\x06\x80\x227\xf8\x05\ +J\xa8\x83L\x88\x83=\xc8\x83+x\x08D(\x83F\ +X\x85U\xe8n\xf9\xa7\x84Z\xb8\x85_\xd0\x84^\xa8\ +\x82\xff0\x84V8\x86dh\x00\x09\x90\x7f\xb3\xc0\x0b\ +j\x18\x031\xc0\x85n\xd8\x85^8\x0b\x09 \x82e\ +X\x87c\xb8\x06k\xb0e\xe7\x07\x0bj\xd8\x87~\xd8\ +\x86o\xc8\x8588\x0b\xff\xc0\x05vX\x87x\x98\x88\ +xh\x83\xda\x17\x03\xb5\xff\xe0\x87\x90\xf8\x87\x80\xf8\x86\ +\x02!\x03\x87X\x85\x8a\x98\x89x\xa8\x0c\xf9W\x0b\xaf\ +P\x0b\xa0\xf8\x88\x918\x8al\xb8\x85\x02\xc1\x02\x88\xa8\ +\x89\xaa\xb8\x0630\x03{\xf8\x0a\xb0\x08\x8b\xa1\x18\x8a\ +\xa38\x8a\xb0 \x10\x9e\x80\x89\xab\xa8\x8a\xad8\x03&\ +\xf0\x8b@\xa0}\xbc\xe0\x0a\xc4\x18\x8b\xb18\x8b\xa0X\ +\x8bjx\x8b\xff\xe0\x01\xbb\xc8\x8b\xad\xf8\x8b\xd2h\x02\ +\xb7\x04}\x9d@\x8c\xd8\xe8\x0a\xc6x\x8c\xc8\x18\x89\x84\ +(\x10\x99\xf0\x8c\xac\xd8\x8b\xd38\x8d\xa1\x10\x0a\x9du\ +y\xb0\xd0\x0c\xcd\x90\x0b\xb9\x90\x8d\xc4\x18\x08\xdb(\x8b\ +\xdd\xc8\x0b\x04\xf1\x03\xd0\x18\x8d\xe5(\x8d\xe7\xd8\x8f\xb3\ +B{\xb5`\x0b\xb6\xc0\x8e\xed\xf8\x8e\xf0\xa8\x8d\xf3\xf8\ +\x89\xc9H\x10\x80\xa0\x88\xbd\xe8\x8b\xfb\xf8\x8b\xfd8\x91\ +\xa1\xf0,\xa77\x0bA \x0d\x02)\x90\x04\xe9\x8e\x07\ +\x89\x90\xf3\xf8\x05\x04\xf1\x06\x0f\x19\x91\xfcH\x91\xfd8\ +\x07s0\x00\x9epz\xbc\x80\x0b0\x89\x0b\x1b\xc9\x91\ +\xec\xe8\x91\x07)\x8f\xb1\xff\xe8\x0b\x05\xc1\x09&)\x91\ +(\x99\x92+9\x00\x03@\x00\xa7\x87\x0b\xbd\x10\x930\ +\xa9\x91\x1b\xd9\x916y\x90\xb5`\x10\x8d\x10\x91?\x09\ +\x94BY\x95\x03\xc0\x05zxv\xb5 \x0b\xb2\xd0\x0b\ +G\x89\x9429\x93Li\x90\xd8h\x8f\x05a\x06\xe6\ +8\x95\xe7\xa8\x92V)\x94\x5c\xf0\x96Iwv\xbd@\ +\x0d\x5c\xd9\x95_\x89\x94J\xb9\x945i\x93\xccX\x10\ +\xca\xa0\x96T\xd9\x96o9\x98\x5c@fX\xd7\x09\xd4\ +\x90\x98t\xc9\x95^\x09\x96\xb8\x90\x974Y\x93\xd9g\ +\x10Z\xa0\x96l\xd9\x96WI\x98o\xb9\x03\x0c \x0d\ +J\x07\x0b\xd4\x90\x00\x8a\x99\x98u\xd9\x95\x8e\x19\x96b\ +\xd9\x0cOy\x10\xe4\xf0\x93\x97)\x98\x9a\xc9\x05;p\ +\x01\xb4\xc9\x88\x1b\x87\x0b\x09\x90\x9b\xa29\x9a\xa5\xd9\x98\ +`\x09\x99\xb6\xd0\x97\x06Q\x04@\x19\x94\xb0\xa9\x99\xb3\ +I\x9b\xb4\x99\x09\xe8\xc0r\xb5\xf0\x06o\xc0\x03\xba\xb9\ +\x9b\x8a\xd9\x9bw\x89\x94\x029\x99\x07\xf1\x04\xa1\xf0\x9a\ +\xc7I\x98\xc9\xa9\x9c\x17\xff\x90\x09\x99\x10\x0d\xba\x81o\ +\xb0\x00\x9d\xea)\x9d\xb99\x9a\xa4Y\x97\xbe\x09\x96f\ +\x89\x10\xb5@\x05\x98\xe9\x96\xb1)\x9b\xe29\x9e\xe4I\ +\x9eW\x87o\x8e\x10\x00\x02\xaa\x9eo0\x9d\xee\xe9\x08\ +\xd6\x89\x94A\xf0\x8d\x09!\x06\xdf\x89\x9c\xfb\xd9\x9f\xfd\ +\xd9\x07\x05\xa0q\xd9f\x0b\x1e\xe0\x01\x02\x1a\x00\x04\xca\ +\x9e\xed9\x9a\x08\x0a\x9f_y\x0d%!\x0b\x17\x80\x9f\ +\xf9\x19\x9e\xca)\xa1\xe4Y\x00.\xca\x00\x08\xa8i\xaf\ +@\x0e\x19\xaa\xa1\x1bJ\xa0\xd3I\x9d\x89\x19\xa2\x8c\xd9\ +\x0b\xc2\x99\x10\xc9\x90\x9f\x9b\xb9\x9f\xfc)\xa1\x14\xea\xa2\ +\x05\x00\x06\xc3\xb0k1\xe0\x01\xe4@\xa3\x19\xba\xa1\x1c\ +\xba\x9e\x06z\xa0u\xf9\x0c'\x91\x00\x99\x10\x9b;\xa0\ +\xa2\xcb\xc9\xa2G\xea\xa2`0\xa6\x89\xa0i_\xe0\x01\ +|@\x03OZ\xa36:\xa0T\xaa\x9b\xeeI\x0d\x08\ +\xfa\xa3\x0a\xd1\x08\xe0\xe9\xa5E*\xa1H*\xa6c:\ +\xa6z\x80g\xb0\xe0\x01\x0b\xc0\x07\x84\xaa\xa6P\xda\xa6\ +S\xaa\x9e9\xea\x9e\xe7\xff\x89\x12[\xaa\x9f\x11\xca\xa2\ +\x99\x10\xa6|:\xa6T\xc0\x00\x0c\xb0'?\x16\xa8\x0b\ +\xd0\xa9\x84\x9a\xa6kZ\xa3R\xda\xa1\x8b\x9a\x98t\xaa\ +wx\x9a\xa7\xfd\xb9\xa7I\xda\xa7`p\xa9\x98\xca\x00\ +K\xe0b_ \x0f8\x80\x03\x9d:\xa8\x85\x1a\xaaQ\ +z\xa3\xa4:\x9dX\xaa\x12\xaf\xb0\x09\x91\x0a\xa6\xac\xea\ +\xaa`\x10\xab\x98\xaa\x0c\xca\x90a\xcb\xc5\x0b\x86\xe0\x05\ +:p\xab\xb8\xaa\xab\xa0\xca\xabR\x9a\xa8\xd0\x09\xa7:\ +\xb9\x12\x9a \x9e\x92:\xa9\xc7\xea\xaa\xca\xca\x00\xcc\xca\ +\xac2\xa0k\x9e\x95\x0bf \x08\x82 \xad\xd4\xea\xa9\ +\xbb\xca\xab\x88J\xa0\xd1\x99\x00\xafp\x14?\xa0\xaa\xab\ +:\xae}Z\xae\xe7\xaa\x0c\x0f\xf0\x00\x9b\x90\x95]E\ +\x0d\x19\x90\x01\xee*\x08:0\xad\xb7*\xaf\xf3\xca\xa6\ +\xd9J\xa0-f\x14o\x00\x06\x92J\xa9\xadJ\xae\xca\ +\x1a\xb0\x03;\xb0\x9c\xf0HC\xf5\x05|0\x04C\x80\ +\x0e\x0a\xeb\xae\x0d\x1b\xaf\xd6z\xad\x12;\xaa\xd0)\x92\ +HA\x02,\xca\xaa\x1b\xff\xfb\xaf\x1d{\xae\x1f\xfb\x00\ +\x9cp\x04G\x90\x04\x89\x17P\xb8\x80\x0e(\x80\x02&\ +\x8b\xb2\xee*\xad\x0e[\xad\xd6j\xa8\x87\x8a\xa8\x01`\ +zH\xa1\x07\xe4\xa9\xb17;\xa6\x00\xab\xb3\x1f\xdb\xb3\ +>\xbb\x09\x9b\x80m\xd0\xc2\x07\x1b`\x0cEk\xb4'\ +\x9b\xb2J\xcb\xb2M\xfb\xa4O\xbb\xa1gX\x16\x09\xa0\ +\x0cV\x8b\xac\xb0\x1a\xab\x1e\xbb\xb5>{\x04^K\x00\ +\x04p\x0eO \xb3\x96\x12\x00\xc6\xb0\x01cK\xb6f\ +\x8b\xb2h\xbb\xb2\x0f\x0b\xb1N\xcb\xa6\x1a\x0a\xb8J\x11\ +\x02\xfe\xda\xa7u\xbb\xacZ\x8b\xb7]\xbb\x09\x040\x0c\ +\x9c\xfb\x03\xeec$\xb3\xf0\x06\x1b\x10\x02V`\x05\x84\ +k\x0c\x86{\xb4)\xfb\xae\x8a\xcb\xb4\x9fJ\x03\x86\xca\ +\xa6\xb90\x18\x8d\x80\xa4\xc8\xfa\xaaY\xcb\xac;\xcb\xb3\ +y\xbb\xb7\x9b\xcb\xb9N\xe0\x04\xf1\x10\x02\xf3i\x1d\x1e\ +\xb0\x01\x9a\xa0\x09!@\xba\xa6[\xb8E\xab\xba\x0b\x9b\ +\xb6\x8b\xdb\xb2\x8d\xeb\x08\x85a\x01W\x9b\xac\xb9\xab\xbb\ +\x98\xab\xb7\x9a\xfb\xbb\xc3\xff\x10\xbcY\x00\x052`\x01\ +$\x80\x7f\x85\xd1\x04f\x00\x02O\x00\x02 \x90\xbc\xcc\ +{\xba\x86{\xb8\xab+\xbd\xae\xfb\xbaO\xfa\x06\xddJ\ +\x18\xc3\x80\xac\xe5j\xaew\x0b\xb2\xbd\xbb\xb7\x9c\x0b\xbc\ +N\x00\x05\xf3 \x03\x89\x90\x08E\xc0\x02\x9a\xf0\xb6f\ +a\x0b\x0b\x10\x02\x9ep\x08\x1f\xf0\x04\xed\x0b\xbf\xf1\xeb\ +\xbcf{\xb6\xd1\xdb\xba\xb9\xfa\xa9i\xea\x011\xf0\x19\ +\x0b\xf0\x008\x9b\xb3\x97\xcb\xb3\x5c\xeb\xbd|[\xc0\xe2\ +K\xbe\x0a|\x09E\x90\x04\x16\xa0\x07/\xd0\x0fC\xd0\ +\x0bF\xd1\x0c\xe4`\x0c\x9e\x00\x08\x80\xe0\x02\x9e\xe0\x09\ +\x17\xdc\xbe\xef\xab\xbc\xa5k\xba\xa8\x9b\xba'\x8b\xb4I\ +\x0b\xc2\x10K\x0e\xf9\xba\x1b\xc6\x80\xb5\xdb+\xb0;\xdb\ +\xc2\xbe[\xc0\xe1{\xc0\x09\xbc\xc05l\xc3z\xb0\x04\ +?\x10\x0f)\xa0\x06'\xf0\x04(\xc0\x07o\x80\x0bU\ +,\x10\xb5\xd0\x04\xd4\xe0\x01:`\x0c @\x02@\xe0\ +\x03\xfd@\x02$0\xc4D\xfc\x01G\x9c\xc4\xcb[\xba\ +\xf2[\xb6\xaa[\xbfR\xff\xac\xab\x8d\xba\x1b\x9e\xf0\xbf\ +\x01\xab\xc5\xdd\xeb\xb5\x9a\xeb\xc51,\x033\x5c\xc3\x16\ +p\xc3g\x8c\xc6S0\x05/\xf0\x02#0\x02j\xc0\ +\x02\xc9\x90\x0c0\xd0\x08\x14@\x01Z`\x04b \x06\ +' \x0c{\xdc\x0f\xc4\xf0\xc7J@\xc4F\x8c\xc1\xee\ +\xab\xc1\x86\xcc\xc1&{\xb6\x8a\xbc\xb4\xb9\xea\x99\xf3A\ +\x0c*\xcc\xbd\xdd\xeb\xc2\xe0\xfb\xc5P@\xbe\x0bL\xc3\ +d\xac\x07\x9d\x9c\x02\x9f,\xca\xa4\x5c\xca\xa7\x9c\xca\xab\ +\xac\x05L\xf0\xca\xb1,\x0c|\xdc\xc7B\x8c\xcb\x82\xfc\ +\x04R@\xc8\x1b\xdc\xc4\xcf\x0b\xbdIk\xbf\x0b\x80\x0d\ +)r\x02\x96\xbb\xc2,<\xc0/\x0c\xc3N0\xbe\x98\ +,\xc6I\x10\xcdg\xec\x07\xd4\x1c\xca\xa3\xac\x06\xd8\x8c\ +\xca\xaa\xcc\xca\xdd\x0c\xcb\xc2\x00\xce\xfd \xce\x80\x5c\xc1\ +\x83\x8c\xce\xbd\x8c\xba\x88\xfc\xc4\xc1\xec\xb0\x10\xec \xc2\ +\x10\xc9\xbb\xcb\x09\x5c\xdc\xc5\xf8\xdc\xcc\xfb\x0c\xcd\x9b\x5c\ +\xc6g\x9c\x02\x01m\xcd\x04m\xca\x06\xbd\xcdL\xe0\xca\ +\xc1\x10\xcb\xb3\x5c\xcb\x80\xffp\xcbE\x1c\xd1\xbc<\xd1\ +\xf3{\xb4P\xcc\xba\x0d\x9b\xd1)B\x02\xf4\xcc\xbb\x99\ +\xfb\xbd\x96\x9c\xcf\x08\xac\xc0\x0c\xdc\xcf7,\xcd\xf1\xe0\ +\xc9\xa0\xac\xd2\xd8\x0c\x03\xda\x8c\xd00-\xd3|L\xd3\ +C|\xd38\xad\xbc\xe9L\xd1\x1d\x8c\xb8\x1fL\x0d\xd0\ +\xf2\x01\xc8,\xc0\xf6\xbc\xcc\xc1{\xc02\x9c\x08\xd0\xec\ +\xcfOM\xcdQ=\xd0S]\xd5\xdc|\xd5\xb2\x1c\xce\ +\x7f\xfc\xd0\xb9\x8c\xc49\xdd\xbc`\x1d\xd6\x09\xbb\xb0d\ +\xfd.\xc6@\x00[\x9c\xb7\xdek\xd4\xf8<\xbea\xec\ +\xd6\x9a|\xc3f\x1c\xd7\xd5,\xd5\xa6L\xd5\x07}\xd7\ +\xde\xbc\xd0zm\xcb\xe4\xdc\xd5\x85\xdc\xbc\x1c,\xd8\x19\ +\xe0\x05\xe7\x14Md\x00\xb2\x1f\xcd\xd8\x06\xcc\xd6\xfb\xbc\ +\xd46,\xd9\xff,\xd7\x02M\xca,p\xd9v\xdd\xca\ +\x9b\xcd\xd0\xb4\xbc\xd7\xb8l\xc1\xba\x8c\xce_\xbd\xd3O\ +\xec\x05\xda\x89K\xf1\xe0\xd1\x8a\x0d\xd2\x8d\x9d\xd4\xcf<\ +\xc6M=\xcd)=\xca\xb6\x8d\xdb\x99\xad\xdb\x0a\x9d\xd7\ +\x0d\xed\xdb\x9f\x1d\xdc\x7f\xff-\xbfN<\x04\x86P\xbc\ +\xe8\xc4\x04\xcb\xcd\xdc_\xec\xdaJ]\x04\x91\xad\x07N\ +\x0d\xd5\xb5]\xdd\xa8\x9c\xca\xaa\xac\x05\xd8\x1d\xd3\xda\xed\ +\xd06m\xc4\xa0\x1d\xda\x84;\xdaC\xa0V]e\x05\ +d\xb0\xd8\xf7\xdc\xdc\x09\x9c\xc9L-\xdb\x94=\xd7\x03\ +}\xdb\xf3\xdd\x08\xf5}\xdfX\xbd\xdd\xdc\x0d\xd1\x18\xec\ +\xd7^\xbd\xc4\xe0m\xb4\x85\xedY/\xe0\xbbj\x1d\xbc\ +\x22\xad\xd4o\x1d\xdd\xb3]\xd9t\x0d\xe1\x98=\xe1\x09\ +\x8d\xdf\xbc\xad\xd5.\xd0\xdd\x1a\xbe\xbc\x1b\x5c\xb8v\xb0\ +\x9a\xcb\xe5\x09Np\xe0\x06\xec\xd8\xaf\x0d\xdd\xd1\x1d\xd7\ +\xb4m\xd9\xd6\xed\xe2x\x0d\xcez-\xc4\xfb\x0d\xdc\xe6\ +\xbc\xcb\x1b>\xd1\xe8\x1b^\x090\x02^\x9c\xde%\xfe\ +\xdc\x0bn\xd2D\x1e\xd5F\x1e\xe1H\xbe\xdb\xb3\xdc\xc7\ +\x9eM\xe3P\x1e\xe5V\xe0\x05q\xecb\x1b\x90\x04\x08\ +\x1e\xe4\xd0\xed\xde\x93\x0d\xdf\xb5\xbd\xd2G\xce\xca\x9a\x9d\ +\xddc\xee\xc7\xe3l\xe6P^\xc8\xc6\x00\xd4Q\x06\x08\ +\xf3\xb0\xd6Y\x0e\xd9[\xff.\xcd)\xee\xe0\xd7\xcc\xe2\ +\xf4\x8d\xe7/\xed\xcd\x15\xde\xdbL\xfe\xdbG\xac\xe1\x9a\ +`\x05\xe4\x00\xb9\x89\xd6\x0b\xed@\x06@n\xe2B\xee\ +\xde\xd2\xad\xe2+\x9e\xcd\x8fn\xd5\xaf\x0c\xe3>\xd0\xd9\ +5=\xe3\x5c\x1d\xdc \x10\x02\x0b\xa0\xe3\xe6&\x0c\x89\ +\x90\xe0b\x1c\xe7\x5c\x8e\xc6EN\xdd+\x8d\xea\x12\xee\ +\xd2\xae,\x06\xac\xee\xea|]\xce\x18\xac\x098\xb0\xe6\ +\x08'\x0d.`\x01Z\x1e\xdb\xa4^\xea\x8c\x1e\xec`\ +\xbe\xcd\x14\xbe\xd0{\xbe\xd7M.\xc8\x9a`\x08\xb6\x8e\ +u\xc6\xc0\x02\xec\x9d\xe8?0\xcd\x95m\xcd\x8d.\xec\ +\xd7]\xec0>\xe6Z}\xcb\xb8\xbc\x01\x01\xc0\xe9\x8a\ +\xf7\x06.0\x05\xd1<\xe7\x00\xbd\xee\xc0^\xd0-\xae\ +\xed\xc5\xae\xe7\xe1L\xe6\xe3,\x05f\xd0\x04'\xd8\x8c\ +.\xa0\x06\xbd\x8e\xd2\x00\xdf\xe8,=\xf0\x90^\xec'\ +\xf0\xcd\xadn\xe1R \x08\x15\xdb\xf0\x03A\x0d\xc6p\ +\x02/\xe0\xeb\xa6N\xf1\xee\xae\xed\x91n\xec\x1a\xef\x03\ +J`\x05|\xd0\xc8 ;\x8f\x10\xd40\x04\x9e \x06\ +#\x10\xdfv\x9e\xf2\x17\xbf\xea>\xc0\xc64@\xcc3\ +\xbf\x12\xd2\xe0\x01\x82`\x05\x87\x00\x08\xc2 \x06\xaa\xdc\ +\x08T\xcd\xcdb\xe0\x03.\xf0\x04V0\x04n<\xbb\ +\xcb\x15\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\ +\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\ +\x83\x08\x13*L\x18B\xcc\x94a\x99jT\xd1P\xae\ +E)E+\xa0\xdd\x92\xf0\x88\xcb\x91xF4-\x1c\ +I\xb2\xa4\xc9\x93(S\x1e\x14\x93\xc8\x84\x86\x03\x07\x10\ +\xc9\x94\xd9\xa1f\xa9\x8b\x8ar*B\xc0\xb3'\x91\x15\ +%\xb2h\xc1\xa1\xb2\xa8\xd1\xa3H\x116\x02\xd3f\xd4\ +(\x98Pg\xd2\xb4\x89SgO\x9fD\xb2\x12\xe1\xd0\ +b@\xb2\xa4`\xc3\x8a-\xa8g\xcb\x0a\xa7h\xa1\xc2\ +\x94\x8a\xa8f\x87\x9b:s^E\xa0U+\x07\x0ei\ +\xf2\xb6\x194\xb6\xaf\xdf\x92\xf1 \xac\x18|\x16\xedS\ +\xb5l\xdd\xc2\x8d;\xb7n\xd6\xbby\xd3 \x9b\xac!\ +\xd1\xdf\xcb\x7f]\x093\xd1\xa2\x05\xe1\xc1\x86\x0fG\x95\ +\xaa\xb8\xaa\xdc\xab\x8e\xef\xe2\xcd;\xb952\x00Z0\ +\xcbF:e\x02\xa8\xce\x9d?\x17v\xaa6&i\xaa\ +qw\xa2\xae\x0b9\xb2kd\x8c\x92\x1fH2\xbb\xb9\ +\xc9K\x7f\xe4\xc8\x01u;\xf7\xe7\xd0\xbd\x7f\xbf5-\ +\x1c\xab\xdd\xd5\x92\x8f'\xffW@\xbe\xcc\x03r\xce\xd3\ +\x1b\xb4\xa0\xa1\x95\xfb\xe9\xd5=_7\x9c}f\xe9\xe0\ +\x8d\x89\x83?\x8e\x9c\x11y\xf2X\xa4q\x84z\xe9\xe5\ +\xf2B\x03\xb7\x1c\xe3^+\xd2\xc5'\x1fh\xf4!f\ +\x1fp\x8c\x0d\xf7\x9dq\xae\x8d\xf7\x9f\x02XtX\x06\ +s\x04b\xd6\x0f\x04\xb7\x94x\xcb\x82\x0d\xc6\xa7[\x84\ +\xa3M\xb5\x1d~\xde=\xb6\x9fx\xfe\xfd\xd7\xe1\x8dX\ +\xac\xc0D\x88}\x91S@\x0e\xba\xe8b\xa2\x82\xefQ\ +\x87\xdb\x8a,\xfa6\xe1bV\xc5\xb8\xd5\x8c\x19\xd6\x08\ + \x8eXXb\x09-<\x82\xf5\x05\x0cmh\x00d\ +\x90&\xa2\x08\xdf\x91\x84a\xd7\xe2TL\x9e\xc6Sj\ +PN\xa6\xe1\x948Z)\x80\x00i\xa4\x90\xa5Q\x1e\ +\x5c\xa0\xc1\x9e^\x82Y\x22\x91\x0c\x1ai]\x99i\x9d\ +\xd9\xd6\x8b\x15\xae\xa9\x1f\x86\xad\xbd\xc9!\x95\x96\xcc)\ +)$w\xa6D\x8c\x04\x7f\xf0\xe9\xe5\x97a\xbe7\x1d\ +\x99\x84\xf2&!\x9a\xa6\xe5g\x17\xa3nJ\xf9h\x9c\ +\x91JZ\x0c7D\xc4\xffV)II4\xf0\xc7\xad\ +\x9ar\xfa'\x8a\x82>\xb8\x9bhk-Y\xaa\x85O\ +\xa2\xda\xdf\x86TV)\xe9\x9c\xdc4\xcb\x0d\x03\xb3.\ +\xc4E\x03\xb6\xe2\x9a\xab\x9f'z\xaa\xe2|\xa2\x06K\ +j\xa2\x8a\xcah\xec\x9b\xc9\xca\xe9\xaa\xb3\xdc\xa0\x22\x01\ +z\xd1\x164\xc4\x16\xd4R{k\xa6|\xea\x9a \xaf\ +\xd5!\xd9\xad\x92\x87\xa6Il\xb1\xe15\xaaj\xb9\xcb\ +\xbe\xea,*\x08w`E\xbb\x03y\xe2N\xbc\xf1\xce\ +{\xad\x90%\x8a\xb9-\x84\xfb\xfe\xe6\xaf\x93m\x1e\x0b\ +\xe7\x8d\xe62{0\xc2\xa8D\xa0\xc0\x09\x0ck\xd1\x06\ +\xc4\x10[[\xaf\x9f\x80~:\xe8\xaf\xa3\xf6;l\xb8\ +\x00\x07\xec&\xb2\xac\x16<2\xc2\x11\x04\x8d\xca\x0b\xd1\ +&\xd3\xc6\xca,\xcb\xebr\x9f\x14g\x1b\xe8\xc54{\ +k3\xb8\x8b\xb2&\xb0\x8d\x90\xfa\xfcs\xd0\x5cG`\ +A\xa5/\x1c}t\xd2J\xd3\xbb\xa7\xae1C\x9d\xa4\ +\xb0T_\xa83r<\x83\xdc\xaa\xc8\xcd\x92\xdc5\xd7\ +=@\x91e\xd8b\x8f\xffM\xf6\xd2\xf6\xe2;\xf3\xda\ +\xdf6\x89s\x9b\xe4f-)\xbav\xdf\x1dA\x0f\xac\ +\xb0\x92E\x88\xc9L\xd0\xb7\xd8dW;\xf1\xae\x0c\xca\ +\xeck\xa1\xdeR\xa8&]\xa7Z\x9d*\xd6r\x9f[\ +7\xd0\x8eC\x1e9+_\xa7\xc7\xc4\x04\xb4_\x8et\ +\xd2\x12\xbf\xdc\xe9\xd3\x83gl\xdf\xc6\xe1\x16'\x1e\xea\ + /\xcb8\xeb]\xbb\xfe\xfa7S8\x07\x82;\xb4\ +\xd7~y\xe6\xb93\xcdy\x83\xbd;\xd5\xc0\x00\xcc\xb9\ +\xf0\x0f\x1f\xbd4#\x90\xf8|\x18\x03\x08\x0b2\x18 \ +\x07\xc0Q\x12\xaf\xec\xe2[\xdf\xad<+\xdf\xd4\xcf\x8a\ +\x0f\xb3\xa1\x03A\xf4\xd1\xdbN\xbd\xd9\xd6s\x9a\xe7\x08\ +\xe3\x8eM\x88\x81]*\xa1\x00\x18\xa0\xa1\xb3\x81\xa5n\ +N\x06K\x17\xf2\xf0\xf6:\xfa\xd5\xaf~cX\x18f\ +h\xe1\x0e\xe8\xf1\xcfr\xd3\xfb\x1b\x00\xb1U\xa4\xea\x94\ +@\x0d}\xf1\xc2\x14\xaa\xb0\xb3\x8f\xbd\x8fn\x8dK^\ +\x05/X?`\xa8\x82\x084\xb8L&:\xd8\xc1\x0f\ +J\x0fs\xb8s\x99\xae\xffP4\x01=\x98a6d\ +8\x00\xf1Bv\xbc\xd6\xcd\x90\x866T\x85*\xda\xf0\ +\x17=\xf0\x90\x87>\x04!\x10Y\x06\xb8\xa6\xb5\xc2\x0d\ +;RO2\xfe\xa08\x01D0\x86A\x9b\x1f\x0d\xbf\ +\x11E)\xaa\xa2\x00}Q\x82\x04\xae\x88E\x1f\x86\x90\ +\x8bf\xe3\x14-|\xf0\x85,iA\x17\x1d\x9a\x9b\x00\ +\xe2\x877\xe5\xad\xb1\x8dnT\x05\x05\xc6\xe2\x06\x098\ +\x92\x8e\x1e\xfc\xe0\x1d[\x96Gw4\xa2]/(\xc5\ +\xdc\x08I\xc1\xc8A\x11\x91R\xacC\x1d*!\x160\ +8\xf2\x94\x90\x8cd\xff\xfa\x16D>\xc9@\x16\x0c\x13\ +H\x01 82'z\xf2\x82\xa0\x0ce\x1d\xeaQ\x8f\ +\x09\x80E\x0b\xa7\x0cf*\xed\xc8J<\xba!\x96\x05\ +\xf1\xc4\x0aj)\xbf\xe5\xe12\x91n\x14%/y\xa9\ +\x07\xa4x`\x0bU\x08\xe6)\x97\x01Ib\xfa\x8de\ +\x93CfAd1\x00\x09\x96L\x86\xb7\xac!4U\ +!\xcdi\xf2\x12\x15H9B\x15\xe6\x99Mm\xce\x91\ +\x8e\xde\xbc]\x03&`\xff\x04q\x22D\x0dX8g\ +'-\xa8Nh\xb6\xd3\x9d\xbc\x8c\x83Q\x00AOz\ +\xda\xf3\x9eW\xcc'\xb5\xb6\xe0O\x85\x84\xa0\x03\xe8$\ +(\x1b\xd7yP\x84\xf2\xf2\x92*YCC\x1bjO\ +nFT\x92b3\x80\x07*\xaa\x90\x05\xdc\x22\x8d\xce\ +,h4w\xe9Qwb\x00\x01\xb6HI2 \x00\ +\x81\x91:\xd4\x9e\xdd\xe4\xdf\xd1\xb8\xc0R\x92L\xc0\x90\ +5\x04eGk\x8a\x81\xa6\xca\x00%\x09p\x03Oy\ +\xea\xd3y\x02\x15\x9f\xfc\xcbDQK\x22\x81t\xe6\x92\ +\xa65\xe5eS\xc7\x1a\x01\x94La\xaaS\xadj=\ +\x85\x89\xd5\x09\x10u\xab%i\xc33\x13\xb9T\x84\x8e\ +\xf5\xae\x18\x00\xc3I\x00\x80V\xb4\xaa\xf5\xaaX\x5c\x03\ +,\xe1J\x92\x04\xb4`\xa3t\x05+S\xf1:\xd6o\ +\xf0\xa1$S\x80\x04$\xfa\xeaW\x9f\x02\xd6\x1dX\x22\ +\xecI\x88`\xd0\xb0\x8a\x95\xb1cU\x81\x0a\xe08\x12\ +j8@\xb2\x92\xa5lZ-\xcb\xd6*\x0cA\xb3'\ +\xd1\x04*t\xe9Y\xd0\xff\x86V\xb4*\x00F\x00F\ +\x02\x03\xd4\xfaV\xb5=em0\xc5\x00[\x94\xbc\x80\ +\x9d\x8a\xb5\xabmq\xab\x0248w\x1e#1\x80o\ +\xa7\x0b\xdc\xaa\x9e\xd22\xc5E\xc9\x0cj\xbb\x5c\xdc:\ +\xf7\xbb\x8cX\x08 \xb6\xb0\x85\xe9RW\xb5\x965@\ +vU\xd2\x01\x8f\xda\x16\x03\xcc\xfd\xeewW\xb1\x8a\xaf\ +$\xe4\x08\xe4\xcd\xafyQ\x8b\xde\x91jp\xbd'q\ +\x81r\x19\x1b_\xf9\xa2\x81\xbe\xf4\xa5\x22B\xf8\x00\x00\ +\x00\xe4W\xbf\xfb\x9d,e\xe9YM\x00\xa7\x84\x0b\x9f\ +%\xb0w\xe5\x8b\xe0\x0e\xaf\x22!,hp\x83\x1fL\ +\xde\x08K\xb8\xaf\x0e\xb0\xb0Jx\xa0\x00\xd0\x16x\xbe\ +\x1eF\xf0.6\x81\x10.\xb8A\xc4\x22&qy\xf7\ +\xdbW\xe2\xaaX%x}\xb1scL\xdf]\x18y\ +\x17\x928\x88 \xdc\xc0d&\xe3\xd8\xc1$\x8e0O\ +C\xf1\xe3\xa2 \xa2\xa9B&\xf2*\x8e\xbc\x8bSx\ +\xf9\x14\x07QC\x93\xc7|c\x1cGy\xbf\xde\xabr\ +J\x1a\xb1a\x18\xc7\xf8\xff\xc8_\x8e\xb32\x0c\x92\x09\ +2\x93\xf9\xc9:\xf6\xed[\xd5\x9c\x92\x03\x18\x98\xc8G\ +fF\x9c\x07\xdd\x81\x82\x04\x80\x16\xb4\xb0\xb3\x9d\xf1\xfc\ +`\xc9\xe2\x8f\xcf)\x19\x81\x9beldA\x0f\xfa\xd2\ +`&\x88\x0f\x10\xcdiE\xdf9\xc7\xf9U/\xa4U\ +R\x897\x1b\x19\xd3\x98\x8eE,\xec4\x90$8\x80\ +\xd3\xb0\xf6\xf4\x98\xcd<\x82Q\xab\xe4\x01\x94\xee2\xaa\ +\xe3\xac\xea^\xc7\x22\xb3\x021\x81\x03\x86\xfdjXw\ +Z\xd6e~\xac\xadS\xb2e]\xef\xda\xcb\xbe\x8e\xb6\ +%\x08B\xecj\x0f\xdb\xd8\x88\x965\xb4\x96\x9d\x92.\ +<\x1b\xda\xd1V\xf5;\xc6=\xee\x81\xb8\xe0\x11\xe8~\ +\x84\xb5\xab\x8dm;\xf7\x93\xdb(\xb1\x00\xaa\xc3-n\ +r\xdb\xfb\x1d(\xfc\xc7\x08\xd2\xcdot\xaf\xfb\xda\xc6\ +f2\x02\xe1m\x92A\xd3\xfb\xde\xf7\x16\x81\xc2\xfb \ +\x90,\xf4\xfb\xe1\xfe\xfe7\xa7\xb5Jp\x94t\xe0\xe0\ +\x08\x1f\xb7\xc27\xbeq\x05\x9b\x00\xe2 \x8f\xb8\xb5\x89\ +V\xf1\x93\x14\xa0\xd7\x19\xff\xd78\xc7W\xae\xf0\xb2&\ +\x80\x120\x0f\xb9\xcc\xd5\xed\x80'\x94\xfc$\x14\xc88\ +\xcbw\xbe\xf2\x7f\x0c\x01\xe6@\x0f\xfa\xcc\xfb}s\x94\ +\xa8\x9c\xe7H\xe7\xf8?\ +!\xc2h\xbc\xe6\xf7\xae\x01\x06L\xfe\xf3\x92\xd7\xc1\xe5\ +\x17\x12\x82\xcd\x9b\xbe\x02\x8a\xb8\x00\xe8W\x0f\xf8\xd1/\ +\xc4\x0c\xa7\xdf<\x16\xb8`\x80\xda\xdb\xfe\xf6\xb8\xaf\xbd\ +\xe4]\xbf\x90\xd8k\xfe\x1b\x03\xc8\xbd\xf0\x87o{\xde\ ++\xc4\xf7\x8d\xaf\x03\xf1\x97\x9f{\xe3'\x84\x10\xd0\x8f\ +\xbe\xf4\xa7O}\xe93\xff\xfa\xb5w>B\xaa\xcf\xfd\ +\xee\x13\x82\x0bk\x08\xbf\xff\xf8\xc7O\xfe\xf2\x8b_\xfb\ +\x07!\x85\xfa\xd7\xcf\xfe\xf6\xbb\x7f\xfd\xf5\x00\xbf\xf9\xe7\ +?\x7f\xf1\xa1\x9f \xef\xcf\xbf\xfe\xdfH\xff\xfe\x93\xff\ +\xfe\x05\xa1\x7f\x02\xd8~\x02\xf0\x00\xfe\x17~3\x90\x80\ +\x0a\xb8\x803\xb0\x00\x00(\x10V0\x80\x12H\x0a\x08\ + \x03\x0cx\x81\x0ah\x02\x1a\xb8\x81\x1c\xb8\x01\x0f\xf8\ +\x0f'`\x0a\xbf0\x82$X\x82\x13\xa8\x0b?\x90\x80\ +\x1c\xb8\x82,\xd8\x82$\xf0\x81?`\x0a28\x834\ +(\x82%x\x83#H\x0a\x900\x02-\xd8\x83\x1b\x18\ +\x0a@\x18\x84 \x05\x80\x05P\x83Fx\x843H\x82\ +3 \x06>h\x02A\xf8\x84P\x08\x84\xb1\x03\x80\x13\ +\x80\x84Vx\x84\xc3\xf0\x04\x1a\x18\x85\x5c\xd8\x85\xa1\xa0\ +W\x0f\xd8\x03\xa90\x86\xa9p\x85W\xa8\x06\x19\xe0\x85\ +j\x18\x0as\xd0\x86s0\x00\x0f\xc8\x07d8\x87s\ +h\x863\xe8\x09\xff\xb0\x86O\xe8\x86o8\x00~\xe8\ +\x87!\x00\x80\x8d@\x87\x84H\x88H\xf8X\x99\xd0\x85\ +|\xd8\x87\x7f\xd8\x88~\xff\x08\x03\x00\xc8\x0570\x89\ +\x85X\x89th\x0a\xf5 \x10E\x10\x84\x8b\xe8\x88\x9e\ +8\x00\x5c\x10\x8a\x5c0\x0c\x00\x98\x06\x93x\x8a\xa7h\ +\x89\x85\xa8\x01\x02\x01\x03n\xf8\x89\x9e(\x8a\xb2\x18\x8a\ +\xbb\xa5}\x19\x80\x8a\xb8\x88\x8a\xaa8\x86; \x10O\ +\x00\x8b\x8d8\x8b\xc2\xc8\x05;@\x0c\xe87\x0b\xc8\x98\ +\x8b\xcaH\x89\x85Xk\xff\x10\x00\xb08\x8c\xc2\xb8\x03\ +;p\x01\x17p\x09\xe8\xe7\x0b\xbe\x80\x8c\xc9\xb8\x8c\xcb\ +H\x86\x190\x10\x0c\xf0\x87\xd28\x8d\xd5h\x8d\xe8\xb8\ +R\xc67\x0b\xb0\xd0\x8e\xda\xc8\x8d\xb3\xe0\x8d\xca\x08\x0c\ +\x041\x05\xe58\x8b\xd4\x88\x8e\xfax\x01\x99\x10F\xbc\ +\x07\x0b_\xf0\x05\xed\xe8\x8e\xdb\xc8\x8d\xf2x\x8a\x94b\ +n\xf7H\x8d\xe7\xb8\x8f\xfc\x98\x09\x10\xf9\x00\xbc`|\ +1\x10\x90\x019\x90\x04\x09\x8f\xf1\xb8\x8c?P\x10\xc3\ +\x98\x8f\x0ei\x8d\x109\x92#\xf9\x01\xff\xc8\x0b(i\ +\x91\x17\x89\x91\xef\x08\x8f\xb9(z\x04\x11\x0d\xa2\x08\x92\ +!\xf9\x90$9\x92\x05\xff@v\xa3\x87\x92<\xc9\x0b\ +\x15\xa9\x92\x18\x09\x0b-i\x907\x90\x06\x06\xa1\x054\ +\x19\x927I\x92}P\x00NY\x00\x81xy_P\ +\x0b\xb5\xd0\x93<\xa9\x92\x02\x19\x94C\x89\x8c\x06\x81\x03\ +5i\x93K\x99\x09M\xf9\x94N\xa9\x93wW\x0b\xaf\ +\xf0\x0aTi\x95(\xf9\x93\x16\x19\x94BY\x90\x07\x11\ +\x0d\x0e\x19\x968I\x96N\x09\x06z\x89\x87w\xc7\x0b\ +\xae\x90\x96i\xb9\x96l\xe9\x96o\x19\x94\x08!\x06\xe8\ +h\x97\x109\x96x\xa9\x97\x8e9 e\xe7\x0b\xae0\ +\x99\x7f\x09\x98\x829\x98X\x89\x91\x08\xe1\x01\x8a\xb9\x98\ +x\x99\x97\x8e\xe9\x98\x0c0\x847W\x0b\xcd\x90\x0b\x94\ +Y\x99\x81Y\x95l\xe9\x93X\xf9\x05\xb3\x90\x10z`\ +\x97\x8cI\x96\xa1)\x9a\x0c\x90\x9b\x82Pt_`\x0b\ +\xb6p\x9a\xa89\x99\x81\x00\x98jy\x99V\xa9\x92\x0a\ +\x01\x02K\xf9\x99\xa0y\x9bT\x90\x9b\xd0\x99\x08\xb9P\ +r\xbe\xd0\x04\xbe\xf9\x9b\xc0I\x99\xc3i\x99\xc6\xd9\x93\ +1\xe0\x0b\x0b\xf1\x00\x9e\xff\xc9\x9c\xb7\x89\x9b\xd0\xc9\x00\ +\xca\xa0\x0c\xf6Ep\xcf\x80\x0b\xeey\x9d\xcdp\x9a\xa9\ +I\x9c\xc5\xc9\x9aV9\x12\xc2P\x9b\xb6Y\x9e`p\ +\x9e\xb9\x99\x9e\x00js\xf0\xf6\x0a\xbd\xd0\x0b\xee\x89\x0b\ +\xd7\xf9\x9b\xb9\x10\x9c\x93I\x9fTi\x9f\xbc\xd0G\x0b\ +\xd1\x0b\x0c\xf0\x99\xfc\x09\x06\xcf\xe9\x9f\x00\x9a\x9e\x0fp\ +\x06\x0e\xb8l\xbc \x0b\x22j\xa0\x07\x0a\x9f\xd9I\x99\ +\x0e*\x98\xb19\x12\x14\xb0\x9f\xe5\x99\xa1\xe7\xb9\xa1\x1c\ +\xfa\x00\x0f0\x0f\x09`k\xb0\xe0\x08\xd4@\x0d#z\ +\xa0\x08j\xa2\x0c\xda\xa0\xc4I\x951`\x12\x15z\xa1\ +\xfd\xe9\x9f\xe8\xb9\xa14\xda\xa4\x9c`\x019\xc5g\xb0\ +\xb0\xa3T:\xa2$\xfa\x9e\xbe\x19\x9f\x0b\x9a\x9a\xaa\x99\ +\x96\xe0Y\x12Zp\xa1J\xba\xa4L\xda\xa4\x0f\xc0\x09\ +Gp\x04\xac\xa6f\xd4\x90\x00nZ\xa5=Z\xa2@\ +\x1a\xa4\xdb9\x91&!\x0b\xca\xe0\x9cc*\xa3\xca`\ +\xa6g\x9a\xa6G\xb0\x09$\xf7c\xd4\xf0\x06o\xe0\xa6\ +\x09\x00\xa7\xb2p\xa5X\xff\x9a\xa5'*\x9c_j\x12\ +>\x10\x9a{*\xa3~\xfa\xa7i\xba\x09\x9a\xba\xa6\xeb\ +\x05\x0b\x09\x10\x00\x86z\xa8o\x0a\xa7\x05\xea\xa3\x09\xaa\ +\xa5\x0cj\xa7(\x91\x05I\xaa\xa4|\xea\xa7\x9c\x80\xa6\ +\x99\xaa\xa9\x040\x0c?@\x0d\x00\xf6\x06\x01\xb0\xab\xa1\ +\x8a\xa8T\xca\xa3q*\xa7\x8e\xba\xa0\x81\xb0\xa2(\x11\ +\x02\x95j\xa9f\x1a\xab\x80\xaa\xa9\x9bP\xab\xc30\x0c\ +E\xa0l\x9a\xf5\x0a\x01\xe0\x01\x1e\xb0\xab\xa0j\xa8\xbe\ +\xaa\xa8\x8c\xfa\xa3\x8e\xda\x0c\x12\xaa\x12S\xa0\xa1\xca\xba\ +\xac\x80\x1a\xa8\xb4\x1a\xad\xd1\xea\x04d \x12\x84%\x0d\ +4@\x0e\xe4\x80\xad\xda\xda\xab\xa3\xba\xa3\x8e`\xa5>\ +\x0a\xae\xb6\x10\x08H\xf1\x00\xff\xf9\xaa\xb0\x9a\xae\xce\x0a\ +\xad\xed\xea\x04N\x00\x05L\xf0\x0aE\x05\x0bo\xc0\x07\ +|0\xaf\xd8\x9a\xad\xbc\xca\xad\xf9\xba\xa3\x22\xba\xa8\xfd\ +z\x9d\xb0\x80\x14.\xc0\xa73\x8a\xae\xcd\xba\xae\xec:\ +\x0c\x0a\x9b\x05P \x03\xf1@\x14\xfe\x94\x0b4\xb0\x00\ +\x12\xcb\x07\xf4Z\xb1\xf7\xff\x8a\xb1\x19\xbb\xb1\xa5\xea\xa3\ +\xaaz\x14~p\xaeN*\xab\xb3\xfa\xac\x08\x8b\xb2N\ +\xa0\xb22 \x03\x89\x90\x08\xc20\x9d\x0c\xf3\x05\x01\x80\ +\x038\xb0\x002+\xb15k\xaf\x17\xfb\x06<\xd0\xad\ +\x1a\xcb\xaf\xeei\x7f`1\x0c\x00z\xa9\xccZ\xb2D\ +{\xb2)\x0b\x05\xf3\xa0\xb4\x89P\x04E\xf0\x03QY\ +)\xbe@\x0dv\xa0\x03: \xb5T+\xb1\xf3Z\xaf\ +X\xbb\xadZ\xcb\xb5\xd4\xb0\xafq\xfa\xb1aa\x05#\ +\x1b\xb4\x06K\xabE\x9b\xb6+\xab\xb4\x97P\x04I`\ +\x01\x160\x02\xaf\x95%\xb2`\x06\x82 \x08^p\xb7\ +S\x9b\xb7\x13{\xb5\x16\xeb\xb7[\x9b\xb1\xc0\xba\xa8\xb5\ +\xd0\x17Z@\xb6B\xab\xaeg\xcb\xae\x0a\xbb\xb0\x8d\xbb\ +\xb4\x90\x1b\xb9z\xa0\x07?\xc0\x02(\xa0\x1e\x9e\xea\x05\ +C\x80\x0e\x19\x90\xb9\x9b\x8b\xb7U\xfb\xb9|\x1b\xba\xa1\ +:\xba\x89\xfa\xab\x22\xfa\x0c\x7f\x11\x0f$k\xb6\x04\xb0\ +\xb8i\x9b\xb4K\xfb\xb8\x91k\x01z\xb0\x04?\x10\x0f\ +~0\x02O\x80\xab\x98\xff\xe1\x0a\x1e0\x04(\x80\x02\ +\xbd\xfb\xbb\x9ak\xb7\xc2;\xb3\xa0k\xbc\x86\x8a\xbc\xbf\ +J\x0d\xb8`\xac}1\x0fg\xba\xba\xac\x1b\xbd'k\ +\xb4*\xbb\xb6\xd5;\xbb\xd8k\xbb\xf1\x10\x0f)0\x05\ +S\xf0\x02L`\x0c\xe0\x1b\x16\xae\x10\x00\xe8\xb0\x01\x1b\ +`\x0c\xe5;\x04\xe7\x0b\xbc\x9cK\xb5U\xbb\xb76{\ +\xb3\x7f\xdb\xad\xb2@\xb8\x7f\xc1\x07\xf0\xb0\xba\xce\xda\xba\ +\xae{\xb4P\x10\xbbm\x9b\x04\xd7\x9b\xbd\xdb\xeb\x07\x05\ +|\xc0#0\xc3\x14\xf0\x01^\x80\x0bE\xe1\x0ao\xa0\ +\x03\x1b\x10\x02!`\x05\x10l\x0c\x12l\xbe\xbe\x9b\xb9\ +\x82\xa0\xbe\x9d\x9b\xc1\xa0\xab\xad\xa2\x8b\xa8\x89\xda\xb3\x7f\ +1\x04\x89\xab\xb8\xfb\xcb\xb8\xd4\x9b\x08\xd6+\xb9\xb5\xbb\ +\xbd\x04l\xc0/\xf0\x023\xac\x06j\xc0\x02\xc9\x00\x03\ +L\xe0\x02\x1b\xe0\x05\x1e@\x0d\xb6\xe0\x93\x02\xf1\x05\xbc\ +\x90\x0b\xb2\xf0\x064\xe0\x05\xe6\xa0\x09O\x00\x02 \xa0\ +\x09\x9a\xf0\xc3@,\xc4\x13\x5c\xc1\xe9+\xb5\x9d;\xb3\ +\x1a\xdc\xb7M\xec\xa6\xa7\xff\xdb\x1c\x1f0\xb4&\x9c\xb0\ +\xb0\xeb\xbfX\x0c\xc0\xd8\xab\xbd\xdc\x1b\xc3_\x1c\xc6,\ +@\xc60\xd0\x08\x8d@\x01Z\xa0\x05F \x06\xc1p\ +\x02\xc2\x00\x04\xfd\xd0\x0f$\x00\x08\x80\xe0\x02\x9e\xe0\x09\ +\x1f\xf0\x04y\xcc\xc7~\x1c\xc4C|\xbe\xe8\x1b\xbcI\ +l\xc8K\xcc\xc1[\xeb\x0a\xea\x01\x08%\xac\xbfh\x9b\ +\xb6k\xcb\xb6n\xdb\xc2\x02L\xc0\x05\x9c\xc9\x9a\xcc\xc9\ +\x9e\x0c\xca\xa2L\xca\xa6\x8c\xca\xaa\xcc\xca\xae\x0c\xcb\xb2\ +\xbc\xc7}\xfc\xc3\xb6\x1c\xc8E\x9c\xbe\x17\xec\xb94\xdb\ +\xcbY\x0b\xb6\xe9\xd1\x0fT\x5c\xcc(\xac\xc2\xd6\xdb\xc2\ +\x96\x0c\xc3^\x0c\xc6# \xc6d\x5c\xc6\xd1\xac\x05L\ +0\xca\xa5|\xca\xa9L\x02\xab\x9c\xcd\x1f\x10\xcbz\xdc\ +\xcdV\x00\xc4\x11\x5c\xbeD\x9c\x01\xb9\xcc\xb9\x85\xac\xb7\ +\xf4Z\xbcL\xfc\x06M\x90%\xfd@\xcc'\xdc\xceW\ +\xfc\xceZ\xbc\xcc)\x80\xc9\xf4l\xcfe\xdc\xc9\x14\x00\ +\xca\xfbL\xcd\xfe\xac\xca\x01\xed\xca\x03\x9d\xc7\xdc\x5c\xcb\ +\x11|\xcb\x82|\xc4\xe3\xff<\xbc\x87\xdc\xb78|'\ +.\xb0\xbf\xfc\x9b\xc2\xc7,\xbb\x90\xdb\xd1\x96\xdc\xc5\x07\ +L\xcf\xf5\xbc\xc9#\xfd\xc9&\xcd\xcf\xd5\xec\x03*\xdd\ +\xca\xae|\x08\xb1,\x05/]\xcb\x80l\xbe\xbd\x1b\xce\ +\x9b[\xd3\xbc\x5c\xbc\xd9\x1a\xa5\x95\x22\x05\xec\xdc\xbf\x1b\ +M\xc9[<\xc0\x1f=\xcfa<\xc6\xc9\x80\xcf\x9f\x1c\ +\xca'\xdd\xcf@\xe0\xd4\x00\x0d\x08J\x10\xd5\xb1<\xcb\ +\x06\x8d\xd0WM\xc1\xe1<\xc8\xc2k\xd3\xa0\x0b\xd6\xb3\ +2\x04d`\xb4\x1a\xcd\xb6\x1c\x1d\xc0C\x0d\xd23\x5c\ +\xcfl\xed\xd6\xd2\xcc\x04b\x80\xd2s\xdd\x0f\xc4\xb0\xca\ +w\xfd\xcay]\xd0}|\xd0\xdf\x8c\xd5\xe8\xa0\xd5H\ +\xfc\xd0\x10]\xaf\xc0\x1cK|\x90\x04V\xcc\xb6mk\ +\xd6\xcb,\xcfE\xfd\xd8c|\xcf\x9d\xfc\xd6\xd3l\xd9\ +N\x9d\xd9v-\xd0\xdb\x5c\xd5\xa0\x1d\xd3\xe0\x8c\xbe\xe2\ +\x1c\xd8\xbc\xec\x01\x8b\x8cL\xb2\xf0\x02*\xab\xb6e\xcd\ +\xc2B\xcd\xc5i=\xdb\x90\x8d\xd40p\xdb\xd2<\xca\ +bp\x02M\x8d\xd9\xab\xff\xdc\xca\x9cM\xd0\xc0\xcd\xd7\ +2=\xda\x0d\xed\xd0\x18<\xb3\x01P\xa4,\x15\x0c\xce\ +\xad\xd8\xc9\xac\xcc\x5c,\xdb\xce\x5c\xddm}\xddJ\x1d\ +\xca\xdam\xca\xa7\xbc\xdb\xdf-\xd0\x9dM\xcb0}\xd5\ +\xa2M\xdc[M\xc8\xe9\x9d\x00\x91\xcaR\xc6\x90\x04\xae\ +\x1d\xdf\xd1\x8d\xd6\x8e\xbd\xd6\xb6\x1d\xcd\xd9]\xd9\xfc}\ +\xd9\xbc\x0d\xd5\x9e \xd5\xbf-\xe0\xc1\xdd\xd7Ym\xe0\ +\xe8-\xb3\x84\xbdU\xd4\xa0\x06\xff\x0b\xdd\x01\x1c\xdb \ +\x1d\xd2\xb5}\xdf\x16\xae\xcf\xfb-\x0c\xfd\xed\xdd\xd8\x8c\ +\xd7\x1f\xbe\xd7\xa1]\xe0F|\xe0R\xeb\x01P\x0cW\ +\xb0\x00\x02\x16\x00\xe1\x01\xfc\x03\xd2=\xe1\xd5\xcd\xc9\xd8\ +\x0d\xd75~\xe3\x1b\xee\x02:\xee\xd2 \x8e\xd0\xc2-\ +\xda\x7f\xbd\xd5\x0b@\x0d\xf4[\x5c\xd4\x00\x03,^\xbb\ +C-\xdb\xd4m\xdfI\x8d\xdb'\xbd\xdd6~\xd9\xd7\ +\xcc\xe1\xb0<\xd5\xdc\xfc\xd9!>\xc4\x05\xde\xd0\xe40\ +\xe4\xeb\x85\x02)\xd0\xd1J.\xe1\xf3l\xd41\x9e\xe6\ +\x93\x1d\xe5n\xfe\xdd\x9b\xff\x1d\xe7;\xee\xc3u^\xde\ +\xe1l\x069\xcdg\xb5\xf0\x04\xf1\xe0\xc2\x03\x0c\xc3L\ +n\xcf\x15\x9e\xdf4\x8e\xe1m\xee\xd4O\x9d\xe8-m\ +\xe5<\xde\xe3~\xfd\xbb\x09\x00\xc2\xa3\x86\x0b\x80\x10\x0f\ +K\x1e\xe8\xb4\x1d\xe3\xf8\xcd\xe9F\xc0\xd4\x9f\xfe\xcf\x9a\ +\x9d\xcd\x1eN\xea\x8c^\xe7\x0aM\xc1\x19\x10\x00z>\ +j\xbd\xa0\x04)\xc0\xccj\x1d\xeb\xb6\x8d\xdd\x17\x8e\xd2\ +7\xfe\xd4\xe0\xdd\xe1\x9d=\xe7\xbdn\xcbC|\x07\xc8\ +]v\xb6\x00\x02#`\xc0g\xae\xe9\xf7\xcd\xec\xfa]\ +\xd9\xfd\xfc\xecu\xcd\xe1R=\xedW\x0e\xc11=\x04\ +\xc2\xbe\x93\x19`\x04_,\xe8\x83>\xeb\x85N\xee\x19\ +\x0e\xea\xe7N\xe5\xe1\xbd\xe8~\x8c\xd0^@\x0d\xaa\xee\ +z\xd4\x00\x020\xa0\xec\x9b\xae\xe6\xda]\xee\x87\xfe\xdf\ +\x00\xbe\xe3\x06\x8d\x02\xe4\x90\xda\x0f\x18\x00\x9a\xa0\x05\xf5\ +.\xee\x9d\xee\xec\x0d\x9f\xe3\xfdN\xea\x9a\x80\x02|p\ +\xe2\x1f(\x10\xb8\x80\x0e.@\x01\x84~\xef\x1c\xaf\xef\ +\x0e\xff\xca\xbb.\x05!D\x10\x09\x01@\xf1%\xaf\x10\ +\xb2\xa0\x03!\x00\x08ZP\xd2P\x8e\xef\xb7\x0e\xed\x89\ +.\x05\xc6\xa0\x03\x01\x80\xce7\x8f\x12\xb6\xf0\x06\x860\ +\x04V\x00\x02\x9e\x00\x08>0\xf5\xa7L\x0c\xad\xfc\x04\ +\x9a`\x0cC`\x06kl\xf3\x84\x15\x10\x00!\xf9\x04\ +\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\ +\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*Lh\xe5\ +\xc4\x0b2`f\x00h\xd0@\xc3\xa8\x03\xba\xfe4\x80\ +d \xd3\xb0)bBxXH\xb2\xa4\xc9\x93(S\ +\xaa4x\x22\xc9\x806-Z\xac\x98Is\x94\xcd\x8b\ +\x07r\xe6D\xc4\x93g\x87j\x06d\x18YI\xb4\xa8\ +\xd1\xa3\x08ihQ&\xa1\x95\x1c9\xa0@\xc5\x94I\ +s\xc5M\x9c:\x0f\xf4\xf4\xd9\xa1\x94WE\xba.\xc0\ +\xe0\x83\xb4\xac\xd9\xb3\x03Q\xc4sp\xebV\xab\xb7N\ +\xa3N\xadj\xf5fV\xad[;\xe8\xf5ZJ\x91_\ +\xbf\xee\x12m@K\xb80\xc9\x05)\xdc\xe8\xd2\xd5\xd6\ +-\x5c\xa8Rc\xd2\xbdzw+\x22\xbd]\xbf\xfeU\ +\x84\xa0s\x83$^\x0c\x8b6\xec\x83\x8b\x06\x0d9r\ +,n{\xec\xb1\x5c\xc9U)g\xb5\x8cY\xf3\xe6\xce\ +\xb8\x898`\x92k\xb4o\xa3/\xaa\xfc9}Z5\ +\xe3\xb6\xae#S\xadiwv\xde\xbd}o\xe3\xeeL\ +\xa4\xfa\x0a=\xbf\xb3\x9b\x0c\x90d\xc2\x9f\xef\xc4Q\xaf\ +\xffF\xfe\xf6\xa9\xf2\xc9\xcdu\xd2\x86\xbe\x99\xf3\xf4\xea\ +\xf0\x89(\xda\xa4\xbd\xfeA=\x13(6\xf8>\xbc\xb8\ +\xea\xc6\xad\x95\xf7\x1az6U\xf6\x1c_\xedM\x87@\ +|\xd5q\xc0\x01\x02\xd1\xd8g\xdf\x08\xee\xe8G\x11\x7f\ +\xe1\x19\xd7Xrs1W\xa0s=\xb1'\xdd{\xf1\ +9\xc8A\x1ai\x94b\x81\x84\xbe\x01B\x8b\x85\x16\x82\ +G\x9c\x86\xe4\xc5u\x9e\x87X\xed\x14\xa2\x88\x7f)\xc8\ + \x11\x0e\xa2\x88\x222\xa0\x88\xc1ba\x0c\xb4\xa1$\ +\x8c\x17\xcaX\xdcq\x8e\xd9\xd8\xe1L\xb2\xa9\xb7cf\ +\x09\x92\x08\x9f\x89B\x22\xe3%2%,pdY\x8d\ +H\xa0\xe4\x92L\xee\xd7\xdf\x93\xc7\x05\x18\xd7\x94u}\ +h%WX\x8eH]\x89'v\xf9%2\x8aL1\ +\xa6Q\x05L0\xc1\x99h\xc2\x88!\x9b\x1b\x0a\x18Y\ +l\xe9\xe9\xc8\x15\x82=j\xb9e\x9ei\xec\xf9%#\ +B\x90\xf5'J\x80@\x22\xe8\xa0\x84\xa6\xa9f\x86P\ +r\xb8\x5c\x9c9\xe2\xf5ht\x91\xe6\x86\xa7\x90\x95Z\ +\xff\xca\x08#\x0a\x94\xc2\xc4\xa6%\xf1\xb2\xc4\xa7\x9f\x12\ +\xdaF\x9aN\x8aw\x9c\xa9\x8c\xca\xe9\xe8eu\xb6\xba\ + \x83A\x0e)\xeb\xac\x0aD\xfb\x00\xae\x0a\xbd\x91\x89\ +;\xee\xf0\x0aj\xa8L:Ic\x80\x90\xc1\xe6\xa1\x81\ +\xab\xda\xb9\xec\xa4\xb0Z\x8a\x0c\xb4\xd1*\x80E\x15\xd4\ +\x1e\x84\xce#\xd8b\xab\xad\xaf\xc0\xae)^\xa2o\x8a\ +\x1b'\xb9\xb5\xb1\xea\x9e\xab\xe8:\xbb'\xbb\xedb\x81\ +\xc5\x01\xf1\x12\xf4\x04$\xf5\xda{/\xb7\x86\xaeI\xa3\ +kp6\xfa\x5c\xb2\x03\x9f\xdb \xa5\xb1^\x8a\xb0\xbb\ +\x0acQ\x860\x0d\x8bQ\x85\x04\x11K\xdc+\xc51\ +Z<\x1e\xb1\xe3\xce\x89\xacm~I\x0a$\xa5\xea\x8e\ +\x5cr\xc9\x0a\x8c@-\x0c\x12\x14\xcdr\xcb\x13\x9f\xd9\ +\xad\xb7\xa5Jy\xaa\xc6;\xe2\xecc\xc1!\x8b\xdc.\ +\xc9?+l\x09v\x7f\xaaa\xb4\xd1-g\xcb+\xcc\ +\xfa1=\xec[\x03\xd6|,\x8f\x1d3\xcb\xf3\xc1\xb4\ +^\x9d\xb5\xd6\x96\x08 \xc3\x98#T\xb1\xf2\xd7G\xd7\ +\xff\x9bt\xa1e\xeb;\xb3\x80\xfeB]\xae\xb2\xaf\x1a\ +lu\xc2s[R\xb7\x00v\xb3\xd8\x88\xdez\xf3\xdd\ +\xb7\xcb\x82\xe2[\xf1\x8cm\x12\xfe\xb4\xb1\x07\xb2:\xf5\ +\xc7z.\x1e\xed\xdcX8\x0e\xf9\xea\x5ck\xa72\xe5\ +\x95\xf3\x8d\xf4\xd8Jo\x8e\xa8cPMi\xf8\xcdv\ +2[\xba\x97>7\xfe\xf8\xea\xc5p\xf3\x82v\x9a@\ +\x02\x01\xec\xb1\x1b\xbd\xcc\xec\x99\x93=\xeai\x83\xcb\xe1\ +\xce\x05\x164\xe2\x09\x0a\x06\xf5\x22\x90\x0b\xc9\x5c\x12\x8a\ +\x06\x02K\xdal\xd5\xeb\xc6}z\xd6\xaa\xaf.@\xf1\ +\xdc\xf0\xd3\xcfo\x82\xb8\x01\xc1\xfd\xcc\xef\x0dv\xc4\x7f\ +/\xcd\xf9-\x10p\xc2\x09\x8a\xa2\x14e\xfca`\xbe\ +S\x5c\xfa\xe4\xc6\xbe\xe1A\x0e~\xdc\xe0\x062~S\ +\x83\xfbY0\x7f\xb2\xe3\x1f\xed\x00w!\xe2\xcc \x19\ +b:\x8b\x0e^\x00\x09\x8f\x9d\x0fn\x0c\xfcY\xfb\x88\ +\x17\xc1\x16\xa2\xa2\x14\xe4\x10\x0d\x03\x94gA\xfc1/\ +\x83~{\x19\x07\xf7S\x85x\xe0\xc07^H\xc4\x0a\ +\xff\x1a\xf4\xbb\x05\xae\x8f}\xee{_\x0b#\x88\x8a&\ +\xba\xc30~\x80\x84\x14khC\xd8\xe1\x10s0+\ +\x81\x91\xea\xe3\x0a\x18\xb4\xe1m\xc0S\x1f\xd6J\xe6@\ +%\xba\xb0\x89\xa8\x88@\x04\xc0@\x18OH\xf1\x8dT\ +\x5c\xde\x0d\xbf\xa6A\x1d\xfe\xaa\x04\xf3\x1b\x93\x11\x1a\x80\ +>1\x0a\xcf}\x10\xe4\x06\x1a\xd3\xa8\xc6\x08h\xe1,\ +o(\xc1\x1b\xe1HE\x0c\xd21\x87\xd1k\x03$(\ +@-^\x8c\xe0\x00\xa6\xfb#\x0b\xcf\xd8\xc4B\xaa1\ +\x0d\x9aB\x0a'\xb6\xb0\xc8E\xc6q\x8e\xfb\xc3b\x11\ +\x1a&\x10j0\xc0\x88c\xa4\x9b\xfb\x96(H4z\ +\xb2\x90\xf0B\x8a\x11\xb6\xc0KR\x96\x92\x865D\xe5\ +\xe5\xc4V\x02+\xb0\x92 \x1f8F\x0ae\xb9:Z\ +\x0e\xf2\x96\x85\xec\xc1\x0f\x90\xf2\x08\x00\xf4\xd2\x97\xa5<\ +\xa5\x15S\x99\xad\xbb\x1d\xd3 \x178\x223!\xe7\xcc\ +NB3\x02=\xe8\x01+\xb0\xf0\xc3\xa2d\x01\x00\xf0\ +\xb4f/\x7f\xa9M\xca=\xb2\x0a\x03\xfc\xe6AX\x80\ +\xff\x0c\x15:p\x89\xcf<\xa7:YAPH\x14\xc5\ +\x13npC<\xe5\xc9Kz6r\x9bE{\xc4\x10\ +\xf4\xa9\x90\x03\x8cS\x00\x00\xb5%4\xd3I\xd0\x8e\xb2\ +\xa2(sHhB\x17:O\x87^p\x9b\xa1\xa0(\ +I\x1a\x90\xbaYr\x92\x90\xb7\x1c\xa8G\xbf\xf1\x0dD\ +\xac\xa4\x11\x22\x15)IKj\xca`\xc2.\x13*%\ +\x095\xb2\xe1R&\x9a3\xa62\xed(Mi\x9a\x08\ +\x95\xd4 \xa79\xdd)6\x19y\xd2*0 \xa8%\ +\xc1\x05$\xc8\xc9I\x81&\x95\x15K]\xaa\x00R2\ +\x02Z\x98\x15\xaa:\x85\xe75\xb3\x19\xcc\x02`\xd5$\ +\xb8\x90@Fa\xea\xc9\xaf\x86\x95\xa6\xc0\x00\x86*\x94\ +q\x92D\x9a\xf5\xachUh\xb6\xba\xaamo=\x06\x5c\x0f\x18(\ +$\x0b\xf3\x9do}\x01\x0bUx\x0eF\xbf)\xf1\x84\ +c\x97\xba\xde\xdf\x0a\x98\xc0\x03~bR(\xc1\xe1\x04\ +\xcbw\xc1\x99\x85j< \xbc\x92\x0b\x9c\x96\xc2\x00\xb6\ +\xeeu1\xcc\xe2\x84\xc0\xa0\x04\x1c\x8e\xb1\x87\xbb\x0b[\ +\x06\x1b\xc0{$NI\x02\xd2\x80\xe2\x14_\x98\xc5\x18\ +\x8e\xd0A\x0aP\x82\x22\xc3X\xc63\xa6o\x8d3\xdb\ +\xdc\x1c\xa7\xe4\x05\xbd\xad\xb0\x8a\xeb\x00\xe4*w\xe0 \ +^0\xb2\x96c\xdc\xe1\x19\x1b\x97\x16\x99\x88\x81\x93W\ +2\x0a\x1fS\xb9\xcah\xae\x87&\x0c\x92\x8c\x1a\xb8Y\ +\xff\xcbF\xe6r\x92_\xeb\x891\x13\xc5\xc2+N3\ +\x901\xc0gN\x18\x84\x01n\x0et\x0d\xe0\x5cd9\ +{8\x13\xb0\xb0\xf3JV\xa0\x8a\x1f\xeby\xc0|\x8e\ +4\x06\x18V\x10A[z\xd0p6\xb4|\x89\xa1h\ +\xa2\xe4\xf9\xd1\xf5\x90\xb4\xa81\xd0N\x81\x90\xe0\xd2\xa8\ +&\xb4\xa1CQ\x8bN\xafD\x14\xa0\x1e\xb5\xac\xfd4\ +\x90%\x18\xc0\x00\xa8Nu\xa69\xcc\x02W\xaf\xe4\x08\ +i\x96\xb5\xb01\xf0\x08\x82\x5c\xe0\xd6\xc8\xc6u\xae\x05\ +\x9di_\x13e\xcf\xc3\x16\xb5\x0a\xa6\xad\x02Q\x0c\xc4\ +\x03\xc9\xce\xf6\xad\x97\x1d\xe8\x22\x1f\xc1\xd9+\xf9\x03\xa4\ +\xa3\x1dij\x9b[\x05h\x18\x88'\xb4\xcdne/\ +;\x9f\xe0F\x89\x1e\xc8\xcd\xe7s\xa3\x1b\x0d\xf8\xc6w\ +\xaf\xff\xc1\x825\xac\xa1\xdd\xedF\xf5g\xe3\x8d\x92a\ +\xdb;\xdf\x08\xcf7k\x13\xe1\xef\x86\xfb\x1b\xe0\xdav\ +\xf3U\x09\x9e\x92\x03H\xfa\xe0\x09O\xf8*6>\x01\ +\x81p\xc1\xe1 o8\xc4o\xad\x06\x8a\xa7\x04\x0c\x18\ +\xff\xcf8\xbe7\xcer\x96\x8f\xf5\x1f!\x8f\xb9\xc3\xdb\ +\x0d\x02\x93\xa3D\x0b\xd3V\xf9\xca[\xce\xf3\x96\xff#\ +\x033\x90\xb9\xd0g~\xeb\x04\xd8\x1c%\x19\xef\xb9\xd2\ +[\xbe\x8b]|\xe0\x093\x88\xba\xd4\xa3>\xf4\x90\x03\ +\xf5\xe8'\x11\xc5\xd2\x97\xde\xf4\xaew=\x19b0\x81\ +\xd8\xc7>\xf5\xa9\x0f\x9d\xbcX7I\x15\xb6\xeeu\xaf\ +3\xe3\x14p\x8f;\x19F0\xf6\xba\xdb]\xece\xa7\ +\xba\xbf\x93\x91v\x93(\x83\xe5m\xdf\xc5\xdb\xe3N\xf8\ +\xc2\x9fb\x00\xf1\xb8\xbb\xe2\x17/u\x12\xf4\xbd$S\ +h\xfa\xe0\x0dOy\xc3\xbb!\x11\xa1\xc8\xbc\xe63\xbf\ +\xf8\xc5?\xf8\xf1\x0b\xa9\xbc\xe8)\xdf\x80Ml\xfe\xf4\ +\xa8\xdf\xbc\xddK\x0d\xfa\x84\x8c\xfe\xf5qG\x04\x03R\ +O\xfb\xda\xbf\xa1\xf5\xa1\x17},v\xcf\xfb\xde\xf7^\ +\x01\x99\xa8\xbd\xf0O\x8f\xfb\x85\xf8\xfe\xf8\xc8?>*\ +\xfa0\x87\xe6;\xff\xf9\xcd\x1f~~\x8b\x8f\x90\xe4\xfb\ +\xfe\x1d\xd8\xcf\xbe\xf6\xdf\xc1\x8a\x01x\xff\xfb\xe0\x0f\xbf\ +\xff\xf8\x07\xe0|\xea'd\xfb\xe8O\x7f\xfa\xc7\xcf\xfe\ +\xf6\x1b\xd6\xfc\x07Q\xbf\xfc\xd5\x9f\x09\xf7\xdb\xff\xfb\xf0\ +?\x88\x08\xf6\xcf\xff\xfe\xfb\xff\xff\xfc\xf7\x0d`\xc0\x05\ +\x04X\x80\x06x\x80\x08X\x80\xf9W\x10\xb2\x00\x80\x0e\ +\xf8\x80\x11\xa0\x0c\x098\x81\x14ht\x0b(\x10|\xf0\ +\x80\x1a\xe8\x7f\x0a0\x0c\x14\xf8\x81\x07x\x81\x04Q\x01\ +\x15\xb0\x81\x1b\xd8\x01I\x00\x82\x05\xb8\x03,\xd8\x82;\ +p\x010h\x0c\x22\xf8\x0f\xc2@\x826x\x838X\ +\x82\x0e\xf8\x07S@\x80.\xe8\x820\x18\x84B8\x84\ +.0\x83\xf1\x90\x83H\x98\x846\xf8\x0f\xc90\x84N\ +\xf8\x84NHI\x22\x08\x06JX\x858\x18\x0a\xc2\x00\ +\x85Zx\x01\x99\xd0\x85^8b\x22\xe8\x0eV8\x86\ +\x15\xe0\x04 \xb0\x85\x5c\xe8\x85j\xb8\x86\xdf&\x82\xc5\ +@\x86V\xc8\x02\x82 \x84kX\x87v\xe8\x85\xd4 \ +\x82\x84\xb0\x87p\x98\x84\xff@\x0dw\x18\x88^\xd8\x07\ +}P\x00\x86hL\x17H\x0a{\xb8\x88\x8b\xd8\x87\x15\ +\xff \x10\xca \x88jH\x88\x86X\x89\x95(\x85\xf9\ +w\x01\xa4\xb0\x89\x9c\xc8\x88\x8cX\x85\xdf \x10z\x10\ +\x88\x94h\x89\xa6X\x89\xde\x94\x7fD\xc0\x89\xac\xd8\x89\ +\x9e\xd8\x887\xd8\x00\x02A\x01\x93X\x88\xa7x\x8b`\ +\x90\x8b\xb9\xb8\x80\x82\xd0\x8a\xbe\xd8\x8a\xaf\xb8\x88W\x07\ +\x02\xb6x\x8b\xa7\xa8\x8b\xc8\x98\x8b\x80\x90\x7fI\xf0\x0b\ +\xbf\xf0\x8b\xd0\xe8\x8a\x8bH\x10\xc6h\x89\xc9x\x8d`\ +@\x05\xadC}\xa3`\x0a\xa6\xe0\x8c\xcf\x18\x8d\xe2H\ +\x10G\x80\x8b\xd8\x98\x8cT\xc0\x00\xea8q\xd47\x04\ +\xde\xf8\x8e\xdf\xe8\x8c\xe2\xe8\x8b\x11@\x10#P\x89\xe7\ +x\x8d\xeb\xb8\x8f\x0c\xb0E\xc5\x07\x06\xf0\x18\x90\xf18\ +\x8f\x9b\xb8\x05\xc8\x94\x8f\xc9\xc8\x8f\xfc\xa8\x0cN@}\ +\xb9\xe0\x0d\xa9 \x90\x02\x09\x8e\xd1\x08\x86\x02\xc1\x03\x08\ +\x09\x06\x0a\xb9\x8f\xca\xd0\x91\x1dYs\xb87\x05\xa90\ +\x92#)\x91\x01I\x91\xadh\x06\x05\x91\x08\xd8\xb8\x91\ +\x1c\xe9\x91\x1e\x89v\xa0\xf7\x05D@\x926i\x92'\ +\xff)\x8f\xa4@\x04\x06!\x06\xba\x98\x8e.\xa9\x8e0\ +\x09\x93\x0fP\x94\x88\xf8x,p\x037`\x93L\x89\ +\x93\xf0\xe8\x8cT`\x10\x0b\x00\x94A9\x94DY\x94\ +E)\x93i\xc7\x0bi\xa0\x94J\xc9\x947\xe9\x94\xde\ +\xf8\x04\x07!\x03Ui\x95\x1d\x89\x95j\xc9\x09d\xd9\ +w?\xe0\x95p\x09\x96a)\x91\x8c\x80\x10\xc2\xa0\x90\ +h\xe9\x91j\x89\x95\x9c\xc0\x09G@\x06\xb6\x90v\xb3\ +0\x98p\x19\x97rY\x92\x02\xc9W\x08\xf1\x92h\xb9\ +\x97|\xe9\x97G\x10\x99\x87\x84u\xb0\x00\x0b\xbe@\x98\ +\x85\xf9\x95\x87\x89\x98\xde\xc8=\x08\x91\x02y\x99\x96\x8e\ +\xf9\x00}\x19\x99\xa6\xb9\x09\x9b\x10\x1a6\xe7\x0b_P\ +\x99\x97\x89\x99\x99\xb9\x94\x9bi\x0a\x1a\xa0\x10!\x90\x97\ +\xa3I\x9a\x90y\x9a\xa8I\x00I\xe0\x0a&7\x0b_\ +0\x9c\x95i\x99\x839\x0b\xb1\xa9\x99rYr\x0a\xe1\ +\x04C\x99\x9b\xa5i\x9aG\x80\x9a\xbdI\x00\xc3\x80\x89\ +\xf1\xf6\x05\xbc\x10\x03\xc3\xd9\x9a\x96\xf9\x9a\xc9\xa9\x9c$\ +\xff\xc9\x0a\x81\xa9\x10\xfd\xa0\x97\xd0\xb9\x9b\x91I\x9d\x04\ +\xd0\x9e\xc3\xf0\x9ek\x96\x9d\xbc0\x9f\xbc\xd0\x9d\xc5\xf9\ +\x9a\xc8\x19\x9e69\x0c$\x81\x0bG\x90\x9b\xba)\x9d\ +\xd3Y\x9d\xd6\xf9\x9e\xefI\x06\xa1\xe4j\xb0P\x0b\xb5\ +@\x9f\xdbi\x9f\xaey\x9c\xe1\xb9\x94\x220p\x0a\xc1\ +\x04\xa3\x19\x9d\xbcI\xa0\x06\xfa\x9eN\xe0\x04I\x90\x87\ +\xae\xe6\x0b\xaf\xf0\x0a\x0c\xea\xa0\xf5I\x9c\xae\x89\x9f\xe1\ +\xf9~Bu\x06k\xa9\x9e\xeb\xc9\xa1\x1d:\x0c\x1f\x9a\ +\x05P`\x91vF\xa2\xaeP\xa2&\x8a\xa2\xdc\xa9\xa2\ +\xdf\x09\x9bpY\x01!T\x12bP\x94\x1a\xba\xa1\x9b\ +\xd0\x9e\x05j\xa0\x1f\xea\x048:\x0f20\x02\xaf`\ +g\xb3\xe0\x0a\xb9\xe0\x0a=Z\xa2'J\x9fA\xea\x9d\ +\x11J\xa47\xc0\x05)1\x0c2:\xa04\xda\xa1Q\ +:\xa52 \x03\x89\xc0\x02W\x9ac\xbe\xe0\x0a\xcd\xd0\ +\x0c[\xda\xa5&\xda\xa0\x0e\xda\x9db\xea\x0b,z\x03\ +\x22\x10C(A\x0c\x02\xaa\xa6M\xea\x9e5\x1a\xa5P\ +\xff\x00\x05T\x0a\xa7\x89P\x04,\xd0\x1b\x10\xe6\x0b\xcd\ + \x0d\xb6p\xa7y\x1a\x08^\xca\xa7`\xea\xa7\xf7\x89\ +\x9f\xf4\xa1\x12\x97\xc0\xa4NZ\xa36z\xa3\x8d\xfa\xa8\ +\x89\x10\xa9I\x90\x04# \x0b\xfa\x05\x0bM\x80\x0b\xb8\ +\x80\xa9\x99\x9a\xa7z\xfa\xa5\xf4\x09\xaa\xf79\x98Da\ +\x05\x88\x9a\xa8O\x0a\xa5\xaa\x0a\x05o\xda\xaa\xae\x9a\x04\ +\x16`\x01S`\xa1o\xc5\x0b\xb8\xd0\x0b\xb6\x8a\x0b\xb6\ +p\xadx\xca\xa5\xbb\xea\xa9\xf3\x19\xa6\x7f:\x0bE1\ +\x02\xec\xa9\xa8\x8bz\xac\xc9\xda\xaaE\xf0\xaa\xcd\xaa\x07\ +z\x10\x0f2xX\xaf@\x0d\x8e \x0b\xd4j\xab\xd7\ +\x9a\xab\xda\xea\xa3\xbc\xda\xab\x10\x9ahE\x91\x00N@\ +\xac\xa8\x1a\xa5R\xda\xa8\xe7z\x09\xe9\xca\xac\x16\xc0\xae\ +?\xf0\x03\xf1\xc0iX\x85\x0b\xd40\xb1\xb2@\xaf\xd5\ +z\xaf\xd9\xca\xa5\xfa\xba\xaf\x0f\xda\x9d\xe0j\x14\x9e@\ +\xaelz\xa3n\x0a\xa9\x08\x9b\xae\xeb\xaa\x07K\xe0\xb0\ +\xf1\x90\x02\xc9\x90\xa0\xacT\x0b\x090\xb3\x13K\x0d\x15\ +\xff[\xaf\xd6\x8a\xad\xba\xea\xa3{\x8a\xa2)\xea\x0be\ +\xf1\x02\xa8\x9a\xaa\x05\xeb\xa8\x07[\x04(\xbb\xb0*\xcb\ +\xb2)\x90\x02S\xf0\x02.\x00\x9c\x0d\x03\x0b\xb2\xf0\x06\ +o\xc0\x034K\xb1\x16k\xaf:\xab\xad\x9c\xda\xa9>\ ++feA\x0d\x83P\xaeE\xcb\xaa\x89p\xb2\xea\xaa\ +\xb4L\xeb\xb4O\xfb\x02,\xe0\x99\x9b2\x0b\xb6\x10\x00\ +vk\xb5X\x9b\x005{\xb3\x17\xdb\xb5\xf9\x0a\xb6\x0e\ +\xfa\xb1ea\x0c\xc6z\xach\xab\xb6\x0a\xcb\xb0\xf1\x10\ +\x0f~\xe0\xb6/\xf0\x02#\x10\xb9Z\xa0\x03\x7f\xd2\x0c\ +\x01\xe0\x01\x1ep\xb7V\x9b\xb5\xf2\xca\xb7\x5c\x9b\xab;\ +\xdb\xa9|\xea\xafg!\x06D[\xb4oj\xb2H\xbb\ +\xb6\x0c\xcb\xb4S\xf0\xb6\x90;\x02j\xa0\x06, \x06\ +\x82 !\xd2\xe0\x014@\x0e\x98\x9b\xb9\x01\x80\xb7\x9c\ +[\xb1[\x9b\xb3\xa0\xfb\xb7{Z\x0b_`\x18/@\ +\xb2\x06{\xb4\x09\x9b\xb2+\xbb\xb8M\xfb\xba\x8f\x1b\xb9\ +\xb3\xcb\x02,\x90\x0c0\xc0\x04V \xab\xa3!\xb3|\ +\xff\xb0\x00|\xc0\x07\xe4\xc0\xbb\xbe\xfb\xbbW\x1b\xbc\xc3\ +K\xbcx\x1a\xba%\xca\x0b\xa2!\x0bI\x80\xa3F\xeb\ +\xbc\xac\xbb\xb4\xd2\xeb\xb8\xb1+\xbb\xd8\x9b\x0c\xda\xdb\x08\ +\x8d@\x01\x80 \x08\xd2\x80\x16\xf1*\x0f:\x80\x03\x0b\ + \xbe|\xb0\xbb\xe6\xab\xb9o0\xb3z\xab\xb58\xcb\ +\xbe\xb9\xa0\xab_\x0b\xb4\xa2A\x0e\x89P\xbf\xaa\xfb\xbc\ +J\x1b\xbd\x8c\xab\xbf\xb1{\xbd\xd9\x0b\x030\x10\xc0\x14\ +\xa0\x05L \x06\xfd`\x05|\xd0\x0cDQ\x0b\xd4@\ +\x0e: \x08\x82\xe0\x05\x09\xac\xc0\x0c\x5c\xbe\x98k\xb7\ +\xe8\x1b\xc1\x13L\xc1\xd5\xca\xbe\x19\xeb\x0a\x81@\xba\xa2\ +\x81\x0e\x8f\xfa\xc1\xf7\xbb\xb2mK\xbd\xfbK\xbb\xd9\xfb\ +\xbf\x01\xac\x05Z`\x04b \x06' \x0c@\x00\x08\ +!\x80\x0e|\xf0\x06\xbd\x00\x9c\xc9;\x10\xaf`\x0b\x8e\ +\xf0\x06\xe4\x80\x03C\x80\x02C0\x04\xe8\x90\x018\xbc\ +\xc3\x0b<\xbe\x0e\xfc\xc3\x9a\x9b\xb75;\xaf\xeb\x8b\xb1\ +\x19{\xc6\xbf\xa1\x09\xf6\x9b\xb8\xad\x9b\xbfR\x1c\xb9\xb2\ +\xffK\xc5\xda\x9b\xc2\x14\xb0\xc2L\xa0\xc5\xc1\xd0\xc5@\ +\xe0\x03\xfd@\x02$\x00\x08.\xe0\x09\x9e\xf0tO\x00\ +\x02\x9a\xa0\x09!`\x05V\xb0\x01\xc6`\x0c(\x00\xc7\ +s\x8c\xc3:\x8c\x03<<\xbe>\xac\xc7V+\xc4C\ +\xec\xc7\x15\x0c\xc8\xb9\x00\xbf\xf5\xf1\x01\xad\x8a\xb8\xcd\xca\ +\xb6Q\x0c\xbb\x8a\xcc\xc8V\xbc\xc2,,\xc9]l\xc9\ +\x97\x0c\x08\x9a\xcc\xc9\x9e\x0c\xca\xa2L\xca\x1b`\xca\xa9\ +,\xc7t\x9c\xc3v\xcc\xc0y|\xbe\xb3,\xc1{\xeb\ +\xb9\x9f\xdb\x0c\xbal\x1f\x80\xe0\xcb\xd0\xcb\xb2\x8d\xfb\xba\ +o;\xcc\x8c\x8c\xc2\x00l\xccZ\xcc\xc5\xc2 \x0c\xca\ +\x9c\xc9\xcd\xdc\xc9O\xf0\xc9\xa1<\xca\xa5L\xcdpl\ +\xcdu\xec\xca\x0b\xdc\xc3\xe6\xeb\xbb\xb3\xcc\xc7\xdf\xfc\xc7\ +\xb6\xd0jG\xe2\x02 \x1c\xc2,\xdb\xb2$l\xbd\xc4\ +\x9c\xc2*|\xcc[\xdc\xc5\xf4\xdc\x0f\xcb|\xcf\xcf\xbc\ +\xcf\xa3<\xcd\xa8\xfc\xcf\xab\x8c\xcd\x02\xad\xcd\xb1\x0c\xc4\ +\x07\xcd\xb96\x0b\xce\xb8\xc0\xd0c\xf2\x04\x0a\x0b\xd1\xc1\ +\xff\xfc\xb8S\xdc\xce\x16m\xcc\x91,\x06\x93\xec\xc5\x96\ +L\x0c\xf6\xbc\xc9\xf8\xac\xcf\xa2\x1c\xd2\xa6\x8c\xcaq\x5c\ +\xd2\xad\xfc\xca\xb0\x5c\xd0*\xbd\xb9,}\xb3\xf5\x0a\xd3\ +\x7fb\x05\xe7\x1c\xcc\xebL\xd1\xfd[\xcc\xf0\xbc\xc5=\ +]\xc9\xfd\x00\xd4\x80\xa0\x04B\xfd\xd1E\xdd\xcf\xa7\x5c\ +\xcdCp\xcd:\x9c\xcdx\x9c\xd2\x10\x9c\xb7\xb5\xcc\xb7\ +T\xbd)\x82\x10\x0f\x87<\xc2\x13\xad\xd5'\x9c\xd3\x90\ +\x1c\xcf\x1a\xed\x03\x96\x8c\xc9c\xbd\xc9\x87`\xd6!\xc0\ +\xcfG\xad\xd6J\xed\xd6M\xdd\xbbO\x9d\xbeC\xdc\xd2\ +\xb20\xce\xf1\xe2\x01S\xd0\xb0\x8b+\xd1R|\xd3[\ +\xed\xceW\x8c\xd1=\xbd\xd1\x97\x9c\xc9d\xed\x09\x87\x9d\ +\xcf\xd0\x9c\xd8\xd2\x9c\xd6$\xcd\xd6\xd9\x8c\xd2N\x0d\xc1\ +\xde\x5c\xb3\xb8 \xb6\xc7\x84\x0b\x8d\xb0\xd9\xd3\x9b\xc8\xec\ +\xdc\xbf\xa0\xfd\xc8X\x1c\xcf_]\xcf\x99\xec\x02\x86\x8d\ +\xd8\x8a\xed\xcfI\x0d\xdb\x8eM\xbe\xb3\x1d\xc4r=\xb1\ +\xb8\xa0\xc4\xdf\x04\x08\x9c\xdd\xd9\xbf]\xc5\xc1\x8d\xc5;\ +\xff\xcd\xd3\x94\x5c\xcf\xcc\x8c\xdc\xa8\xfd\xcc\xa0\xcc\xdah\ +=\xd2q\x9c\x01\xb0}\xd2\xb2\x0d\xd9q-\xc1M \ +\xb8*\x95\x01/\xb0\xd7\x8b\x8c\xd3\xef\xac\xd3\x80=\xcf\ +`-\xd6\x9a\x9c\xdc\xaa}\xde\xcb\xed\xda\xcd\xcd\xca;\ +\xcc\xd4\xd0\x0d\xdf\xb4\x9d\x00szX\xb2`\x04\xda\xcd\ +\xd7\xfe\x1b\xdc]\x0d\xde\xf3,\xd8a\x1d\xd4\x02\xfe\xc9\ +\x04.\xcd\x8b\xfd\xda\x08\xfe\xdc\xdb\xcc\xcdV\xeb\x08\x82\ +l[V0\x02\xd5K\xd1\xfa}\xd1\x18\x8d\xe1\xa4\x0d\ +\xe0B\x9d\xda\x1e\xbe\xcf n\xe0\x00\x8d\xe0\xae\xac\xe0\ +\xb1\xac\xc7\xbf+\xc3$&\x0b\xc2\xa0\xc8\x8b\xfc\xd9~\ +\xed\xdd\x80\x1d\xde\x1cM\xd8\x1em\xde8\x9e\xdej\xbd\ +\xe3K\xad\xe0%n\xb7\xd4\x90\xe2$&\x0e\x8dp\xe4\ +H\xbe\xdf\xc3\xed\xd5\x1a\x0d\xd6\xa5]\xd8\xce\x0c\xe5g\ +-\xe5\x22\x8e\xcd\xb1=\xbe\xd0\xfd\xc0R\xabh\xbc`\ +\x05\xc9P\xd1I\x1e\xe3\xa3\xad\xe1e~\xda\x9d\x8c\xe6\ +\xe8-\xd2\xea\xbd\xe3&}\xd2n\x9e\xc7\xb8\x10o\xb6\ +\xff\x00\x02\xc9\xc0\xddw\xfe\xddy\xfe\xd3\xf6\xcc\xe7\x1f\ +\xe0\xe7\x05\x1e\xe8s\xec\xdc\xee\xed\xe6\xe4\x90\xe5&\x87\ +\x0b \x80\xc2w\x9e\xc5[\xcc\xc5L\xbe\xe1\xe3]\xd6\ +\x94\x9e\xe3\x81N\xe5:\x90\xe0w\xcc\x07\x09`\xd9&\ +\xe7\x0a\xc6\xa0\x05`\x8e\xe7c\xae\xcc4\x8e\xea\x03\x0e\ +\xd2\xaa\x9e\xcak>\xe8\x0a\xcc\x07\x9c\xdezf@\x02\ +\xc2\x8d\xeb\xfem\xdc\xa7~\xe6\xbd\x9e\xe6\x80n\xe9\xec\ +=\xe28\xe0\x01\x05\x0c\x7f\xb2`\x0c\x9f\x90\xc5\xc4\x1d\ +\xd8\xcc\x1e\xe0\xce~\xe3\xd0\x0e\xe8\x8c=\xed9l\x08\ +\x09P\xd7\xf9\x97\x00\xc6@\x0c\xe0\x1d\xde\xdfN\xde}\ +\xfe\xec\x7fN\xee\xffl\xcd\x86\xf0\x06q>\x83\x04a\ +\x0b8\xa0\x09\xc4\xe0\xd3\x1c\x0d\xd4\x1c\x1e\xee \xb0\xda\ +\xfc\xac\xe6C \x08\xc4\xae\xee\xfc~\x10\xd2@\x03(\ +\xa0\x09\x80\x00\xe0d\xcd\xeb\xe2\x8e\xde\xfd\x8c\x02:\xe0\ +\x01\xd4\xf0\xe0\x0f\xaf\x12\xae@\x0d\x1e`\x06w`\x0c\ +V\xa0\x09\x9f\x9c\xcfO\x10\xcd\xc6\x80\x0e\xe2P\xed\x09\ +\x05\xf0\xd2\xe5\x15\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\ +\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\ +\xb0\xa0\xc1\x83\x08\x13*D\x18`\x03\x90\x112\x94\x0d\ +x\xe4nB\x1b9r\x1a\xb4\x99\xe0\xc6\x04\x182/\ +NXYH\xb2\xa4\xc9\x93(S\xaa4\xc8\x07\x88\x9e\ +\x0b\xfe4h\xc8\xa1K\xd7\xad\x9b\xadrb\x04\xd5\xa2\ +g\x8b\x15@\x81\x8ej`\xe2\x92\x98\x95H\x93*]\ +\x8a\x90\x9c\x91#\x90\x1a\xfc\xf9#S&M\x9b8u\ +\xca\xe1\xe93\xa8\xd0Q`\x0f\x1chP\xa0\x11\xd3\xb3\ +h\xd3\x12\x1c\x92\xa2F\x83\xb7o\xa7R\xb5Z\xf3\xe6\ +\xad\x9c\xadvv\xf5\x0a\xb6\xaf\xd8\xbf\x07\xaa$1\xa6\ +\xb6\xb0\xe1\x92/(\xb5\x81\xcbXn\xd5\xabv\xf1\xea\ +\xed\xe9uE\xdf\xb0\x80\x11iF\xe4\xce\x82\x8e\xc3\xa0\ +\x0f\xf7\xcb\xd4\xa6\xf4b\xc6q\xa7>\xae\x9b5\xef\xd6\ +\xbdA/\x8f\x02|`\xb3\xe6\x0e\x1dj\x1c\x0d\xcd;\ +)55\x00&X4}\x1a\xb5\xea\xd5X%\xbf\xa6\ +\xcc\xf72m\xdb\x88pw(u\xebG\xef\xeb'\x97\ +H\x10.\x9cx\xf1\xc6s\xe9&\xff\xd7\xca\xf5gs\ +\xcc\x7f\xa1G\x9f^\xaa\x94\xa2\x03\xd1<`\x9f_0\ +A\xbc*\xee*r\x1f^\x1au\xea\xaa3\xb1v\x0c\ +y\xb0}\x85\x9eX\xd0I\xd7\x9e{\x8a(\x82\x08\x14\ +\x01\xd0\x87\x9d+,@\x90_~\xfb\xf1\xd7\x9fq\xc7\ +\x05\x88\xd5\x80\xae\x95W\x99s\x99\xd9\xa6 \x83\x0d6\ +x\xc0\x0f\xcdH\x18\x9a\x0b5H\xb0\xcc\x85\x18r\xe7\ +\x9d\x7fR\x85\x07\xd9- Nf\x9e\x81\x07\xd6f\x22\ +{(6\x88\xc0\x91\x1a\x04\xe3ba\x1e< \xc1\x93\ +\x12\xd0\xa8\x9f\x8d\xa6\xe1\xd8\xe1\x8e=.\xf7\xa3e$\ +\x228${)\xa6x\xe4\x98\x06,\x89\x96\x16[@\ +\xf9\xe4\x8c4\xeew#\x87\xc8E\x16b\x81]z\xb9\ +\x19n\x0b\x86\xa9\xc8\x98c\x12\x81\xc8\x0bf&\x15\x80\ +2U\x14\xaaf\x94m\xbaY%\x9cU\xb1v\xd7\x9c\ +\xcc\x01\xf9\xdc\x9dx\xb6\xa7'\x9fG\x12\xa1\xe9#\x81\ +\xaa\xe4\x02-\x85\x86zh\xa2Tn\xc8h\x80r\xfa\ +x\xdel\xe9}ii\x98\x98\x22\xff\xa0\xe9\xac\xa3\xec\ +\xd6)I\xf1@\x00A\xa8\x86\xaa)\xa5\xa2\x8b\x82\xb7\ +\x9a\x9cy\x89\x18\x9b_\xadR\x9a'\xac\x98\xce:+\ +\x07G\xd4r\xabB\x0c\xe8\xaa+\xafU\x8cza\x86\ +\xc4\xf9w%k\x92\x19+i\xb2\xeb\x81\xc9,\x9f\xce\ +j\xca\xc1\xba[\xc87mA\x82\x18`\xed\xb5\xd8\xfa\ +J\xaa\x86\xde\xea\x08\xaeN\xe2\xd6)\xe4mD^\x8a\ +n\xbaD\xac\x9bF\x1a-l\xf0\xee@ 8\x00\x09\ +$\xf3\xee\xca\xab\xb65\x96\xfa]\x8eq>Zl\xa4\ +\x5c\x1e\x98\xa0\xb9b6\x9b\xae\xc1\x07\xa7Q\x8a\x0f\x0b\ +\x9f\xb0\xc5\xc3\x10G\x5c/\x94\xbfZ\x9c\xafx\xad-\ +\xb7j\x89\x00\x83l\xe4\xc0\xce\xae\xcbA\xc9i \x93\ +\xc6\xbb\x14\xb0\xcc\xb2\xcb\x13\xdb[1\xbe\xa7\xee\xbb\xf1\ +\x96u\x0e\xb9\xec\xce}\x8eL\xf2\xc1\xc8d\x8dL<\ +\x9d\xb2\xb0\xc5\xcaF\xb7l\xed\xcbk\xde\xdb\xad\xb02\ +9m\xf3\xb1\x1e+[\xe4\x9e/\xd9\x88v\xee9\xc6\x84\x87\xcb1\xb2v&\ +^\xa4\xc8\x8d\x03\xad:2\xac+\xa0\xc0\x08\xd8\x85@\ +K\xec\xb2[^{\xdf\xb7'\xfd$\xa9g\x7f\x0eA\ +\x01?h\xf1\xc1\x104\xe0\x92\xcb@\xb8\xfc\x83\x82'\ +\x8d$\xc1E\x1b\xac\xfe+\xbc\xe9\xb2Zm\xbc\xea\xc9\ ++\xcf\x08\x09\xbdyQ\x02\xf4\xb1\xcf~9\xf5c\xfb\ +\xdb\xf5\x02\xd7\x9d\x0d\xb9A\x06\xc2p\x97J\xc8!\x86\ +#L@j\xc3\x8b[\xc1\x1c\x174\xfa1By\x18\ +\x94\x84\xc2@\x93\x00\x13<\x8f\x7f\xd1\xa3\x1d\xdf\x1e\xe6\ +\xb7lqnJ\xa5\x99\x83Y\xd4\x82\x83\x11\xd0\x22:\ +\xaf\x0aY\xa6\x8aG7\x0bbPyX\xc0\xc2\x01B\ +\xc3\x09Z\xf8\x10\x84!\xfc\xdf\xd1\xff\x02(\xc0D\x01\ +`\x0a\x0b\xe0\x8d\x0e\x8ap\x8b\x08\x9en\x825\x84\x5c\ +\xfd0\x98\xc3\x1cV\xe10Sp\x80\x03|\xf8A\xfe\ +\xf9ozC\xd4\x9c\x09\x07\xe8\x8e5\x9c\xe0\x15\xf4i\ +\x84;d\x18?\xb9E\xb1nS\xc4a\x15s\xa8\x8c\ +\xc2|\xe0\x11Z\xdc\x22\x17A\xf8\xc5\x11\x96\x10J\xcb\ +X\x03 \x02%\x86\x09H\xf0j\x15\x84\xe3\x05o8\ +\xc792A-kx\x04\x1e\xb5\xc8\xc5.\xf6Oz\ +~$\xa2\x09\xdd\xf0\xc8i\xa9a\x053D\xdd\xfc\x14\ +yC\x054r\x8e\x08@\x0b,\xa2!II\xe6Q\ +\x8f\x96\xbc\xa4\x103\xc7+\x0b,l \x0f\x90\xdf\xe3\ +H\xc9\xc8Sb\xc1\x12\xc0\x84\xc0YN\xd0\xcab\xe6\ +q\x8f|\xa4]\xd8n\xb7\x86[\x1a\xe4\x0f\xa2\xdc\xe5\ +\xea\x16IE_\x02S\x00\xd8\xf4\xc3R\x02\x10\xc9b\ +\xb6\xf2\x98?L&\x18I\xa8\xab$8\xf3 \x05H\ +\x9d\x14\xa9iJ_\xfe\xd2\x12\xd8\xc4&2\x96\x22\x03\ +J\xd8\xd3\x9b\xae\xa4d8\xbd\xa8\xffL\xa3\x01@\x18\ +\xe7DH2\x10 \xcd\xac\xc5\xd1\x9d\xc0\x84g<\xb1\ +\xe9\x86\xa4|\xa0\x04%\xb0\xe7=\xf1\x09\xceXJ\x8f\ +e\x06@G@\x13b\x85\x16\xd8\xb0\x9a\xa7\xbc\xe6B\ +\xb1Y\x0cnP\x00)\x17\x80(D%\x8a\xcfI\xc2\ +R\x9c+\xdb\xc1F\x17\xc2\x876\xf0R\x8e\x8dL\xe8\ +H\x05PRnpc\x14+\xd1B\x0dj\xa0\xd2\x88\ +\xb2\xd4\x9b\x15\x15'\x03z1S\x92@\xc0\xa0\xec\xb4\ +\xa6BG\xdaS\x9fr\xa3\x08)\xa1\xc6\x1a\x86:\xd4\ +\xa2\x1e\x15\xa9/\xf5\xe2\x11\x9aj\x127\x1c4\xa4S\ +\x8dgU\xad\x8a\x0a\x05\xa4D\x0d\x5c\xe5jQ\x8dJ\ +\x09\x8a\xea\x93\x7fu$\xabI\xaa\xd0\xcb9\xeat\xa4\ +V\x0d,*\x06\xfb\x00\x94l5\xaerU\xe9W\xbf\ +\xa9\xcf\xe7e\x82\xa9z5I\x03\xda\x99\xd3\xb4\x924\ +\xb0>\x1d\xacf\xb1p\x125\x18\xc0\x00\x88\x8d\xabW\ +'jL=\x9a \xb2(!\xc7\x01\xd0JU\xccr\ +C\xb3\x83\x8d\x80l\x19`\x92P\xff|\xf6\xb3\xa1\xed\ +\xaabI\xcbXJd\x00\xb5(\x09A\x1a\xaa(\xd2\ +\x85\xae\xf5\xb5\xb0\x95\xadr9K\x12-\xdc\xf6\xb9\xb9\ +%\xean\xebjL\x94\x01\x17%j\xc8aq/\x8b\ +Y\xd8\xa2B\xb9\xe0\xc5\xeaB.\xf0\xdc\xf2Fw\xb4\ +\xc5\xd4\xc3uU\xc2\x85\xed\x0a\xc0\xb5\xde\x05\xaf|\x15\ +\xd1\xa2\x84|`\x0d\xf8-/ts;\xddG\x5c\xc0\ +\x16\xebU\xc9\x0a\x8c\xdb\xdd\xe4\xcaW\xbe=X!B\ +\x12\x81\xdf\x06\xeb\xf7\xb6\xfc\xdd-a\x02\xac\x92x\x16\ +X\xb3\x07Fp\x0fX!\x81\x84\x90\xa3\xc1 ^\xc3\ +\x83q\x1bZ\x95N\x81\xc2+)\xc0Z\xe3\x9ba\xd9\ +\xf6\xe0\xc5\xac\x881+4z\x10\x0a\x84\xf8\xc6#\xce\ +m(P\x8c\x14\x04\xb0\x15\xc3-\x8e\x00\x8ce,\xe3\ +, D\x193\x98\xc1\x8dC\x9c\xe3\xb8Z\x97\xc7*\ +Anl\x83u\x9bU\xbd\xea^\x03j )\x80\xb5\xb0c-\ +\xebN7\x18\x06\xb7^\x09\x01\xfe\xac\xebT\x03\xa3\xd7\ +\xd0^u\x0d\x08\x02\x86a[[\xd6\x88\xc6/9\x92\ +\xad\x12tH\xfa\xd4\xce\x8e\xb6\xb8UA\x84\x81\x04`\ +\x0es\xb0\xb6\xba\x8b\xed\x04n\xaf\xa4\x01\xe0~\xf6\xb8\ +\xc7]\x87:xA O\x18\xc0\x00\xd0\xcdou\x0b\ +\xfb\xd0@p\xb7J~\xb0ky\xcf\x1b\xda\xf5Nx\ +\x1d\x92!\x10\x18\xe8\xfb\xe1\xfb\xe6w\xba\xfd\xfd\xea\xd3\ +\x0a<%^\xe0\xf5\xc1W\xad\xf0:\xd4\xe3\xe3\x1f\xa7\ +\xed?\x92\x00\xf1\x92\xeb[\xe2\xfe\xff\x1e\xeb\xc5S\xb2\ +\x82\x8dw\x1c\xe40\xffx\x87\xff\x01\x06.\x98\xfc\xe6\ +\x11G\xb7\xb0\x19\xber\x94(#\xda/\x8f\xb9\xd0?\ +\xeeVjp\xe1\xe8H\xb79\xceK\xdeoM\xf4\x1c\ +%LPE\xd0\x87N\xf5\x8f\xd3@\x10I\xcfz\xd2\ +\x97\xfe\xf0\xa7\xa3\x84\x06\x1e\xaf\xba\xd8a\xfe\x0f\x10h\ +\xfd\xecZ/\xb9\xc8\xbdn\x12\x0e\x8c\xfd\xed\xf5\x80\x81\ +0\xd0N\xf7\xb3\xab\x97\xed&\x81\x04\xdc\xa9\x8e\x81\xbe\ +\xcb \x19\x17\xb8\xc0\x0e\x06O\xf8\xbak\xfd\xa4x/\ +\xc9\x03\xe0\xde\xf7\xc6;\xbe\xef\x5c\x98B\xe0'O\xf9\ +\xc0\x13~\xf0hwA\xe2M\x12\xf3\xc7{\xfe\xf3\x18\ +p\x80\x05*O\xfa\xd2[\x9e\xf0\x13\xde\xbcB|\x00\ +\xfa\xd6\x7f\xbe\x0d\x850\xbd\xecK\x9fD\xd5+\xc4\x0a\ +\xae\xcf}\xe3Gq\x84L\xf8\xfe\xf7\xbf\x9f}\xe5m\ +\xbf\x10\x1c\xe8\x1e\xf4*H\xbe\x0a\xd2\xa0\x0c\xe0;\xff\ +\xf9\xd0\xf7}}\x89\x8f\x90\xc6+\xff\xfa\xd8\xcf\xbe\xf2\ ++\xd1\xfc\xe8{\xff\xf9\xd4O\x88\xff-\xb4\x9f}4\ +\x98\xff\xfc\xe8GC\x04\xbe\xcf~\xe0\x87?!\xe9\x8f\ +\xbf\xfc\xe5\xdf\x87\xfa\xdb\xff\xfe\xf8\xcf\xff\xfd\xdf\x8f\x90\ +\xf9\xfb\x7f\xfe\xcaP\x00\x028\x80\x04X\x80\x068\x80\ +\x81\xc0\x7f\x05a\x0b\xab\xd0\x80\x0e\xf8\x80\x10\x18\x81\x0e\ +\x18\x01\x0fp\x80\x16x\x81\xe3\xa3\x80\x04!\x81\x1c\xd8\ +\x81\x02\xb0\x07\x17\x18\x82`0\x82#\xa8\x81\x05\xb1\x0b\ +(\x98\x82(\xd8\x81\x12(\x0a2@\x820\x18\x832\ +(\x83|`\x82\x03q\x0a8\x98\x838\xa8\x82<\xd8\ +\x83\xbbp\x00K0\x83B8\x84(`\x83\xff\x00\x04\ +:\x98\x84J\xb8\x84\xa7\xb0\x0b\x0d0\x02C\x18\x85`\ +@\x05T\xc0\x00\x0c\x90g6\x98\x02L\xb8\x85K\xe8\ +\x06\x8d \x85Th\x85b8\x86Vh+\x1a\xc8\x00\ +\xb1\xc0\x85j\x88\x83\x03\xe0\x03#\x18\x86d\x18\x87r\ +\xc8\x00'f\x83U\x10\x0bx\x98\x87y\xb8\x869H\ +\x06!0\x87\x808\x86\xca0\x88\xedf\x83X\xf0\x0e\ +\x88\xa8\x87\x8a\xa8\x87L\xf8\x0f:\xff\x10\x88d8\x88\ +\x928\x89\x8c\xa6\x81\x88x\x89\x98\xb8\x88\x9a\x88\x87\xa7\ +\x90g\x80H\x89\xa0H\x89\x1b\xa4\x80\x14 \x02\xa6h\ +\x8a\x98\x98\x8a\xef\xb0\x89x(\x10\x04`\x85\xa1\x18\x8b\ +\x93\xf8\x00\xb4h\x86\xef\xd7\x07\xa7\x98\x8b\xa7\xa8\x8a\xa9\ +\x98\x87\xa8 \x10) \x8b\xb1H\x8b\xc4H\x8b\xe6\xa4\ +\x81\x8a\xa0\x8b\xca\x98\x8b\xbc\x88\x88m \x10F \x8c\ +\x83X\x8c\xd4X\x8co\xa0\x81\x15\xb0\x8c\xda\xc8\x8c\x98\ +X\x00\x02\xa1\x09\xc3X\x8d\xe2\xc8\x09\x9cp\x04\x9e\x80\ +\x8d\x15\x90\x8e\xd9\xb8\x8d\xec\xa8\x06\x02\xf1\x06\xb3(\x8e\ +\xd5H\x8e\xe5x\x04\xf6\xc85\xfc\xd7\x02\xea\xb8\x8f\xeb\ +\xc8\x8e\xbaH\x10d \x8f\xf3H\x8e\xf6X\x90\xf6\xb8\ +\x09\x11\xf2~\xfc\xb8\x90\xe9\xe8\x8f\x22 \x00\x04\xc1\x02\ +\x02\xf9\x00\xf4X\x8f\x06y\x04\x9b\x90\x91\x9b\x10p\xe1\ +\xc7\x00\x0c\xf9\x91\xfd\xa8\x8c\x0d5\x10O0\x8e\x04y\ +\x91\x05\xa9\x91\x19I\x00\xe7\xf0~\x11\x00\x920\x19\x92\ +\x22\x90\x02\x04\x91\x00\xc5H\x8f(\xff\x99\x92*I\x00\ +\ +\x9a\xa5A\xfa\x03\x5c\x1a\x0f)\x80xz\x06\x0b\xbe \ +\xa6c\xda\xa2.j\xa6gz\x96\x17\x80\x12\xb8 \x03\ +n\xfa\xa6#\x1a\xa7Z\xaa\x07t\xff\x1a\x0fv\x9a\x02\ +S`\x04\xd2\xc2c\xb3\xf0\x05\xb0\xa0\xa7|:\xa6K\ +\xca\xa4M\xfa\x0b\xbb\xe0)!\xba\xa3\xe0\xd9\xa3XZ\ +\xa2A\xba\x04\x8d\xfa\xa8S0\x05/`\x04\xae\x80b\ +\xb3\x10\x03_`\xa9\x97\x9a\xa9I\xba\xa9\x80\xfa\x0b\xc3\ +\xa0\x12\xb5\xf0\x03\x88\x9a\xa8\xa5\xaa\xa5\xa8\xea\xa8\xaa\xca\ +\xaa/0\x02ZP>\xeb\xe5\x0b\xbc\xd0\xac\xb3z\xa9\ +\xb0`\xab\xb7Z\xa6\x00j\x09\xca\x9a\x12\xc6 \xa2\x97\ +\xe0\xa0$j\xaasZ\xa7\xc5\xfa\x02\xc7:\x02#\xd0\ +\x08\xd7\x08\x5c\xb0P\x0b\xcd\xea\xac\xb4\x8a\xa9}J\xa6\ +\x7fz\x9e\xee\x89\x14\xd6`\xa5\x0f\xfa\xa3\x8b\x9a\xaa~\ +\x90\x02\x90j\xac\xe4:\x02j\xa0\x06\xc9\xf0[\x91\x15\ +\x03\xaf\xf0\x0a\xea\xba\xae\xcfz\xa9{:\x0b\xef\xba\xa9\ +L\xda\x00JA\x0dI\xc0\xad\xf7*\xa7[Z\xa7\xfb\ +\xda\xaf\xe2\xfa\xaf\x00\xcb\x02,\x90\x0c\x1f0\xa9\x1b5\ +\x0b\xaf\xe0\x0a\xaep\xb0\x09\xcb\xae\xb4\xda\xb0\xef\xea\xa7\ +\x7fz\x0a\x82\xb0\x14 p\xa5\xc1\xff\x1a\xa4\x19\xeb\xa8\ +\x1b\xbb\xaa\xe2:\xae\x00\xab\x06!\x9b\x0c0 \x06\x09\ +yN_\xe0\x0a\xb9\x80\xb2\x07\x8b\xb0\xeb\xca\x0b\xb3\xda\ +\xb2\xd2\x0a\xaf\x17*^K\x91\x0c\x8a\x9a\xaf\xe0\xca\xaf\ +\xabj\xac>\x1b\xb0A\x0b\x030\xd0\x08\x8d\xa0\x09h\ +\xb40\xbe\xe0\x0c\xb6`\x0b\xcd\x90\xb4)\x8b\xb0+\xeb\ +\xb4\x0b\xeb\xb2\x0f{\xa1\xb7\xf0\x05g\xe1\x08?\x90\xa5\ +XK\xacZ\xcb\xb3\x1dK\xae^\x1b\xb2`+\xb6\x14\ +@\x01\xc1 \x08\xb00-\xaf\x80\x0b\x8c\x9b\xb6k\xab\ +\xb4n\xdb\xb4O\xcb\xb0QK\xa6\x18\xb0\x9ch1\x04\ +\xde\x9a\xb3\x8e\xda\xb7\x5c\xfb\xaf\x81\x9b\x0cB\x1b\xb6\x85\ +\xab\x05Z`\x04$\xc0\x07\xbe`&\xb5\x80\x0b\xb2\xd0\ +\x0b\x8c+\x0d\x8e\xcb\xb6*\xfb\xb6\x93\x8b\xa9\x0e\xfb\xb2\ +\xa9\xc0si\xd1\x0f8\x8b\xaaY\xdb\xaf\x9f\x0b\xb8@\ +\xfb\xb5a\xdb\x08\x14`\xbaL`\x04b\x10\x0c\x80\xb0\ +\x00v\x8b\x1d\xbe\xe0\x0a\xd4P\xbd\xb2\xf0\xba\x8d\xab\xb6\ +l\xdb\xb6\xb5`\xbbq[\xb9\x16\xff\xa7\x16_\x00\x03\ +\x9c\xbb\xb3~\xdb\xb5\xc5+\xba\x83\x8b\xbc\xc9\xbb\xbcb\ + \x06' \x0c\xc2@\x02\xe8p\xad\x87\xc1\x0b\xb8\x90\ +\x00\xfa[\xbd\xd4\x80\xbd\xd9\xfb\xb8m\xcb\xb4\xeb*\xab\ +\xdfk\xab+P\xb6\x85\x81\x0b/\x00\xae\xe6;\xbc?\ +\x9b\xbe\xeb[\xba\xa7\xfb\xbe\xc1\x10\xbf@\xe0\x03\xfd@\ +\x0c \xb0\x00\x00\x96\x16\xbc\x10\x04<\x10\x00o\xf0\x06\ +<\xb0\xbf\xfd\xeb\xbf\xb2\xab\xbd\x90+\xc0\xcdJ\xc0-\ ++\xb7\xacP\x83\xa0\x11\x00S\xa0\xb3\x9e\xdb\xb3\x1e\x1b\ +\xba\xa3K\xb8\xca\xcb\xbc\xf0+\xbf\x18\xdc\x0f$\x00\x08\ +\x80\xe0\x02 \x80\x0e\x01\xf0\xaa+\xc1\x0b\xb6\x90\x00\x1e\ +@\x0e\x1e\xe0\x01\x01 \xc2o`\xc2\xfd\x0b\xbb\xff\xbb\ +\xbd\xb5\xdb\xb4.\x0c\xad\x0d\x1b\x0b\x8c\x09\x1a:\x10\x0f\ +\x0d\x8c\xc3\xa0\x9b\xbe;\xcc\xbe\xa6\xeb\xc3\x15,\x0c\x17\ +\xdc\x0fBL\xc4.\xe0\x09\x9e\xf0\x01O\xa0\x09C\xb0\ +\x00\x01@\x0d\xb6\xf0\x0a10\x10\xb0\xf0\x05\xb5\xe0\x0a\ +\xb8\xe0\x08o\xe0\x01|\xb0\x00|\xff\xc0\x074\x00\xc5\ +RL\xc5%\x9c\x00\xd6\xeb\xbf\xb80\xbb(\xcb\xbdo\ +\xdb\xc5\x94;\x0b\xd8\xb1\x017\xfc\xb7\xc4\x0b\xb2\xea{\ +\xbc\x12\xec\xbe?,\x0c>\x80\xc1\xc40\xc4J0\xc7\ +\x87`\xc7R\x00\x02\x9a\xa0\x09!`\x05V\xb0\x01\xc6\ +`\x0c(0\x04C\x80\x0e\x82 \x08^\xa0\x038\x80\ +\x03\x8a\xcc\xc8\x8e<\xc5#\x5c\xc5\x92<\xc9\x8c[\xc9\ +\x96\xec\x0a\x81\xb0\xc5\x03|\xbb\xd1J\x1f!\xb0\xb5f\ +\x1c\xca\xc6K\xca\xed\xcb\xc6\x16\x1c\xc4C\x5c\xc4s\xfc\ +\x01v\x0c\x02\xb2\x1c\x02\xb5|\xcb\xb9\xbc\xcb\xbd\x9c\x01\ +\xc0,\xcc\xc4\xac\xc8\x8d\x1c\xc5\x8f<\xc2\xfa\xbb\xcc\xd7\ +\x8b\xc5\xce\xdc\x0c\x00\xbc\xb4\xdd\xcb\xc5\x93\xcb\xc9\x12\x02\ +\x02\x0e\xfc\xb3 k\xbc\x84\x9b\xbcZ`\xca\xf1\xeb\xc6\ +\xaa\x1c\xces\x5c\xc7O\xf0\x04\xe6L\xcb\xb5\xbc\x01\xb8\ +\xac\xcb\xbc\x8c\x0e\xee\x1c\xcc\xc3\xbc\x00\xc5L\x0e\xc7\x0c\ +\xc9V\x9c\xcf\xcd\xfc\xcc\x01\xfc\xcf\xd3l\xa9f\x02\x02\ +\xa0\xfc\xc0\xa2\x9c\xc6\xa5\xec\xcd@\xff\x0c\xc7$\xc0\xca\ +\x11m\xc7\x14}\xce\x17\x9d\xd1\xec\xcc\xd1\xbf\x0c\xcf \ +\xbd\xc8\xf3\xfc\xc8T\x5c\xd2\x94\x9c\xb6*\xbc\xc2*\xdd\ +\xc2\x89\x1b(V\x90\xc3:\xbc\xbej|\xba\xcc\xdb\xc6\ +\x0em\xd3r\xec\xca:-\xcb\x16}\xcb>\xbd\xd1\xee\ +,\x08B]\xccE]\xcf$\x8c\xd4\xfa\xec\xb8\x00\x8c\ +\xc9M\xfb\xd4\x9d\x82\x02\xc4\x8b\xc62\xad\xd0\xa6\x8c\xd5\ +A\xbc\xcarL\xc7\xe4\xfc\x04\xb1<\xcb\xe8\x0c\xd6\xeb\ +,\xd6A-\xd4\x8b\xcc\x07\x22\x1d\xc5\xc8l\xcf\xcb|\ +\xc2\xfa\x9c\xc2kK\xbb\xd2\x0c\xd7\xb7\xb2\x00,\xa0\xc3\ +um\xba\x13\xdc\xbc\x0d\xfd\xc6B\x8c\xd3|]\xce^\ +\x9d\xce\x18=\xd8\xed\xfc\xcb\x1e\x1d\xcf\x8b\x9c\xd8F=\ +\xc2\x91\xcc\xbf&\x9d\xbdK\x9d\xd2\xb5@\xd9\xd3\xf2\x06\ +\x8dp\xd0\xa3,\xb6U}\xd7\x0d\x9d\xcaZ-\xce|\ +=\xd1\x15M\xcb\xb6\x5c\xda\x1a}\xda\xef\xfc\xd1f\xed\ +\xc8h\xad\xcc\xfc\xeb\x08\xb1\xbd\xcfm\xbd\xb4\xb6\xfd.\ +\xb6 \x0c\xdb\x9c\xd0=L\xc1\x9d\xff\x9d\xd7\x10\xcd\xd5\ +\xc4=\xda\xc7\x1d\xd6\xca\x9d\xdaCm\xcc#\x9d\xcc\xf7\ +\x0c\xdb\x94\x0c\xd9\xb9\xb0\xbd\xbc\xb0\xba\x1b\xf5\x05 \xb0\ +\xdb\xeck\xd74\x9d\xd5\x9f\x0d\x08\xad\x1c\xda\xe3\xfd\xd5\ +\x82\x9d\xdc@\xbd\xdc\xaa\xbd\xda#M\xd2\x8d-\xddI\ +\xfd\xcc\xbc\x10Y8@\x01\xc7\xdb\xdb\xfb\xed\xd9z-\ +\xdcu\x0c\xcb\xa3M\xda\xe6]\xe0\xe8\x9d\xde\xac\xfd\xdc\ +\xed=\xc9\xfaL\xdd\xb9\x10\xbd\x91\x85\x0b$\xc0\xddk\ +\x5c\xe1\xe0\x1c\xde\xc3\xbd\xd3\x80\xcd\xe1\xba\x8c\x02\xbb\xec\ +\xe1\xf0|\xe0g=\xc5\x0a\x1e\xdd\xd3\x9d\xc2\x81p\xdd\ +z5\x04Z0\xd3\xde\xfd\xcd/\xee\xdf\x11\xfd\xca\x01\ +.\xe0\xa5m\xe37>\xd6d]\xd6D\xcd\xda<\xce\ +\xdej\xdd\xcc\x95\xfc\xe0(\x86\x0b.\xd0\xc3.\x0e\xc7\ +\x17\xfe\xdf\x19\xde\xe4\x81\xad\xce5\xce\xceR\xae\x03T\ +\x8e\xe0\xf4\xbc\xd8i\xbd\xe0\xb1\xfd\x0cB\xbe^\x0b\xd0\ +\x0e\xbe\xfd\xdbI\x8e\xe1}-\xe3N\xbe\xce6\xce\xcb\ +\x190\xd6\x1f~\xd8;\x0e\xe7#\xff\xee\xd8\xb8\xc0\xe5\ +\xa16\x04\xef\xcb\xd9\xf2k\xe1\xe1\xdc\xca9=\xd1\xb1\ +L\xde\x03\x0e\xe5\x82N\xe8e\xdd\xdc\x09\x8e\xe5r\xee\ +\x0c\x02\x9dl\xae\xb0\x01\xc2p\x02z.\xe6\x93\xbe\xe4\ +]\xbd\xe1\xe5\x0d\xe8?\xcd\xe9\xc3\xac\xe3!\x0e\xe7\x91\ +\xbc\xcc\xcdP\xe7\xa1\xd6\x0c\xc6\xe0\x03\xfc\xdd\xdf|\xde\ +\xea3\xfe\xeaiN\xd8\x06~\xe0\x88\xed\xdcW\xce\xd8\ +\x09\xd0\x04(\xfet\xaf\x90\x01$\x00\xdeD\x1c\xecf\ +N\xe3\xc5~\xdel\xce\xdc\x86\xae\xec\x88\x9e\xeb\xb6\x17\ +\x03\xe4\xa0\x09\xc0N\xe6e\xee\xe7g\x8e\xdc\x9a\xae\xed\ +\x9d^\xe5\xde\xbe\xc7\xae@\xdf\xe1\x87\x0b\x82\xf0\x01[\ +M\xc7L\xee\xd7\xc5\x9d\xee>\x1d\xe8\xec\xce\xdc\x9eN\ +\xcfo\xb0\xe8F\xf8\x0f\xb2 \x08 \x90\xd3\xad\xee\xea\ +\x99\xee\xef\x05>\xe5\x00\x7f\xd8\x22\xfd\x06\xb2@\xb2\x05\ +?\x10\xb9@\x0e(\x00\x02\xc2>\xec\x0d\x1f\xeb\xbf|\ +\xecCM\x0eo \x0d\x8c~\xf1\x09\xd1\x0c\x01\x80\x03\ +(\x80\x093\x8e\xed\xeb\xfe\xf0\x1e)\xbd\x00\x1e\x90\x00\ +&\x8f\xf2H\xf1\x0a\xbd\xc0\x03\xe4\xb0\x00:\x90\x01C\ +\x00\xe5\x81>\xe8f`\x08\xe4\x10\x00\x09\x80\x0b\xcfp\ +\xf2\x91\x15\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\ +\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\ +\xc1\x83\x08\x13*T\xd8\x8fE\x92#\x17\x0c@\x8a#\ +\xa1\xc1\x9fe\x12\xaaP\xe22M\xc6\x08 \xff\x02,\ +\x1cI\xb2\xa4\xc9\x93(S\x1a\xec\x17\x0f\xcc\x9660\ +a6\x98I\xd3\xe2\x1f\x0d85\xe4\xd0\xa5\xeb\x96\xcf\ +\x09\x5c\x92\x9cX\xa0\xb2\xa8\xd1\xa3H\x0fz\x08\xe6\x84\ +\x96\xbb\x09P'\xc4\x94Ys\xe6\x9f\x9b9w\xf6\xf4\ +\xd9\xaa\xab\x1c9\xee\x18PHJ\xb6\xacY\x82\xe8^\ +\x98p\xc7\x96mT\xa8S\xabZ\xc5\x8aS\xab\xcf[\ +][}\x05\x05\xaaE\x0b7z\xce\x0a\x1eL\x92\xcf\ +\x885\x12\x12\xb7u\xfb6\xae\xdc\xab9u\xf2\xbc\x9b\ +W\x0e_\xbf-Vh\x86\xf0\xc3\x0c\xe1\xcf\x84\x011\ +\xa8R%\xb1\xe9\xc5o\xa5\xc6\x94k3\xb2\xdd[\xc7\ +*_\xf6\xab\xb9\xf6\xa85'@\xebF\x9a\xec\x11i\ +\xd2\xa6\x15\xa3\x8e:\xb5\xcdc\xba\x92\xb7\xc6\xf6:;\ +s\xed\x15\xa3\xa27H\x91`\xb7u\x92oR\x00\x80\ +\x00\xe17\xf0\xd3\xc3\xe1:\xff\xae\x099\xebd\xbc^\ +-\xf7u\xfe<\xba\xfb\x16\xf3\xae\xcb?8e;\xf7\ +\xee\xde\x83K\x08\xafzu\xd5\xf2um\x85\x9e^\xcd\ +=\x07\x9d{\xa3\x1c\xa0`\x0b\x89\xcc7\x1f\x0c\x0e@\ +\x02\xc9}\xdc\xe5\x17\x1c\x7f\xfd\x19\xf7\x1fr\xe7\x0d\xa8\ +\x1ef\x06\x22\x98\xa0\x82\x0b\xc6\xe3\xa0n\x9e\x98 \xa1\ +\x84\x14\xe2\xf7\xdb\x85m\xa56\x1eM\x00j\xd0\xa1l\ +\xeb\xb1\xa7\x99\x88$*\x88\x08\x22m\x08s\xe2`\xd1\ +l\xb1\xc5\x8a,Rhab\xcb\xf07\xe3\x5c\xe6)\ +\x87#m\xed!\xd8\xa3\x8f?\x22b\xc2\x90e\x19\xf1\ +\x08\x00F\x1e\xb9b\x8b\xde\x95\x06\x1ec\xe2QE\x1e\ +]\xaf-\xb7\x17\x88U\xbawe\x96Y\xae0B\x0c\ +\x5c\x1a\xb5\x89\x1b\x00\x80i$\x92\x13\xdeW&\x8ch\ +fx\x5c\x94\x5c1\x97c\x9c\xd1\xcdI'\x22\x1dD\ +Z\x03\x0dy\xa2\xe4\x89\x01n\xf0\xd9g\x98H\x92\xf9\ +\xe2\x99O\x11\xe7\xdf\x9a\x88z8[\x88V\xf6\xf8(\ +\xa4\x91\x96\x22Gn\x95\x92\xff4E\xa6\xb4n\xfag\ +\xa7\x82.\xb9_\x8c\xa2jHj\x80[M\xa9\xe3\x81\ +\x8d\xaa\xfah\xa4\x1d\x94\xa2\xac\x22\xd1\xc4\xba\x10'\xb4\ +\xd0Bk\xa6\xb6\x8a\x99d\xae\xdf\x09W\xe8\x93\x00\xee\ +D\x19sp\xee\x98*\x89\xc7\xb6\xba\xac\x22\x8a8\xe0\ +,B\xa18\x10\xed\xb4\x9a\xfa\x09\xa8\x92\x9fj\x1bj\ +\x9a\xbeB\x19\xe0\xb7\x1fR)n\xb1\xe4\x96\x9b\xec\xb9\ +\xe8j`\xcc\xba\x03iR\x83\x03\xee\xbe;m\xb5\xb8\ +bk\xa6\xb6\x8d\x8d\xaa\xafd>\xb9y*\xa3\x8ef\ +\x89\xac\xb2\xa5\xa0+\xb2\x22\x07\xf4\x83\xb0\x0f\x94<\xc2\ +p\xc3\xd2>\xec\xa7\xb5\x81VX\xef\xaehr\xcb\xa6\ +\x94\x04\xae\xc7\xb1\xb1\x1e\x9b\x1b\xf2\xc8\xe8\x22\xa0\x88\x1a\ +\xcej\xf1\xc8\xd1*3\x1cm\xcb\xd4\xda:\xaf\xcc\xd9\ +\xd2|\xaf\xcd9\x9d'[\xb8\xc4\x8e\x18p\xcf\x03\xff\ +<2\x02`#\x90B\xa5\x8d \x8d\xf4\xca\x0e\xd7\xfa\ +r\xc4.N\xdc\xe4\xb6j^l5\xb8:\xf2\xb8\xf5\ +\x8f\x1f\x13,r\xd8a[\xff\xc0%\x0c\x94\xa4lv\ +\xd2\x0d\xc3\xebt\xc4\xba\xf2\x9a\xe6\x86U\x07\x9b\xb3\xbf\ +Yw\x8cw\xd7@+\xc2w\xd8D$q\xa2\x11%\ +\x94\x10\xf8\xe0\x84\xa7\xdd\xf4\xad\xd7\xb6}f\xc5\xf9\xb6\ +\x86\xd3\xdc\xfd\xee\x8c%\xd7z\x07}9\x02D\xd4\xee\ +\xc7|>t\xde\xf9\xe7\x83+-:\xc4cB=q\ +x\x16\xabn\x97\xc6\x90\x8f\xfb:\xab\x94\x7f={\xed\ +\xd0\x13m\x9d\x15\x06\xd4\xa0\xbb\xe7\x82\x9f\xed\xbb\xe1\xf2\ +\x06\x0f5\xa1\x13\xb8\xa1L\x0aL<\xf1\x0f9\x04\xe5\ +r\xfe\x10\x1fP\xb0D&\x12\x10\x98\xbc\x9cw\xb3\x0a\ +r\xe5\xcfC\x0f= \xbb\xe9`B\x0d\x00\xbc\x1e\xef\ +\xb4W\xb8\x87q\xca{K\xa2D\x11Lf\x94\x13\x0c\ +C\x02u\x03\xd8\xf2\xf2\x86\xbf\xcb\xe9O\x7f\x1d\xd8\xcd\ +\x05\x00\xc8A\x01f\xefhhc\x9a\xa6H\x173\x17\ +]\x80\x02|\x10\x8c\x1aJ\x10\xb9\xbbQ\x10h\xf9\xbb\ + \x07f\xd8\x02\x0f|\x06\x1e\xd5\xe3`\x00u7@\ +\x10nOm$\xbc\xcf#\xff^\xb0\x1b3X\xa0\x01\ +Z\x9b`\xf3\xf6f\xc1\x0b\x12a\x863L\x03$j\ +1\x98\x11\x18\xe0\x8a:\xec\xe0\xee>\x98\xb4\xa5\x19\x90\ +t\x10\x18\x80\x0f\x1c\xa4\x05\x08\xb8\xd0\x5c0l\xa2\x0c\ +\xa3\x98\x866rB0O\xb8\xa2\x1cs\xa8C\x1er\ +\xf1\x87\xa3\x13\xd3\x00\x5c\x90'aT\xa1\x5c\xb1\x8b\xa1\ +\xfe\xa0\xd8\xc6B\x22C\x0cg\xe1\xc2\x1c\xe5\x98E\xeb\ +m\xb1w\x05\x1c]\x0d\x10\xe9,\x16\xe8br\xf7c\ +\x22\xdf\x9c\xf8D6\x1a\x12\x19\x880\x8b\x0c\xd6\xb0\x86\ +Eb1\x8bv\x84\xe4\xef\xe2\xd1\x0b\x84\x09d\x13/\ +\xd4$\xd88I\xc8B\xa6\x01\x19\xb8D\x86\x1b\xc8\x02\ +\x04R\xfa\xd2\x94\x8dL%\x01\x1d6\x80\x0d\xb8\x92 \ +OhC 7\xe9\xc4Z\xb61\x97\xd0\x9cBR\x06\ +\xe0\xcb_.2\x98\x8f\xd4\xde\xbb\xf4`\x8bc\x16\xa4\ +\x17\x0cH#\xe6\x9a\xc9\x01[\xde\x12\x9a\xb9\x94\x04R\ +\x920\x83jZ\xf3\x9au\xcc\xa6\x0f\xc3\xc1@o\x1a\ +\x04\x06\x88\x90\xdd8\x07\xe9\xff\xc9g\xa23\x97\x8cx\ +\x84Q\x9e`\x82\x19\x18\xd4\x9d\xa4\x04f<\xb1g\xb6\ +P\x08\xc2\x9e\x09\xd9@\x0e\xd4\x08=g\x9e\xf3\x9f\xc8\ +`\x84F\x19\xa1\x05\x95\x04\x82\x01&\x08\xe9A\x11\xaa\ +P-2\xf4\x11`\x10\x09D\x15\x22\x81}V\xb4\x9f\ +\x18\xc5\xe5F\x15\xa0\x00P\xa8\xc4\x08!\xcd\xa9A\xdb\ +I\xd29\xa2r\x8bG\xc0\xc5JG\xb2\x85Y\xf2\xb3\ +\x9c\x9f\xfc\xe7F\x19AS\x9a\xfa\x0d%\x5c\x08EN\ +u\xcaSw\x96\xd4\x91%\x18G3\x86J\x92G\xac\ +\xd1\x961\xcd\xa8F\x9b\xda\xd42\xa8\xb4$0\x08\x85\ +Z\xa5:\xd5\x82V\xf5\x9d\x8c\xec\xe0\x11\xb6\xcaU\x92\ +l\xe1\xa5`\xc5\xe8L\xc9\xdaT,\x1c\xc1$\x09\x88\ +\xeaZ\xd5\xda\xd6\x91Z\xd5\xa7\x00d\x80P\xebZ\x92\ +\x09t2\xafJ\x1d+_\x15\x80\x85\xca\xa6\xc1$\xc9\ +\x18\xacf\x0b\xfb\xd6\x84\xfa\xf4\x02ge,IZ\x80\ +T\x7f\xa2s\xaf|\xad\xacj\xb1\xf0\x00\x92\xc8\xe2\x02\ +s\x98\x83f\xd7\xda\xd6\x82\xff\xf6\xf4\x8a3x\xa8h\ +Mb\x05\x04\x98\x16\x9a\xa8%\xebjW{\xd9\x91\x88\ +a\x00\xc8\x8d\xedl\x09;U\xc3Z\x93\x04\xbbE\x09\ +\x0b.\x0a\x5c\xc9\x0aw\xb8\xc3}jBj\xc1\x00\xe4\ +zW\xb9\xcb\xe5\xac;M\x14]\x94\x5c\xe0\xb4\xd6\xed\ ++v\x87k\x89P*D\x0a\xde\x8d\xef\x00\xc0;\xdb\ +\xe6V\x95\x0a\xe5U\x89.\x00\x9a^\x9a\xaew\xb5\x96\ +\x08\xb0%\xc6\x92\x10\x0bp\x81\x0b\xf2\xfd\xael\xebk\ +\xdf5\xa0 \xbf)\xf9\x80X\x99\x9a\xda\xffVV\xc0\ +\x96\x10\x80\x00 \x91\x10\x0f\x1c\xf8\xc3\x08N0}\x07\ +\xdb\xd6\x11@X%`\xa0\xf0u-,`\x0d\xbbX\ +\x00\x19@\x88\x11@\x0c\xe2\x04\xcfw\xc1\x9b5A&\ +\x16{b\x94 b\xc5\xffm\xf1\x8b],\x03\x84l\ +\x82\xc6H\x161\x8e\x07\x0b\xdd\x1e\xa7d\x04\xfee\xb1\ +\x90\x87\xec\xe2\x16\x1c\x04\x07\x17\xd8\xc1\x0e\x90Lc%\ +\x0f\x96\x13_p\xb2~\xa5\x9ca*\xbb\xb8\x18\xdcH\ +s\x08\x0c\xa2\x85\x0b\xb89\xff\xcb[\xe6\xf2\x81m\xbc\ +`\x10\x88Y%ZX\xef\x94\xa9\x8c\xe64\xfby\x18\ +\x06\xc9\xc2\x9b\x07\xade9\xcfY\xbe\x9b\xb8sQ4\ +\x00\xe0\x00\x9bY\x00}\xf6\xb3\xa4[a\x90A[\xda\ +\xcd\x85\x96s|=\xa1h\x95\xb0\x00\x0b{~q\xa4\ +%-iT\xa0\x82(\x03\xf1D&V}iK\xc7\ +Y\xce`\xe8tQ:Pf>\x93\xba\xd4\xa6\xce\xb5\ +\x89\x07\xf2\x82U\xfb\x9a\xd5\xad\xc64\x97;*\xeb\x94\ +8\xc1\xd6\xb7Ns\xae\x97mj\x03\x10\xe4\x01\xbf\x8e\ +v&\x82-\xec\x0f\xdb\xb0\xd8(\xc9\xc0\x99\x93\xadl\ +f\xe7:\x02\xe0V\x04A\xa4M\xeeiS{\x07\x0d\ +\xc2vJ\xdc\xc1mo\x7f\x1b\xdc\xf0\x06\xb7\x0e\x04\x02\ +\x82\x02\xf4\xa1\x0f\xe5&w\xab\x89\xa1\xee\x94\xc4\x83\xd4\ +\xeeFE\xbc\x07\x0eo\x18\x08\x84\x02\x05Hx\xc2\xef\ +\x9d\xefh\x0f:\xb4\xfd&\x89\x0e\xba\xcdl\x82[\x1c\ +\xde\xad\xfd\xc7\x0f\x14\xceq\x85\xe3\xbb\xe1\xab\x86B\xc4\ +S\x22\x87e_\xfc\xe4\xf0\xff\x86\x80@\x1e\xd0\xf1\x96\ +{\xfc\xe3\xd2\x86\xc3\xc8Q\xf2\x00\x81\xa3\xfc\xe2=\xc8\ +y\x0f\x8a\x0b\x86\x9e\xbb\xfc\xe7\x0b\xff\xb5\x15f~\x12\ +#\xdc<\xde:\xef\x01+\x96\xcetrx\xa1\xe7P\ +\x8f:\xd0[\xde\x07j\x10\xdd$\xe48y\xd2\x95\xce\ +\xf4\xae3\xfd\x09\x9a\x88\xba\xd8\xc7\x0e\xf4D_\xdd$\ +\x8a\x80w\xd2\xbd\xcev\xb67\xa2\x1fc\x8f\xbb\xdc\x15\ +>\xb6\xb3\x97\xc4\x0d\x5co\xbb\xdeY\xf1\x8d\xbe\xf7=\ +\x11\x8d\xa0\x82\xdc\x07?v&\xd8\xbd$G\xd8\xfb\xd2\ +\xfd\xce\xf8\xc6\x7f#\x13#`\x80\xe4'?y\xc1\x13\ +\x1e\xea\x9c>\xfcH^\xd0u\xc7{\xde\xf3%\x88\x07\ +\xe5GO\xfa\xca\x8b\xfd\xc1\x9a_H?>\xcf\xfao\ +\x00\xe3\xf5\xb0wG\x11JO\xfb\xda\xa70\xf5\x0b\xf1\ +<\xecw\x0f\x0cU\xf8\xfe\xf7\xbf_A\x16jO\xfc\ +\xd1\xf3\x00\xf7\x0by=\xf0\x97\xcf\xfc\xe6#`\x18\xca\ +\x88\xbe\xf4\xa7?}\xe2\xab\x0f\xf9\x09i\xbe\xf6\xb7/\ +\x0a\x02P\xff\xfb\xe0\xff\xfe\xff+\xb0\x9f\xfd\xed\x9b\x1f\ +\xf8X\x08\xbf\xfa\xc3O\xfe\xf2\xfb\xbe\x0e\xf0\x8f\xbf\xfc\ +\xe7O\xff\xf5\xdb\x7f\xfa\xedG\x08\xfd\xf7\xcf\x7f\xf9\x0f\ +\xe3\x01\x00\x18\x80\x028\x80\x04\x18\x80\xe3\x97\x7f\x05Q\ +\x0f\x0a\xb8\x80\x0c\xd8\x80\x0e\xb8\x80\x96\xe0\x04\x058\x81\ +\x14\xe8\x0a\x08\x98\x80\x0f\x98\x81\x19\xa8\x002@\x81\x1e\ +8\x80Vw\x81\x03\xa1\x81$\xd8\x80D`\x01\x1f\xc8\ +\x09*\xb8\x82,\xb8\x82\xe8#\x82\xff\xb0\x01%8\x83\ +\xf5\xb0\x02S\xd0\x828x\x04:\xb8\x83<\xb8\x83C\ +\x00\x83\xff\xe0\x03\x180\x84DH\x83\x0d8\x01,\xd0\ +\x83J\xb8\x84Jh>08\x05D\x18\x85R(\x85\ +\x0f\xf8\x08Z\xc0\x84X\xb8\x09Z\xb8\x85\x9b $0\ +\xf8\x00S\x18\x86bH\x84\x17@\x02Y\xc8\x85h\xb8\ +\x85\x04@\x00\xbb&\x82\x100\x86p(\x852`\x05\ +G\x90\x86v\xa8\x85k\x98\x87yx\x09@(\x0a*\ +\xf0\x87\x80\x18\x87a\x98\x0cfp\x87\x9b\xa0\x87\x88H\ +\x00\xc3\xb0\x88\x8c\x08\x84h\xff\xf0\x88\x8f\x08\x88\x92\xf8\ +\x87q\xf8\x0f\x8e\xa0\x86\x89\x98\x87\x8c\xb8\x89\x9cx0\ +\x17\xa8\x05\x90\x18\x8a\x908\x89\x93(\x85\x021\x08\x89\ +\xc8\x89\xaa\xa8\x8aN\xd0\x0e\x22\x08\x06\xab\x10\x8b\xab \ +\x8a\xb4H\x8a\x80X\x09\x021\x02\x8a\xb8\x8a\xbc\xb8\x88\ +N\xf0\x8b\xbf\xf8\x03\x22\x88\x08\xb2X\x8c\xb1H\x8b\xa2\ +(\x89\xee \x10\xed\xd0\x8b\xac\x08\x8c\xc0\x98\x05Y\x00\ +\x05\xc7\x87\x80\xbbp\x8d\xc6\x98\x8d\xc8\x18\x8a\xb1\xf6\x0f\ +V\xe0\x8c\xc3\x00\x8d\xd18\x8dPP\x8e\xf3\xe0\x84\xed\ +g\x01\xa7\xb0\x8e\xccp\x8d\xbb\x90\x8d\xc6\x88\x8c,0\ +\x10\xab(\x8e\xbf(\x8d\xe4h\x8e2\xb0\x8fmH~\ +\xc7\xb0\x8e\x00\xb9\x8e\xee\x08\x8f\xda\x88\x06\xba\xf5\x0fE\ +\x10\x8e\xf6x\x8f\xf9\xa8\x8f\xfb(\x03\x89\x10\x91o\x90\ +\x7f\x01Y\x91\x029\x90\x04\xb9\x0a\x0a@\x10\x8d`\x8f\ +\xf8X\x8e\xe68\x0f\x0f\x09\x91\x11\x19\x91\x97\xc0?\xe4\ +\xa7\x0c\xb1\x10\x0b\x16i\x91\xed\x88\x91\xc5\xa8.\x09\xc3\ +\x90\x0d\x09\x05\xf3 \x92\x0f\xffY\x92&Y\x04\xe0\x02\x0b\xebM\xb3\x00\x0b\ +\xbe\x80\xb4I\xcb\xb2\x0f\xcb\xb40\x1b\xb3\xe6\xa99I\ +q\x02\xb0j\xb5\x1d\x9b\xb5\x05{\xb0@\xdb\xb5C+\ +\x0c@\xe0\x03\xfd\xd0\x0f(@E\x08S\xb6_\x00\x0b\ +\xb00\x0bh\xab\xb4k\xfb\xb2mK\xaaY\xaa\x01e\ +\x81\x0b\xc9\xc0\xb1\xe7*\xa8<{\xb7?K\xb2bp\ +\x02C\xdb\xb7\x7fK\x02$\xe0\x09\xb7\x17+\xb0\xc0\x0b\ +\xbc\xf0\x05\x85{\xb8\x89\xab\xb6\x8bk\xaf\xbe:\xb1X\ +Z\x0fg\xa1\x03t[\xb9\x04\x8b\xb9\x08\x9b\xb7\x9c\xfb\ +\xb5~\xdb\x0f\xc4@\x02\x80\x00\x08.\xa0\x09\x107\x1f\ +_P\x0b\xa6\xcb\x0b1\x90\xbag\x9b\xb6\xac\x0b\xb1/\ +\x0b\xbb\xa40\x18Op\xb5;\xeb\xb1\xb5\x0a\xb2\xed\xaa\ +\x05F\x90\xb7^\x0b\xb6\xbd\xff\x0b\xbc\xc2\xeb\x02\x9ep\ +\x08!P\xac\xd61\x0b1\xf0\x0a\xec\x8b\xbc\xa6\x8b\xba\ +\x86\xdb\xbci\xdb\xb2.\x1b\xbd\xf8\x1a\x0a\x84q\x02\xb6\ +\x8b\xbd\x98\xcb\xbd\xde\xbb\xb7\x9e\xdb\x0f\xa0\x1b\xbc\xe4\xeb\ +\x09\x1f\xf0\x01O\x10\x02\x0b\xa0\x9c\x84\x01\x0b\xb5\xd0\x0c\ +\xb9\xe0\x0a\xed\x9b\xbc\xcb\x9b\xba\x88\xeb\xbc\xf4\xcb\xb4M\ +\xeb\xa66E\x18\xb6@\x01\x96k\xb7\xfd\xcb\xb5\xdf\x1b\ +\xc0\xbfK\xc0\xe4{\x08\x08\xfc\x04 \xa0\x09\x9a0\x04\ +\x1eP\xa8e\xf1\x05\xaf\xd0\x0c\xb8`\x0b\x10\xec\x0a\x12\ +\xfc\x0a\xee{\xba\xcc{\xc1\xf3\xbb\xb4l\xeb\xa6\xa8\xa0\ +\x1b<\xd0\x08\x97;\xc2\xff\xbb\xb7>\x10\xbe\xc0\xab\x04\ +\x05|\xc0,\xdc\xc2\x9a\x10\x02V`\x05(\xb0\x00\xd4\ + \xb8)A\xc3M\x80\x0f\xb2\xd0\x0b\xb8p\xc38\xac\ +\xc3\xed\xdb\xc3\xf0k\xb6\xab\xbb\xb2\x19<\xc4\x8f\xba\x1b\ +| \xc2\xda\x8b\xb7A\xbb\xbb\xe0\xfb\xb9\xe2\xeb\x02)\ +\xbc\xc2 \xd0\xc2!`\xc5V\xb0\x01\xc6`\x0c( \ +\x08\x0b\x10\x00\xd4\x80\x0b\xae\xffp\xba\xb00\x10\xa5[\ +\x0b\xae`\xc3\xb2\x90\x00\x94L\x0d\xd4\x10\xc6cl\x0b\ +8\x1c\xc1;\xdc\xc3\x15l\xb8@\x1c\xc4\xadk\xaf\xa4\ +`x\xd6\x81\x0e\x1f;\xc7\x99[\xc7_k\xc2\xe2\x0b\ +\xc5\x9e`\xc0\x08,\x05T\xfc\xc7\x81,\xc8\x84<\x04\ +C\x80\x0e\x19 \x08^\xa0\x038\x80\x03\x0b\xc0\x07|\ +@\x03\xe4\xe0\x01\x1e\x10\x00\x01\xf0\x06oP\xc9\x97,\ +\x0bc|\xc39\xdc\xc9h\xfc\xc3k\xfc\xbc\xf5\xab\xad\ +\xdae\x1d(\xa0\xc4\x9a[\xc2\xbd+\xc0y\xbc\xc7O\ +0\xc5.\x0c\xc8\x1b \xc8(\x80\x02\xba\xdc\xcb\xbe\x0c\ +\xcc\xc2L\xcc\xc6\x8c\xcc\xca\xcc\xcc\xce,\x0b\x98L\xc6\ +\xd3<\xc1\xa6\xfb\xc9j\xbc\xc6\xf4\x9b\xcd\x22\xe7 \x1b\ +\xe0\xb3?\xfb\xbf_{\xc7\xe2\x8c\xc2\xb1,\xc5,|\ +\xce\xe8<\xc8\xeb\xdc\xce\x82\xf0\xce\xc1<\xcc\xc5|\xcc\ +\xc9\xbc\xcc\xcd\x9c\x00\x96|\xc9b\x8c\x0b\xd2\xb0\xc9f\ +\xcc\xc3\xd5\xfc\xc3\xce\x8b\xcd.\x0b\x99Cb\x0c\xdb\x9b\ +\xbbu\x0c\xc0\xbd{\xc2\x80\xff\x00\xcb\xe5\xcb\xc7\xb5l\ +\xc5\xe9,\xd1\xec\xcc\xcb\x15\xfd\xcb\xc2\x8c\xd1\xf3\xbc\xd1\ +\xcc\xcc\x03\x1em\xc9\xf8\x1c\xcd\x9a\xbc\xcf<\x9c\xbc>\ +l\xb8\xaa\x9b\xd2\x01\x9dq\x5c2\x04\x07\x1d\xd3\xad\x1c\ +\xce\x03<\xbe\x0d\x8d\xd3U\x8c\xce\xb8\xcc\xce\xbb\xec\xce\ +:\x00\xcc\x0b \xd4\x1a]\xcfo`\xd4G\x8d\xcf!\ +\xbd\xd4\x9c|\xc6\x14\x9c\xc6g{\xcd-;\xd0\x95\xe2\ +\x05\xdd\x8b\xd5|\xdb\xc4x\x1c\xbc6\xad\xc2\xe5\xdc\xc7\ +\x10}\xc5;=\xd1c]\xd1e\x1d\xd4\xf2\x9c\xd6j\ +}\xcf\xf9<\xd2\xcd\xc0\xd4=\xec\xc3\xd6,\xd5\xa6\x10\ +\x18\xebB\x0e'\xc0\xca\xbc;\xd3[\xad\xc7]=\xd8\ +9}\xcb<\xad\xcb>-\x08\x8b}\xd6\x8dM\xcf\x8f\ +}\xd4\xcf\xac\xd4$M\xcds\x9d\xbaQ\xed\xbc\xef@\ +l\x08C\x0d>\xf0\xbd}\xfd\xb7\x0b\xcd\xd57]\xce\ +\xb4\x5c\xd8\xa6M\xc8b\xed\xd3@\xcd\xd8\x19\x8d\xccD\ +\xdd\xd1\x1f\xed\xd6\x99<\xdb\x9d\xec\xd4\xfe\x5c\xd7i\xcb\ +\x0av\xe6M\xb9\xf0\x012\xff\xed\xc4\x80-\xda\xb2L\ +\xda\xc6\xbd\xd3\xc8\x9d\xd8\x16\xcd\xdc\xc6\xec\xd8E\x0d\xd9\ +!\xad\xcfqm\xd2N\x8d\xba\x97}\x03+0\xba\xf6\ +d\x0c}\x0d\xda\xe3\x1c\xcb\x82=\xd8.\xfc\xd5\x86\xad\ +\xce\xc9\xed\xce\xcb\xcd\xda\x19\xcd\xdek\xed\xcc\x8e\x90\xcf\ +\xf0\xad\xc3\xd5]\xdbP]\xd7& \xc3+E\x0e$\ +\xa0\xd5\xaf,\xde\x0eM\xd8\x02~\xdc\x88\x9d\xda\x07\x8e\ +\xd6\x0a\x0e\xddH\x9d\xcfKM\xd9\x95M\xdf\xf1\x8b\xb8\ +\xbb\xd5\x0c\x9a\xf0\xb74-\xdc\xffm\xce\x1fn\xde!\ +n\xe0\xf0\x8c\xe0\xeb\xed\xda\xccl\xe2\xcf\xfc\xdep\x0d\ +\xe1r\xdd\xcf,~\xb8\xf9\x85\x03\x80\xb0\xd5P\x1c\xc5\ +^\xfd\xe1 ^\xe0?\xbd\xe3$\xee\xda\x1c\xed\xccA\ +.\xdb\x10\x1c\xdf\xb5P\xd9\x15<\x0b=\xd6\x0c!\x10\ +\xbc4\xde\xe1\xa5\x1d\xe5R\x9e\xde\x08\xce\x07\xe4\xe0\xd8\ +W\x8e\xe5I=\xc6#=\xdb\xec+\xdf\xc9\x8b\xe4b\ +\xe6\x01\x1f \xde\xe3m\xe37\x1e\xd6\x05\xae\xe3\x17\x8d\ +\xd1l\xee\xe6\xed\x0d\xdb\xd2\xff=\xdd\xd3L\xdb\xa6\xdb\ +\xc8\x9d\xf6\x05f\x10\xcb7\xfd\xe4\xb6<\xe0\xa7\x8d\xde\ +\xaaM\xe5\xc4\x5c\xe8V~\xe8\xd1\xed\xe0)\x1e\xdf&\ +\x1df\xea\xf6\x0a\x82p\xc0+L\xcbg\x9e\xce\x80\x8e\ +\xda:\xae\xe9\xc4\xdc\xe6\xce\xad\xd6@\x8e\xcf\xd0,\xe7\ +C^\xd21\x00\xe6#\xe7\x0a\x82P\xce~^\xe98\ +\x9e\xe3S\x0e\xeb\x9c\xee\xe3\xf6\x0c\xe7\xa0\x8e\xc3\xd3\xcc\ +\x0b\xbe`w\xb5`\x08\x9a\xe0\xe1\x95\x8e\xe6\xae^\xec\ +\x83\xbe\xe9\xb2\x8e\xec\x1d\x8d\xe8\xcb\xbe\xc9\xce\x8e{_\ +\xf0\x06C`\xdcQ\xae\xcb\xe8\xfd\xcb\xc6\xbe\xed\x1b\xcd\ +\xd1l\xfd\xe9\xef=\xd2\x8b\xcc\xeb\xe4\x97\x0b|`\x0c\ +`\xdd\xeac\xfd\xea\xd9\x1e\xeb\x1a\xdd\xee\x9en\xc9\x0d\ +\x8e\xc9Mp\x0d\x8e\x0e\x83\xb6@\x03(`\xde\xe7\xbd\ +\xefS\x1e\xcc\xcc}\xec\x00\x9f\xec\x88\x8e\x0b\xce@\xea\ +@X\x10\xaf\xf0\x06\x0b0\x04\xeb\x9c\xe6\xe9\x1d\xf1C\ +=\xf1\xdd\xee\x08A\xf0\x0a\x18\x9f\xf1\x0a\xf1\x0a\xd4\xe0\ +\x01\x86\x90\x01\xa9\x1d\xf2k%\xde\xe3\x00\xef\xd1M\x80\ +\xf2*o\x14\xbc\xd0\x0c\x93\x1c\x00\x1e@\x0e|\xc0\xda\ +\xc3<\xcf\xcbl\xc9\x8a\x5c\x0b)\xcfX\x01\x01\x00!\ +\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\ +\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*D\ +\xf8\xc6\x18\x89dz\x9c\x801A\xcb\x0d$w\x13 \ +mq\xb3&\xd3\xa6$,\xfamXH\xb2\xa4\xc9\x93\ +(S\xaa4H\x8e\xc4\x94\x07\x0e\xaaT\x91@\x93\xa6\ +\xbb\x9b7'\xe8\x9c\xd0\xa6g\xcf\x06@!\xf4\xd1\x03\ +\x84\xcf\xca\xa3H\x93*E(lP\x0d\x08PeJ\ +\xad)\x01g\xce\x9d>\x7f\x02\xdd\xda\xe0\x0f\xa4\x07L\ +\xc8-\x1dK\xb6\xec\xc0\x0c#\xb8@Z\x0b5\xaa\xd4\ +\x995\xadb\xc4\x9a\x95\xeb\xd6?\x7f4\xe8}\x14\x0f\ +\x85\xd9\xbf\x80K\xb2\x18\xb0e\xad\xe1\xb6\x10\xde\xc2\xb5\ +iu'\xcf\xbav\xbb\xe6\xd5\xab!\x87.!~\x02\ +k\x0e\x1c\xc8\xc5\x11\x00\x00\xb6\x886\x0c\x09q\xe2\xa9\ +q\x1b\xd3\xd5j\x17\xef\xe4\xca\x96u\xdd\xba5@\x98\ +\xab\xcd\xb8\x93\xc2X\xe3\xc6\x0dh\xd1\x85I#~K\ +U\xaec\xc8\xad_W\xd6%{\xf6\xb1V\xee\xa6\xe4\ +\x9e~\xf2\x05\xa5\xde\xd8\x7f\x07?\xdc\x96x\xcde\xaa\ +u\x22\xff\xe7\x8a\x97\xf2\xf2\xe6\xb7Z\xa9o\xa5!\x11\ +\xf5\xf7\x07G\x94\xa0U\x11\xbb\xef\xd0\xa3\xb9\xbb\x95I\ +\x15<\xce\xe3>E&\x99y\xb19\xb7\x9e\x1cr\x80\ +\xa2K\x12\xf0\xc1GA\x1e\x0e8@_}\xbdi\xb7\ +]i\xddy\xc7\xd8U\xe2\x05\x98\xdck\x05\xce\xb6^\ ++\x09\x82\xd2B\x0b\x1aH\xd7\xe0f\x1fp\xf1\xc8#\ +\x11JHa\x85\xf8\x91\x86\xe1~\x8bU\xf5\xdfjm\ +DV\x1ee!\xa6\xa7\x1e\x82\xa0\x98x\xe2\x0a\x12\xf8\ +\xb0\xe2_\x01\xc8\xf0\xe2\x93\x11Nh\x9f\x85\xc2e\xc8\ +_j\x1c>\xc6\xda]\xca\x85\xf8\xdc\x90E\x9ex\xe4\ +\x0a+pa\xd4\x92K\x9d\xb0\x06%O\xbe\x18#}\ +\xf6\xdd\x97\x1f[V\xe6\x18\x9e\x96=&\x07$s\xb3\ +\x09Ib\x89b\x92)\xe8-j\xa0\x89\xd4\x1bY\x94\ +P\x02%l\xb6\x19%\x9c\xd9\xd5\xa8\xdfiWn8\ +W\x87[\x02\xf5\xe3y}\x1e\x18\xe6\x98\x82\xae0\xca\ +(k\x88e(JO\x84R\x83\xa2\x8b6\x0a\xa5\x8c\ +S\xe2\xffwa\x9d\xc5\xed\x88\xa9\x8f]\xf2\xe9'\x91\ +F\xb6\x10*\x99\xa3\x8e\xa2\x810\xa7\x9a4B\x0d\xc8\ +\xb2\xcah\x9b0\xca8\xa3vU\xeeWk\x96\x1e\x92\ +\x07\xa2\xae\xbb~\xea\xeb\xaf\xc1\x06\x0bE\xb1\x0a%\xe0\ +\x04\xb2\xe4*\xeb\xaa\x9b\xb0F:\xe7\x8d\x94N{\xa9\ +\x96\xb8\xee\xd9\xdc\x97$j\xcbm\xb7\xa3\x1cp@\x0d\ +\xe0\x1e\xa4\xc3\x05\x06\x90[n\xab\xe7>\x1a\xa7\xac\x93\ +jxg\xb5\x5c\xee\xd9\xe9\x90\x09\x06zo\xb0\xfa\xea\ +\xdb@\xbf\x04\x85\x10\x8a\x01\x1c\x0b\xbc\xaa\xa2\xcb:\x9a\ +.\x8d\xeb\xd2j)\x8f>\x9a\x87\xad\xa7\xbdNLq\ +\xc5\x07\xb4@\x02\xc6\xc4\xac\xc1\xf1\xcd\x1e\x9b+2\xa4\ +$\xcf\x8a#\x96\x97\x8e7\xa0^!\x1e\x181\xa8\xc0\ +\xe2\x0b\xb3\xbe\x88\x1c\x90\x0c\xb8b\xaca\xf3\xcd\x1d\x0b\ +\x0c\xf2\xb9\xcd\xf2\xec\x1bp\x09W\x1a\x9e\xd0\x9bZ\xf6\ +p\xbd-\x87\xaa\xf4\xd2\x88\xa4\x8d\x88\x8ahR \xb5\ +\xd4TW\x9d\xec\xd5;?+)\xbb\xa8I\xe0_\xd0\ +\x0c\x0f\xff\xbd\x9c\x81\x7f\x96-\xe8\xd90\xab\xad\xb6\x1e\ +m\xbf\xfdv\xdc9\xd3\xfd\xaa\xd6w\xdf\x98\xb7\x8e|\ +gzms,K\x9ct\xb7K\x1f`x\xda\x1dX\ +\xb0\xe2\x09&\xcc\xa08\xdcT7\x1e2\xba\x90\x87\x16\ +\xed\xe4\xb6\xf6\xdd\x95\xc3\x22\x82\xa9\xf9\xe6\xa3v\xfe9\ +\x22\x1d\xf4\xce\xf6t$\x98 \xbc\xe9\xa73nu\xab\ +u\xab\xbb\x9d\xc9\x94\xaf\xa6'\xd1\x98\x83i\xa4\xcb\xf9\ +\xa2\xfdy\xef\xbd\x97\xc2\x02u\x1b\x84\x22\xfc\xf0\xa7O\ +\x8d\xf3\xc0\x8b&\x9f\xdd\x9cm\xd5\xb0\xc9\x0b\xc1\x80\x90\ +\x81\x07\xff\xdc\x16\xbf@\xe8<\xa1E<\x0c@2t\ +\xd1\xb6#Mx\xc5\xbb\xc3^\x07JQ\x8a\x0eL\xc7\ +\x0c\x17\xf0\xde\xf7J\x17>\xe3\xcdmuY\xa3\xd0o\ +\xd6\xb2\x06=\x90 \x00G\xf1\x800\xa0\x00\x89\xbf\xdd\ +\xe2K\x80\xda\xd6\xe08W\xb8\xeba\x8f\x80\xa5P\xc4\ +(\x8c\xb1\x19j\x80!\x140\x5c \x03\x8b7\xbe\x81\ +Apd\xbe\xa1\x02\x13\xfe\xb2\x80d\xac\xa1v\xf5\xba\ +\xdd\xff\xff\x82\xce\x88\xb64#.\xa7\xf9\x88\xb1\xf4\x83\x0b\ +\xd8\xf4\xe5!\x13y\xca(62\x13,T\xe6@@\ + \x01Y\x121\x93d\x8cf'\xa79\xcd\x17(\xe5\ +\x0d\x05\xc0f6}\x19\xcc\x18\x0e\x13\x95\x01\xabA<\ +\xc4y\xff\x90\x07To\x96\xe8\x04$'\xd7\xc9N\x5c\ +\xda`\x01I\xd1\x83<\xe5\xa9M`\xb2\xb1\x9b\x8c\x9c\ +\xc1\xcc\xf8y\x90F\xac\x00\x93\xcf\x14('\x0b\xcaN\ +\x22\x10\x81_G\xd1\xc4\x0e\x16\xba\xd0\x86r\x13\x8a\x8b\ +\xcb\x04E\x17\xd2\x80sfT\x9d\x8a\xe0(.=J\ +S#\xac\xe4\x15\x9b\xb8\xc0\x05FJR.\x98\xf4\xa1\ +(]\x832VJ\x12H\xd02\x9d\x03\x8d\xa9Li\ +JS\x0d\xacD\x18:\xd5)O{J\xcfz\xdes\ +\x0dN jI\x1e\xf1\xd2\x14nt\xa9Le\xea\x12\ +R\xe2\x88\x02D5\xaaS-)=\x81Z:\x19\xe4\ +B\xab%\xc9\x034\x07*S\x04\x845\xac\x8aH\x09\ +\x052\x91\x89\xb3\xa2\xb5\xa7>\x1d\xa5UM@\x86\xb7\ +\xc2\xb5$\x0e\xd0\xa849zW\xa6r\xe0\xb1\xd1@\ +\x09\x18\xf8\xcaW\xbf\xee\x14\xb0ku\x22'\x0e{\x12\ +jT\xc1\xab\xb7dlc\x89\xf0\xd8\xc7\xa6\x01\x01\xa6\ +\x22I#(KY\xcb^\x96\xa4U\x85!\x18\xde\xc0\ +\xd9\x93\xffx@\x17\xa1-\xe8hI[\xda4\xf86\ +\x0d\x9b0\xc9dY\xdbZ\xcb\xa6u\x9e\xbf\xe4\x82\x0e\ +j\x9b\x12D\x10\xb4\xa3\x8d-\xadi\x7f\x9b\x06E\xd0\ +v!@(@\x1f\x88\xcbZ\xe3Ru\x94J`n\ +J\x92\xa1T\xe8F\xb7\xb7\xd4M\x032\x90\x81\xb8\x85\ +\x1c\xa1\x00\xf0\xdd.w+\xeb\xd7\xe3\xfa\xd4\x9d\xe2M\ +I\x01t{\xde\xe9Rw\xbd\xeb\x1d\xc5B4\x01\xdf\ +\x02kW\xbe\xdc\xb5,I\x8f\xd0\x8c\xfc\xaa\xa4\x013\ +\xed/\x07\xd2\xab^\x00\x03X\x0b\x0a\xf9\x81\x817\x8c\ +`\xe2\xd6W\x9eCp\xb0J\x9e`\xd7\xbbJ\x97\xc2\ +\x16N\xb1\x1b\x12\x12\x000\xb8x\xc3\x06\xeepw\xcf\ +\xba\x83\xed\x89X%\xca0\xb1\x7f\x7f\x9b\xe2\x1e#C\ +\x10\x089\x81\x8b\x87\x0c\xe3\x02\xcb\x98\xbe:e\x804\ +n\xbc\x92\x15\xd0\x14\xbd\xff\xf5q\x8a\x19\xe1\x9e\x83\xcc\ +c\xc8X\x06C\x91\xb5;_\x9d\x86\x97\xc9*Q\x03\ +o'\x9c^)[\x98\x11hf\xc4-\x0e\xb2\x80,\ +\xbby\xff\xcbG\xce\x02\x98\x8f\xd2\x002G\xd9\xcc\xc8\ +H3\x9a\x15\xa0\x00+\x18D\x0c\x0c`\x00\x15\xdc\x9c\ +\xe5\x22wX\x13s^\x89\x11\xeelf=3\x82\xcf\ +\x90&\x83A\x12\x11\xe8J\x0f\x9a\xd0/.r&\xbe\ +\x95\xe8\x95\xb4\xa1\xc2\x8d\xd63\xa4G\xad\x80?\x14$\ +\x01\x95Nu\xa0/\x8di\x18\x7f\xa0\xd3+I\x06\x9e\ +EM\xeaZ\x17\xe4\x03\xaa\xce\xb5\xa01\xade\xf8\x1e\ +\x81\x17\xb0^\xc9\x01z\xec\xe8Z\x93\x1a\x0b\xc8.\x88\ +\x1a\x94\xa1\x0c]\xe7\x9a\xd5n\xb6i\xb0U2\x883\ +\xa7\xd9\xd8\xa3F\xb6\xb6\xb1`\x02\x828\x81\xd9\xe0n\ +\xb6\xb3-\xed\xe6i\xafD\x10y\xbe6\xb6\x15\xb0\xed\ +vc\x01\x11\x03yC\xb8\xe7\xcd\xecq\xaf\xda\xc5\xa2\ +3\xb7J\xaa\xf0\xe8u\xbb\xfb\xdfX\x18\x88&\xe8M\ +pq\x8f\x1b\x10\xfaV\xc9\x14\x8c\x0d\xf0\x86c\xa1\x11\ +\x02\x11\xc3\x03&^p\x82\xeb:\xe1*1C\xb6\x1d\ +\xdepK\x1cA /\x99\xb8\xc8\x1fPqz\x07\xba\ +\xca\x18\xffG\x89\x068\xfeoK\xb8\xfc\xe5\x00X\xe6\ +\xc8g.\xf2\x923{\x87)G\xc9\x11X\x8e\x85\x97\ +\xfb\xdc\x12\x02\x08:\x02\x04B\xf3\xa2\xcf\x9c\xe0#\xc9\ +\xf9I\xc4\xd0\xf1\x9f\x03=\xe8P\x87\xfa?\xcc\xc0\x89\ +\xaa\x1b\xfd\xea5\x1f\xaa\xd2Q\xb2m\xa7G\xfd\xeb`\ +\x07\x81\x15\x8ep\x84\xaa\x9b\xdd\xeaX\x1f\xb9\xa4\xb7~\ +\x12D\xf8\x1c\xecp\x87;\x05\x00A\xf6\xba\xdb\xfd\xec\ +f7:~\xd9\x8e\xd8\xb8\xfb]\x00\xc5\x08<7\x06\ +_\x04-\xd8\xfd\xf0\x88/;\xde'\xfeI\xbe\x97d\ +\x18\x7f\x0f|1\x06O\xf9\xca\x0f\xbe\x00\xc9\xd8D\xe2\ +7\xbf\xf9'8\xbe$#\x80\xba\xe0-O\xfa\xd2\x1b\ +\xe0\x05\x9bH\xbd\xeaW\xafy\xce\xd7=\xc4\x9f'I\ +\xe9gO\xfb*\xe8\x81\xf5\xb8\xcf\xfd\xea\xc9\x1e{\x92\ +l\x80\xf6\x94G\x85\xf0\x87O|\xe1\xdf\xa2\x08\x04H\ +\xbe\xf2\x95\xaf\xfb\xdc'\xa0\xf7\x0aY@\xf1\xa7O\xfd\ +\xe9#b\x10\xcb\xcf\xbe\xf6\xb7\x9f|\xf9A\xff \xb2\ +\xa8\xbe\xff\xf8\x85\x1f\x81\xf2\x97\x9f\x08\x83\x18\x86\xfa\xd7\ +\xcf\xfe\xf6\xbb\x7f\x18\xc9\xff\xbeB\xccO\xff\xfa\xdb\xdf\ +\xfe\xc8x\xbf\xfe\xf7?H\xf9#\xe4\xfe\x00\x18\x80\x11\ +\xc0\x7f\x04\xc8~\xfe\xf7\x7f\x02\x98\x80\xe6\x97~\x05\xa8\ +\x7fN\xf0\x80\x07x\x10\x0a\xa8\x80\xc8p\x09\x0fx\x81\ +\x18\x98\x81\x1a\x88\x81\x11h\x10=\xf0\x81 \x18\x82\x22\ +8\x82 \x98\x06\x16\xb0\x81\x1b\x98\x05*\xb8\x82,\xd8\ +\x81\x05\xc1\x0a0\x18\x8328\x834\x18\x83\x8a\x10\x0f\ +,\x98\x83P\xb0\x83<\xd8\x83>\x08?.(\x105\ +8\x84D\x08\x0a#\xe0\x83H\xb8\x83\xf3\xb0\x84\xf3 \ +\x03N\xf8\x842\x00dA\xd8\x0f\xdfP\x85Vx\x85\ +\xdf@\x842(\x01\x8d\xc0\x84K\x08\x85`\x18\x862\ +\x90\x08d\x18\x02A\xf8\x0f/\x80\x85j\xb8\x86X\xc8\ +\x0a%p\x02b\x08\x86d8\x87t8\x87\x13\xe5\x82\ +\x9c\xa0\x0a\xc0\xb0\x87\xc0\xc0\x86~X\x85\x90\xf4\x84u\ +8\x88dx\x09\x86x\x09E\x90\x88E\x00qA\xb8\ +\x05\xaa\xff\xf0\x88\x90\xf8\x88|\xb8\x87\x7f\xf8\x0d\x89`\ +\x0c\x84X\x88\x87\xa8\x88\x9c\x98\x04\x9e\x98\x04\x99\x11\x84\ +D\x10\x89\xa4X\x8a\x93H\x89U\x08\x03\x0b\xa0\x89\x9b\ +\xc8\x89\x89\xf8\x89\xb0\x98\x04\x160\x8b\xbd\xe0\x824P\ +\x07\xa5\x98\x8b\xba\xa8\x87\xc0\xf0\x04\xbd\xe0\x8a\x8a\x18\x8b\ +\xb08\x8b\xc48\x8bz\x90\x01AX\x0f\xf5P\x07\xcc\ +\x88\x8b\xbb\xb8\x8b\xbb\xa4\x07E \x8c\x9fX\x8c\xc5\xa8\ +\x07\xd8\x98\x8d\x08\xd7\x81\x0c\xa0\x8c\xde\xb8\x8c\xcd\xe8\x8c\ +\xcf\xa8\x0a\xa2 \x100\x10\x8b\xd6x\x8d\xd9\x88\x8dK\ +\xb0\x04?\xf0\x03\x85\xd2\x81\xa3\xf0\x8d\xf4\xa8\x8c\xe1(\ +\x8e\xa4X\x05\x02A\x02\xe9H\x8c\xeb\x98\x8d\xed\xf8\x8e\ +\xef\x18\x0f\x04I\x0d\x11\xe8\x05\xf5\x98\x90\xdex\x8f\xe2\ +\xa8u(`\x8d\xff\xc8\x8e\xee(\x90\x04Y\x91~\x90\ +\x02~v\x80z\xa0\x90\x1c\xf9\x8d\xe1\xf84\xff\x90\x00\ +\x11)\x91\x02\xf9\x03\x15i\x91)\x90\x92)\x80a\x07\ +\xa8\x01\x18\xf0\x92\x1d\x19\x93\xf5@\x10S\x00\x90\x13I\ +\x91'\xff\x19\x0f\x17\xa9\x92S\xd0\x93S`\x90\xf2\x87\ +\x0e/9\x940)\x93\xf4X\x8e\x03\x11\x0c79\x90\ +9\xb9\x93<\xe9\x93S\xf0\x02/\x00\x02\xfe\xc7\x09D\ +y\x95\x18`\x94\xcaX\x02\x04\xb1\x01L\xd9\x94*\x99\ +\x92P\x19\x95R)\x95 \xf9}\x0a\xa0\x02*\x80\x95\ +W)\x93{\xf7\x0f\xb2\x90\x93:\x19\x96)0\x96e\ +)\x95#\x90\x97#\x00{\xbd7\x02h\x80\x06j\xb9\ +\x96l\xd9\x96\x09\x89\x03\x05\xc1\x02sI\x97vy\x97\ +/\xa0\x97z\xc9\x92\xbd\x87\x08\x7f\xf9\x97\x81)\x98\x83\ +9\x94\xdf(`\xb7\xa6\x98P\xc9\x98\x8d\xe9\x98#\xa0\ +\x06\xa2\xa9\x06\xcb\xd5{\xab\xb0\x0a\x93I\x99\x81y\x99\ +m\xf9q\x05\x11\x00b\xb9\x98w\x09\x9a\xa19\x9a,\ +\xc0\x02F\x00\x0b\xb1\x87\x08\xa7y\x9a\xa9\xa9\x9aj\xc9\ +\x9a/\x89h\x06\x91\x0c\x9d\xc9\x98\xb4Y\x9bjp\x9b\ +\xb7\x99\x0c\xc9\x80\x8c\x8e\x97\x02\xbb\xb0\x0b\xbd\xd9\x9b\xbf\ +Y\x99\x97Y\x0a\x08\x01\x02d\x89\x9c\xb4i\x9b\xcc\xe9\ +\x9c\xc9\xff\x00\x03Z\xf0\x0a\x8e\xc7\x0d\xa7p\x0a\xd3Y\ +\x9d\xbe\x99\x9a\x95i\x99C\xb9\x07\x08A\x0d\xde\x09\x9a\ +\xa3\xb9\x9c\xe1\xe9\x9c0\xb0\x9f\x8d@\x95l7\x07\xe9\ +\x19\xa0\xeb\xc9\x9e\xbf\x09\x98\xd8\xf9\x92\x0a!\x06x\xf9\ +\x9d\xe0\xd9\x9c\xfa\xc9\x9f\x8d\xd0\x08\x14\x80A[\x17\xa0\ +\x16\xaa\x9e\xd4I\xa0\xd7Y\x99\x13\xa0\x10\x82\x90\x9c\xf7\ +\xc9\x9c, \x9e\xfb\x09\x03\x11*\xa1\x14@\x01\x9fP\ +\x0bJW\x06\xb1\x10\x0b\x17\x9a\x9e\xcc0\xa0\xd5Y\xa0\ +\x81y\x96\x08\x01\x03\x8e\x19\xa2\xf99\x9e%z\xa2)\ +\xaa\x05BJ\x9c\x18W\x03\xef\xf0\x0e/\x0a\xa31:\ +\x9d\x19Z\xa3\xbf\xc9\x08$a\x05y\xc9\xa3\x0e\xfa\xa0\ +&\x1a\xa1)J\x01B\xca\x04F`\x04\x86\x89q\x22\ +p\xa4H\xfa\xa21\x9a\x9e4\xea\xa4\x7f9\x0f$\xd1\ +\x0c,\xd0\xa0#J\xa2\x10\x8a\xa2Z\xba\xa5F \x06\ +bp\x02\xcfgn \xa0\x02\x22\x10\xa6G\x9a\xa4J\ +\xba\xa4MZ\xa3\xc0@\xa1\x0b\xf1\x04\xf8Y\xa5>z\ +\xa5X\xff\x1a\xa4Z\xc0\x04\x5cj\xa7\xc1p\x02\xfd`\ +\x0b\xe6\x86\x05}\x9a\xa9b\x0a\xa8e\x8a\xa1\xec\xb9\x0a\ +*U\x12\xb8\x90\x0c\x8aZ\xa2\x8c\x9a\xa5B\xfa\xa8]\ +*\xa9' \x0c\xc2\xe0\x09,\x0ak\x07P\x01\x99\xaa\ +\xa9\x7f\x9a\xa4\x9d\xea\xa9\xa7Y\x07(\xa1\x09\xe2\xb9\xa8\ +\xa7\x8a\xaatj\xa7b0\xa9\xae\x0a\x04>\xe0y\x9d\ +\xd6\x0a\x15\xd0\xac\xb5\xda\xa7b:\xa6dZ\xa63J\ +\x9d\x05\x80\x12\xcd\x00\x03\xc0z\xa2r\x9a\xaa\x5cZ\xa7\ +\xacz\xac>\xd0\x0f\xfd@\xa4L\xf6\x07\xcd\x9a\xae\xcf\ +\x0a\xad\xb7:\xade\xba\x0b\xdf\xa0\x12\x1b`\xaa@*\ +\xac\xaa\x0a\xae\x93\xda\xaa\xc2\x80\xac\xe4\xda\x0f$\xa0\x09\ +\xb1*b-\x90\xae\x04\xbb\xae~\xda\xae\x81z\xa1Y\ +\xa5\x12b\xc0\xa8\xdd\xba\xa5\x91\xca\xaa\xfa\xca\xaf\xfd@\ +\x0c$\x00\x08\x80\x00\x02\xde'^\x1d@\x08\x04[\xb0\ +\x06\xbb\xa9\xb8z\xa1ip\x148P\xaf\x8ez\xaf\xc4\ +j\xac\xe2J\xae\x16\x8b\xb1J\xe0\x02RP\x8b\xcc\x05\ +\x02\xdc\xff@\x0a\x84\xe0\xb1\x1f\xab\xae\xeb\x1a\xad\x9c\x1a\ +\xa0I\xa1\x04Y:\xa7\x8f\x1a\xb1\xc5z\x02\xfa*\x0c\ +>0\xae\x15{\xb1\x18\xeb\x02.\xe0\x09\x1f\x00\x84\x87\ +5\x05\xb1@\x0aX\x9b\xb3;\xcb\xb3\xcf\xea\xb3#\xeb\ +\x0eI\x81\x0bZ@\xb4*+\xb1\xe2\xca\xb4/\xfb\xb4\ +Q+\xb5O \x081\xa0U\xb2P\x02X;\xb79\ +\xab\xb3[k\xb0\x07\x0b\xa8uP\x9aH\x81\x0e\xde\xfa\ +\xad+\x8b\xb4g\xeb\xb2$\xe0\xb4P\xeb\x09R\xfb\x01\ +O\xf0\x04V \x0b+E\x02\xc8`\x0a\xbf0\xb7Y\ +k\xb7w\x1b\xb2\x22\x9boI\xe1\x0b.P\xb4\xe0\x1a\ +\xae\x83\xdb\xb4\x86\xbb\xb6\x1f\xa0\xb8O\x00\x02 \xa0\x09\ +8\x00l\x18\xc3\x03k`\x0a\xb0+\xb9\x94\x8b\xb3\x96\ +\xbb\xb3x\x1b\xad\x173\x16M\x10\x0c\xabj\xb6\xa1k\ +\xb1\xa3\x8b\xb8\xa5\xbb\xb8\xa8\xab\x09\x9a\x10\x02\x1b`\xa8\ +\x86R\x0b\x16P\x07\xa9\x10\xbb\xb0;\xb9\x94\xab\xb5[\ +\xeb\xac\xb7\xcb\x0af\xc1\x07\x9f\x9b\xaf\xae\xba\xafKK\ +\xb8\xc1\xff\xeb\x09\x87`\xba\xc5{\xbc!`\x05V0\ +\x04\xd40\x0bK\xf2\x05,\x80\x0c\xa9\x10\xbf\xcf\x1b\xbb\ +\xd2;\xbd\xb5k\xbb\x06\x0b\x03\x7f\xb1\x01\xbe\xeb\xbdh\ +[\xb8j\x8b\xb8\xe3K\xbe\xa9{\xbc\xe8\xbb\x01\x1b`\ +\x0c\x19\x90\x00\xba\xf9\x1e\xb3\xc0\x017\x10\xc1\xf2\x0b\xbd\ +\xb2;\xbb\xd4[\xbd\xb4\xfa\xac\x03\x10\x18\x87\xc0\xbd\xae\ +\xfa\xbd\xe0\x1b\xc0\xc2K\xc0\xc6\x1b\x02\xe7k\x05\x08l\ +\x0c(\x80\x02\x19\x10\x00\xe6\xb9\x19\xb3\x00\x0b\xb00\x0b\ +\x11,\xc1\x13\x0c\xbd\xf5K\xb7\xf7\xfb\xb1\xb5\xbaf\x81\ +\x91\x0b\xfd\xd0\xbd\xc8\xca\xb4\xa2\x0b\xb3\x87\x9b\xb8\xc4[\ +\xc0&|\xc0\x09\xac\xc2(0\x04\xe8\x90\x01\x86@\x0d\ +\x01;\x16\xbe\x00\x0b1\xf0\x05_\x00\x0b\xbe@\xc35\ +,\xbf\xf3K\xbf\xb3K\xbb\x18l\xbd\x01\xd7B>\xe0\ +\xbf\xfd\x0a\xbcFL\xba\xa6+\x05\xe5\xbb\xc4(\x9c\xc0\ ++<\x04P\x9c\x01\x82 \x08:\xc0\x07o \x0d\xac\ +\xab\x12X\xcc\x0b\xb5\xc0\x0b\x84\xac\xc5\x5c\xec\xc56\x1c\ +\xbf\x14\xff\x9c\xc3\x95\xbb\xc3\x04[\x07f\x88\x1b\x010\ +\xc4k\x0c\xc0\x80\x10\xb3k;\xbe\x8b{\xbaJ|\xc2\ +)\xec\xc4v\x8c\xc7\x82\xe0\x05:\x80\x038\xb0\x00\x0b\ +@\x0eo \x0b\xb6\xe0\x0a\xbc\xb0\xc5\xbe \x10\xb1\x0c\ +\x0b_ \xc8\xaf\xe0\x0a\xea\xe0\x0a\xae\xf0\x0a\xaf0\xc8\ +\xbc\x90\xc52\xdc\xc55|\x03`\xbc\xc8c\x5c\xb7e\ +,m\xb9\x81\x03D\xcc\xc6\x97|\xc4\x03\x9c\xc4%|\ +\xc2(l\x0c\xa0|\xc7yL\xca\xa6\xbc\x00|\xc0\x07\ +4@\x0e\x1e\xe0\x01\x01\x10\x00o\xf0\x06\x09\x90\x00\xd4\ +@\x0d\xb2\xd0\x0b\xb8\x80\x0b\xb6`\x0b\xcd\xa0\xcb\xbc\xec\ +\xcb\xaf\x0c\xcb\x88\x9c\xc8a\x1c\xbd\xc7|\xc1\x1f\xdb^\ +\xd4\xa1\x03!\xfc\xcck\x8b\xc4\x9cl\xbc\xe6\xcb\xc4\xd6\ +\x5c\xc7\xd8\xac\xc7\xa5\x8c\xca\xdd\xfc\xcd\xe1<\xce\xe5|\ +\xce\xe9,\x0b\xb2\xd0\xce\xd2\x00\xcf\xb9\xb0\xcb\xbdL\xc8\ +\xf5,\xc3\xb3p\xcf\xc5\x8c\xc3\x8cL\xbb\xf7+\x03+\ +\x92\x01\xce\x0c\x08GL\xd0\x05}\xd0s\x9c\xd0O\xbc\ +\xd0\xda\xff|\xca\xdc\xcc\x07\xe4\x00\xce\xe2L\xce\xe6\x8c\ +\xce\xea|\xd1\xb8\x90\xd1\xcd\xb0\xd1\xbb\x5c\x0b\xbe\x0c\xcc\ +\x87<\xcc\xc4|\xc3b\xbc\xcf\x96\xfb\x00h\x22\x08N\ +\xcb\xd2\x03=\xbc\xd2l\xbe\x9e\xdc\xc4\x0a\x1d\xc5\xd9\x5c\ +\xca6\xdd\xcd9\x1d\xd1\xcd\xdf\xc4-\xd4\xe3m\xd4\x8a\ +\xbd\xc5\xe6\x8d\xcf\xaf-\xbbs\xc0Yo\xa0\x09\xd5-\ +\xc7\x9bM\xdfy\xdc\xd7\xdb\xfd\xd0\xf8-\xd8\xdf\x8d\xe1\ +\xa6\x0d\xcf\xba|\xdc\x1c\xbe\xd6lM\xe0\xcd]\x0f8\ +\x0aW\xae\x80\x02\xf1\xcd\xc4Z\x8d\xdd]\xfd\xd9.^\ +\xe11\xde\xdf\xfe\xad\xd1\x00\xee\xd1\xab\x1d\xcc\xf7\xbc\xd4\ +n\xad\x01_\xca\x5c\xbe\xe0\x01!`\xdd\xba\x8d\xdd\xbc\ +\xfd\xd9\xdc\x1d\xce\xf9m\xe1\xe9,\xe3K\x8e\xd6\xa9\xed\ +\xd1\xe5\xdd\xc5Q\xee\xda\xa6\xc0\x0c\x97\xf0\xc7\xf9\xe5\x0a\ +\x91 \xc7\x08<\xe43\xdd\xd9\x9em\xdf`\xad\xd3a\ +\xce\x03d\xad\xce\xc4]\xdc\x1b\x9e\xdc\xca\x1d\xe5R\x9e\ +\x0a\x0d\xff \x85`\x96\x00\xc6\x90\xd7\x9c-\xe1,\xfe\ +\xd5{.\xd6<\xed\xe7>]\xd6e>\xde\xe4\xfd\xe4\ +\x87\xbc\xe6\xa9P\x0c\xf1\x08k\x1e`\x0c\x10N\xe4\xf5\ +\xdd\xe2\xbf\x0d\xdc\x95\xfe\xe7\xa5\x9d\xe9\xba|\xe6\x1d\x0e\ +\xe5Q\xfe\x0e\x04\x90L\xe6V\x0b|`\x0ezm\xc7\ +x>\xe1\x14N\xe9\xe5l\xe9\xe9\x8c\xe9A\xfd\xdf\xa9\ +\x1d\xe0\x1e\xbe\xdc7P\x01\x5c\xb0K)W\x0b40\ +\x04\x5c^\xe4z\x9e\xea\xc0\xfe\x06\xc2N\xd8\x19n\xec\ +\xf3\x8c\xec\xb2^\x01\xa1\x80Pl\xc7\x0b\x01\x80\x0e\xbc\ +\x9e\xdd\xa4l\xe4.\x0e\xe6\xe3\xbc\xea\x97>\xdc3n\ +\xe6\xbcL\xde\xf5\x9c\xec\xb3\xa0\xbc|\x07\x0b\xd4`\x08\ +\xbd\xee\xd5\x92\x8e\xd3|\xde\xee\xc1\xce\xeaJ.\xe85\ +\xde\xedNn\xc8\xec{\x80\xaf\xf0\x06f\xe0\xd9^~\ +\xe4\xec.\xd8\xd9\x0e\xde\xf1N\xd4\xc7\xee\xe43|\x86\ +\xf1\xf3\x06\x86\x10\xf1\xd6.\xd6\xde]\xf1\xf0^\xe6\xf2\ +\x8e\xdc\xaf\x1c\xcb\x1c_\x10\xbc\x80\x0d\x01\xc0\x07\xbe\x0d\ +\xd8\x13@?\xf2\x04\x1f\xe8\xef\xcc\xe4\xbb\x9c\xf2+O\ +\x12\xbc`\x0b\xd4\x10\x00\x1e\xf0\xe20N\xf2\x05\x9f\xd1\ +\xb6\x10\x08\xbf\xdc\xc0;\xaf\x121\xf0\x0a\xcd\x80\x0b\xb2\ +@\x0d\xe7l\xe9\x14]\xdaM\xd0\x0c\xcep\x0dI\x9f\ +_\x01\x01\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\ +\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\ +\x83\x08\x13*L\x88BI\xa3x\x83\x1e\xec(Q\xc2\ +\x01\x04\x08n\x1e=\x9a\xc3\xc0\x89\x9ed$\x8c-\x1c\ +I\xb2\xa4\xc9\x93(S\x1e\x044\x22Z\x0d\x00\x00\xb6\ +l\x81D\x93\xe6\xc5\x8bUr\xe6\x94\xc0S\x82;w\ +n\x18\xf8\xe9\xa7\xb2\xa8\xd1\xa3H\x11\x06\xe8\x97\xc4\x84\ +\x9b\xa7Oa\xca\xaci\xf3\xa6\xce\x9d=\x7fj\x9d0\ +\xc1\xcd01I\xc3\x8a\x1dKP\x10\x8b\x02\x0e\x1c\xd0\ +\xa2\x055j\xcc\x99ToB\xb8\xda\x93\xa7Vw\x5c\ +\xf3\xb6ic \xc5\x10\xb2\x80\x03\x8f$\x97,\x93\xc6\ +Gi\xd7\xb2\x85*\x15nM\xb9t\xeb\xde\xcd\xcbu\ +\xaf\xe5GS\x16\x08\xde\x1c\xf8\x95\xa7,\x94(\x1dF\ +\x9cx\xb1[\x99\x8e!A\xd6Y\xd7\xe7V\xca\x96\xf7\ +6\x98}\xc1\x07\xe7\xdbGeQ\x18@1\xf4h\xd2\ +k\xdb6N\xbd\x1a\xab\xdd\xc9zc\xcf^\xde\xa0\xca\ +\x08\xdc\xd0K\xf2\x18\xb1\xa6F\x0d\x8a%D\x8f.-\ +\xfc-q\xab\xac\xb3\x22\xff\xaf\xac\x9c\xf9\xec?\x13\x92\ +\x04\x88\xce\xbe 5\x163\xac[\xc7\xee\xfbpZ\xb5\ +\xa6\xdd4\x8e\x0b\xde\xb8\xeb\xd7\xe4Yf\xdey\x7fh\ +\xd0\x80\x05o\xb4\xc7\x9e\x16\xa1\x18`\x80|\xf3e\xa7\ +\x9d}\xf8u7\xd5c\xfdU!\x19\x80\x01\xb61`\ +\x03\x7f\x84\xa8\xc1\x88m\xbc\x90\x8b\x82\x9c\x81P\x80\x83\ +,BH\xdf\x84\xc0\xe5\xb7\x1f\x868\x85w\xdcO\xb0\ +\x95g\x9e\x88#j\x90C\x0e\x10\x10\x85\x22`E\xac\ +\xb1\x06\x8b\x0eBx\x9d\x84\xdbU\xc8\xd8[\xfc\xd5\xe8\ +\xdfx\x13\xc4\xe6\xe1\x8e<\x8e\x98\x83.\xba\xdc\x92\xc9\ +\x90b\x011\x80\x91F\x22\xf9\xa0|\xf45\xe9\xa4~\ +P\xd28\x97\x8d\xff\xe1\x95\x9cl\x03f\xe9\xe3\x96]\ +\xde\xd2@2_\x80iT\x223\x90Y&\x92.\xf6\ +\x06#w\x8c]X\x95\x94\x1a\x8a\x87\xe3\x9cWb\xd9\ +\xa3\x8f\x5c\xdeb\xe91\xad\xcc\xe1gJ \x5c`\x82\ +\x09\x81\x0ajf\xa1\xf5i\x84\xe8i\x8e\x15\xd7h\x9c\ +9\x0a\x88e\x81Zr\xff\x99\xe7-\xad\xd4\xda\x86m\ +\x9b\x92\xc4\xc2\xa7\x9f\xce\x10*\x99\x84\xa2\xd9[\x93\xc1\ +=\xa9\xa8\xaa\x8e\xca\xd9\xe1\x87v\xe2i\xe9-\x98\xd6\ +*\x87\x1c\x89\xe4\xba\xd0 \xa1\x84\xc2+\xa8\x82\x1e\x19\ +l\x84\xa5\x02ga\xaa\x19&\xdbj\xa4\xcb\x85\x08+\ +\xa5\xb3F+-(\xa0\xac\xb1\x9e\xb5\x05\x99\x01F\xb6\ +\xd9n\xfb\xeb\xa0I\x0a\x9b\x1d\xb1\xa6\xcd\xa8Z\xb97\ +*[\xa5\xab\xcc5[\xa9\xa5\xb5\xbe\x0bo\x0b\xee\xa0\ +@\xef@V\x5c\x80/\xbe\xbc\xfa*\xea\xb7K\x96z\ +\xaa\xc0\xc5m\xf8\xe8\xc1t&\x9c\xa5\xb3\x976<\xed\ +\xc3-\xb4\xa0\x01 \x13\x03\xc2\xc5\x00s\x5c\xacm\xc6\ +\xddrl\xe8v\xc5Ful\x7f\x22\x9f[\xe7\xba\xec\ +>\xab\xb2\x1c,\xb7\xbcB\x0b0X+\xcc\x00P\xd3\ +l\xb3\xbe\x1b\xb7\x18\xe1\xbf\x14\xca\xa8\xe8\xc0o\xae\xfa\ +\x9f\xd0\x92\xc6:k\xc3\xad \x0dJ\xcbJ\xaf\xa0\xf6\ +\x0b\x9b\x1a1s\xd4R_\x9c\xf1\xbe:3i\xea\x9a\ +RE\x09'\x87\x08\xa7\xffK4\xca\xee\xae|v\xda\ +j\xab\x1d\x0f\x98ns\xf16\xd4s\xd4,w\xaf9\ +[\xbd$\xd6\xa6\xf6\x9c7\x8d6\x8e\xa7\xa3\xdf=\xa2\ +L\xab\xb4f\xa3\xddB\xe1\x85\x8f\xf2\x03\x8a\xc2(\xae\ +:\xdc\x8ec\x8c3\xb0\x92wL\xac\xb1\xe4vm\xee\ +\xb2&w\xbe\xf0\xe7\x0e\x8bN\xba\xda\xa3\x04\xcf6{\ +J\xec\xa0\xfa\xeaQ\xb7\x9eo\xaftK\xbe\xf3\xdd\x01\ +\xb7\xc9u\xe6#\x93<\xb4\xeey\x06\x9e\xf4\xe8\xbf\x07\ +\xef}2\xd1\x19\x93\xc9\x05\xc6\x1f\xbfx\xdc\xaes\x0b\ +{\xbf\xe0f\xcd\xd6\x1aP\x8c \x8c&\x82\x1c\xe4A\ +\x06 \x881\xc5\x03\xb4\xb4\x1av\xd1\x0c\x03]\xd2~\ +\xb7\x02\xef\x19\xd0\x05\xb8Y\x00\x18.\xc0\xc0\xf2\x1d\x8f\ +uS\x83\xdc\xfa\xce$\xbb\xc3\x0c\xe0\x07J8\x8a\x0f\ +\x12\xe1\x80\xbe\x81h](;\xda\x00\xbbg\xc0\xe0\x1d\ +\xa0\x15\x12\xe3\x0c'\x18\xc8B\x07\x22\x8fq\x8f\x03U\ +\xf3(\xd8\xb1\x07\x88\x81\x1c\x80iD(r'\xb6\x94\ +\xf5\x8ep\xa5+\xe1(\xff\x0e@\xc4\x06p&\x09\x99\ +\x18\x1f\x0b\x1bh>\x08\xa6o\x86\x14\x1c@2hp\ +\x9b\x05\xa4\xa0\x0a\x1f\xd4\x9d\xd1~\xc8=\xd2\x09q\x88\ +D$\x22%\x04\x03\x83$\x9aq\x89\xe4k\x22\xe3\x94\ +\xf7:~\xd5\x80\x010k\x8f\x18(\x81\xbd\x00\x96\x0d\ +i\xbe\xf3b\x09\xc3\xc8\xc7\x038\x010!0\xa3 \ +\xd1\xe8\xc2\xc5)\xeff\xea\xf3\x16\x03\x9e\xe0\xa7~8\ +\x80R>,\xdb\x08\x83h\xc0>\x86\x11\x11\x88\x10\x06\ +Y\x1eP\x00A\x9eq\x89\x85L^\x0c\x7f\xb5\x03\x5c\ +\xe5\xaa\x11\xee\xc8\x93\xca&\x09\xbc=Z\x12\x93\x98<\ +\x06\x0e\xc3\xa2\x87\x02\xd8\xb2\x0f\x9eTb\x0b\xd5\x88>\ +D\x06jx\x13\x93\x85\x0c\xa0\xc5E\x12V\xf2\x95\xb0\ +\xc4d\x0d\xc2\x02\x08[:\x13\x97\x9e$$/\xd9h\ +\x02e\xa4pb\x03\xd1\x04$\xee8\xb8.\xb6\xf2\x98\ +}Lf2\x9f\x83\x14e8\xf3\x9c\xb9\xd4e\x1a\x1f\ +\x08C|M\x01\x9b\x07\xc1\x05\x01\xf0\x08\xc4\x02\xba2\ +\x9c\xe2\xc4d\x07F\x81\xff\x94\x14\x80\xe1\x9f\xe7\xbce\ +.A\xc9N\x18\x0e\x00\x81\xf0D\x88\x16t\x816=\ +\x82\xf3\x92\xf9DD\x07&\xda\x815\x18%\x04\xff\xcc\ +h@\x0b\x00\xcdA\xee\xf2\x85\x03\x00\x83\x0e\x12\xaa\x10\ +c\xb8\xc3\x9bBDf>):\xd1R\x80E%Y\ +\xc8\xa8L7\xda\xd1$\x12\x14y\xc3H\x10I\x15B\ +\x0e7P\xd2{*M&K;P\x8a\xa2\xb6\xa1\x19\ +)\xe9\x07\x03\xa8 S\x8d\x06\xb4\xa6\xeat\xe1 v\ +Z\x92\x1a|\x13\x8c\xf8\x14\xe7P\x8bZTE\x1c\xee\ +$\xb2x\x00\x03\xc6\xca\xd4\xa6\x82a\xa3\x03e\x22\x17\ +\x92@U\x93\xcc\xe0\xa1D\x8c\xa8D)\xca\xd5R(\ +\xe2\xae\x07@\x89\x11\xc6\xcaW\x06\x98\xf5\xacO\x8d&\ +\x0b\xab\xd5V\x93\xd4\xc0\x84Y\x15*]\xebz\xd7\xc6\ +B\xc1$\xd4\x10k_\xf9\xfa\xd7\xc0z4\x0b\xd2(\ +\xecI \x11TX\xb2\x94\xb1\x8dm,\x22L\xc2\x04\ +e(c\xb2|-\xebL\x03\xea\xc9\x07h6%\x0d\ +\x80\xa8V\x17\xdb\xd5\xd0\xff\xda6\x0b$\xc1\xc5\x11L\ +kZ\xd4\x8e\xb5\xb2\xe7\x84&\x18p\xf0Z\x94l`\ +\x05\x07\x88\xe8g\xb9j[\xdb\x22`\xb4#\xe9\x07o\ +\xa7\xeb[\xbf65\xb0\x9e(nJ\x1a\xb1R\xda\xda\ +\xb5\xb9\x8dE\x80x\x11p\xba\x85\x90a\xba\xe8\xad\xae\ +Y\xcf\xa9\x06\xed\xaa\x84\x01\x8a%*s\xc1{\xd7\xf1\ +\x8e\x17\x1a'JH\x08\x1e\xc0_\xf4R\x17\xb5\xaa\xd5\ +(n\xdd\x9b\x92^L`\xae-\xad-}\xed\xcb`\ +&(d\x7f\xfc\xed\xaf\x7f{\x8bZ\xb3f\x80\xc0*\ +\x91\x82w\xe9\xab\x08\x06{\xf8\x11\x0a\x89\xb0\x88%\xec\ +_\xdff\xb4i\x18V\xc9\x11\xe4\xfb]\xf0z\x98\xc1\ +D\x88qB|0\xe2\x1aO\xf8\xb4\x93\xa5\xc2\x11R\ +\x5c\x14j@\xa3\xc5\xcd}\xb1}cL\xe4\x22 $\ +\x09\x9cHr\x8dE|\xe3\xc9f\x97\xc7*I\xc6\x82\ +\x85\x8c\x00\x22[\x99\x08F4\x08\x1f\x8e\xc0\xe5$+\ +y\xc9$\xfe/a\xa1\xac\x12w8\x97\xcaWN\xf3\ +A\x84\xc1\xe56\x1f\xc1\xff\xcb`\x0e3oC@\xe6\ +\xa2\x88!\xbchNs\x9a\xc7<\x10=\xb8\xf9\xcfp\ +\x06\xf3t\x8d\x5c\xe7\xa2\xb8#\xcfz\xbe2\x078\x90\ +e\x82l\xe2\xd1\x9b\xf8\xb3\x9b\x03mce\x80\xa0\xd0\ +E\x81\xc1\x8b\x13\xad\xe8E{\x9a\x0f\x04\x01\x01\xa4G\ +-\xe96\x7fy\xc4d\xc0\xb4QZ0^N[\xd9\ +\xd3\xb0NC\x1aX@\x90d\x10\x80\x00\xa3&u\xa9\ +\xdf\xcc\x09\x11kR\xd5*ID\x95]M\x04X/\ +Z\xd6\xc8N\xc3\x00\x08r\x8e[;\x1b\xd7\xb9~t\ +\xa9\xe1\ +\xf0\x84o\xbb\xe15\xb1x\x93T=\xf2\xa0\x0f\xbd\x02\ +f\xc0\x82D\x98\xfe\xf4\xa6\xbf\xbc\xea1\x7f\xe1\xce\x8f\ +\x84\x04\xa2\x8f}\xdf\xb1\x00\x89)\xa0\xfe\xf6\xb8G\xbd\ +\xe5=\xe0z\x92\xc8\x1e\x0b\xc0\x0f\xbe\xf0\x83\xff\x87x\ +\x14\xe1\xf8\x97H\xbe\xf2\x97\x9f{\xd4S\xa3\xf7#\x19\ +\xbe\xf4\xa7/}\xd3\x1d\xff\xfa\xd8\xcf\xbe\xf6\x8b\xa0|\ +\xe8G\x9f\xfa\xe0\x97\xbe\xff\x22\x96\x90\x84\xf2\x9b\xff\xfc\ +\xe8O\xbf\xf9k\xe1}\x85\x84\xff\xfd\xc1\x97\x84\x05\xe6\ +O\x7f\x0b\xa8\xff\xfe\xe6o\xbf\xfb\xe1\x0f\xff\xfa\xfb\xff\ +\xff\x00H\x7f\xfa\x97\x10\x96P\x80\x06x\x80\x08\x98\x80\ +\x07\xe8\x07z\xd0\x80\x0e\xf8\x80\x10\x18\x81\x0e\xc8~\x03\ +h\x10\x02p\x81\x02\xa0\x80\x1a\x88\x80e\x90\x02\x12\xf8\ +\x81\x12\xb8\x04K\xf0\x0a\x15h\x81\x18x\x82(\x98\x82\ +(\x88\x00/ \x82.\xb8\x04?\x10\x8328\x834\ +(\x83\xb2P\x82\x04A\x03*\xb8\x83\x81\xa8\x08\x11P\x8a\xa6\x88\x89\xa8X\ +\x88\x8d@\x0e\x9e\x08\x8a\xae\xf8\x02#\x10\x8b\xb2\x98Y\ +8H\x0e\xa6x\x8b\xb8X\x8a\xa9H\x88\xff \x0d\xaf\ +\xe8\x8a\xb2\x18\x8c\xc2H\x5c8h\x04\xb9x\x8c\xc7h\ +\x898\xa4\x06\xc0(\x8c\xce8\x02j\x10\x8d\xd1xi\ +8\xa8\x0c=p\x8d\xc8\x98\x8d\xb7H\x04\x02q\x02\xb0\ +\xf8\x8c\xce(\x8d\xe2\xc8\x02,`\x04[\xd8\x02\xac\x90\ +\x8e\xacp\x8d=\xa0\x8d\xc7\x08\x01\x02\xf1\x04\xe0\x18\x8b\ +\xe28\x8e\xe4H\x8e\xc9\x90\x0c7X\x82\xea\xd8\x8f\xe9\ +\xc8\x8e\xeeX\x8a\xae\xf5\x0f\x82\x10\x8e\xf5\x18\x8d\xf7x\ +\x8f\xf9\x98\x8f0\xf0\x17\x15\xf8\x03\xdf\x10\x91\xdf\xe0\x8f\ +\xfd\xc8\x8e\xedx\x8c(&\x0b\xd0x\x90\x08\x99\x90,\ +\xb0\x90\x0c\x09\x03\x22\xa9x\xed\xd7\x00\x12y\x92\x14Y\ +\x91\x00i\x8a^0\x10\x8dP\x8f\x1e\xf9\x91 \x99\x0c\ +\x22Y\x93\x8dp\x93\xfb\xff\xa8\x7f\xaa\x00\x0c\xc0p\x92\ +(\x99\x92\xea\xc8\x8e\x08@\x10\x80\xa0\x061)\x93 \ +Y\x93\x22y\x937I\x01\x14\xb0\x01\x03\xb8\x09\xaa0\ +\x95;\xd9\x93>)\x91@\x99\x8e\xcb4\x10\xe8\x90\x90\ +3I\x93J\x09\x03L\xd9\x94N\xa9\x05'\xd0'\xed\ +\x97\x06T\xb9\x96pMP\xc7\x05\x18p\xa0\ +\xf0\x19\x9f\xc59\x9f\xb1\x89\x0e\x09\xe1\x02\xa4\x09\x9d\xe6\ +\xd9\x9fb0\x9d\xd5\x09\xa0\x01\xda\x0f\x1a\x9a\x00c\xe7\ +\x02\x08\xfa\xa1\x0a\xba\xa0\xdd9\x95\x12\xa0\x10\x86\x00\x9d\ +\xfc\xf9\x9b\x15J\x9d\x17*\x0c\x01\xea\x03\x1a\xda\x0f$\ +\xf0\x01\xbc\x00u\xeb\xa0\x02\x1f\x0a\xa2!j\x9c\xb0\x89\ +b\x08\x11\x03'\xb0\x9f\xd1\x89\x9e\xff\xe9\xa2\x02\x1a\xa3\ +\xc4@\x02$\x00\x08\x04\xbao\x06\x80\x06h\xa0\x028\ +\x9a\xa3\x07\xba\xa3\xc6\xc9\x8d\x0b1\x04\x13\xaa\xa2+Z\ +\xa4/\x1a\xa32\xba\xa4\x80\x00\x08.0K\xfb\xf6\x02\ +\xab\x00\xa5Q:\xa5Tj\xa5\xad\xc9g\x08\xe1\x0a\x5c\ +\xda\xa5-\x0a\x04_\xaa\xa1I*\xa6J\xe0\x02.p\ +\x089imu\xb0\x0ai\x0a\xa5R\xca\xa69j\xa5\ +\x11P\x12\x1b@\xa4-\xffj\xa40\x8a\xa7J:\xa6\ +\x80\xb0\xa7.\xe0\x09\x9e\x00\x02\xae`m4\x80\x0c\x82\ +*\xa8j\xba\xa6T\x8a\xa0!\x0a\x06%\xd1\x0c'`\ +\xa1\x8dz\xa7\x90*\xa6dZ\xa9\x96\xfa\x01\x1f`\x05\ +5\xaaj\xa3p\x0a\xbb\xb0\x0b\x9d:\xa8kj\xa8\x87\ +\xaa\x9d=\xa0\x9a$a\x0cE\xea\xa8\x8f\xda\x0fy*\ +\xa9\x94j\xa9\x9e\x00\xabO\xf0\x04\xc6\x10\x03\x98\xa6\x0b\ +\xa70\xad\xb7\x9a\xab\x9fZ\xa8\xa1\x9a\xa0\xadI\xaa&\ +\xe1\x0a>\xa0\x9e.\xaa\xaaa\xca\xaa\xc9\xea\x09\x87\xc0\ +\xacO\x00\x02 0\x04\xd0Jf\x0d0\xad\xf0j\xab\ +\xd6\xaa\xa6\xd8\x9a\xad\x97\x89\x0a)\x91\x01\xe1z\xa4H\ +\x1a\xa9cJ\xa9\xaez\xae\x1f\xd0\xac\xea\xaa\x09\x9a0\ +\x04\xb3\x9ab\xc7\x10\x0b\xb1\x10\xaf\xd4\x9a\xab\xba\xba\xab\ +\xd9\x8a\x012\xa0\x12J \xa0\xc5:\xae\xc8\xca\xa7\xca\ +\x8a\xae\xe9\x0a\x02\x06\x1b\x02!0\x04$\x88a\x07\xf0\ +\x0e\xef\xc0\xb0\x0d\x1b\xaf\xd5\xda\xa9\xd7*\xa5\xa1\x8a\x00\ +\xb6\xa0\x12\xe4\x90\xb1y\xff\xca\xaa|\xea\xaa\xcb:\xb0\ +\x04\x0b\xb2\x9a \xb2!`\x05\xc60\xb3\xee\x85\x05\x22\ + \x02(\xab\xb2\x0e\xdb\xb2\x9e\xfa\xb2\xbc\xea\xa3)\x81\ +\x091\xaa\xa4\xe4\x9a\xb3\x96*\xb0\xcd\xfa\xb1!+\xb2\ +V`\x05\x1b`\x0c\x1c\xfaZ/\xa0\x02G{\xb4I\ +\xcb\xb0K\x8b\xab\xf3J\xa80{\xa0Up\x14\xb6@\ +\x027\xbb\xb1:\x8b\xb5=\xbb\xb5A\xeb\xb5_k\x0c\ +|\x80\x96TU\x03\x15P\xb6e{\xb6+\x0b\xaf\xcc\ +\xa0\xb6.K\xaf\x85\x9a\xa8H\x81\x03\xfe:\xa6V\xfb\ +\xaa\x1e[\xb0[\xdb\xb5\x1b\xb0\xb7(\x80\x02\x82\xd0\x04\ +;\x05\x08\x1cP\x01\xa0+\xb8HK\xb8\x0e+\xafk\ +\xcb\xb6 \x97\x14\x9a@\xb7:\x0b\xab<\xab\xb5\x95\xab\ +\xb7\xc6`\x0c\x99\x8b\x02C\x80\x0e\x1e\xe0\xb7\xf4b\x02\ +\xa0\xdb\xbb\x81+\xb8(\x9b\xb2h\x9b\xb6\x10\xfb\xa9\x13\ + \x16\xb9\xe0\x09\x93\xca\xb1\x1d\x8b\xaeR@\xb9?\x9b\ +\xb7\x97\x8b\xb9\xb6{\xbb\x19\xa0\x03\xd4@\x99\xb9\xa2\x07\ +\xac@\x08\xbe\xdb\xbb\xa2\xff\x1b\xbcJK\xbc\xf3\xca\x0d\ +\x86\x19\x16\x01\x10\xb9\xe6:\xb9\xd0\xcb\xb5zK\xbdC\ +`\xbd\x82 \x08^`\x08\xb48$\xc9P\x06\xa4@\ +\x08\xde\xfb\xbd\xbf\x0b\xbc\xa4K\xbe.\xdb\x08\x80\x91\x01\ +u\xcb\xbe>\x1b\xbd]+\xbb\xb4[\xbd\xe8\x90\x01\x19\ +0\xbf:\xa0\x038@\x03\xf7\x0b\x1d\xcd0\x05D@\ +\x0a\x1c\xbc\xbf\xfd\xfb\xbd\xa2;\xba\xc2[\xb8\xf0\xca\xb4\ +\xab\xb0\x03\x81\x01\x0bV \xb9\xaf\xab\xae\x09\xec\xbe\x0c\ +\x5c\xbb\xf1\xfb\xc0\xf3\xeb\x05\x14\x8c\x03\x0b\xb0\x00\xe4@\ +\x0d\x09+\x18C\x00\x06\xdf`\x0a\xbf\xd0\xc1\x1c\xfc\xc1\ + \x1c\xbe\x01\x1c\xaf\x87\x8b\xab\x7f\xb0\x19\x81\xf0\x04\xae\ +\x9b\xb5.l\xb0\x0al\xb9{\xdb\xc03\x1c\xc1\xf4{\ +\xc38\xcc\x07|@\x03\xe4\xf0\x06A\xd0\xc3I1\x04\ +E0\x0a\xa9`\x0ajl\x0aD\xec\xc1\xfe\x1b\xbaH\ +<\xc2\xa5k\xab\xc8p\x1b\xb8\x00\xc5R\xdc\xbey\xcb\ +\xc0X|\xbb4\xbc\xc58\x80\xc3\x0b\xe0\xc5`\xec\x01\ +\x1e\x10\x00o\x80\x0b\xae\xff\xa0\xbb'1\x0b#P\x03\ +\xdcp\x03\xa90\xc9k,\xc4m\xcc\xbfo\xfc\xbf\x83\ +\x9b\xc4\xf0\xfa\x0d\xd0\x91\x00y\xfc\xc2{<\xbd\xb3+\ +\xc3\xf2\x0b\xc8\x81\x9c\xc3^L\x0e\xe4`\xc8\x01\x80\xc8\ +o\x90\x00\xd4\x80\x0b\xcd\xf0\x0a\xbc\xf0\x05\xb0\xe0\x0b\xb3\ + \x10\xb30\x0b\xbe\xe0\x0b\xb0\x10\xcc\xc1\xac\xcb7P\ +\xcc\x93L\xc9k|\xc9F\xec\xbb!,\xc2\xe3;\xad\ +\xcc\xf0R\xb8A\x0e\x1f+\xca\x0bL\xca\x0d\xec\xc0Z\ +\x8c\xca\xaa\xfc\xc5\xad|\xc8\xb0\xcc\x03\x09 \xcb\xd4 \ +\x0b\xbd\x80\x0b\xb8`\x0b\xb6\x90\x0b\xae\xe0\x0a\xafP\x0b\ +\xbc\x10\xcf_\x80\xcb\xc4\x5c\xcc\x92\x8c\xccj<\xc4D\ +\x8c\xc9o\xdc\xcc\xe2;\xbc\xa7P^\xd1A\x03z,\ +\xbd\x97;\xbb}\x8c\x0e\x7fl\xc3\x81,\xc8\xab\xfc\xcd\ +\xaf\xfc\x06o \xce\xd4P\xd1\xe6\x8c\xce\xea\xcc\xce\xee\ +\x5c\x0b\xf0|\xcb\xf4<\x0b\xf6|\xcfi\xbc\xc6\xfa\xdc\ +\xc1\xfc\xdc\xcfq,\xc7p\x0a\x1d\x0b@\xc5@k\xc5\ +W\x9c\xb9\xf1{\xca6\xff|\xc3\xdd\x0c\xc6\x10\x0d\xcb\ +\xe3\x5c\xd1\x8ep\xd1\xe9\xbc\xce\xed\xfc\xce\x1d=\xcf\xc1\ +\x0c\xd2\xf6|\xcc#\x9d\xcf\xca\x9c\xc9\x9al\xb6\xff\xbc\ +cC\xc2\x07\xd1;\xca1-\xd3\xd6\xab\xc5\x0c\x9d\xca\ +\x83\xec\xcd\xae\x1c\xd1\xb1L\xce\xb2\xe0\xd3\xb6\xd0\x0c\x1a\ +\xfd\x0a\xef\x1c\xcf1\x80\xcb\xb0\xd0\xcbG}\xcc\x95\x5c\ +\xd2&\xbd\xcc\xe0\x1b\xc2\xe2k\x9b~\xe2\x010\x8c\xcd\ +\xa6\xac\xd0X=\xc1Z\xed\xc5|\xc0\xca]-\xd1\xe2\ +\x0c\xd6\xb2\x80\xce\xe9L\xd6A}\xd6\xbc\x90\xd6\xc3l\ +\xd4\xc6\x8c\xcfJ\xbd\xcfr=\xd7HL/\x01p\xcd\ +\x07]\xca\xd5{\xca\xa8\xec\xd0\x5c=\xd8\x13\xbd\xd3\xe5\ +|\xd8\x18\xad\xd8\xee\xcc\xd8\x1e\x9d\xcb\x90-\xd2Im\ +\xc9K\x9d\xc9t}n\xb9B\x0d\xd3[\xd5\xda\xdc\xd7\ +6\xbd\xd5\x81\x9d\xd3:M\xce\xa5\x8d\xd8c]\xd6\xaa\ +M\xd4\xf5\x1c\xd9\x92\x0d\xdbq\xcd\xd4\x9a\x5c\x0f\xe6\x88\ +M\xb6\x80\x02\xb8=\xc3\x7f\xfc\xd97-\xd8\xe0,\xd1\ +_]\xd1\xe5|\xce\xa7\xffM\xdc\x1d\xbd\xdak\x1d\xd2\ +\xae\xfd\xd6m\xec\xc6L}\xb4X\xc0y\x09U\x0b\x82\ +\xc0\xd9\x9d]\xdd5\xad\xd5[]\xc8\xa2\xbd\xdd\xd4\xd0\ +\xd3\xde-\x0d\xc3\xbd\xd8\xe1M\xd4k\xdd\xdaH]\xc9\ +\xca]\xc4'\xed\xbf\x22p\x0b\x85E\x03}|\xd55\ +\xec\xd7\x7f\xed\xcd\xbeM\xd8\xa4\x1d\xd6\xfb\xdd\xdf\xa9\xfd\ +\xdfj}\xdc\xe5m\xde\xb1\xfd\xc6\xcb\xa6Y\xd40\x04\ +\x0e,\xdf\x10\x9e\xc3\xf5\x8d\xdd\xaf\xfc\xdb\x86\xed\xdd\xea\ +\x8c\xdaf\x1d\xde\x8e\xcd\xda\xe4=\xe0\x1eN\xd9\xfe\xeb\ +\xc9\xdaU\x0b\x86\x90\xc5\xba\xdd\xd0\xdd\xdc\xdb\x86\x9c\xdd\ +\x12M\xda\xa5\xed\xe2\x18\x1e\xe3\xf1\xdc\xd8\xc6\xdd\xda\x1d\ +N\xd2\xe7}\xe0\x15\xd0h\xda5\x0b< \x08\x10<\ +\xbf[\xbc\xdb)>\xe1E\x0e\xdc\x16\x8e\xd1I\xae\xda\ +i\xad\xd6l\xdd\xd6\xc9\xfd\x0bpm\xe0\xa0\x8b\x01l\ +\xc5c\xb5\xc0\x07Z>\xdf\x11.\xe1]\x1d\xceF\x1e\ +\xd6\xc2=\xe6\xe1-\xdeg\x8e\xe6\xaf]\xe0\x06N\x08\ +\xc7[h\xbd`\x06\xd6\xff}\xdd\xdfL\xe4\xa3\x0d\xe6\ +\xa6\xfd\xd30.\xd4K\x0e\xe0\x1c\xfe\xe4\x93\xdd\xc6X\ +@w\x98\x06\x0b\x09`\x06\x5c\x1c\xe48}\xe7\xda=\ +\xce\xe4\xac\xdf{\x1e\xe9\x1c=\xe9\x1b\xee\xe4H\x1d\xe8\ +p\x8d\x06\x18\xb7o\xbc\xc0\x03\xf4\x0d\xd8\xf6\x0d\xce\xb0\ +\x8c\xdfG~\xea\xe0\xad\xe1\x8f-\xe06\x0e\xe5\xa4\x10\ +\x0b\x17`\xa6\x0f\xc7\x0bo\x00\xea\xd8\x8d\xeb\x14\xee\xe8\ +\xde\x0d\xe9\xbd\xae\xeaf\xce\xeanM\xe0\xb1\x10\xe2u\ +\xf7\x05\xd4@\x0e\x84\xbc\xec^\xdd\xe8\xdc\x1d\xe6b\x8e\ +\xea2\x0e\xe0\x7f\x8e\xdc\xf8\xfc\x0dv\x0d}\xb6\xf0\x06\ +\xde\xfe\xed\xa4\x1e\xee>\x0d\xed\xfe]\xee\xab^\xe3\x03\ +\xae\x0bj@\xb4\xfa\xc7\x0b\xb2\x10\x00\xa2\xfe\xe5\xce\xce\ +\xeb\x8bM\xe6\x94\xee\xe4\xf7\xac\x00\xd6\x14\x88\x02Q\x0b\ +\xbd\xc0\x03\xb9^\xd8\xdc\xdd\xd3\xf3\xfe\xe2\xc4\xad\xda\xe2\ +\xad\xcb\xad=\x09`@\x8d\x0c_\x101\x90\x0b\xb2\x90\ +\x00\x12o\xd1zN\xf0\xa9\x8d\xf1\x07?\x0b\xdf\x00\x01\ +\xf1\xd0\x92\x1f?\x12_(\xf0\x0aM\x80\x0b&\xff\xec\ +\xfc=\xe6*o\xee\xbb\x1c\xf3E\x01\x0b\xbcP\x0b\x81\ +\xe0\x0c\xce\xd0\x0cc\xdd\x0c\xa8\xee\xd1\x1fM`\x01\x01\ +\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\x00\ +\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13\ +*L8\xc4\x93\x96)I\xf6\x14\x98\xb1\xc6\x80\x1b7\ +5\x0c\xac\xb9\xc0\xe9\x5c\xbcF\x80P\xbcYH\xb2\xa4\ +\xc9\x93(S\xaa,\xe8\xc1\x93\x1a(\xa1(QzD\ +\xf3\x91\x83\x9b\xb4h]\xbc\x08\x00\xc0\x96\x9f\x90\x82B\ +z\xf4`\x0a\x09\x1a+\x93*]\xca\x14!\x09=\x5c\ +jH-QBfM\x9b8u\xee\xec\xf9s\x8bP\ +H\x10\xc2\x86-1O\x98\x87\xa6h\xd3\xaa\x1d\xa8\x03\ +\x862\x03\x06\xa4\xca\xa5j\xf5j\xd6\x9dn\xb8z\xfd\ +*\x16B\x95\xbf\x7fM\xbc@\xb7\xb6\xb0\xe1\x92\x14\x18\ +T\x84\x0bWn\x0d\xaaU\xafb\xcd\x89W\xefW\xb0\ +b\x01\xff\x95\xc0y\xcd\x88\xc3\xa0A?I\xb4\xa6\xf4\ +b\xc6\x8e!\xcf\xb4\xeb\x80\xf2V\x9f{\x85\xf6\xd5\xcc\ +\xb9\xb6;w`\x88\x85\xde\xcd\x94I&\x13\x14M\x9f\ +\x8e;\x97\xae\xe4\xbb\xaf\x81\xca\x9e\x0d\xb86\xe7\xdb\xb7\ +\xdd\xa8\xa1\xc6\xbbz\xc9\x04,\xb8\x98\xd8>#xi\ +\xc6\xc4\x8b\xd7\xff\xa5\x89\x9c'l\xbe\x99i\xdb\x86\xee\ +n\xc2\x04\x09z\xac\xcb?\x98\x8cK\xa8P\xdb\xb9\x0b\ +\x07\x1f\xfeq\xd5\xd5\xe4\xb5\xa6\x95y\xca\x05\xc5\x5cs\ +\xebA\xe7\x9e{\xcb\xfc0\x9f|\xaf\x88q\xc1}\x14\ +\xe6\xe7\xddw\xa8\x89\x07\xe0d\x03\xe6u\xdera\xa9\ +\x97`{\x0bN\xd0F\x1b\x12|\xf6`h\x9a(3\ +\xc0\x1csP\x88\x9f\x85\xfbe8\x95q5\x95\x97W\ +W\xe8\x85\x88\xe0s\xec\x95h\xe2\x89m\xd0B\xc2\x8a\ +\x85\xbd\xa1\xc7\x00L\xbe(\xe3\x8c\xc0\xd5\xd8Xq\x91\ +\xe5(`e<\x82\xe8\xd7\x8f\x12\xb0G\xa2{D\x12\ +\xd9\x00\x18\xe4 \x89V?}p\xc1E\x930\xcah\ +\xe1\x85\xe0\xa5Ve\x80\xae\xf1\x94%f>n\xe6\x5c\ +\x90%\x86\xd9F\x03\x80\xba\xd3\x88\x99J\xf1\x90\x84\x9a\ +j6\xe9\xa4\x9b\xfa\x99\x16\xa7x\xac\xd5\xb9clx\ +n\xa9'\x90\x0a.\xe8\xe7\x9f\x80\x02z\xc1Y\x84\xa2\ +\xa4\x09\x03; \x9a(\x9b\x8cF\xe9\xa8\x8d\xfe\x8d\xa7\ +\xe3\x87\x06\xa6\xffwi\x97\x99j\x1af\xa7\xb8J\xd0\ +O\xa8&\xc1p\xc1\xaf\xa5\x9a\x8aj\xaap\xdaH\xd7\ +\x86WnU`\xa5\x22\xd2z[\x9f\xb7\xe2\xda\xe9\x1f\ +\x7f$\xc1\xabB\xd4X\xf0+\xb0\xa6\xae9\xec}4\ +\xae:\xa5\x7fs\xda$)\xacx6\xcb\xa7\xadbJ\ +\x0b(\xb5\x1a\x84r\xedA\x0bp\x92I&\xdb^\x10\ +,\xa2\xdfB\xd9\x9d\xb8\xfd\xe1H^\x9d\x96\x81\xa8n\ +\xadC\xb6\xeb.\xb5\x7fh\xa0\x01\x04C\xcc;\xd0\x06\ +`\xdc{o\xbe\xfbz\xcbd\x8c\x156\x8aa\xc0\xe5\ +&\xeba\x81\x07VQ\xdb2\xeb&|\xa2\xbb\x0d0\ +\xec\xb0\xc3m\xb8 \xb1'\x05X|q\xbe\xdd\xf6\x1b\ +\xee\xc7\xe1\x09l\xee\x80\x053;k\xca~\xb2\xec\xf2\ +\xcb\x1a\xe4\xa0\xc1\xa0\xbc\xf6S@\x01}\xd8\x8c\xef\xb6\ +\x19k\xcc1\xb8\x1e?\xdaj\xa4\xc9\xc5v\xe0\x9e\x08\ +G\xbbp\xc3H\xe7\xa0\xcb\xd9j\x84z\xc2\xd3OG\ +m3\xc6\xc2nL\xac\x94\x1aZ\x094\xac\xb2\x9a\xcc\ +\x19\xca\xcf\xb2\xff\xbb\xf2\xd8d;l\xf6\xd9\xb7\xdc\x92\ +\x82\x99'\x80\xc1v\xdbR\xe3\x1c\xf7\xa2X\xabz\x9a\ +\x9c\x00\xe2\xd4\xb5\xc1?\x12\xad0\xaeG\x0b>x\xe1\ +\x85\xfb\xb1b?`\x94\xbe8\xd4\x8ds\xfb\xf8\xd5;\ +k-\xb0\xe5\x04z\x9d'\xd8_\xaa\xcc\xa9\xb4\xf0\x96\ +M8\xe8\xad\xb4\xa2\xa2u\x9e\x94.\xfc\xe9\xa9\xab~\ +*\xe43\x16\xdb\xf3\x9c\xb0\x8f\xdcc\xe6ao>m\ +\xe0\x82\xef^x\xef\xbd3\xcd\xdb\x10\xca\x08?\xfc\xe2\ +\xc5\xeb\xbbz\xc7\x92\xdb8@\x22,\xf8\x10\x82\x17\x01\ +\xd8B\x904\xff\x08\xa2\xc9\x09#\x10P\x83\xa5z;\ +\xfbe\xd1\xb8\xe7^\xbd\xf5\xd8\xc3\xde!x\xc3\x07N\ +0\x80\x01\xde3\x1d\xf8\xde\xb6\xad\xf1u\xcc;p\xe9\ +\xc3\x14<1\x92\x95\x04\x80\x18I\xa8\x01\xed\xa0\xf57\ +\xce\xf9/ig\xd3\x05\xef\x02(\x0794\x807N\ +8\xe0\x01\x13\xa8\xb8\x05Z\x8cj\x0e\xf4\xd7\x1a\x86!\ +\x8c\xc2\xf0\x81\x02\x17X\x97\xd8<\xa8;\x00\x92P\x0e\ +\xa0\x00\x85;\xff\x02\x00\x9a\x1f\xa8P\x85,\x5c\x9c\xdb\ +^h\x98\x82\xec\x87O\xfc\x14\xd0>\xf4\ +\xa3\x87\xb4\xee\x17\xc2\x02\xdf\xb7\x9e\x03\xd0\xe7@(\x8c\ +0\x85\xea[\xff\xfa\xc2/>\xf1\xfd`\x86\xe5\x93\x04\ +\x10\xbd\x8f\xbe\xff\xf8\xc7\x0f}74\x02\xfb\xe8O\xff\ +\xf5cOD\xef+\xc4\x18\xe4\x8f\xbf\xfc\xd3@\xff6\ +\xb0\xe0\x05\xf8\xcf\xbf\xfe\xf3\xaf~\xeb\xcb\xc2\xfd\x0a\xc1\ +\x07\xf1G\x7f\x04X\x80\x06H\x80\xa0p\x7f\xfb\xb7\x80\ +\x0c\xb8\x7f\xaf\x00\x80\x0aq\x80\x128\x81\x04x\x00j\ +0\x02\x18\x98\x81\x1a\x88\x81\x0d\xa8\x7f\xbc\x00\x81\x09A\ +\x81\x22h\x80\x88\xb0\x81&x\x82'\x08\x82\x09\x81\x0c\ +,\xd8\x82.\xf8\x820\xe8\x82(8\x83(\xa8\x82\x08\ +\x11\x838\x98\x83\xc8\x90\x0cj\xd0\x83>\xf8\x83@\x18\ +\x84>\xf8\x816X\x10:x\x84-\xd8\x010 \x84\ +L\xf8\x83,\xf0\x84OX\x0bEH\x10\xbd\x80\x84H\ +\x88\x08\x14\x00\x85Z\xb8\x85\x5c\xc8\x85\xb80\x85\x03A\ +\x0e\x8c0\x86dX\x86dx\x84- \x06]\xf8\x84\ +\xc9\xd0\x86n\xf8\x86p\xa8s`(\x10\x0aP\x87\x0a\ +`\x86x\x98\x87c\xd8\x00>\x00\x87~\xf8\x870\x10\ +\x88\x82\x88\x14s\x08\x08vx\x88\x88\x88\x88y\x08\x09\ +.\x00\x88\x82\xff\xf8\x88\x90\x18\x88\x8d\xd0\x08%6\x87\ +\xff\x90\x88\x98\x98\x89v8\x03 \x10\x89\x9e8\x89\xa0\ +\x18\x8a\x93h\x05\x96\xe8\x04Xp\x8a\xa7\xa8\x89\xaa\xc8\ +\x00\xc6\xf0\x88\xa2\xf8\x8a\xa1H\x01\xb2(\x8b\xb9\x07\x86\ +\x8f\x80\x8a\xb8\x98\x8bX\xa0\x8a\x0a`\x01f\x00\x8b\xa2\ +8\x8b\xc2(\x8bZP\x8c75\x87\x07\xa0\x8b\xca\xb8\ +\x8cvH\x01\x01\x10\x8c\xc3(\x8c\xc58\x8d\xd4\xc8\x04\ +\xf6\x04\x86\xcb\x98\x8d\xcb\x08\x02\xb6\x10\x8d\xb3H\x8d\xe0\ +\xa8\x05L0\x8eFP\x8e\x045\x85b`\x09\xeah\ +\x09\xda\xd8\x8e\x02a\x04\xc4\x18\x8e\xd5H\x8e\xe5h\x04\ +bp\x8fb\xa0|6x\x04\x02\xd0\x8f\xeb\xb8\x8e\xed\ +\x88\x8b\xc6\xf6\x0f. \x8f\xe28\x8eLP\x8f\xf6\x88\ +\x8f\xf7\x18\x0c\xc1\x00\x08`x\x0b\xfd8\x91\x13\xf9\x8f\ +\xea\xa8\x8d\x00 \x10V0\x8d\x08\x99\x90\xf5\xc8\x90\x0c\ +\xe9\x90'0\x92\xc2\x00?6\xa8\x03\xc5@\x91*Y\ +\x91\x16\xc9\x8e\xb8x\x04\x02a\x08\xf4\xf8\x91 \xd9\x90\ +\xc10\x92$\xff)\x0c:\xa9\x03E\x18\x0f\xdc\xf0\x93\ +\xdc\x90\x92+\xa9\x92-\xa9\x8eL\x83\x0b4Y\x93\x22\ +\x89\x93:\xd9\x94@\x00\x04>Pr 8\x01@Y\ +\x95B9\x94D\xa9\x8e<)\x10>\xa0\x94K\x99\x93\ +N\x09\x95>\xe0\x03\xfd\xd0\x0f_\x08\x82\x19\x80\x0aj\ +Y\x95ly\x95X)\x00\x1d@\x10\x9a`\x937\xc9\ +\x94M\xa9\x93O9\x96dY\x96e\x99\x01*8\x0c\ +j\x19\x98\xa8\xc0\x96V\xf9\x96b4\x108P\x97v\ +y\x97y9\x96|Y\x96\xc4@\x02$\x00G\x10\x88\ +\x00\x11p\x99\x82\xb9\x96\x84\x09\x94n)\x00\xbf\xf3\x0f\ +\xb6\x00\x96\x8c)\x96{\xc9\x97\x91)\x99$\x00\x08\x80\ +0E\xee\xa7\x06\x97\xf9\x9a\x11\x90\x99\x9a\xb9\x99A\xd9\ +\x8f\x06\xe1\x02w)\x0c\x8dY\x9a\xa6\x89\x9a\xaa\xa9\x9a\ +J\xd0H\x00(\x07\xb0Y\x9c\xb29\x98\xb4\xd9\x0a\x06\ +1\x04\xbaI\x9a\xbc\x09\x99\xa8\x99\x9a\xbf\xe9\x02\xd4\xe9\ +\x09\xed\xb7|\x14\xc0\x0a=P\x9c\xdcy\x9c\x849\x0c\ +\x06A\x0dz\xff\xf9\x9c\xfd@\x0c\xa7)\x9d\xc0I\x9d\ +.\xe0\x09\xec\x89\x09\xee\xd7\x02\xac\x10\x9f\xdb\xc9\x9d\xb0\ +y\x9c\xc8\xc9\x0d!p\x10.\xf0\x98\xbd\xe9\x9b\xbf\xa9\ +\x04\xea\xc9\x9e\xec\xf9\x01\x1f\xc0\x9a\x98\xf7\x02\xdf\x10\x9f\ +\x0a\xda\x03\xf3I\x9f\x98)\x9b\xdau\x10\x82\xf0\x98\xe7\ +\x89\x9e\xe9Y\x9d\x02J\xa0\x1f\xf0\x04\x9a@\x84\x98\x97\ +\x06\xdf\x10\xa2\x0a*\x9f\x0d\xea\xa0\x99\x09\x05\x08\x81\x0b\ +\xe5Y\xa1\xbf\x09\x08\x00\x1a\xa0\x19J\xa0O0\xa3 \ + d\x98w\x01\xc0\x10\xa2::\xa2\xdaY\xa2&\x8a\ +\x0a\x0a\x11\x02\xd1\xd9\xa2/\x8a\xa1\x03*\xa33*\x05\ + \x00\x02\x9a\xf0\x7f\x86\x07\x0c\xaa\x00\x0c9\xba\xa3<\ +\xca\xa0\x0e\xfa\x9aU\xa0\x10\xe4`\xa1.\xaa\x9e\xeb\x19\ +\xa3\x1b:\xa3O\xb0\xa4L\xaa\x09\xfa\xb8s\x88\xa0\x0a\ +j\x1a\xa5:*\xa2U\xea\xa3\xb0\xa9=\x07\xf1\x05\x87\ +\xf0\x9f^*\xa0\x9e\xa0\xa1a:\xa6K\xaa\x09~\x1a\ +\x02!`\x07a7\x03u\xb0\xa6k:\xa5T:\xa2\ +VZ\x9c\x8a\xffp\x8d\x09a\x06JP\xa4x\x9a\xa7\ +\x1a*\xa6J\xda\xa7\x7f\x1a\x02V`\x05\x80\xb5o#\ +P\x0f\xf5P\xa8\x86\x1a\xa5\x88\xea\xa6U\x0a\x9b\x9a\xb6\ +\x10\xaf\xe0\x09Fz\xa4HJ\xa3\x98\xaa\x09\x80\xaa\xa9\ +\x9bj\x0cM&m\x9a\xd0\x03\xa0\x1a\xaa\xa2j\xa8\xa5\ +j\xaa\x8a\x1a\x01X`\x12\x190\xa9\x87P\xa9bJ\ +\xa6~\x9a\xa9\xb4\xba\x01\xce:\x04\x0f(m\xe4\xc0\x01\ +\xbb\xba\xab\xbd\xea\xabm\x0a\xac\x0a\xca\x00&\xe1\x0a\x87\ +\xc0\x9e\xc7\xfa\xaa|\x1a\xab\xb3\xba\xa9V\xe0\xac\x1b`\ +\x0c\xc6P\x89\xa6\xc6\x03-P\xad\xd5Z\x07\xd7\xaa\xa6\ +R\x9a\xad\x09\xaa\xa0\x02\x80\x12\x82\x10\xae{\x0a\xabe\ +\xca\xac\xe6\x8a\xae\xea\x8a\x02(\xa0\x03_\x10i\xbd\xd0\ +\x00\x18\x80\x01\xf0j\xad\xf3J\xaf\xf6\xaa\xa0\xca\x80\x12\ +\xaf\xf0\x04\xe2J\xa6\xffZ\xae\x9b*\xb0\x03\x8b\x02C\ +0\x04\x86p\xb0d6\x01\x0b[\xb2\x0d\x0b\xaa\xf2:\ +\xaa\xa4j\xaf\xc3\x9a\x12\x86 \xa6\xe3\xfa\xaf\xb2\x0a\xa8\ +\x01\xeb\xac\xea\xffj\x0c\x04\xfb\xb1C\x80\x0e!\xebd\ +\x1a\xa0\x02%k\xb2'\x9b\xb2*[\xaf:*Z(\ +\xf1\x05!\xf0\x04\x97*\xb3\xb3J\xab\xe7j\xb3\x1d\xab\ +\xb3\xe8\x90\x01\x82`\x08\x1e\x0a]\x0b0\x0ah\x80\x06\ +@\x1b\xb4\x0c;\xb4\x0fK\xaf9\x1a\x97+\xf1\x06\x18\ +\xbb\xac3\x0b\xb5Q\x9b\xae8\x9b\xb3\x1f[\xb5\x82 \ +\x08^`\x06\x8c\xb5[\x9a \x0a\xab\xd0\xb5^\x0b\xb6\ +a+\xb6*K\xaar\x9a\x12C\xe0\xb4\x1a\xdb\xb67\ +K\xb0\x1e\x1b\xb7VK\xb7:\xa0\x038\xa0\x0d\xd0U\ +\x07\xabP\xb9|\xfb\xb5A{\xb2(;\xb6\x10\xb0\x14\ +\xae\x80\x09\xcbz\xb8\x88\xdb\xb1\x8b\xbb\xb3\x8d+\x08\x8f\ +\x8b\x038\xb0\x00o\x00\x0bse\x00\xa7\xc0\x0c\xbbP\ +\xb9{\xdb\xb5\x98+\xb4\x9aK\xb4jZ\x0c\x1a\xa7\x14\ +\x1e\xb0\xb6l\xcb\xb1o[\xbar;\xb7^\x00\xb9\xab\ +\xbb\x00\x0b\xe0\x01w{O\x92p\x0a\xd0;\xbb\xb4k\ +\xbb\xb7\xbb\xb0\x9a\xbb\xb9k\xea L1\x0b\xe8p\xb8\ +\xe8\xea\xb6\xc3\xffK\xb5\xa7{\xbc\xaa\x9b\xbc|\xc0\x07\ +4@\x0d\xae+1\x09\x10\x0a\xb1\x10\x0b\xd0\x1b\xbd\xb4\ +[\xbb*P\xbd\xd6\x9b\xbb\xf2\x1akM\xf1\x0a\xe6\xba\ +\xb1\xc2\xab\xb8\xe2;\xb7\x8e[\xbe\xca{\xbe4@\x0e\ +\xe4\xd0>\xb3p-K\x10\x01\xef\xf0\xbe\xf1+\xbf\x96\ +K\xbd~\xfb\xb7'\xab\x00k\x91\x005\x0b\xbe\x8aK\ +\xbc\xe3\x9b\xba\xe6{\xbe\x08\xec\x01\x1e\x10\x00o\xd0\xbc\ +\x0f\x02\x03\x8a \x02\x22\xf0\x0e\x0f\x0c\xbf\xf1+\xbb\xd3\ +K\xc1~{\xbd\x86\xb1\x00\xdf\x9b\xb8\x00\xcc\xb8\x02|\ +\xbc\xc8\xab\xbc\x0b`\xc0\xe4@\xc2%l\xc2\x09\xe0\x0a\ +\xbe0\x1f/\xb0\xc2,\xcc\xc2/\x0c\xc3\xd1+\xbd\xb5\ +\xeb\xb5\xf6k\xc1\xbb\x9a\x09\x87!\x08R;\xbc\x1e\xdc\ +\xc3 \x1c\xc2\x07<\xc4E\xfc\x06d\x9c\x00\xd4\xf0\x0c\ +\x22\x1b\x1a\x0c\x10\x01\x15\xd0\xc6M\xdc\xc2/\x1c\xc1\xa7\ + \xc5S\x5c\xbf\x15\x0c\xaf\xb7d\x18\xb5\x80\x02:\x5c\ +\xba\xa6\xeb\xc5\xc8\x1b\xc2|0\xc2El\xc2o\x90\x00\ +fL\x0d\xd4\xff\x80\x0b\xaf\x90\xc6h\x81\x0eI\xb0\x02\ +m<\xc9\x15\xf0\xc6p\x0c\xc1\x11L\xc7\x97[\xc5\xbb\ +\xca\x01\x84x\x18\xcd\xc0\xc7;\xbc\xb3\xc5\xeb\xb8\x81\x5c\ +\xc0B,\xc6\x01`\xc8\x87\x9c\xc8\xb2 \x0b\xbd\x80\x0b\ +M\xf0\x0a\xbc\xb0\xbe*\x81\x03j`\x00X@\x0a\xa4\ +@\x08\x94<\xc9o\xec\xc2\xef\x0b\xc5\x12<\xc1T|\ +\xc7\xdcP\x1d\xbd0\xca\xe8P\xca\x03\xac\xba@\x9c\xca\ +$\xbc\xca\x86\x8c\xc8\x8aL\x0d\xaf\x8c\x0b\xb8 \x0d\xb6\ +\xd0\x0c\xb9\xe0\x0a\xbc\xc0\x0b_\x00\x0b\xbe0\x0b\x0b,\ +\x10\xb6@\x0d8\xa0\x09\xc1\xf0\x03\x050\x01\x11`\x0a\ +\xbf\xc0\xcb\xbcL\x08\xbe\xfc\xcb\x96,\xcc\xc4\x1c\xbb\x9a\ +L\xc3`\x1b\x0c\xd6\xc1\x03\xc4\xeb\xcc>\x0c\xcd\xa8<\ +\xc8b<\xc6e\x9c\xc8\xd8\x1c\xcb\xb8`\x0b\xdd\xfc\xcd\ +\xaf\xf0\x0a\xb5\x10\xce10\xce\xb00\x0b7\xb0\xd17\ +\x90\x0a\x1em\x0a =\xcf\xf4l\xcf\xbf\xec\xc6M\xec\ +\xc2q\x9c\xc9\xfd|\xccA\x1b\x0f\xf3\xf1\x06qK\xd0\ +_|\xd0a\xff<\xcd\xabL\xc6<`\xcd\xd8\x0c\xcb\ +\xda\x0c\xd1\xcd\xe0\x0a\xae0\xd1\x15\xcd\x0b\x17\x0d\x0b\x19\ +\xcd\xd1\x1d\xfd\xd1 m\x0a\xf4\x5c\xcf%]\xc9\xc1\xfc\ +\xc4r\xbc\xd2,\x8d\x01\xd1\xf6 \x01\xd0\xcc\xa7k\xca\ +\x04\x8c\xca5m\xd3d\xdc\xca\xd7\x9c\xcd=\xed\xcd@\ +-\xd4\xe1\xfc\x05\x18\xad\xd1\x1c\xed\xd1\xa9\xb0\xd4\xf2\xdc\ +\xd4$]\xd2\xf9\x9c\xd2\x99<\xbf|{\xcc{`&\ +o\x90\x01\x1f|\xca\x07M\xc8\x85\x8c\xd3:\xed\x08<\ +\xbd\xcd\x11}\xd6\xb50\xd4jm\xd4l\xbd\xd1n\x0d\ +\xd7\x22]\xcf\xf7\x8c\xcfQ=\xccr,\xc33l\xbb\ +\xd1\x10*\x09\x00\xc8]\x1d\xc4\xd2<\xd8\x0b=\xd6\x87\ +\xed\xd3\xdf\x1c\x08\x14\x1d\xce\xe2<\xce\xe5\x8c\xd4\x91\xbd\ +\xd4\x93\xed\xd4t]\xd7\x98\xad\xd2x\xdd\xb5HK(\ +\xd4\xc0\xd5\x06-\xda\xe8+\xd8\xd4L\xd8\x0cM\xd6\x0f\ +\xdd\xcdg\xbd\xdai\xed\xda\x8f\x9d\xd4J\x1d\xd7r]\ +\xd9\x94\x5c\xd7R\x8d\xdb\xd3kV\xd7\x82\x0bf0\xd3\ +\x81M\xc8\xc3\xff]\xda\x8a\xfc\xca\x0e\xcd\xcdf\x1d\xd4\ +\xca\xdd\xda\xe4\xdc\xdcn\xfd\xd6K\xdd\xd4\xbd,\xdd\xc0\ +l\xdb\x98l\xdd\xdf\xa0a\xc3\xe4\x0a\xe5\x9b\xbc\xc0\xfd\ +\xd5\xa4\x9d\xd3\xc5}\xda\x89m\xdeC\x8d\xde\xaf\xdd\xd6\ +\xb1\x1d\xd2\xee\x0d\xdf\xf1}\xd9\xf3\x1d\xbf\xb3+\x0a+\ +\xc5\x0b\xe4\xa0\xdf\xe7\x1b\xdc\x09\xfd\xdd\xad\x9c\xc8\x86-\ +\x0b\xda|\xdc\xe5\x8d\xd6\xcb\x9d\xde\xb0}\xe0\xd0=\xd2\ +\x0a\x0e\xd5Q]\xdd1\x5c`Z\xc5\x03\x07\x8d\xd0\x17\ +~\xd3o\xe0\xdf\xa6\xed\xd0\x1e\x9e\xda\x14=\xe0\x8d]\ +\xe0\x90M\xe2\xb3\xfd\xdeO\x8d\xe2'\xad\xe2\xd0\xcb\x05\ +\xa3\x15\x04\x15n\xe1D\x8c\xe1\x88\xfc\xdf\xe3\x1d\xe0B\ +\xad\xe3\xcc=\xe2\xcf\x0d\xd2\xee\xdd\xcbAn\xc9p\x5c\ +\xdd\x11\x00\x03\xd0\xc5\x0b\x01\xa0\xe46-\xe34\xae\xc8\ +\x86m\xe3\xa8\x9d\xdc\x8bm\xd1;\xde\xdc\xce\x0d\xd7%\ +N\xd9Y.\xdf\xef\xdb\x06&\xa6\x0d\x08\x1c\xe3\xac\xdc\ +\xe45\xde\xe1i.\xe0\xac}\xd1SN\xe5\xec\x8d\xe0\ +\xd1=\xe7)\xff\x1e\x0bu@f\xbc\xf0\x06K.\xe3\ +\xe0\x1d\xde\x87\xcd\xcdP~\xde\x82.\xe2\x84.\xd9\x09\ +~\xe2&\x1d\xd5\xee`\xa3d\x96\x0b\x01@\xda\x19\xde\ +\xe7=\xdd\xcd?\xad\xe6\x81\xde\xe6H\xed\xdc\x85\x1e\xe7\ +r\xfe\xd4Z\xbe\x83\xe9\x86\x0b\x90^\xea\x92\x8e\xe6\x01\ +\xae\xda\xe7\xad\xd6\x83n\xe0U\x0e\xebs-\xeb,\x5c\ +\x0fN`r_\xd0\x0ba\xcd\xe7f.\xde~^\xe9\ +k\x1e\xe2\x98\x0e\xec\xaf.\xec\xc3\x8e\xcf*\x80\xc5a\ +\xf7\x05\xb8\x80\xeb;m\xe3\x94\xfe\xe19\xce\xda\x8d=\ +\xed=\x1e\xec?\x0e\xe4%\x8d\x06F\x9ez\xb0\xd0\x0c\ +\xd7\x9c\xeb\xcf\xde\x0c\xe2\x1e\xed\xe8m\xee\xae\x0e\xe7\xe9\ +~\xed\x15\x10\x01\xe0\xe9~\xbe\xf0\x0a\xb8@\x0d\x1b\xae\ +\xeb\xe5-\xe0Rn\xd4\xe5\xac\xde\xeb\x0d\xe7Wn\xcf\ +\xf7\xac\x01\xc2d\x83_\xe0\x0c\xb8\x00\xee\x7f\xce\xeb\x03\ +~\xef\x0bO\xe8\xd5\xbe\xef\xc80\x0d\x96(\x101\xd0\ +\x09Mp\xdc\x95~\xde\x1co\xce\x1e\xaf\xefM\x8d\x00\ +\xdc:\xf2\x06M\x01\x0b\xbc\xd0\x09\xeaP\xef\x1b_\xee\ +\x1dO\xed\x1f\x1f\x01[\x90\x02[)\xf3\x0a\x01\x0b1\ +\xc0\x0b\x13=\xeel\x8e\xd1;O\xed\xa6P\x0f\x1ap\ +\x01#@\x18B\xbf\x12\xbe\x00\x0b\xbe\xfe\x05\x97\x9e\xde\ +\xb3P\x0f\xaa@\x04\xc7P\x053\xa4\x06\x9e\xb0\x00\xfc\ +\x15\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\ +\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\ +\x08\x13*D\x98\x00\xdd\x071#\xf4\xccS\xb6c@\ +\xa8\x1a5L\x84\x1a@e\x5c\x92)Z<\x0dYH\ +\xb2\xa4\xc9\x93(S\xaa4\x18\xe0C\xb2\x22\x17\xd6\xc8\ +\x5cc\xa0fM\x8c\x18K\xe8\xa4\xf4\xa8gO\x07\x0e\ +\xd6D\x1b\x01\x88\xdc\xca\xa3H\x93*=\xf8\xc6\x85\x1f\ +0\xa1LH\x9d1S\xa6M\x038k\xe8,\xc1\xd3\ +\xe7#\xa0\xb4h\xb9\x19;\xe3\x92\x8f\xa5h\xd3\xaa%\ +h\x86\xc2\xa6Pp\xe1J5A\xb5\xea\xd5\xac[\xbb\ +\xfa\x04+v\xecX\x00\x00v\x8c\xc8\xb0\xb6\xb0a\x92\ +\x1e\x98\x1c\x19\xc0xN\xdc\xa8S\xebZ\xb5\x89\x97\xab\ +\xde\x9f\x0e\xc2\xfau\x03x\x8bgH\xa1\xd4\xf09L\ +\xfa0\x88$\x5cR3\x1e\xe08\xee\xdc\x19\x92iR\ +\xc6\xb9\xf32\xd0\xcc}\xff\x02\xf0\xbc\x05\x92oH\xca\ +\x00\x95\x1e\x9e\xb4\xd7\x09e\xa9\x93\xafn\xedz\xaa\xdd\ +\xd99-{\xe5\x9b\x9b\xf3\xee\xde\xbf!A\x80@)\ +\x19\xf1\xef'a\x14\xff\xb8paGr.\xabY?\ +~\xfd\xfc&m\xe9{qo\xb6\xfe9\xfb\xf6\xed\x00\ +\xe2\xbd\x01\xcf\xbf\xa0,\x0a`dB\x1ey\xe7\xa1\xd7\ +\xd8z\xce\xcdt\xd7{\x94\xd8&\x9f_\x9d\xd5\xe7\xdb\ +}\xdbUQ\x05$)\xf0\xd0\x1f\x7f\xc2\x04\x98\x89\x80\ +\x03\x9a\xa7\xdc\x81\xcd\xd1\xd5\x1eV\x0c:\xa8\x19\x84\xd7\ +e\xa7\xdd}\x16\xc6\x08\x09\x0b\xaelXZ\x08\xd1\xf4\ +\xf1\xe1\x8e!\x9e\x97\x1es\x90\xc1\xa6 tZ\xc1\x87\ +\xd9\x8a\xbaI\xf8\x22\x8c1V!\x81\x045(a\xa3\ +a)\x14`\xe5\x8e\x1f\x0eX\x9e\x8f$\xca\x95\xe0d\ +(F\xd7\xe0t\x0f\xfe\xc5\x9b}\x146\xf9\xe4\x9a\x0f\ +L\x99\x16 \xcaXi\xa5\x8eX\xf68\xa2z%\xc6\ +FdmdV\x17\xa1\x8bi\xaa\xb9\xa6\x04\xee@@\ +\x81\x9bH%\xf0\x03\x18\x8c\xcaY\x00\x9dY\x0eX\xe0\ +j\x08\x9a8d\x98E\x8ey\xa4\x9f-\xfeF!\x04\ +\x82\xae\xe9\xce\xa8\xee\x80\x81\xa8JV\x1c\xc1h\xa3\x8e\ +b\x09\xe2\x96w\x02\xff\xf9\xa5l\x98\xf2\xb9\xe9f\x7f\ +z\xcad\x8c\x83\x12J\xaa;\x90\x08wjI\x140\ +\xc0\xc0\xaa\xac\xceY\xa7\xa4\xb1\x22\xa8't\xb6~U\ +&gg\xeaZ!\xaf\x83\xfe:\xea\x04\x13\xe8\xc1\xcb\ +\xb0\x0a\xfd`,\x03T \x0bF\xab\xcb\xc2\xaa\x1a\x9e\ +^\x0a\x09f\x98;\xf5\x99[\xae\x13\xeeja\xaf\xda\ +r\xcb\xed\x05\xfb\x81[\x10\x1fP\x8ck\xac\xb9\x8eB\ +\xfa\xaa\x88\xeb\xb2\xcb\xde\xbb\x0c\xf6\x89k\xa7\xf5^{\ +o\xb6\xbf\xea\xab\xaf\x1b\xfe\x12\x84\xc2\x11\xca(#\xf0\ +\xb1\xc8\xa2\xcb#y\x08/\x97\xe7\xa5\xf0r\xe50\x84\ +\xd5.\x09j\xa8\xbe\x92j1\xb7m\xb4!\x81'\x19\ +\x7f\xf0@\xc7\x1d\x7fL\xb0\xb2#\xabk\xa0\xac\x96\xd2\ +\x9a\xb2mHR\x8b]\xc4/O,j\xc5\x16\xd7\x5c\ +\xf3\x04Z\x80\x0b\xc8\xce<{,p\xb9\xab\x16\x9c.\ +\x97\x165\xf7\xec\xd1\xd3!I\xef\x92M:\xf9\xb4\xcc\ +QK]s\x03,\x9c\xea\xc3\x03tg\xad\xf5\xb8?\ +_\x19t\xc9]\xce\xff\x0a\xad\xca\xb7&\xb9t\xa0N\ +K\xb0\x0c\xd4mK\xdd\xc0\xe2/\xb897\xddug\ +\xeds\xd7r\x1a\xcc\xec\xba\xcc-Lk\xc3G\xe2\xaa\ +$\xe1j?\x99o\xe2\x8a/\xde@\xe3\x1b\x02\xc2\x09\ +\xe4\x90\xdb=y\xb2\x05\xa4\xcbw\xd8\xed^\xca\xb9\xb4\ +~J\x08:\xc5l\xeb\xeb\xf6\xdb\xa6/\x1e7\x7fO\ +\x1cq\xc4\xea\xacc\xcd\xb3\xc0y[\xae\xae\xc9\xb5\x83\ +y;X,\xean/\xef\xee\xcc\xfc{\x1b\xc1\x07\x7f\ +(x\x9b\x18\x7f|\xf2\xca\xf7\x8c7\xe5zGz\x01\ +\x97\x99\x17`\x01\x0c$X\xa1\x83A\xb6\x04\xe0E\x08\ +>\xa8\x01\x85\x09\xd5\xa3\xd9t\xe81\xdb\x96\xef~\xd7\ +\xbd\xee}\xe0;N\x10\x9f\xf1\x90\xd7:\xc91\x0f}\ +\xce\x9b\x1d\x03Fp@\xa4\x00b\x09&\xb0\x9e\xc4\x06\ +u\xb8\xde\xd1\xccm\x054\xdd\x1f\xfe\xe0\x8e\x91\x90F\ +\x16\xe7\xd8D\xf8\x14\xc8\xc0\xc8-o\x5c\x5cK\xd6\xd7\ +R3\x88~x\xa00L\x00C\xc4`\x86\xb8\x0f\x96\ +.\x84#\xfc\x83\x06\xff P\x9a)\x10@\x85+\x14\ +_\x0b\xcbw7\x90\xc1nY\xca\xd0\xc2\x0dK\xc3\x87\ +\x11\x94`\x83k\xcb\x1e\xe9\xb8\x17\xc2\x06\x04Q\x03`\ +\x0c\xc5a\xc4@\x802\x221\x89\xe3c\x9d\xeb\xce\x97\ +,He\xe1\x03\xb5\xe8\x8f\x0fB\x81-\xd1y\x90\x80\ +]\xfc\x22\x18\xc1X\x84\xc2\x18c\x18\x804#\x12Y\ +\x98\xbc5\x0e\x0c}\x99\xc8\x82&\x10\x05\x08\x13`o\ +\x8by\xd4\xe3\x1es\x90\x83~\xace\x10\x80\x0c\xa4 \ +\xd1\xb8D\x07\x1a+\x86Vz\x80\x94\xc0e\x047\x04\ +P{?\xec^\x10\x85\xb8G\x0dPR\x17\x13\x98\xe2\ +RF\x90\xc9L\x96\xf1\x88*$\xa4\x1a_xHF\ +%\xc3\x16\x19\x13\x88\x05z\x88GU\x8e\xb0\x95`|\ +\xa5.t1\x00\xb4<\xc1\x09\xb5\xb4\xe5&u\xd9@\ +\xf3\x0d\x0c\x0a\x84\x09\xe6@\xacP\x03-\xfa\x10x\xc6\ +de+s\xb0L]\xdc\xe2\x9c\xdeQ\xca \x9c\xc0\ +\xcehjr\x90J,$/\xd3\xa9\xcd\x82\xc8`\x80\ +\xa9\x14\xe11\xc7I\xff\xcee\x9e\xf3\x9c\x0dP\x0a\x0b\ +\xb2\xc0\xcev\xbas\x93I\xecd\xd6\x9ePO\x84\x04\ +C\x02\xc5\x0c\x9e$\x93\xd9Os\xfe\xf3\x18\xad\xb8\x00\ +R\x8c\x01\x85\x8e\x12\xb4\xa0\x07\x9d\xe6\x02[\xd81(\ +,\xa0\xa1\x09\x19\x82\x1b\xf2\xb9\xb8\x89\xba\xb2\x9c\xff<\ +g+f\xda\x0a \xac\xa4\x16?\x98GG\xa1\xf0Q\ +\x83FS\xa4\xc7ka\x12\x12\x80R\x85x`\x0d\x5c\ +\x0c'?azQ\x9a\xce\x14\x02\xb9P\x89'd@\ +U\x9dz\xb4\xa0\xd0\xfc).\x13\x8a\xbcx\x14\xb5$\ +\x03(\xe0D\x95\x19\xd3[8u\xa6r\x90\x03\xeaN\ +\x82\x8b$$\x82\xaaU\xf5hOC\x0a\xcf\xa0N\xe1\ +\xab%\xb1E&$*\xced2\xf5\x9c\x18ujZ\ +\xe5\x00\x0a\x0d\xa4\x84\x18\x89H\xec[\xe3zU\x90\xd6\ +\xf2\x96\xb94\x9e\x1f\xf0j\x12[\x84\xa2\xa5}}\xa9\ +?\xffy\xd6V\xa4\x15\x14\xa0\x05E\x12N\x22\x8b$\ +\x5c\xe2\x12\x8a]\xac\x0c\xac\xcaS\xc7>\x16\x97G\xb0\ +\x000)k\x92\x12\xff\xec\x93\xa2\x9b\x05\xecY?\x1b\ +\xda\x16\xb4@\x17'!F\x12\x8aP\x84\xd3\xa6\x16\xae\ +V\xediV\xa5\xb9\x89s\x10\x95\xb6&\x09\x00$\xc6\ +\xf9W\xb3\x0a\x96\xb7\xa0\xf0\xadv\x13\x91W=$\xe1\ +\xbb\xc45nb\xe1*\x83\x9d\xce\xf5\xb1\xc38)t\ +Q\xd2\x00\xbfZT\xb7\xd7\xed\xadv\xb5{\x8b\x92<\ +\xc1\x02\x16\xf8.x\x8b\x8b\xda\xf12\xf6\xbc\x99\x04\xc1\ +zS\xa2\x05\xb2r6\xbe\xf2\x9d\xef\x0a\x16|\xd7\x85\ +\xa4\x00\xbf\xf8\xd5\xefp\xf9\xabX\xe466\xab\x8d\x18\ +\xb0J\xf6\x90\xdb\xc0\xa2\x95\xb0\x09\xd6\xee\x82G<\x81\ +\x1a%\x04\x05z\xd0\x03\x84#\xac\xdf\xf0\x1e\x97\xaa\x17\ +\xb6\x80\x895\x8c\x92-\x1c\x98\xa6\xd8\x9d\xafoG\xcc\ +\xe3\x15\x9c@!\x14H\xb1\x90W,a\x17\xfbw\xb5\ +W\x9d\x1f\x8dS\xa2\x09\xeb\xe2\x18\xc4\xd9\xd5q\x8f{\ +<\x83\x84(\xea\x07K\x10r\x8a\x89\xdc\xe2\xe2V8\ +\xaebX\xf2J\xc8\xf0\xe4\x10\xefx\xca<\x1e\xc5(\ +\x94l\x90'\xc4\xe3\xff\x07p^B\x96\x87\x0c\xe1\x22\ +{\xd9\xbf\x16\x10\xf3Q&\xe0Y3\xb7\x00\xcd#V\ +\xb3\xa0\x97\x80\x105\xc4\xe3\xd0o\x8e\xb3\x96U\x5c\xe7\ +\xfd\xf67\x11\x8b\xd4\xb3J\x1a\x01b)\x03z\xc1\x82\ +\xcet\x15\x0e\x12\x80\x14 \x1a\xd1pV4\x9dY<\ +\xe1K4X\xd2*\x01\x80\xa5\x01\x9d\xe9V\xab\xd9\x18\ +\x06\xf9@\x0af\xed\xe9O'\x1a\xcbZ\xe6\xf2pQ\ +\x80\xea\x95\x00A\xc4\x97v\xb5\xb0G[\x10\x18La\ +\x0a\xb4\x9e\xb5\xado=\xe7-Gx\xad\xbdN\x89\x1b\ +\x82-\xecV\x1f\xe0\xdaD$\x88,\x8e\xcdmd'\ +\xdb\xd6\xa1n6\xa37\x10\xed\x95h\x01\xcd\xd5\xce\xf4\ +\xb5\xd7}\xed\x82\xa0\xe0\x05/\xe86\xb7\x93\xed\x07p\ +\x8b\xfa\xd4\xe5F\xc9+\xda\x10\xe8t\xab\x99\xdd\x00?\ +\x00\x0c\x08\xd2\x0fx\x1b\x5c\xde\xc7\xa6\xb7\xbd\x97\x80\xb3\ +|\xabD\x0f+\xf0\xf7(\x02N\xf1\x02\x10$\x19\x06\ +\xcf8\xbc\x11\xaepP?\xd7\xe1(\xd1A\xba)N\ +\xf2\x03\x04T \x8e\xff\x18\x81\xcaU\xae\xf1\x83s|\ +\xd6\xf5\xce0\xc8UB\x09u\x97<\xe0\x88\xc8y\xce\ +\xd5+\x88\x95\xfb\x9c\xe5-\x8f\xb7\xbcgm\x85\x99\xab\ +D\x0d\x13\xbf9\xbbu\xce\xf4\x9c\x1bA \xf8\xb9\ +\xd4\x81\xaeqyS\xc3\xe8)Y\x80\xd2\x0f\xd0\xf4\xae\ +\xe7\x5c\x06\x02\xc9\x9f\x1a\xc6\xae\x86\xa9\xff<\xe82\xc7\ +:J @q\xaf\xbb=\xe7k\x10H#\xc8Nw\ +\xb2\x9b}\xe5\x06\xaf\xa0\xdaO\x92\x88u\xbf\xfd\xef9\ +\x87\xc6?l\xc1\x82\xc2\x1b\x9e\x05u\xa7\xfb\xdd\xd9\xbc\ +\xf7\x92\xf8\x00\xf0n\xef\x80\xe4'\xff\x8f\x00$\xe3\xf0\ +\x98/|\xe2\xed\xberi4\x1e%\x90G\xc4\xe4G\ +O\xfa\x10\xe8 \x19\xa8O=\xea3\x7f\xf8\xc4\xa7\xfd\ +\xf3%i@\xd7IO\xfb\xd1\x97\xe2\xf6b0\x06\x0c\ +T\xcf{\xd5\xb3\xde\xf0\x96\x84\xbdIL \xfa\xda\x93\ +\xfe\xf6\xc8O~)\xe2\x01\x02\x188\xff\xf9\xcf\xef}\ +\xef\x0d\x1fi\xe1\x93\xe4\x12\xb5W\xbe\xf6\xb5\xbf\x89C\ +4\xa2\x11\xd0\x0f\xbf\xff\xf8\xa5\x8f\x0e\xeb\x97$\x19\xdb\ +O\x7f)\x14\xc1\xfe\xf6\xb3\x9f\x0b$\xf8\xbe\xfc\xe7/\ +\x7f\xf1\x8b\x9f\x06\xe6'\x89\x0b\xb6\xef\xfe\xfe\xfb\x9f\xfd\ +\x8f\x00\x04\x14@\x01\xf4W\x80\x06X\x7f\x1f\x97\x7f\x09\ +\xf1\x7f\x0c\xd8\x80\x12p\x02\x03\x18\x81\x128\x81\x11h\ +\x80\xb8\xa0\x80\x0b\xd1\x80\x1a\xd8\x7f\x1a \x06Z\xf0\x81\ +\x14\x18\x82\x22\x18G\x18\xb8\x80\x1bx\x82-\xe0\x81\x1f\ +\xb8\x82,\xd8\x82.\xb8\x82%\x98\x10\xcd\xe0\x7f\x08P\ +\x836x\x838h\x83\xa3\xc0\x04<\xd8\x83L\xf0\x82\ +@\x08\x831\x88\x109X\x84Fx\x83F\x90\x84J\ +\xb8\x84L\xd8\x84K8\x84Dx\x84R\x88\x83\xc2 \ +\x06Vx\x85X\x98\x85Zx\x85Px\x10S\xf8\x85\ +\x080\x0aU\xb8\x85dH\x86\xdf\xd2\x85\x04A\x04j\ +\xb8\x86`\x88\x83+\xe0\x03\xc1\x10\x87r8\x87sx\ +\x02vx\x87x\xd8\x0ch\x98\x86k\xd8\x87~\xf8\x87\ +~X\x0d\x80\x80\x87\x84X\x88\xc2p\x88\x88\x88\x88\xb2\ +\xb0\x87\x02\x81\x02\x80\xff\xf8\x88\x908\x01\x1f\x90\x88\x94\ +X\x89\x95\x08\x04\x98\x18\x00\x8c\xf8\x0fJ\x00\x89\x9e\xe8\ +\x87\xb4\x10\x02\x96\x88\x88\x98X\x8a@\xe0\x03\xa8\x98\x8a\ +\xa8\xa8^{\xa8\x06\x1c\xf0\x8a\xaf\xf8\x89\x8f8\x00\xc6\ +`\x8a\x98\xa8\x8a\xb8\x88\x8a\xfd\xb0\x8b\xbc\xd8\x0f\xe5\xc7\ +\x88P\x90\x06\xb08\x8c\xc4\xc8\x01\x9e\xf8\x00\x82\x90\x8b\ +\xa9\xd8\x8b\xcc\xd8\x8b\xc4@\x0cE\xc7\x88\x06\x90\x06\xd4\ +X\x8d\xd4X\x8c\xd8\x18\x8bK@\x0e>\xd0\x8c\xde\xd8\ +\x0f\xcfH\x02\xe28\x8e$p\x08\x9b\xd8\x02\xd6\x98\x8e\ +\xea\x98\x8d\x1c\xa0\x05\x09\xf0\x8d\xcfH\x0c\xe4H\x8e\x80\ +P\x8f\xf68cP\xe8\x01\xc8\xb0\x8f\xfb\xa8\x8e\xfe\x98\ +\x8e\xaf\xa8\x09\xae\xb0\x8b\xf18\x8f\xe3h\x8f\x08Y\x8f\ +J\xe0\x02.\xa0\x89hx\x02\xfc\x18\x91\xfc\xf8\x8f\xfe\ +xC.`\x90\x09\x99\x90\x0b\xc9\x90\x1c\xe9\x09\x82\xb0\ +\x87\xc3 \x91\x22)\x91\xffx\x00\x02\x11\x02$\x90\x91\ +\x08\xa9\x04\x1b\xc9\x91.\xe0\x090\x09\x93\xd5\x07\x85\x0d\ +\xc0\x08#y\x93$\xffI\x8d\x8f \x10\x19\x90\x91,\ +\xe9\x92\x1d\x19\x930y\x08\x1fP\x94z\x08\x85f\xc0\ +\x08J\xa9\x948\xd9\x94\xc80\x0c\x02\xe1\x01\x80\xf0\x93\ +@\xc9\x90B\x19\x93E\x99\x95O\xf0\x04\xf8\x07\x85S\ +\xa0\x00`\xa9\x00K\xc9\x94N\x19\x91\xdfc\x0bU\xf9\ +\x92W\xe9\x09D\x99\x95\x1f\xb0\x95p\x09kPX\x05\ +aY\x97cI\x96MI\x10\x1f\xa0\x96k\xd9\x96n\ +\x09\x97[\x09\x02\x82\x09\x02GY\x82\x82\x80\x05XP\ +\x97\x8a)\x96w9\x92\xa3\xa01W\xe9\x97Z\x09\x98\ +O0\x98\x82\xa9\x09\x9a\xc0\x8a\x18\xe8\x04\x88\xd9\x99\x8b\ +i\x97wi\x93\xfb(F\x03A\x0eC\xe9\x96EI\ +\x99\x95i\x99\x98\xd9\x9a\x1b\x00\x0b1\x88\x08\x9d9\x9b\ +\x89\xf9\x99a\x19\x9aj@\x10\xae\x80\x9aoI\x99\x96\ +y\x99\xad\x19\x02\xc2\x19\x02\xfd\xa2\x80,@\x9b\xc8Y\ +\x9b\xb6\xc9\x98\x8c`\x10!\xd0\x9b\xbe\xf9\x9b\xad\x89\x99\ +\xc3\x19\x02V`\x05(0\x0b\x18\xa8\x0b\x96`\x09\xc9\ +I\x9b\xcb\x09\x96\x7f\xff`\x10f\x10\x9d\xac9\x9d\xd5\ +i\x9d\xd7i\x05\x1bpu\xf9\xa7\x05\x02\x10\x9f\xdd\xf9\ +\x9d\xe0\xf9\x99d`\x10\xb8\x10\x98\xd29\x9d\x9a\x90\x9e\ +\xeb\xc9\x9e\x1b\xb0\x01\xe8\xe0\x0b\xf9w\x0b\xf1y\xa0\xdd\ +\xe9\x9d\xf4\xe9\x99u\x19\x8d\x05a\x05\xfb\x19\x9c\xd5\xf9\ +\x9f\x00\xba\x01\xc6p\xa1\xc5\x09{#\xc0\x0d\xc5p\xa0\ +\x08:\x9f\x0b\xea\x99\xf5u\x10\x0b\x00\x9c\xe89\xa1\xeb\ +\x19\xa0\x01z\xa1\x17\x8a\x02&$|\x08\xc0\x0d2\xea\ +\xa1\x1f\xaa\xa0!\x0av\x07\x91\x0b\xfc\x99\x9e\xeay\x9d\ +*j\xa1,\x8a\x02B:\x04F\x01{\x05\x80\x0a2\ +\x9a\xa44*\x9f\x09\xba\xa0\xd9t\x10C@\x9d(\x9a\ +\xa2*\xca\xa2\xc6 \xa4C:\x04C\xd0\x04\x9f\xe7\x09\ +\xdc\x80\x0aH\x9a\xa4\x1c\xba\xa4\x02\x90\xa06:\x9b[\ +\xa0\x10o\xe0\x9f\xff\xf9\xa3V\x8a\xa5.\xaa\xa5\xe8\x80\ +\x0e:\xf0\x05{'\x0b\xa3\x10\x01`\x0a\xa6b:\xa6\ +Kj\xa6\xb4\xf9=\x09\xb1\x01\xc2I\xa1?\x0a\xa4-\ +\x9a\xa5r\x9a\x01\x19\xff \x08\xb2dt\xa1\x10\x01\x92\ +\xaa\xa7{\xda\xa7\x1d\xfa\xa7M\x8a\x05\x88\x80\x18\x86\xea\ +\xa6A\x8a\xa5Z:\x04s\xda\xa8\x82 \x08^\xb0\x88\ +X7\xa9\x93\xba\xa7a*\xa6\x97\x8a\xa9\x96@l\x0a\ +\xc1\x0b\x1b\xe0\xa3\x9e\x9a\xa8\x8a*\xaa\x8cZ\xaa\xa6\xaa\ +\x03v\x80\x8f\xf9&\x00=\xa0\xaa\xabZ\xa9\x96J\xa6\ +\x02\x80\x0c&\xc1\x07\x87\xfa\xa6\xa0\x1a\xaa\xa3\xca\xab\xbd\ +\xaa\x038\xb0\x00g\x98o\x08\xc0\x0a\xda:\xac\xc4\xca\ +\xaa\xad\x9a\xa4\xafz\xa0mR\x12\xaf`\x0c+\xfa\xa9\ +\xcf*\xaa\xe8\xb0\xab\xa5\xea\x05:@\xad8P\xad\xe4\ +`\xa7\xd1\x96\x00\xba\xf0\x0d\xda\xba\xad\xc4*\xa9\xac\xda\ +\xa72\xfa\xaa\xcaz\x12|\xe0\xac\xe9\xaa\xae\xa4\xda\xae\ +\xef\x1a\xaf\xd5\xba\x00\x0b\x10\x00\xb0\xd9km\xf0\x0d\x12\ +\x9b\xaf\xac\xc0\xad\xfb\xda\xaf\xc7*\x00\xe3j\x12\xbc\x80\ +\x02\xb8\x1a\xa7r\xba\xae\x07;\xad\x0a\xcb\xb0\x0b\xc0\x07\ +|\xf0\x06\x0f+f\xbd \x01\xaa\x00\x0c\x12;\xb1\xdb\ +j\xb1\xaa\xea\xad\xfe\xff\x1a\xb0(\x11\x00p\x0a\xb2\x06\ ++\xad\xee\x0a\xaf\xf1\xca\xb0(\xcb\x074@\x0e*+\ +f\xd4\xd0\x00\xaa\xb0\xb40\x1b\xb3\x14K\xb35k\xac\ +I\xdaG*\x81\x0e\xb9:\xaa#\xfb\xb3%+\xb4(\ +[\xb4\xe4\xe0\x01o@\xaf\x1a\x06\x0au\xb0\xb4L\x1b\ +\xb3\xf8\x9a\xafP[\xac\xc6j\x92+A\x0d\xa1\x1a\xb2\ +\xecj\xaaZ\x1b\xb4\x5cK\xb4\xe4\xf0\xb5\x1e\x10\x00o\ +@\x82\xebE\x04\xf5P\x0fek\xb6M+\xb33\xbb\ +\xaf\xfc\xca\xaa\x82\xaa\x12\x0b \xb7Y\xfb\xae@k\xb2\ +C\xeb\xb5\x1e\xb0\xb7\x01\xc0\xb7\xc0ZT#\xd0\x03\x81\ +\x1b\xb8\x83{\xb6N\xfb\xb4\x88K\xa9\xa8\x801HQ\ +\x0b\x82 \xb2\x8f\x0b\xb4\x0b{\xb2]\x9b\xb7\x95k\xb9\ +o0\xbb\x17\xf8U\xbd0\x03\x18\xd0\xb9\x9d\xfb\xb9\xa0\ +\x9b\xb6j;\xba\x11\xa0\x00K\x91\x00sK\xb7\x09\xbb\ +\xb5\xae\x8b\xb7z+\xbb\xb3\x9b\x00\x09@\x0d\xd7\xaaM\ +.\xd0\x01\x18\x90\xbb\xba\xeb\xb9f\xdb\xbb\xbe[\xb1k\ +\x1b\x01^\xb5\x14\x86\xff\xe0\xb3\x90\x8b\xbc\xc9K\xb9\x95\ +{\xb9|\xfb\x06<\xe0\xbc\xd4@\x0d\xcfPO\x5c\xa0\ +\x02\xd5[\xbd\xd7+\xb8\xbc\xfb\xb2h\xfb\xb4P\xbbi\ +h\xc1\x0b:\x80\xb0\xc7\xdb\xba\xe5\x0b\xbb\xe7{\xb9\xb3\ +\xbb\xbe\xcf\xdb\xbe\xb2\xd0\x0b\xaf\xe0/\xf1`\x09h \ +\xbf\xf3k\xbd\xba[\x07\xf7[\xb8\xdb[\xb1\x93\x9a\x06\ +k\x81\x0b^P\xb7v\x9b\xbc\xca\x1b\xbb\xe8;\xbbo\ +\xc0\xbe\x0a\xbc\xc0\xb8\xd0\x04\xd1k#\x1d\xb0\x0ah\x10\ +\xc1\x12<\xbf\xf5k\xc1\xd9\x8b\xbf\xa1\xfb\xbb\x11P5\ +k\xf1\x06\x01\xdc\xbaC;\xc2\x05\x9c\xbe'\x8c\xc2\x8e\ +\xa0\xc2\xb8\x80\x0b\xb6\xe0\x0a\xbc\xa0\x9d\xfd\x81\x08\xbb\xb0\ +\x0aR\x1c\xc3*0\xc3\x14\x5c\xc1\x17\x9c\xbfOkq\ +\x85\xe1\x0b|\xa0\xb0@<\xb9\x04l\xb9D\x8c\xc0\xed\ +K\x0d\xb2\x80\xc4\xb6`\x0b\xcd\x90\x0bL\xbc\xb2\xa4\xa1\ +\x0c\x96p\x0at\x1c\xc50L\xc5\x13|\xc5\xbb\x9b\xc5\ +9\xcc\x0a\x13@\x1a\xbc\xb0\x00\x02\x1c\xc4\xe6K\xc6&\ +l\xc6)\xdc\x0bI\xff,\x0dl\xec\xc6\xae\xf0\x0a\xaf\ +\xc0\x0b\xb0\xe0\xc4iA\x18\xa0\x10\x0b\xb1@\xc7u,\ +\xc5w\x5c\xc5y\x5c\xbf\xf6{\xc3\x18\x8c\xaf\x08P\xa4\ +\x87\xf1\x0a| \xb9b\xbc\xbc\xe8K\xc4\xce\x9b\xc0h\ +\xac\xc8I\xbc\xc6m\xec\x0a\x8f\x5c\x0b\xbc\x90\xcb_0\ +\xc9\x94\x9cu\xff\xb0\x06\xc8 \x02\x22\xf0\x0e\xef\x80\xc9\ +\x9a|\x0av\x1c\xc32\xfc\xc95\xcc\xc7\x12\x8b\x05\x0e\ +J\x1a\xcdp\xb7B<\xc4&\xfc\xcag\x9c\xc6\xb2\xcc\ +\xc8\xb5\xfc\xc8\xaf\x80\xcb\xba\xbc\xcb\xbe0\x0bmP\x00\ +?\x10\x0c\x9a\x80\x03\xd40[\x03\x11\x02'\x10\x0f`\ +\xe0\x0e\x96P\x01\x15 \xcc\xc2L\xcc\xc6\xac\xc9v|\ +\xc7\x11\xcc\xcc5|\xc38\xcc\x0a\xc2\x00\x1e\xda@\xc8\ +cl\xc8\x07\x8c\xc2h\x8c\xc4J\xdc\xc8\xb6\x0c\xc9\xe0\ +\x1c\x03\xbb\xcc\xcb7P\xd1\xa9p\xd1\xa6\x90\xd1\xa6@\ +\x0a\x1cM\x0a\x84@\x08\xf4\x1c\xd2\xf5l\xcf\xf8\x9c\xc9\ +t\xcc\x0c\xfbL\xc5V\xac\xc7\xbb\x0b\xd00\x9b\x02\xfd\ +\x81\x0d\xaf\xbb\xbc\x08\xff\xad\xbe\x0a\xbd\xd0\xdb\xec\xd0\xde\ +\x0c\xce\xbc \xd1\xb00\xc9\x15m\xd1\x18\xad\xd1\x1d\xed\ +\xd1 -\xd2#}\xcf\xc5l\xd2\x9b<\xc5*\xed\xcf\ +\xd7{\xbf\xaa \xab\xfcA\x0d\x85\x5c\xd3E\x0c\xcb\xda\ +\x9c\xc4\x0d\xdd\xcd\x10\x9d\xcb\xbc\xf0\x05\xe2<\x0bA}\ +\x03\x17\x9d\x0a\x1a\xbd\xd1E}\xd4\x22m\xcf\xc3\xbc\xd4\ +\xc7\x8c\xd2\x9c\xfc\xd4P\xbd\xc7\xd9\x1b\x0dn\x22\x0b4\ +]\xc2\xd7\xac\xd0[=\xcbl\xdc\x0c\xb6|\xcb<-\ +\xd6\xb00\xcee}\xd6i]\xd4\x1e\x8d\xd4I\xad\xd4\ +\xf9\xdc\xd4\xfc\xec\xc9\x13\x0c\xca\xa1\xac\x0aYp*\xd2\ +@\xc2|m\xd3\xb0\x8c\xd3\x5cM\xcb\x8e\xfc\xd5\xb9\xec\ +\xd3\x87M\xd6A\xad\xd8\x1a\xfd\x0bk\xed\xd8\x8f]\xd2\ +\xc7\xbc\x0b)\x8d\xc7u\xbd\xc7T\xed&\xb6@\xc6e\ +\x8c\xcd\x89\x1c\xda\x81=\xda\xdf\x0c\xd6\x86M\xd1B=\ +\xd4\x19\xcd\xda\x1d\xcd\xd6mM\xd2K\xcd\xd4\xc8<\xd7\ +t]\xd9\xa0\x8co\xa7\xe2\x0a\x9d\x8d\xc0\xb0|\xc4\x0c\ +-\xda\x0f\xfd\xcd\x85\xff=\xd1\xa8]\xdch\xbd\xdak\ +\xad\xdc\xf4\xec\xd6o\x1d\xd9\xc8<\xdb\xcb\x5c\xd7\xdcP\ +O\xbc`\xc2\xcd{\xd3\x7f\xdd\xd0:M\xda=m\xd8\ +\x88\x9d\xda\xaa}\xdc\xe5\xed\xd8\xe8\x0d\xdb\xb1\xcd\xc9\x9d\ +\xbc\xd2W\xcc\x01!\xd0P_@\x0d\xf3\xed\xd7\x0c\xdd\ +\xd5\x8e\x1c\x08\xf8=\xdc\xfb-\xdei\x8d\xdc\x1c\xfd\xd1\ +\xae\xed\xd6%\xed\xdc\xb2\x0d\xdd\xed-\xdd\x0d\xd0\x95\x0d\ +5\x0b\xb8\x80\xddg\xac\xdd\xb2l\xdf^\xed\xdd\xc2\x0d\ +\xde\xe1m\xd6\xfdm\x0a\x18n\xd4\x1b\xce\xe1p=\xe0\ + N\xd9\x13\x9c\x09\xb4\xf5\x0a\xf4\xfd\xe0\xdc\xdd\xdd<\ +-\xd10\x9e\xd83^\xe3\x1a\x0e\xe08\x8e\xc9\x1e\xce\ +\xde<\x8e\x01\x96\xf0zx\xf5\x05\xb8\x90\xcd\xf5\xbd\xc6\ +\xf7\xed\xe2\xa5\xad\xdf1.\xe3\xc6M\xe3\xff\xcd\xe4\xcc\ +\xed\xe4\xc7\xfc\xdc;.\xc1\x13\xa0\x99\xd0\xe5\x0a\xd4\xa0\ +\xe2\x5c\x0d\xe1\x83\x0d\xd1\xdf\xfd\xd3\x15^\xdci-\xe6\ +\xc9m\xde!\x1d\xe09\xae\xcfP\xae\x02=\x90gb\ +\xf6\x05M\xb0\xc0+\xff\xae\xe5-\x1e\xdc]>\xd1w\ +~\xd6\xe3M\xde\xad}\xe3e\xae\xdeh\xee\xd4h\xc0\ +\xbf\xa8V\x0bq\xce\xc8:\xbd\xd3E>\xdc\xb3\x10\xe3\ +\x90\x9e\xe75n\xe3d\xae\xd4\x7f^\xc7)=\x09\x0e\ +7\x0b\xd7\x00\xd8\x9f\x8e\xdfa\xed\xe5\xa4>\xe3z\xbe\ +\xe7\x94^\xe9\xce\x8d\xe6\xdf\x00\x05\xec\x9co\xb0\x10\x08\ +\xa2\x0d\xdc\x8c\x1e\xcev\xfe\xe5\xa5~\xe1\x8c\xbd\xe4\xa9\ +\x9e\xde\x96\xbe\x0bu\xc0\xc5j\x07\x0b\xaf\xd0\xcd\xa0\x0e\ +\xd6F\x9e\xece\x0d\xe6\x91\xee\xdfc\xfe\xec\xc4\xbc\xea\ +\xf5\xa0Q\xc2\xe7\x0b\xbc\xd0\xdd\xc7\x9e\xdfG\x8e\xe4a\ +\x9e\xeb\x19\xce\xe7\xe7\xed\xe7fn\x09N\x80\x81\xb3\x10\ +\x03\xbc\xc0\xe5\xe1\xdc\xee\xfc\xfd\xee\xa7\xee\xecH\x8d\xde\ +\xd0~rP\x08\x0b1\x10\xea\x8e>\xea\xdd\xbe\xec\x92\ +\xae\xeb\xae\xfd\xd8\xc3<\x09\x0f\xf0\xa2{\xe8\x0b_\xc0\ +\xee\xdc\xee\xee\x00\xdf\xec\xf2>\xef\x22P\x0a\xca0\x93\ +\x9b8\x10\xb3\xe0\x0b?}\xda\x0d\xef\xf0\xe0\xbe\xe7\xf2\ +\xce\x0dn@\xdd%:\x9f\x10\xa3>\x0b9\x80\x01\xff\ +\xde\xf1\x1eO\xcf\xdf\xd0\x00\x99\x90\x9b3\x8f\x14\x0b\xe0\ +\x02j0\x0ck\x00\x01\xb7\x90\xad\xaa\x80\x06\x19\xad\x02\ +\xdf\x10\x01\x8a\xa0\x01\x900\x03\xf7\xfe\x0f\xa31`\x01\ +\x01\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\ +\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\ +\x13*L(\x08\xc4\x095).\x11\x00S \x93\x09\ +\x13\x172\xf5y c\xc9\x08#\x1f\xd0\xf1XH\xb2\ +\xa4\xc9\x93(S\xaa4\x08\x02\x8e\x05\x06\x5c\xb8\x0c\x98\ +9`N\xa8\x9b\xa1.\x9a\x98\xb1\xa6gO\x03@\x0d\ +\x0c\x90\xa1\xc6\x93\x87\x95H\x93*]\x8a\xd0\xd3\x8b\x07\ +\x17\xa2\xc6\x9cJ\xd3&N\x9d<}\xae\x09j\xa0\x86\ +\xd7\x1a%\xb8X \x16\x80\xa9\xd9\xb3h\x07.\x10\x03\ +%\x93\xdb\xa8QwL\x959\xd3\xeaM\xacZ\xb7\x06\ +\xfd\x0a\xb6D\x09J\x94\x0a\xb0\x10\x94\xb6\xb0a\x92\x01\ +\xc4d)\xd0\xc7\xed[\xb8r\xa9\xd6\xc5\x99\xf3bV\ +\x9f\x5c\xf9\xfa\x05\xfc\xa8\xf3\xa3\x0b\xc9\x0e\x8b\x16\xad\xe9\ +\x07\xc5\x02\xa8\x1d?\xbe\x109fU\xcax1g\xfe\ +\xba\x99\x92\xe7\xce\x0e\x1cl\xf2\x14h\xb4\xef\xa4\xb8\x80\ +l\x02C\x1c5\xea\xc6\x8e!\xcf}}\xd5\xb2\xd6\xd9\ +\xb4\xff\xda\xf6\x9c\xdb\x01-Zk`\xfc\xden\x92\x9a\ +\x96\x07\x0c\x88\x8b\xff7\x8e|\xf5\x85\xe5\x93\x9b\xef|\ +\xbe7\xba\xf4\xdb\xb9\xaf\xd3r\xe3\xe6\xd1\x14\xee\xf8\x0f\ +2\x01\xcf \xbc\xf8\xd3\xa9%\x07\x17z5\xc1\xe6\x9c\ +l@i\xf6\x1e|\xd6\xcdG\x1f}\x0e\xbc\x90@~\ +\xf8\xf5s\x842\xfde\xf8\x9fq\x8c\xa9\xa6\x9cd\x03\ +\x18\xb8\x1e\x82]E\xc7\x19u\xf19H\x1f\x00,>\ +\xa2\x1d\x85\xa3m0\x8f24b\xa8\xe1\x86\xc7y\x18\ +\x17\x81\x22^\xa6W\x82&N\x87[\x83\x0f\xae\x08\xc0\ +\x16H\x9a\xe0\x09\x8c\x85%\xf0T\x8d4f\xd8\x1f\x8e\ +\x01\xae\xd6\x1a]\x05\xdeu\xe0O\xed\xf5\xf5\xd7m\x8f\ +\xa4X$\x8bGn\x01\xc9\x99\x04\x1c\xc5$S\x9e\x10\ +\xf0\xc0\x9bP\xda8\xe5x\xe4\x09(\x15\x88v\xc5\xc6\ +e\x89^\xd5\xc6\xa0|c\x96i\xe6\x99\x90\xd0\xa2\xc5\ +\x9aJM\xc1\xc9\x9b\x8cB)%\x15T\x96\x97\xc9\x80\ +x\xaa\xe7c\x97}\x9d8\xe4u\x81\x96I\xe8\x99\x10\ +@\xa0LY\x88\xa2\xb4\x01\x19G,\xca\xe8\x03qJ\ +IeEv\xb6\xff\xc6\x5ce#\xee\xa9\xa0\xa6a\x12\ +\xf9 \x8bH\x0eJh\xa8\x10<\xe2B\xa9&\x89q\ +\xc4\xb1\xa9\xae\xcaj\x8d\x8fR\xa9#k\x95jY+\ +t\x99\xfe\xa9\xa2\x91H~\x0a\x09\xb0\xa1V\x11\x0f\xb1\ +\x0a\xc92\xc5&\x9b \xcb\x89\xaap:zcq9\ +Z\x19-\xad\x97A\xe7'\x8a\x9c\xee*\xe8\xa7\xdcv\ +[\x05\x18\xe0\x22\x94\x08\xb9\xe5\x9a\xab\xac\xba\xfdA\xca\ +n\x95\x93\xde\xe9Z\x96\xf0\x92\x18$\x8a\xd6\x15\xe9\x06\ +\xaf\xbe\x82\xcam\x15\x18WQB\x06\xfd\x0e4\x04\x19\ +\x04\x10\x000\xb2\xc9\xaeJ\xb0\x7f\x07?\x8b^\x9e[\ +b\xba\x99\xb5\x81\xf6\x8a\xef\xc5\x19c\x0c\xc9\x07\x1d\x83\ +0\xcc\xce!\x8f|\xec\xb9&3\xbb.\x80\xe5}H\ +\x17\xcb\xd3\x02\xd9\xe7\x97\xf4^K\xb1\xb64\xd7,\x81\ +\x04U\x18\x01\xae\x0b;g\xdd3\xb9\x02\x07\x1d\xe5\xba\ +\x1c\xc6\x0a\xa2\xa5\x08>\xbc\xa9\xd3\x9e\xce\x0cl\xcdU\ +L\xed\xf6\x8bk\x92\xe0D\xd6\x08\x94Nq\xcb\ + \x9f;&@\xc1'\xfc\x86\x1cIH\x9f\xfa\xd8\xe7\ +<\xadA\x0f~\x04\xab\x9eq2\xb1\x07\x16\xae\xafy\ +\xf7\x11+I2qL\x8d\xa25\xad\x02\xfd\xc3\x1fT\ +w\x12[\xbc`\x0anM\x81U\xaf\xfaS\xaeB\xb3\ +\xae\xe9\xbb+a\xf5\xba\x100\x98\xd5\xa9\x7f\x05\xac`\ +\x05;\x81\x94|`\x0a\xa0E\xac[\x17\x1b\xd7\xad.\ +\xd4\x96\x91}\x01eOr\x81\x09\xda\xb4\x95\x80\x0d\xec\ +f\xff\xa0\x01\x0d\xffP\xd2$\xb8\x18\xc1aC+\xda\ +\x14\xc0\xb5\xb1\xa7\x95f\x0fS\xb0\xda\x93\xc8b\x0d~\ +Mfl\xcd9\xdb\xda\xd6\xb6\x01'\xf9\xc0\x0b\xa6\xbb\ +\xdb\xd0\x8e\x96\xb1r5)C\x97@\x8d\xe2\xa2\xc4\x0d\ +\x98Unl\x9b\xeb\x5c\xe7&\xa1$\xcdP\x83n\xa9\ +[\xdd\xde\x92\x16\xb8]M\x02H\xbd{\x12\x14\xb8C\ +\xbc\x9a\xddly\xcb\x9b\x83\x06Lh!V\x18\x81\x80\ +\xd7K]\xde&\x16\xbb%m\xa7\x15\xe8\x9b\x121\xc0\ +v\xbc\xfa\xdd\xaf\x06r\x90\x03]\xe8b\xb2\x08\x81\xc1\ +\x80\x07\xcc\xde\xf6\x1e\xd8\xa7\xd9\xb5@0\x18\xac\x12(\ +p4\xbf\x82\x95\xf0\x84+la]H`!^P\ +\x83z7,\xe0\x0e\x1bX\xb1\x8cE(\x86Il\x12\ +\x07\xa4\x95\xbc\xfb\xa5p\x8b-|\x8b[\x08C!@\ +\x90\xb1\x8ci\x5cc\xf6Z\xf7\xad ^\x00\x8fU\x12\ +\x02\xa8F8\xc8,&r\x91\x8b<\x80\x84P\x83\x05\ +`V\xf2\x92ilc\xd0~\x98\x04S^\xc9>d\ +K[\x09\x0b\xb9\xff\xc5[\x8e\xf31\xcc\x80\x10+\x80\ +\xf9\xceb\x9e\xf1\x86\xcb,\xda\x17L4\xcd*\xa9\x02\ +\x90\x9d\xfbf-\xc7\xf9\x16\xadH\xf4\xb7\x0eb\x84d\ +8\xfa\xceaV2\x93\xf9\xbc\x01@\xafD\x0b)\xc6\ +\xf2\x90\x0f}\x8bc$\xfa\xd3\x908\x08\x0f`\xe0\xe8\ +R'\x03\xd2y&3{\x09ji\x948 \xc8\x9b\ +>\xb4\xa7?M\xebV\x1c\xc4\x0a0\xc85\xa9M\x0d\ +i\x16\x88y\xd2/\x10G\xabW\xd2\x0fB\xc7Z\xce\ +\xb5\xfe\xb4\x1c\x96\xbd\x04\x83\x08\xa3\x11\xba\xd6\xb5\xa9O\ +\x8dgIo8\x9b\xc3^\xc9#\xb2\xac\x0bY';\ +\xd1\xcb^6(@\x01\x80\x82\xe0\xa2\x11\xe8Fw\xb4\ +s=mT[{\x08\xd9^\x89\x11\x0c\xbd\xe5o\xb7\ +\x22\xdcr\x18\xb7\xbeAA\x0e\x82\x08\x82\x02\x14Hw\ +\xba\xd7\xbd\xebGW[\x0d\xac\x8e\xf7I\xfc\x81\xecd\ +\xe3{\xdf\xe3n\x81\xc4\xb1-\x90'\x00\xfc\xe2\x02\x1f\ +x\xb4y}g\x97*\x5c%?(\xf2\xb7\x1f\x0eq\ +\x89\x9b\xbc\x05\x0c\xff \xc8\x09\xb4p\xf1\x96\x07<\xe3\ +\xeb\xe6uw?\x9e\x1238<\xdc%?\xb9\xce\xdd\ +1\x10\x5ch\xe1\xe7@w9\xc03\x0e\xed\x8d\x1f\x99\ +\xe6*1\x00\xb8q\xbeo\x9d\xeb|\x05P_\xc1@\ +\x0c\xc1\x04&\x00\xfd\xea,\x17:\xccs\x0do\xa4\xa7\ +\x84\x05L\x8f\xb8\xd3M\x1e\xf5\xb2\xaf@\x0c\x02\xd9\x80\ +\x11\xd6^u\xabc\xfd\xe7Z\x17x/\xbc\xae\x92\xa6\ +\x8f\xbd\x05f\xcf\xfb\x0a\x8a \x90\x0f\x88A\x0ck\x0f\ +|\xdb\xdd\x8eu\xa1\x1f\x9d\xee(\xd9\xc2\xdd\xf5\xce\xf8\ +\x15\x84B \xc2\xf8\xbb\xe4\xff\x1ex\xb6W\xfd\xedY\ +_0\xe2Q\x92\x84\x937\xfe\xf3+\x80n.\x82A\ +\xfa\xc9\x9b\x1e\xf0\x95o\xfb\xd5\x91\xba\xf9\x93\xf4\x03\xf4\ +\x8c\x1f\x85\xecg\xff\x8f\x04\x9c\xe0\xf6\xb7'}\xe9O\ +O\xf9\xd43\xa1\x19\xad?I\x00`\x0f\xf5\xd9\x1b\xdf\ +\xf8\xff\xe0\x830\x96\x8f\xfb\xe6\x9f@\xf7\xc1\xe0\xfd\xdf\ +\x0f\x1f\xfc\x92L@\xef\xc7\xcf~\xf6O \x88\xe5{\ +\xff\xfb\xc2p~\xff\xeeu/yCV\xbf$\x5cX\ +\x81\xf6\xd7\xbf\xfe)\x18\x03\x08\xf0\x07\x02\xf8\xe7\xcf|\ +\xf1\xa3\xe0\xfc&I\x02\xfb\xf7o\xfc\x03\x0c\xc3\x0a>\ +\x10\x80\x02\x18\x80\xf1\x07\x7f\xf4\xf7}8\x80\x7f%\x01\ +\x03\xfc7{\x07\xf0\x80\x10\x18\x81\x05\x00\x02\xfdP\x81\ +\xfd0\x80\x188\x80\x05(\x7f\xc2\x80F\x0a\x98\x10\x9e\ +p|\x118\x82$\x18\x81\x06\xf0\x01\x16\x98\x82*\x98\ +\x82\x19\x18\x80\xb2\xf0\x81\x0b\x81\x02%8\x834\x08\x01\ +\x9e@\x0c8\xb8\x82:\xb8\x83\xc0\x07\x83\x0aA\x83@\ +8\x82m\xe0\x02$P\x84Fx\x84G\x88\x83J\x98\ +\x83\x15hG>\x88\x10\xbd\x10\x84Rx\x009\xe0\x09\ +\x80p\x85\x80\x80\x84Z\xb8\x85E\xf8\x84\x0a\x81\x08`\ +\x18\x86b8\x86d\x18\x86\xad\x80\x85h\x98\x86j\xb8\ +\x86^\x98\x10e\xf8\x86p\x88\x08J0\x87tX\x87\ +vx\x87u\xd8\x86\x08\x11\x87|(\x86\x9e\xe0\x02\x80\ +\x18\x88\x828\x88\x84\x18\x88\xbf\xa4\x87\x04\xd1\x0c}\xd8\ +\x87r\xf0\x01\x82\xff\xe8\x09\x90\x18\x89\x928\x89\x93\x88\ +\x88\xe6\xd6\x01\x98\x98\x89\x9a\xb8\x89\x9c\x18\x86\xe5 \x05\ +\x94\x18\x8a\xa2x\x08\xa4\xe8\x0a\x968\x10\x1e\xc0\x89\xaa\ +\xb8\x8a\x99\xd8\x00\x9a\x10\x89\xa4\x18\x8b\x87\xf0\x01\xb4X\ +\x8b\xb6x\x8b\xb8p\x8a\x03Q\x0a\xbc\xd8\x8b\xbe\xc8\x8b\ +\xac\x98\x89U\xb0\x01\xb7X\x8c\xb7\xf8\x04\xc8\x98\x8c\xc8\ +\xf8_\xa7\xe8\x02\x8a\xf0\x8b\xd0\x18\x8d\xbfH\x09C`\ +\x8b\xcax\x8d\xd8\x98\x8cR\x00\x02jr\x8a\xc9\xa0\x08\ +\xe0\x18\x8e\xe2\xf8\x8c\xd2\xe8\x8b\x17\xe0\x05\xd9\x88\x8d\xdb\ +\x08\x02\xec\xd8\x8e\xed(e\xba\x98\x08\xe38\x8f\xf4\x18\ +\x8e\xbd\xb8\x09\xf2\xa0\x8cR\xb0\x8e\xee\xd8\x8f\xed\xa8\x09\ +\x00\xa9\x098\xa4\x8b3P\x8f\x06I\x8f\xf1\xf0\x06\xfe\ +\xb8\x90\x01\xd9\x90\x0dYi\xbaX\x0d\x080\x91\x07Y\ +\x91F \x0b\xfe\xe8\x90\x1a\xa9\x09!\xd0\x91\x1e\x19\x02\ +\xfes\x8a\x139\x92$\x89\x00\x15)\x8e\xfd\xb3\x91\x0e\ +\xf9\x91,i\x05.i\x053\x87\x88\xc2P\x924Y\ +\x92\x06)\x10V\xff\xa0\x91,\xf9\x91/\xd9\x93V\xb0\ +\x01\xac\x87\x88YP\x93DY\x93\xe0\xd8\x02\x021\x04\ +;\xc9\x93>\xf9\x92\x1b\xf0\x94O\xd9u\x88\xd8\x06D\ +P\x95DP\x94X\x89\x00% \x10\x0b\xb0\x93M\xe9\ +\x94P\x09\x95\xc60\x96!\xd9\x868`\x95hY\x95\ +YY\x92Y \x10o\x10\x02_\x09\x96a\xb9\x01c\ +Y\x97\xc6\x80\x02\xfc\xa3\x87/\x90\x96|\xa9\x96Yi\ +>\xae\xf0\x95s\xf9\x94vY\x97(p\x98(\xa0\x03\ +\x88\x08\x01\x1c\xd0\x97\x8ey\x955\x99\x80\x02a\x0c?\ +9\x98\x84Y\x98w\x89\x98\x879\x04CP\x96O\x98\ +\x06\x1c\x10\x9a\x8d\xf9\x98}9\x92r@\x1080\x98\ +\x98\x99\x99\x9a\x89\x02\x9c\xc9\x99\xe8\xe0\x8108\x08i\ +P\x9b\xa0)\x9a\xa3I\x9ah\xc9\x05\x04\xf1\x06\x97\x89\ +\x99\xad\xb9\x99\xaf9\x04\xe8\x80\x0e\x19`OOH\x07\ +\xb6\xb9\x9c\xb8\x99\x9b\xa4\xc9\x02\x04\xf1\x0a\xab\x19\x9c\xae\ +9\x9c\xc5\x99\x01\xd8)\x08\x82\xe0\x08O\x98\x0c\xc8\xf0\ +\x9d\xcbi\x9b\xcd\xff\xe9\x9c|\x19\x94\x02\x91\x01cI\ +\x9d\xd5\xf9\x9a\xc5i\x9c\xd9\xa9\x9d\x82`\x08O\xd8\x00\ +\xdfY\x9f\xc8\x10\x9e\xb59\x9e|\xd9\x06\x06\xe1\x01\xd4\ +9\x9c\xb0\xe9\x9e\xc7\x09\x9f\x82\xe0\x05:\xa0\x03\xd2\x00\ +\x83L`\x9f\x0c\x8a\x9f\xf9\xd9\x9cV\x99\x08\x06\xd1\x0c\ +\x9a\x09\xa0\xc4y\x9d\xef\x09\x9f\x06z\xa08\xc0\x07\xb3\ +\xf0\x81\x0d\xc0\x08\x0c\xda\xa0\x0ez\x9b\xb8\x89\x10\x82`\ +\xa1\xed\x89\x9d\x03\xaa\xa1\x1b\xaa\x038\x10\xa38\x80\x0d\ +\x1f\xa8\x00\x8cp\xa3#J\xa2\xf8)\x9a\x1a\x80\x10\x01\ +`\x9d\x18\xda\xa2\xda\xe9\x05/*\xa38\xb0\x00\x0b\xc0\ +\x07_p~\xd4\x80\x08\x0a\xf0\xa47*\xa29Z\x9f\ +%\x9a\x06|w\x10\xafp\xa1\x02*\xa4\x05Z\xa42\ +\x8a\xa4H\xca\x07\xcc\xd8z`\x80\x05Oz\xa6Q:\ +\xa5\xf6\x89\x9f\xc8i\x10\x86 \xa0\x04:\xa4^\x1a\xa3\ +`\x9a\xa4|p\xa7\xa6\xd8z\x1f\x80\x05|z\xa6h\ +\x8a\xa3j\x0a\x9e\xb5I\x0b\xe1\x92\xa1.z\xa00\xfa\ +\xa5`z\xa7w\xffJ\x03\xe4\xe0\x01\xb0\xd0zr\xc0\ +\xa7\x94\xea\xa7P\x0a\xa8\x81\x8a\x0c\xe6\x83\x10\xb0\xa0\x03\ +\x04J\xa4sz\xa4u\xca\xa8\x8eJ\x0e\x8f\x1a\x93^\ +\xc7\x05\x94\xba\xaa\x96z\xa9R:\xa5\xa3@\x12\x09 \ +\xa7\x88\x9a\xa8\x8a\x1a\xa6\xa4j\xaa\x8f\xea\x01\x1e\xd0\x83\ +H\xa7\x06\x02`\x09\xab\xca\xaa\xad\x9a\xa69\xaa\x07%\ +a\x06/j\xabt\xba\xa8\xb9j\xaa\xbc\xea\x01\x010\ +\xad\xb5\x80t!\x80\x0c\x02\x10\xac\xc2:\xac}Z\xac\ +\x98\xfa\x9d\x92\x90\x97\x0b\xf1\x06\x88j\xa4\xa2\x8a\xab\xcf\ +\xba\xab\xd2:\xado\xc0\x03K\xfaq\x88\x90\xad\xd9j\ +\x09\xdb\xca\xad\xadj\xa3\xc6\x8a\x0cG`\x12\xbc`\x07\ +\xe6Z\xa7v\xda\xa8\xba\x1a\xad\xeb\x1a\x00op\xb0\xd4\ +\x10\xa9\xf1\xd6\x00\xdc\xc0\x0d\xf2:\xaf\xf5:\xac\xf7\x1a\ +\xa5\x8cP\x06\xf3U\x12\x0c\xc4\xbc\ +\xf0\x05_\x00\x0b\x05\xcc\x1d#`\xc4G|\xc4I\x8c\ +\xc0K\xcc\xbeN\xfc\xbe\xf0\x9b\xad)W\x18\xb3\x90\x00\ +l\xdb\xbd\xa6{\xc5\xc3;\xbe\xe4\xfb\xc1?\x1c\xc41\ +\xe0\xc5\xb0\xe0\x0b\xb3\x00\x06\xf77\x1a\xe8\xc0\x09\x8c\x80\ +\x01\x18P\xc6f\xff|\xc6i\xac\xc6\xcf\xfb\xc4z\x9b\ +\xad/v\x18_\xc0\x038\x5c\xc7q\x8b\xba\xc3+\xbe\ +y\xec\xc3!\x1c\xc4]\xfc\xc5`<\x0b7p\x03\x07\ +P\x04Ry\x16\x16\xa0\x0b*\xa0\x02\x88\x8c\xc8\x8a\x8c\ +\xc4)\xac\xc2\x0a\xdc\xbcM\xfc\xc8l\x5c\x0c\x88\xe0\x1b\ +\xbcP\xc5\x19\x9c\xc9\xfc\xcb\xc3\x01\xbc\xc5\xa0\xdc\xc7_\ +\x0c\xc8\xa5\x5c\xca\xa9\x90\x0a\xc5P\x03# \x99+\xc1\ +\x02&\xc0\x01\xab\xb0\x0ah\x80\x06\xae\xfc\xca\xb1,\xcb\ +J\x5c\xcb-\xbc\xc6\xd1\xcb\x0d\xc8\xb0\x1d\xaf\x90\xbf\xbf\ +\xbc\xc3\x1d\xac\xc5 \x5c\x0b\x5c\xec\xc7\xa3\x9c\xcc7\xb0\ +\xcc\xa9`\x0a\xf4\x8c\x0a\xee\x00\x06\xf1p\x02\xa3\x04S\ +)\xc0\x00U\xc0\x08\xa7\x10\xd0\xbbP\xcd\xd7\x9c\xcd\xda\ +\xac\xc8gL\xcb\xde|\xcb\xb8\x5c\xbb\xfc\x80\x1f\xae\x80\ +\xc9\xe8\x9c\xc5=\x0c\xc2\x9f\xcc\xc7~\x8c\xcc\xc9,\xcf\ +\xf3L\xcf\xbf@\x0a M\x0a\x84P\x01$]\xd2\x22\ +p\xd2\x22\xf0\x0e\xef\x10\x0b\x01-\xd0\x04\x8d\xcd\x06\x9d\ +\xc8\xb1\x9c\xd0\x8d\xff\xfc\xcd\x0d\xcd\x0dy\xc5\x1d\xaep\ +\xce\x9a|\xc7\xfe\xdb\xc3\xc4\x0c\xca\xee\xac\xd1\xca\xbc\xcc\ +\xf4\xec\xd1!-\xd2%m\xd2(\xad\xd2\xb1\xc0\xd2.\ +\xfd\xd21\xbd\xcdu@\xd3\x0b\xcd\xd0\xee;\xb6\xf8\xf1\ +\x0c\x8c;\xd1?=\xcc\xeb\xcc\xc5\xc6\xfc\xc7\xa4\x0c\xcf\ +\xf2|\xd4\xa6\xf0\xd1!=\xd2K]\x01(\x9d\xd2+\ +\x0d\xd5\xa70\xd0R=\xd53=\xcb\x0a\xcd\xc4X}\ +\xb7P\xb0&\xce\x00\xcc\x1c\xcc\xc9\xcd\xa0\xce\xeb\x0c\xca\ +\xa1\x0c\x0bdm\xd6g}\xd4I\xad\xd4m\xfd\xd6N\ +-\xd7s]\xd7\xaf,\xd3w\xdd\xcdW\xdd\xc0\x11\xd0\ +\xd7\x88\xf2\x0a\xa8\x1b\xcc\x14\x0d\xd6{\x8c\xd1\xc7<\x0b\ +e]\xd4\x1d\x8d\xd4I\xcd\xd6K\x0d\xd9q\xdd\xd2\x93\ +-\xd5\x95m\xd9e\x9c\xd0y\xad\xd7\xed\xab\xd5kR\ +\x0b\xa0\xfd\xd5z\xcc\xce\x86=\xd4\xa7\x8d\xdah\xad\xd6\ + M\x08\xac\xcd\xd4'\x1d\xd9\xb0M\xd7\xd6\x0c\xd3\x95\ +\xbd\xcd\xdc\x8c\xd9\xb8]\xb9\xaa\xd5/\xbc\xe0\xd3\xe4[\ +\xd1\x85-\xd4\xee\xffl\xda\x8am\xd4Gm\xdc\x22\x9d\ +\xdc$\xfd\xd6)\xfd\xd4\xcd]\xcd\xcf\x8d\xcd\xb3M\xd5\ +V}\xd5Xp\x02\xf7\xf4\x05A\x80\xc7\x83\xdd\xc3\x81\ +\x10\xd6\xc5,\xdc\xf0\x1c\xcf\x8b\xad\xda\xc7m\xden\xed\ +\xda\xea\xdd\xd2\xce]\xd0v}\xd9\xd4\xbd\xc0\x08\x90T\ +\xb0\xe0\x0a\xc5\xab\xc5\x9e\xcc\xc5\xa1,\xca\xe0\x1d\xdeh\ +m\x0a\x8d\x8d\xdcm]\xe0M\xfd\xda\x08\xce\xde\x0a\xfe\ +\xde3m\xdbK\xfc\x0d\x13\xd0obU\x0b\x14n\xd1\ +\xc0M\xda\x88M\xd4\xa8\x9d\xdai\xdd\xe1\x04\x8e\xde\xcc\ +=\xe2/\xed\xde\xd1\x0d\xdf\xb3\x0c\x0c+\x5c\x00\x00\xa4\ +W_\xa0\xdf\xfc\xed\xdd\x18>\xdc\x00.\xde\x02>\xe0\ +\x1f\xae\xe3\x22\x1e\xd5\x94\xfd\xe3\x0c\x8e\xc6\xa2@q\xab\ +\x05\x0b\xafP\xe1\x86=\xd6d=\xdc\x1cm\xe3\xe4]\ +\xdeQn\xe0\x92\x1d\xdb\xcf\xdd\xca&~\xe2\xb3<\xc9\ +$\xf6\x05I\x1e\xc4^,\xca4\xde\xe46~\xe3\xab\ +\xfd\xe1 \xbe\xdcSN\xe5\xd7\x0c\xddV\x8e\xd0\x08,\ +\x00\xc8\x9af\xbe\xff\xc0\x0b\x16\x0e\xe6\x80\xcc\xe4\x1c\xbd\ +\xe1eN\xe0\xe7\x1d\xe2O-\xd9\x09^\xe2\x83^\xdb\ +u\x00\x01\x8a\xd9j\xb0\x10\xdc\xfe\x1d\xdeN\xae\xe7k\ +-\xe9}\xae\xd2\x7f\xbe\x0b\x97\xce\xe6m^\xc6\x08\x90\ +p\x96\xf6\x05\xbc\xc0\xe8\x19\xbe\xd1\x01\xfe\xe4f\xce\xe7\ +R~\xe0<\xde\xde\xac~\xd0G\xcc\x0d2\xe0u\xb3\ +\x00\x0b\xa1.\xea\x90\x8e\xe3|\xde\xe7p\xcd\xeb\x80\x8e\ +\xe9\xd1\xdd\x03\xfc\xb2y\xc5\x1e\xe6\xff=\xe6\xc9\xbe\xda\ +\xa6\xbe\xebi\xee\xdc\xbe>\xdb\xac\xd0\x074\x8cx\xb3\ +\xd0\xe8\xd7\xfe\xe8\xc5\xad\xec\xba\x8e\xe6\x96~\xe9\x82\xce\ +\x08\x9c\x0d\x83j\xd0\x0a\xc8\x9e\xee\xea~\xe6\x94\xee\xec\ +j\x1e\xe8\xad<\x01\xa1\xa1\x87(\xc0\x00X\x80\xed\xf6\ +\xae\xed\xcb\xce\xed\xdd\xce\xde\xd6\x8c\x00\xfb\xaa\x8b\x02\x01\ +\x02`@\x04\xa3N\xea\xa5~\xf0\xae\xfd\xe7\xb1\x8d\x08\ +\x0f\xe0\xf0\x08\xe1\x05)\x00\x09\xac0\xde\x8d\x9d\xeb\xf8\ +\xee\xe7\x7f\x8e\x05\x11\x02\xcd\x1c\xaf\x10\xe80\x02\x17\xf0\ +\x07\xaa\xa0\xed\xdb.~\xf1\xb1\x80\x0a\x13 \x18\x1c\xb3\ +\xf2I\xe1\x09,\xe0\x04&\x00\x09\x1aP\x0a\xa8\xd0\x03\ +\xf5@\xd2\xf5\x10\x01\x02\x80\x08\x0d\x00\x00\xa1@\x06\xd0\ +\xc9c\x01\x01\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\ +\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\ +\xc1\x83\x08\x13*DH\xcd\x8b&\x1f0^\xe8\x99\xf7\ +`\x1a\x83\x0b\x17\xa80`\xe0$I\x0a5'\xa4\x08\ +J\xb0\xb0\xa4\xc9\x93(S\xaa\x5cY\xf0\x8d&-\xf1\ +\x8e\x80)@\xb3@\xa6\x9b71^\xd8\xc1\xa5'\x97\ +\x01@\x07\xcc\x09\xd5'\x09\x8c\x0f,\x93*]\xca\x14\ +!\x8f'a\x9cl\x04Cuf\xcd>83\xe9\xe4\ +\xe93\xe8\x9c\xa1\xa1\xc2\x9a0Q \x1e\xa0\xa6h\xd3\ +\xaa-x\xa2\x882e\x1b\xa7V\xadY\x00+\xce\xad\ +>\x7f\x02\x05\x1b6\xd4X\x133\xd6\xacy\x00C\xc7\ +\xda\xc3\x88M\x02\xb9\xf4\xe0\xed\xdb\xb8\x0c\xaaR\xbd\x9a\ +\x15o\xd7\xbd}\xfd\xfe\x0d,x\x8d\x010\x8d\xc8%\ +\x1e\x8d\xb8\x96\x95)\x0fR7v\x0c9\xf2\x5c\x9av\ +sb\xe4\xda\xd3k\xe6\xcd\x9c\x05\x1b\xd8m\x00\xca\x87\ +W\xa4\x83/%6\xe8\x08'\xd5\xabY\xc7\x95L\xb7\ +\xf2\xec\xbc\xb6\xfbn\xee\xac\x9bw\x8d\x1a\x5c(\xc8\x12\ +\xce\xfd\xa4\x18'G\xc2\x1f\xffG\xee\x18\xee\xf2\xd74\ +\x9d\xef\x84\x8eY\xfa\xd8\xdc\x9ey\x1b\xb8~}\xcd\x88\ +\xee\xf8\x0d\xf6:1l\xd3\xa6\xf0\xe2\x91\xa7\x9c\x5c\x93\ +\xd5\xa4\x1emz\x09u\xdb{\xd4\xc9G\xdfu%\x94\ +`\x80\x1a\xf9\xe5\x07\x08\x19\x04\x10\xe0\xdf\x7f\x01\xaaV\ +\x9ey\x0cP\x81\x9eMw=w\x99\x82b\xbd\x07\x9f\ +\x83\x0fFH\x09%\x06PPap\xc6$1\xcc\x8d\ +\x19\xfa\x07 '\xe3\xa5V\x1ed\xcc\xa5W\xe2z\x97\ +\xf1\xa5\x19`\x0d\xb2\x08\xa1\x8b\x94<\xf2\x08\x17H\xcd\ +x\x18\x0b7V\x99\xa3\x8e\x1d\xfa8\xa0k\x05\x92(\ +\x1b\x91\xb5\xa1\x98\x22\x92\x9d)\xb9\xe4\x8bN\xa6\x09\x85\ +\x94h\xc1\xf2\xc4 N8Q%\x8e\x1arh\x9c\x80\ +\x8f\x9d\xd7el\x96%h\xe4teZG_\x84%\ +\xa0\x99\xe6#\x0e\xd4 \x06\x9bJQ\xa3\x06\x14Y\xc4\ +9\xe70W\x02x\xa7\x87\x03\x06Y\xd7\x90\xb4E\x97\ +\xe2\x0c\xb9\xc97\xdf\xa0\x856y\xa8\x03\xa8\xd2\xb2\x07\ +\xa3+\xa1\x90\xc4<\x90\xc6\xff)\xe7\x9c\x95f\x99\x1c\ +\x88\x22\xee\xc9\xe9\x89|\x01Z\xddn-2y(\xa2\ +\x0e\xd0b\xac\x01\x9e\xb0jR\x0c@$\x22\x83\x0cP\ +\xc4*\xa9\x95u\xee\xd8\xe3\x8fzR\xf6e\xa7\xed\x1d\ +\xb9\xa2\xa0g\x9a\x9a&\xaa\xc5\xd2\xe2\xc6\xb9S(\xab\ +P/,$\xe2\xac\x0c\xb0J;i\xad\x97j\x09\x22\ +\x97\xcdm\xcb\xab{d\xc6\x07,\xa9\xa5\x9e\x9a\xaa\xb9\ +\xe7\x9e\xfb\x80\xba\x07y\x10O\x11\x97\xb8\xfb,\xac\x91\ +NK'\x96\xf5\xde\xaa\xa7U^\xf6\x19\xd4\x82\xa0\x06\ +\xfao\xb8\xc3\x0eLp\xc1\x00\xac!\x08\xc2\x03\x09\xa2\ +G\x12E\x14\xe1\xee\xbb\xd1Fz\xf1\xa6C\x00\x01\xe2\xf8m\ +\xe0\xc7\xf2\xcc\xb3\xee\xfa\xeb\xb1\xcf=+\xed5\xe3m\ +\x95\xf6\x9a\x7f\xea\xf1\xef!\x97K\xf6\xf8\xa53\x9e\xf9\ +\xcc\xb7(\xee\x18\xe2\x0a)X\xdf\xf2\x9a\xf7>\xb89\ +Lv2\xab\x9e\x9d*\x17\x17\x02L\xc1\x08\x9e@\xc1\ +\x02\xfe\xd1\x8c\x81\xbc\xa2\x19o\xf8\xc7\x06\x00\xd1\x08\x0b\ +\x80\xe1/\x9c#\x15\xf0@\xf7?\xd2\x19\x0f\x12\x03\x1c\ +\xa0&\x84\x13\x80\x11L!\x05\x09d\x1f\x03\xdd\x06\xbf\ +\x07F\x8bj\xb5\xba\x1b\x14\xff`\xa0\x09\x92$\xe5\x03\ +/(\x80\xefT(6\xc1\x89\xcf\x85\x02\x8c\xa1\xf9\x00\ +\x90\x01\xd2H\x83\x05S\xc8\x22\x0e\x15\xd8>\xc6\xbd\xed\ +q\xd2\x9b\x1d\xa5\xb04\x9e\x1f\xb8 \x00\x87\x11\x06\x01\ +>\xf6=\x16\x0e\x0e\x8a\xe5\x93b\x15\xe6X\x82\x10\x22\ +\xe6\x0bFx\xc1\x0b\xb2xC\x1c\xea\xd0}\xcfk\x99\ +\x0fgW\xa9A\x08C8\xe4\x80\x01\x17\xce\xd4\xc4\x16\ +\x92\xcfpR\x84\xc0\x1c'Y\x80\xc4 Q\x8f{\xd4\ +\xa2\x1f\x17\x08\xc8\x1e\xc2\x0c\x0a@\xdc\x84\x1efh!\ +0\x84\x0d|\xff#\xdc\x0b#9\xc9V\xfe\xe00:\ +\x18\x81,1\xc9\xc7>\xfe\xd1\x8b\x0et\x96\xfc\xaad\ +\x81\x0d0\xea\x03\x05h\xe4\xf0\x1e\x09C9\xb6r\x8e\ +\x12\x90\x80\x12\xd4\x82\x8bd\xc8r\x96\xb4\xd4\xe4-]\ +\x97Kx\xc5j\x18\xe7x\xc2\x17\xd4%\x0c\x13\xa0r\ +\x98\x8fd\xe51\x93\x99L7\xa0\x11-\xc2P\xc33\ +\xa1\xa9G>n\xb2\x8b\xd4\x04\xa3\xd4@i\x84\x0e\xa2\ +\x0c\x17)H\x95#\x03\x08\xffIc\xb6\x92\x9c\xe4\x04\ +\x03ZP\xa0\x86\x82\xaas\x9d\xd1\xb4%'q\xc9\xb2\ +\x07\xfe\xc00(#\x881\xb802\x00F1\x86\xc7\ +\xac\x02@\xc9\xe9\x0e\x19-\x05\x170`\x01\x0b\x0c\xba\ +\xce\x11$t\x8b\x0b\xa5&\xd4\x12a\x04WD\xd4 \ +\xb6\xd0\x03\xc9\xe0XL\x8c\x8es\xa3\x12p\x87; \ + \x1a\xa5\x90 \x19\x22\x1diAKz\xd2\x1c\xc2\xf3\ +uI\xb0\xc2K\x13\xd2\x8fG\x8c\xef\xa2\xe6\xcb(N\ +s\xaaS\x9d*C)8H\x86V\x83*\xd4\x83\xb2\ +3\x93(=\xaaGz\xbaT\x84d`\x0d\xe1\xb4\xe9\ +?qZ\xd5\xb6\x92 )b\x80\x81V\xb7*R\x92\ +\x22\xb4\x9dZT`\xf3,0\x02j\x94u!\x01\xc8\ +\x04T%yS\x80.\xa3\xadU\x9d@\x09\x5c\xaa\x12\ +c\xc0\xe0\xb1r\xa5k]\x87\xfa\xcc\x93\xeaU\x0f\xd6\ +\xc8\xc5_K\xd2\x0b0\xf4s\x80R\xdd(b\x13;\ +\x81\x09 \x0f%\xb9\xa0@#\x1a\x01\xd9\xc8\x02u\xb2\ +^5)^o\xa8@\x0a\xff\x00g\xb3&y\x80?\ +\x91\xb9\xd1\xc3\x8e\xb6\xb4\xc0\xad\x02\x0fRb\x85\xd5\x1a\ +\x17\xb2s}\xadP\x89\x9a\xc9>6\xe2\xb6\xb85\x09\ +\x18@\xbbV\x80\x8e\xd6\x1d\xc0\xcd\xee\x04\xe2\x81\x92&\ +h\x81\x02\xaa5.k\x1f;\xd7\xa0\xda\x95\x9dYL\ +\x86f\xa3\x8b\x92\x01\x10v\x92l\xfd\xadv\x81\xeb\x8e\ +s\x96\xc4\x0a\xdf\x05oxW\xdb\xda\xf2N\xf6\xae/\ +P\xc3v\xd8\x8b\x927\x94\x00\xbe\xa2\x95\xef|'\xd0\ +\x86\x06\xeb\xc1$\xae0\x82\x16&\xac\xdf\xfd\x8e\xd7\xb5\ +\xe6\xa5\xacIG`_\x02\x9fd\x08\x90\xd0h\x82\xdb\ +\xba\xe0\xd26\xf8\xc4\xd90\xc9\x10\x98\xc0\x84\x09SX\ +\xbf\xe2E\xaed5\x8c\x02\x0f\xaf\xe4\x04#&\xf1\x82\ +O\xcc\xe36\x9c\x16!_\x10\x86\x11\x8c\xc0b\x17\xe7\ +\x17\xbc1&\xafr\x87z\x16\x1b\xaf$\x11\x1cEl\ +\x89{\xdccH,\x84\x0fb\x10\xc3\x90\x89\xdcb\x17\ +W\xf8\xb8JV\xaem\x9d\xcc\x12\x03\xf8\x96\xb4\xf3\xa5\ +2\x8f\x1b\xc0f\x1f(\xe4\xff\x03Y\x8e\xf3\x90\x8b\xec\ +e\x18\xf37\xcc,\xf0\x00\x99Yb\x05)\xa7Y\xcd\ +\x0df\xb3\xa03\x91\x10\x5c\x9c \x18\xc1\x88s\x96\xb7\ +\xdc\xe5\x17#\xf9\xcer}\xc2\x9e\x93\x92\x04\x9d\xee\x18\ +\xd0m\x10\xb4\xa6\x1b\x80\x03\x84\xa0\xe3\x04\xa0F\xb4\xa2\ +\xb5s-\x10d\x03$ \ +\x011\x881r\x86;\x5c\xdc\x11G4\xb7Y\xbe\x92\ +\x14\x10<\xe6\x1f\xa7\xb9\xd2\x0f6\x90C\xe4\xfc\xe9:\ +\xef\xf9\xc2\x7f~r\x5c\x10\x9d%8\x80w\xcc\x95\xce\ +\xf5\x99Wa \xb6\x00\x84\xd8\xc5\x0e\xf5\x9c\xf3\xbc\xe7\ +T\x17F\x94\xae\xbe\x92P\x08z\xeb]\xefz\x0e\xe6\ +\xce\x07\x81x`\xecx';\xd4w\x8ev{w\x9a\ +\xed+\x81\x01\xdc\xe3N\xf3\xb9\xcf]\x17\x88?\xe4?\ +\x04\xe1\x82\xc6+A\x09y\x1f{\xd9\xcf>r[\x00\ +~%|08\xe1\x0b\x7fx\xc4{\x1e\xf1\x16\x10\x88\ +\x15\x1aOz\xc7C>\xf2\x80\x98|?\xd6~\xf9\x94\ +\ +(\x07\xa0\xc0\x00(\x10\x83DX\x840H\x83\x0bh\ +D8\xb8\x10\x1f\xc0\x83?\xd8\x83\xa0\x10\x85R8\x85\ +\xa0`\x02\xc6\xa0\x09\x9a`\x84Z\xb8\x85 \x0dK\ +X\x12C\xc0\x82T8\x86d\x08\x0a-p\x86n`\ +\x05X\xb8\x86l\xd8\x86k\xa8\x85\xea\xf7\x85\x07A\x0e\ +dx\x86vx\x87xh\x87\xcb\xa0\x86n\xd8\x87~\ +\x88\x85r\xb8\x10\xb8\x90\x87\x84X\x88v\xd8\x06V\x10\ +\x02\x8a\xb8\x88\x8c\xd8\x88\x8e\xff\xb8\x88+\x17\x88\x08a\ +\x88\x85\xb8\x02\x96x\x89+\xf0\x07\x8f\xb8\x89\x9c\x18\x02\ +\x92\xa8\x10\x98\x18\x8a\xa28\x8a\x97h\x05\xa6x\x8a\xa8\ +\x98\x8a\xaa\x88\x8a\x9f\x98\x10\xa4\xf8\x8a\xa4\xb8\x01\xab8\ +\x8b\xb4\x18\x89\xadH\x10\xb0\x98\x8b\x97\xa8\x01\xc6\xb0\x01\ +\xbe\xf8\x8b\xc0\x18\x8c\xc2\xf8\x8b\xb6x\x8b\x021\x0a\xc8\ +\xa8\x8b\xaf\xd8\x00(0\x8c\xce\xe8\x8b\xc6\x10\x8d\xd2h\ +\x0c\xb5`\x8c\x05\x81\x8c\xd8\x98\x8d\xda\xb8\x8d\xd98\x01\ +\xe80\x8d\xe0\x18\x8e\xe2\x18\x8d\xebe\x8d\xff0\x04\xdc\ +\x98\x8e\xea\x08\x09^0\x8e\xe1\x88\x02\xf0\x18\x8f\xf2\xd8\ +\x0b\xe6(\x10\x9e\xa0\x8e\xf8\xa8\x8dk\xb0\x00\xd1(\x8f\ +\xfe\xf8\x8f\xfe8\x04C\xa0\x84\xd6\x08\x03\x07p\x90\x08\ +y\x90\xf9\xa8\x8d\x05@\x03\x00\xf9\x8f\x02\x19\x91\x12)\ +\x90\xd6w\x8bI\x90\x90\x18\x99\x91\x0a\xb9\x8dN\x10\x00\ +\xf28\x91 9\x91\xe80\x92\xe8Pw\xf58\x07\x1a\ +\x99\x92*\x99\x02\xd4\x10\x92 I\x92$\x99\x012)\ +\x93^P\x8f\xff\xd0\x00\x88\xff\x80\x08*\xb9\x93\x08)\ +\x06M\xf0\x920\x89\x0e39\x94\x82P\x94F\xc9\x0b\ +\xf5\x98\x93J\xb9\x94<\x89\x91!\xc0\x0bA)\x94C\ +)\x93FY\x95F\xe9\x05^`u\xd6\xe8\x03K\xd9\ +\x95]\xc9\x93\x02!\x08S\x99\x01VY\x96X\x89\x95\ +:\x90\x96vd\x8c2\xe0\x95n\xe9\x96\x09\x99\x03\x02\ +a\x08dY\x96Vy\x96i\x99\x97:\x80\x038`\ +\x92\xc6(\x01\x1d\x10\x98\x1d\xf0\x96\x84\xa9\x94k \x10\ +\x01`\x97\x82p\x96^\xa0\x97i\xc9\x97\x90\xc9\x97H\ +y\x8b\x0bP\x0a\x82y\x99\x83Y\x98])\x03\x02!\ +\x0bW\xc9\x98\x8e\xb9\x97\x91\xc9\x97\x0bP\x9a\x0b\x80\x0d\ +\xc68\x02\xa5\xb0\x9a\xab\x89\x99\x82\xa9\x99\x88`\x04\x02\ +Q\x0bx\x19\x9a\xa3\x09\x99\xa6i\x9a|P\x91r\xe8\ +\x06\x8a\xa0\x08\xac\xc9\x9a\xae\xf9\x9anI\x10f\xe0\x98\ +\xb7I\x9a\xb9Y\x9a|\xd0\x9c\xcd9\x99\x92\xe8\x05\xbf\ +9\x9d\xc0\x19\x9c\xad9\x9c\x99\x89\x08 7\x10\x1e \ +\x9a\xc9\xb9\x9c\xcc\xe9\x9c\xcd\xffI\x03\xe40`\x92x\ +\x09\xd4\x99\x9e\xd6y\x9d\xc3Ih\x03\x81\x0d\xb7\x09\x9e\ +\xe1)\x9e4@\x9e\xe4@\x0e\x1e\x00p\x92\x08\x0a\x08\ +\x90\x9e\xfe\xb9\x9e\xec\x19\x98\xc9@\x10\xbc\x80\x9b\xf2)\ +\x9e\xe3i\x9f\xf7\xe9\x01\x0cjOr\x08\x03\x08\x10\xa1\ +\xfd\xe9\x9f\xea\x09\xa0\x81i\x104p\xa0\x08\xca\x07\x0a\ +\xba\xa0\x0c\xca\xa0\xc3\x15\x88\xee \xa1$J\xa1\x15\x1a\ +\x9c\x12`\x10\xd4\xa0\x9b\x1b\xca\xa1\x1d\xfa\xa1\x0c\x1a\x00\ +2\x1a\x00qH\x81b@\xa28:\xa1&J\x9d\xab\ +Y\x04\x06\xf1\x0a-\xea\xa2\xf79\xa40\xea\x013*\ +\xa3o@\x90%\xd8\x06D\xd0\xa49Z\xa2;:\x9d\ +\xbed\x10\x1e@\x9f\x1d\x8a\x9fEz\xa4\x01\xf0\x06\x5c\ +\xfa\x06\xe5H\x81,\xd0\xa4bJ\x04O*\xa1Q\xda\ +\x06\x0c\xe1\xa2WZ\xa4Fz\xa4]\xca\xa5\x09@\x0d\ +\xd4V\x82+0\xa6cZ\xa6\x11j\xa2I\x80\x10\xbc\ +\xb0\xa6Y\xaa\xa5o\x9a\xa4\x090\xa8MP\x82\xca\xc0\ +\x01\x1c`\xa7w\x8a\xa7:\xff\xfa\x9b\x0a\xf1\x06D\xfa\ +\xa7n\xfa\xa6<0\xa8qJ\x0d\xd4\x00\x9d\xc2\xf7\x04\ +\x1c\x90\x06\x88\x9a\xa8\x8a\xea\xa4\x8c\xfa\x9b\x08\x97\x10\xb6\ +\xc0\xa6m:\xa9]Z\xa9\x96\x8a\xa9\x98\x8a\x0b\xfa)\ +|\x1a\x90\x06\xb4\xfa\xa9\xa1*\xa6\x8c\x8a\x00\xb2\x99\x10\ +\xbe\x10\x000\xaa\xa5[J\xa9\x96z\xa9\x98\xea\x08\xb2\ + \x0b\x0ezy\x99\x80\x0c\xc8@\xab\xb5\x8a\xa8\xb7*\ +\xaa9\x0a\x0d_z\x10\xb8\x10\xa3\x80*\xac\xad\xea\xaa\ +\xd4p\xac\xb2\xd0\x0b\xb8P\x8d\x97\x97\x0c\xcc\xca\xac\xce\ +\xfa\xac\xa0z\xab9\xfaJ\x0b\xf1\x05\xc0\x1a\xa8\x82\xba\ +\xad\x98\xea\xad\xe0\x8a\x0b\xf6Z\x8c,W\x06\xe5Z\xae\ +\xe7j\xab\xd1J\xa6\x11\x8a\x08'\xd1\x0b3\x0a\xaf\xac\ +:\xa8\xdc\xda\xad\xc7Z\xaf\xf6j\x0b\xcd0\xa7,\xe7\ +\x01\xa3\xc0\x08\xfb\xca\xaf\xfd\x0a\xad\xff\x8a\x00\xd1p\x12\ +\xeej\xb0\xc3\x9a\xb0\xf4\xca\xb0\xd2`\x0b\x0e\xdb\x09\xb3\ +@t\x13\xa0\x00\x8c@\xb1\x15\xdb\xac\x17\x8b\xb1\xa1\xaa\ +\x087(\x88\xda*\xaf\xf3\xff\xba\xb0\xf6\xda\xb0$\xdb\ +\x0c\xb9\xe0\x0a\xafp\xb2\x01W\x05\x0a0\xb4+\xcb\xb2\ +\x15{\xae\x9e\xea\xafv\xba\xb1(\xf1\x05\x5cz\xb0\x08\ +\xcb\xad\xde\xfa\xad9\x8b\x0b$\xeb\xb0=\xeb\x0a\xae\xc0\ +\x0b@\xbbj\xb8\xb0\x05X\x80\x05CK\xb4F\xbb\xaf\ +H\x9b\xb4\xe9\xda\xa4\x1d\xb0\x12M0\xac\xc4\xea\xaa\xf4\ +Z\xb5#\xeb\xb0<\xab\xb5>\xfb\x0a\x5c\x0bl\x12\x10\ +\xb6a;\xb6*[\xb6f\xfb\xb2\xe9\xfa`*\xe1\x0b\ +\xd4\x10\xb5R\x1b\xb79;\xb7\xcdP\xb7Z\xfb\x0a\xaf\ +P\x0b\xbc\x90\xb7{\xd6\x00|\xcb\xb7~\xbb\xb2-k\ +\xaeH\xfb\xa9\x1c \x97,\xf1\x0ao{\xb3\xdf\xca\xb0\ +V\xbb\xb3\x8e{\xb7\x92;\xb9\x94kc\x88 \x00\x96\ +p\xb9};\xb6E\xbb\xb9.\xeb\xac\x9f\xba\xab,\x81\ +\x0b\x89\x8b\xb3U{\xb5<\x9b\xb5\x81\x00\xb9\xab;\xb9\ +_\xf0\x05]\x1b]j\x80\x0c\x02\x00\xbb\xb1+\xbb\x99\ +\xab\xb9\x9b{\xb6%\xb0\x14_P\xac!+\xb7\xc0\x9b\ +\x0bY\x0b\xb9\x91\xcb\xba\xbc\xffp\xbc_\x00\x0b\xb1\xfa\ +W\xb8\xc0\x05\xdcP\x0c\xcd\xeb\xbc\xb2+\xb6\xd1k\xbb\ +\xb7\xab\x08\xea\xa6\x14\xae0\xb5\xa6{\xba;\x9b\xb5w\ +\x1b\xb9\xc5\x1b\x03\xc7K\xbe\xb30\x0boUV\x9e\xb0\ +\x02\xdcp\xc0\xea\xdb\xbc\x96\xf0\xbc\x97\xeb\xb7\x7f\x0b\xbf\ +\xb4:kL\xd1\x04\xbe\x9b\xb3\xc0\x9b\xba\xde[\x0b\xfd\ +\xfb\xbf\xb0\x10\xc07p\x03\x06\xb0\x96\x08\x93\x09\x11\x80\ +\x0a\xa8p\xc0\xdc\xb0\xbe\xec\x0b\xbd\xd1\x0b\xb8\xe5\xea\x06\ +i\x01\x0b\xbdp\xbf\x17\xac\xbf\x19\xbc\xc1\xe3\x0b\xc0\x1f\ +\xfc\xc1u`\x01\xe2\xca*S@\x04\x11P\xc2&\x8c\ +\xc2*\xbc\xc0\xed\xeb\xc0\xb5[\xb1k\xab\x16\xbc\xa0\xbd\ +\xa8k\xc3\xc4[\xbc\xe1\x9b\xc3\xbe0\x0b;\xfc\xc1\xa9\ +\x90\x0ai\xc0\x02\xf8\xda\x1d\x14\xb0\x02=0\xc4C\x5c\ +\xc4\x08|\xc4\x0c\x8c\xb9-\x5c\xb1\xba\x9b\x16\xce\xa0\xb3\ +Ql\xb77\x0c\xbe\xe2\x0b\xc0X\xbc\xc3[\xbc\xc5\xa6\ +@\x04S\x90\xac\xc1\x91\x0bj\xd0\x02\xac0\xc8d\x5c\ +\xc6'|\xc6\xeb\x9b\xc6j\xffL\xbb\xd2\x8b\x0cLw\ +\x18\xcdp\xb5X+\xc5\xfcK\xc7\x1c\xec\xc1Y\x9c\xc7\ +\xa6\xb0\xc9\xa6\xf0\x0d\x0c\x10|\xc1\xb1\x09i\xf0\x0d\xa4\ +<\xc8cL\xc6&|\xc8)|\xc4\xed\xeb\xbe-l\ +e\x89\x01\x0b\x91\xdc\xb8\xdc+\xc7Sl\xc9V|\xc7\ +x\xac\xc9\x9c\xfc\x0b\xa4@\x0a+\xb0\xa7k\xa12\x7f\ +\xa0\x0a\xc6\x0c\x0c\xa5L\xc8\x85\x9c\xcaF\x9c\xc8\x8a<\ +\xbb\x99;\x0a\xc1\xf1\x05\xb4L\xc9\x1a\x0c\xbe\xfe\x9b\xcb\ +\xba|\x03y\x9c\x0a\x9cl\x0a\xbe\xfc\xcb\xa4@\x08\x84\ +\xa0\x00\x132\xbf+\x91\x0cs\x80\x00\xf5P\x0fu`\ +\xcc\xaa\x80\xcc\xc9|\xca\xa8\xac\xca\xab\xac\xc0\xcf\xec\xca\ +C+\x09SJ\x1a1\xa0\xbf\xfb{\xcd\xac\x9b\xcd\xb0\ +`\xc7Y\xcc\xcd\xbc\xbc\xc9\xe1\xfc\xcb\xe4\x5c\x01\x0e]\ +\x01\x02\xf0\x0f\x0c\xe0\x07\x8ag\x10\x1b\x04\x04S0\x0d\ +\x10\x90\x06\x18\x80\x01\xed\xfc\xd1\xf0\x1c\xcf\xc9\xcc\x0a\xf4\ +L\xc4\xaa\x9c\xc0\xf8\xdc\xca\xb4\xebf\xdc\xc1\x0b\xb6\x5c\ +\xc9\x03]\xc7:\x9c\xc9\x09\xff\x0d\xce\xe2\xcc\xd0\x0f\xfd\ +\xd0\x22\xb0\xd3\x22\xf0\x0e\xef\x10\x0b\xb1p\x0aB\xbd\x0b\ +\xab\xb0\x0ah\x80\x06*\xd0\xd1\x1d\xfd\xd1\xed\xfc\xce\xc7\ +<\xd2%m\xd2(\x8c\xd2+\xcc\xc2/\x90\x1f.=\ +\xc7\xb8\x5c\xd0W|\xd0\xdd\xec\xcd\xbd|\xd3\x0d\x9d\xd3\ +\x15\xc0\xd3=\xfd\xd3A=\xd4E}\xd4*\x90\xd4K\ +\xcd\xd4Nm\xcc\xa4\xfc\x0d\x83L\xd2\x85L\xc4(|\ +\xcf)\xdd\xbe\x84\x8b\xd5\xb7\xbc\xd5\x06M\xd3z\xfc\xcd\ +7=\xce\x84@\xd6e\xcd\xd3>\x0d\xd4B}\x0aD\ +m\xd4H\xed\xd6\x1e\xcd\xd4\xee\x0c\xcf\xf2\x5c\xd7Q\xcd\ +\xcc\xcd\xec\xcc\xb2\xcb\x99R\xc2\x0b\x02\xcd\xba2}\xc5\ +\xdb\x8c\xd05\xbd\xd08\x8d\xd8f\xbd\xd8\x8d\xed\xd8k\ +\x1d\xd9J=\xd9\x1f\x1d\xd7\xf2L\xd7\xa6|\xd7\x9a\x9d\ +\xbe*\x5c\xd5\x89\xc0*_\x00\xbeU\x9c\xc33-\xd8\ +`\x1d\xd6\xe2<\xd6d\xbd\xda?\xdd\xda\x8f\x0d\xd9\x92\ +-\xdbM\x1d\xd2\x97}\xdb\xcbl\xc6\x88\x8c\xcf\xb1\xdb\ +\xd7\x8c\xf2\xdb\x93\x9b\xcd\xda\xff\xec\xd5\xdd\xfc\xcd\xa8m\ +\xd8\xaa\xbd\xda\x8c\xdd\xd8\xcd\xcd\xd6\xb1M\xd9u@\xdb\ +s\x8d\xd9\xb8m\xdd\xba\x9d\xc8cp\x1f\x08\x03\x0b\xbc\ +\xe0\xdd\x5c\x8d\xc9\xbb\x5c\xd36-\xd6\x88\x9d\xd8\x8a}\ +\xdej\xfd\xda\xcfM\xd9\x95m\xd9#\xcd\x0aw-\xd5\ +\x9b-\x00\xc8P\xd1\x083\x0b\xa3\xcd\xdf\xfd]\xdc\x0a\ +]\xd8\xc8\x9d\xd3\xcaM\xe0\xaem\xe0\xb1\x0d\xdd\x09\xfe\ +\xd4P\x1d\xdf\xf2\xdd\xbc\x88\xa0TKE\xe1\x05\x1d\xd8\ +\x17\x8e\xe1\xff}\xdc\x87]\xde;\xbd\xd8i]\xe0\xce\ +}\xe0p\xed\xde\x0b\x9e\xd9\xf2]\x0c)\x8a[\xfb]\ +\xda\xa6\x0d\xe3\xa6P\xd8\xe4M\xe3g\xed\xe1\xe9\x0d\xdb\ +J\x8d\xe0q-\xd2%n\xe2(\xcc\x00\xd0\xb5Y\x01\ +L\xe4_\xfd\xcd1\xce\xd03\xae\xe46\xce\xdcE\x9d\ +\xe3\xeb\xcd\xde\xd2\xfd\xde\xf0]\xdd&L\x04N6\x0b\ +\xb7\x00\xde\xfe\xdd\xe5I\x9e\xdc\x1d~\xe3\x1fN\xe6O\ +\xce\xdeQ^\xdbi^\xdd\x10\xb0g\xbcp\x09\xef\xf0\ +\xe2\x5c>\xdes\xce\xe1u\xff.\xe6\xaf\x8d\xd4!\x0e\ +\xe5g\xde\xe3w\xcd\x08\xf36i\x82\xd0\x00En\xe4\ +\xe3\xbd\xe1\x88\xae\xd8h\xcd\xdc\x8f}\xd4\x8c^\xe6p\ +\x1d\xd2Rn\xdbvM\xc6[`\x07\x01\xc7\x02\xc5\x10\ +\xde\xe2\x8d\xe4\x9a\xae\xd3\x89\x8e\xde\x9f\xce\xd6:\xbe\xe3\ +\x8fn\xeav\x8d\x08\xe8sq\xb8@\x00\xa7\x80\xe9\xb0\ +\xfe\xe5t\xce\xe9L\xde\xe4m-\xea\xa3\xae\xe0h\xce\ +\x0a\x0ap\x09\x97G\x03\x5c \x02\xaf\xae\xe1\xc4\xbe\xe9\ +5\x1e\xe6\xb4>\xe6\xb6\xde\xe8f\x9e\xeb\xac \x00\xca\ +\xa0g\xc2\xb7\x00\x03\xf0\x0e\x19n\xed\x01.\xe0\xd9\xde\ +\xe9\x8d\xcd\x0c\xc8\xfe\xdc\x22\xee\xce{N\xca\x02 P\ +%\x18\x00\x9b\xf0\x0d\x86\x1e\xeb\x0em\xd6g\xed\xeeB\ +\x0d\xef\xdc\xee\xe4y\xfe\xed\xf0\xcc\x01\xbd-\x87\xb6\xc0\ +\x02\x1a \xd6\xfe\xce\xeeK\xee\xe1\x04o\xe0\xf2\x8e\xe0\ +#\xee\x0e0`\x8d\xca\x80\x0c\x87^\xec\xd9\x0e\xd4v\ +^\xf1\x90m\xf0o\x0d\xd7\x88\x10\x0d\xe8`\x93\x02\xc1\ +\x00\x08\xb0\xee\x12o\xe3v[~\xe7\xa0\x9e\xec\xca>\ +\x0aG\xe0\x89,_\x10:0\x05\x00\xc0\x0d\xd8\x1e\xf2\ +\x1eN\xf3\xdd\x1e\xdbiP\xaa;o\x12j\x90\x09\x0d\ +\xd0\x03\x00/\xf3\xadM\xf4\x91]\x09\xee\x00\x06\xc9p\ +2I\xcf\x12u\x97\x0cd\x10\x0a\x00\x80\x93XP\x0c\ +\xac \xd4\xe1\xae\x00\x07\xd0\x06\xb40\x002\x90\x0c\xac\ +\xe7a\x01\x01\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\ +\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\ +\xc1\x83\x08\x13*Lh\xc6\x0a\x09\x0ajR$\x19F\ +\xe0\x08\x030\x0f6mJ\xf4\xe3\x05\x0c\x1f\x9a\x16\x8a\ +\x1cI\xb2\xa4\xc9\x93(\x11\x86\x08\xf6\xc2\xc9\x83\x97\x0f\ +\x94\xc9T\xc6\xa0\xe6E08\x0b\xe8,\xd0'\x93O\ +ez(\x80\x08\x90\xb2\xa8\xd1\xa3H\x0f&\x00\x91\xec\ +\xdc\x91\xa7\x9c8\xc1\x8c9\xd3\xe6\xcd\x9c;{\xfa\xcc\ +t\xa1\xeb\x05eS<\xbdIJ\xb6\xac\xd9\x81||\ +,!@@\xe3\xa6\xa7G\xa4\xc2\x9cI\xd3&N\xac\ +:\xb5\xfa\xf4\xba\x83\x8b_.\xc3(\x989K\xb8\xb0\ +\xc87\xc4\xf4\x0c[\xcc\xd6-\x5c\xb9/\xe9Z\xbd\x0b\ +fg\x81\xad{\xbb\xf6\xfd;\xa0\xf3\x11-\x1e\x0c\x8b\ +6\xbca\x84\x13'\x8bS7~\x0bu\xaad\xbbw\ +-c\xf6za\xb3\xdf\xce\x03\xe6\x84\x0au\xe9\xc9\xe8\ +\xdfG\xa5\xb9H\x02%\xcbi\xd4\xaa\xdb\xb2\x8e\xeb\xba\ +*l\xbc\x97\xb7\xd2\xfe{\xbb\xb3\xee\xdd\xa1\x0a0\x01\ +\xce\x9d\xa4,\x1f\x97d\xc8\xff\x80R\xfctj\x8a\xca\ +\x1f7\x9799\xf6\xce\xd9^\xa9\xe3\xce\x8d=\x94\x09\ +\x13\x03X$\xe8\xce\xbf \xae~I$\x92\x88x\xf3\ +\x94\x87\x9cj\x8e\xb56\x17{\xcfU\xf6\x9et\x9a\xc9\ +g]}\xf6\xdd7\xc3\x1c,P\xd3_w\xb5|\xa0\ +G\x11E\x5c\x22\xa0x\xe4\x19w z\x1a\xa9\xb7`\ +]5Q&\x1b\x84\xb5IH\x1fv\xf7Y\xb8\xc6\x1a\ +sl\xb7\xe1h\xe8LaA\x12I\x848\xa2\x0c\x05\ +\x9ax\xdej*F\xe6\xdcU\x0e\xf2\x04_\x8c\xd5M\ +H\xa3\x853\xdcxc\x01\xbe\xedx\x96#Z\xe8a\ +\xc1\x8fA\x0a9`\x91\xc7\x1d\x99\xa2\x82J2\xc8d\ +V0^ \xe3uS\x9aP\xa5\x95k\x18`\xc0%\ +Di\x99T\x08)\xe8\xe1\xe7\x97@\x8aI\xa2\x81f\ +\x9e\x09\x19Uj\xba\x98\x17\x8c\xb6q\x81\x1b\x9c\x15\xca\ +9\xe7\x8dv\xdai\x820z\x1a%\x8b\x16\xf1\xfc\xf0\ +\xc3\x9f\x80\x06)\x22\x81\x84&w&si\xb2\xa8h\ +t\x99A\x19%\xa45N\xffJi\xa5\x06\xd4\x00\xc5\ +X\x99\x9a$\xc8\x0b\xf1\xf4\xfa\xc3\x12\xa0\x06*\xe2\x80\ +\xe3AQ&c\xe9\xa1\xf9\xda\x9a:=i\xdb\xa3\xf5\ +\xc5*+\xad\xb5\xd6PC(Y\xe6\xba\xd0\x17\x9eL\ +\x91B\x0a\xbe~\x1a\xac\xa8\xc4\x92yb\xb2\xa8\x22\xaa\ +\xaa{\xacr\xd5\xd5\x9b\xd1\xdaH'\xad\xd6\xd6[\xc3\ +\x08\xda*$\x8d\x11Sx\x9b\x82\x1f\xe1\x8e+\xe8x\ +F\x9a\xca\xda\xa1K\xae\xfa$\xbc\xbbI;/\xbd\xf6\ +\x96P\x02\x01\xfb\xe5[P\x00,\xbc\xd0\xaf\xbf\xbdv\ +\x0a\xac\x97`\x0aIj\xc1(\x1e\xbc^\x83\x0f\xba\xeb\ +*\xb4q\xcaZg\xa5\xf6\xd6 q\x09\x94p\xe1\x85\ +\xc5\x03\xe1\xa0\xc6\x0b,\x91D'{\xb6\ +\xe1M\xc2\x87z\xdb-\xaf\xfex\xeb\xaf\xc3\xee@\xec\ +;\x1a\x93L\xed\xb6c\xde7\xd7\xde\x02\xdc\xa9\xc0\xa0\ +\x07?z\x9a\xa57\xdb*\xeap\xaan%\xc4\xcbO\ +\xed\xba\xe4\xcf;@\x0b-\x94\xf3\x87N2\xf4S\x7f\ +{\xe6~s\xee\xa9\xef#\x16H6\x8ap!\x1d\xd2\ +\x8a\xd7*\xb6\x95\x8fq/s\x9c\xcc\x98\xf7\xba\xf6\xbd\ +\x8f\x16n8Aw\xc8\x11\x05\x18\xc0\xa0~\xb5\xbb\xdf\ +\xf5\xba\xc6\xbb_\xfdIh$\x22Yz\x061\x82\x13\ +\ +7\xf80\x04\xc0I\x80\x16\xff\x1aa\xc1\x0bN/\x83\ +\xd6\xcb]\xfe\xb4\xe7\xb9\x1f\x09\x8a<\xff+\x02\x05\xac\ +`\x14\x1er\x89\x9d\xfb\xe0\x0bP\ +\x00\x0b==A\x19]\x94\x1b\xdd|IHR\x0as\ +\x0b\xe0\xf4\x84Ylq\x02& 3\x99\xadd\xa4\x11\ +\xedg\xbd8v\x10X\xf1\x00b\xbe\xfa\xb1\x83\x1bZ\ ++\x90\xce\xeb&\x19\x859\xffLpB\x82\x12e\xf1\ +\x85'\x8c`\x04&\x98\x13\x9d\xcbd\xa4#\xdb\xb9\xb9\ +\x0e\xf6c\x858\xfb\xc7\x0b<\x89\xcf0\xf2p\x94\xfb\ +4%8\xfd\x09\x09H<\x80,\xe2\x10\x83H\x09z\ +\xd0U\xa6S\xa1\xcedh\xd7\xfc\xa0\x86\x05D\x94 \ +((\xc0=\xe7\x16\xca\x8bzS\xa3\x1b\xed\xa8N\xe3\ +g\x14[\x08#\x18\x22\x15\x03I\xcf\xa9LW\xae\x13\ +\x89\xf8\xebW?^\xf1R\x83\xc4c\x81`\xfc%F\ +}\xf8M\x8e\xea\xb4\xa3\xb4\x08\x8dQ\x9ep\x82\x13\x00\ +5\xa8CE\xa7Q1\xf8\xcci6\x15!$0\xc0\ +6\xf3\x09L\xaa\xe2t\x0bW\xd5)\x04 p\x04\xa3\ +\xd0@\x18\xc2\xe8j0\xbe*\xd4\x82\x125\x9d\xcd\x9c\ +\x9e\x06\x93\x91\xa7\xb3\x1eD\x10\x5c\xe0\xe6T\xdd\xbaQ\ +\xb8\xc6\x15\x12s\x9d+ \x8a\xa2\x04\xbc\xe2U\xafA\ +\x15\xaaA\x11\xcaL\xfa\x09voZ\xe8\x85a\x17\x02\ +\x06\xb6\xde\xb4\x9f\x8e\x8dkd#{H\x94\x08\xc2\x07\ +@\x00\x82e\xf5\xca\xd7\xb0\xff\x9a\x94\x99\xebT\xc3\x09\ +\x5c1\xda\x85\xe0\x82\x13\xbf\x07z\x13\xb0\x8e\x92\x058\x9b\xeb \xff\xba\xdc\xdb\ +\x00\x80\x81\xb8\x22\x04x\xcf\xbb\xd9u.\xf5\x88O\xfc\ +\x03Td;Jv\x90t\xb8\xe3{\xee\x88o\xc3@\ +x`\x85\xbc;\x1e\xef{?\xbb\xc9%\xfe\x04\x1a\x08\ +\x1e%\x8d\x80{\xe27\xdf\x06\x1f\x08\x84\x0fV\x08}\ +\xe8\x1f\xef\xf8\xbdK\x1d\xa2\x977I\xd79\x9f\xf8\x06\ +4\xe0\x07\x02\x11\x84\xe8g/z\xd2C\xde\xec\xaeN\ +\xfdI\x0c0\x01\xd6#\xde\xf5\xc0w}&\x04b\x8c\ +\x0d\x18\x7f\x03\xb4\xa7\xbd\xed\xc9\xae\x09]\xeb\xbe$?\ +\xf0}\x1b\x82O}\xe0W\xe1\x1f\xb58\xbe\xf6\x8f\x9f\ +\xfc\xd9?\x9e\xbc\xcf\x1f\x89\xff\x126_\xfd\xf2\x07\xff\ +\x1f\xb80\x86\xfa\x8b\xbf\xfd\xf6w\xbf\xf1L\x0d\x7fI\ +\xben\xfe\xfaS\x7f\x03\xd4X\xbf\xfe\xd7\xdf\xfe\xed\x8b\ +\xde\x18\xf2g\x12\x00`\x7f\x04\x08|>\x10\x00(\x80\ +\x02\xfb\xb7\x80\xfa\xd7\x7fS\x16\x80#A\x05\x05X\x80\ +#@\x03\x09x\x81\x18\xa8\x80\x0c\xb8\x7f\x1b\xe0r\x10\ +8\x12\xf10\x81\xd4\xf7\x07$X\x82\x97\xd0B\x19\x98\ +\x82)\xb8\x80\x97\xf6\x81\x08\xa1\x05\xf6W\x8228\x83\ +$\xf8\x00f0\x048\x98\x838\xa8\x82<\x88\x02\xa2\ +\xe5\x82\x0b\xf1\x04\x0d@\x83DH\x84\x1ap\x84\x03\xa0\ +\x03:\xb8\x84L\xa8\x83\x19\x88z@\x88\x10\xe8P\x84\ +\x7fp\x84Vx\x85X\xa8\x01\x8f\xe0\x05\xe8\xd0\x85^\ +\xe8\x85M\x18\x86\x81\x16\x85\x08\x91\x85fx\x86V\x08\ +\x01\x82\x90\x01l\xd8\x86m\xf8\x85p\x18\x87_@\x86\ +\x0a\x81\x86v\x88\x85\xee\x90\x0e\x82\xb0\x87k\xe8\x86~\ +\xf8\x87nXMtx\x10\xb9\x80\x869p\x88\x88\x98\ +\x88\x8a8\x01|\xd8\x88\x8e\xff\xf8\x88\x908\x88\x09\xa1\ +\x0b\x94X\x89\x96x\x89\x98h\x89\x90\xb8\x89\x9cxF\ +\x92x\x10\x99\x18\x8a\xa2\xa8\x0bf\xe0\x05\xa6x\x8a\xa8\ +\x98\x8a\xaa\xa8\x03\xac(\x88\x9f8\x10\xb9p\x0b\xb28\ +\x8b\xb4X\x8b\xb68\x8bm`\x06\xac\xb8\x8b\xbc\xd8\x8b\ +\xbe\xc8\x8b\xafh\x10\xb78\x8c\xc4\xe8\x0e\x0b\x80\x03\xc8\ +\x98\x8c\xca\xb8\x8c\xcc\x98\x8c\xb7\x14\x8c\x03\xd1\x0a\xd28\ +\x8d\xd48\x8d\xc7p\x8d\xd8X\x8bU\xc0\x07\xcd\xd8\x8d\ +\xcb\xb8\x00\xe0\xb8\x00\xf1\x07\x8d\xe8P\x8d\xe6x\x8e\xe6\ +\x98U\xcc\x18\x8e\xec\xd8\x8e\xee\xd8\x0c\xd0(\x10\x1f \ +\x07\xf4X\x8f\xe8x\x8f\xad\x10\x0a\x01\xe0\x8e\xfc\xd8\x8e\ +|\xf0\x8f\x00)\x0d\xf1\xf8\x0f\x8d\x00\x0a\x06i\x90\xf5\ +\x98\x90\x0ay\x8e\x0c\x90\x00\xfd\xb8\x00\x00\x19\x91\x12\x09\ +\x90\x1a\x12\x8f\x16\xd0\x02-p\x90\x1a\xb9\x91\x0a\xa9\x90\ +\x83 \x0b\x13\x19\x92\x13I\x03$I\x0e\xe4\xd0\x82\x92\ +x\x01\x18\xb9\x92,\xb9\x91.y\x90r\xf0\x02\xb6 \ +\x92\x11I\x92%i\x928\xffi\x92\x85\x15\x8c\x13\xb0\ +\x02,\xf9\x93@\x99\x91.y\x02\x81 \x916I\x03\ +9\x99\x94\xe4\xe0\x01L\xd9\x94s\x18\x8c\x01\xb0\x02R\ +9\x95R\x19\x94V\x89\x91V\x10\x036\xa9\x94I\xd9\ +\x94^\xd9\x94\x01\xc0[\xc1\xd8\x0fTY\x96ey\x95\ +\x18I\x14\x1e\xc0\x95_\xd9\x96\x1e\x10\x00p\x09\x97?\ +\xf8\x8a\x89`\x96vi\x96?\xa9x\xff\xf0\x06&\xe9\ +\x96_\x19\x97\x80\x19\x97\xe0'\x89\x100\x0a\x869\x0a\ +w\x99\x98S\x19\x0a\x02!\x0b~\xc9\x94\x81\x19\x98o\ +0\x99\x93\x19\x03\xc1x\x98\x98i\x98\x8ai\x96E \ +\x10\xcd\xf0\x97\x91\x09\x98\x949\x9ao\xc0\x03PH\x87\ +j\x90\x99\xaa\xa9\x99\x9b)\x06\x02\xc1\x0bo\x19\x9aq\ +I\x9a\x94\xc9\x03\x09p\x9b\x09 \x0b\xaf\xf8\x08\x07\xd0\ +\x9b\xab\xb9\x9aw\xe9|o\x10\x9a\xb4Y\x9b\xb8\x89\x9b\ +\xd4@\x0dOI\x87:\xd0\x9b\xce\xe9\x9b\xbf\xa9\x9aS\ +\xa9\x97\x02A\x0d\xb3Y\x9c\x93i\x9b\xc7\x99\x00\xc9\xd9\ +\x9d\xcf \x89I\xf0\x9c\xe2\xffy\x00\xd1\xa9\x9a\xa26\ +\x10\xcd\x80\x9d\xd9\xb9\x9d\xdc\xd9\x9d\xdd)\x0b\xb80\x0b\ +t\x18\x08\x1a\x80\x08\xe39\x9e\xe5i\x98\x8d@\x10_\ +@\x9b\xda\xb9\x9d\xee\xd9\x9d\x8e \x0b\x04*\x0bc\xe8\ +\x82\x8d\x80\x08\x0a\xaa\xa0\xf7)\x9e\xd1iy\x04\x91\x00\ +\xeb\xc9\x9e\xed\x19\xa0\x05J\xa0\xbd\x80\x0bkG\x86U\ +\xb0\xa0\x1e\xda\xa0\x0e\x8a\x99\x10`\x10M@\xa1\x15\xea\ +\x9e\x03Z\xa0\xbd\x90\xa1\xb8\xd0\xa2\xcf\xe8\x82\xc1\xd0\x01\ +\x1e:\xa3\xf6\x09\xa2\xcei\x98\x16`\x10\xbc\x00\xa0\x01\ +\x9a\x9c\x17*\x0b+\xda\xa2Bj\x0b\xa7\x19\x80\x12\xd0\ +\x01HJ\xa3\x1fj\xa3\xbd\x89\x10\xd4p\xa2(\xfa\xa3\ +,*\xa4\xb8`\x0bVj\x0b/\x1a\x80\xc9P\x0a\xa5\ +\x80\xa4^\xaa\xa4\x0b\x0a\xa2\x12\x80\x10\xcf\xd0\xa3\xd4 \ +\xa5S:\xa4W\xda\x0c\xcd\x90\x0b\xf2\x09\x81\xa0\xc0\xa5\ +\x5c\xea\xa5I\x0a\xa65*\x9ez\x80\x10_\x10\xa5\x17\ +\x1a\xa4TZ\xa5k\xda\xa6\xae\xe0\x0a\x07\xaa{G\xa0\ +\x08\x88*\xa7]J\xa7v\xff\xca\xa0\xce\xf9\x80\x06\x81\ +\x0bg*\xa5\x7f\xda\xa2Wj\x0bl\x9a\x0b\xb90\xa8\ +\xae\xf0\x0a\xae\xf8|\x88\x1a\xaa\x8a\xa0\xa8t*\xa3\x8d\ +z\x00\xad\x85\x10\xb5\xd0\xa7i\xaa\xa6V\x9a\xa9\x9b:\ +\xa8\xaf0\xab\xb5\xf0\xa6\xba\xd7\x00\xa2*\xaa\xa4\xca\xa8\ +v\xea\x9a\x091\x0b\xb8\x00\xa4\xadj\xa9\x81\xaa\xa9\x9c\ +\xda\xa9\xb4Z\x0b\xcbyy`\x80\x00\xce\x9a\xab\x89\xba\ +\xab_J\xa3\x7f \x12\x810\xac\x80\xfa\xaa\x99z\xac\ +\xb3\xfa\x0a\xb5P\x0b\xbc\x10\xae\x9f\x8au0\xe0\xac\xe6\ +\x0a\xad\xd1:\xa7\xa5:\xa3~ \x12\xb0P\xa9\x97\xca\ +\xa6m\x1a\xab\xae\x10\x08\xdd\xfa\xad\xe1\x1a\xae1`\xab\ +Dg\x05\x8a`\xae\x00\x8b\xae\xa3*\xa7\xa5j\xaa+\ +@\x12\x81\xe0\xaa\xdaj\xac\x9cz\xaf\xe0\x9a\xaf\xbc\xf0\ +\x05\x12\xcb\xaf\x1b'\x07Dp\xb1\x00\xfb\xac\x02+\xad\ +^\x0a\x05$\xf1\xae\x97\x8a\xa9\xf3\xca\xad\x0e\x0b\xb1\x11\ ++\xb1\xb00\xae\xf0&\x01\x17\xdb\xb2\x19\xab\xb1\xd0\xaa\ +\xa8\x8b\xda\x01\x07`\x12\xaf\xffP\xac\xf4Z\xaf\x0e\xfb\ +\xb0\xfa\x8a\xb2)\xeb\x0b\xb3\xa0\x9b\x05\x07\x09\x1c\xd0\xb2\ +.\xfb\xb2\x02;\xb0\x04;\x0f&\x01\x0b\x22;\xb2\x0d\ +[\xb2\x10\x1b\x03>\x0b\x0b\xb30\x0b7p\x0bB{\ +l\xb4\x90\x06\x1cP\xb4FK\x04/\x0b\xb31\xcb\xa5\ +\xa3\x80\x12\xb5\x00\xb5\xb2\xba\xb3&+\xb1_\xf0\xb3W\ +{\x03r;\x0a(Ib\x10\x90\x06x\xfb\xb5a\x8b\ +\xb1H\x9b\xb4\xa5\xd0b'1\x0b\xc7\xba\xb6\xc9j\xb2\ +T\xeb\xb3@\x8b\xb5r+\xb7\x8a\xb0mk\xc6\x07\x13\ +\x80\x0c\xc8\x80\xb7^\x0b\xb6a;\xb6\x08 \xb0\x0d\x00\ +\x8f(\xf1\x05Q\x9b\xac<\xdb\xb3\x88\x1b\xb7\x8b{\x03\ +\xa9\x90\x0a\x11\x90-\x0bf\x05+ \xb9\x92K\xb9_\ +k\xb9G\xdb\xb7\xb9\xea\xab)Q\x0b\xf6*\xb5\x10\xeb\ +\xb6)\x0b\x0b\x89[\xba\xa6{\xba\xa9 \x02\xfc5_\ +\xc9P\x06\x8c\xe0\xba\xaf\x9b\xb7z\xbb\xb7\x98+\xaa\xa9\ +\x9a\x12\xbe\xc0\xb6S\xcb\xbbp\xab\xb8\x8b+\xbc\xa9`\ +\x0a\xdc[\x02[kX\x99\xff\xa0\x00\x0a\x90\xbc\xca;\ +\xb9\xcc+\xbb\xb3\x9b\xb1\x88Z\xb3H\xf1\x05\xde\x1a\xba\ +\xa2\xfb\xb6\xd7\x0b\xbc\xda\xbb\xbd\xdck\x0a\xdd0Yg\ +\xf5\x01\xad \xbe\xe3K\xbe\xca\x0b\xbb\xcd{\xb9\x98\x0b\ +mI\xc1\x0b\xf0\xcb\x0b\x87+\xbf\xbeK\xba\xd9\xab\xbd\ +\xf7k\x0a\xbf@\x0a\xa40\x03:\x863\xd4\x00\x06X\ +\xb0\xc1\xfe\xcb\x08\x00\xec\xba\x02\x8c\xbe|\x9b\xb1sF\ +\x16\xbe`\xb2';\xba\xd8\xfb\xc0\xc2\x1b\xc1\x12L\xc1\ +\xa4\xf0\x0dy\x9a//\xa0\x08\x1b|\xc3\x1d\xfc\xc1\xcb\ +[\xb9\x22<\xc2\x08p\xb6f\x01\x0b\xf9\xba\xc0\xbd\xfb\ +\xbb\xf4\x0b\xc1\x11<\xc10L\x0a\x84 \x09\xc7\xa5%\ +Zp\x0b\x02`\x097\xcc\xc19\x5c\xbe\xe6\xcb\xc3{\ +;\xc2\xb6[\x16_\xa0\xc0\xd6\xdb\xc0+,\xb7\xf5\xeb\ +\xc2J\x0c\xc3\x84@\x08\x15P\x01\x8a`\xc0\xfc\xc1\x02\ +\xb7P\x0c\x020\xc7T\x5c\xc5\xfe\xfb\xbfX\x1c\xc2[\ +,\xb6g`\x18n\xcb\xc0F|\xc4-\x9c\xc4K\xcc\ +\xc4k|\xc8\x11\xc0\x1d\x19\xff0\x0c\x8a\xc0\x0d\x8e<\ +\xc7S\x5c\xc78,\xbe\x1e\x8c\xc5Y\x5c\xb9[\x0c\x00\ +\x85J\x16\xb3P\xb5\x81\x5c\xbaeL\xc8K\x9c\xc6\x87\ +|\xc8\x22 \x02-\xf0\x0f\xe8@\x18\xf1\xd0\x06\x11\x10\ +\x01\xa8\x80\x0a\x8e,\xc7t\x5c\xc5Xp\xc7\x95\x9c\xc7\ +z\xdc\xb2rps\x841\x0bE\xec\xc0\xa0\x8c\xc4\xf7\ +{\xc6\x14L\xca\xa5\xbc\xc6\xa7|\xca\xef\x80\x0c3\xe0\ +eE\xc1\x070\xc0\x05\x1d\xc0\x0a\xaf\xfc\xca\xb1\xec\xc8\ +\xdc\x00\xc9\x96 \xc9VL\xc9:|\xc9ZL\x04\x88\ +\x00\x80\xbf\x01\xcc\x9f\xcc\xc2\xa7k\xc6\x85\xcc\xc4j\x9c\ +\xcc\x15\xb0\xcc\x22\xf0\x0e\xb1\x10\x0b\xa7p\x0a\x0aP\x05\ +`\x817\xceG\x10V\xe0y\x9c\xb0\x05\x08\xf0\x0d\x04\ +\xcd\x0a\xac\xd0\x03\xd7\x1c\xcb\xb2\xcc\x0d\xb4<\xc5\xb6|\ +\xcbW\x5c\xbe\x94{\xbeD\xd0\x0f\xddq\xb5cL\xc6\ +\xc4\x5c\xcc\x85\x8c\xcc\xc9,\xcf\xef@\xcf\xf6|\xcf\xa7\ +\xb0\x0a&\x8d\x06h\xa0\x02\x18\xb0\xd2\xf5\xd0\xd2-]\ +\x07\xaa\x10\xd3\xc0P\xd0\x07\xff}\xcd\xb0\xbc\xd0\xdbL\ +\xc7\xde\xfc\xcdx,\xd1\x13\xfd\xb5\xf8\xc2\x1f\x19\x1d\xbc\ +\x83,\xca\xa3\xfc\xce\x1f\xbd\xcc!]\xcf$\xbd\x0b&\ +\xbd\x0a(\xad\xd2,\xed\xd2\xf5\x00\xd32M\xd3\x08\x9d\ +\xd08\xdd\xd0\xddl\xcb\xb8\x1c\xce\xe2\x0c\xb8\xfd\xc1\x00\ +\x82\x5c\xd4\xdck\xcc\xc7\x8c\xd4\xa5,\xcf\xf3,\xd2M\ +\xfd\xd4)-\xd5\x18@\xd5U\x1d\xd3\xaa0\xd3\xdf`\ +\xd0\xd6l\xd3\xd9\xfc\xc8\xdc\xfc\xd0_m\xc9\x94{\x09\ +z\xa2\x0c\xea\xbc\xce\xec|\xd4jm\xcaJ\xed\xd6o\ +\x0d\xd5q\xbd\xd2sM\xd5V}\xd7\x04\x9d\xd75\xad\ +\xd5\xda\xcc\xd5;\x0d\xd1\xe0,\xd8\x9d\x99)Y@\xd4\ +f}\xd6\xed\xec\xd1I\xcd\xcc\x8e}\xcfN\x0d\xd9*\ + \xd7\x93\xfd\xd2\x95}\xd9\x06\x9d\xd5\xd8\xdc\xd79]\ +\xcb^\x1d\xd8\xe5\x0b{\xda\xa2\x07\xa6\xb0\xd1\xa6\xdd\xd1\ +\x8b\xcd\xd8\x8d\xcd\xd4\x8f\x1d\xd5\xb0M\xd7\x95\x8d\xd7z\ +m\xd37\xbd\xd9\xdc\xdc\xd9_\xfd\xc1\x11\xa5\x05\xa7\x80\ +\xd8I\x8c\xd6\xee\x0c\xcf\xca\xff\x0c\xd2\xf5<\xd2\xa7\xc0\ +\x0cp\x1d\xd9\x92\xcd\xdcv\xed\xdc\xb5\xcd\xd7\xb8\x0d\xc9\ +\x0e\x0d\xd89\x9c\xbc\x92\xe0y\x11\x05\x02=\xe0\xc2\xc3\ +}\xd4\xde\x1d\xcf \xbd\xda\xa7\xd0\xda\xae\xbd\xdc\x94\x9d\ +\xde\xb4\x9d\xd9\x9a=\xcb\xd3\x0d\xdf9|\xb0g\xc5\x07\ +-\x90\xd8\xc4\xbd\xdfl\xbd\xd4\xe2\xfd\xdf\xe5\xfd\xda\x92\ +\x1d\xdb/M\xe04\xbd\xd7\x07\xee\xd7:\xad\xe0\xe2;\ +\xa2\xa3\xe5\x0a\xa1P\xcc\xdc\x8d\xdak=\xe1\xfe\x0d\xe0\ +\xca\x9d\xe1\xe8m\xd7\x05n\xe07\xbd\xd5\xee\xdd\xd9\x9e\ +=\x0d\x0b\xc6\x02\xf5\xf0\xc2\xc4]\xdc\xdf}\xdc\xc8\xcd\ +\xda\x17.\xe0.]\xd9\x96\x8d\xd94\x1e\xdd\xda|\xe3\ +8^\x0a:\xb2`8\xa0\x01\xed\xdc\xdd\x12\xde\xdfC\ +N\xe4'\x9d\xd2\x19\xae\xe1u\xcd\xe1\x98m\xdb\xb7m\ +\xe3\x7fm\xcb[\xc0\x07\x82\x96\x04h\xa0\xd8W\x8e\xe5\ +\x15\xce\x0c\xad\x8d\xd2\x5c\x0e\xe3\x94\xdd\xdc3.\xe6L\ +\x0e\xe2\x91|\xc3eP\xbc\x82\xe6\x05m\x80\xc6@\x1e\ +\xe4\xaa\x1d\xde$m\xe1[\xff>\xe7\xe7]\xe7`\xae\ +\xd7x\xae\xd0\xd2\x9d\xe0\xb4\xe0\xb8\xf0\x86\x05i<\xe8\ +l\xdd\xd6\x86\xfe\xd8\x90\xad\xe8S=\xe02\xde\xe1\x8f\ +\x8e\xdb\xb9=\xc5\xa3@\x01X7\x0ch\xb0\xdf\xfc\xed\ +\xe6\x87\x8e\xe8\x01\xde\xe5t\xfd\xe5W\xdd\xe1\xd0\x9d\xe7\ +\x0c=\xc7i\x90\x04\x97G\x0e\x17\xb0\x0d\xde\xcd\xe2\xfe\ +\x0d\xeb/N\xe7\xa0^\xebJ>\xea8\xcd\x0d\xc8\xf0\ +Q\xe1\xc7\x05\xabn\xdcB^\xe1\xc4n\xde\x8b~\xec\ +I\x9e\xec\xd0\x0d\xe9\xdc\xc0\x08\x0c\xe0\x82\xc3\x10\x01\x84\ +^\xe8Y\xbe\x0b.n\xed\x9f~\xe4v\x9d\xed\x8e~\ +\xeb\xb1\xac\x08\x97P\xb7\xf2\xf7\x07\xc2\x9e\xe5\xb0\x1e\xeb\ +\xc6\xae\xee\xeb~\xd9\xdan\xd3q\xd0\x08\x9c;\x88C\ +\xf0\x00\x1c@\xee\xd4\x0e\xe0\xf8~\xedG\x8e\xe4x\xdd\ +\xef\xa3\x90\x05\x03)\x10\x9a\xa0\x0c\x1d \xd2\x07_\xde\ +\xe8\xee\xe5U\xcd\xf03.\x07a\x17\xf1\x08A\x0bX\ +\xf0\xea\xe7\x9e\xf1\xb3^\x07\x1c\xff\x0d\x08p/ ?\ +\x12\x19\xc0\x02\x050\x01\xfc.P\xf2\x18\x9e\xef\xfa.\ +\x0a\xfa\x0c\x03-\x7f\x14C'\x03\x03@\x0bm0\x0a\ +\xe2\xcb\x0d+\xcd\x0f\xa2 \x0a+0\x01\x8fp\x01\x89\ +\x00\x03\xaaKb\x01\x01\x00!\xf9\x04\x05\x03\x00\xff\x00\ +,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1c\ +H\xb0\xa0\xc1\x83\x08\x13*D\xe8\xc8\xd0\x06\x17F`\ +\xbc\xd0sn\x10\x99#G\x9c\x90!ca\x8a\x1a\x0a\ +$B\xe8\xa0\xb6\xb0\xa4\xc9\x93(S\xaa\x5cY0\xc1\ +\x06\x1fj\x8a8q2\xacfM\x02\x046m\xc2x\ +\x84\xd3\x83\x9f\x0f\x94\x09\x15J \x05\x13M,\x93*\ +]\xca\x14!5+Z\x96$\x92!\x03\x0a\x94\x994\ +m\xe2\xd4\xc9\xd3'\xd0\xa1B\x19\x88e\x00f\xd8\x88\ +\x0fM\xd3\xaa]K\xd0\x83\x8b\x11I\x8a\x5cJ4\xb5\ +\xea\xd5\x996\x87m\xdd\x89\xd1\xebO\xb0c\x19P\x01\ +C\x18L\x01\x19F\x16\xb0]\xcc\xb8d\x82\x0f#,\ +XH\x12wn]\xabY\xf0j\xcd\xc9\xb7'\xd0\xa0\ +C\x03\x0f.\x5c\xa0t\x81,b\x1a\xabn\xcck\x88\ +\x96\x1fzbK\x8e[\x84.\xd5yP2g\xbd\xc9\ +\xb9\xebg\xc0c\x0b\x1b6\xdd'\x93q= V+\ +_\xda\x0c\xc4\x88x\xf1~,\x91=\xb9\xb2m\xdc\xba\ +\xf3\xee\xf5\xfd5tp\xd2\xa6\x8d\x8b\xff\xbf\xa0\xecD\ +\xaf\xe5\xe8MJ\xf3\xf4\x22E\x0a\xe8?`\xeb\x99m\ +\xfdr\xf6\xcd\x5c\xfb\xfe\xf6.V\xb8\xe9\x02\xe2\x19w\ +\xc1\x80\x05\xc0\x90\xde\x81\x06\xd9\x02\xd9\x14\x0c\xa6\xe0\x07\ +|\xd3\xcdGY\x11\xb5]v\x97v\xbd\xe9\xd7]X\ +b\x8dF\x18q\x01\x0e8\xe0\x0e\x5cd\xd2\x08\x82\x07\ +\xf2b\x85\x1a/\xb4\xd8\xe0{\xd1\xc9G_\x85TY\ +\x85\x15~\x9d\xf9\x05\x9a2\x81\xf9\x17^\x88\x22r!\ +$\x17}\x88\xf1\x0a\x8a\xab\xe1\xd0\xc8\x08#\xb4\xf8\xc2\ +\x8b\x0fFG\xdd\x84s\xdd\x96\x9bfze\xe8\xd9\x86\ +=\x82W\x1a\x90#\x0e)\xe4\x00\xca \x85$[\xb8\ +\xf4\xa3\x06\x93L:\xf9\x22\x84\xb2Qy\xdd\x95\xbb\xe9\ +\x95\xdf\x96;\xf2\xf8\xdd\x87\xa5\x157^\x90b\x0e \ +\xe8\x00z\x9c\xa9\x16\x0a\xd6\xb0\xa0\xc6\x9am\xba8\x85\ +{\xf0\xc98\x19\x85\xb6Uu\xdfMw\xfa\x05\x5c\x7f\ +^\x06\x98\x89\x88$\x06*\xe8\x1c\xa1\x5c\xe0\x83\xa1J\ +\xa5\x99\x0c\x0b\x8a.\xca\xa6\x9b\x8fF\xff)\xe9\x84\x95\ +\xdaX\xa7\x96\x9a\xf2\xe7\xe1\x7f`^\x10\xea\x98\xa3\x92\ +\x1aJ(\x97\xa0\xba\x12\x0e\x14$\xa3,\xab\xae\xbe\xfa\ +\xe4\xa30J\x17\xa7u5^\xa8U\xa6\x1b\xeaI\x96\ +\x97~\x0a\x18\xe6\x90\x83\x0e \xec\xb0\xa5&g\xacI\ +\x9a4\x02\x03\x0c\xcb2\xcbh\x93\x8e:\x08\xdf\x94r\ +\xcd\x89\xa5\x9d9f\xbb\xe7p\x00\xfe\xf9-\xb0\xe2\x92\ +K\xae\x09&\xa8q\xaeB\xcd\x00\xd2\x88\xba\xeb\xb6\xdb\ +l\xa3oF7\xdd\x8csf\xa6\x1d\xb6\x7fq\xc8)\ +\xbf\xfdz\xeb\xab\xa8\xa3\x0a\x1c\x0a\xc1&\xcc@\xc6\xc1\ +\x07%\x10\x0c\x05\x14,\xbc.\xbb\xab\xb6\xea\xec\xb3\xf2\ +\xc67-\x8d\x96b\x89+\x97{\x82\xe8\xef\xaf\x5c\x0c\ +:\xee\xb0$\x97\xbcF\x01:\xa0<\x109Fh\xc1\ +\xf2\xc2\x0c;\xfcp\xbc\xd1\xd2[e\xce\xbb\xed\x9c\xb1\ +\xb6\xbb~\xf93\xc8\x01\x0fL\xf2\x0c3\xac\xb1\xc6\x1c\ +!(\xad\x03\x13Z\xb4\xfd\xb4\xcb0\xbb;s\x83p\ +\xceV\xefT\xb6^\x9b\xef\xd6\xfb\xfe\xff\xe81\xd0B\ +\x8b\ +\x93\xb2\x0d\x9d\xae\xb5\xb9\xfem\x8b_`\x02\x1f\xd1H\ +W\xc05\x94\xcf\x00\x08D\xe0\xa9\xd0\x13\x00\x1f\x00\xa1\ +\x81\xeac\x9f\xeb`\xf7\xb6\xf8I\xceM\xf5\x83\xcd\xf5\ +d`\x81d\xf8\x00\x04\xe8\xa0\xc1?\xff\x5cA\x90\x5c\ +$\x80\x0fC\xf8\x80\x18^\xe0\x84\x0f\xfa\x0dT\xa2\x12\ +\xdd\xd8\xc6w\xc2\x14\xa6\xd0\x0a\xcb\x91\x05\x09|\xe0B\ +\x18>\xb0}4\x8c\x9e\xc3*\xf8\xa8\xdb%!\x05\xc1\ +\xd8\x00IX\x92\x00M$c\x1cO\xfc^\x00\xc36\ +B\xa3\x19\xaf|VD`\x09\xd6\x904\xd5\xb8\xc2\x05\ +\xfd\xe8\x07\x17_\xe8@\x19>\xef}Q\x93\x1f\xbc\xa0\ +%\xb1dh\x22\x01l\x09\x00 \x8a\xf0\xa7_\x05n\ +\x80%\xacb\x1eK\xc0I.@\x921\xb0\xd0\x041\ +\x02)\xc8.\x16\x12\x82\x8d\xab\xa1\xf4\x18\x15\xaf\xb3|\ +r5LP\x86\x1c\x01\x16>\x02\xde\xf1\x80\x9b\xe4d\ +\x09(\xb1\x89\xc6\x0c\x81\x04\xc0$\xa5 \x09\x19CT\ +\x222~\xb5\x83\x01\x0a\x10T\x8b\x0fda\x8eC\x9b\ +b\xe14iE]\xee\x92\x12\x8fx\xc1b<\x00\x08\ +@\x00\x93\x04\xa3\x0c\xe4 O\x09\xc6c\xb2K~\x8d\ +\x10\x07\xaa@0\x8c\xa0\xd1qtv\x9c&.\xab\xa9\ +KJ`\xf3\x11\x8f@\x8bZ\x5cq\xff\x88nv\x13\ +\x98\xe1,%!\xbf8\xc3c:,\x19\xcb<\x18\x09\ +\xc0@Gi\xca\x13uy\xacA=\xed\x89O|\xae\ +\xe1\x0dj\xb1\x82\x0b\x5c\xa0\x04\x7f\x02\x94\x94\xe3,f\ +9%\x18\xbf\x0f\x10Qi\xffPC\xf829\xcf\x14\ +N\xf4\x9e\x15}D4`\xd1\x14>xb\xa3\x1c\xf5\ +(8Aj\xca/.\xaemN\x83\x9b\x11<\x80R\ +\x82\x0cA\x19\xf0, \x1esy\xcd\x98V\xd4\x01\x0e\ +P\x9dR\x5c\xf1\x01OX\x15\xa7:%\x01O\x07\xca\ +\xbe\x9fJ\xb0\x11O\xa8EQ\x0d2\x05\xf1=\x14\x85\ +\xf4\xe4$E\x9d\xfa\x08\xa8:\xa0\x06L1\xc6\x07\x0e\ +a\xd5\x9bn\xb4\xa3\xff\xdc\xa9@\xc9yH\x0ahA\ +\x10cE\x88\x12BqK\xb4\xbat\xa2lm\xab[\ +i\x91\x05\xa5\xbc\xe1\x03\x90\xadj]\xef\xaa\xd3\x80\xf6\ +\xb4\xabl;\xc1+\x03k\x10/\x14\xc0\x80\x86\xd5\xa3\ +Z\xd7\x1aS\xb7:\x80\x16\xa8\xa5\x85\x0bX\xf2\x85\x10\ +<\xe1\x09\x91\xa5\xebU7ZY\x90\xffr\xb5}\xc4\ +h\x02g\x15\xf2\x06N,\xf5\xb0Me\xebbS\xeb\ +\x067\xcc\x81%|x\xedk#+\xd9\xd9\xe2\xd5\x9b\ +Z\x15\xe7m]p\xa4\xdd.d\x18\x10M+i\x9f\ +:\x5c\xd4\x16\xb7\xb8\xe7CI-4\x01\x02\x10(\x17\ +\xb6\x90\x95\xad]\x9f\xfb\xd1R:\xf0\x03\xbc\xb0\xaeI\ +\xa0\xc0\xd4\xed\xe2\xb3\xbb\xb4\xf8\xeew)\xa1\x92\x05\x94\ +\xb7\xbcR8od\xeb\xba\xde\xbc\x86\x93\x8b\xc2\x80\xaf\ +|O2\x0c\xe0\xda\xd7\xb4\xc4\xd5\xaf~\xb5y\x92W\ +\x84@\x13\xe4\xfdo\x80\x97\x9b\xde\xc9\xe6\x14\xba\x07\xf6\ +Du\x17\x5c\x12\x5c0@\xa2\xc1--TS\x9b_\ +\x09\x17\x17\x00\x00p\x00FM\xb2\x00\x0c\xdb\xf8\xbf\xe6\ +U\xee\x80g\xeb\x02\x9d\xf6C\x09\xb6 qJ\xb8\x90\ +b\xee\x9e\xd6\xbb.v\x03\x8ca\xbc\x85)\x98DE\ +!\xb8\xb0\x8d3\x5c^\x01\xcf\xd5\xc3x%\x01 \xd6\ +(\xe4\x93\x08\xc2\x000\xbd\xef\x8a#,\xe1%\x03`\ +\x0bhv\x00\x97\x13\xe2\x81(\xbby\xff\xcaT\xde0\ +z\x9bKY@\xf0\xa1\xcb*\xe9\x87S\xbb\x9bd3\ +\xa3\xf9\xcf[0\x90B`a\x0c+X\xc1\xcdQ\x86\ +\xb3\x86u\x0cY\x0f'\x14\xcf)Y\x82\x98\x8f\xdc\xe2\ +2/\x19\xd0h\x86\x04$\x0c\xb0\x90\x04\x18\xfa\xd3\x87\ +~\xf3\x94\xffke\xd9\x82 \xbe\x90N\x89-v\xc0\ +g\x17_\x1a\xd3\x9a\x8e5 \x14\x22\x88\x0dl\x00\xd4\ +\x86F\xb4\xa2\xab\xcc\xe1\xaa\xae9\xd5'1\x06\xa5\xfb\ +\xccd@\xc7\xfa\xd8\x90x@B\x5ca\xebf\xdf\x1a\ +\xd4\xba\xbe1\xa9\x97\x0bX`\xaf\xc4\x0f\x95\xd6\xef\xab\ +\xff\x8c\xecn\xb3\xd9\x18\xc6p\xb6\xadq\x1dm\x0c/\ +Z\x13\xa8\xb6vJz\xb1\x06K\x9f\xd9\xd8\xdd\x8e5\ +\x04\xe6m\xb0\x83d\x00\xdc\xf8\x16\xf7\xb3s-js\ +\x97\x97\xa8\xea^\x890\xbe\xbb\xedL\xc7[\xd3\xf3N\ +\xb8\x09\x0e\xd2\x0c\x14\xa0\x00\xdf\x10\x177\xb9\x13m\xe3\ +\x0d\x04\x9c%1\xd8A\xc1\xb7ppH$\xfc\xe3\xf3\ +F\x87A<\xe0\xf0\x92C\x1c\xdc\x12\xff\x876\xc5g\ +|q\x95\xb8\xe0\xdd\xdc>8\xc8g>\x82\xce\x0e\xa1\ +\xe48?y\xb8\x9d\xadr\x14\xcc\xa2\xe5,\xd9\x81\xc1\ +\xe3=\xf3\x99W\xa1\x0a\xa1(H-\x86\xc0t\xa6\xe3\ +\xdc\xe4'\xe7\xf9\xa7Y\x0e\xf4\x94\xf8@\xe6E\xff\xf8\ +\xd1\xb7^\x85\x82P\x03\x1dM\x0f\xfb\xd3\x1d\x1eug\ +\x1b\x83\xa6U_I\x0d\x90\x9d\xf5\x84s\xfd\xed' \ +\x089\xd0Aw\xb0\x87\xbd\xe9c/;9\xd2\xce\x92\ +\x11 \xbc\xed\x10x\xbb\xe0\xabp\xb2\x81\x08\x22\x03\x88\ +\xaf;\xdd\xef\xee\xf4\xa7C\xfc\xa4|O\x09\x1f\x00?\ +\xf8\xc1K\xe0\x11\x03\xa9\x85 6\x7fx\xc4g@\xf1\ +\x8c\xbfy\xce\xab\x1dy\x95\x14\x00\xe4\x95\x17\xbc\x04V\ +\xcfz!\xfe\xa3\x17\x9c\x8f}\xe7\x13_w\xc6\x97\x9c\ +\xea\xa5?\x89\x16\xe6\x9dz\xae\xb3\xfe\xf7\xacG\xdc?\ +\xde\xe0\x05\xd9\x1b\xdf\xf3\x9f\xaf}\xd8G\x9c\xfb\x93\x90\ +\xa3\xf7U\x00\xbe\xf4Y\x9f\x02\x81\x90C\x07^\xc8~\ +\xf6\x8d\x1f{\xe4\xd7\xde\x0b\xcd_I\xff(T?\xfd\ +\xf2\xaf\x9e\x01\x02\xc1\x81\x0e\xd6\xcf~\xeck\x9f\xfb\x9b\ +G~\x00\xc2\xaf\x92\x14l\xdd\xfc\xd3_\x86;\xf6\xef\ +\x0e\x00\xfc\x83\x178\x10\x80\x01\xd8~\xed\xa7}\xc5\xc7\ +}\xe7A\x7f(\xe1\x09\xf8\xf7{\xfa\xc7\x7f\x10\xb8\x7f\ +o\xe0\x0a\x02X\x81\x15H\x80\xebg\x80\x9c\x97n\x0a\ +X\x12o`~\x11\x18\x82\x11h\x0c\xd2\xb0\x00\x0b`\ +\x81(x\x81\x04\xe8\x05f\xd0\x81)\xf1\x08\xab\xf7\x80\ +\x228\x83\x10H\x0c\xd4`\x828\x98\x83)\x88\x82\xeb\ +\xb7w.x\x12\x0f@\x83B\xb8\x7f\x13P\x84j\x90\ +\x009\x98\x84Jx\x82)\xb8Y?\xa8\x10S0\x84\ +DX\x84TX\x85\x13`\x01o\xc0\x07Z\xb8\x85Z\ +\xb8\x84^\xb8\x00\xda\xf0\x84&!\x06\x11h\x85fx\ +\x86\x130\x0c\x01\xc0\x85l\xd8\x86]\xa8\x84\xcd \x86\ +%\x01\x02hX\x87g\xd8\x07\x01@\x034\xe0\x86|\ +\xe8\x86\xcc'\x87\xf6f\x87\x82H\x85k\xe0\x01\xe4p\ +\x88\x87\xa8\x87\x8a\xb8\x88\x8a\xe8\x86\x1c\xff\x08\x88#7\ +\x88E\xd8\x06\x94X\x89\x96\xe8\x06\x86\x88\x88\x9a\xb8\x89\ +\x9c\x88\x88z\x88v\x90\x88\x10\x968\x8a\xa4X\x8a\x94\ +\x08\x01\x01\xe0\x01\xaa\xb8\x8a\xac\xa8\x8a\x9d\xb8\x89\xa1\xa8\ +\x10\xa68\x8b\xa5X\x05\xadx\x8b\xb8\x88\x8b\xb1\x98\x10\ +\xb4\xd8\x8b\x96\x98\x8b\xc0\x98\x8b\xbb\x88\x10\x0dP\x8c\xc6\ +x\x8c\xc8\x98\x8c\xc7\xf8\x06\x01\xd0\x8c\xce\xf8\x8c\xd0\x18\ +\x8d\xce8\x8c\x07\xa1\x8c\xd6x\x8d\x12\xc0\x8c\xd2\xb8\x8d\ +\xdb\x08\x8a\xd4(\x10\xd7\x18\x8e\xc8X\x05\xda\xf8\x8co\ +p\x8e\xe8\x98\x8e\xea\x88\x8e_\xf0\x8d\x03\x11\x00\xe2\x18\ +\x8f\x0d\x00\x00\x09\xb0\x8e\xf6x\x8f\xe8\xf8\x88\xc3\x98\x01\ +\xf2(\x8e5@\x0d\xf8\xa8\x8e<0\x90<\x90\x00\x06\ +y\x90b\xe5\x8e\xff\xf0\x04\x7f\xd0\x90\x7f\xd0\x8f\xc9\xc8\ +\x05\xbdp\x8e\x049\x90\x07y\x91\x18\x89\x91\x90\xf7\x8d\ +Z\xe0\x90\x1e\xf9\x91\x0ey\x8d\x0f\x80\x0b\x19Y\x92\x17\ +I\x0d(\x99\x92\xd4\x10\x87\x0a\xf9\x03\x1a\xf0\x920\x09\ +\x922\xf9\x91\x97\xd0\x0c&\x99\x00*\xff\x99\x93:\x89\ +\x0b\x0a\xf9\x0f\x05\x00\x93@\x19\x94/9\x93\x0d9\x02\ +\xaf\x80\x93:\x99\x949\xe9\x08\xb2\xd0\x94<\xa9\x90q\ +\x90\x03B9\x95T\xd9\x90>\xc0\x0bJ\xa9\x93L\xd9\ +\x94\x5c\xc9\x95\xbd\xe0\x8d\xc3\xa8\x0bb\x99\x03dI\x96\ +Ty\x96\x1b\x00\x0bJ\xb9\x95]\xe9\x95\xbd\xf0\x96\xb8\ +\x10\x97\xfa\x18\x8a$p\x0bby\x97wY\x96fy\ +\x96\x1a \x10(\xc9\x96m\xd9\x94o\x09\x97qY\x98\ +q\x19\x08\xeeh\x01\xb7\xb0\x98\x8c\x89\x97x\xa9\x97R\ +\x09\x94\xee \x10M\x10\x98\xb20\x98\x84i\x98\x86)\ +\x0d\xb6\x90\x0b\xee\xe8\x06\xad\xc0\x98\xa2\xb9\x98\x8e\xf9\x98\ +z\xb9\x03\x02\xe1\x0c\x82\x89\x99\x9a\xd9\x9a\x9ci\x0b\xb0\ +\x09\x9b`\x19\x8a\xadP\x9b\xb5y\x0c\xa39\x9a\xa5y\ +\x97\x16 \x10\xb5\x90\x99\xadY\x98\xaf\x19\x9b\xb6\xd0\x0c\ +\xc6\x99\x0bs)\x87, \x07\xb6\xd9\x9c\xad\x80\x9b\xb9\ +\xd9\x98x)\x0c\x02\xf1\x05\xc1)\x9c\xc4\x19\x9b\xc6\xd9\ +\x0c\xb9\xd0\x9d\xae\xf0\x87\x90X\x03\xa0\xff \x07\xe4\xe9\ +\x9c\xcd\x09\x9d\xd1\xb9\x98\x04\x11\x04\x9a9\x9c\xc4\xb9\x9d\ +\xdc\xe9\x9d\xae0\x9f\xae0\x9bbh\x06-\x00\x0a\xfa\ +9\x9e\xe5i\x9e\xb6\x89\x9e\x8c\xe9\x0f\x04\xe1\x0c\xb8\xe0\ +\x9e\xef\xb9\x9d\xf2I\x9f\xdf\xf9\x0a\xaf\x90\x9c?\xa8\x07\ +-\x10\xa1\xf9\xb9\x9f\xe4\xc9\x9c\xfe\xf9\x9f\x8b\xa9l\x03\ +\xc1\x0b\xd9\x09\x9b\x08\x9a\xa0\xf4\xc9\xa0\x22Z\x0b\x09\x09\ +\x89\xaf\xd0\x06\x12\x9a\xa2\xfb\xc9\x9f\x16z\xa1\xad\x90<\ +\x03\x01\x0b\xda\xf9\xa1\xb9\xa0\xa0!*\xa2\xaf@\xa2\xb5\ +\xc0\x0b\xf6\xe9\x82Z\xb0\x02@\xba\x02)\x1a\xa1+\xca\ +\xa2-\xda\x9c>8\x10\xae@\xa36:\x9f8\x9a\xa3\ +$\xca\x0bR*\xa5\xa1\xb8\x05A\x1a\xa4CJ\xa4+\ +Z\xa1-\xea\x06\x06Q\x0b\xddY\xa3M\xfa\xa4P\xba\ +\xa3S*\xa51\xe0\x0b\x80(\x0c\xa3p\xa5n\x9a\xa5\ +\x13J\xa1\x15\xfa\x03\x06\xf1\x05M\xba\xa08\xaa\xa3f\ +z\xa61\xf0\x05~\x0a\x88\x100\x0a\x82\xea\xa6W\x0a\ +\xa7q\xaa\x9fr`\x0c\x07\x11\x08\x0a\xffJ\xa6:z\ +\xa6S\xda\xa7~\xfa\x05\xb0\xf0sO\x08\x03\x82\x9a\xa9\ +mJ\xa8@j\xa8\xfb\x09\x01\x08\xc1\x0bx:\xa2\x8f\ +\x0a\xa9\xbc \xa9~\x0a\x0b\xaa\xaa\xa6O\xa8\x01\x9a\xaa\ +\xa9\x9c\x8a\xa5p\x1a\x0f\x08\x01\x0byZ\xaa\xa6\x8a\xaa\ +\x94\xba\xaa\xb30\x0b\x9c\xe6\x82\xc3p\x00\xc2\xfa\xaa\x99\ +\x1a\xab\x9d:\xa4}t\x10\xbcP\xa6{\x0a\xa9\xba\xaa\ +\xaa\xb0\xe0\x0b\xbd:\x0b7p\x03\xc4\xd0\x81 \xac\ +\xdaz\x00\xc4:\xa8\xc6*\xa4-\x90t\x09\xf1\x05\xb8\ +\xea\xac\x93\xba\xab\xd1*\xad\xd4Z\xad7\x80\x05\xbf\x16\ +y\xbd\xe0\x0e\xdb\xaa\xad\xdd\xea\xad\xc6\x1aw\x0aa\xaa\ +\x91z\xae\xd0\xea\x0b\xea\xca\xae\x00\xeb\x00\xf4\xa7\x0c\x88\ +P\xb0\xf3:\xac\xf5\x1a\xab\x13\xb0\x91\x07\xf1\x05\xe6\xca\ +\xaf\xfd:\xad\x00\xcb\xae\xa9\x90\x0a~\xd0|\x8dP\xb0\ +\x1a{\xb0\x08\xdb\xad\x84\xead\x0b1\x0b\xfb\x0a\xb1\xbc\ +\xda\xab\x13[\xad\x15[\xb1\x22\xf0\x04\xa5\xb7\x01\x07\xd0\ +\x01\x1a\xbb\xb1\x1c[\xaf\x9b\xba\x02\xe0\xffp\x12_\xa0\ +\xab\xe8\x9a\xae&{\xb27\x90\xb2\x15k\x0a\x11\x90\xac\ +@\x17\x00\x1a\xd0\x01H\x1b\xb3\x06;\xb34\xbb\x02\x89\ +p\x12\xb3@\xb2<\xdb\xb3\x13\x0b\xb4Ak\x0a\xa6@\ +\x04\xb8\xa7n\xd4\x00\x09\xa5P\x0aH\x0b\xb3J\x8b\x08\ +\x1c\xcb\xad\xdd\x0a\x0a\x00g\x12\xb0\xb0\xb3\xd1*\xb1>\ +k\xb5\xa9\x80\xb5r\xdb\x02U\xe7\x06\x8a\xa0\x08_\x1b\ +\xb6b\x1b\xb3ek\xb6\x9a\xfa\xb4(1\x0b\xd0\xda\xb6\ +T{\xb2p+\xb7X\xfb\x0b\xa4\xd0\x97\x17W\x02w\ +{\xb7_\x0b\xb6I;\xb6}\x9b\xa9\xad\xb0\xb5\x0b\xb1\ +\xaa\xea\xba\xae\x86k\xb5\x88\x9b\xb8\xa4\x10\xba-\xc0\x03\ +\xea\x06\x00\x08\xf0\xb8\x90\x9b\xb7\x93\xab\xb4\x95;\x0a\xd5\ +\xb7\x12\x9b\xeb\xb3(\xeb\xb9\x9f\xab\xb8\xa1\x1b\xba\xea&\ +\x01\x08\xb0\xbb\xa8\x8b\xb7\xaa\xbb\xb7\xac\xcb\xb1\x13\x90\x14\ +\x85[\xb5\x87[\xbb\xb7{\xbb\x84\xc0\x0f\xe6\xd2e\xd5\ +\xb0\xbb\xd0\xdb\xbb\x91\xab\xb7cK\xb6\x07\x8b\xaf,\xd1\ +\x00\xb2{\xbc\xc8\x9b\xbc\xa4@\x08\x84\xffP\x01\xdb\x00\ +\xb2\x0b\x06\x03\x8a@\x04\xd0\x1b\xbd\xa8;\xbda[\xbd\ +\xd6+\xac\xe2\x9a\x14\x82 \x02\xc6K\xbb\xdd\x9b\xbc\xe0\ +[\x01\xfa[\x01p%_\x05@\x04\x00\x8c\xbe\xe9{\ +\xba\xeb\xcb\xbe\xc0\xcb\xb7\x07\xd0\x02w\xb6\x14\x97\x00\xb0\ +p\x1b\xb7\x9fk\x0a\xb6\x8b\xbf\xe1\xbb\xbf\xfa\xcb\x01\xbb\ +\xf5\x04\x0d\xc0\x01\x01\x0c\xc0\x03\xdc\xbb\xbe\xfb\xbb\x07\xac\ +\xb15\xc7\x14_p\x0c\xb3k\xbf\x88;\xc1\xca[\xc1\ +\x16\xac\xbf\x22\x10\x0aNx.\xca\x90\x06i\xc0\x01\x1c\ +\xdc\xc1\x1f\x0c\xc2\x06<\xc2\xfd\xdb\x148\x80\x01\xdc{\ +\xbf-\xec\xc2\x16,\x02H\x1c\x01Kp0\xbc0\x02\ +\x07\x80\x0c6|\xc39\x1c\xc0;,\xbd\x22\x1c\xb3\xad\ +\xe0zi\x91\x0c*,\xb7\xbf\xc0\xc2\xa1\x0b\xbeF|\ +\xc4H,\x02\xef\xa0\x08\x82v&L\xf0\x07\xc8\xd0\xc6\ +Pl\xc3SL\xc5\xe9\x0b\xc2!L\xbd\x05K\x9dl\ +\x11\x0a)\x1b\xc1\x12\x0c\xc6\xdf\x9b\xbf/\x0c\xc3el\ +\xc6\xef\x10\x0b\x88\x80$\xc9\xf0\x07\x8c\xff\xc0\x08n\xfc\ +\xc6R\xdc\xc1\x1e<\xc7<\xdc\xc3\xc3\xc0\x18\xaf\xd0\x02\ +\x10\x5c\xbb~,\xc6\x81,\xc8e\xfc\x0e\x85\x1c\x0b\xa7\ +p\x0a\x96\xa0\x0c\xcb!\x08N\x80\x08\x0a\xb0\xca\x8c\xdc\ +\xc8Q\x8c\xc3\x90<\xc0\x04l\xc5\xaa\x8by\x8d\xc1\x07\ +\x11\x10\xc1_\xec\xbda<\xc6d\x8c\xc4\xa0\x1c\x0b\xc2\ +<\xca\xa7\xb0\x0b\xabp\x0b\x16\x90\x01\x8b\x91\x02\xee\x80\ +\x05\xce\xbc\xca\x0a\xb0\xc8\x8d\xec\xc8\xb0\xac\xc3U\x5c\xc0\ +_\xcb\xb8\xaa\xa1\x09\xbb\xb0\xc2\xbc\xdc\xcb\x9d\xec\xc9\xc0\ +\x1c\xca\xc4\x5c\xcc\xab\xb0\x0ah\x80\x06D\x10\x0a\xc9\xb0\ +\x14\x8d\x90\x09\xa3 \x00\x96\xe0\xcc\xf4\x0c\xcd\xad\xec\xc6\ +\xaf\x1c\xc7\x91,\xc9V\xbc\x02\xe8!\x06\xf6\x00\xba\xdf\ +\x0c\xc8\x9d<\xc8\x84,\xcc\xa2<\xca\xcc`\xcc\xe8\x8c\ +\x06*\x80\x01\x10\xcd\x01\xc9\xf6\x0f>\x80E\x05\xe1\x08\ +\x02\xd1\x0f/\xb0\x09\xb4\xd0\x01\xdc\xf0\xd1\x02\x10\xd2\xf3\ +\x5c\xcf\xac|\xcfm\x9c\xcf\x90,\xc0\xfc\x8c\xba\x1d@\ +\x02\xe9\xa1\x07\x12\xfc\xcd\x7f\x1c\xce\xe2\xff|\xd0\x09=\ +\xca\x0c\xdd\xd0\x0f\x0d\xd1\x18P\x0f>]\x0fu\xa0\x0a\ +B\x0d\x0c\xdf\xf0\x0d\xac\xc0\x0a=\x10\x01J\x1d\x01\xa8\ +\xf0\xd1\xdc\x10\xd2\xf2L\xcf\xcf\xcc\xca\xd3\x1c\xc5\x8f\x1c\ +\xcb\xd7|\xb7\xf5\x96\x1eP \xd3\x9c\x1c\xce\x06\x1d\xcc\ +\xc3L\xcc\x0c\x9d\xce\x0e\xcd\xd3=\xfd\xd3A=\xd4E\ +}\xd4I\xbd\xd4\xa8\xd0\xd4O-\xd2R\x8d\x05\xf6l\ +\xd2\xd4\x5c\xcd\xd6\xbc\xd2\xaf\x8b \x0f\xc0\xcb_]\xd0\ +aM\xced}\xce:\xbd\xd3i\xad\xd6B\xad\x0aD\ +m\xd4G\xbd\xd4L-\xd7\xc5\x00\xd5#=\xd5T]\ +\xd5p\xac\xcf*-\xc9I`(\x7f]\xc44]\x01\ +\x83\x8d\xd0\xe5\x9c\xd3\xe9\x8c\xd8\x89\xed\xd3k\xcd\xd8m\ +\xfd\xd8p-\xd7s\x1d\xd5R}\xd7\x98\x9d\xd9)-\ +\xcb\x08\xd0\x9b\xa8\xd2\xd5\x7f\xec\xcb\xbf<\xce\x84\xad\xd0\ +e}\xdah\xfd\xd3\xaa\xbd\xd8\x8d}\xd4\xac\x00\xd9q\ +\xed\xd4\x94]\xd7\xd0\x1c\xcdx\x9d\xcf\x9a=\xc0}\x8d\ +*?\x10\xd8\x82=\xc8b}\xd3\xe6\xff|\xce\xa7\x8d\ +\xda\xc6\x0d\xd4\xc8\xdd\xda\xcb\xfd\xda\xce\xfd\xdc\xb3]\xd2\ +\xb5}\xd5X\x8d\x00[}0h\x10\xda\x06M\xc8\xc1\ +\x8d\xd3\x86\x1d\xde\xc5m\xdc\xab\x9d\xdc\xae\x8d\xde\xdc0\ +\xd9t\xbd\xde\xec\xed\xca(\x9d\xd2\x88 |(U\x0c\ +4]\xdf\xdd]\xda\xf9M\xdc<=\xde\xe4\xcd\xd6\x8e\ +\x8d\xd4\xcc\x0d\xdb\xeaM\xe0\xd2\x5c\xdb8\xac\xcfr`\ +q\x81\xd5\x0a\xdb\xfd\xc9b]\xce\xdf}\xd8\xfb\xcd\xdf\ +\xe5}\xe1o\xad\xd4\xcd\x0d\xd2\x22]\xd9\x96-\xdd\xed\ +\xfd\xe1\x01\x0c\x00i\x1bX\x03\xf0\xc2\xf5m\xd3\xde\xbd\ +\x0b\xa6\xed\xd0\xe2=\xde\xfdm\xde/\x1e\xd9\xe9=\xe0\ +$]\xe0\x06n\xdbDp\x04$\x96\x0c\xdf\xb0\xbf\x0e\ +~\xe2\x10\x0e\xde\xfa=\xe1\xfc}\xe4.\x9e\xe1N-\ +\xe0\xb2M\xe06\xee\xe1\x1cp\x00REb\x0d \xda\ +\x83\x1d\xca\xde\x9d\xe2f\x8d\xda\xa9]\xe1\x16\xae\xdcI\ +\x1e\xd7\x1a>\xe3\xd0M\xdb\xed-\xb0\xc0V\x0fm>\ +\xd6\x85\x1d\xe1*P\xe4,\xde\xe2v\xff\x9e\xe1y\xce\ +\xe4M^\xe6\xae\x5c\x0a\xe4\x0bl\xee`\xe2n\x8e\xe2\ +CN\xe4+\xae\xd8-\xee\xd8I\xae\xe42\xce\xe85\ +\xde\xe1\x8d\x5c\x02@\x97\x0c\xc8\x00\xe4\x96~\xe9rN\ +\xe1\xab\xcd\xda\xad\xdd\xe91\x1e\xe0\x94M\xe3\xa1~\xcf\ +\xa0\xa0\x05|\xe7\x04\xf5P\xe9Y\xae\xe5\x85\x8e\xd6s\ +N\xe7\xae~\xe1\x90\xed\xe9\x9f>\xe6\x8d.\xcd\x8a\xa0\ +\xdb\xa5\xd7\x07\x18\xf0\xe6\x0b\x1d\xe1\x98\x9e\xe9\xc7\xbd\xe9\ +\xca]\xecx\xbe\xe4\xc8^\xe3\x0aP\x06\xbd\xa4\x80\x17\ +P\x0f\xa5\xad\xea\x86~\xe8\x16N\xec\x8a\xae\xed\x96@\ +\xebv\xdd\xed\x0f\xa0\xc5\x1d\xe8\x04\x96\x80\xdf\xd2\xbe\xea\ +\xac\xbe\xd8\xc3\x9e\xe8\xaf\x0d\xdbb\xbe\xedXp\x00\x9d\ +\x0d\x89\xc9\xd0\x06\xe4\x0e\xec\x14.\xec\x8d\xfd\xe5`\xae\ +\xeeR\x0d\x090:\x8cG\x80\x00\x0d=\xed\x5c\xde\xe5\ +\xf8\x9e\xf0\xfa\x0e\xe0\xc7\xbe\xee- \x03\xca\xdc\x93\xff\ +\xf0\x00\x88@\xf1\x10\xcd\xea\xad\x8e\xf1n\x8d\xed\xb1\x0e\ +\xd5\xba\xe0\x04\x16\x0d\xf2\x04\x81\x03/M\xf0\x08\xa2@\ +\xed@}\xf2E\xad\xf0\xfb\xfe\xd1\xa5\xb0\x06j\xa0\x18\ +0\xbf\x10\x82\x90\x0c` \x01\x0a`\xe4\xf8\x9e\xef)\ +\x0f\xd9D\x90l\xe1\x15\xf4I\x01\x03\x89p\x01\xe1\xe0\ +\x0e-\xc0\x01i\x80\x05D\xad\x00\x1c\xdc\x0a\x12P\x03\ +\x99P\x04'\x02\xef$\x16\x10\x00!\xf9\x04\x05\x03\x00\ +\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\ +\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*D\x88\x8b\xcf\x90'\ +\xfd\x8cX{\xf1C\x8f\x05\x192\x8a$I\x12oD\ +2#.\xf0\x98YH\xb2\xa4\xc9\x93(S\xaa4H\ +m\x88'-\x14\xf5X\xb4\xb0\xb1H\x91D\x890B\ +\x81\x92\xc5\x89\x93a@\x87\x11 0\xe8\xc5\x89\x10o\ +V*]\xca\xb4\xe9AY(\xfa\xa9\x99\x92\xc2O\xbc\ +x?\x96\xc8\xa4\x99\xc4&N\x9d<}\x06\x15J`\ +\xd3\xa6#h\x07%{\x92\xc0\xa9\xdb\xb7p\x07\x06\xd0\ +D\xe1\x85\xdd)TS\x5c\xcd\xba\x95\xa6\xd7\x9c2v\ +\xf6\xfc\x19t\xa8Y\xb4G8=X\x9cDX\xdc\xc7\ +\x90K:\x0a\xa1e\x84e\xbb/\xf0\xa6\xd0\x8bU\xeb\ +\xcc\xae7\x01\xef\xf4I\x18\xa8\xe1\xb3h\x15/~\xa0\ +LY\x22a\x01\x22\xcb\x8e\xac\xc3\x07\x0b5\xb8-\x8f\ +\xb8\x9bwo\xc5\xcf]\xbf\x06\x86Bzl\xd9\xc3\xa9\ +W\xb3n\xdd:^\x88Z\xb3\xa3/ueLK\xb2\ +d,n\xab\xd1\x8dY\xb3\xd5\x1f\xbf-p\xff\x0d\x0d\ +\xb6\xb8\xe9\xe3\xa89\xa9^\xcc\x5c\x19\x83\xf7\xc3|\xe0\ +\x92N\xbf\xa4\xad\x10\x14`\xc0\xb8\x9e=\xf7e\xdeU\ +\xed\xd5WM\xc2\x8dV\x1aY\xc8%\xa6\xdcr\xad\xbd\ +\xf7\x1e\x18\xcaP@M}\x14\x16\x94\x8b\x15Z4\xd2\ +\x88~\xfba\xa7\x1dw\x99\xf5\x86\xd5\x80\xc1\x89F\xdc\ +\x81\xa7!\xb6\x1e\x83\x0d:\x08\xc6\x8b\x0chQa\x85\ +(\x18\xa1\x05\x05\x14h\xa8\x1f\x7f\x1f\xfe\xa7\x19g|\ +\x89G\xa0\x89b\x15v\x9c\x8a\xca\xb5\xe7 \x03T\xbc\ +\xf8b\x01\x0c86\xe3l|\xf8\xc0\x84\x167\xe6\xb8\ +a\x87\xfdm\xf7_\x88@z6\xde%D\xa2xd\ +r\xab)\xe9\xa2\x93`\x14\xe0f4!L\xf9\x98-\ +O\x88a\xc4\x95X\xe2\xa8#\x97=\xee\x06\xe6w\xe1\ +\xd5Dfy(\x9a\x95^\x92\xcc-\xc9\x00\x9bn\xba\ +\xd9G&\xf1$%\xa7S^\x08#\xc6\xa5w\xe6\xa9\ +\xe5\x8e\x1e\xfa\xe7\xe7\x8fX\x05\xda\xd5\xa0\xc3\x15iZ\ +\x82+\xaa\xf9 \xa3\x8df\xe2*\x18$L\xff\xbaT\ +3O\x9cpB0\x98\xe2\x99\xe5\x9e\xfcy\x0a \x90\ +\x03\x16AjX\x85\xa2\xa6`\x9a\x89\xae\xf9d\xa3\x8f\ +\xba\xea\xaa\x05<\xc8\x9a\x129\xc4\x08#\x8c\xad\x97\xda\ +\x89\xa7\x9e[\xf2\xe8_wT\x09\xf8\x99\xb0\xa2\x0df\ +$\xaa\xc8\xb6\xb8\xaa\x93\x8d\x16\xe0\xac\xab\x17\x5c\xc0\x80\ +&\xd2\x96\x04\x0b\x0a>\xf8`\xed\xb5\xb8\xdai\xa3\xa6\ +\xbcv\x09\xa2f{i%$\xb9:\x99{\x1er\xa9\ +&\xbbn\x9b\xcc\xbe\x9bI\xbc\xf1\xc2P\xafB\xae\x80\ +\xd0O?>\x00a\xad\xad\xfdf\xbak\xb7\x9d\x0eL\ +\xd5w\x06\xfb5\xac\xc2\x08\x1e\x9a\xae{\x0fC\xec\xa6\ +\xc4\x14_\xb0\x03\x17ELxqA\xb2xB\xcc\xc6\ +\xf9z\xcco\xb6\x22s\xcb\xe7\xb7`\xea\x15\xa4\xca\xe5\ +\x9aj\x18\x92\xec9\xbc(\xbb\xad\xbe[\xf3\xcd\x5cp\ +\xa1\xccH;\x0b\xf4\x86\x0b$\x90\xb01\xc7\x1d\x7f\x1c\ +\xf2\xb6\x9br\xe9kf\x9b\x89\xcbt\xc2N\xa3\x1b\xb5\ +\xbaMR]@\xb3\xce\xd6\x9c\xf5\xde}X\xff\xd15\ +\x1f\x80\x04\x1e\xf6\xd8\xf9~|k\xae\x00o\xe8\xad\xc9\ +\xc0Z\xb4\xd1\xcaq\xbb<\xf7\x92\xac\xcel5\xc5X\ +\xef=\x00\x17\x80\x5c\xbc\x80\x0bJ\x04\x0e\x08\x09?\x03\ +-\xf4\xe1\xfe&\xbe\xa3\xc0\x9f\x86;\xa2\xe3\xc1\xc1]\ +\xda\x99\x0d\xc3\xfcp\xc4yc\xbew\xd6\x03\xf4>\x80\ +\x94\x93\x9a\xe1\x89\x0b\xa0\x0bN:\xd0e\x0f\xad-\xc0\ +\x9c\xf6\xf9\xe7\xeb\xe35m\x1c\xc3/++\xb3\xbb\x97\ +\xdb\xbc;\x17\xbe\x0f0\xc7\x1c2\xca)\xbc'\xc3\x17\ +?\xfa\xf1d\xef\x8b\xfa\xbfF\xef\xd7\xdf\xc0m\x079\ +d`=\x9d\x0b5\x83\x94\xdb\x8d\xf7\xc4\x14o\xdf\xfd\ +\xf7\xa1\x08E\xf8*\xc4\x87\x0f|\x80|\xe5\x0b\xdd\xf9\ +J\x97\xbc\xf5\xa1\x8dd=\x02Pg`G\x9e\xb0\xd8\ +\x0f-\x88\xb2]\xe5\xb0\x07/\xdd\xed\xcew\x00\x0c`\ +(NP!\x0f<\xc1\x80\x07$\x1f\xf1D78\xd3\ +\x99\x0dqF[\x5c\xeb\x80u\xb0\xafX\xf0T\x92S\ +U\xe5h\x16\xaf\xcc\xf1\x0e\x84\x22\x14a?\xff\xeaC\ +\x8d'\x18\x11\x85\x08\x5c\xa1\xf1\x90w:\x5c\x15-G\ +\xab\xbb\x0dw43\x021x\xc2\x0a:\xf0\xc0\x84\xa0\ +\xf3\x8fZ\xb8\xe2\x1f\xe4@\x07\x08\x84\xa1\x86s\xa0\x09\ +\x7f\xef\xa9\x9b\xcc\xf6\xe7A\xcd\x011\x88\xa10\x81\x09\ +6 \x1dih\x02\x04F<\xa1\x01\x93\xe8\x02\x162\ +P_\xca+\x9a\x8ez\xe5%k\x00\x02\x1d\xbdXJ\ +\x08\xe0 \x83\xc9\xdd\xcer\x1d\x8c\x97\xff\xde\x18D9\ +\x9a\x80\x0b\x5c\x8b\xcc+\xac\x00\x82N\xe6\x11\x89*\xec\ +\xe3\x02]\x18H\xe6\xb9\x8f\x05\xc10\x86\xce\xe0\xe2\x02\ +=\xd8njk\xcc\x9e\x0f\xff\x07\xc78Zr\x06\x05\ +\x98\x0d\x0a4qGO\x1eq\x8f\x094\x1e\x03O\x87\ +\xb8\x1b\xe9\x88\x02!Xed\x02 \x86a\xc0Rf\ +\xb2\xfc %\x03hI9\xce`\x06k(Dd\x16\ +\x10\x02^\xf6\x12\x8f\xbfL!\xf1\x14\xd8B\x8e\xbd\xd0\ +N\x9a\x12\x86 f\xf4\x84D,\x8b\x83\xfc\xd3\x9e\x1b\ +{7\x078V\xd3\x04\xd8\x5c\x83>\xd5\xf0\xff\x98\x04\ +\x84\xe0\x9f\xde\xec$8\xf5(N\xf3\xb5\xb0pC\xcb\ +\x14\x10\x16 \xab\x10\xcc\xc3Q\xd9\x9b\xa4\xf7\xecy\xcb\ +|\xeaS\x9fR\x80\xcb+6`\x85\x7fv3\xa0 \ +\x90B8CI\xcea~\xecR'\x10\x04,\xea\x15\ +\x03\x17< \x9a\xf3\xacg%+z\xd1\x9a\x0e\xe0-\ +\xb3\xc8\x80\x15v\xeaQo~s\xa4\xc1\x1c\x9dIo\ +e\x85Wt\xed\x1f\xb6HF$gIO\x8aZ\xd3\ +\xa255\x80\x01\xe6\xe1\x96\x00pt\xa7\x1d\xed)/\ +\x05\xfa\xc9\x82\x96\x14h\xc2\x00\x84\xa4\x8e*\x10tD\ +\xa3\x87\xd2\x9c\xe8L\x9fZS}J\xf5\xad\xc0S\xca\ ++\x8c\xb1\x81\xbab5\xab\x1f\xfd\xe9/C\xb9D\x8e\ +m\x80\x17d-H3Fp\x81\xb4\xcaT\x84\xd5\x84\ +\xeaE\xdf\xfaV\x13\xc4f)8\xa0k]\xaf\xcaS\ +\x80n\xd5\x97z\xe4\xeb\xf9H\xc0\x87\xc0\x22\xc4\x13\x85\ +\xe5\x1e=\x0fkKk\xb6u\x0d\x8cel\x0d\x12\xb1\ +\x14j\x18\xe3\xb5\x92\xb5ke-\xdb\xcb\xae\xffj\xd6\ +\x13\xca\xf4lAp\xa0\x0c\xd1\x86\x90\x9a\xb7\x15[_\xfb\xd6\xa0\x04%XCn\x17\xe2\ +\x81!X\x98\xbf\xe3\xfd/\x80g{Yp\x16\xd8\xc0\ +\x07\x1eDi\x15\x8b\xda\xd4:\xf8\xc1\x10\x860?M\ +\xc2\x8b\x0c\xec\xf7\xc2\x18\xf6oye\xfb\xdc\xcbZ\xc1\ +\xbd .\xc9\x11LK_\xd5\x9e8\xc5\x10\xa6\x84\x01\ +N\x12\x00\x17\xa3\xe3\xc5\x16\xee/y\x9b\x8bU\xda\x86\ +\xe0\x8b96I\x02\x0a\xc0`\x13;\x18\xc8%\xa0\x84\ +\x96)1\x02\x93x!\x03`>2\x92c\xbc\xe4\xd8\ +6\xb9\x9b!\x90F\x94Q\xe2\x85P\xf4\x98\xff\xb8W\ +\x06\xf2\x96)\xf1\x88G\xd4\xa0$\x09\x10\x84\x9e\x05\x11\ +\xe6#\xc3\xb8\xbf3>o\x08\x1e\xbb\xe6\x93\x00\xc2\xad\ +V\xee.\x96\xe7\x5c\xe7F\xe3w!f\xd8\xf3\x9e\xfb\ +\xb2N\x09\x0a\x0c`\xeb,\ +\xe3:\xd7\x8dv\x80\xb4\xf7\x90\x90Z\xe0\xe0\xda\xbf\x06\ +\xb6\xb0'm\xe4?g\xb8\xb3\xc9V\xc9\x0b<}k\ +-C;\xda\xd2\x966-\xc0m\x90\x04\x5c\xfb\xdd\xd9\ +>\xf5\xb6W\xdd\xedV\xa3`\x08\xe1^\x09.\x06P\ +\x5c9\x9b\xfb\xdc\xe9N7-\x06\x9e\x0c\x84\xd0`\x01\ +\xefNx\xb6Q\xad\xea>\xc3\xb8-\xf9VI?\xfc\ +Mg\x80\x07|\xe0\x18\xa7\x05\x17\x0e\xf2\x8a\x05x\xdc\ +\xe3\x09\xc7\xf6\xc2\xe7\xedp/\xf8\x22\xe2+\xff\x01\x83\ +\xb3+\x0e\xed\x80; \xe3\xb4p\x83\xcc\xdd\x90\x01\x96\ +|\xfc\xe6!\x17\xb9\xbc\x87\xedbY\xa0|%\x1f\xf8\ +\xb7\xae/\x0e\xf3\x99\xcf|\xc5\x04\xf1\x00\x1f\x96~\xf3\ +\x8f\xe7|\xe4\x92\xce\xe4\xcfQ\x02\x8b\x02\xb4\x9c\xe8\x18\ +7\xba\xd6/P\x10^,\xfd\xebLo:\xc2C\x0e\ +uGL}%\xc4\x085\xd6\x07\xae\xf5\xb6\xcb\x9c\xd0\ +\xff\x90\x06\x0dh\x00v\xb0\x8b}\xec\xf0\xfe\xb5\xd4\xcf\ +~\x92Z\x98\xc0\xe5\x19w{\xdb\x01@\xf8\xb8&\x80\ +\x1c\xe4\x98;\xdd\xeb\x1ev\x9c\x87|\xac|G\x09\x0b\ +\xd4\x1dx\xc1\xcf\x9c\xf0\x98\x07\x00k\x07\xe2\x01\xc4{\ +>\xf1sg<\x1f\xc4\xfen.F>%\x95\xb7|\ +\xe61\xbf\x85\xd6\xafa \xbc\xf0\x80\xec;\xffy\xc4\ +\x87^\xf47\xf7\xc0\xe9W2\x0d\xcb\xcb|\xf5\x00h\ +\xbd\xf0\x85O\x0e\x814c\xf6\xc8\xa7\xfd\xe7\x15\x8f{\ +l\xec^%Fp;\xf0\x87O\xfd-@\x02\x12\xb1\ +\xfa\x07>\x92\xcf}\xe5{\xfe\xf6_\xc7\xf1\xff\xf3O\ +b\xf4\xe9W\xdf\xfa\xd7O?$^ \x10j\x04\xe0\ +\xfd\xef\xef>\xf2k\x0fz\xdd\x8f?%\x17X\xfd\xf9\ +\xd1\xaf\xfe\xfe\x1f\xc1k\xf0\x17\x80\xf0'\x7f\xb2\xf7y\ +\x13v\x7f\x0b\xf1\x02\xc1w~\xfd\xd7\x80\xeaG\x09\xff\ +\xf0\x05o\xf0\x06\x02X\x81\x03(\x7f\xcd\x80\x80(\xf1\ +\x01\xc3\xe7\x80\x1e\xd8\x7f\x10\xd0E\x138\x82#h\x81\ +\x15\x88|_\xa0\x81(\xf1\x81\x1f\x08\x01.\xf8\x82\x10\ +\x80\x02\xae@\x824H\x83&\x08\x7f*\x88\x12\x06\xc0\ +\x82\x90\x00\x83>\x08\x83\x80\xd0\x0c<0\x845X\x84\ +$\x18\x80\x07\x98\x83\x081\x0c \xf8\x83N\xe8\x83\xc9\ +\x80\x0b\x090\x85T8\x85C\xc8\x03FH\x83\xc8\xa6\ +\x84$1\x02O\xf8\x85N\xf8\x03RX\x85dX\x86\ +WH\x83\xd4\xc5\x85$q\x02`\xe8\x84U\xf0\x86p\ +X\x05d\x80\x0b\xd4P\x87\xd4P\x86x\x88\x87\xa6\xa7\ +\x86\x09\xa1\x09O\x18\x87\x80\x18\x88U\xc0\x00\xbd`\x87\ +\x86x\x88\x86\x98\x87\xe2\xc7\x87\x07!\x08\x82\xff\xf8\x88\ +\x90\x18\x0a\xb2\x80\x88\x94X\x89v\x98\x82\x8c\xa8\x10\x90\ +\xb8\x89\x80X\x03\xbd\xe0\x08\xa0\x18\x8a\x96h\x89\x99\xb8\ +\x10\x9c\xc8\x89\x12 \x01n\xd0\x0b\xb2\xd0\x8a\xae\xf8\x8a\ +\xb0\x18\x8b\xaexr\xa5x\x10\xae\x90\x8a\xb8\x98\x8b\xba\ +\xb8\x8b\xb9\x08\x00\xb2\xf8\x8b\xc0\xe8s\xb5\x88\x10\xbcX\ +\x8c\xc6(\x01\xb8\x90\x8c\xca\xb8\x8c\xcc\xd8\x8c\xcb8\x8c\ +\xc4x\x8c\xd2\x88\x8b\xceX\x8d\xd6\x88\x0b\xb3\x00\x8d\x05\ +\xe1\x0a\xee\xd0\x8d\xee0\x8d\xc5\xb8\x05Ap\x8d\xe4\xa8\ +\x8c\xb4\xa8\x8d\x03\xe1\x8d\xea\xb8\x8e\xec\xc8\x8e\x00\xd0\x04\ +\xd2\x10\x8f\xf2h\x0b\xf4X\x8f\xf6x\x8f\xf5\xb8R\xe8\ +\x98\x8e\xed\xd8\x8f\xfd\xf8\x08\xb9\x80\x8f\x02)\x90\xcdP\ +\x90\xcd\xa0\x8f\xfb(\x08\xfe\xb8\x90\xebh\x02\xae\x80\x8f\ +\x06\x19\x91\x12\xd9\x0c\xb9P\x91\x15\x89\x89\xfb\x08\x02\x13\ +\xb0\x91\x1c\xd9\x91\x1b\xc9\x90\xeeP\x00\xaf0\x91\x05i\ +\x91&Y\x91\xae\x90\x92*\xe9\x0a\x8b\x08\x8dF\xe0\x91\ +0\x19\x9309\x0c\xbcp\x92\x16\xb9\x928\xff\x99\x93\ +,\xb9\x8f\x02\x91\x022\xf9\x931i\x01\xbc\xa0\x93D\ +\xe9\x0a\xafp\x94Hy\x94-9\x8c\xca\xd0\x06N\xe9\ +\x94@\xf9\x93j\x10\x03E\x99\x94V\x89\x94\xb5\x90\x95\ +{\xa8\x8d\x00\xf0\x94^\xf9\x95Q9\x01\xfd\xf0\x05)\ +y\x95f\xa9\x95hY\x0b\xbc\xc0\x0b\xd9\xb8\x8f_\xf9\ +\x96p\x09\x95\x1di\x0c\xbe`\x96G\x99\x96Z\xb9\x96\ +z\xa9\x97\x08\x09\x8d\x80\xd0\x00\x80\xd9\x00q9\x98^\ +)\x10X\x89\x97Y\xb9\x97\x8a\xb9\x97}9\x8cz\x10\ +\x98\x90\x09\x98\x84\xf9\x95!\xf8\x0f\xbc\x80\x97\x8b\x99\x99\ +\xbc\x10\x03_\xd0\x99\x18\x09\x8d\x94\x10\x99\xa2)\x99\x84\ +\x99K\xff\x10\x03j\xa9\x99\x8a\x19\x03\x9c\xe9\x99\x9e\x09\ +\x0bm9\x8c|0\x9a\xb4\x09\x99o\xf9\x03\x02\xf1\x05\ +\xaa\xb9\x96\xac\xe9\x9a\xaf\x09\x0b\xc0\x09\x9b\xda\x08\x03\x7f\ +P\x9b\xc6i\x9b> \x10\xb3\x90\x99\xbd\xe9\x9b\x9d\x19\ +\x9c\xc0\xe9\x0b\xbe0\x0b\xb1Y\x8b&\xf0\x07\xd8Y\x9c\ +\xc7Y\x9b\xec\xa6\x97\xcd\xe9\x9c\xd0\x19\x9d\xd3\xffI\x9d\ +7p\x03(0\x8c8\xa0\x01\xea\x99\x9d\xd8\xb9\x9d\x91\ +\x09\x09\x04\x01\x0b\xce\xf9\x9b\xd0)\x9d\xd4I\x9e\xe5y\ +\x03`0\x8c\xf1\xa0\x9e\xfe\xa9\x01\xec\xd9\x9e\xdb\xb9\x09\ +\x04\xe1\x0b\xbe\x19\x9e\xe2y\x9f\xb3\x90\x9f\x0c\x0a\x0ci\ +\x98\x89\xfe\x90\x03\xff\xf9\x9f\x01\xaa\x9d\xb4\xc9\x04\x041\ +\x0b\xcf\x19\x9e\xd29\x9e\xf8\xc9\xa0 :\x05\xa5h\x04\ +\xba\xa0\x0b9 \xa1\x13\xea\x9f\x15:\x9a\x06\xc1\xa1\xf6\ +y\x9f \x1a\xa3\xa90\xa3D\xf0\x99\x5c\xe8\x00\xb7P\ +\xa2%z\xa2)\xba\x9e+\x0a\x98\x10X\x10\x09\xaa\xa0\ +1*\xa33z\xa4,\xc0\x88>p\x0bL\x9a\xa3:\ +\xca\xa3=\x0a\xa0\x15\x1a\x0f\x06\xa1\xa0\x1fZ\xa4\xf9y\ +\xa4Z\x9a\x0a\x1c\xb0\x94\x08\xe8\x06\xadp\x0cM\xea\xa4\ +;\x0a\xa5=\xca\x9e\xe7Y\xa5\x0b\x8a\xa5\x0c\xba\xa5Z\ +j\x0ap\x8a\x9b\x5cH\x01\xadP\xa7a:\xa6dj\ +\xa2(\x1a\xa5\xb4\x80\x10\xca\xc0\xa6Y\xea\xa63\x0a\xa7\ +\x84\xaa\x0a\x90\xa7\x81\x13 \x07vZ\xa7b\xff:\xa6\ +:\xaa\xa7Q\x9a\x02\x08\x81\x02\x80*\xa8\x83J\xa8\x84\ +\xfa\x0b\xaf\x97\x83d\x00\x0a\xa0 \x07\x8a\xba\xa8\x8d\xda\ +\xa4\x8f\x0a\xa9\xff\x99i\x08\xa1\x0bFj\xa9\x98\x8a\xa9\ +\xbf@\x0a\xa4\x90}\x08\xa8\x09\xa0\xd0\x02\x9e\xfa\xa9\xa1\ +j\xa7\xa3\xca\xa4\xa5\x0a\xa5\x1b\x97\x10j\xd0\xa6\x96\x9a\ +\x0a\xad\x9a\xa9\xaf\x0a\xab\xc8\xa0\x81\xb8P\x05-\xd0\xac\ +\xb6\xea\xa9\xa0\xba\xa8w\xea\xa8\x8fz\xa2@\xa0\x10\xcd\ +\xc0\x0a70\xac\xc4Z\xac\xa6\xf0\x0b\xc7\x0a\xab\xb0\xfa\ +\x08\x08x\x04+\xb0\x02\xce\xda\xac\xd0\x1a\xad\xa2\x8a\xa7\ +d*\x01$1\x0c\xc3\xea\xadp\x1a\xae\xe2\x0a\xab\x84\ + \xa9\xcfG\x01\xe7\xda\xaf\xe9z\xab\xec\xda\xaex\xaa\ +\x0b]Fa\xb1\xe0\xa6\xf4\xfa\xad\xf6z\xaf\x84@\x08\ +\xdb0~\xa0\xd0\xaf\xfe\xfa\xaf\xeb*\xad\xd3\xca\xa4\x0d\ +\x00q\x0b1\x00oJ\xaf\xe0z\xaf\x0c\xdb\xb0\x15P\ +\x01\xc5\xb0{m0\x0a(+\xb1\xe7J\xb1\xb8\x9a\xab\ +\xba\xca\xa4I`\x12\x0b \x02\xdd\xea\xb1 \xff\x1b\xb2\ +\x840\xb2#\xab\x08\x91\x07\x00(\xfb\xb3*\x8b\xae,\ +\x0b\xaa.[\xa7\x1a\x80\x12\x17\x90\xb0\x1f{\xb3\xf8\x9a\ +\xb3:\xab\xb3\xadpv%p\x00\x07\xf0\xb3)\x1b\xb4\ +\xe9\xfa\xac\xb8*\xad1{\x12\xe4p\x0a\xc5\xba\xb4L\ +\xdb\xb0N\xfb\xb4:\xdb\x00?\xb7\x06TK\xb5V;\ +\x0aA+\xb4\xcez\xab[\xdb\x0ah\x9b\x12\x04\xd0\xaa\ +b{\xb3dk\xb6O+\x02\x22\xd0\x0a\x1a\xabi\x8e\ +\xf0\x08\x88\xb0\xb6l\xdb\xb6o\x9b\xb5\x00\x0b\xaa\xec\x97\ +\x12\xb8\x80\x05\xf5\xba\xb08\xcb\xb7}\xeb\xb7\x22\x80\x08\ +\xc9F\x03\x90\x80\x08\x9ck\xb8U\x8b\xb8X\xab\xb8\x9e\ +\x1a\x07\x0f*yy\xab\xb7\x22K\xb9#k\xb9\x96\x8b\ +\x05\x9a\xb6\x01\x7f\xc0\xb9\xb2\xeb\xb9m\xeb\xb6\x89K\xb1\ +q\x95\x12m\xc0\xb4\xe2\xba\xb7\xaa[\x01\xac\xeb\xb7\xef\ +\xf0\x0e\x18\xd0\xb8 \xd6\x08\x07\xd0\x01\x1d \xbb\x9dk\ +\xb8\xb5k\xbb*\x9b\xb5\xbf\xaa\x14^\xb0\x0bc\x9b\xba\ +\xbf\x1b\xbc\x220\xbc\xb1\x10\x0b\xa70d\x06\xff\xc6\x00\ +\xa5P\x0a\xca\xbb\xbc\xccK\xbb\xb5\xfb\xb6B{\xb4M\ +\x91\x04\xa8[\xb6\xaa\xab\xbd\xdc\xdb\xbd\xa7p\x0a\x92\xf0\ +^m\xa0\x08\x8a0\xbe\xe5\xcb\xbc\x85\x8b\xbeV\xab\xbe\ +-\x90\xa4N\xa1\x01\xbd\xeb\xbb\xd9\x1b\xbc\xf3\xeb\xbd\xf5\ +{\x0a\xbbpSd\xf5\x00\xfa;\xc1\xfck\xbe\xe7\x0b\ +\xc0@\x1b\xb4&\x00\x17u@\x0ad\x0b\xbf\x94+\xbf\ +\xf3\xdb\xc0\x0e\xbc\x0a\xab \x00Tz1j\xb0\x02\x08\ +\x80\x00\x13\xbc\xbf\x15\xec\xbf\xff\xeb\xbc\xe9\xdb\xaf\x0dP\ +|o\x01\x03\x08\x9c\xc0\xac;\xbc\xef@\xbf$\xbc\x0b\ +&\xbc\x0ah`\x03\x8d +b\xd0\x06-\xdc\xc2/\ +\x0c\xc3\xfd\xeb\xbf\x9e\xfb\xb9\xa0\xbb\x02\xd7\x1a\x17\x03\x00\ +\xc2!\xac\xc0#\x1c\xc4C\x8c\x06h\xa0\x02*p\x00\ +\x05[\x1f\xae\x00\x03\x13@\x04h\xbc\xc4.\xfc\xc2\x15\ +l\xc1\xb3\x8b\xc1@K\x06\x91\xd1\x0a\xbf\xbb\xbaZ\xfc\ +\xc3@\x5c\xbf\xbb \xc4&\xec\xc5*\x80\x01\x80\xcc\x08\ +G\x80\x0e\xd2!\x03\xa3\xc0\x01h\x9c\xc6j\xff\xdc\xc4\ +m,\xc3Q\x5c\xbbw&\x1b\xc5\xc0\xc3=\x8c\xc7\x0c\ +\xdc\xc0|L\xc4_\xfc\xc7\x80\x8c\x01\xf5P\x0f\x1a\xa0\ +\x07\x8f\xe1\x05SP\x05ip\xca\x88\x9c\xc8D\xb0\xc8\ +l\xdc\xc8P\x8c\xc1m \x1d\x18\x90\xc5Z\xdc\xbd\x97\ +\xac\xc7]\xec\xc7\x9d\xec\xc9\x9f\xfc\xc9u\xa0\x08\x03`\ +1KA\x01\x05\xd0\x02\xc8p\xcc\xc8\x80\xca\xa9\xac\xc8\ +K\xcc\xc8\xae|\xc14|\x0bi\x1a\x1d|\xab\xbd\xdb\ +k\xc9$\xec\xc0\x99\xec\xc7\x9c\x0c\xc8\xbd\xec\xcb\xaa\x10\ +\xce\xc0\x80\x00\x00p\x04/0D\xff \x0b\x19\xf8\x0f\ +\xcd\xe0s\x1b@\x02#\x00\x0f\x8fp\x00\x0aP\xcf\x8c\ +\x80\xcc\xc9\x8c\xca\xaa\xbc\xca\xacL\xc1\xe4\xab\xbc2<\ +\xc3\x86\xdb9\xf4\xf1\x03\x95{\xc7\xb6\x9c\xcd\xdb\xac\xcb\ +\x9d\xfc\xcd\xe0\x1c\xce\xdf\x10\xd1\xac\xc0\x0a\x11P\xd1\x11\ +\x80\x0a\xa8\xc0\x0d\xdcP\x0c\x02 \x00\x96\x80\x05 \x8d\ +\x05\xf5\xac\x00\xf7\x8c\xcf\xca\xac\xcaj\xbc\xc6\xfe\xfc\xcf\ +n\xfc\xc6kK\xc0\xf5!\x03v\x8c\xd0y\xff\x8c\xcb\ +\xb9\x0c\xc6\xbb\xec\xd0u\x10\xce\xaa\x00\x0c\x12=\xd1\x16\ +}\xd1\x19\xbd\xd1\x1d\xfd\xd1!=\xd2\x8cP\xd2\xc7|\ +\xcai\xb0\xcc\xcc\xcc\xc4\xad\xcc\xd2\x01\xbd\xb6\xc6[!\ +\xd6\xec\xc3\x09\x1d\xc4\x0b\xfd\xc5\xbb\xcc\xcb\xbd\xbc\xd3\xe2\ +\xfc\xd3\x14m\xd1\x18\xad\xd1\x1c\xed\xd1!\x0d\xd2Hm\ +\xd2'\x9d\xc8)\xad\xd2\xfa;\xbeR\xed\xc8\xa2,'\ +G@\xd3\xb7l\xd3\x9a\xbc\xc99\xad\xd3<\xed\xd3\xdf\ +0\xd1c]\xd1eM\xd4\x1em\xd4jm\xcf\xf8\x9c\ +\xcf\x1c\xe0\xd4\xfc\xdc\xcc\xce<\xd7\xcc[\xd7\x93\x22\x03\ +\x96\x8b\xd55\xad\xd7\x9a\x8c\xd3}\xfd\xd5<\xdd\xd3?\ +\xdd\x03A]\xd8g\x8d\xd6Gm\xcfJ\x9d\xcfM\xed\ +\xd8)\x1d\xd9\xe5\xeb\xc6\x22Z/\xf1\xe0\xc3\x96\x9c\xd7\ +{\x9c\xcb|\xdd\xd0~\xcd\xd3\x11\x1d\xd8\xac \xdad\ +=\xd4\xa5\x8d\xd8\x22\x8d\xdal\xbd\xda\xfb\xdc\xda\xae\x0d\ +\xd0\x9c[p;c\x04\xf5\xb0\xc0\xd9\x5c\xc27\xdd\xcd\ +\xde\xbc\xdb\xa0\x1d\xda\xa3-\xdc\x1dm\xda\x89\xff\xad\xd8\ +\xc7\xed\xd8\x8f\x0d\xd5Q]\xbe+ \xab;\xa3\x09X\ +\x90\xd5\x5c\x8c\xdb\x9c\xad\xdb_\x0d\xd6\xd9-\xd8\xc0M\ +\xd8\xdc]\xd4i]\xdc$\xbd\xd8L\xdd\xd8\xc9\xad\xdc\ +\xe5\xcd\xbe\x9e\x95\x03y\xad\xcd\xeem\xdd^\xed\xd9\x7f\ +-\xd6\xf5-\xd4f\xdd\xdd\xc4\xad\xdfI\x1d\xde\xe2\x0d\ +\xe0+M\xae\xef\xc5\x05\xd3\x9d\xc9{\xfd\xde\xd7\xfd\xcd\ +\xf2\xad\x0a\xbd-\xd8A\xed\xe0\x1a\x0d\xe1\xf9\x8d\xd4\xa9\ +\xad\xda\xfe\x8d\xd2\x16\x1e\xd7\xc3\x90c0\x10\x01\x98<\ +\xc4\x1d\x8e\xe0\x0e]\x0fu \xdf\x80\xed\xdb\x83m\xdf\ +\x1a\xcd\x0d(\x9e\xd6#\xbd\xdf\x14\xbe\xcf\xe3M\xde\x8a\ +\xd0\x02\x9a\xd6\x06\x06~\xe0]\x9d\xe3!\xde\xe3\x13\xdd\ +\xe0&.\xe4\xf8M\xe4k}\xdc\xc8\xed\xe2\xfd\x5c\x02\ +\xc9f\x01\xdf`\xe3^\x9c\xdb\xf0\x0d\xe2\x9fM\xe5\xbf\ +]\xe2\x85\x8d\xe5\x87\x9d\xe2\xc6}\xe4\xff\xad\xc6\xa3\xf0\ +\x02\xb1\x96l:\xe0\x0fP\xde\xd9h\xbe\xe0>\xde\xe0\ +\x18=\xd4nn\x09\x11\xae\xe2\xfc\xdd\xdf\xac\xff\xad\xc6\ +\x06\xc0P(\x07\x03\x1cP\xe6\x1e\xfe\xe1\x0a\x1e\xd6\x0c\ +\xbe\xdd\x82\x0e\xe1\x85\xbe\xe5r\xee\xe2\x1a`\x04|g\ +\x0bP\xc0\x0af.\xe9\x93\x9e\xdd\x7fn\xe9A\xde\xdd\ +\xde\xfd\xdd$\xbd\xe2\x88\xee\xd8\x07\xb0\x04\xe3\x07\x06\xde\ +\xd0\xd5\x09^\xeaj\xbe\xe6\xc1}\xe9C~\xdaq\x8e\ +\xccL\xdd\xe5D\xa0\x08\xd1\x00w\xbb\xc7\x07\x05\xc0\x0a\ +g\x1e\xdfi>\xe2@\x8d\xea'\xde\xeb\xbe>\xe1\x87\ +\x8e\xdc\xeb\xb0\x098\x9c\x83P\xc0\x08\xb7\xfe\xd0\x94\xee\ +\xe3?.\xd4\xbc\x9e\xe5Z\x0e\xde\x5c>\x0a\x16P\x8a\ +f,\xe5\xcd^\xe9\xd0\xee\xe6\xab\xce\xea\xd4\x0e\xeci\ +\xe0\x06\x034\x8c{\xd0\x01\xbe<\xe5\xce\xae\xeb\xbb\x9e\ +\xea\xd2.\xef\xa9\xad\x0b\x89\xb0N<\xf9\x0f!`\xae\ +\x9fm\xea\xf4\xcd\xe6m\xae\xea\x84\x0e\xe7\xc6\xdd\x00\x83\ +p\xf0\x091\x025@\x04\x0c_\xe5\x0e?\xeeo^\ +\xee\x07\x10\x0a0m\xf1$\x01\x03\xcaP\x05\xec\xd0\xf0\ +\xef\x0e\xf1\x88\xad\x08\xe5L\x01^@\xf2L#\xf1\x04\ +\x8dP\x04\x99P\x03Up\x0b-\xdc\x0d\x19\x9d\x06\x08\ +\xd0\x01\x1a\x00\x01\x06\x00\x06I@\x01 \x90\xedQ\x16\ +\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\ +\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\ +\x13*Dh+\x80\x97\x0d\x1fH\x9c\xa0\xc0B\xcd\x88\ +))^hdAAL\xbf'(\xf8\xc8ZH\xb2\ +\xa4\xc9\x93(S\xaa,\x88\xcbN\x08bpXT\xb4\ +8b\x84\xc6\x17S0\xfa\x89\x17\xef\x87\x1e=\x16,\ +$IRdI\xb2~\x1b\x12\xac\x5c\xca\xb4\xa9\xd3\x83\ +\xb8\xbc<1\xd2\x08\x06\x8cd\xc9d\xaa\xa1iSc\ +\xce\x14;{\xfe\x0c:\xb4\xc8\xa5D\x89d\xc8\xb0\xd0\ +H\xd3\xd3\xb7p\xe3\x12L`\xac\x9f\x16\x0a\x14\x1a\xe9\ +\xb5\x9auf\xcd\xae8u\xf2\xf4\x09T(\xd1\xb3i\ +e@\x81\xe2\xc4\xc9\x0f\x1f|\xe4J\x9eLR\x1a\x0a\ +bF\x8c0\xd1r7o\xd5\xabY\xb7\xfe\xbd\xf9u\ +\xe7\x0f\xc2d\x0f\xa3\x951\x0fJ\x96\xc6N\x86\x0d\xd3\ +\xd3\x8f\xb2m\xca1\xf8|8\x11L\x8c\x18\xcd\x9c\xf1\ +\xee\x05\xad\x95&i\xc1\xa7\xc7\x1a.\xb2\x9a\xb5\xeb\xc6\ +\xb2\xa3\x13xa\xe5\xb6\xf5\xa6\xaf\x04\x91\x10&\x8c\xb7\ +o\xe0\x9d\x87c\xff-^\xf38\xd8\x9e\xa8\x977_\ +\xfc:\xb6t\x02\x9b6\x0d\x22v\xbd\xbeIW\x97}\ +\x00\xe1~\xe2\xc4w#\xc1y\xc6W_\xa2\x95\x17\xd8\ +y\xc9\x15\xa6Zb\x8b\xc1\x16\xdd0\x04\xc0\xb7\xc9\x11\ +G\x0cc\x84}\x18\x1a\xf4\x0a:\x80\xf4\xd3\x8f\x0f\xfa\ +\xf1\xd7\xdbo\x9b\x85W\xd5x~\x19X\x1az\xca-\ +\xe8\x5c{\x0fB\x18\xdf\x84\x14r\xb2\x89\x18#eX\ +\xdf\x17v\xb8@\x02\x09\x1e~\xb8_w#\x82'\xdc\ +g\x04r\xe5\x15r\xa8\x95\x85\xd8\x8b\xd0\xbd7#\x85\ +Gp\xf2\xc0\x03\x04\xd4\xa6\xe3m\x01<\x01\xc8\x97$\ +\x10\xe3!\x88\xfc\xf9\xf7\x1b\x80&\x0e\x98bW+\xfe\ +\xb0\xc4XN&\xd6\x1a\x8cR\xd2X\xa5\x95W>0\ +Ou[\xca\xe5\x8a1.\xb8\xa0\x04\x98@\x8e9\xa4\ +w$\x06'^hJ\x1eh\xda\x9b\xa91\xc7 c\ +\xee\xc9\x16\xe1\x945\xe6y\xa52\xca\xbc\xd0\xe7[\xbe\ +\xe8\xe6\x89'\x81~\x09H\x98c\xfa \xe2w%\x1e\ +I\x5cE\xa39\xff\xda\x13\xa4\xea1H\xa7\xa5\x12R\ +\xc9\x09\x9e\x9br\xaa\xcc\x11.|\xca\xd4\x9f\x1f|0\ +*\xa9\x83\x9eZ\xa8\x90\xabf\x16\xe0^(6\xda&\ +\xadC=9g\x94\xb8\xc6\xa7\xab\xa6\x0f\xf8\xaa\x0c\x03\ +\x0c\xc4\xa3\x94\xb0(\xbd\xa1\xc9\x13\xc5\x1e2j\xa0\xc9\ +\xa2\xfa\xa1\xaaD\xb2\x9a\xe6U\xe4\xb1\x89\x1c\xb5f\xad\ +vm\xa5\x97\xdaY\xa5\xa6\xde~\x0b\xee&|\x92K\ +\x12\x0e <\xa1p\xb1\xc7\x96\xaal\x90!\xf6'\xef\ +]\xe2\xd5\xbbd\x0a\x83\xe1{\x96Z\x0dV\x0aa\xae\ +\x99\x02\xec+\xb8$\x83A\x81\xc1\x0a\xbd\x82\x02\x08,\ ++\x8c\xae\xb1\xa4\x0a\x0a\xa6\x98\xcc\xc6\xfb\xdb\xb3j\x16\ +x\xf1`-\xe6\xcb\xf1\xad2j\x1br\xaf\x9c\x92\x0c\ +.\x15`\x80\xa1\x07\xca\x07\xd9b\x85&\x9a\xb0\x9c\xf0\ +\xcb\xea\xc6Lh\xaa\xab&\xea\xeax:\x1f\xc83P\ +e\xe9\xfb\x1c\xbf \xff\x9bg\xc0F3\x90t\xd2\xd1\ +,\xc0\xf4@\xd4X\x11\x02\xd4QO\xfdr\xc3\xed\xd2\ +\x1cbw\x13\x0b\xff\xc8\xb5q^\x8b\x056Qbc\ +\xfb\xb1\xd0f\x13-p\xc9k\x83Q\x00\x03\x1b\xbc\x1d\ +\x80\xdc!\xcc\x0du\xcb\x0b\xc3\xec\xf0\x8fX\xdb\x8c\xa6\ +\x80\xf4\xc2j/\xc6\x82\xd7\xaa\x18\xa5\x0f\x96\xcdk\xb7\ +\xde\x1a\xdd\xb8\xe3\x05\x14\x00F\xb0\x06On\x05\xe5\x96\ +K\x9dy\xd5\x9b\x17\x1aq\x918\x87\x0e\xf8W_\x1b\ +\xb6\xb1b\xb7\xf6\xbb\xed\xd9#\x93\x8ct\xe3\xb1G\xef\ +\x03\xb9\x1el\xb0\xc1\xed\xb8_\x8e9\xc31\xb7\xdb\xb9\ +w\xc0m\xad\xd5h\xc4\x97\xae\xda\xcf\x1e\xab.r\xd1\ +\xaeC\x1f}\x01\x99d\x22\xc6\xa7\x1e\x18c\xfd\xf5\xb7\ +WN7\xe6w[\xfd0\xb3\x88j\x15\xb4BC>\ +\x8c\xf0\x8c,>k\x0d\xb6\x9474\xd6\xb1\x0f\x5c\xaf\ +{\x1f\xfc\xe2'\xbf-\x05\xc0\x18\x18\xbc\x1f\xf6\xf4\xa7\ +\xbd\xdd\xad\xcb{53\xd3\xe7\x06\x98\xa2\xc0\xf9\x04\x81\ +\x85#\x9b\xd0V\xd7:\xc6\xadM\x82\x14\xa4\xe0\xf40\ +\x94\x00\x14`0\x83\xd6\xcb\x1f\x07\xeb\x96\xb9u\xb9\xe0\ +j\x1fj\xd6f\xff\x84\xc3\x97\x12\x96\xef\x84B\x91\x14\ +\xf2\x16\x888^\xb5\xd0\x85\xb0\x8b^\x0c\xe3w\x81\x0b\ +\x00\xc2>\xb8@\x81\x16m\x88\xc3\x0drPw\xfd\x93\ +\xd9\xa9\x0ce\xb3!\xe6\x05\x06Z\x00\x84&\x86\xc0\x87\ +7\xf4\xe2\x15\xbc\x10\x08/^\xe1\x08\x0f\xe8\xc0\x0a\x80\ +h\xc4\x12\xd0W\xa7\x06>Qm\xee\x8b]\x1f\xa6X\ +\xc5*\x1a\xe3:\xb9@\xc7\x10\xb6\xc8E\xfb\xe1/{\ +<\x5c\x98\xbaz7&\xfe|G\x0b\xed\x00\x81\x19p\ +\xb1\x14jl\xc0\x08\x16\xe0W\x13\x99\xf7@@\xbe0\ +z\x83\x8ca!\xabX\x00\x1c\xdc\x86\x17\xe9\x18\x82,\ +\x19y\xc3\x1c\xea0wS\xe3\xde\xe6\xc8\xc8\x1b\x17\x88\ +\x83\x93qy\xc3\x07\xa6\x104?\x96\xf2yI{_\ +*)\xb8\xca\x0b\xec\x80\x0b\xca\xa0\x86m\x0c\x81\x0eE\ +\xcer\x8b\xb5|\xe4\x0e\xb7\xa7\xb9Aq\xeeC$\x18\ +\x020o\xe3\x83A,\xcf\x81\x8b3e\x14\x0b\xb0L\ +*\xae\xf2\x99\x5c\xe0\xc2%(\x13\x80\x0cd\xa0\x9a\xb2\ +\x5c$6\xbb\xa8\xff\xc3\xfdIA\x92\xfe\x03\xd2!\xf8\ +\xf0\x05\x0c\xf1B\x13\x16`a)\x03\xc9NB\xbe3\ +\x9e\x10M\x86dp!\x88\x8a\xda\xd3\x9a\xd7l\xa4-\ +)\xd7\xc10\x0e\xea\x03\x1e\x10\x96\x15\x92@\xb4\xf6%\ +\x13\x95\x0e-$DW:\x00\xb7\xc0\x85\x17f\xa8\xa8\ +E\xef\x89\xd1}:\xd2\x8b\x1d\xe5\xde\x07\x22\x83\xb2C\ +\x0c\xa3y\x0c@\xe6:S\xea\xcc\x95Bt\x00\x03(\ +\x00\x0f\xe0B\x0e\x1dxA\xa6\x82\xb8hM\xb5\x98\xcd\ +[\xe6\xd4\x13\xe8\x88\xe3\xdb\xfe\xd1\x88t2\x94\xa8\xf0\ +d)R\x91Z\x84\xb78B\x07h\xf5\xc2SeJ\ +\xd3|\xda\xd4\x96\x95\xcb\xdd?5!\xcd\xad\x0eD\x10\ +2\x80\xe0)c\x07V\xa3ra\xacH\x9d\xc3\x1cf\ +\xc8\x14^,\x00\x078H\xebZg:U\x8d\xe2\xef\ +\x8b \x88\x84]\x0d\x92\x8bd|U\x95\x85\x0c\xebQ\ +\x01+\xd8P\x5c\xc0)\x01@,b\xd1\xeaT\xa8^\ +\xd4\xadT\xe5\xa7\xfeB\x10\x80\xc9\x22\xe4\x03j{_\ +_\x8d\xca\xd99\xff\x84\xe2\xb6\xa1\xb0\x00S\x82\xb0\x80\ +\xc3\x8a6\xb1N]\xacT3ZU\xb9m@\x1a\xae\ +M\xc8\x02\xa2!E\xccVQ\xb3\x7f\xad-nq\xfb\ +\x84\x95\xc0\x82\x06\xbd\xed\xedoI\xbb\xd8\xa8\xe2\xf3\x9a\ +U\x1d\xc2+\x92\xab\x10\x1e$b\x82\xccT)m9\ +;\xdd\xe92 \x10*\x91\x05\x1f\xf8\x90]\xdf\x8aV\ +\xb1l\xbd'jk)\x08\xf2\x92\xc4\x16Ip.t\ +\xa3\x1bX\xdb\xb67\x14&H\xf0\x85P\xf2\x05r\xcc\ +w\xbe\xf5\xddnZ\xf3;U\x0cz\xa1\xa0\xfe]\x88\ ++\xf4\xe0\xce\xa2\x8au\xac\x06>p\x82\x13<\x80\x94\ +P\x83\x06\x0f\x86p\x84\xef[Z\xb6NU\x10\x18\xce\ +\xb0\x86\x93\x90\xd9\xf5\x16\xf8\xc0\x08\x1eq\x82g \xd1\ +\x93\x90\x83\x1c4@q\x8aW<\xda\xe0\xba\xd8\x9a\xfd\ +\x95\xb1I\xa4\x91\x05\x0fo6\xb08\xd6\xf1\x8eg0\ +\x83P\x9cD\x16?\xfeq\x90SL\xdf\xecJX\xb8\ +\xf7\x14D-\x94\x8c\x92i|x\x00\x9d\x15\xb1\x8e\xa9\ +<\x835\xb8Y\xff\x0d%\xf9\x82\x07\xe6\x9ce \x0b\ +Y\xc5\xdae1\x98sAf\x94\xe8 \x13\xf1d\xaf\ +\x9aG\xccf7\x1b:\x14\x8e \x09.\xe6\xcc\xe8:\ +\xdf\x19\xcf\xf6\x05\xeeZ\xeb\xda\xe7\x93\xb8\x80\xc0h\x1e\ +\xf4\x94\xdbl\xe8N3a!\xbe\x08@\x00\x18\xdd\xe8\ +,?\xba\xcby\x96tH+\x9d\x92\x17@Y\xd3&\ +\xa0r\xa7gm\x80\xcf*\xc4\x15\xa2\x165\xa9\xe9l\ +j.{Y\xb4\x86\x881\xabO\xf2\x80\x10\xe3V\xca\ +\xb2\x9e\xb5\xa1\x0d\xc0l\x03|@!\xd4\xc8u\xaew\ +\xed\x01G\x0f\xf9\xd7|\x1evJ\x86\xd0^dsZ\ +\xd9khv\xb3\xa1\x90\x10^\xbc\xe1\xdc\xd2\xd6\xf5\xae\ +\xad\xfd\xe0\xec\xbeA\xdb+\x19\xc1\xb1\x09\xfdmZ\x8b\ +\xfb\xde4@H\x13\xce\xcd\xeft\xab\xbb\xd4Z\xe6\xb2\ +\xb0\xe1}\x92>\xac\xb9\xde\x9d\xbe\xb7\xc2k\x10\x05\x84\ +P\x83\xdf\x10\x7f\x83\xbf\xd7\xade!#\x97\xe0*!\ +\xc1\x94\xc1\x1dn\x857\xbb\x06 \xafA\x01\x0e\xc2\x8b\ +\x04$\x80\x07<\xff\x888\xba\xd3Mq \x07`\x16\ +\x18W\xc9\x17\x1e\x80\xf0e{\xdc\x00!\xcfy\x0d\x92\ +L\x90&\x98\xfc\xe7(W\xb9\xc4Y^\xeaf\xc4|\ +%O\x00\xf7\xcdq\xae\xf3\x9c\xf7\x98 \xb2\xf8\xb9\xd4\ +O.\xf4\x89\xcf\xf9\xddG_\xc9\x03l\xee\xf1\xa67\ +\xbd\x04`(\xc8\x17\xa8Av\xb2O\xdd\xe4)W9\ +\xcb\x8d\x9eu\x95\x00\xa2\xe3\x0b\xf7z\xceK@w\xba\ +\x17\xe4\x15e\xcf;5\xceN\xf5\x88\xe7\xfa\x0d\xbeh\ +\xfbJ\xb8\x10w\xb9\xd7\xa0\xee\x88/\x81\x96\x04\xd2\x04\ +G\xe8]\xef|O;\xc4\xc7)x\x94\xc0\xe0\xe3\x86\ +O|\xdd)\xc1yJ\xe8v \xb8\x90\x85\xe8\x1d\xff\ +\xf8\xb2G\x9e\xdfZ\xad\xf7\x8f\xffy\xb6\ +\x7f\x8f\x92\x13\x84\xfc\xf5\xc4\xa7\xc4\xf1\xb7o|\xda\x05\ +\x02\x17\xe0\x07?\xff\xf3\x9b\xef|Y@?\xef\x03\xa7\ +>I<0|\xe2s\xff\xfd\xc6\x1f\x81@\x9a\x11\xfe\ +\xfa\x87\x7f\xfc\xe57\x7f\xd9{\xa1~\x95\x80\xa1\x04\xd9\ +\x07\x7f\x02h|\xe3 \x10A`\x7f\x08x\x7f\xe4\xe7\ +|l\xd7\x7f'\xa1\x06\xc57\x80\xf0\xe7\x00\x14\xe8\x00\ +k\xf0\x0f\xb0`\x0b\x1a\xa8\x81\xd2 \x0d\x09\x88\x80\xf8\ +'\x0b\xa9\xe7\x80%\xf1\x04\x12\xc8}\x15\x98\x82\x15\xf8\ +\x0f_\xb0\x81.\xe8\x82\x1e\xf8\x81\xf7\x07\x0b$x\x12\ +<0\x80*\x98\x83\x0e@\x0b\x1c\xdcE\xffm\xd4\xa8\x9d\xd4\x8c\xcd\xd4\xc9\xdd\ +\xda\x91\xfd\xdaS\xed\xdcx\x0d\xdd4-\xdd\xd5|\xc6\ +~m\xdd\xb70\xaa[%\x0a\xc0]\xdaz\xbc\xc7\x8a\ +\x8d\xd4J}\xdcn\xfd\xd6\xcb\x8d\xdeu]\xd5\xeb\x8d\ +\xd9\xee\xbd\xd5\xf1=\x0ampH\xae\xd5\x00\xdd]\xda\ +\xe7\x8c\xce\xc4\xcd\x0a\xc6\xdd\xd8o\x0d\xd9Q=\xd7\xcd\ +\xad\xde\xb3\x1d\xdd\x06\xad\xd9\xf0\xed\xd75\x90a\x99p\ +\xd8\xa6=\xdc\xe1\xdd\xdf\xfe\xcd\xda\x96\x80\xe1\xcc\x9d\xde\ +\x1c~\xd5\x06n\xd0\xd3M\xdd\x0aM\x06J\xd6\x08\x96\ +\xe0\xddE\x8d\xd1\x12\x9e\xe2\xe3\xbd\xda\x00\x1e\xe0\x1a\x0e\ +\xe3/\xfd\xdc\xec]\xd0\x1f^\xe3\x89\xec\xc2\xba \x0c\ +}F\x9f\x10\x0e\xde\xe1M\xe1\xe3\xfd\xd1 =\xe4\xae\ +]\xe40.\xdb\x1d\x0e\xcdJ\xae\xd5\xd6|\xcdk@\ +\x0e\xc3\xa6\x07\xa8p\xd1(\xae\xce\xe2}\xe5\xc8\xad\xe5\ +\xe7\xcd\xe5\x03\xee\xe52\xee\xe1K\xfe\xdeg\xdc\x02`\ +\xadmq\xf0\xddk\x8e\xd4m\xbe\xd4\x16\x0e\xe7\x19\xce\ +\x08\xb0M\xd5G\xff^\xe03.\xe6g\x1c\xc91\xd7\ +\x08\x08\x90\xdf\xfa=\xe1*\xee\xceBN\xe8/n\xe4\ +t\xce\xde\xed}\xe7\x88\xdc\x06\x1c\xdav\x89P\x0ck\ +\xce\xe6\x95\xbe\xda\xacm\xdeqn\xe8S\x8d\xe8\x9b>\ +\xd3\x9dN\xe3e\xdc\x02\xf1\xd0\x80\x82\xe7\x01\x0c\x80\x0a\ +\x9c<\xe1\x81.\xe8X^\xde-\x0e\xd5\x85~\xe8\x95\ +\x8d\xe4\xb0\xde\xe9\x86\x5c\x0a\x070\x0f5\x08\x06\xdc\xa0\ +\xd1\xa6^\xe1\x8d\x0d\xec\x18\x9e\xe1s\xdd\xea\xc5\xbe\xde\ +\x9c\xae\xe4\x8a0\x0aY`\x88\x89@\x04l\xde\xebl\ +}\xe9\x8f]\xedr}\xedF\x9e\xe8\x97m\xe0\xd0\xf0\ +\x03\xc8(\xc6\xfc-\xed\xe6>\xd2\xe8.\xd9\xad\xee\xea\ +\xc6\x0e\xeb\x8a@\x09F\x00\xc6\xb5\x88\x0eY0\x0a\xc6\ +\xbd\xe2\xa9^\xed\xd6~\xe8\xfa\xae\xed\xd1\xdc\x00\xd3Y\ +\x97\xff0\x0cr \xe8\xa8\xee\xd4\xaa\x1e\xe7\xea\xae\xe9\ +HN\x04\xee\x90\x08\x91\x03\xf1\x07\xb1\x06\xeb\xb0\xda\xe5\ +}\xf1\x09O\xec\x1c\x0e\x0a\x5c\xe0\xbf \x9f\x10\x8d\xf0\ +\x00\xa8l\xf1\x082\x9f\xee\xac\x0e\xe3\x07\xf0\x08\xd1\xa0\ +\x05:\xd0\xf2KA\x03 @\x01I\x00\x06k\x00\x09\ +\x0d\x80\x08\x1d \x09(\xad\x08-\xdc\x00n\x10\x0a\x0c\ +\xa0\x07Z\xe0\xb9}\x16\x10\x00!\xf9\x04\x05\x03\x00\xff\ +\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\ +\x1cH\xb0\xa0\xc1\x83\x08\x13*D\x98\xeb\x0d\x9f!V\ +\x9e\xb8\xf0!\x86\x89\x16\x180\x1aQh$F\x18\xa0\ +CV\x04y\x90\xb6\xb0\xa4\xc9\x93(S\xaa\x5cY\xd0\ +\x16\x0d\x14R|\x04\x13#\xc6\x88E-\x1466\xc2\ +\x98,\x19\x0b\x16j\xd4\x8c\x18\xfa\xe2\x85\x1a1\x87\x86\ +Pc\xc9\xb4\xa9\xd3\xa7\x07\x9b\xf1\xb1\xa2\xc4\x07\x10a\ +\xc2N\xcc\xacy3g\xa3\x9d0z\xfe\x0c:tD\ +\xd1)SR\xa4\x887\xe2\x84\xb1\xa5P\xe3\xca\x9d+\ +P\x96 )$\x88\xf5\xeb\xe7\xc3\x07V\xad4mj\ +\xc1\xa9\x93\xa7O\xa0e\xcd\xbe@\xab6^\xbc\x1f?\ +\xf4\xa8q\xe1\x81\xae\xe5\xcb%m\xe9\x00\xa1\x04\x10 \ +\x12$\xf6\xf6\xfd{\x22p\xd7\xc2a\x0f\x0b%z6\ +\xed\xda\xc7K\xf4\xe8\xb1`\xe1\x85\x8b7\x98s_\xfe\ +\x12`\x83'O.\x5cx\x06\xbd\x97\xef\xd5\x13\xa5k\ +\x1a\x19\xec\x15\xacX\xc4\xac\x17\xa7\xf5\xe38\xf2l\xda\ +I\x8a\x14IfL\xb7w\xa7\xb5\x0ci\xff\xfa\xf0\xe1\ +w\xf0\xce\x9f\xf5\x1a\xff\xbbu9\xe1\xaf\x86\x81\xaeV\ +,=\x05u\xc8\xb2\xb1g\xbf\x94(\x91\x05\x17$}\ +'`I\xaf\xe0\xa0\xc9\x13O\x90\xf7\x1bp\xe8\xe5%\ +\xdaUY\xb5gQs\xf1\x91\xc5\x1ac\xaf\xfd\x10\xdb\ +uI\xec\xd7\x9f\x0c2$\x22\x8c,\x03\x96XP-\ +\x0b`\x02\x02\x08\x08&x\x88y\xc2}\x16\x1a_~\ +Eh\xda{\xce\xf9d\xa1b\x18V\xb7!v\xda}\ +(\xc3\ +\x96h\x99\x8b\xb6\x0aE\x9bN\xc8K\xaf\xbd\x9b\x1cA\ +\xc6\x06\xf9\x9e\xe4\x01\x0a \xfb\xbb\xad\xae\x01\xf7*%\ +\x9fU\xcax0`51\xb7\xd1\xc2\xf35\xaca\xb3\ +\x8b\x82\x08o\xb4\xf3\xd6k\xef\x11<3\xd1\xb1B\xbc\ +\x981\xc4\x10!\x8b\x0cp\xc9\x03O\x99\xf2g+\x07\ +\xea\xb2sc\x81Y\xdf\x984\x0b\xb9&\xc5\x16\xeb\x9c\ +1\xcfGp\x92\xc2\xcf\x07\xb9\xe2\xc5\xd0D\x17\xad-\ +\xc9\xde\xe6\xa9t\x8c\x0e\xf2\xf5\xd7\x8d\x0a\x87\x155\xaa\ +\xecr\x18\xf1\xb38\x0f\xa35\xd7]?\xff\xf0\x80\x0c\ +|\x80=\x10.\x82d\x80\x0e\xd9 \xa3`4\xa6\x9a\ +:\x99\xf4\xaf)\x13\xe7\xb6\x8d\x82\xc5\xad\x9a\xd4\xae9\ +\x9c\x9f\x99VO\x8c\xf3\xc5;\xf3\xcc\x89\xdf~\x13\x80\ +\x82\xe0\xd4\x08R\xb8\xe1\x88\x17\xfd/\xe3i\xfb*\xae\ +\xca\xeb\x11;\xe1\xcbrC\xc7\xa3\x983\x03\x89&\xde\ +\x15K\xbb\xb7\xe8\xa3\x93\xee\xf7\x07?S\xe3\x85\xea\x85\ +\xa3s\xf8\xd0f\x8f\x0c\xbb\xe3j\xbf\x18\x9c\xc1Y\xda\ +~n\xee\xea2F\xb5\xef\x12c-|\xe8\xa2\x1b\xff\ +\x802\xe8\x93\x90o\x02:,\xcf\xbc\xe1\xcf'\xbe\xf8\ +\xae\xd4\xcb\xde\xa7\x83\xa3io\xf9\xdca~\xcfy\x9a\ +7\x0b^\xce\xc8\xd77\xe3\xa1\xef\x80@\xa8U\x02p\ +\xa0\x83\xf61\xafy\xadS\x9c\xb6\x8eV\xbf\x04\xcdN\ +r\xc3\xa2IW\xa0\x06\x9d\xfe\xe1\x07|j\xf2\x9c\x00\ +\xf5\x861\xae\x15\x8ft\x07< \x03\x84\x11'G\xe0\ +\xe0\x85\x0dt\xdf\xea\x9eW\xb6~\x9d\x8d~&S\xd0\ +\xf5\x9869\xa7\x0d\x0a]\x16:Kc\xffz\x071\ +\xfe\xa8)^\xe3\xdbZ\xd7N\xe8\xb7\x14*\x83\x01P\ +T_\x89\xb4\xb1\x80\x05\xbc\x90\x81\x0eT]\x06X\x07\ +=\x09\xbe\x0e\x87\xdfR\x9a\x95\xf4\x92\xbd\xc0p\x09\x88\ +\xdd\xe3\xdd\xe6\xdc\x05@\xcfe\x8d\x80L<_\x0a\xa1\ +HGO\x0c(\x17U\xac\xe2\x15c\xf8>.\xca\xef\ +\x86H\xab\xde\xfd\xc8\x08\x04b\x80\x00\x05:\xf0@\x02\ +pQ\x8b\x82\xe0\xe2\x0d\x0b@\xc1\x13\x84\xa1\x06v\x81\ +P\x06\x8e\xb2X\x09\xcbg\xc09\xd2\x91\x01T\x00\xc3\ +\xe9\xbc\xf3\x0a\x1a\xf0!\x8fV\x84a\x16\x9b\x17?\xd7\ +Q\xf0IQR\x9ag8\x13\x95{\ +\x5c%\xfc\xba8\xbf\xd8Y\xd0\x13!X\x80-\xe8\x92\ +\x00M\xb0 \x09F\xc4$\x12\xe7E\xbe8\x12\xf3\x93\ +\xa1<&\x18\x86\x91\x1b_\xbc\xc1\x94\xceT\xa2\x13\xa5\xe7\xfbZ\xb9\xb8:m\xe0\x0d\xbe\ +\xa8\x951~\xa0I%2\xf1\x9ct4)\x18PJ\ +\xd4\x10\xcc%\x06\x01\xf0\x80R]\x0a\xd3yVT\x8b\ +~\xf4b\xae6\x10\x80\x9f}\xe1\x09\xe7\xd0[0\x0b\ +jP\xf4\x15S\xa8D%\xea4h\x15\x97\x04$U\ +\xa9-}i\ +\xf7\x02\xe8\xd5\x04K|A\x0d\x1ePW\xb7\xbc\xedm\ +Z\x9b\x9aJ\xed\x1a\x82\x17\xdeUH\x02\x92\xe0\xda\xf1\ +6\xf7\xb2\xcf\xe5+z\xd1\xbb\x89W\xac\xa4\x19\x09H\ +\xf0{\xe1\xfb\xd9\xeb\x16\x16\xb8{\x94Gj\xf3\xbb\x90\ +\x1fP\x16\x8a\x09=\xa6s\x03<\xe0\x01\xef\x80\x85)\ +\x81E\x82G\xec\xde\xf7\xc6\x17\xad\xa2\x850\x0e8J\ +\xe1\x92\xc4\x03\xa1\xe4\x05\xf0y;\x8c\xde\x1dp!\x13\ +*i\x065\xa81\xe2\x04\x97\xb8\xba\x0dF\xf1\x83\xe5\ +\xe9\x01X\xb4\xf8$z0\xe6\x7fQ\x1a\xe0L\xd0\xf8\ +\x026\xe6\x82\x94Uz\x92/\xec\xf8\xca=N\xc0\x8f\ +w\x0bZ\xdfJ\x94\x1c\x13>\xb2I\x12\x11c\xd9r\ +\x98\xc6Q\x96\xb2\x943A\xd6\x92<\xe3\xff\xcap\xee\ +\xf1\x96\xb9\xdc[\x97\xf2\x81\x1c\xf8\x15\xf3I\xa81\x0c\ +\x0d\xcb\x98\xb6hN\xb3\x9a\xa5\x0c\x03\x93\xc0B\x16\x88\ +\x863\x96Il\xe2 \xfb\xd6\xc0zF\x09\x0e\x18\x10\ +\xd63wX\xd0\x83\xe6\xc2\x00.@\xa2\x85\x04\x02\xd1\ +\xa0V\xf4\x8e\xe5\xdc\xe8.\x07(\xd2(9\x04J\xcd\ +\x9bY4gz\xd0\x03\x88\xf5\x00\xc4\xb0\x90Y\xe0\xa2\ +\x17\xbd\x00u\xa2\x15\x9d\xe5R'\xb5\xb8\xa8F\x89\x1a\ +X\xed\xe4K\xbfZ\xcd\xb2\x965\x03\x16\xc2\x0b\x5c8\ +\x1b\xd7\xb9\x0e5\xaf\x19\x0d\xe47\x189\xd8)iF\ +4\x00m\xecc'[\xd6s\x98\xc3\x13\x14\xd2\x0cg\ +\x9b\xfb\xd6\xd1\xdeu\x9c\xa9\xad[Hc;%\xe8\x10\ +p\xb7_\xfd\xed\x01\x84{\x0e\xa1\x08E\x11\x12\x02\x0b\ +[H\xe3\xdc\xe6\xc6\xb5\xae\x1d1m\x05\xbf\xa1\xb1\xef\ +^\x09\x0b\xe6\x0d\xebz\x87;\xdf\x10\x0f\x059\x10R\ +\x0b[X\xfc\xdf\x00G\xf7\xc0\x0b\x9e\x80k'<%\ +\xd2`\x00\x94\xbd\xedp|G\x1c\xe2Z\xff@\x88+\ +,\xcer\x7fg\x5c\xe0\xa0&x\x9c]\xf1q\x96\xb8\ +\x00\xd3\x9a.\xf9\xc9O\xfe\x80\x83|\xa1\x19@oF\ +\xcb-\x9eq\x8d#Z\xe6\xd4\xe8t\xcdW\x12\x8d\x86\ +'\xfb\xe1;\x8f\xb8\x09\xa6\xae\x03\x83\xf0\x22\x17X\x0f\ +\xba\xd0[\x8e\xf1s\xc3\x5c\x16\x04o\xe4\xd2W\x02\x02\ +)\xeb<\xea\xf9\x9e\xba\xdaM@e\x82\xbc\xc2\x15p\ +\xc7z.\x82>t[\xbc<\xda\x08\x1f\xfbJ\x08\xf0\ +m\xa8G}\xed\x80\xef9A`\x01\xf7\xc2\xc7=\xeb\ +@\x1fz\xd7\x03\xeen\xbd\xa7\xc4\x13\xb1\xf6\xfb\xce\x01\ +\xbf\xf6\x19X~\x06\xb7\x15\xc8\x17^\xf1v\xc3\x17^\ +\xeeto9\xc0g\xe1x\x96\x80\xc1\xe4\x7f\xa7\xbc\x09\ +.?\x835\xb8~\xb3\xff\xe0\x05\xe7g\x1f\x08\xcf\x1f\ +~\xee\x89g\xf9\xbf\xafQz\x96P \xf5\x94g\xbd\ +\xeb\x87\xbf\x86\xe8\x0e\xa4\x16\xb5\x98\xbd\xf2;\xefy\xd0\ +\xe7\xde\x16\x1e\xef=J\xc8!u\xd5_\x9e\xf8\xd8_\ +\x03\x8e\x05\xe2\x0b\xe4{?\xf9\xcb\x7fE\xff\xed\x9b\x8f\ +x\x9aK\x7f%d\xb0\xfe\xf5\xb3\xcf\xfe\x81|\x81\x17\ +\xf0\xff\xbe\xf7\xc3\xcf\xfc\xcf\xe7\x22\xcf\xe7O\x09\x10*\ +oy\xf6\xfb\xdf\x00\x00hG\xff\xf0~\xf0W\x80\xf1\ +'\x7f\xe17~p\x17}\xf9g\x12\x01\xb0z\xfd\xe7\ +\x7f\xd8\x07\x80\x14\x08\x80, \x101`\x80\x1aX\x80\ +\xf2\x07~\xcb\xd7\x80+\xa1\x0c\x12H|\x15X\x82\x00\ +(\x03\x18\xb8\x81*\xc8\x81\x08\xf8\x0a\xf8\x07\x82'\xc1\ +\x02\xffg\x824\x08\x80\x5c\xf0\x0f\xb3\xf0\x05:\xf8\x05\ +1\xd0\x83+\xa8\x82\xde\xc7\x800\xb8\x10 @\x825\ +x\x84\x06P\x035\x90\x00\xbe\xb0\x83N\xb8\x83>\xf8\ +\x83\x05HzCx\x12\x09\x80\x844\xa8\x84Z\xa8\x85\ +8\x08\x0b^\xf8\x84`\xa8\x83Q\xa8\x81U\x98\x12\x17\ +\x80\x84[\x98\x86ix\x08^\xd8\x86n\xf8\x85a\xe8\ +\x84=\x18feX\x12\x97P\x81j\x98\x87y\xa8\x05\ +\xbe\xd0\x87\xbe\xf0\x86\x80\xd8\x86a(\x84u\x88\x10\xc9\ +\xa0\x87\x88\x98\x87/0\x0b\x8c\xd8\x88~\xff\xf8\x88\x81\ +\xf8\x869U\x88%\xd1\x0f\x89\x98\x86%\x90\x89\x9a\xa8\ +\x89\x16\xd0\x88\x9e\xf8\x89\x9e\xf8\x88}\xd8\x86TH\x89\ +\x0aa\x05j\xb8\x89\xaa\xb8\x8a\x9a\x18\x0dDp\x03\xb0\ +\x18\x8b\xb2x\x03\xa0X\x8b\xa5h\x8a\x08\xa1\x03\xac\xb8\ +\x8b\x99H\x09\xbe\xf8\x8b\x94\x00\x06\x110\x8b\xc4X\x8c\ +\xc4x\x8b\xb8x\x10\x9b\x08\x8c\xcc\xd8\x8c\xcc\xc8\x05\x18\ +`\x8c\xd2X\x8c\xc0\x96\x8c-\xe1\x8c\xc0\xf8\x08\xda\xb8\ +\x8d\xdc\xb8\x8d&\x80\x06\xd3\x18\x8e\xb1\x98w\xd6h\x10\ +\xddx\x8e\xe8x\x8ek \x8e\xecX\x8e\x09\x91\x8e\xf0\ +\x98\x8e\xa90\x8f\xf4X\x8f\xf6x\x8f\xf5\xe8\x8e\x08\x11\ +\x8f\xfc\xc8\x8d*\x80\x8f\x00\x19\x90\xe4\xa8\x8f\x02\xe1\x00\ +\x06y\x90\x08\x99\x90\x0ay\x90\x06P\x0f\x01\xf9\x90\xf6\ +X\x8d\xfah\x0b\x0bY\x91\x16\xb9\x06\xa8\x00\x91\xf7h\ +\x0a\x1c\xd9\x91\xa6\x80\x03\x04Y\x10\xb40\x92$Y\x92\ +&y\x92$\x19\x0a\x08\xe0\x91,\xd9\x92.\xc9\x91F\ +\x15\x92\x02\xa1\x03nP\x936Y\x93(\xff\x99\x93\xb4\ +\xd0\x07\xb7\xf0\x92>\xe9\x92\xc1 \x93\x02\x11\x027Y\ +\x94Fy\x94n@\x0b\x9b\x00\x09?\xd9\x94\x1di|\ +2)\x0cH9\x95G\x99\x083\xe0\x94,\xf9\x0bZ\ +\xb9\x95\xa4P\x00B\xf9\x0f#\x00\x00b\x09\x00TI\ +\x95)0\x0c>\xb9\x95jI\x0al\xd9\x96l9\x01\ +_\x99\x05[0\x96tI\x97e\xe9\x06\x8d\xa0\x06\xa6\ +\xa0\x96\x5c\xe9\x96~\xf9\x97\xa8\xf0\x95k\xb0\x05\x84Y\ +\x98\x84Y\x97\x88I\x966\xa9\x04\x9e\xf0\x0b\x7f\xf9\x98\ +\x90\xd9\x96_\x09\x09\x94i\x98\x96Y\x98\x899\x96\xa7\ +\x13\x99\x9c\xe9\x97\x84 \x94\x1f@\x99\xa29\x9a\x97y\ +\x99t)\x10\xaa\xd0\x99\x8fI\x08\xac\xd9\x9a\x17 \x93\ +S0\x9a\xb2)\x9b\xa5Y\x985 \x10\x0d\xa0\x9a\xa4\ +\xd0\x9a\xbcI\x08\x15\xf0\x9b\x08 \x93\x03\x00\x01\xc49\ +\x9b\xc6)\x9a\x96y\x06\x02q\x01\x91\xd9\x9b\xad\xf9\x9b\ +\xd0\x09\x9d!I\x0e\xc4Y\x9d\xc5y\x9c\xd8\x89/\x02\ +\xe1\x96\xce\xf9\x9c\xd1\xf9\x9d\xbf\x99\x04\x04\xff\xa9\x05\xd6\ +Y\x9e\xd7\x89\x9d\xa2\xb9Y\xdd\xc9\x9a\xe0\xd9\x9e\xd0\xd9\ +\x02\x04Y\x00U0\x9f\xe6i\x9e\xe89q\x02\xc1\x0d\ +\xbc\xe9\x9e\xfc\x19\x9d\x049\x9f\x00J\x9f\xf5Y\x9e\xb2\ +y\x9b\x03\x01\x00\xfd\x99\xa0\xd0)\x02\xca\xe0\x8e/\x10\ +\xa0\x10Z\x05\x03j\x9f\xe7@\x10)\xa0\xa0\xfc)\x02\ +\x1a*\x02\x02`~\xc9\xe8\x00\x12 \x01\x11\x0a\xa1\x13\ +Z\x9d'@\x10f\x80\xa1\xe0\xb9\xa1,\xaa\x9d\xb8(\ +\x0c!\x1a\xa3\x22:\xa2\x00:\xa1\x06\xa1\x08*Z\x01\ +,\xba\xa3\x22P\x0a\xd6\xb8\x062*\xa34\x1a\xa0\xe5\ +9\x07\x06\xc1\x00\x0a\xca\xa3<\xfa\x0e\xefPh\xa6\x08\ +\x08\xee\x10\xa5A*\xa4C*\xa0#`\x10\x9a\xd0\x9f\ +J\xca\xa2L\xca\xa4\xb1p\x0f\xb8\xb8\x06Q:\xa6\xcb\ +0\xa51Z\xa5U\x80\x10\x1c\xb0\xa2[\xba\xa1]\xfa\ +\x0e\xb1\x10\xa7\xb1\xf05\x85h\x04\x130\xa6xZ\xa6\ +f:\xa3\x11\xba\x06\x08\xc1\x09\x0b\xda\xa6n\xda\xa5r\ +\x1a\xa7\xa7\xc0\x0d\x94\xb8\x05\x13\xb0\xa8x\xff\x8a\xa7{\ +\x1a\xa2\x10z\xa5\x08\xa1\xa3\x82\xaa\xa1oZ\xa8\xb1p\ +\x0a\x9az\x0a\xa1P\x87I\xb0\xa8\xa0z\xa7\x8d*\xa5\ +\x8f\x0a\xa0\x0a\xd1\x00\x95z\xa9\x85\xba\xa9\xacZ\x86V\ +\xd0\x06m\x10\xaa\xa0:\xaa\xa4\xba\xa7\xcb\x96\x10,\xd0\ +\xa6\xaa*\xa7\xac\xba\xa9\xbb\xb0\x0b\xc19\x84\xe1\x00\xab\ +\xb0*\xab\x8cJ\xab{\x0a{\x07!\x00;\xfa\xa6p\ +\xba\xaa\xbd\xaa\xa9\xbf\xba\x0a\xab`\x000\x08\x05\xc4J\ +\xac\xc6*\xaa\xb4\xaa\xa7!\xfa\x08%\xe1\x04\x83J\xa8\ +\xd0\x1a\xad\xd3J\xad\xab\x80\x06.*}b\xd0\x00\xee\ +\x9a\xad\xc5j\xac\xb4\x1a\xa5zz\x81%Q\x0f\xce\x8a\ +\xa9\x99\x1a\xad\xa7\xb0\x0b\xe8J\xadh\x80\x06\xaa\x90\x7f\ +(0\x01\xee\xfa\xae\xf0\xba\xad\xdc:\xaaij\x12\x17\ +@\xae\xe5\xda\xab\xe7\x8a\xae\x01\x8b\x06* \x0a Y\ +zo\x00\x09\x07{\xb0\xf0\x1a\xaf\xf2:\xaaPY\x12\ +\x18\xa0\xaf\xfcz\x0a\xcc\xe0\xaf\xffZ\xb1\x16\xab\x02\x18\ +p\x00\xdc\xfb\xad\xe4\xc7\ +\x8d\xdc\x0d\x90@\x91&\x01;n\xdb\xd3]\xe2\xd5-\ +\xdf\xbc=\xe4[.\xda\xa3\x9d\xdfH\x0e\xce\x86m\xdc\ +\x14}\xc5\xdc\x1bl?\x80\x05\xb5\x0d\xcd$~\xd2\x0c\ +\x8e\xe5Z\xfe\xd9]\xcd\xe5\x82=\xe1\xa6\xffM\xd6\x87\ +\x1d\xe66\xcc\xd6\x1f\x87\x03\x900\xe5\xb7\x8d\xdb\xf0\x1d\ +\xdf@>\xdfnN\xe8,.\xe1\x88\xfe\xe5`^\xc7\ +\x03\x108c\x87\x08~\x9e\xe6v}\xd7l\xce\xd9\x99\ +\xfe\xdb\x11\x1e\xe7\xf9M\xe10\x1e\xe3A-\x01'Z\ +z\x97\xa0\x00\x0a^\xe5\xf8\x9c\xcf(\x1e\xe4*\x1e\xd3\ +\x9a\xde\xea\x87\xce\xd3s\xae\xe8\x87}\x0c\xae}~\xca\ +\x80\x05\x93\xae\xe6\x81\x9e\xd7m\xbe\xea\xf6\xcd\xe5\xae\xde\ +\xe9c\xad\xe8s\x0c\x0a\x89P\x85\xca\xa0\x00\xb8m\xe5\ +\xbc\xae\xd9)\xfe\xeb[N\xed\xc3\xae\xdf\xd7n\xd8r\ +0\x0fB\x0c\x83op\x09\x8a\xf0\xde\xbb~\xe2\xa9\x8e\ +\xdd\x0f^\xeep~\xee\xb0\x9e\xe4\x0d\x10\x0fmV\x88\ +\xcd@\x01\x10\xb0\xeb\x96~\xe9\xd1\xae\xd5\xf8n\xe4G\ +^\xec\x88`\x00\xb4\xa6\x8f\x19\x00\x05+\x10\xee\xf5\xae\ +\xe2\x9e\x1d\xecE\xde\xe2\x0b\x0f\xeb\x13`\x01^\xf0\x95\ +\xff`\x05N\xa0\x0b\xe2\xee\xeb\xf4}\xf1\xac\x9e\xf1\x9c\ +\x8e\xe8\x12 ) o\x10\x0b\xa0\x06&L\x80\x08\xd7\ +m\xef\xf7\x8e\xf1\xd4^\xed9\x90\x090 \xea/\xaf\ +\x10^@\x01\x9b\xe0\x06\x1d\x90\xe5'\x0f\xec)\x9f\xf3\ +-P\x03P\xc0\x04\x19\xfb\xf3+1qZ\x90d\xa1\ +\xe0\x06m\xb0\x02\xa3\x80\x083\x8d\x087<\x01\x0e\xc0\ +\x05\x0f\xf0\x03F\xf0n\x01\x01\x00!\xf9\x04\x05\x03\x00\ +\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\ +\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*D\xe8\x8a\x9a\x073\ +w\x8c\x85x\xe2\x02\x10 \x1f@\xfaiT\xe2\x09\x84\ +\x95!\x86\xde\xd8ZH\xb2\xa4\xc9\x93(S\xaa,\xe8\ +*\x80\x19c \x0ey\xf2\xe4B\x89E\x12$4b\ +\x14&\xecD01b\x8c0\xd1\xa2\x85\x82\x18@!\ +\xec\xc8Z\xc9\xb4\xa9\xd3\xa7\x07[\x8a\x0b\x01\xe2\xc9\x93\ +\x0f\x1fd\xd2\xb4\x09\x08\xa7N <}\x02\x15J\x94\ +\x02\x85F\x8d`\xc0\xd0\xe2\x22\x03.\xa8p\xe3\xca\x1d\ +h\x8b\x06\x8a\x10\x9a4\x81\x00!\xc5j\xd6\x99.*\ +v\xcd\xd9og\xcf\x9fA\x87\x16=\x9b\x16F\xb2d\ +,Xh\xd1\x14`\xae\xe5\xcb$]\x91Ca\xc5J\ +\x08\xbcy\xf7\xfa\xfd\x00X\xb0\xd7\xc2`\x0f\x8fUl\ +\x16\xad\xda\xc7\x91\xd5\xa8\x19AA\x135\xcc\xb8/\xc3\ +\xa2\xa6c\x83\xef\xce\x9f\xf3\xea\xadz\x954M\xd3\x84\ +\x0d\x8bM\x5c\x16mZ\xd8,d\x8f\x98>\xe2\x85\x98\ +\x0c\xbcrko\xca+\xc0\x10c\xe0\x7f\x03\xff\x07-\ +\xbax\xe9\x9b\xc9S/'[\xd4\xb5c\xc8\xd1gO\ +\x7fA\x7f\x8a\x1a\x10\xcd\xb6\xeb/\xc9\xcb\x03:\x14\x00\ +\x86'^p\xc3\x8d&S`\xe8}\x15\x16bF\x94\ +\xc5\xd8k\xf0I7\xdf\x0bST\x98\xc2\x14.\xbc\xb5\ +\xdf\x86\x04u\x97\xc1\x10 \x06(\xe0x\xc2\x95\xf7\x17\ +M\x09\xa2\xb6\xe0X\x0e\xba\x07\x9b\x84\x13Z\x98B<\ +\xf1\xa4\x90!\x87\xfb\xc1\x92@:\x19\xa0\x83N\x88\x22\ +\x8a\xe7\x19y\xc4\x9dX\xd3`\x0a\xaafD\x83\x8b\xb9\ +\x18\x9b|\xd5\xd57E\x0a3\xc6\xf3\xc3\x0f\xf1\xa5\xec\xc2\xa2\x1by\xdc\xdas\xcf}\ +?\x9fj\xc2\x1b\xc2'\xbe\xe0u\x8eo\xf2*\x15\xa1\ +\x00\xb7\xb1W\x15HV\x08:\x0d\xfc\xa07\x94\xf9A\ +FB'\xb3\x92\xf5\x22w\xbb\xdc\xf9o\x18\x04 \x00\ +\x00q\xd4\x8c7\x98\x90\x80\xc0\x13\xde\xf0(f\xbcS\ +\x8diU\xa4\x0b\x8ehd\x85\x22\x09*\xa9\x82\xae\xbb\ +\xa0|\xe8d'<\xcd.a\xd7\xb3\x1d\xe5\xff\xb6\xe7\ +\xbf\x10nb\x13\xde\xdb\x90+\x12`\xc2\x13\x12\xd0\x80\ +zC\xe0\xf9\xea\x15\xb8\x9eU\xcb/\x80\xb9\x89F&\ +\x18\x94\xc4\xd1oq1Z\x9b\x06\x7f\xa8?\xec\x0dQ\ +wE$\xc0\x11\x8f\xf8\x81\xfd\xd4\x22\x01p\xe4A\x13\ +Q\x08\xc5\xf2\x15\xefb.\xfcQ\x03K\xa7\x97'h\ +\x02\x05: \xc7\x1bd\xd1\x0c^\xc4` \xbc\xb0\x85\ +C\xbc\xb0\x01O\x18\xe19\xf5\x8bR\xe3~\xf5\xc3s\ +\x051n\x1eL\xe3\x1a7q\x84#`.7\xbc\xa0\ +\x06\x1c\xe38\xc7'\x0a\xcf\x8e[C\x9f\xfa\xa8\xb5\x01\ +\x1d\xbc\xc1\x15L\xc1\x85\x0e\x9e@\x01\x0c\x12,id\ +\x0c\xa2\xe4\x86\xf8A#\xae\xb1\x93Gp\x02\x1fr\x03\ +\x0bYPC\x94\xa3\x94\xa3\x13\x0bH>\xe2\xf5M\x81\ +\xf5\x0aR\x06\x02\x00K\xb9P\xc3\x18b\xa8\xce$}\ +\xa82\xc8\x09\xb1\x7f\x9a\xfc%091\x08\xdc\xcc\x02\ +\x17\xc7<\xe6(\x13\xa0\xcc\x01\x9a\xb2\x99\xe6\xc3\xe3\xce\ +T5\x04\x0fT\x137\xd4\x90\x82\x1a\xee7\xffF\xda\ +]\x92\x97\xe1\xe4$0\x8f\xc0\x09N< \x1e\x98y\ +\x86,\x8c\x99Nd\xb2\xb3\x94)\x14\xde\xe7\xfc\xf6,\ +/$\xe0X\x1bBA2(\x99?]\x9e1\xa0\x03\ +%\xe8\x03F\xfa\x00-X\xa6\x16\xbdX(C\xd3\x99\ +L\x88\xd6q\xa2\xf42\x83,f\xf1)t\xa8!S\ +\x09\xe3 \x142\xb9;_\x0a\xb4\x93\x05%)I7\ + \x17X\xe0\xa2\x17)]hC\x1d\xda\xcew\x1e0\ +\x9e:0\x035|!3+\xc4cS\x0a\xfb&\x11\ +{\xaa\xc6#\x0e4\xa8B}\x802\x86!\x97f\xe0\ +\xe2\xacI\x95\x85#\x1a\xda\xd2e\xbe\x94\x858\x08\xc0\ +\x17\xec\xf6\x8f\x5c\x00\xa1\x8cp\x03(W\xc5\x09T\x83\ +\x86U\x19\x80M\x01\x5cxq\xd6\xc2\x22U\xa5l%\ +\xa5[%J<\x1a\xe4\x82\xae\x04\xc1A\x0a\xde\xa6W\ +\x10v\xf5\xa7\x04\xf5\xabP\x01\xcb\xd9$6\x05\x16\xb6\ +\xb0Ea\xd1\x9a\xd6\xc4\xc2\xd1\xa5\x8c\xe5\x01d\x0d\xe2\ +\x0a#H\x0e\x9c\xdc\xbb\xecW\xc3*V\xce\xffr\x96\ +\x13OqEhC;\xda\xa3\x22\xd6\xb4\xa8\xb5\x1a\x0d\ +\xa4\xb1Z\x84\x84@\x06<\x05!_E\xfaW\xdb\x02\ +\x96\x01\x0c\x98BS\xbe\xd0\x8cf\xecV\xb4\xa3=\xac\ +Z\x81\xbb\xd8\x00\xbc\xa2\xb8\x09\xe1C\x12\xd0\xd8\xd3\xe5\ +j\x96\xa4\xceU\x06t\xd7\x1b\x82\x95\xcc\xc2\x15\xb9\xa8\ +\xaeuw\xdb\xdb\xd2\xb2\xf4\xb4\xcb|\x03x\x17B\x8d\ +\x1f\xc4\x96\xaf`Eoz\xd7\xbb^(\xac\x84\x17\xae\ +\x80o|\xe7\xcb\xdb\xec\xfeV\x9d\xf8\x1d\xe0E\xf7K\ +\x92)(\xd7\xab}m\xaem\x09L`0\xf8 %\ +\xbeH\xb0\x88s\xb1\xe0\xebf7\xa9\xdc\xa5\x06F)\ +\xbc\x90\x17\x00\x98\xb6\x03\xe60\x03\xc0@ceH\xcd\ +$\xbcxE D\xac\xe0\xea\x9a\xd8\xc1J\x85p\x02\ +\xd8\xc5\xe2\x0a\xff\xf4\xbc\xb5\xdd\xb0\x8c\xa9@\xe3&\x9b\ +\xd4$\xbex\x85\x94u\xccc\x12\xfb\x98\xbe\x86}\xf0\ +\x90W\x5c\xe4\x85\xd8\xc2\x02@\xd50ge<\xe3&\ +7\x99\x01'\x89A-\xa6,e\x1e\xf7\x98\xff\xc1'\ +\x0e\xb2#\xe6\xda\xe5\x93\x0c\x02\xc9\xce%\xb3\x99\xf7\x5c\ +\x00\x0a\x94d\x16\xbc\xa8\x85\xa0\xd9\xfc\x0a7\x97\x18\xcb\ +hUjv\xea|\x92\x05lB\xc0J&0\x93\xf7\ +L\xe3\x02X\x9a\x01\xbd \xc9\x17x\xc1iA\xaf\x99\ +\xcdU>4v\x13\xfd]F\xa3\xe4\x09#\xcd3\x87\ +'MiK\xbb\xba\x00@ \x09\xa7g\x1d\xe8A\x83\ +z\xc4\xf1\xfd1.\xf2c\xea\x94\xc0@\xd5\x1d\xa64\ +\x18^\xfdj\xdc*\x04\x16\xb4\xa6\xb5\xa7\x09]\xe5+\ +\x8b\xb6\x09T\xed5Jr\x91\x88\xe7rX\xd8\xc3&\ +\xb6\xa5\xfb\x90\x89L\x80@!_\xf8B\x0c\x92=\xeb\ +eOy\xc7\x09\xb6\xf2|\xe9,m\x94\x08B\xbd\x92\ +\x16\xb6\xb6-\xdd\xedz\xeb!!\xb3\x08\xb7\xbe\xc9\xdd\ +i[K\x19\xdd=.u\xbbS\xd2\x88`\xf3Y\xdb\ +\xdc\xae\xb7\xc2=\x80\x10X\xc0B\xdf\xfa\x1e7\xbf\xfd\ +]\xe8\x11G{\xe0)!@\x99\x0fN\xec\x84+\x5c\ +\xe1bh\xb8\xc3\x1d\x0eqq\xf3\xbb\xd6\xb7\xff^4\ +\xc6Sr\x88V#\xfc\xe3\x1f\xbf\xc0\x05\xf6p\x90Y\ +\xf8b\xe4#/\xb9\xc9\xc9\xed\xef-\xad|%2h\ +\xf2\xbca\xaep\x99\x1b\xfd\x0280\xc8,\x96\xee\x8b\ +\x9b\xe3\xfc\xe1\x10\x97x\xb2\x07\xcd\xee\x9f\xa3$\x04\xd9\ +~\xb5\xc7\x89~\xf4\xa3?\x99 \x1cX\xba\xd8\x9b\xfe\ +t\xa8\xef\x9b\xe7Vg\x8a\x0c\xb4N\xf4nw\xbd\xeb\ +;\x18GAtp\x83\xba\xdf@\xecLwz\xce\xa3\ +Nk.\xa7\xfd$\x1f\xa0w\xdb\xdf~\xf4\x1d\xec\x80\ +\x0b\x88/H<\xec\xcex\xbc\xdb\x5c\xef$\x878\xa7\ +\xff~\xe0\x07\x0c\x9e\xf0\x170<\xe27\xcf\x05\xcf\xfe\ +\x03\x02\x8c\x0f\xfd\xdd\xf1Nv\x9c\xeb\xdb\xef\x947\x09\ +\x13bNx\xc3\x1f\x9e\xf3\x9c\x97\xee@X!\xfa\xda\ +\x8f>\xef\xa6\xa7i\xeaS\xe2\x01\xb7\xb7\xfe\xf5\xb0\x0f\ +\xbe2\x06\x92\x01\xdb\x1b\xff\xf6\x8fw\xf8\xeeWR\x84\ +\xb7k>\xf8\xd0\x1f\x80\xf4+\xf3\x8f\x11\xa4\xe2\xfa\xa9\ +8~\xed\x1d\xbf|\x95\x10\xc3\xe8\xcf\x87>\xff\xe7\xa5\ +O~\xe9?A ;\xc0\xbe\xfa\xaf\xaf\xfd\xc6\xeb\xbe\ +\xfb(\x09\xbf\xf8\xb9P\xfe\xfaK\x1f\x06\x02\xd1\xc0\xfa\ +\xf7\xcf\xfe\xe3\xa7\x01\xfe*\x11\x0d\xf3g\x7f\x048\x07\ +s\x90\x04\x02Q\x0f\xfc\xb7\x80\xfd\x17z\x5c\x00\x80\x04\ +\x07{\x04X\x7f\x06X\x81\xa1\x10\x0a\x99\xf0\x0f|`\ +\x0a\x1c\xc8\x80\x1e\x98}7\x80\x7f\x10x\x12!@\x7f\ +\x13(}\x15h\x80\x17\xb8\x82+\xf8\x0f\x9e\xc0\x810\ +\x18\x83\x1f\xb8~\x0b0\x82(Q\x80\x16\xc8\x82:\xc8\ +\x82\x19\xa0\x061\xf8\x83@\xc8\x80=`\x83(\xc1\x00\ +\x03\x90\x82;\x98\x84;\xf8\x04N\x00\x84N\xf8\x84\xd8\ +\xd7\x06Dx\x12\x16\xa0\x84V\xb8\x83&`\x043\xf0\ +\x84\x5c\xe8\x84\x050\x85&\xd1\x08W\xa8\x83&P\x86\ +fh\x86#\x00\x09\xbf\xb0\x86\xbf\xd0\x85]\xf8\x03`\ +X\x12\x80\x90\x84gX\x87vX\x86?\xa0\x0b\xa4@\ +\x0al\xd8\x87~\xd8\x85\xc1\x10\x87$\xb1\x01wX\x88\ +\x858\x032\x80\x00{\xb8\x88\x8c\xd8\x88~\xff\xe8\x87\ +\x9a \x88\x0b\x81\x03\x86X\x863p\x89\x98\x98\x89\x98\ +\xc8\x09\x02\xd0\x88\x9e\xf8\x89\x9e\xa8\x03\x92\xa8\x10o\xa0\ +\x89\xa68\x03k\x90\x8a\xaa\xb8\x8a\xa9X\x00\xaa\x00\x8a\ +\xb0\xf8\x89\xa3\xb8\x10\xacX\x8b\xb6X\x8b\x5cP\x0f\xb1\ +\xb8\x8b\x8b8\x8b\x0aq\x8b\xc0h\x8b\x5c\xc0\x8b\xc4\xe8\ +\x8b\x09\x11\x8c\xc8\xb8\x8a\x84\xb0\x8c\xcc\xd8\x8c\xce\xf8\x8c\ +\xcdh\x8c\x08a\x00\xd4X\x8d\xd6x\x8d\xd8h\x8d\xf5\ +\x00\x8d\xdc\xd8\x8d\xd2x\x10\xd9\x18\x8e\xe28\x00\xdfP\ +\x01\xe6x\x8e\xe8\x98\x8e\xeax\x8e\x8e\xf0\x8d\x05!\x8e\ +\xf0x\x8d\x5c\x80\x05\xebX\x8f\xf6X\x83\xee(\x10<\ +P\x03\xfc\xd8\x8f\xfc\x18\x8f\xd7\x98\x09\x8a`\x8f\x04\x99\ +\x8eV\x90\x8f\x02\x81\x03\xfe\xb8\x90\x0c\xd9\x90\xfc\xc8\x00\ +\x1aP\x90\x12Y\x01'\x80\x90\xff`\x05\x0e\x99\x91\x0d\ +\x99\x05\x000\x91\x05\x89P\x08\xd9\x0f%0\x92#\xa9\ +\x91\x19Y\x85\x1eI\x90``\x91,@\x92.\xf9\x92\ +%\x99\x91/\xe0\x04)Y\x01\x22p\x938\xffy\x93\ +\xcb`\x91\x89@\x09>\xe9\x930\x19\x94/Y\x03Z\ +\xc0\x02\xf6\x98\x93H\x99\x94X`\x91\x03\xf0\x08N\xf9\ +\x08?\x19\x95\x94 \x94.\xe9\x09\xff`\x8eI\x99\x95\ +Zy\x93\xc3\xe4\x8e<\xf0\x94`\x09\x96R\x19\x95/\ +\xd9'[y\x96H\xf9\x0e~\xe6\x8eO\x10\x96n\xe9\ +\x96c\xe9\x93\x09\xf0\x0f\x11\x80\x96Y\xf9\x0ex\x99\x97\ +\x19\xe8\x8e#\xe0\x00~\xf9\x96\x80\x19\x96\x94`\x02\x02\ +\xd1\x06v)\x02y\x99\x98x\x19\x0b\xb1P\x0a\xf9\x98\ +\x09\xb4\xe0\x97\x92\xf9\x97\x81\xe9\x96Y \x10}\xb0\x95\ +\x8a\x99\x98\x8c\xd9\x99\x8c)\x08\xeeH\x0b\xa2)\x9a\x93\ +9\x99\x95\xe9\x94# \x10j\x90\x93\x9b\xc9\x99\x9e\xc9\ +\x98\xa7\x10\x9b\xa7`\x01\xdfh\x04np\x9b\xa39\x9a\ +\xa5)\x99\x80\xe9Y\xad\x99\x97\xaf\xd9\x99\xb29\x9c\xc7\ +\xf0\x8d\xcap\x9b\xc8\x89\x9b\xb9\x19\x99\xbbI\x99\x8f@\ +\x10\x96\xa0\x98\xc1\x09\x9b\xc3Y\x9d\xb1\xf9I\xa3\xc8\x07\ +\x00\x90\x9c\xdc\xe9\x06\xcbI\x9a\xbbI\x98\x03\xff\xe1\x06\ +\xef0\x9d\xd4i\x9d\xd5\xb9\x0b\xbb\xf0\x00\xc68\x02\x00\ +\xf0\x9e\xdd\xc9\x9d\xdf\x09\x9e\x0e\x80\x80\x031\x05\xd3\x89\ +\x9e\xd6\xa9\x9e\xbb\xb0\x0a\xab\xa0\x00\xc6h\x00[\xb0\x05\ +\xef\x09\x9f\xf1\x99\x9c\xf3\xf9a\x04!\x9c\xfa\x99\x9e\xea\ +\xe9\x9f\x10\xba\x0a\xbe\xe8\x03\x900\xa0\x16Z\xa0\xdby\ +\xa0\xc8\x99\x9b\xd47\x10\x88\xd0\xa0\xc3\xc9\x0c\xfc\x19\xa1\ +\xfe\x89\x06h\x80\x08\xb3\xc8\x05\x90\xb0\xa2\x16:\xa0\x18\ +\x9a\xa1\x1a\xea\x06{I\x10\xca\x00\xa2\x22\xfa\xa0$\xba\ +\x0a&\xba\xa3\x8d \x89.\xb0\xa2@Z\xa1-J\xa0\ +\x18\xaa\xa1jp\x10\xfa9\xa29\xaa\xa3;\x8a\x06*\ +\xa0\x02(*\x88\x03\x00\x01A\x1a\xa4C\xfa\xa2\xf1\x99\ +\x01\x07!\x09\xc3\xc9\x9f\xfd\xb9\xa4M\xfa\xa4O\x8a\x01\ +\x18 \x88'\x00\x01hJ\xa5U\xca\xa2WZ\xa4\xb7\ +\xf9\x80\x07\xb1\x09\xa7\xe0\xa5K\xca\xa4;*\xa6*@\ +\xa6dZ\x09\xaaE\x84\xbd\xf0\x08i\x9a\xa6k\xca\xa6\ +-\xfa\xa2\x00\xc0\x02\x081\x048\x0a\xa6a\xff*\xa6\ +z\xfa\xa8pj\x83zP\x05U\x10\xa8\x82:\xa8B\ +Z\xa8\xef\xd9\x95\x071\x01u\xda\xa4N\xea\xa8\x8f\xaa\ +\xa7\xf5P\x0fJ`\x83\x1b@\xa9\xaaj\xa9h\x8a\xa9\ +\x99j\xa1G\xa0\x10\xc9@\xa2\xa0\x1a\xaac:\xaad\ +Z\xaa\xa5\xea\x98#\xb8\x06\xaa\xfa\xab\xac\xaa\xa6\x83\xda\ +\xa2\x80\xb0\x10\x0aP\xa2\xa0\x8a\xa7\xb8J\xaa\xbaZ\xaa\ +k\x00\x81\x89 \x01\xd2\xfa\xab\x94\x1a\xac\xc2:\xa8\xcf\ +\xba\x10\xf3P\xab\xca\xba\xac\x18\xd0\xac\xe0\x0a\x80' \ +\xad\xe4J\xad\xd5\x1a\xac\x98*\x82\x0a\x11\x00\xacp\xa7\ +\xa2\xba\xac\xe0\xda\xacuP\x07\xa8\x10\x89\xbb7\x04U\ +\xe0\x0e\xe4Z\xae\xe6j\xadU\xea\x06D\x96\x10\x99`\ +\xaby\xea\xad\xdf\x1a\xaf\xa5:\xaf\xaa\xa0\x0aD\xb0|\ +\xb4\xe0\x0e\x10\xab\xaf\xfbj\xae\x95\xea\xaf+*{$\ +\xc1\x07\xdep\xab\xde\x8a\xb0\xbaZ\x07\x0b\x1b\xb2-0\ +\x97i'\x0b\xa10\x01\x11\x0b\xb1\xfb:\xad\xfdj\xad\ +n\x80\x12``\xb0\x07\xeb\xb1\x0a\x1b\xb2\xaa\xff\x00\x0c\ +\xdf \x85iw\x01\x13\xd0\xb3)+\xb1\x13K\xb1\xc1\ +\x8a\xb1&\x11\x01\x1d\xeb\xb1\xf5P\xb3!\x8b\xb3\xdf\xf0\ +\x0d\x12`u\x99\xd0\xb3R\xfb\xb3@\xcb\xaf-\x8b\xa6\ +n@\xb2'1\x0f\xb8\x8a\xb4\x09k\xb3\x0b\xcb\xb4\xdf\ +\xc0\x0a\xac\xa0\xb3\xed\xd6\x0b\x5c\xd0\x06m \xb5>\xfb\ +\xb3++\x01\x14[\xb1\x10\x90\x0c*a\x0b\x08\xc0\xac\ +H\xab\xb4a+\xb6d\xcb\x0a=p\x0b\xed\xe6\x01k\ +\xa0\xb6j\xcb\xb6(\xeb\xb6o\x1b\xb7\xd9\xaa\x120\x90\ +\xab^\xab\xb77\xdb\xb4M\xdb\xb7=\x10\x01\x11P\x0a\ +\xed\xc5h(\xb0\x05\x0d\xd0\x00\x84\xbb\xb6\x86\xfb\xb3\xcb\ +\x90\xb8\xe6Z\xacL\x11\x07\x8f\x0b\xb2`+\xb6cK\ +\xb6\x95k\xb9\x11\x80\x05G\xdaeb\xd0\x06\x9d\xdb\xb9\ +\x9fk\xb8\x87\x9b\xb2o\x0b\xb7\xaajlM\x81\x0a4\ +\xab\xba6\xcb\xba\x94\x0b\xbb\x96\x8b\x0a\xa8\xc0\x05\x1a\x02\ +^\xb6\x00\x05\xb7\x1b\xbd\xb9\x1b\xba\x88\xbb\xb2\x94\xba\x05\ +\x0c\xe7\x14z\x80\xb0\x90\x1b\xb9\x92{\xbc\xc8\xff\xab\xbc\ +\xa8\xc0\x0d-\xb0_!\xe0\x06\x7f\xf0\x07\xd1{\xbb\xd3\ +\xcb\xb6T;\xbao\xfbuN1\x01\xf2J\xbc\xc5+\ +\xb9\xad\xeb\xb7\xc8\x9b\xbc\xe3\xcb\x0d\xdc \x00+IW\ +\xb2\x90\x08\x1aP\xc0\xe9\xbb\xbe\x9e\xdb\xbeSK\xb5+\ +\x1b\xc0pQ\x09\x09k\xbfK\x8b\xbf\xe0\x1b\xbe\xfd\xcb\ +\x0d\xc5 \x00\x02\xa0\x08/05\x8d\xe0\x0e\xbaP\xc0\ +\x06\xac\xbe\xeb\xfb\xb9\xa0\xeb\xbe\x0c,\xad\x000\x17\x14\ +\x90\xb4\x12|\xb3\xc6\xeb\xba\xfb\x1b\x01\xe2\xeb\xbf\xff\xab\ +\xc1\x96\x80\x05\xb7 \xbf8\xe2\x03\xb4p\x0b\xb7\xa0\x0b\ +9 \xc2\x07\x8c\xc0&\xac\xbb\xbb\x1b\xb1\xd2j\xbar\ +\xd1\x07`\x1b\xb6\xf8\x9b\xbf=\xf0\xba\xb0[\xc3\xfe\xab\ +\xc18\x8c\x05Z\xac\x01t\xcb!L\xe0\x06\xad\xd0\x0a\ +@\xac\x0bBL\xc4$\x5c\xc2\x0a\xbc\xc0){o\x97\ +\xd1\x06\xab\x1b\xc5}\xab\xbf\x16|\xc1\x19\x9c\xc5Z\xac\ +\xc5\x0ap\x00d\xb0\x1df\xa0\x07\x13\x00\x0ar\x10\xc6\ +@\x1c\xc4Cl\xc6\x08\x9c\xc0\x84\x8b\xc4)\xff;\xa3\ +\x96A\x03D0\xc1\x14\x5c\xc1U|\xc17,\x00\x96\ +\x90\xc3w\xac\x00\x9a\xcc\x08\x8cP\x05S\xe0\x05\x96\xa1\ +\x06%\xb0\x02-\xd0\x02\x80\x1c\xc6b\x1c\xc4e<\xc2\ +g,\xbdi\xdc\xb6\xb4\xa0_\xb8a\x05\x96\xe0\xbd\xdf\ ++\xc9\xfc{\xc1Xl\xc9w\x8c\xc7\x9b\x8c\x0c\xc0\x8c\ +\x0c\xad\x00\x06<\x9c\x12b\xb0\x09\xee\xb0\x02\xcaL\xca\ +\xa6|\xca\xa9\xac\xca\x22\xac\x01El\xc4Gl\xb8\x10\ +\x80\x0e\xdb!\x0cl\x00\xc7\xb8L\xc3\xcak\xc3ul\ +\xc9\x98\xec\xcb\xbf\x1c\xcci\x90\x06\x1c\xc0\x01r`\x00\ +2\x80\xa8\x03\xf1X\x02\xd1\x0bv\xe1\x02\xc9P\x04s\ +\xd0\x06\x070\x0a\xfa<\x0a\xcb\x5c\xca\xa6\x1c\xc8\x82\xac\ +\xca\x85<\xc2\x87\x8c\xc8\x89<\xb5m\xa4\x1fS\x10\xc9\ +2\xbc\xbfV|\xc5X<\xce\xe4\xcc\xc9\xc1\x8c\x0c\xe7\ +\x9c\xceD\x90\xd1D\x80\x00\x1c\xad\x08\x1e\xad\x08\xa5P\ +\x0a\x1d\x80\x08$\x8d\x08\x07p\xd2\xfb\xcc\xcf\xfd\xfc\xcf\ +\x00}\x0cc\xbc\xca\xd2<\xcdh\xdc\xbe\xc5\xff\x9c\x1b\ +I\x90\xbf\x0d=\xc76\x5c\xc9\xbc\xdc\xcbX\xa0\xc9\x0a\ +\xc0\x08\x15m\xd1\xe8\xcc\x01\x1a\xcd\xd1\x1d\xfd\xd1!=\ +\xd2%}\xd2(\xad\xcf\xcb\xcc\xcc\xa0\xe0\xcc\xcf\x0c\xd3\ +1\xdd\xca\xae\x9c\xbb]\xcc!Y\x10\xc7T\xac\xd3\xfe\ +\x1b\xce\x97\xec\xd3@M\xd1\xe6|\xd1\x1a\xbd\xd1H\xfd\ +\xd1 -\xd2Lm\xd2N\xbd\xcfQ\xed\xcf\x80\xdc\xd2\ +/=\xd01]\xd0&\xdc\x06\x1d\xec']-\xc7\x0e\ +\xfd\xcd6\xbc\xcb\x12=\xd1B}\xd6\xe8\x9c\xd6H\x8d\ +\x00l\xbd\xd4o\xed\xd4\xf9,\xd7+=\xd5\x00]\xd5\ +V-\xd3Y\xcd\xd7\xed\x92\x04_=\xc9\x94L\xd8\x85\ +\x0d\xd4A=\xd4\x17m\xd4G\xbd\xd6J\xed\xd6M\x1d\ +\xd7\x92\xad\xcct]\xd9.-\xd0\xd1\x9c\xbeX\xcd\xbe\ +m\xe0\xce\xed\xf2\x023\xfc\xd0\x18L\xd8>\xfd\xd3\x9b\ +|\xd8\xc0|\xceE\xad\xd8\xa8\xed\xd1\x8e]\xd2p\x1d\ +\xd9P\xbd\xd2\xcd\x5c\xd9\x83L\xc6xM\xdb\x87\xdc\x06\ +5\xed''\xa0\x00\x9eM\xc7\xa0M\xd6e\xffM\xda\ +\xa5m\xdcI\x8d\xdc\xaa\xbd\xdaO\xdd\xdc\xae]\xcaT\ +\x1d\xdb\xd2\x1d\xcdy\xbd\xbe\xee`\x95\x90\xa5\x08\xde,\ +\xd8\x10\x8d\xc3\x85\x0d\xdcA-\xdc\xc3\x8d\xd6\xe2\xcd\xd8\ +\xa9\xdd\x01o\xbd\xdc\xcc\xad\xd2\xe9\xcd\xd2\xa8\x1c\xdd\x97\ +-\xd3\x90\x80\x9dvC\x0e\xee\xc0\xdb\xe1\xdc\xd3\xbd,\ +\xdaf}\xd6\x18\xfd\xdf\x8d]\xde$\x0d\xd9)\x1d\xd5\ +R\xbd\xde\x0a>\xddE<\x00\x14\xf6\x0aT@\xc9\x13\ +>\xd6\xde\xbd\xdf\xe0]\xdc\xa7}\xdcm-\xe0\xca\xed\ +\xe1\xad}\xe0u\x9d\xe0w\xed\xde\xb4\x9d\x04>Ga\ +\x14@\x04\x83\xed\xdb-\xee\xe2\x15M\xdc\x19\x9e\xd1\x8b\ +\x0d\xe0\xe4M\xe3\xe6}\xde\x06\xce\xcc\xcf\x8d\xca\xb1-\ +\xdbD,\x01#Tg\x10\xd0\xdb\x11\x9d\xdf\x16\xce\xdf\ +D\x9d\xd8\xff\xcd\xe43>\xe0\x90]\xe0 \xfe\xda\xd0\ +}\xd7\x03}\x01\xd9kj~\x90\x06D^\xe1e\x0d\ +\xe6Hn\xda1N\xe6e\xae\xdc\x04\xfe\xe1s\xad\xde\ +\x22\xbe\xe3m\x90\x0cU\xd7kn\x80\xdf\xbf\xff\xfd\xe5\ +/\x9e\xe4J.\xe3{^\xe3\xac}\xe3t\x9d\xe3\x01\ +\xad\xca\xba\xc0\xc8\x18G\x01\xa3\xe0\xe5u>\xd4a\xce\ +\xe8j=\xdeM>\xe0}\xee\xe7\xceM\xd9T>\xc8\ +\x10\x10k\x94\x97\x04eP\xe4\x17\x8e\xd8\xa0\xbe\xd8l\ +]\xe6fn\xe3\xe8\x8d\xe3\x94.\xc6\x0d\xf0\x02\xf0\xbc\ +{G\x90\x06\xe4\x1c\xdc\x8b\x8e\xe7\x8d\xee\xe8\x8e}\xeb\ +\x91\x9e\xeb\xfe\x8c\xe0\xad\xa0\x01I \xcb\x00\xf8\x00\x1c\ +\xa0\xe8\xc5\x9e\xd6\xa1.\xea\xb6\x0e\xe9\xcb\x1e\xe5RN\ +\xd9\x7f\x90\x08q\x98\x04\x07@\xec\xd7>\xe6\xb5\x9e\xec\ +\xdc\x0e\xe5\xdeN\xd7\x13@\xb4q\xa8\x05\x00\x10\xeba\ +\x0e\xe3y\xae\xe7\xea\xbe\xeeh\xfe\xe7&p\x02\xf74\ +\x8b\x82\x90\x08\xb7p\xe4\xa5m\xec\xd9\x8e\xefnM\xea\ +g\x9e\xd2\x06^\x05? \x8a\x16\xf9\x0f\x83\xd0\x00\x9f\ +n\xf0\x07\x9f\xee\x09\xcf\xe7\x0b\x9f\xd2[\xc0\xc6\x11o\ +\x10\xc90\x00+\x00\xea\x17\xbf\xe1\x02\xae\xf0\x1e\xde\x06\ +`\xd0\xa3\x1fO\x12:\xa0\x05Y\xf0\x08\xa34p\xec\ +\xc8\x9e\xf15\x9e\x03k\x90\x08!\xd7\xf2M\xa1\x09F\ +\xf0\x03\x0f\xc0\x05\x8f\x90\x0d\xe5\x00\x0d\xa3\xe0\xd1+P\ +\x0e\x1aP\x055p\x01\x04\x90\x02b\x10\x02o^g\ +\x01\x01\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\ +\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\ +\x08\x13*DX\x0bW\x02\x0f\x0b\xbc\xa03f%\x84\ +\xa6'\x18AH\xd1\xb4\xc1\xd8\x1d3\x1e\xa8\xb9ZH\ +\xb2\xa4\xc9\x93(S\xaa,\xf8\x8a\x9a\x07\x1d(6l\ +\xb0B3\x84EM @`\xfc\xf0\xe1\x90'O.\ +\x94\x00\x02D\x82\x04 MChH[\xc9\xb4\xa9\xd3\ +\xa7\x07kQ\xe3#\x08\x85Uc\xc6d\xd2\xacx3\ +\xe7\xce\x9e?\x83\x0e%A\xac_?\x1f@\x84\x91\xd0\ +\x84\xc3\x16\xd4\xb7p\xe3\x0et\xf5\xc6L\x06tC\xf2\ +^\xcd\xaa\x95\xab&\x9c:\x9f\xf0\xf4\xe9B,\xd1\xb2\ +g\xd3\x0a;\x11L\x0c\x09c\x09\xe4J\x9eL\xb2V\ +\x02C\x822\xdf\xc5;d/\xdf\x9a]\x03\xf3\x0ck\ +\x98\xacY\xb4\xc2\x167\x16c\x84\x89\x0fc\xb2(\xcb\ +\xa6,\xcd\x03\x0e\x1d:\xbch\xbe\xab\x17\x05\xd6\xcf~\ +\x01\x7f%=\x96\x84\xd9\xb3\xa9O\x9c\x10\xc3\xbc\xb5\x16\ +-\x14\x00\x99\x99M\xdd\xe9\x97\xa9\x0bph\xcf\x9dY\ +\x10\xef\xce{\xfb\xda\xff\xfc\xebU\xf0\x07\xe2D\x8d\x9f\ +\xf5\x91|\xb5s\xe8\x14(4bbld\xf5\xfb%\ +\xb1/\xc8\xbe]G\xf7\xef\xe0a%^h\xc3\x01\xe5\ +Bq\xa7)\xc6XsL<\x17_#\x8d\xc0\x00C\ +\x14 \xb8\x85\xdf\x85\x04]G\x03\x1f\x1c\xee\xc7\x1fn\ +\xbay\xf7]x3\x05W\xdeh\x06\x22\x98X{\x0c\ +:(_\x840$#\xa3&\x16bx\x1f.\x1e\x90\ +C\xce\x86|x\xa8\xddm!z\xc7\x19\x89\xa0\x91'\ +\xday)\x1e\x96\xe0b\xcb\xb1\xd6 |\x10J(c\ +2,\xb0\x90\x8c\x15\xbc\xd88\x9b+\x01x\x90\xe3\x8e\ +\x1c\xf6\xb8_\x7f\xff\x0d\xe9\x9b\x80%\xde\x84S\x81\x85\ +\x8d\x85\x18{\xaa\xb5\x08%\x8c2V\xa9\x86\x1a#4\ +\xa2\x83\x96\x92\xc5@M\x97^~\xc9\xa3\x8f\xb7q'\ +d^\x01\x027\xde\x9a\xe6\x85%\x14Q\xa7\xc1\xb9\xa0\ +\x93.F\x19#\x95,\xdc9\xc2\xa6\xc2\xc4\xc6'T\ +\xcd\xbc\x11\xc0\xa8\x81\xea\xc8\xa3\x98?\x1a\x9a\xc1\x88g\ +\x0eH\x1e\x9b\x8f\xaa\xff\x87Z\x9cb<\xf9 \x9d\x98\ +j\xba\xe9\x08/\x8c\xb0\xc1\xa7M]\xf7\x86\xa8\xa3\x02\ +*h\x87c\x16Zfoh\x16\xc9(\x8ab\x15\xb5\ +\xa4rr\xde*e\xaexn\xfa\xc2\xb6S\x18\xd1\x0b\ +\xb0)\xbd\x92\x00\x0f\xc3\x12k\xac\xa9a&\x0b\xa4f\ +f6k\x22\xac\xe9M\xeb^\x83\xd6^jg\xb6\xda\ +\xbe0\xc5\xbe/d\x00nI\xb34\x91\xc0\xc0\xe5\x9a\ +[*\x98b~\x18\xe2\xaax\x11i\xa2\x14\x8d\x02\xe5\ +\xe6i,\xb2V)\xae\xf7\xee\xba\xad\xbeS\xa4\x90\x82\ +\x1f\x80|\xf1oB\xb0\xe0B\xcd\xc0\xe3\x96[\xec\xc1\ +\xa7&\x0b\x22\xbb\xccf\xe5\xacF\x11\x1f\xa8$r\x8b\ +U+\xdf\xb5\x19\xe7\xcbq\xc7)\xc4\x13O#\xb8\x8c\ +lP\x0c\xb2P\xa34\xca\xe4\x0e\xbb\xb2\x97\xe8\xa2\xba\ +\xdd\xc2\xed~\xb6(\xcd\xd0N\x8c\x1a\xb5\x94\xd6[g\ +\xa6\xf8n\xbc\xaf\xc7B\xc7\xf3\xc3\x0b\x1e\x18=\x10/\ +\xb2$\xad\xf4\xc9\x04\xabL\xea\xb1\xc8N\x0ds\xa2Z\ +]\x0d\xf1hmB\xff\xba\xe2\xa4F\x5cl/\xd8\x1a\ +s\x0b\xb4\x1fB\xff\xf0\x83\x1e\xf1\x08\xa2v-\xbd\xb4\ +\xed\xf6\xd2q\x1b\x0c5\xc2.\xab\xdap\xabi\x92\xb7\ +\xf7y}\xcb\xca\xe2{/\xf2\x9c\xe9\xae\xbc\xfe\xfcq\ +\xe2\x8b\xeb\xa1\x87\x05V\x8c\xdcP/\x91\xcb\xe2\xc8\xdb\ +L\xcb\x0dh\xd4\x84j\xae\x97\xbb]}\x9e\xa4\xe89\ +w]\xfa\xd7\xba\xa6\xce1\xd9f\xff\xb0\x84\xeb\x16D\ +\xff\x04\xb8\xd7\xe0b=\xedm\xdfNy\x02\x05\xcfM\ +\xb7\xcbT3+\x9e\xe7\x8d\xb6)-\xceM\x06\x0e\xa5\ +\xe9a\x1b\xce\xbc\xd9\xcf\xbf\x1e}\x12I\xb8\xf0i-\ +\xb6X\x7f\xbd\xe4o\xc3\xcd\xbd\xd3\xde\xc3\x1c\xf84\x13\ +\xb3\xce\x09\x87oB1\xcd\xd6\x1aC:Ka\xabp\ +\xfb\xea\x18\xe2\xe0\x07\xbd\xf9%\xa1\x08E\xb0\x9f\x8dx\ +a\x8b\x0e\xea\x0f\x17\xb5\x9b\x1c\xdc\x9af9\xde)\x0c\ +f\xe1\xa9\x89\x91\x04C\x98\x04\x96e\x81\xc6\xc3X\xf2\ +\xc4&\xc1\xc4\xc5/z\x16\xa0\x1f\x06/\x91\x88\x0f`\ +\x88\x17\xcdhF\x07\xff\xf3\xa7\xbf\x10\xe2n`M{\ +Z\x8e\x06\xf5!\xff\x1c\xaa3\x02*\x92W\xc0\x12-\ +\x8a\x15O}\xa5\x8bQ\xcfR7\xb6\xa05\xaf\x829\ +\xbc`\x11x\x98\x08\x19h\x02?_pE.\x828\ +\xc4\x0f\x1aq{\xba\xbb\x1c\x13\xed6\xa2!\xe0\x80\x1c\ +o\x90\x85-F\x22\xb2\x7f\x88,\x17\xbdx\x03\x1f2\ +\x10\x02%H\x8a9\xb6\x8aR\x9df\xb8p\x82Md\x22\x13\x14\ +\x10H\x03\xb2\xcf~\xedo?\xf3D\xf8\xbeJd\xb0\ +\xf6\xf1\x17\xbf\xfc\xe6?\xbf\xfe\xf5 \x90oT\xa0\x02\ +\xed\x17\x80\x84\xf0~\x17 \x7f)A\x01\xf6gz\xe5\ +\xa7\x7f\x0c\xc8\x80\xca \x10\xff\x17\x81\x11(\x80\xed\x97\ +{\x8d`\x80(a\x05\xe4\x97\x7f\x0d\xd8\x81\x0c\x08V\ +\x12\x18\x82!H\x81\xee\x87\x81(A\x0d\x0a\xe8\x81*\ +\xd8\x80\x17p\x01\x82\xc0\x02\x22\x18\x83\x22\x18\x80\xdc`\ +\x82(q\x04+\xe8\x81-\xb8\x83;\x08\x02d \x83\ +@\x18\x83\xee`\x83'\x11\x0f+\xc8\x83H\x98\x84\xc2\ +\x10\x0aA\xd8\x84\x11\xe8yDX\x12Z\xa0\x7fIX\ +\x85V\x98\x0c\x00\xe0\x84N\x18\x0fQX\x12.`\x85\ +`\xb8\x03b8\x86;\x90\x02\x1a\xa0\x85M8r]\ +\xb8\x10\xc6`\x85d(\x86\x5c\x10\x87r8\x87I\xa0\ +\x08h\x18\x84\xea\xb6\x86\x0a\xb1\x00c8\x87~\xf8\x87\ +\x7f\x18\x0d\x0a \x02\x84X\x88\x86X\x88M\xa8\x87$\ +\x01\x88\x8c\xd8\x88\xca\xff\x10\x01\x87\x18\x89\x92\x18\x89\x8a\ +\xa8\x10\xcd\xd0\x88\x98\xe8\x87`\xf0\x0d\x93\xd8\x89\x92X\ +\x89\x09\xf1\x0a\x7f8\x00\xa4X\x8a\xa6x\x8a\xa5\x98\x09\ +\x9e\xb8\x8a\x86\x08\x8a\x09\x81\x8a\xb0\x18\x8b\xa6\xc8\x8a\xb4\ +\xe8\x8a\x08!\x8b\xb8\x88\x8a\xac\xf0\x0e\xbc\xd8\x8b\xbe\xf8\ +\x8b\xc0\xd8\x8b\xb6h\x10\xaf0\x07\xc6x\x8c\xc8\x98\x8c\ +\xcax\x8c\x99\x10\x01\xc1\xf8\x8c\xd0(N\xc3\xf8\x0f\xcd\ +\x10\x0a\xd6x\x8d\xd8\x98\x8d\xdax\x8d\x99\xa0\x00\xbd\x18\ +\x0b\xe0\x18\x8e\xe28\x8e\xe48\x8d\x04\x91\x00\xdb\x98\x8e\ +\xea\xc8\x00\x88@\x8e\xee\xf8\x8e\xe0x\x0a\xe68\x10\x0b\ +`\x02\xeax\x8f\xd8\xb8\x09\x0d\x00\x8f\xb1p\x0a\xfe\xf8\ +\x8f\x00\x09\x90\xc20\x8f\xff\xb0\x01&p\x90\x08\x99\x90\ +\x09y\x8f\x89\xe0\x06\x01\xf9\x90\x10\xf9\x90)@\x90$\ +\xa0\x90\x16y\x91\x16\xf9\x03\x03\x10\x91\x1c\x09\x91\x0f7\ +\x8f0\xb0\x0630\x92$9\x03\x18\x89\x91#0\x0f\ +\x1d\xd9\x91\xbb\xd0\x92\xbbP\x05\x04\x99\x04k0\x934\ +I\x93%I\x92\x18\xffi\x04\xc9\xb0\x92\xfe\xe8\x92.\ +\xb9\x0a@\x09\x94\xa2@\x90\x99P\x93Fy\x94\x22y\ +\x93#\xc9\x13\x0f\xe9\x93?\x19\x94P\x09\x95\xf3\x98\x00\ +\x06`\x00Hy\x95H9\x03\xfe\xe2\x94-\x19\x95^\ +\x19\x95h\x80\x06Z`\x8e P\x95fY\x95X\x89\ +\x95\x02!\x00_\xd9\x96@\x19\x96p\x19\x96\x05`\x8e\ +,p\x96vi\x96i9\x93\x5c \x10\x13\xe0\x96A\ +\x19\x97\x80\x89\x06*\xa0\x02\x07`\x8e\x0cP\x03w\x99\ +\x98xy\x94\x89 \x10`\xf0\x95\x81\x09\x98\x839\x99\ +\x18\x80\x01\xd3\xe8\x015\x90\x99\x9a\xa9\x98\x9c9\x93P\ +\xf7\x0f,\xf0\x97\x91\x09\x97\x93I\x99\x95Y\x99\xfcg\ +\x8b'\xa0\x99\xac\xb9\x99\x9ci\x97\x97\xf5\x0f\x820\x9a\ +aY\x9a\x83y\x9a\xb8Y\x99\x1a0\x8cGP\x02%\ +\xd0\x9a\xc0\x89\x98\xaf\x996\x02\xc1\x08\x92i\x9b\xb9\x99\ +\x9c\xa7i\x8b4@\x09\xbe\xf9\x9c\xc1\x09\x9cwY\x80\ +\x03\xe1\x00\x82i\x9b*\xa0\x9c\xcaY\x0f\xdcy{\xa0\ +\xc8\x02\x94\x10\x9e\xcf\xff\x09\x9d\xd1\xd9\x9aU\xb9\x04\x05\ +Q\x9a\xda\xb9\x9d\xdc\xd9\x9eCY\x89\xb5\x10\x0a\x8f\xf0\ +\x08\xe1)\x9e\xe3\xf9\x9b\xe5\xa9\x99\xba6\x108\x90\x9d\ +\xeb\x99\x9b\xed\x19\xa0\xed\x89zzH\x0c\xf3y\xa0\xf4\ +Y\x9f\xf7\x89\x9f\xd1i\x10\x07\xf0\x9f\x95)\xa0\x12\xca\ +\x9d\xbe\xa7\x87\xb0\x90\x09\x08\x8a\xa0\xf5i\x9f\xe3\x09\x9c\ +\x1fI\x10\x9c\xb0\x9e\x13:\xa2uP\x07\x8a\xe8\x09\x0e\ +\x90\xa2\x19\xaa\xa1\x1b\xba\xa0\xf8\x99\x0c\x06\x11\x02\xec9\ +\xa2\x01Z\xa2u\xa0\x0a\xaaP\xa1Q\x18\x03\x99@\x0b\ +\xb4\x90\xa2*\xba\xa2\xf3\xd9\xa2\x0b\xea8\x06\xd1\x01\xa7\ +I\xa3\x12j\xa38\xda\xa4w\x17\x85\xc2\xe0\x06>\xea\ +\xa3@\xea\x00B:\xa4DZ\x02\x99\x80\x10\xd1\xa0\xa4\ +KZ\xa2M\x1a\xa6\xa20[&\x88\x0b\x06\xe0\x06h\ +:\xa5?\x0a\xa4W\x8a\xa5\xf5\x09\x03\x09\xe1\xa5\xed\x09\ +\xa6a\xda\xa4\xc0\xf0\x0d\xdf@\x9d&\x18\x0fh\xda\xa7\ +R:\xa5U\xda\xa6\x09J\x09\x0a\xe1\x0e^J\xa7u\ +\xaa\x0aw\x8a\xa7x\xff\xaaA\x06h\x0cB\x00\x00\x00\ +\xe0\xa7i\x0a\xa8l\xda\xa6\xd1\xa0\x100@\xa3\x88Z\ +\xa7\xc0\xb0\xa8x\xca\x0a\xacp\x00\x8e\x80\x81s\xb0\x05\ +\x92:\xa9\x94\xfa\xa7Tz\xa9+\x1a\x9b\x08\x91\x0b\x1c\ + \xa0L\x9a\xa8\x8a\x0a\xaa\xa1*\xaa\xac\x10\x0a\x06\x98\ +\x04\x90\xb0\x05\xc0\x9a\xaa\xab\xca\xaak\xea\xaa\x8f\x10\x0a\ +\xd0\xa4\x1020\xa7\x9d\xea\xa9\x8c\x9a\xab\xa2\xda\x03\x11\ +\x10\x01\x04\x0a{@\x00\x09\xd8\x0a\xac\xc1\xaa\xaa\xab\xaa\ +\xa6Uj\xa5\x8f\x90~$\xc1\x0d\xb5j\xab\xb8\xfa\x0d\ +\xba\x1a\xad\xd3\x1a\x01X\xf0}\x00\x80\xad\xf0\xaa\xad\xc2\ +:\xac\xde\x0a\xa4%`\x12`p\xa3\xb6z\xab\xcf\x8a\ +\xae\xba\xda\x03\xd2\xba\xae\x11\xa0\x08\xbfW\x03\x10\x00\x01\ +\xf0\x9a\xad\xf2*\xa9\xf4Z\xaf~U\x12\xa8`\xae\xe7\ +\x9a\xae\xac\x10\xb0\x02\x1b\x01\xa8\x00\x0e\x9fw\x01\x07{\ +\xb0\x09\xab\xb0\xa8\xca\xb0\x0d\xeb\xa3\x94\xf0\x06'\xa1\x0c\ +\x9ez\xae\xfe\xfa\xaf\x17\x8b\xb1\xa8\x80\x0a\xdc\xe0\x0e\xa4\ +\x06t\x05P\x05\x1d\xff\xeb\xb1\x1f\xab\xad!\xcb\xad\x94\ +\xea\xa3\x0fk\x12\xc5`\xa7\xfd\xba\xb2\xea\xda\xb2/\x0b\ +\xb3\xdc\xc0\x0d\x100\xb3\x05\xc7\x00U\xf0\xb46{\xb3\ +9\xbb\xb0\x22K\xa9\xf7\x9a\x12\x89\xc0\xaf\xfdJ\xb1\x16\ ++\xb0G\x9b\xb4I+\x00CXp\xb8\x90\x09\x12\x00\ +\xb5O{\xb3\x08;\xb5\xdb\xca\xb3hz\x81*\xd1\x01\ +C\xcb\xb5]\xbb\xae_\x0b\xb6\x02\x90\xb7\x7fPps\ + \x01~\x8b\xb6Q\xdb\xb1\x1f\xfb\xabT\xcb\xad\xbc\xba\ +\x12\x8d\xf0\xac\x14[\xb1-\xeb\xb2/\x0b\xb6\xdc\x90\xb7\ +yk\x09\x85\xf9jC\xf0\x08\xee\xe0\xb7\x7f\x8b\xb6j\ +;\xb8\x84\xdb\xb6\x93\xea\xa8*\x01\x09\xd0\x1a\xadu;\ +\xadG\x8b\xb4a+\xb9\x96\x80\x05X\x90\x06\x9f\x99d\ +'P\x05\xeeP\xbb\x9a{\xb6\x9c\xdb\xb9l\xbb\xb3\x99\ +\xda\x148\x80\x05\x5c\xdb\xb8\x8e\xab\xba\xc5 \xb9\x02\xd0\ +\xba\xae\xeb\xbazj_\x890\x01\xb5\xfb\xbc\xb7\x0b\xb8\ +j\xbb\xb6\xbb\xfb\x08P\xf1\x03\xffz\xba\xa8\xfb\xb8`\ +[\xbc\xac\x8b\xbc\xc9\xff\xab\x00\xb7\xe0C\xbfe\x055\ +0\x01\xe8\xfb\xbc\xee\xb0\x0c\xd1\x9b\xbbR;\xb8\xda\xba\ +hP!\x01\x15\xab\xbd\x8e\x0b\xb9\xde;\xb9\xe0\xeb\xba\ +\x0a\xd0\xbf\x8c\xc0\x00s\xa66I\xd0\x06m\x80\xbe\xe9\ +\x0b\xbd\xed\x0b\xb5\xd3\xeb\xb9[\xc0\x09q\xc1\x0e\xc2\x9b\ +\xba\xf8k\xbc\x96\xb0\xbfX\xd0\xbf\xfe\x8b\x0c\x880\x02\ +?\x07,\x14\x00\x01\x04L\xc0\x06\xec\xbc\x08\xac\xb9\x80\ +\x1b\xb8\x82\x9b\xb0\x8f\x10\x00q\xa1\x05\x8d+\xc1\xddK\ +\xc1\x16|\xc1\xfe\xcb\x08\xc8p\xc3\x0d`\x04\xc0\xd2\x0f\ +%\xd0\x00\x0d\x10\xc2\x05l\xc0\xea\x9b\xb9\x09\xac\xc0\xba\ +\x8b\xad\xa2\xfb\x16`p\xb10\x9c\xb4\xf9{\xbc3\x8c\ +\xc1\x8c`\xc37|\xc3i\xd0\x060`\x1f\xf8!\x06\ +\x94\xe0\xc3^\x0c\xc4#<\xc4\xb7\x8b\xbb\xee\x9b\xc2\x5c\ +8\x19\xee`\xb7w\xeb\xc42\x9c\xbc\xe1+\xc5Ul\ +\xc5i\x90\x06\x1c\xb0\x02\x8dI\x1d8\x10\x0fU\xf0\x07\ +\x7f\xe0\xc5_\x1c\xc2a\xac\xbec|\xc2\xd3\xfb\xa1\x92\ +A\x0e\x8a0\xbc\x13\xff\xfc\xbdn\xcc\xbfRL\xc5U\ +<\xc7\x1c\xc0\x01DP\xc9\x90\xf0\x02{\x12\x17\x0b\x90\ +\x0ck\x90\x03\x1a\xf0\xc9|\xec\xc7?\x0c\xc8\x81\x5c\xc2\ +\x9b[\xc65P\x1d\xc8\xb0\xc6\xdc\xf0\xc4\xc7\xdb\xc8\x8e\ +\xac\x00S\x1c\xc7\xc80\xc7t\x5c\xc9\x95\x8c\x00\xba\xac\ +\x01\xca\xc0\x04\xbf\xb4\x12\x1ep\x02NP\x05\xb7p\x0b\ +\xba\xa0\x0b\x9f\xac\x01\xa1,\xca`\x5c\xca\xb6[\xc4i\ +\x0b\x01n`\xa4\xb3\xe1\x03\x90\xcb\xc6m\xdc\xc8\x18,\ +\xcb\x90,\xc7\x93\x8c\xcbD\xa0\xcb\xba\xac\x08\xe4\xac\x0b\ +&p\x09\xc9\xe0\x02(@\x03\xdfB\x10\xbf\xe4\x09\x8d\ +`\x01\x17\xe0\x0e\xa0 \x07\xad\xd0\x0a\xc5|\xcc\x9e\x0c\ +\xca}\xec\xc7@\x1c\xc4\x07\xfc\xbc\xec\x0b\xcd6;=\ +\xf7\xf1\x02\x8b\xcc\xc8\xda\xfc\xc8\xb4l\xcb\xdf\x8c\xcb\xe2\ +\x8c\x00\xe4\xac\x08\xa5P\x0a\x1d\xd0\x01\x88\x90\xd1\x88p\ +\x00\x1c=\x0a\x1e\xbd\x02 \xbd\x02-\xd0\x02\xf5|\xcf\ +\xf8l\xcc\xfb\xac\xcc\xfd\xec\xcf\xa4,\xc4\x82<\xc8h\ +\xab\xc3\x17b\x01\xd8\xff\xac\xd0n\xbc\xcd\xb3\x1c\xc7\x0e\ +M\xc9\x10\x1d\xd1\x13]\xd1\x17\xad\xd1\x1b\xdd\xd1\x1f\x1d\ +\xd2#]\xd2\xf7\x9c\xcf\xc8\xcc\xcf\xa2\xec\xc3\xcd\xec\xd2\ +\xa6|\xcapj#P\xe0\xca\x15\x0c\xcb4\x5c\xc3\x0d\ +-\xc9<\x9d\xcb\xe2<\xd1\x14m\xd1\x18\xad\xd1\x1c}\ +\x00\x1e]\xd4\x22M\xd2H\xad\xd4)\xbd\xcc,\xdd\xd2\ +\x01\xfd\xcc\xd1[\xad\x18\x22\x03\xd9\xbc\xd0Z\xad\xd3\x5c\ +\x0d\xce\xe1\xfc\xd5?-\xd6d]\xd6g=\x0aF\xad\ +\xd6\xf6\xdc\x0a\xc7\x90\xcfm\xbd\xd2o\x0d\xd0q-\xd7\ +~K\xd76\xa2\x07\xfa\x8b\xd58\xdd\xcdrL\xc7]\ +\xdd\xd7~M\xce@=\xd6CM\xd4h=\xd2$}\ +\xd8'\xad\xcf\xc9\xec\xd6\x7f\x0c\xd7$\xfc\xd2\x120\xd5\ +\xff2\x063\x9c\xd5y\x1d\xc9{\x0d\xce>\xfd\xd7A\ +\x1d\xd8\xa2M\xd8\x85\x8d\xd4\xa7\xad\x0b\x8b\xdd\xd4\xa3\xcc\ +\xdaC\x9c\xb92=2\xc2P\x06\x96\xcd\xd0[\xad\xd9\ +|\x9d\xdb\x9e\x0d\xd8\xbcm\xd6g\x1d\xd2i]\xcf\x87\ +]\xcc(\x9d\xcc*\xff\xdd\xd4\xff<\xc2q\x0d\x01\xe4\ +\xab6Vp\x00x\xcd\xcd\xb4\x5c\xcb\x5c\xbd\xd9\x11-\ +\xd1\xba\x0d\xda\xa1m\xddh\x9d\xddH\x9d\xd8\xc6,\xdc\ +\xa9\xcd\xd8\xab-\xc2\xe2]\xbb\x0e`_U\xf0\xc6\xce\ +\xad\xd7\xd0\x8d\xdb\xd2\x1d\xd6\xbb\x9d\xd1eM\xdf\xbe\x0d\ +\xd2G\x0d\xdcl\xbd\xdf\xfc\xed\xd4O\x9d\xbe\x99`\xb2\ +\xf6\xa5\x0c\xb4\xad\xde\xcf=\xc9\x9b\xcd\xd9\xf0\x1d\xdfB\ +\xdd\xe0\x83\x8d\xdd\xa4-\xe1J\xed\xdd\xaa\xdd\xdf\x8e=\ +\x01\xa9\xf9bZP\x0a\x8f\x8c\xd9\xec}\xe0=\xdd\xd9\ +aM\xdd\x0c.\xd8\xd7]\xd8\xa5}\xd8\xf8\x8d\xda\xfc\ +\x5c\xe1\xc5\xed\xdf\x90\xf0a\x7f\xc6\x07\x00P\xdb\xb6\xad\ +\xd9!\xfe\xde`\xfd\xd9\xf2m\xe2?\x0e\xe1\x11n\xda\ +\x13\xbe\xdf\xc4\xfd\xcfm0\x97\xdf6\x05\x92`\xe37\ +\xfe\xd0\x08>\xceS.\xd6U\xee\xe3\xf5m\xdfZ\xbe\ +\xe5*m\xe4!\xfc\xda-\xf7\x08\xebm\xcb8\xee\xd5\ +:\xae\xe0\xf2=\xdf'\x8e\xe2\x86m\xd2\xdcM\xe4L\ +\xdd\xe5T@\x03Q\xff\xc7\x04\xa0`\xe0f\x9e\xe3h\ +N\xe2%\xce\xe6\x0f\x8e\xe5\xa5m\xd2C\xae\xdf\x14\xde\ +\xd4n\xb0\x9fxg\x01\x8ap\xe3y.\xe2\x8f\xbe\xe3\ +\x0b\xde\xe3\xbd=\xe9).\x07o\x9e\xdf\x8b\xcd\xd8\xee\ + \xd9xG\x00\x92\xd0\xde\xd1\x9d\xe0\xa4\xde\xe7V~\ +\xe5i\x1d\xe8I\x0d\xe7q\xfe\xc31\xfe}\xe4\xb0\x09\ +\x8a\xd0\xe8z>\xea|\x8e\xeb\x92\x8e\xeaYn\xe9\xbe\ +\xce\xc7\x13\x90\x04]h\x01\xa3P\xeb\xb6N\xe5B\xed\ +\xe7\x7fN\xe9\xa0\x00\xdc'\xcd\xea\xc9\x5c\x05?\x1b\x85\ +\xb9\xc0\x04\x0e\xe0\xe8\xc8\x8e\xed\x91~\xea\xd8\xbd\xeb\xda\ +-\xe8\x13\xce\x05@0\x8dE\xd0\x00R\x9e\xe6j\xbe\ +\xee\xec\x0e\xe8A\x0e\xef\xc6\xbc\x05~\x80\x03\x04Y\x90\ +\x89\xe0\x0e\xe9\xfe\xd9\xd9\xde\xe0\x0e>\xe9\xee\x0e\xdc\xc7\ +\xe0\x00?\xf0z\x03\x7f\x10\x17p\x0b\x7f\xcd\xe3\xa6\xbe\ +\xef@\xde\xedr\x90\x0d\xca\xa0\x05\x88>\xf1\x0b\x81\x03\ +L0\x0f\x06 \x07\x17\xad\xec\xcb\xde\xee-\xd0\x06s\ +\x90\x04'\x80t\x22 \x0f\xcc! \x06~@\x00\x99\ +`\xb0\x7f\xa0\x01\xc7\xc0\xd1\xb7\xe0\xc3[\xb0\x06`0\ +P'\x80^\xaf\x16\x10\x00!\xf9\x04\x05\x03\x00\xff\x00\ +,\x00\x00\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1c\ +H\xb0\xa0\xc1\x83\x08\x13*D\xc8\xeb\x19\xae\x04\x01\xc8\ +\x192\x93!\x03:\x14\x18Q\x0c\x19\x22H\xc7\x02r\ +\xc9/M\x12\xe8\xc7\xfeF;n\xbbxi\x86\ +\x95x\x9duU\x1eX\xe8\x91e\x96q\x87\xa1\xa6\x1a\ +s\xef\xf5\xe3\x83\x0f@\xf8`\x0c[\xf6e8Pu\ +\xd4P\xa3_\x02<\xf0\xe7\x9fe\x00ff\xd5L\x04\ +\x92\x07\xdcyb\x0df\x9ci\xa8)\xc7\x1c1\xf0Q\ +(\x8c0'\x08c\x8c+\x1a\xda7\x8b3\xb2t\xd8\ +\xe1\x87\x22\xd6\xf6\x9fwy\xa1\xa8\xd5o\xe6\x0d\xe7\xe2\ +q1\xb6\x17\xa1\x84@\xdcxB0b\x9c0D\x8f\ +\xd2E&\xcb\x97B\x12\x99\x9d\x91\xb8!)\xe0\x80\xe3\ +1\x89`\x8b\xc5A)\xa3{5\xfa`\xe5\x95b\x88\ +a\xc4'|p\xd9\x18,\x0e\xe1\xd2\x0b\x98a\x82X\ +\xe4m\xdc\xe5\x96Wxi\x1a\xb8\xa2\x93m6\xf8&\ +\x8dTZ\x89\xa5\x9dF0\xa1\x85'\xae\xe9\xe9TK\ +\xb8t\xfa'\xa0\x1e\xee7&\xa1$\xea&`o*\ +6\x99\xa0Yn\xb2\x07a\x9csN\xffZ\xa9\x16Z\ +P\xa0\x05:\x9aR\x17\x88-\xb6t\xea\xe9\x97\x8e\x04\ +\x1ab\x7fdr\x07\xe0w\x88\x16\xf8Wp\x81=\x09\ +cr\xedAj#\x8e\xb2ZJ+\x05\x144\x02H\ +\xa6\xb9\x9e\xf4E.\xcd\xf0\xda\xab\xaf\x9f\x06z\xdd\xa8\ +e\xeav\x22\xaaj2\xcb\xa6z\x0e\xb6\x07\x9f\x847\ +R[\xe7\xac\xb5f\xdbH#\x14\xe0\xd0\xadI\xbc\xb8\ +\x02n\xb8\xb6HC.\xb0\xc2\xa2[h\x89\xa7.\xa9\ +\xa8\xaa\xe91\x18\xe5\xab\x91\xdak\xa7\xb5\xd8\xea\x0b\x03\ +\x0c\xc9\x80\xf0\xafB\xbe\x04\xec\x8a\xc0\xcd\x10\xec\xab\x9f\ +\xa0\x8aI\xecv\x86\x9e\xe9\xf0\xb2\x8c\x12\xb6^\xb45\ +Vi1\xbe\xd8\xee\xbb1\xc7\xc9\x08c\xcb\xc7\x06\xc1\ +\xf2\xca+\x81\x8cL\xb2\xb8\x07\xcb\x12\xec\x90\xe7\x12K\ +\xaaT\xc8*\xa9\xec\x81\xc1%H\x9a\x9b\xaa\xc1)\xa1\ +\x9c7c\xaco#\x1b'\x93\x0c\x0b,P\xf0\x06\xd0\ +\x1b\xd62\xf4+F\xe7\x02.\xaf\x06\xff\x1a$\xd3\xe7\ +\x8e\xd8\xf2\xba6\xa9\xc9\xa2`\xf0\xba\xff\xaa\xf5\xb4t\ +^|\xad\xc6<\x8f\xcd\x82\x1a\xc9,\x806,\xbc\xd4\ +\xa2\xf6\xd0m\x97\xcc\xeb\xc9\x083]\xe4\x91Q\xf7\xa6\ +\xb7\x93\x84\x1d\x06\xed\x8c5Jz\xaf\xd7:\x17N\xb6\ +\x1a\xa8\x8f\x80\xc2\xc7\x8c\xf3\xd2\xf8\xe3l\x8f\xfc\xf6\xe4\ +r'\xecte\x0c\xe3\x9d\xe6_{?\x89\x5c\xd6\x11\ +\x02>\xfa\xe0\xfb\x82\xcd\xf3\xe9\xa9\x8f0\x82\x15\xdd\xb6\ +\xee\xfa\xebkG\x0ew\xd2\x81^^\xa8\xba\xc9\xe2\xc4\ +{\xb3W?\x9b\xb5\xb4\xa2\x0b\x9eo\xe9b\x93}\xb8\ +\x1a\xca+\xff\x82&\x9a\xc2\xf2E\x0c\xcf\xbb\xee\xf8\xd0\ +E\x93lr\xedL\x0fKf\xa9S\xe9\xde\xd9\xf6\xef\ +:\xce\xe7\x82g\xb3\x13\x0co|\xc6+\x1f\xf2\xd27\ +\x82\x178\xd0c=\x9a\xc5\x17&\x08\xbf\xf8\xcd/v\ +G\xa3\x1d\xca\xe6\x16*\x85\xddMj\xda;\xd0y\x04\ +\xc3*\xcf\x01\xaff]\xbbV\xf1\xc2f\xb8\xe4\xa9\xcf\ +\x81S\x98B\x0844\x0bX\xb8\x8f\x82\xf1k\x5c\xf4\ +dG\xb0\xb8\x95\xcbrcJW\x92\xff\x96\x04@\xbe\ +\x19\xe7w\xa0\x9b\x90\x95\x0e\x98\xb3\x04\xb6\x10}\xe9s\ +\xe0\x0bb8\x85\x14l\xc0G\xbe\xf0\x85\x0doXA\ +\xf9\xc1Nz\xe3\xda`\xf5Vv\xbd\xa9\xf0\xc1\x03\x09\ +\x90E\x10\x5cQ\x8b/\xc0b _x\x85-\x1c\x11\ +\x80\x05\xa0#\x042C\x8d\xbc\x22\x158#\x10\xcf\x89\ +\xc8\x83b\x03a\x18\xc3\x14\x18\xd2\x0c\xd3\xd1\xc4,f\ +\x91\xc5-\xe2\xf0y\x17\x8c\xdd\xc04\x98\xb2\xa6\x15+\ +\x01\xb6\xe0\x85R\x5c\x11\x80\x0c\x80\x00Z\x7f[\xa2\xf8\ +r\xc6\xc2@F\x91\x90U4d<\xa6\x10\x00\xd8\xf0\ +\x81\x157X$#\x1d\xf9>\x0b>\xae~\xb3\xf3!\ +\xa0\xf4\xa3\xbf\x04\x04A\x93o\xb1\xc5\x024\xd1\x1c>\ +\xca\xea\x8f\xa5<\xdf)\xa7X\xc8\x14\xf8!\x1e\xd0|\ +\x01\xb7\xe0\xf2\x8a\x15\xdc\xe0\x9a\xb2\xd4\xa2\x0d\x1f\xe9E\ +\xc8\xf1P\x83\x7f2\x17.\x80\xf9\x1a\x5cd\x00\x10\x5c\ +3\xa0\xe0\x9a\x98L\x17J\x91\x8a\x86|&4\x7f\xf0\ +\x03\x18|\xc11&\xb8\xa6>c9\xff\xcbm\xd6\x12\ +\x92\x8f\xe3\xe1\xfd~H\x0dW\xf8\x22C_\xe0\x83\x0b\ +\x02G\xbav\x0a\xf2\x9d\xcd\x94'=\x7f\xa0\x07=\x90\ +\xa01\xc9\xd8\xe7>\x17\xa9M.Zp\x87\xb3;\x18\ +.j\xa1)_\xf0\x81\x04\xeb\xd4\x98\x02]8Hx\ +:s\x9e?XBE\xf5`\x81-\xb9e\x01\x18H\ +\x85F\xf5\xc9QZvQ\x87\xde\x0ci\xa7\xe8\xd3<\ +q\x9c@\x85\x09\x5c\xe0)]*\xd1\x98\xce\xd4\x02\x16\ +\x88\x07c\x9c\xf2\x85[\xa4\xe2\xaa;\xc5f?=\x0a\ +I\xfa}S\x1a\xce8(\xda^\x11\x02R\x1e\xefp\ +\x0cD\xa5*a\xfaT\xa8Z \x09\xd6hK\x12\xae\ +JW\x9d\xee\xb4\xa7\xfe\xec\xe2\x05y\x98\x8b{\xa2\x8d\ + \x01\x08\x06\xd8V\xfaPf\xa6\x12\x9a\xf1\xa0g[\ +\xdf\x9a\x84$\x14\x01\x82K\xd1\xc1)\xeaJ\xd7\xac\xe2\ +\x95\xab\xd0\x8b\xdd+f\xf1W\x83\xd4\xe2\x09\x84]j\ +3\x11\xeb\xd4\x8a\xba\xb5\xb1\x8e-\x82\x05\xa8\xc1\x946\ +\x98\xc2\x14\x94\xc5\xaae\xfb\xc9\xcd\x0b\xff\x92\xb3\xb3\x06\ +\x11\xc4\xd8\xdci\xd8\xb5\xd2S\xa6\xa6elj/q\ +\x89D\xc0`),x\xedkc+[\x8d\xe2\xb5\xb6\ +\xb5x#n\x13\xf2\x86F\x14\x16\x9eM\x05\xeei\x1b\ +[\x84\x22\x147\x11\xe05\xc6Jp\x81\x05\xe5*\x97\ +\xb9\xb3\xd5&7\xc5:\xdd\x84\xe0B\x0b/\xc4.[\ +\x83+\x5c\xef~7\x112\x90\xc1\x0fH\x9a\x92a\x98\ +\xd7\xbc\xe8\xbd+m\xdf\x17\x03\xce\xb6w!\xae0\x82\ +Z\x9b\xdaV\xd4v\xf7\xbe\xf8\xcd\xef<\x5c\xa0\x92m\ +\xfc\xf7\xbf\x01\xde\xe8\x80\x0d|\xe0\x85\xd4B\x0c\xf2M\ +\xacv\xa1\xea`\xe2\x827\xc22\x98\x07\x14\xa0\x90\x88\ +i\x92$\x13\xa4\xf8\xc5/.|\xde\xd8\x0aX\x9b\x1d\ +F\x89\x16\xd6*b\xfar\xd7\xbb'\xceo~W\x0c\ +\x85,d\xa1\x1d(\x89\x05)\x96,c\x1a/\xd7\xc6\ +\xce\xf5\x05\x87sL\x12W$c\xbe4\xad\xaf\x89\xc1\ ++d\x15\xaf8\x0bNp\x02\x19N\xc2\x85%\x9b9\ +\xc63v2\x94\xf5\xc9\x8a)S\x99\xff$\xb8\x18\x81\ +b\xb3\xcc\xd8\x07\x07Y\xc2D\x06s\x98\xc3|\x02\x93\ +\xa0\xe1\xccgn2\x8d\xd7\x5c\x81'\xbc9%\x1e\x88\ +GpK|\xe7\x14\xe7y\xcfa\x1e\xc60\xc6\x5c\x12\ +@[Z\xd0\x17\xb6q<\x0e\xad\x92\x0dd\xf9\xc7\xf7\ +\x15r\x9e\xf5\x1ciIK\x1a\x10$\xe1\x86\xa5W\x9d\ +\xe6L\xd7\x95\x16\x9c^\xc9\x09\xea\x1cj<\x17\x99\xd4\ +N0\xb5\xae\x8b@\x12B\xf8z\xd5\x80\xc64\x86S\ +\xa1\x00\xd6\xc6Z%Spl\xad\xbdldH\xeb\xfa\ +\xd9\x04`^B\x1a\xe0\xebj\x13\x02\xd8f\x16\xf6y\ +\x89q\xec\x95\xe0\xa0\xd62x\xf4\x9e\x9f\xadk\x02\x98\ +\xfb\x05\x0a\xa9\x80\xba+`\xedkc\x1b\xcd\xff]C\ +\xb7\x95r\x02\x14\x8b\xbb\xd4\xe4\x1e\x86\xb9\xcd\xbd\x89M\ +\xb4\xf2 \x9cX\xf7\xba\xdb\xfdnx\x9bB\x15g\x9b\ +\xb7J\x9aa\x01G\x17\xd9\xd9\xf9\xde7\xbf\xfb\xbd\x89\ +~ \x84\x03\x02\xcf\xb8\xb5\x0b>c=(\x5c)\x9a\ +\xf82\xc4\xc9-q\x8a\x9b<\x09\x07\xff\xd1D\xc6W\ +\xce\xee\x8d\x03\xbb\x0c\x1f_\xca\x0fF\x0e\xed}\x9b\xbc\ +\xdfG\xc8\xf9\x11\x0e\xc2\x00\x96\xfb\xdc\xe5\x80NF\xcc\ +\x95b\x0c|\x97\xdb\xe67\xd7\xb9\xd2\x85a\x10E\xf8\ +\xfc\xe9@'\x05\x02\x86.s\x92#\xdd\xe4JW:\ +',`\x90\xa7{]\xdd\x1b\xa7\xfaR4qt\x02\ +\xdc|\x13Y\xd79'\xd6\xce\x89\x07$\x80 )\x10\ +\xc1\xd7\xbf\xee\xeb\x08\x88})\xe7(9\xd6\xd3~\x04\ +\xb6\xb7\xfd\x01\x807\xf4@\xdc \x82\xc2\xcb}\xee>\ +g\xc0\xdd\x95\xe2\x03\xb3\xef=\xedl\x07\xbc\xe4%\xcf\ +\x02\x82\x08\xc0\xf0\x98?<\xe2\xd5\xbdx\xa5\x04\x80\xe2\ +|\xef\xfb\xda'Oz\xc0SZ \x99O\xbd\xe6\xbd\ +\xbe\x82\xce+%\x05\x90\x8f|\xe9g\xaf\x8c\x84\xabA\ +\xf5\xb8_}\xc6Q\xeez\x95xB\xed\xa3\x9f}\xe9\ +\x95A|\xe2\xb3\xef\x1f}\xc8\xbd\xf2u\xdf{\xa5\xc8\ +^\xf8\x92/\xbe\xf4\x89o\x04\x81\xb4\xe1\x1d\xd8_~\ +\xee+0\xf5\xe6\xab$\x09\xd0\x7f\xc0\xff\xf4\xc7_\xfc\ +\x14\x08$\x02\xd8O\x7f\xfa\xb5\x8f\xf9Lx_%b\ +\x18>\xf9\xe7O\xfca\x08$\x16\xb1P\xbf\xfe\xd7\xaf\ +|\x0a\xbc?%\x1b\x00x\xf47\x7f\x0cP\x80\x06\xf8\ +\x0f\x87\x80\x7f\x0a\xa8\x80\xfb\xa7\x7f\xa9\x97'\xff\x87\x12\ +\x03(}\x06X\x81\x15\xa8\x03\xc9\xb0\x80\x1a\xa8\x81\x0d\ +\x98~X\x10\x81)\xe1\x04\xe4g\x81$H\x82!0\ +\x08\xa7\x90\x82)\xb8\x81,\x88\x7f\xea'\x01 \x88\x12\ +/\xa0\x0c%X\x835\xe8\x03\x03\xa0\x82:\xb8\x83\xa7\ +\xd0\x82\x0a\xa8x1h\x12b`\x83%H\x05T\x00\ +\x06H\x98\x84\x8d\xe0\x06<\xd8\x84N\xa8\x80\xe6\x17\x84\ +%\xf1\x015h\x84Ix\x85X\x88\x84#\xd0\x00N\ +\xd8\x85M\xc8tRH\x12Cp\x84YX\x86f\x08\ +\x06K\x80\x08^\xb8\x86*\x18\x86%\xc1\x07g\x18\x87\ +X\x98\x08\xc8\xb0\x0bvx\x87w\xc8\x86m\xe8\x86\x0b\ +\xc1\x03r\x88\x85\x05\x10\x88\x82\x18\x88{ \x00\xabp\ +\x88\x88\x88\x87\x8a\xb8\x88w\xc8\x87$\xff1\x88\x90\x18\ +\x89\x92\x18\x88\x0f\x80\x0a\x88x\x89\x98\x98\x89\x99\xe8\x88\ +\x0b1\x89\x9e(\x89\xca\xa0\x89\xa28\x8a\xab\xc0\x89\x0a\ +\xf1\x89\xa88\x88\xa4\xb8\x8a\x97h\x8a\x09\x91\x09\xb0\x18\ +\x8b\xb28\x8b\xb4(\x8b\x11\x80\x06\xb8\x98\x8b\xba\xb8\x8b\ +\xbc\x98\x8b\xae\x88\x10\xb5\x18\x8c\xc2\xc8\x00\x96\xd0\x8b\xc6\ +x\x8c\xbfh\x10\xb9 \x8c\xcc8\x8b\xca \x0a*\x10\ +\x8d\xd28\x8d\xd4X\x8d\xd2\x98\x8c\x06q\x01\xda\xb8\x8d\ +\xcdX\x8bG0\x0a\xd6X\x8d\x180\x8e\xe4X\x8e\x18\ +pE\xd8(\x10|\xb0\x8d\xec\xd8\x8e\xee\xe8\x8e\x85\xd0\ +\x06\xe68\x8f\xf48\x8f\xe98\x10(\xf0\x8e\xfa\xb8\x8f\ +\x16\xf0\x08\xf5\xf8\x8f\xf48\x05\xf7\xf8\x0f.\xc0\x05\x06\ +\xc9\x05;\x90\x90\x09\xb9\x8f\xee8\x05\x5c\x00\x90\x109\ +\x8e\xf5\xf0\x00\x03I\x01\x07y\x91\x18\x89\x90\x0a\xb9\x90\ +\xec\x98\x0c2\x10\x91\xe5X\x0f\x229\x92\x22\x09\x09\x03\ +\xb9\x04\x19\x99\x92*\xa9\x91\xc2\x00\x03\xf5H\x920\x19\ +\x93\xf5\xc0\x01\x03\xc9\x00\x03p\x93+\xff\x99\x93\x06\xe9\ +1\x18 \x93>\xf9\x93\x03y\x93B9\x94\x03\xa0\x93\ +\x17)\x084\xf0\x93J\x19\x93\xf7\x88\x09s0\x07D\ +\x19\x95B\xb9\x92\xac\xa5\x00K\xa9\x94u\x90\x95@\x98\ +\x8c\xc9\x10\x0a^\xf9\x94O)\x95bi\x90` \x10\ +\x12p\x950\x99\x95Y\xa9\x0al\xd9z\xd8x\x04^\ +\x19\x97q\x09\x96P)\x96B\xc9{\x0cp\x95j\xb9\ +\x96l\xd9\x97l\x89\x8d\x01 \x97\x82)\x97t)\x96\ +\xc7\xf5\x0f\xc9\xe0\x93{Y\x07~\xd9\x98}\xf9\x03\xc9\ +\x08\x04&0\x99&0\x98\x96I\x97u9\x00\x82\xf7\ +\x0f$\xb9\x98\x8e\xf9\x99\xc0\x00\x0c\xdf\xd0\x00\xc9\xe8\x04\ +\x94y\x9a\x96\x99\x9a`\xf9o\xff@\x04{\xf9\x99\xa0\ +)\x9a\xdf0\x9b\xdf\x80+\xa6H\x0ek0\x03\xbay\ +\x9a\xa8\x99\x9arY\x96\x03Q\x03\xb0\x19\x9b\xb4Y\x9c\ +\xac@\x00\xae\x08\x03k\xb0\x9c\xb9\xb9\x9b\xbc9\x99\xbe\ +\x19\x0aQ(\x10/0\x9c}\x19\x9a\xc5i\x9c\xac\xc0\ +\x0aD\xe0\x8a\x17\xc0\x9c\xe0\xa9\x9b3\xff\xf0\x9c\x949\ +\x98\xa8F\x10\xb0\x19\x9a\xb2\x99\x9d\xdf\xb0\x9d\xee\xc9\x0a\ +=\xa0\x06\x9c\x08\x08\x06`\x00\xe0\x19\x9e\xe2I\x9e\xd0\ +\xe9\x95\x097\x10+\xe0\x97\xea\xc9\x9e\xb3\xf9\x9e\xee\xd9\ +\x03=\x10\x01r\xc0\x89\xcaP\x9f\xf5y\x9f\xf89\x9e\ +\xfaI\x91\x05\xb1\x09\xaa\x10\xa0\x02\xda\x9e\x04\x0a\x9f\x11\ +\xb0\xa1\x1b\xea\x7fn\xf8\x01\x0c\x1a\xa2\x0e\xfa\xa0\xcf\xd9\ +\x08\x07\xb1\x9e\xec\x99\xa1\xf0y\xa0\x1c\xca\xa1\xa0\xc0\x87\ +\x0cP\x035\x10\xa2\x22:\xa2\xcb\x99\x9f\x93\xa9\x03\x07\ +1\x0a)\xaa\xa2\x06\xda\xa2@\x8a\x0a\xe8&\x85\xfd \ +\xa3FJ\xa3\x0cj\xa37\xaa\x9b\xca\x80\x10Y\xa0\x9d\ +\x19\xca\xa2@\xca\xa1\xa8P\xa5\xdd\x17\x84\xa1`\xa4Z\ +\x8a\xa4\x0d\xaa\xa4k\xe0\xa1\x06\x81\x0e\x18\x1a\xa5R:\ +\xa5\x11P\xa5U\xca\x0d\xdcP\x00A8\x05%\xf0\xa6\ +Zz\xa4\x5cj\x9f#J\x0e\x09Q\x05dj\xa6T\ +\x8a\xa6\xa8\xa0\xa6j\xea\x091H\x09\x94\xf0\xa6p\x1a\ +\xa73:\xa7\xf7)\x03\x0b\xf1\x9e?\xff\xaa\xa7g\xca\ +\xa7~\xaa\xa6\x02\xb0\x02S\xe5}\xb6p\x01\x8f \xa8\ +\x83J\xa8\x86z\xa8\x5c\xca\x9c\x1f\xb0\x10\x08\xd0\xa8\x8e\ +\xca\xa7}\x1a\xa9\xc5 \x00\xaa:\x00\xff\xf7\x03\x8f\xf0\ +\xaa\x99*\xa8\x9c\xda\xa9sj\x00\x17@\x12\x97\xe0\xa8\ +{\x9a\xa6\xa8\xaa\xaa\xbej\x09\xf2\xd9|\xfd\xe0\x00\xb0\ +\x0a\xab\xb2:\xab\x86\xca\xa5ZP\x12XP\xaa\x90\x1a\ +\xa9\xbe\xfa\xab\x96\xd0\x0d3\xe4z\x19@\x09\x0e@\xac\ +\xc5\x1a\xab\x9bZ\xa8\xc9\xca\xa0&`\x12\x0c`\xa6\xa6\ +\x1a\xa9\xdc\x90\xaa\xd1j\x09\x96\x80\x05\xecz\x00\x8a\xb3\ +x\x09`\x02\xb4@\x0b\xd9\xaa\xad\xc5z\xac\xc8\x1a\xa7\ +\xf5\x19\xac\xcc\xda\xa2\xe5j\xae\xd1\xaa\xaa\xea\xca\xae\x04\ +\xab\x01\x8b\xd7\x0b`\xe0\x06n0\xaf\xf5\xba\xad\xdcJ\ +\xa8%\xd0\xa95 o'\xf1\x00\x1b\xfa\xaf\xbd\x1a\xb0\ +\x03K\xb0\xec\xaa\x00Upw\xca\xa0\xb0\x0a;\xaf\xf4\ +j\xaf\xf7\x8a\xaf\x11\x1b\xa7\xfcj\x12\x0a\x80\xb1~\x1a\ +\xb0\x02\xb0\xb1\x1c\x8b\x05\x0aP\xb3\x00\xff@u\x9c\x00\ +\x00\x00 \xb2\x0b\xcb\xb0\xd9\xea\xb0\x9a\x0a\xb1);\xb1\ +\xc6v\x12\x97\x80\xa6\xe6z\xae0+\xb3\x1c[\xb35\ +\xcb\x08UP\xb4\xdd\xc6\x00[\xb0\x05:\xcb\xb3=\xdb\ +\xb0@\x8b\xb2\x11\xbb\xac*1\x0aI\x8b\xae\xe9\xca\xb4\ +\x04\xeb\xb4\x0a\xc0\x08\x8c\x80\x0cm\x00\x81\xb1\x16\x00\x17\ +\x00\x09Uk\xb5;\xcb\xb3>\xfb\xb3\xdb\xaa\xa9\xddz\ +\xab+A\x01\xe6*\xb6\xd2:\xb3e\xeb\xb4h\x8b\x0c\ +\x84\xbb\x02\xd2vh\xe8`\x00\x90\xb0\xb8q{\xb5t\ +[\xb7\x0e\xfb\xb0%\x10\xaaJ\xe1\x06j\xea\xb7\x7f\x0b\ +\xb84+\xb8iK\xb8\x84+\x09B\xf7f@\xb0\x05\ +\x10\xb0\xb8\x8c[\xb5\x8e+\xb2$\xab\xb5w+\xa8\x8a\ +\xca\x14\x8c\x80\xb91K\xb6\x1dk\xb6\x83\xeb\xb9\xc8\x90\ +\x06\xba\xcb\xa69\x96\x04\x10\xf0\xbb\xa5k\xba\x8d;\xb7\ +\xaa[\xb7&\x0b\xab\x06\xc0\x9aJ\xe1\x07K\xbb\xae\x9a\ +k\xb6g\xdb\xb9\x9e\xab\xbbi\xc0\x01\x1c\xd0\x00\x9b\xd9\ +Y\x1b\xb0\x06UP\x05\xc0\x1b\xbc\xa7\xff+\xb7XK\ +\xb2%{\xbc\x8f \x06m\x01\x01\xd2\xea\xbc\x80\x0b\xbd\ +\xb7\x8b\xbb\xd4k\xbdD@\x04\x12\xfaW\x16 \x01\xdd\ +\xdb\xbd\xdfk\xbap\x8b\xba\xc4[\xbc\xe5[\xac\xd1 \ +]N\x81\x00\xb3\xcb\xbe3\xeb\xbe\xd2;\xbd\xba+\xbf\ +\xf3K\x04+\xb0\xb2\xb9\xa2\x05n \x01\xf8\x9b\xbf\xfb\ +\xcb\xbf\xc3\x8b\xb5=[\xbe\xc4J\xb1n\xc1\x04\xb4\x1b\ +\xb8\x9c\x8b\xbb\x84\x1b\xbf\x1c\xf0\xc0\xf3\x8b\x00\x080\x01\ +\xe8\xab)\x80\xb0\x06\xee`\xc1\x16\x9c\xbf\xde\x0b\xbc\xfc\ +\xdb\xbf\xe2;\xbe\xc6{\x08\x8d\xc1\x00\x9a[\xbb%l\ +\xc2(\xac\xc2D\xc0\xc2,\xac\x08\xee`\xa2\x19\xf2\x0a\ +' \xc3\xee\x10\xc54|\xc1\xfa\x8b\xc3\x1a\xec\xbf\x1c\ +L\xbe\x0e \x90\x8eQ\x05\xcfk\xbb\x0b|\xc2E\xac\ +\xc2H\x8c\x00\x8ap\xc6\xd5P\x04:\x0a\x1b\x0b0\x05\ +[0\x01p\x1c\xc5\xee\xb0\x0c4l\xc37\xfc\xbb9\ +\xbc\xc1\x0d\x09A\xad)#@\xca\ +\xfa\xbc\xcfl\xad\x08\xaa\xec\xd6+\xcd\xd2.\xfd\xd2\xa0\ + \xd93}\xd7x]\xd1\x17\xcd\xd7Q\xec\xd7`\xbd\ +\xd1\x81\x1d\x0ch\xe3\x03\x8a\x80\xd6G\xad\xd6\xfc\xdc\xcf\ +K\xad\xd2\x8d\xed\xd8Q-\xd5\x91\x1d\xd3\x0e\xfd\xd0\xb0\ +\xfd\x07\x96\xad\xce\xeb\x9c\xd9\x97\xbc\xd9\xbf\x0c\x09\xb4\x90\ +\xbd@\xb3\x02Fm\xbdj\xbd\xd6\x89\xff\xdd\xd6\xa8\xdd\ +\xd8O}\xdc\x09M\xd7\xc7p\xd5\xcdm\xd9z\x8d\xd9\ +\xbb\xfc\xd5T\xbc\xd15\x90\x01\xd3\xe5\x01\x90\x90\xd6F\ +\xec\xdd\xdfm\xda\xd0\x1c\xcdo=\xde\x90\xdd\xda1}\ +\xde\xcc]\xd9\xea=\xdb\xb4=\xdd\xb7\xdd\xd3\xc0y`\ +\x9cp\xd4\xf7\x8d\xdf\xc2\xad\xd8\xa8\x9d\xdaN\x1d\xd7\xff\ +m\xde\x93]\xd3\xb1\x8d\xd3{-\xdd\x08\xfe\xde\xde\xbb\ +iTf\x04\x07\xd0\xdd\xc1\xed\xcc\xfa\xbd\xca\xfcM\xe1\ +\x15\xbe\xda\xc8\x0d\xe0\x0c]\xd7\x94\xad\xd5y\xbd\xde\xd1\ +-\xdd\xb6\xfd\xde\xb4p\x9e\x87\xf6\x08\xa4]\xda\x89\xbc\ +\xd8\x8c-\xde\x16\xce\xdat-\xe3\xe9]\xe3\xd0\xed\xd5\ +\xee}\xc1\xca\xa0\xbc\x87\xf6\x02\x88\x90\xd4\xf9}\xda+\ +\xce\xe2\xfe}\xe11\x8d\xe4\x04^\xe36\xae\xcb\xed=\ +\xc7S\xec\xd9\x1f\xb7\x005\x00\xe1\x11\x0e\xde+^\xdc\ +Yn\xe4[>\xd9I\xae\xe4\x1d\xee\xe14\xfc\x00v\ +:tF\xa0\x01\xfc\x8c\xe2A>\xe1l^\xe4n\x1e\ +\xe3p\xae\xe1\xce-\xe7s\x1e\xe6\xee\xffP\x03\x17\xb5\ +xKp\x00I\xcc\xe7\xfb\xad\xd2,\xee\xd8\x8f\xad\xe5\ +\x82\x8e\xde\x84\xae\xde_\xce\xe4\x10\xa0\x06\xdc\xdcy\x01\ +\x90\x056\x00\xe9\x91N\xdcD\xee\xe2s}\xe4\xcb\x8d\ +\xd5\x99\xee\xe5K\xae\xcbU \xe2\xff\x17\x0d\x07\xe0\xcf\ +B\xfe\xd6\x94^\xe9\xc8\x9d\xdc\x97\xfe\xda]n\xe8\x98\ +-\x01z\x00\xe5\xad\x0a\x0d}\xee\xe7\xa7\x8e\xea\xe5\xfd\ +\xe6\x83\xae\xd5\x9a~\xd1\x00\xa0\x06R+\x85bP\x03\ +\xa5>\xe4\xaa\x0d\xe8\xa9\xce\xec\xbe\xfe\xeby\x8d\xcb\x99\ +`q\xbf\xe8\x05\x16\xd0\x06\x92>\xe9m\xbe\xeb0n\ +\xd5\xcdN\xe35\xfe\x08\x5c<\x90\xc6\x90\x04U\x80\xeb\ +\x94~\xdc\xea~\xe4\x02n\xd7\xad\x8e\xce5\x90\x026\ +5\x90\x05\xc1\x07\x8dP\x00\x0d\x90\xed.\x9e\xef[\xbe\ +\xef3\xae\xd5\x10p\x04Fp\xe7\x02O\x12b\x90\x08\ +&\xf0\x07\x80\xae\xf01\xce\xf0\x10\xed\x0e\x17`\x01@\ +0\xf1Nq\x02S\xe0\x04``\x02\x000\x01m\xf0\ +\x07\xad\xdd\x00\x95\xec\x00\xa1\xa0\x0c2\x080\x02LG\ +\xec9\x16\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\ +\x00\x00\x96\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\ +\xc1\x83\x08\x13*D\xf8\xa5V.\x5c\x8e\x12\xbc\x09@\ +\x8e\x06\x8d\x05\x181\xca#G.@\x02YMx-\ +\x1cI\xb2\xa4\xc9\x93(S\x16\xfc\xd2\x09\x175\x1e\x01\ +bz\xf0\xc0\x91\x06\x9f\x9b\x18q\xe8\xd4\xe1E\x90\xcf\ +\x0c\xe8\x86d0\xe4\x81\xda+\x95H\x93*]z\xf0\ +\xcb+\x97\x09$\xbe\x99(sf\xc5\x9b|r\xee\xec\ +\xf93\xe8\x10\x14`\x8d\x0d\xc1\xf1\xe6(\xd3\xb3h\xd3\ +\x0a\x8c\xe1\xcc%5jQ\xa5R\x0d0\x93&9\xac\ +Zq\xf0\xf4)\x08\xe8\x90\xafa\x8dm\xd8`\x05\x05\ +\x8d j\x13+\x1e\x09\xebZ\x93^\xb2d\xbd}\x1b\ +u\xea\xdc\xba\x1c\xf1.\xd0\xa9\x97k_\xaf`Q\x18\ +\x13L\xd8J\x88\x10\xc6\xf8\xe4Z\xccZ\xf1,^\xae\ +p\xc9\x86,\xcb\xd1\xe4\xa8<,W\xb5\xab\x99\xf3\xde\ +\xbe~\x01\x8f&m\xc5t\x08M\xc8Q\xbc\xf9\xd2\xba\ +yR_\xb5\x9a\xd9\xb2%{v\xe4\xdb\x09rO\xdd\ +]\x13\xe7\xe6\xad]A\x8b\xff&]\xfa4r\x10\xe8\ +5\x19\xaa\xe5\xbc=I_\xb0sI\x9f^\x9d6v\ +\xb91\xe9\xda\xb5\x99\xf5{\xe7\xae\x7f\x09G\x5cq\xe6\ +i\x82\xde\x13\x08>!\x88+\xee5X\x10|\x81\xb8\ +\xe2\x8a|\xf3\xd5\x17\x99m\x94\xe1WUw\xfd\xf9\xc6\ +Up\xa1\x8d6\x18\x81\xc7\x9d\x07\x02\x82\x1f|p\xc8\ +\x07\x82\x98\xe5`{1\xbc\x22\xa3\x84\x13\xce'\x8d\x85\ +\x92e\xa8]~V]\xd5!x\x9f\xfd\x15\xd8\x80\x05\ +\xa2w\xe2\x13)z\xe2\x89\x0b\x9e\x98\x11\xc3\x8b\xad\xc1\ +\xc2K-\xb5\xc8\x18a\x8d\x15Z\x97#\x5c\xd9m\xb7\ +\xa1\x8fZ\xe9\xf0\x1b\x88\xe3\x8dH\xa2\x89(\xaa\xa8\xa4\ +\x0b.\x00\xf2\x81\x07P&6\xcb\x17\xbc\xd4Y\xe5\x8c\ +\x12\xcaG\x9f\x96\xf7\xe9\xa6\x1f\x87a\x8e)\x9e\x88\xe5\ +\x95h\xe0\x91I.\xe9\x82\x12\x80\x00BB\x08\xb6\xc4\ +y\x96/1\xd4i\xe7\x9dW\xea\xb9'.\x90a\xc8\ +\xa5\x9f\x98\xf1\x17(_d\x12z\xe6\xa1i\x1e\xb2f\ +\x9b\x8d\x92@\x0c\x098H\xff\x9a\xd4\x9c_|Q\xa9\ +\xa5T\xe2\x99\x8b\xa68b\x07\xaaU\xa2~'&\xa9\ +A\x85Hd\x89\x07\x22\xf9\xc1\xaa\x8c:JB?\xd0\ +\x82\xd0\x8c\xac(\xcd\x02\x0b,\xb5\xd2\x89+\xa6y\xda\ +\xc8\xa7\x8e^\x86\xea\xddN:\x00(\xa0\x99E\x82 \ +E\x9a\xab\xb6\xea*\xb4>\xf8@\x0c9\xd4\x964\x8b\ +/\xd7bk\xab\xa5S\xde\xd9m\x96\x9c\xd6\x06\xeee\ +4\x05K\xae\xb9\x81\xa1\x8b,\xa2\xcb*\xda,\x09\xcf\ +\xc2\x0b\x840\xc2\x18S\xafB|\xac0\xcb\xbd\xf9\xd6\ +zk\xbfVv\xbb\xa9}\x19z\xf9\xa7\xc1\xff\x05y\ +n\xa1h*\xdb\xae\xb3\xd0\xf6\xe3\xc3\xc4\x14\x9fp\xc8\ +j\x17\x17\x04B\x0f7\xdc\xb01\xbe\xfaj{\xa9\xae\ +\xcd\x00|]\xc9\xe1\x16P\x93\xf3@Z\xbc\ +\xd3s\xcf\x1bw\xbc/\xae!\xd78\xb2\xc0\x9f&\x9d\ +\xd9\x8f\x82\x0a)\x9a\xc2-'\xca\xa6\xbb1W-\xcc\ +\x09W\x8b\xa17\xbd9/\xffa\xca\xd7`s|\xad\ +\xc7\xdb\x12=\xdd\x8d\x01\xe7\x88\x9b\xdaw\xb1\xfda\xb1\ +e\xb2l\xe0\xbar\xb3\x0a\xf1\xd42\xd3\x8cw0z\ +\x1ba\x04\x13\x82\x5c\x0cE*\xa9\x00\x1e8\xd0\xd9\xf2\ +{\xe7+\x22S'\xdb\xd1i\x7f\xb9t\xdb\x09\x97\x17\ +w\xc3\x8bJM\xb5\xe6\x9cw\xce\x84\x16Z\x0cA\xed\ +\x03\xa4\x93n\xba\xcf\x82\x13>4\xebf\xbb\x1e\xb0\xaf\ +T\xf58\xfb\x87n\x8bx\xea\x81\x95\xd3-q\xcd\xbd\ +\x8b\xf19\xf0ZP`q\x9c\xd3\x14o\xfc\xf1a\x0f\ +.\xf4\x9422\xcfk\xe2H\xf3\xb8v\x98\x5c\x0d\x0a\ +w\xb2r?\x8c\xb9\xdd\x9b\xfb\x0e>\x05\x00\xdc\x00\x94\ +\xe6a\x0a\xf3\x9d\xcft\xc9\xabU\xe1\xdcg4\xc5i\ +\x08X\x8eSYX\xd0\x15\xb7\x97A\x8cjV\xeb\x9d\ +\xe7\xfe\x07\xc0F4\x02\x05\x0e\xd2\x83)Fh\xc0\xd2\ +!0\x81\x1f\xcb\x15\x03m\x818\xc8\xdcfG'\x8b\ + \x88LU$\xa8\xe5\xceQu\xe3]\xe7\xbe\x17\xbe\ +\x0e6\x02\x060@\x87{\xffN@\x8a\x11\x92\xd0\x80\ +\xe8K\xa0\xea\x0c\xe7\xbaNe(\x01\x8e\xc0E3\x5c\ +Q\x0b^\xc0b W\x84\x8dK\x02\xb0\x80\x0c\x94\xe9\ +L\xf8\xb3\xe0\xfet\xe8=\x1e\x02\x90\x02\x1e\x04\x22\x0c\ +\x92\xc1\x87\xf6\xec\xc2\x88F,a\x12\xd5'4\x15J\ +\xa8\x81 y\x05sTR\x8b\x04,\x00\x05\x04BS\ +\xfe`&3\x1fXMo\xde\xfb]\x0f\xd1\xf8C \ +&#\x19\x8dxCsP\xf1\x0b8\xc6\x11\x89\x08D\ +\xdd\xd8\xd8\xb7B\xea4A\x8fjq\x85\x07\x86p\x1e\ +\x14\xa9jn\x8e\x1a\xe3\xdd\xf2\x96H\xe0\x9d1\x8d\x8e\ +|$\x0b(\x10\xa9\xc5\x80\x82\x14\xa4\xa8\xa4%\x8fX\ +\xbc\x13jr\x81wlF-\xf6\xc8\x9a\x5c, \x04\ +.[\x92\xf6\xf8\xa7AE\xbe\xb2\x91k\x94%\x0bX\ +p\x82\xc5\xcc\x01\x97\xb8\xfc\x85.-\x89\xc9\xaf\xfdL\ +}dc\xdd+x1\x0b\x07y \x04\xa7\xb4\xdc\xf6\ +\xee\xd6LW\xfaP\x8d\xd2d\x81\x1a\xe6\xf9\x81\xc4\xc0\ +\x00\x9b\xd8\xd4\xe6.\x0bh\xff\xbe\x13\xaa/\x85\xc3\x94\ +U\x004a\xb9\xfdq\xcf\x7f\xee\x84e4\xa7)\xcf\ +y\x8e`\x04:PK\x1d\xf0\x99\xcfm\xc2\xb1\x9b`\ +\xfbe\x9d\x88I->x\xe2\x82\x99[\xe5\x0e9\xa8\ +\xd0x\xceS\x0d\x0f\x1d\x01\x0bp\x81\x16\x0dP\x94\xa2\ +\x16\xbd\xe4\x01\xbd\x89\xba\x18|\xa1\x9c[\xab\x05\x0a\xd6\ +\xc9J322\x96\xc9`\xe8IS\xfa\xd0`\xa0\x85\ +\x10H}i>\xf7\xd9O\xc0}\xf3\x0b\xbe\xd8ZA\ +\x12\xe0\x09C\xb2\x13\xa1\xef\x8cfP\xa7\xe9P\xa2\xbe\ +\xe0\xab\x02\x5c\x0a\x06\x90\x9aT\xa5\xe6\x92\xa9\xbdt\xaa\ +\xb5\xa4z\x10^l\xe0\xaa\xad\xec!,\x1f\xb9\xd5\xa1\ +z\xf5\xabS\x18\x81,\x942\x81\x0a\xf8\x95\xac\x840\ +\xab>\xb9\x99\xd6\x9e\x11\x02\xa7l=\x08\x0e\x84\x81\xd5\ +\x9fj\x95\xab]}\xe8W\xf1:\x85)\x18\x15)\xc9\ +\xf0\xabf+@V\xc1\xc6\x94\x9f\xe7\xeb\xc1\x13\x12\xab\ +\x90\x04\xf8\xc0\xa7s\xddjC\x89:\x82\xc9\xbe\xa0\xb2\ +\x95MA\x06\x90\x82\x8c\xcd\xffj\x16\xb0\x82\xdd\xa5\xf9\ +\x88\x10Q\xd2*\xc4\x16\xc4Hh#M\x8a\xd2\xbb\xbe\ +\x16\xb6)H\xae\x1aD\x82\x12'\xd8\xd6\xb6\x9dU\xea\ +gI\xb7\x02\x1e\xf8v$\xaf\x00DV\xa5iW\xc9\ +N\x16\xb6SHn\x0a\xe2\x11\x0f\x10\xa4\x04\x03\xcf\x85\ +nY_\xfa\xd9[\xec\xf5\xba#\xe1\x05 R\x0b\xd9\ +\xe2z\xf7\xb8\xb1M\xae\x1f\xc8\x1b\x8f)\xa4$\xbd\xe9\ +\x8d.L\xe1\xb8\x82\xf7\xc27\xbe\xfd\x88%d\x8d\x8b\ +\xdf\xf0\xa6`\xbf\xfc\xfd\xc1\x0f\x5cp\x12z\x008\xc0\ +\xeb\xc5\xa7>\x89 \xc9\x03\x97$\x10'\xe0\xae}[\ +K\xd9\xfc\x8e7\xc2\x12^\xc2\x0f\x0c\xbc\x90L\x88\xe0\ +\xc5\x17~\xae\x80\xf1\x89\x8a\xdez\xb8$\xb6\xd0\xc2\x82\ +S\xfa]\x13C8\x1e\x12\xfe\xc1\x12\xf4@d@\x94\ +\xa4\x1e/Nr\x8c7;cR\xc4\xe2\xc6)y\xc3\ +j\xef\x0b^\xfd\xa2X\xc8D&\xb2\x05\x96PK\x85\ +8!\xc9`\x16\xc1\x92o\x1bXl\xfa\x01\xca)\x19\ +\x82q\x91\x9b\xdc+\x0f9\xff\xcb\x16\x88\xb3\x05\xea\xb9\ +\x10\x01\x849\xccc\xe6lR\x1f\x81f\x95(\x81\xc4\ +\x0dn3\x8a\xdf\xace9'!\x09\xf1`.BX\ +p\xe7F\xe7\x99\x10\xc8\xe8\xb3J^\x01\x83\x12[\x99\ +\xbc)\xce\xb2\x1e\xe4l\x81C\x1f\xba\x08\xe3K\xc8;\ +\xde\xd1h<\x8f\x99\x04\x92V\x09\x0d\xd8|b c\ +\x19\xce\x86\xf6t\x11f\x9d\x0c\x85\x8c\xfa\xd6\xa4.5\ +\x8c/<\x83T#\x05\x10\x0e\x1e\xb4\xa6c\xfd\xe9Y\ +_\xe2\x12\x89HD\x87\x0d\xb2\x89X\xc4\x02\xd7\xa3\xd6\ +\xf5\xaem\xcb\x0a_#\xc5\x15#\x80p\x90\x87\x1dg\ +O'a\xd6E8v\xb2\x93m\xe4\x83H\xc2\xd9\xe8\ +\x86v\xaeKm\xdb\x1fX\x1b)\x1b\xc0\xf4\x0f\xb8\xdd\ +iY\x1b{\xdc\xc9\x96\x81\x0c\xe2\x81\x90S\xa0\xfb\xdf\ +\xea\x96\xb6_%\xf1\xee\xa4\xa8a\xde\xb0\xae\xf7\xb7\x8d\ +\x8dl|\xeb\xfb\xe1m,\x882NAq\x7f\xff\xdb\ +\xd9\xd0\x96v\xc1\x932\x84\x84\xdb;\xdc\xf8N\xc4\xc3\ +\xf5=\x8fy@\xa1\x1f\x06\xffAD\xc5W~q\x8c\ +\xe3\xfa\xce\xa5\xd8xRF@l\x86;|\xe4%\x87\ +\x82\xce\xa1\xe0\xee\x82\xac\xfc\xe7\x14oy\xc6\x93\xfc\x02\ +\x99\xc3\xfb\xe3\x0d\x1f7\xceM\xbe\xf3,8\xdd\x09Z\ +\x1b\xc8\x14\x80Nu\x8b\x03\x1c\xd7\x02`\x90\xd1U\x12\ +\x0f\x9b+\xfd\xe19oz\x16\x9c@v\xb2k\x82 \ +\x0e\xd8\x053\xaaN\xf5\x8b\xdfZ\x19[\xffu\xd2E\ +\x0ev\xa6C\xc1\xe9c/\xbb\xdea@\x10\x05\xec\xe2\ +\xef\x7fg;\xd0/.\xbc\xb8G9\xdfu\x17{\xde\ +\xf5\xee\x84a8~\x18E\x18\x88 VAy\xca\x03\ +>\xf0\x82\xafx,\xe4`x\xa4\x8c\x80\xe4v\x7f:\ +\xe3\x1b\xff\xf8\xd2\x0f\xc3\xba\xff`A\xe5Woy\xc0\ +\xaf]\xf0\x16\xe8\xbcJ\x9e\x10\xfa\xc5\xeb\xdd\xf4\xb8\x1f\ +\x86\x15\x04\x02\x06\xd6\xfb\xbe\xf5\x7f\x7f\xfd\xcfC'{\ +\x94$\xe0\xee\xb6'{\xee\x97?\x8cj\xfec\x02h\ +\x88>\x1a~\xef\xfb\xcbW\xbc\x03\xc5W\xc9\x0fn\xcf\ +|\xd3\x13\xe0\xfb\xdf\x1f\x81\xff@,!\xfd\xf2G\x9f\ +\xfa\xab\x07|\x01\xb2\x9f\x92vt\xdf\xfb\xe0\x8f\xff&\ +\x06!\x10\xf3\xdb\xbf\xfc\xe8_\x85\x16\xd8\x8f\x12ct\ +?\xfe\xf2\xb7\x09\x028\x80\x8e\xf0\x01*p\x80\x08x\ +\x7f\xf7\xc7z\xfc\x87\x12\xb2\x00\x7f\x008\x80\x128\x81\ +\x9b`\x060\x80\x01\x08\x98\x81\x19\xa8\x80\xe5'\x0a\x0d\ +\x88\x12\xe7\x00\x80\x04@\x81\x14x\x04&x\x82V\x90\ +\x08\x18\xb0\x82,\xb8\x82\x1a\xf8\x82\xe6W\x05\x1fx\x12\ +#@\x82\x13x\x828\x98\x83$\xc0\x05-\xd8\x83>\ +\x88\x81/\xa8\x02p7\x83%!\x0c7\x98\x83H\x98\ +\x84Z\xf0\x08?\xd8\x84M\xa8\x02\xfeE\x84$\xf1\x04\ +IX\x85G\xc0\x09X\x98\x85X\xc8\x02m\xe0\x84^\ +\xd8\x83Rh\x12I\xa8\x85d\xc8\x09\x0fp\x86h\xf8\ +\x00)0\x0a_\xd8\x86\x18\xb0{a8\x12e\x98\x86\ +tX\x87h\x98\x04DP\x0fz\xb8\x87|\xb8\x87_\ +\x18+qXZv8\x88\x84(\x03\x0a\xd0\x87\x88\x98\ +\x88\x88\x18\x88\x0b\x91\x0b\x84\xff\xf8\x88t\xe8\x04\x95\xa0\ +\x88\x94\x98\x88\x8c\xb8\x10\x90x\x86\xca\xb0\x89\x9c\xd8\x89\ +\xca@\x00\x95\x18\x8a|x\x89\x0a\xe1\x89\xa6x\x8a\xa7\ +(\x8a\xaaH\x8a\x09\x81\x8a\xae\x88\x8a\x96\xa0\x8a\xa1\xc8\ +\x8a\x08\xf1\x8a\xb6\xc8\x89\x9b\xa0\x00u\xb0\x8b\xbc\xd8\x8b\ +\xbe\xf8\x8b\xbcH\x8b\x06\xe1\x0a\x0cP\x8c\xc6x\x8c\xc8\ +\x98\x8c\xc6H\x00\x08\xf0\x8b\xaa\xf0\x8c\xd0\x18\x8d\xd2\x08\ +\x8d\xc2X\x10\xd4\xa0\x8c\xd8\x98\x8dY\xb0\x02\xd3\xd8\x8d\ +\xdeH\x8d\xd5H\x10T\x90\x8d\xe4x\x8c\x97\xe0\x0e\xdf\ +\x98\x8e\xd2\xe8\x03\xe18\x10`\xf0\x8e\xf0\x18\x8f`@\ +\x05\xf4H\x8e\xf1P\x02\xea(\x8d\xc0\xb0\x8f\xfc\xf8\x0d\ +\xdfPt\xed\xe8\x09\xf28\x90\x04)\x8fT0\x02\x99\ +0\x8d\xfc\xb8\x90\xfe\xd8\x90\x0e\xe9\x8f\x9c\xd0\x8e\xff`\ +\x04\x05P\x90\x169\x90\x8d\x90\x08\x0c\xf9\x90\x1c\xd9\x91\ +\xdf\x00\x00\x12\x99\x02\x050\x92$9\x92\x179\x90>\ +\xd0\x08\x1e\xb9\x92\xdf\xc0\x0a.\xf9\x92\x08 \x91\x9bP\ +\x924Y\x93\x16\xa9\x09O\xff\xc0\x92\xfe\xf8\x92<\xd9\ +\x93\xd5\x16\x8e\xd4\x90\x09\x99\xd0\x075Y\x94E\xf9\x8e\ +^@\x0e\x0f\xe9\x93L\xf9\x92=\xf0\x94\x11`\x04\xe1\ +h\x05BY\x95B\xd9\x07Di\x94E)\x10i\xd0\ +\x94L\xf9\x94=\x10\x01b9\x96C(\x8c\x14`\x95\ +hY\x95X\xa9\x95\x05\xf0\x00\x02Q\x05^\xc9\x0a`\ +\x19\x96cY\x97b\x09\x0a\xe1\x98\x05\x17\x90\x96|\xa9\ +\x96YI\x92=\xa7\x0c=9\x97vY\x98v\xe9\x05\ +\xd5x\x01\x8a\xb9\x98}\xd9\x98XI\x01\x02\x01\x03s\ +I\x97\x86Y\x99\xa8p\x99\xfcF\x8b\xc4\xb0\x03\x8b\xd9\ +\x99\x8a\xd9\x98ii^\xff\xe0\x05\x95Y\x9aby\x99\ +\xa8\x89\x0a\x13 \x8c\x89\xc0\x05\x5c\xb0\x03\x9c\xe9\x99\x9d\ +\x09\x9a\x99@\x10\x8a`\x9au\x99\x9a\xa8\xc9\x0d\xbc\xc9\ +\x0d\xb3E\x8a\x1e\xe0\x9a\xc2\xf9\x9a\xb1)\x9b\x8c\x89\x96\ +n9\x10\x06\x80\x9b\xbay\x99\xbd\xf9\x9c\xc3\xc0\x8a\x14\ +0\x9c\xd4\xf9\x9a\xc6\xe9\x99B\x09\x90\x021\x02\x86\xd9\ +\x9c\xce\xf9\x9c\xbdY\x0c\x02\xff\x80}\xa4\x08\x06\x03p\ +\x9e\xd59\x9c\xc5y\x9d\x146\x10\x0b\x90\x9b\xde\x09\x9e\ +\xcf)\x00\xf4I\x9f,p\x89\x9ep\x9e\xfa9\x00\xe9\ +\xa9\x9e\xeb\xb9\x98\x06\xd1\x0a\xde\x89\x0a\xf2\x19\x9e\xf5y\ +\xa0\xbap\x89G\x10\x0as\xb0\x9f\xfa\xd9\x9f\xc2\x09\x9b\ +\x8b\x99\x05\x061\x0c\xbaY\xa0\xbc)\x9e\x07Z\x9f\x96\ +\xd0\xa1\xfb\x17\x87 \x10\x0a\x22\xca\xa0\x0d\xea\xa0\x10\x1a\ +\xa1;\xf0\xa1\x04a\x05\xdf\x89\xa1\x1a\xba\xa1\x02\xd0\xa1\ +\x96\x80\x05Xp\x0bq\xf8\x05\x0b:\xa2\x22:\x07%\ +j\xa2'\x0a\x88\x05\xd1\x02.\x0a\xa3\x1c:\xa34z\ +\xa4\xe2'\x85$`\x02&\xa0\xa3#\xca\xa3\x0e\x8a\x9e\ +\xe9y\x04\x081\x0f\xf2\xf9\xa2\x1b*\xa3G\xba\xa5X\ +\x10sRx\x01L\xca\xa4N\xfa\xa4=\xba\x9f\xd4\xc9\ +\x04\x08\x91\x01\x06J\xa41\xda\xa1\x5c\xca\xa5\x0a\x00\x06\ +D8\x02k0\x03a*\xa6cJ\xa2Q*\xa5p\ +\x82\x10\x10\x80\xa5Y\xea\xa6oz\xa4\x0aP\xa8\x0ap\ +\x08\x1f\x88\x02k\xb0\xa83\xff`\xa7w\x9a\xa7z\x1a\ +\xa5I\xa0\x10\x14\xc0\xa6Z:\xa84j\xa8\x86z\x0c\ +\x1f\xc8\x00\x8b\xfa\xa9\x8dz\xa7M\x9a\xa7P\xba\x9f\xa3\ +\xa5\x10\x88\x10\xa8F\x8a\xa9X\xa0\xa9\x0a\xc0\x08\x8c\x80\ +\x0c\x17\xc0\x7f)`\x00\x06\xf0\xa9\x8c\xea\xa8\x8fJ\xaa\ +P\xca\x00#\x91\x04\xf4)\xa3\xab\x8a\xa9\xae\xfa\xaa\xb1\ +\x8a\x0c\xc8p\x9f\xc5\x07\x08\xb6j\xab\xb8\x9a\xab\xa2\x0a\ +\xa9;*\x06$\x81\x0c\x97\xca\xaa\xc5\x0a\xab\xc7\x8a\xac\ +eP|\x82\xb0\x06\xcd\xda\xac\xcfZ\xa7\xba\x8a\xa7c\ +\xca\x05,\x96\x10\x0f0\xac\x83Z\xac\xc6\x8a\xac\xf0\x8a\ +\xac- {\x5cP\x03\xf6\x1a\xae\xb7\xfa\xac\x8dZ\xae\ +\xa3\xaa\xa3\xb5V\x12\xdd\xc0\xaa\xad\xea\xaa\xda\x1a\xaf\xf0\ +\x9a\x06i\xd0\x06\x86\xa7\x0c\xf6\xda\xb0\xf8\x9a\xaf\xb8\x1a\ +\xaa\xd1*\xa2\x5c\x90\x00bH\xac\x04\x0b\xab\x06\x8b\xac\ +\x08\x8b\xb0\x1c\x00\x09F\xd7\x0c\x9bP\x02%\xd0\xb0\xf7\ +\x8a\xaf\xe3J\xae\xa2\xda\xa4\xffZ\x12\x01\xc0\x01p\x9a\ +\xad\x1a\xbb\xb1\x1d\x9b\x06\x1c\xff\xc0\x01D\xc0g\x05\xd7\ +\x0c\xd1@\x09\x94@\xb2%k\xb2(;\xae\xfbz\xa7\ +\x03\x90\x12I\xb0\xa52\xbb\xad\x06[\xb37K\x04P\ +\x0b\xb2\xef\xc6\x09\x8f\xf0\x08>\x0b\xb4&[\x03\x0f\x9b\ +\xb2\x12k\x02R\x99\x12-0\xb0\x19\xcb\xb4\xf1\xea\xb4\ +8\x0b\xb5P\xbb\x0c\xd6\x06\x06U[\xb5WK\xb2Y\ +\xbb\xb5\x5c;\x03\x0c\x10\x08*\xa1\x05K\xbb\xb1\x1ck\ +\xb6h\x0b\xb5\x08\x80\x00\xb7\x10VP&\x08\xa1\xe0\x00\ +\x0e\xd0\xb6V\xfb\xb3p+\xb4r\xab\xaf\xa7\xaa\x12\x8f\ +\xa0\xa9\x05\xab\xb7f{\xb6}\xfb\xb7\x08`\x03|w\ +c\xfd\xf0\x08\xb4@\x0b\x86\x8b\xb8o\x1b\xb4\x8c\x1b\xae\ +\xe3\x1ayJQ\x06\xc6:\xb34\xdb\xb17k\xb9h\ +\x8b\xb9\x7f\xab\x08\xbez`z\xe0\x06\xb8\xfb\xb9\xa1\xdb\ +\xb6\xa3\x9b\xb5Z\xdb\xb8\xa1\xc0\x14S0\xb9\x94\xeb\xba\ +O\xdb\xb7D \xbb\x08\xa0\x08\xcc\xdb\x06\xa2\x99X\xc6\ +0\x00\x00\x80\xbbn\xa0\xbb\xbb\xeb\xb6\x8aK\xba\x0e+\ +\xb7\xc2p\x16\x00@\xb6\x07\xff[\xb9\xc8\x9b\xbc\xb2\xcb\ +\xbc\xe6[\x0ag\xc0V\xbd\xf0\x03[\xb0\x05\xd3K\xbd\ +\xd6{\xb8\xbc\x9b\xbd\xda{\xb2\xe1:\x0fh\xc1\x07\x88\ +P\xbc\xc6\x0b\xbb~[\xbe\xe6\xab\x08\xa5P\x0a\x1dP\ +\x0d\xcaZ/bP\x02\x90\xd0\xbe\x00\xf0\xbe\xb9\x0b\xba\ +\xd7\x9b\xb8\xd9\xeb\xbb\xe1:\x00\xcb\xc6\x14b\xd0\xba\xfd\ +;\xbe\xca\x1b\xc0\x02L\xc0\x1d\xd0\x01\x88 \x01\xce\x17\ +'J\x10\x0a\x90\x90\xc2\x0b\xec\xbe\x0e\x5c\xbd\x10\x8c\xb8\ +\x12\x8c\xb5qk\xab\x8f\x8b\x16\x0fP\xb6\xe2\x8b\xbc\xca\ +\xbb\xbc\x01<\xc0!\x8c\x08@\x8c\x08\x10\x00\x99\x0e\x02\ +\x04\xa1\x00\x01H\xac\xc2\xed\xcb\xc2\xd4\xeb\xc2\x11\x1c\xc3\ +\x8b+\xb4I\x9a\x18\x90\xb0\xb7\x1e{\xbc:\xdc\xc1=\ +\x0c\xc2A\x0c\xc4\x07p\x00\x0d\x10{\xce\xf1\x02\x8fP\ +\x05U\x80\xc4\x10\xa0\xc2+\xdc\xc0M\xfc\xb9/,\xba\ +\xbdk\xb2\xd1\xb9\x18\x1e\xd0\x029\x9c\xc5\x00|\xbe \ +,\xc2A\xfc\xc5_<\x0a\xa3\xf0\x08j\x90\x18|@\ +\x01\x17 \x01\x12`\xc6g\xff\x8c\xc6j\xcc\xc0-\xec\ +\xc6O\xec\xb3\x13l\xaf\x15\xdb\x1c\xa5p\xc5\xfe\xfb\xbf\ +y\xcc\xbc\x03\xcc\xc5]\xec\xc7\x07\x00\xc8\xa3\xb0\x02+\ + \x01\xcd\xd7\xa7*\xd1\x0fE\x10\x0e\xee\xe0\x0e\x88\x9c\ +\xc8\x8a\x8c\xc6i\x9c\xc2K\xcc\xc6\xf0\x0b\xc1\xf2;\xbf\ +\x13l\x026\xc6\x1a\xc4\xf0\xba\x99L\xbe\x9b\xcc\xc9{\ +\xfc\xc9~,\xca\xa3L\xca-\xb0\xcc\xee\x90\x09z@\ +\x01\x1fPx\x05\xe1\x01\xe8\xf0\x04Z\xe0\x07\xca\xe0\x06\ +\x13\xb0\xcd\xad\xec\x0e\xcb\xf0\xca\xb1\xcc\xc8J\xcc\xc4m\ +\x8c\xcb0,\xc9@{v\xee\x81\xc5\x97\xbb\xc3\x1e\xdc\ +\xc9?l\xcc\x7f\x0c\xc8\xa4\xac\xcc-\x00\x0a\xa0 \x07\ +\xad\xd0\x0a\xb7p\x0b\xba\x90\x03\x1a\x10\xd0\x7f\xd0\x00\x04\ +M\xd0mp\xd0\xdb<\x01\xdd\xec\xca\x88\xac\xc8\x8b\x9c\ +\xc4\xe3l\xcb\xb7l\xb8\xb9\x8c\xbd?\xdb\xbd\x0d\x12\x0f\ +\xe3+\xcc\xc3\x0c\xcf|\xdc\xc7\xc7,\xca\xf5\xbc\x02\xcb\ +\x9c\xcf\xfb\xcc\xcf\xfe\x0c\xd0\x02]\xd0\x06\x8d\xd0\x09\xdd\ +\xcd\xaf\x0c\xcb\x0f=\xcb\xb4\xff\xec\xc8\xe5l\xcep\x8c\ +\xa6/R\x04\x1c\xac\xc5[\x1c\xc2\x1f\xed\xc5!M\xcf\ +\xf5\x5c\xd2\xfa\xbc\xcf\xfd\xfc\xcf\x01\xad\x01\x03\xcd\xd2\x07\ +\xed\xd2\x0a\xdd\xca\xdf\xdc\xd0\xe1\x0c\xd15\xdd\xc0\x8f\x1c\ +\xbf0\xbc\xb9P\x82\x87\xb1\xeb\xd3z\xec\xc9 =\xd4\ +#\xbd\xcc\xf7|\xd4\xc7\x90\xd4*\xcd\xd4,\xdd\x00O\ +\xdd\x06/\x0d\xd3Tm\xc6\xb2\xdc\xc86}\xd3\x14\xdd\ +\xb6\x5c\x1d'\x1a\xcd\xd1\xb3\xfb\xce>\x1c\xcfc\x1d\xca\ +\x22]\xd4F\x8d\xd4j\xbd\xd4M]\xd0o\x1d\xd7\xad\ +\x1c\xd3\x0e]\xd7\xe3L\xce\xb7\xfc\xc6**+j\xb0\ +\xc3<\xfc\xd3\x82-\xd4C\x9d\xcc\xf6\x8c\xcfG\xdd\xcf\ +)\xad\xd8m\xed\xd6P\x1d\xd5\x0c=\xd73\xad\xc6k\ +,\xd1\x0fL\xd1@\xb05\xfdp\x00\xc3\xfc\xc1\xc5,\ +\xcf\x84M\xd4\x86-\xda\x88\xad\x0bJ\xbd\xd2m\xfd\xd4\ +\x09\xad\xda\xab-\xd3\xad=\xd9\xb0\xfd\xc05\xf0\xbc9\ +\xb3\x01\xd5\xf0\xd7[\x9c\xdb\x83\xbd\xdb\xa0M\xd2\x87\xfd\ +\xdb\xc1\xcd\xd6\xc3\x9d\xda\x0b\xff\x0d\xd9UM\xd35M\ +\xd9\xb9k\x02\xc4\x97Xn\xe0\xc1\xc4\x0c\xd4]\xec\xd9\ +\xd6}\xddfm\xd2\xda\xbd\xd6\x8b\xcd\xd8\xc4\xed\xd8\xe0\ +\x1d\xde\xae\xed\xc8-\x9c\x9c\xd75\x0c\x80M\xdd\xeem\ +\xdd#\x8d\xdd\xbe=\xdf\xa6\xdd\xdd\xde-\xd7\xac-\xd9\ +\xcam\xcbQx`b\xd0\x02\xc4,\xe0\x03\x8e\xcc\x05\ +^\xd2\xf2\x9d\xd6\xfe\xbc\xdd\xf5\xdd\xd2\x0b\xfe\xd8\xe0\x1c\ +\xd9\xe2\xfc\xe0y\xe0\x09}V\x02\x1f\x0c\xd4A\x8d\x08\ +\xa0\xfc\xdee\xad\xe1h\x9d\xd4\xba\xb0\xd4\xdc\xed\xd4\xf7\ +\xcd\xcd\x0c\xde\xe0\x0e\xbe\xc2\xeeK\xa5\x92\x16\x03#\xb0\ +\x02\x16\xee\xe2\xa0\x8c\xe11~\xd6\xa3M\xe36\xfe\xe1\ +\xa8\x9d\xda\xc6\x9d\xdft]\xe2\xb4\xfc\x08:mmk\ +\xd0\xd9\x17\x8e\xe4\x86}\xd6'M\xda\xc0\xdd\xe4N\xde\ +\xd8\x8e}\xdc\x0e=\xd3\xe2M\x00\xa8\xfcnb\xd0\x00\ +\xedm\xe4\x9f\x0d\xdf2\xfe\xe5\x89\xad\xd8c\x9e\xe3Q\ +.\xe5\xb2<\xcbkPn!\x1b\x0f-P\xdd\x04\x9e\ +\xe4\x07\x8e\xd2\xa5m\xe7\xa7\xf8M\xe6:\xbe\xe3g.\ +\xcbn`\x0d\xd9'\x03+\x00\xe7\xf3\x5c\xd8]^\xe8\ +`\xbe\xd6L}\xe7P\xfe\xdd#\x1e\xce[0\x05\x16\ +\xcb\x7fP\xd0\x02G\xce\xe5\xf6\xac\xe4t\x0e\xdc\x9a\xfe\ +\x07\x9c\x0e\xd7\xc5\xed\xe9\x9f^\x05\x90\x90\x993\x98\x00\ +\xf1\xd0\x000N\xe8\xf2\xdd\x0a\x1c\xce\xeab\x9e\xe8\x8a\ +n\xdcf^\x05\x8fp\xc0q\x18\x0ck\x80\xea\xd8}\ +\xcf\xbd\xfe\xeb\xdb\xbd\xe9\xc2\x8e\xe7\x0b}\xdc`\x80j\ +\xb4\xa8\x03z \x01\xd7\xdd\xec\x98N\xe3\xad\xfe\xea\xb0\ +^\xe6\x12`\x00#\xb0\x00\x12)\x10z\xb0\x05\x97\xde\ +\xeb`\x1e\xed\xae~\xdaO>\xee:\xbe\x06\xda\x99\xee\ +\x05A\x01\x0c\xe0\x0eF}\xd4\x86\x0e\xec\x88>\xed\xe3\ +\xee\x06\xc3\x10\x0ck\x8e\xef\x08\xb1\x00'\x90\x04\x030\ +\x01t\xde\xe1\xe1.\xef\x07\x0d\x01\x05\xf0\x03\xfd\x10q\ +\x08\xaf\x12V \x0c\x9f\xa7\x0c\x03P\xc6\x120\x01\x01\ +\xed\x0eg\x5c\x03\x17p\x04E\xa0\x06> \xb8h\x16\ +\x10\x00!\xf9\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\ +\x00\x96\x00\x00\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\ +\x13*D\x08+\x06\xaf@\xcf\x9a\xe0\xea\xe5\x88Z\x82\ +\x04o\x12\xf0\xc8\x98\x80\x9a#\x5c\xb6^-\x1cI\xb2\ +\xa4\xc9\x93(S\x1a\x84\xc5\xab\x96\xabf\xb8b\xf6\x92\ +%\x8b\x9aM\x8b\x18\xdf\xbc\x09\xc0\xd3\x83Or\xe4h\ +\x90\x0b\x90@\x1a/\x95H\x93*]z\xd0\xd7\x17\x97\ +\xb9\x9a5\xb3e+\xe6D\x9a7q\xea\xdc\xd9\xf3g\ +P>|\x16\x88]\x10\x00\xdbQ\xa6h\xd3\xaa\x15\xe8\ ++F\xadW\xaf\x5c\xc9\x8dJ\xd5\xeaLY\x15m^\ +\xdc\xca3\x80O\x0f@\xc1\x86]\x80\xa3\xb0\x0e\x1d\x86\ +\xde\xb8Z\xcb\xb8\xf1\xc8Y_x\xb5|\x1bw\xeeT\ +[\xd2\xac\xd2\xcc\xabUg\xdf\xbf_\xc1\x8a-\x8c\xe3\ +\xb0\xa0\xd3v\xde\x88t\xcc\xba\xb1S\x87\x92[\xc2\xad\ +L\xb7\xaeL\xaczsr\xf5\x0b8\xf4`\xd2:\xbc\ +\x9c\x16\x94\x01\xdd\x103\xd4`\xb5^\x9et\x16,X\ +_\xa2\xc7\x9e\x0c\xd7\xf2e\xbb\xb8;\xef\xf6JC\xf4\ +\xe8\xd2\xc1Og\xff(>d\x08\x8a!\x01\xce2_\ +\xbfp\xc1,\xe7\xcf\xa3\xc3\xa6^\xd9Um\xec5s\ +\xf3\xed\x0a\xb4\xfb`\xc2\xe0\x0dW\x9cq\xe6\xa1`\x0c\ +\x0a4\xd4\xc2\xde\x82\x05\x91\xc3E\x05\xef\xf9\x12\x9ft\ +\xb1Q\x16\x88e\xb6]\x95\x9fv\x9f\xf5\xe6\xdfw\xa5\ +\x09'\x1e\x81\x05\x1ac\xcc\x06\xc6\xf0\xa1 \x83\xeb\xe1\ +B\xc0;7\xc48\x8b\x84\x13NG\x19m\xd7\xdd\xb6\ +\xe1^\x9e\xf1G\x8e` \x86G\x1cy\x05\x1ax\xe2\ +\x06Hz\xf0\x05\x8b\xad\xc1\xc0M\x8cPF8\xe1|\ +\xb5P\x86!f:\xde\xc4\xe3v\xbd\x01\x09\xe0a\x22\ +\x12Y\xa2\x89HZa\xe6\x06\x090\xc9\x98\x17m\xa4\ +\x92\x0a\x94Q\xd2\x18]d\x15V'\x97T\xb6\xdd\xa5\ +\xa5n]\x01\xf6\xe1w\xa6\x8dX\x1e\x0a\x84\x92Y\xa6\ +\x15!$\x8a\xcebj.\xc5K\x12\xa7\xb8\xe9&\x9c\ +7H\x09\xdd\x17T\xc2u\xa1}9\xe2\x92\xdd\x96}\ +\x86\x16d\x98D\x16j\xa8\x99\x88\x86\xa0\x89&\x98\x90\ +\xe3K\xa3H\xe1\xff\xa0\x81)\x92NJ\xe9\x8cSV\ +h%\xa7\x19~\xca'o~z\x07\x5c\x98$\x9a\x8a\ +\xe4\x06f&\xba\xaa& \x80\x80\x02\xa3\xb0\x9a\x94L\ +=\xa6T[\xeb\x9bpZJ\xa1d\xbb\xdew\xdb\x9e\ +\xfbq'l\x80\x82\x8eyd\xb2\xca2\xdb\xec\x13 \ +\xbc\x11-I\xaf\x84R\xed\xbc\xd7RZ\xa9\x9c\x98\xd6\ +\x89c\x863\xe5\x05*o\xfd\x8d+\xe4x\x04\x1a\x8b\ +,\xba\xcb\xae\xfb\xc4\x13\x1f\x08\xa2\xdc\xbb\x09\xc9\xf1\xcb\ +\xbc\xf4\xd6z+\xae\x97\xeaj']\x99]\xe5\xef\xaf\ +^yi\x18\xb1\x83\x1ayn\xaa\xaa\xaa+\xc5\xc2\x1f\ +|p\x88\x15\xd0B<\x90&\xdc\x9021\xc5\xd6Z\ +\x9c-\xbe6n\x9c\xa3\x9e\x1c\x02\xfc\xe3o#\x97k\ +0\xaa\xe96\x0b\x02\xcb-{\xe2\x89\x14\xb2\xc8<\x10\ +\x13h\x90b\xf5\xcd\x14\xd7\x9b-\xae\xf2\xe9{e\x96\ +A\xff\xf4\xa7a:\x18}t\xaa\x09/\xcd\xb4\xd3\x9e\ +\xb8\xe0\x89\xbb2\xffP\x81\xd5tc]\xb1\xa4\xb7\xf2\ +\xcc\xad\xcfy\xe2\xff\xf6\xaf\xd8\x02\x93<\xe6\xa1h\xab\ +\xcc\xf4!N\xbb\xe0\x82\x12\x80\xf0\x01\xb1\x0ctGn\ +3\xce\xb4\xe2\xbdu\xae{W\xd6\xa9\xdf \x07K\xf4\ +\xc0\x05\x1byh\xba\xea\x1e\x9e\xf8\xe2\x80\xa4\x8eC\xb4\ +G\x10B\x88\xe4W\xdb]\xb9\xe5q\xd6\x989\x86\x9a\ +\xe5\xf7\xb7\xe7_\x96M\x5c\xe8\xa7\x22\x5c\xfa\xdam+\ +\x9e: $\x90 H\xa3\x9cT\xe0\xfa\xeb\xb0\xcb>\ +;\xb6Q\xc2\xb7m\xb7Su\xccy\xb8\xc1\x02*\xf8\ +\xd9I\xab\xcd\xf0\x07l\x1b\x9fz\xf2\xc4\xf4\xb3<\x8b\ +2T\xe0\xfe\xf3\xb0O\x8e\xb3\xce\xb5C\x07[\x95\xaf\ +\x5c\xe8\xedL\xfam\x17\xd8\xe7$\x03_\xca\x86\xd7\xb4\ +\xd3\x1d\x0f}\xfd\xe8\x87\x0f\xbc\xc0 \xb9\xb9\xef}\xae\ +\x8b\x9f\xec\xb4&#\xeb\xd1I6\x9a\xeb[\xff|$\ +0\xb3\x05/|\xa6+\xde\x01I\x90>\x05\xfa\x00\x08\ +\xab[\x8f0D\xf0\xc0\x07\xc2/z\xf3\xa3\x9d\x8c$\ +\xd45\x0cZ\xc6\x15\xd7\xa8\x05/b\xb0\xa4W\xfdC\ +Bnq\x854\xff\x1c\xf1\x06r\x8c&P\xa52\xd0\ +\xe8R\xa6\xb0\xf1\x9d\x8eq\xc8#a\x02}pBa\ +\x08#\x00\xeb\xa9G\x0b[\xf8\xc2\xc8I\x8f~\xf7\xb2\ +\x1d\xfej\x11\x83\x87\xa5\x84\x17\xd2x\x83!\x02(\xba\ +\x83\x81\xd0\x89\xc5\x83\x22\x02M\x08\x04+Z\x91\x1a\xcb\ +\x11\xc0\x16\xb7\xd8\xc5\xba\xc5\xd0V\xb5\x93\x0e\x0f}\x98\ +\x96ZP\xc3\x10\xc0[\xe2\xaa\x14V\xc0\xb6\xc9Q\x8a\ +t\xb4\xe3\x09N\xd0\x8f\x5c\xb0\xe6\x16{\xdcc\x1f\xaf\ +\xf6G\xea\x85\xf19\xb3X\xce+\x02`\x9e\x0f.R\ +|.3`\x14KH\xc5:Zq\x92\xc1\x10\x83'\ +\x1c\xc3\x05\x11\xb00\x93\x5c\x8c\xa0\xe4&(\xc3\xf70\ +\x08\x16\x09\xc8\x80\x22\x09\x888\x11\x9e\x8f\x95U|e\ +0b)\x061X\xa11\xb6\x8c&.]\x08\xbd]\ +f\xcdr\xc8`A\xa3fA\x8d!$\xeb\x94\xc43\ +\x1f\xf2\x90\xe9Ja\x9c`\x99\xcd\x14\x83\x11\x8c\xe08\ +\xb5\xb0\x22\x9a\xd2\x9c\xa6\xf3\xaa\xe9\xc7k\xa6\xa2\x0e\x16\ +XQ\xb4\x02\xb0\xff\x01&\x86\xd3\x05\x07$\xe7+\xcf\ +\x99\xceu2A\x0bbhBZ\x1a\x00Ox\xcas\ +\x9e0\xcc\xda\x1ax \xb5\x7f\xf0\x02\x07\xc4\x8c\xe31\ +\xa7\x98LX\x16\xd4\x08\x07\xd5\x82\x16\x94@\xc8\xa4X\ +\xe0\x1d\x0du\xa8\x06\xb2\x1aF\xc0\xe5\x11\x84`$\ +\x0a@2\x92[\xbc\xe4S47\xac\x94\x88rJ4\ +\xe1\xd8\xe1^9\xff\xcb@\xeer\x97\x93\xb1\x90d\xa0\ +\x01\x0db\x16\xb3\x92\x97\xdcd\x0e\xa89%\xb5\xd0G\ +\x95y\x8c\xe5\x12\xc7Y\xce\x5c~\xc1\x0b2\xa0\x90\x09\ +\xdc\xf9\xcey\x1e\xb3\x8b)\xdc\x5c@\xfc9%\x01p\ +3\x89\xb5\x8c\xe8\x11(\xfa\xd3\xacE\x08:T\xf0\xe8\ +RG:\xc9|\x8eE(.\xad\x12\x10\x88x\xd3\x87\ +\x96\xf3\xa7?=\x85)\xa4\xe9 \xd1P\x81\xaeK\xfd\ +\xe8S\xefy\xbf\xdc`\xb5J\x02\xa1\x85\x057\x98\xd3\ +\x88\x9e\xb5\xa2k]k) \xa4\x03\xba\x8e6\xa9y\ +\xed\xebI\xbf6\x1e\xc2V\x09:\x0a\xfd\xe3XwY\ +\xd9\xccfv\x0a\xb4i\x90\x10`\xe0\xdc\x18\x90\xf6\xb4\ +\xa9\x9d\xe7=\x97\x22\xdb*\x81\x85\x11\xba\x1ddY\x83\ +;\xdc)\xc8w\xbe=`\x10N\xa0\xfb\xdf\xea\xe65\ +\x9e\xdb\xbd\x0b\x18\xc0[%:\xf0\xb6\xa7g\x1d\xee)\ +\xe8;\xdf~\x88G<>`\x90\x03\xfc\xfb\xe2\xe9\x8e\ +\xb6\xc0\xf3\x8c\x88\x83#E\x0b\xc9f8\xbe\xf5\x1dq\ +\x89K\x9c\xdc\x03\xff\xc1\x01\xc6W\x9e\xf1]\xb3\xdb\xe3\ +H\x19B\xa2E.n\x92\x9b\xdc\xe4?\xc8y\xd4\x06\ +\xf2\x82z\xb0|\xe5\x01\x7f\xb4\x02`\x8e\x14\x16\xd0\xdc\ +\xe16\xbfy\xf5\x9f_\x5c\xdaw~\x00\xd1U\x22\x85\x17\x8c\ +\x1c\xe2Jg\xfa\x0f\x96\xe0t=\x98=\x18\x04I\x03\ +\xd5\xd7\xees\xab\xa3;\xda[WI\x02j\x9e\x82\x92\ +\xe3\x9c\xe9e7\xbb\xde\xf5\x80\xd6\x81\xb0\xfd\xefUw\ +{t\xe3\x9e\x12\x0a\x80\xfd\xe6b\xcf\xfb\xde-\xc0x\ +\xc67uZ\x80\x8f\xfc\xcf\xf5@\xf8\x94X!\xecM\ +\xdf\xbb\xde\x1b\xcf\xf9$$\xc1\x18\x02a@\xe4GO\ +\xf5\x8bW>%\xd4X:\xde5\xaf\x07\xce7\xde\xf3\ +\xb0O\x02\x09\x04\x22\x01\xd2\xdb\x9e\xea\x078}J\xd4\ +\xa0x\xb3\xbb\x9e\xf1\xb1\x87}\x11\x86O\xe7\x7f(\xa0\ +\x0e\xc8\xbf\xfd\xe8\xc1\xa0{\x94\x00b\xf3\xae\x0f\xbe\xe7\ +\x87O\xfd\xe1_\x82\xf24P\x85*\x90\xcf\xfd\xe4+\ +\x7f\xea\xcdG\x09\xff:\xa2\x1f\xfc\xea[\xff\x12\xe8O\ +\x84\xfa\x13aX\xed\xbb\xdf\xfd\xdd\xe7>\xe9\xc3\x7f\x12\ +\x5cH\xdf\xfcE@\xff%\xd6\xcf\xff\xf5/\xe0\x1f\xef\ +\x17\x80\x01\x18\x7fu\xb0v~F\x7f&\xe1\x07\xe6\xa7\ +\x7f\xfd\xd7\x802\xf0\x80\x0fh\x0c\x97 \x80\x14H\x81\ +\xdd\x07\x09\x08h\x12\x8d\xc0\x80\x0d\xa8~\x10\xf8\x81 \ +\xe8\x02\x99P\x81$H\x81Z\x97\x81$A\x02\xfd\x07\ +\x82,8\x0f.\xe8\x82P\x10\x83\xc1P\x02\xc0P\x83\ +6h\x83%\x18\x80/\x80\x82$\xa1\x09,\xf8\x80/\ +8\x0f18\x84D8\x840\xb0\x0c\xdf\x90\x84J\xb8\ +\x847x\x83\x02\xe8\x03<8\x12\x82\xf0\x82EX\x85\ +Yp\x85X\x88\x85N0\x02-\xb0\x84^\xf8\x85_\ +h\x83Q8\x12\xe40\x84Y\x98\x85N\x90\x86j\xb8\ +\x86j\x18\x0f\x8a\x00\x86p\x18\x87c\xb8\x10\xd4\xc0\x86\ +vx\x87vh\x01i\xc0\x0a|\xd8\x87~\xe8\x87q\ +\xf8\x0d\x8e0\x87\x09\xe1\x0av8\x0c\x88\x98\x88\x8a\xb8\ +\x88\x89x\x0e\xa2\xff\xf0\x87\x90\x18\x89\x90H\x88\x0a\xc1\ +\x88\x96x\x89\x898\x08\x92\xb8\x89\x92H\x89\x09\x81\x89\ +\xa0\xc8\x88=0\x8a\xa4X\x8a\xa6x\x8a\xa5\xe8\x89\x08\ +\x11\x8a\xac\x88\x88\xc8\x10\x01\xb0\x18\x8b\xb28\x8b\xb4\x18\ +\x8b\xaax\x10\x04\x90\x8b\xba\xb8\x8b\xbc\xd8\x8b\xba8\x0f\ +DP\x8b\xc28\x8c\xb7h\x10\x9bp\x8c\xc8\x98\x8c\xca\ +\xb8\x8c\xba8\x08\x1d0\x8c\xd08\x8b\xedT\x8c\x02\xb1\ +\x8c\xd6x\x8d\xc8x\x09\xad\x10\x8d\xdc\x88\x0a\xa0G\x8d\ +\xff@\x0eG0\x8e\xe4X\x8e\xe6x\x04\xd7\xa8\x07\x12\ +\x00\x8d\xa8\xd0\x8e\xee\xf8\x8e\xef\xd8\x0f\xe0\xf8\x0f\xe8p\ +\x8e\xf6x\x8f\xe48\x05\x06\x00\x8f\xfc\xd8\x8f\xef\xc8\x0d\ +\xdc0\x02\xf3\xf8\x04\x0f\xc0\x09\x06y\x90\x06\x89\x8f\xe7\ +\xc8\x02\x05\xe0\x8f\xf0\x08\x90\x10\x19\x91\x00I\x00\xf3x\ +\x02\x0fp\x91\x18\x99\x91\x08\xb9\x91\xe6\xa8\x05I\xf0\x8f\ +\x12\x19\x92\x22\xc9\x0dn0\x8f#\x90\x91(\x99\x92\x18\ +\xb9\x91\x9c@\x02\x140\x920\x09\x90\xc5P\x0c\x02P\ +\x93\x1d\x07\x8eN\xff\xa0\x0c*\xb9\x93;\xf9e1)\ +\x933Y\x93B9\x94\x02@\x03\xe0\xa8\x0cH\x99\x94\ +H\xc9\x93;\xe9Y!9\x934I\x94R9\x94\xa1\ +v\x8b\x1b\xa0\x94X\x89\x95Ly\x82\x08\x10\x94S\xf9\ +\x95\x02`\x09b)\x96'x\x8bL\xc0\x00\x0c\x90\x95\ +j\xa9\x94(\xe9\x04\x02\xb1\x05`)\x95c)\x96X\ +P\x97X\x90\x03\xd4\x98\x08h\xb9\x97h\xb9\x96~\x09\ +e\xffp\x04q9\x97ti\x97\x86\x89\x05:p\x8b\ +o\xc0\x97\x8c\xb9\x97~\xa9\x94F \x10\x8d \x97\x84\ +y\x98\x96Y\x97}\xe7\x89\x80\x00\x06\x9cI\x05\x8d\xd9\ +\x98~\x89_\x02\x11\x96\x84i\x09\x97y\x9auY\x05\ +\xb7h\x01\x9c\xd9\x9a`\xe0\x99\x9f\xc9\x98X\x097\xff\ +\x80\x08c\x89\x9a\xa8\xa9\x00\xba\xa9\x00\xebC\x89\x05\xe0\ +\x9a\xc0\x09\x06\xb1\xd9\x98\xc3@\x103\x80\x9b\xa7\xb9\x9b\ +\xcaI\x06\x9eh\x04\x05\xf0\x9c\xc1\x09\x9c\xb0\x19\x9ba\ +@\x10j\x80\x9c\x86\xa9\x9c\xda\xc9\x08\xb9G\x88\xbcp\ +\x04\xcf\x19\x9e\xbf\xff\x19\x9d\xad9\x9d|Iq\x04\x81\ +\x9d\xda\xa9\x9c\x8c\xd0\x9e\x8c\x80\x0c\xc57\x86\x1f\x90\x09\ +} \x9e\xe2I\x9e\xae9\x9d\xb76\x10\x1a\x90\x9c\xeb\ +\xb9\x9b\xee\x89\x0c\x02\x8a\x0c\x0d@\x88P\x90\x09\x08J\ +\x9f\xf6\x19\x9e\xf8\xd9\x9a\x89`\x10Np\x98\xff\x09\xa0\ +\x01:\xa0\x03\x1a\x99Q\xa8\x09\x09\xba\xa1\xf5\xb9\xa0\xd0\ +I\x9eU\x99\x9eX0\xa1\xba\xe9\x9e\xedi\xa1(Z\ +\xa0Q\x98\x05\x17p\x01\x1b\x9a\xa0\x1d\xea\xa1\xd1\xf9\x7f\ +\x06q\x0b$j\xa2(\x9a\xa3i\x90\x06j\xc0\x83.\ +\xd0\xa2@\xfa\xa20\xea\xa1\x1f\x0a\x06P\x80\x10\x89\xb0\ +\x9e&\xfa\x9e9j\xa1;\xba\xa3\xa3\x80\x82\xd2\xc0\x00\ +;\x00\xa4A*\xa4\x0aJ\xa4\x05\x80v\x07!\x08\xec\ +Y\xa1M:\xa0O\xba\xa3\x1c\xc0\x01\xca\x90\x81,\xc0\ +\x05jZ\xa5V\xea\xa2X\xda\x071*\x9e\x0a\xe1\x06\ +K\x1a\xa6N:\xa6e\xca\x01D@\x04\xe8\xd9|C\ +\xa0\xa6\x80\xca\x05lj\xa5X\x8a\xa0q\xba\x04\x0b\x01\ +\xa6v:\xa6i\xff\x90\xa7{\xba\xa7\x7f@\x7f\x9c0\ +\x00\x81\x0a\xa8\x83z\xa5o\xfa\x9c\xa2\x89\x10\xae0\x0a\ +v*\xa6\x8c\xea\xa8\x8f\xba\xa7\x05\xd0|/0\x00\xa8\ +J\xa9\x95\xba\x03\x97\xda\xa2\x85\x9a\x09\x9c0\x12z\xf0\ +\xa9\x8c\xda\xa8e:\xaa\x8f\x8a\x00\x08\x10\x9fq\xe7\x02\ +\xa10\x07s\x90\xaa\xaa\x1a\xa8\xad\xea\xaaB*\x0c#\ +\xf1\x06\x92\xd0\xa4\xb5\x9a\xa7z\x8a\xabD\xa0\xab\x08`\ +\x03\xcf\x14w^\xc0\x05\xa1\x90\xad\xc1\x9a\xaa\x95\xba\xa6\ +mj\xac\x08\xca|$q\x04(\xda\xac\xa2\x0a\xad\xd2\ +\xaa\xab\xd50\x8d0W\x00\xd9\xfa\xae\xdb\xca\xad\xddZ\ +\xacn\xda\x08%A\x03e \xa0\xb5j\xab\xcf\x8a\xae\ +\xe9\xaa\xab\x8a\xe0\x0eMup.b\x02&\xf0\xae\xda\ +\x1a\xaf\xc3J\xac\xc5Z\xaa&1\x0c\xfb\xea\xac\xd0\xba\ +\xa7\xff\x8a\x00\x8ap\xb1\x8aP\x92\x07\x97\x0bN0\x03\ +\x06k\xb0\x08\xfb\xab\xc2\xba\xb0\x96\xda\xa6\xf6z\x12\x8a\ +\x80\xa7\xe7\x8a\xab\x15k\xb1\x18{\xb15\x00o\xb9 \ +\x03k\xb0\x06\x1e\xff\xfb\xb1!\x0b\xac\xc2\xda\xad\xdez\ +\x01\x0e{\x12z@\xa6+\xcb\xb2\x15\xfb\xb2\x17[\x0a\ +\xa5\xe0\x00\xd96\x0c5[\xb37\x0b\xb2\x08\xab\xb3;\ +\xcb\xb3;p\x02*q\x0b\x12;\xb1\xd1Z\xb4F\x8b\ +\xb4\x1d\xd0\x01U`\x94j\xf6\x06\x0f`\x00\x06\xd0\xb4\ +6\xfb\xb4!+\xb2S[\xa9\x0f\xb0\x1a(a\x04\xb7\ +\xaa\xb5-\xeb\xb2/\xeb\xb5_\x8b\x08*\x1ae\x17`\ +\xb6f\x8b\xb63\xa0\xb69\xab\xb0$;XHQ\x03\ +Z\xbb\xb5\xffj\xb4G[\x0a_\xdb\x01\x88\x10\xb9+\ +p\xb2\xeb\x05\x08kP\x035\xe0\xb7g\xdb\xb4\x81\xfb\ +\xb1\x07\x9b\xb3#\x0b\xa8\x94\x97\x14\x0b\xd0\x01\xfe\xca\xb5\ +]\xeb\xb8y\x1b\xb9\x91{\x00eIX\xcd\x10\x0f%\ +\x80\xb9\x98\xab\xb9\x80\xfb\xb4\x9f\x1b\xb5\x84\x9b\x09\xb4\x89\ +\x14/@\xb4\xa8{\xb7\xaa\x0b\xb9\xac\x8b\x08\x07p\xbc\ +\x12\x80[}P\x02\xccK\xbb\x9a\xbb\xb9N\x8b\xbbk\ ++\xb5\xa8*\x8fL\xe1\x00\xb9\xda\xb2\x8c\xab\x08xK\ +\xbc\xac{\xbc\xe0\xff;\x0anYQ\xb80\x05\x8f\xf0\ +\x08\x94\xd0\xbc\xcek\xbb\x80\xeb\xb9k\xcb\xb6E\xa0\x16\ +\xa3P\xb7v+\xbc\x8f[\xbc\xc6\x0b\xbe\x070\x0a\xfc\ +\xdb\x00\xbc\x0a+'\xb0\x06\xe7\x8b\xbe\xe9;\xbb\xeb\xeb\ +\xb7hk\xb3\xee;\xbd}\xb0\x16\xc1\xa0\xbd\x8c\x8b\xb4\ +\xc3\x8b\xbf\xf9{\xbc\xfc\xcb\xbf+\xb0\x02\x90\x80\xacj\ +\x02\x0b\x9e\x90\x09\x0e\xe0\x00\x03\x8c\xbe\xcck\xc0\xb5\xcb\ +\xbe\x9c\xeb\xb9\xb9\xfb\xae\x86\xab\x16\x9b\xb0\xb8\x11\xdc\xbd\ +\x14\xac\xbf\xfb{\xc1\x19\x9c\xc1n\xa0\x05,\xd2\x0f\x99\ +\xe0\x06\xb4@\x0b!<\xc2\x05l\xc2\x99\x8b\xc2N\xab\ +\xc2\x08\xdb\xa3\x8cQ\x0bn \xad\xdb+\xc1\xf7\x8b\xbf\ +4|\xc1\xa3p\xc3+\xd0\x02X<\x01K\xe0Y\xad\ +\xc1\x07#`\x00\x00\xe0\x06b\xfc\xc3\x22<\xc0\x94P\ +\xc0\xb4{\xc2\x08|\xbb\x0b<\x08\xadQ\x0d\xf5\x8b\xb1\ +P\x1c\xc5\xdf\xab\xbfT\x5c\xc57\x8c\xc5\xa0\x00\x0ar\ +\xd0\x0a\x06\x90\x0c4\xaa\x16Z\x00\x06\x90\xb0\x05\x00\x10\ +\xc6c\x0c\xc4e\xff|\xbeg\xac\xbe\x07\xfc\xb7l\xfc\ +\xb1\xe2\xca\x1a\xc60\x0a1<\xbc\xde\xdb\xbaSl\xc3\ +y\xac\xc7}\xdc\x0a\xc7p\x0b\xb7\x00\x01P\xc0\xc1*\ +\x11\x00$`\x01\x06\x00\x01\x90\xd0\xca[`\xc8b\x9c\ +\xc8Al\xc6%\x9c\xc6\xcf\x9b\xc0ik\xb0\x5c\xc0\xc5\ +\xad\x01\x08\xa9\x8b\xc93l\xc7\x9c\xdc\xc9{\xfc\xc9\xa2\ +\xac\x0b\xba\x90\x03\x1a\xa0\x01\x90\x00\x06\xf1\xa0\x05O\x80\ +\x0e\xfcf\x10\x19\x00\x02b0\x05GP\x02UP\x05\ +\x10\xd0\xcd\xad\x5c\xc8\x86\x8c\xc8>\xac\xc8B<\xc4\xb6\ +l\xc4\xd1k\x02\xd5\xca\x1cj \xc7\xdd\x9b\xc9\x9a\x1c\ +\xbeTl\xc5X\xdc\x02|\xdc\x0a\xf8|\xcc\xba\xb0\xcc\ +\x1a\xf0\x07\x7f\xd0\x00\x00\xdd\x00m0\xd0m0\x01\x06\ +\xed\x0e\x08-\x01\x0a\xbd\xcd\xdc\xec\xcd\xdf\xfc\xca\xe2<\ +\xce\xb3\xcc\xc8h|\xcek\x0c\xb8\xd6\xcb\x1e)\xc0\xbd\ +\xef\x1c\xcc\xf2<\xcc\x19\xac\xc7\xf7\x0c\xca\xc7\xac\xcc\xcb\ +\xfc\xcf\x01-\xd0\x04m\xd0\x13\x80\xd0\xee\xa0\xd0\x12\xc0\ +\xd0\xdd\xec\xd0\xe0\xff|\xc8\xb1L\xc6\x8b\xcc\xc8\xb5l\ +\xd1\x90\xdc\xb4!\xca\x1e\x16\xd0\xd1R\xbc\xc9 ]\xcf\ +|l\xcc%\xcd\xcf(\x1d\xd0\x04]\xd0\x07\x9d\xd0\x0b\ +-\xd34\x0d\xd1\x11\x8d\xd3\xe5\xbc\xd3\x8f\x0c\xbd\x14\xd0\ +(\x16\xf0\xb8\xf0\x5c\xc1\x1f\x8d\xc1\xf4l\xcf#\xdd\x0a\ +\xfal\xd2\xfe\x9c\xd2*=\xd0,\xed\xd20\xcd\xd0\x0d\ +\xcd\xca\x0f\x1d\xce7\xad\xc89\xdd\xc8\x8e\xac\xc6\x7f\xbb\ +\xd5\xb02\x05\xab;\xd4a\x8d\xc7\x9dL\xd6\x9f\x1c\xca\ +\xb7\x90\xccJ\xbd\xd4\x00\xbd\xd2m\x0d\xd5Q\x1d\xd7r\ +]\xd3UM\xceWM\xc4z\xfd\xd3j\xc2\x02\x14\x0c\ +\xd6\x16<\xcfcm\xcf\x9fl\xd6I}\xd2\x8a\xbd\xd6\ +,\xdd\xd2\x8e\x1d\xd3\xdb<\xd3\x91-\xd9u\x1d\xc2w\ +m\xce\x16\x9d\xd1\xefB\x02-P\xbc4\x5c\xc3 }\ +\xc5\x22\x1d\xdag\x9d\xd8j\xcd\xd8O\xed\x0e\xcb\xf0\xd6\ +R\xdd\xdaT\x1d\xcb\x12\x9d\xd3\x04\x8c\xd5\x98k\x02\x98\ +\x10S\xc6\xd0\x00\xf1\x1c\xd8\x82\x1d\xd2\x9e\x5c\xd8\xbf}\ +\xd2jm\xda\x8d\xff\xed\xd8p=\xd3\xdf\xec\xdauM\ +\xd9f,\xdb5p\x01\x0c\x94V\x8f\x90\xdb\xba-\xd6\ +\x83]\xcc\xf8,\xda\x87m\xd2\xfd\x5c\xda\xde=\xdc/\ +\xfd\xd8\x90=\xde\xc9\xfd\xda\xcc\x8d\xd7\x06<\x0c\xfb\x99\ +VN@\xd4\xbbm\xd4r\xe0\xdb\x87\x8d\xd8\xa4\xdd\xdd\ +\xc2\x8d\xda\xe0}\xdc\xc8M\xd7\xe5=\xd1\x14]\xc2#\ +\xa0\x1e\x9f%\x0c\xba\xd0\xd9\x9e\x1d\xdfem\xd8\xc8l\ +\xdfi\x1d\xdcl\xfd\xdd\xfb\xcd\xdf\xe2=\xd7\x16.\xcb\ +\x18N\xc0&\xd0\xa7\xebE\x0ek\xf0\xde\xd7\x8d\xdd\x84\ +=\xdf\xa2\xdc\xe0\xfc|\xdf\x10\x9e\xe2\xfa\x0d\xd3\xaa\xbd\ +\xda-\xee\xca/>\xce\xe6\xcd\xc8Ypij\xd0\x0a\ +!\xae\xe3\xf2\xcd\xe3\x0dn\xe2'\xce\xd4\x11\xee\xd2+\ +^\xe4\xfd\xed\xe26\x0d\xe0\x8bl\x00\x98]c|0\ +\x07\xf0-\xe2\xa1M\xe2\x0e\x0e\xe4(.\xe4\x12\xbe\xe5\ +\xe1}\xe4\xe0\x9c\xe4?L\xd9Gzp'\xe0\x0eV\ +\xcc\xdb\x84\xcd\xe0U\x0e\xdcm\xee\xd4Cn\xdcF.\ +\xe7\xff\x0d\xe0\x03\xff0KD7\x05\xba\x80\xe6\xf3m\ +\xd8\xf5\xfd\xe3W\x8e\xe5n\xae\xe5\xc5\xcd\xdf]\x8e\xe4\ +tN\x0b5@\xb9qw\x09\xc7P\xcf\xa0\xed\xe7%\ +.\xe9\xf8\xdd\xd4\xa7\xfd\xe6D\x1e\xe74\x8d\xe4_.\ +\xc6\x8f\xb0\x83\xcd\xe7\x01\x89\x90\x03;N\xe5\x7fN\xda\ +\xa7\x1e\xe1\xaaN\xe8\x99\xae\xe96\xfd\x08S\xd0\xbb\xe1\ +7\x05\x130\xe2=^\xea\x0f\x1e\xe4n\xde\xeb,\xce\ +\xda\xfe\x0d\xd1\x06`pc\xe8\x0a\xc2\x10\x0a\xb8\xae\xec\ +\xcb\x1e\xe8\xa9\xae\xe5\xab\xce\xea\xad]\xc8\x9c`i\xaa\ +h\x06\xf1\x00\x09\xc9\xbe\xe6l\xce\xed\xa7\xed\xed\xbe\x9e\ +\xe9\xa1\xa0\x06\xecZ\x8c(\xf0\x03\x0e\xa0\xed\xeb\x9e\xd2\ +\xa8\xde\xeen\xfd\xee\xac=\x00#\xc0h\xf3h\x10\xe4\ +\xc0\x04\x0fP\x05\xba\xde\xddk-\xe8\x83\xee\xeb50\ +\x08\xa6<\xf0#!\x0cz\x90\x09\x12\xa0\xf0\xfb\xae\xe2\ +D\xee\x06\xca\x90\x02\xb3'\xf1I\xc1O\xfd\xa0\x06E\ +p\x04}\xbb\x05\x90P\x05\x06\x0d\x01[\xe0\x063\x00\ +\x06\xc3`\x01\xc9\x07@\x02\xdf\x18e\x01\x01\x00!\xf9\ +\x04\x05\x03\x00\xff\x00,\x00\x00\x00\x00\x96\x00\x96\x00\x00\ +\x08\xff\x00\xff\x09\x1cH\xb0\xa0\xc1\x83\x08\x13*D8\ +\x0b\x16\xac/_x\xf1\xaa\x15\xc8\x95\xab\x5c\xcdl5\ +k\xd6\xa4\xd93g\xcej\xf1\x82\xb5\xb0\xa4\xc9\x93(\ +S\xaa\x5cYpVC\x88\x11%N|E\xd3\x22F\ +[\xb6\xa4\xe1\xda\xd9K\x96,j\xd4\x1c\xf5j\xf2*\ +\x06\xcb\xa3H\x93*=\xe8%\x1e\x04\x97\x0ea\xca\x9c\ +Y\xf3b\xc6\x9c;q\xf5\xfc\x094\x81\xd77\x09d\ +53\xba\xb4\xac\xd9\xb3\x02A\x80\x99t\xa3\xadK_\ +QcJ\xacU\xab\xeaM\xac<}\x02\xa5\xe6\x95\xc7\ +\x9b\xbf\x01\x02\xf0\xe8U\x0b\xad\xe1\xc3%\x87(C\x96\ +\xaa\xad\xe3\xb7qc\xc8\xa4k\xf7\xaa\xce\xbc\x8e\xf6\xf6\ +\x05\x1c\xd8\x83\xe7\x00\xb2x!\x1e}\xd8\x96\x1a]\xa9\ +R7v\xec\x16\xee\xc3/\x92\xe7\xd6}e\xd3r^\ +Y\x99\xf9~\xe5\x1c\xc0\xb3\x07r\xe4h\x04\xb0E\xba\ +x\xd2\x00\x9b\xbe\x992\xa5:5\xeb\x1bP_\xc7\x9e\ +8\xbb6\xce\xcb[5\xef~\x13\xb8\xb7g\xe0|\xc2\ +\xf3\xff\xa1\xf6\xc5\xb8\xf9\x93\x5c\xde-_\xde|\xf5\xe3\ +\x86\xaf\xe5R\xa6m\x15g\xd6\xec]\xb7w\xfe\x1e\x5c\ +\xfc\x82\xffo\x88v\xde\x80\x05]\x10\xcb/\xeb\xad\xd7\ +\xdcs\x90\xbd6Yu\xf5\xd9r\x9f^\xf9\xf9\xc5\xdd\ +~\xbf\xf5\xc7\xc7\x7f\x0b\xe0\xe0a\x80\x04\x0e8\x0c\x1a\ +\xa4\x94\x88`\x82\xed1\xe8\x1aD\x0fVf\xdfm\xda\ +\xfdu\xa1w\x19\xfa\xf7\x9f\x87:\xe8`F\x02$\x85\ +H\x1a\x16%\x06y\x22\x8a\xaa\xa9\x18\xd9d.J\x08\ +c~2v\xc7\x1f\x0d6z\x88C\x8e^\x08b\x06\ +.>\x1a\xa6\xc3\x04\x84\x04\xe9\xe5\x90\xec\x15\xc9Zt\ +\x10M\x07\xe1]\x13r\xe5U\x02M\xd2\x08\x1c\x94\x1b\ +\xde8\xa5\x0eU\x0a\x22H\x06|\x14\x96eY\x18\x10\ +\xe2\xa7\x97&&\xc8\xdc\x82\xef\xc1U&\x92\xf4\xa1\x89\ +Y\x85\xbc\xf9\xa6a\x9cRRig\x06\x19\xa0\x93A\ +\x02\xb3\xec\x89\xd4\x1f\x15t\xfa'\xa0\xa4\x809\xa8s\ +c\xae(_\x92\x13\xe6\xb6\xd9\x8cO\x86\xc7!\x8et\ +\xda\xffy':\xe8\x0c1\x84\x19zj\x8a\x12\x0c\xdf\ +t\xea\xe9\xa7_\x0aJ\xe8c\xa6\x22j\x9d\x92Zq\ +\xa5[\x9b\x8e\x92\x13%\xacuRZ\xab\xad(\x0cA\ +\x8d\xae\xe8\xf9\xaa-\xb0\xc1\x12I\xaa[\xf0\xb1([\ +\xa2WeE\xe1\xb2\x9c9\x0a'\xa4s\xd69\xab\xad\ +C\xa0 \xaf14`\xbb\xd0-\xda\xe6\xcbm\xa0\xde\ +\xba\x07]\xb8\xf2\xd5u\xac\xb9\xca\xee\xe6d\x86p\xbe\ +:\xa7\xac\xd2R;\xaf1\xc6\x08\x92\xab\xbd\x04a\x91\ +\xaf\xbe\xfb\x86\xda\xaf\x91\x87RG\xee\x8b\xf8\xadz0\ +x\xaev\xd8.\xc3\xd3\xc6\x8b\x02\xc4\xc6l\xb0\x01\x0a\ +\xc4Q,\x90\x18\xf5\x88 \xc2\xc5\xdbv\x09\xa8\xa8\xc3\ +B\xb7bl\x94U\xa4h\xc8\x09X\x88\xa1\x86\x0a\xe7\ +\x88\xf2\xb4\xf2\xae\xdc\xb2\xcbVlp-\xc5\xf1\xc4b\ +\xb3\xcd8\xfb\x9a1\x98=\x93i\xe6+B\x97\x9b\xac\ +\x9al\xa6\x8bp\xc9\xd0NZ\xa9\xc3N?m\xc5\xdb\ +!\x04`o\x22W\xd7\x9du\x05[\x0b\xfb\xed\xbfq\ +\x19\xff;4nL\xb2Zc\x9c&\xc7:i\xca\x0f\ +?\xbd\xc1\xdbV\x84\x10\x029\xban\xf2N\xddW\xdf\ +\x8d\xb7\xce\xdd\x86\xb9\xf7,\x86\x9eJ\xdb\xdf\xaa\x96}\ +t\xc2\x85\x1b^)\xd3\x0f\xbb\xbc8\xdc\x8ek\xc2\xc7\ +\x9e\x92\xbf39\xe57g\xed'\xe6\xfcj\xee/\xe7\ +\x0e\xceU\x95\xd8=if\xb4w$\xb3k\xf8\xbb*\ +;\xad:\xe3\x8e\x87\xa0\xc9\xf3\x0b\xf8\x98H,\xb1\xc8\ +>;\xe5wg\xac\xf7\xee\x9d\x03\xfd;\xc8d\x0f\xff\ +\x1d\xe9i#\xaf2\xcbP\xb3\xee\xfc\xf3 \x80P\xef\ +\x80US_\xbd\xec\xb4\xd7\x8e\xf3\xbe\x5c\x8b\xe9VT\ +\xde\xd3\x07<\xd9f\xfb\x0d\xf9\xa6\x14\xad\xb5\x9d\x0fb\ +\xe9k\x5c\xeb\xd8\x07\x02)<\x01r\xe7\xd9\xc5)\xe4\ +7\xbf\xeb\xd9\xed~\xb8+\xd1\xf6\xc6\xe4\x90\x0e:\xc4\ +\x17.\x11\x08\xef\x22\xf2\x8af\xe0\x82/f#\x99\x9c\ +$\x85\xbc\xa6!0}\xcd{\x9e&\xda\xf7\x84\x1a>\ +!\x01\xc6\x09\xc17N\xc1C\x0aZ\xaf~\xb6\xcb`\ +\xfe\xffV\xc3\x8d\x12\x84\x90%_p\x05.\xb83>\ +\xb4\x11\xf0p\xf0J\x1d\x0c\x178C\x10\xd8\xf0\x09\x1f\ +x\x02\x96FC\x03\x05\xf0\xf0\x8b>\xa4\x1f\xf6\x82\x08\ +(\x22\x8d\xa2\x08C@\x0b/\x82\xf0\x06\xa4\x95\xcf\x80\ +R\x5c]\x0c\x19h\xc3\x0f\xd8\xf1\x10Op\xc5h\xfe\ +\xf0\xc5>N\x90z?\x1c\xe3\xc5\xf0\xb7\x9co\x80!\ +\x8d\xa4\xe1\x055\xc8\xb1\xc2h\xa1Ny\xabS\xa0\x0c\ +iXC;~\xe0\x10\x9e\xf0\x84\x15z\x84\x96\x0b\xec\ +b\x17\xcc\xf0c\x0f\x01)\xc6\x0b\x0e2\x83D\x98B\ +3\x08$\x0d\x1a,\xecNp\x84$\xf3\xd6W\xc5:\ +\xda1\x93\x9ep\x81\x0b2`\x98F\xac\xe2\x97\x9f\x14\ +\xe5\x1f+H;\xdb\x05\xa9\x0c\xc9\x10\x90\x8f\xa4a\x08\ +G:\xec\x85\xb3\x9c\xa4\x15+y\xcbL\xea\xd2\x05J\ +\xf0\x00Z\xb8\xf1K`JP\x94\xf2\x0b\xa4)s\xf6\ +\x0d=\xd8\xcb\x17\xd4\xd0A,_(GZR\x12\x8b\ +\xd5\xcc\xa5.\x01\x01\x08O\xe8\xb1,m@C7\xbd\ +)\xff\xccp\x96\x12k8\x93\xd9@\xbe\xe0\x01\xd4A\ +S\x92t\xa4&&\xad\x89Mz\x02\x82\x04\x9a(\x8b\ +\x1e\xd0@\xd1}\x02\xb3\x9f\xa4\xb4\xa0\xfd:\xd5\x0d\x12\ +\x08\x94 M\x10\x84\x14Y'M[.T\x9eJp\ +(\x09V\x8a\x03\xa5\xe0\xa0\x07\x14\xad\xa8E\x83\xe9G\ +\x7fj\xd4W%\xf8\xa8A\xbe\xc0\x87\x83R\xf1\x9d\xf1\ +\xbc\xa6C\x1fJ\x02b\xf4\x83\x041;J\x15T\xa0\ +\x82\x98\xca\xb4\x9b4\xed\xa3?i\xc7\x8c)\xe8\x14!\ +\x09\x98\xe2\xfa\x80\xfa\x01\x5c\xea2\xa5\xf4\x5ciQ\xfb\ +A\xd6\x88\x1e\xa5\x11\x18`*S\x9d:\xd3oJ\x95\ +\x94u\xc3\xc2U\x15b\x0b\x14\x90\xb4\x96\xf0\xec*C\ +\xc1JT\xa3\x92\xb5\x1f>\xf0\x01\x04Ub\x0b\x04`\ +\xe0\xb0ju\xaa>\xf7\xe9V0\xc2U\x04\x88\x98\xeb\ +B^1\x84\x05R\xd2\x92^u\x81JW\xeaW\xc0\ +\x06\x16\x08\x80`\x89\x0c\x0eKZ\xb565\xa6m\xad\ +))[\x81C\xc9*\x84\x17CH\xe8\x1d\x19\xaa\xd9\ +\xb0\xff\x8e\xf5\xaf\x9f\x05\x820\x84!\x88\x95D\x80\xb4\ +\xc0M,[\xa1\xda\xd8a6\xc0\xb5&\x89\xc1\x10.\ +{\xc9\xbdn\xb6\xb3\xb9\xdd\xadt\xefy\x12\x06\x00\xf7\ +\xbai]+j\x19+\xca[ \xf7$10\x065\ +3\x0bV\xce\xfe\xd5\xb3\xba\x95\xee\x09N\x10\x0cc\xa0\ +\x84\x0f=\xa8G=\xb0[Z\xed>\xf5\xa2_\x8c\xec\ +wO\xc2\x0b+\x04\xb5\xb6}\xc5\xad\x0f\xd2\xbb\xdb\xf5\ +\x06#\x18b\x08\xc6*M\x02\x06\xf9:\x98\xbe\x88\xb5\ +\xefb\xf9\xa9\x80\xfd\xa6$\x10 p.QI \xe0\ +\x01\xab\xd7\xc0b\x08\xb1\x186p\x12T8\xf8\xc1\x10\ +\xce\xeei'\xbc\x8a]\xd4\x01\x04\x16N\x89,\x0e\xf1\ +U\xdbB\xd7\xc3\x05\x06\xb1\x88\xc5`\x041P7!\ +28\xb1\x90S,\xdc\xa7\xc6x%4\x00\xf0J\x05\ +L`a\xe8X\xc4F0\x02\x13\x98\x80\x82\x85\xe4\x82\ +\x03B\xce2\x91\xed\xbb\x8a\x1a\x1cy%(\x080Y\ +?\xfba\x04\xef8\xcaS\xd6\x82\x16N\xb0\x10\x18d\ +\xf9\xff\xcd\xf3\xa5\xafp\x11\xf0\xe5\x95\xf0\xe2\x03\x1c\x1e\ +3\x8e\x9d\xcc^3\x87\x18\xcdLP\xb3\x9a)`\x06\ +\x85H\xa0\x0eu\x80\xb3\x96\xe5\xcc\xd4:\xb3$\x01\xb8\ +%\xb0\x81\xfd\xccc)\x0bz\xd0\x14\xa0@h\x13\xa2\ +\x0aU :\xd1\x8a>1\x84\x07\xe0h\x96\xa0\x80\xcc\ +\x05>0\x94\xd1|i-d\xfa\xd5\x8d\x90\x05B\xb2\ +\xd0\xe9N\x7f\x1a\xd4\xa1\x8e3i+\xc1\x83R\xaf\xa4\ +\x16\xc4(\xf3\xaa\xd3,\xe8Wg\xba\x11\xc8n\x04\x89\ +\x0fr\x80Z;\xfb\xd3\xb9\x96/iS\xe0k\x96\xe0\ +\x80\xcf~\x06\xf4\xa5\x8dM\x81d#\x1b\x06b@\x88\ +\xb3\xc7\xediDG\xbb\x1e\x07\xa8\xf6Q\x00\x91m)\ +\x07\xba\xd8\xb0\xf66\x0c\xe6=\xef7\x18d\x13\xc0 \ +7\xb9\xa1\xad\xe8F\xa8\x9b%|\xf8\xb3\xbb\xe1\x1d\xef\ +d\xd3{\xde\xc9HF\x08\x0c\xd2\x82o\x00\xe3\xe1\xfa\ +~\xb6\xb9\xb3<\x8a\x7f\xb3\xc4\x17\xc4\xb04\xc1\xbb-\ +\xef\x83'\xfc\xe3\xe1&\xc8\x02\xbeA\xf2\x92C<\xe2\ +\xb6\xff\x9e\xb8|G`q\x96\x98a\xdb\x05o\xc4\xc1\ +a\xf0\xf1\x8f\xb3\xe0\xe6[\x14\xc8\x08J\xces\x92\x9f\ +<\xe2\xd0\x16E\xcb\x91\x18\x0ccw\x9c\xde5O\xf8\ +\xcd\x97\xce\x02D\x0a\xa4\x06\xac\xe8\xb9\xd4\x7f\xae\xef:\ +\x9ca\xe8,\xd9\xc0\xb1\x0d\x8e\xf4\xa43\xfd\xe6j\x08\ +\xfb\xa6\x05\x82\x00V\x98\xdd\xecR\xe79\xd5\x9d\x8d\x0e\ +\xac\xafD\x16\x5cGx\xcd\xbf\xce\x82\xb0\xdb=\xec0\ + \xc8\xd9\xf7~\xf6\xb4\xfb\xfc\xe7\xc7u\xfbJ|\xd0\ +u\x9b\x7f\xfd\xeea\x1f\x81\xe2\x15/\xeb\x7f\xc0\xa0\x07\ +|\x8f|\xd4\xfd\xfep`\xfc@\xf0+\x19\x82\xd7\x99\ +\x8ex5,\xfe\xf3\x8a\xe7\xe5?\x1e\x10\x81\x1e\x98\x1e\ +\xf2\x92\xdf\xbb\xdf1\xbf\x92^(}\xe9\x9d\x07\xbd\xec\ +\x15\xff\x04\x81@ \x02\xb8\xcf\xfd\xe9Q\x9f\xfa\xc9\x7f\ +c\x05\xac_\x89\x11\xc0~\xf7\xd9\x83\xfe\x05\xc8G>\ +\x9b\xffA\x84\xdc;_\xf7\xa7\xef=+\x94\x11|\x95\ +\x80\xc0\xee\xc6\xff|\xf2\xb7\x8f|5\xfc\x83\x1c\xcf\x0f\ +\xff\xff\xf3w\xcfw#T?%8\xc8\xfe\x08\xb8\xcf\ +\xfe\x17L\xe1\xfd\xd2\xf8\x87\xf8\xe7\x1f\xfe\xe8\x9f?%\ +\xd28~\xfb\x93\xff\xfe\xfe\xfb\x9f\x1c\x14@\x7f\x02\xf8\ +|\x8ap\x7f)\x91\x0c\xfb\xe7~\xfe\xb7\x80\xef\x97\x02\ +\x0e\x88\x0eI\x80\x0a\x128\x81\xa80\x80\xe1\xe7\x06\x06\ +\x88\x12\xc2\xc0\x7f\x0c\xe8\x7f\x0e\xf8\x81 \x98\x02\x9aP\ +\x00\x14X\x82&H\x7fG\x90\x81'\xf1\x04\x1d\x18\x82\ +!\xe8\x070\xe8\x07\xf10\x83\x80`\x00\xdc\xc0\x0d&\ +\x98\x839\x88{,\xa7\x82%a\x0c.\xf8\x8118\ +\x83DX\x84Dx\x02Up\x83J\xb8\x84J\xa8\x83\ +\x14\xd8\x0f>X\x12f0\x84FX\x85D\xf8\x03X\ +\x98\x85\x14\xa0\x0bL\xd8\x85^\xc8\x84\xa8\xb0lQ\x98\ +\x10\x01`\x85Yx\x86hx\x86K\xc0\x02\x88\xf0\x85\ +n\xe8\x85c\xb8\x10\xb2\x90\x86X\xb8\x04vx\x87z\ +\x90\x87z\xb8\x87/\x80\x00\x02\xf0\x87\x80X\x0c\x828\ +\x88\x82\xf8\x86\x8d\x17\x87\x08\xb1\x87\x8a\xb8\x88\x8c\x98\x87\ +)\xff\xe0\x87\x80\x18\x89\x928\x89\x92\x88\x88\x09Q\x0b\ +zh\x01\x9a\xb8\x89\x9c\xd8\x89\x9e\x18\x0f\x94\x18\x8a\xa2\ +(\x00\x96\x98\x10\x9ex\x8a\xa8\xc8\x89\xa3\xb8\x8a\x91X\ +\x8a\x08\x91\x04\xb0\x18\x8b\xb28\x8b\xb4(\x8be`\x09\ +\xb8\x98\x8b\xba\xb8\x8b\xbc\x98\x8b\xaeh\x10\xb5P\x04\xc2\ +8\x8c\xc4X\x8c\xc68\x8cz\x80\x00\xbdh\x09X\xd0\ +\x8c\xce\xf8\x8c\xd0(W\xbfX\x10\x97P\x8d\xd6x\x8d\ +\xd8X\x8d\xc7\xa8\x07\xa3\x10\x8d\xde\xf8\x8d\xce8\x8d\x04\ +!\x0b\x89P\x8e\xe6x\x8e\xe8\x98\x8e\xe6\xf8\x03\x1a\x00\ +\x8e\xee\x08\x8d\xe28\x10\x1e \x03\xf4X\x8f\xf6H\x8f\ +\xea\x88\x8eS\x00\x09\xef\xd8\x8fX@\x0c\xf1\xf8\x0f\x82\ +\x00\x05P0\x0f\x069\x0f\xf7\x98\x90\x0a\xa9\x063\xe0\ +\x8f\xd1\xa8\x00\x10\x09\x91\x01\xf9\x0f \x90\x05Y@\x90\ +\x18\x99\x91\x04y\x90\x08\x99\x90p\xc0\x00\xee\x18\x91\x22\ +9\x92\x10\xe9\x04\x01\xe9\x03N\x90\x92)i\x91,y\ +\x91\x1a\xf9\x92\xf3p\x02\x16\x80\x05$Y\x936\x09\x91\ +\x94\xff\x10\x90j0\x0c*\xd9\x93>\xd9\x92\x16\xa9\x91\ +.\xa0\x057Y\x94\x8cp\x94GYq\xf1X\x04\xc3\ +\xd0\x94N\xc9\x93>\x19\x95+i\x91\x1b\x00\x02E\x09\ +\x91H\x99\x95G\x89\x0c\x5c\x89\x0c\x83\xe5\x8a\xb2\xf0\x94\ +b)\x96R\xd9\x93\x86\xf0\x0f$\xa9\x95Z\xd9\x95l\ +\xc9\x95\xcb\xf7\x8b\xc6@\x00\x040\x96t9\x96=)\ +k6\xa0\x96Y\xd9\x96|\xd9\x95\x04 \x8e\xc1\xb0\x09\ +r9\x98sY\x97uy\x0e\x02\xe1\x06k\xd9\x97\x8c\ +\xd9\x95\x81\xf7\x8bz\xb0\x09\x92)\x99\x84)\x97\x86\xf9\ +\x94=8\x0c\x8d\xb9\x99\x5c\x99\x06\x9e\x99\x06-\xf5\x8b\ +G0\x9a\x93Y\x9a\x95i\x99t\xd9\x0e\x02A\x01\x9c\ +\xd9\x97\x9f\xf9\x9aV\xe5\x8a\x9e0\x9a\xb4y\x04\xa5i\ +\x9a\xa7\xf9\x94V \x10:\xd0\x9a\x9d\xf9\x9a\xaf\xc9\x01\ +\x1c\x00\x01\xbf\x18\x0f\x9c\xc0\x09\xb5Y\x9b\xb79\x99\xa7\ +\xf9\x97\x031\x0a\x8d\x09\x9c\xc0)\x9c\xd4I\x04\xae\x18\ +\x00\x0f\x90\x9d\xc7\x89\x9c\xc9I\x9b\xcbI\x99\x04\x80\x98\ +\x03\xff\x11\x0am)\x9d\xd3I\x9d\x1c@\x04\xeaI\x04\ +\x89P\x8a\xc2\x90\x9d\xf0\xf9\x00\xdb\xd9\x9d\xde\xb9\x9c\xc9\ +@\x10,\xf0\x9b\xe6\xe9\x99\xe8\x99\x9e\xeb\xb9\x9e-P\ +\x8aN\x10\x9f\x04:\x9f\xf4I\x9a\x92\x09c\x03\xc1\x07\ +\xfb\x99\x06\xfd\xe9\x9f\xff\x19\xa1y\x17\x87 \xa0\x0c\x16\ +\xaa\x0c\x04\x1a\x9f\x06z\xa0\x06\xd1\x06\xe7\x89\x9e\x11\x1a\ +\xa2D\x80\x00\x08\xe0\x0e\x88X\x04\x17z\xa1\x19\xaa\xa1\ +\xc7\xd9\x9d\x16`\x102\xc0\x9f\xfd)\xa2!J\xa26\ +\x1ar>\x18\x02\x0c\xc0\x00)\x9a\xa2+\x0a\x9f\xdb\xc9\ +\x9d\xc2`\x10\x1b\xf0\xa04\x1a\xa16\x9a\xa4\x130\x86\ +\x89\xb0\xa3;\xda\xa3*\xfa\xa3\xday\x9c\x08\xd1\x00\xc2\ +y\xa4\xff\x99\xa4Z\x8a\x00\x8a\xc0\x02>\xe8\x09T\xe0\ +\xa4N\x0a\xa5Q\xfa\xa3E\xf0\x8aX\xba\x9e[\x9a\xa4\ +\x8a\xd0\xa6\xa005\xf7g\x0bG\x00\x06`\x10\xa6b\ +\xca\xa3d\x8a\xa1+\x0a\x04\x09\x91\xa6kj\xa3m\x1a\ +\xa8\x8a\x90\x82\x06\x08\x03tz\xa8w\xfa\xa4y\xaa\xa7\ +\xf0\xff)7\x08\xf1\x08\x22\xfa\xa7\x80*\xa8\x81Z\x0a\ +\xb5w~\x19P\x00\x05p\xa8\x88\x9a\xa8xJ\xa6\xd9\ +\x19\x9b\x08\xa1\x05H*\xa9\x5cJ\xa9mZ\x0a\xaa\xda\ +\x06\xbdP}\xcd\x90\x05\x9a\xaa\xa9\x9cJ\xa7\x9e\xfa\xa9\ +P\xbap\x0a\x01\x0a\xeai\xaa\xa7\x8a\xaa\xaa\xaa\xaa\x1d\ +\xd0\x01\x0cP}j\x90\x09\xb1*\xab\xb3\x0a\x06\xb5\x0a\ +\xa5N01\x07\xf1\x03\xbc\x8a\xaa\x95\x0a\xac\xc1\xda\x01\ +\x88\xe0o\x98w\x08\x99\xb0\xad}p\xac\x9b:\xabv\ +\x9a\xa8)\x0a\x85%\x81\x08\x7f*\xad\xa9\xfa\xab\xd5\x8a\ +\x08\xec:\x0ab8t8\x00\x06\xdb:\xaf\xde\x9a\xac\ +u\xba\xac\x9c\x90s\x0a\x11\x0d[\x8a\xae\xe9Z\x0a\xd5\ +j\xad\xec\xca\xae\x8f\xd9r\xd4\xf0\x00\x17p\x01\xf3\xca\ +\xad\xf5\x9a\xac\xe1*\xa6Zp\x12\xe4`\x03\x93\x8a\xae\ +\xbf\x0a\xb0\xeb:\xb0\xecz\x00\xc4\xd9r\xd2\x00\x05\x09\ +\x9b\xb0\x0b\x9b\x09\xdd\xda\xb0\xb3z\xa7\xd3\x00\xa7%\x91\ +\x05\xbd*\xad\x17\x1b\xb0\x1a\xbb\xb1\x070\xb39eq\ +\x89\xff\xc0\x05\x5c\x10\xb2\x0a;\xb2\xde\xfa\xad\xc9\xea\xa4\ +\x11\x9b\x12\x07\xe0\xaf/\x9b\xb1\x1a;\xb3H{\x00k\ +\xf0oI\x80\xb38\xab\xb3#K\xb2=k\xaf`\xf0\ +\x00\x87x\x12?\xe0\xb2\xeaj\xb4G\x9b\xb4\x070\x0a\ +\xa3P\xb3\x8e\xd6\x04\x830\x00N\x8b\xb3;\x00\xb5<\ +k\xb2\x9c\xea\x03+\xd1\x0c\x0d \xa8\x17\x8b\xb1\xc1\x1a\ +\xb32\x9b\xb4`\x0b\xb6n\xf0\x9516\x0cs0\x00\ +f{\xb6i\x1b\xb2Q[\xb2\xc7\xca\xa9Yp\x14b\ +0\xad\xd4\xca\xb5\x03\xeb\xb5_\x9b\xb7+\xb0\x02\x13\xe0\ +^1\xa6\x03`\x10\x0a\x7f\x0b\xb8g\xcb\x05\x83+\xb2\ +#k\xb8\x87\x0b\x06\xb8\xca\x12k0\xb70k\xb7\x90\ +\x1b\xb9\x92;\xb9\xc7\x10\xb4\xdf\xe5\x02\x5c\x10\x0a\xb4\xbb\ +\xb9\x81\xeb\xb4\x9f\x0b\xba\x0b+\xba\x9aJmI1\x0a\ +\x8d[\xb7\xaa\xeb\xb5y\xdb\xba\x93\xdb\x02-\xb0\x09\xc8\ +\x95\x0bS`\x02&@\xbb\xb5\x0b\xb8\xb7\x8b\xb6:\xbb\ +\xb3\xbb{\xac\xc3\xaa\x14#@\xb7\x02;\xbcx[\xbc\ +\xa3\xff0\xb9\xc7\x8b\xbc\xa0\x00\x09f\xa5S(\xc0\x00\ +3\xe0\xbc\xcf\x0b\xbd\xb6\xdb\xb9\xb9k\xbd\xd7[\x00c\ +\x97\x145\xe0\xb8\x8fK\xbc\xe0+\xbe\xe3\x0b\x0a\xa0 \ +\x07\xad0\x0f\x8e\xf0Q#\xb0\x06\x06\xbc\xbe\xce\x0b\xbd\ +\x9a+\xbd\x9d\x9b\xb3j\x1b\xba\xe6T\x164\xd0\x0a\xdd\ +\x1b\xb3\x90\x0b\xbe\xe1\xcb\xbf\xc8\xdb\x02\xff\xdb\x0a\x1e\xec\ +\x0e\xd8\x8a->\xc0\x05\x06`\xc0\x07\xcc\xbe\x0a\xfc\xbe\ +\xf0[\xbd#\xab\x0c\xadU\x16\xc2`\xb7\x88\xb0\xba\x18\ +\xcc\xbf+\xb0\xc1\xfe\x0b\xc0\xadp\x0c\xb7p\x0b\xb4\xe0\ +\xb6{\xf2\x01``\x00D\x5c\xc2\x07\x8c\xc0\x0a\xbc\xc0\ +\x9c\xbb\xc2\x0f\x9c\x09\xe7k\x16N`\xc1\x17\xbc\xbf\x1a\ +L\xbe\x1d\xec\xc1=\xac\x0b\xba\x90\x03\x8f\x80\xa3\xe7A\ +\x02`P\x03b\x5c\xc4&\xbc\x06\x08\xdc\xbe\xee\xcb\xc0\ +LL\xb8\x990\xa1\x86\xf1\x08\xf9\xab\xbf\xc5k\xc38\ +|\xc5;\x9c\xc59\xa0\x01z\x5c\x05\xf1\x10\x9a\x5c\xc4\ +\x02sP\x02% \xc65P\xc4F|\xc2\x09\x9c\xc2\ +j\xff,\xb8\xd5\x9b\x04\xa4\xd1\x003<\xc5sL\xc7\ +\xe4+\x07:\xdc\x0aY\xbc\xc5z\xac\x01\x7f\xd0\x00\x0d\ +\x10\x0anl\x16\xe4 \x06\x0f\xf0\x08\x8f@\x09\x940\ +\xc8\x84l\xc8e|\xc6)\xac\xc2\x8c\x9c\xb0\x0f\xa0\xb2\ +\x87!\x07\x92l\xbc\xe2[\xc7\x97\xdc\xc3\xb7\xa0\xc9z\ +\xfc\x07\x9d\xec\xc9\x9eL\x0b\x89\x00\xc4\xeb\xf6\x03s@\ +\x0b\x0e`\xca\xa6\x9c\xca\xaa\x5c\xc8dl\xc2g\x8c\xc6\ +\x9a\x0b\xcb\xb8{\x01`\x10=\xc5\xa1\x04r\x8c\xcb\xe3\ +\xcb\xc1v\xcc\xc3\xbd\xec\xcb\x9c\x1c\xcc\xc2\xdc\x06\xe8<\ +\x01n\xa0\x0cS \x06 \xd0[\x06\x11\x00\x82\xa0\x09\ +'0\x02N\xb0\x06\x00\xe0\x06n@\x0b\xca\xbc\xcc\xcd\ +,\xc8\x84\x0c\xcdD\xdc\xca(\xfc\xca\x8b\x8c\xbb\xefJ\ +\x1a\xc9\x80\xb45L\xc9\x95\xbc\xcbx\xbc\xc9\xc0,\xcc\ +\xe7\x9c\xce\x130\x01\xee\x90\xd1\x12\xb0\xd1U\xd0\xd1\x10\ +\xf0\xd1\x90\x10\xd2[\xb0\x05\x00\x90\xcf\xfa\xdc\xcf\xcc\x8c\ +\xca\x00\xbd\xca\x03M\xd0\x89\x9c\xc6\x07\xcd\x05\xf5k\x1c\ +/\xff\xc0\xba\xde|\xc3\xba\xec\xc1\x98\x9c\xc9y\xfc\xcb\ +\xe6\xec\xc9\xe8l\xd1\x18\xad\xd1\x1c\xed\xd1\x1f\x0d\x01!\ +\x0d\x09$m\xd2\xfb\xac\xcc\xcc|\xca+=\xc6\xd1|\ +\xc4\x05\x0d\xd3K\xcc\x05C\x1a\x22K\xd0\xd0U\x0c\xce\ +\x97\xbc\xd3\xbd\xdc\xd3\xe5L\xd1@-\xd4C\xed\x0e\x1b\ +-\x01\x1d]\x05G\x8d\xd4\x22M\xd2\xfa\xdc\xd4\x0e\xe0\ +\xcf\xa7\xec\xcc\x01\xcd\xca\xd2\xcc\xbe\xd4\xac\xc4\x9c\xcb\x04\ +{\xf2\x03\x93\xdc\xd59\x0c\xd1\xe3,\xd6\x13M\xd6A\ +}\xd1\x17\x9d\xd1h]\xd4l}\xd4I=\xd2L\xbd\ +\xcfs\xfd\xd4v\xcd\xd2-\x9d\xd7U\x1d\xbd\x80\x0b\xbb\ +Y\xf2\x02`k\xc38m\xc5\x97,\xceZ,\xd6c\ +M\xd1A\xdd\x06\x8a\xcd\xd8\x8d\xad\xd6k\x0d\xd9o]\ +\xd2q\x8d\xd2)}\xd9R\x9d\xd9f\xec\xcaI\xfc\xb7\ +Y\xad+0 \xda\x1b\xec\xd5:\x0d\xd6\xa7-\xd1?\ +]\xd6B\xed\xdai\xbd\xd6\x8f\xed\xd6J\xbd\xd4\xb5m\ +\xdbu\x1d\xd5\x02}\xc8T\xfd\xd2\xd0;\xd3\x9a\x02\x08\ +\xba\xff\x90\xcb\xbaL\xd8\xc7\x8d\xdcd\xdd\x00\xab\xdd\xda\ +\x8c\xdd\xdc\xb1\x0d\xd2\xb3\xcd\xd4\xfc\x5c\xd9)-\xc8\xcf\ +|\xddel\xc6z\x0d\xbd\x17\xb0\x9b\x1f5\x01\xdf<\ +\xd8:-\xce\x85M\xde\x88\x9d\xd8\xe8M\xd4\xb0m\xd4\ +\xd0-\xd9\x93M\xdd\xd5=\xdf\x86\x8c\xdd\xf6\x8d\xc2`\ +\xa0\x03W\x15\x00\x060\xdc9\x5c\xdc\xbc<\xde>]\ +\xde\xe7]\xe0\xcb\xa0\xde\x08\x9e\xd4\xd1\xbd\xe0\x0c\xee\xcc\ +\x0e>\xd5\xd9m\x02\xf3\x80\x5c\x83@\xda\xa5\xbd\xe1\xe4\ +\x0c\xcc\xc9m\xde\x04\xbe\xd8\x06~\xe0\xcfM\xe2\x0a>\ +\xdd\xf0\xdd\xcc\xb8}\xdd\x10\x8e\xc0\xde\xf7]@\xd0\x00\ +\xff\xfb\xd52\x8e\xda\x87=\xe0\xcb\x9d\xde\x22\xbe\xe3\x91\ +-\xdd'}\xe2(~\xd7xm\xc2;p\xa9\x16\x16\ +\x0aJ\x9e\xc9\xe4\x9c\xda\xaa}\xe3g\xfd\xda:.\xdb\ +\xed\x1d\xd7rM\xd7\x0d\x8e\xe5*.\x03\xf6vd_\ +\xc0\x02\x0d\xe0\xc1\x00\xce\xe1b>\xe6f\xcd\xdcQ\x8e\ +\xe6%n\xe2?\xde\xe0)N\xc6s\xf0\xdb\x8ev\x01\ +\xc6\xff\x8d\xe7M\xae\xe7\xac]\xe0f\xee\xdc~>\xd2\ +p\xed\xe3l\x0e\xd5\xd6}\xddE\xe0\xa8\xd5\xe6\x03\x10\ +\xc0\xd3\x9b\x5c\xce5\xbe\xda\x8d\x8e\xe39\x0e\xe9h.\ +\xe9\xb4]\xe5s\xcd\xe6*=\xdf\xd0\x5c\x00\x1f0t\ +\xb9\xf0\x02\x0d\xa0\xe85n\xe3f]\xe6i}\xe6\x91\ +N\xe5\xaa\xce\xeaWN\xc8&\xe0\xd9C\xf7\x06I\xd0\ +\x00\x9fN\xe3\xe5\x8d\xeb\xa3^\xe6\x8f\xbe\xde\xec\x9d\xe6\ +\x94\xfe\xd4m^\x03kP\xe4\xd5\x97\x04m\xd0\xe1\x1e\ +\xfe\xe1\xa4\xee\x0e!\xde\xe7\xbd\x9e\xea\xbf\x0e\xec\x82l\ +\x00=\x98\x81/P\x05\x8b^\xd1d\xee\xda\xe1\xee\xd8\ +\xcf\x0d\xdd\x7f\xae\xe6\xfc\xcc\xe0\xa7<\x07\x14p\xb5*\ +\xe8\x03;\xb0\xec\xa2\xae\xd8\xba\xbe\xeb\xa6\x1e\xed\xd1\xed\ +\xebk\xfe\xd4\xd1\xe0\x09\xaf\xe0\x8a8\x90\x02\x0e\xc0\xe8\ +\x02?\xf0\xe2n\xf0\xa8\x0e\xe8s}\x01\xf79\x91C\ +\x90\x025\x10\xf0\x02\xcf\xe7\x15O\xef\x17o\xef\xb4\x90\ +\x09,\x00\xcf\x13Y\x10b0\x0c\x00\xd0\xec\xae\xfd\xec\ +\xd0GN\xef\xf5\xee\x06kP\x04>\xa0\xe9+\x9f\x10\ +|\xd0\x0f\xf1\x00\x06\x90\x10\xf3\x04_\xf04\xbf\x055\ +\xb0\x09/\x00\x08|\xbb\xf3)a\x0c$\xc0\x02\x16\xe0\ +\x04\x99\xbb\xccn\xd0\xd1n\x90\xca\x5c\xa0\x0c\x83\xf0\x03\ +0\x00\x08(\x10\xe71\x16\x10\x00;\ +\x00\x00\x01u\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xf2ID\ +AT(\x91\xa5\x921n\xc2@\x10E\xdf`\xd6\x8d\ +%\xd7$\x07\xb0BaH\xb5\x07p\x0fJh\xc2\x11\ +\xc2\x81 \x07 \x05\xb9\x84\xb9\x86\xf1\x01\xa0w\xe9\x95\ +\xb5)\x22/,H\xc6(\xbfY\xad\xfe\xbe\x9d?\xa3\ +\x91\xd74}\xb3\x22_\xc0\x88\xbe\xb2\xf6$\xb0\x92i\ +\x9a\x1e\x11y\xea\x0d\x9eu\x1cv\x81J)>\x96K\ +w\x8f\xa2\x88 \x08\xd8\xac\xd7\x00\xcf\xc3\xae\xaf\x8d1\ +|o\xb7\x00$IB\x96e\x18c\x9c?\xe8\x93\xaf\ +\x05\xf3\xfd\x9e\xaa\xaa\xfa\xc3\x0e\xccs\xca\xc3\xc1\xf3\xee\ +\xc2/\xe3\xf1\x1fX\x967\x9eL'\x13\x0b\x10\x86!\ +u]\x9f\x0d\x11\xac\xb5\xeelu\xf9\xceU~_,\ +\xbc\xa8\xb3\xf9\x1c\xc0\x03\x01\xaf\xc0M\xec\xb6\xc7\xa2(\ +\xeeu\xe4\xc3\x97S\xbd\x1eN'\x1c\xc7\xf1C \x80\ +[\x12\xa5\x14M\xd3\xa0\xb5Fk\x0d\xc0\xcfn\xe7-\ +\xc5\xb5\xfe\xb5\xdb\x03\x81\x15\xd6\x9e\x1e\x05-|\xfe\x02\ +\xf6!\x5c\xaa\x93\xbcW3\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x04u\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Artboard\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x00r\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0c\x00\x00\x00\x06\x08\x06\x00\x00\x00\xf7\xee\x7f\x81\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x00\x14IDAT\x18\x95c\ +`\x18\x81\x80q\xe6\xcc\x99\xffI\xd1\x00\x00\x82o\x02\ +\xccv\xbf$p\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x00Y\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x02\x00\x00\x00\x1d\x08\x06\x00\x00\x00\x806\xbdj\ +\x00\x00\x00 IDAT\x18\x95cTRV)\xd7\ +\xd2\xd6f`a``\xe8`````b\x80\x82\ +\x91\xc3\x00\x00\x05\x9b\x02$,N\xcaF\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01\x82\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0b\x08\x06\x00\x00\x00\xa9\xacw&\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xffID\ +AT\x18\x95\x85\xd1\xa1K\x03q\x18\xc6\xf1\xef\xfb\xde\ +\x0d9\x15\x14g\xb0\x08\x9eI\xaf{\x1a\x04YY\xd4\ +lt\x06\xc1\xaaYL\xfe\x03*\xac(X\xfd\x0f,\ +sAd\xcd\xb2\xb9 ,,\x18\x84%eA\xef\xf7\ +{\x0d\x8a\x22\xb7\xc37\xbe|\xe0yx_\xa9\x9c\x0c\ +W\xc5\xfc%\x900z\x0c\xe8\x9ahM\xff\x81\xc4\xb3\ +&\xe5IK\x04\x7f\xa1\xc0r\x11\x8cJpP\xfd`\ +e\xc1\xc0H\x14\x90\x22\xbc\xb3\xeexyUn\xda\x0a\ + Z\x04\xd3\xd8\x93\xc6\x8e\xf3\xdb\x00\xfb\xde)\xc0\xd2\ +\x9cQ\x9e\xb0\x1f8\x15\x19{\x1b\x19\xf5f\xc8\xe0\xed\ +7X\x01\xd6\x16=\xc7[\x19\xd3\x91!\xc0~\xc5\xf1\ +\xd0WZ\xbd\xbf\xc1!\xc0\xd5}\xc0\xf8\x18\x1cmf\ +\xdc=)\xf33\xc6\xe1u)WM\x013\xa0\xde\x0c\ +\xe8\x0f\x84\xed\xd4q\xd6\x08\x19\xbe\xe7\xac\x85@\x17H\ +\xbc\xc1i#\xa4\xd5\xf3<>\x8f\x86\x88\x04DT\x10\xab\xb3\x10/\xd9\ +\x1bg\x96[\xb9\xdb\xc4\x81\xbd\xd9\xf9\xe6\xfbv\xe7f\ +\x07!go\xcd\xf5\x99a\xa8\x8f\x00a\x0b\x08V\xb3\ +\xd4\x03\xfbn00g\xd5\x9b\xfbOGG\xb7yi\ +m\xb4\x88\xe8\x82\xe3i\x87\x15n\x9f\x83\ +\xf4\x89Z\xbe\xbe\xfd\x90\x89`B\xa1\x0b\x8a`\x89o\ +\x5c\xf4\x84$\x5c\xabq\x89\xe7\x9d\xc6.\xef/y\x94\ +\xa6\x1c\x96\xf7|\xea\x97B\xdc+\x8c\x9c#\xfc\x0d9\ +P\x93\xbbYc<\xe1\x83\x1e\x09\xa8\x17\x0c\xd2\xd3\xfc\ +\x90\xff\x02\xce\x94vS\x82\xbcEV\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01\xde\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc2\x00\x00\x0e\xc2\x01\x15(\ +J\x80\x00\x00\x01sIDATHK\xadTAn\ +\x03!\x0c\x04.\xa9\x14U\xcd\x1f\xda\xe4\x13\xcd\xff\xdf\ +\xd2&oX\xdc\x19\x8f!\xacz\x02-\xc8k\x8f\xed\ +\xf5\x18\xb3I\xfe\xbe\xdf\xed\xf7\xe7\x91J)\xa9-\x83\ +d\x99K\xabZM\xe5\xf9x\xa2\xca\xff2\xe6[$\ +\xa3p\xedq\xcb\x93\xa6\x95sI\xf9\xf3\xebj\xe7\xf3\ +{:\xbd\x9d\xbcKS\xd4[\x9e\xc2\x5ct`\xd5\x8a\ +\x8ei\x94\x02O58\xc0\x8aL\xca,\xf6\x0dL\x7f\ +\xc6\x04b\xb0C\xc2\xa2\xb0 w\x85\xc0\xa1\xc2\x22\xc2\ +c X\xc1\xec\xd80\x06\x9e\xc4\x0b\xbb\x037\xc9\xd9\ +\xb4\xc4y\xbc\x17\x15F\x12l\x10\xd0f`\x05\x0f~\ +<4\xe3\xeel\x09tMb\xef\x9eZ\xb5\xfa\x8c\xe9\ +\xe0\x9c\x5c\x984\x89\xd1<|A\x84X\x8cB,\x14\ +d-aj\x11I\xc7(\x08H\x80\xb8\x07)\xb3\xb8\ +\x91IG\xc7L\x80\x93\xac\xec\xc0\xd9g1\x0a\xfa\x01\ +\x80Q\x0f\x85\x1b\x9b\xd8\x89\xc5:\x89\x1b\x19<,\xae\ +Q`1\xc0l\xfdL\x17p'd\xc7\x98\xb1;\x03\ +\xa8\xf3Wp\x0a;\x01$t\x9f\xb1\x12\x8e\x93(\xfc\ +r\xe01\xe0\x88\xf5c\xee\xe3\xa3\xdd\xb0|~yZ\ +\x80\x1e\xc4I\x86\x17td&6\xed\xc7\x8fM\x9bN\ +\xbe\xc2\x0a\xc4x\x03v\xff\xdc\xf8\x9d\xd0b\x18;\x92\ +\xa9\xc3p\xed\xb1\xf0k\x96\xf1e\xe0\x22\xa9\x22\xc9/\ +4_o7\x7f\x7f\xdb6F\x0eY\xfeG\x7f\xf9\xb8\ +\x80!\xda=h\x99Y\xfa\x03}T\xd8\x22\xc5\xe7_\ +\x1f\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xdd\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x04\x08\x06\x00\x00\x00\xb3\xcd~\xf0\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00ZID\ +AT\x08\x99c446.bd`le``\ +\xe0`@\x03\x8c\x0c\x8c\xf5\xcc/\x9e??.!%\ +\xf9\x87\x91\x81\xd1\x05Y\xf2?\xc3\xff\xa6sg\xcf4\ +23000\xbcx\xfe\xfc\xa8\xa4\xa4\xd47\x06F\ +\x06W\xa8t\xcf\xf9\xb3g\xab\xd0Md066.\ +646mG\x16\x03\x00S\x9c\x180'\xdf\x9e>\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x062\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Artboard\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a \x0d\x0a\ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x04\xe8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x17\x08\x06\x00\x00\x00\x11!\x8f-\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x04\ +\xa2IDATH\x0d\x85U_H\x9bW\x14\xff\xbe\ +/\xff4\x9a\xbfFM\xc8\x8cR\x86\xad\x8e\xae\xfe\xc3\ +9\x18hkt\xec!\xd4\xf9\xa8\x16*\xa3\xc2(\xe8\ +\xdb\xd8\xc3\x04_\x86\x0f\x03\x87\x0f\xbe\x08\xb2\x879\xdc\ +\xb0\xadLL\x5c\xf6\xa2B\xb7jg\xd5\xea\x92\xdai\ +\x9bF\x12iM\xcc\x1f\x13]L\xf2\xe5\xdb9\xd7\x5c\ +\xd1%\xb6\x07N\xee\xfd\xce9\xf7\xfc~\xf7\x9c{o\ +X\xe6\xdd\xc2\xa6C\xe8xv\x85\x90\xfe\xa0\xe3Y\x1f\ +\x99\x8b3,\xe7\x0d4);44$\xe3y\x9eC\ +\xf7\xe1\xe1\xa1000\x10\x87)\x7f><\xf3\x8b&\ +\xc8\xf4\x9cX\xd0\x8f*\x1c\x1c\x1c|\x11\x0e\x87\xb5\xa9\ +T\x8a\xd5h4\xfbJ\xa5\xf2\x87\xb4\x8f\x82\x5c\xb8\x8b\ +\x93T\xd9\x7f1\xb9\x08\x94K$\x12\xb6\xef\x86\xbe\xdf\ +G=>>\x9e\x05\x9b\x04T\x8a>\xd0\x0b\xe5mN\ +\xc2\x1cVb\x0c\x820V\xdbo\x1aTA\x10\xd0'\ +K\xdbq\x8e\x9aU.\x02 \xc9\x97\x97\x97\xe5==\ +=\xc8\x94\xc3\xd2\x88D\x22\x06\x15z\x81~\xb1\xd9l\ +\x96\x8e\x8d\x8d\xc9aNA2\x80\xb2\x01\x90\xa0@ \ +\xa0*//7\xb7\xb5\xb5\x19\xd2\x00\xa7\xb1\x00\x86s\ +\xae\xb3\xb3\xd3\xd0\xde\xde~\xc3\xe5r)/\x029]\ +\x94\x0e\x80\x81a\xb7VVt\x91H\xc4\x22\x16\x8b\xef\ +\xa8T*#\xd8 g\x0a}Dp70I\x96\x94\ +\x94\x18\xa4R\xe9\x1d(\x99eqq\xb1\x10lXJ\ +\xba\x1b\x12K\x01\xd0(\xcc\xcd\xcd\x89\xddnw\x99\xbc\ +\xb8\xd8\xf2\xe7\xa3\xa5[{>_\x85\xd1h|os\ +\xf3i\x99D\x229=\xd2\x90\x94\xb3\xdb\xed\xa6\xd2\xd2\ +R\xa3\xcf\xef\xbf\xb2\xb8\xf4\xd7-\xbd^oY]]\ +-kjj\xa2\x8d'@\x04\x11\xce4;22\x92\ +WTTT\x01'\xe4\xf3\x95\xd5\xb5\x9b\x13\x93\xf7\xaa\ +\xe0(2y\xf9\xf9\xca`\xf0\xa0:v||\xd9j\ +\xb3\x17\x0ap\x18?n\xa8?\x8a\xc5\xe2%\x0c\xcbU\ +\xaf\xad\xaf\x97N>\x98*\xd1iu\xc5\x06}q^\ +ccc\xa4\xae\xae.233\x93@\xd2tK\xa2\ +\x8e\x8e\x8e\xcb\x0a\x85\xe2\xf6\x1f\x8bK\x9f\xfc<9Y\ +\xfd\xca\xb5\xa3\xd9\xf3\xedI\xb7\xb6\xb7/9\x1c\x9bU\ +\xc0R\xe1\xd9\xf5\xca\x92|\x92u\xbb=\xf2g\xcf\x9f\ +W\xado\xac_z\xf2d%\xcf\xf5\xf2\x95\xd2\xb3\xeb\ +\xd1\x16\xe8t\x8a\xba\x9a\x9a\x22\x99L\xe6\x99\x9f\x9f\xf7\ +C\x1fy\xb2\xed\xc2\xc2B.\x16\x8b\xe5\xe7\xe6\xe6\x1a\ +\xc2\xc1PN \x10\x92\xb1\x1c\xcb\xec\x07\x82\xe2x<\ +\x011\x02\xc7'y.%\x9c\xf4\xc1\xeb\xf5HEb\ +\x11\xd8YQ$\x1a\x85\x8d\xb0L \x18\x92\x85\x83\xe1\ +\x1c\xb8/F\xe8\x89\xe2\xe8\xe8\x08\xc9sd\x07N\xa7\ +\x93miiI\xc6\xe3\xf1\x10\x0b\xebt\x05\xda\xdc`\ +8,\xff\xac\xc5\x1c\xad\xad\xadz\xa4\xd7\x1bV\xcd\xcd\ +\xd7\xe5\x8f\x1f/k1\xef\xdd\xbb_\xba5j\xf5\x5c\ +\xcd\xb5\xab\xaf\xcbL&\xe5~(\x98hi\xbe\xfeO\ +\xa9\xc9\xf40\x14\x0a\xfe\xbe\xb0\xb0\xf0lzz:\x02\ +\x00IZ\x22fbb\x22>;;\xebm\xf8\xa8~\ +\xb7\xae\xb6&\xa2U\x17\xa8[[\x9b\xe5\x05j\xf5(\ +\xec`\xca\xdc\xdc\xdc\xf0\xcb\xe4}\x13\xde\x83o\xbe\xfe\ +\xca\xe9v\xb9\xbe\xbdZY\xb9\xffa\xd5\xb5z\x99$\ +g\x0b\x88\x0d\x0a\x0d\x0a Artboard\x0d\x0a \x0d\x0a \ + \x0d\x0a <\ +path d=\x22M13.0769\ +231,2 L14,2.9230\ +7692 L8.923,8 L1\ +4,13.0769231 L13\ +.0769231,14 L8,8\ +.923 L2.92307692\ +,14 L2,13.076923\ +1 L7.076,8 L2,2.\ +92307692 L2.9230\ +7692,2 L8,7.076 \ +L13.0769231,2 Z\x22\ +>\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x01\xb4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x011ID\ +ATH\x89\xed\x92?KBQ\x18\x87\x9f\xf7\xaa\x8b\ +\x88cK\x93\x82k\xcb9\x17]\x1a\x82\xdcjjh\ +\xee{T\xf4\xef\x03\xf4\x09\x5c\x8b+\x81\xd6\x96\xa0A\ +[r\x06\x87\xd6\xe6\x96\x96\x06A\xf4\xfa6\x94 \xd1\ +\x95c\xdc!\xc8g:\xe7\xe5\xfc\xces\xce\xcb\x0b+\ +V\xac\xf8\x1bDQ\x94\x89\xa2(\xf3\x9bl\xd6\xf7`\ +\xb9\x5c~v\xce=\x01\xcdb\xb1x_\xa9TF>\ +9\xf1\x15\xf4\xfb\xfd\x86\x88\x1c|m\x87@WU\x9b\ +q\x1c\xb7j\xb5\xda{R.\xf0\x15\x00\xed\xb9u\x1e\ +\xd8\x11\x91F.\x97\xbbq\xcem$\x85\xbc[$\x22\ +\x1d>_\x9e\x9f+\x9f\x1ac\xce\x17\xe5\xbc\x7f`\xad\ +\x1d\x02\x9do\xe5c\xe7\xdcf*\x02\x00\x11i\x03#\ +\xe0\x02\x88\x81\xac\xaa^\x0d\x06\x83\xb5T\x04\x93\xc9\xe4\ +VD\xba\xd6\xda#U\xdd\x06^\x81\xf5\xf1x|\x9d\ +4\xc6K\x09\xaa\xd5\xea\xdbt:=\x01\x08\xc3\xf0!\ +\x08\x02\x03<\x02[\xa5R\xe9\xec\xa7\x8c\xf7\x98&\xd1\ +\xeb\xf5\xb2\x85B\xe1PD\x8e\x80=km+U\xc1\ +\x0c\xe7\xdc\xae\xaa^\xaaj=\x0c\xc3\x97Y}\xa9\x16\ +-\xc2\x18s\xa7\xaau\x11\xd9O\xeb\xce\x7f\xc2\x07\xc2\ +\x03]rK\x9b!\xa8\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x02\x82\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xffID\ +ATH\x89\xed\x91?h\x13a\x18\xc6\x7f\xef]H\ +\x9d:8j\xd5\x06'\x17\x87\xdcw$\x83H\xc5:\ +\xe9R\x84\x80\xabb\x8b8\x14,:\x15\x1c\x04\x05\xdb\ +IPP*\xea$\xc4A\x1d\x1c\x0aBE$\x5c\xb8\ +/GD\x10)\x92(88\xa8H\xc7\xe0\xdd\xebr\ +)g\x9a\x98\xe8X\xfaL/?\x9e\xe7}\xbe?\xb0\ +\xa3m/\x19\xc5\x14\x04\xc1x>\x9f\x9fP\xd5q\x00\ +\x11\xd9\xe8t:_\xca\xe5\xf2\xc6\x7f\x15T\xabU\xb7\ +P(\x9c\x12\x91\x19`\x0a80 \xff\x19XS\xd5\ +\xa7\xedv\xfbE\xa5R\x89\x87\x164\x1a\x8d\x19U]\ +\x02\x0e\xa6\xe8'\xb0\xae\xaa?\x1c\xc7\xc9\xa9\xea\x180\ +\x09\xec\xeb\x89~\x04.\x1bc\x9e\x0d,\xb0\xd6.\x03\ +\x0b\xc07U\xbd\xed\xban\xb5X,\xbe\xefw\xf4f\ +\xb3\xb97\x8e\xe3\x13I\x92\x5c\x14\x11\xd3\xe5\xaa\xba\xe4\ +\xfb\xfe\x95-\x05a\x18\x9e\x13\x91\x15\xe0I\x1c\xc7\x17\ +J\xa5\xd2\xf7~\x8b{\xa5\xaab\xad\x9d\x15\x91;\x80\ +\x03 \x22g=\xcf{@\x17\xa4\xf0\x92\xaa\xben\xb5\ +ZgF]\x9e\xe6\xd4\xf7\xfd\xbb\xc0\xcdL\xe9Bw\ +v2\xde\xfd\x22R\xeb\xf7Q\xbd\x0a\x82`\x22\x0c\xc3\ +\xe9\x1e\xfc.3O\xf6+x\x0b\xccEQ\xb4g\xd0\ +\xe2Z\xad\xb6\xdbZ{#\x97\xcb\xad\x8b\xc8\xf1.\xaf\ +\xd7\xeb\x05`1c\x8d\xba\xc3\xe6\x1fXk\x8f\x01/\ +\x81\xaf\xc0Uc\xcc\xca\xa6;\x8a\x8e&I2\x0b\x9c\ +\x06v\xa5xUUW\x81#\x22r\x12\x18Ky\xac\ +\xaa\xd3\xbe\xef\xbf\xfa\xa3\x00\xa0\xd1hTT\xf5\x91\x88\ +\xd4=\xcf\x9bJ\x8b\x17\x81k\x83n\xd5\xa3_\x22r\ +\xde\xf3\xbc\x87]\x90}\x22<\xcf\xab\xba\xae{(I\ +\x92\xe7\x19v]U\xef\x8d\xb0<\x10\x91rv\xf9\x96\ +\x1b\xfcM\xd6\xday`\x19\xc8\xa5H\x81\x0f\xc0\x1a\xf0\ +\xd8\x18\xf3\xa6_n\xe4\x02\x80(\x8aL\x92$\xf7\x81\ +\xc3\xc0-c\xcc\xfc\xb0\x8c3\xcc\x90U\xb1X\xb4\x80\ +\x11\x919U\xfd\xf4/\xd9\x1dmc\xfd\x06>\xa9\xc1\ +\xdf\xe52*j\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x03\x14\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x91ID\ +ATH\x89\xed\x95OHTQ\x14\xc6\x7f\xe7\xcd\xe0\ +\xd8B\x906B\xad\xd2\x08*\x92\x9a\xf7\xe61I\xb4\ +\xa8M\xed\xa2B\xda\x94-J\xa9\xa0V&\x86\x12\x91\ +\x19fP\xd9\x222(Z\xb8h*[\x14-Z\xd4\ +f*\x99yo\x9aEBa(AP\xb4\x11\x0c\x1c\ +\x99y\xde\xd3\xa6\x91\xd1\xfc3\x99\x9b\xa0o\xf9\xce\xe1\ +\xfb\xee=\xbfw\xef\x85\xffZBRnc6\x9b]\ +[(\x14\x8e\x8b\xc81\x11yi\x8c\xb9\x14\x8b\xc5>\ +\xfeU\x80\xaaZ\x9e\xe7\xed\x12\x91f`?\x10*)\ +\x1b\xe0\xb9\xaa^\x8c\xc5b\xa9?\x0a\x18\x1a\x1a\xaa\x09\ +\x87\xc3G\x81\x16`\xddR\xab\x04^\x8bH\x8fm\xdb\ +O\x17\x0d\xf0}\xdf6\xc64\x8b\xc8a`U\x19\xc6\ +s\x95U\xd5kccc\x03\x8d\x8d\x8d\xd3\x00\xe1b\ +\xc5\xf3\xbcvU\xed\x12\x11k\x19\xc6Em\x15\x91\xfe\ +\xba\xba\xba\x1a\xa0\x17`\xc6\xccq\x9c\xcb\xc6\x98z\xe0\ +\xe12\xcd\x7f\x00}A\x10\xac\xb7m\xbb\xb7\xf8q^\ +\x06\x99Lf\xb71\xa6\x07\xb0\xcb0\xfe\xae\xaa\xb7\x22\ +\x91\xc8\x8d\xfa\xfa\xfa\xf1\xb9\xc5y\xc7\x91\xcf\xe7\xdf\x03\ +\x8fD\xe4\x02\xf0i\x01\xe3QcL\xab\xaa\xbe\x12\x91\ +\xed\x85Ba\xdb|M\xb3\x02|\xdf\xb7\xd3\xe9\xf4\xed\ +p8\x9c\x02\xaaC\xa1\xd0\x1d`\x93\x88\xb4\x00\xdf~\ +\xb5eU\xb5ittt\x83\xeb\xbaW\x8d1\xa7T\ +\xf5\xad\xaa\x0ez\x9e\xf7.\x9dN\x1fI$\x123\xbf\ +\xf3\xcc\x88<\xcfk\x07\xba\x80qc\xcc^\xd7u\xd3\ +\xa5\xe1\xc9d\xb2\xaa\xa2\xa2b\x8b\xeb\xbao\xe6\xae2\ +\x91H\x84jkkO\x02\xd7\x81\x82\x88t\x169\xcc\ +b\x90J\xa56[\x96u\x1e8\x00<\xb6,\xab5\ +\x1a\x8d~^`D\x0c\x0f\x0fWLNN\x1e\x12\x91\ +s\xc0\x1a\xe0^\x10\x04\xbd\xf1x\xfc\xcbo;(\x95\ +\xe7y\xfb\x80\x0e`#p3\x08\x82\xeex<>Q\ +\xac\x8f\x8c\x8cD&&&\x9aT\xb5\x03\x88\x00\x0fD\ +\xe4\x85m\xdb\xcf\xe6z\xcd\x0a\xc8d2;U\xf5\x84\ +\xaa\xee\x10\x91\xd3\xaa\x1a\x06\xba\x81j\xa0+\x14\x0a\xdd\ +\x9f\x9e\x9en\x02\xda\x80\x1c\xd0755u\xb7\xb2\xb2\ +\xf2,pFD>\x18cz\x1c\xc7y\x22\x22fV\ +@)\x03\xcb\xb2\xf6D\xa3Q\xaf8\x86\x5c.\xd7\x02\ +t\x02\xabE$c\x8c\xb9\xe28\xce`\xd1dY\x0c\ +Dd@U\xdb\x1c\xc7\xf9\x0a\xf3C^6\x83\x92\x83\ +V\x16\x83\xc5\x0e\xda\x82\xd7\xb5\xaa\x8a\xef\xfb\x07\x97b\ +\x90\xcf\xe7\xfb\x1b\x1a\x1ar\x0b\xf9,\xf9\xe0\x94\xc3`\ +E\x94L&\xabR\xa9T\xc3\x8a\x19\xfe3\xfa\x09\xed\ +\xc8M\xbb\xbe\xa9&\x08\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x04\x13\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x90ID\ +ATH\x89\xdd\x95Mh\x5cU\x14\x80\xbf\xf323\ +\xccT&\x9b(\x12h\x03\x8d-\x82cB\x9c\xfbf\ +\x08!.\x94B\xa4\x0a\xf9\x83\xe0B\x8aXw\xea\xc6\ +\xb6FWB\x04M\xd3(\xe2N\xdd\x88\xb6\x9b\x80e\ +\x82\xa0\xd5\xcd\x88\xd88\x9d\xb9o\xd2\xcd\x10\xabID\ +R[ta\xb1I\x99!f\xdeq\x917\xc3\xe4e\ +\xfc[\xea\xdd<\xce\xefw\xcf\xb9\xf7\x9d\x0b\xff\xf5%\ +\x7fe\xacT*\xb1Z\xad6\xae\xaa\xa3@\x1a8\x18\ +\x98\xae\x03e\x11\xc9\xc5\xe3\xf1\x5c*\x95\xda\xfe\xd7\x80\ +R\xa94)\x22s@o\xa0\xfa\x1e\xf8\x01P\xa0\x07\ +\xb8\x1fp\x805\x11y\xc9\x18s\xf1\x1f\x01\x16\x16\x16\ +:z{{\xcf\x02\xa7\x80\xdf\x02\x9fo\x5c\xd7}\xac\ +\xd5\xafP(\x1c\x8cF\xa3'Tu\x1a\xe8\x04\xe6\x8d\ +1\xd3\x22\xe2\xb7\xfa9a@K\xf2/\x81G\x81\x03\ +\xaa\xfaf\xd8opp\xf0\xba1\xe6u\xdf\xf7\x1fT\ +\xd5\xaf\x80\xd3\xd6\xda\xd9\xb0\xdf\x1e@\xa9T\x9a\x0c\x92\ +\x17\x80\xc7U\xf5!\xe0\xf6\xd6\xd6V\xbe]\xf9\x00\xd9\ +lv#\x16\x8b\x1d\x07\x0a\x22r\xc6Z;\xd6jo\ +\xb6\xa8R\xa9\xc4\xaa\xd5\xea\x0a\xbb=_\x0d\xe0]@\ +\x1d8\x0f|]\xab\xd5.\x0d\x0f\x0fo\xb6\x03Yk\ +_\x00\xde\x01V\x13\x89D\xaaq\xf0\xcd\x0aj\xb5\xda\ +8\xd0\xab\xaa\x97\x80\x8fD\xe45\xe0\x16P\x01\xee\x03\ +\xde\x8b\xc7\xe3\x1b\x9e\xe7\xbde\xad\xedn\xc3\x18\x07~\ +\x05\x8eT\xab\xd5\xd1}-\x0a\xae\xa2\x1f\x8dF\x9fu\ +]w\xc6\x18\xf3\x01\xa0\x22r\xd1u\xdd'\x12\x89\xc4\ +\xbd\x22\xf2\xbc\xaa>\x02TJ\xa5\xd2\x89\x96\xdd\xf7\x00\ +\x0f\x03'\xd9\xbde\xfb\x01\x80\x01V\x06\x06\x06~j\ +\xd7\x82T*\xb5m\x8c9\xbf\xbe\xbe\xee\x8a\xc8\x1b\x22\ +\xf2\xae\xb5\xf6mU\x15`\x16\xf0\x5c\xd7\xcd\x01+\x80\ +\xdb\x88\x8b\xb4\xe4\xe8V\xd5\xcb\xa1\xbc\xb7\x80\xbb[\x15\ +SSSu\xe0\x5c\xb1X\xbc\xec8\xceg\x9e\xe7\x1d\ +\x05FDd8p\xd9\x00\x86\xdaU\x00\xf0{H\xfe\ +\x16\xe8kWQ6\x9b]R\xd5\x93\xc0q\xe0\x13c\ +L\xa1]\xceV\xe1\xa6\x88\xf4\x84\xf2\x5cQ\xd5\xa1|\ +>\x1f\x09\xe9Y^^>*\x22\xf3\xc0\x1ap\xacX\ +,\x1e\x0aL\x87\x81\x1b\xed\x00\x1e\x90*\x97\xcb\xf74\ +\x8d\x8e\xb3\x08tuvv\x1ek\xe8TU<\xcf{\ +\xaa^\xaf[\xe0\xea\xf6\xf6v\x1fp\xcdq\x9c\x99\x00\ +r\x18\xb0\xfb\x00\x22\x92\x03\x22\xaa\xfatC\x97N\xa7\ +\x7f\x04\xbe\x00N\xe5\xf3\xf9\xb8\xe7y\x13\xe5r\xf9\x8a\ +\xaa\xbe\x0f\xcc\x18c\xc6\x87\x86\x86\xaa\xc0\xab\xc0\x93\x22\ +2\x0dt\xa8j\xae\x91\xa3Yz<\x1e\xcfU\xab\xd5\ +5U}\xd9Z{\x08\xf8\x05\xa8\x89\x88\xaf\xaa#\xc9\ +d\xf2gUuD\xe4\x82\xef\xfb\x93\xd9lv\xa3\x11\ +\xbb\xb9\xb9\xf9y2\x99\xdc\x14\x91\xe7\x80U\x11Yl\ +n\xbc\xb5\xaf\x9e\xe7M\xa8\xea\xc7\x81x\x15\xb8\x13\x80\ +\xba\x81>U\xed\xcfd2\xeb\xe1\xf3XZZJ\xc4\ +b\xb1\x02\xd0\xaf\xaac\x99L\xa6\x09\xd8s\xe2\xc1\xc8\ +\x9d\x0f\xc4\xadh4:\xe1\xba\xee\xc4\xce\xce\xce\x08p\ +CD.Xk\x0f\xb4\xc6Xk\xbbc\xb1\xd8\xa7@\ +\xbf\x88\xcc\xb5&\xdfW\x01\x80\xaa:\xd6\xdaY\x119\ +\xc3\xee\xb8>\x1b\x89D>\xac\xd7\xeb\x09U\xcd\x8b\xc8\ +MU\x1d\xf5}_;::\x9eQ\xd5\x17\x81.\x11\ +\x99K\xa7\xd3\xaf\x84\xc7\xf5\x9f>8\xc1T<\x07\x1c\ +\x01|\xe0\xbb\xe0\xfb\x00\xb0\x05\xdc\x15\xc4\xaf\xaa\xea\xe9\ +\xf0\xce\xff\x16\x10@\xa2\xc0\x18\xbb\xb3\xc5\xb0\xf7\xc9\xf4\ +T5'\x22\x8b\xae\xeb\x86\x7f\xd0\xff\xd1\xfa\x03W\xee\ +t\x99\xe3\xd0\x96\x12\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x00\xd3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00PID\ +ATH\x89c`\x18\x05\x04\x00#\x8c\xd1\xd8\xd8\xf8\ +\x1fY\xa2\xbe\xbe\x9e\x91\x121\x0c\x0b\xce\x9c9\x83\xa2\ +\xc8\xc4\xc4\x84\x91\x121\x18\x9b\x09\xb7\xe7\xa8\x03X`\ +\x0caaa\x0cIJ\xc4\xe8\x06F#\x99 \x18\x8d\ +\xe4\xd1H\x1e\x8d\xe4\xd1H\xc6#6|\x00\x00z^\ +\x83\xb1U\x7f3\xbd\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x03\x13\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x90ID\ +ATH\x89\xc5\x941h\x14Q\x10\x86\xffyy{\ +)\xdc\x03\xa3\x04RY\x18\xb0\x10\xe1b\xee\x11C\x1a\ +]\xd0\x04I\x02\x06\x0c\x8a\xa0\x85\xa0\x9d\x85B\x0cX\ +\x8a\x22\xb1Q\xb0\x11\xac\x02\xa2\x08\x89\x85viN\xe5\ +$\x89\xfb6b`U8T4\xda\xd9\xac!.\x5c\ +.;\x16\xd9=7\xebzw^\x08\xfe\xcd\xb23\xf3\ +\xbe\x997\xcc<`\x8bE\xcd\x1edf\xe18\xceI\ +\x00\xc7\x89(\xcb\xcco\x84\x10w\xba\xbb\xbb?o:\ +A\xa9Tj\xf5<\xef!\x80\x91\x84\xeb\x07\x80A\xa5\ +T12\x88&\xe1S!|.\x08\x82\xfd\xe5ry\ +'3_\x02`\x02xP*\x95Z\xa3x\xd9$|\ +\x08\xc03\xc30\x86r\xb9\xdcJ\xe8\xbe\xe58\xce>\ +f>\xeby\xdeA\x003\xff\x94\xc0u\xddL\x04'\ +\xa2\xe7R\xca8\x1c\x00\xc0\xcc\x8b\xe1\xb7#\xb25\xdc\ +\xa2\xb5\xb5\xb5mB\x88\xdb\xcc|AJ9\x98\x02'\ +f\x1e\x0e\x7f\xdf7\xcamX\xb6m\xdf\xd4Z\xb3\xd6\ +\xba\xc8\xcc\xd5\xe1\xa9\xd9\xa2B\xa1 M\xd3\x1c'\xa2\ +\xf3\x00v\x01X\x02poyy\xf9\x86eY\x958\ +\x9c\x88\xc6\x00|\x94R\x9e \x22\x8e|\x7fm\x91\xeb\ +\xba\x19\xd34\x1f\x13\xd15\x00;\x00\xbc\x02\xb0\x1d\xc0\ +\xd5l6;\x99\x06\x0f\x82\xe0PWW\xd7\xb78'\ +5\x81\xeb\xba\x19\xdf\xf7\xa7\x89h\x98\x99_\x18\x86\xd1\ +\xa9\x94: \x84\xe8\x04Pd\xe6GI8\x00\xab\xa7\ +\xa7g)\xc9\xfac\xd1\x228~O\xcb\xe0\xea\xeaj\ +\x07\x80\xefJ)\xafP(H\xcb\xb2*\x8e\xe3L0\ +\xf3\xe5\x08\xae\x94\xfa\x92V,\xd5\x83\xfb\xbe\xdf&\xa5\ +\x9c%\xa2\x0f\xcc<\x0e\xe0'\x11\x8d1\xf3\xe9z\xf0\ +\x0d\x09\xd2\xe0\xb9\x5cn%\x5c\xae'\x00\xfa\x13g\xdf\ +\x028Z\x0b^M\x10>\x5cS\x00F\xe2\xf0(\x88\ +\x99\xc5\xc2\xc2\xc2h\x10\x04\x03D\x94\x01P,\x97\xcb\ +\x93}}}~-x5\x81m\xdbg\x88h\x92\x99\ +g3\x99\xcc\x91\xe4\x12mF\x02\x00\x88h4\xac\xf4\ +\x5c\x1a\xdc\xb6\xed\xebZ\xeb\xa7\xb6m_\xac\x05\xd3Z\ +s\xd2\x16\x8di\x1b\x00\x16B|J\x068\x8e3A\ +DW\x00\xec%\xa2\xe9\xa6n\x00`\x11\xeb\xed:\x95\ +\x8472\x8a\xb5D\x000??\xbf\xa7\xa5\xa5\xe55\ +\x00\x03\xc0]\xacO\xc81\x00\x03\xf5\xe0im\x89\x94\ +\xcf\xe7\x05\xc5\x02\xfb\x01\xdc\x07\xd0\x1e\x8b\x99\xabT*\ +\xa3\xbd\xbd\xbd_\x1b\xa9Vk\xcdJ\xa9\x0d\xbbU}\ +\xec\x94R3\xae\xeb\xee\xf6}\xff0\x11\xb53\xf3\xbb\ +|>\xff2\xfep\xfdw\xd5j\xd7\x96\xe9\x17\xe6\xbb\ +L\xed\xc8\xc8\xb9v\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x02\xda\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02WID\ +ATH\x89\xd5\x94\xcfKTQ\x14\xc7?\xe7\xf6\x9e\ +\xa6E!\x84\xd6\xa6_\x0b\x17E\xd0\xcc\xbcy\x84\xdb\ +\xd9\x04\xb6\x10$\x82\xdaHP\xe4\xa2\xfa\x0bta\xbf\ +\xfe\x80\x16\x1a\x85\xb5\xa9\x85\x10A\xa8\xb5(\xa8\x9dL\ +o\xc0\x19*\xd0@\x826F\x10E$\xdd\x99\xb8\xa7\ +\x85O\x99&\xe7\xf9*!:\xab{\xef9\xe7~\xce\ +\xf7p\xef\x81\xff\xdd$\xc9Y\xa9T:\xac\xb5\x05\x11\ +\xd9\xad\xaa\x0a\xbc\xf3<\xefI&\x93\xf9\xf4W\x80r\ +\xb9\xdcY\xab\xd5.\x03\x03\x80\xdf\xe0\xae\x89\xc8\xb8\x88\ +\x0ce\xb3\xd9\x0f\xbf\x0d(\x16\x8b\x07\x8d1\xd3@\x17\ +p\x03\xb8\xe7\xfb\xfe\xcbZ\xadv\x1e\xf8*\x22\xdd\xaa\ +z\x06Xt\xce\xf5\x86a\xf8*5 \xae\xfc\x05\xb0\ +\xc9\x183\x9c\xcdf\xc7W|Q\x14i\xbc\x9cw\xce\ +\x9d0\xc6L\x02\xdf\x8d1\xf9$%\xa6~\x13\xb7\xa5\ +\xcb\x183\xec\x9c\x1bk\x92\xd3\x1d\x86\xe1\xacs\xee\x18\ +\xb0\xd397\x92JA\xa5R\xe9\xa8V\xab\xef\x81\xd1\ + \x08.6TM\x10\x04\xab\xb1\xf1\xf9\x82\x88<\x8a\ +\xdb\xd5\x19\x04\xc1\xe7D\x05\xd6\xda\x02\xe0\xab\xea\xdd\xa4\ +\x8a\xeal\xbf\xaa\xce\x03-\x22Rh\x16\xb4\x0a\x10\x91\ +\xbd\x00\xed\xed\xed\xafS\x02\x00\xb6\x00\xa8\xea\xbef\x01\ +^\xddZ\x01\x96\x96\x96.DQt\x05\xd6l\x0b\xf5\ +\xe7333\xdb<\xcf\xbbJ\xc2\x7fZU\xa0\xaao\ +c%_\xd2\x96\xef\xfb\xfe\x818ga]\x80\xe7y\ +OY\xfeD\xdd\xc0\x9b\x94\x8cS\xc07k\xed\xb3f\ +\x01?I+\x95Jc\xaa:\xe0\x9c;\x12\x86\xe1l\ +\xc2+\xb2\xaa:(\x22\xa3\x22r;\x97\xcb\x9d[W\ +\x01\x80\x88\x0c\x01\x8b\xc6\x98\xc9b\xb1x\x18\x98[3\ +\xc9\x98A\x11\x19ay\x8cL$Il6*\xa6\x80\ +]\x22rSU\xe7\x80\xadmmm\xd7\xad\xb5\x87T\ +\xf5\xa4\xaa\x9e\x8d/\x17\xc0\x02\xfdA\x10L\xa5\x02\x00\ +DQ\xb4\x03\xb8\x04\x9c\x06Z\x1a\xdcVD\xee\x00\x13\ +\xaa:\x0d\xb4&A\x12\xc7u\x14E\xdbE\xa4\xe0\x9c\ +\xdb#\x22FD\x16\xac\xb5\xcf{zz>\xc6\xfe^\ +\xe0~\x12$\x11\x90\xc6J\xa5\xd2QU}\x00l\x06\ +\xaa\xaaz<\x9f\xcf?\xdc0\x00\xfc\xaaDD\xfar\ +\xb9\xdcchxE\x7fjq[\xfaYnS\xab\xaa\ +^[\xf1m\x08`\x05\x22\x22}@YDnm\xd4\ +\xbd\xff\xde~\x00\xfa\xec\xfcwzx\x00\x16\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x03i\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xe6ID\ +ATH\x89\xb5\x94Ah\x14W\x18\xc7\x7f\xdf\xcb\xec\ +zp\x03\xda\x22x\xeaE\xe8\xa1\x146\xdd\xbc\xa4!\ +\x95\xe8\x82U$\x0a\x0aMZ\x0b\xf5P\xb07\x0f\x8d\ +\xa8\xd0c\xa9\x88Bm\xc5C\x0b=\x05J\xc5\x10{\ +\xd0\x9b\x97m%\xa2q\xdeL\xa90UXl\xb1\xd6\ +[/k\xb0\x03\x9b\xcd|=8\x93\x8e\xe3\xbaI\x13\ +\xfc.\x8f\xf9\xbe\xf7~\xff\x8f\xff|\xef\xc1K\x0eY\ +\xebAU5A\x10|\x00\xbc'\x22\xfd\xaa\xfa\xab1\ +\xe6B\xadV{\xb0n\x81f\xb3\xb9\xa1\xd5j]\x04\ +\x0e\x16J\x8f\x81qk\xed\x5c\x960k\x84\xcf\xa6\xf0\ +[I\x92\xbc\xd5n\xb7_U\xd5)\xa0\x02\xfc\xd0l\ +67d\xfb\xbd5\xc2\xf7\x01?\x95J\xa5}\xd5j\ +\xf5IZ\xfe*\x08\x827U\xf5\xe3V\xab\xb5\x03\xb8\ +\xf6\xbf\x04\xa2(*gp\x11\xf9\xd9\xf3\xbc<\x1c\x00\ +U\xbd\x93\xae[\xb3\xdc\xaa-ZZZ\xdah\x8c\xf9\ +ZU\x8fz\x9e7\xde\x05.\xaa\xba?\xfd\xbc\xb7Z\ +\xee\xaa\xc3\xf7\xfd\xb3\xce9u\xce\xcd\xa9\xea\xf2\xf0\xf4\ +\xb4\xa8\xd1hx\x95J\xe5\xa4\x88|\x02\xbc\x06<\x04\ +\xbe[XX8]\xaf\xd7;y\xb8\x88\x1c\x07~\xf7\ +<\xef}\x11\xd1\xac\xf6B\x8b\xa2(*W*\x95\x1f\ +E\xe4\x0b\xe0\x15\xe06\xb0\x09\xf8\xbc\xbf\xbf\x7f\xba\x1b\ +jf\ +\xfd\xd7\xf6\x17\x15z\xe4F\xa3\xf1\xads\xee\x09\xe0\x07\ +\x003\xdb\x08!\x9c\xaa\xd5jkE\xfa\xffS\xfd\x0e\ +]\x97\x1d|C\x90b\xe1\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x03\xae\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03+ID\ +ATH\x89\xddU\xcfo\x1bE\x14\xfe\xbe\xdd\xda\xb5\ +\xa5\xd8\x02\xc1\x91\x0a\x1a\x9a\x0b\x96\xa2\xb0;N\x90/\ +\xc8\xe2\x82@\x22I\x8b\xc4\x91\x1bW\x14\x15\x8a\xe0\xd0\ +\x0aRTH}\xaa*\x81\x00\xf1\x07D\x10\xb9\x12\x07\ +\xb8\x90\x0bX!;6\x22\x95\x8b\xc0\x01\xd4\x8a_\xaa\ +\x04\xc8\x04\xc9\x1b;\x99\xc7!;\xd6d\xd38p\x84\ +\xef\xf4\xe6\xbd7\xef\xfb\xde\x9b\x9dY\xe0\xbf\x0e\x8e\x0a\ +\xb6\xdb\xedl\x1c\xc7\xf3\x222\x0b \x00p_\x12\xfa\ +\x11@\x8bd=\x97\xcb\xd5K\xa5R\xff_\x13DQ\ +t\x86\xe4\x12\x80\xf1#D~G\xf2\x5c\x18\x86+\xff\ +\x88`yy\xd9\x1f\x1f\x1f\x7f\x13\xc0\xd9T\xe8{\x92\ +\x8b\xc6\x98]\xcf\xf3fE\xe4tj\x7f-\x0c\xc3\x97\ +H\x9a\x91\x04Z\xebZ\xaa\xf8m\x92\x97\x8a\xc5\xe2[\ +\x13\x13\x13\xdb\xd6\xd9j\xb5\x1e3\xc6\xbc\x0b\xe0\xa4\xf5\ +\x89\xc8\xe5r\xb9|\xeeP\x82d,\x1f$\xcb.\xc9\ +\xa5\x5c.w\xa5T*\xfdu\xa7\xf6\xd7\xd6\xd6\x8a\xbe\ +\xef\xbfC\xf2\x19\xc7=\xaf\x94\xaa\x1f h\xb7\xdb\xd9\ +^\xaf\xf75\xf6f\xfe\xad1\xe6\xd1\xe9\xe9\xe9_\xdd\ +\x82\x8dF#\xbf\xbd\xbd-\xd5j5Nu=\x07\xe0\ +\x02\x80)\x00\x9b\xf9|\xbed\x0f\xde\xb3Iq\x1c\xcf\ +'\xc5!\x22\x0bnq\xaduFk\xfd|6\x9b\xbd\ +U(\x14ni\xad\xcfv:\x9d\xe36\xae\x94\xaa\x8b\ +\xc8B\xb2<\xd5\xeb\xf5fmlH\x90|\x8a{m\ +\x91\x9f\xbb\x0a\xfb\xfd~\x01@\x01\xc0M\x00\xf7\x02\xa8\ +u\xbb\xdd\xaf\x9a\xcd\xe6#N\xda\xc0\xb1\x87\xb5\x8e9\ +\xce\xd0\x1a\xc6\x98\x22\x80\xae]W*\x95\xdf\x01\x5c\x04\ +pq}}\xfd\x04\xc9\xd9\xe4KZ\xd5Z_\x8d\xe3\ +\xf85\xec\x87\x1a\x8au\xc6\xf0g\xa2\x12$\xdf\xf7}\ +\xff\xfc\xd4\xd4\xd4O\x18\x81\x8d\x8d\x8d\xbb\x07\x83\xc1\x13\ +\x22RM:\xb3\xca\xb7\x94R\xc5Q\x04\x8f\x1bc\x14\ +I\x05\xe0\xb3\xdd\xdd\xdd\x95\x99\x99\x99\x1fF\x91i\xad\ +\x9f\x04\xf0Q\x9a\xc0\x1d\xd1/\x96\xc0\xf3\xbco\xc20\ +\xfc\xa4\xd5j\xddo\x8c\xf9\xd8\xf7\xfd\x9a\xd6\xfaK\x00\ ++\x9e\xe7\xad\x04Ap#M\x90\xc9d\xa2\xc1`x\ +\x0c?[\xc3sr\x9a\xe9MA\x10\xdc\xdc\xda\xdaz\ +\x18\xc0+\x00\x1e\x00\xb0h\x8cik\xad?m4\x1a\ +y77\x8e\xe3\xbb\xdc\x86\x0e\x10\x90\x1c^\x8e\x9d\x9d\ +\x9dIkW\xab\xd5X)u\x09\xc0I\x92\x0b\x00\xce\ +\xf7\xfb\xfd\xa7+\x95J\xcf%\xf0}\xff9k\x8b\xc8\ +\xa1\x17\xed\x06\x80\x07\x01\x0cH^\xcdd2\x8b\x93\x93\ +\x93\x7f\xa4;s\xd1\xe9t\x8ew\xbb\xdd\x05\x00\xaf'\ +\x827\x01<\xa4\x94\x1a\xec#\x00\x80f\xb3yZD\ +>t\x5c\xbf\x01x\x15\xc0\xdbv\x83\xc5\xea\xea\xea\xb1\ +\xb1\xb1\xb1gI^\x00p\xc2Q?W.\x97\xaf\x1d\ +\x18\x11\x00$On\xcdq\xdd\x03\xe0\x0a\x80\xebQ\x14\ +=e\x9dQ\x14\x9d)\x14\x0a\xd7I\xbe\xe7\x16'\xb9\ +\xe4\x16?\xd0A\xa2\xc0\xd3Z\xbfA\xf2\xc5;L\xe4\ +\x0b\x92\x9e\x88\x94\xd3\x01\x92KA\x10\xbc|\xe4sm\ +\x91<`\x97\x01\x9c:,'\xc1\xa6\x88\xbc\x90V~\ +$AB\x92\x010\x87\xbd\x1b\x1ab\xff/\xb3)\x22\ +u\x92\xd7\xd2\xe7\xf3\xff\xc2\xdf)\x03J\xd6\xeeCp\ +\xd4\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\x0b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x88ID\ +ATH\x89\xed\x93KHUQ\x14\x86\xbfu\x8f\x1e\ +JT\xe8\x82\x81\x0dJ'\xd1\x0b\xc4\xbb\xb7\x0f\x9c\x84\ + E\x14A/\x8a&\x16\x15EF\x14\x0e\xacf\x81\ +\x83\x8a\xa0\x81\x18a\x93rf\x83\x0a\x9c\x14\x14wV\ +\xdc\xdc\xe7\x12\x9a\xf4\x18\xf4\x9aI\x18\x84\xe4\xe3 g\ +5\xe8\x1e9]5\x91\x1aE\xffh\xb1\xff\x7f\xaf\x9f\ +\x7f\xed\xb5\xe1?\xfeyH\x5c8\xe7t\x1e)r\xd2\ +\x18\xd3\x17\x04A\x8f\xaa\x9e)\xa2\xfb\xad\xb5\xedK\x19\ +\xa4\xe2\xc2\xf7\xfd\xb4\xef\xfbiU}\x04\x84\x22b+\ +++\xef\x02\xa8j\x17\xb0\xebg\xa9\xa7|\xdfO\x97\ +\x96\x96\x9e^V\x82D\x92\xb5\xc0+\xe0\xb9\xb5v;\ +\xc0\xe8\xe8\xa8?55\x95\x07\xc6\x8c1m\x222/\ +\xed\x92\x09bXk?\x03\x17\x80m\xce\xb9\xc3\x00\x93\ +\x93\x93\x97\x80\x1aU=\xb1\x9c\xe6\x0b&\x00P\xd5\x94\ +s.+\x22\x9b\x80=\xc0\x13\x11\xe94\xc6\xf4.\xa7\ +\xf9\xa2\x06\x00\xb9\x5cn\xbd\xe7y/\x01\x0fxa\x8c\ +\xd9*\x22\x11\x80sn\x03\xf0:\xd6Zk\xa5p>\ +\x06\xac\x06\x10\x91\xdd\xc6\x98\xc1y#\x8a\xd1\xd4\xd4\xf4\ +\x0e\xe8\x03|U\xbd\x1e7/4|311\xb1\x12\ +\x18\x13\x91\xa3\x89k;\x00\xf5<\xaf\xd6\x183\x08\x0b\ +\xbcA\x8c|>_\x05\x1c\x02TD\xba\xb3\xd9\xec\x8a\ +$\xdf\xda\xda:\xad\xaa\xb7T\xf5\xec\xdc8D\x0e\x02\ +\xcf\xea\xeb\xeb?\xc6g\x8b\x1aDQ\xd4\x0bL\x03{\ +\x81\xcd\x15\x15\x15\xdd\xc5\x1a\xcf\xf3z\x81\x0dA\x104\ +\x03\xa8\xea~` \xa9Y\xd0\xa0\xb0=\xfbE\xe4\xa4\ +\xb5\xf6\xa1\x88\xf4\x01\xe7\x9ds\xadI]&\x93\xf9\x02\ +\xdc\x89\xa2\xa8#\x08\x82\x8d\xc0\xba\xd9\xd9\xd9{\xbf5\ +p\xceU\x03=\xaaz\xd3\x18\xf3\x18\xa0\xa4\xa4\xa4\x13\ +\xf8\x00\xf4\x0f\x0f\x0f\xafJ\xea\x0b\xef\xb3OU\xdbE\ +$\xdb\xdc\xdc<\xb6T\x82\xdb\xc0\xb7\x99\x99\x99\x8b\xf1\ +A]]\xddw\xe0\x08\xb0&\x0c\xc3\x1bIqCC\ +\xc3{U\xbd\x06\x9cS\xd5_\xc6\x03\x855\xcd\xe5r\ +\xb5\x9e\xe7\xbd/&S\xa9T[&\x93y\xea\x9c\xbb\ +\x02t\x15\xd1\x9f\xac\xb55\x00CCC[D$\x08\ +\xc3\xb0\xba\xa5\xa5\xe5kRT\x02\xd0\xd8\xd8\xf8id\ +d$]l0>>>\x01\x10\x86\xe1\xe5\xf2\xf2\xf2\ +\xabI.\x0c\xc3\xb9\xb5\x15\x91\xe3\xaa\xfa\xb8\xb8\xf9\x5c\ +\x82?A>\x9f\xaf\x8a\xa2\xe8\xad\x88\x1c3\xc6<\xf8\ +k\x06A\x10t\x14f>\xa0\xaa\xa1\xb5vg\xf23\ +\xc6X\xf4\x1f,\x05UM\x03\xf7\x81\x97eee\x07\ +\x16j\xfeo\xe0\x07\xcd#\xfd\x1f\xff\x86PK\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04\x14\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x91ID\ +ATH\x89\xed\x95Oh\x5cU\x14\xc6\x7f\xe7e2\ +\x99\xc4\x0c1T\xd2V\xc1\x92\xc1.\xe4-\x823\xf7\ +1q\x16\x85\x80VD\xa1\xa2\x10\xc1\x08B\xd1fS\ +(\xa8\x15\x8a\x14k\x5cH\x83.\xb2PZ\xa5\xa1U\ +\xac8\xa5nD\x17R\x0ch\x9a\xc5\xbc\xfb\x22m\x1c\ +\xab`\xe8\xa2\xf1\x0f\xb6\x0d*3\x99d&\xef\x1d\x17\ +\xce\x841\xc9\xd8\xe0R<\xbb\xef;\xe7|\xdf=\xf7\ +r\xef\x85\xfft\xa8\xaa\x13\x04\xc1p\x10\x04\x83\xffV\ +CZ%\x82 \x18T\xd5\xf7\x80\xdd@\xadZ\xad\xee\ +\xc8\xe5r\x8b\xcd5\xc5b\xb1{ii\xe99\x11\xb9\ +GDf\xd2\xe9\xf4\x87\x22\x12m\xc9\xc0\xf7\xfd\x19\xc7\ +qVUu\x10XR\xd5\x8fJ\xa5\xd2\xa1\xbe\xbe\xbe\ +\xa8\x5c.o_]]-\xc7\xe3\xf1/\x01wML\ +\xe4\xfc\xfc\xfc\xfc\x93\xc3\xc3\xc3a\x83sZ\x8e&r\ +\xaf\xaa\x1e\x0f\xc3pg\xb5Z\xdd\xe98\xce;\xdd\xdd\ +\xdd\x93\x95J\xe5\xddr\xb9|=\x1e\x8f\x1fk\x16\x07\ +P\xd5'R\xa9\xd4\xa1f\xae\xa5\x01\xb0\xac\xaa+\xd9\ +l\xf6f.\x97\xab\xa4\xd3\xe9\xaf\x1d\xc7\xb9\x0d\x98\xef\ +\xed\xed\xdd\x06\x1c\xa8\xd7\x9d\x0d\xc30\xa5\xaa\xaf\xd6\xf1\ +\x91\x99\x99\x99\xce\xad\x18\xfc\x00\xecj\x80 \x08\x0e\x03\ +\x13\xc6\x98\xb1Z\xad\xf6\x10\xd0\x01\x94:;;G\xb3\ +\xd9\xecU\xcf\xf3\x8e\x01\x1f\x00wttt<\xdc\xe8\ +\x8b\xb5R\x17\x91K\xc0S\xd6\xda\xdbU\xd5\x15\x91\xeb\ +\x99L\xe6\x8bznO\xbd\xec[\xd7uKM=\xe3\ +\xaa:\xa2\xaa\x0f\x00\x1f\xc3\xbaC\x9e\x9e\x9eN&\x12\ +\x89QU\xdd\x0d\xc4D\xe4q\xc7q\xdc(\x8a\xc62\ +\x99\xcc\x81 \x08\x5c\xe0\xf2&\xeb\x193\xc6\xbc\x02`\ +\xad\xbd\x06\x5c5\xc6\xec\xf9\xdb\x16\x15\x0a\x05/\x91H\ +|\x05\x5c\xf1377\xb7\ +]D\xee\x02^\x13\x91\xb1|>\xdf\x06044\xb4\ +,\x22c\xf5\xb67\xd6\xdf\x5c`\x1bpc\x83A:\ +\x9d\xb6\xcb\xcb\xcb.p\x1axaee\xe5\x17U}\ +LU]`W*\x95:\x1f\x04\xc1\x88\xef\xfb\xfb\xd2\ +\xe9\xf4)\xe0\x04p\x8e\x8dq'\xf0}\x03\xb4|*\ +fgg\xdf\x0e\xc3\xf0\x92\xe38;T\xf5>\xe0\x11\ +\x11\xf1UU\x80ic\xcc\xe1\xf5=\xf9|\xbe-\x95\ +J\xddP\xd5\x17=\xcf;\x05-\xee\x81\xb5vo\x18\ +\x86{\xa2(:\xeay\xdeM\x00\xdf\xf7_\x06\xf6\x8b\ +\x88\xd6j\xb5\x89\xcd\xfa\xfa\xfb\xfb\xf7\x02\x9d\xf1x\xfc\ +\x93\x0d[\xb4.\xce\x88\x88\x1b\x8b\xc5\x0e6\x88X,\ +\xf6\x96\x88$\xa3(\xea\x8d\xc5b\x8b\xd6\xda\xd7\xad\xb5\ +?NMM%\xe0\xaf\x97UD\xc6\x81\x93\x03\x03\x03\ +\xbf\xde\xca\xe04\xb0\x1c\x86\xe1g\xf5\xd5\xa7\xc20\xbc\ +\x00X\xa0\xa0\xaa\x07\xa3(\x9a\x00V\x93\xc9\xe4\x05k\ +\xed\xd1J\xa5r\x11\xf8\x0d8\xd2,\xf4O\xff\xc1E\ +`\x0e@U\x9f\x06\xce\xf4\xf4\xf4<\xbf\xb0\xb0 \xc9\ +d\xf2\xb8\xe38\x93mmm?\xd7j\xb5\xfd\xc0\xdd\ +\xaa\x1atuu\xbd\xef\xbanuK\x06\xd6\xda,0\ +\x01\xfc\x04\x9c0\xc6|\xde\x9c/\x14\x0a9\x11\xf9\xa3\ +T*}744\xb4\xdaJ\xe7\xff\xb8e\xfc\x09Q\ +c\x7f\xb0\xe1\xe4m\x96\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x01\x5c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xd9ID\ +ATH\x89\xed\x95M\x0e\x820\x14\x84\xa7D\xe3I\ +\x5c\xb80\xd1BY\xeb\x95\xb8\x87\x07\xf04.\x5c\x01\ +%\xd5\x95\x87Q:n\x90 ?&X`a\xfcV\ +\xcdk3\x93N\xfbZ`\x0a\xb4\xd6\x1cK{\xd6a\ +(\x01\xecH\x9e\x94R\xc6\xc5\xc0\xeb\x10\x8f\x01\x1c\x84\ +\x10q\x92$\x1b\x17\x03Q\x88\x0e\x1eQ\x10\x04\x02\xa8\ +D\xf4*\xa4i\xba\x15B\xc4\x00\xe6\x00\xee\x9e\xe7)\ +)\xe5\xf5[\xa3FDJ)c\xad\x0dIF\xae\xe2\ +%c\xde\xa2\xb7\x1dT\x8d\x86\x1a\xb7\x17\x06\xa4\xb5\x0f\ +\xfa`\x8cYZk\xf7\x00\xce\xbe\xef\xdf\xea\xf3\x8dC\ +\xee+\x9e\xe7\xf9\x85\xe4\x91\xa4\xd1Z\xaf\xebk\xa6\xef\ +\x83>dY\xb6\x22i\x00,\x00\x9f\xdfb\xfb\ +3`\x07P\xb0},\x84\xb0\xcf\xf6\xb4x\xd3\x0c\xdd\ +\xdd\xdd{\x80\xed\x92\x8e\xdb\xde\x1fE\xd1a\xa0&i\ +\x03\xb0\x00\xe0\xd6\xad[\x7fHz\x17\xf88\x9f\xcf\xaf\ +\x94t\x0c\xd8100\xb0\xfb\x81\x00i\x9a\xaeo\x0a\ +.I\xcfH2\xf0\xac\xed\xf3\x92\xfa\xd34]=g\ +\xce\x9c\xc5\xc0\x10\xd0V\xaf\xd7\xd7DQ\xf4\x8a\xed\xe3\ +\xb6w\x86\x10\xd66\xc7\x9c\xd4`xx\xb8\xb5R\xa9\ +\xfc\x02\xe4\x81\xcf\x81'm\x17%\xbd$\xe9T\xa9T\ +\xda\x00\x10B0\x80\xed\x8d\x92N\xda^.i~\xa1\ +P\xf8\xbeV\xab\x9d\x02\xc6\xda\xdb\xdb{&\x84o\x99\ +\x00\xa8V\xab\xeb\x80nI[\xa2(:,\xc9!\x84\ +k\xc0\x5c\xe0\xf2\xfd\xa5KZ\x18\xc7\xf1\x8d\x81\x81\x81\ +3Y\x96]\xab\xd5j\xe3\xc0\x87\xc0\xbeJ\xa5\xd2\x0b\ +|;\xa5\x82r\xb9\xfc\x8d\xed\xdeB\xa10\xafV\xab\ +\x8dKZb{\x97\xa4\x11\xdb\xd7l?\x01\x14\x80\x93\ +\xb9\x5c\xae\x08\xcc\xb1=\xde\xe8\xac\xf7%=\x07\xec\x07\ +\xb6\x01\xc7\xe28~mJ\x05\xb6#\xe0\xec\xf8\xf8\xf8\ +AI\x1b\x81\xa18\x8e\x975\xc0\x0f\x02o\x00\xc4q\ +\xbc\xb5A\xd5[\xc0\x97\xb6\xb1\xbd\xac\xb3\xb3s\xe8\xf6\ +\xed\xdb\x8ffY\xb6\xdcv<\x93\xc8\x8fI\x1a\x91\xb4\ +\x12h\x03F\x9b|\x1d3PT\x9d8\xb7\xb4\xb4\xcc\ +^\xb4h\xd1\xd8\xd2\xa5K/eY6\x02\xcc\x9f\xf4\ +5\x7f\x94e\x99\x92$Y\x08\x90\xa6\xe9\xea&A_\ +\x8f\xe3xs#\xf3\x09\xdbWq\x1c\xabq\xb7?\x84\ +\xd0\x0f\xfc\x0a\xfc\x04d3\x01\xfc.\xa9kpp\xf0\ +\xf1Y\xb3f]\xbdy\xf3\xe6\xa84)Q\xfb\x0c\x15\ +T&i\xc8\xe5f\xdb\x1e\xb3}\x1aX(\xe9\xea\xe4\ +\xbd\x89C\x08\xe1k`-p\x00\xd8n\xfb\x5c.\x97\ +\xdbm{\x81\xa4V`4\xcb\xb2*\xb0\x0a\xa85(\ +,\xe4r\xb9\x05\x92>\xc9\xb2\xec\x5c{{{[\xa5\ +R\xb9n\xfbh\x92$\x9b\xa0I\x03I}\x8dL\xff\ +\x04,)\x96t:\x8e\xe3\x03\xb6\xeb\xb6\x0fI:\x9c\ +$\xc9\xd6$I\xde\x94\xd4*\xe9\x1d\xdb+\xa2(\x0a\ +\xa5R\xe9\xee\x9d;w^\x05\x8a\xc0\x89i\x14\x15\x8b\ +\xc5\xbeJ\xa5r\x11x;\x9f\xcf?]\xaf\xd7\xd7\xd4\ +\xeb\xf5\x17B\x08?\xdb\xbe\xdcD\xd7DB]\xb6o\ +H:\x13B\xf8bpp\xf0\x82\xa4m\xc0\x05I\x93\ +\x00\x93\x15\xf4\xf4\xf4\x8cK\xda\x09,\xbc{\xf7\xee\xa7\ +\xa5R\xe9\x90\xa4\xf9\xc0uI\xbbr\xb9\x5cb\xfb\xc5\ +r\xb9\xfcc\x9a\xa6)\xb0;\x8e\xe3y\xb6\x7f\x93\xf4\ +p\xbd^_\x01t\xd9\xde\x11\xc7qm\x1a\x00@c\ +\xe4\xee\x97\xf4r\xb9\x5c\xfe\x0e\xf8\x01\x18\x03\x96\x8c\x8e\ +\x8e\x9eO\x92\xa4\xdf\xf6jI\x8bm\x0f5\xe6\xd5p\ +c\xef\x05\xf6$Ir\xa29\xe6\x946m\x80\xbc\x17\ +BpcZ.\xc9\xb2\xec\xa3|>\xffPgg\xe7\ +#\xc0%`\xc4\xf6\xa9\x8e\x8e\x8e\xb6\x10\xc2fI\xbb\ +\x80.I{\xa3(\xfa\xe0\xfex\x7f\xfb\xe04\xa6\xe2\ +>\xe0)\xa0*\xe9l\xe3'\x82{\xad\xb8\x8c{\x82\ +^\xb0\xbd\xe3\xfe\xcc\xff\x11\xa0\x01R\xe0^\xeb\xf6\x02\ +%\xa6>\x99e\xdb}\x92N4s\xfe\xff[\x7f\x01\ +\x93t\xe1\xe9l\x9d\xeb\xc4\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x03\x8e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x0bID\ +ATH\x89\xd5\x94Mh\x5cU\x14\xc7\x7f\xe7\xcc\xcb\ +G\x19\x9a\x8d\xa6Q\x04!\xa8H\x8bNH\xde\x9b$\ +\xda\x80\x0c\xe2\xc6OP\xb2Q\x8a\x82\x1b\xb1*\xa8\x81\ +j7R\xb2\x12D\xd0\xd2\x8d\x1bua\xa9U\xc4M\ +\x0d\xb8\x89t\x91\xc6\xcc{IGL\x0d\x14\xb5\xa5\xad\ +\xe0g\xd2\x84\x98\xc0\xdc9\xc7\xcd\xa4\xc44/M\xd1\ +M\xcf\xea\xbes\xff\xf7\xff;\x9cs\xef\x83\x1b=\xe4\ +\xff2\x9a\x9a\x9a*\xab\xeaQ`'\xf0B\x92$_\ +\x02D\xff\xd5xvv\xb6uyyy\x8f\xaa\x1e\x06\ +\xeel\xa6\x0f\x03\xd7\x07\xa8\xd5j\xc5\x10\xc2\xd3fv\ +IDJ@\x09\xb8wee\xa5KUo\x02\x16\xd7\ +\xc9\xffZ[l\x1b\x10B\x18q\xf7WE\xe43\x11\ +9mf\x13\x22\xf2\x87\xbb\xff*\x22\x17\x81\x03\xc0\x82\ +\xbb\xcf\xb9\xfb\xc8\xda\xb9m\xcd`rr\xb2+\x8a\xa2\ +\xb3M\x831\xe0\xb2\xaa\xd6:::>_ZZ\xea\ +3\xb3\x0fE\xe4Qw?\x01\xf4&I\xf2\xf7\xdaY\ +\xdd\x0e \x8a\xa2\xb7\x80\x09`XD\xf6\x15\x0a\x85#\ +q\x1c\x7f2??\xbf\xdb\xcc>R\xd5'\xdd}\x01\ +(\xac7\xdf\x12\xe0\xee\x9a\xa6\xe9#\xd5j\xf5m\xe0\ +y\xe0`\x92$\xdf\x8a\xc8W\xee>\x9aeYIU\ +\x8f\x8b\xc8p__\xdf\x19\x11\xb9\x0f\x98\xbb\xaa\xb8\x8d\ +\x89Z\xad\xb6\xab^\xaf\xefK\xd3\xb4[U\xcf\x03e\ +\x11\xf94\x8e\xe3i\x80\x10\xc2\xc1B\xa1\xf0\x9d\x88\x14\ +E\xe4P{{\xfb\x5c\xb3\xa0\xbd\xee~f\xa3\xdf\x95\ +\x19\xa4iZ\x11\x91'\xdc}\x00\xb8\x03\xe8\x04.\x00\ +\xa7ZZZ^\xee\xe9\xe9\xf9m\x9d\xf6Y\x11\xd9\xef\ +\xee\xf74\x8b\xfcAD~i4\x1a\xb3\xaa:\x9a$\ +\xc9\xe5\xab\x00333w5\x1a\x8d\x93\xc0\x82\xaa\xbe\ +T\xaf\xd7O\x0f\x0c\x0c\xfc\x99\xd7B\x80\xf1\xf1\xf1\xa8\ +X,\xde\xad\xaaO\x01\x87\x80w\x93$y}\xbd\xe6\ +\xca\x0cz{{\xcf\xba\xfbC@g\xa3\xd1\x18\xbc\x96\ +9@\xa5R\x09\xad\xad\xad\x0b\xc0s\xc0\xc7q\x1c\x8f\ +l\xd4\xfck\xc8\xe5r\xf9{w\x7fXD\x0e\xa4i\ +\xfa\xda\xb5\x00i\x9a\xde\x1cB\xf8\x1a\xb8\x18BxE\ +D|K@\x132\xe5\xee\x8f\x03\xa3Y\x96=\x96g\ +\xee\xee\x0a\x9c\x00~\x12\x91\x93\x83\x83\x83\x8b\x9b\xe96\ +\xbd\xa6\xe5r\xf9\x1b\xe0(P\xc9\x03dY\xb6\x13\xe8\ +7\xb3\x17\xcd,\xe4\xe9r\xdf\x81\x88\xdcff\x17\xf2\ +\xf6\x9b7e1\x8a\xa2~\xe0\xc7<]\xee\xbf\xc8\xdd\ +\xbbU\xf5\xdc\xdaw\xb5Z\xed\x17\x91\xdd\xab\xab\xab_\ +\x0c\x0d\x0d-5\xd3?\x9b\xd9\x83\xc0;\xb9\x85\xe6\x98\ +K\x96e\xcbfv\xbf\xaa\xee\x02\xde\x04\x06\x80\xf3@\ +\x17pDU\xdf7\xb3\x0f\x80\x90$\xc9p\x1e`\xd3\ +\x16eYv\x0b\xb0CU\x8f\x01\xc7\x81S!\x84\xee\ +8\x8e\xf7\xb8\xfb3\xc0\x03fv\x0e\x88\xcdl9\xcf\ +\x1crZdf\xdd\xaa\xfa\xbb\xbb\x1fkkk{\xaf\ +T*\xcd\xaf\xdb\x1e\x03\xc6\xaa\xd5\xea^\x11yCU\ +o\xdd\x0a\xb0iLOOwNLL\xec\xd8\x8e6\ +M\xd3\xdb\xaf\x1bpC\xc5?\xdd\x95Fn\xd81\xd7\ +\xee\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xa7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +aIDATH\x0dc`\x18\x96\xe0\xc3\x87\x0f\xe1\ +\xef\xdf\xbf\xb7\xa3\x86\xe7\x98p\x18\xa2\x0f\x14\xdf\xff\xee\ +\xdd\xbb\x8e\xff\xff\xff\xb3\xe1PC\x940.\x0b\x18\x80\ +\x06\x83\xe4\xca\x81\xbe9\xf9\xf9\xf3g-\xa2L\xc3\xa2\ +\x08\xa7\x050\xb5@\x8b\x0c~\xff\xfe}\x16\x18dy\ +@6#L\x9cX\x9a\xa0\x05P\x838\x80\x86O\x04\ +\xfaf\xe7\xd7\xaf_\xa5\x885\x1c\xa4\x8eX\x0b\xc0f\ +\x02-q\xfd\xf5\xeb\xd7e\xa0E\xa1\xc4ZB\x92\x05\ + C\x81\x96\x08\xfd\xfb\xf7o\x150\xc8\x16\x02\xd9|\ +\x84,\x22\xd9\x02\x98\x81@\xc3\xe3\x80>\xb9D(9\ +\x93m\x01\xd47\xf2@\x1aor\xa6\xc8\x02\xa8% \ +3`\xc9Y\x13$\x86\x0c(\xb6\x00\xc90]`r\ +vD\xe2\x83\x99,\xe8\x02\xe4\xf0\x19\x19\x19\xef23\ +3\xc7\xf2\xf1\xf1\x1dG\xd7O\xb1\x05@\xc3\xe7\x0a\x08\ +\x08\x14\x00\xe9/\xe8\x86\x83\xf8d[\x004\xf0\x0dP\ +\x7f\xaa\xa0\xa0\xe0\x06l\x06\xc3\xc4\xc8\xb5`\x1b++\ +k\x12\x0f\x0f\xcfK\x98A\xb8hR-\xf8\x064\xa8\ +DHHh:.\x03\xd1\xc5\x89\xb6\x00\x18$g\x80\ +\x11\x19\x03\x8c\xc8\x9b\xe8\x86\xe0\xe3\x13\xb4\x00h\xf0_\ +\xa0\x01\xed\xc0\x88l\x04\xb2\xff\xe03\x0c\x9b\x1c^\x0b\ +\x80\x06\xe2L~\xd8\x0c\xc3&\x86\xcb\x82\x7f@\xc3\xf1\ +&?l\x86\x11-\x06,\xc8(\xaa&\x89\xb6\x88\x1a\ +\x0a\x01X\xa1\x80\xe5\xed\xfe\x1aO\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x027\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xb4ID\ +ATH\x89\xdd\x94\xbf\x8b\x13A\x18\x86\x9fo\xdc,\ +n\x91\x14\x87\xd8Y\x18\xdc*\x10!\xf9\x96 \xe7?\ +a#B\x14l\xbcB\x88\x1cv\xb6be\xe7\x81\x08\ +\x8a\x22\x07\xe2\x99\xf3\xc4\xfa\xd4N\xd2\xeclZ{\x1b\ ++\xb1\x09\x92\x14\xd9\xb1\xc9\xc2\x12/\xc9n\x8c\xcd\xbd\ +\xe5\xcc;\xcf\xfb\xcd7?\xe0\xd4)I\x92;e\xfc\ +\xd6\xda\xabq\x1c?^4o\xfe\xa5\x988\x8e\xb7\x81\ +\xf7\xc0\xf1\xc6\x03\xe28\xde\x16\x91#\xe7\xdc\xcd(\x8a\ +>o4\xa0(|\xad\x802\xf0\xd2\x01e\xe1\xa5\x02\ +\xd6\x81\x03xE\xe1\xc6\x98\x0f\xce\xb9\xf3\x22\xf2\xc9Z\ +\x9bMMT\xf5\xec\xccsCD\xde\xe6\xd7\xa9\xaa\xac\ +\xdcAVy\x9a\xa6]U\x95\xe9tz\x0e\xf8\x01\xec\ +gp\x80(\x8a\x0e\x82 \xa8\x02\xdf\x81\xd7\xbe\xefo\ +\xc1\x8a\x16\x9d\xd4\x96N\xa7\xf3\x13\xb8\x0d\xdcJ\x92\xe4\ +Z\xde?\x1e\x8f\x1f\x02\x15\xdf\xf7\xef7\x9b\xcd_K\ +\x03\x96\xf5\x5cU\x8f\x81W\xce\xb9\xa7\x83\xc1`\x0b`\ +8\x1c^v\xce\xf5\x80\xbb\x19|a@\x91\x03\x0d\x82\ +`\x17\xf8]\xa9T\x9e\xf4\xfb\xfd3i\x9a\xbe\x04\xde\ +\xa9\xea\xc7\xbc\xef\xaf\x804M/\x15\xb9-\x8dFc\ +$\x22;\x22\xd2\xad\xd7\xebG\xc0\x05`w\xde'\xf9\ +\xcfm\x06\xbf'\x22\xcf\x80o\x8b\xe0\x99\xda\xed\xf6\x0b\ +k\xed\x1e\xd0\x03\xae\xab\xea\xe1\xbc\xc7\xab\xd5j\xfb\x00\ +\xa3\xd1\xe8\x0a\xf0HD\x9eW\xab\xd5\x07\xab\xe09\xbd\ +\x01vN\x82\x03xa\x18Nf=?p\xceu\x8d\ +1\x17\xc30\x9c\x94\x08X*\xb3\xee\x0b-*OD\ +\xc4\x18\xd3m\xb5Z_6\x0d\x07\xf0T\xf5\xeb\xff\x00\ +g\x92u\x17Zk{\xc0\xde\xdc\xf0$\xff}\x9c\x0e\ +\xfd\x01\xffH\xcb&\x1a>\x06\x95\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01\x93\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x10ID\ +ATH\x89\xed\x93AN\xc30\x14D'\xa8\x17\x80\ +\x05\x1c\x01\xb1w\x80J\xc0A\xe0\x08\xc9a*\xf5\x0e\ +\xb0@\x1c\xa4\xd2\xd8\xeb\x1e\xa14\x12\xdc\xc0\xc3\x82,\ +B\x15\xdb\xdfR\x17H0\xbb\xc4\xe37\xdf\x19\x07\xf8\ +WAMj\xc1{\xff$i\x0d\xe0\xd4\xc0\xf9\x04\xd0\ +;\xe7\x9e\x0f\x17NR;$\xad\x8cp\x8c\xbe\xd5\xdc\ +B2\x00\x80\x8c\xf0\xac?\x17\xd0\x01\xd8\x19\xe1;I\ +]\xe5@\xc7Q\xb2d\x92\x8f\x00\xd6\x00\xce\x0c\x9c\x0f\ +I}\xdb\xb6/\xe6d\x92\x03\xc9\x1b\x8b7\x84\xb0$\ +\xb97\xc3\xc7\x80\xaa\x92S\xfe\x5c\xc9\x83\xf7\xfe\xde\x02\ +\x0f!<\x00\x98=\xc1\x22\xb3\xaf\x93\xf4J\xf2\xa2\x14\ +\x10c|O\xdd\xa2\xdc\x8f\xb6(\x0c0U\x8d\xf7[\ +$\x07\xef\xfd\xad\xc5\xfb{K&yg\x81\x8f\x97\xa1\ +\xae\xe4\xa6izIo$\xcfK\x01\x92\xf6\x00\xfaY\ +\x8eeB\x00 \xb9\x01p=y\xb5q\xce\x15;\xca\ +}\xa2C\xc5\xe9\x83\xa4\x982N\xf5\xe3\x04$\xb7\x00\ +.+BS\xda:\xe7\xae\x8e\xc0\xf9\x0b\xfa\x02\xb8\x9f\ +|@z\xef6\x8e\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x01\xf6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01sID\ +ATH\x89\xe5\x95\xb1K\x82A\x18\xc6\x9f\xf7\x10\x13\ +A\x04!2$\xa8\xc0\xa5\xc5\xc1\xb3\xc1\xb1\xad\xb5\xa9\ +%\x02\x17\x07\x97\xa6\xfe\x85\x22\x1a*\x9a\x5c\x82 Z\ +\xda\x9a\xdb\xbe%\xbc\xef\x93Z\xa5%\xc9pi\x10\x1a\ +\xba<\x9f\x96\xdc*\xbfO\x14\x84\x9e\xf9~\xf7\xbb\x87\ +;\xde\x03f%$\x951\x86\xc6\x18\x17\x85S\xd3:\ +\xd0\xff\x16\xbcNSp\xd6\xef\xf7\xd7\xa2\x00\x12Q\x80\ +V\xab5\xd7\xeb\xf5vIf\xb4\xd6\x87\x13\x13\x18c\ +\x92$\xab\x22\xb2\x0f \x0b\xe0\x06\xc0\x95R\xaak\xad\ +m\xc7b\xb1\xae\xd6\xfas,A\xb3\xd9\x5cv\xce\xdd\ +\x01X\xfdc\x19\x01<\x8a\x88\x0f\xe0\xbeX,\xd6#\ +5\x08\x82`\xde9\xb7'\x225\x00i\x00\xd7$o\ +E\xa4\xed\x9c{\xc9d2\x9d|>\xff1V\x03\x92\ +JD\x06\x00\xe0y^*\x91HTH\xbaR\xa9t\ +>\x8a\x0d%0\xc6\x1c\x00\x10k\xedQ\xb9\x5c~\x0b\ +\xc3\xfc* )\x8dFc\x01@V)\x95\x03\xb0(\ +\x22[$7\x01\xf4\x00\x9cZkO\xc2\x8ad\xb8\xa9\ +\xef\xfbU\x92\xeb\x22R\x04\xb0\x02 \xf5\x07\xf7\x04`\ +Ck\xfd\x1c\xb9\xc10\x9e\xe7\xa5\x92\xc9\xe4\x92s.\ +\xa7\x94\xda&Y\x01\xd0!y\x1c\x8f\xc7\xeb\x85B\xe1\ +=t\x83Q\xf1}\xbfF\xd2\xa5\xd3\xe9\x8b\x9f^\xca\ +D\x13\x04A\xa4Q\x11z\x16}\xdf\xd3\xe5`0x\ +\x98\x8a\x00\x80\x90\xdc\x89\xc8\xcc\xe6\x7f0[\x82\xa9\xe7\ +\x0bg\x86\x9d<\xa7\xc2\xdbb\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x04'\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\xa4ID\ +ATH\x89\xdd\x94MlTU\x18\x86\x9f\xef\xcc\x14\ +\x0aV\x1b\x0c\x18\x03D\xca V3n\xb8?\xad\xc0\ +B\x8cQY\x98\xe8\x06\x15\x13I4\x12E\x85\xb8\xd1\ +h$H\x02\x09\xfe\xac\xb4\x8aF%\xfe\xb1\x9a\xa0a\ +\xa5\xd1H\x06u\xc1t\xee\xb9\xfd1\x8eA\xc5\xd6\x85\ +qa\x08\x09\xa1a\x08e\xee\xeb\xa2\x1d2\xa5C\xc5\ +\xa5\xbe\xab{\xce{\xf2\xbc\xdf\xf7\xe5\x9e\x03\xffuY\ +\xf3#I\x92\xbb\xcc\xec}`\x9e\xa4\x1dq\x1c\x1fj\ +zi\x9an\x94t_\x96eo\xf5\xf5\xf5\xd5\xfeM\ +\x80\xbb\x98d\xf6\x1e\xf0\x09\xf0\xaa\x99\x1d(\x95J\xb9\ +\x96s\x1d\xc0\xfa\x5c.w\xeb\x5c\xb0$I\xd6\x0f\x0e\ +\x0e\xael\x1b0\x0d9-i\x1c\xe8\xea\xed\xed\xedl\ +\x1a\x9d\x9d\x9de\xe0\xe6,\xcb\x966\xf7*\x95\xca5\ +\xad \xef\xfdv3\xfb>\x97\xcb\xbdr\xb9\x0ev\x00\ +;\xcd\xec0\xe0.\x5c\xb8\xf0f\xd3+\x16\x8b\x13\xc0\ +\xa0\x99-\x03H\xd3tk>\x9f\xff M\xd3\x81i\ +\xf8\x93\xc0\x1b\xc0i\xe7\xdc\xdbm\x03\xc20\xfc|l\ +llqGG\xc7\xd5\xc0\xc7\x92\x1e\xf3\xde\xbf\xd8\xf4\ +%\x1di\x06Hz\xc6\xcc\xbe\x91t}\x9a\xa6\x1b\x81\ +\x01`\xcc9\xb7>\x08\x82\xefZ\x03\x8c6\x92di\ +\x9a\xee\x04vKz0\x8e\xe3Ci\x9a\x86\x92\xf6I\ +\xdanf\xc7\x81\xb3Y\x96=\xe4\x9c;()\x99\x9c\ +\x9c|`\xdd\xbau\xa7.e\xb9\xd9x03EQ\ +\xb4\xc7\xcc\x1e6\xb3\x81j\xb5Z\x0c\xc30\x95t\xca\ +9\xb7\x16\xc8\xcc\xecY\xe7\xdc\xeb\xc0\xfe\x89\x89\x89\x8d\ +\xed\xe0\x97\xed\xa0UI\x92\xf4\x9a\xd9>\xe0Q`\xb3\ +\xa4?\x81\xab\xcc\xec\x1eI\xa58\x8e\xbf\xf8'Fs\ +,\xce{\xdf_\xa9T\x96_\xea\xd5j\xb5.\xef}\ +\x7f\xb9\x5c\xce\x03T*\x95\xe5###\xcb\xae\x84{\ +\xb1\x83j\xb5\x1a;\xe7\xaa\xd3\xcb3\x92~63/\ +\xe9X>\x9f?\xb6f\xcd\x9a_\xa7\x0b1 7<\ +<|\x9d\xa4n\xa0;\xcb\xb2\xae&\xc79\xf7W\x18\ +\x86?\xcc\x0a\x00\xf0\xde\x07\x92\xae\x9d^.\x04\xeaS\ +L\x9d]\xb2d\xc9POO\xcf\xf9\x91\x91\x91P\xd2\ +\xef\x8dF#6\xb3\x00\x08\x80\x22\xb0\x92\xa9\xbbD\xa3\ +\xd1\xe8\xed\xef\xef\xffeV@;\xd5j\xb5y\xe7\xce\ +\x9d\xdb*\xa9\xc79\xf7\xd5\xfc\xf9\xf3+\xf5z\xfd\xa0\ +s\xee\xe5 \x08F\x9b\xe7\xca\xe5r\xbe\xab\xab\xeb\x06\ +`a\x1c\xc7?\xb6\xed\xa0U\xa5R)\xb7j\xd5\xaa\ +-\x92v\x01\x87\xc20|>M\xd3\x13\xc0\xdd\xd3\x95\ +~kf/\x84a\xf8\xe1\x5c\x05\xb6\xfdM\xab\xd5\xea\ +\xed\x85B!\x95t@\xd2;Q\x14=7::\xba\ +\x14(H\xba)\x8a\xa2\xe3f\xb6M\xd2\x01\xef\xfd~\ +\xef}\xc7\x15\x05\x0c\x0d\x0d\xad\xf0\xde\x97\x9csG\x81\ +\xd5\x926\xc5q\xfc\x1a\xc0\xe4\xe4\xe4Z\x00\xe7\x5c\x01\ +\xa6n>\xb0\x0b\xd8\x06|\xed\xbd\xef\x9e3 I\x92\ +\xddY\x96\x1d\x016\x01\x7fdY\xb6!\x8e\xe3\xcf\x9a\ +\xbe\x99\xdd\x02 iQs/\x8a\xa2\xbd\xc0G\xc0\x06\ +\xe0h\x92$\xbb\x93$\xd9\xd2\xfa\x12\xe7[\x00k\x81\ +w%\xddif\x8f\xf4\xf5\xf5\x9dl\xad\xc4\xccVK\ +B\xd2\x8cWt\xc1\x82\x05O\xd4\xeb\xf5\x15\xc0\x1df\ +\x96\x017\x16\x0a\x85\xdb\x80\xa7ft\xe0\x9c{I\xd2\ +\x99\xf1\xf1\xf1{\xa3(\x9a\x01\x9f\xae|\xb9\x99}\x0a\ +\xcc\x18E\xb1X\x9a\xac\x95-\xdby\xcd\x01\xea\xf5\xea\ +{3\xfb\x00(\x08t\xeb\xb8\x13\xb8\xfd[M\x02\xa4\ +\x9e\x17I\xeb\xd9P\x17K\x03\xbc\xf7\x96\x15\xbb\xa3\x92\ +\xf7\xb5\x97U\xd2\x1a\xb6K\x03$v\xbdl\x16\x01\xc0\ +5\x01\x9c#\xd7\xffC\x00\xef\xb5\x9c-[\xfd\xfe0\ +\xca+\x8a\xe3\xd1\x1c\xd8\x94\x19?%\xeb\x94\x064\x1a\ +\xd5\xd8\xcc\xba\x80\x0b\x02\xbd\x88\xe3\xd1\xa1\x93\xc4\xf1h\ +N\xe2\x19\x80D/\x0c\xc3\xad\xe3\x00\x87\x1e\xda\xca\xca\ +\x973\x13\x13;]\xb0\xcb\x00\xe9m\xd1\x10\xac\x22\xb9\ +Y\xb0\xa9=\xe5\x89\x99_\xa8\xd7\xc3W\xa5\x01\x00\x83\ +\xc1\xe04\x04O\xc1\xe6\x0f\xe6\xa4\xb6\xd0\x03\xdd\x01\xab\ +\x80\x12\xe7\xb4\x10\x86W\x8f\x84\xe4~v\x00\xab\xab\xa3\ +KA`-p\x93f\xb6\xed\x1c\x9b\x92u\xc20\xdc\ +\x8a\xe3\xe1]\xc9-\x16A\x8e\x05\x14\xa9\x0c\xe4D\x80\ +\x0c2/i\x11\x08@\x09\xd8\xc3(\xaa\xb6w\xe3\x85\ +\x0f\xaaH\xf5z\xf8F\xd2c`\x9c^\x04\xdd\xdf\x1b\ +?1\x00\xa0V\x9b~\x9b$\xfe\x01\xb0d\xa6'\x7f\ +\xa3\xe7?\xa4\xdfJ\xcc\xcb\xe9\xc4r<\x91\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x02\x91\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x0eID\ +ATH\x89\xedSA\x8bRQ\x14\xfe\xbe\x93=\x8b\ +\xf1ml\xd3bZD\xb5\x89\xa0\xc5{*\x04\x09B\ +\xb5\xc9\xc5@\xd0\xfc\x84j5\x8b2bf(\x17E\ +\x90\x9bh\xd9?\x09\xa2 R\xf0\xbd\xfb\x94\xb0\x85\xbb\ +6\xc1\xd4\xca\x84HA\xbd\xa7E*\xa6\xce\x8cJ\xd0\ +f\xbe\xcd\xe5\xbb\xf7\x9e\xf3\x9ds\xbe{\x81#\xfco\ +p\xd5@c\xcc\x03\x92\x9e\xaa\xbe\xf6}\xff\xfd?\x15\ +0\xc6\xbc\x01\xf0\x11@GUK\x22\xf2\xae\xd5j\xdd\ +N$\x12\x17:\x9d\xce\xe7\x5c.\xf7stW\x96M\ +^\xadV/\x93\xbc\x06\xa0\x03\x00$a\xad\xcd%\x93\ +\xc9\xfb\x8e\xe3\x5cw]\xf7K\xb3\xd9<\xbbR\x07\xf5\ +z\xfd\xe6`0\xc8\xa9\xeaw\x92/\x86\xdb\x85\xe1Z\ +\x02\x00U}H\xf24\xc95\xcf\xf3\xee.\xd5A\xaf\ +\xd7K\x03h\x93\xd4\xfd\xee\x0c\xcf\xf6\xac\xb5)\x00\x88\ +-\x92\xb8X,J>\x9fw}\xdf/\x1ac\x9e\xab\ +\xea\x06\xc9'\xaa\xbaF\xb2\xa4\xaa\x00P\x22\xd9U\xd5\ +{\x00\xbe\xf5\xfb\xfd[\xc0\x82#\x0a\xc3\xf0-\xc9\x10\ +\xc0+\xdf\xf7\xf7\x16\x89\x19\xe1\xd0\x11\x05A\xb0\xa9\xaa\ +\x1f\x00<\x02\xd0h4\x1agV\x120\xc6\xecN\x1f\ +FQ\xf4LD.\x8a\xc8\xaf\xe1\xd6\xa9n\xb7{\xa7\ +\x5c.\x9f[Z\x00\xc0yc\xcc\x8d\x89\xca\xafXk\ +\x01\xe01\xfe\xbc\x90\x02\x80\x02\xc9\x1d\xc7q\xeaa\x18\ +^ZD`l\xb2\xb5\xf6\x87\x88\x5c\x8d\xa2\xc8\x07\xd0\ +\xb0\xd6fH\xb6\xe6\x05\x91t\x01lV\xab\xd5c\x99\ +L\xe6\xd3A\x02c\x93\xc30\xd4\xe1\xa7y*\x22\x00\ +0\x1a\xd9_\xef|\x8aw\xad\xb5\xd9t:\x1d\x8e\xf2\ +T*\x95\x93\xf1x|\xc7\xf3\xbc]`\x8e\xc9\x22\xd2\ +\x06\xd0>\xa8\xaa\x09\x9c \xb9Q\xab\xd5\xb2\x00\x10\x04\ +A6\x16\x8bm\xab\xaa;\xd3A\x10\x04/E\xe4\xeb\ +>\x95\x1e\xc6{\x22\xb2\xa5\xaa\xeb\xaa\xba\xad\xaaH\xa5\ +R\x9c\xdb\xc1\x8a8>\x18\x0c\x12\xaa:\xe3\xd9\xd8d\ +\x92[+T>\xe6$\xc7\x5cU\xd7g\x04&0\xfd\ +\x91\x96\xe6$\x93s\xf2\x1ea>~\x03\xb6\xf9\xd6\x10\ +e&\xc8\xc9\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x03\xe1\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03^ID\ +ATH\x89\xed\x95Oh\x5cU\x14\xc6\x7f\xe7\xcdd\ +\x86\x09\x14\x8a\x8b\x16te\x22\xc5TL\xec\xbb\xef\x0d\ +S)*\xd6\x85\x22H\xb0\x18\xb2\xd1(\xd8\xa6V\x90\ +\x22\x96\xb4\x92\xb6Hc\xda\x9a\x88\xda.\xa4\x0a\x16\x17\ +R\x9ch6\x8a\x0b\x17\xeab\xd40\xef\xce4A\xa7\ +P\x22\x09\x82P\xe9\xc2B\xc4d2\x7f\xeeq\x91?\ +\x0c\xf9\xa3c\xba\xf5[\x9e{\xee\xf7\x9ds\xbe\xfb\xce\ +\x83\xff\xf1/\x90f\x92&''\xef\xaaV\xab\x07E\ +\xe4E\x11\xf9\xc69\xf7f\x18\x86\xd7oK@U=\ +k\xed\xa3\x22r\x08x\x1a\x885\x1c;\xe0+U=\ +\x13\x86a\xfe?\x09LLL\xec\x8c\xc7\xe3\xcf\x03\xfd\ +\xc0\xddM\x14\xf9\xbd\x88\x9c7\xc6|\xf1\x8f\x02\x85B\ +\xc18\xe7\x0e\x89\xc8\xb3@\xaa\x09\xe2\xb5\x98T\xd5w\ +fgg?\xe9\xe9\xe9\xa9\xaf\x04\xe3\x00\xd6\xda\x13\xaa\ +:$\x22\xde\x16\x88W\xf0\x80\x88|\xd0\xde\xde\xbe\x13\ +\x18Y\x09z\x00A\x10\x9cu\xceu\x02c[$\xff\ +\x13\xb8P\xab\xd5\xee1\xc6\x8c4\x1e\xac\xf3\xa0X,\ +\xeew\xce\x9d\x07L\x13\xc47U\xf5\xfdd2\xf9^\ +gg\xe7\xad\x8d\x12\xd6\x8d\xa4R\xa9\xfc\x0c|&\x22\ +o\x00\xbflB<\xe3\x9c;\xa6\xaa\xdf\x8a\xc8\xdej\ +\xb5\xbag\xb3\x0aV\x05\x0a\x85\x82\x89\xa2\xe8R<\x1e\ +\xcf\x03\xdbc\xb1\xd8\x87\xc0n\x11\xe9\x07~_N\x9b\ +T\xd5\xbe\x99\x99\x99]\xe9tz\xd49\xf7\xb2\xaa\xfe\ +\xa8\xaa\xe3\xd6\xda\xabQ\x14=\x97\xcdf\x1b\x9f\xf3\xd2\ +\x88\xac\xb5'\x80!\xe0\x96s\xee\x89t:\x1d5&\ +\xe5r\xb9m\x89D\xe2\xfet:\xfd\xc3\xda\x0a\xb3\xd9\ +l\xac\xad\xad\xed\x08\xf0.P\x15\x91\x93\x8d>\xacz\ +\x90\xcf\xe7\xef\xf3<\xef4p\x00\xf8\xdc\xf3\xbcc\xbe\ +\xef\xff\xbaY\xeb\xa5R)1??\xdf+\x22\xaf\x03\ +w\x02\x97k\xb5\xdaH&\x93\xf9m]\x07\x8d\xb0\xd6\ +v\x03\x83@\x07p\xb1V\xab\x0dg2\x99\xb9\x95\xf3\ +\xe9\xe9\xe9\xe4\xdc\xdc\x5c\x9f\xaa\x0e\x02I\xe0S\x11\xf9\ +\xda\x18\xf3\xe5\xf2\xfd\xe3\xc0#\xc0\x0bA\x10\xdcX\x15\ +(\x16\x8b\x0f\xa9\xeaK\xaa\xbaOD^Q\xd580\ +\x0cl\x07\x86b\xb1\xd8\xc7\xf5z\xbd\x0f\x18\x00\x16\x80\ +\x0b\xe5r\xf9\xa3T*5\xe0\x9c\xcb\xb4\xb6\xb6v\x97\ +\xcb\xe5\xe3@QU\xdfV\xd5\x9f\xc20|j\x9d\x07\ +\x9e\xe7=\xee\xfb\xbe]\x19\xc3\xc2\xc2B?p\x12\xb8\ +CD\x8a\xce\xb9\xb7\x82 \x18\x17\x11\xb7\xa6\xf3Q \ +\x03<#\x22{UuW\x10\x04\xe7V;\x88\xa2h\ +\x8f\x88\x9c\x03\xf6\x03\x97\x81SA\x10\xdc\x80\x8dM.\ +\x95J\x89\xc5\xc5\xc5\x0e\xdf\xf7\xa7\x1a\xc9\x811\x11\xf9\ +\xce\x183\xb8\xa1\x07Q\x14=\xb6,t\xaf\x88\x8c\xc4\ +\xe3\xf1\xd1\xae\xae\xae\xbf\x1a*m\x05\x0e\x02O.\x13\ +\x0e\x88\xc8\xc3\xf5z\xfd\x80\xe7yWD\xe4\xaa1\xe6\ +\xd5MM\x06PU\xb1\xd6\xf6\x8a\xc8\x10K\x8b\xefT\ +\xa5R\x19O&\x93\x87U\xf5(\xf0\x07\xb0\xaf\xa5\xa5\ +\xc5\xabV\xab\x17\x81\xa3,\xad\x99\x89 \x08^k\xe4\ +\xdap\xb9\x89\x88\x86ax%\x95Ju\x00g\x81\xe1\ +D\x22q\x13\xe8V\xd5#\xc6\x98\xdd\x9e\xe7\xed\xa8T\ +*g\x8c1\xbd,}\x03\xeb\xc8\x9bF.\x97\xdb\x96\ +\xcf\xe7\x1fl\x8c\x15\x0a\x85\xd3\xd6Z\x8d\xa2\xe8\xd2\xd4\ +\xd4\xd4\x8e\xcd\xee6\xf5\xcb\xdc\x08\xd6\xda1U-\xc5\ +b\xb1\xac\xef\xfb\xd7\xb6\xcas\xdb\xf8\x1b\x8a\xacl~\ +\xb0 \x01l\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x00\xbf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00'\x22\x14\x91\xbb\x00^\x03\xf8\x9c\xe7\xf9\x5c)\x00\ +\x80Cq\x1c\x7fQ\xd5\x1a\x00\x88H\xcb\xdd_\xc4q\ +\xbc\x1eB8X\x06\x00\x00\x8fHvB\x08G\x01\x80\ +d\x0b@\xcb\xdd;\xaazxf\xa0^\xaf\xbf\x02p\ +\xcb\xdd?\x84\x10\x8eO\xda\xf5\x84\xe4=\x92\x1fU\xb5\ +1\xeb\x0b \x22K\xee~\xdd\xdd\x97U\xf5\xd4\x04~\ +\xe3\xee7H.\xf7\xfb\xfd\x133\x01\x00\x90\xa6\xe9\x0a\ +\xc9\x0b$\x17C\x08\xe7\x01\x80\xe4\x92\xbb_\x8b\xa2\xe8\ +\xbd\xaa\x9e\x9e\x09\x98\xdcz\x1d\xc0Yw_0\xb3+\ +\x22\xc24MW\x8a\xa2\xb8Hr\xd1\xcc\xce\xfd5\x10\ +B(\xcc\xcc7\x07\x80\x00`\x1f\x80\x97fv\x1b\x00\ +\x1a\x8dF\xa7(\x8ay\x00OU\xf5\xf2vu\xe2\xed\ +\x16Ed\xea\xdf4\x8a\xa2\xbe\xbb\x1f#\xb9\xaa\xaa\xd5\ +4M\x9fO\xf5\x82i3i\xd7W\x00'I>T\ +\xd5;[\xf7\xb99\x99\xb4\xa1\xac\xb4D\xe4A\x89\xf5\ +\xfea~\x03\xde7\xc4\xab\xe2P\x9e1\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02[\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xd8ID\ +ATH\x89\xed\x91?hSQ\x14\xc6\x7f\xe7i\x16\ +A\x92\xd1Q\x02\xc1A!\xc2\xbb7\xc1\xe8\xa8\xd8]\ +\x90\x0a\xaen\xce:\xb8\x14A\xd0UqS:\xd9j\ +\xc4\xa1\xd6\xa4E*\x08E\x87\xdc\xf7\xa2\xabH\xa2 \ +n\xb1K\xa3Pb\xeeq0\x85g\xc8\x1fy\x09\xb8\ +\xf8M\xf7|\xe7\xbb\xe7\xc7=\x17\xfek\x8a$Y\xc4\ +q\x5cW\xd5\x8f\xc0\xd30\x0c\xdf\x88\x88\xce\x15\x10E\ +\xd1m\xe0\xfa\xa0\xfc\xa2\xaa\x1bA\x10\xbcP\xd5Mc\ +Lof@\xb3\xd9<\xe5\xbd\x7f;\x22\xb7#\x225\ +U]\xcfd2\xf5b\xb1\xf8=\x15@U\x838\x8e\ +\xbf\x02G&\xdc\xd9U\xd5:\xb0j\x8cy>m\x8d\ +\xc1\x1f4\x11\x0f\xacO\xc8w\x80M\xa0.\x22\xaf\xff\ +\xe6\x8f\x0e\x8e\xf0\xd6\x80+c\xf2\xf7\x8c17\xa7\x0d\ +M*\x186\xb2\xd9\xec\x16\xb0;&\xbf\xe4\x9c\xbb0\ +\x13\xa0P(\xec\x89\xc8\xcb1y\x11\x91\xe5F\xa3q\ +<5\x00\xc0{\xbf68~P\xd5\xfbC\xed\xc3A\ +\x10<\x8b\xa2(\x9b\x1a\xd0\xeb\xf5j\xc0O\xa0f\xad\ +\xbd*\x22\x97\x81\x1f\x89\xc81\xe0I\xb5Z=\x90\x0a\ +P\xa9Tv\x80mU\xdd\x00\x08\xc3\xf0\x91\xaa\x9e\x01\ +>'b\xe7\xf3\xf9\xfcR*\xc0@+\xb9\x5cn{\ +\xbf\xb0\xd6\xbe\x03\xac\xaa\xbeJdn\xc4q|1\x15\ +\xa0\xddn/\x17\x0a\x85\xbd\xa4g\x8c\xe9t\xbb\xdd\x05\ +\xe0\xee\xc0\x12U}\xe8\x9c;1n\x8e\x8ckL\x93\ +s\xee\x92\x88<\x00\x0e\xf1{u\xd6\x18\xd3\x19\xceM\ +Z\xd1DYkW\xbd\xf7\xa7\x81O\xc0Q`e\xd4\ +\xa7\xa7\x06\x00\x94J\xa5\xf7\xfd~\xdf\x8a\xc8\x16p.\ +\x9f\xcf\xdf\x9a+\x00\xa0\x5c.\x7fk\xb5Z\x0b\xc0\x1d\ +\xe0\x9asnq\xd6\x99c\xe5\x9c[\x8c\xa2\xa8\x13\xc7\ +q\xb8\xef\xcd\xfc\x82\xa4\xac\xb5\x8f\xbd\xf7g\xbd\xf7'\ +\xe79\xf7\xdf\xea\x17^5\xb0\xe3\x11\xf3\xa3\x17\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02&\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xa3ID\ +ATH\x89\xed\x91\xbfkSQ\x14\xc7?\xe7\xc6\x94\ +\x92\x12\xc1\x0eb\x1d\x84VT0.}\x81\x17\x10:\ +H)\x8a\xe0V\xfa\x0f8\xe9(\x8en\x1dE\x5cD\ +\x10\xbausS\xdc\x0a\x0dE\x84\xc0=\xef\x12\xddZ\ +\xe8$v(\x14\x97.\x09\xe6\x5c\x974\xc4P\x93\x97\ +\x12q\xe9g\xbb?\xce\xf7s\xcf\xb9p\xce\xffF\xce\ +Z\x18BX6\xb3E\xe0[\xb5Z\xdd\x12\x9181\ +\x81\xaa\xbe\x02\x9e\xf5BD^\x17\x8b\xc5\xf5V\xabu\ +\xa3T*5+\x95J\xfb\xcc\x02U\x9d\x03~\x0c\xd4\ +F\xe0\x18(\x03{\x9dN\xe7n\xadV;\x02p\xe3\ +\x84\x87\x10n\x03\xe1\x94\x87I7\x1c\xe0f\xa1P8\ +P\xd5\xa7c\x0bb\x8c\xd7\x81+9\xaeN\x01\xf7r\ +\x0bb\x8c\xd2h4.&I\xf2\x09X\x13\x91M\xe0\ ++p\x04\xb4\x81_\xc0O`\x1f\xa8\x8b\xc8;\xe7\xdc\ +s\xc8\xf9\x07\xaa\xfa\x12x\xe8\x9c[I\x92\xe4 O\ +\xcd\x09#\x05\xaa\xfa\x04x\xdb]\xee\x9a\xd9J\x9a\xa6\ +\xdf\xf3\x0az#\xca\xb2\xec\xc1\xe0\xa1\xf7~\x15x\xd3\ +\xb7u\xcb9\xb7\xe3\xbd_\x18[\x10c\xfc\x90e\xd9\ +\xa3>\xe1Rw\xd6\x83\xff4/\x22_\xbc\xf7w\xf2\ +\x08z#R\xd5\x08\xb4EdUD\xf6\xcd\xec30\ +;\xa4\xf6\xd0\xcc\xee\xa7i\xda\xcc\xd5A\x97\xa9\x18\xe3\ +{3\xdb\x1a\x11\x0ep\xd99\xb7\xed\xbdO\xfb7\xeb\ +\xf5\xfa\xb4\xaan\xfcM\x000\x0d\x5c\x1d\x11~\xc2%\ +\x11\xd9\x0e!,\x03\xa8\xea\xb5r\xb9\xbc\x03<\x1e&\ +\x18\x97\x193\xfb\xa8\xaa/\x80&\xf0GG\x17& \ +\x00(\x01\xeb\xa7\x1dL\xa2\x83\xa1\xfcs\xc19#\xf9\ +\x0d\xa1L\x8b@\xfc\xe4\x1aE\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x03\x1c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x99ID\ +ATH\x89\xd5\x95;hTA\x14\x86\xbf37\x92\ +\x8dh\x0cF\xf1\x15|\x80VQ1\xdeY\x03\x82\x85\ +\x98B\x82F\xc1(>b\xb0\xf1\x81\x10\x0b\x1b+\xed\ +\xb5T\x0c\xa8\x95\xaft\xc1\xca\xc2(\xd9\xc2 \xb2;\ +a\xb1\x88\x8db!*\x88\x08\xd15\x0f\x1f;\xc7\xc2\ +1^\xb2\x9bu\xc5*\xd3\xcc\xb9g\xce\xfc\xdf\xfd\xe7\ +p\xe7\xc2l\x1fRm\xe1\xc8\xc8\xc8\xbc\x89\x89\x89&\ +\x80\xba\xba\xba7\xcd\xcd\xcd_\xfe\x1b\x90\xcf\xe7\x1b\x8a\ +\xc5b\x0f\xd0\x09l\x9c\xb6\xfc\x0c\xe8\x8f\xa2\xe8JK\ +K\xcb\xe8?\x03\x86\x87\x87\x8f\xa8\xeae`aH}\ +\x06^\x87x%P\x1f\xe2\x8f\xc0\x19km_9\x1d\ +S.\xe9\x9c\xbb\xa0\xaaw\x82\xf8\x801\xa6\xadP(\ +4Zk7Xk7\x14\x0a\x85FcL\x1b\xf0\x00\ +h\x04\xee8\xe7\xceW\xe5 \x97\xcbu\x8b\xc8M\xe0\ +\x87\x88\x9c\x8e\xe3\xf8\xc6L.\x83\xd3\xe3\xaa\xda\x0b\xd4\ +\xa8jw:\x9d\xbe=#\xc09\xb7\x08x\x09,\x10\ +\x91\x13\x7f\x13O@N\xa8\xea5`\xb4X,\xaem\ +mm\xfd\xf8{m\xfa\x11\x9d\x05\x16\x00\x03\xd5\x8a\x03\ +\xc4q|\x1d\x18\x00\x1a\x8c1g\x93k\xd3\x01\xfb\x01\ +D\xe4b\xb5\xe2SB\xc6\x5c\x0a{\xf7\x97\x058\xe7\ +\x96\x01k\x81\xb1T*5\xf4\xaf\x80\xda\xda\xda\xc7\xc0\ +\x18\xb0.\x9b\xcd.-\x01\x88\xc8\xf20?\x1f\x1f\x1f\ +O\x0f\x0d\x0d\xcd\xafV\xdc97wrrr\xb3\x88\ +<\x07\x88\xa2hE\x09\xc0{\xbf3\xcc\x02\xb4\xa7R\ +\xa9\xfb\x99L\xa6\xa6J\xc6]`W\xd8;\xa55\xdd\ +\xc1\xd107\x19c\xde\x01\xdb\xea\xeb\xeb\x0f\xfeM9\ +\x9b\xcdn\x05\xf6\xaa\xea;\x11Y\x194\xbaJ\x00\xc0\ +\xaa0/\xf1\xde\xbf\x02P\xd5s\xaaZ\xf1:\x89\xa2\ +\xa8'\x88\xbe\x02\x16\x87\xf4\xear\x80\xcf\xbf\xcd\x00\xcb\ +\x80\x0f\xc0z\xe7\xdc\x8e\x0ao\xbfTU\xf7\x01\xefU\ +\xb5\x89?\xdf\xd5\xa7\x12\x80\x88\x0c'\xe2\x0e\xa0/\xc4\ +3\x1e\x931\xa6\x0b\x98\xc3\xaf\x1e\xecI,Mi%\ +\x9b\xdc\x9f(\xd8\x0d<\x04\xbe\x01\xdbg\x02\x00\x1d\xa1\ +f\x10hO\xe4\xef\x95sp\x0bx\x91\xc8\x1f\x0ew\ +\xcc\x9a\x0a}\xd8\xa4\xaa\xbd\xaaz4\xa1\xf5\x02\xb8Y\ +\x02\xb0\xd6~\x17\x91S\xc0\xd7\x90:d\x8cy\x0a<\ +\xaa\xe0\xe0\x09\x90\x15\x91\x03\xe1\xf9+p\xd2Z\xfb\xbd\ +\x04\x00\x10\xc7\xf1\xa0\x88t\x02\xa3\x80\xa8j\xaf\xf7\xbe\ +[D\xb4\x9c\xba\xf7\xfe\x98\x88\x5c\xe5WsGE\xa4\ +\xd3Z\x9bI\xd6\x94\xb5\x9e\xcf\xe7\x1b\xbc\xf7\xdb\xbd\xf7\ +o\xd3\xe9t\xb6\x82\x03r\xb9\xdc\x16c\xcc\x0acL\ +\xa6\xd2\x9fm\xf6\x8e\x9f\xe2?\xee6\xfa,\xc2F\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\xc6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03CID\ +ATH\x89\xed\x95Oh\x5cU\x14\xc6\xbf\xefd&\ +\x93\x85q\x82\xba\xc8FB\xc7\x12\x88\x22\xc8\xbcyM\ +\x18\xb1 \xf8\x9fT\xba\x90(X\xc4U-XPT\ +\xdc\x14\xaa\xe2\xc2EC\x14\x051R\xac\xa2Y4\x15\ +\x17%4nJ6)\xe4\xcd\xbboliSK\xa7\ +\x99mQTf\xba\xa8\x99$\xef}.\x9c\x91\xc9\xb4\ +\xaf\xd2.\xc5\xb3\xbb\xe7\x9c\xfb\xfb\xde9\xe7\xdd{\x81\ +\xff\xb4I\xb2(\x8a\xa6\xa2(\x9a\xb8S\x06\xd3\x02Q\ +\x14MH\xfa\x16\xc0N\x00\x9b\x1b\x1b\x1b\xc3\xe5r\xf9\ +\x8fN<\x0c\xc3\xe7I\xbe\x0e \x0f\xe0\x8dR\xa9\x14\ +\xdc\x8cci\x02I\x92\xcc\x90\xbc\x0a`\x13\xc0\xf5l\ +6;]\xab\xd5r\xb5Z-\xe7\x9c;J\xb2lf\ +\xefK\xfa\x15\xc0t\x1a'\x93Z\x1a9&i_\x1c\ +\xc7+q\x1c_\xef\xef\xef\x1fk6\x9b\xc7$\x91\xe4\ +\x91R\xa9TmW\xfa\xa5\xa4ci\x9c\xd4\x0a\x00\xac\ +Kj\x8d\x8f\x8f\xff^.\x97\xff\xac\xd7\xeb\xe7H\xd2\ +\xccb\xcf\xf3\xcevU\xba\x0e\xa0u'\x02W\x00\x8c\ +t\x16\x85B\xe1\xdd8\x8eg\x92$\xf9\xd49\xf7N\ +W\xde\x03\x92\xd6\xd2 \xb7j\xd1*\xc9\x97\xc30\xbc\ +\x1f\xc0\xc3\x92\x86\xcd,\x0f\x00\x92\x1e\x0b\xc3p\x17\x80\ +\x0b$\x9f\x05\xe0R9\xdd\x8b\x95\x95\x95\xbb\xfb\xfa\xfa\ +\x0e\x90|DRLrO6\x9b\x1d\xdd\xda\xda\xfah\ +mmm\xff\xd4\xd4T\x0c\x00KKK\x99\xc1\xc1\xc1\ +/r\xb9\xdc\xa1V\xab\xb5\x06\xe0{\x00\xfd$\x7f\xda\ +\xdc\xdc\x9c\x9d\x98\x98\xb8v\x83@\xa5R\xf1\xcdl\x96\ +\xe4a\xcf\xf3\x16$1\x8a\xa2+\x00\x96\xccl\xa6X\ +,^\xec\xfe\x98j\xb5\xfa\xa0\xa4\xb7%\xed\xf6!i\xa4\xc3\x92\ +\xf4\x9c\xef\xfb\x8b7T\xd0k\xd5j\xf5\xf38\x8e\xcf\ +\x99\xd9\xb0$_\xd23f\x16\x02@\x92$\xbe\x99-\ +\x02p\x92~\x01P\x04pY\xd2e\xdf\xf7O\xa61\ +\xb7\xf57\x0c\xc3\x0bA\x10\xdc\xdb\xe5;\xec\x9c\xfb\xd9\ +9w)\x0c\xc3C=\xf9\xb7}U|C\xf2\xa1L\ +&s\xb0\xe3\xc8\xe7\xf3\x9f\x00\xb8\x0f\xc0=CCC\ +\x9f\xf5\xe4\xdfu\xbb\x02_\x03X\x8f\xe3\xf8\x14\x00\x04\ +A\xb0\xa3\xd1h\x9c&y\x96\xe4\xf9F\xa3q:\x08\ +\x82\x1d\x9dd\x92#)\x9c[\xbe\x07g\x00\x9c\x07\x00\ +I\xfb\x00\x9c\xc8\xe7\xf3\x07\x00\xa0\xd9l\xce\x02x\x81\ +\xe4wI\x92\x90\xe4X\xa9T\xda}3N\xea]$\ +\xe9-I\x1f\x9bYC\xd2\x94\xef\xfb\xa7\xba\xc2\xaf:\ +\xe7N$Ir\x10@^\xd2\x9bi\x9c\xff\xed_\xed\ +/\xa9>\x97\xf6\xc2\xa8\xf4\x95\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xe2ID\ +ATH\x89\xed\x93\xb1n\xc20\x10\x86?\x90'P\ +\x1a\x06\xd4\xf7\x88t\x12\x8f\xd4\xaaC_\xa6\x03\x03/\ +\x94\xe1B\xc4s\xb4C\xaa\x94fq\xe2.\x08\x81k\ +\x82\x8c@\x0c\xe4\xdf|>\xff\xdf\x9d\xcf\x86A\xf7\xd6\ +\xe8pQ\x14\xc5\x87s\xee\x150\x81\x5c\x0b,E\xe4\ +=\x06pd\xb43\x9f\x8b\xc8\xb7\x9fX\x96\xe5\xacm\ +\xdbO\xe0r\x00`\xea\xba\xde\x86\x12\xb3,\xabTu\ +\xad\xaa\xae\xc7\xcf\x02+\x11y;\x05\xe8\x95\x88,\xfa\ +\xf6\x0f\xba\xdc\x03\xc61\x80s\xaa\xaa\xea\x07\xaf\xe8`\ +\x07g\x86\xdd'\xeb\x07\x82\x06\xce\xb9\x17 \x15\x91\xdf\ +\x18\xf7<\xcf\x9f\x8c1G\x0f\xe4\xd4\x15\x99Xs\x80\ +\xa6i\xfe\x9d\xb9\xea\x0cB\x1a\x00\x0f\x08\xb0I\x92L\ +\x01\xab\xaa\x93X\xb34M\x9f\xfd\x98\xff\xd1\x96\xc0\xd7\ +.\xbeU\xd5(@\xd7u\x00\x9b\xd8\xc2\x06\xddV\x7f\ +\x8c\xc5Q\xa8\xf4\xf2xU\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01P\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xcdID\ +ATH\x89\xed\x94A\x0a\xc20\x10E\x7f\x06o \ +\xb8\xf1\x16]x\x06qa\x0f\xa1\x98,z\x9cB2\ +\x1b\xd1#H\xd1;\x08^\xc5+d\xdctcIj\ +\x9b\x16D\xe9[&\xe4\xfdL2\x0c0\xf1mT\xca\ +!f\x96\xd8\x9e\xd6\xfa\xcd\x99\x14\xd0\xc4Z\xbb\x22\xa2\ +\x0a\xc0\xa2\x19@C\xe5\xcc\x9c\x11\xd1ED\xf6\xa1\xfd\ +A\x01\xcc\x9c\x01\xb8\x8a\xc8\xc1\x18S\x8d\x1a\xd0E\x0e\ +\x00\xb3\x14yY\x96\xf3Z\xbe3\xc6\xdcR/\xd9\x8a\ +\xb5v\xd9\x5ck\xeb\xae?\x22Tf\xe89\xba\xf2\xb1\ +\x8b\x9cs\x1b\x22z\xd4\x1f\xdb\x9b\xd6.r\xce\xad\x95\ +RG\x00yQ\x14\xcf\x94\x80h\x05\xb5\xfc\x04 \xd7\ +Z\xdfS\xe4\xd1\x80\xb1\xe4\xd1\x00\xa5\xd4\xd9{\xbf\x1d\ +*\x07\x02\xd3\xb4\xcf(\x9e\xf8\x0d^bVM#\xf5\ +b\x16\xc6\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x95\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x12ID\ +ATH\x89\xedT=\x88\x13A\x14\xfe\xdeM6A\ +1\x09\x9c\x5c!\x82 G@=\xe1\xe0v\xd7\xc5-\ +<\xf0\x0f\x05\x8d6\x16\x82B\xe4P[\xe5\x0a;\x0b\ +\x0b\xc5B\xb48\xb1\xbdB\x10\xd3*\x88U\xba%\x9b\ +\x9d\x19\x82\x98\xc2\xc6CA,\xb40\xcd\x99`\xb2\xcf\ +&9\x93\xcd\x9fI\x04\x0b\xfd\x9a\x99y\xef\x9b\xef{\ +\xef\xc1\x0c\xf0\x1f\x7f\x1b4\xc9%\xdf\xf7\xf7\x0a!\xb2\ +\x00\x16,\xcb\xba6\x8c;3\xaex\xa9Tr\x85\x10\ +o\x01\x10\x15\ +\x07\x00f~@D\xf7\x22\xe1\xa5j\xb5z\xb7\xb5\xff\ +\x0a`\x13\xc0v\x22\xba\xd0&\xf4\x18\x84ax\xa5_\ +W\x002\xfd\xf8\x00n*\xa5\xce\x98\xa6\xf9\x06\xc0\x22\ +\x80\x1b\x00\xe6\xdb\xc9\xae\x11\x15\x0a\x85X2\x99\xfc\x08\ +`\xd7\x00\x93A\xf8\x02`\xd1\xb2\xac\xcf\xd1DWE\ +\xa9T\xea\xd4\x04\xe2\x000\x07`=\xfa\xea{\x0c\x86\ +\x8c\xe7wpRk\xbd\x1a\x0dn\x8d\xc8\xf7\xfd\x9dB\ +\x88O\x00\x12S\x98\xfc \xa2#\xa6i\x16\xdb\x81\xad\ +\x0e\x84\x10\x97\xa6\x14\x07\x00\x83\x99\x9f\x16\x8b\xc5T\x8f\ +\x01~}\x0d\xd3b\xde0\x8c\xb5?\xa4\xf5/\xe0'\ +*p\xb1\xcf\x93r\x94\x11\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02I\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xc6ID\ +ATH\x89\xed\x93\xb1\x8b\x13Q\x10\x87\xbfY\x93\x95\ +\xa8\x9b\x80 Z\x07SE\x14\xf6\xbd\x1cX(l#\ +\xd7\xdc\xbf`#\x82 \x22\x22\x1e\x5c\xa3Wjsh\ +s\x04\xe1\xc0+\xecm\xafJuA\xd8y\x09w(\ +v\xe9\x05\x1bY\x84\xe4\x12\xf6\xd9\xdc\xc2\x22{'\x07\ +\x16\x16\xf9\xba\x99\xf9\xbd\xf9\xbdy\x8f\x81%K\xfe{\ +\xa4\x1c\xa8\xea\x11P/\xe2,\xcb\x1aI\x92LU\xd5\ +\x179\xef\xfdw\x11\xb9Z:\xf6\xd8Z\xbb\xad\xaaO\ +\x81\xb7E\xd2Z+\x00A\xd9\xc0Z\x1b\x02\xd7\x81\xa9\ +\x88\xac%I2\x05\x10\x91\xbb\xc0\x0f\xe0J\xaf\xd7\xbb\ +f\x8c9\x07|\x066\xac\xb5\xdb\xc7g\xdf\x01\x0f\x81\ +C \xac\x9c\xa04\xc9K\xe0~\x96e7\x80E\x14\ +E#\x11\xd92\xc6|(4\xce\xb9\x9b\xde\xfb}\x11\ +Y1\xc6|\x1b\x0e\x87\x97\xc30\xfc\x1a\x04\xc1Z\x1c\ +\xc7Z\xe8\x82\x8a\xfe4\x1a\x8d\xd7\xc7\x8d_DQ\xf4\ +\x1c\xf8\x19\xc7\xf1nYc\x8c9\x04\xfay\x9e\xefx\ +\xef\x830\x0c\xdf\x00\x1f\xcb\xcd\x01jU\x06\xddn\xf7\ +(M\xd3'\x22\xf2\x09\x98\xe5y~GD|\x85\xf4\ +\x95\x88|q\xce\xf5\x81\xa4^\xaf\xdf\xaa\xeaw\x22\xce\ +\xb9}U\xdd\xfb\x8bfUU\xbd\xaa\xde\xab\xaaW\xfe\ +\x01@\x9a\xa6+\x22\xb2\x07\x5c\x00V\xad\xb5\x83*\x9d\ +\xf7>p\xce-\xac\xb5\x95\xcf]\x99\x1c\x0c\x065\x11\ +\xe9\x03\x1b\xc0\x16\xb0sppp\xf1\xb4IN\xa2\xd2\ +\xa0\xd9l\xae\x033c\xcc\xfbV\xab\xb5\x09\xcc\xe6\xf3\ +\xf9\xe6?1\x18\x8f\xc7\x1d\xef\xfdz\x10\x04\x0fD$\ +\xeft:\xb3<\xcf\x1f\x01\xcfF\xa3\xd1\xed\xb3\x1a\xfc\ +\xb9\xc93JK2\x99Lj\x00\xedv{Q\xd6\x15\ +[\xaa\xaaS\xe0|\xa9\xf4\xcbZ{\xe9\xac\x97X\xb2\ +\xe4t~\x039\x8d\x9c\xbb\xbc\xf0\xc8\x07\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x04]\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\xdaID\ +ATH\x89\xd5\x95]h\x5cU\x10\xc7\x7f\x93\xe6.\ +\xbbb\x02\xfdP\xa9\x96\x8a\xc9\x8aB\x944{N\xd3\ +\xd0\x86\x22U[\xdb(mS\x1a\x10\xa5\xf8 \xa2 \ +\xf4Am*\xf4\xa5\x8a\xd26Q\xb4\xea\x93\xbeXP\ +\xb1`?\xa8\x0fE\x90H\xe9G\xf4\x9e\xbb5\xea\x1a\ +m\xeb\x06mkU\x90b\xd9\xb2\x1b\xef\xe6\x8e\x0f{\ +\x13n6\xb1\xe8c\xcf\xdb\x9c\xf9\xcf\xfc\xcf\x99s\xe6\ +?p\xbd/\xb9\x96\xb3P(\xa4*\x95\xcaFU]\ +\x0f\xe4\x80E\xb1\xeb\x02\x90\x17\x91C\xe9t\xfaP[\ +[\xdb\xdf\xff\x9b\xc0\xf7\xfdM\x22\xb2\x07h\x89\xb7\xce\ +\x02c\x80\x02\x8b\x81\xbb\x80\x06\xe0'\x11\xd9f\x8c9\ +\xf0\x9f\x08\xf6\xef\xdf?\xa7\xa5\xa5e7\xf0\x1c\xf0W\ +\x8c9e\xad}(\x89\x1b\x1e\x1e^\xe4y\xde\x16U\ +\xed\x07\x9a\x81AcL\xbf\x88DI\x5cC=A\x22\ +\xf9\x17\xc0*\xe0\x06U}\xad\x1e\xd7\xd5\xd5u\xc1\x18\ +\xf3j\x14E\xf7\xa8\xea1\xe0y\xe7\xdc\xaez\xdc4\ +\x02\xdf\xf77\xc5\xc9\x87\x81\x1eU\xed\x00\xae\x94J\xa5\ +\xa1\xd9\xae\x0f\xd0\xd9\xd9y>\x95J\xad\x03\x86E\xe4\ +\x05\xe7\xdc\x86\xa4\x7f\xaaD\x85B!U.\x97G\xa9\ +\xd5\xfc\x5cL>\x1f\x98\x10\x91\x0f\xa3(:\x91J\xa5\ +\x8e\xb4\xb7\xb7_\x9d\x8d\xc8\xf7\xfdgE\xe4-\xe0\x5c\ +&\x93i\x9b|\xf8\xa9\x1bT*\x95\x8d@\x8b\xaa\x1e\ +\x05\xf6\xa9\xeaN\xe02PP\xd5\x16\x11y;\x0c\xc3\ +K\xce\xb9\xbd###7\xd7\x13\x88\xc8#1>[\ +.\x97\xd7\xcf(Q\xfc\x15#\xcf\xf3\x9e\xb4\xd6\xbe\xbc\ +t\xe9\xd2}\x80\x8a\xc8\x01km\x8f\xb5v\x81\xe7y\ +Y\xe0\x9bj\xb5\xfaf\x10\x04}\x93\xb1\xce\xb9V`\ +\x95\x8844\xd4\x18\x07\x1fN\xf82\xc0\xc3\xaa\ +\xfaz\x18\x86\xef\x9c>}\xfaN\x80(\x8a\x8a\xc0T\ +\x99\x93\x04\x01\xd0\x96\xcf\xe7o\x9ar64\x1c\x06\xe6\ +777?\x00\x10\x86\xe1Q`1\xb9\x97\xcb\xe5~\x06>\ +\xa3\xd6|tuu]Q\xd5iM\xa7\xaa{|\xdf\ +_\x01\x90\xc9d\xee\x03\xeeV\xd5)]\xaao\xb4\xef\ +\x81\xb9\xc0\x07\xc0\x1f@EDV\xa9\xeaZ`\xaf\xb5\ +v\xabs\xeei\xe0\x15`\x10x\x89Z\xbd\x7f\x01\x8c\ +1\xe6\xcf \x08\x06\x81\xed\xf1\x9bM\x17\xbb \x08z\ +U\xf5\x93\xd8\xfc\x1a\xb8\x1a\x13-\x04\xee(\x16\x8b\xb7\ +e\xb3\xd9[\xa2(\x1a\xb0\xd6>\x96\xcf\xe7WFQ\ +\xf4\x11p\xab\xaa~>66\xb6\xa6\xaf\xafo\x22\x99\ +s\xda/\x8a%w06K\x9e\xe7\xf5Zk{\xab\ +\xd5\xea\x1a\xe0J6\x9b]\x91\xcb\xe5~\x05v\xc5%\ +<\x16E\x91\x01\x86D\xe4\xfe\xd6\xd6\xd6\x1d\xd4\xad\x19\ +jj\x8c\xe9W\xd5\x01\xa0;\x0c\xc33\xce\xb9\x17\xd3\ +\xe9t\x93\x88\xac\x8b\xa2h%\x80\xb5\xf6\xdbB\xa1p\ +c\x10\x04k:;;\x7f+\x16\x8b\x0f\xaa\xeaNU\ +\xdd\xe1\xfb\xfe\xdad\xbe\x7f\x1d8\xb1*\x0e\x00Y \ +\x02\xce\x00UjJ\xfb\x1d\xb0\x85\xda\x94\xdbm\xad\xdd\ +\x1e\xc7\xf4\x00oLLL\xac^\xb6l\xd9\xd85\x09\ +\xe2\x00\x0f\xd8@M[\x0c\xb5\x919\x87Z\xcf|\x05\ +\x1cT\xd5\x83\x93\x0f\x0a\x90\xcf\xe7oW\xd5\xd5\xc6\x98\ +w\xaf\x95\xfb\xfaY\xff\x00\x8c\xd7\xa1\x90,\x89s\xe2\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\x17\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x94ID\ +ATH\x89\xdd\x94\xcdk\x13A\x18\xc6\x7f\xef&]\ +\x8c\xd0\xa6\xd6\x8f\x8b\x82\xb4\x07)\x14\x83&\xd3Xl\ +*\xc4\x1e\xa4(\xe2_ hE\xc5\x8b\x16\x15DP\ +Q\x0f\xc1\x0f<\x88\x1e\xc4\x83\x82^\xec\x1f\xd0*\xa8\ +\x14\xd4\xd2\xdd\x9d\x16r(\x08\x8a\x05\x0b\x1e\xa4\xb6\xca\ +B6.q\xc7\x83\xadH\xb0\x98\xd8\xe2\xc1\xe72\xf0\ +\xbe\xcf_6\xc6\x14\x80)\xdf\xf7/\ +\xa5R\xa9\xb9\x5c.\xe7\xd7\x05XP.\x97\xf3\x8d1\ +G\x81\x8er\xb9|\x0a`||\xfc\x00\xd0\x1bEQ\ +\x7f>\x9f/W\xef\xa9\xfb\x92;;;\x87E\xe4\x81\ +1\xe6\xbc\xd6:g\x8c\xb9\x0a\xdc\xc8f\xb3\xa3\xbf\xf3\ +\xd7\x0d\x18\x1b\x1bk\xaaT*\x03\xc0g\xe0\xd9\xfcz\ +a1\x7f]\x00\xd7u;,\xcb\xea\xcbf\xb3s@\ +\x01\xb0\x81[J\xa9\xd2\x92\x01\x8e\xe3l\x8a\xc5b[\ +\x9a\x9a\x9a\x86FFFl\xe00?^\xd4\x19\xad\xf5\ +\x9a%\x01\x1c\xc7i\xb5,k[\xa9T\x1ajoo\ +\xf7\x1b\x1b\x1b/\x03\x1bD\xa4\x0fh\x06\xee\xfe5\xa0\ +X,n\xb0,\xabGD\x86{zz\xe6\x5c\xd7\xdd\ +\x0e\x0c\x88\xc8\x89L&\xf3\x04\xb8\x08\xec\xf3\xe0d?^y%\xe2333\x83Q\x14I\x08\ +\xe1u\xe7\xdc\x11\xe0\xf4\xe4\xe4ddfQ\x92$S\ +\xff\xd9 \x8a\xa2\xb7\x80R\xbd^\x7f\x1f8\xaf\xaa\x8f\ +:\xe7V\xd7j\xb5'\x17\xe7\x98YYU\x8f\x8a\xc8\ +F\xef\xfd\x8b\x8b\xb8,'\x9e\xe7\xf9\xda\x10\xc2\xf7@\ +\x05\xd8\xbe\xb0\xb0\xf0k\xb5Z\xfd\x09Xcf_\x99\ +\xd9\xcb!\x84\x87J\xa5R\x0a\xcc\x95J\xa5\xbd\xb5Z\ +\xed\x87\x15w\x10Bx\x07x\xa4H\x0f\x8f\x8d\x8d\xbd\ +\xa6\xaa'\x80\xc3\x22\xb2SDN\xd6\xeb\xf51\xe0\xb1\ +^\xfc\xbe\x1d\xe4y\xfet\x08\xe1[`\xa0\x80nu\ +:\x9dm\x9dN\xe7\xf7(\x8a\xae\x00U\x80\xc1\xc1\xc1\ +\xea\xd0\xd0\xd0\x1f\xbd4\xfa~E!\x84\x0f\x80\x01\x11\ +I\x81/\x81\x8as\xee\xed\xd1\xd1\xd1\xeb\x22\xf2I1\ +\xedF\x14E\xb7\xd24}CU\xd7\xac\xb8\x83<\xcf\ +\x9f\x0d!4\x81\x92\x99\xed\x12\x91\xbf\x80i\xa0\x05l\ +i\xb7\xdb7\xcb\xe5\xf2e\xe0#\xef\xfd{\xaaz\x16\ +x\x01\xf8\xd9{\xbf\xad\xdf\xc2\x01P\xd5OU\xd5T\ +u\xba\x0b\x9b.\xb0\x8f\x01fgg\x133\xfb\xdb\x22\ +\x1b\x8d\xc6\x8e\xee\xbc\xe7\x165\x9b\xcd\xc7\x81=\x00\x22\ +rh\x117\xb3\x0f\x8b\xf0\xd5\xb9\xb9\xb9\xa7*\x95\xca\ +\x13y\x9e\x9f\xeb\xe6\x8e\x8c\x8c4\x975h\xb5Z\x13\ +\xc0j\xa0\x11\xc7\xf1\xdd\x0e\xbc\xf7S\xc07\xc0@\xbb\ +\xdd\x9e\x18\x1e\x1e\x9e\x02\x9eo4\x1a[zn\xc3R\ +\x06\xc0\xfe\xe2y\xac\x1b\x14\x113\xb3\xe3E\xbaWD\ +\x02\xf0Y\xb9\x5c~w)\x83\xfb^r\x96e\x9b\xcd\ +\xec;\xe0\xda\xfc\xfc\xfc\xba\xf1\xf1\xf1Nw]UW\ +\x01\xbf\x00\x0f\x9b\xd9\xa6$I\xe6\x97\x12\xef\xd9A\x08\ +ac\x11^\xb8W\x1c\xee\x5cz\x22\x92\x15\xe9\xa6~\ +\xe2=\x0d\xcc\xec\xb7\x22\xdcnf\xbd\xea\xce\xcc\xb6\x02\ +\x88\xc8\xd5\x7fl\x90$I\x13\xf8\x11X\xaf\xaao\xde\ +[\xcf\xb2\xec \xb0\x01\xb8\x1c\xc7\xf1\xc5\xe5\x0cz\x1e\ +\xb44M_\x11\x91\xc5\x1f\xc9)\xe0\x8c\x99\x99s\xee\ +%3\x9b(\xf0\xdd\xde\xfb/\xfe\x95\x01\x80\xaa\x1e\x04\ +\x8ep\xe7\x16\xed\x1e-\xe0\x80\xf7\xfe\xc4r\xe2}\x0d\ +\x00\xb2,{&\x84\xb0OD\x9e\x13\x91N\x08\xe1k\ +\xe7\xdc\xe7q\x1c_\xea\xc7\xfb\x7f\x8d\xdb\x05\xfd\x1do\ +\xd2\xfe\xa1.\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01o\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xecID\ +ATH\x89\xed\x931N\xc3@\x10E\xffx\xafE\ +\xe7\x82\x9c\x81\x06)\xb2\xb5\xc6\x12\x0de\x94\x9a\x22J\ +E\xe5\x1dMCC\x15\xd1\x22RPD9\x96w\x86\ +&H.\xec\xf5\x06*$\xbfvv\xfe+\xe6/\xb0\ +\xb0\xf0\xbfa\xe6wf^\xa7\xde\x88H\xd9u\xddi\ +j^\xa4\x96\xcd\xec`fAD\xaa\xb1y\x08\xe1&\ +\xc6\xf8\xa1\xaa\xe7\xa9\x0cJ\x09.!w\x00^\x9ds\ +\x0fUU\xc90\x1c\xc0W\x8cq\xdf\xb6\xed\xe6\xd7\x82\ +1Inx\xb6\x00\x00\x98ymfAU;\xe7\x9c\ +'\xa2]]\xd7\xdb\xb9\xbdl\xc1E\xf2bf\x8ff\ +\xf6\xd94\xcd*g'y\xe4!\x22R\x02h\x00\x1c\ +\x89\xa8\x9ck\xd7U\x82\x9f\xb6\xf4}\xbf\xf7\xde\xdf\x02\ +\xb8O\xb5kHN\x8bF\x0f:\xd5\xae\xab\x04sm\ +\xc9\x91\xcc}\xb4\xe7\xa2(vSU\xf4\xde\xbf\x11\x91\ +W\xd5\xa7T\xce\xc2\xc2\xdf\xf8\x06Zp\x89O\x84\xf4\ +\xdb\xcb\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03I\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x09\x1b\x0e\x17\x0d!4\xd6\xec\x00\x00\x02\xd6ID\ +ATH\xc7\xdd\x95\xcfkTW\x14\xc7?\xe79c\ +\x9d\xa4nD\xb0\xe0\xd2\x84\x82C\x92y\xef\xddAt\ +\x91B\x8b\x0aE\xb0\x91\xa4\xae\x8a{\xc5\x1fk\xc1\x9d\ +\xf5/\x10\xff\x03\x15Bm\x1b\x0b\xa2\xb44]\x8c\xa9\ +:\xd7w3S\x1fF\x17\x8a;E\x92\x85?\xded\ +\xf2cN\x17y#&&\x93\x17q\xe5\xd9<\xde\xb9\ +\xef\x9e\xcf;\xdfs\xce\xbd\xf0Y[\x1c\xc7\x1f\xf8\xc6\ +\xc7\xc77\x14#\xb7\x9a3\x8a\x22\x82 I\x9a{\ +\xef\xdf\x9f\x1cV\xd5]\xc0\x220\x05\x5c\x01bk-\ +\xc6\x98u\x01\xb2\xd2q\xe7\x8e\x95\xee\xee/\x0a\xcd\xe6\ +\xc2\x9f\x80\x01\x1a\x80\x97.\xb7\x80n\xe0\xc6\xdc\x1cG\ +\xf2y],\x97\x83\xec\x80(\x8aPe\xab\xaa<\x05\ +6\x01\x05\xe02\xf0/\x88\x07\xfa\x1d0\x04$\xc0\xcb\ +0|\xdc\xeb\x5c/A\x10d\xcf\xc0Zw\x1b\xd8\x0d\ +L\xe7r\x9b\xf7\x94J\xc5ik-\x9e\xe7\x11\x04\x01\ +\xceM\xf6,.j\x05\xd8\x02\xfca\x8c\xffS\xa6\x0c\ +\xe28&I\x9a{E\xe4\x1f@s\xb9\xcd;\xe7\xe7\ +g\xa7\xcb\xe5p\xd9\x86\x99\x99\x84'O\xa6\xfaA,\ +\xb0IDv\x86a\xe9\xf9Z\x80\xb6\xb6\x14\x8bE<\ +\xcf\x1bN5\xbf\x5c*\x15?\x08\x0e\xb0m[\x17\xc6\ +\x04u\xa0\x02\xbcQ\xd5\x91N\x19x\xef\xbf\xa8j\x0f\ +\xe0\x890a\xad\xed\x5c<\xa1\x02(\xd0\x93\x19\x00\xb2\ +\xb0\x04\x92\x5c\x92$\x1d\x01\xaa\xefZ\x5c6\x00\xd0\xa9\ +\xa5V\xd4o\x07\x07\x07\xd7\xcb`\x7f\xba?\xce\x04H\ +'\xf4J\xda\xe7CQ\xe4zgfV\xcf\xc2\xda\xc9\ +\xfd\xaa\xf4\x01]\x22\x5c\xdd\xd0\xa0Y\xeb\xc6\x80o\x80\ +YU=P.\x07\xf5\x95\xc1A\x7fI\xf5\x1f3\xc6\ +?\x96\x19`\xad%\x9f\xff\xd2\x9b\x9fo<\x06\xb6\x03\ +]@E\x84\x8a*9\x11\xda\x7f>\x9bn)\x80\xfc\ +hLi,S\x0d\x8c1\xcc\xcd%-c\xfc\x1eU\ +~M\xd7CUN\x01\xc7U\xf9\x1a\xc8\x03\xd7\xd3A\ +k\x80\x8e\xde\xbb\x17\x0de\x96\x08`b\x22f\xdf\xbe\ +\x22\xd5\xaa\xfbJ\x84\x91\xa5VT\x0f\xe4\x81\x08W\xc3\ +\xd0\x7fU\xadF\x87D\xe4Z:7\x05\xe0\xa81\xfe\ +\xefk\x02j\xb5\x1a\x03\x03\x03\xeb\x9e\x8eQT#\x08\ +\x96\xbe\xabV\xdd\xf7\x22\xfc\xd6\x86\x88p4\x0c\x97C\ +\x96e\xe0\x5c\xfd,\xf0s\x87\xf8\xe7|\xbf\xff\xfc\xfb\ +\x8ej\xd5\x1d\x14\xe1z\x0a\xe9\x02~0\xc6\xbf\xb1j\ +\x0d|\xbf\xff\x82\x88\x5c\x5cc\xb4.\xad\x0c\x0eP.\ +\xfb\xb7\x80\xc3\xa9L\x09p\xba\xd3QA\xa9\xd4w\x12\ +\xb8\xb9\x22\xce_\xbe?pbtttU\xb41\xfe\ +\xcdVK\x0f\x80\xfc\x0d\x9cy\xfbV\xd7\xd6\xe0\xee\xdd\ +\x87m\xb9\xfes\xae\xder\xae\xfe\xb0]\xa3,\xf6\xe8\ +\xd1\xb3\xf5\xbb\xc8\xb9\x07\xec\xd8\xf1\xda{\xf1\xa2\xdb5\ +\x1a\xcd\xb0P\xd8\xb2\xe0\xfb}\x9f\xf6\xc2w\xae\xb6\xec\ +\xf9\xb1\xf6?\xfe\x8b\x1c\x87z\x85%\x07\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x025\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xb2ID\ +ATH\x89\xed\xd4\xb1k\x14A\x14\xc7\xf1\xef\xcb\xba\ +\x82\xda\xf9'\x9c\x9dB\x8eeg\xd5\xc6\xc0ZJ\x22\ +\x18\xb0\xb2H\xe1\x1f bcg\xec\xd4F\xceJA\ +!\x85(\x9c\x85\x85\xda\x08\xe6R\x1d\xc8\xcd\x1c\x1c6\ +\x22\x08\x92\xce\xfe\xd4\xe2\xc2\xfdl<\x08\x97\xdb\xdd\xd1\ +\xc6&\xaf\x9c}\xf3>\x8f7\xb3\x03\x87\xf1\xbf\xc3\xe6\ +\x17\xbc\xf7\x02\xee;\xe7n\xc7\x16\x91\xb44\x1c\x0e\xb3\ +\xe9t\xbaffg\x9csWg\xdf\x96\x16\xaaf\xe7\ +\x07\x83\xc1fS\xe1^\xafw\xc4{\xdf\x09!|\x97\ +\xe4\xcd\xec\x8e\xa4/\xfbs\x16\x02\x92.\x99\xd9\x8a\xf7\ +\xfe^\x1dP\x96\xe5\x9e\xa4-\xe0\xe4l-I\x92\xd7\ +\x8d\x80s\xee'\xb0\x0a\x9c\xadC\xfa\xfd\xfe13\xeb\ +\xfc\xa9\xf3\x0b\xd8\xcd\xb2,4\x021H\xb7\xdbM\xd2\ +4}\x0e\x5c\x90\xf4&I\x92\xd3\xc0c3S\x14P\ +\x87H\xb2V\xab\xf5\xcc\xcc\xd6\x81\xad\xf1x\xbc\x9ee\ +\xd9\xb7<\xcf\x0f4R\x0bT!!\x84\x07\xc0\x06\xf0\ +(\xcf\xf3\xebeY\xee\x01\xccw\x1f\x05\xcc#!\x84\ +\x1d\xe0\x96\xa4\xbb\xce\xb9\x1bf6\xad\xdb\x1b\x05\xecC\ +^HZ\x01\xde\x17E\xb1\x19\xb3/\x1a\x08!\x5c\x01\ +:\x92\xae\x01G\x9b\xae\xf0_\x01\xde\xfbR\xd2\x133\ +[+\x8a\xe2%\x11W8\x1a\x08!,\x03O\xcd\xec\ +r\x9e\xe7\xdb\x10\xff\x9f@\xc5[$\xe9\x83\x99=\x04\ +>\x03\xaf\x80\x0d\xe7\xdc\xa7\x05\xb9\xc7\x81w\xc0\xc7\xaa\ +\xb7\xab\xea\xb1\x9b\xc5W\xe0\xa2sn\xb7\xaa\xc3\xd1h\ +tb2\x99\xbc\xadB\x9aFt\xca\xcc\x96\xeb\x12\xda\ +\xed\xf6\x8f4MW\x81s\x8b\xc6\xd5x\x06\x92n6\ +\xe5\xd4!M#\xfa\xa7p\xce\x1d\xa8{\x18\x95\xf1\x1b\ +s*\xc5]\x8f#un\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x03\x88\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x05ID\ +ATH\x89\xd5\x95Oh\x5cU\x14\xc6\x7f\xe7\xcd$\ +\x88\x8c\x93l\x04\xb5V7F\x11\xc1\xc8\xdc7\x1bE\ +\xe4\xa1E\xb0\xd8\x085\x8a\xddH%\x88(\x8a\x8bB\ +\xc0\xe8&\x22\x08\xc1\x85ZA\x08J\x15\xa1j\xb1\x8e\ +\xb8\x10\xe9\xe2\x81.\xca\xcc\xbb7\x14!\xb8K\xfd\x17\ +u\xa1\x0bgB\x1ba\x9c\xcfE\xdf\x84\xc9\x9b\xc9X\ +\x97=\x9bw9\x7f\xbe\xef~\xf7\xdd{\x0e\x5c\xe9f\ +\xe3\x82\xde\xfb\x09Is\xc0\x9c\x99\xc5\xc0\x8dy\xcd&\ +pNRczz\xfa\xf4\xcc\xcc\xcc\xdf\xff\x9b \xcb\ +\xb2Cf\xb6\x02\xdc:\xe0\xfe\x07\x10P\x1e\xf0\xfdh\ +f\x8b\xce\xb9OF\xe1DE\x87$\xcb\xb2\xec53\ +k\xe4\xe0MI\x0b\xddnw\xbfsn\xd297\x19\ +E\xd1>IOJ\xfa\x06\xb8Y\xd2\xc7\xde\xfb\xb7\xd2\ +4-\x17\xf1\x86\x14x\xef_\x05^\x06.Hz&\ +\x8e\xe3\x8f\xccLc\x94\x1e6\xb3\xf7\x81\xaa\x99\x1dw\ +\xce=\xbf'\x81\xf7\xfe \xf0%\xb0\x1dE\xd1\xfd\xb5\ +Z\xed\xec^\xc0\x83\x16B\xb8S\xd2\xb7@U\xd2\x91\ +z\xbd~\xb2\x1f\xdb9\xa2\x5c\xde\x0a`f\xf6\xec\xe5\ +\x82\x038\xe7\xbe3\xb3\xa3\x5c*~=M\xd3\xab\xfa\ +\xb1\x9d3\xabT*\x0f\x01\xb7K\xf2\xce\xb9\x0f\x0a\xca\ +n\x02>5\xb3;$]\x94\xb4Z\xaf\xd7\x97\x0a$\ +\xa7\xbd\xf7)\x90T*\x95\xc7\x80\x0fw)\x88\xa2h\ +.\xdf\xc1{#\xce\xfc\xac\x99\xdd\x02\x9c\x90\xf4\x83\x99\ +\xbd\x94e\xd9\xe1\xa2\x12I\xab\xf9rnH\x81$\x97\ +/\xcf\x8c(\xbc\xb7\xd3\xe9\xfc\x9a$\xc9\xb6\xa4(\x84\ +\xd0-\x95J\x0f\x03\x9f\x0d\xe6\x99\xd9\x99\xfc\x1b\x0f\x11\ +\x00\xd7\x03\x9a\x9a\x9a\xfa\xa5HP\xaf\xd77\xfa\xeb\x10\ +\xc2\x12`\x92\xbe(\xe6\xc5q\xfc\x87\xf7\xfe\x02p\x9d\ +\xa4\xc8\xcczC\xef`\x9c\x85\x10^\x04\x96\x81\x93\xce\ +\xb9\xcf/\xa7f\x90\xe07\xc0\xda\xed\xf6\xfeQ\x89\xeb\ +\xeb\xeb\x93\x92V\x804\x8e\xe3#\xa3r\xd6\xd6\xd6\xae\ +\x05\xae\x06~7\xb3\xde.\x023\x0b\x00\x92\x0e\x8c*\ +\xeev\xbb\xfb\x80\xb2\x99\x1d\xdfk\xb7\xbd^\xef@\x8e\ +\xe1\xfb\xbe\xc1\x7f\xd0\x00\x9e\x02\x16$\xbd[\xbcI\xb3\ +\xb3\xb3\xe7\xf9\x8f\xe6hfOK\xeac\xb1KA\xbb\ +\xdd\xfe\x0a\xf8\x1e\xa8y\xef\x8f\x16\x8bC\x08\x0ffY\ +\xd6m6\x9bO\x8c\x02\xcf\xb2\xecQI\xf7\x01?m\ +mm\x9d\x1a\x22H\x92\xa4+\xe9\x18 3{\xa7\xd5\ +j\xdd=\x08P.\x97\xff2\xb3\xcdR\xa9\xf4g\x11\ +\xbc\xd5j\xdd\x95\xf7#$-&I\xb2\xbd\xa3\xaa\x98\ +\xec\xbd_\x06^\x01.\x9a\xd9s\xb5Z\xed\xc4\xb8f\ +\x17Bx<\x7f`\xd7\x00o\xc7q\xfc\xc2`|\x88\ +@\x92\x85\x10\x96\x81%.\xf5\xa5\x0cX\x95\xf4\xf5\xc6\ +\xc6\xc6\xe6\xfc\xfc\xbc\x9a\xcd\xe6\x0d\x13\x13\x13\x0fHZ\ +\x00\xee\xc9K\xdf\xect:\xc7\x92$\xe9\x8e%\x18P\ +r\x10x\x03\xb8m\xc0=j\xe0\x9c\x07\x16\xe38>\ +\xc5\x08\x1b{+\xd24-W\xab\xd5C\xc0#\x92\xfa\ +#3\x02~6\xb3s@\xa3Z\xad6\xc6\x8d\xcc+\ +\xdf\xfe\x05z\xf4J\x97;8\xb1_\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x02\x9d\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x1aID\ +ATH\x89\xed\x94\xbdkSQ\x18\xc6\x7f\xcfM\x1a\ +*\xd2k\x11\x07\xa1\x1d\xd4AT\xb0\xca\xcd\x81\x06:\ +\x05\xc1\xc1\x0f\xc4\xc1\xc5\xc9E\x85\xfe\x03\xe2\xe4\xe0\xe0\ +\xe4(\x1dD\x1c\xc4A\xa8\x0e\x22X\x07)(\x8d\xa1\ +\xdcsQK'\xb7\xdaE\x8ah\x13\x90b\x93\xf3:\ +\x98H\x1a\x9b\xb6\xba)\xfdM\xf7\x9c\xf3\xbc\x1f\xcf{\ +9\x07\xb6\xf9\xef\xd1z\x9bi\x9a.\x03\x0b\x80\x97t\ +\xafX,\xbe\xee\xd6\xcc\xce\xce\x1e\x8f\xa2\xe820\x06\ +\xecs\xce\x0d\xae\x97+\xea\x5c\xcc\xcf\xcf\x17Z\x9f\xb1\ +\xa4\xdb\x92V\xccl\xca{?Y\xadVc\x80\xe9\xe9\ +\xe9\xfe4M'\xa2(\xf2\x92\x0eJz\x01\xc4]\xf1\ +k\x1d\x98\x99\xbc\xf7_\xdbB\x00\xe7\x9c\x00\xaa\xd5\xea\ +p>\x9f\x9f\x00v\xd6\xeb\xf5\x93q\x1c?\x06\xf6H\ +\x1aO\x92\xe4]\xcbq\xe8\x98F\xcd9\xb7k=\x07\ +q\xb1X\xcc\x15\x0a\x85\xdd\x9d\x1d\x94J\xa5\xc5z\xbd\ +~\x1eX\x1a\x18\x18\x983\xb3|\xadV;\xd1N\xde\ +\xd9P\xab\xa9\xb8s\x7f\xcd\x88$\x85\x91\x91\x91/\xdd\ +6\xcb\xe5r\x03\xb8\x02\xec\x8f\xa2\xe8R\xb9\x5c^\xe9\ +\xd6\xf4\x22\xda\x5c\xf2\xab\xc3e\xe0{\x92$K[\x8d\ +\xf9\xa3\x02\x7f\xcbv\x81M\xc9\xf7:\xf0\xde\xdf0\xb3\ +'\xce\xb9\xb9\x0d4%3;G\x8f\x17\x01z8\x90\ +t6\x840\x08\xcc\xa4i:\x95e\xd9\x91\xce\xf3,\ +\xcb\x9c\xf7~\xc6\xcc\x9eJ\x8a\xcc\xect\xaf\x02\x9d7\ +9H\xbajf\x01X\xe8\xeb\xeb{\xdbl6-\x84\ +\xf0\x10\x183\xb3\x8b\x92\x1eH\x1a7\xb3{\x92\xeeH\ +\xba\xd5l6\x8fI:\x0c\x0c\xb5r^k\xbf\x02\xd0\ +\x1a\x91$\xf3\xdeW\x80\x0b@?ptuu5\x06\ +\xde\x03\x93\xc0\x90\xa4G@\xde\xcc\xee\x9b\xd9s`\xd8\ +\xcc\x16%\x15\x80\x8f\xc0\x07I!\x84\xf0\xea7\x07\xdd\ +\xb4\x1c\x1d\x00N\x01\xe3\xc0\xa1.I\x90\xf4\x0c\xb8\xdb\ +h4\xde\x8c\x8e\x8e~\xdepD\x1baf\xca\xb2\xec\ +\xa6\x99]\xe7\xe7?[\x89\xa2\xe8L\x92$/7\x8b\ +\xddR\x816\x95JeG.\x97\xdb\x9b\xcb\xe5>9\ +\xe7\xbem5\xee\xdf\xe7\x079Y\xd3f-8\xab\x05\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02I\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xc6ID\ +ATH\x89\xed\x941h\x13q\x18\xc5\xdf\xd7zi\ +\xd2\x90\x0c\xbaX\x8a\x96$d:\x9a\x03\xf9\x1f9\xb2\ +T(Tqr/]\xd5\xd9Et\xd0\xea$\xe2\xe8\ +\x22\x14u(\x94\x1eupu\xc9P\xb7\xfc\x97\xa3R\ +\x90\x80R\x9c\x14l\x09\xb4\x14/\x97<\x97\xab\x84C\ +\xef\x1f\x92B\x97\xbe\xe5\xf8\xde\xbd\xef\xfd\x86\x0f\xfe\xc0\ +\xb9\x0c\x92aB$'\xb4\xd6\xcb\x22\xe2\x89H;\x9b\ +\xcd\xae\xd9\xb6}x*\x00\xdf\xf7'\xcb\xe5\xf2\x16\x80\ +\xdb\x03\xf6N&\x93Y\xa8\xd5j\x07\xa6\xfd\x09S\xa0\ +R\xa9\xdcO\x94\x03\xc0|\x18\x86\xab\xa6]# \x08\ +\x82<\xc9\x07\xf1\xf8\xa4\xd7\xeb\x95\x01l\xc4\xf3]\xad\ +\xf5\xccX\x80n\xb7{\x0b\xc0%\x92\xebJ\xa9g\xf5\ +z\xfd[.\x97\xbb\x03\xe0\x08\xc0\x94\x88\xdc\x18\x0b \ +\x22\x8b\xf1\xf7\xc5\x89g\xdb\xf6\xa1\x88\xec\x02\x00\xc9\xeb\ +&@\xea\x91\xb5\xd6\x9f\x00\xcc)\xa5\xae\xc4\xf3S\x00\ +\x8f\x939\x92\xf3\xae\xeb~\xfeW\x87\xe9\xc8\x97I\xfe\ +]\x0c\xc3\xf09\x80\xbdDf\xfb\x7f\xe5\xc3\x00\xa6E\ +d\xffdh4\x1a\xc7$\x1f\x0e\x06D\xe4uZ\x81\ +\x09p\x0c\xa03h(\xa56\x01\xec\xc6\xe3\xf7b\xb1\ +\xb852@D~\x91\xbc\x98\xf0\xfa\x22\xf2\x12\x00H\ +\xaeV\xab\xd5\xdfi\x1d\x17\xd2~\xf6\xfb\xfd/\x00\xae\ +&}\x92\x9b\x00\x5c\xd7u\xdf\xa4\xed\x1b\xa5\xb5\xbe\xa7\ +\xb5>\xf0}\x7fr\xd4\x0e\xd3\x0d>\x00\x98.\x95J\ +K\xa3\x02\x8c\x8f]\xab\xd5z%\x22\x0b\x96ey\x8e\ +\xe3\x1c5\x9b\xcdl\xa1P\xf8\x0a\xe0\x9dR\xea\xd1\xd8\ +\x80 \x08\xf2Q\x14}$\x99\x07\xf0^Dn\x92\x9c\ +\x8d\xa2\xa8\xeey\xde\x8f\xb1\x01\x00\xd0n\xb7\xa7:\x9d\ +\xce\x0a\x80k\x00\xf6,\xcbz\xeb8\xce\xcfav\xcf\ +u\xf6\xfa\x03y\x90\x97\x93oVjW\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02\xb2\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02/ID\ +ATH\x89\xe5\x94=h\x13a\x18\xc7\x7fO\xae\x89\ +(i\xce\x0f:\x88c9PQ\x0a\xbdT0\xf8A\ +\x05\x8b\x83U\xf1\x0b\x04\x87HqRD\x11t\xa88\ +ZD\xdc*::\xb8\xd8EEQ\x9c\xba\xd5\x84\xbb\ +\xf7(\x85\x0e\xae\x82tP\x84k@\x13<\xeeqI\ +j\x92&m\xdat\x11\xff\xcb\xbd\xef\xf3\xf5\xbb\xe7\xb9\ +{_\xf8\xd7%\x9d\x06NOO\xf7\xf4\xf6\xf6N\x00\ +\xe7\xabyol\xdb\xbe\xe38Ne\xa5\xbcD\xa7\x80\ +t:}\x0f\xd8V*\x95\x9c(\x8a\x0e\x01\xfb\xc30\ +|\xb4Z^\xc7\x00\x119\x07\xcc\x0d\x0f\x0fG\x96e\ +\x1d\x06.\x02\xa3\x1b\x06\x00R\xc0\x821&\x9fH$\ +b\xd7u\x7f\x00\xe5\xae\x00\x9e\xe7\x8d\xa9j\x02@D\ +^\x037\x80\xadq\x1c\xf7\x19c\x9e\x01\xef\xd7\x0dP\ +\xd5\x84\x88\xdc\x0f\x82\xe08\xc0\xe2\xe2\xe2\xb8\xaa~R\ +\xd5k\x22r\x1d\x08K\xa5\xd2\xf8j\x80\xb6\x7f\x91\xef\ +\xfb#\xc0G\xe0U6\x9b=\xbbZ\xa1vZiD\ +\xf9\xeastvvvW\xbdc~~>][\x1b\ +c\xf2333\xdb\xd7\x04\xf0}\xdf\x06\xceT\xb7=\ +Q\x14\x8d\xd5\xf9\x92\xe5r\xf9\x9d1&\x0fP\xa9T\ +^\xa6R\xa9\xa7\x9e\xe7\xed[K\x07\x97\x80\xcdu\xfb\ +\xabSSSVu\xfdDU\x8f\xaa\xea\xa4\xef\xfb\xbb\ +s\xb9\xdc/\xcb\xb2\xee\x8a\xc8[\xcf\xf3N\x07Ap\ +\xb0\xbeP\xcbo\xe0\xfb~\x118\xd0\x10(r*\x8e\ +\xe3=\x22\xf2\xb0\xce\x1c\xd8\xb6\x9ds\x1c\xa7b\x8c9\ +\xa6\xaa\x1f\x80HU\x07\x87\x86\x86>\xb7\xec \x08\x82\ +\xbd\xcd\xc5\x01T\xf5\xb1\x88L4\x99\x07\xc30|P\ +]\x7f\x07~\x02[D\xe4B-`\x19 \x8e\xe3+\ +\xad\xba\x02\x9cV\xf1\xc0-c\xccI\xd7u\xe7\x80\x01\ +\xe0&\xd0_s6\x8c\xa8z\xa1}\x01v\xb6\x81\xb4\ +\xd37` \x9b\xcd.4;\x1a\xde(\x93\xc9\x9cX\ +Gq\x80>\xe0y\xed\xd4\xb7\x05\xac0\x9eN4\x12\ +\x04\xc1\xedf\xe3\xd2\x88\x8a\xc5\xe2\x0e\xcb\xb2\xbe\x02\x9b\ +\xba\x80\xfc\x16\x91#\xae\xeb\x16j\x86\xa5\x0e,\xcb\xba\ +\xdceq\x80\xa4\xaa\xbe(\x14\x0a\x99e\x00\xfe^\x0d\ +\xdd\xaa?\x99LNnP\xad\xffA\x7f\x00\xd3\x94\xc3\ +\x0cn\xa2\xedk\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x02'\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xa4ID\ +ATH\x89\xed\x94\xb1k\x14A\x14\x87\xbf\xb7\x9b\x0b\ +\x08r\xd7(\x18\x84 \xc8Ab\xb7\x07Z\xd8\xd8\xa8\ +\xa4H\xc4FPB\xe0$\x88\xb5X\xd9\xa4\x12\xc5B\ +\xb1\x88\xadI\xaa\xc0\x15V\xe9\xaf=o\xdf\x0c\xd7\x9c\ +MJ\xff\x82+\x0c\x178\xf7\xa5\x99\xc0&\xd9\xcb\xad\ +\x1c\xa9\xe2\xaf\x99yo~\xf3\xbey\x033\xf0_\x97\ +[i\x9a\xae\x9bY4M\x8d\xb1\x9b\xcd,\x12\x91\x0d\ +\xef\xfd\xa3\x0b\x018\xe7\x1e\x02\xf3f\xf6\xfaB\x00@\ +3\x8c+\xbd^\xeff~\xa1\xdf\xef_\x9d\x0a\xa0\xaa\ +5\xe0i\x08gF\xa3\xd1zn\xad2\x1c\x0e\xf7\x9c\ +s\xcd\xa2\xbd\xa5\x00\xc0\x0b\xe0J.~\xd5j\xb5\xe2\ +0\xffff\x0f\xcclSU\x17&\x01\xa4(\xa9\xaa\ +?\x81{'\x8c\x22O\xb2,[\x14\x91O\xb9\xb4\xaf\ +\xd5j\xf7\xeb\xf5\xfaa\xe9\x0e\xbc\xf7wr\xc5\x7f\x1f\ +\xe7\xcd\xec\xb3\x88|\x03H\xd3t\x0d\ +8(\x01\xc0\xcc\xdew\xbb\xdd\xbb\xe3:X\x05f\x83\ +q\x0dx\x17`\x1bf\xf6\xbc\x0c\x00\x98\x8d\xa2h\xb7\ +\xd3\xe9T\x8b\x00\xcdS\xe6[a\xbcQ\xb2\xf8\xb1n\ +W*\x95\xcdRNU\xb5\x7f,~FS\xfd\xf5\x97\ +CG|\x83\x8f\x7f\xa3j\xd4}\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01\xaa\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +dIDATH\x0d\xedS\xb1j\xc30\x10\x8d\xe3\ +v\xf0\x92\xa1\x19\xba\xe4\x0f\x0c\x05\x83!S\xc6,\xed\ +\xda\x0f\xe8P\xb2u\xebZ\x9a\x7f\xc8\xde\xbfH\x96\x8c\ +\x99\x026\x86\x82\xf7\x0e]\xeb\xa1\x8b\x0b\xc1\xb8\xef\x8c\ +U\xa4\xcb\x15K\x09d\x8a@H\xef\xa4{\xef\xeet\ +\xea\xf5\xce\xa3\xa3\x02\x9e~\x9e$\xc9\x12\xf8V\xb79\ +\xeeWq\x1c\xdf\xe9>}\x1d`\x7f\x0c9Q\xed\xf9\ +_0\x81\x06\x22\x0a#3\xe9\x0e\xb7!\xfb\x9a\xdb\x08\ +\xf3\x0c\xa4;G\xd9\xac\x04\x10\xddc\x9a\xa67\x87(\ +Y\x09x\x9e7\xaa\xebz\x93e\xd9\xd4U\xc4J\xa0\ +%\x1dTU\xb5D&\x0f.\x22.\x02\xc4{\x89\xf9\ +\x86\x92\x8d\xb9\x085\x86\xd4\x1cb\x17qg\x0d\xef\xb0\ +\x9f\x81h\x0b\x91/\xec\xaf0\x17(a\x81\x12\xd2\xfe\ +\x09\xb3\xc0\xf9\x10k3\x5c\x04\xbe}\xdf\xbf\x8f\xa2h\ +\xdd\xfa\x12\xa14\x0c\xbb\x95\x00\xa2\xfbD\x94\x13\x90\xbf\ +\xeb\x8cA\x10\x0c\xc30,\x94-\xcf\xf3yY\x96\x94\ +\x99<\xe8\xb3\xd0\x94OM\xeb\x7f\xf7\xb8\xdd\xf5\x91M\ +\x15\x0b$\x96\x88G\xc1y\xa4n\xe1w\x14\xe6\x19\xac\ +\xd4\xc1\xc9W|\xb09M%LY\xe2Q\x8d\x8e!\ +\xcc\xb3\x17K\xa4H\xbaV\xea\x18\x10\xfe\xa0\xc3\x9e\xd1\ +i/\xc0\xd7\xdc\xa7S@E\x04\x82\xc6\x17\xf8\xb5}\ +\x03jO\xca`\x87\xb3\x0f\x88\x94\xed\x9d\xbf\xb6\xe5b\ +g,V\xe0\x17\x18\xd9\x84\xd4m\x87\xa8\x88\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01\xbb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x018ID\ +ATH\x89\xed\x91\xb1N\x02A\x18\x84g\xe0bB\ +(\xb43\xea#\xd0\xc1\x9a\xd8\xda\xd3\xf86\x12\xa5\xd0\ +\xc4\xe0\xc3h|\x03{\x92\xff\xb0\xe2\x11D\xac\xb4!\ +Ds{cs\x05\x98\xdd[\xb4$L;\xb3\xf3\xfd\ +\xff\xfe\xc0N[/\xc6\x8c<\xcf/$\xdd\x01\xd8w\ +\xce\x9d\x842f\xf6\x06\xe0\x83\xe4U\xaf\xd7{\x0ae\ +\x1a1\x80\xa4{I\x83X9\x008\xe7\x8eH^K\ +\x1a\xc52Q\x00\x80c\x92/5>\x00\x80d\x0e \ +:D\x1d\xa0Q\x96\xa5R\x80\xa2(\xca\xba\x9e\xa0!\ +\xa9\x01 K\x95\xaf(\x93\x14\xbcg\x10`f}\x00\ +\xbe\xddn\xbf\xa7\x9a\xab\x8c\x9fL&\xfd\x8d\x00f6\ +#\xf9\x00`\xd8\xe9t\xbeS\x80*3\x94\xf4hf\ +\xb3M6\xf8\x02\xe0I\xd6\xddgMU\xd6Wo\xd7\ +\xbd\xd0\x83<\xcf\xcf$=\xb7Z\xad\x83\xd4\x16\xd3\xe9\ +to\xb9\x5c~\x028w\xce\x8d\x7f\xfb\xc1)\xbb\xdd\ +\xee\x18@s\xb1X\x1c\xa6\xa6\xaf2\xcdPy\x14@\ +R\x00\x8aT\xf9\x8a\xa2\xd9\xba\x7f.\xb3,K\xde\xa1\ +\xca\x94\xff\x01\xcc\xbc\xf7.\x05\xf0\xde\x9f\x02x\xfd3\ +\x80\xe4%\xc9[3\x9b\xc72f6'yCr\x90\ +\x1ad\xa7-\xd6\x0f\xbcHt\x19\xd2\x05J'\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x83\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x00ID\ +ATH\x89\xe5\x95\xb1\x8b\x13A\x14\xc6\xbf\xf7\x0eW\ +\x0b\xb1\x10\xf4\x10\xc4\x22h\x10\x11\x91%\x93b1\x8d\ +\x85V\x82\xa4\x08\x16*XZ\x08\xa2\x85X(\x04\xd4\ +J\x04\x0b\xf1\x0a9\x90 x\xe3?`!\xd8\x984\ +;\x93\x80g\x8a\x13\x92`s\xd8\xa8X%\xacf\x9e\ +M\x84ews\x99\xbbR\xbfn\x7f\xf3\xcd|\xef=\ +\x86Y\xe0\xbfS\x1c\xc7WE\x84}\xfd\xdeF\xadu\ +`\x8c\xb9\xce\xcc\xcd^\xafwMk\xbd\xe4\xb3\x8f\x16\ +\x19\xba\xdd\xee\x89\xe9t\xfa\x8a\x88N\xcd\x0ar\x22\xe2\ +\x88\xe8'\x805f~\x18\x86\xe1\xe6\x8e:\x88\xe3\xf8\ +\xa6s\xee\x13\x11\x9d\x9ey\x85\x99\xcf\x8cF\xa3=\x00\ +.\x12\xd1\xb2s\xaeo\xad=\xbf\xed\x0e\xac\xb5\x97E\ +\xa4\x95f\x22\xb2\xa6\x94\xba\x94)\xe2\x0a\x11=w\xce\ +\x9d\xabV\xab\x1d\xaf\x0e\xb4\xd6\x01\x80\x1793\xf3\xb3\ +,SJ\xb5\x00\xdcg\xe6\x97\xc6\x98]^\x01\xa5R\ +\xa9)\x22\xbb3\xf8\xdb`0\xc8U\x08\x00\xc3\xe1\xf0\ +)\x00GD\x0d\xaf\x00\x00\xf5, \xa2\x8dF\xa31\ +-2\xcf\xf8k\xe7\xdc\x05\xdf\x80\xe5,p\xce}\x9d\ +\xe3\x05\x00\x88\xc8:\x11\x1d\xf5\x0d\xc8qf\xde\xb7U\ +\x00\x80_\x00\x02\xdf\x80\xef\x05\x15\x1e\xde\xeatf.\ +\x03\xf8\xe2\x15 \x22o\x0b\xf01c\xcc\xa1y\x01\x22\ +R\x07\xf0\xce+`2\x99\xdc\x05\xf0;\x83\x97\x00\xe4\ +n\x09\x00Xk\xeb\x00\x8e'I\xd2\xca\xae\x15\x06\xd4\ +j\xb5\x1f\xcc\xdc,X\xba\xd5\xef\xf7\xf7\xa6A\x1c\xc7\ +U\x11Y\x15\x91\xdbQ\x14\xe5F;\xf7\xa9\x08\xc3\xf0\ +\x01\x80\x95\x0c>2\x1e\x8f\x1f\x01@\xa7\xd3\xd9o\x8c\ +\xb9GD\xef\x01\x88\x88M\xf2\ +t\x96e\x97\xbb\xdd\xee\xb7\x22\xb5GN0\xa3\xddn\ +\xef\x02\xb8Fr\x07\xc0\x95\xa2\xe2\xff\x07\x85\xde\x00\x00\ +\x8c1g\x00\xac\x01x\xa8\xb5\xfe\x5c\xb4\xae\xd0\x1b\x04\ +AP\x01\xb0%\x22\xe7\x01l\x0f\x06\x83\xb3\xff\xcc \ +\x0cC;\xcb\xb2u\x00\x9f:\x9d\xceE\x00[\xb6m\ +\xbf\xef\xf7\xfb\xb5\xbf60\xc6\x94\x92$Y\xb7,k\ +7\x8e\xe3\xbb\x222UJ\xad\x02\xf8\xe88\xce\xe6\xbc\ +5R\xc8\xc0\xf3\xbc%\x00\xaf-\xcb\x22\xc9\xdb\xae\xeb\ +\xee\x01\xbf\xd6\x88Rj\x85\xe4N\xb5Z\xf5\x0e\xae\x91\ +B\x06$\xa5\xd9l\xbe\x10\x91sQ\x14\xdd\xd4ZO\ +\xf6\xe7E\x84\xa3\xd1\xe8\x9e\x88\xfc\x00\xf0\x8a\xe4\xdcF\ +\x8f}]\x1f\xfb\x87s\xc2B~\x02\xc8j\xd1\xcbi\ +\xb1fC\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x020\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xadID\ +ATH\x89\xbd\x95=\x8b\xd4P\x14\x86\x9f3\x19\x96\ +\x1d0\xa2\xa0\x7f\xc0v:sg\x92\xb1\x90EV\xd0\ +\x1f \xd8\x88\xdb\xf8\x03\x14\x0b\x0bK\xb1\xb1\x15\x0b?\ +\x1a\xf1\x03\xb6\xb1\xb4\x0c\xb2,\x0c\xe6f\xc0\x81\xd4*\ +\x08Zh\xe34!$\xf7\xd8\xd8\xb8Lf21\xec\ +[\x9f\xf3<\xf7\x9e\xc3\xe5\xc2q\xc7Z\xab]\xf2\xfa\ +\x1d\x09\x0f\x8c1\x17[\x09\x00\x8c1R#\xbf\x06\xec\ +\x03/\xebz{M\x04\xcb\x92$\xc99\xe0\x19\xb0o\ +\x8cy\xdeZ\xb0\xec\xf4q\x1c\xf7\x81W\xc0\xcf\xb2,\ +o\xad\xeao4\xa2\xa3\xf1}\xff\x01p\x1e\xb8\x10E\ +\xd1\xefN\x05I\x92\xec\x00w\x81\xdb\xc6\x98\xd9\xba\xfa\ +\x8dv0\x9b\xcd\xce\x8a\xc8\x1b\xe0}\x10\x04\x8f\x9b\xf4\ +4\x16\xa8\xaaTU\xf5\x02(\xab\xaa\xda\x13\x91F\xef\ +\xa5\xf1\x88\xd24\xbd#\x22WUu'\x0c\xc3_M\ +\xfb\x1a\xdd M\xd3\x00x\x08\xdc\x1f\x8dF\x87M\xe1\ +\x8d\x04Y\x96\x9dP\xd5\xd7@\x1c\x04\xc1\xa3e5\xd6\ +ZU\xd5\xa5\x8fq\xad \xcf\xf3'\xc0)\xe7\xdc\x9e\ +\x88\xb8u\xf5G\xb3v\x07\xaaz\x03\xa0\xd7\xeb}\xb7\ +\xd6n\xca_-\xb0\xd6\x9eq\xce]\x07>\x8c\xc7\xe3\ +\x1f\x1b\xd3Y1\xa2\xf9|~ZD.9\xe7\x0e\xdb\ +\xc2k\x05\xd3\xe9\xf4dQ\x14\xbbEQ|\x8c\xa2\xe8\ +[[x\xad\xc0\xf3\xbc\xcb\xaa\x9aN&\x93/\xff\x03\ +\x07\x10\x00k\xedM\x00\x11\xd9R\xd5\xa7\xc0=\xa0\xd5\ +X\x06\x83\xc1\xdb\xe1pX\xfc#\x00\x88\xe3x\xdb\xf7\ +\xfd+\xc0\xbb\xba\x0f\xa6M\xfa\x00Y\x96m\xe5y\xbe\ +[\x96\xe5g\xcf\xf3\xbab\x03\x7fw\xb0X,\xb6U\ +\xf5k\x18\x86\x9f:\xa5\x1fG\xfe\x00\x05\xd3\x9c\xfd\xde\ +\xd7I\xa3\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xa0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x1dID\ +ATH\x89\xb5\x95\xcfj\x13Q\x14\xc6\x7f\xe7\xb6\x09\ +\xc9\x22\x82\xe0\xd2?\xc4\xb4\x88\x04\xa3$W\x08y\x0d\ +\xc5\x07(v\xa3\x14wZ\x17\x22BA\xa8J\xf1\xcf\ +N\x9f \xd8g\xc8V\xe2Mv\x11\xa45BqU\ +\xa4*\x16\x192f\x8e\x9b\x992\x9d$\xe3X\xec\xb7\ +:\xe7\xbb\xe7\x9c\xef\x9c{\x879p\xcc\x90\x7f\x09\xee\ +\xf7\xfb\xd7\xea\xf5\xfaf\xe4;\xe74\x19c\xad=T\ +\xd3\x1c\xbd\xb7l\x90\xa8\xb3\xe4\x81\xaa\xde\x14\x917\x09\ +\xae)\x22\xefb\xfe\xdb\x89\x82\x22\xd7#\xbb^\xafo\ +\xce\xbc\x22\xe7\xdc\x07\xe0\xb2\xb5\xd6\x8f\xb8\xffvE\xed\ +v{\x0e\xa8\x00gg5\x90\x15S\x05\xca\xe5\xf29\ + \xaf\xaa\xe7\xd3\x92\xad\xb52\x1c\x0e\xe7E\xe4\xfdx\ +<>\x95\xec~\xa6\x801f14S\x05\x00*\x95\ +\xca\x92\xaa^5\xc6\xdc\x9bZkF\xde\x02\x80\x88\x94\ +\xd3\x8a\x0f\x06\x83\xbc\xaa\xde\x0fcW\xba\xdd\xee\x99L\ +\x02A\x10,\x84f\xea\x04\x9e\xe7-\x03Q\x13\x05c\ +\xcc\x83L\x02\x22\xf2W\x81N\xa7SP\xd5\xd5\x04\xbd\ +\xd4\xeb\xf5.\xc6\x89\xf9\xc8p\xce\xe5T\xf5\x15\xb0\x03\ +\x5c\x09\xe9E\xe7\xdc*p\x09\xb8\x13O,\x95J\xb7\ +\x80\xd3\x09\x819U}\x04\xdc\x98\x98\xc0Z\xeb\x8b\xc8\ +\xae\x88\xac\xc5\x12O\x00\x8fE\xe4\xa7\xb5\xf6k\x14\xab\ +\xaa\x12\xbe\xcfC\xe0cH\xff\x16\x91\xbb\x80\xef\x9c;\ +\xf8\xbc\x0f&\x08\xf1\x14\xb8\x0d\x9c\x8cq\x9e\xef\xfbk\ +\xf1 \x11Q`%\x9c\xbc\x02\x5c\x00v\x1a\x8d\xc6\x93\ +D\xbd\xc3o`\xad\xfd\x01l$b\x9e7\x9b\xcd/\ +\xc9\xc4\x18>\x85\xa2\xc3i\x87\x13\x8f\x5c,\x167\x80\ +\xdd\xd0\xfd>\x1a\x8d\xd6S\x8a\x03l\x03\x04A\x90M\ +\xa0Z\xad\xee\xab\xea\xb3\xd0]o\xb5Z{i\xd5\x83\ + \xd8\x02\x10\x91\xcf\x99\x04\x00|\xdf\x7f\x09\xf4r\xb9\ +\xdc\x8b\xb4\xe2\x00\x85Ba;\x14\xc86\x81sN\xf3\ +\xf9\xfc/\xa0\xe1\xfb\xfe\xfe\xb4?f\x1c\xb5Z\xed\x1b\ +\xb0\x97Y\xe0\x88\xd8\xf2\x81\ +,\xb9\x03\x7f\x04NB]PE+\xf8m~\xb6\xdf\ +\xb3\x9e\xfc\x01\x0fn\x8d\xf2\x85\xaa\xaaJ\xe7\xdc\xe8\x02\ +\xaf9\x11-|q\xe0\x0b\xce\xb9Q\x96e\x03\x00 \ +\x22ED\x0a\x00\xb4\xd6\xb1\xbf\xde\x9f\xb1\xd6>\x01\x98\ +1\xf3\xdb\xb7\x01;\x0eF!\x18cV\xd6\xda\x09\x80\ +\xa9\x1f\xd2\x17p\x96\xaepc\xcc*\x8a\xa2W\x00\xef\ +\xc7z\x14\xe8Y\x8a\xc8\x9a\x99\x0f\x82\x88@)\xf5q\ +|\xa8i\x9a\xcf$IN.\x06\x05\x10\xd1s\xe0C\ +Z\x5cT\xd1\x9f\x0a\xe8\xac\xa8(\x0a\x05\xfch&\xca\ +\xbe\x1a;\x03\xf2\xe7\xba\xae\x87\x22\xb2\xee\xdb\xbfME>\xcc\xec\xba\ +\xf4\x90a\x0c\xfd\xa6\xc1S\xed\xf3\xff\xbf\xe9\xaf\x07\xb4\ +\xbae\xe6%\x80\xf1\x15\x9eK\x22z\xb9\xe2\xfe\xbd\xf1\ +\x05\xc2\x04Qc/\xda\x1f\xc0\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01\xad\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01*ID\ +ATH\x89\xcd\x95\xbbJ\xc4@\x14\x86\xbf3f-\ +|\x06\xc5k\xc0F\x96e'\xfb\x00\xe2#\xf8D\x22\ +\x0anc#\x08\x16b\x1blm\xb5]\xc8\xf4\x82\x88\ +\x88\x16\x82\x96\x82\xc4\x22gl\xb2\x22\x0bk\x925\x03\ +\xfe\xdd\xb9\xfc\xf3\xcd90\x0c\xfc79\xe7\x86M\xfa\ +\xcd\x0c\x8c\xdd4M\xe7\x82\x00\x9cs\x0b\xc0r\x1c\xc7\ +KA\x00\xc0: \xaa\xba\x16\x04 \x22\x1b\x00\xde\xfb\ +0\x00U\x8dK\xc0j\x10\xc0x\x02cL\x98\x09\x80\ +\xf1\x8a\xc2L0\x06\x00\xb5'\x90\xaa\x86,\xcbvD\ +d\xc5\x18s\xa7\xaa7?.\xb5\x0dlz\xef\xdf\x92\ +$\xb9\x9c\xe6\x8f\xaa\x00Q\x14\xdd\x17Eq\xa5\xaa\xf3\ +\x13\xa5k\xa00\xc6l\xfd\xe6\xaf\x5cQ\xaf\xd7{\x04\ +.\xa6\x94\xcf\xfb\xfd\xfe\xed\x9f\x00\xa5\xf6\x81\xcf\x89\x5c\ +\xae\xaa{U\xc6Z\x00k\xed\x93\x88\x9cM\xa4O\x06\ +\x83\xc1s+\x00\x00\xef\xfd\x01\xf0Q\x86\xef\x9dN\xe7\ +\xa8\x8e\xaf6\xc0Z\xfb\x02\x9c\x96\xe1\xb0\xdb\xed\xbe\xb6\ +\x0a(u\x08<\xe4y~\xdc\xd0W_\xa3\xd1h1\ +\xd8\xe1\xb3\xe8\xfb%;\xe7|\x9b\x07[k\x05f\xfb\ +2\x1b)8 \xb8\xbe\x00C\xb5S]L\x8a\xcf\xdb\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xa7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01$ID\ +ATH\x89\xed\x94\xbdJ\x041\x14\x85\xcf]\x1d\xac\ +f;\x9fd28\x08v[/\xfb\x066\x82\x85\x85\ +h!\x16n#\x16\x0b\xe2\xb2\x85\x8f`5l\xa3/\ +0\x950\x90\x1b\xec\x1d\x9f\xc0n\xac\x07\xafM\x90q\ +\xc9\xb0\x89\xec\x8a\xa0_\x13\xf2s\xce\xb9\x09I\x80\x7f\ +V\x891fZ\x14\xc5f\x88\xa6\x17`\xbe'\x22'\ +q\x1c\x1f\xac%\x00\xc0\xc4\xb6\x97eY\xf6W\x1a\xc0\ +\xcc#\x11\xd9\xb5\xdd\xed(\x8a\xce\x02\x0a\xf3\x87\x99%\ +T\x13rD\xdf\xe2\xe7\x03\x9892\xc6\x1c\x85\x980\ +\xf3qUU[K\x03\xb4\xd6\x03\x00O\x22r\xeb0\ +\x91v\xbb\xc0\xac\xae\xeb\x17W\x10\xb5\x0cN\x01\xdc\x84\ +T\xeeBD\xee\x94R\xfbD\xf4\xfe%\xc0\x86\xec\x00\ +\x98\x01\xc8\x94R\x8bs\x9f\x95w\xcc=\x03\xb8H\x92\ +dND\xdd\xb7MDz\xcc\xec|\xad]\xd7Tk\ +}\x18\xfa\x858\xf9\x9b\xef\x80\x96/\x01\xb4\xd6C\x22\ +\xbao\x0d])\xa5\xc6>Z\xaf\x1d\xa4i\xfa\x00\xe0\ +\xd1v_\x9b\xa6\xb9\xf6\xd1y\x07X\xce\x01\x80\x88\xc6\ +Y\x96\xbd\x05\xe8\xfca\xe6I\x9e\xe7\x1bk1\xff\xb5\ +|\x00N\xf0w\xf4\xcc\x22^~\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x03\xc3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03@ID\ +ATH\x89\xedTMh\x5cU\x18=\xe7\xce0t\ + c\x90\x8a\x98U1\xa9\x7f\xcd\xcay\xf7%q\x88\ +\x95\x22R\xaa\xaek\x15\x15\xba\xb0\x08bG\xa9\x82\xa0\ +(R]\x88\xe9\xc2\x9f\xd6D\x14\x91Z\x84t%Z\ +\x03\x0a\xbeM\x0d\xce\xbc\xfb&\xed\x22\xfe\x14\xccFQ\ +\x10\x15\xb5\x90\x19\xdfd\xeeq\x93\x17^\xda\x19\x1a\x5c\ +\x8a\xdf\xea{\xe7\xdc\xef;\xf7\xfby\x17\xf8O\x9b$\ +\x93$\xc9\xfe$I\xa6\xfem\x0e\x0e\x22\x9a\xcdf\xcd\ +\x18\xf3>\x80\x9d\x00\xbai\x9a^W\xab\xd5~\xcf\xf8\ +$I\xf6J:\x02\xe0*\x00ukm\xa3_\x1e\x93\ +9Q\x14\x157\x11\xc6\xbcL\xf2g\x00]\x00\xab\xa5\ +R\xe9X\x14E\xdb\x96\x97\x97K\xce\xb9\x13\x92\xf6\x90\ +|^\xd2/\x00f\x06]tC\xa0R\xa9|\xd9h\ +4\xae\xcf\xbe%\xf5\xbc\xf73\xbd^o$M\xd3\x11\ +\x92oV*\x95\xd9N\xa73G\xf2]k\xed3A\ +\x10|e\x8cy\x1b\xc0\xcdW\x14\x000Q(\x14b\ +\xe7\xdc=\x00@r_\xb7\xdb=;99\xf9[\xad\ +VkW\xab\xd5\x16\x80\x22\x00\xad\xfb\x00\x00\xef}\x07\ +\xc0\xdf[\x11\x00\x80\xed\x00>v\xce\xbdV.\x97\x99\ +\xefy\xab\xd5\xaa\x03\x98\x954\xd7j\xb5\x9e\xca\xc5\x8c\ +I\xfa~\x90@\xb1\x0fF\x00\x87;\x9d\xcemq\x1c\ +\x1f\x08\xc3p%\x8a\xa2\xa2\xf7~'\xc9k\x01\x18\xef\ +\xfd\xed\xce9+\xe9\x1b\x00\xfbH\xbaA\x02\x1b[\xe4\ +\x9cS\x1f\xfeO\x00\x8fXkO\xe7\xc1(\x8a\x8aC\ +CC\xc7\x0b\x85\xc2s\x92V$\x9d\x040L\xf2\x5c\ +\xb7\xdb\x9d\x9b\x9a\x9a\xfak\xab\x02\x00 \x00o\x94\xcb\ +\xe5\xa7\xc7\xc7\xc7\xd3\x0cl\xb5Z\xbb$\x1d\x91tG\ +\x10\x047\x90T\x92$\xf7Jz\x91\xe4\xa1 \x08\x12\ +\xe0\xf2\x19\x0c\xaa\xf2\xf0\xea\xea\xea\x87y\xb0Z\xad~\ +\xed\xbd\xbf\x1b\xc0;$\x05\x00A\x10|\x02\xe0\x98\xa4\ +S\xd9\xb9~3\xe8g\xe7%=\x91\x07\xe28\xbe\x8b\ +\xe46\x00h4\x1a7\x16\x0a\x85\x17\xbc\xf7+\x00n\ +Z\xafzk\x02$\x17\xda\xed\xf6}\xd3\xd3\xd3\x173\ +l~~\xbe@\xf2(\x80\xa3\x00\xc6\x8a\xc5\xe2\xac\xa4\ +=\xc6\x18\x00\xf8\x15\xc0\xde\xad\x0a\xbc^\xadV\x9f\x04\ + \xe7\x5c\x1d\xc0O$K\x92\x0e\x00\x18\x03\xb0\x0b\xc0\ +\x9d\x92vd\x01\x92\x1e\x0e\xc3p\xe3?\x19$\xd0#\ +Y\x0f\x82\xe08\x004\x9b\xcd\x83\xc6\x98WI&\xeb\ +IBc\xcc\x02\x80\x1f$\xbd\x02\xa0\x0a\xe0\x82\xa4\x0b\ +a\x18.l\xea@\xe6\xe4\xb6\xe8\x22\x80\xfb\xad\xb5g\ +\xf2\x07\x9ds\x8f\x93\xacK\xea\x018i\xad})\xc7\ +\xbdg\xad=\xd8\xef\xa6\x97n\xd1\x8f\xde\xfb\xdd\xd6\xda\ +3q\x1c\xdf\x1a\xc7\xf1C\x19\x91\xa6\xe9)I\xdb\x01\ +\x5cS.\x97O\x5c\x1274\xa0\x13\x9b\x04\x1akk\ +kvbb\xe2\x9csn\x84\xe4\x17\x92\xbe\x05\x808\ +\x8eGK\xa5\xd2\xe7$\x9d\xa4\xb3\xedv\xfb\xb3\xfc\xc3\ +Hr\xc7e\x993.s\x16\x17\x17\xcb\xb5Z\xad\x9d\ ++;\x22\xf9\x1d\x00Hz\x10\xc0\xe9\xe1\xe1\xe1G\x97\ +\x96\x96\xd6FGG\xdf\x02\xf0\x00\xc9\x0f\xbc\xf7$y\ +\x8b\xb5vw?\x81\x8d!\xe7\x93\x03\x80\xf7\xfeY\x92\ +3\xc6\x98?$\xed\x0f\xc3\xf0\xd3\x1c}\xc89\xf7\x11\ +\x80\xc7H^-\xa9>\xa8\x82\xff\xed\x8a\xf6\x0f\x98\xcd\ +u\xfb\xa9\xabu\xd5\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x03\x0b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x88ID\ +ATH\x89\xed\x93KHUQ\x14\x86\xbfu\x8f\x1e\ +JT\xe8\x82\x81\x0dJ'\xd1\x0b\xc4\xbb\xb7\x0f\x9c\x84\ + E\x14A/\x8a&\x16\x15EF\x14\x0e\xacf\x81\ +\x83\x8a\xa0\x81\x18a\x93rf\x83\x0a\x9c\x14\x14wV\ +\xdc\xdc\xe7\x12\x9a\xf4\x18\xf4\x9aI\x18\x84\xe4\xe3 g\ +5\xe8\x1e9]5\x91\x1aE\xffh\xb1\xff\x7f\xaf\x9f\ +\x7f\xed\xb5\xe1?\xfeyH\x5c8\xe7t\x1e)r\xd2\ +\x18\xd3\x17\x04A\x8f\xaa\x9e)\xa2\xfb\xad\xb5\xedK\x19\ +\xa4\xe2\xc2\xf7\xfd\xb4\xef\xfbiU}\x04\x84\x22b+\ +++\xef\x02\xa8j\x17\xb0\xebg\xa9\xa7|\xdfO\x97\ +\x96\x96\x9e^V\x82D\x92\xb5\xc0+\xe0\xb9\xb5v;\ +\xc0\xe8\xe8\xa8?55\x95\x07\xc6\x8c1m\x222/\ +\xed\x92\x09bXk?\x03\x17\x80m\xce\xb9\xc3\x00\x93\ +\x93\x93\x97\x80\x1aU=\xb1\x9c\xe6\x0b&\x00P\xd5\x94\ +s.+\x22\x9b\x80=\xc0\x13\x11\xe94\xc6\xf4.\xa7\ +\xf9\xa2\x06\x00\xb9\x5cn\xbd\xe7y/\x01\x0fxa\x8c\ +\xd9*\x22\x11\x80sn\x03\xf0:\xd6Zk\xa5p>\ +\x06\xac\x06\x10\x91\xdd\xc6\x98\xc1y#\x8a\xd1\xd4\xd4\xf4\ +\x0e\xe8\x03|U\xbd\x1e7/4|311\xb1\x12\ +\x18\x13\x91\xa3\x89k;\x00\xf5<\xaf\xd6\x183\x08\x0b\ +\xbcA\x8c|>_\x05\x1c\x02TD\xba\xb3\xd9\xec\x8a\ +$\xdf\xda\xda:\xad\xaa\xb7T\xf5\xec\xdc8D\x0e\x02\ +\xcf\xea\xeb\xeb?\xc6g\x8b\x1aDQ\xd4\x0bL\x03{\ +\x81\xcd\x15\x15\x15\xdd\xc5\x1a\xcf\xf3z\x81\x0dA\x104\ +\x03\xa8\xea~` \xa9Y\xd0\xa0\xb0=\xfbE\xe4\xa4\ +\xb5\xf6\xa1\x88\xf4\x01\xe7\x9ds\xadI]&\x93\xf9\x02\ +\xdc\x89\xa2\xa8#\x08\x82\x8d\xc0\xba\xd9\xd9\xd9{\xbf5\ +p\xceU\x03=\xaaz\xd3\x18\xf3\x18\xa0\xa4\xa4\xa4\x13\ +\xf8\x00\xf4\x0f\x0f\x0f\xafJ\xea\x0b\xef\xb3OU\xdbE\ +$\xdb\xdc\xdc<\xb6T\x82\xdb\xc0\xb7\x99\x99\x99\x8b\xf1\ +A]]\xddw\xe0\x08\xb0&\x0c\xc3\x1bIqCC\ +\xc3{U\xbd\x06\x9cS\xd5_\xc6\x03\x855\xcd\xe5r\ +\xb5\x9e\xe7\xbd/&S\xa9T[&\x93y\xea\x9c\xbb\ +\x02t\x15\xd1\x9f\xac\xb55\x00CCC[D$\x08\ +\xc3\xb0\xba\xa5\xa5\xe5kRT\x02\xd0\xd8\xd8\xf8id\ +d$]l0>>>\x01\x10\x86\xe1\xe5\xf2\xf2\xf2\ +\xabI.\x0c\xc3\xb9\xb5\x15\x91\xe3\xaa\xfa\xb8\xb8\xf9\x5c\ +\x82?A>\x9f\xaf\x8a\xa2\xe8\xad\x88\x1c3\xc6<\xf8\ +k\x06A\x10t\x14f>\xa0\xaa\xa1\xb5vg\xf23\ +\xc6X\xf4\x1f,\x05UM\x03\xf7\x81\x97eee\x07\ +\x16j\xfeo\xe0\x07\xcd#\xfd\x1f\xff\x86PK\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xfe\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02{ID\ +ATH\x89\xed\x95\xbdN\x15Q\x14\x85\xbf}\xee\x14\ +XZA\x8c\xaf` \xcc\x19B%\xf7^L4b\ +e\x8cD\x81\xd8`'>\x814&>\x83\x05\xfe$\ +\xfe\x14b(\xa5Q\xb9\x94\x93\x99}\xa6T{\xe3\xef\ +\x0bH\x02\x99m\xc1\x0c\x19a\x10\x8c\xa5\xaef\x92u\ +\xf6Y\xeb\xec}\xf6>\x03\xff\xf1\xb7\x08!\xf4Uu\ +\x09@UW\xaa\xefRQ\x14\xd3\xc7\xd9\x1f\x1d\x15`\ +f\xef\x81\xfb\xaaz\x12XT\xd5\x8f\xc0|Y\x96S\ +\xc71p\xbf[\xcc\xf3\xfc\x9a\xf7\xfe\x8bs\xae\x07\xcc\ +U\xf4\xbcs\xae\xeb\xbd\xff\xa2\xaa\xd7\x8f2\x90C\x84\ +\x9f\x02\x0fEd\xe0\xbd\x17\x80\xa2(N\x95e\xf9)\ +\x8a\xa2\xd3ccc\x9f\x00Tu[D\xce\x9b\xd9\xa2\ +\xf7\xbe\xd5\xac5\x03\xe7\xdcc\x11Yor\xe3\xe3\xe3\ +\x9f\x01FGG?7y3{ef\x8f\x0e\xcb\xe0\ +\x80A\x08a\xde\xcc\xde\x02'\x00\xb2,k\xaduQ\ +\x14g\x81\x0e0$\x22\xafU\xf5\xc6a&\x00\xa8j\ +/M\xd3\xe1}f}U\xfd\x9e\xe7y\xb7\x8a13\ +\x93,\xcb\xa6*\xfe\x5c3>M\xd3\xe1\x10B\xbf5\ +\x03\x11\x19\x8d\xa2h3\xcb\xb2\x91\x9a\x8b\xe3x\x03\x98\ +\x15\x91UU\xedU'\xef9\xe7^:\xe7\xae%I\ +\xf2\xa6\x8e\xcd\xb2l$\x8a\xa2\x81\x99\x8d5\x0d~\xb9\ +dU\xbd\x0b\x5c)\xcb\xb2?11\xf1\xb5\x99\x1d\xb0\ +\x0e\x0c\x01[\x222S\x99\xef\x89;\xe76\x805\xef\ +\xfdr\xabA5D\x8b\xed\x05\xfc#<\xf0\xde\xdf<\ +,\x83e`!\x8a\xa2^\xdd\x8a\x00y\x9ew\xab\xae\ +:\x01\xfc\x00f\xbc\xf7\x83z\xbdj\xe1\x01\xf0\xdc{\ +\x7f\xb7\xa9\xe9\x1a\x22\xb7\x80\x05\xe7\x5c\xb7E|\xd5\xcc\ +.V\xd4\x0c\xf0\xa2\xbe\x13\xd8m\xe1z\x18U\xf5v\ +\xab\x01\xf0\x01\x98\xaa\xfb\xbd)\x0e\xcc&I\xb2\x09\x10\ +\xc7\xf1\xa6\x99]m3\x01\xba\xd5\xd3\xb2\x87\x03\x93\x1c\ +B\x983\xb3g{\x01\x22\xd3\xf5\x85\xaa\xaa\xc5q\xec\ +D\xc4*\xf3\x8dZ\xc3\xccn$I\xf2d\xbf\xde\x81\ +A\x8b\xe3\xf8\xb9\x99\xf5\x80\xed\xead\x83\xfd1\x00U\ +F\x06l\x01\xfd6\xf1V\x83\x0aK\x22r\xa1I\xd4\ +\xf3\x11B\x18i\xf2\xce\xb9K\xc0/u?6B\x08\ +s\xb0;\xa1\xaa\xfaNUMU\xdf\xd5fy\x9e/\ +\x1c\xa5\xd1\xfa\x9a6\x91\xa6\xe9p\x14E\x03`\x0d\xb8\ +#\x22\xf7\xcc\xec\xf2\xce\xceNorr\xf2\xdbQ\xfb\ +\x7f\xfb?\x00\xe8t:g\xd8\x1d\x9ee`%\x8e\xe3\ +;f\xb6R\xf1\xff\x00~\x02-=/~\xd3X+\ +\xf7\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02C\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xc0ID\ +ATH\x89\xed\x951\x8b\x13Q\x14\x85\xbf\x1b\xcd\x8b\ +\x13\xb6R\x91EAH\xb0\x1be`x!\xddB@\ +v\xb1Vb/\xa8X\xd9\x09V\xae\xdb\x08\x8b?\xc0\ +\x05\x0bAT\xc8bee\x15Xp\xc00B\xa2F\ +\xb0\x08[D\x1b\xd1B\x19\x838\xc4k\xe1 !\xcc\ +N\x86D\xb0\xd9S\xcd\xb9\xf7\x9e\xf710\xef\x0e\xec\ +k\x86$\xef`\xbf\xdf_\x1a\x8dF\x97E\xe4\x94\x88\ +\x04\xbe\xef?\x11\x91_\xff\x04\x10\x04\xc1ac\xcc\x0e\ +\xe0\xfe\x0d\x8a<\x1d\x0c\x06\x17\x9b\xcd\xe68+[\xc8\ +\x030\xc6\xacO\x1e\x0e\xa0\xaa\xe7\xab\xd5\xea\xf5Y\xd9\ +\x99\x80n\xb7{\x02\xb8\x92\xd8\xc7\xe3\xf1\xb8\xaa\xaa\xb7\ +\x13\x7f3\x08\x02g!@\x1c\xc7k@\x09\x88\x1c\xc7\ +\xb9Z\xaf\xd7wk\xb5\xda:\xf0\x088Z*\x95\xce\ +-\x04\x10\x91\x95\xe4\xf1\x9d\xeb\xba\xd1D}\x13@U\ +\xcff\xe6\xf7j\x84ax\x06x\x9d\xd2\xda\xb0\xd6\xde\ +Jf\x86\xc0\xae\xb5v%e\x0e\xc8x\x03k\xed\x1b\ +\xe0\xc5TyX,\x167'|\x1fX\xde\xeb\x8cL\ +\x00\x80\xaanM\xf9\x1b\x9e\xe7}\x9f(}\x01\x96\xe6\ +\x06DQ\xb4\x0d|H\xec[kmkj\xe4+0\ +\x9a\x1b\xd0h4~\x88\xc8Fb\xef\xa6\xdc\xdc#\xc0\ +\xe7\xb9\x01\x00\xbe\xef\xdf\x07\xee\x01\xdb)\xed\xe3\xc0\xfb\ +\xac\xfc\xc1Y\x00\x11Q\xe0\xdat\xbd\xd5j\x1d\x00N\ +\xab\xea\x83\xac|\xaeU\x91\xa6J\xa5\xb2\x0a8\xc6\x98\ +g\x0b\x03\xc20\xbc\x13\x86\xe1\xc7v\xbb}\x08\xfel\ +\xd6\xe4\xa2my\x9e\xf7)+\x9bk\x9bv:\x9d\xe5\ +B\xa1\xf0\x12\x18\x02\xcf\x81\x0b\xc07`\xcdZ\x9b\xf9\ +\x15\xe5\xfe\x1f\xf4z\xbdcq\x1c_\x02N\xaa\xea\xab\ +r\xb9\xfc\xd0u\xdd\x9fy\xf3\xfb\xfa\x7f\xfa\x0d\xb4`\ +\x85\xdbm\xff\x95L\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x02\x85\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x02ID\ +ATH\x89\xed\x941\x88\x13A\x18\x85\xdf\x9f\xac\x87\ +9%DD\xce\xe3D\x9b\x13\xc1S<\xe4\xcf\x0a\xe9\ +R\x88\x95\xa4\x12\xaeTk\xc1\xc2\xe2:\x0b\x8b\xbbF\ +\xb1\x12\xb48P,\xecl\x04\x1b\xe1\x82\x85\x12\xb23\ +\xe3%\xa0ha#\x06\x1b\xc1\x18Aa#\xf3,L\ +`/fM\xa2)\xefU\xb33\xef\x7f\xdf\xfc;\xbb\ +\x03\xec\x08\x80s\xeeT\xdaZ\xf0?\xc1\xb5Z\xedh\ +\x10\x04\x9b\xde\xfb7\x00\xce\x0d\xf3d\xfe5\xdc\x18s\ +-\x08\x82\x06\x80\xfb\x006\xd3|\x13w`\x8c\x99%\ +\xf9\x94\xe4\x12\xc9R\x18\x86[\xc6\x98\xd54\xbf\xa4\x84\ +pRp_\xaa:4s\x10\xb0mG$3\xd6\xda\ +\x87\xd6\xdao\xc6\x98\xc7i~c\xcc\xda\xe0\xda\xc83\ +p\xce\x1d\xb7\xd6\xb6H\x9e\xcc\xe7\xf3\x0b\x00\xde\x8e\xdc\ +\xe1$\x00\xef\xfdK\x007Uu\xb9\xd3\xe9\x9c\x07p\ +1\x8a\xa2\x95\xa9\x01\x00\xac\xab\xea\xad\xde\xe1\xde\x050\ +/\x22\xf7\xaa\xd5\xea\xeei\x01\xfa\x9a\x07\xb0\xb77\xce\ +\x17\x0a\x85\x83\xd3\x06|\x00\xf0\xa97n\xb5\xdb\xed\x8f\ +\x00@RH\xa6v36@U\xbb\xde\xfb\x0a\x80\x8e\ +\x88T\xca\xe5\xf2Ok\xed\xa2\xb5\xf6\xb9\x88\x5c\xb1\xd6\ +^\x1a\x0b\xd0l6\xf7\x018=8\xdfh4\xf6\x88\ +\xc8\x22\x00O\xf2l\x14E\xb7IVI>\xc8d2\ +JrEDJ\xce\xb9\x03\xc9\xbam?\x851f\x97\ +\x88\xbc 9\x07`CUo\x18cVE\xe45\xc9\ +;\x00\x0e'\xec\xcf\x00\x5cP\xd5\xaf\xc0\xefW\xe5\x9c\ +\xbbJ\xf2r\x1c\xc7gJ\xa5\xd2\x8f?\x00\x00P\xaf\ +\xd7\x97\xe38~\x9f\xcb\xe5\x9ex\xef_\x018&\x22\ +s\x00\xf6\x038\xd2\xf7\x914\xc5b\xb18\xac>\x0c\ +\xc3\xad\xa1\x1d\x0ct3+\x22\x8f\x008\x92k\x00\x1c\ +\x80\x13\x09KKU\x0f\xa5\xd5\xf7\x95z\xd9\xa9\xeaw\ +\x00\x95\x04\xf0\xcb\x80\xe5\xf3\xa8p`\x82\xaf\x88\xa4M\ +>\x8b\x88M\xf3&5\xf6u=33\xb3\xde\xedv\ +\x17\x00,\x01x\x97\xcdf\xaf\x8f[\xbb\xa3\xbf\xea\x17\ +\x8c\xab\xdf\x04\x9a\xed\xc7F\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x03ID\ +ATH\x89\xed\x941j\xc3@\x10E\xff\x8a\xc5q\ +\x13\xd4\xe5\x06\xca\x09\x06V8>\x83\xef\xe0k\xe4\x06\ +)\x93*eH\x19\xd2\xf9\x0a\x12\xa8\x185\x06U\xaa\ +}\x00U\x8e@\xec\xa4\x08\x06a\xbc\x92\xb3h\xc1\x18\ +\xffj\xf93\xfb\xdf,\x03\x0b\x5c\x8d\xaa\xaa\x9a\x85\xc8\ +U\x87\x033\xb7\x00&\x83\xc4q\ +\x97\x89H\x1d{\xcc,D\xa4\x98Y\xfa\xbe\x17\xe08\ +d\xcc?\x14\xdb\xba\xae\xef|\x80C\xa0h\x8a\xc0!\ +\x05\x078wP\x96e.\x22\x8b3sr\x22Z\x9e\ +*8_\xf0\x8fp\x00xr\x15.r\x07\xef\x00^\ +\xa7\x00\xe4'/D\xd1w\xd7u[\x11\xd9\xf4\xec\xcc\ +\x15\xe2\x5c\xb2ki\x00P\x14\xc5\xdeZ\x9b\x1acV\ +\x03\x03\xfe\x0d4\xd6\xe0\xd0\x5cD\xbe\xb2,\xbb\x0f\x05\ +\x00\x80G\xad\xf5[(\xc0\x07\x80\x9d\xb5\xf6%\x08 \ +M\xd3\xb5R\xeaYk\xfd0\xd6\xeb\xf5\x9b\x02\x801\ +\xe6\xf3\x9c\xbe>`\xd64\xcd\x0f3\xfb2o\xf2\xd3\ +/\x99\xecSaxbHx\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x02\xca\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Sky Icon / S\ +ystem / arrow\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x05\xc3\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Picker\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x02\x88\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Windows -\ + Minimize\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x02\xfe\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Select Fi\ +les\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x06%\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22 standalone=\x22\ +no\x22?>\x0d\x0a\x0d\x0a<\ +g><\ +use xlink:href=\x22\ +#evt2kScrB\x22 opac\ +ity=\x221\x22 fill=\x22#f\ +fffff\x22 fill-opac\ +ity=\x221\x22>\ +<\ +/use>\ +\x00\x00\x05\x05\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22 standalone=\x22\ +no\x22?>\x0d\x0a\x0d\x0a<\ +g><\ +/use>\ +\x00\x00\x03\xec\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Open / Op\ +en in Internal A\ +pp\x0d\x0a \ +Created wi\ +th Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x02\xd3\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Noti\ +fication / Info<\ +/title>\x0d\x0a \ +\x0d\x0a \x0d\ +\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x03\xea\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x01\x97p\x0dn\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x03\ +\xa4IDATH\x0d\xedUKHTa\x14\xbew\ +FG+u\xf0A\xa31\xe4k\x11\xccH\x0c\x85\x98\ +D\xbb\x16\x11\x19D(-{ \xe2c\xa1\x9b\xa0\xd5\ +(\x14\xe4\xc6&\xdf.T\xd0\x5c\xa8\x9b\xca\xf0\xb1\x10\ +\xa5@E\xd4Z\xf8HtQ\x0e9\x8e\x8e\xa323\ +:\xd3<\xec\xfbn\xde\xe1j\xd2\xa2\xa8E\xf4\xc3\xbd\ +\xff\xb9\xdf\x7f\xce\xf9\xcf\xff\x9f\xef\x9c+\x08GGK\ +K\x8bv\x1fCU[[\x1b\xe5\xf7\xfb\x0dG\x15\x04\ +\x01*'\x89BKT\x99L\xa6j\xea755]\ +\xf8QUF\x96\x96\x96.\xd1B\xf9DFF\xf2[\ +\x10*++U===\x1a\xca\xd5\xd5\xd5\xb1\x9c\x7f\ +a0\x9c\xed\xedm+M\x1b\x1a\x1ab\xecv\xfby\ +\xc9M[[\x9b\x0f\x02\xa3\x0c\x07\x00\xc5\x15\x95\xd7\xeb\ +\xcd.--\xe5\xa2PWW\x97\xedr\xb9\xbcP>\ +'Y\xd1\x05\x05\x9c6\x12\xd1\xa9%\xf0\xb7^<'\ +\x1f\xd9\xc9\xd1o\x09'\xd8\xd8\xd8\x18\xefp8\xf6\x00\ +\xec\xd7\xd7\xd7\xa7\xca\x81#\xc63\x94sss\xf7\x9d\ +N\xe7S\xc9Yss\xb3\xc1j\xb5\xce%''K\ +\xa7\xa3\x02\x07\x8d\xe5Ayff\xc6\xdb\xdd\xdd}Y\ +\xe46\xb0\x8c\xd0\xe9tz\xadVkZ__\x1f/\ +//\xb7\x13\xaf\xa9\xa9I(,,|\xd5\xd5\xd5u\ +_\x14\xc5OEEE~\xe2\xff\xcc\xc0\x8d\x88G\xb3\ +\xc9k$\xae<\xa4\x94$*.//\xe7\xe4\xe7\xe7\ +\x07d#\xce\xf1\xf1\xf1\xfa\x9d\x9d\x9d\xcf\xbc\xc5\xb0\x11\ +y\x82\xab|\xce\xe4pttt\x9c\xc2\xa2$#\xa1\ +W(#\xa9\xbb\xac+\xc9hkk\xeb\xcbA\x0d\x84\ +i)\x1bp\x96\x9f\xd6\xd6V\xef\xe6\xe6\xa6Q\x80\xc7\ +;\xc8b\x98\xcbt-\x1b\xc82Y\xb0\xba\xba\xfa\x9e\ +\x89T\x81\xe4\xc3ccc\xb7\xc1k\x99\xe3\xc6\xef6\ +\x82\x80z\xbdUVV\xe6\x1b\x1a\x1az\xd2\xd7\xd7w\ +]\xaf\xd7\xef\xa8\xfb\xfb\xfb\xf7FGGm\x0b\x0b\x0b\ +\x83YYY\x19\xa8\x7fKzz\xba\xd9h4>\xf6\ +x7>\x14\x10kb`` \x0d\xf4y\x07\x86\xef\ +\xca\xbd\x0c\x11(\xfdI2\xb1\x9f\xe1\xb4\xa5\x0f\x94\xd7\ +\xf0\xd4\xd4T\x92t\xaa\xe9\xe9\xe9k\x00\xd6\xc0Q\xdf\ +q5\xa7tz\x9c,c\xf2L\x1f\xfc\xad\xb0\x86\xd1\ +!.F\xe0\xae?\xa0\xd4n@!uvv\xf6~\ +bb\xe2\xd5\xbc\xbc<\xcd\xf8\xf88\x8f\xc0\x1f\xd2\x03\ +\x14\x0b\xcb\xf0\x05\x9e\xf0\x00~\x0f\x1f1%%%u\ +X\x17\xd0=\x04\x94\xe3W\xb4\x97\xd7\x83\x83\x83\xcf:\ +;;WPD\x9b\xbc{UJJ\x8a:\x18\x0c\xf2\ +\xb7t\x1aI;\x8br4\xe5\xe4\xe4\x9f\xcf\x85\xff\x88\x1f\xbeC\xe1\xee\ +\x87h\xc5\xde\xde^\x15\x94\xa3\xb0s\x1c\x8cc\xd1\x07\ +\x02\x1a\x8d\xc6\x89\x8d\xdc\x05\x05\x05\xe1\x0dx\xb7\xc8\xd9\ +\x09\xe8%@/\x1aA\xedb\xde\x06\xe65\x9b\xcd\xc1\ +\x83\xf6 \xc5\x13\xde@\x8e\x8e37\xab\xaa\xaa\x12\x0d\ +\x06\x83\xc8\x9e\xc1H\x94\xeb\x94yr%v\x9c\x8er\ +\xfd\x8f\xc9\xdf\x00W!\x9d3a\xed\xde\x11\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x03j\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>icon / out\ +liner / menu / d\ +efault\x0d\x0a\ + Create\ +d with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + <\ +rect id=\x22Rectang\ +le-13-Copy\x22 x=\x220\ +\x22 y=\x224.8\x22 width=\ +\x2210\x22 height=\x222.5\ +\x22>\x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xca\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Sky Icon / S\ +ystem / arrow\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x00\xcf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\ +\xe1\x0b\x1b\x12\x0c\x16\xa6\xc7\x0eK\x00\x00\x00\x19tE\ +XtComment\x00Create\ +d with GIMPW\x81\x0e\x17\x00\ +\x00\x007IDATH\xc7c\xfc\xff\xff\xff\x7f\x06\ +\x12\xc0\xe9\xd3gIQ\xce\xc0\xc4@c0j\xc1\xa8\ +\x05\xa3\x16\x0c\x07\x0bXH-[LM\x8dG\xe3`\ +\xd4\x82Q\x0bF-\xa06\x00\x00\xdf\xc3\x09\x91\x04F\ +O\x13\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02K\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Artboard\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xb1\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Filter\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x02\xd1\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Check\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Icons-/-Sy\ +stem-/-Check\x22 st\ +roke=\x22none\x22 stro\ +ke-width=\x221\x22 fil\ +l=\x22none\x22 fill-ru\ +le=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x00g\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x06\x00\x00\x00\x02\x08\x06\x00\x00\x01\x0cZ\x9d\xc8\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +!IDAT\x08\x1dc`\x00\x81\xff\xff\xff\x8b\x80\ +\x88\xf5`\x16\x98\x01\x15\x8e\x07r\xde\x021\x0c\x80\xd8\ +\xf1\x00 \x5c#\xff\xbe\x0a\xde\x96\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x02~\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / indetermi\ +nate\x0d\x0a \ + Created \ +with Sketch.\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02h\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Add\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Icons-/-Sy\ +stem-/-Add\x22 stro\ +ke=\x22none\x22 stroke\ +-width=\x221\x22 fill=\ +\x22none\x22 fill-rule\ +=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x035\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Sky Icon /\ + System / Window\ +s - Restore\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03\xb0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Noti\ +fication / Helpe\ +rs\x0d\x0a \ +\x0d\x0a \ +\x0d\x0a <\ +path d=\x22M12,2 C1\ +7.5228475,2 22,6\ +.4771525 22,12 C\ +22,17.5228475 17\ +.5228475,22 12,2\ +2 C6.4771525,22 \ +2,17.5228475 2,1\ +2 C2,6.4771525 6\ +.4771525,2 12,2 \ +Z M12.4748737,17\ + L10.4748737,17 \ +L10.4748737,20 L\ +12.4748737,20 L1\ +2.4748737,17 Z M\ +8.47487373,5 L5.\ +5,8.06066017 L6.\ +91421356,9.47487\ +373 L9.324,7 L14\ +.9,7 L16,7.888 L\ +16,11.306 L15.50\ +1,12 L10.4748737\ +,12 L10.4748737,\ +15 L12.4748737,1\ +5 L12.474,14 L16\ +.4748737,14 L17.\ +998,12 L18,12 L1\ +8,7 L15.4748737,\ +5 L8.47487373,5 \ +Z\x22 id=\x22Combined-\ +Shape\x22 fill=\x22#FF\ +FFFF\x22>\x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02\xc8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22 standalone=\x22\ +no\x22?>\x0d\x0a\x0d\x0a<\ +g>\ +\x00\x00\x03*\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Delete\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a <\ +/path>\x0d\x0a \ +\ +\x0d\x0a \x0d\x0a\ +\x00\x00\x03A\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Sky Icon /\ + System / Window\ +s - Restore hove\ +r\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x03\xf5\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Sky Icon /\ + System / Window\ +s - Pop Out\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xd0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ +Triangle\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x03\x91\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Windows -\ + Close\x0d\x0a\ + Create\ +d with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a\ + \x0d\ +\x0a \ +\x0d\x0a \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x03.\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Components\ + / button / more\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a <\ +g id=\x22Group\x22 tra\ +nsform=\x22translat\ +e(3.000000, 7.00\ +0000)\x22 fill=\x22#E9\ +E9E9\x22>\x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x04o\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / System\ + / drag-dot-hori\ +zontal\x0d\x0a\ + Create\ +d with Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a <\ +path d=\x22M12,8 C1\ +2.5522847,8 13,8\ +.44771525 13,9 C\ +13,9.55228475 12\ +.5522847,10 12,1\ +0 C11.4477153,10\ + 11,9.55228475 1\ +1,9 C11,8.447715\ +25 11.4477153,8 \ +12,8 Z M12,2 C12\ +.5522847,2 13,2.\ +44771525 13,3 C1\ +3,3.55228475 12.\ +5522847,4 12,4 C\ +11.4477153,4 11,\ +3.55228475 11,3 \ +C11,2.44771525 1\ +1.4477153,2 12,2\ + Z M12,-4 C12.55\ +22847,-4 13,-3.5\ +5228475 13,-3 C1\ +3,-2.44771525 12\ +.5522847,-2 12,-\ +2 C11.4477153,-2\ + 11,-2.44771525 \ +11,-3 C11,-3.552\ +28475 11.4477153\ +,-4 12,-4 Z\x22 id=\ +\x22dots\x22 fill=\x22#CC\ +CCCC\x22 transform=\ +\x22translate(12.00\ +0000, 3.000000) \ +rotate(90.000000\ +) translate(-12.\ +000000, -3.00000\ +0) \x22>\x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02\xca\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Sky Icon / S\ +ystem / arrow\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x01\xfd\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x06\x00\x00\x00\x02\x08\x06\x00\x00\x01\x0cZ\x9d\xc8\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ + cHRM\x00\x00z&\x00\x00\x80\x84\x00\x00\xfa\ +\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\x00\x00:\ +\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x01YiTX\ +tXML:com.adobe.x\ +mp\x00\x00\x00\x00\x00\x0a \x0a \ +\x0a <\ +tiff:Orientation\ +>1\x0a \x0a \ + \x0a\x0aL\xc2'Y\x00\x00\ +\x00&IDAT\x08\x1dc\xf8\xff\xff\x7f<\x03\x90\ +x\x0b\x22\xfe\x83Y \x06\x10\xc43\x80\x00\x90!\x02\ +\xc4\xeb\xa1X\x04$\x06\x00\x10\x9f#\xff\xe4~\xe0&\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xc8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22 standalone=\x22\ +no\x22?>\x0d\x0a\x0d\x0a<\ +g>\ +\x00\x00\x04\x01\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Sky Icon /\ + System / Window\ +s - Pop Out hove\ +r\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + <\ +/path>\x0d\x0a \ +\ +\x0d\x0a \ + \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x04\x03\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a dots\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x02\xab\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / S\ +ystem / Windows \ +- Maximize\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Icons-/--S\ +ystem-/-Windows-\ +--Maximize\x22 stro\ +ke=\x22none\x22 stroke\ +-width=\x221\x22 fill=\ +\x22none\x22 fill-rule\ +=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03i\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Select Fi\ +les - folder\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\ +\x0a \x0d\x0a\ + <\ +/path>\x0d\x0a \ +\x0d\x0a\ +\x00\x00\x03\xf2\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x002\x00\x00\x002\x08\x06\x00\x00\x00\x1e?\x88\xb1\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x1d\x87\x00\x00\x1d\x87\ +\x01\x8f\xe5\xf1e\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03oID\ +ATh\x81\xedY=\xaf\xdb0\x0c\xbc$N\xdb\xf1\ +\xb5\xe8\xd2\xa5oy\xff\xff\xcft\xec\xdaN]^\x87\ +\xa2hb'\x1d\x22\xda\xa73)+H\x1c\xe7\x019\ +\x80\x90\xbf$\xf1D\x8a\x92\xa9\x15\xcaX\x15\xee\xf5\xdd\ +\xb5p\x0c\xae\xbd\xfb\x1e\x912\x9e\xc2QYj\xa7\x06\ +\x91\xb2Q\xe9\xd5q\x15\xf0\x14f\x81s=\xd5\xa6\x87\ +\x12\x01\x168\xd7\xa3\xfa\x91\x12\xaa\xbc\xc9\xday\xa6\xf5\ +\xce\x81\xa7\x9c\xc9\xc1\xb9\x8fH\xa1\x99 \xb1\xa6\x92E\ +I)\x89)B\x9e\x9b\xb0\xf2\x5c\x9ax\xf5V\xf6\xcc\ +\x88D$L6I\xd6T2!m\xa3\x06\x91+\x1d\ +\x00tTv\xa4\x13\x93\xca\xc8\xa8E\x94\x84\x11h\x92\ +lD\xd4\xd5.!\xc2\xa3\xdf\x01h\xa5\xec\xa8\xee\x01\ +2G\x1a\x8c]\x82I\x18\x81\xad\x94\xf6\x8e-s\x0e\ +\x19\xcf\x1al\x856\xc9>\xb5\xbf\x97\xba\xdc\xd7\x11\xc0\ +\x8a]K-b\xcan\x01\xbcK\xb2%a\xcbx\x01\ +`\x0a\xeaNLb\x9fd\x03`W\x18\x84\xfe\x99\xe7\ +Z\x1e\x89\xf7I\x94\x10\x13\xa9\x9d+\xaa\x08\x93\xe8\x88\ +\xc4\x8e\xdad\xe2\xf6\xfd\x8a\xda\x80g\x11\x9d\x1bF\xe4\ +\x03N\xa3\xf5\x1d\xc0\xeft=\x076\x00\x9e\x00<\xa7\ +>\x8d\x04\x13^#\xb7h6a#\x02F\xa2\x03\xf0\ +\x0d\xc0\x1f\xe4\x91\xe3\xda8\x02\xf8\x0b\xe0\x17\x80\xcfI\ +\x17#\xe1\xad/\x00|wPB\xe6^?\x90G\x8e\ +\xb9\xd1\x02\xf8\x89\xc1\x95-\xc8x\xc1%\xf3A/\xf4\ +\x1a\x91-\x80\xd7\xf9u\x1f\xe1\x15c\x12\x1c)a%\ +[dj\x1d\x99kN\x94\xd0b\xbc\x86\x85\x16\xd1u\ +$\xb2\xccRP\x12#k\x00\xbeky\xdb\x13\xfe\xee\ +\xd6\xf0\x16\xdd\xd1N\x5c';\xe4\x03\xddO-\x01\xdd\ +\xa4\x02\xb9\xbe\xfdGp^F\xff\x1eK\xa0h\x09\xfb\ +HGZ\x95>w\xdb1\x07\xbc\xfe\x8b\x16\xf1*\xdf\ +\x03\x11\xd4\xe8\xb2\xa4\xef\xd7\xa2j\x10\xdf\x02\x91*<\ +\x88\xdc\x1b\x1eD\xee\x0d\x0f\x22\xf7\x86\xb7@$L\x5c\ +3\x22\x22\x9a4\xabjlFL\xea\xa2D\xbc\x0f\x97\ +&\x12\xe9\x94A\xd3-Z\xf9\x1e,\x12\xe9\xe1&\x1f\ +j\x92\xcaK\xa1\x98=1D\xae\xc5\x95-\x95\xb9\x14\ +8\x15\x14\x9e\x9d\xac\xf5\x01r2\x9c\x14[\x0a\x1d\x09\ +\x93\x02\x02\xd7\xf2R\xfb\x9c\x8b]\x22\x01\xd1\xa4\xbe\x99\ +\x8c;gJ\xb9U\xcd\x8a?\xdd@q\xc5G\x0c\xb9\ +`\xb5Hf\x15\x9d\xec\x915v\x00\xbe\xe2\x94Q\xb9\ +\x15\x9a\xd4\xe7\x1e\xc3\x80\xb2\x8be\x161\xc5\xf4\xa7^\ +3z+\x9c2~_0\x10\x9b+\x004\x00>\x01\ +xI\xfd\xfeK\xc2\x96\x19Y\xc7\xfc\xde\x9b\x1f\xad\x10\ +\x01N\x09\xed\x17\x0ciL>\xec\xf1RK%Ds\ +\xd2\x06j\x97\x08\xec\x1c\x12\x1cY{\xf6\xda0\xcf\x91\ +=)f\xef4\x8d\xa9\x96\xab!\x13\x1d\xbbY\x9f\xec\ +\xd2&\xe6Z\x1a\xb92\x22\xda\xb0\x86[~n\x11\xac\ +\x98\x8b\x0d\xc8D\xdb\x1f\x0e\xf5\xad\x88Y\xc3#\xd2\xcf\ +\x93\x06\xc3\x99\x1c\xa8QS\xa4\x95\xe7f\x0d/3~\ +\xc9a\xa8.\xc0\x1cl\xf4@\xd4[\xe1\x8f\xeaZ\x06\ +=\xd7\xb6Q\xd8`\x98;\xd1Ah\x0d\x99h_\xa7\ +\x8b0\x1f\x90\xf2\xbb\xd1\x16%\xca\xf9r2[\xa3X\ +\x94T\xae!\x10\x11R2J*\xda\xa6\xf4mx\xab\ +\xb5Z\xc6\x0e\x1d\x8ft\x7f\x0d\x12%2J\xaa\xb4\xcf\ +\x0a;W\xc5\xaa\x92\xc8W\x22beD\xce\xfb\xbe\xd8\ +y\xe4r\xa5\xf2\x12D\xbf\x11^\xa9\xd7\x93JLe\ +\xc0\xa7\x08\xd4\x84_\x0f%\x85\xc3\xfa\xff\x01s\xf9\xcb\ +ji\x90\x126\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\xfd\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x19\x00\x00\x00\x19\x08\x06\x00\x00\x00\xc4\xe9\x85c\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01zID\ +ATH\x89\xed\x96]R\xc30\x0c\x84\xbf\xb8iS\ +\x862\xc3\x11\xe0\xfe\xb7\xe1\x02p\x88v\x08m~x\ +\xe8\xcaUU\x17\xd2\x86GvFcg,k\xa5\xc4\ +^\xa5\xe2\x1c\x953\x0ac\x09\xa3\x1bKs\xea\x10$\ +i\xbepsOz\x8dd\x04\x86`y\xbd\x0e\x04\x0b\ +\x11\xd7\xc02\x90\xc5\x8a|\xd6\xbd\xac\x03\x0e\xeey\xf0\ +\x95\x18\xc1\x12X\x03\x8d\xc6\xa5|\xaeUc\x15\xf4\xc0\ +\x1e\xf8\x02Z\x8d\xf9\x95Y\x80\xa4\xf9\x1ax\x046\x1a\ +\x8d\xc8W\x13Ize\xdf\x02;%k\xe4#\xd0\x97\ +H6Z|SFS\xd1\x00\xafJ\xae\x93\xf5\xc0`\ +\x19&e\xdc\xc8\xe9\xfdF\x02\xe4\xff\xa1\xfd\x8d\x92N\ +@\x95\xe4`'j\xa5j\xda\x1b\x09\x0c\xad\xf6\xaf\x14\ +\xaf\x82\xf3c\xea?\xfe\x1c\xd4\x84+\xe0+\xf1Ds\ +\x10\xef\x18\xc9-N\xb9xSp\x11']\xf7\xfd;\ +\xfc\x93\xdcM2\x12$\xfaN\x5c\xc4Ia\xc1\xc4n\ +\x0eL}3Q*\x10\x1cf\x92d\xcd\xb2\xd8\xbe\x12\ +\x93k\x93\x86{`\x92\xb4W\xbc\x11N\xfab\xb6\x90\ +=\x03[eu\x0b\xc1\x8b\xf6\xecD\xd6\x01C\xd4\xac\ +\x07\x8e*\xfa\xc4y?\xc9b\x17`\xad\xd6\xde\xc0V\ +\xb6\x03>Q\x97\xac9}\x8f\x8e\x93\xbc\xf7rZ\xe1\ +$\xbb@\xe2\xf7\x1a\x91u\xc6\xdc~\xbd\xc6\xf8\x1eo\ +m7\x12\xfc\xd6\xe3\x0f\x84\x86\x05\x8cqs*\xd8O\ +\xbfEFd'\xc9N\xa8\xcd\xf1$\x86\xd2\x7f\xd7\x14\ +U.\xfds\xe5\xcb\xf8\x0d\xfa\xb9\x8b4\xa6\xc67\x1a\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x091\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Edit\ +or / Particle\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x05\x94\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Light / IBL\ + Light\x0d\x0a\ + Create\ +d with Sketch.\x0d\x0a \x0d\x0a <\ +path d=\x22M12.75,1\ +9 L12.75,22 L11.\ +25,22 L11.25,19 \ +L12.75,19 Z M6.4\ +2132034,16.5 L7.\ +48198052,17.5606\ +602 L5.36066017,\ +19.6819805 L4.3,\ +18.6213203 L6.42\ +132034,16.5 Z M1\ +7.4606602,16.4 L\ +19.5819805,18.52\ +13203 L18.521320\ +3,19.5819805 L16\ +.4,17.4606602 L1\ +7.4606602,16.4 Z\ + M12,6 C15.31370\ +85,6 18,8.686291\ +5 18,12 C18,15.3\ +137085 15.313708\ +5,18 12,18 C8.68\ +62915,18 6,15.31\ +37085 6,12 C6,8.\ +6862915 8.686291\ +5,6 12,6 Z M12,7\ +.5 C9.51471863,7\ +.5 7.5,9.5147186\ +3 7.5,12 C7.5,14\ +.4852814 9.51471\ +863,16.5 12,16.5\ + C14.4852814,16.\ +5 16.5,14.485281\ +4 16.5,12 C16.5,\ +9.51471863 14.48\ +52814,7.5 12,7.5\ + Z M5,11.25 L5,1\ +2.75 L2,12.75 L2\ +,11.25 L5,11.25 \ +Z M22,11.25 L22,\ +12.75 L19,12.75 \ +L19,11.25 L22,11\ +.25 Z M5.3606601\ +7,4.3 L7.4819805\ +2,6.42132034 L6.\ +42132034,7.48198\ +052 L4.3,5.36066\ +017 L5.36066017,\ +4.3 Z M18.621320\ +3,4.3 L19.681980\ +5,5.36066017 L17\ +.5606602,7.48198\ +052 L16.5,6.4213\ +2034 L18.6213203\ +,4.3 Z M12.75,2 \ +L12.75,5 L11.25,\ +5 L11.25,2 L12.7\ +5,2 Z\x22 id=\x22Combi\ +ned-Shape\x22 fill=\ +\x22#FFFFFF\x22>\x0d\x0a \x0d\x0a\ +\x00\x00\x03U\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Scale\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x026\ +\x00\ +\x00\x0a\x07x\x9c\xad\x96\xc1\x8e\x9b0\x10\x86\xef\x95\xfa\ +\x0eS\xf7\xd2Jq\xc0@\x12\x88 +5\xeaV\x95\ +\xb6\x97\xee\xf6\xb27\x0a.X!6\x02oH\xde\xbe\ +\x03\x81m*Y\xa8\x15X\x08\xdbx\xfc\xcd\xcf\xef\x11\ +\x22\xbc;\x1f\x0b8\xf1\xaa\x16JF\x84-m\x02\x5c\ +&*\x152\x8b\xc8\x8f\xa7{\xea\x93\xbb\xdd\xdb7a\ +}\xca\xa0\x11\xa9\xce#\xe2x\xe5\x99@\xceE\x96\xeb\ +av\x12\xbc\xf9\xa4\xce\x11\xb1\xc1\x06\xc7\xc3\x8b\xdcR\ +\x19\x01\xcc#\xeb\x88\xe4Z\x97[\xcbj\x9af\xd9\xb8\ +KUe\x96c\xdb\xb6\x85\xf8>d{.\x84<\x98\ +\x02Y\x10\x04V\xb7JP\x11`\x0b\xdfQ\x0a_\xb8\ +\xe4U\xacU\xb5\x85\xc7\x03\xd7I\x0ek\x07>\x04\xcc\ +\x0d\xec\x8f@\xa1\xe5\xd4\x08\xaa\xbb\xb5e\xa2\x8e@\xe9\ +\xb0_\x0b]\xf0\xdd\xd7D\xc9\x1a,\xf8\x9c\x0a\xc4\xe0\ +\xe0\x89WU,$\xf6g\xfdR\xf1\xd0\xba\xc6\xf5\x9b\ +R^'\xbb}\xc5c\xcdS\xf4D\xe7}\xdeeh\ +uK}X\x06\x22\x8dH\xc7\xa6\x16\xbd\xb2q\xd0\xb3\ +i\xcf&P\xebJ\x1dxD\xa4\x92\xaf3\xda[\x8d\ +\xbe\xfd\x12E1,\xb6cZ\xbd\x14\x18\xcdO\x5c\xaa\ +4\x1d\x9c\xe82\x96\xaa\xb8dJvy\xf7\xea\xf8S\ +H\x9e\xd2\xc7<.\xf9\x80y\x7f\xdf5\x02\xa5\x12R\ +\xe3q\xf8\xe0\x03\xc3\xe3\xc2C\xc3\x1b\xd9\x85V\x0f\xf9\ +\x8b\x1b\xe3;\x22\xf3\x1b[-\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Ruler\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x04.\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / List\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + <\ +/rect>\x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02\xb8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Selection<\ +/title>\x0d\x0a Created with \ +Sketch.\x0d\x0a\ + \x0d\x0a \ + <\ +/rect>\x0d\x0a \ +\x0d\x0a \x0d\ +\x0a\ +\x00\x00\x02\xfa\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Edit\ +or / Terrain\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x0fb\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Audio\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Icons-/-Sy\ +stem-/-Audio\x22 st\ +roke=\x22none\x22 stro\ +ke-width=\x221\x22 fil\ +l=\x22none\x22 fill-ru\ +le=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a <\ +g id=\x22Left\x22 tran\ +sform=\x22translate\ +(7.000000, 12.00\ +0000) scale(-1, \ +1) translate(-7.\ +000000, -12.0000\ +00) translate(2.\ +000000, 3.000000\ +)\x22 fill=\x22#FFFFFF\ +\x22 fill-rule=\x22non\ +zero\x22>\x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00 \xd8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Misc\ +ellaneous / Get \ +Physics State\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a \ +\x0d\x0a <\ +mask id=\x22mask-2\x22\ + fill=\x22white\x22>\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + <\ +/use>\x0d\x0a \x0d\ +\x0a\ +\x00\x00\x03\x8c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Folder\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x042\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Edit\ +or / Follow Terr\ +ain\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x06d\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Edit\ +or / Debugging\x0d\x0a \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xe2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Syst\ +em / Locked\x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x0c\x9d\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Jump to Se\ +lected Object\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x03\xf3\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Syst\ +em / Unlocked\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x02\xa4\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Tool\ +bar / X\x0d\ +\x0a \ +\x0d\x0a \x0d\ +\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x04\xf3\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Snap to An\ +gle\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\x0a <\ +rect id=\x22Rectang\ +le\x22 fill=\x22#FFFFF\ +F\x22 x=\x223\x22 y=\x2219\x22 \ +width=\x2218\x22 heigh\ +t=\x222\x22>\x0d\x0a \ + \x0d\x0a <\ +path d=\x22M4,10 C9\ +.5228475,10 14,1\ +4.4771525 14,20 \ +L14,20 L4,20 Z\x22 \ +id=\x22Combined-Sha\ +pe\x22 fill=\x22#FFFFF\ +F\x22>\x0d\x0a \ + \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x02\xbe\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Deploy\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x05\x99\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Undo\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x0a\xa1\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Edit\ +or / Object Foll\ +ow Terrain\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +defs>\x0d\x0a <\ +path d=\x22M9,3 C10\ +.6568542,3 12,4.\ +34314575 12,6 C1\ +2,7.65685425 10.\ +6568542,9 9,9 C7\ +.34314575,9 6,7.\ +65685425 6,6 C6,\ +4.34314575 7.343\ +14575,3 9,3 Z M8\ +.09080205,7.5900\ +9752 L8.00746878\ +,7.60252386 C7.7\ +282674,7.6387854\ +8 7.44292581,7.6\ +5227088 7.155924\ +13,7.64082403 C7\ +.60329291,8.1453\ +1885 8.25525878,\ +8.46431228 8.981\ +82965,8.46954781\ + C8.61496648,8.2\ +6065565 8.317229\ +81,7.95681608 8.\ +09080205,7.59009\ +752 Z M11.339624\ +4,5.20724256 L11\ +.3014187,5.32528\ +594 C10.9064423,\ +6.4304067 9.7440\ +2621,7.25916318 \ +8.37733881,7.540\ +5313 C8.64477271\ +,7.93889489 9.01\ +00113,8.24333994\ + 9.46390297,8.39\ +962738 L9.453705\ +65,8.42802716 C1\ +0.6009322,8.2149\ +999 11.4696133,7\ +.20894562 11.469\ +6133,6 C11.46961\ +33,5.72269897 11\ +.4239097,5.45607\ +258 11.3396244,5\ +.20724256 Z M7.9\ +2344354,3.776081\ +81 L7.79772951,3\ +.84228389 C7.041\ +6548,4.26446861 \ +6.53038674,5.072\ +52778 6.53038674\ +,6 C6.53038674,6\ +.5023626 6.68038\ +335,6.96969162 6\ +.93803339,7.3596\ +4387 C7.28089656\ +,7.39161789 7.62\ +22472,7.38376705\ + 7.9541891,7.341\ +95194 C7.4566087\ +2,6.34335511 7.4\ +265976,4.9823446\ +3 7.92344354,3.7\ +7608181 Z M9,3.5\ +3038674 C8.74771\ +877,3.53038674 8\ +.50427281,3.5682\ +1503 8.27502485,\ +3.63850888 L8.34\ +881372,3.4935848\ +2 C7.68188659,4.\ +74967516 7.67712\ +337,6.2641328 8.\ +23091096,7.29944\ +959 C9.73214731,\ +7.02005284 10.98\ +31893,6.04704388\ + 11.1590866,4.79\ +951854 C10.73692\ +93,4.04253973 9.\ +92827454,3.53038\ +674 9,3.53038674\ + Z\x22 id=\x22path-1\x22>\ +\x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \ +\x0d\x0a \x0d\x0a <\ +mask id=\x22mask-2\x22\ + fill=\x22white\x22>\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x04^\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Edit\ +or / Select Terr\ +ain\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\ +\x0a \ +\x0d\x0a \ + \x0d\x0a <\ +path d=\x22M11,11 L\ +18.6236276,13.17\ +81793 L15.605,14\ +.488 L21,19.8835\ +456 L19.844846,2\ +1.0386996 L14.47\ +1,15.665 L13.178\ +1793,18.6236276 \ +L11,11 Z\x22 id=\x22Co\ +mbined-Shape-Cop\ +y-2\x22 fill=\x22#FFFF\ +FF\x22>\x0d\x0a \ + \x0d\x0a\ +\x00\x00\x04\x96\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Tool\ +bar / Environmen\ +t\x0d\x0a <\ +g id=\x22Icons-/-To\ +olbar-/-Environm\ +ent\x22 stroke=\x22non\ +e\x22 stroke-width=\ +\x221\x22 fill=\x22none\x22 \ +fill-rule=\x22eveno\ +dd\x22>\x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x0b\xa5\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>icon / Scr\ +ipting / Lua Scr\ +ipt \x0d\x0a \ + Created \ +with Sketch.\x0d\x0a \x0d\ +\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a <\ +use id=\x22Combined\ +-Shape\x22 fill=\x22#F\ +FFFFF\x22 xlink:hre\ +f=\x22#path-1\x22>\x0d\x0a \x0d\x0a\ +\x00\x00\x07S\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Vertex Sna\ +pping\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ +\ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\ +\x0a \ + \x0d\x0a\ + \ +\ +\x0d\x0a \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x02x\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Tool\ +bar / Z\x0d\ +\x0a \ +\x0d\x0a \x0d\ +\x0a \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x05\xd1\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Save\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x05\xf0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Align to g\ +rid\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a <\ +rect id=\x22Rectang\ +le\x22 fill=\x22#FFFFF\ +F\x22 x=\x223\x22 y=\x223\x22 w\ +idth=\x2210\x22 height\ +=\x2210\x22>\x0d\x0a \ + \x0d\x0a\ +\x00\x00\x1a\xa5\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Misc\ +ellaneous / Simu\ +late physics on \ +select objects\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03\x16\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Align obje\ +ct to surface\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x05\x13\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Move\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Icons-/-To\ +olbar-/-Move\x22 st\ +roke=\x22none\x22 stro\ +ke-width=\x221\x22 fil\ +l=\x22none\x22 fill-ru\ +le=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x04\x0e\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Tool\ +bar / XY\ +\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ +\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x05\x7f\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Redo\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x08\x0e\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Misc\ +ellaneous / Flow\ +graph\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x04\xeb\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Rotate\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x0b\xdf\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Misc\ +ellaneous / Obje\ +ct Height\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x03\xb7\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Grid - smal\ +l\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\ +\x00\x00\x03\xdc\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Link\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x04\xed\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Unlink\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x1a\x01\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Misc\ +ellaneous / Rese\ +t Physics State<\ +/title>\x0d\x0a Created with \ +Sketch.\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a <\ +/defs>\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \ + <\ +/use>\x0d\x0a <\ +/mask>\x0d\x0a \ +\x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x0b\xed\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Edit\ +or / Material\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x02\x9c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Vide\ +o Control / Play\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + <\ +/polygon>\x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x02q\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Tool\ +bar / Y\x0d\ +\x0a \ +\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x06'\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Align to o\ +bject\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a <\ +/path>\x0d\x0a \ +\x0d\x0a \x0d\x0a \x0d\x0a\ +\ +\x00\x00\x06H\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Tool\ +bar / Database v\ +iew\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\ +\x0a \x0d\x0a\ + \x0d\ +\x0a \x0d\x0a \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x04t\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 16\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\ +\x0a \ + \x0d\x0a \ + \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xaf\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ra\ +dio Button / On<\ +/title>\x0d\x0a Created with \ +Sketch.\x0d\x0a\ + \x0d\x0a \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02j\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ra\ +dio Button / Off\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\x8b\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ra\ +dio Button / On \ +- Disabled\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Selection-\ +Controls-/-Radio\ +-Button-/-On---D\ +isabled\x22 stroke=\ +\x22none\x22 stroke-wi\ +dth=\x221\x22 fill=\x22no\ +ne\x22 fill-rule=\x22e\ +venodd\x22>\x0d\x0a \ + \ +\x0d\x0a <\ +/circle>\x0d\x0a \x0d\x0a\ +\x00\x00\x02\x9b\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Selection Co\ +ntrols / Radio B\ +utton / Off-focu\ +s\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xee\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ra\ +dio Button / Off\ + - Disabled\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02\x8f\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Selection Co\ +ntrols / Radio B\ +utton / On-focus\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x03\x80\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / Off - D\ +isabled\x0d\ +\x0a Creat\ +ed with Sketch.<\ +/desc>\x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x03\xf9\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / On-focu\ +s\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x03\x9c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / On - Di\ +sabled\x0d\x0a\ + Create\ +d with Sketch.\x0d\x0a \ +\x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x03[\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / Off\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xe2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / Partial\ + Selected\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ +\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x03\x86\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / On\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x03[\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / Off\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xe2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / Partial\ + Selected\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ +\x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x03\xd8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Ch\ +eckbox / Partial\ + Selected\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ +\x0d\x0a\ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x03M\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Sw\ +itch / On\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ +\x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x03m\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Sw\ +itch / Off\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Selection-\ +Controls-/-Switc\ +h-/-Off\x22 stroke=\ +\x22none\x22 stroke-wi\ +dth=\x221\x22 fill=\x22no\ +ne\x22 fill-rule=\x22e\ +venodd\x22>\x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x03c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Sw\ +itch / On - Disa\ +bled\x0d\x0a \ + Created \ +with Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x03\xa7\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Selection Co\ +ntrols / Switch \ +/ Off-focus\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\ +\x00\x00\x03\x82\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ + Selecti\ +on Controls / Sw\ +itch / Off - Dis\ +abled\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x03\xb4\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Selection Co\ +ntrols / Switch \ +/ On-focus\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Selection-\ +Controls-/-Switc\ +h-/-On-focus\x22 st\ +roke=\x22none\x22 stro\ +ke-width=\x221\x22 fil\ +l=\x22none\x22 fill-ru\ +le=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \ + <\ +/path>\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x01P\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xcdID\ +AT8\x8d\xad\x94A\x0a\x830\x10E\xff\xc4\xe2&\ +g\xd1\x13\xb47\x11\x0a\xbd@\xf6\x1e\xc0\xbd\x90m\xbb\ +j\x0fR\xbc\x91\xe0\xa2\x05'\xdd\x18\x086\xda\xa9\xf1\ +\xaf\x92\xf0\xe7\xc1\x9fIBeY\x9e\x01\x1c\x9ds\x0a\ +\x1bED\x0c\xa0S\xa9 \x00\x98\xeaO*\x15\x14\x02\ +w\x01y\x1d\xa4\xc6\xba\xae/\xf3\xb3\xa6in\x9b`\ +\xbePk\x9d\x1bc\xaa\x98\xe7\xaf\x98\x1ed\xad}$\ +\xc1BP\xdf\xf7\xaf\x98G\x143\xcb2e\x8c\xa9\xda\ +\xb6\xbd\x0f\xc3\xf0^\xf2QQ\x14W)p\x1cG^\ +\xf3|\xc5\x0c\xa7\xa6\xb5\xce\xfd\xfe\x17(\x0a\x0bAk\ +\xcd\x16\xc3$\xcd\x8e):\x00I\xb3\xc50\x0f\xf4\xeb\ +\xf9M_\x92x\x9a\x12\xed\xfa\xd0\xd5\xf4\xb1%\x8b\x88\ +X\x01\xe8R\x81D\xc4\xcc\xfc\xfc\x00\xae5]\x09\xee\ +\xa3\xddA\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xa8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00%ID\ +AT8\x8dc`\x18\x05\xa3`\x14\x8c\x02R\x00#\ +2g\xf9\xf2\xe5\xffI\xd1\x1c\x19\x19\xc9HX\xd5(\ +\xc0\x07\x00\x9fC\x04\x02F\x11Y\x91\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01\xae\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01+ID\ +AT8\x8d\xad\xd41j\x84@\x14\x06\xe0\xf7L\xac\ +bj\x8b\xb1\xf0\x02z\x82\xcd\x01\x02\x09!\x8d\x96)\ +\x04\xad\xad\xc5i=\x82\x95'\xd86\x90:\xec\x05\xa6\ +P\x90%\x85E\x14,B\xc4\xa4J@\xd3(\x88\xeb\ +8\x10\xf7\x95\xe3?\x1f\xf2~\x14M\xd3|\x02\x80]\ +\xdf\xf7\x12\xfcs\x10\xb1\x03\x80\x83\xb4\x15\x02\x00\x18\xee\ +\xdfH[\xa1)x\x16h\x9c\x13\x8c\x10\xa2\x10B\x94\ +\xb5K\xbc\xcc\x09\x86\x88=\xa5\xd4\xd2u\xfdz\x09\xd2\ +4\xed\x8aRj\xc9\xb2\x8c\xf3g\x17\xaa\xaa>L\x0f\ +\xda\xb6\xfde\x8c\x1d\x83 \xb0\xd24}k\x9a\xe6g\ +\x0a\x85ahGQ\xb4/\x8a\xe2K\x88\xf1@\x11\xc4\ +\xc5\xe6`]\xd7\x95\xef\xfb\x8fk\xd0*6\x82UU\ +\xbd\xbb\xae{\x97$\xc9K\x96e\x1f\xbc,\xc0B\x01\ +\xd3!\x84(\x9e\xe7\xdd\xc7q\xfc\xec8\xce\xad\xa8e\ +\xee\x9b\x0d\xad\xd9Q\x14\xed\xf3<\xffd\x8c\x1d)\xa5\ +\xf6\xbc\x14!\xb6\xb4\xec\xb5\x96\xb9\xd8Zk\x22\x10\x0d\ +\xc3H\xa6\x07\xe3^\xca\xb2\xfc^\xde\x0c?s9\x0f\ +\xae!\xa2\xccy?\xf4\xe1\xc7\xb6y\x10\xb1\x93\x00\xe0\ +\xb0\x15D\xc4\xae\xeb\xba\xd7?\x0d\xc0\xd3\xa9\xf3\x9b/\ +w\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04\x9d\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03\x86iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 \ +\x8b\xfa\x86\xcf\x00\x00\x00\xadIDATx\ +\xdab\xfc\xff\xff?\x03\xb5\x00\x13\x03\x15\xc1\xe05\x8c\ +\x05]\xc0\xd1\xd1\x11D\xd9\x02\xf1a<\xfa\xc0\xf2\xfb\ +\xf7\xef'\xe82\x90\xc2C@\x5c\x8e\xc3\xa0r\xa8\xbc\ +-A\x97A]T\x0a\xc4\xddP~'\x9aA\x1dP\ +\xf9\xc3\xc4\x18\x06\x02=P\x1a\xd9@d\x83z\x88\x0a\ +3\x1c\x06:\x00\xb1\x07>\x83\x08\x19\x063\x10\x14#\ +^@\xbc\x0d\x9fA\xc4$\x8dr\xa8A[\xa0t9\ +\xb9\x86!\x87\x91/\x94\xee\xc0g \x0b\x11\x06\xf5`\ +\x09CF\xa8 \ +\x1d\x00T|\x00\x00\x00\xb1IDATx\ +\xdab\xd0\xf3\ +\xbcC\xdb\xb6\x17\x1b\xc8\x09\xeb\x80;\x00\xa5R\xea\x18\ +\xc7\xf1\xd9v;\x12\xd0Og\xacl\x9afo\x8c9\ +\xb9,\xcf\xc2\xde\xd6\x88(\xca\xb2\xec\x0a`c\xb3\x0c\ +\xfc\xdb\xa6\xab`\xdb\x8f\xde\x14\x11%\x22\xe1\x9c\xb54\ +M\x1f\x22\x12\xd6u\xfd\x9c\xda/\xf9,/\xd8\xb3i\ +\xc1\xef\xc3\xe7n\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\xae\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01+ID\ +AT8\x8d\xb5\xd4OK\x02A\x1c\xc6\xf1\xef\xac{\ +\x92\x08\xf6\x87\x9e+\xf4\x85D7\xdfM\xa2\x09\xbb\xed\ +vH\xfb\x89v\xb0\x17\x93\xe7z%\xf6\x02\x84\x852\ +=\xe5N\x870\xc2\xfd3`\xf5\xc0\x5c\x86g>\xcc\ +0\xc3\x98\x93\xb3V\xcf3t,x\x1c\x18\x03\x99\xc5\ +\xce}\xcf\xd0\xf1=s\xf15wp\xecG\x06\xbe\xb5\ +\xd4\xea\xf5\xfao \x00\xf3\xbaZ\xd7\x0e>ZQ\xfe\ +\x17\x0bD\x08D*\x17\x95ur\x98\x01T\x95f\xb3\ +Y\x08\x89\x08\xaa\x8a_\xab\xb9\xb14M\xb9\x8e\x22n\ +\x87\xc3\x1c(\x22\xdc\xa9r\x93$,\x97K7V\x06\ +\xba\xa0Rl\x1fl\xb7\xdbN\xa8\x12\xdb\x81\xf7\xd3)\ +\xbd~\x9f\x87\xd9\xac\x12rb\x81\x08W\x83\x01\x93\xc9\ +\x84\xcbn\xd7y\xcb\x1e\x80\xb567\x82 @UI\ +\xe2\x98\x97\xc5\x82(\x0cQU\x1a\x8dFa\xbftg\ +\x22\x82\x8e\xc7$q\xfc}\xb44M\x89\xc2\x90\xe1h\ +T\xfalrX\x11\xb4\x8b\x0b4\xa7g\xad\xa7\xe3\xa3\ +\xfa\xf9Ol\xb7\xb0,E\x9d\xb7\xf7\xcd\xb3\xbf_\xac\ +B\x5c\x1d\xcf\x18\xb6@\xe6\x14\xaa\x93\x19\xc3\xd6\xb7\xd8\ +\xf9j\xbd\xe1\x0f~\xda\xc7O\xf0=\xa3\xcd\xd6\xce\x84\ +u\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04\xaa\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x02\x00\x00\x00\xfd2\xa1\x9b\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03\x86iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 \ +\xdb\x84g-\x00\x00\x00\xbaIDATx\ +\xda\xd4\x93A\x0a\x84 \x14\x86+\xe6\x18I+=\x84\ +\xb4\xf6\x9a\xdeCZ\xb8\x90.Q\x90\xa2\x07\x99\x1f\x02\ +q\x9e\xd6@\xab\x19\x17\x8f\xf8|_\xf5~\xb1\xb7\xd6\ +v\x8f\xd6\xd0=]\xbf`\x86\x10\x9a}5\x1f\xc8\xb6\ +\xd6\xda9G\x9a@\xc0\x89\xfcaN\xd3\xa4\x94Z\x96\ +\xa5\x94\xf1\x0c\x02\x8e\xdd\xb2\xf9E^/\xa5D5\xc6\ +\xa0\xce\xf3\x9c\xb5\x93\xdf\x99\xa5\xec\xbd\xdf\xf7\xbd\xa9\xb5\ +\xcdS>\x8ec\xdb6\xceyS\xbb<\x15\xfc$4\ +!\x04j\x1d\xd8\xe57\xcb\xd9\xd6u\xcd3\x7f1I\ +$$\xb0K3\xc6X'\x99e\x9c\x0ac,\xf3\x9e\ +\xdc\x95\x94\xd28\x8e\xf5\x085\xa7\x095\xb5&\xff\xaf\ +[\xf6\x16`\x00Z\xe6l\x8b\x91Ypd\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01\x8a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x07ID\ +AT8\x8d\xad\x94Mn\xc20\x10\x85\xdf\x18K\x96\ +R\xda\x1e\xa1D\xb9\x08\xea\x8e\xe3`o\xca\x05H7\ +\xc4\xe1.e\x0dW\xa2!D\x91\x8a\xa7\x8b\xca\x886\ +?5\x81\xb7\xf3\xcc\xf3\xa7yc\xc9\xf4\x12'F\x10\ +f\x0c\x08\x0c\x14\x01\x8e\xc1\x1b)\x083)\xe8\xf5\xa7\ +6X\xfc\xe5\x00\xc9\x8cQ\x14E\xb7\x80\x00\x80\xf6E\ +9\x1a\x1c\xadMw\x85\xc9P\xe3\xdbb\xd1\xa8\xbd\xa7\ +\xe90\x98\xbf\xa8\x94\xc2\x5c\xebV\xcfU1=h\x9d\ +\xe7\xb7\xc1.AUU\xb5z\x82b\x0a!0\xd7\x1a\ +6\xcbP\xd7u\xa7\x8f&q\xb2}~|\x98\x86\x00\ +\x9ds\x9d\xfd}Q\xee\x1a1/_M)u>\xf7\ +\x81\xbc$\x000\xf3\xaf\x223\x9fw\x94[\xdb\xe8w\ +N\xdfVTJA\x1b\x83\xdc\xda\xceewN\xf6W\ +\xda\x18d\xabU\xef\xb2\x83a\x1e\xe8\x95.\x97A0\ +\x9a\xc4\xc9\xf6i\x1cM\xaf\x1a\xa1E\x9f\x87\xe3N\x10\ +\xe1\x04\xe0\xff\xa7\xea\x97#\xc2I2xS\x94G\xdc\ +\xe1\xa7\xfd\xf8\x06\xf1\xd9_\xee}\xa0\xcd6\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x04\xa6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x02\x00\x00\x00\xfd2\xa1\x9b\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03\x86iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 \ +n\xc6\x9f\xa3\x00\x00\x00\xb6IDATx\ +\xdab\x9c5k\x16\x03Y\x80\x89\x81\x5c0\x10:Y\ +\xf0\xc8\xfd\xfe\xfd{\xfb\xf6\xed\x10\xf6\xb7o\xdf\xfe\xfd\ +\xfb\x17\x15\x15E\x94NVVV??? \xe3\xc1\ +\x83\x07'N\x9c`aa!\xcd\xb5\x10m\x16\x16\x16\ +<<<$\xe8\x84kSPP -\x84\xee\xdd\xbb\ +\x87U\x1b\xba?\x81A\x02\xf4\x1b\x84\xfd\xff\xff\x7fF\ +FFGGG \x09\x11quu\xc5i\xe7\xee\xdd\ +\xbb\xe1\x8e\xdc\xbf\x7f?\x90\x01\xd7\x06\x090\x02\xae\x85\ +\xf8MII\x89\xb4\x94\x80'H\xf0\xe9\xfc\xf2\xe5\x0b\ +\x91\xda\xd0C\xe8\xcf\x9f?LLL\x97\xc0\x00\xc8\xf5\ +\xf4\xf4D\xf3\x1bN\x9d\xc8\x89k\x98\xe52\x80\x00\x03\ +\x00\x94\xc6M\x8eh\x12a^\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x00\xee\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00kID\ +AT8\x8d\xed\xd4\xb1\x0d\x80 \x10\x85\xe1\xff\x11\xd7\ +\x81\x09t\x16\x13\xc7`\x00\xb6\xd0]\x0c{\x1d6\x98\ +\xd0*t\xfa\xbaW\xdc\x97\xcb\x15\xa7\x10\xc2\x0a\xcc\xa5\ +\x14\xc7\xcbH2 \xbb^\x08\xa0\xce/\xae\x17j\xc1\ +!\xd0\x9d\x1f\xfb\xb1ocS[b\x8c\xdb\x93\xe1\x94\ +\xd2\xd1vy\xef\xf7\x11[\xc1\xe8\x9b\xd5\xc7\xd6\x1dI\ +\xe6\x80\xdc\x0bJ23;/\x8do *Pe\x12\ +\xd3\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00p\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x007IDAT8Ocd\xa0\x22`\xa4\ +\xa2Y\x0c\xa3\x86\x91\x1e\x9a\xa3a6\x1af8B\x80\ +vI\xc3\xc1\xc1\xe1?)\xc1~\xe0\xc0\x01\x14\xc7\xd0\ +\xcee\xa4\xb8\x0a\x9b\xda\xc1\xeb2\x00\x9c\xf8\x04\x14=\ +\x9ff\xe9\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01D\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x02\x00\x00\x00\xfd2\xa1\x9b\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00\xd9IDAT8O\x85\x93Q\x16\ +\x83 \x0c\x04\xd5Sz6/\xe0-\xb5\x1b\x06\x97\x12\ +\xb0\x9d\x0f^\xb2\xec\x12*\xaf\xebq\x1c\xcb\xc0}\xdf\ +\xeb\xba\xaa`U[\xe4\x86\x94\xad\x96=\x04\xc4u]\ +\x8e\xa5b\x92\xb4Cy\x1f!\x5c\xab\xd8\x04\xcd7\x88\ +\xca\xfb\x88\x04[\xaf3\x99\x10C\x1f\xcaf\x1d\x18+\ +\xbd `h\xe3\xf0\x07\xb5\xce\x8b\xc9L\x90\xc9n\xc3\ +\x16tI\xac\x86[\xd5f\xa0}\x8cd\xfa\x91\x81:\ +\x13\x9f\xdd\x7fcb\xf3\x0d)\x94\xb1\xf2F\xdcP\xaf\ +\x22+\x0f\xe8g\x1c\xc3\xc5\xd9@\xcc\xb75\xe80*\ +\xa2}\xa1\xc4\xa8\x17\x7f#\x92\x1c\x99Hz1w\xd4\ +\x7f\x99\xf6\xce\xf3DJ\x90\xd4\x9fF\xf5\xbe\xefZ5\ +?$%\xb5\x16\xcf\x04L\xb5y\xe0\xe6\xf1m\xe3G\ +\xf4\xb0-\xa6\x87\x22\xd6\xf7L\x8e\xa9\xd8\xb1,\x1f\xb1\ +\xb6\xbf\xa0/\xb4c>\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x00\xc4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x8bIDAT8O\xed\x94A\x0e\xc0 \ +\x08\x04w\xfbn\x8f\xfeK|XK\xa3\x11Coj\ +\xbd\xb5\x5cL\x94\xdd\x0c\x18\xa0\x88\x9c\x00\x0e\x92(\xa1\ +\xaa\xf5\x1c\x8d\xa2k\x1a\xa5\x88t\xb5{\x18\xf5\x82\x87\ +`\xceY\x8b\xf3,\x99\xd7\x98\xb6\x9a\x19\x86\x95\xe8\x13\ +\x87\x11\x01<\xca\x9c\x11z\x80N\xe6{\xb6Jd\xc6\ +\xaf\xc9|5\xbf\xd9\xfc\xdf~\xb1g1\xc6\xa9F\x85\ +\x10\x1e\xf9[zf\x93\xb3w\xd0WW\x90-\xd2>\ +\xe4$\x98R\xba\xd8nV\x96c1m\xba\xeb\x06\x11\ +\x8c{\xc4\xb5m\xb0_\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x04\xa9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x02\x00\x00\x00\xfd2\xa1\x9b\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03\x86iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 \ +\x8c\x19w2\x00\x00\x00\xb9IDATx\ +\xda\xd4\x93\xc1\x0d\xc3 \x0cE\xd3\xa8\x1b\x10\xe5\x00\x13\ +\x84\x1bSdGfa\x078\x91\x0d\x88@\x0c\xd1/\ +EB\xd4@+\xe5\xd4r\xb0\xd0\xb7\x1f\xe0o\xf1\xd0\ +ZO\xb7\xd6<\xdd]\xbf@\xa6\x94\xbau\xad>\x93\ +\xb41\xc6{O\x8a\xa0@'\xf0\x1b\xb9\xae\xabR\xca\ +9W\xc3\xd8C\x81\x8el]\xfc$\xc7o\xdb\x86h\ +\xadE\x94R\x16\xec\xd2?\x915\x1cc<\xcf\xb3\x8b\ +\xf5\xc9\x0b\x06\x16B\xe0\x9cw\xb1\xe1T\xf0H`B\ +\x08\xc4\xd6\xb0\xe1\x9duo\xc7q\x94\x9e\xbf\x90\xc4\x12\ +b\xd8\x90\xcc9\xb7N\x16\x18SY\x96\xa5O\x22\xb1\ +\xef;c\xac5\x0c\x18\xd1\xa9C-6\xd2\xff\xeb\x97\ +\xbd\x04\x18\x00\xb5\xcbgZ\x1ck\x94\xbb\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x04\x91\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03\x86iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 \ +\xccG\x12x\x00\x00\x00\xa1IDATx\ +\xdab\xfc\xff\xff?\x03\xb5\x00\x13\x03\x15\xc1\xe05\x8c\ +\x05]\xc0\xd1\xd1\x11\x9b:^ \xbe\x80\xc4\x97\x06b\ +\xf6\xfd\xfb\xf73\x92\xe3\xb2\xcf@\xac\x0c\xc5u@\x0c\ +2\xe4+\xa5\xde\x8c\x06\xe2y@\x9c\x0c\xc4\xf7(1\ +\x0cfP\x12\x10/\xa1$\x02@\xdeJ\x84\x1a\xb4\x94\ +\xe8\x08\x00\x02> \xfe\x84f\xe1? v\x83\xd20\ +`C\x8c\xcb\x8e\xa0ym\x17\xd4e\xff\xd0\xd4}\x22\ +\xc5\x9b\xb00Z\x00\xc4\xff)I\xb4\xc8\xb1\xb6\x84\x92\ +\x1c\xa0H\x8eA\xb8\x0c\xe3\x81z\xab\x11\x88\xefB1\ +/QQ>Z\x04\x91\x0c\x00\x02\x0c\x00\xb9`#m\ +?\x83\x07\x0b\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\x16\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\x93ID\ +AT8\x8d\xed\x94\xb1\x0d\xc2@\x0cE\x9f\x9d\xabN\ +\x88\x15 \xca\x22\x88.\xf3P\x91\x01\xc2B\xa4\x86\x95\ + $\x159S \x0a$(\xb8\xbb\x82\x22\xaf\xb3%\ +?\xf9\xbb\xb0\xac\xcaj\xa7Bm\xa0D\x22\x10\x0c\xeb\ +\x9c\x0a\xb5S\xd9>{\xd1\xd8=\x803\xa3\xf0\xde\xa7\ +\x88\x00\xe4\xd2\x0fEt\xb4O\xcc\xb2Y\xf6\x05\x07`\ +fYd\xff\x1b3\xff\xcd^\xec\x9b\xe6\xa7\xe1C\xdb\ +\xbe\xd5\xb2.\xab\xd3r\xe17\xa9[]o\xe3YE\ +\x98\x80\x90\xe8\x0a\x22L\xce\xb0\xae\x1fF2|\xda\xe3\ +\x03Yl'\xed\x84/\xad\xf6\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x00\xb9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x006ID\ +AT8\x8dc`\xa0\x1002000\x9c9s\ +\xe6?\x03\x03\x03\x83\x89\x89\x09#L\x02&\x86\x0f\x98\ +\x98\x9802Q\xea\x82\x81\x07\xa3a0\x1a\x06\x0c\x0c\ +\xc3\x22\x0c\x00\xc5\x9e \x0d2\x09]\x1d\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01\xc8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01EID\ +AT8\x8d\xa5\x92\xadK\x04Q\x14\xc5\xcf\x19F\xf0\ +O0m\x14\x0d\x0a\xb2o\xc1$L0\x89I\x04\xd3\ +D1\x08\x82\xc9\xa0,6-\x16\x8by\x8b\xc2\x06\xc1\ +h\x19\x83E\xb8\xb3\x06\x83 \x08\x83v\xb3\xb0\xf0\x8e\ +egy\xce\xce\x08\xeaM\xef~\xfd\xb8\xf7\xbc\x0b\xfc\ +\xd3\x08\x00f&\x00\xa7\xce\xb9\x83\x9f\x8a%E\x83\xc1\ +`\xc9{\xbf\x0e`\xa1\xd3\xe9lDA~+\xcf\xf3\ +nSs\x96e\xd3fv+\xc9HvI\xbe\x03@\ +\x08X\x91\x94\x9a\xd9I\x1d I\x92\xcf(\x8a\x9eK\ +\xdf{\x7f\xfd\x0d\xe0\x9c{\x03\x90\x00\xd8\xac\x83\x98\xd9\ +\x91\xa4]\x00\xe7$o\x8a\xa2\xb8\x0f\x93\x0a\xde-3\ +{\x0d!f\xb6cf\xde\xcc\x0eG\xfeT\x99\x1b\x8b\ +\xe8\x9cc\x08\x01\x90\x01\xe8\x93|\x90t\x05`\xcf9\ +wQ\x9d,\xaa\x06*\xeb\xa4\x00.I\xa6u\xcd\x8d\ +\x00\x00\x904\x03 \x96\xf4\x01`\xae\xa9\xae\x16\x90\xe7\ +\xf9<\xc9\x9e\xf7~\x0d\xc0\xb2\xa4\xb4\xe9\x8b\xc3C\xba\ +#y6\x1c\x0e\x1f\xe38\xee\x03\xd8v\xce=\x8d\xf2\ +-\x00\x19\xc9^\xbb\xdd>n\x02\x94\xa3\xbf\x90\x5c\x1d\ +\xe90\xb6&\xc8\xc4\x0a$gI.V\xe3\xa5\xb0\xd5\ +uj5\x90\xb4_\x17\xaf\x83L\xac\xf0\x1b\x0bo\xe7\ +\xcf\xf6\x05\xa5\xb8\xadnR\xfe\xeb\x83\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x02K\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x102\x19p+;\xef\x00\x00\x01\xd8ID\ +AT8\xcb}\x92\xb1\x8b\x13A\x18\xc5\xdf7\xb3{\ +\x22\x84\x90Fl\xd2\x5c\xa1`\xe1n\xb2\x89\x17\xed\x82\ +\x85\x07I!X\x1cX\x1f\xfe\x03Vi\xfc\x03\xbcZ\ +,\x05\x0b\x0f\xb19-b\xe7\x81(\x98\x90\xcdn\xb2\ +Q\xb0\x8ax\x04ADI\x10\xe4 \x99}6Q\x96\ +d.\x03S\xcc\xcc\xfb\xde<\xbe\xef'\xb0\xacn\xb7\ +\xbb\xad\x94j\x89H\x03\xc0E\x00\xdfE\xa4\xbdX,\ +\x1e\xd6j\xb5/Y\xadZ-\x1e\x0c\x06\xbb\xae\xebv\ +\xb4\xd6\x13\xadu=\x97\xcb\xe5\xb4\xd6u\x11\xf9\xe6\xba\ +n'\x8e\xe3[Y\xbdd\x0f\xfd~\x7f[D:J\ +\xa9\xdb\xa5R\xa9\xb3j>\x1c\x0eo\x18c^:\x8e\ +\xb3\xe3y\xde\xd7\xb5\x04\x22\xd2\x02\xf0\xc8V\x0c\x00\xbe\ +\xef\x7f\x10\x91\xc7\xc6\x98\xd6\xbf;g\xc5\xa0\x01\xa0\x8e\ +\x0dKD\x9e\x91|sV\x0f.\x14\x0a\x85\x09\x00$\ +I2\xca>$I\xf2\x09\x00f\xb3\xd9d\xd9\xd8\xf5\ +\x04\x00N\xa6\xd3\xe9e\x00#\x92\x838\x8e_(\xa5\ +~\x93\xdc2\xc6t\x01 \x9f\xcf_\x02pbM \ +\x22G$\xef\x01\x801\xe6\x09\xc9\x91\xef\xfb\xfb$\xdf\ +\x19c\x9e\x02\x00\xc9}\x00\xaf\xac\x06\xc6\x98\x03\x00{\ +a\x18^-\x97\xcbo\x01\xdc\x04\x804Mw\xc7\xe3\ +\xf1\xfb(\x8a\xae\x00\xb8\xab\xb5>\xb0\x1aT*\x95\x9f\ +K\x80\x0e\x93$9O\xf2s\xaf\xd7\xbbF\xf2O\xb1\ +X\xdc\x22y\xa8\x94z\xe0y\xde\x0f+\x07\x19\x1e\x9e\ +\x93\xfc\x08\xe0\xd7\xb2a\x86\xe4\xa9\xd6\xfaz\x10\x04w\ +\xb2Z\xc7f\xe0\xba\xee\xfd\xf9|~Dr\xe7\x7fT\ +\xa5\xbaJ\xa9\xbd\xb5\xb1\x9e5\xef(\x8a\xd24M_\ +\x03h\x03h*\xa5\x1aA\x10\xac\xa1\xefl\x00\x06\x00\ +\x9a\xcb\x0d\x11\xa1M\xe7l\x80\xeeXDNI\xb6E\ +\xa4\x09\xe0\x9c\xf5\xa3M\xd8\x86a\x18\x01(\x03\x88\xab\ +\xd5j`\xd3\xfc\x05\xaf\xcb\xb8\xd6|\x0e\xa9\xd6\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02!\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x9eID\ +AT8\x8d\x95S=hSQ\x14\xfe\xbe\xfb\xa2\xbc\ +*drs\xb1\x83\x8bE\xe2p\x82\xe0\xe0*\x88c\ +G;\xb9\x09--\x1d2\x14\xacS\x84b\x17\x11\x5c\ +\x04\x07\xc5I\x1d]D2\x88\x1a\xbc\xe7FB\x09\xb8\ +\xc4\xcd\xa5\xddRDyI\xeeqyO^\xd2(\xc9\ +Y\xce\xe1\x9c\xef|\xe7\xef^`\x01i\xb7\xdb\x17U\ +\xf5\xd0{\xbfZ\xf8\xdc\xbc\xc9\xaa\xba]\xa9T\xba\x00\ +\x0e\xea\xf5\xfa\xab\xc2_\x99#\xf1\x8c\x99\xbd5\xb3\x15\ +3\xbb\xe6\x9c\xbbQ\x8e\xb3\x04\xb4y\xbb)DD\xfe\ +\xe6CU\x1b\x85mf.\x84\xf0<\x84p\xac\xaao\ +\xa6:j\xe4\xba\x09\xcc\xd8A\xa7\xd3\xb9\x14B\xf8a\ +f\x97\xab\xd5\xeay\x00\xdf\xfe\xd7\xc5\x09\x82\x18\xe3'\ +\x00\x0fE\xe4\xca`0X3\xb3-U\xbd;7\x01\ +\x80\x07\x22\xb2\x9f\x8f\xb2K2\x05\xb0\xbb\x08AY~\ +M\xe9\xc5\x08H\xee\xe5\xe6\x1e\x00x\xef\xef\x90\x5c\xf7\ +\xde\xdf\x9c P\xd5S\x00\xae\xf7z\xbd\xd3E \xb7\ +\xcf\x01\x18\x02\xb8\x1aBxGr3\xc6x\x8f\xe4#\ +\x00\xb7Z\xadV\xca\x9c\xf91\xc9U3\xfbJ\xf2\xa3\ +s\xee}\x8c\xf1\x05\x80\x0bE\x11\x92M3\xbb/\x22\ +\xc3n\xb7{v4\x1a=\x050t\x00\x90$I3\ +\xcb\xb2e\xe7\xdc\x11\xc9\x8d\x18\xe3k\x92_\xa6F\x5c\ +\x12\x91!\x00\xd4j\xb5\x9f\xfd~\xff\xf6x<\xdea\ +\x09\x003s\xaa\xba\x9f$I3\xc6\xb8\x0d\xa0Q\x0a\ +?\x11\x91\x13\xe7\x9c\xf8\x0b$#\x80-\x00\x08!|\ +7\x9bx\xdd\xfdY\x8b\xfe\xe7\x15\xd24}\x09\xe0\x03\ +\x80\xdff\xf69\xcb\xb2g\xb3p\x7f\x00\xbb\xda\xb9%\ +\x1f=\xaeP\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x03%\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1c\x0c\x06 +1\xd2\x8f\x00\x00\x02\xb2ID\ +AT8\xcbm\x93OhcU\x14\xc6\x7f\xf7\xdc\xa4\ +\xc1v\xa3nFA\xad\xc2\x04\x0ay\xe4\x12\x92WI\ +\x90\xda\xd8Y(\xb8w9\x9b)\xe3\xde\xd9\x14\x04\x15\ +\xd4\x85t\x10W\xca\xf8oV\xedRW\xae\xb4e6\ +\xcd\x22/\xad7\xc9P\xe1\x8dvh7:2\xb5P\ +hm^\xee\xd1\xc5\xbc\x07\x03\xfam.\xdf=\xe7;\ +\xf7~\xe7\xdec\xc8\xb1\xb3\xb3C\xa7\xd3!I\x92\xcb\ +\xc0\x0d\xe05\xe0\xc5<|\x1f\xf8\xc9\x18s\xb3\xd9l\ +\xde\xdb\xde\xde\xa6\xdb\xed\x02`\x00\xfa\xfd>q\x1c3\ +\x1c\x0eo\x87\x10\xae\x86\x10\xb0\xd6\x22\x22\x7f\x03\xaa\xaa\ +\xb3\xc5\x9e\xb5\xf6\xabz\xbd\xbe:\x18\x0ch6\x9b\x98\ +\xe2d\xef\xfd\xcf\xaa\xea\x8a\xc4r\xb9\xfcn\x14E\x1f\ +\x01\x8cF\xa3W\xa7\xd3\xe9w\xc0S\x00\x222p\xce\ +\xb5\xd24E:\x9d\x0e\xc3\xe1\xf0\xb6\xaa:\x00k\xed\ +gsssO\x14b\x1e]\xe1N\xa3\xd1xZD\ +\xbe\xcfy\xd3{\xffE\xb5Z\xc5$Ir\xd9Z\x9b\ +\x02\xd3\x99\x99\x99gj\xb5\xda\xc3^\xafG\xbb\xddf\ +\x7f\x7f\xffR\x08A\xa3(\xfa3I\x12Z\xad\x16\xde\ +\xfb+\xaa\xfa-\xf0\xdct:\x9d\x17\xe0F\x08\x01`\ +\xbdV\xab=\x04h\xb7\xdb\x8c\xc7\xe3\xf7&\x93\xc9\xef\ +Y\x96=\xd8\xdd\xdd\xfdz~~\xde\x1c\x1e\x1e\xe2\x9c\ +\xfbQD~\x08!`\x8cY\x93\xbc\xdb\x00\x7fln\ +n\x020\x18\x0c\x88\xa2\xe8\x83J\xa5\x12\x95\xcb\xe5\x0f\ +\xad\xb5\xaf\x1c\x1d\x1d\xe9\xf1\xf1\xf1\xeby\xee?\xf9\xda\ +5I\x92L\x802\xb0k\xad\xbd\xd2h4\xfe\xe2\x7f\ +\xe0\xbd\xbfT\xa9T\xaeeY\xf6\xac\xaa\xbe\x9ceY\ +\x0b\x98<^\xe0\xe3R\xa9\xf4\xab\x88\xbc%\x22wJ\ +\xa5\xd2\xc6\xc2\xc2\xc2}\x80\xc2\x7f\x81\xbd\xbd\xbd/C\ +\x08\xd7\x80\x89\x00\x07y\xf7\xb3\x93\x93\x93o\xce\xcf\xcf\ +\xdf\xc8\xb2l\xe5\xe2\xe2\xe2\xc0{\xff\xc0{\xff\xe9\xec\ +\xeclT\x88\xfb\xfd>\x22\xf2KN\x0f\x04\xd8\xca\xc9\ +\xcc\xf2\xf22\x22\xa2\x8dFc\xa5T*\xb5\x80\xbb\xc0\ +\x8a\x88\x14\x9e\x89\xe3\x18U]\xce\xe9\x96\x18cnZ\ +k\x01\xd6\xbc\xf7\xef\xc7q\x0c\xc0\xd9\xd9\xd9\xc09\xd7\ +u\xce\xd5OOO\xef\x16\x05F\xa3\xd1;\xc0\x9b\xb9\ +f\xdd\x00\x0c\x87\xc3\xc2\x13\x22rf\xad]\x8d\xa2h\ +\xa3\xd7\xeb\x91e\x19KKK\x8c\xc7\xe3\xd5\x10\xc2'\ +\xaa\xfadn\xf9V\xbd^\xbfn\x8a\xc1\xf0\xde'\xaa\ +\xda,\xbe2p\xcf\x18sUU\xc5\x18\xb3\x01<\xff\ +\xd8\x8c$\xce\xb98M\xd3G\xc3T\x0c\x86\xf7\xfes\ +U};\xffX\xffA.\xbe\xe5\x9c\xbb^\xbc\x8c)\ +\x82i\x9aR\xadV\xe9\xf7\xfb/\x18c\xd6\x80.\xf0\ +R\xd1m`KU\xd7\x17\x17\x17\x7f+r\x01\xfe\x05\ +m\x80K\xc2&\xa7k\x1b\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\xc1\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x11\x009\xa7\xf7%a\x00\x00\x02NID\ +AT8\xcb\x85\x93?h\x14Q\x10\xc6\xbf\xf7\xde\xb2\ +{\x82\x85GRE\xc2\x99\xe2X\x17\x89\x07\x81\x14\xc6\ +JC\x0a-l\xb5Q\x90(\x12\xc4\xa0bl\x02)\ +$\xa4\x13\x09Q\xb48\xff4\x96\xb6\x0a&\xd8\x9dB\ +86\xb7\xb9\x8d\x97\x0dIp1\x9c\x17\xb8j\xcf\xe3\ +!\xa2[\x00H\xd3\xb4\x82\x10b\x03\ +\x80`\xe6l\x14Eg\x01\x08!\xc4\x8bt:}?\ +\x93\xc9\xfc>0\xa8\xd5jF\xb5Z\xfd\x00\xe0\x9cR\ +*\xaf\xeb\xfa\x8ceY?\xe2/y\x9e\xd7\xd7j\xb5\ +f\x89\xe8:\x80O===\x17\xba&p\x1c\xe7\xb9\ +m\xdb\xbc\xb6\xb6v\x1b\xff\x09\xd7u'm\xdb\xe6r\ +\xb9\xbc\x00\x00\xa2X,\x0e*\xa5JR\xcaW\xb9\x5c\ +\xeef\x1c\xde\xde\xdeN\xb7\xdb\xed\x9f\x96e\x85q\xdd\ +q\x9c\xd7Dt5\x0c\xc3\x9c\x040\x0e\x80t]\x9f\ +\xe9\x02\xeb\xeb\xeb\xfd\xab\xab\xab\xd5 \x08\xea\xedv\xfb\ +W\xa5R\x99\x8f\x1b\xa4R\xa9i\x00\xac\x94\x1a\x97\x00\ +\xc64M+\xc4\xffl\x18\xc6\x11M\xd3\xde5\x1a\x0d\ +\x83\x99\x1f\x12\xd1D\xdc\xc04\xcd\xaa\x94\xf2\x0b3\x8f\ +i\x00\xfa\x85\x10\x858000\xb0\x01\xe0N\xa7\xdc\ +\xd3\xcc\xdcH\xf6B)\xe5\x85axY\xfe\xaba\x95\ +J\xe5\x11\x80+\x86a\x5c\xfa\x1b#\x01|\x8f\xa2\xc8\ +<,\xb9\xb7\xb77\x05\xe0n6\x9b-\x1c\x92;\x09\ +\xc0\x97\x00\x16\x99y\xc4\xf3\xbc\xbe$DD\x0b\xbd\xbd\ +\xbdo\x93\xfa\xe6\xe6\xe6q\x22:#\x84X\x94\xcc\x9c\ +\x07 Z\xad\xd6l\x1c\xda\xd9\xd99*\xa5\x9c\x0a\x82\ +\xe0|\xd2\xa0\xd9l\xce\xe1\xcfX\xe6\x01\x00\xa5R\xe9\ +\xa9m\xdb\xec\xba\xeed\x1c\xdc\xda\xda:\x96\xbc\x5c.\ +\x97\xef\xad\xac\xac\xb0\xe38\xf3\x07\xa3\xec\xfb\xbe^\xaf\ +\xd7\xdf\x0b!F\x95RoR\xa9\xd4\xb4i\x9a\xd5d\ +\xd9\xcdfs\x8e\x88\xae\x09!\x96\x0c\xc3\xb8hYV\ +x\xb0L\xbe\xef\xebA\x10<\x8e\xa2h\x02\x00\xa4\x94\ +\x9f\x95R^\xa7a&\x11\x8dt\xf4g\xba\xae?\xe8\ +N\xa7H\x96\xb8\xbc\xbc|J)5\xce\xccc\x89u\ +\xfe(\xa5|944\xf45\xce\xef\x03\x1cD\x0d\xef\ +Z\x15\xffI\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x02\x0a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x07\x04\x171;\x89\xed\xa1\x06\x00\x00\x01\x97ID\ +AT8\xcb\xcd\xd21k\xdb@\x14\x07\xf0w\xef\xc9\ +\x92\x88!.\x89*b[N\x09\x01\x0fN\xe4)c\ +\x9c!K\xb6xI\xc0\x19\xb2\xa5\xa4C\xfb9\x02\xfd\ +\x02\x85v\xea\xd2\xa5\x85\xd2@\x07cu\x08\xf1Z\x9c\ +\xd8\x02c\xc8\x16\xb0 \x1e\xbaUA\xb9{\xd7\xc9 \ +\x8c\xad\xb5\xf9Ow\xc7\xdd\x8f\xf7\xee\x0e\xe0\x7fG\xa4\ +'A\x10X\xae\xbb\xf6\x16\x00O\x00\xf4+\x00x\x00\ +\xd0\x97\xb6m\xbe\xafV\xab\x7f2\x81 \x08\xac\x95\x95\ +\x97\xdf\x00\xa0\x81\x88\x1d\x22\xbcQJo0\xab&\x00\ +\xdc\xdbv\xee\xa0V\xabMf\x01c:p\xdd\xe2;\ +)e\xc30\x8c\xd7\xf5\xfa\xd6\xd7\xe9\xfa`\xd0\xff\x90\ +$\xfag\x92\xf0\x05\x00\x9c\xcd\x02\x98*\xa6\x85\x88\x9d\ +\xf4a\x00\x00\xdf\xaf\xff&\xa2\x8f\xcc\xeap4\x1a\xe5\ +3\x00\xbd\x8eH\xb7\xf3\xfa$\xc2\x1e3\x9bI\x92\x14\ +3\x00\x98h\xcd\x1b\xf3\x00\xa5\xd4&\x22j!`\x9c\ +\x05\xfcPJ\x1d\xf6z\xe1NzC\xbf\x7fWd\xe6\ +7B\x88\xf6\xf6\xb6\xffw\xe1+\x0c\x87\xc3\x17q\xfc\ +\xf4\x0b\x00\xca\x88\xf0\x89\xc8\xe8I\xa96\xb5\xe6sf\ +v\x10E\xd7\xf3J\xc7\xae\xeb\xc6\x0b\xffA\x18\x0e\x1c\ +)\xe1\x82\x99\x9b\xccl\x22\x0a-\x84h3\x8b%\xad\ +\xe5\x1e\x11^\x95\xcb\xa5V\x1a\x11\xf3z\x0e\xc3\xc1\x92\ +R\xb95\xcfs\xa2\xd5U'\x8e\xa2\xb1\x1dE\x93/\ +\xcc\xbcO$\xae*\x15\xaf\xe58N\xbc\x10\x98\x97n\ +\xf7\xda\xce\xe7\x0b\x9f\x95\x92\x07\x96e\x07\xbe_;\x9a\ +\xbd\xc4\xcc\xec\xee6\x1e\x0b\x85\xfc\xa9iZ\xdf\x89h\ +\x19\x9eM\xfe\x01y\xa7\x99\x0c\xb2t=\xd2\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x03B\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xbfID\ +ATX\x85\xed\x96MH\x14a\x1c\xc6\x9f\xff\xbb#\ +k*\x95e\x18\x0b\xd1\xc1\x08B\x85\xd8\x9d\xc3\x96\xa7\ +-%\x91\xce+H(\xd4):u\xcaK\x97\xe8(\ +x\x91\x08:\xa4P\x1d\x96\x0e\x11$+\x04\x0b^\xf2\ +cv4E/\x85\x1e\x04m\xb7\x05?\xf6\xb29;\ +\xfbt\xd8\x8f\x16\xd9\x8f\x91U\xbb\xf8\x9c\xde\xff;\x0f\ +\xff\xe77\xef;3\xef\x00\xa7:\xd5\x7f\x9685\x92\ +\x14\xd34\xbd\xa4\xea\x10A3 \xbbdz\xd5\xe7\xf3\ +\xcd\x8bH\xe6\xd8\x00H*\xd3\xfc>@\xf2\x19\x80+\ +%\x1c[$F\xd6\xd7\x7f\x8e\x07\x83A\xfbH\x016\ +66\xce\xc4b\x897\x00\xeeWm$\xf2\xd5\xb2R\ +\x0f\xfd~\xff\xdea\x00T\xb9\x0b$\xd5\x81\xf0\x04 \ +/\x94\xe2m\xc0\xbe\x06\xb8\xfc\x80<\x07\xe4W\xce\xdf\ +\xadi\xee\x89H$\xa2\x1d\x06\xa0\xec\x0aD\xa3\x8b\x0f\ +H\x8e\xe5JS)\xf6{\xbd\xde\xdf\x07}\x0b\x0b\x0b\ +\xe7m\x1b\xef\x01t\x01\x80R2\xec\xf5\xde|]\x13\ +\x00I\x89F\x17\x97\x90\xdd\xf3\x84R\xbcU*Y\ +ZZj\xae\xd4dee\xa5\x89\xc4\xd3\x5c\xb9\x93L\ +nO\xd7\x04 \x22\x19\x12#\xd9\x8a\x97\xf7\xf7\xedw\ +\xd9W\xadtx*e\x8d\x03\xb8\x9a\x9b\x1a\x0b\x04\x02\ +)\xa7\x00e?D\xa1P\xc8\xd5\xd6v=D\xf2n\ +njS\x04\xa3\xb6\xad\x85\x1b\x1bU\xcc\xb2\xacK\xb6\ +\xcd\x9e\xdc\x9d\xe7\xc3A2\xdc\xd0\xe0\x1eloo\xdf\ +\xaf\x09\x00\x00fff\xcej\x9a{\x1c\xc0\x1d'\xcd\ +\x0aME\xc2\xb1\xd8\xe6P__\xdf\x9fj\xde\xb2g\ +\x01\x00\xf8\xfd\xfe\xbddr'\xa8\x94\x0c\x03H\x94\xb1\ +\xed\x00x\x09\xe0K~\x82dok\xabgbrr\ +\xd2]\x15\xb6\x9a!/\xc30\xeaHW\x97R\xd2\x91\ +\xc9\xb0E\x84I@-'\x93\xdb\xd3\x81@ e\x18\ +F\x1d\xe0z\x8b\xa2\x93SD\xa6b\xb1\xcd\xc1J+\ +\xe1\x18\xc0)d\x09\x88p}}]\xd9g\xa2\xe2\x16\ +\x1cV\xba\xae[kk?\x86\x00\xf9\x98\x9f#\xd9\x9b\ +JY\x1f\x22\x91H\xfd\xb1\x03\x00@\xf6\xaf(\xfdX\ +D>\x17At755\x0f\x9c\x08\x00\x90]\x092\ +\xfd\x08\xc0\xa7B\x90\x82\xa33\xe5HER\xcd\xcdE\ +\xfbgg\xa3\xf7N<\xfcT\xa7r\xaa\xbf\xf4Z!\ +p(\xce\xc5\x8f\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x03%\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x10\x13\x08\x96\x04\x0e\xfe\x00\x00\x02\xb2ID\ +AT8\xcb}SMHTQ\x14\xfe\xce\xbd\xf7\xf1\ +\xc6\x9fDkJ\xa10\xc8~P\xe7\xc9\xe84\x11\xd1\ +\x0f\xae\x82\xa0\x88\xa0\xcc\xb5P\x9b \x22\x02#\x88\x16\ +\xb9\xa9\x85\xd0\xa2\x90 \x82\xd2B\xa2r\x11\xb9\x08*\ +\x08B\x99\x97\xce\xcc\xd3G\xa9\x04\xb9\x08Zf\xe2}\ +\xef\xbe{o\x9b\x0cK\xeb\xac>\xbe\xf3\x9d\x8fs\x0e\ +\xe7\x90\xef\xfb\x97\xac\xb5\x97\x01\xbcYXX8\xd5\xd9\ +\xd9\x99\x00\x80\xef\xfb\xd7\x01\xf8\xb9\x5c\xee\x19\xfe\x13\xcc\ +Z\xdb\x1bE\xd1vk\xed\x86t:\xdd\xb1\x9cp]\ +w_*\x95j[\xab(\x0c\xc3\xfd333\xd7\x01\ +\x80\x11\xd1k\xd7uG\x88h\x0f\x80C+to\xb4\ +\xd6[\x00`zz\xba'\x0c\xc3^\x00\x98\x9a\x9a\xda\ ++\xa5\x1c\x95R\x1e\x00\x00677\xd7UUUu\ +\xc1q\x9ck\xc6\x98\xber\xb9|\x0c\x00\x92$ye\ +\x8c\xd9<>>^#\xa5\xec\x96Rn\x9f\x98\x98\xe8\ +\x88\xa2\xe8\x85\xb5\xf6\xad\xb5\xf6(\x00\xd0\xca\xd6\x82 \ +8n\x8c\x19PJ\x1d\x9e\x9d\x9d-755=\xb7\ +\xd6\x0e\x11\xd1\x90\xb5\xf6\x8a\x10\xe2\x0c\xe7\xfc\xa1\xe7y\ +W\x89\xc8\xac2\x00\x80R\xa9\x94\xd5Z\xdf\x10Bt\ +EQ\xd4CD\x1b\x01\xd4q\xce\xeb9\xe7\x0f<\xcf\ +{\xb2ROk-\xa9T*\xd5\xc6q|\x04\xc0\xbb\ +8\x8e\x7f\xb8\xae\xbb\x1b@\x98\xcb\xe5\xe6\xff\xd6\x92\xef\ +\xfb'R\xa9\xd4}k\xed,\x11}\xd4Z\x17\xe28\ +~_WW\xe7\x8f\x8d\x8d%\x0d\x0d\x0d\x04@TW\ +W\xa7]\xd7\xad\x15B\xb8\x00@DIsss\x99\ +\x86\x87\x87yKKK\x1b\x111\xa5\xd4:\x00Rk\ +\xad8\xe7\xdf\x93$\xf9&\x84\xc8(\xa5\xber\xce;\ +\x84\x10\x1d\x8c\xb1\x16\x00;\x00l]ZZ:\xbej\ +\x84 \x08\xaa\x94R\xe7\x00\xa4\x01\xccGQ4(\x84\ +\xb8+\x84\xb8\x96\xcdfK\xab\x0ei\x19\x8c\x8c\x8c\xf0\ +b\xb1xVk=GD\xa2\xbd\xbd\xfd\x12\x80\x9e\x8a\ +\x8a\x8a-\xd6\xda^\xc6\xd8h\x10\x04'\xd74\x08\xc3\ +\xf0`ccc\xc1\x18\xd3/\x84\xb8\x98\xcdf\xfb&\ +''k\x00d\x18cM\xf9|\xfe\x13\x11\xf5h\xad\ +\x07\x83 \xb8\xbc\xd2@\x14\x0a\x85\x9bR\xca\xd3\x00\xb4\ +\xe38\xfb[[[?\x00\x00clW\x1c\xc7\xccq\ +\x9c\xf5\x00\xe0y\xde\xcb \x08\xcek\xado\x17\x8b\xc5\ +}\x9c\xf3\xcf\x8b\x8b\x8b\xfd\xccZ+\x1c\xc7\x19\xad\xac\ +\xac\xccg2\x99\x0f\xbf\x9d\x85\xd8\xf9\x0b\xd6,s\x99\ +L\xe6\x0ec\xec\xb1R\xaaVJ\x09\xce\xf9S\x91\xcf\ +\xe7/\xacu\x0b\xc6\x98z\x22\xea\x02\xb0\xed\x8f\x99\x19\ +\xfb\x02\xe0\x07\x80g\x00\xba\xd9\xbf\xdeT)u\xcf\x18\ +\xb3\xc9\x183\xf0\x17\x7f\x0b\x80\x07\xe0\x11\x80\xf3?\x01\ +\xf4\xaf0\x8f\x95\xec\x83\x01\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\x22\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x9fID\ +AT8\x8d\x85\x91=\x88\x13Q\x14\x85\xbf\xfb\x06M\ +#\xa2`e\xb16\xb2\xfe!\xc2\xf8\x9e\x85`\x91N\ +,-\x82\x82X\xad\xbd\x88\xfdv\x96\x16v\x8b\x95\x8a\ +\xdaY\xee\x82\xdal\xb7;\xf3\x12d0\x18\x9b\x89\x08\ +\xda\x88\x8d\x03\x09\xc9n\xe6\xdadd\xe6\xb9\xc9\x9e\xee\ +\x9d{\xee\xc7=<8D\xddn\xf7\xe1\xb2\xb9,\x1a\ +x\xef\xd7T\xf5\x9e\x88\x9c\x15\x91\xd7\xaa\xfa\xceZ\xbb\ +{( \xcb\xb2\xab\xd3\xe9\xf4\x03prn\xbd\x01\x12\ +U\xbd\x0d\xecEQt?\x8e\xe3\x9f\x07\x02z\xbd\xde\ +\xc5\xb2,?\x01G\xe6\xd6\xa0(\x8a\xcb\xedv{\x1f\ + M\xd3\xbb\x22\xb2n\x8c\xb9\x11\xc7\xf1/\x00S\x07\ +\x94e\xb9Y[FD6\xaae\x00\xe7\xdc[\xe0\xd9\ +l6{Zy\xff\x00Y\x96\x9d\x07\xce4\xfa\x89\xbc\ +\x0f+\xe6y\xbe!\x22\xd7\xbd\xf7\xa7\x1a\x80\xc9dr\ +'\x0c\xb7Z\xad\xef\xa1\xd7\xe9tf\xaa\xba\xad\xaa\xd7\ +\x1a\x00c\xcc\x890\x5c\x14\x85\x09\xbd\xf9e\x7f\x8c1\ +\xc7\x1a\x00U\xfd\x1c\x06\xa3(ZY\x00X-\xcb\xf2\ +[\x03\x90\xe7\xf9K`?\x08\xde\x0c\x97\xbd\xf7+\xaa\ +\xba:\x1c\x0e\xbb\x10|\xa3\xf7\xfe9\xb0V\xb3\xbe\x00\ +W\xac\xb5{\x00\xfd~\xff\xe8h4\xda\x04^8\xe7\ +^5.\x00\xb0\xd6>\x00vj\xd6\x05\xe01@\x92\ +$n<\x1eo\x03\xbb\xd5\xf2\x7f\x17TJ\xd3t]\ +D\x1e\xa9\xeaqc\x8c\xaa\xeao`\xa0\xaaO\x9cs\ +[\x8d\x9a\x07\x01*%Ir\xc9\x18\xf3\x11h[k\ +\x07\xcb\xb2\x0b\xe5\xbd\xd7e\xf3E\x15\xb6D\xe4\xf4\xfc\ +y\x0e\xf8\x0a\xa0\xaa?\x9cs\xb7\xea\xd9\xbf=\xc7\xa4\ +x\xc6Q\xc0\xe9\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\x9b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x18ID\ +AT8\x8d\xc5\x90\xbdN\x82A\x10E\xcf|\x10\x12\ +B\xa3\x89\x89Q\x1f\x81\x0e\xd6\xc4\xd6\x9e\x06_\xc5F\ +b\xa5\x09\xb1\xf2Y|\x03{\x92\x19:\x12}\x00Q\ +\x13\x0b\x1aB \xec76\x0b\xe2\x1f\xdb\xe9T\xbb\x99\ +{\xcf\x9d\x19\xf8\xef\x92\xd5\xc3\xcc\xba\xee\xde\x07vC\ +\x08\x07?\x89Uu\x0cLD\xe4\xb2\xddn\xdf}m\ +>\x9aY7\x97hfg\xaa\xfa\xb0\xfa\x17\x1b\xbdC\ +w\xb7\xec\xc8\x22\x06\x1c}\x02\xb8{\x01\xd4\xca\xb2\xf4\ +\x1c`\xb9\x5c\x96@\xcd\xdde\x0dP\xd5\x0e\x10\x1b\x8d\ +\xc6k\x0e\x904q8\x1cv\x00$\x1df\x0f\xe8\x85\ +\x10ns\x80\x14x\x0e\xdc\x00o\x050\x07\xa2\x88\x14\ +\xdbm\x1f\x95\xb4\x11\x98\x0b\x80\x99\x9d\xb8\xfb}\xbd^\ +\xdfi6\x9b\x8bm\xe6\xd1hT\x9b\xcdf\x13\xe04\ +\x840(\x00Z\xad\xd6\x00\xa8L\xa7\xd3\xfd\x5cz\xd2\ +TB\x08\x03HG\x14\x11\x07\x16\xd5j5\xbbF\xd2\ +\xac\xa7\xdc4\x8cc\x8c!\x07\x881\x1e\x03O\xdf\x00\ +\x22r!\x22\xd7\xaa\xfa\xf2\x9bYU\x9fE\xe4JD\ +z\xb9\xa0\xbf\xabwg\xc6n\xf6x*E\xbc\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03I\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x10\x1e1|\xaf\xf8\xbb\x00\x00\x02\xd6ID\ +AT8\xcbmSMh\x9cU\x14=\xe7\xbb/c\ +\x92\x8e2\x0bE\x10J\xac\xd0!\x98\xf9&1\x04\x5c\ +\xb4Q(\xd6\xf8\x03\x15*(\xb6\x8b\xe2\xa6\x82\x16)\ +\xbapSEW\x82+u#\x16\x0d\x18\x12p#1\ +D\x14A!\x8a\x222\x0c\x9f\x93I2v2B\x93\ +\x22\x96\xd6M\xcc\xcf|\x99y\xf7]73C\x0c\xde\ +\xd5\xe3\xdd{\xce\xbd\xe7\x9e\xf7\x88CQ.\x97\xcf\x02\ +\xb8`fS\x00\xee\xe8\x5c\xa7\x00~ \xf9\xf1\xf8\xf8\ +\xf8\x97$\xad[\xcf\xee\xa1^\xaf\xdf\xd7l6\xa7C\ +\x08S\xaa\x0a\x92?:\xe7~v\xce\x05\xef}^U\ +\x9fR\xd5#\x22\xb2\x94\xc9d\xce\x15\x0a\x85\xbfz\x04\ +\xd5j\xf5^\xef\xfd\x92\xaa\x1e\x070-\x22/\xf4\xf5\ +\xf5\x1d+\x14\x0a\x7fw\x1bllld\xb7\xb6\xb6\xde\ +T\xd5\xd7\x01\xdc\x18\x18\x1889<<\xfc\xa7\xeb\xe4\ +gU5of\xcfGQ\x94\x0d!\xdcu\x10\x0c\x00\ +CCC;\x00\xde\xa8V\xab\x89\xf7~nooo\ +\xc6\xcc\x1ec\xa9T:\xe3\x9c[P\xd5-\x00\xd7\x01\ +\x0c\x89\xc8\x0d\x11\x99\x17\x91\xf9\x91\x91\x91\xdf\x0e\xef)\ +I\x92?\xbc\xf7\x0fDQt6\x22y\x09\xc0\x8es\ +\xee\x9c\x88\x9c\x17\x91\xeb$?')Q\x14\x9d\xaf\xd5\ +jW\x1a\x8d\xc6h\x17\xbc\xba\xba:\x02@I\xee\x98\ +\xd9K\x0e\xc0\x09\xe7\xdc7q\x1c\x7f\x0d\x00\xcb\xcb\xcb\ +\x11\xc9o\xe38.wA\xa5R\xe9N3#I3\ +\xb3W\xbd\xf7\x1f\x92<\x05`\xca\x01\x18$Y\xef\x16\ +GQ\xb4-\x229\x00X__\xbf\xbc\xbb\xbb\xbbM\ +r\x81\xe46\x00\xb4Z\xad\xcbi\x9aZ.\x97\xfbg\ +\x7f\x7f\xff\xc1\xee\x123=_\xc9k\xaaZ\x00\xf0}\ +\xbb\xdd\xde\xf5\xde\x7f\x22\x22W+\x95\xca/$\x17I\ +~199\xd9\x000\x03`&\x02\xb0gf\xc7\xbb\ +\x04!\x84%\xef\xfd\x13\x00\xe0\xbd_\x14\x91\xa0\xaaQ\ +\xbb\xdd>\xd1j\xb5.\x86\x10.\xd4\xeb\xf5\xbb{\x13\ +\x03X\xf2\xde\x9f\xae\xd5j\xf7t$,\x9a\xd9\xc3\x95\ +J\xe5X\xb1X\xbcI\xf2\xd7\x03\x06\xf4\xa9\xea\x07\xf9\ +|\xbegqD\xf2S\xef\xfd@\x9a\xa6\xb3I\x92\xbc\ +\x95\xa6\xe9EU\xbdM\xf2\xa3\x0e\xe1\x02\x80\x06\x80\x9b\ +\x00\x8e\x02\x985\xb3\xa8'\xd9\xcc\x98$\xc9|\x08\xe1\ +\x19\x00e3\xfb\x8a\xe4-\x11y\x0d\xc0I\x11\xc9\x85\ +\x10\x9e%y5\x840\xa7\xaa\xa7\x9ds\xef\x8c\x8d\x8d\ +\xbd\xdd\x9d\xc0\xb2\xd9\xec\x8b\x22r\x0d\xc0C$\x8f\x00\ +\x98S\xd5\xe7\x9cs\x8f\x16\x8b\xc5\xdf\x07\x07\x07\xa7G\ +GGoonn>\x99\xc9d\xde%yemm\ +m\xea?\x9f\xa9V\xab\xe5\xd24\xfd\xcc{\x7f\x86d\ +\xd3\xcc\xbe\xeb\xef\xef\xff)\x8e\xe3\xf7\x0e\xbf\xc4\x95\x95\ +\x95\xa7C\x08\xef7\x9b\xcd\xc7y0\xd1\x91sJU\ +_&\xf9\x08\x80tbb\xe2(\xfe'\x92$\xb9_\ +U_\xf9\x17f\x1b`\x12\x9fJ\x7fB\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02'\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1c\x12!\x05\xacH:\xd7\x00\x00\x01\xb4ID\ +AT8\xcb\xcd\x92?\xab\xd3P\x18\xc6\x7f\xe7\x9c$\ +\xb4\x05/\x8apAp\xa8w\xf1Z\x12!6MW\ +\x1dts\xa8\xa0\xb3\xe8\xe0w\x11\xbf\xc1]\xee\x22\x82\ +\xe0$\x14\x9c\x14qi\x12\xcd\xd0\x80-4Z\xa4\x83\ +\xb4\xfb\x0di<'.\x8d\xe8\xe0\xbf\xed\xbe\xdb\xfb\xf2\ +\xfc\xde\x7fi&\x9d\xd0\xd5\ + \xc1\xc8K\x8b~\xc2\x01@U\xb3_o\xec\xef\xcf\ +>\xe1\x0f\x00\x06\x00\x989\x07\xb0\x99\xe0\xcf\xc7WF\ +\xf4\x06b\xd8P\xdc\x9bw\xe2\x10\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x02e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xe2ID\ +AT8\x8d\xad\x91=hSQ\x14\xc7\x7f\xe7\xdd\x97\ + N\x8a\xa0C\x91*tp\xa9ix\xb7%C\xc0\ +A\xc1A\xc1/\x10\xdcT\xb0 \x88\x83 \xad\x1d\x5c\ +Z[\x1a\xea\xd0\xad\xe0 \xb8\x09R\x1c\xc4A\x11\xe9\ +$I\xefm\xe3\x10\xa8\xe0$:t.\xd2\xd0\x97w\ +\x8fK\x02IL\xd5\xc1\xffv\xcf=\x1f\xff\x0fa\x1f\ +8\xe7N\x017\x81\x1b\xc0\xeb8\x8e+ccc?\ +\xfa\xfb\xa4\xfb\xd1h4\xf2\xbb\xbb\xbb\x97DdRU\ +\xcf\xf6\xfd\xef\x89\xc8KU\x9d\xb7\xd6n\xf5,\xa8\xd7\ +\xebCi\x9a\xde\x11\x91\xbb\xc0\xd1\xfdX\xb5\x11\x80\xb7\ +\xc0\x9c\xb5\xb6*\xde\xfb\x19U\x9d\x05\xa2\xbf\x0c\x0e\xc2\ +\xb4\x00\xac\xaf\xaf\x9f\x13\x91\xa7\xc0\xe9\x7f\x18\xeae\xd0\ +\xa9\xaaj\xb4\xb9\xb9y=\x84\xb0\x00\x9c\x180\xb8'\ +\x22o\xa2(Z)\x16\x8b\xef;E\x01\xa8V\xab'\ +\x8d1\x93\xc0\xe5,\xcbf\x8d1\xc7\x81i\xe0\x10\xb0\ +\x03<\x0f!,\x19cn\xab\xea=\xe0\xa3\x88,&\ +I\xe2\xbb=\xf8\x90\xcb\xe5\xae\x14\x0a\x85\x9f\xed\xa5G\ +\x8c1\x17\x9b\xcd\xe6j\xb9\x5c\xde\xe9\x5cl\x1f{\x07\ +\x8c\x0c\xf2 \x0f>\xfe\xa5'\xc6n8\xe7\ +\x0e\xfeIB\x7f\xffo\x0b\xba\xe2\x1a\x18\xe3\x7f\xc7/\ +}h\xe1M\xbd\xe1\x1d\xbf\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01g\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xe4ID\ +AT8\x8d\xdd\x921n\xc30\x0cE?u\x9a\xc2\ +ko\xe1\xc5A\xb24\xc8l\x90\x19\xd3\x83\xb4\x19)\ +h\xf0h/-\xda\x83\x14\xd9r\x19\x01d\x96\x04p\ +T!m\xa6\x02\xfd\x1b\xbf\xf8\x9f$J\xc0\xff\xd30\ +\x0c\x0f\xf7\xac\x87y\xa1\xaaM\xce\xf9\x90R\xeaj\xe1\ +\x94R\x97s>\xa8jS\x05\x88\xc8\xd1\xccVf6\ +\xa9\xea\xb2\x80\xb7f6\xb9\xfbZD\x8e\x17\x9fj;\ +\xa9jKDo\xee\xbe\x11\x91\xf7K\x0d`\xcd\xcc\x1f\ +\xf3\xde*\x00\x00b\x8c\x0b\x22\x1a\xdd]\x89H\xdc\xfd\ +[\xf8&\xe0\x0cy\x01\xb0\x03\xf0\xca\xcc\xcf\xb5\x9eP\ +3g'\xd8\x02\xd8\x13\xd16\xc6\xb8\xf85@U[\ +\x00\xa3\x99m\x98ygf+\x00c9\xd8\xea\x15\xca\ +\x01\xfe\xe4S\x11nB\x08_D\xf4\xd4\xf7\xfdg\x09\ +O)u\xee>\x99\xd9\xe3\xfc)\xaft\xefO\xfc{\ +\x9d\x00W\xd1\x7fUv\x17\xf1^\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01q\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xeeID\ +AT8\x8d\x9d\x931N\xc40\x10E\x9f\x9dx\xd1\ +\x16\xa1\xa1\xa0\xa1\xda\xcd\xf6Qb\xe5\x06\x9c\x82k\xd0\ +\xaeDE\x878\x007HG\xc7\x09V\x8e\x92\x1c\x81\ +\x12\xe8(\x90\x90\x8bH6\x8d\xcbl\x1c\xf2\x1a[\xdf\ +3O3\x85!B\xd7u\x0fs\xef2&\x90R\xde\ +\xae\x16\x18c.\xbd\xf7\xbai\x9ad\x95@)u\x00\ +6y\x9e\xdf\xac\x12\x009\x80sn\xb7J\xe0\xbd?\ +\x84\xf3\xac \x9d\x0a\x8d1\xd7Y\x96\xfdZk\xf7!\ +\xda\xb5m{\xa5\x94\xba(\xcb\xf23:\x81\x94ro\ +\xad\xfd\x01\xee\x00\x84\x10\xf7I\x92|9\xe7\xb6\x8bV\ +\xa8\xeb\xfa$\x84x\x03T\x886\xc0\x8b\xd6\xfa}\x91\ + p\x04|\xb8\xdb4M\x1f'\xa7=\xd7]U\xd5\ +\x00\xbc\x02x\xef\x9f\x8b\xa2\xf8\xf8\x97 4\x1e\x81\xef\ +q\x1c\x9f\xe6\xeaf\x19\x86\xa1Z\xdd\xbc\x04\x01\xd0\xf7\ +\xbd\x8f\x15N\xa1\xb5\x16\xd1\xdf\x18\xe3\x0f\x8a\x0fE|\ +\x87!=\xc9\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\xc5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1b\x171\x1f\x80\xf4+\xae\x00\x00\x01RID\ +AT8\xcb\xc5\x93\xb1j\x9bA\x10\x84\xbf\xfd1&\ + paR\x05\x9c.nd\xf8\x7f\xee\xd4\xc5\x02\x17\ +\xc9\x03\xe4\x05\xd2\xfa\x0d\xd2&E\x5c\xe4\x09\x02n\xdc\ +\xcb\xaf\x10H\x11B@\xda\x95\xf4\x17\x22\xb80\xb8r\ +\xc0]\x9cF\x85\xf1\xb8P\x04\x92\xac\xd82.\xb2\xd5\ +\xc1\xed\xcc\xcd\xcc\xee\xc1\xff.\xbb\xafa0\x18\xbc\x91\ +t\x0c\x5c\x01oSJ\x9d\x95\x08\x86\xc3\xa1UU\xa5\ +\x88\x90\xa4I\xb3\x19\xc0\x99\x99=\x07vSJ?\xee\ +T\xd0\xef\xf7\x7fK\xda\x98\x12\xcc\xbdl\x86\xa4\xcf\xc5\ +2\xa0\xbbO\x8f\x97\xf78\x5c\xbf\xa5\xa0\xdb\xed\xd2h\ +4\xd6\xc6\xe3\xf10\xe7\xbc\xe3\xeeO\xcd,\x01\x9bf\ +\xf6\x04\xf8\x03\x9c\x03\xa7)\xa5\x0b[\xf0MUUD\ +\xc4\x09\xf0\x02\xf8%i\xab(\x8a\xeb\x94\xd2R\x09\x85\ +\xbb\x7f\x02\x18\x8dFS\xf0W`[\x92Izff\ +?SJD\xc4r\x02\xe0]D\x1c4\x9bM\x22\xe2\ +\x08\xd8[\x08m;\x22<\xe7L]\xd7\xb7\xc3tw\ +\xfd\x1d\xcfw\xe0\xe5\xbf\x12\x07\xbe\xe4\x9c_\xd7uM\ +Y\x96s\x0a\x90\x84\xa4\xa5\xe0\xe9=\xf0*\x22\x8e\xcb\ +\xb2\xa4\xd3\x99\xecR\xaf\xd7\xfbh\xee\xae\x95\xd7v2\ +\xfb\xc3V\xab\xb5\xef\xee\x1f\x80\xf7\x0f\x22\x98\xb1\xf3\x0d\ +hKb\x0d\xa0(\x8a\x87\xfe\xa1\xf6\x8c\xb5\xc7\xd5\x0d\ +\x8aW\x9b%\xec\x11.\xf8\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\x8f\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x0cID\ +AT8\x8d\x85\x93\xbfkTA\x10\xc7?s\xb9;\ +\xb9XZ\xa4\x11\xfc\x91\xc23\x16\xaf\xb8\xcd\x05\x82\xa0\ +\xfe\x07\x22\x16\x82\x81\x88\x82 !X\xd8\xa9H@T\ +,\xecL\xa7X(\x1aDR(\xb1He\xa1r\xe1\ +\xed\xbb\x98\xe0\xe3P\x0c\x87\xa5),\xef\xc5\xf7\xde\xed\ +\xd8\xec\x85\xd3\xfc\x9afvgg\xbe\xfb\x99a\x17v\ +\xb1(\x8a>\xa9j\x01`uu\xb5j\xad]\xfc?\ +\xa7\xb0]a\x1c\xc7e\x00\xe7\x5c\xd3Z{\x07 M\ +\xd3\xfb\xce\xb9W{\x0a\xa8jacccaii\ +\xe9@\xbb\xdd\xbe\xa1\xaa-\x1f\x7f]\xaf\xd7\x9f\xf5r\ +\xa2(\x9a\x02\x90m\xb0/\xaa\xea\x0b\x11y\x5c\xab\xd5\ +\xa6\x97\x97\x97\x0fw\xbb\xdd\x8f\xc0w\x11\x99r\xce\x1d\ +\x11\x91Y\xe0\xad1\xe6\xfa?\x02q\x1c\x97\x93$i\ +\x01G\x81\x1c\xa8\x1ac\xd6\xa2(\xfa\xa0\xaa\xa7\x80\x96\ +1fd\xc7\x16:\x9d\xceU_\x0cPT\xd5[~\ +\x16\xf7|\xec\xb8\xb5v\xb0\xbff\x93`eee\x7f\ +\x96ek\xc0\x90\xaa\xde\x16\x91\x19@\xbb\xdd\xee\xb1\xb1\ +\xb1\xb1\xb6\xb5\xb6\x01h\xa9T\xba\x94e\xd9;\xe0K\ +\xa5R\xb9\xbcI\x90e\xd9$0\x04\xc4\xc6\x98\x07\xaa\ +:\x07\x94\x06\x06\x06nz\x8a\xe9b\xb1x>\x08\x82\ +o\xb5Z\xad\x0a,\xe6y>X\xf0S\x15`\xca\xaf\ +gD\xc4\x01\x0f\x01\x05&\x1b\x8d\xc6\xc1z\xbd\x1e\xe6\ +y\xfe\x06@D\x9c1\xe6I\x10\x04\xeb\x05\x80f\xb3\ +y\x06\x18\x01~\x18c\xe6\x01FGG\xbf\x02\x0b\x9e\ +b\xd2\x8b;k\xed\xd9-CT\xd5\x0b^y\xd6\xdf\ +\xde\xb3\xa7>~\x0e\xa0\x5c.O8\xe7~\xf7\x0b\x14\ +\xbd\x1f\xf1}~\xee?\xacT*\xef\x93$\xf9\x03\x9c\ +\x00\x08\x82\xa0\x0d\xb4\xb7\x10\x00?\xbd\x1f\xee?L\xd3\ +\xf4\x10\xb0\x0f\xf8\xc5\x0e\xd6ka\xde\xa3>\x0a\xc3\xf0\ +\xb4\xaa\x8a\xb5v8\xcf\xf3\x97>o\xcb\x1f\xe8\xd9\xe6\ +;\x08\xc3\xf0\xb9\x88L\xf8\xad\xeb\xa3k\xa6izr\ +||<\xd9U@U%\x8a\xa2k\xc0\x15\xa0\x0a\xac\ +\x03s\xc0]cLg'\x82\xbf\x02\x9d\xf8\xcd\xb9\xae\ +<=\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x90\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x07\x04\x17/\x0c\xe5\x11;\xd6\x00\x00\x02\x1dID\ +AT8\xcb\x95\x91\xcfK\x14q\x18\xc6\x9f\xe7\xfb\xea\ +\x5cvc+d12\xf3\x0fpa\x86\x11*X\x10\ +;\x19e\x97\x90L\xa4k\x1dB\xa1k\x1d\x12B<\ +U\xe6\xff`\x94{jc\xa9\x93t\x9d\xd9e\xbe\xac\ +l\xe0%\xc5\x0c\xbb\xf4\xc3-/;\xce\xbe]vc\ +\x93\x95\xec=\xbe\xf0yx~\x10\xc7\xb8 \x08\xfaI\ +>#9\x0e\xe0\x9b\xaa.\x8f\x8c\x8c,\x91l\xf6\xfc\ +\x0b^__\x1fj4\x1ak\x00\x06\x01\xbc\x050\xa4\ +\xaaO\xac\xb5\x00\xf0\xd4\x1c\x13\x1e\x10\x91)\xdf\xf7\xaf\ +\x8a\x88k\x8c\xf9@\xf2\x1e\x00\x1c)\x10EQ\x7f\xa3\ +\xd1x\xd3\x82\xa7]\xd7]\x05\x00\xd7uc\x00[\x00\ +N\x02\xc0\x91\x11\xea\xf5\xfa\x8fT*\xe5\x91\xecs]\ +w\xb7\xfd\xb7\xd6N&I2\x0e\xe0eW\x07\xb5Z\ +\xedl\x14E\xc5t:\xfd\x13@]U\x1fmll\ +\xa4;\xe0\x15\x00\xdb\xaaz\x1f\x00\xd8-\xb3\xaa\x9e3\ +\xc6\xac\xa8\xea)\x00\xd7T\xf5.\x80\xaf$W\x00\xec\ +\x1ac\xc6<\xcf\xfb\xf8\x97\x83\x0ex\x80\xe4t\xb3\xd9\ +|\xed\xfb\xfe\x04\xc9\x19\x92\xdf\x01\xbc\x00\xf0\xd9q\x9c\ +\xd16\xfc\xc7\x81\xb5v0I\x925\x00\xe7\x01\xdcV\ +\xd5\xd3$\x97\x01\x14\x00\xec\xab\xea\x0c\xc9O\x8e\xe3\x8c\ +\xe5r\xb9\xadN\xd7=\xe5r\xf9L\x92$\xef[m\ +\xdfr]w\xd5Z\x9b988\xb8\x00\xe0&Ic\ +\x8cy\xa7\xaawr\xb9\xdc\xce\xe1\xceX.\x97_\x91\ +\xbc!\x22S\xed\xa9\x00\xa0R\xa9\xf4\xed\xed\xed\xfd\xca\ +f\xb32<<\xbc\x7f\xd4Z\x06\xc0\x15\x00\xc5N\xd8\ +Z;\x09`7\x93\xc9\x04q\x1c\x9fh\xff\xab\xd5j\ +\xa9V\xab\xe5[k\xe5\xc30,\x19\x00u\x00\x83\x85\ +BA\x0eM\xb5\xe38\xceu\xcf\xf3\xbe\xb4\x05Dd\ +!\x8e\xe3b\xa5R\x99\x8d\xe3\xb8\xd8\xdb\xdb\xbb\xc00\ +\x0c\x1f\x90|L2\x02\xb0\x0d`\x02\xc0v\xb7\xc2Z\ +\xd1fUu\x89\xe4\x9c\xef\xfb\xcf\xcd\xe6\xe6\xe6\xa2\x88\ +<\x14\x91\xac\x88\x5c\x16\x91\x821\xe6R7\xb8Z\xad\ +^$9Or\x8e\xe4|\x10\x04\xa3\xf8\x9f\x0b\xc3\xb0\ +d\xad\xcd\xb7\xa2\xe6\xc30,\xfd\x06\xb3~\x00\x8cj\ +9\x81V\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01u\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +/IDAT8\x11\xc5\x92=N\xc3@\x10\x85\xbd\ +6\x0d)\x10\x07\xa0I\x0b\x95\x7f\x1aW)\xe9\x91\xc2\ +\x05\xa0&JK\xc5\x0d\x80\x9e\x13\xc4'\xc8\x09H\xe1\ +\x9f\x8e\x12\x8a4\x94\x88\x86\x02\xd9\xe6\x9b\x95\xc7\xda\x98\ +$mV\xb2\xe7\xcd\x9b7\xeb\xb7\xb3\xf6\xbcC/\xa3\ +\x06\xf2<\x7f\x07\x8f5\xdf\x13\x7f}\xdf\x9fDQ\xf4\ +*\x9a#G86\xc6<\xb6mk\x0b\x0e?\x84\x8b\ +\xa6i\xce\x94t7\xf0\xa49I\x92L\x8aUU\x9d\ +\x86a\xf8\xa5B\x8d8Uh\xa3\xbf\x919I]\xd7\ +\xcfEQ\x5c9\xd4V\xb8s\x03\xd4\xc7<\x19_\x9c\ +\x0d:3\x8e\xbaVn\xe3\x08J\xba\x11\xb1)\xcb\xf2\ +\x86s\xa7\xf0K\xd27\x8ez\x0b^\x89n\x9f\x83\x1f\ +\xea\xd38\x8e\x9fh\xbe\x04\x9fHC\xb7\xa6\x0av:\ +\x08\x82`\xe6\x0e\x91\xe1^wMr\xac\xf3\xad\x1b`\ +/\xd5)3DO0\xdc\x1a\xcb\xaa\xff\x17]\x07\x1f\ +\x08\xe7(\xe4\xe9\x17\x9c\xbd\xd6\x9e\x18\x80\xfeO\x1c\xf0\ +6\xc5\xc1B\xacK\xe4\xef[2\x8bO\x0a#\x5c=\ +0\x9b\x0b\x11\xb9\x0el\x93\xbc\xb8\xff9_\x96\xa9\xa7\ +\x1d\xfe\xa6\xf9\x85M\xee\x88\xf7\xd4F\xbd\xf8\xe0\xe0\x0f\ +\xc05u\xf9\x10\xce\xa4\x9a\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01\xa5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x00\x1b&\x9e-*I\x00\x00\x012ID\ +AT8\xcb\xcdS\xbbJ\xc5@\x10\x9d\xc9> `\ +a\xa3\x1f`\x11\x08$E\xae\x9d\x85\xdc\xd6\xc6\xceR\ +\xb8?`c\xe3\x0f\xf8\x0d6jcy\xbf\xc0Z\xab\ +\x14n\xd8\x84\x04\x13H\x91\xca\xca\xe6\x12\x08\x81\xacc\ +\xa5D\xd9\xa0\xc1\xc6\x03[\xcc\xcc\xd9\x99=gw\x01\ +\xfe\x08\x1c\x07u]\x931\x06\x18c_H\xc6\x98\xcf\ +%\xa5|\xf4<\xef\xf0\xa3\xc6\xbf\x13=\xcfC\xdb\xa4\ +$IN\x00`\xcd\x18\xbb\x1b\xe7\x9dq \xa5\xb4\x1e\ +3\xcb\xb2=\x00\xb8f\x8c\xad}\xdf\xbf\x99\x94`C\ +\x1c\xc7\x5c\x08\xf1\x80\x88\xbb\x9c\xf3E\x18\x86\x9bq\x9d\ +\xff\xd4\xc0u\xddKc\xccB\x08q\x10\x04\xc1f\x96\ +\xc3Y\x96-\x95R\x83\xd6\xfa\xecW\xb70FQ\x14\ +;}\xdfk\x22z\x8a\xa2\xe8\x18\x11\xc9\xc6slI\ +\x22\xc2\xae\xebn\x01`p\x1cg5\xb5y\xd2\x834\ +M\xcf\x11\xf1\x88s\xbe\x0c\xc3\xf0u\x96\xee<\xcf\xf7\ +\x95R\xbd\xd6\xfab\xf6\xb3l\x9af+I\x92g\xa5\ +\xd4=\x11Y\xe5\x95eID\x84V\x09m\xdb^\x19\ +c\xb6\x01`\x85\x88o\xb6\x06]\xd7M{ \x848\ +%\x22`\x8c\xbdTUe\xfd\x13\xc30\xc0\xff\xc2;\ +\x94M~C$\xef\x9d$\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01P\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xcdID\ +AT8\x8d\xad\x931\x0a\xc2@\x10E\xff\xc8\x22i\ +$\x9d7\x88'\x18HP\xcf\xe0\x1d\xbc\x867\xb0\xd4\ +\xce\xceZ\xec\xbcB\x02)&\x8dw\xf0\x0c\x12\x083\ +V\x09\x1aBLV\x7f5\xcc\xec\x7f\xfbw`ID\ +J\x00Sx\xca\xf5\x0d\x99\x99\xda=\x111f&\x11\ +1\x00\xa0\xbf$\x08\xc30\x88\xa2\xa8\x1ck\x16\x11\x9b\ +\xf8\xde\xfc\x91\x00\x00\x8a\xa2\xc8\xccl9\xd0\x971\xf3\ +\x1a\x00\x9a\x04#\xcc\x00\xb0\xaa\x8b\x9f\x9f\xf0\x15@D\ +'\x00\x87!\x80\xac\xeb\x80\xaa^\xab\xaa\xba\x9b\xd9\xed\ +\xad\x9d\xd6E\xb3\xc4z)]\xca\xf3\xfc\xa9\xaaI\x1c\ +\xc7\x9b\xbe\x04}\x0a\xcc\xec\x92\xa6\xe9\xcc\x17\x00\x00\x0b\ +\xe7\xdc\xd1\x17p\x06\xf0P\xd5\xbd\x17 I\x92-\x11\ +\xed\x9cs\xf3\xf6\xac\xf9U\xbez\x01\x9d\xddF[\xcf\ +\xa0\x22\xf0\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\xb2\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x09\x1b\x0e\x17-\x1aZ\xf6$\x00\x00\x03?ID\ +ATX\xc3\xed\x97\xc1o\x1bE\x14\xc6\x7f\xcf.\xd4\ +%\xa8R{ \xffC\xa3$\xbb\xde1\xb1*Th\ +@=\x80/HE\x11'.\xdc\x10\x87^QJ$\ +\xa4\x9cz\xa8\x90P\xc5\x0dqC!\x15\xa9T@-\ +\x12H\x01E\xb6v\xec\xb7q\xea\xf4\xc2\x15\xa4rh\ +HHq\xc0\x8e\x87\x83\xc7\xd4\x15Ne\xc7\xa6\xbd\xe4\ +I\xab\xd9\xd9\xddy\xef\x9bo\xbe\xf7f\x16\x8e\xec\xc8\ +\x9e\xb2\xc9 \x1f[\x9b\x04\x22\xe4\x9c\xe3\xb4\x88\xdb\x02\ +\xd1(\x0a\xe2\xff\x0d\xc0\xdaZ\x8d\xb3g'\xb0V\xe7\ +\x80+\xc0\x0b\xc0\xdf@\x0bH\x01\xcf\x02\xdb\x22,D\ +Q\xf8i\xb1\xa8\xe4\xf3\xe1h\x00Xk1\xc6`m\ +\xb2\x0c\xeeu\x1f8\x05d\x804\xb0\x0f\xecy0\xc7\ +\x80R\x14\x05\xaf\xaa*\xd9lv4\x0cX\xab\xd7\x81\ +\xd7\x00\x07 \x22\x1f9\xd7Z\xc9d2\xbf\xd4\xeb\x8d\ +q\x91V\x01\x98\x07\x9e\xf3C\xee\x18\x13\xbe4\x12\x06\ +\xe2X\xe7D\xf8\xac=s\xf9\xf9\xf8\xf1t~rr\ +\xb2y\x00\xd0U`\x0aH;\xc7|.\x17~\xdc/\ +\x80\xd4\x81\xc8\x84+\x9e\xf6\xe6\xce\xceV\xbe\xd1p\xcd\ +\xde@c\x8c\x09\xcf\x01\xbb\xc0\xbe\x08\x0b\x830\xd0\x13\ +@\xb9\xac\x81\x17\x5c\x0aX\x9c\x9d=\xdf\xccf\xa7z\ +:\xc8\xe5r\x9d\xdb\xcb^\x1b\x19k\xf5\xfc\xb0\x0c\xe4\ +\xfc\xec3\xce\xb5V\xfar\x94r7\xbc@\x1b f\ +(\x00\xceq\xca\xab;=6\xf6\xfc\xaf\xfd8\xcaf\ +\xb3\xf7=\x03\x0eZ\xa7\x86\x05\xb0\xed\xdf\xed?x\xb0\ +7\xde\x8f\xa3$\xd98\xe9A\x03r\x7f(\x00\xa9\x94\ +T|\x91\xd9\xf3\xa9\xf6X\xbbz\xf5s\x9a\xcdf\x01\ +\xa8\xb7\xc7Iy(\x00\xbe\xbcn\xfb\x19}\xd8Q{\ +/+\x16\x8b\x5c\xba\xf4\x0e\xc0\xa2/N\x0dc\x82\x1f\ +\x86NC`\xc1W\xb8\x8c\xb5\xba\xda\xa5\xf6Gf\x9e\ +\xcf\xe7\xb1V\xbf\x01N{\x0d\xcc\x8fl/\xb0Vo\ +\x03/\xfa\xee.pY\xc4\xadDQv+\x8e7N\ +\x8a\xec\x17\xc0-\xfa\xe0\xae],\xe5\xfb(\x0a\xde\xac\ +\xd5jLLL\x1c\x1e\x80\xaa\x12\x04\x01\xe5r\xf2\x13\ +0\xed\xe9M\xfbT;\xe6\xfb\xf5\xae\xe7-\x0f\x22\x05\ +\xb2jLP\xb0v\x13c\xce\x1cn\x09\xc20DU\ +i\xd7v\x99\xef\xa4%\xf0\xa7\xd7\xc7\xae\xef\x03|\x00\ +\xdc\xf6\xfeZ\xe0\xceY\x9b|m\xcc\x19\xac\xdd\x1c\xe5\ +y@_\x01\xc9\xb5\xf3\x5c\xb6D\xc4F\xd1C\xc1Y\ +[Y\x01\x99}\xb8]\xcb\x8f\xc6\x04o\xf4\xc3\xc4\xbf\ +V\xadV\x07\xda\xcf\x93$\x01\xa0R\xa9t6\xb1\xaf\ +\xac\xd5\x1dk\xf5\xf7v\x9b\xdcl\x83\xdb\xec\x9f\x01\xd5\ +\xeaE\xe0\xcb>\xe2\xbf\x1d\x86S_\xfc\xf7\x0c\xa1\xcb\ +\xc0\x85.&V\x8d\x09\x0a}k \x0c\xa7\x96\xc1\xbd\ +\xf7\xf8\xd8\xee\xfd\xee\xe0\x00\xc6\x18J\xa5\x12\xc6\x84\x17\ +\x81[]\x9ax9\x8e+\xef\x0e(\xc2\xe9k\x22\xf2\ +\xc9\x01\xc1\xaf\x85\xe1t\xcfw333\xac\xad\xd50\ +&|K\x84[\xc03@FD~\x1bhm\x9ds\ +\x9d\xe5\xf8V\xb5\xea\xba\xae\xef\x00\x96\x96\x96\xfa\xd2\x92\ +\xb5\xc9\x5c\x1c\xeb\x85C\x9dXK\xa5\xbb\x1d\x10\x1b\xaa\ +\xd5\x96j\xf5.\xc0\xfa\xfa\xfa\x93;\x96\xab\xdea|\ +\xfc\x8f\xd4\xbd{cZ\xaf\xff\x15\x9d8\x91i\x86\xe1\ +\xe4\x93\xfdyP]\x7f\xa4=\xb2Q\xda?c-]\ +]\x0f\xeb%\xbc\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01L\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xc9ID\ +AT8\x8d\xdd\x91A\x8a\xc2@\x10E\xdfH\xcfF\ +D\x13\x10\x0c\xc3\x03)%\ +/6\x1f\x01\xf2<\xbfLD\xdbJ\xa9\xbbB\x08Z\ +YY\x99\x13\xd1}f~4\x1a\x8d\xae\x1e\xdd\x5c\x88\ +?|\xa0\x93$\x993\xf3\x92R\x0aR\xca\xa2\xd7\xeb\ +i\x00\xb0m\xfb\x13\x11\x01\xc0\xe7,\xcb\x00@\x9d\xca\ +\xf3\xcc,\xd34\xa5\x13\x9d\xf8/\x15E13\xc6\xd8\ +\x00\x9a\xdf\x98\xae\xad\xad\x9d\xc5\x7f\xa1_\xab\xdb\xdf\x85\ +%>\xf2\xaa\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\xb6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x00\x18&\xb5\x00y\x8a\x00\x00\x01CID\ +AT8\xcb\xcdS=K\xc3`\x10~\x9a{IB\ +\x82(Y\xba9\xa4\xa4\x1d\x92%\xbb\xe0op\xb0\x9b\ +\x83\x0e\xce.\xae\xfe\x01g\x87\xfe\x00\x91,:89\ +\xba\x07\xe9G\xb6b!\x14\x04\xa7\x22\x84\x92\xb7\xe9\xe5\ +u\x0a\xd4P\x8b\x1fK\x9f\xe5\x8e\xbb{\x1e\xee\xb8;\ +\xe0\x9fh\x8c\xc7cC)\x9533\x98\x19D\x04]\ +\xd7\xb3V\xab\xb5\x03\x00\x93\xc9\xe4HJy\xcf\xcc\x00\ +\x00\x22B\xb3\xd94\x1d\xc7\x91\x00\xa0y\x9e'\xdb\xed\ +v\x83\x99\xf7\x8a\xa2\x98\xce\xe7\xf3\xa8\x22\x03\x80\xeb\xba\ +\x0fY\x96Yy\x9e\xbf\x16Eq'\x84p*2\x00\ +h\x95\x13\x04\xc1\x87i\x9a\xa7B\x88n\x92$\xc7\xab\ +m\x1a\x86qED\xbb\xb6m_x\x9e7\xfb2B\ +}\xa6\xc1`pS\x96e\x17@\x10\x86\xe1\xfbh4\ +\x0a\xca\xb2|\x11B\x9c\xf8\xbe\x1f\xd5\xeb\xb5z@\xd7\ +\xf5K\x003\xa5TO)\xa5-\x97\xcb\x1e\x80\xa7u\ +\xe4\xb5\x1d\x00@\x92$\x07\x8b\xc5\xe2\x99\x99\x1f\x89\xe8\ +\xd0\xb6m\xbf\xd3\xe9\xbc\xfdj=\xc3\xe1\xf0:\x8ec\ +\xd5\xef\xf7\xcf6\xd5i\x1br\xb7\x00`YV\xf4W\ +\x81\x1fa\x8b\x05\xaa\xd3\xad\xec\xb7\xbfP\x0f\xa4iz\ +.\xa5\xec\xad\xfe\x06\x11A\x08\xb1\xef\xba\xee\x14[\x87\ +O^\x0c\x827u\x14K\x94\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x02\xcd\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02JID\ +AT8\x8d\x95\x92=h\x14Q\x14\x85\xcfyo\xb4\ +\xc9n4\x1a\xb01j'\x11\x8b\xb8\xf3\x93%\x16\x01\ +\x1b\xad\x161b#6B@\xd0FL\xa3\x90(\x16\ +bc'\x12\xb0\x0cIc\x91F\x02\x81hDV\x18\ +\xe7\xcd\x04\xb6H\x0au\x0b#QA0!n\x97y\ +\xef\xda\xcc\x86u\x89\x82\xb7\xba?\x1c\xde=\xdf\xbb@\ +W4\x1a\x8d\x93\xc6\x98\x07q\x1c\x1f\xe9\x9e\xc5q\xdc\ +\xdb\xddS\x9dE\x9a\xa6\x13;;;\x0d\x92\xf7\xb5\xd6\ +\xd3\xed\xbe1\xe6\xa61&\xf1\x11Y\x0b\x82\xe0n\x01\xf41\xc9A\ +k\xad%9J\xf2\x10\x80-\x92#\xdd\x10\xa7\x00\x1c\ +\xd3Z\xf7Yk\x8f\x92\xdc\x12\x11\x008HrCD\ +~\x92\xb4\x00<\x11\x99\x08\xc3pi\xf7\x1b\x95R\x1b\ +\x00\x0e[kG+\x95\xca\x09\x92\x97Ed[D~\ +\x01\xb8\x14\x04\xc1\xf1 \x08*\x00\xde\x07A0\x14\x86\ +\xe1\xd2\x1fw\xa0\xb5\xbeE\xf2\xac\xe7yW\x00 \xcf\ +\xf3\xd7\x00J${\xac\xb5o\x0a>\x22\x22}{\xde\ +A\x92$\x03J\xa9\xb7\x22r\x01\xc0\x00\x80i\xa5\xd4\ +\xbcsN\x03\xa8\x01\xb8Ar\x95\xe4\xac\xef\xfb\xe7\xda\ +\xba]\xd2Q\x14}I\x92\xe4\xa9Rj\x0d\xc0\x0f\xe7\ +\xdc\xa4\xef\xfb\xcf\x0b\x88\x1f\x00\xcc\x02\xe8\x07p\x07\xff\ +\x8az\xbd^\xfe\x9f\xd9oee\x14}\x8d&o\x98\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x021\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xaeID\ +AT8\x8d\xcd\x93\xbd\x8b\x13Q\x14\xc5\x7fw2\x99\ +|\x14\x09\x0b\xc2v\x16\x81t\x92@f \x8d\x85\x85\ +\x1f\x8d\x8d\xcd\x80\x82\x85l\xb1X\x0b\xa2\x7f\x80(\x0a\ +\xd6\xda\x08\xa2,\x92\xc6e\xbb\xd5\x22\xd5B o\x9a\ +\xc0`\x11\x98m\x05\x91%\x04w\xa2\x99\x99k\xb3#\ +qHpKOw\x0f\xf7\x9cw\xef\xe5<\x010\xc6\ +<\x05\x1eq~<\xf3<\xef1\x80\xe4L\x10\x04/\ +\x81\xbem\xdb\xd7\xbb\xdd\xee\x8f\xa2\x22\x0cC'\x8e\xe3\ +\x03\xe0\xab\xeb\xba\xf7DD\x01\xac\xbc\xa1\xd7\xeb=P\ +\xd5/\xcb\xe5\xf2\xe3t:\xad\xac\x8a\x07\x83A)\x8e\ +\xe3\xf7\xc0i\x14E;\xb9\xf8/\x03\x11\xd1(\x8av\ +\x81\x93\xd9l\xf6a8\x1c\xda\x00\xaa*\xadV\xeb\x95\ +\x88l5\x9b\xcd\xdb\xbe\xef\xa7\xab\xe6\xd6j\xe1\xfb~\ +Z\xab\xd5\xee\x02N\xa3\xd1x\xa3\xaaV\x10\x04\xcf\x81\ +K\xd5j\xf5V\xbb\xdd\xfeY\x5cM\x8a\x04\x801\xa6\ +\x0e\x1c\x8aHEU+\x8e\xe3\x5c\xe9t:'\xebz\ +\xadu\xa4\xe7y\xa7\xc0MU=\xce\xb2\xec\xc6&\xf1\ +\xff\x81\xb57\x000\xc6\x5c\x00\xf6\xd24\xdd\xed\xf7\xfb\ +\xc7\x9b\xfa\xd6\xde\xc0\x18\xd3\x04>\x89\x88\x94J\xa5\xc3\ +\xd1h\xb4}n\x03cL]U\x0fD\xe4\xc8u\xdd\ +k\xc0;\xdb\xb6?O&\x93\xad\x7f\xae\x10\x86\xa1\xb3\ +X,\xf6U\xf5\xdbY\x5c\xb33\xd3\x17\xc0\xe5r\xb9\ +|\xb5\x18\xf3?\x13\xe4qU\xd5\xc5|>\xdf\xc9\xc5\ +\x00\xae\xeb>\x04\xc2$I\xf6\x8b1\x17\x00U\xb5\x8c\ +1o\x81\x8bi\x9a\xfa\xf5z\xfdWq\xd4$Il\ +U\xdd\xcb\xb2\xec\xbb\xe7yw\xf2\x07\x04`<\x1e?\ +\x11\x91\xfb\x9b\x0e\xb5\x06\xaf\xf3\xef\xfc\x1b\x01\xb8\xb4\x85\ +\x0a\xbf\xa6Z\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x02\x0c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x89ID\ +AT8\x8d\x9d\x92\xbdj\x14Q\x14\xc7\x7fg\xee\x1a\ +\x90\x14\x89 \x09\xa6J\xc4\x80\x8d\xc5\xcc\xdee\xb6\xb3\ +\xd4'\xd8\xce*o\x90*\x04\x82\x11\x83\x8f\x11\x10K\ +\x0b\x1f\xc0\x17\x90\xdd\x8b\xcb4Z$\x19\x13!\x9d\xc1\ +|t\x9b;\xf7X\xe4Fff\x83\xc2\x9e\xea\xf0?\ +\xe7\xfc\xee\xf9\xb8B\xcbF\xa3\xd1n\xaf\xd7\xdb\xadk\ +\xce9m\xe7Yk\x05 i\x07D\xe4E[\xfb\x97\ +5\x00\xaa*\xc0\xb3\xa2(\x96f\x02\x14E\xb1\x02\xcc\ +{\xef\x1f\xcf\x04\x98L&O\x00B\x08ku\xddZ\ ++I\x92,\x01\xe7\xaa\xfa\xf4v\xfe)@\x92$\xeb\ +\xd1\x9d\xea\xa0\xaa\xaam`QD^\xd7u\x01p\xce\ +=\x04\xae\x81-`KD\xf6Uu\x13X\xb0\xd6\xfe\ +t\xce=\x02\x8e\x80\xfb\x80\xde4e\xbf\xfe\xed\xc0\x18\ +\xf3\x00\xf8\x05l\x02\xa8\xea+\xe0\xb7\x88\xac\xc4\x87v\ +b1\x80\x88\xc8^c\x844M\x0fT\xf5\x030\x17\ +\xf5{\xaa\xfa\xa9\xdb\xed~\x19\x8f\xc7\xab\xc0\x060\x89\ +\xb1kU}9\x1c\x0e\x9f7v`\x8cySK\xaa\ +\x8c1;q\xb1W\xc6\x98e\x11y\x17c\x1f\xbd\xf7\ +\x8b\x9dN\xe7\xb8\x01\xc8\xb2\xec\x04\xd8\x8f=\xbe\xcf\xb2\ +\xec\x1b@\x9e\xe7gi\x9a\x9e\xc7\x1d\x00\x1c\xf5\xfb\xfd\ +\xcb\x98?u\x85\xb7\xc0\x85\xf7~\x8f\x96\xa9\xeaA\x84\ +\xffh\xd4\xdc:\xce9\x0d!\x9c\x02\x0b\xc6\x98\xb2\xfd\ +\xff\xab\xaa:\x04\x08!\xdc\x0d\xf8\x9f\xe5y~\xc6\xcd\ +e\xca\x99\x00\x00\x22\xf2\xbd,\xcb\xd3\x99\x01!\x84\xcf\ +\x83\xc1\xa0\xaak\x7f\x00e\xdc\x92\x1f\x87\xf2S\x13\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01@\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xbdID\ +AT8\x8d\xa5\x93\xcd\x09\xc2@\x10\x85\xdf\x0cv \ +x\xb1\x8b\x1c\xacA<\x98\x22\x14g\x0f)'\xb0;\ +\x17\xd1\x12$h\x0f\x82\xad\xd8B\xc6K\xa8\xaa\x0d\ +\xbd\x89\x08%\x05\x9f\xf1\xde\xaf\x98\xb9\x01\xb0\x10\x11\xe2\ +\x1cXU\x0bf\xbe\x98\xd9\xfe}7Y\xa0\xaa\x05\x80\ +\xab\x99\x1d\x9csM\x96`\x08\x06\x80Y\x0a\xae\xebz\ +\xde\xc1;\xe7\xdcmj\xe3^\xbc\xf7\xcbH+\x8b\x1f\ +F\xa0X\xa23\x08!l\x98\xf9\xd1\xd5\x1f\xcd\xd7\x0c\ +B\x08k\x22:\x02(\xab\xaazf5\xe8\xe0\x13\x80\ +RD\xee)\xb8'\xf8\x05\xee\x09\x88\xe8\xdc\xb6\xed6\ +\x07\x06\xbaeJ-L\x8e0;/EYM#)\ +\x89\x93\x0f\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x03\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x80ID\ +AT8\x8d\xa5S;nTA\x10\xacj\x91\xf8\x02\ +{\x03;#\xeb~\x81\x1d\xb0{\x01\x90\x900\x01\x16\ +!\x9c\x00\x09\x118D\x02\x02\xc7\xe4N\x96\xc0\x89\x0f\ +\xe0\xdd\x00\x90\xf6MF\xe6\xbd\xc1^\x00\x09\xa4.\x92\ +\x99e\x80'!D'=]S\xd5\xea\xcf\x0c\xf0\x9f\ +\xc6)\xb0\x94\xf2\x19\xc0+\x00\xef%=\x03\xf0:\x22\ +\x8e\xa7\xb8w\xa6\xc0\xcc|if\x1f\x00\xccH.3\ +\xf3\xf4\xaf\x15\x94R\xeeJ: y\xe9\xeeG\x9b\xcd\ +\xe6\x9e\x99\xad2s>\x0c\xc3\xba\x94r+\xe9\x8c\xe4\ +Ww\xff\xd2t\xd6\x0eU|\x0d\xe0\x10\x00\x86aX\ +\xf7\x1e\xc0!\xc9kI\x07}\x05\xfb\x04$/\x01\xcc\ +\x00`\x1c\xc7yO\xea\xe2Y\xe5\xfdla\x1c\xc7O\ +\x00^D\xc4\xc7F&\xb9\x94\xf4\x98\xe4\x8d\xa4E\x8b\ +#bU9'\x00\xdeE\xc4\xb1\x018'yUA\ +D\xc4\xaa\x8a\x97\xb5\xb2?\xc4$\xaf\x00\x9c\x03\x00K\ +)\xb7\xad\xef\x7f\xb4\xad\xbb\x1fY\xdd\xf3.3\xe7\xee\ +Nw\xa7\xa4\x05\x80]%\xee$-\xda]f\xce\xeb\ +\xdds\x0003{\x9b\x99\xa7m\xda\xfd\x0c\x00\xa0\xb5\ +\xd3\x069\x0c\xc3\xda\xcc\x1e\x91|\x03\xfc\xfa\x0e\xf6\xad\ +HZD\xc4\xaa\x94\x22wgMz\xd3\x97\xdet\xfd\ +\x1a\x9f\xb6\xb2\xdb\xc0\x9au\xf1\xae\xf2\xf6f\xdd\xf9;\ +\xc9\x07\x00\xb6\xb5\x95\x93\xdeW\xfc\xbe\xa4o}\x82\xc9\ +\xcf\xd4\xadjV\x87\xf8\xb0\xbd\x93\xdf\xcd&A\xb3\x0b\ +Ig\x00\xb6\x92\x9e\x98\xd9\xc5\x14\x0f\x00~\x00\x12\x22\ +\xcb\x16\x8e\x8b\xda\xc7\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x02[\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x00\x15\x09\xab\x7f:\x9e\x00\x00\x01\xe8ID\ +AT8\xcb\xad\x93=\x88\x13A\x18\x86\xdf\xf9\xd9\x9f\ +\x08BXb\xa7\x85)\x166\xc9\xc5\xac\x98&\x85\x8d\ +\x82\x88\x16V\x96\x82z\xc5\x95\x1ejc#rE\x0a\ +-\x95CD\x14\xb1\xb1J\xad`!V!\xc8J\xd6\ +\xb0\xb0\x85h)(\x09\xdcr3\xee\xec\xec\xd8\xdcA\ +r\xe6\xf4@\x9fn\xe6\x9box\xbey\x19\xe0\x1f!\ +\x00\x90\xa6\xe9\xe7<\xcf\x8f\xcf\x17l\xdb\xee\xfb\xbe\x7f\ +'M\xd3\x9bJ\xa9\x07\xc6\x98\xf9\xda{\xdf\xf7O\x03\ +\x00\xdd\xd9\x0b9\xe7^Q\x14\x8f\xa5\x94FJy1\ +\xcb\xb2\x0d\x00\x98N\xa7\x8f\x94R\xa7\xa4\x94?\x95R\ +}\xce\xb9'\x84\xb8\xb0`\xb0\xcbh4:\xcc9\xff\ +\xa4\xb5\xde\xf2<\xefd\xbd^\xcf\x01 \x8a\xa27\x00\ +\x8e\x09!\xc2^\xaf'\xe7{\xe8\xfc\xa2\xdb\xednq\ +\xce\xd7(\xa5\xcd,\xcbn\x01\xc0d2\xb9\xca\x18;\ +\xc3\x18\xbb\xbe\xb7\xf97\x83]\xe28~Q\x14\xc5e\ +\x00g\x01\x0c\x18c\xcf\xdb\xed\xf6\xedeg\xe9\xd2\x97\ +%d\x1d\xc0Lk\xfd\x16\xc0\xcc\xb2\xac\xbb\xfb\xa5\xb0\ +\xf4\x82V\xab\xf5\x03@\x1f\x80\x0d\xe0a\x10\x04\xdb\x7f\ +\x8cq/\xc3\xe1\xd0\xb5m\xfb\x83\xd6:`\x8c}s\ +]w%\x08\x82\xef\x076\xa8T*\x1b\x00\x8er\xce\ +\xcf\x03\xa8\xe6y\xfe\xe4\xc0#\x8c\xc7\xe3^Q\x14\xeb\ +\x8c\xb1\x1b\x9dN\xe75\xa5\xf4\x9e\xd6\xfaR\x1c\xc7W\ +\xfe:B\x92$\x87\xa4\x94\x1f\x8d1_\xc20\xb6\x80\x8emll\xcc\x8a\xc8\x92\xe38\x8b\ +\xaaz\x14\x98%i\xddM\x92&S\xf1<\xaf<7\ +7\xf7\xc78\xbc\xf7\xed\xde\xb6\x7f\x01e\xe0CJ\xf6\ +&-\xdf\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04\x22\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x9fID\ +ATX\x85\xed\x96Oh\x1cU\x1c\xc7?\xbf\x99\xdd\ +\x95\xa4\xe2M\xa4iB\x12\x9a(zIvg&\xec\ +]O)d7V\xf4\xa0\x07Q\xf0jDMU0\ +\x14\x0fb\xad\x15\xa5\x9e\x05\x95\x1eLZ\xec\xaa\x11\xc1\ +\x83'!\xc9\xce\xec\xa6\x87\x1c\x84P\xff\xa5V\x0f^\ +\x1a\x8ai2\xf3~\x1ef\x0a\xdb\xdd\x99\xec\xa6z3\ +\xdf\xcb>\xf6}\xdf\xef\xf7y\xbfy\xf3~\x03\x87\xfa\ +\xbfK\x0ebn4\x1a\xc3\xc6\x98\x0ap\x02\x18\x06\x06\ +\x93\xa9-U\xfd\x09XV\xd5\xda\xd4\xd4\xd4o\xff)\ +\xc0\xca\xca\xca\xa0m\xdbo\x8a\xc8\xf3\x80\xdd\xc5n\x80\ +K\xb6m\xcf\x17\x8b\xc5\x9f\xff5@\xbd^?)\x22\ +\x9f\x00G\x80[\x22\xf2\x851\xa6\x064\x0b\x85\xc2\x16\ +\xc0\xee\xee\xee\xa0\x888@\x05\xa8\x02\x05`[U\x9f\ +\xf1<\xef\xcb\xbb\x06\xf0}\xffe\xe0l\xe2[\xeae\ +W\xbe\xef\x1fO\xd6\xcc\x12Wc\xceu\xdd\xf3\x07\x06\ +Hv\xbe\x04\x18\x11y\xc5q\x9c\x0f\xf6K\xdc\xae \ +\x08^U\xd5w\x00D\xa4\xea8\xceW=\x03$\x87\ +m\x83\xb8\xecs\xae\xeb~x\x90\xe4\xb7U\xaf\xd7\xe7\ +E\xe4\x0cp\xc3\xb2\xac\x87K\xa5\xd2\xef\xed\x1e+m\ +\xa11\xe6-\xe0\x88\xaa~~\xb7\xc9\x01<\xcf{\x17\ +\xb8\x0c\xdcg\x8c9\x9d\xe6\xe9\xa8\xc0\xea\xea\xea\xa8m\ +\xdb\x9b\xc0\x9eeY\x0f\x95J\xa5_\xda=\xbe\xef\xf7\ +\x8b\xc8\x1b\xaa\xfa\x14p?\xb0\xa9\xaa\xaf{\x9e\xf7]\ +\xbb7\x08\x821U\xdd\x00\xec0\x0cG\xca\xe5\xf2V\ +\xeb|G\x05,\xcb\xaa&\xff_LK\x9e\xe8[U\ +}MD\xae\x00\x8b\xc0\xb0\x88|\xd3h4\x1ei7\ +:\x8e\xb3\x09\xd4\x00;\x9f\xcfW:\xf2\xa5\x00L'\ +\xc3ZFrT\xf5\x9c\xaa\xce8\x8e\xf3\x84\xeb\xba/\ +\x00\xcf\x02\xb9(\x8af\xd3\xfc\x22RK\xd6M\xb7\xcf\ +\xe5R\x82\x8f\x01DQ\xe4g\x01x\x9ew\x07\x9c\x88\ +\x14T\x15\x11\xf9;\xcdo\x8c\xf1E\x04\xe0x\xfb\x5c\ +\xda!| \x01\xf8#\x0b\xa0U\xcdfs\x5cU\xcf\ +\x03\x7f\x85ax!\xcd\xd3\xdf\xdf\x7f-\x19\x1e\xeb\x05\ +\xa0g5\x1a\x8d\x81(\x8a\xbe\x07\xfa\x80\x13\xe5r\xf9\ +\xcf4\xdf\xf6\xf6\xf6\xed<\xa6\x17\x80\xeb\x00\xf9|\xfe\ +h7\x00U]\x00\x06Tu\xc6u\xdd\xd5,_.\ +\x97\x1bH\x86\xdd\xef\x01\x11\xb9\x9a\xfc:=\x00<\x08\ +\x5c\xf1<\xef\x87\xfd|-\xb1\xaev\xc0\xa5\xf8\x97\x81\ +\xc7\x88\x9b\xca\xd2~\x81\x1d\xc7y\xb4\x1bd\x02Zm\ +\x89}\x87\xd2^\xc3\xcb\xc4\xcf\xead\xb3\xd9\x1c\xc9\x0a\ +\xba\xb1\xb1Q\xf0}\xff\xd7 \x08~\x5c\x5c\x5c\xccl\ +\xd1A\x10\x8c\x11w\xc90\x0c\xc3\x8e\xce\xd8\x01\x90t\ +\xbb\xcf\x80{\xa2(:\x93\x158\x0c\xc3\xbc\x88\x1c\x05\ +F\x8a\xc5bZ%\x01P\xd5\xf7\x80\xbc\xaa~\xdc~\ +\x0b\xa6\x02$Z\x00n\x02O\x06A0\x97f\x98\x98\ +\x98\xb8i\x8c\x19\xb5,kd||\xfcV\x9a\xc7\xf7\ +\xfdS\xc4\xbb\xbf!\x22\xa7\xd3<\x99\xed8\x08\x82\xc7\ +U\xf5\x22\xf1\xe3\x98w]\xf7\xfd,\xef>\xc9\xdf\x06\ +\x10\x91\x8a\xe38_\x1f\x08\x00\xa0^\xaf\xbf$\x22\xe7\ +\xe2\x18r\xc9\x183\xefy^\xc7InU\xb3\xd9\x1c\ +\x8f\xa2\xe8,\xf1\xce\x8d\xaa\xbe\xe8y\xdeGY\xfe\xae\ +\x9fdA\x10\xcc\xaa\xea\xa7\xc0\xbd\xc0.q{\xad\x01\ +\x8d\xbe\xbe\xbe-\x80\x9d\x9d\x9d!\xc0\x01\xaa\xaa:\x03\ +\xe4\x89\xcb\xfet\xd6\xce{\x06\x00X__?\xb6\xb7\ +\xb7\xb7 \x22\xcf\x91\xfe\xea\xb6\xca\x88\xc8\x05U=\xe5\ +\xba\xee\xf5n\xb1\x0f\xf4Y\xbe\xb6\xb66$\x22\x15\xcb\ +\xb2\xa6Uu\x14\x18\x02\x14\xd8\x22\xbed\x96s\xb9\x5c\ +mrr\xf2\xda\xbe\x81\x0eu\xa8\x16\xfd\x03\x06\x08k\ +\xa5W\x9e\x0b\xc5\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\xe7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01dID\ +AT8\x8d\x9d\x90\xbdJ\xabA\x10\x86\x9f1\x90\x10\ +\xec\xbc\x05\xb1\x12\x82\x1flB\xc04V\xfeT\xa2v\ +r.\xc2F\xbd\x05\xb1\xb5\x10;\x15\x8b\xc3\xf1\x17\x14\ +l\xb4\xb1sw\x89\xe14\xc2\x82hg'Q\x90h\ +\xfc\xbe\xb1\x89\x12cb\x82o5\xcc;\xef\xb33K\ +\x08!\x13B\xc8\xf0KI\x08!S\xadV\xef\x00\xab\ +\xaa\xff\xe28>,\x16\x8b\x8f=\x03\x00\xbc\xf7\xbb\xaa\ +:\xdb\xe8\xbd\x88\xc8\x85\xaa\x1e'I\xf2\xb7P(\xdc\ +w\x05Xk\xff\x88\xc8V\x1b?\x06.\x80\x83t:\ +\xbd\x9d\xcb\xe5\x1eZ\x07\xfa\x00\xea\xf5\xfa\x09\xf0\xd6\x06\ +\xf0\x1f8M\x92\xe4\xac]\xf8s\x03\x00\xe7\xdc90\ +\xd6\xe2_\x01\xa3\xc6\x98\xe7N'\xf45\xd5Gm\xfc\ +\x11`\xa3S\xf8\x0b \x95J}\x00.\x81\xeb\xa6\x99\ +yk\xedBW@\x14E\xb7@\x05\xd8\xac\xd5j\x05\ +U\xdd\xff\xf0Dd\xd5{?\xf1#\x00@U\x0fU\ +\xf5\xb4T*=\x19c\xe6\x80e \x01R\xaa\xba\xe3\ +\x9c\x1b\xec\x06X\xcf\xe7\xf37\x8dW\xd5\x18\xb3\x22\x22\ +\xd3@\x15\x18\x00\xf6*\x95J\x7fsF\xe8A\xe5r\ +y(\x8e\xe3\x03`XU\xf7\x8d1s\x22\xa2\xdf6\ +\xe8\xa4(\x8aB6\x9b-\x8a\xc8\x9e\x88\xccx\xef\x17\ +{\xc9}\x93\xaa\x8asn\xc99\xf7j\xad\x9d\xea\xf9\ +\x84VYk'EdMD\xc6\x7f\x05\x80\xcf\x7f\x99\ +|\x07\x8d\xf2\x97\xc9\x93\xc3\xbd\x96\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01N\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xcbID\ +AT8\x8d\xdd\x901n\xc2@\x10E\xdf'v\x1a\ +\x0aNAZ7s!\x1a\x0a\xc2\x09\xb8\x03BB\xe9\ +\x88\xb8\x90\xa7q\x9b\x5c\x02\x8ah%,\xb4iX\xe4\ +\xc2\xd8\x8b\xd2\xe5U;\x9a\xffgf?\xfc\x11\xa5G\ +]\xd7;I\xef@9\xe2\xb9\x00[3\xdb\x00L\x00\ +b\x8c\x92\xb4\xca0\x03\xbc\x02\xebTL\x00$E\xe0\ +\x03h3\x06\x5c$\xed3ty\xdc3p\xf7\x03\xb0\ +\x00^F\xf8\ +\x85\x10\xc2U\xd2g\xaa\xbb\x17\x8cnO\xc4\x18\xef\xbe\ +\x7f\x90\xc1\xc3\x8d\xee\xfe\x05\xcco\xe5\xb7\x99\xbd\xf5\xe9\ +\xd4#\xce\xe5\xe1\xd0\xa7\xf8\x05\x13\xd9I\x99\xd6m\xdd\ +\x91\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xa7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02$ID\ +AT8\x8d\x9d\x919hTa\x14\x85\xbf\xf3\xe6e\ +\x99\x88QA\xb40.\xe0\xd6\x98\x04\xf2^p\xc4\xa4\ +\x91$\x0aB:\x0b!\x82\x85D\xb0P\x1b\x0b\x1b\x05\ +\x05\x0bQ\x94\x04\x0cX\xa4tA\x84\x80\x0b\x22\xc24\ +\x11fx\xef\x05\x22*\x16a\x02\x12\x14\x15,\x5c@\ +2\xf9\xffk\x15\xc9\xc8\x8c\x85\xb7\xba\xdb\xf9\xe0\x9e+\ +\xfe#\xd24\x1d\x03F\xcdlL\xffZ\x9c\x9d\x9d\xdd\ +\xd0\xdd\xdd\xfdyzzzu[[\xdb\x1e\xe7\x5c\x97\ +\xa4.\xe0$\x90\x03~4\x04\x94J\xa5\x8e0\x0c_\ +\x00s\xc0O\xc0\x01\x1b\x81\x0a0\x0c\xac\x93t5l\ +\x04hjj\xbabf\x9b\x80)\xe0\xa3\x99\xbd\xf1\xde\ +\xbf\xcf\xe5r\x13\x92N\x9b\xd9\xe6(\x8a\xae\xd5\x05\xcc\ +\xcc\xcc\xc4\xde\xfb!3;$ijqqqw>\ +\x9fow\xceM\x06A0\xe2\xbd?\x06\xbc\x06\x08\x96\ +Ef\x16dYv0M\xd33f6.\xe9ro\ +o\xefK3{\xd4\xda\xdaz\xd197\x09\x1c\xef\xe9\ +\xe9\xf9`f\xfb\x9dso\x01\xc2,\xcbv\x98\xd9`\ +\x96e\x83\x92\xd6\x03\xdb\xcdl\x01\xb8\x0d\xe0\x9c\xbb \ +\xa9\x0c\xfc\x02\xae\xa7i:\x0b\xb4\xb6\xb4\xb4,\x02\x04\ +f6\x04\xdc\x02\xbe\x027\x9cs}q\x1c\xef\x8d\xe3\ +\xb8\x0aP(\x14\x16*\x95\xca\x16\xef\xfd\xb0\xa4)\xa0\ +\x1f\xe8\xabV\xab;\x01\x04\x90e\xd9Y3;\xb5\xb4\ +\xb4\xd4_(\x14>526\xcb\xb2.I\xcf\xcd\xec\ +D\x14E\x8f\xffx\x10E\xd1M\xe0a\x18\x86O\xd3\ +4]SO\x5c.\x97w\x99\xd93\xef\xfd\xbdeq\ +\x8d\x89q\x1c\x9f\x974/i\xb4\x1e \x08\x82K\xc0\ +\x18\xf0ne\xbf\xe6\x8d\xde\xfbo\xc0\xb7z\x00I\xdf\ +\xcd\xcc\x01_\x1a\x02$m\x93t\x1f I\x92AI\ +\x07$\xdd\x8d\xa2\xe8\x95\xa4y\xef\xfd\xbe\xe6\xe6\xe6;\ +5\x9a\x95E\x9a\xa6\xf3f6\x01\x1c\x91\xb4\x0ax\x02\ +\x8c\x00\xa9\x99\xcd\x05A\xd0\x19E\xd1@\xcdi\xcbI\ +\xb1X\x0c\x81\x0eIG\x81\xf1J\xa5\xd2\x19\xc7\xf1\xb9\ +|>\xbf\xd5\xcc\x1eH:lfk\xeb\x9d\x07@\xa9\ +TjO\x92d\xa0\xd1\xbcX,\x86I\x92\x0c\xff\xdd\ +\xff\x0d\xe9d\xf1\xb4k/X\x9f\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x00\xf5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00rID\ +AT8\x8d\xdd\x91\xb1\x0d\x80 \x14D\xc1\x99\x98@\ +[g`\x07'p4{\xef\x8e\xd6\x09\x9cC\x1b5\ +\x86\x10\x82\x81\xcaW\xfd\x5cq\xf9\xb9gH\x1e\xa6\x82\ +.\x0e$\xcd$7IcI\x81\xad\xf9\xc09gM\ +\x5c\x00`\x92\xb4J\xea\x8bZ\x9am\xf0.\xfat7\ +\xb7\x90\xe32\xb4\x03\xf0w\xd6\xdeB\x0e\x00\x9e\xe4\x12\ +B\x18\x9e\xf0G\x16R\x0b\x97\xd0\xceBr\xe1\x02N\ +/\xf3}~i\xa4\x04\xdc\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\x90\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x11\x03\x18\xc0\xb3f\xfc\x00\x00\x02\x1dID\ +AT8\xcb\x95S=\x8b\x13Q\x14=\xf7\xbd0I\ +\x1b\x82 \xbbh\xb4\x90a\x22K \x90\xc2\xb5\x925\ +\x85\xb6\xd6\x0a\x12EDXP\xec\x16\xb6Z\xb6\x13\x11\ +\x15-\xe2\xc7\xafPt\x17\xadV!\x84I\x86\x991\ +N\x88`\x14\xe2\x04R\x05\xc2\xc4\xcc\xe4]\x9b$\x8c\ +\xc3\x8az\xaa\xfb\xce\xbd\xef\x5c\xee\x17!\x81F\xa3\xb1\ +\x06\xe0\x1a\x80\x0d\x00'\xe6\xf4W\x00\xfb\xcc\x5c+\x97\ +\xcbN<\x9e\x16\x86\xef\xfb\xe9\xc1`p_)u\x03\ +\x80J\xa5R\x07D\xd4\x01@\xcc|*\x8a\xa2\xb3\x00\ +\x88\x88\x9ef\xb3\xd9;\xf9|~\xba\x14\xf0}?\xdd\ +\xef\xf7_\x038'\xa5\xaci\x9a\xb6m\x18\xc6\x8fx\ +&\xcf\xf3V\x82 \xd8QJ]\x05\xf0.\x97\xcb]\ +X\x88\xc0\xb2\xac'\xa6i\xb2\xeb\xba\xb7\xf0\x178\x8e\ +\xb3i\x9a&\xdb\xb6\xfd\x10\x00\xa8\xd1h\xacI)[\ +B\x88\xe7\xc5b\xf1z<\x98\x99E\xbb\xdd>Y(\ +\x14\xbe\xc4y\xcb\xb2^(\xa5.\x87aX\x14\x00\xaa\ +\x00\x94\xa6i\xdb\xc9l\x9e\xe7\x9d\x0f\x82\xe033\x8b\ +8\x9f\xc9d\xb6\x00\xb0\x94\xb2*\x00TR\xa9\xd4A\ +\xb2f\x00\x98N\xa7\xed0\x0c\xcb\x008\xce\xeb\xba\xde\ +\x17B|d\xe6\x8a\x00p\x1c\x80wX\xbdD\xf4F\ +J\xd9t]\xf7h\xd2'\xa5\xf4\x00\xe4\x05\x00&\x22\ +:L@\x08q\xe9\x0f\xae\xc5\x04Y\x00\xf8\x1eE\x91\ +\x8e\xff\xc4l6\xd3\x01|\x13\x00\xf6\x98y\xdd\xf3\xbc\ +\x95\x7f\xfd\xdc\xedvW\x95Rg\x88hO0s\x0d\ +\x00\x05A\xb0sH\x0f~J)\x01\xe0}\x9c\x1f\x8f\ +\xc7\xbbs\x7f\x0d\x00\xd0j\xb5\x1e\x99\xa6\xc9\x8e\xe3l\ +&E:\x9d\xce\x11\xd7u\x8f-\xde\xb6m\xdfn6\ +\x9blY\xd6\x83\xe5*\xf7z=m8\x1c\xbe\x22\xa2\ +\x0d)\xe5\xcbL&\xb3\xa5\xebz?\xb1\x13\xab\x93\xc9\ +dW)u\x85\x88\xf6\xd3\xe9\xf4E\xc30\xc2e\x8b\ +{\xbd\x9e6\x1a\x8d\xeeEQts>\x81\x0f\xf3Q\ +a6\x9b\xe9J\xa9\xf59\xffX\xd3\xb4\xbb\x86a\x84\ +\xbf]\xe3\x02\xf5z\xfd\xb4\x94\xb2\xca\xcc\x95\xc49\xbf\ +\x15B<+\x95J\x9f\xe2\xf1\xbf\x00-1\xef\x13\x84\ +<\x9e\xea\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xa4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02!ID\ +AT8\x8d\x8dQ;h\x14Q\x14=\xf7\xceL\xa2\ +k\x15\x04\x11\x1b\x1b\x03j\xa2\x13wg\x96\xb5X,\ +\x14,\x04\x03*(h\xc4 \x88\x01E,\xec\x04A\ +,D\x0b\xed\x14KQ\xb1\x09\x88E\x04\x91,(,\ +\xec\xbey\xb3\xf8k\x14\x8c\x16\xab`!J\x0c+\xfb\ +f\xde\xb5\xd9\x09\xe3\xbabny\xce;\xe7\x9d{.\ +a\x05\xd3l6\xd7\x13\xd1i\xcf\xf3\x1eLLL\xbc\ +\xcbs\xbc\x12\x03\x22\xbaED\x97\x92$y\xa9\xb5>\ +\x9f\xe7\x5c\xad\xf5]\xd7ug|\xdf_\xea\x17\xc6q\ +\xbc5I\x92i\x00u\x00\x0dk\xada\xe6#\x00n\ +,'\x10\x91)cL\xa4\xb5\xde>\xe0\xf3\x0dD4\ +\x12\x86\xe1\xf5 \x08\xae:\x8e\xf3VD\xdcA+l\ +\x16\x91F\x14E\xe7\xf2d\xb1X|FD/\xe28\ +>\xd8\x83\xb6\x00x\xff\xc7zQ\x14I\x1e\x10\x91{\ +\x85Bafll\xecg\x865\x9b\xcd\xfb\x8e\xe3\xb4\ +E\xe4\x10\x80W\x9e\xe7]\xf4}\xffM>A\xbe\xb0\ +c\x9dNG\xc7q\xecg\xd8\xf0\xf0\xf0)\x22b\x00\ +k\xac\xb5g\xbb\xdd\xee\xa4Rj\xb6^\xafo\xfa+\ +An:DT-\x95J\x1a\x00\xb4\xd6s\x00\x92R\ +\xa9\xb4\x1f\x00\x94R;\x88\xe8\xd1\xbf\xce(\x22r-\ +\x13\xd7j5WD\xc6\x01|\xee\x91\xe48\xce\x09\x00\ +vP\x82_\x222\x1d\x86\xe1\xc3\x0cPJ]a\xe6\ +mi\x9a\xa6\x00\xbe3\xf3n\x22\xfa\x0a\xe0\xb8\xdb'\ +\xfeb\xad\x9d,\x97\xcbJD(\x8a\xa2y\x22\x1a\x17\ +\x91\x11\x11i\x13\xd17f\xfeh\x8c9P\xa9Tt\ +\x7f\x89\xaf\x99yg\xb9\x5cV\xbd2ehhh\x0a\ +\xc0\x123\x1f\x0d\x82`c\x9a\xa6\xbbDd-3\xb7\ +3Qf\xf0\x14@\xb5X,~\xca\xc7\xe9v\xbb\x8f\ +\x01\xac6\xc6<\x01\x00\xcf\xf3\x0e\x8bH\xd5q\x9c3\ +\xcb\x06\x22rgqqq_\x10\x04?\xf2\xe2F\xa3\ +\xb1\x97\x88\xe6\x01\xcc\xba\xae\xab\x95R{\xac\xb5\xcf\x99\ +\xf9\x831\xe6v\xf6\x8e\x06\x9d\xa0\xd5j\x8d&I2\ +\x1a\x86\xe1\x5c\xaf\xc4\x93DtYD\xd6\xa5iz\xa1\ +R\xa9\xdc\x1c\xa4\xfb\xef,,,\xac\xea\xc7~\x03[\ +;\xf3\xba/y\xc1D\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x02\xa5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x10*;'P\xe2R\x00\x00\x022ID\ +AT8\xcb\x85Q1OSa\x14=\xf7^\xfax\ +8a\xa2\xb5\xa1jc\x0b\x11I,\xa5>c\x18u\ +R\xac\xd1\xb8:88h\xc2 \xd1\xe0\x7f0$\xe2\ +\x80\x8b\x9b\x83\x0ce\x81\xcdQ\x17\x13dh(\xc1\xa7\ +ea@\xa51\xc4\xa1\xd2\xa4\xcd\xbb\xdfuy\x10\x83\ +\x0f\xb9\xdb\xb9\xb9\xe7\xe4\x9cs\x09\x09cfT\xab\xd5\ +\x8a\xaa\x9a\x03\x00f\xde,\x97\xcbkDd\x07o\xe9\ +o\xb0\xbd\xbd\xdd\xdbl6'U\xf5\x89\xaaf\x89h\ +O\x10\x22\xf2MD^\xf4\xf7\xf7\xcf\xe5r\xb9\xee?\ +\x02\x8dF#\xddj\xb5\x16\x9ds\xe3\x22R\x17\x917\ +\xcc\xbc\x06\x00\xce\xb9\xa2\xaa\xdeW\xd5\x8b\xa9T\xea\xa3\ +\xe7ywFFF~\xee\x0b,//\xfb\x9e\xe7\xbd\ +\x07\x10\x10\xd1\xf4\xe8\xe8\xe8\xcb\x83v\xcd\x8cVWW\ +\xa7\xccl\xc69\xf7)\x9b\xcd^\xcdd2\x1d\x06\x80\ +\xbe\xbe\xbe\xa9(\x8a\xae\x10\xd1t\xa9T\x9aM\xccJ\ +d\xa5Ri\x96\x99\x9f9\xe7\xc6\x9b\xcd\xe6c\x00\xa0\ +j\xb5*CCC?\xcc\xec\xfb\xd8\xd8X\x99\x88\x1c\ +\xfe3f\xc6\xb5Z\xadFD\x99\x8d\x8d\x8d\x01.\x14\ +\x0a\x97U\xf5\xa4\x99\xcd\x1fE\x8e\x9d83{\xab\xaa\ +\xe9|>\x1f\xb0s\xee\x1c\x00\x88\xc8f\xa3\xd1H\x1f\ +%\xb0\xbe\xbe~BD6c7yf\xe6\x1b\x00\x10\ +E\xd1\x99\xdd\xdd\xdd\x0fa\x18\x1e;\x8c\xbc\xb4\xb4$\ +\xddn\xf7]\x14Egc7\xd7\xd9\xcc&\xf6\xe2\xa9\ +\xea\xf9n\xb7\xfb\xe00\x81B\xa1PQ\xd52\x80\xbd\ +\x92o2\x80\xde\x18\x0c\x03\x08U\xf5\xa9\x99Q\x92\x80\ +sn\x12\xc0g\x00\x17\xe2\x95\xc7f\xf6%\x06\xb7\xcc\ +lAUsa\x18^J\xc8\x9eQ\xd5kD\xb4\x00\ +\xa0\x12w\xf0\x95\x99\xb9\x1a\xdfd\x88\xe87\x11\xb5\x9c\ +s\x13\x09\xef\xbb\xab\xaam\x00m\x00\xa7\xe2\xf5\x02\x9b\ +\xd9+\x11\xd9\x8a\x17\x0f\xcd\xec9\x11\x0d$$\x18\x06\ +0cf\x8f\xe2\xafm\x11\xd1\x1c\x07A\xd0\xf6}\xbf\ +\x22\x22;\x00\x06{zz\x06\x89h\xee \x9b\x99_\ +\x8bH\x01@^Dv|\xdf\xaf\x04A\xd0\xde/\xab\ +^\xaf\x1f\xeft:\xf7\x88h+\x08\x82\xc5\xa4\x12W\ +VVn3\xf3\xe9T*5_,\x16\x7f\x01\xc0\x1f\ +\x1f-\x03\xa7a[\xf5\x85\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xe2ID\ +AT8\x8d\xad\x91=hSQ\x14\xc7\x7f\xe7\xdd\x97\ + N\x8a\xa0C\x91*tp\xa9ix\xb7%C\xc0\ +A\xc1A\xc1/\x10\xdcT\xb0 \x88\x83 \xad\x1d\x5c\ +Z[\x1a\xea\xd0\xad\xe0 \xb8\x09R\x1c\xc4A\x11\xe9\ +$I\xefm\xe3\x10\xa8\xe0$:t.\xd2\xd0\x97w\ +\x8fK\x02IL\xd5\xc1\xffv\xcf=\x1f\xff\x0fa\x1f\ +8\xe7N\x017\x81\x1b\xc0\xeb8\x8e+ccc?\ +\xfa\xfb\xa4\xfb\xd1h4\xf2\xbb\xbb\xbb\x97DdRU\ +\xcf\xf6\xfd\xef\x89\xc8KU\x9d\xb7\xd6n\xf5,\xa8\xd7\ +\xebCi\x9a\xde\x11\x91\xbb\xc0\xd1\xfdX\xb5\x11\x80\xb7\ +\xc0\x9c\xb5\xb6*\xde\xfb\x19U\x9d\x05\xa2\xbf\x0c\x0e\xc2\ +\xb4\x00\xac\xaf\xaf\x9f\x13\x91\xa7\xc0\xe9\x7f\x18\xeae\xd0\ +\xa9\xaaj\xb4\xb9\xb9y=\x84\xb0\x00\x9c\x180\xb8'\ +\x22o\xa2(Z)\x16\x8b\xef;E\x01\xa8V\xab'\ +\x8d1\x93\xc0\xe5,\xcbf\x8d1\xc7\x81i\xe0\x10\xb0\ +\x03<\x0f!,\x19cn\xab\xea=\xe0\xa3\x88,&\ +I\xe2\xbb=\xf8\x90\xcb\xe5\xae\x14\x0a\x85\x9f\xed\xa5G\ +\x8c1\x17\x9b\xcd\xe6j\xb9\x5c\xde\xe9\x5cl\x1f{\x07\ +\x8c\x0c\xf2 \x0f>\xfe\xa5'\xc6n8\xe7\ +\x0e\xfeIB\x7f\xffo\x0b\xba\xe2\x1a\x18\xe3\x7f\xc7/\ +}h\xe1M\xbd\xe1\x1d\xbf\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\x0c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x89ID\ +AT8\x8d\x9d\x90\xb1\x8b\x13A\x18\xc5\x7fo\xd6\xc4\ +\xa0F\xc1\xab,DPT\x10\x89$\xbb\xb5X\x09\x07\ +W\x09)\x84\x149\x14\x15K\x15\xfc+\x84\x13\xae\xb2\ +\xed\x1b\xd2\xc8\xcc^\x01{\xc0\ +\x0d\xe0Y\x14EOf\xb3\xd9\xc5\xb2,\xdf\x03\x1f\xca\ +\xb2|^op\xa7^\xc5\xcc\xee\x9b\xd9\xf6\x02\x06x\ +\x94e\xd9F\xbf\xdf\xff\x0c\xbc\x03\x1e:\xe7\x86\x02\x88\ +\xe3\xf8H\xb7\xdb\xfd\x0a\x9c9hP5}\x07\xaeU\ +UuZ\xd2\xd09wU\x8b\xe1l\x98\xd9\xdb\x06x\ +\xa9\xbd0\x0c\xd7%Uf&\x07PU\xd5f\x13U\ +\xd3\xcd<\xcf\x1f\x03H2%I\xb2\x16\x04\xc17\xe0\ +\xe8\x0a!?%]\x0f\xc3p\xe2\x82 \x18\xad\x08\x03\ +\xb4\xcc\xec\xe5d29\xe9\x80\xf1\x8a\xf0R\x17Z\xad\ +\xd6\xf6\x7f\xb2\xbf\xf5\x0b\xbf\xf3\x87\xba\x94\xec\xff\xb4\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xc9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00FID\ +AT8\x8d\xed\x90\xb1\x0d\x001\x08\xc4L\x94\x0dX\ +\x85\xfd\x10\xfb\xb1\xd3\x7f\xfb\xaf4HP\xc6\xa5\xaf:\ +C\x13\x01\x88\x88\xe7+\xdd]\xaaN\x002\xf37\x98\ +\x99T\xdd\xea^\xd8\x00\xaaz\x0cU\xd7\xe6F\x1c\xe0\ +F\x1c\xe0\x05\xa2bJ\x1a\xb1\xea\xf5\xcb\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x07\x04\x17,6\x080\xb1\xa7\x00\x00\x01\xf2ID\ +AT8\xcb\x9d\x91\xcdKTQ\x18\xc6\x7f\xcf\xb9r\ +7NL\x85\x88\x91\x99\x8b\x5c\xe9\xc5{\x19\xa1e\xb8\ +3\xca6!\x99H\xdb\x0a\x82\xa0m\x9b\x16-Z\xf5\ +\x81\xff\x83Q\xce*[\xd4J\xda\x8eW\xe6\x88L\xe0\ +&\xc5\x0c\xdb\xf4\xe1\x94\x9b\x99\xb9\xf3\xb6Q\x9bl$\ +\xe9]\x1e\xf8=\xe7\xf9\x10G\xb8R\xa9\xd4#\xe9\xa9\ +\xa41\xe0\xab\x99\xcd\x8c\x8c\x8c<\x93\xd4\xec\xf8\x17\xbc\ +\xb2\xb2\xd2_\xab\xd5\x16\x80>\xe0\x0d\xd0of\x8f\xbd\ +\xf7\x00O\xdc\x11\xe1\xde \x08&\x0b\x85\xc2\xa5 \x08\ +b\xe7\xdc{Iw\x00\x0e\x15(\x97\xcb=\xb5Z\xed\ +\xf5.<\x15\xc7\xf1\x1c@\x1c\xc7u`\x1d8\x0ep\ +h\x84j\xb5\xfa\xbd\xb3\xb33\x91\xd4\x15\xc7\xf1\xd6\xde\ +\xbb\xf7~\x22\xcb\xb21\xe0E[\x07\x95J\xe5t\xb9\ +\x5c\x9e\xcf\xe5r?\x80\xaa\x99=X]]\xcd\xb5\xc0\ +\xb3\xc0\x86\x99\xdd\x03P\xbb\xccfv\xc697kf\ +'\x80\xcbfv\x0b\xf8\x22i\x16\xd8r\xce\x8d&I\ +\xf2\xe1\x0f\x07-p\xaf\xa4\xa9f\xb3\xf9\xaaP(\x8c\ +K\x9a\x96\xf4\x0dx\x0e|\x0a\xc3\xf0\xc2\x1e\xbc\xef\xc0\ +{\xdf\x97e\xd9\x02p\x16\xb8af'%\xcd\x00E\ +`\xc7\xcc\xa6%}\x0c\xc3p4\x8a\xa2\xf5V\xd7\x1d\ +i\x9a\x9e\xca\xb2\xec\xddn\xdb\xd7\xe38\x9e\xf3\xde\xe7\ +\x1b\x8d\xc6y\xe0\x9a$\xe7\x9c{kf7\xa3(\xda\ +<\xd8\x99\xd24})\xe9j\x10\x04\x93{S\x01,\ +--umoo\xff\xec\xee\xee\x0e\x86\x86\x86v\x0e\ +[\xcb\x01\x17\x81\xf9V\xd8{?\x01l\xe5\xf3\xf9R\ +\xbd^?\xd6f)k\x15\xa8\x02}\xc5b180\ +\xd5f\x18\x86W\x92$\xf9|P\xa0\xd1h\xfc\x8e\xb0\ +\xb8\xb8x_\xd2CIe`\x03\x18\x076\xda\x15V\ +\xa9T\xac\x15\xae\xd7\xebt\xac\xad\xad=\x1a\x18\x18@\ +\xd2m\xe0\x1cP4\xb3\xbbQ\x14\xfd\xf5\xf3\xe0\xe0\xa0\ +\x00\x96\x97\x97mxxX\xfc\xef\xa5i\xba\xdf\xc1/\ +\x89\x89\xea0\xc1\x87\x0a\xc4\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01\x8d\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x0aID\ +AT8\x8d\xb5R=K\xc4@\x10}\x13\x0dV\xb1\ +\xf3\x9fL \x08v\xd6be\xa9\x8d`aq\x1c\x82\ +\xd8\x5c#W\x1c\xf8\x81\x85?\xc1*\x9d\xfe\x81TB\ +`f\xb17\xf7\x0b\xae\x8bupl\x82$1\xd9\x9c\ +\x82\xafY\xe6\xf1\xf6\xcd\xdb\x9d\x01\xfe\x13\xce\xb9\xfb,\ +\xcb6}\x9a\xc0sy\xcf\xcc\xa6Q\x14\x9d\xfe\xc9\x00\ +\xc0\xa2>\xaf\xf3<\xdf\xfe\x95\x81\xaa\x1e\x9a\xd9n]\ +\xee\x84ax\xe9K1\x08U\xb51\xcdw\x02U\x0d\ +\x9ds\xe7#\x86\x93\xa2(\xb6~\x18\x88\xc8>\x807\ +3{\xecv\xef\xa4x(\xcbr\xd94\x22U\xbd\x00\ +p\xbb\xc6\x8bZ0\xb3'f>\x09\x98\xf9\x0e@\x02\ + \x07\x00f&f\xa6\xa6\xb8\xc3\xbd\x038b\xe6c\ +\x22\xfal:\x06\xaa\xda\x9ay\xf7\x13E\xe4ll\xb1\ +ZXg\x0a\xd4G\x8a\xc8\x01\x11=7\xa893\xcf\ +\xfa\xb4\xbd\x8b\x14\xc7\xf1\x0b\x80\xd7\xba\x5cUUu3\ +\x94\xc0\xb7\xcaW\x00@D\xb3$I><\xbaa\xa8\ +\xea\x22M\xd3\x0d\x9f\xe6\x0b\x82\xeeo\xb4x\xa4\x913\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03Y\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x10\x19,P\xe8\x02\xa5\x00\x00\x02\xe6ID\ +AT8\xcb]\x93Kh\xdcU\x14\xc6\x7f\xf7\x9e;\ +&\x13Df\x97l\xc2\xd4<\x1afp2\x99\x89I\ +*\x0a>\x10T\xc4E\xd5\xb5\xaf\x85\xa2\x0b->\x8a\ +\x8a\x88\x8b\xd6\xd2\x0a.\xb4D\x0a\xd6\x95\x22.4\x1b\ +\xebB\xad\xb5\xa4\x08!\xce\xa4\xd3\xc9\xcc\xa4\x01%A\ +P7I\xc4G&\xfe\xe7\xde{\xdcd\xca\xd8\xb3:\ +\x8b\xf3\xfd>\x0e\xe7|\x86\xeb\xaaZ\xad\xe6U\xf5q\ +U}\x08\xb8\x19\x08\xc0&\xf0\xad\xb5\xf6L\xb9\x5cn\ +\xf6\xce\x9bn\xb3\xb4\xb4\xd4\x9fN\xa7\x8f\x85\x10\x8e\x84\ +\x10DD\xd6\xad\xb5?\x8a\x88z\xef'Tu\x1aP\ +k\xed\xe9\xc1\xc1\xc1\xa3CCC\xff^\x03lnn\ +\xde\xb0\xbd\xbd\xfdE\x08\xe1A\xe0\x9c\x88\xdc\xeb\x9c\xcb\ +\x17\x0a\x85\x9f\xbb\x06\xadVk4I\x92wB\x08\x87\ +\x8d1\xdf'I\xf2\xc0\xdc\xdc\xdc\x9e\x05\xd8\xd9\xd99\ +\xb9/~SU\xe7\x81\x8b\xbdb\x80\x5c.\xf7S\xb1\ +X|8\x95J\xbd\x15B\xb8+\x9dN\x9f\x020\xd5\ +j5o\x8c\xb9\x1cB\xe8\x00\x97\x80q\x11\xd9\xb1\xd6\ +\x9e\x1d\x18\x18\xf8j|||\xa3\x17\xb4\xb0\xb0 \xc3\ +\xc3\xc3\xdb\x22r\xa3\xaa\x16l\x08\xe19\xc09\xe7\x9e\ +\xef\xeb\xeb;\xe6\x9c\xfb\x0d\xb8\x10B\x98\xd8\xdd\xdd]\ +\xac\xd5j\x0bkkkc]\xc0\xd8\xd8\xd8\x1d\xc0\xef\ +!\x04\x13c|\xc6\x1ac\xee\xb6\xd6.OMM\x9d\ +-\x14\x0a\x8b\x807\xc6|Y.\x97_\xc8d2\xa3\ +\xc0\xb9$I.6\x9b\xcd'\x00T\xf5\x88\xaa\x1eW\ +\xd5\x0ap\x8f\x05\x0e8\xe7\xaev\x1d\x9cs\x7f\x89\xc8\ +M\x00\xd9l6)\x16\x8b\x1f\x02\x87\xbc\xf7\xafT*\ +\x95\x8fTu\xcc9\xf7\xa9\xb5v\x0d8`\x81\x08\xa4\ +\xae\xdd\xd5\x98uk\xed-\xbd{ONN\xfe\xe2\xbd\ +\x7fZU\x9f\xf4\xde\x9f.\x95J\x1dk\xad\x00X`\ +\xc3{\x7f\xb0\x07p\xc1{\x7f_/\xa0^\xaf\xdf.\ +\x22\x9f\x88\xc8I\xe7\xdc\x8b+++)\xe0 \xb0a\ +\x81\xf31\xc6R\xab\xd5\xca\x03lmm}\x13c\x9c\ +X]]\xcd\xd7\xeb\xf5\x91Z\xad\xf6A\x8c\xf1\xe3T\ +*\xf5X\xa9Tz\x15X\x8f1\xbe\x1eB(\x03\xe7\ +M\xa5R\x99\xb4\xd6^\x8e1VDd1\xc6\xf8g\ +\x8c\xf1Q`PD\xfe\xb1\xd6\x9e\xc9d2\xefg\xb3\ +\xd9\xbf\x01\x1a\x8d\xc6\xe1v\xbb\xfd\xf9\xfe\x87\xe6\xed\xf4\ +\xf4\xf4\x15\x119\xa5\xaa\xb7z\xef\xefW\xd5?\x8c1\ +'\x80_\x81w\x8b\xc5\xe2\x89\xae\x18 \xc6\x98\x03\x8c\ +\xb5\xf6\xbd\x99\x99\x99\xab\x16\xa0\xddn\xbf!\x22_\x03\ +9U\xbd\xad\xd3\xe9\xfc`\x8cy\x048Z\xaf\xd7\x9f\ +\x02h6\x9b#\xb5Z\xed\xb3N\xa7s\x5cD\xbe\xdb\ +\xdb\xdb{\xed\xfa0\xb9\xfe\xfe\xfe\xb7c\x8c/\x85\x10\ +\x0cP\x05:\x22r\x08h\x00\xb9\xfd0\xcdg2\x99\ +\x97\xb3\xd9l\xf2?@\xb7\x96\x97\x97G\x8c1\xcf\x1a\ +c\xeeT\xd5Q@\xf6\xe3|)\xc68?;;\xdb\ +\xe8\x9d\xff\x0f\x9fIWya\x06\xf6\x07\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01\xf3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01pID\ +AT8\x8d\xcd\x901\x88SA\x14E\xcf\x9b\x04T\ +\xb4\x08XY\xa9`\xb0\xb0\xcafF\x82X\xd9\xc9V\ +\xda,\x22\xb2\xdd\x96\x82\x8d\x8d\xa5\xa5v\x06\x05\xb5\xb0\ +\x91\xc5\xcej\xc1\xd6n3o\xe2\xa6R\x09\x08\x96\x16\ +6\xb1p\xf5\x93\x7fm\x8c|\xa2Y\xec\xf4V\xc3\xbc\ +3\xe72\x0f\xfeulqp\xf7{\x92>\xb6\xdb\xed\ +W\xbd^o\xba\x0c\x8e\xc7\xe3\x93u]\xafK:\x95\ +R\xba\xfd'\x81\x80\x1d\xa0of\xbbUUm\x0d\x06\ +\x83O\xee~B\xd2\xd0\xcc\xceK\x1a\x99\xd9\xd5\x18\xe3\ +\xafw\xe6\xee_\x81\xc3\x001F\x9bN\xa7\x87f\xb3\ +\xd9MI\x9b\xadV\xeb\xca|>\xdf\x01\x86\xc0\xc3\x18\ +c\xf5\xb3\x08`?\xc6xd\xd1Lc\x00@)\xe5\ +\xba\xbb+\xe7|\xady\xbf\xcc\x87U\xcb\xe9\xf7\xfb\xcf\ +\x01RJ\xdb\x07-q\xa5\xe0o\xf3\x9f\x09F\xa3\xd1\ +\xb9U\xa0$s\xf7\xb5\x83\x04OC\x08/\xdd}/\ +\xe7|\xb9\x09\x95R6J)\xef\x80m\xe0Isf\ +\xee.I\x8f\xcd\xec3\xf0\xc6\xcc\x8eI\xba\x03<\x03\ +\xee\x02\x0f\x80Kfv\xbf\xae\xeb\xfd\x10B\xaf\xae\xeb\ +\x8e\x99m\xc5\x18\xcdr\xce\xb7B\x08\xdf%\x1d\x07\xd6\ +\x80\x8bf\xf6^\xd2\x85F\xd1.p\x1ax\x0d\x8c%\ +}\x01H)\x0d\x8d\xa5L&\x93\xa3UU\xdd\x00\x1e\ +5\xfe\xbf\xd9\xe9t^t\xbb\xddo\xcb\xfco\x82E\ +r\xceg\xcd\xec\x8c\xa4\xb7)\xa5\x0f\xab\xb8\x1f\x017\ +\xae\x8f\xb1\x8f\xd6\xa3\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x01\xaf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01,ID\ +AT8\x8d\x9d\x931J\x03a\x10\x85\xbf\xd9\x84\xe4\ +\x08*x\x83\x80\xe2.\xc1\x22\x04\x82vB\x0a\x8bM\ +o)\xa4\xb5\xb1\xd0h!\x1e@\xf0\x10\x16\x9e@\x11\ +\xactv\x16\x14\xd2\xa6\x12\xd4#$\xb0;6\x16I\ +\xccn\x82\xaf\x9d\xf7\xbey?\xcc/\x94(I\x12\x07\ +\x18\x8dF\xd5^\xaf\x97-\xf2\x04e\x80_=\xc5q\ +\x9c\xaf\xe0\xfb+U=\xf8WpZf\xd6V\xd5N\ +\xd1\x5c\xca\x82\xee>\x00\xf6\x80\xcb<\xcf\xef\x81\xaff\ +\xb3\xf9-\x22^\x08p\xf7\xc0\xccn\x80\xe3\x02\xf6D\ +D\xde\x80\x17 ]\xd8\xc0\xdd\x834Mcw?\x05\ +\xb6\x80sw\x7f\xa8T*\x1f\xf5z\xfd\xb3\xd1hL\ +\x8a\x9a\xcf\x83\xc4\xcc\xba\xaa\xdaZ)0-U\xed\x98\ +Y{\x99o\xe6\x09\xee.\xaa\xba\x06\xac\x07Ap\x08\ +\x9c\x01\x8f\x222\x88\xa2\xe8y!\xc0\xcc\x8e\x80\x10\xd8\ +u\xf7m\xa0V\xb0\xec6\x8a\xa2\xbe\x88\xcc\x1c\xd5L\ +\x83\xe1pX\x1b\x8f\xc7\x1bY\x96m\x8a\xc8>p\x01\ +\xbc\x8b\xc8U\x18\x86w\xf3\xe1R\xa9j\xcb\xcc\xba\xee\ +^x+\xab\x82v\xca\xe6\xa5\x9f)I\x92k\x11y\ +-kQ]R\xe0d\xd9\x92\x1f\xc0\xffz&\xed\x15\ +\x1a\xbd\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xfd\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01zID\ +AT8\x8d\x95\x93\xbbJ\x03A\x14\x86\xbf\x09\x9b[\ +cP4\x8d\xadi\xbc$S,\x88a\x1b\xb5\xb5\xb1\ +U[\xb1\xd1F_\xc2g\xb0\x14\xed-\xb4\xb0H\x9f\ +b\x09\xd9\x10D\x99RD\xb0\xd0\x04\x156\xbbC\xc6\ +\x22\xab\xe8\xeez\xfb\xab3\xe7\xf2\xcd9s\x11DR\ +J\xe5\xfb\xfd\xfe\x0e\xb0\x01\xccG\xee.pZ*\x95\ +\x8e*\x95\xca\x80\x14\x09\x80v\xbb=\xad\xb5\xbe\x00j\ +iI@\xdb\xb2\xac5)\xe5]<\x90QJ\xe5\xd3\ +\x8a}\xdf\x1f\x03\xd6\x81\x1b@j\xad\xcf\x95R\xf9\x04\ + j;\xb1\xb3\xe38\xcf\xb6m\x9f\xe5r\xb9%\xe0\ +\x16\x90\xbd^o;\x01\x006\xbfi\x1b\x80j\xb5\xfa\ +\x04\x1c\x00\x08!\x12\xb9\x19`\xf6'\x00\x80\xd6\xfa2\ +2\xe7\xe21\xeb\xdd\xf0}\x7f\xccq\x9c\xe7\xf7\xb5\xeb\ +\xba&\x85\x95Is\x5c\x01\x14\x0a\x85\xd5\xdf:at\ +\xad\x09\xc0Id\x1fv:\x9d\xf1\x9f\xaa\x8d1'q\ +\x9f\x88\x1eP\x13\x90\x8cN\xfb@k}iYV?\ +\x96\xfb\x14\x04\xc1L\xbd^\x7f\xfc\x02\x80\x8f\x87t\x1e\ +A\xd2\xf4\x08L\x00\xddl6\xbbZ\xab\xd5\x1e>\x8f\ +\x80\x94\xf2\xaeX,.\x1ac\xf6\x80&\xf0\x02\xbc\x02\ +M!\xc4n\x10\x04\x95h\xfe\xf90\x0c\x1b\x9e\xe7\x95\ +\xbft\xf0\x17\xb5Z\xad\xa9\xe1p\xd8\x00\x16\x80k`\ +\xc5\xb6\xed\xfb?\x03\x00<\xcf+\x87a\xd8`\xf4\xd9\ +\xba\xc0\xf2\xbf\x00q\x881f\xff\xdf\x00\x00\xd7u'\ +\x85\x10[\x83\xc1\xe0\xf8\x0d8|\x97\x1d\x22\x90\x8d\x83\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xff\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1b\x17$\x13\xbe\xf7\x81\x91\x00\x00\x01\x8cID\ +AT8\xcb\xa5\x92\xb1\x8aSA\x14\x86\xbf\x99\x98\x80\ +\xa2`a#\xbaZ\xda\x08Bn\x12\xb2\x1a\xc1*\xd8\ +\xa5\xb4\x12,\x04\x05]\x15|\x8e\xb5\xd8J\xf0\x09\xec\ +\xc4B\xf0\x05\xd6\x90\x9bs\x92. 6\xb6\x22ZH\ +\x02!\xde\xf9mn\x96\xa8\xd1\xec\xea\xd7\xcc\x99\x99s\ +\xfe9\xfcg\x02k03$\x9d\x01^\x01\xdf\x80\x93\ +@\x0f\xf8\xd2h48\x14f\xf6\xc1\xdd\xcf\x95\xf1C\ +3\x1b\xac\xcb\x8b\xab\x9b~\xbf\x7f\x10\x87\x10>I\xba\ +\xe1\xee\x1d\xe0u\x08!m\x14h\xb7\xdb\xb8\xfb\x0e\x80\ +\xa4\x1a\xb0\x95R\xeaI:\x05T7\x0a\x94\xec\x8dF\ +\xa3\xb3!\x84n\x08\xa1\x17cl\xc5\x18_\x02\xdd_\ +\xbb\xfc\x0dw\xbfkf2\xb3g\x7f\xb8\x7f\x0a\x90\xe7\ +\xf9\xfa\x0e$=\x96\x04\xf0\x08`0\x180\x99L*\ +\xee\xbe\x0fP\xaf\xd7w\xdd}X\xadVO\xff$ \ +\x09w?\x0f\x5c.\xcf+fv\xab\xd5j1\x9b\xcd\ +L\xd2\xb6\xbb\xef\x95\xb97\x8b\xa2\xf8jf\xcf\xdd}\ ++\x96\x8e\xaf\xbeN\xb9>1\xb3\x17\xc0\x15IH\xda\ +q\xf7\xebY\x96}\x06v%\xdd+\x8a\xe2vX\x99\ +\xfbL\xd2\xf1\xbf\xfd\x8d\x10\xc2\xf7Z\xadvb>\x9f\ +_\x8c1\xdeI)]\x0by\x9eS\xa9T\xba\x92\xde\ +.;\xd8 \xf2.\xcb\xb2\xab\x07\x1e4\x9bM$=\ +8Lq\xc9\xf6r\x1a\x00a<\x1e\x1f+\x8abq\ +\x04\x01B\x08\xc4\x18/M\xa7\xd3\xf7q\xb1X\xdc?\ +J\xf1\xd2\xe4\x94\xd2~\xa7\xd3!\x0c\x87\xc3\x8f1\xc6\ +\x0b\xfc\x03)\xa57\xfc/?\x00\xe8Y\xd9\xab\xd6\xb1\ +\x96e\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x1a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x97ID\ +AT8\x8d\xc5\x91?\x8bSA\x14\xc5\x7f'\xef\xa1\ +D!_@\x0b\x17\xc4&\x85$\xef>\xc8\x17\x90\xc5\ +BK\x0b\x1bYY\xc1*\x82 \xf8\x0f\xb1\x14a\x11\ +VlDW+a\x17\xd4FA\xb0\xd0\xce\x987\x13\ +P\x09\x0aK@\xd1/\xb0`\x11Bx\xd7&\x09\x01\ +Qc!\xde\xea\xce\x99\x99\xdf=g\x06\xfew)\x84\ +\xe0s\xebu3;7\xaf\xb9\xfbj\x9e\xe7\xf7\x7f\x05\ +\xa8\x98\x99\x80\x8b\xc0G\xe0\xd2D?\x01\xf4G\xa3\xd1\ +\x9e\xdf]\x06\xd0dJ%\xc6\xf8\x12\xf8\xe4\xeek\x92\ +\xdeH:\x92e\xd9\xfb?F\x986\x9dNg\x7f\x9a\ +\xa6\xef\x80\x1dIkY\x96\xdd\x01(\x8abC\xd2\x0a\ +\x80\xa4\x9b\xee\xfe\x04\xe8\xcc\x22L\x9bV\xab\xf5\x0dx\ +\x0c\xec\x93\xf4t\xaa\xe7y~\x1ah\x03_\x07\x83\xc1\ +e3{+\xe9:\xf0\xc1\xcc4\x03\x84\x10\x9a\xc0q\ +\xe0yY\x96w\xe7mV\xab\xd5\x07@miii\ +y\x12\xf9\xa4\xbbo\xce\x1c\xf4\xfb\xfd]\xc0C\xe0<\ +\xb0\x02\x1c\x8e1\x9e\x99\x02\xea\xf5\xfaw\xe0\x9e\xa4\xd5\ +n\xb7[\x07\x0e\xa5i\xba5\x03\x0c\x87\xc3k\xee\xfe\ +\xd9\xcc\x1e\x99\xd9\x0ep\xd6\xddo\xc5\x18\x0f\xce\xb2V\ +*\xb7\x81\xa3\x92N\x01\xb1\xd1hl\x03TB\x08\xee\ +\xeeW$\x1d\x0b!\x5c\x9d\x9c\x7f\x06\xecu\xf7\xed\xa2\ +(6\x00\x9a\xcd\xe6\x17I7$\xb5\xdd}\xeb\xa7_\ +X\xa4z\xbd\x9e\x95e\xd9\x19\x8f\xc7\x07&\x8f\xbe\x18\ + \xc6\xb8<\x1e\x8fC\x92$\xaf\x81Wf\xd6\x9e\xee\ +\xa5\x8b\x00\xdc}=I\x92\xdd\x92^\xd4j\xb5\x0b\x7f\ +\xe3\xfa\xdf\xd7\x0f&!\x9d.\x7f\xda\x8a\x84\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x023\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x007]\x00\x00\ +7]\x01\x19\x80F]\x00\x00\x00\x07tIME\x07\ +\xe0\x09\x1b\x0e\x16!\x0a\xf7\x8bN\x00\x00\x01\xc0ID\ +AT8\xcb\x8d\x921\x88\x13Q\x10\x86\xbf\xdd$\x08\ +\x82\x85\x82\x16Z\x9c\xb5\x1e\xf1^\x98\xb58\xd2\xa4\xb0\ +8[\xed\xceFKA\x04Q\x10Q\xf1\x8a4\x9e\x1e\ +\xc8u\x16\xc2!\xa8\x95e\x14\x15\xd2$\x11.\xc3\xce\ +\xed\x82\xd8\x0a\x82\x8d\x9d\x85\x1a\x8d>\x8b\xbc\x13\xb3\x9b\ +\x80\xd3\xbd\xf7\xe6\xff\x98\xf9\xdf\x1f\x11J\xd5\x10q\xa8\ +\xda\x11\xe04\xb0\x1f\xf8\x00\xfe\xb9Hc\xcc\x9c\x8a\x0a\ +\xe2g\xc0Y\xe0gx\xf3@\xe4=\xd7\x92\xc4mz\ +\xef\x89\xa2\xa8\x0c\x08\x90m\xe0\x18\xf0\x16\xd8\x00>\x01\ +K\xc0\x1ap\x08h\x8b\xb8vq\x828\x88/\x06\xf1\ +c\x11w\xca{^\x88\xb8\xcc\xfb\xd1\x96\x88;:Y\ +\x855U;\xdc\xe9t\xca{\xa8\x9a\xa9\xda\x17\x804\ +M\xa7\xde\x06\x83mTw\x9a\xaa\xf6M\xd5\xee\xcc\x9c\ +\x008\x0e\x0c\x00\x1a\x8d\xc6T\xc3\xf2\xf2ID\x96z\ +\xc0\x1e`q\x1e`\x04\xec\x9b\xe7\xf4ph\xd5`\xe8\ +\xd7y\x80>\x90\xa8\xda\x81\xe1p\xa7\xfcU\x11\xe7\x80\ +\xef@\xaf\x04P\xcd\x00v\xdd}S\xab\xc5\xb5\x82?\ +\x8b\xc0\x03`$\xe2\x1e\xce\xccAhl\x03W\x80\x1f\ +\xc0S\xe0# !T#\xa0\x02\xdc\x16q\xf7K\x80\ +n\xb7K\xab\xd5B\xd5\xce\x00w\x81\x05\xe0\x17P\x03\ +^\x87l\x5c\x0f\x9a\x9b\x22\xee^i\x82\x7f\xab\xdf\xef\ +U\xab\xd5\xbd\x07\xe3\xb8\xf29IN\x8c\xc3\x84\x97\x03\ +\xdc\x03\xb7D\xdc:@d\x96?\x02\xce\xcf\xe0}\xd2 \xd6aL\xe8\x0a\xff\xfd\xfb\xe7\xf4\xe7\ +\xcf\x9fs\xef\xde\xbd\xcbF\x97\xc3\xc6\xc70\x00\xaa\x88\ +\x13HO\x01\x1a\xb2\xfd\xcb\x97/\x12\xd84\xc2\xc4p\ +\x19\x00\x93\xf7\xf8\xfd\xfb\xf7\x95\xf7\xef\xdf\x07\xc2\x04\xd0\ +iB\x060\xfc\xff\xff_\x18\x88\xd7\x01\x0d\x99\x07\xa4\ +yI6\x00\xa6\x01\xa89\x11\x18\xc0\x17?~\xfch\ +\x01\x13\x03\xd1\xd8\x5c\xc0\x88\xac\x00\x8d-\x05\x0cdM\ +d1\x16d\x0e\x94\xfd\x1f\x8b\x18\x03##\xe3%\xa0\ ++b\x84\x84\x84.#\xcbc3\x00Y\x1e\xa4\x11d\ +`\x9f\x80\x80@5\x90\xfd\x13E\x12\xc8!d\xc0c\ +\xa0\x9axAA\xc1\xfd\xe8\x1aa|la\x00\x93[\ +\x06\xb4Q\x0f\x9ff\x90B\x0c\x17\x005=gbb\ +\x8a\xe4\xe7\xe7_\x013ip\xd3\x00\xd9 H\xd1\xb9\ +\xe6\xf5 \x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x1f\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x9cID\ +AT8\x8d\xa5\x921O\x14Q\x10\xc7\x7f\xf3\xde\xde\ +\xab6@\x0c\x09J,\x8c$B\xd4\xdcq\x97\xdd\xb3\ +\x03\xae\x86\xa8\x89\xe1SP\xd1Zkey&V\x96\ +4\x97\xa8!Xi\xb1\x1f\x80\xcd\x86\xd2\x06D\xb8\x90\ +M\x8c!z\xa19\xe0\x0d\xc5\xdd\x11<\x16\x82\xf1_\ +\xcd\xcb\xcc\xff73\x99\x07\xff)\xb9\xf8\xc8\xb2\xec\xa1\ +\xf7\xb2\x0a2\x07z\x0bd\x0f\xfc\xbasA\xb3\x5c.\ +\x1f^\x0b\xd8\xdc\xcc^\x88\xc8;\xc0\xa9\xd2\x06\xd9\x11\ +a\x1at\x02\xd8\x87\xd3\xe7Q\x14m\x0f\x03\xcc\xa0s\ +\xdf\xfc[\x95\xe58\xae>\x8e\xe3\xd9\xa7\x9d\xce\xe1#\ +U^\x03w\xc1\xae%I\x12\x14\x02zc\xe3@V\ +\xe2\xb8\xfau\x90l4\x1a'q\x5c}\x03\xf2\x1e\x98\ +\x09\xc3\xd1g\x85\x00\x11\xe6UiG\xd1\xec\x97\xa2=\ +\x8d\xf1\xcd~\xb8P\x08\x00\x19\x05\xd9)2\x03\xe4y\ +\x9e\xf7\x1a\xc9H!@\x95\xb6\x08\x0f\x8av\x04\x18\x1f\ +\xbfS\xee\xd7}\xbfb\x02\xbf\x0ez;\x0c\xc7V\x87\ +\x0bZ\xad\x965F^\x01X\xab\x9f\x86\xf3\x01\x80s\ +A\xb3\xdb=]\x16\xe1e\x9anMX\xabo\x9ds\ +\x07GG\xddJ\xcf\xacOT\xe9Xk\x7f\x0d\x03\xce\ +\xffA\x9a\xa6S`\xd7\x80\x99\xcbK\xc8\x1f\xd0\x11`\ +\xb7T2K\x95J\xa5}\x09\x00\x90$I\xd0?\xd5\ +\x82\x88\x84 {\xc6\xf8\x8f\xc0O\xef\xe53p\x1f\xf8\ +Q*\x99\xc5\x01\xe4/\xc0u\xca\xb2l\xd2{\xb3\x01\ +:uq\x12sS@\xadV;\xf0\xbe\xbb\x08\xf2\x0d\ +\xb8w|\xac\x1f\xe0\xfc\x0a7S\xbd^\xcf\xe1dI\ +DR\x11\xf6\xff\xc5{\xa5\xce\x00-\xa5\x88D\xa3\xe0\ +\xc9\xd8\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x16\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\ +\x0d\xd7\x01B(\x9bx\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1e\x00$9K\xfb\x0d\x80\x00\x00\x01\xa3ID\ +AT8\xcb\xedS=\x8b\x13Q\x14=\xefc\x1e\x84\ +\x80)\x05\xadB\xe4m\x06L2\x0cSH~\x81\xb0\ +\xff@\xedVV\x16R\xf8\xd1le\xe1G\xb5\x04\xbb\ +-\xd6E\x90\xfd\x11\xb6b\x19\xc6\xc2I`\x12\x10!\ +\xc5Z\xad\x84\x8c&\x8f\xbc7\xef=\x1b\x07\xb2Z\xd8\ +\x8b\xb7\xbc\xf7\x9c{\xcf\xe5\xdc\x0b\xfc\x0f\x92\xa6\xa9\xaf\ +\xd7\xeb\xb0\xd6\x821v*\x84x\xa8\xb5\xfea\xad\xbd\ +\x04\x14B\xbc\x96R\xee\xcff\xb3cc\xcc\x01c\x0c\ +\xab\xd5\x0a4I\x12\xa2\xb5~\xa2\x94\xfa\xb2X,\x1e\ +\xb7Z\xad\x95Rj\xd7\x18\xf3\xb9(\x8a+\xc6\x98\xa1\ +R*\xe5\x9c\x0f\x00@J9X\xaf\xd7\xef\x8d1\x83\ +$I\x08\x05\x80n\xb7\xfb\x8as>\xab\xd5j\xc3\xd1\ +ht\x95s~\x12\x04\xc1\xbd~\xbf\xff])u\xc8\ +9WEQ\xbc\x00\x80,\xcb\x1e1\xc6\xd6\x9dN\xe7\ +\x18\x00H%q:\x9d^WJ}\xb2\xd6^\x04A\ +p\xd6\xeb\xf5^V\xb5<\xcf\xafi\xad?:\xe7\x8e\ +\x18c\x07\xce\xb9[Q\x14}\x03\x00Z\x81\xda\xed\xf6\ +\xb9s\xee\x0c\xc0\x0dc\xcc\xdb\xed\xfd\xc30\xfc\xca9\ +\xbf\xcb\x18\x1b\x02\xb8_\x91/)\x18\x8f\xc7;eY\ +~\xb0\xd6\xa6\x8c1\x12E\xd1.!\xc4o7\xca\xf3\ +\xdc\x87aH\xb6s\x14\x00\xbc\xf7Tk}\xea\x9c{\ +J)\xbd\xe3\xbd\xbf\x99e\xd9\x83\xdf-\x13B\xfca\ +#\xfd5\xfd\xb0,\xcbM\x1c\xc7'q\x1c/\x01\xec\ +9\xe7\x8e&\x93\x89\xdc\x06k\xad\xffz\x07\xcf\x96\xcb\ +\xe5\xf3F\xa3a\xac\xb5\x10B@JI\xe6\xf3\xf9\xed\ +\xcdf\xf3\xae\x22\x05A\xb0\xd7l6\xdf\xfc#\xbf\xf0\ +\x13\x1c\x09\xc6\xd1b\xf4f\x83\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x02!\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1b\x172\x08(\x0a\xfd\xaa\x00\x00\x01\xaeID\ +AT8\xcb\xc5\x92=\x8b\x13Q\x18\x85\xcf\xb9L\x82\ +_\x04\xd9BR\x0b\xa9\x22\x92\x09\xc3,A\xc9\xdf\x10\ +\xacl#\x82\xe8\x16\x0abe#[\xd8\x88\xae?\xc2\ +\xdf` \xc2\x86$7w\xc6@\x1a\xb5\xb0\x13\x0bG\ +\xb2\x82\x01\x93{\x8f\x8dH6\x9b(\xda\xf8v\xe7\xfd\ +x\x0e/\x1c\xe0\x7f\x17\xff\xb40\x99L\xae\x86\x10\xae\ +I\xbaEr\xaf\xd1h\x9f\x9f\x8e\xa2\xa8\ +&i\x97$\x01\xbc\x89\xa2\xa8X.\x97\x88\xe3\xd8\x1d\ +\x03\xf4\xfb}T\xabUS\x14\xc5\x911\xe6^\x08\xe1\ +\xb2\xa4\xfb\x00\xbe$I\xb2\xf1Uc\xad}\x09\x00\xd3\ +\xe9\x14\xadV\x0bEQ\xbc\x93t6\x84\xe0\x01\xe4\x00\ +>U*\x95S\x83\xc1`3\x80\xe4\xf7<\xcfo\xd6\ +\xebudYvH\xf2\x05\xc9\x8e\xa4\x03I\xcf\x8d1\ +wf\xb3\xd9~\x9a\xa6\xec\xf5z'\x01\x92>K\xda\ +\x19\x8f\xc7\xdfB\x08-I_W\x17$yc\xcc{\ +\xe7\xdc\x87v\xbb\x0dk\xed\xf1 Yk\x05\x00$;\ +?\x0f\x0e\xb6\xe8\xbb$w\x9a\xcd\xe6Ck-\x92$\ +\x81\xb5\xb6c\xfe\x22\xb5s\x00G\xce\xb9\xc3$I\x90\ +e\xd9\x0d\x92Wh\xad}Jr\xfa\x1b\xe7u\xfd\x80\ +\xe4\x05I\xb7%!\x02p\xd1\x18sn\xc5iw\xcd\ +y]\xd7\x00x\x92XM\xe9?\xd7\x0f\xee\x1b\xe8I\ +m\xfa\xfd\xf7\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\xb8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x015ID\ +AT8\x8d\xa5\xd3\xb1K[\x01\x10\xc7\xf1\xef=^\ +x\xe8\x90I:98\xb8\xe8\xa0C\x120\xbb\xa2\xd0\ +\xa9\xd4?@'G)T\x9c\xdbI\xff\x013\x96(\ +(N\x82\x05)\x84\x06m <\xc8]vg\xff\x08\ +y\x19\xf2s\x09\xe2\xd26/\xdevp\xf7\xb9\xdfr\ +\xf0\xder\xf7\x13I6\xeb~\x02\x1c\x0f\x87\xc3\x96\xa4\ +dV\x00I\xab\x11q\xe1\xee\x95\x99\x80\xd1h\xb4\x0d\ +\xcc\x037\xfd~\x7f\xae4\xd0l6\x8b\xa2(\x0e\x80\ +\x8f\x95J\xe5W\x9e\xe7\xd5R\x00@\x96e\xdd\xa2(\ +\x96\xcc\xec1M\xd3\xae\xbb/\x94\x02\x80\x95,\xcb~\ +\x03\xa7@\x0d\xf8\x93\xe7\xf9b\x19\x00I\xdf\x81{3\ +[\x07\xdai\x9a\xf6\x22byj\xa0\xd1h\x9c\x9b\xd9\ +WI\x1d3{\x00\x96$=D\xc4\xdaT\x00@\xad\ +V\xbb\x96\xb4/\xe9V\xd2\x16p$\xa9\x13\x11\x1bS\ +\x01\x93$wf\xf6\xd9\xcc.\xcd\xec\x19\xf8 \xe9\xe7\ +`0\xd8\x9c\x0a\x98$\xe9\x01;\x92\xce\x80\xbd\xf1x\ +\xbckfW\x11\xf1\xe9\xed\x5c\xfa\xb6qw\xfd\xc5\xfb\ +\x91$\xc9\x17`AR\xcb\xdd\xab\xf5z\xbd\xfd\xbaT\ +\xe6\x0f\x22b\xc5\xdd\x9f\xdc\xfd\x10\xc0\xfeq\xf5\xbf%\ +\xe9\xdb\x0b-\x9d\x8f\xe4\xfd~^G\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x03\x13\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x90ID\ +AT8\x8d\x85\x92Mh\x5cu\x14\xc5\x7f\xe7\xff\xde\ +$\x03\x99\x08\x96\xacT\xb2k\xf1\xa3\x18y\xf3\xe6\x83\ +X\xa4\x91.\xfc(\x0a\x0a\x0aJ\xa1\x08\xba(u\xa1\ +t\xd1\x85\xa2\x0bA\x0c]\x08Bk\x8b\xd6v!\xdd\ +\x14\xb1\x0bAA:h\xb3\x08\xbe\xf7O2\x92\xba\xf0\ ++\xdd\x14m\xc1\x88\xd2\x16\x9c\xf7\xde\xff\xbap2\x8c\ +\xd9\xf4\xec.\xf7\xdc\xc3\xb9\xf7\x5c\xb1\x0dkkk\xbb\ +\x8a\xa2x\xa1\xaa\xaa\x13\xddn\xf7\xda\xf6\xfev\xc4\xe3\ +E\x9e\xe7G\xca\xb2|G\xd2d\x1c\xc7\x0f\x02\xcfl\ +\xf5z\xbd^}zzzQR\x13\xf8\x80\x95\x95\x95\ +g%}\x9b$\xc9\xd7\xc0\xcb\x00\xce\xb9C\xcdf\xf3\ +L\x08\xe1I\xa0\x00\x0e\x8e\x1c\xf4\xfb\xfd\xddEQ\xbc\ +\x0b< \xe9|UUw\xb7\xdb\xed\x17\xcdL\xde\xfb\ +\xeb\xc0L\xadVklnn\xfe\xb3\xb0\xb0Pz\xef\ +\xcf\x01\xb3nuuug\x9e\xe7\x9f\x0d\x06\x83\xa7\x9d\ +s\x87\xcd\xacafnrr\xf2\x95,\xcbv{\xef\ +\x07\xc0\x0c@Q\x14\x7f4\x1a\x8dY\x003\xbbdf\ +;\xe3\xb2,/\x86\x10\xf6w:\x9d\xfep\xef\xef$\ +\xed\x9a\x9b\x9b\xbb\x09\xac\xe7y~\x02xuh\xf4\xc3\ +V\xab\xf5\xebp\xdd\xdf\xcd\xec\x0e')Hz\xc9\xec\ +\xbfD$\xfd\x06<\xd4\xeb\xf5b\x80\xb2,\xdf\x00\xbe\ +\x07\x0c\xf8`\xecd\xb7\x80[\xce9\xf7\xb8\xa4=\xde\ +\xfb+Y\x96\x9d\x96tg\x08a\xad\xd1h\xbc\x0d\xd0\ +\xedv\xff\x1er>I\xd3\xf4\x97\xadi3\xbb\x07\xd8\ +\x18\x1dqyy\xb9\x19E\xd1[\x92f\x81\x1dfv\ +\x17\xf0'\xb0\x9e\xa6\xe9\xa3Cw\xb6\xc5\xcf\xf3\xfc8\ +ps\x14\xa3s\xee*\xb0\xa3,\xcbG\xd24\x9d\x05\ +\x0eH\xba111q@\x92\x8d\x0f\xf7\xfb\xfd)\xe0\ +\xf9\x10\xc2\x99\xd1+GQt\xd8\xcc\x1e\x8e\xe3\xf89\ +\xe0\xa3\xaa\xaa\xbe\x88\xe3\xf8\xfd\xc1`paiii\ +o\xbd^_7\xb3S\x92\x16\x8b\xa28\x0e\x5cl\xb7\ +\xdb\x97G\x0e\xaa\xaa:\x09\x5c1\xb3KY\x96\xed\x8b\ +\xa2h\x058\x0f|355\xd5\x95\xf4\x98\xa4\xfd\xc0\ +_@\x5c\xab\xd5\x0e\x02\xfc\xef\x95\xbd\xf7\xaf\x85\x10\x16\ +\x81\xeb\xc0\x9b\xadV\xeb\xf40\xda'\x8a\xa2\xf8q~\ +~\xfegn\x87\x8d\x8d\x8d\xfamIc\xf8\x17\x19B\ +\x1d\xa3e\xd9\x86\x84\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x019\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xb6ID\ +AT8\x8d\xcd\x92\xc1\x09\x021\x14D\xe7\x7f\xec@\ +\xf0b\x17{\xb0\x06\xf1\xe0\x16\xa1\x98\x1c\xb6\x9c\x85\xe4\ +_DK\x90E{\x10l\xc5\x16\xf6{Y!&\xab\ +\x89'\x9d\xe3$o\x18\x86\x0f\xfcZ\x94\xfb \x22:\ +\xe6\x1bc\xa8( \x94sn\xc1\xcc\x1d\x80\xd93\x80\ +Ka\x11\xa9\x98\xf9\xa4\xaa\xdb\xd0/\x0a\x10\x91\x0a\xc0\ +YUw\xd6\xda.|\x9b\xe4\xe0\xb6m\xa7\x03\xbc\xb1\ +\xd6^J\x1b\xbf\xc897\x8f\x1a\xa5\xc3\xc6f\x0c\xbd\ +\xd3\xe8\x06\xde\xfb\x153\xdf\x86\xfa\x1f\x95l\xe0\xbd_\ +\x12\xd1\x1e@\xdd4\xcd\xfd\xab\x06\x03|\x00P\x1bc\ +\xae98\x09 \xa2c\xdf\xf7\xebR\x18\x08.1w\ +\xb2\xff\xab\x07\x9e\x92@\x1f2a\x8b9\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01k\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xe8ID\ +AT8\x8d\xed\x90\xa1N\xc4`\x10\x84\xbf\x85_ \ +x\x00t\x91\x15m\xc8\x8aZH\x90'y\x05^\x81\ +\x80\xc0\xa0\x10\x08\xde\x01Uq\xe1@!\xce!\xf7\x97\ +\x955$\x08\x8e\x90\x90\x94P\x92\x92,\x86#'\xe8\ +\xa5`0\x8c\x9c\xd9\xf92Y\xf8\xd7\xdfK\xfa\x023\ +\xdb\x13\x91ww\xbfQ\xd5\xd7\xbe\xbb\xd0\x17\xb8\xbb\x03\ +c\xa05\xb3\xa9\x88\x5c\x87\x10.\xb3,\x9b\x0dZP\ +U\xd5z\xdb\xb6\x8f\xc0\xda\xa7\xf5\x0cL\x80cU\xbd\ +\x9b\xdf\xad\xf4\x01\xd24}\x01\xa6\x0b\xd6\x1bp\xb8X\ +^\x0a\x00\x10\x91\x09\xf0\x04\xcc\x80\x0d\xe0\xa2,\xcb\xd5\ +\xc1\x80\xae\xeb\xae\x80q\x08a\x0b\xb8\x05v\x92$9\ +\x19\x0c(\x8a\xe2\x018\xcd\xf3\xfc\xbei\x9am\xe0\x0c\ +8\x881\x8e\xbeV.\x03|\xa7\x18\xe3\xc8\xdd\xcf\x81\ +]U\xad\x7f\x0c\x000\xb3M\x119\xaa\xebz\xff7\ +}\x00\xe6\xcf\xfc\x00h\xefJ\x06\x81\xf3\x9cM\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xc4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01AID\ +AT8\x8d\xcd\x8f\xb1J\x03A\x10\x86\xbf\xbd\xf5T\ +\x90\xacE\x10L'X\xd8\x08J.1\x9dX\x89\x85\ +\x9d \x08\x16\x09\x8a\xf6\xdai)\xa4\xb0\xce\x03X\xd8\ +\x08\xbe\xc3\x95\xde\x91\xdd+\x84 \xa4\x14\x82\x85\x0f\x90\ +B\x92\xb19%9M\x8c`\xe1\xdf\x0c3\xb3\xff7\ +\xff\xc2\xbf\x93\xb5\xf6\xf87\xefU\xc6<\x0ftz\xbd\ +^\xb1R\xa9\xb4'\x01x\x99\xfe\x00\x98\xd3Z\x9fL\ +\x9a \x0b\xa8\xa5\xb5\x1a\x86\xe1,@\x1c\xc7yk\xed\ +]\xab\xd5\x9a\x1e\x0bh6\x9b+\xc0F\xda\xe6\x8d1\ +{\xd6Z_k}\x0f\xecw\xbb\xdd\xfaO\x09\x8e\x06\ +\x17\x22r*\x22\x0d`+\x1d\x9d9\xe7v\xb3\x00\x05\ +\x10\x86\xe1T.\x97{\x06\x0a\x22RWJ]|w\ +\x0dx\x05\xd6J\xa5\xd2\xcbP\x02c\xcc\x0eP\x00\xa2\ +r\xb9|)\x22\x0f#\x00\x0b\xc0\x8d\x88xC\x80~\ +\xbf_Kc_\x01(\xa5\xaeG\x00\x00\xb6\x93$9\ +\xff\xfcB\x1c\xc7y\xadu\x07x\x0a\x82\xa0\xa8\x94\x12\ +\x11Q\xce\xb9G`u\x04\xe4M)\xb5\x19\x04A\xe4\ +i\xad\x0f\x81\x19`\xdd9\x97\x008\xe7\xdac\xcc\x00\ +\xbe\x88\xdcFQd<\xa0:\xb0XJ\xeb\xe2\x18\xf3\ +\x87\x96}\xdfo|\x99Zke\x02\xf3\xdf\xe9\x1d\x80\ +\x9bk\x1a\xd0\xeb,Y\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x02\x02\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x7fID\ +AT8\x8d\xa5R;N\x1cA\x10}o\x86\x8b \ +\xadl\x19\x124\xd5\xa3\x0d 6DH\xde\xf5\x8a\x0b\ +\x18.\x01\x82\x80\x1b\x98\x90\x9c\x00\xf3\xc9\xc1!\x04\xb3\ +]=\xd6J\xfc?>J\x17\xc9\xecjv\x18\x10\xb2\ +_\xd4]\xfd>\xd5]\x0d\xfc'\x08\x00!\x84\xa3\x18\ +\xe3U\x9a\xa6\x87Y\x96\xdd\xbc'\x18\x0e\x87\xf3$\x07\ +$\xbf8\xe7\xd6\x92\xaa~Gr'\xc6x\xad\xaa#\ +\xef\xfd\xe7\xa6PU3U}N\x92\xe4\x8a\xe4\x0e\xc9\ +\x1b\x00H\x00\xc0\xccN&-\x91\x8fy\x9e\xdf7\x0d\ +D\xe4\x0f\x80\xa7Z\xe9pbP\x1d\xfe\x05pnf\ +}U\xfd\xd14\x08!l\x02\xf8J\xf2\x18\xc0HD\ +n'\x06$\x0d\xc0@D\x96\x01l\x03\xd8\xf3\xde/\ +\xd6\xc4\xdf\x00l\x92\xdc\x10\x91\xeff\xb66\xf5\x88-\ +i=3;\xae\xd7\xccl)\xcf\xf3\xcb6~+T\ +\xd5\xda\xd6M$o\x1d|\x14\xadW\xf0\xde/\x92\xbc\ +\x98\x22\x92=\x119}\xb3\x83\xf1\xecC\x08\xeb$\x7f\ +\x93\xec;\xe7\xe8\x9c\xa3\x99-\x99\xd9\x81\xaan\x99\x19\ +U5{\xd5\x81\xaa\x8eH>\x9aY\x1f\xc0\xb6sn\ +\xb7\x9eT\x8dv\x1f\xc0\x19\x80\x8e\x88tH\x1a\x01\xa0\ +,\xcb\xb9\x18\xe3u\xc5=\x13\x91\x95j\xb4S\x08!\ +\x1cU\x01 \xe9D$\x8c\x7f\xe2\xa0\xc6\xeb\x94e\x99\ +5\xc5EQ|2\xb3\xcex\x1fc\xec\x01\xc0Le\ +\xe0\x00\xfc\x04\xf0KD.\xdb\xd2\xbb\xdd\xee\x03\x80\x85\ +\xa2(f\xd34]%\xd9mr\xfe\x09/\xf1A\xae\ +/\x86\xb4%e\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\xdd\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1c\x12&\x14\x89\xb9\x8c\xe2\x00\x00\x01jID\ +AT8\xcb\xb5\x931kTQ\x10\x85\xbf\xd9\xb7l\ +!\x81\x80\xad?\xc0b\x1f\xdc\x81\xcd\x8a\x10\xad\xb4\x10\ +\xb4Q\xb0\xb1\x8aV\xc9\x0fH,V\xf2\x03\xf2\x07,\ +\xb7\xb0\xd1\xce\xcaN\xd6b\xc1by\xec\xbc\xcd[\xd0\ +\x90\xdaV\x854\x81w\xef\xa4y\x8aY\x92\xcdZd\ +\xe0r\xe1\x9c\xc3\xe1\xde\x999p\x1d5\x1a\x8d\x00\x98\ +\xcdf\x8f\xcd\xec\xb5\x99\xdd\xbaL+\x97\x11\xd3\xe9t\ +\x98R\xdarwD\x84v\xbb}?\x840^\xd4\xb5\ +\x17\x81\xc9dB\xa7\xd3\xb9[\xd7\xf5\x16\xe0\x22\xf2\x11\ +x\x1ac\xfcr\x91\xbe\xb5\x08\xf4\xfb}b\x8c\xbb\x00\ +Y\x96=\xe9\xf5z\xcf\xb2,{\x08deYn_\ +i\xd0\xd4#\x00U\xfd\xd4\xdc\x9f\x81Cw\x7f\xbe\xd4\ +\xa0,\xcbu3sw\xbf\x01\xb8\x99yUU/\x01\ +Z\xad\xd6\x07\xe0\xceR\x83\x10\xc2\xef\x18\xe3[w\xc7\ +\xdd%\xc6X\xe5y>lh\x03\xd6\x96\x1a\xcc\xe7s\ +\xdc}ODh\xceNQ\x14\x7f\xe8_\x17\xfd\xf5\x5c\ +W\xbb\xdd.\xc0\x89\x99\xbd\x02\x0eT\xf5\xef\xd8\xdc}\ +MDNWj\xa2\xaa\x0eEd\xf3\xdc\xc2\x88\xe4\xc0\ +\xd7U\xa7@\x08\xe1h0\x18\xfc\x0b\xbd\x10\x91\xf7+\ +mbUU\xb7\xeb\xba\xfe\x06\xdcT\xd5\x9ff\xb6\x09\ +\x8cUUVzA\x9e\xe7\xdf\x81\xfd\x94\xd2qQ\x14\ +oRJc\xe0\xde\x7fe\xa1\x09\xd3\x83\x94\xd2\x06\xf0\ +NU\x7f\x5cKr\xcf\x00\x95\x07\x8dk\xbd\xea.\x9e\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xde\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\ +\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1c\x12(!A\x89eO\x00\x00\x01kID\ +AT8\xcb\xb5\x93\xb1K[Q\x14\xc6\x7f\xe7\xde7\ +\xb5R\xe8j\xe7\xe0\x90\x90{\x93\x10EP\x17'\x87\ +B\x11GQ\xb0[]K\xbb\xd4\x7f\xa1cG\xb1k\ +\x1d\x9ct\x0c(J\xc1\x90\xc7}\xd1\xb7\x18\xfa'T\ +\xb0t*y\xf784K\xda\xd7&Ez\xc6s\xce\ +\xf7\xdd\xef\x9c\xef\x5cx`\xc8\x9f\x0a\xfd~\xffY\x8c\ +qSD\xae\x9cs'\x83\xc1\x80J\xa52\x1dA\x96\ +e+\xc3\xe1\xf0TU\x11\x11Dd\xbf\xd9l\xbe\x9c\ +ZA\x9a\xa6CU\xb5\xc0\x11\xf0\x02\x10k\xed\x82\xaa\ +^6\x1a\x8d\xb1^S\xf2\xfa+\xc0&I\xb2\xdaj\ +\xb5\xd6\xad\xb5\xcf\x01b\x8co~\x05\x97\x12\xa8\xea\x06\ +\xd0w\xceu\x00\xbc\xf7\xc7\xa3\xd2Z\x99ZS\x92\x9b\ +7\xc6\x1c\x02\xe4y\xbe\x1dB\xd0\x9f\xbc\xfa(\x84\xa0\ +Y\x96=\x99D\xf0XDR\x80j\xb5\xfa\xb1(\x8a\ +kU\x15U\xa5(\x8a\x0f\xce\xb9o\x93\x08\x00\xee\x00\ +\xba\xdd.\xd6\xda\xdd\x91\x13\x88\xc8\xdb<\xcf\xc7\x1a\x93\ +\x12\xf0\x0fU\x9d\x01h\xb7\xdb\x00g!\x84\xaf\xc0k\ +\xef\xfd\xf7iv\xf0\x19\xa8\x8ey-\xb2\xe8\xbd?(\ +\x93\xfa\x9b\x02\x11\xf9\xa4\xaa;\xc0\xfb\x91+\x88\xc8\xe0\ +\x9fNy\xb4\xf9%\xef\xfdE\x9a\xa6O\x8d1\xb7I\ +\x92\xcc\xd5j\xb5\x9biF@D\x96c\x8c\xe7\xbd^\ +\xef\x1d\xf0\x05\xd8+\x03\xff\xf53\x85\x10f\x81-c\ +\xcce\xbd^\xef\xf0\xbf\xe2\x1eZ\xca\x88o\x01\xa2\xa9\ +\xd8\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03*\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x007]\x00\x00\ +7]\x01\x19\x80F]\x00\x00\x00\x07tIME\x07\ +\xe0\x06\x1c\x0c0'U\xddc\ +fG\x80VU?\x05\x16\x80M\x07\xbc\x0c,\x02/\ +\x02\xff\x14Eq\xc1\xcc^m\x9afAU\x01\xe8v\ +\xbb\xdf\x88\xc8\x15`AU\x9f\x04\xce\x02\xc7\x80\x03\x0e\ +xHD\x0e\x8a\xc8\x86s\xee\x9e\x18c\x91e\xd9\xdb\ +333LW\x9f\x98|\x9feY\x95e\xd9\x0f\x22\ +\xf2\x18\xf04\xb0'\x05\xc6\xc0\x89\xa2(\x92\xaa\xaaN\ +\x03\xcb\xde\xfbd*\x5c__oU\x15\x11\xa1\xd3\xe9\ +L\x8f~IU\xff\x98\xe6\xe0\x1ap\xa1\xaa\xaa\xfb\xa6\ +\xa2\xba\xae\x17\xa7\xbd\xaa\xb2\xb5\xb5\xc5x<\x1eq\xbb\ +\xae\x03\x7f\x02\xbf8\xe0\xbc\xaa~\xac\xaa\xe7\x81o\x93\ +$y\xdc\xcc.\xd6u\xfd\xce\x8eO\x9c\x00\x8e\xc6\x18\ +\x7f\x8d1^5\xb3w\x81U\xe0K\x07,\x89\xc8\xb2\ +\x88\xfc\xe6\x9c\xbb\xd6\xef\xf77\xc6\xe3\xf1\xe5\xa6i>\ +\xa8\xaa\xaaU\xd5\xa7\x8a\xa28bf\xff6M\xf3H\ +\xd34\xbbT\xf5\xa6\x88,\x01K\xb7\x82\x04\xdc\xe5\xbd\ +?\xb8\xb6\xb6\xf6\xbc\xaa\xee\x06^\x00Z\xe7\xdcwf\ +\xf67\xb0KU\xf7\x03\xe7D\xe4#\x11Y\xe9\xf5z\ +o%S0\xea\xba\xbe\xa8\xaa?\x99Y\xae\xaa\xb3y\ +\x9e\xef\xeb\xf5z\x9bUU\x9dSU\x0f\x9cm\xdbv\ +1M\xd3\xd3\xce\xb9\xdd\xde\xfb\xfep8\xc4M\xc1\xe8\ +v\xbbO\x00\xff\x01\x07\x80\xe3\xaaz\xa6\xaa\xaa\x16\xf8\ +,I\x92\x1e\x90\xa7i\xba)\x22\x7fy\xef\xfb!\x04\ +\x06\x83\x01\xb7\xde5\x1a\x8d\x98\x9f\x9f'\x84\xb0wB\ +\xe0\xb3\xc0\xc3@\x0e\xfc\x0e|>\xc1\xf9\xe7\xe1p\xc8\ +`0\x00\xe0\x7fo\x8aUr\xf1\xb3\x9b\x98\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01\xa9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01&ID\ +ATX\x85\xed\x951J\x04A\x10E\xab\x0a1\xf4\ +\x10^`\x93\xc5Cx\x02\x11DX\x18\xba\x13M\xc4\ +\x8d\x07#\x0d\x04w\xa2\xa9\xe9@\x17A\x97\xb9\x80\x18\ +y\x00\x13o`\xa8\x87p\xaaLF0\x18\xb6k\x9a\ +5\xb2_\xfc\xf9\xf5\x06\xfa3\x00\x99L&\x931P\ +\x96\xe5\x163\x7f\x86\x10N-yf\x9e3\xf3\x87\xaa\ +R,\x1b\x0d\xf4\x02_\xaa\xfa\xac\xaa7!\x84\xb3u\ +\xd9\xba\xaeO\x10\xf1RU_\x10Qb\xddh\x11\xf8\ +U\xbe$\xa2#D\xce\x00\x00\x00uIDATH\xc7c`\x18\x05\ +\xa3`P\x82\xff\x8c\x1fO}\xfc\xff\xe1\xf2g1d\ +\xd1\xcfb\x1f.\x7f\xfc\xff\xf1\xd4\x7fF\x22\x8c\xf8,\ +\xfa\xe1\xd2\xc7\xff\x1f\xaf\x7f\x95D\x17\xf9\x22A\xa4+\ +P\x8d Y;\xaa\x11diG\xf8\xfa\xc3e\x08\x89\ +\x1a\x22\xa4\xb9\x82\x80\xedL\xc4\x18\xc5HL\xd8S\xd9\ +\x0b\x88\xa0\xc3\x8cT\x92\xb4#\xf3\x886\x023\xe2H\ +2\x82\x0aIy\x14\x8c\x82\x01\x00\x00k:\x9c\x0f\x96\ +\xa39\x9c\x00\x00\x00%tEXtdate:\ +create\x002017-01-3\ +1T16:46:41+00:00\ +\x97\xa0\x13\xe2\x00\x00\x00%tEXtdate\ +:modify\x002017-01-\ +31T16:46:41+00:0\ +0\xe6\xfd\xab^\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01l\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x04\x00\x00\x00\xd9s\xb2\x7f\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x02\ +bKGD\x00\x00\xaa\x8d#2\x00\x00\x00\x09pH\ +Ys\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\x9bx\x00\ +\x00\x00\x07tIME\x07\xe1\x01\x1f\x10,\x01v\xc6\ +\xf4\xb6\x00\x00\x00:IDATH\xc7c`\x18\x05\ +\xa3\x80\x0a\x80\x11\x95\xfb\xf1?a-\xfc(z\x98(\ +u\x01\x0b!\x1b\x08\xb9\x90b\x17\x8c\x1a0j\x00\x03\ +\x03\xd6\x94HL~\xa0\xa2\x0bF\xc1(\xa0\x0a\x00\x00\ +\xa6m\x06\x10\x8c\x9dr\x81\x00\x00\x00%tEXt\ +date:create\x002017\ +-01-31T16:44:01+\ +00:00\x17\x1f\xcd%\x00\x00\x00%tEX\ +tdate:modify\x00201\ +7-01-31T16:44:01\ ++00:00fBu\x99\x00\x00\x00\x19tE\ +XtSoftware\x00www.i\ +nkscape.org\x9b\xee<\x1a\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01l\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x04\x00\x00\x00\xd9s\xb2\x7f\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x02\ +bKGD\x00\x00\xaa\x8d#2\x00\x00\x00\x09pH\ +Ys\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\x9bx\x00\ +\x00\x00\x07tIME\x07\xe1\x01\x1f\x10,\x01v\xc6\ +\xf4\xb6\x00\x00\x00:IDATH\xc7c`\x18\x05\ +\xa3\x80\x0a\x80\x11\x95\xfb\xc1\x99\xb0\x16\x81\xbd\xc8<&\ +J]\xc0B\xc8\x06B.\xa4\xd8\x05\xa3\x06\x8c\x1a\xc0\ +\xc0\x805%\x12\x93\x1f\xa8\xe8\x82Q0\x0a\xa8\x02\x00\ +\x9fK\x05S\x09\x1fE\x09\x00\x00\x00%tEXt\ +date:create\x002017\ +-01-31T16:44:01+\ +00:00\x17\x1f\xcd%\x00\x00\x00%tEX\ +tdate:modify\x00201\ +7-01-31T16:44:01\ ++00:00fBu\x99\x00\x00\x00\x19tE\ +XtSoftware\x00www.i\ +nkscape.org\x9b\xee<\x1a\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\x85\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa7\xea\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x02\ +bKGD\x00\x00\xaa\x8d#2\x00\x00\x00\x09pH\ +Ys\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\x9bx\x00\ +\x00\x00\x07tIME\x07\xe1\x01\x1f\x10,\x01v\xc6\ +\xf4\xb6\x00\x00\x00SIDAT(\xcfc`\x18\x02\ +\x80\x11\x99\xf3I\x1d\x99\xc7w\x13C\xf5\x17\x09L\xc5\ +,0\x81\x0f%\x0c\xe7\xff0|\xd0f````\ +0\x14\xe8\x81\x89\xc3\x150\x9c\x17\xd8\x0bW\x8cd*\ +\x13!G\xe2P\x80p\x0d\x0bv\x05\xbdF\xfb\x00\x00\x00%tEXtdate\ +:create\x002017-01-\ +31T16:44:01+00:0\ +0\x17\x1f\xcd%\x00\x00\x00%tEXtdat\ +e:modify\x002017-01\ +-31T16:44:01+00:\ +00fBu\x99\x00\x00\x00\x19tEXtSo\ +ftware\x00www.inksc\ +ape.org\x9b\xee<\x1a\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01\x87\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x04\x00\x00\x00\xd9s\xb2\x7f\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x02\ +bKGD\x00\x00\xaa\x8d#2\x00\x00\x00\x09pH\ +Ys\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\x9bx\x00\ +\x00\x00\x07tIME\x07\xe1\x01\x1f\x10,\x01v\xc6\ +\xf4\xb6\x00\x00\x00UIDATH\xc7c`\x18\x05\ +\xa3`0\x00F\xec\xc2\x9flqi\xe0;L\x94\xb9\ +\xb8\x0c\xc0m0\x91\x00\xd3\x00\x16T\xee\x07g\xdc\x9a\ +\x05\xf6b\x13e\xa2\xd0I\xe8.\xc0e\x13n\x97Q\ +\xec\x82\x91f\x00\xb6d\xc4B\x8a\x01\xd8\x921-\xd2\ +\x01\xbe\xd4H\x03\x17\x8c\x82a\x01\x00\x80\x1f\x0c\xe2\xe7\ +q\xec\x0a\x00\x00\x00%tEXtdate:\ +create\x002017-01-3\ +1T16:44:01+00:00\ +\x17\x1f\xcd%\x00\x00\x00%tEXtdate\ +:modify\x002017-01-\ +31T16:44:01+00:0\ +0fBu\x99\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01\x85\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa7\xea\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x02\ +bKGD\x00\x00\xaa\x8d#2\x00\x00\x00\x09pH\ +Ys\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\x9bx\x00\ +\x00\x00\x07tIME\x07\xe1\x01\x1f\x10,\x01v\xc6\ +\xf4\xb6\x00\x00\x00SIDAT(\xcfc`\x18\x02\ +\x80\x11\x99\xf3I\x1d\x99\xc7w\x13C\xf5\x17\x09L\xc5\ +,0\x81\x0f%\x0c\xe7\xff0|\xd0f````\ +0\x14\xe8\x81\x89\xc3\x150\x9c\x17\xd8\x0bW\x8cd*\ +\x13!G\xe2P\x80p\x0d\x0bv\x05\xd2\xa2\xff#\xd8\xde%\ +\xd5\x05\x8f{\xc9\x99\x14\xc0%L\xa4\x00\xe23\xaf?\ +j\xb8\xe8\x04\x80\x8d+\x8f\xc2\x0b\xe8^\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x00\xd5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x10\x08\x06\x00\x00\x00+\x8a>}\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00RID\ +AT(\x91\x85\xd09\x0e\x80@\x0cCQ\x0bqg\ +\xca\xb4sc\xcaO\x01\x02B&\xc6\xad\x9f\x94E\xc0\ +\x90\x0bgz\xc4\x939\x22\xa7\x22j\xc6\x1f\xc8\xa8\x01\ +7Z\xcd\x81\x1b\xa0\xc5\xbd@\xd2\xeeF\x84\xdb!\xdc\ +\x92\x91\x86\xd8\xf2\x03j\xf9\x02\xf3\xf2\x02})\xe9\x00\ +\x0f\x10\xdc\xd1\xfa\xfa\xc5\x0a\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\xa3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x04\x08\x06\x00\x00\x00\xb3\xcd~\xf0\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00 cHRM\x00\x00z\ +%\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00u\ +0\x00\x00\xea`\x00\x00:\x98\x00\x00\x17o\x92_\xc5\ +F\x00\x00\x00)IDATx\xdab```(\ +g``\xf8\x8f\x03\xd73@A9>Il\x8a0\ +$a\xa0\x01\x8a\xe1\x00\x00\x00\x00\xff\xff\x03\x00D\x11\ +\x0f\xd7;\xbb\xe0\x1d\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x03\xb4\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Ok\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xf6\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Add\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + <\ +/rect>\x0d\x0a \ +\x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x068\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Text Fiel\ +d / Warning\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\ +\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x03\xcd\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Image\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ + <\ +/polygon>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x03\xb5\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Info\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +defs>\x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x04\xa7\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Reset\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\x0a \ + \ +\x0d\x0a \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + <\ +/path>\x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\ +\x00\x00\x04\xcb\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Info\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +defs>\x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03\xd7\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Info\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +defs>\x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\ +\x0a <\ +/path>\x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\ +\x00\x00\x03\xdf\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Warning\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x05\x12\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Warning\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ + \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x03\xf8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>copy\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +defs>\x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \ +\x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x02\x01\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01~ID\ +ATX\x85\xed\x941kSQ\x18\x86\x9f\xaf\x8dH\ +\xa6\xe0\x22\xf6\x07\x04\x84\x0c!9\xf7\x0a\x82Nm@\ +\xd0!\x7f\xa0\xa3\xab\x88\x93\xd0.\x0eNN\xfd\x11:\ +\xa4Si\xa0E\xdc\x84\x0e\xc99\x17\x82\xbb\x93 \xd8\ +A\xc1@h\x94\xf3v\xe9p\x09\xa6\xc4\x1b\xae \xdc\ +g;\xef\xf7\xf1\x9e\x97\x97\xc3\x81\x8a\x8a\x8a\x8a\x8a\x8a\ +\xff\x91\xd1h\x94\x8e\xc7\xe3{\x92l]\xafB\x06Y\ +\x96\xdd\x8f1\x9e\x01\xe7fv\x0a\x1cJ:M\x92\xe4\ +\xd7?\x09 i#\x84\xf0\x05\xd8\xca\xc9\xdf\xcdl(\ +\xe9\xb8^\xaf\x9f\xb4Z\xad\xe9*^\x1bE\x02\x98Y\ +\x04\x86\x0b\xf2-I\xbb\xc0`6\x9b\x8d\xb3,\xdb^\ +\xc5\xabV$\xc0\x15G\xc0\xd3\x05\xed\xc2\xccz\xce\xb9\ +\x8f\xab\x9a\x14j\x00\xa0\xd1h|\x00~.\xc87%\ +\xbd\xf8\x9b\xc7Y8@\xb3\xd9\xbc0\xb3\xf7W\xc7y\ +n\xd4\x0f!<+=\x00@\x8c\xf1\x08@\xd2C3\ +;\xc9\x8d\xdex\xef\x1f\x94\x1e\xa0V\xab\x1d\x03\x9f\xd2\ +4\x1du\xbb\xdd\xc7\xc0s\xe07p\x038\xf4\xdeo\ +]k\xb0n\x80N\xa7\xf3\xc3\xcc\xf6\x00\xccLI\x92\ +\x1c\xc4\x18w\x80\xaf\xc0\x1d\xe0\xed`0\xd8\xbc\xcec\ +\xed\x9f\xecOL&\x93\xdb\xf3\xf9\xfc\x9d\x99m\x9b\xd9\ +k\xe7\xdc\xfe\xb2\xdd\xb5\x1aXF\xbb\xdd\xfe6\x9dN\ +\x1fIz%\xe9\xa5\xf7\xbe\xbfl\xb7\x94\x06\xf2\x84\x10\ +\x9eH:\x90\xd4K\xd3\xf4\xf3\xe2\xbc\x94\x06\xf28\xe7\ +\x86\x92z\xc0\xdd\xb2\xef\xaa\xa8(\xc4%\xa8\x5c\x86\xfa\ +s\xaaT\xa3\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x03/\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xacID\ +ATX\x85\xed\x95Mh\x13Q\x14\x85\xbf7\x89c\ +\x5c\x0c\xa5\x82\x8aBA\xc1\xb6j\xa4?\xc9\x8cH)\ +*\x0a\xa2T\xa1(t\xe5B\xfcA\xdcX\x5c\x15\xac\ +\xf8\x03\xa2XQ\x10\x17\xae\x14\x5c\xb8\x91\x82\x82\x16q\ +5\x05K-\xed$b%H7f\xa5\x82\xa8-\x14\ +\xcdd\x9a\xceu\xd1D\xc24\xb1Mu!\x98\xb3\x9b\ +s\xcf\xbb\xe7\xcc}o\xde@\x15UT\xf1\xbfCU\ +\x22N\xa5R\xba\xeb\xba\x9b|\xdf\x8f*\xa5j\x01#\ +_\x9a\x16\x91IM\xd3R\x22\xf2\xce4\xcd\x99\xbf\x16\ +`hh\xc8\x88D\x22G\x80N`'\xb0|\x81%\ +Y`\x10x\xe2\xba\xee\xc3\xf6\xf6\xf6\xe9%\x05H\xa5\ +Rz&\x93\xe9\x01\xce\x02\xb5E\xa5\x19\xe0+\xf0#\ +\xff\x1c\x01\xd6\x96\xe95\x09\xdc\x02\xae\x97\x9bJ\xc9\x00\ +\xa3\xa3\xa3u\x9a\xa6=\x05\x9a\xf3\xd4K\xa0_)5\ +Xj\xc4\xb6mG\x0c\xc3\xd8\xa2\x94\xda#\x22\xfb\x81\ +]\x81\xde\xaf\xc3\xe1\xf0\xc1\x96\x96\x96\x0f\x0b\x06\x18\x1f\ +\x1f\xaf\xf5E\x22\x91\xd3\xf5\xf5\xf5\xd9J\xcd\x0b\xe8\xea\xea\ +\x9a\xd54\xad\xbb\x98SJ\x1d\x0e\xea\xc2%\xd6\xae\x04\ +>F\xa3Qo\xb1f\xc3\xc3\xc3+t]\xef\xf6<\ +\xefv[[[\xa6\xc0\xfb\xbe?\x05\xe4\x8a|V\x07\ +\xd7\xce\x9b\x80\x88\xbc\x016;\x8e\xd3\xb9\x90\xb1\x88h\ +\x89D\xe2\xa8\xae\xeb\x13\xc0\xb5l6+\x85\x9a\xe38\ +\xcb\x94Rw\x8a\xcc\x11\x91d\xb0\xc7\xbcC\x98H$\ +\xf6\x89\xc8s \xa3\x94\xba\x18\x0e\x87\x1f477\x7f\ +.\xd6$\x93\xc9u\xbe\xef\x1f\x03\x8e\x03\xeb\x0b|(\ +\x14\xda0;;k\x00{\x81\x93@c\xa0\xfd\x01\xd3\ +4\x07~\x1b \x1f\xe2\x8a\x88\xf4\xe6S_\xb6,\xeb\ +R\xfe\xadb\xc0\x05\xa0\x83\xd2\xdbW\x16J\xa9\xbex\ +<\xde\x13\xe4K\x1dB\xe2\xf1\xf8y\x119\x01|S\ +J\xfd\xd2\xe8\xba\x9ef\xee\xd2\xa9\xc4\xdc\x13\x91\x9eR\ +\xe6e\x03\x00X\x96uO\xd7\xf5\x8d\x22\xf2\xac\xc05\ +55M27^{\x11\xc6>\xf0\xd8\xf7\xfd\x98e\ +Y}\xe5D\x15\xfd\x8c\x0a\xb0m;l\x18\xc6M\xe0\ +L\xa04\x0d$\x80\x17\x22\xf2\xc8\xb2\xac\xf7\x0b\xf5Z\ +R\x80\x02\x1c\xc7\xe9\x00\xee\x02uyj\x95i\x9a_\ +*\xe9Qv\x0b\x16\x03\xd34\x07r\xb9\xdcV\x11\xb9\ +\x0a|w]w\xc9\x17\xd7\x1fcddd\x8dm\xdb\ +\x15}\x19UTQ\xc5?\x81\x9f\x05\x11\xec\x9eS\x8e\ +\xc5\x80\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\xad\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03*ID\ +ATX\x85\xed\x96Oh\x5cU\x14\xc6\x7f\xe7\xf2\x82\ +i2\xc9N\xb2\x10\xddT\x10;H\x92\x99\xd7!\x94\ +\x01\xfb\xb0\xbbR7\x86P]\x89Bi\x8a\x22\x95j\ +7\x12\xdbZS\x92\x16\x1b\x11\xc5?\x0b\x154 B\ +\x11\x14\xb7\xd9\xa4\xe3\xf0\xde\xdc7\xba\x91\x86\xa0\xe3\xc6\ +E\xebf\xc2D\x0dM\xdf=.\x9a\x81a\x9ai^\ +\xa6\xa9\x0b\xcd\xb7=\xdf9\xe7\xbb\xf7~\xe7\xbc\x07\xbb\ +\xd8\xc5\xff\x1d\xd2mb\xb9\x5c\x1e\xf2<\xefy\xe0\x18\ +\xf0\xb3s\xee\x5c\xa1P\x88\xee\xbb\x00km\x1exE\ +U\x8f\x02=m\xe1\xab\x222\x93\xcf\xe7\xbf\xddQ\x01\ +\xe5ry\xb0\xa7\xa7\xe7\xa8\xaa\xbe\x04<\x91\x22\xa5\xaa\ +\xaas\xb5Z\xed\xcb\x89\x89\x89\xa4k\x01\xd6\xda\xc7U\ +\xf58\xf0\x02\x90I#\xb6\x0d\xbf\x00\xef5\x1a\x8d\x8f\ +\x82 XK%`yy\xf9\x81\x95\x95\x95\xa7E\xe4\ +\x98\xaa\x1e\xea\xa2\xe9f\xb8\xae\xaa\x1fz\x9e77:\ +:Zo\x0d\x98vf\xbd^?\x01|\xb6\x83\xcd\x01\ +\x86Dd2I\x92\xe7\xda\x03\x9b>A\x1c\xc7\x0f:\ +\xe7\xde\x00N\x00\xde=6\xaf\x01\xef\x02\x9f\xf8\xbe\xff\ +W*\x01MDQ\xf4\x98\x88\xbc\x05\x8co\xc5\xdd\x04\ +?\xa9\xea;\xab\xab\xab\xf3A\x10\xdc\xeaDJU4\ +\x0c\xc3'\x8d1g\x80\x83[q\x8d1W\x9ds\x0b\ +\x22R\xcd\xe5r\xdf\x88\x88\xbb\x1b\x7f\xab\x1b\x18\x05\x8e\ +\x8b\xc8\xb8\x88L9\xe7\x96D\xe4\x120\xdcFu\xc0\ +\xf7\x22\xf2\xb6\xe7y\xbf\xae\xaf\xaf\xbf\x09\xbc\x08\xd4T\ +\xf5b__\xdf\x17\xd9l\xf6f*\x01mS\xb0\x1f\ +\xf8\xdc\xf3\xbc\xd9\x91\x91\x91\xdf\x01T\xd5Xk\x9f\x01\ +f\x80\x87D\xe4+U\x9d\xf6}\xffZk\x9d0\x0c\ +\x1f6\xc6\x9c\xe2\xf6\xa6\x5c\xe94\x05w\x08\x88\xa2\xe8\ +\xa4\x88\x9c\x07\xfaDd\xd6\xf3\xbcs\xc3\xc3\xc3\x7f\xb6\ +\xf3J\xa5\xd2\x1ec\xcc\xe0\xd8\xd8\xd8\xf5N7\x18\xc7\ +\xb1\xef\x9c\xbb\x0c\x14\x81\x1b\xc0Y\xdf\xf7?\xb8\xab\x80\ +\x8d\xc4\xd6)\xa8\x8b\xc8\xac\xaa\xce\xf9\xbe\xbf\xde\xa9Y\ +\x13\xaaj\xaa\xd5\xeakI\x92\x8c\x8bH\x1e\xf8\x8dn\ +\xa7 \x8e\xe3}\xce\xb93\x222\xae\xaa7\x80\x97}\ +\xdf\xff\xba\x13?\x8a\xa2C\xc6\x98\xe9\x8d\xa7[R\xd5\ +\xe9$I~\x1c\x18\x18\xb8\x96\xda\x03\x0b\x0b\x0b\xbd\x99\ +LfBD&\x81A\xe7\xdcS\x22\xf2\x88\x88\xcc\x00\ +\x07U\xf5\x07U=U(\x14J\xcd\x13\xc7q|\xd8\ +97%\x22>\x1b\x1f\xa4\x5c.\xf7\x9d\xb5\xf6Y\xe0\ +S\xe0\x0f\xe0\xf2\xda\xda\xda\xc7\xc5b\xb1\xd1\xda\xef\x8e\ +%\x93\xc9d&\x9b\x1eP\xd5\x8b\xfd\xfd\xfd\xab\xd9l\ +6\x04\x02k\xed\x11\xe0\x82\x88,V*\x95y`\xd1\ +Z{\x12xTD\xae\x18c&s\xb9\x5c\xa5Y+\ +\x0c\xc3ecL\xc8m\x0f\xbc\xde\xdb\xdb\xfb7\xb0}\ +\x0f\x00\xe7\x1b\x8d\xc6\xfbA\x10\xdcJ3\x05\x95J\xa5\ +\x08\x9c\x06\x0es/\x1eh\xdb\x84K\xc0T\xd3\x03\x9b\ +M\xc1\x86\x07\xce\xaa\xea\x01vr\x13FQT\xe8\xc6\ +\x03\x22\xa2[\xd5\xde\xd6~\xb7\xd6\x1eQ\xd5\x0b\xc0>\ +`\x1eX\x04^\x05\xf6\x02W\x8c13\xad\x1eH\x83\ +m\xff\x92\xa5\xdd\x84\xf7\x1d\xa5RiO\xb9\x5c\x1e\xfa\ +W\x9b\xee\xe2?\x89\x7f\x00n\xf6\x9d\xd7\xa8\x19\xa05\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x05\xc0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x05=ID\ +ATX\x85\xed\x96m\x8c\x5ce\x15\xc7\x7f\xff;w\ +'3M\x96&\x0dZ\xabV\x0c-\xa48\xba/\xf3\ +\xdc)kS\x92.X@R\xb2\x15$\xea\x97&\x8d\ +$\xbe \x98\xfa\x12>\xa0|\x00\xa36*\x81\x846\ +Z\x8d\x89\xa0\x89\x19\xb2\x94\x17\x11c\x0b\x8bI]w\ +w\x9e\xbb\x95\xc46\xbe@D\x96j\xacQ\x8c;e\ +7;\xbb\xcf\xf1\xc3\xdcIfgw\x96VL\xf8\xc2\ +I&wr\xce\xb9\xe7\xfc\x9e\xfb\x9c\xe79\x07\xde\x92\ +7Yt!\xce\xde\xfbm\xc0\x88\x99\xed\x96\xf4.`\ +sf\x9a1\xb33\x92\x8e\x99\xd9c\x95J\xe5\x0f\xff\ +W\x80\xa9\xa9\xa9J\x14E\x07\x81\xe16\xf5\xdf\x81\xb3\ +\x80\x01\x1b\xb3_K\x9e\x8d\xa2\xe8\xcer\xb9\xec\xdf\x10\ +\x80\xf7\xbe\x07x\x00\xf8t\xe6;\x0b\xc4\xc0\x07\x92$\ +y\xb1\xddwbbbc\x1c\xc7\xd7\x03\x9f\x04\xae\x02\ +\xcc\xcc\x0eK:\x90$I\xe3\x82\x01\xc6\xc7\xc77\xe4\ +\xf3\xf9Q`\x17\xf0\xfb(\x8a>\x17B\xf8\x9e\xa4\xa7\ +\x9ds\xb7\xaf\x05\x9e\xa6\xe9\x8df\xf6]\xe0\x9d\xc0X\ +>\x9f\xbf\xb9\xaf\xaf\xef\xd5\xd5|\xa3\xd5\x94\xde\xfb\x9e\ +Vr3{\xb4X,V\x16\x17\x17\x17\x81-4\xbf\ +\xc8\x9a\xe2\x9c{2\x9f\xcf\xbf\xdf\xcc\x9e\x04\x86\x17\x16\ +\x16F\xb3\xafy~\x00Y\x92]\x92F\xeb\xf5\xfa\xc7\ +J\xa5R]\xd2^\xe0w\xce\xb9\x17^\x0f\x00\xa0\xaf\ +\xaf\xef\xd5z\xbd~S\x0bB\xd2}\xab\xf9\xad\xd8\x82\ +\xac\xe0&\x81?K\xfaH\x08\xa1\x90\xcb\xe5zC\x08\ +\x0f\x02?O\x92\xe4\x8b\xe7\x03\xd0\x12\xef\xfdz\xe0\x1f\ +@,\xa9\xe2\x9cK\xdb\xedq\xe7\x0bY\xb5\x0b\xb8\xd4\ +\xcc\x9e\x97D\x08\xa1e\xde\xe6\xbd\xdf\x0b\x9c\x904\x16\ +\xc7\xf1#\xfd\xfd\xfd\xe7\xd6\x020\xb3K%\xc5\x80B\ +\x08\x07\x81\x0f-\xcb\xd7A\xbb\x0d\x1863\x0f\x5c\xd5\ +\xd3\xd3\xb3\xd19\x17I\xba,\x0bv\x8b\xa4\x83\x92d\ +f\xdfh4\x1a3\xde\xfboMMMm\xa6\xbb\x8c\ +H\xfa\x0d\xf0kI\xd7LNN^\xde\x15\x00\x18\xc9\ +\x9e?J\x92\xe4D\x7f\x7f\xffYI\x16B\xd8\x00\xb0\ +\xb4\xb44\xe1\x9c;\xe2\x9c\xdbW,\x16/1\xb3\xcf\ +\x03WGQt\xda{\xffY3[\xb6\xa5\xd5j5\ +'i\x9f\x99\x1d\x01\xaa\x00q\x1c\x8f\xb4\xfb,\x030\ +\xb3\xdd\x00===G;\xc0\xd6\x01H\x9ak)J\ +\xa5\xd2B\xa5Ry\xd89\x97\x00\x07\x80o\xa6i\xfa\ +\x8c\xf7\xfe\xe2\x96\xcf\x96-[>\x0e\xac_XX\xa8\ +\x86\x10\x8e\xb6\xe7X\x15@\xd2f\xa0>00pf\ +\x99S\x14\xcdf\x7f/\xea\x00C\x92%I\xf2\x83\x5c\ +.\xd7\x97\x81>\xe7\xbd\xdf\xe4\xbd_gf\xf7H\xfa\ +\xce\x8e\x1d;\xe6\xb6o\xdf>\x03\x9c\x03\xde\xd3\x15\x00\ +\xd8\x04\x9c\xe9\xd0\x11E\xd1?\xb3\xe7\xdb:m-\x19\ +\x1c\x1c|i~~~7\xf0/\xe0Wf\xf6 0\ +_(\x14\xbe\xdd\xe6\xf6\x0a\xcd\xcb\xa9+\x00\xc0\x8ak\ +s``\xe0e`6\x8a\xa2\xfen\x00\x00;w\xee\ +\x9c-\x16\x8b7\x00uI\xfb\xa3(\xba\xa3T*-\ +\xac\x15\xbb\x13\xe0o\xc0\x8aUJ\x0a\xc0\xf3f\xb6}\ +-\x00\x80\xf9\xf9\xf9]\xc0\x15\xc0kfve\x87\xf9\ +\xed\xc0_\xbb\x02Hz\x19\xd88==\xbd\xec3\x01\ +\x98\xd9/\x80=\xd5j5\xd7-y\xadV\xdbgf\ +\xa3\x92\xee5\xb3[\xcd\xec\xae\x93'O\xbe\x17\xc0{\ +\xbf)\x03\xf8KW\x80\x10\xc2\xb1,\xd9\xb5\x9d\xc1s\ +\xb9\xdcQ\xe0\x1d[\xb7n\xdd\xd5i\x9b\x98\x98\xb8(\ +M\xd3\x87$\x1d\x91t\xbbs\xee\xebI\x92\xfc\xd4\xcc\ +N\x87\x10\xbe\x9a\xc5\xfcp\xe6~\xac+\x00\xf0x\x06\ +\xb2\xbf3I\xb9\x5c>\x0d<\x17B\xf8rK\xe7\xbd\ +_\xe7\xbd\xffR\x1c\xc7/\x9aYbf\x1ft\xce\x1d\ +\x81\xe6\xe9\x00\xee6\xb3O\x8c\x8f\x8fo\x90\xb4?[\ +\xc8\xe3\xedqW\xf4\x02\xef\xfd3\xc0\xd5\xc0uI\x92\ +\xfc\xb2\xddV\xab\xd5n\x90\xf4\x14p\x07\x90\x00{\x81\ +\xd7\x80{\x81\xefw\xf6\xfd\xb1\xb1\xb1\xb8\xb7\xb7\xf7\x8c\ +\x99\x9d\x90t\x93\xa4\xe3\xce\xb9e\xf7\xc0\x0a\x80\xe9\xe9\ +\xe9$\x840\x95\xd9\xce\xd1<:\xff\x06zi\x16h\ +\xabH\x9f\x92\xf4\xc3B\xa1\xf0\xb3\x8eJ\xef\x5c\xd0a\ +\xe03@\x00*I\x92L\xb7\xdbW4\xa3r\xb9\xec\ +k\xb5\xdaaI\xb7\xd1<\xd3\x87$\x15\xcc\xec\xac\x99\ +\x9d\x05\x1a\x92F\x81\x17\x9cs\x8fvK\x0cp\xea\xd4\ +\xa9\xfc\xdc\xdc\x5c\xabO\x1c\xeaL\xbe*\x00\x80\xa4\x03\ +\xc0\xfbh\xce\x80{\x1a\x8d\xc6-CCC\xffi[\ +\xd5\xad@\xd5{\xff\xc7$I\x0ewY\xf9\xfa\xb9\xb9\ +\xb9\x1f\x03{\x80g\x81U\xdb\xf8\xaa\x03I\x92$\x8d\ +|>\x7f30\x06\x5c\x1b\xc7\xb1O\xd3\xf4\xc66\xfb\ +#f\xf6\x15\xe0\x81Z\xad\xf6\xa9\xce\xf7\xd34\xbd\x0e\ +\xf8m+y>\x9f\xffh\xb7\xb9\xf0u\x87RI\xf7\ +\x99\xd9m\x80$\x8d\x9b\xd9O\x16\x17\x17\x9f\x18\x1a\x1a\ +z\xa5V\xab\xdd%\xe9kfv\x7f.\x97\xbb\x7fi\ +i\xe9\xfa\xac\xda\xaf\xa4\xb9\xe7\x87fgg\xbf0<\ +<\xbc\xd8-\xc7y\x8d\xe5i\x9a\xba\x10\xc2AI\xd7\ +\xb4\xa9\xcf\x01/\xd1\x9c\x13\x0b\xcb\x82J\xc7\xcd\xec\xce\ +\xd5\xf6\xfc\x7f\x02h\xc9\xe4\xe4\xe4\xe5q\x1c\x8fd-\ +u3\xf0\xee\xcc4\x03\xccH:\x1eE\xd1c\x83\x83\ +\x83\x7f\xba\x90\xb8o\xc9\x9b*\xff\x05Y\x8c!,\xbf\ +\xde{\x13\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xe7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00dID\ +ATX\x85\xed\x93\xb1\x0d\x800\x0c\x04c\xc4\x06^\ +\xc5\xfbY\xde\xcf;A\xff \xd1Xy\x8a\xbf\xf2\x94\ +H_\xf8\xd6\x12\x82\x8c\xa1\xa8\xaa\x0b]f\xda\x94\xff\ +\x1c\xd0\xdd\x8f\x8f\x11aS\x1e\xdd\x81b7\xf4\x01'\ +\x0aw\x7f}8\xe5\x7f\x87*\xa0\x1f!}\x80*P\ +\x05\xf4#\xa4\x0fP\x05\xaa\x80~\x84\xf4\x01\xaa@\xd0\ +\xb9\x01\xc6 \x83\xb99\xc1\xad\xbc\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x03\xe2\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03_ID\ +ATX\x85\xe5\x97\xc1k\x1cU\x1c\xc7?\xbfW\xd7\ +\xdd)\x09(xi\x83\x16\x15\x956\x12\xc8\xee{\x11\ +b\x1a\xa3\x17El\x03\xe2\xc5\x0a\xfa\x0f\x94\xd6\x22z\ +\xf0&\xe8A\xbc\x04\xa4\x17\xb5z\xb1\x17\x11A\xa4\x82\ +\xd4\xb8\x08V0\xf3v\x83\xd1Cq\xf1`\x0e\x16/\ +\xa9\xd9\x1cv\xbb\xdd\x9d\x9f\x07g\xcb\xb8\x9d\xd9\xcdn\ +\xb2'\x7f\xa77\xbf\xdf\xef\xcd\xe7;\xbf\xf7{of\ +\xe0\xffn\xb2\xdf7\x0c\xc3\xf0q\xe0E\x11\xb9_U\ +\xb7\x8c1\xdf\x15\x0a\x85\x8b\xd3\xd3\xd3\xad\xb1\x0a\xa8\xd5\ +j\xf9\xed\xed\xed\x0f\x80\x97S\xc2\xbf\x01\xcb\xd6\xda\xab\ +c\x11\x10\xc3\xbf\x00\x9e\x8d]\xbf\x03WD\xe4\x88\xaa\ +.\xc6\x9c\xcdV\xab5;??\xbf\x95\x9ck\xc6\x00\ +\x7f?\x08\x82c\xd6\xdaWJ\xa5\xd2\x92\x88,\x03m\ +\xe0\xbe\x5c.\xf7Z\xef\xfc=\x09\xe8\x85\xab\xea{\xd6\ +\xda3\xc9\xf5.\x95J_\x01\x1f\x01\x88\xc8\xf3\xfb&\ + \x0d\xee\x9c{#-WD\xd6\xe2\xe1\xbd\xbd\xb1;\ +F\x15P\xaf\xd7O\x89\x88\xa8\xea\x96\xaa^\xc8\x82\x03\ +DQtTD\x00\xfe\xbaM\xdc\xa8\x02\xba\xa6\xaaF\ +D\xa2\xacx\xa5R9\xaa\xaa\x1e8\xa8\xaa\xe7\x9ds\ +\xa7\x93\xf1\x91*\xe0\xbd?\xd4n\xb7\x0flnn^\ +\x13\x91NV\xde\xfa\xfa\xfaC\x9dN\xe72p\x10\xb8\ +\xae\xaa\xef\xf6\xe6\xec\xba\x02\xaaj\xaa\xd5\xea\x19U}\ +\x158\x12\xbb\xb7\x80O\x9a\xcd\xe6[\x0b\x0b\x0b;)\ +\xf020\x054\x8c1'\x8a\xc5\xe2\xeaH\x02j\xb5\ +Z\xbe^\xaf\x7f\xa6\xaa'3R6\x80Ek\xedv\ +\x1a\x5cU\x97\x9ds\x97\xd3&\x0e\xdc\x05\xddnO\xc0\ +/\x01O\x03\xc7U\xf5<\x10\x01\x0fGQ4=,\ +\x1c\x06\xf4\xc0.\xb6\xda\x0fa\x18n\x02\xbf\xcc\xcd\xcd\ +\xfd8,\x1c\xfa,A\x16\xbc\x5c.\x17&&&\x9e\ +s\xce}\x9e\xcc\x1f\x05\x9e)\xa0\x1f|rr\xf2K\ +\xe0I\xe0\xec\xce\xce\xce\x87KKK\x1d\xef\xfd3\x22\ +r\x0184\x0c\x08\x82\xfc89{\xb2\x7f\x00\x97\x0b\xf6\ +\x03l\x1c\xd4\xf7\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x03A\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xbeID\ +ATX\x85\xed\x96\xbfk\x14A\x14\xc7?o6\xb8\ +\xd8\x18\x15\xb5Q+5\x85\x12!\xbb{\x11\xe4b\x04\ +\xb5S\x03\x12\x0fl\xd5\x08\x16V\xfe\x01\xe6oPD\ +\xf0@\x0bm\xd4\x14\x16\xda\x88\xa21\x0a92\xbb\x07\ +\x06+\xb51(\xa2`\x8a\x80Y\x03\xbb\xcf\x22\x1b\xb8\ +\x98\xbds/\xc6\x1f\xa0\xdff\x867o\xde\xfb\xcc\x9b\ +\xd9\xd9\x81\xff\xfa\xd7%E\x9c&&&\x0e\x89H\x05\ +\xe8\x03\xb6d\xe6)`LUo\x97J\xa5\x87\xbf\x04\ +\xa0V\xabu\x19c\xaa\x22\xb2\xafe\x10\x91Qc\xcc\ +POO\xcf\xab\x15\x03\x88\xa2h_\x9a\xa6w\x81u\ +\xc0GU\xbd\xa8\xaa\xf7]\xd7}577w\xd4\x18\ +\xf3UUw\x02\xe7\x80M\xc0\xb4\x88\x0c\xf8\xbe?\xf6\ +\xd3\x00\xb5Z\xad\xcbq\x9c\xf1,\xf9\x9d8\x8eO\x95\ +\xcb\xe5\x99\x85qk\xadf\xdd\xc94M\x87\x8d1'\ +\x80A\xe0\xb3\x88\xec\xf1}\xffuQ\x00\x93k4\xa6\ +\xba\x90\x1c\xa85&\xffN\xdd\xc6\x98\x11\xdf\xf7+\xc0\ +\x08\xb0^U\xabE\x93CN\x05\xb2\x03\xf7\x00\xf8\x18\ +\xc7\xf1\xf6r\xb9<\xd3\xb0b\x00\x82 X4\xcfZ\ +\x9b\xaa\xeaq\x11\xb9\x02l4\xc6\x1c\xf4<\xefQ\x11\ +\x80%\x15\xc8N;\xaaz\xb1\xc5\xcas\xa6\xc9\x05\xe0\ +\x12@\x92$\x95\x82\xf3r\xb7\xa0\x0f\xc0q\x9c{E\ +\x83d\xea\x16\x91\x97\x19M\xcb\xaf\xe6G\x00\x9b\x01\x5c\ +\xd7}\xd3&\x00\xc0\xea\xac\xdd\xd2\xd2\xabA\x1d\xcd\x06\ +\xe28\x1e\xb0\xd6\xde\x84\xdc=\xcf=\x13\xe3\xe3\xe3k\ +::\x9a\x86\xccU^\x05\xdee\xed\x97\xb6\x22\x01\x8e\ +\xe3l\xcb\xba\xef\x7f\x06`\x0c@Uw\x01\x93\xed\x00\ +\x88\xc8\x91\xac}\xb6l\x00U\xbd\x95u\xcf\xa5i:\ +\x0c\xe8\xf7>y\xb2\xd6v2\x7f+\xa2\xaa7\x8b\x02\ +\xe4\xde\x84a\x18>Q\xd5~`\xc4\xf7\xfdJ\x18\x86\ +I\xa3o\xce\x998\xaf\xaa{E\xe4\x98\xaa>-\x95\ +J\xfdE\x01\x9a\xdd\x84C\xc040\x18\x86\xe1m\x11\ +\x19\x04^\xe4\xf9Zk;\x17\x92g\xa6\xc7\xaa\x9a\x1b\ +7OM\x7fFa\x18\xf6\xa9\xea]`=\xf0\x09\xb8\ +$\x22/Ed\x95\xeb\xba\xf7fgg\xbb\x80\xc3\xcc\ +\x97}\xc3\xa2\xa0\x22\xd7<\xcf\x1b\x12\x91t\xd9\x00\x00\ +\xf5z}G\x92$W\x81\xfd-\x83\x88\x8c2\xbf\xf2\ +\xe1v!\x0a=H\xa2(:\x90$IED\xfa\x80\ +\xad\xcco\xdd[\xe0y\x9a\xa67z{{GU\xd5\ +DQTU\xd5\x93\xed@\x14\x02(*U\x950\x0c\ +/\x03g\x1bl\xd7\x83 8\xdd\x0cbE\x01\x96\x03\ +\xb1\xe2\x00Y\xc2%\xdb\x01T\x83 8\xf3[\x00Z\ +@\xec\x0e\x82`\xd1\xedZ\xf8{mW\x22\x92z\x9e\ +7\x04,\xbc\x90>8\x8e3\xf5\xab\xf2\xb5\x94\xb5\xb6\ +\xbb^\xaf\xaf\xfd#\xc9\xff\xeb\xaf\xd77i\xa4%\xc3\ +\x8c?`\xdb\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x04\x0a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x87ID\ +ATX\x85\xe5\x97\xc1k\x1cU\x1c\xc7?\xbf\xa71\ +\x9b\x9a\x80\x82\x97Z\xb4\xa8\xa8\xb4)\xd1\xec\xbcY!\ +\xa6!zQ\x8a\x1a\x10\x11\xac\xa0\xff@\xa9\x161\xb9\ +\x98@[/\xa9\x97\x82\xf4b\xad^\xecED\x10Q\ +\x90Z\x17A\x05\xf3\xden0z(.^V\xb0\xf4\ +\x92\x9a]\xa1\xdb5\x99\x9f\x97\xd90\x1dgw\xb3\xdb\ +\xe4 \xfeN3\xbf\xdf\xef\xcd\xe7;\xbf\xf7{o\xde\ +\xc0\xff\xddd\xbb\x1f\xe8\x9c{\x1cxID\xeeS\xd5\ +Uc\xcc7\xb9\x5c\xee\xfc\xe8\xe8hsG\x05T*\ +\x95\xc1\xb5\xb5\xb5\xf7\x80W2\xc2\xbf\x023\xd6\xdaK\ +;\x22 \x86\x7f\x0a\x1c\x8a]\xbf\x01\xdf\x8b\xc8^U\ +\x9d\x8a9\xd5f\xb39>11\xb1\x9a\x1ckv\x00\ +\xfe\xee\xd0\xd0\xd0~k\xed\xabA\x10L\x8b\xc8\x0c\xb0\ +\x0e\xdc;00\xf0Fz\xfcM\x09H\xc3U\xf5\x1d\ +k\xed\xd1\xe4|\x07A\xf09\xf0>\x80\x88<\xbfm\ +\x02\xb2\xe0a\x18\xcef\xe5\x8a\xc8R|yO:v\ +k\xbf\x02j\xb5\xdaa\x11\x11U]U\xd5s\xed\xe0\ +\x00Q\x14\xed\x13\x11\x80+\xff\x12\xd7\xaf\x80\x96\xa9\xaa\ +\x11\x91\xa8]\xbcT*\xedSU\x0f\xecR\xd53a\ +\x18\x1eI\xc6\xfb\xaa\x80\xf7~\xf7\xfa\xfa\xfa-\xd5j\ +\xf5\xb2\x88l\xb4\xcb[^^~pcc\xe3\x02\xb0\ +\x0b\xb8\xaa\xaa\x8b\xe9\x9c-W@UM\xb9\x5c>\xaa\ +\xaa\xaf\x03{c\xf7*\xf0a\xa3\xd18>99Y\ +\xcf\x80\x17\x81=\xc05c\xcc\xb3\xf9|\xfeb_\x02\ +*\x95\xca`\xadV\xfbXU\x9fk\x93\xb2\x02LY\ +k\xd7\xb2\xe0\xaa:\x13\x86\xe1\x85\xac\x81]WA\xab\ +\xdb\x13\xf0/\x80\xa7\x80\x83\xaaz\x06\x88\x80\x87\xa2(\ +\x1a\xed\x15\x0e]z`\x0bK\xed;\xe7\x5c\x15\xf8\xb9\ +P(\xfc\xd0+\x1c:LA;x\xb1X\xcc\x0d\x0f\ +\x0f?\x13\x86\xe1'\xc9\xfc~\xe0m\x05t\x82\x8f\x8c\ +\x8c|\x06<\x01\xbcV\xaf\xd7\xcfNOOox\xef\ +\x9f\x16\x91s\xc0\xee^\xe0\x99\x02:\x95}ee\xe5\ +\xcef\xb3\xe9\x80\x07\xe2\xf4k\xc0u\xe0\x8e\xd6}/\ +pH5a\xb79\x1f\x1b\x1b\xbbj\x8c\x99\x02\xbe\x8a\ +]C\x09\xf8/\x22r\xb0\x178\xa4*\xe0\xbd\xff\x08\ +x9\x0b\x9e\xb6r\xb9\xbc_U\x1fS\xd5Ac\xcc\ +O\xe3\xe3\xe3?v\xda\x11\xbb\x0a(\x95JO\xaa\xea\ +\xc5\x18~:\x0c\xc3c\xbd>\x0c\xc0{?\x07\xdcf\ +\xad=\x99\x15w\xce\xcd\x8a\xc8`+\xbe\xb9\x0cU\xf5\ +p|yID\xda\xbey\xdc\xedo\x8b\x88\x07.\xe7\ +\xf3\xf9\xf3\x22\xa2\x89\x94\xdb\x81y\xef=i\x111|\ +QDN\xb5|\xc9\x1e\xb8\x1f@D\xbe\xb5\xd6\xfe\xdd\ +\x01^\x04^T\xd5\xe3Q\x14]I\xc1\xb1\xd6.\x00\ +'\x81\x13\xde\xfb\xf9,x\x10\x04s-\x7fr#\xaa\ +\x01DQtw\x17x\xd7un\xad]\xf0\xde\x13\x8b\ +@U\xaf\x8b\xc8b|`\x99K\xe6&+P\x8c+\ +p(>\xd9n\x9as\xee\xe1^7\x99d%Z\xf0\ +\xac\xa6\xde\xac@\xa3\xd1\xf8 \x97\xcb\xbd\x09\xec\x11\x91\ +\xaf\xbd\xf7\xa7EdYU\x0f\x00\xc7\x80\xe1\xad\xc2[\ +\xa6\xaa\x7f\xc5\x07\x11D\xa4\x9e\x95s\xc32\x5cZZ\ +\x0a\x8d1_\x02we\xe4\xfei\x8cy!\xeb\x93\x9a\ +e\xc99W\xd5&\xf0\x16\xb0\x90n\xcc\x1b6\xa2B\ +\xa1\xe0\x8c1\x8f\xc4_\xb9\xdfc\xf7\x1f\xc0Yc\xcc\ +\xa3\xfd\xc0\x83 \x98\xb3\xd6\xce\x93\xd1\x98;b\xce\xb9\ +Y\xef\xbd:\xe7N\xa5c\xde\xfb\x13\xde{M\x8a\xb8\ +\xe9\xff\x82\xb4\x89\xc8H\xbb\x86k5\xa6\xaa\x8el7\ +\xf7\xbfk\xff\x00\xba\x1a0r\xd6=\xc6q\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x04\x11\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x8eID\ +ATX\x85\xed\x97_h\x1cU\x14\xc6\x7fgfw\ +[\xb2H\x82\xb6\xbeTL\x5c\x13i\xa4\x183;\xc4\ +u\x0b\x91 *\xd4\x07E0 B\x83b\x11\xc4'\ +}\xa8)X\xb4\x16\x1fJ}Q\xaa\x82\x08\xfaRq\ +\x15\xff@A\x1a\x03\x82h\xcc2w\xb7\xd9\x96\x80\x1a\ +\xb2\xc1\x07\xd1\x04+&bCvw\xee\xf1!\xbb\xb2\ +,Iv\xb3!O\xf5\x83y\xb8\xe7|\xf7;\xdf\x9c\ +;s\xef\x0c\x5c\xef\x90v'f2\x19\xb7\xb7\xb7w\ +0\x0c\xc3\x03\x8e\xe3\xec\xb1\xd6\xfeZ.\x97\xf3\xe9t\ +zuW\x0dLMM\xdd\x18\x8b\xc5\xc6\x811`\x7f\ +C\xfa\x1f\x11\xf9LU_\xf5}\x7f\xbe\x15=g;\ +\xc5\xf3\xf9\xfcp,\x16\xfb\x09xJD\xce\xa9\xaa\x07\ +\xc4;;;\xf7\xba\xae{\x07pBU\xd3\xc0l\x10\ +\x04O\xb7\xa2\xd9r\x07\xf2\xf9\xfc\xb0\xb5\xf6kU\xbd\ +\x18\x89D\x8e\x0e\x0e\x0e\xfe\xb5\x11ovv6\xb6\xba\ +\xba\xfa:\xf0\xa2\x88<\x9fL&\xcf\xed\xd8@6\x9b\ +\xbd\xc9u\xdd\x1fU\xf5\x07\xdf\xf7\x1f\x15\x11\xdblN\ +.\x97;\xad\xaa\xc7\x1d\xc7\xb9\xd7\xf3<\xb3\x19\xaf\xa5\ +%p]w\x1c\x90H$r\xb4\x95\xe2\x00\x9e\xe7\x9d\ +\x14\x91K\xd6\xda3[\xf1\x9a\x1a\xc8d2.0&\ +\x22om\xd6\xf6\x8d \x22\xd6Z{\x1a\x18\xc9f\xb3\ +\xb7\xb5m\xa0\xa7\xa7\xc7\x03\xf6\x89\xc8\x17\xad\x16\xaf\xa1\ +\xab\xab\xeb\x22p-\x12\x89<\xd0\xb6\x01\x11\xb9\x15\xc0\ +Z;W\x8b\x15\x0a\x85\x9bgff\x0e4r\xa7\xa7\ +\xa7o\x09\x82\xe0Pm\xdc\xd7\xd7\xb7\x06\xfcb\xad\xed\ +n\xdb\x00\xeb\x0f\xaa\x96J%\xad\x05J\xa5\xd2\xc9r\ +\xb9|\xbe\x91\x18\x8dF_\x10\x91w\x1a\xc2VD\xdc\ +\xcd\xc4#M\xab\x8b\x14\x01\x89F\xa3\x07\x81K\xd5\xf0\ +\x15\x119\x9c\xcb\xe5\xde\xaf\xe7\xaa\xea!U\x9d\xaa\x8d\ +\xe7\xe6\xe6\xf6,//'\xaa\x1a\x1b\xa2i\x07\x8a\xc5\ +b\x01X\x14\x91\xc7\xea\x0a}\xa9\xaaw\x86ah\xac\ +\xb5\x93\xb5\x0b\x889\x8e\xf3q\x8d\xb7\xb2\xb2\xf2 \xb0\ +\xb7\x9ak\x1f\xc6\x98\xb3\xc6\x98\xc5B\xa1\x10\xaf\xc5\x82\ + \xf8\xca\x183^\xc7\xb9\xdd\x18\xf3\xb3\xaaJ\x1dg\ +\xd2\x18\xf3\xddV\xda-\xed\x03\xd6\xda\xb3@\xbcR\xa9\ +\x8c\xd7\x85\xdf\x05\x8e\xa9jM\xe3\x18\xf0\x91\x88h\xb5\ +\xf8\x11\x11\xb9\x1f8\xb5c\x03CCC\xbf\x03\xaf\xa8\ +\xea\xf1 \x08\x0e\x03,,,\x5c\x00:\x8c1\xc3U\ +\x13c\xc0\xa7\x00\xf9|~\xbf\x88\xbc\x07|\xee\xfb\xfe\ +\xc4V\xda-\x9f\x05\xaa\xea\x18c&D\xa4\xbfR\xa9\ +x\xa9Tj\xd1\x18\xf36p\x0d\xf8\x04\xc8\xf8\xbe\xdf\ +\x9d\xc9d\xdcD\x221\x01\x1c\x8cF\xa3\x83\x03\x03\x03\ +K[\xe9\xb6|\x1a\x8a\x88\x0d\xc3\xf0I\xd6\xb7\xe47\ +\xab\xe1\xbc\xaa\xde-\x22\x03\xc0\x15\x80D\x22\xf1\x1cp\ +\x9f\xe38O4+\xbe-\x03\x00\xa9TjQU_\ +\x02\xba\x8d1\x1d\x8e\xe3\x04\x22R\xb0\xd6^\x05.T\ +iw\x01\x1fx\x9e\xf7mK7\xb6\x1d\x03\xf0\xdfR\ +<#\x22g\x80\xce\x86\xf4\xdf\x22rbmm\xed|\ +:\x9d\xfesW\x0c\x00\x18c\xfe\x00.\xb3\xbe\xf6\xf5\ +\x18\x01\x8e$\x93\xc9\x1bjoC34\xdd\x097A\ +g\xb5\xd8\xc8F\xc9\x5c.\x17\x01\xca\xbbi\x00\xe0\x1b\ +6\xee\xc0\xe3\xdb\x11i\xd7@\xc8&\x1d\x10\x11;?\ +?\xdf\xd2G\xcbN\x0cL\x02\x0f\x03\xaf\x01\xbfUc\ +\xfb\x80S\xaa\xfa\xfd\xe8\xe8h\xb8\xab\x06\x8a\xc5\xe2#\ +\x89D\xe2\x0d\xe0\xe5\x86\xd4\x87KKK\xcfnG\xab\ +\xed\x1f\x13cL\x070\x01\xdcS\xd5\x99\x89\xc7\xe3\x0f\ +\xf5\xf7\xf7_mW\xf3\x7f\x5c\x9f\xf8\x17[\xfajM\ +V\x06\xab\x0a\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x04{\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\xf8ID\ +ATX\x85\xed\x96Mh\x5cU\x14\xc7\x7fgf\xde\ +F\x93\x14\xb1\x88\xda\xa0\xedt\x93VH23\xf7\x8d\ +C\xd4 \xb8\xb2E\x13\xa9\xba\xd1]-n\xb4\x15E\ +)\x11\xc5T\xa1\xe8\xc2\xcfE\xc1\x16\x11\x22.\x82\xa1\ +$\xa6\xb8\x10\x1c\x0aZ\x87\xbc\xfb\xc24 \x85\xaa%\ +hk%(b\x82\x1fd^\xdeq\x91\x172y\xf3\ +f2Ew\xe6\xac\xee\xb9\xe7\xdcs\xfe\xf7\xdc{>\ +`\x8b\xfe\xef$\xd7\xa2l\xad\xbd\x0d\x18\x02\xf6\x03;\ +\x81\xeeHt\x19\x98W\xd5iU\x9d,\x16\x8b?\xfe\ +\xa7\x00\xaa\xd5\xea\x8eZ\xad\xf6\xb2\x88\x1c\x04\xd2\x9b\xa8\ +\x87\xc0D:\x9d~!\x97\xcb\xcd\xffk\x00\xd6\xdaa\ +`\x0c\xe8H\x10\x9f\x8fl\xec\x01\x9c\x98lIU\x1f\ +w]w\xaa\x95\xfd\xd4&\xce\x8f\x00\x13\x09\xce/\xaa\ +\xea\x901\xa6\xdf\x18\xd3\x07\xdc\x0e\x9c\x00\xb4N\xa7S\ +DN[k\x0f\xb7\xf2\xd14\x02\xd1\xcd'b \x7f\ +\x05\x8e\x01'\x8c1\xb5\xf8\x99\xd9\xd9\xd9\xc10\x0c?\ +\x04v\xd5m\x87\xaa\xfaP\xb3H$\x02\xa8T*\xdd\ +\x99L\xe6\x02\xeb7_\x00\xde\x08\x82\xe0d\xa9TZ\ +lq!\xac\xb5\xdb\x80\x93\xc0#u\xdbK\xa9T\xaa\ +'\x9f\xcf\xff\x14\xd7\xcf$\x19q\x1cgTU;\x00\ +D\xe4\x9c\xaa\xee3\xc6\xfc\xde\xca\xf1\x1aEz\x8fz\ +\x9ew@D^\x04r@g\x18\x86\xa3\xc0\xa1\xb8~\ +C\x04\xa2T\xbb\xc4\xeao_\xced2\xd9\xfe\xfe\xfe\ ++q=\xcf\xf3\xeeO\xa5R\xa3\xaa\xba\xa2\xaa\xc7\x93\ +B\xac\xaa)\xdf\xf7\x17\x80\x1b\x81\x95 \x08v\x96J\ +\xa5\xcb\xf5:I\x9fp\x88\xf5T;\x9b\xe4\xdcZ{\ +DD\xa6U\xd5\x05J\x222\xe9y\xdeY\xdf\xf7\xf7\ +l\xb8\x9dH\x08\xfc\x19\xb1i\xc7q\x86\xe2\xb6\x1a\x00\ +\xa8\xea\xbe:\xf6\x97\x04\x80\x18c\xdeq\x1c\xe7\x16V\ +C:\x0d\xfc-\x22\x83\xaa\xea[k\x9f\x1b\x1f\x1f\xaf\ +\xaf\x15+Ml'\x03\x10\x91l\x1d\x9b\x8d\xcb\xd7\xa8\ +\xaf\xafo\xc1\x18s\xca\x18\xf3\x80\xe38\xdbU\xf5a\ +\x11\xf9\x04\x18\xc9f\xb3_\xfa\xbe\x7f\xcf\x9a\xc9\xbac\ +\xbb\x1b\xfc\xc57\xac\xb5\x8b@g\xc4\x86\x22rte\ +ee\xacX,\xfe\xdc\x0cL=\x95\xcb\xe5LWW\ +\xd7\xa0\xaa\x0e\x01=\xc0]\xc0\xf5\x91x\xc9\x18\xd3\xd5\ +6\x00\x119\x17\x86\xe1k\x22r\x80\xd5\xba\xff\xb9\x88\ +L\x16\x0a\x85\xef\xda\x01377w\xc3\xf2\xf2\xf2E\ +`{3\x00I\x9f\xf0\xea\xdaBU\x97]\xd7\xfd\xcc\ +\x18\xf3\x040\x02<\xaf\xaa\xdfZk\xbf\xb1\xd6\x1e\xf7\ +}\xbf\xa4\xaaM\xabioo\xefo\xc0l\xddVC\ +\x1dH\xfa\x84\x97\x92\x8c\x19cf\xd3\xe9t\x09\x98\x04\ +\xf6\x02GU\xf5k\xdf\xf7\xafXk\xdf\x9e\x99\x99\xb9\ +\xa3\x09\x8e\xfa\x8a\xf9\xfd\xa6\x00\x803k\x0b\x11\xd9\xf0\ +D\xb9\x5cn\xde\x183\xac\xaaw\x03_D\xdb7\x03\ +y\xc7q\xfe\x88\x1b*\x97\xcb\x19V\x0bQ\x83\xed\xa6\ +\x00Tu\x92(uT\xd5\x9d\x99\x99\x19\x88\xeb\xb8\xae\ +\xfb\x951\xe6>\x11\xd9\xab\xaaw\x16\x0a\x85{\x93Z\ +oGG\xc7\xd3\xc0\xad\x11\x1b\x04A\xd0P\xac\x12{\ +\x81\xb5\xf6\x14p0bC\xe0\x830\x0c_j7\x13\ +\xac\xb5\xd7\x01\xcf\x02\xaf\x10\x155U}\xdfu\xdd'\ +\xdb\x02P\xadVw\x04Ap\x81\xf5t\x84\xd5\xfe\xfe\ +z\xadV{s``\xe0\xaf&\x8e\xb7\xa9\xeaS\x22\ +r\x18\xb8\xa9N\xb4\x08\xf4\x18c\xae\xc6\xcf4m\xc7\ +\x9e\xe7=(\x22\xa7i|\xa6\x1fDd$\x9f\xcf\x7f\ +,\x22\x0a0>>\x9e\xcef\xb3\x87\x80WYO\xb9\ +5\x0aEd\xb8P(|\x9a\xe4\xa7\xe5D\x14\x0d\x13\ +o%\x80@D\xd4?(\xa9\x18\x95\ +\x07B\xe0\xa1\x9a\x0d6\xf5\xa9\xa25D\xc0\xb0\x0fD\ +\x1aKh,!\xd1\xb1\x06CS5(Q\xac\xad\xbb\ +\xddsf\xd8\xad\xabM6\xbb`h\x84 \x7f\xbaK\ +wgw\xfe\x9c\x9f\x0f\xdc\xc1\xe9tt*<\xc2\xef\ +\xe5\xde\xf3=\xbf\xf3\xfd}\xee\xb9\xe7\x9c{\xe1\xddx\ +\xa7\x87\x5cJ\x92s\xee\x0b\xc0\xbd\xaa\x1a\xaa\xeao\x93\ +$\xb9SD|s\xce\xec\xecl\xcf\xb9s\xe7\x0e\x18\ +c\xb6\x02\xaf\xaa\xea\xa7\x92$y\xf9m\x03Xk/\ +W\xd5Y\x11\x19\x9c\x9f\x9f_\xec\xeb\xeb\xbb\xcb{\xbf\ +\xcb\x18s[\x1c\xc7\xe3\x00\xe3\xe3\xe3;\xc30\xbc_\ +D\xc6\xa2(z\xa8\x15\xeem\x01LOO\xff\x08\xf8\ +R\x10\x04\x0fo\xde\xbc\xf9\xfb\x22\xa2\xd6\xda\xf5\xaa\xfa\ +G\x11\x19\x05\xae\x16\x91\xdb\x17\x17\x17\xf3###+\ +)t\x1f\xb0\x1b\xb8\x1a8\xe3\xbd\x1f\xcb\xe5r\xcf\xbf\ +%\x80\x99\x99\x99eU\xed\x06\x10\x91\xed\xfd\xfd\xfdO\ +\xa5E.\x07\xfe\x01\xac\xc6q\xfc\x91\xc6S;\xe7n\ +P\xd5c\xc0{\x9al\x16\x8c1;\xa2(\xfaK\xab\ +\xbf\xe9\x04\xe0\xbd\x7f1\xbd\xd5z\xbd~\xaeI\xbfF\ +DB\xe0\xb2\xe9\xe9\xe9\xf5\x00\xd3\xd3\xd3W\xa8\xea/\ +Z\x8a\x03\xac\xf3\xde?^,\x16?\xf0V\x00v\x88\ +\xc8\xfd\xde\xfb\x9b\x07\x06\x06\x1c@\xa1P\xc8\x88\xc81\ +\x11\xb9\xc9{\xbf\xa7Z\xad\x1e\x01\xa8T*\xa3\xc0\x95\ +\xe9\xd0\xb3\xaaz7\xf0\x87\xb4}\xa5\xf7\xfe\xee\xff\x1b\ +\xa0\x5c._V.\x97\xbfU\xa9T~\xda\xd0\xfa\xfa\ +\xfa\x8e\x18c\x0aQ\x14=\x95\xcb\xe5\x0euuu\xdd\ +\x94v}=\xbdVTu{6\x9b\xfd\xee\xfc\xfc\xfc\ +'E\xe4g\xa9\xfe\x8d\x93'O\xbe\xaf\xd9\xbf\xe3\x1a\ +\x98\x9d\x9d\xedYXXx\x0d0\xaazZD6\x02\ +W\x00\xff\x02\x9e\xf5\xde\x8f\xad]\xbb\xf6\xd8\xf2\xf2\xf2\ +\x06\x11\x99\x03\x10\x91'\xe28\xde\xd9\xf0\x98\x98\x98x\ +\x7f\x10\x04\xf3@\x8f\xaa~-\x9b\xcd>\xfa?g\xa0\ +P(d\xac\xb5\xf79\xe7\xce.,,\x9c\x05*\x00\ +\xde\xfb\xdf\x03\xe5 \x08nH\x92\xe4\x83I\x92l\xcd\ +\xe5r?\xef\xef\xef?o\x8c\xd9\xd6dq\x06`f\ +f&\x03\x90\xcf\xe7_\x11\x91\xc3)\xdc\xf6\xe6Z\x17\ +\x01LNN\xee\xe9\xed\xed=\x0f\xec\x04\xeeH\x92\xa4\ +GD\x0e\x00\x84a8,\x22g\x87\x86\x86N6\xe5\ +\xe7\xac\xb5\xaa\xaa\x87\x1a\x9a\xaa\xee\xb1\xd6j\xb9\x5c~\ +\xb4\xc9\xfa\xc9\xf4z\xfd\x7f\x05p\xce=(\x22?\x0c\ +\x82\xe0{I\x92\x5c\x13\xc7\xf1\xd1\xb4\xf0=\x22\xa2\xaa\ +\x9a\xac\xac\xac|\xb5yL6\x9b=\x05\xfc\xae\xcdD\ +\xae\xd4\xeb\xf5\xbd\x8dF\xadVk@_\xd5\x16@U\ +\x8d\xaa\xde\x01<\x1fE\xd1\xfe\xe6\xa4\xc1\xc1\xc1\x97\x80\ +\x17\x80@D^k\xadd\x8c\xd9\xdf\xaa\x01c\xf9|\ +\xfe\xd9F#\x9f\xcf\xbf\x02\xbc\xce\x1b\xeb\xe0\xcd\xb5\xd7\ +\xfa\x0a\x14\xd8x\xea\xd4\xa9\x8f\xb7\xbay\xef\x0d@&\ +\x93y\xa0\xb5/\x8a\xa2?\xf1\x9f\xed\x06p\xbeR\xa9\ +\xdc\xd7\x06\xea\xfcE\xf0\x8d\x1b\x11\xf1\xaa\xfac 0\ +\xc68\xe7\xdcX\xa1P\xc8\x00LMMm0\xc6\xac\ +Q\xd5\x97\x81/\xabj\xd8\xc6\xfcN`5\xf5:8\ +<<\xfcj\x9b\x9c\x10X\x14\x11\xbd\x08\x00 \x9b\xcd\ +\xee\x16\x91Q\x11\xa9\xa9\xea7{{{\x97&''\ +'\xaa\xd5\xea/U\xf5\xaf\x22\xf2\x1d`M\xb1X|\ +\xa4\xd59I\x923\xc0h\xda<\xd8\xda?55\xb5\ +\x16X\xcf\x1b\xc7\xf7\x9b\xd1\xf6\x1cP\xd5\xd09\xb7\x1f\ +\xb8ED>\xd4\xf4\xce\xaa@\x90\x82\xff]D\x16\x80\ +\x0c\xb0ND\x1e\x8b\xa2h\x9fs\xee\x968\x8e\x1fk\ +\xf5t\xce]\xab\xaa\x7f\x03\x0e'I\xd28\xb0h7\ +\x95\x88H\x0d\xd8\x0b\xecM?:\xaf\x03GT\xf5\xa3\ +\xc0\x87Ed\xbd\x88|\x0c\xa8\xa7\xc05`\x04\xd8\xd7\ +\xae8\x80\xf7~\xab\x88 \x22O6\xebm\x01\x9a#\ +\x93\xc9\x5c\xbb\xba\xbaZ\xcff\xb3774k\xed\xe3\ +\xaa\xfa9\xe0\x81$I\xeeRU\xd3\xe9\x1f\xc0\x18\xb3\ +KU\xcb]]]\xbf\xbe@\xef\x04\xb0\xba\xbaz\xa3\ +\x88,7kq\x1c\x7f\x11xIDFK\xa5\xd2W\ +\x9cs\x87\x00\x9cs\xb7Zk\xd5Z{\xc1\x1a\xb0\xd6\ +\x8e\xa8\xeav\xe0\xd0\xc0\xc0\xc0\x05\xdb\xb8#\x801f\ +\xa3\xaa\xd6\x9b\xb5\xd3\xa7O\xaf\x0b\xc3\xf0^\xc0\xd5j\ +\xb5\x03\xde\xfb\x07\x01\xe6\xe6\xe6\x0e\x03\xcf\x00\xbb\x8a\xc5\ +b\x02P,\x16\xaf\x02\x1e\x01^\x04\xf6\xb5\xfaw|\ +\x05@(\x22=\xcd\x82\x88\x9c\x09\xc3pC\x10\x04\xb5\ +j\xb5\xfa\x1b\xef\xfd\xd3\xce\xb9O\xc4q<^*\x95\ +>_\xaf\xd7\xff\xec\xbd\x1f\xb7\xd6>\xed\xbd\x8f\xd2a\ +\x9fn\xf7\x8f\xd8q\x06T\xf5\x19 \xb4\xd6>t\xe2\ +\xc4\x89\xeb\x8e\x1f?>(\x22\xefMA\xc2 \x08\x9e\ +\x00\xd6\x00'\xac\xb5\x07\x87\x86\x86\x9e\xcbd2\xd7\x03\ +\xf7\x00\xcb\xc0\xc3a\x18^\x97$\xc9D;\xff\x8e\x9f\ +\xe3B\xa1\x90\xd9\xb4i\xd3\x12\xe9l\xa9\xea?\xbb\xbb\ +\xbb\x7f \x22\xbb\x81\xa3\xfd\xfd\xfd\xdf.\x16\x8b7z\ +\xef\x8f\x02\xdd\x222W\xadVwl\xd9\xb2e\xb6\x93\ +\xf7%\x01\x00\x94J\xa5\xcf\xd6\xeb\xf5\x9f\xa4\xf9\xbf\x8a\ +\xe3xw\xbaU/\x00\xed\xed\xed=\x00|\xc6\x18S\ +^ZZ\x1a\xde\xb6m\xdb\x0b\x97\xe2\xffn\xbc\xb3\xe3\ +\xdf&\xdfW\x19\xf3\xed\xea\x9b\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01\x9a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x17ID\ +ATX\x85\xed\x961N\xc40\x10E\xdf$K\xc7\ +=(\xb6!\xc1\xa6\x81\x82\x0aq\x07N\x01\xf7\xe0:\ +hEC\x9d\xd8\xd1\x8a\x12q\x0cJ$\x0fm@6\ +,$\xf1\xba\xd8_%\x9a\x91\xfe\xc8\xdfy\x19(E\ +\xde{\xdd\x87\xef\xea\xa7\xa2\xf7\xbe\x05\xaeT\xf5\xd9Z\ +\xbb]b\x80\xea\x17\xf3\x0ex\x10\x91\xae\xef\xfb\xd3%\ +\x06\x90\x91a\x96\x08\x8c12~_\xa5\x8a\xce\xb9F\ +D:\xe0\x08\xf8\xa8\xaa\xca\xb6m\xfb2\xf7@\xc9\x08\ +\xac\xb5\xdb\x10\xc2\xb9\xaa\xde/e\xfeE\xfb\xfa\x0a\xa2\ +'0\x1ef\x89\xe7\xa8\x8a\xe4\xc0\xae\x9a\xc2\x8b\xe4%\ +\xfc\xa3\xf9\xbfyQ.\x07v\xd5T^L\x8e`6\ +^\x1c8P\x1c\x07r\xec\x02\x90\x8e \xcb.\x00\xa5\ +r \xd7.\x00\x89\x08\xb2\xef\x02p\xe0@\x81\x1c\x98\ +C\xc30\xdc\x00\xd7\xaa\xba1\xc6<\xc5z&\xff\x8c\ +R\xf2\xde_\xaa\xea\xa3\xaa\xde\x01\x1b\xe7\xdcE\xac\xaf\ +L\x0e\xcc!\xe7\xdc\x89\x88x\xe0\x18x\xaf\xeb\xfa\xac\ +i\x9a\xb7\xef}\x8bE`\xad}\x05\xd6\xc0m\x08a\ +\x1d3/B\x9f]\xa2\xfa1&a\x17B\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x05e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x04\xe2ID\ +ATX\x85\xed\x96MlUE\x14\xc7\x7f\xe7\xf6\xde\ +\x96\x16H\x09\x1f\xda\x96J\x14\xc1\xb0\x90\x94\xbe7\xb7\ +\xd6ecb\x08 \xe0B\x17H\xa2\x180\xc4\x18\xbf\ +\x10\xa3\x91\x041\x91\x08\x0a\xc6(a\xc1w4.L\ +\x14\xf9\x8a\x0b5]\xfa\xe0\xcdm\x8bDY\xa0\x0d\x91\ +B\x09\x08\x88\x05\xec+\xef\xceq\xf1\xee\xd3\xf2\xfa\xda\ +\x22\xba\x93\xff\xe6\xde\xcc\xcc\x99\xf3\x9fs\xce\xcc\xff\xc0\ +m\xfc\xdf!\xffd\xb1\xb5v\x1a\xb0\x08\x98\x0f\xdc\x0d\ +4&S=\xc0IU=\xa8\xaa\xfbZZZN\xfd\ +\xa7\x042\x99Lc\x10\x04\xebT\xf5I\xa0b\xd0\xd4\ +\xaf\xc9w\xf2\xa0\xb1\x18\xd8\xed\xfb\xfe\xda9s\xe6\x9c\ +\xfe\xd7\x04\xac\xb5\x8b\x81\x8f\x81q\xc0y`\x87\xaa~\ ++\x22M@\x831f\xd5\x89\x13'\xaa\xfa\xfa\xfa\x1e\ +W\xd5\xfbUu\x190\x05\xe8S\xd5\xa5a\x18\xee\x1f\ +i\x7fo\x14\xe7/\x00\x9f\x035\x22\xb2\xb1\xaa\xaaj\ +\xb61\xe6u\xa0\x12x\x0fx\x19`\xe6\xcc\x99\xb98\ +\x8e\x97\xa8\xeaR\x11Y\x0f\xbc\x03\x8c\x15\x91\xbd\xd6\xda\ +\xe7o\x89@r\xf2\xcd\xc05\x11yVU\x1f\xcc\xe5\ +r\x17\x01D$U\xc6\xa4\x03hP\xd5\x8d\x9e\xe7m\ +\xf6<\xefQ\xe0\x1a\xf0~6\x9b]8\x9c\x9f\xb2)\ +\xc8d2\x8d\xbe\xef\x1fON\xbeRU\xdf\x02\x0e\x1a\ +cV\x1c9r\xa4\x0ex\xc6\xf3\xbc\xe9\xaa\x9a\xf3<\ +/R\xd5\x9c\xaa6\x8a\xc8s@\x1d\xb0\xc2\x18\xb3=\ +\x8a\xa2GT\xf5K\xe0\xaa\xe7y\xb3R\xa9\xd4\x99\x9b\ +\x22\x10E\xd1\x0eU}\x1a\xd8\x00<\x00\xfc\x0c(\x85\ +\xea\xafW\xd5T\x18\x86\x9dI\xa441\xeb2\xc64\ +[k\xebE\xa4UU'\x0d\x0c\x0c|QYY\xb9\ +\x1ax\x0d\xd8n\x8cYQ\xeakH\x0a\xac\xb5\xd3\x92\ +j?\x17\x04\xc1f\xe0ac\xccr`\x01P\x0f \ +\x22\xe5\xae\xd9]\x00\xc6\x98^U\xcd\x00\xdb*++\ +\xcfR(\xdc\xf3\xc0\xb2L&\xd3XjT\xae\x06\x16\ +Q\xb8j;\x9b\x9a\x9a\xce\x19c\xae'a\xafK\xe6\ +/UTT\x8c\xcbf\xb3\xd3\xa3(J\x03\x11\xf0\x13\ +p\xa5\xb3\xb3sB\x91\x04\xd0\x0b\x04\xc0+\x22\xb2\x0b\ +\xa8\x08\x82`Q\xa93\xbft@U\xe7\x89\x08\x9e\xe7\ +}\x13E\xd1\x5c\xe7\x5c\x1a\xf0=\xcf\x9b\xd3\xdf\xdf\x7f\ +\xca\xf7\xfd\xb1\xc0/\x22\x82\xaab\x8c\xf9+\x8d\xd6\xda\ +S\xd6\xdaJ\xe0\xb4\x88|\xe4\x9c\x1b\x0b\xa4\xe28\xfe\ +\xb1\xa2\xa2\x02U\x9d\x07l\x19\x91\x80\x88\xcc\x00\xd49\ +\xd7\x0c\xbc+\x22\x00{R\xa9\xd4Q\x80l6;\xa5\ +L\xd4\x8a\xb8F\xe1u\xbcCU?\x08\xc3p\x0f@\ +{{\xfb\x98\xf1\xe3\xc7\xef\x02\xee-5(\x97\x82:\ +\xe0\x02I\xbe\x13\xfc1\xe8\xbff\x04\x02\x83\xd7U\x17\ +\x7f\xda\xda\xda\xfa\x81\x8b\xc0\xd4R\x83!\x11H \xc6\ +\x98U\xc0*\x00k\xed\xcaA\xd5~\xb4$\xec\xc5q\ +\x9cs\xcd---]\xc9\xf8\xd6As\xefQ\xb8q\ +\xae\xd4Q\xb9\x08\x9c\x01&\xb6\xb7\xb7\x8f\x19\xeddC\ +X\x8b\x94]'\x22\xe7\x80\x89\xc9\xde7\xa0\x5c\x11v\ +\x8b\xc8}\xb5\xb5\xb5\x8fe\xb3\xd9%@\x87\x88\x5cU\ +\xd5N\x0a!\x1c6\x05\xaaz\xed\xf0\xe1\xc3\x93\x82 \ +h\x8c\xe3\xf84\xb0\x06\xe8\xc8\xe7\xf3y\xdf\xf7\x01\xba\ +G%\x00\x1c\x02\xe6\xc6q<;\x11\x9c\xb9\xaa\xdak\ +\x8ci\x00\xe8\xec\xec\x9c`\xad=\x09\x5c\x07.\x8b\x88\ +q\xce]\xf2}\xdf\x01\xc7\x80Z\xe7\x1c\x22\xd2\x90\x5c\ +G\xa2(\xda\xa0\xaa\xc5\xbdo\xc0\x90\x14\xa8\xea> \ +\x16\x91\xa7(\xe4\xee:Po\xad\xad\x07hnn\xfe\ +\x8d\x822\xce\x00\xd2\xe9t:\x0a\xc3\xb0[U\xaf\x02\ +\xb5\xc96\xbd\xc6\x98^kmp\xec\xd8\xb1;\x13\x85\ +\xcc\xe7\xf3\xf9!\xca8\x84@\xd2L\xec\xa6 \xa9S\ +\x06\x06\x06\xea\x80\x15\x22\xd2Z$\x01\x0cy\x09\xe38\ +.\xber\xbd@\xc6Z\xbbMU\xbf\xca\xe5r\xab\x81\ +)\xaa\xba\xb3\xb5\xb5\xb5\xa7\xd4\xae\xac\x16tuuM\ +\xcd\xe7\xf3\xc7)H\xea\xe2t:}\xc0Z\xbb\x1c\xd8\ +\x06\x9c\x15\x91\x0f\x9ds=\x9e\xe7\x8dq\xce\xa5E\xa4\ +JDzTuKr\xf2m\xc0\x02U]+\x22[\ +\x81+\xc0\xacbJF%\x00\x90\xcdf\x17\x8a\xc8^\ +\x0ar\xbcDU\xbf\xa3P\xc5\x81\xaa\xae\x0f\xc3\xf0\x0d\ +\xf8\xfb\x1a\xaa\xea\x9a0\x0c\xdf\xb6\xd6\x06\x22\xf2\xb5s\ +\xeeS\x11\xd9DAQ\x17\xa7\xd3\xe9\x03\xe5\xfc\x0c\xdb\ +\x0f$\x9d\xccK@M\x22\xa9\xabD\xe4\xd5\x84\xc4p\ +\xfd\x00\xd5\xd5\xd5\x93D\xc4&'\xaf\x01^\x1c\xce\xf9\ +\x88\x11(\x89\xc4'\xc0x\xe0\xbc\x88\xec\x12\x91\x1f.\ +_\xbe\xfcY[[[\xbf\xb5v\x93s\xae\xd79\xf7\ +}\x10\x04\x0f%2>\x19\xf8]D\x9eH\xa7\xd3\x07\ +G\xda\xff\xa6\x9a\xd2\x8e\x8e\x8e\x06\xe7\xdc:`\x197\ +6\xa5\x17\x92\xef\xa4AcyU\xdd)\x22o\x96\xcb\ +\xf9-\x11(\x22\xe9\x8e\x17\x01\xf3U\xf5\x1enl\xcb\ +\xbb\x81C\xf9|~\x7f\xb9j\xbf\x8d\xdb\x18\x0e\x7f\x02\ +\x14\xcc-q;\xe4c\x1d\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x04g\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\xe4ID\ +ATX\x85\xed\x95_h\x1cU\x14\xc6\x7fgf7\ +\xd9\xb4MJ*b\xb1B\xb3\x81B\xe96m\xb33\ +\xdb\x86\x98\x16\x1a\x04E\x1f\x14\x0b\xa1\x94B\xa5P\xf1\ +\x0f\xf4\xad\x82\x15Q*bQ\x11\xaa\x14AK\x1f\x04\ +-\x0d\x8a/\x16\x14\x91\x14Y\x97\xc0\xce\xcc\xa6)i\ +%\x11\xb3\x94\x16C\xf5\xa9\x06\xdc\xcd\xba\xe7\xf8\xd0T\ +\x965\xc9&\xa9\xc5\x07\xf3\xc1}\xb9|\xf7\xbb\xbf9\ +\xf7\x9e;\xb0\xa2\xff\xbb\xe4^\x86\x0f\x0e\x0e\xba\x9d\x9d\ +\x9d\x1f\x02\xfb\x81\x09\xe0\x19\xdf\xf7/\xd7z\x9c{\x09\ +\x90L&\x0f\x01G\x80V \x0d\x9c\xa9\xf7\xc4\xeef\ +\x033sDD\x01\x86\x87\x87\x1fp]\xb7KD\xb6\ +\x03]\xb3#U\xb7\xa4\xa3>c\xd9G\x10\x86a\x0f\ +\xf0\x18\xf0\xb0\x99u\x01mf6&\x227\x00\x0f\xb8\ +\x0eT\x80\xdd5\xc0\xefd2\x99\x97js\x96]\x01\ +3{\x17\xd8\xe28\xce\x8b\xaa\x1a\xb9\xae\xbbNU\x0f\ +\x02U\xe0\x04\xb0\x198\x05\x9c\x04\xf6\x9b\xd91\xdf\xf7\ +\xbf\xa8\xcfY\xd6\x1d\xc8\xe7\xf3\xfb\x80\x0d\xc0\xa5j\xb5\ +\xea\x8b\xc8\xab\xaa\xba\xd3u\xddW|\xdf?*\x22\x1d\ +\xc0\xfb\xaa\xfa\xb8\x99\xdd\x04.f2\x99\xcfE\xc4\xea\ +\xb3\x96\x5c\x81\xa1\xa1\xa1\x98\x88\xbcaf/\x03\x05\x11\ +\xc9\x03[}\xdf\xbf\x06\x10\x86\xe1\xa3fv\xc6q\x9c\ +\xa7|\xdf\xcf\x07Apl\xd63\xa7\x16\x0d\x10\x04A\ +\xdc\xcc\x9e\x04\xb6\x8a\xc8\xb4\xe7y\xe7E\xc4\x82 \xf8\ +\xd4\xcc^\x07\x0e\xe7\xf3\xf9G\xcc\xec\x1c\xb0/\x9dN\ +\x7f?\xbb\xb4\x17\xf8d\xd9\x00###\x1b*\x95\xca\ +\x11\x11\xe9t]\xf7\xebj\xb5\xfa\x1cp\xe0N9\xe3\ +\xf1\xf8k\x95Je<\x9f\xcf\x7f+\x22\xa7E\xe4\x80\ +\xe7yC\x00Q\x14mT\xd5\x0d\xaaze\xbe\xfc9\ +\xbb\xc0\xcc$\x8a\xa2]\xc0\x1eU\xdd,\x22\x13\xc0z\ +`\x0f0\xe9\xfb\xfe\xd3\xb5\xfe0\x0c\x8f\x9b\xd9\xb3\xaa\ +\x9au\x1c'\xa7\xaa#\xabW\xaf\x1e-\x95JO\x98\ +\xd9Y\xcf\xf3Z\xef\xb4kC\x80B\xa1\xd0\xa1\xaa'\ +\x80mf\xb6\x05\xb8\x09\x8c\x88\xc8\x08\x10\xb5\xb5\xb5]\ +\xd8\xb4iS\xb9\x1e\xb8P(\xf4\x9b\xd9.3\xdb\x01\ +t\x03I\xe0g\x11\xb9\xaa\xaaog2\x99\x1f\xe6\x02\ +\xf8\xc7\x11tww\x17\x83 \xb8\xc9\xed\x16\xdb\x91N\ +\xa7\xe7-\xdf\xdf_q\xfb8\xbe\x9b\x1d\x00\xe4r\xb9\ +uMMM\x81\x99%V\xadZ5\xef%\x9c\xb3\x0d\ +=\xcf;&\x22gU\xf5\xb3\xd1\xd1\xd1\xf6F\x00\xf5\ +23\xa7\xa9\xa9\xe9\x033\x9bjii\xd9\x97J\xa5\ +f\x96\x04 \x22\x96N\xa7_\x00\xae\x94\xcb\xe5\x0bc\ +cck\x96\xb0\xb9\x84ax\x1a\xe8r]\xf7h*\ +\x95\x9a^\xc8?\xefC4{i\x0e\x01\xbf\x95J\xa5\ +/'&&\x9a\x17\x03\x10E\xd1I\xa0\x1f\xf8ff\ +ff\xaa\x91\x7f\xc1\x97\xd0\xf7\xfd\xca\xf4\xf4\xf4\x80\x99\ +\xb5\xdc\xbau\xeb\xf9Faa\x18\xee6\xb3\x83\xb1X\ +\xac\x1fh\xef\xe9\xe9\xb9~W\x00\x00{\xf7\xee-\x01\ +\x97\xcc\xac\xb5\x91WU\xd7\x00\xd7\xc7\xc7\xc7\xa7D\xe4\ +\xcfF\xfeE\x01\x00\x98Y\xa7\x88L6\x0cs\x9c\x22\ +\x90L&\x93\xdb\x80\xcb\x0d\xec\x8b\x07\x10\x91\x0e3+\ +\xd6\xcee\xb3\xd9\xd6(\x8a\xee\xaf\x9d+\x97\xcbE\xe0\ +>\x11\xe9\xafV\xabs\xf6\xfd\x92\x01\xccL\x80\x8d\xb1\ +Xl\x12`xx\xf8\xa10\x0c\xdfK$\x127T\ +\xf5Z\x18\x86\xe7\xa2(\xda\x0e\xd0\xdb\xdb\xfb\x070\x05\ +l.\x16\x8b\xffN\x05\xc20\x5c\x0f\xc4Uum\x10\ +\x04\x1f\xc7b\xb1\x1f\xcd\xac\x1d\xd8\x19\x8f\xc77\x9a\xd9\ +\xa4\xaa^\x0c\x82\xe0\xab \x08\xfa\x80_\x80\xab\x03\x03\ +\x03\xd5\xc5\x004\xfc\x19\xa9j\xd2q\x9c\x98\xaaF\x22\ +2\x08\xec\xf0<\xef\xa7\x1a\xcb\xf1l6\xfbV\x22\x91\ +8\x0c\x9c\x07\x1ed\x81\xbf\xdf\x92\x01\x1c\xc7i\x17\x91\ +7E\xe4T:\x9d\xfeu.O__\xdf\xef\xc0\xa9\ +\x5c.\xf7Qss\xf3a \xbeX\x80\x15\xad\xe8?\ +\xd7_Ca\xa8K\xb5@\xf56\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x01\xef\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +\xa9IDATX\x09\xed\x94;K\xc60\x14\x86{\ +\x11\xc5\xa5\x97]\xf1\x0f\x88\xa3\xb3\xf8#D\x14\x04\x17\ +GA\x91ov\x14D'\x7f\x80\x8b\xb8\xb9\x0b\xe2\xe4\ +\xa6\xb8|\x8b\x9b\xa3\x93\xbdP\xa8\x14[\xeb\x1b\xf8\x02\ +\xa14m\xae\x83`!\xe4\xe4$\xcd\xfb\xe44o\x1d\ +\xe7\xff\xe1T \xcf\xf3u\xb4m\xce\xb4\xb1\xb4\xc7\xdb\ +\xa9m\xdb\x95\xa6in\x93$\xb9A\x0by\xebt\xf3\ +\x5c\x00f\xe3\x1d\xc4\xd34M7\x98\x9c\xb1P\x04\x80\ +\x88-\xa3=\xa2\x12\xe7\xa8\xcc\xbc1ul$\x0a\xe0\ +@\xd8\xc5\xfa\x93,\xcb\x9e\x8b\xa2X5\x05!\x0c@\ +\x05\x01\xb2V\xd7\xf5\x0b>\xc9\xd1\x0c\x8aN)\xf5\xd2\ +\x00D\x05\xc2\x0bh\x97\xa8\xc6CY\x96KJ\xca\xb3\ +\x97\x94\x00\xa8 6\xab\xaa\x9a\xea\xd8U\x0b\x80\x80\ +\x00\x22\xd2\xb1\xab6\x00\xad\x06z%\xbb\x9a\x04 ,\ +\xd2v5\x0d mW\xe3\x00\xf4\x93\xe0nP\xbb\x1e\ +#&\xff\x90\xde\xc7\x1a\x00Q\x830\xb1\xeb\xc5\x90]\ +\xad\x02\xd0#\x03\x82\xd8u\x8b\x8e\xd9~\x8e\x1dX\x8a\ +?|\xdf\xdf\x0f\xc3\xf0\xbeo\x7f\xab\x00\xae\xeb\xdeA\ +\xfc \x08\x82\xcf>q\x92\xb3\x05P@\xfc0\x8e\xe3\ +k\x9e0\xcd\xdb\x00x\xf2q\xe0\x02\xde\xfbm3\xbb\ +\x05lv\xbb\xdd7\x07*\xf0\x0b~\x078+\x22\xaf\ +\xcb\xd44&P\x05\xde\x98@Ux#\x02u\xe0\xb5\ +\x05\xea\xc2k\x094\x01\xaf,\xd0\x14\xbc\x92@\x93\xf0\ +\x85\x05\x9a\x86\x03\xac7\x01W\xd5\xa3\xc0\x97}%c\ +\x119\x04\x90\xa6\xe9y\xe7\xdc\x93|\xa3\x888(9\ +\x03E#\x17\x91\xaf\x22\xe2\xa6\xd3\xe9q\xe0\x03\xf0`\ +\x06\x07H\x92\xe4i\x1c\xc7G\x80\xf7\xc0\xfd(\x8a\x8e\ +\xcd\xda\x0a\x05\x16\x99\xf6^\xaf\xf7\x11\xb8\x0c\x5c\xf4\xde\ +\x9f\xcb\xb7\x8dF\xa3\xeb@;\x8a\xa2k\x9dN\xe7\xf3\ +\xec\xbc\xfb\x07x\x07\xf8Ve\xcdU\xf5.\xb09\x99\ +LN\xf5\xfb\xfdOY\x96\x9d\x0e!(\xb0%\x22/\ +\xf2}\xe7\xce\x80\x99%U7\x5c\x1c\xc7W\x81\xef\xed\ +v\xfb\xf6`0X\x0b!\xdc\x03\x9e\xed\x87\x03\xb8\xbf\ +}x\x98Y\xe2\x9c\xbb\xe4\x9c\xbbif\xef\x16\x81\xe7\ +\xf2\xd6\xcc^\x01/\x813\xc0I\x11\xd9+\xac\xf2\xde\ +o\xab\xea^\x96e7*\x82\x7fGUwU\xd5T\ +uk^\x9f?\x96 \xbf\xe1j\x8c<\x9fG\xfc\xbc\ +\x1d\x9f\x17\x0a\xfc\x8f\x87L\x99\xb4\x96\x09\x07h-\x13\ +\x0e\xd02\xb3\xb5\x10\xc2\xc62\xe0\x00\xeb\x22\xf2\xb8\xe9\ +\x8b\xaa\xea\x15`7wl\xe4\xde\x0d\xa5R\xf7\xc7d\ +\x95\xb2\xf9\x01\x1bp\x1dF\xbfX\x99\x12\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01\xba\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x017ID\ +ATX\x85\xed\x941N\xc3@\x10E\xff\xb7!-\ +\x15\x1d\x08\x1a.\xb0\xb6LA\xa8\xa0\xe1\x04\x1c\x80(\ +\x87\x8aB\x0bW@\xd0!\x81@\xbb\xb2\x0f@ER\ +R\xd1Z\xf6\x0eM\x1a\x92\xc8\xbb\x1b\x93P\xc4\xaf\x5c\ +\xff\x99\xf9\x1a\xcd7\xd0\xb1\xed\xd0%(\x8a\xe2\xb8\xaa\ +\xaa1\xc9s\x00=\xcf\xbe%\xc9g\x92\x03\xa5\xd4g\ +\x930ru\xaa\xeb\xfa\x96\xe4E\xc0p\x00\xe8\x89\xc8\ +\xa5\x88\x8c]B\xa7\x01\x00Y\xc0\xe0_\x88\xc8ik\ +\x03\x22\xf2\xbe\xaa\x01\x00o\xad\x0d\xc4q|\x03\xe0\x09\ +@\x190\xb8\x04\xf0\x08`\x10P\xb3\xa58c\xa8\xb5\ +\xbe\x229\x02p\x10\xd8{Jr\x98$\xc9C\x93h\ +\xc7\xd5\x85\xe4\xc8Z{\x9de\xd9k\xc8t\xad\xf5\x19\ +\x80;\x00G!u\x0b\x18cd\x9d\xb5>\xff\x81\xb5\ +\xe2c`:[g\x10\xc6\x98>\x80\x89K\xe7s\x03\ +C\x00\xf7\xc6\x98\xc3@\x0f\x93Ym#\xce\x0dXk\ +\x09\x8f\xb4,\xc1\xab\xaeKA\x97\x82\x7fOA\xf0u\ +\xe7y\xbeo\xad\xfd\x00\xb07\xf7\xe9;\x8a\xa2\x13\xa5\ +\xd4WH\xbf\xbf\xbc\x81\x95\x8eu\xe9\x06\xb4\xd6\x9ad\ +\xda\xce\xcf\x02/i\x9a\xf6\xe7\x1f7\x99\x82\xdd\x0d\xce\ +\xea\xe8\xf0\xe7\x07\x15\xaco\xd24%\x17\xb0\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x025\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xb2ID\ +ATX\x85\xed\x95\xbfk\x14A\x14\xc7?o\xfc\xc5\ +Y\x0b\xea\x19\xa2\xb5\xad{\x1e\x5c\xb7\xa0\x8d \x84\x04\ +\x0e[k\xff\x80T\x16\x16\x12\xc5\xd6\xda\xce\x80Wi\ +ks\x9d \xf3\xe6\x0f\x08\x07.\xca\xc5\x04D\xf0\xb6\ +QN\x9dg\xe1\x8a\x1a\x88\xe6f\x17S\xb8\x9fr\xd8\ +\xf9\xbe\xcf\xbey\xbb\x03-\x89\x98\x99SUS\xd5\xaf\ +ur\x5cSB\xad\xc0\x7f-\xf0\xa2\x81\x8c\xc513\ +\xf1\xde_9\x94\xe2{13\x17BXM\xd9[\xeb\ +\x08\xaa\xc2\xd7C\x08jf\x1b)\x19\x92ZXU\x87\ +\x22r\x1b\xb8X-\xbf\x13\x91'1\xc6]\x11\x99\x8a\ +\xc8n\x8cq;\xc6\xb8\xd3\xef\xf7\xdf7&\xa0\xaa'\ +E\xe4\x99\x99-r\xfeS@\x81\x97Y\x96\xdd\xab%\ +\x000\x99LN\xccf\xb3\x9b\xc0:p\xa1Z~\x03\ +<5\xb3m\xe7\xdc[\xe05\xb0S\x96\xe54\xcf\xf3\ +O\xfbe%\x09\xfc\xa0\x9a\x815\xe0\x8e\x99}\xe8\xf5\ +z\x83:y\x07-*\xde\xfb\x1b\xa3\xd1\xe8\xc8\xaf\x22\ +\xde\xfbk)yI\x1dP\xd5W\x80\x89\xc8\xfd\xb2,\ +\x1f\xe5y\xfe%%\xe7\x8f\x02U{O\x8bH\x17\xe8\ +\xc6\x18\xbb\xc0Y\x119\x07\xac\x00\xa7\xaaG\xb7\xcc\xec\ +nQ\x14\x9b\xc3\xe1p\xe1\xab\xf97\x013\x93\x10\xc2\ +:p\x19\xb8\x04,q\xf0\x7f\xc5\xf3\xf9|\xbe2\x18\ +\x0c>&\x0b\xece<\x1e\x1f\xedt:g\x9cs\xcb\ +\x22\xd2\xad\xde~\x19X\xe5\xe7\xf4o\x01\x1b\xc0f\x96\ +e\x9f\x17)\xfeW\x81\xfdP\xd5\x00\x1c7\xb3\x07E\ +Q\x00\xdf\x92\xd4\ +\x00\x92\xc9d\xd2\xc9\xa3~z\xed\xda\xb5\xe9\x00\x10\x86\ +\xe1S\x22\x12#Y\x06 \x13\x04\xc1*\x92\x9br\x1b\ +x\xc5u\xddu$mQ\x06\x0a\xcd\x0c\x0e\x0e.'\ +y\x18\xc0cUUU\xdb\x87r$\x8f\x93\x5c\x90L\ +&\x1d\x92O\x90\x5c&\x22\x8f\x8a\xc8q\x11\xd9\x07\xe0\ +\x12\xc9\xe5Z\xeb\xb7o\xa41\xec\x18\x8e\x04\x11QA\ +\x104\x01x]D\x9e\xf6<\xef#\x00\x08\x82\xe09\ +\x92\xad\xd6\xda.\x00\x97E\xa4\x9e\xe4\xc7\x00\xce[k\ +W.Y\xb2\xe4\x86M\x0a\x8cQ\x81\xeb.I\xab\xb5\ +n\x12\x91\xc7I\xee\xf4}\xbf:\x97\xba*\x22U\x00\ +\xfaI6\x90\xdc\x06\xe0 \x80\xbab\xc4\x81\x22+\x90\ +\x8f\xf6\xf6\xf6\x99\x8e\xe3lQJ\xbdl\xad\x9d_Z\ +Zzv```\x0a\xc9\x97\x94R\xc7\x5c\xd7\xfdb\ +<\xeb\x8dh\xc0\xf7\xfd\xd5$\xcbH^\xb0\xd6\x9e\xd3\ +Zw\xe77Qww\xf7\x84\xbe\xbe\xbe\x19\x00\x1a\xb5\ +\xd6\xdb\x00\xa0\xab\xab\xabl\xd1\xa2EW\xc6\xbb\xa1a\ +\x06Z[[\xe3\xa5\xa5\xa5\xbd\x00J\xf2\xc2\x97\x01\x04\ +$O\x88H[:\x9dnSJeKJJ\xd6\x90\ +,\xcbf\xb3\xbbc\xb1\x98\x0d\xc3p\xaa\x88L\x0e\xc3\ +\xb0\x02@\x05I\x8aH\x89Rj\xd0Z\xdb\xedy\xde\ +\xd9\xa2*\x90J\xa5\x16\x8a\xc8\x1c\x11)\xcd\x85&\x92\ +\xfc[\xfe\xc5\x15\xa5\xd4E\xd7u\xbfK&\x93Ne\ +e\xe5\x9b\xd6\xda\xbd\x8e\xe3LSJ=\x0c \x91\xbb\ +M\xe7\x17l\x22\x8c\xc5b\x15\x85U\x1aw\x0f\x00@\ +\x10\x04\xae\x88\xd4D\x22\x91C\x03\x03\x03\x97#\x91\xc8\ +A\xc7q\xb6&\x12\x89\xb6!\x8e1&\x92\xfb\xa7\xcc\ +\xb5\xd6\xce\x05\xd0\xe7y\xde\x81\xa2*0\x1aZZZ\ +J\xca\xcb\xcb\xd7[k\x7f\xf3<\xaf\xd9\x18s\xceZ\ +\xfb\x88\xe38e\x22\xd2\x06`\x97\xd6z\xfb\x98\x0b\xe5\ +\xa1\xa8c\x08\x00\xa9TjV<\x1e\xdf\x9a\xcdf\x0f\ +\xe5\xc4\xe7\x00X\xe08\xce\xfd\xae\xeb\x9e\x17\x91\xd5\x00\ +\xb6\x1ac>\xcc\xbf\xb6o\xd9@ww\xf7\x04\xdf\xf7\ +\xd7[k\xeb{zz^\xab\xa9\xa9\xf91\x97z(\ +\xf7\x9c\x03\x00\x9e\xe7\x1d\x06\xb0\x19\xc0J\x00'N\x9f\ +>]Y\x8c\x81\x92\xd1\x12\x1d\x1d\x1d\xd3\xc30l\xec\ +\xef\xef\x7f\xd2q\x9c\x8d\x89D\xe2\xab\xfc\xbc\x88x$\ +!\x22\xd7\x85\x5c\xd7m2\xc6\xdcCrE\x18\x86\xa7\ +R\xa9\xd4c\x89D\xc2\x8c\xcb\x80\xef\xfb+In\xc9\ +f\xb3\xb3\x01\x5c\x14\x91e\x9e\xe7\xf5\x8c\xf0\xed\xfc\xdc\ +\xb3b(@RZZZ\x9e\x89\xc7\xe33\x00,\xb5\ +\xd6\x1e\x0b\x82`\xa3\x88X\x92_\xbb\xae\xfb}\xe1\x22\ +#MD\x1b\xa2\xd1\xa8\x0b\xe0\x92R\xaaq\x14q\x90\ +\x9c\x97{\x9d\x9c\x1f\xaf\xab\xab\x1b\x04\xd0\x00\xe0'\x00\ +q\x11y\x07\xc0^\x11\xe94\xc64\x8ei\x00\xc0\xfb\ +\xe9t\xba\x9d\xe4\xfe\xfcc\x95\x8f\xdc\xd014\x8e\x95\ +\x17\xe6\xb5\xd6\x7f\x88\xc8:\x00\x10\x917\x1c\xc7\x99M\ +\xb2\x03\xc0\x8e1\x0dh\xadwi\xad\xe7\xb9\xae\xbba\ +$q\x00\x88F\xa3\xb3D\xe4K\x00\x0bH\xc6G\xe2\ +(\xa5\x1c\x00p\x1c\xe7Huu\xf5\xcf\x00N\x01\xb8\ +\xa3p>\x1c\xb5\x09\xc7\xc0\x05\x92\xd3\x00\xec\xb4\xd6\x1e\ +\x1d\x89@\xb2UD\xfe\xb2\xd6~`\x8c\xf9FDV\ +\x008\x5c8\x98\xdc\xd4M\x08\x00\x9d\x9d\x9d\x932\x99\ +\xccL\xad\xf5\x0f\xa3q|\xdf_J\xf2-\x00\xb3E\ +\xe4H&\x93Y[[[\xdb{\xb3\x9a\xb7\xf1\xdf\xc4\ +?\x03\xff\x1b\xfa\xf1Q,\xee\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x02\x8d\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x0aID\ +ATX\x85\xed\x96\xcdj\x14A\x14\x85\xef\xa9\xf6=\ +4 \x91\xe0&tU;\xb8\x96\xb802\xfe@t\ +#\x0a\x01]\x88\x90} F}\x84`\x1e\xc1M\x14\ +A\xd1\x85\x0b\xb3s\xd1S\xa7\x86\x11bDA%o\ +\xa0\xdb\x04\xea\xba\xe9\x910X=\xddC0\x0b\xe7\x83\ +\x86\xae\xba\xb7\xee9T\xdf\xaen\x91)S\xa6\x1c3\ +H\x05B\x08/b\x8c;Y\x96m\xe5y\xbe\xdb\xb6\ +p\xaf\xd7;\x0b`\x09\xc0\x9cs\xeef*\xcf\xa4\x02\ +1\xc6/\x00\xd6c\x8c\x9fH\x0e\xca\xb2\x9cm\x22L\ +2'\xf9\xcd\x18\xb3\x03`\x1d@\xad\xf9\xa4\x01c\xcc\ +\xcb\xe1=\x80\xbdN\xa7\xf3\xb5\x89\x01k\xed@U\x7f\ +\x1c\x9a\xda\x9a\xc8@\x9e\xe7}\x11\xf9.\x22\xdb\xaa\xda\ +%\xb9\xd6\xc4\x00\xc9\x0d\x00\x17\x00\xbc\x16\x91\x8f\xd6\xda\ +\xcf\x13\x19\x00\xa0\x22\xb2d\xad]P\xd5M\x11y\xec\ +\xbd_\xae+\x16BX\x05p_D\x1eZk\xaf\xa8\ +j\xf2\xd9\xb7\x86\xe4\x0a\xc9\x03\x92W\x13\xe2\xb7H\x1e\ +\x84\x10\xee\x1d\x99\xe8(\xde\xfb\xdb$\x7f\xf5\xfb\xfd\xf3\ +#\xe6\x16I\xfe$\xb9\xd8\xb6f\xf25LQ\x89\xbc\ +\x19\x9dW\xd5NQ\x14\xbd\xb6\xf5&\x82\xa4\xd6\x8d\xdb\ +\x90l\xc2\x7f\xc5\xb1\x1bh\xdd\x03\xde\xfbs\x00\xca\xbf\ +\x84.;\xe7\xde\xb6\xad\xd7j\x07\xbc\xf7\x0b\x00\xde\x89\ +\xc85\xe7\x1c\x86\x971\xa6\x10\x91g!\x84\xbbm\x0d\ +4\x86\xe4\x1d\x92\xfb\xa9\xc3\xc8{\x7f\xa9\x8a?:2\ +Q\xef\xfd\x99J|\x8dd\x0c!\xac\x8e\xc9_&\x19\ +\xbd\xf7OU\xd5\x90\xcc\xc7i\xd4\xf6\x00\xc9\x01\x80=\ +U\xed\xaa\xeafQ\x14\x0f\xc6\x15\xac\xbe\x19ODd\ +[DNYkOW\xc7z;\x03!\x849U\xdd\ +\x15\x11Q\xd5\xf7\xce\xb9\x8b\x00\xe28\x03\xd5\xdaW\xaa\ +\xda\x15\x11\x01\xe0\xac\xb5!\x95[\xd7\x847\xfe\xb8\x04\ +fB\x08\xf3M\xc4\xcb\xb2\x9cU\xd5\x93\xc3q\x8c\xf1\ +z]\xfe\x89T@U\x9d\x88l\x88\xc8sk\xed\x87\ +\xbam@\xf2\x19\x80+\ +%\x1c[$F\xd6\xd7\x7f\x8e\x07\x83A\xfbH\x016\ +66\xce\xc4b\x897\x00\xeeWm$\xf2\xd5\xb2R\ +\x0f\xfd~\xff\xdea\x00T\xb9\x0b$\xd5\x81\xf0\x04 \ +/\x94\xe2m\xc0\xbe\x06\xb8\xfc\x80<\x07\xe4W\xce\xdf\ +\xadi\xee\x89H$\xa2\x1d\x06\xa0\xec\x0aD\xa3\x8b\x0f\ +H\x8e\xe5JS)\xf6{\xbd\xde\xdf\x07}\x0b\x0b\x0b\ +\xe7m\x1b\xef\x01t\x01\x80R2\xec\xf5\xde|]\x13\ +\x00I\x89F\x17\x97\x90\xdd\xf3\x84R\xbcU*Y\ +ZZj\xae\xd4dee\xa5\x89\xc4\xd3\x5c\xb9\x93L\ +nO\xd7\x04 \x22\x19\x12#\xd9\x8a\x97\xf7\xf7\xedw\ +\xd9W\xadtx*e\x8d\x03\xb8\x9a\x9b\x1a\x0b\x04\x02\ +)\xa7\x00e?D\xa1P\xc8\xd5\xd6v=D\xf2n\ +njS\x04\xa3\xb6\xad\x85\x1b\x1bU\xcc\xb2\xacK\xb6\ +\xcd\x9e\xdc\x9d\xe7\xc3A2\xdc\xd0\xe0\x1eloo\xdf\ +\xaf\x09\x00\x00fff\xcej\x9a{\x1c\xc0\x1d'\xcd\ +\x0aME\xc2\xb1\xd8\xe6P__\xdf\x9fj\xde\xb2g\ +\x01\x00\xf8\xfd\xfe\xbddr'\xa8\x94\x0c\x03H\x94\xb1\ +\xed\x00x\x09\xe0K~\x82dok\xabgbrr\ +\xd2]\x15\xb6\x9a!/\xc30\xeaHW\x97R\xd2\x91\ +\xc9\xb0E\x84I@-'\x93\xdb\xd3\x81@ e\x18\ +F\x1d\xe0z\x8b\xa2\x93SD\xa6b\xb1\xcd\xc1J+\ +\xe1\x18\xc0)d\x09\x88p}}]\xd9g\xa2\xe2\x16\ +\x1cV\xba\xae[kk?\x86\x00\xf9\x98\x9f#\xd9\x9b\ +JY\x1f\x22\x91H\xfd\xb1\x03\x00@\xf6\xaf(\xfdX\ +D>\x17At755\x0f\x9c\x08\x00\x90]\x092\ +\xfd\x08\xc0\xa7B\x90\x82\xa33\xe5HER\xcd\xcdE\ +\xfbgg\xa3\xf7N<\xfcT\xa7r\xaa\xbf\xf4Z!\ +p(\xce\xc5\x8f\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x03\x17\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x94ID\ +ATX\x85\xed\x95\xcdk\x13Q\x14\xc5\xcf}f\x92\ +\x80\xa9F\xa1\x15\xc5\x0a\x05\xbf(H\xd1\x84B\xbb\x10\ +\x8au%\xa8\x05\xa9\xdd\x08\xfe\x05R\xa8\x8a\xa8Hq\ +m\xff\x0e!\x8b,\xba\x10$h\x85Jj'\xf3\xa6\ +t\xa1\xb8-\x82R\x17m%\x92\x1af|\xc7E3\ +aZ\x9b\x98\xb6Sp\x91\xdf\xea\xce\x99;\xef\x9ew\ +\xdf\xc7\x00m\xda\xb4\x89\x98B\xa1p8\x97\xcb\xc5[\ +\xcd\x97\xa8\x0a\xbb\xae\xdb\xe9y\xde\x1d\xa5\xd41\x00\x0f\ +\x00|\xf2<\xef\xd6\xe0\xe0\xe0\xe7}7@R\xb4\xd6\ +O\x00\xac\x03 \x80\xa9\x9a\xfe%\x16\x8b\x8d\x89\xc8\xf9\ +j\xb5\xbaZ\xa9T\x0aCCC?\xc3\xdf\xaa(\x0c\ +h\xado\x18c\x12\xb5\xe2uD\xa4\xdb\xf3\xbca\xdf\ +\xf7\xd3\x22r.\x95J}\x98\x9d\x9d=\xb2)g\xaf\ +\xc5K\xa5\xd2\xb0R\xea\xaa1\xe6\xa1H}\xb8\x89P\ +\xcaT(~L2\xad\x94z\x9d\xc9d\xde\x02\x11t\ +\x80\xe4Y\x92\xcb\xa1\xe2\xcd\xa8\x8a\xc8\xb21\xa67\x10\ +\xf6l\xc0\xb2\xacW\xc6\x98\xd4\xbf\xf2H\x82\xe4Q\x00\ +\x9d$\xdf\x07\xfa\xae\x96`~~\xfeZWW\xd7\x9b\ +\x9e\x9e\x9e_\x81\xb6\xb8\xb8x\xd0\x18s\xc6\xf7\xfdS\ +\x00\xc6H*\x11\xa11&\x1f\x8f\xc7+\x9e\xe7}'\ +\x99\x5cZZrFGG\xd7wm\xc0q\x9c\x9b\x00\ +.\x914\x222\x9d\xcdf\xdd\xddL\x22`GK`\ +\xdb\xf6s\x00\x17\x01\xac\x89H\x99\xe4;\xad\xf5\xed\xc8\ +\x0c\xcc\xcc\xcc\xa4\x1b%j\xad3J)\x01\xf0\x0c\x1b\ +;\xfb\x85\x88L\x1ac.\xd8\xb6}%\x12\x03\x1d\x1d\ +\x1d\x93\x0b\x0b\x0b\x7f\x99(\x16\x8b\xa7\x01\x8c\x00X\xdd\ +\xfaNDV\x94R\x97\x1d\xc7\xc9\x93\xdc\xf1\x92n2\ +@\xd2\xf8\xbe?\x1e6\xe1\xban\x9feYwI\xae\ +4\x19\xe7\x07\x80\x11\xad\xb5\xden\x02\xcd\xd8\xe4\xd8q\ +\x9c\xe0&\xfbV.\x97{-\xcb\xfa\x9dL&\xefc\ +\xa3\xed\x01\x8d.\x99\x09\x921\x11I\x18c\xf2\xfd\xfd\ +\xfd\x1f\xb7+877w}```:xn\xb4\ +\x09\x8f\xa7R\xa9\xf1D\x22q\x0f@\xb9\xe5\xd9\x88\xf8\ +\x00*J\xa9b\xed\xb4\xd4!\xa9J\xa5\xd2K\xcb\xb2\ +\xf2a\xbd\xe1)\xa8\xed\xf2*\x00\xd3\xaa\x81\xa0\x16\x80\ +C$s\xae\xeb>\x05\x00\xdb\xb6\xbb]\xd7}$\x22\ +c\x00\x0e\x84\x93c[>\x9e\x02\xf05\x88\x95\xaa\xfb\ +k\xd8\xf6F\xba\x88\xc0\xf7\xfd\xb4m\xdb%\xa5T\x1f\ +I\xab\x96\x7f\xa2\x99\x81HQJ\xad\x01\xc86\xcd\xd9\ +O\x03\xad\xb0\xb5\x03\x13\x0d\xe2\x96\xda\xbe\x03\xfd~ \ +\xfcw\x1d\xa8C\xf2d\x10\x87\xff\xf5Q\xe9m\xda\x04\ +\xfc\x01\xe0\x10!m\xd3f\x1b{\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x04\x9f\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x04\x1cID\ +ATX\x85\xedVML\x5cU\x14\xfe\xce\xe1\x91Z\ +\x22\xb82$\xfe\xac\xda\xc4\x94\x89\x02\xef\xdd\x99`\xe3\ +\x0fcjL\xd3\xc0B\x914]T\xadIS\x1b\x15\ +\xab\xad\x0b\xd3P@\xc5\x80Z\x11\xb5)11\x9a(\ +\x89\xd6\xa8\x89F\x17\xa6\xb2\xb1\xc3\xf3\xddw\x07u\xa1\ +%(\xb8\xd1\xa4u\xe1\x00S1\xc0\xbb\xc7\x853f\ +\x18\x99a\xa05.\xec\xb7y/\xb9\xe7\x9e\xf3\x9d{\ +\xbfs\xee\x01.\xe32\xfe\xef\xa0\xf5n\xf0}\xbf\xde\ +q\x9c\xfb\x01\xec\x07\xf0\x9d\xb5\xb6/\x91H\xe8\x7f\x9d\ +\x801\xc6\x03\xd0%\x22\xbb\x01T\x17-\x9f!\xa2\x01\ +\xcf\xf3>\xbe\xa4\x04|\xdf\xaf\xab\xae\xae\xde-\x22\x0f\ +\x03\xb8\xb1\x02\x7f\x13\x222433\xf3Nggg\ +\xb4a\x02\xc6\x98m\x22r\x00\xc0>\x00WV\xe2\xa8\ +\x08?\x02xe~~~$\x99L\xfeQ\x11\x81\xa9\ +\xa9\xa9M\xb3\xb3\xb3\xedD\xb4_Dvl \xe8j\ +8'\x22'\x1d\xc7\x19jnn\xce\xacf\xc0\xf9\x9f\ +L&s\x10\xc0\x9b\x9708\x00\xd4\x13\xd1CQ\x14\ +\xed)e\xb0\xe2\x0a\xd2\xe9\xf4\xd5\xd6\xda\xa3\x00\x0e\x02\ +p.2\xf8\x0c\x80\x97\x01\xbc\xae\x94\xfa\xbd\x22\x02y\ +h\xado \xa2\xa7\x01t\x94\xb2)\x83oD\xe4x\ +6\x9b\x1dM&\x93\xcbk\x19\x97u\x1e\x04\xc1\xed\xcc\ +\xdc\x03\xa0u-G\xcc|\xc6Z;FD\x13\xae\xeb\ +~DD\xb6\x12\xb6\xa5N\xa0\x19\xc0\x01\x22\xea \xa2\ +nk\xed$\x11\xbd\x00\xa0\xb1\xc8\xd4\x02\xf8\x94\x88\x9e\ +u\x1cgzii\xe9\x18\x80\x07\x01\xcc\x88\xc8\xf35\ +55o\xc7b\xb1\xc5\x8a\x08\x14UA\x1c\xc0[\x8e\ +\xe3\x0c655\xfd\x0c\x00\x22\xc2\xc6\x98{\x00\x0c\x00\ +\xb8\x96\x88\xde\x15\x91~\xa5\xd4\xd9B\x87A\x10\x5c\xcf\ +\xcc\x87\xf1W\xa7\x9c]\xab\x0a\xfe&\xa0\xb5>DD\ +\xcf\x00\xa8!\xa2A\xc7q\xfa\x1a\x1b\x1b/\x14oH\ +\xa5R\x9b\x99\xb9\xae\xa5\xa5\xe5\x5c\xa9\xac\xd2\xe9\xb4\xb2\ +\xd6\xbe\x04\xe0\x16\x00\xe7\x01\xf4*\xa5N\x94%\x90\xdb\ +XX\x05\x19\x22\x1a\x14\x91!\xa5\xd4R\xa9`y\x88\ +\x08OLL\x1c\x89\xa2\xa8\x83\x88<\x00?a\xa3U\ +\x90N\xa7\x1b\xac\xb5=D\xd4!\x22\xe7\x01<\xa2\x94\ +:U\xca\x89\xd6z\x073\xf7\xe7\xaenRD\xfa\xa3\ +(\xfa\xba\xb6\xb6\xf6l\xa1\x06\xc20\xdc\x05`XD\ +\x06\xe3\xf1\xf8\x08P\xd0\x88\xc6\xc6\xc6\xae\xd0Z\xef\x0d\ +\xc3p\xdcZ{\xcaZ\xfb\xa8\xb5\xb6\x05\xc0\xf7\x00\xde\ +\xd3Z\xa7\x82 \xd8^\x98\xb11\xa6Mk\xad\x89\xe8\ +s\x11Y$\xa2v\xcf\xf3\xb6\x11\xd1\xb2\xe38za\ +aa\xda\x18\xf3X.\xa9\xdb\xac\xb5\xbf\x01\xb8\x8a\x88\ +Nj\xad\xf7\xae8\x81B\x0d\xe4\x14\xdc\x17\x8b\xc5\xb2\ +\x00`\x8ci\x13\x91\xe7\x004\x00\x18\x05\xf0%\x80C\ +\x00\xb6\x02\xf8\x80\x99\x07\x5c\xd7\x0d\xf3\xbe\x82 \x883\ +\xf3q\x007\x8b\xc8\x03\xcc\x9c\x11\x91\xf7\x01t1\xf3\ +\xb8\xb5\xf64\x80_\x94R7\x15k\xe0\x9a(\x8a\x8e\ +\x11\xd1>\x00\xbf\x12Q\xcf\xdc\xdc\xdc\x1b\xc9dr\xb9\ +\x92*\xd0Z\xb7\x12\xd1S\x00\xee\x040-\x22O2\ +\xf3b.\xf8\xab\x9e\xe7\x1d\x09\xc3\xb0KD\xbeb\xe6\ +MJ\xa9\xb1J:\xe1$\x80\xee\xbc\x06V\xab\x82\x9c\ +\x06zEd;\x80oE\xe4\xc5l6;ZWW\ +\xb7\xb30\xb81f\x04\xc0\x1e\x11I\xc6\xe3\xf1`\xc5\ +\x15\x94 \x92 \xa2\x01\x00\xad\x222.\x22\x87\x13\x89\ +D*\xaf\x81t:\xbd\xcbZ\xdbMD\x0a\xb9\xa1\xc4\ +u\xddO\x88H\xb4\xd6;\x89\xe8C\x22:\xe1\xba\xee\ +\x13\xc6\x98\xd7\x00\xdc\xc7\xcc\xed\xae\xeb\x9e\xce\xc7\xa8\xa8\ +\xcf\x97\xd0\xc0\xe3\x00\xb6`\x15\x0d\xe4\xec\xff\x919\x11\ +\xb5y\x9e\xf7E\xa1\xef\x8a\x1f\x9aJ;\xa1\x88\xb0\xd6\ +\xfaVf\xbe\xcb\xf3\xbc\xa3\xe5\x82o\x08\xa9Tj\xb3\ +\xef\xfb\xf5\xa5\xd6\xb5\xd6\x9f\xf9\xbe\x7f\x1d\x00\x84a8\ +\x1c\x86\xe1\x05c\xcc\x1d\xa5\xec\xd7=\x15\x97C\x18\x86\ +.\x00\x03\xe0\x87\xe5\xe5\xe5$3o\xa9\xaa\xaa\xaa*\ +\x97\xf9\xc5\x0e\x1d\xc5\xb87\xf7\xdd\xea8\xce\xb0\xe7y\ +\x1dk=\xcb\x5cnq\xbd \xa2\x06\x11\xe9%\xa2\x06\ +\xa5\xd4\xdd\x95\xce\x04\xff)\xfe\x04}\x05$\x05\xf4\xc6\ +\xad%\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xc4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00AID\ +ATX\x85\xed\xd2\xb1\x0d\x00 \x0c\x03A\x87\x99\xb2\ +\xff\x04\xd9\x09\xda\x08QAa\x09\xfd\x95.\x5c\xbd\x04\ +\x98\xc5i\xac\xaa)I\x99\x19\xfbv\xab\x7fu\xe3\xe5\ +\x14_ B\xd8\x11!\xec\x88\x10vD\x08\xd8-V\ +\x8c(\x10\xf3\xfc\xc6U\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x02\xe0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02]ID\ +ATX\x85\xed\xd6\xcfK\x94A\x18\x07\xf0\xefwv\ +\xd9xC\xf6Pt\xea\x10\x08\x1d\xd2\xa0`\xe6\x95\xa8\ +C\x10\xf4\x03\x82\x88\xc2\x8d \x08<\xd5MA\xa8c\ +]\xc2\xc0SdA'\x83\x10\x89\x92\x0e\xa2&\xe1Z\ +\xd2\xa2\xef\xcc\xbc\xee\xc5\x93\xb8\x7fA\x17/\x09\xb5\xfb\ +>]VX7\x91\x12\xdf\xb7\x0e~o\xf3<\xc3;\ +\x1f\x86\x97\xe1\x01\xf6\xb3\x9f\xff)\xce\xb9\xa1\xac\xcfT\ +m\xeb\x07\xce\xb9\x11\x11\xe1\xbf\x02\x00\xc0\xa98\x8e_\ +\x8a\xc8v\xbd\xf4\x01A\x10\x5c\x11\x91N\xef\xfd\x9br\ +\xb9\x9c\xcf\x1c\xd0\xd5\xd5\xf5\x1d\xc0E\x00\x07\x8b\xc5\xe2\ +\xfb\xd5\xd5\xd5\x03\x99\x02\x00\xc0\x18\xc3 \x08J\x00~\ +\xae\xaf\xafOT*\x95 S\x00\x00tww\xffX\ +[[\xbb\x05\xe0[\xa1P\x98ZYY\xe9\xc8\x14\x00\ +\x00\xa5R\xa9Q\xab\xd5\xfaH\xd6666\xa6\x17\x17\ +\x17\x8b\x99\x02\x00\xa0\xb7\xb77\x11\x91>\x00q>\x9f\ +\x9f[ZZ:\x9c)\x80\xa4\x18c\xa8\xb5\xee\x070\ +\x9f\xcb\xe5>\xc5q|$\x13@\xa5R9\xd4\x06\x19\ +\x040\x9e$\xc9\x97j\xb5z4u@\xa1PXh\ +?\xc8\x18\xf3\x14\xc0h\xbd^_\xb0\xd6v\xa6\x0a\x00\ +p\xa2^\xaf\x97\xe38>\xb6Yh>\xd3C\x00\x86\ +I\xce-//\x1fO\x13\x00\x92\xc3I\x92|\xb5\xd6\ +\x9el\xae\xc5\x18Cc\xcc\x0b\x92O\x1a\x8d\xc6\xe7\xcd\ +^*\x00\xad\xf5+\x11\x19$9\x13E\xd1\xe9\xf6\x1e\ +\x80A\x92\xb3\xed\xbd=\x03\x00@\x18\x86\xe3$\xef)\ +\xa5\xa6\xa3(:\xdb\xda3\xc6\x8c\x91\x1cPJ\xcdz\ +\xef\xcf\xa4\x02\x00\x00\xad\xf5\xa4\x88\xdcVJM8\xe7\ +.m\xd6E\x84\x222N\xb2OD&\xbd\xf7\x17R\ +\x01\x00@\x18\x86\xf3\x22r\x0d\xc0k\xef\xfd\x0d`\xcb\ +;1I\xf2\x8e\x88\xbcm\x05\xee)\xa0\x89\x88\x00\x5c\ +\x15\x91\x11\xe7\xdc\xdd\xd6\x9e\xd6z&I\x92\x9b\x00\xc6\ +\x9cs\xd7\xff\xe4{[&\x1f\xe7\x9ch\xads$\x93\ +\xe6:i\xdf\xd3\x16\x01\xd0o\x8cy\xd6Z\xb4\xd6\x9e\ +#\xf9AD\xee\x87a\xf8n'\xc0\x8e\x03\x871\xe6\ +\xafoHD\x94\xf7~\x81d\x08`\xca{\xdf\xa1\xb5\ +\x1e\xdd\x15`7i\xde\x9e\x02\x80(\x8a.+\xa5>\ +Zk;\xc20|\xbe\xdd\xfeT\xe7\xbe\x9e\x9e\x9e*\ +\x80\xf3$\x1fZk\x07\xb6\xdb\xf3\xdb?\x90&\x88\xe4\ +#\xad\xf5\xe34\xcf\xd8\xcf_\xe7\x17\xa16\xfd\xa0U\ +b\xb8\xe7\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xdb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02XID\ +ATX\x85\xed\x94=h\x14A\x14\xc7\xffo\xbc\x0b\ +(.\x5c\xa1`eq`}0;\x0b1\xa4p\xd5\ +\x88\x85\x8d\x85XY\x18\xd0V;\xed-\xfch-\xc4\ +\x80_\xd8]P\x13\xf2qZ$\x16\x92X\xec\xcc^\ +ui\xec\x22F$\x10\xc1==\xf1\xb2\xf3,r'\ +\xc7\xb1\x97\xbd\xc8mD\xc8\xaf\x9b7\xff\xb7\xf3\xe3\xcd\ +\xb0\xc0\x1e{\xfcc(\xa9h\x8c\x99g\xe6\x0f\x00&\ +]\xd7]\x22\x22\xdeU\x01\xad\xf5\x1d\x007Z\xcb\x8f\ +\xcc\x5c\x11B\xcc2\xf3k\xa5T3s\x810\x0c\x8f\ +[k\x97\x13\xb66\x88h\x8e\x99g\xf2\xf9\xfc|\xa9\ +T\xfa\x9e\x89\x003\x0bc\xcc'\x00G\xb6\xe9\xfd\x01\ +`\x91\x99'\xe38\x9e\x1a\x1e\x1e\xfe\xf67\x02\x22\xd1\ +\x8a\xc8\x02\x98I\xe9=\x00\xe0\x1c\x11=\xcb\xe5r_\ +\x8c1\x8f\xb4\xd6\x87v*\x90\xdbfo\x1a\xc0\x95\x94\ +\xfe\x15l\x89\xceJ)\x97[\xe2\x83\x11\x88\xa2h\xc1\ +q\x9c:\x80\x83\xbd\x22B\x88\x0bR\xca\x95\x9d\x1e\xda\ +I\xe2\x15\x00\x80\xef\xfb?\x89\xe8\xcd6\xbd\x8e\xb5v\ +\xaaZ\xad\x162\x11\x00\x00k\xedtJ\xff\xb18\x8e\ +\xcb\xe5ry_&\x02\xcdfs\x0e\xc0f{\x09\xe0\ +WBl\xacX,\xde\xcaD`ddd\x03\xc0\xbb\ +\xd6r\x91\x99O\x02\xf8\x9c\x10\xbdi\x8c\xb98p\x81\ +\x16\xedk\xa8x\x9e\xb7$\x84P\xcc\xfc\xbe+C\xcc\ +\xfcDk-\x07. \x84\x98\x02\x808\x8e+\x00 \ +\xa5\x5c+\x14\x0a>3OtE\xf7\x03x\xb1\xd3\x7f\ +A\xe2\x9f\xb0\x1b\xad\xf5+\xa5\xd4\xf9\xee\xba1\xe6*\ +3\xdf\x070\xd4\xae1\xf3B\xbd^?\xeb\xfb\xfef\ +w>\x89~\xae\x00B\x88\xebIu\xd7u'\xac\xb5\ +>\x80\xb5v\x8d\x88N9\x8es\xbb\x9f\xef\x02}N\ + \x8d0\x0c\x0f[k\xcb\x00Nt\x88\x5cv]\xf7\ +iZo_\x13HCJ\xb9\x1eE\xd1\x18\x80\xbb\xed\ +\x1a3?\x08\xc3P\xa5\xf5\x0ed\x02\x9d\x04Ap\x89\ +\x88\x1eb\xebQ\xae\x0a!\x94\x94r\xbdW~ \x13\ +\xe8\xc4\xf3\xbc\xe7\x00F\x01\xac\x028j\xad}Y\xab\ +\xd5\x86z\xe5\x07.\x00\x00J\xa9P\x08\xa1\x00\xbc\x05\ +0\xdah4\xee\xed\xaa\x00\xf0\xe7]\x9c\xc1\xd6\xbb\xb8\ +\x16\x04\xc1xVg\xa5\x12\x04\xc1\xb8\xd6\xfa\xab1\xc6\ +\xed\xde\xcbl\x02\x9dx\x9e\xf7\x98\x88N\x13\xd1\xean\ +\x9c\xb7\xc7\xff\xc5o<$\xe1#l$z\x95\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x8a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x07ID\ +ATX\x85\xed\x94\xc1j\x13Q\x14\x86\xbf{G'\ +b(\x81\xba\xa9\x82H\x16A\x10\xac%\x84d!\x88\ +\x01\xe9F\xd0\x8aT\x04Q\x04w>\x81\x0f \xd8\x07\ +P\x5c\xb9\x11\x175*t#\x88b\xe3\x22\x0cd\xe6\ +L\xa8\x8b\xac\x5c\x99\x8d\x8b\x22\x08)\x82`\xceu\xd1\ +\x06\x13I\xcd$\x8dv\x93\x7f7\x97\xff\xdc\xff\x9b9\ +g\x0eL5\xd5T\x13V\xb3\xd9\xf4\xab\xd5\xea\xa1\xa4\ +~3\xa9\xe00\x0c\xe7\xac\xb5\x8f\x81\x8b\x80\xe7\x9c{\ +\xedy\xde\x9d|>\xbf\xf9_\x00D\xa4\x06\x9c\xed\xbb\ +\xdc\x98@U\xef\x03\x8b\xc6\x98O\x99L\xe6I.\x97\ +\xfb1q\x80F\xa3qFU7\x12X\xd7\x80\x1b\x85\ +B\xe1{\xf7\xc0\xee5<\x8a\xa2\xeb\xaa*\x09\xedK\ +\xc0\xb78\x8e\xafM\x0c\x00X\x04\x0e\x8c\xe0?\xe8\x9c\ +[\x9a\x18\x80\xaa\xae\x18c\x22\xc0%,\xd9T\xd5\x87\ +\xdd\x87\xb1f \x8a\xa2\x9b\xc6\x98W\xbd\xbd\xac\xd5j\ +3\xa9Tj\x1e8i\x8c\x991\xc6\xa4\x9ds\x1dc\ +\xcc\x96sn\x0bh\x01\xadv\xbb\xfd\xb9\x5c.\xff\x1c\ +\x1b@D\xee\x02\x8f\x80\x8f\xc0\xa5B\xa1\xd0\x1a\xe7%\ +\xc6\x02\x10\x91e`\x95\xdf\xad\xfb\xa2\xaa\x97\x8b\xc5b\ +4.@\xdf\x0c\x04A0\xbb\x9b\xb1\xd1h\x9c\x03\x9e\ +\xfeQs\xd4Z\xfba\x07l\xef\x00\xbe\xef\xbf\xaf\xd7\ +\xebG\x06\x84\x9fR\xd55`\xd0\x8a=\x0c<\x17\x91\ +\x15\xe7\xdc\xc8-\xed+\x10\x11\x07lt:\x9d\x0b\xa5\ +R\xe9\xebN\xf81U\x0d\x80\x13\x09\xee{\x01\xdc\xee\ +\x1d\xcea\x1a\xf4\x1b.x\x9e\xf76\x08\x82Y\x11\xc9\ +\xa8\xea\x9b\x84\xe1\x00\xcb\xc0z\x18\x86s\xbb\x19\xe28\ +\x9e\x1f\x06\x00\x90\xf7}\xff\x1d\xdb\xab\xf3t\xc2\xf0\xae\ +J\xd6\xda0\x0c\xc3\x85\xde\xc3J\xa5\xe2\x89\xc8=\xe7\ +\x5c\xdf\xc0\xfem\x11\xe5\x81\xf3#\x86wu\xdcZ[\ +\x8b\xe3\xf8\x0a@\xbd^\xcff\xb3\xd9u\xe0\x01\xe0\xf7\ +\x1aGY\xa1\xa3*\xed\x9c{)\x22\xcf\x80\xab@z\ +\x90\xe9_\x02\xc0\xf6\x17\xbe5\xcc\xb0\xaf\x9a\x02\xec;\ +\xc0TS\xfd\x02\xd6\xeb\xb9\xbe\xef\x8e\xc0\xf6\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x03\xf2\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03oID\ +ATX\x85\xed\x96Ah\x5cU\x14\x86\xbf\xf3\xdek\ +f\xba\xc8\xd0\xb8\xa8\x0d\xa8\xd1E\xa22Ux\xe1\xbd\ +:J\x16\xceF\xddh-n\x1ak\xb1\x92mc\xdd\ +\x08\x16\xac\xb5V\x11\x97n\xc4\x9d\x82%XP\xc1(\ +\xba\xb1Dk\xd4\x19f\x98!j@;\xdaj\x11B\ +\x0b52F2\x1dg\xeeq\xd1;\xf0\x9c\xbe\xc9\xcb\ +$\xee\xccY\xdd\xfb\x9f\xff\x9c\xff\xe7\xbc\xcb}\x17\xb6\ +b+6\x11\xaa*\xaa*\x9b\xe9\xd1Wq\xb9\x5c\x1e\ +V\xd5\xc7D\xe4a \x0b\xec\xb4\xa9\xcb\xc0\xa2\xaa~\ +$\x22\xef\x07A\xb0\xf4\x9f\x1a(\x14\x0a\x19\xcf\xf3\x8e\ +\x02G\x80\xed\x09\xf4U\xe0\xf5V\xab\xf5j.\x97\xab\ +o\xda@\xb5Z\x1dm\xb7\xdb\xb3\xc0\x1d\x16j\x01_\ +\x02\x9f\x8b\xc8E\x8b\x8d\xa8\xea\xfd\xc0\x04\xe0Y\xec\x07\ +\xd7u\x1f\xf1}\xbf\xb6a\x03\xa5R\xe9v\x11\xf9\x1a\ +\xb8\x01@UO\x01\xc7\xc30<\x1f\xc7/\x16\x8b\xb7\ +y\x9ewBU\x0fZ\xe8wU\xbd/\x0c\xc3\x1f\xfb\ +6P\xadVw\xb4\xdb\xed\x220\x064\x81\xa7\x82 \ +\x98Y\xcbp'\xca\xe5\xf2\xe3\xc0[\xc0\x00p\xceu\ +\xdd{|\xdf\xff#\x8e\xeb\xf4j\xd2n\xb7_\xb4\xe2\ +\xf4#\x0e\x10\x04\xc1\x8c\x88L\xd9\xed\x981\xe6\x85^\ +\xdc\xd8\x09T*\x95\x11c\xcc9`@UO\x85a\ +x0\x8e\x97\x14\xa5R\xe9\x1d\x11y\x02\xb8\x0a\x8c\x05\ +Ap\xb1\x9b\x13;\x01c\xcc$\xd7\xc6\xd7r]\xf7\ +\xf9\x8d\x88\x03x\x9ew\x8ck\x876\x05L\xc6qz\ +}\x82\xbd\x00\xaa\xfa\xd9\xf8\xf8\xf8\xaf\x1b5\xe0\xfb\xfe\ +/\xc0\x19\xdbko?\x06v\x03\x88\xc8\x99\x8d\x8aw\ +\xa2\xd3CD\xee\x8a\xcdw\x03\xf3\xf3\xf3\x83\xe9t\xba\ +n\x8b\xf6\x03\xdb\xd3\xe9\xf4L6\x9bm\xf6#<7\ +7\xe7e2\x99\xfd\xc0\xdf\xaa\xfa.@\xa3\xd1\xc8L\ +LL\xfc\x19\xe5]7\x81T*\xf5@d\xab\xaa\xfa\ +\xec\xea\xea\xea\xdb\xfd\xde\xf9\x83\x83\x83\xaf\xa9\xeask\ +\xf4\x8e7\xe08\xcetD\xfdf\xe0\x120Y\xa9T\ +\x1e]\xafx\xb1X\x1c\x03\x9e\xb1\xb5\xb7tp\x119\ +\x9ch@U\xa3\xdfj\x04\xf8\xde\xe2'\xd6k\xc0u\ +\xdd\xc3\xb6\xf7w\xaazk$u\xdd9\x88;\x84\xdb\ +\x22\xeb\xbc\xaa\x9e\xed\x14\x97\xcb\xe5|\x92x\xa1P\xc8\ +\x00\x87\x00D\xe4,\x10\xad\xd9\xd6\xcd\x8f3p9\xb2\ +\xde\xad\xaa?\x01\x7f\xd9\xfd\x93I\x06\x5c\xd7\x9d\x04\x06\ +\x81\x15c\xcc\x05\xe0\xceH\xfa\xd2z\x0c\xcc\xff\x8b\xe0\ +8\x0f\x8a\xc8\x07v\xbboqqq`-\x03\x22r\ +\xc8.\xdf\x13\x91\x87\xba\xd2_%\x1a\x10\x91\xd9.\xe8\ +\x08\xf0\x06`\x80L\xa3\xd1\x18\xef%\xbe\xb0\xb0\xb0\x13\ +\xd8c\xb9o\x02OG\xf3\xaa\xfaq\xa2\x81z\xbd>\ +\x0bD\x7f\xb7\xc3\xaa\xba\x078\x0d`\x8c\xc9\xf62\xd0\ +l6s\xb6\xe7i\x11\xb9\x17\xd8\x15I\xff\xbc\xb2\xb2\ +\xf2a\xa2\x81|>\xdfR\xd5i@#\xf0Q\x119\ +\x09,9\x8e\xe3\xf62\x00\xec\xb0\x9c\x97\xbb\xee\x00U\ +\xd5\xe9|>\xdfJ4\x00\x10\x86\xe1'\xc0\xf1\x08\xb4\ +KU_\x02\x0e\x18c\xbe\xe8\xa5\xeey\xde7\xc0\x01\ +\xcb\xbd1\xa2~,\x0c\xc3O\xe3jz\xbe\x07\x82 \ +8\xa9\xaaS\xc0\x15\x0b\xed3\xc6\x98\xb5^7\xbe\xef\ +\xd7\x1c\xc7i\xabj\xe7\xd2\xba\xa2\xaaSa\x18\xbe\xd2\ +\xab&\xf1z\xad\xd5j\xa9\xe5\xe5\xe5\xbb\x8d1K\xb9\ +\x5c\xee\xb7$>@\xa1P\xb8\xc9q\x9c\xe1\xa1\xa1\xa1\ +oGGG\xaf\xae\xa7f+\xfe\xbf\xf1\x0f\x00eH\ +5\x9e\xceY\x1f\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x05x\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x04\xf5ID\ +ATX\x85\xedU[lTU\x14]\xfb\xdc\xd3\xda\ +\x92\xb6\xb4\x81 \x0fIl\xeb#\x96\x0at\xee\x9d)\ +B\xa2i\xd0\x18\x95\x84D\xb0\x06M@\x22F\x08\x06\ +\xd4D\xbf\x84\xc4\x14\x124\x18LP\x04\xd1\x8f\x86\x0f\ +\x92\x09\x11#\xf1\xc7H*\x01j3\xf7\xde)\x9dF\ +\xd44b\x04\xc3\xc3\x10\xe8\x94\xd2:\xd3\xb9g\xf9\xc1\ +\x0c\x99\x0e\x85\xdb\xc4O8_3\xfb\xae\xbd\xce:\xeb\ +\x9c\xbd7po\xdd\xedK&\x03\xf2}\xffE\x00\x1f\ +\x93\x14\x92?\x0e\x0f\x0fonkk\xfb\xb7\x1830\ +0P388\xb8\x17\xc0\x22\x11\xc9Y\x96\xf5ZK\ +KKw\x18\xb7\x0a\x03x\x9e7\xc5\x18\xb3[k\xbd\ +\xf8\xcc\x993\x8f)\xa5\xfe\xaa\xae\xae\xeeK$\x12O\ +\x160===\xcb\xd3\xe9\xb4\xaf\x94:\xe98\xceC\ +eee\xcf\x06App2\x87\x0bu \x95J}\ +\x02\xe0%\xcb\xb2\xbejjj\xea\x10\x11z\x9e7\x1d\ +\xc0\x09\x92\x1f\x88\xc8\x0c\x00\xeb\x01,r\x1cg\xa4\x90\ +\xe7\xba\xee\xb7$w\xc5b\xb1cw\xe2\xd7a\x02,\ +\xcb\xda@\xb2\x92\xe4\x87\xa7O\x9f>\x09\xe0\xa8\xe38\ +\x97=\xcf\x8b\x008\x0b c\xdb\xf6\x5c\x111\xe3N\ +&r\x5cD\x1c\x00w\x14\x10z\x05\xc6\x98\x8b\xf9\x9f\ +\x0c\x82`\xb0(\xfe\x88\x88X\x222\xc5u\xdd9\x13\ +\x08?K2\x08\xe3\x0fu\xc0\x18\xf3\x9c\xd6z]\x10\ +\x04\x89\xf9\xf3\xe7\xfb\x00\x10\x8f\xc7\xcbE\xe4{\xa5\xd4\ +\xca \x08f(\xa5~\x02\xd0X\x9cG\xb2\x1a\xc0\xdf\ +a\xfc\xa1\x0e\x8c\x8e\x8e\xde7::\xfav6\x9b\xed\ +,\xc4\x1a\x1b\x1b\x0f)\xa5\xe2\x91H\xe4h4\x1a=\ +\x08\xc0w]w_\x89\xf0\xa6\xda\xda\xda\x1f\xc2\xf8C\ +\x1f\xe1\xc0\xc0@M:\x9d\xbe\x0a@\x91\xec\x17\x91Y\ +$\xebD\xe4\x02\xc9\x1b\xa7P\x8a$g\x8b\xc8%c\ +\xcc%\xa5\xd4/\x00f\x92\x5c^\xfc0'- \x1e\ +\x8f\x97744l\x17\x91U\xc6\x98\x1a\x11)\x03P\ +a\x8c\xd9!\x22\xab\xb4\xd6\xaf\x94\xd6\xb8\xeb\xba+E\ +d\xab\xd6zM6\x9b]\xa6\x94z\x83dN)u\ +\xcd\x18\xf3\x8d\xe38\x1d\xa5\x0f\x15\x98\xe0\x0a\x5c\xd7}\ +\xbf\xbe\xbe~\x18\xc0r\x00\x1b\xa2\xd1h\x8d\x88\xec\x05\ +\x00\xcb\xb2\xda\x94R\x17&j0\xd1h\xf4\x10\x00=\ +666\x0b\xc01\x11\xd9\x15\x8dF\x1bH>!\x22\ +\xda\xf7\xfd\xdf=\xcf[wG\x07|\xdf\xff\x8c\xe4F\ +c\xcc\xd6X,\xd6Q\x88\xf7\xf5\xf5\xcd\xc8\xe5r\x17\ +I\x9aL&\xf3\xe8\x92%K\xfe\x98\xc89\xdf\xf7\x17\ +\x91\xec$\xd9\xe58\xce[\x22\x92+v\xb5\xb1\xb1\xf1\ +g\x119\x1c\x89D\xb6\xdd\xe2\x00IEr\x03\x80s\ +\xc5\x9b\x03\xc0\x82\x05\x0b\xfe!y\x01\x80%\x22W'\ +\xda\x1c\x00l\xdb\xeeQJ\x01\xc0\xfd\xc5\x9b\x03@{\ +{{6\x12\x89\xb4\x92\x5c_\x1c/-C\x02\x98\x9d\ +H$\x16\xc6b\xb1S\xe3>\x90JDP^^\xbe\ +\x0b\xc0\x9a\xdb\x89 \x99\x04\xd0\x0c\x00\xa9T\xeaq\xcb\ +\xb2^'y~hhh7\x80\xb1R\xfcM\x07D\ +\xc4\x90\xdc\x03\xc0RJ\xf9\xbe\xef\x7f\x1a\x8f\xc7\xcb\x81\ +\x1bW\xa0\x94\xaa y\x19@;\xc9\xdb\xf6\x0fcL\ +\x1a\xc0\xcc\xee\xee\xee9J\xa9\x13$7\x03\xf8h\xea\ +\xd4\xa9\xfb}\xdf?Nrw1\xfe\x96*\xf0}\xff\ +\x1d\x00;H\x96\x93\xcc\x01H\x8aH6\xff\xb9\x13\xc0\ +~\x119`\xdb\xf6\xea\xd2\xdcD\x22\xb1Vk\xfd\xa0\ +1\xe6\xcd\xb2\xb2\xb2\x13\x96e\xad(r\x86###\ +k[[[;\x8bs&,C\x92\xda\xf7\xfdm\x00\ +^\x15\x919$\x0b\xb81\x00V\xde\xb9_E$\x0d\ +@H\xd6\x01\x98\x0e\xa0\xae\xc0I\xf2Jee\xa5\xc9\ +\xc7\x01`Oss\xf3\xc6\xd2\xbdB\x1b\x91\xe7yS\ +\x00\x5c\x03p\x88\xe4\xc3\x00\xe6\x8a\xc8\xf4|M\x07\xbc\ +\xd1\x8d\x0a\xc2\x06I\xfe\xa9\xb5>e\x8cY]QQ\ +\xb1\x10\xc0Zc\xcc\xb9L&\xf3\xb5\xe38\xb7\xbc\x81\ +\xd0\x95J\xa5l\xd7u\xb3\xc51\xcf\xf3\x0e{\x9eG\ +\xcf\xf3v\xe6\xff\xb7y\x9e\xd7Q\x82\xb9\xd2\xd5\xd5U\ +\x1b\xc6\x1f:\x0b2\x99\xccR\x11\x19\xd7Nm\xdb^\ +\x01\xe0\xb2\x88\xbc\x9bL&W\x01\xd8\xe28\xce\x96b\ +\x0c\xc9\xc1\xaa\xaa\xaa\xa7\xc3\xf8C\xa7\xa1Rj\xb61\ +f\xdcX\xed\xef\xef\x9f\xaa\xb5\xdeA\xf2\xe5 \x08\xf6\ +\x01x\xa64OD\xc6H>\x10\xca\x1f\x06\x00\xa0E\ +\xa4\xa6\x84\xfc7\xad\xf5N\xaduK~\x14w\xf5\xf6\ +\xf6..\xc9\x9b&\x22V(y\x18\x80\xe4)\x00\xda\ +\xf3\xbc/2\x99\xcc\xe7\xc6\x18KDj\xf3B\xb4e\ +Y\xdf\x19c\x96\x19c\x8e'\x12\x89\x03uuu\x9b\ +\x86\x86\x86\x9e\x229\xcd\x18\xe3\x85\xf1\x87VA~2\ +^/\x88%y\xbe\xb2\xb2r\xbb\x88l\x02pd\xde\ +\xbcy\xef%\x93\xc9\xa5\xc6\x98#\x00*o\x12\x8b\x5c\ +\xb7m\xbb\xea\x7f\x0b\x00\x80\xde\xde\xde\x17\x82 \xf82\ +\x8f\xff\xd6\xb6\xedM\xa5\xbd>\x1e\x8f\x97\xd7\xd7\xd7\xef\ +\x05\xf0\xbcR*\x07`\xa5m\xdb=\x93\xe1\xbf\xb7\xee\ +\xee\xf5\x1f\xbf=N-+\x1e\xea\xe1\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01p\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xedID\ +ATX\x85\xed\x95\xbdn\xc20\x14F\x0f\x95'T\ +5\x19\x10\xef\x11\xe9J}\xa4V\x1dx\x19\x06\x06^\ +(\xc3\x0d\x11\xcf\xd1%UJ\xb38q\x17\x86\x0a\xe2\ +\xc8\x90\x08$\xea3\xda\xbe\xfe\x8e\xffd\x88D\xfe;\ +\xb3\xd3\x86\xa2(\xd6\xce\xb9w\xc0\x0c\xd4Y`#\x22\ +\xab\xb1\x02g!\xc7\xf0\x85\x88|\xf9\x8a\xca\xb2L\xdb\ +\xb6\xfd\x04\xa6\x17\x00L]\xd7\x87\xa1\xa2,\xcb*U\ +\xdd\xa9\xaa\x0b\xcc\xb1\xc0VD>B\x04\x82\x10\x91\xd7\ +\xd0\xb1\x7fv\xecL\xe0\xe9Z\x81K\xa8\xaa\xea\x1b\xcf\ +bo\x220\x84\xf7\x08\x02_C(\xf6b\x01\xe7\xdc\ +\x1b\x90\x88\xc8\xcf\xd8\xf4<\xcf_\x8c1\xbd\xafj\xe8\ +\x08\xcc\x14\xe1\x00M\xd3x\xe7\xb9\xfb\x1d\x88\x02Q \ +\x0aD\x81>\x01\x9b\xa6\xe93`Uu>EH\x92\ +$K__\xdf_\xb09\xfe\xdd\x068\xa8\xeah\x81\ +\xae\xeb\x00\xf6\xa3'\x8aD\x1e\x92_\xe88T\xb0$\ +\xbc\xfe&\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01_\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x00\xdcID\ +ATX\x85\xed\x96\xbd\x0d\xc20\x10F?\x9f\xd8\x00\ +\x89\x86-R0\x03\xa2 C\x80\xb0\x8b\x8c\x13\xc9\xbe\ +\x06\xc1\x08(\x82\x1d\x90\xb2\x0a+\xc44)\x9d\x1fG\ +g\x1a\xfcJ;\xf2{\x8al\xcb@&\xf3\xef(\xa9\ +\x85\x98\xd9\x8f\xcdk\xad\x83.\xb1\x80\x10\xd6\xda\x1d\x11\ +5\x006C\x01\x94J\xce\xcc\x05\x11=\xbc\xf7\xe7\xb1\ +\xef\x92\x040s\x01\xe0\xe9\xbd\xbf\x18c\x9a\x9f\x06\xc4\ +\xc8\xc5\x03b\xe5\x00\xb0\x92\x92\xd7u\xbd\xee\xe5'c\ +\xccKj\xdd(\xac\xb5\xdb\xd0\xf8\xd4\x11\xcdd\x82\x0c\ +m\x9c\xa1\x8d\xb6\x94\xa8{\xc09w \xa2\xb6?r\ +\x22\xcc\xbe\x07\x9cs{\xa5\xd4\x15@YU\xd5G*\ +`\xd6\x1f\xe8\xe57\x00\xa5\xd6\xfa-%\x9f\x15\x90R\ +>\x19\x90Z>\x19\xa0\x94\xbaw]wL%\x07F\ +^DK\x9fX\x99L&\x96/\xa9\xd6Z'\x82z\ +Nf\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xdfID\ +ATX\x85\xedUMHTQ\x18=\xdf{\xf3\x90\ +)gZDPD\x0b\x15\x8c\x10\x1a\x9dw'\x11\xcc\ +E\x0b\x0b\x8a\xc2\x85d\x91i\xffQ\x8b\xc0 j\xd5\ +\xaeEH\x10\xf4\x07A%\xb4H\x17\xd5\xb6\x95\x04B\ +\xce\xdc{\x9f\x1aI\xe0\xc2 \x90\x16\xae\x02Kj\x9c\ +\xf7\xb5\xe8\xcd\xf4\xf4\xbd\x19\x9d\x1c\x17\x91g\xf3f\xce\ +\xf9\xeew\xce\xfb\xee\xdc;\xc0:\xd6\xf1\xbf\x83*\xd1\ +$\x93\xc94\x10Q'\x11\xd5\x0b!\x8e\x97\xb3\xd6X\ +\xad\xb9R\xaa\xdf0\x8c\x0fDt\x13\x80.w\xfd\x8a\ +\x03(\xa5\xb6\x85\xf1\xcc\xfc\xc3\xfb\xe8F\x22\x91\x17k\ +\x12`rr\xb2\x1a\xc0@H\xa8\x1e\x22\xbaLDG\ +\x01\xdcnll\x9c)7@\x00\x99Lf\xab\x94\xf2\ +\x89\x9f\x93R\x9eVJ\xb1\x94\xb2)\xcfi\xad\xf7*\ +\xa5\xc6\xb4\xd6\xbbV\xe3W\x98\x003\x93\x94\xf2\xa4\xb7\ +\x9fm\xfe\x22\x22\xea\xf5\x9eg\xbd@\xb5\x00:,\xcb\ +j\xb5m\xfbcE\x02(\xa5\xea\x89\xe8\x0a\x80\xcd\x00\ +f\xf3|:\x9d\xae\x01\xd0\xea}\xed\x1e\x19\x19\x89\x19\ +\x86Qm\xdbv_\x22\x91\xf8V\xac\xb1\xd6zwY\ +\x01\x84\x10S\x00\xaa\x98Y\x01\xf8\x94\xe7#\x91\xc8\x19\ +\xfc9\xae\xb1h4\xdae\xdb\xf6{\x7f\x93\xa1\xa1!\ +S)u\xd0\xcf\xb9\xae;\xa7\xb5\xbe311\xb1q\ +E\x01\x94R\x87\x01Tg\xb3\xd9\xfd\x96e\x9d\x03\x00\ +f6\x98\xb9\xdb\xbf\x80\x99/-mRSS\xd3\x0f\ +\xe0\xb5\xe38-y.\x95JM\x03x\x95\xcdfG\ +J\xfdN\x0a\x17\x91\x94\xf2\xadi\x9a\xd7\x93\xc9\xe4;\ +_\xa8v\x00o\x02\xa9\x0d#\x95L&\x15\x00h\xad\ +{\x99\xf9\xa9'M\x03H\x0a!\xbe\xfaz\xf4\x00\xb8\ +KD\xe7\x99\xb9I\x08q#0\x01\xad\xf5>\x22\x1a\ +\xf4\x9b{\xe8\x0dK\xed\xba\xee\x05\xafy+3?\xf2\ +I\xb5\x00\x1e\xfbk\x85\x10\x03\xcc|\x9f\x99\x07\x01\x5c\ +\x1b\x1f\x1f\xdf\x1e\x08\xc0\xcc;\x84\x10\x0f\xfc\x82Rj\ +\x13\x80#a\x01\x00\x1cs\x1c'\x01\xe0%\x80\xaa%\ +Z\xa7\xf7\xd6\x05\x10Q\xbe\xc6XXX\xe8Z\xa4\x15\ +1\x80R\xea\x22\x80\x87\xc5t\x00\xdf\x01l(\xa2\xcd\ +\xe5r9\xbb\xb9\xb9y\x0a\xf8}\xc4\xc7\xc6\xc6\xec\x5c\ +.\xd7\x01\xa0.\x95J\x15B\x94\x0a\x90\x06\xb0\xa7D\ +\x80\xe5\xe0D\xa3\xd1\x96\x86\x86\x86\x9f\xa5\x8aB\xafb\ +)\xe5\xceU\x9a\x03@r~~\xfe\xd6rE\xa1\x01\ +\xf27^\x05\xd0\xa7\xb5>T\xaa \xb0\x05\xc3\xc3\xc3\ +\x91X,\xf6\x19@\xe8\xbf\xdf_`\x16@B\x08\xf1\ +%L\x0cL \x1e\x8f\x1f\xa8\xa09\x00l\x01\xf0\x8c\ +\x99C\xa7\x1d ]\xd7=UA\xf3<\xda\x1d\xc7\xb9\ +\x1a&,\xda\x82t:\xbd\xd94\xcd\x19\x04\xcfv%\ +\x90%\xa26\xdb\xb6G\xfd\xe4\xa2\x09\x98\xa6yb\x8d\ +\xcc\x01\xc0b\xe6\xe7\xa3\xa3\xa3\xf1\xa2\x01P\xe4\xea\xad\ + \xea,\xcb\xba\xb7\xc6\x1e\xeb\xf8\xc7\xf0\x0b\xaf\xf0\x08\ +9XDN\x05\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x02\xc4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02AID\ +ATX\x85\xed\x94?h\x14A\x14\xc6\x7f3\xb9\xc3\ +\x22F\xec\xc5(\x8a\x08!\xa6\xd8}{\xb9\xc2F\x8b\ + \xd1XD\xb1\xd0\xc2N\x14\x14-\x04\x05\x1b[C\ +\xc4FP\x14D\x0bA\xb0\x11E\x12\x11A\x83`p\ +w\xef@;\x8dW\x98X\xf9\xa70g\xd0x;\xcf\ +\xc2\x5c8\x92K6\xe2Y\xb9\xbfn\xbe\xf7\x0d\xef\xe3\ +\xbda ###\xe3\x7f\xc7,\x14\xe28\xde\xa5\xaa\ +#\x0d\xd2c\x11\xe9\x03\x08\xc3\xf0\xbe1f\xa0^\xa8\ +\xd5j\xeb\x8b\xc5\xe2T\x14E\xaf\x80mu\xdd9\xd7\ +Y(\x14&\xc30\xdcd\x8cy7\xdf\xcc\x98\xbd\xbe\ +\xef?h\xecg\x17\x06\xf0}\x7fTD\x0cp\x12\xf8\ +T\xab\xd5\xf6\xd7k\xd5j\xf5\x00\xf0\xde\x183(\x22\ +\xa6X,N\x01\x88H\x8f1f\x0b0\xe3\x9c\xeb.\ +\x14\x0a\x93\x00A\x10T\xac\xb5\xeb\x80\xaf@\xcf\xc2\xe6\ +M\x034p\x05\xf8\x92\xcb\xe5N\xd5\x85\x8e\x8e\x8e\xe3\ +\xaa\xfa\xc1\xf3\xbc{M\x82O\xa8\xea5k\xedP\xa3\ +\xee\x9c;\x0f\xdc\x14\x91\xd7\xcd\x9a,ZA#q\x1c\ +\x0f\xaa\xea\xad|>\xbf\xd997\x9b$\xc9\x84\xb5v\ +\xc0\xf3\xbc\x17\xcd\xfc\xe5rym\x92$oT\xf5p\ +\x10\x04#a\x18n5\xc6\x8c%I\xd2\xd5\xdb\xdb\xfb\ +\xf9\x8f\x03\x00DQ4\x06\xbc\x04~\x02\x9d\x22r(\ +\xc5\x7f\x94\xdf\xeb\xeb\x01\xee\x02\xa3\x22ru)\xffr\ ++\x00@UO\x03\xc7\x80#mmm\xe7\xd2\xfc\x95\ +J\xe5:0\xab\xaa7\x80\x8ds\xe7%I\x9d\x00@\ +\x18\x86\xcf\x8c1U\x11\xd9\xbd\x12\x7f\x1c\xc7;U\xf5\ +\x89\xaa\xee\x08\x82\xe0\xe9_\x05(\x95J]\xce\xb9\xe7\ +@\xbb\xaa\x16\x83 (\xa7\xddQU\x1b\xc7qMD\ +R'\x9cK3$Ir\xd1\x183\x04l\xb0\xd6^\ +V\xd5\xed\xc6\x18M\xbb\xb7R\x96\x0d\x10\xc7\xf1\x1eU\ +\xed\x06\xf6Yk\xdb\x9dsoK\xa5\xd2A\xe0v\xab\ +\x02,9\xa2(\x8a\xf2\xaa:\x0c\x9c\x11\x91\x19\xcf\xf3\ +>\x02\x17Tux|||\xcd?\x0f\x00\x9c\x00f\ +|\xdf\xbfS\x17\xa6\xa7\xa7/\x01?r\xb9\xdc\xd9V\ +\x05X\xf4\x08\xa3(\xea\x03\x1e\xcd\x1b\x8c\x19\xf1}\xbf\ +\x7f\xae\xf6\x10\xe8o\xa8-\xfa\xdb\xa3(\xfa\x0e\xacj\ +\x90\xbe\x89\xc8\xeaV\x05\xce\xc8\xc8\xc8h9\xbf\x00o\ +0\xe5\x9d\xef\xad\xd2E\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x06)\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x05\xa6ID\ +ATX\x85\xed\x96m\x8cTg\x15\xc7\x7f\xe7\x99\x17\ +\x99*\x82\xb5\x94V\x8a\xa9)6MVg\x97y\xee\ +\xdd]\xd16`\x8b\xb41d\x1bJ\xb7~\xd1\x88M\ +\xacI\xa9IM|\x8d51\x8d\x89\xd8\xb4\x91T\x89\ +~\xb3\x06>8\x14VJ\xb4(\xb5\xdbVYw\xf6\ +>w\x06P\xa8M\x04\xabB\xb4\xad\xdbU\x1cv\x85\ +\x99y\x8e\x1f\xe6^\x9d\x1dv\x08D\x13\xfd\xd0\x93L\ +&\xf7\x9c\xff=\xe7\xf7\x9c\xe7\xed\xc2\x1b\xf6?6\xb9\ +\x1c\xb1s\xee&`DU\xd7\x8b\xc8\x0a`e\x12\xfa\ +\xa3\xaa\x9e\x16\x91\x83\xaa\xfa\xc30\x0c_\xfa\xaf\x02L\ +MM\x85\xc6\x98m\xc0\xba\x0e\xf7+\xc0\xab\x80\x02\xcb\ +\x93_j\xcf\x1ac>_*\x95\xdc\x7f\x04\xe0\x9c\xcb\ +\x01\xdb\x81O%\xda:\x90\x11\x91\xa2\xb5\xf6\xb7\x9d\xda\ +\xc9\xc9\xc9\xe5\xd9l\xf6v\xe0^\xe0f@Uu\x87\ +\x88<\x18\x04A\xe3\xb2\x01&&&\xae\xcc\xe7\xf3{\ +\x80\xb5\xc0o\x8c1[\xbd\xf7\xdfU\xd5\x03a\x18n\ +\xbd\x18x\x1c\xc7\x1bU\xf5;\xc0;\x80\xf1|>\x7f\ +W\xb1X\x9cYHk\x16r:\xe7riqU\xdd\ +[(\x14\xc2f\xb3\xd9\x04n0\xc6|\xf3b\xc5\x01\ +\xac\xb5\xfb\xf3\xf9\xfc{Tu?\xb0\xee\xfc\xf9\xf3{\ +\x92n^\x1a\x00\xed\xb6\xafU\xd5\xbd\xf5z\xfd\x9e\xbe\ +\xbe\xbe\xba\x88\xdc\x09\xfc\xba\xbb\xf5\xbd\xacX,\xce\xd4\ +\xeb\xf5M)\x84\x88<\xb6\x90\xee\x82)H\x16\x5c\x05\ +x\xd9{\xbf\xc9\x18\xf3&c\xcc[\xbc\xf7\xdf\x12\x91\ +\xa7\xad\xb5\x9f\xb9\x14\x80\xd4j\xb5\xda\xd2V\xab\xf5\x1a\ +\xed\xb5\x13Zk\xe3\xcex\xb6\xfb\x85d\xb5\x0b\xf0.\ +cL\x0d\xc0{\x0f\x80\xaa\xde\xe4\x9c\xdb\x04\x1c\x12\x91\ +\x83\xd9lvw\x7f\x7f\xff\xd9\x8b\x01x\xef\xdf\x0bd\ +\x00\xf1\xdeo\x03n\x9bW\xaf\xf3!\xd9\xe7\xebT\xd5\ +\x017\xe7r\xb9\xe5\xd6Z#\x22\xef\x06\x10\x91\xbbD\ +\xe4\xcb\xaaZW\xd5\xaf7\x1a\x8d\xd3q\x1c?>5\ +5uM/\x00U\xbdSD~\x99@\xdfZ\xa9T\ +n\xec\x09\x00\x8c$\xffO\x04A\xf0\x8b\xfe\xfe\xfeW\ +ED\xbd\xf7W\x02d2\x99\x8a\xb5vg\x18\x86\xf7\ +\x9d\x09,i4\x1a?\xf0\xde\x8fu\xd6H\ +m\x1e\xb1\x88\xac\x04\xea\x03\x03\x03\xa7\xe7Q\x1a\xf3w\ +U\xa5P(\xbc\x15x\x1d\xa0Z\xad\xbe\xaf\xd9l\x0a\ +0i\xad\xdd\x09\xec<|\xf8\xf0\x8as\xe7\xceYU\ +\xfd\xd9\xf1\xe3\xc7\xdf<77\xf7\x10\xb0mxx\xf8\ +\x0cp\xc69w\x16xgO\x00\xe0Z\xe0t\x97\x0f\ +c\xcct\xab\xd5\xa2\xd1h,\x03^NF\x925\xc6\ +\xbc\x10\xc7\xf1_\xe28~\x1a\xd8\x9d\xcb\xe5~\x92\xc2\ +\x1f;v\x0cU\xfd\x9c\x88<\xd9\x91\xea\x14\xed\xc3\xe9\ +\xdf\xb9\xbb\x8b\x01\x17\x1c\x9b\x03\x03\x03\xbf\x07\xce\x18c\ +\xfaS_\xa9T:D\xfb>\xb8JU?\xaa\xaaO\ +\xcd\xcd\xcd\xbd\xe2\x9c+GQ\xf4\xb1\x99\x99\x19\x09\xc3\ +\xf0\xfbA\x10\xccv\xa4j\xd2\xde\x11=\x01\xfe\x04,\ +\xeb\x06\x10\x11\x05\x8e\x02\x83\x1d>\xaf\xaa?\xee\x92.\ +\x05\xee\x16\x91'\x16-Z\xf4\xf3j\xb5zKW|\ +\x190\xdd\x13@D\xfe\x00,\xafV\xab\xf3\xda\x04\xa0\ +\xaa\x07\x80\x8d\xe5r\xb9s\x04\xfb\xbau\xc0\xac\x88\x04\ +A\x10\x0c\x94J\xa5\x17R\xa7s\xeeZ\xe0j\xe0\xc5\ +\x9e\x00\xde\xfb\x83I\xb1\x0fug\xcdd2c\xc05\ +\xabV\xadZ\x9b\xfa\x1a\x8d\xc6O\x81\xee\x83\xe8\x0a\xef\ +\xfdg\x01\xca\xe5r&\x8a\xa2\xfb\x92\x9cw$\xf1C\ +=\x01\xd2\x11y\xef\xb7t\x03\x94J\xa5\xe3\xc0si\ +r\x805k\xd6\xcc\x01\xcf$\x8f\xffH\xfd\x22r\x8f\ +s\xee\x81\xd1\xd1\xd1\x96\xaa\xfe\xaaV\xab-\x15\x91-\ +IlwO\x80\xe4K\xe6Y\x11\xb9\xc59wA\x17\ +T\xf5\x11`C\x14E[\xd3\x91\x89\xc8>@\x8d1\ +VU\xf7v\xc8\x1f\x8d\xa2\xe8\xfd\x83\x83\x83\x13\xaa\xba\ +\x0a\xf8\x80\x88z\x97\xef\x01\xa5\x89\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02\xde\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02[ID\ +ATX\x85\xed\x95\xb1k\x13Q\x1c\xc7?\xbf\xf38\ +\x8cPR\x8aB-\x82\xd8U\x08\xd8\xbc4\x10\x0e!\ +(\x82\xe8\xe0_ hE\x8b\x93E\x0b\xe2\xa0h\x87\ +\xd0*\x0e\xa2\x838X\xd0\xc5\xfe\x03\x22X;(\x0e\ +w\xaf7;\xe9P\x14\x1c\xa4\x95\x83\xe6l/\xf7\x1c\ +LC\x8di\x9b61:\xe4\xbb\xdc\xdd{\xbc\xdf\xe7\ +\xf3~w\x8f\x83n\xbai\x10\xdf\xf7/u\x8aeu\ +\x0a\xd4\x15\xf8o\x05\xecV\x0bh\xad?\x02\x87\xea\x86\ +KJ\xa9\x1bZ\xeb\xab\xc0\xbd\xba\xb9\xb7J\xa9\xa3k\ +\x0f\xed\xe8\xc0\x11\xc7q\xfaD\xe41`\x80\xd3++\ ++\x13\x00a\x18>\x12\x11\x05\xfc\x00J\x8e\xe3\xf4E\ +Qtj\xfd\xe2\x96\x05\x94R\xdf3\x99\xccb\xb9\x5c\ +\x1e\x07\x16\x80\xc9t:]\x01(\x16\x8b\x911\xa6\x04\ +|\x0a\xc3\xf0N&\x93Yt]7l\xab@\x10\x04\ +\x03A\x10\x0c\xb8\xae\x1b\x1acF\x81\xc3Q\x14]\x03\ +\x98\x9f\x9f?\x07\x1cK\x92d\xa4X,F\x8d\xd6\xb7\ +$\xe0y^\x7f\xa5R9\x1eE\x91\x00\xe4r\xb9\x97\ +\x22\xf2\xcc\x18sSk\xed\x1ac\xa6\x80\xfb\xc3\xc3\xc3\ +\xef7\xaa\xb1c\x01\xcf\xf3\xfaE\xe4\xc4\xea\xea\xeal\ +\xa1P\xf8\xbc6\x1e\xc7\xf1\x18\xb0\x04\xccV\xaf\xb76\ +\xab\xb3#\x81\x8d\xe0\x00\xf9|\xfe\x1bP\x02\x1c\xe0\xa1\ +Rj\xb9\xad\x02\x9b\xc1\x01\xe6\xe6\xe6v\x03\x17\xf9u\ +\x22\xaek\xad\xf7\xb6M`+8@OO\xcf\x04p\ +@DN\x02\xbd\xc0\x93\xb6\x084\x03\xf7<\xaf\x00\x8c\ +\x89\xc8\x95l6\xfb\x0a\xb8\x0d\x9c\xf1}\xfflK\x02\ +\xcd\xc0\xb5\xd6{,\xcb\x9a\x06\xde\x0c\x0d\x0dM\x03d\ +\xb3\xd9)\xe0\x9d\x88<\x08\x82\xe0\xe0\x8e\x04\x9a\x81W\ +s\x17\xd8\x17\xc7\xf1y\x111\x00\x22\x92\x18c.\x00\ +N\x92$\xcfgffvmK\xa0\xc9\x9d\x1b\xad\xb5\ +\x01.\x03\xbd\xb6m/\xf8\xbe?R\x9d\x1b\x15\x91\x0f\ +@\x0ap\x07\x07\x07c\xad\xb51\xc6\xd4\xb8\x1b\xfe\x8c\ +\x9a\xdd\xb9\xe38}\xf5c\xa9Tj\x19 \x9dN?\ +-\x97\xcb/\xea\xe7E$\xa9\xdd7*\xea\xfb\xfe8\ +\xf0\xb5\x89\xb6\xb7\x1c\xa9\xb6\xef\x8f\x18c\x10i\xe8\xd7\ +r\x94R\xb5\xc2\xbf\x11\xd6\xda\x9e$\xc9\xfe|>?\ +\xf9W\xe8u\xa9}\x0c\xeb\xdf\xb9eYK\x9d\x80\xd7\ +\x04\xb6q\xd4\xda/\xf0/\xe1\x00\xb6m\xdb\x16\xf0:\ +\x97\xcb}\xe94\xbc\x1b\x80\x9f\xe9?'\x1dQJ\xc0\ +9\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\xd0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03MID\ +ATX\x85\xed\x96\xcfo\x1bU\x10\xc7?\xb3\xbbv\ +\x88\x82\x88z\x03\x9aP\xaaR\x04\xb7\xd8\xbb\x1b\xe5o\ +\x08\x12q\xd5c+\x0e\xe5\x0f\xa0\x05\x9ap)BH\ +\xa8T\x04\x01\x823\x08\x10\x07T\x0a5`!q\xf1\ +\x05\x11'~\xceF\x91\xe8\x05AK1\xb4\xa7J\x04\ +!\xa5\x1b\xfb\x0d\x87]K\x91\xbd\xfe\x05\xb9\xb5s\xd9\ +\xd5\xce\xf7}\xe7\xfbf\xe7\xcd<\xb8o\xf7\xba\xc98\ +\xe0\xcd\xcd\xcd#\xd6\xda%\xe0\x19\xe0\x080\x93\xba\x9a\ +\xaaz\x1d\xa8\xa8jy~~\xfe\xf7\x03\x15P\xab\xd5\ +f\x5c\xd7\xbd \x22\xcf\x03\xee\x10\xb8\x05\xae\xb8\xae\xbb\ +\x5c(\x14n\xfco\x01\xf5z\xfd\xa4\x88|\x0cL\x01\ +wE\xe4+km\x19\x88\xf2\xf9|\x13 \x8e\xe3\x19\ +\x11\xf1\x81%\xa0\x04\xe4\x81\xbfU\xf5t\x18\x86_\xff\ +g\x01\xc6\x98\x97\x80\xb7R\xdc\xe5Qve\x8c9\x96\ +\xae9A\x92\x8d\xb3A\x10\xbc?\xb6\x80t\xe7\x97\x01\ ++\x22/\xfb\xbe\xff\xee\xa0\xc0\x19\xeb\x97E\xe4\x22\x80\ +\x88\x94|\xdf\xfffd\x01i\xb1\xfdD\x92\xf6\xb3A\ +\x10\xbc\xd7/\x90\xaa:\x22b\xb3|\xc6\x98\x15\xe0M\ +`\xc7q\x9c\xa7\x8b\xc5\xe2\x9f\xdd\x18'k\xa1\xb5\xf6\ +u`JU?\x1f\x14\xdc\x18\xf3Q\xa3\xd1\xf8\xb1\x9f\ +?\x08\x82K@\x19x\xc8Z\xfbZ\x16\xa6G\xc0\xfa\ +\xfa\xfaQ\xe04p\xd7u\xdd\x95~\xe4\x00\xaa\xfa\x03\ +\xf0\xfd \x8c\xeb\xba\xe7\x81=\xe0L\xadV\x9b\xe9\xf6\ +\xf7\x08p\x1c\xa7\x94~\xff\xa2X,\xfe\x96EZ\xad\ +V\xbd\xed\xed\xedC\x13\x13\x13_\xe6\xf3\xf9wT\xb5\ +o-\x15\x0a\x85\x9fI\xb2\xe0\xe6r\xb9\xa5Q\x04,\ +\xa6\xaf\xe5~\xa4\xd3\xd3\xd3O\xc6q|3\x8e\xe3;\ +q\x1c\xdfY[[;\xd4\x0f\x0b \x22e\x00U]\ +\xec\xf6\xf5\x08P\xd5'\x00\xda\xed\xb6\xe9GX,\x16\ +\xaf\x91t\xc1\x7f\x06\x05\xde\xc7\xd9\xe1:6P@\x9a\ +\xca\x87S\x01\xb7\x07\x91\x06A\xf0\x17\xd0\x1aE@\xab\ +\xd5\xeaT\xff\xe1\x81\x02DD\x01\x1d\x85t\x1c\xf3<\ +\xafS#=\xc75\xeb\x18\xde\x06\xc8\xe5r\x8f\x1c\x94\ +\x00\x11y4}\x1d\xde\x07D\xe4\x97\xf4\xe9\x1f\x94\x00\ +\xa0\xc3\xf5\xebP\x01@%}\x96\x0eP@\x87\xab\xd2\ +\xed\xc8:\x86WI\xfe\xd5\xc9(\x8a\x1e\x1f\x85\xdd\xf3\ +\xbc\x9e\xea\xeeX\x14E\xc7U\xf5Y\xa0\xd5j\xb5z\ +&c\x8f\x80t\xda}\x0aL\xb4\xdb\xedKCbW\ +\x80\xeb\x8e\xe3|W\xadV\x1f\xe8v\xaa\xaaXkW\ +\x81\x9c\xaa~\xb8\xb0\xb0\xd0\xec\xc6dv0c\xccc\ +\xc05`JD\xce\x8d;\x09\xf7\xf1\xbc\x02\x5c\x04v\ +\x80\xa7\x82 \xb8\xd5\x8d\xc9\x1cFA\x10\xdc\x14\x91\xe7\ +\x92M\xe8\xaa1\xe6\xc5q\x02\xab\xaa\xa4\xc1\xdf \x19\ +\xe7\xa7\xb2\x82\xc3\x90\x0bI\xbd^?'\x22o\x03\x22\ +\x22W\xac\xb5\xcba\x18\xf6T\xf2~\x8b\xa2\xe8\xb8\xb5\ +v5\xfd\xefVU_\x08\xc3\xf0\x83~\xf8\xa1W\xb2\ +F\xa3qBU?\x01\x1e\x04b\xe0*\xc9\x9c\xd8\x9c\ +\x9c\x9cl\x02\xec\xee\xee\xce\x92\x1c\xb5R\x1a8\x07\xec\ +\x88\xc8)\xdf\xf7\xbf\x1d\xc4?\xd2\xa5tkk\xeb\xf0\ +\xde\xde\xde\xab\x22r\x06\xf0\x86\xc0\xad\x88|\xa6\xaa+\ +\xfd\xd2>\xb6\x80\x8emll\xcc\x8a\xc8\x92\xe38\x8b\ +\xaaz\x14\x98%i\xddM\x92&S\xf1<\xaf<7\ +7\xf7\xc78\xbc\xf7\xed\xde\xb6\x7f\x01e\xe0CJ\xf6\ +&-\xdf\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\xce\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03KID\ +ATX\x85\xed\x96_h\x1cU\x14\xc6\x7f\xe7\xce\xe8\ +&\xca\xaa\xd8\x82\xda\x14i\xd4\x87B\x10v\xd9Y\x12\ +\x22mA\xa9oE*\x12P\x04\xf3 \x96J\x85V\ +\x14\x14|\xb0\xd8\xd0\x22\xa8\x05-\x8a\x0f>\x88\x14\x8c\ +\x04}\x11\xf1O\xbb\x82\xb8l\x983\xbb\x89\x10\xfa`\ +c\x9e\xd4\xdaB\x8b5\xc6\xe8\xee\xcc\xf1\xa1\xb3\x10\xb7\ +.\x99M\xf2\x98\xef\xe5\xde{\xcew\xbf\xf3\xcda\xee\ +\xdc\x81Mlb\x8d\x08\xc3\xf0qU\xadu\xc6U\xf5\ +L\x18\x86\xafg\xd5qk5\xb0\xb0\xb00\x05\x14\xa2\ +(\x1ai\xc7\xcc\xcc\x01\xbb\xcc\xec\xf4Zu{B\x18\ +\x86\xa7\xc30l\xb4\xd7\xf5z\xfd9U\xbd\xd4\x8b\xc6\ +\x9a:P\xa9T\xfa\x00\x16\x17\x17\x9f\x15\x91\x1fW\xa4\ +\xfe4\xb3W:\xf9f\xe6\xd2\xee\x5c\x07\xe9\xb5\xf8\xf4\ +\xf4\xf4\x16\xdf\xf7\xa7\xe6\xe7\xe7\x1f\x1a\x1b\x1b\x8b\x01T\ +\xf5~3+x\x9ew\xbeX,\xd6D\xc4\xdaF\xf3\ +\xf9\xfc[f6\xee\x9c{\xafT*\x1d\xe9\xd4\xeb\xb9\ +\x03\x9e\xe7\xbddf{\x06\x07\x07\xc7W\x84O\x8a\xc8\ +\x87I\x92TU\xf5\xdbj\xb5z;@>\x9f\xbf\x0c\ +\xec\xf5}\xff\xb1\xff+\xde\xb3\x81Z\xad\xb6\x1d8\x04\ + \x22\xaf\xcd\xce\xce\xde\x9c\xa6\x8e\xb59\x22\xb2;\x97\ +\xcb\x9dJ\x97[\x83 \xb8\xafX,~\xdeM\xb3'\ +\x03\xbe\xef\xbf\x0a\xf4\x01K\xc0]\xcdf\xf3\x10@\x10\ +\x04\x15\x11\xa9\xb6yf6V\xa9T\xfa\x82 XZ\ +M3\xb3\x01U\xdd\x09<\x05,\x89\xc8> \x01^\ +T\xd5[\x01\x92$9\xb6\x82\xeer\xb9\xdcMYt\ +3\x1b0\xb3\x09\xc07\xb3S\xa5R\xe9\xac\x88|\x0a\ +l1\xb3#\x00\xe5r\xf9\x0b J\xe9\xb3\xa3\xa3\xa3\ +\x97U\xf5\x07U\x8d\xc20<\xb0.\x03\xf5z=\x10\ +\x91\xfd\xc0U\x11i\x7f\xe5\x8e\x03\x88\xc8\xe1Z\xadv\ +K:\x9f\x00\xfep\xce\x1d\x04p\xce\xed\x03\xce9\xe7\ +NDQt>\xeb\xc3^\x07U\x9dTUS\xd5\xa3\ +\x1d\xf1\xaf\xd2\xf8\x0b\x00f&\xaazw/\xda\xabv\ +@U\xef\x05\x1e\x05\xae\x00ov\xa4\x8f\xa7\xe3\xe1\xb9\ +\xb9\xb9\x1bE\xc4DdBUOl\x98\x01\xe0 \xe0\ +\x01\xef\x07A\xf0\xfb\xcaD\x10\x04\x15`\x1a\x18X^\ +^\xde\x0f\xd0j\xb5>\x02\x9eW\xd5\xf5\xbf\x84\xaaz\ +\x03\xf0$\xd0\xf4}\xff\xed.\xb47\x00\x92$\x19\x07\ +\x18\x1e\x1e\xfe\x12\xf8\xcd\xcc:\xbb\xd5\xbb\x013\xdb\x03\ +\xdc\x01|R(\x14~\xeeB\xfb\x0c\xb8 \x22{U\ +u+@\x1c\xc7O\x03\xbf\xae\xdb\x80\x88<\x98\x8eS\ +\xdd8A\x104\x81I\xc0\x13\x91]p\xad\x0b\xe5r\ +\xf9h\xb7=\x99\x0d\x98\xd9\x9d\x00q\x1c\xff\xb4\x0ao\ +6\x9dn\xcbR4\xb3\x01\x11\xb9\x08\xe0y\xde\xd0*\ +:;\x01\x92$\xb9\xb0\xa1\x06\x9cs_\xa7\xc2\xcft\ +\xbb\xcf\x1b\x8d\xc6m\x22\xf2\x04\xf0\xb7\x88|\xb3\xa1\x06\ +\x8a\xc5\xe2Y\x11\xa9\x8a\xc8\xee(\x8aN\xa6\xa7\xe2?\ +\xc5\xe38\xfe\x18\x18\x00>\xe8<\xa6Y\xb0\xea\x0fI\ +\xa3\xd1\xd8\x11\xc7\xf1w\xc0v\xe0\x9c\x99M:\xe7~\ +1\xb3\x1d\x5c\xbb\x9c\xb6\x01\xdf\x03\x0fg\xb9\xfdz6\ +\x000333\xd0j\xb5\xde\x01\x1e\xe9\xd8\xf3\x17\xf0\ +n\x7f\x7f\xff\xcbCCC\xff\xf4Z<\xb3\x816\xc2\ +0\xbc\x07x\xc09\xd7\x0f\x5cj6\x9bgFFF\ +\xae\xae\xa5\xf0&6\xd1\xc6\xbf\xac\xa7S\x80%\x19\x86\ +p\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xa9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01&ID\ +ATX\x85\xed\x951J\x04A\x10E\xab\x0a1\xf4\ +\x10^`\x93\xc5Cx\x02\x11DX\x18\xba\x13M\xc4\ +\x8d\x07#\x0d\x04w\xa2\xa9\xe9@\x17A\x97\xb9\x80\x18\ +y\x00\x13o`\xa8\x87p\xaaLF0\x18\xb6k\x9a\ +5\xb2_\xfc\xf9\xf5\x06\xfa3\x00\x99L&\x931P\ +\x96\xe5\x163\x7f\x86\x10N-yf\x9e3\xf3\x87\xaa\ +R,\x1b\x0d\xf4\x02_\xaa\xfa\xac\xaa7!\x84\xb3u\ +\xd9\xba\xaeO\x10\xf1RU_\x10Qb\xddh\x11\xf8\ +U\xbe$\xa2#D\xe2\xbf\x1d\x86S_\xfc\xf7\x0c\xa1\xcb\ +\xc0\x85.&V\x8d\x09\x0a}k \x0c\xa7\x96\xc1\xbd\ +\xf7\xf8\xd8\xee\xfd\xee\xe0\x00\xc6\x18J\xa5\x12\xc6\x84\x17\ +\x81[]\x9ax9\x8e+\xef\x0e(\xc2\xe9k\x22\xf2\ +\xc9\x01\xc1\xaf\x85\xe1t\xcfw333\xac\xad\xd50\ +&|K\x84[\xc03@FD~\x1bhm\x9ds\ +\x9d\xe5\xf8V\xb5\xea\xba\xae\xef\x00\x96\x96\x96\xfa\xd2\x92\ +\xb5\xc9\x5c\x1c\xeb\x85C\x9dXK\xa5\xbb\x1d\x10\x1b\xaa\ +\xd5\x96j\xf5.\xc0\xfa\xfa\xfa\x93;\x96\xab\xdea|\ +\xfc\x8f\xd4\xbd{cZ\xaf\xff\x15\x9d8\x91i\x86\xe1\ +\xe4\x93\xfdyP]\x7f\xa4=\xb2Q\xda?c-]\ +]\x0f\xeb%\xbc\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x03c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xe0ID\ +ATX\x85\xed\x96;L\x14Q\x14\x86\xff\x7fv\x06\ +X\x0a41FI|\x14t\xaef\xb3\xcc\xec\x84\xe8\ +J\x04\x84\xa0\xa8\x89!R\xf9J,h,\xb4\xf0Q\ +Z\x19_\x95\xe5\xc6\xc6D\x1aL\xb4@\x12\x08\x02\x89\ +&\x0a\xcc\xdd-HV;\x1a\x0a_\x0dd5\xebn\ +\x96{,\x1c\x12\xc4]v\xd8@\xb4\xe0of\xee\xc9\ +\x7f\xcf\xf9f\xee9\x93\x01\xb6\xb4\xa5\x7f,nv\x01\ +\x111\xd2\xe9tLk}\x9ad\xeb\xdc\xdc\x5cg_\ +_\xdf\xd2\xa6\x02(\xa5\xeaIvh\xadO\x91<\x03\ +`\xb7\x0f\x93\x8c\xc7\xe3\xfd+\xbd\xe6f\x00\x90\xdc/\ +\x22wI\x1e\x5c\x197\x0c\xe3\xe5j\xafQ*\x81R\ +J\x94R\xf7\xaa\x05\xb0m\xfb\xa3\x88\xdcZ\x15^\xac\ +\xab\xab\x9b\x08\x04\xe0\xab\xd7\xf3\xbc;\xd5\x00(\xa5\x0e\ +\x91\x1c\xf0\x97\xe2_\x87#\x91H!0\x80\xd6\xfa(\ +\xc9s\xeb}\x13SSS{\x00\x0c\x03\xd8\x0e`\x81\ +\xe4q\x11y/\x22/J\xf9\xcb\x02\xb8\xae\xfb\xb9X\ +,\xb6\x038\x1d\x14bzzz\x87i\x9ac\x00\xf6\ +\x02\x98\xd7Z'l\xdb\x9e\x00p\xbe\xbe\xbe~\xb4\xd4\ +\x9e\x92S\xa0\x94\x12\xc7q\xe8?\xd1.\xd34\xc7\x01\ +\xbcr\x1c\xe7v\xb9\xe2~\xe7\x8f\x89\xc8a\x00\x1f\xb4\ +\xd6\xdd\xae\xeb\xceW\x82^\xab\x07\x00\x00---_\ +,\xcbj\x07\xd0\x93J\xa5\xee\x97\xf2LNN\xd6\x01\ +\x18\x12\x91\xc3$\xdf\x85B\xa1#A\x8a\x07\x02\x00\x80\ +h4\xfa\xd5\xb2\xac\x0e\x119\xb1\x1abpp0\xd4\ +\xd0\xd0\xf0\x0c@;\x80\xc9\x5c.\xd7\x1d\x8b\xc5\x16\x82\ +\xe4\x0d\x0c\xb0\x0ca\x18\xc6\x1f\x10\x22\xc2\xa6\xa6\xa6\xa4\ +\x88\xf4\x8a\xc8P6\x9b=\x99H$\xb2As\x02\x01\ +z`\xb5\xd2\xe9\xf4N\xad\xf5k\x92#\x00,\x11\xb9\ +\x0e` \x9b\xcd^nkk+\xae\xa78P\xc5\x97\ +\xb0\xb9\xb9\xf9\xdb\xec\xec\xec\xb1|>\x9f!\xd9\x08\xe0\ +\xb1m\xdb\xd7HJ\xc5\xcd%\x14\xf8\x08V\xaaP(\ +\x5c!\xd9(\x22\x9fH\xfe\xac\xb6xU\x00J\xa9K\ +\x00\xee\x03\xb8a\x9a\xe6\x01\x00m\xe5\xa6c\xc3\x01R\ +\xa9\xd4Y\x00I\x00\xfd\x8e\xe3<\x8a\xc5b\x0b\x86a\ +t\x89\xc81\xcf\xf3\x1el(\x80\xe7yW\x95R\xfb\ +V\xac;E\xe4)\xc9\x0b\x8e\xe3\xc4\x88\x88\xbc\x0d\x0a\x11\xa8\x07D\xa4\x96\xe4\ +\xd9J>\xc7q\x16\xc3\xe1p\xa7a\x18n\xd0\xe3\x08\ +\xdc\x84$\xfbgff\xf6V\xf2E\x22\x91\xef\xa6i\ +\xf6\x90\x8c\x07\x81X\xcf\x14\x98\xa1P\xe8L\x10c4\ +\x1a\xfdaY\xd6)\x92q\xa5\xd4\xc3\xb5\xbc\x7f\xf5@\ +&\x93\xa9\xc9\xe5r\xf9u\x80UT8\x1c\xae-\xf5\ +7TV\x99L\xa6f#\x01\xb6\xf4_\xeb\x17\xf7\x86\ +6\x02\xd4\xa2\x10\x9c\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x04\x22\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x9fID\ +ATX\x85\xed\x96Oh\x1cU\x1c\xc7?\xbf\x99\xdd\ +\x95\xa4\xe2M\xa4iB\x12\x9a(zIvg&\xec\ +]O)d7V\xf4\xa0\x07Q\xf0jDMU0\ +\x14\x0fb\xad\x15\xa5\x9e\x05\x95\x1eLZ\xec\xaa\x11\xc1\ +\x83'!\xc9\xce\xec\xa6\x87\x1c\x84P\xff\xa5V\x0f^\ +\x1a\x8ai2\xf3~\x1ef\x0a\xdb\xdd\x99\xec\xa6z3\ +\xdf\xcb>\xf6}\xdf\xef\xf7y\xbfy\xf3~\x03\x87\xfa\ +\xbfK\x0ebn4\x1a\xc3\xc6\x98\x0ap\x02\x18\x06\x06\ +\x93\xa9-U\xfd\x09XV\xd5\xda\xd4\xd4\xd4o\xff)\ +\xc0\xca\xca\xca\xa0m\xdbo\x8a\xc8\xf3\x80\xdd\xc5n\x80\ +K\xb6m\xcf\x17\x8b\xc5\x9f\xff5@\xbd^?)\x22\ +\x9f\x00G\x80[\x22\xf2\x851\xa6\x064\x0b\x85\xc2\x16\ +\xc0\xee\xee\xee\xa0\x888@\x05\xa8\x02\x05`[U\x9f\ +\xf1<\xef\xcb\xbb\x06\xf0}\xffe\xe0l\xe2[\xeae\ +W\xbe\xef\x1fO\xd6\xcc\x12Wc\xceu\xdd\xf3\x07\x06\ +Hv\xbe\x04\x18\x11y\xc5q\x9c\x0f\xf6K\xdc\xae \ +\x08^U\xd5w\x00D\xa4\xea8\xceW=\x03$\x87\ +m\x83\xb8\xecs\xae\xeb~x\x90\xe4\xb7U\xaf\xd7\xe7\ +E\xe4\x0cp\xc3\xb2\xac\x87K\xa5\xd2\xef\xed\x1e+m\ +\xa11\xe6-\xe0\x88\xaa~~\xb7\xc9\x01<\xcf{\x17\ +\xb8\x0c\xdcg\x8c9\x9d\xe6\xe9\xa8\xc0\xea\xea\xea\xa8m\ +\xdb\x9b\xc0\x9eeY\x0f\x95J\xa5_\xda=\xbe\xef\xf7\ +\x8b\xc8\x1b\xaa\xfa\x14p?\xb0\xa9\xaa\xaf{\x9e\xf7]\ +\xbb7\x08\x821U\xdd\x00\xec0\x0cG\xca\xe5\xf2V\ +\xeb|G\x05,\xcb\xaa&\xff_LK\x9e\xe8[U\ +}MD\xae\x00\x8b\xc0\xb0\x88|\xd3h4\x1ei7\ +:\x8e\xb3\x09\xd4\x00;\x9f\xcfW:\xf2\xa5\x00L'\ +\xc3ZFrT\xf5\x9c\xaa\xce8\x8e\xf3\x84\xeb\xba/\ +\x00\xcf\x02\xb9(\x8af\xd3\xfc\x22RK\xd6M\xb7\xcf\ +\xe5R\x82\x8f\x01DQ\xe4g\x01x\x9ew\x07\x9c\x88\ +\x14T\x15\x11\xf9;\xcdo\x8c\xf1E\x04\xe0x\xfb\x5c\ +\xda!| \x01\xf8#\x0b\xa0U\xcdfs\x5cU\xcf\ +\x03\x7f\x85ax!\xcd\xd3\xdf\xdf\x7f-\x19\x1e\xeb\x05\ +\xa0g5\x1a\x8d\x81(\x8a\xbe\x07\xfa\x80\x13\xe5r\xf9\ +\xcf4\xdf\xf6\xf6\xf6\xed<\xa6\x17\x80\xeb\x00\xf9|\xfe\ +h7\x00U]\x00\x06Tu\xc6u\xdd\xd5,_.\ +\x97\x1bH\x86\xdd\xef\x01\x11\xb9\x9a\xfc:=\x00<\x08\ +\x5c\xf1<\xef\x87\xfd|-\xb1\xaev\xc0\xa5\xf8\x97\x81\ +\xc7\x88\x9b\xca\xd2~\x81\x1d\xc7y\xb4\x1bd\x02Zm\ +\x89}\x87\xd2^\xc3\xcb\xc4\xcf\xead\xb3\xd9\x1c\xc9\x0a\ +\xba\xb1\xb1Q\xf0}\xff\xd7 \x08~\x5c\x5c\x5c\xccl\ +\xd1A\x10\x8c\x11w\xc90\x0c\xc3\x8e\xce\xd8\x01\x90t\ +\xbb\xcf\x80{\xa2(:\x93\x158\x0c\xc3\xbc\x88\x1c\x05\ +F\x8a\xc5bZ%\x01P\xd5\xf7\x80\xbc\xaa~\xdc~\ +\x0b\xa6\x02$Z\x00n\x02O\x06A0\x97f\x98\x98\ +\x98\xb8i\x8c\x19\xb5,kd||\xfcV\x9a\xc7\xf7\ +\xfdS\xc4\xbb\xbf!\x22\xa7\xd3<\x99\xed8\x08\x82\xc7\ +U\xf5\x22\xf1\xe3\x98w]\xf7\xfd,\xef>\xc9\xdf\x06\ +\x10\x91\x8a\xe38_\x1f\x08\x00\xa0^\xaf\xbf$\x22\xe7\ +\xe2\x18r\xc9\x183\xefy^\xc7InU\xb3\xd9\x1c\ +\x8f\xa2\xe8,\xf1\xce\x8d\xaa\xbe\xe8y\xdeGY\xfe\xae\ +\x9fdA\x10\xcc\xaa\xea\xa7\xc0\xbd\xc0.q{\xad\x01\ +\x8d\xbe\xbe\xbe-\x80\x9d\x9d\x9d!\xc0\x01\xaa\xaa:\x03\ +\xe4\x89\xcb\xfet\xd6\xce{\x06\x00X__?\xb6\xb7\ +\xb7\xb7 \x22\xcf\x91\xfe\xea\xb6\xca\x88\xc8\x05U=\xe5\ +\xba\xee\xf5n\xb1\x0f\xf4Y\xbe\xb6\xb66$\x22\x15\xcb\ +\xb2\xa6Uu\x14\x18\x02\x14\xd8\x22\xbed\x96s\xb9\x5c\ +mrr\xf2\xda\xbe\x81\x0eu\xa8\x16\xfd\x03\x06\x08k\ +\xa5W\x9e\x0b\xc5\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x03R\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xcfID\ +ATX\x85\xed\x95\xcfk\x5cU\x14\xc7?\xdf;\xf5\ +\x9a\x11\x92F\xd3\x22j\xd5\x22d!\x81Qx\xef\x91\ +L\x9d\x85C\x97\xfe\x80 \xba\x11\x047\xbar\xe7\xc2\ +\xf6\x1fPA\x5c\xb8\xb3\x94\xe2\xb6\xa1P\x8a\x0b\xb1(\ +\xe3\x8f\xe2f\xee\x9b,\xcaP\x11-)\xa2 \xa6I\ +\xe3`2\xceL\xeeq\xd1\x09\xc4!\x9di\xa3\xd2\xcd\ +|\xe0m\xde=\xe7\xdc\xcf=\xf7=\x0e\x8c\x19s\x97\ +\xd1\xb0\xc5z\xbd^\x97\xb4\x06\x5c\x91\xf4\xe5\xd4\xd4\xd4\ +\xc5\xd9\xd9\xd9\xbf\x86\xe5\x84\x10\xe6\x81EI\xa5\x18\xe3\ +\xe1,\xcb\xb2a\xf1n\xa8\x9d\x94\x00\x1b\x92\x9e6\xb3\ +\xb3\x1b\x1b\x1b+!\x84\xb7\x96\x96\x96\x0a{\xc8\xbe\x16\ +B\xb8\x02|\x03T\xccl\xad\x9f?\x94=;\x10B\ +\xf8\x1d\x98\x06\x0e$I\xe2$\xd9\xf2\xf2\xf2t\xaf\xd7\ +{C\xd2II\xf5n\xb7\xfb\xd2\xc2\xc2\xc2\x1f\x8dF\ +\xe3p\x8c\xf1\x13\xa0\x02\xbc\xeb\xbd\xff\xb8T*\xad\x9b\ +\x99\xf2<\x8f@\x07\xf8-M\xd3\xc7F\x0a\xf47.\ +\x00\xd3I\x92\x14\xf2<\xdfN\x92\xa4 \xc9v\x9d\xf4\ +\x09I\x17\x80_:\x9d\xce\xa2\xf7\xfe;\xa0\x08<\x97\ +\xa6\xe9O;q}\x81\xed\x9d:\xc0*\xd0\x1e\x14\x19\ +\xbc\x82\x99$If\x86\xb5,\xcb\xb2\xab\xedv\xfb\x98\ +\x99\xcdx\xef\xaf\x01\x13\xde\xfb\xf2\xee\xcd\xf7\x22I\x92\ +\x07\x81#\x83\xef\x87~\x03\xb7\xa2R\xa9\xb4b\x8c\xaf\ +\x02\x0f\x00\xaf\x94J\xa5\xf5\xfd\xd4\xd9\xb7\x00\xc0\xfc\xfc\ +\xfc\x0f@'M\xd3\xcb\xfb\xad\xf1\xaf\x04\xfe+\xc6\x02\ +c\x81\xb1\xc0H\x81<\xcf\x8b\xff\xa7\xc0\x81\xdb\x88Y\ +\x0d!\xd4\x80\xa5V\xabu\xb6Z\xad\xb6o\x15hf\ +.\x84p\xdc9\xf7b\x9e\xe7\xc7oG`\xd48>\ +&\xe9d_\xf4\xcc\xe4\xe4\xe4\xcf!\x84w\x9a\xcd\xa6\ +\xdf\x1dW\xab\xd5&B\x08o\xe7y\xbe\x22\xe9\xf3\x18\ +\xe3\x93\x92N9\xe7\x9e\x19%08\x0dc\xa7\xd39\ +\xe4\xbd_\x05\xaeI\xfa\x11\xb8\xd8\xeb\xf5\xce9\xe7$\ +\xe9=\xe0e\xe0{\xe0y\xe0\xb2s\xae\x1cc\xbc\x00\ +<\x0e\x9c7\xb3\x13\x92\x1e\x96\xf4\x82\x99\x95\x81G\xb8\ +9\x84\xee\x07\xd6\xd34\xfd\xc7\xa1\x07\xaf`\xd3{\x7f\ +]\xd2\x9f1\xc6\x82\xa4\xa3\xc0\x89B\xa1\xf0\xbe\xa4K\ +f\xf6\xa1\xa4\xcf\xcc\xec\x14\xf0-pO\x8c\xf1k\xe0\ +>Io\x9a\xd9\x0c\xf0\x05p\xc4\xccn\x00;Cj\ +\x13\xb8\x01\xac\x0dv`P`\xb6X,^\x9f\x9b\x9b\ +\xeb4\x9bM\xbf\xb5\xb5\xf5\xa8s\xee(\xb0\xd8\x7f\xce\ +\x9b\xd9\xa6$gf\x0f\xf5s\x0e\x02\x11\xf8\xc8\xcc\xee\ +\x95t\x15\xf8\xc09\xf7i\x8cq\xa5\xd5j\xfdZ\xad\ +V{\xb5Zm\xa2X,\x1e\x1cz\x05\xa3h4\x1a\ +i\x8c\xf14\xf0\xd4\x1e\xcb_u\xbb\xdd\xd7\xcb\xe5\xf2\ +\xca\x9d\xd4\xbc#\x81\x1d\xfa\x7fE\x85\x9b\x1d\xdc6\xb3\ +KY\x96=\xbb\x9fZc\xc6\xdcu\xfe\x06\xad\xe2\x22\ +\x18\x81^@\xbe\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x02\xb3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x020ID\ +ATX\x85\xed\x96Mk\x13Q\x14\x86\x9f3\x13\x83\ + \xe2\xa6\x8a\x0b\x8d\xba\xaan\x22\x99\xccd0\x0a\x15\ +t#\xfe\x01\x11\x05\xf7\x22\xb4\x0b]\x0a]\xb8r!\ +\xdd\x89X\x15\xa5\xfe\x02E,\xd4\x85\xa0$\x93\xdb\x94\ +\x11\xeb\x07X\xa5\x8a(\x88\x9f\x11Z\x9aL\x8e\x9b\x09\ +\x84\xb4\x8bLM\xdc\x98wu\xee9g\xde\xf7\xe1r\ +\x17\x03\x03\x0d\xf4\xbfK\xd6\xf3Q\x10\x04;m\xdb\x1e\ +S\xd5a\xe0\x8d\xaaNx\x9e\xf7\xf6\x9f\x00T*\x95\ +\x83\x22r\x1f\xd8\xd2\xd6\xae\xa9\xea1\xcf\xf3\x9e\xf4\x15\ + \x0c\xc3m\xf5z\xfd9\xb0u\x8d\xf1g\xdb\xb6\xf7\ +\xe5r\xb9\x1fI<\xad$\xcb\xf5z}\xbc-\xfc\x91\ +\xaa\x8e\x03\x1f\xe3\xf3\xf6F\xa31\x9a\xc4\x0f\x12\xdc\x80\ +1f\x08\xf8\x00l\x04\xee\xe6\xf3\xf9\xd3\x22\xd24\xc6\ +\xec\x05B \x0d,\xba\xae\xbb;\x09@\x92\x1b8\x1e\ +\x87\xff\x5cYY9'\x22M\x00\xd7u_\x01\xd3\xf1\ +\xce\xaer\xb9\xbc\xa7/\x00\x22r$.o\x17\x8b\xc5\ +o\x00\xf3\xf3\xf3i\x00U}\xd9\xdaK\xa5R#}\ +\x01P\xd5\xfdq\xf9\xb0\xd5[ZZ\x9a2\xc6\xa8\x88\ +\x9co\xdb\xbbi\x8c\xd1 \x08\x8a=\x05\x002\x00Q\ +\x14\x95Z\x8d(\x8a.\x00\xcbk\xecN\x17\x0a\x85\xa7\ +=\x03PU\x016\x035\xdf\xf7\xbf\xb6\xfa\xbe\xef\xbf\ +\x03&V\x99Z\xd6\xa5n|\xbb\x06hS\xad\xb3\x11\ +E\xd1e\xe0w\x1b\xec\x8c\xe38\x8f{\x0a \x22\x0a\ +\xfc\x026t\xce\xe2\x1b\x99\x8c\x8f\xcb\xc0\xd9n\xc3\xbb\ +\x06\x88\xf5\x1e\x18\x0a\xc3p\xd3*\x13\xcb\xba\x16\x97c\ +\x9e\xe7\xbd\xee\x0b\x80\x88<\x03\xa4\xd1hd:g\x8e\ +\xe3\xbc\x10\x91S\xae\xeb^M\x12\x9e\x08@Ug\xe2\ +\xd2_k\x9e\xcf\xe7\xa7\x92\x86'\x02\x88\xa2\xe8\x1e\xb0\ +\xac\xaa'\xd7\x13\xf4\xd7\x00\xf1c\xbb\x05\x1c\xadT*\ +\x87\xdbg\xc6\x98\xeb\xc6\x18\x9d\x9d\x9d=\xd37\x00\x00\ +\xcb\xb2.\x02_D\xe4\x861&\x03\x10\x04\x81\x07\x9c\ +\x00\xaa\x0b\x0b\x0bw\x92\x02$\xfe!\xa9V\xab\x07\x9a\ +\xcd\xe6\x03\xa0\x09\xcc\x01#\xc0'\xcb\xb2\x0e9\x8e\xb3\ +\xd8w\x00\x80R\xa9\xb4#\x95J\x8d\x02\xc3\xc0\x5c:\ +\x9d\xbe\x92\xcdf\xbf\xaf\xc7k\xa0\x81\x06\xfa\x03\xd7\x95\ +\xc5&\x99\x10\xcc\xf8\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x03\x85\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\x02ID\ +ATX\x85\xed\x95\xddk\x1ce\x14\xc6\x7f\xe7\x9d]\ +t[7\x0ab\xa1H\xc5(*\x120tg&\xa4\ +P\x84^4\x0a\x0a^\xa8\xc1\x82\xd5\x94\x96\x8aJo\ +*\xf6\xe3\x1f\xe8U?,\xb4 \x08j\x8b7\x06i\ +\x05\xaf\x14J\x10\xa3dv\xde\x19\x13$Bo\x0a~\ +\x14/*\x85\x82d!\x19\xde\xd3\x8b\xce\xda\xdddw\ +\x93\xddn(\x85>7\xc3y\xce3\xe7\ +\x03\xfc\xa0\xaa\x9f\x88\x88\x16\x8b\xc5w\x80\xef\xfbn \ +\x1f\xf5\xb9z\xac\xaaG\x80\xfd\xc0\xbf\xaa\xfa\x86\x88\xec\ +\xb1\xd6\xfe\xa6\xaa\x07\xb2,\xfb\xa8\xef\x06\x16\x16\x16\xc6\ +\x81\x9dq\x1co\x05\x08\xc3\xf0\xb2snXD6\x89\ +\xc8\xcf\xc0\xfb\xc0\xefY\x96\x85\xa3\xa3\xa3\x7fwc`\ +M\xbb@D&\xf2\xe7>\xe0C\x80\x91\x91\x91\xbf\xe8\ +b\xb5\xb7\xc3\xaa\x13\x88\xa2h\x10\xd8\x9e\x87\xbb\xa7\xa7\ +\xa7\xcbk)\x9c$\xc9\x0b}1P(\x14\xf6r\xfb\ +\xc4,\x97J\xa5\xb7\x96k&''=k\xed+\x8d\ +\x9cs\xee\xbf$IN\xce\xcd\xcdm\xec\xd9\x80\xaa\x1a\ +U\xdd\xbd\x8c\xfb`\xb9npp\xf08\xf0m\x9a\xa6\ +\xdb\xea\x5c\x18\x86W\x80\x8bKKK\xd3I\x92<\xdf\ +\xaeG\xc7\xbb\xc0Z;F\x8bme\x8c\x09+\x95\x8a\ +\x05H\x92dBU\xbf\xc8SW\x80J\x10\x047\x1a\ +j\xbc\x0b\x9c\x16\x91\xfd\xaa\xba5\x08\x82\xa3M\xb5:\ +\x19\x00&Z\x91\xce\xb9\xf7\xf2\xe2\xdbU\xf5\xd3\x86\xd4\ +S\xc0g\x8d\xda \x08\xce\xa9\xeaYU\xfd\x1a84\ +;;\xfb\xf8\x9a\x0cXk\x1f\x06^k\x93\xde\x95\xa6\ +\xe90p\x01x`Y\xee\xcd\xfc\xab\xff\x87\x88\xd45\ +&\xcb\xb2\xa65\xd4i\x02\xbb\x80\x0dmr\x1b\x9ds\ +\xbf\x00\x8f\xb5\xc9\x9f\x89\xa2\xe8\xd9z\xe0\xfb\xfe\xc7\xc6\ +\x98PU\x8f\xa9j\xd8d\xae]wkm\x04\x8ct\ +0\xb8\x1a\xd2R\xa9\xb4mhhh\xb1\x93\xa8\xe5\x04\ +\xe28~\xee\x0e\x9b\x03Tj\xb5\xda\xb1\xd5D-\x0d\ +\xe4'^?p0I\x92W;\x09V\xfc\x82\xa9\xa9\ +\xa9B\xb9\x5c\xfe\x13\xd8\xdcB\xdf\x0b\xae\x01\xc3A\x10\ +\xfc\xd3*\xb9b\x02\x03\x03\x03/\xf7\xb19\xdcZ\xa8\ +_\xaaj\xcbi\xaf \x9ds{\xfa\xd8\xbc\x8e\xb14\ +M[^\xd3M\xbf \x8a\xa2G=\xcf\xbb\xca\xca\xbd\ +\xdd\x0f,\x89\xc8\x8b\xbe\xef\xcf4\x92M\x13\xf0<\xef\ +\xeduj\x0ePT\xd5\xaffff\x06\xda\x1a\xa0\xcd\ +\xd1\xdbG<],\x16\xcf\xacs\x8f\xfb\xb8\xc7p\x13\ +\xaf\x92\x1d\xa6\x0a\xb6<\x11\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\xaa\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02'ID\ +ATX\x85\xed\x96?\x88\xd4@\x14\xc6\xbf\xd9\xec*\ +\xab\xe7\x0a\xca\x81\x8b \xae\x82b\xe5\x1f\x82(n\xa9\ +\x22h\x1d\x14\x15\x22\x0a\x82\x95hk\xa1pge\xb9\ +\xc5\xc1\x81\xa8\x9c\x88[\x88\xa5h\xb1\x9dl\xc8\xcc4\ +\x12\xd0b\xddN\x1b\xb19\xdc\xdd\xe6\xe6\xb30\xc1\x10\ +\xb3\x7fr\x97c\x11\xf6kf\xe6}/y\xbf\xbc\x0c\ +\x93\x003\xcd4\xd3\xff\x22)eu3\xee[\x98$\ +)\x08\x829\x00\xcf\xa7\x06\xd0\xeb\xf5\x1c\x00\xe7|\xdf\ +?>\x15\x00!\x84\x1b\x8e\xb7\xf2\x06\x10\xe3\x12<\xcf\ +\xabY\x96\xd5\x09sW\x07\x83\xc1\xdez\xbd\xbe\x9a\x17\ +\xc0\xd8\x0e\x14\x8b\xc5\x9b\xf8\x0b\xba\xa3\x5c._N\xe6\ +4\x9bMKJy1w\x00\x92\x05\x92\xd7\x13\xb1;\ +\xc9\xbcZ\xad\xf6\x04\xc0[\xad\xf5\xe9\x5c\x01\x94Rg\ +\x01\xecK\x84\x8fi\xad\xedX\x8e+\x84\xb8\x0b\xa0h\ +\x8cY\x91R\xee\xcc\x0d\x00\x80\x9b\x164\xc6\xdc\x06\x00\ +)e\x9d\xe4R\xcc:\x00`9\x0b\xc0\xd0M\x18>\ +\xc97\x00\xdbR\xec_\x85B\xe1\x8c1\xe6\x03\x80\xf9\ +\x14\xdf\xb5m{\xa2scT\x07\xae\xc4\x8a\x7f\x01\xf0\ +5\xe6m7\xc6|\x1cR\x1c\x00\x1a\x9e\xe7\x1d\xda(\ +\xc0\x8dhB\xf2\x91\x10b!\xe1\xa7u&\xd2\x9ce\ +Y\xaf\x82 \xd8\xb2.\x00\xdf\xf7\x0f\x038\x19.\x03\ +\xdb\xb6_w:\x9d\x17\xf8\xd3\x89Iu\xa2\xdf\xef?\ +^\x17@\xfc\xc4#\xf9P\x08a\x1c\xc7Y#9\xf6\ +\x86\x09\xddSJ]\xca\x04\xd0j\xb5\x8a\x00\xae\x86\xcb\ +O\xb6m\xbf\x89\xbcn\xb7\xfb\x12\xc0\xe7\x0c\x00\x82\xe4\ +\xd3Q_\xd2\x7f\x00*\x95\xca\x05\x00U\x00 \xf9@\ +\x08a\x22\xcfq\x9c\xb5\x94\xbd0N\xf3\x00\x9e\x91L\ +\xedvZ\xd0\x0d\xc7\xef\x00\xfaJ\xa9#\x91\xa1\xb5>\ +\x0a\xe0\x07\x80\x9f\x19!\xcek\xad\xef\x8f\x05\xf0p]\xf7bR\x91\xbf\xf2[\ +\xdf\xf7wL\x9c\xef\xfb[\x22ro\xeb-dhX\ +%yc\x82H\xfa\x00\x86\x9e\xd0_\x03\x0aI\x92h\ +\x13\x14EQ\x92\xc5\x9b%`*\x9b\x8f\x80V\xabU\ +\x04\xe0d\x11w:\x9d\xa5\x89\x04x\x9eW\xa9V\xab\ +g\x00\xe2r\xb9\xfcl\xe2\xc30|\x07\xf0\xd1\xeb\xf5\ +\xce=\xcf\xab\x98\xf8\xb1\xff\x01\x11y\x00\xb0\x0e\xe0\x0b\ +@S)uj\x12\xa6\xd7\xed\x018\x01\xb0\x00 T\ +Jm\x8cbM'\x10\x01x\x05P i\xfd\xbd\xa4\ +l\x01\xc0K\xea\x18\xcd\xda\x08\x83 \xd8\xd4Z_\x96\ +J\xa5\x95Z\xad6V\xd8n\xb7\x17\x07\x83\xc1\x1b\xc9\ +\xedF\xa3qer[=U\xbd^\xbf\x06P\xec\xf7\ +\xfb\xc6w\x9a2E\x9b\x9b[\x07\x90\xd4\x00\xbem\xd8\ +t\xd6\xec|\xfc\x07\xfeK@\xe28\x8e\x91O\x99d\ +\x1a\x01Oq\x1c+\x13\x14\xc7\xb1\x0b\xe0q\xe2\x01$\ +\xf7I\x1e\x89Hw\x14#\x22]\x92\x87$\x9b\xb6\xde\ +|\xf9\xf2\xcd|?3\xfeww@u7\xbb\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x032\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\xafID\ +ATX\x85\xed\x96\xcfk\xd3p\x18\xc6\x9f7]\xaa\ +\xb1\xca\xa0\xb8\x1f\xe2E\x90*\xacj\xb1\x89q(\x08\ +;x\xf1\xa0\xa0R\xbc\xf8\x1fxPA\x98\xa0\x88\x82\ +\x82?\xf1/\xf00PD\xf0\xe0\x04\xf5\xe0\x0f\xa8X\ +\xba,dtP<\x0c\xa9\x8a\x87m\xca\x0eV\xac\xae\ +I\x1e/\x1d\x94\xae\xe9\x8fLO\xee\xb9\x84\xbc\x0f\xcf\ +\xfb~\xbe!\xf9\xe6\x0b\xacjU+\xd4\xd4\xd4\xd4\x16\ +\xcb\xb2\x92a\xf3=+\x05\xf0<\xef\x9e\xa2(}\x00\ +v\x86\xc9K\x98\x90m\xdb#\x00F\x01\x18$7\x88\ +\x88\x07`\x12\xc0\x1b\xdf\xf7\x1f\x99\xa6Y\xfc'\x00\xd9\ +lvS,\x16{Ir\xa8\xae\xec\x8a\xc8\x18\xc9\x1e\ +\x00\x07\x01\x0c\x00x\xa8(\xca\xe9t:\xfd\xf5\xaf\x01\ +X\x96\xb5GQ\x94,\x80\xb5\x0d\xd6\x15\xc30.\x01\ +\x00I\xc5\xb6\xed\x8c\x88\xdc\xac\x81\x1d\xd2u\xfd\xfd\x8a\ +\x01\x0a\x85B\x7f\xb5Z\xfd\x08@k\xb0f5MK\ +$\x93\xc9\x1f\xf5\xc5|>?\xa0\xaa\xeaS\x92\x1b\x01\ +\x98\x86a|\x0b\xea\xadt\x02\xe0\xba\xeex\x93\xe1\x10\ +\x91\xb1\xc6\xe1\x000<<<\xe7y\xdea\x00Q\x00\ +\xb7Z\xf5n\x0bP(\x14\xb6\x93\xdc\xdb\xcc\xf3}\x7f\ +<(g\x9a\xe6,\xc9\xf3\x00NNLLl\x0b\x0d\ +P\xadVG\x03,\xb7T*\xe5[eK\xa5\xd2\x03\ +\x00\x0b\x91H\xe4Xh\x00\x00\xfb\x02\xea\xf3\x99L\xc6\ +k\x15\xac\xf9\xaf\x01\xec\x0f\x0d@2\x1e`-\xb4\xcb\ +\xd6\xf4\x19\xc0\xe6\xd0\x00\x00\x82V\xd9\xd7!\x80*\x22\ +\xd5\xd0\x00\x22\x12\xf4\x09\xf5\xcf\xcc\xcc\xac\xe9\x00`+\ +\xc9/\xa1\x01\x00\xbc\x08\xa8K\xb9\x5cN\xb7\x0a\xda\xb6\ +\xbd\x0e\xc0\x88\x88\xbc\x0a\x0d\xa0\xaa\xea\x0d\x11\xf1\x9by\ +\xbe\xef\x9fh\x95%y\x0a\x80\xe2y\xde\xe3\xd0\x00\xa9\ +Tj\x9e\xe4\x93\x00;\x93\xcb\xe5\x96mP\x0009\ +9\xb9CD.\x02\xb8k\x9a\xe6lh\x00\x00\xd0u\ +=\x03`\xae\x895\xa8\xaa\xea\x85&\xc3w\x8b\xc83\ +\x11\x99\xee\xed\xed\xbd\xdc\xaawG\x00\x22\xe2\xc6\xe3\xf1\ +\x14\x80e+\x11\x91s\x8e\xe3\xa4\x00\xc0\xb2\xacA\xdb\ +\xb6\xaf\x89\xc8;\x92%\x92G\x12\x89\xc4\xef\x96\xbd;\ +\x01X\x12\xc9\x1e\xc7q\xee\x93<\xde\x00_\x01\xf0\x01\ +\xc0\x10\x80\xef\x00\xaek\x9av'\x99L.\xb6\xeb\x19\ +\xea@\x92\xcb\xe5\xe2\xd1h\xf4\x8c\x88\x1c%9\x00 \ +\x22\x22\x9fH^\xd54\xedy\xb3\x1f\xd4_\x05XR\ +\xb1X\x5c_\xa9T\xca\xb5\xdb\x98a\x18?\xbb\xed\xd1\ +\xd1;\x10\xa4\xfa\x95\x86\x19\x0et\xf9\x04\x1c\xc79\xe0\ +y\xdem\x11\x89\xd6\x95w\xd5\xae\xd3K\x05\x92\x8b\x8a\ +\xa2\x9c\xd5u\xfdm\xbb\x9e]\x9d\x8aI\xb2I\xf9\x17\ +\x80e{\xbd\xeb\xba\xdd\xb4^\xd5\x7f\xac?\xa6\xc7\xfa\ +<\xd5\x1bP\xa2\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x02\xb9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x026ID\ +ATX\x85\xed\x96?h\x13a\x18\xc6\x9f7I/\ +\x916I\xc5..B\x0e2\xdd\x10\xc8}\x10\x8a\x83\ +D(\x82:8\x1d\xd6A\x8a\xb8H\xc1\xc9Ew)\ +\x08\x8e\xea`\x11\xd1A\xb9A\xfc\x83\x0e*f\x0b\x84\ +\x5c\x08\x09\xde \x81\x0b\xb8t\xa9\xe8%\xf1b\xd2\xbb\ +\xbc.\x09\x94\xd2\xe6\xf2\x87\xd6\xc1\xfc\xc6\xfb\x9e{\xde\ +\x87\xf7\xfb\xf8\xde\x0f\x981\xe3\x7f\x87\x86-\x16\x8b\xc5\ +\xbbDtg\x0a\xff\x0d!\xc4\xd0\xff\x87\x06\xe8\x87\xb8\ +\x17\x08\x04NG\x22\x91s\x8a\xa2\xb4\xfc\xf4\xa6iJ\ +\x8e\xe3\xbc!\x22K\x08\xb1\xee\xa7\xf7\x0d\xc0\xccT*\ +\x95\x1e2s\xb2\xd5j]\xccf\xb3\x7f\x0e\xd2\x1a\x86\ +1\x07\xe0\x15\x11\xfdL\xa7\xd3kD\xd4\xf3\xf3\x0f\xf8\ +&$bUU\xd7\x01lE\xa3\xd1\xd7\xb5Z-\xbc\ +\x9fN\xd7\xf5 \x11=\x03\xe06\x1a\x8dk\xa3\x14\x1f\ +)@?D\xaf^\xaf\xaf1\xf3/\xdb\xb6_\xe4r\ +\xb9\xd0\xeeuf&Y\x96\x1f\x01X\x8a\xc7\xe3\x97\xb3\ +\xd9\xac;\x8a/0\xc2\x16\xecf\xd0b\x00m\xcb\xb2\ +V5M\xf3\xfa\xdf\xef3\xf3\xb2$I+\xa9T\xea\ +\xf78\x9e#u`\x80\x10b\xa7\xdb\xedj\x00\x96d\ +Y\xded\xe6\x80a\x18\x1b\x00\xce\x86\xc3\xe1\x0b\xe3\x16\ +\x07\xc6\xec\xc0\x00\xd34\x17\x1c\xc7\xf9HDA\x00\xf3\ +\x9e\xe7\x9d\xc9d2?&\xf1\x1a\xab\x03\x03\x14Ei\ +\x85B\xa1\xf3\x00\xbe\x03X\x99\xb4\xf8\x0c`\xc23\x00\ +\x00\xe5ry\xd1\xf3\xbc\xc7\x00n\x0a!\xb6&\xf5\x99\ +\xe8\x0c\x98\xa6\xb9\xe0\xba\xee\x07\x00\xa7\x00|*\x14\x0a\ +'\x8e,@>\x9f?\xd6n\xb7\xdf\x12\xd17UU\ +\x97\x01\xbc\x0b\x06\x83\x9f\xab\xd5\xea\xf1C\x0f`\x18\xc6\ +\x9c$I:\x80m\xcb\xb2\xae\x13QO\x08q\x1b\xc0\ +\x97N\xa7\xf3\xbeR\xa9\xcc\x1fZ\x00]\xd7\x83\xcc\xfc\ +\x1c\xc0N\xb3\xd9\xbc2\xb8\x05\x01@U\xd5[D\xf4\ +\xd5u\xdd\x03g\xc5T\x01\x989\x90H$\x9e\x12\xd1\ +b<\x1e_\xdd{\xd7\x13\x11[\x96u\x03\xc0\xb6m\ +\xdb/\xf7\xce\x8a\xa9\x02\xf4\xc7\xf1\x03\x00'\x9b\xcd\xe6\ +\xa5d2\xd9\xd9O\xa7i\x9a\xc7\xccW\x01\x84b\xb1\ +\xd8\x13f\x1em\xd0\xf9\x09\xfe\xe9\x83\xe4(\x9ed3\ +f\xcc\xf8\x0b\x8d\xe6\xee\xaa \xc1 \xf6\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02h\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\xe5ID\ +ATX\x85\xed\x961o\xd3@\x14\xc7\x7fw\xa9\x94\ +\x81\x1ebIa\xe6#\xc4\x17\xc5b\x80\x98\x8d\x0f\xc0\ +TU\xea\xc2\x07\x0012\xa2.\xac\x88\x05\x18\xa8\x0a\ +B\xfd\x02lD\xb4B\x8a\xe2\xb3%\x0f\xfe\x0c\x05\x01\ +\x03D\x91b\xd5\xce\xb1\xa0*\x8a\x9c\xd4\x89\xed\xc0\xc0\ +\x7f<\xdd{\xff\xdf\xdd{zw\xf0_\x05e\x8c\xb1\ +u\xe4\x95u$]E[e\x13\x14\xbc\x99S\xad\xf5\ +\xedZ\x00\x00\xb4\xd6\x22o\xdd\x18s\x1f8\x06\x0e\x17\ +\xc5\xd6V\x02\xdf\xf7o\x02/\x81c\xad\xf5\xab\xda\x00\ +\xf2N\xdf\xef\xf7\xb7\x80#\xe0{\x9a\xa6\x0f\x96\xc5W\ +R\x82y)\xa5\x9e\x02m\xe0\x96\xeb\xba\xbf6\x0a\xe0\ +\xfb~\x0fx\x0c<\xd4Z\x87\x97\xed\xaf\xb4\x07\xc20\ +l\x09!\xde\x01\x1f\x1c\xc7y^$\xa62\x00k\xad\ +\xc8\xb2\xec5\x90fY\xb6/\x84(4\xb8*+A\ +\x10\x04\x8f\x84\x10\xf7\xac\xb5\xbdn\xb7\xfb\xa3h\x5c%\ +7\x10\x04\x81\x03\x1c\x00O:\x9d\xce\xe7UbK\x03\ +\xc4q\xbcm\xad}\x0b\xf4\x1d\xc7y\x96\xb7\xc7\x18c\ +\xad\xb5\xb9\xc3\xaa4\xc0d2y\x01\x5c\x9bN\xa7\xfb\ +B\x88\xe9\xaa\xf1\xa5{\xc0Z\xbb\x07 \xa5<3\xc6\ +\x94M\xb7X\xff\xecs<\x18\x0c\xae\xc7q\xbc\xfdW\ +\x00\x86\xc3\xe1\x0d)eo4\x1a]\xd98@\x14E\ +;\xc0\x1d)\xe5\x89\xeb\xba_7\x0a\x10E\xd1N\x92\ +$\x9e\x94\xf2Dk}\xb6\xae\xf9Z\x00U\x9a\xaf\x0c\ +P\xb59\xc0\xc5t\xfa\xf3\x89X(\xa5\xd4y\x96e\ +\xbbB\x88\xd3\xf1x\xbc\x96\xb9\xe7y\xe9\xfc\xda\x85\xa9\ +RjwI\xecUk-\x8dF\xa3\x05\xdcUJ\xad\ +\xe3\x0f\xf0f~!w>\xcfj\xe6\xda\xdf/\xfa|\ +\x96\xd1\xd2\x1e\x98\xady\xd5\xc6\x97\x02\xd4\xd1p\x85\x01\ +6e\x0e9\xafa\x18\x86\xad$I<\xe0\x93\xd6\xfa\ +K\x9d\xe6\xb9\x00\xcdf\xf3'\xf0\xb1\xddn\x7f\xab\xdb\ +\x1c\xe07\x856\xc2'x\x05\xe0X\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x02\xb3\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x020ID\ +ATX\x85\xed\x96\xbfk\x14Q\x10\xc7?\xb3z\xc5\ +\x9d\x04k\x05\x9b\xc3\xa4Y%d\xef\x1dj%!\x96\ +j\x11\xe5\xfe\x03\x0b\xff\x86\x80D\x12\x88`ga#\ +bg\x10c\xc0\xc2:\x8d\x85r\xb3w^c\xe5y\ +\xc6\xc6\xf6@m<\xef\xc6f\x03a\xbd\xdb\xb7\xf7C\ +\x14\xcc\x17\x16v\x1f\xdf7\xf3\xd9\xf7\x86a\xe0HC\ +\xd4h4nL\xeaUUK?Yq\x83\xe9P\xa7\ +\x97\x1c\xbc\x1c\xa63\xb3\x8b\x22\xf2&O\x80\xb4\xd7\xcc\ +v~K\x22r3\xed\x8d\xa2\xe8\xc5\xc8\xa0\xff\xd5\x15\ +\xcc\x1c\xc09'A\x10\x84@_D.9\xe7$\xcb\ +\xffGN`0\x18\xdc\x05\x8e\x01\xf7|\xde\x99\x03\xa8\ +\xeay`\x15\xc0\xcc.\xd7\xeb\xf5+S\x03\xa8\xea\xfd\ +\xbc\x00\x22\xb2\x99\x8a\xbbef#\xaf!\xef\x09\xac\xec\ +\xed\xed\x1d\xf7\x99\xe28\xae\x98\xd9\xb5\x14\x90S\xd5\xd5\ +\x89\x01\x12\xfa\x85R\xa9t&\x87\xf7\x02\xb0\x094\x93\ +\xa5\xcf\xc0\x1d\x11q\xa3\xf6x\xff\xaa\xd5j\x9d\x06N\ +\x14\x0a\x852\xd0\xc9\xf2:\xe7\x1e\x02\xa8\xeaI`\xc9\ +\xccZ\xd5ju#k\x8f\xf7\x04z\xbd\xde<\x80\x99\ +\x95}\xdeC\xfa\x00 \x22\x1f}\xc6<\xadx\xc5\xcc\ +n\x03\xbb\x22\xf24\x1d`X\xdb6\xb3%`\x0dx\ +\x22\x22\xaf\x86ys\xb7bU\xddRU\x8b\xe3x\xdb\ +\xe7=P\xb3\xd9\x9cWU\xab\xd7\xeb\xd7}\xde\x915\ +\xd0h4V\xfa\xfd\xfeW\xe0\x5cB\xbf\x90Ty\xd9\ +9\xf7|$=\xd0\xedv;sss=\xc0{\x05\ +#k\xc0\xccN\x89\xc8[\xe0j\xb2\x14\x99\x99\x02g\ +}A\x97\x97\x97\x7f\x02\xfb\xa5R\xe9\xd3\xc4\x00\xedv\ +{\x1bx\x9fZ\xfeR(\x14\x1e\xf8\x82&z\x1d\x86\ +\xe1\xb7\x89\x01j\xb5Z\x1fXO-o,..~\ +\xcf\x93=\x08\x82\xf4\xde\xf1\x00\x00*\x95\xca\x0e\xf0.\ +\xf9\xec\x14\x8b\xc5\xc7y\x82\x02DQ\xb4?5\x80\x88\ +\x98\x99\xad\x03\x98\xd9Z\x18\x86?\xf2\x02\xe4\x95\xb7\x11\ +U\xab\xd5\x97\xc0#\xe7\xdc\xb3Y'\x07O+><\ +N\xc5q|KU\xf1\x0d\x18\xe3\xea\xaf\x8fd\x99\xad\ +8k\xc2M{\xf3$\x1b\xbb\x15gM\xb8\xc3\xc0}\ +\xfa'\xa7\xe2\xcc\x22\x9cu\xc1\x1di\x98~\x01D?\ +2|\x5c>\xb4\xcc\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x01\x8b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01\x08ID\ +ATX\x85\xed\x951n\x84@\x0cE?+\xb4h\ +n\x90\x9a\x96\x12\x17\x08%M\x8a\x5c!\xcaa\x12)\ +R\x8e\xb6t\xa6\x9c\x86\x13dO`m4\x92S$\ +\x14!\xabYCX\xa1H\xf3:\xec\x8f\xfd\xd1\x07\x06\ +H$\x12\x1b\x93\xc5\x9a}\xdfw\xaa\xda\xfea\xfe3\ +\x11\xbd\xc5\x04\xbbXSU\xdb\xba\xaew\x00@D\x19\ +\x11e\x00\xe0\x9c+\xc6\xeb\xb16\xd6Gm\x08\xe1\x06\ +\xc0\x133\xbf,6\xf0\xcd\x8f%V\x9a\xa69\x86\x10\ +\xee\x01<\xc6LX\x0c,\xc6bb\x15\x03\xd3(\xa6\ +&\xf2<\x7f\x00\xf0z\xae\x9f/\xd8\xd7\x89\xc8\x89\x99\ +\x7f5D\x04\x00\x0e\xd3\xfa0\x0c\xefeY\x9e\x1d6\ +\xdb\x00\x11\xdd\xce\xbd'\xc6U\xdf\x81\x7fa\xc0\x1c\xc1\ +\xc2\x9fRw)2\xb3\x01Um\x9dsEUU\x1f\ +\x16\xbd\xf7~/\x22\xa7K\xba\xcd#\xd8\xdc\xc0\xec\xcf\ +\x90\x99\xd5(-\xaeb\xc0z.x\xef\xf7\x16]\x8a\ + E\x10}\x1a\xfe:\xf2\xea\x95v\x1d\x88\xe8n\xa5\ +Y\x89\xc4z|\x02\x16\x8a_1i\xdcz\xaa\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xfb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01xID\ +ATX\x85\xed\x96\xb1J\x03A\x10\x86\xff9\x8c(\ +Fll\xb4\x11ML\x93J\xb2H\xc8\x83\xe4\x19\x04\ +\x9f\xc1\x22\x22ha!\xd8Y\x88\x8d\xa0Oq]\xaa\ +I\xe0\x8aDA$\x8d X\x88\x95\x07\x97\x1c\xbfM\ +\x021\x12\xcd\xad\x89\x1b$\x7f\xb5\xb3s\xfb\xcf\xc7\xec\ +2\x1c0\xd3/\xa5\xaa\xbe\xef\xfb\x0b\xb6\xe7\xbd10\ +\xe4\xd2\xe9\xf4\x86\x13\x80 \x08\x96\x00\xac\x01\xd8r\x02\ +\x10\xc7q\x16\x80x\x9e\xe7\x14\x00$7\x9d\x00\x88\xc8\ +vw\xe9\xa6\x03\x002\xae\x01\xb2\xd3\x02\xb0\xac\xaa\xab\ +\x7f\x0aP\xadV\x17\x01\xac\xf7b\x92V]\xb0\x06H\ +\xa5R\x99\x81\xf3\x93\x07P\xd5\x95\xbe0\xd3\x9f\xeb\xcd\ +\x02\x92R\xaf\xd7G\x9e\x8c\x92\x04\xa0V\xab\xed\x93<\ +\x12\x91&\xc99\x00\xbb}\xe9&\x80\x17\x00;\x22r\ +S(\x14\xf6\xc6\x0e\xd0h4\xe6\xc30\xbc\x07\xf0\xdd\ +\xe0\x09;\x9dN\xaeX,>\x8d\xe2\x99\xe8\x0a\xf2\xf9\ +|$\x22\xc7?|v6j\xf1\xc4\x00\x00@\xf2\x0a\ +\xc0\xe3\x90\xf4[\x14E\xa7I\xfc\x12\x03\x18c\xda$\ +\x0f\x87\xa4OJ\xa5\xd2\xebD\x01\x00\xa0\xd5j]\x03\ +\xb8\x1b\xd8~\x06p\x9e\xd4\xcb\x0a\xa0\x5c.\xc7\x83]\ + Y1\xc6\xbc\xff\x09\x00\x00\x18cn\x01\x04\xdd\xf0\ +AD.m|\xac\x01D\x84\x22R\xe9\xae\x0f\x8c1\ +m[/k\x91\x14U\xbd 9\x8e\x7fK{\x08g\ +\xc5\xff\x85\xbe\xb4OU9\xc9\x82\xc6\x98O5\xdd=\ +\x9ei\x01\x98\xe9\x03\xdc\x0ayh|f\x8a;\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xd1\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01NID\ +ATX\x85\xed\x94\xb1J\xc3P\x14\x86\xff\xa3\x06\xa7\ +\xda\xc9G\xe8\xe4xO0(n\xce\xe2\x1b\xb8\xa8\xb8\ +\x15\x1d\xc4\xc1.\xe2P\x10\xa5\x83\x82\x0f\xe0\x14]\xf4\ +\x052\x09\x91\x9c\xe2n}\x82n1\x93P<.\x19\ +\x84$\xa5\xdc[,J\xbe%\xdc\xdc\xe4?_\xce\x09\ +\x17\xa8\xa9\xf9\xcb\xf4\xfb\xfd\xab(\x8a\x16\x5c2\xe6\x1c\ +\x8ao\xa8\xeaa\xa3\xd1\xd8\x9d\x89\x00\x80n~=\x8b\ +\xe3x\xe9W\x05Dd[U\xd7\xf2\xe5\xb2\xe7y\xc7\ +\xb6\x02N\x88\x88\xbaf\xb8\x8c`*\xd4\x023\x17\xa0\ +\xaa\x0d\x11\xf1\x88h\xdf\x18sS\xb2W\xf8\xf9\x98\xb9\ +\x90%\x22\xedf\xb3y\xdbj\xb5>\xab\xea\x94v \ +I\x92M\x00\xaf\xaaz]\xa9>\x19\xbd4M\xdfE\ +\xa4=\x18\x0c\x16\xcb\x1e(\xb3>\x02p\xe9X\xb8\x80\ +\xaa\xde1\xf3\x0e\x11}\x8d\x15\xc8%V\x01\xf4\x00\x04\ +\x15\xad\x9dt\x04\x0a\xe0\x0d\xc0\xa91\xe6\x81\x88\x0a\xef\ +\x95\x8e\x80\x99_\x8c1\xeb\x00\xf6*>h\x22T\xf5\ + \xcb\xb2\x15f\xbe/+\xeeL}\x12\xd6\x02\xd3\xa0\ +\xf2$\x1cG\x92$[D\xf4\xf8\xe3\xd693wl\ +\xb2\xac:\xe0\xfb\xfe\x13\x80\xe7|9\x1c\x8dF\x176\ +9\xd6\x029'\x00@D\x9d \x08>\x1cr\xec\x11\ +\x91n\x18\x86\xf33)^\xf3o\xf8\x06wXp\xae\ +\x90e\x08B\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x05]\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x04\xdaID\ +ATX\x85\xed\x96\x7f\x88TU\x14\xc7\xbf\xe7\xbe\xa7\ +1\xba?\xd3@\xb2\xfe\xc9Xjg[\xddywf\ +Q\xa4\x18*$\x94\x8a\xac\xdd\xe8\x97?\x22\xc8\x04\xfd\ +\xa3\xa4\x22\x0dB\x8a\x0c\xcbJ\xac4C\xa2\xc0\x7fB\ +K\xff(D\xd9L]\xeb\xcd}\xbb\xe3H\x9ba\x8e\ +\x99\xb4\xb6\xb0\xc8\xec6\xd9\xfc\xd8wN\x7f8c\xb3\ +\xd3\xbao\xf5\xdf<\xf0\xe0\xbds\xbf\xf7\xbc\xcf9\xf7\ +\xdc\xfb\x1ep\xcd\xfe\xefF\x13\x11y\x9e\xf7\x10\x80\xb7\ +D\x84Dd\x7f6\x9b]\x1d\x8f\xc7s\x95\x9a\x93'\ +O\xd6e2\x99\x8f\x88h.\x80\xa2eYK\xdb\xda\ +\xda\xba\x83b\xab \x811f\x0a3o\xb6m{^\ +:\x9d\xbe])u\xa6\xb6\xb6\xf6\x98\xeb\xbaw\x965\ +\xbd\xbd\xbd\x0b\x87\x86\x86\x8cR\xea\x88\xe38\xb3&M\ +\x9a\xb4\xc0\xf7\xfd\x9d\x13I.\xb0\x02\xa9T\xeam\x00\ +\x8fX\x96\xb5\xbd\xb9\xb9y=\x11\x891f:\x80\xc3\ +\x22\xb2\xd6\xb2\xac:\x11Y-\x22s\xb5\xd6\x17\xca\xf3\ +\x12\x89\xc4\x97\x22\xb2)\x16\x8b\x1d\x1c/\xbe\x1d\x04`\ +Y\xd6\x0a\x11\x09\x89\xc8k}}}G\x00\x1c\xd0Z\ +\x0f\x1ac\x22Dt\x9a\x99\xffv\x1c\xe7\x16\x22\xe2Q\ +\x99\x11\x1d\x22\x22\x0d`\x5c\x80QK\xe0y\xde\x17\xc6\ +\x98\xfaJ\x1f3\xffQ\xba\x15\xdf\xf73e\xff\xc8\xc8\ +\xc8L\x11\x11\x22\xaaO$\x123\xc7\x00\xff\x0d@1\ +(\xc1Q\x00\x22\xb2\x18\x80\xeb\xba\xee\x9c\x0a\x80\xfb\x88\ +h#3w\xb6\xb6\xb6ze\xbfm\xdb\xfbE\xa4\x83\ +\x99\x9fSJ}[\x1dXDjE\xa4\xff\x8a\x00J\ +\xd6\xa4\x94:j\x8cY\x0d\x00\xb3g\xcf\xfe9\x97\xcb\ +\xfdZ,\x16\xb7\x96\x05\xc6\x98\xedDt0\x16\x8b}\ +\x17\x8dFw\x02\xf0\x12\x89\xc4\xd6\xca \xcc\xdc\xdc\xd0\ +\xd0\xb0/\x08`T\x13\x1ac\xa4j|\xb7eY\xcb\ +\xdb\xda\xda2\xc9dr~\xb1X\x5cND\x0b\x01L\ +\x03pN\xe4\xa2\x5c)%\x22r#\x11\x0d0\xf3\x80\ +R\xeaG\x003D\xe4\x81\xca\xc6\xbc\x1a\x00\x008\x03\ +\xa0Sk\xfd\x831f\x0a\x80m\xcc\xfcy,\x16\xfb\ +\xa6R\x94H$\x1e&\xa2Wm\xdb^R(\x14\x16\ +)\xa5\x9e\x11\x91\x11\xa5\xd4\x9f\xcc\xbcKk\xbd\xbe\xba\ +Q'\x0a\x00\x00y\x00/:\x8e\xf3>\x11]N\x03\ +cL\x9f\x88\xbc \x22Y\xcb\xb2\x1c\xc7q6\x95\xa0\ +_\x06\xf0(\x80\x0dZ\xeb\xed\x95s\x02\x0f\xa2\x92]\ +\x07\xe0]\xcf\xf3v\xa5R\xa9\xc6\xcb\x89\x88h9\x11\ +mRJ=y\xea\xd4\xa9-\x00\xa0\xb5\xbe\xa0\xb5^\ +\x97N\xa7\xc3D\xb4\xa2\xa7\xa7g\xed\xd5\x00\x94\xed\xc1\ +B\xa1\xb0\xe3r\x83\x8e\xe3|\xaf\x94\x82\x88\xdc\xd0\xd1\ +\xd1Q\xa8\x1c\xeb\xe8\xe8(D\x22\x91v\x11y\xb6\xd2\ +\x1fx\x10U\xd9>\x00K\x024=D\xd4\x02\x00\xa9\ +T\xea\x0e\xcb\xb2\x9e\x16\x91\xfe\xe1\xe1\xe1\xcd\x18\xe3\x5c\ +\x980\x80\x88l\xcbf\xb3+\xe3\xf1\xf8\xc8x:\xdf\ +\xf7\x87\x00\xcc\xe8\xee\xee\x9e\xa9\x94:,\x22u\x00P\ +__\xdf\xeay\xde,\x00\x9b\xaf\x14\xc0\x07\xf0J4\ +\x1a\xdd\x00\x00\xc6\x98\xc3\xcc\xfcK,\x16[Z-t\ +]w\x99eY\x03\xcc\xecO\x9d:\xf5=\x00u\xe5\ +1f~\xcc\xf7\xfde\xed\xed\xed\x9fV\xce\x09\xda\x05\ +Y\x11y<\x1a\x8d\xee\xe9\xee\xee\xbe~\xf2\xe4\xc9G\ +\x89\xe8V\x11QDt\x02@\x06\x00\x89H#\x80\xe9\ +\x00\x1a\xcb1E\xe4|(\x14\xe2\x92\x1f\x00>hi\ +iYY\x0d=^\x05\xfa\x89\xe8~\xad\xb5\x97L&\ +\x9b\x8a\xc5b\x5cD2\x22r\x9e\x88\xa6\x03h\x12\x11\ +\x1f\x80\xe0\xe2\xdaZ\x00\x06D\xe4\xb4m\xdbIf~\ +\x8a\x88\xe6\x00X\xc6\xccg\xf3\xf9\xfc'\xe3\xbc\xeb\xdf\ +\x0a\x94\xaec\xae\xeb\xde\x0c\x00\xc9d\xb2\xc9\x183X\ +\xa5\xdbm\x8c\x11\xd7u\xdf(=\xc7\x8d1\xeb\xab4\ +\xe7\xbb\xba\xba\x1a\x82\xde\xf9\x9fmHD_\xe7r\xb9\ +\xf9\xb1X\xec,\x000\xf3\x02TU\xcaq\x9c\xc5\x00\ +\x06\x95R/y\x9e\xd7\x09`\x9d\xd6z]\xa5FD\ +2555\xf7\x04\x01T/\xc1;\x91HdM\xe5\ +\x91\xe9\xfb~\x13.6\xe2%;~\xfcx\xbdm\xdb\ +o\x8aH\xa7\xef\xfb\x1f\x03\xb8w\x8cD\x8a\x22rS\ +\x10\xc0\xa8\x0ah\xad\x9f\x1f\xe3\xc7\x22GDuU\xbe\ +\x13\xb6mo\xb4m\xbb\xad\xf4)\xee\xea\xed\xed\x9dW\ +\x15{\x1a\x11YA\x00\x81\xdbP)\xf5\x133\xdb\xc6\ +\x98\x0f\xf3\xf9\xfc\x16f\xb6\x88\xa8\xa1\x04b[\x96\xb5\ +\x87\x99\x171\xf3!\xd7u?kll\x5c5<<\ +|\x97\x88Lcf\x13\x14?\xf0\x9fPD\x94\xe7y\ +\xf92\xac\x88\xf4\x87B\xa1\xd7\x89h\x15\x80\xbd\xe1p\ +xMOO\xcf\xdd\xcc\xbc\x17@\xe8R`\xa2\xbf\x1c\ +\xc7\xa9\x09L0\x90\x90\x88\x99\xf9\x09\x00\xfd\x00\xce\x11\ +\xd1W\xe1px[8\x1c\xbe-\x1c\x0e\xaf\x01\x80H\ +$r \x9dN7\x88\xc8\x0e\x11\x19 \xa2\xdf\x01\x04\ +6\xe05\xbbf\x00\xf0\x0f\x19\x19[\xaa\x82S\xc8\xb1\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xc4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02AID\ +ATX\x85\xed\x94?h\x14A\x14\xc6\x7f3\xb9\xc3\ +\x22F\xec\xc5(\x8a\x08!\xa6\xd8}{\xb9\xc2F\x8b\ + \xd1XD\xb1\xd0\xc2N\x14\x14-\x04\x05\x1b[C\ +\xc4FP\x14D\x0bA\xb0\x11E\x12\x11A\x83`p\ +w\xef@;\x8dW\x98X\xf9\xa70g\xd0x;\xcf\ +\xc2\x5c8\x92K6\xe2Y\xb9\xbfn\xbe\xf7\x0d\xef\xe3\ +\xbda ###\xe3\x7f\xc7,\x14\xe28\xde\xa5\xaa\ +#\x0d\xd2c\x11\xe9\x03\x08\xc3\xf0\xbe1f\xa0^\xa8\ +\xd5j\xeb\x8b\xc5\xe2T\x14E\xaf\x80mu\xdd9\xd7\ +Y(\x14&\xc30\xdcd\x8cy7\xdf\xcc\x98\xbd\xbe\ +\xef?h\xecg\x17\x06\xf0}\x7fTD\x0cp\x12\xf8\ +T\xab\xd5\xf6\xd7k\xd5j\xf5\x00\xf0\xde\x183(\x22\ +\xa6X,N\x01\x88H\x8f1f\x0b0\xe3\x9c\xeb.\ +\x14\x0a\x93\x00A\x10T\xac\xb5\xeb\x80\xaf@\xcf\xc2\xe6\ +M\x034p\x05\xf8\x92\xcb\xe5N\xd5\x85\x8e\x8e\x8e\xe3\ +\xaa\xfa\xc1\xf3\xbc{M\x82O\xa8\xea5k\xedP\xa3\ +\xee\x9c;\x0f\xdc\x14\x91\xd7\xcd\x9a,ZA#q\x1c\ +\x0f\xaa\xea\xad|>\xbf\xd997\x9b$\xc9\x84\xb5v\ +\xc0\xf3\xbc\x17\xcd\xfc\xe5rym\x92$oT\xf5p\ +\x10\x04#a\x18n5\xc6\x8c%I\xd2\xd5\xdb\xdb\xfb\ +\xf9\x8f\x03\x00DQ4\x06\xbc\x04~\x02\x9d\x22r(\ +\xc5\x7f\x94\xdf\xeb\xeb\x01\xee\x02\xa3\x22ru)\xffr\ ++\x00@UO\x03\xc7\x80#mmm\xe7\xd2\xfc\x95\ +J\xe5:0\xab\xaa7\x80\x8ds\xe7%I\x9d\x00@\ +\x18\x86\xcf\x8c1U\x11\xd9\xbd\x12\x7f\x1c\xc7;U\xf5\ +\x89\xaa\xee\x08\x82\xe0\xe9_\x05(\x95J]\xce\xb9\xe7\ +@\xbb\xaa\x16\x83 (\xa7\xddQU\x1b\xc7qMD\ +R'\x9cK3$Ir\xd1\x183\x04l\xb0\xd6^\ +V\xd5\xed\xc6\x18M\xbb\xb7R\x96\x0d\x10\xc7\xf1\x1eU\ +\xed\x06\xf6Yk\xdb\x9dsoK\xa5\xd2A\xe0v\xab\ +\x02,9\xa2(\x8a\xf2\xaa:\x0c\x9c\x11\x91\x19\xcf\xf3\ +>\x02\x17Tux|||\xcd?\x0f\x00\x9c\x00f\ +|\xdf\xbfS\x17\xa6\xa7\xa7/\x01?r\xb9\xdc\xd9V\ +\x05X\xf4\x08\xa3(\xea\x03\x1e\xcd\x1b\x8c\x19\xf1}\xbf\ +\x7f\xae\xf6\x10\xe8o\xa8-\xfa\xdb\xa3(\xfa\x0e\xacj\ +\x90\xbe\x89\xc8\xeaV\x05\xce\xc8\xc8\xc8h9\xbf\x00o\ +0\xe5\x9d\xef\xad\xd2E\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x04:\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x03\xb7ID\ +ATX\x85\xedVMh\x5cU\x14\xfe\xce\xed$+\ +\xa1\x8a\x9a\x18\x15\x17\x82\x82\xdd\xbc\xf0\xee\xc9\x90\xe2o\ +\xc7\xb8\xe8\xa2BqS\x1a\xb5\x89\xd4\x8du\xe1FE\ +Z\x04\x11t%\xae\xc4\x8d\xadm\xd3F\x5c\xd8Fj\ +!b\x92B\xb54\xce=\xf7%/\x90\x22.\x5cH\ +\xebX\xcd\xc6M\x02\xce\xe4\x1e7\xef\x95\xe7d2\xd3\ +\x09n\x84|\xab{\xbfs\xee\xf9\xbe{\xe7\xce\xb9\x0f\ +\xd8\xc66\xfeoX^^\xbe#\x1f;\xe7&T\x95\ +\x9a\xf9n`\xba]\xb0\xba\xba:%\x22\xc7T\x95\x88\ +\xe8E\x00\xe4\x9c;\xba\xb6\xb6\xf6\xf5V\x0c\x94\xba]\ +@D/\x01\x98\x13\x91\xbb\x89\x08\x22\xf2\x11\x11\xed\x05\ +\xb0g+\x06\xda\x9e\x80\xaaR\x9a\xa6}\xaaJ\x22r\ +\x15\x00\x98\xb9\x06\xa0\x92\x89\x22\x17\xcfxx\xef\xaf\xa8\ +*%Iro\xfe\xf3\xb4\xddP\xbb\xa0\x88\xdc\x03\xe0\ +\x9a\xaa\xbeJDS\xcc|+\x7fqq\xf1\x81F\xa3\ +q\xbdT*=888x\xa3\xb0F\x89h\x9f\xaa\ +\x9e\x00\xb0\x8b\x99W\xdai\xb4=\x01f^Q\xd51\ +\x22\x9a*\xf2\xce\xb9\xb7\xa2(\xaa\x01@\x14E5\xef\ +\xfd\x9b\xc5\xb8\xaa^P\xd5\xb1N\xe2\x1d\x0dx\xef\xaf\ +\x10\xd1\xc5|\x9e$\xc9H6|\xa2\x98\x17Bx2\ +\xcb\xaf\xe4\x1c\x11]\x14\x91\x1f:\x19h{\x09\xad\xb5\ +\x8f\xe7c\x11\xd9\x13B\x98\x16\x91q\x00\xbd\xc5<\x22\ +\xeaM\x92\xe4@\x08\xe1\x941f$\x8e\xe3\xd9N\xc2\ +96\x9c\x80\x88\xec\x14\x91\xe94M\xfb\x8a<3_\ +\xca\xfe\x01g\x00<\xd6\xb4lW\x08a\xd2\x18s\xa8\ +Y\x11\x99^XX\xb8\xb3\x95\x81\x96\x97\ +PD\xde\x03\xf0BOOO%\x8a\xa2?D\xe4\x1d\ +\x22\xaa\x00\xe8Q\xd5G\x89\xa8\x1f\xc0aU=AD\ +\xaf\x00\xf8LUo\x12\xd1\xcf\x00\xea\xaa:\xc7\xcc\x1f\ +\xa6i\xdaW\xaf\xd7\xe7\x00\x9cc\xe6wo\xdb@f\ +\xe2\x13\x00O7\x1a\x8dg\x87\x87\x87o6\xc5\x0e\x01\ +8Y\xa0\xc6\x98\xf9T1g~~\xbe\xbfT*\xcd\ +\x00\xb8\xcc\xccG6\xd3\xd9`\xc097\x91u\xb8\xff\ +\x14D4a\xad}\xb9\xa3\x81\x82\x91\x8f\x89h\xaf1\ +\xa6\x12\xc7\xf1o\xc5\x98\xf7~LU?/\x14\x1f\xb7\ +\xd6\x9e,\xe6$Ir\x7f\x08a\x16\xc0\xb7\xcc\xfc\xc6\ +\xa6\xc6Z\x91\x22r\x0c\xc0(\x80\x0a3\xd7\x9csG\ +\x8d1\xcf\x84\x10z\x89\xe8\x11\x00\xfdD\x94\xdf\x81q\ +U=\x0e\xe0\xd6\x1d\x00p\xc9Z\xfb\x81\x88\x0c\x00\x98\ +\x030\xc9\xcc\xef\xdf\x96\x01\x11\xd9\x09\xe0<\x80\xd1\xbc\ +\xbd\x16vu@U'U\xf5Wk\xed\xc3\xde\xfbu\ +k\xed\x0e\xef\xfd/\x00\x1e2\xc6\x8c\xc6q\xfcES\ +\xbd\x01\x00g\x01\xecg\xe6\xbf\x9a\xf56\xf4\x81,\xa9\ +\xd2\xcc;\xe7FB\x08\xa7\x8d1\x07Uu\xac)\xfc\ +\x13\x11\xbd\xbd\xbe\xbe>\xe1\x9c\xfbshhh\xa6P\ +\xaf\xd6\xaa\xde\xa6\x06\x9a\xdc_\x050\x9c\xcfU\xf5\xb9\ +8\x8eg\x9cs\x07\x8by\xaa\xfa73\x7fY\xadV\ +W\x8c13\x22\x92\x87\xe6\x99yw;\x8dNo\xc1\ +n\x22\xda\x97MCag\xffj\xb1\xc6\x98\xef\x01\xa0\ +\x5c.\xcf\x02\x08\x00@D\xcfw\x12\x07:\xbc\x86\xd9\ +\x8b\xb7\xa8\xaa\x87\x89\xe8\x1c3\xef\xc8c\xd5j\xf5>\ +cL-\x840P.\x97\x7f\xcfy\x11YW\xd5\xfd\ +Dt\xbcT*\x0d\x16_\xcaVh{\x02Q\x14\xd5\ +\x8c1\x113_P\xd5\x1fs>M\xd3>c\xccw\ +\x00`\x8c\x99)\xb6m\x22\x9ag\xe6o\x8c1Q\xfe\ +b\xb6C\xc7\x0f\x86fd\xedu\x16\xc0e\x00\xaf\x01\ +\xf8\x14\xc0Sy\xdb\xee\xb6^\xd7\xdf\x84\xf5z\xfd\x0c\ +\x80\xf3\xd6\xda\xd7\x01\xc0Z{\x04\xc0W\x8dF\xe3l\ +\xb7\xb5\xb6\x84\xa5\xa5\xa5\xbb\xf2\xb1\xf7\xfet+~\x1b\ +\xdb\xe8\x06\xff\x00\xf1\x0e\xb4#\x8a\xaf\xa5\x96\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x02\xab\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02(ID\ +ATX\x85\xed\x96\xc1k\x13A\x14\xc6\x7f3$\x82\ +\x88\x82\x22\xd4\x8bV\xd4kC\xd8\xecf1\xa0 D\ +P\xbc\x07\x0a\x82z\x15\xf1\x90\x83x\xd3\x827/9\ +y)X\xa8\x08\xfe\x03\x8a\xd4\x83(\x12\xd1LR\x1b\ +)\x8d\x87VD\x05E\xaaX\x0b\xd1ew\x9f\x077\ +\x1a\xcb\x0aI\xc8zi\xbe\xcb\xee{\xdf\x9bo\x7f\x87\ +\x9da`\xa4\x916\xbb\xd4\xa0\x0b\x8d1\x07\x81\x8b\xc0\ +!\xa0\x15\x86a%\x9f\xcf\xbf\xfd/\x00\xf5z\xfd\x88\ +\x88\xdc\x05\xb6w\xb5\xbfj\xadOZ\x96\xf54Q\x80\ +f\xb3\xb9\xd3\xf3\xbc%`,\xc6\xfe\xa8\xb5\x9e\xb0,\ +\xebS\xafy\xba_\x00\xcf\xf3\xca]\x1f\x7f'\x22S\ +\xc0\xc3\xa8\x1e\x0b\xc3p\xaa\x9f\xbc\xbe\x01\x803\x1d\x16\ +\x11):\x8esuee\xe5\xb8R\xeaN\xd4?[\ +\xadVw%\x02P\xab\xd5\x0e\x00{\x01\x94R\xf7\x1d\ +\xc7y\x05P*\x95\x02\xdf\xf7/\x00k\xc0\xd6t:\ +}*\x11\x00\xad\xf5\xd1\xae\xb2\x05\xb0\xb8\xb8\xb8\x05\xc0\ +u\xddU\xa5\xd4l\x04W\x1c*@\xadV\xcb\x1bc\ +DDf:=\x11\xb9d\x8c\x91v\xbb}\xabkt\ +.zN\x0c\x15\xc0q\x9c\xe7\xc0\x83\x18\xeb{\x10\x04\ +\x97;\x85\xef\xfb\xd5\xe8u|\xa8\x00\x00Z\xebk1\ +\xed\x8a\xeb\xba\xaf;\x85\xeb\xba\xab\xc07`\x87\x88\xf4\ +\xb4\xc5{\x06\xb0,\xeb1\x7f\xb6\x1b\xc0\xba\xe7y\xd7\ +cF\xd7{\xcd\xec\x0b \xd2y\xe0\x07\x80Rj\xba\ +P(|\x8e\x99I\x01kJ)\x19:\x80m\xdb-\ +\xa0\x1c\x95\xd3\x1b\xfd\x85\x85\x85m\xc0n\xe0M\xaf\x99\ +}\x1fD\xb6m\xdfPJ\x9d\xce\xe5rK\x1b=\xdf\ +\xf7\xf7\xf1\xebx\x7f\x99\x18\x00@.\x97\xbb\x1d\xd7\x0f\ +\xc3\xf00\x80Rj.\xce\x1f\x1a\xc0?\xc3\xb4\x9e\x04\ +\xda\xe9t\xfa^b\x00\xf5z\xfd\x9c1F\x8c1\x7f\ +\xfd\x03\xc6\x98c\x22R\x04f2\x99\xcc\x97\xc4\x00\x96\ +\x97\x97g\x81\x17\xc0d\xa3\xd1\xb0\x01\x1a\x8d\xc68p\ +\x13\xf8\x00\x5c\xe9'o\xa0\x0b\xc9\xfc\xfc\xfc\xfe \x08\ +\x9e\x00{\x80G\x80\x15Y'l\xdb~\x968\x00\xfc\ +\xbe\x98\x94\x81,\xd0J\xa5R\x95l6\xfb~\xd0\xbc\ +\x91F\xda\xbc\xfa\x09\xf4d\xbcP\xaa{q\x90\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\x1f\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x02\x9cID\ +ATX\x85\xed\x95MH\x15a\x14\x86\xdf\xf3\xdd\xa0\ +\x88(Z\xb40\xa8V\x11\x98`3\xdfw\xd5H\x04\ +wIP\x8b\xc2v\x15\xd9*\x22\x02\xa3 \xdcD\xd1\ +B\x027\x0aQ\x14A\xeb\xa8E\xd8\x1f\xd1\xa24t\ +\xce7\xa1d\x8b\x0c\x8a\xa8\x88h\x11)\x82\xb7f\xde\ +6\x067\x9b\xab\xe3_+\xdf\xdd\xbcs~\x9es\x18\ +\xce\x00\xcbZ\xd6\x12\x88\xa4\xc9\x1b\x9b;0\xaf\xa2(\ +\xba\xa1\xaa\xdf\xf3\xc6\xafX\xac\xc6\x83\x83\x83\x9b\x8c1\ +\xcf\x00\xac\x02p-o\xde\xa2l@U\xdb\x8d1o\ +\x01\x0cXk\xab\x00|\xcd\x9b\xbb\xa0\x0d\xa8\xeaj\x92\ +\xbd\x00\x8a\x22\xb2\xdfZ{o\xca\xcf]Cf(\xce\ +\x85\xc0\x95\xcb9W\xb1OE\xa9\xea\xd9,\x9f\xa4\xf1\ +\xde\xdf\xf2\xdeO\xaa\xea\x93\xd9rU\xf5\xd2L}\xe6\ +\xf4\x0d\xc4q\x5c\xad\xaa\x9fI6\x91\xdc\x0a``.\ +\xf9\x0b\x02\xf0\xde\x9fK\xd3\xf4\xa5\x88\x01\ +(\x00\xf8\xe1\xbd\x9f\x10\x91\x1e\x00\xdd\xe3\xe3\xe3;\xad\ +\xb5w\xc6\xc6\xc6\x1a\x00\x5c\x07pPUOV\x1cd\ +\xba\x11\xc7qm\x9a\xa6\xfd\x22r\x9b\xe4^\x92{D\ +\xa4\xd1Z\xdb\x19\xc7\xf11\x92\x97\x01\xac\xfdg\x12c\ +\xb6\x87a\xf8:c\x98]\x22r\x9fdK\xb1X\xec\ +\x9bu\x03a\x18\x0e%IRc\xad=D\xf2\xbc\x88\ +<\x10\x91@U{I^\x00\xf0(k\x12\x92\x8dY\ +~\xb1X\xecK\x92\xa46\xaby&\x00\x00\xd4\xd7\xd7\ +\xbf\x9bJ\xee\x12\x91v\x92\xadS\xc7\xa8\x06\xc0\xf3\xac\ +\x9c4M7f\xf9\xe5\xf5r\x03\x94\xcbZ{\xb5P\ +(ls\xce\xb5:\xe7\xbe\x01(e\xc5\x89\xc8\xdc\x7f\ +\xb9y\x00\x00 \x08\x82\xd1\xb2F\x1f+\x00d\xfa\x8b\ +\x02P\xae$I\x22\x00\x93\xd3\xec_\xc6\x98\xc7\xff\x05\ +\xa0\xae\xae\xee\x0b\xc9#\x00\xde\x00\x18\x070J\xb2-\ +\x08\x82\xf7\xf3\x01X\xd6\xb2~\x03(;\x1fE_\xdf\ +\xe8]\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xdb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\ +\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01B(\x9bx\x00\x00\x00\x19tEXtSof\ +tware\x00www.inksca\ +pe.org\x9b\xee<\x1a\x00\x00\x01XID\ +ATX\x85\xed\x96\xbdJ\x03A\x14\x85\xbf\xd9\xb8\x86\ +U\xf1\x11\xf2\x02)3\x91E+\xc1N\xb0\x11\xb6\xb2\ +\xb4\xf1ElE\x04\x1fb\xc1\xd6:\x85\x90-&v\ +y\x81\xd46\x8a\xb2\x1a\x9d\xb9\x16\xa2\xc4\xb0\x90M\xb2\ +\xd9U\xd8\xd3\xcd\xdc\x99s>\xe6\x07.\xd4\xaa5\xa1\ +\xe1p\xb8^v\xa6\x9a\x1c\x18c\xc6\x80\xbf\xea\xd0N\ +\xa7\xe3)\xa5\x04`\xad`o\xab\xb5\xfe\xe5i\x8c\xf1\ +\x81\x97 \x08\xb6\xd24}\x9b\xdeP4@\xc3\x18#\ +Y\x85\xac\xf0L\x80 \x08\x9a\xedv{\x5c0\x18\xf0\ +\xf5\xc6\xd24}\xfe>~\x00o\x15A\xf3\xa8\x06\xa8\ +\x1c \xd7/0\xc6\xf4\x81pN\xef\x9e\xd6z\x7f\xd6\ +\xa2\x99' \x22\xde\x02\xe1\x00{y\x16U~\x05\xff\ +\x1e\xe0\x1a\xb8Z)\x80R\xca\x89H?\xabf\xad\xbd\ +q\xce\xdd\x03\xb7\x19\xe5\xbb<\x00\xb9~A\xb7\xdb\xdd\ +\xcd\x9a\x8f\xe3\xb8\xd1j\xb5\x1e\x9ds;a\x18\x1e\xe6\ +\xf1\x9aV\x11o`\x13\x88\x8d1\x1bU\x01\x00\xb4\xad\ +\xb5\x97U\x02 \x22\xa7I\x92\x9cT\x06\x00\xbc\x02\xc7\ +I\x92l\x97\x0d\xd0\x13\x91s`\xdd\xf3\xbc\xb30\x0c\ +\x9fJ\x03\x88\xa2\xc8\x8eF\xa3\x03\xdf\xf7/\x80\x0f\xe7\ +\xdc\xd1\xbc\x1eK\xb7dQ\x14Y\xe0\x01h.\xb2\xff\ +\xa7+\x16\x115\x18\x0c\xdc\xb2@9\xf4\xae\xb5.\xbd\ +\xfd\xaf\xf5w\xf5\x09&'l8z%e\x18\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03M\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Save\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x024\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Syst\ +em / File\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x06\xd9\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Settings\x0d\x0a Created with Sk\ +etch.\x0d\x0a \ + \x0d\x0a \x0d\x0a <\ +/path>\x0d\x0a \ +\x0d\x0a\ +\x00\x00\x02f\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Add\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x03%\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Syst\ +em / Folder\x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x05\x05\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Folder / De\ +fault\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xf3\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Syst\ +em / Goto previo\ +us level\ +\x0d\x0a \x0d\x0a \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x03A\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Audio\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Icons-/-Sy\ +stem-/-Audio\x22 st\ +roke=\x22none\x22 stro\ +ke-width=\x221\x22 fil\ +l=\x22none\x22 fill-ru\ +le=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \ +\x0d\x0a \x0d\x0a\ + \x0d\x0a\ +\ +\x00\x00\x02\x86\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Folder\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x02\xeb\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a Icons / Syst\ +em / Goto next l\ +evel\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03U\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Select File\ +s\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x05[\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Move\x0d\x0a Cre\ +ated with Sketch\ +.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03(\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Delete\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x04\xd0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Rotate\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + <\ +/path>\x0d\x0a \ +\x0d\x0a \ + \x0d\x0a\ +\x00\x00\x03S\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Scale\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22Icons-/-Sy\ +stem-/-Scale\x22 st\ +roke=\x22none\x22 stro\ +ke-width=\x221\x22 fil\ +l=\x22none\x22 fill-ru\ +le=\x22evenodd\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x04\x17\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Camera\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a\ + \x0d\x0a \x0d\x0a\ +\ +\x00\x00\x02\xe5\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Grid - larg\ +e\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03\xb7\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Grid - smal\ +l\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\ +\x00\x00\x00\x00\ +\ +\x00\x00\x06'\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQR\ +adioButton\x0d\x0a{\x0d\x0a \ + font-size: 12\ +px;\x0d\x0a line-he\ +ight: 18px;\x0d\x0a \ + outline: 0;\x0d\x0a}\x0d\ +\x0a\x0d\x0aQRadioButton:\ +disabled\x0d\x0a{\x0d\x0a \ + color: #999999;\ +\x0d\x0a}\x0d\x0a\x0d\x0aQRadioBut\ +ton::indicator:!\ +focus\x0d\x0a{\x0d\x0a wi\ +dth: 16px;\x0d\x0a \ +height: 16px;\x0d\x0a \ + margin: 2px;\x0d\ +\x0a}\x0d\x0a\x0d\x0aQRadioButt\ +on::indicator:fo\ +cus\x0d\x0a{\x0d\x0a widt\ +h: 18px;\x0d\x0a he\ +ight: 18px;\x0d\x0a \ + margin: 1px;\x0d\x0a}\ +\x0d\x0a\x0d\x0aQRadioButton\ +::indicator:chec\ +ked\x0d\x0a{\x0d\x0a imag\ +e: url(:/stylesh\ +eet/img/UI20/rad\ +iobutton/checked\ +.svg);\x0d\x0a}\x0d\x0a\x0d\x0aQRa\ +dioButton::indic\ +ator:checked:dis\ +abled\x0d\x0a{\x0d\x0a im\ +age: url(:/style\ +sheet/img/UI20/r\ +adiobutton/check\ +ed-disabled.svg)\ +;\x0d\x0a}\x0d\x0a\x0d\x0aQRadioBu\ +tton::indicator:\ +checked:focus\x0d\x0a{\ +\x0d\x0a image: url\ +(:/stylesheet/im\ +g/UI20/radiobutt\ +on/checked-focus\ +.svg);\x0d\x0a}\x0d\x0a\x0d\x0aQRa\ +dioButton::indic\ +ator:unchecked\x0d\x0a\ +{\x0d\x0a image: ur\ +l(:/stylesheet/i\ +mg/UI20/radiobut\ +ton/unchecked.sv\ +g);\x0d\x0a}\x0d\x0a\x0d\x0aQRadio\ +Button::indicato\ +r:unchecked:disa\ +bled\x0d\x0a{\x0d\x0a ima\ +ge: url(:/styles\ +heet/img/UI20/ra\ +diobutton/unchec\ +ked-disabled.svg\ +);\x0d\x0a}\x0d\x0a\x0d\x0aQRadioB\ +utton::indicator\ +:unchecked:focus\ +\x0d\x0a{\x0d\x0a image: \ +url(:/stylesheet\ +/img/UI20/radiob\ +utton/unchecked-\ +focus.svg);\x0d\x0a}\x0d\x0a\ +\x0d\x0a\x0d\x0a\x0d\x0a\ +\x00\x00\x00.\ +E\ +rrorFrameColor=#\ +E25243\x0d\x0aErrorFra\ +meWidth = 2\x0d\x0a\ +\x00\x00\x00\x1a\ +[\ +Hyperlink]\x0d\x0aColo\ +r=#44B2F8\ +\x00\x00\x04?\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAz\ +QtComponents--Co\ +lorLabel\x0d\x0a{\x0d\x0a \ + margin: 0px;\x0d\x0a \ + padding: 0px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCompo\ +nents--ColorLabe\ +l AzQtComponents\ +--Swatch\x0d\x0a{\x0d\x0a \ + margin: 0px;\x0d\x0a \ + padding: 0px;\ +\x0d\x0a min-width:\ + 32px;\x0d\x0a max-\ +width: 32px;\x0d\x0a \ + min-height: 16\ +px;\x0d\x0a max-hei\ +ght: 16px;\x0d\x0a \ +border: 0px;\x0d\x0a}\x0d\ +\x0a\x0d\x0aAzQtComponent\ +s--ColorLabel Az\ +QtComponents--Co\ +lorHexEdit\x0d\x0a{\x0d\x0a \ + margin: 0px;\x0d\ +\x0a padding: 0p\ +x;\x0d\x0a max-widt\ +h: 100px;\x0d\x0a m\ +in-width: 100px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCompo\ +nents--ColorLabe\ +l AzQtComponents\ +--ColorHexEdit >\ + QLineEdit\x0d\x0a{\x0d\x0a \ + max-width: 10\ +0px;\x0d\x0a min-wi\ +dth: 100px;\x0d\x0a}\ +\x00\x00\x0a\x86\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a\x0d\x0a\ +.primaryText\x0d\x0a{\x0d\ +\x0a color: #FFF\ +FFF;\x0d\x0a}\x0d\x0a\x0d\x0a.seco\ +ndaryText\x0d\x0a{\x0d\x0a \ + color: #888888\ +;\x0d\x0a}\x0d\x0a\x0d\x0a.highlig\ +htedText\x0d\x0a{\x0d\x0a \ + color: #44B2F8;\ +\x0d\x0a}\x0d\x0a\x0d\x0a.blackTex\ +t\x0d\x0a{\x0d\x0a color:\ + #000000;\x0d\x0a}\x0d\x0a\x0d\x0a\ +/*\x0d\x0a Qt suppo\ +rts the line-hei\ +ght field, but o\ +nly for QTextEdi\ +t controls, not \ +for QLabel.\x0d\x0a \ + Even then, the \ +support isn't ex\ +actly what we wa\ +nt.\x0d\x0a So inst\ +ead, we apply ma\ +rgin-top and bot\ +tom appropriatel\ +y to get the req\ +uired spec.\x0d\x0a\x0d\x0a \ + To get the ri\ +ght line-height,\ + we need to do:\x0d\ +\x0a\x0d\x0a margin-to\ +p: ((line-height\ + - font-size) / \ +2) px;\x0d\x0a marg\ +in-bottom: ((lin\ +e-height - font-\ +size) / 2) px;\x0d\x0a\ +*/\x0d\x0a\x0d\x0a/*\x0d\x0a Qt\ + Style Sheets pr\ +ovide the font-w\ +eight property b\ +ut it expects th\ +e following\x0d\x0a \ + values:\x0d\x0a \ + normal\x0d\x0a \ + | bold\x0d\x0a \ + | 100\x0d\x0a \ + | 200\x0d\x0a \ +...\x0d\x0a | 9\ +00\x0d\x0a\x0d\x0a Using \ +the QFont::Weigh\ +t values as guid\ +ance, we extrapo\ +late Light to 25\ +0.\x0d\x0a*/\x0d\x0a\x0d\x0a.Headl\ +ine\x0d\x0a{\x0d\x0a font\ +-family: \x22Open S\ +ans\x22;\x0d\x0a font-\ +size: 24px;\x0d\x0a \ + font-weight: 25\ +0;\x0d\x0a margin-t\ +op: 4px;\x0d\x0a ma\ +rgin-bottom: 4px\ +;\x0d\x0a}\x0d\x0a\x0d\x0a.Title\x0d\x0a\ +{\x0d\x0a font-fami\ +ly: \x22Open Sans\x22;\ +\x0d\x0a font-size:\ + 18px;\x0d\x0a marg\ +in-top: 7px;\x0d\x0a \ + margin-bottom:\ + 7px;\x0d\x0a}\x0d\x0a\x0d\x0a.Sub\ +title\x0d\x0a{\x0d\x0a fo\ +nt-family: \x22Open\ + Sans\x22;\x0d\x0a fon\ +t-size: 16px;\x0d\x0a \ + font-weight: \ +250;\x0d\x0a margin\ +-top: 8px;\x0d\x0a \ +margin-bottom: 8\ +px;\x0d\x0a}\x0d\x0a\x0d\x0a.Menu\x0d\ +\x0a{\x0d\x0a font-fam\ +ily: \x22Open Sans\x22\ +;\x0d\x0a font-size\ +: 12px;\x0d\x0a mar\ +gin-top: 6px;\x0d\x0a \ + margin-bottom\ +: 6px;\x0d\x0a}\x0d\x0a\x0d\x0a.La\ +bel, QLabel\x0d\x0a{\x0d\x0a\ + font-family:\ + \x22Open Sans\x22;\x0d\x0a \ + font-size: 12\ +px;\x0d\x0a margin-\ +top: 1px;\x0d\x0a m\ +argin-bottom: 1p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0a.Paragr\ +aph\x0d\x0a{\x0d\x0a font\ +-family: \x22Open S\ +ans\x22;\x0d\x0a font-\ +size: 12px;\x0d\x0a\x0d\x0a \ + /*\x0d\x0a li\ +ne-height doesn'\ +t work with mult\ +i-line text fiel\ +ds.\x0d\x0a With\ + single-line tex\ +t fields, we can\ + get close enoug\ +h using the marg\ +in-top and margi\ +n-bottom. That d\ +oesn't\x0d\x0a w\ +ork for multi-li\ +ne fields, becau\ +se there's no in\ +between line mar\ +gins.\x0d\x0a */\x0d\x0a\x0d\ +\x0a margin-top:\ + 4px;\x0d\x0a margi\ +n-bottom: 4px;\x0d\x0a\ +}\x0d\x0a\x0d\x0a.Tooltip\x0d\x0a{\ +\x0d\x0a font-famil\ +y: \x22Open Sans\x22;\x0d\ +\x0a font-size: \ +12px;\x0d\x0a margi\ +n-top: 2px;\x0d\x0a \ + margin-bottom: \ +2px;\x0d\x0a}\x0d\x0a\x0d\x0a.Butt\ +on\x0d\x0a{\x0d\x0a font-\ +family: \x22Open Sa\ +ns\x22;\x0d\x0a font-s\ +ize: 12px;\x0d\x0a \ +font-weight: 570\ +;\x0d\x0a margin-to\ +p: 6px;\x0d\x0a mar\ +gin-bottom: 6px;\ +\x0d\x0a}\x0d\x0a\ +\x00\x00\x01\x0b\ +[\ +DropIndicator]\x0d\x0a\ +rectOutlineWidth\ +=1\x0d\x0arectOutlineC\ +olor=#00A1C9\x0d\x0aba\ +llFillColor=#0x4\ +44444\x0d\x0aballOutli\ +neColor=#00A1C9\x0d\ +\x0alineSeparatorCo\ +lor=#00A1C9\x0d\x0alin\ +eSeparatorOutlin\ +eWidth=1\x0d\x0aballDi\ +ameter=5\x0d\x0aballOu\ +tlineWidth=1\x0d\x0a\x0d\x0a\ +[DragIndicator]\x0d\ +\x0arectBorderRadiu\ +s=2\x0d\x0arectFillCol\ +or=#888888\ +\x00\x00\x00'\ +L\ +inkColor=white\x0d\x0a\ +OptimalPathWidth\ +=0.8\x0d\x0a\ +\x00\x00\x00z\ +[\ +HeaderView]\x0d\x0aBor\ +derColor=#dddddd\ +\x0d\x0aBorderWidth=1\x0d\ +\x0aFocusBorderColo\ +r=#00a1c9\x0d\x0aFocus\ +BorderWidth=1\x0d\x0aF\ +ocusFillColor=#1\ +0ffffff\x0d\x0a\ +\x00\x00\x03\xbf\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a/*\ +\x0d\x0a* BreadCrumbs \ +are QWidgets wit\ +h a QHBoxLayout \ +with 0 content m\ +argins, a QToolB\ +utton\x0d\x0a* to disp\ +lay the overflow\ + menu and a QLab\ +el child widget.\ +\x0d\x0a*/\x0d\x0a\x0d\x0aAzQtComp\ +onents--BreadCru\ +mbs #breadcrumbs\ +-separator\x0d\x0a{\x0d\x0a \ + background-co\ +lor: #373737;\x0d\x0a}\ +\x0d\x0a\x0d\x0aAzQtComponen\ +ts--BreadCrumbs \ +#MenuButton\x0d\x0a{\x0d\x0a\ + qproperty-ic\ +on: url(:/Breadc\ +rumb/img/UI20/Br\ +eadcrumb/dot-dot\ +-dot_with_arrow.\ +svg);\x0d\x0a qprop\ +erty-iconSize: 2\ +2px 11px;\x0d\x0a}\x0d\x0a\ +\x00\x00\x03\x08\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAz\ +QtComponents--Sl\ +ider.HorizontalS\ +lider\x0d\x0a{\x0d\x0a qp\ +roperty-toolTipO\ +ffsetX: -8;\x0d\x0a \ + qproperty-toolT\ +ipOffsetY: -16;\x0d\ +\x0a}\x0d\x0a\x0d\x0aAzQtCompon\ +ents--Slider.Ver\ +ticalSlider\x0d\x0a{\x0d\x0a\ + qproperty-to\ +olTipOffsetX: 8;\ +\x0d\x0a qproperty-\ +toolTipOffsetY: \ +-24;\x0d\x0a}\ +\x00\x00\x00M\ +H\ +eaderIconSizeInP\ +ixels=16\x0d\x0aToolTi\ +pPaddingInPixels\ +=5\x0d\x0aDisabledIcon\ +Alpha=0.25\x0d\x0a\ +\x00\x00\x00\x00\ +\ +\x00\x00\x03\xa5\ +\x00\ +\x00\x0e5x\x9c\xbdV[o\xdb6\x14~\x0f\x90\xff\ +p`\xbf$\x81-_\xe6\x06\x85\x8a=(v\x8a\x09\ ++l4r\x11\x0c\xc3\x1eh\x89\x92\x89J\xa4F\xd2\ +\x89\x95a\xff\xbd\x87\xba8\xb6,\xbbq\xddM@\x10\ +\xf1\x5c\xbe\xf3}\xe7P4{7\x97\x177\xe0\xc41\ +\x08\x09\xa9\x90\x9a\x09\xae@\x84\xa0\x97LA\xc8b\x0a\ +c\x91f\x92EK\x0dW\xfe58\x09y\x11\xdc\xf2\ +E\xd2\x01\x97\xfb\x96\xc9cZ\x01\x091\x98\x11M1\ +[\x1aLc\x8c\x99O\xb9\x12RYh1\xc6\x8f\x18\ +\x8d\xa9iL5\xc5\x97\x0a\x98\xf0\xa0\x8c\xa5\xa0\xa9L\ +\x14`\x04\xc1\x85\xa2hXR\xf8\xe4\x8e\xef\xa7\xde=\ +\x10\x9d/\xa5\x10\xba\x22i`\x03\xa6\xb4d\x8b\x95a\ +\x0fW&\xa2\xf5\xa9\x80k][\xb9\xba\x15\x82U\xaa\ +\x94\x08\xf53\x91\x14\xf0=\x12OTr\x1a\xc0\x22+\ +\x0a\x15i\x1d\x83*d\x07X\x08\xa9\x14O,\xa0A\ +\xa7\x8a\xa9\x98.h,\x9e\x8d\xfem#\xf1\x8d>\xc2\ +3\xc6\xa3\xd7&Z0\x11\xc0\x856\xb0\x92&X\xd4\ +\xe4%\x22`a\x86\xea\xb3M:\xc6\xe0\x9b\xb2`\xbe\ +\xe9?\xfe\xdf\xe8C\xa2\xa8\x90ph9\x1e\xb8^\x0b\ +\xee\x1c\xcf\xf5r\xb6\x8f\xee\xfc\xb7\xd9\x979<:\x0f\ +\x0f\xcet\xee\xde{0{\x80\xf1l:q\xe7\xeel\ +\x8a\xab\x8f\xe0L\xff\x80\xdf\xdd\xe9\xa4\x03\x94!i\x09\ +t\x9dJ\xaaT>D\x9c\x0a\xa3A9\xa9\xde\xe5\xc5\ +\xe5\x85\xf3\xf2Y\x8fQ\x8d\xe0\x94k\xd5\xed\xce\x99\x8e\ +\xe9\x1d\xc1\xf1\xfesy\x01\xf8,\x88\xff5\x92b\xc5\ +\x83\xae/b!mh\x0f\xf2\xe7C\xe9\x172\xa0h\ +\x1d\xa4k\xecz\xcc\x02h\xf7\xf3\x07\xfd\xff\x1e\xab\xf0\ +g \xc9\xb3\xa3\xe6d\x81\x8b_[Z\xaeh\xeb\xaf\ +\xd7\xb2%,\xc7\xb47!yF\x1c\xdd\xc7\xd9\xa7?\ +\xcc\x9f\x1d\xfa\xdd\x85\xd0Z$6\xfc\xf2\xaab\xa3\xf2\ +hm\xb89RJK\xc2U\x8a\xdb\x90\xeb\xef\xe2\xb4\ +\xb5y\xdb\x80\x85\x82\xebnH\x12\x16g6\xb4f)\ +\xe5\xe0!X\xeb\xc3\x96[\xb1\x17\x8a\x8d\x1f\xa5\xeb\xd2\ +\x9a\x10\x191\xde\x8di\xa8\xd1\xde\xaf\xdb\xf3\x0f\x11\x1d\ +\xb7\xb9\xe3;tp'j<'6\x84v1\x0eN\ +w\x22\xfc\xaf\x98\x7f\x97g\xefM\xb3_\xcd\xd3\x18\xff\ +\xc6\xaf.\xa5Rg]\xe6\x0b\xee\x15b\x90[E0\ +\xaf\x8a%\x9fY\xa0\x978\x9a\xe1\x96\x9eu\x93\x15c\ +\x97\xb4\xe0W\x0b\xae\x99O\xdf\x978\x1e\x5c7\xb7d\ +k\xef\x9c\x8d\x0do\xebgc\xebF\xa6u\xaf\x9b\xa1\ +\xb1\xe7[\xfd\x1c\xde6\xf5sx\xdb\xd8\xcfZp\xcd\ +|\xea\xd7\xf9\x7f\xaa\x1c5\xaa\x1c5\xab\x1c5\xab\x1c\ +\x1dQ\x99\x8f\xf2\x1cAC#h\xf8fA\x83FA\ +\x83fA\x83fA\x83-A\x9f\xe7B\xc4\x05\xcf6\ +\xa6\xb2\x04Y\x15\xcbN\xcdI\xd6\x87\x9d~,T\xe9\ +\x81\xd3\xe6\xb794\xeb\xc7\xe5\xf1\x91\x9d=\xc8\xc3\xba\ +\xed\xa5\xb90\x1cU_\x84@\xc3\xd1o\x83\x8c\x16\xe4\ +j\xf8\xee]\xa7\xfa\xeb[\x83\xeb\xa6\xaa[=+\xf1\ +\x1a\xd0\xdaw\xef\xfb\x93\xc1\xf8\xc8\xf6{dAD5\ +\x1c@>0\x0c\x1bV2\xbe\xb2{Jg1UK\ +Ju\x8f%Q\xef\x8b;\xec\xf7\xf2\x1f\xa2\x05\x91\xdd\ +\x1c\xc6RO\xd1\xf5\xa1\xf2;\xdb\xdc\xca\xe37\x05w\ +a~f\xd5f\xd1\xbb\x13:Gw\x85t\x82\xf4*\ +e_}\xe5\xf9\xc9\xe5\x0f\xf4`g#\x9f\xd5\x83\x12\ +\xe9\x94\x1e\x94)\x0d=(=\xffey\x1b/\xd0d\ +\x11\xd3\xe0\xf8\x06|\xcb}r\xef4/\x0ey\xdb\xc6\ +\xdfi;dR\xe9\xce\x0f&\x0b\x1eg\xb5KQy\ +[;\x83\xd7\x0f\x90A.u\x1aZ\xa4\xdb,\xbe\x01\ +\xfb\xbd\x89\xd3\ +\x00\x00\x00\x12\ +P\ +ixelsPerStep=10\x0d\ +\x0a\ +\x00\x00\x03\xe1\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQMen\ +uBar\x0d\x0a{\x0d\x0a min\ +-height: 28px;\x0d\x0a\ + height: 28px\ +;\x0d\x0a font-fami\ +ly: \x22Amazon Embe\ +r\x22;\x0d\x0a font-si\ +ze: 12px;\x0d\x0a m\ +argin: 0px;\x0d\x0a \ + spacing: 0px;\x0d\x0a\ + border-botto\ +m-width: 2px;\x0d\x0a \ + border-bottom\ +-color: #111111;\ +\x0d\x0a border-bot\ +tom-style: solid\ +;\x0d\x0a}\x0d\x0a\x0d\x0aQMenuBar\ +::item\x0d\x0a{\x0d\x0a p\ +adding-left: 14p\ +x;\x0d\x0a padding-\ +right: 14px;\x0d\x0a}\x0d\ +\x0a\x0d\x0aQMenuBar::ite\ +m:selected\x0d\x0a{\x0d\x0a \ + background-co\ +lor: #555555;\x0d\x0a}\ +\x0d\x0a\x0d\x0aQMenuBar::it\ +em:pressed\x0d\x0a{\x0d\x0a \ + background-co\ +lor: #222222;\x0d\x0a}\ +\ +\x00\x00\x00\x00\ +\ +\x00\x00\x01Z\ +T\ +earIcon=:/styles\ +heet/img/UI20/te\ +ar.svg\x0d\x0aTearIcon\ +LeftPadding=3\x0d\x0aT\ +abHeight=30\x0d\x0a# M\ +inimumTabWidth =\ + CloseButtonSize\ + + CloseButtonRi\ +ghtPadding + Tea\ +rIcon.width + 2 \ +* TearIconLeftPa\ +dding\x0d\x0aMinimumTa\ +bWidth=16\x0d\x0aClose\ +ButtonSize=16\x0d\x0aT\ +extRightPadding=\ +40\x0d\x0aCloseButtonR\ +ightPadding=4\x0d\x0aC\ +loseButtonMinTab\ +Width=32\x0d\x0aToolTi\ +pTabWidthThresho\ +ld=96\x0d\x0aOverflowS\ +pacing=24\ +\x00\x00\x03\xbb\ +\x00\ +\x00\x11\x8bx\x9c\xcdXMo\xe36\x10\xbd\x1b\xf0\x7f\ +\x18\xa4\x87M\x16\xfe\xc8\xa6E\xd1\xaa\xe8\xc1\xeb$X\ +\xa1\xbb\x0e\x1a;\xbb-\x8a\x1ehq$\x13+\x91\x06\ +I\xc5v\x8a\xf6\xb7w([r\x1c\xcb\x92\xad\xf4P\ +_\x22\x8e\x1f\xe7\xbd\x99G\x91t\xda\xad\xfe\xdbv\xeb\ +-\x0c\xe2\x18\x94\x86\xb9\xd2V(i@\x85`g\xc2\ +@(b\x84\xa1\x9a\xaf\xb4\x88f\x16\xce\x83\x0b\x18$\ +\xecI\xc9^\xa0\x92\x0e\xf82\xe8\xb9y\xc2\x1a`!\ +\x81\x05\xb3H\xb3\xb5\xcb\xe9\x82\xb1\x08P\x1a\xa5M\x8f\ +\x22.xKh\x9a:\x8f\xd1\x22=\xe4\x89\x99\xe4\x1b\ +,\x82E\x9d\x18 \x04\xa3\x81A\x0a\xcc\x10>\xfa\xc3\ +\x9b\xd1\xf8\x06\x98\xcd\x86Z)\x9b\x8bti\xb90V\ +\x8bi\xea\xd4\xc3\xb9C\x9c}\x5c\xa7;\xbb\xe8e\xd5\ +\xa5\x94,\xaf\xca\xa8\xd0.\x98F\xa0\xe7H=\xa2\x96\ +\xc8a\xbaZ\x13\xad\xa7u\x5cV\xa5; B\x98k\ +\xf5(8\xf2N\x8e\xc9\x95N1V\x0bW\xff\xf3 \ +\x0b\x5c}L\xae\x84\x8c\xb6M\xec\xc1\xb5\x02\xa9\xacK\ +\xab1!R7/Q\x5c\x84+\xaa~UL'\x0c\ +=\x99\x1eL\x8a\xfe\xd3\xdf\xa2>\x12J\x152\x09g\ +\x831\xf8\xe33x?\x18\xfb\xe3L\xed\x17\x7f\xf2\xe1\ +\xeea\x02_\x06\xf7\xf7\x83\xd1\xc4\xbf\x19\xc3\xdd=\x0c\ +\xefF\xd7\xfe\xc4\xbf\x1b\xd1\xe8\x16\x06\xa3\xdf\xe1\x17\x7f\ +t\xdd\x01\x14$Z\x03.\xe7\x1a\x8d\xc9L$W\x04\ +\xf2\x8dS\xfdv\xab\xdd\xfau8\xc3\xe0\xeb{\xb5l\ +\xb7\xfej\xb7\x80>S\x16|\x8d\xb4J%\xef\x06*\ +V\xda\x03\xab\x994s\xea\xa6\xb4?\xad1\xa1\x92\xb6\ +k\xc4\x13z\xf0\xeej\xbe\xdcDc!\xb1;Cg\ +7\xc5\xbf/\xe2*\xb5\xee+\x0f.)\xf0\xf7\x0e\xab\ +Ge\xb3i\x8c\xbc\xa0\xdfp~\xf3c\xf6)&\x0c\ +\xa6\xd4\x1e\x16X\xdfb\xf2Y\xe0\xc2\xf3\x84\xe4\x22`\ +\x96\x1c|\x9eo\x1b\x86M\xc2\x85\xe0v\xb6\xa3\xa7D\ +b\xc2t$\xa4\x07\xebbj)\xdd\x13\xbaU,$\ +\xbd\x0e\x07\x04\xec\x826jD\xc2\x22\xeaD\xaa\xe3s\ +\xafo\xec*F3C\xb4}\x91D\xfd\x07\xff\xea\xb2\ +\x1f\xb8DS\xb5\xecS\xc3\xad`q\xd7`\x8c\x01\xad\ +\x8a\x9ey\x8c.N\x17\xe7\x85*H\xcdQ\x12\xd7P\ +x\xb5\xd2n\x96\xa7\xa9\xde|E\x1c'9G\xff\x07\ +\xaa\xf3T\xc7\x0b\xcfr\x1dV\xba\xf9\xfati\xb4\xf9\ +\x9e\xaa\xa1\xda\xe6\x1dP\x13=\xa7Z\x9a\x13\xd6\x99\xf9\ +\x12\xd7H\xdb\xe9\xc6\xa5\xb2\xc6\xba\x02\xd0@P\x186\ +\x10R\xed\xdf\x0bX#Q\xa7Z\xb8\xe5\xac3q\x1f\ +\xd9L`\xb9\x8f9co\xa2\xa2(\xc6\xf1B\xd8`\ +\xf6\x8c\xbe896\x1b\xfd\xb7WU\x1b\xfdTi\x8e\ +\xba\xbb\xc1^V\x1e\x00u\xcc\xdeC^x\xa1\xa1\xb6\ +`\x9b\xa52Y\xaa~\xd1\xb8\xd3*\xde?4\x1b\xd2\ +6\xec\xf8\xb6\xee\xf5r\xdcs\xe0\xbb}\x07~8\xda\ +\x81wE\xa4iU%\x0b\xbd\xb6\xa4\xe1\xab\x8clf\ +\xe3\xf0\xc5[\xf3:\xf2\xa6f\x0e\xff\x7fV\x1ec\xe4\ +\xcd\x92n\xe0\xc4~\xd2\xbd\x95F\x01]\xda\xcb\xb4n\ +#s\xc6\xf9K\x90\x90e\x17\xdb\x84-K\xc3\x84\xde\ +\xbfu:\xf0n\xf4@E\x15{[\xf5%vm\x87\ +G?0$\x96VWOXv\xa5\xa9\xc2\x95\x9e\x0d\ +\x95\x13v\x97\xd9\xce\xba\x182\xcd\xcdvI\xac\x87\x01\ +\xf9g\xbb\x5c-d\xcdB\xa8R\xd7\x88\xaf\xee\x85*\ +#.\xbdXT#\x8foaz`\xdb=\xb6\xa8\xec\ +\x87x\x93b\x9a\xf71\xa3<\xf2\x82\xf6G\x103c\ +\xfe\xf9\xf9\xcdga\xc4T\xc4\xc2\xae>)\x8eo\xfe\ +,q\xb6\x5c\xc8\xcd'\xe5\xfe=p\xfb[\x9fR\xa4\ +,\x16O\xcc\x8d3\xdaW\xb1\xa6\xd5\x07\xfd\x01\xde\x0f\ +\x82s|\xc6\xfe/>\xff\xc2;\ +\x00\x00\x00\x00\ +\ +\x00\x00\x03\x01\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQT\ +oolTip\x0d\x0a{\x0d\x0a c\ +olor: #ffffff;\x0d\x0a\ + background-c\ +olor: black;\x0d\x0a \ + border: 1px tr\ +ansparent black;\ +\x0d\x0a margin-lef\ +t: 2px;\x0d\x0a fon\ +t-size: 12px;\x0d\x0a \ + margin-top: 4\ +px;\x0d\x0a margin-\ +bottom: 4px;\x0d\x0a \ + font-family: \x22\ +Open Sans\x22;\x0d\x0a}\x0d\x0a\ +\ +\x00\x00\x00\x00\ +\ +\x00\x00\x0dS\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a/*\ + ===============\ +================\ +================\ +============== *\ +/\x0d\x0a/* Global sty\ +les \ + \ + \ + */\x0d\x0a/* =====\ +================\ +================\ +================\ +======== */\x0d\x0a\x0d\x0a\x0d\ +\x0a*\x0d\x0a{\x0d\x0a backg\ +round-color: tra\ +nsparent;\x0d\x0a c\ +olor: white;\x0d\x0a \ + font-family: \x22\ +Open Sans\x22;\x0d\x0a \ + font-weight: 40\ +0;\x0d\x0a}\x0d\x0a\x0d\x0aQTableV\ +iew,\x0d\x0aQListView,\ +\x0d\x0aQTreeView\x0d\x0a{\x0d\x0a\ + /* give a ba\ +ckground color t\ +o views without \ +parent (complete\ +r popups)\x0d\x0a \ + it is reset to\ + transparent in \ +the next setting\ + for views with \ +a parent */\x0d\x0a \ + background-colo\ +r: #444444;\x0d\x0a}\x0d\x0a\ +\x0d\x0aQWidget > QTab\ +leView,\x0d\x0aQWidget\ + > QListView,\x0d\x0aQ\ +Widget > QTreeVi\ +ew\x0d\x0a{\x0d\x0a /* re\ +set the backgrou\ +nd-color of view\ +s with parents t\ +o transparent */\ +\x0d\x0a background\ +-color: transpar\ +ent;\x0d\x0a}\x0d\x0a\x0d\x0a/* Fi\ +x frame HLine an\ +d VLine drawing.\ + Affects QFrame \ +but not subclass\ +es */\x0d\x0a.QFrame[f\ +rameShape=\x221\x22],\x0d\ +\x0a.QFrame[frameSh\ +ape=\x222\x22],\x0d\x0a.QFra\ +me[frameShape=\x224\ +\x22],\x0d\x0a.QFrame[fra\ +meShape=\x225\x22],\x0d\x0a.\ +QFrame[frameShap\ +e=\x226\x22]\x0d\x0a{\x0d\x0a b\ +ackground-color:\ + #444444;\x0d\x0a}\x0d\x0a\x0d\x0a\ +QMainWindow:sepa\ +rator\x0d\x0a{\x0d\x0a ba\ +ckground-color: \ +#111111;\x0d\x0a}\x0d\x0a\x0d\x0aQ\ +MainWindow::sepa\ +rator:hover\x0d\x0a{\x0d\x0a\ + background-c\ +olor: #00A1C9;\x0d\x0a\ +}\x0d\x0a\x0d\x0aQMainWindow\ +,\x0d\x0aQDialog,\x0d\x0aQDo\ +ckWidget\x0d\x0a{\x0d\x0a \ + color: #cccccc;\ +\x0d\x0a background\ +-color: #444444;\ +\x0d\x0a}\x0d\x0a\x0d\x0aQTextEdit\ +,\x0d\x0aQPlainText,\x0d\x0a\ +QPlainTextEdit,\x0d\ +\x0aQLineEdit,\x0d\x0aQSp\ +inBox,\x0d\x0aQDoubleS\ +pinBox,\x0d\x0aQComboB\ +ox\x0d\x0a{\x0d\x0a backg\ +round-color: #CC\ +CCCC;\x0d\x0a color\ +: black;\x0d\x0a fo\ +nt-family: \x22Open\ + Sans\x22;\x0d\x0a bor\ +der-radius: 2px;\ +\x0d\x0a border-wid\ +th: 0px;\x0d\x0a bo\ +rder-color: #e9e\ +9e9;\x0d\x0a font-s\ +ize: 12px;\x0d\x0a \ +line-height: 16p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0aQTextEd\ +it,\x0d\x0aQPlainText,\ +\x0d\x0aQPlainTextEdit\ +\x0d\x0a{\x0d\x0a margin:\ + 2px;\x0d\x0a borde\ +r-width: 0px;\x0d\x0a \ + border-style:\ + solid;\x0d\x0a}\x0d\x0a\x0d\x0aQT\ +extEdit:hover,\x0d\x0a\ +QPlainText:hover\ +,\x0d\x0aQPlainTextEdi\ +t:hover\x0d\x0a{\x0d\x0a \ +margin: 1px;\x0d\x0a \ + border-width: \ +1px;\x0d\x0a border\ +-style: solid;\x0d\x0a\ + border-color\ +: #222222;\x0d\x0a}\x0d\x0a\x0d\ +\x0aQTextEdit:focus\ +,\x0d\x0aQPlainText:fo\ +cus,\x0d\x0aQPlainText\ +Edit:focus\x0d\x0a{\x0d\x0a \ + margin: 1px;\x0d\ +\x0a border-widt\ +h: 1px;\x0d\x0a bor\ +der-color: #00A1\ +C9;\x0d\x0a backgro\ +und-color: #FFFF\ +FF;\x0d\x0a}\x0d\x0a\x0d\x0a@impor\ +t \x22AssetFolderLi\ +stView.qss\x22;\x0d\x0a@i\ +mport \x22BreadCrum\ +bs.qss\x22;\x0d\x0a@impor\ +t \x22BrowseEdit.qs\ +s\x22;\x0d\x0a@import \x22Ca\ +rd.qss\x22;\x0d\x0a@impor\ +t \x22CheckBox.qss\x22\ +;\x0d\x0a@import \x22Colo\ +rLabel.qss\x22;\x0d\x0a@i\ +mport \x22ColorPick\ +er.qss\x22;\x0d\x0a@impor\ +t \x22ComboBox.qss\x22\ +;\x0d\x0a@import \x22Filt\ +eredSearchWidget\ +.qss\x22;\x0d\x0a@import \ +\x22LineEdit.qss\x22;\x0d\ +\x0a@import \x22Menu.q\ +ss\x22;\x0d\x0a@import \x22M\ +enuBar.qss\x22;\x0d\x0a@i\ +mport \x22ProgressB\ +ar.qss\x22;\x0d\x0a@impor\ +t \x22PushButton.qs\ +s\x22;\x0d\x0a@import \x22QD\ +ockWidget.qss\x22;\x0d\ +\x0a@import \x22RadioB\ +utton.qss\x22;\x0d\x0a@im\ +port \x22ReflectedP\ +ropertyEditor.qs\ +s\x22;\x0d\x0a@import \x22Sc\ +rollBar.qss\x22;\x0d\x0a@\ +import \x22SegmentC\ +ontrol.qss\x22;\x0d\x0a@i\ +mport \x22Slider.qs\ +s\x22;\x0d\x0a@import \x22Sp\ +inBox.qss\x22;\x0d\x0a@im\ +port \x22Splitter.q\ +ss\x22;\x0d\x0a@import \x22S\ +tyledDockWidget.\ +qss\x22;\x0d\x0a@import \x22\ +TableView.qss\x22;\x0d\ +\x0a@import \x22TabWid\ +get.qss\x22;\x0d\x0a@impo\ +rt \x22TabWidgetAct\ +ionToolBar.qss\x22;\ +\x0d\x0a@import \x22Text.\ +qss\x22;\x0d\x0a@import \x22\ +TitleBar.qss\x22;\x0d\x0a\ +@import \x22ToolBar\ +.qss\x22;\x0d\x0a@import \ +\x22ToolTip.qss\x22;\x0d\x0a\ +@import \x22VectorI\ +nput.qss\x22;\x0d\x0a@imp\ +ort \x22WindowDecor\ +ationWrapper.qss\ +\x22;\ +\x00\x00\x04?\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAzQt\ +Components--Asse\ +tFolderListView\x0d\ +\x0a{\x0d\x0a icon-siz\ +e: 16px;\x0d\x0a}\x0d\x0a\x0d\x0aA\ +zQtComponents--A\ +ssetFolderListVi\ +ew::branch:has-c\ +hildren:!has-sib\ +lings:closed,\x0d\x0aA\ +zQtComponents--A\ +ssetFolderListVi\ +ew::branch:close\ +d:has-children:h\ +as-siblings {\x0d\x0a \ + border-image:\ + none;\x0d\x0a imag\ +e: url(:/stylesh\ +eet/img/branch_c\ +losed.png);\x0d\x0a}\x0d\x0a\ +\x0d\x0aAzQtComponents\ +--AssetFolderLis\ +tView::branch:op\ +en:has-children:\ +!has-siblings,\x0d\x0a\ +AzQtComponents--\ +AssetFolderListV\ +iew::branch:open\ +:has-children:ha\ +s-siblings {\x0d\x0a \ + border-image:\ + none;\x0d\x0a imag\ +e: url(:/stylesh\ +eet/img/branch_o\ +pen.png);\x0d\x0a}\x0d\x0a\ +\x00\x00\x03\x01\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQSpl\ +itter::handle {\x0d\ +\x0a background-\ +color: #222222;\x0d\ +\x0a}\x0d\x0a\x0d\x0aQSplitter:\ +:handle:horizont\ +al {\x0d\x0a width:\ + 1px;\x0d\x0a}\x0d\x0a\x0d\x0aQSpl\ +itter::handle:ve\ +rtical {\x0d\x0a he\ +ight: 1px;\x0d\x0a}\x0d\x0a\x0d\ +\x0aQSplitter::hand\ +le:hover\x0d\x0a{\x0d\x0a \ + background-colo\ +r: #00A1C9;\x0d\x0a}\x0d\x0a\ +\ +\x00\x00\x02j\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAzQt\ +Components--Wind\ +owDecorationWrap\ +per\x0d\x0a{\x0d\x0a bord\ +er: 1px solid bl\ +ack;\x0d\x0a}\x0d\x0a\ +\x00\x00\x05'\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a/* N\ +OTE: a number of\ + QLineEdit prope\ +rties are define\ +d in BaseStyleSh\ +eet.qss already,\ + along with othe\ +r text entry con\ +trols */\x0d\x0a\x0d\x0aQLin\ +eEdit\x0d\x0a{\x0d\x0a he\ +ight: 16px;\x0d\x0a \ + /* 4px padding \ +already applied*\ +/\x0d\x0a padding-l\ +eft: 0px;\x0d\x0a b\ +order-width: 2px\ +;\x0d\x0a border-st\ +yle: solid;\x0d\x0a \ + padding-bottom:\ + 1px;\x0d\x0a paddi\ +ng-top: -1px;\x0d\x0a}\ +\x0d\x0a\x0d\x0aQLineEdit[Ha\ +sSearchAction=tr\ +ue]\x0d\x0a{\x0d\x0a /* 1\ +0px padding alre\ +ady applied: 10 \ +- 6 = 4 */\x0d\x0a \ +padding-left: -6\ +px;\x0d\x0a}\x0d\x0a\x0d\x0aQTextE\ +dit:disabled,\x0d\x0aQ\ +PlainText:disabl\ +ed,\x0d\x0aQPlainTextE\ +dit:disabled,\x0d\x0aQ\ +LineEdit:disable\ +d\x0d\x0a{\x0d\x0a backgr\ +ound-color: #666\ +666;\x0d\x0a color:\ + #999999;\x0d\x0a}\x0d\x0a\x0d\x0a\ +QAbstractItemVie\ +w QLineEdit\x0d\x0a{\x0d\x0a\ + qproperty-fr\ +ame: true;\x0d\x0a}\x0d\x0a\x0d\ +\x0aQLineEdit QTool\ +Button\x0d\x0a{\x0d\x0a m\ +ax-width: 16px;\x0d\ +\x0a min-width: \ +16px;\x0d\x0a max-h\ +eight: 16px;\x0d\x0a \ + min-height: 16\ +px;\x0d\x0a}\ +\x00\x00\x01\xf6\ +H\ +orizontalToolTip\ +Offset=@Point(-8\ + -16)\x0d\x0aVerticalT\ +oolTipOffset=@Po\ +int(8 -24)\x0d\x0a\x0d\x0a[G\ +radientSlider]\x0d\x0a\ +Thickness=16\x0d\x0aLe\ +ngth=6\x0d\x0aGrooveBo\ +rder\x5cThickness=1\ +\x0d\x0aGrooveBorder\x5cC\ +olor=#333333\x0d\x0aGr\ +ooveBorder\x5cRadiu\ +s=1.5\x0d\x0aHandleBor\ +der\x5cThickness=1\x0d\ +\x0aHandleBorder\x5cCo\ +lor=#FFFFFF\x0d\x0aHan\ +dleBorder\x5cRadius\ +=1.5\x0d\x0a\x0d\x0a[Slider]\ +\x0d\x0aHandle\x5cColor=#\ +0185D7\x0d\x0aHandle\x5cC\ +olorDisabled=#99\ +9999\x0d\x0aHandle\x5cSiz\ +e=12\x0d\x0aHandle\x5cSiz\ +eMinusMargin=8\x0d\x0a\ +Handle\x5cHoverSize\ +=12\x0d\x0a\x0d\x0aGroove\x5cCo\ +lor=#999999\x0d\x0aGro\ +ove\x5cColorHovered\ +=#CCDFF5\x0d\x0aGroove\ +\x5cWidth=2\x0d\x0aGroove\ +\x5cMidMarkerHeight\ +=16\x0d\x0a\ +\x00\x00\x02j\ +M\ +argin=8\x0d\x0a\x0d\x0a[Root\ +Thumbnail]\x0d\x0aSmal\ +lSize=72\x0d\x0aMedium\ +Size=84\x0d\x0aLargeSi\ +ze=96\x0d\x0aBorderRad\ +ius=4.0\x0d\x0aPadding\ +=12\x0d\x0aBackgroundC\ +olor=#444444\x0d\x0aBo\ +rderThickness=1.\ +0\x0d\x0aSelectedBorde\ +rThickness=2.0\x0d\x0a\ +BorderColor=#000\ +000\x0d\x0aSelectedBor\ +derColor=#FFFFFF\ +\x0d\x0a\x0d\x0a[ChildThumbn\ +ail]\x0d\x0aSmallSize=\ +39\x0d\x0aMediumSize=4\ +8\x0d\x0aLargeSize=54\x0d\ +\x0aBorderRadius=2.\ +4\x0d\x0aPadding=7\x0d\x0aBa\ +ckgroundColor=#4\ +44444\x0d\x0aBorderThi\ +ckness=1.0\x0d\x0aSele\ +ctedBorderThickn\ +ess=2.0\x0d\x0aBorderC\ +olor=#383838\x0d\x0aSe\ +lectedBorderColo\ +r=#FFFFFF\x0d\x0a\x0d\x0a[Ex\ +pandButton]\x0d\x0aWid\ +th=18\x0d\x0aCaretWidt\ +h=8\x0d\x0aBorderRadiu\ +s=4\x0d\x0aBackgroundC\ +olor=#555555\x0d\x0aCa\ +retColor=#FFFFFF\ +\x0d\x0a\x0d\x0a[ChildFrame]\ +\x0d\x0aPadding=18\x0d\x0aBo\ +rderRadius=4.0\x0d\x0a\ +BackgroundColor=\ +#000000\x0d\x0a\ +\x00\x00\x00$\ +C\ +ontextSizeInPixe\ +ls=15\x0d\x0aZoomFacto\ +r=8\ +\x00\x00\x08\xb9\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQS\ +crollBar\x0d\x0a{\x0d\x0a \ + border: 2px sol\ +id rgba(50, 50, \ +50, 70%);\x0d\x0a b\ +ackground: none;\ +\x0d\x0a margin: 0p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0aQScroll\ +Bar:vertical\x0d\x0a{\x0d\ +\x0a width: 8px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aQScrollBa\ +r:horizontal\x0d\x0a{\x0d\ +\x0a height: 8px\ +;\x0d\x0a}\x0d\x0a\x0d\x0aQScrollB\ +ar::handle\x0d\x0a{\x0d\x0a \ + border: 0px s\ +olid #000000;\x0d\x0a \ + border-radius\ +: 2px;\x0d\x0a back\ +ground-color: rg\ +ba(255, 255, 255\ +, 40%);\x0d\x0a}\x0d\x0a\x0d\x0aQA\ +bstractScrollAre\ +a.DarkScrollBar \ +QScrollBar::hand\ +le\x0d\x0a{\x0d\x0a borde\ +r: 0px solid #00\ +0000;\x0d\x0a borde\ +r-radius: 2px;\x0d\x0a\ + background-c\ +olor: rgba(136, \ +136, 136, 64%);\x0d\ +\x0a}\x0d\x0a\x0d\x0aQScrollBar\ +::handle:vertica\ +l {\x0d\x0a min-hei\ +ght: 32px;\x0d\x0a}\x0d\x0a\x0d\ +\x0aQScrollBar::han\ +dle:horizontal {\ +\x0d\x0a min-width:\ + 32px;\x0d\x0a}\x0d\x0a\x0d\x0aQSc\ +rollBar::add-lin\ +e,\x0d\x0aQScrollBar::\ +sub-line\x0d\x0a{\x0d\x0a \ + border: none;\x0d\ +\x0a background\ +: none;\x0d\x0a co\ +lor: none;\x0d\x0a}\x0d\x0a\x0d\ +\x0aQScrollBar::add\ +-line:horizontal\ +,\x0d\x0aQScrollBar::s\ +ub-line:horizont\ +al\x0d\x0a{\x0d\x0a widt\ +h: 0px;\x0d\x0a}\x0d\x0a\x0d\x0aQS\ +crollBar::add-li\ +ne:vertical,\x0d\x0aQS\ +crollBar::sub-li\ +ne:vertical\x0d\x0a{\x0d\x0a\ + height: 0px\ +;\x0d\x0a}\x0d\x0a\x0d\x0aQAbstrac\ +tScrollArea > .Q\ +Widget\x0d\x0a{\x0d\x0a b\ +ackground: none;\ +\x0d\x0a}\x0d\x0a\x0d\x0a/* scroll\ +bar hovered */\x0d\x0a\ +\x0d\x0aQScrollBar:hov\ +er\x0d\x0a{\x0d\x0a borde\ +r: 1px solid rgb\ +a(50, 50, 50, 70\ +%);\x0d\x0a backgro\ +und: none;\x0d\x0a \ +margin: 0px;\x0d\x0a}\x0d\ +\x0a\x0d\x0aQAbstractScro\ +llArea.DarkScrol\ +lBar QScrollBar:\ +hover\x0d\x0a{\x0d\x0a bo\ +rder: 1px solid \ +rgba(136, 136, 1\ +36, 64%);\x0d\x0a b\ +ackground: none;\ +\x0d\x0a margin: 0p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0aQScroll\ +Bar::handle:hove\ +r\x0d\x0a{\x0d\x0a border\ +-radius: 3px;\x0d\x0a \ + background-co\ +lor: #999999;\x0d\x0a}\ +\x0d\x0a\x0d\x0aQAbstractScr\ +ollArea > .QWidg\ +et:hover,\x0d\x0aQAbst\ +ractScrollArea >\ + .QWidget[ShowBa\ +ckground=true]\x0d\x0a\ +{\x0d\x0a backgroun\ +d-color: rgba(25\ +5, 255, 255, 12%\ +);\x0d\x0a}\x0d\x0a\x0d\x0aQAbstra\ +ctScrollArea.Dar\ +kScrollBar > .QW\ +idget:hover,\x0d\x0aQA\ +bstractScrollAre\ +a.DarkScrollBar \ +> .QWidget[ShowB\ +ackground=true]\x0d\ +\x0a{\x0d\x0a backgrou\ +nd-color: rgba(2\ +21, 221, 221, 80\ +%);\x0d\x0a}\x0d\x0a\ +\x00\x00\x008\ +[\ +TreeView]\x0d\x0aBranc\ +hLineWidth=1\x0d\x0aBr\ +anchLineColor=#8\ +78787\x0d\x0a\ +\x00\x00\x00\x0c\ +H\ +eight=5\x0d\x0a\x0d\x0a\ +\x00\x00\x0c\x0d\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a/* O\ +verride transpar\ +ent background c\ +olour for defaul\ +t QTabWidgets */\ +\x0d\x0aQTabWidget,\x0d\x0aQ\ +TabBar\x0d\x0a{\x0d\x0a b\ +ackground-color:\ + #444444;\x0d\x0a}\x0d\x0a\x0d\x0a\ +QTabBar::tab\x0d\x0a{\x0d\ +\x0a max-width: \ +200px;\x0d\x0a}\x0d\x0a\x0d\x0aAzQ\ +tComponents--Tab\ +Widget\x0d\x0a{\x0d\x0a b\ +ackground-color:\ + #111111;\x0d\x0a}\x0d\x0a\x0d\x0a\ +AzQtComponents--\ +TabWidget > QWid\ +get\x0d\x0a{\x0d\x0a back\ +ground-color: #4\ +44444;\x0d\x0a}\x0d\x0a\x0d\x0aAzQ\ +tComponents--Tab\ +Widget:pane\x0d\x0a{\x0d\x0a\ + border: 0 no\ +ne;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCo\ +mponents--TabWid\ +get.Empty:pane\x0d\x0a\ +{\x0d\x0a margin-to\ +p: 30px;\x0d\x0a}\x0d\x0a\x0d\x0aA\ +zQtComponents--T\ +abBar\x0d\x0a{\x0d\x0a qp\ +roperty-drawBase\ +: false; /* Stop\ + the base being \ +visible during t\ +ab position chan\ +ge animation */\x0d\ +\x0a background-\ +color: #111111;\x0d\ +\x0a margin-bott\ +om: 0;\x0d\x0a min-\ +height: 28px;\x0d\x0a}\ +\x0d\x0a\x0d\x0aAzQtComponen\ +ts--TabBar:tab\x0d\x0a\ +{\x0d\x0a border: 1\ +px solid #111111\ +;\x0d\x0a backgroun\ +d-color: #333333\ +;\x0d\x0a\x0d\x0a text-al\ +ign: left;\x0d\x0a \ +padding: 6px -2p\ +x 6px 9px; /* to\ +p, right, bottom\ +, left */\x0d\x0a}\x0d\x0a\x0d\x0a\ +AzQtComponents--\ +TabBar::tab:text\ +\x0d\x0a{\x0d\x0a font-si\ +ze: 12px;\x0d\x0a l\ +ine-height: 24px\ +;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtComp\ +onents--TabBar::\ +tab:selected\x0d\x0a{\x0d\ +\x0a border-bott\ +om: 1px solid #4\ +44444;\x0d\x0a}\x0d\x0a\x0d\x0aAzQ\ +tComponents--Tab\ +Bar::tab:selecte\ +d,\x0d\x0aAzQtComponen\ +ts--TabBar::tab:\ +hover\x0d\x0a{\x0d\x0a ba\ +ckground-color: \ +#444444;\x0d\x0a}\x0d\x0a\x0d\x0aA\ +zQtComponents--T\ +abBar:focus\x0d\x0a{\x0d\x0a\ + outline: non\ +e;\x0d\x0a border: \ +none;\x0d\x0a}\x0d\x0a\x0d\x0a/* S\ +econdary Style *\ +/\x0d\x0a\x0d\x0aAzQtCompone\ +nts--TabWidget.S\ +econdary\x0d\x0a{\x0d\x0a \ + background-colo\ +r: #444444;\x0d\x0a}\x0d\x0a\ +\x0d\x0aAzQtComponents\ +--TabWidget.Seco\ +ndary.Bordered\x0d\x0a\ +{\x0d\x0a border: 1\ +px solid #111111\ +;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtComp\ +onents--TabWidge\ +t.Secondary:pane\ +\x0d\x0a{\x0d\x0a border:\ + 0 none;\x0d\x0a bo\ +rder-top: 2px so\ +lid #2B2B2B;\x0d\x0a \ + padding: 3px;\x0d\ +\x0a padding-top\ +: 0;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtC\ +omponents--TabWi\ +dget.Secondary:t\ +ab-bar\x0d\x0a{\x0d\x0a l\ +eft: 1px;\x0d\x0a m\ +in-height: 30px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCompo\ +nents--TabBar.Se\ +condary\x0d\x0a{\x0d\x0a \ +border: 0 none;\x0d\ +\x0a}\x0d\x0a\x0d\x0aAzQtCompon\ +ents--TabBar.Sec\ +ondary.Bordered\x0d\ +\x0a{\x0d\x0a border-l\ +eft: 1px solid #\ +111111;\x0d\x0a bor\ +der-top: 1px sol\ +id #111111;\x0d\x0a}\x0d\x0a\ +\x0d\x0aAzQtComponents\ +--TabBar.Seconda\ +ry::tab\x0d\x0a{\x0d\x0a \ +background-color\ +: #444444;\x0d\x0a \ +border: 0 none;\x0d\ +\x0a border-bott\ +om: 3px solid #3\ +33333;\x0d\x0a text\ +-align: center;\x0d\ +\x0a padding: 7p\ +x 0 5px 14px;\x0d\x0a \ + color: #95959\ +5;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCom\ +ponents--TabBar.\ +Secondary::close\ +-button\x0d\x0a{\x0d\x0a \ +image: url(\x22:/st\ +ylesheet/img/clo\ +se_small.svg\x22);\x0d\ +\x0a}\x0d\x0a\x0d\x0aAzQtCompon\ +ents--TabBar.Sec\ +ondary::tab:hove\ +r\x0d\x0a{\x0d\x0a backgr\ +ound: rgba(255,2\ +55,255,0.15);\x0d\x0a \ + border-bottom\ +: 3px solid #444\ +444;\x0d\x0a color:\ + #FFFFFF;\x0d\x0a}\x0d\x0a\x0d\x0a\ +AzQtComponents--\ +TabBar.Secondary\ +.Bordered::tab\x0d\x0a\ +{\x0d\x0a border-to\ +p: 1px solid #11\ +1111;\x0d\x0a paddi\ +ng: 6px 0 6px 14\ +px;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCo\ +mponents--TabBar\ +.Secondary::tab:\ +selected\x0d\x0a{\x0d\x0a \ + border-bottom: \ +3px solid #008DE\ +5;\x0d\x0a color: #\ +FFFFFF;\x0d\x0a}\x0d\x0a\ +\x00\x00\x08\x12\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAzQt\ +Components--Segm\ +entBar\x0d\x0a{\x0d\x0a m\ +argin-bottom: 15\ +px;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCo\ +mponents--Segmen\ +tBar QAbstractBu\ +tton\x0d\x0a{\x0d\x0a bac\ +kground-color: #\ +333333;\x0d\x0a bor\ +der-color: #2222\ +22;\x0d\x0a border-\ +style: solid;\x0d\x0a \ + border-width:\ + 1px;\x0d\x0a\x0d\x0a fon\ +t-size: 12px;\x0d\x0a\x0d\ +\x0a height: 28p\ +x;\x0d\x0a\x0d\x0a line-h\ +eight: 24px;\x0d\x0a\x0d\x0a\ + margin-left:\ + 0px;\x0d\x0a\x0d\x0a min\ +-width: 68px; /*\ + 100 - (padding-\ +left + padding-r\ +ight) */\x0d\x0a\x0d\x0a \ +padding-left: 16\ +px;\x0d\x0a padding\ +-right: 16px;\x0d\x0a}\ +\x0d\x0a\x0d\x0aAzQtComponen\ +ts--SegmentBar[o\ +rientation=\x221\x22] \ +QAbstractButton.\ +TabLast\x0d\x0a{\x0d\x0a \ +margin-left: -1p\ +x;\x0d\x0a border-t\ +op-left-radius: \ +0px;\x0d\x0a border\ +-bottom-left-rad\ +ius: 0px;\x0d\x0a b\ +order-top-right-\ +radius: 3px;\x0d\x0a \ + border-bottom-\ +right-radius: 3p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCom\ +ponents--Segment\ +Bar[orientation=\ +\x221\x22] QAbstractBu\ +tton.TabFirst\x0d\x0a{\ +\x0d\x0a border-top\ +-left-radius: 3p\ +x;\x0d\x0a border-b\ +ottom-left-radiu\ +s: 3px;\x0d\x0a bor\ +der-top-right-ra\ +dius: 0px;\x0d\x0a \ +border-bottom-ri\ +ght-radius: 0px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCompo\ +nents--SegmentBa\ +r[orientation=\x221\ +\x22] QAbstractButt\ +on.TabMiddle\x0d\x0a{\x0d\ +\x0a margin-left\ +: -1px;\x0d\x0a}\x0d\x0a\x0d\x0aAz\ +QtComponents--Se\ +gmentBar[orienta\ +tion=\x222\x22] QAbstr\ +actButton\x0d\x0a{\x0d\x0a \ + text-align: le\ +ft;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCo\ +mponents--Segmen\ +tBar[orientation\ +=\x222\x22] QAbstractB\ +utton.TabMiddle,\ +\x0d\x0aAzQtComponents\ +--SegmentBar[ori\ +entation=\x222\x22] QA\ +bstractButton.Ta\ +bLast\x0d\x0a{\x0d\x0a ma\ +rgin-top: -1px;\x0d\ +\x0a}\x0d\x0a\x0d\x0aAzQtCompon\ +ents--SegmentBar\ + QAbstractButton\ +:checked\x0d\x0a{\x0d\x0a \ + background-colo\ +r: #555555;\x0d\x0a}\x0d\x0a\ +\x0d\x0aAzQtComponents\ +--SegmentBar QAb\ +stractButton:hov\ +er:!checked,\x0d\x0aAz\ +QtComponents--Se\ +gmentBar QAbstra\ +ctButton:pressed\ +:!checked\x0d\x0a{\x0d\x0a \ + background-col\ +or: #444444;\x0d\x0a}\x0d\ +\x0a\ +\x00\x00\x03:\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAzTo\ +olsFramework--Pr\ +opertyRowWidget \ +QLabel#Name\x0d\x0a{\x0d\x0a\ + min-height: \ +16px;\x0d\x0a max-h\ +eight: 16px;\x0d\x0a \ + margin: 0px;\x0d\x0a\ + margin-left:\ + 4px; /* Add 4px\ + to match CardHe\ +ader */\x0d\x0a}\x0d\x0a\x0d\x0aAz\ +ToolsFramework--\ +PropertyRowWidge\ +t QLabel#Default\ +Label\x0d\x0a{\x0d\x0a mi\ +n-height: 16px;\x0d\ +\x0a max-height:\ + 16px;\x0d\x0a}\ +\x00\x00\x0aF\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQTab\ +leView\x0d\x0a{\x0d\x0a q\ +property-showGri\ +d: false;\x0d\x0a}\x0d\x0a\x0d\x0a\ +AzQtComponents--\ +TableView,\x0d\x0aQTab\ +leView,\x0d\x0aQListVi\ +ew,\x0d\x0aQTreeView\x0d\x0a\ +{\x0d\x0a /* Use op\ +aque colours bec\ +ause the ::branc\ +h subcontrol bac\ +kground is paint\ +ed slightly diff\ +erently\x0d\x0a \ +to the rest of t\ +he row */\x0d\x0a a\ +lternate-backgro\ +und-color: rgb(7\ +7, 77, 77);\x0d\x0a\x0d\x0a \ + selection-bac\ +kground-color: r\ +gb(101, 101, 101\ +);\x0d\x0a selectio\ +n-color: #ffffff\ +;\x0d\x0a\x0d\x0a show-de\ +coration-selecte\ +d: 1;\x0d\x0a\x0d\x0a bor\ +der: none;\x0d\x0a}\x0d\x0a\x0d\ +\x0aAzQtComponents-\ +-TableView::item\ +,\x0d\x0aQTableView::i\ +tem,\x0d\x0aQListView:\ +:item,\x0d\x0aQTreeVie\ +w::item\x0d\x0a{\x0d\x0a \ +height: 24px;\x0d\x0a\x0d\ +\x0a padding-lef\ +t: 4px; /* QStyl\ +e::PM_FocusFrame\ +HMargin (2) + 1 \ ++ 4 = 7 */\x0d\x0a \ +border: none; /*\ + A border, backg\ +round or image i\ +s required to ac\ +tually make use \ +of the padding *\ +/\x0d\x0a}\x0d\x0a\x0d\x0aAzQtComp\ +onents--TableVie\ +w::branch:select\ +ed,\x0d\x0aAzQtCompone\ +nts--TableView::\ +item:selected,\x0d\x0a\ +QTableView::item\ +:selected,\x0d\x0aQLis\ +tView::item:sele\ +cted,\x0d\x0aQTreeView\ +::branch:selecte\ +d,\x0d\x0aQTreeView::i\ +tem:selected\x0d\x0a{\x0d\ +\x0a background:\ + rgb(101, 101, 1\ +01);\x0d\x0a}\x0d\x0a\x0d\x0aAzQtC\ +omponents--Table\ +View::branch:hov\ +er,\x0d\x0aAzQtCompone\ +nts--TableView::\ +item:hover,\x0d\x0aQTa\ +bleView::item:ho\ +ver,\x0d\x0aQListView:\ +:item:hover,\x0d\x0aQT\ +reeView::branch:\ +hover,\x0d\x0aQTreeVie\ +w::item:hover\x0d\x0a{\ +\x0d\x0a background\ +: rgb(90, 90, 90\ +);\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCom\ +ponents--TableVi\ +ew QHeaderView::\ +section,\x0d\x0aQTable\ +View QHeaderView\ +::section,\x0d\x0aQLis\ +tView QHeaderVie\ +w::section,\x0d\x0aQTr\ +eeView QHeaderVi\ +ew::section\x0d\x0a{\x0d\x0a\ + height: 24px\ +;\x0d\x0a\x0d\x0a backgro\ +und: #444444;\x0d\x0a \ + border: none;\ +\x0d\x0a\x0d\x0a font-siz\ +e: 12px;\x0d\x0a fo\ +nt-style: normal\ +;\x0d\x0a\x0d\x0a padding\ +-left: 7px;\x0d\x0a}\x0d\x0a\ +\x0d\x0a/* Undo QAbstr\ +actItemView::ind\ +icator rule in C\ +heckBox.qss */\x0d\x0a\ +QTreeView::indic\ +ator\x0d\x0a{\x0d\x0a mar\ +gin: 0px;\x0d\x0a w\ +idth: 16px;\x0d\x0a \ + height: 16px;\x0d\x0a\ + margin-left:\ + -3px;\x0d\x0a}\x0d\x0a\x0d\x0aQTr\ +eeView::branch:o\ +pen:has-children\ +\x0d\x0a{\x0d\x0a image: \ +url(:/TreeView/o\ +pen.svg);\x0d\x0a p\ +adding: 10px 4px\ +;\x0d\x0a}\x0d\x0a\x0d\x0aQTreeVie\ +w::branch:closed\ +:has-children\x0d\x0a{\ +\x0d\x0a image: url\ +(:/TreeView/clos\ +ed.svg);\x0d\x0a pa\ +dding: 8px 6px;\x0d\ +\x0a}\x0d\x0a\x0d\x0aQTreeView:\ +:item:disabled \x0d\ +\x0a{ \x0d\x0a color: \ +#777777; \x0d\x0a}\x0d\x0a\x0d\x0a\ +AzQtComponents--\ +TableView::branc\ +h:open:has-child\ +ren,\x0d\x0aAzQtCompon\ +ents--TableView:\ +:branch:closed:h\ +as-children\x0d\x0a{\x0d\x0a\ + image: none;\ +\x0d\x0a}\x0d\x0a\ +\x00\x00\x00\x00\ +\ +\x00\x00\x00d\ +P\ +adding=16\x0d\x0aSpaci\ +ng=8\x0d\x0a\x0d\x0a[ColorGr\ +id]\x0d\x0aMinimumSize\ +=@Size(218 150)\x0d\ +\x0a\x0d\x0a[DialogButton\ +s]\x0d\x0aTopPadding=1\ +2\x0d\x0a\ +\x00\x00\x03\xac\ +[\ +DefaultFrame]\x0d\x0aH\ +eight=24\x0d\x0aRadius\ +=4\x0d\x0aMargin=8\x0d\x0a\x0d\x0a\ +[SmallIcon]\x0d\x0aFra\ +me\x5cHeight=24\x0d\x0aFr\ +ame\x5cRadius=4\x0d\x0aFr\ +ame\x5cMargin=8\x0d\x0aEn\ +abledArrowColor=\ +#FFFFFF\x0d\x0aDisable\ +dArrowColor=#BBB\ +BBB\x0d\x0aWidth=24;\x0d\x0a\ +ArrowWidth=10;\x0d\x0a\ +\x0d\x0a[PrimaryColorS\ +et]\x0d\x0aDisabled\x5cSt\ +art=#7092A7\x0d\x0aDis\ +abled\x5cEnd=#7092A\ +7\x0d\x0aSunken\x5cStart=\ +#0073BB\x0d\x0aSunken\x5c\ +End=#0073BB\x0d\x0aHov\ +ered\x5cStart=#44BA\ +FF\x0d\x0aHovered\x5cEnd=\ +#4AB2F8\x0d\x0aNormal\x5c\ +Start=#0095F2\x0d\x0aN\ +ormal\x5cEnd=#0073B\ +B\x0d\x0a\x0d\x0a[SecondaryC\ +olorSet]\x0d\x0aDisabl\ +ed\x5cStart=#666666\ +\x0d\x0aDisabled\x5cEnd=#\ +666666\x0d\x0aSunken\x5cS\ +tart=#444444\x0d\x0aSu\ +nken\x5cEnd=#444444\ +\x0d\x0aHovered\x5cStart=\ +#888888\x0d\x0aHovered\ +\x5cEnd=#777777\x0d\x0aNo\ +rmal\x5cStart=#7777\ +77\x0d\x0aNormal\x5cEnd=#\ +666666\x0d\x0a\x0d\x0a[Borde\ +r]\x0d\x0aThickness=1\x0d\ +\x0aColor=#3D000000\ +\x0d\x0a\x0d\x0a[DisabledBor\ +der]\x0d\x0aThickness=\ +1\x0d\x0aColor=#3D0000\ +00\x0d\x0a\x0d\x0a[FocusedBo\ +rder]\x0d\x0aThickness\ +=1\x0d\x0aColor=#00A1C\ +9\x0d\x0a\x0d\x0a[IconButton\ +]\x0d\x0aActiveColor=#\ +00A1C9\x0d\x0aDisabled\ +Color=#999999\x0d\x0aS\ +electedColor=#FF\ +FFFF\x0d\x0a\x0d\x0a[Dropdow\ +nButton]\x0d\x0aIndica\ +torArrowDown=:/s\ +tylesheet/img/UI\ +20/dropdown-butt\ +on-arrow.svg\x0d\x0aMe\ +nuIndicatorWidth\ +=16\x0d\x0aMenuIndicat\ +orPadding=4\ +\x00\x00\x00\x00\ +\ +\x00\x00\x04\x04\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAzQt\ +Components--Styl\ +edDockWidget\x0d\x0a{\x0d\ +\x0a border: non\ +e;\x0d\x0a backgrou\ +nd-color: #44444\ +4;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCom\ +ponents--StyledD\ +ockWidget[floati\ +ng=\x22true\x22]\x0d\x0a{\x0d\x0a \ + border: 1px s\ +olid black;\x0d\x0a}\x0d\x0a\ +\x0d\x0aAzQtComponents\ +--DockTabWidget:\ +:pane\x0d\x0a{\x0d\x0a bo\ +rder: none;\x0d\x0a}\x0d\x0a\ +\x0d\x0aAzQtComponents\ +--DockTabWidget \ +AzQtComponents--\ +TabBar\x0d\x0a{\x0d\x0a b\ +order: none;\x0d\x0a}\x0d\ +\x0a\x0d\x0aAzQtComponent\ +s--DockTabWidget\ + AzQtComponents-\ +-TabBar::tab:fir\ +st,\x0d\x0aAzQtCompone\ +nts--DockTabWidg\ +et AzQtComponent\ +s--TabBar::tab:o\ +nly\x0d\x0a{\x0d\x0a bord\ +er-left: none;\x0d\x0a\ +}\x0d\x0a\ +\x00\x00\x00\xb7\ +[\ +TitleBar]\x0d\x0aHeigh\ +t=32\x0d\x0aSimpleHeig\ +ht=27\x0d\x0aAppearAsT\ +abBar=true\x0d\x0a\x0d\x0a[I\ +con]\x0d\x0aVisible=fa\ +lse\x0d\x0a\x0d\x0a[Title]\x0d\x0a\ +Indent=0\x0d\x0aVisibl\ +eWhenSimple=true\ +\x0d\x0a\x0d\x0a[Buttons]\x0d\x0aS\ +howDividerButton\ +s=false\x0d\x0aSpacing\ +=0\x0d\x0a\x0d\x0a\ +\x00\x00\x03\xa3\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQP\ +rogressBar\x0d\x0a{\x0d\x0a \ + border: 0px t\ +ransparent #0000\ +00;\x0d\x0a border-\ +radius: 0px;\x0d\x0a \ + background: #9\ +A9A9A;\x0d\x0a heig\ +ht: 5px;\x0d\x0a fo\ +nt-size: 1px; /*\ + hack to get aro\ +und the fact tha\ +t QProgressBar's\ + minimumSizeHint\ +\x0d\x0a \ + is comp\ +uted from font s\ +ize, even when t\ +ext is invisible\ + */\x0d\x0a qproper\ +ty-textVisible: \ +False;\x0d\x0a}\x0d\x0a\x0d\x0aQPr\ +ogressBar::chunk\ +\x0d\x0a{\x0d\x0a backgro\ +und: #54AFD0;\x0d\x0a}\ +\x0d\x0a\ +\x00\x00\x00\xcf\ +\x00\ +\x00\x02\xf0x\x9c\xcdRK\x0a\xc2@\x0c\xdd\x17z\x87\ +\x01\xb7V\xd4\x95\x8e T\xbd@\xb1\xe0z:\x1d\xa6\ +CmR\xd2(~\xf0\xee\x0e\x15\x85.D).\xcc\ +*\xbf\xf7\xf2\x12\x12_\x12^cU#\x18\xe0&\x8a\ +R\x95\xed\x5cn\x0d\x8b\xa5\x88\xdf\xd5b\xcd\x0e!E\ +\xdc\xaf\x14\xad\x11X90\x14\x06\xd70\x10\xde2\xa5\ +KKx\x80\x5c\x8a\xc1\xa4\xb5\xc5\xa3R9\x88\x0a\xe3\ +l\xc1RLg\xf5\xe9\x99Vd\x1dH1\xee\xc4Q\ +\x86\xccXI1o\x1boa\x10\x06o%\x8d\xb6F\ +#\xe4\x8a\xce?\x12\xce\xa4\xa0\xa9\x15y\x86\x8f\xc3;\ +\xb4/6\x8f\xd6\x0e\xac_\xeb\x0b\xfd\x1d\x0a\x91\xb4\xce\ +\xc1\xaf\x0f\xc3> Y\xe0\xd1P?hM\xa6iL\ +\xde\xf7(\x1b\xd4\xe5\x1f?\xd1\x1d4\xba\xf8\x18\ +\x00\x00\x0b\xd4\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a/*\ +\x0d\x0a* QToolBarLayo\ +ut only supports\ + homogeneous spa\ +cing and margin \ +values. That is,\ +\x0d\x0a* we cannot ha\ +ve different top\ +, right, bottom,\ + left values.\x0d\x0a*\ +/\x0d\x0a\x0d\x0aQToolBar\x0d\x0a{\ +\x0d\x0a /* QToolBa\ +r required a bac\ +kground colour t\ +o ensure it has \ +a background whe\ +n\x0d\x0a * displa\ +ying an overflow\ + menu, or when f\ +loating\x0d\x0a */\ +\x0d\x0a background\ +-color: #444444;\ +\x0d\x0a qproperty-\ +iconSize: 16px 1\ +6px;\x0d\x0a border\ +: 0 none;\x0d\x0a\x0d\x0a \ + /*\x0d\x0a * desir\ +ed height is 28p\ +x\x0d\x0a * 5 = (28\ + - (iconSize + 2\ + * (ToolButton::\ +Config.defaultBu\ +ttonMargin = 1))\ +) / 2\x0d\x0a */\x0d\x0a \ + padding: 5px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aMainWindo\ +w QToolBar\x0d\x0a{\x0d\x0a \ + border-bottom\ +: 2px solid #111\ +111;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtC\ +omponents--DockM\ +ainWindow QToolB\ +ar\x0d\x0a{\x0d\x0a borde\ +r: 0 none;\x0d\x0a}\x0d\x0a\x0d\ +\x0aQToolBar.MainTo\ +olBar\x0d\x0a{\x0d\x0a qp\ +roperty-iconSize\ +: 20px 20px;\x0d\x0a \ + padding: 5px;\x0d\ +\x0a}\x0d\x0a\x0d\x0aQToolBar.I\ +conNormal,\x0d\x0aQToo\ +lBar.IconNormal \ +QToolButton\x0d\x0a{\x0d\x0a\ + qproperty-ic\ +onSize: 16px 16p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0aQToolBa\ +r.MainToolBar.Ic\ +onNormal,\x0d\x0aQTool\ +Bar.MainToolBar.\ +IconNormal QTool\ +Button\x0d\x0a{\x0d\x0a q\ +property-iconSiz\ +e: 20px 20px;\x0d\x0a}\ +\x0d\x0a\x0d\x0aQToolBar.Ico\ +nLarge,\x0d\x0aQToolBa\ +r.IconLarge QToo\ +lButton\x0d\x0a{\x0d\x0a \ +qproperty-iconSi\ +ze: 20px 20px;\x0d\x0a\ +}\x0d\x0a\x0d\x0aQToolBar.Ma\ +inToolBar.IconLa\ +rge,\x0d\x0aQToolBar.M\ +ainToolBar.IconL\ +arge QToolButton\ +\x0d\x0a{\x0d\x0a qproper\ +ty-iconSize: 32p\ +x 32px;\x0d\x0a}\x0d\x0a\x0d\x0aQT\ +oolBar::separato\ +r\x0d\x0a{\x0d\x0a backgr\ +ound-color: #111\ +111;\x0d\x0a width:\ + 1px;\x0d\x0a heigh\ +t: 1px;\x0d\x0a\x0d\x0a m\ +argin: 4px 0px;\x0d\ +\x0a padding: 0p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0aQToolBa\ +r::handle:horizo\ +ntal\x0d\x0a{\x0d\x0a ima\ +ge: url(:/styles\ +heet/img/UI20/te\ +ar.svg);\x0d\x0a}\x0d\x0a\x0d\x0aQ\ +ToolBar::handle:\ +vertical\x0d\x0a{\x0d\x0a \ + image: url(:/st\ +ylesheet/img/UI2\ +0/tear-vertical.\ +svg);\x0d\x0a}\x0d\x0a\x0d\x0a/* h\ +eight/width: 52 \ +*/\x0d\x0aQToolBar.Mai\ +nToolBar.IconLar\ +ge::handle:horiz\ +ontal\x0d\x0a{\x0d\x0a pa\ +dding: 1px 4px;\x0d\ +\x0a}\x0d\x0a\x0d\x0aQToolBar.M\ +ainToolBar.IconL\ +arge::handle:ver\ +tical\x0d\x0a{\x0d\x0a pa\ +dding: 2px 1px;\x0d\ +\x0a}\x0d\x0a\x0d\x0a/* height/\ +width: 40 */\x0d\x0aQT\ +oolBar.MainToolB\ +ar::handle:horiz\ +ontal,\x0d\x0aQToolBar\ +.MainToolBar.Ico\ +nNormal::handle:\ +horizontal\x0d\x0a{\x0d\x0a \ + padding: 1px \ +4px;\x0d\x0a}\x0d\x0a\x0d\x0aQTool\ +Bar.MainToolBar:\ +:handle:vertical\ +,\x0d\x0aQToolBar.Main\ +ToolBar.IconNorm\ +al::handle:verti\ +cal\x0d\x0a{\x0d\x0a padd\ +ing: 2px -2px;\x0d\x0a\ +}\x0d\x0a\x0d\x0a/* height/w\ +idth: 32 */\x0d\x0aQTo\ +olBar.IconLarge:\ +:handle:horizont\ +al\x0d\x0a{\x0d\x0a paddi\ +ng: 4px 3px;\x0d\x0a}\x0d\ +\x0a\x0d\x0aQToolBar.Icon\ +Large::handle:ve\ +rtical\x0d\x0a{\x0d\x0a p\ +adding: 2px -2px\ +;\x0d\x0a}\x0d\x0a\x0d\x0a/* heigh\ +t/width: 28 */\x0d\x0a\ +QToolBar::handle\ +:horizontal,\x0d\x0aQT\ +oolBar.IconNorma\ +l::handle:horizo\ +ntal\x0d\x0a{\x0d\x0a pad\ +ding: 2px 4px;\x0d\x0a\ +}\x0d\x0a\x0d\x0aQToolBar::h\ +andle:vertical,\x0d\ +\x0aQToolBar.IconNo\ +rmal::handle:ver\ +tical\x0d\x0a{\x0d\x0a pa\ +dding: 2px -2px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aQToolBarE\ +xtension#qt_tool\ +bar_ext_button\x0d\x0a\ +{\x0d\x0a qproperty\ +-icon: url(:/sty\ +lesheet/img/hidd\ +en-icons.svg);\x0d\x0a\ +}\x0d\x0a\ +\x00\x00\x0a\x12\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAz\ +QtComponents--Br\ +owseEdit\x0d\x0a{\x0d\x0a \ + margin: 2px;\x0d\x0a}\ +\x0d\x0a\x0d\x0aAzQtComponen\ +ts--BrowseEdit Q\ +LineEdit\x0d\x0a{\x0d\x0a \ + height: 16px;\x0d\x0a\ + border-width\ +: 0px;\x0d\x0a bord\ +er-style: solid;\ +\x0d\x0a border-col\ +or: transparent;\ +\x0d\x0a border-top\ +-left-radius: 2p\ +x;\x0d\x0a border-b\ +ottom-left-radiu\ +s: 2px;\x0d\x0a bor\ +der-top-right-ra\ +dius: 0px;\x0d\x0a \ +border-bottom-ri\ +ght-radius: 0px;\ +\x0d\x0a /* 2px pad\ +ding already app\ +lied */\x0d\x0a pad\ +ding-left: 2px;\x0d\ +\x0a /* 14px pad\ +ding applied by \ +default: 14 - 4 \ += 10 */\x0d\x0a pad\ +ding-right: -4px\ +;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtComp\ +onents--BrowseEd\ +it.ValidDropTarg\ +et QLineEdit,\x0d\x0aA\ +zQtComponents--B\ +rowseEdit.ValidD\ +ropTarget QLineE\ +dit:focus,\x0d\x0aAzQt\ +Components--Brow\ +seEdit.ValidDrop\ +Target QLineEdit\ +:hover\x0d\x0a{\x0d\x0a b\ +ackground-color:\ + transparent;\x0d\x0a}\ +\x0d\x0a\x0d\x0aAzQtComponen\ +ts--BrowseEdit.I\ +nvalidDropTarget\ + QLineEdit,\x0d\x0aAzQ\ +tComponents--Bro\ +wseEdit QLineEdi\ +t:focus\x0d\x0a{\x0d\x0a \ +background-color\ +: #FFFFFF;\x0d\x0a \ +border-color: #F\ +FFFFF;\x0d\x0a}\x0d\x0a\x0d\x0aAzQ\ +tComponents--Bro\ +wseEdit QLineEdi\ +t:disabled\x0d\x0a{\x0d\x0a \ + border-color:\ + #777777;\x0d\x0a}\x0d\x0a\x0d\x0a\ +AzQtComponents--\ +BrowseEdit #atta\ +ched-button\x0d\x0a{\x0d\x0a\ + /* Set the f\ +lat property to \ +true to enable Q\ +PushButton styli\ +ng from QSS */\x0d\x0a\ + qproperty-fl\ +at: true;\x0d\x0a\x0d\x0a \ + max-width: 16px\ +;\x0d\x0a min-width\ +: 16px;\x0d\x0a max\ +-height: 16px;\x0d\x0a\ + min-height: \ +16px;\x0d\x0a\x0d\x0a qpr\ +operty-iconSize:\ + 12px 12px;\x0d\x0a\x0d\x0a \ + background-co\ +lor: qlineargrad\ +ient(x1: 0, y1: \ +0, x2: 0, y2: 1,\ +\x0d\x0a \ + \ + stop: 0 \ +#666666, stop: 1\ + #555555);\x0d\x0a\x0d\x0a \ + border-width: \ +0px;\x0d\x0a border\ +-style: solid;\x0d\x0a\ + border-left:\ + none;\x0d\x0a bord\ +er-top-left-radi\ +us: 0px;\x0d\x0a bo\ +rder-bottom-left\ +-radius: 0px;\x0d\x0a \ + border-top-ri\ +ght-radius: 2px;\ +\x0d\x0a border-bot\ +tom-right-radius\ +: 2px;\x0d\x0a}\x0d\x0a\x0d\x0aAzQ\ +tComponents--Bro\ +wseEdit #attache\ +d-button:hover\x0d\x0a\ +{\x0d\x0a backgroun\ +d-color: qlinear\ +gradient(x1: 0, \ +y1: 0, x2: 0, y2\ +: 1,\x0d\x0a \ + \ + stop\ +: 0 #777777, sto\ +p: 1 #666666);\x0d\x0a\ +}\x0d\x0a\x0d\x0aAzQtCompone\ +nts--BrowseEdit \ +#attached-button\ +:pressed\x0d\x0a{\x0d\x0a \ + background-colo\ +r: #444444;\x0d\x0a}\x0d\x0a\ +\x0d\x0aAzQtComponents\ +--BrowseEdit #at\ +tached-button:di\ +sabled\x0d\x0a{\x0d\x0a b\ +ackground-color:\ + #666666;\x0d\x0a b\ +order-left: 1px \ +solid #555555;\x0d\x0a\ +}\ +\x00\x00\x00\x00\ +\ +\x00\x00\x046\ +\x00\ +\x00\x12\xd6x\x9c\xbdX\xddo\xe2F\x10\x7fG\xe2\x7f\ +\x18\xa5/I\xc4W\xb8\xf4\xd4su\x0f$\x10\xc5j\ +Jt@{\xaaN}X\xec5\xacjv\xad\xddu\ +\x80V\xfd\xdf;\xebO\x82\x0dY\x22\xae~\xc1\x9e\x9d\ +\x8f\xdf\xfcfv\xec\xa5{\xddl\x5c\xc3 \x0cAH\ +\x88\x84\xd4Lp\x05\x22\x00\xbdd\x0a\x02\x16R\xb8\x17\ +\xd1V\xb2\xc5R\xc3\xa5w\x05\x83\x15\xf9[\xf0\x8e'\ +V-p\xb9\xd71vL+ \x01*3\xa2)Z\ +K\xe3\xd3\x08C\xe6Q\xae\x84T\x1d\x94\x18\xe1\x03j\ +\xa3i\x14RM\xf1&wL\xb8\x9f\xe9R\xd0T\xae\ +\x14\xa0\x06\xc1\x07EQ\xb0\xa4\xf0\xe4\xde\x8f\xc6\xd3\x11\ +\x10\x9d=\xc0`\xfc\x07\xfc\xe2\x8e\x87-\xa0\ +\x0cAK\xa0\x9bHR\xa5\x92\x22bU\x18\xf5\xb3J\ +u\x9b\x8df\xe3\xcb4b\xfcNl\xd0\xff\x97\xa1\x88\ +\xe7!\xcd\x04\xcd\xc6?\xcd\x06\xe0\xb5\xa4\xa6~\x0e\xdc\ +|\x8c6?\xa7\xa2\x15\x91\x0b\xc6\x1d\xe8\x17\x92\xb9\x90\ +>\x95\x0e\xe6\xc6i&\xea^\xc3m\xb4\x81\x88\xf8\xbe\ +\xe1\x89\x84\x92\x12\x1f\x99\x88\x12\x0c`\xc2\x1b\xb5l\xbd\ +-\xb3(\xa5\xcf|%\xa4\x01.\xf4*\xf2\xb9\xd0Z\ +\xac\xd0\xa4\xb2\xa2E\xe4@;\x95\xff\xbb\x9b\xa5\x13\x08\ +/V\x95\x5cKq.X\x9a\x9e\xa9\xea%\xe2\x82\x99\ +\x9c\x86\x9b=\x1a\xdak\xe6\xebe\x8d\x5c\xe9mH\x1d\ +l\xce\x90\xf9\xafW$\xf1Y\xac\x1c\xf8P\x83\xd9\x0a\ +K\xe6\xc7\x13\xa1\xc02\xfc\xd0O\xae<\x06\xf1\xfeZ\ +H\x11s\xbf\xcdVd\x81\x08b\x19^:\xdd\xccS\ +7\xf1tW(u\xd4\xcb\xe2\xaaj*iD\x896\ +%\xcen\xab*\x91P\xcc\xecO\x07\x92j\x9e\xc4\xfe\ +\xa1Lz\xbd\xc1\xcd\xfd\xa7j\xac|\xfd!\xb9\xeaI\ +;\x14pg\xb1\x0c\xfb\x06I\x896\xf5\xff\x0f\x9a(\ +'\x08\xd6\xff\xb6$j\xe0y4\xd2\xe6\xd1\xe5Q\xac\ +?\x07$T\xf4\xcfjFV&\xfb\xca\x8fD\x8d\xa4\ +\x14\xf2\xb3\x96\xf11\xa7\xaf\xf5*\xed\xdf;\xd0\xfe\xfb\ +\xd3\xc1\xa2\xfdo\xf7M\xf2*\x8f\xfa?\xf6o?T\ +\x98\xc2\xa1\x99@\xacb\xcfW\xea\xea\x9b;\xfd\x98\x5c\ +Y\xc0\x5c\xf8)\xb9*\x91\x9c8j\xe3p\xd6\x82W\ +c\xbd^+\xa4\xbeX\xf3\xc36;\xab\x05\xc6\x8c\xb8\ +r\xd0\x16\xb3\xb7W3\x17\xde\x11 \x1b\xb2?\x15\x01\ +T<\xf7\x04\xd7R\x84\xfb]\x09\xf8\xb2\xc2\xf7t\xa6\ +W\xbb%\x086\xc5\xfa\x09\xa7\xf3\xa3\xd9O\xf9~x\ +\x0fo\xfb\x00\xfbg\x0481\xcaU\x84%\xc6o\xd9\ +\xef\xef$\x8cq\xcfx\xf8\x9eR\xf8\x16I\xbb\xfdX\ +\x02\xb6\x86Evo\x80,]$H\xf7\xa8|#\xda\ +\xb1f\xb07\xb5\x80j\x0a~\x02\xd2!}'\xa1G\ +\x0cm\x09-]\xbc\x03\xa65\xa1GM-\x09\xb5C\ +\xfa+\xe3\x13J\xbc%\xf5\xed\xb9\xf7\xce\xf3\xf6Vk\x7f{k\x1f\xdaa\ +\x08BB$\xa4b\x82\xc7 |P\x01\x8b\xc1g!\ +\x85\x8e\x88f\x92\x8d\x02\x05\xbb\xee\x1e\xb4\xc7\xe4Q\xf0\ +\xa6+\xc6u\xe8r\xb7\xa9\xf71\x15\x03\xf1\x91\x98\x11\ +Eq\xb7\xd4<\xf5d\xc8\x5c\xcac!\xe3&\xce\xe8\ +\xc9\xf7H\x8d[\xa3\x90*\x8a/\x19c\xc2=KK\ +AQ9\x8e\x01)\x08~\xc4\x14'\x02\x0aw\xdd\xce\ +M\xaf\x7f\x03D\x99O)\x84\xca@j\xb6\x1e\x8b\x95\ +d\xc3D\xa3\x87]MQ\xbbK\xd9\xd5\xf6\x9aF\xba\ +\x04\x99eR\xc5\xc2W\x13\x22)\xe0\xfbHc\x22G\x8c;p\x10M/\x8b3\x8d\xa1PJ\ +\x8c\x1d8\xce\x17\x22\xe2y\xa8\x0e\x07\x1a8\x07\x8d\x13\ +\xfd'{\xbb\xd4\x07i\xa2\xa1\x90\x1e\x95\x0dW\x84B\ +:\xa0$\xe1q\x84F\xe2\xearn}\xc2<\x158\ +\xa0y\x9c\xe1\xff\x8bt\x9c\xa7ac2\xa2\x0e$2\ +\xdcuZ\x1at\xdcb\xe3Q\xebK\xf7\xe8\xc0~\xc6\ +\x01\xf1\xc4\xa4\x19\xf1\xd1\x1e\x9c\xc0\x19\x5c\xc0\x19\xb2\xf8\ +\xa7Jh\xd8q\x05W\xf8\xdd\xc1\x810Ne\xae\x86\ +!q\x7f\x8c\xa4H\xb8\x97A\xdf91\x8f\x85\xd4\xda\ +\x87C\xc4\x98\x22\x83\x09\xaa\xbd\xb0\x05\xf4\x96D\xa2G\ +\x1a\x1f\xb2\x87\xa0\xbd\x05\x8d\xf9/\x0a\x8c\xa3L\x02\xca\ +1\x10B\xeaj\xf3k\xcb<\x89\xea\x18\xe6\xb1\x08\x99\ +\xb7p\xaeU\x85\x12\x91\x83N\xc5\xe9e\x95\xd5\x10\xe0\ +\x80\xfcH\xc3\xcc\xa2d\x5c\x09\xe3\xc8\x09W)d\xbd\ +h\xad\x98#\xc8\xadznmq6g\x0b\xb4\x9ek\ +\x96\x8f\x17\xcd\x93:H#\xa4\xbejH\xe2\xb1$v\ +\xe0\xa8\x82\xc8\xe4\x87\x05\xaaJ3}\xcb\xb4\xf4\xae\xa6\ +dBk\xdf\xe1\xd7e\x96{\xae\xc1\x83\x83\xf6a\xe7\ +\xa2Z\x83\xaf\xed \xd5\x92\x04\x98q\xdeK2\xa6\xef\ +\xb4$\xdfKA\x17b\x04\xe4hHv\x0f\xea`\xff\ +\xed-c\xde\xc3\x1c\xe33\x97\xe8l\xb9\xb6\x1f/\x98\ +s-\xe6\xb0sK\x09\xc25\x82\xe4'\xe5~\x83>\ +h|\xc7\x8e\xafuP}\x1d\xfa.\xdak-\xc2\x01\ +S!]\xa6\xa5c\xf3\xcc\xfbL\xe6\xafo\x17\xbcz\ +\xde\x91Z\xfb\x98ia\x1f\xf4\xa1)~\x9d\xeb\x09|\ +2b\xa4\x81\x87_\xb7WbzGf\x22\xd1\xb5\x0f\ +\x0b\xa0\x9b\xbaXl\x82\xd2\x17!\x16!\x1d\x96n\xc0\ +B\x0f}\xc11\xdd\x90\x9fh\xfcP\xbb\xb9\x8e\x89\xca\ +\xf6nL\xa6Y\xcf|t>7\x9b\x1b\xe1\xfc\xc5\xd2\ +~\x0c\x93xN{\xe5R\xffF\xc2\x90\xcaY\xab\xed\ +y\xff\x97\x8c\x87\x9b\xc9xK\xc3\xe8\xbf\x982\xc0}\ ++E<\xd5\x22\x9e\xbeP\xc4\x85\x18]\x14\xf7\xb4\x5c\ +\xdc\xd3\xb9r\x8b\x91A\x94\x90\xcfJ\xdd\x85y*\xd5\ +\xba\xeem\x19v\xfa\xd9\x11\xcf\xdb\xdf\x0d\xd8\xa6\x1d\x84\ +\x83\x1d\x04\x19\x86\xd4\xab\x86o\xbb)\xe8\x07b\x92\xb7\ +4@\xb0\x96M\x80qp5\xb3 \xb50\xf6O~\ +\xa2\x7f\xed\xd4]\xa6\x9a\x01}\xa0<\xfd\x85\xc5P\xa5\ +\xbf\xb5\x99\xe3V\xf6\x19OmU3o\xb6\x1c\xc6=\ +\xdd:\x22>\xdd\xbd\xe02\xf5\x9e\x0b\xb0\xba\x0e#\x18\ +\xaa\xd2d\xb8f\xf9]\x81fc,\x9e\x98\xf0\x02\x94\ +\x7f\x01\xec[\xf7\x8a\ +\x00\x00\x04d\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a/*\x0d\x0a\ +* This is a back\ +up style for QDo\ +ckWidgets that h\ +ave not been con\ +verted to FancyD\ +ocking.\x0d\x0a* This \ +style affects QD\ +ockWidgets speci\ +fically, not der\ +ived classes.\x0d\x0a*\ +/\x0d\x0a\x0d\x0a.QDockWidge\ +t\x0d\x0a{\x0d\x0a titleb\ +ar-close-icon: u\ +rl(:/stylesheet/\ +img/UI20/titleba\ +r-close.svg);\x0d\x0a \ + titlebar-norm\ +al-icon: url(:/s\ +tylesheet/img/UI\ +20/titlebar-popo\ +ut-small.svg);\x0d\x0a\ +}\x0d\x0a\x0d\x0a.QDockWidge\ +t::title\x0d\x0a{\x0d\x0a \ + background-colo\ +r: #333333;\x0d\x0a}\x0d\x0a\ +\x0d\x0a/* Note that t\ +he icon size is \ +hard-coded to 10\ +px by Qt */\x0d\x0a.QD\ +ockWidget::close\ +-button,\x0d\x0a.QDock\ +Widget::float-bu\ +tton\x0d\x0a{\x0d\x0a bor\ +der: none;\x0d\x0a \ +background-color\ +: transparent;\x0d\x0a\ +}\x0d\x0a\ +\x00\x00\x041\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAzQt\ +Components--Vect\ +orElement QLabel\ +\x0d\x0a{\x0d\x0a margin:\ + 2px;\x0d\x0a borde\ +r-top-left-radiu\ +s: 2px;\x0d\x0a bor\ +der-bottom-left-\ +radius: 2px;\x0d\x0a \ + text-align: ce\ +nter;\x0d\x0a}\x0d\x0a\x0d\x0aAzQt\ +Components--Vect\ +orElement[Coordi\ +nate=\x22X\x22] QLabel\ +\x0d\x0a{\x0d\x0a backgro\ +und-color: #E252\ +43;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCo\ +mponents--Vector\ +Element[Coordina\ +te=\x22Y\x22] QLabel\x0d\x0a\ +{\x0d\x0a backgroun\ +d-color: #58BC61\ +;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtComp\ +onents--VectorEl\ +ement[Coordinate\ +=\x22Z\x22] QLabel\x0d\x0a{\x0d\ +\x0a background-\ +color: #4285F4;\x0d\ +\x0a}\x0d\x0a\x0d\x0aAzQtCompon\ +ents--VectorElem\ +ent[Coordinate=\x22\ +W\x22] QLabel\x0d\x0a{\x0d\x0a \ + background-co\ +lor: #E57829;\x0d\x0a}\ +\ +\x00\x00\x03\xf9\ +\x00\ +\x00\x0d?x\x9c\xb5VmS\x22G\x10\xfeN\x95\xff\ +\xa1\x0b?\xa8\x14\xa0\xc1K\xea\x82\x95T!\xeaI\xc5\ +\x82\xd3%\x9a\xabT>\x0c;\xbd0u\xc3\xf4ff\ +\x101\x95\xff\x9e\x9e]yS@\xf4r\xcb\x07w\xdb\ +\xee~\xfa\xe9\xb7\x99\x9d\xc2ai\xa7P\x82\x86\xd6@\ +\x16R\xb2^\x91q@\x09\xf8\x81r\x90(\x8d\xd0\xa4\ +tbU\x7f\xe0a?>\x80\xc6P<\x92\xa9\xc64\ +,C\xcb\xc4\xd5`\xa7\xbc\x03\x91\xb0\xb2\x12\x1e\xd9\xda\ +\x06\x9fA\xa8U\x8c\xc6\x91uU\x96\x04\xe1\x05k\xb3\ +i\xaa\xd1#\xbfL\x1d\x0b#\x9ft\x11<\xda\xa1\x03\ +\xd6\x10\xfc\xe1\x90\x05\x03\x84\xabV\xf3\xbc\x1d\x9d\x83\xf0\ +\xd9\xa7%\xf2\xd3 \x83[\xa9\x9c\xb7\xaa7\x0a\xd1\xc3\ +~\xd0(^\xe5\xee\x8a\x07\xd5\x8c\xdd\x88\x9dMY9\ +J\xfcXX\x04~\xef\xd3=Z\x83\x12z\x93\x1c(\ +7+\x07\xafd\xcb\xa0\x12H-\xdd+\x89\xb2<\xd5\ +\x99F\xdaCM\xe3\xc0\x7fQ(\xe2\xc0O\x98\x892\ +\xfdy\x12\xabpF`\xc8\x07\xb7\x16\x87\x0c\x1a\xec\x86\ +$U2a\xf6\x93\x999\xeb\xf0\x9b\xabBw\x96\x7f\ +\xfe;\xe3\xc7\x812Ca\xa0\xd8\x88\xa0\x15\x15\xe1\xb4\ +\x11\xb5\xa2,\xda\xbbV\xf7\xb2\xf3{\x17\xee\x1a77\ +\x8dv\xb7u\x1eA\xe7\x06\x9a\x9d\xf6Y\xab\xdb\xea\xb4\ +\xf9\xeb\x02\x1a\xed/\xf0[\xab}V\x06T\x1c\xb4\x05\ +|H-:\x97\x15\x91\xab\xa2P>U\xeap\xa7\x10\ +~\x8d\xc7k\xdfd>d\xd0xW\xa94I\x93\xfd\ +\xac\xe2\xaf\xc85\xfeg\xa7\x00\xfc\xa4BJ&[\x87\ +\x1f\x8e\x8e\xd2\x87\x93\x9d\xc2\xbf\xafXBif\x9b\x90\ +\xf1\x15\xa7\x1e\x91\xadks\xe3\xc3\x12t\x8c\xe6\xcc\xa4\ +\xa9\x9e\xe4Y\xf4\xc4Y\xb0\x18{\x88\x07JK\x8b\x06\ +\xae\xbbD\xfat\xe4=\xa7\xc4\x117\x1cHBg\xf6\ +|hF\xd6\xcc \x0c\xba\x08[\ +\xf6\x95\x9e\xbb>\xa3QO\xe3\x9bL\x96\x94\xeb\x09\xc5\ +#\xf7\x0e\x94\xdcpE!g\x8d\xb9=\xd3\xba\xa4\xb1\ +\xa9\xe4\xbbe\xdb\xe8\xeb\xa3tK\x8b\xe5\xe0\xdf\x82\xf5\ +\xccr\x868c\xfd\xb4\x91\xe6S\x92\xcff\xc5\xf9\x89\ +\xc6\xed\x13Q\xbd$\xab\x1e\xc3\xf6\xd0\x11r\xef\x0bO\ +\xf6\xd9\xb8W<\xa5\xbc\xcc\xd2\x07^\xdaZI\xd8=\ +\xfe\xf9X\x1c\xc7\xcb\xb0=\xe2\xe8\x86\xaf\xaaiL\xfc\ +\xf2\xfa\xc8\xe5v:\x17+\xf6\x0a\xb7p-{\xde\xcb\ +\xe7;,\xc7\x0d\xabz\xdd\xb2\x5c\xef\xf3\x93Urm\ +?X\xbc_\xbd\xff\xa3\xb1\xf0\xf1\xe0\xb5\x83\x81\xb7i\ +\xf6\xfd\xec\xf0\xe3\x03\xbbM\x9e\xfb$\xf7\xc2g\xedX\ +\xf1\xadK\xf5y3av\xc1\xd9\x9b\xe7\xa8\xb4\x17\xee\ +T)Z?\xe1\x0b\x9e\x07\xbe\x88`v\xe8.\xb2\x5c\ +,|\xf6<+\xb0\x90j\xe4\xeaP[\xbf\xc3\xf3P\ +\xea\x0e5\xdf\x05P~\xc7Xk\xf3X\x9b\x1f\x1b\xa7\ +\x17\x17\xebB\xfa\x14\xc2\xe6\xd7\x88u\xd1.\xf6V&\ +\x98\x85\xf8\xf7\x14\x93g\x85tW\xa5\x9d$a\xf4?\ +x>O6j|\xa9C\xa5\xf6a\x1d\xfcet\x95\ +\x03\xb9\x17\x0d\xf7Jd+\xda\xe22\xba}\xa7\xb3\xff\ +\x87\xe6\x87\xb5G\xd03\xf8[\xb6W\xf1\x1b\xc0?n\ +\x9b\xe3\xff\x00Z\xfcY\xa3\ +\x00\x00\x00\x0d\ +D\ +efaultMode=0\ +\x00\x00\x00\x00\ +\ +\x00\x00\x0c\xae\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a/* N\ +OTE: a number of\ + QComboBox prope\ +rties are define\ +d in BaseStyleSh\ +eet.qss already,\ + along with othe\ +r text entry con\ +trols */\x0d\x0a\x0d\x0a/* C\ +omboBox */\x0d\x0a\x0d\x0aQC\ +omboBox\x0d\x0a{\x0d\x0a \ +height: 16px;\x0d\x0a \ + padding-left:\ + 4px;\x0d\x0a margi\ +n: 1px;\x0d\x0a fon\ +t-size: 12px;\x0d\x0a \ + background-co\ +lor: #CCCCCC;\x0d\x0a}\ +\x0d\x0a\x0d\x0aQComboBox:ho\ +ver\x0d\x0a{\x0d\x0a marg\ +in: 0px;\x0d\x0a bo\ +rder-width: 1px;\ +\x0d\x0a border-sty\ +le: solid;\x0d\x0a \ +border-radius: 3\ +px;\x0d\x0a border-\ +color: rgba(0, 0\ +, 0, 50);\x0d\x0a}\x0d\x0a\x0d\x0a\ +QComboBox:focus,\ +\x0d\x0aQComboBox[HasP\ +opupOpen=true],\x0d\ +\x0aQComboBox[HasPo\ +pupOpen=true][Ha\ +sPopupOpen=true]\ +\x0d\x0a{\x0d\x0a margin:\ + 0px;\x0d\x0a borde\ +r-width: 1px;\x0d\x0a \ + border-style:\ + solid;\x0d\x0a bor\ +der-radius: 3px;\ +\x0d\x0a border-col\ +or: #00A1C9;\x0d\x0a\x0d\x0a\ + background-c\ +olor: #FFFFFF;\x0d\x0a\ +}\x0d\x0a\x0d\x0aQComboBox[H\ +asError=true]\x0d\x0a{\ +\x0d\x0a margin: 0p\ +x;\x0d\x0a border-w\ +idth: 2px;\x0d\x0a \ +border-style: so\ +lid;\x0d\x0a border\ +-radius: 4px;\x0d\x0a \ + border-color:\ + #E25243;\x0d\x0a}\x0d\x0a\x0d\x0a\ +QComboBox:disabl\ +ed\x0d\x0a{\x0d\x0a backg\ +round-color: #66\ +6666;\x0d\x0a color\ +: #999999;\x0d\x0a}\x0d\x0a\x0d\ +\x0aQComboBox::drop\ +-down\x0d\x0a{\x0d\x0a bo\ +rder-width: 0;\x0d\x0a\ +}\x0d\x0a\x0d\x0aQComboBox::\ +down-arrow\x0d\x0a{\x0d\x0a \ + width: 16px;\x0d\ +\x0a height: 16p\ +x;\x0d\x0a margin-r\ +ight: 4px;\x0d\x0a \ +image: url(\x22:/st\ +ylesheet/img/UI2\ +0/combobox-arrow\ +.svg\x22);\x0d\x0a}\x0d\x0a\x0d\x0aQC\ +omboBox::down-ar\ +row:disabled\x0d\x0a{\x0d\ +\x0a image: url(\ +\x22:/stylesheet/im\ +g/UI20/combobox-\ +arrow-disabled.s\ +vg\x22);\x0d\x0a}\x0d\x0a\x0d\x0a/* P\ +opup */\x0d\x0a\x0d\x0aQComb\ +oBox QAbstractIt\ +emView\x0d\x0a{\x0d\x0a b\ +ackground-color:\ + #222222;\x0d\x0a p\ +adding: 0px;\x0d\x0a \ + outline: none;\ + /* Disable focu\ +s rect */\x0d\x0a s\ +how-decoration-s\ +elected: 1;\x0d\x0a}\x0d\x0a\ +\x0d\x0aQComboBox QAbs\ +tractItemView::i\ +tem\x0d\x0a{\x0d\x0a colo\ +r: #FFFFFF;\x0d\x0a \ + padding-right: \ +24px;\x0d\x0a paddi\ +ng-left: 2px; /*\ + There is alread\ +y 22px from the \ +check mark */\x0d\x0a\x0d\ +\x0a /* Without \ +that the padding\ + don't apply */\x0d\ +\x0a border: 0px\ + solid transpare\ +nt;\x0d\x0a}\x0d\x0a\x0d\x0a/*\x0d\x0a \ + This is needed\ + as a result of \ +using padding / \ +border in ::item\ + as\x0d\x0a selecti\ +on-background-co\ +lor and selectio\ +n-color are no m\ +ore honored...\x0d\x0a\ +*/\x0d\x0aQComboBox QA\ +bstractItemView:\ +:item:selected\x0d\x0a\ +{\x0d\x0a backgroun\ +d-color: #444444\ +;\x0d\x0a color: #F\ +FFFFF;\x0d\x0a}\x0d\x0a\x0d\x0aQCo\ +mboBox QAbstract\ +ItemView::item:d\ +isabled\x0d\x0a{\x0d\x0a \ +color: #555555;\x0d\ +\x0a}\x0d\x0a\x0d\x0aQComboBox \ +QAbstractItemVie\ +w::separator\x0d\x0a{\x0d\ +\x0a height: 1px\ +;\x0d\x0a backgroun\ +d: #444444;\x0d\x0a}\x0d\x0a\ +\x0d\x0aQComboBox QAbs\ +tractItemView::i\ +ndicator\x0d\x0a{\x0d\x0a \ + /* Keep in sync\ + with the check \ +mark image size \ +*/\x0d\x0a width: 1\ +6px;\x0d\x0a height\ +: 16px;\x0d\x0a ima\ +ge: none;\x0d\x0a}\x0d\x0a\x0d\x0a\ +QComboBox QAbstr\ +actItemView::ind\ +icator:checked\x0d\x0a\ +{\x0d\x0a image: ur\ +l(:/stylesheet/i\ +mg/UI20/checkmar\ +k.svg);\x0d\x0a}\x0d\x0a\x0d\x0aQC\ +omboBox QAbstrac\ +tItemView::indic\ +ator:indetermina\ +te\x0d\x0a{\x0d\x0a image\ +: url(:/styleshe\ +et/img/UI20/inde\ +terminate.svg);\x0d\ +\x0a}\x0d\x0a\x0d\x0aQMenu QCom\ +boBox\x0d\x0a{\x0d\x0a ma\ +rgin: 3px 8px;\x0d\x0a\ +}\x0d\x0a\x0d\x0aQMenu QComb\ +oBox:hover,\x0d\x0aQMe\ +nu QComboBox:foc\ +us,\x0d\x0aQMenu QComb\ +oBox[HasPopupOpe\ +n=true],\x0d\x0aQMenu \ +QComboBox[HasPop\ +upOpen=true][Has\ +PopupOpen=true]\x0d\ +\x0a{\x0d\x0a margin: \ +2px 7px;\x0d\x0a}\x0d\x0a\ +\x00\x00\x07\xf6\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aAzQt\ +Components--Filt\ +eredSearchWidget\ + QLineEdit\x0d\x0a{\x0d\x0a \ + qproperty-fra\ +me: true;\x0d\x0a w\ +idth: 260px; /* \ +This is just a r\ +easonable defaul\ +t */\x0d\x0a}\x0d\x0a\x0d\x0aAzQtC\ +omponents--Filte\ +redSearchWidget \ +QPushButton\x0d\x0a{\x0d\x0a\ + background-c\ +olor: transparen\ +t;\x0d\x0a border: \ +none;\x0d\x0a}\x0d\x0a\x0d\x0aAzQt\ +Components--Filt\ +eredSearchWidget\ + #assetTypeSelec\ +tor\x0d\x0a{\x0d\x0a qpro\ +perty-icon: url(\ +:/stylesheet/img\ +/UI20/filter.svg\ +);\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCom\ +ponents--FilterC\ +riteriaButton\x0d\x0a{\ +\x0d\x0a padding: 0\ +px;\x0d\x0a border-\ +radius: 2px;\x0d\x0a \ + border: 1px so\ +lid #808080;\x0d\x0a \ + background-col\ +or: rgb(46, 46, \ +46);\x0d\x0a /* 22 \ ++ 2 * 1 = 24 */\x0d\ +\x0a min-height:\ + 22px;\x0d\x0a max-\ +height: 22px;\x0d\x0a}\ +\x0d\x0a\x0d\x0aAzQtComponen\ +ts--FilterCriter\ +iaButton QPushBu\ +tton#closeTag\x0d\x0a{\ +\x0d\x0a qproperty-\ +icon: url(:/styl\ +esheet/img/close\ +_x.svg);\x0d\x0a qp\ +roperty-iconSize\ +: 10px 10px;\x0d\x0a \ + qproperty-flat\ +: true;\x0d\x0a bac\ +kground-color: t\ +ransparent;\x0d\x0a \ + padding: 0px;\x0d\x0a\ + margin: 0px;\ +\x0d\x0a max-height\ +: 16px;\x0d\x0a max\ +-width: 16px;\x0d\x0a \ + min-width: 16\ +px;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCo\ +mponents--Filter\ +CriteriaButton Q\ +Label\x0d\x0a{\x0d\x0a ba\ +ckground-color: \ +transparent;\x0d\x0a \ + padding: 0px;\x0d\ +\x0a margin: 0px\ +;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtComp\ +onents--FilterCr\ +iteriaButton #ta\ +gIcon\x0d\x0a{\x0d\x0a ma\ +rgin-right: 4px;\ +\x0d\x0a}\x0d\x0a\x0d\x0aAzQtCompo\ +nents--FilterCri\ +teriaButton #tag\ +Text\x0d\x0a{\x0d\x0a mar\ +gin-left: 4px;\x0d\x0a\ + margin-right\ +: 4px;\x0d\x0a}\x0d\x0a\x0d\x0aAzQ\ +tComponents--Sea\ +rchTypeSelector \ +QTreeView\x0d\x0a{\x0d\x0a \ + border: none;\x0d\ +\x0a outline-sty\ +le: none;\x0d\x0a\x0d\x0a \ + show-decoration\ +-selected: 1;\x0d\x0a \ + background-co\ +lor: transparent\ +;\x0d\x0a}\x0d\x0a\x0d\x0aAzQtComp\ +onents--SearchTy\ +peSelector QTree\ +View::item\x0d\x0a{\x0d\x0a \ + height: 24px;\ +\x0d\x0a}\x0d\x0a\ +\x00\x00\x08*\ +/\ +*\x0d\x0a* All or port\ +ions of this fil\ +e Copyright (c) \ +Amazon.com, Inc.\ + or its affiliat\ +es or\x0d\x0a* its lic\ +ensors.\x0d\x0a*\x0d\x0a* Fo\ +r complete copyr\ +ight and license\ + terms please se\ +e the LICENSE at\ + the root of thi\ +s\x0d\x0a* distributio\ +n (the \x22License\x22\ +). All use of th\ +is software is g\ +overned by the L\ +icense,\x0d\x0a* or, i\ +f provided, by t\ +he license below\ + or the license \ +accompanying thi\ +s file. Do not\x0d\x0a\ +* remove or modi\ +fy any license n\ +otices. This fil\ +e is distributed\ + on an \x22AS IS\x22 B\ +ASIS,\x0d\x0a* WITHOUT\ + WARRANTIES OR C\ +ONDITIONS OF ANY\ + KIND, either ex\ +press or implied\ +.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0a\x0d\x0a/*\ + ===============\ +================\ +================\ +==============\x0d\x0a\ + Push Buttons\x0d\ +\x0a\x0d\x0a Painting o\ +f the background\ + and the frame o\ +f PushButtons\x0d\x0a \ + are done in co\ +de, in PushButto\ +n.cpp.\x0d\x0a\x0d\x0a It'\ +s done there bec\ +ause the default\ + Qt rendering, o\ +r at least\x0d\x0a t\ +he Fusion style,\ + which we use as\ + our base style,\ + doesn't\x0d\x0a pro\ +perly anti-alias\ + and position th\ +e button boundin\ +g box\x0d\x0a when w\ +e customize the \ +background color\ +s and styles her\ +e. Also,\x0d\x0a the\ +re's literally n\ +o way to get the\ + colors and styl\ +ing info out\x0d\x0a \ + of the styleshe\ +et.\x0d\x0a\x0d\x0a Below \ +is the configura\ +tion of the text\ + colors for the\x0d\ +\x0a PushButtons \ +and the font siz\ +e, which can be \ +done here in the\ +\x0d\x0a stylesheet.\ +\x0d\x0a\x0d\x0a Everythin\ +g else can be co\ +nfigured via Pus\ +hButton.ini\x0d\x0a \ +================\ +================\ +================\ +============= */\ +\x0d\x0a\x0d\x0aQPushButton\x0d\ +\x0a{\x0d\x0a color: #\ +ffffff;\x0d\x0a fon\ +t-family: \x22Open \ +Sans\x22;\x0d\x0a font\ +-size: 12px;\x0d\x0a}\x0d\ +\x0a\x0d\x0aQPushButton:h\ +over,\x0d\x0aQPushButt\ +on:pressed\x0d\x0a{\x0d\x0a \ + color: #FFFFF\ +F;\x0d\x0a}\x0d\x0a\x0d\x0aQPushBu\ +tton:disabled\x0d\x0a{\ +\x0d\x0a color: #99\ +9999;\x0d\x0a}\x0d\x0a\x0d\x0aQPus\ +hButton:flat\x0d\x0a{\x0d\ +\x0a border: non\ +e;\x0d\x0a backgrou\ +nd-color: transp\ +arent;\x0d\x0a}\x0d\x0a\x0d\x0aQPu\ +shButton.Primary\ +,\x0d\x0aQPushButton:d\ +efault,\x0d\x0aQToolBu\ +tton::menu-indic\ +ator,\x0d\x0aQToolButt\ +on.SmallIcon::me\ +nu-indicator\x0d\x0a{\x0d\ +\x0a color: #FFF\ +FFF;\x0d\x0a}\x0d\x0a\x0d\x0aQPush\ +Button.Primary:d\ +isabled,\x0d\x0aQPushB\ +utton:default:di\ +sabled,\x0d\x0aQToolBu\ +tton.SmallIcon:d\ +isabled::menu-in\ +dicator\x0d\x0a{\x0d\x0a \ +color: #BBBBBB;\x0d\ +\x0a}\x0d\x0a\x0d\x0aQPushButto\ +n.SmallIcon\x0d\x0a{\x0d\x0a\ + margin: 0px;\ +\x0d\x0a}\x0d\x0a\x0d\x0a/* Utilit\ +y classes for sh\ +ared styling */\x0d\ +\x0a\x0d\x0aQPushButton.f\ +lat,\x0d\x0aQToolButto\ +n.flat\x0d\x0a{\x0d\x0a q\ +property-flat: t\ +rue;\x0d\x0a}\x0d\x0a\ +\x00\x00\x06[\ +\x0d\ +\x0a/*\x0d\x0a* All or po\ +rtions of this f\ +ile Copyright (c\ +) Amazon.com, In\ +c. or its affili\ +ates or\x0d\x0a* its l\ +icensors.\x0d\x0a*\x0d\x0a* \ +For complete cop\ +yright and licen\ +se terms please \ +see the LICENSE \ +at the root of t\ +his\x0d\x0a* distribut\ +ion (the \x22Licens\ +e\x22). All use of \ +this software is\ + governed by the\ + License,\x0d\x0a* or,\ + if provided, by\ + the license bel\ +ow or the licens\ +e accompanying t\ +his file. Do not\ +\x0d\x0a* remove or mo\ +dify any license\ + notices. This f\ +ile is distribut\ +ed on an \x22AS IS\x22\ + BASIS,\x0d\x0a* WITHO\ +UT WARRANTIES OR\ + CONDITIONS OF A\ +NY KIND, either \ +express or impli\ +ed.\x0d\x0a*\x0d\x0a*/\x0d\x0a\x0d\x0aQM\ +enu::item\x0d\x0a{\x0d\x0a \ + color: #FFFFFF\ +;\x0d\x0a font-size\ +: 12px;\x0d\x0a fon\ +t-family: \x22Open \ +Sans\x22;\x0d\x0a\x0d\x0a /*\ + default height \ +is 18px */\x0d\x0a \ +/* target height\ + is 24px */\x0d\x0a \ + /* 24 - 18 = 6 \ +*/\x0d\x0a /* 6 / 2\ + = 3 */\x0d\x0a /* \ +top, right, bott\ +om, left */\x0d\x0a \ + padding: 2px au\ +to 4px 20px;\x0d\x0a \ + height: 18px;\x0d\ +\x0a}\x0d\x0a\x0d\x0a/* Hover *\ +/\x0d\x0aQMenu::item:s\ +elected,\x0d\x0aQMenu:\ +:item .WidgetAct\ +ion:hover\x0d\x0a{\x0d\x0a \ + background-col\ +or: #444444;\x0d\x0a}\x0d\ +\x0a\x0d\x0aQMenu::icon,\x0d\ +\x0aQMenu::right-ar\ +row\x0d\x0a{\x0d\x0a widt\ +h: 16px;\x0d\x0a he\ +ight: 16px;\x0d\x0a\x0d\x0a \ + subcontrol-po\ +sition: right ce\ +nter;\x0d\x0a}\x0d\x0a\x0d\x0aQMen\ +u::right-arrow\x0d\x0a\ +{\x0d\x0a right: 4p\ +x;\x0d\x0a}\x0d\x0a\x0d\x0aQMenu::\ +icon\x0d\x0a{\x0d\x0a rig\ +ht: 8px;\x0d\x0a}\x0d\x0a\x0d\x0aQ\ +Menu::indicator:\ +checked\x0d\x0a{\x0d\x0a \ +width: 16px;\x0d\x0a \ + height: 16px;\x0d\ +\x0a margin-left\ +: 2px;\x0d\x0a imag\ +e: url(:/stylesh\ +eet/img/UI20/che\ +ckmark-menu.svg)\ +;\x0d\x0a}\x0d\x0a\x0d\x0aQMenu::i\ +tem:disabled\x0d\x0a{\x0d\ +\x0a color: #555\ +555;\x0d\x0a}\x0d\x0a\x0d\x0aQMenu\ +::separator\x0d\x0a{\x0d\x0a\ + height: 0px;\ +\x0d\x0a border-bot\ +tom: 1px solid #\ +454545;\x0d\x0a mar\ +gin-top: 2px;\x0d\x0a \ + margin-bottom\ +: 3px;\x0d\x0a}\x0d\x0a\x0d\x0aQMe\ +nu.SourceControl\ +Menu\x0d\x0a{\x0d\x0a mar\ +gin-left: 8px;\x0d\x0a\ + margin-right\ +: 8px;\x0d\x0a}\x0d\x0a\x0d\x0aQMe\ +nu.SourceControl\ +Menu::item\x0d\x0a{\x0d\x0a \ + margin-left: \ +22px;\x0d\x0a}\x0d\x0a\ +\x00\x00\x00\x00\ +\ +\x00\x00\x00j\ +M\ +arginSize=@Size(\ +0 0)\x0d\x0aHorizontal\ +Spacing=4\x0d\x0aVerti\ +calSpacing=4\x0d\x0a\x0d\x0a\ +[DropIndicator]\x0d\ +\x0aWidth=1\x0d\x0aColor=\ +#FFFFFF\x0d\x0a\ +\x00\x00\x04\xa5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03(iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 \xaf\xf4\x109\x00\x00\x01\x13IDA\ +Tx\xdab\xfc\xff\xff?\x03\xb5\x00\x13\x03\x15\x01\x0b\ +\x88x\x1c\xecB\xb1A\xb2k\xf7\xe0u\x99\x08\x10\xb7\ +\x01\xf1% \xfe\x01\xc5\x17\x80\xb8\x09*\x87\xddeX\ +@0\x10\xcf\x05b~4q}(\xce\x07\xe2$ \ +^K(\xcc@\x06\xadF3\x88\x13\x8aa\x80\x0f\xaa\ +&\x18\x9fa\xa2@<\x0f\x88\x19\xd1\xc4\x05\x80X\x08\ +M\x8c\x11\xaaV\x0c\x97a\xb9P[\x19\xb0\x18\x86-\ +\x9c@j\x0bp\x19\xe6\x87#\x0cA\x86\x09\xe3\x90\xf3\ +\xc1\x15\x01\x1ax\x0c\xe3\xc2!\xa7N(6\xb1\x19\xc6\ +\x83C\xee\x17.o\xde\xc0\xa1A\x0a\x88\xa5q\xc8\xdd\ +\xc3\xe5\xb2M\xd0t\x84\x0e\xea\xf0\xf8b+.\x97M\ +\x01\xe2OX4\x80,p\xc6\x22\x0eR;\x01\x97a\ +\xaf\xa0)\x1b\xbd(Q\x06b%4\xb1\xffP\xb5\xaf\ +\xf0\xe5\x00P\x16\x09\x03\xe2\xcfHb{\x81x\x19\x12\ +\x1f$\x17JLv\x02\x815P\x97\xb4\x03\xf1\x15 \ +\xfe\x0d\xc4_\x81\xf8<\x10\xb7@\xe5\xd6\x12\x9b\xd1A\ +\xe0\x0d\x10WA1Q\x80\x91\x9a%-@\x80\x01\x00\ +\x0681\x98\xc2\xf6\xd7\x17\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\xcd\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x87IDAT8\x11c\xd470x\xfd\xe9\xd3g\ +\x11\x062\x00\x1f\x1f\xef\x1b\x16\x90f+K\x0b2\xb4\ +30\x1c;~B\x84\x05\xa4\xf3\xe5\xab\x97d\x19\x00\ +\xd2\xc4D\xb6N\xa8F\x82\x06\xec\xde\xb5\x1b\xaf\x1d\x04\ +\x0d\xc0\xab\x1b(I\xb1\x01\xe0@D\xb7\x05\xdd\xd9\xc8\ +|W7W\x14\xe5X\x0d@V\x04\xd2\x8c\xccG\xd1\ +M\x0d/P\x1c\x06\x04\x0d\xc0\xe7|\x90w\x08\x1a\x80\ +\xeegt\xfe\xc0\x1b\xc0\xc2\xc8\xc8\xb0\xe7\xee\xdd\xfb.\ +\xe8N#\x86\x0f\xd2\x0b\x00\xb9H\x1e\xb8\xf2\xae\xb8Z\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x8c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Carret / 16\ +x16 / white\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a <\ +/polygon>\x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x00y\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +3IDAT8\x11c`\x18\x05\x830\x04\xfe\xff\ +\xff\xdf\x00\xc4\xb8@\x03QN\x06\xea\xc6f\x08q\x9a\ +a6\xa0\x19B\x9af4C\xc8\xd3\x0c3d\x94\xa6\ +C\x08\x00\x00\xff)K\xb9\x8c\x13\xb5\xa1\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x07\xdc\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a <\ +!-- Generator: S\ +ketch 63.1 (9245\ +2) - https://ske\ +tch.com -->\x0d\x0a \ + Artboard\ + 2\x0d\x0a \ +Created wi\ +th Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x0c\xa4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\ +\x01\xc7o\xa8d\x00\x00\x0aOiCCPPho\ +toshop ICC profi\ +le\x00\x00x\xda\x9dSgTS\xe9\x16=\xf7\xde\ +\xf4BK\x88\x80\x94KoR\x15\x08 RB\x8b\x80\ +\x14\x91&*!\x09\x10J\x88!\xa1\xd9\x15Q\xc1\x11\ +EE\x04\x1b\xc8\xa0\x88\x03\x8e\x8e\x80\x8c\x15Q,\x0c\ +\x8a\x0a\xd8\x07\xe4!\xa2\x8e\x83\xa3\x88\x8a\xca\xfb\xe1{\ +\xa3k\xd6\xbc\xf7\xe6\xcd\xfe\xb5\xd7>\xe7\xac\xf3\x9d\xb3\ +\xcf\x07\xc0\x08\x0c\x96H3Q5\x80\x0c\xa9B\x1e\x11\ +\xe0\x83\xc7\xc4\xc6\xe1\xe4.@\x81\x0a$p\x00\x10\x08\ +\xb3d!s\xfd#\x01\x00\xf8~<<+\x22\xc0\x07\ +\xbe\x00\x01x\xd3\x0b\x08\x00\xc0M\x9b\xc00\x1c\x87\xff\ +\x0f\xeaB\x99\x5c\x01\x80\x84\x01\xc0t\x918K\x08\x80\ +\x14\x00@z\x8eB\xa6\x00@F\x01\x80\x9d\x98&S\ +\x00\xa0\x04\x00`\xcbcb\xe3\x00P-\x00`'\x7f\ +\xe6\xd3\x00\x80\x9d\xf8\x99{\x01\x00[\x94!\x15\x01\xa0\ +\x91\x00 \x13e\x88D\x00h;\x00\xac\xcfV\x8aE\ +\x00X0\x00\x14fK\xc49\x00\xd8-\x000IW\ +fH\x00\xb0\xb7\x00\xc0\xce\x10\x0b\xb2\x00\x08\x0c\x000\ +Q\x88\x85)\x00\x04{\x00`\xc8##x\x00\x84\x99\ +\x00\x14F\xf2W<\xf1+\xae\x10\xe7*\x00\x00x\x99\ +\xb2<\xb9$9E\x81[\x08-q\x07WW.\x1e\ +(\xceI\x17+\x146a\x02a\x9a@.\xc2y\x99\ +\x192\x814\x0f\xe0\xf3\xcc\x00\x00\xa0\x91\x15\x11\xe0\x83\ +\xf3\xfdx\xce\x0e\xae\xce\xce6\x8e\xb6\x0e_-\xea\xbf\ +\x06\xff\x22bb\xe3\xfe\xe5\xcf\xabp@\x00\x00\xe1t\ +~\xd1\xfe,/\xb3\x1a\x80;\x06\x80m\xfe\xa2%\xee\ +\x04h^\x0b\xa0u\xf7\x8bf\xb2\x0f@\xb5\x00\xa0\xe9\ +\xdaW\xf3p\xf8~<\xdf5\x00\ +\xb0j>\x01{\x91-\xa8]c\x03\xf6K'\x10X\ +t\xc0\xe2\xf7\x00\x00\xf2\xbbo\xc1\xd4(\x08\x03\x80h\ +\x83\xe1\xcfw\xff\xef?\xfdG\xa0%\x00\x80fI\x92\ +q\x00\x00^D$.T\xca\xb3?\xc7\x08\x00\x00D\ +\xa0\x81*\xb0A\x1b\xf4\xc1\x18,\xc0\x06\x1c\xc1\x05\xdc\ +\xc1\x0b\xfc`6\x84B$\xc4\xc2B\x10B\x0ad\x80\ +\x1cr`)\xac\x82B(\x86\xcd\xb0\x1d*`/\xd4\ +@\x1d4\xc0Qh\x86\x93p\x0e.\xc2U\xb8\x0e=\ +p\x0f\xfaa\x08\x9e\xc1(\xbc\x81\x09\x04A\xc8\x08\x13\ +a!\xda\x88\x01b\x8aX#\x8e\x08\x17\x99\x85\xf8!\ +\xc1H\x04\x12\x8b$ \xc9\x88\x14Q\x22K\x915H\ +1R\x8aT UH\x1d\xf2=r\x029\x87\x5cF\ +\xba\x91;\xc8\x002\x82\xfc\x86\xbcG1\x94\x81\xb2Q\ +=\xd4\x0c\xb5C\xb9\xa87\x1a\x84F\xa2\x0b\xd0dt\ +1\x9a\x8f\x16\xa0\x9b\xd0r\xb4\x1a=\x8c6\xa1\xe7\xd0\ +\xabh\x0f\xda\x8f>C\xc70\xc0\xe8\x18\x073\xc4l\ +0.\xc6\xc3B\xb18,\x09\x93c\xcb\xb1\x22\xac\x0c\ +\xab\xc6\x1a\xb0V\xac\x03\xbb\x89\xf5c\xcf\xb1w\x04\x12\ +\x81E\xc0\x096\x04wB a\x1eAHXLX\ +N\xd8H\xa8 \x1c$4\x11\xda\x097\x09\x03\x84Q\ +\xc2'\x22\x93\xa8K\xb4&\xba\x11\xf9\xc4\x18b21\ +\x87XH,#\xd6\x12\x8f\x13/\x10{\x88C\xc47\ +$\x12\x89C2'\xb9\x90\x02I\xb1\xa4T\xd2\x12\xd2\ +F\xd2nR#\xe9,\xa9\x9b4H\x1a#\x93\xc9\xda\ +dk\xb2\x079\x94, +\xc8\x85\xe4\x9d\xe4\xc3\xe4\ +3\xe4\x1b\xe4!\xf2[\x0a\x9db@q\xa4\xf8S\xe2\ +(R\xcajJ\x19\xe5\x10\xe54\xe5\x06e\x982A\ +U\xa3\x9aR\xdd\xa8\xa1T\x115\x8fZB\xad\xa1\xb6\ +R\xafQ\x87\xa8\x134u\x9a9\xcd\x83\x16IK\xa5\ +\xad\xa2\x95\xd3\x1ah\x17h\xf7i\xaf\xe8t\xba\x11\xdd\ +\x95\x1eN\x97\xd0W\xd2\xcb\xe9G\xe8\x97\xe8\x03\xf4w\ +\x0c\x0d\x86\x15\x83\xc7\x88g(\x19\x9b\x18\x07\x18g\x19\ +w\x18\xaf\x98L\xa6\x19\xd3\x8b\x19\xc7T071\xeb\ +\x98\xe7\x99\x0f\x99oUX*\xb6*|\x15\x91\xca\x0a\ +\x95J\x95&\x95\x1b*/T\xa9\xaa\xa6\xaa\xde\xaa\x0b\ +U\xf3U\xcbT\x8f\xa9^S}\xaeFU3S\xe3\ +\xa9\x09\xd4\x96\xabU\xaa\x9dP\xebS\x1bSg\xa9;\ +\xa8\x87\xaag\xa8oT?\xa4~Y\xfd\x89\x06Y\xc3\ +L\xc3OC\xa4Q\xa0\xb1_\xe3\xbc\xc6 \x0bc\x19\ +\xb3x,!k\x0d\xab\x86u\x815\xc4&\xb1\xcd\xd9\ +|v*\xbb\x98\xfd\x1d\xbb\x8b=\xaa\xa9\xa19C3\ +J3W\xb3R\xf3\x94f?\x07\xe3\x98q\xf8\x9ct\ +N\x09\xe7(\xa7\x97\xf3~\x8a\xde\x14\xef)\xe2)\x1b\ +\xa64L\xb91e\x5ck\xaa\x96\x97\x96X\xabH\xab\ +Q\xabG\xeb\xbd6\xae\xed\xa7\x9d\xa6\xbdE\xbbY\xfb\ +\x81\x0eA\xc7J'\x5c'Gg\x8f\xce\x05\x9d\xe7S\ +\xd9S\xdd\xa7\x0a\xa7\x16M=:\xf5\xae.\xaak\xa5\ +\x1b\xa1\xbbDw\xbfn\xa7\xee\x98\x9e\xbe^\x80\x9eL\ +o\xa7\xdey\xbd\xe7\xfa\x1c}/\xfdT\xfdm\xfa\xa7\ +\xf5G\x0cX\x06\xb3\x0c$\x06\xdb\x0c\xce\x18<\xc55\ +qo<\x1d/\xc7\xdb\xf1QC]\xc3@C\xa5a\ +\x95a\x97\xe1\x84\x91\xb9\xd1<\xa3\xd5F\x8dF\x0f\x8c\ +i\xc6\x5c\xe3$\xe3m\xc6m\xc6\xa3&\x06&!&\ +KM\xeaM\xee\x9aRM\xb9\xa6)\xa6;L;L\ +\xc7\xcd\xcc\xcd\xa2\xcd\xd6\x995\x9b=1\xd72\xe7\x9b\ +\xe7\x9b\xd7\x9b\xdf\xb7`ZxZ,\xb6\xa8\xb6\xb8e\ +I\xb2\xe4Z\xa6Y\xee\xb6\xbcn\x85Z9Y\xa5X\ +UZ]\xb3F\xad\x9d\xad%\xd6\xbb\xad\xbb\xa7\x11\xa7\ +\xb9N\x93N\xab\x9e\xd6g\xc3\xb0\xf1\xb6\xc9\xb6\xa9\xb7\ +\x19\xb0\xe5\xd8\x06\xdb\xae\xb6m\xb6}agb\x17g\ +\xb7\xc5\xae\xc3\xee\x93\xbd\x93}\xba}\x8d\xfd=\x07\x0d\ +\x87\xd9\x0e\xab\x1dZ\x1d~s\xb4r\x14:V:\xde\ +\x9a\xce\x9c\xee?}\xc5\xf4\x96\xe9/gX\xcf\x10\xcf\ +\xd83\xe3\xb6\x13\xcb)\xc4i\x9dS\x9b\xd3Gg\x17\ +g\xb9s\x83\xf3\x88\x8b\x89K\x82\xcb.\x97>.\x9b\ +\x1b\xc6\xdd\xc8\xbd\xe4Jt\xf5q]\xe1z\xd2\xf5\x9d\ +\x9b\xb3\x9b\xc2\xed\xa8\xdb\xaf\xee6\xeei\xee\x87\xdc\x9f\ +\xcc4\x9f)\x9eY3s\xd0\xc3\xc8C\xe0Q\xe5\xd1\ +?\x0b\x9f\x950k\xdf\xac~OCO\x81g\xb5\xe7\ +#/c/\x91W\xad\xd7\xb0\xb7\xa5w\xaa\xf7a\xef\ +\x17>\xf6>r\x9f\xe3>\xe3<7\xde2\xdeY_\ +\xcc7\xc0\xb7\xc8\xb7\xcbO\xc3o\x9e_\x85\xdfC\x7f\ +#\xffd\xffz\xff\xd1\x00\xa7\x80%\x01g\x03\x89\x81\ +A\x81[\x02\xfb\xf8z|!\xbf\x8e?:\xdbe\xf6\ +\xb2\xd9\xedA\x8c\xa0\xb9A\x15A\x8f\x82\xad\x82\xe5\xc1\ +\xad!h\xc8\xec\x90\xad!\xf7\xe7\x98\xce\x91\xcei\x0e\ +\x85P~\xe8\xd6\xd0\x07a\xe6a\x8b\xc3~\x0c'\x85\ +\x87\x85W\x86?\x8ep\x88X\x1a\xd11\x975w\xd1\ +\xdcCs\xdfD\xfaD\x96D\xde\x9bg1O9\xaf\ +-J5*>\xaa.j<\xda7\xba4\xba?\xc6\ +.fY\xcc\xd5X\x9dXIlK\x1c9.*\xae\ +6nl\xbe\xdf\xfc\xed\xf3\x87\xe2\x9d\xe2\x0b\xe3{\x17\ +\x98/\xc8]py\xa1\xce\xc2\xf4\x85\xa7\x16\xa9.\x12\ +,:\x96@L\x88N8\x94\xf0A\x10*\xa8\x16\x8c\ +%\xf2\x13w%\x8e\x0ay\xc2\x1d\xc2g\x22/\xd16\ +\xd1\x88\xd8C\x5c*\x1eN\xf2H*Mz\x92\xec\x91\ +\xbc5y$\xc53\xa5,\xe5\xb9\x84'\xa9\x90\xbcL\ +\x0dL\xdd\x9b:\x9e\x16\x9av m2=:\xbd1\ +\x83\x92\x91\x90qB\xaa!M\x93\xb6g\xeag\xe6f\ +v\xcb\xace\x85\xb2\xfe\xc5n\x8b\xb7/\x1e\x95\x07\xc9\ +k\xb3\x90\xac\x05Y-\x0a\xb6B\xa6\xe8TZ(\xd7\ +*\x07\xb2geWf\xbf\xcd\x89\xca9\x96\xab\x9e+\ +\xcd\xed\xcc\xb3\xca\xdb\x907\x9c\xef\x9f\xff\xed\x12\xc2\x12\ +\xe1\x92\xb6\xa5\x86KW-\x1dX\xe6\xbd\xacj9\xb2\ +\x15\x89\x8a\xae\x14\xdb\x17\x97\x15\x7f\xd8(\xdcx\xe5\ +\x1b\x87o\xca\xbf\x99\xdc\x94\xb4\xa9\xab\xc4\xb9d\xcff\ +\xd2f\xe9\xe6\xde-\x9e[\x0e\x96\xaa\x97\xe6\x97\x0en\ +\x0d\xd9\xda\xb4\x0d\xdfV\xb4\xed\xf5\xf6E\xdb/\x97\xcd\ +(\xdb\xbb\x83\xb6C\xb9\xa3\xbf<\xb8\xbce\xa7\xc9\xce\ +\xcd;?T\xa4T\xf4T\xfaT6\xee\xd2\xdd\xb5a\ +\xd7\xf8n\xd1\xee\x1b{\xbc\xf64\xec\xd5\xdb[\xbc\xf7\ +\xfd>\xc9\xbe\xdbU\x01UM\xd5f\xd5e\xfbI\xfb\ +\xb3\xf7?\xae\x89\xaa\xe9\xf8\x96\xfbm]\xadNmq\ +\xed\xc7\x03\xd2\x03\xfd\x07#\x0e\xb6\xd7\xb9\xd4\xd5\x1d\xd2\ +=TR\x8f\xd6+\xebG\x0e\xc7\x1f\xbe\xfe\x9d\xefw\ +-\x0d6\x0dU\x8d\x9c\xc6\xe2#pDy\xe4\xe9\xf7\ +\x09\xdf\xf7\x1e\x0d:\xdav\x8c{\xac\xe1\x07\xd3\x1fv\ +\x1dg\x1d/jB\x9a\xf2\x9aF\x9bS\x9a\xfb[b\ +[\xbaO\xcc>\xd1\xd6\xea\xdez\xfcG\xdb\x1f\x0f\x9c\ +499\xe2?r\ +\xfd\xe9\xfc\xa7C\xcfd\xcf&\x9e\x17\xfe\xa2\xfe\xcb\xae\ +\x17\x16/~\xf8\xd5\xeb\xd7\xce\xd1\x98\xd1\xa1\x97\xf2\x97\ +\x93\xbfm|\xa5\xfd\xea\xc0\xeb\x19\xaf\xdb\xc6\xc2\xc6\x1e\ +\xbe\xc9x31^\xf4V\xfb\xed\xc1w\xdcw\x1d\xef\ +\xa3\xdf\x0fO\xe4| \x7f(\xffh\xf9\xb1\xf5S\xd0\ +\xa7\xfb\x93\x19\x93\x93\xff\x04\x03\x98\xf3\xfcc3-\xdb\ +\x00\x00\x00 cHRM\x00\x00z%\x00\x00\x80\x83\ +\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17o\x92_\xc5F\x00\x00\x01\xcf\ +IDATx\xda\xec\xd4KN\xc2P\x18\x86\xe1n\ +\x87\x19\x1b`\x80\x12\xe3DZ+\x04\x0c \x16\x1a\xa8\ +\xa9\xce\x0cB\x95\xa2\x5cb\xc1x\x89\xb2\x04EP\xd9\ +Dg\xdd@\xb7\xf390\x1cz\xe8\xc5\x16+\x0ct\ +\xf0\x06Z\xc2\xff?p\x02\x0c\x00f\x9d1\xff\x00\x00\ +L$\x1ac\xf2'\x03\xe4\x8f\xfb\xd8?\xea!'k\ +\xc8\x9f\x0c0\xbb\x97\x935d\xa5\x0e\xd2b\x0b\xa9\xb2\ +j+-\xb6\x90\x16[\xc8T\xdb\xc8J\x9d\xf9\xfb\x8f\ +\xfb\xf39\x0bE\xa2\xb19 'k\xc8\xc9\x1a\xb8b\ +\x1d\xca`\x04e0B\xa3\xff\xe2X]s\xef\xec\xfa\ +\xf9\xdb\xb8b\x9d \x09 +u\xd1\x1bN\x91*\xab\ +h\xde\x8e\xa1\xdeM\xd0\xbc\x1dS\x9d\xdf\xbc\x92\xc7\xa0\ +\xcd>\xd4,\xb6PCV\xea\x82:\x02^P\xd0\x1b\ +N\x91\xa9\xb6qy\xff\xe6\xbb\xd6\xdd\xc45\xd5\xa5L\ +\xb5M\x1fA$\x1a\xa3\x10_g\xdbDo8%u\ +\x9f\x9c\xeb<~\xb8v\xf5\xf0N\xb5W\xba@\xaa\xac\ +b\xb6\xcf\x06\xb0\x22xA\x01/(\xd8=l`;\ +-c\x8b\x97\x90\xe0*\xd8dEl$K\xd8dE\ +\xf2|#YB|G@|G \xaf%\xb8\x0a\xb6\ +x\x09l\xa1Ff\xf1\x82\x02\xeb.G\x80\x15\xc1\x15\ +\xeb\xa1\xb6\xb8\xc7\x15`E$\xf3\xa7\xa1\xe4\xb4\xc3\x13\ +\x10\x04\xa1\x1bf\xe0\xe5\xbe\x00~\x11^\x00\xaf\xd9\xbe\ +\x00~\x10n\x80\xef\xe6\xfa\x06X\x11l\xa1fK7\ +L\xdb=?3\x03\x01\xbc\x10\x8b\x00\xbf\xf3\x02\x03\xa8\ +\x9f\xe8\xc1\x19I7L\xea\xfa\x8f\x00,\x7f0\xbaa\ +z\xfe\xe1\xfc\x03~\x05\xb0{\xd8 \xe9\x86I]\xaf\ +\x0c\xa0\x1b\xa6\xad\x95\x02\x16\x11+\xff\x06\xd6~\x04N\ +\x05\x99\x15: \xc8\x9c\xd0\x01A\x97\x87\x0aXfy\ +h\x80e\x97\x87\x02\xf8\xc9r\x0a\xb0\xce>\x07\x00\x8a\ +\xf3\xd2\xe1\x0d\x05\x14\xc9\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x01T\ +\x00\ +\x00\x06Zx\x9c\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\ +\xe0\xf5\xf4p\x09\x02\xd2\xc2 \xcc\xc1\x06$\x8b\x02\xcc\ +\xce\x00)\xb6$ow\x17\x86\xff \xb8`\xef\xf2\xc9\ +@\x11\xce\x02\x8f\xc8b\x06\x06=e\x10f\xacXj\ +_\x06\x14d/\xf1\xf4ue\x7f\xcc%\xcf#(\xb4\ +}\x8b\xf9\x0d\xa0\x90d\x89kD\x89s~nnj\ +^\x09\x83sQjbIj\x8aByfI\x86\x82\ +\xbb\xa7o@x#\x9f8\x03\x03\xeb!O\x17\xc7\x10\ +\x0bA\xc6\xed\xac\x1e\xbf\x18\xa8\x09\x98\xa14#\x103\ +\x91\xa1\x1fE\x1f\x8c\xc1\x0a\xa5\xff\x93h\x18L=+\ +\xcc0\x10\xe6\x04\xe2\x7fd\xb8\x8c\x01\xaa\x0f\xa4\x9f\x09\ +f\x18\x0f\x99\x06\xc1\x00\x0f\xb2a\x5c\x14\x1a\xc6\x053\ +\x8cj`\xd4\xb0Ad\x18\xb9\xc9\x03\xae\x0ff\xd8_\ + 6\x04b^\x12\x0d\xe2\x85\xea\x03\xe9g`a\x80\ +d\x87\x9f@\xcc\x01\xc4aP\x05\xcc\xb8t#\x01\x90\ +\x01\x9f\x81\xf8\x01T\xff?\x98a_\x80\xf8\x19T\x11\ +\x1f\xd40F<\x06\xfd\x87\x1a\xf6\x09\xaa\x0f\xa4\xff\x1f\ +L\x03(\xd7s\x031?\x03$\xd3\x12\xeb\xb2\xef@\ +\xfc\x11\x88\xbf\x02\xf1o\x98a\xb0r\x89\x95\x08W\xa1\ +\xbb\xee7\x03\xc4w\xa4\x16_\xf8\xc1\xb4k\x0a\x0f.\ +?\xcd\x9f\x02b{\xba\xfa\xb9\xacsJh\x02\x00y\ +]M4\ +\x00\x00\x01\xda\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x01h\xf4\xcf\xf7\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x01oIDAT(S\x95S\xdbm\ +\xc30\x0c\xd4&E\xd4\x11\xdc/\xeb\xfd0\xea\x06H\ +g\xc8\xc0\x19\xa3H\xc7`y\x94,'\x85\x7f\xf2q\ +\x22u:\x12\xd2\xd1VoZ\x7f\x9d\xf4;),!\ +\x86\x96\x08\x13B\xd8\x99R\x0a\x95\xca(\xb5\x11\xc6Z\ +2\xc6\x905v\xaf\xe9\xb8\xabR+U.\xa9\x5cR\ +Q\xb25\xbb\xddn\x84\x5cI\xbdm\xf5\x96\xa3\xf4X\ +\x96\xa5\x83\xcbG\xbe\xd0\xba\xaeM\x90rjH\x89r\ +\xca\xd2.\xf7\xbd\x08\x9cw\xe4\x198\xd8\xe0\x9c\x17\x0e\ +\x82\xfb<\xcft\x84i\x9a\x9a\x00]\x8e\x00\xa7\xd4\xfa\ +\xb9>\x5c\xf2\x19\x10)\xf8#^q\x1c\x06\xb0\x19\xf0\ +N\x04\xf9\xff\xcd\x19\x88\x80\x08\x22\x9c\x0aQ\x04\x91\x1d\ +\x83[1F\xc9E\xe0=?\xc7=?\x11\x1c\x9e.\ +\x02\xd8i1\x1a\xb6\xb8\xd9\xdb,F\x14\xc1\xf41\x91\ +9\xf0\x00`\xc1\xaf\xf8p\xb9|\xd3\xf5z}\x09\xa8\ +A\xad\x8c\x02\x03\xc4\xd3\x070\xd4\xca\x9c\xc4\x1dK\xe7\ +0\xf4\x85\xf7rE,\x99\xfd\xcb%S\xc9\x99\xedi\ +\x96\x1d\xa1@\xf3\xa0\x1d\x0db\x8a\x94`\x1d\x22\xfb\x0e\ +1\x22\xec\x04\xbfq\xed\x1c\x1c\xcf\x83\xf9\xd1 \x04O\ +\x01vc&\x1c!\xf6\xe0x\xef=\x83s\xe1\xf8L\ +\xbe\xf0\xce\x8d\x06\x8e\xe7dm\x07r\x81%'#\xe1\ +8\xf6\xfb\xd9\x18\x13\x16\xfcb\x8f\x98\xcd\xdc\xf2\xb9s\ +[|\xcae\x8c\xa4\xb4\xd6gN~\xb1y\x09'\xfd\ +\xa3\xb5>\xff\x01\x86\x96\xca\xc9\xfc\xc1\x9eq\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x06\xe8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Help / Ho\ +ver\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x07\xbc\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Icons / Sy\ +stem / Text Fiel\ +d / Warning larg\ +e Copy\x0d\x0a\ + Create\ +d with Sketch.\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + <\ +path d=\x22M1.26456\ +836,17.5360962 C\ +0.614238084,17.5\ +360962 0.3790447\ +55,17.0488226 0.\ +733965982,16.456\ +5557 L8.85213065\ +,2.9095853 C9.20\ +941782,2.3133715\ +3 9.79106039,2.3\ +1731835 10.14598\ +16,2.9095853 L18\ +.2641463,16.4565\ +557 C18.6214335,\ +17.0527694 18.38\ +79625,17.5360962\ + 17.7335439,17.5\ +360962 L1.264568\ +36,17.5360962 Z \ +M8.75189665,12.8\ +406525 L10.32937\ +17,12.8406525 L1\ +0.5986967,6.4599\ +6643 C10.2652445\ +,6.34547458 9.91\ +256129,6.2882295\ +3 9.54063415,6.2\ +8822953 C9.16870\ +701,6.28822953 8\ +.81602379,6.3454\ +7458 8.48257165,\ +6.45996643 L8.75\ +189665,12.840652\ +5 Z M9.45610276,\ +16.247085 C9.773\ +9892,16.247085 1\ +0.0315817,16.142\ +0611 10.2288912,\ +15.9320098 C10.4\ +261989,15.721958\ +6 10.5248528,15.\ +4523025 10.52485\ +28,15.123033 C10\ +.5248528,14.7937\ +636 10.4261989,1\ +4.5241075 10.228\ +8912,14.3140562 \ +C10.0315817,14.1\ +04005 9.7739892,\ +13.9989811 9.456\ +10276,13.9989811\ + C9.13821632,13.\ +9989811 8.880621\ +99,14.104005 8.6\ +833143,14.314056\ +2 C8.48600478,14\ +.5241075 8.38735\ +276,14.7937636 8\ +.38735276,15.123\ +033 C8.38735276,\ +15.4523025 8.486\ +00478,15.7219586\ + 8.6833143,15.93\ +20098 C8.8806219\ +9,16.1420611 9.1\ +3821632,16.24708\ +5 9.45610276,16.\ +247085 Z\x22 id=\x22wa\ +rning-icon\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x02\x9b\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Carret / 16\ +x16 / white\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \ +\x0d\x0a\x0d\x0a\ +\x00\x00\x02\x9e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00\x19tEXtSoftwa\ +re\x00paint.net 4.0\ +.10\xad\x0a\x0a\xc0\x00\x00\x02\x0eIDATH\ +Kc\xf8\xff\xff?M1VAjb\xac\x82\xd4\xc4\ +X\x05\xa9\x89\xb1\x0aR\x13c\x15\xa4&\xc6.\x08\x05\ +\xb6Y\x89\x0a\xed\xebWO\xdex\xe6\xd4\x8d\xcd\xe7\xce\ +\xbc\x01\xd2W\xebW,\xe93\x8c\x0a\x94\x81*a\xd0\ +\x0d\xf6f\xf0\xab+c\xf0\xac,\x00c\x0c\xb3\xd0\x05\ +\xc0\x82@\xa0\xeclc\xba\xfa\xc4\xb1\xc7\xfb\xaf^\xf9\ +\xbf\xf5\xdc\xd9\xff@\x0b\xc0\xf4\x81kW\xff\xaf:~\ +\xf4\xae\xa2\x83\xa5\x1eH\x9dv\xa0'\xe9\x16p\x89\x0a\ +\x0b\xcc\xdd\xb7\xe7&\xc8p\x90\xc1\xe8\x18d\xc9\x94\x1d\ +[/p\x8b\x89\xb0\x98'E2\xf8\xd6\x96\x90f\x81\ +Uz\x5c\xfa\xb1[7\xb1\x1a\x0e\xc3{\xaf\x5c\xfe\x1f\ +\xd8X\xb9\xc8\xb5$\xdb\x0bh0\x0bI\x16\xc4\xf6\xb4\ +\xad<|\xe3:V\x83ax\xcf\xe5K\xff+\x97\xcc\ +\xff\xefR\x9c\xf5\x1fh\xf0> V!\xda\x82\x84\xfe\ +\x8e\xed\xc4XP\xb5d\xc1\x7f\xe7\xa2L\x90\x05 |\ +\x05\x88\x85\xd0\xcdB\xe1\xc000\xd2\x16\x10\x13D\x19\ +\xd3& [\x00\xc2M\xe8f\xa1p`X\xc6\xc2(\ +\x1c\xe4\xc2m\xe7\xcfa5|\xc7\x85\xf3\xff\xd7\x9d:\ +\xf1\xdf\xab\xaa\xf0\xbf{y\x1e\xb2\x05\x97\xd1\xcdB\xe1\ +\xc0\x05\x19\x18\xb8\x82\x9b\xabw\x9f\xba{\x07l\x18\xba\ +\xe1\xa0\xd4\x952\xa9\xe7\xbfC^*\xd8\x12$\x0b\xde\ +b\x98\x85.\x00\x16\x04\x02f66%`*\xd9\x0f\ +J\xfb\xa0\xe0\x02%MP\xb0\x00\xf3\xc0\xff\xc4\x09\x9d\ +\xff\x81\x99\x10\xddp\x10~\x8ca\x16\xba\x00X\x10\x01\ +\x04%\x0c\xb4\xb3\x81.]\x0f4\xf4gTW\xf3\x7f\ +\xc7\xfc4\xb0\xe1h\x06\xc3\xf0z\x0c\xb3\xd0\x05\xc0\x82\ +X\x80AD@\xa3SA\xfa\x7f\xf7\xb2\x5cl.\x07\ +\xe1\xbf@l\x8ba\x16\xba\x00X\x10\x0d\xb0pr0\ +\x00\xd3;\xabOM\xf124Ca\xf8\x0f\x10\xe7\x03\ +1\xa6Y\xe8\x02`A4\x00\xb2\xc0\xa90\x83\xc1\xbb\ +\xba\x88\x09hH:\x10\x1f\x06\xe2\x97@\xfc\x18\x887\ +\x00\xb1\x0b\x10\x13\x9f\x93\xa9\x89\xb1\x0aR\x13c\x15\xa4\ +&\xc6*H=\xfc\x9f\x01\x00\x81\x15\x00\xc6\xbfh(\ +G\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xda\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x01h\xf4\xcf\xf7\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x01oIDAT(S\x95S\xdbm\ +\xc30\x0c\xd4&E\xd4\x11\xdc/\xeb\xfd0\xea\x06H\ +g\xc8\xc0\x19\xa3H\xc7`y\x94,'\x85\x7f\xf2q\ +\x22u:\x12\xd2\xd1VoZ\x7f\x9d\xf4;),!\ +\x86\x96\x08\x13B\xd8\x99R\x0a\x95\xca(\xb5\x11\xc6Z\ +2\xc6\x905v\xaf\xe9\xb8\xabR+U.\xa9\x5cR\ +Q\xb25\xbb\xddn\x84\x5cI\xbdm\xf5\x96\xa3\xf4X\ +\x96\xa5\x83\xcbG\xbe\xd0\xba\xaeM\x90rjH\x89r\ +\xca\xd2.\xf7\xbd\x08\x9cw\xe4\x198\xd8\xe0\x9c\x17\x0e\ +\x82\xfb<\xcft\x84i\x9a\x9a\x00]\x8e\x00\xa7\xd4\xfa\ +\xb9>\x5c\xf2\x19\x10)\xf8#^q\x1c\x06\xb0\x19\xf0\ +N\x04\xf9\xff\xcd\x19\x88\x80\x08\x22\x9c\x0aQ\x04\x91\x1d\ +\x83[1F\xc9E\xe0=?\xc7=?\x11\x1c\x9e.\ +\x02\xd8i1\x1a\xb6\xb8\xd9\xdb,F\x14\xc1\xf41\x91\ +9\xf0\x00`\xc1\xaf\xf8p\xb9|\xd3\xf5z}\x09\xa8\ +A\xad\x8c\x02\x03\xc4\xd3\x070\xd4\xca\x9c\xc4\x1dK\xe7\ +0\xf4\x85\xf7rE,\x99\xfd\xcb%S\xc9\x99\xedi\ +\x96\x1d\xa1@\xf3\xa0\x1d\x0db\x8a\x94`\x1d\x22\xfb\x0e\ +1\x22\xec\x04\xbfq\xed\x1c\x1c\xcf\x83\xf9\xd1 \x04O\ +\x01vc&\x1c!\xf6\xe0x\xef=\x83s\xe1\xf8L\ +\xbe\xf0\xce\x8d\x06\x8e\xe7dm\x07r\x81%'#\xe1\ +8\xf6\xfb\xd9\x18\x13\x16\xfcb\x8f\x98\xcd\xdc\xf2\xb9s\ +[|\xcae\x8c\xa4\xb4\xd6gN~\xb1y\x09'\xfd\ +\xa3\xb5>\xff\x01\x86\x96\xca\xc9\xfc\xc1\x9eq\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x03\xf8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03(iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 Z\x11or\x00\x00\x00fIDA\ +Tx\xdab\xfc\xff\xff?\x03-\x01\x13\x03\x8d\xc1\xa8\ +\x05#\xc0\x02\x16\x5c\x12\xad\xad\xad$\x1bV]]=\ +8\x83\xe8\x1e\x10\xbf\x83\xe2\x89@\xccFm\x0b\x84\x80\ +X\x10\x8a\xf3\x80\xf8'\x92\x85 |\x83\xac8 \x00\ +\x04q\xb0Gh> T\xdc\xfe\xa3\xd4\x82\xfb\x94\xc8\ +\x13\x13\xc9F\x83:\x0e\x18Gk\xb4Q\x0b(\x06\x00\ +\x01\x06\x00{\x0b\x15\xcc\xc3\x8e\x96 \x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x05U\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04gAMA\x00\x03[^\x5c\xff&x\ +\x00\x00\x05\x0cIDATX\x09\xb5W\xcbNcW\ +\x10lgfc;\xab\xcc&$\x8aFy \xc0\ +\x92\x8f\xc8o@\x945\x18OX\xb1\x19$\xb0M\xe6\ +\x13\xf8\x8d\xe4#\xd8\x06\xf1J\xa2D\x11\xc3l&\x13\ +0\x8c\x98\x18p\xaa\xaa\xbb\x8f\xafQ\x16Hd\xae\xf1\ +=\xe7tWWW\x9f\xc7\xbd\xa6\xf6\xf9\x17_\xdaC\ +\xae\xdf~\xfd\xe5!\xe1V\x0b\x01\xdf\x80e\x07\xdf\x89\ +\x07\xb1\xdd/\xf8\x14\xb0%\x08\xff\x89\xf0\xc7\x11\xb33\ +7;;\xf1\xe4\xc9G1|\x7f\xcd\xeb\xd7\x7fM\xfc\ +\xbc\xb7\xc7b?a\x96\x1401\xb8\x1e\xd8\xc9\xc9K\ +\xab\xd5\x86f\xc3\x1a\x5chkl\xd9C\xdfj&\x97\ +\xfa\x1c\x06\x86\x00\xf9\x1c?$T\x96\x88\x02\xce\xa3\xc1\ +\x03\xe7\xe3G\x8f\xe8.3\x9d\x02\xec\xe6\xfa\x9a\x0e\x80\ +p\xf3Lh\x9cD\x8e\x90\x81\x5c\xaeM>\x0c4\x06\ +.\xdap\x97\x1a\xc4W\x89\xbd\xbe\xb9q\xba\xb8\x7fP\ +F\xa1\x5cc\x92c|\xcb@g(09`\xbb\xa5\ +\x85>}\xd1\xdc\xb2\xcf!n\xf2yCc\xf9\xc8\x17\ +\xfep\x97\x19p \xf4\x87\x9f\x95\x88\xf0\xce2TK\ +\x1b\xdeY\x06\x0f\xc6\x94\x17\x0e\xa6\xe6j\xe52\xb0\xa0\ +\xc8\x1cM\x11 {\xc5\xeb\xa1\x1e \x12\x05\xdc\x89\xae\ +\xe0\xbd\x00\x82F\x98\xec\xe5\xac\xe48r\xab\xb9#\x00\ +6\xac\x7f-6!z\x85\x90\xd5rOp\xf3Q\x9c\ +o\x13\xd8\x98\x903\x01\x9f'p\x1b)\xc2\x1b\xf9\x22\ +}4a\xb4\xd1\x1e\xe0\x1a\x92B\x7fI\xe6\xe8\xc9\xc9\ +I\xdb\xda\xdc\xb4F\xb3\xe9k\xec0\xe1\x89`\x85\x8e\ +4k6\x1b\xb6\xb9\xb5e\x93_M\x06\x96\xe0\x08H\ +PfG;\x12\x90t\x04\x87\x10\x05\xa2\xbf\xb8\xb8d\ +\x0b\x0b\x0b\xd6\xeb\xf5\xac\xd9\x80\x88\xfc0\xb1\xf0\x8a\xb0\ +F\xa3!\x0c\xb1\x8bK\x8b\x9eW\xf9K\x84\x03\xffK\ +\x80jH\xa1\xd8\xe2\x1e\x82\x16\xb6\x8d\x8d\xe7\xb6\xbf\xbf\ +oSSS\xd6\xedu%\x02\x80rQD3\x92\x13\ +spp`\x1b\xcf7\xbc\x90\x04\x12/\xfeJ L\ +e\x06T\x08o\xf8r\xfd4\xf6\x08\xbb\xbc\xb8\xb0\xb5\ +\xb55\x11OOO[\xb7\xeb\x224\xf5\x00rih\ +\xa3\xef\xf0\xf0\xd0\xbe\x7f\xf6\xcc.//\xcb\x0c\x88\xd3\ +\x09SN\x11_\x04P\x1e\xb5\x95\xf3\xcdq(\xa6\xa7\ +\x0f\x11m\x103\xc1\xcc\xcc\x8cu\xba\x1d\xacwS\xdf\ +\x1e\x92\xd3F_\xbb\xdd\xb6\x0b%'\x9b\x7f\xc5\x89\xfe\ +\xad\x08}\x94\x0a\xf2e4|\xfa\xf43\xc7\xcb\xe3\xbb\ +\xbfz\xf7\x9dn\xf6!6\xd9\x0f/^h9\xf6\xf6\ +\xf6tN\xbe\x9e\x9dU\xf2\xd5\xd5U\xbb|\xfbV\xa7\ +\xc5O\x10\xc9(\x82G\x82\xadz\xf6\xfb\x1f\x7f\x1a^\ +F\xa4\x1f_\x02\xd7\xeb\xf7\x9c\x11_\x0b\xd8\x86T~\ +k}T\xd7Zm)\xe1,\x12g\xf2\xf6*+\xbf\ +\x00\x8c\xcf\xcf\x88\x8ei\x97\x08\x19}V\x998\xaf\xf2\ +\x1c`\x22\xaf\x18\xf0P\xeb\xc9\x8bx\x11\x93\x8c\xb8\xc1\ +\xc0\xdf\x1d$\x1a\x0c\x06\x90F\x81\xce\xe0\x8b\x89'\x84\ +?,\x08\xa9\x5cT2\xba\xca\x1e\xf0\xf5\x86#;\x05\ +\xe7\xaa\xf5^\x80\x9b\xeb\xde\xe9tmn\x8e\xd3~d\ +GGG\xe8\xcfY\x176\x9e\x84Rm\xbc\x1b\xa8\xba\ +L\x84\xf2\x16b\x8d\x8a\x00\x06\xe6\x03\xc5\xdb\x18\xe3H\ +d%L\xd0\xe9t\x94\x90\x89\xdb\xed\x96\xb5Z\xbe\x1c\ +\x12\x81\xcd\xd8\xe0s\x02\x19\x99&y\x9c;\xc6\xe3\xf9\ ++{\xc0\xb5S\x86\xeb\x94l\xd10\xde\xeaH\xce\xa3\ +6??\xaf\xaa[++vv\xd6\xb7~\xff\xdc\xb8\ +\xf9\xcaL\x00So\xd4\xc1\x91{\x9f\x89I\x1e\xe3\xf1\ +\xe9\x18\x09\x10\x8aN\xfee\xcb8\xf4\xeb\xf5\xbam\xe3\ +)X\x92\xa3\xea~\xbfO\xaf\xc2\xce\xcf\xcfm\x05\x82\ +(\x82\x98\xed\xde6b\x1a\xce\xa3\x82F3\x82\xa0\xb1\ +k\xb4\x04R\xa9\xfc\x22\xd5\xf4\xc96\xb4\xf5\xf5u\x11\ +\x1f\x1f\x1f\x9bW~\xa6\xfa\xcal!\x09\x05\xd1G\x0c\ +E0Fu\xb0puH\x16}\xef\xe9^\x04\x90L\ +\x84\x04K\xb5\x839\xda\xd9\xd9\xb1\xdd\xdd]Uy\x86\ +ju\x01\xa7M.r\xe6\x18\x1a}\xcb\xcb\xcb\xc22\ +&\xca\x11\x9b\xd7\xc2\x0c:\xfe\xce\x81{y\x10}:\ +\xf1q1\xc6\xdbX\xcf\x1e\x1e-\x06\xe7\x01\xd3+\x16\ +\x06\xbe\x81\x99\x80>\xf7jXA\xcb\xa1\xc7\xfa\x18\x03\ +\x02^\x9e\xbe*\x0f\xa2\xf2\x1cp\x22\x0f\xca\xe3\xab\xc9\ +\x88\x81\xfcH\xaa\xfd\xc1\x5c4\xc4\xef\x80\xf8q\xa0`\ +\xe7\xa9\xb0E7\xa5\x16\xb1\x9e\xaa\xb2\x09K5\xbe\x7f\ +\x19\xa0Xd\x1a\xf5}R3\xd3\x10;[(\xacs\ +b\xd4R]\xd1 \x84\x87\xd0\x16\xa7!\xf2\x97\x9f\xe5\ +^QDi\xbauC\xf0h\x00\xaf\x06Un\x15T\ +}r:\xc2\xf3\xe7LjD\x07\xbeEW((\x9b\ +0]\x12I\xa7\xe6\x98m\xa5_\x0dO\xa6\x0c\x08|\ +\x9a\x19\xe8\xb3!2\xa7K,Mq\xa5\x80\xd3\xabw\ +\xff\x00\x84\x90B\xc4\xad\xc3\x0f.\x94\xa2O\xf1\xd1\x86\ +/\x9c\xc5\xce'&?c6\xc08\x0d\x95\xeb\xea\xea\ +\x1dG\xaf\xd2\x94\x9b\xf0\xdb7o\xfe\xe6\xb9\x19\x1d\x85\ +D\xfc\xff\xed\x09(\xbfK\xda\x14\xf0#\x0c\xe5\xdf\xa5\ +t\xde\xa7}\xf0\x7f\xc79\xe5\xf7I\xf6>0\xff\x02\ +\xd6mz\xe4\x18*;\xf0\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\xe2\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0d\x00\x00\x00\x09\x08\x06\x00\x00\x00\xe9z\xa6j\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x9cIDAT\x18\x19\x8d\xcfA\x0a\x82@\x14\xc6\xf1\ +Yw\x00\xf7\xb5\xc8\x85E`\x1b]\xe5\xc6Z\xd5-\ +:O7\xea2\x0a*(\x05EH-\xa6\xff\x83q\ +\x18E\xd0\x81\x1f3\xef\xbd\xef\x09*5\xf3h\xad\x03\ +\xecf\xc6\x95\x22\x1c\xa2F\x81\xc5\xe4\x22\xa1\x08\x0f|\ +p\xb2\x0b\x14\x9e-\x9c\x07\xfd\x03^FbG4\xae\ +x#\xb5M\x1e\xd4G\xc8\xd7\x9f\x88\xdd\x99\x0c\xf7h\ +\xd0\xe2,C\xee\x8b\xa9\xe5?\xc2\xdeBW0\xd8\xa2\ +\xc2\x177\xfcPb\xd3eFo\x02>r\xc8\xc9\xb0\ +\x1e\x0d\x0e\x9b\x04W\xb8c9\x9c\xb9\xf5\x1f\x9c\xb0\x9f\ +P\xa9\xf0\xce\x95\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x04\xaf\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Buttons / \ +Dropdown button \ +with Icon / Defa\ +ult\x0d\x0a \ + Created w\ +ith Sketch.\x0d\x0a \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + <\ +g id=\x22Sky-Icon-/\ +-System-/-Menu\x22>\ +\x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a\ + \ + <\ +/rect>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x01\xc8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +\x82IDAT8\x11\x9dS\xbb\xaa\xc2@\x10=\xd1\ + \xc17\x16\x82\xd8\xd9\xd9(\xa2M:k\xab\xfc\x82\ +\x9fb\x9dO\xb0\xf4\x0b,\xbc?`-\x82X\x88\x85\ +\x88 >:\xe3[\x94\x98\xb3\x97]\x12\xef\x05!\x03\ +Kvg\xe6\x9c\xcc\x9e\x99\xd5\x1a\x8d\xc6\xc0u\xdd\x16\ +B\x98\xa6i?:\xc1\xcdf3\x04\x1c\x18\x0e\x87-\ +\x9d\xc8\xd5j\x15\x8a\xe0\xf5zA\x10|\xa23\x99\x0c\ +:\x9d\x0et\xfd7\xecU\x09\xdb\xb6\xff\xfd\x91\x22(\ +\x95J0M\x13\x86a \x16\x8b\xe1~\xbf\x8b%\xc9\ +-\xcb\xc2\xf9|\xc6\xf3\xf9\xc4x<\xc6d2\x11!\ +Ep\xb9\x5cp\xbd^Q.\x97\xb1\xdf\xef\xb1^\xaf\ +%V}\x8b\xc5\x22\x1c\xc7\x11K:\x15\xc1v\xbb\xc5\ +h4B\x22\x91@\xbf\xdf\x07\x85\x9d\xcf\xe7H\xa5R\ +H\xa7\xd3\x98\xcdf\xa8V\xab\xf0\x94\xc7r\xb9\x94\xf8\ +\xa0\x06,;\x99L\x22\x1e\x8f\xa3R\xa9\xe0x<\x22\ +\x97\xcb!\x9f\xcfc\xb3\xd9\x88\xd8n\xb7S`n\x22\ +\xfe\xd3\xe3\xf1\x10I~\x9f\x7fO\xf2\xd3\xe9\xe4w\x05\ +\x09n\xb7\xdbW\x02V\xe5\xb7?\x15\xf0\xce\x91H\xc0\ +\xad\xf2\xb3\xd9l@@\x06\x94\x88<\xb0E\x1c\xaaZ\ +\xad\x86\xe9t\x0a\x0a\xcb\xd6\x1d\x0e\x07\x14\x0a\x05D\xa3\ +Q\xe1c\xae\xb4\x00\x01\x9d\xbd^\x0f\xedv[\x08W\ +\xaf\xd7E\x1e\x07\x8am\xeev\xbb\x12\xa7\xbe\x9a\x97\xe4\ +r\x88>\x8d\xc3$'\x91#\xcb\x0e}\xdab\xb1\x08\ +^\xc1\x9f\xc0\x8ep}3\x9dO\xd2c\x0a\xf5\x9c=\ +\xf2\xc1\x1ba\x08\xa0-m>\x16\xb3\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x03\xf6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03(iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 _\x0c\xdb\xee\x00\x00\x00dIDA\ +Tx\xdab\xfc\xff\xff?\x03-\x01\x13\x03\x8d\xc1\xa8\ +\x05\xa3\x16\x0c\x01\x0bX\x08)\xf81U\xee\x1e\x90\x12\ +\x80r\x17\x03q)G\xf6\xa3_\xc4Z\xc0H('\ +\x03-\xf8\x00\xa4\xf8\xd1\x84\xdf#\xb1_\x01-\xd4 \ +\xdb\x078\x80 \x0e\xf6\x08ME\x84\x8a\xdb\x7f\x94Z\ +p\x9f\x12y\xc6\xd1\xfa`\xd4\x82Q\x0b\x18\x00\x02\x0c\ +\x00\xf9W\x19\x06L\x8eHS\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01+\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xe5IDAT8\x11c`\x18h\xc0\x88\xcd\x01\xaf\ +^\xbd\xca\x03\x8a\xc7\x01\xb1:\x10\x7f\x01\xe2-\xac\xac\ +\xac\xa5\x82\x82\x82\x1f\x80l\x14\x80\xd5\x80\x97/_\xfe\ +\x87\xaa\xfa\x09\xa4\xd9Al&&\xa6\xc5\xa2\xa2\xa2 \ +CQ\x00\x13\x0a\x0f\xcaadd\xcc\xe1\xe4\xe4\x14\x11\ +\x13\x13\xe3\x01\xb2\xdbA\xc2\xff\xfe\xfd\xf3\xc6\xa6\x96\x05\ +\x9b P\xe3T\x988\xd05g\xa1\xec\xbf01d\ +\x1a\xab\x0b`\x0a\xde\xbe}\xcb\x07tA\x11\x88\x0f\xa4\ +W\xc3\xc4\x89\xa2\x816\xbb\x01\x03\xf3\x09(<\x80x\ +\xef\xff\xff\xff\xb9\xb0i\xc4\xe9\x02\xa0\x8dN@M\xd2\ +@z\x12\xd0K\xae@\xfa\x1bI\x06\x00\x15?\x03j\ +\xfa\x0c\xa4\x8f\x01\xe9\x7f\xd84\xd3V\xec\xf5\xeb\xd7\xe9\ +\xc00x\x0c\xf4\x7f&>\x9bp\x86\x01\xd0\xffi@\ +,\x03t~:Y\x06\x005\xce\x06\xe2g@Cf\ +\xe13`\xe0\xe5\x00UCK\x04\x8a\x1c\xbcU\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x8b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x1a\x00\x00\x00\x19\x08\x06\x00\x00\x00/\xde>`\ +\x00\x00\x02RIDATH\x0d\xe5U\xb1n\xd4@\ +\x10\x9d\xb5\xb9(\x11G\x0e!\x8a\xd0\xd0 (@\x9c\ +8\x1d\xa0\x0bJ\xc4!\x1a\xf8\x00\x8aT\xd0\xe5\x03\xae\ +\x00\x8aH\x14D\x89\x14 \xca? (\xf3\x0b\x14\x8e\ +!\x08B\x00\x81\x84\x88D\x07\x0d\x1cg\x9f\xa5K\xec\ +[\x0f3+l\x1c\xb36v\x94\x0eK\xab\x9d}\xfb\ +\xde\x8cgv\xbc\x06\xf8\xef\x1f\xc7\xae_s\xac\xb3\xd7\ +\xcb\x16\xc2(#@\xbca\x82\xc4\x87\x80\xf0\x00\xb1}\ +\xa0\x8c\xb6T \xd7\xfe4\x8b\x00\xa7y\xb8\xd6\x8f\xd9\ +2\x81DQ2\xbej\xd6\xdcA\xb0\x85\x80GY#\ +@|\x1f\xaf\x1a'Ec\xb3W\xc4G\xe1\x8c\x9c\x9d\ +`.\x0a\xc2\x8e\xd9v=9W$\x08s\x0ae\xd4\ +[k\x9e\x10\xe8\x7fD\x84\x91\xa4c!\xc0\x07\xa3r\ +\xa6vic+\x89\xeb\xecb\x19\xa1\xbf\x94\x0e\xc2\xce\ +\x18C\x19,\xe9\x1c\xa7\xb1\x7ff\xd4\xb7\x1b\x97\xa5\x1c\ +>K\x0b\x93k\x13\xcc+\x87\xa67s9\xb9\x19!\ +\xde3d(\x97#\xa7\xd4\x00\xeb \x8c\xbb<\x94\xfd\ +{C\x8ap\x99\xb9\x11O7\xe7n\xf6\xed\xd5\x9bT\ +\x9fF,\x14\xf0\xe6\xf0\xd4\xdbE\x1et\xba\x1b1\x8e\ +x\xaeo\xad\xde\x8a\xd7\x1a#3\x10~hW1\x0c\ +\xe75\x1a-\x84\x10\xce\xb3F\xbbI`f \xb7\xf7\ +\xf36}\x98\xc7\xb2\x84i\x9c\xb8\x13n\xb7{'\x8d\ +Gkm\xa0\x81\xd5<\x8e\x88\x9d\x88T|\xc6\x0ek\ +u|m \x1f\x82\x05:\x9b1\x9d \x0f\xa3\xacF\ +}\x0c\x16u\x9c\xbf\xda\xdb\xb1\xea-\xca\xe6\xb9\x8eL\ +\x98GM\xd0U{\x08Gh\xd6\x9e\x89\x10b\xb26\ +\xf5\xeeE\xd2\x87.\xa3\xb8\x9d\x93De\x0b\xf1\x99\xee\ +\x9e\xa7j\xb0\x9d\xfdP\xbb\xe3\xae$v]\xf5\xf4\xaf\ +\x99A\x89\xad,=)\xd7k\xd3\xef\xd5\x81S\xe6\xe3\ +T\xaa?\xad\x9f\x10Q\x90\x96\xbbV\x9f!\xe8I\x04\ +\xc7\x19\xe1\x97\xf6(\x86\xa8\xadoD.3\xd3K,\ +\xa0=\x19\x9fs\x9c\x91\xf3\xb5\xdb\xa1\x92h;&\x0e\ +\x80p\x95\xfe\xae\x8f\xd5\x1a\xe1b\x8c\xeb\x0c\xf2\xe5J\ +\x8f;\xf7>o\xab:z//L\x0cw\xb6\xb9\xe6\ +\xda\xc3e\xe2\x1e\x1f\xaf26r\xea\xe0\xf9\xd7\xdfT\ +\xe9\x86\xc16\xdf\x00\xfb\x1d\x84\xdf\xad\x1a\x0c|u\xbb\ +\xa8\xd2\x99h<\x12\x15se\x8fo\x9d+\xc3\xa1\x94\ +\xb9\x84\xfd\xde\xfc\x05p\x81\xdb\xb65^J\xc8\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04\xcf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x01\x04}Jb\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x04dIDATHK\xc5\x97Kr\ +\xe2H\x10\x86u\x93\x89fn`\xaf@\x08\x90\xc4\xc3\ +\x80\xe0\x0c\xf6\xce\x07\xf5\x8a\xde\x19\xbf\xd7\x13\xeec\xd4\ +\xe4\x97Y)J\xa0\x98\x8e\xee\x98\x19g\xc4\x1f\xf5\xc8\ +G\xa5\x8a\xaa?\x8b\xacW\xea\xba\x0esA=\x9f\x07\ +\x9d\x98N\xa7\x01\xa1\xd5\x89|\x9c\x87<7\xe8DG\ +\xea\xb9\xf8\x8bo]\x83:\xa8\x7f\x8a\xcc}\x0dc\x8b\ +\xb1X,\x82b\x09\x96a\xa9\xe3\xa5\xce\xa9AU\x96\ +\xa1*+M\xa5\x94\xfe\xdb\xdb\x9b\xb4U(\xab\xca\x0c\ +\x8a\xa2\x08\xe0\xfd\xfd][\xa4\x98\xd8\x9c\x1a\x0c\x87\xc3\ +0\x1c\x8d\xc2H0\x1cI\x7fH\x7f\x18\xae\xae\xae{\ +\xbe\xe3\x5c\xda\x04\x05\x9a\x9c&jc5`\xc3|\xe3\ +h\xadoP\x03\xcdV\xb0\xdb\xed\xc2\xae\xd9\x85\x97\x97\ +\x97PI\xf6|\x8d\x1a\xe8\x0e\xcd\xa6a&\xed\xf1\xf8\ +\x146\xdb\x8d\x8cg\xa7\x9d\xf7O|||\x0c\x13i\ +7\x9bMX\xadV\xa7O\xecnm\x17jpu}\ +\xad{\xc0\xf7\xb3\x0f#\xd9\x03\xdf\x175@v\xbb}\ +\xb8\xbd\xbd\xfd%\xe0\x13\xdde\xaf\xd8\x82\xb9\xec\x8d`\ +.\xfb3_\xd8\x98s\xe1}\xd5\xb5s\xd6Fw\xd9\ +\xcbJ\xf6M\xb6F\xdb\xda~\xf4\xbd\xacPI\x9f-\ +\xabdo9\x00\x87\xef\x07\x19\xd7:\x8fmt\xcf\xb2\ +Y9\x0b3\xd9:C\x19f\xb2\xc7\xcdv\xab\x81\x9e\ +\x9f\x9e\xd4\x999\xd5a#\xf6\xa5 \xbag\xd9d2\ +\x09\x8a)\xedT\xfbl;\xa7k\x1b\x03\xad\xd7\xebV\ +\xe7mt\xcf\xb2\xf1x\x1cR\x1c\x0e\x87\xce\x18\xf0\xfb\ +\xdd\xdd\xdd%s\xf1wD\xf8yr~\xa2<\x82\xbe\ +#\xce\xa9~\x94w\xe6\xa2\xfbW\xcb\xb7\xc1\x9f\x9f}\ +\x07\xe5g\xc0\xcf\x03\xd8\x85\x93Kfl\x90\xc2\x98\xe1\ +\x02b\x8b_\x1b\xc0O\x16'\x12\x03\x1f\xa7\xf3v\x1a\ +M\xbf\x90\xd3\xd9\x09\x00\x8d\xcd\x95\xca\x8c\xce\xda[\xcd\ +\xbc8\xf9\x9c\xf6\x15u7\x80\x1eM=\x9e\x95\x9c\x81\ +\xefz\xf2\xfc\x18\xe3\x0c\x1b z\x8c\xf5hWg\x01\ +\xe4\x98BrU\x05\x01\x96\xe1\xf5\xf5U\xa9\x03\xdah\ +\xa2\xf3\xaei\x94Z\x94$\xc5\xb6\x13\xc0\xef@\x99\xdc\ +\x07\xb2x\x92{\x80p\x9cM\x17\xef\x83\xdc\x83n\x80\ +\xc8K\xf0\x90\xf6\x05[\xe1&\xe4x<\x1aG\xa1\x8f\ +6\xa0\x13\xa0\xbdL@.\x14\x17\x07i\x9a\xadfB\ +\x90\x8e\x8d\xa0\x13\xc0\x89\x0f>\x87\xf0\x10\xd2\xf6yn\ +%\xb7\xb3\xb5\x13t\x02\xa4\xb7\x8e\x1b\x873\xfd\x22\x99\ +?\xbf\xa1\x9d\x000\xe88eT/\x82b\x98\x16D\ +\xe0v\x9d\x00\xedun\xafl\xbc\xb6~uc?O\ +\xaes\x1a\xe0\x13\x9aFa\xd4M\xf9\x8a\xe5\xac\xa5p\ +\x03c\xf4\xd8\x8a\xdf\x0f\x0d\xf0\xaf\xc8\x1f\x83\xc1\x9aL\ +H\xeb\x7f\xc0'\xeb\xc5\xa5MP\xdc\xc8\xd9\xe1\xfa/\ +\x95\x16\xec\xa1\xb0\xe4\xc1 8=\x1e\x12zh\xe7]\ +g\xf6F!6\xc6\xce\xfcc\x1c\x19\xafon4\x91\ +\xb8\xb4\x09\x13\x14\xae6\xb8\x176m\x9dBN:\xa5\ +\x17\xfa\xee\x13\x0b\x9e\x8e/\xecc\x9c\x88\x0e\x15\xb90\ +A\x80K@KFA\xfd\xfa\xdfCo\x02V\x95\xfb\ +q\x7f\x7f\xaf\x17i\xbf\xdf\xf7\xeaS`\x83->}\ +z\xd0\x9b\x80\xf2\xa4\x03\xdaK\xc6\xf0)\xf4\x88@\x95\ +\x8cS\xbd\xdb\xa0\xfb'\x1bGo\x02p/\xe0\x09\xe1\ +\xfd\x13xN\x94a+\x9c\x0c\xb9!\xcf\xcf\xcfBv\ +\x8d\xc2\x93C\xc7\xf8\xdc\xdfbZ\x0c\xda\xde\x04\x8cr\ +\x8dv\x8d\xd3c;\xf5\xbe\x01\x1b\x9e\x91\x9e\x08\xa2\x0b\ +o\x9b\x96\xae\xf1\xc3\xce|S\x98\xae7\x01\xde;\xca\ +\xf5B\xd5\xce\xf9\x06\x19\xf3\x16\xe2\xdd$c\x9e8\xd0\ +\xbb-\xfc\xaeL\x8d0\x87N\xed5N\xf4\xd7w\x94\ +\xc7\x02I)pa\xa2\x90\x85\x0d\x85\xd6\x0bk\xad\x0f\ +Vr\x7f)\x09\x88>\xdad\xb1\xa2@W(\xfb{\ +\x22\xd8\xacnV\xad\xaf\xc6\xc4NJ\x88\x8e\xd3R\xe2\ +\xa2\x09\xc8c\x0d\x8c\xc5\x80\x87\x9b\x96\x0dj\x8f\xb4\x0f\ +\x0f\x0f\x1a\xfc\xe3\xe3C\x17v\xdd\xb8\x90\x92\x93\xb4\xe8\ +\xb0A\xf0\xb18\x16C\x11\xe3\xf5&@\x99qx\x09\ +\x1aK\xcbb\x94%k\xe3X\xfegi\x12\xd8)\xcc\ +F\xe75\x06\xad\xc1|\xcdO\xedE\xdf\x9b@\xae/\ +N3\xa0\xb5\x17(c+_\xa9\x8eVK[\xd4\x9d\ +\xfa\xb1\x8d\xa5O\xed\xd0G\x1f\xca$e\xb37\x01/\ +s'$c-\x83g\xb8\x98;\xf77\xf8?C\xff\ +\xb7\x08.\x12\x18\x0c\x06\x1b\x99\xfc\x81\xe2?\xc7\xb7\xc1\ +_\xac\x17\x97\xfej\xc9\xb2\xbf\x01\xf8\xec8\x97~\x9e_\xba\x95\xf8\ +\xc9\xe0\x97\x1f\xe4\xda\xfd\xc1\xf5\xe3\x5cz/\xbf\xb4K\ +\x5c\x1a\xfc\xf2W\xb9\xf6_\x13\xff{\xf0\xd9q.\xd9\ +\xab=\xdb{\x8f\x7f\xcd\x85\xff7\xf1u\xff\xc11\xdf\ +\xffC~\xeff\xe2\xdc\xe0\xf7\x0fr\xed\xde\xe0\xfaq\ +/]\xcd/^\x19\xfc\xb2g\x87\x8f?\x0f>;\xce\ +\xa5\xf7\xf3K\xf6\xfc\x8b\xc1/\xff\x9f\x5c\x93{8\xaf\ +\xe0?\xe5&\x5c\xfftp\xf3\x93\x5c\xbb=\xb8~\xdc\ +K\xbf\xcd/~\x9c\x90+-\xf0!\xa7\xe5v\x05\x7f\ +\x97\x9b>I\xfczp\xf3_r\x0d\x1f\xcf\x06\x9f\x1d\ +\xe7\xd2\x07\xf9%\xb5\xf8\xf7\x83_\xfe}\xae}6\xb8\ +~\xdcK\xbf\xca/\xdeH\xd8\x7f\x8f\xff\x91\x0b\x7f\xec\ +/\x1e\xf3=~\xf1\x8c\xef\x1eOs\x01\x1f\x7f\xed?\ +8\xe6{u\xf2\x9f\x13\xffq\xf0\xfb\xff\x9ck\xf6\xed\ +yV \x9f\xe5\xb5\xfc\xee\x81g|W\x80\x8fk\x89\ +\x0b\x83\x9b\xb7\xd4\xea?\xe5\xfbhS\x95\x8f\xad\xb4\x1a\ +\x0d{\x895\xad\xb6\xe7\xff\xe5\x97\x0a\xf8\x8eV/F\ +C\x90$G\xd5\x14\xad#\xa9G\xa6HH%H\x95\ +h&`\xede\xafy\xf9-\x0e\xf2\xea\xfe\xb7\xefN\ +\xfe\xe2|n\x19%\x1e\xc3\xfa4\xf1\xbfO\xbe\xe4\x8b\ +;\x16>F\xa6hMkWM\x91\x09\xe0cd\x8a\ +L`?Q\x05Q\x1a%\xde\xdfr\xfdNb\xc6\x14\ +\xaf\xe7~\x22\xd2\x83)\xca=9X\x01\xf1g0#\ +S$J\xf6]\x05\xd3R\x8cD\xaa\x85\x5c\xbe\x9b\x98\ +1\xc5\x8fr\xff\xc8\x14\x99!>\xaa\xa6\x88\x07|\xe0\ +\xa5\x07\x13\xb8\xdd_<\xc1{\xcf\xcf\xbeG\xa6x/\ +\xd7gLQ\xde\xc9\xbf\x1eL\x00\x1f3\xa6\x88\x8f\x91\ +)z~\xbfKT\xb5I}\xcb\xeb\x91)\xd2\xa5\x19\ +S\xbc\x98\xfb\xe9S\x0fu\x82\x8f-\xb4\xfa_\xb3\xee\ +VZ\xfd(ko\xa9\xd53\xa6HO_\xd2j\x02\ +\xbe\x14\x22R*8\x9b\x9b\xd6D\x8f\x90z\x88\x92\xbb\ +\x02\x85h\xd3\xbe\xa3\x07\x92\x1f\xf4\x17O\xf0\xfer~\ +\xf7j\xa2\x17\xbd%\xf1\xfet\x82\xb5\xda_=\x937\ +\xf8\xf8U{\xf1\xf0\xb5\x87\xf7\xdf\x13U\xd1;j2\ +:\xc8\xba\xfb\x89j\x91_\xc8\xbd{\x89^\xf4\x98\x22\ +#'\xaa\x15\xc81b\xfa\x9b\xc1\xcdL\xf1\xbf%\x9e\ +\x0e>;\xce%bgR4!\xf5x\x9c\x0b\xc4\xba\ +\xca\xc7\x87\xb9W\xc7\xde\x8b\x9e\xf5\x88\xc7\x1f\x12\x15\xe0\ +\xd7\xba\xd6\xef\xf1\x97\x5cP/x\xa9\x00\x0f\xf8\x18\x99\ +\xc0\x17\xb9\xce\xcc\xab\x0d\x19\x13\x97\xd7\x9eg\x8f\xcfs\ +\xc1\xfa\x15\xa8?y\xc7\x08z\xc8\x0b\xf5RmP5\ +\x097\x13\xa3\x86]}\xcbk\xf5^\xc1/s\x13m\ +R\xef=\xf0\xfc\xa8\xbfx\x82\xf7W\xf2\xbb\xf4\xa9\xd7\ +&:\x8a\x8fwZ\x1d\x12\x02\xcf\xce3\xac6\xa8\x9e\ +\x1dm\xfa\x8eVK\xf2\xff\x9a\xf8\xb7D\x05\x16\xfe8\ +\xc1\xc0z\xe8\x96$H\xd5\x14\x97I\xb17\xc5\xbf\x1d\ +\xae[-D\xfb\x5c3E<\xdcNT'#|\x12\ +\x8f\xef\x10\x9dk\xbai|\xcc\x98\xe2'\xb9_\xb1\xb7\ + \xd4\x0f\x13\x0f\x12U\x13 J\xbb\x04\xd1nA\xa8\ +\xef$\xaa\x89\xc7T$\xdeo\x12=\xac\x89\xeb\xaa)\ +\x9a\x88\xf012\xc5\x83\x5c\xbf\x9f\x90+\x15x~\xcc\ +\xcb\xfe[\xc8\xe5\xcf\x13\xd5&\x01\xbf\xd6=\x9f\xe8!\ +\xe7\xf0Q\xadEy\x81\x8f\x91)>\xce\xf5{\x89*\ +\x1f\xea[^\xcb\xef\x16\x84\xc9\x9e\xabM\x02\xe1\xdf%\ +\xe4_\x0fM$\xae\xabM\x82\x13\x15\xda42E\xda\ +\xb1\x9f\xb0\xff\x0aL\x17\xd6\xa6\x7f-4\x1d\xea\xe5\xcb\ +\xf6\xe2\x09^\xe3\xe3\xcaa\xf4\xb7\xe1\x01\x1fx\xa9\xc0\ +^\xedyM\xab\xe5\xc7\xf3\xca\xc2\xb9\xe7(\xad\xa6M\ +\xa2\x8a\xd7\xa1\xd5\x7f\x92\xe8\xd5B<\x9b{\xd7\x88\x96\ +\x18\x12D\xa2T\x80\xe8\x1b\x09\xdf\xd1Ba{\x80O\ +\xda\x8b'|M\x94\xae&$a\x8b\xbf\xe6\xcdg\x89\ +jw\x8aK|\xac\x99\xa2\xa4\xae\x16\xa2I\x11\x1f\xfd\ +\xf1\xd8\xbf\xe7\xda~\xe2 Q\xc5os\xe3.\xd1\x9b\ +\x22\x03\xc7G\xb5\x10\x99\xca\xf5\xc4\xc8\x14\x19\x0bA\xad\ +6\x09x\xb8\x99\xe8M\x00\x1f\x8a\xf0~\xa2\x0a\x93\xd1\ +G\x09\xfboA4\xecy\xc6\x14\xad;\x9a\x145\x09\ +\xf2\xe3i\xa2\x02\xa6(?\xd4M\x8fG\xb9\xa0fp\ +S\x01!\x95\xd7\xf2\xbb\x85\x5c\xc6\xc7\x8c)^\xca\xfd\ +\xa2\x07\x13\x90{\x1a\xb3\x0a\xce\xe5&M\xc2K\xc7c\ +\x87\x0b=\xc9\xcf\xbb\x89j\x93`Mk\x9fI\xb4\xa0\ +u\xd6\x9d1E\xa76\x8c\xa0\x07\x8d\xc6G\xb5I8\ +J\xab\x0d0\x9e\xe3VZ\xfd8kWq>7^\ +M\x9c\xb6V\xab\xed\xa3\xb4\xfav\x9f\xec\xc7\xfd\x07 \ +\xfaVbT\x88\x88\xbe\x93\xa8\x12\xfd\x8f\xb9W\xe2\xf9\ +\x8e\x16_\xe5\xcdL\xe2YK\xd2]I\xf4D/\x89\ +W5EEB\xf4\xb60\xc5\xa5;%~-\x146\ +>\x14z\x15\x0aq/\xd1\x9b\xa2&\xc1\x11E\xd5\x14\ +\xe5\x15>F\xa6\xf8/\xb9\xce\x04\x18M\x05\xcc\x90)\ +\xae5\x09\x8f*\x8b\x1e\xde\xc3\xb4Lt\x0a\xa7\x05\xc3\ +\xfa]\xe2O\xed\xc5\x13\xbc\xc6\xafuG\xa6hMk\ +?KT\xf0AnR\x8b}\x93`-\x0d\xc2\xc3D\ +\xd5\x145\x09\x9a\x9b^'\xec\xd53\xf4,+P\x7f\ +\xf2\xee\xc2\xe0\xe6\x7f\xcd5|TMQ\x9d\xc8\x8f\xd1\ +\xa4\x88\x8b\x07\x09\xb5S\xc1/s\x13AU\xef-\xe4\ +2s\xa9\xfe\x8d\xd5Zt\x89>\xe1\xa6\x05Mb\x8a\ +4\xaa\x02:\x8a\x8f\x9f\x0dn\x9e5\xc5\x1f\xacV\xf7\ +\x09?\xe0\xee;\x97$\x85\xe4\xd8\xc2\x14\xadi\xed\xde\ +\x14%2\xb3\xf5 \xab\xd0\x99\x8e\xba\x8fYS\xc4!\ +\xf1\xd8\xc2\x14M\x8a\xf8P\xec-\x08\x9d\x22\xff\xa2\xbd\ +x\xc2\xd7D\x898\x11\xed\x16\x04\x89\xe8UM\x91\xa9\ +0\x815S$zUSd\x86\xf8\xe8M1\x97^\ +L\xcd\x8f\xf2\xb3j\x02\xbaS|\xd8\x7f\x0b{\xc5\xc7\ +\x8c)Z\xd7\xfa=\x1c\x9f\xe2\xe3Y\xff\xc11\xdf\xcb\ +\x0bM\xe4\xc8\x14q!G\xaa|\x10=y\xddk\x84\ +\x06\x95\x09TMQ\xbe\xa9\xc3\x8b\x89\x1er\x8e\x09h\ +\xcc*0)\xca\x8f\x91)j gLqiP\xcf\ +t\x1b3\x00\xd0\xa6\xaa)2B\xa6(z,\x93s\ +\xd5\x14\xed\x15\x1fk\xa6h\xdf\xf6_\xc1QZ}7\ +\x0bV'g{\xd9R\xab?\xca\xfa\x1a\xbe\x1e\x9e\x9f\ +:\x97\xdf\xdfIz\xd7\x8e\x02\xc3B\xf4\xda9\xb5\x82\ +\x99!\xfaF\xee\x97\xdc-\x98\xe2\xbd\xc4\x8c)\x12\xa5\ +]B\x12\xb6P\x80\x0a\xb1:)\x12Q|le\x8a\ +\xf8\x18\x99\xe2~\xae\x1f$\xaap|J\xac{S$\ +\xd0\x84Z\xd7^\x01>\x88\xe9\x9a)J\xbc\xe7\x95\x85\ +s\x0f3\xc4\x87f\xa1\x05\xe1g\x00\xf7\xdb\x8b'|\ +\xadP\xf0a\xff-\xecUN;\xea\xac\x00\xbf\xd7\x12\ +#S|[\x8fO\x89i\xf58Y\xfd\xed\x12\x17\x13\ +=\x16\x13\x981EM\x02\x03\xeb\xf1$\x17\x885-\ +\xa9\xc0\x9a\xd6f4-h\x9dug\x8e\x93/\xe4\xfe\ +\xcb\xed\xa2\x87\xaf5\xa8\xb4\xa9j\x8a\xafS\xabgL\ +\xf1ui\xb5:\x7fa\x8a\xf8\xef\xbbA\xd7\xd6\x80\xe8\ +\x9b\x89\xb5\xeec\xc6\x14\x7f\xb0#\xf9\x1a\x99\xaf\xb8\xbe\ +t\xa7\xbd)*l\x85\xa8\xd0\xab J\xbbDo\x8a\ +K!V'E\xb9\xf4Qb\xcd\x14\x19n\xd5\x14\xdf\ +\xc6\xe3S&\xcb\x14\xdf\x1d\x9f\x86\x84@\xbe\xed\x12#\ +S\xfc1\x1e\x9fj\x12L\xce\x97\x12^\xb7xw|\ +\xda\xb2\xf1Ms03\xc0hhh\xd3\xb1\x07\x98\xe3\ +\x1a\xa3\x85MFk\xa6\xa8\x8b\xd4=U\xf0\x83\x1e\xc9\ +\x0b\x84\xbc\xea\xf8t\xc6\x14u\xa7\xbb\xc4\xc8\x14?\xcf\ +\xf5\xaa).&02\xc5e2\xaa\x9a\xe2\x96\xc7\xa7\ +L\x8by\xd9\x7f\x0b{\xc5\xc7\x9f\xda\x8b'x\xbd\x98\ +\xc0\xc8\x14O\xe3\xf8T-\xbeM\xc7\xa7\x8b\x09\x5c\x1c\ +p\xb8\xe5\xf1\xe9\x17\xf9\xbe\x07\x89\x99I\x11\xd7\xf4\xaf\ +\x05\xad\xa3y\xd5\xe3Sk]N\x8cLq\x99\x9c\xab\ +\x93\xa2\xbd\xda\xf3;\xad\x0e\x09\xc1\xd2\xb0\xbf\xf2\xf8\xf4\ +\x9b_\xff\xe6\x7f\x8fc\x8c\xefF\xf2\x96\xb1oDT\ +\xe2\x1d\xbb\xfbx\xf9\xf6#\xdf1E\xc7\x85\xfd\xa4\xe8\ +\xb8p?q\x90\xa8b\xcb\xe3S\xdd\x98\xf5{\xf8;\ +\x14\x83y\xd6\x7fp\xcc\xf7k\xc7\xa7n'x\xf7\x8f\ +\xb9\xce\xe8\xd7\x14\xca\x9a)\x12=\x86^\x01S\xb4\xee\ +\xe8\xf8\x94\xd1\x9a\x9c\x9f&*\x90\x17\xf2C3\xd9\xe3\ +Q.\xf8\x93\x83\x5c\xa9\xc0\x9fG\xe4u\xaf\x09\x8e\x97\ +\xf01s|\xba\x97\xfbG\xa6\xb8\x98\xc0\x8f\xf1\xf8\xf4\ +J8\xd10\xb4XNm\xaa\xa6\xb8\xb5V\x7f\x92\xcd\ +\x9ek7\x9c\xd7\x9a\x0ey\xf7\xa6\x1e\x9f^\xcf\xdeN\ +d\x8a\xf9\xfd\xef\x14\x81k-\x90\xa0\x10G\xdd\x07\x91\ +&N_'*8\xea\xf8T!\xce\xfcM\xf1r\xee\ +\x1f%\x9eB$L\x8e**8\x93\x9bN4\x92\x9f\ +\xe0K\xd6\x8eO\xf1+\xf1\x9e\x9c`\xad\xfeW\x89\xd2\ +.A\xb4[,\x85X\x9d\x14\x89(>F\x93\x22!\ +e\x8a\xcf\x13\x15\xc89I\xcd\x1c[\x10~|\xd6LQ.{\x86US\x5c\ +L\xe0b\xd6\xe8!\xe7\xd4b\xd5\x14\x99\x80\xfc\x18\x99\ +\xa2Zy\x90\xa8\x9a\x22\xbd\xfb8A\xffZhP\x99\ +\xc0\x8c)2\x81K\x89^\x9b\x98!\x13\xa0Q\x15\xd8\ ++mz\x1dZ=c\x8a\xb8\xf8\xbe\xb5Z\xc3.\xaf\ +\xbfJ\xac\x82\xd8\x8f\x80hc\xb3\xe3\x95\x1eL\xcb\xc2\ +\x12\xa5\x02\xa6\xf8\xb6\x8d\xe4K\xe2\xad\x99\x22A=\x92\ +\xe8#\x88z\xd5\xf1\xe9\xcc\xa4\xf8\xdb|/\xf3\x22\xda\ +-L\x02\x0aQ\xd7^\x81\xf5\x08\x93\xf5{\x10R|\ +\xf8\x8e\x0a\x98\xe1\x8d\xc4\xc8\x14\x09\x9e\xa8\x9a\x80\xe7w\ +-\xf1~\xa2\xc5\xf3\xbc!\xd43\x7fS\xb4\xee\xc8\x14\ +\xdf\xf4\xe3S\x82\xda\xeb\x80\x5cf\x02D\xa4\x02\xc2\xbf\ +\x97\x18\x99\xa2&A~TM\xf1l\xee\xa5\x1fNX\ +z\xa8\x15\xfb\xae\x9a\xa25\xad\xbdf\x8a\xb4\xaf\x82\xa5\ +I\xb8\x94\x9b{S\xc4\xc3\xac)\xda\xf3\xdb\xa6\xd5\x1a\ +\xd4]\xa2\xe7C\xc3\xae\x16\xab\x0d\xfb\xa9hu_\x10\ +\xd9\xcf\x8b\xa4\xf88?\xd7\x88\x96xUS\xd4\xe1y\ +\x88\x8e\x85ZH\xe4\xfb\x89\xc7\xed\xc5\x13\xbeF\xf4^\ +\xa2'\xfai\xae1\xf2\xeaH\x8e\xa3\xb5I\x91\xe8\xdd\ +ITM\xd1\xb1\x18>z\x13\xc0\xc7\xc1a\xe4G\x09\ +\x8b\x09\xfc]w7\xc3\x22LUSd*W\x12#\ +S\xb4&\xaegL\x11\x1f\x9a\x85\x1e\xf8\x981E\xc7\ +c\x9e\xa3\xfd\xb7`\x8a\xf6\xecYV\x80_\x93\xc0\xc8\ +\x14\xe5\x9c\xb5\xe5`\x05gs\x93Z\xd4L\xf6P+\ +\xfb\x89j\x93\xf0\x8f\xb9\xd7\xda\xbd\x06\xc8e5^\x9d\ +\x04\xd4\x1fC\xbc\x90\xe8a2\xc2\xc7\x16\xa6hR\xbc\ +\x97P;\x15\xe0\x18\x1f\xe7\xba\x9bi\x9dugOm\ +.e\x8d^\x9b\xf0\xa0\x16\xf1R\xc1\x99\xdcd\xcf[\ +h\xf5r\x8a\xb5\x95Vk${>\x16\xad\xae\x9a\xe2\ +\xa9iu_\x14\x0b\xd1D\xa4\x87nIR\xcf\x98\xe2\ +\xad\xdc\xdf'\x9eD\xb6n\xb5\x10s\xeb\x8b\xe3\x89]\ +~\xf6DK\xbcO\x133\xa6x=\xf73\x99\x1e\x8e\ +T\xec\x9b\xb0V \xf1\xf0\xf1\xd3\xeefBG\x98t\ +\xbfU\x10i\x89G\xb4[,\xdd\xd8\xccq!s\x19\ +\x99\xa2\xe3S\x9d\xde\x8c)\xe2\xa3o\x12r\xe9E\x93\ +\xb0\x9f\x9fU\x13\xb0\xdf\x91)*D\xc2d\xef\x15\xc8\ +\xb7\xbd\xc4\xc8\x04p\xfcY\xc2wT /4\x09\xa3\ +\xe31\xa68c\x02G\x1d\x9fz\x863\x93\xe2.\xf7\ +3\x81\x1e\xc4\x0e\x1fj\xb2\x02M\x02>\x18z\x0f\xa6\ +\xa5A\xad\x9a\x22\x8eo&|G\x0bZ\xa7\xc6\xab\x93\ +\xa2\xb5\xae\x1cF\xafM\xcc\x10\x1f\xb3\xa6\xf8}k5\ +\x9e\xf1]\x85\xa6I\xcd\xf4|\xc8\x0b|\xcc\x98\xe2\x9a\ +V\xcbgu~l\xadn\x8d\x91)J\xbc\xb5\xeeC\ +\x82TM\xf1\xa8\xe3\xd3\xfd\xac;c\x8a&\xc5]\xa2\ +'\x9a\x09 z+SD\xf4W\x89\x0a\x98\xe2\x8d\x04\ +\xf1kA\xf8\xef'fL\x91\xe8\x8dL\x91a\x11\xbd\ +\x19S\x94x[\x99\x22>F\xa6\xf8 \xd7E\xd5\x14\ +\x7f\x95{G\xa6\xa8H\xf013)\xee\xe5\xfe\x0b\x89\ +\x1e\xd6\xb4\xf6\xd3\xfe\x83c\xbe\x97\x17\xf8\x18M\x8a\x8f\ +r\x9d)V\xf9P\xdf\xf8hk?o_\xe4\xb2\x86\ +l\xc6\x14\xf1q\xd1b\x1d\x9c$\xe0c\xc6\x14\xf1\xf1\ +\xf3n]o\x89\xf4\x8c)Z\xd3\xd4\xd5\x9b\x22\x93\xc5\ +s\xd5\x14\xe9\xd1b\x8ay\xf9\x12\x16\x13\x981\xc5\xef\ +[\xab\xe5\xdb~b\xc6\x14i\xb5\x1c\xc1M\x8bE\xab\ +\xb70E\x03\xcc\x89\xb5z)\x8eeR\x5c3E\x89\ +W5\xc5W\x1d\x9f*\xf4*\x10\xcd\x04z\xa2\x09\x12\ +#\xdf\x82h\xa2\x87\x8f\xaa)\xae\x1d\x9fJ<\x06\xf0\ +0Q\xc52\x09\xfc]\xb7\xc0\xb3\xbc\x97\x1cUS|\ +?\xf7*\xf2\x91)\x12=k\xfb\x8e\x0a\x98\xa1\x22\xd7\ +,\xb4\xc0\x87\xdc\x981E\xdd43\xb7\xff\x16\xcf\xf3\ +F~x\x96\x15\xe0\xf7r\xe2\xc2\xe0f\x8d\x18>\xaa\ +\xa6H\xa0\xf112\xc5\xc7\xb9\xbe\x9f\xc0M\x05\xa6-\ +&\xb0\xd4\xfd\xb2\x86\x5cf\x8a\xd5\x06U\xfd]<\x8c\ +\xfcx\x09\xc4\x1f\x1fUS\xa4M\xf8X3E\xfb\xfe\ +[\xa2\x82\xe5\xf8\xb4oPi\xdd\xbd\xc4\x93\xca\xa2\x87\ +\xf7\x9c\xcfO9\xd2\x03\x0f\xf8\xa8\x9a\xa2g\xe7\x19\xae\ +i5>\xec\xbf\x025\x88\xeb\x0f\xba\x9b\xf1{?\xa1\ +\x1e\xabx\x1dZM\xef\xee$N\xac\xd5H>\x9b \ +\x1eD\xa4\x87n\x89\x80T\x89f\x8a\x8e\xc7\xce%Z\ + \xda\x86g\xba\x0f\x85\xb8\x97\xe8MQ\xe2}\x9a\xd8\ +bR\xd4M\xe3\xa3j\x02\x12\x0f\x1f}!\x12:\x09\ +M\xf8\xaaP\x88\xd7\x12\xbd)\xea\xc6~\x97\xa8\x9a\xa2\ +\xf5L\x18#S\xdc\xf2\xf8t?\xdf\xa9\x10\xab&`\ +\xbf\xf6\xdd\x9b\x22\xc3\x22Lo\xea\xf1)\xd1\xdb\xe2\xf8\ +\xf4\xd7Y\x17\x1fg\x12-\xe4\xb2Z\xd4YW\xa0\xfe\ +\xae&.\x0fn\xd6\x98~\x96P\x93\x15\xd0\x0d|0\ +\xf4\x1e\xb4\xc3\xbeiI\x05\xef\x8eO_f\xedui\ +\xb5\xfc\xd8b\x80\x99\xd2j\xc6H\xa8G\xdd\xe9\xac)\ +ZS\xf7\xd1\x9b\x22\xa1\xdbO\xcc\x98\xa2\x22T\x8c\xbd\ +)\x12=Doa\x8a\x84\x83\xa0\x9e\xb8\xfb\xc8=\xb0\ +tc#S\xbc\x9f\xcfgLq\xab\xe3S\xf9\xc1l\ +\xb72\xc5\x1bY\xdb\xc4\xd8\xe3a.\xcc\x98\xe2Q\xc7\ +\xa73\xa6\xa8I\xd8K\x8c&E\x8d\x87\xdc\x93\x83\x15\ +8I\xd0\xa0\x8ej\x11\x17\xf7\x12j\xa7\x02\xd3\x85\xb5\ +=\xcf\x16r\x19\x1f\xff\xd2^<\xc1k\xf5\xb7K\x5c\ +\x1a\xdc\xe3$ACV5E\x0d;\xfdX\x9b\x14g\ +L\xd1\x9a\x0c\xd7w\xb4`\xb2x\xa6}\x15\xe0\xe3J\ +\x82>y\xdd\x82&\xe1\xa3:)\x9e\xc9\xbd\xf6\xbc\xd5\ +\x00\xa3\x16\xb7\xd0j\x93\xe2^\xa2\xe7c\xd1\xea\xadL\ +Q^?OT\xf0\x1f\x15\xca\xa8\x10%\x86\xc4\xfb\xba\ +\xb2j\xeeYL`4\x92\xef\xe7s\x85^\x05\xa2%\ +\xdf\x88hdlA4S\xc4G\xd5\x14\x97\xe3S?\ +[\x10\xba\x07\x09FP\xc5\x96\xc7\xa7k\xa6\xb8\xf5\xf1\ +\xe9\xfd\x90Q5\x01\xc2\xc1\x04\xfaIQ\x91\xdcNT\ +'E\xa6H\xf0F\xa6\xb8\x88^\xd5\x14\xd5\xcb\xe8$\ +!\x97_4L\xfb\xf9Y\xe5\xc3\xb4EP{ST\ +\xdbw\x133\xa6\xc8\x10G\xa6\xf8o\xb9\xae\x16\xab\xa6\ +\xc8\x04\x8e2E\xfb\xfe[\xa2\x02z\x87\x8f\xbeA\xc5\ +\x07S|\x92\xa8Bn\xc8\x91^\x9b\xf00c\x8a\x9e\ +\x9d=\xaf\x99\xe2\x9d|f\xff\x15\xc8=\xa68\xd2j\ +u\xf8\xa8\xb2\xe8\xe1=G\x99\xe2\x8cV\xabm5\xee\ +\x14\xa4\xc7\xa2\xd5\xea\xbd\x02'\x09\xb7\xfab\xb1\xd0\xec\ +\xa4\xf8\xbaF\xf2O\xb3\xf7-&E#\xb9\x87X5\ +E\x89w3\xd1'\x1e\xa1S\xe0\x8f\x13U\x9c\xcf\x8d\ +\xcc\x8bh\xb7\xf8k\xde(\xc4\xea\xf1\xa9\xc4\xfb(\xb1\ +\xd5\xa4\xc8\x04F\x93\xe2~\xae+\xc4\xaa\x09\xd8\xaf}\ +\xdb\x7f\x8bgy\x83\x8f\xaa)\x12\xba\xbd\xc4\x85D\x8f\ +\xd9IQ~\xfc\xdf\x893\xfd\xc2yO\xa4\x89u\xd5\ +\x04\xd6\x8eO\x89\x86\x9c\x96\xdb\x15\xe0c\x97\x18\x99\xa2\ +\xc6\xf4\xb3D\xd5\x14M-D\x8f\xa1\xf7p\xca\xc4\x04\ +\xaa|,MS?)2\x95\xdb\x89\xea\xa4\x98[\xbf\ +\xfd\x0fmp\xd3\xc2\x84\x88\x8f7uRT\x8b8o\ +\x81_<\xe3\xbb\x8a\x8b\xb9q\x97\xe8\xb5I^\xe0C\ +\x9eT\xc0\xb3\xd6LqV\xab\x9d$\xe0\xe3'\xbd1\ +\xfe!\x17%H\xb5\xfbX\xba\xb1\x11\xd1\xfbYw\x86\ +\xe8\xcb\xb9\xffj\xa2O\xbc\xa7\xb9\x86\xe8\xadL\x91\xa0\ +\xce\x98\xa2\xcewd\x8a\xf7s\x9d\xf0U\xb1\xd5\xf1)\ +Sa\xb6[\x99\xe2\x8d\xac=2\xc5\x87\xb9>c\x8a\ +\xbf\xca\xfd#Sd\x02\xb3\xa6\x88\x8f-L\x11\x0f\xff\ +\x94\x18\x99\xa2\x86i\xc6\x14_u|\xfa&\x9a\x22\xc3\ +R/[\x1e\x9f\xf6\x5c\xd3\xba\xfdD\xd5\x14\xe9\xd1\x95\ +\x04}\xea\xb5i9IxSM\x11\xd7\xbdVkJ\ +i\xd3\x96Z\xbd\x95)\xceh5\xefza\x8a\xf9\xf9\ +\xd2\xf1\x8a\xe3\xb1\xbb\x89\xaa)\xfe_\xb9\x17\xd1\xbd\x09\ +\xe8>\xf6\x13D\xaf\x8aw\xc7\xa7/3\xb7\xe5\xf1)\ +s\x19\x99\xe2\xec\xf1\xa9\xbc\x90\x1f&\xa4\x16\x0aQn\ +(F\xaf+X&\x01\xa6\xdeBC\xa3\xd1\xabN\x8a\ +\xba]\x8272\xc5E\xf44f\x15\xfc47\xe9|\ +{a\xb2\x96\xe3\xcd\xfd\x84\xda\xa9\xe0\xa8\xe3\xd3;Y\ +p\xc6\x14/\xe5~\xd1\x83\xf8\x13\xa6\xea\xa4\xc8\xb0\x8e\ +2E\xdaT\xe5\xc3\xf1\xd8\xc7\x09\xdf\xd1\xc2z\x9a\x8f\ +'\xed\xc5\x13\xbe>\x9f\xdf\x1f\x99\x22\x1e\xf0Q5E\ +C\x8b=\xcb\xed\x1eL\xdcs\xfc\xba\xff\xe0\x98\xef\xd5\ +\xe0\x8d\xc4H\xab\xd5\xe1\xc11\xd7\x19\xfd\xdaVZ\xad\ +\xb6\xd5\xcb\xaf\x07_\xfa\xc7\x5c\xc3\x87z\xaf`\xf9\xfb\ +>\xce_`yA\xf4\xfe{Bw]\x01S\xe4\xb6\ +}\x91K<\x1b\x9e\xe9>\x8e\x1a\xc9\xdf\x1d\x9f\x86\xdc\ +Cl}|\xfay\xbe\xa7j\x02&#\xf9\xe1g\x8f\ +\xfd\x5cx\x94\xa8\x9a\x22\x13\x1fM\x8a\xcfr\x9d0U\ +MQ\xf7\xbf\x97\xb8\x90\xe8\xe1\xf8\xd4\xda8\xaf\x80)\ +\xe2\xa3o\x12\xace\xbf\xf2\xba*z&g\x02\xd2\x9b\ +\x80\xda\xf6\x0cgLq\x97\xfbG\xa6h\x02pjS\ +5E\xbaa\xcf\xa3\xe3\xd3/s\x9d)V\xf9X\x9a\ +\xa6\xb3Y\xa3\x85\xf5n'\xaa\x93\xa2\xb5\xae\x1c\x86\x5c\ +i\xc1\x0c\xf1Q5E\xcfn\xcd\x14gO\xf5\xdeV\ +\xadV\xe3#S\x94\xcf\xf2z\xc6\x14\xd5\xe2\x07\x89o\ +\xc1\x18\xff\x94\xf0\x10\x15N\x05\x88\xd6\xe9\xf5\xa6H\xe8\ +t\x1f3\xa6\xa8\x08w\x89>\xf1\xfcq\x9f0\xe9\xda\ ++\xf0\xefV\x88kD[{\x86h|\xbcDt\xde\ +\xe3\xe3A\xe2I\xa2\x0a\xfbu\xacg\x92i\xf1,o\ +\xec\x99`W\xa0\x1b\xb3.\x93\xe9A\xa8\xad\xed;*\ +\xc0\x03>F\xa6\xf80\xd7gL\x91\xe8\x8dLQ.\ +\xdb\xf3\x8c)\xe2\xe3B\xa2\x07\x8e\xd5\xcb\xd3\xfe\x83c\ +\xbeW'\xf8\x18\x99\xa2\x22\xb7\xef\xaa\x090\x16y\xdd\ +\x9b\xa2\xf5fM\xf1j\xd6P\x8f=fM\xf1l\x16\ +d\x02#S\xa4\x1dw\x12\x1a\xec\x0a~\x96\x9b\xf0\xe1\ +;ZXo?Q5Ezt9\xc1\x18{mb\ +\x863\xa6H\x9b\xd6L\xd1~o'\xaa\xf9\xf1:\xb4\ +Z\x9d\xe0\xa3\xaa\xd5\xb4iK\xad\xbe\x91\xf5{\xad~\ +q\x94\xfa\xdf\xf2A5\xf1\x10=ZxI<\xa2W\ +\xc5\x87\xb9Q1\xf6\x89\xb7%\xd1Fr\x897c\x8a\ +\xf8X\xfb\xafO\x1f\xe4\xb3*\x8e:>\xb5\xe7\x19S\ +d.#St\xa4g\xed\x19S\xc4\x87\xf6\x13\xea\xb1\x8a\ +\xa3\xb4ZC\xa6y\xaa@m\xab\xf1_\x0fn\xdeR\ +\xab\x1f{\x10\x88\xa9@2\xdb\xf4\xb9\xeef\xeby\x80\ +\xb3\x93\x22S$R-$\x9ec\xa6j\xf7\xe1\xdf\xcb\ +\x04FD\x13\x0e\x0f\xf1\xabD\x05\xcc\xf0V\xa2O<\ +\xc2\x7f7\xf18Q\x85B4\xc1\xf4|,M\xc2\x16\ +\xa6\xc8X\x88\x1e\xa3\xa9\xc0\x84\x88\x8f\xd1\xa4\xb8\x9f\xeb\ +\x0a\xb1j\x8aL\xdcs\xecM\x91\x81\xdb\xf3\x8c)\xee\ +\xe5\xfe\x0b\x89\x1e8\xb6\xf6_\xfb\x0f\x8e\xf9\xfe\xa8\xe3\ +S\x0d\xc2A\xa2Z\x8b\xbf\xca\xbdjQ~\xb7\xf0\xec\ +\xe4\xf4\x8c)\xeer\xff\xc5D\x8f\xd9I\x91n\x5cO\ +\xac\x99\xe2\x8c\x09\xf8\x0f\x8f\xf0\xd1\x9b\xa2\xda\xb6nu\ +R\xcc\xad\x9b\x1e\x9f\xe2c\xcd\x14=\xc7\xaa)n\xa9\ +\xd5rc\x97\xe8\xb5ii\x12\xaa\xa6(\x97_\x87V\ +\xdf\xcb\xf7>\xea\x0b)\xd7\x8e\x05\x13\xc0\xc8\x14\x09\x9d\ +\x22\x9f5\xc5]\xd6x/\xd1b\xf6\xf8\x94\x88\x22\xda\ +\xe4\xd5\xe34Lq\xd4\x8d\xe1\xe3A\xe2I\xff\x85'\ +xO\xa4\xf7\x12}\xe2=\xcb5B]5E\xeb]\ +K0\x99\x1e\xb3\xa6\xa89\xd0\xf9\x8eL\xf1a\xae\xcf\ +\x98\x22\xe1\xb0o\xcf\xb3\xc5\xf3\xbc\xc1\xc7\x8c)\xeer\ +?\xbe{\xe0\xd8$\xa0\x11\xa9\x80\x09\xe0ct|\xaa\ +a\xc2I\xb5I z\x04\xb5\xafe&@LgL\ +\xf1j\xee7=\xf7\x985E\x86E?\xec\xbd\x07\xed\ +\xd0HVM\xe0g\xb9wd\x8a\x9a\x8e\xdb\x09\x93W\ +\x05\xf4\xe8r\xe2J\xa2\xd7&\x13\xa2\xfc\x98\x99\x14\xed\ +y\x0bS\xdcZ\xab\xe5H\xafM\x8bVWMQm\ +\x7f\x94\xd8J\xab\xd5\xe2h\x80y\x90\xeb\xea\xf1;\xc5\ +\xe4\xda\xab\x80h&\xa0\xd8[H\xbc\xfd\x04\xd1\xab\xe2\ +\xa8\x91\x9c\xe8\xcd\x10-\xf1F\x93\xe22\x92\x13\xd6\x0a\ +L\x8a\xf8\xf0\xb3\xc5b\x8a\xc8\xaeBb\xac\x99\xa2\x22\ +\xf7\xf7\xe1\x0a\x96\xc4\x1b\x99\xe2V\xc7\xa7\xf6\xc9\x00\xee\ +'\xaa&@8<\xc7\x91\x09\xe0c\xc6\x14\x99\xed\xf9\ +D\x8f\xd9\xe3Su\x22?\x08v\x0fEx/Q\xe5\ +\x83\xb1(\xf23\x89\x16L\xe5Nb\xc6\x14M\x02\x8c\ +\xa0\xc7\x22z&\x82\x0a\xf0\xe1\x19\x8eL\xf1\xcb\x5c\x9f\ +5E|\x9cM\xb4\xa0M\xd6\xad\x9a\xa2\xb5\xe4\xc6\x95\ +Do\x8ax\xa0M3\xa6h\xcfk\xa6(\xaf=\xcf\ +\x0a\x96\xe3S\x9c\xb7\xc0\xc7~\xe2Q{\xf1\x84\xaf\x17\ +\xad\xeeMQ\xf38\xab\xd5\x1a\xbd\xa3Lqs\xad\xee\ +\x05\xe6U\xdcHfI=\x22Z!\xceN\x8aW\xb3\ +FO\xb4\xc4\xfb\xb1\x1e\x9f\x8eL\xd1Q\x9e\xc4\xfbs\ +\xa2\x82\xa3L\x91\xb1X\xbb\x9ax&\xc4\x9b\x89\xbeI\ +\xc8\xa5\x17\x85x\x90\x9fU\x13`\xe2\xcc\xab\xcf\xd9g\ +\xb9f\xcf3\xa6\x88\xe7\x91)\xe2\xd8\xda8\xaf\xe0\xa7\ +\xb9\xc9q\xf2hR\xd4 \xe0\x83HU\xe0\xf8\xf4z\ +\xa27E\xcf\xee\xf3\xc4\x8c)\xeer\xff\xc5D\x0f\x8d\ +\xe9g\x89\x19S\x94\x1f\xfe?c=\x98\x22\x0d\xa9\x9a\ +\xc0\xdbx|\xca\xc0MFG\x99\xe2W\xf9\xbc\x82-\ +\xb5Zn\xec\x12#\xad\x96\x1f\xf2\xa4\x02\xb5\x8d\x8f5\ +ST\x8bU>h\x92Z\xfc \xd1\x82\x1e\xddK\xbc\ +\xd4$\xf4\x22\xd3\xde\xd0\xbf>j$\x7f\x90_\xde\xc2\ +\x14\x97\xee\xb4\xfa7\xc5\xc5\x04\xd6\x88& 3D\xeb\ +\xf4FD?\xcc\xf5'\x89*.\xe4\xc6\x91)>\xcf\ +u{\xae\x9a\xa2Df.L\xa6\x87\xe9S\xe2\xf9\x8e\ +\x0a\xf0\x80\x8f\x91)2\x00Q5E\xa2g\xdf}\xbe\ +.|\xcc\x98\xe2.\xeb\xe2\xbb\x87\xff\x0b\x13>\xaa\xa6\ +\xa8y\xc4\xc7\xc8\x14\x1f\xe7\xba\x1c\xa9\xf2A\xf4\xae'\ +zSd*&\x8c\x19S\xbc\x9a\xfb/%z,\x93\ +s\xd5\x14\xcffAM\xf5\x16\xa6h\x1a\xb7\xb6\xefh\ +\xa1\xe9`\xb63\x7fS\xbc\x9c\xfbG\x93\xa2\x09Q~\ +\xccL\x8a\x9e\xe1\x16\xa6\xb8\xa5V_\xcc\x9ew\x09Z\ +\xd2\x82V\xd3\xa6\xaa)\x1e\xa5\xd5N\xb1\xac}\xdaZ\ +\x9d%_\xd4\xa1z|\x09\xbd\xd0\xbc\xf4a\xf3\x06\xd1\ +7\x12\x8a\xbd\x85\xc2\xbe\x97x\xc9m\xdb_8\xc6\xeb\ +\x0f\xf3;\x8a\xb1'\xfa4Fr\xc52:>%\x1c\ +\x88~\x9e\xa8\x80\xf8\xe3\xa37\x01|<8\x8c\xfc(\ +\x81\x89\x8fL\xf1Y\xae\x13\xbd\xea\xf1)~\x15\xe2\xc8\ +\x14\x97I\xd1wT\xc0\x14\xf1!Oz\x1c\xe4\xc2~\ +\x027\x15,\x93Q\x9f\xab\x9e\x1d\xd1S4\x15\xe0\x03\ +\xcf\x17\x0673\x01\x9d\xef\x8c)\xe2\x83`\xf7P\x84\ +w\x13U>\x98\xe2'\x893\x89\x16L\x11\x1f\xfe4\ +P\xc1{\xb9\xe9b\x82\x11\xf4 z\xf8\xf0\xb3\x02\x86\ +e\xcf\xf6\xde\xe3\xcb\x5c\x90\xd7\xd5\xc9\x19\xc7\xd6\xf6\x1d\ +-\xac\x87\xe7\x19S\x94\x1b\xb4\x097-4\x07\xbfK\ +T\x1bv\xb9l\xcf[\x98\xe2\xda\xf1\xa9|\xbb\x97\x98\ +\xd5\xea]\xd6\xd8B\xabi\x13\xed\xeb\xf1Z\xb4\xba\x17\ +\x9b~S\xdeKf\x06s\xce\x9b\x06\xdc\x1b\xd1[L\ +\x8a\x12\xef\xd3\xc4L\xe2}\x94\xfb\xd7LQR\xcft\ +\x1f\xb7r?3h!\xf1\x14\xe2\xe3\xf6\xe2\x09_\x9f\ +\xcf\xef\x8fL\x91@\xdb\xf3\x9fO\xb8\xde\xf2\xebK7\ +\xb6f\x8aD\xaf\xda$\xbc\xcd\xc7\xa7\x84\xaf\x07\x8e?\ +OTM\xf1\xa8\xe3SM\xd3\xcc\xa4\xb84\x09\xbd)\ +zv\xf6LD* \xfc\xbb\xc4\xc5\xc1\xcd&\x00\xb9\ +W5E\xba\xf1\xaa\xe3\xd3\xaa)\xbe;>}\xf9\x81\ +\xadi\xb5\xa6\x896m\xa5\xd5\xf4\xa3:)\xf2 Z\ +\xbdf\x8a[i\xf5\x91M\xc2\xab\x8c\xd1\x0402E\ +&0k\x8a\x8ap\x97P\x94-\x98\x22\xa2\xab\xa6\xb8\ +\x98\xc0\x1a\xd1\x04d\xc6\x14uz#S$xO\x12\ +U0\xc5k\x89\xbe\x1b#\xd0\xf6\x5c5E\xebYw\ +d\x8a\xa7q|*?\xfa\xc99\x97^\x1c\x9d\x1e\xe4\ +\xa7\x5c\xa9\xc0~\xed\xbb\xcfQ\xcf\x0e\x1f\xa6\xdc\x0a\x16\ +\x13\x18\x99\xe2i\x1c\x9f\xe2\xe3\xa8\xe3\xd3\xaa\x09\x10\xbd\ +\xeb\x89\xde\x14\x89\xde\xed\xc4\x8c)^\xcd\xfd\x97\x12=\ +\xd4\xe0\x8c)\x9a\xe2\xf0\xb1v|J\xac\xed\xbf\x02\x93\ +\xa2\xb5}G\x0b\xfc\xdeI\xccL\x8a\x97s\xff\x95D\ +\xafM\xa7q|\xca\x0448=\xfe\x90\x0b\x9e\xa3\xfc\ +\xae\xe0(\xad\xc6\xf3\x8c)\xd2j9\xd2k\x13\xad\x96\ +\x1fUS\x10M<\x8e\ +2\xc5\xe7\xf9\xbc\x82\xd7u|*\xf1fLQ!\xe2\ +\xbb\x07ca0\xcf\xfa\x0f\x8e\xf9^s ?\xe4I\ +\x8f\x83\x5c\xd8O\xc8\x95\x0a\x08\x87}{\x9e-\x88\x06\ +\xf1\xd8\xe2\xf8T\x93\x80\x8f\xea\xa4\xa8N\xf0A\xb0{\ +8EP3D\xbb\x82e\x12\x18\x99\x22\x13\x989>\ +\xdd\xcb\xfd\x84\xaf\x87\x09Q-\xfaY\x01\xc3\xfa$a\ +\xef=\xbe\xcc\x05\xfb\xfe\xba\xff\xe0\x98\xefqlm\xdf\ +\xd1\x02\xbfL`\xc6\x14/\xe4\xfe\xab\x89^\x9b\xe4\x85\ +Z\xac6\xec\xf6J\x9b^\xc7\xf1\xe9ihuo\x8a\ +o\xb2V;\xc5R\x8b}\xc3N\x8f\x1e\x1cF~\xac\ +c\xcd\x18\x97BT\xec-$\xf2l\xf7q)kH\ +\xbc\x9eh\xdd\xc7\xa7\x89j\xe2\x11\x8dk\x895S\x94\ +\xd4\xd5nl\xe9NG\x93\x22>\x1e'\xaa8\x9f\x1b\ +\x89So\x02\x0a\x910\x99b*\xb0\x1es\x19M\x8a\ +L\xd1\xda\xd5&a\xed\xf8T\xe2\xed'\x1e%\xbc\xae\ +`\x99\x14{>\x18\xb8gh\xef\x15\xc87<_\x18\ +\xdc\xac\xf1\xc0\x87\xef\xa8@^\xdcL\x8c&E\x85\xf8\ +0A\xb4+\xd0$\x10\xd4\xde\x14=;F>3)\ +\xeer\xff\xc8\x14\xb7<>\xd54\xe1\xa4j\x8aG\x1d\ +\x9fj\x9aL^U\x5c\xc9\x8d\xa27E\x93\xa2\xfc\xf0\ +\xb3\x02\xa6H\xa8\x7f>\xb8yvR|]Z\x8d\x8f\ +\xea\xa4\xf8*\xad\x96\xd7\xf2\xbb\x82\xa3\xb4\xfa^\x16\xa4\ +M\xaf\xc4\xc8\x18\xb7\x1e\xc9w\xd9U\x9fx\xcbH^\ +5E\x22\xbaf\x8a\xa71\x92\x7f\x9c\xf5G\xa6\xa8\xc8\ +\x9f$\xaa8\x9f\x1b\xed\xfb\xef\xba\x05\x98\xa2\xe4\xa8\x9a\ +\xa2\xf5\xac;2\xc5-\x8fO5\x08\x12o\xd6\x14\xfb\ +\xbc\xd4\xd0\xe0\xa3j\x8a\xf2m\x97\x18\x99\xe2r|Z\ +5E\xcd\xe3\xf5\xc4\xc8\x14\xe5\xc6\x8c)\x12Rk\x13\ +\x92\x16L\x85\x09\xcc\x98\x22\x03\xb8\xd4.z\xf8Z\x0d\ +\xfe.13)\xaa\x97\xb5\xe3\xd3\xfb\xf9\xac\xda$,\ +\xa2\xc7hZX\xefnb\xc6\x14/\xe7~\x9c\xf4\xda\ +\x84\x07|TMQ.\x7f\x94\xd8\xc2\x14i\xb5\xfc\x90\ +\x83-\xd4\x1f>f&\xc5\x8b\xb9\x7f\x97\xe8\xf9X\xb4\ +\xbaj\x8a\xc7\xd1\xea\xaa)\x9a\x10GZ\x9d\xcb/\xfe\ +\xb4s\xec\x01\xc6Ck\x81\xe8\x1b\x89\x11\xd1\xfb\xb9>\ +C\xf4\x87\xb9\x7f\x97\xe8\x89~\x9ak3\xdd\x07\xa2%\ +\xc7\xda\xa4HPg\x88\xc6\xc7\xc8\x14\x1f\xe4:\xd1\xab\ +\x9a\x80\xfd\xee%zS\xb4W\x85h\x8a\xa9\xc0z\x0a\ +\x11\xdf=\x18\x8b\xb5\x9f\xf5\x1f\x1c\xf3=\x1e\xf0!O\ +z\x1c\xe4\xc2~\xa2\xca\x87#&f\xde\xe7$S\xbc\ +\x93\xd8\xe2\xf8\x14\xc7\xf8\xd0\x88T\xa0N\xf0A\xb0{\ +(B\xe2T\xe5c\x99\x04F\xa6\x88\x8f\x99\xe3\xd3]\ +\xee\x1f\x99\x22\x13P\x8b~V\xc0\xb0>I\xd8{\x8f\ +/s\xc1\xbe\xff\xd6\x7fp\xcc\xf78\xb6\xb6\xefha\ +=<[\xbf\x02z\xa4V\xae&zm\x92\x17\xf8\xa8\ +6\xec\x9e\x1d\xa1\x96\xdb=f'E\x8d\x98\xdc\xfbi\ +\xb7\xb0|\xdbO\xcch\xb5\x86z\x97\xe8\xf9\xf8\xd1h\ +u+BK!*\xf6\x16_\xe7\x8d\xc4\x9b!Z\x11\ +J\xbc\xde\x04\x96B\x9cI\xc8\xf5\ +\x99\xa6\xe9\xd7\xb9_s\xd3\x9b\xa2\x5c\xfe<13)\ +\xeer\xff\xc8\x14\xe5\x9c\xb5\xab\xa6H7\xf01\x9a\x14\ +5M8\xa1%\x15\xfc\x2271\x98\xde\x14\xbf\xca5\ +5>3)^\xc9\xfd\xf8\xe8M\xe0\xdd\xf1iHi\ + /4\x91\xd5IQ.\xab\xf1\x91V\xcbg\xb9'\ +\xbf+8u\xad^\x8c\xd1\x04p=\xd1\x9b\x22\xa1\x9b\ +5E\xa242E#92\xaa\xa6\xb8\x98\xc0\x88h\ +\xd3\x85\x82\xa9\x12\xbd6\x92\xe3C\x91?IT\xc1\xb4\ +F\xa6\xa8\x1b\xc3G\xd5\x14\x17\x13\x18\x99\x22\x13\x90\xd4\ +3&@\x98zS\xcc\xa5\x17\x0d\xc2\xa3\xfc\xac\x9a\xa2\ +\xe7\xa7`\x96\x5c\xcc\xcb\x17\xb0W|TM\x91\xd0\xed\ +\x12\xf2\xaf\xc7b\x02U>\xd4\x89z\x19\x99\xa2\xdc`\ +\x8a\x7fKT\xf0\xf3\xdc42E\xa6b\xe2\x9a1\xc5\ +\xc5\x04\xfa}\xa9A\x5c\x13\xbf\x0a\x18\x16>F\xa6h\ +\x92\xbb\x9f\xa8\xf2a\xcd\x91)Z\xefnb\xc6\x14\x19\ +\xe2\xe5\x84\x5ci\x81\x87\xdf%\xb6:>\xf5\x1c\xbfj\ +\xbf\xf0\x04\xaf\xe5\x1c\xaeGZ}/\xd7g\x06\x18\xb5\ +r\x94VWM\xf1UZ-\xf7\x9e'*\xd8D\xab\ +\x89\xd1\x92x?\xedvE\xe8\xf6\x133D\x9b\x04\xf6\ +\x12D\xbb\x05\x13\x90xU\x13\xb0o\xe212\xc5\xd9\ +\xee\x03\xd17\x12\xa3I\xf1A\xae\x13\xbdY\x13\x90(\ +-\x08\xb4\xe9\xc5\xd1^\x05\xf8\xc5\xc7\xc8\x14g'E\ +y\x81\x0f\xcdS\x8f\x83\x5c\xd8OT\xf9p\xc4d\xdf\ +\x9eg\x0b\xa2!?\xec\xbd\x02|\xec\x12\x17\x077\xe3\ +\xd8\xda\x7f\x1d|v\x9cK\xe7\xf2K\xf8\xd0\xa5\xf6p\ +\x8a@\xac\xab|,\xa76\xba\xeb\x16Lq\xc6\x04\x08\ +\xff.\xc1\x08z\x10;|\xcc\x98\xe2'\xb9\xdf\xde{\ +0E&\xc0\xc4*\xc0\xb1\xb5\x19o\x0b\xeb\xe1\xc3\xfa\ +\x15\xe0C\xad\xec\x12^\xb7\x90\x17j\xb1\xda\xb0{v\ +\xd7\x13\xbfJ\xf4`\xe2\xb7\x133\xa6(\xf7\xd6\xb4\xfa\ +I\xff\x85'x\xbf\x95V\xd3:|\x8c\xb4\xda\x00#\ +\xf7\xaa\xa6\xa8Q\xc7\xc7\xa9k5A\xba\x998\x97h\ +!\xf1\x98\xc0A{\xf1\x84\xaf\x97\xe31\x22\xd5\xe2Y\ +\xde\xe8\x10\xaa\xa6\x88hb:\x22\x9a\xe8I\xbc\x19\xa2\ +\x15\x22slA\xe8p\xf10Q\x15=\x85r-a\ +\xff-\xec\xd5\x9e\xed\xbd\x02\xfc^I\x8cL\x91\xe8Y\ +\x1b\xe7\x15H<\xdd\xfa\xc8\x14\x1f\xe5\xfa\xfdD\x95\x8f\ +_\xe4^\x05#\x07[\x10\x0dbZ5EBw)\ +q1\xd1\xc3\x04 \xf7\xaa\xa6H\xa0\xe5\xc7\xc8\x14\x89\ +\xd2~\xa2\xca\x87\xe3\xd3\xbdD_\x8b\x8b)V\x1bT\ +|\xe0b\xc4\x073\x9c1E& ?\xd6L\x91y\ +\xd9\x7f\x05r\xce\xda\xbd\x09\xd0\xa6\xfd\x04\xbe\xabP+\ +\xb8\xc6M\x0by!?\xaa\xa6(\x97\xe5\xf4\x9a)\xca\ +k\xf9]\x81IQ\xee\xf5\xa76o\xbaV\xd3\xa6\x91\ +V/\xa76\xcf+d\x1c\xf2p#?\xb7\xd0\xea\xdf\ +x\x90}!*l\x09=\x93x\x17r\xbf\xc4\xebM\ +\xd1\xf1\xa9B\x9c1E\x897\x22Z\xf7!\xa9\xab&\ +\x80\xe0[\x89Q\xf7q/\xd7\x1f'\xaa\xa2\xa7\x10G\ +\xa6\xb8L\xce\xd5\xe3B\xfcZ\xf7|\xa2\x875u\xbe\ +U>\xf0\xa0i\xea\x13/\x97^\xfc\x97\xa78\xa9\xf2\ +\xe1\xf9in\xe4_\x0b{\xf5\x0c=\xcb\x0a\x08\x9d\xbc\ +\xbb8\xb8Y\xce\xe1\xa3j\x8a\xea\x8409\xea\xec\xa1\ +V\xd4\x0c\x91\xaa\xc0~\xed\xdb\xfe[0\x15|\xfc\xa1\ +\xbdx\xc2\xd7\x84I\xf4 \xfe\xf8`\x8e\x15\x9c\xcdM\ +\x8cK\x83\xd3\xe3\xf7\xb9\xc0\x04\xaa\xa6\xe8\x14K-\xfa\ +\x8e\x16\xf8\xd5\xe8}\xd9^<\xe1kM\xd3.\xd1s\ +\x8d\x07|\xcc\x98\x22>F\xa6\xf8\xc7\x5c\xf7\x1c\xab|\ +0E|\xf4M\x82\xfa\xbb\x9b\xd8B\xab\xd5\x09>~\ +lZ}5\xff\xe6+\xbd0!z?1C\xf4V\ +#\xb9\xbd\xaeM\x8a\xb3#9\xf1\xbf\x91`\x06-\xf0\ +\xf1 \xf1\xa8\xbdx\xc2\xd7&\x81\x91)>\xcfuM\ +\xc2V\xa6h\xed\x19S\xc4\xc7\xc8\x14\x0fr}?\x81\ +\x9b\x0a\xb6:>%t{\x09&\xd3\xc34\x8e\x8f\x19\ +S\xc4\xc7hR\xd40\xddK\x10\xed\x0a\x96\x93\x95\xfe\ +^\x22J\xf4\xaa\xa6\x88\x8f\xab\x89\xcb\x89\x1e\xb3\xc7\xa7\ +g\xb2\xa0&amR\xbc\x93\xcf\xaa&\x80c\x063\ +2E\xd6\x8eO\xf7\xf3\x19\ +n*0]\x5cO(\x9c\x16\x8e\x97\x88\xc7\xcc\xf1)\ +>.\xb6\x8b\x1e\xbe\xde\xfa\xf8\x94XWM\x91\xb10\ +\x81\x11\xac\xfb\xc5\xe8\x83c\x5c[\x8a\xdct\xd4\xc3d\ +$?\xaa\x93\xe2Q\xa6hRd\xe6U\x13X\x8eO\ +\xfb\x06\x15\xbf\xfb\x89\xc7\x89*>\xcc\x8dDod\x8a\ +\xf8\xd8\xca\x14\xefdm\xf9]\xc1b\x8a4\xaa\x05>\ +\x98\xc0\xdb\xa6\xd5\xf4\x1f\xd7\xcf\x13\x15,\xa6\xb8\x85V\ +\xff&\x1b\xda[6\xd5\x0a\x14\x03\x981\x81\x0b\x87\x0b\ +\xf7\xa6\xb8tc3\xa6HLm\xbc\xc7\xbb\xe3\xd3\x97\ +\x19a\xb4&\xa3\x19S\xbc\x95\xfb\xfb\xc4\xf3-D\x89\ +XWM\xd1\xf3\xd3$\xb49\x97\xb7/\xa6Z\xc5\xf2\ +\xa6\x1e\x9f2\xae\xd1\xf1)\xd3b\x02D\xaa\x02M\x93\ +\xbc\xee\x85\xdaZx\x9e\x99\x04\x18\x80F\xa1_\x9b\xf8\ +\x9b\x04\xaa\xa6x6\xf7\xe2C\x83\xd3\x83)jn\xaa\ +\xa6\xf8\xee\xf8\xf4eF\xdf\x1d\x9f\xbe\xcc\x07M\xba\x99\ +\xe8\x9b\x04\xbf\xa5^\xe8SU\x9b\x0ct\xb4\xe9[,\ +\x22\xa5\x08\xef'f\x16\xe6\xb6\xbd)\x12h\x85X5\ +E\xfb\xb3\xe15Sd\x02\xb3\xddG\xdf\x9df\xc9\x17\ +\xdd\xd8\x0c\xd1\xaf\xf3\xf8\xb4j\x8a\x8ejn$F\xa6\ +x\x90\xeb3\xf9\xf1:\x8eO\xe5\x9c\xdc{\x13\x8fO\ +M\x8aL\xd1\xf4\xd5Cs\x8a\xef\x0a\x18\xe1\xd5\x04S\ +\xec\xf1\xee\xf8\xf4eF\x96\x86}\x8bI\xf1\x8f\xf9*\ +\xcd^\xb5IX&E5\xd9\x82>\xef'f\x9a&\ +Z:\xd2j\xa7z3Z\xfd~\xee\x97\xd3[i\xf5\ +'Y{d\x8a&\xe7Y\xad\xe61\xf6\xff-~\x92\ +W\x8f\x12:\xdf*^\xc7\xf1\xe9?g\xb3\xba\xd3Y\ +S\xecM@\xe2\x11&dWa\x12\xf8\x0e\xd1\xb9f\ +\xaf\x8a\xe5m:>\xc5\x87\xa4\xdbOx]\x81\xe9B\ +\xc1\xc8\xb5\x16\x8e\x97<\xc3\x99\xe3\xd3K\xb9\xffb\xbb\ +\xe8\xe1k\xc7\xa7\x9a\xa6\xaa)2,\x858\xfa\x9b\x22\ +Q\xba\x97\xa8N\x8a\xa6OSWo\x8aDT-j\ +@*`\x8a\xb8\xc0I\x0f\x13\xa2\xdc\xf3\xb3\x82\x85\x8f\ +\xd1\xdf\x14M\x8a\xf4\xa3j\x02\x8eOq\xdd\x9b\x00~\ +\xf1,\xff\xaa\xf807^I\xe0\xa6\x85\xbc\xc0\xc7\x16\ +\xa6\xf8\x87\xac{'!\xbf+XL\xb17\x01\xf5'\ +7\x0e*\x8b\x1e\xdes\x94V\xab\x97\xea\x00\xc3T\xd4\ +\xf8\xc8\x14\xad\x89\xeb\xe7\x89\x0a\xf0p#\x81\x97\x16\xf8\ +\xc0E\xb5^\xac\xb5\xa6\xd5_\xf7\x09\xe3\x97O\x82\x0b\ +\xf9\xe5\xbdD?)J\xbcO\x13\xba\xd4\x0a\x8e\x22\xda\ +\x91\x9b\xce\xa6\x9ax\xcc\xd0qa?)\x22z)D\ +\xaf+XFr\xfboa\x8a\x93x3\xa6x-\xf7\ +\x9fo\x17=|mMk\xfb\x8e\x0a\xf0\x80\x8f\xbeI\ +\xb0\xd6~B\xf2U\xf909+\x98\x9f$Z<\xcb\ +\x1b\xc5\xf2&\x1f\x9f\x8eL\xe0\x8b\xec\x99\xe8UMQ\ +!\xe2\xa37E\xa2a]\xa2Z\xc5\xd5\xdcx9\xd1\ +\xd7\xb4&A-VM\xf1l\xee\xfd8\xa1\xc1\xe9\xc1\ +\x14o'\xbe\xee?8\xe6{\xa6\xf8O\x09\xdf\xd1\x02\ +\xbf\xd6\xfd\xb2\xbdx\xc2\xd7\x97\xf2\xfb\xbbD\xcf\x07\x1e\ +\xe8\xc7\x8c)z\x86r\xbb\xc72)V\xb5\x89\xf8\xab\ +\xc5\xbeIP\x7fw\x133M\xc2QZ\x8d\x8f-L\ +Q}\xabs\xf5^\x01M\xba\x99\x185\x09\xf7r\x1d\ +\x1fUm:J\xabo\xf7\x82\x95\xef96$\x9eb\ +\xecM\x11\x09\x88\xde\xca\x14\x7f\x97\xb5\xab\x89\x87\xe0O\ +\x12\xcc\xa0\xc7\xc3\x5c\x98!z\xad\xfb z\xf6\x5c5\ +E&\xab\xf98\x9f\xe81k\x8a\x0a\x10\x1f#S<\ +\xc8uQM\x16m\xeaMq9I\x981\ +E|\xa8\xf5\x1e\xa7a\x8a\xf8\x18\x99\xe2\xfd\x5c\x7f\xdc\ +\x7f\xe1\x09\xde/|\xaci\xf5\x8c)~\x94}\x8c&\ +E\xa6H\xf7\xe8_\x05\x8bV\xf7\xa6h\xad\xcd\xb5\xba\ +\x17\xad\xe3\xfe\x03\xb8\xed\x9a)\x12\xbd\x19\xa2\x89\xe9\x88\ +\xe8\xd3:>\xd5\x95\xb5 \xfc\x88\x96|U\xe8\x1e%\ +\xc8\xfb\xdd\x02\x92\x02\x1fUS\x94\xc8&\xc5\x0f\x13=\ +4\x1e\xd6~\xda\x7fp\xcc\xf7\x0a\xd0\x11\x05\x81\xea\xf1\ +(\x17\xf6\x133\xa6H@\xfa\xfcb\x8aL@\xd1T\ +\xb0\x88\xde\xc5\xc1\xcd\x8b\xe89\xad\xa8\x00\x1f\xf6\xbc\x85\ +)Z\xd3\xdag\x12-\x98\x0a\xb3\x9d1E\x5c\x5cn\ +\x17=|\xcd\x0c\x09S\xd5\x14=;B\xad\xc1\xe9\xf1\ +\xfb\x5c\x981E\x93\xa2\xdc\xebM\x80)\xdeK\xcc\x98\ +\x80Z\xa1M\xbd)\xca\x0b|le\x8a\xf2Z~W\ +@\x93\xf0\xd1\x9b\x80\xfa\xa3K\xf4\xa9\x8a\x1f\x9aV\x1f\ +\x84\x88\x19\xad\xd6\xd4\xf0\x98#\xb5\xba\x17\xae\xe3\x90\x7f\ +!\xbf\xb4\x97\xe8\xbb\x0f\x89\xa7;\xdd\xc2\x14\x97\xee\xa3\ +\x9axG\x8d\xe4\xfb\xd9\xf3\xa3D\x15G\x8d\xe4\x0aq\ +\x0bS\xb4\xa6\xb5\xab\xa6hb\xbe\x95\x18M\x8a\xfb\xb9\ +.\xf9\xaa\xa6\xa8I\x90x}n=\xcb5F>c\ +\x8a\xf2nd\x8arN\xee\xcd\x98\xe2\xcd\xdcO\xb0{\ +|\x91\x0b\xcc\x8bhW\xf0\xcb\xdc42\xc5\xe7\xb9\xce\ +\x5c\xfePY\xf4\xf0\x9e+\xf9\xc9\x14\xdf\xeb\xd6 \xfe\ +\xf8\xa8\x9a\xe2\xd9\xdc\xeb\x19\xae\x99\x22\x13\xf8:Q\x81\ +5\xad}\xae\xbb\x19\xbf\xd6\xadN\x8a\x96\xbb\x94\xd8%\ +z>\xf0\x80\x8f\xaa)jh4\xbeD\xb5\xc7iL\ +\x8aj\xb1o\x12\xd4\x9f\xbc\x9bi\x12\xb6\xd4j|\xfc\ +&\xd1cV\xab5\x07\xf8\xe8\x9b\x04\xdf\xb3\x9f\xf8^\ +\xb4\xba\x17/_~\x14\x88\xd2.\xd1\x9b\x22\xd1\x93x\ +3\xa6\xb8%\xd1:\xdf\x11\xd1\x0fs\x1d\xd1U\x13P\ +(\xf6\xfd~\xa2\x05\xd1c\x5c\xb3\xa6x\xbe]\xf4\xf0\ +\xf5\xac)*@|\x8cL\x11\x17\x07\x89*\x1f\x8b\xe8\ +\xf5y\xa5\xa1\xf9<1c\x8a\xbb\xdc/\xffz\xc89\ +\xb9W5E&\xf0qbd\x8aOr\xfd^\xa2j\ +\x8a??\x5c\xfbL~\xb6`*L`fRd\x8a\ +\xa2\x07\xf1\x97{US\xb4W|x\x96=~\x9f\x0b\ +\xf6]5\xc5\x7f\xc8\xbd\xd6\xc6y\x0b\xfc\xdeO\xcc\x98\ +\xa2\x06\xe1j\xa27\xc5\xe5$\xa1j\x8ar\xf9zb\ ++ST\x8b#S\xc4\x87\xfc\xab\xe2(\xad\x96\x1f\xb3\ +Zm \xe8\xe1?\xa4\xb3\xb6z\xaf\x80F\xdfH\x8c\ +\xb4\xfaA\xae?JT\xb5\xe9(\xad\xa6M/iu\ +/`\xf9|\x15\x88\xd8%F\xa6h\xe1\x19\xa2%\xde\ +\xa8\xfb\xf8\xb1\x1e\x9f2\xdb\x0f\x13=\x1c\x9fJ\xbc\xa7\ +\xfd\x07\xc7|\xaf\x00%\x1e\x81\xea!\xe9\x98@5\xf1\ +\x08)\xd1\xebsJ\x91\x10\xd3\x19S\xbc\x94\xfbE\x8f\ +E\xf4\xaa\xa6x.\x0b\x12&\x06\xd6\x83(\xddM\x10\ +\xed\x0a\xaci\xed3\xdd\xcdL\xe5Nb\xc6\x14/\xe4\ +~F\xd0\xe3/\xb9 ?\xf0R\x81gg\xcf[\x98\ +\xe2r|z\xb6\xdb\x18~\xe5\xdd\xe3\xee\xfaI\xdej\ + \xaf&zS\x94\x17\xf8\xd8\xca\x14\xe5\xf5W\x89\x0a\ +4\xa6#\x13P\x7fLQ\xd3^\xc5\xab\xb4\xfa\xcf\xc5\ +\x85\x0d\x00?4\xad\xf6\x0c\xbf\xf3_\xc6\xf7\x22\xb6\xc6\ +\x97B\xdcK\xf4\xa6(\xf1>Ml\xf5\x1f\xda0\xdc\ +\xe7\x89\x0a$\xde\xcdD\xdf}H\xbc\xfd\x04#\xa8B\ +\xe21/\x89\xd2\x82a)\xc4\x97\xba\x8f\xf6\x17^\xf1\ +\x1a\xbf\xd7\x12\x1f\x0e~\xcf\x9a\xf8\xa8\x9a\xe2\x07\xb9\xd7\ +\x11\xc5hR\x5c\x0a\x117\x15\xac\x1d\x9fzv\xf8\x98\ +1Ey'\xffzh\xc4\xac\xcd\x0c*`\x8a\xf8\x18\ +M\x8a_\xe4\xfa\x8c)\xbe;>}\xf9\x89\xf8\x0f\x8f\ +4M8o\xc1\x14\x09\xd3\xcc\xa4x)\xf7\xef\x12\xef\ +%Z\x9c\xd6\xf1\xa9\xdc\xee\xf1\xee\xf8\xf4eF\xd4\xf7\ +\x8cV\xd3h\xb5\xf8\xc6h\xf5q\x8c\xf1b6\xbcK\ +\xf4\xa6\xb8t\xa73\xa6\xc8\x5cF\x93\xe22\x92\x13\xd6\ +\x0a\x10\xac\x10{\xa2\xadu\x90`\x8aU\x13 z#\ +S\xb4W\xc91k\x8a\xba\xdf\x1e:<&P5E\ +\x93\xa2I`d\x8a\xb8x\x98\xa8\xf2a\xba\xd0E\xf6\ +\xb9\xa4\x93\xc6G\xd5\x14\xe5\xdb\xd5\xc4\xc5D\x0f9\xf7\ +YBcV\x81\xa9\x05\x1f#S|\x92\xeb\xf7\x123\ +\x93\xa2\xdc;\x93h\xb1L\x8a\x7fh/\x9e\xe05\xe1\ +\xbfr\x18\xfdm&\x22\xf9\xf1&\x1f\x9f\x8eL\xf1~\ +\xf6\xfc&\x9a\xa2\x5cV\xe3[\x99\xa2\xdcS\x93-\xd4\ +\xdf\x83\x84\xfc\xabB\xad\xec\x12#\xadV\x8b\x9a\xc9\x0a\ +\xde\xcfM\xf80\x10\xf4\xa0\xd5\xd6~\xde\x7fp\xcc\xf7\ +4\x1a\x1fo\x94V\xf7b\xd6\xff[\x10\xb1K\xf4D\ +?\xcb5\x858C41\x1d\x99\xe2it\x1f7\xb2\ +\xf6\x7fJ\xb4\x90x\x0c@1V\xa1P$\x88Di\ +!)\x86#y\xfbKG\xbc\xc6\xef\xb5\xc4\xc8\x14%\ +\x9e\xb5gL\x11\x1f\xff\x90\xe8\xc1\x14\x99\x00n*`\ +\x8aL\xa0\xcf#\xa6\xe8\xb8\xd0Qx\x05\xef\xe5\xa6\xbd\ +\xc4\x85\xc1\xcd\xff'\xd7fL\x91@+DG\x9d=\ +\x88\xd2\xcc\xa4hMk\x8fL\xd1\xba3\xa6\x88\x8b-\ +\x8eO\xcff]\xcf\xd0\xb3\xec\xf1\xfb\x5c\x90{L\xbd\ +\x82\xe5\xf8\x14\xe7-4\x1d\xf2\xeeq{\xf1\x84\xaf\xd5\ +\xca.!WZh\x96\xe4G\xf5\xf8Tm\xd3\xa65\ +S\xc4\x87\xfc\xae\x80&\xa9\xc5\xde\x04\xd4\xdf\xfd\x04}\ +\xaabK\xad\xa6y#S\x5c\xb4\x9a\x1fT\xf0An\ +\xc2\xc7\x16Z\xedo\x8a\x9ecI\xab{A\xcb:\xdf\ +B!\x12\xa7\xde\x14%\xde\xa7\x89\xea\xa4\xe8;\x99\xc0\ +\x9a)\xfe.\x9f\xcdt\x1f[\x8d\xe4\x1f\x1e\xee\xbb'\ +\x9aa\xd9\xf3\x16\x93\xa25\xad\xfd,Q\x81\xc4\xc3\xc7\ +hR\x5c\x0a\xb1j\x8a\x84C\xe2\xf59\xe4\xd9\xd9s\ +uR$t\xf2\xeeB\xa2\x87F\xcc\xda\x7f\xe9?8\ +\xe6{]\xfa\xcd\xc4hR$J\x0f\x12D\xbb\x02'\ +\x09\x0c\xa67E|h\x12\xaa\xa6\x98[_L\x8aL\ +\x117-\x88?\x13\xa8N\x8aL\x11\x1f?K\xf4\x98\ +5\xc5\xb5\xe3S\xa6\xa2I\xf8\xb2\xff\xc2\x13\xbc\xc7\xc5\ +\x95D\xcf\x07\x1efL\xd1\xb3c\x02k\xa6\xf8y>\ +\xab\x9a\xa2\xa6I~\x8c&E|\xcc4\x09jE\xcd\ +\x8c\xb4\x1a\x1f3\x03\x0c>\xd6LQ-\xbe\x89Zm\ +\xbf\xf6\xfd~\xa2\xc5\xb1\xb5\xba\x17\xb5e\x915\xa2\x09\ +\x92\xe4\xa8\x9a\xa2\x8d2\xc5\x11\xd1o\xf2H\xbef\x8a\ +\x92\x02\x1f3\xa6(\xa1\xcf'z,\xc7\xa7\xcf\xfa\x0f\ +\x8e\xf9^\x01~\x92\x18\x99\xe2\xa3\x5c\x7f\x98\xa8\x9a\x22\ +\xd1\x1b\x99\x22\xd1\xc0\xc7\x8c)\xeer\xff\xc5D\x0f9\ +\xa7\x10\xe5`\x05L\x800\x8dL\xd1\xa48c\x8a\x8b\ +\xe8\x11\xd6\x16&\xad\x19S$\xfc\x8b\x09\xb4\xebzm\ +r\xc6G\xd5\x14\xed\x15\x1fk\xa6h\xdf\xf6_\x81\xd3\ +\x09k\x8f&\xc5YS\xbc\x94u\xaf&N\xdb\x14i\ +!1\xdd\xc2\x14MD\xf8\x18\x99\xa2\xbc\x93\x7fU\xbc\ +J\xab\xab\xa6\xc8d\xf1\xf1\xa3\xd4\xea\x911\x22b\xd4\ +}\x10h\x85X%\x9a)\xae\x11=;\x92;\x9a\x18\ +\x8d\xe4\xb9\xfcB\xf0\xee{Q\x84Ba\xe6\xf6\xdf\x82\ +)\xdeN0\xf4\x0a$\x9euG\xa6\xb8L\x8a:\x9c\ +\x0a\x14 >\x08T\x8fG\xb9p/Q5\xc5_\xe4\ +^E\xde\xe7\x0eS$\xa6\xb3\xc7\xa7#Sd\x02\x9f\ +%fL\x11\x1f\x0c\xac\x07Q\x22\xd6\x7f\xeb?8\xe6\ +{kj@\xcet\xbf\xcfT\xac[\x9d\x14\x09?\xd1\ +\xbb\x92\xe8\x81\x07|\xe0\xa5\x82\xa5I\xf0,{\xccN\ +\x8a\x1a\x0f|\x9c\xeb\x16\xc6\xaf\xbc\x9b\x99\x14\xd5\xca.\ +\x81\x9b\x16N\xb1\xf0\xb1\xd5\xf1\xa9fO~W\xa01\ +\x95{#S\xa4K\x0f+\x8b\x1e\xde\xf36j\xb5S\ +,|\xf4\xc7\xa7\xfeI\x0f\x128\xa9\xc2\xf1\xe9\xa9h\ +u/nDi\x97 \xda-\x96\xc4\xab\x9a\xa2\xef\xb1\ +a\x0f\xb2\x07Sd\xb8\x8c\xa6\x02\xa6\xe8\xb8\xd0\xcf\x16\ +\x84\x7f?\xc1\x08\xaaX\x9b\x14\x9ffA{f`\x15\ +0\xd9\xbd\x84B\xefaME\xfe\xac\xff\xe0\x98\xef%\ +\x1e>F\x93\xe2R\x88US\xd4$\x5cO\xf4yc\ +\xaf\xc4\xc3\xb3\xac\xe0\xbd\xdc\x84\x0f\xf9\xd7C\xce\xe1\xba\ +j\x8a\x04\xe9fb4)\x12%\xc5X5\xc5\xa3\x8e\ +O5M\x7fLT\x80\x0f\x86x9\xe1u\x8b7\xfd\ +\xf8\x94)2\xde\x16L\xe5n\xe2\xcb\xf6\xe2\x09_\xe3\ +\x02'=\x1fo\xeb\xf1\xa9&\xf2\xc9\x099h\x7f\xfd\ +B\xde\xa8\x99wZ\xfd\x0d+\xa7\xaa\xd5\xad\xc0!z\ +\xb7B4a\xaa\x9a\xa2\x07\xb7f\x8a?\xc6\xe3S\x85\ +\xbdK\x8cL\xf14\x8eOMs#S\xd4 \x1c$\ +\xaa\xa6x\xd4\xf1)\x13\x981\xc5]\xee\x1f\x99\xe2\x96\ +\xc7\xa7_\xe4;gL\xd1\x11\xa4&a4)\x12\xbd\ +\xaa)\xe6\xd6\x17\x8682E\x13\xa2Z\x9c9>\xb5\ +\xe7-\x8fO{S\xd4t\xcc\x9a\xe2\xa5\xacq5\xa1\ +vZ\xe0\x01\x1f\xd5I\x91\xfe}\x94\xd0\xf0\xf5\xf0\xfc\ +\xe45S\xaf\xc0D\xa4\x16G\x93\xa2\x86L\xfeUA\ +;\xf6\x12#S|\x1b\xb5\x9a6\x89\xaa6\xad\x99\xa2\ +aK\xc3~\xe2\x01Fb\xc0Q#\xb9\xe9e\xc6\x14\ +\x15\xe2\xda\xa4h\xd3\xcf\x12\x15\xbc\xae\xe3S\xa2\xf7\xee\ +\xf8\xf4\x9b'F4\xf0\xb1\xc5\xf1\xa9&A~T'\ +E\x02\xed\xc8\xc6Qg\x0f\xa2d\xdfD\xbb\x02k\x8e\ +&\xa3\xafs\x9d\x09\xcc\x1c\x9f\x12\xbd+\x89\xde\x04\xf0\ +\xa0\x16\xdf\x1d\x9f\x86\x84\xc0)\x16\x13\x98\xf9\xef\x1dh\ +\xd3\x9a)\xca\xbd\xaa)n}|j\xd0\xe8M\x91\x8e\ +\xbe\xa9Z\xed\x14k\xed\xf8T\x93p?Q5\xc5\xa3\ +\x8eO\xcbZ\xcd\x18\x15\xe1\xe5DO\xf4R\x88\xd5\xc4\ +\xb3\xb6\x07\xb8f\x8a\x92\xfay\xa2\x82\xa5[\x7fw|\ +\xfa\x0d{[\x1e\x9f\xfe&_\xa1\xab\xf6<[(D\ +\xe2Q\x9d\x14\xe5\xdb.q1\xd1C#\xa6\xc8\x9f\xf6\ +\x1f\x1c\xf3\xbd.\xfdf\xe2m;>5\x15]J\xf4\ +\xa6h\x22R/3\xa6\x88\x8f\xd1\xa4\xa8S'LL\ +\xbd\x02'\x09\xa3&\x81\xa9h\x12\xde\x1d\x9f~\xc3*\ +~\xef%\xb68>\xa5\xd5\xf2\xa3:\xc0l\xa9\xd5\xc7\ +\xf9SW\xd5\x14\xd7&E\xba\x81\x8f\x13O\x8a\xb9\xe7\ +\x05\x10\xa2\x18{\xe8\xc6\x88^\xd5\x14\x89\xde\x9a)\x9a\ +\xb6\xac\xfd\ +\xe4I\x0b\xa2w;Q5E\xc2\xaf!\xbb\x98\xe8\xb1\ +\x1c\x9fVM\xd1\xa4(?F\xa6hR|\x90\xf8[\ +\xa2\x82\xa5!;\xd3\xddL\xf4\x98@\xf5\xf8\x14\x1f\xf6\ +\xac\xd0{0\xc3\x19S\xb4Wk\x8fL\xf1\xf7\xb9>\ +c\x8a8\xfe8\x81\xf3\x16\xf8\xc5\xc7\x8c)\xca\x0d\xda\ +\x84\x9b\x16\x8b\x09T\x8fO\xd5\xb6Fo4):\xf9\ +\x90\xd7\xf2\xbb\x82\xa3\x8eO\xefeA\xf9W\x05\xed\xd8\ +K\xd0\x92\x16\x8bVWM\xd1zj|4\xc0\x9c\x86\ +V\xcb\x8f\xb7I\xab\xe5\xc7\xc7\xbd\xe0\xe5\xda\x8b\xa3\xcd\ +\xcf\xf2s\x86h\x858\x22\x9a\x902\x98g\x89\x0a\x96\ +\x91|D4\xc1\x13U\x130\x92+\x18\xc4\xb4x\x9e\ +73\xdd\xc7\x92x#Sd\xb4\xd6\xae\x9a\xc0Os\ +\xaf#\x8a\x7fH\xf4x\x94\x0b\x8a\xb1\xca\xc7/r/\ +>\xfa\x1c!\x1aD\x8f\x88T@\xe8\x14\xf8\xc8\x14\xe5\ +\x1c>\x88_\x05\x04z\xcb\xe3\xd3\x91\x09,\xa6\xc8d\ +*\x90\x1f\xd6\xd5\x84\xf4\xc0\x83Z\xacN\x8agr\xaf\ +\xb5\x7f\x99\xe8a\xbfL\xa0:)2E\x5c\x9fK\xb4\ +\x90o\xfb\x89\x19S\xd4 \xc8\x11\xb9\xd2\x82\x09\xe0\xa3\ +\xda\xb0\xe3CN\x8fLQSC\x9b\xaa\xa6\xf8\xaa\xe3\ +\xd3'Y\xbb\x8a\xa5A\x95+-\xe8\xa8z\xd1\x5cW\ +`\xbd5\xadf\x8a\xd6\xf6\x1d\x15,Z\xadY\xe8\xf1\ +0\x17\xee'\xaa\xda\xb4\x95V\xd3~'+\xbf\xe8E\ +\x0f\x09\x92\xa3j\x8a\x16\xbe\x92\x18\x99\xa25\x15b\x95\ +hf\xf8IbD\xf4A\xae?HT\x89&\x1c\x12\ +\xc4\xfe[0\xc5;\x89\x99I\xf1r\xee\x1f\x99\xa2\x8e\ +\x17\x1fUSd\x02Dod\x8a\x8fs}?Q\xe5\ +\xe3\xe7\xb9\xd7\xda}~\x10\x8d\x99I\x80\xd01\xc4\x0b\ +\x89\x1e\xff\x96\x0br\xafj\x8aD\xcf\x9e\xed\xbd\x07\x91\ +\xb6\xef\xbf\xf5\x1f\x1c\xf3=\x8e\xad\xad\x11i\xc1T\xf6\ +\x13\xd5I\x00\x1fW\x13k\xa6\x88\x8f\xadL\x11\x1fU\ +ST\x83j\x91\xf8\xb5\xc0/\xc1{\xd4^<\xe1k\ +\xda\xb1\x97\xc0M\x0bu\xa2^\xaa\xa6\xa8\xb6?J\x8c\ +L\x91\xb1\xa8s\xf9]\xc1b\x8a}\xc3\x8e\x0f\xda\xf4\ +\xb0\xb2\xe8\xe1=\xf6k\xdf\xbd)\xd2&|TM\x11\ +\x1f\xb4iM\xab\xe5\xde\x8cV\xab\x97\x91V\xcb\x0d9\ +R\xd5&\x0d\xfb\x16Z\x8d\x0f<[\xff%\xe1\xf3\x10\ +\x91a\xaa\xab\xc0\x83\xb3\xf0\x88\xe8\xd9\xeeC\xc2\xddJ\ +\xf4\x89\x97K/\x12o??\xabD\xdb\xaf}#\xa6\ +\x85B\xc4\x87\xbdW\xa0\xb0\x15\xf8\xc8\x04$\xf3g\x89\ +\xaa)\x12h\x8972\x01\xa6x/\xe1yV\xb0\x14\ +\xe2\x99\xeef\xa2\xf1\xbb\xc4\xcc\xa4\xc8\x04\x14c\x0fb\ +\x87\x8f\xbf\xf4\x1f\x1c\xf3\xbd&\x81P\xff\xe3\xe0\xf7\x99\ +\x16\xd1\xab\xf2\xf1\xb3\xdc{3\xe1;Z|\x9d7\x84\ +\xe9\xf7\xed\xc5\x13\xbe\xbe\x92\xdf\xbf4\xb8\x07\xd7\x9f&\ +\xaa\xc7\x85\x9e\x9d\xfc\xd0\xf0\xf5\xb0_\xfb\xb6\xff\x0aL\ +\x8aj\xf1\x5cw3~\xf1\x5cm\x12,w1\xa1f\ +\xd4N\x0by!?\xaa\xa6\xa8\xc1#\xa6#S\x94\xcf\ +\xea\xfcy\xa2\x02\xe2/?\xfa&\x81\x1e\xa9\xc3\x99I\ +\xf1|\xee\xbf\x96\xe8M\xd1\xe4\xac\x16\xab\xa6h=\xeb\ +\x9a\xcc{l\xa9\xd5\x8f\xf2e8\xc1M\x05[k\xb5\ +\xf5_@\xc2\x80\xa4\x96x3\xa6(\xf1\xbe]8\xaf\ +\x17\xcc\x12-\xe1n$F\xa6\xf80\xd7\xef'\xaaD\ +o5\x92K\xbc5S4}J\xea\xa7\x89\x0a~\x9a\ +\x9b\xf01\x9a\x14g\x13o\xe9\xc6\x96\xbcX\xf6G\xa8\ +\xef&fLq\x97\xfbG&\xe0$\x01\x1f\xc4\xaf\x02\ +\x86\x85\x8fQ\x93@\xa4gL\xd1\x9a\x0cfd\x8a\x0a\ +\xbcj\x8a\x84\x9f)^N\xf4`X\xff#\xf1\xa6\x9a\ +\x22\xae\xcfu\x9b\xa6\x1f\xfb\x89\x19S$\xd2j\x067\ +-\xd4\x09mz\x13M\xd1\xa4\xa8!\x1b\x99\xe2\xfd\x5c\ +\x7f\x9c\xa8\xe2m>>\xfd\xbe\xb5zf\x80Y\xb4\xfa\ +|\xfb\xa0\x08\xa0\xa4&z\x7fl?8\xc1k\x93\x96\ +\x22\x1f\x99\x22\xd1\xb3\xe9g\x89\x0a\x10,\xf1\xfa\x91\x9c\ +\x112\x01\xc9W5E\xdd43\xef'E\x9d\xa3\x8e\ +\x9a\x81U\x80h\x82wap\xf3i\x1c\x9f\xe2cd\ +\x8a\x8ap?Q\xe5\xc3\xb4\xc5\x04\xd6L\xf1\xcb|V\ +\x01\xa1\xbbx\x18\xfd\xfd\xa7q|\x8a\x8f\x91)\xda\xaf\ +\xbc\x96\xdf\x15\xe0\x18\x1f\x1a\x91\x16\x8c\x8b)>i/\ +\x9e\xf0\xb5\x22\x94#\xbd\x09h@fr\xcf\xb3\x93\xd3\ +k\x93\x22>\xec\xbf\x025x#\xd1\x9b\x00~\xd5\xa1\ +z\xac\xe2(S\xa4\x1fUST\xdb\xf8\x18M\x8a\xa6\ +-\x5c\xab\xf7\x0a\x96\xe3S?[\xa8?\x0d\xbb\xa8b\ +9\xb5\xa1%-\xe8(>\xaa\x93\x22>\xe4\xdd\xf7\xa9\ +\xd5\xf9\xba\x17\xa7z[h\xb5z\xb9\x93\xa8\x9e\xea\xe1\ +\xf7R\xe2;Z\xad0\x89J\xd5\x04\x10\xfdQbD\ +\xf4\xec\xa4\xc8\x14o%F\xdd\x07aR\x88U\x13\xb0\ +_\xfb\xb6\xff\x16\x12\xefw\x89*\xd1\xf8\xbc\x96\xf8\x0e\ +\xd1\xb9&\x99u\xbeO\x13\x15\x10hB=2\x01\xa6\ +\x88\x93\xaa\x09(D\x02BX[\xe0C\xe2U\x9b&\ +|\x5cM(\xc6\x1e\x9a\x84O\x13\x7f\xe9?8\xe6\xfb\ +\xb3\xf9=\xa6\xc8\xd0{\xccN\x8aLQ\xee\xf9\x8e\x16\ +_\xe7\x0d1\xfd}{\xf1\x84\xaf\xaf\xe4\xf7\x05nZ\ +h\x12\xac]\x15\xbd3\xb9W~\x8cL\xf1\x0f\xb9N\ +P\xed\xbf\x82\xad\x8fOw\xd9To\x02\xf2B\xbdT\ +MQ.\xaf\x99\xa2\x93\x0f\x5c\xcb\xef\x0a\x98\xa1\xfc\xe8\ +\x9b\x04zt7\xa1i\xaaj\x93&\x816\xf5|\xfc\ +5\xd7hS5?\xacg]\xeb\xf7\xd8R\xab\xe94\ +m\xaa\xf2\xf1:\xb4\xfa\xdf$\xcf\x9bh\x8a\x12Nw\ +:2\xc5\x87\xb9\x8e\xec*\xd1\xaf:>\xad\x9a\xa2\xc4\ +\xdbKla\x8a\xe7\xb2.>F\x93\x22.\xf6\x13U\ +S<\xea\xf8\x94\x98\xfeK\xa2\x02\xc2\xbfK\xe8\xc8z\ +\x10;\xa27c\x8a\xf8\x185\x09\xb3\xa6hM\x063\ +2E\x05^5E|0DM\x82\xd7-4\x09D\ +\xef\xff\xb4\x17O\xf0\xfaL~\xd7\x9eG\xa6h\xbfL\ +`\xc6\x14q}.\xd1B\xfd\xed'\xf0]\x05\xd1\xdb\ +K\xf4|h\x1e\xb74E\x5c\x7f\x95\xa8`\x99\x14G\ +\xa6x?\x0b>\xae,zx\x8f\xe3\xd3\x91)>\xcb\ +u{\xae\x9a\xe2\xfb\xb9\xf7Zb\x0bS\xc4\x83\x06u\ +M\xabq\xf2\xb6i\xf5\xe7\xfd\x84\x90\x7f\xc3\xb1\x80h\ +\x0fPb\xf7\x98=>]L\xf1u\x1c\x9f\xce\x98\x22\ +\xc1\xbb\xd0\x93\x91\xf7\x8b\xe8)\xf6\x0a\xf0A\xf4F\xa6\ +\xa8\x08\xf7\x13US4mY\xbb\xcf\x03\x22\xaa\xf3\x9d\ +1\xc5\x8b\xb9\x7fd\x8a&#E^5E&\xa0\x10\ +G\xa6\xf8e\xae\xdbw\x95\x0f\x1c\xe3\xc3t\xde\x02\x1f\ +L\xf1I{\xf1\x84\xaf\xcf\xe7\xf7\xe5Ho\x02x\xc0\ +G\xd5\x14=;{^3\xc5;\xf9\xcc\xfe+\xf8\xa1\ +\x1d\x9f:\xf9\xc0\xc7\xac)\x8e\x8eO\x1fd\xdd\x87\x15\ +\x92\x0f\xefY;>}\x9e\xcf5\xa83\xa6\xb8\xb5V\ +;Qh\xc1\x08\x1f%fLQ>_O\xf0\x9a\x16\ +\x9e\xdd\xed\xc4\x8cV\xd3\xa55\xad\xc6\xf5_zA\xcc\ +\xb5Wb\x19\xc9G\xa6h\xb3\x16\xae\x9a\x80\xae\xe3V\ +b\xd4}\xec\xe7:\xb2\xab\xdd\x87\xfdJ\x90\x9e\xe8g\ +\xb9F\x98\xaaD\x13\xba\xbd\xc4\x88h\xc9lm\xc7 \ +\x15\x10\xe8\x9b\x89\xbeI\xb0\x16\x91&\xd6U\x13X\x0a\ +\xf1\x8c\xc5\x1a(D\x89GD*\xc0\xc7\xd5\x04\x13\xe8\ +q\x1a\x93\x22\x13`\xe8=\x98\xa2}W\xf9X\x0a\xf1\ +l\xb7\xb0\xf5\xack\xf2\xaa\x02\x178\xc1M\x0bfh\ +2\xaa\x9a\xa2gGU\x87\xb4\xa9\x0a\x93\x9c}\xd3\xd6\x16t\ +T~TM\xd1z\xd7\x12[i5m\xea\x9b\x84\x5c\ +z\xd1\xac\xe3\xe3\xdf\xbd)\xc0\xe4<2\xc5-\xb5\xda\ +@\x87\xeb\x17Z}Rcd*G\x11\xcd\x04l\xbe\ +\x02\x93\xd1Q#\xf9\x0c\xd1\x84C\xe2\xd9\x7f\x0b&`\ +\xcf3\xa6\x88\x8f\x0b\xed\xa2\x87\xafgM\xf1\x5c\xd6\xb9\ +\x91\x18\x99\x22.\xf6\x13U\x13`,\xf88\x93hA\ +4\x88\x07\x11\xa9`kS\x94\x1f#S\xfc\x22\xd7M\ +\x02U>L\x9f\x0aqd\x8aD\xafj\x8a\xf8`\x8a\ +W\x12\xbd).'\x093\xa6\xf8q\xd6\x1d\x99\xa2\xfd\ +\xce\x9a\x22\xae\xe5`\x0bBw?\x81\xef*.\xe5\xc6\ +\xab\x09\xa2\xddb1\x81\xff\xd5^<\xc1k\xb5-\xa7\ +\x89j\x8f\xd30E\xb5H\xa3z<\xc8\x85\xc7\xfd\xc5\ +\x13\xbcg\xe2\xf6\xdd\xf3AGgL\x11\x1f\xb4it\ +|\xfa\xa7\x5c\xa7{\xbe\xa3\x82E\xabG\xa6\xf80\x0b\ +\xbe\xf5Z}\x12cD\xb4\x078\xea>$3A\x9d\ +!Z\xe2\xe9R[(D$+F\xaf+ \x1c\x04\ +\xc4\xfe[0\x01\xe2Q5E\x89\xac\xc8/$z,\ +\xa273)\x12\xa6\xad\x8eO\xad}\xa6\xdb\xb4\xc9\xe2\ +nb\xc6\x14/\xe6~F\xd0\xe3\xb4\x8eOG\xa6h\ +R\xb4\xef\xaa).\xc7\xa7g\xbbM[\xcf\xbaO\xba\ +\xeb'y{>\xbf|%\xd1\x9b\xe2_r\x8d0U\ +MQ\xdd\xca\xe9\x91)\x9a\x145\x09\x9eg\x05\x1a\xb1\ +\x91\x09\xe0C\x1d\x1eT\x16=\xbc\x87H\xaf\x99\x22\xfd\ +\x981E\x8d\xcd\xc8\x14\x9d|\xe0\xe3y\xa2\x02\xe2\x8f\ +\x8f\xde\x04\xe8\x11S\x14U\xd8/M\xa5%-\xec\x95\ +6i\xae+x\x95V\xcb\xbd7Y\xab{_\xa2\xd5\ +\x9e\xe1VZ-\xf7^\xd2\xea~\x03\xf9|\x88\xa3\x88\ +\xb6Y\x0b\xeb\xf8*pl\xfaC\x1a\xc9%\xb3\xc4{\ +\x89\xe8\x13\x10\xf3\xd3\xfc\xee\xad\xc4hR$\xd2\xf7\x12\ +D\xaa\x82_\xe5&\x02\xd2\x9b\xe2R\x88D\xa4\x02\xc2\ +O\xf04\x0a=4\x09\x9f&\x98A\x05\xe7r\x93=\ +\xaf\x99\xe2\x8c\x090\x16k\x8fLQNW'\xc5\xdc\ +\xfa\xc2\x10G\xa6\xc8\x0cM\x02US\xf4\xec\xecy\xcd\ +\x14\xed\xbbj\x8a\x1aS\xb9\x87\xf3\x16\xf2\x0d\xcf3\x93\ +\xe2\xc5\xdc\xbfK\xf4& /\xf0Q5\xc5\x9f\xe4^\ +\xe622\xc5\xd3\x98\x14\xf1\xf1A\xa2\x05ST\x87\x8f\ +\xda\x8b'|\xadI\x18\x99\x22\x1d\xc5G\xd5\x14\xf1{\ +-1\x1a`\xdeiu\x88i\xf0\xd2\xf1is\xfd;\ +\xff\xd1E\xfb\xd9\xf2\x9a)\x1eE\xf4l\xf7az\xe9\ +\xbb1\xdf\xfd0!\xf1$a\x05\x84C\xe2\xd9\x7f\x0b\ +&`\xcf\xd5\xee\x83\x09\xec%.$z\xcc\x9a\x22A\ +\xc2\xc7\xc8\x14\x1f\xe7\xbab\xac\x9a\x22c!\xa8\xbd)\ +\x12Qb:3)^\xcd\xfd\x97\x13=\x88\x1d\xae\xab\ +\xa6\xc8\xb0>N\x8cL\x91H\xdfMTM\xe0g\xb9\ +w\xcd\x14\xf7\xf3Y\xd5\x14\xe5\x07.\xd6L\x11\x1f3\ +\xa6\x88\x8f\xadLQ\xee\xf5\xa6\xa8\xfe\xee'fLQ\ +\xc3$GzSd\x02\xf8\xa8\x9a\xa2\xdaV\xe3[\x99\ +\xe2\x8d\xac=2\xc5\x07\xb9\xae\x1e\xab\xf8un\xa4\xa9\ +=\x1f\xcfr\x0d\x1fUS\xc4\x87u\x99n\x8f\x1f\xeb\ +\xf1\xe9\x9aV\xaf\x9a\x22\xe2t[G\xc1\x83\x93x\xa3\ +\xee\xc3\x7f\xb1h\xdc\xf70+\x90p\x12O\x97\xda\xe3\ + \x17\x14\xa3\xa2\xac\x80p\x10\x90\xfe\xdfg$\xb7\xe7\ +\xaa)\xe2C\x91\xeb~{\x9c\xd6\xf1)\xc1\xeeq\x1a\ +\xa6H\xf4F\xa6x'\xd7gL\x11\x17#S\xfc\xb7\ +\x5cW\xe4~V@\xa0\xd7L\xf1\xcb|6k\x8a\xf8\ +8\xdbmL\xd3a\xdd'\xdd\xf5\x93\xbc=\x9f_\x1e\ +\x99\xa2\xe6\x00\x1f\xf2\xa4\x02\xb9|\x94)\xca\xebj\x93\ +\xa0\x11\x1b\x99\x00>\xd4\xa1z\xac\x82H\xaf\x99\xa2\x86\ +\x8c@U\xc0\x04\xae'\xd6L\x11\x1f\xcf+\x0b\xe7\x9e\ +\xad\x8fO\x99\x97\xfd\xb7\xb0W{f`\x15\xfc\x10\xb5\ +\x9a6m\xa5\xd5\xa6\xf2\xbf\xae\x11\xdd\x1bG\xfb{K\ +\xf712E\x9bU\xe4\xd5\xc4{\xd5\xf1\xa9B\xac\x9a\ +\xa2BQ0}\xe21p{\x9e!z\xad\xfb\x98\x9d\ +\x14\x8f:>]\x84\x89HU\xf0:\x8eOM\x00\x12\ +\xaf:)2\xc5\x9b\x89\xd1\xdfX\x99\xa2\x82\xa9\x9a\xc0\ +/r/\x83\xe9M\xf1\xab\xc3u\xab\x93bn\x7f+\ +\x8fOM\xe3\xf8\xc0y\x0b\xf9\x86\xe7\x99I\xf1b\xee\ +\xdf%\x88v\x0by!?\xaa\x93\x22\xdd\xfa(\xb1f\ +\x8a\xea\xdc\xf3\xac\x80)\xdeJh\xdc[\xd0\xa3{\x89\ +\xc7\xed\xc5\x13\xbe\xd6$\x8cL\xf1i\xae\xe3cvR\ +|\xa7\xd5\xdf<\x90\xf7\xf2cJ\xab\xd7\x8cQ\x22{\ +\x80G\x8d\xe4US\x94p\xba\xf5\xd1\xf1)C\x14U\ +S4)*\x98\xde\x14\x15\xc9\xe7\x89\x19S\xdc\xe5\xfe\ +\x0b\x89\x1e:^\x85\xb8\xda}\xf47t\xef\x09\x12>\ +\xd6\x8eO\x1f\xe6\xb3*\x1fD\xefz\xe2L\xa2\x05S\ +\xd1\x9d\xce\xfeM\xf1r\xbb\xe8\xe1\xeber\xae\x9a\x22\ +\xc3\x22\xd4#S$\xd2w\x13US\xfc\xd9\xe1\xda\xbe\ +\xa3\xc5b\x02UST\x88\x97\x12W\x12^\xb7pl\ +*?\xaa\xc7\xa7j\x14\x1fr\xbb\xc7\x1fr\xc1s\xac\ +\xf2\xe1\xb4fd\x8a\xf2\xedAb\xc6\x14\xf1q5A\ +KZ8AP\x8bUST\xdbj|\xcd\x14\xad\xfd\ +U\xa2\x02\x9a\xa4\x16G\xa6\xa8\x0e\x1f'\xaa\xb5H;\ +v\x09\xfboAG\xe5G\xd5\x14\xdfV\xad\xd6\xa0z\ +\x8e=\x1f\x9e\xddk\xd7jE\xd7\x03\xd1\xc4t\xad\xfb\ +\xb0\xe9g\xfdM\xc7|/\xe1\x1c\xd9\xac\x1d\x9f\xee\xe7\ +\xb3j\xe2\x11\x0eE\xde\xff\x9b\x10};\xe1\xe8\xb7\x82\ +%\xf1\xce\x0fnf\x02:\xbd\x19S\xc4\x07\xc1\xee\xa1\ +\x08\x99@\x95\x0f\xa6\xa8\xc8\xcf$Z\x10\xd1;\x89\x19\ +S\xbc\x98\xfb/\xb7\x8b\x1e\xbe&z\xf8\xf0\xb3\x02M\ +\x82gh\xef=\xbe\xcc\x85YS\xc4\xc7\xd9na\xa6\ +h\xdd\xaa)ZNn0\x81\xde\x145\x07Do\xe6\ +\xf8\xd4\x9e\x8f2\xc5\xaa\x09,\xc7\xa78o\x81\x8f\xfb\ +\x89\x83\xf6\xe2\x09_k\xa8\xf1\xd1\x9b\xe2\xd3\x5c\xc3\xc7\ +\x8c)\xd2\xa6\xa3L\x91\xd1T\xc0\x14\xd5b\xdf\xb0\xab\ +\xbf\x07\x87\x91\x1f%\xd8\xef.\xd1\x9b\x80\xbd\xd2\xd3\xd9\ +\xe3\xd3\xd1\x00c\x08\xb0\xf6;\xad\x0e\x09\xc1\xd2\xb0\x1f\ +K\xab{\x13\xf1\xe0\xae%\xd6L\x91\xe8U\x13o\xeb\ +\xe3S\xddG\xff\xef\x91\x14\x0aqfR\xdc\xcb\xfd\x84\ +\xaf\x87\x0eO\xe2\x1d\x8b\xe8\xfe\xe6\xbc\xffi\xe2Vb\ +4)*\xc4\x87\x89\xaa)\xfe*\xf7\x12\x90\xde\x14=\ +;{\x9e\xf9\x9b\xe2.\xf7_L\xf4 v\xf2\xa3:\ +)\x12\xe8\x9b\x89\xd1\xa4\xc8\x14\x999S\xaf\xe0\x87x\ +|\xaa\xd9\xab\x9a\xa2\xc6C\x0322E<\xcfL\x8a\ +rc\x97\xe8MQ^\xc8\x8f\xaa)\xaam5\xbef\ +\x8a\xea\xbc\xca\x073T\x8b\x1f$Z\xa8\xbf{\x89G\ +\xed\xc5\x13\xbe\xa6\x1d4\x84\xb6\xb6x\x9a7\xf8\xa0#\ +\x15X\x8fV\xaf\x99\xa2\xb5\xd5{\x05?T\xad>\xb6\ +6\xb5F\x22\x91\xd7\x88^\xfe\x8b\xa6*\xd1\x12N\xe7\ +\xdbwc\x1e\xda\xc1aTM`\x19\xc9\xdb\x7f\x8bu\ +\x15\xc9\xe7\x89\x19S\xdc\xe5\xfe\x0b\x89\x1e\xdf\xc7\xf1\xa9\ +\xce\xbd\x02\xa2w=\xd1\x9b\x22S!\xa63\xa6x5\ +\xf7_J\xf4X\xba\xb1c'^\xb7\x80)\x8ePo\ +a\x8a\xa6qk\x8f&E&03)^\xce\xfdW\ +\x12\xef%Z\x9c\xc6\xf1\xa9g\xa8\xc1\xe9\xf1\x87\x5c\xf0\ +\x1c\xe5w\x05[\x1e\x9f\x1ee\x8a\x8c\xabj\x8aL`\ +\xcd\x14\x9d\x04\xa9\xf3*\x1f4\x896\xf5\xa6\x98K/\ +\x9a\xd3\xc7^\x14\xb1f\x8at\x14\x1fUS\xdcZ\xab\ +\xd5\xcb\x8fZ\xab\x173A\xb4\xc4[\xeb>$\xde\xb3\ +D\x05\x12\xce\x11\xc5V\xc7\xa7\x04d\xf9w,\xfbS\ +$\xc4c\xe6\xf8T\x9772E\xa2\xa7\x1b\xabN\x8a\ +\xbat|\x10\xec\x1e\x8a\xd0\xb1^\xb5IX&\x81\x91\ +)2\x817\xf1\xf8\x94a\x11&{\xef\xf1e.\xd8\ +\xf7\xd7\xfd\x07\xc7|\x8fck\xfb\x8e\x16\x9a\x0e<\xcf\ +\x98\xa2\xdc\xd0(\xa7\xc6\x07\xfb\x00\x00@\x00IDA\ +T\xf4\xa6\xa89 z\x9a\x85\x0a\xe4\xb2=\xffrp\ +\xf3\xac)\xae\x1d\x9f\xca\xb7\xfd\xc4\xc1\xe0;\x8f{\x89\ +v\xec\x12\xb4\xa4\xc5\xd3\xbcQ/3\xa6\xa8\xc6\xd7&\ +E\xda\xc4h*0\x19\xa9\xc5\xde\x04\xf0\xf1\xe00\xf2\ +\xa3\x04\xfb\xa5!L\xbd\x85\xbd\xd2\xa6\x1f\xe3\xf1\xa9\xe7\ +(\xbf[\xbc\x91Zm\x93\x1e\xdc\xb5\xc4\x9a)J\xea\ +\x99\xc4s<\xd6'^.}[\x88U\x13\x90x\xcc\ +\xbc'\x9a\x81\x13\xa6\x99Iq\xcd\x14ux\x0a\xb1j\ +\x8a?\xc4\xe3S\x5c\xff[\xa2\x82s\xb9i\xed\xf8\xf4\ + \x9f\x11\xa7\xaa)\xbe\x8d\xc7\xa7\x0c\x5cNoa\x8a\ +K\xd3\x84\xf3\x16\xf8\xd5$\xbc\x8d\xc7\xa7j\xb1\xaaM\ +4\xe9V\xa2\x9f\x14\xe9\xd1\xbd\xc4\xa3D\x15\xe7s\xe3\ +\xc8\x14\x97&\x81\x8eT\xf0N\xab_fM\x13\xb6\x89\ +V3\x15\xdd\xe9\xe8\xc8\xe64\x8eO\xb7\x1a\xc9\x7f\x9b\ +=3\xf3\xde\x14u\x1f\x8a\xa5j\x8a\xef\xe5\xde]\xe2\ +B\xa2\xc7i\x1c\x9f\xe2c\xf47\xc5\xc7\xb9\xfe0a\ +\x92\xa9\xe0\xe7\xb9\xe9zb4)\xeaNg\x8eO\xaf\ +\xe4\xfeK\x89\x1e\xcb\xf1i\xd5\x14\x99\x00>\xd6\x8eO\ +\xef\xe7\xb3*\x1f&Ek\xfb\x8e\x16\xd63\x81\xceL\ +\x8a\x97s?N\xe4J\x0b\xd3\xe2\xab\xbcQ\xe3\ +o\xa2V\xbf8I\xe87l\xf3\x88\xf6\x10\x9fyS\ +\x80\xc4\xbb\x99\xe8\x8fO\x15\xe2\xfd\xc4A\xa2j\x02k\ +\x93\xa2\xbd\xda\xb3\xbdW\xb0tc\x17\x067K\xe6O\ +\x13U>$\xde\xad\xc4hR|\x90\xeb&\xc5*\x1f\ +\x9a\x1a\x89\xd7\x9b\x22\xd1 \x1e3\x93\xe2.\xf7\x8fL\ +\x91\xd8\xe1\xbaj\x8a\x9a\x04\xf91\x9a\x14\xe5\x06N\x98\ +z\x05[\x1f\x9f^\xce\xa6zS\x5c\xfe\xe6\x5c\x9d\x14\ +5\x91\xff9\xe1g\x8fYS\x5c\x9a&\x9c\xb7\xc0\xaf\ +&\xe1\x8b\xf6\xe2\x09_\xcb\x8d\xab\x89\xde\x14\xfd\x8dU\ +\x93P5E\x9a\xb46)\xce\x9a\xa2\xa6i4)\xaa\ +\xbf{\x09\xd3Q\x15\xe7s\xe3^\xe2\xfdn\x01M\x93\ +z\xa9\x9a\xa2\xf5\xae%\xd6L\xd1\xdaUmZ\xd3\xea\ +,\xf9\xa2i\xfa\xb1i5\x8dV\x8b/&F$,\ +\xf0\xf0f\x88V\xdc\x12\xaf7E\xeb\x9b\x8c\xb6 Z\ +\xf7\xc1\x04\xaa\xa6H\xe8v\x89\x0b\x89\x1e\xcb\xf1i5\ +\xf1\x08\x12>F\xa6\xf8$\xd7\x99bu2z[\x8f\ +O\xaf\xe7\xdf<2\xc5/s\xfd\xfe\x04\x1f\xd6\xc4\xf5\ +\x16\x93\x22\x13\xb8\x92\x90+-4\x07\xea\xa5j\x8a\xf6\ +\xaaI\x18\x99\xa2I_W-\xbf+pZ\x83\xeb\xde\ +\x14\x99\xc0\xac)\xaa\x955S\xc4G\xd5\x14\x99\xc0G\ +\x89\xd1\xa4h\xbaP\xe7\x9a\xbe\x0ah\x92\xfc\xe8\xb9\xc6\ +\x07]\xa2OU0\xad\xbd\x84\xfd\xb7`\x8a\xf6\x5c5\ +EM\x87uG\xa6\xb8\x1c\x9fV\xb5\xe9(\xad~\x94\ +\xef\xfc\xb1i\xb5&\xe1V\xe2\x85~\xfc$/\x16\xe8\ +\xf4n'\xaaD\x9b\x8cn$\x14d\x0f$\xef'$\ +a\x05\xbf\xccM\xba\xa6v\xbf\xd6!\x1a\xc4C\xd1T\ +\xb0$\x9eB\xef\xb14\x09\x92\xbb\x02\x82\x84\x0f]j\ +\x0fEx/Q5\xc5\x7f\xcc\xbd\x8a\xfcL\xa2\x85I\ +\x00\x1fD\xb5\x02\xc2\xbfK0\x82\x1eL\xc0$P\x9d\ +\x14%\xdc'\x09{\xef\xf1e.\xc8\xbd*\x1fL\x11\ +\xd7/\x92:?\x17X\x8f\x09X\xbf\x0a\x93\xc0.\x81\ +\x9b\x16\xf2\x02\x1f\xd5\xe3S\xcf\xeezb\xd441\x16\ +\xcf\xb1j\x02\xd6\xc4\xb5\x9al\xa1\xfe\xf6\x133\x93\xa2\ +S\x9b\xbd\x84\xdai\xf14o\x98\xa2f\xb2\x02\xa6\x82\ +\x8f5S\xb4v\x95\x8f\xe5\xf8\x94\x19\xb4\xc0\xc7\x83\xc4\ +\xc3DU\x9b~\x9d{iSo\x8a\xf6j\xcf3\xa6\ +\xf8Q\xee\xdf\xc2\x14\xdfV\xad\xde\x85\x8f\x8b\x89\x1e8\ +\xfe<1\xa3\xd5r\xef\xdbzY\x8cFR\x7f\x9a\xa8\ +\x8a\x1e\x13P\x88#S\xd4}\xdcOT\x13\x8f\x90\xda\ +\xf4\xb2\xd7\xbc|\x81\xc5\x14\x7f\xbf\x5c8\xe1OB\x87\ +\xe4\x91)\x9a\x00f\x88&\xd0\x8ckd\x8aDi?\ +Q5\x81\xe58\x08\xe7-\x98\xe2\x8c\x09\xe0\x03\x17\xa3\ +\xc4[\x9a\xa6j~,&\xb0f\x8a\xf6]\xe5C\xce\ +\x8dL\xc0z\xfb\x89'\x89*\x98\x22\x13\xc0M\x0b\x05\ +(?\xaa\xa6(\x97\x89\x9e\x86\xaf\x07\xae\xd5\xe2\xb3\xfe\ +\x83c\xbe_L\x91\x19\xb4\xc0\x07\x038h/\x9e\xf0\ +5\xd3b\x02\xbd)\xda\xab\xc6f\xc6\x14\xaf\xe4\xfe\x91\ +)Z\xd3\xda\xcf\x13\x15,\x93\xe2\xe8\x14\x0b\x178\xa9\ +j\x93?ex\x8e\xef'Z\xd8\xab=\xcf\x98\xe2\xe5\ +\xdc\xffa\xbb\xe8\xe1kM\x93\xdc\xa3\xd9\x15\xd0\xa6\xb7\ +U\xab/\x0e\xfe\xc1\x8bV\xab\x9b\x0a\x86Z\xad@\x89\ +\xdd\xff8\xfcYYX\x17\xb6f\x02L\xf1^\xa2\x9a\ +x\x0aE\xe2\xd9g\x0b\x85(9\xaa\x93\x22\xa1#x\ +#\xa2\x15\xe2g\x09\xe2W\x01\xc3\x92x\x8e:{\x10\ +\xe9\xbb\x09\x22U\x815o&\x18M\x0b\xa6\x88\x8f?\ +\xb4\x17O\xf0\x1a\x1f\x84I\xf4 \xfe\xf8\x90'\x15,\ +\x89\xf7\x8b\xc1\xcd\xa71)\xde\xca\xba\xbe\xa3\x05~\x09\ +\x93\xf5\xab\xb8\x94\x1bw\x09\xdc\xb4\xc0\x03>fLQ\ +\xbd\x10\xd5\x1eDO-VE\x8f)\xe2\xe3\xdb\xce7\ +\xafA\xfd\xddM\xcc4\x09\x9a&5\xd3\x9b\x22A\xfa\ +]b\xc6\x14\xaf\xe7~\xb5\xdec9>U\xef\x150\ +C||\xd0\xdd\x8c\x0f\xdat?Q\xd5&\xa65\x9a\ +\x14=;|8\xea\xac\x00\xbf\xd6=?\xb8y9>\ +\xad\xe6\x07\x1e\xe4\xde\xa8a\xc7\xc7\xbdD\x95\x8f5\xad\ +\xfe*k\xe2\xe3\x9f\x13\x15\xa8?y7\xd2j\xf5\xa2\ +\x89\xaa\xa6\ +\xe8\xf8\xf1Jb4)\x12\xbd\xdb\x89*\x1f\x8b)\x9a\ +\x18[\xd0#\x5c\xc9\ +u\xe2TM\xbc\xa5\x1b\x1b\x99\xa2u\xab\xa6\x88\x8f\xab\ +\x09\xa6\xd8c\xf6\xf8\xd4^\x99\xc0\xc8\x14\x99\x96\xc4\xab\ +\x9a\x00S\xfc$\x81\xf3\x16\xf8%zUS\xc4\x07.\ +\xae$\xbcn\xb1\x98\xc0\x9bj\x8arod\x8a\xfb\xb9\ +.\xff\xaa`\x02j\xa67E\x0d\xaaz\xa9\x9a\x22\xcd\ +a.k\xa6\xc8\x04\x9e'*0)\xca\x0ff\xd0\xe3\ +A.\xcc\x98\xe2\xafs\xff\xc8\x14\xed\xf5M5\xc5\x1f\ +\xa2V\xe3zF\xab\xe5\xc7hR|I\xabOj\x8c\ +\x12\xce\xc2k#\xf9~>\xab\x9a\x22!\xbd\x9e\xe8\xf7\ +\xf4U\xae\x11\xd3\x99\xe3S\x9d\xc7\xc8\x14\x8d\xe43D\ +\x9f\xcd\xfd\xf8\x18\x99\xa2\xee\x83XWM\xd1\x9a\x0cf\ +\xcd\x14\xad_\x01\xe1\xbf\x90\x18uc&\xa3\xcf\x13~\ +V`\xaf\xf8\x18\x99\xa2I\x91\x99WMQ\xceY\xbb\ +\x17=\xfc\xee'\x1e'\xaa\xf8072\xc6\x91)\xe2\ +c\xc6\x14\xe5\xf4hR\xd4\xd4\xc8k\xf9]\xc1\xf27\ +Ef\xd0\x02\x1fL\xe0\xa0\xbdx\xc2\xd7G\x1d\x9f\xaa\ +\x97\xaa):~\x5c3Ek\xdeN0\x9a\x0a\xf0\xa0\ +I\xc0K\x0bz\x84\x0b\x9cT\xb5\xc9\xf3[3E{\ +\x9e\x99\x14\xe5\xddhR\xdc\xfa\xf8t?\xdf[\xe5c\ +i\xd8_\x87V\xcf\x1c\x9f\xd2\x8f\x91)~G\xab\xfb\ +\x7fX\xee[\x05A\xba\x95\x18M\x8aD\x89\x09T\x89\ +>j$'L[\x1c\x9f\x9e\xc6H\xce\xb8\xd6\x88&\ +zUST\x88\xd7\x13#S\xc4GuR\xcc\xad\xab\ +\xc7\xa7\x9a\x84O\x13US<\x9b{\xedy\xcd\x14\x09\ +\xc8\xd7\x89\x0a\x98\xa2\xdc;\xd7\xdd\x8c_\xeb~\xd9]\ +?\xc9\xdbK\xf9\xe5]\xa27E<\x98\x8cfLQ\ +~\x8cL\xf1\xc7z|\xbaf\x8a\xb3\xc7\xa7LQ~\ +\xf4MB.\xbdh\x9a\x1e\xe5gU\x9b~\xa8\xc7\xa7\ +U>L\xce\xea\xbc\xf7\x8eg\xb9\xa6\x16\xdf\xd4\xe3\xd3\ +\x13iu\xff\x8f\xcb\xbfk\x88W\x8d\xe4\xf7sW\x95\ +\xe8\xa3\x8eO\xb72E\xdd\xe9\xcc\xf1)\x13X\xeb>\ +\x9e\xe4\xb3\xbb\x89\xaa).\xdd\xd8\xc8\x14\xefe\xdd\xaa\ +)\x12\xfe\xab\x09\x1dj\x0f\xe2\x8f\x8f\xaa)\xda\xab\xc4\ +\xdb\xc2\x14\x8f:>\xdd\xcfw\xce\x98\x22.p\xd2\x9b\ +\xe2\xdbz|\xaa\x0e\xe5_\x15\x1a\xd4\xbd\xc4i\x1f\x9f\ +.\x93\x22\x93\xe9\xc1\x14M\xa1\xb3\x93\xe2\xc8\x14M\x89\ +\x8f\x12Um\xd2\xd4\xacM\x8a\xf6<3)^\xcb\xfd\ +\xa3I\xd1\x9a\xd6~\x9a\xa8\x80V\xd3\xa6\xd1\x00\x83\x8b\ +\xfdDU\x9b\xd4\xf7\xc8\x14\xbf\xca\xf5-\xb5\x1a\x1f\xd5\ +\xe3\xd3\x92V\x1f\xc7\x18?\xc8\xa6\x10\xdd\x1f\x9fJ\xb6\ +\xc7\x89\xfdD5\xf1\x8e\x22Z\xf713)\x9a\x04.\ +&z\xcc\x1e\x9f2\x81\x1b\x89\xb5Iq\xc6\x14\xb7<\ +>\xc5\x05Nz0C\x897c\x8a\xf2c\xcd\x14M\ +\xce3\x93\x22\xae\x15{\x0b\x85}/!\xff\xaa J\ +W\x13#S\x94{3\x93\x22\xf1\x18M\x8a\x9a\x1a|\ +|\x95\xa8`\xed\xf8T\xfd1\xc5\x87\x95E\x0f\xef9\ +\xea\xf8\x94\xe8\xfdkqm\xa6\x88\x0f\xa6\xdb\xc3\x9a\xd6\ +~\xde\x7fp\xcc\xf7\xaf:>\xc5I\x15\x9e\x9f}\xdb\ +\x7f\x0b{\xb5\xe7\x19S\xd4\x90\x8dL\xf14\x8eO\xd5\ +\xa2f\xb2\x07ST3r\xa5\x02\xf5\xfdq\xa2\xf7\x0c\ +\xb9,\xa7\xb7\xd4\xea\xea\xf1\xe9\xab\xb4\x1a\x1f\xc3&\xa1\ +\xffG\xe6\xf7^\x02StD1\xea>$\xddA\xa2\ +J\xf4Q#\xb9\xc4\x9b!z/\xf7_L\xf4P\x88\ +\x9f%\xaa\xdd\xc7\xb9\xdc+9\xd6LQ\x82\x0c\x89\xce\ +\xf5W\xc1\xe4lm\x0f\xb3\x85B\xb4nuR\xb4\xd6\ +\x95\x84b|\xcf\x9b\x06o\xf2\xf1\xa9B$L8o\ +\x81_\xc653)^\xca\xfd\xbbD\xcf\x87\xe6@~\ +\xcc\x9a\xa2\xdc\xee\xe1\xf8\xd4\xbe\x09I\x05LQ-\xf6\ +M\x82\xfa\x93\x1fO\x12U\x5c\xc8\x8dj\xa6\x9f\x14\x97\ +\xc9Y\xddT\xc0T>J\x8cLQ}\xe3\xe3Y\xa2\ +\x82\xb5\xe3S|\xec'\x1eU\x16=\xbc\xe7\x87v|\ +\xba\xf0\xb1\x85V{\x86?\x88\xe3\xd36_\x8e2\xc6\ +W\x8d\xe43\xa6\xb8\x88^\xff\xfdDc\xd6\x14wY\ +c\x0bS<\x9buuc#S$Jw\x13US\ +\xb4\xe6\xc8\x14\xbf\xceu\x89GT+ \xfcLQ\xf4\ + \xfe\xb3\x93\xa2={\x96=~\x9f\x0b\xf6m\xff\x15\ +\xe8x\xad\x8d\xf3\x16\xf8\xddO\xcc\x98\xa2\x06\xe1j\xa2\ +7\xc5\xe5$a\xc6\x14\xed\xd9\xa4\xd1\xc3\xf3\x93\xd7\xf2\ +\xbb\x02\xa6(\xf7F\xa6x?\xd7gL\xf1R\xee\xc7\ +Go\x8a\x0cK~\xcc\x9a\xe2\xe8\xf8\xd4\x7fHgm\ +M_\x05\xcb\xa4\xe8g\x8f\x87\xb9\xf0(Q5\x01\xcf\ +\x8f\x993\xf5\x16\xf6\xea\x19V'E\xebi>F\x93\ +\xa25\xf1\xf14Q\xc1\xdb\xac\xd5\xf2\xaf\x87\x9c\xc3G\ +u\x80\x99\xd6\xea\xde\x98\x96\x0d\x22\xfaF\x82@\xf5\x90\ +t\xf7\x12\xd5\xc4#\xa4\x04\xa4\xffn\xa2\xa1\xf3\x9d\x99\ +\x14\x91<\x22z\x11\xbd*\xd1\xf8\xb0\xe7\x91)~\x91\ +\xebw\x13D\xbb\x02k\x12\xbd3\xdd\xcdL\xc5\xba3\ +\xa6x!\xf73\x82\x1e&#\x89\x87\x97\x0a<;{\ +^3E\xcf\xd1\xfe+pd/\xf7$w\x0b\xfc\xca\ +\xbb\xc7\xed\xc5\x13\xbe&JW\x13\xbd)\xca\x0b|\xcc\ +\x98\xe2\xf5\xdc\xbff\x8a\xb7\xf3\x99\xfc\xae\xc0i\x0d>\ +z\x13P\x7fL\x91\x11T\xc1\xb4\xf012E&\xf0\ +\xe7\xe2\xc2L\x00\x1f\xa3I\xd1t\x81\x8fYS\xd4,\ +\xb4\xc0\xc7A\x02'Ux~\xf6=2E{f\xe8\ +\x15\xe0\xf7Z\xe2\xc3\xc1\xcdr\x0e\xd73\xa6\xf8C\xd4\ +\xea\xea\xf1\xe9\xa9h\xf5O\x06\x0f\xea\x83\x5csd\xf3\ +C:>%zU\xa2\xcf\xe5\xde\x9b\x89\xfeo\xac\xb9\ +\xf4\xff\xff\x1fB\xbd)\xe0\xdd\xf1\xe9\xcb\xa41Z\xc2\ +\x84\xf3\x16L\x910\xcdL\x8a\x97r\xff.\xd1\x9b\xe2\ +\xec\xf1\xa9\x86\xe6\xa3\xc4\xda\xf1)\xd1\xfb*Q\x01\xf1\ +W\x8b\x8a\xbd\x05\x13\xd04\xcd4\x09\x9a\xa6\xbdDo\ +\x8a\x9a\x84\xcf\x12\xba\xf6\x0a\x98\x0a>F\xa6\xa8\xe9\xc5\ +\xc7\x8c)\xe2\xa3o\x12r\xe9?\xec'\x1eyQ\x84\ +&\xc1\xbe\xed\xbf\x05\xc3\xa2\x1f\xd5I\xf1(S\xb4&\ +>\xaa\x0d\xfb\x07\xb9\x17\x1f\xdf\xa7V{v\xf6\x97\xfb\x09\x13\x03\xeb\xf1E.\xdcM\x10\xed\x0a\xac\ +i\xed3\xdd\xcdL\xc5\xba3\xa6x!\xf7_\xee\xd6\ +\xf5V\x17\xa6\x10\xb7:>\xbd\x9d\xb5\xab\xa6\xa8\xf1\xc0\ +\x87\xe4n\x81_y\xf7\xb8\xbdx\xc2\xd7Di\x97x\ +\xaf\xbbo\x99\x8c4\x0b\x15\x98,\xae'\xd6L\x11\x1f\ +_U\x16\xce=&E\xb5\xd8OF\xea\xef~B\x83\ +Z\x05\xd3\xda%F\xa6\xc8\xb8f\x8eO5\x09#S\ +T\xdf\xd6~\x96\xa8`1E\xbc\xb4\xc0\xc7Ab\xbf\ +\xbdx\xc2\xd7[\x1f\x9f\xca\xbf\x1eK\x83\xfa\xb4\xff\xe0\ +\x98\xef_\xa7V\xcf\x98\x22\x9d\x16=\xde8\xad^\x8c\ +\xeaU#\xb9B\xac\x9a\x22\xe1 \xcbw-\xa4\xe8\ +\x1c\x09\xf5\x8c)\xee\xe5~F\xd0C\xc7kmfP\ +\x81\xc4\xbb\x99\x18M\x8aL\x91\x99WM\xf1\xdd\xf1i\ +\xc8k\xe0\xff\xb7\xa9i\xd2\x88\xb4`*\x9a\x84\xd9I\ +\xf1j\xd6\xe8MqvR\xd4\xd00\x815Sd\x02\ +3\xa6\xe8xL\x0e\xb6P\x7f\xf8\x98i\x12\xd4\x8a\x9a\ +\xe9Mqi\x12\xb6\x98\x14\xd5\xb7ZT\xef\x150E\ +|\x8c\x9a\x84\xfd\x5c\x7f\x94\xa8\x82\x89{\x8e\xefw\x0b\ +0,{v\xd4Y\x01~\xaf%F\xa6hM\xf9\xf1\ +\xb6\x1d\x9f\xe2c\x0b\xad>\x8d\xe3S\xf9q\xaaZ\xcd\ +\xac>H\xe8\xd6\xb78>%z#S$\x1a\x92\xa3\ +J\xb4\xc4#x\x17\x13=\x10\xed!VM\xd1\xd4B\ +\xa8GD?\xc9\xf5{\x89\xaa)\x9a\x14\xadMX[\ +\x98\xb4\x98\xed\x1f\xda\x8b'xM\xf8/'\xae\x0c\xee\ +Y\xba\xb17\xf9\xf8\xb47E\xfc2\x81/\x07\xff\x9e\ +\xe3^\xd2\x99\xee\x12#S\x94\x1f\xd5IQ\xcdli\ +\x8ajqd\x8a\x0fr]\xfeUq!7\x8eLQ\ +\x9d\xa8\xc5-L\xf14\x8eO\xf1\xd1\x9bb.\xbd\x98\ +\x14\x99\xa2\x86\xa1\x02\x0d\xea\xc8\x14\x9f\xe7:>fL\ +\x11\xcf#S|\x93\x8fO\xb7\xd2j\xf5\xb7K\xaci\ +\xf5g\xf9lF\xab\xe5\xc7H\xab\x0d04\x84\x96\x9c\ +\x18\x8a\xfc\x9f\x12\xa3\xc4\x93tL\xa0\x9ax\xbf\xc8\xbd\ +L\xc0w\xb4`\x8aL\xe0\x9f\xdb\x8b'x}\x14\xd1\ +\x8b\x09T\x89&\xd0\x88f`=\xa6\x88\xceb\xd6\xb4\ +\xf6\xc8\x14=\xc0\x19S$zW\x12=\xf0 \xf1\xf0\ +R\xc1\xd9\xdc\xe4\x19z\x96=~\x9f\x0b\xb7\x13L\xbd\ +\x02\xc9\x8c\x8f\x91)\xca\xbb\x19S$J\xbb\x84\x5ci\ +\xb1LFUS4Yh\xf4\xd6&E|\xc8\xef\x0a\ +\xe4\x07\xa1\xeekQ\xfd\xddOH\xbc\xa9Z-\xffz\xbc\xc9Z\xed\ +\xf9}\xd4\x1b\x97\x7f\x80\xa4c\x04U\xa2_\xd7H.\ +\xa9\xab\xa6\xc8\x04L/#S4)\xce\x98\xa2I\xc0\ +\xd4u&\xd1\xc2\xa4\xa5\xab\xa9N\x8a\xd62%^N\ +h\x18Z\xe8\xc6\xf0Q5E{\xb5\xe75S\xb4o\ +\xfb\xaf@\xc7k\xed\xd1\xa4\xc8\x04\xbe\xac,zx\x8f\ +\xcet\x97\xe8\xf9\xc0\x03>\xaa\x93\xa2:!\xa6\xa3I\ +\xd1\xc9\x87I\xa0:).M\x02am\xa1\xfe\xd4\xe1\ +\x93\xf6\xe2\x09_\x13\xa5\xbdD\xbf6S\xc4G\xd5\x14\ +\xadw-12\xc57\xf9\xf8\xf4\xc3\xc3}\xf7\xa6\xc8\ +\xc0=\xc3\x19S\xc4\xf3\xc8\x14\xff\x9c\xeb\xb8~\x96\xa8\ +\xc0\xa4\xa8^F\xa6\xf8(\xd7\x99b\xb5a\x97{\xf2\ +\xba\xf7\x01\xb9\x8c\x8f\x99\x01\xe6j\xee\xbf\x98\xe8q\x1a\ +\x7f\xea\xdaJ\xab\xd57>\xde\xeb\x09\xd1\x99\xdeKT\ +M\xf1\x17\xb9\xd7C\xec\xd7E41%\x22\x15\x10:\ +\x897\x22\x9a\x09\xe8\xc6fL\xd1\x11\x05\x03\xeb\xc1\x14\ +\xed\xbb\x9ax\xd6\xf4\x10\xcf$ZX\x8f\x09TM\x11\ +\x1fD\xefJ\xc2\xeb\x16x\xc0\x07^*8\x9b\x9b<\ +C\xcf\xb2\xc7\xec\xa4\xa8\xf1\xc0\xc7\xc8\x14\xe5\xdd\x8c)\ +\x12\xa5]\xa2\xe7c1\x01\x05Y\x01\x11\xbd\x9e\x18\x99\ +\xe2\x1fs\xfdv\xa2j\x8a\xf80\x09\xf4\xc6\x95K/\ +\x9a\xb1\x07^\x14\xc1\xb4\xf6\x12\xfd\xda\x04Z~TM\ +\x11\x1f\xc4cd\x8a\x84\x94\xa0VM\xc0d\xa4\x16G\ +&\xf00\xd7\xf7\x13U\xfc*72s\xfbo\xf1<\ +o\xd48C\xaf\x00\xbf\xd6\x95\x7f=\x18->\x9e\xf6\ +\x1f\x1c\xf3=S\xc4\x87f\xb2\x07S<\x0d\xad\xee\xb5\ +\xe9\xc7\xaa\xd5\xf4\x0e\xd7/\xf4\xa350&\xb0\x9f\xa8\ +\x9a\x22\xe1 \xed\x9ay\xfb\xe28\xe5w\xf99\xd3\ +}(\xf0\x91)*n\x89W5E\x89G\x98\x08T\ +\x0f\x85\xf8 Q5\xc5\xa3\x8eO\x89)Q\xad\xc0\x83\ +c\x88\x97\x13/\x1eb\xb3\xc8\x8f\xf5\xf8\x14\x17\xa3&\ +\xc1\xa4\xc8\x04\xaa\x93\x22\xd1`\x02k\xa6(\xf7\xaa\xa6\ +\xa8i\xd2\x80\xf4\xf5\x92K/\xa6\x00\xf9W\x85\xa6I\ +\xcd\x10\xed\x16\xef\x8eO[6\xbe1,\xda\xc4\xc0*\ +x\x95)\xca\xbd\x99&\xe1V\xee\xff\x8f\x83\x8d\xdd\xcf\ +\xb5\x83\xc4;\xad\xfe\x86\x9c\xd3\xd2\xeao\xf5t)J\ +\x93\xdc\xdd\xc4\xd7\xdf|\xcf\x89\xffw\xcb\xe3\xd3\xab\xd9\ +\xcd\xc8\x14Oc$\xbf\x9e\xb5G\xa6\xa8I\x981E\ +G\x90\xd6\xee\xbb1\xfc\xe2\xb9j\x8a\xb9\xf5\x85!\x8e\ +L\xd1\x84\xa8\xc8g\x8eO\xedy\x8b\xe3S\x1c3\x81\ +s\x89\x16\x7f\xcb\x1b|\xccL\x8a\x97r\xbf\x1c\xf96\ +\xa9\xf3\x1a4K\xf8\xa8\x9a\xe2\xfb\xb9w\xcd\x14\xd5\x8b\ +\xe6\xa6j\x8a&\x22|h\xccz\x98\xca\xf7\x13U\xd1\ +3\xb9\xac\x99\x22>\xaa\x93\xe2b\x02\xa3I\xf14\x8e\ +O\xf1\xd1\xffM1\x97^\xfci\xe7Q~V\xf9\xb0\ +_\xcf\xd1\xf3l\xf1\x1d\x99\xa2S\xbd\x83\x84\xda\xa9\xe0\xa8\ +\xe3S9=3\xc0\xfc`\xb4\xfa'!\xc2q\x9e\x04\ +\xa9\x9a\xa2\x11TR[\xab\x05\xd1 zD\xa4\x82%\ +\xf1F\xa6\xa8\xb8\x15yuRt\x5chl\xd6\xb5\xf7\ +`\x8aw\x12\xd5\xc4\xb3\xa6\xe3B\xdf\xd1\xc2z\xf8 \ +|\x15\xe0C\x11^Ix\xdd\x02\x0f\xbaS\xe6X\xc1\ +\x99\xdcd\xcf\x9ee\x8f\xd38>\xc5\xf5\xc8\x14\xf7s\ +}\xc6\x14\xfd\xcdh\x97\xe8\xf9x\x9ak\xf8\x989>\ +\x95\xd3\xa3IQ>\xab\x97\xe7\x89\x0a\x88\x1d>zS\ +$\xfcK\xeeUM\xe07Y\xe3Z\x82\x89\xb5x\x96\ +7\xf8\x981EM\xd3\x9a)\xaaE\xdfQ\xc1\xab\x8e\ +O\xefg\xd1*\x1f\x8eO\xd7LQ\x8d\xbf\x89\xc7\xa7\ +\xeaD~|\xdf\xc7\xa7\xb4\xa9\xda\xb0\xab\xbf\xbd\xc4H\ +\xab\x97S\x9b7Q\xab\x0d\x01#\xad\xfe\x8e\xa0\xe4\xf7\ +N\x04\x85(\xf1zST$\xc4\xa3\xda}(\xec]\ +bD\xb4\xe2\xfe4A\xfc* H7\x13\xa6\x98\x1e\ +\x0fs\xe1A\x82\x89U\xb0\xe5\xf1\xa9n\xecRB\x12\ +\xb60\x11\x11\xa6\xaa)2p|\x8c&E\x9d\xfa\xfd\ +D\xb5i\xd2\x9d2\x98\xde\x14\x97\xa6i\xc6\x14/g\ +]MBo\x02K!V'EM\x82\x9c\x1e\x99\x22\ +\xe1\x90\xd7\xf6_\x81\xa6\x09\x1fr\xb0\x05~\xf7\x13\x8f\ +\xdb\x8b'|}!\xbf\xbfK\xbc\xdf\xdd\xf7\xb6\x1f\x9f\ +VMQ\xd3tm\xc0\x07\xddP/\xd5I\x11\xbf{\ +\x89\xf3\x89\x1e\xd6\xd4\x80\xd0\xbf\x0a4\x09j\xd1\x89B\ +\x0fuH\x9f\xaa|\xc8g\xcd\xcd\xf7\xad\xd5\xeaEM\ +V\xa0N\xf0\xf1}k\xf5\xbd\x9e\xa4\x93l\x9e)J\ +\xbc~\x0dE~'Q5\xc5\xf7r/\xc1\x1b\x99\xe2\ +r|Z5E& 9FD\x7f\x91\xeb3\xa6\xc8\ +X\xacMX[\xe0c\xb6\x1bc\x88#Sd\x863\ +\xa6h\xaf\xf6<2E\x93\xa2b\xb4\xff\x0ap\xcc\x04\ +zS\xd4t\xdcK\xcc\x98\xa2\xdc\xd0(\xc8\x95\x16\xba\ +R|TMQ.\xaf\x99\xe2?\xe7\xb3\xdb\x89\xaa)\ +\x12;\x5c+\xf6\x16\x84n?\xf1\xa4\xbdx\xc2\xd7D\ +z/\xd17\x09L\x11\x1f3\x93\xa2u\xd7&E\xa2\ +\xf7\x8e\ +2E\xb9'\xbf+p|\xfaI\xc2D\xd0\x02\x1f\xf7\ +\x13\x84\xaf\x8aE\xf4zS|\x96\x05\xed\x99`W`\ +=\xc2\xc4dz\xfc\xcf\x5c\xb0\xb6\xef\xa8\x00\x0f\xf2c\ +d\x02\xa6\x22\x9c\xe0\xa6\x82_\xe5&\xcf\xf1\xfd\xeef\ +\x06n\xcfUS\xc4\xc7^\xe2B\xa2\x875\x19\xae\x1c\ +\xac@\x9d\xe0c\xab\xe3S|\xbc\xd3\xeao\x9e\x8c!\ +@-\x8e\xb4\xfa\x85)\xfa\xb5\x9e,\xd7^\x85\xc5\x04\ +\xfa{\x89\x86\x85\xab\x93\x00\xa1\xbbx\x18\xf9\xf1\x12\x8c\ +\xe2\x12\xafj\x8a\x8b\x09\xd8{\x0f\xfb\xbd\x97\xa8\x9a\xa2\ +df0\xfd$\xc0T\xf6\x13O\x12U\x9c\xcf\x8d#\ +S4\x09\xe0\xa3j\x8a\x9e\xdd\xf5\xc4\x9a)z\x8eU\ +S$v#\x13\xc0/\xc1{\x94\xa8\x82H\x13\xa7\xde\ +\x04\x08\x12>\xaa\xa6\x88\x8fk\x09\xc7M=\x18\x8b&\ +a\xd6\x14\xfb\xff\x90\x82\xf03\x81\x83D\x15\xf6K\xf4\ +z>\x9e\xe7\x9a=\xcf\x98\xe2\x95\xdc?2E\x0d*\ +\xae\xab\xa6\xb8L\x8a#S\x94\x1br\xa4j\x8a\x1av\ +y\xdd\x9b\xa2g\xa7\xf1\x9d1\xc5K\xb9\x7fd\x8a&\ +#\x5c\xab\xc9\x0a\x08\xb4z\x19\x99\x22\xed\xd8OT\xf9\ +\xa0w\xf8\x90\xdf-\xd4\xb6\x1a\xff1j5\xae_\xa9\ +\xd5=a-y\xa3\xd7K!2\x9a\x16\x88V,\x7f\ +l/\x9e\xe05S\xbc\x9a\xb8<\xb8G\xe2}\x9a\xa8\ +\x9a\xe2\x92x\xff8X{vR\xd4}\xdcL\xf8\x8e\ +\x16L@\xb1T'Ek\xe1\x02'\xb8i\xc1\x0cM\ +F~V\xe0\xd9}\x9c\x18\x99\xa2\xff\x10\xcb\xbe=\xcf\ +\x0a\x1c{\xdcJ\x9c\xebn\xc6\xc7\x9d\x04\xbe\xab\xb8\x98\ +\x1b\x99b\xcf\x87\xbc\xc0G\xd5\x14\x89(\xf1\x90\xdb=\ +\x96\xe3\xd3\xaa\x09\x10\x7f\xf9\xf1A\xb70\xa1#L\x84\ +\xaf*z\x9a&f\xde\x9b\x22\x81\xfe]b\xc6\x14\x99\ +\xed\x87\x89\x1e\x8c\x05\xd7U>\x98\xa2\xfc\xf0\xb3\x07S\ +\xbc\x97\xa8\xf2\xc1\xc4\xed\xbb7E{\xc5\x87)\xb7\x02\ +\xf9\xb6K\xc8\xbf\x1e\x9a\x04\xda\xf4\xb4\xff\xe0\x98\xef\x7f\ +\x9a\xdfS\x8b\xa3\x86\xfdq\xae\xe3C\xedTp\x94V\ +\xe3\xe3m\xd3j&N\x9b\xaa|\x9cH\xabOb\x8c\ +K7\xd6\xdfCD\x89\xde\x0c\xd1\xbb\xdc\x7f)\xd1C\ +\xe2y\x883\xa6x#\xf7\x8f\x12\x8fH\xdbw\x95h\ +kJ\xea\x91)\x12\xbd\xaa)*\xc4+\x89\xcb\x895\ +\x13\xd8\xc2\x14\xedw\xd6\x14q\xdd\x9b\x22\xa1\xdbO\xcc\ +\x98\x22\xd1\xdbK\xf4|\x10$B]5E\xb9|\x94\ +)j\xf6\x9e'*x[\x8fO\xd7L\x91\xb1\xa8\xc5\ +g\x152r\x8f\xe6@~\x8cL\xf1a\xae\xdfOT\ +M\xd1\xf1\xa9&\xa17E\xcf\xce\x9e\xab\xa6\xa8\xe9\x90\ +w\x17\x12=4\x1e\xd6\xae\x9a\xa2:\xf9$A\xb0{\ +\xcc6\x09\x86\x00\xcf\xf1L\xb7\xf0\xd6Z\xad^f\xb4\ +\x1a\x1f[\x0d0\xd6>\xb6V\xf7&\xd7\xf1\xf8\xed[\ +\x9be\x02\xfd\xef/Ds\xf3\x0a\x08\xdd\xc5\xc3\xe8\xef\ +?\x8d\xe3Sd\x8cL\xd1~\x99W\xd5\x14\x8f:>\ +\xd5\xe5=ITq>7\xae\x99\x22\xe3\xaa\x9a\xa2g\ +\xe7\x19\xaeM\x8a\xf8\xf0<+0\x19\xe1\x9a\xf8\xb5\xc0\ +/\xc1S\xe8U\x98\x5c\x88\x93\x5ciA\x90\x14b\xd5\ +\x14\x89(\xf1\x18M\x8aD\x0f\xd7\x84\xb5\x02\xa6\xc8\x04\ +\xd6\x8eO\x1fV\x16=\xbcg\x99\x04\xfaI\xd1^\xed\ +\xd9\xde+\xc0\x87\xbc\x1bM\x8a8\xc6u\xd5\x14\x99\xa1\ +\xdc\x93'=\xe4\x86\x1c\xa9\x9a\xa2|\xd6\xdc\xf4\xda\xf4\ +U\xae\xddI\xcc\x98\xe2\xa5\xdc?2E\xa7X\xf8\xf8\ +k\xa2\x02\x02\xad^F\xa6H;\xf6\x13U>\xe8\x9d\ +\xb5\xcf$Z\xa8m|l\xa9\xd54\xbb\x02{\x95\x1f\ +#S<\x0d\xad\xc6\x87\xe9\xbc\x05mZ\xd5\xea>\x99\ +\xda\x1b\x97\xd7K!\xf6D/\x8583)^\xcd\x97\ +(\xc6\x1e\xa7q|z\x14\xd1\x04d\xc6\x14o\xe5~\ +\xc9\xdd\xc2z\xd6\xadN\x8a\xd6\xc2\x05Nz\x13`\x86\ +&#?+X\x12o\xcd\x14\x15\xb9\xc2\xa9`\xeb\xe3\ +\xd3]6\xd5\x9b\x80\xae\x14\x1fUS\x94\xf7L\xd1\x7f\ +\xb8\xd2c\xf6\xf8\x94\x19\xca\x8f\x0f\xba\x85\x09\xdd\xdd\xc4\ +l\xd3d2\xea\xf9 \xd0\xa6\x97\xaa)Z\xcf\xba#\ +S\xfcS\xae\xe3z\xc6\x14o\xe6\xfe\xbeI\xc8\xa5\x17\ +\x0d\x13q\xc2M\x05\x9e\x1fSd\xea-\xec\x15\x1fU\ +ST\x7f{\x89\x0b\x89\x1e[\x1e\x9f\xca\x0d9R\xd5\ +\xa6\xb7Y\xab\x9dH\xf6`\x8a[i5\xcd[\xd5\xea\ +W\x19#\x07' \xbd)~\x95k\x16&\x22\x15H\ +\xbc]\xe2\xd2\xe0fb\xa7\x10\xdf\xb6\x91\x5c\x81\xaf\x12\ +=\xf8w\xb6\x97\xf0q%\xc1\x18\xbdn\xb1t\xa7o\ +\xaa)\xea\xc6\xce\xb5\x1b\xcekBw?1s|\x8a\ +\x0b\x9c\xf4&\xf04\xd7\xb64Ey\xfd\xceu\x1aR5\xc55\ +\xad\xd6\xf0n\xa9\xd5\xf8xS\xb5\xdapt6\xd1\x02\ +\xbfx>R\xab\x8f2FD{\x88\xbd)\x22\xfan\ +b\xc6\x14/\xe6\xfe\x91)\x1a\xc5g\x88\xb6W{\xb6\ +\xf7\x1e\xba\x0f\xfb\xae&\x9e\xe3Sk\x8fFr\xeb\x12\ +\xbd*\xce\xe7\xc6\x91)J8|TM\xd1\xf3\xd5Q\ +\x8f&E\x89q'\xe1yV\xe0X\xecF\xa27\x01\ +\xfc\x12\xbc\x83D\x15&\x97+\x89\xde\x04\x08\x92\x22\xaf\ +N\x8aD\x94\x98\x8e&E'\x1f\xf8 \xac\x15,\xa6\ +\xd8\x9b\x00\xe1\x7f\x98xPY\xf4\xf0\x1e\xa6\xe89\x8e\ +L\x00\x1f\x04\xbb\x82\x85\x8f\xdf\x0en\xc6\xb1\xb5\x9f\x0d\ +>;\xce%y!?\x9c(\xb4\xc0\xc7\xa3\xc4\xac)\ +\x12=\xf9\xddB\xc3\xee\x19VMQ\xbe\xd1\xa5\x0b\x89\ +\x1eK\x83Z=>\xa5\x1b\xf6<2E\xda1c\x8a\ +\xaf:>\xddR\xabiv\x05\xb4\x1a\x1fo\xa4V\xf7\ +\x89\xb5\xfc\x03\x7f\x95\x17\x0a\xd1\xe6[\x10\x8d\xdb\x89\xb7\ +\xf1\xf8t\xc6\x04\x18\x0b>F\xdd\x07\xf18\xb2\xfb\xc8\ +\xe7G\xe1r>\xbc\x9ax\xaf\xfb%fh2\xaa\x9a\ +\xa2gg\xcf\x9ee\x8f?\xe4\x82\xe7\xf8u\xff\xc11\ +\xdf\x13\xbb[\x89s\xdd\xef3E<\xcfL\x8a\x17s\ +\xff.\xd1\x9b\xa2&\x01\x1fUS\x94\xebk\xa6H8\ +4\x09\xf8\xa8\x9a\xa2\xf5\xae%F\ +\xa6\xc8X\xf0\xe1;*\xf8\xfb\xdct3\xd17\x09\xd6\ +\xdaO<\xcf\x16\x0c\x5c\x13\ +Y5E\xf5\xb7K\xc8\xbf\x1e\x8eOq=c\x8a\xf2\ +C3\xd9\x83)j\xac\xd5N\x05[i\xb5\xbd\xd0%\ +\xfa\xd4C\x93\xf0iBMV@G\x99\xe2\xda\xf1)\ +\x0d\xa9j\xd3QZM\xf3\xbeL\xbc\x12}r\xb9\x81\ +\x83\x13\xd4\xde\x14mT\xb1\xcct\x1fkD\x13;I\ +=C\xb4in\xd4}\x10iDW\x13O\x87\x87\x8f\ +\x91)\x12\xbd\xaa)*\xc4\xcb\x89+\x09\xaf[0C\ +|TM\xd1s\x95x\x92\xa4\x07S\xf4\x1c\xab\x89\xc7\ +\x14q\xdd\x9b\x22\xa1\xbb\x9f\x981\xc5K\xb9_\x8e\xac\ +\x99@\xd5\x14\x97\xc9h4)\x9e\x86)\xde\xc8\x9e{\ +S\xcc\xa5\x17S\xe2\xe3\xfc\xc4M\x05\xbf\xceM\xcc\xab\ +\xe7c1\x81\xaa)\xe2\xc3\xbaL\xb7\x87\xbf)\xca=\ +\xdfQ\x01\x1e\xe4\xc7\xc8\x14\x1f\xe6\xfa\x8c)\xca\xe7\x91\ +)jh\xecy\xc6\x14\xf7r\xff\xc8\x14ql\xed\xaa\ +)\xaa\x13|\x8cLQn\xd0\x90\xaa6\xfd\x10\xb5\xfa\ +n\xf8\xa8j\xd3\xab\xb4\xfaX\xa6\x98\xef\xffN\xd7\x85\ +h\x0fqd\x8a\xcce\xc6\x14%\x1d#\xe8a\x14\x97\ +x3#\xb9=\xdb{\x0fD \xba\x9ax\xcb\xf1\xe9\ +\xd9na\xebYW\xb7W\xc5\xf9\xdcx%\xd1\x9b\xe2\ +2\x19\xcd\x98\x22>\xd6LQ\xd7TM<\xc5=2\ +\x01|0\xc5\x83D\x15Dz\xcd\x14\x19\xf9\x8c)j\ +l\xd6L\x11\x1f\xcf\x13\x15\x98\x8c\xf0\xd1\x9b\x00#|\ +p\x18\xf9Q\x02Sd\x02L\xac\x85\xbd\xda3\x03\xab\ +\x80\xc9Zw4)\xe2X->KT\xc0\x14\xf1\xa1\ +yj\x81\x0f\x86(G\xbc\xae@>k\xf64}-\ +\x98\x22>\xaa\xa6\x88\x8fK\x09\xfa\xd4\xc3d$\xf7\xaa\ +\xa6\xf8\xd3\xdc\xab\x16\x09v\x0f\xdaq/\xa1v*\xf8\ +\xa1juU\x9bNU\xab\xdb$\xdbj$'\xfcW\ +\x13\x92\xaf\xc7i\x8d\xe4k\xa6\xc8\xcc\xabD\x1b\xf3\x15\ +\xe2\xc8\x14\x15KuR\xcc\xad/\x1a\x04\x9c\xf4\xa6\xc8\ +\x0c\x1d\xd9TMQC\xc3\x04\xd6L\xd1\xbe\xab|0\ +\xc5\x7fJ\x9cK\xb4P\xd8w\x13\x0a\xbd\x0a\xa2\xb4K\ +\x10\xa9\x16K\x93P5E\xf9\xcd\x04\xd6L\x91\x09\x10\ +\xd6\x0a\x98\xe1\xad\x043hA\xf8\x09\xde\xe3\xf6\xe2\x09\ +_k\x12\xae%zSt\xb4)?\xfe\x9c\xa8\xe0(\ +Sd,\xf2\xc3wT\xa0IX;>e\x88\x07\x09\ +\xdcT\xe0\xf9y\x8e\xad^Y\x87\x81{\x86UST\ +\x7f\xbb\x84\xfc\xeb\xf1c<>\xc5\x07]\xfa!i\xf5\ +\xed\xfc{\x0cH'\xc2\x92h\x8c\xe5z\x82\xb0\xb6 \ +\xa2\x8aefRD\xf4\xe5v\xd1\xc3\xd7Kw\xba\xc5\ +\xf1)\x22\xee$\xaa&\xa0\xc3[3\xc5\xfd|V5\ +E\x89\x87\x8b+\x09\xaf[0CE^5E\xcf\xd2\ +\x9e\xd7LQ\x82T\xf90\x01\xe8|{S$t\xf7\ +\x133\xa6\xa8\x08\xe5Ho\x8aN\x10\xe4^\xd5\x14\x99\ +\xcaQ\xa6h\xed\xaf\x12\x150\xc5\x1b\x89\xde\x14\xad\xf5\ + \xc1\x14qS\x81\x06ud\x8a\xcfs]~TM\ +\x11\x1f\xd6e\xba=\xb6<>=\xc8\x97\x89*\x1f\xf2\ +yd\x8a\x9e\x9dg8c\x8a{\xb9\xffb\xa2\xc7\xac\ +)\xaa\x13\xf5\xf2}\x1f\x9f\xaa\xf1?\xf6\xff\x98c\xbe\ +\xa7G\xea\x90>\xf5x\x9b\xb5\xfa\xc4\xa6\xe8\x1fOL\ +%\xde\xf5\xc4\xc8\x14\xef\xe4\xfa\x8c)J\xba\x11\xd1D\ +O\x91\xfbY\x81\xc4c\x02[L\x8a\xa7:\x92w\xff\ +\xb8\xf3y?2E\xcd\x01>L\xd0\x15x\x8e\xaf2\ +\xc5\xaa\x09\xac\x1d\x9f\x12\xba\xfd\x04\xd1\xab\xe2\xa8\xe3S\ +|\xcc\x98\xa2\x9c6i\xf4\x90\xcf\x04\x84\xd1T`2\ +b\x8a[\x1c\x9f\xda\xef\x9a)2\x81\x99\xe3\xd35S\ +\xfc\x97\xac\x8b\x8fg\x89\x0a4\x07\xf8\xd0<\xf5\x90\x1b\ +\xfb\x89\x19S\x94\xd7\xf2\xbb\x85\x5c\xb6g{\xaf\xe0\xef\ +r\xd3\xa5\xc4\xc8\x14\x97\x06\xf5m<>\x9d1\xc5\xad\ +\xb4\x9a\xafh\x12\xde*\xad\x96p\x8e?$J\x0b\xa2\ +!\xf1f\x88\xd6}H\xbe\x1e\xc4\xdfq\xd0\x8c)\xda\ +3\x03\xeb1;)\xae\x1d\x9f~\x95/\xd2$T'\ +E\xfb\xd4 \xe0d4)\xe2\xa3:)J<&`\ +\xd2\xe8\xf1\x87\x5c\xf0\x1c\xed\xbf\x82\xe5$\xc1\xdfJZ\ +\xbc;>m\xd9\xf8F\xf8\xef\xe5\xd2\xa3\x97/\x9f\xe8\ +\xddR/}-:\xda\x94\x1f[N\x8a\xea\xbd\x82\xa3\ +\x8eO\xf7\xb3 c\xfc\xf7\xca\xc2\xb9G\x930\x9a\x14\ +\x19\xb8\xa6ivR\xbc\x905z\xccN\x8a\xea\xe4V\ +B3\xd9\xe3A.\x9b\x8d~\x9c\x18\x99\x22-\xa5\xa9_\ +'*\xd8J\xab\xe9\xf3\x1ec\xec\x0b\xd1F\x89\xe9\xac\ +)2\x82\x1e\xb3\xa6\xb8\x10\xbd\x85)\x1eu|\xea\x01\ +VM\x11\xd1\x97\x12k\xa6\xa8\xc8\xab\xa6\xe8\xf9)\x96\ +-L\xd1\x04 \xa9\xcf%Z\x10:E\xfe\xa4\xbdx\ +\xc2\xd7\xba\xd3]\xa2\xcf=\xcd\xd2\xe7\x89\x99I\x91\x98\ +\x12\xd5\x1e\xa6\x0bkW\x9b\x04\x13\xa2\xce\xd7\x84\xd4\x02\ +\x1f\x04\xefq{\xf1\x84\xaf\xf7\xf2\xfbr\xa4\x07\xd1\x93\ +\x1fUS\xc4\xaf\xb5\xd7\x8eO\x19\xae\xef\xa8\x00\x0f\xf8\ +\xe8'gk\x1d\x1cF\xd5\x14\x89\xde\xc8\x14=;\xcf\ +\xb0j\x8a\xf8\xd8%\xb60Eu\x82\x8f\x91)\xca\x0d\ +5S\xe5ciP{S<\x0d\xadv\x82\xb5\x95V\ +\xe3cd\x8a\xb3\x03\xcc\x96ZMO?$\xac-\x10\ +\xcd\x04fL\xf1b\xee\x1f\x11M\xf4\x14\xa2\x9f\x15\x9c\ +\xcdM[\x11\xcdh\xad\xed;Z,\x93Q\xd5\x14\xad\ +u>q5\xf1\x9e7\x0d\x1c\xd5\x10=\xcdB\x05\x9e\ +\x1d\xe3\xda\xc2\x14\x15\xf7\x8d\xc4\xc8\x14\xf7s\x9d\xf0U\ +A\xa4w\x89\xde\x14\x9f\xe6\x1a>fLQR\x8fL\ +\xf1M>>e\x88k\xa6\xc8\x04f\x8eO\x99\xcb\xc8\ +\x14\x19\x8b\xb5\x9f%*`\x8a\xf2c\xab\xe3S\xcfQ\ +~\xb7`\x8a\xb7\x13\x1a\x9c\x0a\x96&ad\x8a\xb3\xc7\ +\xa7\xea\x04\x1f\x04\xbb\xc7\x93\x5c\xb8\x97\x981Eu>\ +2\xc5\xd3\xd0j\xc6\xd8cV\xab\xf1a\xcf[\x98\xe2\ +VZ-?\xe8\xf4\x8bz\xe9\x93O\xe2UM\x80\xf0\ +[xT\xe4\xc4\x8e\xe8UM\x11\xd1o\xe3\xf1\xa9\xa4\ +\x13\xbd)*DMBuRT$\xc4c\x0bS\x5c\ +\xba\xd3\xd1\xf1\xa9B\xfc\x22Q\x85\xa6i\x97\xe8Mq\ +\xeb\xff\xfa\x94\x09\xb5\ +\x97\xcb\x89o\xf9h\x8d\xf1n>\xf8\x83\xdf(\x80\xf0\ +3\x00\x8b\xf7@\xf4\x8c)\x9a\xe2t\x1f:\x85\x1e_\ +\xe6\x82}W\x89\xd6\xe1Y{4)\xde\xc9\xf5j\x93\ +\x90[_p\x81\x93\x91)\xe2\xa3j\x8a\x9e\x99b\xd9\ +\xc2\x14M\x00\xd6\xeeM\x91\xd0)\xf2\xadL\x11\x1f3\ +\x93\x221%\xaa=L\x17D\xafj\x02\xc4\xdfI\xc2\ +\xc8\x14\x09\xde\xe3D\x15\xe7s\xe3n\xe5\xe6\xd30\x81\ +\x91).\xff\xf5i\x95\x0f<\xa8\x97\x91)\x1e\xe4\xba\ +\xa8\x9a\xe2\xeb:>\xc5\xf5_\x13\x15,\x93\xd1\xc8\x14\ +M\x8a3\xa6\xf8\xf3\xdc\xaf\x16{S\xa4u\xb3\xa6x\ +\x94V\xcf\x98\xa2\xbd\xda\xf3\x9aV\xd3\xd4\xaaV[s\ +K\xad\xbe\x9c\xf5\xbf\xc5O\x0e_\xdd\xcf\xcfG\xdf^\ +=\xd9\x0b\xc2\x7f1\x81\xec\x1e\xba\x8e\x19\xa2\x19\x16a\ +z\x9bFr\x1c\x5cH\xe8\xc8zST\x80\x0aQ\xb3\ +P\x81\xe7%9\xb60E\xc5\x8d\xeb\x91)\xee\xe7\xfa\ +A\xa2\x0a\x22\xbdK\xe8\xdc[<\xcd\x1b\xf91c\x8a\ +\x0aqd\x8ao\xf2\xf1\xe9\xaf\xb3\xe7\xbd\xc4\xfb\x89\x16\ +LE\xa3Wm\xc8\xf0\xabI\x18\x99\xa2iK\x93\xf0\ +,Q\x81\xbc\xb8\x91xw|\xfa\x0d{L\x11\x1f\x9a\ +\xeb\x1eL\xd1s\xfc[\xff\xc11\xdf\xd3;u~\xa6\ +\xfb}\xa6\xc2\x5cf&E\xda\xf46j5\xae\xf9A\ +\x0b\xfc\xe2\xb9Z/\xd6\x1aj5\xe1V\xa43\x93\xe2\ +.\xf73\xc6\xde\x04\xb6<>%\xd2&\x98j\xf7\xb1\ +\xe5H.\xe9D\xcf\x87\x09\x91\x09T'EIA\xf4\ +\xb60E\xdd)ST\xec-\xf0+\xf1\xb6\x9a\x14g\ +LQ\x93\x80\x8f5Sd\x02\xcf\x13\x15\x98\x88\x1c\x8f\ +\x8d&\xc5{\xb9^m\x22\xed\xe5|bd\x8aOs\ +\x1d\xd7U\xd1c\xb2\xd7\x12k\xa6\xa8!\xab\x9a\xe2\xdf\ +\xe7\xde\x9b\x89\xd1\xa4\xb8\x9f\xeb\xea\xb1:)z~\x9e\ +\xa3\xe7\xd9\xc2^\xed\xf9\xdd\xf1\xe97\xac\xc8e9\xad\ +\xe1\xab\x80\x1ei\xd6\x1d\x17\xf6\xda\xb4\xa5V3-\x13\ +\xee\x9b\xaa\xd5\x97\xb3\xb7\xef4\xec\x92q\xc6\x14\x19\xc0\ +\xb7\xe7\xb2y\xbd\xc0D$\xa9M\x8c\x150\x81\xeb\x89\ +\xb5\x91\xfc~>\xfb[e\xe1\xc35uc[t\x1f\ +\xb8\xc0I\x9fxx\xc0G\xd5\x14=\xa7\xadL\xd1\xa4\ +\x88\x8f\xde\x14\x97\xe9e\xc6\x14/d\xdd]\xa2O\xbc\ +\xe5\xff\xb793)\xae\x99\xe2i\x1c\x9f\xe2cd\x8a\ +\x07\xb9\xfe8Q\x05\xd3\xdaK0\xb1\x16\x7f\xcd\x1b\xe2\ +1k\x02#S\x5c\x8eO\x9f\xb5_x\x82\xd7G\x1d\ +\x9fj\x10pR5E\x93\xd1\xc8\x14\xbf\xcau&P\ +\xe5C\xfd\xed\x12\xf2\xaf\xc7\xbf\xe6\x82Z\xc4y\x05\xea\ +D~\xa8\x9b\x1eOr\xe1a\xa2\xaaMG\x1d\x9f\xde\ +\xc9\xba3\xa6H\x97\x98@\x8fY\xad>\x93\x05\x8f\xd2\ +\xea\xbb\xf9\xbcj\x8aG\x1d\x9fZwfR\xfa\xc9\x08\x1f\x0f\ +\x0e#?Jp2s-\xd1\x9b\xa2\xbd\xda\xf3\x9f\x13\ +\x15\xe0\x97\xb9\x8cL\x91\xb10\x98g\x89\x0a\xe4\x05>\ +\xbe\xef\xe3S&\xe0YV\x80\x0fywap3\x8e\ +\xf11c\x8a\xf8\xf8\xd9`\xed'\xb9F\xac\xab\xdaD\ +\xef\x18\xaezo\xc1T\xf013\xc0\xecr\xff\x9aV\ +\xcb\xbd-\xb5z\xc6\x14q=\xd2\xea{\xb9\xbe\xa9V\ +W\x8c\x91\xf0\xef\x12#\xa2\xb7\x1c\xc9\x0f\xf2\x9d\xc4\xa9\ +J\xf4\xd6\xc7\xa7\x97\xb37\xdc\xb48\x8d\xe3S\xc9\xa1\ +\x93\xec\xa1Pn'\xbe\xea?8\xe6\xfb-\x8fO\xe5\ +\xc6\xd5\x04\x91j\xf1&\xff\xd7\xa7\xc4\x8e0\x8d&E\ +\x85\xf8\xa8\xfd\x87\x9c\xf0\xb5\xa6\x89X\xf7\xa6H\xa0g\ +L\xd1z\xd7\x12k\xa6h\xedg\x89\x0a~\x88\xc7\xa7\ +\x9f\x86\x88*\x1f\x9a\x84[\x89\xd1\xa4H\x97\x1e&\xaa\ +\xa6\xa8\xe9\xd5\xec\xf5\xa6\xa8ib\xe43\x93\xe2.\xf7\ +\xbf\xd3\xea\x90p\x88+\xf9\xf9J\xad>\xa91\x12~\ +\x0b\x8f\x88\x9e\x1d\xc9u\x06\x92\xc3T\xd7Cwp?\ +QM$\ +\xc8\xd7\x89\x0a\xfcm\x04\xd1\x8a\xbd\x05\x93\xddO\xb4\xbaoP\xf1+\xef\xe4_\x15k\ +Z\xadN\xd4\xcbw\xb4\xbaO\xd2\xb5/&L\xa2\x07\ +\x82?MTMqI\xbc5S\x94\xd4US4\xe6\ +\xdfJ\xf8\x8e\x16\x88\xb6\xee\xcc\xa4(\xe9v\x09E\xd9\ +\x02\x0f\x9f%\xbeCt\xfbKG\xbc\xf6<\x14\xe2\xc8\ +\x14\x1d\x9f\xda7a\xad\x80)\xe2\xa3o\x12\x08\xdd\xdd\ +\xc4\xcc\xa4\xa8i\xdaK\xf4\xa6\xb8L\xce3\xa6HL\ +G\xa6\xf8/\xb9.\xa9\x19o\x05\xcc\xf0f\xa2o\x12\ +\xacu\x90P\x8cU\x1309\x8fLq)\xc4\xeaq\ +!~\xaf%\xce'z,\x93\xa2\xef\xa8\x80 \xad\x99\ +\xc0\xa3|F\xac\xab|x~\xf8\xe8\xf5\xe6\xab\x5c\xfb\ +]b\xe6\xb8p\x97\xfb\xd5c\x0fM\x02m\x92\x83\x15\ +0\xacO\x12\x8e:{\xa8\x155CK*`\x8aj\ +\x91\xd1\xb4\xa0ur\xba:)Z\xeb\xcaa\xf4\xda4\ +\xab\xd5\xf6\x8a\x8f\xad\xb4Z-\xf6M\x02~i\xde\xf7\ +\xae\xd5}\xa2f\x0f/\x01\xb9W\x13\x97_\xba\xfa\xcd\ +\x9b\xe5\xdc\xbej\x8a\x88\xfe81\x22\x1a\x11w\x123\ +\xa6\xe8!\x8eLQ\x81\xcf\x10\xfda\xee\xdf%\xfa\xc4\ +[L`+ST0\x84\xa4\x02\xa6x#12\xc5\ +\xfd\x5cW\xe8U0\x81\xbdDo\x8a\x04\xfa\xb3D\xd5\ +\x14\xe5&1]3E\x82Zm\x12\x98!>F\xa6\ +\xf8 \xd7E\xd5\x04~\x9d{G\xa6h\xaf\xf6\xcc\xc0\ +*\xc0\xef\xb5\xc4\x16\xa6(/\xf01\x9a\x145\x09\xfb\ +\x89*\x1f\xcb\xe4\xdck\x8d\x5cf.3\xa6(\xef.\ +&z\xc89\x5cWM\x91n\xd0\x8f-Lq\x99\x9c\ +G\xa6\x88\x8f\xaa)\xd2\xa3\xa3\xb4\x9a~\xcch5>\ +\xb6\xd4\xeasY\xbf\x05S|mZ\xdd'k\xbb1\ +D_H\x8c\xba1\x04\xcf\x12\xbdf\x8a\x8eT$H\ +\xd5\x14\x15\xb7\x87\xf8A\xa2\x05\xa2\xf7\x13\x8f\xdb\x8b'\ +|M\x94\x14#nZ(@|\xcc\x98\xe2\xf5\xdc?\ +\x9a\x14\x15\x0a>\xaa\xa6h2\xc2Go\x02\xf8x\x98\ + |U0-bM\xb4[<\xcb\x9b\xdb\x89\xaa)\ +\xbe\x9f{\xd7L\xd1\x9a\xd6~\x9e\xa8\x00\x0f\xf8\xc0K\ +\x0b\xc2\x8f\x8b\x07\x89\xaa\x09x~k\xa6h\xcf3\xa6\ +\xa89\x1d\x99\xe2\xec\xf1\xa9:Q\x8b#ST+\xf7\ +\x13U>\x16\x13\xe8uF.k|\xd5z\x05\xea\xef\ +R\xe2\xe2\xe0f\x93\x11S\x9c9>\x95\x1f#S\xfc\ +\x22\xd7\x89\xb5\xda\xa9\xe0\xffc\xe7^\xb8\xa4\xba\x8e,\ +\xf1\x8f%\x83\xac\x9e\xe9\xe9\x87\x9f\xe2\x99 d\xa4^\ +\xf3\xfd?\xc8\xff\xd5\xb2%A\x02\x05H\xb6\xfb\xe1\x99\ +\xb5\xba-@^\xff\xfd\xc3\x5c\xf5U\xf8dR\x15\x87\ ++\x0a\x9b\xbdV\xa82o\xd6=uj\xdf\x88\xbd#\ +Na\x1f;>U\xe3\xd6\xef\x00\x1f\x87\xb4\x1a\x0f\xb4\ +\x09/\x1d0\xf07Q\xab\x0d0\xb4\xa9\xa5\xd55a\ +\xd7\xc4]\xcb\x1b\xc5X\x17\x9e\x1d\xc9/f\xcdcD\ +\x13\x90\xae):>\xfd81\xea>\xac;3)*\ +\xc4]\xa2\xf2\xa1I0\x19\xcd\x98\x22>F\xa6\xe8\xf8\ +TRw\xf9xS\x8fO\x0f\x99\xe2\xec\xf1)S\xfc\ +$Q\x9b\x84\x5cz.x\x8c\xa0k\x02\xaf\xe3\xf8\xd4\ +\xdf)\xe5\xde\xd7\x89\x0e\x98\x22>j\x93`-\x5c\xcc\ +\x98\x80\xa6\xc9s\xac\x1a\xb34M3\x93\xe2.\xeb\xaa\ +\xc7\x8aWq|\xaa\x16\x19z\x05\xd3b\xe6]ST\ +\xdf\xb7\x12\x17\x12k\xa8m5\xae\x01\xee\xe2jn\xa4\ +\xd7U\x9bf\xb5\xda^5\x09\xa3IQS3\xa3\xd5\ +\x1a1\xb9w.\xb5\xba&m\xf6\xf9\x9c\xdc\xeb\xf9\x8a\ +\xec\x8a\xa5;e\x06\x1d Z\xe2mA4S\xf4\x10\ +GD+\xf0\xaf\x12]H\xbaQ\xe2}\x1f\xc7\xa7\x0a\ +\xa7\x83\xd7q|J\xf4\x08uwR\x94\x8f\xba<&\ +S\xc1\x14M\x02O\xeb\x07\xa7|\xcf\x0co'F\xa6\ +hJ\x9c1\xc5\x9f\xe6\xfeC\x93\xa2=\xcfL\x8a\xf8\ +\xf8 QaMkwM\xf1G\xb9W\xbd\x8cL\xf1\ +$\xd7\xf7\x89n\x93\xa0\xbeG\xa6\xf8,\xd7\x99\x80g\ +\xd9\x01\xe1\xbf\x91\xb8<\xb8Y\xce\xe1\xe3<\x1e\x9f\x9a\ +>\x0f\x99\x22m\xea\x9a\x22>\xb6\xd4\xea\xadL\xf1\x98\ +V\xef\xf3;m\xa5\xd5\xf2\xe3T\x03L5FD_\ +J\x8c\xba\xb1W1\x92\x1f#\xfa\x8b\xfc\xdc\xae\x09l\ +}|\xaaI\xc0\xcd\x1a[\x1f\x9f\xe2\x83\x90t@\xec\ +F&@\xe8\xee%\x08_\x17\xc7\x8eO\x89^\xd7\x14\ +\xdf\xcd\xbd\xc4\xd4\xfa\x15\xd6\xb4\xf6\xd3\xfa\xc1)\xdf/\ +\xa6\xa8YX\x03\x1f\xb8`\x8c^w`\x128d\x8a\ +:\xea\x19S\x94w#S\x5c\x1a\xd4\xae)\xbe\x9fu\ +5\xa8\x04\xaa\xe2a.\xc8\x91.\x1f\xa6-kWm\ +\x91\xcbrz\xc6\x14\xe9\xd2\xc8\x14MFD\x8fFu\ +p!7\xd1&\x06VaR\xbc\x9b\xe8N\x8a\x8eO\ +\xad\xedg\xac\xf1M\xde\xdcIX\xbf\x83\xad\xb5\xda3\ +\xd4\xe0T\x98\x14=G\xfb\xef\xe0eZ\xfd\xb0\xb3\xe8\ +\x8b{\xd4\xca\xd5\xc4H\xab\xd5\xa2\xba9\x15j\xf2\x9a\ +\x8aF\x0b\xcf\x8e\xe4\x17\xb3\xee\xad\xc4!\xa2mz\x86\ +\xe8s;\x92\xe7\xf7\x1a\x01\xef\xf80iT8>\xc5\ +\xc7\xb3\xfa\xc1)\xdf\xbf\xec\xf8\xf4\xd1)\xd7\x19}\x9b\ +\xa6\xe9F\xe2\x9d\xf2\xe129oa\x8a\x84\x94)>\ +)?\xf3\xb4o\x99\xa2\xfc\x18M\x8a\xfb\x5cW\x88]\ +\x13x\x1d\xc7\xa7\xb3\x93\x22S\xc4\xc7hR\x94\x1b\xfb\ +D\xd7\x04\xe4\xb3\xbc\x96\xdfkxvr\xfa\xaf\xed\xf8\ +\xf4\xc7\xf9\x9d\x19\xcc\x85\xc4\x1a\xb4NNw'Ek\ +\xd1iz]M\xe0Ui\xb5\xbdW0\xc57M\xab\ +5K\x9f&N5).\xbf\xf0\x92\xc0\xc8E\xb2\xa8\ +\xb0\xa0n\xecM;>\xddg\xcf_%\xba\x90x\xd7\ +\x135\xf1\x16\x138\x13\xd1\xabM\xe0\x9cx\x1c2E\ +\x053c\x8a\xbaS\xc7dk\x10\xfe{\x89\x19S4\ +\xc9\xddHTS$z\xf2c\xd6\x14\x99L\x05S\xb4\ +\xf6\xd3\xfa\xc1)\xdf3\xc3\xd1\xe4\xecvS\xe2\x8c)\ +\x1e\x9b\x14=\xc3\xf3\xf8?\xc98v|\x8a\x8b}\xa2\ +k\x8a\x9a^y\xbdhJ^>\x87\x5c\xc6\xc7\xcc\xa4\ +\xb8\xcb\xfdW\x12\x15rN~\xa8\xc9\x0e.\xe6&\xf5\ +2\x9a\x14\x1f\xe7\xfa\x9dD\x97\x0fk\x1e2E\x13h\ +\xd7\x14\xdfju\xc8+8\xa4\xd5NT~\x958\xb3\ +V/I|)7[\xbc\x82\xdbJ<]H\x07\xd6\ +\x97\x1c\x8a\xa6B\xf7\xf1E\xe2\x9b\xfa\xc1)\xdfo=\ +\x92k\x12F\xa6\xa8c:3\xd1/~'|\xdcJ\ +\x1c2Ek\x13\x92\x0e^v|\xfa\xa0\xb3\xe8\x8b{\ +\x98\xd6\xcd\xc4\xc8\x14\x89\x9e\x7f\x04\xd2\xc1r|:2\ +E\xd3\x05>fMq\xab\xe3S\xcf\xd1\xfe\xd7\xb0W\ +{\x9e1Eu\xe8H\xa8B\xce\xe1Z\xb1w`R\ +T\x8b\xffsp\xf3\xac)n}|ze\xb0g\x9a\ +D\x9bhT\x07\x17r\x93\xa6id\x8a\x8e7gL\ +q\xeb\xe3\xd3\xb7Z\xfd_O\x5c\xad\x1c\xd3\xeaS\x1f\ +\x9f\xfe\xd7\x92\x7f\xea\xee\xfc}\xc4\xe2\xd5\x04$\x9e\x11\ +\xb4;)\xea\xc6\x88\xc7\x16#\xf9\xd2\x9d\xbe\x97\xf5\xd7\ +\xd0\xdd\x11\xa6\x99IQ\x11\xee\x12\x95\x0f<\xfc*\xb1\ +\x95)\x12\xbdg\x89\x0e\xb6<>\x95\x1b#S\x5c&\ +g]{\x07\xc7Lq\x99\x14\xbb|\x98\x14\x1d\x17\xfa\ +Z\xb1\xcf\x05F\xf0\xaa\x8fO\x9fdM\xf9\xe1\xa8\xb3\ +\x03|\xdcH\xe0\xbbB\xe3a\xed\xaf\xeb\x07\xa7|\xcf\ +\x14\xf11:>\xbd\x97\xeb'\x09\xb5\xd3\x81&O\x9d\ +\xff\xb0\xdc\xacI\x90\xd3[\x1d\x9f\xe2\xa3k\x8atC\ +\x93p\xc8\x145\xec]>\x0e\x1d\x9f\xe2\xc3\xba\xddI\ +1\xb7\xfe\xc5\x1d\x9f\xe2\xa3\xfb7V|\x1c\xd2jy\ +\xc1\xbb\xbaZ\xfd\x8ed6-VXP7\xd65E\ +\xdd\x98\xc4;4)~\x9e\xcf\xbeIt\xa0\xe3\xb56\ +\xe3]C\x22+\xf2\x19S\xbc\x9a\xfbG\xc7\xa7\x9a\x04\ +E\xde%\x1a\xcf\xc4\x83\x88T\xf8\x9b\xa2\xb5\xbb&\xc0\ +\x14\x1d\x07\x1d:>u$\xd4\xc5\xe5\xdc\xb8K\x8c&\ +E\xf9\xb1\x85)\x9a\xb6f\xf8x]\xc7\xa7\xf8\xe8\x9a\ +\xa2\xfc0\xbd\x8c\xeae\xd6\x14_v|\xfa ?\xb7\ +\xdb$\xd8\xaf\xbc\xb6\xff5\xe42>\xb68>5\x01\ +\xcc\x98\x22\xddP/#ST+w\x12]S\xb4&\ +m\xa2\x7fk\xd0:\x9a\xa7\xd6;\xf8An\xba\xf6\x22\ +\xea\xfdo\x82VkD\xd6X\xb4z\xc6\x14\xb7\xd2j\ +\xf9\xf1qMh\x9b\xe7\xb6\x92\x9a\x19t`\xcd\xadL\ +q9>\xb5\xf95\x10\xed\xdc\xfe\xd1\xfa\xe2\x19_\x7f\ +\x90\xef\x1f\x99\xa2\xc9\x08\x1f[\x99\xa2\x82\xe9\x9a\xe2\xd6\ +\xc7\xa7\xbb\xecmd\x8a\x8ck\x8b\xe3SBj\xed'\ +\x89\x0eLF\x0cF\xb3\xb0\x06\xe1?Ih\x9c\xba\xf8\ +In\xbc\x950\xd9\xad\xf14o<\xc3\xee\xf1\xa9z\ +\xf98\xe18\xb2b\x11\xbd\xee\xa4\xc8\x14\xf1\xa1\x99\xac\ +x\x98\x0bj\x067\x1d0Eun\xffk\xc8\xe5/\ +\x123\xa6x%\xf7\x8b\x0a\x9a\xa4\x16g&\xc5C\xa6\ +H\xa4\xef$hI\x07/;>\x9d1\xc5K\xd9\x10\ +#\xa8\xd8Z\xab=\xc7o\xea\x0f=\xe5\xfbE\xab\xd5\ +\xe4\x1a\xf8\xdd'\xe4_\x17[i\xf5\x85l\xe8\x9f\x12\ +\x7f[\x93Z\xe2\x9d\xd7\xe3S\xc2\xa1\x10G\xdd\x07a\ +\x9a\x99\x14\x15\xe1\xc8\x14\xdf\x1e\x9f\x86\x98\x15\xbe\x8f\xe3\ +SF\xd3\xc1\xa1\xe3S\xc2\xbfO\xcc\x14\xe2\xcfs\xff\ +\x87\x89j\x8a\x0c\xdc\xf423)\x1e2E\x8d\x07\x13\ +\xc0y\x07\x04\xe9\x93\xc4\xb1\xe3\xd3\xae):\xf9\xd0$\ +T\xfd\xf0\xec46\xe7\xf5\xf8\x14\x1f\x04\xbb\x82)2\ +\x81\xae)ny|z-\xfbb\x8a\xa6\xc65\xdeT\ +\xad\xc63\xbe\xbb8\xa4\xd5\x9a\x04\xde\xd5\x1d`\xf8\xca\ +\xb7\xf9\xb1N\xec\xa5\xf3=\xcf\xc7\xa7#S4\x05|\ +\x95\xe8\x02\xd1\xbbDM<<\x10\xa6.\xd1\xb8%\x1e\ +D\xa4B\xf7H@\x9e\xd5\x0fN\xf9\xdeD\xa4\xf3\xfd\ +Q\xf9~Bw?\xf1\xb8\x5c?\xcb\xdb\xcb\xf9\xe6]\ +b4)\xe2c\xcb\xe3S9\xd8\x01S\xc4\x87\xaf\x15\ +'\xb9\xc0\x14\xbb&@\xf4F\xa6h\xaf\xf8\xe8\x9a\x22\ +~w\x89\xd1\xa4hB\x94\x1f]S\x94\x17\xf8\x18\x99\ +\x22.\x1e$\xba|\x98\x14\xf1\xb1\xd6\x8e\xbc}\x9e\xcb\ +\xf6|\x1eM\xf1b\xf6\x85\x8fC\xa6x'\x9fuM\ +\xf1\xd8\xf1)\x13\xe8\xfeM\x91\x1e1D\xc6X\xc1\x14\ +5d3ZM\x9b\xe4v\xc5or\xe1\xf3\xc47\xf5\ +\x83S\xbew:qh\x80\xb9\x97\xcffMq\x975\ +p\xb3\xc6\xab\xd0\xea\x9bY\xf0\xdb\xfcX\x92\x9b@\xff\ +s\xa2+z\xd6A\x86\xa2\xa9\x98%\xdafo'F\ +\xa6x7\xd7\x1f\xd5\x1fx\x86\xf7F\xf2]\xa2\x12\xbd\ +LF]S4YH\xbcC\xa6(\xf1\xba\xa6\xf8\xf6\ +\xf84\xe4\xad\xf0~^\xcb\x8fC\xc7\xa7\xfb\xd5\xf7\x9e\ +\xf5\xe5Or\x83\xe7\xe8y\xae\xc1\x14=\xc3\xee\xf1)\ +ST\x88\xf2\xaf\xc2\xda\xff_B\x07\xdc\x01S\xc4\xc7\ +\x96\xc7\xa7\x17\xca\xc6\xe42\x13\x981\xc5+\xb9_T\ +,&\xd0\xe5\x83n0E\x06VA\xa4\xed\xbbk\x8a\ +/;>\x9d1\xc5K\xd9\xd7\xc8\x14\xf1\xc0\x14\xf1\xd2\ +\xc1\xa2\xd5\x87L\x11\x1f]S\xa4\xd5\xb8\x1ei\xf5>\ +\xd75e]\xa8\x95\xeb\x89\xad\xb4Z\xad\x7f\x0b$)\ +D\xa6\xe8\xe8\xa6\x83\x8b\xb9\x89x\x1c\x22\x9a\x80t\x89\ +>t|\xaa\x10\xef$f'\xc5\x11\xd1\xba\x0f\x89\xd7\ +5E\xa2\xa1\xa3>d\x8a\xbaj\xfb\xef\x80\xf8\x1b\xf7\ +\x89\xdf\x1a\xba\x7f|\xcc4\x09\x0a\xf1F\x82h\xaf\xb1\ +4\x09\xdd\xa6\x89\xa9\xe0\xe3\xe7\xebE_\xbc\xf6w(\ +S\x97\x1c\xec\xc0\x84\x88\x8f\xd1\xa4\xb8\xcf\xf5\x99B\xb4\ +_\xfb\xb6\xff5\x9e\xe4\x8d\xfc\x98\x99\x14\x0f\x99\x22\xd1\ +\x9b9\x0e\xd2$|\x9c\xa8MB.=\xff\xfb\xeaI\ +\xbe\xca\x95\x0e\xe4\xb3:\xa7\x19kxvrz\xc6\x14\ +w\xb9\xffr\xa2\xe2\xff\xe4\x02\xae\xf1\xd2\x01\x81\x96\x1f\ +\x04\xbb\xe2\xab\x5c\x981Ez\xf7QB\xbd\xaf\x81\x0f\ +\xebvM\xd1Z\x0c\xf1j\xa2\x9a\xc0\xd2$tM\xf1\ +uh\xf5\x1f\xf3{\xe0C\x13\xd2\x85\x86\x89VWm\ +\x9a\xad\x17\xb9,\xa7\xffL\xab}\xf0\x7f'\xbaDK\ +\x0a\x0b\x1f2E\x84|\x93\xe8\xe0\xd8H\xfe*Lq\ +\x97M\xd5\xc4\x9b\x1d\xc9\x17\x13\xf83\xa2\xf3\xb3\x08\x07\ +\x01\x991E\x8582\xc5\xfb\xb9\xfe8\xd1\xc5!S\ +\x94x\xf6\xdc5E\x89|\xc8\x14M[\xd6&$\x1d\ +0C\xdd\xe9\xc8\x14\x1f\xe4\xfa\xc3D\xd7\x04\xe4\xb3}\ +{\x9ek\xd8+#\x9f1E\xcd\x87\xee\xb7\x02\xc7\xf8\ +\x90\x83\x1d\xc8\x0b\xf912E\x5c\xe0\xa4\xcb\x87\x06\x15\ +\x1f\xf4b\x0d\xb9l\xcf3\xa6H\xf0\x08_\xc5\xff\xc9\ +\x85\x19Sd\x02\xf2cd\x8aD\x9a\x86\x10\xed\x0eL\ +\x8at\xefB\xb9y1\x81\xae)\xd2#\x86x\xad\xac\ +\xeb-\x8d\xc6\xc7\x9b\xa6\xd5\xb4i\xd6\x14wYc\x0b\ +\xad\xf6\x0cGZ\xfd{\x89\xde%z\xcb\xeeC2K\ +\xea\xd1H~7\xd7u{]\x10\xa5]\xa2\x12m2\ +\x22z\x0a\xb2\x03\x22J\x98FD\xff.\xd7?Ot\ +Mq\xeb\xe3\xd3\x1b\xd9[\xed\xc6LF\xf8\xe8\x9a\x22\ +>\x88\xe9\xcf\x13\x15&E\x82\xeagt`2\xba\x9d\ +\x18\x99\xc0\x83\x5c\xdf'\xbax\x1d\xc7\xa7\x8c\x16\x1fr\ +\xb0\x03\xa6\x88\x8f7\xed\xf8\xf4r\xf6\xcc\x08*h\xd2\ +\x8c)\xd2\x0d\xfa\xb1\xd5\xf1)\xae\xe9\xdf\x1a\xaf\xc2\x14\ +/e\xc1\x91)jPgL\xf1ui\xf5>\xfb\xd6\ +\x94uA\xab5NU\xab\xbf\xce5\xda\xb4\x99V\xd7\ +\x0e0?\xebT@\xf4\xc7\x09\x9dS\xc5or\x81\x09\ +t'\xc5\xb7\xc7\xa7\xdfeTq3\x5c\xe2\xb7\x86\xee\ +\xffN\xe2\xd1\xfa\xe2\x19_+\xc4\x91)\xbe\x89\xc7\xa7\ +\xf8\xd8'f\x0a\x91\x893s\xa6\xbe\xc6R\x883\x93\ +\xe2\xcd,\xa8\xd0+\xac\xf9\xab\xc4L\x93\xa0\x16GM\ +\xc2\xbd\x5c?I\xe0\xa6\x03M\x9e\xae\xba\xea\xc4\xd3\x5c\ +#L\x1a\x9c\x0e\x08\x9d\xbc\x93\x7f\x15\x1a1k3\x83\ +\x0e\x98\xe2\xa1\xe3SM\x93\x09\x86\x89u\xe0$A-\ +^(7kxi^wR\xb4\x1cC\xd4$\xe0f\ +\x8d\xa5I\xf0\xb5\x837]\xabk\xc3\xfe\xbd\xfc\xa9\xab\ +&\xfci\x88\x97\x14\x8a\xe5\x90)~\x91\xcf\xba\xa6h\ +R\x94x\x92{\x0d\x89\xcc\x04f&\xc5+\xb9\x7f\x97\ +\xa8\x89\xb7\xf5\xf1\xa9\x82Q8\x1d\x10;|\x8cLQ\ +\x91?\xee,\xfa\xe2\x1e\xa2D\x9cj\xe2-\x93sw\ +R\xb4\xde\xcd\xc4hR\xdc\xf2\xf8\xf4a~\xa6\xe8\x9a\ +\xc0/^\xec\xbb\x9a\x22\x130\xcduMQ\xbe\xe1y\ +d\x8a\xfe\xae\xcf\x04\x9e$:\x90\x17\xf2cd\x8a\x1a\ +\xa6\x93D\xd7\x04\x0e\x1d\x9f\xaam9=c\x8a\xd7s\ +\xbfi\xb1\xc2\x040c\x8aL\x00\x1f\x87\x8eO\xef\xe7\ +\xb3.\x1f[\x1d\x9ffK\x9b\x99\xe2\x85\xac\xfd&j\ +\xb5\xdc\xd8%\xd4\xce\x1a\x9a%\xf9\xd1\xfd\xf7\x1fj\xfb\ +\xc3\x84\x86\xaf\xe2_r\xe1[\xad>\xab1Je\xe6#S\xd4\ +\xe81\xf4\x0e\xf0k\xdd\x91)2Z\xf9\xf1u\xa2\x03\ +y\xa1^\xbe\xcf\xe3\xd3\xc5\x14\x7f\xd7\xd9p\xeeQ\x7f\ +\xf2\x8e\xf0U,\x0djwR\xa4M\xf8\xf8\xfb\xbap\ +\xde\x7f\x99\xf0\x1cgL\xd1\xda~\xc6\x1a\xd6\xb3.\xed\ +\xeb\x00\x1fr\xe3Z\xc2\xeb5\xf0\xa0\x16g&\xc57\ +U\xabw\xf9\xbd+\x1f\xea\x04\x1f\xdf\x8bV\x9f\xc5\x18\ +%\xc5\xc7\x89C\x93\x22\xb7U8\x1dly|z5\ +\x1b\x92x\xd5\x04\xbe\x97\x91\xbcCF\xeeQ\xdc:\xdf\ +\x91)\xde\xc9\xf5G\x89..\xe5\xc6]\xa2\xf2\xa1I\ +\x90x]S\x94KL`d\x8a\xa6\x0b\xa6\xd8m\x12\ +\xfc\x03\x1b\xc7c\xbe\xae\xc1\x08\xf7\x89\x87\x89\xae)\xda\ +\xaf.\xb2\x9a\xa2B\xb4\xe7\xee\xa4\x88_||\x90\xa8\ +\xb0&\xaeg\x9a\x04\xb58\x9a\x14\xef\xe5\xfaI\xa2\xcb\ +\x87n\x9a\xa0Vm\xf0\xec\xf013)\xde\xc8\xfd#\ +S\x94s\x9f%\xd4d\x07\xef\xe5&|\x8c\x9a\x04\x0d\ +\xe4\xfd\x04\x13\xeb\xc0\x10\xa0\x16M_k8\x05\xa2y\ +[\x1c\x9f\x9a\x88p=c\x8ao\xa2V_\xc9\xef|\ +=\xa1v\xd6\xf8\xde\xb5\xba&\xffz3\xeb\xd7\x92B\ +\xb1\x1c2E]S\xd7\x14M\x8a\x12Or\xaf!\x91\ +\xef&f&EE\x88\xe8\xda}\xe8\xc6$\xde\xe6#\ +y~\xc6Y\xb1\xe5\xf1)\x91&N5\xf1\x96\xc9\xb9\ +k\x8a\xd6\xb3\xee\xc8\x14M[D\xefi\xa2\x03f(\ +?\xaa)Z\xeb\xe1\x8b\xe8\x9a\xc0!S\xb4W\xa2\xd7\ +5E\xf9\xb6K\x8cL\xf1\xed\xf1i\x88Ya1\x01\ +5\xd9\x81\x86]~\x8cL\xf1\xcb\x5c\x9f1EzG\ +\xf7.$\xd6\xa0u4o\xc6\x14\xaf\xe6~!W\xd6\ +`\x863\xa6h\xaf\x87\xb4\xda~\xed\xfb\x9bD\x07[\ +k\xf5.\x9b\xaa|\xbc\x0a\xad\xbe\x99u5|\x15N\ +\xf5\xd4\xf9\xb3\xfa\xc1i\x8c\x11\xd1\x12\xef\xfb<>%\ +t\xfb\x84\xc4\xee\xc2\xf1\xe9\x8dD%\xfa\xeb\x5c\xd3\xad\ +\x7f/#y~\xceY\xe0\xf8\xf4\x97\x89\x1f\x95\x9b\xf0\ +q/q\x92\xe8\x9a\xc0\xcfr\xaf\x04abk<\xc9\ +\x1b\x85H\xb0;\xb0\x9eB\xd4\x09>\xbew\xad~\x991\xfa\ +\x5c\xb1\x1c2\xc5;\xf9\xacK\xb4\xc9H\xe2\x11\xbf5\ +$\xde\xfd\x84B\xef\x82H\x13\xa7\x11\xd1\x92c\x86h\ +\x09=\xea>\x18\x8b\xee\x83\xb0v\xb0\x98\xa2\xafk\xe0\ +\xe3\xe4EtE\xcf~o&\x88\xf6\x1a\xf6j\xcf3\ +\xa6x-\xf7\x8fL\x11\xc7\xd6\xee\x9a\xe22)\x8e\x8e\ +\x0b\xe5\xc6\xbdD\x97\x8f\xc5\x04\xea\xf1\xa9\xce\x91\x98\x12\ +\x91\x0e\xf0{%12E\x93\x11>L\xe7\x1d\x10h\ +\xf522\xc5\xc7\xb9>\xc3\x07cQ\xe7U\xf4\xd4\xb6\ +\x1a\xef\x9e\xda\xa8\xbf\xcb\x89\x11\x1f\x8e\xc7\xd4b\xf7\xf8\ +t1\x81\x91)\xda\xef\xdd\x84\xda\xe9\x00\xc7\xb8\xae\x0d\ +*>\xf6\x09|w\xa1a\xdf%p\xb3\x86\xbc\x90\x1f\ +]S|\xd3\xb5\xbaj\x13S\x94\x1f\xafE\xab\x91y\ +\x08K\xe2\x8dL\x91px\x88]S\xd4}|\x92\xa8\ +\x85(\x91\x09\xd3L\xf7\xa1\x10o$j\xe2-\xdd\xd8\ +\x0c\xd1\x1fe\xdd\x91)\x1a\xc9=\xc4\xa7\x89\x0e\x98!\ +>\xde/7\x13~\x05\xae\x10\xbb&\xf0A\xee\x1d\x99\ +\xa2B\xfcub\xc6\x14M\x5c\x0a\xbd\xc2d\xa4\xd3\x9b\ +1E|\x1c:>\xc5I\x97\x0f&>\x9a\x14\x15\xa2\ +\x9c\xeeN\x8a\xf2m\x97\x90\x7f\x15\x8e\xa8?M\xf8\x19\ +\x1d\x10h\xb972\x81G\xb9\x8e\x8f\xae\x09\xc8g|\ +\xa8\xf75\xd4\xb6\xfc\x98\x99\x14\xaf\xe7\xfe\xab\xebE_\ +\xbc\xd6$\xe0CMv\xb04\x09\xff0\xb8\xf9\xab\x5c\ +\xf3\x1c\xbb|\x98\x14?N\xf8\x19kX\xcf\xba3\x93\ +\xe2\x95\xdc\x8f\x93\xaaM\xccP\xbdtM\xf1uh\xb5\ +\xfa;\xcfZ\xad\xd1sJVq*\xad>d\x8c\xc7\ +\x88\x96\x18\x12D\xe1t\xf0&\x8e\xe4K7\xb6\x95)\ +\xde\x0e\x91#S\xbc\x97\xeb\x84\xaf\x0b\x89q#Q\xbb\ +1\x86\xb5\x95)\xfa\x9b\xa2\xb5\xfd\x8c\x0e\xf0\x80\x8f\x91\ +)>\xc8u\x9c(\xca\x0e~\x92\x9bF\xa6\xa8\xa1\xd1\ +\xd8\xd8{\x07\xf8\xc5\xf3\xa5\xc1\xcd\x1a\x0f|tMQ\ +\xf3\xf8\xcb\x04\xc1\xaex\x98\x0bw\x13]>L\xce\x87\ +L\x91\xe8\xcd\x98\xe2.\xf73\x82\x0aM\x02\xae\xb70\ +E\x0d\xb5}\xcf\x98\x22\xaeG\xa6x'\xd7gL\xf1\ +Z\xee\xbf\x9a\xf8Ab\x8d\xa5A\xdd\xca\x14q\xbd\x85\ +V\xcb\xbb\x99\x01FC\xbdKT>\xd4\x89&\xa1;\ +\xc0\xd0j9\xdd6\xc5\xdc\xfbg\xff\xf2l\xb9\xc6m\ +\x0fM\x8a\x12\xa4K\xf4\xb1\xe3\xd3{YW\xa1wa\ +\x12\xb8\x91\xa8&\x80h\xc9\xd1%\xfa\xdd\xdc\x8b\xe8\x91\ +)\x12=M\xc2\xd3D\x07&E\x85\xe8\xeb\x1a\x84\xee\ +\xc1\x8bX_?\xcbk\xfb\xb5o\xfb_\xc3^\xedy\ +fRT\xe4\x12\xbbb\x11\xbd\xae)2\xc3\x8f\x12\xaf\ +\xe3\xf8t\xc6\x14\x19\xc0\xc8\x14MFr\x8f\xf8u@\ +\xa0\xe5\xc7\xc8\x14\x9d\x22\xec\x13]S\x5c\x8eO5\xc1\ +k\xa8\xed/\x12&\xaf\x0e\x08\xdd\xe5\x17Q\xefwl\ +\x8a\x0f_;\xb0W\xf9qhR$\xd6\x7f\xec,\x9c\ +{\xb6<>\xfd \xeb_MT\x13\x90\x17\xf8\x90'\ +\x1d,\x0d\xfb!\xad\xf6\x1c=\xcf\x0e\x8ei\xf5\xfd,\ +\xf8\xb0\xb3\xe8\x8b{\xb6\xd6\xea\x91)\x9eI\xab\x11\xbb\ +\xc6\x92x\x87\x88\xf6\x10\xbbDo}|\xba\xcb\xde\xaa\ +)\xeaJg\xba\x0f\xa6\xa2I\x18\x11m$g0]\ +\x138v|\xaa\xf9 |]0-\xa6X\xf9\xd0$\ +\xe0c\xc6\x14\xad;2\xc5\xf3||\xea\xf9y\x8e\xb5\ +I\xf0\xec\xe4\xf4V\xc7\xa7\xb8\xee\x9a\xe2\xb1\xe3S\xb9\ +!I\xcd\xfb\xe2\x00\x00@\x00IDATG\xba&\ +\xb04M\xea}\x0d\xb5\xfd\xeb\xc4\xcc\xa4x=\xf7_\ +]/\xfa\xe2\xf5y>>e\x8a\x9f$F\x93\xa2\x1a\ +\xefN\x8a~u\x5c\xe0\xa4\x9a\xa2\xe6\xe0\xd3\xc4y\x9d\ +\x14\x1d'\xcb\xc15\xe4\xdb\x17\x89\x99I\xf1r\xee\xdf\ +%\xaa6\x9d+\xad^\x1b\xe3\xd6\xa6x;d\xbc\x97\ +XC\xb7\xbbO\xcc\x10\xad\xfb\xd8%*\xd1\x8b\x09t\ +'E\xdc0\x81C\xa6HP\x9f&:`\x8a\xf8\x18\ +\x1d\x9f\xde\xcf\xf5G\x9dE_\xdcc\xbf#Sd\x02\ +[\x99\xa2i\x8b\xa0\xfa\x19\x1d\xe0\xc1d\xb4\xd5\xf1\xe9\ +\xc8\x14=;{\x9e\x99\x14o\xe4\xfeK\x89\x0a\x8d\x87\ +\xb5\xbb\xa6\xa8N\x0eM\x8ar\x83)\xaa\x9d\x0eL[\ +\xf2cd\x8a\xd6\x9d1\xc5]\xee7=W\xa8A|\ +\x10\xbf\x0e.\xe6&|\xd8{\x05\xed \xd6\xdd&\xc1\ +4nm?c\x0d\xeb\xddMtM\x91\x11^K0\ +F\xaf\xd7\x90\x17j\xf1\xbc\x9a\x22>\xaa)\xca\xb7{\ +\x89\xbf\x0a\xad^\x8c\xd1W\xe2qhR\x94x\xdf$\ +:86\x92#\xfaag\xd1\x17\xf70\xc5\x9b\x89\x91\ +)2\xae\xae)\x9a,\x0e\x99\x22\xd1\xd3E\xce\x9a\xe2\ +\xa1\xe3S\xc6\xd8\xc52\x09T>\xec\xd5\x9e\xed\xbd\x03\ +\xeb)\xf2_\x0cn\xc61\xae\x9f\x0c>;\xcd\xa5\xc5\ +\x14\x9d(\xac\xa1\x10\x1f%\xe4H\xd7\x04\xfc\x0dmd\ +\x8a\xcfr]N\xcf\x98\x22\x03\x18\x99\xe2\xd6\xc7\xa7\xc4\ +\xba\xcb\x87\xe3\xd3\x8f\x12#S\xc4\xc7W\x89\x0e\x08\xff\ +\xe5\x17Q\xef7\x191E_;\xb0W{\x1e\x99\xa2\ +\xfd\xdeI0\xb1\x0e\x0e\x1d\x9fZ\x0f\xcf\xf2\xaf\x8b\x0f\ +r\xe3\xd5\x04n\xd6`\x8a\xea\xe5<\x1f\x9f\xd6\x06\x15\ +\x1f\xea\xf0$\xd1\xc5\x1b\xa5\xd5\x0cQ\xe2\x11\x8f\x9f\x0c\ +~\xe3\xdf\xe6\x9a\x87\xd85\xc5c\xc7\xa7\x12\xfa\xf1\xe0\ +g\x9e\xf6\x92B\xdc%\xaa\x09\xe8Juc3\xa6\x88\ +\x8fC\x93\x22\x83\xe9\x9a\xc0\xb1\xe3\xd3\xd9BdZ\xa3\ +I\xf1\xeb\x5c\xc7\xc7\x8c)Zwd\x8a\x8eO\x89\x9e\ +\x9f\xd1\x01S\xfc$Q\x9b\x04k\xed\x13\x0f\x13]\x13\ +X&g9\xbe\x86g'\xa7\xff\xda\x8eO\xd5\xb7\xbc\ +V\xefk<\xcd\x1b9\xdd\x9d\x14\xadu=\xc1\x04*\ +\x88\xff\xa7\x89\x99I\x91)jp*\x98\x223\xefj\ +\xd3\xcb\x8eO\xad\xdf\x05.pRMQs\x80\x8f\x99\ +IqK\xad\xfe8{\x1bM\x8a\xb3Z})\xeb\xde\ +H\xbc1ZM4\x08\x93\xe3\x84\x8aWa\x8aFr\ +\xc7Bk\x10:\xdd\xc7\x8c)J\xbck\x89J4\x81\ +&\xd4]S\xc4\xc7\xa1I\xd1\xdf\x14\x09*!\xe9\x80\ +\xf8\xdfN\xbc?\xb8\xf9~\xae\xe9N\xbb&phR\ +d\x023\xa6\xf8n\xee\xbf\x998d\x8a\xd6\xf63:\ +\xc0\x03>F\xa6\xf8 \xd7gL\xf1\xc7\xb9\xdfs\xf4\ +<\xd7\xf0\xec\xe4GwR$t\x0a\xfcr\xa2B\xe3\ +a\xed?\xd4\x0fN\xf9^\x97\xce\x04\x08v\x85\xdc\xb8\ +\x9b\xd0\xb9w`\xda\x22\xa8\xd5\x14\x99\x8a\x9c\x96\xdb\x1d\ +\xe0\x83\x01\xa8\xc7\x0a5\x88\x8f\x19S\xa4\x1f\x87&E\ +f\xde\xe5\x83\xde\xe1\xfabb\x0d\xeb\xe1\xb9k\x8a\xf8\ +X\xb4\xc9\xeb54\x09\xb8\xee\x9a\xa2\x5c\xb6g\xb9]\ +\xf1\xaa\xb4zd\x8a\xfb\xfc\xb0\x19\xad6)\xaa\x997\ +J\xab\x91}\xc8\x14%\x9e\xc2\xe9\xc0\xf1\xe9\xc8\x04$\ +\xde\xbd\xc4Ig\xd1\x17\xf7\x10\xe9k\x89\x11\xd1\x12\xcf\ +\xbf\x8c\xec\x80\x09\x10\xd3c\x93\xe2\xd3\xce\xc2\xb9g1\ +\xc5j\x02\x8c\x90\x090\xc6.\x0e\x99\xa2\xbdz\x86\xb3\ +\x93\xa2\xc4\xaeXDo\xd6\x14G\xc7\xa7\x0f\xf3\xc3\xe4\ +\x08n: \x1c\x04Dn\xaf\xf1,o\xbeHtM\ +Q\xbe]I\x5cNT,\xa2\xd75E\xf5\xa2[\x1f\ +5MD\x89XwM\xc0\xf1)\x83\xb9\x90XCm\ +\xe3c\xc6\x14qqu\xbd\xe8\x8b\xd7&#\xa6\xe8k\ +\x07\xf6\xea\x19\x1e2E\xfb\xee\xf2\xb1\xf5\xf1)m\xaa\ +\xa6(/>K\xc8\x93\x0e^f\x8a\xf8\xf8\xa6\xb3p\ +\xeeY\xfe\xd4\xf5:\x8eO\xcf\xa3V\xf3\xc3O\xaax\ +\xe0v\xb6\xfb@\xf4'\x89\xda}H\xe4;\x89\x99\xee\ +C!\xee\x12\xd5\x14u\xa5\xa6\x17\x82\xdd\x01\x1e\x8e\x99\ +\xa2\x22'\xac\x1d0C|T\xd1#\xfc\x04\xcf4\xd0\ +\x85&\xe1f\x82\xa9\xafar\x9e\x99\x14\xf1\x8b\x8f\x91\ +)ny|\xba4M]S\xd4\xd4\xd8w\xcdk\x06\ +N\x98\xce\xe3\xf1\xa9z\xf9_\x89j\x5c\xb9\xf4\xbcV\ +\xd4\x8c\xda\xe9\xe0'\xb9\xe9V\xa2\xae\xfd4\xd74M\ +\xbfKtq=7j\x14*\x88\xff\xa7\x095\xd9\x81\ +)\x8e)nq|jMk\x8f&E||\x95\xe8\ +B\x83\x80\x93j\x8a\x9a\x03|t'E\xcf\xce3\xf4\ +,+\xb6\xd2j\xf57\xab\xd5\x97\xb2\xc6\x8dD\xd5j\ +M\x02>\xbaZM\xeb\xf0\xa1\xd6+4y3Z\xcd\ +\x14\xff)\xf1\xc3* \x0aE\x82t\xbb\x0f\x13\x80\xee\ +\xb4\x9a\x22\xa2\x89\xde\x8c)*B\x89W\x89f\x02\xc8\ +\x98!\x9a\x98\x1e\x22\x9a\xa0>Kt\xc0\x14G\x93\xb3\ +\xb5\xee'\x98\x22n:0)\xdeLH\x945\x88\x1e\ +>\xba\x93\xa2\xf5\xac\xfb\x8bD\x05Sd\xb8O\xea\x07\ +\xa7|\xaf9\xc0\x07^*NrAt\xf90)z\ +\x8e5\xa7\xf1\xe1\x19\xce\x98\xa2\x02\xbf\x9c\xa8\xd0\xf1\xe2\ +C\xb1w\x80\x0f\x85X\x8d\xcbZje\xc6\x14M[\ +\xb7\x12um\xb5\x8d\x8f\x99IQ\x1d2\x82\x0a5(\ +\xf7fL\x91~\x1c\x9b\x14\xbb\xdaD\xf4\x0e\x99\xe2>\ +\x9fuM\x91\x11\xe2\xe2Z\xc2\xeb5\x98!>\xba\xa6\ +(\x97=\xc3C\xa6\xb8\x95V\xef\xf33\xb7\xd2j\xf5\ +2\xa3\xd5\xf8\x18i\xb5\xfa\x96\xd7]\xadv\x92\xf0I\ +\x02\xe7\xdf\x11\x11\x9bU\x88\xdd\x85u\xbe#\x13\xf8c\ +\xae3\xc5\x93D\x17D\xfa\x90)\x22cf$?D\ +4\xe1\x90xO\x13\x1d8\x9a\x18\x99\x00\xe1\x7f\x90`\ +\x8c]0E&\xc0\xc4\xd6\xb0W|0\xb0\x0e\xde\xc9\ +M\x87Lq\x11\xbdYS\xd4U\x80\x1f'F\x93\ +\xe2>\xd7O\x12]S\xd4=\xda\xf7\x92\xcby\xf9\x1c\ +\x0c\x5c\x93\xd05EB\xb7K\x8cLqvRT'\ +\xeaE\xddT0\xc5O\x13]\xd1#\xa4\xdf)\xf2\x17\ +?@m\x7f\x9e\xf8\xdd\x8b\xf7\x9d/\x04\x8f)V\x13\ + \xfe\xf6<3)2\x01G\x9d\x15&9\xcdMw\ +R\xb4\xa6\xb5G\xa6\x88\x0f\xebwaR\xc4I\xe5C\ +s\x80\x8f\xee\xa4H\xa0=\xc3\xadLq+\xad\xbe\x94\ +=\xdfH\xbcj\xad6\x00\xe0C\xadW\x18`4 \ +\xddz\xa1I\xf8x?\xf1-\x88\x09!\xf5\x10\x15N\ +\x07&\x00\x8972\xc5{\xb9>\xd3\x8d)\xc2Q\xf7\ +!\xf1\x88\xde\xccHNLGD\x13Rk\xcf\x10\xad\ +\x1b\xfb\x0e\xd1y\x0f\x0f\x12\x8f\x12]\x13P(7\x13\ +\x12e\x0d\xcfNr\xcc\x98\xa2u\x7f\xb1^\xf4\xc5\xeb\ +Wq|\x8a\x8f\x91)\x9e\xe4\xba\xe8\xf2A\xf4OtM\x91\xf0\x9b\x8a\x18A\ +\x05S\xb4\xe7\x19S\xc4\x87\xbdW|\x95\x0b_$\xec\ +\xbf\x83-\x8fO\xafdC#S\x5cN\x12\xba\xa6(\ +\x97=\xc3-L\xf1uh\xb5\x06\x956\xcdh5>\ +\xbeW\xad\xf6\x10\xfe\x9f\xc4\x1f\x13\x1d(\xee\xdb\x89j\ +\x02\x84n\x9f8ItA\xa4%^\xed>\xbe\xce\xb5\ +\xad\x88\xd6}\x10\x10F\xd3\xc1\xb1\xe3\xd3\xfbYPt\ +\xf1\xd3\xdc\xc8\x04F\xa6\xc8\x04f\x8eO\xad;2E\ +\xd3\x8b\xb5%w\x07\xf2B~(\xc8\x0a\xb9\xb1Ot\ +M\xf1\xc7\xb9WC&\x87\xd7`*\x9ea\xd7\x14\xe5\ +\x1b\xd1\x1b\x99\xe2\x22z\x7f\xc8\xe7\x1d\xbc\x97\x9b\xf0A\ +\xb0+\x1e\xe7\xc2\xddD\xd7\x04^v|:c\x8a\xb8\ +`\x8c\x15\x1aT\xa6\xe8k\x07\x9e\x9dg\xb8\x85)\xfe\ +\xcf\xac\xcbp/&\xd6\xa0uw\x12\xf8\xee\xe2\x83\xdc\ +H\x9b4\x0ck\xc8\x0b\xda\xa4Y\xe8`\xe1c\x0bS\ +\xa4\xd5\xf8\xa8\xc7\xa7\xeao\x9fP\x8f]\xfc<7\xe2\ +c\xa4\xd5jQ3\xd9\x01\xad\xbb\x95\x18\x99\xe2\x96Z\ +\xfd\xd8\x83\xe8\x9a\xe2\xd2\x9d\xd6I\xf1U$\x9eB\xdc\ +%*\xd1o\x8fOC\xca\x0a\x9a\x04\xc2\xf4\xfb\xd5\xb5\ +\xb3\xbc\xc4\xef!S\x5c&\xc5\xa7gYp\xf5\xbdL\ +\xf1\x93\xc4hR\xdc\xe7\xbaBT\x94\x1d(\x14\xfb\x96\ +\xbfk0p\xc2\xc4\xd0;\xc0\xc7.12E\x1c\x7f\ +\x96\xe8NF\xc7\x8eO\xefg\xdd\x07\x89n-\x12R\ +\x02R'E\xcf\x8e0\xcd\x98\x22\xc1\xd3(T\x10\xff\ +\x19SdX\xf6l\xea\xaf\xf8*\x17f&Ek2\ +\xdcj\x8a\xcfr\x8d)Z\xbf\x8b\xab\xb9\x11'\xd5\x14\ +5\x07\x9f&\xba\x93\xa2g\x87\x8f-L\xf1\xadV\x87\ +\xd8\x15\x86\xc7\xa7\xf9\x9c\x1e\xddM<\xac\xc2\xb2\xba\xf7\ +\xe8\xcbe$\x7f\xaf|\x97\x85\x15\xf9L7F\x94v\ +\x09\x22\xb5\x06A\x22z3#91\x1du\x1f\xa6\x0b\ +\xa2\xa7p:@\xb4n\x8c\x19T\x10\xbcG\x09\xdct\ +\xa0;\xbd\x91x\xb7\xdcL\xf4\xf01c\x8a7s\xff\ +hR|\x15\xa6\x88\x8f\x91)\x9e\xe4\xba\xe8\xf2A\xf4\ +<\xc7\x9a\xbb\x9e\x9dg\xb8\x85)\xeaxq=3)\ +\x12j]{\x85Z\x91#]S\x5cD\xaf\x9a\xa2\xc9\ +\xf3\xf3\xc4\x8c)^\xcb\xfd\x8c\xa0b\xd6\x14\xed\x15\x1f\ +[\x98\xa2i\xdc\xda\xd5\x14\xf1\xcbl\x7f\x93\xe8\xe2\x90\ +).'\x09]S\x94\xcb\xb7\x12[\x98\xa2\x9c\xb3v\ +\x1d`\xdejuH)X\xb4\xfa\xcf\xc4\xa5|\xdf\xf0\ +-\xa2o'F\xa6\xb8\xcf\xf5\x93D\x17F\xf2]\xa2\ +\x9a\xe22\x19\xcd\x98\xa2\xe4\x18\x99\xe2\x96#\xb9&A\ +t\xf1\xd3\xdcx\xc8\x14\x99\xc0y<>U\x80\xf2c\ +\xab\xe3S\xcf\xf1\x87\x895\x98\x22\x13\x989>\xc5\xf3\ +\xa5\xf5\xa2/^/\xa27c\x8a\x9a\x04G\x9d\x15L\ +\xd1\x043c\x8aL\x80\xd1\xac\xc1\x14\x99\xc0\x8c)^\ +\xce\xfd\x8c\xb1\xc2d4;)ne\x8a\xc7\x8eO\xef\ +f\xdf3\xa6(7\xae'~\x90XC^h\x9a4\ +\x0b\x1d\xc8e|le\x8ajqd\x8a\xfb\x5c?I\ +t\xf1\x97\xa6\xd5L\xf1\xdeBF\x15\x98\xe5\xfa\xa1\xaf\ +KwZ\x89V\xd8\x0a\x5c\xa1w\xa1\x10w\x89j\x8a\ +&E\x85\xd85E\xbf\xa3\x09\xe3\x90)2\x98\xa7\x89\ +\x0e^6\x92\x9b\x14\xbb0\xc9\xddL\xbc[\x16X\x9a\ +\x84\xee\xa4h=\xebZ\xbf\xc2\xb4\x85\xeb.\x1f&\xe6\ +O\x12\xa3Iq\x9f\xeb\x0a\xb1;)z~\x9ec\xcd\ +\xd9'\xb9F\x98f'E\xc2W\x81c\xf9!\x07;\ +P'\x1f'FM\x82\x86\xe9A\xa2k\x8a\x84\xf4V\ +\xa2\x9a\xa2g7;)2\x80+\x89\x0a\xe2?k\x8a\ +\xf2\x83\x81U0-f\xce\xd4;8v|j\xdd\x19\ +S\xbc\x9a\xfbG\xa6\xa8I\xf84\xd1\x9d\x14=;9\ +\xbd\x85)j\xc4\x18\xee_\x8aV/\xa7z]m:\ +\x93VW\x91\x09\x8f\x07\xa1\xb8\x15b%\x9a\xd0)\xf0\ +\xadL\x91\xe8uM\xf1\xdd\xdc+\xf1F\xa6\xf8*\x88\ +\x96x\xa3\xe3\xd3\x93\x5cg\x8a]\x13\xf8 \xf7\x9a`\ +\xec\x7f\x0dI\x81\x8f\xae)j:\xac;2E\xd3\xa7\ +\xb5\xbb\x89\x87\x07\x93\xd1\xc8\x14\x1f\xe6:N\xba|l\ +u|\xfa\x83\xec\x89\xe0]NT\xbc\xaa\xe3\xd3\x91)\ +\xaa\x155\xd35E\xa2\xa7\x16\x09\xeb\x1aL\x85\x09\xcc\ +L\x8a\xd7r?#\xa8\x985E{U/#S\xfc\ +*\xd75\xd6\xf6\xdf\x815\xad}\xb1\xdc\x8c_\xeb\xce\ +\x98\xa2\x06A\x8e\xc8\x955\x98\xa2&\xa1k\x8a?\xcc\ +\xbd\x9e\xe1\xc8\x14=?\xcd\xcd\xb3D\x07N\xf5\xf0\xb1\ +\x85Vk w\x09Z\xb2\x86\xe6qK\xad\x9e\xd1&\ +\x9a\x84\x8fSk\xb5\x87s\x1a \x9a\xe8\x8d\x88\xde\xe7\ +\xfaI\xa2\x8b\xd71\x923\xc5\x19\xa2\xff&\xf7;\xa2\ +\xa8&@\xf8M\x02\xa2\x8bc\xc7\xa7\x8a\x85\x81u \ +\x915\x09#S4m}\x96x\x92\xe8@^\xe0c\ +d\x02rc\x9f\xe8\x9a\xe2\x8fs/\x01\xa9\xb9J4\ +\x98\x80g\xd9\x01>4\x09\x97\x067\xbf\x8a\xe3S|\ +\xf8{W\xc5\xe3\x5c \xd6D\xbb\x03\xa76\x8a\xfcB\ +\xb9\x99\xa9\xe0\xe3\xb7\xe5\xfai\xdf\x12~\x5c\x5c\x1b\xdc\ +\xb0\x98\x80\xaf\x1d0,{\xde\xe2o\x8aL\x11\xd7#\ +S\xbc\x9b\xebL\xb7\x0b\x0d\xea.\x81\x9b5\xfe\x907\ +LQ\xb3\xd0\x81\x86\x17\x1f\x87LQ-\xce\x98\x22>\ +\xb6\xd2j5\xa3v\xd6\xf8:o\xe8\xa9f\xb2\x03|\ +\xa8\xf1-\x06\x98cZ\xad9\xbd7\xdap\x15\x9b\xd1\ +\xf7\x1c\x1a\xc9\x15\xa2\x02\xffrt\xd3)\xaf\xe9\xd4w\ +\x89J\xf4\xdb\xe3\xd3\xef\x12(\xf1\x14bwR\x94x\ +7\x13\x87LQR?It\xa0\x0b\xfb$Q\x9b\x04\ +k\xed\x13'\x89\xae)*\x94\x0f\x135O\xed\xd5\x9e\ +g\x8eO\x15\xf8\xa5D\xc5\xdb\xe3\xd3\xef2\xe2\xb4\x06\ +\xd7]S|/\xf7~\x9c``\x15&9fNK\ +:`\xb4\x0c\xa6\x9a\xe2\xd24\xcdL\x8a\x1a\x84\xab\x89\ +\x1f$\xd6\xd04\xa9\xc5\xee\xa4h\xafjqd\x8a\x9a\ +\x1a\xcdo\xd7\x14\x8fi\xb5&\xe1q\xa2\x8b7U\xab\ +\xe5\x1es\x5c\x83\x1e\xe1\xe3\xd1\xfa\xe2\xfau\x15\x9c\xf5\ +g^\x1f\x1b\xc9gM\x91(\xed\x12#ST\x883\ +\xc7\xa7\x12o\x8b\xee\x83\xf8+\xc4S\x8f\xe4\xf9\xde\xd3\ +\x82i\xd97\x13[Cw\xaaX\xba\xa6\x88_&0\ +2E\xd3'\xae\x9f$:\xc0\xc3/\x13#S|\x98\ +\xeb3\xa6\xe8$\x01\x1f5G\x89\x06>\xba\xa6H\xe8\ +\xae'\xe4_\xc5b\x028\xef\x80\x09\xc8\x8f\xd1\xe4L\ +\x94t\xa8\x7fLt@\xf4n%.\x94\x9b\x99\x0as\ +q\xfc\xd6\x01>\x16\x13\xa8\xf7/\x93s\xd7\x14\xed\xd5\ +\x9e\xb70EkZ\xbb\x9a\x22~i\xd3\x8c)^\xc9\ +\xfd8\xc1\xcd\x1axP/]S\x94\xcb\x1a\xbd\x91)\ +z~\xf2Z~w\xf0V\xab\xbf\xcb\x1a3T\x8b\xd5\ +\x14}\xd7I\x82)2\xc8!<\xa8C@\xf4\xed\xc4\ +\xa1\x91|fR$z\xc4\x9ah\xaf\xb1\xf5H.\xa9\ +\x9f\xae\x7f\xe0\x19^#\x18\x1f\xd5\x04\x90{\xffE\xe4\ +K\x0b?\xcd]L\xa0\x9a\xa2\xbd\xda\xf3\x8c)Z\xf7\ +\x83D\xc5\xac)\xca\x0b|\x8cL@\xe2\xed\x13\x07\x13\ +/\x9f\x1d\x83\xe3S\xfb\xae\xf9I4\x98\xc0\xbf$:\ + t\xf2N\xf7[\xb1L\x8a3\xa6\xa8I``\x15\ +\x8fs\x81X\x13\xed\x0e\xfe!7)\xf2C\xa6h\xd2\ +\xe8\x00\x1f\xbb\x04#\xa8`\x02&\xa3\xae)2,{\ +\x1e\x1d\x9f2-&\xc0\xd4;X\x8eO\xdf+7\xe3\ +\xf7n\xe2\xabr\xfd,o\xd5\xca.\x81\x9b5\xe4\x05\ +>\xba\xc7\xa7\x9e\xdd\xad\xc4!S\xfc,\x9f\xcd\x98\xa2\ +Z\xfc>\xb5\xfaI~\x1em:\xaf\xc7\xa7\x1fgo\ +U\xabs\xe9\xb9V\xdf\xf3\xe2\x18\xaa\xf0,\xdf\xab\xb8\ +\x15yM<\x89\xac\xc0gLQ\x11^O\xbc\x93X\ +\xe3<\x1f\x9f\xfa[\x91\x22\xaf\x93\x22\xe1W\x88\x0f\x13\ +](\xc4\x1b\x89j\x8a_\xe7\x9aB\xec\x9a\xa2\xf5\x98\ +\xcbhR4mIj\xc9\xdd\x81&\xe1P\xe2\xed\xf3\ +\x19c\xc4M\x07?\xcbM\xba\xea\x9a\x9bK!v'\ +E\xf9\x86\xe7K\x89\x0a\x1c\x7f\x9a\xe8\xf2A\x90\xf01\ +j\x12\xee\xe7\xfa\x83D\xd7\x14\x09)A%\xackh\ +\x9a\x88\xe9L\x93\xa0\x0eG\xa6\xb8L\xce]S\xa4\x1b\ +\xf8\x18M\x8ar\x03']S|]\xc7\xa7\xbf\xce\x9e\ +\xbb\xa6\xa8I`\x5c\xa3\xa6IS\xa3I\xe8\x9a\xa25\ +i\x93\x1c\x5c\xe3Uh\xb5\x06r\x97P;k\xbc\xc9\ +Z\xfdh\xfd\x8b\x1cz]\xc5\xc7\xf7-#y5\xc5\ +\xc5\x04\xbe<\xb4\xd8)\xae\x13%\xc58\x22Z\xe2m\ +u|*\xf1\x08I\x07\xba\x0e\xc2TM\xd1Z\x8a\xfc\ +TD\xfb\xe6\x01\x98\xd6!S$z]S\xc4\xafu\ +G\xa6hMkwM\x00\x0f\xf8\x18uc\x1a\x04\x9c\ +\xbcjS$\x1a\x9ea\xd7\x14\x7f\x90{\xe5\x9d\xfc\xab\ +XL\xa0\xcb\x87:!L#S|\x9c\xeb3\xa6\xa8\ +!\xc3u5E\xa2\xf7Eb\xc6\x14\xaf\xe5\xfe+\x89\ +\x8a\xad\x8fOgL\xf1u\x1e\x9fvM\xf1\x87!\xf8\ +fbd\x8a\x8eO=G\xf9\xdd\xc1\xa2\xd5\xd5\x14_\ +\x95V\xef\xb2\xa9\xaa\xd5\x7f\xc8\xb5\xf3\xaa\xd5\x1av\xf5\ +2\xd2j\xdaD\xabO\xa5M\x1e\xda\x1a/;>U\ +\xe8]\x1c:>%H\x88\xee\x8e\xe4\x1e\x1c2L\x1a\ +\x15\xff\x9a\x0b\xd6\xee\x9a\xe2r|\xeak\x85\x02\x17\xa7\ +\x22\xba\xde\x9c\xf7/;>\xfd\xf7\xc1=\xa7\xb9\x84\x8f\ +\x9b\x09\x93h\x855\xf1a\x1a\xed@\x01\xdeN\x8cL\ +\xe0$\xd7\xf7\x89.\x1f\x8eOG\x93\x22\xd1pJ1\ +c\x02\x9a\x84\xcb\x89\x8a\xa5IP\xec\x1d\x98\x04~\x99\ +\x18\x89\x9eZ\xb1\xef\xee\xa4hMk\x8fL\xd1\xba&\ +\x8d\x0e\x96&\xe1\xea\xe0\xe6e\x12\xe8N\x8a\xf6j\xcf\ +[\x1d\x9fZ\xfb\xbd\xb2o\xfc\xdeM|U\xae\x9f\xe5\ +\xadZ\xd9%p\xb3\x86\xbcpj\xd35E|\xd0&\ +S\x7f\x05S\xd4\xa0\xce\x98\xa2Z\x1c\x99\xe2>\xd7\xe5\ +_\x17\xc7\xb4\x1a\x1f3Z\xad\xc6\xad_A\xabg\x1a\ +\xf6W\xaa\xd5kc4\x01H\xbcj\x02\x12O\xd7K\ +\xf8\xba`Z\xc4\x9ah\xaf\xc1\x14\x91\xd1%\xfa\xdd\xdc\ +{-12Ek~\x9ex\x9a\xe8\x00\x0f\xf8\x18M\ +F\xb8\xb8\x9f\x985\x01\xfb_\xc3^\xedy\xc6\x14\x09\ +\x9eB\xafP\xdc\xb8\xfe\xba~p\xca\xf7\x17\xf3}\xf8\ +\x18\x99\xe2\xa3\x5c\xbf\x97\xe8\xf2\xf1\x0f\xb9\x97\x80\xac\xf3\ +1o\x9f\x8b\x86\x8e\xfa7\xde4@\xe8\xae$.\x0f\ +\xee5\x19\xe1\x9a\x19t\xb0\xf012E\xa7*\xc4Z\ +\xedt`R\xfc(QM\xe0\x9b\x5c\xb3\xae\xf5\xbb\xb8\ +\x94\x1bqR\x81\x07\xf9\x81\x97\x0e\x98\x80=\x1f2E\ +\xcf\xd1\xfe;\x90sr\xafN\x02\xf8\x95w\xf2\xaf\x0b\ +\xa7*7\x12re\x0du\x82\x8f\xae)\xcae&0\ +2E\xf5\x8d\x8fg\x89\x0e\xded\xad\x1e\x99\xe2\xa2\xd5\ +\xfc\xa0\x83E\xab\x0dv\x15-\xad^\x84\xc8\x82\x9f$\ +F\xdd\xc7\x9d\x5c\x9f\xe9>\x14\xa2\xc4\xab\xa6\xb8tc\ +3\xa6(\xf1FD;r\xfbu\xa2K\xb4\xc4\xfb8\ +Q\x9b\x84\x5cz\xde \xec\xf3\xb5k\x02\xf6k\xdf\xd5\ +\x14\x97B\xec\x1e\x17\xe2\xf7fbd\x8a&\xa3_%\ +\xfc\x8c\x0e\x08\x12\xd1#\xd8\x15Di\xc6\x0445\xf8\ +XrqY\xdf\xb3c\x5c3\x93\xe2.\xf7\x8fL\xc0\ +\xf1\xe9\xa7\x099\xd8\x01\xc3\xc2\x07C\xaf`ZDo\ +\xc6\x14\xd5\x22\xa3Y\x83\xa9\x10\xea\xdf\xae/\x9e\xf1\xf5\ +\xb5|\xbf\xa8&\xc0\x0c\xf1q^'E\xb5X\x9b\x04\ +\xfc\xca\x8f\xaf\x12]\xc8\x8d]\xa2\xf2\x81\x07\xf52c\ +\x8a\xb7r\xbfS\xa1\x0a\x93\xa2}?\xad\x1f\x9c\xf2\xfd\ +\x96ZM;h\xc8\x9b\xa4\xd54Z\xbd\xbcR\xad&\ +F\xce\xed\x15\xf9\xc8\x14\xf7\xb9>c\x8aL`d\x8a\ +DO\xe2uM\xd1\xbe=\xc0\x91)\xbe\x8a\xe3S\xdd\ +\xe9\x88\xe8\xfb\xb9.\xba\xa6\xa8PF\xa6\xa8H\x18\xf9\ +\xcc\xa4\x88\x0f\x89]aMk\x7f]?8\xe5{y\ +\x81\x0fyR\xf10\x17\x98b\x97\x0f\xd3\xc5\xc8\x14\x9f\ +\xe5\xba=w\x9b\x04B'\xef.'*\xe4\x9c\xb5\xbb\ +\xa6x1\xf7\xe2c4)\xaa\x95;\x09\xa2\xdd\xc12\ +9\x8fL\xd1\xba]S\xc4\xc7\xf5\x04#\xf0z\x0dM\ +\x02\xc3=\xaf\xa6\x88\xeb\x91)\xca\xbb\x19S\xfcE\xee\ +\xdf%*\x1f\xf2\x826me\x8a\xb8\x96\xdf\x1d0\xc5\ +\xdb\x89\xad\xb4\x9a\x86\xbcS6\xf6$\xefg\xb4\xdaz\ +j\xfc\x90V\xe3\xc3\xcf\xe8\x80F\xe3\xe3\x95k5\x83\ +9\xd4\x8d=\xc8g'\x89.L\x02\x87\x88FF\xd7\ +\x14\xdf\xcd\xbd\x88\xb6~\x855g\xba1\x04+D\x09\ +\xb8\x06\xe1\xc7\xc5\xfdD\xd7\x04\x96\xbf\xa1\xd9\xff\x1aO\ +\xf3\xc6\x9egL\xf1j\xee\x1f\x99\xa2\xe2\xc6u\xd7\x14\ +\xdf\xcf\xbd\x9a\xa6\x91)>\xca\xf5}\xa2\xcb\x07\x13\xb0\ +\xb6\x1c\x5c\x83h\x98\xb8fL\xf1J\xee\xbf\xbc^\xf4\ +\xc5k\x93\x11>\xfes\xf0\xd9i.]\xcc7\xc9\x8f\ +\x91)~\x99\xeb\xc4\xbak\x8a\x8e\xdc\xd4K5\x01\x93\ +\xa2u\xad\xdf\xc5\xa5\xdc\x88\x93j\x02x\xc0\x07^:\ +`\xe0\x9e\xa1\x06\xa7\xe27\xb9\xe09\xda\x7f\x07\xc7\x8e\ +O\xf7YP\xfeu\xc1\x14q]\xf9P'\xf8\xd8\xca\ +\x14\xf1!\xbf;8t|\xaa\xfe\xe8\xd2y\xd5\xeak\ +\xd9\xdb\xc8\x14\x17\xad\x9e1E\xb58\xd2\xea\x87/8\ +\xe9j\xd3O\x89R-D\x8b)\xc4\x99\xc4#\xd2\x12\ +\xef\x9d\xc4\x1aK7\xb6\x85)\x12\xd2_'f\x88>\ +4\x92/|t\x89\x96\x18\xcc\xbc\x9a\xe2R\x88]\x13\ +\xc0/\x9e\xf1]\xf1*\x8eO\xf1\xa1 +\xe4\x06N\ +\xba&`r\xbe\x95\xa8\xa6\xe8\xd9}\x9e\xf8k;>\ +\xbd\x94\xdf\xd9s\xacB\xcdT\x08uwR\xcc\xad\xcf\ +\x8fN\x89S]\x9b\x19~\x9a\xe8N\x8a\x17s\xafg\ +\xa8\xe1\xab`\x8a\x9e\xe3\x8c)\xca\xbd\xaaM\xf2\x8d\xb9\ +\xcc4\x09\x1a\x84]\xa2\xf2\x81\x87_%\xb62E\xcf\ +\xb1k\x8a/;>=\xcfZ=2\xc5-\xb5z\x1f\ +\x9e\x19cW\xab\xd5\xca\xf5*L\x16\xbb\x97\x98!\xfa\ +\xd8\xa4(\xf1fMqD\xf4\xab8>\xbd\x9d\xbd\x1d\ +\x1a\xc9\xf1\xd1%\xda$02\xc5\xa7\xb9\xce\xc8g&\ +\xc5C\xa6hMk3\xde\x0e~\x94\x9b~\x99\x18\x99\ +\xa2\xa4\xdb'\xba\xa6h\xba\x18\x99\x22\xd1 \x1e\x9ee\ +\x07\x84n\x97 |\x15r\x0e\x1f\x1a\xb3\x0e.\xe6&\ +|\x8c&\xc5\xc7\xb9~'\xd1\xe5C\xbd\xc8\x8f\x0a\xa6\ +\xa2\xf9\xe8\x9a\x22>\x14\xf9\xd5\x84\xd7k\x10\x7f|t\ +M\xf1B\xee\xfd(\xe1YV\xcc\x9a\xa2\xd3\x09\x5c\x8f\ +Lq\x9f\xeb3\xa6\x88\x8b\xeb\x89\xca\x87\xbc\xc0\xc7y\ +5E|\xa8\xc95\xb6\xd6j|t\xb5\x9a\xaf\xd0\xa6\ +\x91V\xbf\x0aS<\xa6\xd5]S\x94\x13\x97\x12\xf2\xe3\ +\xcf:\xf6\x07\xb9&\xbaX\x8a\xfc\x9d\xb2\xc0\x93\xbc'\ +z]\xa2\xdf\xcd\xbd\xc4\xd4\xfa\x15\xd6\xfc<\xc1h:\ +`\x86\x88\x1e\x8d\xe4'\xb9~?!\x09;`\x8a\xf6\ +m\xffk\xd8\xab=\xcf\x98\xa2\x22\x1fM\x8a\x8a\x1b\xd7\ +]S<\xcd\xf1i\xd7\x04^v|:c\x8a\x0cq\ +d\x8a\xb3\xc7\xa7L\xe0\x90)\x12\xe9\xbb\x89\x19>\xac\ +=\xc2>\x17\x99n\x17\x8a|d\x8a\xff\x99\xebD\xef\ +M<>%z]\xfc\x227j\x14F\xa6\xa8\x16\xfd\ +\xad\xb5\x03&\xa0\xc6\x9d\x82T\xfc.\x17\xac\xfd\xac~\ +p\xca\xf7\x1aS\xf9Q\x1bTzD\x97\xb6\xd4j'\ +N\x1d\xd0\xbaC\xa6H\xabi\x13?\xe8\x80V\xe3c\ +\x0b\xad\xf6\xfc\xec\xfb9<\xd4\x05'y1C4\x91\ +\xb6\xf0;\xcb\x82/\xbe\xea\xc6~\x95\x981\xc5\x0fs\ +\xff\xc8\x14u\x1f3&\x80\xe8C\xc7\xa7\xfb|\xd6\xed\ +>r\xeb\xf3n\xc9\xbe%\xca\x1a\x0c\xcb\x9e\xdf\x1e\x9f\ +\xfe\x89\x15EB<\xb6:>\x95{\xcc\xa0\x03S\xcb\ +G\x09\x86^\xc1\x14\xbfHtM\xd1\x11\xa4\xb5\xabP\ +\xe7\xd2\xf4\x9f2\x18\xc0\xc8\x04\x98\xe1\xa7\x89\xee\xa4x\ +1\xf72\x81\xbf\x94\xe3Sy\x81\x8f\xf3:)\xd2\xa6\ +\xd1\xa4x'\xd7\x1f%\xba\xd8Z\xab\xb7\x9a\x14\xb7\xd6\ +\xeao\xf9\x5c\x8cQ\x91\xef\x13\xdd\xc9\x88i\x8dL\x91\ +\xe8\xe9NgMq+\xa2M\x8a\xcc\xb1\xe2~.\xcc\ +\x98\xa2Iqd\x8aOs}\xc6\x14\x89\xe8\x8d\x84\xc4\ +\xae\x98\xfd\x9b\xa2\x02\x1cu\xa7~\x0e.\xf6\x89\xae\x09\ +\xfcc\xee%\xa8K\xbe\xe5\xe5s\xe8\xa4\xf113)\ +\xeer\xff\x95D\x85\x09`\xc6\x14\x99\x00>\xb68>\ +\xb5&S\xbc\x90\xa88\xc9\x05\xd1\x81\xfc`\x88\xa3I\ +\x91\xf8\xab\xc5\xae)\xda\xab={\x96\x15\xbf\xc9\x05\xcd\ +\xcd7\xf5\x83S\xbew|jm\x8d\xc8\x1a\xf2m\x9f\ +\xa0O]\xe0\xe2z\xa26 _\xe7\x9a\xfc8\xaf\xa6\ +(\xf7F\xa6x/\xd7\x1f'\xba\xf8K\xd3\xea\x07!\ +\xe2a\xa2\xeb]C\xad&T\x16\xbd;\xb10\xa2\x99\ +@\x9d\x14\x99\x22\xd1\x9b\x19\xc9o\xe5~\xebW\x10R\ +k\xfb\x19\x1d0\xc3\xdb\x89-FrD\xdbw\x9d\x14\ +\x9f\xe6\x1a\xf1\x98\x99\x14\x15\xf9\xa5D\xc5\x22z\x8a\xbd\ +\x03\x05\x88\x0f\x02U\xf1(\x17f\xf2\xc3\xb4E\xf4\xe4\ +\xda\x1aL\xf1\x8b\xc4\x8c)2DQa2b\x02\xdd\ +I\xf1B\xee\xc5\xc7\xc8\x14\x894>\xbaM\xc2\xdf\xe5\ +^\xa2\xe7g\xaca\xbd\x93\x04\xe1\xebBn\xc8\x91j\ +\x02x\xc0\x07^:\xf0\xec<\xc3C\xa6\xe89~\xd3\ +Y8\xf7\xbc\xec_\x9f>l\xae\xeb\xb6\x0f\x12\x1a\x85\ +\xca\x87S,\xb5\xf8\xa6\x1d\x9f\xca\x0dF\xd0\xc5\x96Z\ +\xcd\x03F\x03\x8c\xa1hK\xad\xc6\xc9\x8c)\x8e\xb4\xfa\ +\x8f5a\xceJ\xb8\xc4\x1bM\x8a\xaf\xea\xf8tD4\ +c\xd1\xe91\x9a\x0e\x8e\x1d\x9f\x12<\x85\xd8%\xda~\ +%H5\xc5'\xb9F\x98fL\x11\xcf\xf8\xae\xd0x\ +X\x1b\xe7\x1d\xf8\x9b\xa2#\x8a\xfaw\x0ckI:b\ +\xdd5\x01\xe7\xf6\x12\x8f\xb0\xae\xe1\xd9)\x96\xf3z|\ +j\xcf#\x13`\x8aL\xa0\xcb\xc7r|ZM\x11\x1f\ +w\x12&\xaf.\x18\x80\xa85\xfd\xf6\xf8\xf4\xbb\x8cj\ +\x12\xce\xf3\xf1\xe9\xc7\xd9\x9f\x9a\x5c\x83\x1e\xc9\x0fMj\ +\x17\xafK\xab\xd5\xf9\xd7\xcdM\xbf.\xad\xfe\xbc\x0a\xd6\ +Y\xf6\x7f9\xdf\xbcK\x8c&EB\xadS\xe8\x80\xa9\ +\x1c\xea>\x18\x8b\xb5\x09I\x07\x88\xd6\xad\xfbZ\xf1 \ +\x17fLq8\x92gM{\x9d5\xc5\x1bY\xe3\x90\ +)\xfe*\x9fu\x13\xcf\xa4\x88\x8f\x91)\xe2\x02'\xdd\ +&\x81\xb1\x8cL\xd1\xa4\xa8X\xce\xa3)^\xcc\xbe\xf0\ +qhR$N\x7fLtp\xe8\xf8\xd4\xa4ez\xf1\ +\x0f5:`\x84W\x13\xd7\x0773E\xf9\xf1\x1f\x83\ +\xcfNs\x89\x81{\x86[\xfcM\xf1\xd8\xf1\xe9\xbd\xfc\ +LMH\x17N\x11v\x09\xdc\xac\x81\x07\xb5\xe8\x84\xa5\ +\x03z\x89\x0f\x0d_\x85|\x96\xd7\xf2\xbb\x03\xa7Wr\ +od\x8a\xf7s}\xe6\xf8\xf4r\xee\xdf%^\x87V\ +?\xc9\xcf\xed`K\xad\x96\xcf<\xe6\xdd\xb2\xb1o\xb5\ +\xda\x83\xee\xc0d\xb4K\x8c\x88\x96\x1c3\xc7\xa76<\ +\x9a\x14g\x8fO%\xdc\xb1\xe3\xd3{\xf9\xbck\x02[\ +\x1e\x9f\xde\xcc\xbeF\xa6\xb8\xe5\xf1)S\xbc;\xc1\xc7\ +\xcb\x8eOgL\x91\xe8\x89\x0a&@\xf4L\x04\x1d\xbc\ +\x97\x9b>J\x1c2\xc5\x99I\xf1\xd0\xf1)Sd\xb6\ +3\xa6x)\xf7_KT\xe0\x81)\xe2\xa5\x03\xda\x80\ +\x8fC\xa6\x88\x0f\xfb\xef\xe0os\xd3\xc8\x044\x1d\xfb\ +\x84\xfc\xebB\xadh\x12\xaa)~\x9dk\xf8\xe8\x9a\x22\ +\x11=d\x8a\x9e\xdf\xe7\x89\xae)\x1e\xfb\xd7\xa7t\xe9\ +A\xa2\x0b\xc7\xa7\xbb\xc4[\xad\xfe\x13\x83\xa7\xd2\xea\x8e\ +1J%\xd4#S\xd4 \xe8\ +N\xbb\xa6H\xf4F\xa6H4\x88\xc7\x8c)\x12\xbc+\ +\x89\x8aYSd\x02\xa6\x97\x91)\x12i\xe2D\xb4;\ +0}\xe2\xa3\x9a\x22Sa\x02]Sd\x84W\x138\ +\xa9`\x8a\xf2\xa3k\x8a\xf6\xba\x95)\xe2X\xee\x8dL\ +\xf1^\xae\xcf\x9a\xe2.k\xe0f\x8d\xd9\xe3S\x0d/\ +>4|\x15\xf2Y\x9dwMQ\x0d\xca\xbd\x91)\xde\ +\xcf\xf5\xc7\x89.\xb6\xd2j\xda\xff\x17\xaf\xd5?<\x03\ +\xebL\x8bX#f\x0d\xa6\xf8y\x82`w \xf1\x98\ +\xcb\xc8\x14\xb7:>\xb5O\x06\xb0\xf7\xa2\x89S\x8d\xe4\ +\x8d\xb5\x97\xc4\x1b\x99\xe2y?>U\xe45\xa7\x88\x06\ +\x13\x981\xc5\xcb\xb9\x9f\x11T0\x01\xc2\xf4\x9f\xf5\x83\ +S\xbe'\xd0\x84z\xcb\xe3S\xc6\xbb\x06\x93e\xb63\ +\xa6H\xf4\xae\xad\x17}\xf1\x1a\x0fL\x11/\x1dxv\ +\xf884)z\x8e\xdft\x16\xce=L\xf1v\x02\xe7\ +k\xe0c\x9fx\xb8\xbex\xc6\xd7\xbf\xc8\xf7k\x12\xaa\ +)j\x1e\xe5\x87\xe6\xa9\x03\xda\x84\x8f\x91)\x9e\xf7\xe3\ +\xd3\xbf4\xad\xbe\x97\xe7\xd0m\xd8\xcf\xac\xd5U\xc4\x0e\ +%\x0f\x91\xd6%TS\xdc\xf2\xf8\x94)Jj\xd3W\ +\x07\xc7\x8eO\xeff\xc1\x99Bd\xe2\xcc\x5c\xe1\xac\xf1\ +$o\x08\xd3\xbf\xaf/\x9e\xe1\xf51S\xb4\xa6\xa9\x0b\ +\xe7\x1d\xe8J?N\x8c&EIw\x92\xe8&\x1e\xe1\ +\xb8\x95\xa8\xf9\xe4\xd9\xd9\xf3\x8c)\xeer\xff\xe5D\xc5\ +\xec\xa4H\xa0\x1da\x11\xec\x8a\xafr\x81y\x11\xed\x0e\ +\xfc\xc3#M\xc2\x85r\xb3&A\x13\xd95E\xcb1\ +DMB5\x01f8c\x8a\x0c\x5cN\x1f2E\xfb\ +\xee\x9a\xe2\x9bz|\x8a\x8fC\xa6(\xaf=\xcf\x0e\xfe\ +{n\x92{jr\x0d\xf5'\xef\x1e\xad/\x9e\xf1\xf5\ +\xeb\xd0\xeaWq\xaa\x87\x8f\xd1?\x8a\x5c\xb4\xba\xabM\ +\xc7\xb4\x9a\xbf\x0c\xff\xd4U\x85l\xf4\x0c.\xe5\xe2\xa8\ +\xfb\xd0\x9dJ\x8e\xee\xf1\xe9b\x026^a\xb3\xd6~\ +Z?8\xe5\xfbc\xff\xa2\x89\x010\xc5.\xd1\x84c\ +d\x8a\xf6\x8a\xe8\x19S\xc4\xb3\xc4\xae0\x8d[\xfb\xeb\ +\xfa\xc1)\xdf\x1f;>U\x84\x0f\x12]>\x88\x1e>\ +j.\x11\x0d\xcfp\xc6\x14\xaf\xe7\xfe+\x89\x8aYS\ +d\x02&\x81\x91).\xc7\xa7]\x13\xf8\xbb\x17kW\ +S\xb4\x1es\xe9\x9a\x22#d\x88\xe2U\x9b\xa2\xbd\xde\ +J\x1c2\xc5/\xf2\x99\xfdw\x80c\x5c\x8f&\xc5\xfb\ +\xb9\xfe&\x1e\x9fz\x8e\xf2\xbb\x03\x8d)>F\xa6\xa8\ +\x0e\x1fw\x16}q\xcf!\xad\xd6L\xd3\x8f\xad\xb4\xda\ +\xda]\xad\xc6\xc3/\x13#S|\x15Z}3k\xbf\ +\x9bXc\xd1\xea\xa1)\xfa\xc6*f\xeb\x9b\xbd\xf6/\ +\x9aF\xa6\xf8$\xd7g\x89V\x88#S\xdc\xfa\xf8\xf4\ +^~n\xd7\x04\x8e\x8d\xe4\xc4\xe3 \xd1\xf9\xec\x18\x96\ +&ad\x8a\xcb\xa4\xd85E\x82t;\xf1?\x07\x1b\ +`\x8a:\xd4.\x1fLQR\x8fL\x00\x1f3\xa6(\ +\xef.'*LFrOc\xd6\x01S\xc4\xc7\xdf\x0f\ +n&\xd2\xf6\xdd\x9d\x14\x99\x22>\xfc\x8c5\xacw7\ +1c\x8ar\xe3Z\xa2\x9a\x22\x1e~\x95\xc0K\x07\xf6\ +\xfa2S\xec\x9a\x00S\xc4\xb5\x1c\x5c\x03\x1f\xfb\xc4\xc3\ +\xf5\xc53\xbe~\x1d\xc7\xa7\xf2Y\xb3\xd75\x01\x93\xa2\ +\xfc\xf0u\x0d\xf5G\x97\x18c\x17\xc7\xb4Z~\xcc\x98\ +\xe2\x96Z\xfdq\xf66:\xc5\xc2\xc5\xab\xd0\xea\xeaq\ +\x9e\xddK\xb5\xba\xde\x94{\xbe\xc5\xa5\xbc\x22ND{\ +\x8d7\xf1\xf8T\xe2\xed\x13\x0a\xb1k\x02L\xfc\xc3D\ +\xed>4\x09\x12ofR\xd4\xd5\x10\xbe\x0akZ\xdb\ +\xcf\xe8@7v(\xf1$\xddI\xa2\xcb\x87#&\x05\ +SsH\xe2\x11\x8f-LQq[\xbb\xfb\x0fK\x08\ +\xb4#\x1b\x82]\xa1\x10E\xd7\x14M[&\x81\xda$\ +0\x15\x13F\xd7\x14s\xeb\xa6\xc7\xa7\xf2\x83\xa1W\xfc\ +&\x17\xec\xfb\x9b\xfa\xc1)\xdf\x1f:>\xc5\xc7\xdd\x84\ +&\xa4\x8b+\xb9\xf1z\xa2j\x93\xbcP/\xfe\x16\xdf\ +\x81g\xa7\xc6G\xc7\xa7\xf2YCf\xff\x1dh\xc4\xd4\ +\xcbhR\xbc\x93\xeb\x8f:\x8b\xbe\xb8\x87v|\xdfZ\ +m\x08\xc0\x87z\xef\xc0\x84\xa8\x16\xeb\xa4H\x8f\xf6\x89\ +\xad\xb4\xda\x9e_:\xc0TQ\xcb=\xcfq\x8ch\x0b\ +\xcft\x1fL`4)\xda,\xd1\x9b!\x9a0U\xa2\ +s\xe99\xc9[\x10m\xaf\xf8\xe8\x9a\xe2\x0fr\xef.\ +\x81\xef\x8a\xe5\xf8\xf4I\xfd\xe0\x94\xef\x7f\x94\xef\xc3\xc7\ +\xa8\x1bS\x84'\x89\xae\x09\x1c;>%\xa63\xa6H\ +\xf0.'*\x96\x7fx43)\xe2cd\x8aD\xfa\ +~\xa2\xcb\x07c!z\x17\x12kXOw:c\x8a\ +Ws\xbf\x90+k\x98\x10\x99@wR\xb4W{\xb6\ +\xf7\x0a\xfb\xb5\xefo\xea\x07\xa7|\x8fc\x5ckD\xd6\ + zL\xe0\xab\xf5\xc53\xbe\x96\x1b\xbbD\xe5C^\ +\xa8\xc5\xae)jxi\xd3!S\xfc,\x9fuM\xd1\ +\x84\x88\xeb\x91)j\xc6\x1e'\xba\xa0\x1d\xf6\xfdNY\ +\xc0\x00c\xcf[h5\xbd\xc3\xf5\xd3D\x07x\x90\x1f\ +\xdf\xa7V{v\xf8x\xa9)\xe6{\xfe\xac\xdbw\xcd\ +H>\x22\x9a@#\x83`w\xe0\xc1I\x8eC\xa6h\ +m?\xa3\x03D\xdfN\x8cL@\xe2\xddK(\xca\x0e\ +\x1c\x9f\xea\x22\x15\xce\x1a\x92\x82x\x9c\x8a\xe8\xf5\x8d/\ +^\xe3\xe3F\xe2\xd2\xe03\x89\xe7!~=\xf8\xec4\ +\x97\x08\x12>F\xc7\xa7\x0fs\xfdn\xa2\xcb\x07St\ +\x1cDX\xd7 \xa2D\xefw\xeb\x8bgxM\xe8\xf0\ +qyp\xcf2\x09\xcc\x98\x22>t\xed\x15L\xd1s\ +\x9c1E|\x5c,\x0b[\x0f\x1f\xbf)\xd7O\xfb\x16\ +\x1fD\xefz\xc2\xeb5\x16\x13\xe8\x9a\xa2\xbd\xaa\xc5\xd1\ +\xdf\x14\x99\xa2\xdc\x9b1E\x5c\xcb\xc15\xe4\x9b\xbc\x9b\ +1E\xc7\xa7\xbbD\xe5C\x9d\xfc*\xe1o\xcf\x1d\xa8\ +mB}\xcc\x14\xd5{\x07L\x11\x1f#S\xbc\x97\xeb\ +\xf4\xa9\x8b-\xb5\x9a\xe6\xe1\xbb\x82\xde\xcdj\xf5\xc7Y\ +\xe3uh\xb5?\xd3\x9d\x0a?,\xdfE\xa4w\x89Q\ +\xf7!\xf1\xba\xdd\x87\x9f\xc3lG\xa6h\xb3\x88\xee&\ +\x9e\xae\xe3\x93D\xed>\x14\xe2>\xc1\x08\xbc\xee\xc0~\ +%\x88\xc2YC!\xdaswR\xc4/>>HT\ +X\x13\xd7O\xea\x07\xa7|\xaf\x00\x0f%\x9eB\xae%\xae&\ +\xbc^c\x99\x9cgL\x11\x1f\xa3I\x91\x89k\x12\xba\ +\xa6\xa8ib0\xd5\x14u\xeb\x9a\x84\x19S\xbc\x92\xfb\ +\xaf'\xd4\xce\x1aK\xd3\xd4\x9d\x145xjqd\x8a\ +\x9a\xbc\xcf\x12\xddI\x11\xc7\x9a\xa6\x1f%\xd6P\x7f\xf8\ +x\xb4\xbex\xc6\xd7\x97\xf2\xfd\xbbD\xe5c\xf6O]\ +o\xb2V{\x8eU\xab\xe9(==\x93V\xaf\x05\x8e\ +H\x13\xa7\x11\xd1D\xafk\x8a\xd6\xb3\xee\xc8\x14mV\ +\xe2\x11\xd6\x0e\x98\x80B\xac\xa6h-\x86(\xba&`\ +\xbf#\xa2\x15\xc9\xe7\x893\x11\x9d\xef_@\xe8v\x89\ +\x91)\xe2\x18\xd7\x1ef\x07\x0a\x90q\x8d\xba1Ex\ +\x92\xe8\x9a\xc0\xdf\xe7^M\xc2:g\xf2\xf6\xb9\x88\xe2\ +c\xc6\x14\x09\xde\xc8\x14\x17\x13\xf8O?\xa8\x01\x93\x91\ +\xfc\x18\x99\x22\x91\xbe\x9f\xe8\xf2A\xf4p}!\xb1\x86\ +\xf5\x98\x8b\xc9\xab\x8b+\xb9qd\x8a\xccP~tM\ +\xd1\xb3\xb3\xe7\x91)\xda/\xb1\x96\xdf\x1d\x1c:>\xc5\ +\xc7\xdd\xc4\x8c)\xca\x8d]B\xed\xac!/\xf0\xd15\ +E\x22\xaa\xc6M^\x15\xfe\x1c \xaf\xbb|\x98\x14\xe5\ +\xde\xc8\x14Or\xfdq\xa2\x8bcZMO\xffZ\xb5\ +Z~\xaf\xe1\xd9\xe1\xe3\xccZ\xbd,\xf4v$_\xd3\ +\xf9\xdf\xfe\xdbO\xf2\x96\x09\xd4\xee\xe3i\xae\x11\x8f\xae\ +\x09,M\xc2\xa5\xacQ\xb14\x09_\xd7\x0fN\xf9^\ +\x97\xae;\x1d\x89\x1eS\xb4\xefn\x93\xb0L\x02\xd5\x04\ +L\x16L`\xe6\xf8t\x97\xfb\xaf$*\x96Iq\xc6\ +\x14\xf1a\xef\x15_\xe6\x82}\x13\xed\x0e\x96I\x80\xf1\ +\xaea=<\x9b\xbc: \xfcDO\xa3p\xc8\x04\xba\ +\xa6\xe8\xd9\x11\xeaC\xc7\xa73&\xc0\x14o'\xea\xa4\ +(\xdf\xf6\x09|w\xb1\xe5\xf1\xa9&\xe1\x90)\x12T\ +\xf5\xde\xc1\xcb\x8eO\x19c\xb7\x16\xed\xf7F\x82\x96\xac\ +\xa1\x99\xd6$\xfc~}\xf1\x0c\xaf\xadG\xf3\xb6:>\ +\x95\x1f\xf2\xa4\xe2A.\xdcKt\xf9\xd8D\xab\x19\xa3\ +\xc9hD\xb4\xa4P,]\xa2\x99\x8a\xaewD\xb4\xbf\ +\x05X\xdb\xc3\xec\xc0\x84\xa8\xc8G\x93\xd1\xc3\x5c\xbf\x9f\ +\xe8\x12\xfd\x8f\xb9W\x82\xd8\xff\x1a\xcf\xf2\x86\x98v'\ +\x01\x89w%12E\x1d/>\x1c\x83t@\xa0\x99\ +\xc0\xc8\x14\x1f\xe7\xfa>\xd1\xe5\xc3\xa4\x88\xeb\xf7\x12k\ +|\x937L\xa0;\x09\x10\xfe\xcb/\x22_\xbe\x83\xff\ +\xc8;\xc2\xe4k\x07\xf8\xb0\xe7\x91)\xda\xef\xddD\xd7\ +\x14M\x9f\xb8\xae\x93\x00>\xf6\x09|w\xc1\x14w\x09\ +\xdc\xac!/\xe4Gw2\xba\x90{\x99\xc0!S\x94\ +\xd7\xf2\xbb\x035\x88\x8f\xf7\xcb\xcd\xf8U\x87\xea\xb1\x8b\ +C\xda\xa4y\x94\x1ft\xa4\x03\xbaw-12Ez\ +\x87k\xfa\xd7\x01S\xc4\x87\xafk\xa8?\x86(\xba\xb5\ +\xe8\xb8\xf7f\xa2j\x93\xbd\xda\xf3y\xd4j\xba\x81\x8f\ +\x91)\xca\x8d\xad\xb4\x9a6u\x1b\xd4\xe7\xc7b6]\ +\xa1\x10g\xba\x0f\x89\xf7qb$L&\xa3_%\xba\ +\xa6H\x98>I\x5cLT \x9a\xe8u\x13O\xb1\x5c\ +I\xd4\xc4\xb3W\x85\xd8\x9d\x14\xadw;1\x12&\x93\ +\xd1\xa7\x09\xc5\xde\x01a\xb2\xf6\xe88\x99HK\x90?\ +&:\xc0\xc5\xd5\x84\xe7\xb9\x06\x13\x90\x1f\xddIQ\x93\ +\xf0Qb$L\xc4\x1f\x1f\xddI\x91@\xcb\x8f*L\ +\xb9\xf4\xdc\xc4\x09H\x97\x0f\xdd\xa9}W>\xacg\xdd\ +n!2\xc2\x0f\x13\xbfHTS\xd4\x1c\xe0\xa3;)\ +\x12&|\x8c\x84I\x93'\xaf=\xcf\x0e4\x91\xf4\xe3\ +B\xb9Y\xfd1\xdb\x99I\x91\x01\x5cJT>\xe4\x05\ +\xfd\xe8\x9a\xa2\xbd\xe2c\xd4D\xaaoy\xdd5EM\ +$\xdd\x1b\xf1\xa1\x0e\xd5cW\x9bv\xb9\xf7rB\xed\ +\xacA7\xec\x99\xaev\xb0\xa5V/'\x09j\xb2\xe2\ +a.\xcch5]\x12[h\xf5G\xb5\xc0m\xfeI\ +\x02\xd13\xdd\x87\xc4\x93$\x15\xff\x96\x0b\xd6\xf63:\ +@\xf4?%j\xe2Y\xebA\xe2^\xa2\x9bx\x97r\ +\xef\xf5D\x85\x22\xb1g{\xef\xc0\x83S,D\xa4\x02\ +\xc7\xd6\xee\x9a\x22\xf1\xc7\x07\xf1\xabx\x94\x0b\x8a\xb1\xcb\ +\xc7\xd2\xad\xd7u\x89(\xd1\x9b1Eb\xaa\xfb\xad\xd0\ +$\x10\xea\x19S\xc4\xc7\xdf\xd4\x85\xf3\xfe\xab\xc4\x8c)\ +\xda\xaf}Wab\x8ax\xfeM\xa2\x03\xc2o\xddQ\ +\x93\xf0\x87\x5cg\x023\xa6\x88\x0f\xcdS\xc5\xab0E\ +y]\x85I\xbe\xed\x13]S\xc4\x07\xc1c\x02\x15\xea\ +\x04\x1f]S\xbc\x98{i\x93\xe6\xba\xe2_rA\xee\ +\xa9\xf7\x0e\x18\xad\xb5\xab\xa6\xe2\xe3~\xe2Q\xa2\x8b\xa5\ +A\xad\xf7\xd3Q|\x9cg\xad\xc6y\xc5\xab\xd0\xea]\ +]4\xef\x9f%f\xb5\xfav\xd6\xf8q}\x88\x92\x82\ +xt\x89fX\x1f&F\xa6(\x99\xad\xedav\xc0\ +\x14%\xde\xc8\x14u\x1f3\xa6\xa8S\xb7\xef\x0aD3\ +\x81\x19S\xb4\xee\xc8\x14\x89\x9dB$~\x1d\xbc\x9f\x9b\ +\xf012\xc5\xc7\xb9~7\xd15E\x22\xfdQ\xa2b\ +1\xc5\xaf\xea\x07\xa7|\xcfTn$F\xa6h2\xc2\ +\x87\xaf\x1d\xfc(7\xe1\xe3\x90)2/&\xd6\x81I\ +\x9fyUS\xc4\xc7>\x81\xef\x0e\x98\xc0.q\xc8\x14\ +\xf1\xd1=>\x95\x17\xc7LQ^\xdb\x7f\x07\xff\x90\x9b\ +n'\xde-7\xe3\x97\x09\x9c\x94\xebgy{5\xdf\ +|}p\x03S\xc4\xc7\x16\xa6H\xefh\xd3\xd3D\x07\ +LQ\x93P\xf5T\xfd\xe1\xe2A\xa2\x8b\xcb\xb9Q\xcd\ +T\xd8\xeb\x8cV\xdb+m\xdaR\xabG\xa6\xb8\xa5V\ +\xe3cF\xabo\xe6~\xb5\xfe\x9d\x07\xe9!r\xdb\xee\ +q!\xd1\xb0\xf0H\xf4L\x00\xff\x9c\x90\xdc\x1d\x1c3\ +\x01\x9d\xef\xdd\x84\xfdw`2\xbau\xe0FD[\xbf\ +\x03\xa2'\xa1\xad_\x81\x07|\xfcg\xfd\xe0\x94\xef\x99\ +\x00\xa1\xc6K\x85\xcew\xc6\x04\xc8\xbd4\xb5\xc2\ +z\xb3Z\x8d\x8fQCF\x93h\xd3\x8cV\xe3Cc\ +V\xb1\xa5V\xab\xf1\x19\xad\xde\xe5\xfe_,\x1b^\x92\ +\x1b\xd1\xbfJ\xcc\x98\xe21\xa2\xff\xbf\xac=C\xb4B\ +\ +L_\x1dh\xc8W\xa6\x88\x9b5<\xbb\xcf\x13\xdd\xe3 \xb9\x8c\ +\x0f\x22R\xb1\x98b\xd7\x04L\x9f\xf8\x18\x1dU?\xce\ +\xf5/\xea\x0f<\xc3{\xa6x3\xa1v\xd6`\x8a\xf8\ +P\xeb\x1dhh\x98\xe2\xcf\x067\xff!\xd7\xe4\x9e\xaf\ +\x1d\xe0\x01\x1f\xff}p3\x91\xa6M]\x13`\x8a\xf6\ +m\xffk\xbc\xe9Z\xedyv\xb0\x95V\xab?u\xf8\ +gZ\xed\x03\xa2\xd2-D\x89\xec\x01\x8eLQ\x87\xa7\ +XfL\xf1\x93\xdc?J\xbc\x07\xb9.\x08I\x07\x0a\ +\xc5\xbe\xab)\x12\x0d\x827\xdb}\xfc\x19\xd1Y\x93\xf8\ +\xe3\xa3k\x8a\x04\x9a\xe81\xb0\x0a&n\xed.\x1f\xba\ +\xe9[\x09F\xb3\x06\xe3\xda'\xbe\x5c_<\xe3\xeb]\ +\xbe\x9f)V\x13\xc0\x03\xd1#\xd8\x1d\x5c\xccM\xf8P\ +4\x15\xbaSk?\xab\x1f\x9c\xf2=S\x94{~\xc6\ +\x1a\x0a{\x9fx\xb8\xbex\xc6\xd7W\xf3\xfd\xd7\x13\x95\ +\x0fu\xe2\x19v'#\xcf\xce3\xf4,+\x96&\xd2\ +\xf3\xec\x80)\xe2\xa36\x09\x84\xfa^\xe2$\xe1u\x07\ +:\xf5\x1b\x89j\x8a\x0c\x0b\x1f\xdd\xc9\xe8\xdd\xdc\x8b\x8f\ +\x91)\xd2;k\xffg\xa2\x03\x9a\x84\x8f\xf7\xcb\xcd8\ +X\xb4\xa9k\x02\xb4T\x93`\xffk\x182\xee$~\ +\xb7\xbex\x86\xd7\xc7\xb4Z\x13\x89\x8f\xee\xa9\x0d\x1e\xf0\ +1\xd2j\xdaa\xdf\xdf$:x\x1dZ\xfd\x1f?\xcc\ +N\xbb\xa6\xe8\xc1y\x80\x87LQ\xb7\xde\xedN\x11\xed\ +\x88bD\xb4\x22T\x8c\xddB\xd4M\x7f\x98\xf0\xbb\xaf\ +AD\x7f\x9d\xe8\xf2A\xe8\x14\xf8!S\xc4\x87b\xef\ +\xe0\xbd\xdc\xa4;\xfd\xbb\xc1\xcd\x8fr\xedn\xa2[\x88\ +\x1a#\x02RMQ\x22\x7f\x96\xe8v\xeb\xf8\xb8\x9e\xb8\ +\x9a\xa8`\x86\xb8f\x06\x1d0,|\xd8{\xc5W\xb9\ +\xa0\xc8\xbb\x85\x88c\x86\xebg\xac\x81_<\xe3\xbb\x03\ +|\xe0\xe2Z\xc2\xeb5\x08\x12>\xbaM\x93\x5c\xf6\x0c\ +G\xa68\xdb$\xfcm\xd6\xc5\xf5\xc8\x14\xf7\xb9~\x92\ +\xe8\xc2\xa4\xa8f\xaa)2\x01\xf5\xd2=I\xa0M\xf8\ +\x18\x99\x22\xa3\xc5u\xb7I\xa0I\xb4\x89FU\xdc\xcf\ +\x05\xd1\x85I\x91\xa6VS\xb4W{\xee6M\xd6\xc3\ +\xf3\xeb\xd2\xea\xae6\xbd.\xad\xfe\xb5\x82\xea@\x22{\ +\x80#\xa2\x17\xd1{\xd2Y8\xf7,\xa6\xa8 \xd7`\ +\x84Di\x9f\xf0\xba\x83C#9S4atM\x11\ +\x1fW\x12#S\x5cD\xafk\x8a\x04\x89P\x8fL\xf1\ +q\xae\x13\xebn\xe2\x99>\xad=2E\xe62c\x8a\ +\xb8\xc0I\x053T\xe4]S\xb4W{\xde\xc2\x14\x0f\ +\x1d\x9f\xce\x9ab\xb6\xfb\xfc\xef\xcd#S\x94\x17\xf8\x98\ +1E|\x1c2E\xcfQ~wp\xe8\xf8\x14\x1f\xf7\ +\x12\xb3\xa6HC\xd4\xce\x1aL\xf1\xb3\xc4\x16\xa6(\x9f\ +\xd59\xa3\xe9\xc0\xf1)S\xac\x0d;=z\x90\xb8\x9f\ +\xe8\x82)~\x98\x18\x99\x22>\xba\xa6\x88_<\x1f\xd2\ +jk\xcfh\xb5\xa6\xe9M\xd2jM\xa9\x06\xf5r\xa2\ +b\xd1\xea\xff\xec\x18#\xa2=\xc0\x11\xd1\x1e\x9e\x22\x97\ +\xdc\x1d0\xc5O\x125\xf1\xac\xb5\x14b\xd7\x14u\x8f\ +\xf6]\x7fgI!9\xbaG6\x88\xde%FD+\ +n\x9d\xef\x8c)\xe2\x83@U0\xc5;\x09\x22\xd5\x01\ +!\xbd\x95\xa8\xa6\xf84\xd7\x88G\xf7\xc8&\xb7~\xfb\ +\x0fmp\xb3\x06\xf1\xc7G\xd7\x14/\xe6^&\xa0\xc1\ +\xa9\xf8*\x17\x98\xc07\xf5\x83S\xbe_\x9a&?c\ +\x0d\xfc\xe2\xc3\xfa](\xc4\xeb\x89\xca\x07\x1e\xf0\xd15\ +E\xcf\xce3\xde/\x0b\xd3\xa3\xbb\x09M{\x17\xb4\x94yUS\ +\xfc:\xd7\xe8\xe9\x8c)\xbe\xd5\xea\x10\xf8\x02\xeaO\xde\ +\xbdT\xab\xabI,\x0b\x1c\xfa\xea\xc1Y\xf8\x90)J\ +jF\xd3\x81\x84\x1buc\xd6:y\x11]S<6\ +\x92\x13\x8f\x19S<\x15\xd1~\x893\xe2\xbd|\xbfn\ +ld\x8a\x8aP1vM\xf1\xd8\xf1\xe9\x8c)J\xbc\ +\xeb\x09FP\xf1*L\x11\x1f[L\x8a\xc7\x8eO\xf7\ +\xf9\x99_\xd5_\xe6\x94\xef\xf1q%\x81\x13\xaf\xd7X\ +\xba\xd3\xae)\xaa]&p\xc8\x14=\xc7\x19ST\x8b\ +#S\xdc\xe7\xfa\x8c).|TS\xa4\x1bL\xe0\xbc\ +\x9a\xa2\xdc\xab\xa6\x98K\xcf'E\xf5\xd8\xd5&\xcfo\ +d\x8a\x1a\xd4\x19S|S\xb5Z\x83\xca\xcc\xab7=\ +\xcb\xb5\xefM\xab\xeb\x0f\xcf\xcf>\x08\x89\xec\x01\x8eL\ +q\xab\xe3S\x9by\x98\xd8'\xba\x89\xc7\x14M\x19\xf5\ +wE4\xf1\xe8\x9a\x22>\x14\xf9\xa8\xfbXDof\ +R\xb4\xe7\xd7q|\xda\x9d\x14\x09?.F\xa6\xb8L\ +F\xddI\xd1d\x84\x8f-L\xf1\x7ff]\xa2w1\ +\xb1\x86\xa6\xe3n\x82\xe8u\xf1An\x1c\x99\xa2\xbc \ +z3\xa6\x88\x8fC\xa6\xf8E>\x93\xdf\x1dh\xc4\x98\ +\xa2c\xc35\xd4\xdf>q\xb2\xbex\xc6\xd7\xfe\xa6\x88\ +\x0f\xb5\xb3\x86\xc9H-:a\xe9\x80\x09\xdcJ\x8c&\ +\xc5\xad\x8fO\xefu6\xfc\xe2\x9e\xd7u|*\xf7\x9e\ +4\xf7\xad9P/\xf5\xf8\xd4r\x0f\x13\xfb\x84\x5c\xe9\ +`9\xb5y\xedZ]7p\xe8\x97\x91\xc8\x5c|d\ +\x8a\xc6|N.\xb9;@\xf4'\x89\xd1\xf1\xe9>\xd7\ +\x15b\x97h\x852\xea>$\xc5l\xf7\xb1\xcb\x1a#\ +ST\xdc&\xe7\x19S\xc4\xc7hR\xfc2\xd7\x1dc\ +u'EBJ@\x18\xcd\x1aO\xf3\x860uM\xd1\ +Z\x04O\xa3PA\xfc\xf1\xd15E\x86e\xcf\x8a\xa6\ +\xc2\xbf\x1ef\x02\xdd\xc9h)\xc4\x91)\xe2\xe3\xab\xfa\ +\x03\xcf\xf0^\x83\x80\x93:)\xe2\xe1\xd3\x84\xe6\xa9\x03\ +\xcf\x0e\x1f\x87L\xd1\xbe\x9fu\x16\xce=rN\xee\x8d\ +&EU\xe4#S\x5cD\xef\ +\x0f\xf9\xbc\x83\xf7r\x93\xc4\xfb\xfb\xc1\xcdDifR\ +\xb4&\xc3e4k\x98\xb4L\x02\xddI\xf1\x07\xb9\x17\ +\x17#S4\x19\xcdL\x8a\xf8\xf0\x0c\xb70\xc5\xbf\xc4\ +\xe3\xd3YS\xbc\x1d\xae\xab\x09\xa8\xbf}B=v\xe1\ +\xf8t\x97\xa8\xa6h2\xb2g]{\x07LQ~\x8c\ +&\xc5\xbf\xd6\xe3\xd3\xad\xb5Z\xddT<\xcc\x85}\xa2\ +\xab\xd5\xcb\xa9\xcd\xab\xd6j\xdat%\xd1\xd2\xea\xba\x99\ +\xac\xf3-$\xde\xcd\xc4\xc8\x14\x97I\xf1\xe9\xb7\xdf}\ +\xb6\x17\xef\xe7\xdb\x1d\xd9\x8c\xba\x8f}\xae+\xc4.\xd1\ +\x0aE\x82\xd4\xdf\x8d\x81\x7f\x96\xe8\x9a\x22\xa2w\x89\x11\ +\xd1\x8a\xfb\xd7\x09\xff\xaa\xae\x03M\xc2\xc7\x89Q\x93p\ +?\xd7\x1f$\xba\x93\xe2\xf27\xd6j\x8a\x9e\x1da\xea\ +\x9abn\xfd\xf6\xf8\x147k\xccN\x8a\x17\xb3\x18>\ +F\x85\xb8\xd5\xf1\xe9\xb3\xfc<\xcd\xc7\x16\x93\xe2\xd2$\ +\xe0\xa5\x03\xcfNN\x8f&\xc5\xdf\xe6\xba\xe7h\xff\x1d\ +,'\x09rp\x0d\xf5\xa7iz\xbc\xbex\xc6\xd7\x97\ +\xf2\xfd7\x12\xd5\x145\x8f\x9f&\xba\x93\xa2\xda\xc6\xc7\ +\xc8\x14\xd5\xb7:\x97\xdf\x1d\xd0$\xb9w\xa8I`\x04\ +]\xd0R\x9a\xfanY@\x93\xa0\x89\xfc}\xb9~\xda\ +\xb7\xf8\xc5\xc7\x9b\xa6\xd5?\xcd\x9eo%\xb6\xd0jy\ +'\xff*N\xa5\xd5uC\xcb\x22\x88\xb6\xf0VD\x1f\ +\x1a\xc9%\xddI\xa2k\x8a\xba\x0f\x09R\x7f/\xa2\xa1\ +X\xba\xa6\x88\x8f]\xe2r\xa2\x02\xd1\x92\xfa\x0f\xf5\x83\ +S\xbe\x7f/\xdf\xf7Qbd\x8aD\xe9A\xa2k\x8a\ +\xc7&Eb\xda5\xc5\x1f\xe4\xdek\x89\xd1\xa48k\ +\x8aL\x00\x1f#SdZ\xc4\xfa\x9bD\x07\xd6\xb46\ +\xe3]\x03\xbf\xd6e\xba]\xe0\xe2z\x027k\xcc\x9a\ +\xa2\x5c\xbe\x95\x18\x99\xe2\xab8>\xb5\xf6\xc8\x14\xef\xe5\ +\xfa\x8c)\xaa\x95]B\xed\xac\xa1y\xd4DvM\x91\ +\xa9\xa8\xf1C\xa6h\xed\xae)2C\xdaTM1\x97\ +\x9e\xeb\xd2\xc3|\xedj\xd3\x07\xb9\xf7F\xc2\xfe\xd7\xb0\ +\xd7\xcf\x123\xa6x3\xf7o\xa1\xd5\xf2bK\xad\x96\ +{\xf2{\x0dZM\x9bf\xb4Z\x1d\xca\xbf\x0a9w\ +*\xad\xae\x9b\xb2\x90D\x96x#\xa2\xffZ\x8fO%\ +\xf4\xa8\xfb8\xef\xc7\xa7\x92\x9a\xd1\xac\xc1T\x98\xc0\x8c\ +)J:\xc6X\xb1\x98\x80\xaf\x1d0,\xc6\xa5\xc1\xa9\ +x\x15\xa6x;\x8b\xfa\x19k0\xc5\xbb\x89\x19S$\ +z#S\xd4,)\xc4\xee\xa4HD\xf1q\xc8\x14\x09\ +*!\xe9\xe0\x7f\xe4&|\x8cLq\x9f\xeb'\x89.\ +\x8e\x1d\x9f\xe2c\xc6\x14\x89\xe9\xc8\x14_\xc5\xf1\xa9I\ +\xb1\x9eb1\xc2\x07\x09\x8dB\x17&\xa3C\xa6\xc8\x04\ +\xe8j\x07[k5>F\x0d\xbb\x06A\xcd\xe0\xa6\x03\ +\xf5-\xaf\xab\xff\xc8e\xda\xe4Yv\xf0\x83\xdctL\ +\xabOe\x8a~p\xdd\x98B<\xd6}\xe8\xc6\x9e\xb8\ +\xb1\x81\xf7s\xcf'\x89\x9ax\x96\xda'\x14b\x97h\ +\x85\xc2\xcc\xeb\xefc\xaf\xf6\xdcMF\xa6\xb8\xcfu\xf5\ +\xd8\xc5\xcfs\xe3\x8d\x84\xdaY\x83n\xc8\x0f]{\x07\ +\xf8P\xe3\x87L\x11\x1fO;\x0b\xe7\x1ef\x88\x0f\xcd\ +\xc2\x1aK\x93po}\xf1\x8c\xaf\x1d\x9f\xdeL\xd8\xff\ +\x1a\xf6*\xa7\xbb\x0d;~\xad+\xff*\x96\x01\x06\xe7\ +\x1d,Z=jP\x1ffA5\xd3\xd5\xea\xad\x8fO\ +/\x0f~\xe1\xb6V3\x14\x0f\x0e\xd1#S\xf4\xf0$\ +\xf5\x93D\x07&\xc5O\x12\xa3Iq\x9f\xeb\x0a\xb1K\ +\xb4B\xf90\xe1wX\xc3^\xedy&\xf1v\xb9\xff\ +R\xa2B7\xa6\x10O=\x92\x97\x05$\xde\xc7\x89Q\ +\x93p?\xd7\x1f$\xba\xa6HH\x09H5\xc5\xa5\x10\ +g&\xc5\xebY\xf7J\xa2\x82\xf83\x81\xae)\xbe\x97\ +{\x09\xd3\xdf%*\xe4\x06N\xba\xa6\xe8$A\x93P\ +M\x91\xa9\xdcI\xcc\x98\xa2\xa9Y\x93PMQ!\xca\ +\xbd\xae)zvrzd\x8a\x9a\x1a\x82j\xff\x1dh\ +\xc4\x18n5E\xfc\x12\xbc\xc7\x89.\x88\xd2.\xf1N\ +Y@\x9d\xc8\x8f\xee\xa4\xa8\xb6\xf112EM\xafZ\ +\x94\xdf\x1d\xd0$\xdaD\xa3\xd6\xa0G\xf8x\xb4\xbex\ +\xc6\xd7\xb4\x94\xa6\xbe[\xeecX\xf8\xe8N\x8a\xd6\xb3\ +\xeeH\xab\x99\xa2\xb5\xe9_\x07x\xc0\xc7\xf7\xad\xd5\x9e\ +awR\x94o\xbb\x84\xfc\xab8\xf3\xf1\xe9z\x01\x89\ +\xa7Xt7\x15\x88\xb6\xe9\x19\xa2\xad=\x22\xfaa\xae\ +\x13>I\xd8\x81\xeeT\x82\xd8\xff\x1aD\x83xtM\ +\x91\xd0]O\x8c\x88\xfek=>e\x02\xa2b\xe9\xc6\ +\xba\xa6x!\x0b\xdeJ\x8cL\xd1\xa4x/\xd1m\x12\ +t\xbcr\xaf\x9a\xa2\xf5fM\xf1J\xd6\x90#re\ +\x0d<\xcc\x98\xa2\xbd\x1e2EM\xcd\x17\x89\xae)\x1e\ +;>e\x023\xa6x)\xf7\xef\x12Dj\x0d\xa6H\ +?\xba\xa6\xb8\x98\xc0\xc8\x14\xd5\xb7:\x7f\x9a\xe8\xc0\xa4\ +(?\xaa)Z\x8b.1\xc5\xae6\x1d3E|t\ +Mq1\x81\x91)ZS\xeeu\xb5Z\xb3\x84\x8fC\ +Z\xfd0\x9fu\xf9\xd0\xa0\xca\xebCZ\xdd5\xc5\xd3\ +huw\x80\xb9`\xb3\x87L\x11\xd1:\x9c\x0e\x10m\ +\x12\x18MFHV\x8c]\xa2\x1d\x9f\x1e2E\xe2\xd1\ +=>E\xf4\x8d\xc4\xc8\x14%\x9e\xa4\xfeC\xa2\x83\xf7\ +r\xd3/\x13\xba\xf6\x0a\xa2D\xac\xbb&`Mk_\ +H\xac\xf1M\xdeX\xf7\xb7\xeb\x8bgx\x8d\x8f]b\ +\xc4\xc72\x09tM\x91\x09(\xc4c\xc7\xa7]>\x98\ +\x22>p\xbe\x86\xf5\xe4\xddW\xeb\x8bg|\xfdA\xbe\ +\x7f\x97\xc0\xcd\x1a\xf2B\xb7\xde\x9d\x14\xedU\xb7>\xaa\ +\x17\xa6(\xf7fL\xf1v\xee\xaf\x93\xa2\xfa\xdb'\x1e\ +'\xba\xd0\xa0\xdeHTS$\xd0\xf4\xa3{|j=\ +bj\xfd\x0aB\x8a\x8f\xae\x09\x1c:>\xf5s\xee\xbf\ +\x88\xae6\xd1R\xda\xc4\xd4\xd7x\x9a7\xf80lt\ +\x80\x0f\xeb\xca\xbf\x0akZ{V\xab\xd5M\xc5\xacV\ +\xbf\x8e\xe3\xd3E\xab\xbb\xa6(?>\xa9.\x8e\x18\xdd\ +\x18\xa2\xbb\x89\xa7\x0bS\xe4\xa3\xeec\x9f\xeb:\xb2n\ +\xe2\xe9\x1eG\xdd\x87\xbd\xdaswR\x94x\xbb\xc4\xc8\ +\x04\x10\xfdi\xa2\xcb\x07A\xfa81\x12\xbd\xfb\xb9\xfe\ + \xd15\x01Gn\xb7\x12\xd5\x14\x15\xa2\x8ez\x8b\xe3\ +S\x13\x00a21v\xc0\x04\xf01*D\xb9\x81\x13\ +\xa6\xde\xc1R\x88\x8cw\x0d\xa6\xa2i2\x89vq-\ +7^MTS\xc4\x83\xdc\xeb\x9a\xa2\xfc\xf8_\x09u\ +S\xa1\xa9\xf1\x1c\xbb\xa6\xa8i\xd2\x80\xf8\x19k\xe0W\ +\x930c\x8aje\x97P;k,MSwR\xa4\ +I7\x13#S\xd4\xf4\xca=\xf9\xdd\x81\xd3\x09|T\ +\xae\xe9\x11>\x1e%\xba\xdad\x92\xb3\xefj\x8a\x0cK\ +\xd3DG:\xb0\x9eu\xad_\xf1V\xab\xbf\xcb\x08\x8e\ +q\xddm\x12\x9c\xac\xfcS\xe2=I\xb8\xc6\xe2\xb6]\ +\x13\x90p\x12od\x8a\x0fs]t\x13\xef\x90)\x12\ +\x0d\xe2\xd15EBw=\xa1\xd0+\x147\xd1\xeb\xf2\ +\xc1\x04\xf012\xc5/s}\xc6\x14\x15\xf9\xc8\x14\x89\ +\x1e\x13\x981E\x06p%Q\xb1\x98@wR\xbc\x90\ +\x05\xedyd\x8aL\xeb~\xc2\xfe;\xb0\xa6\xb5\xab)\ +j:\xee$fL\x11\x17\x8c\xb1\x9a\x22\x1efL\xd1\ +^5\x09U\xa8s\xe9\xf9\xc9\x87\xe7(\xbf;P\xe4\ +r\xaf\x9a\xa2\xfa\xbb\x9b\x981\xc5\x0fr\xff.\xf1N\ +b\x0d\x933>\xba\xa6h=&02E\xf5\xad\xce\ +\xbb\xa6\xf87\xb9W~\x8c\xb8\xa6K3\xa6h\xbf\xf6\ +=2EF\xde5E|\xec\x12#S\x9c\xd5jy\ +!?FZ\x8d\x0b\x9c\xbc\x89Z\xdd5E\xf9\xa1\x16\ +i\xf6w\xce}%\xb5\xc4\xeb.\x8c\xe8_&F\xa2\ +\x87d\xc5\xd8%\xda$\xf0a\xe2\x87\x895\x88\x06\xd1\ +\xd3Iv@\xe8n$F\xa6\xe8\x18H\x91\xe3\xa5\x03\ +\xa2\x87\x0f]{\x05Q\xb2\xef?\xd6\x0fN\xf9~\x99\ +\x04.\x94\xefg*\xd65it\x80\x8f\xeb\x89+\x09\ +\xaf\xd7X&\x81\x19S\xc4\x87gY\xc1\xb4\xe4\xde\x8c\ +)Z\xfbyR\xaf\x16\xc7\xaf\xbc\xfbju\xed\xac/\ +\x89\xd2.Q\xf9\x90\x173\xa6\xe8\xd9\xc9\xe9Q\xd3d\ +\xfa\xc4G\xd7\x04\x98\xe2\xed\xc4\xc8\x14\xf7\xb9.\xff\xba\ +XL\x80h\xaf\xf1$o~\x95P7\x1dX\x8fq\ +\x8dL\xf1_s\x9d\xc1\xf8\x19\x1d\x10=|\xf8Zq\ +?\x17DW\x9b\x9c\xdax\x8e\xd5\x14=;\xf9\xe1\xa8\ +\xb3\x03|\xdcLhB*\xaci\xed\x19\xad\xc6\xc7[\ +\xad\xfe\x13\xb3\xb4\xfa;M\xd3b4\x12\xee\x9f\x13]\ +\xd1\xb30a\x1a\x11\xfd(\xd7\xf7\x89n\xe2\xfdC\xee\ +\xfd(\xb1\xec5/\x9fc1\xc5\xae\xe8\x11:\x060\ +2E\x93\x91Bd\x06\x1d,|\x8cL\xf1\xcb,H\ +\xac\xbb\xa6hR\xc4G\x15=\xa6b]\xebwq)\ +7\xe2\xa4\x9a\x00\x1e\xf0\xd1=>e\x02\xf6|\xc8\x14\ +MF]Sd,r\xafN\x02\xf8\xbd\x97\x90\x7f]\ +0E\xe2T\xf9 H\x8c\xab;\x19\xc9ebJT\ ++p\xfdiBMv`\x02\xc0G5\x01|\ +|\xad8\xc9\x85}\xa2k\x8a\xf6k\xdf\xf6\xbf\x06\xc3\ +b\x5c\xf6\xde\x81|\xbb\x91\xb84\xb8\x19\xc7\xbfJt\ +MqK\xad\x96\xcf\xf2Z~\xaf\xf1,o<\xc3\xad\ +\xb4\x1a\x1fj\xb2\x83\x83Z\xed\x97\xf8\xbf\x12\xdd\xc4C\ +\xf4\xed\xc4\xa8\xfbx\x98\xeb\x8a\xb1\x9bx\xa6\x0b\x897\ +\x22Z\xe2\xfdk\xa2\x83%\xf1.\x0fn\xd6\x9dz\x88\ +]a\xba\x98{5\x09\xa3I\xf1q\xae\xdfI\x10\xed\ +\x0e\xac\xc9pG\xa6\x88\xe7\xae)\xe2\xe3z\xe2j\xa2\ +B\x93\x80\xeb\x19S\xc4\x87gY1k\x8ar\xce\xda\ +\x92{\x0d\xfc\xee\x133\xa6\xf8\x8b\xdc\xbfK\xe0f\x0d\ +y\xa1\x10\xb70E\xc2\xa1I\xe8\xd6\xe2\xb1\xe3\xd3{\ +Y\xf7Q\xa2\x8bc\x93\xa2z\xe9\x9a\xa2\xc9sKS\ +\xa4M#S4%\xceL\x8a?y\xb1\xefj\x8aO\ +s\x1d\x1f3\x93\xe2\x8d\xdc\x7f)QaMk\xcf\x98\ +\x22>\xb6\xd2\xeaC\xa6H\xf3\xb60\xc5E\xab\xbb\xa6\ +x1\xfb\xa2\x1f#\xad\xfe\x1d\xd3y\x92\xe8\xe0\xfd\xdc\ +D\xa8GD+\xc2}\xa2k\x8a\xa6-k\x8fL\xd1\ +$0c\x8a&\x81\x91)\x9a\x8c\x98@\x97h\x86u\ +\x88h\x22\xcd\xbc\xba\xa6h\x1a\xb7\xf6{\x895LZ\ +\xd6}\xbc\xbex\xc6\xd7\x8a\x10'\x15x\xc0\x07^:\ +\xc0\x87gx\xc8\x14=G\xfb\xef\xe0os\x13>\xe4\ +\xe0\x1a\x8b)>\x5c_<\xe3k\xa6h2\xaa\xa6H\ +\x90\x18\x97f\xa1\x03\xb9L\xba\x89g-\xc2$\xaa\ +\x09H\xbcO\x133\x93\x22>\x88H\x85\xfd\xda\xb7\xfd\ +w\xc0\x14\xe5^m\x12\xf0\x8b\xe7\x99IQ\x11\xee\x12\ +\x95\x0fy\x81\x8f\xad&E\xa2\xf7,\xd1\x01\xf1\xff8\ +Q\x9b\x04&p'\xf1(\xd1\xc5\x07\xb9Q\x93PM\ +\xd1\xe4\xfc\xeb\xc4\x8c)~\x98\xfbG\xa6\xb8\xe5\xf1\xe9\ +>?\x931\xe2\xa6\x03\xfb\xb5\xefj\x8a\x0c\xcb3<\ +\xaf\xc7\xa7o\xb5:\x0f\xe7\x05N\xa5\xd5\xd5|\x96\x9b\ +\x8f}e\x8a\xb7\x13#S\x94t\xfb\x04\x91\xea\xc0t\ +12E\xa2!\xf1f&\xc5]\xee'|\x15[\x8e\ +\xe4\xb3\xa6h\xcc?d\x8a\x9a\x8f\xae)\x12~\x86(\ +*\x88?\xd1\x9b1E\xdd\xfa\xa1I\xf1\xf3|\xd65\ +E\xa7\x13\xd6\x1e\x99\xe2>\xd7gL\xf1j\xee\xbf\x9e\ +\xa8\xa6H\xf44M[\x98\xa2Iq\xd6\x14\xf112\ +\xc5{\xb9>c\x8a[\x1d\x9f2\x95-M\x916\xfd\ +M\xa2\xe2A.\xcc\x98\xa2\x06\xd5\xbe\xed\x7f\x8d\xa7y\ +3c\x8a\x9a\x8e\x1b\x89\xd1\xa4\xa8\xf1\x90{r\xb0\x83\ +\xbf4\xad\x9e\x1d`.\x86D\xf52:>\xfd\x8eV\ +\x9f\xd5\x18\x15\xa0I\xe0\xd8\xf1i\xd7\x14M[\xd6\xae\ +{b\x8a&\x81\x19Sd\x88#S\xdc|$\xcf\xcf\ +\xed\xf2\xb1\x1c\x9f^\xc8\x1ak0\x15\xa6\xf8x}\xf1\ +\x8c\xaf\x15!#\xa80\x191E\xbct\xe0\xd9y\x86\ +\x87L\xd1s\xb4\xff\x0e\xb6>>\xd5$\x8cL\x91\xe8\ +)\xc8\x0e\xf0q+\xe1\x14\xa4\x82)j\x12\xe4w\x07\ +\xcb\xf1imPMC\x8e\x0a\x19A\x17[\x1e\x9f2\ +\x97\xd1\xa4\xa8A\xc5\xf5\x93\xe6\xa6i\x13\xd1;t|\ +\xaaQ\xc0M\x07N><\xc7\x91)z\x86\xddI\x91\ +)\xaa\xc3\x91).\x0dj\xd7\x14\xff\x12\xb5\x9a6\xd1\ +\xa8\x0e\xe8\xe81S\xbc\x93\xcf\xbf\xd5j\x85{Z \ +\xfa\xe3DM<\xf7\x13ib\xfd\xed\xc2.\x9e\x01\x84\ +C\xe2\xd5\xfd,\xdd\xd8_\xdb\xf1\xa9Bd0#S\ +T\x88\xddI1\xb7~;)V\x13`\x86\xba\xd3\xae\ +)\xda\xab=\xdb{\xc5y?>\xbd\x9e\x0d\xd7\xe3B\ +\x05\xf8\xf6\xf8\xf4\xbf\x9e\xe4\xd6\xc7\xa7L\xb1k\x02&\ +\xc4O\x12\xa3Iq\x9f\xeb\x0f\x13]Sd\xe2\xcc\xbc\ +\x9a\x22\x03'\xd4]ST\x7f7\x12#S|\x15\x93\ +\xe2[\xad\x0e\xb9/\xe0\x84\x896\x19\xbe*\xbe\xca\x05\ +\x0d\xfbw\xbc\xab\x1aQ\xbdiyo$\x1fuc>\ +\x97t\xfb\xc4w\x16\xce\xfb\xd3\xc2t12E\x9d\xb4\ +\xc4\x9b\x99\x14w\xb9\xffJ\xa2\xc2\x04\xc0\x04\xba\xdd\xc7\ +\xc5\xdc{\xac\xfb\xf83\xa2\xeb\x06\x8e\xbc7\xe6{\x88\ +\x17\xca\xf7\x98\xb4\xf6\x89\xae)*\xc4k\x09\x1dj5\ +\xc5\xa5;=\x8f\xa6\xe8t\x02\x1f\x92{\x0d\xf9v/\ +\xe1\x08\xa4\x0b\x5c0\xc5\xca\x07\x81\x96\x1f[\x1c\x9fj\ +\xf2\xe4\xb5\xfc\xee@c*\xf74\xaak\x10~|<\ +^_<\xe3\xeb-\x8fOof/L\xa6\x82\xb1\xe0\ +\xe3I\xfd\xe0\x94\xef\x99\xe1\xed\xc4\xc8\x14\x1f\xe4:}\ +\xea\x9a\xe2\xb1\xe3S{\x9e1E|\x5cJT\xbc\x0a\ +S\xc4\xc7h\x80\xc1\xc5>\xb1\x85Vkl\xce\xe3\x00\ +\xd3\xd2\xea\xd3\x18\xe3b\x8a\x87\x8eO\xef\x86\x90n\xe2\ +\x1d:>e\x02_$fL\x91!\x8eL\x91\xf8K\ +\xea\xae)2\xacc\xa6x'\x9fw\x13\xef\xef^\xac\ +\xedg\xac\x81\x0f\xebvM\x80\xf0+BFPM\x00\ +\x0f\xf8\xe8\x9a\xa2\x1c\xfa(qhR\xf4\x1c\xed\xbf\x83\ +7\xf1\xf8\xd4d\xa1\xd1\xfb\xe9\xe0\x17\xfe]\xae}\x9e\ +\xe8\x9a\xe2\xdb\xe3\xd3\xef\x92\xaa9P\x8b\xd5\xab\xe3(\ +\x8f\x00\x00;\xe3IDAT\x04\xe8\xd1IB\xa3\xd0\ +\xd5&\xa6\xe89\xd6I\xd1)\x96g\xd85E'\x13\ +tid\x8aK\x83\xda\x9d\x9c_\xa6\xd5\xfb\xfc\xdc\xae\ +6\xbdL\xabgL\x11\x1f\xa2\xe2\xb5i5Q;\x06\ +D;\xa2\xa8\x89\xe7\x1eI'\xf9\xba\x89G8$^\ +\xdd\xc3y?>\xb5\xe7S\x8f\xe4\xf9\xde\xd3\xe2\xd0\xf1\ +)>\x98bwR\xf4\xf3\x19\xe2\xb5D5E\x89g\ +2\xf2\xb5\x03\xdd\x18>\x0e\x99\x22\x01\xe9\x9a\xe2R\x88\ +\xef\x95\x8d)lf\xdbm\x12,\xa7\x08\xaf'\xde\x1e\ +\x9fb\xe3O\xff\x0f+&\x98\xca\xc7\xdb\xe3\xd3\xe7\xf4\ +|\xfb\x9f'y\xa5\x89\x9c1\xc5\x1b\xb9\x7fd\x8a\xbf\ +\x7f\xb16\xce;8\x8dVwMQ\x93\xa0\xf9\xfd\xab\ +\xd1\xea\xfa\x8b\xae\x1f\x08\xa2\x8f\x8d\xe4\x8e)\xba\xa6H\ +\xf4>L\xd4\x9f\xff,\xd7fGr\x827\xea>\xb6\ +>>e^\xdd\xc4;\xf6\xafO\x99\xc0o\x13\x1d0\ +\xc2\xadL\xd1T\xbb\x95)ny|*7v\x89\xda\ +$\xf8W\xb8DO\xd7\xde\xc1\xb1IQ7-\xaf\xe5\ +w\x07\x1aS\x93\xd1\xe8\xf8\xf4~\xae?\xee,\xfa\xe2\ +\x9e\xcb\xf9\xbaKTS\x5cL\x80`w\x80\x0ff\xbb\ +\xd5\xf1)>\xb68>\xd5\xe4\xd1&\xfb_C\x83\xba\ +\xa5)jPg'\xc5\xd1\x00\xf30\xeb>H\xcch\ +\xb5:\x7f\xd3\xb4\x9a\x91\xf3\x99\x0a\x0d\xf5K\xb5\xba\xfe\ +\xb2\xcb\x22\x8b)nu|*\xa9\x09\xeb\x1a&\x0b&\ +03\x92+rFP1;\x92\x9bZ\x10\xfd\xd2\x7f\ +\xe6[\x7f\xf0)\xde/\xc7\xa7\xa6\xaf5\x98\xac\x07\xd8\ +5Ek\xe9L\xaf%\xaa\x098>\x9d\x99\x14\xe5\x0d\ +>\x0eM\x8a\x9e\xa3\xe7\xd9\xc1r|:\x9a\x14\xf7Y\ +\xf0ag\xd1\x17\xf7\xfc\x22_5N\x95\x0f\x82D\xf4\ +4O\x1d\x10Q|8\x05\xa9\xf8].|\x9e \xac\ +\x1d\xbc\xec\xf8\x941v\xe1o\x8a\xbb\xc4\xc8\x14\xedy\ +\xc6\x14\x99\xcb\xc8\x14\xfdy\xc4\xda\x8c\xb7\x03\xcd\xc1\xa8\ +a'\xfc'\x89{\x89\xae\x09ly|\xaaI\xf8 \ +Q\xf1\xaa\x8eO\xe9H\xc5\xa3\x5c\xb8\x9b\xe8\xf2\xc1X\ +\xdeT\xad\x1e\x99\xe2W\xf9}h\xeaK\xb5id\x8c\ +\x12\xef\xe3\xc4\xa8\xfb\x90t\x92\xafK4\xe1\xb8\x95\xa8\ +?\x97h|\x96\x981\xc5]\xeeg\x8c\x15\xb3\x93\x22\ +\x81\xfe$A\xb0+\x16\xa2\x99X\x07\x8c\x85\xa0^(\ +7\x9b,\x98\xcb\xcc\xf1)C\x1c\x99\xa2&a\xc6\x14\ +\x198\xd1;d\x8aD\xef\xa5\x89\x97\xef\x19A2\xe3\ +cd\x8a\xf8\xd0\xeduq%7^OT\x13\xd0$\ +|\x9a\xe8N\x8arYN\x8fLQ>\xcbk\xcf\xb3\ +\x03\xa6(\xf7\xd4\xe4\x1a\xeaO\x81\x13\xbe.\x884\xb1\ +\xae|8\xca\x93\x1f\xfe\xe7\x13\x1dh\x12\x0e\x99\xa2#\ +H\x0d\x88z\xef\xc0\x84\x88\x8f\xd1\xa4\xb8\xcf\xf5\x87\x89\ +\xae61q\xfb\xb6\xff5\x18\xb8=\xcf\x1e\x9f\x8eL\ +Q\xe3a\xed-\x8fO\xbb|h\x12\xd4\xe2_\x92V\ +\xd3\x90SiS\xfd\xa5M\x8a\xc8\x18\x99\xa2\x22|\x90\ +\xe8\x12M\xf4$^\xfd\x99Dc\xd6\x14\xafg\x0d\xc2\ +W1k\x8aL\xe0\x97\x89\x91)\x12i\xe2t*\xa2\ +\xf3}\x15:<\x82z\xa1|\xf0\xc7\xbc\xff<\xd1\x9d\ +\x14MCW\x138\xa9\x985E{\xb5\xe7-L\x11\ +\xc7rod\x8a\x1a\xb2YS\xdce\x0d\xdc\xac\xf1*\ +\x8eO\xe5\xf4V\xa6(\xf7F\xa6x?\xd7\x1f\xaf\x7f\ +\x913\xbe\xbe\x94\xef\xbf\x91\xa8\xa6\xc8\x04\xd4b\xd7\x14\ +\xadw31\x9a\x14gM\x11\x0f\xf8\x18\x99\x22]z\ +\x98\xe8j\x93|\xb6\xefw\x13k0\xf0YS\xdce\ +\x0d|W\xe0X\x03\xf2u\xfd\xe0\x94\xefi5>\xb6\ +\xd2ju^\xb5\x9a\xd6\x9dg\xad\xa6\x1f\xafD\xab\xd7\ +\xbf8\xa2o'\x0e\x1d\x9f2\x81n\xe21E\x0f\x91\ +\xb0\xae\x81\xe8/\x12:\xeb\x0e\x08\xdd\xe5\x04#\xa8`\ +\x02\x92\xdaD\xd0\x01\x81F\xf4V\xc7\xa7\xb8\xbeX6\ +\xc6\x14\xf1\xd15E\xcb)\xc2k^\x14\xe0A!\xe2\ +\xa5\x03\xb9\x82\x8fC\xa6h\xdf\xdft\x16\xce=\x92\x19\ +\x1f8_\x03\x1f\xfb\xc4\xc3\xf5\xc53\xbe~S\x8fO\ +\xf1ab\x5cC\xfdi\x12\x18A\x17\x8eO\x0f\x99\xa2\ +\x86\xec\xdf\x9b\x0b3Eb:2E\xc7\xa7\x04\xf5I\ +\xa2\x03\xa6\x88\x8f\x91\xe8\xe1\x02']mZ\x8eO\xd7\ +Z\x98\xe5\x9eO\xb5rzfRd\xb6\xa3I\xd1\xe9\ +\xc4\xab0E\xcdu\xc5\xa3\x5cx\xd3\xb4ziPg\ +\xb5\x9a\xcfT|\x95\x0b\x9e#-95\x96d\x90x\ +\x1f'F\xdd\x87\xa4;I\xcc$\x1eA]~V^\ +>\x87nl\xb6\xfb\xd8e\x0d\xc6X1;)\x12h\ +|\x8c\x9a\x04DK\xbc3\x11\x9d\xef_\xe0\x7f\xb79\ +j\x12L\xce3\x93\xa2\xf5\xaf\xbd\x88\x1fx\xb3\xc2\xec\ +\xa4\xc8\xc0?L\x8cL\x91\x89\xdbw\xd7\x14%\xb3\xfc\ +\xc0\xf9\x1a\xf8\xb8\x9b\xf8r}\xf1\x8c\xaf\xaf\xe4\xfb\xaf\ +'\x88\xf6\x1a\x0ap\xf6\xf8\x14\x1f[M\x8a\x9fdm\ +5\xb9\x86\xfa\x93w\x84\xaf\x0b\x22=2\xc57\xf5\xf8\ +T~h\x9ap\xd3\x01\x13\xf7\x1c\xdf-73pM\ +\xf5\x8c)\xe2yd\x8a\xbf\xcfu\xba\xb7\xc5\xf1\xe9\xfd\ +\xac\xfb \xd1\xe5ci\x12.d\x8d5\xded\xad>\ +\xb3)\xfa\xc5\x99\x95\x02$L#ST\x84L\xb1k\ +\x02D\xefV\xa2\x9a\x22\x11%\xa63\x93\xe2\xf5\xdcO\ +\xf8*fM\x91\x09\xe0cd\x8aD\x9a8uM@\ +\x87g\xed\x9ax\xf8\xf5\x00g&\xc5\xab\xb9\xffZ\xe2\ +U\x9b\xa2g\xe7\x19na\x8a&\x00|TST\xd8\ +x\xd6\x84t\xa1a\xda%*\x1fLQ\xb7\xaek\xef\ +\x80\x88\x12S\x93W\x85|&zL\xbd\x03\x13\xe2/\ +\x13#S$x\x8f;\x8b\xbe\xb8g1E\xfb_\x83\ +@\xdb\xf3\x16\xc7\xa7\xa6O\x06CX;\xc0\x03>F\ +\xc7\xa7'\xb9\xfe0\xd15\x01\x0d\xaa\x89\xae\xf2\xe1\xd9\ +\xe1c\xc6\x14w\xb9\xffR\xa2b\xf6\xf8T\x9d\xe0\xe3\ +\x90V\xcb\x11Z\xd2\xc1\xa2\xd5U\x9b\xb6\xd4\xeaer\ +\xeeN\x8a\xc7\xb4\x9av\xd0T\xfb?3\x88\xde?%\ +F\x89\xf7(\xd7\x89S7\xf1\x10\xed!\x8e\x88\xb6\xe1\ +\xdf%: t7\x12\x97\x077\xcf\x8e\xe4\x88\xb6g\ +{\xaf`\x8a\xf6\xddM<\xa6hm?c\x0d\xebY\ +\xf77\xeb\x8bgx\x8d\x0f\xa2\xa7Q8d\x02\xdd\xe3\ +S{}\x99)vM\x80)\xdeNTS\xc4\xc7>\ +1c\x8a\xbf\xc8\xfd\xbbD\xe5\xe3\xeb\x5cc\x8a\x9a\xa7\ +\x0e\x88(#?6)vM@~\xe0\xba\xd6\xa2\xfa\ +3\x09\x88.\x96\xe3\xd3j\x02&#|\xcc\x98\xe2\x87\ +\xb9\x1f\xdf\x15\x8c\x85)\xfa\x19\x1d0E\xa76#\x13\ +`\x00\xf7\x12]m2\x19\xd97\xfd[C.\x7f\x9e\ +p\xf4\xdb\xc1;\xb9\xe9Fbd\x8a\x9a\x04\x86+\x07\ +;P'\xeaE\x9eT<\xca\x85\xf3\xaa\xd5t\xfaj\ +\xddp\xde\xd3j\xb97c\x8a\xf4t\xa4\xd5S\xa6\x98\ +5\xff^b\xd4B\xcc\xa5\xe7Iw\x92\xaf\xdd\xc4#\ +\x1c\x8a\xbc&\x1e\xd1\x90\x1c3\x93\xe2.\xf7#\xbb\x82\ +\xd8)D\x84w \xf1\x14\xe2hRT\x88\xa2k\x8a\ +\xbaS\x82ZMq)\xc4\x99I\xf1Z\xd6\x95x\xd5\ +\x04\x98\xa1\xc4\x9b1E|\x8c\x0a\xd1~=\xc7o\x12\ +\x1dHf|\xe0|\x0d|\xdcMhB\xba\xb8\x92\x1b\ +\xaf'\x88\xd4\x1a\x0a\xf0\xd3DwR\xd4\xe0\xddL\x8c\ +LQ\x93\x87\x0f\xfb\xef\xe0P\xbd\xa8?\x82G\xf8\xba\ +\xf8 7\x12\xebw\xcb\x02&E\xf9\xd15E\xeb}\ +\x98\xf8y\xa2\x82)Z\xfbi\xfd\xe0\x94\xefi\xd2'\ +\x89\xaaM\xf8\xd8'\x1e&\xbc\xee\xc0~=\xc7\xaaM\ +\x0c\x9c~\xd8{\x07\xc7L\xf1\xf7Y\x10\x1f~F\x07\ +\xc7\x9a\x84\xfbY\x906u\xf9\xd0$\xd0j\xf9\xbd\x86\ +g'\xa7\xdf4\xad>\xc9\x9eq\xd2\xd5&\xf5r\xb3\ +&G\xae=/B\x8bwM\x80\xe8)\x98\xba\xb6\x8d\ +~\x9e\x98!\xfaz\xee'|\x15[\x8f\xe4\x88\xee\xf2\ +\xc1X\x98@5E\xeb}\x91\x981\xc5\xab\xb9_\xbc\ +jST$\xb7\x12\x87L\xd1s\xf4<;0)\xe2\ +\xa3\x9a\xa2\xc2\xbe\x9b\x981\xc5\xcb\xb9_\x8e\x10\xa95\ +\x98\x22a\xea\x9a\x22\x13\xb8\x990yU\xc8g|<\ +\xab\x1f\x9c\xf2\xbd\x7f\xdc\x85\x0f?c\x0d|\x10\xbc\xc7\ +\xeb\x8bg|\xad\xc8\x0f\x99\x22\xd1\xeb\x9a\x22~\xf11\ +2\xc5Wq|\x8a\x8fj\x8a\xb9\xf4\xdc\x10\x1f\xe6+\ +n:8d\x8a\x9e\x1d>\xba\xa6\xa8\xfev\x89K\x89\ +\x0a\x1c3\xdc\xae)\xaa\x13\xb58\x9a\x9c5Lr\xa4\ +\xabMr\xcf\xda\x17\x12k\xa8m9\xfd&j\xf5\xbd\ +\xec\xbb\xcb\x87&A^\xbfS\xcdK\x11\xdeIt\x13\ +o\x99\x04FD\x7f\x91u\xb7:>%z\xc4\xaf\x03\ +\x86\xf5\xcb\x84\xbdW\x10i\xfb\xee\x12\xcdX\xac\xedg\ +\xaca=<\xfff}\xf1\x0c\xaf\x15\x22\xd1c\x02^\ +\xaf\x81\x07\x85\xd8\x9d\x14=\xbb\x8f\x12\xc7\xfe\xa6\xd85\ +\x01\xa6x;\xa1\xd8\xd7\x90ow\x133\xa6\xb8\x1c\x9f\ +\x12\xed5\xbe\xce\x1b\xf91s|J<\x0e\x99\x22A\ +}\x9a\xe8\x80\xd8\x99\x8c\xaa)Z\x8b\xe0)\xf2.\xec\ +\xf7F\xa2\xaeM\xa0\xe5\x87)\xa6\x03\xfc~\x98\xd8\xea\ +\xf8T~\xc8\x93\x8a\x85\x8f\xae6\xc9g\xa2W5\xcf\ +\xb3S\xe3[\x1e\x9f\x9a\xce;P'\xf8\x185\xa8\x8f\ +r\xfd\xbcj\xf5.{\xbb\x92\xa8p\x9a\xb7\x95V;\ +>e\xe6]\xadv\xaa\x87\xeb\xe7\xfa\xb1N\x12\x0b\x13\ +\xa7n\xe29\x0eR0\xd5\x14%\x9eB\xec&\x1e\xe1\ +W\xe0\x97\x13\x15\xba\xb1\xcf\x12\x08\xef@\xe2}\x9c\xd8\ +\xe2\xf8T!2\x98\xca\x07S\xf1\x00g&\xc5k\xb9\ +_\xe2\xe1f\x0df(\xf1\xba\xa6\xc8\xc0\xf11*\xc4\ +-\x8fO\x15\xb8\xfc\xeb\x02\x17\xd7\x13\xd5\x14\x97B\xec\ +N\x8a\x9e\x1d1e2\x15\xbai\xb9'\xbf;\xc0\xb1\ +\xfcX\xd7\xe0\xb2\xceI^\xdc_\xde4\xbe^\xca=\ +\xbbD5\xc5-\x8fO\xd5\xb7:\xef\xf2\xf1\xba\x8eO\ +\xd5\x8b)\xb7\x03\xf9F\x9b\xf0]aMk?\xa9\x1f\ +\x9c\xf2\xfd\xfb\xf9>\xb58\x9a\x14\xe5\x86Fa\x0b\xad\ +\x96\xd33\x93\xe2.\xf7\xab\xc7\x0a\x8d\xa9\xfc\xd8B\xab\ +\x97z\x991E\xb5\xe8y>\xc7R\x94\x92Z\xd7\xf4\ +\xcd\x9f.\x9f\xf9\xbfF\xf2\x91)Z\x8f\x09\xcc\x98\x22\ +\xc1\xbb\x9c\xa8 v\x88\x9e\x99\x14\x9112E\x22-\ +\xf9\xbaD\x13\xbd[\x09\xc2\xba\x86\xf5\xf0\ +\x0d\x09\x01\x03W\x8b\xdd\x86\xfd\x9d\xdc{#12E\ +\x1c\xe3ZMv\xc0\x14\xe5\xc7\xa8A}\x94\xebj\xa6\ +\xabM\xf4N\x9d\x7f\x9fZ\xbd4\xeco\x92V?\xef\ +\xa2>\x0dQ]\xe8>\x10\xeda\xae\xc1\x14%\x1e\x93\ +\xe9\x80\xd0]~\x11\xf5~D\xeb\xf4|\xed@R\xd8\ +\xf3!S\xb4\xefn\xe2-\xddG5\x01\xebI\xe8\xc7\ +\x89.\x98\xa2b\xac&\xa0\x00\xf1\xd1\x9d\x8c4GL\ +\xe0\x90)jn<\xcf\x0et\xbc\x9a\x84j\x02\xf8\xb8\ +\x9fx\x98\xe8b\x99\x04\x88\xd4\x1aL\x00\x1f3\xa6x\ +=\xf73\x99\x0a\xa2\xc7\xb8\x9e\xd6\x0fN\xf9\xde\xa4\x88\ +\x0f_\xd7`\x84'\x89{\x09\xaf;\xf8In\x1a\x99\ +\xa2\xbd\xda\xb3\xbdw\x80\xdfk\x09\xf9W\x81ck\xe3\ +\xbc\x03\xba\x81\x0f\xcdS\x85\xdc\x90#]>\xfe1\xf7\ +\xcak\xf9\xbd\xc6\xb3\xbc\xb9\x93\x98iP\xaf\xe4\xfe\x91\ +)jL\xe5\x9e\x9a\xec\xe0bn\xc2\xc7\xc8\x14i\xc7\ +>\xa1v:x]Z-?\xce\xa3V\xcb9>0\ +\xd2\xea\x075i\xceB\xf8O\xf3\xcd\x1f&.\x94\x9b\ +\x88\xa8\x8eifR$LW\xcb\xba\xde\x12\xffO\x13\ +3\xdd\x072\x14M\xc5\xec\xa4\xc8\x14?IH\xee5\ +$\xb2\xe4\xe86\x09\xd6\xc2\x05N\xaa)J8|t\ +'E\xcf\x1f\x1fD\xb5\xe2UL\x8a\x1fg\xd1\x9ax\ +\x84\x8e0\xcd4\x09DI\x93PMQ^l5)\ +\x9a.\x88^\xd7\x04\x98\xa1\xfcx?\xb1\xc6\x9a\x0f\xaf\ +;`Z#S49\xab\xc5\xeeq!~\xd5\xb8\xf5\ ++\xac\x89\xeb.\x1fx\x90{\xea\xa6\xe2a.\xdcM\ +t\xf9\xd0\xd4\xd8w\xd57{\xf5\x0c=\xcb\x0e\xd4\x9f\ +\xbc\xbb<\xb8\xd9)\x16>\xfe0\xf8\xec4\x97\x96&\ +\x81\x81U\xa8\x155\xd35\xc5cZ\x8d\x0f\xb5\xde\xc5\ +\xb5\xdc(*h5>\xba\xa6HG_\x9bV\xd7\xc4\ +\xa9\xbf\xdc\xa1\xf7\xa6\xadC\xa6\xe8\x01\xce\x98\xe2.\xf7\ +\xeb\xc8*t\xa7\x8a|\xc6\x14uc\x87&E\xe6\xd5\ +M\xbc\x97\x1d\x9fvMQ!J:\xc6\xe8\xf5\x1a\x0a\ +P\xe2uM\xf1B\xee\xbd\x958d\x8a\xf8\xd0\xe4t\ +\xa0\x1b\xc3\xf5\xc8\x14\xf7\xb9>c\x8a&E\xe2TM\ +\xf1\xeb\x5c\x93\x1f\xddIQ-\xc8i\xa2Z\xf1/\xb9\ +@@\x9e\xd6\x0fN\xf9\x9e)\xdeN\x8cL\xf1~\xae\ +?:\xe5:\xa3o#z#Sd\x02\xf2cfR\ +\xdc\xd2\x14\xf11\x9a\x14Or}\x9f\xe8\x9a\xe2\x8fs\ +\xef\xc8\x14\x9f\xe5\xba\xfc\xf8\xb7D\x07\xf2m\x97\x18\x99\ +\x22\x8e\xad=c\x8a\xf8\x18M\x8ar\x83\xa6v\xf9x\ +\x99VwM\x91\x1e]O\x8c\x06\x98E\xabgL\xf1\ +uh\xf5\xdd\xfc>\xcf\xb5\xbac\x8c\xcbHNX\xd7\ + \xa2\x1e\xe0\x97\xeb\x8bgx\x8dhI7J<\x04\ +K\xbc.\xd1\xf6\xaa\xfb8d\x8a\xf6\xfd\xc7D\x07:\ +\xde\x91\x09X\x0f\xd1\x8f;\x8b\xbe\xb8G\xa7~\xc8\x14\ +?\xcbg\xba\xb2\x0e<\xf7[\x89C\xa6\xf8E>#\ +$\x1d,\xc7\xa7\xf5\x1fR\xe0\x83\x09\x10\xbe.\x98\x22\ +\x13 Rk0\x01|\xe8\xda;x77\x1d2E\ +\xa2\xa7Ix\xdaY8\xf7\xe0A~0\xc75\x08\xdd\ +\x83\x17\xb1\xbe~\x96\xd7\x9e\x9f}\xdb\xff\x1a\xf6j\xcf\ +\xf6\xde\x01~\xaf%\xe4_\x05\xd1\xc35\xce;\xd0\x1c\ +\xe0cd\x8a\x0fs}\x9f\xc0M\x07\xc7\x8eO\xf1\xd1\ +5E\xdat%qy\xb0)\x8d)>\xba\xa6x1\ +\xf7\xe2cd\x8a\xb4c\x9f\xe8\xf2\xb1\xb5V\xe3\xa4\xe2\ +M\xd5\xea}~\x91G\xcb/sVcT\x88\x04u\ +d\x8a\x8c\xab;)\xda\x8fB\x14\x15\xc4\xff\xd3\xc4\xcc\ +\xa4\xc8\x14\x0f\x1d\x9f2\x01\xa6\xde\x01S\xfc$!\xb9\ +\xd7`\x02\x0a\xf1y\xf7\xb1\xfe\xe0\x0c\xaf\x19\xe2\xf5\x84\ +\xa2\x5cC\xe2\xe1\xa3;)z\xe6\xf88d\x8a\x8a\xbc\ +\xcb\x07S\xc4\xc7hR\xbc\x93\xeb3M\xc2\xa5\xdc\x7f\ +#QMQ^\x98\x8c\xba\x93\x22S\x91\xd3?KT\ +8r\x9b1\x01f\x88\x8f\xf7\xcb\xc2\x84\xeenB!\ +vE\x8fii\x12\xaa).\x93\xb3\xa3\xce\x0e\xf0k\ +\xdd\x0f\x067[\x13\xd73\xa6\x88\x8f\xda$\xf8QL\ +\x11']>\xba\x93bn=\xaa\xd5\xf2\x83Fu\ +@G\xcf\x85V\xd7$:\xf6\xcb\x98\xb6\x08\xc8\x85\xf2\ +MD\x94\xe8uM\x91\xf0_O0\x82\x8ae$\x9f\ +1\xc5_f\xd1C\x93\x22\xf3bb\x1d\xe8\xf0<\xc4\ +\x91)*\xf0\xaf:\x8b\xe6\x1e|\xe0\xe2\xda\x8b\xd7\xf9\ +\xf2-t\xa5\x12o+S\xc4\xc7\x8c)\xde\xce\xfd#\ +S\xdc\xe7\xfa\x8c)\x9a\x14G\xa6\xf8u\xaek\xc8\xba\ +\xa6(\xff\x89\xe9!S\xb4\xf6\xd3D\x07\xc4\x1f\x1f\xd5\ +\x14\xadu?1c\x8a\x87\x8eO\xed\xd5\x9e\xcf\xab)\ +\xe2cd\x8a'\xb9\xbeOtM\xf1\xc7\xb9wd\x8a\ +\xcfr\x1d\x1f3\x93\xa2\xbc\xbb\x9c\xa8x\x15\x7fS\xc4\ +\xc7hR\x94\x1b4\xa4\xabM/\xd3\xea\xae)\x9eF\ +\xabgL\xf1\x98V\x7f\x11>\xba\xdatf\xad>\xad\ +1\x1e\x1b\xc9mx\xc6\x04$\xdd\x95D\x05\x82%u\ +\x97h\x06\xce\xb8\x0e\x99\xa2}w\x13\xefe\xc7\xa7\x12\ +\xbb\x8b\x0fr\xe3!S\xfc,\x9f\x99\xa0;\xf0\xac\xf1\ +qhR\xc4\x07!\xe9\xc0\xa4\xa8\xc8\xbf\xcf\xe3S\xa6\ +\x88\x8f\xad\x8eO\xad\xfd4\xd1\xc1\xcb\x8eO\x19c\x17\ +L\x91\x09\xbc[\x16\xb0W{\x9e1Ey'\xff*\ +4\x1e\xd6~R?8\xe5{\xcd\x01\xd1\xdb\xea\xf8T\ +^W-\x93\xcb\x9f'fL\xf1j\xee\xbf\x9c\xa8\xd0\ +\x98\xd2&\x8dj\x07\x17s\x13>F\xa6\xf88\xd7g\ +L\xf1\x98V\xdf\xc9\xda\xb3\x7f\xeaz\x1dZm\xdf\xdf\ +$:\x90s\xb8\xae\x0d\xfb\x1fs\x0d\xcf\x8f\x12\x7f\x86\ +\x9aL\x7f\xf6\x0d\xb9ph$W\x88\x12\xaf;)\xfa\ +Y\x0aQ\xf2\xe9D\xd6 \xfe\x8e\x0bg&E\xc5\xf2\ +\x97t|\xfa\xab\xfc>]S\xbc\x90{o%\x0e\x99\ +\x22\xd1\xeb&\xde\xeb8>%H\xf2\xa3;)2\x15\ +|\x1c\x9a\x14gL\xc0D\xf4I\xa2N\x8a\xa6\xa1\x83\ +\x85\x98\xcfN\x83_\xe4\x9b\x1csVS\xd4$\x10\xea\ +\x19Se\xb27\x12\x1f$\ +*\x18-\xae\x19M\x07\xf2\xe2vbd\x8a'\xb9~\ +/\xd1\xe5\xe3\xd8\xf1\xe9y5\xc5\xf7\xf2\xfb\xca\x8fC\ +\x93\xe2\x9d|F\xb4;x\x9dZ\xdd5E\x0d\xfbV\ +Z\xbd\x9c\xea],d\xe2w\x9f8\xaa\xd5\xc7\x8c\xf1\ +\xd8H\xce\x5cfL\xf1r\xee'|\x15\x08&L3\ +D\xeb>\x8e\x1d\x9fvM`!\xba\x9a\x00\xa2\xef&\ +\x88^\x17D\xe9Z\xa2\x9a\xa2\xc9\x08\x1f3\xa6\x88\x8f\ +C\xa6\xe89>Kt\xb0\x98b=>%t\xfb\x04\ +\xe1\xeb\xc2\xdf\x14\xaf'F\xa6H\xf4f\x8eO5\x09\ +?KT\xc8gMB\xd7\x14\x97\xe3S\xbc\xac\x81\x0f\ +\xa6\xc8\x04\xba\xd8\xf2\xf8\xd4\xa4h\x12\xad\xd0x\xc8\xbd\ +\xae)j\x0e\x88\x9e\xa3\xac5\xf0\xa1V\xf6\x09\xaf;\ +p\x12$\xaf\xab~\xc9e\xcfpfR\xbc\x9a\xfb\xe9\ +S\xc5\xd2\xa0\xaa\xc9\x0e\xe8\x86=oa\x8a\xafK\xab\ +\xd5\xe2\x8cV\xcb\x8f\x91V\xcfN\x8ar\xeev\xa2\xad\ +\xd55\xb1\xb2\xd6s\x10R\x02r\xe1Oo\xbf\xfd/\ +\xd1 \xa6\xe7u$\xb7\xe7\xd1\xf1\xe9,\xd1K!^\ +\xfc\x96\x89?\xbd`\x8a\x0a\xf1h\xf7Q\xee\xa9o\x15\ +\x22\x13\xa8\xa6(\xe1>M(\xc8\x0e<;|\x1c2\ +E\xfb&$\x1d\x1c;>\x95\x1f\x8f;\x8b\xbe\xb8\xe7\ +R\xbe\xdeHTS$H\xf8\xd8rR\xec\xf2a\x22\ +\xfa$\xc1\x0c\xd6 \xfcw\x13\x8c\xa0\x0bM\x82\xe3B\ +\x93\xdd\x1a_\xe7\x0d\xe32\xd5u\x80\xdfC\xa6hM\ +k\xfb\x19\x1d\xe0\x01\x1f\xa3IQ\x83p\x92\xe8\x9a\xa2\ +&A^\xff0\xb1\x06\x03'\xd43\xa6(\xefF\xa6\ +\xa8\x1139wM\xf1\xbd\xdc\xfbq\xa26\x09\xb9\xf4\ +\xfco~w\xf2\x95\x96t`rf\xb8\x7fIZM\ +\x9b\xbe\xe9\x90\x91{^\x89V\xd7\xe4\xb2\x97c#\xb9\ +\x0d\xff\xce75@\xf8ME\xa2\xc2D$\xf1\xb6\xe8\ +>\xbe\xca\xba\xc4\xbaK\xf4\x96\xc7\xa7W\xb2\xaf\x91)\ +.\xddi\xd7\x14=W\xe212E\xcf\xcfs|\x96\ +\xe8\x80)\xea\xf4j7F\xe8\x88\xde\x8c).|T\ +S$z\xf2\xe3\xbc\x9a\x22>\xaa)\xe6\xd2\xf3I\x91\ +)vM\xc0\xf3\x1b\x99\xa2\x06u\xc6\x14\x99,\x13\xf8\ + Q\xc1\x14q\x8d\xf3\x0e\xe4\x05>F\xa6x\x92\xeb\ +\xa2\xcb\x07\xd1\x93\xd7?L\xac!\x97\xcf\xb3)\xe2c\ +d\x8aje\xc6\x14\x8fM\x8aj\xfc\xbcj5#\xf7\ +,+f\xb5\xda\xa9\x9e\xb5/\x96\x855\x1d\xfb\x84\xf5\ +O\x85\x9a`\xc7\x88f.3D\xeb\xc4F\xa6\xc8\x0c\ +gL\xd1\xef \xf1F#\xf9\xab \xda\xda#\xa2\xef\ +\xe6\xfa\xa3D\x17D\xe9zB\xc3\xb0\x86\xae\x94\xe8i\ +\x16:\xc0\x87\xe4\x18\x99\xa2I\xdfs\x9c1\xc5\xdb\xb9\ +\xff\xfb>>U\xe4\xba\xf6\x0e\x98\xc0\xad\xc4\xcf\x067\ +\xffK\xaeY\x9b\xd1t\xf0\x97x|\xca`fLQ\ +~\x10\xa8\x8a\x87\xb9\xb0O\xcc\x98\xa2\xbc\xae\x9a%\x97\ +=\xc3\x99I\xf1J\xee\xa7O\x15K\x83:3)\xd2\ +\x0f\xbaZ\xf18\x17fM\xd1\xda\x17\xca\xc2\x06\x80W\ +\xa1\xd5W\xcb\xba\xde\xd2j\xda\xd4\x1d`\x16\xad\x1e\x99\ +\xe2\xec\xa9\x9e\x9c\x93{\xafD\xab\xd7Ivl$\x97\ +x]S\xcc\xad\xcf\x0d@\xf2U\x10\xff\x19SD\x02\ +\xd1\xdb\x82hk*\xc4\x11\xd1\xf88u\xf7\x91\xef\xad\ +\x90t#S\x5c\x9a\x84\xae)*\x12|\x8cL\xd1\xf3\ +\xb3\xefg\x89\x0e\xfeGn\xfa$1\x9a\x14\x15\xa2B\ +\xef\xe2Rn4\xc1\xd4I\x91 }\x9a8\xaf\x93\xa2\ +\xe3\xb1CM\xc2\xc3|\xd6\xc5/r\xa3c\xce\xef\xfb\ +\xf8\x94)vM\xe0\xfd\xdc+?F\x93\xe2>\xd7O\ +\x12]S|\x13\x8fO\xd5\x89\xfc\x18M\x8a_\xe6\xfa\ +\x8c)\x1e\xd3j\xb5\xa8\x01\xee\xc2\xf0B\x9fj\xc3\xbe\ +\xb5V\xd3\xa6o\x9a\x9b~\xe5Z\xbd\x18\xe3\xb1I\xd1\ +\x86\xbb\xa6\x88\xdc\x85\xe8\xfa;\xcf\x12\xcd\x04\x18\xd7\xc8\ +\x14\x99\x96\x04\xe9\x12}l$\xbf\x97u\xad\xdf\x85\xa4\ +\x1b\x99\xe2\xd2\x9dvM\xd1\xb3fL\xf1J\xee\x17\ +\x15K\x83:c\x8a\x9a\x04\x06V\xc1\x14\xef$fL\ +\xd1\xda\x17\xca\xc2\xb4\x8e\xe6m\xa1\xd5K\x83J\xb3;\ +\xf0\xec\xec\xf9\x90V{\x8e]\xad\xd6x\xc8=~\xb0\ +\x06~\xe5\xdd\xa3\xf5\xc5\xb3\xbc\xb6iE~\xa8\x10\xbb\ +D\xdb\xc3\xf5\x84\xc4\xfb\x817+\xccv\x1fHpd\ +3*\xc4\xd9\xee\xc3\xdf)=\xc4J\xf4\xb3\x5c\x93\xd0\ +[L\x8a\x12\x8e\x09tMQ\x91\x10\xbd\x91)z~\ +\x12\xcf\xfe;X\xbaS\x13\xc1\x1a\x84N!*\xf4.\ +4\x097\x12\xd5\x14\x09\xd2\xa7\x89\xae)\xcai|\x1c\ +2E\x0dH\xd7\x14\x99\xa1z9\xd4$0\x82.\xd4\ +\xcb\xe5D\xadE\x86e\xcf\xa6\xba\x0e\xf0{312\ +Ek\xca\xbd.\x1f\xef\xe7^\xb5X\x9b\x84\x5c\xfao\ +\xfb\xc4IB\xaet\xb0\xf5\xf1\xa9\xfc\xab\xf8\xdf\xb9\x80\ +kf\xd0\x81:\x91\x1f\xa3I\xf1~\xae?HtM\ +\xf1\xd8\xf1\xa9\x1a\x9f\xd1\xeak\xb9\xffjb\x0b\xad\xbe\ +\x95u\xb70\xc5-\xb5\xfa&\x11\xa9\x85\xc8\xbd\x89^\ +\x97h\xe4.D\xe7\xe5w0k\x8aL\xe0\xa3\xc4\x16\ +\xa6h\xcd\x91)Jd|0\xdd.\xae\xe4F\xc2W\ +\x13o\xd6\x14=?\x89w\xc8\x14M\x02]S\xfc\x1f\ +\xb9\x17\xd7#ST\xe4_&\xba J#S$H\ +\xf6\xdc5E\xb9\xcc\x04F\xa6h2\x22z]\x13`\ +\x86\xf8\xa8\xa6\x98K\xcf\x0d\xe0a\xbevM`\x97{\ +\x09S\x85\xbd\xe2c\xc6\x14\xf1\xfcA]8\xef\x7f\x9f\ +\x98\xe1C^\xa8\x97\x91)\xe2\xe2$\xd1\xe5\x83\xe8\xc9\ +k\xf9\xbd\x86\x5cf\x02\xddI\xf1\x9d\xdc\xab\x0e/'\ +*\xe4\x9c&afR\x94\x1f#S\xd4@\xce\x98\xe2\ +\xd2\xa0^\xc8:k\xbc\x0a\xad\x96w\xf4\xba\xc2\xe4\x8c\ +\x0f\x1a\xd5\x81\xbd\xe2\xe3\x90)\xd2T\xfb\xef\x80V[\ +\xbb\x0e0\xb4\xfaN\xa2;\xc0\xd0\xe7\x0f\x13\x1f\xd4\xc4\ +[\x88\xfem>\xec\xc0\xc2DoD4\x82\x15b\x97\ +h$\x1c#Z\xc1\xcc\x10}l$\x9f1E\xa2\xb4\ +K\xe0f\x0d\x05(\xf1\xba\x93\x22\x13\xc0\xc7V\xa6\x88\ +\x8f\x91)\xees\x9d\xe8u\xe1\xf8\xf4F\x82H\xad\xf1\ +$o\xe4\x87\xae\xbd\x03|\x10\xd3\x91)\x12R\x06\xc3\ +h:`\x86\xf8\xd0,\xacA\xf8\x09\xde\xbd\xf5\xc53\ +\xbe\xbe\x92\xef\xbf:\xb8\xc7^\xe5\xf4\xdb\xe3\xd3?\x91\ +\xf3,_\xbeH\xfc\xcb\x9f\xde\x9e\xf9\xbf\xeaO\xde\xd1\ +\xa7\x8a\xc5\x04fLQ\x93\xc0\xc0*\x98\x22\xb1&\xda\ +\x1dX\xd3\xda\x17\xca\xcd\xb4\xce\xba[h\xb5\x06u\xc6\ +\x14\xbf\x0f\xad~\xaf\xf0\x81\xdf\xbb\x89\xae)\xd2\xa3k\ +\x09z\xfdg\x1d\x99\xc4\xeb.,\xf1tc\x0a\xbdb\ +vRD\xb4#\x1b\x9dB\x05\xd3\x22 \x12\xa5\x83-\ +G\xf2\xab\xd9\x10\xb2q\xb3\x86\xe6`\xc6\x14\x15\x89\xce\ +f\x0bS\x5c\xba\xd3\x91)\xca\x0f\x85\xde\x85N}\x97\ +\xa8\xa6\xb8\x14bwR\xd4\xe0\xe1\xe3\x90)2\xdc\xae\ +)\x9a\x88>N\xd4I\x91)\xee\x13\x0f\x13](B\ +b]am\xf91c\x8a7s\xff\xa1\xe3S|<\ +It\xf0~nR\x8b\xa3I\xf1^\xaek\x14\xec\xbf\ +\x83\xb7\xc7\xa7\xdfem\xab\xe3Sz\xb4h\xb5\xd7k\ +\xbc\x0a\xadV/\x7f\xb7^\xf4\xc5\xeb\xf3\xae\xd5\xf4\xfa\ +9\xd6\x13\xe3\xdd\x5c\xb1\xf1.,\xfa\xed\xc2\xabE\x96\ +n\xac;)2\x81\x8f\x12\x87L\x91X\x7f\xb3\xfay\ +gy\xb9\xd5Hn\x0f\x1a\x04\xc9W\x13o\xd6\x14\x17\ +\x13 \x22\x15\x8e\xbf?K\xe8\xae;\xd8\xfa\xf8t\x97\ +M\x8dL\xd1\x9e\xbb\xa6\xf8n\xeee\x02#S<\xcf\ +\xc7\xa7L\xebFb\x04|\xcc\x98\xa2u\x9fw\xbee\ +\xf1\xe5\xf8\xb4k\x8a\x9a%\xb582E\x0d\xc2\x8c)\ +nu|\xaa\xfev\x89\xcb\x89\x0a9\xa7I\xd0\x98u\ +`j\xc1\xc7\x9bt|\xea\xf7\xa4\xd3\xf4\x097k\xd0\ +j|\xccj\xf5!S<\xcfZ\x8d\x93o\xb1\x18\xe3\ +\xfd\x5c9\xf9\xf6\xea\xd9^ \xf7R\xc2dT\xb1L\ +\x02]\xa2\xdf\xc4\x91\x1c\x07Di\x97\xa8\x89\xf7\xf6\xf8\ +4\xa4\xac@\xa0\x15\xe2\x9bt|j\xfb\xea\xe5\x9e\x17\ +Mhj\x989S_\xc3\xa4\xa5A\xed\x9e\xda\xbc\x93\ +{\xad;2\xc5\x7f\xcfu\x5c\x7f\x9d\xe8\x80)\xdeN\ +\x8c\x1aT\xa6h\xdf\xf6\xdf\x81\xbfC1\x98E\x8f\x96\ +54x\xc4t\xf6\xf8td\x8aK\xc3\xde5E\xda\ +\xf4\xcb\xc4\x9bz|Z\xb5i\xd1j\xbct\xb0\xb5V\ +\xe3Z#\xb2\xc6\xec\xf1\xa9\xb5\x86Z\x8d\x1c\x9dvw\ +Rt\xff\xf5\xc4\xa8\xfbx\x15#\xf9\xa1\xe3S&N\ +\x9c\xbeIt\xf0}\x1c\x9f\x12\xa95\x96n\x0c/\x1d\ +\x5c\xc8M\x1f&\x88j\xc5\xec\xa4x\xe8\xf8\x14\xbf\x04\ +\xefq\xfd\x81gxO\x94v\x89\xca\xc7R\x88\xddI\ +\x91\x882\x81\x9f'*\xfe5\x17\x98\xc0\xd3\xfa\xc1)\ +\xdf;6\x95{\xbe\xaeA\xf8\xf7\x09F\xd05\x01\x93\ +\xa2}WSdX\xb8\xee\xfe\xcd\xc8z7\x12\x87L\ +\xf1W\xf9L#\xd2\xc1\xfb\xb9\x09\x1f\xa3I\xf1^\xae\ +?Ht\xf9\xa0?\xf2\xba\x9a\xa2\xbd~\x96\xf0,;\ +\x90o\xbb\xc4\xc8\x145b\xd6\xee6\xec\x9a\x04\xc7\x85\ +\xa3I\x11\x17\xf7\x13\xff\x7f;w\xdb\x5c\xd7q]\x09\ +\xb8b\x8b\x92\xfc%N%~\x09\x09\xbe\x5c\xc8\x92(\ +\xba\xe6\xff\xff\x91\xa9\x9a\x91#\x89\xbc$A\xd2\x8c\x95\ +d2S5\x13\x12\xb4k\xd6\x03\xf3\xb8\x0e\xb7\xfb\x82\ +\xc0n\x1c\x89L\xb8\xaa\xb6po\x03\xdd\xb7\xb9\xce\xde\ +k\xedn\x90\x22\xda\x1d|\xb8>}\x93\xb5\x1fC\xab\ +_H\xc6\x19St\xfc\x1c\x99\xe2\xd2\x8du\x13\x8f\x09\ +\xe8 G\xdd\xa9\xfdJ\xbc\xae)Z\xd3\xda:\x9c5\ +$\xf2\xfd\xc4\xf3\xf5\xe0%_\xe3\xe2N\xe2o\xca<\ +<\x10\xea\xae)zN\xc4\xe3\x90)~\x9b\xef\xbdJ\ +tp\xde\xf5)\xa1\xfe}g\xd1\xd7s\x96n\x8cH\ +\xad\xe1\xe4L\x98\xba\xa6\xf8\xd3\xcc\xfd,12EW\ +\x90\xd6>Mt\xc0\x0cu\xa7\xd5\x14\xad\xc5\x10E\xd7\ +\x04\xce3E{\xee^\x9f\xca\xb7]bd\x8a[_\ +\x9f\x9e\xe4s\xbb|\x10\xbd\x91)\xcae9\xdd5E\ +|\xa8\xc3\xa3D\x85\x9c\xd3$\xc8\xc1\x0e\xe8\xc6\xe7\x89\ +\x91)\xaa\x95\x19St\x05i\xedk\x895h\x1dm\ +\xd2\x00w\x80\x8f\xf3\xb4\x9a6\xcdh\xb5=\xbf\x8f\xd7\ +\xa7r\x047k\xe0\xe1\x9b\x8f\xd6#\x97x\xbd$\xde\ +\xcd\xcc\xa9\x0b/'\x81\x19\xa2\x09\x93\xeb\x95\x0a\xa6\xa8\ +`fL\xd1\xda?\xd8\x91<\x9f\xa5\x00\x15b\xd7\x14\ +\x15\xc9y\xa6HP\x09I\x07L\xf1nB\x07\xbc\x06\ +\xa1\xdb'\x9e\xad\x07/\xf9\x9ai1\xafj\x8aN\x02\ +\xf8\xe8^\x9fZ\x0f\x1f#S$\xa4\xf8\xf0\x19\x1d0\ +C|\xe0\xa5\x82\xe0\x89\xae\x09hj>K0\xf55\ +N\xf3\x860\xb9\xea\xec\x00\x1f\xd6\x1d\x99\xe2\x87\xeb\xd3\ +7\x19\x95s\xb8\x9e1E\xf9\xb1\xe5\xf5)\xe3]c\ +1E\xda\xd7\xc1E\xb4\xdaA\xa6\x03\xda\xf4>j\xb5\ +\x06u\x97\xa8\xde%/\xe4\xc7\xff\xe9\x1a\xa3\x22\x87L\x91\xe8\ +}\x97\xe8\x9a\xa2k1I]OF\xf88y\x1d\xf9\ +\xd2\xc2b\x02D{\x0d\x86%?\xba\xa6\xc8Tn'\ +F\xa6hM\x5c\xfb\x8c\x0e\xf0 ?F\xa6\x88\x8fG\ +\x89\xae)\xba\x1e\xf3\x1cG\xa6\xe8\x19\xce\x98\xe2\xad\xcc\ +\x1f\x99\xa2\x9c\xc3\x87\x1c\xec\x80@\xe3ctk\xa3V\ +\xf6\x89.\x1f\x8c\xc5\xda>c\x0d\xb9\xac\xc6gL\xe0\ +(\xf3o\xac\x17}\xfd\xfa\xec$\x90\xd7\x1a\xf7\x0e\xec\ +\xf5\xcb\xc4\xc8\x14\x9d\x14\x1f$\xd4N\x07\xcb-\xd6'\ +e2\xad\xb3\xee\xec\xad\xcd\xcd\xacQ\xb5\x09\x0f\xb3Z\ +\xfdy\xd6\xd8B\xab\xd5\xe0\x96Z\xad\x91\xac|,Z\ +}v\x8bEx/\x03\x8b)D\xe2T\x17f\x86\xbf\ +K\xcc\x9a\x22\x11\xa9P(\x8a\x5c\xa2t\xc0\x14\xfd\x8e\ +\xa4&\x9eD\xb6\xee\xec\xf5\xe9.kT>$\xde\xd7\ +\x89\x19S\x94xL\xa6\xe2_2 \xa9O\xeb7.\ +\xf8^\xe2\xe1ctR$L\xb3\x85(\xf1\xaa).\ +\xdd\x98\xab\xbd\x0e\x98\x0as\x19\x99\xa2+H\x9d\xde\x8c\ +)\xe2\xa36\x09\x19:k\x12\xf6\xf9\xda5\x01\xfb\x1d\ +\x99\xa2B\xf4\x0cg\xaeO\x8f3\x7fd\x028V\x8b\ +>\xa3\x03y\xc1\x04F\xd7cO3>c\x02\xbf\xca\ +||T\xeda\x8a\x9e\xa1\xdc\xee@\xfd\xed\x12L\xa0\ +b\xb9>U\x93\x1d,\xa6\xe8\xea\xb7B\xad|\x97\xe8\ +\x9a\x22\x8e\xe5\xde\xb5\xc4\x1a\xb4\x8e6\xcd4\x09\xff\xd9\ +\xb4\x1a\xcf3\xda$7v\x09\xb9\xb2\x86\xbcP/g\ +\xa6\xe8\x1b59\x8d\x1d\x82\xc5\xee$\x90]\xb1,<\ +c\x8a\x0a\xf1P\xf7!A$J\x07\xba1kWS\ +$t\xfb\xc4\x8c):)\xee\x12\x95h&\x80\xe8-\ +L\xf1\xfb\xacKP_%:`\x8aw\x13\xc4o\x0d\ +|F\xa6\xf8(\xe3\x027\x1d\ +\xfc\x22\x93F\xa6\xa8\xa1\xc1\xc7\xccI\x11\xcf\xd7\x13\x15\ +\xd6\xb4\xf6\x8c)\xe2ctR|\x92\xf1\x07\x89.\x1f\ +\xea\xfb\x90)j\xc8fL\xf18\xf3\x8f\x12\x15n\x12\ +\xf01c\x8a\xf88tR$\xd6]S\xb4\xa6\x93Q\ +5E\xeb\xe1y\xc6\x14\xefd>#\xa8\xda\xf4>k\ +\xf5\x8c)\x1e\xd2juB\xab\xffb\x8ay})c\ +\xbc\x91\x9fGt\x05\xa2\x09\xf5\x8c)J\x8eC\xa6\xa8\ +`\xba\xa6\xe8\xa4\xc8\x14\x7f\x96XC\xe21\x01\x85\xde\ +\x05\xa2\x89SM~R\x16x\x99\xf7\xf2\xa3k\x8a\ +?\xcd\xdc\xdb\x09\xa6[A\xf4\xac\xed3:`\x86\xf2\ +C\xb3Pq\x92\x01\x9ctM\xe0\x1f2\xd7s\xb4\xff\ +5N\xf3F~x\x96\x1d\xe0\xf7V\xe2\xfa`\xf2U\ +\x5c\x9f\xe2cd\x8aO3\xbeOt\xf9p\xdaR\xe7\ +\xf2{\x0d\xb9\xac\xc6\xbb\x0d\xaa\xfa;J\xd0\xa7\x0a\x9a\ +$?\xba\xa6\xc8\xb0\xf012E\xfb\xb5oZ\xd2\xc1\ +r}Z\x1bTZ\xf7 \xf1\xac\xb3\xe8\xeb9r\xe3\ +f\xa2j\xd3\xacV{v[i\xb5\x1a\xc4\xf5\x0f\xad\ +\xd5\xf2\xe3\xaf\xb4\xba&i~f\x08\xc2$*\xd1\x12\ +\xef\xeb\xc4\xcc_\xb4A4\x11\xa9\xd0-\x11\x90\x19S\ +\xbc\x97\xf9\x9f\x94\x85%2s\x99\xe9>\x14\xe2q\xa2\ +\xf2!\xf1\xf0\xb1\xc5IQ7\x8d\x8f\xae\x09H<|\ +\xd4B$t\xf7\x13\x84\xaf\x0b\x8582\xc5\xff\xc8\xf8\ +?%fL\xd1\x09cd\x8a[^\x9f>\xc9g\xee\ +\x13]\x13\xb0_\xfb\xae\xa6\xa8iR\x88\xdd\xebS\xa6\ +(\xefF&\x80\xe3\xdf%|F\x07\xf2B-nq\ +}\xaai\xd2$T\xbdQ\xdb\xf8\xf8>\xd1\x81\xfa\xdb\ +%\x98@\x05\xb1\xc3\x87\x9a\xec\x80n\xe0\x83\xa1W\xd0\ +\x0e\x1aBK:\xc0\xf1W\x89\x8f\xcbd|\xa8\xf1\xee\ +I\xd1rtZTm\xa2\xd5\xf8\xf0\xb5\x83k\x99\x84\ +\x8f\xffLZ\x8d\x8f\xbf2E\xe4\xd4D5\xb6\x06r\ +\x17\xa2\xd7\xe3^\x13\x7f\xa27c\x8a:\x84C'\xc5\ +\x19S\xba\ +\xa6\xc8\xb0h\xd3\xe8\xa4H;fL\xd1\x9a\x0c\xc6g\ +\xacA\x9b\xf0\xdc5EzD\xabo%\xaa6-Z\ +\xfd\xae\x9a\xa2\xdc\xfb$\xb1\x86|\xdb'\xb6\xd4\xea\xa1\ +)\xda\xc4\xdb\x8c\xf1F~\x06\xd1\x15\x12N\xe2u\x89\ +\xf6\xb9\x92\xe3\x90)J\xbc?&:\xf8\xb1\xaeO\x89\ +\xdeA\xa2\xdf\xf2\x07\xc1\x07\xf1\xf8\xe5\xe0\xe7\x08\x07>\ +\xba\xa6\xb8\x5c\x9f\xd6\x7f\x9c-\xf1\x1e%\x18A\x17\xcb\ +_\xa4p\x92Y\xe3e\xde\xe0c\xe6\xa4x\xc8\x14\x89\ +\x9e\xb5}F\x07\xcc\x90\xe8i\x16\xd6\xc0\x07\x13\x981\ +E\xdd\xb4\xe7XO\x8a\xa7\x19\xd3\xe8\xcd\x9c\x14\xd5\xa1\ +z\xac z\xf8\xe8\x9a\xa2\xab+\xb582\xc5\xa7\x19\ +\xdf'p\xd3\x81\xd3\x96\xb5\xe5\xf7\x1a\x8b)>_\x0f\ +^\xe25\xe1\xbf\xf9:\xea4\x9a\x84\x8f\xae)^\xcb\ +\xdcC\xa6h\xbf\xcc\x9c\x89u\xe0\xa4\x88\x8f\xda\xa0\xd2\ +\xba\x07\x89g\x89.\xaeg\xa2\x1c\xa9\xa6xUZ-\ +\xb7+\x988m\xb2\xff\x0e\xd4\xe0\xdd\x84\x1c\x5c\x03\xbf\ +\xea\xf0\xc9z\xf0\x92\xaf\xcf;\xc0\xc8\x8fs\xb5\xba&\ +\xec\xfa\xb3u\x1f\xa2\x12-\xf1\x9c\x8c\xba\xa6(\xf1$\ +\xc7!\xa2\x09H\x97h\xa6x/\xf1Ib\x0dD{\ +\x803\xdd\xc7Q\xe6\x1f'*\x1f\x12o\xcb\xebS\x0f\ +\x91\x90t \xf1\xbeJ\xd4\xc4#t\xf7\x13\x84\xaf\x0b\ +\x85\xc8\xbc\xaa)\xce^\x9fZ\xcf\x89\xeb\xd7\x89\x0a\xc6\ +\xa2!\x9b1E\xf91:)\xee3\xae\x10\xbb&`\ +\xbf\xa3\x93\xa2\xbd\xdas\xd7\x14\xe5\x9b\xbc\xbb\x91\xa8\xb8\ +\x8a\xebS\xf9Q\x9b\x04\x9f#7\x88\xb5\xda\xe9@\x93\ +\x87\x0f\xf5\xbe\xc6i\xde\xa8\xf1\xef\xd7\x83\x97x\x8d\x8f\ +]\x821V\x10;\xda\xa4&;\xf88\x93\x98\xe2\xe8\ +\xfa\xf4y\xc6\xed\xbb\xcb\x07\xbd\xd34\xf9\x8c5\xacg\ +\xdd\xeeI\xd1Z\xb7_\x07n\xd6\xd8R\xab\xff\x90\x0f\ +\xb2\xef\xf7M\xab\xe5\xc7\xb9\xa6\x88\xc0\x911\x22w!\ +\xda\xcf\xacq\x15Gr\x89w\xe8\xa48C\xf4\xf2\xcb\ +\xec\x91)\xee\xf3\x993\xa6x+\xf3\xef$j\xe2\xbd\ +\xc8\x18\xa2\xf1\xd2\x01\xfe\x15\x0b\x11\xa9\xf0;E\x82\xfa\ +\xaa~\xe3\x82\xef\x89\x1d\xaeG\xa6\xf80\xe3O/\xb8\ +\xce\xe8\xc7\xb6\xba>u\xd2\xda\xd2\x14u\xa7#S|\ +\x9c\xf1\x19S\xfc\xc5\xeb}\xdb\xff\x1aL`\xd6\x145\ +\x1f[\x99\x22>F\xa6\x88\x8b}\xa2k\x02\xea\xdbs\ +\xac\xa6(\x97\xf1\xf1\xaf\x89\x0e\xd4\xdf.qs0\xf9\ +*L\x11\x1f[^\x9fV>\xf0\xab\xf9\xe8\x9a\x22>\ +h5}\xf2z\x8d\xab\xd0\xea/\xb2 C\xaf\xb0\xdf\ +\x19\xad^n\xf5>)\x0b\xe3\xe3abK\xad~\xab\ +)\xda\xd3\xc8\x18\x15!\xa2+ta\x92\xba{R\xf4\ +Y\x88>d\x8a\xdf\xe5{\x7fLt\xb0\x10]M\x00\ +\xd1\xfb\xc4\x93\xce\xa2\xaf\xe78\x92K\xbe\x9axL\xd1\ +i\xeeBD\xe7\xe7*\xce3E\xdd4>\xba\xa6\xf8\ +\xbe^\x9f\x1e2\xc5\xd9\xebSy\xa1I\xa8&\xe0t\ +(7\x14\xa3\xd7\x1d\x10\x0e\xcd\xcd\xc8\x14\x89G\xf7\xa4\ +\xe8\xe4\xcc\x00F\xa6\xb8\x88\x9e\x1c\xec\xe0\xd3L\xc2\xc7\ +y\xd7\xa7j\xa7\x83\xe5\xfa\xf4Z\x99,\x97\xef'f\ +L\x11\x1f\xa2\x82&\xd1\xa6\xeeI\xd1^\xf112E\ +'E\xfb\xee\xf2\xb1\x5c\x9fV>h\x1dS|\x96\xe8\ +\xe2z&\xdeJTm\xba*\xad>d\x8a\xb4\xc9\xfe\ +;P\x83\x1a\x90\x91V\xab\xc3\x93\xce\xa2\xaf\xe7\x5c\x99\ +V\x13\xe75n\xe7\x8d\xa8Doy$\xbf\x8a\xee\xe3\ +^\xf6<\xea><\xc0\x99\xee\xe3(\xf3w\x89z]\ +(\xf1>\x5c\x9f\x86\x84\xd7\x98\xbd>e*\x87L\x91\ +\xb1h@\xba&\xe0\x84(?|\xad\xd8g\x801v\ +M\xd1\xc9yd\x8a/3N\xa8gL\xf18\xf3G\ +\xa6x\x15\xd7\xa7\xf8\xa8MB\x86\xceD\x9aXwM\ +\xc0\xc9\xf9\x8bD\xd5\x15'g\xcf\xd0-H\x07\xf4\xe8\ +N\x82\x09ThL\x7f\x97\xe8\x9a\x22\xdd\xf0\x0c\x0f]\ +\x9f\xce\x98\xc0\xd24}\x9c\xf5\xd7\xc0\xef\xb7\x09\xda\xd7\ +\xc5\x96Z\x8d\x8f\x91)\xbe\xeb\xd7\xa7\xbb\xec{\xa4\xd5\ +\xf2C\x9e\x5c\x18K\x02Kc\x8a:\xd3]\x027k\x10hD\xe3\xa5\x03\ +& \xf1~9\x98<{}\xba\x9c\x14k7F\xf8\ +\x1f%\x9e\x0d>\xf3\xa2C\xf6\xfbY\xa2&\xdeb\x02\ +\x04\xbb\x03|X\xf7\xd7\x83\xc9\x8c\x85\xc1\xf8\x8c\x0e\xf0\ + ?F\xa6\xf88\xe33\xa6(\x9f\x99\xb9\xfd\xaf\xc1\ +\x04\xec\xb9k\x8a\xf2\xed8q#Q1k\x8a\xea\x04\ +\x1f#S\xc4\xc5>\xd15E\xc6\x22\xaf\x17M\xc9\xcb\ +3\xbc\xca\x7f\xdfUSdX\xb4id\x8a\xb4\x83)\ +v\xf9p\xfa\xc4\x87\xcfX\xc3z\x9a\x8f\xae)\xca\x8f\ +CZ\xfd\xae\x1f`\xe4^\xd5j\xda\xf40\xb1\xa5V\ +_\xca\x14\xb3\x97\xbf$\xb1\x22\x1c\x99\xe2\xbb|$w\ +}z7QM@\xe2\xed\x13\x0a\xbd\x0bGr\x1d\xaa\ +$\x5c\x83)*\xf2K\x13\xfdz\x11\x22\xaa\x10G\xa6\ +\xf8}\xc6u\x91\x84\xa4\x03\xa6\x88\x0f_\xd7XL\x91\ +1v\xb1\xe5\xdf>e.#St\xe5\x86\x8f\x19S\ +\xc4\x87pl\xed\x8f\x13kX\xcf\xba\xcf\ +\xd6\x83\x97|}=?\x7f;Q\xb5\x09\x0f\x1av\xe6\ +\xd8\x81\x5c\x96\xd3r\xbb\x82\x89k\x12<\xcf\x0e\xb6\xbe\ +>\xbdr\xadF\x86n]!V\xa2\xaf\xa2\xfb\xd01\ +\x8d\x88\x9e=\x92Kf\x0f\xf1\x93\xc4\x1a\x12\xcf\x03\x9c\ +\xe9>\x14\xe2.A\xa4\xd6\x90x\xef\xea\xf5)3\xbc\ +\x97\xa8M\x02\xe1W\x88O\x13](D9R\xf9 \ +\xd0\x0a\xf1\xdf\x13\x1dh\x12\x0e\x99\x22c!z\xa7\x9d\ +\x853\xc7\x09\xf1\xabDm\x12,\xb7O\ +%\xa6\xbf\x5c/\xfa\xfa5\xe1 z\x0a\xa7\x03\xe2\x7f\ +712\xc5G\x19\x7f\xd6Y\xf4\xf5\x1c\x22}\x9c\xa8\ +\xa6\xf82c3\xa6h\xbd\xcf\x12L\xa6b\xd6\x14\xf1\ +\xa0[\x1f\x99\xe2\xe3\x8c\xcf\x98\x22\xd1\xf3\x1c\x99\xd8\x1a\ +\xa7y\xe3\x19vMQ\xbd\xd8\xb3\xf5+\x98\x22\xae_\ +\xd4o\x5c\xf0=A\xb2\xf6\xc8\x14\x9ff\x1c'\xdd&\ +\x81\xb10\x81j\x8aj[\x8d\xcf\x98\xe2\x9d\xccW\x8f\ +\x15\xc4\x0e\x1f]S\xfc8s\xe9\xc7\xc8\x14i\x87F\ +\xb2\xabM?\xcf\x5c|\xf8\x8c54\x1d\xdf&h_\ +\x07\xf4\xe8Vb\x0bS|\x9bV\xdbw\x97\x0fZ-\ +\xf7\xaa)\xfe\x10Z\xdd5E\xcf\xee.R*$\x9c\ +\xc4c\x8e\x1dX\x13\x19\xa3\x22\xbf\xaa#y%Z\xe2\ +\xed\x13D\xaf\x8b\xf3\xaeO\x89^\x97h\x22\xaa\x10\x0f\ +\x99\x22\x01\x995\xc5j\x02\x12\x8f)\x8a.\x5c\x9f\xee\ +\x12Ll\x0d\xa6\xa8X\x08v\x07\xf8\xf8Mbd\x8a\ +[]\x9f\xda\xe7I\xe2a\xa2k\x02\xf2\xd9s\xb4\xff\ +5\x98\x22>\xba\xa6h=\xa7\xdb\x91Po}}\xca\ +\x04\xba|\xd8\xaf:\xbf\x96X\x83\x88~\x97\x981\xc5\ +\xa3\xccg\x04\x15K\x83\xda5E\xba\xe1\x19\x8e\xb8~\ +\x9eq|tM\x80)\xe2\x83\xb0\xaeA\x9b\xac\xdb5\ +Ek]O\xdcN0\xc85\xf0@\x9b\xb6\xd0j\xfb\ +\x95\xd7]m:\xef\xfat\x9fu\x9f$\xba\xd8J\xab\ +\xe5\xb2\x9b\x95\xbf\xad\xc6\x88\xe0\x19S\x94\x14Dod\ +\x8a\x0b\xd1\xdd\xc4\x93\xcc\x92zd\x8a\x0aq\xf6\xa4x\ +'kT\x13\x90x\xb3\xd7\xa7\xf88d\x8a\x92\xba\x9b\ +x\xcc\xd0CtBZ\x83\xd0)\xc4\xa7\xeb\xc1K\xbe\ +V\x88\x9f%*\x1f\xae\xf2\xec\xf9\xdf\x13\x1d0\x01\xeb\ +\x8eL\x91\xb1X\x9b\xd1t\xf0\xb6\xebS\xc6\xd85\x01\ +M\xc2\xe7\x09\xfb_\xe3e\xde\xd8\xf3\x16\xa6\x88ck\ +\xe3\xbc\x83O3I~\x8cN\x8a\x8f2\xfe8\xd1\xe5\ +\xc3\xf5\xa9Z\xac\xfa\xe1\xd9}\x93\x981\xc5]\xe63\ +\xc6\x0a\x8d)m\x9a1E\x0d\xc8\xe8\x9f\xa8<\xcf8\ +\x0d\xe9j\x93\x7f\x82\x86\x8fj\x8aj\xdb\xba\xef\xe2\xf5\ +\xe9E\xb4\xba\xabM[j\xb5\xdc\xd8%\xaa6\xc9\x0b\ +\xf9\xd1=\xc0\xe0C\xbd\x9c\xe5\xc7:\xb1\x91\xf0mb\ +\xa6\xfb \x1e[\x98\xa2#\xf9\xc8\x14\x15\xb6\x22\x9f5\ +\xc5]\xd6\xa8\xdd\xd8\xd2\x9d\xce^\x9f\x12\xd5\x0a\xc2A\ +@\xba\x89\xc7\x14\xbfL\x8cL\x91\xe0=Ktq#\ +\x13w\x89\x9ax\xa7\x19\xb3\xe7\xae)Z\xef\xb3\x84n\ +\xaf\xe2\x7fe\x80\x09\xf8\x8c\x0e\xf0\x80\x0f\xbcT\x9cd\ +@tM@>\xff&QM\xd1\xb3\xc3G\xd7\x14\xf1\ +\xb1K\x8c\xfe]\xef\x8b\x8c\xab\xc5\xae)j\x1e\xf11\ +2\xc5\xa7\x19\x7f\x94\xe8\xf2A\xf4\xd4\xf9G\x895\x98\ +\x8a=\xcf\x98\xe2\x9d\xcc\xbf\xb9^\xf4\xf5\xeb\xe5\xe4\xdc\ +5\xc5\x8f\xb3\x0e\xfd\x18\x99\x22\xed\xd0HvM\xd1I\ +qd\x8a\x7f\xca\xf8\x8c)\xd2#\x5c\x8cN\x8a4Z\ +\xbdl\xa9\xd5\xaf\xb2~\x07[j\xf5Q6\xb4K\xa8\ +\x9d5h\xb5Z\xec\x9a\xa2\xda\xa6M\x7f\xc9\x8f%\xb9\ +\x91\xf0?\x13\xfe!u\x07\xd6Q\x88\xe7\x99\xe2\x0c\xd1\ +w\xb3\xf6\xe8\xa4\xb8\xcf\xf8\x93D\x17DZ1J\xc2\ +5\x08\x93\xc4\x9b!\x9ax\x9cg\x8a]\x13 \xfe\xf8\ +\xa8&@\xe8\x08\x9e\xe8\xc2~w\x89j\x02/3\xf6\ +m\x82\x81u \x91\x99\xcb\xc8\x14\xff5\xe3\xd6\xf6\x19\ +\x1d0E|(\xc8\x8a\x93\x0c\xec\x13]\x13\x90\xcfD\ +o\xa9\x93\xbc<\x83gG\xf4\xec\xbd\x03||\x96\xb8\ +>\x98l\xed\xff\x91P\xec\x1d\xa8\x13|\x10\xec\x0a\xa6\ +\xc8\x04\xba|0Eu~-\xb1\x06S\xc1\xc7\xf7\xeb\ +\xc1K\xbcV\x7fG\x89[\x839xp\x12\xe8\xf2\xc1\ +\x14\xed\xd9\xde+\x9eg`\xd6\x14\xad\xed3\xd6`\x8a\ +\xd6\x9d9)\xca\x8d\x916i\x0ehS\xb7a\xdfR\ +\xab\x97\xebS9\xb8\x86|{\x90\x98\xd5\xea]\xd6P\ +;k\x5c\x95V\xbfq\xab\x87$\x85\xc8\x14\xbb'\x01\ +IA\xf4\x0e\x99\xe27\xf9\x9e\xc2\xe9@2\x13\xa6J\ +4\x93E\xf4\xecIQ\xe2U\xa2%\xde\xd7\x89\x99\xc4\ +\xc3\xc7\xaf\x12\x15\xbaiI\xddm\x12\x98\xe1\xbd\x043\ +X\xe3*\x12O!\x1e'\xaa):\xb5\x10\xa6n\xd3\ +d=&02E\xa7-|\xc8\xc1\x0e\x5c\x9f\xe2\xc3\ +\xd7\x8a}\x06\x18#n:\xf8u&y\x8e\x95\x0f\x06\ +n\xcf3'E<\xe3\xbb\x02\xd7j\xb1\x9b{\x9ff\ +.>F'\xc5G\x19\x7f\x9c\xe8\xf2\xf1\x8b\xcc\xfd<\ +QM\xd1\xb3S\xe33'\xc5]\xe6\x1f%*4\xa6\ +\xb8\xee\x9a\x22\xdd\xf8*\xf1\x97\x93@^/x\x9e\x17\ +\xcc\xbc\xabM\x1f\xaeO\x17&\xff\xfc\xf5\x90Vk\x12\ +\xf0<\xa3\xd5rc\x97\xf8\xc1\xb4\x9a1\xfe\xf7D\xf7\ +H\xaeH\x14\xcb!St\x12\xe8&\xdeyG\xf2\x07\ +Y\xf7*\x88\xd6\xa9\xae\xc1\x14\x99@W\x98\x88(1\ +=d\x8a\x04d\xc6\x14u\xa7#S$xO\x13]\ +\x10i\xe6U\x13\x8fP\xdbs\xd7\x14\xadg\xdd\x91)\ +^\xc5\xf5\xa9\xa6id\x8a\x0cQtM\x80\xe8\xd9\xb7\ +\xe7\xb9\x86g\x87\x8f\xae)\xca\xb7]\xe2F\xa2\x02\xc7\ +\xea\xa5[\x8bL@~\x8cLQn\xc8\x11\x22\xd5\x01\ +\xd1S\xe7\xd5\x14\xd5\xb6=\xcf\x98\xe2\x9d\xcc\xbf\x99\xa8\ +P\x833\xa6\xf8q\xe6\xcb\x8fC\xa6\xe8D\xd7\xd5&\ +\xa7qk\xfb\x8c5\x16\x13\x989)\xde\xca\x82\xb7\x13\ +U\x9b\xe4\x05>\xba\xf9\xf1Q\xe6\xd2&\x0dN\xc5\x1f\ +2\xe09\xbe\xaa\xdf\xb8\xe0\xfb\xf3\xb4\xfaQ\xd6\x98\xd5\ +\xea\xe3\xacQ\xf9\xa0\xd5\xf8\xd8B\xab\xff7\xb2\xbaD\ +K\x0a\xc5r\x9e)\xce\x10}7k\xd7\x93\x22\xa1\x9b\ +5E\x22\xbdKT\xa2_d\x8c)\xeaR; \xa2\ +\xf88\xcf\x14O;\x0bg\xce\xd6\xd7\xa7\x12\x8f\x89\xad\ +\xf12o$^\xf7&\xc1z\x0aqd\x8a\x8c\x85\xc1\ +\xf8\x8c\x0e4\x07\xf2CAV0\x80\x87\x89\xae)\x12\ +\x0e\xfbV\x1bkxv\xdf%f\xaeO\xf1|c\xbd\ +\xe8\xeb\xd7\x9a\x04|hD:P'\xf8 \xd8\x15L\ +\x91\x09t\xf9XN\x02#S\xc4\xc7\xfbx}\xca\x04\ +\x98X\x078\xfe212E<\xcf\x98\xa2\xdc\xb8\x93\ +\xa8\xda$/\xd4b\xd7\x04\xb6\xd4\xea\x1f\xe2\xfa\xb4\xf2\ +\xb1\xb5V\x7f[\x8b?\xdc_\x08\x88vE1*\xc4\ +\xd9\xeec)\xc4j\x8a\xba;\x897\xd3}\xdc\xcc|\ +\x89WM@\xf7\xf1u\xa2\x9bxD\xe3\xb3\xc4!S\ +\x94\xd4\xdd&\x01\xc7\xba\xd3\xd1I\x11\x1fO\x13]8\ +)\x12k\xa6\xbe\x86B\xd4$tO\x8a\xd6\xc3\xc7?\ +&*\xfe-\x03\xd6\xee6\x09N\x88rO\xb3P\xf1\ + \x03O\x12]\x13\xf8u\xe6\xdaw\xad\x8b\x97\x19\xf3\ +\x0c\xed\xbd\x03\xf9v\xc8\x145\x1e\xf8\xf0\x19\x1d|\x9a\ +I\xf7\x12\xa3\x93\xe2\xa3\x8ck\x14\xba|h\x124{\ +\xd5\x14=;F>sR\xdce\xfeQ\xa2Bc\x8a\ +\xeb-\xaeOO\xb2.N\xba\xa6\xe8&A-VS\ +T\xdb\x9a\x84\x19S\xbc\x9d\xf9\xa2\x9a\x80\x83\x8b\xfc\x98\ +9\xc0h\x9a\xfe.Q\xf1\xbej5>\xba\x07\x18\xb5\ +\xad\xf1=\xa4\xd5\xf2\xfa\xb4\x0a@\xc6\xde\x8ae\xe1-\ +L\xd1\x09\xe0\xf3D5E\x85\xcd\x04fLQ\x11\xee\ +\x125\xf1\xae\xe2HNLGD;] \xbak\x8a\ +\xc4\x7fd\x8a\x19>\x13\xbcg^4q=\xf3\xec\xfb\ +'e>S\xb4\xe7\xae)Z\xcf\xba#S\xbc\xaa\xeb\ +\xd3\x91)2D\xd15\x81C\xa6\xe8\xd9\xe1\xa3k\x8a\ +\xf2m\x97\xb8\x91\xa8\xc01\x13\xe8\x9a\xa2:\x91\x1f#\ +S\xd401\xc5\xae\x09\x10R\xb5x-\xb1\x86\x06\xf5\ +\xdb\xc4\x8c)2\x80\x9b\xebE_\xbf\xd6\x98\xce\x98\x22\ +\xc3\xc2\xc7\xa1\xeb\xd3\x87\xf9^\x97\x0fzg\xedj\x8a\ +\xd6\x9b5\xc5[Y\x03'U\x9b4\x07\xf8\xe8\x9a\xe2\ +\xa2\xd5[\x98\xe2\xd6Z}'\x7f\xee\xaaM\x8bVw\ +MQ\xc3~\xc8\x14\x17\xad>\xcd\xcf\xfcUgl\xec\ +<(\x12\xc9\xf1\x0f\x83\x1f\x9a\xed>\x10\xad\xb3\xd1\x01\ +\xafA\xe8\x1e$fL\x91H\xef\x125\xf1^dl\ +\xa6\xfb@4\xf1\x18\x99\x22\xe1 \xa8gD\xe7\xebe\ +A\xfc\xf11:)>\xca\xb8\xe8\xc2~\x8f\x135\xf1\ +\x08\xb4B\xdc\xea\xfa\xd4\xda>\xa3\x83\xf3\xaeOO\xb2\ +\xe0>\xd15E\xf9\xfcY\x82\x90\xac\xc1\x14\x89\xde\x16\ +\xd7\xa78\xc6\x87F\xa4\x03\xa6(?F\x0d*S\xbc\ +\x9f\xe8\xf2\xb1\xdc\xda\xa8\xf75\x98\x22>f\xaeOw\ +\x99?2E&\xa0\x16}\xed\x80a}\x99\xb0\xf7\x8a\ +\xe7\x19`\xe63\xa6hm\x9f\xb1\x86\xf5\xf0\x9e\xd6\x0f\xbc\xc4{\ +\x85\xc8\x14\x99\xfa\x1aK!vO\x8a\xd6\xc3\x87&\xa4\ +\xc2ik\xc6\x14\x0f]\x9f\x12\xfe}\xe2I\xa2k\x02\ +\x87N\x8a\x0c\xdc\x9e\xed\xbd\x03\xf9\x86\xe7\x1b\x83\xc9N\ +\xce\x8a\xdcgt /\xbeJ\x8cN\x8a\x8f2\xfe8\ +\xd1\xe5\x83\x90\x12\x90j\x8a\x1a<\x8d\x9e\xdc\xee\x80\xf0\ +\xef\x12#S$v\xb8\xee\x9a\x22\xdd\xc0\xc7\xe8\xa4x\ +\x92q\x9c0\xb1\x0e\xce\xbb>e\xb6L\xa6\x0b\xba\x84\ +\x0f\xdc\xac\xf1\xe1\xfat\xcd\xc6\x9f\xff\xa7\x0e3\xa6(\ +\x97i\xd3\x85\xb5\xfa\xa2\xc6\xe8\xe7~\x938d\x8a\xba\ +\xc8W\x89\x0e\x9c\x14\x15b5E\x85=k\x8aDI\ +\xf2\x11\xa95\x1c\xc9\x15y\xd7\x14\x17\x13\x18\x11\xfd\xc6\ +\x91|\xfd\xa1\x17|\xed\xa4\xf8Ebd\x8a\x8a\xfc\xd9\ +\x05\xd7\x19\xfd\x18\xd3\x22\xd6\xf6\xbf\xc6\x8b\xbc\xc1G\xd7\ +\x14\xf1k\xdd\x91)2\x01\xa27c\x02\xf2\x03/\x15\ +\x1a\x84-LQ.\xe3\xa3k\x8a\x84n\x97\x90\x7f\x15\ +8\xb6v\x97\x0fu\x82\x8f\x91)\xca\x0d\xa6\xd85\x01\ +\xf5m\xedj\x8a\xcbIq\xc6\x14og]&P\xa1\ +\x06\xe5G\xd7\x145\xec\xf6<2E'\xc5\x87\x89.\ +\x1f\xd6T\x8b>c\x0d\xeb\xddO\xcc\x98\x22.n%\ +\xe4\xca\x1ax\xc0\xc7V\xd7\xa73Z-\xe7p=\xd2\ +\xea\x07\x19\x9f9\xc0\xa8\x95CZ\x8d\x8f\x99\x93\xe2!\ +S<\xa8\xd5\x1f\xe5\x03\xdf\x06E\x229\x5c7UH\ +\x8co\x13\x84\xa4\x03\xa6\xf8e\xe2\xd32\x99)\xee\x13\ +3D;\x09\x1c'\xaa)2\x01DwM\x80\xa9H\ +\x8e\x91)\x12\x0e\xa2w\x9a\xe8\xc0\xc9\xe8nbd\x8a\ +\x8f2N\xf4p\xd3\x81\xfdJ\x90j\x8a\xf6\xaa\x1bs\ +\xb5\xd7\x01~\x7f\x93\x18\x99\x22c\x991\x01<\xe0C\ +\x9eT\x9cd`\x9f\xe8\xf2!\x9f\xf1Qk@.\x13\ +\x0fE\xd3\x01>v\x89\xa3\xc1d\x1c\xcb\xbd\xff\x18|\ +\xef\x22C\x9f\xe4\x87\xf0\xf1\xf3\xc1\x0fk\x12\x1e$\xba\ +&\xb0\xdc\xda\x8cLq\xc6\x04\x08\xff.\xc1\x08*\x98\ +\x80\xdc\xf3\xb5\x03\x86E?\xec\xbd\x82)\xd2\xa6.\x1f\ +8\xb6\xb6\xcfX\xc3z\xf8\xb0~\x07\xf8P+\xbb\x84\ +\xd7k\xc8\x0b|t\x1bv\xcf\x8e69\xf5W\xccj\ +\xf5\xdb\xaeO\x9f\xd5\x0f\xbc\xc4\xfb\x1fC\xab\xd5\xb7Z\ +\x1cju\x15\x85\xfag\xf1}D\x1f2\xc5\xd9\xeeC\ +\xe21\x835$\xde\xa3\xc4\xc9z\xf0\x92\xaf\x97\xeb1\ +\x22\xb5\xc6\xcb\xbc!\xd43\xa6x;\xf3G\xa6H\xf4\ +\xf01$:\xe3o\x83\x13\x11>|]\x83\xf0\xe3b\ +\xc6\x14\x15\x0a\x13\x18\x99\x22>\xec\xbd\x03\xfc\xe2cd\ +\x8a:<\xc2\xa4\x11\xe9@^h\xc8F\xa6\xf8$\xe3\ +\x0f\x13]S\xfc\xfb\xcc\x95\xd7\x1f%\xd6XL\xf1\x9f\ +\xd7\x83\x97xM\xe8\x8e^G\x9d\xe6\x04\x80\xeb\xae)\ +\x12h\xf912E\xa2\xb4O\xa8\x9d\x0e\xac\x89\xebO\ +\xca\xe4?\xe6\xfd\xfdD\xb7A\xc5\xc7\x8d\x04N*\x98\ +\xa1\xfc\xe8\x9a\xe2b\x02#S\xf4\xfc\xec\xbb\xcb\x87\x9c\ +\xc3Gm\xd8\xad\xb7O\xe0\xbb\x0b\xb5r\x9c\xc0\xcd\x1a\ +\xf2B~tMQ.\xcb\xe9C\xa6\xf8\xaej5-\ +\xa5M?\xb4V\xcb\xbd\xd3\xc4\x10U\x18\xd6?\xe4{\ +\x92\xe3\x10\xd1\x1e\xa2\xc2\xe9@\xf7q/Q\x13\x8f\xd0\ +I\xe8\x99\xc4S\x88\x12\xaf\x12\xed\xfaT\x870c\x8a\ +\x12od\x8a\xcb\x91\x9c\xf1v\xc0\x0c\xf1\xf1\xb32\x19\ +\x1f\x0f\x12O\x13]\x13P\x88\x12\xaf\x9a\x22\xc3\xc2\x87\ +\xab\xce\x0e\xf0k\xdd\xeb\x83\xc9\xcb\xf5i\xd7\x14\xf1\xf0\ +U\xa26\x09>\xeaI\x02']>\xfe\xb0\x1e\xbc\xe4\xeb\xdb\xf9\ +yQA\xfc\xf1\xd15EM\x02m\xd2\xe0T<\xcf\ +\x00\x13\xe8j\xd3\xdff\xaeZ\xf4\x19k\xfc)o\x88\ +\xa9\xf5\xbb\xb8\x99\x89\xbb\x84\x5cY\x03\x0f\xf8\x981\xc5\ +CZ\xfd}\xd6}\xdf\xb4Z\x9d\xe0\xe3G\xd3\xea*\ +\x0e\xd9\xcb\x19\xdef\x8a\x12\xa4\x9bx\xef\xe3\x91\x1c\x1f\ +\xc4\xe3\x90)2\x98\xd3D\x07NFw\x13\xcc`\x0d\ +\xc2\xff(\xc1\x08\xba z#S\xb4\xd7YS\xc4\x07\ +\xd3\xad\x985E\xcd\x12>F\xa6x\x92\xf1}\xa2k\ +\x8an>F\xa6\xf8*\xe3\xf8\xf8\xb7D\x07\xe7\x99\xa2\ +\xd3\xb8\xb5gL\x11\x1f\xa3\x93\xa2\x86I\x93@\xb4;\ +p\xda:d\x8a\xf7\xf3\xbd\xae)\xe2\xe3N\xe2V\xa2\ +\xc2M\x02>fLQ\x930:)\xce\x9a\xe2rr\ +\x1e\x99\x22\x9egLQ\x83 \xaa).&\xb0\x85)\ +z~\xef\xa3V\xcf\x98\xe2\x95h\xb5E*\x8c\x1d\xea\ +>\x10\xad\x1b#$\x1d,\xa6\xc8\x0c\xd6P\xd8L\x80\ +\xf0u\xb1\xe5\xf5\xe9!S$z\xba\xb1YS\xac&\ +@\xf8q\xf18\xd1\x85\x93\xbe}\xff\xb4,`\xaf\xf6\ +\xa1\x09\xe9\xe2z&\xca\x91\x91)\xe2c\ ++S\xfc.k\x7f\xd0\xea\x90\x10\x5cJ\xab\xab1J\ +\xbc\xcf\x13D\xb5\xe2\xc3\x91\xfcMF>\x5c\x9f\xbe\xc9\ +\xc7\xecI\x91 \xddK\xd4&\xc1\xa7e\x8a\x9a\x1b\xfb\xef\xe0\xc3\ +\xf5\xe9\x9b\xac9\xc0\xa8E\xb77k\xa8?y'\xff\ +\xba\xb8\x91\x89\xc7\x89\x9f\x94\x05\x96\x93\xf3\x8fv}\xba\ +\xde\xcfZ(\xbcV,#ST(3\x89\xb7\x9c\x14\ +GD\xef\xb3\xf6\x0c\xd1\xe7\xfd\x8d\xa6\x1f\xfdH\x9e?\ +\xdb\x08\x87\xaeO\xfd\xacS\xa2\xee\xb4k\x02[^\x9f\ +\xba\x96\xd5\xfdV\xcc\x9a\xa2\xbc\xb8\x9b\x18\x99\xe2I\xc6\ +\x1f&\xba|\xfc\x18\xd7\xa7\x8a[\xee\xbd\xab\xd7\xa7\xea\ +|d\x8a\x0f2\xde5E\xa7\xa1;\x09\xa6X1{\ +}j\xaf\x87L\xf1y\xbe\xf7]\xa2k\x8a[]\x9f\ +\xe2\x03\x17\x1a\x05\xaf\xd7XL@\xb3\xd0\x01\xad\xc6\xc7\ +H\xab\xaf\xe2\x00\xa3\x16\xb7\xd0j\x0d\xeaq\xa2\x9a\xe2\ +\x8b\x8c\xbdSZ\x8d`8\x8fh\x85\x22\xf1>\x1c\xc9\ +1u\xc9#\xf9\x9f\xa7\xbc\xf1\xdf\xc5\x14\xab\x09\x10~\ +\xa6\xf8\xf0\x8d\x9f\xbe\xdc\x1b\x85\xe2d\xf4\xd32\xed4\ +\xef\x9d\x04\x18X\x07\x12Y\x81\x8fLq\xab\xebS|\ +h\x10\xf6\x09\xaf;p\xba`\x02K\x9e/k\xc8e\ +\x8d\xdeV\xd7\xa73\xbfSt2\xfa2A\xb0+4\ +\x90\x0f\x12\x7f\xaa\xdf\xb8\xe0{\xa7O\x82\xcah\xd6`\ +*N\x02\xbf_\x0f^\xe25\xe1?J\xdc\x1c\xccq\ +B\x94{\xdd\x93\xa2\xbd\xe2\xe3\xd0I\xd1\xbe\xbb\xa6\xe8\ +\xfa\xd4\xda\xd5\x04\xf0\x8b\xe7\xa7\x89.\xfc\xaa\x811\x8e\ +L\x11\x1f[\x98\xe2\x07\xad~\xf3iiPq}\xfa\ +\xe6\xf0\xdb\xdf\x11\x0c\x89G<\xb6\xea>\xfeK\x1f\xc9\ +\xcb#`\x86_%\x98\xe3\x1a\x84\xff*\x0a\xd1\x89\xae\ +\x9a\xa2n\x8cP\xcf\x98\xe2V'\xc5\x9fe_\xf2\xa3\ +6\x09\x19:k\x10N\xf2\x157\x1d89\xcbk9\ +\xbe\xc6\xfbz}\xca\xb4\x98\x00\xd1\xee@}\xe3\xa3\x9a\ +\x22\xd1\xd0\xf8\x12\xd5.ng\xe2\xc8\x04\xfc\x8e\xf5\xeb\ +D\xd7\x14?\xce\x5c{>d\x8a\x9a\x9b\x19S\xfcm\ +\xe6\xfb\x8c5\xf0k]'\xd1.4\x08\xbbD5E\ +<8\x19ma\x8aN\x8a\xf6\xfd*\xd1\xc1\xfbz}\ +\xea \xf0\xab\xc1\x1fx\xeaW]D\x83P\xeb$+\ +\xb6<\x92?\xcc\x87\xe9~\xbb\x90xw\x12\xf5HN\ +\xf4f\x8e\xe4LE!\x1e\x22\x9a\xc1\x5c\xba\xfb\xc8\x1c\ +`\x86\xba\xd3j\x8a\xbe\xf78\xa1;\xed\x9a\x00\xd1\x1b\ +\x99\xa2\xbd\xce\x98\x22>\x8e\x13\xa3\x93\x22\xa3\xb56\xe3\ +\xed@\x97\x8e\x8f\x91)\x9ed\x5ct\xf98\xef\xa4\xf8\ +M\xd6}\x17\x7f\xa7(/\xe4\xde\xa1\x93\xe2\x8c)\xfa\ +\xcb*\xd6\xae\xa6\xc8T\x88\xa9Z\xef\x80\xf03EQ\ +A\xfc\xd5b\xd7\x14\xed\xf5\x8b\xc4\x16\xa6\xe8w\x8ar\ +\xef\xe3\xc4\x1aLq\x9f\xe8\x9a\x22>\x16m\xf2z\x0d\ +M\x82z\xd9\xca\x14\xe5\xf5\x8c)\xde\xcd|5\xb9\x86\ +\xfa{\x98\x98\xd1jZz\x9c\xd8B\xab\x99\xa2_\xa5\ +U\xa8\xef)\xad\xfe(\x0b\x8cLQ\xf7\xa8\x8b\x9c%\ +\xba\x9a\xc0B4#\xe8\x02\x11w\x12#\xa2%\x87\xe3\ +s\x07L\x80x\x8cL\xf1_2N@\x18M\x07x\ +\x90x\xba\xb25\xf0\x81\x0b\xc9\xd7\x85\x93\x91\x04\xb1\xff\ +5\xec\x15\x1f\xb3'EWB\x15Wu}J\xa0*\ +\x9ed`\x9f\xc0M\x07\x84\x94\xa0\xca\xed5\xe4\xb2g\ +8c\x8a73\xffh\xbd\xe8\xeb\xd7\x8b\xe8\xf9\xddQ\ +\x07\x9a\x03'\xe7\x9f\x0d&\x13\xa5\x19ST\xdf\xf8\xb8\ +V\xd6f\x8a\xd6\x9d1E\x5c\xdc*\xebz\xfb\xff\x12\ +\x84i\xc6\x14\x19\xd7!S\xa4M\xf6\xdf\x81\xebS\xb5\ +XM\x80)>HjN\ +\x13=&\xd05\xc5L=3\x80#/\x0a\x88\x1e>\ +\xba\xa6H\xa0\x09S\x15\xea\x0c\x9d\x99\x96}\xdb\x7f\x07\ +D\x8f\xc1\xe0|\x0d\xfc\xdeOtM\xd1Z\xb8\xb8\xed\ +E\x01\x1e\x98@\xd7\x14\xd5\xb6g\xc8\xd0+ \xe5Fg^\x00\x00\x00\xb0IDA\ +Tx\xdab\xfc\xff\xff?\x03\xbd\x00\x13\x03\x1d\x01]\ +-c$E\xf1\xb5k\xd7:\xef\xde\xbd[F\x8eE\ +>>>\x8ct\xf3\x15(m\xd05\x18Y6o\xde\ +\xdc\x0e\xa4\x99\xb1\xb8\xe4\x9c\xa9\xa9\xe9^II\xc9\xd7\ +\xd4\x08FP\x941n\xd9\xb2\xc5\x09h\xb03\x90\xc3\ +\x0a\x13\xfd\xf7\xef\xdfiKK\xcb}bbbo\xa9\ +\x19\x8c\xe0H\xdb\xbe}\xbb\xc3\x9f?\x7f\x9c\x80L\x0e\ +\xa0E'lll\xf6\x09\x0b\x0b\x7f\xa0v\x9c\xb1\x80\ +\x18\x9e\x9e\x9e\x07v\xed\xda\xf5\xf7\xfb\xf7\xef\x1c\xf6\xf6\ +\xf6'\x04\x04\x04>S;5\x92\x9a\xf2\x87Xj\xa4\ +W\xa6\x06\xa7\xc6\xd1\x82\x98\x1a\x00 \xc0\x00\xb7\xafV\ +\xaf\xe8MV\xce\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x00\xed\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xa7IDAT8\x11c`\x18\x94\xe0\xff\xff\xffy\ +@|\x06\x88?\x03\xf1s \x9e\x0d\xc4\x02D;\x16\ +\xa8\x18\x06~\xc0\x18@z\x11)\x06d\x035\x08\x03\ +1\x0b\x10\xb7\x011\x08\xbc%\xda\x00d\x85@\x8d\xc1\ +`\xed\xff\xff\xbfB\x16'\x8a\x0d\xd4\xc8\x07\xc4G\xa1\ +\x06L%J\x13L\x11P\x93\x1b\x10?\x81j\xde\x0b\ +\xa4\xb9`rD\xd1@\x0d\x1dP\xcd\x13\x814\x13.\ +M8%\x80\x1a\x9e\x01\xf1g >\xc6\xc8\xc8\xf8\x0f\ +\x97\x01\xb4\x13\x07:;\x1d\x88\x1f\x03q&Y\xb6\x00\ +5\x9e\x05b\x10\xb8\x80\xcf\x00|a0\x1b\xa8\x11\x14\ +\x0e\xb3\xf0\x190\xf0r\x00@\x8a\x97\x8d\x98\xfc\xc1&\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x8f\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00\x19tEXtSoftwa\ +re\x00paint.net 4.0\ +.10\xad\x0a\x0a\xc0\x00\x00\x01\xffIDATH\ +K\xb5\x93](\x83Q\x18\xc7OBr\xe3k\x97.\ +$wJ\x22\x17\x8a;7\xb8\xb1+\xb9Y\xb9\xe0\xc5\ +\xf21_%WVjJR\xaeei\x91\x5cP\x92\ +\xf2Y\xd8\xac\xb1\x0d\xdb\x9a\xd5$\xad\x94BrA\xb6\ +\xe9\xf1\x9c\xd3^\xb6\xf3\x9e\xb4\xd5\xf1\xd4\xaf\xb7\xf3\xef\ +\xed\xf7?\x9d\xf7\xbc\x04\x00\xfe\x15a(\x13a(\x13\ +a(\x13a(\x13a(\x13q\x98\x98\xce\xce\x83\xb2\ +\xf5\xf5\xb7\x05\x97+zsq\x11{\xc2g\xc0f{\ +\x9d\xd3\xeb\xd7J\x13\xaf\x90\xd6V+\x19\x1f\xf7\x91\xa1\ +!7C\xe3\xe2\x03\x16\xe244X\xea\x1c\x8eh\xc4\ +\xef\x8f\x83\xdb\x1d\x03,`\xcf@ \x0ev\xfb\xe7m\ +}\xbd\xb9\x8a\xbe\xd7\xdc\xbc\x98yAIIu\xe1\xfe\ +\xfeG\x88\xca\xa9\x98\x87\x96lo\xbf_\xeat\xb5\xd9\ +\x1d\x1d[dt\xf4*\xb3\x02\x83aW\x09\x85\xc4r\ +\x15\x9f/\x0e\x13\x13\x81e\xa3\xd1\xd9\x82\xe2\xec\x8c\x0a\ +\xa6\xa7\xef\xd6\x82\xc1\xbf\x0b\xae\xafc\xb0\xb4\xf4\x02}\ +}g\x80\xe2C\xa4\x22\xed\x02\x8b\xe5~'\x9d\x02\xab\ +\xf5\x05z{\x1d\xb4\x80\xe2G\x8ayW\xcaB\x05?\ +\x9a5\x9d#\x9a\x9f\x7fH.\xa0\x98yW\xcaB\xa5\ +\xa6f\xac\x9d\xee\xd0\xe3\x11\xcb\xbd\xde\x188\x9dQ0\ +\x99<00p\x9e\x5c\xe0\xe3])\x8b\x9f\x90\x90\xfc\ +\xc9\xc9\xe0^8\xfc\xc5d\xbc\x9c\xde\xae\xd9\xd9\x08t\ +u\x1d\xb3\x92\xa4\x82g\x8d\x8b\x0fX\x88\x93\x9b[P\ +\x8e\xb7\xe4\x88\xde}z\x5c\xf4j\xd2c\xc1\x7f\x00f\ +f\xee\x01\x7fB^N\x89h\x5c|\xc0\xc2\xdf)\xaa\ +\xacT\x8c\xb8\xd3\x0d\x94~\x9a\xcda\xe8\xee>ar\ +N\xac\xb2\xa1q\xf1\x01\x0b\x05\xd3\xd6\xb6:\xa5(\xa7\ +\xd0\xdf\xef\x12\xed\x9c\xf2\x854j\x5c|\xc0Bn\xf2\ +\xf2t\x04\xef{\xce\xc8\xc8\xe5\x0a'U\x89#\x83\x88\ +\xd6\xc5\x07,\xe4\x86\x16\xf4\xf4\xd8\xc9\xf0\xb07\x0b%\ +\x0ar\x82<\x22\x11d\x13iB\xd2\xff\x93e\x22\x0c\ +e\x22\x0ce\x22\x0c\xe5\x01\xe4\x1b\x94\x9cF\xa5\xd4>\ +\xe0\xe7\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x9d\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Carret / 16\ +x16 / white\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \x0d\x0a\x0d\x0a\ +\x00\x00\x03\xf7\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x0f\x08\x06\x00\x00\x002=50\ +\x00\x00\x00\x19tEXtSoftware\ +\x00Adobe ImageRead\ +yq\xc9e<\x00\x00\x03\x22iTXtXML\ +:com.adobe.xmp\x00\x00\ +\x00\x00\x00 \ + <\ +/x:xmpmeta> \xd7\ +`\x1f'\x00\x00\x00kIDATx\xda\xa4RA\ +\x0e\xc0 \x08\xb3d\xff\xffr\xe7\x0cd\xdd\x14\xe2\xb2\ +^PR\xa0RA\xb2\x05\x00\x5c\x17hNaJ\xec\ +@?\xb2\x9fk\xb2\x17\xb4\x0a\xd6> #/\xa5d\ +\xe4\xd0\xfe(2\xd9BUt\x8f\xdc\x88\xcc\xc8\x93~\ +\x8d\xdc\x5c\x06\x8f)\xf3rO\xf5\xc2;\xa7\x16\xab\xc3\ +\xb6z\xf1/\x07\xe3\x83\x8d\xf1\xde\xb5\xd21\x08\xa7\x00\ +\x03\x00\xc0\x86+\x1f\x02#C\xaf\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x02\x11\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x11\x00\x00\x00\x11\x08\x06\x00\x00\x00;mG\xfa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +\xcbIDAT8\x11\x95S\xbfK\x02a\x18\xf6\xee\ +D\xbb\xe8\x0c$hju\x09rSZZ\x1ak\x09\ +\xc4]Cq)hi\x8c\x0a\xe7\x86&A:[;\ +\x89\x96@\x07\xff\x85&ii\x0c\x1b\x02q\x0aO\xc5\ +;{\x9e\x8fS\xbe\xbb\xce\xa8\x0f\x8e\xf7\xc7\xf3|\xcf\ +\xfb~\xaf\xafJD:\xb5Zm\x1f\xe1\x19\xbe\xecl\ +63\x14E\xe9\xe1k\xa9\xaaZ-\x95J\x9f\x12\xd5\ +\xe7*\x8c,\xcb\xd2\x07\x83\xc1\x0d.V|\xa8\x17@\ +\xa8\x0f\xa1J\xb9\x5c~\x0c\xc3U&\xe7\x02 \x0fA\ +>\x87\xdd6\x0cc=\x1a\x8d\xee\xc1\x7f\x82\xf8\x86\xe3\ +8\x16:\xdd\x0d\x13Q\xf8\x04\x90:\x9e@\x06\xd5^\ +\x83Dp\xae\xc0\xb9\x00\xe7-\x1e\x8f\xa7\x0b\x85\xc2H\ +\xe6\xb0\x13\xce \x02\xc2e\x98\x00\xb1d2y\x0d\xbc\ +\x0b\xa1\xd4x<>dN>\x14\xc92\x81g<\xcb\ +\x80\xec\xe7\xf3y\x07q\xdb\xcbed\x8c\xbe\x0au\x83\ +\x8e\xae\xeb\x1f\xb4\xbf\x1c\x81\xa3\xa3D\x90\xa3\x22\xd9c\ +\xd2\xb6\xedt\x10\x94c\x14\xdba\x0c+\xf82F\x91\ +\x16\x13\x98\xbe\x98\x8d\x0c\xce}\xd34\xb7\xe0\xe7\x18k\ +\x9a&\xf8s\x8c\x16\xa3P\xab\x10\xea\xa3\xc2\x11\x7f\x05\ +\xec\x8c&\x13(0\x99L\x9a\xc8%\xc0kb\xe9^\ +d\x9c\xbeX6\x5c\xceA\xe4\x011;\xeb\xc2\xb6a\ +{\xae\xeb\xf2\x89\xec\x80sp\x91\x1b\xa1\x93S\x08\xdd\ +!^\x1c!\xc2\x08B\x5c\xa4{\x88\xa5\x16\xa8\xe7\xb0\ +\x03\xb8\x07\xb0\xab\x10\x1eb\x09}B\x0b\x11\xf2\x1b\x8d\ +\xc6\x8a\xb7\x07\x19\x5cHp\x88\x9c\x01\x9fP\xaf\xd7\x8f\ +\xa7\xd3\xe9-\x9e\xffC\xc8'\xe2\x15^j\x82B(\ +p\x82\x055\xff%B\xf5\x80\x90\x1d\x8b\xc56\xc5\x1f\ +pi\xe9\x10\x80Ce\x07\x98\x8d\x0d\xf8\xbdX,~\ +\x85\xd0\xfe\x96\xc2*\xacaf\xe2%\xdfA\x95\xca\xc7\ +*\x85\xdf<\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +@IDAT(\x15}R=K\xc4@\x14t\x03\ +I `\xa9\xf5\xf5\xf6\x82\xa5?\xc0\xd2+#I\x8a\ +\x0b(\xf8S\xb4\x91K\x02I\x91\xf2\xda\x03;\xbd?\ +`%\xd8\xdb\xfa\xc15B\x0eR$\xce,^x\xb7\ +f\xef\xc1\x86\xbc}3\xb3\xf3v\x9f\xaa\xaa\xea\xa8m\ +\xdb\x07\xcf\xf3\xae\xe38\xfe:\xd8\x13}\xdf\xab<\xcf\ +\xef\x00Y\xa6i\xfa\xa4\xb2,[`\xf3R)\xf5\x06\ +\x81s\x9b\x00\x89EQ\xcc\xbb\xae\x9b\x01\xbbv]w\ +\xe2\x04ApC\x22\x8a'p\xb0\xa2\x13\xf3pID\ +m\x835M\x92\xe4\xc7\x09\xc3\xf0\x93'\xda\x04L\x22\ +p\x17\xb4\xcc\x03\x14?\x8c\xbf\xdeWt@!\x0aF\ +Q\xf4\xbd\xb5\x0a\xc8F\x12\xc9\x19\xc8LL\x01\x80_\ +\xd0\xe3\x15J\xff\x88\xc4\xef\x90\xb9!\x05\x98#F\x89\ +,8\xfc\xc8\xa0U\x9e(\xf6>\xd0\xc2\xab\xc8\x87\xdf\ +\x1d\xb2\xb8\x1cm\x15\xa8w\xac\x89\xed\x15\x06\xb2 \xce\ +@\xd0V}\xdf?\xe5\xe5\xf1\x12\xc7\x04t\xcfc\xc4\ +\xeds\xc8;\xa0\x90\x1c$\xb5\x8f\x08\x07:l\x02\x1c\ +\xcf{\x08\xdc\x02e\xbdU*\xd4u}\xdc4\xcd3\ +[\xa0\x03\x8c\xe7\x19{^\x22Yc\x0d\x93C\xb0\x19\ +r\x12Q{\xe4xjLY\x96\x87&\xd8\x96K\xec\ +/\x1b\x84\xfc\xc1\x8c\xd2u\xb1\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x00\xa5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0d\x00\x00\x00\x09\x08\x06\x00\x00\x00\xe9z\xa6j\ +\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x00 cHRM\x00\x00z\ +%\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00u\ +0\x00\x00\xea`\x00\x00:\x98\x00\x00\x17o\x92_\xc5\ +F\x00\x00\x00+IDATx\xdab\xfc\xff\xff?\ +\x03\xa9\x80\x89\x81\x0c@\x96&\x16(M\xac\x1b\x19)\ +\xb6\x89qp\x06\x04Y\x9a\x00\x00\x00\x00\xff\xff\x03\x00\ +\xd93\x04\x143;\xb1\x87\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\x89\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +CIDAT8\x11c`\x18\x058C\xe0\xff\xff\ +\xff\x0d8%\x89\x91\x00\x1a\x00\x02\xe4\x1b\x02\xd1O\x81\ +!H\x06\x80\x988]\xc2D\x8cw\xc8R\x83\xe4\x02\ +\x9c\xb6\xe35\x18j\x00y\x9aA&\xe3\xf37^\x9b\ +G\xa0$\x00\x17\x1fq~\xb4\xd9z\x1d\x1f\ +3\xbe5u\x06\x00\x15@\x17\x17\x17\xee\xf2\xf2\xf2C\ +\x80\x8d7\x97\xa3hj\xd7\xc8g7u\xe3t,\x1c\ +s\x19\xd7\x94\xe9\x9c2\x99Cw<&P]\xd5<\ +\x96\x9a\xa8\xf9/\x0f\x87\xbd(\xc9\x5c\x14+\xc1\x93$\ +\xc0\xed\xed-u*\x91\x8f\xc7\x08*\xcb\x8d\x1c[\xe9\ +\xca\x0d\xb8\xa2\x1fz:zxx\xa01d\x5c/\xcb\ +Q\xc7\x9b\xfb\x7f1\x03\x8e\x1d\xd9\xd5\xf7\xeah\xbb\xdd\ +\x9e\xe8x\xf3\xc5b-G\x1f\x02\xa1\xcee\xf8\x7fW\ +WW\x91\xcc\x9b[\xbaf\xfa{\xe4\xff\x85\xbf\x8a\xf2\ +l\xc5\xff\x8a\xb5\xcc\xe4\x22\xf3\xe6\xdfMg\xcb\x9f/\ +\xa9Dy\x0f\xb03\x07\xd3\x85\x0b\x11U\x88\x19d\x0d\ +v\x93\x03\x9f\x81\x9am\x96u\xa2(\x9cY\x07#\xcf\ +-\x1b#\x07j\xf01D\x0e*\xa6\xb2,Hz\x22\ +\x07\x90yTd\xda\xd6\xee\xb0\xdf3\x99,\xd5\x91\xc6\ +\x91\x83\x12eCPJ\x9a\x02\xc7\xe3\xd1\x97\x8e\xca\xed\ +\xa5\x8c\x80PRPZ\xa8'\x01:X\x9btP>c\x1dC2\ +\x00\x96Q_\x8fG\x042\x94\xd0^j\xb3m\x82\x80\ +\xf0\xe4\x1b\xe4\x09\x12\x067\xf4\x83\xea\x8f>P\x82\x03\ +?\x82d\x00\x05k\xba>\x0d\xb5\xbeK\xd5\x0c\xc6\xca\ +\x15Ve\x8d0\xc6\xc6\x91\xae\x94\xf0\xd1\xc6\x8f\xb9G\ +X\x89\x8d\x18\xc0\xac\x5c\xbf\x05\x94z\x94w\xdb\xd8\x02\ +\x81,\xf5~J!\x19@\x9e{\x05\x94\xfc\x02e\xbf\ +p\xb9\xcc\xd9\x02\x84w\xdb\x8e-\x01\xc4G\x9b\xbc\xb5\ +T_\x9aW\xbf\xa3\x0c\x04\x1d\xe8b-\x87\x1f\xefS\ +})\xde\x08\x00}FZ\x85\x00\x9cX\xe7\xd2:r\ +wssC\xe7\xfaZ\xdc\xa9\xae\xc8G\x1d\xda\xe6\x0c\ +\xca\x02\x81\x0d\xda\x0eZ\xd4\xa8\x83V$6\xc9\x00\xd6\ +\xd2z`0\xb5\x1d\x19\xc3@\xe6\x84\x97\x81S\x97r\ +\xb5!h\xa7\xf6:\x9f|\x85z\x98'\x03\xe0\x0b\x94\ +/T}\x85\xa2\xe3\xd0\x01[X0\xf7\xe0\x1ck\xe8\ +N\x98S\xae\x9d\x8a\xeb^\x0f2\xe3\xd6\x0e\xd3\x01\xc0\ +\xd1\x17\xe1$\x80\xe5r\xf9[\x84\xafX\xf8t\x9c-\ +\xffb?\xbf\xf5w\xd3b\xf1\x0f@\xa3L\xc0\x04h\ +D\x14\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02J\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc1\x00\x00\x0e\xc1\ +\x01\xb8\x91k\xed\x00\x00\x00\x19tEXtSof\ +tware\x00paint.net \ +4.0.10\xad\x0a\x0a\xc0\x00\x00\x01\xc7ID\ +ATHK\xb5\x94M(DQ\x18\x86\xbf\x18\x0bV\ +\xd8XP~\xb2\xa1XQ\x9a\x1a\xff\x8d\xbf\xc2\x8a\x14\ +E)\x0b\x0b+YX\xf9YY\x88,fa#\x0b\ +?\x99\x0c!EFbc\xa7P,\xacf\xa5XX\ +*|\xdes\xcc\x9d\xe9~\xf7\xc8L\x1d\xa7\x9en\xe7\ +\xbd\xdf<\xef\xedv\xee\x103\xff+\xc6\xd0&\xc6\xd0\ +&\xc6\xd0&\xc6\xd0&\xc6\xd0&\xe60\xbe\xd8O%\ +<_\xb0\xc2\xbb\xa1\x07\xde\x0f\xbf\xe0z\xcf\xd3\x19\x8b\ +\x5cME\xf1\x11\xe2J\xd0\x05\x82q\xa4K\x06:T\ +?,\xa5Z\xde\x0a\xc5\xf8,\xca|\x10f\x14\xfc\x5c\ +\xa3\xd8o\xce=q1U\xeb\xb9\x0a\x90n\xc1B6\ +\xe5\xf2\xea\xc8\xa3\x96+\xb1D\x95,\xf7\xdc,\xe5\x90\ +\x8fk\xe0\xe8H\xb3\x80\xebh\x8c\xaf~\x91;\x9c\xe2\ +~7\xads3uB\xecK\xaf`\x80\xb6\xf9\xe2\x8f\ +\x82\x130\x89\xf1&\x10\xa4((O\xbd`\x90\x8eS\ +*\x98\xc2x#\x08j\xee@\xbet\xb96\x09\xbah\ +-\xa5W4\x8a\xf1d\x81bV\xba\x5c\x1b\x87\xafB\ +\xea\xd7Ox(\xa4\x0eG`'\xc4\xdc\x86\xf1V\x90\ +,\xb8\x95.\xd7&\x11\x12\xe5p/\x9d\xf25\xe6\x95\ +L\xca\xd5\xe9\x1a\xc6h\x00\xa8\x92d\xc1\xab\xc7%\x03\ +\x1dbUeR\x19N\xc9\xb9>\xfb\xeau\xa9\xa3\xa9\ +^\xcb\xe6\x1c\xf3\x10\xc6\xfc\xc0-W\xc4<.\x19\xe8\ +0\xb9\xf2\xde\x0ah\x1cO\x1a\x81\xf4\x9d\xfbp\xbb\x1e\ +(\xb9[\xec\x10\xf1\xb8d\xa0C\xc3\xc2\xdf\xc3\x0c7\ +\xe0v\x0b\xf0>\xb9\xe2\x13\x04<.\x19\xe8P,\xbf\ +\x0fsM\x94\x85/vCH\x1d>\xc0\x04\xc0F\xb8\ +d\xa0C\xb1tA\x03h\xa7\x0cH\xc6\xc0%x\x06\ +1\xb0\x07ZA\x1a_\xb2E\x8c\xa1M\x8c\xa1M\x8c\ +\xa1=\x98\xbe\x01\xe0\xca\x0eT\xdaK\xf7\x1c\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x02/\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\ +\x01\xc7o\xa8d\x00\x00\x00\x18tEXtSof\ +tware\x00paint.net \ +4.0.5e\x852e\x00\x00\x01\xadIDA\ +T8O\xadS\xbfK\xc3@\x14N\x15\x8a\x08Zh\ +\x07'\x17Q;\xe9\x7f\xe0\xa0\x82\xd0\xc1R1\xc9]\ +lEt(\x88\x9b\xb3\x10p\x15\x85\xda\xdc\xb5\xb5\xfe\ +\x18*\x0a\x15G\xc5\xc1\xd1E\xba\x16\x7f\x94\xb6\x97\x86\ +\x0a\xe2\xa8(\xb8\x18\xdf\x85\xabUj\xa5\xa2\x1f|\x90\ +\xfb^\xde\xf7^\xde\xbbH\xff\x06FQ\x80\xc5\xf1\x94\ +\x9dU\xda\x85\xd4\x00[\xd7\xdb\xcc\x04\x96M\x8a\xc7\x84\ +$Iy]q3\x82b&A\x87\xcc\xc0k&\xc1\ +4\x9fU\xdc\x22\xfc\x81RJ\xf10\xa2\xde2\x03\x15\ +LC=-\x1b\xaa\xee\x14+&\xb4\x01H\xde\xe1\xee\ +\xfcE\x8b\xe2\x95\x0aA\x13VR\x1e\xfaLF\xf1\x02\ +\x14z\x06^Z\xeb\xb2\xb7LQ\xe2*\x1e\xf2IU\ +\x82z\x1d1-{\xaf\xb7\x83]\xf0\xbcU&\xe8\x00\ +\xda\xdc\xfdB\x03\x1fC\xa1G\xe8\x22W\x8c\x83!A\ +\xfb\x85X\xb8\xdbi\x0f\xdc\xa20\x83\x0cw\x85O\x88\ +|7\x07\xe7\xfb)^\x82\xc4\x0b(p\x02F\xa3\x22\ +\x04AIr\x99T\x9bfD\x0b\xd9\xb6\xed\x12r\x03\ +t0\xa9P\xb4X\x22xXHu\xf0-\x98I4\ +.\x8eMa\x11m\xde2\xe4~q\xac\xe3w\x06\x91\ +\xbf\x1a\xb4\xd0\x01\x1f\x1a\xdbD\x01\x8b\xaa\xf8.\x15\xed\ +\x14r\xeb\x060\xede\xe0\x0bl\xe5\x15\xee\xc09\xdb\ +\x9b\xeb\xe0zS\x83\x0a\xc5A09\x82\x15mpB\ +\xf2\x03\xd0\xe6\x84\xf3\x1b\xc42B?+S\xd9/\xd2\ +\xea(\xa5\xa2\x9ej|v\xf0\x9e\xce\xf4q\xc2u\xbd\ +\xa9\x19\x00\x9f*D\x9d\xe4z\x95\x86\xfd\xb5n~\x04\ +\xec{\x04\x12s\xce\xfd'xU\xc8\xad\x83\x0f\x11:\ +\xf2\x95\xd2\xb8\xa7\xf9\x1f*I\xef\xc1\x0f\x18\x1e\x99\xde\ +un\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x8a\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Carret / 16\ +x16 / white\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x01w\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x12\x00\x00\x00\x12\x08\x06\x00\x00\x00V\xce\x8eW\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x01\ +1IDAT8\x11\xd5\x93=N\xc3@\x10\x85m\ +\x87\xd2H\x96\x1b\xce\x81p\x89r\x04\xaeBGCA\ +ARp\x12N@\x0d\x8a((\x8c8E\x90hl\ +Kq\xe5\xc6\xbc\xcf\xf2\xaef\xe3\x18!\x10\x05+\x8d\ +\xde\xce{o\xc7\xb3?\x8e\xa2\x7f7\xca\xb2\xec\xbf\xd3\ +tr\xc8T\xd7\xf5iUU\xf7\x8a-:H\x0e\x7f\ +\xc8\x0f\x17\x14\xea\xfb~!\xf3\x8d\xf0!\x8e\xe3\x97$\ +I.\x06\x93\x90\x1c~\xd4\x83u\x93\xe2\x98\x14\x8fm\ +\xdb\x9e8\xd1n\x0d\x1e\x1d\x9f\xd3'(\x91\xed\xbc\xdb\ +\x22\x13\x93\x08t|\xf8\xad\xee[T\xdbWj\xff.\ +M\xd3\x0fk\xd8\x9f\xa3\xe3\xc3o5_H\xe4R\x86\ +g+6M\xb3\xd6\xd7w\xa0\xe5G\xdf2\xe0H\xec\ +9\x90\x17E\x11\x83\x14\x11\xa4\x8a6\xcf\xf3c\xb89\ +/\xda0\xb4h\xab/\x9f\xb9\x1c\x9c\xeb\x08\x1f~\xeb\ +=2\xc9F\xfb>W\xfe\xea\xb8,\xcb\xae5'\x82\ +1\xfa6\x01\xe9\x92\xdf\xde\x9a\xab3 \xefC\xf1\xa3\ +wdo-\xd2VV\xaa\xf8\xd4u\xdd\x9b\x0a^\xba\ +3\x03\xc9\xe1\xd1\xe5\xbb\x0d:\x98K\xb4\xc8\xffk\xdc\ +\x12\x07\xab\xf8\xf2_\x9b\xab\xe5\xf9\xfd\xeb\xf6\xc2_M\ +>\x01B\xfa\xf9|\xed\x9fmw\x00\x00\x00\x00IE\ +ND\xaeB`\x82\ +\x00\x00\x010\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\xeaIDAT8\x11c\xd470x\xfd\xe9\xd3g\ +\x11\x062\x00\x1f\x1f\xef\x1b\x16\x90f+K\x0b2\xb4\ +30\x1c;~B\x84\x05\xa4\xf3\xe5\xab\x97d\x19\x00\ +\xd2\xc4D\xb6N\xa8F\xda\x18`bb\xc2 \x22\x82\ +\x08W)))\x06###\xac\x8e\xc5\xea\x82\xe7\xcf\ +\x9f3L\x9e<\x99\xc1\xd9\xd9\x99!4$\x94\xa1\xb5\ +\xb5\x95\xe1\xc1\x83\x07X\x0d`TTR\xfe\xaf\xac\xac\ +\x88!)--\xcd0u\xcaT\x86\x9f?\x7f2d\ +fe2\xbc{\xf7\x0eC\xcd\xdd\xbb\xf7q\x07\xa2\x95\ +\xa5\x15\xc3\xe7/\x9f\xc1\x9a\x0c\x0d\x0d14\xc3\x04\xc0\ +\xd1\x08\xe3\xc0h___\x06[[[\x86\xdc\xdc\x5c\ +\x06\x0e\x0e\x0e\x86\xa6\xc6&\x86_\xbf~1\x1c>|\ +\x18\xa6\x04N\xe3\xf4\x02\x5c\x05\x1e\x06^/\xe0\xd1\x87\ +\x22\x855\x16PT\x10\xe0\x0c\xbc\x01,\x8c\x8c\x0c{\ +\x80\x81\xe1B\xc0\xa5X\xa5Az\x01\x18\x02>qr\ +\x93/I\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\x13\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\ +\xe2\x01\x13\x13/!\xa8\x81\xf4\xf2\x00\x00\x00\xa0ID\ +ATH\xc7\xed\x901\x0a\xc2@\x10E_\x12\xd2\xd9\ +X\xe6\x1e{ o\xa1\x08VB\x88eR\xa4\xce\x81\ +\xf6\x1e\x966\x16\x01Ql\xa6X\x96uwR\x0a\xf3\ +\xbb\xfd;\xf3\x1e\x0cX,\x96*.\xbc\xf75p\x05\ +\xce\x1bY=pq\xce}\xc2\xb2N\x0c6\xc0\x08\xcc\ +\x1b\xe0\xb3\xec4\xf1GJ\xf0\x06V`\x02\x16\x05|\ +\x91\xd9Uv\xf3'\x0a\xce\xb4\x03:\xe0\x04\x1c2\xf0\ +\x01\xb8\x03\xcf\xf8\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Color Picke\ +r\x0d\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + <\ +/path>\x0d\x0a \ +\x0d\x0a\ +\x00\x00\x09\xb0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / Mode switch\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a <\ +path d=\x22M12,16.0\ +292152 C13.33333\ +33,17.9400254 14\ +,19.2636203 14,2\ +0 C14,21.1045695\ + 13.1045695,22 1\ +2,22 C10.8954305\ +,22 10,21.104569\ +5 10,20 C10,19.2\ +636203 10.666666\ +7,17.9400254 12,\ +16.0292152 Z M9.\ +25164051,14.6949\ +738 C8.85042447,\ +16.3633137 8.576\ +24522,17.3649891\ + 8.42910275,17.7\ + C7.98568996,18.\ +7095529 7.404569\ +5,19.6999936 6.3\ +,19.6999936 C5.1\ +954305,19.699993\ +6 4.3,18.8045695\ + 4.3,17.7 C4.3,1\ +6.5954305 5.2699\ +1427,15.9226723 \ +6.3,15.5196293 C\ +6.6172135,15.395\ +5127 7.60109367,\ +15.1206276 9.251\ +64051,14.6949738\ + Z M14.8345754,1\ +4.8014088 C16.01\ +27069,15.0648087\ + 16.9678485,15.3\ +120589 17.7,15.5\ +431595 C18.79822\ +73,15.8898104 19\ +.7,16.5954305 19\ +.7,17.7 C19.7,18\ +.8045695 18.8045\ +695,19.7 17.7,19\ +.7 C16.5954305,1\ +9.7 15.9042422,1\ +8.8886679 15.578\ +1301,17.8300608 \ +C15.3607219,17.1\ +243227 15.112870\ +4,16.1147721 14.\ +8345754,14.80140\ +88 Z M4,10 C4.73\ +637967,10 6.0708\ +6007,10.6666667 \ +8.00344122,12 C6\ +.07086007,13.333\ +3333 4.73637967,\ +14 4,14 C2.89543\ +05,14 2,13.10456\ +95 2,12 C2,10.89\ +54305 2.8954305,\ +10 4,10 Z M20,10\ + C21.1045695,10 \ +22,10.8954305 22\ +,12 C22,13.10456\ +95 21.1045695,14\ + 20,14 C19.26362\ +03,14 17.9176157\ +,13.3333333 15.9\ +619862,12 C17.91\ +76157,10.6666667\ + 19.2636203,10 2\ +0,10 Z M17.7,4.3\ + C18.8045695,4.3\ + 19.7,5.1954305 \ +19.7,6.3 C19.7,7\ +.4045695 18.7377\ +669,8.05750465 1\ +7.7,8.44495745 C\ +17.3569283,8.573\ +04412 16.3335753\ +,8.88696329 14.6\ +29941,9.38671495\ + C15.0863858,7.7\ +5477945 15.39329\ +82,6.72587447 15\ +.5506781,6.3 C15\ +.9335049,5.26406\ +024 16.5954305,4\ +.3 17.7,4.3 Z M6\ +.3,4.3 C7.404569\ +5,4.3 8.01370378\ +,5.26956118 8.40\ +996484,6.3 C8.53\ +446602,6.6237533\ +5 8.81502458,7.6\ +1417336 9.251640\ +51,9.27126005 C7\ +.60109367,8.8222\ +5889 6.6172135,8\ +.53602693 6.3,8.\ +41256419 C5.2701\ +1405,8.01172204 \ +4.3,7.4045695 4.\ +3,6.3 C4.3,5.195\ +4305 5.1954305,4\ +.3 6.3,4.3 Z M12\ +,2 C13.1045695,2\ + 14,2.8954305 14\ +,4 C14,4.7363796\ +7 13.3333333,6.0\ +8554956 12,8.047\ +50967 C10.666666\ +7,6.08554956 10,\ +4.73637967 10,4 \ +C10,2.8954305 10\ +.8954305,2 12,2 \ +Z\x22 id=\x22Combined-\ +Shape\x22 fill=\x22#FF\ +FFFF\x22>\x0d\x0a \ + \x0d\x0a\ +\x00\x00\x01.\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00\x06bKGD\x00D\x00D\x00DR\x12\ +\xe5c\x00\x00\x00\x09pHYs\x00\x00\x0e\xc3\x00\x00\ +\x0e\xc3\x01\xc7o\xa8d\x00\x00\x00\x07tIME\x07\ +\xe1\x0c\x04\x14\x0b9\xfc\x80B\xbe\x00\x00\x00IID\ +ATX\xc3c`\x18\x05#\x1d0\x92\xab\xf1\xe5\xcb\ +\x97\xff\x91\xf9\xe2\xe2\xe2d\x99\xc54\xd0!0\xea\x80\ +Q\x07\x8c:`\xd4\x01\x18\xa5\x17z\x09Gm\x80^\ +b\x0ex\x08\x8c:`\xb46\x1cu\xc0\xa8\x03F\x1d\ +0\xea\x80Q0\x0a\x007\x04\x0c.\x12\xeez\x1b\x00\ +\x00\x00%tEXtdate:crea\ +te\x002017-12-04T18\ +:19:12-02:00\x07\xb0\xec\x8f\ +\x00\x00\x00%tEXtdate:mod\ +ify\x002017-12-04T1\ +8:19:12-02:00v\xedT\ +3\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xe8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a DefaultProdu\ +ct_16\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x04\x9a\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Icons / Syst\ +em / List View\x0d\x0a Created with S\ +ketch.\x0d\x0a \ + \x0d\x0a <\ +rect id=\x22Rectang\ +le-9\x22 fill=\x22#E9E\ +9E9\x22 x=\x225\x22 y=\x225\x22\ + width=\x2210\x22 heig\ +ht=\x222\x22>\x0d\x0a\ + \ +\x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a <\ +rect id=\x22Rectang\ +le-11\x22 fill=\x22#E9\ +E9E9\x22 x=\x221\x22 y=\x225\ +\x22 width=\x222\x22 heig\ +ht=\x221.5\x22>\ +\x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x03\x22\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ +Path 8\x0d\x0a\ + Create\ +d with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x03d\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \xe2\x80\xa6\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \ + \ +\x0d\x0a \ + \xe2\x80\xa6\ +\x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x04\x8c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Combined Sha\ +pe\x0d\x0a \ +Created wi\ +th Sketch.\x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x04~\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ +Triangle\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a\ + \ + \ +\x0d\x0a \ + \x0d\x0a \ + \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x042\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Combined Sha\ +pe\x0d\x0a \ +Created wi\ +th Sketch.\x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x042\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Combined Sha\ +pe\x0d\x0a \ +Created wi\ +th Sketch.\x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x04\x8c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Combined Sha\ +pe\x0d\x0a \ +Created wi\ +th Sketch.\x0d\x0a \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x0b9\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 14\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x02\xe8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + /SB/hover-right\ +arrow\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a <\ +polygon id=\x22Tria\ +ngle-Copy\x22 fill=\ +\x22#676767\x22 fill-r\ +ule=\x22nonzero\x22 tr\ +ansform=\x22transla\ +te(3.253005, 6.0\ +71995) rotate(90\ +.000000) transla\ +te(-3.253005, -6\ +.071995) \x22 point\ +s=\x223.2530052 3.3\ +2199479 6.669181\ +02 7.0242543 8.3\ +2800521 8.821994\ +79 -1.82199479 8\ +.82199479\x22>\x0d\x0a \x0d\ +\x0a\ +\x00\x00\x04F\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 6\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x02\xe6\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + / SB/focused-le\ +ftarrow\x0d\ +\x0a Creat\ +ed with Sketch.<\ +/desc>\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x04\xa4\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 6\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a\ + \ + \x0d\x0a \ + \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a \x0d\x0a\ +\x00\x00\x09M\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Cursor / S\ +croll Copy 4\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a \ + <\ +g id=\x22Group\x22>\x0d\x0a \ + \ + \x0d\x0a \ + \ +\ +\x0d\x0a \ + \ +\x0d\x0a \ + \x0d\ +\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x02\xec\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + /SB/focused-rig\ +htarrow\x0d\ +\x0a Creat\ +ed with Sketch.<\ +/desc>\x0d\x0a \x0d\x0a \ + <\ +/polygon>\x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x02\xec\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + / SB/MinReached\ +-leftarrow\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22icon-/-Gen\ +eral-/-SB/MinRea\ +ched-leftarrow\x22 \ +stroke=\x22none\x22 st\ +roke-width=\x221\x22 f\ +ill=\x22none\x22 fill-\ +rule=\x22evenodd\x22>\x0d\ +\x0a <\ +/polygon>\x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x02\xf2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + /SB/MinReached-\ +rightarrow\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22icon-/-Gen\ +eral-/SB/MinReac\ +hed-rightarrow\x22 \ +stroke=\x22none\x22 st\ +roke-width=\x221\x22 f\ +ill=\x22none\x22 fill-\ +rule=\x22evenodd\x22>\x0d\ +\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x02\xe8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + / SB/decrease-l\ +eftarrow\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x02\xee\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + /SB/decrease-ri\ +ghtarrow\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x08\xd0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Cursor / S\ +croll Copy\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +defs>\x0d\x0a <\ +path d=\x22M15,0 L2\ +0,4 L15,8 L15,5 \ +L5,5 L5,8 L0,4 L\ +5,0 L5,3 L15,3 L\ +15,0 Z\x22 id=\x22path\ +-1\x22>\x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ + <\ +/feOffset>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + <\ +g id=\x22Triangle-4\ +\x22>\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \ + \x0d\x0a \ + \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x09'\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Cursor / S\ +croll Copy 2\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + <\ +/feColorMatrix>\x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a \x0d\x0a \ +\ +\x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \ + \x0d\x0a \ + \ + \x0d\x0a \ + \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \ +\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\ +\x00\x00\x02\xe8\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + / SB/increase-l\ +eftarrow\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a\ +\x00\x00\x02\xee\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + /SB/increase-ri\ +ghtarrow\ +\x0d\x0a Crea\ +ted with Sketch.\ +\x0d\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02\xf2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + /SB/MaxReached-\ +rightarrow\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22icon-/-Gen\ +eral-/SB/MaxReac\ +hed-rightarrow\x22 \ +stroke=\x22none\x22 st\ +roke-width=\x221\x22 f\ +ill=\x22none\x22 fill-\ +rule=\x22evenodd\x22>\x0d\ +\x0a \x0d\ +\x0a \x0d\x0a\ +\x00\x00\x04\xd3\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 6 Copy\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \x0d\x0a \ +\x0d\ +\x0a \ + \x0d\x0a \ + <\ +/path>\x0d\x0a \ + \x0d\x0a \ + \ + \x0d\x0a \ + \ + \x0d\x0a \ + \ +\x0d\x0a \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\x00\x00\x08\xfa\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Cursor / S\ +croll Copy 4\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x02\xe2\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + / SB/hover-left\ +arrow\x0d\x0a \ + Created\ + with Sketch.\x0d\x0a \x0d\x0a <\ +polygon id=\x22Tria\ +ngle-Copy-2\x22 fil\ +l=\x22#676767\x22 fill\ +-rule=\x22nonzero\x22 \ +transform=\x22trans\ +late(2.753005, 6\ +.071995) scale(-\ +1, 1) rotate(90.\ +000000) translat\ +e(-2.753005, -6.\ +071995) \x22 points\ +=\x222.7530052 3.32\ +199478 7.8280052\ +1 8.82199478 -2.\ +32199479 8.82199\ +478\x22>\x0d\ +\x0a \x0d\x0a\ +\x00\x00\x04F\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 6\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a <\ +/g>\x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x04P\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 6 Copy\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \x0d\x0a \ + \x0d\x0a\ +\x00\x00\x02\xec\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + / SB/MaxReached\ +-leftarrow\x0d\x0a Cr\ +eated with Sketc\ +h.\x0d\x0a <\ +g id=\x22icon-/-Gen\ +eral-/-SB/MaxRea\ +ched-leftarrow\x22 \ +stroke=\x22none\x22 st\ +roke-width=\x221\x22 f\ +ill=\x22none\x22 fill-\ +rule=\x22evenodd\x22>\x0d\ +\x0a <\ +/polygon>\x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x04\xea\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 6 Copy\ +\x0d\x0a Created with\ + Sketch.\x0d\ +\x0a \x0d\x0a \x0d\x0a \ +\x0d\ +\x0a \ + \x0d\x0a \ + \x0d\ +\x0a \ + \ +\x0d\x0a \ + \ + \x0d\x0a \ + \x0d\x0a \ + <\ +rect id=\x22Rectang\ +le-Copy-3\x22 fill-\ +opacity=\x220.15\x22 f\ +ill=\x22#000000\x22 x=\ +\x221\x22 y=\x220\x22 width=\ +\x221\x22 height=\x2216\x22>\ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \x0d\x0a\ +\x00\x00\x03\x0c\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + /SB/buttonPress\ +Active-hover-rig\ +htarrow\x0d\ +\x0a Creat\ +ed with Sketch.<\ +/desc>\x0d\x0a \x0d\x0a \ + <\ +/polygon>\x0d\x0a <\ +/g>\x0d\x0a\ +\x00\x00\x04\xc9\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a Group 6\x0d\x0a C\ +reated with Sket\ +ch.\x0d\x0a \ +\x0d\ +\x0a \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \ + \x0d\x0a \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a\ +\x00\x00\x03\x06\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a icon / General\ + / SB/buttonPres\ +sActive-hover-le\ +ftarrow\x0d\ +\x0a Creat\ +ed with Sketch.<\ +/desc>\x0d\x0a \x0d\x0a \ + \x0d\x0a \x0d\x0a<\ +/svg>\ +\x00\x00\x08\x87\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ +title>Cursor / S\ +croll Copy 3\x0d\x0a \ +Created with Ske\ +tch.\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \ + \x0d\x0a \ + \x0d\x0a\ + \x0d\x0a \ + <\ +/feColorMatrix>\x0d\ +\x0a \x0d\x0a \x0d\ +\x0a \x0d\x0a \x0d\x0a <\ +g id=\x22Cursor-/-S\ +croll\x22 transform\ +=\x22translate(88.0\ +00000, 195.00000\ +0)\x22>\x0d\x0a \ + \x0d\x0a\ + \ + \x0d\x0a \ + \ + \x0d\x0a \ + \ + \x0d\x0a \ + \ +\x0d\x0a \ + \x0d\x0a\ + \ +\x0d\x0a \ + \x0d\x0a \ +\x0d\x0a \x0d\x0a\ +\ +\x00\x03d\xcc\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIGH\ +E\xd2\xc1\x00\x03OX\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03K8\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03KX\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03K\x90\x00\x00\x03\xc6OS/2\xa0\ +\xd5\x9bQ\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x12\ +\xeb\x13\xa9\x00\x00\x1d\xc0\x00\x00\x00\xaafpgm~\ +a\xb6\x11\x00\x00\x14\xd0\x00\x00\x07\xb4gasp\x00\ +\x1e\x00#\x00\x03K(\x00\x00\x00\x10glyf\xb8\ +\xdazU\x00\x00%\xc4\x00\x01B\xcehead\xf7\ +;\xc5\xa2\x00\x00\x01<\x00\x00\x006hhea\x0d\ +\x84\x09$\x00\x00\x01t\x00\x00\x00$hmtx>\ +\xa1L \x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01h\x94\x00\x01\xb66loca=\ +Z\xec\x82\x00\x00\x1el\x00\x00\x07Vmaxp\x05\ +j\x01\xf8\x00\x00\x01\x98\x00\x00\x00 name \ +\xe6\x82\xa4\x00\x03\x1e\xcc\x00\x00\x06-post\x02\ +C\xefl\x00\x03$\xfc\x00\x00&+prep\xde\ +\x8e\xa2]\x00\x00\x1c\x84\x00\x00\x01:\x00\x01\x00\x00\x00\ +\x01\x19\x9a\xd8\xdaf\xf2_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9B\x14\xdb\x00\x00\x00\x00\xc9\xe8K\xf4\xfb\ +\xd5\xfd\xd9\x09\x1f\x08b\x00\x00\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x09\x1f\xfb\ +\xd5\xfe\xb9\x09\x1f\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00X\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +5\x00\xe4\x00\x03\x00\x01\x00\x03\x04\x87\x01,\x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x01\xec\x08\x02\x02\x0b\x03\x06\x03\x05\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00\x00\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04?\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc1\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x01\xec\x00\xa4\x02\xd3\x00\x85\x05\ ++\x007\x04\x91\x00\xa4\x06u\x00q\x05\xb4\x00{\x01\ +\x89\x00\x85\x02-\x00R\x02-\x00=\x04h\x00h\x04\ +\x91\x00o\x01\xb8\x00D\x02\x93\x00\x5c\x01\xe7\x00\xa2\x02\ +\xba\x00\x19\x04\x91\x00s\x04\x91\x00\xc7\x04\x91\x00q\x04\ +\x91\x00^\x04\x91\x00+\x04\x91\x00\x8f\x04\x91\x00\x83\x04\ +\x91\x00m\x04\x91\x00y\x04\x91\x00o\x01\xe7\x00\xa2\x01\ +\xe7\x00L\x04\x91\x00o\x04\x91\x00o\x04\x91\x00o\x03\ +^\x009\x07\x17\x00q\x04\xcd\x00\x00\x05\x04\x00\xcf\x04\ +\xf8\x00\x81\x05\xa6\x00\xcf\x04j\x00\xcf\x04\x04\x00\xcf\x05\ +\xc9\x00\x81\x05\xc1\x00\xcf\x02o\x00Z\x01\xfa\xffH\x04\ +\xa6\x00\xcf\x04\x1b\x00\xcf\x06\xe7\x00\xcf\x05\xc5\x00\xcf\x06\ +\x1d\x00\x81\x04\xae\x00\xcf\x06\x1d\x00\x81\x04\xc1\x00\xcf\x04\ +\x5c\x00o\x041\x00\x0a\x05\xc1\x00\xbe\x04\x9e\x00\x00\x07\ +#\x003\x04N\x00\x00\x049\x00\x00\x04\x9c\x00R\x02\ +\x8d\x00\xae\x02\xba\x00\x19\x02\x8d\x003\x04\x91\x00X\x03\ +J\xff\xfc\x04\x9e\x01\x89\x04=\x00b\x04\xc3\x00\xb6\x03\ +\xcd\x00w\x04\xc3\x00w\x04d\x00w\x02f\x00\x1d\x04\ +/\x00-\x04\xb8\x00\xb6\x01\xcf\x00\xa8\x01\xcf\xff\x9e\x03\ +\xdf\x00\xb6\x01\xcf\x00\xb6\x07\x10\x00\xb6\x04\xb8\x00\xb6\x04\ +\xb0\x00w\x04\xc3\x00\xb6\x04\xc3\x00w\x03\x1d\x00\xb6\x03\ +\xba\x00T\x02\xae\x00\x19\x04\xb8\x00\xaa\x03\xac\x00\x00\x05\ +\xc9\x00\x1f\x03\xfc\x007\x03\xac\x00\x00\x03\xb0\x00R\x02\ +\xd3\x00=\x04T\x01\xfc\x02\xd3\x00H\x04\x91\x00o\x02\ +\x14\x00\x00\x01\xec\x00\xa6\x04\x91\x00\xd3\x04\x91\x00N\x04\ +\x91\x00\x7f\x04\x91\x00+\x04T\x01\xfc\x04!\x00\x81\x04\ +\x9e\x01P\x06\xa8\x00d\x02\xae\x00N\x03u\x00R\x04\ +\x91\x00o\x02\x93\x00\x5c\x06\xa8\x00d\x04\x00\xff\xfa\x03\ +m\x00\x8b\x04\x91\x00o\x02\xb0\x005\x02\xb0\x00)\x04\ +\x9e\x01\x89\x04\xc5\x00\xb6\x05=\x00q\x01\xe7\x00\xa2\x01\ +\xa4\x00+\x02\xb0\x00L\x02\xe3\x00F\x03u\x00H\x05\ +\xec\x00;\x05\xec\x00\x0b\x05\xec\x00)\x03^\x00J\x04\ +\xcd\x00\x00\x04\xcd\x00\x00\x04\xcd\x00\x00\x04\xcd\x00\x00\x04\ +\xcd\x00\x00\x04\xcd\x00\x00\x06u\xff\xfe\x04\xf8\x00\x81\x04\ +j\x00\xcf\x04j\x00\xcf\x04j\x00\xcf\x04j\x00\xcf\x02\ +o\x004\x02o\x00Z\x02o\x00\x15\x02o\x00:\x05\ +\xba\x00/\x05\xc5\x00\xcf\x06\x1d\x00\x81\x06\x1d\x00\x81\x06\ +\x1d\x00\x81\x06\x1d\x00\x81\x06\x1d\x00\x81\x04\x91\x00w\x06\ +\x1d\x00\x81\x05\xc1\x00\xbe\x05\xc1\x00\xbe\x05\xc1\x00\xbe\x05\ +\xc1\x00\xbe\x049\x00\x00\x04\xae\x00\xcf\x04\xaa\x00\xb6\x04\ +=\x00b\x04=\x00b\x04=\x00b\x04=\x00b\x04\ +=\x00b\x04=\x00b\x06\xc3\x00b\x03\xcd\x00w\x04\ +d\x00w\x04d\x00w\x04d\x00w\x04d\x00w\x01\ +\xcf\xff\xde\x01\xcf\x00k\x01\xcf\xff\xc6\x01\xcf\xff\xeb\x04\ +\x96\x00u\x04\xb8\x00\xb6\x04\xb0\x00w\x04\xb0\x00w\x04\ +\xb0\x00w\x04\xb0\x00w\x04\xb0\x00w\x04\x91\x00o\x04\ +\xb0\x00w\x04\xb8\x00\xaa\x04\xb8\x00\xaa\x04\xb8\x00\xaa\x04\ +\xb8\x00\xaa\x03\xac\x00\x00\x04\xc3\x00\xb6\x03\xac\x00\x00\x04\ +\xcd\x00\x00\x04=\x00b\x04\xcd\x00\x00\x04=\x00b\x04\ +\xcd\x00\x00\x04=\x00b\x04\xf8\x00\x81\x03\xcd\x00w\x04\ +\xf8\x00\x81\x03\xcd\x00w\x04\xf8\x00\x81\x03\xcd\x00w\x04\ +\xf8\x00\x81\x03\xcd\x00w\x05\xa6\x00\xcf\x04\xc3\x00w\x05\ +\xba\x00/\x04\xc3\x00w\x04j\x00\xcf\x04d\x00w\x04\ +j\x00\xcf\x04d\x00w\x04j\x00\xcf\x04d\x00w\x04\ +j\x00\xcf\x04d\x00w\x04j\x00\xcf\x04d\x00w\x05\ +\xc9\x00\x81\x04/\x00-\x05\xc9\x00\x81\x04/\x00-\x05\ +\xc9\x00\x81\x04/\x00-\x05\xc9\x00\x81\x04/\x00-\x05\ +\xc1\x00\xcf\x04\xb8\x00\xb6\x05\xc1\x00\x00\x04\xb8\x00\x1b\x02\ +o\xff\xe7\x01\xcf\xff\x95\x02o\x00$\x01\xcf\xff\xd4\x02\ +o\x00$\x01\xcf\xff\xd4\x02o\x00Z\x01\xcf\x00'\x02\ +o\x00Z\x01\xcf\x00\xb6\x04h\x00Z\x03\x9e\x00\xa8\x01\ +\xfa\xffH\x01\xcf\xff\x9e\x04\xa6\x00\xcf\x03\xdf\x00\xb6\x03\ +\xdf\x00\xb6\x04\x1b\x00\xcf\x01\xcf\x00\x88\x04\x1b\x00\xcf\x01\ +\xcf\x00a\x04\x1b\x00\xcf\x01\xcf\x00\xb6\x04\x1b\x00\xcf\x01\ +\xdd\x00\xb6\x04\x1b\x00\x1d\x01\xcf\x00\x08\x05\xc5\x00\xcf\x04\ +\xb8\x00\xb6\x05\xc5\x00\xcf\x04\xb8\x00\xb6\x05\xc5\x00\xcf\x04\ +\xb8\x00\xb6\x05\x04\x00\x01\x05\xc5\x00\xcf\x04\xb8\x00\xb6\x06\ +\x1d\x00\x81\x04\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x06\ +\x1d\x00\x81\x04\xb0\x00w\x07/\x00\x81\x07\x96\x00w\x04\ +\xc1\x00\xcf\x03\x1d\x00\xb6\x04\xc1\x00\xcf\x03\x1d\x00m\x04\ +\xc1\x00\xcf\x03\x1d\x00\xa3\x04\x5c\x00o\x03\xba\x00T\x04\ +\x5c\x00o\x03\xba\x00T\x04\x5c\x00o\x03\xba\x00T\x04\ +\x5c\x00o\x03\xba\x00T\x041\x00\x0a\x02\xae\x00\x19\x04\ +1\x00\x0a\x02\xae\x00\x19\x041\x00\x0a\x02\xae\x00\x19\x05\ +\xc1\x00\xbe\x04\xb8\x00\xaa\x05\xc1\x00\xbe\x04\xb8\x00\xaa\x05\ +\xc1\x00\xbe\x04\xb8\x00\xaa\x05\xc1\x00\xbe\x04\xb8\x00\xaa\x05\ +\xc1\x00\xbe\x04\xb8\x00\xaa\x05\xc1\x00\xbe\x04\xb8\x00\xaa\x07\ +#\x003\x05\xc9\x00\x1f\x049\x00\x00\x03\xac\x00\x00\x04\ +9\x00\x00\x04\x9c\x00R\x03\xb0\x00R\x04\x9c\x00R\x03\ +\xb0\x00R\x04\x9c\x00R\x03\xb0\x00R\x02s\x00\xb6\x04\ +\x91\x00\xbe\x04\xcd\xff\xf4\x04=\x00b\x06u\xff\xfe\x06\ +\xc3\x00b\x06\x1d\x00\x81\x04\xb0\x00w\x04\x5c\x00o\x03\ +\xba\x00T\x04\x9e\x01+\x04\x9e\x01+\x04u\x01%\x04\ +\x9e\x017\x01\xe3\x00\xb2\x04\x9e\x01s\x01d\x00?\x04\ +\x9e\x01\x1b\x04\x9e\x01\x02\x04\x9e\x02\x12\x04\x9e\x015\x04\ +\xcd\x00\x00\x01\xe7\x00\xa2\x04\xc5\xff\xd8\x06\x1b\xff\xd8\x03\ +!\xff\xd8\x06)\xff\xd8\x05)\xff\xd8\x06H\xff\xd8\x02\ +u\xff\xce\x04\xcd\x00\x00\x05\x04\x00\xcf\x04\x04\x00\xcf\x04\ +\x91\x00\x14\x04j\x00\xcf\x04\x9c\x00R\x05\xc1\x00\xcf\x06\ +\x1d\x00\x81\x02o\x00Z\x04\xa6\x00\xcf\x04\xcd\x00\x00\x06\ +\xe7\x00\xcf\x05\xc5\x00\xcf\x04?\x00)\x06\x1d\x00\x81\x05\ +\xb6\x00\xcf\x04\xae\x00\xcf\x04h\x00=\x041\x00\x0a\x04\ +9\x00\x00\x06\x19\x00o\x04N\x00\x00\x06\x1d\x00{\x06\ +3\x00R\x02o\x00:\x049\x00\x00\x04\xb8\x00w\x03\ +\xa0\x00^\x04\xb8\x00\xb6\x02u\x00\xa6\x04\xc3\x00\xa6\x04\ +\xb8\x00w\x04\xdd\x00\xb6\x03\xd7\x00\x0a\x04\xa6\x00u\x03\ +\xa0\x00^\x03\xbc\x00w\x04\xb8\x00\xb6\x04\x8f\x00w\x02\ +u\x00\xa6\x03\xdf\x00\xb6\x04\x06\xff\xf4\x04\xc5\x00\xb6\x04\ +\x1b\xff\xfe\x03\xac\x00w\x04\xb0\x00w\x04\xe5\x00\x19\x04\ +\xac\x00\xb0\x03\xcd\x00w\x04\xb2\x00w\x03\x91\x00\x14\x04\ +\xc3\x00\xa6\x05m\x00w\x04\x1d\xff\xec\x05\xc5\x00\xa6\x05\ +\xdf\x00w\x02u\x00\x03\x04\xc3\x00\xa6\x04\xb0\x00w\x04\ +\xc3\x00\xa6\x05\xdf\x00w\x04j\x00\xcf\x05\x91\x00\x0a\x04\ +\x04\x00\xcf\x04\xf8\x00\x81\x04\x5c\x00o\x02o\x00Z\x02\ +o\x00:\x01\xfa\xffH\x07R\x00\x00\x07\x93\x00\xcf\x05\ +\x96\x00\x0a\x04\x93\x00\xcf\x04\xb4\x00\x0a\x05\xb6\x00\xcf\x04\ +\xcd\x00\x00\x04\xc3\x00\xcf\x05\x04\x00\xcf\x04\x04\x00\xcf\x05\ +9\x00\x0e\x04j\x00\xcf\x06=\x00\x00\x04y\x00R\x05\ +\xc5\x00\xcf\x05\xc5\x00\xcf\x04\x93\x00\xcf\x05s\x00\x00\x06\ +\xe7\x00\xcf\x05\xc1\x00\xcf\x06\x1d\x00\x81\x05\xb6\x00\xcf\x04\ +\xae\x00\xcf\x04\xf8\x00\x81\x041\x00\x0a\x04\xb4\x00\x0a\x06\ +\x19\x00o\x04N\x00\x00\x05\xc1\x00\xcf\x05\x5c\x00\xb6\x08\ +\x0c\x00\xcf\x08\x17\x00\xcf\x05D\x00\x0a\x06\x85\x00\xcf\x04\ +\xc3\x00\xcf\x04\xf2\x00F\x089\x00\xcf\x04\xb2\x00\x1f\x04\ +=\x00b\x04\x98\x00{\x04\x87\x00\xb6\x03^\x00\xb6\x04\ +^\x00)\x04d\x00w\x05R\x00\x06\x03\x9e\x00D\x04\ +\xcd\x00\xb6\x04\xcd\x00\xb6\x03\xac\x00\xb6\x04\x5c\x00\x14\x05\ +f\x00\xb6\x04\xe3\x00\xb6\x04\xb0\x00w\x04\xcf\x00\xb6\x04\ +\xc3\x00\xb6\x03\xcd\x00w\x03\x91\x00)\x03\xac\x00\x00\x05\ +\x5c\x00w\x03\xfc\x007\x04\xc7\x00\xb6\x04\xa4\x00\xa4\x06\ +\xd1\x00\xb6\x06\xdd\x00\xb6\x05+\x00)\x05\xc9\x00\xb6\x04\ +\x8d\x00\xb6\x03\xee\x00D\x06b\x00\xb6\x04;\x00)\x04\ +d\x00w\x04\xb8\x00\x1b\x03^\x00\xb6\x03\xe1\x00w\x03\ +\xba\x00T\x01\xcf\x00\xa8\x01\xcf\xff\xeb\x01\xcf\xff\x9e\x06\ +w\x00\x14\x06\xdf\x00\xb6\x04\xb8\x00\x1b\x03\xac\x00\xb6\x03\ +\xac\x00\x00\x04\xcf\x00\xb6\x04\x04\x00\xcf\x03^\x00\xb6\x07\ +#\x003\x05\xc9\x00\x1f\x07#\x003\x05\xc9\x00\x1f\x07\ +#\x003\x05\xc9\x00\x1f\x049\x00\x00\x03\xac\x00\x00\x04\ +\x00\x00R\x08\x00\x00R\x08\x00\x00R\x03J\xff\xfc\x01\ +)\x00\x1d\x01)\x00\x1d\x01\xc3\x00D\x01)\x00\x1d\x02\ +f\x00\x1d\x02f\x00\x1d\x03\x00\x00D\x03\xee\x00{\x03\ +\xee\x00{\x03\x02\x00\xe7\x05\xba\x00\xa2\x09\x1b\x00q\x01\ +\x89\x00\x85\x02\xd3\x00\x85\x02\x0c\x00R\x02\x0c\x00H\x03\ +\x96\x00\xa4\x00\xf6\xfe\xb4\x02\xfe\x00q\x04\x91\x00h\x04\ +\x91\x00N\x05\xdd\x00\xaa\x04\x91\x00J\x06m\x00\x8f\x04\ +\x00\x00s\x08\x19\x00\xcf\x05\xcd\x00\x0a\x063\x00R\x04\ +\xf4\x00f\x05\xec\x00\x16\x05\xec\x00 \x05\xec\x005\x05\ +\xec\x00Z\x04\x91\x00w\x04\x91\x00\x14\x05\xdd\x00\xcf\x04\ +\xf8\x00V\x04\x91\x00o\x04d\x00%\x05\x9a\x00{\x02\ +\xe9\x00\x04\x04\x91\x00o\x04\x91\x00o\x04\x91\x00o\x04\ +\x91\x00o\x04\xa4\x00w\x045\x00\x1d\x045\x00\x1d\x04\ +\x9e\x01\x10\x01\xcf\xff\x9e\x04\x00\x01\x9c\x04\x00\x01\x8b\x04\ +\x00\x01\x98\x02\xb0\x001\x02\xb0\x00\x19\x02\xb0\x00D\x02\ +\xb0\x00+\x02\xb0\x00=\x02\xb0\x003\x02\xb0\x00%\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +\x12\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00T\x08\x00\x00T\x01\xcf\xff\x9e\x01\ +)\x00\x1d\x04\xb8\x00\x0a\x04P\x00\x00\x063\x00\x14\x06\ +\xe7\x00\xcf\x07\x10\x00\xb6\x04\xcd\x00\x00\x04=\x00b\x06\ +`\xfe\xfd\x02\xaa\x00{\x033\x00\xae\x06\x9c\x00\x1d\x06\ +\x9c\x00\x1d\x06\x1d\x00\x81\x04\xb0\x00w\x05\xd9\x00\xbe\x04\ +\xee\x00\xaa\x00\x00\xfc\x8c\x00\x00\xfd<\x00\x00\xfcQ\x00\ +\x00\xfd\x14\x00\x00\xfdj\x04j\x00\xcf\x05\xc5\x00\xcf\x04\ +d\x00w\x04\xcd\x00\xb6\x07\xc3\x00\x81\x06\x0c\x00\x00\x05\ +b\x00\x1f\x04\xd9\x00\x1f\x07J\x00\xcf\x05\xcf\x00\xb6\x05\ +\x06\x00\x00\x03\xfe\x00\x0a\x06\xe3\x00\xcf\x05s\x00\xb6\x05\ +\x8b\x00\x19\x04\xd9\x00\x0a\x07\x89\x00\xcf\x06d\x00\xb6\x04\ +y\x00R\x03\x9e\x00#\x06\x1d\x00{\x05\xc5\x00\xa6\x06\ +\x1d\x00\x81\x04\xb0\x00w\x04\xba\x00\x00\x03\xcd\x00\x00\x04\ +\xba\x00\x00\x03\xcd\x00\x00\x09\x1f\x00\x81\x08-\x00w\x06\ +Z\x00\x81\x04\xd9\x00w\x07\xc3\x00\x81\x06!\x00w\x07\ +\xc3\x00\x81\x06\x0c\x00\x00\x04\xf8\x00\x81\x03\xcd\x00w\x04\ +\xd7\x00s\x04u\x00\xdb\x04\x9e\x01\x04\x04\x9e\x01\xe5\x04\ +\x9e\x01\xec\x07\xe9\x00)\x07\xa6\x00)\x05\xc5\x00\xcf\x04\ +\xcd\x00\xb6\x04\xc3\x00/\x04\x8d\x00\x1b\x04\xae\x00\xcf\x04\ +\xc3\x00\xb6\x04\x04\x00/\x03^\x00\x12\x05\x0c\x00\xcf\x04\ +\x19\x00\xb6\x06j\x00\x00\x05\x83\x00\x06\x04y\x00R\x03\ +\x9e\x00D\x04\xfe\x00\xcf\x03\xdd\x00\xb6\x04\xa6\x00\xcf\x03\ +\xac\x00\xb6\x04\xa6\x001\x03\xdf\x00\x1b\x05'\x00\x0a\x04\ +^\x00)\x05\xcb\x00\xcf\x04\xe3\x00\xb6\x06B\x00\xcf\x05\ +\x96\x00\xb6\x08b\x00\xcf\x06\xc9\x00\xb6\x06\x1d\x00\x81\x04\ +\xd7\x00w\x04\xf8\x00\x81\x03\xcd\x00w\x041\x00\x0a\x03\ +\x91\x00)\x049\x00\x00\x03\xac\x00\x00\x049\x00\x00\x03\ +\xac\x00\x00\x04\x93\x00\x00\x04\x0c\x007\x06\xb8\x00\x0a\x05\ +\x83\x00)\x05\x5c\x00\xb6\x04\xa4\x00\xa4\x05\x5c\x00\xb6\x04\ +\xa4\x00\xa4\x05H\x00\xcf\x04\x8f\x00\xb6\x06d\x00=\x05\ +\x17\x005\x06d\x00=\x05\x17\x005\x02o\x00Z\x06\ +=\x00\x00\x05R\x00\x06\x05=\x00\xcf\x04?\x00\xb6\x05\ +s\x00\x00\x04\x5c\x00\x14\x05\xc1\x00\xcf\x04\xe3\x00\xb6\x05\ +\xc1\x00\xcf\x04\xe3\x00\xb6\x05\x5c\x00\xb6\x04\xa4\x00\xa4\x06\ +\xe7\x00\xcf\x05f\x00\xb6\x02o\x00Z\x04\xcd\x00\x00\x04\ +=\x00b\x04\xcd\x00\x00\x04=\x00b\x06u\xff\xfe\x06\ +\xc3\x00b\x04j\x00\xcf\x04d\x00w\x05\xa2\x00\x7f\x04\ +d\x00w\x05\xa2\x00\x7f\x04d\x00w\x06=\x00\x00\x05\ +R\x00\x06\x04y\x00R\x03\x9e\x00D\x04\x81\x00R\x03\ +\xae\x00\x1f\x05\xc5\x00\xcf\x04\xcd\x00\xb6\x05\xc5\x00\xcf\x04\ +\xcd\x00\xb6\x06\x1d\x00\x81\x04\xb0\x00w\x06\x1d\x00\x81\x04\ +\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x04\xf2\x00F\x03\ +\xee\x00D\x04\xb4\x00\x0a\x03\xac\x00\x00\x04\xb4\x00\x0a\x03\ +\xac\x00\x00\x04\xb4\x00\x0a\x03\xac\x00\x00\x05\x5c\x00\xb6\x04\ +\xa4\x00\xa4\x04\x04\x00\xcf\x03^\x00\xb6\x06\x85\x00\xcf\x05\ +\xc9\x00\xb6\x04\x04\x00/\x03^\x00\x12\x04\xa8\x00\x00\x04\ +\x0c\x007\x04N\x00\x00\x03\xfc\x007\x04\xc3\x00o\x04\ +\xc3\x00w\x06\xdf\x00q\x06\xe9\x00w\x06\xee\x00R\x06\ +\x0a\x00P\x04\xa0\x00R\x03\xd7\x00V\x07s\x00\x00\x06\ +\x83\x00\x14\x07\xe7\x00\xcf\x07\x0a\x00\xb6\x05\xdf\x00\x81\x04\ +\xe9\x00w\x05j\x00\x0a\x04\xf0\x00)\x04\x87\x00s\x03\ +\xa0\x00^\x05s\x00\x00\x04\x5c\x00\x14\x04\xcd\x00\x00\x04\ +=\x00b\x04\xcd\x00\x00\x04=\x00b\x04\xcd\x00\x00\x04\ +=\x00b\x04\xcd\x00\x00\x04=\x00H\x04\xcd\x00\x00\x04\ +=\x00b\x04\xcd\x00\x00\x04=\x00b\x04\xcd\x00\x00\x04\ +=\x00b\x04\xcd\x00\x00\x04=\x00b\x04\xcd\x00\x00\x04\ +=\x00b\x04\xcd\x00\x00\x04=\x00b\x04\xcd\x00\x00\x04\ +=\x00b\x04\xcd\x00\x00\x04=\x00b\x04j\x00\xcf\x04\ +d\x00w\x04j\x00\xcf\x04d\x00w\x04j\x00\xcf\x04\ +d\x00w\x04j\x00\xcf\x04d\x00w\x04j\x00\x91\x04\ +d\x00k\x04j\x00\xcf\x04d\x00w\x04j\x00\xcf\x04\ +d\x00w\x04j\x00\xcf\x04d\x00w\x02o\x00Z\x01\ +\xcf\x00p\x02o\x00Z\x01\xcf\x00\xa5\x06\x1d\x00\x81\x04\ +\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x06\x1d\x00\x81\x04\ +\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x06\x1d\x00\x81\x04\ +\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x06\x1d\x00\x81\x04\ +\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x06\x1d\x00\x81\x04\ +\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x06\x1d\x00\x81\x04\ +\xb0\x00w\x06\x1d\x00\x81\x04\xb0\x00w\x05\xc1\x00\xbe\x04\ +\xb8\x00\xaa\x05\xc1\x00\xbe\x04\xb8\x00\xaa\x05\xd9\x00\xbe\x04\ +\xee\x00\xaa\x05\xd9\x00\xbe\x04\xee\x00\xaa\x05\xd9\x00\xbe\x04\ +\xee\x00\xaa\x05\xd9\x00\xbe\x04\xee\x00\xaa\x05\xd9\x00\xbe\x04\ +\xee\x00\xaa\x049\x00\x00\x03\xac\x00\x00\x049\x00\x00\x03\ +\xac\x00\x00\x049\x00\x00\x03\xac\x00\x00\x04\xc3\x00w\x00\ +\x00\xfc\x0c\x00\x00\xfc\x85\x00\x00\xfb\xd5\x00\x00\xfc\x85\x00\ +\x00\xfcu\x00\x00\xfc\x89\x00\x00\xfc\x89\x00\x00\xfc\x89\x00\ +\x00\xfcu\x01\xa2\x00;\x01\xa4\x001\x01\xa4\x001\x02\ +\xe9\x00?\x04\x91\x00w\x02\xcd\x003\x03\xfa\x003\x04\ +\x1d\x00*\x04\x89\x00\x17\x04d\x00\x82\x04\x91\x00\x83\x04\ +-\x00/\x04\x91\x00{\x04\x91\x00s\x04\xcd\x00\x1d\x06\ +\x10\x00\x5c\x041\x00\x0a\x02\xae\x00\x19\x04\xc3\x00w\x04\ +\xc3\x00w\x04\xc3\x00w\x04\xc3\x00w\x04\xc3\x00w\x02\ +\x04\x00\xcf\x02\x04\xff\xc1\x02\x04\x00\xbf\x02\x04\xff\xe0\x02\ +\x04\x00\x05\x02\x04\xff\xb2\x02\x04\xff\xef\x02\x04\xff\xee\x02\ +\x04\x00A\x02\x04\x00\xc2\x03\xfe\x00\xcf\x02Z\xff\xd8\x02\ +\x04\x00\xcf\x00\x05\x00\xcf\x00\x05\x00\xcf\x00\xcf\x00\x85\x00\ +\xc0\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,E#E`D-,K#QX\xb9\ +\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD\ +-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f\ +`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01\ +aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b\ +!!!!!Y-,\xb0\x02CTXKS#\ +KQZX8\x1b!!Y\x1b!!!!Y-\ +,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\ +\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#\ +D\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04\ +%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\ +\xb0\x07%\x08\xb0\x07%\x10\xb0\x06% F\xb0\x04%\ +\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\ +\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\x07%\x10\ +\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\ +\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\x07\ +%\x08\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y\ +!!!!!!!-,\x02\xb0\x04% F\ +\xb0\x04%#B\xb0\x05%\x08\xb0\x03%EH!!\ +!!-,\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%\ +CH!!!-,E# E\x18 \xb0\x00P\ + X#e#Y#h \xb0@PX!\xb0@\ +Y#XeY\x8a`D-,KS#KQZ\ +X E\x8a`D\x1b!!Y-,KTX \ +E\x8a`D\x1b!!Y-,KS#KQZ\ +X8\x1b!!Y-,\xb0\x00!KTX8\x1b\ +!!Y-,\xb0\x02CTX\xb0F+\x1b!!\ +!!Y-,\xb0\x02CTX\xb0G+\x1b!!\ +!Y-,\xb0\x02CTX\xb0H+\x1b!!!\ +!Y-,\xb0\x02CTX\xb0I+\x1b!!!\ +Y-, \x8a\x08#KS\x8aKQZX#8\ +\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \ +\xb0@8\x11\x1b!Y-,\x01F#F`#F\ +a# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\ +\x8apE`h:-, \x8a#Id\x8a#S\ +X<\x1b!Y-,KRX}\x1bzY-,\ +\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\ +\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88\ +TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\ +\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1\ +$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01K\ +RX\xb2\x02\x08\x02C`BY\x1b\xb9@\x00\x00\x80\ +\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80\ +c\xb8\x01\x00\x88TX\xb2\x02\x08\x02C`BY\xb9\ +@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C\ +`BY\xb1&\x01\x88QX\xb9@\x00\x02\x00c\xb8\ +\x04\x00\x88TX\xb2\x02@\x02C`BY\xb9@\x00\ +\x04\x00c\xb8\x08\x00\x88TX\xb2\x02\x80\x02C`B\ +YYYYYY\xb1\x00\x02CTX@\x0a\x05@\ +\x08@\x09@\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\ +\x05@\x08\xba\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\ +\xb1\x80\x02CRX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\ +\x1b\xb2\x05@\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\ +\x00\x80\x88U\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZ\ +X\xb3\x0c\x00\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYB\ +BBBB-,E\x18h#KQX# E\ + d\xb0@PX|Yh\x8a`YD-,\xb0\ +\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02\ +#>\xb1\x01\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\ +\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\ +\x06#eB\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\ +\xb0\x02CP\xb0\x01\xb0\x02CT[X!#\x10\xb0\ + \x1a\xc9\x1b\x8a\x10\xedY-,\xb0Y+-,\x8a\ +\x10\xe5-@\xc0\x09TF!\x1fSR\xff\x1fRF\ +X\x1fPF\x83\x1f!H U \x01\x03U\x1fH\ +\x03U\x1e\x03\xff\x1fOMX\x1fNMR\x1fMF\ +Q\x1f'3&U&\x0f2\x1f%3$U\x193\ +\x18U\x073\x03U\x06\x03\xff\x1fLJO\x1fKJ\ +x\x1fJF:\x1f\x133\x12U\x05\x01\x03U\x043\ +\x03U\x1f\x03\x01\x0f\x03?\x03\xaf\x03\x03\x06IFX\ +\x1fHF\x82\x1fGF\x94\x1f\x0bF\x1bF\x027\xbb\ +F\x01#3\x22U\x1c3\x1bU\x163\x15U\x11\x01\ +\x0fU\x103\x0fU\x0f\x0fO\x0f\x02\x1f\x0f\x7f\x0f\x9f\ +\x0f\xcf\x0f\x04\x0f\x0f\x8f\x0f\xff\x0f\x03\x06\x02\x01\x00U\ +\x013\x00Uo\x00\x7f\x00\xaf\x00\xef\x00\x04\x10\x00\x01\ +\x80\x16\x01\x05\x01\xb8\x01\x90\xb1TS++K\xb8\x07\ +\xffRK\xb0\x09P[\xb0\x01\x88\xb0%S\xb0\x01\x88\ +\xb0@QZ\xb0\x06\x88\xb0\x00UZ[X\xb1\x01\x01\ +\x8eY\x85\x8d\x8d\x00B\x1dK\xb02SX\xb00\x1d\ +YK\xb0dSX\xb0 \x1d\xb1\x16\x00BYss\ +++^stu+++++t^s++\ ++^st++++++++++++\ ++++++++++++\x18^\x00\x00\x06\ +\x14\x00\x17\x00N\x05\xb6\x00\x17\x00u\x05\xb6\x00\x19\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04?\x00\ +\x15\x00\x9a\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\ +\x00\xff\xec\x00\x00\xfe\x14\xff\xf2\x00\x00\x05\xb6\x00\x19\xfc\ +\x94\xff\xbb\xfe\x8f\xff\xe0\xfe\xa9\xff\xec\x04_\x00\x17\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00Z\x00^\x00\ +W\x00R\x00^\x00a\x00[\x00Y\x00`\x00R\x00\ +V\x00\xc4\x00R\x00R\x00p\x00\x00\x00\x00\x00$\x00\ +$\x00$\x00$\x00P\x00v\x01\x03\x01\x8b\x01\xfe\x02\ +~\x02\x97\x02\xc3\x02\xf0\x03!\x03U\x03p\x03\x87\x03\ +\xa3\x03\xc1\x04\x03\x04+\x04n\x04\xd2\x05\x17\x05c\x05\ +\xc8\x05\xf0\x06h\x06\xd1\x07\x0a\x07C\x07i\x07\x9c\x07\ +\xc1\x08\x1d\x08\xad\x08\xed\x09K\x09\x8a\x09\xc4\x09\xff\x0a\ +2\x0a\x81\x0a\xb4\x0a\xe7\x0b\x0e\x0bD\x0bb\x0b\xa6\x0b\ +\xda\x0c$\x0ca\x0c\xbc\x0d\x0f\x0db\x0d\x86\x0d\xba\x0d\ +\xe9\x0e@\x0ey\x0e\xa6\x0e\xd9\x0e\xfc\x0f\x19\x0f;\x0f\ +d\x0f|\x0f\x9e\x0f\xff\x10T\x10\x8d\x10\xdf\x113\x11\ +u\x12\x11\x12M\x12y\x12\xb8\x12\xf4\x13\x0b\x13c\x13\ +\x9c\x13\xdd\x140\x14\x81\x14\xb5\x15\x04\x15E\x15~\x15\ +\xae\x16\x07\x16@\x16\x84\x16\xb7\x17\x02\x17\x1a\x17e\x17\ +\xa0\x17\xa0\x17\xcf\x18+\x18\x82\x18\xeb\x19F\x19m\x19\ +\xf1\x1a\x1e\x1a\x9c\x1a\xec\x1b'\x1bQ\x1bY\x1b\xe4\x1b\ +\xfc\x1c3\x1c?\x1cz\x1c\xcd\x1c\xef\x1d7\x1dj\x1d\ +s\x1d\xa5\x1d\xca\x1e\x01\x1e:\x1eP\x1ee\x1e{\x1e\ +\xd8\x1e\xe9\x1e\xfa\x1f\x0b\x1f\x1c\x1f.\x1f@\x1f\x9d\x1f\ +\xa9\x1f\xba\x1f\xcb\x1f\xdc\x1f\xee\x1f\xff \x10 ! \ +3 \x90 \xa1 \xb2 \xc3 \xd4 \xe5 \xf7!\ +'!\x97!\xa8!\xb9!\xca!\xdc!\xed\x222\x22\ +\x9e\x22\xaf\x22\xbf\x22\xcf\x22\xdf\x22\xf0#\x01#\x98#\ +\xa4#\xb4#\xc4#\xd4#\xe5#\xf6$\x07$\x18$\ +*$\x95$\xa5$\xb5$\xc5$\xd5$\xe5$\xf6%\ +K%\xb5%\xc5%\xd5%\xe5%\xf6&\x06&[&\ +l&}&\x8d&\x9e&\xae&\xba'<'M'\ +]'n'~'\x8f'\xa0'\xb1'\xc1'\xd2'\ +\xde'\xe6(S(d(t(\x85(\x95(\xa6(\ +\xb7(\xc3(\xcf(\xe0(\xf0)\x01)\x11)\x22)\ +2)C)T)`)p)\x81)\x92)\xeb*\ +C*T*e*v*\x87*\x98*\xa9*\xb4*\ +\xbf*\xd0*\xe7*\xf3*\xff+\x10+!+-+\ +8+s+\x84+\x95+\xa0+\xac+\xbd+\xc8+\ +\xd4+\xe0,\x18,P,a,q,},\x88,\ +\x99,\xa9,\xb4,\xfb-G-X-h-y-\ +\x89-\x9b-\xac.\x15.\x9a.\xab.\xbb.\xc7.\ +\xd3.\xe4.\xf5/\x06/\x16/'/7/C/\ +O/`/p/{/\x87/\x98/\xa3/\xe00\ +70H0X0i0y0\x8a0\x9a0\xac0\ +\xbd0\xcf0\xe00\xec1H1Y1j1{1\ +\x8b1\x9d1\xae1\xbe1\xcf1\xe01\xf12\x012\ +*2z3\x073\xb13\xc23\xd33\xe43\xf43\ +\xff4\x0a494g4\x814\xa94\xc64\xfd5\ +,5j5\x9d5\xbf5\xff6\x106\x196*6\ +;6M6^6p6|6\x8f6\x976\x9f6\ +\xbe6\xc66\xce6\xd66\xde7?7G7O7\ +}7\x857\x8d7\xc97\xd17\xf67\xfe8=8\ +E8M8\xbd8\xc59\x129o9\x819\x939\ +\xa39\xb39\xc39\xd49\xe6:I:\xb8:\xf3;\ +\x5c;\xb9<\x12\x22>s>\xc2?\x0b?\ +A?|?\xdf@?@\x94@\xfcA\x0eA\x1fA\ +/A?APAbA\xb1A\xc2B\x14B\x1cB\ +$B6B>B\xa1B\xf8C8CICZC\ +\x8aC\x92C\xddC\xe5C\xedD7D?D\x8cD\ +\xedE\x22E3EgE\xa3E\xabE\xb3E\xbbE\ +\xc3E\xcbE\xd3E\xdbF#F+F3FdF\ +\x9fF\xcfG\x09GTG\xa2G\xe5H8H\x9eH\ +\xefH\xf7IXI\xbbI\xdbJ#J+JyJ\ +\xd9K\x0aK\x1aKOK\x86K\xceL\x05L\x0dL\ +2L:LBLhLpL\xd1L\xd9M\x0aM\ +HMyM\xb4N\x01NRN\x96N\xe6OEO\ +\x8fO\xa0P\x08P\x18PiPqPyP\x8bP\ +\x93P\xf5QOQWQgQwQ\xa7Q\xceQ\ +\xf5R\x06R\x16R'R8RJR\x5cRmR\ +~R\x95R\xacR\xb4R\xceR\xefS\x0fS3S\ +TS\x8aS\xbfS\xe4T\x22T\x84T\xa9T\xb9U\ +UU]UeU\x88U\xacU\xb8U\xd5V\x0cV\ +WV\xc4W4W\xb7X(X\x8cY\x07YYY\ +aY\xb3Y\xcaY\xe1Y\xf8Z\x0fZsZ\xaaZ\ +\xd0[\x0e[/[[[\xc4[\xf6\x5ci\x5c\xc4\x5c\ +\xd6\x5c\xe8]\x1f]+]7]a]\x88]\xaa]\ +\xcc]\xee^$^g^\xaa^\xf3_\x16_z_\ +\xcb_\xcb_\xcb_\xcb_\xcb_\xcb_\xcb_\xcb_\ +\xcb_\xcb_\xcb_\xcb_\xcb_\xcba\x08aha\ +ya\x81b\x05bGb\xb6b\xc7b\xd8b\xe4b\ +\xf0c\x02c8cvc\x86c\x96c\xfadUd\ +\xa2d\xf9e\x02e\x0be\x14e9ePeae\ +re\x82e\x92f\x10fhf\xc5g!g\x88g\ +\xeehu\xaav\x11vkv\xcdw\ +,w\x9ew\xdax\x19xnx\xbby\x15ypy\ +|y\x88y\xccz\x0ezSz\x9bz\xe8{8{\ +v{\xb3{\xf6|=|||\xbe}\x17}h}\ +\xf5~|~\x88~\x94~\xc5~\xf7~\xff\x7f4\x7f\ +z\x7f\xbf\x80\x06\x80M\x80\x8a\x80\xc8\x81\x11\x81\x5c\x81\ +\xbc\x82\x16\x82O\x82\x87\x82\xfd\x83g\x83\xe5\x84Y\x84\ +a\x84r\x84\x82\x84\xdb\x85.\x85y\x85\xc0\x86\x0a\x86\ +S\x86\x99\x86\xe3\x87+\x87v\x87\xc8\x88 \x88(\x88\ +9\x88I\x88[\x88l\x88t\x88|\x88\x8d\x88\x9d\x88\ +\xf0\x89@\x89R\x89c\x89u\x89\x86\x89\x98\x89\xaa\x89\ +\xf8\x8aO\x8a`\x8ap\x8a\x82\x8a\x93\x8a\xa5\x8a\xb6\x8a\ +\xbe\x8a\xc6\x8a\xd8\x8a\xe9\x8a\xfb\x8b\x0c\x8b\x1d\x8b-\x8b\ +?\x8bP\x8bb\x8bs\x8b\x85\x8b\x96\x8b\xc2\x8b\xee\x8c\ +\x00\x8c\x12\x8ci\x8c\xc2\x8d\x16\x8dk\x8d\xb8\x8e\x08\x8e\ +G\x8eO\x8e\xb1\x8f\x1b\x8f\x8a\x8f\xf4\x90U\x90\xad\x91\ +\x08\x91Z\x91\xa7\x91\xf7\x92L\x92\x97\x92\xd6\x93\x15\x93\ +u\x93}\x93\xd3\x94$\x940\x94<\x94M\x94^\x94\ +p\x94\x82\x94\x94\x94\xa6\x94\xb8\x94\xca\x94\xdc\x94\xee\x95\ +\x03\x95\x17\x95)\x95;\x95M\x95_\x95q\x95\x83\x95\ +\x95\x95\xa7\x95\xbc\x95\xd0\x95\xdc\x95\xe8\x95\xf9\x96\x0a\x96\ +\x1b\x96+\x96=\x96O\x96a\x96s\x96\x85\x96\x97\x96\ +\xa9\x96\xbb\x96\xd0\x96\xe4\x96\xf5\x97\x06\x97\x12\x97\x1e\x97\ +*\x976\x97G\x97X\x97j\x97|\x97\x8e\x97\xa0\x97\ +\xb2\x97\xc4\x97\xd6\x97\xe8\x97\xfd\x98\x11\x98\x22\x982\x98\ +C\x98S\x98d\x98u\x98\x86\x98\x96\x98\xa2\x98\xae\x98\ +\xba\x98\xc6\x98\xd7\x98\xe8\x98\xf9\x99\x09\x99\x1a\x99*\x99\ +;\x99L\x99]\x99m\x99y\x99\x85\x99\x91\x99\x9d\x99\ +\xae\x99\xbf\x99\xd0\x99\xe1\x99\xed\x9a\x19\x9aM\x9a\x80\x9a\ +\xc3\x9b\x18\x9bQ\x9b\x89\x9b\xd0\x9c$\x9cR\x9cx\x9c\ +\x9e\x9c\xc6\x9d\x04\x9d+\x9ds\x9d\xd7\x9e\x19\x9ee\x9e\ +m\x9e\x95\x9e\x9d\x9f\x03\x9f\x0f\x9f\x85\x9f\x91\x9f\x9d\x9f\ +\xff\xa0\x0f\xa0\x1f\xa00\xa0@\xa0U\xa0f\xa0w\xa0\ +\x88\xa0\x9a\xa0\xab\xa0\xbc\xa0\xcd\xa0\xd8\xa0\xe9\xa0\xf5\xa1\ +\x06\xa1\x0e\xa1 \xa1(\xa1:\xa1B\xa1J\xa1[\xa1\ +g\x00\x00\x00\x02\x00\xc1\x00\x00\x04\x0a\x05\xb6\x00\x03\x00\ +\x07\x00\x1e@\x0c\x05\x02\x04\x03\x02\x03\x09\x08\x04\x03\x07\ +\x01\x00/3/3\x11\x12\x0199\x113\x1131\ +0\x13!\x11!7!\x11!\xc1\x03I\xfc\xb7h\x02\ +y\xfd\x87\x05\xb6\xfaJh\x04\xe6\x00\x00\x02\x00\xa4\xff\ +\xec\x01F\x05\xb6\x00\x03\x00\x0b\x00)@\x13\x08\x03\x04\ +\x03\x02\x02\x0d\x0c\x01\x01\x0a\x02\x03\x0a\x06QY\x0a\x13\ +\x00?+\x00\x18?\x129/\x11\x12\x019\x1133\ +\x11310\x01#\x033\x03432\x15\x14#\x22\ +\x01\x14=\x1dw\x8dPRRP\x01y\x04=\xfa\x98\ +bbb\x00\x02\x00\x85\x03\xa6\x02N\x05\xb6\x00\x03\x00\ +\x07\x00\x1f@\x0d\x07\x04\x00\x03\x04\x03\x09\x08\x06\x02\x07\ +\x03\x03\x00?3\xcd2\x11\x12\x0199\x113\x113\ +10\x01\x03#\x03!\x03#\x03\x01\x04!=!\x01\ +\xc9!=!\x05\xb6\xfd\xf0\x02\x10\xfd\xf0\x02\x10\x00\x00\ +\x02\x007\x00\x00\x04\xf4\x05\xb6\x00\x1b\x00\x1f\x00\xa3@\ +_\x08\x1f\x1c\x15\x04\x14\x09\x11\x0c\x0c\x09\x12\x0f\x0e\x0b\ +\x04\x0a\x13\x13\x14\x16\x1d\x1e\x07\x04\x06\x17\x04\x01\x00\x19\ +\x04\x18\x05\x05\x06\x14\x06\x0a!\x03\x1a\x17\x03\x18\x0a\x18\ + !\x08\x04\x0c\x0d\x0cRY\x1c\x01\x0d\x1f\x00\x10\x11\ +\x10RY\x19\x15\x11?\x0dO\x0d\x7f\x0d\xcf\x0d\x04?\ +\x11O\x11\x8f\x11\x03\x0d\x11\x0d\x11\x05\x17\x13\x03\x0a\x05\ +\x00/3?3\x1299//]]\x1133+\ +\x11\x0033\x1133+\x11\x0033\x11\x12\x019\ +9\x11\x173\x11\x1299\x113\x11\x12\x179\x11\x12\ +\x179\x113\x11\x12\x17922\x113\x11\x12\x179\ +10\x01\x03!\x15!\x03#\x13!\x03#\x13!5\ +!\x13!5!\x133\x03!\x133\x03!\x15\x01!\ +\x13!\x03\xc7L\x01/\xfe\xc0VZX\xfe\x98VX\ +V\xfe\xe5\x01+L\xfe\xd7\x017V[Y\x01mX\ +VX\x01\x1d\xfc\xc4\x01kN\xfe\x95\x03\xa0\xferO\ +\xfe=\x01\xc3\xfe=\x01\xc3O\x01\x8eP\x01\xc6\xfe:\ +\x01\xc6\xfe:P\xfer\x01\x8e\x00\x03\x00\xa4\xff\x89\x03\ +\xdf\x06\x12\x00 \x00'\x00.\x00{@'\x0d\x15\x18\ +\x1e%+\x06\x04\x04\x05!\x00(\x12\x00\x05\x0a\x12\x1a\ +\x050/$\x0e\x1e++\x0eNY%\x0d\x03\x06\x06\ +\x0dMY\x06\xb8\xff\xc0\xb3\x16\x19H\x06\xb8\xff\xc0@\ +\x17\x0d\x10H,\x1d\x15\x1dMY\x18\x15\x0d\x06+\x15\ +\x15+\x06\x0d\x04\x17\x05\x17\x00//\x12\x179//\ +//\x113+\x11\x003+++\x11\x003\x113\ ++\x11\x003\x113\x11\x12\x01\x179\x113\x113\x11\ +3\x12\x17910\x01\x14\x06\x07\x15#5&&'\ +5\x16\x163\x11.\x02546753\x15\x16\x17\ +\x07&'\x11\x16\x16\x074&'\x1166\x01\x14\x16\ +\x17\x11\x06\x06\x03\xdf\xc6\xafQ\x5c\xd9@K\xd1Y\x91\ +\x8c@\xbd\xa0Q\xc5\x9a!\x8d\xb1\xd5\xa0n~\x89z\ +\x8d\xfd\xb8r~wy\x01\xb8\x85\xa8\x16\xec\xe8\x02)\ +\x1eg$2\x01\xfc,XxV|\xa9\x14\xc0\xbe\x09\ +?Z>\x0a\xfe\x1aB\x9czUo(\xfe)\x0d|\ +\x02\xbfVn&\x01\xc5\x10x\x00\x05\x00q\xff\xe9\x06\ +\x04\x05\xcb\x00\x0a\x00\x16\x00 \x00,\x000\x00K@\ +'0-./\x1c!\x17'\x05\x0b\x00\x11\x0b\x11!\ +'-/\x0621\x1e**0\x03\x0e\x0e/0\x06\ +/\x18\x08\x14\x07\x1a$\x19\x00?3?3??\x12\ +9/3\x119/3\x11\x12\x01\x179\x113\x113\ +\x113\x113\x113\x11310\x13\x14\x1632\x11\ +4&#\x22\x06\x05\x14\x06#\x22&54632\ +\x16\x01\x14\x1632\x11\x10#\x22\x06\x05\x14\x06#\x22\ +&54632\x16\x01\x01#\x01\xd3Z`\xc1c\ +^`Z\x01\xdd\x96\x8d\x85\x97\x90\x8c\x8b\x98\x01wZ\ +`\xc1\xc1`Z\x01\xdd\x94\x8d\x88\x96\x93\x8b\x89\x98\xfe\ +\xfc\xfc\xd5`\x03+\x04\x02\xba\xbb\x01u\xb8\xb9\xb9\xb8\ +\xe2\xeb\xf1\xdc\xdf\xea\xf1\xfc\xdc\xb9\xb9\x01r\x01q\xb7\ +\xba\xe2\xeb\xf3\xda\xe1\xe8\xf0\x03'\xfaJ\x05\xb6\x00\x00\ +\x03\x00{\xff\xec\x05\x87\x05\xcd\x00 \x00+\x007\x00\ +Q@-\x19\x18\x14\x152\x0d,\x07)\x00\x00\x07\x0d\ +\x15\x18\x0598\x17\x1a\x11$\x04\x14%/\x03\x10\x04\ +\x14\x0a\x19\x12\x0a5LY\x0a\x04\x1e!LY\x1e\x13\ +\x00?+\x00\x18?+\x00\x18?\x129\x179\x12\x17\ +9\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +10\x13467'&&54632\x16\x15\ +\x14\x06\x07\x016673\x06\x07\x01#'\x0e\x02#\ +\x22&\x05267\x01\x0e\x02\x15\x14\x16\x03\x14\x16\x17\ +6654&#\x22\x06{\x93\xc9KB@\xbf\xa1\ +\x9b\xb5\x8c\xb7\x01\xc4=V `?\x92\x01\x0a\x87\xc1\ +\x5c\x90\xabm\xd1\xef\x01\xc7\x80\xd5g\xfe\x1d\x88y7\ +\xba(Pp\x9f||jr\x83\x01s\x8a\xc2lR\ +G\x88J\x8f\xa8\xa2\x8fi\xafk\xfe7H\xaat\xf6\ +\xb4\xfe\xf4\xc5ZS,\xcetWg\x01\xe5Hev\ +O\x8f\xa2\x04RO\x86kU\x94_^ut\x00\x00\ +\x01\x00\x85\x03\xa6\x01\x04\x05\xb6\x00\x03\x00\x14\xb7\x00\x03\ +\x03\x05\x04\x02\x03\x03\x00?\xcd\x11\x12\x019\x1131\ +0\x01\x03#\x03\x01\x04!=!\x05\xb6\xfd\xf0\x02\x10\ +\x00\x00\x01\x00R\xfe\xbc\x01\xf0\x05\xb6\x00\x0c\x00\x1f@\ +\x0e\x07\x00\x0a\x03\x04\x03\x09\x09\x00\x0e\x0d\x0a\x03\x03\x00\ +?/\x11\x12\x0199\x11\x173\x11310\x13\x10\ +\x1273\x06\x02\x11\x10\x01#&\x02R\x9b\x92q\x94\ +\x9e\x010o\x93\x9a\x021\x01\x09\x01\xce\xae\xb6\xfe3\ +\xff\x00\xfe\x1d\xfel\xaa\x01\xc6\x00\x01\x00=\xfe\xbc\x01\ +\xdb\x05\xb6\x00\x0c\x00\x1f@\x0e\x03\x09\x0a\x03\x04\x06\x00\ +\x04\x00\x0e\x0d\x04\x09\x03\x00?/\x11\x12\x0199\x11\ +3\x11\x17310\x01\x10\x02\x07#\x00\x11\x10\x02'\ +3\x16\x12\x01\xdb\x9b\x92o\x010\x9e\x94q\x93\x9a\x02\ +1\xfe\xf9\xfe:\xa8\x01\x94\x01\xe3\x01\x01\x01\xcd\xb5\xaf\ +\xfe1\x00\x00\x01\x00h\x02\xa2\x03\xfc\x06\x14\x00\x0e\x00\ +\x1b@\x0f\x03\x05\x04\x01\x07\x0d\x0a\x09\x0b\x09\x0f\x10\x08\ +\x0e\x00\x00?\xc4\x11\x12\x01\x17910\x01\x03%\x17\ +\x05\x13\x07\x03\x03'\x13%7\x05\x03\x02w%\x01\x95\ +\x15\xfeu\xf7|\xbf\xb4}\xf2\xfez\x13\x01\x91'\x06\ +\x14\xfekh\x83'\xfe\xacG\x01{\xfe\x85G\x01T\ +'\x83h\x01\x95\x00\x01\x00o\x00\xfa\x04#\x04\xae\x00\ +\x0b\x008@#\x09\x00\x04\x04\x05\x05\x0d\x0c\x03\x07\x08\ +\x07RY\x00\x0f\x08/\x08?\x08_\x08\x7f\x08\x8f\x08\ +\xaf\x08\xbf\x08\xdf\x08\x09\x08\x00/]3+\x11\x003\ +\x11\x12\x019\x113\x129910\x01!\x15!\x11\ +#\x11!5!\x113\x02q\x01\xb2\xfeNR\xfeP\ +\x01\xb0R\x02\xfcR\xfeP\x01\xb0R\x01\xb2\x00\x01\x00\ +D\xfe\xf8\x013\x00\xee\x00\x06\x00\x11\xb5\x04\x01\x08\x07\ +\x04\x00\x00//\x11\x12\x019910%\x17\x02\x07\ +#\x127\x01'\x0cKcAM!\xee\x15\xfe\xf7\xd8\ +\x01\x13\xe3\x00\x01\x00\x5c\x02\x00\x027\x02R\x00\x03\x00\ +\x15@\x09\x03\x00\x05\x04\x01\x00SY\x01\x00/+\x11\ +\x12\x019910\x135!\x15\x5c\x01\xdb\x02\x00R\ +R\x00\x01\x00\xa2\xff\xec\x01D\x00\xb0\x00\x07\x00\x18@\ +\x0b\x04\x00\x00\x09\x08\x06\x02QY\x06\x13\x00?+\x11\ +\x12\x019\x113107432\x15\x14#\x22\xa2\ +PRRPNbbb\x00\x00\x01\x00\x19\x00\x00\x02\ +\xa2\x05\xb6\x00\x03\x00\x1c@\x0c\x03\x00\x01\x02\x02\x00\x05\ +\x04\x03\x03\x02\x12\x00??\x11\x12\x0199\x113\x11\ +310\x01\x01#\x01\x02\xa2\xfd\xdfh\x02 \x05\xb6\ +\xfaJ\x05\xb6\x00\x00\x02\x00s\xff\xec\x04\x1f\x05\xcd\x00\ +\x0b\x00\x17\x00(@\x14\x12\x00\x0c\x06\x06\x00\x19\x18\x09\ +\x15MY\x09\x07\x03\x0fMY\x03\x19\x00?+\x00\x18\ +?+\x11\x12\x0199\x113\x11310\x01\x10\x02\ +#\x22\x02\x11\x10\x1232\x12\x01\x10\x1232\x12\x11\ +\x10\x02#\x22\x02\x04\x1f\xeb\xee\xe5\xee\xe7\xec\xe7\xf2\xfc\ +\xc0\xb2\xb5\xbd\xad\xad\xbd\xbd\xaa\x02\xdf\xfe\x7f\xfe\x8e\x01\ +}\x01v\x01~\x01p\xfe\x83\xfe\x8f\xfe\xac\xfe\xbb\x01\ +P\x01I\x01D\x01P\xfe\xb0\x00\x01\x00\xc7\x00\x00\x02\ +\xaa\x05\xb6\x00\x0a\x00 @\x0e\x09\x08\x00\x01\x01\x0c\x0b\ +\x07\x09\x01\x18\x04\x09\x06\x00?3?\x129\x11\x12\x01\ +9\x1133310!#\x1147\x06\x06\x05'\ +\x013\x02\xaab\x0c\x0f \xfe\xdb9\x01\x8dV\x04)\ +\x91\x9c\x0f\x1c\xe5G\x01)\x00\x00\x01\x00q\x00\x00\x04\ +\x04\x05\xcb\x00\x18\x002@\x1a\x07\x12\x17\x02\x02\x0d\x12\ +\x18\x04\x1a\x19\x02\x17\x01\x0f\x0aMY\x0f\x07\x01\x17N\ +Y\x01\x18\x00?+\x00\x18?+\x11\x12\x009\x11\x12\ +\x01\x179\x113\x11310!!5\x01>\x025\ +4&#\x22\x07'632\x16\x15\x14\x02\x07\x01\x15\ +!\x04\x04\xfcm\x01\x85\xa4\x84>\xac\x89\xb7\xa76\xb7\ +\xdf\xbf\xdb\x93\xc3\xfe\x89\x03\x0eX\x01\x96\xaa\xb4\xa4Z\ +\x83\xa4\x85E\x9a\xcc\xb3\x91\xfe\xf1\xc7\xfe\x7f\x04\x00\x00\ +\x01\x00^\xff\xec\x04\x00\x05\xcb\x00(\x00Q@+\x04\ +\x17\x1c\x00\x13\x07#\x0c\x00\x07\x0c\x17\x04*)\x03\x17\ +\x18\x18\x17NY\x0f\x18\x01\x0b\x03\x18\x18\x0a&&\x1f\ +MY&\x07\x0a\x10MY\x0a\x19\x00?+\x00\x18?\ ++\x11\x12\x009\x18/_^]+\x11\x12\x009\x11\ +\x12\x01\x179\x113\x113\x113\x12910\x01\x14\ +\x06\x07\x15\x16\x16\x15\x14\x04!\x22'5\x16\x1632\ +654&##532654&#\x22\x06\ +\x07'6632\x16\x03\xd3\xab\x90\xb0\xb8\xfe\xe9\xfe\ +\xfa\xdf\xa6T\xd1\x5c\xdd\xde\xe3\xdc\x9e\xa0\xb6\xd5\xad\x8c\ +m\xb4p1U\xf0{\xca\xdc\x04^\x88\xba\x1a\x06\x16\ +\xb4\x98\xcd\xe1Sc,2\xb3\xa3\x91\x9c`\xad\x94z\ +\x93=JCGS\xbf\x00\x02\x00+\x00\x00\x04u\x05\ +\xbe\x00\x0a\x00\x12\x00@@!\x0b\x09\x07\x04\x01\x12\x06\ +\x06\x01\x00\x03\x14\x13\x06\x01\x09\x03\x12\x05\x05\x12MY\ +\x05\x05\x07\x03\x18\x0e\x0f\x0f\x07\x06\x00?3\x113?\ +\x129/+\x11\x12\x00\x179\x11\x12\x01\x179\x113\ +\x11333310\x01#\x11#\x11!5\x013\ +\x113!\x11\x107#\x06\x07\x01\x04u\xfc^\xfd\x10\ +\x02\xd5y\xfc\xfe\xa6\x0e\x08\x14g\xfd\xfc\x01u\xfe\x8b\ +\x01uC\x04\x06\xfc\x0d\x01\xa2\x01.\xcd%\x97\xfd\x1f\ +\x00\x00\x01\x00\x8f\xff\xec\x04\x10\x05\xb6\x00\x1c\x00:@\ +\x1f\x10\x03\x1b\x16\x03\x09\x16\x19\x04\x1e\x1d\x00\x13MY\ +\x00\x00\x06\x17\x17\x1aNY\x17\x06\x06\x0dMY\x06\x19\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x01\x179\x113\x11310\x012\x04\x15\x14\x04#\ +\x22&'5\x16\x1632654&#\x22\x07'\ +\x13!\x15!\x036\x02\x19\xea\x01\x0d\xfe\xe8\xf6m\xc4\ +Bl\xa8_\xc0\xe8\xe2\xc2\x82\x8e<:\x02\xc0\xfd\x9e\ +-\x9c\x03o\xe2\xc6\xe1\xfa+(g7+\xcb\xad\xa3\ +\xba''\x02\x9d`\xfd\xfc\x1d\x00\x02\x00\x83\xff\xec\x04\ +#\x05\xcd\x00\x18\x00&\x00N@*\x1c\x13#\x0c\x0c\ +\x00\x00\x07\x13\x03('\x0d\x10\x16\x10\x1fOY\x0f\x10\ +\x7f\x10\x02\x0a\x03\x10\x10\x16\x04\x04\x09OY\x04\x07\x16\ +\x19MY\x16\x19\x00?+\x00\x18?+\x11\x12\x009\ +\x18/_^]+\x11\x12\x009\x11\x12\x01\x179\x11\ +3\x113\x11310\x13\x10\x12$32\x17\x15&\ +#\x22\x00\x0336632\x16\x15\x14\x02#\x22\x00\ +\x052654&#\x22\x06\x06\x15\x14\x16\x16\x83\x9b\ +\x01\x1d\xc9^NIg\xf7\xfe\xed\x11\x0dL\xc4m\xcd\ +\xe7\xf3\xce\xde\xfe\xff\x01\xdf\xa4\xb6\xb4\x9bf\xafhc\ +\xa9\x02o\x01\x1d\x01\x85\xbc\x17X\x1b\xfe\x9c\xfe\xacb\ +d\xea\xce\xe0\xfe\xfd\x01S\xfb\xce\xbf\xa8\xbcZ\x95N\ +o\xcdx\x00\x01\x00m\x00\x00\x04\x1f\x05\xb6\x00\x06\x00\ ++@\x15\x06\x00\x01\x05\x00\x02\x05\x03\x08\x07\x00\x18\x05\ +\x02\x03\x03\x02NY\x03\x06\x00?+\x11\x12\x009\x18\ +?\x11\x12\x01\x179\x113\x11310!\x01!5\ +!\x15\x01\x01N\x02Z\xfc\xc5\x03\xb2\xfd\xa4\x05V`\ +I\xfa\x93\x00\x03\x00y\xff\xec\x04\x14\x05\xcf\x00\x18\x00\ +$\x001\x00W@/\x1f\x09/\x03(\x15\x19\x0f\x03\ +\x09\x0f\x15\x22,\x0632\x06\x12\x12\x22,,\x22O\ +Y\x0f,\x01\x0b\x03,,\x0c\x00\x00%MY\x00\x07\ +\x0c\x1cMY\x0c\x19\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/_^]+\x11\x12\x009\x113\x11\x12\x01\ +\x179\x113\x113\x113\x11310\x012\x16\x15\ +\x14\x06\x07\x16\x16\x15\x14\x06#\x22&5467&\ +&5466\x03\x14\x1632654&'\x06\ +\x06\x01\x22\x06\x15\x14\x16\x16\x176654&\x02F\ +\xba\xe3\x8d\x9e\xc0\x9c\xfd\xd5\xdd\xec\xa6\xae\xa1\x84j\xbf\ +\xf2\xbb\xa8\xa4\xc8\x9d\xe0\xb8\x9a\x01e\x8d\xab?w\x8c\ +\xa3\x8e\xa9\x05\xcf\xbe\xa2p\xacIO\xbc\x86\xb5\xd8\xca\ +\xc1\x83\xc6FL\xa9vi\x9fV\xfb\x99\x8a\x98\xa1\x8a\ +|\x9bUG\xac\x03\x8b\x8byFkW:?\x98k\ +x\x8c\x00\x00\x02\x00o\xff\xec\x04\x0c\x05\xcd\x00\x1a\x00\ +(\x00N@*%\x0d\x0d\x00\x1e\x14\x00\x07\x14\x03*\ +)\x0e\x17\x11\x11!OY\x00\x11p\x11\x02\x0a\x03\x11\ +\x11\x04\x17\x17\x1bMY\x17\x07\x04\x0aOY\x04\x19\x00\ +?+\x00\x18?+\x11\x12\x009\x18/_^]+\ +\x11\x12\x009\x11\x12\x01\x179\x113\x113\x1131\ +0\x01\x10\x02\x04#\x22'5\x16\x1632\x00\x13#\ +\x06\x06#\x22&54\x1232\x16\x12\x01\x22\x06\x15\ +\x14\x16326654&&\x04\x0c\x97\xfe\xdf\xcd\ +hX+y \xf7\x01\x18\x10\x0cI\xcan\xcb\xe3\xf9\ +\xc7\x90\xd8u\xfe#\x9e\xbc\xae\xa2e\xafg]\xa7\x03\ +J\xfe\xe0\xfe|\xba\x1aV\x0e\x0f\x01e\x01V`g\ +\xe0\xce\xdc\x01\x10\x97\xfe\xdc\x01c\xd5\xb9\xae\xb4Z\x95\ +Mu\xccs\x00\x00\x02\x00\xa2\xff\xec\x01D\x04-\x00\ +\x07\x00\x11\x009@\x22\x0c\x08\x04\x04\x00\x00\x13\x12\x0a\ +\x0fQY\x0f\x0a/\x0aO\x0ao\x0a\x7f\x0a\x8f\x0a\x06\ +\x0e\x03\x0a\x06\x02QY\x06\x13\x00?+\x00\x18/_\ +^]+\x11\x12\x019\x113\x12991074\ +32\x15\x14#\x22\x11432\x15\x14\x06#\x22&\ +\xa2PRRPPR/#\x22.Nbbb\x03\ +\xdfbb5..\x00\x00\x02\x00L\xfe\xf8\x01D\x04\ +-\x00\x07\x00\x11\x00/@\x1c\x0c\x08\x01\x04\x08\x03\x13\ +\x12\x07\x04\x0a\x0fQY_\x0a\x7f\x0a\x9f\x0a\xbf\x0a\xcf\ +\x0a\xdf\x0a\x06\x0a\x00/]+\x00\x18//\x11\x12\x01\ +\x179\x11310%\x17\x02\x07#6\x127\x034\ +32\x15\x14\x06#\x22&\x01/\x0cKcA\x1dB\ +\x0f\x18PR/#\x22.\xee\x15\xfe\xf7\xd8a\x01)\ +l\x02\xddbb5..\x00\x00\x01\x00o\x01\x0a\x04\ +#\x04\xc1\x00\x06\x00 @\x11\x05\x01\x00\x01\x04\x03\x08\ +\x07\x00\x0f\x03?\x03_\x03\x03\x03\x00/]\xc6\x11\x12\ +\x01\x179\x11310\x01\x015\x01\x15\x01\x01\x04#\ +\xfcL\x03\xb4\xfc\xc9\x037\x01\x0a\x01\xa0=\x01\xda_\ +\xfek\xfe\x9d\x00\x00\x02\x00o\x01\xdd\x04#\x03\xc7\x00\ +\x03\x00\x07\x00?@)\x04\x07\x00\x03\x04\x09\x08\x04\x05\ +RY\xef\x04\x01\x00\x04\x10\x04\x02\x09\x03\x04\x01\x01\x00\ +RY\x0f\x01/\x01o\x01\xaf\x01\xbf\x01\xdf\x01\x06\x01\ +\x00/]+\x00\x18\x10\xc6_^]]+\x11\x12\x01\ +\x17910\x135!\x15\x015!\x15o\x03\xb4\xfc\ +L\x03\xb4\x03uRR\xfehRR\x00\x01\x00o\x01\ +\x0a\x04#\x04\xc1\x00\x06\x00 @\x11\x01\x05\x02\x05\x06\ +\x03\x08\x07\x06\x0f\x03?\x03_\x03\x03\x03\x00/]\xc6\ +\x11\x12\x01\x179\x11310\x13\x01\x015\x01\x15\x01\ +o\x037\xfc\xc9\x03\xb4\xfcL\x01j\x01c\x01\x95_\ +\xfe&=\xfe`\x00\x02\x009\xff\xec\x03\x14\x05\xcb\x00\ +\x1f\x00'\x00A@!\x08\x15$ \x1f\x00\x00\x0f\x15\ + \x04)(\x04\x1a\x1a\x12\x00\x00&\x12\x12\x0bPY\ +\x12\x04&\x22QY&\x13\x00?+\x00\x18?+\x11\ +\x12\x009\x18/\x129\x113\x11\x12\x01\x179\x113\ +\x113\x11310\x01546776654\ +&#\x22\x06\x07'6632\x16\x15\x14\x0e\x02\x07\ +\x0e\x02\x15\x15\x03432\x15\x14#\x22\x01%Ke\ +[H>\xa7\x88O\x8aP%n\x95O\xb7\xd2$A\ +\x5c8@E\x1fsPRRP\x01y%{\x9cY\ +O=xN\x7f\x96#'P0 \xc5\xacDfW\ +Q/6Yba\x0e\xfe\xd5bbb\x00\x00\x02\x00\ +q\xff;\x06\xa6\x05\xac\x005\x00@\x00T@-\x1a\ +\x00<\x12;\x06\x146\x0d\x22.\x00\x0d\x12\x14(.\ +\x06BA\x07\x0a>\x10\x10+\x1799\x030\x0a@\ +\x0a\x80\x0a\x03\x0a\x0a2%+\x1e2\x03\x00?3/\ +3\x129/]33\x113\x119/3\x129\x11\ +\x12\x01\x179\x113\x113\x1133\x113\x1131\ +0\x01\x14\x02#\x22&'#\x06\x06#\x22&54\ +\x1232\x17\x03\x15\x14\x1632654\x02$#\ +\x22\x04\x02\x15\x10\x00!267\x15\x06# \x00\x11\ +\x10\x12$32\x04\x12\x01\x14\x1632\x13\x13&#\ +\x22\x06\x06\xa6\xb5\x9bYo\x09\x04+\xa2l\x94\xa2\xf1\ +\xc2\x8a\x94\x16FQg\x83\x9e\xfe\xdb\xbc\xe6\xfe\xa1\xbd\ +\x01N\x013]\xbf\x88\xcb\xd3\xfe\xa3\xfez\xd9\x01\x8d\ +\xfa\xd7\x01K\xb3\xfb\xd3nw\xff\x12\x10Or\x95\xb0\ +\x02\xd5\xe4\xfe\xecl]de\xc1\xae\xca\x01\x01)\xfe\ +0\x1ehi\xe9\xbb\xc2\x01$\x9d\xc7\xfe\x94\xec\xfe\xbe\ +\xfe\xa1$4cP\x01\x91\x01e\x01\x00\x01\x99\xe2\xb2\ +\xfe\xb5\xfe\x9f\x8f\x90\x01Z\x01#\x1b\xcd\x00\x00\x02\x00\ +\x00\x00\x00\x04\xcd\x05\xbc\x00\x07\x00\x0e\x00<@ \x04\ +\x05\x0c\x07\x06\x02\x03\x03\x0c\x01\x08\x09\x00\x06\x07\x10\x0f\ +\x0c\x03\x04\x08\x01LY\x08\x08\x03\x04\x03\x07\x03\x12\x00\ +?3?\x129/+\x11\x12\x009\x11\x12\x01\x179\ +\x113\x113\x113310\x01!\x03#\x013\x01\ +#\x01!\x03&'\x06\x07\x03\x8f\xfd\xae\xccq\x02L\ +A\x02@s\xfd\x08\x02\x0b\xc7\x19#\x1b \x02\x04\xfd\ +\xfc\x05\xbc\xfaD\x02`\x02\x0f>n`N\x00\x03\x00\ +\xcf\x00\x00\x04\x91\x05\xb6\x00\x0f\x00\x18\x00\x1f\x00Q@\ ++\x1d\x0b\x10\x1a\x1a\x0f\x14\x04\x0b\x04\x0f\x07\x04 !\ +\x08\x19\x10\x10\x19LY\x0f\x10\x01\x0b\x03\x10\x10\x0f\x00\ +\x0f\x1aLY\x0f\x12\x00\x18LY\x00\x03\x00?+\x00\ +\x18?+\x11\x12\x009\x18/_^]+\x11\x12\x00\ +9\x11\x12\x01\x179\x113\x113\x113\x11310\ +\x13! \x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04#!\ +\x13!2654&#!\x11\x11! \x11\x10!\ +\xcf\x01\x91\x01\x0f\xfe\x9b\x95\xaf\xa5\xfe\xf4\xf6\xfe@f\ +\x01B\xce\xbb\xd3\xd1\xfe\xd9\x01X\x01\x96\xfeT\x05\xb6\ +\xb8\xba\x7f\xa9\x18\x06\x1a\xa9\x97\xca\xda\x03+\x89\x92\x92\ +\x84\xfdu\xfd\x89\x01J\x01-\x00\x01\x00\x81\xff\xec\x04\ +\xb8\x05\xcb\x00\x16\x00&@\x14\x03\x0e\x14\x08\x0e\x03\x17\ +\x18\x12\x00LY\x12\x04\x0b\x06JY\x0b\x13\x00?+\ +\x00\x18?+\x11\x12\x01\x179\x11310\x01 \x00\ +\x11\x10\x00!27\x15\x06# \x00\x114\x12$3\ +2\x17\x07&\x03?\xfe\xed\xfe\xc4\x01*\x01\x15\xb8\x9a\ +\x91\xd9\xfe\xcc\xfe\x9e\xa9\x01=\xd2\xd6\xa9)\xa0\x05o\ +\xfe\xa0\xfe\xce\xfe\xc7\xfe\xa6/Z3\x01\x8e\x01e\xdf\ +\x01T\xb9P\x5cP\x00\x00\x02\x00\xcf\x00\x00\x05%\x05\ +\xb6\x00\x08\x00\x10\x00(@\x14\x0e\x04\x09\x00\x04\x00\x11\ +\x12\x05\x0dLY\x05\x03\x04\x0eLY\x04\x12\x00?+\ +\x00\x18?+\x11\x12\x0199\x113\x11310\x01\ +\x10\x00!!\x11! \x00\x03\x10\x00!!\x113 \ +\x05%\xfe~\xfe\x8a\xfe\xa2\x01\x8b\x01^\x01mo\xfe\ +\xc1\xfe\xcb\xfe\xf3\xf2\x02\x8f\x02\xe9\xfe\x90\xfe\x87\x05\xb6\ +\xfe\x92\xfe\x9d\x01:\x01=\xfa\xfe\x00\x00\x01\x00\xcf\x00\ +\x00\x03\xee\x05\xb6\x00\x0b\x00E@%\x06\x0a\x0a\x01\x04\ +\x00\x00\x08\x01\x03\x0d\x0c\x06\x09JY\x0f\x06\x01\x0b\x03\ +\x06\x06\x01\x02\x02\x05JY\x02\x03\x01\x0aJY\x01\x12\ +\x00?+\x00\x18?+\x11\x12\x009\x18/_^]\ ++\x11\x12\x01\x179\x113\x113\x11310!!\ +\x11!\x15!\x11!\x15!\x11!\x03\xee\xfc\xe1\x03\x1f\ +\xfdG\x02\x92\xfdn\x02\xb9\x05\xb6^\xfd\xd7^\xfd\x8d\ +\x00\x00\x01\x00\xcf\x00\x00\x03\xf0\x05\xb6\x00\x09\x00<@\ +!\x06\x00\x00\x01\x04\x07\x01\x03\x0a\x0b\x06\x09JY\x0f\ +\x06?\x06\x02\x0b\x03\x06\x06\x01\x02\x02\x05JY\x02\x03\ +\x01\x12\x00??+\x11\x12\x009\x18/_^]+\ +\x11\x12\x01\x179\x113\x11310!#\x11!\x15\ +!\x11!\x15!\x015f\x03!\xfdE\x02\x94\xfdl\ +\x05\xb6^\xfd\x94_\x00\x00\x01\x00\x81\xff\xec\x05)\x05\ +\xcd\x00\x1a\x00:@\x1f\x13\x07\x18\x02\x02\x0d\x1a\x07\x04\ +\x1b\x1c\x00\x1aKY\x00\x00\x04\x0b\x0b\x10LY\x0b\x04\ +\x04\x16LY\x04\x13\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x01\x179\x113\x11310\x01\ +!\x11\x06! \x00\x114\x12$32\x17\x07&#\ + \x00\x11\x10\x00!27\x11!\x03\x0e\x02\x1b\xd4\xfe\ +\xf7\xfe\xa6\xfe\x8f\xb7\x01U\xdd\xef\xbe)\xbe\xcc\xfe\xdf\ +\xfe\xad\x01B\x018\xca\x8d\xfeM\x02\xe1\xfdeZ\x01\ +\x87\x01f\xdf\x01Y\xbcX\x5cX\xfe\x9b\xfe\xd1\xfe\xb6\ +\xfe\xb39\x02\x02\x00\x01\x00\xcf\x00\x00\x04\xf2\x05\xb6\x00\ +\x0b\x007@\x1c\x08\x04\x04\x05\x09\x01\x01\x00\x05\x00\x0c\ +\x0d\x08\x03JY/\x08\x01\x08\x08\x05\x0a\x06\x03\x01\x05\ +\x12\x00?3?3\x129/]+\x11\x12\x0199\ +\x113\x113\x113\x11310!#\x11!\x11#\ +\x113\x11!\x113\x04\xf2g\xfc\xaaff\x03Vg\ +\x02\xcf\xfd1\x05\xb6\xfdw\x02\x89\x00\x00\x01\x00Z\x00\ +\x00\x02\x14\x05\xb6\x00\x0b\x007@\x1c\x05\x02\x0a\x03\x08\ +\x0b\x0b\x03\x02\x03\x0c\x0d\x09\x04\x06\x04LY\x06\x03\x0a\ +\x03\x01\x03LY\x01\x12\x00?+\x11\x003\x18?+\ +\x11\x003\x11\x12\x01\x179\x113\x113\x11310\ +!!57\x11'5!\x15\x07\x11\x17\x02\x14\xfeF\ +\xaa\xaa\x01\xba\xaa\xaaB\x14\x05\x0a\x15AA\x15\xfa\xf6\ +\x14\x00\x01\xffH\xfe\x8f\x015\x05\xb6\x00\x0b\x00\x1f@\ +\x0e\x03\x0a\x07\x07\x0c\x0d\x08\x03\x00\x05JY\x00\x22\x00\ +?+\x00\x18?\x11\x12\x019\x113310\x03\x22\ +'5\x1632\x11\x113\x11\x10!\x5c;NG\xf2\ +f\xfe\x8f\x1bX\x14\x01\x08\x05\xc0\xfaJ\xfe\x8f\x00\x00\ +\x01\x00\xcf\x00\x00\x04\xa6\x05\xb6\x00\x0c\x005@\x1c\x01\ +\x00\x0a\x0b\x08\x04\x04\x05\x05\x00\x0b\x02\x0c\x05\x0e\x0d\x0c\ +\x08\x02\x03\x04\x05\x0a\x06\x03\x01\x05\x12\x00?3?3\ +\x12\x179\x11\x12\x01\x179\x113\x113\x113\x113\ +10!#\x01\x07\x11#\x113\x117\x013\x01\x04\ +\xa6}\xfd\xcf\xc3ff\xa2\x02=\x82\xfd\xa9\x03\x04\xac\ +\xfd\xa8\x05\xb6\xfd\x08\xa2\x02V\xfd\x96\x00\x01\x00\xcf\x00\ +\x00\x03\xee\x05\xb6\x00\x05\x00\x1f@\x0e\x03\x00\x00\x04\x06\ +\x07\x01\x03\x00\x03KY\x00\x12\x00?+\x00\x18?\x11\ +\x12\x0199\x113103\x113\x11!\x15\xcff\ +\x02\xb9\x05\xb6\xfa\xaa`\x00\x01\x00\xcf\x00\x00\x06\x19\x05\ +\xb6\x00\x13\x00>@\x1e\x13\x00\x09\x08\x05\x05\x06\x0b\x0e\ +\x0e\x0d\x0d\x09\x06\x03\x14\x15\x12\x11\x02\x0a\x02\x06\x0b\x07\ +\x03\x0e\x00\x06\x12\x00?33?3\x1299\x113\ +3\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +310!\x01#\x16\x15\x11#\x113\x013\x013\ +\x11#\x1147#\x01\x03R\xfd\xdf\x08\x08b\x9e\x02\ +\x06\x06\x02\x06\x9ag\x0c\x08\xfd\xdd\x05F|\x82\xfb\xb8\ +\x05\xb6\xfa\xfa\x05\x06\xfaJ\x04Tt|\xfa\xbc\x00\x00\ +\x01\x00\xcf\x00\x00\x04\xf6\x05\xb6\x00\x0f\x00.@\x15\x01\ +\x0d\x0d\x00\x09\x06\x06\x07\x07\x00\x11\x10\x03\x0b\x07\x0e\x08\ +\x03\x01\x07\x12\x00?3?3\x1299\x11\x12\x019\ +9\x113\x113\x113\x11310!#\x01#\x16\ +\x15\x11#\x113\x013&5\x113\x04\xf6g\xfc\x9e\ +\x08\x0cbf\x03a\x06\x09c\x05\x12\xe8v\xfcL\x05\ +\xb6\xfa\xf0\xb4\xa2\x03\xba\x00\x02\x00\x81\xff\xec\x05\x9c\x05\ +\xcd\x00\x0b\x00\x17\x00(@\x14\x0c\x06\x12\x00\x06\x00\x18\ +\x19\x09\x15KY\x09\x04\x03\x0fKY\x03\x13\x00?+\ +\x00\x18?+\x11\x12\x0199\x113\x11310\x01\ +\x10\x00! \x00\x11\x10\x00! \x00\x01\x10\x00! \ +\x00\x11\x10\x00! \x00\x05\x9c\xfe\xa4\xfe\xce\xfe\xcf\xfe\ +\xa4\x01_\x010\x012\x01Z\xfbT\x01\x18\x01\x06\x01\ +\x08\x01\x17\xfe\xe9\xfe\xfa\xfe\xfb\xfe\xe5\x02\xdd\xfe\xa4\xfe\ +k\x01\x95\x01^\x01]\x01\x91\xfem\xfe\xa3\xfe\xc6\xfe\ +\xa9\x01T\x01=\x01<\x01Q\xfe\xac\x00\x02\x00\xcf\x00\ +\x00\x04?\x05\xb6\x00\x09\x00\x12\x004@\x1a\x0e\x00\x0a\ +\x05\x05\x06\x06\x00\x14\x13\x0a\x04LY\x0a\x0a\x06\x07\x07\ +\x12LY\x07\x03\x06\x12\x00??+\x11\x12\x009\x18\ +/+\x11\x12\x0199\x113\x113\x11310\x01\ +\x14\x04!#\x11#\x11! \x0132654&\ +##\x04?\xfe\xe0\xfe\xf8\xe2f\x01f\x02\x0a\xfc\xf6\ +\xc9\xf7\xdc\xd0\xda\xf2\x04\x12\xd4\xe2\xfd\xa4\x05\xb6\xfc\xfe\ +\xa3\xb7\xa9\xa3\x00\x00\x02\x00\x81\xfe\xa4\x05\x9c\x05\xcd\x00\ +\x10\x00\x1c\x009@\x1e\x05\x04\x03\x06\x17\x00\x11\x0b\x00\ +\x04\x06\x0b\x04\x1e\x1d\x0e\x1aKY\x0e\x04\x03\x05\x08\x08\ +\x14JY\x08\x13\x00?+\x00\x18\x10\xc63?+\x11\ +\x12\x01\x179\x113\x113\x113\x11310\x01\x10\ +\x02\x07\x01#\x01\x07# \x00\x11\x10\x00! \x00\x01\ +\x10\x00! \x00\x11\x10\x00! \x00\x05\x9c\xfc\xdf\x01\ +M\xa6\xfe\xe6!\x1f\xfe\xcf\xfe\xa4\x01_\x010\x012\ +\x01Z\xfbT\x01\x18\x01\x06\x01\x08\x01\x17\xfe\xe9\xfe\xfa\ +\xfe\xfb\xfe\xe5\x02\xdd\xfe\xda\xfe\x7f6\xfe\xa4\x01J\x02\ +\x01\x95\x01^\x01]\x01\x91\xfem\xfe\xa3\xfe\xc6\xfe\xa9\ +\x01T\x01=\x01<\x01Q\xfe\xac\x00\x00\x02\x00\xcf\x00\ +\x00\x04\x93\x05\xb6\x00\x0d\x00\x16\x00R@.\x0a\x0d\x0c\ +\x0b\x12\x07\x0e\x01\x01\x02\x02\x07\x0b\x0d\x04\x18\x17\x0a\x00\ +\x0e\x00LY\x0f\x0e\x1f\x0e?\x0eO\x0e\x04\x09\x03\x0e\ +\x0e\x03\x0c\x02\x12\x03\x16LY\x03\x03\x00?+\x00\x18\ +?3\x129/_^]+\x11\x003\x11\x12\x01\x17\ +9\x113\x113\x113\x113\x11310\x01\x11#\ +\x11! \x04\x15\x14\x06\x07\x01#\x01%!265\ +4&##\x015f\x01\x5c\x01\x10\x01\x04\x9b\x9e\x01\ +\x8dz\xfe\x87\xfe\x95\x01\x17\xb9\xcc\xc8\xe2\xf2\x02}\xfd\ +\x83\x05\xb6\xc9\xca\x93\xca,\xfdf\x02}X\xa5\xa1\xa7\ +\x98\x00\x01\x00o\xff\xec\x03\xf6\x05\xcb\x00$\x004@\ +\x1b\x1d\x12\x0b\x00\x00\x17\x12\x05\x04%&\x0b\x1d\x03\x15\ +\x15\x1aLY\x15\x04\x03\x08JY\x03\x13\x00?+\x00\ +\x18?+\x11\x12\x0099\x11\x12\x01\x179\x113\x11\ +310\x01\x14\x04# '5\x1632654\ +&&'&&54$32\x17\x07&#\x22\x06\ +\x15\x14\x16\x16\x17\x1e\x02\x03\xf6\xfe\xf3\xdf\xfe\xf4\x8f\x9e\ +\xf5\xb4\xd3F\x9e\x99\xe0\xab\x01\x01\xca\xce\xb5%\xb6\xa6\ +\xa2\xc0;\x86\xa3\xab\xacO\x01y\xb7\xd6;fC\xa5\ +\x86SmZ4M\xb3\x95\xa4\xcfNXL\x96\x81Q\ +hS:;o\x8d\x00\x00\x01\x00\x0a\x00\x00\x04'\x05\ +\xb6\x00\x07\x00%@\x12\x00\x01\x01\x03\x06\x03\x09\x08\x01\ +\x12\x07\x03\x04\x03KY\x04\x03\x00?+\x11\x003\x18\ +?\x11\x12\x01\x179\x11310!#\x11!5!\ +\x15!\x02Lg\xfe%\x04\x1d\xfe%\x05V``\x00\ +\x01\x00\xbe\xff\xec\x05\x02\x05\xb6\x00\x11\x00%@\x11\x10\ +\x01\x0a\x07\x07\x01\x13\x12\x11\x08\x03\x04\x0dLY\x04\x13\ +\x00?+\x00\x18?3\x11\x12\x0199\x113\x113\ +10\x01\x11\x14\x00!\x22\x005\x113\x11\x14\x163\ +265\x11\x05\x02\xfe\xdc\xfe\xfb\xfe\xfe\xe3g\xea\xd6\ +\xd1\xe6\x05\xb6\xfcN\xfc\xfe\xe4\x01\x1d\xff\x03\xae\xfcN\ +\xd3\xeb\xe7\xcd\x03\xbc\x00\x00\x01\x00\x00\x00\x00\x04\x9e\x05\ +\xb6\x00\x0a\x00*@\x14\x03\x02\x08\x00\x01\x05\x04\x01\x04\ +\x08\x03\x0c\x0b\x08\x03\x00\x04\x03\x03\x12\x00??3\x12\ +9\x11\x12\x01\x179\x113\x113\x113310\x01\ +3\x01#\x013\x01\x16\x1767\x04/o\xfd\xddZ\ +\xfd\xdfm\x01pT\x1d\x14;\x05\xb6\xfaJ\x05\xb6\xfc\ +\x1d\xe1qK\x9e\x00\x01\x003\x00\x00\x06\xf0\x05\xb6\x00\ +\x1b\x00D@\x22\x01\x00\x17\x08\x07\x10\x14\x13\x04\x1a\x1b\ +\x0a\x09\x04\x09\x10\x17\x1b\x05\x1d\x1c\x04\x09\x17\x10\x10\x08\ +\x1a\x13\x09\x03\x01\x08\x12\x00?3?33\x129\x11\ +3\x119\x11\x12\x01\x179\x113\x113\x1133\x11\ +33\x113310!#\x01&'\x06\x06\x01#\ +\x013\x01\x1e\x03\x176\x13\x133\x01\x16\x1766\x01\ +3\x05\x5cT\xfe\xbf(\x14\x10;\xfe\xdbV\xfenk\ +\x01\x00\x0f\x1a\x15\x11\x07\x18N\xfaq\x01%3\x16\x0d\ +)\x01 g\x04h\x8bYW\xe2\xfb\xed\x05\xb6\xfcR\ +9aUO(\x88\x01\x15\x03w\xfc\x06\xb0lH\xa2\ +\x04,\x00\x00\x01\x00\x00\x00\x00\x04N\x05\xb6\x00\x0b\x00\ +5@\x1c\x01\x00\x09\x0a\x07\x06\x03\x04\x00\x02\x04\x05\x06\ +\x08\x0a\x0b\x08\x0d\x0c\x02\x08\x04\x09\x06\x03\x01\x04\x12\x00\ +?3?3\x1299\x11\x12\x01\x179\x113\x113\ +\x113\x11310!#\x01\x01#\x01\x013\x01\x01\ +3\x01\x04Nu\xfeP\xfeHq\x01\xec\xfeAs\x01\ +\x8b\x01\x91m\xfe;\x02\xaa\xfdV\x02\xfa\x02\xbc\xfd\x8e\ +\x02r\xfdF\x00\x00\x01\x00\x00\x00\x00\x049\x05\xb6\x00\ +\x08\x00,@\x15\x00\x03\x03\x06\x01\x02\x08\x07\x02\x06\x07\ +\x03\x0a\x09\x00\x05\x01\x07\x03\x05\x12\x00??3\x129\ +\x11\x12\x01\x179\x113\x113\x113\x12910\x01\ +\x013\x01\x11#\x11\x013\x02\x1f\x01\xacn\xfe\x19i\ +\xfe\x17u\x02\x96\x03 \xfc\x7f\xfd\xcb\x02-\x03\x89\x00\ +\x01\x00R\x00\x00\x04J\x05\xb6\x00\x09\x008@\x1d\x03\ +\x07\x08\x02\x02\x04\x07\x09\x04\x0b\x0a\x07\x04\x05\x05\x04K\ +Y\x05\x03\x02\x08\x01\x01\x08KY\x01\x12\x00?+\x11\ +\x12\x009\x18?+\x11\x12\x009\x11\x12\x01\x179\x11\ +3\x11310!!5\x01!5!\x15\x01!\x04\ +J\xfc\x08\x03X\xfc\xcf\x03\xba\xfc\xa6\x03qL\x05\x0a\ +`L\xfa\xf6\x00\x00\x01\x00\xae\xfe\xbc\x02Z\x05\xb6\x00\ +\x07\x00\x1f@\x0d\x04\x07\x06\x01\x07\x01\x09\x08\x06\x01\x05\ +\x02\x03\x00?3/3\x11\x12\x0199\x113\x113\ +10\x01!\x11!\x15!\x11!\x02Z\xfeT\x01\xac\ +\xfe\xb6\x01J\xfe\xbc\x06\xfa^\xf9\xc3\x00\x01\x00\x19\x00\ +\x00\x02\xa2\x05\xb6\x00\x03\x00\x1c@\x0c\x02\x01\x00\x03\x03\ +\x01\x05\x04\x03\x03\x02\x12\x00??\x11\x12\x0199\x11\ +3\x11310\x13\x01#\x01\x7f\x02#g\xfd\xde\x05\ +\xb6\xfaJ\x05\xb6\x00\x01\x003\xfe\xbc\x01\xdf\x05\xb6\x00\ +\x07\x00\x1f@\x0d\x01\x06\x03\x00\x06\x00\x09\x08\x00\x07\x03\ +\x04\x03\x00?3/3\x11\x12\x0199\x113\x113\ +10\x17!\x11!5!\x11!3\x01J\xfe\xb6\x01\ +\xac\xfeT\xe5\x06=^\xf9\x06\x00\x01\x00X\x021\x04\ +9\x05\xc1\x00\x06\x00'@\x12\x02\x01\x05\x04\x03\x06\x00\ +\x00\x03\x05\x03\x08\x07\x05\x00\x04\x02\x03\x00?\xcd29\ +\x11\x12\x01\x179\x113\x113\x113310\x13\x01\ +3\x01#\x01\x01X\x01\xd1D\x01\xccd\xfeu\xfer\ +\x021\x03\x90\xfcp\x03\x17\xfc\xe9\x00\x00\x01\xff\xfc\xfe\ +\xf6\x03N\xffH\x00\x03\x00\x15@\x09\x03\x05\x02\x04\x02\ +\x01SY\x02\x00/+\x11\x013\x11310\x01!\ +5!\x03N\xfc\xae\x03R\xfe\xf6R\x00\x01\x01\x89\x04\ +\xd9\x03\x08\x06!\x00\x09\x00\x18@\x09\x06\x04\x04\x00\x0b\ +\x0a\x06\x80\x01\x00/\x1a\xcd\x11\x12\x0199\x1131\ +0\x01#&&'53\x16\x16\x17\x03\x08E`\xb9\ +!\x8e\x1a\x91F\x04\xd9O\xb9/\x110\xbcL\x00\x00\ +\x02\x00b\xff\xec\x03\x93\x04R\x00\x19\x00$\x00Q@\ +,\x01\x0c\x1d\x1d\x19\x22\x08\x08\x19\x13\x03&%\x02\x00\ +\x15\x0c\x1eIY\x0f\x0c\x1f\x0c\x02\x0b\x03\x0c\x0c\x15\x00\ +\x15\x15\x10HY\x15\x10\x05\x1aFY\x05\x16\x00?+\ +\x00\x18?+\x00\x18?\x129/_^]+\x11\x12\ +\x009\x11\x12\x01\x179\x113\x113\x113310\ +!'#\x06\x06#\x22&54$7754&\ +#\x22\x07'632\x16\x15\x11%2655\x07\ +\x06\x06\x15\x14\x16\x03J\x19\x08R\xadv\xa0\xb2\x01\x09\ +\xfb\xcf~\x8c\x97\xa2%\xb3\xaf\xb3\xb1\xfe'\xae\xc9\xbe\ +\xe5\xc3}\xaciW\xa4\x91\x9f\xb0\x05\x06H\x9b\x9eT\ +VT\xba\xc5\xfd-F\xc7\xb1k\x08\x0by\x80fq\ +\x00\x00\x02\x00\xb6\xff\xec\x04L\x06\x14\x00\x15\x00!\x00\ +>@\x1f \x03\x0a\x19\x0f\x0f\x0c\x0c\x03#\x22\x0a\x12\ +\x06\x00\x0d\x00\x0c\x15\x00\x16FY\x00\x10\x06\x1dHY\ +\x06\x16\x00?+\x00\x18?+\x00\x18??\x11\x129\ +9\x11\x12\x0199\x113\x1133\x11310\x01\ +2\x12\x11\x10\x02#\x22&'#\x07#\x113\x11\x14\ +\x07\x07366\x17\x22\x06\x15\x15\x14\x163265\ +\x10\x02\x81\xe4\xe7\xf3\xdct\xba6\x09\x1c>c\x04\x03\ +\x07>\xafy\xc0\xa6\xad\xb7\xb2\xb4\x04T\xfe\xe1\xfe\xec\ +\xfe\xf1\xfe\xda`X\xa4\x06\x14\xfeyXJUb\x5c\ +Z\xdc\xfd\x11\xf6\xd6\xf9\xe6\x01\xd7\x00\x00\x01\x00w\xff\ +\xec\x03\x85\x04T\x00\x15\x00&@\x14\x0e\x03\x03\x08\x13\ +\x03\x17\x16\x06\x0bFY\x06\x10\x00\x11FY\x00\x16\x00\ +?+\x00\x18?+\x11\x12\x01\x179\x11310\x05\ +\x22\x00\x11\x10\x0032\x17\x07&#\x22\x06\x15\x14\x16\ +327\x15\x06\x02h\xe9\xfe\xf8\x01\x12\xee\x8d\x81\x1b\ +\x8dh\xc8\xce\xce\xb9\x94\x7fh\x14\x01&\x01\x07\x01\x0e\ +\x01-1X/\xf7\xe8\xdc\xf95\x5c3\x00\x00\x02\x00\ +w\xff\xec\x04\x0c\x06\x14\x00\x13\x00\x1f\x00>@\x1f\x0b\ +\x1d\x06\x06\x09\x17\x11\x11\x09! \x04\x0c\x0e\x00\x07\x00\ +\x0a\x15\x00\x14FY\x00\x10\x0e\x19HY\x0e\x16\x00?\ ++\x00\x18?+\x00\x18??\x11\x1299\x11\x12\x01\ +99\x113\x113\x113310\x012\x16\x173\ +&5\x113\x11#'#\x06#\x22\x02\x11\x10\x12\x17\ +\x22\x06\x15\x10!26554&\x02Dv\xacD\ +\x06\x06bA\x19\x08|\xe8\xe1\xee\xec\xe1\xb2\xb3\x01g\ +\xb8\xac\xa9\x04TVh~y\x01\x87\xf9\xec\xa6\xba\x01\ +\x18\x01\x0c\x01\x1a\x01*Z\xfa\xee\xfe2\xd6\xf6\x11\xfc\ +\xdd\x00\x02\x00w\xff\xec\x03\xee\x04T\x00\x14\x00\x1b\x00\ +G@'\x19\x09\x18\x0b\x0b\x03\x03\x09\x11\x03\x1d\x1c\x18\ +\x0bHY\x0f\x18\x1f\x18\x02\x0b\x03\x18\x18\x00\x06\x06\x15\ +HY\x06\x10\x00\x0eFY\x00\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/_^]+\x11\x12\x01\x179\ +\x113\x113\x11310\x05\x22\x00\x11\x10\x0032\ +\x12\x15\x15!\x16\x163267\x15\x06\x06\x03\x22\x06\ +\x07!4&\x02m\xed\xfe\xf7\x01\x00\xd9\xc0\xde\xfc\xf1\ +\x02\xcd\xbf]\x8dl\x5c\x9c{\x9d\xbe\x10\x02\xa0\xa4\x14\ +\x01$\x01\x07\x01\x04\x019\xfe\xf4\xe6P\xe0\xec\x1a+\ +Z(\x1d\x04\x10\xcf\xc3\xbd\xd5\x00\x01\x00\x1d\x00\x00\x02\ +\xd5\x06\x1f\x00\x15\x00=@\x1f\x0d\x14\x14\x07\x02\x02\x03\ +\x00\x03\x05\x03\x17\x16\x03\x15\x0b\x10HY\x0b\x00\x05\x01\ +\x07\x14\x14\x01HY\x14\x0f\x00?+\x11\x003\x113\ +\x18?+\x00\x18?\x11\x12\x01\x179\x113\x1299\ +\x11310\x01!\x11#\x11#575463\ +2\x17\x07&#\x22\x06\x15\x15!\x02J\xff\x00c\xca\ +\xca\x93\xa7ZZ\x17POta\x01\x00\x03\xe9\xfc\x17\ +\x03\xe9:%T\xc8\xbb\x1bV\x19\x89\x9ae\x00\x03\x00\ +-\xfe\x14\x04\x06\x04T\x00)\x003\x00?\x00\x80@\ +G\x0c\x1f:\x044$.\x13*\x19\x01\x04\x13\x19\x1f\ +$\x06A@\x04'\x07\x1c2\x0f!\x09\x07\x077I\ +Y\x00\x07`\x07\x90\x07\x03\x0d\x03\x07\x07\x16)\x0f2\ +GY\x0f\x0f\x16)'=IY'\x10)\x02IY\ +)\x0f\x16,IY\x16\x1b\x00?+\x00\x18?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x009\x18/\ +_^]+\x11\x0033\x11\x129\x11\x129\x11\x12\ +\x01\x179\x113\x113\x113\x113\x11310\x01\ +\x15\x07\x16\x15\x14\x06#\x22'\x06\x06\x15\x14\x1633\ +2\x16\x15\x14\x04!\x22&5467&&54\ +7&&54632\x17\x01\x14! \x114&\ +## \x13\x14\x1632654&#\x22\x06\x04\ +\x06\xe1Z\xd1\xb0J\x1e;>O]\xbe\xb1\xbc\xfe\xe9\ +\xfe\xfe\xcd\xe1\x8bw1;\x8b_j\xcf\xb0k;\xfd\ +\xec\x01M\x01\xac\x86\x96\xb2\xfe\xd5S\x99\x80\x88\x91\x95\ +\x86\x82\x95\x04?E\x0ep\x86\x9d\xc3\x06\x1fT/4\ +0\x8f\x8c\xac\xbb\x9e\x8dp\x94\x1b\x15M2mS'\ +\xa7l\xa3\xc5\x15\xfb\x09\xe0\x01\x11bX\x02\xb9~\x8b\ +\x8a\x83\x8b\x8b\x95\x00\x01\x00\xb6\x00\x00\x04\x0e\x06\x14\x00\ +\x14\x003@\x19\x00\x14\x0d\x0c\x08\x08\x09\x14\x09\x16\x15\ +\x0d\x09\x11\x11\x04FY\x11\x10\x0a\x00\x00\x09\x15\x00?\ +3??+\x11\x12\x009\x11\x12\x0199\x113\x11\ +33\x11310!\x114&#\x22\x06\x15\x11#\ +\x113\x11\x073663 \x11\x11\x03\xac\x8a\x91\xc3\ +\xb5cc\x05\x07=\xba\x8a\x01r\x02\xc1\xa4\x95\xc5\xdd\ +\xfd\xa8\x06\x14\xfe\x11\x8bbX\xfes\xfd9\x00\x02\x00\ +\xa8\x00\x00\x01)\x05\xcd\x00\x03\x00\x0d\x00%@\x12\x09\ +\x00\x04\x00\x01\x01\x0f\x0e`\x0c\x01\x0c\x06\x04\x02\x0f\x01\ +\x15\x00???\xcd]\x11\x12\x019\x1133\x113\ +10!#\x113\x03432\x16\x15\x14\x06#\x22\ +\x01\x19ccq?\x1f##\x1f?\x04?\x01.`\ +2.-4\x00\x00\x02\xff\x9e\xfe\x14\x01)\x05\xcd\x00\ +\x0c\x00\x16\x004@\x1a\x12\x0a\x0d\x03\x0a\x07\x07\x18\x17\ +\x00\x15\x01\x0f\x03\x15@\x0f\x04\x08\x0f\x00\x05FY\x00\ +\x1b\x00?+\x00\x18??\x1a\xcd_^]\x11\x12\x01\ +9\x11333\x11310\x13\x22'5\x1632\ +5\x113\x11\x14\x06\x13432\x16\x15\x14\x06#\x22\ +%P7E<\x97c\x7f\x0e?\x1f##\x1f?\xfe\ +\x14\x19V\x14\xb0\x05 \xfa\xee\x87\x92\x07Y`2.\ +-4\x00\x00\x01\x00\xb6\x00\x00\x03\xdf\x06\x14\x00\x0d\x00\ +8@\x1e\x05\x04\x01\x02\x0c\x08\x08\x09\x02\x03\x04\x06\x09\ +\x05\x0f\x0e\x03\x06\x0d\x07\x04\x09\x01\x0a\x00\x01\x0f\x05\x09\ +\x15\x00?3??\x11\x12\x179\x11\x12\x01\x179\x11\ +3\x113\x113\x11310\x01\x013\x01\x01#\x01\ +\x07\x11#\x113\x11\x03\x01\x17\x02+x\xfeT\x01\xd1\ +w\xfec\xb2cc\x07\x01\xdd\x02b\xfe0\xfd\x91\x02\ +%\xa2\xfe}\x06\x14\xfc\xf4\xfe\xd5\x00\x00\x01\x00\xb6\x00\ +\x00\x01\x19\x06\x14\x00\x03\x00\x16@\x09\x00\x01\x01\x05\x04\ +\x02\x00\x01\x15\x00??\x11\x12\x019\x11310!\ +#\x113\x01\x19cc\x06\x14\x00\x01\x00\xb6\x00\x00\x06\ +f\x04T\x00\x22\x00H@$\x1a\x08\x09\x00\x22\x08\x09\ +\x14\x10\x10\x11\x09\x11\x22\x03$#\x1b\x14\x11\x18\x12\x0f\ +\x00\x09\x11\x15\x04\x0c\x18\x0cFY\x1e\x18\x10\x00?3\ ++\x11\x003\x18?33?\x11\x1299\x11\x12\x01\ +\x179\x113\x113\x113\x113\x11\x12910!\ +\x114&#\x22\x06\x15\x11#\x11\x10#\x22\x06\x15\x11\ +#\x113\x173663 \x1736632\x16\ +\x15\x11\x06\x04|\x80\xa7\xa0e\xfc\xab\x9ccR\x15\x06\ +-\xa6d\x01\x01I\x045\xb3r\xb2\xb2\x02\xc9\x9f\x92\ +\xb8\xc5\xfd\x83\x02\xe7\x01\x13\xc7\xdb\xfd\xa8\x04?\x95Q\ +Y\xc1]d\xbe\xcf\xfd9\x00\x00\x01\x00\xb6\x00\x00\x04\ +\x0e\x04T\x00\x12\x001@\x18\x0c\x08\x08\x09\x00\x12\x09\ +\x12\x13\x14\x0c\x09\x0f\x0f\x04FY\x0f\x10\x0a\x0f\x00\x09\ +\x15\x00?3??+\x11\x12\x009\x11\x12\x0199\ +\x113\x113\x11310!\x114&#\x22\x06\x15\ +\x11#\x113\x1736! \x11\x11\x03\xac\x8a\x91\xc3\ +\xb5cT\x13\x06j\x01\x0f\x01r\x02\xc1\xa4\x95\xc5\xdd\ +\xfd\xa8\x04?\x95\xaa\xfes\xfd9\x00\x00\x02\x00w\xff\ +\xec\x049\x04T\x00\x0c\x00\x18\x00(@\x14\x0d\x07\x13\ +\x00\x07\x00\x19\x1a\x0a\x16FY\x0a\x10\x03\x10FY\x03\ +\x16\x00?+\x00\x18?+\x11\x12\x0199\x113\x11\ +310\x01\x10\x00#\x22&\x025\x10\x0032\x12\ +\x01\x14\x1632654&#\x22\x06\x049\xfe\xfe\ +\xe3\x8f\xdat\x01\x02\xe1\xe0\xff\xfc\xa6\xc5\xb4\xb4\xc5\xc7\ +\xb4\xb4\xc3\x02!\xfe\xf6\xfe\xd5\x8a\x01\x02\xa9\x01\x0a\x01\ +)\xfe\xd3\xfe\xfa\xe0\xfb\xfb\xe0\xe1\xf8\xf7\x00\x00\x02\x00\ +\xb6\xfe\x14\x04L\x04T\x00\x13\x00\x1f\x00A@!\x1d\ +\x0b\x06\x03\x07\x07\x08\x17\x11\x08\x11 !\x03\x0b\x00\x0e\ +\x0e\x19FY\x0e\x10\x09\x0f\x08\x1b\x00\x14HY\x00\x16\ +\x00?+\x00\x18???+\x11\x12\x0099\x11\x12\ +\x0199\x113\x113\x11333310\x05\x22\ +'#\x17\x16\x15\x11#\x113\x173632\x12\x11\ +\x10\x02'265\x10!\x22\x06\x15\x15\x14\x16\x02\x87\ +\xfbs\x07\x03\x04cT\x13\x06p\xf6\xdc\xe7\xf3\xd4\xa7\ +\xb7\xfe\xa6\xbe\xb2\xab\x14\xbcTJX\xfeb\x06+\x9b\ +\xb0\xfe\xdf\xfe\xec\xfe\xf4\xfe\xd9X\xf8\xdf\x01\xdf\xd1\xec\ + \xff\xda\x00\x02\x00w\xfe\x14\x04\x0c\x04T\x00\x12\x00\ +\x1f\x00>@\x1f\x16\x09\x0d\x0d\x0c\x1d\x03\x0c\x03! \ +\x09\x11\x00\x06\x0a\x0f\x0d\x1b\x06\x1aFY\x06\x10\x00\x13\ +HY\x00\x16\x00?+\x00\x18?+\x00\x18??\x11\ +\x1299\x11\x12\x0199\x113\x113\x11331\ +0\x05\x22\x02\x11\x10\x1232\x17373\x11#\x11\ +47#\x06'26\x1154&#\x22\x06\x15\x14\ +\x16\x029\xd6\xec\xec\xdc\xecu\x06\x12Tb\x06\x06v\ +\xf9\xc6\xa9\xaa\xba\xb0\xb7\xb3\x14\x01\x1c\x01\x0c\x01\x13\x01\ +-\xae\x99\xf9\xd5\x01\x9ez~\xbeX\xda\x01\x01\x0c\xf5\ +\xda\xf8\xf0\xe5\xe9\x00\x01\x00\xb6\x00\x00\x02\xf6\x04T\x00\ +\x10\x00,@\x15\x0d\x09\x09\x0a\x0a\x02\x12\x11\x0d\x0a\x00\ +\x0b\x0f\x0a\x15\x00\x05FY\x00\x10\x00?+\x00\x18?\ +?\x11\x129\x11\x12\x0199\x113\x11310\x01\ +2\x17\x07&#\x22\x06\x15\x11#\x113\x17366\ +\x02bEO\x13DI\x8b\xb2cT\x0a\x07C\x98\x04\ +T\x0e_\x11\xec\xb4\xfd\xa8\x04?\xc4xa\x00\x01\x00\ +T\xff\xec\x03X\x04T\x00#\x004@\x1b\x0b\x00\x1d\ +\x12\x00\x05\x12\x17\x04%$\x0b\x1d\x03\x15\x15\x1aFY\ +\x15\x10\x03\x08FY\x03\x16\x00?+\x00\x18?+\x11\ +\x12\x0099\x11\x12\x01\x179\x113\x11310\x01\ +\x14\x06#\x22'5\x1632654&'.\x02\ +54632\x17\x07&#\x22\x06\x15\x14\x16\x17\x1e\ +\x02\x03X\xde\xcc\xda\x80\xa4\xb6\xa1\xa7\x85\x98\xa3\x84C\ +\xcd\xb8\xb0\x9e%\xa0\x89\x85\x9cy\xb0\x93\x86C\x01\x1b\ +\x92\x9dCkRkYRp6;UkMz\x8e\ +BZBXNUf?5Ul\x00\x01\x00\x19\xff\ +\xec\x02y\x05F\x00\x15\x00;@\x1e\x0f\x0c\x13\x13\x08\ +\x02\x08\x0a\x11\x04\x17\x16\x0e\x0e\x0c\x0f\x09\x12\x0f\x12H\ +Y\x0f\x0f\x05\x00HY\x05\x16\x00?+\x00\x18?+\ +\x11\x003\x1133\x18/\x11\x12\x01\x179\x113\x12\ +9910%27\x15\x06#\x22&5\x11#5\ +773\x11!\x15!\x11\x14\x16\x01\xd5^FH^\ +\x90\x89\xa1\xa123\x01?\xfe\xc1XD\x10P\x18\x9a\ +\xa5\x02\xbe:-\xf6\xfe\xf9V\xfdP}x\x00\x01\x00\ +\xaa\xff\xec\x04\x02\x04?\x00\x12\x000@\x17\x0c\x07\x07\ +\x0a\x01\x11\x11\x0a\x14\x13\x0d\x0b\x08\x12\x0f\x0b\x15\x0f\x04\ +FY\x0f\x16\x00?+\x00\x18??3\x129\x11\x12\ +\x0199\x113\x113\x11310\x01\x11\x14\x163\ +265\x113\x11#'#\x06! \x11\x11\x01\x0c\ +\x8a\x91\xc2\xb7bT\x12\x06j\xfe\xf1\xfe\x8d\x04?\xfd\ +@\xa4\x95\xc4\xdd\x02X\xfb\xc1\x96\xaa\x01\x8d\x02\xc6\x00\ +\x01\x00\x00\x00\x00\x03\xac\x04?\x00\x0b\x00(@\x13\x0b\ +\x00\x05\x09\x0a\x02\x01\x01\x05\x0a\x03\x0d\x0c\x09\x01\x0f\x05\ +\x00\x15\x00?2?3\x11\x12\x01\x179\x113\x113\ +\x113310!\x013\x01\x16\x17367\x013\ +\x01\x01\xa4\xfe\x5cf\x01\x198\x1c\x06)+\x01\x19f\ +\xfe\x5c\x04?\xfd\x1d\x8ej\x88r\x02\xe1\xfb\xc1\x00\x00\ +\x01\x00\x1f\x00\x00\x05\xaa\x04?\x00\x1b\x00L@'\x19\ +\x1a\x0a\x09\x12\x11\x04\x1b\x00\x15\x08\x07\x0e\x04\x09\x0e\x15\ +\x1a\x05\x1d\x1c\x03\x04\x04\x09\x16\x15\x0e\x03\x0d\x0d\x08\x19\ +\x11\x09\x0f\x00\x08\x15\x00?3?33\x129\x11\x17\ +3\x119\x113\x11\x12\x01\x179\x1133\x1133\ +\x1133\x113\x11310!\x03&'#\x07\x07\ +\x03#\x013\x13\x16\x17367\x133\x13\x16\x173\ +6\x13\x133\x01\x04\x1b\xee\x17$\x06\x15-\xf2b\xfe\ +\xc9j\xae=\x13\x06;\x1b\xe0Z\xd5H\x10\x06\x08H\ +\xa6d\xfe\xd9\x02\xd7J\x8fJ\x91\xfd+\x04?\xfd\x8a\ +\xean\xeaM\x02\x97\xfdk\xebLA\x01\x1b\x02p\xfb\ +\xc1\x00\x01\x007\x00\x00\x03\xc5\x04?\x00\x0b\x003@\ +\x1a\x08\x07\x04\x05\x02\x01\x0a\x0b\x00\x01\x05\x06\x07\x0b\x06\ +\x0d\x0c\x09\x03\x0b\x04\x01\x0f\x08\x0b\x15\x00?3?3\ +\x1299\x11\x12\x01\x179\x113\x113\x113\x113\ +10\x01\x013\x01\x013\x01\x01#\x01\x01#\x01\xc1\ +\xfe\x85r\x01D\x01Am\xfe\x8b\x01\x90s\xfe\xaa\xfe\ +\xa8m\x02/\x02\x10\xfe6\x01\xca\xfd\xf0\xfd\xd1\x01\xe5\ +\xfe\x1b\x00\x00\x01\x00\x00\xfe\x14\x03\xac\x04?\x00\x18\x00\ +2@\x19\x08\x09\x01\x00\x18\x0a\x05\x00\x05\x09\x11\x04\x1a\ +\x19\x04\x18\x08\x00\x0f\x0e\x13FY\x0e\x1b\x00?+\x00\ +\x18?3/3\x11\x12\x01\x179\x1133\x113\x11\ +310\x113\x13\x12\x1736\x13\x133\x01\x0e\x02\ +#\x22'5\x1632>\x027f\xe6i\x1c\x06*\ +_\xe6f\xfe\x19;PkL9F:C3N?\ +S\x0c\x04?\xfd\x9e\xfe\xe7b\x81\x01\x00\x02\x5c\xfb\x11\ +\x9al6\x15V\x100e\xdb!\x00\x00\x01\x00R\x00\ +\x00\x03Z\x04?\x00\x09\x008@\x1d\x03\x07\x08\x02\x02\ +\x04\x07\x09\x04\x0b\x0a\x07\x04\x05\x05\x04HY\x05\x0f\x02\ +\x08\x01\x01\x08HY\x01\x15\x00?+\x11\x12\x009\x18\ +?+\x11\x12\x009\x11\x12\x01\x179\x113\x1131\ +0!!5\x01!5!\x15\x01!\x03Z\xfc\xf8\x02\ +\x85\xfd\xaa\x02\xd7\xfdw\x02\x8b?\x03\xa8X?\xfcX\ +\x00\x00\x01\x00=\xfe\xbc\x02\x8b\x05\xb6\x00\x1d\x007@\ +\x1a\x1a\x0a\x12\x03\x16\x0e\x00\x00\x07\x03\x07\x0a\x03\x1f\x1e\ +\x19\x0a\x0a\x0b\x0b\x11\x03\x04\x12\x11\x03\x00?3/3\ +\x129/3\x129\x11\x12\x01\x179\x113\x1299\ +\x113\x11310\x05\x14\x16\x17\x15\x22&5\x114\ +'5665\x11\x10%\x15\x06\x06\x15\x11\x14\x06\x07\ +\x15\x16\x16\x15\x01\x85w\x8f\xc3\xa5\xe6zl\x01h\x8a\ +|XbaY\x1bfe\x03[\x96\x9c\x01Q\xcd\x04\ +P\x02bc\x01^\x01+\x06Z\x05jh\xfe\xcf\x82\ +\x80\x15\x08\x14\x7f{\x00\x00\x01\x01\xfc\xfe\x06\x02X\x06\ +\x19\x00\x03\x00\x16@\x09\x02\x03\x03\x05\x04\x00\x00\x03\x1c\ +\x00??\x11\x12\x019\x11310\x013\x11#\x01\ +\xfc\x5c\x5c\x06\x19\xf7\xed\x00\x01\x00H\xfe\xbc\x02\x96\x05\ +\xb6\x00\x1e\x007@\x1a\x03\x14\x0b\x1b\x0f\x08\x1e\x1e\x17\ +\x14\x17\x1b\x03 \x1f\x04\x14\x14\x13\x13\x0c\x1b\x1a\x0b\x0c\ +\x03\x00?3/3\x129/3\x129\x11\x12\x01\x17\ +9\x113\x1299\x113\x11310\x01467\ +5&&5\x114&'52\x16\x15\x11\x14\x16\x17\ +\x15\x06\x15\x11\x14\x06#5665\x01NYaa\ +Y{\x8b\xae\xbamy\xe6\xa5\xc3\x8dy\x01'{\x7f\ +\x14\x08\x14\x80\x83\x011gk\x05Z\x9b\x96\xfe\xa2d\ +a\x02P\x04\xcd\xfe\xaf\x9b\x97[\x02eg\x00\x01\x00\ +o\x02h\x04#\x03=\x00\x15\x00,@\x18\x0e\x03\x17\ +\x16\x03\x12\x0e\x0b\x12\x80\x00o\x06\x7f\x06\x9f\x06\x03\x06\ +@\x09\x0dH\x06\x00/+]3\x1a\xcd2\xc4\x10\xc4\ +\x11\x12\x019910\x01\x22\x06\x075632\x16\ +\x17\x163267\x15\x06\x06#\x22'&\x01N1\ +v8l}=le~^8k>0qIt\ +\x9a|\x02\xe9=;^n\x1b,:=@`1@\ +H9\x00\x00\x02\x00\xa6\xfe\x89\x01H\x04T\x00\x03\x00\ +\x0d\x00)@\x13\x08\x02\x04\x02\x03\x03\x0f\x0e\x00\x00\x06\ +\x03\x22\x06\x0bQY\x06\x10\x00?+\x00\x18?\x129\ +/\x11\x12\x019\x1133\x11310\x133\x13#\ +\x03432\x15\x14\x06#\x22&\xd7=\x1dw\x14P\ +R/#\x22.\x02\xc7\xfb\xc2\x05ibb5..\ +\x00\x00\x01\x00\xd3\xff\xec\x03\xcd\x05\xcb\x00\x1d\x00_@\ +;\x08\x07\x1c\x1c\x1d\x03\x0c\x17\x1d\x04\x1f\x1e\x09\x0fM\ +Y\x06\x00\x09\xb0\x09\xc0\x09\xd0\x09\x04\x12\x03\x09\x09\x1d\ +\x07\x00\x1b\x1b\x15MY\x10\x1b \x1b0\x1b\x03`\x1b\ +p\x1b\x80\x1b\x03\x1b\x1b\x1d\x07\x07\x1d\x19\x00??\x12\ +9/]q+\x11\x003\x11\x129\x18/_^]\ +3+\x11\x12\x01\x179\x113\x129910%&\ +\x0254\x12753\x1532\x17\x07&#\x22\x06\ +\x15\x14\x16327\x15\x06##\x15#\x02Z\xba\xcd\ +\xcd\xbaR\x0e\x83\x90\x1f\x86g\xbb\xcb\xc9\xb4\x83\x88n\ +\x9d\x0cR\xbe\x1e\x01\x22\xeb\xe8\x01+!\xae\xa67T\ +3\xf5\xec\xe1\xf9:\x5c8\xcc\x00\x01\x00N\x00\x00\x04\ +1\x05\xc9\x00\x1e\x00O@*\x04\x08\x1c\x0f\x00\x00\x0c\ +\x05\x08\x0c\x0d\x15\x1e\x06 \x1f\x00\x0d\x0e\x0dOY\x1c\ +\x0e\x0e\x07\x13\x13\x18MY\x13\x07\x08\x04\x07\x07\x04N\ +Y\x07\x18\x00?+\x11\x12\x009\x18?+\x11\x12\x00\ +9\x18/3+\x11\x003\x11\x12\x01\x179\x113\x12\ +99\x11310\x01\x11\x14\x06\x07!\x15!56\ +65\x11#53\x114632\x17\x07&#\x22\ +\x06\x15\x11!\x15\x01\x9cFN\x03)\xfc\x1dn{\xd3\ +\xd3\xc4\xb7\xaf\x9b#\x9d\x8a\x8d\x89\x01\x9b\x02\xa4\xff\x00\ +t\xa00`T\x15\xb2\x87\x01\x02R\x01)\xcc\xdeD\ +VB\xa2\xac\xfe\xd3R\x00\x02\x00\x7f\x01\x0a\x04\x10\x04\ +\x9e\x00\x1b\x00'\x00T@\x1b\x1f\x00%\x0e\x00\x02\x05\ +\x09\x0c\x0e\x10\x13\x17\x1a\x0a)(\x18\x12@\x0c\x14H\ +\x12\x15\x04\x0a\xb8\xff\xc0@\x18\x0c\x14H\x0a\x13\x10\x17\ +\x1a\x0c\x09\x05\x02\x08\x1c\x07\x22o\x15\x8f\x15\xdf\x15\x03\ +\x15\x00/]3\xd42\x179\xc6+2\x10\xc6+2\ +\x11\x12\x01\x179\x113\x11310\x01\x14\x07\x17\x07\ +'\x06#\x22'\x07'7&547'7\x176\ +32\x177\x17\x07\x16\x012654&#\x22\x06\ +\x15\x14\x16\x03\xdfZ\x8b;\x89n\x96\x99k\x8a;\x8b\ +ZZ\x8b;\x8ag\x9d\x9bi\x89;\x8bZ\xfei\x86\ +\xbd\xbe\x85\x86\xbe\xbd\x02\xd3\x97i\x8d<\x8e]]\x8e\ +<\x8dj\x96\x93o\x8d<\x8e]]\x8e<\x8do\xfe\ +%\xbf\x89\x88\xc2\xc2\x88\x88\xc0\x00\x01\x00+\x00\x00\x04\ +d\x05\xb6\x00\x16\x00c@:\x00\x07\x10\x03\x0b\x0b\x0c\ +\x02\x05\x09\x0c\x0e\x12\x15\x07\x18\x17\x06\x12\x13\x12OY\ +\x00\x03\x0f\x13\x1f\x13\x02\x09\x03\x13\x13\x0c\x15\x0a\x0e\x0f\ +\x0eOY\x07\x7f\x0f\x8f\x0f\x9f\x0f\x03\x0f\x0f\x0c\x01\x15\ +\x06\x0c\x18\x00??3\x129/]3+\x11\x003\ +\x11\x129\x18/_^]33+\x11\x003\x11\x12\ +\x01\x179\x113\x12\x17910\x01\x013\x01!\x15\ +!\x15!\x15!\x11#\x11!5!5!5!\x01\ +3\x02J\x01\xacn\xfeP\x01\x1b\xfe\xae\x01R\xfe\xae\ +i\xfe\xaf\x01Q\xfe\xaf\x01\x16\xfeRu\x02\x9a\x03\x1c\ +\xfc\xecR\xcdR\xfe\xcf\x011R\xcdR\x03\x14\x00\x00\ +\x02\x01\xfc\xfe\x06\x02X\x06\x19\x00\x03\x00\x07\x00(@\ +\x12\x03\x02\x05\x05\x04\x04\x09\x08\x03\x03\x07\x04\x04\x07\x00\ +\x00\x07\x1c\x00??\x119/\x119/\x11\x12\x019\ +\x113\x129910\x013\x11#\x113\x11#\x01\ +\xfc\x5c\x5c\x5c\x5c\x06\x19\xfd\x04\xfd\xe5\xfd\x04\x00\x02\x00\ +\x81\xff\xfc\x03\x87\x06\x19\x000\x00>\x00P@-5\ +\x1b*\x1e8\x19<\x03\x12\x061\x00\x00\x03\x06\x0b\x19\ +\x1b\x1e%\x08@?<\x03\x15\x035\x1b-\x03!\x09\ +\x09\x0fIY\x09\x00!'IY!\x15\x00?+\x00\ +\x18?+\x11\x12\x00\x179\x179\x11\x12\x01\x179\x11\ +3\x113\x113\x113\x113\x11310\x1346\ +7&&54632\x17\x07&&#\x22\x06\x15\ +\x14\x16\x16\x17\x16\x16\x15\x14\x07\x16\x16\x15\x14\x06#\x22\ +&'5\x1632654&&'&&7\x14\ +\x16\x16\x176654&&'\x06\x06\x91eXV\ +N\xcb\xae\xaf\xa1#[\x87M\x86\x8f3x\x80\xc0\x90\ +\xbaVV\xe2\xc6\x5c\x9eV\xb6\x96\xa2\xaa2\x7f\x7f\xc8\ +\x90e?\x94\xb0RX@\x99\xa0Qc\x03-S\x8b\ +&/nQu\x85@P\x22\x1aYK6E>+\ +@\x89f\xade*lR\x87\x91\x1e%_Nc[\ +7AB.I\x89qANH?)r@>P\ +J2\x17p\x00\x00\x02\x01P\x05\x17\x03L\x05\xc3\x00\ +\x08\x00\x11\x00\x1e@\x0c\x09\x0e\x05\x00\x0e\x00\x13\x12\x0c\ +\x03\x10\x07\x00/3\xcd2\x11\x12\x0199\x113\x11\ +310\x014632\x15\x14#\x22%463\ +2\x15\x14#\x22\x01P\x1f @@?\x01}\x1f \ +@@?\x05m.(VVV.(VV\x00\x00\ +\x03\x00d\xff\xec\x06D\x05\xcb\x00\x15\x00%\x005\x00\ +N@/\x03\x0e.\x1e&\x16\x08\x0e\x13\x16\x1e\x057\ +6\x00\x11\x00\x11\x10\x11\xe0\x11\xf0\x11\x04\x06\x0b\x0f\x0b\ +\x1f\x0b\xef\x0b\xff\x0b\x04\x11\x0b\x11\x0b\x222\x1a\x04*\ +\x22\x13\x00?3?3\x1299//]\x113]\ +\x113\x11\x12\x01\x179\x113\x113\x11310\x01\ +\x22\x06\x15\x14\x16327\x15\x06#\x22&546\ +32\x17\x07&\x014\x12$32\x04\x12\x15\x14\x02\ +\x04#\x22$\x027\x14\x12\x0432$\x1254\x02\ +$#\x22\x04\x02\x03\x81\x8e\xa1\x95\x92Trfj\xbb\ +\xcb\xde\xbawl%b\xfc\x87\xc8\x01^\xca\xc8\x01^\ +\xca\xc2\xfe\xa2\xd0\xcf\xfe\xa2\xc3]\xb1\x010\xb2\xb2\x01\ +/\xb2\xab\xfe\xcd\xb5\xb0\xfe\xcf\xb2\x04D\xbd\xaa\xba\xb2\ ++X-\xe6\xd8\xd0\xf94S-\xfe\x97\xc8\x01^\xca\ +\xc8\xfe\xa2\xca\xc5\xfe\xa6\xd0\xcf\x01Z\xc6\xb2\xfe\xd1\xb2\ +\xb1\x010\xb2\xae\x01.\xb8\xb1\xfe\xcc\x00\x02\x00N\x03\ +!\x02D\x05\xc7\x00\x16\x00!\x007@\x1c\x0a\x01\x1d\ +\x1d\x16\x17\x06\x06\x11\x16\x03#\x22\x1e\x0a\x0a\x13\x1a\x00\ +\x00\x03\x10\x03\x02\x03\x0e\x13\x1f\x00?3\xd4]\xc43\ +\x129/3\x11\x12\x01\x179\x113\x113\x1133\ +10\x01'\x06#\x22&5467754&\ +#\x22\x07'632\x15\x11%\x14\x163265\ +5\x07\x06\x06\x02\x00\x19Tv_p\xa0\xa1_LD\ +Wm!ur\xe4\xfedF=ZiXtz\x03\ +-HTbZdg\x08\x04+MK1I8\xd7\ +\xfe=\xb46>d\x5c@\x05\x06=\x00\x02\x00R\x00\ +}\x03-\x03\xa8\x00\x06\x00\x0d\x00-@\x16\x03\x06\x0a\ +\x0d\x02\x04\x0b\x09\x09\x04\x0d\x06\x04\x0e\x0f\x0c\x05\x08_\ +\x01\x01\x01\x00/]3\xc42\x11\x12\x01\x179\x113\ +\x113\x113\x11310\x13\x01\x17\x03\x13\x07\x01%\ +\x01\x17\x03\x13\x07\x01R\x015>\xfe\xfe>\xfe\xcb\x01\ +h\x016=\xfe\xfe=\xfe\xca\x02\x1f\x01\x89+\xfe\x95\ +\xfe\x96+\x01\x87\x1b\x01\x89+\xfe\x95\xfe\x96+\x01\x87\ +\x00\x00\x01\x00o\x01\x0e\x04\x0e\x02\xfc\x00\x05\x003@\ + \x02\x01\x04\x01\x06\x07\x02\x05\x05\x04RY\x0f\x05/\ +\x05?\x05_\x05\x7f\x05\x8f\x05\xaf\x05\xbf\x05\xdf\x05\x09\ +\x05\x00/]+\x00\x18\x10\xc4\x11\x12\x0199\x113\ +10\x01\x11#\x11!5\x04\x0eR\xfc\xb3\x02\xfc\xfe\ +\x12\x01\x9cR\x00\xff\xff\x00\x5c\x02\x00\x027\x02R\x02\ +\x06\x00\x10\x00\x00\x00\x04\x00d\xff\xec\x06D\x05\xcb\x00\ +\x07\x00\x15\x00%\x005\x00c@6\x0b\x0e\x04\x08\x0d\ +\x0c\x00\x10\x10\x11.\x1e&\x16\x08\x0c\x0e\x11\x16\x1e\x06\ +76\x0b\x0f\x0f\x00\x00\x12\x0d\x11\x0f\x11\x1f\x11\x02\x07\ +\x12\x00\x12\x10\x12\x02\x11\x12\x11\x12\x222\x1a\x04*\x22\ +\x13\x00?3?3\x1299//]\x113]\x11\ +3\x129/3\x113\x11\x12\x01\x179\x113\x113\ +\x113\x113\x113\x113\x11310\x01326\ +54##\x05\x14\x06\x07\x13#\x03#\x11#\x113\ +2\x16\x014\x12$32\x04\x12\x15\x14\x02\x04#\x22\ +$\x027\x14\x12\x0432$\x1254\x02$#\x22\ +\x04\x02\x02\xc5p[h\xc5n\x01\x9bMH\xedy\xd2\ +\xa8e\xd3\x8f\x9e\xfc\x04\xc8\x01^\xca\xc8\x01^\xca\xc2\ +\xfe\xa2\xd0\xcf\xfe\xa2\xc3]\xb1\x010\xb2\xb2\x01/\xb2\ +\xab\xfe\xcd\xb5\xb0\xfe\xcf\xb2\x02\xdb]Y\xac\xa7Oy\ +\x22\xfew\x01h\xfe\x98\x03p|\xfe\xc4\xc8\x01^\xca\ +\xc8\xfe\xa2\xca\xc5\xfe\xa6\xd0\xcf\x01Z\xc6\xb2\xfe\xd1\xb2\ +\xb1\x010\xb2\xae\x01.\xb8\xb1\xfe\xcc\x00\x01\xff\xfa\x06\ +\x14\x04\x06\x06f\x00\x03\x00\x15@\x09\x00\x05\x01\x04\x02\ +\x01SY\x02\x00/+\x11\x013\x11310\x01!\ +5!\x04\x06\xfb\xf4\x04\x0c\x06\x14R\x00\x02\x00\x8b\x03\ +u\x02\xe1\x05\xcb\x00\x0b\x00\x17\x00#@\x10\x12\x06\x0c\ +\x00\x06\x00\x19\x18\x0f?\x09\x01\x09\x15\x03\x04\x00?3\ +\xc4]2\x11\x12\x0199\x113\x11310\x134\ +632\x16\x15\x14\x06#\x22&7\x14\x16326\ +54&#\x22\x06\x8b\xad~~\xad\xad~\x82\xa9Z\ +zWV{xYZw\x04\xa0\x84\xa7\xa7\x84\x84\xa7\ +\xa6\x85[~|]\x5c}\x80\xff\xff\x00o\x00\x01\x04\ +#\x04\xae\x00'\x02+\x00\x00\xfdW\x00\x06\x00\x0e\x00\ +\x00\x00\x01\x005\x02J\x02u\x05\xcb\x00\x17\x00%@\ +\x12\x06\x11\x16\x02\x02\x0c\x11\x17\x04\x19\x18\x09\x0e\x1f\x02\ +\x16\x01 \x00?33?3\x11\x12\x01\x179\x113\ +\x11310\x01!576654&#\x22\x07\ +'632\x16\x15\x14\x0e\x02\x01!\x02u\xfd\xc0\xf2\ +}^]Mlm1w\x97|\x8c\x1a6S\xfe\xf5\ +\x01\xbf\x02JN\xedy\x90MGSRAg\x7fo\ +/TW]\xfe\xfc\x00\x00\x01\x00)\x029\x02\x81\x05\ +\xcb\x00#\x00?@%\x10\x05\x19\x00\x0b\x1f\x14\x03\x00\ +\x05\x06%$\x03\x14\x14O\x15_\x15o\x15\x03\x0b\x15\ +\x1b\x15\x02\x15\x15\x08\x1c!\x1f\x0d\x08!\x00?3?\ +3\x129/]]3\x129\x11\x12\x01\x179\x113\ +\x11310\x01\x14\x06\x07\x16\x15\x14\x06#\x22'5\ +\x1632654&##532654&\ +#\x22\x07'632\x16\x02hXI\xba\xb1\x9f\x90\ +x\x88\x82swww\x83\x87ij^P\x80v/\ +\x82\xa3\x7f\x91\x04\xecNk\x16-\xa6\x82\x8f\ +bWSNTWMCQNF^x\x00\x01\x01\ +\x89\x04\xd9\x03\x08\x06!\x00\x09\x00\x18@\x09\x03\x04\x09\ +\x04\x0b\x0a\x04\x80\x09\x00/\x1a\xcd\x11\x12\x0199\x11\ +310\x016673\x15\x06\x06\x07#\x01\x89I\ +\x8f\x1a\x8d$\xadhF\x04\xe9O\xb90\x114\xacW\ +\x00\x00\x01\x00\xb6\xfe\x14\x04\x0e\x04?\x00\x18\x00?@\ +\x1f\x0c\x07\x07\x0a\x01\x16\x16\x17\x17\x0a\x1a\x19\x13\x18\x0c\ +\x0d\x0d\x0b\x08\x18\x0f\x0b\x15\x17\x1b\x10\x04FY\x10\x16\ +\x00?+\x00\x18???3\x129\x113\x119\x11\ +\x12\x0199\x113\x113\x113\x11310\x01\x11\ +\x14\x163265\x113\x11#'#\x06\x06#\x22\ +&'\x16\x15\x11#\x11\x01\x19\x8a\x90\xc2\xb7bT\x12\ +\x062\xc8uc\x893\x05c\x04?\xfd@\xa4\x95\xc4\ +\xdd\x02X\xfb\xc1\x96M]79\x5cN\xfeb\x06+\ +\x00\x00\x01\x00q\xfe\xfc\x04R\x06\x14\x00\x0f\x00-@\ +\x15\x01\x00\x04\x05\x00\x05\x0b\x03\x11\x10\x01\x05\x08\x08\x0e\ +\x05\x0e\x03JY\x0e\x00/+\x00\x18/\x129/\x11\ +3\x11\x12\x01\x179\x113\x11310\x01#\x11#\ +\x11#\x11\x06#\x22&5\x1063!\x04Rd\xe4\ +d@R\xd8\xcb\xda\xe8\x02\x1f\xfe\xfc\x06\xba\xf9F\x03\ +3\x12\xfa\xfb\x01\x04\xfe\xff\xff\x00\xa2\x02o\x01D\x03\ +3\x00\x07\x00\x11\x00\x00\x02\x83\x00\x01\x00+\xfe\x14\x01\ +\x89\x00\x00\x00\x11\x00'@\x12\x0b\x00\x10\x0d\x00\x06\x0d\ +\x03\x13\x12\x0d\x10\x10\x0f\x08\x03\x1b\x0f\x00/?3\x12\ +9/3\x11\x12\x01\x179\x113\x11310\x01\x14\ +\x06#\x22'5\x1632654'73\x07\x16\ +\x01\x89\x87yD\x1a\x1e>NR\xc1]`B\xa8\xfe\ +\xddde\x0bX\x0a84^\x1b\xaeu%\x00\x01\x00\ +L\x02J\x01\xba\x05\xb6\x00\x09\x00\x1e@\x0d\x02\x00\x03\ +\x09\x03\x0b\x0a\x08\x03 \x06\x00\x1e\x00?2?9\x11\ +\x12\x0199\x113310\x013\x11#\x1147\ +\x06\x07'\x01^\x5cb\x0c\x1a\xcf/\x05\xb6\xfc\x94\x02\ +#c\x86\x17zM\x00\x00\x02\x00F\x03!\x02\x9e\x05\ +\xc7\x00\x0b\x00\x15\x00%@\x12\x10\x00\x0c\x06\x00\x06\x17\ +\x16\x0e\x00\x03\x10\x03\x02\x03\x13\x09\x1f\x00?3\xc4]\ +2\x11\x12\x0199\x113\x11310\x01\x14\x06#\ +\x22&54632\x16\x05\x1032\x114&#\ +\x22\x06\x02\x9e\xa0\x8f\x8f\x9a\x9c\x91\x8e\x9d\xfe\x02\xd1\xd1\ +dmmd\x04u\xa1\xb3\xac\xa8\xa2\xb0\xae\xa4\xfe\xf8\ +\x01\x08\x83\x7f\x7f\x00\x02\x00H\x00}\x03#\x03\xa8\x00\ +\x06\x00\x0d\x00)@\x15\x0b\x09\x04\x02\x00\x03\x07\x02\x0a\ +\x09\x06\x0e\x0f\x08\x01\x01\x0c_\x05\x01\x05\x00/]3\ +\xc4/2\x11\x12\x01\x179\x113\x11310\x01\x01\ +'\x13\x037\x01\x05\x01'\x13\x037\x01\x03#\xfe\xcb\ +>\xfe\xfe>\x015\xfe\x97\xfe\xcb=\xfe\xfe=\x015\ +\x02\x06\xfew+\x01j\x01k+\xfey\x1b\xfew+\ +\x01j\x01k+\xfey\xff\xff\x00;\x00\x00\x05p\x05\ +\xb6\x00&\x00{\xef\x00\x00'\x02\x17\x02?\x00\x00\x01\ +\x07\x02<\x02\xdf\xfd\xb7\x00\x09\xb3\x03\x02\x11\x18\x00?\ +55\x00\xff\xff\x00\x0b\x00\x00\x05{\x05\xb6\x00&\x00\ +{\xbf\x00\x00'\x02\x17\x01\xf4\x00\x00\x01\x07\x00t\x03\ +\x06\xfd\xb7\x00\x07\xb2\x02\x0f\x18\x00?5\x00\xff\xff\x00\ +)\x00\x00\x05\xd7\x05\xcb\x00&\x00u\x00\x00\x00'\x02\ +\x17\x02\xd7\x00\x00\x01\x07\x02<\x03F\xfd\xb7\x00\x09\xb3\ +\x03\x02+\x18\x00?55\x00\x00\x02\x00J\xfeu\x03\ +%\x04T\x00\x1e\x00(\x00?@ #\x1f\x00\x1e\x08\ +\x15\x0f\x15\x1e\x1f\x04*)\x04\x19\x19\x1e\x1e\x12!!\ +&QY!\x10\x12\x0bPY\x12#\x00?+\x00\x18\ +?+\x11\x12\x009\x18/9\x113\x11\x12\x01\x179\ +\x113\x113\x11310\x01\x15\x14\x06\x07\x07\x06\x06\ +\x15\x14\x163277\x17\x06\x06#\x22&546\ +67>\x0255\x03432\x15\x14\x06#\x22&\ +\x029OaZI>\xa4\x8b}l@%o\x95N\ +\xb8\xd1(M\x85@E\x1e/PR/#\x22.\x02\ +\xc7%}\x9fUO=wO|\x98.\x1bO0 \ +\xc6\xaaFl`o5[aa\x0f\x01+bb5\ +..\x00\xff\xff\x00\x00\x00\x00\x04\xcd\x07s\x02&\x00\ +$\x00\x00\x01\x07\x00C\xff\xc8\x01R\x00\x08\xb3\x02\x10\ +\x05&\x00+5\xff\xff\x00\x00\x00\x00\x04\xcd\x07s\x02\ +&\x00$\x00\x00\x01\x07\x00v\x00o\x01R\x00\x08\xb3\ +\x02\x18\x05&\x00+5\xff\xff\x00\x00\x00\x00\x04\xcd\x07\ +s\x02&\x00$\x00\x00\x01\x07\x01K\x00\x1d\x01R\x00\ +\x08\xb3\x02\x1c\x05&\x00+5\xff\xff\x00\x00\x00\x00\x04\ +\xcd\x07\x1b\x02&\x00$\x00\x00\x01\x07\x01R\x00\x04\x01\ +R\x00\x08\xb3\x02\x19\x05&\x00+5\xff\xff\x00\x00\x00\ +\x00\x04\xcd\x07\x15\x02&\x00$\x00\x00\x01\x07\x00j\x00\ +\x1f\x01R\x00\x0a\xb4\x03\x02\x1f\x05&\x00+55\xff\ +\xff\x00\x00\x00\x00\x04\xcd\x07\x1d\x02&\x00$\x00\x00\x01\ +\x07\x01P\x00\x1f\x00\x9a\x00\x09\xb3\x03\x02\x1e\x03\x00?\ +55\x00\x00\x02\xff\xfe\x00\x00\x05\xf8\x05\xb6\x00\x0f\x00\ +\x13\x00m@;\x06\x13\x13\x11\x11\x0a\x0e\x0e\x01\x08\x00\ +\x04\x05\x05\x00\x01\x0c\x10\x12\x05\x15\x14\x0a\x0dJY\x0f\ +\x0a\x01\x0b\x03\x0a\x0a\x01\x06\x10\x03LY\x10\x10\x01\x06\ +\x05\x12\x09\x13\x06\x13JY\x06\x03\x01\x0eJY\x01\x12\ +\x00?+\x00\x18?+\x11\x003\x18?\x11\x129/\ ++\x11\x12\x009\x18/_^]+\x11\x12\x01\x179\ +3\x113\x113\x113\x1299\x113\x11310\ +!!\x11!\x03#\x01!\x15!\x11!\x15!\x11!\ +\x01!\x11#\x05\xf8\xfd3\xfe%\xe3o\x02\x8d\x03m\ +\xfd\x99\x02@\xfd\xc0\x02g\xfb\x81\x01\xb2d\x02\x04\xfd\ +\xfc\x05\xb6^\xfd\xd7^\xfd\x8d\x02\x02\x02\xf8\xff\xff\x00\ +\x81\xfe\x14\x04\xb8\x05\xcb\x02&\x00&\x00\x00\x00\x07\x00\ +z\x02\x06\x00\x00\xff\xff\x00\xcf\x00\x00\x03\xee\x07s\x02\ +&\x00(\x00\x00\x01\x07\x00C\xff\xb1\x01R\x00\x08\xb3\ +\x01\x0d\x05&\x00+5\xff\xff\x00\xcf\x00\x00\x03\xee\x07\ +s\x02&\x00(\x00\x00\x01\x07\x00v\x00F\x01R\x00\ +\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\xcf\x00\x00\x03\ +\xee\x07s\x02&\x00(\x00\x00\x01\x07\x01K\x00\x10\x01\ +R\x00\x08\xb3\x01\x19\x05&\x00+5\xff\xff\x00\xcf\x00\ +\x00\x03\xee\x07\x15\x02&\x00(\x00\x00\x01\x07\x00j\x00\ +\x12\x01R\x00\x0a\xb4\x02\x01\x1c\x05&\x00+55\xff\ +\xff\x004\x00\x00\x02\x14\x07s\x02&\x00,\x00\x00\x01\ +\x07\x00C\xfe\xab\x01R\x00\x08\xb3\x01\x0d\x05&\x00+\ +5\xff\xff\x00Z\x00\x00\x02_\x07s\x02&\x00,\x00\ +\x00\x01\x07\x00v\xffW\x01R\x00\x08\xb3\x01\x15\x05&\ +\x00+5\xff\xff\x00\x15\x00\x00\x02[\x07s\x02&\x00\ +,\x00\x00\x01\x07\x01K\xfe\xea\x01R\x00\x08\xb3\x01\x19\ +\x05&\x00+5\xff\xff\x00:\x00\x00\x026\x07\x15\x02\ +&\x00,\x00\x00\x01\x07\x00j\xfe\xea\x01R\x00\x0a\xb4\ +\x02\x01\x1c\x05&\x00+55\x00\x02\x00/\x00\x00\x05\ +%\x05\xb6\x00\x0c\x00\x18\x00[@6\x0d\x00\x12\x08\x16\ +\x16\x04\x00\x04\x06\x14\x04\x1a\x19\x15\x06\x07\x06JY\x12\ +\x0f\x07?\x07_\x07o\x07\x8f\x07\x9f\x07\xbf\x07\x07\x0b\ +\x03\x07\x07\x04\x09\x09\x11LY\x09\x03\x04\x16LY\x04\ +\x12\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]3+\x11\x003\x11\x12\x01\x179\x113\x1299\ +\x11310\x01\x10\x00!!\x11#53\x11! \ +\x00\x03\x10\x00!!\x11!\x15!\x113 \x05%\xfe\ +~\xfe\x8a\xfe\xa2\xa0\xa0\x01\x8b\x01^\x01mo\xfe\xc1\ +\xfe\xcb\xfe\xf3\x01\x96\xfej\xf2\x02\x8f\x02\xe9\xfe\x90\xfe\ +\x87\x02\xa6^\x02\xb2\xfe\x92\xfe\x9d\x01:\x01=\xfd\xa8\ +^\xfd\xb4\xff\xff\x00\xcf\x00\x00\x04\xf6\x07\x1b\x02&\x00\ +1\x00\x00\x01\x07\x01R\x00u\x01R\x00\x08\xb3\x01\x1a\ +\x05&\x00+5\xff\xff\x00\x81\xff\xec\x05\x9c\x07s\x02\ +&\x002\x00\x00\x01\x07\x00C\x00m\x01R\x00\x08\xb3\ +\x02\x19\x05&\x00+5\xff\xff\x00\x81\xff\xec\x05\x9c\x07\ +s\x02&\x002\x00\x00\x01\x07\x00v\x01%\x01R\x00\ +\x08\xb3\x02!\x05&\x00+5\xff\xff\x00\x81\xff\xec\x05\ +\x9c\x07s\x02&\x002\x00\x00\x01\x07\x01K\x00\xc1\x01\ +R\x00\x08\xb3\x02%\x05&\x00+5\xff\xff\x00\x81\xff\ +\xec\x05\x9c\x07\x1b\x02&\x002\x00\x00\x01\x07\x01R\x00\ +\xa0\x01R\x00\x08\xb3\x02\x22\x05&\x00+5\xff\xff\x00\ +\x81\xff\xec\x05\x9c\x07\x15\x02&\x002\x00\x00\x01\x07\x00\ +j\x00\xc1\x01R\x00\x0a\xb4\x03\x02(\x05&\x00+5\ +5\x00\x01\x00w\x01\x02\x04\x1b\x04\xa4\x00\x0b\x00\x1e@\ +\x11\x00\x02\x04\x06\x08\x0a\x06\x0d\x0c_\x09\x7f\x09\xdf\x09\ +\x03\x09\x00\x19/]\x11\x12\x01\x17910\x01\x01\x17\ +\x01\x01\x07\x01\x01'\x01\x017\x02H\x01\x99:\xfeh\ +\x01\x96:\xfei\xfej9\x01\x95\xfei9\x03\x0c\x01\ +\x98:\xfei\xfeh9\x01\x98\xfeh9\x01\x98\x01\x97\ +:\x00\x03\x00\x81\xff\xec\x05\x9c\x05\xec\x00\x13\x00\x1b\x00\ +#\x00U@1\x16\x17\x1e\x1f\x04\x14\x1c\x14\x00\x1c\x0a\ +\x00\x05\x08\x0a\x0f\x12\x06%$\x17\x1e\x1f\x16\x04!\x19\ +\x0f\x12\x08\x05\x04\x03\x10\x0d\x06\x03\x0d!KY\x0d\x04\ +\x03\x19KY\x03\x13\x00?+\x00\x18?+\x11\x003\ +\x113\x12\x179\x11\x12\x179\x11\x12\x01\x179\x113\ +\x113\x11\x12\x17910\x01\x10\x00!\x22'\x07'\ +7&\x11\x10\x00!2\x177\x17\x07\x16\x03\x10'\x01\ +\x163 \x00\x01\x10\x17\x01&# \x00\x05\x9c\xfe\xa4\ +\xfe\xce\xec\x9fVJZ\xbc\x01_\x010\xe8\xa0lH\ +o\xbfo\x8b\xfd\x1a\x85\xcd\x01\x08\x01\x17\xfb\xc3\x8b\x02\ +\xe3\x85\xc9\xfe\xfb\xfe\xe5\x02\xdd\xfe\xa4\xfekxx;\ +\x7f\xc8\x01q\x01]\x01\x91y\x98<\x99\xcf\xfe\x95\x01\ +;\xab\xfb\xf3j\x01T\x01=\xfe\xc8\xab\x04\x0af\xfe\ +\xac\xff\xff\x00\xbe\xff\xec\x05\x02\x07s\x02&\x008\x00\ +\x00\x01\x07\x00C\x009\x01R\x00\x08\xb3\x01\x13\x05&\ +\x00+5\xff\xff\x00\xbe\xff\xec\x05\x02\x07s\x02&\x00\ +8\x00\x00\x01\x07\x00v\x00\xf0\x01R\x00\x08\xb3\x01\x1b\ +\x05&\x00+5\xff\xff\x00\xbe\xff\xec\x05\x02\x07s\x02\ +&\x008\x00\x00\x01\x07\x01K\x00\x91\x01R\x00\x08\xb3\ +\x01\x1f\x05&\x00+5\xff\xff\x00\xbe\xff\xec\x05\x02\x07\ +\x15\x02&\x008\x00\x00\x01\x07\x00j\x00\x91\x01R\x00\ +\x0a\xb4\x02\x01\x22\x05&\x00+55\xff\xff\x00\x00\x00\ +\x00\x049\x07s\x02&\x00<\x00\x00\x01\x07\x00v\x00\ +)\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\x00\x02\x00\ +\xcf\x00\x00\x04?\x05\xb6\x00\x0b\x00\x14\x00@@!\x10\ +\x00\x0c\x09\x05\x05\x06\x06\x00\x16\x15\x09\x14LY\x09\x09\ +\x06\x07\x0c\x04LY/\x0c\x01\x0c\x0c\x06\x07\x03\x06\x12\ +\x00??\x129/]+\x11\x12\x009\x18/+\x11\ +\x12\x0199\x113\x1133\x11310\x01\x14\x04\ +!#\x11#\x113\x11! \x0132654&\ +##\x04?\xfe\xe0\xfe\xf8\xe2ff\x01\x00\x02\x0a\xfc\ +\xf6\xc9\xf7\xdc\xd0\xda\xf2\x03\x0a\xd4\xe2\xfe\xac\x05\xb6\xfe\ +\xf8\xfc\xfe\xa3\xb7\xa9\xa3\x00\x01\x00\xb6\xff\xec\x04D\x06\ +\x1f\x004\x00A@\x22\x05 &\x00\x1a\x0d-.\x00\ +\x0d .\x14\x0565\x1a&\x102.\x152)H\ +Y2\x00\x10\x17HY\x10\x16\x00?+\x00\x18?+\ +\x00\x18?\x11\x1299\x11\x12\x01\x179\x113\x113\ +\x113\x11310\x01\x14\x07\x06\x06\x15\x14\x16\x16\x17\ +\x1e\x02\x15\x14\x06#\x22&'5\x16\x163265\ +4&'&&54676654&#\x22\ +\x06\x15\x11#\x114632\x16\x03\xc1\x8bQ;\x1d\ +JAj[-\xb0\x9e_\x9f/A\xa7EryN\ +n\x7f`AJJA\x8c\x84\x91\xa2c\xcf\xbd\xbc\xc3\ +\x05\x04\x8bo@I',0B-KckC\x9c\ +\xab%\x1ek&0mjSzKWxV9QEL\x89T\ +y\x97\xfel\xe7\x92\xa5\xc9\xcc\xba\xcf\xf6\x00\xff\xff\x00\ +\xb6\x00\x00\x04\x0e\x05\xc9\x02&\x00Q\x00\x00\x01\x06\x01\ +R\xff\x00\x00\x08\xb3\x01\x1d\x11&\x00+5\xff\xff\x00\ +w\xff\xec\x049\x06!\x02&\x00R\x00\x00\x01\x06\x00\ +C\xc6\x00\x00\x08\xb3\x02\x1a\x11&\x00+5\xff\xff\x00\ +w\xff\xec\x049\x06!\x02&\x00R\x00\x00\x01\x06\x00\ +vj\x00\x00\x08\xb3\x02\x22\x11&\x00+5\xff\xff\x00\ +w\xff\xec\x049\x06!\x02&\x00R\x00\x00\x01\x06\x01\ +K\x0a\x00\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\x00\ +w\xff\xec\x049\x05\xc9\x02&\x00R\x00\x00\x01\x06\x01\ +R\xed\x00\x00\x08\xb3\x02#\x11&\x00+5\xff\xff\x00\ +w\xff\xec\x049\x05\xc3\x02&\x00R\x00\x00\x01\x06\x00\ +j\x0a\x00\x00\x0a\xb4\x03\x02)\x11&\x00+55\x00\ +\x03\x00o\x01\x10\x04#\x04\x96\x00\x03\x00\x0d\x00\x17\x00\ +\x5c@=\x08\x04\x12\x12\x0e\x00\x03\x0e\x03\x19\x18\x15\x10\ +RY\xd0\x15\x01\x00\x15\x10\x15P\x15\x90\x15\x04\x09\x03\ +\x15\x06\x0bRY@\x06\x01\x06\x15\x06\x00\x0f\x01/\x01\ +?\x01_\x01\x7f\x01\x8f\x01\xaf\x01\xbf\x01\xdf\x01\x09\x01\ +\x00/]333/]+\x00\x18/_^]q\ ++\x11\x12\x01\x179\x113\x129910\x135!\ +\x15\x01432\x15\x14\x06#\x22&\x11432\x15\ +\x14\x06#\x22&o\x03\xb4\xfd\xd5PR/#\x22.\ +PR/#\x22.\x02\xaaRR\x01\x89cc4.\ +.\xfdtbb5..\x00\x00\x03\x00w\xff\xdd\x04\ +9\x04h\x00\x13\x00\x1b\x00#\x00U@1\x16\x17\x1e\ +\x1f\x04\x1c\x14\x1c\x00\x14\x0a\x00\x05\x08\x0a\x0f\x12\x06%\ +$\x1f\x16\x17\x1e\x04\x19!\x05\x08\x0f\x12\x04\x03\x10\x0d\ +\x0d\x19FY\x0d\x10\x06\x03\x03!FY\x03\x16\x00?\ ++\x11\x003\x18?+\x11\x003\x12\x179\x11\x12\x17\ +9\x11\x12\x01\x179\x113\x113\x11\x12\x17910\ +\x01\x10\x00#\x22'\x07'7&5\x10\x0032\x17\ +7\x17\x07\x16\x05\x14\x17\x01&#\x22\x06\x054'\x01\ +\x16326\x049\xfe\xfe\xe3\xadvVH]y\x01\ +\x02\xe1\xb3z`Jhp\xfc\xa6N\x02\x1fb\x94\xb4\ +\xc3\x02\xf2H\xfd\xe1^\x90\xb4\xc5\x02!\xfe\xf6\xfe\xd5\ +bq:x\x99\xf9\x01\x0a\x01)h|7\x89\x93\xf4\ +\xc8z\x02\xc1Z\xf7\xe2\xbew\xfdBR\xfb\xff\xff\x00\ +\xaa\xff\xec\x04\x02\x06!\x02&\x00X\x00\x00\x01\x06\x00\ +C\xa7\x00\x00\x08\xb3\x01\x14\x11&\x00+5\xff\xff\x00\ +\xaa\xff\xec\x04\x02\x06!\x02&\x00X\x00\x00\x01\x06\x00\ +vf\x00\x00\x08\xb3\x01\x1c\x11&\x00+5\xff\xff\x00\ +\xaa\xff\xec\x04\x02\x06!\x02&\x00X\x00\x00\x01\x06\x01\ +K\x0e\x00\x00\x08\xb3\x01 \x11&\x00+5\xff\xff\x00\ +\xaa\xff\xec\x04\x02\x05\xc3\x02&\x00X\x00\x00\x01\x06\x00\ +j\x0e\x00\x00\x0a\xb4\x02\x01#\x11&\x00+55\xff\ +\xff\x00\x00\xfe\x14\x03\xac\x06!\x02&\x00\x5c\x00\x00\x01\ +\x06\x00v\xe0\x00\x00\x08\xb3\x01\x22\x11&\x00+5\x00\ +\x02\x00\xb6\xfe\x14\x04L\x06\x14\x00\x14\x00 \x00>@\ +\x1f\x18\x05\x1e\x12\x0f\x0f\x10\x10\x05\x22!\x0a\x00\x08\x02\ +\x11\x00\x10\x1b\x02\x1aFY\x02\x10\x08\x15HY\x08\x16\ +\x00?+\x00\x18?+\x00\x18??\x11\x1299\x11\ +\x12\x0199\x113\x1133\x11310\x0163\ +2\x12\x11\x10\x02#\x22'#\x17\x16\x15\x11#\x113\ +\x11\x07\x01265\x10!\x22\x06\x15\x15\x14\x16\x01\x19\ +r\xfe\xdc\xe7\xf3\xd2\xfbs\x07\x03\x04cc\x07\x01s\ +\xa7\xb7\xfe\xa4\xc1\xad\xab\x03\x96\xbe\xfe\xdf\xfe\xec\xfe\xf4\ +\xfe\xd9\xbcTJX\xfeb\x08\x00\xfey\xf7\xfc\xae\xf8\ +\xdf\x01\xdf\xd2\xf9\x12\xff\xda\x00\xff\xff\x00\x00\xfe\x14\x03\ +\xac\x05\xc3\x02&\x00\x5c\x00\x00\x01\x06\x00j\x86\x00\x00\ +\x0a\xb4\x02\x01)\x11&\x00+55\xff\xff\x00\x00\x00\ +\x00\x04\xcd\x06\x87\x02&\x00$\x00\x00\x01\x07\x01M\x00\ +1\x01R\x00\x08\xb3\x02\x12\x05&\x00+5\xff\xff\x00\ +b\xff\xec\x03\x93\x055\x02&\x00D\x00\x00\x01\x06\x01\ +M\xed\x00\x00\x08\xb3\x02(\x11&\x00+5\xff\xff\x00\ +\x00\x00\x00\x04\xcd\x07!\x02&\x00$\x00\x00\x01\x07\x01\ +N\x00\x1f\x01R\x00\x08\xb3\x02\x0f\x05&\x00+5\xff\ +\xff\x00b\xff\xec\x03\x93\x05\xcf\x02&\x00D\x00\x00\x01\ +\x06\x01N\xde\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\ +\xff\x00\x00\xfeB\x04\xe1\x05\xbc\x02&\x00$\x00\x00\x00\ +\x07\x01Q\x03\x83\x00\x00\x00\x02\x00b\xfeB\x03\xc0\x04\ +R\x00)\x004\x00j@<\x00\x0a\x0f\x1a..'\ +2\x16\x04\x0a\x16!'\x0565\x02\x00\x07@\x07P\ +\x07\x03\x0b\x03\x07\x0e\x0f'#\x1a.IY\x0f\x1a\x1f\ +\x1a\x02\x0b\x03\x1a\x1a#'\x15#\x1eHY#\x10\x13\ +*FY\x13\x16\x00?+\x00\x18?+\x00\x18?\x12\ +9/_^]+\x11\x12\x0099\x18/_^]\ +3\x11\x12\x01\x179\x113\x113\x1133\x1131\ +0\x05\x14327\x15\x06#\x22&54767\ +'#\x06\x06#\x22&54$7754&#\ +\x22\x07'632\x16\x15\x11\x06\x06%2655\ +\x07\x06\x06\x15\x14\x16\x03\x04j1!(@Tc(\ +&Y\x17\x08R\xadv\xa0\xb2\x01\x09\xfb\xcf~\x8c\x97\ +\xa2%\xb3\xaf\xb3\xb1HG\xfe\xb6\xae\xc9\xbe\xe5\xc3}\ +\xf8n\x0cT\x10_WFECG\x9fiW\xa4\x91\ +\x9f\xb0\x05\x06H\x9b\x9eTVT\xba\xc5\xfd-?q\ +\xf6\xc7\xb1k\x08\x0by\x80fq\x00\xff\xff\x00\x81\xff\ +\xec\x04\xb8\x07s\x02&\x00&\x00\x00\x01\x07\x00v\x01\ +\x08\x01R\x00\x08\xb3\x01 \x05&\x00+5\xff\xff\x00\ +w\xff\xec\x03\x85\x06!\x02&\x00F\x00\x00\x01\x06\x00\ +v3\x00\x00\x08\xb3\x01\x1f\x11&\x00+5\xff\xff\x00\ +\x81\xff\xec\x04\xb8\x07s\x02&\x00&\x00\x00\x01\x07\x01\ +K\x00\xae\x01R\x00\x08\xb3\x01$\x05&\x00+5\xff\ +\xff\x00w\xff\xec\x03\x85\x06!\x02&\x00F\x00\x00\x01\ +\x06\x01K\xf7\x00\x00\x08\xb3\x01#\x11&\x00+5\xff\ +\xff\x00\x81\xff\xec\x04\xb8\x07\x1f\x02&\x00&\x00\x00\x01\ +\x07\x01O\x02\x1b\x01R\x00\x08\xb3\x01\x1f\x05&\x00+\ +5\xff\xff\x00w\xff\xec\x03\x85\x05\xcd\x02&\x00F\x00\ +\x00\x01\x07\x01O\x01X\x00\x00\x00\x08\xb3\x01\x1e\x11&\ +\x00+5\xff\xff\x00\x81\xff\xec\x04\xb8\x07s\x02&\x00\ +&\x00\x00\x01\x07\x01L\x00\xaa\x01R\x00\x08\xb3\x01\x1a\ +\x05&\x00+5\xff\xff\x00w\xff\xec\x03\x85\x06!\x02\ +&\x00F\x00\x00\x01\x06\x01L\xf7\x00\x00\x08\xb3\x01\x19\ +\x11&\x00+5\xff\xff\x00\xcf\x00\x00\x05%\x07s\x02\ +&\x00'\x00\x00\x01\x07\x01L\x00P\x01R\x00\x08\xb3\ +\x02\x14\x05&\x00+5\xff\xff\x00w\xff\xec\x05;\x06\ +\x14\x02&\x00G\x00\x00\x00\x07\x028\x02\xd9\x00\x00\xff\ +\xff\x00/\x00\x00\x05%\x05\xb6\x02\x06\x00\x92\x00\x00\x00\ +\x02\x00w\xff\xec\x04\xa8\x06\x14\x00\x1b\x00'\x00b@\ +8\x0a\x0d\x13$\x04\x07\x07\x11\x1f\x19\x08\x0f\x11\x19\x04\ +)(\x14\x04\x16\x00\x10\x08\x09\x08IY\x0d\x09\x09\x00\ +\x0b\x00\x12\x15\x00\x1cFY\x00\x00\x10\x00 \x00\x03\x09\ +\x03\x00\x10\x16!HY\x16\x16\x00?+\x00\x18?_\ +^]+\x00\x18??\x129/3+\x11\x003\x11\ +\x1299\x11\x12\x01\x179\x113\x113\x12\x1791\ +0\x012\x16\x173&55!5!53\x153\ +\x15#\x11#'#\x06#\x22\x02\x11\x10\x12\x17\x22\x06\ +\x15\x10!26554&\x02Dv\xacD\x06\x06\ +\xfe'\x01\xd9b\x9c\x9cA\x19\x08|\xe8\xe1\xee\xec\xe1\ +\xb2\xb3\x01g\xb8\xac\xa9\x04TVh~ykR\xca\ +\xcaR\xfb\x08\xa6\xba\x01\x18\x01\x0c\x01\x1a\x01*Z\xfa\ +\xee\xfe2\xd6\xf6\x11\xfc\xdd\x00\xff\xff\x00\xcf\x00\x00\x03\ +\xee\x06\x87\x02&\x00(\x00\x00\x01\x07\x01M\x00\x1d\x01\ +R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00w\xff\ +\xec\x03\xee\x055\x02&\x00H\x00\x00\x01\x06\x01M\x10\ +\x00\x00\x08\xb3\x02\x1f\x11&\x00+5\xff\xff\x00\xcf\x00\ +\x00\x03\xee\x07!\x02&\x00(\x00\x00\x01\x07\x01N\x00\ +\x0a\x01R\x00\x08\xb3\x01\x0c\x05&\x00+5\xff\xff\x00\ +w\xff\xec\x03\xee\x05\xcf\x02&\x00H\x00\x00\x01\x06\x01\ +N\xfb\x00\x00\x08\xb3\x02\x1c\x11&\x00+5\xff\xff\x00\ +\xcf\x00\x00\x03\xee\x07\x02\x02&\x00(\x00\x00\x01\x07\x01\ +O\x01m\x015\x00\x08\xb3\x01\x14\x05&\x00+5\xff\ +\xff\x00w\xff\xec\x03\xee\x05\xcd\x02&\x00H\x00\x00\x01\ +\x07\x01O\x01N\x00\x00\x00\x08\xb3\x02$\x11&\x00+\ +5\xff\xff\x00\xcf\xfeB\x03\xee\x05\xb6\x02&\x00(\x00\ +\x00\x00\x07\x01Q\x02P\x00\x00\xff\xff\x00w\xfeg\x03\ +\xee\x04T\x02&\x00H\x00\x00\x00\x07\x01Q\x02N\x00\ +%\xff\xff\x00\xcf\x00\x00\x03\xee\x07s\x02&\x00(\x00\ +\x00\x01\x07\x01L\x00\x08\x01R\x00\x08\xb3\x01\x0f\x05&\ +\x00+5\xff\xff\x00w\xff\xec\x03\xee\x06!\x02&\x00\ +H\x00\x00\x01\x06\x01L\xf1\x00\x00\x08\xb3\x02\x1f\x11&\ +\x00+5\xff\xff\x00\x81\xff\xec\x05)\x07s\x02&\x00\ +*\x00\x00\x01\x07\x01K\x00\xd5\x01R\x00\x08\xb3\x01(\ +\x05&\x00+5\xff\xff\x00-\xfe\x14\x04\x06\x06!\x02\ +&\x00J\x00\x00\x01\x06\x01K\xbb\x00\x00\x08\xb3\x03M\ +\x11&\x00+5\xff\xff\x00\x81\xff\xec\x05)\x07!\x02\ +&\x00*\x00\x00\x01\x07\x01N\x00\xd5\x01R\x00\x08\xb3\ +\x01\x1b\x05&\x00+5\xff\xff\x00-\xfe\x14\x04\x06\x05\ +\xcf\x02&\x00J\x00\x00\x01\x06\x01N\xb7\x00\x00\x08\xb3\ +\x03@\x11&\x00+5\xff\xff\x00\x81\xff\xec\x05)\x07\ +\x1f\x02&\x00*\x00\x00\x01\x07\x01O\x02?\x01R\x00\ +\x08\xb3\x01#\x05&\x00+5\xff\xff\x00-\xfe\x14\x04\ +\x06\x05\xcd\x02&\x00J\x00\x00\x01\x07\x01O\x01\x1d\x00\ +\x00\x00\x08\xb3\x03H\x11&\x00+5\xff\xff\x00\x81\xfe\ +;\x05)\x05\xcd\x02&\x00*\x00\x00\x00\x07\x029\x01\ +\x1f\x00\x00\xff\xff\x00-\xfe\x14\x04\x06\x06!\x02&\x00\ +J\x00\x00\x01\x06\x02:?\x00\x00\x08\xb3\x03D\x11&\ +\x00+5\xff\xff\x00\xcf\x00\x00\x04\xf2\x07s\x02&\x00\ ++\x00\x00\x01\x07\x01K\x00\x91\x01R\x00\x08\xb3\x01\x19\ +\x05&\x00+5\xff\xff\x00\xb6\x00\x00\x04\x0e\x07\xaa\x02\ +&\x00K\x00\x00\x01\x07\x01K\x00\x0e\x01\x89\x00\x08\xb3\ +\x01\x22\x02&\x00+5\x00\x02\x00\x00\x00\x00\x05\xc1\x05\ +\xb6\x00\x13\x00\x17\x00`@4\x04\x07\x14\x03\x0b\x0c\x00\ +\x03\x17\x03\x0f\x10\x0c\x0b\x0f\x10\x09\x0b\x10\x12\x04\x19\x18\ +\x0a\x16\x12\x13\x12JY\x07\x03\x13\x13\x10\x01\x17\x0eJ\ +Y/\x17\x01\x17\x17\x10\x05\x01\x03\x0c\x10\x12\x00?3\ +?3\x129/]+\x11\x12\x009\x18/33+\ +\x11\x0033\x11\x12\x01\x179\x113\x113\x11\x12\x17\ +9\x11\x12\x17910\x13\x113\x11!\x113\x113\ +\x15#\x11#\x11!\x11#\x11#5\x01\x11!\x11\xcf\ +f\x03Vg\xcf\xcfg\xfc\xaaf\xcf\x04\x8b\xfc\xaa\x04\ +\xa8\x01\x0e\xfe\xf2\x01\x0e\xfe\xf2^\xfb\xb6\x02\xcf\xfd1\ +\x04J^\xfe\x85\x01\x1d\xfe\xe3\x00\x01\x00\x1b\x00\x00\x04\ +\x0e\x06\x14\x00\x1c\x00Y@2\x0d\x10\x13\x03\x08\x09\x00\ +\x1c\x08\x09\x09\x0b\x12\x1c\x04\x1e\x1d\x16\x15\x15\x09\x19\x13\ +\x0b\x0c\x0bIY\x10\x0c\x0c\x19\x0e\x00\x00\x09\x15\x19\x04\ +FY\x00\x19\x10\x19 \x19\x03\x19\x0f\x00?]+\x00\ +\x18?3?\x129/3+\x11\x003\x11\x129\x11\ +3\x11\x12\x01\x179\x113\x113\x11\x12\x17910\ +!\x114&#\x22\x06\x15\x11#\x11#5353\ +\x15!\x15!\x15\x073663 \x11\x11\x03\xac\x8a\ +\x91\xc5\xb3c\x9b\x9bc\x01\xd9\xfe'\x05\x07=\xba\x8a\ +\x01r\x02\xa2\xa4\x95\xc4\xde\xfd\xc7\x04\xf8R\xca\xcaR\ +\xf2\x8bbX\xfes\xfdX\x00\xff\xff\xff\xe7\x00\x00\x02\ +\xa1\x07\x1b\x02&\x00,\x00\x00\x01\x07\x01R\xfe\xcc\x01\ +R\x00\x08\xb3\x01\x16\x05&\x00+5\xff\xff\xff\x95\x00\ +\x00\x02O\x05\xc9\x02&\x00\xf3\x00\x00\x01\x07\x01R\xfe\ +z\x00\x00\x00\x08\xb3\x01\x0e\x11&\x00+5\xff\xff\x00\ +$\x00\x00\x02O\x06\x87\x02&\x00,\x00\x00\x01\x07\x01\ +M\xfe\xff\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\ +\xff\xff\xd4\x00\x00\x01\xff\x055\x02&\x00\xf3\x00\x00\x01\ +\x07\x01M\xfe\xaf\x00\x00\x00\x08\xb3\x01\x07\x11&\x00+\ +5\xff\xff\x00$\x00\x00\x02M\x07!\x02&\x00,\x00\ +\x00\x01\x07\x01N\xfe\xed\x01R\x00\x08\xb3\x01\x0c\x05&\ +\x00+5\xff\xff\xff\xd4\x00\x00\x01\xfd\x05\xcf\x02&\x00\ +\xf3\x00\x00\x01\x07\x01N\xfe\x9d\x00\x00\x00\x08\xb3\x01\x04\ +\x11&\x00+5\xff\xff\x00Z\xfeB\x02\x14\x05\xb6\x02\ +&\x00,\x00\x00\x00\x06\x01Qf\x00\xff\xff\x00'\xfe\ +B\x01F\x05\xcd\x02&\x00L\x00\x00\x00\x06\x01Q\xe8\ +\x00\xff\xff\x00Z\x00\x00\x02\x14\x07\x1f\x02&\x00,\x00\ +\x00\x01\x07\x01O\x00F\x01R\x00\x08\xb3\x01\x14\x05&\ +\x00+5\x00\x01\x00\xb6\x00\x00\x01\x19\x04?\x00\x03\x00\ +\x16@\x09\x00\x01\x01\x05\x04\x02\x0f\x01\x15\x00??\x11\ +\x12\x019\x11310!#\x113\x01\x19cc\x04\ +?\xff\xff\x00Z\xfe\x8f\x03\xa4\x05\xb6\x00&\x00,\x00\ +\x00\x00\x07\x00-\x02o\x00\x00\xff\xff\x00\xa8\xfe\x14\x02\ +\xf8\x05\xcd\x00&\x00L\x00\x00\x00\x07\x00M\x01\xcf\x00\ +\x00\xff\xff\xffH\xfe\x8f\x02$\x07s\x02&\x00-\x00\ +\x00\x01\x07\x01K\xfe\xb3\x01R\x00\x08\xb3\x01\x19\x05&\ +\x00+5\xff\xff\xff\x9e\xfe\x14\x02\x0c\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01K\xfe\x9b\x00\x00\x00\x08\xb3\x01\x1a\ +\x11&\x00+5\xff\xff\x00\xcf\xfe;\x04\xa6\x05\xb6\x02\ +&\x00.\x00\x00\x00\x07\x029\x00\x81\x00\x00\xff\xff\x00\ +\xb6\xfe;\x03\xdf\x06\x14\x02&\x00N\x00\x00\x00\x06\x02\ +9)\x00\x00\x01\x00\xb6\x00\x00\x03\xdf\x04?\x00\x0d\x00\ +7@\x1d\x05\x04\x01\x02\x0c\x08\x08\x09\x02\x03\x04\x06\x09\ +\x05\x0f\x0e\x03\x06\x0d\x07\x04\x09\x01\x01\x0a\x0f\x05\x09\x15\ +\x00?3?3\x11\x12\x179\x11\x12\x01\x179\x113\ +\x113\x113\x11310\x01\x013\x01\x01#\x01\x07\ +\x11#\x113\x11\x03\x01\x17\x02+x\xfeT\x01\xd1w\ +\xfec\xb2cc\x07\x01\xdd\x02b\xfe0\xfd\x91\x02%\ +\xa2\xfe}\x04?\xfe\xc9\xfe\xd5\xff\xff\x00\xcf\x00\x00\x03\ +\xee\x07s\x02&\x00/\x00\x00\x01\x07\x00v\xffY\x01\ +R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00\x88\x00\ +\x00\x02\x07\x07\xac\x02&\x00O\x00\x00\x01\x07\x00v\xfe\ +\xff\x01\x8b\x00\x08\xb3\x01\x0d\x02&\x00+5\xff\xff\x00\ +\xcf\xfe;\x03\xee\x05\xb6\x02&\x00/\x00\x00\x00\x06\x02\ +9B\x00\xff\xff\x00a\xfe;\x01(\x06\x14\x02&\x00\ +O\x00\x00\x00\x07\x029\xfe\xd6\x00\x00\xff\xff\x00\xcf\x00\ +\x00\x03\xee\x05\xb7\x02&\x00/\x00\x00\x01\x07\x028\x01\ +\x08\xff\xa3\x00\x07\xb2\x01\x09\x03\x00?5\x00\xff\xff\x00\ +\xb6\x00\x00\x02H\x06\x14\x02&\x00O\x00\x00\x00\x06\x02\ +8\xe6\x00\xff\xff\x00\xcf\x00\x00\x03\xee\x05\xb6\x02&\x00\ +/\x00\x00\x00\x07\x01O\x02\x02\xfdk\xff\xff\x00\xb6\x00\ +\x00\x02\x16\x06\x14\x00&\x00O\x00\x00\x00\x07\x01O\x00\ +\xe3\xfd8\x00\x01\x00\x1d\x00\x00\x03\xee\x05\xb6\x00\x0d\x00\ +9@\x1e\x07\x04\x0b\x0b\x00\x00\x03\x09\x0d\x04\x0f\x0e\x01\ +\x04\x07\x0a\x04\x02@\x08\x08\x00\x05\x03\x00\x0bKY\x00\ +\x12\x00?+\x00\x18?\x129/\x1a\xcd\x179\x11\x12\ +\x01\x179\x113\x1299103\x11\x07'7\x11\ +3\x11%\x17\x05\x11!\x15\xcf\x89)\xb2f\x01D/\ +\xfe\x8d\x02\xb9\x02'VJp\x03+\xfd\x15\xcdL\xe6\ +\xfd\xfa`\x00\x01\x00\x08\x00\x00\x01\xdd\x06\x14\x00\x0b\x00\ +=@$\x09\x00\x04\x04\x05\x05\x08\x02\x03\x0d\x0c\x06\x09\ +\x03\x08\x04\x01\x1f\x07\x01?\x07_\x07\xaf\x07\xbf\x07\x04\ +\x07\x07\x05\x0a\x00\x05\x15\x00??\x129/]q\xcd\ +\x179\x11\x12\x01\x179\x113\x129910\x017\ +\x17\x07\x11#\x11\x07'7\x113\x01\x19\x99+\xc4c\ +\x81-\xaec\x031gF\x83\xfd1\x02\x8dVHs\ +\x03\x22\x00\xff\xff\x00\xcf\x00\x00\x04\xf6\x07s\x02&\x00\ +1\x00\x00\x01\x07\x00v\x00\xe1\x01R\x00\x08\xb3\x01\x19\ +\x05&\x00+5\xff\xff\x00\xb6\x00\x00\x04\x0e\x06!\x02\ +&\x00Q\x00\x00\x01\x06\x00v`\x00\x00\x08\xb3\x01\x1c\ +\x11&\x00+5\xff\xff\x00\xcf\xfe;\x04\xf6\x05\xb6\x02\ +&\x001\x00\x00\x00\x07\x029\x00\xcb\x00\x00\xff\xff\x00\ +\xb6\xfe;\x04\x0e\x04T\x02&\x00Q\x00\x00\x00\x06\x02\ +9P\x00\xff\xff\x00\xcf\x00\x00\x04\xf6\x07s\x02&\x00\ +1\x00\x00\x01\x07\x01L\x00\x93\x01R\x00\x08\xb3\x01\x13\ +\x05&\x00+5\xff\xff\x00\xb6\x00\x00\x04\x0e\x06!\x02\ +&\x00Q\x00\x00\x01\x06\x01L\x0e\x00\x00\x08\xb3\x01\x16\ +\x11&\x00+5\xff\xff\x00\x01\x00\x00\x04Z\x05\xb6\x00\ +&\x00QL\x00\x00\x06\x02\x07\xe4\x00\x00\x01\x00\xcf\xfe\ +\x8f\x04\xf6\x05\xb6\x00\x18\x00<@\x1e\x0a\x16\x16\x00\x12\ +\x0f\x0f\x10\x00\x05\x10\x03\x1a\x19\x0c\x14\x10\x17\x11\x03\x00\ +\x0a\x10\x12\x02\x07JY\x02\x22\x00?+\x00\x18?3\ +3?3\x1299\x11\x12\x01\x179\x113\x113\x11\ +3\x11310!\x10!\x22'5\x1632\x115\ +\x01#\x16\x15\x11#\x113\x013&5\x113\x04\xf6\ +\xfe\xaa];NH\xf1\xfc\x9e\x08\x0cbf\x03a\x06\ +\x09c\xfe\x8f\x1bX\x14\x01\x08\x0a\x05\x12\xe8v\xfcL\ +\x05\xb6\xfa\xf0\xb4\xa2\x03\xba\x00\x00\x01\x00\xb6\xfe\x14\x04\ +\x0e\x04T\x00\x1d\x00>@\x1f\x03\x07\x07\x1b\x14\x0f\x0f\ +\x10\x1b\x10\x1f\x1e\x13\x10\x17\x11\x0f\x10\x15\x17\x0bFY\ +\x17\x10\x00\x05FY\x00\x1b\x00?+\x00\x18?+\x00\ +\x18??\x11\x129\x11\x12\x0199\x113\x113\x11\ +3\x11310\x01\x22'5\x16325\x114&\ +#\x22\x06\x15\x11#\x113\x1736632\x16\x15\ +\x11\x14\x06\x03\x1bO9E<\x98\x91\x98\xbd\xadcT\ +\x13\x066\xbap\xc9\xc2}\xfe\x14\x19V\x14\xb0\x03\xa2\ +\xa4\x95\xc7\xdb\xfd\xa8\x04?\x95WS\xc6\xc7\xfcf\x86\ +\x93\xff\xff\x00\x81\xff\xec\x05\x9c\x06\x87\x02&\x002\x00\ +\x00\x01\x07\x01M\x00\xd5\x01R\x00\x08\xb3\x02\x1b\x05&\ +\x00+5\xff\xff\x00w\xff\xec\x049\x055\x02&\x00\ +R\x00\x00\x01\x06\x01M\x1f\x00\x00\x08\xb3\x02\x1c\x11&\ +\x00+5\xff\xff\x00\x81\xff\xec\x05\x9c\x07!\x02&\x00\ +2\x00\x00\x01\x07\x01N\x00\xc3\x01R\x00\x08\xb3\x02\x18\ +\x05&\x00+5\xff\xff\x00w\xff\xec\x049\x05\xcf\x02\ +&\x00R\x00\x00\x01\x06\x01N\x0c\x00\x00\x08\xb3\x02\x19\ +\x11&\x00+5\xff\xff\x00\x81\xff\xec\x05\x9c\x07s\x02\ +&\x002\x00\x00\x01\x07\x01S\x01\x14\x01R\x00\x0a\xb4\ +\x03\x02)\x05&\x00+55\xff\xff\x00w\xff\xec\x04\ +9\x06!\x02&\x00R\x00\x00\x01\x06\x01ST\x00\x00\ +\x0a\xb4\x03\x02*\x11&\x00+55\x00\x02\x00\x81\xff\ +\xf0\x06\xb2\x05\xc7\x00\x14\x00\x1f\x00^@4\x0f\x13\x13\ +\x17\x0d\x00\x1d\x06\x00\x06\x17\x10\x04! \x0f\x12JY\ +\x0f\x0f\x01\x0b\x03\x0f\x0f\x01\x0b\x0b\x0eJY\x0b\x03\x01\ +\x13JY\x01\x12\x09\x1aKY\x09\x04\x03\x15KY\x03\ +\x13\x00?+\x00\x18?+\x00\x18?+\x00\x18?+\ +\x11\x12\x009\x18/_^]+\x11\x12\x01\x179\x11\ +3\x113\x113\x11310!!\x06# \x00\x11\ +\x10\x00!2\x17!\x15!\x11!\x15!\x11!\x052\ +7\x11&# \x00\x11\x10\x00\x06\xb2\xfd\x0cLd\xfe\ +\xcf\xfe\xa4\x01]\x012Ni\x02\xeb\xfdq\x02h\xfd\ +\x98\x02\x8f\xfc\x5cmA>n\xfe\xfa\xfe\xe6\x01\x19\x10\ +\x01\x90\x01_\x01[\x01\x8d\x11^\xfd\xd7^\xfd\x8d\x0e\ +\x12\x04\xf2\x10\xfe\xb1\xfe\xc8\xfe\xc5\xfe\xae\x00\x00\x03\x00\ +w\xff\xec\x07\x1f\x04T\x00 \x00,\x003\x00g@\ +7\x10\x03'0\x17\x17'1\x16!\x0a\x0a\x16\x1d'\ +\x0454\x10\x03\x06\x0d0\x17HY\x0f0\x1f0\x02\ +\x0b\x0300\x06\x0d-*\x0d*FY\x12\x0d\x10\x1a\ +$\x06$FY\x00\x06\x16\x00?3+\x11\x003\x18\ +?3+\x11\x003\x11\x129\x18/_^]+\x11\ +\x12\x0099\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x129910\x05\x22&'\x06\x06#\x22&\x02\ +5\x10\x0032\x16\x17\x12!2\x12\x15\x15!\x16\x16\ +3267\x15\x06\x06\x01\x14\x1632654&\ +#\x22\x06%\x22\x06\x07!4&\x05\x9e\x9c\xdd7;\ +\xc6\x99\x8f\xdat\x01\x02\xe1\x97\xc89n\x01!\xc0\xde\ +\xfd\x06\x02\xc5\xb2]\x8dl\x5c\x9c\xfa\xe3\xc5\xb4\xae\xb6\ +\xba\xac\xb4\xc3\x04\xa2\x9b\xae\x0f\x02\x8d\xa4\x14\x87\x83\x80\ +\x8a\x8a\x01\x02\xa9\x01\x0a\x01)\x8c\x8b\x01\x17\xfe\xf4\xe6\ +P\xe6\xe6\x1a+Z(\x1d\x025\xe0\xfb\xf5\xe6\xe0\xf9\ +\xf7\xf9\xd0\xc2\xbd\xd5\x00\xff\xff\x00\xcf\x00\x00\x04\x93\x07\ +s\x02&\x005\x00\x00\x01\x07\x00v\x00b\x01R\x00\ +\x08\xb3\x02 \x05&\x00+5\xff\xff\x00\xb6\x00\x00\x02\ +\xf6\x06!\x02&\x00U\x00\x00\x01\x06\x00v\xca\x00\x00\ +\x08\xb3\x01\x1a\x11&\x00+5\xff\xff\x00\xcf\xfe;\x04\ +\x93\x05\xb6\x02&\x005\x00\x00\x00\x07\x029\x00\x81\x00\ +\x00\xff\xff\x00m\xfe;\x02\xf6\x04T\x02&\x00U\x00\ +\x00\x00\x07\x029\xfe\xe2\x00\x00\xff\xff\x00\xcf\x00\x00\x04\ +\x93\x07s\x02&\x005\x00\x00\x01\x07\x01L\x00\x0e\x01\ +R\x00\x08\xb3\x02\x1a\x05&\x00+5\xff\xff\x00\xa3\x00\ +\x00\x02\xf6\x06!\x02&\x00U\x00\x00\x01\x07\x01L\xff\ +x\x00\x00\x00\x08\xb3\x01\x14\x11&\x00+5\xff\xff\x00\ +o\xff\xec\x03\xf6\x07s\x02&\x006\x00\x00\x01\x07\x00\ +v\x00?\x01R\x00\x08\xb3\x01.\x05&\x00+5\xff\ +\xff\x00T\xff\xec\x03X\x06!\x02&\x00V\x00\x00\x01\ +\x06\x00v\xd6\x00\x00\x08\xb3\x01-\x11&\x00+5\xff\ +\xff\x00o\xff\xec\x03\xf6\x07s\x02&\x006\x00\x00\x01\ +\x07\x01K\xff\xed\x01R\x00\x08\xb3\x012\x05&\x00+\ +5\xff\xff\x00T\xff\xec\x03X\x06!\x02&\x00V\x00\ +\x00\x01\x06\x01K\x99\x00\x00\x08\xb3\x011\x11&\x00+\ +5\xff\xff\x00o\xfe\x14\x03\xf6\x05\xcb\x02&\x006\x00\ +\x00\x00\x07\x00z\x01F\x00\x00\xff\xff\x00T\xfe\x14\x03\ +X\x04T\x02&\x00V\x00\x00\x00\x07\x00z\x00\xec\x00\ +\x00\xff\xff\x00o\xff\xec\x03\xf6\x07s\x02&\x006\x00\ +\x00\x01\x07\x01L\xff\xea\x01R\x00\x08\xb3\x01(\x05&\ +\x00+5\xff\xff\x00T\xff\xec\x03X\x06!\x02&\x00\ +V\x00\x00\x01\x06\x01L\x86\x00\x00\x08\xb3\x01'\x11&\ +\x00+5\xff\xff\x00\x0a\xfe;\x04'\x05\xb6\x02&\x00\ +7\x00\x00\x00\x06\x029\x08\x00\xff\xff\x00\x19\xfe;\x02\ +y\x05F\x02&\x00W\x00\x00\x00\x07\x029\xff|\x00\ +\x00\xff\xff\x00\x0a\x00\x00\x04'\x07s\x02&\x007\x00\ +\x00\x01\x07\x01L\xff\xcc\x01R\x00\x08\xb3\x01\x0b\x05&\ +\x00+5\xff\xff\x00\x19\xff\xec\x02\xa6\x06\x14\x02&\x00\ +W\x00\x00\x00\x06\x028D\x00\x00\x01\x00\x0a\x00\x00\x04\ +'\x05\xb6\x00\x0f\x00?@!\x09\x00\x04\x04\x05\x02\x05\ +\x07\x0b\x0e\x05\x11\x10\x03\x07\x08\x07JY\x00\x08\x08\x0c\ +\x05\x12\x0f\x0b\x0c\x0bKY\x0c\x03\x00?+\x11\x003\ +\x18?\x129/3+\x11\x003\x11\x12\x01\x179\x11\ +3\x129910\x01!\x15!\x11#\x11!5!\ +\x11!5!\x15!\x02L\x01b\xfe\x9eg\xfe\x9a\x01\ +f\xfe%\x04\x1d\xfe%\x03\x19_\xfdF\x02\xba_\x02\ +=``\x00\x01\x00\x19\xff\xec\x02y\x05F\x00\x1d\x00\ +R@-\x01\x05\x08\x0c\x04\x0f\x0f\x1c\x03\x0a\x0e\x15\x1c\ +\x1d\x06\x1f\x1e\x0f\x1d\x00\x1dHY\x0c\x00\x00\x18\x05\x06\ +\x08@\x02\x0b\x08\x0bHY\x08\x0f\x18\x13HY\x18\x16\ +\x00?+\x00\x18?+\x11\x003\x1a\x18\x10\xcd3\x12\ +9/3+\x11\x003\x11\x12\x01\x179\x113\x12\x17\ +910\x133\x11#5773\x11!\x15!\x11\ +!\x15!\x11\x14\x16327\x15\x06#\x22&5\x11\ +#)\x91\xa1\xa123\x01?\xfe\xc1\x015\xfe\xcbX\ +^^FH^\x90\x89\x91\x02\xb0\x019:-\xf6\xfe\ +\xf9V\xfe\xc7V\xfe\xdf}x\x10P\x18\x9a\xa5\x01/\ +\x00\xff\xff\x00\xbe\xff\xec\x05\x02\x07\x1b\x02&\x008\x00\ +\x00\x01\x07\x01R\x00q\x01R\x00\x08\xb3\x01\x1c\x05&\ +\x00+5\xff\xff\x00\xaa\xff\xec\x04\x02\x05\xc9\x02&\x00\ +X\x00\x00\x01\x06\x01R\xf1\x00\x00\x08\xb3\x01\x1d\x11&\ +\x00+5\xff\xff\x00\xbe\xff\xec\x05\x02\x06\x87\x02&\x00\ +8\x00\x00\x01\x07\x01M\x00\xa6\x01R\x00\x08\xb3\x01\x15\ +\x05&\x00+5\xff\xff\x00\xaa\xff\xec\x04\x02\x055\x02\ +&\x00X\x00\x00\x01\x06\x01M#\x00\x00\x08\xb3\x01\x16\ +\x11&\x00+5\xff\xff\x00\xbe\xff\xec\x05\x02\x07!\x02\ +&\x008\x00\x00\x01\x07\x01N\x00\x93\x01R\x00\x08\xb3\ +\x01\x12\x05&\x00+5\xff\xff\x00\xaa\xff\xec\x04\x02\x05\ +\xcf\x02&\x00X\x00\x00\x01\x06\x01N\x10\x00\x00\x08\xb3\ +\x01\x13\x11&\x00+5\xff\xff\x00\xbe\xff\xec\x05\x02\x07\ +\xd5\x02&\x008\x00\x00\x01\x07\x01P\x00\x93\x01R\x00\ +\x0a\xb4\x02\x01\x15\x05&\x00+55\xff\xff\x00\xaa\xff\ +\xec\x04\x02\x06\x83\x02&\x00X\x00\x00\x01\x06\x01P\x10\ +\x00\x00\x0a\xb4\x02\x01\x16\x11&\x00+55\xff\xff\x00\ +\xbe\xff\xec\x05\x02\x07s\x02&\x008\x00\x00\x01\x07\x01\ +S\x00\xd9\x01R\x00\x0a\xb4\x02\x01#\x05&\x00+5\ +5\xff\xff\x00\xaa\xff\xec\x04\x02\x06!\x02&\x00X\x00\ +\x00\x01\x06\x01SX\x00\x00\x0a\xb4\x02\x01$\x11&\x00\ ++55\xff\xff\x00\xbe\xfeB\x05\x02\x05\xb6\x02&\x00\ +8\x00\x00\x00\x07\x01Q\x02\x17\x00\x00\x00\x01\x00\xaa\xfe\ +B\x04/\x04?\x00#\x00M@*\x0d\x17\x1c\x07\x07\ +\x0a\x01\x22\x0a\x11\x17\x22\x04%$\x0f\x00\x14@\x14P\ +\x14\x03\x0b\x03\x14\x1b\x1c\x1c#\x1b\x0a\x15\x08#\x0f\x1f\ +\x04FY\x1f\x16\x00?+\x00\x18?3?3\x129\ +\x113/_^]3\x11\x12\x01\x179\x113\x113\ +\x113\x11310\x01\x11\x14\x163265\x113\ +\x11\x06\x06\x15\x14327\x15\x06#\x22&547\ +67'#\x06!\x22&5\x11\x01\x0c\x8a\x91\xc2\xb7\ +bHGj1!(@Tc('N\x11\x06j\ +\xfe\xf1\xba\xb9\x04?\xfd@\xa4\x95\xc4\xdd\x02X\xfb\xc1\ +?qHn\x0cT\x10_WFEE<\x92\xaa\xc6\ +\xc7\x02\xc6\xff\xff\x003\x00\x00\x06\xf0\x07s\x02&\x00\ +:\x00\x00\x01\x07\x01K\x01?\x01R\x00\x08\xb3\x01)\ +\x05&\x00+5\xff\xff\x00\x1f\x00\x00\x05\xaa\x06!\x02\ +&\x00Z\x00\x00\x01\x07\x01K\x00\xa0\x00\x00\x00\x08\xb3\ +\x01)\x11&\x00+5\xff\xff\x00\x00\x00\x00\x049\x07\ +s\x02&\x00<\x00\x00\x01\x07\x01K\xff\xd0\x01R\x00\ +\x08\xb3\x01\x16\x05&\x00+5\xff\xff\x00\x00\xfe\x14\x03\ +\xac\x06!\x02&\x00\x5c\x00\x00\x01\x06\x01K\x88\x00\x00\ +\x08\xb3\x01&\x11&\x00+5\xff\xff\x00\x00\x00\x00\x04\ +9\x07\x15\x02&\x00<\x00\x00\x01\x07\x00j\xff\xd0\x01\ +R\x00\x0a\xb4\x02\x01\x19\x05&\x00+55\xff\xff\x00\ +R\x00\x00\x04J\x07s\x02&\x00=\x00\x00\x01\x07\x00\ +v\x00X\x01R\x00\x08\xb3\x01\x13\x05&\x00+5\xff\ +\xff\x00R\x00\x00\x03Z\x06!\x02&\x00]\x00\x00\x01\ +\x06\x00v\xf3\x00\x00\x08\xb3\x01\x13\x11&\x00+5\xff\ +\xff\x00R\x00\x00\x04J\x07\x1f\x02&\x00=\x00\x00\x01\ +\x07\x01O\x01\x5c\x01R\x00\x08\xb3\x01\x12\x05&\x00+\ +5\xff\xff\x00R\x00\x00\x03Z\x05\xcd\x02&\x00]\x00\ +\x00\x01\x07\x01O\x00\xf8\x00\x00\x00\x08\xb3\x01\x12\x11&\ +\x00+5\xff\xff\x00R\x00\x00\x04J\x07s\x02&\x00\ +=\x00\x00\x01\x07\x01L\x00\x0a\x01R\x00\x08\xb3\x01\x0d\ +\x05&\x00+5\xff\xff\x00R\x00\x00\x03Z\x06!\x02\ +&\x00]\x00\x00\x01\x06\x01L\x9b\x00\x00\x08\xb3\x01\x0d\ +\x11&\x00+5\x00\x01\x00\xb6\x00\x00\x02\xa4\x06\x1f\x00\ +\x0d\x00!@\x0f\x07\x00\x00\x01\x01\x0f\x0e\x01\x15\x05\x0a\ +HY\x05\x00\x00?+\x00\x18?\x11\x12\x019\x113\ +\x11310!#\x114632\x17\x07&#\x22\ +\x06\x15\x01\x19c\x95\xa5ZZ\x17POta\x04\x9c\ +\xcb\xb8\x1bV\x19\x89\x9a\x00\x01\x00\xbe\xfe\x14\x03\xf2\x05\ +\xcb\x00\x1e\x00D@$\x0f\x02\x13\x13\x1d\x00\x08\x11\x19\ +\x1d\x05 \x1f\x1e\x12\x0f\x12MY\x02\x0f\x0f\x16\x06\x16\ +\x1bMY\x16\x1b\x06\x0bMY\x06\x07\x00?+\x00\x18\ +?+\x11\x12\x009\x18/3+\x11\x003\x11\x12\x01\ +\x179\x113\x129910\x01575463\ +2\x17\x07&#\x22\x06\x15\x15!\x15!\x11\x14\x06#\ +\x22'5\x16325\x11\x01/\xcf\x99\xa4Re\x19\ +YGsf\x01\x19\xfe\xe7\x8e\x88U7NB\xb0\x03\ +V;%\x92\xc9\xba\x1fV\x1d\x87\x9c\xa2X\xfb\xfc\x9b\ +\xa3\x13Z\x12\xd9\x04\x0e\x00\x04\xff\xf4\x00\x00\x04\xd7\x07\ +\xaa\x00\x12\x00\x19\x00%\x00.\x00}@J(* \ +\x00\x1a\x0d\x0a\x03\x16\x00\x06\x07\x0d\x13\x16\x19*.\x09\ +\x09\x05\x04\x08\x09\x040\x09/.@\x0f\x13H.\x10\ +\x03\x16\x1d\x03\x0a#\x10\x0f\x10\x01\x09\x03\x19\x07JY\ +\x0f\x19\x01\x0a\x0a\x10\x19\x19\x10\x0a\x0a\x04O(_(\ +o(\x03(\x05\x09\x12\x00?3\xc4]\x179//\ +//]+\x00_^]\x113\x11\x173\x18\x10\xc6\ ++\x11\x013\x113\x113\x113\x12\x179\x1133\ +\x113\x113\x11310\x01\x14\x06\x07\x01#\x03!\ +\x03#\x01&&54632\x16\x13\x03&'\x06\ +\x07\x03\x13\x14\x1632654&#\x22\x0676\ +73\x15\x06\x06\x07#\x03DRD\x02)s\xc8\xfd\ +\x97\xd1n\x025DTxabx1\xcf\x18$\x17\ +(\xd1\x87L=>LN<2\x15@\x02\x00\x15\x0c\x1eIY\x0f\x0c\x1f\x0c\x02\ +\x0b\x03\x0c\x0c\x15\x00\x15\x15\x10HY\x15\x10\x05\x1aF\ +Y\x05\x16\x00?+\x00\x18?+\x00\x18?\x129/\ +_^]+\x11\x12\x009\x1a\x18\x10\xde2\xc4_^\ +]2\xc4]\x119/\x11\x12\x01\x179\x113\x113\ +\x1133\x113\x113\x11310!'#\x06\x06\ +#\x22&54$7754&#\x22\x07'6\ +32\x16\x15\x11%2655\x07\x06\x06\x15\x14\x16\ +\x136673\x15\x06\x06\x07#\x01\x14\x06#\x22&\ +54632\x16\x05\x14\x1632654&#\ +\x22\x06\x03J\x19\x08R\xadv\xa0\xb2\x01\x09\xfb\xcf~\ +\x8c\x97\xa2%\xb3\xaf\xb3\xb1\xfe'\xae\xc9\xbe\xe5\xc3}\ +\x8b0k!\x8a#\x9bDD\x01#xaaxx\ +aax\xfe\x9dL>>KN;\x8b)\ +bD\xaeFzclqF\x04\xe9C\xb2Cx\xc0\ +\x10ejr]\x00\x01\x01+\x04\xd9\x03q\x06!\x00\ +\x0c\x00(@\x12\x0b\x00\x07\x05\x03\x02\x09\x00\x05\x09\x03\ +\x0e\x0d\x09\x0b\x07\x80\x03\x00/\x1a\xcd29\x11\x12\x01\ +\x179\x1133\x113\x11310\x01\x06\x07#&\ +'53\x16\x17673\x03q\xaaHbL\xa6F\ +rklqF\x06\x10\xbc{\x80\xb7\x11^qr]\ +\x00\x00\x01\x01%\x04\xe3\x03P\x055\x00\x03\x00\x18@\ +\x0b\x02\x03\x05\x04\x00\x03\x18\x09\x0cH\x03\x00/+3\ +\x11\x12\x019910\x01!\x15!\x01%\x02+\xfd\ +\xd5\x055R\x00\x00\x01\x017\x04\xd9\x03`\x05\xcf\x00\ +\x0b\x00 @\x0d\x09\x0a\x03\x02\x0a\x02\x0d\x0c\x09\x03\x80\ +\x06\x00\x00/2\x1a\xcc2\x11\x12\x0199\x113\x11\ +310\x01\x22'3\x16\x1632673\x06\x02\ +J\xfd\x16R\x0e]XX]\x0fP\x1e\x04\xd9\xf6W\ +KKW\xf6\x00\x00\x01\x00\xb2\x05\x0c\x013\x05\xcd\x00\ +\x09\x00\x13\xb6\x05\x00\x00\x0b\x0a\x02\x08\x00/\xcd\x11\x12\ +\x019\x11310\x13432\x16\x15\x14\x06#\x22\ +\xb2@\x1f\x22\x22\x1f@\x05m`2.-4\x00\x00\ +\x02\x01s\x04\xdb\x03%\x06\x83\x00\x0b\x00\x17\x00 @\ +\x0d\x12\x00\x0c\x06\x06\x00\x19\x18\x15\x09\xc0\x0f\x03\x00/\ +3\x1a\xcc2\x11\x12\x0199\x113\x11310\x01\ +\x14\x06#\x22&54632\x16\x05\x14\x1632\ +654&#\x22\x06\x03%xaaxxaa\ +x\xfe\x9eK>>KN;>K\x05\xb0att\ +a^uv]BKKB@KL\x00\x00\x01\x00\ +?\xfeB\x01^\x00\x00\x00\x10\x00&@\x14\x0d\x0e\x00\ +\x0a\x04\x0a\x0e\x03\x12\x11\x02 \x07`\x07p\x07\x03\x07\ +\x0e\x00//]3\x11\x12\x01\x179\x113\x1131\ +0\x17\x14327\x15\x06#\x22&54673\ +\x06\x06\xa2j1!(@TcPHZHG\xf8\ +n\x0cT\x10_WF\x8a8?q\x00\x01\x01\x1b\x04\ +\xdb\x03\xd5\x05\xc9\x00\x19\x00&@\x10\x16\x17\x09\x0a\x17\ +\x0a\x1b\x1a\x16\x0d\x0a\x06\x0d\x80\x13\x00\x00/2\x1a\xcd\ +2\xc4\x10\xc4\x11\x12\x0199\x113\x11310\x01\ +\x22&'&&#\x22\x06\x07#6632\x16\x17\ +\x16\x1632673\x06\x06\x03\x0c$N> =\ + -<\x12I\x0ajT0P*\x22@\x1d.>\ +\x11L\x10j\x04\xdb%5\x1a(EWo\x7f2\x22\ +\x1c,IStz\x00\x00\x02\x01\x02\x04\xd9\x03\x98\x06\ +!\x00\x08\x00\x11\x00#@\x10\x0c\x0d\x03\x04\x04\x08\x0d\ +\x11\x04\x13\x12\x0c\x04\x80\x11\x08\x00/3\x1a\xcd2\x11\ +\x12\x01\x179\x113\x11310\x016673\x15\ +\x06\x07#%6673\x15\x06\x07#\x01\x02\x1fH\ +U\x88\x87wF\x01R\x1fHU\x88\x87wF\x04\xe9\ +!r\xa5\x11\xcam\x10!r\xa5\x11\xcam\x00\x01\x02\ +\x12\x04\xd9\x02\xec\x06s\x00\x09\x00\x18@\x09\x03\x04\x09\ +\x04\x0b\x0a\x04\x80\x09\x00/\x1a\xcd\x11\x12\x0199\x11\ +310\x016673\x15\x06\x06\x07#\x02\x12\x1d\ +8\x0ew\x12Z4:\x04\xe9K\xdae\x11M\xe4X\ +\x00\x00\x03\x015\x05\x17\x03h\x06\xb4\x00\x08\x00\x10\x00\ +\x18\x001@\x17\x11\x15\x02\x03\x0d\x09\x09\x08\x03\x15\x04\ +\x1a\x19\x13\x0b\x0b\x0f\x08\x08\x03\x80\x17\x0f\x00/3\x1a\ +\xcc9/\x113\x113\x11\x12\x01\x179\x113\x113\ +\x11310\x01673\x15\x06\x06\x07##43\ +2\x15\x14#\x22%432\x15\x14#\x22\x02\x0eK\ +(u\x15g2:\xd9@??@\x01\xb4@??\ +@\x05}\xa4\x93\x124\xbaGVVVVVVV\ +\x00\xff\xff\x00\x00\x00\x00\x04\xcd\x06\x0a\x02&\x00$\x00\ +\x00\x01\x07\x01T\xfe:\xff\x97\x00\x07\xb2\x02\x12\x00\x00\ +?5\x00\xff\xff\x00\xa2\x02o\x01D\x033\x00\x07\x00\ +\x11\x00\x00\x02\x83\xff\xff\xff\xd8\x00\x00\x04H\x06\x0a\x00\ +&\x00(Z\x00\x01\x07\x01T\xfd\xc6\xff\x97\x00\x07\xb2\ +\x01\x10\x00\x00?5\x00\xff\xff\xff\xd8\x00\x00\x05L\x06\ +\x0a\x00&\x00+Z\x00\x01\x07\x01T\xfd\xc6\xff\x97\x00\ +\x07\xb2\x01\x0f\x00\x00?5\x00\xff\xff\xff\xd8\x00\x00\x02\ +\xc6\x06\x0a\x00'\x00,\x00\xb2\x00\x00\x01\x07\x01T\xfd\ +\xc6\xff\x97\x00\x07\xb2\x01\x10\x00\x00?5\x00\xff\xff\xff\ +\xd8\xff\xec\x05\xa8\x06\x0a\x00&\x002\x0c\x00\x01\x07\x01\ +T\xfd\xc6\xff\x97\x00\x07\xb2\x02\x1b\x00\x00?5\x00\xff\ +\xff\xff\xd8\x00\x00\x05)\x06\x0a\x00'\x00<\x00\xf0\x00\ +\x00\x01\x07\x01T\xfd\xc6\xff\x97\x00\x07\xb2\x01\x0c\x00\x00\ +?5\x00\xff\xff\xff\xd8\x00\x00\x05\xf5\x06\x0a\x00&\x01\ +v\x14\x00\x00\x07\x01T\xfd\xc6\xff\x97\xff\xff\xff\xce\xff\ +\xec\x02P\x06\xb4\x02&\x01\x86\x00\x00\x01\x07\x01U\xfe\ +\x99\x00\x00\x00\x0c\xb5\x03\x02\x01&\x11&\x00+55\ +5\xff\xff\x00\x00\x00\x00\x04\xcd\x05\xbc\x02\x06\x00$\x00\ +\x00\xff\xff\x00\xcf\x00\x00\x04\x91\x05\xb6\x02\x06\x00%\x00\ +\x00\x00\x01\x00\xcf\x00\x00\x03\xf0\x05\xb6\x00\x05\x00\x1f@\ +\x0e\x00\x01\x04\x01\x07\x06\x01\x12\x02\x05JY\x02\x03\x00\ +?+\x00\x18?\x11\x12\x0199\x11310!#\ +\x11!\x15!\x015f\x03!\xfdE\x05\xb6^\x00\xff\ +\xff\x00\x14\x00\x00\x04}\x05\xb6\x02\x06\x02(\x00\x00\xff\ +\xff\x00\xcf\x00\x00\x03\xee\x05\xb6\x02\x06\x00(\x00\x00\xff\ +\xff\x00R\x00\x00\x04J\x05\xb6\x02\x06\x00=\x00\x00\xff\ +\xff\x00\xcf\x00\x00\x04\xf2\x05\xb6\x02\x06\x00+\x00\x00\x00\ +\x03\x00\x81\xff\xec\x05\x9c\x05\xcd\x00\x03\x00\x0f\x00\x1b\x00\ +H@*\x16\x04\x10\x0a\x02\x03\x04\x0a\x04\x1d\x1c\x00\x03\ +JY\x0f\x00?\x00_\x00o\x00\x04\x0b\x03\x00\x00\x07\ +\x0d\x0d\x19KY\x0d\x04\x07\x13KY\x07\x13\x00?+\ +\x00\x18?+\x11\x12\x009\x18/_^]+\x11\x12\ +\x01\x179\x113\x11310\x01!\x15!%\x10\x00\ +! \x00\x11\x10\x00! \x00\x01\x10\x00! \x00\x11\ +\x10\x00! \x00\x01\xc1\x02\x99\xfdg\x03\xdb\xfe\xa4\xfe\ +\xce\xfe\xcf\xfe\xa4\x01_\x010\x012\x01Z\xfbT\x01\ +\x18\x01\x06\x01\x08\x01\x17\xfe\xe9\xfe\xfa\xfe\xfb\xfe\xe5\x03\ +\x19_#\xfe\xa4\xfek\x01\x95\x01^\x01]\x01\x91\xfe\ +m\xfe\xa3\xfe\xc6\xfe\xa9\x01T\x01=\x01<\x01Q\xfe\ +\xac\xff\xff\x00Z\x00\x00\x02\x14\x05\xb6\x02\x06\x00,\x00\ +\x00\xff\xff\x00\xcf\x00\x00\x04\xa6\x05\xb6\x02\x06\x00.\x00\ +\x00\x00\x01\x00\x00\x00\x00\x04\xcd\x05\xbc\x00\x0a\x00*@\ +\x14\x03\x02\x08\x05\x04\x00\x01\x01\x04\x08\x03\x0c\x0b\x08\x01\ +\x02\x03\x05\x01\x12\x00?3?\x129\x11\x12\x01\x179\ +\x113\x113\x1133103#\x013\x01#\x01\ +&'\x06\x07qq\x02T1\x02Hs\xfeL\x17%\ +\x1d\x1e\x05\xbc\xfaD\x04`@\x1f\x12\x13\x13\x15\x15\x0f\x22\x03\x07\x1c\x00\ +\x03\x0f\x1c\x04&%\x19\x0b\x0b\x00\x13#\x03\x00\x01\x00\ +HY\x01\x00\x00?+\x11\x003\x18?\x129\x113\ +\x11\x12\x01\x179\x113\x113\x113\x113\x1131\ +0\x135!\x15\x04\x00\x02\x15\x14\x16\x16\x17\x1e\x02\x15\ +\x14\x06\x07#654&&'&&54>\x03\ +7\x06!\xb6\x02\xcd\xff\x00\xfe\xdd\x81:\x84\x84\x99\x7f\ +:2?`r4vj\xd1\xb83\x5c\x85\xaf\xcei\ +\xfe\xfd\x05\xbeVK\xec\xfe\xa9\xfe\xe4\x9bq\x7fO\x1d\ +!:VC<~V\x9bg17,\x14&\xd0\xbc\ +d\xb8\xaf\xaf\xbc\xc4\x07\x00\x01\x00\xb6\xfe\x14\x04\x0e\x04\ +T\x00\x14\x007@\x1b\x0d\x08\x00\x14\x08\x09\x14\x09\x16\ +\x15\x0d\x0c\x0c\x09\x10\x0a\x0f\x09\x15\x00\x1b\x10\x04FY\ +\x10\x10\x00?+\x00\x18???\x11\x129\x113\x11\ +\x12\x0199\x113\x113\x11310\x01\x114&\ +#\x22\x06\x15\x11#\x113\x1736632\x16\x15\ +\x11\x03\xac\x91\x98\xbd\xadcT\x13\x066\xbap\xc9\xc2\ +\xfe\x14\x04\xad\xa4\x95\xc7\xdb\xfd\xa8\x04?\x95WS\xc6\ +\xc7\xfbM\x00\x03\x00w\xff\xec\x04\x19\x06+\x00\x09\x00\ +\x0e\x00\x15\x00I@'\x13\x0c\x0c\x00\x12\x0d\x0d\x05\x05\ +\x00\x17\x16\x12\x0dHY\x0f\x12/\x12\x02\x0b\x03\x12\x12\ +\x03\x08\x08\x0fHY\x08\x01\x03\x0aHY\x03\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/_^]+\x11\ +\x12\x0199\x113\x113\x113\x11310\x01\x10\ +\x02# \x11\x10\x123 \x01 \x13!\x12\x01\x22\x02\ +\x03!\x02\x02\x04\x19\xec\xe9\xfe3\xef\xe4\x01\xcf\xfe-\ +\x01a\x0f\xfd#\x0c\x01_\xb0\xaf\x0c\x02\xdb\x0c\xb6\x03\ +\x0e\xfeq\xfem\x03 \x01\x88\x01\x97\xfa\x19\x02\xb4\xfd\ +L\x05\x8f\xfe\xb7\xfe\xc4\x01H\x01=\x00\x01\x00\xa6\xff\ +\xec\x02P\x04?\x00\x0e\x00\x1f@\x0e\x01\x0d\x0d\x06\x10\ +\x0f\x0e\x0f\x0a\x04HY\x0a\x16\x00?+\x00\x18?\x11\ +\x12\x0199\x11310\x01\x11\x14\x16327\x15\ +\x06\x06#\x22&5\x11\x01\x08]jA@\x14R%\ +\x98\x87\x04?\xfc\xfa\x86o\x10T\x07\x0d\xa0\xa3\x03\x10\ +\x00\xff\xff\x00\xb6\x00\x00\x03\xdf\x04?\x02\x06\x00\xfa\x00\ +\x00\x00\x01\xff\xf4\xff\xec\x04\x06\x06!\x00\x22\x00?@\ + \x1b\x10\x10\x22\x01\x08\x1f\x03\x15\x00\x15$\x00#\x01\ +\x1f\x1f\x0b\x00\x15\x0b\x06IY\x0b\x01\x18\x13IY\x18\ +\x16\x00?+\x00\x18?+\x00\x18?\x129\x113\x11\ +\x013\x113\x11\x12\x17939\x11310#\x01\ +'.\x02#\x22\x075632\x16\x16\x17\x01\x16\x16\ +327\x15\x06#\x22&'\x03\x02'#\x06\x06\x01\ +\x0c\x01\xdd7#2B0,:?3DXD/\ +\x01\x91\x0f$\x1d\x1f\x18\x1e04C\x1a\xac`\x1b\x04\ + Y\xfe\xd9\x04D\xa5kS*\x0cK\x11.k\x84\ +\xfb\x8d++\x0bJ\x10@I\x01\xe9\x01\x18m_\xd6\ +\xfdR\x00\xff\xff\x00\xb6\xfe\x14\x04\x0e\x04?\x02\x06\x00\ +w\x00\x00\x00\x01\xff\xfe\x00\x00\x03\xc7\x04?\x00\x0c\x00\ +(@\x12\x0c\x0b\x04\x01\x00\x07\x08\x04\x08\x0e\x00\x0d\x07\ +\x00\x0f\x04\x0c\x15\x00?3?2\x11\x013\x1299\ +\x113\x113\x113310\x033\x00\x16\x173\x00\ +\x113\x10\x02\x07#\x02f\x01\x228\x15\x06\x01\x8f_\ +\xdc\xeff\x04?\xfc\xf3\x9b?\x01q\x02v\xfe\xa0\xfe\ +\x01\xe0\x00\x00\x01\x00w\xfeo\x03s\x06\x14\x00/\x00\ +\x5c@0!'\x1b\x00\x1e\x0d\x0e\x0e\x10\x10\x0b,\x1e\ +\x04\x17\x00\x0b\x17\x1e$'\x0610\x14\x08\x08\x0e\x1a\ +\x01..\x01IY..%\x0e#'$%$H\ +Y%\x00\x00?+\x11\x003\x18?\x129/+\x11\ +\x12\x009\x119\x113\x11\x12\x01\x179\x113\x113\ +\x113\x113\x113\x11\x129\x12910\x01#\x22\ +\x06\x15\x14\x16\x16\x17\x16\x16\x15\x14\x07#654&\ +&'&&54675&&5467\x06\ +##5!\x15#\x22\x04\x06\x15\x14!3\x03)\x96\ +\xc8\xecA\x84\xa4\xae}q`r5uj\xcf\xba\xa0\ +\x91ys\xaa\xa0E\xb3X\x02\x9e\x10\x9b\xfe\xfa\x8c\x01\ +|\x96\x03\x0c\xc1\x9f]wK#&faw\x97\x9d\ +c2:*\x14&\xc6\xa1\x90\xcf*\x0a$\x8eo\x83\ +\xbf+\x09VO^\xa3f\xfe\xff\xff\x00w\xff\xec\x04\ +9\x04T\x02\x06\x00R\x00\x00\x00\x01\x00\x19\xff\xec\x04\ +\xac\x04?\x00\x15\x007@\x1d\x08\x14\x0b\x0c\x03\x0c\x0e\ +\x12\x14\x05\x17\x16\x0c\x15\x13\x0a\x0e\x10\x0eHY\x10\x0f\ +\x05\x00HY\x05\x16\x00?+\x00\x18?+\x11\x003\ +3\x18?\x11\x12\x01\x179\x113\x11310%2\ +7\x15\x06#\x22&5\x11!\x11#\x11#57!\ +\x15#\x11\x14\x04=*\x1a%-[g\xfd\xebb\xdd\ +\xa5\x03\xee\xddD\x0cT\x10tq\x03\x18\xfc\x17\x03\xe9\ +:\x1cV\xfc\xf6\x9b\x00\x00\x02\x00\xb0\xfe\x14\x045\x04\ +T\x00\x11\x00\x1e\x00;@\x1d\x15\x0a\x1c\x00\x0a\x0b\x0b\ +\x00 \x1f\x16\x19\x07\x03\x0f\x0b\x1b\x0f\x12FY\x0f\x10\ +\x03\x19HY\x03\x16\x00?+\x00\x18?+\x00\x18?\ +\x11\x129\x129\x11\x12\x0199\x113\x113\x113\ +10\x01\x10\x02#\x22&'#\x17\x17\x11#\x11\x10\ +\x1232\x12%\x22\x06\x15\x11\x16\x1632654\ +&\x045\xf9\xf2T\xa7A\x02\x03\x03b\xe4\xdf\xdd\xe5\ +\xfe5\xb3\xa5D\x95a\xc3\xbe\xab\x02#\xfe\xe9\xfe\xe0\ +55^\xbb\xfe\xd7\x04#\x01\x0c\x01\x11\xfe\xe4\xc2\xdd\ +\xea\xfe\x8b==\xeb\xf4\xe8\xef\x00\x01\x00w\xfeo\x03\ +\x85\x04T\x00 \x005@\x1a\x0b\x0c\x0c\x0f\x0f\x07\x00\ +\x16\x07\x16\x1b\x03\x22!\x12\x04\x04\x1f\x0c#\x19\x1fF\ +Y\x19\x10\x00?+\x00\x18?\x129\x113\x11\x12\x01\ +\x179\x113\x113\x113\x11310\x13\x14\x16\x16\ +\x17\x16\x16\x15\x14\x06\x06\x07#6654&'.\ +\x025\x10\x0032\x17\x07&&# \xdfF\x9e\x8b\ +\xa1\x84\x19%3`7;v\x94\x9d\xa9M\x01\x0c\xf6\ +\x8a\x82\x1bE\x86*\xfej\x02\x02\x8d\x90`\x1d\x22h\ +_,SJGJ\x882AF\x1d\x1fz\xc7\x85\x01\ +\x1e\x01:1X\x17\x18\x00\x02\x00w\xff\xec\x04\x81\x04\ +?\x00\x0d\x00\x19\x007@\x1c\x16\x0c\x0c\x06\x14\x00\x0e\ +\x06\x00\x06\x0b\x03\x1b\x1a\x0c\x17\x09\x17HY\x09\x0f\x03\ +\x11FY\x03\x16\x00?+\x00\x18?+\x11\x003\x11\ +\x12\x01\x179\x113\x113\x129\x11310\x01\x14\ +\x02#\x22\x025\x10\x00!!\x15#\x16\x01\x14\x163\ +265\x10'#\x22\x06\x041\xff\xe2\xde\xfb\x01+\ +\x01\x1f\x01\xc0\xfe\xae\xfc\xae\xc2\xb3\xb1\xc4\xb5O\xf6\xf0\ +\x02\x06\xf9\xfe\xdf\x01\x1d\xf9\x01\x1a\x01#V\xc8\xfe\xe1\ +\xd1\xeb\xe8\xca\x01)\xc8\xee\x00\x00\x01\x00\x14\xff\xec\x03\ +P\x04?\x00\x12\x00,@\x17\x03\x0e\x01\x08\x0e\x10\x04\ +\x14\x13\x02\x10\x12\x10HY\x12\x0f\x0b\x06HY\x0b\x16\ +\x00?+\x00\x18?+\x11\x003\x11\x12\x01\x179\x11\ +310\x01\x15!\x11\x14\x16327\x15\x06#\x22\ +&5\x11!57\x03P\xfeRmxKG9o\ +\x99\x9b\xfe\xd7\xa2\x04?V\xfd[\x83\x7f\x14T\x16\xaa\ +\xa1\x02\xb2:\x1c\x00\x01\x00\xa6\xff\xec\x04=\x04?\x00\ +\x15\x00+@\x14\x0f\x10\x10\x0c\x13\x06\x03\x13\x03\x17\x16\ +\x0f\x04\x0f\x00\x09HY\x00\x16\x00?+\x00\x18?3\ +\x11\x12\x0199\x113\x1133\x11310\x05\x22\ +&\x11\x113\x11\x14\x1632\x12\x114&'3\x16\ +\x16\x15\x10\x02\x02Z\xdb\xd9b\xa5\xb5\xbd\xba\x1a!b\ +\x1f\x1e\xf3\x14\xfa\x01\x06\x02S\xfd\xa2\xc9\xd4\x01\x08\x01\ +\x10\x7f\xdc\x88t\xe7\x90\xfe\xc2\xfe\xd6\x00\x02\x00w\xfe\ +\x14\x04\xf6\x04T\x00\x18\x00#\x00J@&\x06\x07\x07\ +\x0a \x0d\x18\x18\x00\x19\x13\x0a\x04\x00\x04\x13\x03%$\ +\x06\x0f\x00\x1b\x10\x1cFY\x10\x10 \x0d\x01\x0dHY\ +\x17\x01\x16\x00?3+\x11\x003\x18?+\x00\x18?\ +?\x11\x12\x01\x179\x113\x113\x113\x1299\x11\ +3\x11310\x01\x11$\x00\x11\x107\x17\x06\x06\x15\ +\x14\x16\x17\x11\x10!2\x12\x15\x14\x02\x06\x07\x11\x014\ +&#\x22\x06\x15\x11>\x02\x02}\xff\x00\xfe\xfa\xc8P\ +fJ\xce\xd0\x01\x1b\xa5\xb9\x84\xf1\xa2\x01\xae\x8bqX\ +Z\x80\xc5i\xfe\x14\x01\xd8\x11\x01!\x01\x0b\x01\x22\xf7\ +8\x8a\xdc{\xdd\xf6\x12\x02\xaa\x01f\xfe\xe7\xf5\xb4\xfe\ +\xf9\x94\x0b\xfe(\x040\xcc\xea\x8b\x7f\xfdT\x0b\x81\xde\ +\x00\x00\x01\xff\xec\xfe\x14\x04\x0a\x04N\x00\x22\x00H@\ +)\x04\x05\x09\x16\x17\x1b\x06\x0f \x06\x07\x07\x0f \x03\ +$\x18\x19#\x17\x1a\x08\x05\x04\x19\x06\x0f\x19\x1b\x00\x1e\ +IY\x00\x10\x12\x0dIY\x12\x1b\x00?+\x00\x18?\ ++\x00\x18??\x12\x179\x11\x0132\x11\x179\x11\ +3\x11\x12\x17910\x132\x1e\x02\x13\x013\x01\x13\ +\x1e\x02327\x15\x06#\x22&&'\x03\x01#\x01\ +\x03&&#\x22\x0756\x8f(8,(\xc5\x01X\ +o\xfej\xc1624$*&%;:QC8\ +\xaa\xfebp\x01\xdd\xe4\x1b4#\x1d%.\x04N\x1d\ +:`\xfe\x0f\x02\x99\xfd\x03\xfe(\x86X&\x09L\x0f\ +1i\x8d\x01\xac\xfd-\x03:\x023C:\x08G\x11\ +\x00\x00\x01\x00\xa6\xfe\x14\x05?\x06\x12\x00\x1a\x00G@\ +$\x07\x08\x08\x0a\x19\x01\x0e\x0f\x04\x0a\x0e\x0f\x16\x13\x0a\ +\x0f\x13\x03\x1c\x1b\x1a\x00\x07\x14\x0f\x0f\x1b\x01\x19\x10\x19\ +FY\x0d\x10\x16\x00?3+\x11\x003\x18??3\ +?\x11\x12\x01\x179\x113\x113\x113\x11\x1299\ +\x113\x11310\x01\x116\x1254&'3\x16\ +\x11\x10\x00\x05\x11#\x11$\x00\x11\x113\x11\x14\x16\x17\ +\x11\x03\x14\xe0\xe7\x17$`?\xfe\xe3\xfe\xf2b\xfe\xff\ +\xfe\xf5b\xdc\xce\x06\x12\xfa8\x11\x01\x05\xea~\xdd\x9a\ +\xe2\xfe\xf7\xfe\xea\xfe\xc1\x11\xfe&\x01\xda\x0c\x01\x1f\x01\ +\x0c\x02\x1a\xfd\xe4\xdd\xef\x0d\x05\xc8\x00\x00\x01\x00w\xff\ +\xec\x05h\x04?\x00)\x00O@'\x04\x1a\x1a\x17#\ +$$'\x0e\x0d\x0d\x0a '\x11\x0a\x0a\x17'\x03+\ +*\x04\x0d\x18\x18\x07#\x0d\x0f\x1d\x14\x07\x14FY\x00\ +\x07\x16\x00?3+\x11\x003\x18?3\x129/\x11\ +9\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +\x113\x113\x12910\x05\x22&'#\x06\x06#\ +\x22\x02\x114\x1273\x06\x02\x15\x14\x163265\ +\x113\x11\x14\x1632654\x02'3\x16\x12\x15\ +\x10\x02\x04\x0aq\x80#\x0a'\x83i\xa8\xba:Af\ +B7\x86|krcun|\x807Bg?;\ +\xb6\x14g_g_\x01\x18\x01\x06\xa1\x01\x0c\x88\x9a\xfe\ +\xf7\x96\xdb\xe5\x95\x8d\x01D\xfe\xbc\x88\x9a\xe8\xd8\x99\x01\ +\x05\x9b\x84\xfe\xf3\xa4\xfe\xfe\xfe\xe4\x00\xff\xff\x00\x03\xff\ +\xec\x02P\x05\xc3\x02&\x01\x86\x00\x00\x01\x07\x00j\xfe\ +\xb3\x00\x00\x00\x0a\xb4\x02\x01\x1f\x11&\x00+55\xff\ +\xff\x00\xa6\xff\xec\x04=\x05\xc3\x02&\x01\x92\x00\x00\x01\ +\x06\x00j\x0a\x00\x00\x0a\xb4\x02\x01&\x11&\x00+5\ +5\xff\xff\x00w\xff\xec\x049\x06s\x02&\x00R\x00\ +\x00\x01\x06\x01T\x17\x00\x00\x08\xb3\x02\x22\x11&\x00+\ +5\xff\xff\x00\xa6\xff\xec\x04=\x06s\x02&\x01\x92\x00\ +\x00\x01\x06\x01T\x17\x00\x00\x08\xb3\x01\x1f\x11&\x00+\ +5\xff\xff\x00w\xff\xec\x05h\x06s\x02&\x01\x96\x00\ +\x00\x01\x07\x01T\x00\xa2\x00\x00\x00\x08\xb3\x013\x11&\ +\x00+5\xff\xff\x00\xcf\x00\x00\x03\xee\x07\x15\x02&\x00\ +(\x00\x00\x01\x07\x00j\x00\x12\x01R\x00\x0a\xb4\x02\x01\ +\x1c\x05&\x00+55\x00\x01\x00\x0a\xff\xec\x04\xec\x05\ +\xb6\x00\x1d\x00D@%\x08\x1b\x16\x0e\x0e\x0f\x03\x0f\x11\ +\x14\x1b\x05\x1f\x1e\x16\x0dJY\x16\x16\x12\x0f\x12\x15\x11\ +\x12\x11KY\x12\x03\x00\x05KY\x00\x13\x00?+\x00\ +\x18?+\x11\x003\x18?\x129/+\x11\x12\x01\x17\ +9\x113\x113\x11310\x05\x22'5\x1632\ +6554&#!\x11#\x11!5!\x15!\x11\ +!2\x16\x15\x15\x14\x06\x03\xa0^0:Tmv\x8b\ +\x9e\xfegg\xfe\xb0\x03\xbb\xfd\xfc\x01\xb6\xbe\xb7\xac\x14\ +\x12d\x12\x8f\x85\xa0\x92z\xfc\xf0\x05V``\xfe\x19\ +\xb0\xb7\xa0\xb7\xc5\xff\xff\x00\xcf\x00\x00\x03\xf0\x07s\x02\ +&\x01a\x00\x00\x01\x07\x00v\x00Z\x01R\x00\x08\xb3\ +\x01\x0f\x05&\x00+5\x00\x01\x00\x81\xff\xec\x04\xb8\x05\ +\xcb\x00\x19\x00B@$\x03\x06\x06\x11\x04\x0b\x11\x17\x04\ +\x1b\x1a\x03\x06JY\x0f\x03\x01\x0b\x03\x03\x03\x0e\x15\x15\ +\x00LY\x15\x04\x0e\x09JY\x0e\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]+\x11\x12\x01\x17\ +9\x113\x11310\x01 \x00\x03!\x15!\x12\x00\ +!27\x15\x06# \x00\x114\x12$32\x17\x07\ +&\x03?\xff\x00\xfe\xc7\x14\x03\x08\xfc\xf4\x06\x01,\x01\ +\x0f\xb8\x9a\x91\xd9\xfe\xcc\xfe\x9e\xa9\x01=\xd2\xd6\xa9)\ +\xa0\x05o\xfe\xce\xfe\xf0^\xfe\xc9\xfe\xb2/Z3\x01\ +\x8e\x01e\xdf\x01T\xb9P\x5cP\x00\xff\xff\x00o\xff\ +\xec\x03\xf6\x05\xcb\x02\x06\x006\x00\x00\xff\xff\x00Z\x00\ +\x00\x02\x14\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00:\x00\ +\x00\x026\x07\x15\x02&\x00,\x00\x00\x01\x07\x00j\xfe\ +\xea\x01R\x00\x0a\xb4\x02\x01\x1c\x05&\x00+55\xff\ +\xff\xffH\xfe\x8f\x015\x05\xb6\x02\x06\x00-\x00\x00\x00\ +\x02\x00\x00\xff\xe9\x06\xe1\x05\xb6\x00\x1a\x00#\x00O@\ +*\x1f\x00\x17\x1b\x1b\x04\x06\x15\x00\x04\x15\x03%\x0e\x0e\ +$\x17#LY\x17\x17\x04\x15\x04\x1bLY\x04\x12\x15\ +\x06KY\x15\x03\x0b\x10JY\x0b\x13\x00?+\x00\x18\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x013\ +\x11\x12\x179\x113\x113\x113\x11310\x01\x14\ +\x06#!\x11!\x0a\x02\x06#\x22'5\x16326\ +\x12\x12\x13!\x1132\x16\x0132654&#\ +#\x06\xe1\xfc\xe5\xfe\xc5\xfenGRMvb>7\ +=0DND\x5c>\x02N\xc3\xfa\xf9\xfdJ\xbe\xca\ +\xc0\xbc\xdc\xb0\x01\xa8\xcd\xdb\x05V\xfe\x05\xfd\xff\xfe\xfe\ +o\x19\x5c\x16f\x01\x0b\x023\x01\xca\xfd{\xbc\xfd\xe5\ +\xa1\xad\xa1\x8e\x00\x00\x02\x00\xcf\x00\x00\x07#\x05\xb6\x00\ +\x12\x00\x1b\x00V@/\x17\x04\x00\x13\x13\x08\x0f\x0b\x0b\ +\x0c\x04\x08\x0c\x03\x1d\x1c\x1b\x0a\x0f\x0aJY\x00\xc0\x0f\ +\xd0\x0f\x02\x0f\x0f\x01\x0b\x03\x0f\x0f\x08\x11\x0d\x03\x0c\x12\ +\x08\x13LY\x08\x12\x00?+\x00\x18??3\x129\ +/_^]]3+\x11\x003\x11\x12\x01\x179\x11\ +3\x113\x113\x113\x11310\x0132\x16\x15\ +\x14\x06#!\x11!\x11#\x113\x11!\x113\x113\ +2654&##\x04m\xc2\xf9\xfb\xfc\xe5\xfe\xc4\ +\xfd/ff\x02\xd1g\xbe\xc9\xc0\xbc\xdb\xb0\x031\xbc\ +\xcd\xcc\xdc\x02\xd3\xfd-\x05\xb6\xfd{\x02\x85\xfa\xa4\x9f\ +\xaf\xa1\x8e\x00\x01\x00\x0a\x00\x00\x04\xec\x05\xb6\x00\x13\x00\ +;@\x1f\x06\x05\x00\x0c\x0c\x0d\x05\x0d\x0f\x12\x04\x15\x14\ +\x00\x0bJY\x00\x00\x10\x06\x0d\x12\x13\x0f\x10\x0fKY\ +\x10\x03\x00?+\x11\x003\x18?3\x129/+\x11\ +\x12\x01\x179\x113\x113\x11310\x01!2\x16\ +\x15\x11#\x114&#!\x11#\x11!5!\x15!\ +\x01\xc1\x01\xc2\xbd\xacix\x96\xfeLg\xfe\xb0\x03\xd5\ +\xfd\xe2\x03o\xaa\xbd\xfd\xf8\x02\x0e\x91q\xfc\xf0\x05V\ +``\x00\xff\xff\x00\xcf\x00\x00\x04\x93\x07s\x02&\x01\ +\xb4\x00\x00\x01\x07\x00v\x00\xa0\x01R\x00\x08\xb3\x01\x14\ +\x05&\x00+5\xff\xff\x00\x0a\xff\xec\x04\xb4\x07D\x02\ +&\x01\xbd\x00\x00\x01\x07\x026\x00!\x01R\x00\x08\xb3\ +\x01\x18\x05&\x00+5\x00\x01\x00\xcf\xfe\x8f\x04\xe7\x05\ +\xb6\x00\x0b\x000@\x18\x02\x03\x09\x00\x08\x05\x00\x03\x05\ +\x03\x0d\x0c\x0a\x06\x03\x03\x22\x05\x08KY\x01\x05\x12\x00\ +?3+\x00\x18??3\x11\x12\x01\x179\x113\x11\ +3\x11310!!\x11#\x11!\x113\x11!\x11\ +3\x04\xe7\xfe%b\xfe%f\x03Lf\xfe\x8f\x01q\ +\x05\xb6\xfa\xaa\x05V\x00\xff\xff\x00\x00\x00\x00\x04\xcd\x05\ +\xbc\x02\x06\x00$\x00\x00\x00\x02\x00\xcf\x00\x00\x04R\x05\ +\xb6\x00\x0c\x00\x15\x00K@*\x11\x03\x0c\x0d\x0d\x07\x03\ +\x07\x0a\x03\x17\x16\x0c\x15LY\xc0\x0c\xd0\x0c\x02\x0f\x0c\ +\x01\x0b\x03\x0c\x0c\x07\x08\x08\x0bKY\x08\x03\x07\x0dL\ +Y\x07\x12\x00?+\x00\x18?+\x11\x12\x009\x18/\ +_^]]+\x11\x12\x01\x179\x113\x113\x113\ +10\x012\x16\x15\x14\x06#!\x11!\x15!\x11\x11\ +!2654&#!\x02Z\xfc\xfc\xf9\xe8\xfe^\ +\x035\xfd1\x01+\xc5\xbe\xc0\xd7\xfe\xe9\x031\xbf\xce\ +\xca\xda\x05\xb6`\xfd\xdb\xfd)\x9f\xab\xa5\x8e\xff\xff\x00\ +\xcf\x00\x00\x04\x91\x05\xb6\x02\x06\x00%\x00\x00\xff\xff\x00\ +\xcf\x00\x00\x03\xf0\x05\xb6\x02\x06\x01a\x00\x00\x00\x02\x00\ +\x0e\xfe\x8f\x04\xfc\x05\xb6\x00\x0d\x00\x13\x00E@$\x10\ +\x0a\x0e\x0c\x01\x00\x13\x07\x04\x05\x00\x05\x07\x0a\x0c\x05\x15\ +\x14\x01\x05\x22\x0a\x10KY\x0a\x03\x0c\x13\x06\x03\x06K\ +Y\x03\x12\x00?+\x11\x0033\x18?+\x00\x18?\ +3\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +10\x01#\x11!\x11#\x113\x12\x12\x13!\x113\ +#\x11!\x02\x02\x07\x04\xfcb\xfb\xd7ci\x94\xe0\x0d\ +\x02n\x96\xfe\xfeR\x18\xcc\x83\xfe\x8f\x01q\xfe\x8f\x01\ +\xd1\x01\x01\x03\x17\x01>\xfa\xaa\x04\xf6\xfe\xc5\xfd(\xe3\ +\x00\xff\xff\x00\xcf\x00\x00\x03\xee\x05\xb6\x02\x06\x00(\x00\ +\x00\x00\x01\x00\x00\x00\x00\x06=\x05\xb6\x00\x11\x00L@\ +(\x09\x00\x05\x04\x0d\x0d\x0e\x07\x08\x02\x01\x0b\x0a\x10\x11\ +\x01\x08\x0a\x0e\x11\x05\x13\x12\x09\x0c\x03\x06\x0f\x05\x00\x00\ +\x11\x07\x04\x01\x03\x0e\x0b\x11\x12\x00?33?33\ +\x129\x11\x173\x11\x12\x01\x179\x113\x113\x113\ +\x113\x113\x12993210\x01\x013\x01\x11\ +3\x11\x013\x01\x01#\x01\x11#\x11\x01#\x02q\xfd\ +\xb0\x7f\x02Lf\x02L\x7f\xfd\xae\x02r\x87\xfd\x9cf\ +\xfd\x9b\x87\x02\xe9\x02\xcd\xfd<\x02\xc4\xfd<\x02\xc4\xfd\ +:\xfd\x10\x02\xe5\xfd\x1b\x02\xe5\xfd\x1b\x00\x01\x00R\xff\ +\xec\x04\x06\x05\xcb\x00%\x00N@*\x02\x15\x1a\x00\x11\ +\x05\x00\x05\x0a\x15!\x05'&\x02\x15\x16\x16\x15KY\ +\x0f\x16\x01\x0b\x03\x16\x16\x08##\x1dJY#\x04\x08\ +\x0eJY\x08\x13\x00?+\x00\x18?+\x11\x12\x009\ +\x18/_^]+\x11\x12\x009\x11\x12\x01\x179\x11\ +3\x113\x12910\x01\x10\x05\x15\x04\x11\x14\x04!\ +\x22'5\x16\x1632654&##532\ +654&#\x22\x06\x07'6!2\x16\x03\xe9\xfe\ +\xd1\x01L\xfe\xe5\xfe\xfe\xf2\xa5_\xd8`\xc8\xe7\xe1\xe0\ +\xd9\xe1\xd4\xca\xb9\x95o\xbal:\xca\x01\x05\xcd\xed\x04\ +`\xfe\xe2B\x06G\xfe\xe3\xc9\xe1Vh.2\xad\x9c\ +\x98\x9c`\xa0\x93}\x96?MP\x9a\xc4\x00\x00\x01\x00\ +\xcf\x00\x00\x04\xf6\x05\xb6\x00\x0f\x00.@\x15\x06\x09\x0e\ +\x01\x09\x08\x01\x0f\x0f\x08\x11\x10\x0d\x04\x0f\x06\x00\x03\x09\ +\x0f\x12\x00?3?2\x1199\x11\x12\x0199\x11\ +3\x113\x113\x11310\x133\x11\x14\x073\x01\ +3\x11#\x1147#\x01#\xcfb\x08\x06\x03`g\ +c\x0d\x08\xfc\x9df\x05\xb6\xfcDf\xf0\x05\x12\xfaJ\ +\x03\xb6\xa2\xbc\xfa\xec\x00\xff\xff\x00\xcf\x00\x00\x04\xf6\x07\ +D\x02&\x01\xb2\x00\x00\x01\x07\x026\x00\x93\x01R\x00\ +\x08\xb3\x01\x10\x05&\x00+5\x00\x01\x00\xcf\x00\x00\x04\ +\x93\x05\xb6\x00\x0a\x006@\x1a\x08\x09\x01\x00\x0a\x07\x03\ +\x03\x04\x00\x04\x09\x03\x0c\x0b\x02\x07\x0a\x0a\x04\x08\x05\x03\ +\x01\x04\x12\x00?3?3\x129\x1133\x11\x12\x01\ +\x179\x113\x1133\x113\x11310!#\x01\ +\x11#\x113\x11\x013\x01\x04\x93\x8b\xfd-ff\x02\ +\xbf\x87\xfd=\x02\xe9\xfd\x17\x05\xb6\xfd<\x02\xc4\xfd<\ +\x00\x00\x01\x00\x00\xff\xe9\x04\xa4\x05\xb6\x00\x13\x00/@\ +\x18\x01\x00\x03\x12\x00\x0b\x12\x03\x15\x14\x01\x12\x12\x03K\ +Y\x12\x03\x09\x0eJY\x09\x13\x00?+\x00\x18?+\ +\x00\x18?\x11\x12\x01\x179\x113\x11310!#\ +\x11!\x0a\x02\x06\x06#\x22'5\x16326\x12\x13\ +!\x04\xa4g\xfd\xee)\x5c?EbKC2=4\ +Was9\x02\xcf\x05V\xfe\xad\xfd\xa0\xfe\xfe};\ +\x19\x5c\x16\xd8\x02\xcc\x01\xca\x00\xff\xff\x00\xcf\x00\x00\x06\ +\x19\x05\xb6\x02\x06\x000\x00\x00\xff\xff\x00\xcf\x00\x00\x04\ +\xf2\x05\xb6\x02\x06\x00+\x00\x00\xff\xff\x00\x81\xff\xec\x05\ +\x9c\x05\xcd\x02\x06\x002\x00\x00\xff\xff\x00\xcf\x00\x00\x04\ +\xe7\x05\xb6\x02\x06\x01n\x00\x00\xff\xff\x00\xcf\x00\x00\x04\ +?\x05\xb6\x02\x06\x003\x00\x00\xff\xff\x00\x81\xff\xec\x04\ +\xb8\x05\xcb\x02\x06\x00&\x00\x00\xff\xff\x00\x0a\x00\x00\x04\ +'\x05\xb6\x02\x06\x007\x00\x00\x00\x01\x00\x0a\xff\xec\x04\ +\xb4\x05\xb6\x00\x17\x009@\x1c\x13\x09\x0f\x0f\x0a\x11\x12\ +\x0b\x0a\x03\x0a\x12\x03\x19\x18\x09\x0f\x0f\x00\x11\x0a\x03\x00\ +\x05KY\x00\x13\x00?+\x00\x18?3\x129\x113\ +\x11\x12\x01\x179\x113\x113\x129\x113310\ +\x05\x22'5\x1632667\x013\x01\x16\x173\ +7\x013\x01\x0e\x03\x01\x14wIV`HgX?\ +\xfd\xbay\x01\xbf#\x1c\x04\x19\x01\xa4r\xfe+-R\ +d\x86\x14\x1eg%1m\x80\x04L\xfc\xaaEJ=\ +\x03\xa8\xfb\xfcc\xa7xD\x00\xff\xff\x00o\xff\xec\x05\ +\xaa\x05\xcb\x02\x06\x01s\x00\x00\xff\xff\x00\x00\x00\x00\x04\ +N\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x00\xcf\xfe\x8f\x05\ +\x83\x05\xb6\x00\x0b\x002@\x19\x04\x01\x09\x00\x08\x05\x00\ +\x01\x05\x03\x0d\x0c\x0a\x06\x03\x03\x22\x00\x08\x05\x08KY\ +\x05\x12\x00?+\x11\x003\x18??3\x11\x12\x01\x17\ +9\x113\x113\x11310%3\x11#\x11!\x11\ +3\x11!\x113\x04\xe7\x9cb\xfb\xaef\x03Lf`\ +\xfe/\x01q\x05\xb6\xfa\xaa\x05V\x00\x00\x01\x00\xb6\x00\ +\x00\x04\x8d\x05\xb6\x00\x11\x008@\x1b\x02\x10\x10\x11\x09\ +\x08\x11\x08\x13\x12\x02\x04\x0f\x0c\x08\x04\x0cKY\x04\x04\ +\x01\x10\x08\x03\x01\x12\x00??3\x129/+\x11\x12\ +\x009\x129\x11\x12\x0199\x113\x113\x1131\ +0!#\x11\x04#\x22&5\x113\x11\x10!26\ +7\x113\x04\x8df\xfe\xfb\xc8\xcc\xd8g\x01E`\xc0\ +\xa5f\x02{g\xb5\xba\x023\xfd\xc9\xfe\xf6#;\x02\ +\xe3\x00\x01\x00\xcf\x00\x00\x07=\x05\xb6\x00\x0b\x001@\ +\x18\x09\x00\x08\x05\x04\x01\x00\x01\x05\x03\x0d\x0c\x0a\x06\x02\ +\x03\x08\x04\x01\x04KY\x01\x12\x00?+\x11\x003\x18\ +?33\x11\x12\x01\x179\x113\x113\x11310\ +!!\x113\x11!\x113\x11!\x113\x07=\xf9\x92\ +f\x02\x9ef\x02\x9ef\x05\xb6\xfa\xaa\x05V\xfa\xaa\x05\ +V\x00\x01\x00\xcf\xfe\x8f\x07\xd9\x05\xb6\x00\x0f\x00;@\ +\x1e\x0f\x0c\x08\x0b\x07\x04\x03\x00\x00\x04\x0b\x0c\x04\x11\x10\ +\x09\x05\x01\x03\x0e\x22\x0b\x07\x03\x00\x03KY\x00\x12\x00\ +?+\x11\x0033\x18??33\x11\x12\x01\x179\ +\x113\x113\x113\x113103\x113\x11!\x11\ +3\x11!\x113\x113\x11#\x11\xcff\x02\x9ef\x02\ +\x9ef\x9cb\x05\xb6\xfa\xaa\x05V\xfa\xaa\x05V\xfa\xaa\ +\xfe/\x01q\x00\x00\x02\x00\x0a\x00\x00\x04\xd3\x05\xb6\x00\ +\x0c\x00\x15\x00K@*\x11\x09\x05\x0d\x0d\x00\x00\x02\x09\ +\x03\x17\x16\x05\x15LY\xc0\x05\xd0\x05\x02\x0f\x05\x01\x0b\ +\x03\x05\x05\x00\x03\x03\x02KY\x03\x03\x00\x0dLY\x00\ +\x12\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]]+\x11\x12\x01\x179\x113\x113\x11310\ +!\x11!5!\x11!2\x16\x15\x14\x06#%!2\ +654&#!\x01Z\xfe\xb0\x01\xb7\x01\x1a\xfc\xfc\ +\xf9\xe8\xfe\xcf\x01 \xc5\xbe\xc0\xd7\xfe\xf4\x05V`\xfd\ +{\xbf\xce\xca\xdaZ\x9f\xab\xa5\x8e\x00\x00\x03\x00\xcf\x00\ +\x00\x05\xb6\x05\xb6\x00\x03\x00\x0e\x00\x17\x00K@*\x13\ +\x08\x01\x00\x04\x0f\x0f\x0c\x00\x08\x0c\x03\x19\x18\x04\x17L\ +Y\xc0\x04\xd0\x04\x02\x0f\x04\x01\x0b\x03\x04\x04\x0c\x02\x0d\ +\x03\x01\x12\x0c\x0fLY\x0c\x12\x00?+\x00\x18??\ +3\x129/_^]]+\x11\x12\x01\x179\x113\ +\x113\x113\x11310!#\x113\x01!2\x16\ +\x15\x14\x06#!\x113\x11!2654&#!\ +\x05\xb6ff\xfb\x7f\x01\x1b\xfb\xfd\xf8\xea\xfeif\x01\ +!\xcc\xb7\xbe\xd9\xfe\xf3\x05\xb6\xfd{\xbf\xce\xca\xda\x05\ +\xb6\xfa\xa4\xa6\xa4\xa3\x90\x00\x02\x00\xcf\x00\x00\x04T\x05\ +\xb6\x00\x0a\x00\x13\x00@@#\x0f\x04\x00\x0b\x0b\x08\x08\ +\x04\x15\x14\x00\x13LY\xc0\x00\xd0\x00\x02\x0f\x00\x01\x0b\ +\x03\x00\x00\x08\x09\x03\x08\x0bLY\x08\x12\x00?+\x00\ +\x18?\x129/_^]]+\x11\x12\x0199\x11\ +3\x113\x11310\x01!2\x16\x15\x14\x06#!\ +\x113\x11!2654&#!\x015\x01'\xfc\ +\xfc\xf8\xe9\xfe\x5cf\x01-\xc5\xbe\xc0\xd7\xfe\xe7\x031\ +\xbf\xce\xcb\xd9\x05\xb6\xfa\xa4\x9f\xab\xa5\x8e\x00\x00\x01\x00\ +F\xff\xec\x04q\x05\xcb\x00\x1a\x00B@$\x18\x15\x15\ +\x09\x04\x09\x0f\x16\x04\x1c\x1b\x17\x16JY\x0f\x17\x01\x0b\ +\x03\x17\x17\x0d\x06\x06\x00LY\x06\x04\x0d\x12JY\x0d\ +\x13\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]+\x11\x12\x01\x179\x113\x11310\x01\x22\x06\ +\x07'63 \x00\x11\x14\x02\x04#\x22'5\x163\ + \x00\x13!5!\x02\x00\x01\xb2P\x95X)\xa4\xcc\ +\x01D\x01q\xa6\xfe\xc7\xcd\xee\x91\xa7\xc5\x01\x0e\x016\ +\x0e\xfc\xfa\x03\x04\x16\xfe\xcf\x05o#+\x5cN\xfe\x80\ +\xfe\xb3\xef\xfe\x9c\xbf3^3\x01R\x013^\x01\x16\ +\x01,\x00\x00\x02\x00\xcf\xff\xec\x07\xb8\x05\xcd\x00\x12\x00\ +\x1e\x00O@+\x19\x00\x13\x0d\x06\x0c\x08\x08\x09\x00\x06\ +\x09\x03 \x1f\x0c\x07JY\x0f\x0c\x01\x0b\x03\x0c\x0c\x09\ +\x0a\x03\x09\x12\x10\x1cKY\x10\x04\x03\x16KY\x03\x13\ +\x00?+\x00\x18?+\x00\x18??\x129/_^\ +]+\x11\x12\x01\x179\x113\x113\x1133\x113\ +10\x01\x10\x00! \x00\x03!\x11#\x113\x11!\ +\x12\x00! \x00\x01\x10\x0032\x00\x11\x10\x00#\x22\ +\x00\x07\xb8\xfe\xb4\xfe\xda\xfe\xdb\xfe\xb4\x02\xfebff\ +\x01\xa0\x13\x01L\x01\x14\x01%\x01K\xfb\x8a\x01\x0a\xfa\ +\xfa\x01\x0a\xfe\xf7\xf9\xf8\xfe\xf2\x02\xdd\xfe\xa4\xfek\x01\ +\x8f\x01T\xfd1\x05\xb6\xfdw\x018\x01h\xfem\xfe\ +\xa3\xfe\xc7\xfe\xa8\x01U\x01<\x01;\x01R\xfe\xac\x00\ +\x02\x00\x1f\x00\x00\x03\xe3\x05\xb6\x00\x0c\x00\x15\x00R@\ +.\x00\x03\x15\x0b\x0b\x0a\x01\x02\x11\x06\x02\x03\x06\x0a\x04\ +\x17\x16\x03\x00\x14\x00LY\x0f\x14\x1f\x14?\x14O\x14\ +\x04\x09\x03\x14\x14\x08\x0b\x02\x12\x08\x0eLY\x08\x03\x00\ +?+\x00\x18?3\x129/_^]+\x11\x003\ +\x11\x12\x01\x179\x113\x113\x113\x113\x1131\ +0\x01\x01#\x01&&5\x10!!\x11#\x11\x11#\ +\x22\x06\x15\x14\x163!\x02!\xfey{\x01\x9b\x99\xa8\ +\x02\x0e\x01\x5cf\xf2\xdd\xc7\xc4\xbd\x01\x15\x02}\xfd\x83\ +\x02\x91\x1e\xca\x99\x01\xa4\xfaJ\x02}\x02\xdd\x99\xaa\xa0\ +\xa2\xff\xff\x00b\xff\xec\x03\x93\x04R\x02\x06\x00D\x00\ +\x00\x00\x02\x00{\xff\xec\x04#\x06\x1b\x00\x18\x00%\x00\ +A@!\x1c\x13\x0c\x22\x22\x00\x00\x06\x13\x03'&\x22\ +\x0c\x0c\x16\x10\x10\x1fFY\x10\x10\x16\x06\x05\x00\x16\x19\ +FY\x16\x16\x00?+\x00\x18?3\x129/+\x11\ +\x12\x009\x113\x11\x12\x01\x179\x113\x113\x113\ +10\x13\x10%6$7\x17\x07\x04\x07\x06\x02\x033\ +6632\x12\x15\x14\x02#\x22\x02\x012654\ +&#\x22\x06\x07\x14\x12\x16{\x01\x8f\x8c\x01\x01c\x12\ +x\xfe\xd7_\x87\x99\x0b\x06k\xcak\xc8\xd4\xf4\xdd\xe0\ +\xf7\x01\xdf\xab\xb5\xa1\x9ct\xd9QY\xaa\x02\x8d\x02\xc4\ +c#1\x13V\x178\x1e'\xfe\xd8\xfe\xff\x7fm\xfe\ +\xfe\xee\xfd\xfe\xe5\x01^\xfe\xfc\xe4\xd6\xcb\xcf\x91\x80\xb3\ +\xfe\xf2\x82\x00\x03\x00\xb6\x00\x00\x04\x17\x04?\x00\x0f\x00\ +\x16\x00\x1f\x00Z@1\x04\x14\x17\x00\x10\x07\x1c\x14\x14\ +\x0b\x00\x07\x0b\x03! \x03\x13\x1c\x1c\x13GY\x10\x1c\ +\x01\x0f\x1c\x1f\x1c\x02\x0b\x03\x1c\x1c\x0b\x0c\x0c\x1bGY\ +\x0c\x0f\x0b\x14GY\x0b\x15\x00?+\x00\x18?+\x11\ +\x12\x009\x18/_^]q+\x11\x12\x009\x11\x12\ +\x01\x179\x113\x113\x113\x113\x12910\x01\ +\x14\x06\x07\x15\x16\x16\x15\x14\x06#!\x11!2\x16\x03\ +4!!\x11! \x034&#!\x11!26\x03\ +\xf8fs\x83u\xcf\xc7\xfe5\x01\xcd\xba\xbbJ\xfe\xcd\ +\xfe\x9e\x01p\x01%\x1f\x88\x88\xfe\x9a\x01Z\x98\x84\x03\ +9gu\x17\x07\x0fyq\x9d\xa9\x04?\x86\xfd\x8f\xc8\ +\xfeN\x02\xd3_Q\xfe\x8c^\x00\x01\x00\xb6\x00\x00\x03\ +5\x04?\x00\x05\x00\x1f@\x0e\x02\x03\x03\x00\x07\x06\x03\ +\x15\x04\x01HY\x04\x0f\x00?+\x00\x18?\x11\x12\x01\ +99\x11310\x01!\x11#\x11!\x035\xfd\xe4\ +c\x02\x7f\x03\xe9\xfc\x17\x04?\x00\x02\x00)\xfe\x8f\x04\ +-\x04?\x00\x0d\x00\x12\x00E@$\x0e\x0c\x02\x0d\x10\ +\x0a\x12\x07\x03\x06\x06\x07\x0a\x0c\x0d\x05\x14\x13\x01\x05\x22\ +\x0a\x10FY\x0a\x0f\x0c\x12\x06\x03\x06GY\x03\x15\x00\ +?+\x11\x0033\x18?+\x00\x18?3\x11\x12\x01\ +\x179\x113\x113\x113\x113\x11310\x01#\ +\x11!\x11#\x1136\x12\x13!\x113#\x11!\x02\ +\x03\x04-b\xfc\xc0bH\x88\x94\x04\x02\x0b\x91\xf4\xfe\ +\xae\x18\xee\xfe\x8f\x01q\xfe\x8f\x01\xcf\xbf\x01\xf8\x01*\ +\xfc\x1f\x03\x85\xfd\xe3\xfe\x98\x00\xff\xff\x00w\xff\xec\x03\ +\xee\x04T\x02\x06\x00H\x00\x00\x00\x01\x00\x06\x00\x00\x05\ +L\x04?\x00\x11\x00L@(\x05\x01\x09\x09\x0e\x00\x0a\ +\x03\x04\x07\x06\x10\x0f\x0c\x0d\x04\x06\x0a\x0d\x0f\x05\x13\x12\ +\x05\x08\x11\x02\x0b\x05\x0e\x0e\x0d\x03\x00\x0f\x0f\x0a\x07\x0d\ +\x15\x00?33?33\x129\x11\x173\x11\x12\x01\ +\x179\x113\x113\x113\x113\x11333\x113\ +310\x013\x11\x013\x01\x01#\x01\x11#\x11\x01\ +#\x01\x013\x01\x02wd\x01\xd3y\xfe)\x01\xfc\x7f\ +\xfe\x0ed\xfe\x0e\x7f\x01\xfa\xfe+y\x01\xd3\x04?\xfd\ +\xf0\x02\x10\xfd\xf0\xfd\xd1\x02'\xfd\xd9\x02'\xfd\xd9\x02\ ++\x02\x14\xfd\xf0\x00\x01\x00D\xff\xec\x037\x04T\x00\ +&\x00P@,\x11%\x02\x0e!\x14\x09\x0e\x14\x1a%\ +\x05('\x10%&&%HY\x0f&\x1f&\x02\x0b\ +\x03&&\x17\x0b\x0b\x05HY\x0b\x10\x17\x1eFY\x17\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]+\x11\x12\x009\x11\x12\x01\x179\x113\x113\x12\ +910\x01 54&#\x22\x06\x07'632\ +\x16\x15\x14\x07\x15\x16\x16\x15\x14\x06#\x22&'5\x16\ +\x1632654&##5\x01\x83\x01'\x88~\ +P\x8aO%\xae\xa4\xb2\xb8\xc2yn\xdd\xc4j\xaf9\ +g\x96U\x94\xa5\x9e\x9e\x97\x02j\xcbaf%#R\ +N\x94\x83\xbd4\x06\x1e\x8bl\x97\xae)\x22c1#\ +}tqlV\x00\x01\x00\xb6\x00\x00\x04\x17\x04?\x00\ +\x0b\x00,@\x14\x03\x06\x06\x05\x09\x00\x00\x0a\x0a\x05\x0d\ +\x0c\x0b\x08\x03\x0f\x06\x02\x0a\x15\x00?33?33\ +\x11\x12\x0199\x113\x113\x113\x11310\x01\ +\x11\x07\x013\x11#\x117\x01#\x11\x01\x14\x06\x02\x85\ +\x84_\x04\xfd{\x81\x04?\xfc\xee\xcd\x03\xdf\xfb\xc1\x03\ +\x0d\xd2\xfc!\x04?\x00\xff\xff\x00\xb6\x00\x00\x04\x17\x05\ +\xf2\x02&\x01\xd2\x00\x00\x01\x06\x026\x19\x00\x00\x08\xb3\ +\x01\x0c\x11&\x00+5\x00\x01\x00\xb6\x00\x00\x03\xa2\x04\ +?\x00\x0a\x006@\x1a\x00\x01\x04\x03\x09\x02\x06\x06\x07\ +\x01\x03\x07\x03\x0c\x0b\x05\x0a\x02\x02\x07\x00\x08\x0f\x04\x07\ +\x15\x00?3?3\x129\x1133\x11\x12\x01\x179\ +\x113\x1133\x113\x11310\x013\x01\x01#\ +\x01\x11#\x113\x11\x03\x04{\xfe\x19\x02\x0a\x85\xfd\xfe\ +ee\x04?\xfd\xf2\xfd\xcf\x02'\xfd\xd9\x04?\xfd\xf0\ +\x00\x00\x01\x00\x14\xff\xf6\x03\xa6\x04?\x00\x10\x00/@\ +\x18\x01\x00\x03\x0f\x00\x0a\x0f\x03\x12\x11\x01\x15\x0f\x03F\ +Y\x0f\x0f\x07\x0cFY\x07\x15\x00?+\x00\x18?+\ +\x00\x18?\x11\x12\x01\x179\x113\x11310!#\ +\x11!\x02\x02\x06#\x22'5\x1632\x12\x13!\x03\ +\xa6b\xfe\x7f\x1eW\x89m'\x1d\x13#q\x8b$\x02\ +<\x03\xe3\xfeu\xfea\xc3\x08Z\x06\x01\xdd\x02\x10\x00\ +\x01\x00\xb6\x00\x00\x04\xb0\x04?\x00\x14\x00>@\x1e\x0a\ +\x09\x00\x02\x05\x12\x0f\x05\x04\x0f\x10\x00\x04\x10\x03\x16\x15\ +\x00\x11\x06\x0e\x0e\x10\x02\x11\x0f\x0a\x05\x10\x15\x00?3\ +3?3\x129\x113\x119\x11\x12\x01\x179\x113\ +\x113\x113\x113\x113310%7\x013\x11\ +#\x11\x06\x06\x01#\x01&&'\x11#\x113\x01\x16\ +\x02\xb0>\x019\x89^\x161\xfe\xd2X\xfe\xd3\x13!\ +\x14Z\x83\x01:%j\xaf\x03&\xfb\xc1\x03\xc7?\x84\ +\xfc\xfc\x02\xfc.f;\xfc5\x04?\xfc\xe0a\x00\x00\ +\x01\x00\xb6\x00\x00\x04-\x04?\x00\x0b\x00=@\x22\x02\ +\x06\x06\x05\x01\x09\x09\x0a\x0a\x05\x0d\x0c\x01\x08HY/\ +\x01?\x01_\x01o\x01\x04\x01\x01\x0a\x03\x0b\x0f\x06\x0a\ +\x15\x00?3?3\x129/]+\x11\x12\x0199\ +\x113\x113\x113\x11310\x01\x11!\x113\x11\ +#\x11!\x11#\x11\x01\x19\x02\xb2bb\xfdNc\x04\ +?\xfe#\x01\xdd\xfb\xc1\x02\x0c\xfd\xf4\x04?\xff\xff\x00\ +w\xff\xec\x049\x04T\x02\x06\x00R\x00\x00\x00\x01\x00\ +\xb6\x00\x00\x04\x19\x04?\x00\x07\x00%@\x11\x05\x04\x00\ +\x01\x04\x01\x09\x08\x05\x01\x15\x02\x07GY\x02\x0f\x00?\ ++\x00\x18?3\x11\x12\x0199\x113\x11310\ +!#\x11!\x11#\x11!\x01\x19c\x03cc\xfdc\ +\x04?\xfb\xc1\x03\xe1\x00\xff\xff\x00\xb6\xfe\x14\x04L\x04\ +T\x02\x06\x00S\x00\x00\xff\xff\x00w\xff\xec\x03\x85\x04\ +T\x02\x06\x00F\x00\x00\x00\x01\x00)\x00\x00\x03h\x04\ +?\x00\x07\x00%@\x12\x02\x03\x00\x03\x05\x03\x09\x08\x03\ +\x15\x01\x05\x06\x05HY\x06\x0f\x00?+\x11\x003\x18\ +?\x11\x12\x01\x179\x11310\x01!\x11#\x11!\ +5!\x03h\xfe\x96b\xfe\x8d\x03?\x03\xe9\xfc\x17\x03\ +\xe9V\x00\xff\xff\x00\x00\xfe\x14\x03\xac\x04?\x02\x06\x00\ +\x5c\x00\x00\x00\x03\x00w\xfe\x14\x04\xe5\x06\x14\x00\x11\x00\ +\x18\x00\x1f\x00K@(\x0c\x0f\x15\x1d\x04\x04\x04\x05\x19\ +\x00\x12\x09\x00\x05\x09\x03! \x0d\x00\x05\x1b\x1c\x16\x0c\ +\x16FY\x0f\x0c\x10\x1d\x15\x06\x15FY\x03\x06\x16\x00\ +?3+\x11\x003\x18?3+\x11\x003\x18??\ +\x11\x12\x01\x179\x113\x113\x113\x12\x17910\ +\x01\x14\x00\x07\x11#\x11&\x0054\x007\x113\x11\ +\x16\x00\x05\x14\x16\x17\x11\x06\x06\x054&'\x1166\ +\x04\xe5\xfe\xf1\xf5b\xf4\xfe\xec\x01\x10\xf8b\xf6\x01\x0e\ +\xfb\xfa\xd9\xc7\xcd\xd3\x03\x9e\xd6\xc6\xc8\xd4\x02!\xfb\xfe\ +\xd8\x12\xfe(\x01\xd8\x0e\x01(\xff\xfb\x01&\x12\x01\xc0\ +\xfe@\x12\xfe\xda\xfb\xd5\xf5\x0f\x03\xb0\x11\xf3\xd3\xd1\xf5\ +\x11\xfcP\x11\xfa\xff\xff\x007\x00\x00\x03\xc5\x04?\x02\ +\x06\x00[\x00\x00\x00\x01\x00\xb6\xfe\x8f\x04\x96\x04?\x00\ +\x0b\x002@\x19\x02\x0b\x07\x0a\x06\x03\x03\x0a\x0b\x03\x0d\ +\x0c\x08\x04\x0f\x01\x22\x0a\x06\x03\x06GY\x03\x15\x00?\ ++\x11\x003\x18??3\x11\x12\x01\x179\x113\x11\ +3\x11310\x01#\x11!\x113\x11!\x113\x11\ +3\x04\x96c\xfc\x83c\x02\x89b\x92\xfe\x8f\x01q\x04\ +?\xfc\x1f\x03\xe1\xfc\x1f\x00\x01\x00\xa4\x00\x00\x03\xee\x04\ +?\x00\x13\x008@\x1b\x07\x0b\x0b\x0a\x01\x12\x12\x0a\x15\ +\x14\x07\x04\x0c\x0f\x13\x0f\x04FY\x0f\x0f\x0b\x08\x13\x0f\ +\x0b\x15\x00??3\x129/+\x11\x12\x009\x129\ +\x11\x12\x0199\x113\x113\x11310\x01\x11\x14\ +\x163267\x113\x11#\x11\x06\x06#\x22&5\ +\x11\x01\x06\x86\x8bb\xb2`ccd\xc1p\xa7\xab\x04\ +?\xfe\x94\x8azFM\x01\xdd\xfb\xc1\x02\x04MB\xae\ +\xa4\x01x\x00\x01\x00\xb6\x00\x00\x06\x1b\x04?\x00\x0b\x00\ +1@\x18\x00\x09\x01\x04\x08\x05\x04\x05\x09\x03\x0d\x0c\x0a\ +\x02\x06\x0f\x00\x08\x05\x08GY\x05\x15\x00?+\x11\x00\ +3\x18?33\x11\x12\x01\x179\x113\x113\x113\ +10%!\x113\x11!\x113\x11!\x113\x03\x9a\ +\x02\x1ec\xfa\x9bc\x02\x1ec^\x03\xe1\xfb\xc1\x04?\ +\xfc\x1f\x03\xe1\x00\x00\x01\x00\xb6\xfe\x8f\x06\xac\x04?\x00\ +\x0f\x00;@\x1e\x08\x05\x01\x04\x00\x0d\x0c\x09\x04\x05\x09\ +\x0d\x04\x11\x10\x0e\x02\x0a\x0f\x07\x22\x04\x00\x0c\x09\x0cG\ +Y\x09\x15\x00?+\x11\x0033\x18??33\x11\ +\x12\x01\x179\x113\x113\x113\x11310%!\ +\x113\x113\x11#\x11!\x113\x11!\x113\x03\x9a\ +\x02\x1ec\x91b\xfalc\x02\x1ec^\x03\xe1\xfc\x1f\ +\xfe1\x01q\x04?\xfc\x1f\x03\xe1\x00\x00\x02\x00)\x00\ +\x00\x04\xb4\x04?\x00\x0b\x00\x14\x00O@.\x11\x03\x00\ +\x0d\x0d\x07\x03\x07\x09\x03\x16\x15\x00\x0cGY\xc0\x00\xd0\ +\x00\xe0\x00\x03\x0f\x00\x1f\x00\x02\x0b\x03\x00\x00\x07\x0a\x0a\ +\x09HY\x0a\x0f\x07\x0dGY\x07\x15\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]]+\x11\x12\x01\ +\x179\x113\x113\x11310\x01! \x11\x14\x06\ +#!\x11!5!\x11\x11!2654&#\x01\ +\xd5\x01`\x01\x7f\xd6\xc7\xfe\x5c\xfe\xb6\x01\xac\x01R\x90\ +\x95\x86\xa5\x02u\xfe\xd3\x9b\xad\x03\xe9V\xfd\xd8\xfeG\ +|rja\x00\x00\x03\x00\xb6\x00\x00\x05\x12\x04?\x00\ +\x09\x00\x12\x00\x16\x00O@.\x0f\x03\x14\x13\x00\x0b\x0b\ +\x07\x03\x07\x13\x03\x18\x17\x00\x0aGY\xc0\x00\xd0\x00\xe0\ +\x00\x03\x0f\x00\x1f\x00\x02\x0b\x03\x00\x00\x07\x15\x08\x0f\x14\ +\x15\x07\x0bGY\x07\x15\x00?+\x00\x18??3\x12\ +9/_^]]+\x11\x12\x01\x179\x113\x113\ +\x113\x11310\x01! \x11\x14\x06#!\x113\ +\x11\x11!2654&#\x01#\x113\x01\x19\x01\ +Z\x01\x7f\xd6\xc8\xfebc\x01K\x8d\x98\x86\xa5\x02\xb4\ +bb\x02u\xfe\xd3\x9b\xad\x04?\xfd\xd8\xfeGvv\ +la\xfd\xe9\x04?\x00\x00\x02\x00\xb6\x00\x00\x04\x17\x04\ +?\x00\x09\x00\x12\x00D@'\x0f\x03\x00\x0b\x0b\x07\x07\ +\x03\x14\x13\x00\x0aGY\xc0\x00\xd0\x00\xe0\x00\x03\x0f\x00\ +\x1f\x00\x02\x0b\x03\x00\x00\x07\x08\x0f\x07\x0bGY\x07\x15\ +\x00?+\x00\x18?\x129/_^]]+\x11\x12\ +\x0199\x113\x113\x11310\x01! \x11\x14\ +\x06#!\x113\x11\x11!2654&#\x01\x19\ +\x01\x7f\x01\x7f\xd6\xc8\xfe=c\x01p\x8e\x97\x86\xa5\x02\ +u\xfe\xd3\x9b\xad\x04?\xfd\xd8\xfeGxtla\x00\ +\x01\x00D\xff\xec\x03w\x04T\x00\x1a\x00D@&\x0c\ +\x09\x09\x18\x03\x0b\x12\x18\x04\x1c\x1b\x0b\x0aHY\x0f\x0b\ +\x1f\x0b\x02\x0b\x03\x0b\x0b\x00\x15\x15\x0fFY\x15\x10\x00\ +\x06FY\x00\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/_^]+\x11\x12\x01\x179\x113\x1131\ +0\x05\x22&'5\x163267!5!&&\ +#\x22\x07'6632\x00\x11\x10\x00\x01f\x5c\x9e\ +(\x7f\x9d\xc4\xea\x02\xfd\x94\x02h\x11\xcd\xb3j\xa0\x1d\ +8\xa8E\xf4\x01\x0a\xfe\xe5\x14\x1e\x15\x5c5\xf9\xd3X\ +\xc5\xcb\xa1:\x1d;\x930\ +\xb9\xd4\x11\x02q\xfd\x8b\x02\xda\xb8\x9d\x7f.\x96\x14\x01\ ++\x01\x02\x01\x09\x012\x1a\x17X\x15\x1a\xd2\xbeX\xd9\ +\xf35\x5c\x17\x1c\xff\xff\x00T\xff\xec\x03X\x04T\x02\ +\x06\x00V\x00\x00\xff\xff\x00\xa8\x00\x00\x01)\x05\xcd\x02\ +\x06\x00L\x00\x00\xff\xff\xff\xeb\x00\x00\x01\xe7\x05\xc3\x02\ +&\x00\xf3\x00\x00\x01\x07\x00j\xfe\x9b\x00\x00\x00\x0a\xb4\ +\x02\x01\x14\x11&\x00+55\xff\xff\xff\x9e\xfe\x14\x01\ +)\x05\xcd\x02\x06\x00M\x00\x00\x00\x02\x00\x14\xff\xf6\x06\ +\x00\x04?\x00\x16\x00 \x00V@0\x1c\x04\x00\x18\x18\ +\x07\x09\x15\x04\x07\x10\x15\x04\x22!\x00\x17GY\x0f\x00\ +\x1f\x00\x02\x0b\x03\x00\x00\x07\x15\x15\x09FY\x15\x0f\x07\ +\x18GY\x07\x15\x0d\x12FY\x0d\x15\x00?+\x00\x18\ +?+\x00\x18?+\x11\x12\x009\x18/_^]+\ +\x11\x12\x01\x179\x113\x113\x113\x11310\x01\ +!2\x16\x15\x10!!\x11!\x02\x02\x06#\x22'5\ +\x1632\x12\x13!\x11\x11!2654&&#\ +\x03^\x01\x1d\xcd\xb8\xfe\x5c\xfe\xa0\xfe\xc7\x1dW\x8co\ +%\x1b\x14 r\x8a&\x01\xf4\x01\x0f\x9a\x918u\x85\ +\x02m\x8f\x9a\xfe\xbc\x03\xe3\xfev\xfe^\xc1\x08Z\x06\ +\x01\xce\x02\x1f\xfd\xcf\xfePswJU'\x00\x02\x00\ +\xb6\x00\x00\x06h\x04?\x00\x12\x00\x1c\x00T@-\x18\ +\x05\x11\x01\x14\x14\x09\x10\x0c\x0c\x0d\x05\x09\x0d\x03\x1e\x1d\ +\x13\x0b\x10\x0bGY\x01\x0f\x10\x1f\x10\x02\x0b\x03\x10\x10\ +\x09\x12\x0e\x0f\x0d\x15\x09\x14GY\x09\x15\x00?+\x00\ +\x18??3\x129/_^]3+\x11\x003\x11\ +\x12\x01\x179\x113\x113\x113\x1299\x1131\ +0\x01\x11!2\x16\x15\x14\x06#!\x11!\x11#\x11\ +3\x11!\x11\x13\x11!2654&&#\x03\xc7\ +\x01'\xc4\xb6\xd1\xc8\xfe\x95\xfd\xb5cc\x02Kc\x01\ +\x18\x8e\x938uz\x04?\xfe.\x8e\x9b\xa1\xa3\x02\x0e\ +\xfd\xf2\x04?\xfe.\x01\xd2\xfd\xcf\xfePm{KW\ +&\xff\xff\x00\x1b\x00\x00\x04\x0e\x06\x14\x02\x06\x00\xe9\x00\ +\x00\xff\xff\x00\xb6\x00\x00\x03\xa2\x06!\x02&\x01\xd4\x00\ +\x00\x01\x06\x00v\x1d\x00\x00\x08\xb3\x01\x14\x11&\x00+\ +5\xff\xff\x00\x00\xfe\x14\x03\xac\x05\xf2\x02&\x00\x5c\x00\ +\x00\x01\x06\x026\x88\x00\x00\x08\xb3\x01\x19\x11&\x00+\ +5\x00\x01\x00\xb6\xfe\x8f\x04\x19\x04?\x00\x0b\x000@\ +\x18\x05\x08\x09\x00\x04\x01\x00\x01\x08\x03\x0d\x0c\x06\x02\x0f\ +\x0b\x22\x01\x04GY\x09\x01\x15\x00?3+\x00\x18?\ +?3\x11\x12\x01\x179\x113\x113\x11310!\ +!\x113\x11!\x113\x11!\x11#\x027\xfe\x7fc\ +\x02\x9dc\xfe\x81c\x04?\xfc\x1f\x03\xe1\xfb\xc1\xfe\x8f\ +\x00\x00\x01\x00\xcf\x00\x00\x03\xf0\x06\xe3\x00\x07\x00'@\ +\x12\x00\x03\x05\x06\x06\x03\x09\x08\x01\x07\x06\x12\x07\x04J\ +Y\x07\x03\x00?+\x00\x18?\x10\xc6\x11\x12\x0199\ +\x113\x11310\x01\x113\x11!\x11#\x11\x03\x8d\ +c\xfdEf\x05\xb6\x01-\xfeu\xfa\xa8\x05\xb6\x00\x00\ +\x01\x00\xb6\x00\x00\x035\x05\x89\x00\x07\x00'@\x12\x05\ +\x00\x02\x03\x03\x00\x09\x08\x06\x04\x03\x15\x04\x01HY\x04\ +\x0f\x00?+\x00\x18?\x10\xc6\x11\x12\x0199\x113\ +\x11310\x01!\x11#\x11!\x113\x035\xfd\xe4\ +c\x02\x1f`\x03\xe9\xfc\x17\x04?\x01J\x00\xff\xff\x00\ +3\x00\x00\x06\xf0\x07s\x02&\x00:\x00\x00\x01\x07\x00\ +C\x00\xfc\x01R\x00\x08\xb3\x01\x1d\x05&\x00+5\xff\ +\xff\x00\x1f\x00\x00\x05\xaa\x06!\x02&\x00Z\x00\x00\x01\ +\x06\x00CX\x00\x00\x08\xb3\x01\x1d\x11&\x00+5\xff\ +\xff\x003\x00\x00\x06\xf0\x07s\x02&\x00:\x00\x00\x01\ +\x07\x00v\x01\xa6\x01R\x00\x08\xb3\x01%\x05&\x00+\ +5\xff\xff\x00\x1f\x00\x00\x05\xaa\x06!\x02&\x00Z\x00\ +\x00\x01\x07\x00v\x01\x0c\x00\x00\x00\x08\xb3\x01%\x11&\ +\x00+5\xff\xff\x003\x00\x00\x06\xf0\x07\x15\x02&\x00\ +:\x00\x00\x01\x07\x00j\x01?\x01R\x00\x0a\xb4\x02\x01\ +,\x05&\x00+55\xff\xff\x00\x1f\x00\x00\x05\xaa\x05\ +\xc3\x02&\x00Z\x00\x00\x01\x07\x00j\x00\xa2\x00\x00\x00\ +\x0a\xb4\x02\x01,\x11&\x00+55\xff\xff\x00\x00\x00\ +\x00\x049\x07s\x02&\x00<\x00\x00\x01\x07\x00C\xff\ +~\x01R\x00\x08\xb3\x01\x0a\x05&\x00+5\xff\xff\x00\ +\x00\xfe\x14\x03\xac\x06!\x02&\x00\x5c\x00\x00\x01\x07\x00\ +C\xff,\x00\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\x00\ +\x01\x00R\x02\x00\x03\xae\x02R\x00\x03\x00\x15@\x09\x03\ +\x00\x05\x04\x01\x00SY\x01\x00/+\x11\x12\x0199\ +10\x135!\x15R\x03\x5c\x02\x00RR\x00\x01\x00\ +R\x02\x00\x07\xae\x02R\x00\x03\x00\x15@\x09\x03\x00\x05\ +\x04\x01\x00SY\x01\x00/+\x11\x12\x019910\ +\x135!\x15R\x07\x5c\x02\x00RR\xff\xff\x00R\x02\ +\x00\x07\xae\x02R\x02\x06\x02\x03\x00\x00\xff\xff\xff\xfc\xfe\ +l\x03N\xff\xd3\x00'\x00B\x00\x00\x00\x8b\x01\x07\x00\ +B\x00\x00\xffv\x00\x18\xb1\x00\x01\xb8\xff\xc0\xb3%&\ +H\x01\xb8\xff\xc0\xb3\x16\x1bH\x01\x00\x11++5\x00\ +\x01\x00\x1d\x03\xc1\x01\x0c\x05\xb6\x00\x08\x00\x17@\x09\x01\ +\x08\x08\x05\x0a\x09\x00\x04\x03\x00?\xcd\x11\x12\x0199\ +\x11310\x13'6\x1273\x06\x02\x07)\x0c \ +c+A\x1eE\x0b\x03\xc1\x14p\x01\x16[e\xfe\xc8\ +X\x00\x01\x00\x1d\x03\xc1\x01\x0c\x05\xb6\x00\x07\x00\x17@\ +\x09\x01\x07\x07\x04\x09\x08\x04\x07\x03\x00?\xc6\x11\x12\x01\ +99\x11310\x01\x17\x02\x07#6\x127\x01\x00\ +\x0cKcA\x1d@\x11\x05\xb6\x14\xfe\xf7\xd8`\x01#\ +r\xff\xff\x00D\xfe\xf9\x013\x00\xee\x01\x07\x02\x07\x00\ +'\xfb8\x003\xb1\x00\x07\xb8\xff\xc0\xb3\x1d\x1dH\x07\ +\xb8\xff\xc0\xb3\x13\x13H\x07\xb8\xff\xc0\xb3\x0e\x0eH\x07\ +\xb8\xff\xc0\xb3\x0c\x0cH\x07\xb8\xff\xc0\xb3\x09\x09H\x07\ +\x00\x11+++++5\x00\x00\x01\x00\x1d\x03\xc1\x01\ +\x0c\x05\xb6\x00\x08\x00\x17@\x09\x07\x00\x03\x00\x0a\x09\x04\ +\x08\x03\x00?\xcd\x11\x12\x0199\x11310\x13\x16\ +\x12\x17#&\x02'7\x9e\x0bE\x1eA(c#\x0c\ +\x05\xb6W\xfe\xc8fT\x01\x11|\x14\x00\x02\x00\x1d\x03\ +\xc1\x02J\x05\xb6\x00\x08\x00\x11\x00\x22@\x10\x0a\x11\x01\ +\x08\x05\x08\x0e\x11\x04\x13\x12\x00\x09\x04\x0d\x03\x00?3\ +\xcd2\x11\x12\x01\x179\x113\x11310\x01'6\ +\x1273\x06\x02\x07!'6\x1273\x06\x02\x07\x01\ +f\x0c\x22b*B\x1eB\x0f\xfeN\x0c c+A\ +\x1eE\x0b\x03\xc1\x14x\x01\x0e[b\xfe\xd3f\x14p\ +\x01\x16[e\xfe\xc8X\x00\x02\x00\x1d\x03\xc1\x02J\x05\ +\xb6\x00\x07\x00\x10\x00\x22@\x10\x09\x10\x01\x07\x04\x07\x0d\ +\x10\x04\x12\x11\x0d\x04\x10\x07\x03\x00?3\xc62\x11\x12\ +\x01\x179\x113\x11310\x01\x17\x02\x07#6\x12\ +7!\x17\x06\x02\x07#6\x127\x01\x00\x0cKcA\ +\x1d@\x11\x01\xb2\x0d$b(B\x1eB\x0f\x05\xb6\x14\ +\xfe\xf7\xd8`\x01#r\x14\x80\xfe\xf6Wb\x01-f\ +\x00\xff\xff\x00D\xfe\xf9\x02q\x00\xee\x01\x07\x02\x0b\x00\ +'\xfb8\x005\xb2\x01\x00\x07\xb8\xff\xc0\xb3\x1d\x1dH\ +\x07\xb8\xff\xc0\xb3\x13\x13H\x07\xb8\xff\xc0\xb3\x0e\x0eH\ +\x07\xb8\xff\xc0\xb3\x0c\x0cH\x07\xb8\xff\xc0\xb3\x09\x09H\ +\x07\x00\x11+++++55\x00\x00\x01\x00{\x00\ +\x00\x03s\x06\x14\x00\x0b\x00B@'\x01\x04\x07\x08\x09\ +\x0a\x06\x02\x02\x03\x00\x03\x05\x03\x0d\x0c\x07\x0a\x0b\x00\x01\ +\x04\x06\x05\x06\x06\x05TY@\x06\x01\x06\x06\x03\x08\x00\ +\x03\x12\x00??\x129/]+\x11\x12\x00\x179\x11\ +\x12\x01\x179\x113\x12\x17910\x01%\x13#\x13\ +\x055\x05\x033\x03%\x03s\xfe\x99\x1bu\x1b\xfe\xae\ +\x01R\x1bu\x1b\x01g\x04\x1f\x14\xfb\xcd\x043\x14p\ +\x1c\x01\xa1\xfe_\x1c\x00\x00\x01\x00{\x00\x00\x03s\x06\ +\x14\x00\x15\x00i@C\x00\x03\x06\x09\x0a\x0b\x0e\x0f\x10\ +\x11\x14\x15\x0c\x04\x04\x05\x02\x05\x07\x0c\x13\x05\x17\x16\x06\ +\x03\x02\x01\x00\x09\x06\x08\x07\x07\x08TY\x0f\x07\x01\x0d\ +\x03\x0e\x11\x12\x13\x14\x0b\x06\x0c\x0d\x0d\x0cTY@\x0d\ +\x01\x07\x0d\x07\x0d\x05\x0f\x00\x05\x12\x00??\x1299\ +//]+\x11\x12\x00\x179_^]+\x11\x12\x00\ +\x179\x11\x12\x01\x179\x113\x12\x17910\x01%\ +\x15%\x13#\x13\x055\x05\x03\x13\x055\x05\x033\x03\ +%\x15%\x13\x02\x0c\x01g\xfe\x99\x1bu\x1b\xfe\xae\x01\ +R\x11\x11\xfe\xae\x01R\x1bu\x1b\x01g\xfe\x99\x11\x01\ +\xcd\x18p\x18\xfes\x01\x8d\x18p\x18\x01E\x01%\x18\ +p\x18\x01\x9d\xfec\x18p\x18\xfe\xdb\x00\x01\x00\xe7\x02\ +7\x02\x1b\x03\xa0\x00\x0b\x00\x1e@\x10\x06\x00\x00\x0d\x0c\ +\x09\x0f\x03?\x03\x7f\x03\xef\x03\x04\x03\x00/]\xcd\x11\ +\x12\x019\x11310\x134632\x16\x15\x14\x06\ +#\x22&\xe7QIIQRHHR\x02\xecY[\ +^VU`^\xff\xff\x00\xa2\xff\xec\x05\x17\x00\xb0\x00\ +&\x00\x11\x00\x00\x00'\x00\x11\x01\xe9\x00\x00\x00\x07\x00\ +\x11\x03\xd3\x00\x00\x00\x07\x00q\xff\xe9\x08\xaa\x05\xcb\x00\ +\x0a\x00\x16\x00 \x00,\x000\x00:\x00F\x00a@\ +36;1A\x1c!\x17'0-./\x05\x0b\x00\ +\x11\x0b\x11!'-/;A\x08HG8\x1e\x1eD\ +**0\x03\x0e\x0e/0\x06/\x18\x08\x14\x074\x1a\ +\x1a>$\x19\x00?33\x113?3??\x129\ +/3\x119/33\x113\x11\x12\x01\x179\x113\ +\x113\x113\x113\x113\x113\x113\x11310\ +\x13\x14\x1632\x114&#\x22\x06\x05\x14\x06#\x22\ +&54632\x16\x01\x14\x1632\x11\x10#\x22\ +\x06\x05\x14\x06#\x22&54632\x16\x01\x01#\ +\x01\x01\x14\x1632\x11\x10#\x22\x06\x05\x14\x06#\x22\ +&54632\x16\xd3Z`\xc1c^`Z\x01\ +\xdd\x96\x8d\x85\x97\x90\x8c\x8b\x98\x01wZ`\xc1\xc1`\ +Z\x01\xdd\x94\x8d\x88\x96\x93\x8b\x89\x98\xfe\xfc\xfc\xd5`\ +\x03+\x02-Z`\xc1\xc1`Z\x01\xdd\x94\x8d\x87\x98\ +\x93\x8c\x89\x98\x04\x02\xba\xbb\x01u\xb8\xb9\xb9\xb8\xe2\xeb\ +\xf1\xdc\xdf\xea\xf1\xfc\xdc\xb9\xb9\x01r\x01q\xb7\xba\xe2\ +\xeb\xf3\xda\xe1\xe8\xf0\x03'\xfaJ\x05\xb6\xfc\x00\xb9\xb9\ +\x01r\x01q\xb7\xba\xe2\xeb\xf1\xdc\xe1\xe8\xf0\xff\xff\x00\ +\x85\x03\xa6\x01\x04\x05\xb6\x02\x06\x00\x0a\x00\x00\xff\xff\x00\ +\x85\x03\xa6\x02N\x05\xb6\x02\x06\x00\x05\x00\x00\x00\x01\x00\ +R\x00}\x01\xc5\x03\xa8\x00\x06\x00\x1c@\x0d\x03\x06\x02\ +\x04\x06\x03\x08\x07\x05_\x01\x01\x01\x00/]\xc4\x11\x12\ +\x01\x179\x11310\x13\x01\x17\x03\x13\x07\x01R\x01\ +5>\xfe\xfe>\xfe\xcb\x02\x1f\x01\x89+\xfe\x95\xfe\x96\ ++\x01\x87\x00\x01\x00H\x00}\x01\xba\x03\xa8\x00\x06\x00\ +\x1c@\x0d\x03\x00\x00\x02\x04\x03\x08\x07\x01_\x05\x01\x05\ +\x00/]\xc4\x11\x12\x01\x179\x11310\x01\x01'\ +\x13\x037\x01\x01\xba\xfe\xcb=\xfe\xfe=\x015\x02\x06\ +\xfew+\x01j\x01k+\xfey\x00\xff\xff\x00\xa4\xff\ +\xec\x02\xf0\x05\xb6\x00&\x00\x04\x00\x00\x00\x07\x00\x04\x01\ +\xaa\x00\x00\x00\x01\xfe\xb4\x00\x00\x02=\x05\xb6\x00\x03\x00\ +\x1a@\x0b\x03\x00\x05\x01\x02\x02\x04\x03\x03\x02\x12\x00?\ +?\x11\x013\x113\x113210\x01\x01#\x01\x02\ +=\xfc\xd5^\x03+\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\x00\ +q\x03-\x02\x98\x05\xc7\x00\x12\x00.@\x17\x00\x12\x0d\ +\x08\x08\x09\x12\x09\x14\x13\x04\x0f\x1f\x00\x00\x09\x10\x09\x02\ +\x09\x0c\x0a\x1e\x00?3\xcd]2?3\x11\x12\x019\ +9\x113\x113\x11310\x01\x114&#\x22\x06\ +\x15\x11#\x113\x173632\x15\x11\x02=UU\ +l\x5cZK\x0b\x06F\x8d\xf8\x03-\x01\x9e]Qn\ +|\xfe\x9e\x02\x8fZe\xfa\xfe`\x00\x00\x01\x00h\x00\ +\x00\x04\x14\x05\xb6\x00\x11\x00V@0\x00\x09\x0e\x03\x04\ +\x04\x05\x02\x05\x07\x0c\x10\x05\x13\x12\x03\x07\x08\x07OY\ +\x00\x08\x08\x05\x0e\x0e\x11NY\x0f\x0e?\x0e\x02\x0b\x03\ +\x0e\x0e\x0a\x05\x18\x0a\x0dNY\x0a\x06\x00?+\x00\x18\ +?\x129/_^]+\x11\x12\x009\x18/3+\ +\x11\x003\x11\x12\x01\x179\x113\x12\x17910\x01\ +!\x15!\x11#\x11#53\x11!\x15!\x11!\x15\ +!\x01\x83\x01u\xfe\x8bf\xb5\xb5\x02\xf7\xfdo\x02k\ +\xfd\x95\x01}R\xfe\xd5\x01+R\x049^\xfd\x9e^\ +\x00\x00\x01\x00N\x00\x00\x041\x05\xc9\x00&\x00m@\ +>\x08\x0b\x00\x14\x17$\x04\x04\x04\x10\x03\x0a\x0b\x10\x11\ +\x15\x1d&\x08('\x00\x15\x16\x15OY$\x16@\x09\ +\x0dH\x16\x11@\x01\x12\x11\x12OY\x04\x11\x11\x0b\x1b\ +\x1b MY\x1b\x07\x0c\x08\x0b\x0b\x08NY\x0b\x18\x00\ +?+\x11\x12\x009\x18?+\x11\x12\x009\x18/3\ ++\x11\x003\x1a\x18\x10\xce+2+\x11\x003\x11\x12\ +\x01\x179\x113\x12\x179\x11310\x01\x15!\x15\ +!\x15\x14\x06\x07!\x15!56655#53\ +5#5354632\x17\x07&#\x22\x06\x15\ +\x15!\x15\x01\x9c\x01\x9b\xfeeFN\x03)\xfc\x1dn\ +{\xd3\xd3\xd3\xd3\xc4\xb7\xaf\x9b#\x9d\x8a\x8d\x89\x01\x9b\ +\x03\x1f\xd7RRt\xa00`T\x15\xb2\x87TR\xd7\ +R\xae\xcc\xdeDVB\xa2\xac\xb2R\x00\x03\x00\xaa\xff\ +\xec\x05\x93\x05\xb6\x00\x14\x00\x1d\x00&\x00j@8\x0e\ +\x0b\x12\x12\x07\x22\x15\x1e\x19\x19\x1a\x02\x07\x09\x10\x15\x1a\ +\x06('\x0d\x0e@\x0b\x0e\x08\x11\x0e\x11MY\x0e\x0e\ +\x1a\x1b\x1e\x18MY\x1e\x1e\x1b\x1a\x18\x1b&MY\x1b\ +\x06\x05\x00MY\x05\x19\x00?+\x00\x18?+\x00\x18\ +?\x129/+\x11\x12\x009\x18/+\x11\x003\x11\ +3\x1a\x18\x10\xcd\x11\x12\x01\x179\x113\x113\x113\ +\x113\x129910%27\x15\x06#\x225\x11\ +#5773\x153\x15#\x11\x14\x16\x01\x10!#\ +\x11#\x113 \x0132654&##\x05'\ +:20S\xe3\xa0\xa0'=\xea\xeaF\xfe\x91\xfd\xd5\ +-f\xc3\x01\xfb\xfd\xa8:\xe1\xd1\xc4\xd2VB\x0cR\ +\x10\xfd\x02\x0f;+\xc3\xd3V\xfe\x0ajV\x03\xd0\xfe\ +@\xfd\xae\x05\xb6\xfc\xf4\xaa\xba\xac\xa0\x00\x01\x00J\xff\ +\xec\x04X\x05\xcd\x00*\x00\x81@P\x0d\x03\x07\x22\x19\ +\x07\x1e\x05\x0b\x12\x1b\x1e (\x07,+\x06 ! \ +OY\x03!@\x09\x0dH!\x1a@\x0a\x1b\x1a\x1bO\ +Y\x0d?\x1a\x7f\x1a\xaf\x1a\x03\x7f\x1a\x8f\x1a\xcf\x1a\xef\ +\x1a\xff\x1a\x05\x00\x1a\x10\x1a\x02\x09\x03\x1a\x1a\x16%%\ +\x00MY%\x07\x16\x10MY\x16\x19\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]]q3+\x11\ +\x003\x1a\x18\x10\xce+2+\x11\x003\x11\x12\x01\x17\ +9\x11333\x113310\x01\x22\x06\x07!\x15\ +!\x07\x15\x14\x17!\x15!\x16\x16327\x15\x06\x06\ +#\x22\x00\x03#53&57#53\x12\x003\ +2\x16\x17\x07&\x03#\xae\xe4)\x01\xf6\xfe\x02\x04\x04\ +\x01\xc1\xfeE\x1e\xeb\xb8\x94\x8bQ\x8bG\xe4\xfe\xe9*\ +\xb4\xac\x04\x04\xac\xb8'\x01 \xdaX\x92K'\x84\x05\ +u\xfb\xefRh\x18A\x16R\xd9\xf3A^\x22\x19\x01\ +\x18\x01\x0cR&KfR\x01\x10\x012\x22(VH\ +\x00\x00\x04\x00\x8f\xff\xf8\x05\xdd\x05\xc1\x00\x0b\x00\x17\x00\ +-\x001\x00H@&\x0c\x06\x12\x001./0&\ +\x1b\x00\x06\x1b +.0\x0732)\x18\x181\x15\ +\x09\x0901\x060\x18#\x1e\x06\x0f\x03\x18\x00?3\ +?3??\x129/3\x119/3\x11\x12\x01\x17\ +9\x113\x113\x113\x113\x11310\x01\x14\x06\ +#\x22&54632\x16\x05\x14\x163265\ +4&#\x22\x06\x01\x22&54632\x17\x07&\ +#\x22\x06\x15\x14\x16327\x15\x06\x01\x01#\x01\x05\ +\xdd\x9d\x8e\x8c\x9b\xa1\x8c\x8c\x99\xfe\x11ga_fe\ +`ce\xfd\xed\xa0\xac\xbb\x9fd]\x1dULy\x81\ +v}dUV\x02\xb0\xfc\xd5^\x03+\x01N\xa0\xb6\ +\xb7\x9f\xa2\xb4\xb7\x9f|\x82\x84z|\x82\x82\x01J\xb4\ +\xa0\x9f\xba\x1fX\x1e\x82|\x83z T%\x02\xa2\xfa\ +J\x05\xb6\x00\x02\x00s\xff\xee\x03m\x05\xcb\x00\x1c\x00\ +&\x00O@)\x02\x03\x1d\x16$\x0f\x1a\x1a\x09\x03\x09\ +\x0c\x16\x04('$\x0f \x0d\x19\x0a\x0d\x0c\x0f\x02\x1f\ +\x02\x02\x02\x0c$$\x0c\x02\x03\x13\x00\x06 \x13\x00/\ +3/3\x12\x179///]\x11399\x11\x12\ +99\x11\x12\x01\x179\x113\x1299\x113\x113\ +10%273\x06\x06#\x22&5\x11\x06\x075\ +67\x114632\x16\x15\x14\x02\x07\x11\x14\x16\x13\ +4&#\x22\x06\x15\x1166\x02Z\xab\x1aN\x05\x9b\ +\x7f\x8f\x86h^j\x5c}st\x82\xc6\xbdX\xcdQ\ +GID\x98\x8dH\xe5\x92\xad\xa5\xa4\x01\x1d+\x15T\ +\x1c&\x01\xfa\x90\x97\x99\x8c\xbc\xfe\xe3V\xfe\xd3\x86|\ +\x04\x5cij`s\xfe1M\xe2\x00\x00\x04\x00\xcf\x00\ +\x00\x07\xa6\x05\xb6\x00\x0f\x00\x1b\x00&\x00*\x00p@\ +>\x22\x10\x1c\x16\x01\x0e\x0e\x00\x09\x06\x06\x07\x00\x07\x10\ +\x16()\x06,+\x03\x0b'\x08\x19%LY\x0f\x19\ +\x01\x0a\x03\x19\x13\x13\x1fLY\x0f\x13\x1f\x13\x02\x09\x03\ +\x13\x13'\x0e\x08\x03\x01\x07\x12'(LY'\x12\x00\ +?+\x00\x18?3?3\x129/_^]+\x00\ +\x18\x10\xc4_^]+\x11\x12\x0099\x11\x12\x01\x17\ +9\x113\x113\x113\x113\x113\x11310!\ +#\x01#\x16\x15\x11#\x113\x013&5\x113\x01\ +\x14\x06#\x22&54632\x16\x05\x14\x1632\ +654&#\x22\x035!\x15\x04\xb8h\xfc\xdd\x08\ +\x0cbf\x03#\x06\x08b\x02\xee\x9f\x8a\x87\x9c\x9e\x8b\ +\x8a\x99\xfe\x16da^ec`\xc5+\x01\xd9\x05\x10\ +\xe8t\xfcL\x05\xb6\xfa\xf6\xe8h\x03\xba\xfc\xac\xa6\xaa\ +\xaa\xa6\xa4\xb2\xb4\xa2{}\x7fy|\x82\xfc\xa0VV\ +\x00\x00\x02\x00\x0a\x02\xe5\x05\x17\x05\xb6\x00\x07\x00\x18\x00\ +L@'\x11\x14\x14\x13\x18\x08\x10\x0f\x0c\x0c\x0d\x00\x01\ +\x03\x01\x06\x0d\x10\x13\x06\x1a\x19\x07\x03\x03\x14\x10\x0d\x08\ +\x00\x01\x01\x01\x16\x11\x0e\x09\x04\x03\x00?3333\ +\xc4]22223\x113\x11\x12\x01\x179\x113\ +\x113\x113\x1133\x113\x11310\x01#\x11\ +#5!\x15#\x01\x03#\x17\x11#\x113\x13\x133\ +\x11#\x117#\x03\x019V\xd9\x02\x0a\xdb\x02X\xdd\ +\x06\x04R}\xdd\xe0}V\x04\x07\xe3\x02\xe5\x02\x83N\ +N\xfd}\x02a\xc9\xfeh\x02\xd1\xfd\xa2\x02^\xfd/\ +\x01\x8e\xcf\xfd\xa3\xff\xff\x00R\x00\x00\x05\xe1\x05\xcd\x02\ +\x06\x01v\x00\x00\x00\x02\x00f\xff\xdd\x04\x8b\x04H\x00\ +\x17\x00\x1f\x009@\x1d\x18\x0c\x0d\x1f\x1f\x04\x04\x0c\x15\ +\x03! \x0d\x1f/\x1f?\x1f\x02\x14\x1f\x14\x1f\x08\x11\ +\x00\x1c\x08\x0f\x00?3/2\x1299//]\x11\ +3\x11\x12\x01\x179\x113\x113\x11310\x05\x22\ +&\x02546632\x16\x12\x15!\x11\x16\x163\ +267\x17\x06\x06\x13\x11&&#\x22\x07\x11\x02y\ +\x9d\xf1\x85\x8a\xf4\x95\x98\xf3\x87\xfc\xc51\xa6R\x83\xb7\ +QHb\xd9\x932\xa3X\xadz#\x93\x01\x05\x9d\xab\ +\xff\x8c\x8e\xfe\xfd\xa5\xfe\x9c5Fi\x81)\x9b|\x02\ +\x8b\x01\x155Bu\xfe\xe9\x00\xff\xff\x00\x16\xff\xec\x05\ +w\x05\xb6\x00'\x02@\x02\xfa\xfd\xb3\x00'\x02\x17\x02\ +\x00\x00\x00\x01\x06\x00{\xca\x00\x00\x0b\xb4\x02\x01\x00\x0b\ +\x19\x00?555\x00\xff\xff\x00 \xff\xec\x05\xcb\x05\ +\xcb\x00'\x02@\x03N\xfd\xb3\x00'\x02\x17\x02\x85\x00\ +\x00\x01\x06\x00u\xf7\x00\x00\x0b\xb4\x02\x01\x00\x0b\x19\x00\ +?555\x00\xff\xff\x005\xff\xec\x05\xba\x05\xb6\x00\ +&\x02=\xf1\x00\x00'\x02\x17\x02y\x00\x00\x01\x07\x02\ +@\x03=\xfd\xb3\x00\x0b\xb4\x04\x03\x02+\x19\x00?5\ +55\x00\xff\xff\x00Z\xff\xec\x05\xa6\x05\xb6\x00'\x02\ +@\x03)\xfd\xb3\x00'\x02\x17\x02\x0c\x00\x00\x01\x06\x02\ +?\x1d\x00\x00\x0b\xb4\x02\x01\x00\x0b\x19\x00?555\ +\x00\x00\x02\x00w\xff\xec\x04\x0e\x05\xcd\x00\x19\x00&\x00\ +L@'\x1d\x09\x0b\x0b\x16$\x03\x03\x11\x16\x03('\ +\x1d\x1a \x09\x00\x07\x07 FY\x07\x07\x14\x00\x14\x0e\ +FY\x14\x07\x00\x1aFY\x00\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x009\x11\x129\x11\ +\x12\x01\x179\x113\x113\x113310\x05\x22&\ +54\x12632\x17654&#\x22\x06\x075\ +63 \x11\x10\x02\x04'2\x12\x13&&#\x22\x06\ +\x02\x15\x14\x16\x01\xcf\xa5\xb3\x89\xe2\x91\xcd`\x08\x92\x9b\ +=\x841\x80\x80\x01\x85\x9a\xfe\xff\xa2\x9f\xef,'\x8c\ +_v\xb9o\x80\x14\xcd\xb6\xaf\x016\x9e\xe2KE\xec\ +\xe5!\x19c3\xfd\xdb\xfe\xf6\xfe3\xe5\x5c\x01L\x01\ +\x06{\x81\x8d\xfe\xf6\x90\x8b\x9c\x00\x02\x00\x14\x00\x00\x04\ +}\x05\xb6\x00\x05\x00\x0a\x005@\x1a\x02\x01\x06\x09\x03\ +\x08\x00\x00\x03\x06\x03\x0c\x0b\x03\x00\x08\x06\x05\x01\x03\x05\ +\x08KY\x05\x12\x00?+\x00\x18?\x129\x1199\ +\x11\x12\x01\x179\x113\x113\x1133107\x01\ +3\x01\x15!\x01\x06\x01!\x00\x14\x02\x09P\x02\x10\xfb\ +\x97\x0205\xfe|\x03y\xfey;\x05{\xfa\x839\ +\x05#\x99\xfb\xd6\x04\x1e\x00\x01\x00\xcf\xfe\x02\x05\x0e\x05\ +\xb6\x00\x07\x00%@\x11\x00\x07\x03\x04\x07\x04\x09\x08\x00\ +\x04\x1c\x05\x02KY\x05\x03\x00?+\x00\x18?3\x11\ +\x12\x0199\x113\x11310\x01\x11!\x11#\x11\ +!\x11\x04\xa8\xfc\x8df\x04?\xfe\x02\x07T\xf8\xac\x07\ +\xb4\xf8L\x00\x01\x00V\xfe\x02\x04\xba\x05\xb6\x00\x0b\x00\ +E@$\x02\x08\x07\x03\x09\x01\x01\x03\x06\x08\x0a\x05\x0d\ +\x0c\x02\x08\x08\x00\x03\x07\x04\x04\x07JY\x04\x03\x01\x09\ +\x00\x00\x09JY\x00\x1c\x00?+\x11\x12\x009\x18?\ ++\x11\x12\x009\x129\x113\x11\x12\x01\x179\x113\ +\x113\x11310\x135\x01\x015!\x15!\x01\x01\ +!\x15V\x02\x98\xfdx\x04\x11\xfc\x7f\x02t\xfdw\x03\ +\xd9\xfe\x02F\x03\xca\x03_E^\xfc\xc3\xfcE^\x00\ +\x01\x00o\x02\xaa\x04#\x02\xfc\x00\x03\x00)@\x1c\x03\ +\x00\x05\x04\x01\x00RY\x0f\x01/\x01?\x01_\x01\x7f\ +\x01\x8f\x01\xaf\x01\xbf\x01\xdf\x01\x09\x01\x00/]+\x11\ +\x12\x019910\x135!\x15o\x03\xb4\x02\xaaR\ +R\x00\x01\x00%\xff\xf2\x04\xa8\x06\x81\x00\x08\x00,@\ +\x14\x01\x00\x06\x05\x02\x02\x03\x06\x03\x09\x07\x08\x0a\x03\x04\ +\x04\x08\x06\x01\x08\x00//3\x129/3\x11\x013\ +2\x11\x179\x113\x113310\x05#\x01#5\ +3\x01\x013\x02bn\xfe\xe7\xb6\xfa\x01\x0e\x02\x1d^\ +\x0e\x03\x1eX\xfd\x00\x06\x19\x00\x00\x03\x00{\x01\x9c\x05\ +\x1f\x04\x0a\x00\x17\x00#\x00/\x00B@%!\x09'\ +\x15\x03\x09\x0f\x15\x1b-\x0610\x03-\x1b\x0f\x04\x00\ +\x1e**\x0c \x12\x01\x12\x18$$\x06?\x00\x7f\x00\ +\x02\x00\x00/]22\x113\xc4]22\x113\x11\ +\x179\x11\x12\x01\x179\x113\x11310\x012\x16\ +\x176632\x16\x15\x14\x06#\x22&'\x06\x06#\ +\x22&546\x05\x22\x06\x07\x16\x1632654\ +&!\x22\x06\x15\x14\x163267&&\x01\xa0[\ +\x91A?\x90^\x7f\xa6\xa7~^\x90?B\x91Z\x7f\ +\xa6\xa7\x02\xd8Ps77sPXhi\xfdOW\ +jjWJs=l~t\x9a|\x03\xac:?^o\x1e*9\ +}`qH9\xfe\x8f=;^n\x1b,:=@\ +`qH9\x00\x00\x01\x00o\x00\xb2\x04#\x04\xf8\x00\ +\x13\x00g@B\x03\x01\x00\x06\x11\x07\x10\x0a\x0d\x0b\x0a\ +\x0c\x02\x08\x04\x0f\x13\x02\x0c\x06\x15\x14\x01\x00\x11\x04\x05\ +\x04\x05RY\xef\x04\x01\x00\x04\x10\x04\x02\x09\x03\x04\x09\ +\x0b\x10\x0d\x08\x09\x09\x08RY\x0f\x09/\x09o\x09\xaf\ +\x09\xbf\x09\xdf\x09\x06\x09\x00/]+\x11\x12\x0099\ +3\x18\x10\xc6_^]]+\x11\x12\x00993\x11\ +\x12\x01\x179\x11\x12\x17910\x01\x03'\x13!5\ +!\x13!5!\x13\x17\x03!\x15!\x03!\x15\x02\x02\ +\x8bL{\xfe\xc9\x01^\x99\xfe\x09\x02\x1e\x90I}\x01\ +:\xfe\xa0\x9a\x01\xfa\x01\xdd\xfe\xd5%\x01\x06R\x01F\ +R\x011'\xfe\xf6R\xfe\xbaR\x00\xff\xff\x00o\x00\ +\x01\x04#\x04\xc1\x02&\x00\x1f\x00\x00\x01\x07\x02+\x00\ +\x00\xfdW\x00\x09\xb3\x01\x00\x07\x12\x00?55\x00\xff\ +\xff\x00o\x00\x01\x04#\x04\xc1\x02&\x00!\x00\x00\x01\ +\x07\x02+\x00\x00\xfdW\x00\x09\xb3\x01\x00\x07\x12\x00?\ +55\x00\x00\x02\x00w\x00\x00\x04-\x05\xc3\x00\x05\x00\ +\x09\x005@\x1c\x02\x01\x07\x05\x04\x09\x06\x03\x08\x00\x00\ +\x03\x07\x09\x04\x0b\x0a\x07\x00\x08\x06\x03\x09\x06\x02\x05\x02\ +\x04\x00?/\x12\x179\x11\x12\x01\x179\x113\x113\ +\x1133\x113310\x13\x013\x01\x01#\x09\x03\ +w\x01\xc21\x01\xc3\xfe=1\x01\x90\xfe\x89\xfe\x89\x01\ +w\x02\xdf\x02\xe4\xfd\x1c\xfd!\x02\xdf\x02m\xfd\x93\xfd\ +\x9a\xff\xff\x00\x1d\x00\x00\x03\x8f\x06\x1f\x00&\x00I\x00\ +\x00\x00\x07\x00L\x02f\x00\x00\xff\xff\x00\x1d\x00\x00\x03\ +\x7f\x06\x1f\x00&\x00I\x00\x00\x00\x07\x00O\x02f\x00\ +\x00\x00\x01\x01\x10\x04\xd9\x03\x8d\x05\xf2\x00\x0c\x00 @\ +\x0d\x0a\x0b\x04\x03\x0b\x03\x0e\x0d\x0a\x04\x80\x07\x00\x00/\ +2\x1a\xcc2\x11\x12\x0199\x113\x11310\x01\ +\x22&'3\x16\x1632673\x02\x02N\x95\x9c\ +\x0dX\x0fjonk\x0cX\x15\x04\xd9\x85\x94n[\ +^k\xfe\xe7\x00\x00\x01\xff\x9e\xfe\x14\x01\x19\x04?\x00\ +\x0c\x00\x1f@\x0e\x0a\x03\x07\x07\x0e\x0d\x08\x0f\x00\x05F\ +Y\x00\x1b\x00?+\x00\x18?\x11\x12\x019\x1133\ +10\x13\x22'5\x16325\x113\x11\x14\x06%\ +P7E<\x97c\x7f\xfe\x14\x19V\x14\xb0\x05 \xfa\ +\xee\x87\x92\x00\x01\x01\x9c\x04\xcd\x02b\x06\x14\x00\x09\x00\ +\x19@\x0a\x04\x03\x09\x03\x0b\x0a\x09\x80\x04\x00\x00?\x1a\ +\xcd\x11\x12\x0199\x11310\x016673\x15\ +\x06\x06\x07#\x01\x9c\x156\x0bp\x0fM55\x04\xdd\ +-\xbdM\x0e<\xaeO\x00\x01\x01\x8b\xfe;\x02R\xff\ +\x83\x00\x09\x00\x18@\x09\x04\x03\x03\x00\x0b\x0a\x09\x80\x04\ +\x00/\x1a\xcd\x11\x12\x0199\x11310\x0166\ +73\x15\x06\x06\x07#\x01\x8b\x192\x0bq\x17Q)\ +6\xfeL6\xb6K\x0eR\xab=\x00\x00\x01\x01\x98\x04\ +\xd9\x02^\x06!\x00\x09\x00\x18@\x09\x04\x03\x09\x03\x0b\ +\x0a\x09\x80\x04\x00/\x1a\xcd\x11\x12\x0199\x1131\ +0\x01\x06\x06\x07#56673\x02^\x1b5\x06\ +p\x14S*5\x06\x10:\xca3\x0eM\xb0=\x00\x00\ +\x02\x001\x029\x02\x7f\x05\xcb\x00\x0b\x00\x16\x00 @\ +\x0e\x06\x0c\x00\x12\x12\x0c\x18\x17\x09\x14\x1f\x03\x0f!\x00\ +?3?3\x11\x12\x0199\x113\x11310\x13\ +\x14\x1632654&#\x22\x06\x05\x14\x06#\x22\ +&5\x10!2\x16\x93[jh]]hj[\x01\ +\xec\x91\x94\x9a\x8f\x01)\x95\x90\x04\x04\xbe\xb7\xb6\xbf\xbb\ +\xb6\xb6\xbd\xe6\xe3\xe1\xe8\x01\xc9\xe0\x00\x00\x02\x00\x19\x02\ +J\x02\x91\x05\xbc\x00\x0a\x00\x11\x00D@#\x07\x0b\x09\ +\x02\x02\x03\x11\x06\x03\x06\x0a\x03\x13\x12\x0e\x03\x07\x06\x11\ +\x01\x05\x05\x09\x0f\x11\x1f\x11\x02\x11\x11\x03\x07\x1e\x03 \ +\x00??\x129/]33\x113\x129\x11\x129\ +\x11\x12\x01\x179\x113\x113\x1299310\x01\ +#\x15#5!5\x013\x113#547\x06\x06\ +\x01\x02\x91\x81Z\xfec\x01\x97`\x81\xdb\x08\x06\x1f\xfe\ +\xe8\x03;\xf1\xf1<\x02E\xfd\xcd\xdd\x84d\x0c/\xfe\ +v\x00\x01\x00D\x029\x02}\x05\xb6\x00\x1b\x00-@\ +\x16\x0f\x03\x1a\x14\x15\x03\x0a\x15\x18\x04\x1d\x1c\x12\x00\x00\ +\x06\x19\x16\x1e\x0c\x06!\x00?3?3\x129/3\ +\x11\x12\x01\x179\x1133\x11310\x012\x16\x15\ +\x14\x06#\x22&'5\x1632654&#\x22\ +\x07'\x13!\x15!\x036\x01D\x91\xa8\xae\x98A\x88\ +*x}kwuqJX3\x1f\x01\xdb\xfe{\x12\ +8\x04b\x8f{\x84\x9b \x1a^Bg`Ua\x18\ +'\x01\x9bX\xfe\xf6\x0e\x00\x02\x00+\x029\x02\x87\x05\ +\xcf\x00\x12\x00\x1e\x00.@\x16\x0d\x1c\x16\x00\x1c\x06\x00\ +\x06\x0a\x03 \x1f\x0d\x19\x10\x10\x03\x09\x1f\x13\x03!\x00\ +?3?\x129/39\x11\x12\x01\x179\x113\x11\ +3\x11310\x01\x14\x06#\x22&54\x127\x17\ +\x06\x06\x073632\x16\x012654&#\x22\ +\x06\x15\x14\x16\x02\x87\xa7\x80\x8e\xa7\xfa\xfe#\xc2\xd0#\ +\x07Y\x8aw\x95\xfe\xd9Xmd[\x5c{t\x03j\ +\x83\xae\xb9\x9f\xd3\x01\x1cOP9\xb1\x87q\x97\xfe\xa7\ +z_[feKm}\x00\x00\x01\x00=\x02J\x02\ +}\x05\xb6\x00\x06\x00 @\x0f\x06\x00\x01\x05\x00\x02\x05\ +\x03\x08\x07\x00 \x02\x03\x1e\x00?3?\x11\x12\x01\x17\ +9\x113\x11310\x13\x01!5!\x15\x01\xa4\x01\ +l\xfe-\x02@\xfe\x95\x02J\x03\x14XC\xfc\xd7\x00\ +\x03\x003\x029\x02}\x05\xcb\x00\x16\x00#\x00/\x00\ +6@\x1d\x1d\x08\x17\x0e-\x03'\x14\x03\x08\x0e\x14!\ +*\x0610*!\x11\x05\x04\x0b$\x00\x1f\x1a\x0b!\ +\x00?3?2\x11\x179\x11\x12\x01\x179\x113\x11\ +3\x113\x11310\x012\x16\x15\x14\x07\x16\x16\x15\ +\x14\x06#\x22&5467&&546\x03\x14\ +\x1632654&''\x06\x06\x13\x22\x06\x15\x14\ +\x16\x176654&\x01Xy\x91\xacdc\x9f\x88\ +\x88\x9bYWVA\x95KiY]bUl\x14]\ +O\xc0KYI]VPZ\x05\xcb|f\x88F&\ +xLo\x89\x81qKz)/[Be\x81\xfd`\ +GUSI;X)\x09#`\x02\x08MA6N\ +!\x1eQ8?M\x00\x00\x02\x00%\x029\x02\x81\x05\ +\xc9\x00\x18\x00$\x002@\x18\x0b\x22\x22\x00\x1c\x12\x00\ +\x05\x12\x03&%\x0c\x15\x1f\x0f\x0f\x03\x19\x15\x1f\x08\x03\ +!\x00?3?3\x129/3\x129\x11\x12\x01\x17\ +9\x113\x113\x11310\x01\x10\x02#\x22'5\ +\x163267#\x06\x06#\x22&54632\ +\x16\x16%\x22\x06\x15\x14\x1632654&\x02\x81\ +\xcf\xd3L56M\x94\xa7\x09\x08%zC\x82\x94\xa2\ +\x83[\x8fM\xfe\xc3[h]a_\x7fw\x04T\xfe\ +\xe6\xfe\xff\x11Z\x15\xb5\xb84=\x96\x81\x87\xa0Y\xaa\ +\xafo^[ldFf\x84\x00\x16\x00T\xfe\x81\x07\ +\xc1\x05\xee\x00\x05\x00\x0b\x00\x11\x00\x17\x00\x1b\x00\x1f\x00\ +#\x00'\x00+\x00/\x003\x007\x00;\x00?\x00\ +C\x00G\x00S\x00[\x00k\x00t\x00|\x00\x89\x00\ +\xde@[p`zglvvkXHTN\x09\ +\x0a$%()DE\x08\x15\x15\x16\x00\x0501<\ +=@A\x08\x0e\x0e\x0d\x03\x06\x0d\x10\x13\x16\x19\x1a\x1d\ +\x1e #-.478;HN`gk\x7f\x84\ +\x19\x8b\x8a\x82}ZQVKuOl\x01ll\x5c\ +vkt\x85\x5c}KkQ\x5cpk\x01k\xb8\xff\ +\xc0@5\x0b\x0eHkO\x5c\x01\x5c\x00\x0a\x15%&\ +)*12=>ABEF\x5ck\x11\x01\x12\x13\ +\x18\x19\x1c\x1d,-\x08\x0f\x0f\x0c\x06\x07 !45\ +89\x08\x04\x04\x01\x0c\x01\x00//\x113\x12\x179\ +\x113\x12\x179\x12\x179/]/+]\x10\xc4\x10\ +\xc4\xc4\x1133\x113\x129/q3\x113\x113\ +\x113\x11\x12\x01\x179\x113\x12\x179\x113\x12\x17\ +9\x113\x113\x113\x113\x113\x11310\x13\ +\x11!\x15#\x15%5!\x11#5\x01\x113\x153\ +\x15!5353\x11!5!\x15!5!\x15\x01\ +5!\x15\x01#\x113\x11#\x113\x015!\x15\x01\ +#\x113\x015!\x1535!\x15\x01#\x1135\ +#\x113\x01#\x113\x05\x14\x06#\x22&546\ +32\x16\x05\x143254#\x22%32\x16\x15\ +\x14\x06\x07\x15\x16\x16\x15\x14\x06##\x133265\ +4&##\x15\x1532654#\x01\x22'5\ +\x16325\x113\x11\x14\x06T\x01/\xc0\x05\xce\x01\ +0m\xf9\x00o\xc0\x05\x0e\xc3m\xfdI\x01\x11\xfb\xe1\ +\x01\x0e\xfe\xf2\x01\x0e\x04\xb7mmmm\xfb\xc2\x01\x10\ +\xfc0oo\x02\xc0\x01\x10w\x01\x11\xfa\xa8ooo\ +o\x06\xfemm\xfb\x9f\x87\x7f\x7f\x87\x87\x7f~\x88\xfe\ +s\x87\x87\x87\x87\x01\xe1\xacmp.,;0m^\ +\xcf{B.$*/;J1%Z\x01^4\x1c\ ++\x19V}i\x04\xbe\x010o\xc1\xc1o\xfe\xd0\xc1\ +\xf9\x02\x01/\xc2mm\xc2\xfe\xd1mmmm\x06\xfe\ +oo\xfa\xa8\x01\x0e\x02\x02\x01\x0f\xfa;mm\x01\xa6\ +\x01\x0e\x04Joooo\xfc/\x01\x10y\x01\x0f\xfd\ +h\x01\x10I\x91\x9c\x9c\x91\x92\x9b\x9a\x93\xc5\xc5\xc4a\ +CS1D\x08\x04\x0dD8QY\x01b\x22 \x22\ +\x1d\xe3\x9a+%J\xfe\xfa\x0af\x08V\x01\x92\xfer\ +_c\x00\x00\x03\x00T\xfe\xc1\x07\xaa\x06\x14\x00\x03\x00\ +\x1e\x00*\x008@\x1c\x17\x0b%\x04\x1f\x04\x1e\x01\x03\ +\x0b\x11\x1e\x05,+(\x1e\x14\x0e\x22\x1e\x0e\x0e\x1e\x22\ +\x03\x02\x00\x00//\x179///\x113\x113\x11\ +\x12\x01\x179\x1133\x113\x11310\x09\x03\x05\ +54676654&#\x22\x06\x07\x1763\ +2\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\x16326\ +54&#\x22\x06\x03\xfe\x03\xac\xfcT\xfcV\x03\xeb\ +,AgI\xbb\xa5O\xbaGR\xa0Z?>1H\ +T;\x1bGFBIHCHE\x06\x14\xfcV\xfc\ +W\x03\xa9\xfb/2A1R~X\x87\x9a8*\xb2\ +P:/5K6DpJ;\xfe\xed?HI>\ +@IH\xff\xff\xff\x9e\xfe\x14\x02\x0c\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01L\xfe\x9b\x00\x00\x00\x08\xb3\x01\x10\ +\x11&\x00+5\xff\xff\x00\x1d\x03\xc1\x01\x0c\x05\xb6\x02\ +\x06\x02\x07\x00\x00\x00\x02\x00\x0a\xff\xec\x04\x9a\x06+\x00\ +,\x005\x00f@6-\x1f*\x1f\x023$\x17\x0c\ +\x1b\x08\x02\x08\x0c\x12$+\x0676-0+!'\ +,,+FY,,\x05'\x14\x0fIY\x14\x14\x05\ +''0FY'\x01\x05\x1dFY\x05\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\x18\ +/+\x11\x12\x009\x11\x129\x11\x12\x01\x179\x113\ +\x113\x113\x1133\x11310\x01\x16\x15\x10\x00\ +#\x22&547654&#\x22\x07'63\ +2\x16\x15\x14\x07\x06\x15\x14! \x114'$$5\ +4632\x12\x133\x15'&\x02#\x22\x06\x15\x14\ +\x04\x04\x12\x05\xfe\xfc\xf2\xb3\xba\x10\x0f-#'7\x1b\ +>IPX\x0f\x0f\x01\x02\x01\x91\x04\xfe\xb4\xfe\x9a\xab\ +\x92\xbb\xf4(\x8e\xf8 \xbf\x88lw\x01/\x03^A\ +'\xfe\x89\xfem\xaf\xaf>xw%71\x16K\x1f\ +_]4jkO\xfe\x02\xae84\x03\xd2\xc3\x8f\xa4\ +\xfe\xbd\xfe\xd0ZZ\xfc\x01\x1dne\x9d\xa7\x00\x01\x00\ +\x00\x00\x00\x04P\x05\xc3\x00\x14\x006@\x1b\x14\x13\x00\ +\x10\x10\x11\x08\x11\x13\x03\x16\x15\x0f\x12\x00\x00\x11\x13\x03\ +\x11\x12\x05\x0aJY\x05\x04\x00?+\x00\x18??\x12\ +9\x1133\x11\x12\x01\x179\x113\x129\x1131\ +0\x017\x12\x12632\x17\x15&#\x22\x06\x06\x02\ +\x07\x11#\x11\x013\x02\x1f2\x8c\x8cfC\x1f\x1f\x1a\ +\x19*Iw\x8dTi\xfe\x17u\x02\x96q\x01@\x01\ +\x1ab\x0bZ\x06W\xed\xfe\xc8\xc9\xfd\xe1\x02-\x03\x89\ +\x00\x00\x02\x00\x14\xff\xec\x05\xf2\x04?\x00\x18\x00,\x00\ +V@-\x03''&\x19\x16\x1c\x13\x1d\x0d\x1f\x0a\x0a\ +\x0d\x0e\x12\x13\x16&\x07.-&&\x04\x07\x10\x13\x1d\ +\x0e\x10\x0eHY\x10\x0f+\x22\x07\x22FY\x00\x07\x16\ +\x00?3+\x11\x003\x18?+\x11\x0033\x11\x12\ +99\x18/\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x113\x12910\x05\x22&'#\x06\x06#\x22\ +&54\x127!57!\x15!\x16\x12\x15\x14\x06\ +\x134\x02'!\x02\x11\x14\x16326553\x15\ +\x14\x1632\x04#j\x89(\x04%\x84r\xab\xb1S\ +b\xfe\xd2\xa8\x056\xfe\xf5QG\xb1IAS\xfd\x1f\ +\xac}\x83mrbyk\xfc\x14bnke\xe5\xdf\ +\x8e\x01\x03\xa8:\x1cV\x8f\xfe\xfc\xa6\xdd\xe7\x01\xc4\x9b\ +\x01\x1a\x84\xfe\xdb\xfe\xec\xb9\xb1\x98\x84\xdd\xdd\x86\x96\xff\ +\xff\x00\xcf\x00\x00\x06\x19\x07u\x02&\x000\x00\x00\x01\ +\x07\x00v\x01\x81\x01T\x00\x08\xb3\x01\x1d\x05&\x00+\ +5\xff\xff\x00\xb6\x00\x00\x06f\x06!\x02&\x00P\x00\ +\x00\x01\x07\x00v\x01\xbc\x00\x00\x00\x08\xb3\x01,\x11&\ +\x00+5\xff\xff\x00\x00\xfd\xd9\x04\xcd\x05\xbc\x02&\x00\ +$\x00\x00\x00\x07\x02[\x01\x12\x00\x00\xff\xff\x00b\xfd\ +\xd9\x03\x93\x04R\x02&\x00D\x00\x00\x00\x07\x02[\x00\ +\xb4\x00\x00\xff\xff\xfe\xfd\xff\xec\x05\xe0\x05\xcd\x00&\x00\ +2D\x00\x01\x07\x02\x5c\xfeO\x00\x00\x00\x09\xb3\x03\x02\ +\x1a\x03\x00?55\x00\x00\x02\x00{\xfd\xd9\x02-\xff\ +\x81\x00\x0b\x00\x17\x00\x1e@\x0c\x12\x00\x0c\x06\x06\x00\x19\ +\x18\x0f\x03\x15\x09\x00/3\xc42\x11\x12\x0199\x11\ +3\x11310\x01\x14\x06#\x22&54632\ +\x16\x05\x14\x1632654&#\x22\x06\x02-x\ +aaxxaax\xfe\x9eK>>KN;>\ +K\xfe\xaeatta^uv]BKKB@\ +KL\x00\x00\x02\x00\xae\x04h\x02\xa6\x05\xbe\x00\x08\x00\ +\x19\x00&@\x12\x03\x02\x0f\x09\x02\x08\x09\x0d\x14\x05\x1b\ +\x1a\x17\x08\x0c\x08\xc0\x02\x00/\x1a\xcc\xc6\x10\xc4\x11\x12\ +\x01\x179\x113\x11310\x01673\x15\x06\x06\ +\x07#%467\x15\x06\x15\x14\x1e\x02\x15\x14\x06#\ +\x22&\x01\xb8W$s\x1fj14\xfe\xf6gf\x7f\ +\x1d$\x1d( .6\x04\x7f\xb3\x84\x12C\xb0Bx\ +Tf\x1d7&D\x18\x16\x12\x18\x19\x1f%F\x00\xff\ +\xff\x00\x1d\x00\x00\x05\xf6\x06\x1f\x00&\x00I\x00\x00\x00\ +'\x00I\x02f\x00\x00\x00\x07\x00L\x04\xcd\x00\x00\xff\ +\xff\x00\x1d\x00\x00\x05\xe6\x06\x1f\x00&\x00I\x00\x00\x00\ +'\x00I\x02f\x00\x00\x00\x07\x00O\x04\xcd\x00\x00\x00\ +\x02\x00\x81\xff\xec\x06\x19\x06\x14\x00\x14\x00 \x00D@\ +\x22\x13\x0b\x00\x06\x0e\x10\x1b\x00\x15\x06\x00\x06\x10\x03\x22\ +!\x13\x0b\x03\x0e\x09@\x09\x1eKY\x09\x04\x03\x18K\ +Y\x03\x13\x00?+\x00\x18?+\x00\x1a\x18\x10\xce\x12\ +99\x11\x12\x01\x179\x113\x113\x113\x11\x129\ +910\x01\x10\x00! \x00\x11\x10\x00! \x176\ +653\x17\x06\x06\x07\x16\x01\x10\x00! \x00\x11\x10\ +\x00! \x00\x05\x9c\xfe\xa4\xfe\xce\xfe\xcf\xfe\xa4\x01_\ +\x010\x01J\xaaQOh\x0d\x0askk\xfbT\x01\ +\x18\x01\x06\x01\x08\x01\x17\xfe\xe9\xfe\xfa\xfe\xfb\xfe\xe5\x02\ +\xdd\xfe\xa4\xfek\x01\x95\x01^\x01]\x01\x91\xe6\x15\x8e\ +\x8a\x12\x93\xaa#\xb6\xfe\xf1\xfe\xc6\xfe\xa9\x01T\x01=\ +\x01<\x01Q\xfe\xac\x00\x00\x02\x00w\xff\xec\x04\xb8\x04\ +\xe7\x00\x15\x00!\x00D@!\x14\x0c\x00\x07\x0f\x11\x11\ +\x1c\x00\x16\x07\x07\x00#\x22\x14\x0c\x03\x0f\x0a@\x0a\x1f\ +FY\x0a\x10\x03\x19FY\x03\x16\x00?+\x00\x18?\ ++\x00\x1a\x18\x10\xce\x1299\x11\x12\x0199\x113\ +\x1132\x113\x11\x129910\x01\x10\x00#\x22\ +&\x025\x10\x0032\x176673\x17\x06\x06\x07\ +\x16\x05\x14\x1632654&#\x22\x06\x049\xfe\ +\xfe\xe3\x8f\xdat\x01\x02\xe1\xdb\x81HG\x03d\x0c\x0b\ +f`R\xfc\xa6\xc5\xb4\xb4\xc5\xc7\xb4\xb4\xc3\x02!\xfe\ +\xf6\xfe\xd5\x8a\x01\x02\xa9\x01\x0a\x01)\x93\x18\x88\x86\x12\ +\x90\xa2&\x89\xd3\xe0\xfb\xfb\xe0\xe1\xf8\xf7\x00\x00\x01\x00\ +\xbe\xff\xec\x06#\x06\x14\x00\x1a\x00@@\x1f\x04\x06\x06\ +\x19\x01\x0a\x13\x10\x10\x0a\x1c\x1b\x04\x11@\x01\x09LY\ +\x01\x01\x0d\x1a\x11\x03\x0d\x16LY\x0d\x13\x00?+\x00\ +\x18?3\x129/+\x00\x1a\x18\x10\xce\x11\x12\x019\ +9\x113\x11332\x11310\x01\x15665\ +3\x17\x06\x06\x07\x11\x14\x00!\x22\x005\x113\x11\x14\ +\x163265\x11\x05\x02YSi\x0c\x0c\x93\x82\xfe\ +\xdc\xfe\xfb\xfe\xfe\xe3g\xea\xd6\xd1\xe6\x05\xb6\xcf\x13\x8c\ +\x8e\x12\xa7\xaf\x19\xfdq\xfc\xfe\xe4\x01\x1d\xff\x03\xae\xfc\ +N\xd3\xeb\xe7\xcd\x03\xbc\x00\x01\x00\xaa\xff\xec\x05#\x04\ +\xf2\x00\x1f\x00M@&\x0a\x15\x0e\x10\x10\x17\x07\x07\x15\ +\x01\x1e\x1e\x15! \x18\x16\x0e\x1f@\x0a\x14IY\x0a\ +\x0a\x16\x08\x1f\x0f\x16\x15\x1b\x04FY\x1b\x16\x00?+\ +\x00\x18??3\x129/+\x00\x1a\x18\x10\xce\x129\ +\x11\x12\x0199\x113\x113\x1132\x113\x113\ +10\x01\x11\x14\x163265\x113\x15>\x025\ +3\x17\x0e\x02\x07\x11#'#\x06\x06#\x22&5\x11\ +\x01\x0c\x91\x98\xbd\xaebBM!e\x0c\x09@wa\ +T\x12\x064\xb7v\xc9\xc2\x04?\xfd@\xa4\x95\xc6\xdb\ +\x02Xz\x0bBrn\x13{\x86\x5c\x11\xfc\x8f\x96R\ +X\xc4\xc9\x02\xc6\xff\xff\xfc\x8c\x04\xd9\xfe\x0b\x06!\x00\ +\x07\x00C\xfb\x03\x00\x00\xff\xff\xfd<\x04\xd9\xfe\xbb\x06\ +!\x00\x07\x00v\xfb\xb3\x00\x00\xff\xff\xfcQ\x04\xdb\xff\ +\x0b\x05\xc9\x00\x07\x01R\xfb6\x00\x00\x00\x01\xfd\x14\x04\ +\xb8\xfed\x06\x8f\x00\x12\x00\x0a\xb2\x0b\x10\x04\x00/\xcc\ +210\x01\x14\x07\x07#'6654&#\x22\ +\x075632\x16\xfed\xa8\x0aP\x0aYQCN\ +0-47ly\x05\xe1\x8c$y\xb2\x0f8,0\ +0\x08N\x0c[\x00\x01\xfdj\xfe\xbc\xfd\xec\xff}\x00\ +\x09\x00\x08\xb1\x08\x02\x00/\xcd10\x05432\x16\ +\x15\x14\x06#\x22\xfdj@\x1f##\x1f@\xe3`2\ +.-4\xff\xff\x00\xcf\x00\x00\x03\xee\x07s\x02&\x00\ +(\x00\x00\x01\x07\x00C\xff\xb1\x01R\x00\x08\xb3\x01\x0d\ +\x05&\x00+5\xff\xff\x00\xcf\x00\x00\x04\xf6\x07s\x02\ +&\x01\xb2\x00\x00\x01\x07\x00C\x00L\x01R\x00\x08\xb3\ +\x01\x11\x05&\x00+5\xff\xff\x00w\xff\xec\x03\xee\x06\ +!\x02&\x00H\x00\x00\x01\x06\x00C\xa5\x00\x00\x08\xb3\ +\x02\x1d\x11&\x00+5\xff\xff\x00\xb6\x00\x00\x04\x17\x06\ +!\x02&\x01\xd2\x00\x00\x01\x06\x00C\xc8\x00\x00\x08\xb3\ +\x01\x0d\x11&\x00+5\x00\x01\x00\x81\xff\xec\x07B\x05\ +\xcd\x005\x00T@+\x1f\x05\x05\x02\x0a\x183%\x18\ +%\x02\x12+\x0576\x05\x02\x1f\x1f(\x03\x03\x22(\ +\x0e/(/KY\x15(\x04\x07\x00\x22\x00KY\x1b\ +\x22\x13\x00?3+\x11\x003\x18?3+\x11\x003\ +\x11\x129\x18/\x119\x1133\x11\x12\x01\x179\x11\ +3\x113\x113\x12910%27\x113\x11\x16\ +32\x12\x114\x02&#\x22\x06\x07'6632\ +\x12\x11\x10\x00#\x22&'#\x06\x06#\x22\x00\x11\x10\ +\x1232\x16\x17\x07&&#\x22\x06\x02\x15\x10\x12\x02\ +\xa2\xa5gfn\xb3\xc4\xdaS\x9ag?_/+D\ +sG\xd4\xe9\xfe\xf2\xf7o\x9dN\x04L\x9bo\xfa\xfe\ +\xf2\xf8\xd9ItA+H\x5c/k\xa1V\xe5LP\ +\x01\xfa\xfe\x08R\x01i\x01A\xc1\x01\x1d\x96\x22\x19^\ +$\x1c\xfe\x83\xfe\xa8\xfe\x91\xfec+55+\x01\x9b\ +\x01q\x01T\x01\x81\x1d#^$\x17\x94\xfe\xe3\xc3\xfe\ +\xbc\xfe\x9a\x00\x01\x00\x00\x00\x00\x05\xb8\x04?\x00\x1b\x00\ +G@%\x0e\x00\x1b\x1a\x12\x05\x04\x0a\x16\x17\x10\x0f\x07\ +\x06\x00\x06\x0a\x0f\x12\x17\x06\x1d\x1c\x0e\x00\x00\x1b\x16\x0f\ +\x06\x0f\x12\x0a\x05\x03\x1b\x15\x00?\x173?33\x12\ +9\x113\x11\x12\x01\x179\x113\x113\x113\x113\ +3\x1133\x11310\x01\x07\x06\x06\x03#\x013\ +\x13\x16\x13366\x13\x033\x13\x1336\x12\x113\ +\x10\x02\x07#\x02\xf2\x1e%\x12\xafg\xfeyh\xd1'\ +a\x06\x22Q\x93\xa6f\xd1\x94\x06\xb2\xb0^\xc6\xd7e\ +\x02\x0eAR&\xfe\xab\x04?\xfd\xbfj\xfe\xd2M\xa5\ +\x01\x1b\x01\xcc\xfd\xbf\xfeZ\xb2\x01\xe9\x01L\xfe\x91\xfe\ +\x09\xd9\x00\x00\x02\x00\x1f\x00\x00\x04\xf2\x06\x14\x00\x12\x00\ +\x1b\x00[@2\x17\x0c\x01\x04\x08\x03\x13\x13\x10\x06\x0c\ +\x10\x12\x04\x1d\x1c\x07\x12\x00\x12LY\x04\x00\x00\x08\x02\ +\x08\x1bLY@\x08\x01\x0f\x08\x01\x0b\x03\x08\x08\x10\x02\ +\x00\x10\x13LY\x10\x12\x00?+\x00\x18?\x129/\ +_^]q+\x11\x12\x009\x18/3+\x11\x003\ +\x11\x12\x01\x179\x113\x12\x179\x11310\x13!\ +\x113\x11!\x15!\x11!2\x04\x15\x14\x04#!\x11\ +!\x01!2654&#!\x1f\x01Pf\x01\xe1\ +\xfe\x1f\x01\x1f\xfc\x01\x02\xff\x00\xec\xfei\xfe\xb0\x01\xb6\ +\x01!\xcd\xc0\xc4\xde\xfe\xf4\x04\xd7\x01=\xfe\xc3T\xfe\ +\xae\xc3\xca\xc7\xdd\x04\x83\xfb\xd5\xa8\xa4\x9e\x93\x00\x02\x00\ +\x1f\x00\x00\x04b\x05'\x00\x11\x00\x1a\x00`@7\x17\ +\x07\x00\x04\x0f\x03\x13\x13\x0b\x02\x07\x0b\x0d\x04\x1c\x1b\x10\ +\x0e\x04\x12GY\xc0\x04\xd0\x04\xe0\x04\x03\x0f\x04\x1f\x04\ +\x02\x0b\x03\x04\x04\x0b\x0e\x03\x0d\x0e\x0dIY\x00\x0e\x0f\ +\x0b\x13GY\x0b\x15\x00?+\x00\x18?3+\x11\x00\ +3\x11\x129\x18/_^]]+\x00\x18\x10\xc6\x11\ +\x12\x01\x179\x113\x12\x179\x11310\x01!\x15\ +!\x11! \x11\x14\x06#!\x11#5353\x11\ +\x11!2654&#\x01d\x01\x8e\xfer\x01\x7f\ +\x01\x7f\xd6\xc7\xfe=\xe3\xe3b\x01q\x8e\x97\x8a\xa7\x04\ +?Q\xfe\x87\xfe\xd3\x9b\xad\x03\xeeQ\xe8\xfc\xf0\xfeG\ +xtla\x00\x00\x01\x00\xcf\xff\xec\x07\x0a\x05\xcb\x00\ +\x1f\x00X@0\x03\x06\x18\x06\x11\x17\x13\x13\x14\x04\x0c\ +\x11\x14\x1d\x05! \x06\x12\x17\x12JY\x03\x0f\x17\x01\ +\x0b\x03\x17\x17\x14\x15\x03\x14\x12\x1b\x00LY\x1b\x04\x0e\ +\x09JY\x0e\x13\x00?+\x00\x18?+\x00\x18??\ +\x129/_^]3+\x11\x003\x11\x12\x01\x179\ +\x113\x113\x1133\x11310\x01 \x00\x03!\ +\x15!\x12\x00!27\x15\x06# \x00\x03!\x11#\ +\x113\x11!\x12\x00!2\x17\x07&\x05\x91\xff\x00\xfe\ +\xc7\x14\x03\x08\xfc\xf3\x06\x01+\x01\x11\xb8\x9a\x91\xda\xfe\ +\xd0\xfe\x9f\x04\xfebff\x01\xa0\x17\x01u\x01*\xd6\ +\xa9)\xa0\x05o\xfe\xce\xfe\xf0^\xfe\xcb\xfe\xb0/Z\ +3\x01\x86\x01]\xfd1\x05\xb6\xfdw\x014\x01jP\ +\x5cP\x00\x00\x01\x00\xb6\xff\xec\x05\x87\x04T\x00\x22\x00\ +Z@2\x17\x1a\x1a\x0a\x03\x09\x05\x05\x06\x03\x06\x10\x19\ +\x1f\x05$#\x1a\x04\x09\x04HY\x17\x0f\x09\x1f\x09\x02\ +\x0b\x03\x09\x09\x06\x07\x0f\x06\x15\x0d\x14FY\x0d\x10\x00\ +\x1dFY\x00\x16\x00?+\x00\x18?+\x00\x18??\ +\x129/_^]3+\x11\x003\x11\x12\x01\x179\ +\x113\x113\x1133\x11310\x05\x22\x00\x03!\ +\x11#\x113\x11!6\x0032\x16\x17\x07&&#\ +\x22\x06\x07!\x15!\x16\x16327\x15\x06\x06\x04h\ +\xed\xff\x00\x02\xfe\xa0cc\x01d\x13\x01\x0c\xd9=\xa1\ +4\x1d6\x8a5\xb2\xcf\x11\x02H\xfd\xb4\x02\xd0\xb9\x94\ +}-\x93\x14\x01\x1d\x01\x07\xfd\xf0\x04?\xfe'\xe8\x01\ +\x06\x1b\x16X\x15\x1a\xd4\xc0X\xd5\xf35\x5c\x17\x1c\x00\ +\x02\x00\x00\x00\x00\x05\x06\x05\xbc\x00\x0b\x00\x12\x00O@\ +-\x02\x03\x09\x08\x10\x0b\x0a\x06\x07\x00\x03\x05\x07\x0a\x0c\ +\x0d\x10\x08\x14\x13\x10\x07\x08\x01\x05\x0c\x05JY_\x0c\ +\x7f\x0c\x8f\x0c\x03\x0c\x0c\x07\x08\x03\x0b\x03\x07\x12\x00?\ +33?\x129/]+\x11\x003\x11\x129\x11\x12\ +\x01\x179\x113\x113\x1133\x11310\x01#\ +\x11#\x11#\x01#\x013\x01#\x01!&&'\x06\ +\x06\x03w\xc3b\xbf\xfe\xdco\x02s1\x02bs\xfd\ +'\x01\x96RX\x1d\x10\x22\x02\xb2\xfdN\x02\xb2\xfdN\ +\x05\xbc\xfaD\x03\x10\xc6\xd4b4X\x00\x02\x00\x0a\x00\ +\x00\x03\xf4\x04?\x00\x0b\x00\x12\x00C@$\x0b\x00\x10\ +\x02\x01\x05\x06\x09\x0a\x01\x03\x06\x08\x0a\x0c\x0d\x10\x08\x14\ +\x13\x04\x08\x0c\x08IY\x0c\x0c\x0b\x06\x02\x0a\x15\x10\x0b\ +\x0f\x00?3?33\x129/+\x11\x003\x11\x12\ +\x01\x179\x113\x113\x113\x113310\x01\x01\ +#\x03#\x11#\x11#\x03#\x01\x03!\x02'#\x06\ +\x06\x021\x01\xc3e\xd1\x8fb\x8e\xceg\x01\xc5o\x01\ +>t(\x06\x19/\x04?\xfb\xc1\x01\xf4\xfe\x0c\x01\xf4\ +\xfe\x0c\x04?\xfe\x07\x01\x1fzQ\x84\x00\x02\x00\xcf\x00\ +\x00\x06\xe3\x05\xbc\x00\x13\x00\x1a\x00c@5\x11\x10\x15\ +\x00\x13\x05\x08\x0f\x14\x04\x18\x07\x02\x03\x13\x12\x06\x07\x0e\ +\x0a\x0a\x0b\x03\x07\x0b\x12\x18\x05\x1c\x1b\x18\x0b\x0c\x05\x01\ +\x09\x0e\x09JY\x14\x0e\x0e\x0b\x10\x0c\x03\x03\x07\x13\x03\ +\x0b\x12\x00?\x173?\xc6\x119/3+\x11\x003\ +3\x11\x129\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x113\x11\x12\x179\x11992210\x01#\ +\x11#\x11#\x01#\x01!\x11#\x113\x11!\x013\ +\x01#\x01!\x03&'\x06\x06\x05H\xb7b\xb2\xfe\xcf\ +o\x013\xfe%ff\x02\x04\x01\x171\x02br\xfd\ +3\x01}y\x22 \x10!\x02\xcf\xfd1\x02\xcf\xfd1\ +\x02\xcf\xfd1\x05\xb6\xfdw\x02\x8f\xfaD\x03-\x01%\ +Ue3W\x00\x00\x02\x00\xb6\x00\x00\x05h\x04?\x00\ +\x13\x00\x1a\x00e@=\x13\x00\x18\x02\x01\x05\x06\x09\x0a\ +\x11\x0d\x0d\x0e\x01\x03\x06\x08\x0a\x0b\x0e\x12\x14\x15\x18\x0b\ +\x1c\x1b\x08\x04\x0c\x11\x0cHY\x14P\x11`\x11\x90\x11\ +\xa0\x11\xc0\x11\x05\x11\x11\x0e\x13\x0f\x0f\x02\x06\x0a\x03\x0e\ +\x15\x18\x13\x0f\x00?3?\x173?\x11\x129/]\ +3+\x11\x0033\x11\x12\x01\x179\x113\x113\x11\ +3\x113\x113\x113310\x01\x01#\x03#\x11\ +#\x11#\x03#\x13!\x11#\x113\x11!\x13\x03!\ +\x02'#\x06\x06\x03\xa6\x01\xc2d\xdd\x83b\x7f\xdef\ +\xdd\xfe\xbdcc\x01f\xc5a\x01#r\x1d\x06\x19/\ +\x04?\xfb\xc1\x02\x14\xfd\xec\x02\x14\xfd\xec\x02\x10\xfd\xf0\ +\x04?\xfe'\x01\xd9\xfe'\x01\x19`P\x83\x00\x02\x00\ +\x19\x00\x00\x05s\x05\xb6\x00\x1e\x00!\x00m@;\x1f\ +\x01 \x1d\x1c\x02!!\x0e\x0e\x0f\x08\x07\x16\x17\x01\x07\ +\x0f\x17\x1d\x05#\x22!\x1c\x1e\x0d\x11\x1c\x11LY\x02\ +\x00\x1c \x1c0\x1c\x03\x15\x03\x1c\x1c\x1e\x0f\x08\x17\x12\ +\x01\x1d \x1e\x1e JY\x1e\x03\x00?+\x11\x12\x00\ +99\x18?33\x129/_^]3+\x11\x00\ +3\x11\x129\x11\x12\x01\x179\x113\x113\x113\x12\ +9\x1133\x113\x11310\x01\x15\x01\x1e\x02\x12\ +\x13#\x03&&##\x11#\x11#\x22\x06\x06\x07\x03\ +#\x13>\x027\x015\x05!\x01\x04\xec\xfeIy\x9f\ +h\x5cbi\x93-\x92\x9d#g\x22m|R \x93\ +h\x8b/h\xa1x\xfeJ\x03\xcf\xfc\xb0\x01\xa8\x05\xb6\ +V\xfd\xdf\x03F\x8a\xfe\xd6\xfe\xbe\x01\xe3\x94p\xfd\x19\ +\x02\xe7/mh\xfe\x1d\x01\xc9\x9e\x8dH\x03\x02!V\ +^\xfd\xf2\x00\x02\x00\x0a\x00\x00\x04\xcf\x04?\x00\x1d\x00\ + \x00m@<\x1e\x01\x1f\x1c\x1b\x02 \x0e\x0f\x08\ +\x07\x0e\x0f\x15\x16\x01\x07\x0f\x16\x1c\x05\x22!\x0d\x11\x1b\ +\x11HY \x02\x00\x1b\x10\x1b \x1bP\x1b\x04\x17\x03\ +\x1b\x1b\x1d\x0f\x08\x16\x15\x01\x1c\x1f\x1d\x1d\x1fHY\x1d\ +\x0f\x00?+\x11\x12\x0099\x18?33\x129/\ +_^]33+\x11\x003\x11\x12\x01\x179\x113\ +\x113\x113\x11\x129\x1133\x113\x11310\ +\x01\x15\x01\x1e\x02\x17\x13#\x03&&##\x11#\x11\ +#\x22\x06\x07\x03#\x13>\x027\x015\x05!\x01\x04\ +;\xfe\xaa]}Y6\x81i\x85,}u%c\x22\ +w}+\x87i\x810Z\x7f`\xfe\xa8\x03)\xfdM\ +\x01[\x04?S\xfe\x8b\x078k\x85\xfe\xb8\x01Xs\ +T\xfd\xe1\x02\x1fTq\xfe\xa6\x01H|r;\x06\x01\ +uSV\xfe\x84\x00\x02\x00\xcf\x00\x00\x07q\x05\xb6\x00\ +$\x00'\x00~@E\x1b\x0f\x17%\x01&#\x22\x02\ +''\x0e\x0f\x08\x07\x0e\x0f\x16\x17!\x1d\x1d\x1e\x01\x07\ +\x0f\x17\x1e#\x06)(\x11\x0d\x1c!\x1cJY\x02'\ +\x00!\x10!\x02\x17\x03!!$\x08\x0f\x17\x03\x1e\x12\ +#\x01\x1f\x03&$$&JY$\x03\x00?+\x11\ +\x12\x00\x179\x18?\x173\x129/_^]33\ ++\x11\x0033\x11\x12\x01\x179\x113\x113\x113\ +\x113\x113\x11\x129\x1133\x113\x113\x11\x12\ +910\x01\x15\x01\x1e\x02\x17\x13#\x03&&##\ +\x11#\x11#\x22\x06\x06\x07\x03#\x13667!\x11\ +#\x113\x11!\x015\x05!\x01\x06\xe9\xfeJ~\xa1\ +g,\x8ci\x93,\x8f\xa1#g\x22u{N\x1d\x93\ +h\x8b\x1cB5\xfe\x00ff\x03%\xfeB\x03\xce\xfc\ +\xb1\x01\xac\x05\xb6V\xfd\xd1\x04D\x8c\x94\xfe7\x01\xe3\ +\x90f\xfd'\x02\xd9-i`\xfe\x1d\x01\xc9^\x86,\ +\xfd'\x05\xb6\xfd\x81\x02)V^\xfd\xe5\x00\x00\x02\x00\ +\xb6\x00\x00\x06Z\x04?\x00#\x00&\x00r@=\x1a\ +\x0f\x16$\x01%\x22!\x02&&\x0e\x0e\x0f\x08\x07\x15\ +\x16 \x1c\x1c\x1d\x01\x07\x0f\x16\x1d\x22\x06('\x11\x0d\ +\x1b \x1bHY\x02& #\x08\x0f\x16\x03\x1d\x15\ +\x22\x01\x1e\x03%##%HY#\x0f\x00?+\x11\ +\x12\x00\x179\x18?\x173\x129/33+\x11\x00\ +33\x11\x12\x01\x179\x113\x113\x113\x113\x11\ +3\x129\x1133\x113\x113\x11\x12910\x01\ +\x15\x012\x16\x16\x17\x13#\x03&&##\x11#\x11\ +#\x22\x06\x07\x03#\x13667!\x11#\x113\x11\ +!\x015\x05!\x01\x05\xc7\xfe\x9dd\x85Y3\x81h\ +\x85*t{+b+|t)\x87f\x81\x186*\ +\xfe\x8acc\x02v\xfe\x98\x03)\xfdN\x01Z\x04?\ +S\xfe|5i\x82\xfe\xb8\x01XmK\xfd\xf0\x02\x10\ +Kk\xfe\xa6\x01H>e%\xfd\xf0\x04?\xfe'\x01\ +\x86SV\xfe\x84\x00\x01\x00R\xfeh\x04\x06\x06\xcb\x00\ +I\x00\x8e@RG6<\x02',\x00$\x06\x0c\x1e\ +\x00\x06\x14\x1e'3870\x0d\x02\x1ff\ +'\x02\x0dc`kj\x14\x13jil`V\x00\xff\ +\xff\x00{\x00\x00\x05\x8d\x05\xb6\x02\x06\x01u\x00\x00\xff\ +\xff\x00\xa6\xfe\x14\x05?\x06\x12\x02\x06\x01\x95\x00\x00\x00\ +\x03\x00\x81\xff\xec\x05\x9c\x05\xcd\x00\x0b\x00\x12\x00\x19\x00\ +M@+\x17\x0f\x0f\x00\x16\x10\x10\x06\x06\x00\x1b\x1a\x16\ +\x10JY\x0f\x16?\x16_\x16o\x16\x04\x0b\x03\x16\x16\ +\x03\x09\x09\x13KY\x09\x04\x03\x0cKY\x03\x13\x00?\ ++\x00\x18?+\x11\x12\x009\x18/_^]+\x11\ +\x12\x0199\x113\x113\x113\x11310\x01\x10\ +\x00! \x00\x11\x10\x00! \x00\x01 \x00\x13!\x12\ +\x00\x01\x22\x00\x03!\x02\x00\x05\x9c\xfe\xa4\xfe\xce\xfe\xcf\ +\xfe\xa4\x01_\x010\x012\x01Z\xfdr\x01\x00\x01\x17\ +\x08\xfb\xc3\x08\x01\x17\x01\x01\xfa\xfe\xea\x0e\x049\x0d\xfe\ +\xe9\x02\xdd\xfe\xa4\xfek\x01\x95\x01^\x01]\x01\x91\xfe\ +m\xfc\x12\x01@\x01.\xfe\xd5\xfe\xbd\x05\x1e\xfe\xcd\xfe\ +\xe2\x01 \x011\x00\x03\x00w\xff\xec\x049\x04T\x00\ +\x0c\x00\x13\x00\x1a\x00M@+\x18\x10\x17\x11\x10\x00\x11\ +\x07\x07\x00\x1c\x1b\x17\x11HY\x0f\x17\x1f\x17?\x17O\ +\x17\x04\x0b\x03\x17\x17\x03\x0a\x0a\x14FY\x0a\x10\x03\x0d\ +FY\x03\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/_^]+\x11\x12\x0199\x113\x113\x113\ +\x11310\x01\x10\x00#\x22&\x025\x10\x0032\ +\x12\x01267!\x16\x16\x13\x22\x06\x07!&&\x04\ +9\xfe\xfe\xe3\x8f\xdat\x01\x02\xe1\xe0\xff\xfe\x1f\xae\xc5\ +\x06\xfd\x0e\x04\xc6\xad\xa5\xc2\x0e\x02\xee\x10\xc5\x02!\xfe\ +\xf6\xfe\xd5\x8a\x01\x02\xa9\x01\x0a\x01)\xfe\xd3\xfd\x1f\xed\ +\xd7\xd3\xf1\x03\xb4\xd7\xc1\xc4\xd4\x00\x01\x00\x00\x00\x00\x05\ +\x0c\x05\xc3\x00\x16\x00.@\x16\x15\x08\x07\x06\x05\x0b\x0b\ +\x07\x18\x17\x0b\x06\x07\x03\x06\x12\x12\x00LY\x12\x04\x00\ +?+\x00\x18??\x129\x11\x12\x0199\x1133\ +\x113210\x01\x22\x06\x06\x07\x01#\x013\x01\x16\ +\x1767\x13>\x0232\x17\x15&\x04\xba1>;\ +3\xfe\x9e^\xfd\xe3m\x01fU$,Q\xb0@P\ +_J0**\x05h4{\x94\xfb\xdb\x05\xb6\xfc8\ +\xeay\xa4\xee\x02\x14\xc0\x92@\x0fZ\x0e\x00\x00\x01\x00\ +\x00\x00\x00\x03\xfe\x04T\x00\x16\x00,@\x15\x10\x02\x01\ +\x16\x00\x05\x05\x01\x18\x17\x01\x0f\x0d\x12HY\x0d\x10\x05\ +\x00\x15\x00?2?+\x00\x18?\x11\x12\x0199\x11\ +33\x113210!\x013\x01\x16\x17367\ +\x13>\x0232\x17\x15&#\x22\x06\x07\x01\x01\xa4\xfe\ +\x5cf\x01\x17I\x17\x06%N}$EL;\x1e\x1d\ +\x1d\x1c-D'\xfe\xf0\x04?\xfd#\xbbS\x82\xeb\x01\ +tm|6\x08X\x08av\xfc\xdb\xff\xff\x00\x00\x00\ +\x00\x05\x0c\x07s\x02&\x02\x80\x00\x00\x01\x07\x03v\x04\ +\xa8\x01R\x00\x0a\xb4\x02\x01\x22\x05&\x00+55\xff\ +\xff\x00\x00\x00\x00\x03\xfe\x06!\x02&\x02\x81\x00\x00\x01\ +\x07\x03v\x045\x00\x00\x00\x0a\xb4\x02\x01\x22\x11&\x00\ ++55\x00\x03\x00\x81\xfe\x14\x09\x1f\x05\xcd\x00\x0b\x00\ +\x17\x000\x00S@,0\x1c\x1c\x18 !\x19\x18\x12\ +\x00\x0c\x06\x00\x06\x18!)\x05210\x1c+ \x18\ +\x0f\x03\x0fKY\x03\x13\x09\x15KY\x09\x04&+L\ +Y&\x1b\x00?+\x00\x18?+\x00\x18?+\x00\x18\ +?3\x1299\x11\x12\x01\x179\x113\x113\x113\ +\x113\x129\x11310\x01\x10\x00! \x00\x11\x10\ +\x00! \x00\x01\x10\x1232\x12\x11\x10\x02#\x22\x02\ +%3\x12\x12\x17366\x013\x01\x0e\x02#\x22'\ +5\x16326677\x05\x0c\xfe\xc8\xfe\xf1\xfe\xec\ +\xfe\xd0\x018\x01\x10\x01\x15\x01.\xfb\xe4\xef\xe6\xe8\xf1\ +\xf0\xe5\xe8\xf1\x04\x83f\xa9\xae\x14\x06\x0aW\x01\x0dg\ +\xfe\x185RlN9F:C3M>)7\x02\ +\xdd\xfe\xa2\xfem\x01\x8c\x01g\x01\x5c\x01\x92\xfep\xfe\ +\xa0\xfe\xc3\xfe\xac\x01O\x01B\x01@\x01M\xfe\xb2#\ +\xfe>\xfe5P#\xf3\x02\xc7\xfb\x11\x8ev8\x15V\ +\x10/ak\x96\xff\xff\x00w\xfe\x14\x08-\x04T\x00\ +&\x00R\x00\x00\x00\x07\x00\x5c\x04\x81\x00\x00\x00\x02\x00\ +\x81\xff\xa8\x05\xd9\x06\x0c\x00\x13\x00(\x00P@+\x03\ +\x07\x0d\x11\x17\x1b\x06!!&\x1e\x00\x14\x0a\x00\x0a&\ +\x03*)\x19\x1b\x17\x07\x17JY\x05\x03\x07\x13$!\ +&\x0f\x11\x0d\x0d&KY\x0d\x04\x00?+\x11\x003\ +3\x1133\x18?33+\x11\x0033\x11\x12\x01\ +\x179\x113\x113\x113\x12\x17910\x01\x10\x00\ +\x05\x06#\x22'$\x00\x11\x10\x00%632\x17\x04\ +\x00\x01\x10\x12\x17632\x176\x12\x11\x10\x02'\x06\ +\x06#\x22'\x06\x02\x05\xd9\xfe\xca\xfe\xea\x15KI\x15\ +\xfe\xe8\xfe\xca\x019\x01\x15\x15IK\x15\x01\x16\x016\ +\xfb\x17\xf6\xe7\x11OO\x11\xea\xf3\xf4\xe7\x096#O\ +\x11\xe4\xf9\x02\xdd\xfe\xc1\xfer\x1eJJ\x1d\x01\x8f\x01\ +A\x01>\x01\x8d\x1dEE\x1e\xfet\xfe\xc0\xfe\xe3\xfe\ +\xad\x1dPN\x1d\x01O\x01\x1f\x01\x1e\x01L\x1d*&\ +P\x1d\xfe\xb5\x00\x00\x02\x00w\xff\xac\x04b\x04\x9a\x00\ +\x13\x00'\x00P@+\x03\x07\x17\x1b!%\x06\x11\x11\ +\x0d\x1e\x00\x14\x0a\x00\x0a\x0d\x03)(\x19\x1b\x17\x07\x17\ +FY\x05\x03\x07\x16#!%\x0f\x11\x0d\x0d%FY\ +\x0d\x10\x00?+\x11\x0033\x1133\x18?33\ ++\x11\x0033\x11\x12\x01\x179\x113\x113\x113\ +\x12\x17910\x01\x14\x02\x07\x06#\x22'&\x025\ +4\x127632\x17\x16\x12\x05\x14\x16\x17632\ +\x176654&'\x06#\x22'\x06\x06\x04b\xd9\ +\xc2\x13JD\x14\xbe\xdd\xd8\xc1\x0eLM\x12\xc3\xd6\xfc\ +}\xa0\x91\x13GJ\x13\x94\x9f\xa0\x95\x15FC\x15\x95\ +\x9e\x02!\xee\xfe\xde\x1dHF\x1d\x01(\xea\xed\x01#\ +\x1dLL\x1d\xfe\xda\xea\xc4\xf2\x1dHH\x1e\xf4\xc1\xc1\ +\xf2\x1eBB\x1c\xf1\x00\x00\x03\x00\x81\xff\xec\x07B\x08\ +-\x002\x00C\x00Y\x00|@G\x09\x1693O\ +P0##P)7>\x03\x1c3\x10Y\x16\x0b[\ +ZYDDA\x00O\x10O O\x03\x09OO6\ +KT7\x006\x106\x02\x11\x036&\x0c-&-\ +KY\x1d \x03\x00\x13&\x04\x06\x00 \x00KY\x19\ + \x13\x00?3+\x11\x003\x18?3\x129\x129\ ++\x11\x003\x18\x10\xc6_^]2\xc42\x119/\ +^]33/3\x11\x12\x01\x179\x113\x113\x11\ +3\x11310%267\x16\x1632\x12\x11\x10\ +\x02#\x22\x06\x07'6632\x12\x11\x10\x00#\x22\ +&'#\x06\x06#\x22\x00\x11\x10\x1232\x16\x17\x07\ +&&#\x22\x02\x11\x10\x12\x01\x14\x06\x075654\ +.\x0254632\x16%#\x22''&&#\ +\x22\x06\x15\x15#54632\x16\x17\x163\x02\xa2\ +^\x97JT\xa1_\xc4\xd8\xb6\x9c?_/+Ds\ +G\xd4\xe9\xfe\xf2\xf7o\x9dN\x04L\x9bo\xfa\xfe\xf2\ +\xf8\xd9ItA+H\x5c/\xa4\xbc\xe3\x02\x87fg\ +\x7f\x1d$\x1d( .6\x01\x1d\x0cp\x7fCTC\ +%8?Zif2`\x82usL<=?:\ +\x01f\x01D\x01&\x01N\x22\x19^$\x1c\xfe\x83\xfe\ +\xa8\xfe\x91\xfec+55+\x01\x9b\x01q\x01T\x01\ +\x81\x1d#^$\x17\xfe\xb4\xfe\xd8\xfe\xba\xfe\x9c\x06\x95\ +Sg\x1d8&D\x18\x16\x12\x17\x1a\x1f$FD1\ +\x19 \x0f:K\x08\x08hs\x1a4/\x00\x00\x03\x00\ +w\xff\xec\x05\xaa\x06\xf8\x00+\x00=\x00R\x00\x86@\ +N3,HI\x1b'\x11\x05\x00\x05\x0b\x16!',\ +08IR\x0bTSR>>;HHM0\x00\ +/\x01\x00/\x10/\xf0/\x03\x09/D\x0fM\x01\x10\ +\x03M@\x09\x0dHM\x09\x00\x02\x16\x09\x14\x1e\x0e\x09\ +\x0eHY#\x09\x10\x18\x14\x02\x14FY*\x02\x16\x00\ +?3+\x11\x003\x18?3+\x11\x003\x11\x129\ +\x119\x18\x10\xc4+_^]2\xc6^]q2\x11\ +9/33/3\x11\x12\x01\x179\x113\x113\x11\ +3\x11310%\x06#\x22\x02\x114\x12632\ +\x17\x07&#\x22\x06\x15\x14\x16327\x16326\ +54&#\x22\x07'632\x16\x12\x15\x10\x02#\ +\x22\x13\x14\x06\x0756654.\x025463\ +2\x16%#\x22'&&#\x22\x06\x15\x15#54\ +632\x16\x17\x163\x03\x0cby\xd6\xe4W\xa5n\ +{R!RK\x85\x8c\xb4\xa6mjnn\xa6\xb0\x82\ +zNR\x1fR{h\x9bS\xe6\xd4\x80\x0fgf9\ +F\x1d$\x1d( .6\x01\x1d\x0dq~\x96E#\ +8?Zif2`\x82us%9\x01\x1d\x01\x10\ +\xb4\x01\x00\x87-V+\xf7\xea\xec\xe9CC\xe9\xec\xe9\ +\xf8+V-\x86\xfe\xfe\xb3\xfe\xf4\xfe\xdf\x05\xc0Tf\ +\x1d7\x117#\x18\x16\x11\x18\x19\x1f%FD19\ +\x0f:K\x09\x09hs\x1a4/\x00\x00\x02\x00\x81\xff\ +\xec\x07B\x07\x04\x00\x0d\x00C\x00q@>\x18&A\ +3-\x12\x12\x11\x00\x03\x06\x07\x0a\x0d\x11&39\x0a\ +ED\x13\x10\x0e-6\x11\x1106\x05\x09\x09\x0d@\ +\x09\x0fH\x0d\x07\x03\x0b6@\x1c=6=KY#\ +6\x04\x15\x0e0\x0eKY)0\x13\x00?3+\x11\ +\x003\x18?3+\x11\x003\x1a\x18\x10\xde22\xcd\ ++2\x113\x11\x129/\x119\x1133\x11\x12\x01\ +\x179\x113\x129\x113\x11310\x01\x15\x07#\ +'#\x07#'#\x07#'5\x1327\x113\x11\ +\x1632\x12\x114\x02&#\x22\x06\x07'663\ +2\x12\x11\x10\x00#\x22&'#\x06\x06#\x22\x00\x11\ +\x10\x1232\x16\x17\x07&&#\x22\x06\x02\x15\x10\x12\ +\x05{P\x0c6\xca8\x0c7\xcb5\x0cPZ\xa5g\ +fn\xb3\xc4\xdaS\x9ag?_/+DsG\xd4\ +\xe9\xfe\xf2\xf7o\x9dN\x04L\x9bo\xfa\xfe\xf2\xf8\xd9\ +ItA+H\x5c/k\xa1V\xe5\x07\x04\x1b\xacu\ +uuu\xac\x1b\xf9HP\x01\xfa\xfe\x08R\x01i\x01\ +A\xc1\x01\x1d\x96\x22\x19^$\x1c\xfe\x83\xfe\xa8\xfe\x91\ +\xfec+55+\x01\x9b\x01q\x01T\x01\x81\x1d#\ +^$\x17\x94\xfe\xe3\xc3\xfe\xbc\xfe\x9a\x00\x02\x00\x00\x00\ +\x00\x05\xb8\x05\xa4\x00\x0d\x00)\x00l@;\x0a\x03\x00\ +\x0d\x1c\x0e)\x1d)( \x13\x12\x19$%\x06\x07\x1e\ +\x03\x1d\x15\x14\x00\x0d\x14\x19\x1d %\x07+*\x1c\x0e\ +)\x14\x05\x09\x09\x0d@\x09\x0fH\x0d\x07\x03\x0b$\x1d\ +\x14\x0f \x13\x19\x03)\x15\x00?\x173?33\xde\ +22\xcd+2\x113\x11\x1299\x11\x12\x01\x179\ +\x113\x11\x173\x113\x1133\x1133\x11\x129\ +9\x11\x129910\x01\x15\x07#'#\x07#'\ +#\x07#'5\x01\x07\x06\x06\x03#\x013\x13\x16\x13\ +366\x13\x033\x13\x1336\x12\x113\x10\x02\x07\ +#\x04\x9cP\x0d5\xcb7\x0c7\xcb5\x0dP\x01\x8a\ +\x1e%\x12\xafg\xfeyh\xd1'a\x06\x22Q\x93\xa6\ +f\xd1\x94\x06\xb2\xb0^\xc6\xd7e\x05\xa4\x1b\xacuu\ +uu\xac\x1b\xfcjAR&\xfe\xab\x04?\xfd\xbfj\ +\xfe\xd2M\xa5\x01\x1b\x01\xcc\xfd\xbf\xfeZ\xb2\x01\xe9\x01\ +L\xfe\x91\xfe\x09\xd9\x00\x00\x01\x00\x81\xfe\x14\x04\xb8\x05\ +\xcb\x00\x17\x00/@\x18\x0b\x08\x03\x0f\x08\x0f\x15\x03\x19\ +\x18\x0a\x1b\x13\x00LY\x13\x04\x0c\x06KY\x0c\x13\x00\ +?+\x00\x18?+\x00\x18?\x11\x12\x01\x179\x113\ +\x11310\x01 \x00\x11\x10\x00!27\x11#\x11\ +# \x00\x114\x12$32\x17\x07&\x03?\xfe\xed\ +\xfe\xc4\x01:\x01\x1cE:g!\xfe\xae\xfe\x96\xa9\x01\ +=\xd2\xd6\xa9)\xa0\x05o\xfe\xa0\xfe\xce\xfe\xc4\xfe\xab\ +\x0a\xfd\xbe\x01\xd8\x01\x86\x01m\xdf\x01T\xb9P\x5cP\ +\x00\x00\x01\x00w\xfe\x14\x03\x85\x04T\x00\x16\x00+@\ +\x16\x05\x02\x02\x09\x0e\x03\x18\x17\x04\x1b\x0c\x11FY\x0c\ +\x10\x06\x00GY\x06\x16\x00?+\x00\x18?+\x00\x18\ +?\x11\x12\x01\x179\x11310%27\x11#\x11\ +#\x22\x00\x11\x10\x0032\x17\x07&#\x22\x06\x15\x14\ +\x16\x02{LGd+\xf9\xfe\xf1\x01\x12\xee\x8d\x81\x1b\ +\x8dh\xc8\xce\xd5H\x14\xfd\xb8\x01\xd5\x01\x1f\x01\x11\x01\ +\x0e\x01-1X/\xf7\xe8\xdf\xf4\x00\x00\x01\x00s\x00\ +\x06\x04d\x05\x00\x00\x13\x00D@*\x00\x0d\x10\x11\x04\ +\x0c\x01\x03\x06\x07\x0a\x04\x0b\x02\x0b\x0c\x01\x02\x02\x04\x08\ +\x0c\x0e\x12\x06\x15\x14\x13\x00\x03\x11\x06\x0f\x05\x10\x07\x0d\ +\x0a\x09\x0c\x0b\x01\x00/\xcd\x179\x11\x12\x01\x179\x11\ +3\x113\x11\x12\x179\x11\x12\x17910\x01\x03'\ +\x13%7\x05\x13%7\x05\x13\x17\x03\x05\x07%\x03\x05\ +\x07\x01\xf4\xc5R\xc5\xfe\xd1)\x01/\xed\xfe\xcd+\x01\ +1\xc3P\xc5\x015-\xfe\xcf\xe9\x011'\x01\x5c\xfe\ +\xaa-\x01V\xb2J\xb4\x01\x97\xb5I\xb4\x01N-\xfe\ +\xb0\xb2J\xb4\xfei\xb4J\x00\x00\x01\x00\xdb\x04\x9a\x03\ +\x98\x05\xa0\x00\x13\x00 @\x0d\x04\x0a\x0e\x00\x0a\x00\x15\ +\x14\x11\x0e\x07\x0e\x03\x00/33\x113\x11\x12\x019\ +9\x113\x11310\x13463!6632\ +\x16\x15\x14\x06#!\x06\x06#\x22&\xdb11\x01\xb9\ +\x06%'((,7\xfeH\x06&&((\x04\xf0\ +1#3)%1.$3+$\x00\x01\x01\x04\x04\ +\xe5\x03\xcf\x05\xc9\x00\x15\x00$@\x11\x0b\x0a\x15\x0a\x17\ +\x16\x00\x15\x15\x0f\x06@\x09\x0dH\x06\x0b\x00/\xcc+\ +23/3\x11\x12\x0199\x11310\x0126\ +76632\x16\x15\x15#54&#\x22\x06\x07\ +\x06##\x01\x04=zp9f6dkZ?8\ +&I\x90~q\x0c\x05L\x1a-\x17\x1fqj\x09\x09\ +K:\x1171\x00\x01\x01\xe5\x04\xdf\x02\xb2\x065\x00\ +\x10\x00\x1a@\x0b\x0b\x00\x00\x06\x0d\x03\x12\x11\x03\xc0\x0e\ +\x00/\x1a\xcc\x11\x12\x01\x179\x11310\x0146\ +32\x16\x15\x14\x0e\x02\x15\x14\x17\x15&&\x01\xe56\ +/ '\x1d$\x1d\x7ffg\x05\xb69F$\x1f\x1a\ +\x17\x12\x16\x18D&8\x1dg\x00\x01\x01\xec\x04\xdf\x02\ +\xb8\x065\x00\x10\x00\x1a@\x0b\x06\x00\x00\x04\x0b\x03\x12\ +\x11\x0e\xc0\x03\x00/\x1a\xcc\x11\x12\x01\x179\x1131\ +0\x01\x14\x06\x075654.\x0254632\ +\x16\x02\xb8ff~\x1d$\x1d( .6\x05\xb6S\ +g\x1d8&D\x18\x16\x12\x17\x1a\x1f$F\x00\x08\x00\ +)\xfe\xc1\x07\xc1\x05\x91\x00\x0c\x00\x1a\x00(\x006\x00\ +D\x00R\x00_\x00m\x00\xe4@8\x00\x0c\x06\x077\ +D=>S_YZ\x1b(!\x22\x0d\x1a\x13\x14)\ +6/0`mfgERKL\x07\x0c\x14\x1a\x22\ +(06>DLRZ_gm\x10on)\x22\ +\x1b\x030\xb8\xff\xc0@\x0f\x09\x0fH03\x1e,,\ +%3mZS\x03f\xb8\xff\xc0@\x0f\x09\x0fHf\ +jVcc\x5cjE>7\x03L\xb8\xff\xc0@\x1d\ +\x09\x0fHLO:HHAO3jOOj3\ +\x03\x09\x10\x17@\x09\x0fH\x17\x0d\x14\x00\x07\xb8\xff\xc0\ +\xb5\x09\x0fH\x07\x03\x09\x00/3\xcd+2/3\xcd\ ++2\x11\x179///\x1133\x113\x10\xcd+\ +\x172\x1133\x113\x10\xcc+\x172\x1133\x11\ +3\x10\xcd+\x172\x11\x12\x01\x179\x113\x113\x11\ +3\x113\x113\x113\x113\x113\x113\x113\x11\ +3\x113\x113\x113\x113\x11310\x01&&\ +#\x22\x06\x07#632\x16\x17\x03&&#\x22\x06\ +\x07#6632\x16\x17\x01&&#\x22\x06\x07#\ +6632\x16\x17!&&#\x22\x06\x07#66\ +32\x16\x17\x01&&#\x22\x06\x07#6632\ +\x16\x17!&&#\x22\x06\x07#6632\x16\x17\ +\x01&&#\x22\x06\x07#632\x16\x17!&&\ +#\x22\x06\x07#6632\x16\x17\x04o\x07L3\ +=A\x07K\x0b\xc5]q\x07O\x07L3=A\x07\ +K\x05dg\x5cs\x06\x01\xf4\x06L3>A\x06L\ +\x05eg\x5cs\x06\xfb/\x06L3>A\x06L\x05\ +eg\x5cs\x06\x041\x06L3>A\x06L\x05e\ +g\x5cs\x06\xfb/\x06L3>A\x06L\x05eg\ +\x5cs\x06\x04\xf0\x07K3>A\x07K\x0b\xc6\x5cs\ +\x06\xf9\xbe\x05E;>A\x06L\x05eg\x5cs\x06\ +\x04\xcf930<\xc2e]\xf9\xf2930\x17\x07\x00\x04\x0f\ +\x03\x13\x13\x0b\x02\x07\x0b\x0d\x04\x1c\x1b\x03\x0d\x0e\x0dI\ +Y\x00\x00\x0e\x01\x0c\x03\x0e\x0e\x04\x10\x04\x12GY\xe0\ +\x04\x01\x1f\x04\x01\x0f\x04?\x04\xaf\x04\x03\x0b\x03\x04\x04\ +\x0b\x10\x00\x0b\x13GY\x0b\x15\x00?+\x00\x18?\x12\ +9/_^]q]+\x11\x12\x009\x18/_^\ +]3+\x11\x003\x11\x12\x01\x179\x113\x12\x179\ +\x11310\x01!\x15!\x11! \x11\x14\x06#!\ +\x11#53\x113\x11\x11!2654&#\x01\ +\x19\x01`\xfe\xa0\x01\x7f\x01\x7f\xd6\xc8\xfe=\x9b\x9bc\ +\x01p\x8e\x97\x8a\xa7\x05\x0cR\xfd\xbb\xfe\xd3\x9b\xad\x04\ +\xbaR\x01\x08\xfc\x03\xfeGxtla\x00\x00\x02\x00\ +\xcf\x00\x00\x04?\x05\xb6\x00\x0e\x00\x1c\x00]@2\x03\ +\x05\x06\x12\x14\x15\x06\x04\x13\x18\x00\x0f\x0a\x0a\x0b\x00\x04\ +\x0b\x13\x04\x1e\x1d\x14\x0f\x0c\x05\x0b\x03\x06\x0c\x09\x15\x12\ +\x1c\x0f\x0f\x09LY\x0f\x0f\x0c\x0b\x12\x0c\x1cLY\x0c\ +\x03\x00?+\x00\x18?\x129/+\x11\x12\x0099\ +\x11\x1299\x129\x11\x129\x11\x12\x01\x179\x113\ +\x113\x113\x11\x12\x17910\x01\x14\x06\x07\x17\x07\ +'\x06##\x11#\x11! \x01327'7\x17\ +6654&##\x04?pkyE\x88e\x94\ +\xe2f\x01f\x02\x0a\xfc\xf6\xcd\x81XuF\x83RP\ +\xd0\xda\xf2\x04\x12\x80\xbd7\xa85\xbc!\xfd\xa4\x05\xb6\ +\xfc\xfe\x15\xa43\xb9'\x8er\xa9\xa3\x00\x02\x00\xb6\xfe\ +\x14\x04L\x04T\x00\x17\x00'\x00f@7\x13\x15\x16\ +\x1a\x1c\x1d\x06\x14\x1b\x1f\x11%\x0c\x07\x07\x08\x08\x11\x14\ +\x1b\x04)(\x13\x16\x0e\x00\x1d\x1a\x1c!\x18\x03\x0e\x15\ +\x08\x0b\x00\x0e\x09\x0f\x08\x1b\x0e!FY\x0e\x10\x00\x18\ +HY\x00\x16\x00?+\x00\x18?+\x00\x18??\x11\ +\x129\x119\x119\x11\x12999\x11\x1299\x11\ +\x12\x01\x179\x113\x1133\x113\x11\x12\x1791\ +0\x05\x22'#\x17\x16\x15\x11#\x113\x17363\ +2\x12\x11\x10\x07\x17\x07'\x06'27'7\x176\ +\x11\x10!\x22\x06\x15\x15\x14\x16\x02\x87\xfbs\x07\x03\x04\ +cT\x13\x06p\xf6\xdc\xe7\xacyF{ZyXF\ +\x81E\x81{\xfe\xa6\xbe\xb2\xab\x14\xbcTJX\xfeb\ +\x06+\x9b\xb0\xfe\xdf\xfe\xec\xfe\xc1\x92\xa85\xac1X\ +\x22\xb73\xb6{\x01\x06\x01\xdf\xd1\xec \xff\xda\x00\x00\ +\x01\x00/\x00\x00\x03\xf0\x05\xb6\x00\x0d\x00D@%\x09\ +\x00\x04\x04\x05\x02\x05\x07\x0c\x04\x0f\x0e\x03\x07\x08\x07J\ +Y\x00\x0f\x08?\x08\x02\x0b\x03\x08\x08\x0a\x05\x12\x0a\x0d\ +JY\x0a\x03\x00?+\x00\x18?\x129/_^]\ +3+\x11\x003\x11\x12\x01\x179\x113\x12991\ +0\x01!\x15!\x11#\x11#53\x11!\x15!\x01\ +5\x01\xb7\xfeIf\xa0\xa0\x03!\xfdE\x03\x04^\xfd\ +Z\x02\xa6^\x02\xb2^\x00\x01\x00\x12\x00\x00\x035\x04\ +?\x00\x0d\x00H@)\x0b\x02\x06\x06\x07\x00\x04\x07\x09\ +\x04\x0f\x0e\x05\x09\x0a\x09HY\x02\x0f\x0a\x1f\x0aO\x0a\ +_\x0a\x04\x0e\x03\x0a\x0a\x0c\x07\x15\x0c\x01HY\x0c\x0f\ +\x00?+\x00\x18?\x129/_^]3+\x11\x00\ +3\x11\x12\x01\x179\x113\x129910\x01!\x11\ +!\x15!\x11#\x11#53\x11!\x035\xfd\xe4\x01\ +n\xfe\x92c\xa4\xa4\x02\x7f\x03\xe9\xfegV\xfe\x06\x01\ +\xfaV\x01\xef\x00\x00\x01\x00\xcf\xfe\x00\x04\x9c\x05\xb6\x00\ +\x1c\x00G@'\x14\x09\x03\x1a\x1a\x1b\x01\x09\x0f\x1b\x04\ +\x1e\x1d\x05\x17LY\x0f\x05\x01\x0b\x03\x05\x05\x1c\x1b\x12\ +\x1c\x02JY\x1c\x03\x0c\x11JY\x0c\x1c\x00?+\x00\ +\x18?+\x00\x18?\x129/_^]+\x11\x12\x01\ +\x179\x113\x113\x11310\x01\x15!\x1163\ +2\x04\x12\x15\x10\x00#\x22'5\x1632\x12\x11\x10\ +\x00!\x22\x07\x11#\x11\x04\x04\xfd1sl\xcb\x01%\ +\x98\xfe\xf5\xf7\x90r\x83\x7f\xc1\xd2\xfe\xdb\xfe\xf8l_\ +f\x05\xb6^\xfd\xb4\x17\x9e\xfe\xda\xc5\xfe\xc0\xfe\xa61\ +e8\x01.\x01\x10\x01\x07\x01$\x17\xfdP\x05\xb6\x00\ +\x01\x00\xb6\xfe\x0a\x03\xd5\x04?\x00\x1b\x00?@\x22\x12\ +\x07\x02\x18\x18\x19\x00\x07\x0d\x19\x04\x1d\x1c\x04\x15FY\ +\x04\x04\x1a\x19\x15\x1a\x01HY\x1a\x0f\x0a\x0fFY\x0a\ +\x1c\x00?+\x00\x18?+\x00\x18?\x129/+\x11\ +\x12\x01\x179\x113\x113\x11310\x01!\x116\ +32\x00\x11\x10\x02#\x22'5\x1632654\ +&#\x22\x07\x11#\x11!\x03F\xfd\xd3]e\xf8\x01\ +\x02\xce\xb7\x8aWpu\x86\x93\xd0\xccbVc\x02\x90\ +\x03\xe9\xfey\x1b\xfe\xd6\xfe\xe6\xfe\xf7\xfe\xda:dD\ +\xf8\xdf\xf1\xf7#\xfe\x00\x04?\x00\x01\x00\x00\xfe\x8f\x06\ +L\x05\xb6\x00\x15\x00\x5c@2\x07\x08\x0f\x0a\x0e\x0b\x09\ +\x05\x11\x11\x04\x00\x12\x02\x01\x14\x15\x01\x08\x0a\x0b\x12\x15\ +\x06\x17\x16\x09\x10\x13\x03\x06\x05\x00\x00\x0f\x07\x04\x01\x03\ +\x12\x15\x12\x0d\x22\x0f\x0aJY\x0f\x12\x00?+\x00\x18\ +??3?33\x129\x11\x173\x11\x12\x01\x179\ +\x113\x113\x11333\x1133\x113\x113\x11\ +310\x01\x013\x01\x113\x11\x013\x01\x013\x11\ +#\x11#\x01\x11#\x11\x01#\x02q\xfd\xb0\x7f\x02L\ +f\x02L\x7f\xfd\xae\x02#^c3\xfd\x9cf\xfd\x9b\ +\x87\x02\xe9\x02\xcd\xfd<\x02\xc4\xfd<\x02\xc4\xfd:\xfd\ +n\xfe1\x01q\x02\xe5\xfd\x1b\x02\xe5\xfd\x1b\x00\x01\x00\ +\x06\xfe\x8f\x05d\x04?\x00\x15\x00\x5c@2\x03\x04\x0b\ +\x06\x0a\x07\x05\x01\x0d\x12\x00\x0d\x0e\x14\x13\x10\x11\x04\x06\ +\x07\x0e\x11\x13\x06\x17\x16\x05\x0c\x0f\x15\x02\x05\x12\x12\x0b\ +\x03\x00\x13\x0f\x0e\x11\x15\x09\x22\x0b\x06GY\x0b\x15\x00\ +?+\x00\x18??3?33\x129\x11\x173\x11\ +\x12\x01\x179\x113\x113\x11333\x1133\x11\ +3\x113\x11310\x013\x11\x013\x01\x013\x11\ +#\x11#\x01\x11#\x11\x01#\x01\x013\x01\x02wd\ +\x01\xd3y\xfe)\x01\xa6nb5\xfe\x0ed\xfe\x0e\x7f\ +\x01\xfa\xfe+y\x01\xd3\x04?\xfd\xf0\x02\x10\xfd\xf0\xfe\ +/\xfe1\x01q\x02'\xfd\xd9\x02'\xfd\xd9\x02+\x02\ +\x14\xfd\xf0\xff\xff\x00R\xfeB\x04\x06\x05\xcb\x02&\x01\ +\xb1\x00\x00\x00\x07\x03\x7f\x01T\x00\x00\xff\xff\x00D\xfe\ +B\x037\x04T\x02&\x01\xd1\x00\x00\x00\x07\x03\x7f\x00\ +\xf0\x00\x00\x00\x01\x00\xcf\xfe\x8f\x04\xdf\x05\xb6\x00\x10\x00\ +E@&\x0e\x0f\x05\x00\x04\x01\x0c\x08\x08\x09\x00\x01\x06\ +\x09\x0f\x10\x06\x12\x11\x10\x06\x0c\x07\x04\x05\x0e\x0a\x03\x09\ +\x12\x03\x22\x05\x00JY\x05\x12\x00?+\x00\x18??\ +?3\x12\x179\x11\x12\x01\x179\x113\x113\x113\ +\x113\x11310%3\x11#\x11#\x01\x07\x11#\ +\x113\x117\x013\x01\x04`\x7fbT\xfd\xcf\xc3f\ +f\xa2\x02=\x82\xfd\xa9^\xfe1\x01q\x03\x04\xac\xfd\ +\xa8\x05\xb6\xfd\x08\xa2\x02V\xfd\x96\x00\x00\x01\x00\xb6\xfe\ +\x8f\x03\xbe\x04?\x00\x0e\x00F@$\x00\x01\x08\x03\x07\ +\x04\x0d\x02\x0a\x0a\x0b\x01\x03\x04\x0b\x04\x10\x0f\x09\x0e\x02\ +\x02\x08\x00\x0c\x0f\x0b\x15\x06\x22\x08\x03GY\x08\x15\x00\ +?+\x00\x18???3\x129\x1133\x11\x12\x01\ +\x179\x113\x1133\x113\x113\x11310\x01\ +3\x01\x013\x11#\x11#\x01\x11#\x113\x11\x03\x04\ +{\xfe\x19\x01\xb2tb?\xfd\xfeee\x04?\xfd\xf2\ +\xfe-\xfe1\x01q\x02'\xfd\xd9\x04?\xfd\xf0\x00\x00\ +\x01\x00\xcf\x00\x00\x04\xa6\x05\xb6\x00\x12\x00C@$\x12\ +\x0f\x03\x0c\x03\x04\x10\x11\x01\x00\x0b\x07\x07\x08\x00\x04\x08\ +\x11\x04\x14\x13\x04\x0d\x0f\x0c\x05\x12\x02\x07\x08\x10\x09\x03\ +\x01\x08\x12\x00?3?3\x12\x179\x11\x12\x01\x179\ +\x113\x113\x113\x113\x1133\x113310\ +!#\x01\x11#\x11\x07\x11#\x113\x117\x113\x11\ +\x013\x01\x04\xa6}\xfe\x04V\xa2ff\xa2V\x01\xe7\ +\x82\xfd\xa9\x02\xbc\xfe{\x01\xb0\x8f\xfd\xa8\x05\xb6\xfd\x08\ +\xa2\x01c\xfe\xf5\x01\xfe\xfd\x96\x00\x01\x00\xb6\x00\x00\x03\ +\xa2\x04?\x00\x13\x00E@&\x09\x08\x04\x05\x07\x03\x0b\ +\x0b\x00\x0c\x12\x0f\x0f\x10\x05\x08\x0c\x10\x04\x15\x14\x01\x0c\ +\x03\x00\x06\x07\x0a\x0d\x13\x09\x10\x04\x11\x0f\x09\x10\x15\x00\ +?3?3\x12\x179\x11\x12\x01\x179\x113\x113\ +\x1133\x1133\x113\x11310\x01\x113\x15\ +\x013\x01\x15\x01#\x01\x15#\x11'\x11#\x113\x11\ +\x01\x9cV\x01\x12{\xfes\x01\xb0\x85\xfe\xd5V\x81e\ +e\x02\xba\x01<\xdf\x01(\xfeT\xc2\xfe/\x01B\xd8\ +\x014\x89\xfd\xd9\x04?\xfd\xf0\x00\x01\x001\x00\x00\x04\ +\xa6\x05\xb6\x00\x14\x00O@,\x0e\x0d\x0a\x0b\x01\x04\x08\ +\x03\x11\x11\x12\x06\x0b\x0c\x0d\x0f\x12\x14\x07\x16\x15\x0c\x0f\ +\x08\x10\x04\x12\x02\x07\x14\x00\x14JY\x04\x00\x00\x12\x0a\ +\x02\x03\x0e\x12\x12\x00?3?3\x129/3+\x11\ +\x003\x11\x12\x179\x11\x12\x01\x179\x113\x12\x179\ +\x113\x11310\x13353\x153\x15#\x117\ +\x013\x01\x01#\x01\x07\x11#\x11#1\x9ef\xfa\xfa\ +\xa2\x02=\x82\xfd\xa9\x02g}\xfd\xcf\xc3f\x9e\x04\xfa\ +\xbc\xbc^\xfe\x22\xa2\x02V\xfd\x96\xfc\xb4\x03\x04\xac\xfd\ +\xa8\x04\x9c\x00\x01\x00\x1b\x00\x00\x03\xdf\x06\x14\x00\x15\x00\ +P@-\x0f\x0e\x0b\x0c\x01\x04\x07\x03\x12\x12\x13\x06\x0c\ +\x0d\x0e\x10\x13\x15\x07\x17\x16\x0d\x10\x0a\x11\x04\x13\x0b\x07\ +\x15\x00\x15HY\x04\x00\x00\x0b\x02\x00\x0b\x0f\x0f\x13\x15\ +\x00?3??\x129/3+\x11\x003\x11\x12\x17\ +9\x11\x12\x01\x179\x113\x12\x179\x113\x1131\ +0\x13353\x15!\x15!\x11\x033\x013\x01\x01\ +#\x01\x07\x11#\x11#\x1b\x9bc\x01\x81\xfe\x7f\x07\x05\ +\x02+x\xfeT\x01\xd1w\xfec\xb2c\x9b\x05L\xc8\ +\xc8V\xfe\x12\xfe\xd5\x02b\xfe0\xfd\x91\x02%\xa2\xfe\ +}\x04\xf6\x00\x01\x00\x0a\x00\x00\x05'\x05\xb6\x00\x0e\x00\ +>@\x22\x0c\x0d\x01\x00\x0a\x04\x04\x05\x00\x02\x05\x07\x0d\ +\x0e\x06\x10\x0f\x0e\x02\x0a\x03\x04\x05\x0c\x03\x01\x05\x12\x08\ +\x07KY\x08\x03\x00?+\x00\x18?3?\x12\x179\ +\x11\x12\x01\x179\x113\x113\x113\x11310!\ +#\x01\x07\x11#\x11!5!\x117\x013\x01\x05'\ +}\xfd\xcf\xc3f\xfe\xba\x01\xac\xa2\x02>\x81\xfd\xaa\x03\ +\x04\xac\xfd\xa8\x05V`\xfd\x08\xa2\x02V\xfd\x96\x00\x00\ +\x01\x00)\x00\x00\x04T\x04?\x00\x0c\x00A@!\x04\ +\x03\x00\x01\x0b\x02\x06\x06\x07\x01\x03\x07\x09\x04\x0e\x0d\x05\ +\x0c\x02\x02\x07\x0a\x00\x0f\x04\x07\x15\x0a\x09HY\x0a\x0f\ +\x00?+\x00\x18?3?\x11\x129\x1133\x11\x12\ +\x01\x179\x113\x1133\x113\x11310\x013\ +\x01\x01#\x01\x11#\x11!5!\x11\x03\xb6{\xfe\x19\ +\x02\x0a\x85\xfd\xfee\xfe\xc1\x01\xa4\x04?\xfd\xf2\xfd\xcf\ +\x02'\xfd\xd9\x03\xe9V\xfd\xf0\x00\x01\x00\xcf\xfe\x8f\x05\ +h\x05\xb6\x00\x0f\x00L@)\x04\x01\x0d\x05\x05\x00\x0c\ +\x08\x08\x09\x00\x01\x09\x03\x11\x10\x0c\x07JY\x0f\x0c\x01\ +\x0b\x03\x0c\x0c\x05\x0e\x0a\x03\x09\x12\x03\x22\x05\x00JY\ +\x05\x12\x00?+\x00\x18???3\x129/_^\ +]+\x11\x12\x01\x179\x113\x113\x113\x113\x11\ +310%3\x11#\x11#\x11!\x11#\x113\x11\ +!\x113\x04\xf2vb{\xfc\xaaff\x03Vg^\ +\xfe1\x01q\x02\xcf\xfd1\x05\xb6\xfdw\x02\x89\x00\x00\ +\x01\x00\xb6\xfe\x8f\x04\xa4\x04?\x00\x0f\x00R@/\x09\ +\x06\x02\x0a\x0a\x05\x01\x0d\x0d\x0e\x05\x06\x0e\x03\x11\x10\x01\ +\x0cHY\x0f\x01\x1f\x01?\x01O\x01\x04\x0b\x03\x01\x01\ +\x0a\x03\x0f\x0f\x0e\x15\x08\x22\x0a\x05GY\x0a\x15\x00?\ ++\x00\x18???3\x129/_^]+\x11\x12\ +\x01\x179\x113\x113\x113\x113\x11310\x01\ +\x11!\x113\x113\x11#\x11#\x11!\x11#\x11\x01\ +\x19\x02\xb2bwbw\xfdNc\x04?\xfe#\x01\xdd\ +\xfc\x1f\xfe1\x01q\x02\x0c\xfd\xf4\x04?\x00\x00\x01\x00\ +\xcf\x00\x00\x067\x05\xb6\x00\x0d\x00G@&\x0b\x03\x03\ +\x02\x0a\x06\x06\x07\x00\x02\x07\x03\x0f\x0e\x0a\x05JY\x0f\ +\x0a\x01\x0b\x03\x0a\x0a\x07\x0c\x08\x03\x03\x07\x12\x0c\x01K\ +Y\x0c\x03\x00?+\x00\x18?3?\x11\x129/_\ +^]+\x11\x12\x01\x179\x113\x113\x113\x113\ +10\x01!\x11#\x11!\x11#\x113\x11!\x11!\ +\x067\xfe\xbbg\xfc\xaaff\x03V\x01\xac\x05V\xfa\ +\xaa\x02\xcf\xfd1\x05\xb6\xfdw\x02\x89\x00\x01\x00\xb6\x00\ +\x00\x05m\x04?\x00\x0d\x00M@,\x02\x08\x08\x07\x01\ +\x0b\x0b\x0c\x05\x07\x0c\x03\x0f\x0e\x01\x0aHY\x0f\x01\x1f\ +\x01?\x01O\x01\x04\x0b\x03\x01\x01\x0c\x03\x0d\x0f\x08\x0c\ +\x15\x03\x06HY\x03\x0f\x00?+\x00\x18?3?\x11\ +\x129/_^]+\x11\x12\x01\x179\x113\x113\ +\x113\x11310\x01\x11!\x11!\x15!\x11#\x11\ +!\x11#\x11\x01\x19\x02\xb2\x01\xa2\xfe\xc0b\xfdNc\ +\x04?\xfe#\x01\xddV\xfc\x17\x02\x0c\xfd\xf4\x04?\x00\ +\x01\x00\xcf\xfe\x00\x07\xf2\x05\xb6\x00\x1e\x00K@)\x19\ +\x0e\x08\x01\x00\x04\x05\x00\x05\x0e\x14\x04 \x1f\x0a\x1cL\ +Y\x0f\x0a\x01\x0b\x03\x0a\x0a\x06\x01\x05\x12\x06\x03KY\ +\x06\x03\x11\x16JY\x11\x1c\x00?+\x00\x18?+\x00\ +\x18?3\x129/_^]+\x11\x12\x01\x179\x11\ +3\x1133\x11310!#\x11!\x11#\x11!\ +\x11632\x04\x12\x15\x10\x00#\x22'5\x1632\ +\x12\x11\x10\x00#\x22\x07\x04\xa0g\xfc\xfcf\x03\xd1q\ +n\xc2\x01\x1c\x95\xfe\xf0\xf6\x91r\x86}\xc0\xd7\xfe\xea\ +\xfat_\x05V\xfa\xaa\x05\xb6\xfdV\x17\x9f\xfe\xda\xc4\ +\xfe\xbf\xfe\xa71e8\x01-\x01\x11\x01\x05\x01&\x17\ +\x00\x00\x01\x00\xb6\xfe\x0a\x06\x85\x04?\x00\x1c\x00C@\ +$\x10\x05\x16\x00\x15\x19\x1a\x05\x0b\x15\x1a\x04\x1e\x1d\x02\ +\x12FY\x02\x02\x1b\x16\x1a\x15\x1b\x18GY\x1b\x0f\x08\ +\x0dFY\x08\x1c\x00?+\x00\x18?+\x00\x18?3\ +\x129/+\x11\x12\x01\x179\x113\x1133\x113\ +10\x01632\x00\x11\x10\x02#\x22'5\x163\ +265\x10!\x22\x07\x11#\x11!\x11#\x11!\x03\ +\xdd]Q\xfa\x01\x00\xc0\xb3\x8aWrk\x84\x8b\xfed\ +[Ib\xfd\x9ec\x03'\x02b\x1b\xfe\xdc\xfe\xe0\xfe\ +\xf5\xfe\xdc:dD\xf7\xe0\x01\xe8\x1b\xfd\xf8\x03\xe1\xfc\ +\x1f\x04?\x00\x02\x00\x81\xff\xac\x05\xbe\x05\xcd\x00+\x00\ +5\x00m@;3\x0d&,\x001&\x1d\x13\x00\x07\ +\x13\x18&\x05763#. \x03\x0d)\x0f\x0a\x05\ +JY\x0a\x0f@).KY\x00)\x10)\x02\x09\x03\ +))\x0f\x16\x16\x1bKY\x16\x04\x0f KY\x0f\x13\ +\x00?+\x00\x18?+\x11\x12\x009\x18/_^]\ ++\x00\x1a\x18\x10\xcc+\x11\x12\x0099\x11\x1299\ +\x11\x12\x01\x179\x113\x113\x113\x129910\ +\x01\x14\x02\x07\x16327\x15\x06#\x22&'\x06#\ +\x22$\x025\x10\x00!2\x17\x07&# \x11\x10\x00\ +!267&\x0254\x1232\x12\x07\x10#\x22\ +\x06\x15\x10\x176\x12\x05\x9c\x9d\x86YkJ7*a\ +a\x91;d\x98\xc4\xfe\xd7\x9c\x01F\x01)\x82O\x1b\ +Ko\xfe\x04\x01\x1f\x01\x05&_\x1bit\xbd\xa3\xad\ +\xb8k\xfas\x85\xe0\x84\x8e\x02\xa6\xb9\xfe\xb9XD\x15\ +\x5c\x17=+(\xb9\x01S\xdd\x01i\x01\x8f\x1b`\x18\ +\xfdi\xfe\xc9\xfe\xb0\x0b\x09b\x010\xb4\xf5\x01\x0f\xfe\ +\xf7\xf9\x01\xa0\xdb\xc7\xfe\xa2\xc1H\x01\x1e\x00\x00\x02\x00\ +w\xff\xcb\x04\x96\x04T\x00\x0a\x006\x00m@\x1e\x0d\ +\x03&\x06,\x00&\x1e\x13\x13\x18&,4\x0587\ +\x03$\x09\x22/\x0d)\x0f)\x09FY)\xb8\xff\xc0\ +@\x1a\x09\x0dH))\x0f\x16\x0b2HY\x0b\x0f@\ +\x16\x1bFY\x16\x10\x0f\x22FY\x0f\x16\x00?+\x00\ +\x18?+\x00\x1a\x18\x10\xcc+\x11\x12\x009\x18/+\ ++\x11\x12\x0099\x11\x1299\x11\x12\x01\x179\x11\ +3\x113\x113\x129910\x01\x14\x16\x1766\ +54&#\x22\x01\x22'\x06#\x22&&5\x10\x12\ +32\x17\x07&#\x22\x06\x15\x14\x16\x16327&\ +54632\x16\x15\x14\x06\x07\x16\x16327\x15\ +\x06\x02\xaeOKN`IU\xaa\x01}~rV\x8d\ +\x91\xdav\xea\xd4R@\x15E<\xa2\xb0_\xb5\x80N\ +1\xac\x90\x82\x80\x86ja\x18X(>-,\x01\xf0\ +z\xacA3\xbc~\x8b\x8f\xfc\xbbL+\x8d\xfe\xa0\x01\ +\x0a\x013\x12[\x13\xf9\xea\x8b\xd4r\x16\x9a\xfc\xb2\xc6\ +\xc0\xb4\x84\xdbE\x12\x1d\x0eX\x0e\x00\xff\xff\x00\x81\xfe\ +B\x04\xb8\x05\xcb\x02&\x00&\x00\x00\x00\x07\x03\x7f\x02\ +#\x00\x00\xff\xff\x00w\xfeB\x03\x85\x04T\x02&\x00\ +F\x00\x00\x00\x07\x03\x7f\x01u\x00\x00\x00\x01\x00\x0a\xfe\ +\x8f\x04'\x05\xb6\x00\x0b\x004@\x1b\x01\x04\x00\x05\x04\ +\x05\x07\x0a\x04\x0d\x0c\x03\x22\x0b\x07\x08\x07KY\x08\x03\ +\x05\x00JY\x05\x12\x00?+\x00\x18?+\x11\x003\ +\x18?\x11\x12\x01\x179\x113\x11310%3\x11\ +#\x11#\x11!5!\x15!\x02Lwc{\xfe%\ +\x04\x1d\xfe%^\xfe1\x01q\x05V``\x00\x01\x00\ +)\xfe\x8f\x03h\x04?\x00\x0b\x004@\x1b\x03\x06\x02\ +\x07\x00\x06\x07\x09\x04\x0d\x0c\x05\x22\x01\x09\x0a\x09HY\ +\x0a\x0f\x07\x02GY\x07\x15\x00?+\x00\x18?+\x11\ +\x003\x18?\x11\x12\x01\x179\x113\x11310\x01\ +!\x113\x11#\x11#\x11!5!\x03h\xfe\x96w\ +cv\xfe\x8d\x03?\x03\xe9\xfcu\xfe1\x01q\x03\xe9\ +V\xff\xff\x00\x00\x00\x00\x049\x05\xb6\x02\x06\x00<\x00\ +\x00\x00\x01\x00\x00\xfe\x14\x03\xac\x04?\x00\x0d\x00/@\ +\x17\x0c\x0d\x05\x04\x08\x01\x01\x02\x02\x04\x0d\x03\x0f\x0e\x08\ +\x00\x03\x15\x0c\x04\x0f\x02\x1b\x00??3?33\x11\ +\x12\x01\x179\x113\x129\x113\x11310\x05\x11\ +#\x11\x013\x01\x16\x17367\x013\x02\x06b\xfe\ +\x5cf\x01\x198\x1c\x06)+\x01\x19f\x04\xfe\x18\x01\ +\xec\x04?\xfd\x1d\x8ej\x88r\x02\xe1\x00\x01\x00\x00\x00\ +\x00\x049\x05\xb6\x00\x10\x00J@(\x00\x03\x0e\x03\x08\ +\x08\x09\x01\x02\x10\x0f\x02\x06\x09\x0b\x0f\x05\x12\x11\x00\x0e\ +\x03\x03\x09\x0f\x07\x0b\x0c\x0bJY\x04\x0c\x0c\x09\x01\x0f\ +\x03\x09\x12\x00??3\x129/3+\x11\x003\x11\ +\x12\x179\x11\x12\x01\x179\x113\x113\x113\x12\x17\ +910\x01\x013\x01\x15!\x15!\x11#\x11!5\ +!5\x013\x02\x1f\x01\xacn\xfe\x19\x01;\xfe\xc5i\ +\xfe\xc3\x01=\xfe\x17u\x02\x96\x03 \xfc\x7fC_\xfe\ +m\x01\x93_;\x03\x89\x00\x01\x00\x00\xfe\x14\x03\xac\x04\ +?\x00\x13\x00@@\x22\x12\x13\x0b\x0a\x00\x09\x0e\x03\x03\ +\x03\x06\x01\x06\x08\x0a\x13\x05\x15\x14\x12\x0a\x0f\x05\x1b\x03\ +\x07\x08\x07HY\x0e\x00\x08\x15\x00?33+\x11\x00\ +3\x18??3\x11\x12\x01\x179\x113\x12\x179\x11\ +3\x11310!!\x15!\x11#\x11!5!\x01\ +3\x01\x16\x17367\x013\x02\x08\x013\xfe\xcbb\ +\xfe\xcb\x015\xfe\x5cf\x01\x198\x1c\x06)+\x01\x19\ +fV\xfej\x01\x96V\x04?\xfd\x1d\x8ej\x88r\x02\ +\xe1\x00\x01\x00\x00\xfe\x8f\x04u\x05\xb6\x00\x0f\x00F@\ +'\x05\x00\x04\x01\x0d\x0e\x0b\x0a\x07\x08\x00\x01\x06\x08\x0a\ +\x0c\x0e\x07\x11\x10\x0c\x06\x0f\x09\x04\x08\x0d\x0a\x03\x08\x12\ +\x03\x22\x05\x00JY\x05\x12\x00?+\x00\x18???\ +3\x12\x179\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x11310%3\x11#\x11#\x01\x01#\x01\x01\ +3\x01\x013\x01\x04\x10ec9\xfeP\xfeHq\x01\ +\xec\xfeAs\x01\x8b\x01\x91m\xfe;^\xfe1\x01q\ +\x02\xaa\xfdV\x02\xfa\x02\xbc\xfd\x8e\x02r\xfdF\x00\x00\ +\x01\x007\xfe\x8f\x03\xee\x04?\x00\x0f\x00F@'\x0f\ +\x0a\x0e\x0b\x07\x08\x05\x04\x01\x02\x00\x02\x04\x06\x08\x0a\x0b\ +\x07\x11\x10\x06\x00\x03\x09\x04\x02\x07\x04\x0f\x02\x15\x0d\x22\ +\x0f\x0aGY\x0f\x15\x00?+\x00\x18???3\x12\ +\x179\x11\x12\x01\x179\x113\x113\x113\x113\x11\ +310\x01\x01#\x01\x013\x01\x013\x01\x013\x11\ +#\x11#\x01\xfc\xfe\xa8m\x01\x8a\xfe\x85r\x01D\x01\ +Am\xfe\x8b\x01Lmc9\x01\xe5\xfe\x1b\x02/\x02\ +\x10\xfe6\x01\xca\xfd\xf0\xfe/\xfe1\x01q\x00\x01\x00\ +\x0a\xfe\x8f\x06{\x05\xb6\x00\x0f\x00@@\x22\x04\x01\x0d\ +\x00\x0c\x05\x00\x01\x05\x07\x0a\x05\x11\x10\x0e\x03\x03\x22\x0b\ +\x07\x08\x07KY\x08\x03\x00\x0c\x05\x0cKY\x05\x12\x00\ +?+\x11\x003\x18?+\x11\x003\x18??\x11\x12\ +\x01\x179\x113\x113\x11310%3\x11#\x11\ +!\x11!5!\x15!\x11!\x113\x05\xdf\x9cb\xfb\ +\xae\xfeC\x041\xfd\xf2\x03Lf`\xfe/\x01q\x05\ +V``\xfb\x0a\x05V\x00\x01\x00)\xfe\x8f\x05R\x04\ +?\x00\x0f\x00@@\x22\x02\x0b\x06\x03\x09\x08\x08\x03\x00\ +\x0b\x0d\x05\x10\x11\x04\x0f\x09\x22\x01\x0d\x0e\x0dHY\x0e\ +\x0f\x06\x02\x0b\x02GY\x0b\x15\x00?+\x11\x003\x18\ +?+\x11\x003\x18??\x11\x12\x01\x179\x113\x11\ +3\x11310\x01!\x11!\x113\x113\x11#\x11\ +!\x11!5!\x03^\xfew\x02\x89c\x91b\xfc\x83\ +\xfe\xb6\x035\x03\xe9\xfcu\x03\xe1\xfc\x1f\xfe1\x01q\ +\x03\xe9V\x00\x01\x00\xb6\xfe\x8f\x05\x04\x05\xb6\x00\x15\x00\ +H@%\x13\x05\x05\x00\x04\x01\x0e\x0b\x00\x01\x0b\x03\x17\ +\x16\x13\x10\x06\x0c\x08\x08\x10KY\x08\x08\x05\x14\x0c\x03\ +\x03\x22\x05\x00JY\x05\x12\x00?+\x00\x18??3\ +\x129/+\x11\x12\x009\x119\x11\x12\x01\x179\x11\ +3\x113\x113\x11310%3\x11#\x11#\x11\ +\x04#\x22&5\x113\x11\x10!267\x113\x04\ +\x8dwb{\xfe\xfb\xc8\xcc\xd8g\x01E`\xc0\xa5f\ +^\xfe1\x01q\x02{g\xb5\xba\x023\xfd\xc9\xfe\xf6\ +#;\x02\xe3\x00\x00\x01\x00\xa4\xfe\x8f\x04d\x04?\x00\ +\x17\x00H@%\x0e\x0b\x07\x0f\x0f\x0a\x01\x16\x0a\x0b\x16\ +\x03\x19\x18\x07\x04\x10\x17\x13\x13\x04FY\x13\x13\x0f\x08\ +\x17\x0f\x0d\x22\x0f\x0aGY\x0f\x15\x00?+\x00\x18?\ +?3\x129/+\x11\x12\x009\x119\x11\x12\x01\x17\ +9\x113\x113\x113\x11310\x01\x11\x14\x163\ +267\x113\x113\x11#\x11#\x11\x06\x06#\x22\ +&5\x11\x01\x06\x86\x8bb\xb2`cvbwd\xc1\ +p\xa7\xab\x04?\xfe\x94\x8azFM\x01\xdd\xfc\x1f\xfe\ +1\x01q\x02\x04MB\xae\xa4\x01x\x00\x01\x00\xb6\x00\ +\x00\x04\x8d\x05\xb6\x00\x19\x00m@?\x13\x12\x05\x05\x06\ +\x17\x01\x01\x00\x0e\x0b\x00\x06\x0b\x03\x1b\x1a`\x06p\x06\ +\x80\x06\xa0\x06\xb0\x06\xc0\x06\x06\x0f\x06\x1f\x06\x02\x09\x03\ +\x06\x06\x01\x08\x12\x14\x17\x12\x03\x10\x02\x04\x0c\x08\x08\x10\ +KY\x08\x08\x01\x18\x0c\x03\x01\x12\x00??3\x129\ +/+\x11\x12\x0099\x11\x179\x18/\x11\x129/\ +_^]]\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x129910!#\x11\x06\x07\x11#\x11#\x22\ +&5\x113\x11\x10!3\x113\x11667\x113\ +\x04\x8df\xae\xb2V\x17\xcc\xd8g\x01E\x0fVI\x95\ +\x82f\x02{H\x18\xfe\xba\x01?\xb5\xba\x023\xfd\xc9\ +\xfe\xf6\x01r\xfe\x92\x07$/\x02\xe3\x00\x01\x00\xa4\x00\ +\x00\x03\xee\x04?\x00\x19\x00a@5\x07\x06\x12\x12\x13\ +\x0a\x0e\x0e\x0d\x01\x18\x0d\x18\x13\x03\x1b\x1a\x13\x13\x0e\x0f\ +\x11\x15\x00\x06\x10\x06`\x06p\x06\x04\x0c\x03\x06\x08\x0a\ +\x06\x03\x19\x05\x15\x05FY\x15\x15\x0e\x0b\x19\x0f\x0e\x15\ +\x00??3\x129/+\x11\x12\x00\x179\x18/_\ +^]\x1199\x129/\x11\x12\x01\x179\x113\x11\ +3\x113\x113\x129910\x01\x11\x14\x1633\ +\x113\x1167\x113\x11#\x11\x06\x07\x15#5#\ +\x22&5\x11\x01\x06\x86\x8b\x02V\x8e\x8ecc\x90\x8c\ +V#\xa7\xab\x04?\xfe\x94\x8az\x017\xfe\xcf\x19t\ +\x01\xdd\xfb\xc1\x02\x04l\x19\xfc\xf2\xae\xa4\x01x\x00\x00\ +\x01\x00\xcf\x00\x00\x04\xa6\x05\xb6\x00\x14\x00-@\x16\x09\ +\x08\x02\x13\x13\x14\x14\x08\x16\x15\x04\x0dKY\x04\x04\x14\ +\x00\x03\x09\x14\x12\x00?3?\x119/+\x11\x12\x01\ +99\x113\x113\x11310\x133\x11$32\ +\x16\x15\x11#\x114&#\x22\x0e\x02\x07\x11#\xcff\ +\x01\x12\xbb\xcd\xd7g\xa6\x9fFymf3f\x05\xb6\ +\xfd\x85o\xbc\xbb\xfd\xcd\x027\x8a\x89\x12\x1e%\x12\xfd\ +\x1d\x00\x01\x00\xb6\x00\x00\x04\x00\x04?\x00\x13\x00-@\ +\x16\x00\x13\x0c\x08\x08\x09\x13\x09\x15\x14\x0f\x04FY\x0f\ +\x0f\x09\x0a\x0f\x00\x09\x15\x00?3?\x129/+\x11\ +\x12\x0199\x113\x113\x11310!\x114&\ +#\x22\x06\x07\x11#\x113\x116632\x16\x15\x11\ +\x03\x9e\x86\x8b]\xb5bccd\xc1p\xa7\xab\x01m\ +\x8azDP\xfe#\x04?\xfd\xfcMC\xae\xa4\xfe\x87\ +\x00\x00\x02\x00=\xff\xec\x05\xe5\x05\xcd\x00\x1f\x00&\x00\ +`@6$\x10#\x11\x11\x08\x1d\x05\x00\x00\x10\x17\x1d\ +\x04('\x02#\x1d\x11#\x11JY\x08\x0f#?#\ +_#o#\x8f#\x05\x0b\x03##\x1a\x0c\x0c K\ +Y\x0c\x04\x1a\x14KY\x1a\x13\x00?+\x00\x18?+\ +\x11\x12\x009\x18/_^]3+\x11\x003\x18\x10\ +\xc4\x11\x12\x01\x179\x113\x1133\x113\x1131\ +0\x13473\x06\x15\x14\x1636\x12$3 \x00\ +\x11\x15!\x12\x00!267\x15\x06# \x00\x03&\ +&\x01\x22\x00\x03!\x10\x02=\x15d\x12NR\x09\xa3\ +\x01\x1e\xb5\x01\x0c\x01\x16\xfb\xcb\x13\x01+\x01\x18^\xaf\ +r\xb3\xe0\xfe\xba\xfe\xa7\x0f\x81\x86\x03\x81\xed\xfe\xf0\x11\ +\x03\xc7\xe0\x03\x8dB-29B?\xd1\x01?\xad\xfe\ +\x8e\xfe\x97B\xfe\xc5\xfe\xd7\x1e%`C\x01f\x01^\ +\x02q\x02J\xfe\xc6\xfe\xdb\x01*\x015\x00\x00\x02\x00\ +5\xff\xec\x04\xa0\x04T\x00\x1e\x00%\x00Z@0#\ +\x14\x22\x15\x15\x0d\x03\x0b\x06\x03\x06\x14\x1b\x04'&\x08\ +\x22\x03\x15\x22\x15HY\x0d\x0f\x22\x1f\x22\x02\x0b\x03\x22\ +\x22\x00\x10\x10\x1fHY\x10\x10\x00\x18FY\x00\x16\x00\ +?+\x00\x18?+\x11\x12\x009\x18/_^]3\ ++\x11\x003\x18\x10\xc4\x11\x12\x01\x179\x113\x113\ +3\x113\x11310\x05\x22\x00\x03&&547\ +3\x06\x15\x14\x176\x1232\x12\x15\x15!\x16\x163\ +267\x15\x06\x06\x03\x22\x06\x07!4&\x03\x1f\xeb\ +\xfe\xf7\x02~v\x15d\x12\x91\x16\xfa\xc5\xc0\xde\xfc\xf1\ +\x02\xcd\xbf]\x8dl\x5c\x9c{\xa0\xbc\x0e\x02\x9f\xa4\x14\ +\x01 \x01\x04\x07vaA-28\x7f\x06\xe1\x01\x06\ +\xfe\xf4\xe6P\xe0\xec\x1a+Z(\x1d\x04\x10\xd5\xbd\xbd\ +\xd5\x00\x02\x00=\xfe\x8f\x05\xe5\x05\xcd\x00!\x00(\x00\ +l@=&\x10\x1a\x1d%\x11\x11\x08\x1f\x05\x00\x00\x10\ +\x18\x1d\x1f\x05*)\x02%\x1f\x11%\x11JY\x08\x0f\ +%?%_%o%\x8f%\x05\x0b\x03%%\x1a\x0c\ +\x1c\x22\x0c\x22KY\x0c\x04\x1d\x1a\x1a\x14KY\x1a\x13\ +\x00?+\x11\x003\x18?+\x00\x18?\x11\x129/\ +_^]3+\x11\x003\x18\x10\xc4\x11\x12\x01\x179\ +\x113\x1133\x113\x113\x11310\x1347\ +3\x06\x15\x14\x1636\x12$3 \x00\x11\x15!\x12\ +\x00!267\x15\x06#\x11#\x11$\x03&&\x01\ +\x22\x00\x03!\x10\x02=\x15d\x12NR\x09\xa3\x01\x1e\ +\xb5\x01\x0c\x01\x16\xfb\xcb\x13\x01+\x01\x18^\xafr\xb3\ +\xe0c\xfd\xd1\x1c\x81\x86\x03\x81\xed\xfe\xf0\x11\x03\xc7\xe0\ +\x03\x8dB-29B?\xd1\x01?\xad\xfe\x8e\xfe\x97\ +B\xfe\xc5\xfe\xd7\x1e%`C\xfe\xa3\x01a4\x02\x8c\ +\x02q\x02J\xfe\xc6\xfe\xdb\x01*\x015\x00\x00\x02\x00\ +5\xfe\x8f\x04\xa0\x04T\x00!\x00(\x00f@7%\ +\x17&\x16!\x02\x17\x0f\x05\x0d\x08\x02\x05\x08\x16\x1d\x05\ +*)\x0a%\x05\x17%\x17HY\x0f\x0f%\x1f%\x02\ +\x0b\x03%%!\x12\x01\x22\x12\x22HY\x12\x10\x02!\ +!\x1aFY!\x16\x00?+\x11\x003\x18?+\x00\ +\x18?\x11\x129/_^]3+\x11\x003\x18\x10\ +\xc4\x11\x12\x01\x179\x113\x1133\x113\x113\x11\ +310\x01#\x11&\x02'&&5473\x06\ +\x15\x14\x176\x1232\x12\x15\x15!\x16\x16326\ +7\x15\x06\x06#\x03\x22\x06\x07!4&\x03\x1dc\xbd\ +\xd2\x02~v\x15d\x12\x91\x16\xfa\xc5\xc0\xde\xfc\xf1\x02\ +\xcd\xbf]\x8dl\x5c\x9c`\x1b\xa0\xbc\x0e\x02\x9f\xa4\xfe\ +\x8f\x01e\x1d\x01\x16\xe9\x07vaA-28\x7f\x06\ +\xe1\x01\x06\xfe\xf4\xe6P\xe0\xec\x1a+Z(\x1d\x04\x10\ +\xd5\xbd\xbd\xd5\x00\xff\xff\x00Z\x00\x00\x02\x14\x05\xb6\x02\ +\x06\x00,\x00\x00\xff\xff\x00\x00\x00\x00\x06=\x07P\x02\ +&\x01\xb0\x00\x00\x01\x07\x026\x00\xd1\x01^\x00\x08\xb3\ +\x01\x12\x05&\x00+5\xff\xff\x00\x06\x00\x00\x05L\x05\ +\xf2\x02&\x01\xd0\x00\x00\x01\x06\x026Z\x00\x00\x08\xb3\ +\x01\x12\x11&\x00+5\x00\x01\x00\xcf\xfe\x00\x04\xcd\x05\ +\xb6\x00\x1c\x00K@'\x05\x06\x17\x0c\x07\x04\x00\x00\x01\ +\x01\x06\x0c\x12\x04\x1e\x1d\x1c\x1a\x04\x07\x09\x09\x1aKY\ +\x09\x09\x01\x05\x02\x03\x01\x12\x0f\x14JY\x0f\x1c\x00?\ ++\x00\x18??3\x129/+\x11\x0033\x113\ +\x11\x12\x01\x179\x113\x1133\x113\x11310\ +!#\x113\x11\x013\x0163 \x00\x11\x10\x00#\ +\x22'5\x1632\x12\x11\x10\x00!\x22\x07\x015f\ +f\x02\xd5\x81\xfdJ6.\x01B\x01R\xfe\xf0\xff\x87\ +r\x86s\xca\xd6\xfe\xdb\xfe\xe6\x8f[\x05\xb6\xfd)\x02\ +\xd7\xfdL\x0c\xfe\xc1\xfe\xcb\xfe\xbd\xfe\xa91e8\x01\ +*\x01\x14\x01\x06\x01\x0c)\x00\x00\x01\x00\xb6\xfe\x0a\x03\ +\xfc\x04?\x00\x1c\x00H@%\x05\x06\x17\x0a\x07\x04\x00\ +\x00\x01\x01\x06\x0a\x03\x1e\x1d\x1c\x1a\x04\x07\x07\x1aHY\ +\x07\x07\x01\x05\x02\x0f\x01\x15\x0e\x14FY\x0e\x1c\x00?\ ++\x00\x18??3\x129/+\x11\x003\x113\x11\ +\x12\x01\x179\x113\x1133\x113\x11310!\ +#\x113\x11\x013\x01 \x00\x11\x14\x06\x06#\x22'\ +5\x16\x1632654&#\x22\x07\x01\x19cc\ +\x02\x08{\xfe\x1e\x01 \x01\x22b\xb6z~[/g\ +F\x8e\x98\xeb\xe3\x5cP\x04?\xfd\xf0\x02\x10\xfe\x1f\xfe\ +\xeb\xfe\xf0\xb1\xfb\x83:d\x1c(\xf1\xe6\xe1\xea\x1a\x00\ +\x01\x00\x00\xfe\x8f\x05=\x05\xb6\x00\x17\x00A@$\x03\ +\x02\x04\x01\x05\x00\x07\x16\x00\x01\x0f\x16\x02\x05\x19\x18\x05\ +\x00JY\x05\x12\x03\x22\x16\x07KY\x16\x03\x0d\x12J\ +Y\x0d\x13\x00?+\x00\x18?+\x00\x18??+\x11\ +\x12\x01\x179\x113\x113\x113\x11310%3\ +\x03#\x13#\x11!\x0a\x02\x06\x06#\x22'5\x163\ +26\x12\x13!\x04\xa4\x99\x93u\x83{\xfd\xee)\x5c\ +?EbKC2=4Was9\x02\xcf^\xfe\ +1\x01q\x05V\xfe\xad\xfd\xa0\xfe\xfe};\x19\x5c\x16\ +\xd8\x02\xcc\x01\xca\x00\x01\x00\x14\xfe\x8f\x04?\x04?\x00\ +\x14\x00A@$\x03\x02\x04\x01\x00\x05\x07\x13\x01\x02\x05\ +\x0d\x13\x05\x16\x15\x05\x00GY\x05\x15\x03\x22\x13\x07F\ +Y\x13\x0f\x0b\x10FY\x0b\x15\x00?+\x00\x18?+\ +\x00\x18??+\x11\x12\x01\x179\x113\x113\x113\ +\x11310%3\x03#\x13#\x11!\x02\x02\x06#\ +\x22'5\x1632\x12\x13!\x03\xa6\x99\x93u\x83v\ +\xfe\x7f\x1eW\x89m'\x1d\x13#q\x8b$\x02<^\ +\xfe1\x01q\x03\xe3\xfeu\xfea\xc3\x08Z\x06\x01\xdd\ +\x02\x10\x00\x00\x01\x00\xcf\xfe\x00\x04\xf2\x05\xb6\x00\x16\x00\ +E@%\x14\x0c\x0c\x00\x13\x0f\x0f\x10\x00\x07\x10\x03\x18\ +\x17\x13\x0eJY\x0f\x13\x01\x0b\x03\x13\x13\x10\x15\x11\x03\ +\x10\x12\x03\x09JY\x03\x1c\x00?+\x00\x18??3\ +\x129/_^]+\x11\x12\x01\x179\x113\x113\ +\x113\x11310%\x10\x02!\x22&'5\x163\ +2\x12\x11\x11!\x11#\x113\x11!\x113\x04\xf2\xf6\ +\xfe\xfcLvH\x86z\xd0\xcd\xfc\xaaff\x03Vg\ +\x93\xfe\xb5\xfe\xb8\x15\x1e^3\x01\x13\x01\x22\x02>\xfd\ +/\x05\xb6\xfdy\x02\x87\x00\x01\x00\xb6\xfe\x14\x04-\x04\ +?\x00\x15\x00G@'\x02\x10\x10\x05\x01\x13\x13\x14\x05\ +\x0b\x14\x03\x17\x16\x01\x12HY\x0f\x01\x1f\x01\x02\x0b\x03\ +\x01\x01\x14\x03\x15\x0f\x14\x15\x08\x0dFY\x08\x1b\x00?\ ++\x00\x18??3\x129/_^]+\x11\x12\x01\ +\x179\x113\x113\x113\x11310\x01\x11!\x11\ +3\x11\x10\x02#\x22'5\x163265\x11!\x11\ +#\x11\x01\x19\x02\xb2b\xa2\xb4~Wal\x84x\xfd\ +Nc\x04?\xfe%\x01\xdb\xfb\xe4\xfe\xf2\xfe\xff6b\ +=\xd9\xdb\x01\xeb\xfd\xf2\x04?\x00\x01\x00\xcf\xfe\x8f\x05\ +\x8b\x05\xb6\x00\x0f\x00Q@,\x0d\x05\x03\x02\x04\x01\x05\ +\x00\x0c\x08\x08\x09\x00\x01\x02\x09\x04\x11\x10\x0c\x07JY\ +\x0f\x0c\x01\x0b\x03\x0c\x0c\x05\x0e\x0a\x03\x09\x12\x03\x22\x05\ +\x00JY\x05\x12\x00?+\x00\x18???3\x129\ +/_^]+\x11\x12\x01\x179\x113\x113\x113\ +\x113\x113\x11310%3\x03#\x13#\x11!\ +\x11#\x113\x11!\x113\x04\xf2\x99\x93u\x83{\xfc\ +\xaaff\x03Vg^\xfe1\x01q\x02\xcf\xfd1\x05\ +\xb6\xfdw\x02\x89\x00\x01\x00\xb6\xfe\x8f\x04\xc7\x04?\x00\ +\x0f\x00W@2\x08\x07\x02\x0a\x0a\x05\x09\x06\x01\x0d\x0d\ +\x0e\x05\x06\x07\x0e\x04\x11\x10\x01\x0cHY\x0f\x01\x1f\x01\ +?\x01O\x01\x04\x0b\x03\x01\x01\x0a\x03\x0f\x0f\x0e\x15\x08\ +\x22\x0a\x05GY\x0a\x15\x00?+\x00\x18???3\ +\x129/_^]+\x11\x12\x01\x179\x113\x113\ +\x113\x113\x113\x11310\x01\x11!\x113\x11\ +3\x03#\x13#\x11!\x11#\x11\x01\x19\x02\xb2b\x9a\ +\x94u\x84w\xfdNc\x04?\xfe!\x01\xdf\xfc\x1f\xfe\ +1\x01q\x02\x0a\xfd\xf6\x04?\x00\x01\x00\xb6\xfe\x8f\x04\ +\x8d\x05\xb6\x00\x15\x00H@%\x13\x05\x05\x00\x03\x02\x0e\ +\x0b\x00\x02\x0b\x03\x17\x16\x13\x10\x06\x0c\x08\x08\x10KY\ +\x08\x08\x01\x14\x0c\x03\x03\x22\x01\x04JY\x01\x12\x00?\ ++\x00\x18??3\x129/+\x11\x12\x009\x119\ +\x11\x12\x01\x179\x113\x113\x113\x11310!\ +#\x11#\x113\x11\x04#\x22&5\x113\x11\x10!\ +267\x113\x04\x8d{bw\xfe\xfb\xc8\xcc\xd8g\ +\x01E`\xc0\xa5f\xfe\x8f\x01\xcf\x02\x1dg\xb5\xba\x02\ +3\xfd\xc9\xfe\xf6#;\x02\xe3\x00\x01\x00\xa4\xfe\x8f\x03\ +\xee\x04?\x00\x17\x00H@%\x07\x0f\x0f\x0a\x0d\x0c\x01\ +\x16\x0a\x0c\x16\x03\x19\x18\x07\x04\x10\x17\x13\x13\x04FY\ +\x13\x13\x0b\x08\x17\x0f\x0d\x22\x0b\x0eGY\x0b\x15\x00?\ ++\x00\x18??3\x129/+\x11\x12\x009\x119\ +\x11\x12\x01\x179\x113\x113\x113\x11310\x01\ +\x11\x14\x163267\x113\x11#\x11#\x113\x11\ +\x06\x06#\x22&5\x11\x01\x06\x86\x8bb\xb2`cw\ +cwd\xc1p\xa7\xab\x04?\xfe\x94\x8azFM\x01\ +\xdd\xfb\xc1\xfe\x8f\x01\xcf\x01\xa6MB\xae\xa4\x01x\x00\ +\x01\x00\xcf\xfe\x8f\x06\xb2\x05\xb6\x00\x17\x00O@*\x11\ +\x0e\x10\x0f\x17\x00\x09\x0b\x12\x12\x0d\x08\x05\x05\x06\x06\x09\ +\x0d\x0e\x0f\x05\x19\x18\x0a\x16\x02\x03\x12\x0b\x07\x03\x00\x06\ +\x12\x10\x22\x12\x0dJY\x12\x12\x00?+\x00\x18??\ +3?3\x12\x179\x11\x12\x01\x179\x113\x113\x11\ +3\x113\x1133\x113\x11310!\x01#\x16\ +\x15\x11#\x113\x013\x013\x113\x03#\x13#\x11\ +47#\x01\x03R\xfd\xdf\x08\x08b\x9e\x02\x06\x06\x02\ +\x06\x9a\x99\x93u\x83{\x0c\x08\xfd\xdd\x05F|\x82\xfb\ +\xb8\x05\xb6\xfa\xfa\x05\x06\xfa\xa8\xfe1\x01q\x04Tt\ +|\xfa\xbc\x00\x01\x00\xb6\xfe\x8f\x05J\x04?\x00\x18\x00\ +S@+\x07\x06\x08\x05\x02\x09\x09\x04\x0e\x0d\x00\x16\x13\ +\x13\x14\x00\x04\x05\x06\x14\x05\x1a\x19\x00\x15\x0a\x12\x12\x09\ +\x02\x15\x0f\x0e\x14\x15\x07\x22\x09\x04GY\x09\x15\x00?\ ++\x00\x18??3?3\x129\x113\x119\x11\x12\ +\x01\x179\x113\x113\x1133\x113\x113\x113\ +\x11310%7\x013\x113\x03#\x13#\x11\x06\ +\x06\x01#\x01&&'\x11#\x113\x01\x16\x02\xb0>\ +\x019\x89\x9a\x94t\x83s\x161\xfe\xd2X\xfe\xd3\x13\ +!\x14Z\x83\x01:%j\xaf\x03&\xfc\x1f\xfe1\x01\ +q\x03\xc7?\x84\xfc\xfc\x02\xfc.f;\xfc5\x04?\ +\xfc\xe0a\xff\xff\x00Z\x00\x00\x02\x14\x05\xb6\x02\x06\x00\ +,\x00\x00\xff\xff\x00\x00\x00\x00\x04\xcd\x07D\x02&\x00\ +$\x00\x00\x01\x07\x026\x00\x1d\x01R\x00\x08\xb3\x02\x0f\ +\x05&\x00+5\xff\xff\x00b\xff\xec\x03\x93\x05\xf2\x02\ +&\x00D\x00\x00\x01\x06\x026\xd4\x00\x00\x08\xb3\x02%\ +\x11&\x00+5\xff\xff\x00\x00\x00\x00\x04\xcd\x07\x15\x02\ +&\x00$\x00\x00\x01\x07\x00j\x00\x1f\x01R\x00\x0a\xb4\ +\x03\x02\x1f\x05&\x00+55\xff\xff\x00b\xff\xec\x03\ +\x93\x05\xc3\x02&\x00D\x00\x00\x01\x06\x00j\xca\x00\x00\ +\x0a\xb4\x03\x025\x11&\x00+55\xff\xff\xff\xfe\x00\ +\x00\x05\xf8\x05\xb6\x02\x06\x00\x88\x00\x00\xff\xff\x00b\xff\ +\xec\x06L\x04T\x02\x06\x00\xa8\x00\x00\xff\xff\x00\xcf\x00\ +\x00\x03\xee\x07D\x02&\x00(\x00\x00\x01\x07\x026\x00\ +\x02\x01R\x00\x08\xb3\x01\x0c\x05&\x00+5\xff\xff\x00\ +w\xff\xec\x03\xee\x05\xf2\x02&\x00H\x00\x00\x01\x06\x02\ +6\xf5\x00\x00\x08\xb3\x02\x1c\x11&\x00+5\x00\x02\x00\ +\x7f\xff\xec\x05!\x05\xcd\x00\x13\x00\x1a\x00=@ \x17\ +\x12\x12\x09\x18\x11\x02\x09\x11\x03\x1c\x1b\x11\x18JY\x11\ +\x11\x0d\x06\x06\x00KY\x06\x04\x0d\x14KY\x0d\x13\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x01\ +\x179\x113\x113\x11310\x01\x22\x07566\ +3 \x00\x11\x14\x02\x04# \x00\x115!\x02\x012\ +\x00\x13!\x10\x12\x02\x7f\xbd\xe3\x80\xb9g\x01I\x01Y\ +\x96\xfe\xe4\xc1\xfe\xed\xfe\xe4\x045\x22\xfe \xe3\x01\x11\ +\x0e\xfc:\xe7\x05jId+\x1d\xfey\xfe\x93\xe0\xfe\ +\xac\xb9\x01s\x01l=\x02b\xfa\xe2\x01A\x01\x1d\xfe\ +\xd9\xfe\xc9\x00\x02\x00w\xff\xec\x03\xee\x04T\x00\x15\x00\ +\x1c\x00=@ \x19\x0c\x0c\x03\x1a\x0b\x03\x0b\x12\x03\x1e\ +\x1d\x0b\x1aHY\x0b\x0b\x07\x00\x00\x0fFY\x00\x10\x07\ +\x16HY\x07\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x12\x01\x179\x113\x113\x11310\ +\x012\x00\x11\x14\x02\x06#\x22\x0255!&&#\ +\x22\x06\x07566\x13267!\x14\x16\x01\xf8\xed\ +\x01\x09v\xd8\x8c\xbf\xde\x03\x0e\x02\xcb\xc0Y\x93jZ\ +\x97\x81\x9d\xbe\x10\xfd`\xa3\x04T\xfe\xdc\xfe\xf9\xac\xfe\ +\xf9\x8a\x01\x0b\xe6P\xdf\xee\x1c*Z'\x1f\xfb\xf0\xd0\ +\xc1\xba\xd7\xff\xff\x00\x7f\xff\xec\x05!\x07\x15\x02&\x02\ +\xe1\x00\x00\x01\x07\x00j\x00\x98\x01R\x00\x0a\xb4\x03\x02\ ++\x05&\x00+55\xff\xff\x00w\xff\xec\x03\xee\x05\ +\xc3\x02&\x02\xe2\x00\x00\x01\x06\x00j\xe6\x00\x00\x0a\xb4\ +\x03\x02-\x11&\x00+55\xff\xff\x00\x00\x00\x00\x06\ +=\x07\x15\x02&\x01\xb0\x00\x00\x01\x07\x00j\x00\xd1\x01\ +R\x00\x0a\xb4\x02\x01\x22\x05&\x00+55\xff\xff\x00\ +\x06\x00\x00\x05L\x05\xc3\x02&\x01\xd0\x00\x00\x01\x06\x00\ +jZ\x00\x00\x0a\xb4\x02\x01\x22\x11&\x00+55\xff\ +\xff\x00R\xff\xec\x04\x06\x07\x15\x02&\x01\xb1\x00\x00\x01\ +\x07\x00j\xff\xe6\x01R\x00\x0a\xb4\x02\x016\x05&\x00\ ++55\xff\xff\x00D\xff\xec\x037\x05\xc3\x02&\x01\ +\xd1\x00\x00\x01\x07\x00j\xffr\x00\x00\x00\x0a\xb4\x02\x01\ +7\x11&\x00+55\x00\x01\x00R\xff\xec\x04\x0e\x05\ +\xb6\x00\x18\x00J@'\x14\x18\x0e\x03\x00\x13\x03\x08\x13\ +\x15\x18\x05\x1a\x19\x13\x12\x00\x00\x12KY\x00\x00\x06\x18\ +\x15\x16\x16\x15KY\x16\x03\x06\x0bKY\x06\x13\x00?\ ++\x00\x18?+\x11\x12\x009\x129\x18/+\x11\x12\ +\x009\x11\x12\x01\x179\x113\x113\x11310\x01\ + \x04\x15\x14\x04!\x22'5\x1632654&\ +##5\x01!5!\x15\x01\xba\x01\x1e\x016\xfe\xe4\ +\xfe\xf7\xf8\x9f\xc6\xd8\xce\xe2\xf4\xe5\x98\x025\xfd\x13\x03\ +r\x03/\xd6\xc3\xcf\xdbSm`\xaa\x9b\x97\xa1V\x02\ +7``\x00\x01\x00\x1f\xfe\x14\x03j\x04?\x00\x1a\x00\ +V@0\x10\x03\x16\x1a\x00\x15\x03\x0a\x15\x17\x1a\x05\x1c\ +\x1b\x15\x14\x00\x00\x14FY\x0f\x00\x1f\x00?\x00\x03\x0b\ +\x03\x00\x00\x07\x1a\x17\x18\x18\x17HY\x18\x0f\x07\x0dF\ +Y\x07\x1b\x00?+\x00\x18?+\x11\x12\x009\x129\ +\x18/_^]+\x11\x12\x009\x11\x12\x01\x179\x11\ +3\x113\x11310\x01\x04\x04\x15\x14\x06\x06#\x22\ +'5\x16\x1632654&##5\x01!5\ +!\x15\x01?\x01#\x01\x08|\xe1\x8e\xd1\x8fZ\xa8Z\ +\xb5\xd2\xdd\xe8|\x01\xfb\xfd{\x03\x0d\x01\xb4\x03\xda\xd7\ +\x94\xe1wDf+$\xd8\xb9\xac\xaeP\x02=XI\ +\x00\xff\xff\x00\xcf\x00\x00\x04\xf6\x06\x87\x02&\x01\xb2\x00\ +\x00\x01\x07\x01M\x00\xa8\x01R\x00\x08\xb3\x01\x13\x05&\ +\x00+5\xff\xff\x00\xb6\x00\x00\x04\x17\x055\x02&\x01\ +\xd2\x00\x00\x01\x06\x01M-\x00\x00\x08\xb3\x01\x0f\x11&\ +\x00+5\xff\xff\x00\xcf\x00\x00\x04\xf6\x07\x15\x02&\x01\ +\xb2\x00\x00\x01\x07\x00j\x00\x93\x01R\x00\x0a\xb4\x02\x01\ + \x05&\x00+55\xff\xff\x00\xb6\x00\x00\x04\x17\x05\ +\xc3\x02&\x01\xd2\x00\x00\x01\x06\x00j\x19\x00\x00\x0a\xb4\ +\x02\x01\x1c\x11&\x00+55\xff\xff\x00\x81\xff\xec\x05\ +\x9c\x07\x15\x02&\x002\x00\x00\x01\x07\x00j\x00\xc1\x01\ +R\x00\x0a\xb4\x03\x02(\x05&\x00+55\xff\xff\x00\ +w\xff\xec\x049\x05\xc3\x02&\x00R\x00\x00\x01\x06\x00\ +j\x0a\x00\x00\x0a\xb4\x03\x02)\x11&\x00+55\xff\ +\xff\x00\x81\xff\xec\x05\x9c\x05\xcd\x02\x06\x02~\x00\x00\xff\ +\xff\x00w\xff\xec\x049\x04T\x02\x06\x02\x7f\x00\x00\xff\ +\xff\x00\x81\xff\xec\x05\x9c\x07\x15\x02&\x02~\x00\x00\x01\ +\x07\x00j\x00\xc1\x01R\x00\x0a\xb4\x04\x03*\x05&\x00\ ++55\xff\xff\x00w\xff\xec\x049\x05\xc3\x02&\x02\ +\x7f\x00\x00\x01\x06\x00j\x0a\x00\x00\x0a\xb4\x04\x03+\x11\ +&\x00+55\xff\xff\x00F\xff\xec\x04q\x07\x15\x02\ +&\x01\xc7\x00\x00\x01\x07\x00j\xff\xf9\x01R\x00\x0a\xb4\ +\x02\x01+\x05&\x00+55\xff\xff\x00D\xff\xec\x03\ +w\x05\xc3\x02&\x01\xe7\x00\x00\x01\x06\x00j\x86\x00\x00\ +\x0a\xb4\x02\x01+\x11&\x00+55\xff\xff\x00\x0a\xff\ +\xec\x04\xb4\x06\x87\x02&\x01\xbd\x00\x00\x01\x07\x01M\x00\ +-\x01R\x00\x08\xb3\x01\x1b\x05&\x00+5\xff\xff\x00\ +\x00\xfe\x14\x03\xac\x055\x02&\x00\x5c\x00\x00\x01\x06\x01\ +M\x9d\x00\x00\x08\xb3\x01\x1c\x11&\x00+5\xff\xff\x00\ +\x0a\xff\xec\x04\xb4\x07\x15\x02&\x01\xbd\x00\x00\x01\x07\x00\ +j\x00\x1d\x01R\x00\x0a\xb4\x02\x01(\x05&\x00+5\ +5\xff\xff\x00\x00\xfe\x14\x03\xac\x05\xc3\x02&\x00\x5c\x00\ +\x00\x01\x06\x00j\x86\x00\x00\x0a\xb4\x02\x01)\x11&\x00\ ++55\xff\xff\x00\x0a\xff\xec\x04\xb4\x07s\x02&\x01\ +\xbd\x00\x00\x01\x07\x01S\x00m\x01R\x00\x0a\xb4\x02\x01\ +)\x05&\x00+55\xff\xff\x00\x00\xfe\x14\x03\xac\x06\ +!\x02&\x00\x5c\x00\x00\x01\x06\x01S\xd2\x00\x00\x0a\xb4\ +\x02\x01*\x11&\x00+55\xff\xff\x00\xb6\x00\x00\x04\ +\x8d\x07\x15\x02&\x01\xc1\x00\x00\x01\x07\x00j\x00T\x01\ +R\x00\x0a\xb4\x02\x01\x22\x05&\x00+55\xff\xff\x00\ +\xa4\x00\x00\x03\xee\x05\xc3\x02&\x01\xe1\x00\x00\x01\x06\x00\ +j\xfb\x00\x00\x0a\xb4\x02\x01$\x11&\x00+55\x00\ +\x01\x00\xcf\xfe\x8f\x03\xf0\x05\xb6\x00\x09\x00/@\x18\x04\ +\x09\x06\x07\x01\x07\x09\x03\x0a\x0b\x07\x22\x00\x03JY\x00\ +\x03\x09\x04JY\x09\x12\x00?+\x00\x18?+\x00\x18\ +?\x11\x12\x01\x179\x113\x11310\x13!\x15!\ +\x113\x11#\x11#\xcf\x03!\xfdEccf\x05\xb6\ +^\xfb\x06\xfe1\x01q\x00\x01\x00\xb6\xfe\x8f\x035\x04\ +?\x00\x09\x00/@\x18\x04\x09\x06\x07\x01\x07\x09\x03\x0a\ +\x0b\x07\x22\x00\x03HY\x00\x0f\x09\x04GY\x09\x15\x00\ +?+\x00\x18?+\x00\x18?\x11\x12\x01\x179\x113\ +\x11310\x13!\x15!\x113\x11#\x11#\xb6\x02\ +\x7f\xfd\xe4bbc\x04?V\xfcu\xfe1\x01q\xff\ +\xff\x00\xcf\x00\x00\x05\xb6\x07\x15\x02&\x01\xc5\x00\x00\x01\ +\x07\x00j\x00\xf0\x01R\x00\x0a\xb4\x04\x03(\x05&\x00\ ++55\xff\xff\x00\xb6\x00\x00\x05\x12\x05\xc3\x02&\x01\ +\xe5\x00\x00\x01\x07\x00j\x00\x96\x00\x00\x00\x0a\xb4\x04\x03\ +'\x11&\x00+55\x00\x01\x00/\xfe\x8f\x03\xf0\x05\ +\xb6\x00\x1a\x00]@4\x05\x11\x16\x00\x04\x04\x12\x02\x0c\ +\x11\x12\x14\x19\x06\x1c\x1b\x03\x14\x15\x14JY\x00\x0f\x15\ +?\x15\x02\x0b\x03\x15\x15\x12\x17\x17\x1aJY\x17\x03\x12\ +\x04JY\x12\x12\x09\x0eJY\x09\x22\x00?+\x00\x18\ +?+\x00\x18?+\x11\x12\x009\x18/_^]3\ ++\x11\x003\x11\x12\x01\x179\x113\x1299\x113\ +10\x01!\x15!\x113\x15\x14\x06#\x22'5\x16\ +3255#\x11#53\x11!\x15!\x015\x01\ +\xb7\xfeIw\x5cZ9*-'c{\xa0\xa0\x03!\ +\xfdE\x03\x04^\xfd\xb8\xf4hs\x15\x5c\x12|\x96\x02\ +\xa6^\x02\xb2^\x00\x01\x00\x12\xfe\x8f\x035\x04?\x00\ +\x1a\x00_@7\x07\x13\x02\x06\x06\x14\x00\x04\x0e\x13\x14\ +\x16\x06\x1c\x1b\x05\x16\x17\x16HY\x02\x0f\x17\x1f\x17O\ +\x17_\x17\x04\x0e\x03\x17\x17\x14\x19\x19\x01HY\x19\x0f\ +\x14\x06GY\x14\x15\x0b\x10GY\x0b\x22\x00?+\x00\ +\x18?+\x00\x18?+\x11\x12\x009\x18/_^]\ +3+\x11\x003\x11\x12\x01\x179\x113\x113\x113\ +10\x01!\x11!\x15!\x113\x15\x14\x06#\x22'\ +5\x163255#\x11#53\x11!\x035\xfd\ +\xe4\x01n\xfe\x92v\x5cZ;'-'bw\xa4\xa4\ +\x02\x7f\x03\xe9\xfegV\xfed\xf4hs\x15\x5c\x12|\ +\x96\x01\xfaV\x01\xef\x00\x00\x01\x00\x00\xfe\x8f\x04\x89\x05\ +\xb6\x00\x18\x00N@,\x0d\x01\x0e\x00\x16\x17\x14\x13\x10\ +\x11\x00\x01\x0f\x11\x13\x15\x17\x08\x08\x1a\x19\x15\x0f\x18\x12\ +\x04\x0e\x16\x13\x03\x11\x12\x0e\x00JY\x0e\x12\x05\x0aJ\ +Y\x05\x22\x00?+\x00\x18?+\x00\x18??3\x12\ +\x179\x11\x12\x01\x179\x113\x113\x113\x113\x11\ +310%3\x15\x14\x06#\x22'5\x16325\ +5#\x01\x01#\x01\x013\x01\x013\x01\x04\x12w\x5c\ +Z;'-'bN\xfeP\xfeHq\x01\xec\xfeA\ +s\x01\x8b\x01\x91m\xfe;^\xf4hs\x15\x5c\x12|\ +\x96\x02\xaa\xfdV\x02\xfa\x02\xbc\xfd\x8e\x02r\xfdF\x00\ +\x01\x007\xfe\x8f\x03\xee\x04?\x00\x18\x00N@,\x14\ +\x08\x15\x07\x04\x05\x02\x01\x17\x18\x01\x03\x05\x07\x08\x0f\x16\ +\x18\x08\x1a\x19\x03\x16\x06\x00\x04\x15\x04\x01\x0f\x18\x15\x15\ +\x07GY\x15\x15\x0c\x11GY\x0c\x22\x00?+\x00\x18\ +?+\x00\x18??3\x12\x179\x11\x12\x01\x179\x11\ +3\x113\x113\x113\x11310\x01\x013\x01\x01\ +3\x01\x013\x15\x14\x06#\x22'5\x163255\ +#\x01\x01#\x01\xc1\xfe\x85r\x01D\x01Am\xfe\x8b\ +\x01Lm\x5c[;'-'b9\xfe\xaa\xfe\xa8m\ +\x02/\x02\x10\xfe6\x01\xca\xfd\xf0\xfe/\xf4hs\x15\ +\x5c\x12|\x96\x01\xe5\xfe\x1b\x00\x00\x01\x00\x00\x00\x00\x04\ +N\x05\xb6\x00\x11\x00I@)\x0c\x0b\x05\x06\x03\x02\x0e\ +\x0f\x02\x06\x09\x0b\x0d\x04\x0f\x11\x01\x07\x10\x0a\x0c\x13\x12\ +\x0d\x0a\x11\x00\x11LY\x04\x07\x00\x00\x0f\x05\x02\x03\x0c\ +\x0f\x12\x00?3?3\x129/33+\x11\x003\ +3\x11\x12\x01\x179\x113\x113\x113\x11310\ +\x13!\x013\x01\x013\x01!\x15!\x01#\x01\x01#\ +\x01!\x93\x01+\xfeos\x01\x8b\x01\x91m\xfef\x01\ +/\xfe\xb5\x01\xdbu\xfeP\xfeHq\x01\xdd\xfe\xb6\x03\ +?\x02w\xfd\x8e\x02r\xfd\x89Z\xfd\x1b\x02\xaa\xfdV\ +\x02\xe5\x00\x00\x01\x007\x00\x00\x03\xc5\x04?\x00\x11\x00\ +O@.\x0c\x0b\x05\x06\x03\x02\x0e\x0f\x02\x04\x06\x09\x0b\ +\x0d\x0f\x11\x08\x13\x12\x0d\x0a\x11\x00\x11IY\x04\x07/\ +\x00?\x00_\x00o\x00\x04\x00\x00\x0f\x05\x02\x0f\x0c\x0f\ +\x15\x00?3?3\x129/]33+\x11\x003\ +3\x11\x12\x01\x179\x113\x113\x113\x11310\ +\x13!\x013\x01\x013\x01!\x15!\x01#\x01\x01#\ +\x01!{\x01#\xfe\xa8r\x01D\x01Am\xfe\xae\x01\ +)\xfe\xcb\x01ys\xfe\xaa\xfe\xa8m\x01s\xfe\xd1\x02\ +`\x01\xdf\xfe6\x01\xca\xfe!R\xfd\xf2\x01\xe5\xfe\x1b\ +\x02\x0e\x00\x00\x02\x00o\x00\x00\x03\xf4\x05\xb6\x00\x0a\x00\ +\x13\x00:@\x1e\x0a\x13\x13\x02\x0f\x06\x06\x02\x15\x14\x09\ +\x0cLY\x0f\x09\x01\x0b\x03\x09\x09\x03\x00\x03\x03\x12L\ +Y\x03\x12\x00?+\x00\x18?\x129/_^]+\ +\x11\x12\x0199\x113\x113\x11310\x013\x11\ +!\x22&5463!\x15!\x22\x06\x15\x14\x163\ +!\x03\x8dg\xfe\x5c\xe9\xf8\xfc\xfb\x01'\xfe\xe8\xd9\xbf\ +\xb7\xcc\x01-\x05\xb6\xfaJ\xd9\xcb\xce\xbfZ\x8f\xa4\xa4\ +\xa6\xff\xff\x00w\xff\xec\x04\x0c\x06\x14\x02\x06\x00G\x00\ +\x00\x00\x02\x00q\xff\xec\x06!\x05\xb6\x00\x18\x00\x22\x00\ +X@-\x0f\x12\x17\x0a\x0a\x07\x22\x1c\x03\x03\x12\x22\x03\ +$#\x17\x00\x08\x10\x10#\x08\x06\x1aLY\x0f\x06\x01\ +\x0b\x03\x06\x06#\x08\x03\x0c\x1f\x00\x1fLY\x15\x00\x13\ +\x00?2+\x11\x003\x18?\x129/_^]+\ +\x11\x12\x009\x18/\x11\x129\x11\x12\x01\x179\x113\ +\x1133\x129\x11310\x05\x22&54$!\ +3\x113\x11\x10!265\x113\x11\x14\x06#\x22\ +'\x06\x13# \x11\x14\x163265\x02#\xcf\xe3\ +\x01!\x01\x08\xbef\x01\x11twg\xb3\xa5\xec^y\ +R\xc5\xfeL\xab\xa1\x8e\x9f\x14\xd2\xc3\xd2\xde\x02\x85\xfb\ +\xc5\xfe\xd1\x96\x93\x01\xdb\xfe\x1f\xb8\xcb\xb6\xb6\x02\xe9\xfe\ +\xb2\x9c\xa5\x9e\x86\x00\x02\x00w\xff\xec\x06?\x06\x14\x00\ +\x1f\x00+\x00Q@)\x0f\x12(\x18\x08\x08\x07#\x1d\ +\x07\x12\x1d\x03-,\x10\x10\x00\x17\x18\x04\x18\x1a\x00\x07\ +\x00\x00 FY\x00\x10\x0c%\x1a%HY\x15\x1a\x16\ +\x00?3+\x11\x003\x18?+\x00\x18?\x11\x129\ +9\x113\x119/\x11\x12\x01\x179\x113\x113\x12\ +99\x11310\x012\x16\x173&5\x113\x11\ +\x14\x163265\x113\x11\x14\x06#\x22'#\x06\ +#\x22\x02\x11\x10\x12\x17\x22\x06\x15\x10!2655\ +4&\x02Dp\xa07\x06\x06cz\x88m\x80b\xb0\ +\xa8\xf9B\x06m\xf3\xe1\xee\xec\xe1\xb2\xb3\x01g\xa6\x9f\ +\x9a\x04T^`~y\x01\x87\xfb\x8a\xb1\xa9\x93\x9e\x01\ +G\xfe\xb3\xbd\xc6\xdf\xdf\x01\x18\x01\x0c\x01\x1a\x01*Z\ +\xfa\xee\xfe2\xde\xee\x11\xf2\xe7\x00\x01\x00R\xff\xec\x06\ +/\x05\xcb\x00+\x00]@2!\x22)\x1a\x17\x02\x06\ +\x13\x02\x0d\x13\x1a\x22\x05-,!!&\x10\x16\x01\x02\ +\x02\x01KY\x0f\x02?\x02\x02\x0b\x03\x02\x02,\x10\x10\ +\x09JY\x10\x04&\x1dKY&\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]+\x11\x12\x009\ +\x11\x129\x18/\x11\x12\x01\x179\x113\x129\x113\ +\x11310\x01#532654&#\x22\x06\ +\x07'6632\x16\x15\x14\x06\x07\x15\x16\x16\x17\x16\ +\x163265\x113\x11\x14\x06#\x22&'&&\ +\x01\xb2\xc2\xc2\xc7\xcd\xaa\x88g\xb2p9p\xd4~\xc2\ +\xdc\x9c\x91\xab\x96\x0b\x0cv\x86ywf\xb0\xa6\xbf\xb1\ +\x09\x07\xca\x02\xc7`\x9f\x94~\x95=OPRH\xc4\ +\xa7\x8d\xb4\x1f\x06%\xaf\xa3\xaf\x88\x92\x95\x01\xdd\xfe\x1f\ +\xbc\xc7\xc3\xd2\xac\x9a\x00\x00\x01\x00P\xff\xec\x05`\x04\ +T\x00+\x00S@+\x1f\x22)\x19\x16\x02\x06\x12\x02\ +\x0c\x12\x19\x22\x05-, %\x0f\x15\x01\x02\x02\x01\ +HY\x02\x02,\x0f\x0f\x09HY\x0f\x10%\x1dHY\ +%\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x009\x11\x129\x18/\x11\x12\x01\x179\x113\ +\x129\x113\x11310\x01#532654\ +&#\x22\x07'6632\x16\x15\x14\x06\x07\x15\x16\ +\x16\x17\x1e\x0232\x11\x113\x11\x14\x06#\x22&&\ +'&&\x01\x85\x8fp\x8d\x94\x82x{\x9d%P\x9b\ +X\xa5\xb8c`qi\x10\x0d7Z]\xecb\xaa\xa4\ +t\x8bM\x14\x0f\x84\x02\x14Vhc]jHR#\ ++\x94\x87[{\x17\x06\x18vrbp0\x011\x01\ +G\xfe\xb3\xbd\xc6B\x8d\x8bo_\x00\x00\x01\x00R\xfe\ +\x8f\x04`\x05\xcb\x00\x22\x00Y@1\x03\x00\x13\x0c\x09\ +\x0d\x08\x17\x00\x00\x08\x09\x13\x1e\x05$#\x03\x12\x13\x13\ +\x12KY\x0f\x13?\x13\x02\x0b\x03\x13\x13\x0d \x0b\x22\ + \x1aJY \x04\x0d\x08JY\x0d\x12\x00?+\x00\ +\x18?+\x00\x18?\x11\x129/_^]+\x11\x12\ +\x009\x11\x12\x01\x179\x113\x113\x113\x11\x129\ +10\x01\x14\x06\x07\x15\x16\x16\x15\x113\x11#\x11#\ +\x114&##532654&#\x22\x06\x07\ +'6!2\x16\x03\xdb\x9a\x95\xab\x92wb{\xe1\xe4\ +\xce\xe1\xd4\xca\xb9\x95p\xbbk9\xca\x01\x05\xcd\xed\x04\ +`\x8d\xb3 \x06#\xa6\x9b\xfe\xc8\xfe1\x01q\x01\x93\ +\x9b\x99`\xa0\x93}\x96@LP\x9a\xc6\x00\x00\x01\x00\ +V\xfe\x8f\x03\xa2\x04T\x00 \x00O@*\x10\x0e \ +\x19\x16\x1a\x15\x02\x0e\x09\x0e\x15\x16 \x05\x22!\x10\x1f\ + \x1fHY \x1a\x0b\x18\x22\x0b\x05HY\x0b\ +\x10\x1a\x15GY\x1a\x15\x00?+\x00\x18?+\x00\x18\ +?\x11\x129/+\x11\x12\x009\x11\x12\x01\x179\x11\ +3\x113\x113\x11\x12910\x01 54&#\ +\x22\x06\x07'632\x16\x15\x14\x07\x15\x16\x16\x15\x15\ +3\x11#\x11#\x114&##5\x01\x83\x01'\x88\ +~P\x8aO%\xae\xa4\xb2\xb8\xc2zawcv\x9c\ +\x9e\x93\x02j\xcbaf%#RN\x94\x83\xbd4\x06\ +\x1f\x80n\xdb\xfe1\x01q\x01?mhV\x00\x01\x00\ +\x00\xff\xe9\x06\xb4\x05\xb6\x00\x22\x00C@#\x19\x1c\x14\ +\x22\x01\x12\x09\x12\x1c\x22\x04$#\x1a\x1a\x07\x12\x1f\x17\ +KY\x1f\x13\x07\x0cJY\x07\x13\x12\x01KY\x12\x03\ +\x00?+\x00\x18?+\x00\x18?+\x11\x12\x009\x18\ +/\x11\x12\x01\x179\x113\x113\x11310\x01!\ +\x03\x06\x02\x02\x06#\x22'5\x163266\x12\x12\ +\x13!\x11\x14\x1632\x11\x113\x11\x14\x06#\x22&\ +5\x03\xee\xfeE$\x1eNRucB7=23\ +D0FS.\x02wz\x86\xfaf\xbb\xa5\xba\xac\x05\ +V\xfe\xfe\xd8\xfe\x11\xfe\xd2v\x19\x5c\x16?q\x01H\ +\x02\x1f\x01W\xfb\xc9\xa7\x8c\x01)\x01\xdb\xfe\x1f\xb8\xcb\ +\xc6\xcb\x00\x00\x01\x00\x14\xff\xec\x05\xd9\x04?\x00\x1c\x00\ +C@#\x05\x08\x00\x0d\x0f\x1b\x08\x0d\x16\x1b\x04\x1e\x1d\ +\x06\x06\x13\x1b\x1b\x0fFY\x1b\x0f\x0b\x02HY\x0b\x16\ +\x13\x18FY\x13\x15\x00?+\x00\x18?+\x00\x18?\ ++\x11\x12\x009\x18/\x11\x12\x01\x179\x113\x113\ +\x11310\x01\x10!265\x113\x11\x14\x06#\ + \x11\x11!\x02\x02\x06#\x22'5\x1632\x12\x13\ +!\x03\x87\x01\x00o\x81b\xad\xa5\xfe\x9e\xfe\x9e\x1eW\ +\x8do!\x1d\x14\x1es\x8b&\x02\x1d\x01q\xfe\xd3\x8f\ +\x9a\x01O\xfe\xb3\xbc\xc7\x01\x91\x02f\xfep\xfeb\xbf\ +\x08Z\x06\x01\xd2\x02\x1b\x00\x01\x00\xcf\xff\xec\x07)\x05\ +\xb6\x00\x18\x00I@'\x06\x07\x00\x0e\x15\x11\x11\x12\x07\ +\x0e\x12\x03\x1a\x19\x15\x10JY\x0f\x15\x01\x0b\x03\x06\x15\ +\x06\x15\x12\x17\x13\x03\x12\x12\x0b\x03JY\x0b\x13\x00?\ ++\x00\x18??3\x1299//_^]+\x11\ +\x12\x01\x179\x113\x113\x113\x11310\x01\x14\ +\x1632\x11\x113\x11\x14\x06#\x22&5\x11!\x11\ +#\x113\x11!\x113\x04\xc9y\x87\xfaf\xb7\xa9\xb8\ +\xaf\xfc\xd3ff\x03-g\x01u\x99\x92\x01 \x01\xe6\ +\xfe\x1f\xb8\xcb\xc9\xc8\x01R\xfd1\x05\xb6\xfdw\x02\x89\ +\x00\x00\x01\x00\xb6\xff\xec\x06`\x04?\x00\x18\x00O@\ +-\x0a\x0d\x05\x13\x01\x16\x16\x17\x0d\x13\x17\x03\x1a\x19\x01\ +\x15HY\x0f\x01\x1f\x01?\x01O\x01\x04\x0b\x03\x0b\x01\ +\x0b\x01\x17\x03\x18\x0f\x17\x15\x10\x07HY\x10\x16\x00?\ ++\x00\x18??3\x1299//_^]+\x11\ +\x12\x01\x179\x113\x113\x113\x11310\x01\x11\ +!\x113\x11\x103265\x113\x11\x14\x06#\x22\ +&55!\x11#\x11\x01\x19\x02\x93b\xfev|b\ +\xaf\xa5\xb0\xb0\xfdmc\x04?\xfe#\x01\xdd\xfd6\xfe\ +\xcf\x97\x92\x01O\xfe\xb3\xbd\xc6\xc6\xcb\x8f\xfd\xf4\x04?\ +\x00\x00\x01\x00\x81\xff\xec\x05h\x05\xcb\x00\x1d\x00:@\ +\x1f\x1c\x01\x16\x08\x00\x01\x08\x0f\x04\x1f\x1e\x00\x1dKY\ +\x00\x00\x05\x0c\x0c\x13LY\x0c\x04\x05\x19LY\x05\x13\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x01\x179\x113\x11310\x01!\x15\x10\x00! \ +\x00\x114\x12$32\x16\x17\x07&&# \x00\x11\ +\x10\x00!2\x12\x11!\x03b\x02\x06\xfe\xdc\xfe\xd9\xfe\ +\xc7\xfe\x9d\xb5\x01R\xdef\xe1U'P\xc9`\xfe\xde\ +\xfe\xb0\x01(\x01\x09\xf3\xe8\xfef\x02\xddX\xfe\xb1\xfe\ +\xb6\x01\x90\x01a\xe5\x01T\xb5*$^#-\xfe\xa4\ +\xfe\xca\xfe\xc9\xfe\xa2\x01\x13\x01\x22\x00\x00\x01\x00w\xff\ +\xec\x04\x81\x04T\x00\x1a\x00:@\x1f\x19\x01\x14\x08\x01\ +\x08\x0e\x00\x04\x1c\x1b\x00\x1aHY\x00\x00\x05\x0c\x0c\x11\ +FY\x0c\x10\x05\x17FY\x05\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\x11\ +310\x01!\x15\x14\x06# \x00\x114\x12$3\ +2\x17\x07&#\x22\x04\x15\x14\x163 \x11!\x02\xa4\ +\x01\xdd\xf4\xef\xfe\xfc\xfe\xdd\x8d\x01\x0d\xba\xcf\xa3 \x96\ +\xba\xea\xfe\xfc\xe8\xd9\x01\x7f\xfe\x85\x02#D\xf6\xfd\x01\ +'\x01\x08\xad\x01\x03\x89DXB\xf7\xe4\xe4\xf5\x01\x87\ +\x00\x00\x01\x00\x0a\xff\xec\x04\xac\x05\xb6\x00\x14\x009@\ +\x1d\x0a\x0d\x05\x13\x00\x03\x0d\x13\x04\x16\x15\x0b\x0b\x10\x01\ +\x04\x00\x01\x00KY\x01\x03\x10\x08JY\x10\x13\x00?\ ++\x00\x18?+\x11\x003\x11\x129\x18/\x11\x12\x01\ +\x179\x113\x11310\x135!\x15!\x11\x14\x16\ +32\x11\x113\x11\x14\x06#\x22&5\x11\x0a\x04!\ +\xfe!}\x8d\xf0f\xb4\xa2\xbb\xb6\x05V``\xfc)\ +\xa1\x94\x01+\x01\xdb\xfe\x1f\xbb\xc8\xc5\xcc\x03\xd9\x00\x00\ +\x01\x00)\xff\xec\x04F\x04?\x00\x12\x009@\x1d\x06\ +\x09\x02\x0e\x00\x09\x0e\x10\x04\x14\x13\x07\x07\x0c\x11\x01\x10\ +\x11\x10HY\x11\x0f\x0c\x04HY\x0c\x16\x00?+\x00\ +\x18?+\x11\x003\x11\x129\x18/\x11\x12\x01\x179\ +\x113\x11310\x01!\x11\x10!2\x11\x113\x11\ +\x14\x06# \x11\x11!5!\x03^\xfe\x96\x01\x00\xef\ +c\xad\xa5\xfe\x9d\xfe\x98\x035\x03\xe9\xfd\x96\xfe\xc5\x01\ +1\x01G\xfe\xb3\xbc\xc7\x01\x91\x02lV\x00\x00\x01\x00\ +s\xff\xec\x045\x05\xcb\x00&\x00N@*#\x10\x0c\ +\x00\x15 \x00\x06\x10\x1a \x05('$\x12\x0f\x0f\x12\ +KY\x0f\x0f\x01\x0b\x03\x0f\x0f\x1d\x04\x04\x09JY\x04\ +\x04\x1d\x18JY\x1d\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/_^]+\x11\x12\x009\x11\x12\x01\x17\ +9\x113\x113\x12910\x134663 \x17\ +\x07&#\x22\x06\x15\x14\x1633\x15#\x22\x06\x15\x14\ +\x16327\x15\x06! $54675&&\ +\x9er\xd2\x84\x01\x11\xbe3\xb5\xe7\x9a\xc2\xfd\xdc\xa6\xc4\ +\xe9\xf9\xdc\xd0\xee\xb0\x97\xfe\xf9\xfe\xfa\xfe\xea\xc9\xb4\xa6\ +\xac\x04Tl\xad^oZk\x9a\x85\x8f\x98`\xa9\x9f\ +\x97\x9eVeO\xd1\xc4\x92\xc7 \x06\x1d\xae\xff\xff\x00\ +^\xff\xec\x03T\x04T\x02\x06\x01\x82\x00\x00\x00\x01\x00\ +\x00\xfe\x8f\x05\x1b\x05\xb6\x00 \x00D@&\x1f\x13 \ +\x12\x01\x10\x09\x10\x12\x13\x1a\x05\x22! \x12JY \ +\x12\x10\x01KY\x10\x03\x07\x0cJY\x07\x13\x17\x1cJ\ +Y\x17\x22\x00?+\x00\x18?+\x00\x18?+\x00\x18\ +?+\x11\x12\x01\x179\x113\x113\x11310\x01\ +!\x0a\x02\x06\x06#\x22'5\x16326\x12\x13!\ +\x113\x15\x14\x06#\x22'5\x163255#\x04\ +=\xfd\xee)\x5c?EbKC2=4Was\ +9\x02\xcfw\x5c[8*-'b{\x05V\xfe\xad\ +\xfd\xa0\xfe\xfe};\x19\x5c\x16\xd8\x02\xcc\x01\xca\xfa\xa8\ +\xf4hs\x15\x5c\x12|\x96\x00\x00\x01\x00\x14\xfe\x8f\x04\ +\x1d\x04?\x00\x1d\x00C@%\x1c\x10\x1d\x0f\x01\x0d\x07\ +\x0d\x0f\x10\x17\x05\x1f\x1e\x1d\x0fGY\x1d\x15\x0d\x01F\ +Y\x0d\x0f\x05\x0aFY\x05\x14\x19GY\x14\x22\x00?\ ++\x00\x18/+\x00\x18?+\x00\x18?+\x11\x12\x01\ +\x179\x113\x113\x11310\x01!\x02\x02\x06#\ +\x22'5\x1632\x12\x13!\x113\x15\x14\x06#\x22\ +'5\x163255#\x03D\xfe\x7f\x1eW\x89m\ +'\x1d\x13#q\x8b$\x02:/\x1f(\x22\ +4T^\xfede\x80C\x80YY\x80D\x8d]\x06\ +qk\x1dQ\x83\x0b\x22'%\x1a\x06H\x08H\xc2\x87\ +~\x10]SS]\x10\x88}\x00\x02\xfcu\x04\xd9\xfe\ +\xdd\x07\x10\x00\x15\x00\x22\x00=@\x0b\x1c\x22\x10\x08\x00\ +\x05\x0b\x0f\x22\x01\x00\xb8\xff\xc0@\x15\x0a\x10H\x22\x00\ +\x0b\x0b\x00\x22\x03\x1f\x13/\x13?\x13\x03\x13\xc0\x1f\x1a\ +\x00/3\x1a\xcc]\x179///+]\x113\x10\ +\xc43\x11310\x01\x22.\x02#\x22\x07#66\ +32\x1e\x023273\x06\x06\x07\x16\x17\x15#&\ +'\x06\x07#567\xfe)'G@:\x1aP\x19\ +I\x0e\x5cN'E?:\x1dK\x17L\x0b_\x9ae\ +\x80C\x80YY\x80D\x8d]\x06=(/(\x81a\ +r'/'\x7fenO\x87~\x10]SS]\x10\ +\x88}\x00\x00\x02\xfc\x89\x04\xd9\xfe\xb2\x06\xc1\x00\x0b\x00\ +\x15\x00#@\x12\x09\x0f\x02\x01\x02\x15\x02\x15\x06\x10@\ +\x0a\x0eH\x10\xc0\x06\x00\x00/2\x1a\xcc+\x1199\ +//]310\x01\x22'3\x16\x163267\ +3\x06\x016673\x15\x06\x06\x07#\xfd\x9c\xfd\x16\ +R\x0e]XX]\x0fP\x1e\xfe\xca\x2232}%\ +p+D\x04\xd9\xf6WKKW\xf6\x01\x15*L]\ +\x115y%\x00\x00\x02\xfc\x89\x04\xd9\xfe\xb2\x06\xc1\x00\ +\x09\x00\x15\x00#@\x12\x13\x0f\x0c\x01\x0c\x01\x0c\x01\x10\ +\x06@\x0a\x0eH\x06\xc0\x10\x0a\x00/3\x1a\xcc+\x11\ +99//]310\x01#&&'53\x16\ +\x16\x17\x03\x22'3\x16\x1632673\x06\xfd\xd1\ +D*r$}3&.5\xfd\x16R\x0e]XX\ +]\x0fP\x1e\x05\xdd%{3\x11^9<\xfe\xeb\xf6\ +WKKW\xf6\x00\x02\xfc\x89\x04\xd9\xfe\xb2\x07\x06\x00\ +\x11\x00\x1d\x00/@\x1b`\x04p\x04\x02\x1b\x14\x0f\x14\ +\x01\x04\x14\x04\x14\x18\x0a\x1f\x0f/\x0f?\x0f\x03\x0f\xc0\ +\x18\x12\x00/3\x1a\xcc]2\x1199//]\x11\ +3]10\x01\x14\x07\x07#'6654#\x22\ +\x075632\x16\x03\x22'3\x16\x163267\ +3\x06\xfe+\x7f\x06F\x0a>?b''\x228P\ +^\x8f\xfd\x16R\x0e]XX]\x0fP\x1e\x06}k\ +\x18+Z\x0b#&?\x06H\x08J\xfe\x1d\xf6WK\ +KW\xf6\x00\x02\xfcu\x04\xd9\xfe\xdd\x07\x06\x00\x0b\x00\ +\x22\x00;@!\x14\x09\x02\x0f\x02\x01\x14\x1c\x0cp\x0c\ +\x01\x11\x17\x02\x0c\x17\x17\x0c\x02\x03\x06\x1f / ?\ + \x03 \xc0\x06\x00\x00/2\x1a\xcc]\x11\x179/\ +//\x113]\x1133]\x113/10\x01\x22\ +'3\x16\x1632673\x06\x03\x22.\x02#\x22\ +\x07#6632\x1e\x0232673\x06\x06\xfd\ +\x9c\xfd\x16R\x0e]XX]\x0fP\x1ek'G@\ +:\x1aP\x19I\x0e\x5cN'E?:\x1d-*\x0b\ +L\x0b_\x04\xd9\xf6WKKW\xf6\x01Z(/(\ +\x81ar'/'F9en\x00\x00\x01\x00;\xfe\ +B\x01Z\x00\x00\x00\x0f\x00&@\x14\x04\x03\x00\x06\x03\ +\x06\x0c\x03\x11\x10\x0e \x09`\x09p\x09\x03\x09\x04\x00\ +//]3\x11\x12\x01\x179\x113\x11310\x17\ +4&'3\x16\x15\x14\x06#\x22'5\x1632\xf8\ +GI[\x97fV8+\x220k\xf8Hq?v\ +\x8eWc\x10T\x0c\x00\x00\x01\x001\xfe\x8f\x01J\x00\ +^\x00\x0e\x00\x1b@\x0b\x0c\x02\x08\x02\x10\x0f\x0a\x05\x22\ +\x01\x0e\x00/3?3\x11\x12\x0199\x11310\ +73\x15\x14\x06#\x22'5\x163255#\xd3\ +w\x5c[8*-'b\x14^\xf4hs\x15\x5c\x12\ +|\x96\x00\x00\x01\x001\xfe\x8f\x01J\x00^\x00\x0e\x00\ +\x1b@\x0b\x0c\x02\x08\x02\x10\x0f\x0a\x05\x22\x01\x0e\x00/\ +3?3\x11\x12\x0199\x1131073\x15\x14\ +\x06#\x22'5\x163255#\xd3w\x5c[8\ +*-'b\x14^\xf4hs\x15\x5c\x12|\x96\x00\x00\ +\x01\x00?\x00\x00\x02#\x05\xb6\x00\x0a\x00 @\x0e\x09\ +\x08\x00\x01\x01\x0c\x0b\x07\x09\x01\x18\x04\x09\x06\x00?3\ +?\x129\x11\x12\x019\x1133310!#\x11\ +47\x06\x06\x05'\x013\x02#b\x0c\x0f \xfe\xdb\ +:\x01\x8eV\x04)\x91\x9c\x0f\x1c\xe5G\x01)\x00\x00\ +\x02\x00w\xff\xec\x04\x1b\x04s\x00\x0b\x00\x16\x00(@\ +\x14\x11\x00\x0c\x06\x06\x00\x18\x17\x09\x14MY\x09'\x03\ +\x0fMY\x03\x19\x00?+\x00\x18?+\x11\x12\x019\ +9\x113\x11310\x01\x10\x02#\x22\x02\x11\x10\x12\ +32\x12\x01\x14\x163 \x114&#\x22\x06\x04\x1b\ +\xf8\xdf\xd8\xf5\xf8\xdb\xdb\xf6\xfc\xc4\xb7\xb2\x01j\xb8\xb4\ +\xb1\xb6\x021\xfe\xec\xfe\xcf\x011\x01\x14\x01\x15\x01-\ +\xfe\xd2\xfe\xec\xef\xfc\x01\xeb\xf3\xf5\xf4\x00\x01\x003\x00\ +\x00\x02\x17\x04^\x00\x0a\x00 @\x0e\x09\x08\x00\x01\x01\ +\x0c\x0b\x07\x09\x01\x18\x04\x09&\x00?3?\x129\x11\ +\x12\x019\x1133310!#\x1147\x06\x06\ +\x07'\x013\x02\x17c\x0d'Q\xe15\x01\x92R\x02\ +\xd1\x84\xa9%C\x9cH\x01\x1c\x00\x01\x003\x00\x00\x03\ +\xb2\x04s\x00\x18\x00<@\x1f\x17\x02\x07\x12\x00\x02\x0d\ +\x12\x04\x1a\x19\x04\x15\x15\x0f\x16\x0f\x0aMY\x0f'\x02\ +\x16\x01\x01\x16NY\x01\x18\x00?+\x11\x12\x009\x18\ +?+\x11\x12\x009\x113\x11\x12\x01\x179\x113\x11\ +310!!5\x01>\x0254&#\x22\x07'\ +632\x16\x15\x14\x06\x07\x01\x17!\x03\xb2\xfc\x81\x01\ +\x89\x99~7\x9c\x85\xbc\xa25\xb5\xf3\xaa\xc9{\xb7\xfe\ +\x94\x02\x02\xddX\x01+s\x7ftHl|\x86F\x9a\ +\xad\x95v\xb9\x8b\xfe\xeb\x02\x00\x00\x01\x00*\xfe\x95\x03\ +\xcc\x04t\x00(\x00Q@+\x04\x17\x1c\x00\x13\x07#\ +\x0c\x00\x07\x0c\x17\x04*)\x04\x18\x17\x18\x17NY\x0f\ +\x18\x01\x0b\x03\x18\x18\x0a&&\x1fMY&'\x0a\x10\ +MY\x0a%\x00?+\x00\x18?+\x11\x12\x009\x18\ +/_^]+\x11\x12\x009\x11\x12\x01\x179\x113\ +\x113\x113\x12910\x01\x14\x06\x07\x15\x16\x16\x15\ +\x14\x04!\x22'5\x16\x1632654&##\ +532654&#\x22\x06\x07'6632\ +\x16\x03\x9f\xab\x90\xb0\xb8\xfe\xe9\xfe\xfa\xdf\xa6T\xd1\x5c\ +\xdd\xde\xe3\xdc\x9e\xa0\xb6\xd5\xad\x8cm\xb4p1U\xf0\ +{\xca\xdc\x03\x07\x88\xba\x1a\x06\x16\xb4\x98\xcd\xe1Sc\ +,2\xb3\xa3\x91\x9c`\xad\x94z\x93=JCGS\ +\xbf\x00\x02\x00\x17\xfe\xa8\x04`\x04^\x00\x0a\x00\x12\x00\ +<@\x1e\x0b\x09\x07\x04\x01\x12\x06\x06\x01\x00\x03\x14\x13\ +\x06\x12\x01\x05\x12\x05MY\x09\x12\x12\x03\x0f\x07&\x03\ +$\x00??3\x129/3+\x11\x003\x129\x11\ +\x12\x01\x179\x113\x11333310%#\x11\ +#\x11!5\x013\x113!\x11\x107#\x06\x07\x01\ +\x04`\xfc^\xfd\x11\x02\xd5x\xfc\xfe\xa6\x0e\x08\x17d\ +\xfd\xfc%\xfe\x83\x01}C\x03\xf6\xfc\x1d\x01\x91\x01*\ +\xd2,\x90\xfd/\x00\x01\x00\x82\xfe\x95\x04\x03\x04_\x00\ +\x1c\x00:@\x1f\x10\x03\x1b\x16\x0a\x16\x18\x03\x04\x1e\x1d\ +\x00\x13MY\x00\x00\x06\x17\x17\x1aNY\x17&\x06\x0d\ +MY\x06%\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x01\x179\x113\x11310\x012\x04\ +\x15\x14\x04#\x22&'5\x16\x1632654&\ +#\x22\x07'\x13!\x15!\x036\x02\x0c\xea\x01\x0d\xfe\ +\xe8\xf6m\xc4Bl\xa8_\xc0\xe8\xe2\xc2\x82\x8e<:\ +\x02\xc0\xfd\x9e-\x9c\x02\x18\xe2\xc6\xe1\xfa+(g7\ ++\xcb\xad\xa3\xba''\x02\x9d`\xfd\xfc\x1d\xff\xff\x00\ +\x83\xff\xec\x04#\x05\xcd\x02\x06\x00\x19\x00\x00\x00\x01\x00\ +/\xfe\xa9\x03\xe1\x04_\x00\x06\x00(@\x14\x01\x05\x06\ +\x00\x02\x00\x05\x03\x08\x07\x05\x02\x03\x02NY\x03&\x00\ +$\x00??+\x11\x003\x11\x12\x01\x179\x113\x11\ +310\x01\x01!5!\x15\x01\x01\x10\x02Z\xfc\xc5\ +\x03\xb2\xfd\xa4\xfe\xa9\x05V`I\xfa\x93\x00\xff\xff\x00\ +{\xff\xec\x04\x16\x05\xcf\x00\x06\x00\x1b\x02\x00\x00\x02\x00\ +s\xfe\x95\x04\x10\x04v\x00\x1a\x00(\x00I@(%\ +\x0d\x00\x1e\x14\x14\x07\x00\x03*)\x11!OY\x0d\x17\ +\x00\x11p\x11\x02\x0a\x03\x11\x11\x04\x17\x17\x1bMY\x17\ +'\x04\x0aOY\x04%\x00?+\x00\x18?+\x11\x12\ +\x009\x18/_^]\x129+\x11\x12\x01\x179\x11\ +3\x113310\x01\x10\x02\x04#\x22'5\x16\x16\ +32\x00\x13#\x06\x06#\x22&54\x1232\x16\ +\x12\x01\x22\x06\x15\x14\x16326654&&\x04\ +\x10\x97\xfe\xdf\xcdhX+y \xf7\x01\x18\x10\x0cI\ +\xcan\xcb\xe3\xf9\xc7\x90\xd8u\xfe#\x9e\xbc\xae\xa2e\ +\xafg]\xa7\x01\xf3\xfe\xe0\xfe|\xba\x1aV\x0e\x0f\x01\ +e\x01V`g\xe0\xce\xdc\x01\x10\x97\xfe\xdc\x01c\xd5\ +\xb9\xae\xb4Z\x95Mu\xccs\xff\xff\x00\x1d\x00\x00\x05\ +;\x06\x1f\x00&\x00I\x00\x00\x00\x07\x00I\x02f\x00\ +\x00\x00\x02\x00\x5c\x02\xdd\x05Z\x05\xc1\x00!\x002\x00\ +Q@*+..-2\x22*)&&'\x0a\x00\ +\x1b\x10\x06\x10\x15\x00'*-\x0743\x18\x13(.\ +*\x22'\x08\x00\x03\x01\x030+$(\x04\x00?3\ +33\xd4]2\xc4222\x10\xc42\x11\x12\x01\x17\ +9\x113\x113\x113\x113\x1133\x113\x113\ +10\x01\x14\x06#\x22'5\x163254&'\ +&&54632\x17\x07&#\x22\x06\x15\x14\x16\ +\x17\x1e\x02\x01\x03#\x17\x11#\x113\x13\x133\x11#\ +\x117#\x03\x025\x95{\x8b>ch\xb4;qp\ +U\x86hzW\x1fP^EV;n^K\x22\x01\ +\xa0\xdd\x06\x04R}\xdd\xdf}V\x04\x06\xe3\x03\xaa\x5c\ +q\x1fN!y;:('YONe!L!\ +6/28)$4F\xfe\xfe\x02`\xc8\xfeh\x02\ +\xd1\xfd\xa2\x02^\xfd/\x01\x8d\xcf\xfd\xa4\x00\xff\xff\x00\ +\x0a\xfe\x14\x04'\x05\xb6\x02&\x007\x00\x00\x00\x07\x00\ +z\x01%\x00\x00\xff\xff\x00\x19\xfe\x14\x02y\x05F\x02\ +&\x00W\x00\x00\x00\x07\x00z\x00\xc5\x00\x00\x00\x02\x00\ +w\xfe\x14\x04\x0c\x04T\x00\x1c\x00)\x00G@&'\ +\x08 \x0d\x1c\x1c\x11\x11\x17\x08\x03*+\x14\x19FY\ +\x17\x14\x1b\x0f\x0f\x02\x0d\x05\x0b\x0b$FY\x0b\x10\x05\ +\x1dHY\x05\x16\x00?+\x00\x18?+\x11\x12\x009\ +9\x18??3+\x11\x12\x01\x179\x113\x1133\ +\x11310\x0547#\x06#\x22\x02\x11\x10\x123\ +2\x17373\x11\x14\x02#\x22'5\x16326\ +5%26\x1154&#\x22\x06\x15\x14\x16\x03\xaa\ +\x06\x06v\xfb\xd6\xec\xec\xdc\xecu\x06\x12T\xf4\xcc\xdd\ +\x9c\xa6\xd9\xa0\xb8\xfe\x91\xc6\xa9\xaa\xba\xb0\xb7\xb3\x02v\ +6\xbe\x01\x1c\x01\x0c\x01\x13\x01-\xae\x99\xfb\xad\xd6\xfe\ +\xfeFkX\xc8\xb4[\xda\x01\x01\x0c\xf5\xda\xf8\xf0\xe5\ +\xe9\xff\xff\x00w\xfe\x14\x04\x0c\x06!\x02&\x03\x91\x00\ +\x00\x01\x06\x01K\xf9\x00\x00\x08\xb3\x027\x11&\x00+\ +5\xff\xff\x00w\xfe\x14\x04\x0c\x05\xcf\x02&\x03\x91\x00\ +\x00\x01\x06\x01N\xf5\x00\x00\x08\xb3\x02*\x11&\x00+\ +5\xff\xff\x00w\xfe\x14\x04\x0c\x05\xcd\x02&\x03\x91\x00\ +\x00\x01\x07\x01O\x01P\x00\x00\x00\x08\xb3\x022\x11&\ +\x00+5\xff\xff\x00w\xfe\x14\x04\x0c\x06!\x02&\x03\ +\x91\x00\x00\x01\x06\x02:}\x00\x00\x08\xb3\x02.\x11&\ +\x00+5\x00\x01\x00\xcf\x00\x00\x015\x05\xb6\x00\x03\x00\ +\x11\xb6\x00\x04\x05\x01\x03\x00\x12\x00??\x11\x12\x019\ +103\x113\x11\xcff\x05\xb6\xfaJ\x00\xff\xff\xff\ +\xc1\x00\x00\x01@\x07s\x02&\x03\x96\x00\x00\x01\x07\x00\ +C\xfe8\x01R\x00\x08\xb3\x01\x05\x05&\x00+5\xff\ +\xff\x00\xbf\x00\x00\x02>\x07s\x02&\x03\x96\x00\x00\x01\ +\x07\x00v\xff6\x01R\x00\x08\xb3\x01\x0d\x05&\x00+\ +5\xff\xff\xff\xe0\x00\x00\x02&\x07s\x02&\x03\x96\x00\ +\x00\x01\x07\x01K\xfe\xb5\x01R\x00\x08\xb3\x01\x11\x05&\ +\x00+5\xff\xff\x00\x05\x00\x00\x02\x01\x07\x15\x02&\x03\ +\x96\x00\x00\x01\x07\x00j\xfe\xb5\x01R\x00\x0a\xb4\x02\x01\ +\x14\x05&\x00+55\xff\xff\xff\xb2\x00\x00\x02l\x07\ +\x1b\x02&\x03\x96\x00\x00\x01\x07\x01R\xfe\x97\x01R\x00\ +\x08\xb3\x01\x0e\x05&\x00+5\xff\xff\xff\xef\x00\x00\x02\ +\x1a\x06\x87\x02&\x03\x96\x00\x00\x01\x07\x01M\xfe\xca\x01\ +R\x00\x08\xb3\x01\x07\x05&\x00+5\xff\xff\xff\xee\x00\ +\x00\x02\x17\x07!\x02&\x03\x96\x00\x00\x01\x07\x01N\xfe\ +\xb7\x01R\x00\x08\xb3\x01\x04\x05&\x00+5\xff\xff\x00\ +A\xfeB\x01`\x05\xb6\x02&\x03\x96\x00\x00\x00\x06\x01\ +Q\x02\x00\xff\xff\x00\xc2\x00\x00\x01C\x07\x1f\x02&\x03\ +\x96\x00\x00\x01\x07\x01O\x00\x10\x01R\x00\x08\xb3\x01\x0c\ +\x05&\x00+5\xff\xff\x00\xcf\xfe\x8f\x039\x05\xb6\x00\ +&\x03\x96\x00\x00\x00\x07\x00-\x02\x04\x00\x00\xff\xff\xff\ +\xd8\x00\x00\x01\x8b\x06\x0a\x00&\x03\x96V\x00\x01\x07\x01\ +T\xfd\xc6\xff\x97\x00\x07\xb2\x01\x08\x00\x00?5\x00\xff\ +\xff\x00\xcf\x00\x00\x015\x05\xb6\x02\x06\x03\x96\x00\x00\xff\ +\xff\x00\x05\x00\x00\x02\x01\x07\x15\x02&\x03\x96\x00\x00\x01\ +\x07\x00j\xfe\xb5\x01R\x00\x0a\xb4\x02\x01\x14\x05&\x00\ ++55\xff\xff\x00\xcf\x00\x00\x015\x05\xb6\x02\x06\x03\ +\x96\x00\x00\xff\xff\x00\x05\x00\x00\x02\x01\x07\x15\x02&\x03\ +\x96\x00\x00\x01\x07\x00j\xfe\xb5\x01R\x00\x0a\xb4\x02\x01\ +\x14\x05&\x00+55\xff\xff\x00\xcf\x00\x00\x015\x05\ +\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00\xcf\x00\x00\x015\x05\ +\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00\x85\x00\x00\x01\xd5\x07\ +\xe1\x02&\x03\x96\x00\x00\x01\x07\x02f\x03q\x01R\x00\ +\x08\xb3\x01\x08\x05&\x00+5\xff\xff\x00\xc0\xfe\xbc\x01\ +B\x05\xb6\x02&\x03\x96\x00\x00\x00\x07\x02g\x03V\x00\ +\x00\x00\x00\x00\x00\x00\x01\x00\x00\xb62\x00\x01I\x06\x80\ +\x00\x00\x0e6$\x00\x05\x00$\xffq\x00\x05\x007\x00\ +)\x00\x05\x009\x00)\x00\x05\x00:\x00)\x00\x05\x00\ +<\x00\x14\x00\x05\x00D\xff\xae\x00\x05\x00F\xff\x85\x00\ +\x05\x00G\xff\x85\x00\x05\x00H\xff\x85\x00\x05\x00J\xff\ +\xc3\x00\x05\x00P\xff\xc3\x00\x05\x00Q\xff\xc3\x00\x05\x00\ +R\xff\x85\x00\x05\x00S\xff\xc3\x00\x05\x00T\xff\x85\x00\ +\x05\x00U\xff\xc3\x00\x05\x00V\xff\xc3\x00\x05\x00X\xff\ +\xc3\x00\x05\x00\x82\xffq\x00\x05\x00\x83\xffq\x00\x05\x00\ +\x84\xffq\x00\x05\x00\x85\xffq\x00\x05\x00\x86\xffq\x00\ +\x05\x00\x87\xffq\x00\x05\x00\x9f\x00\x14\x00\x05\x00\xa2\xff\ +\x85\x00\x05\x00\xa3\xff\xae\x00\x05\x00\xa4\xff\xae\x00\x05\x00\ +\xa5\xff\xae\x00\x05\x00\xa6\xff\xae\x00\x05\x00\xa7\xff\xae\x00\ +\x05\x00\xa8\xff\xae\x00\x05\x00\xa9\xff\x85\x00\x05\x00\xaa\xff\ +\x85\x00\x05\x00\xab\xff\x85\x00\x05\x00\xac\xff\x85\x00\x05\x00\ +\xad\xff\x85\x00\x05\x00\xb4\xff\x85\x00\x05\x00\xb5\xff\x85\x00\ +\x05\x00\xb6\xff\x85\x00\x05\x00\xb7\xff\x85\x00\x05\x00\xb8\xff\ +\x85\x00\x05\x00\xba\xff\x85\x00\x05\x00\xbb\xff\xc3\x00\x05\x00\ +\xbc\xff\xc3\x00\x05\x00\xbd\xff\xc3\x00\x05\x00\xbe\xff\xc3\x00\ +\x05\x00\xc2\xffq\x00\x05\x00\xc3\xff\xae\x00\x05\x00\xc4\xff\ +q\x00\x05\x00\xc5\xff\xae\x00\x05\x00\xc6\xffq\x00\x05\x00\ +\xc7\xff\xae\x00\x05\x00\xc9\xff\x85\x00\x05\x00\xcb\xff\x85\x00\ +\x05\x00\xcd\xff\x85\x00\x05\x00\xcf\xff\x85\x00\x05\x00\xd1\xff\ +\x85\x00\x05\x00\xd3\xff\x85\x00\x05\x00\xd5\xff\x85\x00\x05\x00\ +\xd7\xff\x85\x00\x05\x00\xd9\xff\x85\x00\x05\x00\xdb\xff\x85\x00\ +\x05\x00\xdd\xff\x85\x00\x05\x00\xdf\xff\xc3\x00\x05\x00\xe1\xff\ +\xc3\x00\x05\x00\xe3\xff\xc3\x00\x05\x00\xe5\xff\xc3\x00\x05\x00\ +\xfa\xff\xc3\x00\x05\x01\x06\xff\xc3\x00\x05\x01\x08\xff\xc3\x00\ +\x05\x01\x0d\xff\xc3\x00\x05\x01\x0f\xff\x85\x00\x05\x01\x11\xff\ +\x85\x00\x05\x01\x13\xff\x85\x00\x05\x01\x15\xff\x85\x00\x05\x01\ +\x17\xff\xc3\x00\x05\x01\x19\xff\xc3\x00\x05\x01\x1d\xff\xc3\x00\ +\x05\x01!\xff\xc3\x00\x05\x01$\x00)\x00\x05\x01&\x00\ +)\x00\x05\x01+\xff\xc3\x00\x05\x01-\xff\xc3\x00\x05\x01\ +/\xff\xc3\x00\x05\x011\xff\xc3\x00\x05\x013\xff\xc3\x00\ +\x05\x015\xff\xc3\x00\x05\x016\x00)\x00\x05\x018\x00\ +\x14\x00\x05\x01:\x00\x14\x00\x05\x01C\xffq\x00\x05\x01\ +D\xff\xae\x00\x05\x01F\xff\xae\x00\x05\x01H\xff\x85\x00\ +\x05\x01J\xff\xc3\x00\x05\x01V\xffq\x00\x05\x01_\xff\ +q\x00\x05\x01b\xffq\x00\x05\x01i\xffq\x00\x05\x01\ +y\xff\xae\x00\x05\x01z\xff\xd7\x00\x05\x01{\xff\xd7\x00\ +\x05\x01~\xff\xae\x00\x05\x01\x81\xff\xc3\x00\x05\x01\x82\xff\ +\xd7\x00\x05\x01\x83\xff\xd7\x00\x05\x01\x84\xff\xd7\x00\x05\x01\ +\x87\xff\xd7\x00\x05\x01\x89\xff\xd7\x00\x05\x01\x8c\xff\xae\x00\ +\x05\x01\x8e\xff\xc3\x00\x05\x01\x8f\xff\xae\x00\x05\x01\x90\xff\ +\xae\x00\x05\x01\x93\xff\xae\x00\x05\x01\x99\xff\xae\x00\x05\x01\ +\xa4\xff\x85\x00\x05\x01\xaa\xffq\x00\x05\x01\xae\xff\x85\x00\ +\x05\x01\xb5\xff\x85\x00\x05\x01\xca\xff\xd7\x00\x05\x01\xce\xff\ +q\x00\x05\x01\xcf\xff\x85\x00\x05\x01\xd5\xffq\x00\x05\x01\ +\xd8\xff\x85\x00\x05\x01\xdb\xff\x85\x00\x05\x01\xde\xff\x85\x00\ +\x05\x01\xea\xff\x85\x00\x05\x01\xed\xff\x85\x00\x05\x01\xee\xff\ +\xc3\x00\x05\x01\xf2\xffq\x00\x05\x01\xfa\x00)\x00\x05\x01\ +\xfc\x00)\x00\x05\x01\xfe\x00)\x00\x05\x02\x00\x00\x14\x00\ +\x05\x02W\xff\xc3\x00\x05\x02X\xffq\x00\x05\x02Y\xff\ +\xae\x00\x05\x02`\xff\x85\x00\x05\x02b\xff\xc3\x00\x05\x02\ +j\xff\x85\x00\x05\x02r\xffq\x00\x05\x02s\xffq\x00\ +\x05\x02}\xff\xec\x00\x05\x02\x7f\xff\x85\x00\x05\x02\x85\xff\ +\x85\x00\x05\x02\x87\xff\x85\x00\x05\x02\x89\xff\x85\x00\x05\x02\ +\x8d\xff\x85\x00\x05\x02\xb2\xff\x85\x00\x05\x02\xb4\xff\x85\x00\ +\x05\x02\xce\xff\x85\x00\x05\x02\xcf\xffq\x00\x05\x02\xd9\xff\ +q\x00\x05\x02\xda\xff\xd7\x00\x05\x02\xdb\xffq\x00\x05\x02\ +\xdc\xff\xd7\x00\x05\x02\xdd\xffq\x00\x05\x02\xde\xff\xd7\x00\ +\x05\x02\xe0\xff\x85\x00\x05\x02\xe2\xff\xd7\x00\x05\x02\xe4\xff\ +\xd7\x00\x05\x02\xf0\xff\x85\x00\x05\x02\xf2\xff\x85\x00\x05\x02\ +\xf4\xff\x85\x00\x05\x03\x09\xffq\x00\x05\x03\x0a\xff\x85\x00\ +\x05\x03\x0b\xffq\x00\x05\x03\x0c\xff\x85\x00\x05\x03\x11\xff\ +\x85\x00\x05\x03\x12\xffq\x00\x05\x03\x16\xff\x85\x00\x05\x03\ +\x1a\xff\x85\x00\x05\x03\x1b\xff\x85\x00\x05\x03\x1c\xffq\x00\ +\x05\x03\x1d\xffq\x00\x05\x03\x1e\xff\xae\x00\x05\x03\x1f\xff\ +q\x00\x05\x03 \xff\xae\x00\x05\x03!\xffq\x00\x05\x03\ +\x22\xff\xae\x00\x05\x03#\xffq\x00\x05\x03%\xffq\x00\ +\x05\x03&\xff\xae\x00\x05\x03'\xffq\x00\x05\x03(\xff\ +\xae\x00\x05\x03)\xffq\x00\x05\x03*\xff\xae\x00\x05\x03\ ++\xffq\x00\x05\x03,\xff\xae\x00\x05\x03-\xffq\x00\ +\x05\x03.\xff\xae\x00\x05\x03/\xffq\x00\x05\x030\xff\ +\xae\x00\x05\x031\xffq\x00\x05\x032\xff\xae\x00\x05\x03\ +3\xffq\x00\x05\x034\xff\xae\x00\x05\x036\xff\x85\x00\ +\x05\x038\xff\x85\x00\x05\x03:\xff\x85\x00\x05\x03<\xff\ +\x85\x00\x05\x03@\xff\x85\x00\x05\x03B\xff\x85\x00\x05\x03\ +D\xff\x85\x00\x05\x03J\xff\x85\x00\x05\x03L\xff\x85\x00\ +\x05\x03N\xff\x85\x00\x05\x03R\xff\x85\x00\x05\x03T\xff\ +\x85\x00\x05\x03V\xff\x85\x00\x05\x03X\xff\x85\x00\x05\x03\ +Z\xff\x85\x00\x05\x03\x5c\xff\x85\x00\x05\x03^\xff\x85\x00\ +\x05\x03`\xff\x85\x00\x05\x03b\xff\xc3\x00\x05\x03d\xff\ +\xc3\x00\x05\x03f\xff\xc3\x00\x05\x03h\xff\xc3\x00\x05\x03\ +j\xff\xc3\x00\x05\x03l\xff\xc3\x00\x05\x03n\xff\xc3\x00\ +\x05\x03o\x00\x14\x00\x05\x03q\x00\x14\x00\x05\x03s\x00\ +\x14\x00\x05\x03\x8f\x00)\x00\x0a\x00$\xffq\x00\x0a\x00\ +7\x00)\x00\x0a\x009\x00)\x00\x0a\x00:\x00)\x00\ +\x0a\x00<\x00\x14\x00\x0a\x00D\xff\xae\x00\x0a\x00F\xff\ +\x85\x00\x0a\x00G\xff\x85\x00\x0a\x00H\xff\x85\x00\x0a\x00\ +J\xff\xc3\x00\x0a\x00P\xff\xc3\x00\x0a\x00Q\xff\xc3\x00\ +\x0a\x00R\xff\x85\x00\x0a\x00S\xff\xc3\x00\x0a\x00T\xff\ +\x85\x00\x0a\x00U\xff\xc3\x00\x0a\x00V\xff\xc3\x00\x0a\x00\ +X\xff\xc3\x00\x0a\x00\x82\xffq\x00\x0a\x00\x83\xffq\x00\ +\x0a\x00\x84\xffq\x00\x0a\x00\x85\xffq\x00\x0a\x00\x86\xff\ +q\x00\x0a\x00\x87\xffq\x00\x0a\x00\x9f\x00\x14\x00\x0a\x00\ +\xa2\xff\x85\x00\x0a\x00\xa3\xff\xae\x00\x0a\x00\xa4\xff\xae\x00\ +\x0a\x00\xa5\xff\xae\x00\x0a\x00\xa6\xff\xae\x00\x0a\x00\xa7\xff\ +\xae\x00\x0a\x00\xa8\xff\xae\x00\x0a\x00\xa9\xff\x85\x00\x0a\x00\ +\xaa\xff\x85\x00\x0a\x00\xab\xff\x85\x00\x0a\x00\xac\xff\x85\x00\ +\x0a\x00\xad\xff\x85\x00\x0a\x00\xb4\xff\x85\x00\x0a\x00\xb5\xff\ +\x85\x00\x0a\x00\xb6\xff\x85\x00\x0a\x00\xb7\xff\x85\x00\x0a\x00\ +\xb8\xff\x85\x00\x0a\x00\xba\xff\x85\x00\x0a\x00\xbb\xff\xc3\x00\ +\x0a\x00\xbc\xff\xc3\x00\x0a\x00\xbd\xff\xc3\x00\x0a\x00\xbe\xff\ +\xc3\x00\x0a\x00\xc2\xffq\x00\x0a\x00\xc3\xff\xae\x00\x0a\x00\ +\xc4\xffq\x00\x0a\x00\xc5\xff\xae\x00\x0a\x00\xc6\xffq\x00\ +\x0a\x00\xc7\xff\xae\x00\x0a\x00\xc9\xff\x85\x00\x0a\x00\xcb\xff\ +\x85\x00\x0a\x00\xcd\xff\x85\x00\x0a\x00\xcf\xff\x85\x00\x0a\x00\ +\xd1\xff\x85\x00\x0a\x00\xd3\xff\x85\x00\x0a\x00\xd5\xff\x85\x00\ +\x0a\x00\xd7\xff\x85\x00\x0a\x00\xd9\xff\x85\x00\x0a\x00\xdb\xff\ +\x85\x00\x0a\x00\xdd\xff\x85\x00\x0a\x00\xdf\xff\xc3\x00\x0a\x00\ +\xe1\xff\xc3\x00\x0a\x00\xe3\xff\xc3\x00\x0a\x00\xe5\xff\xc3\x00\ +\x0a\x00\xfa\xff\xc3\x00\x0a\x01\x06\xff\xc3\x00\x0a\x01\x08\xff\ +\xc3\x00\x0a\x01\x0d\xff\xc3\x00\x0a\x01\x0f\xff\x85\x00\x0a\x01\ +\x11\xff\x85\x00\x0a\x01\x13\xff\x85\x00\x0a\x01\x15\xff\x85\x00\ +\x0a\x01\x17\xff\xc3\x00\x0a\x01\x19\xff\xc3\x00\x0a\x01\x1d\xff\ +\xc3\x00\x0a\x01!\xff\xc3\x00\x0a\x01$\x00)\x00\x0a\x01\ +&\x00)\x00\x0a\x01+\xff\xc3\x00\x0a\x01-\xff\xc3\x00\ +\x0a\x01/\xff\xc3\x00\x0a\x011\xff\xc3\x00\x0a\x013\xff\ +\xc3\x00\x0a\x015\xff\xc3\x00\x0a\x016\x00)\x00\x0a\x01\ +8\x00\x14\x00\x0a\x01:\x00\x14\x00\x0a\x01C\xffq\x00\ +\x0a\x01D\xff\xae\x00\x0a\x01F\xff\xae\x00\x0a\x01H\xff\ +\x85\x00\x0a\x01J\xff\xc3\x00\x0a\x01V\xffq\x00\x0a\x01\ +_\xffq\x00\x0a\x01b\xffq\x00\x0a\x01i\xffq\x00\ +\x0a\x01y\xff\xae\x00\x0a\x01z\xff\xd7\x00\x0a\x01{\xff\ +\xd7\x00\x0a\x01~\xff\xae\x00\x0a\x01\x81\xff\xc3\x00\x0a\x01\ +\x82\xff\xd7\x00\x0a\x01\x83\xff\xd7\x00\x0a\x01\x84\xff\xd7\x00\ +\x0a\x01\x87\xff\xd7\x00\x0a\x01\x89\xff\xd7\x00\x0a\x01\x8c\xff\ +\xae\x00\x0a\x01\x8e\xff\xc3\x00\x0a\x01\x8f\xff\xae\x00\x0a\x01\ +\x90\xff\xae\x00\x0a\x01\x93\xff\xae\x00\x0a\x01\x99\xff\xae\x00\ +\x0a\x01\xa4\xff\x85\x00\x0a\x01\xaa\xffq\x00\x0a\x01\xae\xff\ +\x85\x00\x0a\x01\xb5\xff\x85\x00\x0a\x01\xca\xff\xd7\x00\x0a\x01\ +\xce\xffq\x00\x0a\x01\xcf\xff\x85\x00\x0a\x01\xd5\xffq\x00\ +\x0a\x01\xd8\xff\x85\x00\x0a\x01\xdb\xff\x85\x00\x0a\x01\xde\xff\ +\x85\x00\x0a\x01\xea\xff\x85\x00\x0a\x01\xed\xff\x85\x00\x0a\x01\ +\xee\xff\xc3\x00\x0a\x01\xf2\xffq\x00\x0a\x01\xfa\x00)\x00\ +\x0a\x01\xfc\x00)\x00\x0a\x01\xfe\x00)\x00\x0a\x02\x00\x00\ +\x14\x00\x0a\x02W\xff\xc3\x00\x0a\x02X\xffq\x00\x0a\x02\ +Y\xff\xae\x00\x0a\x02`\xff\x85\x00\x0a\x02b\xff\xc3\x00\ +\x0a\x02j\xff\x85\x00\x0a\x02r\xffq\x00\x0a\x02s\xff\ +q\x00\x0a\x02}\xff\xec\x00\x0a\x02\x7f\xff\x85\x00\x0a\x02\ +\x85\xff\x85\x00\x0a\x02\x87\xff\x85\x00\x0a\x02\x89\xff\x85\x00\ +\x0a\x02\x8d\xff\x85\x00\x0a\x02\xb2\xff\x85\x00\x0a\x02\xb4\xff\ +\x85\x00\x0a\x02\xce\xff\x85\x00\x0a\x02\xcf\xffq\x00\x0a\x02\ +\xd9\xffq\x00\x0a\x02\xda\xff\xd7\x00\x0a\x02\xdb\xffq\x00\ +\x0a\x02\xdc\xff\xd7\x00\x0a\x02\xdd\xffq\x00\x0a\x02\xde\xff\ +\xd7\x00\x0a\x02\xe0\xff\x85\x00\x0a\x02\xe2\xff\xd7\x00\x0a\x02\ +\xe4\xff\xd7\x00\x0a\x02\xf0\xff\x85\x00\x0a\x02\xf2\xff\x85\x00\ +\x0a\x02\xf4\xff\x85\x00\x0a\x03\x09\xffq\x00\x0a\x03\x0a\xff\ +\x85\x00\x0a\x03\x0b\xffq\x00\x0a\x03\x0c\xff\x85\x00\x0a\x03\ +\x11\xff\x85\x00\x0a\x03\x12\xffq\x00\x0a\x03\x16\xff\x85\x00\ +\x0a\x03\x1a\xff\x85\x00\x0a\x03\x1b\xff\x85\x00\x0a\x03\x1c\xff\ +q\x00\x0a\x03\x1d\xffq\x00\x0a\x03\x1e\xff\xae\x00\x0a\x03\ +\x1f\xffq\x00\x0a\x03 \xff\xae\x00\x0a\x03!\xffq\x00\ +\x0a\x03\x22\xff\xae\x00\x0a\x03#\xffq\x00\x0a\x03%\xff\ +q\x00\x0a\x03&\xff\xae\x00\x0a\x03'\xffq\x00\x0a\x03\ +(\xff\xae\x00\x0a\x03)\xffq\x00\x0a\x03*\xff\xae\x00\ +\x0a\x03+\xffq\x00\x0a\x03,\xff\xae\x00\x0a\x03-\xff\ +q\x00\x0a\x03.\xff\xae\x00\x0a\x03/\xffq\x00\x0a\x03\ +0\xff\xae\x00\x0a\x031\xffq\x00\x0a\x032\xff\xae\x00\ +\x0a\x033\xffq\x00\x0a\x034\xff\xae\x00\x0a\x036\xff\ +\x85\x00\x0a\x038\xff\x85\x00\x0a\x03:\xff\x85\x00\x0a\x03\ +<\xff\x85\x00\x0a\x03@\xff\x85\x00\x0a\x03B\xff\x85\x00\ +\x0a\x03D\xff\x85\x00\x0a\x03J\xff\x85\x00\x0a\x03L\xff\ +\x85\x00\x0a\x03N\xff\x85\x00\x0a\x03R\xff\x85\x00\x0a\x03\ +T\xff\x85\x00\x0a\x03V\xff\x85\x00\x0a\x03X\xff\x85\x00\ +\x0a\x03Z\xff\x85\x00\x0a\x03\x5c\xff\x85\x00\x0a\x03^\xff\ +\x85\x00\x0a\x03`\xff\x85\x00\x0a\x03b\xff\xc3\x00\x0a\x03\ +d\xff\xc3\x00\x0a\x03f\xff\xc3\x00\x0a\x03h\xff\xc3\x00\ +\x0a\x03j\xff\xc3\x00\x0a\x03l\xff\xc3\x00\x0a\x03n\xff\ +\xc3\x00\x0a\x03o\x00\x14\x00\x0a\x03q\x00\x14\x00\x0a\x03\ +s\x00\x14\x00\x0a\x03\x8f\x00)\x00\x0b\x00-\x00\xb8\x00\ +\x0f\x00&\xff\x9a\x00\x0f\x00*\xff\x9a\x00\x0f\x002\xff\ +\x9a\x00\x0f\x004\xff\x9a\x00\x0f\x007\xffq\x00\x0f\x00\ +8\xff\xd7\x00\x0f\x009\xff\x85\x00\x0f\x00:\xff\x85\x00\ +\x0f\x00<\xff\x85\x00\x0f\x00\x89\xff\x9a\x00\x0f\x00\x94\xff\ +\x9a\x00\x0f\x00\x95\xff\x9a\x00\x0f\x00\x96\xff\x9a\x00\x0f\x00\ +\x97\xff\x9a\x00\x0f\x00\x98\xff\x9a\x00\x0f\x00\x9a\xff\x9a\x00\ +\x0f\x00\x9b\xff\xd7\x00\x0f\x00\x9c\xff\xd7\x00\x0f\x00\x9d\xff\ +\xd7\x00\x0f\x00\x9e\xff\xd7\x00\x0f\x00\x9f\xff\x85\x00\x0f\x00\ +\xc8\xff\x9a\x00\x0f\x00\xca\xff\x9a\x00\x0f\x00\xcc\xff\x9a\x00\ +\x0f\x00\xce\xff\x9a\x00\x0f\x00\xde\xff\x9a\x00\x0f\x00\xe0\xff\ +\x9a\x00\x0f\x00\xe2\xff\x9a\x00\x0f\x00\xe4\xff\x9a\x00\x0f\x01\ +\x0e\xff\x9a\x00\x0f\x01\x10\xff\x9a\x00\x0f\x01\x12\xff\x9a\x00\ +\x0f\x01\x14\xff\x9a\x00\x0f\x01$\xffq\x00\x0f\x01&\xff\ +q\x00\x0f\x01*\xff\xd7\x00\x0f\x01,\xff\xd7\x00\x0f\x01\ +.\xff\xd7\x00\x0f\x010\xff\xd7\x00\x0f\x012\xff\xd7\x00\ +\x0f\x014\xff\xd7\x00\x0f\x016\xff\x85\x00\x0f\x018\xff\ +\x85\x00\x0f\x01:\xff\x85\x00\x0f\x01G\xff\x9a\x00\x0f\x01\ +f\xff\xae\x00\x0f\x01m\xff\xae\x00\x0f\x01q\xffq\x00\ +\x0f\x01r\xff\x85\x00\x0f\x01s\xff\x9a\x00\x0f\x01u\xff\ +\x85\x00\x0f\x01x\xff\x85\x00\x0f\x01\x85\xff\xd7\x00\x0f\x01\ +\x9d\xffq\x00\x0f\x01\x9f\xff\x9a\x00\x0f\x01\xa6\xffq\x00\ +\x0f\x01\xb8\xff\x9a\x00\x0f\x01\xbb\xff\x9a\x00\x0f\x01\xbc\xff\ +q\x00\x0f\x01\xbe\xff\xae\x00\x0f\x01\xc1\xff\x5c\x00\x0f\x01\ +\xc4\xffq\x00\x0f\x01\xdc\xff\x9a\x00\x0f\x01\xe1\xff\x85\x00\ +\x0f\x01\xe4\xff\x9a\x00\x0f\x01\xfa\xff\x85\x00\x0f\x01\xfc\xff\ +\x85\x00\x0f\x01\xfe\xff\x85\x00\x0f\x02\x00\xff\x85\x00\x0f\x02\ +T\xff\x85\x00\x0f\x02_\xff\x9a\x00\x0f\x02a\xff\xd7\x00\ +\x0f\x02l\xff\x9a\x00\x0f\x02|\xff\x5c\x00\x0f\x02~\xff\ +\x9a\x00\x0f\x02\x80\xff\x85\x00\x0f\x02\x82\xff\x85\x00\x0f\x02\ +\x84\xff\x9a\x00\x0f\x02\x86\xff\x9a\x00\x0f\x02\x88\xff\x9a\x00\ +\x0f\x02\x8a\xff\x9a\x00\x0f\x02\x8c\xff\x9a\x00\x0f\x02\xa9\xff\ +q\x00\x0f\x02\xaa\xff\x9a\x00\x0f\x02\xb1\xff\x9a\x00\x0f\x02\ +\xb3\xff\x9a\x00\x0f\x02\xb5\xffq\x00\x0f\x02\xb6\xff\x9a\x00\ +\x0f\x02\xb7\xff\x85\x00\x0f\x02\xb9\xff\x85\x00\x0f\x02\xbd\xff\ +q\x00\x0f\x02\xbe\xff\x9a\x00\x0f\x02\xbf\xff\x5c\x00\x0f\x02\ +\xc0\xff\x85\x00\x0f\x02\xc1\xff\x5c\x00\x0f\x02\xc2\xff\x85\x00\ +\x0f\x02\xc5\xff\x85\x00\x0f\x02\xc7\xff\x85\x00\x0f\x02\xd4\xff\ +\x5c\x00\x0f\x02\xd5\xff\x85\x00\x0f\x02\xef\xff\x9a\x00\x0f\x02\ +\xf1\xff\x9a\x00\x0f\x02\xf3\xff\x9a\x00\x0f\x02\xfd\xff\x5c\x00\ +\x0f\x02\xfe\xff\x85\x00\x0f\x03\x0d\xff\x85\x00\x0f\x03\x0e\xff\ +\x9a\x00\x0f\x03\x0f\xff\x85\x00\x0f\x03\x10\xff\x9a\x00\x0f\x03\ +\x15\xff\x9a\x00\x0f\x03\x17\xffq\x00\x0f\x03\x18\xff\x9a\x00\ +\x0f\x03I\xff\x9a\x00\x0f\x03K\xff\x9a\x00\x0f\x03M\xff\ +\x9a\x00\x0f\x03O\xff\x9a\x00\x0f\x03Q\xff\x9a\x00\x0f\x03\ +S\xff\x9a\x00\x0f\x03U\xff\x9a\x00\x0f\x03W\xff\x9a\x00\ +\x0f\x03Y\xff\x9a\x00\x0f\x03[\xff\x9a\x00\x0f\x03]\xff\ +\x9a\x00\x0f\x03_\xff\x9a\x00\x0f\x03a\xff\xd7\x00\x0f\x03\ +c\xff\xd7\x00\x0f\x03e\xff\xd7\x00\x0f\x03g\xff\xd7\x00\ +\x0f\x03i\xff\xd7\x00\x0f\x03k\xff\xd7\x00\x0f\x03m\xff\ +\xd7\x00\x0f\x03o\xff\x85\x00\x0f\x03q\xff\x85\x00\x0f\x03\ +s\xff\x85\x00\x0f\x03\x8f\xffq\x00\x10\x007\xff\xae\x00\ +\x10\x01$\xff\xae\x00\x10\x01&\xff\xae\x00\x10\x01q\xff\ +\xae\x00\x10\x01\x9d\xff\xae\x00\x10\x01\xa6\xff\xae\x00\x10\x01\ +\xbc\xff\xae\x00\x10\x01\xc4\xff\xae\x00\x10\x01\xdc\xff\xd7\x00\ +\x10\x01\xe4\xff\xd7\x00\x10\x02\xa9\xff\xae\x00\x10\x02\xaa\xff\ +\xd7\x00\x10\x02\xb5\xff\xae\x00\x10\x02\xb6\xff\xd7\x00\x10\x02\ +\xbd\xff\xae\x00\x10\x02\xbe\xff\xd7\x00\x10\x03\x17\xff\xae\x00\ +\x10\x03\x18\xff\xd7\x00\x10\x03\x8f\xff\xae\x00\x11\x00&\xff\ +\x9a\x00\x11\x00*\xff\x9a\x00\x11\x002\xff\x9a\x00\x11\x00\ +4\xff\x9a\x00\x11\x007\xffq\x00\x11\x008\xff\xd7\x00\ +\x11\x009\xff\x85\x00\x11\x00:\xff\x85\x00\x11\x00<\xff\ +\x85\x00\x11\x00\x89\xff\x9a\x00\x11\x00\x94\xff\x9a\x00\x11\x00\ +\x95\xff\x9a\x00\x11\x00\x96\xff\x9a\x00\x11\x00\x97\xff\x9a\x00\ +\x11\x00\x98\xff\x9a\x00\x11\x00\x9a\xff\x9a\x00\x11\x00\x9b\xff\ +\xd7\x00\x11\x00\x9c\xff\xd7\x00\x11\x00\x9d\xff\xd7\x00\x11\x00\ +\x9e\xff\xd7\x00\x11\x00\x9f\xff\x85\x00\x11\x00\xc8\xff\x9a\x00\ +\x11\x00\xca\xff\x9a\x00\x11\x00\xcc\xff\x9a\x00\x11\x00\xce\xff\ +\x9a\x00\x11\x00\xde\xff\x9a\x00\x11\x00\xe0\xff\x9a\x00\x11\x00\ +\xe2\xff\x9a\x00\x11\x00\xe4\xff\x9a\x00\x11\x01\x0e\xff\x9a\x00\ +\x11\x01\x10\xff\x9a\x00\x11\x01\x12\xff\x9a\x00\x11\x01\x14\xff\ +\x9a\x00\x11\x01$\xffq\x00\x11\x01&\xffq\x00\x11\x01\ +*\xff\xd7\x00\x11\x01,\xff\xd7\x00\x11\x01.\xff\xd7\x00\ +\x11\x010\xff\xd7\x00\x11\x012\xff\xd7\x00\x11\x014\xff\ +\xd7\x00\x11\x016\xff\x85\x00\x11\x018\xff\x85\x00\x11\x01\ +:\xff\x85\x00\x11\x01G\xff\x9a\x00\x11\x01f\xff\xae\x00\ +\x11\x01m\xff\xae\x00\x11\x01q\xffq\x00\x11\x01r\xff\ +\x85\x00\x11\x01s\xff\x9a\x00\x11\x01u\xff\x85\x00\x11\x01\ +x\xff\x85\x00\x11\x01\x85\xff\xd7\x00\x11\x01\x9d\xffq\x00\ +\x11\x01\x9f\xff\x9a\x00\x11\x01\xa6\xffq\x00\x11\x01\xb8\xff\ +\x9a\x00\x11\x01\xbb\xff\x9a\x00\x11\x01\xbc\xffq\x00\x11\x01\ +\xbe\xff\xae\x00\x11\x01\xc1\xff\x5c\x00\x11\x01\xc4\xffq\x00\ +\x11\x01\xdc\xff\x9a\x00\x11\x01\xe1\xff\x85\x00\x11\x01\xe4\xff\ +\x9a\x00\x11\x01\xfa\xff\x85\x00\x11\x01\xfc\xff\x85\x00\x11\x01\ +\xfe\xff\x85\x00\x11\x02\x00\xff\x85\x00\x11\x02T\xff\x85\x00\ +\x11\x02_\xff\x9a\x00\x11\x02a\xff\xd7\x00\x11\x02l\xff\ +\x9a\x00\x11\x02|\xff\x5c\x00\x11\x02~\xff\x9a\x00\x11\x02\ +\x80\xff\x85\x00\x11\x02\x82\xff\x85\x00\x11\x02\x84\xff\x9a\x00\ +\x11\x02\x86\xff\x9a\x00\x11\x02\x88\xff\x9a\x00\x11\x02\x8a\xff\ +\x9a\x00\x11\x02\x8c\xff\x9a\x00\x11\x02\xa9\xffq\x00\x11\x02\ +\xaa\xff\x9a\x00\x11\x02\xb1\xff\x9a\x00\x11\x02\xb3\xff\x9a\x00\ +\x11\x02\xb5\xffq\x00\x11\x02\xb6\xff\x9a\x00\x11\x02\xb7\xff\ +\x85\x00\x11\x02\xb9\xff\x85\x00\x11\x02\xbd\xffq\x00\x11\x02\ +\xbe\xff\x9a\x00\x11\x02\xbf\xff\x5c\x00\x11\x02\xc0\xff\x85\x00\ +\x11\x02\xc1\xff\x5c\x00\x11\x02\xc2\xff\x85\x00\x11\x02\xc5\xff\ +\x85\x00\x11\x02\xc7\xff\x85\x00\x11\x02\xd4\xff\x5c\x00\x11\x02\ +\xd5\xff\x85\x00\x11\x02\xef\xff\x9a\x00\x11\x02\xf1\xff\x9a\x00\ +\x11\x02\xf3\xff\x9a\x00\x11\x02\xfd\xff\x5c\x00\x11\x02\xfe\xff\ +\x85\x00\x11\x03\x0d\xff\x85\x00\x11\x03\x0e\xff\x9a\x00\x11\x03\ +\x0f\xff\x85\x00\x11\x03\x10\xff\x9a\x00\x11\x03\x15\xff\x9a\x00\ +\x11\x03\x17\xffq\x00\x11\x03\x18\xff\x9a\x00\x11\x03I\xff\ +\x9a\x00\x11\x03K\xff\x9a\x00\x11\x03M\xff\x9a\x00\x11\x03\ +O\xff\x9a\x00\x11\x03Q\xff\x9a\x00\x11\x03S\xff\x9a\x00\ +\x11\x03U\xff\x9a\x00\x11\x03W\xff\x9a\x00\x11\x03Y\xff\ +\x9a\x00\x11\x03[\xff\x9a\x00\x11\x03]\xff\x9a\x00\x11\x03\ +_\xff\x9a\x00\x11\x03a\xff\xd7\x00\x11\x03c\xff\xd7\x00\ +\x11\x03e\xff\xd7\x00\x11\x03g\xff\xd7\x00\x11\x03i\xff\ +\xd7\x00\x11\x03k\xff\xd7\x00\x11\x03m\xff\xd7\x00\x11\x03\ +o\xff\x85\x00\x11\x03q\xff\x85\x00\x11\x03s\xff\x85\x00\ +\x11\x03\x8f\xffq\x00$\x00\x05\xffq\x00$\x00\x0a\xff\ +q\x00$\x00&\xff\xd7\x00$\x00*\xff\xd7\x00$\x00\ +-\x01\x0a\x00$\x002\xff\xd7\x00$\x004\xff\xd7\x00\ +$\x007\xffq\x00$\x009\xff\xae\x00$\x00:\xff\ +\xae\x00$\x00<\xff\x85\x00$\x00\x89\xff\xd7\x00$\x00\ +\x94\xff\xd7\x00$\x00\x95\xff\xd7\x00$\x00\x96\xff\xd7\x00\ +$\x00\x97\xff\xd7\x00$\x00\x98\xff\xd7\x00$\x00\x9a\xff\ +\xd7\x00$\x00\x9f\xff\x85\x00$\x00\xc8\xff\xd7\x00$\x00\ +\xca\xff\xd7\x00$\x00\xcc\xff\xd7\x00$\x00\xce\xff\xd7\x00\ +$\x00\xde\xff\xd7\x00$\x00\xe0\xff\xd7\x00$\x00\xe2\xff\ +\xd7\x00$\x00\xe4\xff\xd7\x00$\x01\x0e\xff\xd7\x00$\x01\ +\x10\xff\xd7\x00$\x01\x12\xff\xd7\x00$\x01\x14\xff\xd7\x00\ +$\x01$\xffq\x00$\x01&\xffq\x00$\x016\xff\ +\xae\x00$\x018\xff\x85\x00$\x01:\xff\x85\x00$\x01\ +G\xff\xd7\x00$\x01\xfa\xff\xae\x00$\x01\xfc\xff\xae\x00\ +$\x01\xfe\xff\xae\x00$\x02\x00\xff\x85\x00$\x02\x07\xff\ +q\x00$\x02\x0b\xffq\x00$\x02_\xff\xd7\x00$\x03\ +I\xff\xd7\x00$\x03K\xff\xd7\x00$\x03M\xff\xd7\x00\ +$\x03O\xff\xd7\x00$\x03Q\xff\xd7\x00$\x03S\xff\ +\xd7\x00$\x03U\xff\xd7\x00$\x03W\xff\xd7\x00$\x03\ +Y\xff\xd7\x00$\x03[\xff\xd7\x00$\x03]\xff\xd7\x00\ +$\x03_\xff\xd7\x00$\x03o\xff\x85\x00$\x03q\xff\ +\x85\x00$\x03s\xff\x85\x00$\x03\x8f\xffq\x00%\x00\ +\x0f\xff\xae\x00%\x00\x11\xff\xae\x00%\x00$\xff\xd7\x00\ +%\x007\xff\xc3\x00%\x009\xff\xec\x00%\x00:\xff\ +\xec\x00%\x00;\xff\xd7\x00%\x00<\xff\xec\x00%\x00\ +=\xff\xec\x00%\x00\x82\xff\xd7\x00%\x00\x83\xff\xd7\x00\ +%\x00\x84\xff\xd7\x00%\x00\x85\xff\xd7\x00%\x00\x86\xff\ +\xd7\x00%\x00\x87\xff\xd7\x00%\x00\x9f\xff\xec\x00%\x00\ +\xc2\xff\xd7\x00%\x00\xc4\xff\xd7\x00%\x00\xc6\xff\xd7\x00\ +%\x01$\xff\xc3\x00%\x01&\xff\xc3\x00%\x016\xff\ +\xec\x00%\x018\xff\xec\x00%\x01:\xff\xec\x00%\x01\ +;\xff\xec\x00%\x01=\xff\xec\x00%\x01?\xff\xec\x00\ +%\x01C\xff\xd7\x00%\x01\xa0\xff\xec\x00%\x01\xfa\xff\ +\xec\x00%\x01\xfc\xff\xec\x00%\x01\xfe\xff\xec\x00%\x02\ +\x00\xff\xec\x00%\x02\x08\xff\xae\x00%\x02\x0c\xff\xae\x00\ +%\x02X\xff\xd7\x00%\x03\x1d\xff\xd7\x00%\x03\x1f\xff\ +\xd7\x00%\x03!\xff\xd7\x00%\x03#\xff\xd7\x00%\x03\ +%\xff\xd7\x00%\x03'\xff\xd7\x00%\x03)\xff\xd7\x00\ +%\x03+\xff\xd7\x00%\x03-\xff\xd7\x00%\x03/\xff\ +\xd7\x00%\x031\xff\xd7\x00%\x033\xff\xd7\x00%\x03\ +o\xff\xec\x00%\x03q\xff\xec\x00%\x03s\xff\xec\x00\ +%\x03\x8f\xff\xc3\x00&\x00&\xff\xd7\x00&\x00*\xff\ +\xd7\x00&\x002\xff\xd7\x00&\x004\xff\xd7\x00&\x00\ +\x89\xff\xd7\x00&\x00\x94\xff\xd7\x00&\x00\x95\xff\xd7\x00\ +&\x00\x96\xff\xd7\x00&\x00\x97\xff\xd7\x00&\x00\x98\xff\ +\xd7\x00&\x00\x9a\xff\xd7\x00&\x00\xc8\xff\xd7\x00&\x00\ +\xca\xff\xd7\x00&\x00\xcc\xff\xd7\x00&\x00\xce\xff\xd7\x00\ +&\x00\xde\xff\xd7\x00&\x00\xe0\xff\xd7\x00&\x00\xe2\xff\ +\xd7\x00&\x00\xe4\xff\xd7\x00&\x01\x0e\xff\xd7\x00&\x01\ +\x10\xff\xd7\x00&\x01\x12\xff\xd7\x00&\x01\x14\xff\xd7\x00\ +&\x01G\xff\xd7\x00&\x02_\xff\xd7\x00&\x03I\xff\ +\xd7\x00&\x03K\xff\xd7\x00&\x03M\xff\xd7\x00&\x03\ +O\xff\xd7\x00&\x03Q\xff\xd7\x00&\x03S\xff\xd7\x00\ +&\x03U\xff\xd7\x00&\x03W\xff\xd7\x00&\x03Y\xff\ +\xd7\x00&\x03[\xff\xd7\x00&\x03]\xff\xd7\x00&\x03\ +_\xff\xd7\x00'\x00\x0f\xff\xae\x00'\x00\x11\xff\xae\x00\ +'\x00$\xff\xd7\x00'\x007\xff\xc3\x00'\x009\xff\ +\xec\x00'\x00:\xff\xec\x00'\x00;\xff\xd7\x00'\x00\ +<\xff\xec\x00'\x00=\xff\xec\x00'\x00\x82\xff\xd7\x00\ +'\x00\x83\xff\xd7\x00'\x00\x84\xff\xd7\x00'\x00\x85\xff\ +\xd7\x00'\x00\x86\xff\xd7\x00'\x00\x87\xff\xd7\x00'\x00\ +\x9f\xff\xec\x00'\x00\xc2\xff\xd7\x00'\x00\xc4\xff\xd7\x00\ +'\x00\xc6\xff\xd7\x00'\x01$\xff\xc3\x00'\x01&\xff\ +\xc3\x00'\x016\xff\xec\x00'\x018\xff\xec\x00'\x01\ +:\xff\xec\x00'\x01;\xff\xec\x00'\x01=\xff\xec\x00\ +'\x01?\xff\xec\x00'\x01C\xff\xd7\x00'\x01\xa0\xff\ +\xec\x00'\x01\xfa\xff\xec\x00'\x01\xfc\xff\xec\x00'\x01\ +\xfe\xff\xec\x00'\x02\x00\xff\xec\x00'\x02\x08\xff\xae\x00\ +'\x02\x0c\xff\xae\x00'\x02X\xff\xd7\x00'\x03\x1d\xff\ +\xd7\x00'\x03\x1f\xff\xd7\x00'\x03!\xff\xd7\x00'\x03\ +#\xff\xd7\x00'\x03%\xff\xd7\x00'\x03'\xff\xd7\x00\ +'\x03)\xff\xd7\x00'\x03+\xff\xd7\x00'\x03-\xff\ +\xd7\x00'\x03/\xff\xd7\x00'\x031\xff\xd7\x00'\x03\ +3\xff\xd7\x00'\x03o\xff\xec\x00'\x03q\xff\xec\x00\ +'\x03s\xff\xec\x00'\x03\x8f\xff\xc3\x00(\x00-\x00\ +{\x00)\x00\x0f\xff\x85\x00)\x00\x11\xff\x85\x00)\x00\ +\x22\x00)\x00)\x00$\xff\xd7\x00)\x00\x82\xff\xd7\x00\ +)\x00\x83\xff\xd7\x00)\x00\x84\xff\xd7\x00)\x00\x85\xff\ +\xd7\x00)\x00\x86\xff\xd7\x00)\x00\x87\xff\xd7\x00)\x00\ +\xc2\xff\xd7\x00)\x00\xc4\xff\xd7\x00)\x00\xc6\xff\xd7\x00\ +)\x01C\xff\xd7\x00)\x02\x08\xff\x85\x00)\x02\x0c\xff\ +\x85\x00)\x02X\xff\xd7\x00)\x03\x1d\xff\xd7\x00)\x03\ +\x1f\xff\xd7\x00)\x03!\xff\xd7\x00)\x03#\xff\xd7\x00\ +)\x03%\xff\xd7\x00)\x03'\xff\xd7\x00)\x03)\xff\ +\xd7\x00)\x03+\xff\xd7\x00)\x03-\xff\xd7\x00)\x03\ +/\xff\xd7\x00)\x031\xff\xd7\x00)\x033\xff\xd7\x00\ +.\x00&\xff\xd7\x00.\x00*\xff\xd7\x00.\x002\xff\ +\xd7\x00.\x004\xff\xd7\x00.\x00\x89\xff\xd7\x00.\x00\ +\x94\xff\xd7\x00.\x00\x95\xff\xd7\x00.\x00\x96\xff\xd7\x00\ +.\x00\x97\xff\xd7\x00.\x00\x98\xff\xd7\x00.\x00\x9a\xff\ +\xd7\x00.\x00\xc8\xff\xd7\x00.\x00\xca\xff\xd7\x00.\x00\ +\xcc\xff\xd7\x00.\x00\xce\xff\xd7\x00.\x00\xde\xff\xd7\x00\ +.\x00\xe0\xff\xd7\x00.\x00\xe2\xff\xd7\x00.\x00\xe4\xff\ +\xd7\x00.\x01\x0e\xff\xd7\x00.\x01\x10\xff\xd7\x00.\x01\ +\x12\xff\xd7\x00.\x01\x14\xff\xd7\x00.\x01G\xff\xd7\x00\ +.\x02_\xff\xd7\x00.\x03I\xff\xd7\x00.\x03K\xff\ +\xd7\x00.\x03M\xff\xd7\x00.\x03O\xff\xd7\x00.\x03\ +Q\xff\xd7\x00.\x03S\xff\xd7\x00.\x03U\xff\xd7\x00\ +.\x03W\xff\xd7\x00.\x03Y\xff\xd7\x00.\x03[\xff\ +\xd7\x00.\x03]\xff\xd7\x00.\x03_\xff\xd7\x00/\x00\ +\x05\xff\x5c\x00/\x00\x0a\xff\x5c\x00/\x00&\xff\xd7\x00\ +/\x00*\xff\xd7\x00/\x002\xff\xd7\x00/\x004\xff\ +\xd7\x00/\x007\xff\xd7\x00/\x008\xff\xec\x00/\x00\ +9\xff\xd7\x00/\x00:\xff\xd7\x00/\x00<\xff\xc3\x00\ +/\x00\x89\xff\xd7\x00/\x00\x94\xff\xd7\x00/\x00\x95\xff\ +\xd7\x00/\x00\x96\xff\xd7\x00/\x00\x97\xff\xd7\x00/\x00\ +\x98\xff\xd7\x00/\x00\x9a\xff\xd7\x00/\x00\x9b\xff\xec\x00\ +/\x00\x9c\xff\xec\x00/\x00\x9d\xff\xec\x00/\x00\x9e\xff\ +\xec\x00/\x00\x9f\xff\xc3\x00/\x00\xc8\xff\xd7\x00/\x00\ +\xca\xff\xd7\x00/\x00\xcc\xff\xd7\x00/\x00\xce\xff\xd7\x00\ +/\x00\xde\xff\xd7\x00/\x00\xe0\xff\xd7\x00/\x00\xe2\xff\ +\xd7\x00/\x00\xe4\xff\xd7\x00/\x01\x0e\xff\xd7\x00/\x01\ +\x10\xff\xd7\x00/\x01\x12\xff\xd7\x00/\x01\x14\xff\xd7\x00\ +/\x01$\xff\xd7\x00/\x01&\xff\xd7\x00/\x01*\xff\ +\xec\x00/\x01,\xff\xec\x00/\x01.\xff\xec\x00/\x01\ +0\xff\xec\x00/\x012\xff\xec\x00/\x014\xff\xec\x00\ +/\x016\xff\xd7\x00/\x018\xff\xc3\x00/\x01:\xff\ +\xc3\x00/\x01G\xff\xd7\x00/\x01\xfa\xff\xd7\x00/\x01\ +\xfc\xff\xd7\x00/\x01\xfe\xff\xd7\x00/\x02\x00\xff\xc3\x00\ +/\x02\x07\xff\x5c\x00/\x02\x0b\xff\x5c\x00/\x02_\xff\ +\xd7\x00/\x02a\xff\xec\x00/\x03I\xff\xd7\x00/\x03\ +K\xff\xd7\x00/\x03M\xff\xd7\x00/\x03O\xff\xd7\x00\ +/\x03Q\xff\xd7\x00/\x03S\xff\xd7\x00/\x03U\xff\ +\xd7\x00/\x03W\xff\xd7\x00/\x03Y\xff\xd7\x00/\x03\ +[\xff\xd7\x00/\x03]\xff\xd7\x00/\x03_\xff\xd7\x00\ +/\x03a\xff\xec\x00/\x03c\xff\xec\x00/\x03e\xff\ +\xec\x00/\x03g\xff\xec\x00/\x03i\xff\xec\x00/\x03\ +k\xff\xec\x00/\x03m\xff\xec\x00/\x03o\xff\xc3\x00\ +/\x03q\xff\xc3\x00/\x03s\xff\xc3\x00/\x03\x8f\xff\ +\xd7\x002\x00\x0f\xff\xae\x002\x00\x11\xff\xae\x002\x00\ +$\xff\xd7\x002\x007\xff\xc3\x002\x009\xff\xec\x00\ +2\x00:\xff\xec\x002\x00;\xff\xd7\x002\x00<\xff\ +\xec\x002\x00=\xff\xec\x002\x00\x82\xff\xd7\x002\x00\ +\x83\xff\xd7\x002\x00\x84\xff\xd7\x002\x00\x85\xff\xd7\x00\ +2\x00\x86\xff\xd7\x002\x00\x87\xff\xd7\x002\x00\x9f\xff\ +\xec\x002\x00\xc2\xff\xd7\x002\x00\xc4\xff\xd7\x002\x00\ +\xc6\xff\xd7\x002\x01$\xff\xc3\x002\x01&\xff\xc3\x00\ +2\x016\xff\xec\x002\x018\xff\xec\x002\x01:\xff\ +\xec\x002\x01;\xff\xec\x002\x01=\xff\xec\x002\x01\ +?\xff\xec\x002\x01C\xff\xd7\x002\x01\xa0\xff\xec\x00\ +2\x01\xfa\xff\xec\x002\x01\xfc\xff\xec\x002\x01\xfe\xff\ +\xec\x002\x02\x00\xff\xec\x002\x02\x08\xff\xae\x002\x02\ +\x0c\xff\xae\x002\x02X\xff\xd7\x002\x03\x1d\xff\xd7\x00\ +2\x03\x1f\xff\xd7\x002\x03!\xff\xd7\x002\x03#\xff\ +\xd7\x002\x03%\xff\xd7\x002\x03'\xff\xd7\x002\x03\ +)\xff\xd7\x002\x03+\xff\xd7\x002\x03-\xff\xd7\x00\ +2\x03/\xff\xd7\x002\x031\xff\xd7\x002\x033\xff\ +\xd7\x002\x03o\xff\xec\x002\x03q\xff\xec\x002\x03\ +s\xff\xec\x002\x03\x8f\xff\xc3\x003\x00\x0f\xfe\xf6\x00\ +3\x00\x11\xfe\xf6\x003\x00$\xff\x9a\x003\x00;\xff\ +\xd7\x003\x00=\xff\xec\x003\x00\x82\xff\x9a\x003\x00\ +\x83\xff\x9a\x003\x00\x84\xff\x9a\x003\x00\x85\xff\x9a\x00\ +3\x00\x86\xff\x9a\x003\x00\x87\xff\x9a\x003\x00\xc2\xff\ +\x9a\x003\x00\xc4\xff\x9a\x003\x00\xc6\xff\x9a\x003\x01\ +;\xff\xec\x003\x01=\xff\xec\x003\x01?\xff\xec\x00\ +3\x01C\xff\x9a\x003\x02\x08\xfe\xf6\x003\x02\x0c\xfe\ +\xf6\x003\x02X\xff\x9a\x003\x03\x1d\xff\x9a\x003\x03\ +\x1f\xff\x9a\x003\x03!\xff\x9a\x003\x03#\xff\x9a\x00\ +3\x03%\xff\x9a\x003\x03'\xff\x9a\x003\x03)\xff\ +\x9a\x003\x03+\xff\x9a\x003\x03-\xff\x9a\x003\x03\ +/\xff\x9a\x003\x031\xff\x9a\x003\x033\xff\x9a\x00\ +4\x00\x0f\xff\xae\x004\x00\x11\xff\xae\x004\x00$\xff\ +\xd7\x004\x007\xff\xc3\x004\x009\xff\xec\x004\x00\ +:\xff\xec\x004\x00;\xff\xd7\x004\x00<\xff\xec\x00\ +4\x00=\xff\xec\x004\x00\x82\xff\xd7\x004\x00\x83\xff\ +\xd7\x004\x00\x84\xff\xd7\x004\x00\x85\xff\xd7\x004\x00\ +\x86\xff\xd7\x004\x00\x87\xff\xd7\x004\x00\x9f\xff\xec\x00\ +4\x00\xc2\xff\xd7\x004\x00\xc4\xff\xd7\x004\x00\xc6\xff\ +\xd7\x004\x01$\xff\xc3\x004\x01&\xff\xc3\x004\x01\ +6\xff\xec\x004\x018\xff\xec\x004\x01:\xff\xec\x00\ +4\x01;\xff\xec\x004\x01=\xff\xec\x004\x01?\xff\ +\xec\x004\x01C\xff\xd7\x004\x01\xa0\xff\xec\x004\x01\ +\xfa\xff\xec\x004\x01\xfc\xff\xec\x004\x01\xfe\xff\xec\x00\ +4\x02\x00\xff\xec\x004\x02\x08\xff\xae\x004\x02\x0c\xff\ +\xae\x004\x02X\xff\xd7\x004\x03\x1d\xff\xd7\x004\x03\ +\x1f\xff\xd7\x004\x03!\xff\xd7\x004\x03#\xff\xd7\x00\ +4\x03%\xff\xd7\x004\x03'\xff\xd7\x004\x03)\xff\ +\xd7\x004\x03+\xff\xd7\x004\x03-\xff\xd7\x004\x03\ +/\xff\xd7\x004\x031\xff\xd7\x004\x033\xff\xd7\x00\ +4\x03o\xff\xec\x004\x03q\xff\xec\x004\x03s\xff\ +\xec\x004\x03\x8f\xff\xc3\x007\x00\x0f\xff\x85\x007\x00\ +\x10\xff\xae\x007\x00\x11\xff\x85\x007\x00\x22\x00)\x00\ +7\x00$\xffq\x007\x00&\xff\xd7\x007\x00*\xff\ +\xd7\x007\x002\xff\xd7\x007\x004\xff\xd7\x007\x00\ +7\x00)\x007\x00D\xff\x5c\x007\x00F\xffq\x00\ +7\x00G\xffq\x007\x00H\xffq\x007\x00J\xff\ +q\x007\x00P\xff\x9a\x007\x00Q\xff\x9a\x007\x00\ +R\xffq\x007\x00S\xff\x9a\x007\x00T\xffq\x00\ +7\x00U\xff\x9a\x007\x00V\xff\x85\x007\x00X\xff\ +\x9a\x007\x00Y\xff\xd7\x007\x00Z\xff\xd7\x007\x00\ +[\xff\xd7\x007\x00\x5c\xff\xd7\x007\x00]\xff\xae\x00\ +7\x00\x82\xffq\x007\x00\x83\xffq\x007\x00\x84\xff\ +q\x007\x00\x85\xffq\x007\x00\x86\xffq\x007\x00\ +\x87\xffq\x007\x00\x89\xff\xd7\x007\x00\x94\xff\xd7\x00\ +7\x00\x95\xff\xd7\x007\x00\x96\xff\xd7\x007\x00\x97\xff\ +\xd7\x007\x00\x98\xff\xd7\x007\x00\x9a\xff\xd7\x007\x00\ +\xa2\xffq\x007\x00\xa3\xff\x5c\x007\x00\xa4\xff\x5c\x00\ +7\x00\xa5\xff\x5c\x007\x00\xa6\xff\x5c\x007\x00\xa7\xff\ +\x5c\x007\x00\xa8\xff\x5c\x007\x00\xa9\xffq\x007\x00\ +\xaa\xffq\x007\x00\xab\xffq\x007\x00\xac\xffq\x00\ +7\x00\xad\xffq\x007\x00\xb4\xffq\x007\x00\xb5\xff\ +q\x007\x00\xb6\xffq\x007\x00\xb7\xffq\x007\x00\ +\xb8\xffq\x007\x00\xba\xffq\x007\x00\xbb\xff\x9a\x00\ +7\x00\xbc\xff\x9a\x007\x00\xbd\xff\x9a\x007\x00\xbe\xff\ +\x9a\x007\x00\xbf\xff\xd7\x007\x00\xc2\xffq\x007\x00\ +\xc3\xff\x5c\x007\x00\xc4\xffq\x007\x00\xc5\xff\x5c\x00\ +7\x00\xc6\xffq\x007\x00\xc7\xff\x5c\x007\x00\xc8\xff\ +\xd7\x007\x00\xc9\xffq\x007\x00\xca\xff\xd7\x007\x00\ +\xcb\xffq\x007\x00\xcc\xff\xd7\x007\x00\xcd\xffq\x00\ +7\x00\xce\xff\xd7\x007\x00\xcf\xffq\x007\x00\xd1\xff\ +q\x007\x00\xd3\xffq\x007\x00\xd5\xffq\x007\x00\ +\xd7\xffq\x007\x00\xd9\xffq\x007\x00\xdb\xffq\x00\ +7\x00\xdd\xffq\x007\x00\xde\xff\xd7\x007\x00\xdf\xff\ +q\x007\x00\xe0\xff\xd7\x007\x00\xe1\xffq\x007\x00\ +\xe2\xff\xd7\x007\x00\xe3\xffq\x007\x00\xe4\xff\xd7\x00\ +7\x00\xe5\xffq\x007\x00\xfa\xff\x9a\x007\x01\x06\xff\ +\x9a\x007\x01\x08\xff\x9a\x007\x01\x0d\xff\x9a\x007\x01\ +\x0e\xff\xd7\x007\x01\x0f\xffq\x007\x01\x10\xff\xd7\x00\ +7\x01\x11\xffq\x007\x01\x12\xff\xd7\x007\x01\x13\xff\ +q\x007\x01\x14\xff\xd7\x007\x01\x15\xffq\x007\x01\ +\x17\xff\x9a\x007\x01\x19\xff\x9a\x007\x01\x1d\xff\x85\x00\ +7\x01!\xff\x85\x007\x01$\x00)\x007\x01&\x00\ +)\x007\x01+\xff\x9a\x007\x01-\xff\x9a\x007\x01\ +/\xff\x9a\x007\x011\xff\x9a\x007\x013\xff\x9a\x00\ +7\x015\xff\x9a\x007\x017\xff\xd7\x007\x01<\xff\ +\xae\x007\x01>\xff\xae\x007\x01@\xff\xae\x007\x01\ +C\xffq\x007\x01D\xff\x5c\x007\x01F\xff\x5c\x00\ +7\x01G\xff\xd7\x007\x01H\xffq\x007\x01J\xff\ +\x85\x007\x01\xfb\xff\xd7\x007\x01\xfd\xff\xd7\x007\x02\ +\x02\xff\xae\x007\x02\x03\xff\xae\x007\x02\x04\xff\xae\x00\ +7\x02\x08\xff\x85\x007\x02\x0c\xff\x85\x007\x02W\xff\ +\x9a\x007\x02X\xffq\x007\x02Y\xff\x5c\x007\x02\ +_\xff\xd7\x007\x02`\xffq\x007\x02b\xff\x9a\x00\ +7\x03\x1d\xffq\x007\x03\x1e\xff\x5c\x007\x03\x1f\xff\ +q\x007\x03 \xff\x5c\x007\x03!\xffq\x007\x03\ +\x22\xff\x5c\x007\x03#\xffq\x007\x03%\xffq\x00\ +7\x03&\xff\x5c\x007\x03'\xffq\x007\x03(\xff\ +\x5c\x007\x03)\xffq\x007\x03*\xff\x5c\x007\x03\ ++\xffq\x007\x03,\xff\x5c\x007\x03-\xffq\x00\ +7\x03.\xff\x5c\x007\x03/\xffq\x007\x030\xff\ +\x5c\x007\x031\xffq\x007\x032\xff\x5c\x007\x03\ +3\xffq\x007\x034\xff\x5c\x007\x036\xffq\x00\ +7\x038\xffq\x007\x03:\xffq\x007\x03<\xff\ +q\x007\x03@\xffq\x007\x03B\xffq\x007\x03\ +D\xffq\x007\x03I\xff\xd7\x007\x03J\xffq\x00\ +7\x03K\xff\xd7\x007\x03L\xffq\x007\x03M\xff\ +\xd7\x007\x03N\xffq\x007\x03O\xff\xd7\x007\x03\ +Q\xff\xd7\x007\x03R\xffq\x007\x03S\xff\xd7\x00\ +7\x03T\xffq\x007\x03U\xff\xd7\x007\x03V\xff\ +q\x007\x03W\xff\xd7\x007\x03X\xffq\x007\x03\ +Y\xff\xd7\x007\x03Z\xffq\x007\x03[\xff\xd7\x00\ +7\x03\x5c\xffq\x007\x03]\xff\xd7\x007\x03^\xff\ +q\x007\x03_\xff\xd7\x007\x03`\xffq\x007\x03\ +b\xff\x9a\x007\x03d\xff\x9a\x007\x03f\xff\x9a\x00\ +7\x03h\xff\x9a\x007\x03j\xff\x9a\x007\x03l\xff\ +\x9a\x007\x03n\xff\x9a\x007\x03p\xff\xd7\x007\x03\ +\x8f\x00)\x008\x00\x0f\xff\xd7\x008\x00\x11\xff\xd7\x00\ +8\x00$\xff\xec\x008\x00\x82\xff\xec\x008\x00\x83\xff\ +\xec\x008\x00\x84\xff\xec\x008\x00\x85\xff\xec\x008\x00\ +\x86\xff\xec\x008\x00\x87\xff\xec\x008\x00\xc2\xff\xec\x00\ +8\x00\xc4\xff\xec\x008\x00\xc6\xff\xec\x008\x01C\xff\ +\xec\x008\x02\x08\xff\xd7\x008\x02\x0c\xff\xd7\x008\x02\ +X\xff\xec\x008\x03\x1d\xff\xec\x008\x03\x1f\xff\xec\x00\ +8\x03!\xff\xec\x008\x03#\xff\xec\x008\x03%\xff\ +\xec\x008\x03'\xff\xec\x008\x03)\xff\xec\x008\x03\ ++\xff\xec\x008\x03-\xff\xec\x008\x03/\xff\xec\x00\ +8\x031\xff\xec\x008\x033\xff\xec\x009\x00\x0f\xff\ +\x9a\x009\x00\x11\xff\x9a\x009\x00\x22\x00)\x009\x00\ +$\xff\xae\x009\x00&\xff\xec\x009\x00*\xff\xec\x00\ +9\x002\xff\xec\x009\x004\xff\xec\x009\x00D\xff\ +\xd7\x009\x00F\xff\xd7\x009\x00G\xff\xd7\x009\x00\ +H\xff\xd7\x009\x00J\xff\xec\x009\x00P\xff\xec\x00\ +9\x00Q\xff\xec\x009\x00R\xff\xd7\x009\x00S\xff\ +\xec\x009\x00T\xff\xd7\x009\x00U\xff\xec\x009\x00\ +V\xff\xec\x009\x00X\xff\xec\x009\x00\x82\xff\xae\x00\ +9\x00\x83\xff\xae\x009\x00\x84\xff\xae\x009\x00\x85\xff\ +\xae\x009\x00\x86\xff\xae\x009\x00\x87\xff\xae\x009\x00\ +\x89\xff\xec\x009\x00\x94\xff\xec\x009\x00\x95\xff\xec\x00\ +9\x00\x96\xff\xec\x009\x00\x97\xff\xec\x009\x00\x98\xff\ +\xec\x009\x00\x9a\xff\xec\x009\x00\xa2\xff\xd7\x009\x00\ +\xa3\xff\xd7\x009\x00\xa4\xff\xd7\x009\x00\xa5\xff\xd7\x00\ +9\x00\xa6\xff\xd7\x009\x00\xa7\xff\xd7\x009\x00\xa8\xff\ +\xd7\x009\x00\xa9\xff\xd7\x009\x00\xaa\xff\xd7\x009\x00\ +\xab\xff\xd7\x009\x00\xac\xff\xd7\x009\x00\xad\xff\xd7\x00\ +9\x00\xb4\xff\xd7\x009\x00\xb5\xff\xd7\x009\x00\xb6\xff\ +\xd7\x009\x00\xb7\xff\xd7\x009\x00\xb8\xff\xd7\x009\x00\ +\xba\xff\xd7\x009\x00\xbb\xff\xec\x009\x00\xbc\xff\xec\x00\ +9\x00\xbd\xff\xec\x009\x00\xbe\xff\xec\x009\x00\xc2\xff\ +\xae\x009\x00\xc3\xff\xd7\x009\x00\xc4\xff\xae\x009\x00\ +\xc5\xff\xd7\x009\x00\xc6\xff\xae\x009\x00\xc7\xff\xd7\x00\ +9\x00\xc8\xff\xec\x009\x00\xc9\xff\xd7\x009\x00\xca\xff\ +\xec\x009\x00\xcb\xff\xd7\x009\x00\xcc\xff\xec\x009\x00\ +\xcd\xff\xd7\x009\x00\xce\xff\xec\x009\x00\xcf\xff\xd7\x00\ +9\x00\xd1\xff\xd7\x009\x00\xd3\xff\xd7\x009\x00\xd5\xff\ +\xd7\x009\x00\xd7\xff\xd7\x009\x00\xd9\xff\xd7\x009\x00\ +\xdb\xff\xd7\x009\x00\xdd\xff\xd7\x009\x00\xde\xff\xec\x00\ +9\x00\xdf\xff\xec\x009\x00\xe0\xff\xec\x009\x00\xe1\xff\ +\xec\x009\x00\xe2\xff\xec\x009\x00\xe3\xff\xec\x009\x00\ +\xe4\xff\xec\x009\x00\xe5\xff\xec\x009\x00\xfa\xff\xec\x00\ +9\x01\x06\xff\xec\x009\x01\x08\xff\xec\x009\x01\x0d\xff\ +\xec\x009\x01\x0e\xff\xec\x009\x01\x0f\xff\xd7\x009\x01\ +\x10\xff\xec\x009\x01\x11\xff\xd7\x009\x01\x12\xff\xec\x00\ +9\x01\x13\xff\xd7\x009\x01\x14\xff\xec\x009\x01\x15\xff\ +\xd7\x009\x01\x17\xff\xec\x009\x01\x19\xff\xec\x009\x01\ +\x1d\xff\xec\x009\x01!\xff\xec\x009\x01+\xff\xec\x00\ +9\x01-\xff\xec\x009\x01/\xff\xec\x009\x011\xff\ +\xec\x009\x013\xff\xec\x009\x015\xff\xec\x009\x01\ +C\xff\xae\x009\x01D\xff\xd7\x009\x01F\xff\xd7\x00\ +9\x01G\xff\xec\x009\x01H\xff\xd7\x009\x01J\xff\ +\xec\x009\x02\x08\xff\x9a\x009\x02\x0c\xff\x9a\x009\x02\ +W\xff\xec\x009\x02X\xff\xae\x009\x02Y\xff\xd7\x00\ +9\x02_\xff\xec\x009\x02`\xff\xd7\x009\x02b\xff\ +\xec\x009\x03\x1d\xff\xae\x009\x03\x1e\xff\xd7\x009\x03\ +\x1f\xff\xae\x009\x03 \xff\xd7\x009\x03!\xff\xae\x00\ +9\x03\x22\xff\xd7\x009\x03#\xff\xae\x009\x03%\xff\ +\xae\x009\x03&\xff\xd7\x009\x03'\xff\xae\x009\x03\ +(\xff\xd7\x009\x03)\xff\xae\x009\x03*\xff\xd7\x00\ +9\x03+\xff\xae\x009\x03,\xff\xd7\x009\x03-\xff\ +\xae\x009\x03.\xff\xd7\x009\x03/\xff\xae\x009\x03\ +0\xff\xd7\x009\x031\xff\xae\x009\x032\xff\xd7\x00\ +9\x033\xff\xae\x009\x034\xff\xd7\x009\x036\xff\ +\xd7\x009\x038\xff\xd7\x009\x03:\xff\xd7\x009\x03\ +<\xff\xd7\x009\x03@\xff\xd7\x009\x03B\xff\xd7\x00\ +9\x03D\xff\xd7\x009\x03I\xff\xec\x009\x03J\xff\ +\xd7\x009\x03K\xff\xec\x009\x03L\xff\xd7\x009\x03\ +M\xff\xec\x009\x03N\xff\xd7\x009\x03O\xff\xec\x00\ +9\x03Q\xff\xec\x009\x03R\xff\xd7\x009\x03S\xff\ +\xec\x009\x03T\xff\xd7\x009\x03U\xff\xec\x009\x03\ +V\xff\xd7\x009\x03W\xff\xec\x009\x03X\xff\xd7\x00\ +9\x03Y\xff\xec\x009\x03Z\xff\xd7\x009\x03[\xff\ +\xec\x009\x03\x5c\xff\xd7\x009\x03]\xff\xec\x009\x03\ +^\xff\xd7\x009\x03_\xff\xec\x009\x03`\xff\xd7\x00\ +9\x03b\xff\xec\x009\x03d\xff\xec\x009\x03f\xff\ +\xec\x009\x03h\xff\xec\x009\x03j\xff\xec\x009\x03\ +l\xff\xec\x009\x03n\xff\xec\x00:\x00\x0f\xff\x9a\x00\ +:\x00\x11\xff\x9a\x00:\x00\x22\x00)\x00:\x00$\xff\ +\xae\x00:\x00&\xff\xec\x00:\x00*\xff\xec\x00:\x00\ +2\xff\xec\x00:\x004\xff\xec\x00:\x00D\xff\xd7\x00\ +:\x00F\xff\xd7\x00:\x00G\xff\xd7\x00:\x00H\xff\ +\xd7\x00:\x00J\xff\xec\x00:\x00P\xff\xec\x00:\x00\ +Q\xff\xec\x00:\x00R\xff\xd7\x00:\x00S\xff\xec\x00\ +:\x00T\xff\xd7\x00:\x00U\xff\xec\x00:\x00V\xff\ +\xec\x00:\x00X\xff\xec\x00:\x00\x82\xff\xae\x00:\x00\ +\x83\xff\xae\x00:\x00\x84\xff\xae\x00:\x00\x85\xff\xae\x00\ +:\x00\x86\xff\xae\x00:\x00\x87\xff\xae\x00:\x00\x89\xff\ +\xec\x00:\x00\x94\xff\xec\x00:\x00\x95\xff\xec\x00:\x00\ +\x96\xff\xec\x00:\x00\x97\xff\xec\x00:\x00\x98\xff\xec\x00\ +:\x00\x9a\xff\xec\x00:\x00\xa2\xff\xd7\x00:\x00\xa3\xff\ +\xd7\x00:\x00\xa4\xff\xd7\x00:\x00\xa5\xff\xd7\x00:\x00\ +\xa6\xff\xd7\x00:\x00\xa7\xff\xd7\x00:\x00\xa8\xff\xd7\x00\ +:\x00\xa9\xff\xd7\x00:\x00\xaa\xff\xd7\x00:\x00\xab\xff\ +\xd7\x00:\x00\xac\xff\xd7\x00:\x00\xad\xff\xd7\x00:\x00\ +\xb4\xff\xd7\x00:\x00\xb5\xff\xd7\x00:\x00\xb6\xff\xd7\x00\ +:\x00\xb7\xff\xd7\x00:\x00\xb8\xff\xd7\x00:\x00\xba\xff\ +\xd7\x00:\x00\xbb\xff\xec\x00:\x00\xbc\xff\xec\x00:\x00\ +\xbd\xff\xec\x00:\x00\xbe\xff\xec\x00:\x00\xc2\xff\xae\x00\ +:\x00\xc3\xff\xd7\x00:\x00\xc4\xff\xae\x00:\x00\xc5\xff\ +\xd7\x00:\x00\xc6\xff\xae\x00:\x00\xc7\xff\xd7\x00:\x00\ +\xc8\xff\xec\x00:\x00\xc9\xff\xd7\x00:\x00\xca\xff\xec\x00\ +:\x00\xcb\xff\xd7\x00:\x00\xcc\xff\xec\x00:\x00\xcd\xff\ +\xd7\x00:\x00\xce\xff\xec\x00:\x00\xcf\xff\xd7\x00:\x00\ +\xd1\xff\xd7\x00:\x00\xd3\xff\xd7\x00:\x00\xd5\xff\xd7\x00\ +:\x00\xd7\xff\xd7\x00:\x00\xd9\xff\xd7\x00:\x00\xdb\xff\ +\xd7\x00:\x00\xdd\xff\xd7\x00:\x00\xde\xff\xec\x00:\x00\ +\xdf\xff\xec\x00:\x00\xe0\xff\xec\x00:\x00\xe1\xff\xec\x00\ +:\x00\xe2\xff\xec\x00:\x00\xe3\xff\xec\x00:\x00\xe4\xff\ +\xec\x00:\x00\xe5\xff\xec\x00:\x00\xfa\xff\xec\x00:\x01\ +\x06\xff\xec\x00:\x01\x08\xff\xec\x00:\x01\x0d\xff\xec\x00\ +:\x01\x0e\xff\xec\x00:\x01\x0f\xff\xd7\x00:\x01\x10\xff\ +\xec\x00:\x01\x11\xff\xd7\x00:\x01\x12\xff\xec\x00:\x01\ +\x13\xff\xd7\x00:\x01\x14\xff\xec\x00:\x01\x15\xff\xd7\x00\ +:\x01\x17\xff\xec\x00:\x01\x19\xff\xec\x00:\x01\x1d\xff\ +\xec\x00:\x01!\xff\xec\x00:\x01+\xff\xec\x00:\x01\ +-\xff\xec\x00:\x01/\xff\xec\x00:\x011\xff\xec\x00\ +:\x013\xff\xec\x00:\x015\xff\xec\x00:\x01C\xff\ +\xae\x00:\x01D\xff\xd7\x00:\x01F\xff\xd7\x00:\x01\ +G\xff\xec\x00:\x01H\xff\xd7\x00:\x01J\xff\xec\x00\ +:\x02\x08\xff\x9a\x00:\x02\x0c\xff\x9a\x00:\x02W\xff\ +\xec\x00:\x02X\xff\xae\x00:\x02Y\xff\xd7\x00:\x02\ +_\xff\xec\x00:\x02`\xff\xd7\x00:\x02b\xff\xec\x00\ +:\x03\x1d\xff\xae\x00:\x03\x1e\xff\xd7\x00:\x03\x1f\xff\ +\xae\x00:\x03 \xff\xd7\x00:\x03!\xff\xae\x00:\x03\ +\x22\xff\xd7\x00:\x03#\xff\xae\x00:\x03%\xff\xae\x00\ +:\x03&\xff\xd7\x00:\x03'\xff\xae\x00:\x03(\xff\ +\xd7\x00:\x03)\xff\xae\x00:\x03*\xff\xd7\x00:\x03\ ++\xff\xae\x00:\x03,\xff\xd7\x00:\x03-\xff\xae\x00\ +:\x03.\xff\xd7\x00:\x03/\xff\xae\x00:\x030\xff\ +\xd7\x00:\x031\xff\xae\x00:\x032\xff\xd7\x00:\x03\ +3\xff\xae\x00:\x034\xff\xd7\x00:\x036\xff\xd7\x00\ +:\x038\xff\xd7\x00:\x03:\xff\xd7\x00:\x03<\xff\ +\xd7\x00:\x03@\xff\xd7\x00:\x03B\xff\xd7\x00:\x03\ +D\xff\xd7\x00:\x03I\xff\xec\x00:\x03J\xff\xd7\x00\ +:\x03K\xff\xec\x00:\x03L\xff\xd7\x00:\x03M\xff\ +\xec\x00:\x03N\xff\xd7\x00:\x03O\xff\xec\x00:\x03\ +Q\xff\xec\x00:\x03R\xff\xd7\x00:\x03S\xff\xec\x00\ +:\x03T\xff\xd7\x00:\x03U\xff\xec\x00:\x03V\xff\ +\xd7\x00:\x03W\xff\xec\x00:\x03X\xff\xd7\x00:\x03\ +Y\xff\xec\x00:\x03Z\xff\xd7\x00:\x03[\xff\xec\x00\ +:\x03\x5c\xff\xd7\x00:\x03]\xff\xec\x00:\x03^\xff\ +\xd7\x00:\x03_\xff\xec\x00:\x03`\xff\xd7\x00:\x03\ +b\xff\xec\x00:\x03d\xff\xec\x00:\x03f\xff\xec\x00\ +:\x03h\xff\xec\x00:\x03j\xff\xec\x00:\x03l\xff\ +\xec\x00:\x03n\xff\xec\x00;\x00&\xff\xd7\x00;\x00\ +*\xff\xd7\x00;\x002\xff\xd7\x00;\x004\xff\xd7\x00\ +;\x00\x89\xff\xd7\x00;\x00\x94\xff\xd7\x00;\x00\x95\xff\ +\xd7\x00;\x00\x96\xff\xd7\x00;\x00\x97\xff\xd7\x00;\x00\ +\x98\xff\xd7\x00;\x00\x9a\xff\xd7\x00;\x00\xc8\xff\xd7\x00\ +;\x00\xca\xff\xd7\x00;\x00\xcc\xff\xd7\x00;\x00\xce\xff\ +\xd7\x00;\x00\xde\xff\xd7\x00;\x00\xe0\xff\xd7\x00;\x00\ +\xe2\xff\xd7\x00;\x00\xe4\xff\xd7\x00;\x01\x0e\xff\xd7\x00\ +;\x01\x10\xff\xd7\x00;\x01\x12\xff\xd7\x00;\x01\x14\xff\ +\xd7\x00;\x01G\xff\xd7\x00;\x02_\xff\xd7\x00;\x03\ +I\xff\xd7\x00;\x03K\xff\xd7\x00;\x03M\xff\xd7\x00\ +;\x03O\xff\xd7\x00;\x03Q\xff\xd7\x00;\x03S\xff\ +\xd7\x00;\x03U\xff\xd7\x00;\x03W\xff\xd7\x00;\x03\ +Y\xff\xd7\x00;\x03[\xff\xd7\x00;\x03]\xff\xd7\x00\ +;\x03_\xff\xd7\x00<\x00\x0f\xff\x85\x00<\x00\x11\xff\ +\x85\x00<\x00\x22\x00)\x00<\x00$\xff\x85\x00<\x00\ +&\xff\xd7\x00<\x00*\xff\xd7\x00<\x002\xff\xd7\x00\ +<\x004\xff\xd7\x00<\x00D\xff\x9a\x00<\x00F\xff\ +\x9a\x00<\x00G\xff\x9a\x00<\x00H\xff\x9a\x00<\x00\ +J\xff\xd7\x00<\x00P\xff\xc3\x00<\x00Q\xff\xc3\x00\ +<\x00R\xff\x9a\x00<\x00S\xff\xc3\x00<\x00T\xff\ +\x9a\x00<\x00U\xff\xc3\x00<\x00V\xff\xae\x00<\x00\ +X\xff\xc3\x00<\x00]\xff\xd7\x00<\x00\x82\xff\x85\x00\ +<\x00\x83\xff\x85\x00<\x00\x84\xff\x85\x00<\x00\x85\xff\ +\x85\x00<\x00\x86\xff\x85\x00<\x00\x87\xff\x85\x00<\x00\ +\x89\xff\xd7\x00<\x00\x94\xff\xd7\x00<\x00\x95\xff\xd7\x00\ +<\x00\x96\xff\xd7\x00<\x00\x97\xff\xd7\x00<\x00\x98\xff\ +\xd7\x00<\x00\x9a\xff\xd7\x00<\x00\xa2\xff\x9a\x00<\x00\ +\xa3\xff\x9a\x00<\x00\xa4\xff\x9a\x00<\x00\xa5\xff\x9a\x00\ +<\x00\xa6\xff\x9a\x00<\x00\xa7\xff\x9a\x00<\x00\xa8\xff\ +\x9a\x00<\x00\xa9\xff\x9a\x00<\x00\xaa\xff\x9a\x00<\x00\ +\xab\xff\x9a\x00<\x00\xac\xff\x9a\x00<\x00\xad\xff\x9a\x00\ +<\x00\xb4\xff\x9a\x00<\x00\xb5\xff\x9a\x00<\x00\xb6\xff\ +\x9a\x00<\x00\xb7\xff\x9a\x00<\x00\xb8\xff\x9a\x00<\x00\ +\xba\xff\x9a\x00<\x00\xbb\xff\xc3\x00<\x00\xbc\xff\xc3\x00\ +<\x00\xbd\xff\xc3\x00<\x00\xbe\xff\xc3\x00<\x00\xc2\xff\ +\x85\x00<\x00\xc3\xff\x9a\x00<\x00\xc4\xff\x85\x00<\x00\ +\xc5\xff\x9a\x00<\x00\xc6\xff\x85\x00<\x00\xc7\xff\x9a\x00\ +<\x00\xc8\xff\xd7\x00<\x00\xc9\xff\x9a\x00<\x00\xca\xff\ +\xd7\x00<\x00\xcb\xff\x9a\x00<\x00\xcc\xff\xd7\x00<\x00\ +\xcd\xff\x9a\x00<\x00\xce\xff\xd7\x00<\x00\xcf\xff\x9a\x00\ +<\x00\xd1\xff\x9a\x00<\x00\xd3\xff\x9a\x00<\x00\xd5\xff\ +\x9a\x00<\x00\xd7\xff\x9a\x00<\x00\xd9\xff\x9a\x00<\x00\ +\xdb\xff\x9a\x00<\x00\xdd\xff\x9a\x00<\x00\xde\xff\xd7\x00\ +<\x00\xdf\xff\xd7\x00<\x00\xe0\xff\xd7\x00<\x00\xe1\xff\ +\xd7\x00<\x00\xe2\xff\xd7\x00<\x00\xe3\xff\xd7\x00<\x00\ +\xe4\xff\xd7\x00<\x00\xe5\xff\xd7\x00<\x00\xfa\xff\xc3\x00\ +<\x01\x06\xff\xc3\x00<\x01\x08\xff\xc3\x00<\x01\x0d\xff\ +\xc3\x00<\x01\x0e\xff\xd7\x00<\x01\x0f\xff\x9a\x00<\x01\ +\x10\xff\xd7\x00<\x01\x11\xff\x9a\x00<\x01\x12\xff\xd7\x00\ +<\x01\x13\xff\x9a\x00<\x01\x14\xff\xd7\x00<\x01\x15\xff\ +\x9a\x00<\x01\x17\xff\xc3\x00<\x01\x19\xff\xc3\x00<\x01\ +\x1d\xff\xae\x00<\x01!\xff\xae\x00<\x01+\xff\xc3\x00\ +<\x01-\xff\xc3\x00<\x01/\xff\xc3\x00<\x011\xff\ +\xc3\x00<\x013\xff\xc3\x00<\x015\xff\xc3\x00<\x01\ +<\xff\xd7\x00<\x01>\xff\xd7\x00<\x01@\xff\xd7\x00\ +<\x01C\xff\x85\x00<\x01D\xff\x9a\x00<\x01F\xff\ +\x9a\x00<\x01G\xff\xd7\x00<\x01H\xff\x9a\x00<\x01\ +J\xff\xae\x00<\x02\x08\xff\x85\x00<\x02\x0c\xff\x85\x00\ +<\x02W\xff\xc3\x00<\x02X\xff\x85\x00<\x02Y\xff\ +\x9a\x00<\x02_\xff\xd7\x00<\x02`\xff\x9a\x00<\x02\ +b\xff\xc3\x00<\x03\x1d\xff\x85\x00<\x03\x1e\xff\x9a\x00\ +<\x03\x1f\xff\x85\x00<\x03 \xff\x9a\x00<\x03!\xff\ +\x85\x00<\x03\x22\xff\x9a\x00<\x03#\xff\x85\x00<\x03\ +%\xff\x85\x00<\x03&\xff\x9a\x00<\x03'\xff\x85\x00\ +<\x03(\xff\x9a\x00<\x03)\xff\x85\x00<\x03*\xff\ +\x9a\x00<\x03+\xff\x85\x00<\x03,\xff\x9a\x00<\x03\ +-\xff\x85\x00<\x03.\xff\x9a\x00<\x03/\xff\x85\x00\ +<\x030\xff\x9a\x00<\x031\xff\x85\x00<\x032\xff\ +\x9a\x00<\x033\xff\x85\x00<\x034\xff\x9a\x00<\x03\ +6\xff\x9a\x00<\x038\xff\x9a\x00<\x03:\xff\x9a\x00\ +<\x03<\xff\x9a\x00<\x03@\xff\x9a\x00<\x03B\xff\ +\x9a\x00<\x03D\xff\x9a\x00<\x03I\xff\xd7\x00<\x03\ +J\xff\x9a\x00<\x03K\xff\xd7\x00<\x03L\xff\x9a\x00\ +<\x03M\xff\xd7\x00<\x03N\xff\x9a\x00<\x03O\xff\ +\xd7\x00<\x03Q\xff\xd7\x00<\x03R\xff\x9a\x00<\x03\ +S\xff\xd7\x00<\x03T\xff\x9a\x00<\x03U\xff\xd7\x00\ +<\x03V\xff\x9a\x00<\x03W\xff\xd7\x00<\x03X\xff\ +\x9a\x00<\x03Y\xff\xd7\x00<\x03Z\xff\x9a\x00<\x03\ +[\xff\xd7\x00<\x03\x5c\xff\x9a\x00<\x03]\xff\xd7\x00\ +<\x03^\xff\x9a\x00<\x03_\xff\xd7\x00<\x03`\xff\ +\x9a\x00<\x03b\xff\xc3\x00<\x03d\xff\xc3\x00<\x03\ +f\xff\xc3\x00<\x03h\xff\xc3\x00<\x03j\xff\xc3\x00\ +<\x03l\xff\xc3\x00<\x03n\xff\xc3\x00=\x00&\xff\ +\xec\x00=\x00*\xff\xec\x00=\x002\xff\xec\x00=\x00\ +4\xff\xec\x00=\x00\x89\xff\xec\x00=\x00\x94\xff\xec\x00\ +=\x00\x95\xff\xec\x00=\x00\x96\xff\xec\x00=\x00\x97\xff\ +\xec\x00=\x00\x98\xff\xec\x00=\x00\x9a\xff\xec\x00=\x00\ +\xc8\xff\xec\x00=\x00\xca\xff\xec\x00=\x00\xcc\xff\xec\x00\ +=\x00\xce\xff\xec\x00=\x00\xde\xff\xec\x00=\x00\xe0\xff\ +\xec\x00=\x00\xe2\xff\xec\x00=\x00\xe4\xff\xec\x00=\x01\ +\x0e\xff\xec\x00=\x01\x10\xff\xec\x00=\x01\x12\xff\xec\x00\ +=\x01\x14\xff\xec\x00=\x01G\xff\xec\x00=\x02_\xff\ +\xec\x00=\x03I\xff\xec\x00=\x03K\xff\xec\x00=\x03\ +M\xff\xec\x00=\x03O\xff\xec\x00=\x03Q\xff\xec\x00\ +=\x03S\xff\xec\x00=\x03U\xff\xec\x00=\x03W\xff\ +\xec\x00=\x03Y\xff\xec\x00=\x03[\xff\xec\x00=\x03\ +]\xff\xec\x00=\x03_\xff\xec\x00>\x00-\x00\xb8\x00\ +D\x00\x05\xff\xec\x00D\x00\x0a\xff\xec\x00D\x02\x07\xff\ +\xec\x00D\x02\x0b\xff\xec\x00E\x00\x05\xff\xec\x00E\x00\ +\x0a\xff\xec\x00E\x00Y\xff\xd7\x00E\x00Z\xff\xd7\x00\ +E\x00[\xff\xd7\x00E\x00\x5c\xff\xd7\x00E\x00]\xff\ +\xec\x00E\x00\xbf\xff\xd7\x00E\x017\xff\xd7\x00E\x01\ +<\xff\xec\x00E\x01>\xff\xec\x00E\x01@\xff\xec\x00\ +E\x01\xfb\xff\xd7\x00E\x01\xfd\xff\xd7\x00E\x02\x07\xff\ +\xec\x00E\x02\x0b\xff\xec\x00E\x03p\xff\xd7\x00F\x00\ +\x05\x00)\x00F\x00\x0a\x00)\x00F\x02\x07\x00)\x00\ +F\x02\x0b\x00)\x00H\x00\x05\xff\xec\x00H\x00\x0a\xff\ +\xec\x00H\x00Y\xff\xd7\x00H\x00Z\xff\xd7\x00H\x00\ +[\xff\xd7\x00H\x00\x5c\xff\xd7\x00H\x00]\xff\xec\x00\ +H\x00\xbf\xff\xd7\x00H\x017\xff\xd7\x00H\x01<\xff\ +\xec\x00H\x01>\xff\xec\x00H\x01@\xff\xec\x00H\x01\ +\xfb\xff\xd7\x00H\x01\xfd\xff\xd7\x00H\x02\x07\xff\xec\x00\ +H\x02\x0b\xff\xec\x00H\x03p\xff\xd7\x00I\x00\x05\x00\ +{\x00I\x00\x0a\x00{\x00I\x02\x07\x00{\x00I\x02\ +\x0b\x00{\x00K\x00\x05\xff\xec\x00K\x00\x0a\xff\xec\x00\ +K\x02\x07\xff\xec\x00K\x02\x0b\xff\xec\x00N\x00F\xff\ +\xd7\x00N\x00G\xff\xd7\x00N\x00H\xff\xd7\x00N\x00\ +R\xff\xd7\x00N\x00T\xff\xd7\x00N\x00\xa2\xff\xd7\x00\ +N\x00\xa9\xff\xd7\x00N\x00\xaa\xff\xd7\x00N\x00\xab\xff\ +\xd7\x00N\x00\xac\xff\xd7\x00N\x00\xad\xff\xd7\x00N\x00\ +\xb4\xff\xd7\x00N\x00\xb5\xff\xd7\x00N\x00\xb6\xff\xd7\x00\ +N\x00\xb7\xff\xd7\x00N\x00\xb8\xff\xd7\x00N\x00\xba\xff\ +\xd7\x00N\x00\xc9\xff\xd7\x00N\x00\xcb\xff\xd7\x00N\x00\ +\xcd\xff\xd7\x00N\x00\xcf\xff\xd7\x00N\x00\xd1\xff\xd7\x00\ +N\x00\xd3\xff\xd7\x00N\x00\xd5\xff\xd7\x00N\x00\xd7\xff\ +\xd7\x00N\x00\xd9\xff\xd7\x00N\x00\xdb\xff\xd7\x00N\x00\ +\xdd\xff\xd7\x00N\x01\x0f\xff\xd7\x00N\x01\x11\xff\xd7\x00\ +N\x01\x13\xff\xd7\x00N\x01\x15\xff\xd7\x00N\x01H\xff\ +\xd7\x00N\x02`\xff\xd7\x00N\x036\xff\xd7\x00N\x03\ +8\xff\xd7\x00N\x03:\xff\xd7\x00N\x03<\xff\xd7\x00\ +N\x03@\xff\xd7\x00N\x03B\xff\xd7\x00N\x03D\xff\ +\xd7\x00N\x03J\xff\xd7\x00N\x03L\xff\xd7\x00N\x03\ +N\xff\xd7\x00N\x03R\xff\xd7\x00N\x03T\xff\xd7\x00\ +N\x03V\xff\xd7\x00N\x03X\xff\xd7\x00N\x03Z\xff\ +\xd7\x00N\x03\x5c\xff\xd7\x00N\x03^\xff\xd7\x00N\x03\ +`\xff\xd7\x00P\x00\x05\xff\xec\x00P\x00\x0a\xff\xec\x00\ +P\x02\x07\xff\xec\x00P\x02\x0b\xff\xec\x00Q\x00\x05\xff\ +\xec\x00Q\x00\x0a\xff\xec\x00Q\x02\x07\xff\xec\x00Q\x02\ +\x0b\xff\xec\x00R\x00\x05\xff\xec\x00R\x00\x0a\xff\xec\x00\ +R\x00Y\xff\xd7\x00R\x00Z\xff\xd7\x00R\x00[\xff\ +\xd7\x00R\x00\x5c\xff\xd7\x00R\x00]\xff\xec\x00R\x00\ +\xbf\xff\xd7\x00R\x017\xff\xd7\x00R\x01<\xff\xec\x00\ +R\x01>\xff\xec\x00R\x01@\xff\xec\x00R\x01\xfb\xff\ +\xd7\x00R\x01\xfd\xff\xd7\x00R\x02\x07\xff\xec\x00R\x02\ +\x0b\xff\xec\x00R\x03p\xff\xd7\x00S\x00\x05\xff\xec\x00\ +S\x00\x0a\xff\xec\x00S\x00Y\xff\xd7\x00S\x00Z\xff\ +\xd7\x00S\x00[\xff\xd7\x00S\x00\x5c\xff\xd7\x00S\x00\ +]\xff\xec\x00S\x00\xbf\xff\xd7\x00S\x017\xff\xd7\x00\ +S\x01<\xff\xec\x00S\x01>\xff\xec\x00S\x01@\xff\ +\xec\x00S\x01\xfb\xff\xd7\x00S\x01\xfd\xff\xd7\x00S\x02\ +\x07\xff\xec\x00S\x02\x0b\xff\xec\x00S\x03p\xff\xd7\x00\ +U\x00\x05\x00R\x00U\x00\x0a\x00R\x00U\x00D\xff\ +\xd7\x00U\x00F\xff\xd7\x00U\x00G\xff\xd7\x00U\x00\ +H\xff\xd7\x00U\x00J\xff\xec\x00U\x00R\xff\xd7\x00\ +U\x00T\xff\xd7\x00U\x00\xa2\xff\xd7\x00U\x00\xa3\xff\ +\xd7\x00U\x00\xa4\xff\xd7\x00U\x00\xa5\xff\xd7\x00U\x00\ +\xa6\xff\xd7\x00U\x00\xa7\xff\xd7\x00U\x00\xa8\xff\xd7\x00\ +U\x00\xa9\xff\xd7\x00U\x00\xaa\xff\xd7\x00U\x00\xab\xff\ +\xd7\x00U\x00\xac\xff\xd7\x00U\x00\xad\xff\xd7\x00U\x00\ +\xb4\xff\xd7\x00U\x00\xb5\xff\xd7\x00U\x00\xb6\xff\xd7\x00\ +U\x00\xb7\xff\xd7\x00U\x00\xb8\xff\xd7\x00U\x00\xba\xff\ +\xd7\x00U\x00\xc3\xff\xd7\x00U\x00\xc5\xff\xd7\x00U\x00\ +\xc7\xff\xd7\x00U\x00\xc9\xff\xd7\x00U\x00\xcb\xff\xd7\x00\ +U\x00\xcd\xff\xd7\x00U\x00\xcf\xff\xd7\x00U\x00\xd1\xff\ +\xd7\x00U\x00\xd3\xff\xd7\x00U\x00\xd5\xff\xd7\x00U\x00\ +\xd7\xff\xd7\x00U\x00\xd9\xff\xd7\x00U\x00\xdb\xff\xd7\x00\ +U\x00\xdd\xff\xd7\x00U\x00\xdf\xff\xec\x00U\x00\xe1\xff\ +\xec\x00U\x00\xe3\xff\xec\x00U\x00\xe5\xff\xec\x00U\x01\ +\x0f\xff\xd7\x00U\x01\x11\xff\xd7\x00U\x01\x13\xff\xd7\x00\ +U\x01\x15\xff\xd7\x00U\x01D\xff\xd7\x00U\x01F\xff\ +\xd7\x00U\x01H\xff\xd7\x00U\x02\x07\x00R\x00U\x02\ +\x0b\x00R\x00U\x02Y\xff\xd7\x00U\x02`\xff\xd7\x00\ +U\x03\x1e\xff\xd7\x00U\x03 \xff\xd7\x00U\x03\x22\xff\ +\xd7\x00U\x03&\xff\xd7\x00U\x03(\xff\xd7\x00U\x03\ +*\xff\xd7\x00U\x03,\xff\xd7\x00U\x03.\xff\xd7\x00\ +U\x030\xff\xd7\x00U\x032\xff\xd7\x00U\x034\xff\ +\xd7\x00U\x036\xff\xd7\x00U\x038\xff\xd7\x00U\x03\ +:\xff\xd7\x00U\x03<\xff\xd7\x00U\x03@\xff\xd7\x00\ +U\x03B\xff\xd7\x00U\x03D\xff\xd7\x00U\x03J\xff\ +\xd7\x00U\x03L\xff\xd7\x00U\x03N\xff\xd7\x00U\x03\ +R\xff\xd7\x00U\x03T\xff\xd7\x00U\x03V\xff\xd7\x00\ +U\x03X\xff\xd7\x00U\x03Z\xff\xd7\x00U\x03\x5c\xff\ +\xd7\x00U\x03^\xff\xd7\x00U\x03`\xff\xd7\x00W\x00\ +\x05\x00)\x00W\x00\x0a\x00)\x00W\x02\x07\x00)\x00\ +W\x02\x0b\x00)\x00Y\x00\x05\x00R\x00Y\x00\x0a\x00\ +R\x00Y\x00\x0f\xff\xae\x00Y\x00\x11\xff\xae\x00Y\x00\ +\x22\x00)\x00Y\x02\x07\x00R\x00Y\x02\x08\xff\xae\x00\ +Y\x02\x0b\x00R\x00Y\x02\x0c\xff\xae\x00Z\x00\x05\x00\ +R\x00Z\x00\x0a\x00R\x00Z\x00\x0f\xff\xae\x00Z\x00\ +\x11\xff\xae\x00Z\x00\x22\x00)\x00Z\x02\x07\x00R\x00\ +Z\x02\x08\xff\xae\x00Z\x02\x0b\x00R\x00Z\x02\x0c\xff\ +\xae\x00[\x00F\xff\xd7\x00[\x00G\xff\xd7\x00[\x00\ +H\xff\xd7\x00[\x00R\xff\xd7\x00[\x00T\xff\xd7\x00\ +[\x00\xa2\xff\xd7\x00[\x00\xa9\xff\xd7\x00[\x00\xaa\xff\ +\xd7\x00[\x00\xab\xff\xd7\x00[\x00\xac\xff\xd7\x00[\x00\ +\xad\xff\xd7\x00[\x00\xb4\xff\xd7\x00[\x00\xb5\xff\xd7\x00\ +[\x00\xb6\xff\xd7\x00[\x00\xb7\xff\xd7\x00[\x00\xb8\xff\ +\xd7\x00[\x00\xba\xff\xd7\x00[\x00\xc9\xff\xd7\x00[\x00\ +\xcb\xff\xd7\x00[\x00\xcd\xff\xd7\x00[\x00\xcf\xff\xd7\x00\ +[\x00\xd1\xff\xd7\x00[\x00\xd3\xff\xd7\x00[\x00\xd5\xff\ +\xd7\x00[\x00\xd7\xff\xd7\x00[\x00\xd9\xff\xd7\x00[\x00\ +\xdb\xff\xd7\x00[\x00\xdd\xff\xd7\x00[\x01\x0f\xff\xd7\x00\ +[\x01\x11\xff\xd7\x00[\x01\x13\xff\xd7\x00[\x01\x15\xff\ +\xd7\x00[\x01H\xff\xd7\x00[\x02`\xff\xd7\x00[\x03\ +6\xff\xd7\x00[\x038\xff\xd7\x00[\x03:\xff\xd7\x00\ +[\x03<\xff\xd7\x00[\x03@\xff\xd7\x00[\x03B\xff\ +\xd7\x00[\x03D\xff\xd7\x00[\x03J\xff\xd7\x00[\x03\ +L\xff\xd7\x00[\x03N\xff\xd7\x00[\x03R\xff\xd7\x00\ +[\x03T\xff\xd7\x00[\x03V\xff\xd7\x00[\x03X\xff\ +\xd7\x00[\x03Z\xff\xd7\x00[\x03\x5c\xff\xd7\x00[\x03\ +^\xff\xd7\x00[\x03`\xff\xd7\x00\x5c\x00\x05\x00R\x00\ +\x5c\x00\x0a\x00R\x00\x5c\x00\x0f\xff\xae\x00\x5c\x00\x11\xff\ +\xae\x00\x5c\x00\x22\x00)\x00\x5c\x02\x07\x00R\x00\x5c\x02\ +\x08\xff\xae\x00\x5c\x02\x0b\x00R\x00\x5c\x02\x0c\xff\xae\x00\ +^\x00-\x00\xb8\x00\x82\x00\x05\xffq\x00\x82\x00\x0a\xff\ +q\x00\x82\x00&\xff\xd7\x00\x82\x00*\xff\xd7\x00\x82\x00\ +-\x01\x0a\x00\x82\x002\xff\xd7\x00\x82\x004\xff\xd7\x00\ +\x82\x007\xffq\x00\x82\x009\xff\xae\x00\x82\x00:\xff\ +\xae\x00\x82\x00<\xff\x85\x00\x82\x00\x89\xff\xd7\x00\x82\x00\ +\x94\xff\xd7\x00\x82\x00\x95\xff\xd7\x00\x82\x00\x96\xff\xd7\x00\ +\x82\x00\x97\xff\xd7\x00\x82\x00\x98\xff\xd7\x00\x82\x00\x9a\xff\ +\xd7\x00\x82\x00\x9f\xff\x85\x00\x82\x00\xc8\xff\xd7\x00\x82\x00\ +\xca\xff\xd7\x00\x82\x00\xcc\xff\xd7\x00\x82\x00\xce\xff\xd7\x00\ +\x82\x00\xde\xff\xd7\x00\x82\x00\xe0\xff\xd7\x00\x82\x00\xe2\xff\ +\xd7\x00\x82\x00\xe4\xff\xd7\x00\x82\x01\x0e\xff\xd7\x00\x82\x01\ +\x10\xff\xd7\x00\x82\x01\x12\xff\xd7\x00\x82\x01\x14\xff\xd7\x00\ +\x82\x01$\xffq\x00\x82\x01&\xffq\x00\x82\x016\xff\ +\xae\x00\x82\x018\xff\x85\x00\x82\x01:\xff\x85\x00\x82\x01\ +G\xff\xd7\x00\x82\x01\xfa\xff\xae\x00\x82\x01\xfc\xff\xae\x00\ +\x82\x01\xfe\xff\xae\x00\x82\x02\x00\xff\x85\x00\x82\x02\x07\xff\ +q\x00\x82\x02\x0b\xffq\x00\x82\x02_\xff\xd7\x00\x82\x03\ +I\xff\xd7\x00\x82\x03K\xff\xd7\x00\x82\x03M\xff\xd7\x00\ +\x82\x03O\xff\xd7\x00\x82\x03Q\xff\xd7\x00\x82\x03S\xff\ +\xd7\x00\x82\x03U\xff\xd7\x00\x82\x03W\xff\xd7\x00\x82\x03\ +Y\xff\xd7\x00\x82\x03[\xff\xd7\x00\x82\x03]\xff\xd7\x00\ +\x82\x03_\xff\xd7\x00\x82\x03o\xff\x85\x00\x82\x03q\xff\ +\x85\x00\x82\x03s\xff\x85\x00\x82\x03\x8f\xffq\x00\x83\x00\ +\x05\xffq\x00\x83\x00\x0a\xffq\x00\x83\x00&\xff\xd7\x00\ +\x83\x00*\xff\xd7\x00\x83\x00-\x01\x0a\x00\x83\x002\xff\ +\xd7\x00\x83\x004\xff\xd7\x00\x83\x007\xffq\x00\x83\x00\ +9\xff\xae\x00\x83\x00:\xff\xae\x00\x83\x00<\xff\x85\x00\ +\x83\x00\x89\xff\xd7\x00\x83\x00\x94\xff\xd7\x00\x83\x00\x95\xff\ +\xd7\x00\x83\x00\x96\xff\xd7\x00\x83\x00\x97\xff\xd7\x00\x83\x00\ +\x98\xff\xd7\x00\x83\x00\x9a\xff\xd7\x00\x83\x00\x9f\xff\x85\x00\ +\x83\x00\xc8\xff\xd7\x00\x83\x00\xca\xff\xd7\x00\x83\x00\xcc\xff\ +\xd7\x00\x83\x00\xce\xff\xd7\x00\x83\x00\xde\xff\xd7\x00\x83\x00\ +\xe0\xff\xd7\x00\x83\x00\xe2\xff\xd7\x00\x83\x00\xe4\xff\xd7\x00\ +\x83\x01\x0e\xff\xd7\x00\x83\x01\x10\xff\xd7\x00\x83\x01\x12\xff\ +\xd7\x00\x83\x01\x14\xff\xd7\x00\x83\x01$\xffq\x00\x83\x01\ +&\xffq\x00\x83\x016\xff\xae\x00\x83\x018\xff\x85\x00\ +\x83\x01:\xff\x85\x00\x83\x01G\xff\xd7\x00\x83\x01\xfa\xff\ +\xae\x00\x83\x01\xfc\xff\xae\x00\x83\x01\xfe\xff\xae\x00\x83\x02\ +\x00\xff\x85\x00\x83\x02\x07\xffq\x00\x83\x02\x0b\xffq\x00\ +\x83\x02_\xff\xd7\x00\x83\x03I\xff\xd7\x00\x83\x03K\xff\ +\xd7\x00\x83\x03M\xff\xd7\x00\x83\x03O\xff\xd7\x00\x83\x03\ +Q\xff\xd7\x00\x83\x03S\xff\xd7\x00\x83\x03U\xff\xd7\x00\ +\x83\x03W\xff\xd7\x00\x83\x03Y\xff\xd7\x00\x83\x03[\xff\ +\xd7\x00\x83\x03]\xff\xd7\x00\x83\x03_\xff\xd7\x00\x83\x03\ +o\xff\x85\x00\x83\x03q\xff\x85\x00\x83\x03s\xff\x85\x00\ +\x83\x03\x8f\xffq\x00\x84\x00\x05\xffq\x00\x84\x00\x0a\xff\ +q\x00\x84\x00&\xff\xd7\x00\x84\x00*\xff\xd7\x00\x84\x00\ +-\x01\x0a\x00\x84\x002\xff\xd7\x00\x84\x004\xff\xd7\x00\ +\x84\x007\xffq\x00\x84\x009\xff\xae\x00\x84\x00:\xff\ +\xae\x00\x84\x00<\xff\x85\x00\x84\x00\x89\xff\xd7\x00\x84\x00\ +\x94\xff\xd7\x00\x84\x00\x95\xff\xd7\x00\x84\x00\x96\xff\xd7\x00\ +\x84\x00\x97\xff\xd7\x00\x84\x00\x98\xff\xd7\x00\x84\x00\x9a\xff\ +\xd7\x00\x84\x00\x9f\xff\x85\x00\x84\x00\xc8\xff\xd7\x00\x84\x00\ +\xca\xff\xd7\x00\x84\x00\xcc\xff\xd7\x00\x84\x00\xce\xff\xd7\x00\ +\x84\x00\xde\xff\xd7\x00\x84\x00\xe0\xff\xd7\x00\x84\x00\xe2\xff\ +\xd7\x00\x84\x00\xe4\xff\xd7\x00\x84\x01\x0e\xff\xd7\x00\x84\x01\ +\x10\xff\xd7\x00\x84\x01\x12\xff\xd7\x00\x84\x01\x14\xff\xd7\x00\ +\x84\x01$\xffq\x00\x84\x01&\xffq\x00\x84\x016\xff\ +\xae\x00\x84\x018\xff\x85\x00\x84\x01:\xff\x85\x00\x84\x01\ +G\xff\xd7\x00\x84\x01\xfa\xff\xae\x00\x84\x01\xfc\xff\xae\x00\ +\x84\x01\xfe\xff\xae\x00\x84\x02\x00\xff\x85\x00\x84\x02\x07\xff\ +q\x00\x84\x02\x0b\xffq\x00\x84\x02_\xff\xd7\x00\x84\x03\ +I\xff\xd7\x00\x84\x03K\xff\xd7\x00\x84\x03M\xff\xd7\x00\ +\x84\x03O\xff\xd7\x00\x84\x03Q\xff\xd7\x00\x84\x03S\xff\ +\xd7\x00\x84\x03U\xff\xd7\x00\x84\x03W\xff\xd7\x00\x84\x03\ +Y\xff\xd7\x00\x84\x03[\xff\xd7\x00\x84\x03]\xff\xd7\x00\ +\x84\x03_\xff\xd7\x00\x84\x03o\xff\x85\x00\x84\x03q\xff\ +\x85\x00\x84\x03s\xff\x85\x00\x84\x03\x8f\xffq\x00\x85\x00\ +\x05\xffq\x00\x85\x00\x0a\xffq\x00\x85\x00&\xff\xd7\x00\ +\x85\x00*\xff\xd7\x00\x85\x00-\x01\x0a\x00\x85\x002\xff\ +\xd7\x00\x85\x004\xff\xd7\x00\x85\x007\xffq\x00\x85\x00\ +9\xff\xae\x00\x85\x00:\xff\xae\x00\x85\x00<\xff\x85\x00\ +\x85\x00\x89\xff\xd7\x00\x85\x00\x94\xff\xd7\x00\x85\x00\x95\xff\ +\xd7\x00\x85\x00\x96\xff\xd7\x00\x85\x00\x97\xff\xd7\x00\x85\x00\ +\x98\xff\xd7\x00\x85\x00\x9a\xff\xd7\x00\x85\x00\x9f\xff\x85\x00\ +\x85\x00\xc8\xff\xd7\x00\x85\x00\xca\xff\xd7\x00\x85\x00\xcc\xff\ +\xd7\x00\x85\x00\xce\xff\xd7\x00\x85\x00\xde\xff\xd7\x00\x85\x00\ +\xe0\xff\xd7\x00\x85\x00\xe2\xff\xd7\x00\x85\x00\xe4\xff\xd7\x00\ +\x85\x01\x0e\xff\xd7\x00\x85\x01\x10\xff\xd7\x00\x85\x01\x12\xff\ +\xd7\x00\x85\x01\x14\xff\xd7\x00\x85\x01$\xffq\x00\x85\x01\ +&\xffq\x00\x85\x016\xff\xae\x00\x85\x018\xff\x85\x00\ +\x85\x01:\xff\x85\x00\x85\x01G\xff\xd7\x00\x85\x01\xfa\xff\ +\xae\x00\x85\x01\xfc\xff\xae\x00\x85\x01\xfe\xff\xae\x00\x85\x02\ +\x00\xff\x85\x00\x85\x02\x07\xffq\x00\x85\x02\x0b\xffq\x00\ +\x85\x02_\xff\xd7\x00\x85\x03I\xff\xd7\x00\x85\x03K\xff\ +\xd7\x00\x85\x03M\xff\xd7\x00\x85\x03O\xff\xd7\x00\x85\x03\ +Q\xff\xd7\x00\x85\x03S\xff\xd7\x00\x85\x03U\xff\xd7\x00\ +\x85\x03W\xff\xd7\x00\x85\x03Y\xff\xd7\x00\x85\x03[\xff\ +\xd7\x00\x85\x03]\xff\xd7\x00\x85\x03_\xff\xd7\x00\x85\x03\ +o\xff\x85\x00\x85\x03q\xff\x85\x00\x85\x03s\xff\x85\x00\ +\x85\x03\x8f\xffq\x00\x86\x00\x05\xffq\x00\x86\x00\x0a\xff\ +q\x00\x86\x00&\xff\xd7\x00\x86\x00*\xff\xd7\x00\x86\x00\ +-\x01\x0a\x00\x86\x002\xff\xd7\x00\x86\x004\xff\xd7\x00\ +\x86\x007\xffq\x00\x86\x009\xff\xae\x00\x86\x00:\xff\ +\xae\x00\x86\x00<\xff\x85\x00\x86\x00\x89\xff\xd7\x00\x86\x00\ +\x94\xff\xd7\x00\x86\x00\x95\xff\xd7\x00\x86\x00\x96\xff\xd7\x00\ +\x86\x00\x97\xff\xd7\x00\x86\x00\x98\xff\xd7\x00\x86\x00\x9a\xff\ +\xd7\x00\x86\x00\x9f\xff\x85\x00\x86\x00\xc8\xff\xd7\x00\x86\x00\ +\xca\xff\xd7\x00\x86\x00\xcc\xff\xd7\x00\x86\x00\xce\xff\xd7\x00\ +\x86\x00\xde\xff\xd7\x00\x86\x00\xe0\xff\xd7\x00\x86\x00\xe2\xff\ +\xd7\x00\x86\x00\xe4\xff\xd7\x00\x86\x01\x0e\xff\xd7\x00\x86\x01\ +\x10\xff\xd7\x00\x86\x01\x12\xff\xd7\x00\x86\x01\x14\xff\xd7\x00\ +\x86\x01$\xffq\x00\x86\x01&\xffq\x00\x86\x016\xff\ +\xae\x00\x86\x018\xff\x85\x00\x86\x01:\xff\x85\x00\x86\x01\ +G\xff\xd7\x00\x86\x01\xfa\xff\xae\x00\x86\x01\xfc\xff\xae\x00\ +\x86\x01\xfe\xff\xae\x00\x86\x02\x00\xff\x85\x00\x86\x02\x07\xff\ +q\x00\x86\x02\x0b\xffq\x00\x86\x02_\xff\xd7\x00\x86\x03\ +I\xff\xd7\x00\x86\x03K\xff\xd7\x00\x86\x03M\xff\xd7\x00\ +\x86\x03O\xff\xd7\x00\x86\x03Q\xff\xd7\x00\x86\x03S\xff\ +\xd7\x00\x86\x03U\xff\xd7\x00\x86\x03W\xff\xd7\x00\x86\x03\ +Y\xff\xd7\x00\x86\x03[\xff\xd7\x00\x86\x03]\xff\xd7\x00\ +\x86\x03_\xff\xd7\x00\x86\x03o\xff\x85\x00\x86\x03q\xff\ +\x85\x00\x86\x03s\xff\x85\x00\x86\x03\x8f\xffq\x00\x87\x00\ +\x05\xffq\x00\x87\x00\x0a\xffq\x00\x87\x00&\xff\xd7\x00\ +\x87\x00*\xff\xd7\x00\x87\x00-\x01\x0a\x00\x87\x002\xff\ +\xd7\x00\x87\x004\xff\xd7\x00\x87\x007\xffq\x00\x87\x00\ +9\xff\xae\x00\x87\x00:\xff\xae\x00\x87\x00<\xff\x85\x00\ +\x87\x00\x89\xff\xd7\x00\x87\x00\x94\xff\xd7\x00\x87\x00\x95\xff\ +\xd7\x00\x87\x00\x96\xff\xd7\x00\x87\x00\x97\xff\xd7\x00\x87\x00\ +\x98\xff\xd7\x00\x87\x00\x9a\xff\xd7\x00\x87\x00\x9f\xff\x85\x00\ +\x87\x00\xc8\xff\xd7\x00\x87\x00\xca\xff\xd7\x00\x87\x00\xcc\xff\ +\xd7\x00\x87\x00\xce\xff\xd7\x00\x87\x00\xde\xff\xd7\x00\x87\x00\ +\xe0\xff\xd7\x00\x87\x00\xe2\xff\xd7\x00\x87\x00\xe4\xff\xd7\x00\ +\x87\x01\x0e\xff\xd7\x00\x87\x01\x10\xff\xd7\x00\x87\x01\x12\xff\ +\xd7\x00\x87\x01\x14\xff\xd7\x00\x87\x01$\xffq\x00\x87\x01\ +&\xffq\x00\x87\x016\xff\xae\x00\x87\x018\xff\x85\x00\ +\x87\x01:\xff\x85\x00\x87\x01G\xff\xd7\x00\x87\x01\xfa\xff\ +\xae\x00\x87\x01\xfc\xff\xae\x00\x87\x01\xfe\xff\xae\x00\x87\x02\ +\x00\xff\x85\x00\x87\x02\x07\xffq\x00\x87\x02\x0b\xffq\x00\ +\x87\x02_\xff\xd7\x00\x87\x03I\xff\xd7\x00\x87\x03K\xff\ +\xd7\x00\x87\x03M\xff\xd7\x00\x87\x03O\xff\xd7\x00\x87\x03\ +Q\xff\xd7\x00\x87\x03S\xff\xd7\x00\x87\x03U\xff\xd7\x00\ +\x87\x03W\xff\xd7\x00\x87\x03Y\xff\xd7\x00\x87\x03[\xff\ +\xd7\x00\x87\x03]\xff\xd7\x00\x87\x03_\xff\xd7\x00\x87\x03\ +o\xff\x85\x00\x87\x03q\xff\x85\x00\x87\x03s\xff\x85\x00\ +\x87\x03\x8f\xffq\x00\x88\x00-\x00{\x00\x89\x00&\xff\ +\xd7\x00\x89\x00*\xff\xd7\x00\x89\x002\xff\xd7\x00\x89\x00\ +4\xff\xd7\x00\x89\x00\x89\xff\xd7\x00\x89\x00\x94\xff\xd7\x00\ +\x89\x00\x95\xff\xd7\x00\x89\x00\x96\xff\xd7\x00\x89\x00\x97\xff\ +\xd7\x00\x89\x00\x98\xff\xd7\x00\x89\x00\x9a\xff\xd7\x00\x89\x00\ +\xc8\xff\xd7\x00\x89\x00\xca\xff\xd7\x00\x89\x00\xcc\xff\xd7\x00\ +\x89\x00\xce\xff\xd7\x00\x89\x00\xde\xff\xd7\x00\x89\x00\xe0\xff\ +\xd7\x00\x89\x00\xe2\xff\xd7\x00\x89\x00\xe4\xff\xd7\x00\x89\x01\ +\x0e\xff\xd7\x00\x89\x01\x10\xff\xd7\x00\x89\x01\x12\xff\xd7\x00\ +\x89\x01\x14\xff\xd7\x00\x89\x01G\xff\xd7\x00\x89\x02_\xff\ +\xd7\x00\x89\x03I\xff\xd7\x00\x89\x03K\xff\xd7\x00\x89\x03\ +M\xff\xd7\x00\x89\x03O\xff\xd7\x00\x89\x03Q\xff\xd7\x00\ +\x89\x03S\xff\xd7\x00\x89\x03U\xff\xd7\x00\x89\x03W\xff\ +\xd7\x00\x89\x03Y\xff\xd7\x00\x89\x03[\xff\xd7\x00\x89\x03\ +]\xff\xd7\x00\x89\x03_\xff\xd7\x00\x8a\x00-\x00{\x00\ +\x8b\x00-\x00{\x00\x8c\x00-\x00{\x00\x8d\x00-\x00\ +{\x00\x92\x00\x0f\xff\xae\x00\x92\x00\x11\xff\xae\x00\x92\x00\ +$\xff\xd7\x00\x92\x007\xff\xc3\x00\x92\x009\xff\xec\x00\ +\x92\x00:\xff\xec\x00\x92\x00;\xff\xd7\x00\x92\x00<\xff\ +\xec\x00\x92\x00=\xff\xec\x00\x92\x00\x82\xff\xd7\x00\x92\x00\ +\x83\xff\xd7\x00\x92\x00\x84\xff\xd7\x00\x92\x00\x85\xff\xd7\x00\ +\x92\x00\x86\xff\xd7\x00\x92\x00\x87\xff\xd7\x00\x92\x00\x9f\xff\ +\xec\x00\x92\x00\xc2\xff\xd7\x00\x92\x00\xc4\xff\xd7\x00\x92\x00\ +\xc6\xff\xd7\x00\x92\x01$\xff\xc3\x00\x92\x01&\xff\xc3\x00\ +\x92\x016\xff\xec\x00\x92\x018\xff\xec\x00\x92\x01:\xff\ +\xec\x00\x92\x01;\xff\xec\x00\x92\x01=\xff\xec\x00\x92\x01\ +?\xff\xec\x00\x92\x01C\xff\xd7\x00\x92\x01\xa0\xff\xec\x00\ +\x92\x01\xfa\xff\xec\x00\x92\x01\xfc\xff\xec\x00\x92\x01\xfe\xff\ +\xec\x00\x92\x02\x00\xff\xec\x00\x92\x02\x08\xff\xae\x00\x92\x02\ +\x0c\xff\xae\x00\x92\x02X\xff\xd7\x00\x92\x03\x1d\xff\xd7\x00\ +\x92\x03\x1f\xff\xd7\x00\x92\x03!\xff\xd7\x00\x92\x03#\xff\ +\xd7\x00\x92\x03%\xff\xd7\x00\x92\x03'\xff\xd7\x00\x92\x03\ +)\xff\xd7\x00\x92\x03+\xff\xd7\x00\x92\x03-\xff\xd7\x00\ +\x92\x03/\xff\xd7\x00\x92\x031\xff\xd7\x00\x92\x033\xff\ +\xd7\x00\x92\x03o\xff\xec\x00\x92\x03q\xff\xec\x00\x92\x03\ +s\xff\xec\x00\x92\x03\x8f\xff\xc3\x00\x94\x00\x0f\xff\xae\x00\ +\x94\x00\x11\xff\xae\x00\x94\x00$\xff\xd7\x00\x94\x007\xff\ +\xc3\x00\x94\x009\xff\xec\x00\x94\x00:\xff\xec\x00\x94\x00\ +;\xff\xd7\x00\x94\x00<\xff\xec\x00\x94\x00=\xff\xec\x00\ +\x94\x00\x82\xff\xd7\x00\x94\x00\x83\xff\xd7\x00\x94\x00\x84\xff\ +\xd7\x00\x94\x00\x85\xff\xd7\x00\x94\x00\x86\xff\xd7\x00\x94\x00\ +\x87\xff\xd7\x00\x94\x00\x9f\xff\xec\x00\x94\x00\xc2\xff\xd7\x00\ +\x94\x00\xc4\xff\xd7\x00\x94\x00\xc6\xff\xd7\x00\x94\x01$\xff\ +\xc3\x00\x94\x01&\xff\xc3\x00\x94\x016\xff\xec\x00\x94\x01\ +8\xff\xec\x00\x94\x01:\xff\xec\x00\x94\x01;\xff\xec\x00\ +\x94\x01=\xff\xec\x00\x94\x01?\xff\xec\x00\x94\x01C\xff\ +\xd7\x00\x94\x01\xa0\xff\xec\x00\x94\x01\xfa\xff\xec\x00\x94\x01\ +\xfc\xff\xec\x00\x94\x01\xfe\xff\xec\x00\x94\x02\x00\xff\xec\x00\ +\x94\x02\x08\xff\xae\x00\x94\x02\x0c\xff\xae\x00\x94\x02X\xff\ +\xd7\x00\x94\x03\x1d\xff\xd7\x00\x94\x03\x1f\xff\xd7\x00\x94\x03\ +!\xff\xd7\x00\x94\x03#\xff\xd7\x00\x94\x03%\xff\xd7\x00\ +\x94\x03'\xff\xd7\x00\x94\x03)\xff\xd7\x00\x94\x03+\xff\ +\xd7\x00\x94\x03-\xff\xd7\x00\x94\x03/\xff\xd7\x00\x94\x03\ +1\xff\xd7\x00\x94\x033\xff\xd7\x00\x94\x03o\xff\xec\x00\ +\x94\x03q\xff\xec\x00\x94\x03s\xff\xec\x00\x94\x03\x8f\xff\ +\xc3\x00\x95\x00\x0f\xff\xae\x00\x95\x00\x11\xff\xae\x00\x95\x00\ +$\xff\xd7\x00\x95\x007\xff\xc3\x00\x95\x009\xff\xec\x00\ +\x95\x00:\xff\xec\x00\x95\x00;\xff\xd7\x00\x95\x00<\xff\ +\xec\x00\x95\x00=\xff\xec\x00\x95\x00\x82\xff\xd7\x00\x95\x00\ +\x83\xff\xd7\x00\x95\x00\x84\xff\xd7\x00\x95\x00\x85\xff\xd7\x00\ +\x95\x00\x86\xff\xd7\x00\x95\x00\x87\xff\xd7\x00\x95\x00\x9f\xff\ +\xec\x00\x95\x00\xc2\xff\xd7\x00\x95\x00\xc4\xff\xd7\x00\x95\x00\ +\xc6\xff\xd7\x00\x95\x01$\xff\xc3\x00\x95\x01&\xff\xc3\x00\ +\x95\x016\xff\xec\x00\x95\x018\xff\xec\x00\x95\x01:\xff\ +\xec\x00\x95\x01;\xff\xec\x00\x95\x01=\xff\xec\x00\x95\x01\ +?\xff\xec\x00\x95\x01C\xff\xd7\x00\x95\x01\xa0\xff\xec\x00\ +\x95\x01\xfa\xff\xec\x00\x95\x01\xfc\xff\xec\x00\x95\x01\xfe\xff\ +\xec\x00\x95\x02\x00\xff\xec\x00\x95\x02\x08\xff\xae\x00\x95\x02\ +\x0c\xff\xae\x00\x95\x02X\xff\xd7\x00\x95\x03\x1d\xff\xd7\x00\ +\x95\x03\x1f\xff\xd7\x00\x95\x03!\xff\xd7\x00\x95\x03#\xff\ +\xd7\x00\x95\x03%\xff\xd7\x00\x95\x03'\xff\xd7\x00\x95\x03\ +)\xff\xd7\x00\x95\x03+\xff\xd7\x00\x95\x03-\xff\xd7\x00\ +\x95\x03/\xff\xd7\x00\x95\x031\xff\xd7\x00\x95\x033\xff\ +\xd7\x00\x95\x03o\xff\xec\x00\x95\x03q\xff\xec\x00\x95\x03\ +s\xff\xec\x00\x95\x03\x8f\xff\xc3\x00\x96\x00\x0f\xff\xae\x00\ +\x96\x00\x11\xff\xae\x00\x96\x00$\xff\xd7\x00\x96\x007\xff\ +\xc3\x00\x96\x009\xff\xec\x00\x96\x00:\xff\xec\x00\x96\x00\ +;\xff\xd7\x00\x96\x00<\xff\xec\x00\x96\x00=\xff\xec\x00\ +\x96\x00\x82\xff\xd7\x00\x96\x00\x83\xff\xd7\x00\x96\x00\x84\xff\ +\xd7\x00\x96\x00\x85\xff\xd7\x00\x96\x00\x86\xff\xd7\x00\x96\x00\ +\x87\xff\xd7\x00\x96\x00\x9f\xff\xec\x00\x96\x00\xc2\xff\xd7\x00\ +\x96\x00\xc4\xff\xd7\x00\x96\x00\xc6\xff\xd7\x00\x96\x01$\xff\ +\xc3\x00\x96\x01&\xff\xc3\x00\x96\x016\xff\xec\x00\x96\x01\ +8\xff\xec\x00\x96\x01:\xff\xec\x00\x96\x01;\xff\xec\x00\ +\x96\x01=\xff\xec\x00\x96\x01?\xff\xec\x00\x96\x01C\xff\ +\xd7\x00\x96\x01\xa0\xff\xec\x00\x96\x01\xfa\xff\xec\x00\x96\x01\ +\xfc\xff\xec\x00\x96\x01\xfe\xff\xec\x00\x96\x02\x00\xff\xec\x00\ +\x96\x02\x08\xff\xae\x00\x96\x02\x0c\xff\xae\x00\x96\x02X\xff\ +\xd7\x00\x96\x03\x1d\xff\xd7\x00\x96\x03\x1f\xff\xd7\x00\x96\x03\ +!\xff\xd7\x00\x96\x03#\xff\xd7\x00\x96\x03%\xff\xd7\x00\ +\x96\x03'\xff\xd7\x00\x96\x03)\xff\xd7\x00\x96\x03+\xff\ +\xd7\x00\x96\x03-\xff\xd7\x00\x96\x03/\xff\xd7\x00\x96\x03\ +1\xff\xd7\x00\x96\x033\xff\xd7\x00\x96\x03o\xff\xec\x00\ +\x96\x03q\xff\xec\x00\x96\x03s\xff\xec\x00\x96\x03\x8f\xff\ +\xc3\x00\x97\x00\x0f\xff\xae\x00\x97\x00\x11\xff\xae\x00\x97\x00\ +$\xff\xd7\x00\x97\x007\xff\xc3\x00\x97\x009\xff\xec\x00\ +\x97\x00:\xff\xec\x00\x97\x00;\xff\xd7\x00\x97\x00<\xff\ +\xec\x00\x97\x00=\xff\xec\x00\x97\x00\x82\xff\xd7\x00\x97\x00\ +\x83\xff\xd7\x00\x97\x00\x84\xff\xd7\x00\x97\x00\x85\xff\xd7\x00\ +\x97\x00\x86\xff\xd7\x00\x97\x00\x87\xff\xd7\x00\x97\x00\x9f\xff\ +\xec\x00\x97\x00\xc2\xff\xd7\x00\x97\x00\xc4\xff\xd7\x00\x97\x00\ +\xc6\xff\xd7\x00\x97\x01$\xff\xc3\x00\x97\x01&\xff\xc3\x00\ +\x97\x016\xff\xec\x00\x97\x018\xff\xec\x00\x97\x01:\xff\ +\xec\x00\x97\x01;\xff\xec\x00\x97\x01=\xff\xec\x00\x97\x01\ +?\xff\xec\x00\x97\x01C\xff\xd7\x00\x97\x01\xa0\xff\xec\x00\ +\x97\x01\xfa\xff\xec\x00\x97\x01\xfc\xff\xec\x00\x97\x01\xfe\xff\ +\xec\x00\x97\x02\x00\xff\xec\x00\x97\x02\x08\xff\xae\x00\x97\x02\ +\x0c\xff\xae\x00\x97\x02X\xff\xd7\x00\x97\x03\x1d\xff\xd7\x00\ +\x97\x03\x1f\xff\xd7\x00\x97\x03!\xff\xd7\x00\x97\x03#\xff\ +\xd7\x00\x97\x03%\xff\xd7\x00\x97\x03'\xff\xd7\x00\x97\x03\ +)\xff\xd7\x00\x97\x03+\xff\xd7\x00\x97\x03-\xff\xd7\x00\ +\x97\x03/\xff\xd7\x00\x97\x031\xff\xd7\x00\x97\x033\xff\ +\xd7\x00\x97\x03o\xff\xec\x00\x97\x03q\xff\xec\x00\x97\x03\ +s\xff\xec\x00\x97\x03\x8f\xff\xc3\x00\x98\x00\x0f\xff\xae\x00\ +\x98\x00\x11\xff\xae\x00\x98\x00$\xff\xd7\x00\x98\x007\xff\ +\xc3\x00\x98\x009\xff\xec\x00\x98\x00:\xff\xec\x00\x98\x00\ +;\xff\xd7\x00\x98\x00<\xff\xec\x00\x98\x00=\xff\xec\x00\ +\x98\x00\x82\xff\xd7\x00\x98\x00\x83\xff\xd7\x00\x98\x00\x84\xff\ +\xd7\x00\x98\x00\x85\xff\xd7\x00\x98\x00\x86\xff\xd7\x00\x98\x00\ +\x87\xff\xd7\x00\x98\x00\x9f\xff\xec\x00\x98\x00\xc2\xff\xd7\x00\ +\x98\x00\xc4\xff\xd7\x00\x98\x00\xc6\xff\xd7\x00\x98\x01$\xff\ +\xc3\x00\x98\x01&\xff\xc3\x00\x98\x016\xff\xec\x00\x98\x01\ +8\xff\xec\x00\x98\x01:\xff\xec\x00\x98\x01;\xff\xec\x00\ +\x98\x01=\xff\xec\x00\x98\x01?\xff\xec\x00\x98\x01C\xff\ +\xd7\x00\x98\x01\xa0\xff\xec\x00\x98\x01\xfa\xff\xec\x00\x98\x01\ +\xfc\xff\xec\x00\x98\x01\xfe\xff\xec\x00\x98\x02\x00\xff\xec\x00\ +\x98\x02\x08\xff\xae\x00\x98\x02\x0c\xff\xae\x00\x98\x02X\xff\ +\xd7\x00\x98\x03\x1d\xff\xd7\x00\x98\x03\x1f\xff\xd7\x00\x98\x03\ +!\xff\xd7\x00\x98\x03#\xff\xd7\x00\x98\x03%\xff\xd7\x00\ +\x98\x03'\xff\xd7\x00\x98\x03)\xff\xd7\x00\x98\x03+\xff\ +\xd7\x00\x98\x03-\xff\xd7\x00\x98\x03/\xff\xd7\x00\x98\x03\ +1\xff\xd7\x00\x98\x033\xff\xd7\x00\x98\x03o\xff\xec\x00\ +\x98\x03q\xff\xec\x00\x98\x03s\xff\xec\x00\x98\x03\x8f\xff\ +\xc3\x00\x9a\x00\x0f\xff\xae\x00\x9a\x00\x11\xff\xae\x00\x9a\x00\ +$\xff\xd7\x00\x9a\x007\xff\xc3\x00\x9a\x009\xff\xec\x00\ +\x9a\x00:\xff\xec\x00\x9a\x00;\xff\xd7\x00\x9a\x00<\xff\ +\xec\x00\x9a\x00=\xff\xec\x00\x9a\x00\x82\xff\xd7\x00\x9a\x00\ +\x83\xff\xd7\x00\x9a\x00\x84\xff\xd7\x00\x9a\x00\x85\xff\xd7\x00\ +\x9a\x00\x86\xff\xd7\x00\x9a\x00\x87\xff\xd7\x00\x9a\x00\x9f\xff\ +\xec\x00\x9a\x00\xc2\xff\xd7\x00\x9a\x00\xc4\xff\xd7\x00\x9a\x00\ +\xc6\xff\xd7\x00\x9a\x01$\xff\xc3\x00\x9a\x01&\xff\xc3\x00\ +\x9a\x016\xff\xec\x00\x9a\x018\xff\xec\x00\x9a\x01:\xff\ +\xec\x00\x9a\x01;\xff\xec\x00\x9a\x01=\xff\xec\x00\x9a\x01\ +?\xff\xec\x00\x9a\x01C\xff\xd7\x00\x9a\x01\xa0\xff\xec\x00\ +\x9a\x01\xfa\xff\xec\x00\x9a\x01\xfc\xff\xec\x00\x9a\x01\xfe\xff\ +\xec\x00\x9a\x02\x00\xff\xec\x00\x9a\x02\x08\xff\xae\x00\x9a\x02\ +\x0c\xff\xae\x00\x9a\x02X\xff\xd7\x00\x9a\x03\x1d\xff\xd7\x00\ +\x9a\x03\x1f\xff\xd7\x00\x9a\x03!\xff\xd7\x00\x9a\x03#\xff\ +\xd7\x00\x9a\x03%\xff\xd7\x00\x9a\x03'\xff\xd7\x00\x9a\x03\ +)\xff\xd7\x00\x9a\x03+\xff\xd7\x00\x9a\x03-\xff\xd7\x00\ +\x9a\x03/\xff\xd7\x00\x9a\x031\xff\xd7\x00\x9a\x033\xff\ +\xd7\x00\x9a\x03o\xff\xec\x00\x9a\x03q\xff\xec\x00\x9a\x03\ +s\xff\xec\x00\x9a\x03\x8f\xff\xc3\x00\x9b\x00\x0f\xff\xd7\x00\ +\x9b\x00\x11\xff\xd7\x00\x9b\x00$\xff\xec\x00\x9b\x00\x82\xff\ +\xec\x00\x9b\x00\x83\xff\xec\x00\x9b\x00\x84\xff\xec\x00\x9b\x00\ +\x85\xff\xec\x00\x9b\x00\x86\xff\xec\x00\x9b\x00\x87\xff\xec\x00\ +\x9b\x00\xc2\xff\xec\x00\x9b\x00\xc4\xff\xec\x00\x9b\x00\xc6\xff\ +\xec\x00\x9b\x01C\xff\xec\x00\x9b\x02\x08\xff\xd7\x00\x9b\x02\ +\x0c\xff\xd7\x00\x9b\x02X\xff\xec\x00\x9b\x03\x1d\xff\xec\x00\ +\x9b\x03\x1f\xff\xec\x00\x9b\x03!\xff\xec\x00\x9b\x03#\xff\ +\xec\x00\x9b\x03%\xff\xec\x00\x9b\x03'\xff\xec\x00\x9b\x03\ +)\xff\xec\x00\x9b\x03+\xff\xec\x00\x9b\x03-\xff\xec\x00\ +\x9b\x03/\xff\xec\x00\x9b\x031\xff\xec\x00\x9b\x033\xff\ +\xec\x00\x9c\x00\x0f\xff\xd7\x00\x9c\x00\x11\xff\xd7\x00\x9c\x00\ +$\xff\xec\x00\x9c\x00\x82\xff\xec\x00\x9c\x00\x83\xff\xec\x00\ +\x9c\x00\x84\xff\xec\x00\x9c\x00\x85\xff\xec\x00\x9c\x00\x86\xff\ +\xec\x00\x9c\x00\x87\xff\xec\x00\x9c\x00\xc2\xff\xec\x00\x9c\x00\ +\xc4\xff\xec\x00\x9c\x00\xc6\xff\xec\x00\x9c\x01C\xff\xec\x00\ +\x9c\x02\x08\xff\xd7\x00\x9c\x02\x0c\xff\xd7\x00\x9c\x02X\xff\ +\xec\x00\x9c\x03\x1d\xff\xec\x00\x9c\x03\x1f\xff\xec\x00\x9c\x03\ +!\xff\xec\x00\x9c\x03#\xff\xec\x00\x9c\x03%\xff\xec\x00\ +\x9c\x03'\xff\xec\x00\x9c\x03)\xff\xec\x00\x9c\x03+\xff\ +\xec\x00\x9c\x03-\xff\xec\x00\x9c\x03/\xff\xec\x00\x9c\x03\ +1\xff\xec\x00\x9c\x033\xff\xec\x00\x9d\x00\x0f\xff\xd7\x00\ +\x9d\x00\x11\xff\xd7\x00\x9d\x00$\xff\xec\x00\x9d\x00\x82\xff\ +\xec\x00\x9d\x00\x83\xff\xec\x00\x9d\x00\x84\xff\xec\x00\x9d\x00\ +\x85\xff\xec\x00\x9d\x00\x86\xff\xec\x00\x9d\x00\x87\xff\xec\x00\ +\x9d\x00\xc2\xff\xec\x00\x9d\x00\xc4\xff\xec\x00\x9d\x00\xc6\xff\ +\xec\x00\x9d\x01C\xff\xec\x00\x9d\x02\x08\xff\xd7\x00\x9d\x02\ +\x0c\xff\xd7\x00\x9d\x02X\xff\xec\x00\x9d\x03\x1d\xff\xec\x00\ +\x9d\x03\x1f\xff\xec\x00\x9d\x03!\xff\xec\x00\x9d\x03#\xff\ +\xec\x00\x9d\x03%\xff\xec\x00\x9d\x03'\xff\xec\x00\x9d\x03\ +)\xff\xec\x00\x9d\x03+\xff\xec\x00\x9d\x03-\xff\xec\x00\ +\x9d\x03/\xff\xec\x00\x9d\x031\xff\xec\x00\x9d\x033\xff\ +\xec\x00\x9e\x00\x0f\xff\xd7\x00\x9e\x00\x11\xff\xd7\x00\x9e\x00\ +$\xff\xec\x00\x9e\x00\x82\xff\xec\x00\x9e\x00\x83\xff\xec\x00\ +\x9e\x00\x84\xff\xec\x00\x9e\x00\x85\xff\xec\x00\x9e\x00\x86\xff\ +\xec\x00\x9e\x00\x87\xff\xec\x00\x9e\x00\xc2\xff\xec\x00\x9e\x00\ +\xc4\xff\xec\x00\x9e\x00\xc6\xff\xec\x00\x9e\x01C\xff\xec\x00\ +\x9e\x02\x08\xff\xd7\x00\x9e\x02\x0c\xff\xd7\x00\x9e\x02X\xff\ +\xec\x00\x9e\x03\x1d\xff\xec\x00\x9e\x03\x1f\xff\xec\x00\x9e\x03\ +!\xff\xec\x00\x9e\x03#\xff\xec\x00\x9e\x03%\xff\xec\x00\ +\x9e\x03'\xff\xec\x00\x9e\x03)\xff\xec\x00\x9e\x03+\xff\ +\xec\x00\x9e\x03-\xff\xec\x00\x9e\x03/\xff\xec\x00\x9e\x03\ +1\xff\xec\x00\x9e\x033\xff\xec\x00\x9f\x00\x0f\xff\x85\x00\ +\x9f\x00\x11\xff\x85\x00\x9f\x00\x22\x00)\x00\x9f\x00$\xff\ +\x85\x00\x9f\x00&\xff\xd7\x00\x9f\x00*\xff\xd7\x00\x9f\x00\ +2\xff\xd7\x00\x9f\x004\xff\xd7\x00\x9f\x00D\xff\x9a\x00\ +\x9f\x00F\xff\x9a\x00\x9f\x00G\xff\x9a\x00\x9f\x00H\xff\ +\x9a\x00\x9f\x00J\xff\xd7\x00\x9f\x00P\xff\xc3\x00\x9f\x00\ +Q\xff\xc3\x00\x9f\x00R\xff\x9a\x00\x9f\x00S\xff\xc3\x00\ +\x9f\x00T\xff\x9a\x00\x9f\x00U\xff\xc3\x00\x9f\x00V\xff\ +\xae\x00\x9f\x00X\xff\xc3\x00\x9f\x00]\xff\xd7\x00\x9f\x00\ +\x82\xff\x85\x00\x9f\x00\x83\xff\x85\x00\x9f\x00\x84\xff\x85\x00\ +\x9f\x00\x85\xff\x85\x00\x9f\x00\x86\xff\x85\x00\x9f\x00\x87\xff\ +\x85\x00\x9f\x00\x89\xff\xd7\x00\x9f\x00\x94\xff\xd7\x00\x9f\x00\ +\x95\xff\xd7\x00\x9f\x00\x96\xff\xd7\x00\x9f\x00\x97\xff\xd7\x00\ +\x9f\x00\x98\xff\xd7\x00\x9f\x00\x9a\xff\xd7\x00\x9f\x00\xa2\xff\ +\x9a\x00\x9f\x00\xa3\xff\x9a\x00\x9f\x00\xa4\xff\x9a\x00\x9f\x00\ +\xa5\xff\x9a\x00\x9f\x00\xa6\xff\x9a\x00\x9f\x00\xa7\xff\x9a\x00\ +\x9f\x00\xa8\xff\x9a\x00\x9f\x00\xa9\xff\x9a\x00\x9f\x00\xaa\xff\ +\x9a\x00\x9f\x00\xab\xff\x9a\x00\x9f\x00\xac\xff\x9a\x00\x9f\x00\ +\xad\xff\x9a\x00\x9f\x00\xb4\xff\x9a\x00\x9f\x00\xb5\xff\x9a\x00\ +\x9f\x00\xb6\xff\x9a\x00\x9f\x00\xb7\xff\x9a\x00\x9f\x00\xb8\xff\ +\x9a\x00\x9f\x00\xba\xff\x9a\x00\x9f\x00\xbb\xff\xc3\x00\x9f\x00\ +\xbc\xff\xc3\x00\x9f\x00\xbd\xff\xc3\x00\x9f\x00\xbe\xff\xc3\x00\ +\x9f\x00\xc2\xff\x85\x00\x9f\x00\xc3\xff\x9a\x00\x9f\x00\xc4\xff\ +\x85\x00\x9f\x00\xc5\xff\x9a\x00\x9f\x00\xc6\xff\x85\x00\x9f\x00\ +\xc7\xff\x9a\x00\x9f\x00\xc8\xff\xd7\x00\x9f\x00\xc9\xff\x9a\x00\ +\x9f\x00\xca\xff\xd7\x00\x9f\x00\xcb\xff\x9a\x00\x9f\x00\xcc\xff\ +\xd7\x00\x9f\x00\xcd\xff\x9a\x00\x9f\x00\xce\xff\xd7\x00\x9f\x00\ +\xcf\xff\x9a\x00\x9f\x00\xd1\xff\x9a\x00\x9f\x00\xd3\xff\x9a\x00\ +\x9f\x00\xd5\xff\x9a\x00\x9f\x00\xd7\xff\x9a\x00\x9f\x00\xd9\xff\ +\x9a\x00\x9f\x00\xdb\xff\x9a\x00\x9f\x00\xdd\xff\x9a\x00\x9f\x00\ +\xde\xff\xd7\x00\x9f\x00\xdf\xff\xd7\x00\x9f\x00\xe0\xff\xd7\x00\ +\x9f\x00\xe1\xff\xd7\x00\x9f\x00\xe2\xff\xd7\x00\x9f\x00\xe3\xff\ +\xd7\x00\x9f\x00\xe4\xff\xd7\x00\x9f\x00\xe5\xff\xd7\x00\x9f\x00\ +\xfa\xff\xc3\x00\x9f\x01\x06\xff\xc3\x00\x9f\x01\x08\xff\xc3\x00\ +\x9f\x01\x0d\xff\xc3\x00\x9f\x01\x0e\xff\xd7\x00\x9f\x01\x0f\xff\ +\x9a\x00\x9f\x01\x10\xff\xd7\x00\x9f\x01\x11\xff\x9a\x00\x9f\x01\ +\x12\xff\xd7\x00\x9f\x01\x13\xff\x9a\x00\x9f\x01\x14\xff\xd7\x00\ +\x9f\x01\x15\xff\x9a\x00\x9f\x01\x17\xff\xc3\x00\x9f\x01\x19\xff\ +\xc3\x00\x9f\x01\x1d\xff\xae\x00\x9f\x01!\xff\xae\x00\x9f\x01\ ++\xff\xc3\x00\x9f\x01-\xff\xc3\x00\x9f\x01/\xff\xc3\x00\ +\x9f\x011\xff\xc3\x00\x9f\x013\xff\xc3\x00\x9f\x015\xff\ +\xc3\x00\x9f\x01<\xff\xd7\x00\x9f\x01>\xff\xd7\x00\x9f\x01\ +@\xff\xd7\x00\x9f\x01C\xff\x85\x00\x9f\x01D\xff\x9a\x00\ +\x9f\x01F\xff\x9a\x00\x9f\x01G\xff\xd7\x00\x9f\x01H\xff\ +\x9a\x00\x9f\x01J\xff\xae\x00\x9f\x02\x08\xff\x85\x00\x9f\x02\ +\x0c\xff\x85\x00\x9f\x02W\xff\xc3\x00\x9f\x02X\xff\x85\x00\ +\x9f\x02Y\xff\x9a\x00\x9f\x02_\xff\xd7\x00\x9f\x02`\xff\ +\x9a\x00\x9f\x02b\xff\xc3\x00\x9f\x03\x1d\xff\x85\x00\x9f\x03\ +\x1e\xff\x9a\x00\x9f\x03\x1f\xff\x85\x00\x9f\x03 \xff\x9a\x00\ +\x9f\x03!\xff\x85\x00\x9f\x03\x22\xff\x9a\x00\x9f\x03#\xff\ +\x85\x00\x9f\x03%\xff\x85\x00\x9f\x03&\xff\x9a\x00\x9f\x03\ +'\xff\x85\x00\x9f\x03(\xff\x9a\x00\x9f\x03)\xff\x85\x00\ +\x9f\x03*\xff\x9a\x00\x9f\x03+\xff\x85\x00\x9f\x03,\xff\ +\x9a\x00\x9f\x03-\xff\x85\x00\x9f\x03.\xff\x9a\x00\x9f\x03\ +/\xff\x85\x00\x9f\x030\xff\x9a\x00\x9f\x031\xff\x85\x00\ +\x9f\x032\xff\x9a\x00\x9f\x033\xff\x85\x00\x9f\x034\xff\ +\x9a\x00\x9f\x036\xff\x9a\x00\x9f\x038\xff\x9a\x00\x9f\x03\ +:\xff\x9a\x00\x9f\x03<\xff\x9a\x00\x9f\x03@\xff\x9a\x00\ +\x9f\x03B\xff\x9a\x00\x9f\x03D\xff\x9a\x00\x9f\x03I\xff\ +\xd7\x00\x9f\x03J\xff\x9a\x00\x9f\x03K\xff\xd7\x00\x9f\x03\ +L\xff\x9a\x00\x9f\x03M\xff\xd7\x00\x9f\x03N\xff\x9a\x00\ +\x9f\x03O\xff\xd7\x00\x9f\x03Q\xff\xd7\x00\x9f\x03R\xff\ +\x9a\x00\x9f\x03S\xff\xd7\x00\x9f\x03T\xff\x9a\x00\x9f\x03\ +U\xff\xd7\x00\x9f\x03V\xff\x9a\x00\x9f\x03W\xff\xd7\x00\ +\x9f\x03X\xff\x9a\x00\x9f\x03Y\xff\xd7\x00\x9f\x03Z\xff\ +\x9a\x00\x9f\x03[\xff\xd7\x00\x9f\x03\x5c\xff\x9a\x00\x9f\x03\ +]\xff\xd7\x00\x9f\x03^\xff\x9a\x00\x9f\x03_\xff\xd7\x00\ +\x9f\x03`\xff\x9a\x00\x9f\x03b\xff\xc3\x00\x9f\x03d\xff\ +\xc3\x00\x9f\x03f\xff\xc3\x00\x9f\x03h\xff\xc3\x00\x9f\x03\ +j\xff\xc3\x00\x9f\x03l\xff\xc3\x00\x9f\x03n\xff\xc3\x00\ +\xa0\x00\x0f\xfe\xf6\x00\xa0\x00\x11\xfe\xf6\x00\xa0\x00$\xff\ +\x9a\x00\xa0\x00;\xff\xd7\x00\xa0\x00=\xff\xec\x00\xa0\x00\ +\x82\xff\x9a\x00\xa0\x00\x83\xff\x9a\x00\xa0\x00\x84\xff\x9a\x00\ +\xa0\x00\x85\xff\x9a\x00\xa0\x00\x86\xff\x9a\x00\xa0\x00\x87\xff\ +\x9a\x00\xa0\x00\xc2\xff\x9a\x00\xa0\x00\xc4\xff\x9a\x00\xa0\x00\ +\xc6\xff\x9a\x00\xa0\x01;\xff\xec\x00\xa0\x01=\xff\xec\x00\ +\xa0\x01?\xff\xec\x00\xa0\x01C\xff\x9a\x00\xa0\x02\x08\xfe\ +\xf6\x00\xa0\x02\x0c\xfe\xf6\x00\xa0\x02X\xff\x9a\x00\xa0\x03\ +\x1d\xff\x9a\x00\xa0\x03\x1f\xff\x9a\x00\xa0\x03!\xff\x9a\x00\ +\xa0\x03#\xff\x9a\x00\xa0\x03%\xff\x9a\x00\xa0\x03'\xff\ +\x9a\x00\xa0\x03)\xff\x9a\x00\xa0\x03+\xff\x9a\x00\xa0\x03\ +-\xff\x9a\x00\xa0\x03/\xff\x9a\x00\xa0\x031\xff\x9a\x00\ +\xa0\x033\xff\x9a\x00\xa2\x00\x05\xff\xec\x00\xa2\x00\x0a\xff\ +\xec\x00\xa2\x02\x07\xff\xec\x00\xa2\x02\x0b\xff\xec\x00\xa3\x00\ +\x05\xff\xec\x00\xa3\x00\x0a\xff\xec\x00\xa3\x02\x07\xff\xec\x00\ +\xa3\x02\x0b\xff\xec\x00\xa4\x00\x05\xff\xec\x00\xa4\x00\x0a\xff\ +\xec\x00\xa4\x02\x07\xff\xec\x00\xa4\x02\x0b\xff\xec\x00\xa5\x00\ +\x05\xff\xec\x00\xa5\x00\x0a\xff\xec\x00\xa5\x02\x07\xff\xec\x00\ +\xa5\x02\x0b\xff\xec\x00\xa6\x00\x05\xff\xec\x00\xa6\x00\x0a\xff\ +\xec\x00\xa6\x02\x07\xff\xec\x00\xa6\x02\x0b\xff\xec\x00\xa7\x00\ +\x05\xff\xec\x00\xa7\x00\x0a\xff\xec\x00\xa7\x02\x07\xff\xec\x00\ +\xa7\x02\x0b\xff\xec\x00\xaa\x00\x05\xff\xec\x00\xaa\x00\x0a\xff\ +\xec\x00\xaa\x00Y\xff\xd7\x00\xaa\x00Z\xff\xd7\x00\xaa\x00\ +[\xff\xd7\x00\xaa\x00\x5c\xff\xd7\x00\xaa\x00]\xff\xec\x00\ +\xaa\x00\xbf\xff\xd7\x00\xaa\x017\xff\xd7\x00\xaa\x01<\xff\ +\xec\x00\xaa\x01>\xff\xec\x00\xaa\x01@\xff\xec\x00\xaa\x01\ +\xfb\xff\xd7\x00\xaa\x01\xfd\xff\xd7\x00\xaa\x02\x07\xff\xec\x00\ +\xaa\x02\x0b\xff\xec\x00\xaa\x03p\xff\xd7\x00\xab\x00\x05\xff\ +\xec\x00\xab\x00\x0a\xff\xec\x00\xab\x00Y\xff\xd7\x00\xab\x00\ +Z\xff\xd7\x00\xab\x00[\xff\xd7\x00\xab\x00\x5c\xff\xd7\x00\ +\xab\x00]\xff\xec\x00\xab\x00\xbf\xff\xd7\x00\xab\x017\xff\ +\xd7\x00\xab\x01<\xff\xec\x00\xab\x01>\xff\xec\x00\xab\x01\ +@\xff\xec\x00\xab\x01\xfb\xff\xd7\x00\xab\x01\xfd\xff\xd7\x00\ +\xab\x02\x07\xff\xec\x00\xab\x02\x0b\xff\xec\x00\xab\x03p\xff\ +\xd7\x00\xac\x00\x05\xff\xec\x00\xac\x00\x0a\xff\xec\x00\xac\x00\ +Y\xff\xd7\x00\xac\x00Z\xff\xd7\x00\xac\x00[\xff\xd7\x00\ +\xac\x00\x5c\xff\xd7\x00\xac\x00]\xff\xec\x00\xac\x00\xbf\xff\ +\xd7\x00\xac\x017\xff\xd7\x00\xac\x01<\xff\xec\x00\xac\x01\ +>\xff\xec\x00\xac\x01@\xff\xec\x00\xac\x01\xfb\xff\xd7\x00\ +\xac\x01\xfd\xff\xd7\x00\xac\x02\x07\xff\xec\x00\xac\x02\x0b\xff\ +\xec\x00\xac\x03p\xff\xd7\x00\xad\x00\x05\xff\xec\x00\xad\x00\ +\x0a\xff\xec\x00\xad\x00Y\xff\xd7\x00\xad\x00Z\xff\xd7\x00\ +\xad\x00[\xff\xd7\x00\xad\x00\x5c\xff\xd7\x00\xad\x00]\xff\ +\xec\x00\xad\x00\xbf\xff\xd7\x00\xad\x017\xff\xd7\x00\xad\x01\ +<\xff\xec\x00\xad\x01>\xff\xec\x00\xad\x01@\xff\xec\x00\ +\xad\x01\xfb\xff\xd7\x00\xad\x01\xfd\xff\xd7\x00\xad\x02\x07\xff\ +\xec\x00\xad\x02\x0b\xff\xec\x00\xad\x03p\xff\xd7\x00\xb2\x00\ +\x05\xff\xec\x00\xb2\x00\x0a\xff\xec\x00\xb2\x00Y\xff\xd7\x00\ +\xb2\x00Z\xff\xd7\x00\xb2\x00[\xff\xd7\x00\xb2\x00\x5c\xff\ +\xd7\x00\xb2\x00]\xff\xec\x00\xb2\x00\xbf\xff\xd7\x00\xb2\x01\ +7\xff\xd7\x00\xb2\x01<\xff\xec\x00\xb2\x01>\xff\xec\x00\ +\xb2\x01@\xff\xec\x00\xb2\x01\xfb\xff\xd7\x00\xb2\x01\xfd\xff\ +\xd7\x00\xb2\x02\x07\xff\xec\x00\xb2\x02\x0b\xff\xec\x00\xb2\x03\ +p\xff\xd7\x00\xb4\x00\x05\xff\xec\x00\xb4\x00\x0a\xff\xec\x00\ +\xb4\x00Y\xff\xd7\x00\xb4\x00Z\xff\xd7\x00\xb4\x00[\xff\ +\xd7\x00\xb4\x00\x5c\xff\xd7\x00\xb4\x00]\xff\xec\x00\xb4\x00\ +\xbf\xff\xd7\x00\xb4\x017\xff\xd7\x00\xb4\x01<\xff\xec\x00\ +\xb4\x01>\xff\xec\x00\xb4\x01@\xff\xec\x00\xb4\x01\xfb\xff\ +\xd7\x00\xb4\x01\xfd\xff\xd7\x00\xb4\x02\x07\xff\xec\x00\xb4\x02\ +\x0b\xff\xec\x00\xb4\x03p\xff\xd7\x00\xb5\x00\x05\xff\xec\x00\ +\xb5\x00\x0a\xff\xec\x00\xb5\x00Y\xff\xd7\x00\xb5\x00Z\xff\ +\xd7\x00\xb5\x00[\xff\xd7\x00\xb5\x00\x5c\xff\xd7\x00\xb5\x00\ +]\xff\xec\x00\xb5\x00\xbf\xff\xd7\x00\xb5\x017\xff\xd7\x00\ +\xb5\x01<\xff\xec\x00\xb5\x01>\xff\xec\x00\xb5\x01@\xff\ +\xec\x00\xb5\x01\xfb\xff\xd7\x00\xb5\x01\xfd\xff\xd7\x00\xb5\x02\ +\x07\xff\xec\x00\xb5\x02\x0b\xff\xec\x00\xb5\x03p\xff\xd7\x00\ +\xb6\x00\x05\xff\xec\x00\xb6\x00\x0a\xff\xec\x00\xb6\x00Y\xff\ +\xd7\x00\xb6\x00Z\xff\xd7\x00\xb6\x00[\xff\xd7\x00\xb6\x00\ +\x5c\xff\xd7\x00\xb6\x00]\xff\xec\x00\xb6\x00\xbf\xff\xd7\x00\ +\xb6\x017\xff\xd7\x00\xb6\x01<\xff\xec\x00\xb6\x01>\xff\ +\xec\x00\xb6\x01@\xff\xec\x00\xb6\x01\xfb\xff\xd7\x00\xb6\x01\ +\xfd\xff\xd7\x00\xb6\x02\x07\xff\xec\x00\xb6\x02\x0b\xff\xec\x00\ +\xb6\x03p\xff\xd7\x00\xb8\x00\x05\xff\xd7\x00\xb8\x00\x0a\xff\ +\xd7\x00\xb8\x02\x07\xff\xd7\x00\xb8\x02\x0b\xff\xd7\x00\xba\x00\ +\x05\xff\xec\x00\xba\x00\x0a\xff\xec\x00\xba\x00Y\xff\xd7\x00\ +\xba\x00Z\xff\xd7\x00\xba\x00[\xff\xd7\x00\xba\x00\x5c\xff\ +\xd7\x00\xba\x00]\xff\xec\x00\xba\x00\xbf\xff\xd7\x00\xba\x01\ +7\xff\xd7\x00\xba\x01<\xff\xec\x00\xba\x01>\xff\xec\x00\ +\xba\x01@\xff\xec\x00\xba\x01\xfb\xff\xd7\x00\xba\x01\xfd\xff\ +\xd7\x00\xba\x02\x07\xff\xec\x00\xba\x02\x0b\xff\xec\x00\xba\x03\ +p\xff\xd7\x00\xbf\x00\x05\x00R\x00\xbf\x00\x0a\x00R\x00\ +\xbf\x00\x0f\xff\xae\x00\xbf\x00\x11\xff\xae\x00\xbf\x00\x22\x00\ +)\x00\xbf\x02\x07\x00R\x00\xbf\x02\x08\xff\xae\x00\xbf\x02\ +\x0b\x00R\x00\xbf\x02\x0c\xff\xae\x00\xc0\x00\x05\xff\xec\x00\ +\xc0\x00\x0a\xff\xec\x00\xc0\x00Y\xff\xd7\x00\xc0\x00Z\xff\ +\xd7\x00\xc0\x00[\xff\xd7\x00\xc0\x00\x5c\xff\xd7\x00\xc0\x00\ +]\xff\xec\x00\xc0\x00\xbf\xff\xd7\x00\xc0\x017\xff\xd7\x00\ +\xc0\x01<\xff\xec\x00\xc0\x01>\xff\xec\x00\xc0\x01@\xff\ +\xec\x00\xc0\x01\xfb\xff\xd7\x00\xc0\x01\xfd\xff\xd7\x00\xc0\x02\ +\x07\xff\xec\x00\xc0\x02\x0b\xff\xec\x00\xc0\x03p\xff\xd7\x00\ +\xc1\x00\x05\x00R\x00\xc1\x00\x0a\x00R\x00\xc1\x00\x0f\xff\ +\xae\x00\xc1\x00\x11\xff\xae\x00\xc1\x00\x22\x00)\x00\xc1\x02\ +\x07\x00R\x00\xc1\x02\x08\xff\xae\x00\xc1\x02\x0b\x00R\x00\ +\xc1\x02\x0c\xff\xae\x00\xc2\x00\x05\xffq\x00\xc2\x00\x0a\xff\ +q\x00\xc2\x00&\xff\xd7\x00\xc2\x00*\xff\xd7\x00\xc2\x00\ +-\x01\x0a\x00\xc2\x002\xff\xd7\x00\xc2\x004\xff\xd7\x00\ +\xc2\x007\xffq\x00\xc2\x009\xff\xae\x00\xc2\x00:\xff\ +\xae\x00\xc2\x00<\xff\x85\x00\xc2\x00\x89\xff\xd7\x00\xc2\x00\ +\x94\xff\xd7\x00\xc2\x00\x95\xff\xd7\x00\xc2\x00\x96\xff\xd7\x00\ +\xc2\x00\x97\xff\xd7\x00\xc2\x00\x98\xff\xd7\x00\xc2\x00\x9a\xff\ +\xd7\x00\xc2\x00\x9f\xff\x85\x00\xc2\x00\xc8\xff\xd7\x00\xc2\x00\ +\xca\xff\xd7\x00\xc2\x00\xcc\xff\xd7\x00\xc2\x00\xce\xff\xd7\x00\ +\xc2\x00\xde\xff\xd7\x00\xc2\x00\xe0\xff\xd7\x00\xc2\x00\xe2\xff\ +\xd7\x00\xc2\x00\xe4\xff\xd7\x00\xc2\x01\x0e\xff\xd7\x00\xc2\x01\ +\x10\xff\xd7\x00\xc2\x01\x12\xff\xd7\x00\xc2\x01\x14\xff\xd7\x00\ +\xc2\x01$\xffq\x00\xc2\x01&\xffq\x00\xc2\x016\xff\ +\xae\x00\xc2\x018\xff\x85\x00\xc2\x01:\xff\x85\x00\xc2\x01\ +G\xff\xd7\x00\xc2\x01\xfa\xff\xae\x00\xc2\x01\xfc\xff\xae\x00\ +\xc2\x01\xfe\xff\xae\x00\xc2\x02\x00\xff\x85\x00\xc2\x02\x07\xff\ +q\x00\xc2\x02\x0b\xffq\x00\xc2\x02_\xff\xd7\x00\xc2\x03\ +I\xff\xd7\x00\xc2\x03K\xff\xd7\x00\xc2\x03M\xff\xd7\x00\ +\xc2\x03O\xff\xd7\x00\xc2\x03Q\xff\xd7\x00\xc2\x03S\xff\ +\xd7\x00\xc2\x03U\xff\xd7\x00\xc2\x03W\xff\xd7\x00\xc2\x03\ +Y\xff\xd7\x00\xc2\x03[\xff\xd7\x00\xc2\x03]\xff\xd7\x00\ +\xc2\x03_\xff\xd7\x00\xc2\x03o\xff\x85\x00\xc2\x03q\xff\ +\x85\x00\xc2\x03s\xff\x85\x00\xc2\x03\x8f\xffq\x00\xc3\x00\ +\x05\xff\xec\x00\xc3\x00\x0a\xff\xec\x00\xc3\x02\x07\xff\xec\x00\ +\xc3\x02\x0b\xff\xec\x00\xc4\x00\x05\xffq\x00\xc4\x00\x0a\xff\ +q\x00\xc4\x00&\xff\xd7\x00\xc4\x00*\xff\xd7\x00\xc4\x00\ +-\x01\x0a\x00\xc4\x002\xff\xd7\x00\xc4\x004\xff\xd7\x00\ +\xc4\x007\xffq\x00\xc4\x009\xff\xae\x00\xc4\x00:\xff\ +\xae\x00\xc4\x00<\xff\x85\x00\xc4\x00\x89\xff\xd7\x00\xc4\x00\ +\x94\xff\xd7\x00\xc4\x00\x95\xff\xd7\x00\xc4\x00\x96\xff\xd7\x00\ +\xc4\x00\x97\xff\xd7\x00\xc4\x00\x98\xff\xd7\x00\xc4\x00\x9a\xff\ +\xd7\x00\xc4\x00\x9f\xff\x85\x00\xc4\x00\xc8\xff\xd7\x00\xc4\x00\ +\xca\xff\xd7\x00\xc4\x00\xcc\xff\xd7\x00\xc4\x00\xce\xff\xd7\x00\ +\xc4\x00\xde\xff\xd7\x00\xc4\x00\xe0\xff\xd7\x00\xc4\x00\xe2\xff\ +\xd7\x00\xc4\x00\xe4\xff\xd7\x00\xc4\x01\x0e\xff\xd7\x00\xc4\x01\ +\x10\xff\xd7\x00\xc4\x01\x12\xff\xd7\x00\xc4\x01\x14\xff\xd7\x00\ +\xc4\x01$\xffq\x00\xc4\x01&\xffq\x00\xc4\x016\xff\ +\xae\x00\xc4\x018\xff\x85\x00\xc4\x01:\xff\x85\x00\xc4\x01\ +G\xff\xd7\x00\xc4\x01\xfa\xff\xae\x00\xc4\x01\xfc\xff\xae\x00\ +\xc4\x01\xfe\xff\xae\x00\xc4\x02\x00\xff\x85\x00\xc4\x02\x07\xff\ +q\x00\xc4\x02\x0b\xffq\x00\xc4\x02_\xff\xd7\x00\xc4\x03\ +I\xff\xd7\x00\xc4\x03K\xff\xd7\x00\xc4\x03M\xff\xd7\x00\ +\xc4\x03O\xff\xd7\x00\xc4\x03Q\xff\xd7\x00\xc4\x03S\xff\ +\xd7\x00\xc4\x03U\xff\xd7\x00\xc4\x03W\xff\xd7\x00\xc4\x03\ +Y\xff\xd7\x00\xc4\x03[\xff\xd7\x00\xc4\x03]\xff\xd7\x00\ +\xc4\x03_\xff\xd7\x00\xc4\x03o\xff\x85\x00\xc4\x03q\xff\ +\x85\x00\xc4\x03s\xff\x85\x00\xc4\x03\x8f\xffq\x00\xc5\x00\ +\x05\xff\xec\x00\xc5\x00\x0a\xff\xec\x00\xc5\x02\x07\xff\xec\x00\ +\xc5\x02\x0b\xff\xec\x00\xc6\x00\x05\xffq\x00\xc6\x00\x0a\xff\ +q\x00\xc6\x00&\xff\xd7\x00\xc6\x00*\xff\xd7\x00\xc6\x00\ +-\x01\x0a\x00\xc6\x002\xff\xd7\x00\xc6\x004\xff\xd7\x00\ +\xc6\x007\xffq\x00\xc6\x009\xff\xae\x00\xc6\x00:\xff\ +\xae\x00\xc6\x00<\xff\x85\x00\xc6\x00\x89\xff\xd7\x00\xc6\x00\ +\x94\xff\xd7\x00\xc6\x00\x95\xff\xd7\x00\xc6\x00\x96\xff\xd7\x00\ +\xc6\x00\x97\xff\xd7\x00\xc6\x00\x98\xff\xd7\x00\xc6\x00\x9a\xff\ +\xd7\x00\xc6\x00\x9f\xff\x85\x00\xc6\x00\xc8\xff\xd7\x00\xc6\x00\ +\xca\xff\xd7\x00\xc6\x00\xcc\xff\xd7\x00\xc6\x00\xce\xff\xd7\x00\ +\xc6\x00\xde\xff\xd7\x00\xc6\x00\xe0\xff\xd7\x00\xc6\x00\xe2\xff\ +\xd7\x00\xc6\x00\xe4\xff\xd7\x00\xc6\x01\x0e\xff\xd7\x00\xc6\x01\ +\x10\xff\xd7\x00\xc6\x01\x12\xff\xd7\x00\xc6\x01\x14\xff\xd7\x00\ +\xc6\x01$\xffq\x00\xc6\x01&\xffq\x00\xc6\x016\xff\ +\xae\x00\xc6\x018\xff\x85\x00\xc6\x01:\xff\x85\x00\xc6\x01\ +G\xff\xd7\x00\xc6\x01\xfa\xff\xae\x00\xc6\x01\xfc\xff\xae\x00\ +\xc6\x01\xfe\xff\xae\x00\xc6\x02\x00\xff\x85\x00\xc6\x02\x07\xff\ +q\x00\xc6\x02\x0b\xffq\x00\xc6\x02_\xff\xd7\x00\xc6\x03\ +I\xff\xd7\x00\xc6\x03K\xff\xd7\x00\xc6\x03M\xff\xd7\x00\ +\xc6\x03O\xff\xd7\x00\xc6\x03Q\xff\xd7\x00\xc6\x03S\xff\ +\xd7\x00\xc6\x03U\xff\xd7\x00\xc6\x03W\xff\xd7\x00\xc6\x03\ +Y\xff\xd7\x00\xc6\x03[\xff\xd7\x00\xc6\x03]\xff\xd7\x00\ +\xc6\x03_\xff\xd7\x00\xc6\x03o\xff\x85\x00\xc6\x03q\xff\ +\x85\x00\xc6\x03s\xff\x85\x00\xc6\x03\x8f\xffq\x00\xc7\x00\ +\x05\xff\xec\x00\xc7\x00\x0a\xff\xec\x00\xc7\x02\x07\xff\xec\x00\ +\xc7\x02\x0b\xff\xec\x00\xc8\x00&\xff\xd7\x00\xc8\x00*\xff\ +\xd7\x00\xc8\x002\xff\xd7\x00\xc8\x004\xff\xd7\x00\xc8\x00\ +\x89\xff\xd7\x00\xc8\x00\x94\xff\xd7\x00\xc8\x00\x95\xff\xd7\x00\ +\xc8\x00\x96\xff\xd7\x00\xc8\x00\x97\xff\xd7\x00\xc8\x00\x98\xff\ +\xd7\x00\xc8\x00\x9a\xff\xd7\x00\xc8\x00\xc8\xff\xd7\x00\xc8\x00\ +\xca\xff\xd7\x00\xc8\x00\xcc\xff\xd7\x00\xc8\x00\xce\xff\xd7\x00\ +\xc8\x00\xde\xff\xd7\x00\xc8\x00\xe0\xff\xd7\x00\xc8\x00\xe2\xff\ +\xd7\x00\xc8\x00\xe4\xff\xd7\x00\xc8\x01\x0e\xff\xd7\x00\xc8\x01\ +\x10\xff\xd7\x00\xc8\x01\x12\xff\xd7\x00\xc8\x01\x14\xff\xd7\x00\ +\xc8\x01G\xff\xd7\x00\xc8\x02_\xff\xd7\x00\xc8\x03I\xff\ +\xd7\x00\xc8\x03K\xff\xd7\x00\xc8\x03M\xff\xd7\x00\xc8\x03\ +O\xff\xd7\x00\xc8\x03Q\xff\xd7\x00\xc8\x03S\xff\xd7\x00\ +\xc8\x03U\xff\xd7\x00\xc8\x03W\xff\xd7\x00\xc8\x03Y\xff\ +\xd7\x00\xc8\x03[\xff\xd7\x00\xc8\x03]\xff\xd7\x00\xc8\x03\ +_\xff\xd7\x00\xca\x00&\xff\xd7\x00\xca\x00*\xff\xd7\x00\ +\xca\x002\xff\xd7\x00\xca\x004\xff\xd7\x00\xca\x00\x89\xff\ +\xd7\x00\xca\x00\x94\xff\xd7\x00\xca\x00\x95\xff\xd7\x00\xca\x00\ +\x96\xff\xd7\x00\xca\x00\x97\xff\xd7\x00\xca\x00\x98\xff\xd7\x00\ +\xca\x00\x9a\xff\xd7\x00\xca\x00\xc8\xff\xd7\x00\xca\x00\xca\xff\ +\xd7\x00\xca\x00\xcc\xff\xd7\x00\xca\x00\xce\xff\xd7\x00\xca\x00\ +\xde\xff\xd7\x00\xca\x00\xe0\xff\xd7\x00\xca\x00\xe2\xff\xd7\x00\ +\xca\x00\xe4\xff\xd7\x00\xca\x01\x0e\xff\xd7\x00\xca\x01\x10\xff\ +\xd7\x00\xca\x01\x12\xff\xd7\x00\xca\x01\x14\xff\xd7\x00\xca\x01\ +G\xff\xd7\x00\xca\x02_\xff\xd7\x00\xca\x03I\xff\xd7\x00\ +\xca\x03K\xff\xd7\x00\xca\x03M\xff\xd7\x00\xca\x03O\xff\ +\xd7\x00\xca\x03Q\xff\xd7\x00\xca\x03S\xff\xd7\x00\xca\x03\ +U\xff\xd7\x00\xca\x03W\xff\xd7\x00\xca\x03Y\xff\xd7\x00\ +\xca\x03[\xff\xd7\x00\xca\x03]\xff\xd7\x00\xca\x03_\xff\ +\xd7\x00\xcc\x00&\xff\xd7\x00\xcc\x00*\xff\xd7\x00\xcc\x00\ +2\xff\xd7\x00\xcc\x004\xff\xd7\x00\xcc\x00\x89\xff\xd7\x00\ +\xcc\x00\x94\xff\xd7\x00\xcc\x00\x95\xff\xd7\x00\xcc\x00\x96\xff\ +\xd7\x00\xcc\x00\x97\xff\xd7\x00\xcc\x00\x98\xff\xd7\x00\xcc\x00\ +\x9a\xff\xd7\x00\xcc\x00\xc8\xff\xd7\x00\xcc\x00\xca\xff\xd7\x00\ +\xcc\x00\xcc\xff\xd7\x00\xcc\x00\xce\xff\xd7\x00\xcc\x00\xde\xff\ +\xd7\x00\xcc\x00\xe0\xff\xd7\x00\xcc\x00\xe2\xff\xd7\x00\xcc\x00\ +\xe4\xff\xd7\x00\xcc\x01\x0e\xff\xd7\x00\xcc\x01\x10\xff\xd7\x00\ +\xcc\x01\x12\xff\xd7\x00\xcc\x01\x14\xff\xd7\x00\xcc\x01G\xff\ +\xd7\x00\xcc\x02_\xff\xd7\x00\xcc\x03I\xff\xd7\x00\xcc\x03\ +K\xff\xd7\x00\xcc\x03M\xff\xd7\x00\xcc\x03O\xff\xd7\x00\ +\xcc\x03Q\xff\xd7\x00\xcc\x03S\xff\xd7\x00\xcc\x03U\xff\ +\xd7\x00\xcc\x03W\xff\xd7\x00\xcc\x03Y\xff\xd7\x00\xcc\x03\ +[\xff\xd7\x00\xcc\x03]\xff\xd7\x00\xcc\x03_\xff\xd7\x00\ +\xce\x00&\xff\xd7\x00\xce\x00*\xff\xd7\x00\xce\x002\xff\ +\xd7\x00\xce\x004\xff\xd7\x00\xce\x00\x89\xff\xd7\x00\xce\x00\ +\x94\xff\xd7\x00\xce\x00\x95\xff\xd7\x00\xce\x00\x96\xff\xd7\x00\ +\xce\x00\x97\xff\xd7\x00\xce\x00\x98\xff\xd7\x00\xce\x00\x9a\xff\ +\xd7\x00\xce\x00\xc8\xff\xd7\x00\xce\x00\xca\xff\xd7\x00\xce\x00\ +\xcc\xff\xd7\x00\xce\x00\xce\xff\xd7\x00\xce\x00\xde\xff\xd7\x00\ +\xce\x00\xe0\xff\xd7\x00\xce\x00\xe2\xff\xd7\x00\xce\x00\xe4\xff\ +\xd7\x00\xce\x01\x0e\xff\xd7\x00\xce\x01\x10\xff\xd7\x00\xce\x01\ +\x12\xff\xd7\x00\xce\x01\x14\xff\xd7\x00\xce\x01G\xff\xd7\x00\ +\xce\x02_\xff\xd7\x00\xce\x03I\xff\xd7\x00\xce\x03K\xff\ +\xd7\x00\xce\x03M\xff\xd7\x00\xce\x03O\xff\xd7\x00\xce\x03\ +Q\xff\xd7\x00\xce\x03S\xff\xd7\x00\xce\x03U\xff\xd7\x00\ +\xce\x03W\xff\xd7\x00\xce\x03Y\xff\xd7\x00\xce\x03[\xff\ +\xd7\x00\xce\x03]\xff\xd7\x00\xce\x03_\xff\xd7\x00\xd0\x00\ +\x0f\xff\xae\x00\xd0\x00\x11\xff\xae\x00\xd0\x00$\xff\xd7\x00\ +\xd0\x007\xff\xc3\x00\xd0\x009\xff\xec\x00\xd0\x00:\xff\ +\xec\x00\xd0\x00;\xff\xd7\x00\xd0\x00<\xff\xec\x00\xd0\x00\ +=\xff\xec\x00\xd0\x00\x82\xff\xd7\x00\xd0\x00\x83\xff\xd7\x00\ +\xd0\x00\x84\xff\xd7\x00\xd0\x00\x85\xff\xd7\x00\xd0\x00\x86\xff\ +\xd7\x00\xd0\x00\x87\xff\xd7\x00\xd0\x00\x9f\xff\xec\x00\xd0\x00\ +\xc2\xff\xd7\x00\xd0\x00\xc4\xff\xd7\x00\xd0\x00\xc6\xff\xd7\x00\ +\xd0\x01$\xff\xc3\x00\xd0\x01&\xff\xc3\x00\xd0\x016\xff\ +\xec\x00\xd0\x018\xff\xec\x00\xd0\x01:\xff\xec\x00\xd0\x01\ +;\xff\xec\x00\xd0\x01=\xff\xec\x00\xd0\x01?\xff\xec\x00\ +\xd0\x01C\xff\xd7\x00\xd0\x01\xa0\xff\xec\x00\xd0\x01\xfa\xff\ +\xec\x00\xd0\x01\xfc\xff\xec\x00\xd0\x01\xfe\xff\xec\x00\xd0\x02\ +\x00\xff\xec\x00\xd0\x02\x08\xff\xae\x00\xd0\x02\x0c\xff\xae\x00\ +\xd0\x02X\xff\xd7\x00\xd0\x03\x1d\xff\xd7\x00\xd0\x03\x1f\xff\ +\xd7\x00\xd0\x03!\xff\xd7\x00\xd0\x03#\xff\xd7\x00\xd0\x03\ +%\xff\xd7\x00\xd0\x03'\xff\xd7\x00\xd0\x03)\xff\xd7\x00\ +\xd0\x03+\xff\xd7\x00\xd0\x03-\xff\xd7\x00\xd0\x03/\xff\ +\xd7\x00\xd0\x031\xff\xd7\x00\xd0\x033\xff\xd7\x00\xd0\x03\ +o\xff\xec\x00\xd0\x03q\xff\xec\x00\xd0\x03s\xff\xec\x00\ +\xd0\x03\x8f\xff\xc3\x00\xd1\x00\x05\x00R\x00\xd1\x00\x0a\x00\ +R\x00\xd1\x00\x0c\x00\x8f\x00\xd1\x00\x22\x00\xa4\x00\xd1\x00\ +@\x00\x8f\x00\xd1\x00E\x00=\x00\xd1\x00K\x00=\x00\ +\xd1\x00N\x00=\x00\xd1\x00O\x00=\x00\xd1\x00`\x00\ +\x8f\x00\xd1\x00\xe7\x00=\x00\xd1\x00\xe9\x00{\x00\xd1\x02\ +\x07\x00R\x00\xd1\x02\x0b\x00R\x00\xd2\x00\x0f\xff\xae\x00\ +\xd2\x00\x11\xff\xae\x00\xd2\x00$\xff\xd7\x00\xd2\x007\xff\ +\xc3\x00\xd2\x009\xff\xec\x00\xd2\x00:\xff\xec\x00\xd2\x00\ +;\xff\xd7\x00\xd2\x00<\xff\xec\x00\xd2\x00=\xff\xec\x00\ +\xd2\x00\x82\xff\xd7\x00\xd2\x00\x83\xff\xd7\x00\xd2\x00\x84\xff\ +\xd7\x00\xd2\x00\x85\xff\xd7\x00\xd2\x00\x86\xff\xd7\x00\xd2\x00\ +\x87\xff\xd7\x00\xd2\x00\x9f\xff\xec\x00\xd2\x00\xc2\xff\xd7\x00\ +\xd2\x00\xc4\xff\xd7\x00\xd2\x00\xc6\xff\xd7\x00\xd2\x01$\xff\ +\xc3\x00\xd2\x01&\xff\xc3\x00\xd2\x016\xff\xec\x00\xd2\x01\ +8\xff\xec\x00\xd2\x01:\xff\xec\x00\xd2\x01;\xff\xec\x00\ +\xd2\x01=\xff\xec\x00\xd2\x01?\xff\xec\x00\xd2\x01C\xff\ +\xd7\x00\xd2\x01\xa0\xff\xec\x00\xd2\x01\xfa\xff\xec\x00\xd2\x01\ +\xfc\xff\xec\x00\xd2\x01\xfe\xff\xec\x00\xd2\x02\x00\xff\xec\x00\ +\xd2\x02\x08\xff\xae\x00\xd2\x02\x0c\xff\xae\x00\xd2\x02X\xff\ +\xd7\x00\xd2\x03\x1d\xff\xd7\x00\xd2\x03\x1f\xff\xd7\x00\xd2\x03\ +!\xff\xd7\x00\xd2\x03#\xff\xd7\x00\xd2\x03%\xff\xd7\x00\ +\xd2\x03'\xff\xd7\x00\xd2\x03)\xff\xd7\x00\xd2\x03+\xff\ +\xd7\x00\xd2\x03-\xff\xd7\x00\xd2\x03/\xff\xd7\x00\xd2\x03\ +1\xff\xd7\x00\xd2\x033\xff\xd7\x00\xd2\x03o\xff\xec\x00\ +\xd2\x03q\xff\xec\x00\xd2\x03s\xff\xec\x00\xd2\x03\x8f\xff\ +\xc3\x00\xd4\x00-\x00{\x00\xd5\x00\x05\xff\xec\x00\xd5\x00\ +\x0a\xff\xec\x00\xd5\x00Y\xff\xd7\x00\xd5\x00Z\xff\xd7\x00\ +\xd5\x00[\xff\xd7\x00\xd5\x00\x5c\xff\xd7\x00\xd5\x00]\xff\ +\xec\x00\xd5\x00\xbf\xff\xd7\x00\xd5\x017\xff\xd7\x00\xd5\x01\ +<\xff\xec\x00\xd5\x01>\xff\xec\x00\xd5\x01@\xff\xec\x00\ +\xd5\x01\xfb\xff\xd7\x00\xd5\x01\xfd\xff\xd7\x00\xd5\x02\x07\xff\ +\xec\x00\xd5\x02\x0b\xff\xec\x00\xd5\x03p\xff\xd7\x00\xd6\x00\ +-\x00{\x00\xd7\x00\x05\xff\xec\x00\xd7\x00\x0a\xff\xec\x00\ +\xd7\x00Y\xff\xd7\x00\xd7\x00Z\xff\xd7\x00\xd7\x00[\xff\ +\xd7\x00\xd7\x00\x5c\xff\xd7\x00\xd7\x00]\xff\xec\x00\xd7\x00\ +\xbf\xff\xd7\x00\xd7\x017\xff\xd7\x00\xd7\x01<\xff\xec\x00\ +\xd7\x01>\xff\xec\x00\xd7\x01@\xff\xec\x00\xd7\x01\xfb\xff\ +\xd7\x00\xd7\x01\xfd\xff\xd7\x00\xd7\x02\x07\xff\xec\x00\xd7\x02\ +\x0b\xff\xec\x00\xd7\x03p\xff\xd7\x00\xd8\x00-\x00{\x00\ +\xd9\x00\x05\xff\xec\x00\xd9\x00\x0a\xff\xec\x00\xd9\x00Y\xff\ +\xd7\x00\xd9\x00Z\xff\xd7\x00\xd9\x00[\xff\xd7\x00\xd9\x00\ +\x5c\xff\xd7\x00\xd9\x00]\xff\xec\x00\xd9\x00\xbf\xff\xd7\x00\ +\xd9\x017\xff\xd7\x00\xd9\x01<\xff\xec\x00\xd9\x01>\xff\ +\xec\x00\xd9\x01@\xff\xec\x00\xd9\x01\xfb\xff\xd7\x00\xd9\x01\ +\xfd\xff\xd7\x00\xd9\x02\x07\xff\xec\x00\xd9\x02\x0b\xff\xec\x00\ +\xd9\x03p\xff\xd7\x00\xda\x00-\x00{\x00\xdb\x00\x05\xff\ +\xec\x00\xdb\x00\x0a\xff\xec\x00\xdb\x00Y\xff\xd7\x00\xdb\x00\ +Z\xff\xd7\x00\xdb\x00[\xff\xd7\x00\xdb\x00\x5c\xff\xd7\x00\ +\xdb\x00]\xff\xec\x00\xdb\x00\xbf\xff\xd7\x00\xdb\x017\xff\ +\xd7\x00\xdb\x01<\xff\xec\x00\xdb\x01>\xff\xec\x00\xdb\x01\ +@\xff\xec\x00\xdb\x01\xfb\xff\xd7\x00\xdb\x01\xfd\xff\xd7\x00\ +\xdb\x02\x07\xff\xec\x00\xdb\x02\x0b\xff\xec\x00\xdb\x03p\xff\ +\xd7\x00\xdc\x00-\x00{\x00\xdd\x00\x05\xff\xec\x00\xdd\x00\ +\x0a\xff\xec\x00\xdd\x00Y\xff\xd7\x00\xdd\x00Z\xff\xd7\x00\ +\xdd\x00[\xff\xd7\x00\xdd\x00\x5c\xff\xd7\x00\xdd\x00]\xff\ +\xec\x00\xdd\x00\xbf\xff\xd7\x00\xdd\x017\xff\xd7\x00\xdd\x01\ +<\xff\xec\x00\xdd\x01>\xff\xec\x00\xdd\x01@\xff\xec\x00\ +\xdd\x01\xfb\xff\xd7\x00\xdd\x01\xfd\xff\xd7\x00\xdd\x02\x07\xff\ +\xec\x00\xdd\x02\x0b\xff\xec\x00\xdd\x03p\xff\xd7\x00\xe7\x00\ +\x05\xff\xec\x00\xe7\x00\x0a\xff\xec\x00\xe7\x02\x07\xff\xec\x00\ +\xe7\x02\x0b\xff\xec\x00\xf8\x00&\xff\xd7\x00\xf8\x00*\xff\ +\xd7\x00\xf8\x002\xff\xd7\x00\xf8\x004\xff\xd7\x00\xf8\x00\ +\x89\xff\xd7\x00\xf8\x00\x94\xff\xd7\x00\xf8\x00\x95\xff\xd7\x00\ +\xf8\x00\x96\xff\xd7\x00\xf8\x00\x97\xff\xd7\x00\xf8\x00\x98\xff\ +\xd7\x00\xf8\x00\x9a\xff\xd7\x00\xf8\x00\xc8\xff\xd7\x00\xf8\x00\ +\xca\xff\xd7\x00\xf8\x00\xcc\xff\xd7\x00\xf8\x00\xce\xff\xd7\x00\ +\xf8\x00\xde\xff\xd7\x00\xf8\x00\xe0\xff\xd7\x00\xf8\x00\xe2\xff\ +\xd7\x00\xf8\x00\xe4\xff\xd7\x00\xf8\x01\x0e\xff\xd7\x00\xf8\x01\ +\x10\xff\xd7\x00\xf8\x01\x12\xff\xd7\x00\xf8\x01\x14\xff\xd7\x00\ +\xf8\x01G\xff\xd7\x00\xf8\x02_\xff\xd7\x00\xf8\x03I\xff\ +\xd7\x00\xf8\x03K\xff\xd7\x00\xf8\x03M\xff\xd7\x00\xf8\x03\ +O\xff\xd7\x00\xf8\x03Q\xff\xd7\x00\xf8\x03S\xff\xd7\x00\ +\xf8\x03U\xff\xd7\x00\xf8\x03W\xff\xd7\x00\xf8\x03Y\xff\ +\xd7\x00\xf8\x03[\xff\xd7\x00\xf8\x03]\xff\xd7\x00\xf8\x03\ +_\xff\xd7\x00\xf9\x00F\xff\xd7\x00\xf9\x00G\xff\xd7\x00\ +\xf9\x00H\xff\xd7\x00\xf9\x00R\xff\xd7\x00\xf9\x00T\xff\ +\xd7\x00\xf9\x00\xa2\xff\xd7\x00\xf9\x00\xa9\xff\xd7\x00\xf9\x00\ +\xaa\xff\xd7\x00\xf9\x00\xab\xff\xd7\x00\xf9\x00\xac\xff\xd7\x00\ +\xf9\x00\xad\xff\xd7\x00\xf9\x00\xb4\xff\xd7\x00\xf9\x00\xb5\xff\ +\xd7\x00\xf9\x00\xb6\xff\xd7\x00\xf9\x00\xb7\xff\xd7\x00\xf9\x00\ +\xb8\xff\xd7\x00\xf9\x00\xba\xff\xd7\x00\xf9\x00\xc9\xff\xd7\x00\ +\xf9\x00\xcb\xff\xd7\x00\xf9\x00\xcd\xff\xd7\x00\xf9\x00\xcf\xff\ +\xd7\x00\xf9\x00\xd1\xff\xd7\x00\xf9\x00\xd3\xff\xd7\x00\xf9\x00\ +\xd5\xff\xd7\x00\xf9\x00\xd7\xff\xd7\x00\xf9\x00\xd9\xff\xd7\x00\ +\xf9\x00\xdb\xff\xd7\x00\xf9\x00\xdd\xff\xd7\x00\xf9\x01\x0f\xff\ +\xd7\x00\xf9\x01\x11\xff\xd7\x00\xf9\x01\x13\xff\xd7\x00\xf9\x01\ +\x15\xff\xd7\x00\xf9\x01H\xff\xd7\x00\xf9\x02`\xff\xd7\x00\ +\xf9\x036\xff\xd7\x00\xf9\x038\xff\xd7\x00\xf9\x03:\xff\ +\xd7\x00\xf9\x03<\xff\xd7\x00\xf9\x03@\xff\xd7\x00\xf9\x03\ +B\xff\xd7\x00\xf9\x03D\xff\xd7\x00\xf9\x03J\xff\xd7\x00\ +\xf9\x03L\xff\xd7\x00\xf9\x03N\xff\xd7\x00\xf9\x03R\xff\ +\xd7\x00\xf9\x03T\xff\xd7\x00\xf9\x03V\xff\xd7\x00\xf9\x03\ +X\xff\xd7\x00\xf9\x03Z\xff\xd7\x00\xf9\x03\x5c\xff\xd7\x00\ +\xf9\x03^\xff\xd7\x00\xf9\x03`\xff\xd7\x00\xfa\x00F\xff\ +\xd7\x00\xfa\x00G\xff\xd7\x00\xfa\x00H\xff\xd7\x00\xfa\x00\ +R\xff\xd7\x00\xfa\x00T\xff\xd7\x00\xfa\x00\xa2\xff\xd7\x00\ +\xfa\x00\xa9\xff\xd7\x00\xfa\x00\xaa\xff\xd7\x00\xfa\x00\xab\xff\ +\xd7\x00\xfa\x00\xac\xff\xd7\x00\xfa\x00\xad\xff\xd7\x00\xfa\x00\ +\xb4\xff\xd7\x00\xfa\x00\xb5\xff\xd7\x00\xfa\x00\xb6\xff\xd7\x00\ +\xfa\x00\xb7\xff\xd7\x00\xfa\x00\xb8\xff\xd7\x00\xfa\x00\xba\xff\ +\xd7\x00\xfa\x00\xc9\xff\xd7\x00\xfa\x00\xcb\xff\xd7\x00\xfa\x00\ +\xcd\xff\xd7\x00\xfa\x00\xcf\xff\xd7\x00\xfa\x00\xd1\xff\xd7\x00\ +\xfa\x00\xd3\xff\xd7\x00\xfa\x00\xd5\xff\xd7\x00\xfa\x00\xd7\xff\ +\xd7\x00\xfa\x00\xd9\xff\xd7\x00\xfa\x00\xdb\xff\xd7\x00\xfa\x00\ +\xdd\xff\xd7\x00\xfa\x01\x0f\xff\xd7\x00\xfa\x01\x11\xff\xd7\x00\ +\xfa\x01\x13\xff\xd7\x00\xfa\x01\x15\xff\xd7\x00\xfa\x01H\xff\ +\xd7\x00\xfa\x02`\xff\xd7\x00\xfa\x036\xff\xd7\x00\xfa\x03\ +8\xff\xd7\x00\xfa\x03:\xff\xd7\x00\xfa\x03<\xff\xd7\x00\ +\xfa\x03@\xff\xd7\x00\xfa\x03B\xff\xd7\x00\xfa\x03D\xff\ +\xd7\x00\xfa\x03J\xff\xd7\x00\xfa\x03L\xff\xd7\x00\xfa\x03\ +N\xff\xd7\x00\xfa\x03R\xff\xd7\x00\xfa\x03T\xff\xd7\x00\ +\xfa\x03V\xff\xd7\x00\xfa\x03X\xff\xd7\x00\xfa\x03Z\xff\ +\xd7\x00\xfa\x03\x5c\xff\xd7\x00\xfa\x03^\xff\xd7\x00\xfa\x03\ +`\xff\xd7\x00\xfb\x00\x05\xff\x5c\x00\xfb\x00\x0a\xff\x5c\x00\ +\xfb\x00&\xff\xd7\x00\xfb\x00*\xff\xd7\x00\xfb\x002\xff\ +\xd7\x00\xfb\x004\xff\xd7\x00\xfb\x007\xff\xd7\x00\xfb\x00\ +8\xff\xec\x00\xfb\x009\xff\xd7\x00\xfb\x00:\xff\xd7\x00\ +\xfb\x00<\xff\xc3\x00\xfb\x00\x89\xff\xd7\x00\xfb\x00\x94\xff\ +\xd7\x00\xfb\x00\x95\xff\xd7\x00\xfb\x00\x96\xff\xd7\x00\xfb\x00\ +\x97\xff\xd7\x00\xfb\x00\x98\xff\xd7\x00\xfb\x00\x9a\xff\xd7\x00\ +\xfb\x00\x9b\xff\xec\x00\xfb\x00\x9c\xff\xec\x00\xfb\x00\x9d\xff\ +\xec\x00\xfb\x00\x9e\xff\xec\x00\xfb\x00\x9f\xff\xc3\x00\xfb\x00\ +\xc8\xff\xd7\x00\xfb\x00\xca\xff\xd7\x00\xfb\x00\xcc\xff\xd7\x00\ +\xfb\x00\xce\xff\xd7\x00\xfb\x00\xde\xff\xd7\x00\xfb\x00\xe0\xff\ +\xd7\x00\xfb\x00\xe2\xff\xd7\x00\xfb\x00\xe4\xff\xd7\x00\xfb\x01\ +\x0e\xff\xd7\x00\xfb\x01\x10\xff\xd7\x00\xfb\x01\x12\xff\xd7\x00\ +\xfb\x01\x14\xff\xd7\x00\xfb\x01$\xff\xd7\x00\xfb\x01&\xff\ +\xd7\x00\xfb\x01*\xff\xec\x00\xfb\x01,\xff\xec\x00\xfb\x01\ +.\xff\xec\x00\xfb\x010\xff\xec\x00\xfb\x012\xff\xec\x00\ +\xfb\x014\xff\xec\x00\xfb\x016\xff\xd7\x00\xfb\x018\xff\ +\xc3\x00\xfb\x01:\xff\xc3\x00\xfb\x01G\xff\xd7\x00\xfb\x01\ +\xfa\xff\xd7\x00\xfb\x01\xfc\xff\xd7\x00\xfb\x01\xfe\xff\xd7\x00\ +\xfb\x02\x00\xff\xc3\x00\xfb\x02\x07\xff\x5c\x00\xfb\x02\x0b\xff\ +\x5c\x00\xfb\x02_\xff\xd7\x00\xfb\x02a\xff\xec\x00\xfb\x03\ +I\xff\xd7\x00\xfb\x03K\xff\xd7\x00\xfb\x03M\xff\xd7\x00\ +\xfb\x03O\xff\xd7\x00\xfb\x03Q\xff\xd7\x00\xfb\x03S\xff\ +\xd7\x00\xfb\x03U\xff\xd7\x00\xfb\x03W\xff\xd7\x00\xfb\x03\ +Y\xff\xd7\x00\xfb\x03[\xff\xd7\x00\xfb\x03]\xff\xd7\x00\ +\xfb\x03_\xff\xd7\x00\xfb\x03a\xff\xec\x00\xfb\x03c\xff\ +\xec\x00\xfb\x03e\xff\xec\x00\xfb\x03g\xff\xec\x00\xfb\x03\ +i\xff\xec\x00\xfb\x03k\xff\xec\x00\xfb\x03m\xff\xec\x00\ +\xfb\x03o\xff\xc3\x00\xfb\x03q\xff\xc3\x00\xfb\x03s\xff\ +\xc3\x00\xfb\x03\x8f\xff\xd7\x00\xfd\x00\x05\xff\x5c\x00\xfd\x00\ +\x0a\xff\x5c\x00\xfd\x00&\xff\xd7\x00\xfd\x00*\xff\xd7\x00\ +\xfd\x002\xff\xd7\x00\xfd\x004\xff\xd7\x00\xfd\x007\xff\ +\xd7\x00\xfd\x008\xff\xec\x00\xfd\x009\xff\xd7\x00\xfd\x00\ +:\xff\xd7\x00\xfd\x00<\xff\xc3\x00\xfd\x00\x89\xff\xd7\x00\ +\xfd\x00\x94\xff\xd7\x00\xfd\x00\x95\xff\xd7\x00\xfd\x00\x96\xff\ +\xd7\x00\xfd\x00\x97\xff\xd7\x00\xfd\x00\x98\xff\xd7\x00\xfd\x00\ +\x9a\xff\xd7\x00\xfd\x00\x9b\xff\xec\x00\xfd\x00\x9c\xff\xec\x00\ +\xfd\x00\x9d\xff\xec\x00\xfd\x00\x9e\xff\xec\x00\xfd\x00\x9f\xff\ +\xc3\x00\xfd\x00\xc8\xff\xd7\x00\xfd\x00\xca\xff\xd7\x00\xfd\x00\ +\xcc\xff\xd7\x00\xfd\x00\xce\xff\xd7\x00\xfd\x00\xde\xff\xd7\x00\ +\xfd\x00\xe0\xff\xd7\x00\xfd\x00\xe2\xff\xd7\x00\xfd\x00\xe4\xff\ +\xd7\x00\xfd\x01\x0e\xff\xd7\x00\xfd\x01\x10\xff\xd7\x00\xfd\x01\ +\x12\xff\xd7\x00\xfd\x01\x14\xff\xd7\x00\xfd\x01$\xff\xd7\x00\ +\xfd\x01&\xff\xd7\x00\xfd\x01*\xff\xec\x00\xfd\x01,\xff\ +\xec\x00\xfd\x01.\xff\xec\x00\xfd\x010\xff\xec\x00\xfd\x01\ +2\xff\xec\x00\xfd\x014\xff\xec\x00\xfd\x016\xff\xd7\x00\ +\xfd\x018\xff\xc3\x00\xfd\x01:\xff\xc3\x00\xfd\x01G\xff\ +\xd7\x00\xfd\x01\xfa\xff\xd7\x00\xfd\x01\xfc\xff\xd7\x00\xfd\x01\ +\xfe\xff\xd7\x00\xfd\x02\x00\xff\xc3\x00\xfd\x02\x07\xff\x5c\x00\ +\xfd\x02\x0b\xff\x5c\x00\xfd\x02_\xff\xd7\x00\xfd\x02a\xff\ +\xec\x00\xfd\x03I\xff\xd7\x00\xfd\x03K\xff\xd7\x00\xfd\x03\ +M\xff\xd7\x00\xfd\x03O\xff\xd7\x00\xfd\x03Q\xff\xd7\x00\ +\xfd\x03S\xff\xd7\x00\xfd\x03U\xff\xd7\x00\xfd\x03W\xff\ +\xd7\x00\xfd\x03Y\xff\xd7\x00\xfd\x03[\xff\xd7\x00\xfd\x03\ +]\xff\xd7\x00\xfd\x03_\xff\xd7\x00\xfd\x03a\xff\xec\x00\ +\xfd\x03c\xff\xec\x00\xfd\x03e\xff\xec\x00\xfd\x03g\xff\ +\xec\x00\xfd\x03i\xff\xec\x00\xfd\x03k\xff\xec\x00\xfd\x03\ +m\xff\xec\x00\xfd\x03o\xff\xc3\x00\xfd\x03q\xff\xc3\x00\ +\xfd\x03s\xff\xc3\x00\xfd\x03\x8f\xff\xd7\x00\xff\x00\x05\xff\ +\x5c\x00\xff\x00\x0a\xff\x5c\x00\xff\x00&\xff\xd7\x00\xff\x00\ +*\xff\xd7\x00\xff\x002\xff\xd7\x00\xff\x004\xff\xd7\x00\ +\xff\x007\xff\xd7\x00\xff\x008\xff\xec\x00\xff\x009\xff\ +\xd7\x00\xff\x00:\xff\xd7\x00\xff\x00<\xff\xc3\x00\xff\x00\ +\x89\xff\xd7\x00\xff\x00\x94\xff\xd7\x00\xff\x00\x95\xff\xd7\x00\ +\xff\x00\x96\xff\xd7\x00\xff\x00\x97\xff\xd7\x00\xff\x00\x98\xff\ +\xd7\x00\xff\x00\x9a\xff\xd7\x00\xff\x00\x9b\xff\xec\x00\xff\x00\ +\x9c\xff\xec\x00\xff\x00\x9d\xff\xec\x00\xff\x00\x9e\xff\xec\x00\ +\xff\x00\x9f\xff\xc3\x00\xff\x00\xc8\xff\xd7\x00\xff\x00\xca\xff\ +\xd7\x00\xff\x00\xcc\xff\xd7\x00\xff\x00\xce\xff\xd7\x00\xff\x00\ +\xde\xff\xd7\x00\xff\x00\xe0\xff\xd7\x00\xff\x00\xe2\xff\xd7\x00\ +\xff\x00\xe4\xff\xd7\x00\xff\x01\x0e\xff\xd7\x00\xff\x01\x10\xff\ +\xd7\x00\xff\x01\x12\xff\xd7\x00\xff\x01\x14\xff\xd7\x00\xff\x01\ +$\xff\xd7\x00\xff\x01&\xff\xd7\x00\xff\x01*\xff\xec\x00\ +\xff\x01,\xff\xec\x00\xff\x01.\xff\xec\x00\xff\x010\xff\ +\xec\x00\xff\x012\xff\xec\x00\xff\x014\xff\xec\x00\xff\x01\ +6\xff\xd7\x00\xff\x018\xff\xc3\x00\xff\x01:\xff\xc3\x00\ +\xff\x01G\xff\xd7\x00\xff\x01\xfa\xff\xd7\x00\xff\x01\xfc\xff\ +\xd7\x00\xff\x01\xfe\xff\xd7\x00\xff\x02\x00\xff\xc3\x00\xff\x02\ +\x07\xff\x5c\x00\xff\x02\x0b\xff\x5c\x00\xff\x02_\xff\xd7\x00\ +\xff\x02a\xff\xec\x00\xff\x03I\xff\xd7\x00\xff\x03K\xff\ +\xd7\x00\xff\x03M\xff\xd7\x00\xff\x03O\xff\xd7\x00\xff\x03\ +Q\xff\xd7\x00\xff\x03S\xff\xd7\x00\xff\x03U\xff\xd7\x00\ +\xff\x03W\xff\xd7\x00\xff\x03Y\xff\xd7\x00\xff\x03[\xff\ +\xd7\x00\xff\x03]\xff\xd7\x00\xff\x03_\xff\xd7\x00\xff\x03\ +a\xff\xec\x00\xff\x03c\xff\xec\x00\xff\x03e\xff\xec\x00\ +\xff\x03g\xff\xec\x00\xff\x03i\xff\xec\x00\xff\x03k\xff\ +\xec\x00\xff\x03m\xff\xec\x00\xff\x03o\xff\xc3\x00\xff\x03\ +q\xff\xc3\x00\xff\x03s\xff\xc3\x00\xff\x03\x8f\xff\xd7\x01\ +\x00\x00\x05\x00R\x01\x00\x00\x0a\x00R\x01\x00\x00\x0c\x00\ +\x8f\x01\x00\x00\x22\x00\x8f\x01\x00\x00@\x00\x8f\x01\x00\x00\ +E\x00=\x01\x00\x00K\x00=\x01\x00\x00N\x00=\x01\ +\x00\x00O\x00=\x01\x00\x00`\x00\x8f\x01\x00\x00\xe7\x00\ +=\x01\x00\x00\xe9\x00\x8f\x01\x00\x02\x07\x00R\x01\x00\x02\ +\x0b\x00R\x01\x01\x00\x05\xff\x5c\x01\x01\x00\x0a\xff\x5c\x01\ +\x01\x00&\xff\xd7\x01\x01\x00*\xff\xd7\x01\x01\x002\xff\ +\xd7\x01\x01\x004\xff\xd7\x01\x01\x007\xff\xd7\x01\x01\x00\ +8\xff\xec\x01\x01\x009\xff\xd7\x01\x01\x00:\xff\xd7\x01\ +\x01\x00<\xff\xc3\x01\x01\x00\x89\xff\xd7\x01\x01\x00\x94\xff\ +\xd7\x01\x01\x00\x95\xff\xd7\x01\x01\x00\x96\xff\xd7\x01\x01\x00\ +\x97\xff\xd7\x01\x01\x00\x98\xff\xd7\x01\x01\x00\x9a\xff\xd7\x01\ +\x01\x00\x9b\xff\xec\x01\x01\x00\x9c\xff\xec\x01\x01\x00\x9d\xff\ +\xec\x01\x01\x00\x9e\xff\xec\x01\x01\x00\x9f\xff\xc3\x01\x01\x00\ +\xc8\xff\xd7\x01\x01\x00\xca\xff\xd7\x01\x01\x00\xcc\xff\xd7\x01\ +\x01\x00\xce\xff\xd7\x01\x01\x00\xde\xff\xd7\x01\x01\x00\xe0\xff\ +\xd7\x01\x01\x00\xe2\xff\xd7\x01\x01\x00\xe4\xff\xd7\x01\x01\x01\ +\x0e\xff\xd7\x01\x01\x01\x10\xff\xd7\x01\x01\x01\x12\xff\xd7\x01\ +\x01\x01\x14\xff\xd7\x01\x01\x01$\xff\xd7\x01\x01\x01&\xff\ +\xd7\x01\x01\x01*\xff\xec\x01\x01\x01,\xff\xec\x01\x01\x01\ +.\xff\xec\x01\x01\x010\xff\xec\x01\x01\x012\xff\xec\x01\ +\x01\x014\xff\xec\x01\x01\x016\xff\xd7\x01\x01\x018\xff\ +\xc3\x01\x01\x01:\xff\xc3\x01\x01\x01G\xff\xd7\x01\x01\x01\ +\xfa\xff\xd7\x01\x01\x01\xfc\xff\xd7\x01\x01\x01\xfe\xff\xd7\x01\ +\x01\x02\x00\xff\xc3\x01\x01\x02\x07\xff\x5c\x01\x01\x02\x0b\xff\ +\x5c\x01\x01\x02_\xff\xd7\x01\x01\x02a\xff\xec\x01\x01\x03\ +I\xff\xd7\x01\x01\x03K\xff\xd7\x01\x01\x03M\xff\xd7\x01\ +\x01\x03O\xff\xd7\x01\x01\x03Q\xff\xd7\x01\x01\x03S\xff\ +\xd7\x01\x01\x03U\xff\xd7\x01\x01\x03W\xff\xd7\x01\x01\x03\ +Y\xff\xd7\x01\x01\x03[\xff\xd7\x01\x01\x03]\xff\xd7\x01\ +\x01\x03_\xff\xd7\x01\x01\x03a\xff\xec\x01\x01\x03c\xff\ +\xec\x01\x01\x03e\xff\xec\x01\x01\x03g\xff\xec\x01\x01\x03\ +i\xff\xec\x01\x01\x03k\xff\xec\x01\x01\x03m\xff\xec\x01\ +\x01\x03o\xff\xc3\x01\x01\x03q\xff\xc3\x01\x01\x03s\xff\ +\xc3\x01\x01\x03\x8f\xff\xd7\x01\x03\x00\x05\xff\x5c\x01\x03\x00\ +\x0a\xff\x5c\x01\x03\x00&\xff\xd7\x01\x03\x00*\xff\xd7\x01\ +\x03\x002\xff\xd7\x01\x03\x004\xff\xd7\x01\x03\x007\xff\ +\xd7\x01\x03\x008\xff\xec\x01\x03\x009\xff\xd7\x01\x03\x00\ +:\xff\xd7\x01\x03\x00<\xff\xc3\x01\x03\x00\x89\xff\xd7\x01\ +\x03\x00\x94\xff\xd7\x01\x03\x00\x95\xff\xd7\x01\x03\x00\x96\xff\ +\xd7\x01\x03\x00\x97\xff\xd7\x01\x03\x00\x98\xff\xd7\x01\x03\x00\ +\x9a\xff\xd7\x01\x03\x00\x9b\xff\xec\x01\x03\x00\x9c\xff\xec\x01\ +\x03\x00\x9d\xff\xec\x01\x03\x00\x9e\xff\xec\x01\x03\x00\x9f\xff\ +\xc3\x01\x03\x00\xc8\xff\xd7\x01\x03\x00\xca\xff\xd7\x01\x03\x00\ +\xcc\xff\xd7\x01\x03\x00\xce\xff\xd7\x01\x03\x00\xde\xff\xd7\x01\ +\x03\x00\xe0\xff\xd7\x01\x03\x00\xe2\xff\xd7\x01\x03\x00\xe4\xff\ +\xd7\x01\x03\x01\x0e\xff\xd7\x01\x03\x01\x10\xff\xd7\x01\x03\x01\ +\x12\xff\xd7\x01\x03\x01\x14\xff\xd7\x01\x03\x01$\xff\xd7\x01\ +\x03\x01&\xff\xd7\x01\x03\x01*\xff\xec\x01\x03\x01,\xff\ +\xec\x01\x03\x01.\xff\xec\x01\x03\x010\xff\xec\x01\x03\x01\ +2\xff\xec\x01\x03\x014\xff\xec\x01\x03\x016\xff\xd7\x01\ +\x03\x018\xff\xc3\x01\x03\x01:\xff\xc3\x01\x03\x01G\xff\ +\xd7\x01\x03\x01\xfa\xff\xd7\x01\x03\x01\xfc\xff\xd7\x01\x03\x01\ +\xfe\xff\xd7\x01\x03\x02\x00\xff\xc3\x01\x03\x02\x07\xff\x5c\x01\ +\x03\x02\x0b\xff\x5c\x01\x03\x02_\xff\xd7\x01\x03\x02a\xff\ +\xec\x01\x03\x03I\xff\xd7\x01\x03\x03K\xff\xd7\x01\x03\x03\ +M\xff\xd7\x01\x03\x03O\xff\xd7\x01\x03\x03Q\xff\xd7\x01\ +\x03\x03S\xff\xd7\x01\x03\x03U\xff\xd7\x01\x03\x03W\xff\ +\xd7\x01\x03\x03Y\xff\xd7\x01\x03\x03[\xff\xd7\x01\x03\x03\ +]\xff\xd7\x01\x03\x03_\xff\xd7\x01\x03\x03a\xff\xec\x01\ +\x03\x03c\xff\xec\x01\x03\x03e\xff\xec\x01\x03\x03g\xff\ +\xec\x01\x03\x03i\xff\xec\x01\x03\x03k\xff\xec\x01\x03\x03\ +m\xff\xec\x01\x03\x03o\xff\xc3\x01\x03\x03q\xff\xc3\x01\ +\x03\x03s\xff\xc3\x01\x03\x03\x8f\xff\xd7\x01\x08\x00\x05\xff\ +\xec\x01\x08\x00\x0a\xff\xec\x01\x08\x02\x07\xff\xec\x01\x08\x02\ +\x0b\xff\xec\x01\x0e\x00\x0f\xff\xae\x01\x0e\x00\x11\xff\xae\x01\ +\x0e\x00$\xff\xd7\x01\x0e\x007\xff\xc3\x01\x0e\x009\xff\ +\xec\x01\x0e\x00:\xff\xec\x01\x0e\x00;\xff\xd7\x01\x0e\x00\ +<\xff\xec\x01\x0e\x00=\xff\xec\x01\x0e\x00\x82\xff\xd7\x01\ +\x0e\x00\x83\xff\xd7\x01\x0e\x00\x84\xff\xd7\x01\x0e\x00\x85\xff\ +\xd7\x01\x0e\x00\x86\xff\xd7\x01\x0e\x00\x87\xff\xd7\x01\x0e\x00\ +\x9f\xff\xec\x01\x0e\x00\xc2\xff\xd7\x01\x0e\x00\xc4\xff\xd7\x01\ +\x0e\x00\xc6\xff\xd7\x01\x0e\x01$\xff\xc3\x01\x0e\x01&\xff\ +\xc3\x01\x0e\x016\xff\xec\x01\x0e\x018\xff\xec\x01\x0e\x01\ +:\xff\xec\x01\x0e\x01;\xff\xec\x01\x0e\x01=\xff\xec\x01\ +\x0e\x01?\xff\xec\x01\x0e\x01C\xff\xd7\x01\x0e\x01\xa0\xff\ +\xec\x01\x0e\x01\xfa\xff\xec\x01\x0e\x01\xfc\xff\xec\x01\x0e\x01\ +\xfe\xff\xec\x01\x0e\x02\x00\xff\xec\x01\x0e\x02\x08\xff\xae\x01\ +\x0e\x02\x0c\xff\xae\x01\x0e\x02X\xff\xd7\x01\x0e\x03\x1d\xff\ +\xd7\x01\x0e\x03\x1f\xff\xd7\x01\x0e\x03!\xff\xd7\x01\x0e\x03\ +#\xff\xd7\x01\x0e\x03%\xff\xd7\x01\x0e\x03'\xff\xd7\x01\ +\x0e\x03)\xff\xd7\x01\x0e\x03+\xff\xd7\x01\x0e\x03-\xff\ +\xd7\x01\x0e\x03/\xff\xd7\x01\x0e\x031\xff\xd7\x01\x0e\x03\ +3\xff\xd7\x01\x0e\x03o\xff\xec\x01\x0e\x03q\xff\xec\x01\ +\x0e\x03s\xff\xec\x01\x0e\x03\x8f\xff\xc3\x01\x10\x00\x0f\xff\ +\xae\x01\x10\x00\x11\xff\xae\x01\x10\x00$\xff\xd7\x01\x10\x00\ +7\xff\xc3\x01\x10\x009\xff\xec\x01\x10\x00:\xff\xec\x01\ +\x10\x00;\xff\xd7\x01\x10\x00<\xff\xec\x01\x10\x00=\xff\ +\xec\x01\x10\x00\x82\xff\xd7\x01\x10\x00\x83\xff\xd7\x01\x10\x00\ +\x84\xff\xd7\x01\x10\x00\x85\xff\xd7\x01\x10\x00\x86\xff\xd7\x01\ +\x10\x00\x87\xff\xd7\x01\x10\x00\x9f\xff\xec\x01\x10\x00\xc2\xff\ +\xd7\x01\x10\x00\xc4\xff\xd7\x01\x10\x00\xc6\xff\xd7\x01\x10\x01\ +$\xff\xc3\x01\x10\x01&\xff\xc3\x01\x10\x016\xff\xec\x01\ +\x10\x018\xff\xec\x01\x10\x01:\xff\xec\x01\x10\x01;\xff\ +\xec\x01\x10\x01=\xff\xec\x01\x10\x01?\xff\xec\x01\x10\x01\ +C\xff\xd7\x01\x10\x01\xa0\xff\xec\x01\x10\x01\xfa\xff\xec\x01\ +\x10\x01\xfc\xff\xec\x01\x10\x01\xfe\xff\xec\x01\x10\x02\x00\xff\ +\xec\x01\x10\x02\x08\xff\xae\x01\x10\x02\x0c\xff\xae\x01\x10\x02\ +X\xff\xd7\x01\x10\x03\x1d\xff\xd7\x01\x10\x03\x1f\xff\xd7\x01\ +\x10\x03!\xff\xd7\x01\x10\x03#\xff\xd7\x01\x10\x03%\xff\ +\xd7\x01\x10\x03'\xff\xd7\x01\x10\x03)\xff\xd7\x01\x10\x03\ ++\xff\xd7\x01\x10\x03-\xff\xd7\x01\x10\x03/\xff\xd7\x01\ +\x10\x031\xff\xd7\x01\x10\x033\xff\xd7\x01\x10\x03o\xff\ +\xec\x01\x10\x03q\xff\xec\x01\x10\x03s\xff\xec\x01\x10\x03\ +\x8f\xff\xc3\x01\x12\x00\x0f\xff\xae\x01\x12\x00\x11\xff\xae\x01\ +\x12\x00$\xff\xd7\x01\x12\x007\xff\xc3\x01\x12\x009\xff\ +\xec\x01\x12\x00:\xff\xec\x01\x12\x00;\xff\xd7\x01\x12\x00\ +<\xff\xec\x01\x12\x00=\xff\xec\x01\x12\x00\x82\xff\xd7\x01\ +\x12\x00\x83\xff\xd7\x01\x12\x00\x84\xff\xd7\x01\x12\x00\x85\xff\ +\xd7\x01\x12\x00\x86\xff\xd7\x01\x12\x00\x87\xff\xd7\x01\x12\x00\ +\x9f\xff\xec\x01\x12\x00\xc2\xff\xd7\x01\x12\x00\xc4\xff\xd7\x01\ +\x12\x00\xc6\xff\xd7\x01\x12\x01$\xff\xc3\x01\x12\x01&\xff\ +\xc3\x01\x12\x016\xff\xec\x01\x12\x018\xff\xec\x01\x12\x01\ +:\xff\xec\x01\x12\x01;\xff\xec\x01\x12\x01=\xff\xec\x01\ +\x12\x01?\xff\xec\x01\x12\x01C\xff\xd7\x01\x12\x01\xa0\xff\ +\xec\x01\x12\x01\xfa\xff\xec\x01\x12\x01\xfc\xff\xec\x01\x12\x01\ +\xfe\xff\xec\x01\x12\x02\x00\xff\xec\x01\x12\x02\x08\xff\xae\x01\ +\x12\x02\x0c\xff\xae\x01\x12\x02X\xff\xd7\x01\x12\x03\x1d\xff\ +\xd7\x01\x12\x03\x1f\xff\xd7\x01\x12\x03!\xff\xd7\x01\x12\x03\ +#\xff\xd7\x01\x12\x03%\xff\xd7\x01\x12\x03'\xff\xd7\x01\ +\x12\x03)\xff\xd7\x01\x12\x03+\xff\xd7\x01\x12\x03-\xff\ +\xd7\x01\x12\x03/\xff\xd7\x01\x12\x031\xff\xd7\x01\x12\x03\ +3\xff\xd7\x01\x12\x03o\xff\xec\x01\x12\x03q\xff\xec\x01\ +\x12\x03s\xff\xec\x01\x12\x03\x8f\xff\xc3\x01\x14\x00-\x00\ +{\x01\x17\x00\x05\x00R\x01\x17\x00\x0a\x00R\x01\x17\x00\ +D\xff\xd7\x01\x17\x00F\xff\xd7\x01\x17\x00G\xff\xd7\x01\ +\x17\x00H\xff\xd7\x01\x17\x00J\xff\xec\x01\x17\x00R\xff\ +\xd7\x01\x17\x00T\xff\xd7\x01\x17\x00\xa2\xff\xd7\x01\x17\x00\ +\xa3\xff\xd7\x01\x17\x00\xa4\xff\xd7\x01\x17\x00\xa5\xff\xd7\x01\ +\x17\x00\xa6\xff\xd7\x01\x17\x00\xa7\xff\xd7\x01\x17\x00\xa8\xff\ +\xd7\x01\x17\x00\xa9\xff\xd7\x01\x17\x00\xaa\xff\xd7\x01\x17\x00\ +\xab\xff\xd7\x01\x17\x00\xac\xff\xd7\x01\x17\x00\xad\xff\xd7\x01\ +\x17\x00\xb4\xff\xd7\x01\x17\x00\xb5\xff\xd7\x01\x17\x00\xb6\xff\ +\xd7\x01\x17\x00\xb7\xff\xd7\x01\x17\x00\xb8\xff\xd7\x01\x17\x00\ +\xba\xff\xd7\x01\x17\x00\xc3\xff\xd7\x01\x17\x00\xc5\xff\xd7\x01\ +\x17\x00\xc7\xff\xd7\x01\x17\x00\xc9\xff\xd7\x01\x17\x00\xcb\xff\ +\xd7\x01\x17\x00\xcd\xff\xd7\x01\x17\x00\xcf\xff\xd7\x01\x17\x00\ +\xd1\xff\xd7\x01\x17\x00\xd3\xff\xd7\x01\x17\x00\xd5\xff\xd7\x01\ +\x17\x00\xd7\xff\xd7\x01\x17\x00\xd9\xff\xd7\x01\x17\x00\xdb\xff\ +\xd7\x01\x17\x00\xdd\xff\xd7\x01\x17\x00\xdf\xff\xec\x01\x17\x00\ +\xe1\xff\xec\x01\x17\x00\xe3\xff\xec\x01\x17\x00\xe5\xff\xec\x01\ +\x17\x01\x0f\xff\xd7\x01\x17\x01\x11\xff\xd7\x01\x17\x01\x13\xff\ +\xd7\x01\x17\x01\x15\xff\xd7\x01\x17\x01D\xff\xd7\x01\x17\x01\ +F\xff\xd7\x01\x17\x01H\xff\xd7\x01\x17\x02\x07\x00R\x01\ +\x17\x02\x0b\x00R\x01\x17\x02Y\xff\xd7\x01\x17\x02`\xff\ +\xd7\x01\x17\x03\x1e\xff\xd7\x01\x17\x03 \xff\xd7\x01\x17\x03\ +\x22\xff\xd7\x01\x17\x03&\xff\xd7\x01\x17\x03(\xff\xd7\x01\ +\x17\x03*\xff\xd7\x01\x17\x03,\xff\xd7\x01\x17\x03.\xff\ +\xd7\x01\x17\x030\xff\xd7\x01\x17\x032\xff\xd7\x01\x17\x03\ +4\xff\xd7\x01\x17\x036\xff\xd7\x01\x17\x038\xff\xd7\x01\ +\x17\x03:\xff\xd7\x01\x17\x03<\xff\xd7\x01\x17\x03@\xff\ +\xd7\x01\x17\x03B\xff\xd7\x01\x17\x03D\xff\xd7\x01\x17\x03\ +J\xff\xd7\x01\x17\x03L\xff\xd7\x01\x17\x03N\xff\xd7\x01\ +\x17\x03R\xff\xd7\x01\x17\x03T\xff\xd7\x01\x17\x03V\xff\ +\xd7\x01\x17\x03X\xff\xd7\x01\x17\x03Z\xff\xd7\x01\x17\x03\ +\x5c\xff\xd7\x01\x17\x03^\xff\xd7\x01\x17\x03`\xff\xd7\x01\ +\x19\x00\x05\x00R\x01\x19\x00\x0a\x00R\x01\x19\x00D\xff\ +\xd7\x01\x19\x00F\xff\xd7\x01\x19\x00G\xff\xd7\x01\x19\x00\ +H\xff\xd7\x01\x19\x00J\xff\xec\x01\x19\x00R\xff\xd7\x01\ +\x19\x00T\xff\xd7\x01\x19\x00\xa2\xff\xd7\x01\x19\x00\xa3\xff\ +\xd7\x01\x19\x00\xa4\xff\xd7\x01\x19\x00\xa5\xff\xd7\x01\x19\x00\ +\xa6\xff\xd7\x01\x19\x00\xa7\xff\xd7\x01\x19\x00\xa8\xff\xd7\x01\ +\x19\x00\xa9\xff\xd7\x01\x19\x00\xaa\xff\xd7\x01\x19\x00\xab\xff\ +\xd7\x01\x19\x00\xac\xff\xd7\x01\x19\x00\xad\xff\xd7\x01\x19\x00\ +\xb4\xff\xd7\x01\x19\x00\xb5\xff\xd7\x01\x19\x00\xb6\xff\xd7\x01\ +\x19\x00\xb7\xff\xd7\x01\x19\x00\xb8\xff\xd7\x01\x19\x00\xba\xff\ +\xd7\x01\x19\x00\xc3\xff\xd7\x01\x19\x00\xc5\xff\xd7\x01\x19\x00\ +\xc7\xff\xd7\x01\x19\x00\xc9\xff\xd7\x01\x19\x00\xcb\xff\xd7\x01\ +\x19\x00\xcd\xff\xd7\x01\x19\x00\xcf\xff\xd7\x01\x19\x00\xd1\xff\ +\xd7\x01\x19\x00\xd3\xff\xd7\x01\x19\x00\xd5\xff\xd7\x01\x19\x00\ +\xd7\xff\xd7\x01\x19\x00\xd9\xff\xd7\x01\x19\x00\xdb\xff\xd7\x01\ +\x19\x00\xdd\xff\xd7\x01\x19\x00\xdf\xff\xec\x01\x19\x00\xe1\xff\ +\xec\x01\x19\x00\xe3\xff\xec\x01\x19\x00\xe5\xff\xec\x01\x19\x01\ +\x0f\xff\xd7\x01\x19\x01\x11\xff\xd7\x01\x19\x01\x13\xff\xd7\x01\ +\x19\x01\x15\xff\xd7\x01\x19\x01D\xff\xd7\x01\x19\x01F\xff\ +\xd7\x01\x19\x01H\xff\xd7\x01\x19\x02\x07\x00R\x01\x19\x02\ +\x0b\x00R\x01\x19\x02Y\xff\xd7\x01\x19\x02`\xff\xd7\x01\ +\x19\x03\x1e\xff\xd7\x01\x19\x03 \xff\xd7\x01\x19\x03\x22\xff\ +\xd7\x01\x19\x03&\xff\xd7\x01\x19\x03(\xff\xd7\x01\x19\x03\ +*\xff\xd7\x01\x19\x03,\xff\xd7\x01\x19\x03.\xff\xd7\x01\ +\x19\x030\xff\xd7\x01\x19\x032\xff\xd7\x01\x19\x034\xff\ +\xd7\x01\x19\x036\xff\xd7\x01\x19\x038\xff\xd7\x01\x19\x03\ +:\xff\xd7\x01\x19\x03<\xff\xd7\x01\x19\x03@\xff\xd7\x01\ +\x19\x03B\xff\xd7\x01\x19\x03D\xff\xd7\x01\x19\x03J\xff\ +\xd7\x01\x19\x03L\xff\xd7\x01\x19\x03N\xff\xd7\x01\x19\x03\ +R\xff\xd7\x01\x19\x03T\xff\xd7\x01\x19\x03V\xff\xd7\x01\ +\x19\x03X\xff\xd7\x01\x19\x03Z\xff\xd7\x01\x19\x03\x5c\xff\ +\xd7\x01\x19\x03^\xff\xd7\x01\x19\x03`\xff\xd7\x01\x1b\x00\ +\x05\x00R\x01\x1b\x00\x0a\x00R\x01\x1b\x00D\xff\xd7\x01\ +\x1b\x00F\xff\xd7\x01\x1b\x00G\xff\xd7\x01\x1b\x00H\xff\ +\xd7\x01\x1b\x00J\xff\xec\x01\x1b\x00R\xff\xd7\x01\x1b\x00\ +T\xff\xd7\x01\x1b\x00\xa2\xff\xd7\x01\x1b\x00\xa3\xff\xd7\x01\ +\x1b\x00\xa4\xff\xd7\x01\x1b\x00\xa5\xff\xd7\x01\x1b\x00\xa6\xff\ +\xd7\x01\x1b\x00\xa7\xff\xd7\x01\x1b\x00\xa8\xff\xd7\x01\x1b\x00\ +\xa9\xff\xd7\x01\x1b\x00\xaa\xff\xd7\x01\x1b\x00\xab\xff\xd7\x01\ +\x1b\x00\xac\xff\xd7\x01\x1b\x00\xad\xff\xd7\x01\x1b\x00\xb4\xff\ +\xd7\x01\x1b\x00\xb5\xff\xd7\x01\x1b\x00\xb6\xff\xd7\x01\x1b\x00\ +\xb7\xff\xd7\x01\x1b\x00\xb8\xff\xd7\x01\x1b\x00\xba\xff\xd7\x01\ +\x1b\x00\xc3\xff\xd7\x01\x1b\x00\xc5\xff\xd7\x01\x1b\x00\xc7\xff\ +\xd7\x01\x1b\x00\xc9\xff\xd7\x01\x1b\x00\xcb\xff\xd7\x01\x1b\x00\ +\xcd\xff\xd7\x01\x1b\x00\xcf\xff\xd7\x01\x1b\x00\xd1\xff\xd7\x01\ +\x1b\x00\xd3\xff\xd7\x01\x1b\x00\xd5\xff\xd7\x01\x1b\x00\xd7\xff\ +\xd7\x01\x1b\x00\xd9\xff\xd7\x01\x1b\x00\xdb\xff\xd7\x01\x1b\x00\ +\xdd\xff\xd7\x01\x1b\x00\xdf\xff\xec\x01\x1b\x00\xe1\xff\xec\x01\ +\x1b\x00\xe3\xff\xec\x01\x1b\x00\xe5\xff\xec\x01\x1b\x01\x0f\xff\ +\xd7\x01\x1b\x01\x11\xff\xd7\x01\x1b\x01\x13\xff\xd7\x01\x1b\x01\ +\x15\xff\xd7\x01\x1b\x01D\xff\xd7\x01\x1b\x01F\xff\xd7\x01\ +\x1b\x01H\xff\xd7\x01\x1b\x02\x07\x00R\x01\x1b\x02\x0b\x00\ +R\x01\x1b\x02Y\xff\xd7\x01\x1b\x02`\xff\xd7\x01\x1b\x03\ +\x1e\xff\xd7\x01\x1b\x03 \xff\xd7\x01\x1b\x03\x22\xff\xd7\x01\ +\x1b\x03&\xff\xd7\x01\x1b\x03(\xff\xd7\x01\x1b\x03*\xff\ +\xd7\x01\x1b\x03,\xff\xd7\x01\x1b\x03.\xff\xd7\x01\x1b\x03\ +0\xff\xd7\x01\x1b\x032\xff\xd7\x01\x1b\x034\xff\xd7\x01\ +\x1b\x036\xff\xd7\x01\x1b\x038\xff\xd7\x01\x1b\x03:\xff\ +\xd7\x01\x1b\x03<\xff\xd7\x01\x1b\x03@\xff\xd7\x01\x1b\x03\ +B\xff\xd7\x01\x1b\x03D\xff\xd7\x01\x1b\x03J\xff\xd7\x01\ +\x1b\x03L\xff\xd7\x01\x1b\x03N\xff\xd7\x01\x1b\x03R\xff\ +\xd7\x01\x1b\x03T\xff\xd7\x01\x1b\x03V\xff\xd7\x01\x1b\x03\ +X\xff\xd7\x01\x1b\x03Z\xff\xd7\x01\x1b\x03\x5c\xff\xd7\x01\ +\x1b\x03^\xff\xd7\x01\x1b\x03`\xff\xd7\x01$\x00\x0f\xff\ +\x85\x01$\x00\x10\xff\xae\x01$\x00\x11\xff\x85\x01$\x00\ +\x22\x00)\x01$\x00$\xffq\x01$\x00&\xff\xd7\x01\ +$\x00*\xff\xd7\x01$\x002\xff\xd7\x01$\x004\xff\ +\xd7\x01$\x007\x00)\x01$\x00D\xff\x5c\x01$\x00\ +F\xffq\x01$\x00G\xffq\x01$\x00H\xffq\x01\ +$\x00J\xffq\x01$\x00P\xff\x9a\x01$\x00Q\xff\ +\x9a\x01$\x00R\xffq\x01$\x00S\xff\x9a\x01$\x00\ +T\xffq\x01$\x00U\xff\x9a\x01$\x00V\xff\x85\x01\ +$\x00X\xff\x9a\x01$\x00Y\xff\xd7\x01$\x00Z\xff\ +\xd7\x01$\x00[\xff\xd7\x01$\x00\x5c\xff\xd7\x01$\x00\ +]\xff\xae\x01$\x00\x82\xffq\x01$\x00\x83\xffq\x01\ +$\x00\x84\xffq\x01$\x00\x85\xffq\x01$\x00\x86\xff\ +q\x01$\x00\x87\xffq\x01$\x00\x89\xff\xd7\x01$\x00\ +\x94\xff\xd7\x01$\x00\x95\xff\xd7\x01$\x00\x96\xff\xd7\x01\ +$\x00\x97\xff\xd7\x01$\x00\x98\xff\xd7\x01$\x00\x9a\xff\ +\xd7\x01$\x00\xa2\xffq\x01$\x00\xa3\xff\x5c\x01$\x00\ +\xa4\xff\x5c\x01$\x00\xa5\xff\x5c\x01$\x00\xa6\xff\x5c\x01\ +$\x00\xa7\xff\x5c\x01$\x00\xa8\xff\x5c\x01$\x00\xa9\xff\ +q\x01$\x00\xaa\xffq\x01$\x00\xab\xffq\x01$\x00\ +\xac\xffq\x01$\x00\xad\xffq\x01$\x00\xb4\xffq\x01\ +$\x00\xb5\xffq\x01$\x00\xb6\xffq\x01$\x00\xb7\xff\ +q\x01$\x00\xb8\xffq\x01$\x00\xba\xffq\x01$\x00\ +\xbb\xff\x9a\x01$\x00\xbc\xff\x9a\x01$\x00\xbd\xff\x9a\x01\ +$\x00\xbe\xff\x9a\x01$\x00\xbf\xff\xd7\x01$\x00\xc2\xff\ +q\x01$\x00\xc3\xff\x5c\x01$\x00\xc4\xffq\x01$\x00\ +\xc5\xff\x5c\x01$\x00\xc6\xffq\x01$\x00\xc7\xff\x5c\x01\ +$\x00\xc8\xff\xd7\x01$\x00\xc9\xffq\x01$\x00\xca\xff\ +\xd7\x01$\x00\xcb\xffq\x01$\x00\xcc\xff\xd7\x01$\x00\ +\xcd\xffq\x01$\x00\xce\xff\xd7\x01$\x00\xcf\xffq\x01\ +$\x00\xd1\xffq\x01$\x00\xd3\xffq\x01$\x00\xd5\xff\ +q\x01$\x00\xd7\xffq\x01$\x00\xd9\xffq\x01$\x00\ +\xdb\xffq\x01$\x00\xdd\xffq\x01$\x00\xde\xff\xd7\x01\ +$\x00\xdf\xffq\x01$\x00\xe0\xff\xd7\x01$\x00\xe1\xff\ +q\x01$\x00\xe2\xff\xd7\x01$\x00\xe3\xffq\x01$\x00\ +\xe4\xff\xd7\x01$\x00\xe5\xffq\x01$\x00\xfa\xff\x9a\x01\ +$\x01\x06\xff\x9a\x01$\x01\x08\xff\x9a\x01$\x01\x0d\xff\ +\x9a\x01$\x01\x0e\xff\xd7\x01$\x01\x0f\xffq\x01$\x01\ +\x10\xff\xd7\x01$\x01\x11\xffq\x01$\x01\x12\xff\xd7\x01\ +$\x01\x13\xffq\x01$\x01\x14\xff\xd7\x01$\x01\x15\xff\ +q\x01$\x01\x17\xff\x9a\x01$\x01\x19\xff\x9a\x01$\x01\ +\x1d\xff\x85\x01$\x01!\xff\x85\x01$\x01$\x00)\x01\ +$\x01&\x00)\x01$\x01+\xff\x9a\x01$\x01-\xff\ +\x9a\x01$\x01/\xff\x9a\x01$\x011\xff\x9a\x01$\x01\ +3\xff\x9a\x01$\x015\xff\x9a\x01$\x017\xff\xd7\x01\ +$\x01<\xff\xae\x01$\x01>\xff\xae\x01$\x01@\xff\ +\xae\x01$\x01C\xffq\x01$\x01D\xff\x5c\x01$\x01\ +F\xff\x5c\x01$\x01G\xff\xd7\x01$\x01H\xffq\x01\ +$\x01J\xff\x85\x01$\x01\xfb\xff\xd7\x01$\x01\xfd\xff\ +\xd7\x01$\x02\x02\xff\xae\x01$\x02\x03\xff\xae\x01$\x02\ +\x04\xff\xae\x01$\x02\x08\xff\x85\x01$\x02\x0c\xff\x85\x01\ +$\x02W\xff\x9a\x01$\x02X\xffq\x01$\x02Y\xff\ +\x5c\x01$\x02_\xff\xd7\x01$\x02`\xffq\x01$\x02\ +b\xff\x9a\x01$\x03\x1d\xffq\x01$\x03\x1e\xff\x5c\x01\ +$\x03\x1f\xffq\x01$\x03 \xff\x5c\x01$\x03!\xff\ +q\x01$\x03\x22\xff\x5c\x01$\x03#\xffq\x01$\x03\ +%\xffq\x01$\x03&\xff\x5c\x01$\x03'\xffq\x01\ +$\x03(\xff\x5c\x01$\x03)\xffq\x01$\x03*\xff\ +\x5c\x01$\x03+\xffq\x01$\x03,\xff\x5c\x01$\x03\ +-\xffq\x01$\x03.\xff\x5c\x01$\x03/\xffq\x01\ +$\x030\xff\x5c\x01$\x031\xffq\x01$\x032\xff\ +\x5c\x01$\x033\xffq\x01$\x034\xff\x5c\x01$\x03\ +6\xffq\x01$\x038\xffq\x01$\x03:\xffq\x01\ +$\x03<\xffq\x01$\x03@\xffq\x01$\x03B\xff\ +q\x01$\x03D\xffq\x01$\x03I\xff\xd7\x01$\x03\ +J\xffq\x01$\x03K\xff\xd7\x01$\x03L\xffq\x01\ +$\x03M\xff\xd7\x01$\x03N\xffq\x01$\x03O\xff\ +\xd7\x01$\x03Q\xff\xd7\x01$\x03R\xffq\x01$\x03\ +S\xff\xd7\x01$\x03T\xffq\x01$\x03U\xff\xd7\x01\ +$\x03V\xffq\x01$\x03W\xff\xd7\x01$\x03X\xff\ +q\x01$\x03Y\xff\xd7\x01$\x03Z\xffq\x01$\x03\ +[\xff\xd7\x01$\x03\x5c\xffq\x01$\x03]\xff\xd7\x01\ +$\x03^\xffq\x01$\x03_\xff\xd7\x01$\x03`\xff\ +q\x01$\x03b\xff\x9a\x01$\x03d\xff\x9a\x01$\x03\ +f\xff\x9a\x01$\x03h\xff\x9a\x01$\x03j\xff\x9a\x01\ +$\x03l\xff\x9a\x01$\x03n\xff\x9a\x01$\x03p\xff\ +\xd7\x01$\x03\x8f\x00)\x01%\x00\x05\x00)\x01%\x00\ +\x0a\x00)\x01%\x02\x07\x00)\x01%\x02\x0b\x00)\x01\ +&\x00\x0f\xff\x85\x01&\x00\x10\xff\xae\x01&\x00\x11\xff\ +\x85\x01&\x00\x22\x00)\x01&\x00$\xffq\x01&\x00\ +&\xff\xd7\x01&\x00*\xff\xd7\x01&\x002\xff\xd7\x01\ +&\x004\xff\xd7\x01&\x007\x00)\x01&\x00D\xff\ +\x5c\x01&\x00F\xffq\x01&\x00G\xffq\x01&\x00\ +H\xffq\x01&\x00J\xffq\x01&\x00P\xff\x9a\x01\ +&\x00Q\xff\x9a\x01&\x00R\xffq\x01&\x00S\xff\ +\x9a\x01&\x00T\xffq\x01&\x00U\xff\x9a\x01&\x00\ +V\xff\x85\x01&\x00X\xff\x9a\x01&\x00Y\xff\xd7\x01\ +&\x00Z\xff\xd7\x01&\x00[\xff\xd7\x01&\x00\x5c\xff\ +\xd7\x01&\x00]\xff\xae\x01&\x00\x82\xffq\x01&\x00\ +\x83\xffq\x01&\x00\x84\xffq\x01&\x00\x85\xffq\x01\ +&\x00\x86\xffq\x01&\x00\x87\xffq\x01&\x00\x89\xff\ +\xd7\x01&\x00\x94\xff\xd7\x01&\x00\x95\xff\xd7\x01&\x00\ +\x96\xff\xd7\x01&\x00\x97\xff\xd7\x01&\x00\x98\xff\xd7\x01\ +&\x00\x9a\xff\xd7\x01&\x00\xa2\xffq\x01&\x00\xa3\xff\ +\x5c\x01&\x00\xa4\xff\x5c\x01&\x00\xa5\xff\x5c\x01&\x00\ +\xa6\xff\x5c\x01&\x00\xa7\xff\x5c\x01&\x00\xa8\xff\x5c\x01\ +&\x00\xa9\xffq\x01&\x00\xaa\xffq\x01&\x00\xab\xff\ +q\x01&\x00\xac\xffq\x01&\x00\xad\xffq\x01&\x00\ +\xb4\xffq\x01&\x00\xb5\xffq\x01&\x00\xb6\xffq\x01\ +&\x00\xb7\xffq\x01&\x00\xb8\xffq\x01&\x00\xba\xff\ +q\x01&\x00\xbb\xff\x9a\x01&\x00\xbc\xff\x9a\x01&\x00\ +\xbd\xff\x9a\x01&\x00\xbe\xff\x9a\x01&\x00\xbf\xff\xd7\x01\ +&\x00\xc2\xffq\x01&\x00\xc3\xff\x5c\x01&\x00\xc4\xff\ +q\x01&\x00\xc5\xff\x5c\x01&\x00\xc6\xffq\x01&\x00\ +\xc7\xff\x5c\x01&\x00\xc8\xff\xd7\x01&\x00\xc9\xffq\x01\ +&\x00\xca\xff\xd7\x01&\x00\xcb\xffq\x01&\x00\xcc\xff\ +\xd7\x01&\x00\xcd\xffq\x01&\x00\xce\xff\xd7\x01&\x00\ +\xcf\xffq\x01&\x00\xd1\xffq\x01&\x00\xd3\xffq\x01\ +&\x00\xd5\xffq\x01&\x00\xd7\xffq\x01&\x00\xd9\xff\ +q\x01&\x00\xdb\xffq\x01&\x00\xdd\xffq\x01&\x00\ +\xde\xff\xd7\x01&\x00\xdf\xffq\x01&\x00\xe0\xff\xd7\x01\ +&\x00\xe1\xffq\x01&\x00\xe2\xff\xd7\x01&\x00\xe3\xff\ +q\x01&\x00\xe4\xff\xd7\x01&\x00\xe5\xffq\x01&\x00\ +\xfa\xff\x9a\x01&\x01\x06\xff\x9a\x01&\x01\x08\xff\x9a\x01\ +&\x01\x0d\xff\x9a\x01&\x01\x0e\xff\xd7\x01&\x01\x0f\xff\ +q\x01&\x01\x10\xff\xd7\x01&\x01\x11\xffq\x01&\x01\ +\x12\xff\xd7\x01&\x01\x13\xffq\x01&\x01\x14\xff\xd7\x01\ +&\x01\x15\xffq\x01&\x01\x17\xff\x9a\x01&\x01\x19\xff\ +\x9a\x01&\x01\x1d\xff\x85\x01&\x01!\xff\x85\x01&\x01\ +$\x00)\x01&\x01&\x00)\x01&\x01+\xff\x9a\x01\ +&\x01-\xff\x9a\x01&\x01/\xff\x9a\x01&\x011\xff\ +\x9a\x01&\x013\xff\x9a\x01&\x015\xff\x9a\x01&\x01\ +7\xff\xd7\x01&\x01<\xff\xae\x01&\x01>\xff\xae\x01\ +&\x01@\xff\xae\x01&\x01C\xffq\x01&\x01D\xff\ +\x5c\x01&\x01F\xff\x5c\x01&\x01G\xff\xd7\x01&\x01\ +H\xffq\x01&\x01J\xff\x85\x01&\x01\xfb\xff\xd7\x01\ +&\x01\xfd\xff\xd7\x01&\x02\x02\xff\xae\x01&\x02\x03\xff\ +\xae\x01&\x02\x04\xff\xae\x01&\x02\x08\xff\x85\x01&\x02\ +\x0c\xff\x85\x01&\x02W\xff\x9a\x01&\x02X\xffq\x01\ +&\x02Y\xff\x5c\x01&\x02_\xff\xd7\x01&\x02`\xff\ +q\x01&\x02b\xff\x9a\x01&\x03\x1d\xffq\x01&\x03\ +\x1e\xff\x5c\x01&\x03\x1f\xffq\x01&\x03 \xff\x5c\x01\ +&\x03!\xffq\x01&\x03\x22\xff\x5c\x01&\x03#\xff\ +q\x01&\x03%\xffq\x01&\x03&\xff\x5c\x01&\x03\ +'\xffq\x01&\x03(\xff\x5c\x01&\x03)\xffq\x01\ +&\x03*\xff\x5c\x01&\x03+\xffq\x01&\x03,\xff\ +\x5c\x01&\x03-\xffq\x01&\x03.\xff\x5c\x01&\x03\ +/\xffq\x01&\x030\xff\x5c\x01&\x031\xffq\x01\ +&\x032\xff\x5c\x01&\x033\xffq\x01&\x034\xff\ +\x5c\x01&\x036\xffq\x01&\x038\xffq\x01&\x03\ +:\xffq\x01&\x03<\xffq\x01&\x03@\xffq\x01\ +&\x03B\xffq\x01&\x03D\xffq\x01&\x03I\xff\ +\xd7\x01&\x03J\xffq\x01&\x03K\xff\xd7\x01&\x03\ +L\xffq\x01&\x03M\xff\xd7\x01&\x03N\xffq\x01\ +&\x03O\xff\xd7\x01&\x03Q\xff\xd7\x01&\x03R\xff\ +q\x01&\x03S\xff\xd7\x01&\x03T\xffq\x01&\x03\ +U\xff\xd7\x01&\x03V\xffq\x01&\x03W\xff\xd7\x01\ +&\x03X\xffq\x01&\x03Y\xff\xd7\x01&\x03Z\xff\ +q\x01&\x03[\xff\xd7\x01&\x03\x5c\xffq\x01&\x03\ +]\xff\xd7\x01&\x03^\xffq\x01&\x03_\xff\xd7\x01\ +&\x03`\xffq\x01&\x03b\xff\x9a\x01&\x03d\xff\ +\x9a\x01&\x03f\xff\x9a\x01&\x03h\xff\x9a\x01&\x03\ +j\xff\x9a\x01&\x03l\xff\x9a\x01&\x03n\xff\x9a\x01\ +&\x03p\xff\xd7\x01&\x03\x8f\x00)\x01'\x00\x05\x00\ +)\x01'\x00\x0a\x00)\x01'\x02\x07\x00)\x01'\x02\ +\x0b\x00)\x01(\x00\x0f\xff\x85\x01(\x00\x10\xff\xae\x01\ +(\x00\x11\xff\x85\x01(\x00\x22\x00)\x01(\x00$\xff\ +q\x01(\x00&\xff\xd7\x01(\x00*\xff\xd7\x01(\x00\ +2\xff\xd7\x01(\x004\xff\xd7\x01(\x007\x00)\x01\ +(\x00D\xff\x5c\x01(\x00F\xffq\x01(\x00G\xff\ +q\x01(\x00H\xffq\x01(\x00J\xffq\x01(\x00\ +P\xff\x9a\x01(\x00Q\xff\x9a\x01(\x00R\xffq\x01\ +(\x00S\xff\x9a\x01(\x00T\xffq\x01(\x00U\xff\ +\x9a\x01(\x00V\xff\x85\x01(\x00X\xff\x9a\x01(\x00\ +Y\xff\xd7\x01(\x00Z\xff\xd7\x01(\x00[\xff\xd7\x01\ +(\x00\x5c\xff\xd7\x01(\x00]\xff\xae\x01(\x00\x82\xff\ +q\x01(\x00\x83\xffq\x01(\x00\x84\xffq\x01(\x00\ +\x85\xffq\x01(\x00\x86\xffq\x01(\x00\x87\xffq\x01\ +(\x00\x89\xff\xd7\x01(\x00\x94\xff\xd7\x01(\x00\x95\xff\ +\xd7\x01(\x00\x96\xff\xd7\x01(\x00\x97\xff\xd7\x01(\x00\ +\x98\xff\xd7\x01(\x00\x9a\xff\xd7\x01(\x00\xa2\xffq\x01\ +(\x00\xa3\xff\x5c\x01(\x00\xa4\xff\x5c\x01(\x00\xa5\xff\ +\x5c\x01(\x00\xa6\xff\x5c\x01(\x00\xa7\xff\x5c\x01(\x00\ +\xa8\xff\x5c\x01(\x00\xa9\xffq\x01(\x00\xaa\xffq\x01\ +(\x00\xab\xffq\x01(\x00\xac\xffq\x01(\x00\xad\xff\ +q\x01(\x00\xb4\xffq\x01(\x00\xb5\xffq\x01(\x00\ +\xb6\xffq\x01(\x00\xb7\xffq\x01(\x00\xb8\xffq\x01\ +(\x00\xba\xffq\x01(\x00\xbb\xff\x9a\x01(\x00\xbc\xff\ +\x9a\x01(\x00\xbd\xff\x9a\x01(\x00\xbe\xff\x9a\x01(\x00\ +\xbf\xff\xd7\x01(\x00\xc2\xffq\x01(\x00\xc3\xff\x5c\x01\ +(\x00\xc4\xffq\x01(\x00\xc5\xff\x5c\x01(\x00\xc6\xff\ +q\x01(\x00\xc7\xff\x5c\x01(\x00\xc8\xff\xd7\x01(\x00\ +\xc9\xffq\x01(\x00\xca\xff\xd7\x01(\x00\xcb\xffq\x01\ +(\x00\xcc\xff\xd7\x01(\x00\xcd\xffq\x01(\x00\xce\xff\ +\xd7\x01(\x00\xcf\xffq\x01(\x00\xd1\xffq\x01(\x00\ +\xd3\xffq\x01(\x00\xd5\xffq\x01(\x00\xd7\xffq\x01\ +(\x00\xd9\xffq\x01(\x00\xdb\xffq\x01(\x00\xdd\xff\ +q\x01(\x00\xde\xff\xd7\x01(\x00\xdf\xffq\x01(\x00\ +\xe0\xff\xd7\x01(\x00\xe1\xffq\x01(\x00\xe2\xff\xd7\x01\ +(\x00\xe3\xffq\x01(\x00\xe4\xff\xd7\x01(\x00\xe5\xff\ +q\x01(\x00\xfa\xff\x9a\x01(\x01\x06\xff\x9a\x01(\x01\ +\x08\xff\x9a\x01(\x01\x0d\xff\x9a\x01(\x01\x0e\xff\xd7\x01\ +(\x01\x0f\xffq\x01(\x01\x10\xff\xd7\x01(\x01\x11\xff\ +q\x01(\x01\x12\xff\xd7\x01(\x01\x13\xffq\x01(\x01\ +\x14\xff\xd7\x01(\x01\x15\xffq\x01(\x01\x17\xff\x9a\x01\ +(\x01\x19\xff\x9a\x01(\x01\x1d\xff\x85\x01(\x01!\xff\ +\x85\x01(\x01$\x00)\x01(\x01&\x00)\x01(\x01\ ++\xff\x9a\x01(\x01-\xff\x9a\x01(\x01/\xff\x9a\x01\ +(\x011\xff\x9a\x01(\x013\xff\x9a\x01(\x015\xff\ +\x9a\x01(\x017\xff\xd7\x01(\x01<\xff\xae\x01(\x01\ +>\xff\xae\x01(\x01@\xff\xae\x01(\x01C\xffq\x01\ +(\x01D\xff\x5c\x01(\x01F\xff\x5c\x01(\x01G\xff\ +\xd7\x01(\x01H\xffq\x01(\x01J\xff\x85\x01(\x01\ +\xfb\xff\xd7\x01(\x01\xfd\xff\xd7\x01(\x02\x02\xff\xae\x01\ +(\x02\x03\xff\xae\x01(\x02\x04\xff\xae\x01(\x02\x08\xff\ +\x85\x01(\x02\x0c\xff\x85\x01(\x02W\xff\x9a\x01(\x02\ +X\xffq\x01(\x02Y\xff\x5c\x01(\x02_\xff\xd7\x01\ +(\x02`\xffq\x01(\x02b\xff\x9a\x01(\x03\x1d\xff\ +q\x01(\x03\x1e\xff\x5c\x01(\x03\x1f\xffq\x01(\x03\ + \xff\x5c\x01(\x03!\xffq\x01(\x03\x22\xff\x5c\x01\ +(\x03#\xffq\x01(\x03%\xffq\x01(\x03&\xff\ +\x5c\x01(\x03'\xffq\x01(\x03(\xff\x5c\x01(\x03\ +)\xffq\x01(\x03*\xff\x5c\x01(\x03+\xffq\x01\ +(\x03,\xff\x5c\x01(\x03-\xffq\x01(\x03.\xff\ +\x5c\x01(\x03/\xffq\x01(\x030\xff\x5c\x01(\x03\ +1\xffq\x01(\x032\xff\x5c\x01(\x033\xffq\x01\ +(\x034\xff\x5c\x01(\x036\xffq\x01(\x038\xff\ +q\x01(\x03:\xffq\x01(\x03<\xffq\x01(\x03\ +@\xffq\x01(\x03B\xffq\x01(\x03D\xffq\x01\ +(\x03I\xff\xd7\x01(\x03J\xffq\x01(\x03K\xff\ +\xd7\x01(\x03L\xffq\x01(\x03M\xff\xd7\x01(\x03\ +N\xffq\x01(\x03O\xff\xd7\x01(\x03Q\xff\xd7\x01\ +(\x03R\xffq\x01(\x03S\xff\xd7\x01(\x03T\xff\ +q\x01(\x03U\xff\xd7\x01(\x03V\xffq\x01(\x03\ +W\xff\xd7\x01(\x03X\xffq\x01(\x03Y\xff\xd7\x01\ +(\x03Z\xffq\x01(\x03[\xff\xd7\x01(\x03\x5c\xff\ +q\x01(\x03]\xff\xd7\x01(\x03^\xffq\x01(\x03\ +_\xff\xd7\x01(\x03`\xffq\x01(\x03b\xff\x9a\x01\ +(\x03d\xff\x9a\x01(\x03f\xff\x9a\x01(\x03h\xff\ +\x9a\x01(\x03j\xff\x9a\x01(\x03l\xff\x9a\x01(\x03\ +n\xff\x9a\x01(\x03p\xff\xd7\x01(\x03\x8f\x00)\x01\ +*\x00\x0f\xff\xd7\x01*\x00\x11\xff\xd7\x01*\x00$\xff\ +\xec\x01*\x00\x82\xff\xec\x01*\x00\x83\xff\xec\x01*\x00\ +\x84\xff\xec\x01*\x00\x85\xff\xec\x01*\x00\x86\xff\xec\x01\ +*\x00\x87\xff\xec\x01*\x00\xc2\xff\xec\x01*\x00\xc4\xff\ +\xec\x01*\x00\xc6\xff\xec\x01*\x01C\xff\xec\x01*\x02\ +\x08\xff\xd7\x01*\x02\x0c\xff\xd7\x01*\x02X\xff\xec\x01\ +*\x03\x1d\xff\xec\x01*\x03\x1f\xff\xec\x01*\x03!\xff\ +\xec\x01*\x03#\xff\xec\x01*\x03%\xff\xec\x01*\x03\ +'\xff\xec\x01*\x03)\xff\xec\x01*\x03+\xff\xec\x01\ +*\x03-\xff\xec\x01*\x03/\xff\xec\x01*\x031\xff\ +\xec\x01*\x033\xff\xec\x01,\x00\x0f\xff\xd7\x01,\x00\ +\x11\xff\xd7\x01,\x00$\xff\xec\x01,\x00\x82\xff\xec\x01\ +,\x00\x83\xff\xec\x01,\x00\x84\xff\xec\x01,\x00\x85\xff\ +\xec\x01,\x00\x86\xff\xec\x01,\x00\x87\xff\xec\x01,\x00\ +\xc2\xff\xec\x01,\x00\xc4\xff\xec\x01,\x00\xc6\xff\xec\x01\ +,\x01C\xff\xec\x01,\x02\x08\xff\xd7\x01,\x02\x0c\xff\ +\xd7\x01,\x02X\xff\xec\x01,\x03\x1d\xff\xec\x01,\x03\ +\x1f\xff\xec\x01,\x03!\xff\xec\x01,\x03#\xff\xec\x01\ +,\x03%\xff\xec\x01,\x03'\xff\xec\x01,\x03)\xff\ +\xec\x01,\x03+\xff\xec\x01,\x03-\xff\xec\x01,\x03\ +/\xff\xec\x01,\x031\xff\xec\x01,\x033\xff\xec\x01\ +.\x00\x0f\xff\xd7\x01.\x00\x11\xff\xd7\x01.\x00$\xff\ +\xec\x01.\x00\x82\xff\xec\x01.\x00\x83\xff\xec\x01.\x00\ +\x84\xff\xec\x01.\x00\x85\xff\xec\x01.\x00\x86\xff\xec\x01\ +.\x00\x87\xff\xec\x01.\x00\xc2\xff\xec\x01.\x00\xc4\xff\ +\xec\x01.\x00\xc6\xff\xec\x01.\x01C\xff\xec\x01.\x02\ +\x08\xff\xd7\x01.\x02\x0c\xff\xd7\x01.\x02X\xff\xec\x01\ +.\x03\x1d\xff\xec\x01.\x03\x1f\xff\xec\x01.\x03!\xff\ +\xec\x01.\x03#\xff\xec\x01.\x03%\xff\xec\x01.\x03\ +'\xff\xec\x01.\x03)\xff\xec\x01.\x03+\xff\xec\x01\ +.\x03-\xff\xec\x01.\x03/\xff\xec\x01.\x031\xff\ +\xec\x01.\x033\xff\xec\x010\x00\x0f\xff\xd7\x010\x00\ +\x11\xff\xd7\x010\x00$\xff\xec\x010\x00\x82\xff\xec\x01\ +0\x00\x83\xff\xec\x010\x00\x84\xff\xec\x010\x00\x85\xff\ +\xec\x010\x00\x86\xff\xec\x010\x00\x87\xff\xec\x010\x00\ +\xc2\xff\xec\x010\x00\xc4\xff\xec\x010\x00\xc6\xff\xec\x01\ +0\x01C\xff\xec\x010\x02\x08\xff\xd7\x010\x02\x0c\xff\ +\xd7\x010\x02X\xff\xec\x010\x03\x1d\xff\xec\x010\x03\ +\x1f\xff\xec\x010\x03!\xff\xec\x010\x03#\xff\xec\x01\ +0\x03%\xff\xec\x010\x03'\xff\xec\x010\x03)\xff\ +\xec\x010\x03+\xff\xec\x010\x03-\xff\xec\x010\x03\ +/\xff\xec\x010\x031\xff\xec\x010\x033\xff\xec\x01\ +2\x00\x0f\xff\xd7\x012\x00\x11\xff\xd7\x012\x00$\xff\ +\xec\x012\x00\x82\xff\xec\x012\x00\x83\xff\xec\x012\x00\ +\x84\xff\xec\x012\x00\x85\xff\xec\x012\x00\x86\xff\xec\x01\ +2\x00\x87\xff\xec\x012\x00\xc2\xff\xec\x012\x00\xc4\xff\ +\xec\x012\x00\xc6\xff\xec\x012\x01C\xff\xec\x012\x02\ +\x08\xff\xd7\x012\x02\x0c\xff\xd7\x012\x02X\xff\xec\x01\ +2\x03\x1d\xff\xec\x012\x03\x1f\xff\xec\x012\x03!\xff\ +\xec\x012\x03#\xff\xec\x012\x03%\xff\xec\x012\x03\ +'\xff\xec\x012\x03)\xff\xec\x012\x03+\xff\xec\x01\ +2\x03-\xff\xec\x012\x03/\xff\xec\x012\x031\xff\ +\xec\x012\x033\xff\xec\x014\x00\x0f\xff\xd7\x014\x00\ +\x11\xff\xd7\x014\x00$\xff\xec\x014\x00\x82\xff\xec\x01\ +4\x00\x83\xff\xec\x014\x00\x84\xff\xec\x014\x00\x85\xff\ +\xec\x014\x00\x86\xff\xec\x014\x00\x87\xff\xec\x014\x00\ +\xc2\xff\xec\x014\x00\xc4\xff\xec\x014\x00\xc6\xff\xec\x01\ +4\x01C\xff\xec\x014\x02\x08\xff\xd7\x014\x02\x0c\xff\ +\xd7\x014\x02X\xff\xec\x014\x03\x1d\xff\xec\x014\x03\ +\x1f\xff\xec\x014\x03!\xff\xec\x014\x03#\xff\xec\x01\ +4\x03%\xff\xec\x014\x03'\xff\xec\x014\x03)\xff\ +\xec\x014\x03+\xff\xec\x014\x03-\xff\xec\x014\x03\ +/\xff\xec\x014\x031\xff\xec\x014\x033\xff\xec\x01\ +6\x00\x0f\xff\x9a\x016\x00\x11\xff\x9a\x016\x00\x22\x00\ +)\x016\x00$\xff\xae\x016\x00&\xff\xec\x016\x00\ +*\xff\xec\x016\x002\xff\xec\x016\x004\xff\xec\x01\ +6\x00D\xff\xd7\x016\x00F\xff\xd7\x016\x00G\xff\ +\xd7\x016\x00H\xff\xd7\x016\x00J\xff\xec\x016\x00\ +P\xff\xec\x016\x00Q\xff\xec\x016\x00R\xff\xd7\x01\ +6\x00S\xff\xec\x016\x00T\xff\xd7\x016\x00U\xff\ +\xec\x016\x00V\xff\xec\x016\x00X\xff\xec\x016\x00\ +\x82\xff\xae\x016\x00\x83\xff\xae\x016\x00\x84\xff\xae\x01\ +6\x00\x85\xff\xae\x016\x00\x86\xff\xae\x016\x00\x87\xff\ +\xae\x016\x00\x89\xff\xec\x016\x00\x94\xff\xec\x016\x00\ +\x95\xff\xec\x016\x00\x96\xff\xec\x016\x00\x97\xff\xec\x01\ +6\x00\x98\xff\xec\x016\x00\x9a\xff\xec\x016\x00\xa2\xff\ +\xd7\x016\x00\xa3\xff\xd7\x016\x00\xa4\xff\xd7\x016\x00\ +\xa5\xff\xd7\x016\x00\xa6\xff\xd7\x016\x00\xa7\xff\xd7\x01\ +6\x00\xa8\xff\xd7\x016\x00\xa9\xff\xd7\x016\x00\xaa\xff\ +\xd7\x016\x00\xab\xff\xd7\x016\x00\xac\xff\xd7\x016\x00\ +\xad\xff\xd7\x016\x00\xb4\xff\xd7\x016\x00\xb5\xff\xd7\x01\ +6\x00\xb6\xff\xd7\x016\x00\xb7\xff\xd7\x016\x00\xb8\xff\ +\xd7\x016\x00\xba\xff\xd7\x016\x00\xbb\xff\xec\x016\x00\ +\xbc\xff\xec\x016\x00\xbd\xff\xec\x016\x00\xbe\xff\xec\x01\ +6\x00\xc2\xff\xae\x016\x00\xc3\xff\xd7\x016\x00\xc4\xff\ +\xae\x016\x00\xc5\xff\xd7\x016\x00\xc6\xff\xae\x016\x00\ +\xc7\xff\xd7\x016\x00\xc8\xff\xec\x016\x00\xc9\xff\xd7\x01\ +6\x00\xca\xff\xec\x016\x00\xcb\xff\xd7\x016\x00\xcc\xff\ +\xec\x016\x00\xcd\xff\xd7\x016\x00\xce\xff\xec\x016\x00\ +\xcf\xff\xd7\x016\x00\xd1\xff\xd7\x016\x00\xd3\xff\xd7\x01\ +6\x00\xd5\xff\xd7\x016\x00\xd7\xff\xd7\x016\x00\xd9\xff\ +\xd7\x016\x00\xdb\xff\xd7\x016\x00\xdd\xff\xd7\x016\x00\ +\xde\xff\xec\x016\x00\xdf\xff\xec\x016\x00\xe0\xff\xec\x01\ +6\x00\xe1\xff\xec\x016\x00\xe2\xff\xec\x016\x00\xe3\xff\ +\xec\x016\x00\xe4\xff\xec\x016\x00\xe5\xff\xec\x016\x00\ +\xfa\xff\xec\x016\x01\x06\xff\xec\x016\x01\x08\xff\xec\x01\ +6\x01\x0d\xff\xec\x016\x01\x0e\xff\xec\x016\x01\x0f\xff\ +\xd7\x016\x01\x10\xff\xec\x016\x01\x11\xff\xd7\x016\x01\ +\x12\xff\xec\x016\x01\x13\xff\xd7\x016\x01\x14\xff\xec\x01\ +6\x01\x15\xff\xd7\x016\x01\x17\xff\xec\x016\x01\x19\xff\ +\xec\x016\x01\x1d\xff\xec\x016\x01!\xff\xec\x016\x01\ ++\xff\xec\x016\x01-\xff\xec\x016\x01/\xff\xec\x01\ +6\x011\xff\xec\x016\x013\xff\xec\x016\x015\xff\ +\xec\x016\x01C\xff\xae\x016\x01D\xff\xd7\x016\x01\ +F\xff\xd7\x016\x01G\xff\xec\x016\x01H\xff\xd7\x01\ +6\x01J\xff\xec\x016\x02\x08\xff\x9a\x016\x02\x0c\xff\ +\x9a\x016\x02W\xff\xec\x016\x02X\xff\xae\x016\x02\ +Y\xff\xd7\x016\x02_\xff\xec\x016\x02`\xff\xd7\x01\ +6\x02b\xff\xec\x016\x03\x1d\xff\xae\x016\x03\x1e\xff\ +\xd7\x016\x03\x1f\xff\xae\x016\x03 \xff\xd7\x016\x03\ +!\xff\xae\x016\x03\x22\xff\xd7\x016\x03#\xff\xae\x01\ +6\x03%\xff\xae\x016\x03&\xff\xd7\x016\x03'\xff\ +\xae\x016\x03(\xff\xd7\x016\x03)\xff\xae\x016\x03\ +*\xff\xd7\x016\x03+\xff\xae\x016\x03,\xff\xd7\x01\ +6\x03-\xff\xae\x016\x03.\xff\xd7\x016\x03/\xff\ +\xae\x016\x030\xff\xd7\x016\x031\xff\xae\x016\x03\ +2\xff\xd7\x016\x033\xff\xae\x016\x034\xff\xd7\x01\ +6\x036\xff\xd7\x016\x038\xff\xd7\x016\x03:\xff\ +\xd7\x016\x03<\xff\xd7\x016\x03@\xff\xd7\x016\x03\ +B\xff\xd7\x016\x03D\xff\xd7\x016\x03I\xff\xec\x01\ +6\x03J\xff\xd7\x016\x03K\xff\xec\x016\x03L\xff\ +\xd7\x016\x03M\xff\xec\x016\x03N\xff\xd7\x016\x03\ +O\xff\xec\x016\x03Q\xff\xec\x016\x03R\xff\xd7\x01\ +6\x03S\xff\xec\x016\x03T\xff\xd7\x016\x03U\xff\ +\xec\x016\x03V\xff\xd7\x016\x03W\xff\xec\x016\x03\ +X\xff\xd7\x016\x03Y\xff\xec\x016\x03Z\xff\xd7\x01\ +6\x03[\xff\xec\x016\x03\x5c\xff\xd7\x016\x03]\xff\ +\xec\x016\x03^\xff\xd7\x016\x03_\xff\xec\x016\x03\ +`\xff\xd7\x016\x03b\xff\xec\x016\x03d\xff\xec\x01\ +6\x03f\xff\xec\x016\x03h\xff\xec\x016\x03j\xff\ +\xec\x016\x03l\xff\xec\x016\x03n\xff\xec\x017\x00\ +\x05\x00R\x017\x00\x0a\x00R\x017\x00\x0f\xff\xae\x01\ +7\x00\x11\xff\xae\x017\x00\x22\x00)\x017\x02\x07\x00\ +R\x017\x02\x08\xff\xae\x017\x02\x0b\x00R\x017\x02\ +\x0c\xff\xae\x018\x00\x0f\xff\x85\x018\x00\x11\xff\x85\x01\ +8\x00\x22\x00)\x018\x00$\xff\x85\x018\x00&\xff\ +\xd7\x018\x00*\xff\xd7\x018\x002\xff\xd7\x018\x00\ +4\xff\xd7\x018\x00D\xff\x9a\x018\x00F\xff\x9a\x01\ +8\x00G\xff\x9a\x018\x00H\xff\x9a\x018\x00J\xff\ +\xd7\x018\x00P\xff\xc3\x018\x00Q\xff\xc3\x018\x00\ +R\xff\x9a\x018\x00S\xff\xc3\x018\x00T\xff\x9a\x01\ +8\x00U\xff\xc3\x018\x00V\xff\xae\x018\x00X\xff\ +\xc3\x018\x00]\xff\xd7\x018\x00\x82\xff\x85\x018\x00\ +\x83\xff\x85\x018\x00\x84\xff\x85\x018\x00\x85\xff\x85\x01\ +8\x00\x86\xff\x85\x018\x00\x87\xff\x85\x018\x00\x89\xff\ +\xd7\x018\x00\x94\xff\xd7\x018\x00\x95\xff\xd7\x018\x00\ +\x96\xff\xd7\x018\x00\x97\xff\xd7\x018\x00\x98\xff\xd7\x01\ +8\x00\x9a\xff\xd7\x018\x00\xa2\xff\x9a\x018\x00\xa3\xff\ +\x9a\x018\x00\xa4\xff\x9a\x018\x00\xa5\xff\x9a\x018\x00\ +\xa6\xff\x9a\x018\x00\xa7\xff\x9a\x018\x00\xa8\xff\x9a\x01\ +8\x00\xa9\xff\x9a\x018\x00\xaa\xff\x9a\x018\x00\xab\xff\ +\x9a\x018\x00\xac\xff\x9a\x018\x00\xad\xff\x9a\x018\x00\ +\xb4\xff\x9a\x018\x00\xb5\xff\x9a\x018\x00\xb6\xff\x9a\x01\ +8\x00\xb7\xff\x9a\x018\x00\xb8\xff\x9a\x018\x00\xba\xff\ +\x9a\x018\x00\xbb\xff\xc3\x018\x00\xbc\xff\xc3\x018\x00\ +\xbd\xff\xc3\x018\x00\xbe\xff\xc3\x018\x00\xc2\xff\x85\x01\ +8\x00\xc3\xff\x9a\x018\x00\xc4\xff\x85\x018\x00\xc5\xff\ +\x9a\x018\x00\xc6\xff\x85\x018\x00\xc7\xff\x9a\x018\x00\ +\xc8\xff\xd7\x018\x00\xc9\xff\x9a\x018\x00\xca\xff\xd7\x01\ +8\x00\xcb\xff\x9a\x018\x00\xcc\xff\xd7\x018\x00\xcd\xff\ +\x9a\x018\x00\xce\xff\xd7\x018\x00\xcf\xff\x9a\x018\x00\ +\xd1\xff\x9a\x018\x00\xd3\xff\x9a\x018\x00\xd5\xff\x9a\x01\ +8\x00\xd7\xff\x9a\x018\x00\xd9\xff\x9a\x018\x00\xdb\xff\ +\x9a\x018\x00\xdd\xff\x9a\x018\x00\xde\xff\xd7\x018\x00\ +\xdf\xff\xd7\x018\x00\xe0\xff\xd7\x018\x00\xe1\xff\xd7\x01\ +8\x00\xe2\xff\xd7\x018\x00\xe3\xff\xd7\x018\x00\xe4\xff\ +\xd7\x018\x00\xe5\xff\xd7\x018\x00\xfa\xff\xc3\x018\x01\ +\x06\xff\xc3\x018\x01\x08\xff\xc3\x018\x01\x0d\xff\xc3\x01\ +8\x01\x0e\xff\xd7\x018\x01\x0f\xff\x9a\x018\x01\x10\xff\ +\xd7\x018\x01\x11\xff\x9a\x018\x01\x12\xff\xd7\x018\x01\ +\x13\xff\x9a\x018\x01\x14\xff\xd7\x018\x01\x15\xff\x9a\x01\ +8\x01\x17\xff\xc3\x018\x01\x19\xff\xc3\x018\x01\x1d\xff\ +\xae\x018\x01!\xff\xae\x018\x01+\xff\xc3\x018\x01\ +-\xff\xc3\x018\x01/\xff\xc3\x018\x011\xff\xc3\x01\ +8\x013\xff\xc3\x018\x015\xff\xc3\x018\x01<\xff\ +\xd7\x018\x01>\xff\xd7\x018\x01@\xff\xd7\x018\x01\ +C\xff\x85\x018\x01D\xff\x9a\x018\x01F\xff\x9a\x01\ +8\x01G\xff\xd7\x018\x01H\xff\x9a\x018\x01J\xff\ +\xae\x018\x02\x08\xff\x85\x018\x02\x0c\xff\x85\x018\x02\ +W\xff\xc3\x018\x02X\xff\x85\x018\x02Y\xff\x9a\x01\ +8\x02_\xff\xd7\x018\x02`\xff\x9a\x018\x02b\xff\ +\xc3\x018\x03\x1d\xff\x85\x018\x03\x1e\xff\x9a\x018\x03\ +\x1f\xff\x85\x018\x03 \xff\x9a\x018\x03!\xff\x85\x01\ +8\x03\x22\xff\x9a\x018\x03#\xff\x85\x018\x03%\xff\ +\x85\x018\x03&\xff\x9a\x018\x03'\xff\x85\x018\x03\ +(\xff\x9a\x018\x03)\xff\x85\x018\x03*\xff\x9a\x01\ +8\x03+\xff\x85\x018\x03,\xff\x9a\x018\x03-\xff\ +\x85\x018\x03.\xff\x9a\x018\x03/\xff\x85\x018\x03\ +0\xff\x9a\x018\x031\xff\x85\x018\x032\xff\x9a\x01\ +8\x033\xff\x85\x018\x034\xff\x9a\x018\x036\xff\ +\x9a\x018\x038\xff\x9a\x018\x03:\xff\x9a\x018\x03\ +<\xff\x9a\x018\x03@\xff\x9a\x018\x03B\xff\x9a\x01\ +8\x03D\xff\x9a\x018\x03I\xff\xd7\x018\x03J\xff\ +\x9a\x018\x03K\xff\xd7\x018\x03L\xff\x9a\x018\x03\ +M\xff\xd7\x018\x03N\xff\x9a\x018\x03O\xff\xd7\x01\ +8\x03Q\xff\xd7\x018\x03R\xff\x9a\x018\x03S\xff\ +\xd7\x018\x03T\xff\x9a\x018\x03U\xff\xd7\x018\x03\ +V\xff\x9a\x018\x03W\xff\xd7\x018\x03X\xff\x9a\x01\ +8\x03Y\xff\xd7\x018\x03Z\xff\x9a\x018\x03[\xff\ +\xd7\x018\x03\x5c\xff\x9a\x018\x03]\xff\xd7\x018\x03\ +^\xff\x9a\x018\x03_\xff\xd7\x018\x03`\xff\x9a\x01\ +8\x03b\xff\xc3\x018\x03d\xff\xc3\x018\x03f\xff\ +\xc3\x018\x03h\xff\xc3\x018\x03j\xff\xc3\x018\x03\ +l\xff\xc3\x018\x03n\xff\xc3\x019\x00\x05\x00R\x01\ +9\x00\x0a\x00R\x019\x00\x0f\xff\xae\x019\x00\x11\xff\ +\xae\x019\x00\x22\x00)\x019\x02\x07\x00R\x019\x02\ +\x08\xff\xae\x019\x02\x0b\x00R\x019\x02\x0c\xff\xae\x01\ +:\x00\x0f\xff\x85\x01:\x00\x11\xff\x85\x01:\x00\x22\x00\ +)\x01:\x00$\xff\x85\x01:\x00&\xff\xd7\x01:\x00\ +*\xff\xd7\x01:\x002\xff\xd7\x01:\x004\xff\xd7\x01\ +:\x00D\xff\x9a\x01:\x00F\xff\x9a\x01:\x00G\xff\ +\x9a\x01:\x00H\xff\x9a\x01:\x00J\xff\xd7\x01:\x00\ +P\xff\xc3\x01:\x00Q\xff\xc3\x01:\x00R\xff\x9a\x01\ +:\x00S\xff\xc3\x01:\x00T\xff\x9a\x01:\x00U\xff\ +\xc3\x01:\x00V\xff\xae\x01:\x00X\xff\xc3\x01:\x00\ +]\xff\xd7\x01:\x00\x82\xff\x85\x01:\x00\x83\xff\x85\x01\ +:\x00\x84\xff\x85\x01:\x00\x85\xff\x85\x01:\x00\x86\xff\ +\x85\x01:\x00\x87\xff\x85\x01:\x00\x89\xff\xd7\x01:\x00\ +\x94\xff\xd7\x01:\x00\x95\xff\xd7\x01:\x00\x96\xff\xd7\x01\ +:\x00\x97\xff\xd7\x01:\x00\x98\xff\xd7\x01:\x00\x9a\xff\ +\xd7\x01:\x00\xa2\xff\x9a\x01:\x00\xa3\xff\x9a\x01:\x00\ +\xa4\xff\x9a\x01:\x00\xa5\xff\x9a\x01:\x00\xa6\xff\x9a\x01\ +:\x00\xa7\xff\x9a\x01:\x00\xa8\xff\x9a\x01:\x00\xa9\xff\ +\x9a\x01:\x00\xaa\xff\x9a\x01:\x00\xab\xff\x9a\x01:\x00\ +\xac\xff\x9a\x01:\x00\xad\xff\x9a\x01:\x00\xb4\xff\x9a\x01\ +:\x00\xb5\xff\x9a\x01:\x00\xb6\xff\x9a\x01:\x00\xb7\xff\ +\x9a\x01:\x00\xb8\xff\x9a\x01:\x00\xba\xff\x9a\x01:\x00\ +\xbb\xff\xc3\x01:\x00\xbc\xff\xc3\x01:\x00\xbd\xff\xc3\x01\ +:\x00\xbe\xff\xc3\x01:\x00\xc2\xff\x85\x01:\x00\xc3\xff\ +\x9a\x01:\x00\xc4\xff\x85\x01:\x00\xc5\xff\x9a\x01:\x00\ +\xc6\xff\x85\x01:\x00\xc7\xff\x9a\x01:\x00\xc8\xff\xd7\x01\ +:\x00\xc9\xff\x9a\x01:\x00\xca\xff\xd7\x01:\x00\xcb\xff\ +\x9a\x01:\x00\xcc\xff\xd7\x01:\x00\xcd\xff\x9a\x01:\x00\ +\xce\xff\xd7\x01:\x00\xcf\xff\x9a\x01:\x00\xd1\xff\x9a\x01\ +:\x00\xd3\xff\x9a\x01:\x00\xd5\xff\x9a\x01:\x00\xd7\xff\ +\x9a\x01:\x00\xd9\xff\x9a\x01:\x00\xdb\xff\x9a\x01:\x00\ +\xdd\xff\x9a\x01:\x00\xde\xff\xd7\x01:\x00\xdf\xff\xd7\x01\ +:\x00\xe0\xff\xd7\x01:\x00\xe1\xff\xd7\x01:\x00\xe2\xff\ +\xd7\x01:\x00\xe3\xff\xd7\x01:\x00\xe4\xff\xd7\x01:\x00\ +\xe5\xff\xd7\x01:\x00\xfa\xff\xc3\x01:\x01\x06\xff\xc3\x01\ +:\x01\x08\xff\xc3\x01:\x01\x0d\xff\xc3\x01:\x01\x0e\xff\ +\xd7\x01:\x01\x0f\xff\x9a\x01:\x01\x10\xff\xd7\x01:\x01\ +\x11\xff\x9a\x01:\x01\x12\xff\xd7\x01:\x01\x13\xff\x9a\x01\ +:\x01\x14\xff\xd7\x01:\x01\x15\xff\x9a\x01:\x01\x17\xff\ +\xc3\x01:\x01\x19\xff\xc3\x01:\x01\x1d\xff\xae\x01:\x01\ +!\xff\xae\x01:\x01+\xff\xc3\x01:\x01-\xff\xc3\x01\ +:\x01/\xff\xc3\x01:\x011\xff\xc3\x01:\x013\xff\ +\xc3\x01:\x015\xff\xc3\x01:\x01<\xff\xd7\x01:\x01\ +>\xff\xd7\x01:\x01@\xff\xd7\x01:\x01C\xff\x85\x01\ +:\x01D\xff\x9a\x01:\x01F\xff\x9a\x01:\x01G\xff\ +\xd7\x01:\x01H\xff\x9a\x01:\x01J\xff\xae\x01:\x02\ +\x08\xff\x85\x01:\x02\x0c\xff\x85\x01:\x02W\xff\xc3\x01\ +:\x02X\xff\x85\x01:\x02Y\xff\x9a\x01:\x02_\xff\ +\xd7\x01:\x02`\xff\x9a\x01:\x02b\xff\xc3\x01:\x03\ +\x1d\xff\x85\x01:\x03\x1e\xff\x9a\x01:\x03\x1f\xff\x85\x01\ +:\x03 \xff\x9a\x01:\x03!\xff\x85\x01:\x03\x22\xff\ +\x9a\x01:\x03#\xff\x85\x01:\x03%\xff\x85\x01:\x03\ +&\xff\x9a\x01:\x03'\xff\x85\x01:\x03(\xff\x9a\x01\ +:\x03)\xff\x85\x01:\x03*\xff\x9a\x01:\x03+\xff\ +\x85\x01:\x03,\xff\x9a\x01:\x03-\xff\x85\x01:\x03\ +.\xff\x9a\x01:\x03/\xff\x85\x01:\x030\xff\x9a\x01\ +:\x031\xff\x85\x01:\x032\xff\x9a\x01:\x033\xff\ +\x85\x01:\x034\xff\x9a\x01:\x036\xff\x9a\x01:\x03\ +8\xff\x9a\x01:\x03:\xff\x9a\x01:\x03<\xff\x9a\x01\ +:\x03@\xff\x9a\x01:\x03B\xff\x9a\x01:\x03D\xff\ +\x9a\x01:\x03I\xff\xd7\x01:\x03J\xff\x9a\x01:\x03\ +K\xff\xd7\x01:\x03L\xff\x9a\x01:\x03M\xff\xd7\x01\ +:\x03N\xff\x9a\x01:\x03O\xff\xd7\x01:\x03Q\xff\ +\xd7\x01:\x03R\xff\x9a\x01:\x03S\xff\xd7\x01:\x03\ +T\xff\x9a\x01:\x03U\xff\xd7\x01:\x03V\xff\x9a\x01\ +:\x03W\xff\xd7\x01:\x03X\xff\x9a\x01:\x03Y\xff\ +\xd7\x01:\x03Z\xff\x9a\x01:\x03[\xff\xd7\x01:\x03\ +\x5c\xff\x9a\x01:\x03]\xff\xd7\x01:\x03^\xff\x9a\x01\ +:\x03_\xff\xd7\x01:\x03`\xff\x9a\x01:\x03b\xff\ +\xc3\x01:\x03d\xff\xc3\x01:\x03f\xff\xc3\x01:\x03\ +h\xff\xc3\x01:\x03j\xff\xc3\x01:\x03l\xff\xc3\x01\ +:\x03n\xff\xc3\x01;\x00&\xff\xec\x01;\x00*\xff\ +\xec\x01;\x002\xff\xec\x01;\x004\xff\xec\x01;\x00\ +\x89\xff\xec\x01;\x00\x94\xff\xec\x01;\x00\x95\xff\xec\x01\ +;\x00\x96\xff\xec\x01;\x00\x97\xff\xec\x01;\x00\x98\xff\ +\xec\x01;\x00\x9a\xff\xec\x01;\x00\xc8\xff\xec\x01;\x00\ +\xca\xff\xec\x01;\x00\xcc\xff\xec\x01;\x00\xce\xff\xec\x01\ +;\x00\xde\xff\xec\x01;\x00\xe0\xff\xec\x01;\x00\xe2\xff\ +\xec\x01;\x00\xe4\xff\xec\x01;\x01\x0e\xff\xec\x01;\x01\ +\x10\xff\xec\x01;\x01\x12\xff\xec\x01;\x01\x14\xff\xec\x01\ +;\x01G\xff\xec\x01;\x02_\xff\xec\x01;\x03I\xff\ +\xec\x01;\x03K\xff\xec\x01;\x03M\xff\xec\x01;\x03\ +O\xff\xec\x01;\x03Q\xff\xec\x01;\x03S\xff\xec\x01\ +;\x03U\xff\xec\x01;\x03W\xff\xec\x01;\x03Y\xff\ +\xec\x01;\x03[\xff\xec\x01;\x03]\xff\xec\x01;\x03\ +_\xff\xec\x01=\x00&\xff\xec\x01=\x00*\xff\xec\x01\ +=\x002\xff\xec\x01=\x004\xff\xec\x01=\x00\x89\xff\ +\xec\x01=\x00\x94\xff\xec\x01=\x00\x95\xff\xec\x01=\x00\ +\x96\xff\xec\x01=\x00\x97\xff\xec\x01=\x00\x98\xff\xec\x01\ +=\x00\x9a\xff\xec\x01=\x00\xc8\xff\xec\x01=\x00\xca\xff\ +\xec\x01=\x00\xcc\xff\xec\x01=\x00\xce\xff\xec\x01=\x00\ +\xde\xff\xec\x01=\x00\xe0\xff\xec\x01=\x00\xe2\xff\xec\x01\ +=\x00\xe4\xff\xec\x01=\x01\x0e\xff\xec\x01=\x01\x10\xff\ +\xec\x01=\x01\x12\xff\xec\x01=\x01\x14\xff\xec\x01=\x01\ +G\xff\xec\x01=\x02_\xff\xec\x01=\x03I\xff\xec\x01\ +=\x03K\xff\xec\x01=\x03M\xff\xec\x01=\x03O\xff\ +\xec\x01=\x03Q\xff\xec\x01=\x03S\xff\xec\x01=\x03\ +U\xff\xec\x01=\x03W\xff\xec\x01=\x03Y\xff\xec\x01\ +=\x03[\xff\xec\x01=\x03]\xff\xec\x01=\x03_\xff\ +\xec\x01?\x00&\xff\xec\x01?\x00*\xff\xec\x01?\x00\ +2\xff\xec\x01?\x004\xff\xec\x01?\x00\x89\xff\xec\x01\ +?\x00\x94\xff\xec\x01?\x00\x95\xff\xec\x01?\x00\x96\xff\ +\xec\x01?\x00\x97\xff\xec\x01?\x00\x98\xff\xec\x01?\x00\ +\x9a\xff\xec\x01?\x00\xc8\xff\xec\x01?\x00\xca\xff\xec\x01\ +?\x00\xcc\xff\xec\x01?\x00\xce\xff\xec\x01?\x00\xde\xff\ +\xec\x01?\x00\xe0\xff\xec\x01?\x00\xe2\xff\xec\x01?\x00\ +\xe4\xff\xec\x01?\x01\x0e\xff\xec\x01?\x01\x10\xff\xec\x01\ +?\x01\x12\xff\xec\x01?\x01\x14\xff\xec\x01?\x01G\xff\ +\xec\x01?\x02_\xff\xec\x01?\x03I\xff\xec\x01?\x03\ +K\xff\xec\x01?\x03M\xff\xec\x01?\x03O\xff\xec\x01\ +?\x03Q\xff\xec\x01?\x03S\xff\xec\x01?\x03U\xff\ +\xec\x01?\x03W\xff\xec\x01?\x03Y\xff\xec\x01?\x03\ +[\xff\xec\x01?\x03]\xff\xec\x01?\x03_\xff\xec\x01\ +C\x00\x05\xffq\x01C\x00\x0a\xffq\x01C\x00&\xff\ +\xd7\x01C\x00*\xff\xd7\x01C\x00-\x01\x0a\x01C\x00\ +2\xff\xd7\x01C\x004\xff\xd7\x01C\x007\xffq\x01\ +C\x009\xff\xae\x01C\x00:\xff\xae\x01C\x00<\xff\ +\x85\x01C\x00\x89\xff\xd7\x01C\x00\x94\xff\xd7\x01C\x00\ +\x95\xff\xd7\x01C\x00\x96\xff\xd7\x01C\x00\x97\xff\xd7\x01\ +C\x00\x98\xff\xd7\x01C\x00\x9a\xff\xd7\x01C\x00\x9f\xff\ +\x85\x01C\x00\xc8\xff\xd7\x01C\x00\xca\xff\xd7\x01C\x00\ +\xcc\xff\xd7\x01C\x00\xce\xff\xd7\x01C\x00\xde\xff\xd7\x01\ +C\x00\xe0\xff\xd7\x01C\x00\xe2\xff\xd7\x01C\x00\xe4\xff\ +\xd7\x01C\x01\x0e\xff\xd7\x01C\x01\x10\xff\xd7\x01C\x01\ +\x12\xff\xd7\x01C\x01\x14\xff\xd7\x01C\x01$\xffq\x01\ +C\x01&\xffq\x01C\x016\xff\xae\x01C\x018\xff\ +\x85\x01C\x01:\xff\x85\x01C\x01G\xff\xd7\x01C\x01\ +\xfa\xff\xae\x01C\x01\xfc\xff\xae\x01C\x01\xfe\xff\xae\x01\ +C\x02\x00\xff\x85\x01C\x02\x07\xffq\x01C\x02\x0b\xff\ +q\x01C\x02_\xff\xd7\x01C\x03I\xff\xd7\x01C\x03\ +K\xff\xd7\x01C\x03M\xff\xd7\x01C\x03O\xff\xd7\x01\ +C\x03Q\xff\xd7\x01C\x03S\xff\xd7\x01C\x03U\xff\ +\xd7\x01C\x03W\xff\xd7\x01C\x03Y\xff\xd7\x01C\x03\ +[\xff\xd7\x01C\x03]\xff\xd7\x01C\x03_\xff\xd7\x01\ +C\x03o\xff\x85\x01C\x03q\xff\x85\x01C\x03s\xff\ +\x85\x01C\x03\x8f\xffq\x01D\x00\x05\xff\xec\x01D\x00\ +\x0a\xff\xec\x01D\x02\x07\xff\xec\x01D\x02\x0b\xff\xec\x01\ +E\x00-\x00{\x01G\x00\x0f\xff\xae\x01G\x00\x11\xff\ +\xae\x01G\x00$\xff\xd7\x01G\x007\xff\xc3\x01G\x00\ +9\xff\xec\x01G\x00:\xff\xec\x01G\x00;\xff\xd7\x01\ +G\x00<\xff\xec\x01G\x00=\xff\xec\x01G\x00\x82\xff\ +\xd7\x01G\x00\x83\xff\xd7\x01G\x00\x84\xff\xd7\x01G\x00\ +\x85\xff\xd7\x01G\x00\x86\xff\xd7\x01G\x00\x87\xff\xd7\x01\ +G\x00\x9f\xff\xec\x01G\x00\xc2\xff\xd7\x01G\x00\xc4\xff\ +\xd7\x01G\x00\xc6\xff\xd7\x01G\x01$\xff\xc3\x01G\x01\ +&\xff\xc3\x01G\x016\xff\xec\x01G\x018\xff\xec\x01\ +G\x01:\xff\xec\x01G\x01;\xff\xec\x01G\x01=\xff\ +\xec\x01G\x01?\xff\xec\x01G\x01C\xff\xd7\x01G\x01\ +\xa0\xff\xec\x01G\x01\xfa\xff\xec\x01G\x01\xfc\xff\xec\x01\ +G\x01\xfe\xff\xec\x01G\x02\x00\xff\xec\x01G\x02\x08\xff\ +\xae\x01G\x02\x0c\xff\xae\x01G\x02X\xff\xd7\x01G\x03\ +\x1d\xff\xd7\x01G\x03\x1f\xff\xd7\x01G\x03!\xff\xd7\x01\ +G\x03#\xff\xd7\x01G\x03%\xff\xd7\x01G\x03'\xff\ +\xd7\x01G\x03)\xff\xd7\x01G\x03+\xff\xd7\x01G\x03\ +-\xff\xd7\x01G\x03/\xff\xd7\x01G\x031\xff\xd7\x01\ +G\x033\xff\xd7\x01G\x03o\xff\xec\x01G\x03q\xff\ +\xec\x01G\x03s\xff\xec\x01G\x03\x8f\xff\xc3\x01V\x00\ +\x05\xffq\x01V\x00\x0a\xffq\x01V\x01f\xff\xd7\x01\ +V\x01m\xff\xd7\x01V\x01q\xffq\x01V\x01r\xff\ +\x85\x01V\x01s\xff\xd7\x01V\x01u\xff\xae\x01V\x01\ +x\xff\x85\x01V\x02\x07\xffq\x01V\x02\x0b\xffq\x01\ +V\x02T\xff\x85\x01[\x00\x0f\xff\xae\x01[\x00\x11\xff\ +\xae\x01[\x01V\xff\xd7\x01[\x01_\xff\xd7\x01[\x01\ +b\xff\xd7\x01[\x01d\xff\xec\x01[\x01i\xff\xd7\x01\ +[\x01p\xff\xec\x01[\x01q\xff\xc3\x01[\x01r\xff\ +\xec\x01[\x01t\xff\xd7\x01[\x01u\xff\xec\x01[\x01\ +x\xff\xec\x01[\x01\x88\xff\xec\x01[\x02\x08\xff\xae\x01\ +[\x02\x0c\xff\xae\x01[\x02T\xff\xec\x01\x5c\x00\x0f\xff\ +\x85\x01\x5c\x00\x11\xff\x85\x01\x5c\x01V\xff\x85\x01\x5c\x01\ +_\xff\x85\x01\x5c\x01b\xff\x85\x01\x5c\x01f\xff\xd7\x01\ +\x5c\x01i\xff\x85\x01\x5c\x01m\xff\xd7\x01\x5c\x01s\xff\ +\xc3\x01\x5c\x01v\xff\xec\x01\x5c\x01y\xff\x9a\x01\x5c\x01\ +z\xff\xae\x01\x5c\x01{\xff\xc3\x01\x5c\x01|\xff\xc3\x01\ +\x5c\x01}\xff\xc3\x01\x5c\x01~\xff\x9a\x01\x5c\x01\x81\xff\ +\xc3\x01\x5c\x01\x82\xff\xae\x01\x5c\x01\x84\xff\xc3\x01\x5c\x01\ +\x86\xff\xc3\x01\x5c\x01\x87\xff\xc3\x01\x5c\x01\x89\xff\xc3\x01\ +\x5c\x01\x8c\xff\x9a\x01\x5c\x01\x8e\xff\x9a\x01\x5c\x01\x8f\xff\ +\x9a\x01\x5c\x01\x90\xff\x9a\x01\x5c\x01\x92\xff\xc3\x01\x5c\x01\ +\x93\xff\x9a\x01\x5c\x01\x95\xff\xc3\x01\x5c\x01\x96\xff\xc3\x01\ +\x5c\x01\x98\xff\xc3\x01\x5c\x01\x99\xff\x9a\x01\x5c\x01\x9a\xff\ +\xc3\x01\x5c\x01\x9b\xff\xc3\x01\x5c\x02\x08\xff\x85\x01\x5c\x02\ +\x0c\xff\x85\x01\x5c\x02!\xff\xec\x01]\x01q\xff\xd7\x01\ +]\x01r\xff\xec\x01]\x01x\xff\xec\x01]\x02T\xff\ +\xec\x01^\x00\x05\xff\xd7\x01^\x00\x0a\xff\xd7\x01^\x02\ +\x07\xff\xd7\x01^\x02\x0b\xff\xd7\x01_\x00\x05\xffq\x01\ +_\x00\x0a\xffq\x01_\x01f\xff\xd7\x01_\x01m\xff\ +\xd7\x01_\x01q\xffq\x01_\x01r\xff\x85\x01_\x01\ +s\xff\xd7\x01_\x01u\xff\xae\x01_\x01x\xff\x85\x01\ +_\x02\x07\xffq\x01_\x02\x0b\xffq\x01_\x02T\xff\ +\x85\x01`\x00\x0f\xff\xae\x01`\x00\x11\xff\xae\x01`\x01\ +V\xff\xd7\x01`\x01_\xff\xd7\x01`\x01b\xff\xd7\x01\ +`\x01i\xff\xd7\x01`\x01t\xff\xd7\x01`\x02\x08\xff\ +\xae\x01`\x02\x0c\xff\xae\x01a\x00\x0f\xff\x85\x01a\x00\ +\x10\xff\xae\x01a\x00\x11\xff\x85\x01a\x01V\xff\x5c\x01\ +a\x01_\xff\x5c\x01a\x01b\xff\x5c\x01a\x01f\xff\ +\xc3\x01a\x01i\xff\x5c\x01a\x01m\xff\xc3\x01a\x01\ +s\xff\x9a\x01a\x01v\xff\xc3\x01a\x01y\xffq\x01\ +a\x01z\xff\x9a\x01a\x01{\xff\x9a\x01a\x01|\xff\ +\xae\x01a\x01}\xff\x9a\x01a\x01~\xffq\x01a\x01\ +\x80\xff\xd7\x01a\x01\x81\xff\xc3\x01a\x01\x82\xff\x9a\x01\ +a\x01\x84\xff\x9a\x01a\x01\x86\xff\xae\x01a\x01\x87\xff\ +\x9a\x01a\x01\x89\xff\x9a\x01a\x01\x8a\xff\xd7\x01a\x01\ +\x8c\xffq\x01a\x01\x8e\xff\x9a\x01a\x01\x8f\xffq\x01\ +a\x01\x90\xffq\x01a\x01\x92\xff\x9a\x01a\x01\x93\xff\ +q\x01a\x01\x94\xff\xd7\x01a\x01\x95\xff\x9a\x01a\x01\ +\x96\xff\x9a\x01a\x01\x98\xff\x9a\x01a\x01\x99\xffq\x01\ +a\x01\x9a\xff\x9a\x01a\x01\x9b\xff\x9a\x01a\x02\x02\xff\ +\xae\x01a\x02\x03\xff\xae\x01a\x02\x04\xff\xae\x01a\x02\ +\x08\xff\x85\x01a\x02\x0c\xff\x85\x01a\x02!\xff\xc3\x01\ +a\x02S\xff\xd7\x01b\x00\x05\xffq\x01b\x00\x0a\xff\ +q\x01b\x01f\xff\xd7\x01b\x01m\xff\xd7\x01b\x01\ +q\xffq\x01b\x01r\xff\x85\x01b\x01s\xff\xd7\x01\ +b\x01u\xff\xae\x01b\x01x\xff\x85\x01b\x02\x07\xff\ +q\x01b\x02\x0b\xffq\x01b\x02T\xff\x85\x01d\x01\ +f\xff\xec\x01d\x01m\xff\xec\x01d\x01s\xff\xc3\x01\ +f\x00\x0f\xff\xae\x01f\x00\x11\xff\xae\x01f\x01V\xff\ +\xd7\x01f\x01_\xff\xd7\x01f\x01b\xff\xd7\x01f\x01\ +d\xff\xec\x01f\x01i\xff\xd7\x01f\x01p\xff\xec\x01\ +f\x01q\xff\xc3\x01f\x01r\xff\xec\x01f\x01t\xff\ +\xd7\x01f\x01u\xff\xec\x01f\x01x\xff\xec\x01f\x01\ +\x88\xff\xec\x01f\x02\x08\xff\xae\x01f\x02\x0c\xff\xae\x01\ +f\x02T\xff\xec\x01h\x01f\xff\xd7\x01h\x01m\xff\ +\xd7\x01h\x01s\xff\xc3\x01h\x01\x8d\xff\xec\x01h\x01\ +\x91\xff\xec\x01i\x00\x05\xffq\x01i\x00\x0a\xffq\x01\ +i\x01f\xff\xd7\x01i\x01m\xff\xd7\x01i\x01q\xff\ +q\x01i\x01r\xff\x85\x01i\x01s\xff\xd7\x01i\x01\ +u\xff\xae\x01i\x01x\xff\x85\x01i\x02\x07\xffq\x01\ +i\x02\x0b\xffq\x01i\x02T\xff\x85\x01m\x00\x0f\xff\ +\xae\x01m\x00\x11\xff\xae\x01m\x01V\xff\xd7\x01m\x01\ +_\xff\xd7\x01m\x01b\xff\xd7\x01m\x01d\xff\xec\x01\ +m\x01i\xff\xd7\x01m\x01p\xff\xec\x01m\x01q\xff\ +\xc3\x01m\x01r\xff\xec\x01m\x01t\xff\xd7\x01m\x01\ +u\xff\xec\x01m\x01x\xff\xec\x01m\x01\x88\xff\xec\x01\ +m\x02\x08\xff\xae\x01m\x02\x0c\xff\xae\x01m\x02T\xff\ +\xec\x01o\x00\x0f\xfe\xf6\x01o\x00\x11\xfe\xf6\x01o\x01\ +V\xff\x9a\x01o\x01_\xff\x9a\x01o\x01b\xff\x9a\x01\ +o\x01d\xff\xec\x01o\x01i\xff\x9a\x01o\x01t\xff\ +\xd7\x01o\x01\x88\xff\xd7\x01o\x02\x08\xfe\xf6\x01o\x02\ +\x0c\xfe\xf6\x01q\x00\x0f\xff\x85\x01q\x00\x10\xff\xae\x01\ +q\x00\x11\xff\x85\x01q\x01V\xff\x5c\x01q\x01_\xff\ +\x5c\x01q\x01b\xff\x5c\x01q\x01f\xff\xc3\x01q\x01\ +i\xff\x5c\x01q\x01m\xff\xc3\x01q\x01s\xff\x9a\x01\ +q\x01v\xff\xc3\x01q\x01y\xffq\x01q\x01z\xff\ +\x9a\x01q\x01{\xff\x9a\x01q\x01|\xff\xae\x01q\x01\ +}\xff\x9a\x01q\x01~\xffq\x01q\x01\x80\xff\xd7\x01\ +q\x01\x81\xff\xc3\x01q\x01\x82\xff\x9a\x01q\x01\x84\xff\ +\x9a\x01q\x01\x86\xff\xae\x01q\x01\x87\xff\x9a\x01q\x01\ +\x89\xff\x9a\x01q\x01\x8a\xff\xd7\x01q\x01\x8c\xffq\x01\ +q\x01\x8e\xff\x9a\x01q\x01\x8f\xffq\x01q\x01\x90\xff\ +q\x01q\x01\x92\xff\x9a\x01q\x01\x93\xffq\x01q\x01\ +\x94\xff\xd7\x01q\x01\x95\xff\x9a\x01q\x01\x96\xff\x9a\x01\ +q\x01\x98\xff\x9a\x01q\x01\x99\xffq\x01q\x01\x9a\xff\ +\x9a\x01q\x01\x9b\xff\x9a\x01q\x02\x02\xff\xae\x01q\x02\ +\x03\xff\xae\x01q\x02\x04\xff\xae\x01q\x02\x08\xff\x85\x01\ +q\x02\x0c\xff\x85\x01q\x02!\xff\xc3\x01q\x02S\xff\ +\xd7\x01r\x00\x0f\xff\x85\x01r\x00\x11\xff\x85\x01r\x01\ +V\xff\x85\x01r\x01_\xff\x85\x01r\x01b\xff\x85\x01\ +r\x01f\xff\xd7\x01r\x01i\xff\x85\x01r\x01m\xff\ +\xd7\x01r\x01s\xff\xc3\x01r\x01v\xff\xec\x01r\x01\ +y\xff\x9a\x01r\x01z\xff\xae\x01r\x01{\xff\xc3\x01\ +r\x01|\xff\xc3\x01r\x01}\xff\xc3\x01r\x01~\xff\ +\x9a\x01r\x01\x81\xff\xc3\x01r\x01\x82\xff\xae\x01r\x01\ +\x84\xff\xc3\x01r\x01\x86\xff\xc3\x01r\x01\x87\xff\xc3\x01\ +r\x01\x89\xff\xc3\x01r\x01\x8c\xff\x9a\x01r\x01\x8e\xff\ +\x9a\x01r\x01\x8f\xff\x9a\x01r\x01\x90\xff\x9a\x01r\x01\ +\x92\xff\xc3\x01r\x01\x93\xff\x9a\x01r\x01\x95\xff\xc3\x01\ +r\x01\x96\xff\xc3\x01r\x01\x98\xff\xc3\x01r\x01\x99\xff\ +\x9a\x01r\x01\x9a\xff\xc3\x01r\x01\x9b\xff\xc3\x01r\x02\ +\x08\xff\x85\x01r\x02\x0c\xff\x85\x01r\x02!\xff\xec\x01\ +s\x00\x0f\xff\x9a\x01s\x00\x11\xff\x9a\x01s\x01V\xff\ +\xd7\x01s\x01_\xff\xd7\x01s\x01b\xff\xd7\x01s\x01\ +d\xff\xc3\x01s\x01i\xff\xd7\x01s\x01p\xff\xec\x01\ +s\x01q\xff\xae\x01s\x01r\xff\xc3\x01s\x01t\xff\ +\xec\x01s\x01x\xff\xc3\x01s\x01\x88\xff\xec\x01s\x02\ +\x08\xff\x9a\x01s\x02\x0c\xff\x9a\x01s\x02T\xff\xc3\x01\ +t\x01f\xff\xd7\x01t\x01m\xff\xd7\x01t\x01s\xff\ +\xc3\x01t\x01\x8d\xff\xec\x01t\x01\x91\xff\xec\x01u\x00\ +\x0f\xff\x85\x01u\x00\x11\xff\x85\x01u\x01V\xff\xae\x01\ +u\x01_\xff\xae\x01u\x01b\xff\xae\x01u\x01f\xff\ +\xec\x01u\x01i\xff\xae\x01u\x01m\xff\xec\x01u\x02\ +\x08\xff\x85\x01u\x02\x0c\xff\x85\x01v\x01q\xff\xd7\x01\ +v\x01r\xff\xec\x01v\x01x\xff\xec\x01v\x02T\xff\ +\xec\x01x\x00\x0f\xff\x85\x01x\x00\x11\xff\x85\x01x\x01\ +V\xff\x85\x01x\x01_\xff\x85\x01x\x01b\xff\x85\x01\ +x\x01f\xff\xd7\x01x\x01i\xff\x85\x01x\x01m\xff\ +\xd7\x01x\x01s\xff\xc3\x01x\x01v\xff\xec\x01x\x01\ +y\xff\x9a\x01x\x01z\xff\xae\x01x\x01{\xff\xc3\x01\ +x\x01|\xff\xc3\x01x\x01}\xff\xc3\x01x\x01~\xff\ +\x9a\x01x\x01\x81\xff\xc3\x01x\x01\x82\xff\xae\x01x\x01\ +\x84\xff\xc3\x01x\x01\x86\xff\xc3\x01x\x01\x87\xff\xc3\x01\ +x\x01\x89\xff\xc3\x01x\x01\x8c\xff\x9a\x01x\x01\x8e\xff\ +\x9a\x01x\x01\x8f\xff\x9a\x01x\x01\x90\xff\x9a\x01x\x01\ +\x92\xff\xc3\x01x\x01\x93\xff\x9a\x01x\x01\x95\xff\xc3\x01\ +x\x01\x96\xff\xc3\x01x\x01\x98\xff\xc3\x01x\x01\x99\xff\ +\x9a\x01x\x01\x9a\xff\xc3\x01x\x01\x9b\xff\xc3\x01x\x02\ +\x08\xff\x85\x01x\x02\x0c\xff\x85\x01x\x02!\xff\xec\x01\ +y\x01\x88\x00)\x01{\x00\x05\xff\xec\x01{\x00\x0a\xff\ +\xec\x01{\x02\x07\xff\xec\x01{\x02\x0b\xff\xec\x01|\x00\ +\x05\xff\xae\x01|\x00\x0a\xff\xae\x01|\x01\x8d\xff\xec\x01\ +|\x01\x91\xff\xec\x01|\x02\x07\xff\xae\x01|\x02\x0b\xff\ +\xae\x01~\x01\x88\x00)\x01\x80\x00\x0f\xff\xae\x01\x80\x00\ +\x11\xff\xae\x01\x80\x01\x88\xff\xec\x01\x80\x02\x08\xff\xae\x01\ +\x80\x02\x0c\xff\xae\x01\x83\x00\x10\xff\x9a\x01\x83\x01y\xff\ +\xd7\x01\x83\x01~\xff\xd7\x01\x83\x01\x81\xff\xd7\x01\x83\x01\ +\x8c\xff\xd7\x01\x83\x01\x8d\xff\xd7\x01\x83\x01\x8f\xff\xd7\x01\ +\x83\x01\x90\xff\xd7\x01\x83\x01\x91\xff\xd7\x01\x83\x01\x93\xff\ +\xd7\x01\x83\x01\x99\xff\xd7\x01\x83\x02\x02\xff\x9a\x01\x83\x02\ +\x03\xff\x9a\x01\x83\x02\x04\xff\x9a\x01\x84\x00\x05\xff\xec\x01\ +\x84\x00\x0a\xff\xec\x01\x84\x02\x07\xff\xec\x01\x84\x02\x0b\xff\ +\xec\x01\x85\x00\x0f\xff\xd7\x01\x85\x00\x11\xff\xd7\x01\x85\x02\ +\x08\xff\xd7\x01\x85\x02\x0c\xff\xd7\x01\x86\x00\x05\xff\xae\x01\ +\x86\x00\x0a\xff\xae\x01\x86\x01\x8d\xff\xec\x01\x86\x01\x91\xff\ +\xec\x01\x86\x02\x07\xff\xae\x01\x86\x02\x0b\xff\xae\x01\x87\x01\ +y\xff\xd7\x01\x87\x01~\xff\xd7\x01\x87\x01\x8c\xff\xd7\x01\ +\x87\x01\x8f\xff\xd7\x01\x87\x01\x90\xff\xd7\x01\x87\x01\x93\xff\ +\xd7\x01\x87\x01\x99\xff\xd7\x01\x88\x00\x05\xff\x85\x01\x88\x00\ +\x0a\xff\x85\x01\x88\x01y\xff\xec\x01\x88\x01~\xff\xec\x01\ +\x88\x01\x80\xff\xd7\x01\x88\x01\x8a\xff\xd7\x01\x88\x01\x8c\xff\ +\xec\x01\x88\x01\x8d\xff\xd7\x01\x88\x01\x8f\xff\xec\x01\x88\x01\ +\x90\xff\xec\x01\x88\x01\x91\xff\xd7\x01\x88\x01\x93\xff\xec\x01\ +\x88\x01\x99\xff\xec\x01\x88\x02\x07\xff\x85\x01\x88\x02\x0b\xff\ +\x85\x01\x8a\x00\x0f\xff\xae\x01\x8a\x00\x11\xff\xae\x01\x8a\x01\ +\x88\xff\xec\x01\x8a\x02\x08\xff\xae\x01\x8a\x02\x0c\xff\xae\x01\ +\x8c\x00\x05\xff\xec\x01\x8c\x00\x0a\xff\xec\x01\x8c\x01\x80\xff\ +\xd7\x01\x8c\x01\x8a\xff\xd7\x01\x8c\x02\x07\xff\xec\x01\x8c\x02\ +\x0b\xff\xec\x01\x8e\x00\x05\xff\xec\x01\x8e\x00\x0a\xff\xec\x01\ +\x8e\x01\x80\xff\xd7\x01\x8e\x01\x8a\xff\xd7\x01\x8e\x02\x07\xff\ +\xec\x01\x8e\x02\x0b\xff\xec\x01\x90\x00\x0f\xff\xec\x01\x90\x00\ +\x11\xff\xec\x01\x90\x02\x08\xff\xec\x01\x90\x02\x0c\xff\xec\x01\ +\x93\x00\x05\xff\xec\x01\x93\x00\x0a\xff\xec\x01\x93\x01\x80\xff\ +\xd7\x01\x93\x01\x8a\xff\xd7\x01\x93\x02\x07\xff\xec\x01\x93\x02\ +\x0b\xff\xec\x01\x94\x00\x0f\xff\xc3\x01\x94\x00\x10\xff\xd7\x01\ +\x94\x00\x11\xff\xc3\x01\x94\x01y\xff\xd7\x01\x94\x01~\xff\ +\xd7\x01\x94\x01\x81\xff\xd7\x01\x94\x01\x8c\xff\xd7\x01\x94\x01\ +\x8f\xff\xd7\x01\x94\x01\x90\xff\xd7\x01\x94\x01\x93\xff\xd7\x01\ +\x94\x01\x99\xff\xd7\x01\x94\x02\x02\xff\xd7\x01\x94\x02\x03\xff\ +\xd7\x01\x94\x02\x04\xff\xd7\x01\x94\x02\x08\xff\xc3\x01\x94\x02\ +\x0c\xff\xc3\x01\x97\x00\x05\xff\xd7\x01\x97\x00\x0a\xff\xd7\x01\ +\x97\x02\x07\xff\xd7\x01\x97\x02\x0b\xff\xd7\x01\x99\x00\x05\xff\ +\xec\x01\x99\x00\x0a\xff\xec\x01\x99\x01\x80\xff\xd7\x01\x99\x01\ +\x8a\xff\xd7\x01\x99\x02\x07\xff\xec\x01\x99\x02\x0b\xff\xec\x01\ +\x9d\x00\x05\xff\xae\x01\x9d\x00\x0a\xff\xae\x01\x9d\x01\x9d\xff\ +\x85\x01\x9d\x01\xa6\xff\x85\x01\x9d\x01\xa8\xff\xd7\x01\x9d\x01\ +\xbc\xff\x9a\x01\x9d\x01\xbd\xff\xd7\x01\x9d\x01\xc1\xff\x9a\x01\ +\x9d\x01\xc4\xff\x85\x01\x9d\x01\xdc\xff\xd7\x01\x9d\x01\xdd\xff\ +\xd7\x01\x9d\x01\xe1\xff\xd7\x01\x9d\x01\xe4\xff\xd7\x01\x9d\x01\ +\xf6\xff\xd7\x01\x9d\x02\x07\xff\xae\x01\x9d\x02\x0b\xff\xae\x01\ +\x9d\x02n\xff\xae\x01\x9d\x02|\xff\x9a\x01\x9d\x02\x80\xff\ +\xae\x01\x9d\x02\x82\xff\xae\x01\x9d\x02\x97\xff\xae\x01\x9d\x02\ +\x9b\xff\xae\x01\x9d\x02\xa7\xff\xae\x01\x9d\x02\xa9\xff\x85\x01\ +\x9d\x02\xaa\xff\xd7\x01\x9d\x02\xb5\xff\x9a\x01\x9d\x02\xb6\xff\ +\xd7\x01\x9d\x02\xb7\xff\x9a\x01\x9d\x02\xb8\xff\xd7\x01\x9d\x02\ +\xb9\xff\x9a\x01\x9d\x02\xba\xff\xd7\x01\x9d\x02\xbd\xff\x85\x01\ +\x9d\x02\xbe\xff\xd7\x01\x9d\x02\xbf\xff\x9a\x01\x9d\x02\xc0\xff\ +\xd7\x01\x9d\x02\xc1\xff\x9a\x01\x9d\x02\xc2\xff\xd7\x01\x9d\x02\ +\xd4\xff\x9a\x01\x9d\x02\xd5\xff\xd7\x01\x9d\x02\xf7\xff\xd7\x01\ +\x9d\x02\xf8\xff\xd7\x01\x9d\x02\xf9\xff\xd7\x01\x9d\x02\xfa\xff\ +\xd7\x01\x9d\x02\xfb\xff\xd7\x01\x9d\x02\xfc\xff\xd7\x01\x9d\x02\ +\xfd\xff\x9a\x01\x9d\x02\xfe\xff\xd7\x01\x9d\x03\x03\xff\xae\x01\ +\x9d\x03\x0d\xff\x9a\x01\x9d\x03\x0e\xff\xc3\x01\x9d\x03\x0f\xff\ +\x9a\x01\x9d\x03\x10\xff\xc3\x01\x9d\x03\x17\xff\x85\x01\x9d\x03\ +\x18\xff\xd7\x01\x9e\x00\x0f\xff\x85\x01\x9e\x00\x10\xff\xae\x01\ +\x9e\x00\x11\xff\x85\x01\x9e\x01\x9f\xff\xd7\x01\x9e\x01\xa4\xff\ +\x9a\x01\x9e\x01\xaa\xffq\x01\x9e\x01\xae\xff\x9a\x01\x9e\x01\ +\xb5\xff\x9a\x01\x9e\x01\xb8\xff\xd7\x01\x9e\x01\xbb\xff\xd7\x01\ +\x9e\x01\xbc\x00)\x01\x9e\x01\xbe\xff\xae\x01\x9e\x01\xcc\xff\ +\x9a\x01\x9e\x01\xcd\xff\x9a\x01\x9e\x01\xce\xff\x85\x01\x9e\x01\ +\xcf\xffq\x01\x9e\x01\xd0\xff\xd7\x01\x9e\x01\xd1\xff\xd7\x01\ +\x9e\x01\xd2\xff\x9a\x01\x9e\x01\xd3\xff\x9a\x01\x9e\x01\xd4\xff\ +\x9a\x01\x9e\x01\xd5\xff\x85\x01\x9e\x01\xd6\xff\x9a\x01\x9e\x01\ +\xd7\xff\x9a\x01\x9e\x01\xd8\xffq\x01\x9e\x01\xd9\xff\x9a\x01\ +\x9e\x01\xda\xff\x9a\x01\x9e\x01\xdb\xffq\x01\x9e\x01\xdc\xff\ +\xae\x01\x9e\x01\xdd\xff\xae\x01\x9e\x01\xde\xffq\x01\x9e\x01\ +\xdf\xff\xd7\x01\x9e\x01\xe0\xff\x9a\x01\x9e\x01\xe1\xff\x9a\x01\ +\x9e\x01\xe2\xff\x9a\x01\x9e\x01\xe3\xff\x9a\x01\x9e\x01\xe4\xff\ +\xae\x01\x9e\x01\xe5\xff\x9a\x01\x9e\x01\xe6\xff\x9a\x01\x9e\x01\ +\xe7\xff\xd7\x01\x9e\x01\xe8\xff\x9a\x01\x9e\x01\xe9\xff\xc3\x01\ +\x9e\x01\xea\xffq\x01\x9e\x01\xec\xff\x9a\x01\x9e\x01\xed\xff\ +q\x01\x9e\x01\xee\xff\x85\x01\x9e\x01\xf2\xff\x85\x01\x9e\x01\ +\xf3\xff\x9a\x01\x9e\x01\xf5\xff\x9a\x01\x9e\x01\xf6\xff\xae\x01\ +\x9e\x01\xf7\xff\x9a\x01\x9e\x01\xf9\xff\x9a\x01\x9e\x02\x02\xff\ +\xae\x01\x9e\x02\x03\xff\xae\x01\x9e\x02\x04\xff\xae\x01\x9e\x02\ +\x08\xff\x85\x01\x9e\x02\x0c\xff\x85\x01\x9e\x02j\xffq\x01\ +\x9e\x02k\xff\x9a\x01\x9e\x02l\xff\xd7\x01\x9e\x02m\xff\ +\xd7\x01\x9e\x02q\xff\x9a\x01\x9e\x02r\xffq\x01\x9e\x02\ +s\xff\x85\x01\x9e\x02u\xff\x9a\x01\x9e\x02w\xff\x9a\x01\ +\x9e\x02y\xff\x9a\x01\x9e\x02}\xff\x9a\x01\x9e\x02~\xff\ +\xd7\x01\x9e\x02\x7f\xffq\x01\x9e\x02\x81\xff\xd7\x01\x9e\x02\ +\x83\xff\xd7\x01\x9e\x02\x84\xff\xd7\x01\x9e\x02\x85\xffq\x01\ +\x9e\x02\x86\xff\xd7\x01\x9e\x02\x87\xffq\x01\x9e\x02\x88\xff\ +\xd7\x01\x9e\x02\x89\xffq\x01\x9e\x02\x8a\xff\xd7\x01\x9e\x02\ +\x8b\xff\xd7\x01\x9e\x02\x8c\xff\xd7\x01\x9e\x02\x8d\xffq\x01\ +\x9e\x02\x96\xff\x9a\x01\x9e\x02\x9a\xff\x9a\x01\x9e\x02\x9e\xff\ +\x9a\x01\x9e\x02\xa0\xff\xd7\x01\x9e\x02\xa2\xff\xd7\x01\x9e\x02\ +\xa4\xff\x9a\x01\x9e\x02\xa6\xff\x9a\x01\x9e\x02\xaa\xff\xae\x01\ +\x9e\x02\xac\xff\x9a\x01\x9e\x02\xae\xff\x9a\x01\x9e\x02\xb0\xff\ +\x9a\x01\x9e\x02\xb1\xff\xd7\x01\x9e\x02\xb2\xffq\x01\x9e\x02\ +\xb3\xff\xd7\x01\x9e\x02\xb4\xffq\x01\x9e\x02\xb5\x00)\x01\ +\x9e\x02\xb6\xff\xae\x01\x9e\x02\xb8\xff\xae\x01\x9e\x02\xba\xff\ +\xae\x01\x9e\x02\xbc\xff\xd7\x01\x9e\x02\xbe\xff\xae\x01\x9e\x02\ +\xc0\xff\x9a\x01\x9e\x02\xc2\xff\x9a\x01\x9e\x02\xc4\xff\x9a\x01\ +\x9e\x02\xc5\xff\x9a\x01\x9e\x02\xc6\xffq\x01\x9e\x02\xc7\xff\ +\x9a\x01\x9e\x02\xc8\xffq\x01\x9e\x02\xcb\xff\xd7\x01\x9e\x02\ +\xcd\xff\x9a\x01\x9e\x02\xce\xff\x9a\x01\x9e\x02\xcf\xff\x85\x01\ +\x9e\x02\xd1\xff\x9a\x01\x9e\x02\xd3\xff\x9a\x01\x9e\x02\xd5\xff\ +\x9a\x01\x9e\x02\xd7\xff\x9a\x01\x9e\x02\xd9\xffq\x01\x9e\x02\ +\xdb\xffq\x01\x9e\x02\xdd\xffq\x01\x9e\x02\xe0\xffq\x01\ +\x9e\x02\xe6\xff\xd7\x01\x9e\x02\xe8\xff\xd7\x01\x9e\x02\xea\xff\ +\xc3\x01\x9e\x02\xec\xff\x9a\x01\x9e\x02\xee\xff\x9a\x01\x9e\x02\ +\xef\xff\xd7\x01\x9e\x02\xf0\xffq\x01\x9e\x02\xf1\xff\xd7\x01\ +\x9e\x02\xf2\xffq\x01\x9e\x02\xf3\xff\xd7\x01\x9e\x02\xf4\xff\ +q\x01\x9e\x02\xf6\xff\xd7\x01\x9e\x02\xf8\xff\xae\x01\x9e\x02\ +\xfa\xff\xae\x01\x9e\x02\xfc\xff\xae\x01\x9e\x02\xfe\xff\x9a\x01\ +\x9e\x03\x00\xff\x9a\x01\x9e\x03\x02\xff\x9a\x01\x9e\x03\x06\xff\ +\xd7\x01\x9e\x03\x08\xff\xd7\x01\x9e\x03\x09\xffq\x01\x9e\x03\ +\x0a\xffq\x01\x9e\x03\x0b\xffq\x01\x9e\x03\x0c\xffq\x01\ +\x9e\x03\x0e\xff\x9a\x01\x9e\x03\x10\xff\x9a\x01\x9e\x03\x11\xff\ +\x9a\x01\x9e\x03\x12\xff\x85\x01\x9e\x03\x14\xff\x9a\x01\x9e\x03\ +\x15\xff\xd7\x01\x9e\x03\x16\xffq\x01\x9e\x03\x18\xff\xae\x01\ +\x9e\x03\x1a\xffq\x01\x9e\x03\x1b\xff\x9a\x01\x9e\x03\x1c\xff\ +\x85\x01\x9f\x01\x9f\xff\xd7\x01\x9f\x01\xb8\xff\xd7\x01\x9f\x01\ +\xbb\xff\xd7\x01\x9f\x01\xbe\xff\xd7\x01\x9f\x01\xe1\xff\xd7\x01\ +\x9f\x02l\xff\xd7\x01\x9f\x02~\xff\xd7\x01\x9f\x02\x84\xff\ +\xd7\x01\x9f\x02\x86\xff\xd7\x01\x9f\x02\x88\xff\xd7\x01\x9f\x02\ +\x8a\xff\xd7\x01\x9f\x02\x8c\xff\xd7\x01\x9f\x02\xb1\xff\xd7\x01\ +\x9f\x02\xb3\xff\xd7\x01\x9f\x02\xc0\xff\xd7\x01\x9f\x02\xc2\xff\ +\xd7\x01\x9f\x02\xc5\xff\xd7\x01\x9f\x02\xc7\xff\xd7\x01\x9f\x02\ +\xd5\xff\xd7\x01\x9f\x02\xef\xff\xd7\x01\x9f\x02\xf1\xff\xd7\x01\ +\x9f\x02\xf3\xff\xd7\x01\x9f\x02\xfe\xff\xd7\x01\x9f\x03\x09\xff\ +\xd7\x01\x9f\x03\x0b\xff\xd7\x01\x9f\x03\x0e\xff\xd7\x01\x9f\x03\ +\x10\xff\xd7\x01\x9f\x03\x15\xff\xd7\x01\xa0\x03\x0e\xff\xd7\x01\ +\xa0\x03\x10\xff\xd7\x01\xa4\x00\x05\xff\xae\x01\xa4\x00\x0a\xff\ +\xae\x01\xa4\x01\x9d\xff\x85\x01\xa4\x01\xa6\xff\x85\x01\xa4\x01\ +\xa8\xff\xd7\x01\xa4\x01\xbc\xff\x9a\x01\xa4\x01\xbd\xff\xd7\x01\ +\xa4\x01\xc1\xff\x9a\x01\xa4\x01\xc4\xff\x85\x01\xa4\x01\xdc\xff\ +\xd7\x01\xa4\x01\xdd\xff\xd7\x01\xa4\x01\xe1\xff\xd7\x01\xa4\x01\ +\xe4\xff\xd7\x01\xa4\x01\xf6\xff\xd7\x01\xa4\x02\x07\xff\xae\x01\ +\xa4\x02\x0b\xff\xae\x01\xa4\x02n\xff\xae\x01\xa4\x02|\xff\ +\x9a\x01\xa4\x02\x80\xff\xae\x01\xa4\x02\x82\xff\xae\x01\xa4\x02\ +\x97\xff\xae\x01\xa4\x02\x9b\xff\xae\x01\xa4\x02\xa7\xff\xae\x01\ +\xa4\x02\xa9\xff\x85\x01\xa4\x02\xaa\xff\xd7\x01\xa4\x02\xb5\xff\ +\x9a\x01\xa4\x02\xb6\xff\xd7\x01\xa4\x02\xb7\xff\x9a\x01\xa4\x02\ +\xb8\xff\xd7\x01\xa4\x02\xb9\xff\x9a\x01\xa4\x02\xba\xff\xd7\x01\ +\xa4\x02\xbd\xff\x85\x01\xa4\x02\xbe\xff\xd7\x01\xa4\x02\xbf\xff\ +\x9a\x01\xa4\x02\xc0\xff\xd7\x01\xa4\x02\xc1\xff\x9a\x01\xa4\x02\ +\xc2\xff\xd7\x01\xa4\x02\xd4\xff\x9a\x01\xa4\x02\xd5\xff\xd7\x01\ +\xa4\x02\xf7\xff\xd7\x01\xa4\x02\xf8\xff\xd7\x01\xa4\x02\xf9\xff\ +\xd7\x01\xa4\x02\xfa\xff\xd7\x01\xa4\x02\xfb\xff\xd7\x01\xa4\x02\ +\xfc\xff\xd7\x01\xa4\x02\xfd\xff\x9a\x01\xa4\x02\xfe\xff\xd7\x01\ +\xa4\x03\x03\xff\xae\x01\xa4\x03\x0d\xff\x9a\x01\xa4\x03\x0e\xff\ +\xc3\x01\xa4\x03\x0f\xff\x9a\x01\xa4\x03\x10\xff\xc3\x01\xa4\x03\ +\x17\xff\x85\x01\xa4\x03\x18\xff\xd7\x01\xa5\x00\x05\xff\xae\x01\ +\xa5\x00\x0a\xff\xae\x01\xa5\x01\x9d\xff\x85\x01\xa5\x01\xa6\xff\ +\x85\x01\xa5\x01\xa8\xff\xd7\x01\xa5\x01\xbc\xff\x9a\x01\xa5\x01\ +\xbd\xff\xd7\x01\xa5\x01\xc1\xff\x9a\x01\xa5\x01\xc4\xff\x85\x01\ +\xa5\x01\xdc\xff\xd7\x01\xa5\x01\xdd\xff\xd7\x01\xa5\x01\xe1\xff\ +\xd7\x01\xa5\x01\xe4\xff\xd7\x01\xa5\x01\xf6\xff\xd7\x01\xa5\x02\ +\x07\xff\xae\x01\xa5\x02\x0b\xff\xae\x01\xa5\x02n\xff\xae\x01\ +\xa5\x02|\xff\x9a\x01\xa5\x02\x80\xff\xae\x01\xa5\x02\x82\xff\ +\xae\x01\xa5\x02\x97\xff\xae\x01\xa5\x02\x9b\xff\xae\x01\xa5\x02\ +\xa7\xff\xae\x01\xa5\x02\xa9\xff\x85\x01\xa5\x02\xaa\xff\xd7\x01\ +\xa5\x02\xb5\xff\x9a\x01\xa5\x02\xb6\xff\xd7\x01\xa5\x02\xb7\xff\ +\x9a\x01\xa5\x02\xb8\xff\xd7\x01\xa5\x02\xb9\xff\x9a\x01\xa5\x02\ +\xba\xff\xd7\x01\xa5\x02\xbd\xff\x85\x01\xa5\x02\xbe\xff\xd7\x01\ +\xa5\x02\xbf\xff\x9a\x01\xa5\x02\xc0\xff\xd7\x01\xa5\x02\xc1\xff\ +\x9a\x01\xa5\x02\xc2\xff\xd7\x01\xa5\x02\xd4\xff\x9a\x01\xa5\x02\ +\xd5\xff\xd7\x01\xa5\x02\xf7\xff\xd7\x01\xa5\x02\xf8\xff\xd7\x01\ +\xa5\x02\xf9\xff\xd7\x01\xa5\x02\xfa\xff\xd7\x01\xa5\x02\xfb\xff\ +\xd7\x01\xa5\x02\xfc\xff\xd7\x01\xa5\x02\xfd\xff\x9a\x01\xa5\x02\ +\xfe\xff\xd7\x01\xa5\x03\x03\xff\xae\x01\xa5\x03\x0d\xff\x9a\x01\ +\xa5\x03\x0e\xff\xc3\x01\xa5\x03\x0f\xff\x9a\x01\xa5\x03\x10\xff\ +\xc3\x01\xa5\x03\x17\xff\x85\x01\xa5\x03\x18\xff\xd7\x01\xa6\x00\ +\x05\xff\xae\x01\xa6\x00\x0a\xff\xae\x01\xa6\x01\x9d\xff\x85\x01\ +\xa6\x01\xa6\xff\x85\x01\xa6\x01\xa8\xff\xd7\x01\xa6\x01\xbc\xff\ +\x9a\x01\xa6\x01\xbd\xff\xd7\x01\xa6\x01\xc1\xff\x9a\x01\xa6\x01\ +\xc4\xff\x85\x01\xa6\x01\xdc\xff\xd7\x01\xa6\x01\xdd\xff\xd7\x01\ +\xa6\x01\xe1\xff\xd7\x01\xa6\x01\xe4\xff\xd7\x01\xa6\x01\xf6\xff\ +\xd7\x01\xa6\x02\x07\xff\xae\x01\xa6\x02\x0b\xff\xae\x01\xa6\x02\ +n\xff\xae\x01\xa6\x02|\xff\x9a\x01\xa6\x02\x80\xff\xae\x01\ +\xa6\x02\x82\xff\xae\x01\xa6\x02\x97\xff\xae\x01\xa6\x02\x9b\xff\ +\xae\x01\xa6\x02\xa7\xff\xae\x01\xa6\x02\xa9\xff\x85\x01\xa6\x02\ +\xaa\xff\xd7\x01\xa6\x02\xb5\xff\x9a\x01\xa6\x02\xb6\xff\xd7\x01\ +\xa6\x02\xb7\xff\x9a\x01\xa6\x02\xb8\xff\xd7\x01\xa6\x02\xb9\xff\ +\x9a\x01\xa6\x02\xba\xff\xd7\x01\xa6\x02\xbd\xff\x85\x01\xa6\x02\ +\xbe\xff\xd7\x01\xa6\x02\xbf\xff\x9a\x01\xa6\x02\xc0\xff\xd7\x01\ +\xa6\x02\xc1\xff\x9a\x01\xa6\x02\xc2\xff\xd7\x01\xa6\x02\xd4\xff\ +\x9a\x01\xa6\x02\xd5\xff\xd7\x01\xa6\x02\xf7\xff\xd7\x01\xa6\x02\ +\xf8\xff\xd7\x01\xa6\x02\xf9\xff\xd7\x01\xa6\x02\xfa\xff\xd7\x01\ +\xa6\x02\xfb\xff\xd7\x01\xa6\x02\xfc\xff\xd7\x01\xa6\x02\xfd\xff\ +\x9a\x01\xa6\x02\xfe\xff\xd7\x01\xa6\x03\x03\xff\xae\x01\xa6\x03\ +\x0d\xff\x9a\x01\xa6\x03\x0e\xff\xc3\x01\xa6\x03\x0f\xff\x9a\x01\ +\xa6\x03\x10\xff\xc3\x01\xa6\x03\x17\xff\x85\x01\xa6\x03\x18\xff\ +\xd7\x01\xa7\x01\x9f\xff\xd7\x01\xa7\x01\xb8\xff\xd7\x01\xa7\x01\ +\xbb\xff\xd7\x01\xa7\x01\xbe\xff\xd7\x01\xa7\x01\xc1\xff\xd7\x01\ +\xa7\x01\xe1\xff\xd7\x01\xa7\x02l\xff\xd7\x01\xa7\x02|\xff\ +\xd7\x01\xa7\x02~\xff\xd7\x01\xa7\x02\x84\xff\xd7\x01\xa7\x02\ +\x86\xff\xd7\x01\xa7\x02\x88\xff\xd7\x01\xa7\x02\x8a\xff\xd7\x01\ +\xa7\x02\x8c\xff\xd7\x01\xa7\x02\xb1\xff\xd7\x01\xa7\x02\xb3\xff\ +\xd7\x01\xa7\x02\xbf\xff\xd7\x01\xa7\x02\xc0\xff\xd7\x01\xa7\x02\ +\xc1\xff\xd7\x01\xa7\x02\xc2\xff\xd7\x01\xa7\x02\xc5\xff\x9a\x01\ +\xa7\x02\xc7\xff\x9a\x01\xa7\x02\xd4\xff\xd7\x01\xa7\x02\xd5\xff\ +\xd7\x01\xa7\x02\xef\xff\xd7\x01\xa7\x02\xf1\xff\xd7\x01\xa7\x02\ +\xf3\xff\xd7\x01\xa7\x02\xfd\xff\xd7\x01\xa7\x02\xfe\xff\xd7\x01\ +\xa7\x03\x09\xff\xd7\x01\xa7\x03\x0b\xff\xd7\x01\xa7\x03\x0e\xff\ +\xd7\x01\xa7\x03\x10\xff\xd7\x01\xa7\x03\x15\xff\xd7\x01\xa7\x03\ +\x19\xff\xec\x01\xa8\x00\x0f\xff\x85\x01\xa8\x00\x11\xff\x85\x01\ +\xa8\x01\x9f\xff\xec\x01\xa8\x01\xa4\xff\x9a\x01\xa8\x01\xaa\xff\ +q\x01\xa8\x01\xae\xff\x9a\x01\xa8\x01\xb5\xff\x9a\x01\xa8\x01\ +\xb8\xff\xec\x01\xa8\x01\xbb\xff\xec\x01\xa8\x01\xbe\xff\xc3\x01\ +\xa8\x01\xc9\xff\xec\x01\xa8\x01\xce\xff\xae\x01\xa8\x01\xcf\xff\ +\xd7\x01\xa8\x01\xd5\xff\xae\x01\xa8\x01\xd8\xff\xd7\x01\xa8\x01\ +\xdb\xff\xd7\x01\xa8\x01\xde\xff\xd7\x01\xa8\x01\xe1\xff\xd7\x01\ +\xa8\x01\xea\xff\xd7\x01\xa8\x01\xeb\x00f\x01\xa8\x01\xed\xff\ +\xd7\x01\xa8\x01\xee\xff\xec\x01\xa8\x01\xf2\xff\xae\x01\xa8\x01\ +\xf4\x00f\x01\xa8\x02\x08\xff\x85\x01\xa8\x02\x0c\xff\x85\x01\ +\xa8\x02j\xff\xd7\x01\xa8\x02l\xff\xec\x01\xa8\x02r\xff\ +q\x01\xa8\x02s\xff\xae\x01\xa8\x02~\xff\xec\x01\xa8\x02\ +\x7f\xff\xd7\x01\xa8\x02\x84\xff\xec\x01\xa8\x02\x85\xff\xd7\x01\ +\xa8\x02\x86\xff\xec\x01\xa8\x02\x87\xff\xd7\x01\xa8\x02\x88\xff\ +\xec\x01\xa8\x02\x89\xff\xd7\x01\xa8\x02\x8a\xff\xec\x01\xa8\x02\ +\x8c\xff\xec\x01\xa8\x02\x8d\xff\xd7\x01\xa8\x02\x98\x00f\x01\ +\xa8\x02\xa8\x00f\x01\xa8\x02\xb1\xff\xec\x01\xa8\x02\xb2\xff\ +\xd7\x01\xa8\x02\xb3\xff\xec\x01\xa8\x02\xb4\xff\xd7\x01\xa8\x02\ +\xc0\xff\xd7\x01\xa8\x02\xc2\xff\xd7\x01\xa8\x02\xc5\xff\xd7\x01\ +\xa8\x02\xc6\xff\xc3\x01\xa8\x02\xc7\xff\xd7\x01\xa8\x02\xc8\xff\ +\xc3\x01\xa8\x02\xce\xff\x9a\x01\xa8\x02\xcf\xff\xae\x01\xa8\x02\ +\xd5\xff\xd7\x01\xa8\x02\xd9\xffq\x01\xa8\x02\xdb\xffq\x01\ +\xa8\x02\xdd\xffq\x01\xa8\x02\xe0\xff\xd7\x01\xa8\x02\xef\xff\ +\xec\x01\xa8\x02\xf0\xff\xd7\x01\xa8\x02\xf1\xff\xec\x01\xa8\x02\ +\xf2\xff\xd7\x01\xa8\x02\xf3\xff\xec\x01\xa8\x02\xf4\xff\xd7\x01\ +\xa8\x02\xfe\xff\xd7\x01\xa8\x03\x09\xffq\x01\xa8\x03\x0a\xff\ +\xd7\x01\xa8\x03\x0b\xffq\x01\xa8\x03\x0c\xff\xd7\x01\xa8\x03\ +\x11\xff\x9a\x01\xa8\x03\x12\xff\xae\x01\xa8\x03\x15\xff\xec\x01\ +\xa8\x03\x16\xff\xd7\x01\xa8\x03\x1a\xff\xd7\x01\xa8\x03\x1b\xff\ +\x9a\x01\xa8\x03\x1c\xff\xae\x01\xaa\x00\x05\xffq\x01\xaa\x00\ +\x0a\xffq\x01\xaa\x01\x9d\xff\x9a\x01\xaa\x01\xa6\xff\x9a\x01\ +\xaa\x01\xbc\xffq\x01\xaa\x01\xbe\xff\xd7\x01\xaa\x01\xc1\xff\ +\x9a\x01\xaa\x01\xc4\xff\x9a\x01\xaa\x01\xdc\xff\xd7\x01\xaa\x01\ +\xe1\xff\xd7\x01\xaa\x01\xe4\xff\xd7\x01\xaa\x02\x07\xffq\x01\ +\xaa\x02\x0b\xffq\x01\xaa\x02n\xff\xd7\x01\xaa\x02|\xff\ +\x9a\x01\xaa\x02\x80\xff\xae\x01\xaa\x02\x82\xff\xae\x01\xaa\x02\ +\x97\xff\xd7\x01\xaa\x02\x9b\xff\xd7\x01\xaa\x02\xa7\xff\xd7\x01\ +\xaa\x02\xa9\xff\x9a\x01\xaa\x02\xaa\xff\xd7\x01\xaa\x02\xb5\xff\ +q\x01\xaa\x02\xb6\xff\xd7\x01\xaa\x02\xb7\xff\x85\x01\xaa\x02\ +\xb9\xff\x85\x01\xaa\x02\xbd\xff\x9a\x01\xaa\x02\xbe\xff\xd7\x01\ +\xaa\x02\xbf\xff\x9a\x01\xaa\x02\xc0\xff\xd7\x01\xaa\x02\xc1\xff\ +\x9a\x01\xaa\x02\xc2\xff\xd7\x01\xaa\x02\xc5\xff\x9a\x01\xaa\x02\ +\xc7\xff\x9a\x01\xaa\x02\xd4\xff\x9a\x01\xaa\x02\xd5\xff\xd7\x01\ +\xaa\x02\xe1\xff\xd7\x01\xaa\x02\xe3\xff\xd7\x01\xaa\x02\xfd\xff\ +\x9a\x01\xaa\x02\xfe\xff\xd7\x01\xaa\x03\x03\xff\xd7\x01\xaa\x03\ +\x0d\xffq\x01\xaa\x03\x0e\xff\xd7\x01\xaa\x03\x0f\xffq\x01\ +\xaa\x03\x10\xff\xd7\x01\xaa\x03\x17\xff\x9a\x01\xaa\x03\x18\xff\ +\xd7\x01\xab\x00\x05\xff\xd7\x01\xab\x00\x0a\xff\xd7\x01\xab\x01\ +\xaa\xff\xec\x01\xab\x01\xc1\xff\xd7\x01\xab\x02\x07\xff\xd7\x01\ +\xab\x02\x0b\xff\xd7\x01\xab\x02r\xff\xec\x01\xab\x02|\xff\ +\xd7\x01\xab\x02\xbf\xff\xd7\x01\xab\x02\xc1\xff\xd7\x01\xab\x02\ +\xc5\xff\xd7\x01\xab\x02\xc7\xff\xd7\x01\xab\x02\xd4\xff\xd7\x01\ +\xab\x02\xd9\xff\xec\x01\xab\x02\xdb\xff\xec\x01\xab\x02\xdd\xff\ +\xec\x01\xab\x02\xfd\xff\xd7\x01\xac\x00\x0f\xff\xae\x01\xac\x00\ +\x11\xff\xae\x01\xac\x02\x08\xff\xae\x01\xac\x02\x0c\xff\xae\x01\ +\xac\x02\x80\xff\xec\x01\xac\x02\x82\xff\xec\x01\xac\x02\xb7\xff\ +\xec\x01\xac\x02\xb9\xff\xec\x01\xac\x03\x0d\xff\xd7\x01\xac\x03\ +\x0f\xff\xd7\x01\xad\x00\x0f\xff\x85\x01\xad\x00\x10\xff\xae\x01\ +\xad\x00\x11\xff\x85\x01\xad\x01\x9f\xff\xd7\x01\xad\x01\xa4\xff\ +\x9a\x01\xad\x01\xaa\xffq\x01\xad\x01\xae\xff\x9a\x01\xad\x01\ +\xb5\xff\x9a\x01\xad\x01\xb8\xff\xd7\x01\xad\x01\xbb\xff\xd7\x01\ +\xad\x01\xbc\x00)\x01\xad\x01\xbe\xff\xae\x01\xad\x01\xcc\xff\ +\x9a\x01\xad\x01\xcd\xff\x9a\x01\xad\x01\xce\xff\x85\x01\xad\x01\ +\xcf\xffq\x01\xad\x01\xd0\xff\xd7\x01\xad\x01\xd1\xff\xd7\x01\ +\xad\x01\xd2\xff\x9a\x01\xad\x01\xd3\xff\x9a\x01\xad\x01\xd4\xff\ +\x9a\x01\xad\x01\xd5\xff\x85\x01\xad\x01\xd6\xff\x9a\x01\xad\x01\ +\xd7\xff\x9a\x01\xad\x01\xd8\xffq\x01\xad\x01\xd9\xff\x9a\x01\ +\xad\x01\xda\xff\x9a\x01\xad\x01\xdb\xffq\x01\xad\x01\xdc\xff\ +\xae\x01\xad\x01\xdd\xff\xae\x01\xad\x01\xde\xffq\x01\xad\x01\ +\xdf\xff\xd7\x01\xad\x01\xe0\xff\x9a\x01\xad\x01\xe1\xff\x9a\x01\ +\xad\x01\xe2\xff\x9a\x01\xad\x01\xe3\xff\x9a\x01\xad\x01\xe4\xff\ +\xae\x01\xad\x01\xe5\xff\x9a\x01\xad\x01\xe6\xff\x9a\x01\xad\x01\ +\xe7\xff\xd7\x01\xad\x01\xe8\xff\x9a\x01\xad\x01\xe9\xff\xc3\x01\ +\xad\x01\xea\xffq\x01\xad\x01\xec\xff\x9a\x01\xad\x01\xed\xff\ +q\x01\xad\x01\xee\xff\x85\x01\xad\x01\xf2\xff\x85\x01\xad\x01\ +\xf3\xff\x9a\x01\xad\x01\xf5\xff\x9a\x01\xad\x01\xf6\xff\xae\x01\ +\xad\x01\xf7\xff\x9a\x01\xad\x01\xf9\xff\x9a\x01\xad\x02\x02\xff\ +\xae\x01\xad\x02\x03\xff\xae\x01\xad\x02\x04\xff\xae\x01\xad\x02\ +\x08\xff\x85\x01\xad\x02\x0c\xff\x85\x01\xad\x02j\xffq\x01\ +\xad\x02k\xff\x9a\x01\xad\x02l\xff\xd7\x01\xad\x02m\xff\ +\xd7\x01\xad\x02q\xff\x9a\x01\xad\x02r\xffq\x01\xad\x02\ +s\xff\x85\x01\xad\x02u\xff\x9a\x01\xad\x02w\xff\x9a\x01\ +\xad\x02y\xff\x9a\x01\xad\x02}\xff\x9a\x01\xad\x02~\xff\ +\xd7\x01\xad\x02\x7f\xffq\x01\xad\x02\x81\xff\xd7\x01\xad\x02\ +\x83\xff\xd7\x01\xad\x02\x84\xff\xd7\x01\xad\x02\x85\xffq\x01\ +\xad\x02\x86\xff\xd7\x01\xad\x02\x87\xffq\x01\xad\x02\x88\xff\ +\xd7\x01\xad\x02\x89\xffq\x01\xad\x02\x8a\xff\xd7\x01\xad\x02\ +\x8b\xff\xd7\x01\xad\x02\x8c\xff\xd7\x01\xad\x02\x8d\xffq\x01\ +\xad\x02\x96\xff\x9a\x01\xad\x02\x9a\xff\x9a\x01\xad\x02\x9e\xff\ +\x9a\x01\xad\x02\xa0\xff\xd7\x01\xad\x02\xa2\xff\xd7\x01\xad\x02\ +\xa4\xff\x9a\x01\xad\x02\xa6\xff\x9a\x01\xad\x02\xaa\xff\xae\x01\ +\xad\x02\xac\xff\x9a\x01\xad\x02\xae\xff\x9a\x01\xad\x02\xb0\xff\ +\x9a\x01\xad\x02\xb1\xff\xd7\x01\xad\x02\xb2\xffq\x01\xad\x02\ +\xb3\xff\xd7\x01\xad\x02\xb4\xffq\x01\xad\x02\xb5\x00)\x01\ +\xad\x02\xb6\xff\xae\x01\xad\x02\xb8\xff\xae\x01\xad\x02\xba\xff\ +\xae\x01\xad\x02\xbc\xff\xd7\x01\xad\x02\xbe\xff\xae\x01\xad\x02\ +\xc0\xff\x9a\x01\xad\x02\xc2\xff\x9a\x01\xad\x02\xc4\xff\x9a\x01\ +\xad\x02\xc5\xff\x9a\x01\xad\x02\xc6\xffq\x01\xad\x02\xc7\xff\ +\x9a\x01\xad\x02\xc8\xffq\x01\xad\x02\xcb\xff\xd7\x01\xad\x02\ +\xcd\xff\x9a\x01\xad\x02\xce\xff\x9a\x01\xad\x02\xcf\xff\x85\x01\ +\xad\x02\xd1\xff\x9a\x01\xad\x02\xd3\xff\x9a\x01\xad\x02\xd5\xff\ +\x9a\x01\xad\x02\xd7\xff\x9a\x01\xad\x02\xd9\xffq\x01\xad\x02\ +\xdb\xffq\x01\xad\x02\xdd\xffq\x01\xad\x02\xe0\xffq\x01\ +\xad\x02\xe6\xff\xd7\x01\xad\x02\xe8\xff\xd7\x01\xad\x02\xea\xff\ +\xc3\x01\xad\x02\xec\xff\x9a\x01\xad\x02\xee\xff\x9a\x01\xad\x02\ +\xef\xff\xd7\x01\xad\x02\xf0\xffq\x01\xad\x02\xf1\xff\xd7\x01\ +\xad\x02\xf2\xffq\x01\xad\x02\xf3\xff\xd7\x01\xad\x02\xf4\xff\ +q\x01\xad\x02\xf6\xff\xd7\x01\xad\x02\xf8\xff\xae\x01\xad\x02\ +\xfa\xff\xae\x01\xad\x02\xfc\xff\xae\x01\xad\x02\xfe\xff\x9a\x01\ +\xad\x03\x00\xff\x9a\x01\xad\x03\x02\xff\x9a\x01\xad\x03\x06\xff\ +\xd7\x01\xad\x03\x08\xff\xd7\x01\xad\x03\x09\xffq\x01\xad\x03\ +\x0a\xffq\x01\xad\x03\x0b\xffq\x01\xad\x03\x0c\xffq\x01\ +\xad\x03\x0e\xff\x9a\x01\xad\x03\x10\xff\x9a\x01\xad\x03\x11\xff\ +\x9a\x01\xad\x03\x12\xff\x85\x01\xad\x03\x14\xff\x9a\x01\xad\x03\ +\x15\xff\xd7\x01\xad\x03\x16\xffq\x01\xad\x03\x18\xff\xae\x01\ +\xad\x03\x1a\xffq\x01\xad\x03\x1b\xff\x9a\x01\xad\x03\x1c\xff\ +\x85\x01\xae\x01\xa3\x00\xe1\x01\xae\x02\xea\x00)\x01\xae\x03\ +\x0e\xff\xd7\x01\xae\x03\x10\xff\xd7\x01\xb0\x01\x9f\xff\xd7\x01\ +\xb0\x01\xb8\xff\xd7\x01\xb0\x01\xbb\xff\xd7\x01\xb0\x01\xbe\xff\ +\xd7\x01\xb0\x01\xc1\xff\xd7\x01\xb0\x01\xe1\xff\xd7\x01\xb0\x02\ +l\xff\xd7\x01\xb0\x02|\xff\xd7\x01\xb0\x02~\xff\xd7\x01\ +\xb0\x02\x84\xff\xd7\x01\xb0\x02\x86\xff\xd7\x01\xb0\x02\x88\xff\ +\xd7\x01\xb0\x02\x8a\xff\xd7\x01\xb0\x02\x8c\xff\xd7\x01\xb0\x02\ +\xb1\xff\xd7\x01\xb0\x02\xb3\xff\xd7\x01\xb0\x02\xbf\xff\xd7\x01\ +\xb0\x02\xc0\xff\xd7\x01\xb0\x02\xc1\xff\xd7\x01\xb0\x02\xc2\xff\ +\xd7\x01\xb0\x02\xc5\xff\x9a\x01\xb0\x02\xc7\xff\x9a\x01\xb0\x02\ +\xd4\xff\xd7\x01\xb0\x02\xd5\xff\xd7\x01\xb0\x02\xef\xff\xd7\x01\ +\xb0\x02\xf1\xff\xd7\x01\xb0\x02\xf3\xff\xd7\x01\xb0\x02\xfd\xff\ +\xd7\x01\xb0\x02\xfe\xff\xd7\x01\xb0\x03\x09\xff\xd7\x01\xb0\x03\ +\x0b\xff\xd7\x01\xb0\x03\x0e\xff\xd7\x01\xb0\x03\x10\xff\xd7\x01\ +\xb0\x03\x15\xff\xd7\x01\xb0\x03\x19\xff\xec\x01\xb1\x00\x0f\xff\ +\xae\x01\xb1\x00\x11\xff\xae\x01\xb1\x02\x08\xff\xae\x01\xb1\x02\ +\x0c\xff\xae\x01\xb1\x02\x80\xff\xec\x01\xb1\x02\x82\xff\xec\x01\ +\xb1\x02\xb7\xff\xec\x01\xb1\x02\xb9\xff\xec\x01\xb1\x03\x0d\xff\ +\xd7\x01\xb1\x03\x0f\xff\xd7\x01\xb4\x01\x9f\xff\xd7\x01\xb4\x01\ +\xb8\xff\xd7\x01\xb4\x01\xbb\xff\xd7\x01\xb4\x01\xbe\xff\xd7\x01\ +\xb4\x01\xc1\xff\xd7\x01\xb4\x01\xe1\xff\xd7\x01\xb4\x02l\xff\ +\xd7\x01\xb4\x02|\xff\xd7\x01\xb4\x02~\xff\xd7\x01\xb4\x02\ +\x84\xff\xd7\x01\xb4\x02\x86\xff\xd7\x01\xb4\x02\x88\xff\xd7\x01\ +\xb4\x02\x8a\xff\xd7\x01\xb4\x02\x8c\xff\xd7\x01\xb4\x02\xb1\xff\ +\xd7\x01\xb4\x02\xb3\xff\xd7\x01\xb4\x02\xbf\xff\xd7\x01\xb4\x02\ +\xc0\xff\xd7\x01\xb4\x02\xc1\xff\xd7\x01\xb4\x02\xc2\xff\xd7\x01\ +\xb4\x02\xc5\xff\x9a\x01\xb4\x02\xc7\xff\x9a\x01\xb4\x02\xd4\xff\ +\xd7\x01\xb4\x02\xd5\xff\xd7\x01\xb4\x02\xef\xff\xd7\x01\xb4\x02\ +\xf1\xff\xd7\x01\xb4\x02\xf3\xff\xd7\x01\xb4\x02\xfd\xff\xd7\x01\ +\xb4\x02\xfe\xff\xd7\x01\xb4\x03\x09\xff\xd7\x01\xb4\x03\x0b\xff\ +\xd7\x01\xb4\x03\x0e\xff\xd7\x01\xb4\x03\x10\xff\xd7\x01\xb4\x03\ +\x15\xff\xd7\x01\xb4\x03\x19\xff\xec\x01\xb8\x00\x0f\xff\xae\x01\ +\xb8\x00\x11\xff\xae\x01\xb8\x01\x9d\xff\xec\x01\xb8\x01\xa4\xff\ +\xd7\x01\xb8\x01\xa6\xff\xec\x01\xb8\x01\xa8\xff\xd7\x01\xb8\x01\ +\xaa\xff\xd7\x01\xb8\x01\xae\xff\xd7\x01\xb8\x01\xb0\xff\xd7\x01\ +\xb8\x01\xb1\xff\xec\x01\xb8\x01\xb5\xff\xd7\x01\xb8\x01\xbc\xff\ +\xc3\x01\xb8\x01\xbd\xff\xd7\x01\xb8\x01\xbf\xff\xd7\x01\xb8\x01\ +\xc1\xff\xd7\x01\xb8\x01\xc4\xff\xec\x01\xb8\x01\xc7\xff\xec\x01\ +\xb8\x01\xce\xff\xec\x01\xb8\x01\xd5\xff\xec\x01\xb8\x01\xf2\xff\ +\xec\x01\xb8\x02\x08\xff\xae\x01\xb8\x02\x0c\xff\xae\x01\xb8\x02\ +r\xff\xd7\x01\xb8\x02s\xff\xec\x01\xb8\x02z\xff\xec\x01\ +\xb8\x02|\xff\xd7\x01\xb8\x02\x80\xff\xec\x01\xb8\x02\x82\xff\ +\xec\x01\xb8\x02\x9f\xff\xd7\x01\xb8\x02\xa1\xff\xec\x01\xb8\x02\ +\xa9\xff\xec\x01\xb8\x02\xb5\xff\xc3\x01\xb8\x02\xb7\xff\xec\x01\ +\xb8\x02\xb9\xff\xec\x01\xb8\x02\xbb\xff\xd7\x01\xb8\x02\xbd\xff\ +\xec\x01\xb8\x02\xbf\xff\xd7\x01\xb8\x02\xc1\xff\xd7\x01\xb8\x02\ +\xca\xff\xd7\x01\xb8\x02\xce\xff\xd7\x01\xb8\x02\xcf\xff\xec\x01\ +\xb8\x02\xd4\xff\xd7\x01\xb8\x02\xd9\xff\xd7\x01\xb8\x02\xdb\xff\ +\xd7\x01\xb8\x02\xdd\xff\xd7\x01\xb8\x02\xe5\xff\xd7\x01\xb8\x02\ +\xe7\xff\xec\x01\xb8\x02\xf5\xff\xec\x01\xb8\x02\xf7\xff\xd7\x01\ +\xb8\x02\xf9\xff\xd7\x01\xb8\x02\xfb\xff\xd7\x01\xb8\x02\xfd\xff\ +\xd7\x01\xb8\x03\x05\xff\xd7\x01\xb8\x03\x07\xff\xd7\x01\xb8\x03\ +\x0d\xff\xd7\x01\xb8\x03\x0f\xff\xd7\x01\xb8\x03\x11\xff\xd7\x01\ +\xb8\x03\x12\xff\xec\x01\xb8\x03\x17\xff\xec\x01\xb8\x03\x1b\xff\ +\xd7\x01\xb8\x03\x1c\xff\xec\x01\xba\x00\x0f\xfe\xf6\x01\xba\x00\ +\x11\xfe\xf6\x01\xba\x01\xa4\xff\x85\x01\xba\x01\xaa\xff\x9a\x01\ +\xba\x01\xae\xff\x85\x01\xba\x01\xb0\xff\xd7\x01\xba\x01\xb5\xff\ +\x85\x01\xba\x01\xbf\xff\xd7\x01\xba\x01\xce\xff\x9a\x01\xba\x01\ +\xd5\xff\x9a\x01\xba\x01\xf2\xff\x9a\x01\xba\x02\x08\xfe\xf6\x01\ +\xba\x02\x0c\xfe\xf6\x01\xba\x02r\xff\x9a\x01\xba\x02s\xff\ +\x9a\x01\xba\x02v\xff\xec\x01\xba\x02\x9f\xff\xd7\x01\xba\x02\ +\xbb\xff\xd7\x01\xba\x02\xca\xff\xd7\x01\xba\x02\xce\xff\x85\x01\ +\xba\x02\xcf\xff\x9a\x01\xba\x02\xd9\xff\x9a\x01\xba\x02\xdb\xff\ +\x9a\x01\xba\x02\xdd\xff\x9a\x01\xba\x02\xe5\xff\xd7\x01\xba\x03\ +\x05\xff\xd7\x01\xba\x03\x07\xff\xd7\x01\xba\x03\x09\xff\xae\x01\ +\xba\x03\x0b\xff\xae\x01\xba\x03\x11\xff\x85\x01\xba\x03\x12\xff\ +\x9a\x01\xba\x03\x1b\xff\x85\x01\xba\x03\x1c\xff\x9a\x01\xbb\x01\ +\x9f\xff\xd7\x01\xbb\x01\xb8\xff\xd7\x01\xbb\x01\xbb\xff\xd7\x01\ +\xbb\x01\xbe\xff\xd7\x01\xbb\x01\xe1\xff\xd7\x01\xbb\x02l\xff\ +\xd7\x01\xbb\x02~\xff\xd7\x01\xbb\x02\x84\xff\xd7\x01\xbb\x02\ +\x86\xff\xd7\x01\xbb\x02\x88\xff\xd7\x01\xbb\x02\x8a\xff\xd7\x01\ +\xbb\x02\x8c\xff\xd7\x01\xbb\x02\xb1\xff\xd7\x01\xbb\x02\xb3\xff\ +\xd7\x01\xbb\x02\xc0\xff\xd7\x01\xbb\x02\xc2\xff\xd7\x01\xbb\x02\ +\xc5\xff\xd7\x01\xbb\x02\xc7\xff\xd7\x01\xbb\x02\xd5\xff\xd7\x01\ +\xbb\x02\xef\xff\xd7\x01\xbb\x02\xf1\xff\xd7\x01\xbb\x02\xf3\xff\ +\xd7\x01\xbb\x02\xfe\xff\xd7\x01\xbb\x03\x09\xff\xd7\x01\xbb\x03\ +\x0b\xff\xd7\x01\xbb\x03\x0e\xff\xd7\x01\xbb\x03\x10\xff\xd7\x01\ +\xbb\x03\x15\xff\xd7\x01\xbc\x00\x0f\xff\x85\x01\xbc\x00\x10\xff\ +\xae\x01\xbc\x00\x11\xff\x85\x01\xbc\x01\x9f\xff\xd7\x01\xbc\x01\ +\xa4\xff\x9a\x01\xbc\x01\xaa\xffq\x01\xbc\x01\xae\xff\x9a\x01\ +\xbc\x01\xb5\xff\x9a\x01\xbc\x01\xb8\xff\xd7\x01\xbc\x01\xbb\xff\ +\xd7\x01\xbc\x01\xbc\x00)\x01\xbc\x01\xbe\xff\xae\x01\xbc\x01\ +\xcc\xff\x9a\x01\xbc\x01\xcd\xff\x9a\x01\xbc\x01\xce\xff\x85\x01\ +\xbc\x01\xcf\xffq\x01\xbc\x01\xd0\xff\xd7\x01\xbc\x01\xd1\xff\ +\xd7\x01\xbc\x01\xd2\xff\x9a\x01\xbc\x01\xd3\xff\x9a\x01\xbc\x01\ +\xd4\xff\x9a\x01\xbc\x01\xd5\xff\x85\x01\xbc\x01\xd6\xff\x9a\x01\ +\xbc\x01\xd7\xff\x9a\x01\xbc\x01\xd8\xffq\x01\xbc\x01\xd9\xff\ +\x9a\x01\xbc\x01\xda\xff\x9a\x01\xbc\x01\xdb\xffq\x01\xbc\x01\ +\xdc\xff\xae\x01\xbc\x01\xdd\xff\xae\x01\xbc\x01\xde\xffq\x01\ +\xbc\x01\xdf\xff\xd7\x01\xbc\x01\xe0\xff\x9a\x01\xbc\x01\xe1\xff\ +\x9a\x01\xbc\x01\xe2\xff\x9a\x01\xbc\x01\xe3\xff\x9a\x01\xbc\x01\ +\xe4\xff\xae\x01\xbc\x01\xe5\xff\x9a\x01\xbc\x01\xe6\xff\x9a\x01\ +\xbc\x01\xe7\xff\xd7\x01\xbc\x01\xe8\xff\x9a\x01\xbc\x01\xe9\xff\ +\xc3\x01\xbc\x01\xea\xffq\x01\xbc\x01\xec\xff\x9a\x01\xbc\x01\ +\xed\xffq\x01\xbc\x01\xee\xff\x85\x01\xbc\x01\xf2\xff\x85\x01\ +\xbc\x01\xf3\xff\x9a\x01\xbc\x01\xf5\xff\x9a\x01\xbc\x01\xf6\xff\ +\xae\x01\xbc\x01\xf7\xff\x9a\x01\xbc\x01\xf9\xff\x9a\x01\xbc\x02\ +\x02\xff\xae\x01\xbc\x02\x03\xff\xae\x01\xbc\x02\x04\xff\xae\x01\ +\xbc\x02\x08\xff\x85\x01\xbc\x02\x0c\xff\x85\x01\xbc\x02j\xff\ +q\x01\xbc\x02k\xff\x9a\x01\xbc\x02l\xff\xd7\x01\xbc\x02\ +m\xff\xd7\x01\xbc\x02q\xff\x9a\x01\xbc\x02r\xffq\x01\ +\xbc\x02s\xff\x85\x01\xbc\x02u\xff\x9a\x01\xbc\x02w\xff\ +\x9a\x01\xbc\x02y\xff\x9a\x01\xbc\x02}\xff\x9a\x01\xbc\x02\ +~\xff\xd7\x01\xbc\x02\x7f\xffq\x01\xbc\x02\x81\xff\xd7\x01\ +\xbc\x02\x83\xff\xd7\x01\xbc\x02\x84\xff\xd7\x01\xbc\x02\x85\xff\ +q\x01\xbc\x02\x86\xff\xd7\x01\xbc\x02\x87\xffq\x01\xbc\x02\ +\x88\xff\xd7\x01\xbc\x02\x89\xffq\x01\xbc\x02\x8a\xff\xd7\x01\ +\xbc\x02\x8b\xff\xd7\x01\xbc\x02\x8c\xff\xd7\x01\xbc\x02\x8d\xff\ +q\x01\xbc\x02\x96\xff\x9a\x01\xbc\x02\x9a\xff\x9a\x01\xbc\x02\ +\x9e\xff\x9a\x01\xbc\x02\xa0\xff\xd7\x01\xbc\x02\xa2\xff\xd7\x01\ +\xbc\x02\xa4\xff\x9a\x01\xbc\x02\xa6\xff\x9a\x01\xbc\x02\xaa\xff\ +\xae\x01\xbc\x02\xac\xff\x9a\x01\xbc\x02\xae\xff\x9a\x01\xbc\x02\ +\xb0\xff\x9a\x01\xbc\x02\xb1\xff\xd7\x01\xbc\x02\xb2\xffq\x01\ +\xbc\x02\xb3\xff\xd7\x01\xbc\x02\xb4\xffq\x01\xbc\x02\xb5\x00\ +)\x01\xbc\x02\xb6\xff\xae\x01\xbc\x02\xb8\xff\xae\x01\xbc\x02\ +\xba\xff\xae\x01\xbc\x02\xbc\xff\xd7\x01\xbc\x02\xbe\xff\xae\x01\ +\xbc\x02\xc0\xff\x9a\x01\xbc\x02\xc2\xff\x9a\x01\xbc\x02\xc4\xff\ +\x9a\x01\xbc\x02\xc5\xff\x9a\x01\xbc\x02\xc6\xffq\x01\xbc\x02\ +\xc7\xff\x9a\x01\xbc\x02\xc8\xffq\x01\xbc\x02\xcb\xff\xd7\x01\ +\xbc\x02\xcd\xff\x9a\x01\xbc\x02\xce\xff\x9a\x01\xbc\x02\xcf\xff\ +\x85\x01\xbc\x02\xd1\xff\x9a\x01\xbc\x02\xd3\xff\x9a\x01\xbc\x02\ +\xd5\xff\x9a\x01\xbc\x02\xd7\xff\x9a\x01\xbc\x02\xd9\xffq\x01\ +\xbc\x02\xdb\xffq\x01\xbc\x02\xdd\xffq\x01\xbc\x02\xe0\xff\ +q\x01\xbc\x02\xe6\xff\xd7\x01\xbc\x02\xe8\xff\xd7\x01\xbc\x02\ +\xea\xff\xc3\x01\xbc\x02\xec\xff\x9a\x01\xbc\x02\xee\xff\x9a\x01\ +\xbc\x02\xef\xff\xd7\x01\xbc\x02\xf0\xffq\x01\xbc\x02\xf1\xff\ +\xd7\x01\xbc\x02\xf2\xffq\x01\xbc\x02\xf3\xff\xd7\x01\xbc\x02\ +\xf4\xffq\x01\xbc\x02\xf6\xff\xd7\x01\xbc\x02\xf8\xff\xae\x01\ +\xbc\x02\xfa\xff\xae\x01\xbc\x02\xfc\xff\xae\x01\xbc\x02\xfe\xff\ +\x9a\x01\xbc\x03\x00\xff\x9a\x01\xbc\x03\x02\xff\x9a\x01\xbc\x03\ +\x06\xff\xd7\x01\xbc\x03\x08\xff\xd7\x01\xbc\x03\x09\xffq\x01\ +\xbc\x03\x0a\xffq\x01\xbc\x03\x0b\xffq\x01\xbc\x03\x0c\xff\ +q\x01\xbc\x03\x0e\xff\x9a\x01\xbc\x03\x10\xff\x9a\x01\xbc\x03\ +\x11\xff\x9a\x01\xbc\x03\x12\xff\x85\x01\xbc\x03\x14\xff\x9a\x01\ +\xbc\x03\x15\xff\xd7\x01\xbc\x03\x16\xffq\x01\xbc\x03\x18\xff\ +\xae\x01\xbc\x03\x1a\xffq\x01\xbc\x03\x1b\xff\x9a\x01\xbc\x03\ +\x1c\xff\x85\x01\xbd\x00\x0f\xff\x85\x01\xbd\x00\x11\xff\x85\x01\ +\xbd\x01\x9f\xff\xec\x01\xbd\x01\xa4\xff\x9a\x01\xbd\x01\xaa\xff\ +q\x01\xbd\x01\xae\xff\x9a\x01\xbd\x01\xb5\xff\x9a\x01\xbd\x01\ +\xb8\xff\xec\x01\xbd\x01\xbb\xff\xec\x01\xbd\x01\xbe\xff\xc3\x01\ +\xbd\x01\xc9\xff\xec\x01\xbd\x01\xce\xff\xae\x01\xbd\x01\xcf\xff\ +\xd7\x01\xbd\x01\xd5\xff\xae\x01\xbd\x01\xd8\xff\xd7\x01\xbd\x01\ +\xdb\xff\xd7\x01\xbd\x01\xde\xff\xd7\x01\xbd\x01\xe1\xff\xd7\x01\ +\xbd\x01\xea\xff\xd7\x01\xbd\x01\xeb\x00f\x01\xbd\x01\xed\xff\ +\xd7\x01\xbd\x01\xee\xff\xec\x01\xbd\x01\xf2\xff\xae\x01\xbd\x01\ +\xf4\x00f\x01\xbd\x02\x08\xff\x85\x01\xbd\x02\x0c\xff\x85\x01\ +\xbd\x02j\xff\xd7\x01\xbd\x02l\xff\xec\x01\xbd\x02r\xff\ +q\x01\xbd\x02s\xff\xae\x01\xbd\x02~\xff\xec\x01\xbd\x02\ +\x7f\xff\xd7\x01\xbd\x02\x84\xff\xec\x01\xbd\x02\x85\xff\xd7\x01\ +\xbd\x02\x86\xff\xec\x01\xbd\x02\x87\xff\xd7\x01\xbd\x02\x88\xff\ +\xec\x01\xbd\x02\x89\xff\xd7\x01\xbd\x02\x8a\xff\xec\x01\xbd\x02\ +\x8c\xff\xec\x01\xbd\x02\x8d\xff\xd7\x01\xbd\x02\x98\x00f\x01\ +\xbd\x02\xa8\x00f\x01\xbd\x02\xb1\xff\xec\x01\xbd\x02\xb2\xff\ +\xd7\x01\xbd\x02\xb3\xff\xec\x01\xbd\x02\xb4\xff\xd7\x01\xbd\x02\ +\xc0\xff\xd7\x01\xbd\x02\xc2\xff\xd7\x01\xbd\x02\xc5\xff\xd7\x01\ +\xbd\x02\xc6\xff\xc3\x01\xbd\x02\xc7\xff\xd7\x01\xbd\x02\xc8\xff\ +\xc3\x01\xbd\x02\xce\xff\x9a\x01\xbd\x02\xcf\xff\xae\x01\xbd\x02\ +\xd5\xff\xd7\x01\xbd\x02\xd9\xffq\x01\xbd\x02\xdb\xffq\x01\ +\xbd\x02\xdd\xffq\x01\xbd\x02\xe0\xff\xd7\x01\xbd\x02\xef\xff\ +\xec\x01\xbd\x02\xf0\xff\xd7\x01\xbd\x02\xf1\xff\xec\x01\xbd\x02\ +\xf2\xff\xd7\x01\xbd\x02\xf3\xff\xec\x01\xbd\x02\xf4\xff\xd7\x01\ +\xbd\x02\xfe\xff\xd7\x01\xbd\x03\x09\xffq\x01\xbd\x03\x0a\xff\ +\xd7\x01\xbd\x03\x0b\xffq\x01\xbd\x03\x0c\xff\xd7\x01\xbd\x03\ +\x11\xff\x9a\x01\xbd\x03\x12\xff\xae\x01\xbd\x03\x15\xff\xec\x01\ +\xbd\x03\x16\xff\xd7\x01\xbd\x03\x1a\xff\xd7\x01\xbd\x03\x1b\xff\ +\x9a\x01\xbd\x03\x1c\xff\xae\x01\xbe\x00\x0f\xff\xae\x01\xbe\x00\ +\x11\xff\xae\x01\xbe\x01\x9d\xff\xd7\x01\xbe\x01\xa4\xff\xd7\x01\ +\xbe\x01\xa6\xff\xd7\x01\xbe\x01\xa8\xff\xc3\x01\xbe\x01\xaa\xff\ +\xd7\x01\xbe\x01\xae\xff\xd7\x01\xbe\x01\xb0\xff\xd7\x01\xbe\x01\ +\xb1\xff\xd7\x01\xbe\x01\xb5\xff\xd7\x01\xbe\x01\xbc\xff\xc3\x01\ +\xbe\x01\xbd\xff\xc3\x01\xbe\x01\xbf\xff\xd7\x01\xbe\x01\xc4\xff\ +\xd7\x01\xbe\x01\xc7\xff\xd7\x01\xbe\x01\xce\xff\xec\x01\xbe\x01\ +\xd5\xff\xec\x01\xbe\x01\xf2\xff\xec\x01\xbe\x02\x08\xff\xae\x01\ +\xbe\x02\x0c\xff\xae\x01\xbe\x02r\xff\xd7\x01\xbe\x02s\xff\ +\xec\x01\xbe\x02z\xff\xd7\x01\xbe\x02\x80\xff\xec\x01\xbe\x02\ +\x82\xff\xec\x01\xbe\x02\x9f\xff\xd7\x01\xbe\x02\xa1\xff\xd7\x01\ +\xbe\x02\xa9\xff\xd7\x01\xbe\x02\xb5\xff\xc3\x01\xbe\x02\xb7\xff\ +\xc3\x01\xbe\x02\xb9\xff\xc3\x01\xbe\x02\xbb\xff\xd7\x01\xbe\x02\ +\xbd\xff\xd7\x01\xbe\x02\xca\xff\xd7\x01\xbe\x02\xce\xff\xd7\x01\ +\xbe\x02\xcf\xff\xec\x01\xbe\x02\xd9\xff\xd7\x01\xbe\x02\xdb\xff\ +\xd7\x01\xbe\x02\xdd\xff\xd7\x01\xbe\x02\xe5\xff\xd7\x01\xbe\x02\ +\xe7\xff\xd7\x01\xbe\x02\xf5\xff\xd7\x01\xbe\x02\xf7\xff\xc3\x01\ +\xbe\x02\xf9\xff\xc3\x01\xbe\x02\xfb\xff\xc3\x01\xbe\x03\x05\xff\ +\xd7\x01\xbe\x03\x07\xff\xd7\x01\xbe\x03\x0d\xff\xd7\x01\xbe\x03\ +\x0f\xff\xd7\x01\xbe\x03\x11\xff\xd7\x01\xbe\x03\x12\xff\xec\x01\ +\xbe\x03\x17\xff\xd7\x01\xbe\x03\x1b\xff\xd7\x01\xbe\x03\x1c\xff\ +\xec\x01\xbf\x01\x9f\xff\xd7\x01\xbf\x01\xb8\xff\xd7\x01\xbf\x01\ +\xbb\xff\xd7\x01\xbf\x01\xbe\xff\xd7\x01\xbf\x01\xc1\xff\xd7\x01\ +\xbf\x01\xe1\xff\xd7\x01\xbf\x02l\xff\xd7\x01\xbf\x02|\xff\ +\xd7\x01\xbf\x02~\xff\xd7\x01\xbf\x02\x84\xff\xd7\x01\xbf\x02\ +\x86\xff\xd7\x01\xbf\x02\x88\xff\xd7\x01\xbf\x02\x8a\xff\xd7\x01\ +\xbf\x02\x8c\xff\xd7\x01\xbf\x02\xb1\xff\xd7\x01\xbf\x02\xb3\xff\ +\xd7\x01\xbf\x02\xbf\xff\xd7\x01\xbf\x02\xc0\xff\xd7\x01\xbf\x02\ +\xc1\xff\xd7\x01\xbf\x02\xc2\xff\xd7\x01\xbf\x02\xc5\xff\x9a\x01\ +\xbf\x02\xc7\xff\x9a\x01\xbf\x02\xd4\xff\xd7\x01\xbf\x02\xd5\xff\ +\xd7\x01\xbf\x02\xef\xff\xd7\x01\xbf\x02\xf1\xff\xd7\x01\xbf\x02\ +\xf3\xff\xd7\x01\xbf\x02\xfd\xff\xd7\x01\xbf\x02\xfe\xff\xd7\x01\ +\xbf\x03\x09\xff\xd7\x01\xbf\x03\x0b\xff\xd7\x01\xbf\x03\x0e\xff\ +\xd7\x01\xbf\x03\x10\xff\xd7\x01\xbf\x03\x15\xff\xd7\x01\xbf\x03\ +\x19\xff\xec\x01\xc0\x01\xa3\x00\xe1\x01\xc0\x02\xea\x00)\x01\ +\xc0\x03\x0e\xff\xd7\x01\xc0\x03\x10\xff\xd7\x01\xc3\x01\xa3\x00\ +\xe1\x01\xc3\x02\xea\x00)\x01\xc3\x03\x0e\xff\xd7\x01\xc3\x03\ +\x10\xff\xd7\x01\xc4\x00\x05\xff\xae\x01\xc4\x00\x0a\xff\xae\x01\ +\xc4\x01\x9d\xff\x85\x01\xc4\x01\xa6\xff\x85\x01\xc4\x01\xa8\xff\ +\xd7\x01\xc4\x01\xbc\xff\x9a\x01\xc4\x01\xbd\xff\xd7\x01\xc4\x01\ +\xc1\xff\x9a\x01\xc4\x01\xc4\xff\x85\x01\xc4\x01\xdc\xff\xd7\x01\ +\xc4\x01\xdd\xff\xd7\x01\xc4\x01\xe1\xff\xd7\x01\xc4\x01\xe4\xff\ +\xd7\x01\xc4\x01\xf6\xff\xd7\x01\xc4\x02\x07\xff\xae\x01\xc4\x02\ +\x0b\xff\xae\x01\xc4\x02n\xff\xae\x01\xc4\x02|\xff\x9a\x01\ +\xc4\x02\x80\xff\xae\x01\xc4\x02\x82\xff\xae\x01\xc4\x02\x97\xff\ +\xae\x01\xc4\x02\x9b\xff\xae\x01\xc4\x02\xa7\xff\xae\x01\xc4\x02\ +\xa9\xff\x85\x01\xc4\x02\xaa\xff\xd7\x01\xc4\x02\xb5\xff\x9a\x01\ +\xc4\x02\xb6\xff\xd7\x01\xc4\x02\xb7\xff\x9a\x01\xc4\x02\xb8\xff\ +\xd7\x01\xc4\x02\xb9\xff\x9a\x01\xc4\x02\xba\xff\xd7\x01\xc4\x02\ +\xbd\xff\x85\x01\xc4\x02\xbe\xff\xd7\x01\xc4\x02\xbf\xff\x9a\x01\ +\xc4\x02\xc0\xff\xd7\x01\xc4\x02\xc1\xff\x9a\x01\xc4\x02\xc2\xff\ +\xd7\x01\xc4\x02\xd4\xff\x9a\x01\xc4\x02\xd5\xff\xd7\x01\xc4\x02\ +\xf7\xff\xd7\x01\xc4\x02\xf8\xff\xd7\x01\xc4\x02\xf9\xff\xd7\x01\ +\xc4\x02\xfa\xff\xd7\x01\xc4\x02\xfb\xff\xd7\x01\xc4\x02\xfc\xff\ +\xd7\x01\xc4\x02\xfd\xff\x9a\x01\xc4\x02\xfe\xff\xd7\x01\xc4\x03\ +\x03\xff\xae\x01\xc4\x03\x0d\xff\x9a\x01\xc4\x03\x0e\xff\xc3\x01\ +\xc4\x03\x0f\xff\x9a\x01\xc4\x03\x10\xff\xc3\x01\xc4\x03\x17\xff\ +\x85\x01\xc4\x03\x18\xff\xd7\x01\xc6\x00\x05\xff\xae\x01\xc6\x00\ +\x0a\xff\xae\x01\xc6\x01\x9d\xff\x85\x01\xc6\x01\xa6\xff\x85\x01\ +\xc6\x01\xa8\xff\xd7\x01\xc6\x01\xbc\xff\x9a\x01\xc6\x01\xbd\xff\ +\xd7\x01\xc6\x01\xc1\xff\x9a\x01\xc6\x01\xc4\xff\x85\x01\xc6\x01\ +\xdc\xff\xd7\x01\xc6\x01\xdd\xff\xd7\x01\xc6\x01\xe1\xff\xd7\x01\ +\xc6\x01\xe4\xff\xd7\x01\xc6\x01\xf6\xff\xd7\x01\xc6\x02\x07\xff\ +\xae\x01\xc6\x02\x0b\xff\xae\x01\xc6\x02n\xff\xae\x01\xc6\x02\ +|\xff\x9a\x01\xc6\x02\x80\xff\xae\x01\xc6\x02\x82\xff\xae\x01\ +\xc6\x02\x97\xff\xae\x01\xc6\x02\x9b\xff\xae\x01\xc6\x02\xa7\xff\ +\xae\x01\xc6\x02\xa9\xff\x85\x01\xc6\x02\xaa\xff\xd7\x01\xc6\x02\ +\xb5\xff\x9a\x01\xc6\x02\xb6\xff\xd7\x01\xc6\x02\xb7\xff\x9a\x01\ +\xc6\x02\xb8\xff\xd7\x01\xc6\x02\xb9\xff\x9a\x01\xc6\x02\xba\xff\ +\xd7\x01\xc6\x02\xbd\xff\x85\x01\xc6\x02\xbe\xff\xd7\x01\xc6\x02\ +\xbf\xff\x9a\x01\xc6\x02\xc0\xff\xd7\x01\xc6\x02\xc1\xff\x9a\x01\ +\xc6\x02\xc2\xff\xd7\x01\xc6\x02\xd4\xff\x9a\x01\xc6\x02\xd5\xff\ +\xd7\x01\xc6\x02\xf7\xff\xd7\x01\xc6\x02\xf8\xff\xd7\x01\xc6\x02\ +\xf9\xff\xd7\x01\xc6\x02\xfa\xff\xd7\x01\xc6\x02\xfb\xff\xd7\x01\ +\xc6\x02\xfc\xff\xd7\x01\xc6\x02\xfd\xff\x9a\x01\xc6\x02\xfe\xff\ +\xd7\x01\xc6\x03\x03\xff\xae\x01\xc6\x03\x0d\xff\x9a\x01\xc6\x03\ +\x0e\xff\xc3\x01\xc6\x03\x0f\xff\x9a\x01\xc6\x03\x10\xff\xc3\x01\ +\xc6\x03\x17\xff\x85\x01\xc6\x03\x18\xff\xd7\x01\xc7\x00\x0f\xff\ +\xae\x01\xc7\x00\x11\xff\xae\x01\xc7\x01\x9d\xff\xec\x01\xc7\x01\ +\xa4\xff\xd7\x01\xc7\x01\xa6\xff\xec\x01\xc7\x01\xa8\xff\xd7\x01\ +\xc7\x01\xaa\xff\xd7\x01\xc7\x01\xae\xff\xd7\x01\xc7\x01\xb0\xff\ +\xd7\x01\xc7\x01\xb1\xff\xec\x01\xc7\x01\xb5\xff\xd7\x01\xc7\x01\ +\xbc\xff\xc3\x01\xc7\x01\xbd\xff\xd7\x01\xc7\x01\xbf\xff\xd7\x01\ +\xc7\x01\xc1\xff\xd7\x01\xc7\x01\xc4\xff\xec\x01\xc7\x01\xc7\xff\ +\xec\x01\xc7\x01\xce\xff\xec\x01\xc7\x01\xd5\xff\xec\x01\xc7\x01\ +\xf2\xff\xec\x01\xc7\x02\x08\xff\xae\x01\xc7\x02\x0c\xff\xae\x01\ +\xc7\x02r\xff\xd7\x01\xc7\x02s\xff\xec\x01\xc7\x02z\xff\ +\xec\x01\xc7\x02|\xff\xd7\x01\xc7\x02\x80\xff\xec\x01\xc7\x02\ +\x82\xff\xec\x01\xc7\x02\x9f\xff\xd7\x01\xc7\x02\xa1\xff\xec\x01\ +\xc7\x02\xa9\xff\xec\x01\xc7\x02\xb5\xff\xc3\x01\xc7\x02\xb7\xff\ +\xec\x01\xc7\x02\xb9\xff\xec\x01\xc7\x02\xbb\xff\xd7\x01\xc7\x02\ +\xbd\xff\xec\x01\xc7\x02\xbf\xff\xd7\x01\xc7\x02\xc1\xff\xd7\x01\ +\xc7\x02\xca\xff\xd7\x01\xc7\x02\xce\xff\xd7\x01\xc7\x02\xcf\xff\ +\xec\x01\xc7\x02\xd4\xff\xd7\x01\xc7\x02\xd9\xff\xd7\x01\xc7\x02\ +\xdb\xff\xd7\x01\xc7\x02\xdd\xff\xd7\x01\xc7\x02\xe5\xff\xd7\x01\ +\xc7\x02\xe7\xff\xec\x01\xc7\x02\xf5\xff\xec\x01\xc7\x02\xf7\xff\ +\xd7\x01\xc7\x02\xf9\xff\xd7\x01\xc7\x02\xfb\xff\xd7\x01\xc7\x02\ +\xfd\xff\xd7\x01\xc7\x03\x05\xff\xd7\x01\xc7\x03\x07\xff\xd7\x01\ +\xc7\x03\x0d\xff\xd7\x01\xc7\x03\x0f\xff\xd7\x01\xc7\x03\x11\xff\ +\xd7\x01\xc7\x03\x12\xff\xec\x01\xc7\x03\x17\xff\xec\x01\xc7\x03\ +\x1b\xff\xd7\x01\xc7\x03\x1c\xff\xec\x01\xc8\x00\x0f\xff\xae\x01\ +\xc8\x00\x11\xff\xae\x01\xc8\x01\x9d\xff\xec\x01\xc8\x01\xa4\xff\ +\xd7\x01\xc8\x01\xa6\xff\xec\x01\xc8\x01\xa8\xff\xd7\x01\xc8\x01\ +\xaa\xff\xd7\x01\xc8\x01\xae\xff\xd7\x01\xc8\x01\xb0\xff\xd7\x01\ +\xc8\x01\xb1\xff\xec\x01\xc8\x01\xb5\xff\xd7\x01\xc8\x01\xbc\xff\ +\xc3\x01\xc8\x01\xbd\xff\xd7\x01\xc8\x01\xbf\xff\xd7\x01\xc8\x01\ +\xc1\xff\xd7\x01\xc8\x01\xc4\xff\xec\x01\xc8\x01\xc7\xff\xec\x01\ +\xc8\x01\xce\xff\xec\x01\xc8\x01\xd5\xff\xec\x01\xc8\x01\xf2\xff\ +\xec\x01\xc8\x02\x08\xff\xae\x01\xc8\x02\x0c\xff\xae\x01\xc8\x02\ +r\xff\xd7\x01\xc8\x02s\xff\xec\x01\xc8\x02z\xff\xec\x01\ +\xc8\x02|\xff\xd7\x01\xc8\x02\x80\xff\xec\x01\xc8\x02\x82\xff\ +\xec\x01\xc8\x02\x9f\xff\xd7\x01\xc8\x02\xa1\xff\xec\x01\xc8\x02\ +\xa9\xff\xec\x01\xc8\x02\xb5\xff\xc3\x01\xc8\x02\xb7\xff\xec\x01\ +\xc8\x02\xb9\xff\xec\x01\xc8\x02\xbb\xff\xd7\x01\xc8\x02\xbd\xff\ +\xec\x01\xc8\x02\xbf\xff\xd7\x01\xc8\x02\xc1\xff\xd7\x01\xc8\x02\ +\xca\xff\xd7\x01\xc8\x02\xce\xff\xd7\x01\xc8\x02\xcf\xff\xec\x01\ +\xc8\x02\xd4\xff\xd7\x01\xc8\x02\xd9\xff\xd7\x01\xc8\x02\xdb\xff\ +\xd7\x01\xc8\x02\xdd\xff\xd7\x01\xc8\x02\xe5\xff\xd7\x01\xc8\x02\ +\xe7\xff\xec\x01\xc8\x02\xf5\xff\xec\x01\xc8\x02\xf7\xff\xd7\x01\ +\xc8\x02\xf9\xff\xd7\x01\xc8\x02\xfb\xff\xd7\x01\xc8\x02\xfd\xff\ +\xd7\x01\xc8\x03\x05\xff\xd7\x01\xc8\x03\x07\xff\xd7\x01\xc8\x03\ +\x0d\xff\xd7\x01\xc8\x03\x0f\xff\xd7\x01\xc8\x03\x11\xff\xd7\x01\ +\xc8\x03\x12\xff\xec\x01\xc8\x03\x17\xff\xec\x01\xc8\x03\x1b\xff\ +\xd7\x01\xc8\x03\x1c\xff\xec\x01\xca\x00\x05\xff\xec\x01\xca\x00\ +\x0a\xff\xec\x01\xca\x02\x07\xff\xec\x01\xca\x02\x0b\xff\xec\x01\ +\xcc\x01\xe9\x00)\x01\xcd\x00\x0f\xff\x9a\x01\xcd\x00\x10\xff\ +\xd7\x01\xcd\x00\x11\xff\x9a\x01\xcd\x01\xce\xff\xc3\x01\xcd\x01\ +\xcf\xff\xec\x01\xcd\x01\xd5\xff\xc3\x01\xcd\x01\xd8\xff\xec\x01\ +\xcd\x01\xdb\xff\xec\x01\xcd\x01\xde\xff\xec\x01\xcd\x01\xea\xff\ +\xec\x01\xcd\x01\xed\xff\xec\x01\xcd\x01\xf2\xff\xc3\x01\xcd\x02\ +\x02\xff\xd7\x01\xcd\x02\x03\xff\xd7\x01\xcd\x02\x04\xff\xd7\x01\ +\xcd\x02\x08\xff\x9a\x01\xcd\x02\x0c\xff\x9a\x01\xcd\x02j\xff\ +\xec\x01\xcd\x02s\xff\xc3\x01\xcd\x02\x7f\xff\xec\x01\xcd\x02\ +\x85\xff\xec\x01\xcd\x02\x87\xff\xec\x01\xcd\x02\x89\xff\xec\x01\ +\xcd\x02\x8d\xff\xec\x01\xcd\x02\xb2\xff\xec\x01\xcd\x02\xb4\xff\ +\xec\x01\xcd\x02\xcf\xff\xc3\x01\xcd\x02\xe0\xff\xec\x01\xcd\x02\ +\xf0\xff\xec\x01\xcd\x02\xf2\xff\xec\x01\xcd\x02\xf4\xff\xec\x01\ +\xcd\x03\x0a\xff\xec\x01\xcd\x03\x0c\xff\xec\x01\xcd\x03\x12\xff\ +\xc3\x01\xcd\x03\x16\xff\xec\x01\xcd\x03\x1a\xff\xec\x01\xcd\x03\ +\x1c\xff\xc3\x01\xce\x00\x05\xff\xec\x01\xce\x00\x0a\xff\xec\x01\ +\xce\x02\x07\xff\xec\x01\xce\x02\x0b\xff\xec\x01\xcf\x00\x05\xff\ +\xec\x01\xcf\x00\x0a\xff\xec\x01\xcf\x02\x07\xff\xec\x01\xcf\x02\ +\x0b\xff\xec\x01\xd0\x01\xcf\xff\xd7\x01\xd0\x01\xd8\xff\xd7\x01\ +\xd0\x01\xdb\xff\xd7\x01\xd0\x01\xde\xff\xd7\x01\xd0\x01\xe1\xff\ +\xd7\x01\xd0\x01\xea\xff\xd7\x01\xd0\x01\xed\xff\xd7\x01\xd0\x02\ +j\xff\xd7\x01\xd0\x02\x7f\xff\xd7\x01\xd0\x02\x85\xff\xd7\x01\ +\xd0\x02\x87\xff\xd7\x01\xd0\x02\x89\xff\xd7\x01\xd0\x02\x8d\xff\ +\xd7\x01\xd0\x02\xb2\xff\xd7\x01\xd0\x02\xb4\xff\xd7\x01\xd0\x02\ +\xc0\xff\xd7\x01\xd0\x02\xc2\xff\xd7\x01\xd0\x02\xc6\xff\xd7\x01\ +\xd0\x02\xc8\xff\xd7\x01\xd0\x02\xd5\xff\xd7\x01\xd0\x02\xe0\xff\ +\xd7\x01\xd0\x02\xf0\xff\xd7\x01\xd0\x02\xf2\xff\xd7\x01\xd0\x02\ +\xf4\xff\xd7\x01\xd0\x02\xfe\xff\xd7\x01\xd0\x03\x0a\xff\xd7\x01\ +\xd0\x03\x0c\xff\xd7\x01\xd0\x03\x16\xff\xd7\x01\xd0\x03\x1a\xff\ +\xd7\x01\xd1\x01\xe9\x00)\x01\xd4\x01\xcf\xff\xd7\x01\xd4\x01\ +\xd8\xff\xd7\x01\xd4\x01\xdb\xff\xd7\x01\xd4\x01\xde\xff\xd7\x01\ +\xd4\x01\xe1\xff\xd7\x01\xd4\x01\xea\xff\xd7\x01\xd4\x01\xed\xff\ +\xd7\x01\xd4\x02j\xff\xd7\x01\xd4\x02\x7f\xff\xd7\x01\xd4\x02\ +\x85\xff\xd7\x01\xd4\x02\x87\xff\xd7\x01\xd4\x02\x89\xff\xd7\x01\ +\xd4\x02\x8d\xff\xd7\x01\xd4\x02\xb2\xff\xd7\x01\xd4\x02\xb4\xff\ +\xd7\x01\xd4\x02\xc0\xff\xd7\x01\xd4\x02\xc2\xff\xd7\x01\xd4\x02\ +\xc6\xff\xd7\x01\xd4\x02\xc8\xff\xd7\x01\xd4\x02\xd5\xff\xd7\x01\ +\xd4\x02\xe0\xff\xd7\x01\xd4\x02\xf0\xff\xd7\x01\xd4\x02\xf2\xff\ +\xd7\x01\xd4\x02\xf4\xff\xd7\x01\xd4\x02\xfe\xff\xd7\x01\xd4\x03\ +\x0a\xff\xd7\x01\xd4\x03\x0c\xff\xd7\x01\xd4\x03\x16\xff\xd7\x01\ +\xd4\x03\x1a\xff\xd7\x01\xd8\x00\x05\xff\xec\x01\xd8\x00\x0a\xff\ +\xec\x01\xd8\x01\xd0\xff\xd7\x01\xd8\x01\xdc\xff\xec\x01\xd8\x01\ +\xdd\xff\xec\x01\xd8\x01\xdf\xff\xd7\x01\xd8\x01\xe1\xff\xec\x01\ +\xd8\x01\xe4\xff\xec\x01\xd8\x01\xf6\xff\xec\x01\xd8\x02\x07\xff\ +\xec\x01\xd8\x02\x0b\xff\xec\x01\xd8\x02\xa0\xff\xd7\x01\xd8\x02\ +\xaa\xff\xec\x01\xd8\x02\xb6\xff\xec\x01\xd8\x02\xbc\xff\xd7\x01\ +\xd8\x02\xbe\xff\xec\x01\xd8\x02\xc0\xff\xec\x01\xd8\x02\xc2\xff\ +\xec\x01\xd8\x02\xcb\xff\xd7\x01\xd8\x02\xd5\xff\xec\x01\xd8\x02\ +\xe6\xff\xd7\x01\xd8\x02\xf8\xff\xec\x01\xd8\x02\xfa\xff\xec\x01\ +\xd8\x02\xfc\xff\xec\x01\xd8\x02\xfe\xff\xec\x01\xd8\x03\x06\xff\ +\xd7\x01\xd8\x03\x08\xff\xd7\x01\xd8\x03\x0e\xff\xec\x01\xd8\x03\ +\x10\xff\xec\x01\xd8\x03\x18\xff\xec\x01\xda\x00\x05\xff\xec\x01\ +\xda\x00\x0a\xff\xec\x01\xda\x01\xd0\xff\xd7\x01\xda\x01\xdc\xff\ +\xec\x01\xda\x01\xdd\xff\xec\x01\xda\x01\xdf\xff\xd7\x01\xda\x01\ +\xe1\xff\xec\x01\xda\x01\xe4\xff\xec\x01\xda\x01\xf6\xff\xec\x01\ +\xda\x02\x07\xff\xec\x01\xda\x02\x0b\xff\xec\x01\xda\x02\xa0\xff\ +\xd7\x01\xda\x02\xaa\xff\xec\x01\xda\x02\xb6\xff\xec\x01\xda\x02\ +\xbc\xff\xd7\x01\xda\x02\xbe\xff\xec\x01\xda\x02\xc0\xff\xec\x01\ +\xda\x02\xc2\xff\xec\x01\xda\x02\xcb\xff\xd7\x01\xda\x02\xd5\xff\ +\xec\x01\xda\x02\xe6\xff\xd7\x01\xda\x02\xf8\xff\xec\x01\xda\x02\ +\xfa\xff\xec\x01\xda\x02\xfc\xff\xec\x01\xda\x02\xfe\xff\xec\x01\ +\xda\x03\x06\xff\xd7\x01\xda\x03\x08\xff\xd7\x01\xda\x03\x0e\xff\ +\xec\x01\xda\x03\x10\xff\xec\x01\xda\x03\x18\xff\xec\x01\xdc\x00\ +\x0f\xff\x9a\x01\xdc\x00\x10\xff\xd7\x01\xdc\x00\x11\xff\x9a\x01\ +\xdc\x01\xce\xff\xc3\x01\xdc\x01\xcf\xff\xec\x01\xdc\x01\xd5\xff\ +\xc3\x01\xdc\x01\xd8\xff\xec\x01\xdc\x01\xdb\xff\xec\x01\xdc\x01\ +\xde\xff\xec\x01\xdc\x01\xea\xff\xec\x01\xdc\x01\xed\xff\xec\x01\ +\xdc\x01\xf2\xff\xc3\x01\xdc\x02\x02\xff\xd7\x01\xdc\x02\x03\xff\ +\xd7\x01\xdc\x02\x04\xff\xd7\x01\xdc\x02\x08\xff\x9a\x01\xdc\x02\ +\x0c\xff\x9a\x01\xdc\x02j\xff\xec\x01\xdc\x02s\xff\xc3\x01\ +\xdc\x02\x7f\xff\xec\x01\xdc\x02\x85\xff\xec\x01\xdc\x02\x87\xff\ +\xec\x01\xdc\x02\x89\xff\xec\x01\xdc\x02\x8d\xff\xec\x01\xdc\x02\ +\xb2\xff\xec\x01\xdc\x02\xb4\xff\xec\x01\xdc\x02\xcf\xff\xc3\x01\ +\xdc\x02\xe0\xff\xec\x01\xdc\x02\xf0\xff\xec\x01\xdc\x02\xf2\xff\ +\xec\x01\xdc\x02\xf4\xff\xec\x01\xdc\x03\x0a\xff\xec\x01\xdc\x03\ +\x0c\xff\xec\x01\xdc\x03\x12\xff\xc3\x01\xdc\x03\x16\xff\xec\x01\ +\xdc\x03\x1a\xff\xec\x01\xdc\x03\x1c\xff\xc3\x01\xdd\x00\x0f\xff\ +\xae\x01\xdd\x00\x11\xff\xae\x01\xdd\x01\xce\xff\xd7\x01\xdd\x01\ +\xd5\xff\xd7\x01\xdd\x01\xf2\xff\xd7\x01\xdd\x02\x08\xff\xae\x01\ +\xdd\x02\x0c\xff\xae\x01\xdd\x02s\xff\xd7\x01\xdd\x02\xcf\xff\ +\xd7\x01\xdd\x03\x12\xff\xd7\x01\xdd\x03\x1c\xff\xd7\x01\xde\x00\ +\x05\xff\xec\x01\xde\x00\x0a\xff\xec\x01\xde\x01\xd0\xff\xd7\x01\ +\xde\x01\xdc\xff\xec\x01\xde\x01\xdd\xff\xec\x01\xde\x01\xdf\xff\ +\xd7\x01\xde\x01\xe1\xff\xec\x01\xde\x01\xe4\xff\xec\x01\xde\x01\ +\xf6\xff\xec\x01\xde\x02\x07\xff\xec\x01\xde\x02\x0b\xff\xec\x01\ +\xde\x02\xa0\xff\xd7\x01\xde\x02\xaa\xff\xec\x01\xde\x02\xb6\xff\ +\xec\x01\xde\x02\xbc\xff\xd7\x01\xde\x02\xbe\xff\xec\x01\xde\x02\ +\xc0\xff\xec\x01\xde\x02\xc2\xff\xec\x01\xde\x02\xcb\xff\xd7\x01\ +\xde\x02\xd5\xff\xec\x01\xde\x02\xe6\xff\xd7\x01\xde\x02\xf8\xff\ +\xec\x01\xde\x02\xfa\xff\xec\x01\xde\x02\xfc\xff\xec\x01\xde\x02\ +\xfe\xff\xec\x01\xde\x03\x06\xff\xd7\x01\xde\x03\x08\xff\xd7\x01\ +\xde\x03\x0e\xff\xec\x01\xde\x03\x10\xff\xec\x01\xde\x03\x18\xff\ +\xec\x01\xdf\x01\xcf\xff\xd7\x01\xdf\x01\xd8\xff\xd7\x01\xdf\x01\ +\xdb\xff\xd7\x01\xdf\x01\xde\xff\xd7\x01\xdf\x01\xe1\xff\xd7\x01\ +\xdf\x01\xea\xff\xd7\x01\xdf\x01\xed\xff\xd7\x01\xdf\x02j\xff\ +\xd7\x01\xdf\x02\x7f\xff\xd7\x01\xdf\x02\x85\xff\xd7\x01\xdf\x02\ +\x87\xff\xd7\x01\xdf\x02\x89\xff\xd7\x01\xdf\x02\x8d\xff\xd7\x01\ +\xdf\x02\xb2\xff\xd7\x01\xdf\x02\xb4\xff\xd7\x01\xdf\x02\xc0\xff\ +\xd7\x01\xdf\x02\xc2\xff\xd7\x01\xdf\x02\xc6\xff\xd7\x01\xdf\x02\ +\xc8\xff\xd7\x01\xdf\x02\xd5\xff\xd7\x01\xdf\x02\xe0\xff\xd7\x01\ +\xdf\x02\xf0\xff\xd7\x01\xdf\x02\xf2\xff\xd7\x01\xdf\x02\xf4\xff\ +\xd7\x01\xdf\x02\xfe\xff\xd7\x01\xdf\x03\x0a\xff\xd7\x01\xdf\x03\ +\x0c\xff\xd7\x01\xdf\x03\x16\xff\xd7\x01\xdf\x03\x1a\xff\xd7\x01\ +\xe0\x00\x05\xff\xec\x01\xe0\x00\x0a\xff\xec\x01\xe0\x02\x07\xff\ +\xec\x01\xe0\x02\x0b\xff\xec\x01\xe3\x00\x05\xff\xec\x01\xe3\x00\ +\x0a\xff\xec\x01\xe3\x02\x07\xff\xec\x01\xe3\x02\x0b\xff\xec\x01\ +\xe4\x00\x05\xff\x85\x01\xe4\x00\x0a\xff\x85\x01\xe4\x01\xd0\xff\ +\xd7\x01\xe4\x01\xdc\xff\x9a\x01\xe4\x01\xdd\xff\xc3\x01\xe4\x01\ +\xdf\xff\xd7\x01\xe4\x01\xe1\xff\xae\x01\xe4\x01\xe4\xff\x9a\x01\ +\xe4\x01\xf6\xff\xc3\x01\xe4\x02\x07\xff\x85\x01\xe4\x02\x0b\xff\ +\x85\x01\xe4\x02m\xff\xd7\x01\xe4\x02\x81\xff\xd7\x01\xe4\x02\ +\x83\xff\xd7\x01\xe4\x02\x8b\xff\xd7\x01\xe4\x02\xa0\xff\xd7\x01\ +\xe4\x02\xaa\xff\x9a\x01\xe4\x02\xb6\xff\x9a\x01\xe4\x02\xb8\xff\ +\xc3\x01\xe4\x02\xba\xff\xc3\x01\xe4\x02\xbc\xff\xd7\x01\xe4\x02\ +\xbe\xff\x9a\x01\xe4\x02\xc0\xff\xae\x01\xe4\x02\xc2\xff\xae\x01\ +\xe4\x02\xc6\xff\xd7\x01\xe4\x02\xc8\xff\xd7\x01\xe4\x02\xcb\xff\ +\xd7\x01\xe4\x02\xd5\xff\xae\x01\xe4\x02\xe6\xff\xd7\x01\xe4\x02\ +\xea\xff\xd7\x01\xe4\x02\xf8\xff\xc3\x01\xe4\x02\xfa\xff\xc3\x01\ +\xe4\x02\xfc\xff\xc3\x01\xe4\x02\xfe\xff\xae\x01\xe4\x03\x06\xff\ +\xd7\x01\xe4\x03\x08\xff\xd7\x01\xe4\x03\x0e\xff\x9a\x01\xe4\x03\ +\x10\xff\x9a\x01\xe4\x03\x18\xff\x9a\x01\xe6\x00\x05\xff\x85\x01\ +\xe6\x00\x0a\xff\x85\x01\xe6\x01\xd0\xff\xd7\x01\xe6\x01\xdc\xff\ +\x9a\x01\xe6\x01\xdd\xff\xc3\x01\xe6\x01\xdf\xff\xd7\x01\xe6\x01\ +\xe1\xff\xae\x01\xe6\x01\xe4\xff\x9a\x01\xe6\x01\xf6\xff\xc3\x01\ +\xe6\x02\x07\xff\x85\x01\xe6\x02\x0b\xff\x85\x01\xe6\x02m\xff\ +\xd7\x01\xe6\x02\x81\xff\xd7\x01\xe6\x02\x83\xff\xd7\x01\xe6\x02\ +\x8b\xff\xd7\x01\xe6\x02\xa0\xff\xd7\x01\xe6\x02\xaa\xff\x9a\x01\ +\xe6\x02\xb6\xff\x9a\x01\xe6\x02\xb8\xff\xc3\x01\xe6\x02\xba\xff\ +\xc3\x01\xe6\x02\xbc\xff\xd7\x01\xe6\x02\xbe\xff\x9a\x01\xe6\x02\ +\xc0\xff\xae\x01\xe6\x02\xc2\xff\xae\x01\xe6\x02\xc6\xff\xd7\x01\ +\xe6\x02\xc8\xff\xd7\x01\xe6\x02\xcb\xff\xd7\x01\xe6\x02\xd5\xff\ +\xae\x01\xe6\x02\xe6\xff\xd7\x01\xe6\x02\xea\xff\xd7\x01\xe6\x02\ +\xf8\xff\xc3\x01\xe6\x02\xfa\xff\xc3\x01\xe6\x02\xfc\xff\xc3\x01\ +\xe6\x02\xfe\xff\xae\x01\xe6\x03\x06\xff\xd7\x01\xe6\x03\x08\xff\ +\xd7\x01\xe6\x03\x0e\xff\x9a\x01\xe6\x03\x10\xff\x9a\x01\xe6\x03\ +\x18\xff\x9a\x01\xe7\x00\x05\xff\xec\x01\xe7\x00\x0a\xff\xec\x01\ +\xe7\x01\xd0\xff\xd7\x01\xe7\x01\xdc\xff\xec\x01\xe7\x01\xdd\xff\ +\xec\x01\xe7\x01\xdf\xff\xd7\x01\xe7\x01\xe1\xff\xec\x01\xe7\x01\ +\xe4\xff\xec\x01\xe7\x01\xf6\xff\xec\x01\xe7\x02\x07\xff\xec\x01\ +\xe7\x02\x0b\xff\xec\x01\xe7\x02\xa0\xff\xd7\x01\xe7\x02\xaa\xff\ +\xec\x01\xe7\x02\xb6\xff\xec\x01\xe7\x02\xbc\xff\xd7\x01\xe7\x02\ +\xbe\xff\xec\x01\xe7\x02\xc0\xff\xec\x01\xe7\x02\xc2\xff\xec\x01\ +\xe7\x02\xcb\xff\xd7\x01\xe7\x02\xd5\xff\xec\x01\xe7\x02\xe6\xff\ +\xd7\x01\xe7\x02\xf8\xff\xec\x01\xe7\x02\xfa\xff\xec\x01\xe7\x02\ +\xfc\xff\xec\x01\xe7\x02\xfe\xff\xec\x01\xe7\x03\x06\xff\xd7\x01\ +\xe7\x03\x08\xff\xd7\x01\xe7\x03\x0e\xff\xec\x01\xe7\x03\x10\xff\ +\xec\x01\xe7\x03\x18\xff\xec\x01\xe8\x00\x05\xff\xec\x01\xe8\x00\ +\x0a\xff\xec\x01\xe8\x01\xd0\xff\xd7\x01\xe8\x01\xdc\xff\xec\x01\ +\xe8\x01\xdd\xff\xec\x01\xe8\x01\xdf\xff\xd7\x01\xe8\x01\xe1\xff\ +\xec\x01\xe8\x01\xe4\xff\xec\x01\xe8\x01\xf6\xff\xec\x01\xe8\x02\ +\x07\xff\xec\x01\xe8\x02\x0b\xff\xec\x01\xe8\x02\xa0\xff\xd7\x01\ +\xe8\x02\xaa\xff\xec\x01\xe8\x02\xb6\xff\xec\x01\xe8\x02\xbc\xff\ +\xd7\x01\xe8\x02\xbe\xff\xec\x01\xe8\x02\xc0\xff\xec\x01\xe8\x02\ +\xc2\xff\xec\x01\xe8\x02\xcb\xff\xd7\x01\xe8\x02\xd5\xff\xec\x01\ +\xe8\x02\xe6\xff\xd7\x01\xe8\x02\xf8\xff\xec\x01\xe8\x02\xfa\xff\ +\xec\x01\xe8\x02\xfc\xff\xec\x01\xe8\x02\xfe\xff\xec\x01\xe8\x03\ +\x06\xff\xd7\x01\xe8\x03\x08\xff\xd7\x01\xe8\x03\x0e\xff\xec\x01\ +\xe8\x03\x10\xff\xec\x01\xe8\x03\x18\xff\xec\x01\xea\x00\x05\xff\ +\xec\x01\xea\x00\x0a\xff\xec\x01\xea\x02\x07\xff\xec\x01\xea\x02\ +\x0b\xff\xec\x01\xeb\x00\x05\xff\xec\x01\xeb\x00\x0a\xff\xec\x01\ +\xeb\x02\x07\xff\xec\x01\xeb\x02\x0b\xff\xec\x01\xeb\x03\x0e\xff\ +\xd7\x01\xeb\x03\x10\xff\xd7\x01\xec\x00\x0f\xff\x9a\x01\xec\x00\ +\x10\xff\xd7\x01\xec\x00\x11\xff\x9a\x01\xec\x01\xce\xff\xc3\x01\ +\xec\x01\xcf\xff\xec\x01\xec\x01\xd5\xff\xc3\x01\xec\x01\xd8\xff\ +\xec\x01\xec\x01\xdb\xff\xec\x01\xec\x01\xde\xff\xec\x01\xec\x01\ +\xea\xff\xec\x01\xec\x01\xed\xff\xec\x01\xec\x01\xf2\xff\xc3\x01\ +\xec\x02\x02\xff\xd7\x01\xec\x02\x03\xff\xd7\x01\xec\x02\x04\xff\ +\xd7\x01\xec\x02\x08\xff\x9a\x01\xec\x02\x0c\xff\x9a\x01\xec\x02\ +j\xff\xec\x01\xec\x02s\xff\xc3\x01\xec\x02\x7f\xff\xec\x01\ +\xec\x02\x85\xff\xec\x01\xec\x02\x87\xff\xec\x01\xec\x02\x89\xff\ +\xec\x01\xec\x02\x8d\xff\xec\x01\xec\x02\xb2\xff\xec\x01\xec\x02\ +\xb4\xff\xec\x01\xec\x02\xcf\xff\xc3\x01\xec\x02\xe0\xff\xec\x01\ +\xec\x02\xf0\xff\xec\x01\xec\x02\xf2\xff\xec\x01\xec\x02\xf4\xff\ +\xec\x01\xec\x03\x0a\xff\xec\x01\xec\x03\x0c\xff\xec\x01\xec\x03\ +\x12\xff\xc3\x01\xec\x03\x16\xff\xec\x01\xec\x03\x1a\xff\xec\x01\ +\xec\x03\x1c\xff\xc3\x01\xf2\x00\x05\xff\x85\x01\xf2\x00\x0a\xff\ +\x85\x01\xf2\x01\xd0\xff\xd7\x01\xf2\x01\xdc\xff\x9a\x01\xf2\x01\ +\xdd\xff\xc3\x01\xf2\x01\xdf\xff\xd7\x01\xf2\x01\xe1\xff\xae\x01\ +\xf2\x01\xe4\xff\x9a\x01\xf2\x01\xf6\xff\xc3\x01\xf2\x02\x07\xff\ +\x85\x01\xf2\x02\x0b\xff\x85\x01\xf2\x02m\xff\xd7\x01\xf2\x02\ +\x81\xff\xd7\x01\xf2\x02\x83\xff\xd7\x01\xf2\x02\x8b\xff\xd7\x01\ +\xf2\x02\xa0\xff\xd7\x01\xf2\x02\xaa\xff\x9a\x01\xf2\x02\xb6\xff\ +\x9a\x01\xf2\x02\xb8\xff\xc3\x01\xf2\x02\xba\xff\xc3\x01\xf2\x02\ +\xbc\xff\xd7\x01\xf2\x02\xbe\xff\x9a\x01\xf2\x02\xc0\xff\xae\x01\ +\xf2\x02\xc2\xff\xae\x01\xf2\x02\xc6\xff\xd7\x01\xf2\x02\xc8\xff\ +\xd7\x01\xf2\x02\xcb\xff\xd7\x01\xf2\x02\xd5\xff\xae\x01\xf2\x02\ +\xe6\xff\xd7\x01\xf2\x02\xea\xff\xd7\x01\xf2\x02\xf8\xff\xc3\x01\ +\xf2\x02\xfa\xff\xc3\x01\xf2\x02\xfc\xff\xc3\x01\xf2\x02\xfe\xff\ +\xae\x01\xf2\x03\x06\xff\xd7\x01\xf2\x03\x08\xff\xd7\x01\xf2\x03\ +\x0e\xff\x9a\x01\xf2\x03\x10\xff\x9a\x01\xf2\x03\x18\xff\x9a\x01\ +\xf3\x00\x05\xff\x85\x01\xf3\x00\x0a\xff\x85\x01\xf3\x01\xd0\xff\ +\xd7\x01\xf3\x01\xdc\xff\x9a\x01\xf3\x01\xdd\xff\xc3\x01\xf3\x01\ +\xdf\xff\xd7\x01\xf3\x01\xe1\xff\xae\x01\xf3\x01\xe4\xff\x9a\x01\ +\xf3\x01\xf6\xff\xc3\x01\xf3\x02\x07\xff\x85\x01\xf3\x02\x0b\xff\ +\x85\x01\xf3\x02m\xff\xd7\x01\xf3\x02\x81\xff\xd7\x01\xf3\x02\ +\x83\xff\xd7\x01\xf3\x02\x8b\xff\xd7\x01\xf3\x02\xa0\xff\xd7\x01\ +\xf3\x02\xaa\xff\x9a\x01\xf3\x02\xb6\xff\x9a\x01\xf3\x02\xb8\xff\ +\xc3\x01\xf3\x02\xba\xff\xc3\x01\xf3\x02\xbc\xff\xd7\x01\xf3\x02\ +\xbe\xff\x9a\x01\xf3\x02\xc0\xff\xae\x01\xf3\x02\xc2\xff\xae\x01\ +\xf3\x02\xc6\xff\xd7\x01\xf3\x02\xc8\xff\xd7\x01\xf3\x02\xcb\xff\ +\xd7\x01\xf3\x02\xd5\xff\xae\x01\xf3\x02\xe6\xff\xd7\x01\xf3\x02\ +\xea\xff\xd7\x01\xf3\x02\xf8\xff\xc3\x01\xf3\x02\xfa\xff\xc3\x01\ +\xf3\x02\xfc\xff\xc3\x01\xf3\x02\xfe\xff\xae\x01\xf3\x03\x06\xff\ +\xd7\x01\xf3\x03\x08\xff\xd7\x01\xf3\x03\x0e\xff\x9a\x01\xf3\x03\ +\x10\xff\x9a\x01\xf3\x03\x18\xff\x9a\x01\xf4\x00\x05\xff\xec\x01\ +\xf4\x00\x0a\xff\xec\x01\xf4\x02\x07\xff\xec\x01\xf4\x02\x0b\xff\ +\xec\x01\xf4\x03\x0e\xff\xd7\x01\xf4\x03\x10\xff\xd7\x01\xf5\x01\ +\xcf\xff\xd7\x01\xf5\x01\xd8\xff\xd7\x01\xf5\x01\xdb\xff\xd7\x01\ +\xf5\x01\xde\xff\xd7\x01\xf5\x01\xe1\xff\xd7\x01\xf5\x01\xea\xff\ +\xd7\x01\xf5\x01\xed\xff\xd7\x01\xf5\x02j\xff\xd7\x01\xf5\x02\ +\x7f\xff\xd7\x01\xf5\x02\x85\xff\xd7\x01\xf5\x02\x87\xff\xd7\x01\ +\xf5\x02\x89\xff\xd7\x01\xf5\x02\x8d\xff\xd7\x01\xf5\x02\xb2\xff\ +\xd7\x01\xf5\x02\xb4\xff\xd7\x01\xf5\x02\xc0\xff\xd7\x01\xf5\x02\ +\xc2\xff\xd7\x01\xf5\x02\xc6\xff\xd7\x01\xf5\x02\xc8\xff\xd7\x01\ +\xf5\x02\xd5\xff\xd7\x01\xf5\x02\xe0\xff\xd7\x01\xf5\x02\xf0\xff\ +\xd7\x01\xf5\x02\xf2\xff\xd7\x01\xf5\x02\xf4\xff\xd7\x01\xf5\x02\ +\xfe\xff\xd7\x01\xf5\x03\x0a\xff\xd7\x01\xf5\x03\x0c\xff\xd7\x01\ +\xf5\x03\x16\xff\xd7\x01\xf5\x03\x1a\xff\xd7\x01\xf6\x00\x0f\xff\ +\xae\x01\xf6\x00\x11\xff\xae\x01\xf6\x01\xce\xff\xd7\x01\xf6\x01\ +\xd5\xff\xd7\x01\xf6\x01\xf2\xff\xd7\x01\xf6\x02\x08\xff\xae\x01\ +\xf6\x02\x0c\xff\xae\x01\xf6\x02s\xff\xd7\x01\xf6\x02\xcf\xff\ +\xd7\x01\xf6\x03\x12\xff\xd7\x01\xf6\x03\x1c\xff\xd7\x01\xf8\x00\ +\x0f\xff\x85\x01\xf8\x00\x10\xff\xae\x01\xf8\x00\x11\xff\x85\x01\ +\xf8\x01\x9f\xff\xd7\x01\xf8\x01\xa4\xff\x9a\x01\xf8\x01\xaa\xff\ +q\x01\xf8\x01\xae\xff\x9a\x01\xf8\x01\xb5\xff\x9a\x01\xf8\x01\ +\xb8\xff\xd7\x01\xf8\x01\xbb\xff\xd7\x01\xf8\x01\xbc\x00)\x01\ +\xf8\x01\xbe\xff\xae\x01\xf8\x01\xcc\xff\x9a\x01\xf8\x01\xcd\xff\ +\x9a\x01\xf8\x01\xce\xff\x85\x01\xf8\x01\xcf\xffq\x01\xf8\x01\ +\xd0\xff\xd7\x01\xf8\x01\xd1\xff\xd7\x01\xf8\x01\xd2\xff\x9a\x01\ +\xf8\x01\xd3\xff\x9a\x01\xf8\x01\xd4\xff\x9a\x01\xf8\x01\xd5\xff\ +\x85\x01\xf8\x01\xd6\xff\x9a\x01\xf8\x01\xd7\xff\x9a\x01\xf8\x01\ +\xd8\xffq\x01\xf8\x01\xd9\xff\x9a\x01\xf8\x01\xda\xff\x9a\x01\ +\xf8\x01\xdb\xffq\x01\xf8\x01\xdc\xff\xae\x01\xf8\x01\xdd\xff\ +\xae\x01\xf8\x01\xde\xffq\x01\xf8\x01\xdf\xff\xd7\x01\xf8\x01\ +\xe0\xff\x9a\x01\xf8\x01\xe1\xff\x9a\x01\xf8\x01\xe2\xff\x9a\x01\ +\xf8\x01\xe3\xff\x9a\x01\xf8\x01\xe4\xff\xae\x01\xf8\x01\xe5\xff\ +\x9a\x01\xf8\x01\xe6\xff\x9a\x01\xf8\x01\xe7\xff\xd7\x01\xf8\x01\ +\xe8\xff\x9a\x01\xf8\x01\xe9\xff\xc3\x01\xf8\x01\xea\xffq\x01\ +\xf8\x01\xec\xff\x9a\x01\xf8\x01\xed\xffq\x01\xf8\x01\xee\xff\ +\x85\x01\xf8\x01\xf2\xff\x85\x01\xf8\x01\xf3\xff\x9a\x01\xf8\x01\ +\xf5\xff\x9a\x01\xf8\x01\xf6\xff\xae\x01\xf8\x01\xf7\xff\x9a\x01\ +\xf8\x01\xf9\xff\x9a\x01\xf8\x02\x02\xff\xae\x01\xf8\x02\x03\xff\ +\xae\x01\xf8\x02\x04\xff\xae\x01\xf8\x02\x08\xff\x85\x01\xf8\x02\ +\x0c\xff\x85\x01\xf8\x02j\xffq\x01\xf8\x02k\xff\x9a\x01\ +\xf8\x02l\xff\xd7\x01\xf8\x02m\xff\xd7\x01\xf8\x02q\xff\ +\x9a\x01\xf8\x02r\xffq\x01\xf8\x02s\xff\x85\x01\xf8\x02\ +u\xff\x9a\x01\xf8\x02w\xff\x9a\x01\xf8\x02y\xff\x9a\x01\ +\xf8\x02}\xff\x9a\x01\xf8\x02~\xff\xd7\x01\xf8\x02\x7f\xff\ +q\x01\xf8\x02\x81\xff\xd7\x01\xf8\x02\x83\xff\xd7\x01\xf8\x02\ +\x84\xff\xd7\x01\xf8\x02\x85\xffq\x01\xf8\x02\x86\xff\xd7\x01\ +\xf8\x02\x87\xffq\x01\xf8\x02\x88\xff\xd7\x01\xf8\x02\x89\xff\ +q\x01\xf8\x02\x8a\xff\xd7\x01\xf8\x02\x8b\xff\xd7\x01\xf8\x02\ +\x8c\xff\xd7\x01\xf8\x02\x8d\xffq\x01\xf8\x02\x96\xff\x9a\x01\ +\xf8\x02\x9a\xff\x9a\x01\xf8\x02\x9e\xff\x9a\x01\xf8\x02\xa0\xff\ +\xd7\x01\xf8\x02\xa2\xff\xd7\x01\xf8\x02\xa4\xff\x9a\x01\xf8\x02\ +\xa6\xff\x9a\x01\xf8\x02\xaa\xff\xae\x01\xf8\x02\xac\xff\x9a\x01\ +\xf8\x02\xae\xff\x9a\x01\xf8\x02\xb0\xff\x9a\x01\xf8\x02\xb1\xff\ +\xd7\x01\xf8\x02\xb2\xffq\x01\xf8\x02\xb3\xff\xd7\x01\xf8\x02\ +\xb4\xffq\x01\xf8\x02\xb5\x00)\x01\xf8\x02\xb6\xff\xae\x01\ +\xf8\x02\xb8\xff\xae\x01\xf8\x02\xba\xff\xae\x01\xf8\x02\xbc\xff\ +\xd7\x01\xf8\x02\xbe\xff\xae\x01\xf8\x02\xc0\xff\x9a\x01\xf8\x02\ +\xc2\xff\x9a\x01\xf8\x02\xc4\xff\x9a\x01\xf8\x02\xc5\xff\x9a\x01\ +\xf8\x02\xc6\xffq\x01\xf8\x02\xc7\xff\x9a\x01\xf8\x02\xc8\xff\ +q\x01\xf8\x02\xcb\xff\xd7\x01\xf8\x02\xcd\xff\x9a\x01\xf8\x02\ +\xce\xff\x9a\x01\xf8\x02\xcf\xff\x85\x01\xf8\x02\xd1\xff\x9a\x01\ +\xf8\x02\xd3\xff\x9a\x01\xf8\x02\xd5\xff\x9a\x01\xf8\x02\xd7\xff\ +\x9a\x01\xf8\x02\xd9\xffq\x01\xf8\x02\xdb\xffq\x01\xf8\x02\ +\xdd\xffq\x01\xf8\x02\xe0\xffq\x01\xf8\x02\xe6\xff\xd7\x01\ +\xf8\x02\xe8\xff\xd7\x01\xf8\x02\xea\xff\xc3\x01\xf8\x02\xec\xff\ +\x9a\x01\xf8\x02\xee\xff\x9a\x01\xf8\x02\xef\xff\xd7\x01\xf8\x02\ +\xf0\xffq\x01\xf8\x02\xf1\xff\xd7\x01\xf8\x02\xf2\xffq\x01\ +\xf8\x02\xf3\xff\xd7\x01\xf8\x02\xf4\xffq\x01\xf8\x02\xf6\xff\ +\xd7\x01\xf8\x02\xf8\xff\xae\x01\xf8\x02\xfa\xff\xae\x01\xf8\x02\ +\xfc\xff\xae\x01\xf8\x02\xfe\xff\x9a\x01\xf8\x03\x00\xff\x9a\x01\ +\xf8\x03\x02\xff\x9a\x01\xf8\x03\x06\xff\xd7\x01\xf8\x03\x08\xff\ +\xd7\x01\xf8\x03\x09\xffq\x01\xf8\x03\x0a\xffq\x01\xf8\x03\ +\x0b\xffq\x01\xf8\x03\x0c\xffq\x01\xf8\x03\x0e\xff\x9a\x01\ +\xf8\x03\x10\xff\x9a\x01\xf8\x03\x11\xff\x9a\x01\xf8\x03\x12\xff\ +\x85\x01\xf8\x03\x14\xff\x9a\x01\xf8\x03\x15\xff\xd7\x01\xf8\x03\ +\x16\xffq\x01\xf8\x03\x18\xff\xae\x01\xf8\x03\x1a\xffq\x01\ +\xf8\x03\x1b\xff\x9a\x01\xf8\x03\x1c\xff\x85\x01\xf9\x00\x0f\xff\ +\x9a\x01\xf9\x00\x10\xff\xd7\x01\xf9\x00\x11\xff\x9a\x01\xf9\x01\ +\xce\xff\xc3\x01\xf9\x01\xcf\xff\xec\x01\xf9\x01\xd5\xff\xc3\x01\ +\xf9\x01\xd8\xff\xec\x01\xf9\x01\xdb\xff\xec\x01\xf9\x01\xde\xff\ +\xec\x01\xf9\x01\xea\xff\xec\x01\xf9\x01\xed\xff\xec\x01\xf9\x01\ +\xf2\xff\xc3\x01\xf9\x02\x02\xff\xd7\x01\xf9\x02\x03\xff\xd7\x01\ +\xf9\x02\x04\xff\xd7\x01\xf9\x02\x08\xff\x9a\x01\xf9\x02\x0c\xff\ +\x9a\x01\xf9\x02j\xff\xec\x01\xf9\x02s\xff\xc3\x01\xf9\x02\ +\x7f\xff\xec\x01\xf9\x02\x85\xff\xec\x01\xf9\x02\x87\xff\xec\x01\ +\xf9\x02\x89\xff\xec\x01\xf9\x02\x8d\xff\xec\x01\xf9\x02\xb2\xff\ +\xec\x01\xf9\x02\xb4\xff\xec\x01\xf9\x02\xcf\xff\xc3\x01\xf9\x02\ +\xe0\xff\xec\x01\xf9\x02\xf0\xff\xec\x01\xf9\x02\xf2\xff\xec\x01\ +\xf9\x02\xf4\xff\xec\x01\xf9\x03\x0a\xff\xec\x01\xf9\x03\x0c\xff\ +\xec\x01\xf9\x03\x12\xff\xc3\x01\xf9\x03\x16\xff\xec\x01\xf9\x03\ +\x1a\xff\xec\x01\xf9\x03\x1c\xff\xc3\x01\xfa\x00\x0f\xff\x9a\x01\ +\xfa\x00\x11\xff\x9a\x01\xfa\x00\x22\x00)\x01\xfa\x00$\xff\ +\xae\x01\xfa\x00&\xff\xec\x01\xfa\x00*\xff\xec\x01\xfa\x00\ +2\xff\xec\x01\xfa\x004\xff\xec\x01\xfa\x00D\xff\xd7\x01\ +\xfa\x00F\xff\xd7\x01\xfa\x00G\xff\xd7\x01\xfa\x00H\xff\ +\xd7\x01\xfa\x00J\xff\xec\x01\xfa\x00P\xff\xec\x01\xfa\x00\ +Q\xff\xec\x01\xfa\x00R\xff\xd7\x01\xfa\x00S\xff\xec\x01\ +\xfa\x00T\xff\xd7\x01\xfa\x00U\xff\xec\x01\xfa\x00V\xff\ +\xec\x01\xfa\x00X\xff\xec\x01\xfa\x00\x82\xff\xae\x01\xfa\x00\ +\x83\xff\xae\x01\xfa\x00\x84\xff\xae\x01\xfa\x00\x85\xff\xae\x01\ +\xfa\x00\x86\xff\xae\x01\xfa\x00\x87\xff\xae\x01\xfa\x00\x89\xff\ +\xec\x01\xfa\x00\x94\xff\xec\x01\xfa\x00\x95\xff\xec\x01\xfa\x00\ +\x96\xff\xec\x01\xfa\x00\x97\xff\xec\x01\xfa\x00\x98\xff\xec\x01\ +\xfa\x00\x9a\xff\xec\x01\xfa\x00\xa2\xff\xd7\x01\xfa\x00\xa3\xff\ +\xd7\x01\xfa\x00\xa4\xff\xd7\x01\xfa\x00\xa5\xff\xd7\x01\xfa\x00\ +\xa6\xff\xd7\x01\xfa\x00\xa7\xff\xd7\x01\xfa\x00\xa8\xff\xd7\x01\ +\xfa\x00\xa9\xff\xd7\x01\xfa\x00\xaa\xff\xd7\x01\xfa\x00\xab\xff\ +\xd7\x01\xfa\x00\xac\xff\xd7\x01\xfa\x00\xad\xff\xd7\x01\xfa\x00\ +\xb4\xff\xd7\x01\xfa\x00\xb5\xff\xd7\x01\xfa\x00\xb6\xff\xd7\x01\ +\xfa\x00\xb7\xff\xd7\x01\xfa\x00\xb8\xff\xd7\x01\xfa\x00\xba\xff\ +\xd7\x01\xfa\x00\xbb\xff\xec\x01\xfa\x00\xbc\xff\xec\x01\xfa\x00\ +\xbd\xff\xec\x01\xfa\x00\xbe\xff\xec\x01\xfa\x00\xc2\xff\xae\x01\ +\xfa\x00\xc3\xff\xd7\x01\xfa\x00\xc4\xff\xae\x01\xfa\x00\xc5\xff\ +\xd7\x01\xfa\x00\xc6\xff\xae\x01\xfa\x00\xc7\xff\xd7\x01\xfa\x00\ +\xc8\xff\xec\x01\xfa\x00\xc9\xff\xd7\x01\xfa\x00\xca\xff\xec\x01\ +\xfa\x00\xcb\xff\xd7\x01\xfa\x00\xcc\xff\xec\x01\xfa\x00\xcd\xff\ +\xd7\x01\xfa\x00\xce\xff\xec\x01\xfa\x00\xcf\xff\xd7\x01\xfa\x00\ +\xd1\xff\xd7\x01\xfa\x00\xd3\xff\xd7\x01\xfa\x00\xd5\xff\xd7\x01\ +\xfa\x00\xd7\xff\xd7\x01\xfa\x00\xd9\xff\xd7\x01\xfa\x00\xdb\xff\ +\xd7\x01\xfa\x00\xdd\xff\xd7\x01\xfa\x00\xde\xff\xec\x01\xfa\x00\ +\xdf\xff\xec\x01\xfa\x00\xe0\xff\xec\x01\xfa\x00\xe1\xff\xec\x01\ +\xfa\x00\xe2\xff\xec\x01\xfa\x00\xe3\xff\xec\x01\xfa\x00\xe4\xff\ +\xec\x01\xfa\x00\xe5\xff\xec\x01\xfa\x00\xfa\xff\xec\x01\xfa\x01\ +\x06\xff\xec\x01\xfa\x01\x08\xff\xec\x01\xfa\x01\x0d\xff\xec\x01\ +\xfa\x01\x0e\xff\xec\x01\xfa\x01\x0f\xff\xd7\x01\xfa\x01\x10\xff\ +\xec\x01\xfa\x01\x11\xff\xd7\x01\xfa\x01\x12\xff\xec\x01\xfa\x01\ +\x13\xff\xd7\x01\xfa\x01\x14\xff\xec\x01\xfa\x01\x15\xff\xd7\x01\ +\xfa\x01\x17\xff\xec\x01\xfa\x01\x19\xff\xec\x01\xfa\x01\x1d\xff\ +\xec\x01\xfa\x01!\xff\xec\x01\xfa\x01+\xff\xec\x01\xfa\x01\ +-\xff\xec\x01\xfa\x01/\xff\xec\x01\xfa\x011\xff\xec\x01\ +\xfa\x013\xff\xec\x01\xfa\x015\xff\xec\x01\xfa\x01C\xff\ +\xae\x01\xfa\x01D\xff\xd7\x01\xfa\x01F\xff\xd7\x01\xfa\x01\ +G\xff\xec\x01\xfa\x01H\xff\xd7\x01\xfa\x01J\xff\xec\x01\ +\xfa\x02\x08\xff\x9a\x01\xfa\x02\x0c\xff\x9a\x01\xfa\x02W\xff\ +\xec\x01\xfa\x02X\xff\xae\x01\xfa\x02Y\xff\xd7\x01\xfa\x02\ +_\xff\xec\x01\xfa\x02`\xff\xd7\x01\xfa\x02b\xff\xec\x01\ +\xfa\x03\x1d\xff\xae\x01\xfa\x03\x1e\xff\xd7\x01\xfa\x03\x1f\xff\ +\xae\x01\xfa\x03 \xff\xd7\x01\xfa\x03!\xff\xae\x01\xfa\x03\ +\x22\xff\xd7\x01\xfa\x03#\xff\xae\x01\xfa\x03%\xff\xae\x01\ +\xfa\x03&\xff\xd7\x01\xfa\x03'\xff\xae\x01\xfa\x03(\xff\ +\xd7\x01\xfa\x03)\xff\xae\x01\xfa\x03*\xff\xd7\x01\xfa\x03\ ++\xff\xae\x01\xfa\x03,\xff\xd7\x01\xfa\x03-\xff\xae\x01\ +\xfa\x03.\xff\xd7\x01\xfa\x03/\xff\xae\x01\xfa\x030\xff\ +\xd7\x01\xfa\x031\xff\xae\x01\xfa\x032\xff\xd7\x01\xfa\x03\ +3\xff\xae\x01\xfa\x034\xff\xd7\x01\xfa\x036\xff\xd7\x01\ +\xfa\x038\xff\xd7\x01\xfa\x03:\xff\xd7\x01\xfa\x03<\xff\ +\xd7\x01\xfa\x03@\xff\xd7\x01\xfa\x03B\xff\xd7\x01\xfa\x03\ +D\xff\xd7\x01\xfa\x03I\xff\xec\x01\xfa\x03J\xff\xd7\x01\ +\xfa\x03K\xff\xec\x01\xfa\x03L\xff\xd7\x01\xfa\x03M\xff\ +\xec\x01\xfa\x03N\xff\xd7\x01\xfa\x03O\xff\xec\x01\xfa\x03\ +Q\xff\xec\x01\xfa\x03R\xff\xd7\x01\xfa\x03S\xff\xec\x01\ +\xfa\x03T\xff\xd7\x01\xfa\x03U\xff\xec\x01\xfa\x03V\xff\ +\xd7\x01\xfa\x03W\xff\xec\x01\xfa\x03X\xff\xd7\x01\xfa\x03\ +Y\xff\xec\x01\xfa\x03Z\xff\xd7\x01\xfa\x03[\xff\xec\x01\ +\xfa\x03\x5c\xff\xd7\x01\xfa\x03]\xff\xec\x01\xfa\x03^\xff\ +\xd7\x01\xfa\x03_\xff\xec\x01\xfa\x03`\xff\xd7\x01\xfa\x03\ +b\xff\xec\x01\xfa\x03d\xff\xec\x01\xfa\x03f\xff\xec\x01\ +\xfa\x03h\xff\xec\x01\xfa\x03j\xff\xec\x01\xfa\x03l\xff\ +\xec\x01\xfa\x03n\xff\xec\x01\xfb\x00\x05\x00R\x01\xfb\x00\ +\x0a\x00R\x01\xfb\x00\x0f\xff\xae\x01\xfb\x00\x11\xff\xae\x01\ +\xfb\x00\x22\x00)\x01\xfb\x02\x07\x00R\x01\xfb\x02\x08\xff\ +\xae\x01\xfb\x02\x0b\x00R\x01\xfb\x02\x0c\xff\xae\x01\xfc\x00\ +\x0f\xff\x9a\x01\xfc\x00\x11\xff\x9a\x01\xfc\x00\x22\x00)\x01\ +\xfc\x00$\xff\xae\x01\xfc\x00&\xff\xec\x01\xfc\x00*\xff\ +\xec\x01\xfc\x002\xff\xec\x01\xfc\x004\xff\xec\x01\xfc\x00\ +D\xff\xd7\x01\xfc\x00F\xff\xd7\x01\xfc\x00G\xff\xd7\x01\ +\xfc\x00H\xff\xd7\x01\xfc\x00J\xff\xec\x01\xfc\x00P\xff\ +\xec\x01\xfc\x00Q\xff\xec\x01\xfc\x00R\xff\xd7\x01\xfc\x00\ +S\xff\xec\x01\xfc\x00T\xff\xd7\x01\xfc\x00U\xff\xec\x01\ +\xfc\x00V\xff\xec\x01\xfc\x00X\xff\xec\x01\xfc\x00\x82\xff\ +\xae\x01\xfc\x00\x83\xff\xae\x01\xfc\x00\x84\xff\xae\x01\xfc\x00\ +\x85\xff\xae\x01\xfc\x00\x86\xff\xae\x01\xfc\x00\x87\xff\xae\x01\ +\xfc\x00\x89\xff\xec\x01\xfc\x00\x94\xff\xec\x01\xfc\x00\x95\xff\ +\xec\x01\xfc\x00\x96\xff\xec\x01\xfc\x00\x97\xff\xec\x01\xfc\x00\ +\x98\xff\xec\x01\xfc\x00\x9a\xff\xec\x01\xfc\x00\xa2\xff\xd7\x01\ +\xfc\x00\xa3\xff\xd7\x01\xfc\x00\xa4\xff\xd7\x01\xfc\x00\xa5\xff\ +\xd7\x01\xfc\x00\xa6\xff\xd7\x01\xfc\x00\xa7\xff\xd7\x01\xfc\x00\ +\xa8\xff\xd7\x01\xfc\x00\xa9\xff\xd7\x01\xfc\x00\xaa\xff\xd7\x01\ +\xfc\x00\xab\xff\xd7\x01\xfc\x00\xac\xff\xd7\x01\xfc\x00\xad\xff\ +\xd7\x01\xfc\x00\xb4\xff\xd7\x01\xfc\x00\xb5\xff\xd7\x01\xfc\x00\ +\xb6\xff\xd7\x01\xfc\x00\xb7\xff\xd7\x01\xfc\x00\xb8\xff\xd7\x01\ +\xfc\x00\xba\xff\xd7\x01\xfc\x00\xbb\xff\xec\x01\xfc\x00\xbc\xff\ +\xec\x01\xfc\x00\xbd\xff\xec\x01\xfc\x00\xbe\xff\xec\x01\xfc\x00\ +\xc2\xff\xae\x01\xfc\x00\xc3\xff\xd7\x01\xfc\x00\xc4\xff\xae\x01\ +\xfc\x00\xc5\xff\xd7\x01\xfc\x00\xc6\xff\xae\x01\xfc\x00\xc7\xff\ +\xd7\x01\xfc\x00\xc8\xff\xec\x01\xfc\x00\xc9\xff\xd7\x01\xfc\x00\ +\xca\xff\xec\x01\xfc\x00\xcb\xff\xd7\x01\xfc\x00\xcc\xff\xec\x01\ +\xfc\x00\xcd\xff\xd7\x01\xfc\x00\xce\xff\xec\x01\xfc\x00\xcf\xff\ +\xd7\x01\xfc\x00\xd1\xff\xd7\x01\xfc\x00\xd3\xff\xd7\x01\xfc\x00\ +\xd5\xff\xd7\x01\xfc\x00\xd7\xff\xd7\x01\xfc\x00\xd9\xff\xd7\x01\ +\xfc\x00\xdb\xff\xd7\x01\xfc\x00\xdd\xff\xd7\x01\xfc\x00\xde\xff\ +\xec\x01\xfc\x00\xdf\xff\xec\x01\xfc\x00\xe0\xff\xec\x01\xfc\x00\ +\xe1\xff\xec\x01\xfc\x00\xe2\xff\xec\x01\xfc\x00\xe3\xff\xec\x01\ +\xfc\x00\xe4\xff\xec\x01\xfc\x00\xe5\xff\xec\x01\xfc\x00\xfa\xff\ +\xec\x01\xfc\x01\x06\xff\xec\x01\xfc\x01\x08\xff\xec\x01\xfc\x01\ +\x0d\xff\xec\x01\xfc\x01\x0e\xff\xec\x01\xfc\x01\x0f\xff\xd7\x01\ +\xfc\x01\x10\xff\xec\x01\xfc\x01\x11\xff\xd7\x01\xfc\x01\x12\xff\ +\xec\x01\xfc\x01\x13\xff\xd7\x01\xfc\x01\x14\xff\xec\x01\xfc\x01\ +\x15\xff\xd7\x01\xfc\x01\x17\xff\xec\x01\xfc\x01\x19\xff\xec\x01\ +\xfc\x01\x1d\xff\xec\x01\xfc\x01!\xff\xec\x01\xfc\x01+\xff\ +\xec\x01\xfc\x01-\xff\xec\x01\xfc\x01/\xff\xec\x01\xfc\x01\ +1\xff\xec\x01\xfc\x013\xff\xec\x01\xfc\x015\xff\xec\x01\ +\xfc\x01C\xff\xae\x01\xfc\x01D\xff\xd7\x01\xfc\x01F\xff\ +\xd7\x01\xfc\x01G\xff\xec\x01\xfc\x01H\xff\xd7\x01\xfc\x01\ +J\xff\xec\x01\xfc\x02\x08\xff\x9a\x01\xfc\x02\x0c\xff\x9a\x01\ +\xfc\x02W\xff\xec\x01\xfc\x02X\xff\xae\x01\xfc\x02Y\xff\ +\xd7\x01\xfc\x02_\xff\xec\x01\xfc\x02`\xff\xd7\x01\xfc\x02\ +b\xff\xec\x01\xfc\x03\x1d\xff\xae\x01\xfc\x03\x1e\xff\xd7\x01\ +\xfc\x03\x1f\xff\xae\x01\xfc\x03 \xff\xd7\x01\xfc\x03!\xff\ +\xae\x01\xfc\x03\x22\xff\xd7\x01\xfc\x03#\xff\xae\x01\xfc\x03\ +%\xff\xae\x01\xfc\x03&\xff\xd7\x01\xfc\x03'\xff\xae\x01\ +\xfc\x03(\xff\xd7\x01\xfc\x03)\xff\xae\x01\xfc\x03*\xff\ +\xd7\x01\xfc\x03+\xff\xae\x01\xfc\x03,\xff\xd7\x01\xfc\x03\ +-\xff\xae\x01\xfc\x03.\xff\xd7\x01\xfc\x03/\xff\xae\x01\ +\xfc\x030\xff\xd7\x01\xfc\x031\xff\xae\x01\xfc\x032\xff\ +\xd7\x01\xfc\x033\xff\xae\x01\xfc\x034\xff\xd7\x01\xfc\x03\ +6\xff\xd7\x01\xfc\x038\xff\xd7\x01\xfc\x03:\xff\xd7\x01\ +\xfc\x03<\xff\xd7\x01\xfc\x03@\xff\xd7\x01\xfc\x03B\xff\ +\xd7\x01\xfc\x03D\xff\xd7\x01\xfc\x03I\xff\xec\x01\xfc\x03\ +J\xff\xd7\x01\xfc\x03K\xff\xec\x01\xfc\x03L\xff\xd7\x01\ +\xfc\x03M\xff\xec\x01\xfc\x03N\xff\xd7\x01\xfc\x03O\xff\ +\xec\x01\xfc\x03Q\xff\xec\x01\xfc\x03R\xff\xd7\x01\xfc\x03\ +S\xff\xec\x01\xfc\x03T\xff\xd7\x01\xfc\x03U\xff\xec\x01\ +\xfc\x03V\xff\xd7\x01\xfc\x03W\xff\xec\x01\xfc\x03X\xff\ +\xd7\x01\xfc\x03Y\xff\xec\x01\xfc\x03Z\xff\xd7\x01\xfc\x03\ +[\xff\xec\x01\xfc\x03\x5c\xff\xd7\x01\xfc\x03]\xff\xec\x01\ +\xfc\x03^\xff\xd7\x01\xfc\x03_\xff\xec\x01\xfc\x03`\xff\ +\xd7\x01\xfc\x03b\xff\xec\x01\xfc\x03d\xff\xec\x01\xfc\x03\ +f\xff\xec\x01\xfc\x03h\xff\xec\x01\xfc\x03j\xff\xec\x01\ +\xfc\x03l\xff\xec\x01\xfc\x03n\xff\xec\x01\xfd\x00\x05\x00\ +R\x01\xfd\x00\x0a\x00R\x01\xfd\x00\x0f\xff\xae\x01\xfd\x00\ +\x11\xff\xae\x01\xfd\x00\x22\x00)\x01\xfd\x02\x07\x00R\x01\ +\xfd\x02\x08\xff\xae\x01\xfd\x02\x0b\x00R\x01\xfd\x02\x0c\xff\ +\xae\x01\xfe\x00\x0f\xff\x9a\x01\xfe\x00\x11\xff\x9a\x01\xfe\x00\ +\x22\x00)\x01\xfe\x00$\xff\xae\x01\xfe\x00&\xff\xec\x01\ +\xfe\x00*\xff\xec\x01\xfe\x002\xff\xec\x01\xfe\x004\xff\ +\xec\x01\xfe\x00D\xff\xd7\x01\xfe\x00F\xff\xd7\x01\xfe\x00\ +G\xff\xd7\x01\xfe\x00H\xff\xd7\x01\xfe\x00J\xff\xec\x01\ +\xfe\x00P\xff\xec\x01\xfe\x00Q\xff\xec\x01\xfe\x00R\xff\ +\xd7\x01\xfe\x00S\xff\xec\x01\xfe\x00T\xff\xd7\x01\xfe\x00\ +U\xff\xec\x01\xfe\x00V\xff\xec\x01\xfe\x00X\xff\xec\x01\ +\xfe\x00\x82\xff\xae\x01\xfe\x00\x83\xff\xae\x01\xfe\x00\x84\xff\ +\xae\x01\xfe\x00\x85\xff\xae\x01\xfe\x00\x86\xff\xae\x01\xfe\x00\ +\x87\xff\xae\x01\xfe\x00\x89\xff\xec\x01\xfe\x00\x94\xff\xec\x01\ +\xfe\x00\x95\xff\xec\x01\xfe\x00\x96\xff\xec\x01\xfe\x00\x97\xff\ +\xec\x01\xfe\x00\x98\xff\xec\x01\xfe\x00\x9a\xff\xec\x01\xfe\x00\ +\xa2\xff\xd7\x01\xfe\x00\xa3\xff\xd7\x01\xfe\x00\xa4\xff\xd7\x01\ +\xfe\x00\xa5\xff\xd7\x01\xfe\x00\xa6\xff\xd7\x01\xfe\x00\xa7\xff\ +\xd7\x01\xfe\x00\xa8\xff\xd7\x01\xfe\x00\xa9\xff\xd7\x01\xfe\x00\ +\xaa\xff\xd7\x01\xfe\x00\xab\xff\xd7\x01\xfe\x00\xac\xff\xd7\x01\ +\xfe\x00\xad\xff\xd7\x01\xfe\x00\xb4\xff\xd7\x01\xfe\x00\xb5\xff\ +\xd7\x01\xfe\x00\xb6\xff\xd7\x01\xfe\x00\xb7\xff\xd7\x01\xfe\x00\ +\xb8\xff\xd7\x01\xfe\x00\xba\xff\xd7\x01\xfe\x00\xbb\xff\xec\x01\ +\xfe\x00\xbc\xff\xec\x01\xfe\x00\xbd\xff\xec\x01\xfe\x00\xbe\xff\ +\xec\x01\xfe\x00\xc2\xff\xae\x01\xfe\x00\xc3\xff\xd7\x01\xfe\x00\ +\xc4\xff\xae\x01\xfe\x00\xc5\xff\xd7\x01\xfe\x00\xc6\xff\xae\x01\ +\xfe\x00\xc7\xff\xd7\x01\xfe\x00\xc8\xff\xec\x01\xfe\x00\xc9\xff\ +\xd7\x01\xfe\x00\xca\xff\xec\x01\xfe\x00\xcb\xff\xd7\x01\xfe\x00\ +\xcc\xff\xec\x01\xfe\x00\xcd\xff\xd7\x01\xfe\x00\xce\xff\xec\x01\ +\xfe\x00\xcf\xff\xd7\x01\xfe\x00\xd1\xff\xd7\x01\xfe\x00\xd3\xff\ +\xd7\x01\xfe\x00\xd5\xff\xd7\x01\xfe\x00\xd7\xff\xd7\x01\xfe\x00\ +\xd9\xff\xd7\x01\xfe\x00\xdb\xff\xd7\x01\xfe\x00\xdd\xff\xd7\x01\ +\xfe\x00\xde\xff\xec\x01\xfe\x00\xdf\xff\xec\x01\xfe\x00\xe0\xff\ +\xec\x01\xfe\x00\xe1\xff\xec\x01\xfe\x00\xe2\xff\xec\x01\xfe\x00\ +\xe3\xff\xec\x01\xfe\x00\xe4\xff\xec\x01\xfe\x00\xe5\xff\xec\x01\ +\xfe\x00\xfa\xff\xec\x01\xfe\x01\x06\xff\xec\x01\xfe\x01\x08\xff\ +\xec\x01\xfe\x01\x0d\xff\xec\x01\xfe\x01\x0e\xff\xec\x01\xfe\x01\ +\x0f\xff\xd7\x01\xfe\x01\x10\xff\xec\x01\xfe\x01\x11\xff\xd7\x01\ +\xfe\x01\x12\xff\xec\x01\xfe\x01\x13\xff\xd7\x01\xfe\x01\x14\xff\ +\xec\x01\xfe\x01\x15\xff\xd7\x01\xfe\x01\x17\xff\xec\x01\xfe\x01\ +\x19\xff\xec\x01\xfe\x01\x1d\xff\xec\x01\xfe\x01!\xff\xec\x01\ +\xfe\x01+\xff\xec\x01\xfe\x01-\xff\xec\x01\xfe\x01/\xff\ +\xec\x01\xfe\x011\xff\xec\x01\xfe\x013\xff\xec\x01\xfe\x01\ +5\xff\xec\x01\xfe\x01C\xff\xae\x01\xfe\x01D\xff\xd7\x01\ +\xfe\x01F\xff\xd7\x01\xfe\x01G\xff\xec\x01\xfe\x01H\xff\ +\xd7\x01\xfe\x01J\xff\xec\x01\xfe\x02\x08\xff\x9a\x01\xfe\x02\ +\x0c\xff\x9a\x01\xfe\x02W\xff\xec\x01\xfe\x02X\xff\xae\x01\ +\xfe\x02Y\xff\xd7\x01\xfe\x02_\xff\xec\x01\xfe\x02`\xff\ +\xd7\x01\xfe\x02b\xff\xec\x01\xfe\x03\x1d\xff\xae\x01\xfe\x03\ +\x1e\xff\xd7\x01\xfe\x03\x1f\xff\xae\x01\xfe\x03 \xff\xd7\x01\ +\xfe\x03!\xff\xae\x01\xfe\x03\x22\xff\xd7\x01\xfe\x03#\xff\ +\xae\x01\xfe\x03%\xff\xae\x01\xfe\x03&\xff\xd7\x01\xfe\x03\ +'\xff\xae\x01\xfe\x03(\xff\xd7\x01\xfe\x03)\xff\xae\x01\ +\xfe\x03*\xff\xd7\x01\xfe\x03+\xff\xae\x01\xfe\x03,\xff\ +\xd7\x01\xfe\x03-\xff\xae\x01\xfe\x03.\xff\xd7\x01\xfe\x03\ +/\xff\xae\x01\xfe\x030\xff\xd7\x01\xfe\x031\xff\xae\x01\ +\xfe\x032\xff\xd7\x01\xfe\x033\xff\xae\x01\xfe\x034\xff\ +\xd7\x01\xfe\x036\xff\xd7\x01\xfe\x038\xff\xd7\x01\xfe\x03\ +:\xff\xd7\x01\xfe\x03<\xff\xd7\x01\xfe\x03@\xff\xd7\x01\ +\xfe\x03B\xff\xd7\x01\xfe\x03D\xff\xd7\x01\xfe\x03I\xff\ +\xec\x01\xfe\x03J\xff\xd7\x01\xfe\x03K\xff\xec\x01\xfe\x03\ +L\xff\xd7\x01\xfe\x03M\xff\xec\x01\xfe\x03N\xff\xd7\x01\ +\xfe\x03O\xff\xec\x01\xfe\x03Q\xff\xec\x01\xfe\x03R\xff\ +\xd7\x01\xfe\x03S\xff\xec\x01\xfe\x03T\xff\xd7\x01\xfe\x03\ +U\xff\xec\x01\xfe\x03V\xff\xd7\x01\xfe\x03W\xff\xec\x01\ +\xfe\x03X\xff\xd7\x01\xfe\x03Y\xff\xec\x01\xfe\x03Z\xff\ +\xd7\x01\xfe\x03[\xff\xec\x01\xfe\x03\x5c\xff\xd7\x01\xfe\x03\ +]\xff\xec\x01\xfe\x03^\xff\xd7\x01\xfe\x03_\xff\xec\x01\ +\xfe\x03`\xff\xd7\x01\xfe\x03b\xff\xec\x01\xfe\x03d\xff\ +\xec\x01\xfe\x03f\xff\xec\x01\xfe\x03h\xff\xec\x01\xfe\x03\ +j\xff\xec\x01\xfe\x03l\xff\xec\x01\xfe\x03n\xff\xec\x01\ +\xff\x00\x05\x00R\x01\xff\x00\x0a\x00R\x01\xff\x00\x0f\xff\ +\xae\x01\xff\x00\x11\xff\xae\x01\xff\x00\x22\x00)\x01\xff\x02\ +\x07\x00R\x01\xff\x02\x08\xff\xae\x01\xff\x02\x0b\x00R\x01\ +\xff\x02\x0c\xff\xae\x02\x00\x00\x0f\xff\x85\x02\x00\x00\x11\xff\ +\x85\x02\x00\x00\x22\x00)\x02\x00\x00$\xff\x85\x02\x00\x00\ +&\xff\xd7\x02\x00\x00*\xff\xd7\x02\x00\x002\xff\xd7\x02\ +\x00\x004\xff\xd7\x02\x00\x00D\xff\x9a\x02\x00\x00F\xff\ +\x9a\x02\x00\x00G\xff\x9a\x02\x00\x00H\xff\x9a\x02\x00\x00\ +J\xff\xd7\x02\x00\x00P\xff\xc3\x02\x00\x00Q\xff\xc3\x02\ +\x00\x00R\xff\x9a\x02\x00\x00S\xff\xc3\x02\x00\x00T\xff\ +\x9a\x02\x00\x00U\xff\xc3\x02\x00\x00V\xff\xae\x02\x00\x00\ +X\xff\xc3\x02\x00\x00]\xff\xd7\x02\x00\x00\x82\xff\x85\x02\ +\x00\x00\x83\xff\x85\x02\x00\x00\x84\xff\x85\x02\x00\x00\x85\xff\ +\x85\x02\x00\x00\x86\xff\x85\x02\x00\x00\x87\xff\x85\x02\x00\x00\ +\x89\xff\xd7\x02\x00\x00\x94\xff\xd7\x02\x00\x00\x95\xff\xd7\x02\ +\x00\x00\x96\xff\xd7\x02\x00\x00\x97\xff\xd7\x02\x00\x00\x98\xff\ +\xd7\x02\x00\x00\x9a\xff\xd7\x02\x00\x00\xa2\xff\x9a\x02\x00\x00\ +\xa3\xff\x9a\x02\x00\x00\xa4\xff\x9a\x02\x00\x00\xa5\xff\x9a\x02\ +\x00\x00\xa6\xff\x9a\x02\x00\x00\xa7\xff\x9a\x02\x00\x00\xa8\xff\ +\x9a\x02\x00\x00\xa9\xff\x9a\x02\x00\x00\xaa\xff\x9a\x02\x00\x00\ +\xab\xff\x9a\x02\x00\x00\xac\xff\x9a\x02\x00\x00\xad\xff\x9a\x02\ +\x00\x00\xb4\xff\x9a\x02\x00\x00\xb5\xff\x9a\x02\x00\x00\xb6\xff\ +\x9a\x02\x00\x00\xb7\xff\x9a\x02\x00\x00\xb8\xff\x9a\x02\x00\x00\ +\xba\xff\x9a\x02\x00\x00\xbb\xff\xc3\x02\x00\x00\xbc\xff\xc3\x02\ +\x00\x00\xbd\xff\xc3\x02\x00\x00\xbe\xff\xc3\x02\x00\x00\xc2\xff\ +\x85\x02\x00\x00\xc3\xff\x9a\x02\x00\x00\xc4\xff\x85\x02\x00\x00\ +\xc5\xff\x9a\x02\x00\x00\xc6\xff\x85\x02\x00\x00\xc7\xff\x9a\x02\ +\x00\x00\xc8\xff\xd7\x02\x00\x00\xc9\xff\x9a\x02\x00\x00\xca\xff\ +\xd7\x02\x00\x00\xcb\xff\x9a\x02\x00\x00\xcc\xff\xd7\x02\x00\x00\ +\xcd\xff\x9a\x02\x00\x00\xce\xff\xd7\x02\x00\x00\xcf\xff\x9a\x02\ +\x00\x00\xd1\xff\x9a\x02\x00\x00\xd3\xff\x9a\x02\x00\x00\xd5\xff\ +\x9a\x02\x00\x00\xd7\xff\x9a\x02\x00\x00\xd9\xff\x9a\x02\x00\x00\ +\xdb\xff\x9a\x02\x00\x00\xdd\xff\x9a\x02\x00\x00\xde\xff\xd7\x02\ +\x00\x00\xdf\xff\xd7\x02\x00\x00\xe0\xff\xd7\x02\x00\x00\xe1\xff\ +\xd7\x02\x00\x00\xe2\xff\xd7\x02\x00\x00\xe3\xff\xd7\x02\x00\x00\ +\xe4\xff\xd7\x02\x00\x00\xe5\xff\xd7\x02\x00\x00\xfa\xff\xc3\x02\ +\x00\x01\x06\xff\xc3\x02\x00\x01\x08\xff\xc3\x02\x00\x01\x0d\xff\ +\xc3\x02\x00\x01\x0e\xff\xd7\x02\x00\x01\x0f\xff\x9a\x02\x00\x01\ +\x10\xff\xd7\x02\x00\x01\x11\xff\x9a\x02\x00\x01\x12\xff\xd7\x02\ +\x00\x01\x13\xff\x9a\x02\x00\x01\x14\xff\xd7\x02\x00\x01\x15\xff\ +\x9a\x02\x00\x01\x17\xff\xc3\x02\x00\x01\x19\xff\xc3\x02\x00\x01\ +\x1d\xff\xae\x02\x00\x01!\xff\xae\x02\x00\x01+\xff\xc3\x02\ +\x00\x01-\xff\xc3\x02\x00\x01/\xff\xc3\x02\x00\x011\xff\ +\xc3\x02\x00\x013\xff\xc3\x02\x00\x015\xff\xc3\x02\x00\x01\ +<\xff\xd7\x02\x00\x01>\xff\xd7\x02\x00\x01@\xff\xd7\x02\ +\x00\x01C\xff\x85\x02\x00\x01D\xff\x9a\x02\x00\x01F\xff\ +\x9a\x02\x00\x01G\xff\xd7\x02\x00\x01H\xff\x9a\x02\x00\x01\ +J\xff\xae\x02\x00\x02\x08\xff\x85\x02\x00\x02\x0c\xff\x85\x02\ +\x00\x02W\xff\xc3\x02\x00\x02X\xff\x85\x02\x00\x02Y\xff\ +\x9a\x02\x00\x02_\xff\xd7\x02\x00\x02`\xff\x9a\x02\x00\x02\ +b\xff\xc3\x02\x00\x03\x1d\xff\x85\x02\x00\x03\x1e\xff\x9a\x02\ +\x00\x03\x1f\xff\x85\x02\x00\x03 \xff\x9a\x02\x00\x03!\xff\ +\x85\x02\x00\x03\x22\xff\x9a\x02\x00\x03#\xff\x85\x02\x00\x03\ +%\xff\x85\x02\x00\x03&\xff\x9a\x02\x00\x03'\xff\x85\x02\ +\x00\x03(\xff\x9a\x02\x00\x03)\xff\x85\x02\x00\x03*\xff\ +\x9a\x02\x00\x03+\xff\x85\x02\x00\x03,\xff\x9a\x02\x00\x03\ +-\xff\x85\x02\x00\x03.\xff\x9a\x02\x00\x03/\xff\x85\x02\ +\x00\x030\xff\x9a\x02\x00\x031\xff\x85\x02\x00\x032\xff\ +\x9a\x02\x00\x033\xff\x85\x02\x00\x034\xff\x9a\x02\x00\x03\ +6\xff\x9a\x02\x00\x038\xff\x9a\x02\x00\x03:\xff\x9a\x02\ +\x00\x03<\xff\x9a\x02\x00\x03@\xff\x9a\x02\x00\x03B\xff\ +\x9a\x02\x00\x03D\xff\x9a\x02\x00\x03I\xff\xd7\x02\x00\x03\ +J\xff\x9a\x02\x00\x03K\xff\xd7\x02\x00\x03L\xff\x9a\x02\ +\x00\x03M\xff\xd7\x02\x00\x03N\xff\x9a\x02\x00\x03O\xff\ +\xd7\x02\x00\x03Q\xff\xd7\x02\x00\x03R\xff\x9a\x02\x00\x03\ +S\xff\xd7\x02\x00\x03T\xff\x9a\x02\x00\x03U\xff\xd7\x02\ +\x00\x03V\xff\x9a\x02\x00\x03W\xff\xd7\x02\x00\x03X\xff\ +\x9a\x02\x00\x03Y\xff\xd7\x02\x00\x03Z\xff\x9a\x02\x00\x03\ +[\xff\xd7\x02\x00\x03\x5c\xff\x9a\x02\x00\x03]\xff\xd7\x02\ +\x00\x03^\xff\x9a\x02\x00\x03_\xff\xd7\x02\x00\x03`\xff\ +\x9a\x02\x00\x03b\xff\xc3\x02\x00\x03d\xff\xc3\x02\x00\x03\ +f\xff\xc3\x02\x00\x03h\xff\xc3\x02\x00\x03j\xff\xc3\x02\ +\x00\x03l\xff\xc3\x02\x00\x03n\xff\xc3\x02\x01\x00\x05\x00\ +R\x02\x01\x00\x0a\x00R\x02\x01\x00\x0f\xff\xae\x02\x01\x00\ +\x11\xff\xae\x02\x01\x00\x22\x00)\x02\x01\x02\x07\x00R\x02\ +\x01\x02\x08\xff\xae\x02\x01\x02\x0b\x00R\x02\x01\x02\x0c\xff\ +\xae\x02\x02\x007\xff\xae\x02\x02\x01$\xff\xae\x02\x02\x01\ +&\xff\xae\x02\x02\x01q\xff\xae\x02\x02\x01\x9d\xff\xae\x02\ +\x02\x01\xa6\xff\xae\x02\x02\x01\xbc\xff\xae\x02\x02\x01\xc4\xff\ +\xae\x02\x02\x01\xdc\xff\xd7\x02\x02\x01\xe4\xff\xd7\x02\x02\x02\ +\xa9\xff\xae\x02\x02\x02\xaa\xff\xd7\x02\x02\x02\xb5\xff\xae\x02\ +\x02\x02\xb6\xff\xd7\x02\x02\x02\xbd\xff\xae\x02\x02\x02\xbe\xff\ +\xd7\x02\x02\x03\x17\xff\xae\x02\x02\x03\x18\xff\xd7\x02\x02\x03\ +\x8f\xff\xae\x02\x03\x007\xff\xae\x02\x03\x01$\xff\xae\x02\ +\x03\x01&\xff\xae\x02\x03\x01q\xff\xae\x02\x03\x01\x9d\xff\ +\xae\x02\x03\x01\xa6\xff\xae\x02\x03\x01\xbc\xff\xae\x02\x03\x01\ +\xc4\xff\xae\x02\x03\x01\xdc\xff\xd7\x02\x03\x01\xe4\xff\xd7\x02\ +\x03\x02\xa9\xff\xae\x02\x03\x02\xaa\xff\xd7\x02\x03\x02\xb5\xff\ +\xae\x02\x03\x02\xb6\xff\xd7\x02\x03\x02\xbd\xff\xae\x02\x03\x02\ +\xbe\xff\xd7\x02\x03\x03\x17\xff\xae\x02\x03\x03\x18\xff\xd7\x02\ +\x03\x03\x8f\xff\xae\x02\x04\x007\xff\xae\x02\x04\x01$\xff\ +\xae\x02\x04\x01&\xff\xae\x02\x04\x01q\xff\xae\x02\x04\x01\ +\x9d\xff\xae\x02\x04\x01\xa6\xff\xae\x02\x04\x01\xbc\xff\xae\x02\ +\x04\x01\xc4\xff\xae\x02\x04\x01\xdc\xff\xd7\x02\x04\x01\xe4\xff\ +\xd7\x02\x04\x02\xa9\xff\xae\x02\x04\x02\xaa\xff\xd7\x02\x04\x02\ +\xb5\xff\xae\x02\x04\x02\xb6\xff\xd7\x02\x04\x02\xbd\xff\xae\x02\ +\x04\x02\xbe\xff\xd7\x02\x04\x03\x17\xff\xae\x02\x04\x03\x18\xff\ +\xd7\x02\x04\x03\x8f\xff\xae\x02\x06\x00$\xffq\x02\x06\x00\ +7\x00)\x02\x06\x009\x00)\x02\x06\x00:\x00)\x02\ +\x06\x00<\x00\x14\x02\x06\x00D\xff\xae\x02\x06\x00F\xff\ +\x85\x02\x06\x00G\xff\x85\x02\x06\x00H\xff\x85\x02\x06\x00\ +J\xff\xc3\x02\x06\x00P\xff\xc3\x02\x06\x00Q\xff\xc3\x02\ +\x06\x00R\xff\x85\x02\x06\x00S\xff\xc3\x02\x06\x00T\xff\ +\x85\x02\x06\x00U\xff\xc3\x02\x06\x00V\xff\xc3\x02\x06\x00\ +X\xff\xc3\x02\x06\x00\x82\xffq\x02\x06\x00\x83\xffq\x02\ +\x06\x00\x84\xffq\x02\x06\x00\x85\xffq\x02\x06\x00\x86\xff\ +q\x02\x06\x00\x87\xffq\x02\x06\x00\x9f\x00\x14\x02\x06\x00\ +\xa2\xff\x85\x02\x06\x00\xa3\xff\xae\x02\x06\x00\xa4\xff\xae\x02\ +\x06\x00\xa5\xff\xae\x02\x06\x00\xa6\xff\xae\x02\x06\x00\xa7\xff\ +\xae\x02\x06\x00\xa8\xff\xae\x02\x06\x00\xa9\xff\x85\x02\x06\x00\ +\xaa\xff\x85\x02\x06\x00\xab\xff\x85\x02\x06\x00\xac\xff\x85\x02\ +\x06\x00\xad\xff\x85\x02\x06\x00\xb4\xff\x85\x02\x06\x00\xb5\xff\ +\x85\x02\x06\x00\xb6\xff\x85\x02\x06\x00\xb7\xff\x85\x02\x06\x00\ +\xb8\xff\x85\x02\x06\x00\xba\xff\x85\x02\x06\x00\xbb\xff\xc3\x02\ +\x06\x00\xbc\xff\xc3\x02\x06\x00\xbd\xff\xc3\x02\x06\x00\xbe\xff\ +\xc3\x02\x06\x00\xc2\xffq\x02\x06\x00\xc3\xff\xae\x02\x06\x00\ +\xc4\xffq\x02\x06\x00\xc5\xff\xae\x02\x06\x00\xc6\xffq\x02\ +\x06\x00\xc7\xff\xae\x02\x06\x00\xc9\xff\x85\x02\x06\x00\xcb\xff\ +\x85\x02\x06\x00\xcd\xff\x85\x02\x06\x00\xcf\xff\x85\x02\x06\x00\ +\xd1\xff\x85\x02\x06\x00\xd3\xff\x85\x02\x06\x00\xd5\xff\x85\x02\ +\x06\x00\xd7\xff\x85\x02\x06\x00\xd9\xff\x85\x02\x06\x00\xdb\xff\ +\x85\x02\x06\x00\xdd\xff\x85\x02\x06\x00\xdf\xff\xc3\x02\x06\x00\ +\xe1\xff\xc3\x02\x06\x00\xe3\xff\xc3\x02\x06\x00\xe5\xff\xc3\x02\ +\x06\x00\xfa\xff\xc3\x02\x06\x01\x06\xff\xc3\x02\x06\x01\x08\xff\ +\xc3\x02\x06\x01\x0d\xff\xc3\x02\x06\x01\x0f\xff\x85\x02\x06\x01\ +\x11\xff\x85\x02\x06\x01\x13\xff\x85\x02\x06\x01\x15\xff\x85\x02\ +\x06\x01\x17\xff\xc3\x02\x06\x01\x19\xff\xc3\x02\x06\x01\x1d\xff\ +\xc3\x02\x06\x01!\xff\xc3\x02\x06\x01$\x00)\x02\x06\x01\ +&\x00)\x02\x06\x01+\xff\xc3\x02\x06\x01-\xff\xc3\x02\ +\x06\x01/\xff\xc3\x02\x06\x011\xff\xc3\x02\x06\x013\xff\ +\xc3\x02\x06\x015\xff\xc3\x02\x06\x016\x00)\x02\x06\x01\ +8\x00\x14\x02\x06\x01:\x00\x14\x02\x06\x01C\xffq\x02\ +\x06\x01D\xff\xae\x02\x06\x01F\xff\xae\x02\x06\x01H\xff\ +\x85\x02\x06\x01J\xff\xc3\x02\x06\x01V\xffq\x02\x06\x01\ +_\xffq\x02\x06\x01b\xffq\x02\x06\x01i\xffq\x02\ +\x06\x01y\xff\xae\x02\x06\x01z\xff\xd7\x02\x06\x01{\xff\ +\xd7\x02\x06\x01~\xff\xae\x02\x06\x01\x81\xff\xc3\x02\x06\x01\ +\x82\xff\xd7\x02\x06\x01\x83\xff\xd7\x02\x06\x01\x84\xff\xd7\x02\ +\x06\x01\x87\xff\xd7\x02\x06\x01\x89\xff\xd7\x02\x06\x01\x8c\xff\ +\xae\x02\x06\x01\x8e\xff\xc3\x02\x06\x01\x8f\xff\xae\x02\x06\x01\ +\x90\xff\xae\x02\x06\x01\x93\xff\xae\x02\x06\x01\x99\xff\xae\x02\ +\x06\x01\xa4\xff\x85\x02\x06\x01\xaa\xffq\x02\x06\x01\xae\xff\ +\x85\x02\x06\x01\xb5\xff\x85\x02\x06\x01\xca\xff\xd7\x02\x06\x01\ +\xce\xffq\x02\x06\x01\xcf\xff\x85\x02\x06\x01\xd5\xffq\x02\ +\x06\x01\xd8\xff\x85\x02\x06\x01\xdb\xff\x85\x02\x06\x01\xde\xff\ +\x85\x02\x06\x01\xea\xff\x85\x02\x06\x01\xed\xff\x85\x02\x06\x01\ +\xee\xff\xc3\x02\x06\x01\xf2\xffq\x02\x06\x01\xfa\x00)\x02\ +\x06\x01\xfc\x00)\x02\x06\x01\xfe\x00)\x02\x06\x02\x00\x00\ +\x14\x02\x06\x02W\xff\xc3\x02\x06\x02X\xffq\x02\x06\x02\ +Y\xff\xae\x02\x06\x02`\xff\x85\x02\x06\x02b\xff\xc3\x02\ +\x06\x02j\xff\x85\x02\x06\x02r\xffq\x02\x06\x02s\xff\ +q\x02\x06\x02}\xff\xec\x02\x06\x02\x7f\xff\x85\x02\x06\x02\ +\x85\xff\x85\x02\x06\x02\x87\xff\x85\x02\x06\x02\x89\xff\x85\x02\ +\x06\x02\x8d\xff\x85\x02\x06\x02\xb2\xff\x85\x02\x06\x02\xb4\xff\ +\x85\x02\x06\x02\xce\xff\x85\x02\x06\x02\xcf\xffq\x02\x06\x02\ +\xd9\xffq\x02\x06\x02\xda\xff\xd7\x02\x06\x02\xdb\xffq\x02\ +\x06\x02\xdc\xff\xd7\x02\x06\x02\xdd\xffq\x02\x06\x02\xde\xff\ +\xd7\x02\x06\x02\xe0\xff\x85\x02\x06\x02\xe2\xff\xd7\x02\x06\x02\ +\xe4\xff\xd7\x02\x06\x02\xf0\xff\x85\x02\x06\x02\xf2\xff\x85\x02\ +\x06\x02\xf4\xff\x85\x02\x06\x03\x09\xffq\x02\x06\x03\x0a\xff\ +\x85\x02\x06\x03\x0b\xffq\x02\x06\x03\x0c\xff\x85\x02\x06\x03\ +\x11\xff\x85\x02\x06\x03\x12\xffq\x02\x06\x03\x16\xff\x85\x02\ +\x06\x03\x1a\xff\x85\x02\x06\x03\x1b\xff\x85\x02\x06\x03\x1c\xff\ +q\x02\x06\x03\x1d\xffq\x02\x06\x03\x1e\xff\xae\x02\x06\x03\ +\x1f\xffq\x02\x06\x03 \xff\xae\x02\x06\x03!\xffq\x02\ +\x06\x03\x22\xff\xae\x02\x06\x03#\xffq\x02\x06\x03%\xff\ +q\x02\x06\x03&\xff\xae\x02\x06\x03'\xffq\x02\x06\x03\ +(\xff\xae\x02\x06\x03)\xffq\x02\x06\x03*\xff\xae\x02\ +\x06\x03+\xffq\x02\x06\x03,\xff\xae\x02\x06\x03-\xff\ +q\x02\x06\x03.\xff\xae\x02\x06\x03/\xffq\x02\x06\x03\ +0\xff\xae\x02\x06\x031\xffq\x02\x06\x032\xff\xae\x02\ +\x06\x033\xffq\x02\x06\x034\xff\xae\x02\x06\x036\xff\ +\x85\x02\x06\x038\xff\x85\x02\x06\x03:\xff\x85\x02\x06\x03\ +<\xff\x85\x02\x06\x03@\xff\x85\x02\x06\x03B\xff\x85\x02\ +\x06\x03D\xff\x85\x02\x06\x03J\xff\x85\x02\x06\x03L\xff\ +\x85\x02\x06\x03N\xff\x85\x02\x06\x03R\xff\x85\x02\x06\x03\ +T\xff\x85\x02\x06\x03V\xff\x85\x02\x06\x03X\xff\x85\x02\ +\x06\x03Z\xff\x85\x02\x06\x03\x5c\xff\x85\x02\x06\x03^\xff\ +\x85\x02\x06\x03`\xff\x85\x02\x06\x03b\xff\xc3\x02\x06\x03\ +d\xff\xc3\x02\x06\x03f\xff\xc3\x02\x06\x03h\xff\xc3\x02\ +\x06\x03j\xff\xc3\x02\x06\x03l\xff\xc3\x02\x06\x03n\xff\ +\xc3\x02\x06\x03o\x00\x14\x02\x06\x03q\x00\x14\x02\x06\x03\ +s\x00\x14\x02\x06\x03\x8f\x00)\x02\x07\x00$\xffq\x02\ +\x07\x007\x00)\x02\x07\x009\x00)\x02\x07\x00:\x00\ +)\x02\x07\x00<\x00\x14\x02\x07\x00D\xff\xae\x02\x07\x00\ +F\xff\x85\x02\x07\x00G\xff\x85\x02\x07\x00H\xff\x85\x02\ +\x07\x00J\xff\xc3\x02\x07\x00P\xff\xc3\x02\x07\x00Q\xff\ +\xc3\x02\x07\x00R\xff\x85\x02\x07\x00S\xff\xc3\x02\x07\x00\ +T\xff\x85\x02\x07\x00U\xff\xc3\x02\x07\x00V\xff\xc3\x02\ +\x07\x00X\xff\xc3\x02\x07\x00\x82\xffq\x02\x07\x00\x83\xff\ +q\x02\x07\x00\x84\xffq\x02\x07\x00\x85\xffq\x02\x07\x00\ +\x86\xffq\x02\x07\x00\x87\xffq\x02\x07\x00\x9f\x00\x14\x02\ +\x07\x00\xa2\xff\x85\x02\x07\x00\xa3\xff\xae\x02\x07\x00\xa4\xff\ +\xae\x02\x07\x00\xa5\xff\xae\x02\x07\x00\xa6\xff\xae\x02\x07\x00\ +\xa7\xff\xae\x02\x07\x00\xa8\xff\xae\x02\x07\x00\xa9\xff\x85\x02\ +\x07\x00\xaa\xff\x85\x02\x07\x00\xab\xff\x85\x02\x07\x00\xac\xff\ +\x85\x02\x07\x00\xad\xff\x85\x02\x07\x00\xb4\xff\x85\x02\x07\x00\ +\xb5\xff\x85\x02\x07\x00\xb6\xff\x85\x02\x07\x00\xb7\xff\x85\x02\ +\x07\x00\xb8\xff\x85\x02\x07\x00\xba\xff\x85\x02\x07\x00\xbb\xff\ +\xc3\x02\x07\x00\xbc\xff\xc3\x02\x07\x00\xbd\xff\xc3\x02\x07\x00\ +\xbe\xff\xc3\x02\x07\x00\xc2\xffq\x02\x07\x00\xc3\xff\xae\x02\ +\x07\x00\xc4\xffq\x02\x07\x00\xc5\xff\xae\x02\x07\x00\xc6\xff\ +q\x02\x07\x00\xc7\xff\xae\x02\x07\x00\xc9\xff\x85\x02\x07\x00\ +\xcb\xff\x85\x02\x07\x00\xcd\xff\x85\x02\x07\x00\xcf\xff\x85\x02\ +\x07\x00\xd1\xff\x85\x02\x07\x00\xd3\xff\x85\x02\x07\x00\xd5\xff\ +\x85\x02\x07\x00\xd7\xff\x85\x02\x07\x00\xd9\xff\x85\x02\x07\x00\ +\xdb\xff\x85\x02\x07\x00\xdd\xff\x85\x02\x07\x00\xdf\xff\xc3\x02\ +\x07\x00\xe1\xff\xc3\x02\x07\x00\xe3\xff\xc3\x02\x07\x00\xe5\xff\ +\xc3\x02\x07\x00\xfa\xff\xc3\x02\x07\x01\x06\xff\xc3\x02\x07\x01\ +\x08\xff\xc3\x02\x07\x01\x0d\xff\xc3\x02\x07\x01\x0f\xff\x85\x02\ +\x07\x01\x11\xff\x85\x02\x07\x01\x13\xff\x85\x02\x07\x01\x15\xff\ +\x85\x02\x07\x01\x17\xff\xc3\x02\x07\x01\x19\xff\xc3\x02\x07\x01\ +\x1d\xff\xc3\x02\x07\x01!\xff\xc3\x02\x07\x01$\x00)\x02\ +\x07\x01&\x00)\x02\x07\x01+\xff\xc3\x02\x07\x01-\xff\ +\xc3\x02\x07\x01/\xff\xc3\x02\x07\x011\xff\xc3\x02\x07\x01\ +3\xff\xc3\x02\x07\x015\xff\xc3\x02\x07\x016\x00)\x02\ +\x07\x018\x00\x14\x02\x07\x01:\x00\x14\x02\x07\x01C\xff\ +q\x02\x07\x01D\xff\xae\x02\x07\x01F\xff\xae\x02\x07\x01\ +H\xff\x85\x02\x07\x01J\xff\xc3\x02\x07\x01V\xffq\x02\ +\x07\x01_\xffq\x02\x07\x01b\xffq\x02\x07\x01i\xff\ +q\x02\x07\x01y\xff\xae\x02\x07\x01z\xff\xd7\x02\x07\x01\ +{\xff\xd7\x02\x07\x01~\xff\xae\x02\x07\x01\x81\xff\xc3\x02\ +\x07\x01\x82\xff\xd7\x02\x07\x01\x83\xff\xd7\x02\x07\x01\x84\xff\ +\xd7\x02\x07\x01\x87\xff\xd7\x02\x07\x01\x89\xff\xd7\x02\x07\x01\ +\x8c\xff\xae\x02\x07\x01\x8e\xff\xc3\x02\x07\x01\x8f\xff\xae\x02\ +\x07\x01\x90\xff\xae\x02\x07\x01\x93\xff\xae\x02\x07\x01\x99\xff\ +\xae\x02\x07\x01\xa4\xff\x85\x02\x07\x01\xaa\xffq\x02\x07\x01\ +\xae\xff\x85\x02\x07\x01\xb5\xff\x85\x02\x07\x01\xca\xff\xd7\x02\ +\x07\x01\xce\xffq\x02\x07\x01\xcf\xff\x85\x02\x07\x01\xd5\xff\ +q\x02\x07\x01\xd8\xff\x85\x02\x07\x01\xdb\xff\x85\x02\x07\x01\ +\xde\xff\x85\x02\x07\x01\xea\xff\x85\x02\x07\x01\xed\xff\x85\x02\ +\x07\x01\xee\xff\xc3\x02\x07\x01\xf2\xffq\x02\x07\x01\xfa\x00\ +)\x02\x07\x01\xfc\x00)\x02\x07\x01\xfe\x00)\x02\x07\x02\ +\x00\x00\x14\x02\x07\x02W\xff\xc3\x02\x07\x02X\xffq\x02\ +\x07\x02Y\xff\xae\x02\x07\x02`\xff\x85\x02\x07\x02b\xff\ +\xc3\x02\x07\x02j\xff\x85\x02\x07\x02r\xffq\x02\x07\x02\ +s\xffq\x02\x07\x02}\xff\xec\x02\x07\x02\x7f\xff\x85\x02\ +\x07\x02\x85\xff\x85\x02\x07\x02\x87\xff\x85\x02\x07\x02\x89\xff\ +\x85\x02\x07\x02\x8d\xff\x85\x02\x07\x02\xb2\xff\x85\x02\x07\x02\ +\xb4\xff\x85\x02\x07\x02\xce\xff\x85\x02\x07\x02\xcf\xffq\x02\ +\x07\x02\xd9\xffq\x02\x07\x02\xda\xff\xd7\x02\x07\x02\xdb\xff\ +q\x02\x07\x02\xdc\xff\xd7\x02\x07\x02\xdd\xffq\x02\x07\x02\ +\xde\xff\xd7\x02\x07\x02\xe0\xff\x85\x02\x07\x02\xe2\xff\xd7\x02\ +\x07\x02\xe4\xff\xd7\x02\x07\x02\xf0\xff\x85\x02\x07\x02\xf2\xff\ +\x85\x02\x07\x02\xf4\xff\x85\x02\x07\x03\x09\xffq\x02\x07\x03\ +\x0a\xff\x85\x02\x07\x03\x0b\xffq\x02\x07\x03\x0c\xff\x85\x02\ +\x07\x03\x11\xff\x85\x02\x07\x03\x12\xffq\x02\x07\x03\x16\xff\ +\x85\x02\x07\x03\x1a\xff\x85\x02\x07\x03\x1b\xff\x85\x02\x07\x03\ +\x1c\xffq\x02\x07\x03\x1d\xffq\x02\x07\x03\x1e\xff\xae\x02\ +\x07\x03\x1f\xffq\x02\x07\x03 \xff\xae\x02\x07\x03!\xff\ +q\x02\x07\x03\x22\xff\xae\x02\x07\x03#\xffq\x02\x07\x03\ +%\xffq\x02\x07\x03&\xff\xae\x02\x07\x03'\xffq\x02\ +\x07\x03(\xff\xae\x02\x07\x03)\xffq\x02\x07\x03*\xff\ +\xae\x02\x07\x03+\xffq\x02\x07\x03,\xff\xae\x02\x07\x03\ +-\xffq\x02\x07\x03.\xff\xae\x02\x07\x03/\xffq\x02\ +\x07\x030\xff\xae\x02\x07\x031\xffq\x02\x07\x032\xff\ +\xae\x02\x07\x033\xffq\x02\x07\x034\xff\xae\x02\x07\x03\ +6\xff\x85\x02\x07\x038\xff\x85\x02\x07\x03:\xff\x85\x02\ +\x07\x03<\xff\x85\x02\x07\x03@\xff\x85\x02\x07\x03B\xff\ +\x85\x02\x07\x03D\xff\x85\x02\x07\x03J\xff\x85\x02\x07\x03\ +L\xff\x85\x02\x07\x03N\xff\x85\x02\x07\x03R\xff\x85\x02\ +\x07\x03T\xff\x85\x02\x07\x03V\xff\x85\x02\x07\x03X\xff\ +\x85\x02\x07\x03Z\xff\x85\x02\x07\x03\x5c\xff\x85\x02\x07\x03\ +^\xff\x85\x02\x07\x03`\xff\x85\x02\x07\x03b\xff\xc3\x02\ +\x07\x03d\xff\xc3\x02\x07\x03f\xff\xc3\x02\x07\x03h\xff\ +\xc3\x02\x07\x03j\xff\xc3\x02\x07\x03l\xff\xc3\x02\x07\x03\ +n\xff\xc3\x02\x07\x03o\x00\x14\x02\x07\x03q\x00\x14\x02\ +\x07\x03s\x00\x14\x02\x07\x03\x8f\x00)\x02\x08\x00&\xff\ +\x9a\x02\x08\x00*\xff\x9a\x02\x08\x002\xff\x9a\x02\x08\x00\ +4\xff\x9a\x02\x08\x007\xffq\x02\x08\x008\xff\xd7\x02\ +\x08\x009\xff\x85\x02\x08\x00:\xff\x85\x02\x08\x00<\xff\ +\x85\x02\x08\x00\x89\xff\x9a\x02\x08\x00\x94\xff\x9a\x02\x08\x00\ +\x95\xff\x9a\x02\x08\x00\x96\xff\x9a\x02\x08\x00\x97\xff\x9a\x02\ +\x08\x00\x98\xff\x9a\x02\x08\x00\x9a\xff\x9a\x02\x08\x00\x9b\xff\ +\xd7\x02\x08\x00\x9c\xff\xd7\x02\x08\x00\x9d\xff\xd7\x02\x08\x00\ +\x9e\xff\xd7\x02\x08\x00\x9f\xff\x85\x02\x08\x00\xc8\xff\x9a\x02\ +\x08\x00\xca\xff\x9a\x02\x08\x00\xcc\xff\x9a\x02\x08\x00\xce\xff\ +\x9a\x02\x08\x00\xde\xff\x9a\x02\x08\x00\xe0\xff\x9a\x02\x08\x00\ +\xe2\xff\x9a\x02\x08\x00\xe4\xff\x9a\x02\x08\x01\x0e\xff\x9a\x02\ +\x08\x01\x10\xff\x9a\x02\x08\x01\x12\xff\x9a\x02\x08\x01\x14\xff\ +\x9a\x02\x08\x01$\xffq\x02\x08\x01&\xffq\x02\x08\x01\ +*\xff\xd7\x02\x08\x01,\xff\xd7\x02\x08\x01.\xff\xd7\x02\ +\x08\x010\xff\xd7\x02\x08\x012\xff\xd7\x02\x08\x014\xff\ +\xd7\x02\x08\x016\xff\x85\x02\x08\x018\xff\x85\x02\x08\x01\ +:\xff\x85\x02\x08\x01G\xff\x9a\x02\x08\x01f\xff\xae\x02\ +\x08\x01m\xff\xae\x02\x08\x01q\xffq\x02\x08\x01r\xff\ +\x85\x02\x08\x01s\xff\x9a\x02\x08\x01u\xff\x85\x02\x08\x01\ +x\xff\x85\x02\x08\x01\x85\xff\xd7\x02\x08\x01\x9d\xffq\x02\ +\x08\x01\x9f\xff\x9a\x02\x08\x01\xa6\xffq\x02\x08\x01\xb8\xff\ +\x9a\x02\x08\x01\xbb\xff\x9a\x02\x08\x01\xbc\xffq\x02\x08\x01\ +\xbe\xff\xae\x02\x08\x01\xc1\xff\x5c\x02\x08\x01\xc4\xffq\x02\ +\x08\x01\xdc\xff\x9a\x02\x08\x01\xe1\xff\x85\x02\x08\x01\xe4\xff\ +\x9a\x02\x08\x01\xfa\xff\x85\x02\x08\x01\xfc\xff\x85\x02\x08\x01\ +\xfe\xff\x85\x02\x08\x02\x00\xff\x85\x02\x08\x02T\xff\x85\x02\ +\x08\x02_\xff\x9a\x02\x08\x02a\xff\xd7\x02\x08\x02l\xff\ +\x9a\x02\x08\x02|\xff\x5c\x02\x08\x02~\xff\x9a\x02\x08\x02\ +\x80\xff\x85\x02\x08\x02\x82\xff\x85\x02\x08\x02\x84\xff\x9a\x02\ +\x08\x02\x86\xff\x9a\x02\x08\x02\x88\xff\x9a\x02\x08\x02\x8a\xff\ +\x9a\x02\x08\x02\x8c\xff\x9a\x02\x08\x02\xa9\xffq\x02\x08\x02\ +\xaa\xff\x9a\x02\x08\x02\xb1\xff\x9a\x02\x08\x02\xb3\xff\x9a\x02\ +\x08\x02\xb5\xffq\x02\x08\x02\xb6\xff\x9a\x02\x08\x02\xb7\xff\ +\x85\x02\x08\x02\xb9\xff\x85\x02\x08\x02\xbd\xffq\x02\x08\x02\ +\xbe\xff\x9a\x02\x08\x02\xbf\xff\x5c\x02\x08\x02\xc0\xff\x85\x02\ +\x08\x02\xc1\xff\x5c\x02\x08\x02\xc2\xff\x85\x02\x08\x02\xc5\xff\ +\x85\x02\x08\x02\xc7\xff\x85\x02\x08\x02\xd4\xff\x5c\x02\x08\x02\ +\xd5\xff\x85\x02\x08\x02\xef\xff\x9a\x02\x08\x02\xf1\xff\x9a\x02\ +\x08\x02\xf3\xff\x9a\x02\x08\x02\xfd\xff\x5c\x02\x08\x02\xfe\xff\ +\x85\x02\x08\x03\x0d\xff\x85\x02\x08\x03\x0e\xff\x9a\x02\x08\x03\ +\x0f\xff\x85\x02\x08\x03\x10\xff\x9a\x02\x08\x03\x15\xff\x9a\x02\ +\x08\x03\x17\xffq\x02\x08\x03\x18\xff\x9a\x02\x08\x03I\xff\ +\x9a\x02\x08\x03K\xff\x9a\x02\x08\x03M\xff\x9a\x02\x08\x03\ +O\xff\x9a\x02\x08\x03Q\xff\x9a\x02\x08\x03S\xff\x9a\x02\ +\x08\x03U\xff\x9a\x02\x08\x03W\xff\x9a\x02\x08\x03Y\xff\ +\x9a\x02\x08\x03[\xff\x9a\x02\x08\x03]\xff\x9a\x02\x08\x03\ +_\xff\x9a\x02\x08\x03a\xff\xd7\x02\x08\x03c\xff\xd7\x02\ +\x08\x03e\xff\xd7\x02\x08\x03g\xff\xd7\x02\x08\x03i\xff\ +\xd7\x02\x08\x03k\xff\xd7\x02\x08\x03m\xff\xd7\x02\x08\x03\ +o\xff\x85\x02\x08\x03q\xff\x85\x02\x08\x03s\xff\x85\x02\ +\x08\x03\x8f\xffq\x02\x0a\x00$\xffq\x02\x0a\x007\x00\ +)\x02\x0a\x009\x00)\x02\x0a\x00:\x00)\x02\x0a\x00\ +<\x00\x14\x02\x0a\x00D\xff\xae\x02\x0a\x00F\xff\x85\x02\ +\x0a\x00G\xff\x85\x02\x0a\x00H\xff\x85\x02\x0a\x00J\xff\ +\xc3\x02\x0a\x00P\xff\xc3\x02\x0a\x00Q\xff\xc3\x02\x0a\x00\ +R\xff\x85\x02\x0a\x00S\xff\xc3\x02\x0a\x00T\xff\x85\x02\ +\x0a\x00U\xff\xc3\x02\x0a\x00V\xff\xc3\x02\x0a\x00X\xff\ +\xc3\x02\x0a\x00\x82\xffq\x02\x0a\x00\x83\xffq\x02\x0a\x00\ +\x84\xffq\x02\x0a\x00\x85\xffq\x02\x0a\x00\x86\xffq\x02\ +\x0a\x00\x87\xffq\x02\x0a\x00\x9f\x00\x14\x02\x0a\x00\xa2\xff\ +\x85\x02\x0a\x00\xa3\xff\xae\x02\x0a\x00\xa4\xff\xae\x02\x0a\x00\ +\xa5\xff\xae\x02\x0a\x00\xa6\xff\xae\x02\x0a\x00\xa7\xff\xae\x02\ +\x0a\x00\xa8\xff\xae\x02\x0a\x00\xa9\xff\x85\x02\x0a\x00\xaa\xff\ +\x85\x02\x0a\x00\xab\xff\x85\x02\x0a\x00\xac\xff\x85\x02\x0a\x00\ +\xad\xff\x85\x02\x0a\x00\xb4\xff\x85\x02\x0a\x00\xb5\xff\x85\x02\ +\x0a\x00\xb6\xff\x85\x02\x0a\x00\xb7\xff\x85\x02\x0a\x00\xb8\xff\ +\x85\x02\x0a\x00\xba\xff\x85\x02\x0a\x00\xbb\xff\xc3\x02\x0a\x00\ +\xbc\xff\xc3\x02\x0a\x00\xbd\xff\xc3\x02\x0a\x00\xbe\xff\xc3\x02\ +\x0a\x00\xc2\xffq\x02\x0a\x00\xc3\xff\xae\x02\x0a\x00\xc4\xff\ +q\x02\x0a\x00\xc5\xff\xae\x02\x0a\x00\xc6\xffq\x02\x0a\x00\ +\xc7\xff\xae\x02\x0a\x00\xc9\xff\x85\x02\x0a\x00\xcb\xff\x85\x02\ +\x0a\x00\xcd\xff\x85\x02\x0a\x00\xcf\xff\x85\x02\x0a\x00\xd1\xff\ +\x85\x02\x0a\x00\xd3\xff\x85\x02\x0a\x00\xd5\xff\x85\x02\x0a\x00\ +\xd7\xff\x85\x02\x0a\x00\xd9\xff\x85\x02\x0a\x00\xdb\xff\x85\x02\ +\x0a\x00\xdd\xff\x85\x02\x0a\x00\xdf\xff\xc3\x02\x0a\x00\xe1\xff\ +\xc3\x02\x0a\x00\xe3\xff\xc3\x02\x0a\x00\xe5\xff\xc3\x02\x0a\x00\ +\xfa\xff\xc3\x02\x0a\x01\x06\xff\xc3\x02\x0a\x01\x08\xff\xc3\x02\ +\x0a\x01\x0d\xff\xc3\x02\x0a\x01\x0f\xff\x85\x02\x0a\x01\x11\xff\ +\x85\x02\x0a\x01\x13\xff\x85\x02\x0a\x01\x15\xff\x85\x02\x0a\x01\ +\x17\xff\xc3\x02\x0a\x01\x19\xff\xc3\x02\x0a\x01\x1d\xff\xc3\x02\ +\x0a\x01!\xff\xc3\x02\x0a\x01$\x00)\x02\x0a\x01&\x00\ +)\x02\x0a\x01+\xff\xc3\x02\x0a\x01-\xff\xc3\x02\x0a\x01\ +/\xff\xc3\x02\x0a\x011\xff\xc3\x02\x0a\x013\xff\xc3\x02\ +\x0a\x015\xff\xc3\x02\x0a\x016\x00)\x02\x0a\x018\x00\ +\x14\x02\x0a\x01:\x00\x14\x02\x0a\x01C\xffq\x02\x0a\x01\ +D\xff\xae\x02\x0a\x01F\xff\xae\x02\x0a\x01H\xff\x85\x02\ +\x0a\x01J\xff\xc3\x02\x0a\x01V\xffq\x02\x0a\x01_\xff\ +q\x02\x0a\x01b\xffq\x02\x0a\x01i\xffq\x02\x0a\x01\ +y\xff\xae\x02\x0a\x01z\xff\xd7\x02\x0a\x01{\xff\xd7\x02\ +\x0a\x01~\xff\xae\x02\x0a\x01\x81\xff\xc3\x02\x0a\x01\x82\xff\ +\xd7\x02\x0a\x01\x83\xff\xd7\x02\x0a\x01\x84\xff\xd7\x02\x0a\x01\ +\x87\xff\xd7\x02\x0a\x01\x89\xff\xd7\x02\x0a\x01\x8c\xff\xae\x02\ +\x0a\x01\x8e\xff\xc3\x02\x0a\x01\x8f\xff\xae\x02\x0a\x01\x90\xff\ +\xae\x02\x0a\x01\x93\xff\xae\x02\x0a\x01\x99\xff\xae\x02\x0a\x01\ +\xa4\xff\x85\x02\x0a\x01\xaa\xffq\x02\x0a\x01\xae\xff\x85\x02\ +\x0a\x01\xb5\xff\x85\x02\x0a\x01\xca\xff\xd7\x02\x0a\x01\xce\xff\ +q\x02\x0a\x01\xcf\xff\x85\x02\x0a\x01\xd5\xffq\x02\x0a\x01\ +\xd8\xff\x85\x02\x0a\x01\xdb\xff\x85\x02\x0a\x01\xde\xff\x85\x02\ +\x0a\x01\xea\xff\x85\x02\x0a\x01\xed\xff\x85\x02\x0a\x01\xee\xff\ +\xc3\x02\x0a\x01\xf2\xffq\x02\x0a\x01\xfa\x00)\x02\x0a\x01\ +\xfc\x00)\x02\x0a\x01\xfe\x00)\x02\x0a\x02\x00\x00\x14\x02\ +\x0a\x02W\xff\xc3\x02\x0a\x02X\xffq\x02\x0a\x02Y\xff\ +\xae\x02\x0a\x02`\xff\x85\x02\x0a\x02b\xff\xc3\x02\x0a\x02\ +j\xff\x85\x02\x0a\x02r\xffq\x02\x0a\x02s\xffq\x02\ +\x0a\x02}\xff\xec\x02\x0a\x02\x7f\xff\x85\x02\x0a\x02\x85\xff\ +\x85\x02\x0a\x02\x87\xff\x85\x02\x0a\x02\x89\xff\x85\x02\x0a\x02\ +\x8d\xff\x85\x02\x0a\x02\xb2\xff\x85\x02\x0a\x02\xb4\xff\x85\x02\ +\x0a\x02\xce\xff\x85\x02\x0a\x02\xcf\xffq\x02\x0a\x02\xd9\xff\ +q\x02\x0a\x02\xda\xff\xd7\x02\x0a\x02\xdb\xffq\x02\x0a\x02\ +\xdc\xff\xd7\x02\x0a\x02\xdd\xffq\x02\x0a\x02\xde\xff\xd7\x02\ +\x0a\x02\xe0\xff\x85\x02\x0a\x02\xe2\xff\xd7\x02\x0a\x02\xe4\xff\ +\xd7\x02\x0a\x02\xf0\xff\x85\x02\x0a\x02\xf2\xff\x85\x02\x0a\x02\ +\xf4\xff\x85\x02\x0a\x03\x09\xffq\x02\x0a\x03\x0a\xff\x85\x02\ +\x0a\x03\x0b\xffq\x02\x0a\x03\x0c\xff\x85\x02\x0a\x03\x11\xff\ +\x85\x02\x0a\x03\x12\xffq\x02\x0a\x03\x16\xff\x85\x02\x0a\x03\ +\x1a\xff\x85\x02\x0a\x03\x1b\xff\x85\x02\x0a\x03\x1c\xffq\x02\ +\x0a\x03\x1d\xffq\x02\x0a\x03\x1e\xff\xae\x02\x0a\x03\x1f\xff\ +q\x02\x0a\x03 \xff\xae\x02\x0a\x03!\xffq\x02\x0a\x03\ +\x22\xff\xae\x02\x0a\x03#\xffq\x02\x0a\x03%\xffq\x02\ +\x0a\x03&\xff\xae\x02\x0a\x03'\xffq\x02\x0a\x03(\xff\ +\xae\x02\x0a\x03)\xffq\x02\x0a\x03*\xff\xae\x02\x0a\x03\ ++\xffq\x02\x0a\x03,\xff\xae\x02\x0a\x03-\xffq\x02\ +\x0a\x03.\xff\xae\x02\x0a\x03/\xffq\x02\x0a\x030\xff\ +\xae\x02\x0a\x031\xffq\x02\x0a\x032\xff\xae\x02\x0a\x03\ +3\xffq\x02\x0a\x034\xff\xae\x02\x0a\x036\xff\x85\x02\ +\x0a\x038\xff\x85\x02\x0a\x03:\xff\x85\x02\x0a\x03<\xff\ +\x85\x02\x0a\x03@\xff\x85\x02\x0a\x03B\xff\x85\x02\x0a\x03\ +D\xff\x85\x02\x0a\x03J\xff\x85\x02\x0a\x03L\xff\x85\x02\ +\x0a\x03N\xff\x85\x02\x0a\x03R\xff\x85\x02\x0a\x03T\xff\ +\x85\x02\x0a\x03V\xff\x85\x02\x0a\x03X\xff\x85\x02\x0a\x03\ +Z\xff\x85\x02\x0a\x03\x5c\xff\x85\x02\x0a\x03^\xff\x85\x02\ +\x0a\x03`\xff\x85\x02\x0a\x03b\xff\xc3\x02\x0a\x03d\xff\ +\xc3\x02\x0a\x03f\xff\xc3\x02\x0a\x03h\xff\xc3\x02\x0a\x03\ +j\xff\xc3\x02\x0a\x03l\xff\xc3\x02\x0a\x03n\xff\xc3\x02\ +\x0a\x03o\x00\x14\x02\x0a\x03q\x00\x14\x02\x0a\x03s\x00\ +\x14\x02\x0a\x03\x8f\x00)\x02\x0c\x00&\xff\x9a\x02\x0c\x00\ +*\xff\x9a\x02\x0c\x002\xff\x9a\x02\x0c\x004\xff\x9a\x02\ +\x0c\x007\xffq\x02\x0c\x008\xff\xd7\x02\x0c\x009\xff\ +\x85\x02\x0c\x00:\xff\x85\x02\x0c\x00<\xff\x85\x02\x0c\x00\ +\x89\xff\x9a\x02\x0c\x00\x94\xff\x9a\x02\x0c\x00\x95\xff\x9a\x02\ +\x0c\x00\x96\xff\x9a\x02\x0c\x00\x97\xff\x9a\x02\x0c\x00\x98\xff\ +\x9a\x02\x0c\x00\x9a\xff\x9a\x02\x0c\x00\x9b\xff\xd7\x02\x0c\x00\ +\x9c\xff\xd7\x02\x0c\x00\x9d\xff\xd7\x02\x0c\x00\x9e\xff\xd7\x02\ +\x0c\x00\x9f\xff\x85\x02\x0c\x00\xc8\xff\x9a\x02\x0c\x00\xca\xff\ +\x9a\x02\x0c\x00\xcc\xff\x9a\x02\x0c\x00\xce\xff\x9a\x02\x0c\x00\ +\xde\xff\x9a\x02\x0c\x00\xe0\xff\x9a\x02\x0c\x00\xe2\xff\x9a\x02\ +\x0c\x00\xe4\xff\x9a\x02\x0c\x01\x0e\xff\x9a\x02\x0c\x01\x10\xff\ +\x9a\x02\x0c\x01\x12\xff\x9a\x02\x0c\x01\x14\xff\x9a\x02\x0c\x01\ +$\xffq\x02\x0c\x01&\xffq\x02\x0c\x01*\xff\xd7\x02\ +\x0c\x01,\xff\xd7\x02\x0c\x01.\xff\xd7\x02\x0c\x010\xff\ +\xd7\x02\x0c\x012\xff\xd7\x02\x0c\x014\xff\xd7\x02\x0c\x01\ +6\xff\x85\x02\x0c\x018\xff\x85\x02\x0c\x01:\xff\x85\x02\ +\x0c\x01G\xff\x9a\x02\x0c\x01f\xff\xae\x02\x0c\x01m\xff\ +\xae\x02\x0c\x01q\xffq\x02\x0c\x01r\xff\x85\x02\x0c\x01\ +s\xff\x9a\x02\x0c\x01u\xff\x85\x02\x0c\x01x\xff\x85\x02\ +\x0c\x01\x85\xff\xd7\x02\x0c\x01\x9d\xffq\x02\x0c\x01\x9f\xff\ +\x9a\x02\x0c\x01\xa6\xffq\x02\x0c\x01\xb8\xff\x9a\x02\x0c\x01\ +\xbb\xff\x9a\x02\x0c\x01\xbc\xffq\x02\x0c\x01\xbe\xff\xae\x02\ +\x0c\x01\xc1\xff\x5c\x02\x0c\x01\xc4\xffq\x02\x0c\x01\xdc\xff\ +\x9a\x02\x0c\x01\xe1\xff\x85\x02\x0c\x01\xe4\xff\x9a\x02\x0c\x01\ +\xfa\xff\x85\x02\x0c\x01\xfc\xff\x85\x02\x0c\x01\xfe\xff\x85\x02\ +\x0c\x02\x00\xff\x85\x02\x0c\x02T\xff\x85\x02\x0c\x02_\xff\ +\x9a\x02\x0c\x02a\xff\xd7\x02\x0c\x02l\xff\x9a\x02\x0c\x02\ +|\xff\x5c\x02\x0c\x02~\xff\x9a\x02\x0c\x02\x80\xff\x85\x02\ +\x0c\x02\x82\xff\x85\x02\x0c\x02\x84\xff\x9a\x02\x0c\x02\x86\xff\ +\x9a\x02\x0c\x02\x88\xff\x9a\x02\x0c\x02\x8a\xff\x9a\x02\x0c\x02\ +\x8c\xff\x9a\x02\x0c\x02\xa9\xffq\x02\x0c\x02\xaa\xff\x9a\x02\ +\x0c\x02\xb1\xff\x9a\x02\x0c\x02\xb3\xff\x9a\x02\x0c\x02\xb5\xff\ +q\x02\x0c\x02\xb6\xff\x9a\x02\x0c\x02\xb7\xff\x85\x02\x0c\x02\ +\xb9\xff\x85\x02\x0c\x02\xbd\xffq\x02\x0c\x02\xbe\xff\x9a\x02\ +\x0c\x02\xbf\xff\x5c\x02\x0c\x02\xc0\xff\x85\x02\x0c\x02\xc1\xff\ +\x5c\x02\x0c\x02\xc2\xff\x85\x02\x0c\x02\xc5\xff\x85\x02\x0c\x02\ +\xc7\xff\x85\x02\x0c\x02\xd4\xff\x5c\x02\x0c\x02\xd5\xff\x85\x02\ +\x0c\x02\xef\xff\x9a\x02\x0c\x02\xf1\xff\x9a\x02\x0c\x02\xf3\xff\ +\x9a\x02\x0c\x02\xfd\xff\x5c\x02\x0c\x02\xfe\xff\x85\x02\x0c\x03\ +\x0d\xff\x85\x02\x0c\x03\x0e\xff\x9a\x02\x0c\x03\x0f\xff\x85\x02\ +\x0c\x03\x10\xff\x9a\x02\x0c\x03\x15\xff\x9a\x02\x0c\x03\x17\xff\ +q\x02\x0c\x03\x18\xff\x9a\x02\x0c\x03I\xff\x9a\x02\x0c\x03\ +K\xff\x9a\x02\x0c\x03M\xff\x9a\x02\x0c\x03O\xff\x9a\x02\ +\x0c\x03Q\xff\x9a\x02\x0c\x03S\xff\x9a\x02\x0c\x03U\xff\ +\x9a\x02\x0c\x03W\xff\x9a\x02\x0c\x03Y\xff\x9a\x02\x0c\x03\ +[\xff\x9a\x02\x0c\x03]\xff\x9a\x02\x0c\x03_\xff\x9a\x02\ +\x0c\x03a\xff\xd7\x02\x0c\x03c\xff\xd7\x02\x0c\x03e\xff\ +\xd7\x02\x0c\x03g\xff\xd7\x02\x0c\x03i\xff\xd7\x02\x0c\x03\ +k\xff\xd7\x02\x0c\x03m\xff\xd7\x02\x0c\x03o\xff\x85\x02\ +\x0c\x03q\xff\x85\x02\x0c\x03s\xff\x85\x02\x0c\x03\x8f\xff\ +q\x02!\x01q\xff\xd7\x02!\x01r\xff\xec\x02!\x01\ +x\xff\xec\x02!\x02T\xff\xec\x02S\x00\x0f\xff\xc3\x02\ +S\x00\x11\xff\xc3\x02S\x02\x08\xff\xc3\x02S\x02\x0c\xff\ +\xc3\x02T\x00\x0f\xff\x85\x02T\x00\x11\xff\x85\x02T\x01\ +V\xff\x85\x02T\x01_\xff\x85\x02T\x01b\xff\x85\x02\ +T\x01f\xff\xd7\x02T\x01i\xff\x85\x02T\x01m\xff\ +\xd7\x02T\x01s\xff\xc3\x02T\x01v\xff\xec\x02T\x01\ +y\xff\x9a\x02T\x01z\xff\xae\x02T\x01{\xff\xc3\x02\ +T\x01|\xff\xc3\x02T\x01}\xff\xc3\x02T\x01~\xff\ +\x9a\x02T\x01\x81\xff\xc3\x02T\x01\x82\xff\xae\x02T\x01\ +\x84\xff\xc3\x02T\x01\x86\xff\xc3\x02T\x01\x87\xff\xc3\x02\ +T\x01\x89\xff\xc3\x02T\x01\x8c\xff\x9a\x02T\x01\x8e\xff\ +\x9a\x02T\x01\x8f\xff\x9a\x02T\x01\x90\xff\x9a\x02T\x01\ +\x92\xff\xc3\x02T\x01\x93\xff\x9a\x02T\x01\x95\xff\xc3\x02\ +T\x01\x96\xff\xc3\x02T\x01\x98\xff\xc3\x02T\x01\x99\xff\ +\x9a\x02T\x01\x9a\xff\xc3\x02T\x01\x9b\xff\xc3\x02T\x02\ +\x08\xff\x85\x02T\x02\x0c\xff\x85\x02T\x02!\xff\xec\x02\ +X\x00\x05\xffq\x02X\x00\x0a\xffq\x02X\x00&\xff\ +\xd7\x02X\x00*\xff\xd7\x02X\x00-\x01\x0a\x02X\x00\ +2\xff\xd7\x02X\x004\xff\xd7\x02X\x007\xffq\x02\ +X\x009\xff\xae\x02X\x00:\xff\xae\x02X\x00<\xff\ +\x85\x02X\x00\x89\xff\xd7\x02X\x00\x94\xff\xd7\x02X\x00\ +\x95\xff\xd7\x02X\x00\x96\xff\xd7\x02X\x00\x97\xff\xd7\x02\ +X\x00\x98\xff\xd7\x02X\x00\x9a\xff\xd7\x02X\x00\x9f\xff\ +\x85\x02X\x00\xc8\xff\xd7\x02X\x00\xca\xff\xd7\x02X\x00\ +\xcc\xff\xd7\x02X\x00\xce\xff\xd7\x02X\x00\xde\xff\xd7\x02\ +X\x00\xe0\xff\xd7\x02X\x00\xe2\xff\xd7\x02X\x00\xe4\xff\ +\xd7\x02X\x01\x0e\xff\xd7\x02X\x01\x10\xff\xd7\x02X\x01\ +\x12\xff\xd7\x02X\x01\x14\xff\xd7\x02X\x01$\xffq\x02\ +X\x01&\xffq\x02X\x016\xff\xae\x02X\x018\xff\ +\x85\x02X\x01:\xff\x85\x02X\x01G\xff\xd7\x02X\x01\ +\xfa\xff\xae\x02X\x01\xfc\xff\xae\x02X\x01\xfe\xff\xae\x02\ +X\x02\x00\xff\x85\x02X\x02\x07\xffq\x02X\x02\x0b\xff\ +q\x02X\x02_\xff\xd7\x02X\x03I\xff\xd7\x02X\x03\ +K\xff\xd7\x02X\x03M\xff\xd7\x02X\x03O\xff\xd7\x02\ +X\x03Q\xff\xd7\x02X\x03S\xff\xd7\x02X\x03U\xff\ +\xd7\x02X\x03W\xff\xd7\x02X\x03Y\xff\xd7\x02X\x03\ +[\xff\xd7\x02X\x03]\xff\xd7\x02X\x03_\xff\xd7\x02\ +X\x03o\xff\x85\x02X\x03q\xff\x85\x02X\x03s\xff\ +\x85\x02X\x03\x8f\xffq\x02Y\x00\x05\xff\xec\x02Y\x00\ +\x0a\xff\xec\x02Y\x02\x07\xff\xec\x02Y\x02\x0b\xff\xec\x02\ +Z\x00\x0f\xff\xae\x02Z\x00\x11\xff\xae\x02Z\x01V\xff\ +\xd7\x02Z\x01_\xff\xd7\x02Z\x01b\xff\xd7\x02Z\x01\ +d\xff\xec\x02Z\x01i\xff\xd7\x02Z\x01p\xff\xec\x02\ +Z\x01q\xff\xc3\x02Z\x01r\xff\xec\x02Z\x01t\xff\ +\xd7\x02Z\x01u\xff\xec\x02Z\x01x\xff\xec\x02Z\x01\ +\x88\xff\xec\x02Z\x02\x08\xff\xae\x02Z\x02\x0c\xff\xae\x02\ +Z\x02T\xff\xec\x02`\x00I\x00R\x02`\x00W\x00\ +R\x02`\x00Y\x00f\x02`\x00Z\x00f\x02`\x00\ +[\x00f\x02`\x00\x5c\x00f\x02`\x00\xbf\x00f\x02\ +`\x01%\x00R\x02`\x01'\x00R\x02`\x017\x00\ +f\x02`\x01\xfb\x00f\x02`\x01\xfd\x00f\x02`\x02\ +4\x00R\x02`\x025\x00R\x02`\x02]\x00R\x02\ +`\x02^\x00R\x02`\x03p\x00f\x02`\x03\x8d\x00\ +R\x02`\x03\x90\x00R\x02b\x00I\x00f\x02b\x00\ +W\x00f\x02b\x00Y\x00f\x02b\x00Z\x00f\x02\ +b\x00[\x00f\x02b\x00\x5c\x00f\x02b\x00\xbf\x00\ +f\x02b\x01%\x00f\x02b\x01'\x00f\x02b\x01\ +7\x00f\x02b\x01\xfb\x00f\x02b\x01\xfd\x00f\x02\ +b\x024\x00f\x02b\x025\x00f\x02b\x02]\x00\ +f\x02b\x02^\x00f\x02b\x03p\x00f\x02b\x03\ +\x8d\x00f\x02b\x03\x90\x00f\x02j\x00\x05\xff\xec\x02\ +j\x00\x0a\xff\xec\x02j\x02\x07\xff\xec\x02j\x02\x0b\xff\ +\xec\x02l\x00\x0f\xff\xae\x02l\x00\x11\xff\xae\x02l\x01\ +\x9d\xff\xec\x02l\x01\xa4\xff\xd7\x02l\x01\xa6\xff\xec\x02\ +l\x01\xa8\xff\xd7\x02l\x01\xaa\xff\xd7\x02l\x01\xae\xff\ +\xd7\x02l\x01\xb0\xff\xd7\x02l\x01\xb1\xff\xec\x02l\x01\ +\xb5\xff\xd7\x02l\x01\xbc\xff\xc3\x02l\x01\xbd\xff\xd7\x02\ +l\x01\xbf\xff\xd7\x02l\x01\xc1\xff\xd7\x02l\x01\xc4\xff\ +\xec\x02l\x01\xc7\xff\xec\x02l\x01\xce\xff\xec\x02l\x01\ +\xd5\xff\xec\x02l\x01\xf2\xff\xec\x02l\x02\x08\xff\xae\x02\ +l\x02\x0c\xff\xae\x02l\x02r\xff\xd7\x02l\x02s\xff\ +\xec\x02l\x02z\xff\xec\x02l\x02|\xff\xd7\x02l\x02\ +\x80\xff\xec\x02l\x02\x82\xff\xec\x02l\x02\x9f\xff\xd7\x02\ +l\x02\xa1\xff\xec\x02l\x02\xa9\xff\xec\x02l\x02\xb5\xff\ +\xc3\x02l\x02\xb7\xff\xec\x02l\x02\xb9\xff\xec\x02l\x02\ +\xbb\xff\xd7\x02l\x02\xbd\xff\xec\x02l\x02\xbf\xff\xd7\x02\ +l\x02\xc1\xff\xd7\x02l\x02\xca\xff\xd7\x02l\x02\xce\xff\ +\xd7\x02l\x02\xcf\xff\xec\x02l\x02\xd4\xff\xd7\x02l\x02\ +\xd9\xff\xd7\x02l\x02\xdb\xff\xd7\x02l\x02\xdd\xff\xd7\x02\ +l\x02\xe5\xff\xd7\x02l\x02\xe7\xff\xec\x02l\x02\xf5\xff\ +\xec\x02l\x02\xf7\xff\xd7\x02l\x02\xf9\xff\xd7\x02l\x02\ +\xfb\xff\xd7\x02l\x02\xfd\xff\xd7\x02l\x03\x05\xff\xd7\x02\ +l\x03\x07\xff\xd7\x02l\x03\x0d\xff\xd7\x02l\x03\x0f\xff\ +\xd7\x02l\x03\x11\xff\xd7\x02l\x03\x12\xff\xec\x02l\x03\ +\x17\xff\xec\x02l\x03\x1b\xff\xd7\x02l\x03\x1c\xff\xec\x02\ +m\x00\x0f\xff\xae\x02m\x00\x11\xff\xae\x02m\x01\xce\xff\ +\xd7\x02m\x01\xd5\xff\xd7\x02m\x01\xf2\xff\xd7\x02m\x02\ +\x08\xff\xae\x02m\x02\x0c\xff\xae\x02m\x02s\xff\xd7\x02\ +m\x02\xcf\xff\xd7\x02m\x03\x12\xff\xd7\x02m\x03\x1c\xff\ +\xd7\x02n\x00\x05\xff\xae\x02n\x00\x0a\xff\xae\x02n\x01\ +\x9d\xff\xd7\x02n\x01\xa6\xff\xd7\x02n\x01\xbc\xff\xae\x02\ +n\x01\xc1\xff\xae\x02n\x01\xc4\xff\xd7\x02n\x01\xdc\xff\ +\xd7\x02n\x01\xe4\xff\xd7\x02n\x02\x07\xff\xae\x02n\x02\ +\x0b\xff\xae\x02n\x02|\xff\xae\x02n\x02\x80\xff\xc3\x02\ +n\x02\x82\xff\xc3\x02n\x02\xa9\xff\xd7\x02n\x02\xaa\xff\ +\xd7\x02n\x02\xb5\xff\xae\x02n\x02\xb6\xff\xd7\x02n\x02\ +\xb7\xff\xc3\x02n\x02\xb9\xff\xc3\x02n\x02\xbd\xff\xd7\x02\ +n\x02\xbe\xff\xd7\x02n\x02\xbf\xff\xae\x02n\x02\xc1\xff\ +\xae\x02n\x02\xd4\xff\xae\x02n\x02\xfd\xff\xae\x02n\x03\ +\x0d\xff\x9a\x02n\x03\x0f\xff\x9a\x02n\x03\x17\xff\xd7\x02\ +n\x03\x18\xff\xd7\x02o\x00\x05\xff\x85\x02o\x00\x0a\xff\ +\x85\x02o\x01\xd0\xff\xd7\x02o\x01\xdc\xff\x9a\x02o\x01\ +\xdd\xff\xc3\x02o\x01\xdf\xff\xd7\x02o\x01\xe1\xff\xae\x02\ +o\x01\xe4\xff\x9a\x02o\x01\xf6\xff\xc3\x02o\x02\x07\xff\ +\x85\x02o\x02\x0b\xff\x85\x02o\x02m\xff\xd7\x02o\x02\ +\x81\xff\xd7\x02o\x02\x83\xff\xd7\x02o\x02\x8b\xff\xd7\x02\ +o\x02\xa0\xff\xd7\x02o\x02\xaa\xff\x9a\x02o\x02\xb6\xff\ +\x9a\x02o\x02\xb8\xff\xc3\x02o\x02\xba\xff\xc3\x02o\x02\ +\xbc\xff\xd7\x02o\x02\xbe\xff\x9a\x02o\x02\xc0\xff\xae\x02\ +o\x02\xc2\xff\xae\x02o\x02\xc6\xff\xd7\x02o\x02\xc8\xff\ +\xd7\x02o\x02\xcb\xff\xd7\x02o\x02\xd5\xff\xae\x02o\x02\ +\xe6\xff\xd7\x02o\x02\xea\xff\xd7\x02o\x02\xf8\xff\xc3\x02\ +o\x02\xfa\xff\xc3\x02o\x02\xfc\xff\xc3\x02o\x02\xfe\xff\ +\xae\x02o\x03\x06\xff\xd7\x02o\x03\x08\xff\xd7\x02o\x03\ +\x0e\xff\x9a\x02o\x03\x10\xff\x9a\x02o\x03\x18\xff\x9a\x02\ +p\x01\x9f\xff\xd7\x02p\x01\xb8\xff\xd7\x02p\x01\xbb\xff\ +\xd7\x02p\x01\xbe\xff\xd7\x02p\x01\xe1\xff\xd7\x02p\x02\ +l\xff\xd7\x02p\x02~\xff\xd7\x02p\x02\x84\xff\xd7\x02\ +p\x02\x86\xff\xd7\x02p\x02\x88\xff\xd7\x02p\x02\x8a\xff\ +\xd7\x02p\x02\x8c\xff\xd7\x02p\x02\xb1\xff\xd7\x02p\x02\ +\xb3\xff\xd7\x02p\x02\xc0\xff\xd7\x02p\x02\xc2\xff\xd7\x02\ +p\x02\xc5\xff\xd7\x02p\x02\xc7\xff\xd7\x02p\x02\xd5\xff\ +\xd7\x02p\x02\xef\xff\xd7\x02p\x02\xf1\xff\xd7\x02p\x02\ +\xf3\xff\xd7\x02p\x02\xfe\xff\xd7\x02p\x03\x09\xff\xd7\x02\ +p\x03\x0b\xff\xd7\x02p\x03\x0e\xff\xd7\x02p\x03\x10\xff\ +\xd7\x02p\x03\x15\xff\xd7\x02r\x00\x05\xffq\x02r\x00\ +\x0a\xffq\x02r\x01\x9d\xff\x9a\x02r\x01\xa6\xff\x9a\x02\ +r\x01\xbc\xffq\x02r\x01\xbe\xff\xd7\x02r\x01\xc1\xff\ +\x9a\x02r\x01\xc4\xff\x9a\x02r\x01\xdc\xff\xd7\x02r\x01\ +\xe1\xff\xd7\x02r\x01\xe4\xff\xd7\x02r\x02\x07\xffq\x02\ +r\x02\x0b\xffq\x02r\x02n\xff\xd7\x02r\x02|\xff\ +\x9a\x02r\x02\x80\xff\xae\x02r\x02\x82\xff\xae\x02r\x02\ +\x97\xff\xd7\x02r\x02\x9b\xff\xd7\x02r\x02\xa7\xff\xd7\x02\ +r\x02\xa9\xff\x9a\x02r\x02\xaa\xff\xd7\x02r\x02\xb5\xff\ +q\x02r\x02\xb6\xff\xd7\x02r\x02\xb7\xff\x85\x02r\x02\ +\xb9\xff\x85\x02r\x02\xbd\xff\x9a\x02r\x02\xbe\xff\xd7\x02\ +r\x02\xbf\xff\x9a\x02r\x02\xc0\xff\xd7\x02r\x02\xc1\xff\ +\x9a\x02r\x02\xc2\xff\xd7\x02r\x02\xc5\xff\x9a\x02r\x02\ +\xc7\xff\x9a\x02r\x02\xd4\xff\x9a\x02r\x02\xd5\xff\xd7\x02\ +r\x02\xe1\xff\xd7\x02r\x02\xe3\xff\xd7\x02r\x02\xfd\xff\ +\x9a\x02r\x02\xfe\xff\xd7\x02r\x03\x03\xff\xd7\x02r\x03\ +\x0d\xffq\x02r\x03\x0e\xff\xd7\x02r\x03\x0f\xffq\x02\ +r\x03\x10\xff\xd7\x02r\x03\x17\xff\x9a\x02r\x03\x18\xff\ +\xd7\x02s\x00\x05\xffq\x02s\x00\x0a\xffq\x02s\x01\ +\xcf\xff\xd7\x02s\x01\xd8\xff\xd7\x02s\x01\xdb\xff\xd7\x02\ +s\x01\xdc\xff\x9a\x02s\x01\xdd\xff\xc3\x02s\x01\xde\xff\ +\xd7\x02s\x01\xe1\xff\xc3\x02s\x01\xe4\xff\x9a\x02s\x01\ +\xea\xff\xd7\x02s\x01\xed\xff\xd7\x02s\x01\xf6\xff\xc3\x02\ +s\x02\x07\xffq\x02s\x02\x0b\xffq\x02s\x02j\xff\ +\xd7\x02s\x02m\xff\xd7\x02s\x02}\xff\xec\x02s\x02\ +\x7f\xff\xd7\x02s\x02\x81\xff\xd7\x02s\x02\x83\xff\xd7\x02\ +s\x02\x85\xff\xd7\x02s\x02\x87\xff\xd7\x02s\x02\x89\xff\ +\xd7\x02s\x02\x8b\xff\xd7\x02s\x02\x8d\xff\xd7\x02s\x02\ +\xaa\xff\x9a\x02s\x02\xb2\xff\xd7\x02s\x02\xb4\xff\xd7\x02\ +s\x02\xb6\xff\x9a\x02s\x02\xb8\xff\xd7\x02s\x02\xba\xff\ +\xd7\x02s\x02\xbe\xff\x9a\x02s\x02\xc0\xff\xc3\x02s\x02\ +\xc2\xff\xc3\x02s\x02\xc6\xff\xd7\x02s\x02\xc8\xff\xd7\x02\ +s\x02\xd5\xff\xc3\x02s\x02\xe0\xff\xd7\x02s\x02\xf0\xff\ +\xd7\x02s\x02\xf2\xff\xd7\x02s\x02\xf4\xff\xd7\x02s\x02\ +\xf8\xff\xc3\x02s\x02\xfa\xff\xc3\x02s\x02\xfc\xff\xc3\x02\ +s\x02\xfe\xff\xc3\x02s\x03\x0a\xff\xd7\x02s\x03\x0c\xff\ +\xd7\x02s\x03\x0e\xff\x85\x02s\x03\x10\xff\x85\x02s\x03\ +\x16\xff\xd7\x02s\x03\x18\xff\x9a\x02s\x03\x1a\xff\xd7\x02\ +t\x00\x05\xffq\x02t\x00\x0a\xffq\x02t\x01\x9d\xff\ +\x9a\x02t\x01\xa6\xff\x9a\x02t\x01\xbc\xffq\x02t\x01\ +\xbe\xff\xd7\x02t\x01\xc1\xff\x9a\x02t\x01\xc4\xff\x9a\x02\ +t\x01\xdc\xff\xd7\x02t\x01\xe1\xff\xd7\x02t\x01\xe4\xff\ +\xd7\x02t\x02\x07\xffq\x02t\x02\x0b\xffq\x02t\x02\ +n\xff\xd7\x02t\x02|\xff\x9a\x02t\x02\x80\xff\xae\x02\ +t\x02\x82\xff\xae\x02t\x02\x97\xff\xd7\x02t\x02\x9b\xff\ +\xd7\x02t\x02\xa7\xff\xd7\x02t\x02\xa9\xff\x9a\x02t\x02\ +\xaa\xff\xd7\x02t\x02\xb5\xffq\x02t\x02\xb6\xff\xd7\x02\ +t\x02\xb7\xff\x85\x02t\x02\xb9\xff\x85\x02t\x02\xbd\xff\ +\x9a\x02t\x02\xbe\xff\xd7\x02t\x02\xbf\xff\x9a\x02t\x02\ +\xc0\xff\xd7\x02t\x02\xc1\xff\x9a\x02t\x02\xc2\xff\xd7\x02\ +t\x02\xc5\xff\x9a\x02t\x02\xc7\xff\x9a\x02t\x02\xd4\xff\ +\x9a\x02t\x02\xd5\xff\xd7\x02t\x02\xe1\xff\xd7\x02t\x02\ +\xe3\xff\xd7\x02t\x02\xfd\xff\x9a\x02t\x02\xfe\xff\xd7\x02\ +t\x03\x03\xff\xd7\x02t\x03\x0d\xffq\x02t\x03\x0e\xff\ +\xd7\x02t\x03\x0f\xffq\x02t\x03\x10\xff\xd7\x02t\x03\ +\x17\xff\x9a\x02t\x03\x18\xff\xd7\x02u\x00\x05\xffq\x02\ +u\x00\x0a\xffq\x02u\x01\xcf\xff\xd7\x02u\x01\xd8\xff\ +\xd7\x02u\x01\xdb\xff\xd7\x02u\x01\xdc\xff\x9a\x02u\x01\ +\xdd\xff\xc3\x02u\x01\xde\xff\xd7\x02u\x01\xe1\xff\xc3\x02\ +u\x01\xe4\xff\x9a\x02u\x01\xea\xff\xd7\x02u\x01\xed\xff\ +\xd7\x02u\x01\xf6\xff\xc3\x02u\x02\x07\xffq\x02u\x02\ +\x0b\xffq\x02u\x02j\xff\xd7\x02u\x02m\xff\xd7\x02\ +u\x02}\xff\xec\x02u\x02\x7f\xff\xd7\x02u\x02\x81\xff\ +\xd7\x02u\x02\x83\xff\xd7\x02u\x02\x85\xff\xd7\x02u\x02\ +\x87\xff\xd7\x02u\x02\x89\xff\xd7\x02u\x02\x8b\xff\xd7\x02\ +u\x02\x8d\xff\xd7\x02u\x02\xaa\xff\x9a\x02u\x02\xb2\xff\ +\xd7\x02u\x02\xb4\xff\xd7\x02u\x02\xb6\xff\x9a\x02u\x02\ +\xb8\xff\xd7\x02u\x02\xba\xff\xd7\x02u\x02\xbe\xff\x9a\x02\ +u\x02\xc0\xff\xc3\x02u\x02\xc2\xff\xc3\x02u\x02\xc6\xff\ +\xd7\x02u\x02\xc8\xff\xd7\x02u\x02\xd5\xff\xc3\x02u\x02\ +\xe0\xff\xd7\x02u\x02\xf0\xff\xd7\x02u\x02\xf2\xff\xd7\x02\ +u\x02\xf4\xff\xd7\x02u\x02\xf8\xff\xc3\x02u\x02\xfa\xff\ +\xc3\x02u\x02\xfc\xff\xc3\x02u\x02\xfe\xff\xc3\x02u\x03\ +\x0a\xff\xd7\x02u\x03\x0c\xff\xd7\x02u\x03\x0e\xff\x85\x02\ +u\x03\x10\xff\x85\x02u\x03\x16\xff\xd7\x02u\x03\x18\xff\ +\x9a\x02u\x03\x1a\xff\xd7\x02v\x03\x0d\xff\xec\x02v\x03\ +\x0f\xff\xec\x02x\x03\x0d\xff\xec\x02x\x03\x0f\xff\xec\x02\ +z\x00\x0f\xff\xae\x02z\x00\x11\xff\xae\x02z\x02\x08\xff\ +\xae\x02z\x02\x0c\xff\xae\x02z\x02\x80\xff\xec\x02z\x02\ +\x82\xff\xec\x02z\x02\xb7\xff\xec\x02z\x02\xb9\xff\xec\x02\ +z\x03\x0d\xff\xd7\x02z\x03\x0f\xff\xd7\x02|\x00\x0f\xff\ +q\x02|\x00\x11\xffq\x02|\x01\xa4\xff\xc3\x02|\x01\ +\xaa\xff\xae\x02|\x01\xae\xff\xc3\x02|\x01\xb5\xff\xc3\x02\ +|\x01\xce\xff\xd7\x02|\x01\xd5\xff\xd7\x02|\x01\xf2\xff\ +\xd7\x02|\x02\x08\xffq\x02|\x02\x0c\xffq\x02|\x02\ +r\xff\xae\x02|\x02s\xff\xd7\x02|\x02\xce\xff\xc3\x02\ +|\x02\xcf\xff\xd7\x02|\x02\xd9\xff\xae\x02|\x02\xdb\xff\ +\xae\x02|\x02\xdd\xff\xae\x02|\x03\x09\xff\xae\x02|\x03\ +\x0b\xff\xae\x02|\x03\x11\xff\xc3\x02|\x03\x12\xff\xd7\x02\ +|\x03\x1b\xff\xc3\x02|\x03\x1c\xff\xd7\x02}\x00\x05\xff\ +\xec\x02}\x00\x0a\xff\xec\x02}\x01\xd0\xff\xd7\x02}\x01\ +\xdc\xff\xec\x02}\x01\xdd\xff\xec\x02}\x01\xdf\xff\xd7\x02\ +}\x01\xe1\xff\xec\x02}\x01\xe4\xff\xec\x02}\x01\xf6\xff\ +\xec\x02}\x02\x07\xff\xec\x02}\x02\x0b\xff\xec\x02}\x02\ +\xa0\xff\xd7\x02}\x02\xaa\xff\xec\x02}\x02\xb6\xff\xec\x02\ +}\x02\xbc\xff\xd7\x02}\x02\xbe\xff\xec\x02}\x02\xc0\xff\ +\xec\x02}\x02\xc2\xff\xec\x02}\x02\xcb\xff\xd7\x02}\x02\ +\xd5\xff\xec\x02}\x02\xe6\xff\xd7\x02}\x02\xf8\xff\xec\x02\ +}\x02\xfa\xff\xec\x02}\x02\xfc\xff\xec\x02}\x02\xfe\xff\ +\xec\x02}\x03\x06\xff\xd7\x02}\x03\x08\xff\xd7\x02}\x03\ +\x0e\xff\xec\x02}\x03\x10\xff\xec\x02}\x03\x18\xff\xec\x02\ +~\x00\x0f\xff\xae\x02~\x00\x11\xff\xae\x02~\x01\x9d\xff\ +\xec\x02~\x01\xa4\xff\xd7\x02~\x01\xa6\xff\xec\x02~\x01\ +\xa8\xff\xd7\x02~\x01\xaa\xff\xd7\x02~\x01\xae\xff\xd7\x02\ +~\x01\xb0\xff\xd7\x02~\x01\xb1\xff\xec\x02~\x01\xb5\xff\ +\xd7\x02~\x01\xbc\xff\xc3\x02~\x01\xbd\xff\xd7\x02~\x01\ +\xbf\xff\xd7\x02~\x01\xc1\xff\xd7\x02~\x01\xc4\xff\xec\x02\ +~\x01\xc7\xff\xec\x02~\x01\xce\xff\xec\x02~\x01\xd5\xff\ +\xec\x02~\x01\xf2\xff\xec\x02~\x02\x08\xff\xae\x02~\x02\ +\x0c\xff\xae\x02~\x02r\xff\xd7\x02~\x02s\xff\xec\x02\ +~\x02z\xff\xec\x02~\x02|\xff\xd7\x02~\x02\x80\xff\ +\xec\x02~\x02\x82\xff\xec\x02~\x02\x9f\xff\xd7\x02~\x02\ +\xa1\xff\xec\x02~\x02\xa9\xff\xec\x02~\x02\xb5\xff\xc3\x02\ +~\x02\xb7\xff\xec\x02~\x02\xb9\xff\xec\x02~\x02\xbb\xff\ +\xd7\x02~\x02\xbd\xff\xec\x02~\x02\xbf\xff\xd7\x02~\x02\ +\xc1\xff\xd7\x02~\x02\xca\xff\xd7\x02~\x02\xce\xff\xd7\x02\ +~\x02\xcf\xff\xec\x02~\x02\xd4\xff\xd7\x02~\x02\xd9\xff\ +\xd7\x02~\x02\xdb\xff\xd7\x02~\x02\xdd\xff\xd7\x02~\x02\ +\xe5\xff\xd7\x02~\x02\xe7\xff\xec\x02~\x02\xf5\xff\xec\x02\ +~\x02\xf7\xff\xd7\x02~\x02\xf9\xff\xd7\x02~\x02\xfb\xff\ +\xd7\x02~\x02\xfd\xff\xd7\x02~\x03\x05\xff\xd7\x02~\x03\ +\x07\xff\xd7\x02~\x03\x0d\xff\xd7\x02~\x03\x0f\xff\xd7\x02\ +~\x03\x11\xff\xd7\x02~\x03\x12\xff\xec\x02~\x03\x17\xff\ +\xec\x02~\x03\x1b\xff\xd7\x02~\x03\x1c\xff\xec\x02\x7f\x00\ +\x05\xff\xec\x02\x7f\x00\x0a\xff\xec\x02\x7f\x01\xd0\xff\xd7\x02\ +\x7f\x01\xdc\xff\xec\x02\x7f\x01\xdd\xff\xec\x02\x7f\x01\xdf\xff\ +\xd7\x02\x7f\x01\xe1\xff\xec\x02\x7f\x01\xe4\xff\xec\x02\x7f\x01\ +\xf6\xff\xec\x02\x7f\x02\x07\xff\xec\x02\x7f\x02\x0b\xff\xec\x02\ +\x7f\x02\xa0\xff\xd7\x02\x7f\x02\xaa\xff\xec\x02\x7f\x02\xb6\xff\ +\xec\x02\x7f\x02\xbc\xff\xd7\x02\x7f\x02\xbe\xff\xec\x02\x7f\x02\ +\xc0\xff\xec\x02\x7f\x02\xc2\xff\xec\x02\x7f\x02\xcb\xff\xd7\x02\ +\x7f\x02\xd5\xff\xec\x02\x7f\x02\xe6\xff\xd7\x02\x7f\x02\xf8\xff\ +\xec\x02\x7f\x02\xfa\xff\xec\x02\x7f\x02\xfc\xff\xec\x02\x7f\x02\ +\xfe\xff\xec\x02\x7f\x03\x06\xff\xd7\x02\x7f\x03\x08\xff\xd7\x02\ +\x7f\x03\x0e\xff\xec\x02\x7f\x03\x10\xff\xec\x02\x7f\x03\x18\xff\ +\xec\x02\x80\x00\x0f\xff\x85\x02\x80\x00\x11\xff\x85\x02\x80\x01\ +\x9f\xff\xec\x02\x80\x01\xa4\xff\x9a\x02\x80\x01\xaa\xffq\x02\ +\x80\x01\xae\xff\x9a\x02\x80\x01\xb5\xff\x9a\x02\x80\x01\xb8\xff\ +\xec\x02\x80\x01\xbb\xff\xec\x02\x80\x01\xbe\xff\xc3\x02\x80\x01\ +\xc9\xff\xec\x02\x80\x01\xce\xff\xae\x02\x80\x01\xcf\xff\xd7\x02\ +\x80\x01\xd5\xff\xae\x02\x80\x01\xd8\xff\xd7\x02\x80\x01\xdb\xff\ +\xd7\x02\x80\x01\xde\xff\xd7\x02\x80\x01\xe1\xff\xd7\x02\x80\x01\ +\xea\xff\xd7\x02\x80\x01\xeb\x00f\x02\x80\x01\xed\xff\xd7\x02\ +\x80\x01\xee\xff\xec\x02\x80\x01\xf2\xff\xae\x02\x80\x01\xf4\x00\ +f\x02\x80\x02\x08\xff\x85\x02\x80\x02\x0c\xff\x85\x02\x80\x02\ +j\xff\xd7\x02\x80\x02l\xff\xec\x02\x80\x02r\xffq\x02\ +\x80\x02s\xff\xae\x02\x80\x02~\xff\xec\x02\x80\x02\x7f\xff\ +\xd7\x02\x80\x02\x84\xff\xec\x02\x80\x02\x85\xff\xd7\x02\x80\x02\ +\x86\xff\xec\x02\x80\x02\x87\xff\xd7\x02\x80\x02\x88\xff\xec\x02\ +\x80\x02\x89\xff\xd7\x02\x80\x02\x8a\xff\xec\x02\x80\x02\x8c\xff\ +\xec\x02\x80\x02\x8d\xff\xd7\x02\x80\x02\x98\x00f\x02\x80\x02\ +\xa8\x00f\x02\x80\x02\xb1\xff\xec\x02\x80\x02\xb2\xff\xd7\x02\ +\x80\x02\xb3\xff\xec\x02\x80\x02\xb4\xff\xd7\x02\x80\x02\xc0\xff\ +\xd7\x02\x80\x02\xc2\xff\xd7\x02\x80\x02\xc5\xff\xd7\x02\x80\x02\ +\xc6\xff\xc3\x02\x80\x02\xc7\xff\xd7\x02\x80\x02\xc8\xff\xc3\x02\ +\x80\x02\xce\xff\x9a\x02\x80\x02\xcf\xff\xae\x02\x80\x02\xd5\xff\ +\xd7\x02\x80\x02\xd9\xffq\x02\x80\x02\xdb\xffq\x02\x80\x02\ +\xdd\xffq\x02\x80\x02\xe0\xff\xd7\x02\x80\x02\xef\xff\xec\x02\ +\x80\x02\xf0\xff\xd7\x02\x80\x02\xf1\xff\xec\x02\x80\x02\xf2\xff\ +\xd7\x02\x80\x02\xf3\xff\xec\x02\x80\x02\xf4\xff\xd7\x02\x80\x02\ +\xfe\xff\xd7\x02\x80\x03\x09\xffq\x02\x80\x03\x0a\xff\xd7\x02\ +\x80\x03\x0b\xffq\x02\x80\x03\x0c\xff\xd7\x02\x80\x03\x11\xff\ +\x9a\x02\x80\x03\x12\xff\xae\x02\x80\x03\x15\xff\xec\x02\x80\x03\ +\x16\xff\xd7\x02\x80\x03\x1a\xff\xd7\x02\x80\x03\x1b\xff\x9a\x02\ +\x80\x03\x1c\xff\xae\x02\x81\x00\x0f\xff\xae\x02\x81\x00\x11\xff\ +\xae\x02\x81\x01\xce\xff\xd7\x02\x81\x01\xd5\xff\xd7\x02\x81\x01\ +\xf2\xff\xd7\x02\x81\x02\x08\xff\xae\x02\x81\x02\x0c\xff\xae\x02\ +\x81\x02s\xff\xd7\x02\x81\x02\xcf\xff\xd7\x02\x81\x03\x12\xff\ +\xd7\x02\x81\x03\x1c\xff\xd7\x02\x82\x00\x0f\xff\x85\x02\x82\x00\ +\x11\xff\x85\x02\x82\x01\x9f\xff\xec\x02\x82\x01\xa4\xff\x9a\x02\ +\x82\x01\xaa\xffq\x02\x82\x01\xae\xff\x9a\x02\x82\x01\xb5\xff\ +\x9a\x02\x82\x01\xb8\xff\xec\x02\x82\x01\xbb\xff\xec\x02\x82\x01\ +\xbe\xff\xc3\x02\x82\x01\xc9\xff\xec\x02\x82\x01\xce\xff\xae\x02\ +\x82\x01\xcf\xff\xd7\x02\x82\x01\xd5\xff\xae\x02\x82\x01\xd8\xff\ +\xd7\x02\x82\x01\xdb\xff\xd7\x02\x82\x01\xde\xff\xd7\x02\x82\x01\ +\xe1\xff\xd7\x02\x82\x01\xea\xff\xd7\x02\x82\x01\xeb\x00f\x02\ +\x82\x01\xed\xff\xd7\x02\x82\x01\xee\xff\xec\x02\x82\x01\xf2\xff\ +\xae\x02\x82\x01\xf4\x00f\x02\x82\x02\x08\xff\x85\x02\x82\x02\ +\x0c\xff\x85\x02\x82\x02j\xff\xd7\x02\x82\x02l\xff\xec\x02\ +\x82\x02r\xffq\x02\x82\x02s\xff\xae\x02\x82\x02~\xff\ +\xec\x02\x82\x02\x7f\xff\xd7\x02\x82\x02\x84\xff\xec\x02\x82\x02\ +\x85\xff\xd7\x02\x82\x02\x86\xff\xec\x02\x82\x02\x87\xff\xd7\x02\ +\x82\x02\x88\xff\xec\x02\x82\x02\x89\xff\xd7\x02\x82\x02\x8a\xff\ +\xec\x02\x82\x02\x8c\xff\xec\x02\x82\x02\x8d\xff\xd7\x02\x82\x02\ +\x98\x00f\x02\x82\x02\xa8\x00f\x02\x82\x02\xb1\xff\xec\x02\ +\x82\x02\xb2\xff\xd7\x02\x82\x02\xb3\xff\xec\x02\x82\x02\xb4\xff\ +\xd7\x02\x82\x02\xc0\xff\xd7\x02\x82\x02\xc2\xff\xd7\x02\x82\x02\ +\xc5\xff\xd7\x02\x82\x02\xc6\xff\xc3\x02\x82\x02\xc7\xff\xd7\x02\ +\x82\x02\xc8\xff\xc3\x02\x82\x02\xce\xff\x9a\x02\x82\x02\xcf\xff\ +\xae\x02\x82\x02\xd5\xff\xd7\x02\x82\x02\xd9\xffq\x02\x82\x02\ +\xdb\xffq\x02\x82\x02\xdd\xffq\x02\x82\x02\xe0\xff\xd7\x02\ +\x82\x02\xef\xff\xec\x02\x82\x02\xf0\xff\xd7\x02\x82\x02\xf1\xff\ +\xec\x02\x82\x02\xf2\xff\xd7\x02\x82\x02\xf3\xff\xec\x02\x82\x02\ +\xf4\xff\xd7\x02\x82\x02\xfe\xff\xd7\x02\x82\x03\x09\xffq\x02\ +\x82\x03\x0a\xff\xd7\x02\x82\x03\x0b\xffq\x02\x82\x03\x0c\xff\ +\xd7\x02\x82\x03\x11\xff\x9a\x02\x82\x03\x12\xff\xae\x02\x82\x03\ +\x15\xff\xec\x02\x82\x03\x16\xff\xd7\x02\x82\x03\x1a\xff\xd7\x02\ +\x82\x03\x1b\xff\x9a\x02\x82\x03\x1c\xff\xae\x02\x83\x00\x0f\xff\ +\xae\x02\x83\x00\x11\xff\xae\x02\x83\x01\xce\xff\xd7\x02\x83\x01\ +\xd5\xff\xd7\x02\x83\x01\xf2\xff\xd7\x02\x83\x02\x08\xff\xae\x02\ +\x83\x02\x0c\xff\xae\x02\x83\x02s\xff\xd7\x02\x83\x02\xcf\xff\ +\xd7\x02\x83\x03\x12\xff\xd7\x02\x83\x03\x1c\xff\xd7\x02\x84\x00\ +\x0f\xff\xae\x02\x84\x00\x11\xff\xae\x02\x84\x01\xce\xff\xd7\x02\ +\x84\x01\xd5\xff\xd7\x02\x84\x01\xf2\xff\xd7\x02\x84\x02\x08\xff\ +\xae\x02\x84\x02\x0c\xff\xae\x02\x84\x02s\xff\xd7\x02\x84\x02\ +\xcf\xff\xd7\x02\x84\x03\x12\xff\xd7\x02\x84\x03\x1c\xff\xd7\x02\ +\x85\x00\x0f\xff\xae\x02\x85\x00\x11\xff\xae\x02\x85\x01\xce\xff\ +\xd7\x02\x85\x01\xd5\xff\xd7\x02\x85\x01\xf2\xff\xd7\x02\x85\x02\ +\x08\xff\xae\x02\x85\x02\x0c\xff\xae\x02\x85\x02s\xff\xd7\x02\ +\x85\x02\xcf\xff\xd7\x02\x85\x03\x12\xff\xd7\x02\x85\x03\x1c\xff\ +\xd7\x02\x86\x00\x0f\xff\xae\x02\x86\x00\x11\xff\xae\x02\x86\x01\ +\x9d\xff\xec\x02\x86\x01\xa4\xff\xd7\x02\x86\x01\xa6\xff\xec\x02\ +\x86\x01\xa8\xff\xd7\x02\x86\x01\xaa\xff\xd7\x02\x86\x01\xae\xff\ +\xd7\x02\x86\x01\xb0\xff\xd7\x02\x86\x01\xb1\xff\xec\x02\x86\x01\ +\xb5\xff\xd7\x02\x86\x01\xbc\xff\xc3\x02\x86\x01\xbd\xff\xd7\x02\ +\x86\x01\xbf\xff\xd7\x02\x86\x01\xc1\xff\xd7\x02\x86\x01\xc4\xff\ +\xec\x02\x86\x01\xc7\xff\xec\x02\x86\x01\xce\xff\xec\x02\x86\x01\ +\xd5\xff\xec\x02\x86\x01\xf2\xff\xec\x02\x86\x02\x08\xff\xae\x02\ +\x86\x02\x0c\xff\xae\x02\x86\x02r\xff\xd7\x02\x86\x02s\xff\ +\xec\x02\x86\x02z\xff\xec\x02\x86\x02|\xff\xd7\x02\x86\x02\ +\x80\xff\xec\x02\x86\x02\x82\xff\xec\x02\x86\x02\x9f\xff\xd7\x02\ +\x86\x02\xa1\xff\xec\x02\x86\x02\xa9\xff\xec\x02\x86\x02\xb5\xff\ +\xc3\x02\x86\x02\xb7\xff\xec\x02\x86\x02\xb9\xff\xec\x02\x86\x02\ +\xbb\xff\xd7\x02\x86\x02\xbd\xff\xec\x02\x86\x02\xbf\xff\xd7\x02\ +\x86\x02\xc1\xff\xd7\x02\x86\x02\xca\xff\xd7\x02\x86\x02\xce\xff\ +\xd7\x02\x86\x02\xcf\xff\xec\x02\x86\x02\xd4\xff\xd7\x02\x86\x02\ +\xd9\xff\xd7\x02\x86\x02\xdb\xff\xd7\x02\x86\x02\xdd\xff\xd7\x02\ +\x86\x02\xe5\xff\xd7\x02\x86\x02\xe7\xff\xec\x02\x86\x02\xf5\xff\ +\xec\x02\x86\x02\xf7\xff\xd7\x02\x86\x02\xf9\xff\xd7\x02\x86\x02\ +\xfb\xff\xd7\x02\x86\x02\xfd\xff\xd7\x02\x86\x03\x05\xff\xd7\x02\ +\x86\x03\x07\xff\xd7\x02\x86\x03\x0d\xff\xd7\x02\x86\x03\x0f\xff\ +\xd7\x02\x86\x03\x11\xff\xd7\x02\x86\x03\x12\xff\xec\x02\x86\x03\ +\x17\xff\xec\x02\x86\x03\x1b\xff\xd7\x02\x86\x03\x1c\xff\xec\x02\ +\x87\x00\x05\xff\xec\x02\x87\x00\x0a\xff\xec\x02\x87\x01\xd0\xff\ +\xd7\x02\x87\x01\xdc\xff\xec\x02\x87\x01\xdd\xff\xec\x02\x87\x01\ +\xdf\xff\xd7\x02\x87\x01\xe1\xff\xec\x02\x87\x01\xe4\xff\xec\x02\ +\x87\x01\xf6\xff\xec\x02\x87\x02\x07\xff\xec\x02\x87\x02\x0b\xff\ +\xec\x02\x87\x02\xa0\xff\xd7\x02\x87\x02\xaa\xff\xec\x02\x87\x02\ +\xb6\xff\xec\x02\x87\x02\xbc\xff\xd7\x02\x87\x02\xbe\xff\xec\x02\ +\x87\x02\xc0\xff\xec\x02\x87\x02\xc2\xff\xec\x02\x87\x02\xcb\xff\ +\xd7\x02\x87\x02\xd5\xff\xec\x02\x87\x02\xe6\xff\xd7\x02\x87\x02\ +\xf8\xff\xec\x02\x87\x02\xfa\xff\xec\x02\x87\x02\xfc\xff\xec\x02\ +\x87\x02\xfe\xff\xec\x02\x87\x03\x06\xff\xd7\x02\x87\x03\x08\xff\ +\xd7\x02\x87\x03\x0e\xff\xec\x02\x87\x03\x10\xff\xec\x02\x87\x03\ +\x18\xff\xec\x02\x88\x00\x0f\xff\xae\x02\x88\x00\x11\xff\xae\x02\ +\x88\x01\x9d\xff\xec\x02\x88\x01\xa4\xff\xd7\x02\x88\x01\xa6\xff\ +\xec\x02\x88\x01\xa8\xff\xd7\x02\x88\x01\xaa\xff\xd7\x02\x88\x01\ +\xae\xff\xd7\x02\x88\x01\xb0\xff\xd7\x02\x88\x01\xb1\xff\xec\x02\ +\x88\x01\xb5\xff\xd7\x02\x88\x01\xbc\xff\xc3\x02\x88\x01\xbd\xff\ +\xd7\x02\x88\x01\xbf\xff\xd7\x02\x88\x01\xc1\xff\xd7\x02\x88\x01\ +\xc4\xff\xec\x02\x88\x01\xc7\xff\xec\x02\x88\x01\xce\xff\xec\x02\ +\x88\x01\xd5\xff\xec\x02\x88\x01\xf2\xff\xec\x02\x88\x02\x08\xff\ +\xae\x02\x88\x02\x0c\xff\xae\x02\x88\x02r\xff\xd7\x02\x88\x02\ +s\xff\xec\x02\x88\x02z\xff\xec\x02\x88\x02|\xff\xd7\x02\ +\x88\x02\x80\xff\xec\x02\x88\x02\x82\xff\xec\x02\x88\x02\x9f\xff\ +\xd7\x02\x88\x02\xa1\xff\xec\x02\x88\x02\xa9\xff\xec\x02\x88\x02\ +\xb5\xff\xc3\x02\x88\x02\xb7\xff\xec\x02\x88\x02\xb9\xff\xec\x02\ +\x88\x02\xbb\xff\xd7\x02\x88\x02\xbd\xff\xec\x02\x88\x02\xbf\xff\ +\xd7\x02\x88\x02\xc1\xff\xd7\x02\x88\x02\xca\xff\xd7\x02\x88\x02\ +\xce\xff\xd7\x02\x88\x02\xcf\xff\xec\x02\x88\x02\xd4\xff\xd7\x02\ +\x88\x02\xd9\xff\xd7\x02\x88\x02\xdb\xff\xd7\x02\x88\x02\xdd\xff\ +\xd7\x02\x88\x02\xe5\xff\xd7\x02\x88\x02\xe7\xff\xec\x02\x88\x02\ +\xf5\xff\xec\x02\x88\x02\xf7\xff\xd7\x02\x88\x02\xf9\xff\xd7\x02\ +\x88\x02\xfb\xff\xd7\x02\x88\x02\xfd\xff\xd7\x02\x88\x03\x05\xff\ +\xd7\x02\x88\x03\x07\xff\xd7\x02\x88\x03\x0d\xff\xd7\x02\x88\x03\ +\x0f\xff\xd7\x02\x88\x03\x11\xff\xd7\x02\x88\x03\x12\xff\xec\x02\ +\x88\x03\x17\xff\xec\x02\x88\x03\x1b\xff\xd7\x02\x88\x03\x1c\xff\ +\xec\x02\x89\x00\x05\xff\xec\x02\x89\x00\x0a\xff\xec\x02\x89\x01\ +\xd0\xff\xd7\x02\x89\x01\xdc\xff\xec\x02\x89\x01\xdd\xff\xec\x02\ +\x89\x01\xdf\xff\xd7\x02\x89\x01\xe1\xff\xec\x02\x89\x01\xe4\xff\ +\xec\x02\x89\x01\xf6\xff\xec\x02\x89\x02\x07\xff\xec\x02\x89\x02\ +\x0b\xff\xec\x02\x89\x02\xa0\xff\xd7\x02\x89\x02\xaa\xff\xec\x02\ +\x89\x02\xb6\xff\xec\x02\x89\x02\xbc\xff\xd7\x02\x89\x02\xbe\xff\ +\xec\x02\x89\x02\xc0\xff\xec\x02\x89\x02\xc2\xff\xec\x02\x89\x02\ +\xcb\xff\xd7\x02\x89\x02\xd5\xff\xec\x02\x89\x02\xe6\xff\xd7\x02\ +\x89\x02\xf8\xff\xec\x02\x89\x02\xfa\xff\xec\x02\x89\x02\xfc\xff\ +\xec\x02\x89\x02\xfe\xff\xec\x02\x89\x03\x06\xff\xd7\x02\x89\x03\ +\x08\xff\xd7\x02\x89\x03\x0e\xff\xec\x02\x89\x03\x10\xff\xec\x02\ +\x89\x03\x18\xff\xec\x02\x8a\x00\x0f\xff\xae\x02\x8a\x00\x11\xff\ +\xae\x02\x8a\x01\x9d\xff\xec\x02\x8a\x01\xa4\xff\xd7\x02\x8a\x01\ +\xa6\xff\xec\x02\x8a\x01\xa8\xff\xd7\x02\x8a\x01\xaa\xff\xd7\x02\ +\x8a\x01\xae\xff\xd7\x02\x8a\x01\xb0\xff\xd7\x02\x8a\x01\xb1\xff\ +\xec\x02\x8a\x01\xb5\xff\xd7\x02\x8a\x01\xbc\xff\xc3\x02\x8a\x01\ +\xbd\xff\xd7\x02\x8a\x01\xbf\xff\xd7\x02\x8a\x01\xc1\xff\xd7\x02\ +\x8a\x01\xc4\xff\xec\x02\x8a\x01\xc7\xff\xec\x02\x8a\x01\xce\xff\ +\xec\x02\x8a\x01\xd5\xff\xec\x02\x8a\x01\xf2\xff\xec\x02\x8a\x02\ +\x08\xff\xae\x02\x8a\x02\x0c\xff\xae\x02\x8a\x02r\xff\xd7\x02\ +\x8a\x02s\xff\xec\x02\x8a\x02z\xff\xec\x02\x8a\x02|\xff\ +\xd7\x02\x8a\x02\x80\xff\xec\x02\x8a\x02\x82\xff\xec\x02\x8a\x02\ +\x9f\xff\xd7\x02\x8a\x02\xa1\xff\xec\x02\x8a\x02\xa9\xff\xec\x02\ +\x8a\x02\xb5\xff\xc3\x02\x8a\x02\xb7\xff\xec\x02\x8a\x02\xb9\xff\ +\xec\x02\x8a\x02\xbb\xff\xd7\x02\x8a\x02\xbd\xff\xec\x02\x8a\x02\ +\xbf\xff\xd7\x02\x8a\x02\xc1\xff\xd7\x02\x8a\x02\xca\xff\xd7\x02\ +\x8a\x02\xce\xff\xd7\x02\x8a\x02\xcf\xff\xec\x02\x8a\x02\xd4\xff\ +\xd7\x02\x8a\x02\xd9\xff\xd7\x02\x8a\x02\xdb\xff\xd7\x02\x8a\x02\ +\xdd\xff\xd7\x02\x8a\x02\xe5\xff\xd7\x02\x8a\x02\xe7\xff\xec\x02\ +\x8a\x02\xf5\xff\xec\x02\x8a\x02\xf7\xff\xd7\x02\x8a\x02\xf9\xff\ +\xd7\x02\x8a\x02\xfb\xff\xd7\x02\x8a\x02\xfd\xff\xd7\x02\x8a\x03\ +\x05\xff\xd7\x02\x8a\x03\x07\xff\xd7\x02\x8a\x03\x0d\xff\xd7\x02\ +\x8a\x03\x0f\xff\xd7\x02\x8a\x03\x11\xff\xd7\x02\x8a\x03\x12\xff\ +\xec\x02\x8a\x03\x17\xff\xec\x02\x8a\x03\x1b\xff\xd7\x02\x8a\x03\ +\x1c\xff\xec\x02\x8b\x00\x0f\xff\xae\x02\x8b\x00\x11\xff\xae\x02\ +\x8b\x01\xce\xff\xd7\x02\x8b\x01\xd5\xff\xd7\x02\x8b\x01\xf2\xff\ +\xd7\x02\x8b\x02\x08\xff\xae\x02\x8b\x02\x0c\xff\xae\x02\x8b\x02\ +s\xff\xd7\x02\x8b\x02\xcf\xff\xd7\x02\x8b\x03\x12\xff\xd7\x02\ +\x8b\x03\x1c\xff\xd7\x02\x8c\x01\x9f\xff\xd7\x02\x8c\x01\xb8\xff\ +\xd7\x02\x8c\x01\xbb\xff\xd7\x02\x8c\x01\xbe\xff\xd7\x02\x8c\x01\ +\xe1\xff\xd7\x02\x8c\x02l\xff\xd7\x02\x8c\x02~\xff\xd7\x02\ +\x8c\x02\x84\xff\xd7\x02\x8c\x02\x86\xff\xd7\x02\x8c\x02\x88\xff\ +\xd7\x02\x8c\x02\x8a\xff\xd7\x02\x8c\x02\x8c\xff\xd7\x02\x8c\x02\ +\xb1\xff\xd7\x02\x8c\x02\xb3\xff\xd7\x02\x8c\x02\xc0\xff\xd7\x02\ +\x8c\x02\xc2\xff\xd7\x02\x8c\x02\xc5\xff\xd7\x02\x8c\x02\xc7\xff\ +\xd7\x02\x8c\x02\xd5\xff\xd7\x02\x8c\x02\xef\xff\xd7\x02\x8c\x02\ +\xf1\xff\xd7\x02\x8c\x02\xf3\xff\xd7\x02\x8c\x02\xfe\xff\xd7\x02\ +\x8c\x03\x09\xff\xd7\x02\x8c\x03\x0b\xff\xd7\x02\x8c\x03\x0e\xff\ +\xd7\x02\x8c\x03\x10\xff\xd7\x02\x8c\x03\x15\xff\xd7\x02\x95\x01\ +\xa3\x00\xe1\x02\x95\x02\xea\x00)\x02\x95\x03\x0e\xff\xd7\x02\ +\x95\x03\x10\xff\xd7\x02\x96\x00\x05\xff\xec\x02\x96\x00\x0a\xff\ +\xec\x02\x96\x02\x07\xff\xec\x02\x96\x02\x0b\xff\xec\x02\x97\x00\ +\x05\xff\xae\x02\x97\x00\x0a\xff\xae\x02\x97\x01\x9d\xff\xd7\x02\ +\x97\x01\xa6\xff\xd7\x02\x97\x01\xbc\xff\xae\x02\x97\x01\xc1\xff\ +\xae\x02\x97\x01\xc4\xff\xd7\x02\x97\x01\xdc\xff\xd7\x02\x97\x01\ +\xe4\xff\xd7\x02\x97\x02\x07\xff\xae\x02\x97\x02\x0b\xff\xae\x02\ +\x97\x02|\xff\xae\x02\x97\x02\x80\xff\xc3\x02\x97\x02\x82\xff\ +\xc3\x02\x97\x02\xa9\xff\xd7\x02\x97\x02\xaa\xff\xd7\x02\x97\x02\ +\xb5\xff\xae\x02\x97\x02\xb6\xff\xd7\x02\x97\x02\xb7\xff\xc3\x02\ +\x97\x02\xb9\xff\xc3\x02\x97\x02\xbd\xff\xd7\x02\x97\x02\xbe\xff\ +\xd7\x02\x97\x02\xbf\xff\xae\x02\x97\x02\xc1\xff\xae\x02\x97\x02\ +\xd4\xff\xae\x02\x97\x02\xfd\xff\xae\x02\x97\x03\x0d\xff\x9a\x02\ +\x97\x03\x0f\xff\x9a\x02\x97\x03\x17\xff\xd7\x02\x97\x03\x18\xff\ +\xd7\x02\x98\x00\x05\xff\x85\x02\x98\x00\x0a\xff\x85\x02\x98\x01\ +\xd0\xff\xd7\x02\x98\x01\xdc\xff\x9a\x02\x98\x01\xdd\xff\xc3\x02\ +\x98\x01\xdf\xff\xd7\x02\x98\x01\xe1\xff\xae\x02\x98\x01\xe4\xff\ +\x9a\x02\x98\x01\xf6\xff\xc3\x02\x98\x02\x07\xff\x85\x02\x98\x02\ +\x0b\xff\x85\x02\x98\x02m\xff\xd7\x02\x98\x02\x81\xff\xd7\x02\ +\x98\x02\x83\xff\xd7\x02\x98\x02\x8b\xff\xd7\x02\x98\x02\xa0\xff\ +\xd7\x02\x98\x02\xaa\xff\x9a\x02\x98\x02\xb6\xff\x9a\x02\x98\x02\ +\xb8\xff\xc3\x02\x98\x02\xba\xff\xc3\x02\x98\x02\xbc\xff\xd7\x02\ +\x98\x02\xbe\xff\x9a\x02\x98\x02\xc0\xff\xae\x02\x98\x02\xc2\xff\ +\xae\x02\x98\x02\xc6\xff\xd7\x02\x98\x02\xc8\xff\xd7\x02\x98\x02\ +\xcb\xff\xd7\x02\x98\x02\xd5\xff\xae\x02\x98\x02\xe6\xff\xd7\x02\ +\x98\x02\xea\xff\xd7\x02\x98\x02\xf8\xff\xc3\x02\x98\x02\xfa\xff\ +\xc3\x02\x98\x02\xfc\xff\xc3\x02\x98\x02\xfe\xff\xae\x02\x98\x03\ +\x06\xff\xd7\x02\x98\x03\x08\xff\xd7\x02\x98\x03\x0e\xff\x9a\x02\ +\x98\x03\x10\xff\x9a\x02\x98\x03\x18\xff\x9a\x02\x99\x00\x0f\xfe\ +\xf6\x02\x99\x00\x11\xfe\xf6\x02\x99\x01\xa4\xff\x85\x02\x99\x01\ +\xaa\xff\x9a\x02\x99\x01\xae\xff\x85\x02\x99\x01\xb0\xff\xd7\x02\ +\x99\x01\xb5\xff\x85\x02\x99\x01\xbf\xff\xd7\x02\x99\x01\xce\xff\ +\x9a\x02\x99\x01\xd5\xff\x9a\x02\x99\x01\xf2\xff\x9a\x02\x99\x02\ +\x08\xfe\xf6\x02\x99\x02\x0c\xfe\xf6\x02\x99\x02r\xff\x9a\x02\ +\x99\x02s\xff\x9a\x02\x99\x02v\xff\xec\x02\x99\x02\x9f\xff\ +\xd7\x02\x99\x02\xbb\xff\xd7\x02\x99\x02\xca\xff\xd7\x02\x99\x02\ +\xce\xff\x85\x02\x99\x02\xcf\xff\x9a\x02\x99\x02\xd9\xff\x9a\x02\ +\x99\x02\xdb\xff\x9a\x02\x99\x02\xdd\xff\x9a\x02\x99\x02\xe5\xff\ +\xd7\x02\x99\x03\x05\xff\xd7\x02\x99\x03\x07\xff\xd7\x02\x99\x03\ +\x09\xff\xae\x02\x99\x03\x0b\xff\xae\x02\x99\x03\x11\xff\x85\x02\ +\x99\x03\x12\xff\x9a\x02\x99\x03\x1b\xff\x85\x02\x99\x03\x1c\xff\ +\x9a\x02\x9a\x00\x05\xff\xec\x02\x9a\x00\x0a\xff\xec\x02\x9a\x01\ +\xd0\xff\xd7\x02\x9a\x01\xdc\xff\xec\x02\x9a\x01\xdd\xff\xec\x02\ +\x9a\x01\xdf\xff\xd7\x02\x9a\x01\xe1\xff\xec\x02\x9a\x01\xe4\xff\ +\xec\x02\x9a\x01\xf6\xff\xec\x02\x9a\x02\x07\xff\xec\x02\x9a\x02\ +\x0b\xff\xec\x02\x9a\x02\xa0\xff\xd7\x02\x9a\x02\xaa\xff\xec\x02\ +\x9a\x02\xb6\xff\xec\x02\x9a\x02\xbc\xff\xd7\x02\x9a\x02\xbe\xff\ +\xec\x02\x9a\x02\xc0\xff\xec\x02\x9a\x02\xc2\xff\xec\x02\x9a\x02\ +\xcb\xff\xd7\x02\x9a\x02\xd5\xff\xec\x02\x9a\x02\xe6\xff\xd7\x02\ +\x9a\x02\xf8\xff\xec\x02\x9a\x02\xfa\xff\xec\x02\x9a\x02\xfc\xff\ +\xec\x02\x9a\x02\xfe\xff\xec\x02\x9a\x03\x06\xff\xd7\x02\x9a\x03\ +\x08\xff\xd7\x02\x9a\x03\x0e\xff\xec\x02\x9a\x03\x10\xff\xec\x02\ +\x9a\x03\x18\xff\xec\x02\x9b\x00\x0f\xff\x9a\x02\x9b\x00\x10\xff\ +\xd7\x02\x9b\x00\x11\xff\x9a\x02\x9b\x01\x9d\x00)\x02\x9b\x01\ +\x9f\xff\xd7\x02\x9b\x01\xa4\xff\xae\x02\x9b\x01\xa6\x00)\x02\ +\x9b\x01\xaa\xff\x85\x02\x9b\x01\xae\xff\xae\x02\x9b\x01\xb5\xff\ +\xae\x02\x9b\x01\xb8\xff\xd7\x02\x9b\x01\xbb\xff\xd7\x02\x9b\x01\ +\xbc\x00)\x02\x9b\x01\xbe\xff\xc3\x02\x9b\x01\xc4\x00)\x02\ +\x9b\x01\xcc\xff\xc3\x02\x9b\x01\xcd\xff\xc3\x02\x9b\x01\xce\xff\ +\x9a\x02\x9b\x01\xcf\xff\xae\x02\x9b\x01\xd0\xff\xd7\x02\x9b\x01\ +\xd1\xff\xd7\x02\x9b\x01\xd2\xff\xc3\x02\x9b\x01\xd3\xff\xc3\x02\ +\x9b\x01\xd4\xff\xc3\x02\x9b\x01\xd5\xff\x9a\x02\x9b\x01\xd6\xff\ +\xc3\x02\x9b\x01\xd7\xff\xc3\x02\x9b\x01\xd8\xff\xae\x02\x9b\x01\ +\xd9\xff\xc3\x02\x9b\x01\xda\xff\xc3\x02\x9b\x01\xdb\xff\xae\x02\ +\x9b\x01\xde\xff\xae\x02\x9b\x01\xdf\xff\xd7\x02\x9b\x01\xe0\xff\ +\xc3\x02\x9b\x01\xe1\xff\x9a\x02\x9b\x01\xe2\xff\xc3\x02\x9b\x01\ +\xe3\xff\xc3\x02\x9b\x01\xe5\xff\xc3\x02\x9b\x01\xe6\xff\xc3\x02\ +\x9b\x01\xe7\xff\xd7\x02\x9b\x01\xe8\xff\xc3\x02\x9b\x01\xea\xff\ +\xae\x02\x9b\x01\xeb\x00)\x02\x9b\x01\xec\xff\xc3\x02\x9b\x01\ +\xed\xff\xae\x02\x9b\x01\xee\xff\xc3\x02\x9b\x01\xf2\xff\x9a\x02\ +\x9b\x01\xf3\xff\xc3\x02\x9b\x01\xf4\x00)\x02\x9b\x01\xf5\xff\ +\xc3\x02\x9b\x01\xf7\xff\xc3\x02\x9b\x01\xf9\xff\xc3\x02\x9b\x02\ +\x02\xff\xd7\x02\x9b\x02\x03\xff\xd7\x02\x9b\x02\x04\xff\xd7\x02\ +\x9b\x02\x08\xff\x9a\x02\x9b\x02\x0c\xff\x9a\x02\x9b\x02j\xff\ +\xae\x02\x9b\x02k\xff\xc3\x02\x9b\x02l\xff\xd7\x02\x9b\x02\ +q\xff\xc3\x02\x9b\x02r\xff\x85\x02\x9b\x02s\xff\x9a\x02\ +\x9b\x02u\xff\xc3\x02\x9b\x02w\xff\xd7\x02\x9b\x02y\xff\ +\xc3\x02\x9b\x02}\xff\xc3\x02\x9b\x02~\xff\xd7\x02\x9b\x02\ +\x7f\xff\xae\x02\x9b\x02\x84\xff\xd7\x02\x9b\x02\x85\xff\xae\x02\ +\x9b\x02\x86\xff\xd7\x02\x9b\x02\x87\xff\xae\x02\x9b\x02\x88\xff\ +\xd7\x02\x9b\x02\x89\xff\xae\x02\x9b\x02\x8a\xff\xd7\x02\x9b\x02\ +\x8c\xff\xd7\x02\x9b\x02\x8d\xff\xae\x02\x9b\x02\x96\xff\xc3\x02\ +\x9b\x02\x98\x00)\x02\x9b\x02\x9a\xff\xc3\x02\x9b\x02\x9e\xff\ +\xc3\x02\x9b\x02\xa0\xff\xd7\x02\x9b\x02\xa2\xff\xd7\x02\x9b\x02\ +\xa4\xff\xc3\x02\x9b\x02\xa6\xff\xc3\x02\x9b\x02\xa8\x00)\x02\ +\x9b\x02\xa9\x00)\x02\x9b\x02\xac\xff\xc3\x02\x9b\x02\xae\xff\ +\xc3\x02\x9b\x02\xb0\xff\xc3\x02\x9b\x02\xb1\xff\xd7\x02\x9b\x02\ +\xb2\xff\xae\x02\x9b\x02\xb3\xff\xd7\x02\x9b\x02\xb4\xff\xae\x02\ +\x9b\x02\xb5\x00)\x02\x9b\x02\xbc\xff\xd7\x02\x9b\x02\xbd\x00\ +)\x02\x9b\x02\xc0\xff\x9a\x02\x9b\x02\xc2\xff\x9a\x02\x9b\x02\ +\xc4\xff\xc3\x02\x9b\x02\xc5\xff\xd7\x02\x9b\x02\xc6\xff\xc3\x02\ +\x9b\x02\xc7\xff\xd7\x02\x9b\x02\xc8\xff\xc3\x02\x9b\x02\xcb\xff\ +\xd7\x02\x9b\x02\xcd\xff\xc3\x02\x9b\x02\xce\xff\xae\x02\x9b\x02\ +\xcf\xff\x9a\x02\x9b\x02\xd1\xff\xc3\x02\x9b\x02\xd3\xff\xc3\x02\ +\x9b\x02\xd5\xff\x9a\x02\x9b\x02\xd7\xff\xc3\x02\x9b\x02\xd9\xff\ +\x85\x02\x9b\x02\xdb\xff\x85\x02\x9b\x02\xdd\xff\x85\x02\x9b\x02\ +\xe0\xff\xae\x02\x9b\x02\xe6\xff\xd7\x02\x9b\x02\xe8\xff\xd7\x02\ +\x9b\x02\xec\xff\xc3\x02\x9b\x02\xee\xff\xc3\x02\x9b\x02\xef\xff\ +\xd7\x02\x9b\x02\xf0\xff\xae\x02\x9b\x02\xf1\xff\xd7\x02\x9b\x02\ +\xf2\xff\xae\x02\x9b\x02\xf3\xff\xd7\x02\x9b\x02\xf4\xff\xae\x02\ +\x9b\x02\xf6\xff\xd7\x02\x9b\x02\xfe\xff\x9a\x02\x9b\x03\x00\xff\ +\xc3\x02\x9b\x03\x02\xff\xc3\x02\x9b\x03\x06\xff\xd7\x02\x9b\x03\ +\x08\xff\xd7\x02\x9b\x03\x09\xff\x9a\x02\x9b\x03\x0a\xff\xae\x02\ +\x9b\x03\x0b\xff\x9a\x02\x9b\x03\x0c\xff\xae\x02\x9b\x03\x0e\xff\ +\xd7\x02\x9b\x03\x10\xff\xd7\x02\x9b\x03\x11\xff\xae\x02\x9b\x03\ +\x12\xff\x9a\x02\x9b\x03\x14\xff\xc3\x02\x9b\x03\x15\xff\xd7\x02\ +\x9b\x03\x16\xff\xae\x02\x9b\x03\x17\x00)\x02\x9b\x03\x1a\xff\ +\xae\x02\x9b\x03\x1b\xff\xae\x02\x9b\x03\x1c\xff\x9a\x02\x9c\x00\ +\x0f\xff\xc3\x02\x9c\x00\x11\xff\xc3\x02\x9c\x01\xce\xff\xc3\x02\ +\x9c\x01\xcf\xff\xd7\x02\x9c\x01\xd5\xff\xc3\x02\x9c\x01\xd8\xff\ +\xd7\x02\x9c\x01\xdb\xff\xd7\x02\x9c\x01\xde\xff\xd7\x02\x9c\x01\ +\xea\xff\xd7\x02\x9c\x01\xed\xff\xd7\x02\x9c\x01\xf2\xff\xc3\x02\ +\x9c\x02\x08\xff\xc3\x02\x9c\x02\x0c\xff\xc3\x02\x9c\x02j\xff\ +\xd7\x02\x9c\x02s\xff\xc3\x02\x9c\x02\x7f\xff\xd7\x02\x9c\x02\ +\x85\xff\xd7\x02\x9c\x02\x87\xff\xd7\x02\x9c\x02\x89\xff\xd7\x02\ +\x9c\x02\x8d\xff\xd7\x02\x9c\x02\xb2\xff\xd7\x02\x9c\x02\xb4\xff\ +\xd7\x02\x9c\x02\xcf\xff\xc3\x02\x9c\x02\xe0\xff\xd7\x02\x9c\x02\ +\xf0\xff\xd7\x02\x9c\x02\xf2\xff\xd7\x02\x9c\x02\xf4\xff\xd7\x02\ +\x9c\x03\x0a\xff\xd7\x02\x9c\x03\x0c\xff\xd7\x02\x9c\x03\x12\xff\ +\xc3\x02\x9c\x03\x16\xff\xd7\x02\x9c\x03\x1a\xff\xd7\x02\x9c\x03\ +\x1c\xff\xc3\x02\x9d\x00\x05\xff\xc3\x02\x9d\x00\x0a\xff\xc3\x02\ +\x9d\x01\x9d\xff\xc3\x02\x9d\x01\xa3\x00f\x02\x9d\x01\xa6\xff\ +\xc3\x02\x9d\x01\xbc\xff\xc3\x02\x9d\x01\xc1\xff\xae\x02\x9d\x01\ +\xc4\xff\xc3\x02\x9d\x01\xdc\xff\xd7\x02\x9d\x01\xe1\xff\xd7\x02\ +\x9d\x01\xe4\xff\xd7\x02\x9d\x02\x07\xff\xc3\x02\x9d\x02\x0b\xff\ +\xc3\x02\x9d\x02|\xff\xae\x02\x9d\x02\x80\xff\xc3\x02\x9d\x02\ +\x82\xff\xc3\x02\x9d\x02\xa9\xff\xc3\x02\x9d\x02\xaa\xff\xd7\x02\ +\x9d\x02\xb5\xff\xc3\x02\x9d\x02\xb6\xff\xd7\x02\x9d\x02\xb7\xff\ +\xd7\x02\x9d\x02\xb9\xff\xd7\x02\x9d\x02\xbd\xff\xc3\x02\x9d\x02\ +\xbe\xff\xd7\x02\x9d\x02\xbf\xff\xae\x02\x9d\x02\xc0\xff\xd7\x02\ +\x9d\x02\xc1\xff\xae\x02\x9d\x02\xc2\xff\xd7\x02\x9d\x02\xd4\xff\ +\xae\x02\x9d\x02\xd5\xff\xd7\x02\x9d\x02\xfd\xff\xae\x02\x9d\x02\ +\xfe\xff\xd7\x02\x9d\x03\x0d\xff\xd7\x02\x9d\x03\x0e\xff\xc3\x02\ +\x9d\x03\x0f\xff\xd7\x02\x9d\x03\x10\xff\xc3\x02\x9d\x03\x17\xff\ +\xc3\x02\x9d\x03\x18\xff\xd7\x02\x9e\x00\x05\xff\xc3\x02\x9e\x00\ +\x0a\xff\xc3\x02\x9e\x02\x07\xff\xc3\x02\x9e\x02\x0b\xff\xc3\x02\ +\x9e\x03\x0e\xff\xd7\x02\x9e\x03\x10\xff\xd7\x02\x9f\x01\x9f\xff\ +\xd7\x02\x9f\x01\xa3\x00\xe1\x02\x9f\x01\xb8\xff\xd7\x02\x9f\x01\ +\xbb\xff\xd7\x02\x9f\x01\xbe\xff\xc3\x02\x9f\x01\xdc\xff\xd7\x02\ +\x9f\x01\xe1\xff\xae\x02\x9f\x01\xe4\xff\xd7\x02\x9f\x02l\xff\ +\xd7\x02\x9f\x02{\x00=\x02\x9f\x02}\xff\xec\x02\x9f\x02\ +~\xff\xd7\x02\x9f\x02\x84\xff\xd7\x02\x9f\x02\x86\xff\xd7\x02\ +\x9f\x02\x88\xff\xd7\x02\x9f\x02\x8a\xff\xd7\x02\x9f\x02\x8c\xff\ +\xd7\x02\x9f\x02\xaa\xff\xd7\x02\x9f\x02\xb1\xff\xd7\x02\x9f\x02\ +\xb3\xff\xd7\x02\x9f\x02\xb6\xff\xd7\x02\x9f\x02\xbe\xff\xd7\x02\ +\x9f\x02\xc0\xff\xae\x02\x9f\x02\xc2\xff\xae\x02\x9f\x02\xc5\xff\ +\xc3\x02\x9f\x02\xc6\xff\xd7\x02\x9f\x02\xc7\xff\xc3\x02\x9f\x02\ +\xc8\xff\xd7\x02\x9f\x02\xd5\xff\xae\x02\x9f\x02\xef\xff\xd7\x02\ +\x9f\x02\xf1\xff\xd7\x02\x9f\x02\xf3\xff\xd7\x02\x9f\x02\xfe\xff\ +\xae\x02\x9f\x03\x0e\xff\xd7\x02\x9f\x03\x10\xff\xd7\x02\x9f\x03\ +\x15\xff\xd7\x02\x9f\x03\x18\xff\xd7\x02\xa0\x01\xcf\xff\xec\x02\ +\xa0\x01\xd8\xff\xec\x02\xa0\x01\xdb\xff\xec\x02\xa0\x01\xde\xff\ +\xec\x02\xa0\x01\xe1\xff\xec\x02\xa0\x01\xea\xff\xec\x02\xa0\x01\ +\xed\xff\xec\x02\xa0\x02j\xff\xec\x02\xa0\x02\x7f\xff\xec\x02\ +\xa0\x02\x85\xff\xec\x02\xa0\x02\x87\xff\xec\x02\xa0\x02\x89\xff\ +\xec\x02\xa0\x02\x8d\xff\xec\x02\xa0\x02\xb2\xff\xec\x02\xa0\x02\ +\xb4\xff\xec\x02\xa0\x02\xc0\xff\xec\x02\xa0\x02\xc2\xff\xec\x02\ +\xa0\x02\xd5\xff\xec\x02\xa0\x02\xe0\xff\xec\x02\xa0\x02\xf0\xff\ +\xec\x02\xa0\x02\xf2\xff\xec\x02\xa0\x02\xf4\xff\xec\x02\xa0\x02\ +\xfe\xff\xec\x02\xa0\x03\x0a\xff\xec\x02\xa0\x03\x0c\xff\xec\x02\ +\xa0\x03\x0e\xff\xd7\x02\xa0\x03\x10\xff\xd7\x02\xa0\x03\x16\xff\ +\xec\x02\xa0\x03\x1a\xff\xec\x02\xa1\x00\x0f\xff\xae\x02\xa1\x00\ +\x11\xff\xae\x02\xa1\x02\x08\xff\xae\x02\xa1\x02\x0c\xff\xae\x02\ +\xa1\x02\x80\xff\xec\x02\xa1\x02\x82\xff\xec\x02\xa1\x02\xb7\xff\ +\xec\x02\xa1\x02\xb9\xff\xec\x02\xa1\x03\x0d\xff\xd7\x02\xa1\x03\ +\x0f\xff\xd7\x02\xa2\x01\xe9\x00)\x02\xa3\x01\x9f\xff\xd7\x02\ +\xa3\x01\xa3\x00\xe1\x02\xa3\x01\xb8\xff\xd7\x02\xa3\x01\xbb\xff\ +\xd7\x02\xa3\x01\xbe\xff\xc3\x02\xa3\x01\xdc\xff\xd7\x02\xa3\x01\ +\xe1\xff\xae\x02\xa3\x01\xe4\xff\xd7\x02\xa3\x02l\xff\xd7\x02\ +\xa3\x02{\x00=\x02\xa3\x02}\xff\xec\x02\xa3\x02~\xff\ +\xd7\x02\xa3\x02\x84\xff\xd7\x02\xa3\x02\x86\xff\xd7\x02\xa3\x02\ +\x88\xff\xd7\x02\xa3\x02\x8a\xff\xd7\x02\xa3\x02\x8c\xff\xd7\x02\ +\xa3\x02\xaa\xff\xd7\x02\xa3\x02\xb1\xff\xd7\x02\xa3\x02\xb3\xff\ +\xd7\x02\xa3\x02\xb6\xff\xd7\x02\xa3\x02\xbe\xff\xd7\x02\xa3\x02\ +\xc0\xff\xae\x02\xa3\x02\xc2\xff\xae\x02\xa3\x02\xc5\xff\xc3\x02\ +\xa3\x02\xc6\xff\xd7\x02\xa3\x02\xc7\xff\xc3\x02\xa3\x02\xc8\xff\ +\xd7\x02\xa3\x02\xd5\xff\xae\x02\xa3\x02\xef\xff\xd7\x02\xa3\x02\ +\xf1\xff\xd7\x02\xa3\x02\xf3\xff\xd7\x02\xa3\x02\xfe\xff\xae\x02\ +\xa3\x03\x0e\xff\xd7\x02\xa3\x03\x10\xff\xd7\x02\xa3\x03\x15\xff\ +\xd7\x02\xa3\x03\x18\xff\xd7\x02\xa4\x01\xcf\xff\xec\x02\xa4\x01\ +\xd8\xff\xec\x02\xa4\x01\xdb\xff\xec\x02\xa4\x01\xde\xff\xec\x02\ +\xa4\x01\xe1\xff\xec\x02\xa4\x01\xea\xff\xec\x02\xa4\x01\xed\xff\ +\xec\x02\xa4\x02j\xff\xec\x02\xa4\x02\x7f\xff\xec\x02\xa4\x02\ +\x85\xff\xec\x02\xa4\x02\x87\xff\xec\x02\xa4\x02\x89\xff\xec\x02\ +\xa4\x02\x8d\xff\xec\x02\xa4\x02\xb2\xff\xec\x02\xa4\x02\xb4\xff\ +\xec\x02\xa4\x02\xc0\xff\xec\x02\xa4\x02\xc2\xff\xec\x02\xa4\x02\ +\xd5\xff\xec\x02\xa4\x02\xe0\xff\xec\x02\xa4\x02\xf0\xff\xec\x02\ +\xa4\x02\xf2\xff\xec\x02\xa4\x02\xf4\xff\xec\x02\xa4\x02\xfe\xff\ +\xec\x02\xa4\x03\x0a\xff\xec\x02\xa4\x03\x0c\xff\xec\x02\xa4\x03\ +\x0e\xff\xd7\x02\xa4\x03\x10\xff\xd7\x02\xa4\x03\x16\xff\xec\x02\ +\xa4\x03\x1a\xff\xec\x02\xa5\x01\x9f\xff\xd7\x02\xa5\x01\xb8\xff\ +\xd7\x02\xa5\x01\xbb\xff\xd7\x02\xa5\x01\xbe\xff\xd7\x02\xa5\x01\ +\xc1\xff\xd7\x02\xa5\x01\xe1\xff\xd7\x02\xa5\x02l\xff\xd7\x02\ +\xa5\x02|\xff\xd7\x02\xa5\x02~\xff\xd7\x02\xa5\x02\x84\xff\ +\xd7\x02\xa5\x02\x86\xff\xd7\x02\xa5\x02\x88\xff\xd7\x02\xa5\x02\ +\x8a\xff\xd7\x02\xa5\x02\x8c\xff\xd7\x02\xa5\x02\xb1\xff\xd7\x02\ +\xa5\x02\xb3\xff\xd7\x02\xa5\x02\xbf\xff\xd7\x02\xa5\x02\xc0\xff\ +\xd7\x02\xa5\x02\xc1\xff\xd7\x02\xa5\x02\xc2\xff\xd7\x02\xa5\x02\ +\xc5\xff\x9a\x02\xa5\x02\xc7\xff\x9a\x02\xa5\x02\xd4\xff\xd7\x02\ +\xa5\x02\xd5\xff\xd7\x02\xa5\x02\xef\xff\xd7\x02\xa5\x02\xf1\xff\ +\xd7\x02\xa5\x02\xf3\xff\xd7\x02\xa5\x02\xfd\xff\xd7\x02\xa5\x02\ +\xfe\xff\xd7\x02\xa5\x03\x09\xff\xd7\x02\xa5\x03\x0b\xff\xd7\x02\ +\xa5\x03\x0e\xff\xd7\x02\xa5\x03\x10\xff\xd7\x02\xa5\x03\x15\xff\ +\xd7\x02\xa5\x03\x19\xff\xec\x02\xa6\x01\xcf\xff\xd7\x02\xa6\x01\ +\xd8\xff\xd7\x02\xa6\x01\xdb\xff\xd7\x02\xa6\x01\xde\xff\xd7\x02\ +\xa6\x01\xe1\xff\xd7\x02\xa6\x01\xea\xff\xd7\x02\xa6\x01\xed\xff\ +\xd7\x02\xa6\x02j\xff\xd7\x02\xa6\x02\x7f\xff\xd7\x02\xa6\x02\ +\x85\xff\xd7\x02\xa6\x02\x87\xff\xd7\x02\xa6\x02\x89\xff\xd7\x02\ +\xa6\x02\x8d\xff\xd7\x02\xa6\x02\xb2\xff\xd7\x02\xa6\x02\xb4\xff\ +\xd7\x02\xa6\x02\xc0\xff\xd7\x02\xa6\x02\xc2\xff\xd7\x02\xa6\x02\ +\xc6\xff\xd7\x02\xa6\x02\xc8\xff\xd7\x02\xa6\x02\xd5\xff\xd7\x02\ +\xa6\x02\xe0\xff\xd7\x02\xa6\x02\xf0\xff\xd7\x02\xa6\x02\xf2\xff\ +\xd7\x02\xa6\x02\xf4\xff\xd7\x02\xa6\x02\xfe\xff\xd7\x02\xa6\x03\ +\x0a\xff\xd7\x02\xa6\x03\x0c\xff\xd7\x02\xa6\x03\x16\xff\xd7\x02\ +\xa6\x03\x1a\xff\xd7\x02\xa7\x01\x9f\xff\xd7\x02\xa7\x01\xb8\xff\ +\xd7\x02\xa7\x01\xbb\xff\xd7\x02\xa7\x01\xbe\xff\xd7\x02\xa7\x01\ +\xc1\xff\xd7\x02\xa7\x01\xe1\xff\xd7\x02\xa7\x02l\xff\xd7\x02\ +\xa7\x02|\xff\xd7\x02\xa7\x02~\xff\xd7\x02\xa7\x02\x84\xff\ +\xd7\x02\xa7\x02\x86\xff\xd7\x02\xa7\x02\x88\xff\xd7\x02\xa7\x02\ +\x8a\xff\xd7\x02\xa7\x02\x8c\xff\xd7\x02\xa7\x02\xb1\xff\xd7\x02\ +\xa7\x02\xb3\xff\xd7\x02\xa7\x02\xbf\xff\xd7\x02\xa7\x02\xc0\xff\ +\xd7\x02\xa7\x02\xc1\xff\xd7\x02\xa7\x02\xc2\xff\xd7\x02\xa7\x02\ +\xc5\xff\x9a\x02\xa7\x02\xc7\xff\x9a\x02\xa7\x02\xd4\xff\xd7\x02\ +\xa7\x02\xd5\xff\xd7\x02\xa7\x02\xef\xff\xd7\x02\xa7\x02\xf1\xff\ +\xd7\x02\xa7\x02\xf3\xff\xd7\x02\xa7\x02\xfd\xff\xd7\x02\xa7\x02\ +\xfe\xff\xd7\x02\xa7\x03\x09\xff\xd7\x02\xa7\x03\x0b\xff\xd7\x02\ +\xa7\x03\x0e\xff\xd7\x02\xa7\x03\x10\xff\xd7\x02\xa7\x03\x15\xff\ +\xd7\x02\xa7\x03\x19\xff\xec\x02\xa8\x01\xcf\xff\xd7\x02\xa8\x01\ +\xd8\xff\xd7\x02\xa8\x01\xdb\xff\xd7\x02\xa8\x01\xde\xff\xd7\x02\ +\xa8\x01\xe1\xff\xd7\x02\xa8\x01\xea\xff\xd7\x02\xa8\x01\xed\xff\ +\xd7\x02\xa8\x02j\xff\xd7\x02\xa8\x02\x7f\xff\xd7\x02\xa8\x02\ +\x85\xff\xd7\x02\xa8\x02\x87\xff\xd7\x02\xa8\x02\x89\xff\xd7\x02\ +\xa8\x02\x8d\xff\xd7\x02\xa8\x02\xb2\xff\xd7\x02\xa8\x02\xb4\xff\ +\xd7\x02\xa8\x02\xc0\xff\xd7\x02\xa8\x02\xc2\xff\xd7\x02\xa8\x02\ +\xc6\xff\xd7\x02\xa8\x02\xc8\xff\xd7\x02\xa8\x02\xd5\xff\xd7\x02\ +\xa8\x02\xe0\xff\xd7\x02\xa8\x02\xf0\xff\xd7\x02\xa8\x02\xf2\xff\ +\xd7\x02\xa8\x02\xf4\xff\xd7\x02\xa8\x02\xfe\xff\xd7\x02\xa8\x03\ +\x0a\xff\xd7\x02\xa8\x03\x0c\xff\xd7\x02\xa8\x03\x16\xff\xd7\x02\ +\xa8\x03\x1a\xff\xd7\x02\xa9\x01\x9f\xff\xd7\x02\xa9\x01\xb8\xff\ +\xd7\x02\xa9\x01\xbb\xff\xd7\x02\xa9\x01\xbe\xff\xd7\x02\xa9\x01\ +\xc1\xff\xd7\x02\xa9\x01\xe1\xff\xd7\x02\xa9\x02l\xff\xd7\x02\ +\xa9\x02|\xff\xd7\x02\xa9\x02~\xff\xd7\x02\xa9\x02\x84\xff\ +\xd7\x02\xa9\x02\x86\xff\xd7\x02\xa9\x02\x88\xff\xd7\x02\xa9\x02\ +\x8a\xff\xd7\x02\xa9\x02\x8c\xff\xd7\x02\xa9\x02\xb1\xff\xd7\x02\ +\xa9\x02\xb3\xff\xd7\x02\xa9\x02\xbf\xff\xd7\x02\xa9\x02\xc0\xff\ +\xd7\x02\xa9\x02\xc1\xff\xd7\x02\xa9\x02\xc2\xff\xd7\x02\xa9\x02\ +\xc5\xff\x9a\x02\xa9\x02\xc7\xff\x9a\x02\xa9\x02\xd4\xff\xd7\x02\ +\xa9\x02\xd5\xff\xd7\x02\xa9\x02\xef\xff\xd7\x02\xa9\x02\xf1\xff\ +\xd7\x02\xa9\x02\xf3\xff\xd7\x02\xa9\x02\xfd\xff\xd7\x02\xa9\x02\ +\xfe\xff\xd7\x02\xa9\x03\x09\xff\xd7\x02\xa9\x03\x0b\xff\xd7\x02\ +\xa9\x03\x0e\xff\xd7\x02\xa9\x03\x10\xff\xd7\x02\xa9\x03\x15\xff\ +\xd7\x02\xa9\x03\x19\xff\xec\x02\xaa\x01\xcf\xff\xd7\x02\xaa\x01\ +\xd8\xff\xd7\x02\xaa\x01\xdb\xff\xd7\x02\xaa\x01\xde\xff\xd7\x02\ +\xaa\x01\xe1\xff\xd7\x02\xaa\x01\xea\xff\xd7\x02\xaa\x01\xed\xff\ +\xd7\x02\xaa\x02j\xff\xd7\x02\xaa\x02\x7f\xff\xd7\x02\xaa\x02\ +\x85\xff\xd7\x02\xaa\x02\x87\xff\xd7\x02\xaa\x02\x89\xff\xd7\x02\ +\xaa\x02\x8d\xff\xd7\x02\xaa\x02\xb2\xff\xd7\x02\xaa\x02\xb4\xff\ +\xd7\x02\xaa\x02\xc0\xff\xd7\x02\xaa\x02\xc2\xff\xd7\x02\xaa\x02\ +\xc6\xff\xd7\x02\xaa\x02\xc8\xff\xd7\x02\xaa\x02\xd5\xff\xd7\x02\ +\xaa\x02\xe0\xff\xd7\x02\xaa\x02\xf0\xff\xd7\x02\xaa\x02\xf2\xff\ +\xd7\x02\xaa\x02\xf4\xff\xd7\x02\xaa\x02\xfe\xff\xd7\x02\xaa\x03\ +\x0a\xff\xd7\x02\xaa\x03\x0c\xff\xd7\x02\xaa\x03\x16\xff\xd7\x02\ +\xaa\x03\x1a\xff\xd7\x02\xab\x01\xa3\x00\xe1\x02\xab\x02\xea\x00\ +)\x02\xab\x03\x0e\xff\xd7\x02\xab\x03\x10\xff\xd7\x02\xac\x00\ +\x05\xff\xec\x02\xac\x00\x0a\xff\xec\x02\xac\x02\x07\xff\xec\x02\ +\xac\x02\x0b\xff\xec\x02\xad\x00\x0f\xff\x9a\x02\xad\x00\x10\xff\ +\xd7\x02\xad\x00\x11\xff\x9a\x02\xad\x01\x9d\x00)\x02\xad\x01\ +\x9f\xff\xd7\x02\xad\x01\xa4\xff\xae\x02\xad\x01\xa6\x00)\x02\ +\xad\x01\xaa\xff\x85\x02\xad\x01\xae\xff\xae\x02\xad\x01\xb5\xff\ +\xae\x02\xad\x01\xb8\xff\xd7\x02\xad\x01\xbb\xff\xd7\x02\xad\x01\ +\xbc\x00)\x02\xad\x01\xbe\xff\xc3\x02\xad\x01\xc4\x00)\x02\ +\xad\x01\xcc\xff\xc3\x02\xad\x01\xcd\xff\xc3\x02\xad\x01\xce\xff\ +\x9a\x02\xad\x01\xcf\xff\xae\x02\xad\x01\xd0\xff\xd7\x02\xad\x01\ +\xd1\xff\xd7\x02\xad\x01\xd2\xff\xc3\x02\xad\x01\xd3\xff\xc3\x02\ +\xad\x01\xd4\xff\xc3\x02\xad\x01\xd5\xff\x9a\x02\xad\x01\xd6\xff\ +\xc3\x02\xad\x01\xd7\xff\xc3\x02\xad\x01\xd8\xff\xae\x02\xad\x01\ +\xd9\xff\xc3\x02\xad\x01\xda\xff\xc3\x02\xad\x01\xdb\xff\xae\x02\ +\xad\x01\xde\xff\xae\x02\xad\x01\xdf\xff\xd7\x02\xad\x01\xe0\xff\ +\xc3\x02\xad\x01\xe1\xff\x9a\x02\xad\x01\xe2\xff\xc3\x02\xad\x01\ +\xe3\xff\xc3\x02\xad\x01\xe5\xff\xc3\x02\xad\x01\xe6\xff\xc3\x02\ +\xad\x01\xe7\xff\xd7\x02\xad\x01\xe8\xff\xc3\x02\xad\x01\xea\xff\ +\xae\x02\xad\x01\xeb\x00)\x02\xad\x01\xec\xff\xc3\x02\xad\x01\ +\xed\xff\xae\x02\xad\x01\xee\xff\xc3\x02\xad\x01\xf2\xff\x9a\x02\ +\xad\x01\xf3\xff\xc3\x02\xad\x01\xf4\x00)\x02\xad\x01\xf5\xff\ +\xc3\x02\xad\x01\xf7\xff\xc3\x02\xad\x01\xf9\xff\xc3\x02\xad\x02\ +\x02\xff\xd7\x02\xad\x02\x03\xff\xd7\x02\xad\x02\x04\xff\xd7\x02\ +\xad\x02\x08\xff\x9a\x02\xad\x02\x0c\xff\x9a\x02\xad\x02j\xff\ +\xae\x02\xad\x02k\xff\xc3\x02\xad\x02l\xff\xd7\x02\xad\x02\ +q\xff\xc3\x02\xad\x02r\xff\x85\x02\xad\x02s\xff\x9a\x02\ +\xad\x02u\xff\xc3\x02\xad\x02w\xff\xd7\x02\xad\x02y\xff\ +\xc3\x02\xad\x02}\xff\xc3\x02\xad\x02~\xff\xd7\x02\xad\x02\ +\x7f\xff\xae\x02\xad\x02\x84\xff\xd7\x02\xad\x02\x85\xff\xae\x02\ +\xad\x02\x86\xff\xd7\x02\xad\x02\x87\xff\xae\x02\xad\x02\x88\xff\ +\xd7\x02\xad\x02\x89\xff\xae\x02\xad\x02\x8a\xff\xd7\x02\xad\x02\ +\x8c\xff\xd7\x02\xad\x02\x8d\xff\xae\x02\xad\x02\x96\xff\xc3\x02\ +\xad\x02\x98\x00)\x02\xad\x02\x9a\xff\xc3\x02\xad\x02\x9e\xff\ +\xc3\x02\xad\x02\xa0\xff\xd7\x02\xad\x02\xa2\xff\xd7\x02\xad\x02\ +\xa4\xff\xc3\x02\xad\x02\xa6\xff\xc3\x02\xad\x02\xa8\x00)\x02\ +\xad\x02\xa9\x00)\x02\xad\x02\xac\xff\xc3\x02\xad\x02\xae\xff\ +\xc3\x02\xad\x02\xb0\xff\xc3\x02\xad\x02\xb1\xff\xd7\x02\xad\x02\ +\xb2\xff\xae\x02\xad\x02\xb3\xff\xd7\x02\xad\x02\xb4\xff\xae\x02\ +\xad\x02\xb5\x00)\x02\xad\x02\xbc\xff\xd7\x02\xad\x02\xbd\x00\ +)\x02\xad\x02\xc0\xff\x9a\x02\xad\x02\xc2\xff\x9a\x02\xad\x02\ +\xc4\xff\xc3\x02\xad\x02\xc5\xff\xd7\x02\xad\x02\xc6\xff\xc3\x02\ +\xad\x02\xc7\xff\xd7\x02\xad\x02\xc8\xff\xc3\x02\xad\x02\xcb\xff\ +\xd7\x02\xad\x02\xcd\xff\xc3\x02\xad\x02\xce\xff\xae\x02\xad\x02\ +\xcf\xff\x9a\x02\xad\x02\xd1\xff\xc3\x02\xad\x02\xd3\xff\xc3\x02\ +\xad\x02\xd5\xff\x9a\x02\xad\x02\xd7\xff\xc3\x02\xad\x02\xd9\xff\ +\x85\x02\xad\x02\xdb\xff\x85\x02\xad\x02\xdd\xff\x85\x02\xad\x02\ +\xe0\xff\xae\x02\xad\x02\xe6\xff\xd7\x02\xad\x02\xe8\xff\xd7\x02\ +\xad\x02\xec\xff\xc3\x02\xad\x02\xee\xff\xc3\x02\xad\x02\xef\xff\ +\xd7\x02\xad\x02\xf0\xff\xae\x02\xad\x02\xf1\xff\xd7\x02\xad\x02\ +\xf2\xff\xae\x02\xad\x02\xf3\xff\xd7\x02\xad\x02\xf4\xff\xae\x02\ +\xad\x02\xf6\xff\xd7\x02\xad\x02\xfe\xff\x9a\x02\xad\x03\x00\xff\ +\xc3\x02\xad\x03\x02\xff\xc3\x02\xad\x03\x06\xff\xd7\x02\xad\x03\ +\x08\xff\xd7\x02\xad\x03\x09\xff\x9a\x02\xad\x03\x0a\xff\xae\x02\ +\xad\x03\x0b\xff\x9a\x02\xad\x03\x0c\xff\xae\x02\xad\x03\x0e\xff\ +\xd7\x02\xad\x03\x10\xff\xd7\x02\xad\x03\x11\xff\xae\x02\xad\x03\ +\x12\xff\x9a\x02\xad\x03\x14\xff\xc3\x02\xad\x03\x15\xff\xd7\x02\ +\xad\x03\x16\xff\xae\x02\xad\x03\x17\x00)\x02\xad\x03\x1a\xff\ +\xae\x02\xad\x03\x1b\xff\xae\x02\xad\x03\x1c\xff\x9a\x02\xae\x00\ +\x0f\xff\x9a\x02\xae\x00\x10\xff\xd7\x02\xae\x00\x11\xff\x9a\x02\ +\xae\x01\xce\xff\xc3\x02\xae\x01\xcf\xff\xec\x02\xae\x01\xd5\xff\ +\xc3\x02\xae\x01\xd8\xff\xec\x02\xae\x01\xdb\xff\xec\x02\xae\x01\ +\xde\xff\xec\x02\xae\x01\xea\xff\xec\x02\xae\x01\xed\xff\xec\x02\ +\xae\x01\xf2\xff\xc3\x02\xae\x02\x02\xff\xd7\x02\xae\x02\x03\xff\ +\xd7\x02\xae\x02\x04\xff\xd7\x02\xae\x02\x08\xff\x9a\x02\xae\x02\ +\x0c\xff\x9a\x02\xae\x02j\xff\xec\x02\xae\x02s\xff\xc3\x02\ +\xae\x02\x7f\xff\xec\x02\xae\x02\x85\xff\xec\x02\xae\x02\x87\xff\ +\xec\x02\xae\x02\x89\xff\xec\x02\xae\x02\x8d\xff\xec\x02\xae\x02\ +\xb2\xff\xec\x02\xae\x02\xb4\xff\xec\x02\xae\x02\xcf\xff\xc3\x02\ +\xae\x02\xe0\xff\xec\x02\xae\x02\xf0\xff\xec\x02\xae\x02\xf2\xff\ +\xec\x02\xae\x02\xf4\xff\xec\x02\xae\x03\x0a\xff\xec\x02\xae\x03\ +\x0c\xff\xec\x02\xae\x03\x12\xff\xc3\x02\xae\x03\x16\xff\xec\x02\ +\xae\x03\x1a\xff\xec\x02\xae\x03\x1c\xff\xc3\x02\xaf\x00\x05\xff\ +\x5c\x02\xaf\x00\x0a\xff\x5c\x02\xaf\x01\x9d\xff\x9a\x02\xaf\x01\ +\xa3\x00f\x02\xaf\x01\xa6\xff\x9a\x02\xaf\x01\xbc\xffH\x02\ +\xaf\x01\xc1\xff\x85\x02\xaf\x01\xc4\xff\x9a\x02\xaf\x01\xdc\xff\ +\xae\x02\xaf\x01\xe1\xff\xd7\x02\xaf\x01\xe4\xff\xae\x02\xaf\x02\ +\x07\xff\x5c\x02\xaf\x02\x0b\xff\x5c\x02\xaf\x02|\xff\x85\x02\ +\xaf\x02\x80\xffq\x02\xaf\x02\x82\xffq\x02\xaf\x02\xa9\xff\ +\x9a\x02\xaf\x02\xaa\xff\xae\x02\xaf\x02\xb5\xffH\x02\xaf\x02\ +\xb6\xff\xae\x02\xaf\x02\xb7\xff\x9a\x02\xaf\x02\xb9\xff\x9a\x02\ +\xaf\x02\xbd\xff\x9a\x02\xaf\x02\xbe\xff\xae\x02\xaf\x02\xbf\xff\ +\x85\x02\xaf\x02\xc0\xff\xd7\x02\xaf\x02\xc1\xff\x85\x02\xaf\x02\ +\xc2\xff\xd7\x02\xaf\x02\xc5\xff\xc3\x02\xaf\x02\xc6\xff\xd7\x02\ +\xaf\x02\xc7\xff\xc3\x02\xaf\x02\xc8\xff\xd7\x02\xaf\x02\xd4\xff\ +\x85\x02\xaf\x02\xd5\xff\xd7\x02\xaf\x02\xfd\xff\x85\x02\xaf\x02\ +\xfe\xff\xd7\x02\xaf\x03\x0d\xffH\x02\xaf\x03\x0e\xff\xae\x02\ +\xaf\x03\x0f\xffH\x02\xaf\x03\x10\xff\xae\x02\xaf\x03\x17\xff\ +\x9a\x02\xaf\x03\x18\xff\xae\x02\xb0\x00\x05\xffq\x02\xb0\x00\ +\x0a\xffq\x02\xb0\x01\xdc\xff\x9a\x02\xb0\x01\xe1\xff\xd7\x02\ +\xb0\x01\xe4\xff\x9a\x02\xb0\x02\x07\xffq\x02\xb0\x02\x0b\xff\ +q\x02\xb0\x02m\xff\xd7\x02\xb0\x02\x81\xff\xd7\x02\xb0\x02\ +\x83\xff\xd7\x02\xb0\x02\x8b\xff\xd7\x02\xb0\x02\xaa\xff\x9a\x02\ +\xb0\x02\xb6\xff\x9a\x02\xb0\x02\xb8\xff\xd7\x02\xb0\x02\xba\xff\ +\xd7\x02\xb0\x02\xbe\xff\x9a\x02\xb0\x02\xc0\xff\xd7\x02\xb0\x02\ +\xc2\xff\xd7\x02\xb0\x02\xc6\xff\xd7\x02\xb0\x02\xc8\xff\xd7\x02\ +\xb0\x02\xd5\xff\xd7\x02\xb0\x02\xfe\xff\xd7\x02\xb0\x03\x0e\xff\ +q\x02\xb0\x03\x10\xffq\x02\xb0\x03\x18\xff\x9a\x02\xb1\x01\ +\x9d\xff\xd7\x02\xb1\x01\xa6\xff\xd7\x02\xb1\x01\xbc\xff\xc3\x02\ +\xb1\x01\xc4\xff\xd7\x02\xb1\x02\x80\xff\xec\x02\xb1\x02\x82\xff\ +\xec\x02\xb1\x02\xa9\xff\xd7\x02\xb1\x02\xb5\xff\xc3\x02\xb1\x02\ +\xb7\xff\xec\x02\xb1\x02\xb9\xff\xec\x02\xb1\x02\xbd\xff\xd7\x02\ +\xb1\x03\x0d\xff\xd7\x02\xb1\x03\x0f\xff\xd7\x02\xb1\x03\x17\xff\ +\xd7\x02\xb2\x00\x05\xff\xec\x02\xb2\x00\x0a\xff\xec\x02\xb2\x01\ +\xd0\xff\xd7\x02\xb2\x01\xdc\xff\xec\x02\xb2\x01\xdd\xff\xec\x02\ +\xb2\x01\xdf\xff\xd7\x02\xb2\x01\xe1\xff\xec\x02\xb2\x01\xe4\xff\ +\xec\x02\xb2\x01\xf6\xff\xec\x02\xb2\x02\x07\xff\xec\x02\xb2\x02\ +\x0b\xff\xec\x02\xb2\x02\xa0\xff\xd7\x02\xb2\x02\xaa\xff\xec\x02\ +\xb2\x02\xb6\xff\xec\x02\xb2\x02\xbc\xff\xd7\x02\xb2\x02\xbe\xff\ +\xec\x02\xb2\x02\xc0\xff\xec\x02\xb2\x02\xc2\xff\xec\x02\xb2\x02\ +\xcb\xff\xd7\x02\xb2\x02\xd5\xff\xec\x02\xb2\x02\xe6\xff\xd7\x02\ +\xb2\x02\xf8\xff\xec\x02\xb2\x02\xfa\xff\xec\x02\xb2\x02\xfc\xff\ +\xec\x02\xb2\x02\xfe\xff\xec\x02\xb2\x03\x06\xff\xd7\x02\xb2\x03\ +\x08\xff\xd7\x02\xb2\x03\x0e\xff\xec\x02\xb2\x03\x10\xff\xec\x02\ +\xb2\x03\x18\xff\xec\x02\xb3\x01\x9f\xff\xd7\x02\xb3\x01\xb8\xff\ +\xd7\x02\xb3\x01\xbb\xff\xd7\x02\xb3\x01\xbe\xff\xd7\x02\xb3\x01\ +\xe1\xff\xd7\x02\xb3\x02l\xff\xd7\x02\xb3\x02~\xff\xd7\x02\ +\xb3\x02\x84\xff\xd7\x02\xb3\x02\x86\xff\xd7\x02\xb3\x02\x88\xff\ +\xd7\x02\xb3\x02\x8a\xff\xd7\x02\xb3\x02\x8c\xff\xd7\x02\xb3\x02\ +\xb1\xff\xd7\x02\xb3\x02\xb3\xff\xd7\x02\xb3\x02\xc0\xff\xd7\x02\ +\xb3\x02\xc2\xff\xd7\x02\xb3\x02\xc5\xff\xd7\x02\xb3\x02\xc7\xff\ +\xd7\x02\xb3\x02\xd5\xff\xd7\x02\xb3\x02\xef\xff\xd7\x02\xb3\x02\ +\xf1\xff\xd7\x02\xb3\x02\xf3\xff\xd7\x02\xb3\x02\xfe\xff\xd7\x02\ +\xb3\x03\x09\xff\xd7\x02\xb3\x03\x0b\xff\xd7\x02\xb3\x03\x0e\xff\ +\xd7\x02\xb3\x03\x10\xff\xd7\x02\xb3\x03\x15\xff\xd7\x02\xb5\x00\ +\x0f\xff\x85\x02\xb5\x00\x10\xff\xae\x02\xb5\x00\x11\xff\x85\x02\ +\xb5\x01\x9f\xff\xd7\x02\xb5\x01\xa4\xff\x9a\x02\xb5\x01\xaa\xff\ +q\x02\xb5\x01\xae\xff\x9a\x02\xb5\x01\xb5\xff\x9a\x02\xb5\x01\ +\xb8\xff\xd7\x02\xb5\x01\xbb\xff\xd7\x02\xb5\x01\xbc\x00)\x02\ +\xb5\x01\xbe\xff\xae\x02\xb5\x01\xcc\xff\x9a\x02\xb5\x01\xcd\xff\ +\x9a\x02\xb5\x01\xce\xff\x85\x02\xb5\x01\xcf\xffq\x02\xb5\x01\ +\xd0\xff\xd7\x02\xb5\x01\xd1\xff\xd7\x02\xb5\x01\xd2\xff\x9a\x02\ +\xb5\x01\xd3\xff\x9a\x02\xb5\x01\xd4\xff\x9a\x02\xb5\x01\xd5\xff\ +\x85\x02\xb5\x01\xd6\xff\x9a\x02\xb5\x01\xd7\xff\x9a\x02\xb5\x01\ +\xd8\xffq\x02\xb5\x01\xd9\xff\x9a\x02\xb5\x01\xda\xff\x9a\x02\ +\xb5\x01\xdb\xffq\x02\xb5\x01\xdc\xff\xae\x02\xb5\x01\xdd\xff\ +\xae\x02\xb5\x01\xde\xffq\x02\xb5\x01\xdf\xff\xd7\x02\xb5\x01\ +\xe0\xff\x9a\x02\xb5\x01\xe1\xff\x9a\x02\xb5\x01\xe2\xff\x9a\x02\ +\xb5\x01\xe3\xff\x9a\x02\xb5\x01\xe4\xff\xae\x02\xb5\x01\xe5\xff\ +\x9a\x02\xb5\x01\xe6\xff\x9a\x02\xb5\x01\xe7\xff\xd7\x02\xb5\x01\ +\xe8\xff\x9a\x02\xb5\x01\xe9\xff\xc3\x02\xb5\x01\xea\xffq\x02\ +\xb5\x01\xec\xff\x9a\x02\xb5\x01\xed\xffq\x02\xb5\x01\xee\xff\ +\x85\x02\xb5\x01\xf2\xff\x85\x02\xb5\x01\xf3\xff\x9a\x02\xb5\x01\ +\xf5\xff\x9a\x02\xb5\x01\xf6\xff\xae\x02\xb5\x01\xf7\xff\x9a\x02\ +\xb5\x01\xf9\xff\x9a\x02\xb5\x02\x02\xff\xae\x02\xb5\x02\x03\xff\ +\xae\x02\xb5\x02\x04\xff\xae\x02\xb5\x02\x08\xff\x85\x02\xb5\x02\ +\x0c\xff\x85\x02\xb5\x02j\xffq\x02\xb5\x02k\xff\x9a\x02\ +\xb5\x02l\xff\xd7\x02\xb5\x02m\xff\xd7\x02\xb5\x02q\xff\ +\x9a\x02\xb5\x02r\xffq\x02\xb5\x02s\xff\x85\x02\xb5\x02\ +u\xff\x9a\x02\xb5\x02w\xff\x9a\x02\xb5\x02y\xff\x9a\x02\ +\xb5\x02}\xff\x9a\x02\xb5\x02~\xff\xd7\x02\xb5\x02\x7f\xff\ +q\x02\xb5\x02\x81\xff\xd7\x02\xb5\x02\x83\xff\xd7\x02\xb5\x02\ +\x84\xff\xd7\x02\xb5\x02\x85\xffq\x02\xb5\x02\x86\xff\xd7\x02\ +\xb5\x02\x87\xffq\x02\xb5\x02\x88\xff\xd7\x02\xb5\x02\x89\xff\ +q\x02\xb5\x02\x8a\xff\xd7\x02\xb5\x02\x8b\xff\xd7\x02\xb5\x02\ +\x8c\xff\xd7\x02\xb5\x02\x8d\xffq\x02\xb5\x02\x96\xff\x9a\x02\ +\xb5\x02\x9a\xff\x9a\x02\xb5\x02\x9e\xff\x9a\x02\xb5\x02\xa0\xff\ +\xd7\x02\xb5\x02\xa2\xff\xd7\x02\xb5\x02\xa4\xff\x9a\x02\xb5\x02\ +\xa6\xff\x9a\x02\xb5\x02\xaa\xff\xae\x02\xb5\x02\xac\xff\x9a\x02\ +\xb5\x02\xae\xff\x9a\x02\xb5\x02\xb0\xff\x9a\x02\xb5\x02\xb1\xff\ +\xd7\x02\xb5\x02\xb2\xffq\x02\xb5\x02\xb3\xff\xd7\x02\xb5\x02\ +\xb4\xffq\x02\xb5\x02\xb5\x00)\x02\xb5\x02\xb6\xff\xae\x02\ +\xb5\x02\xb8\xff\xae\x02\xb5\x02\xba\xff\xae\x02\xb5\x02\xbc\xff\ +\xd7\x02\xb5\x02\xbe\xff\xae\x02\xb5\x02\xc0\xff\x9a\x02\xb5\x02\ +\xc2\xff\x9a\x02\xb5\x02\xc4\xff\x9a\x02\xb5\x02\xc5\xff\x9a\x02\ +\xb5\x02\xc6\xffq\x02\xb5\x02\xc7\xff\x9a\x02\xb5\x02\xc8\xff\ +q\x02\xb5\x02\xcb\xff\xd7\x02\xb5\x02\xcd\xff\x9a\x02\xb5\x02\ +\xce\xff\x9a\x02\xb5\x02\xcf\xff\x85\x02\xb5\x02\xd1\xff\x9a\x02\ +\xb5\x02\xd3\xff\x9a\x02\xb5\x02\xd5\xff\x9a\x02\xb5\x02\xd7\xff\ +\x9a\x02\xb5\x02\xd9\xffq\x02\xb5\x02\xdb\xffq\x02\xb5\x02\ +\xdd\xffq\x02\xb5\x02\xe0\xffq\x02\xb5\x02\xe6\xff\xd7\x02\ +\xb5\x02\xe8\xff\xd7\x02\xb5\x02\xea\xff\xc3\x02\xb5\x02\xec\xff\ +\x9a\x02\xb5\x02\xee\xff\x9a\x02\xb5\x02\xef\xff\xd7\x02\xb5\x02\ +\xf0\xffq\x02\xb5\x02\xf1\xff\xd7\x02\xb5\x02\xf2\xffq\x02\ +\xb5\x02\xf3\xff\xd7\x02\xb5\x02\xf4\xffq\x02\xb5\x02\xf6\xff\ +\xd7\x02\xb5\x02\xf8\xff\xae\x02\xb5\x02\xfa\xff\xae\x02\xb5\x02\ +\xfc\xff\xae\x02\xb5\x02\xfe\xff\x9a\x02\xb5\x03\x00\xff\x9a\x02\ +\xb5\x03\x02\xff\x9a\x02\xb5\x03\x06\xff\xd7\x02\xb5\x03\x08\xff\ +\xd7\x02\xb5\x03\x09\xffq\x02\xb5\x03\x0a\xffq\x02\xb5\x03\ +\x0b\xffq\x02\xb5\x03\x0c\xffq\x02\xb5\x03\x0e\xff\x9a\x02\ +\xb5\x03\x10\xff\x9a\x02\xb5\x03\x11\xff\x9a\x02\xb5\x03\x12\xff\ +\x85\x02\xb5\x03\x14\xff\x9a\x02\xb5\x03\x15\xff\xd7\x02\xb5\x03\ +\x16\xffq\x02\xb5\x03\x18\xff\xae\x02\xb5\x03\x1a\xffq\x02\ +\xb5\x03\x1b\xff\x9a\x02\xb5\x03\x1c\xff\x85\x02\xb6\x00\x0f\xff\ +\x9a\x02\xb6\x00\x10\xff\xd7\x02\xb6\x00\x11\xff\x9a\x02\xb6\x01\ +\xce\xff\xc3\x02\xb6\x01\xcf\xff\xec\x02\xb6\x01\xd5\xff\xc3\x02\ +\xb6\x01\xd8\xff\xec\x02\xb6\x01\xdb\xff\xec\x02\xb6\x01\xde\xff\ +\xec\x02\xb6\x01\xea\xff\xec\x02\xb6\x01\xed\xff\xec\x02\xb6\x01\ +\xf2\xff\xc3\x02\xb6\x02\x02\xff\xd7\x02\xb6\x02\x03\xff\xd7\x02\ +\xb6\x02\x04\xff\xd7\x02\xb6\x02\x08\xff\x9a\x02\xb6\x02\x0c\xff\ +\x9a\x02\xb6\x02j\xff\xec\x02\xb6\x02s\xff\xc3\x02\xb6\x02\ +\x7f\xff\xec\x02\xb6\x02\x85\xff\xec\x02\xb6\x02\x87\xff\xec\x02\ +\xb6\x02\x89\xff\xec\x02\xb6\x02\x8d\xff\xec\x02\xb6\x02\xb2\xff\ +\xec\x02\xb6\x02\xb4\xff\xec\x02\xb6\x02\xcf\xff\xc3\x02\xb6\x02\ +\xe0\xff\xec\x02\xb6\x02\xf0\xff\xec\x02\xb6\x02\xf2\xff\xec\x02\ +\xb6\x02\xf4\xff\xec\x02\xb6\x03\x0a\xff\xec\x02\xb6\x03\x0c\xff\ +\xec\x02\xb6\x03\x12\xff\xc3\x02\xb6\x03\x16\xff\xec\x02\xb6\x03\ +\x1a\xff\xec\x02\xb6\x03\x1c\xff\xc3\x02\xb7\x00\x0f\xff\x85\x02\ +\xb7\x00\x11\xff\x85\x02\xb7\x01\x9f\xff\xd7\x02\xb7\x01\xa4\xff\ +\xae\x02\xb7\x01\xaa\xff\x85\x02\xb7\x01\xae\xff\xae\x02\xb7\x01\ +\xb5\xff\xae\x02\xb7\x01\xb8\xff\xd7\x02\xb7\x01\xbb\xff\xd7\x02\ +\xb7\x01\xbe\xff\xc3\x02\xb7\x01\xca\xff\xae\x02\xb7\x01\xcc\xff\ +\xc3\x02\xb7\x01\xcd\xff\xc3\x02\xb7\x01\xce\xff\x9a\x02\xb7\x01\ +\xcf\xff\x9a\x02\xb7\x01\xd2\xff\xc3\x02\xb7\x01\xd3\xff\xc3\x02\ +\xb7\x01\xd4\xff\xc3\x02\xb7\x01\xd5\xff\x9a\x02\xb7\x01\xd6\xff\ +\xc3\x02\xb7\x01\xd7\xff\xc3\x02\xb7\x01\xd8\xff\x9a\x02\xb7\x01\ +\xd9\xff\xc3\x02\xb7\x01\xda\xff\xc3\x02\xb7\x01\xdb\xff\x9a\x02\ +\xb7\x01\xde\xff\x9a\x02\xb7\x01\xe0\xff\xc3\x02\xb7\x01\xe1\xff\ +\xae\x02\xb7\x01\xe2\xff\xc3\x02\xb7\x01\xe3\xff\xc3\x02\xb7\x01\ +\xe5\xff\xc3\x02\xb7\x01\xe6\xff\xc3\x02\xb7\x01\xe8\xff\xc3\x02\ +\xb7\x01\xe9\xff\xd7\x02\xb7\x01\xea\xff\x9a\x02\xb7\x01\xeb\x00\ +)\x02\xb7\x01\xec\xff\xc3\x02\xb7\x01\xed\xff\x9a\x02\xb7\x01\ +\xee\xff\xae\x02\xb7\x01\xf2\xff\x9a\x02\xb7\x01\xf3\xff\xc3\x02\ +\xb7\x01\xf4\x00)\x02\xb7\x01\xf5\xff\xc3\x02\xb7\x01\xf7\xff\ +\xc3\x02\xb7\x01\xf9\xff\xc3\x02\xb7\x02\x08\xff\x85\x02\xb7\x02\ +\x0c\xff\x85\x02\xb7\x02j\xff\x9a\x02\xb7\x02k\xff\xc3\x02\ +\xb7\x02l\xff\xd7\x02\xb7\x02q\xff\xc3\x02\xb7\x02r\xff\ +\x85\x02\xb7\x02s\xff\x9a\x02\xb7\x02u\xff\xc3\x02\xb7\x02\ +w\xff\xd7\x02\xb7\x02y\xff\xc3\x02\xb7\x02}\xff\xd7\x02\ +\xb7\x02~\xff\xd7\x02\xb7\x02\x7f\xff\x9a\x02\xb7\x02\x84\xff\ +\xd7\x02\xb7\x02\x85\xff\x9a\x02\xb7\x02\x86\xff\xd7\x02\xb7\x02\ +\x87\xff\x9a\x02\xb7\x02\x88\xff\xd7\x02\xb7\x02\x89\xff\x9a\x02\ +\xb7\x02\x8a\xff\xd7\x02\xb7\x02\x8c\xff\xd7\x02\xb7\x02\x8d\xff\ +\x9a\x02\xb7\x02\x96\xff\xc3\x02\xb7\x02\x98\x00)\x02\xb7\x02\ +\x9a\xff\xc3\x02\xb7\x02\x9e\xff\xc3\x02\xb7\x02\xa4\xff\xc3\x02\ +\xb7\x02\xa6\xff\xc3\x02\xb7\x02\xa8\x00)\x02\xb7\x02\xac\xff\ +\xc3\x02\xb7\x02\xae\xff\xc3\x02\xb7\x02\xb0\xff\xc3\x02\xb7\x02\ +\xb1\xff\xd7\x02\xb7\x02\xb2\xff\x9a\x02\xb7\x02\xb3\xff\xd7\x02\ +\xb7\x02\xb4\xff\x9a\x02\xb7\x02\xc0\xff\xae\x02\xb7\x02\xc2\xff\ +\xae\x02\xb7\x02\xc4\xff\xc3\x02\xb7\x02\xc6\xff\xae\x02\xb7\x02\ +\xc8\xff\xae\x02\xb7\x02\xcd\xff\xc3\x02\xb7\x02\xce\xff\xae\x02\ +\xb7\x02\xcf\xff\x9a\x02\xb7\x02\xd1\xff\xc3\x02\xb7\x02\xd3\xff\ +\xc3\x02\xb7\x02\xd5\xff\xae\x02\xb7\x02\xd7\xff\xc3\x02\xb7\x02\ +\xd9\xff\x85\x02\xb7\x02\xda\xff\xae\x02\xb7\x02\xdb\xff\x85\x02\ +\xb7\x02\xdc\xff\xae\x02\xb7\x02\xdd\xff\x85\x02\xb7\x02\xde\xff\ +\xae\x02\xb7\x02\xe0\xff\x9a\x02\xb7\x02\xe1\xff\xec\x02\xb7\x02\ +\xe2\xff\xae\x02\xb7\x02\xe3\xff\xec\x02\xb7\x02\xe4\xff\xae\x02\ +\xb7\x02\xec\xff\xc3\x02\xb7\x02\xee\xff\xc3\x02\xb7\x02\xef\xff\ +\xd7\x02\xb7\x02\xf0\xff\x9a\x02\xb7\x02\xf1\xff\xd7\x02\xb7\x02\ +\xf2\xff\x9a\x02\xb7\x02\xf3\xff\xd7\x02\xb7\x02\xf4\xff\x9a\x02\ +\xb7\x02\xfe\xff\xae\x02\xb7\x03\x00\xff\xc3\x02\xb7\x03\x02\xff\ +\xc3\x02\xb7\x03\x09\xff\xae\x02\xb7\x03\x0a\xff\x9a\x02\xb7\x03\ +\x0b\xff\xae\x02\xb7\x03\x0c\xff\x9a\x02\xb7\x03\x0e\xff\xd7\x02\ +\xb7\x03\x10\xff\xd7\x02\xb7\x03\x11\xff\xae\x02\xb7\x03\x12\xff\ +\x9a\x02\xb7\x03\x14\xff\xc3\x02\xb7\x03\x15\xff\xd7\x02\xb7\x03\ +\x16\xff\x9a\x02\xb7\x03\x19\xff\xec\x02\xb7\x03\x1a\xff\x9a\x02\ +\xb7\x03\x1b\xff\xae\x02\xb7\x03\x1c\xff\x9a\x02\xb8\x00\x0f\xff\ +\xae\x02\xb8\x00\x11\xff\xae\x02\xb8\x01\xce\xff\xec\x02\xb8\x01\ +\xd5\xff\xec\x02\xb8\x01\xf2\xff\xec\x02\xb8\x02\x08\xff\xae\x02\ +\xb8\x02\x0c\xff\xae\x02\xb8\x02s\xff\xec\x02\xb8\x02\xcf\xff\ +\xec\x02\xb8\x03\x12\xff\xec\x02\xb8\x03\x1c\xff\xec\x02\xb9\x00\ +\x0f\xff\x85\x02\xb9\x00\x11\xff\x85\x02\xb9\x01\x9f\xff\xd7\x02\ +\xb9\x01\xa4\xff\xae\x02\xb9\x01\xaa\xff\x85\x02\xb9\x01\xae\xff\ +\xae\x02\xb9\x01\xb5\xff\xae\x02\xb9\x01\xb8\xff\xd7\x02\xb9\x01\ +\xbb\xff\xd7\x02\xb9\x01\xbe\xff\xc3\x02\xb9\x01\xca\xff\xae\x02\ +\xb9\x01\xcc\xff\xc3\x02\xb9\x01\xcd\xff\xc3\x02\xb9\x01\xce\xff\ +\x9a\x02\xb9\x01\xcf\xff\x9a\x02\xb9\x01\xd2\xff\xc3\x02\xb9\x01\ +\xd3\xff\xc3\x02\xb9\x01\xd4\xff\xc3\x02\xb9\x01\xd5\xff\x9a\x02\ +\xb9\x01\xd6\xff\xc3\x02\xb9\x01\xd7\xff\xc3\x02\xb9\x01\xd8\xff\ +\x9a\x02\xb9\x01\xd9\xff\xc3\x02\xb9\x01\xda\xff\xc3\x02\xb9\x01\ +\xdb\xff\x9a\x02\xb9\x01\xde\xff\x9a\x02\xb9\x01\xe0\xff\xc3\x02\ +\xb9\x01\xe1\xff\xae\x02\xb9\x01\xe2\xff\xc3\x02\xb9\x01\xe3\xff\ +\xc3\x02\xb9\x01\xe5\xff\xc3\x02\xb9\x01\xe6\xff\xc3\x02\xb9\x01\ +\xe8\xff\xc3\x02\xb9\x01\xe9\xff\xd7\x02\xb9\x01\xea\xff\x9a\x02\ +\xb9\x01\xeb\x00)\x02\xb9\x01\xec\xff\xc3\x02\xb9\x01\xed\xff\ +\x9a\x02\xb9\x01\xee\xff\xae\x02\xb9\x01\xf2\xff\x9a\x02\xb9\x01\ +\xf3\xff\xc3\x02\xb9\x01\xf4\x00)\x02\xb9\x01\xf5\xff\xc3\x02\ +\xb9\x01\xf7\xff\xc3\x02\xb9\x01\xf9\xff\xc3\x02\xb9\x02\x08\xff\ +\x85\x02\xb9\x02\x0c\xff\x85\x02\xb9\x02j\xff\x9a\x02\xb9\x02\ +k\xff\xc3\x02\xb9\x02l\xff\xd7\x02\xb9\x02q\xff\xc3\x02\ +\xb9\x02r\xff\x85\x02\xb9\x02s\xff\x9a\x02\xb9\x02u\xff\ +\xc3\x02\xb9\x02w\xff\xd7\x02\xb9\x02y\xff\xc3\x02\xb9\x02\ +}\xff\xd7\x02\xb9\x02~\xff\xd7\x02\xb9\x02\x7f\xff\x9a\x02\ +\xb9\x02\x84\xff\xd7\x02\xb9\x02\x85\xff\x9a\x02\xb9\x02\x86\xff\ +\xd7\x02\xb9\x02\x87\xff\x9a\x02\xb9\x02\x88\xff\xd7\x02\xb9\x02\ +\x89\xff\x9a\x02\xb9\x02\x8a\xff\xd7\x02\xb9\x02\x8c\xff\xd7\x02\ +\xb9\x02\x8d\xff\x9a\x02\xb9\x02\x96\xff\xc3\x02\xb9\x02\x98\x00\ +)\x02\xb9\x02\x9a\xff\xc3\x02\xb9\x02\x9e\xff\xc3\x02\xb9\x02\ +\xa4\xff\xc3\x02\xb9\x02\xa6\xff\xc3\x02\xb9\x02\xa8\x00)\x02\ +\xb9\x02\xac\xff\xc3\x02\xb9\x02\xae\xff\xc3\x02\xb9\x02\xb0\xff\ +\xc3\x02\xb9\x02\xb1\xff\xd7\x02\xb9\x02\xb2\xff\x9a\x02\xb9\x02\ +\xb3\xff\xd7\x02\xb9\x02\xb4\xff\x9a\x02\xb9\x02\xc0\xff\xae\x02\ +\xb9\x02\xc2\xff\xae\x02\xb9\x02\xc4\xff\xc3\x02\xb9\x02\xc6\xff\ +\xae\x02\xb9\x02\xc8\xff\xae\x02\xb9\x02\xcd\xff\xc3\x02\xb9\x02\ +\xce\xff\xae\x02\xb9\x02\xcf\xff\x9a\x02\xb9\x02\xd1\xff\xc3\x02\ +\xb9\x02\xd3\xff\xc3\x02\xb9\x02\xd5\xff\xae\x02\xb9\x02\xd7\xff\ +\xc3\x02\xb9\x02\xd9\xff\x85\x02\xb9\x02\xda\xff\xae\x02\xb9\x02\ +\xdb\xff\x85\x02\xb9\x02\xdc\xff\xae\x02\xb9\x02\xdd\xff\x85\x02\ +\xb9\x02\xde\xff\xae\x02\xb9\x02\xe0\xff\x9a\x02\xb9\x02\xe1\xff\ +\xec\x02\xb9\x02\xe2\xff\xae\x02\xb9\x02\xe3\xff\xec\x02\xb9\x02\ +\xe4\xff\xae\x02\xb9\x02\xec\xff\xc3\x02\xb9\x02\xee\xff\xc3\x02\ +\xb9\x02\xef\xff\xd7\x02\xb9\x02\xf0\xff\x9a\x02\xb9\x02\xf1\xff\ +\xd7\x02\xb9\x02\xf2\xff\x9a\x02\xb9\x02\xf3\xff\xd7\x02\xb9\x02\ +\xf4\xff\x9a\x02\xb9\x02\xfe\xff\xae\x02\xb9\x03\x00\xff\xc3\x02\ +\xb9\x03\x02\xff\xc3\x02\xb9\x03\x09\xff\xae\x02\xb9\x03\x0a\xff\ +\x9a\x02\xb9\x03\x0b\xff\xae\x02\xb9\x03\x0c\xff\x9a\x02\xb9\x03\ +\x0e\xff\xd7\x02\xb9\x03\x10\xff\xd7\x02\xb9\x03\x11\xff\xae\x02\ +\xb9\x03\x12\xff\x9a\x02\xb9\x03\x14\xff\xc3\x02\xb9\x03\x15\xff\ +\xd7\x02\xb9\x03\x16\xff\x9a\x02\xb9\x03\x19\xff\xec\x02\xb9\x03\ +\x1a\xff\x9a\x02\xb9\x03\x1b\xff\xae\x02\xb9\x03\x1c\xff\x9a\x02\ +\xba\x00\x0f\xff\xae\x02\xba\x00\x11\xff\xae\x02\xba\x01\xce\xff\ +\xec\x02\xba\x01\xd5\xff\xec\x02\xba\x01\xf2\xff\xec\x02\xba\x02\ +\x08\xff\xae\x02\xba\x02\x0c\xff\xae\x02\xba\x02s\xff\xec\x02\ +\xba\x02\xcf\xff\xec\x02\xba\x03\x12\xff\xec\x02\xba\x03\x1c\xff\ +\xec\x02\xbb\x01\x9f\xff\xd7\x02\xbb\x01\xa3\x00\xe1\x02\xbb\x01\ +\xb8\xff\xd7\x02\xbb\x01\xbb\xff\xd7\x02\xbb\x01\xbe\xff\xc3\x02\ +\xbb\x01\xdc\xff\xd7\x02\xbb\x01\xe1\xff\xae\x02\xbb\x01\xe4\xff\ +\xd7\x02\xbb\x02l\xff\xd7\x02\xbb\x02{\x00=\x02\xbb\x02\ +}\xff\xec\x02\xbb\x02~\xff\xd7\x02\xbb\x02\x84\xff\xd7\x02\ +\xbb\x02\x86\xff\xd7\x02\xbb\x02\x88\xff\xd7\x02\xbb\x02\x8a\xff\ +\xd7\x02\xbb\x02\x8c\xff\xd7\x02\xbb\x02\xaa\xff\xd7\x02\xbb\x02\ +\xb1\xff\xd7\x02\xbb\x02\xb3\xff\xd7\x02\xbb\x02\xb6\xff\xd7\x02\ +\xbb\x02\xbe\xff\xd7\x02\xbb\x02\xc0\xff\xae\x02\xbb\x02\xc2\xff\ +\xae\x02\xbb\x02\xc5\xff\xc3\x02\xbb\x02\xc6\xff\xd7\x02\xbb\x02\ +\xc7\xff\xc3\x02\xbb\x02\xc8\xff\xd7\x02\xbb\x02\xd5\xff\xae\x02\ +\xbb\x02\xef\xff\xd7\x02\xbb\x02\xf1\xff\xd7\x02\xbb\x02\xf3\xff\ +\xd7\x02\xbb\x02\xfe\xff\xae\x02\xbb\x03\x0e\xff\xd7\x02\xbb\x03\ +\x10\xff\xd7\x02\xbb\x03\x15\xff\xd7\x02\xbb\x03\x18\xff\xd7\x02\ +\xbc\x01\xcf\xff\xec\x02\xbc\x01\xd8\xff\xec\x02\xbc\x01\xdb\xff\ +\xec\x02\xbc\x01\xde\xff\xec\x02\xbc\x01\xe1\xff\xec\x02\xbc\x01\ +\xea\xff\xec\x02\xbc\x01\xed\xff\xec\x02\xbc\x02j\xff\xec\x02\ +\xbc\x02\x7f\xff\xec\x02\xbc\x02\x85\xff\xec\x02\xbc\x02\x87\xff\ +\xec\x02\xbc\x02\x89\xff\xec\x02\xbc\x02\x8d\xff\xec\x02\xbc\x02\ +\xb2\xff\xec\x02\xbc\x02\xb4\xff\xec\x02\xbc\x02\xc0\xff\xec\x02\ +\xbc\x02\xc2\xff\xec\x02\xbc\x02\xd5\xff\xec\x02\xbc\x02\xe0\xff\ +\xec\x02\xbc\x02\xf0\xff\xec\x02\xbc\x02\xf2\xff\xec\x02\xbc\x02\ +\xf4\xff\xec\x02\xbc\x02\xfe\xff\xec\x02\xbc\x03\x0a\xff\xec\x02\ +\xbc\x03\x0c\xff\xec\x02\xbc\x03\x0e\xff\xd7\x02\xbc\x03\x10\xff\ +\xd7\x02\xbc\x03\x16\xff\xec\x02\xbc\x03\x1a\xff\xec\x02\xbd\x01\ +\xa3\x00\xe1\x02\xbd\x02\xea\x00)\x02\xbd\x03\x0e\xff\xd7\x02\ +\xbd\x03\x10\xff\xd7\x02\xbe\x00\x05\xff\xec\x02\xbe\x00\x0a\xff\ +\xec\x02\xbe\x02\x07\xff\xec\x02\xbe\x02\x0b\xff\xec\x02\xbf\x01\ +\xa3\x00\xe1\x02\xbf\x02\xea\x00)\x02\xbf\x03\x0e\xff\xd7\x02\ +\xbf\x03\x10\xff\xd7\x02\xc0\x00\x05\xff\xec\x02\xc0\x00\x0a\xff\ +\xec\x02\xc0\x02\x07\xff\xec\x02\xc0\x02\x0b\xff\xec\x02\xc3\x00\ +\x05\xff\xc3\x02\xc3\x00\x0a\xff\xc3\x02\xc3\x01\x9d\xff\xd7\x02\ +\xc3\x01\xa6\xff\xd7\x02\xc3\x01\xbc\xff\x85\x02\xc3\x01\xc1\xff\ +\xae\x02\xc3\x01\xc4\xff\xd7\x02\xc3\x01\xdc\xff\xd7\x02\xc3\x01\ +\xdd\xff\xec\x02\xc3\x01\xe1\xff\xec\x02\xc3\x01\xe4\xff\xd7\x02\ +\xc3\x01\xf6\xff\xec\x02\xc3\x02\x07\xff\xc3\x02\xc3\x02\x0b\xff\ +\xc3\x02\xc3\x02|\xff\xae\x02\xc3\x02\x80\xff\xc3\x02\xc3\x02\ +\x82\xff\xc3\x02\xc3\x02\xa9\xff\xd7\x02\xc3\x02\xaa\xff\xd7\x02\ +\xc3\x02\xb5\xff\x85\x02\xc3\x02\xb6\xff\xd7\x02\xc3\x02\xb7\xff\ +\x9a\x02\xc3\x02\xb9\xff\x9a\x02\xc3\x02\xbd\xff\xd7\x02\xc3\x02\ +\xbe\xff\xd7\x02\xc3\x02\xbf\xff\xae\x02\xc3\x02\xc0\xff\xec\x02\ +\xc3\x02\xc1\xff\xae\x02\xc3\x02\xc2\xff\xec\x02\xc3\x02\xd4\xff\ +\xae\x02\xc3\x02\xd5\xff\xec\x02\xc3\x02\xf8\xff\xec\x02\xc3\x02\ +\xfa\xff\xec\x02\xc3\x02\xfc\xff\xec\x02\xc3\x02\xfd\xff\xae\x02\ +\xc3\x02\xfe\xff\xec\x02\xc3\x03\x0d\xff\xae\x02\xc3\x03\x0e\xff\ +\xd7\x02\xc3\x03\x0f\xff\xae\x02\xc3\x03\x10\xff\xd7\x02\xc3\x03\ +\x17\xff\xd7\x02\xc3\x03\x18\xff\xd7\x02\xc4\x00\x05\xff\x9a\x02\ +\xc4\x00\x0a\xff\x9a\x02\xc4\x01\xdc\xff\xd7\x02\xc4\x01\xdd\xff\ +\xd7\x02\xc4\x01\xe4\xff\xd7\x02\xc4\x01\xf6\xff\xd7\x02\xc4\x02\ +\x07\xff\x9a\x02\xc4\x02\x0b\xff\x9a\x02\xc4\x02\xaa\xff\xd7\x02\ +\xc4\x02\xb6\xff\xd7\x02\xc4\x02\xb8\xff\xd7\x02\xc4\x02\xba\xff\ +\xd7\x02\xc4\x02\xbe\xff\xd7\x02\xc4\x02\xf8\xff\xd7\x02\xc4\x02\ +\xfa\xff\xd7\x02\xc4\x02\xfc\xff\xd7\x02\xc4\x03\x0e\xff\xae\x02\ +\xc4\x03\x10\xff\xae\x02\xc4\x03\x18\xff\xd7\x02\xc5\x01\xbc\xff\ +\xd7\x02\xc5\x02\x80\xff\xec\x02\xc5\x02\x82\xff\xec\x02\xc5\x02\ +\xb5\xff\xd7\x02\xc5\x02\xb7\xff\xec\x02\xc5\x02\xb9\xff\xec\x02\ +\xc5\x03\x0d\xff\xec\x02\xc5\x03\x0f\xff\xec\x02\xc6\x00\x05\xff\ +\xec\x02\xc6\x00\x0a\xff\xec\x02\xc6\x02\x07\xff\xec\x02\xc6\x02\ +\x0b\xff\xec\x02\xc7\x01\xbc\xff\xd7\x02\xc7\x02\x80\xff\xec\x02\ +\xc7\x02\x82\xff\xec\x02\xc7\x02\xb5\xff\xd7\x02\xc7\x02\xb7\xff\ +\xec\x02\xc7\x02\xb9\xff\xec\x02\xc7\x03\x0d\xff\xec\x02\xc7\x03\ +\x0f\xff\xec\x02\xc8\x00\x05\xff\xec\x02\xc8\x00\x0a\xff\xec\x02\ +\xc8\x02\x07\xff\xec\x02\xc8\x02\x0b\xff\xec\x02\xca\x01\x9f\xff\ +\xd7\x02\xca\x01\xb8\xff\xd7\x02\xca\x01\xbb\xff\xd7\x02\xca\x01\ +\xbe\xff\xd7\x02\xca\x01\xc1\xff\xd7\x02\xca\x01\xe1\xff\xd7\x02\ +\xca\x02l\xff\xd7\x02\xca\x02|\xff\xd7\x02\xca\x02~\xff\ +\xd7\x02\xca\x02\x84\xff\xd7\x02\xca\x02\x86\xff\xd7\x02\xca\x02\ +\x88\xff\xd7\x02\xca\x02\x8a\xff\xd7\x02\xca\x02\x8c\xff\xd7\x02\ +\xca\x02\xb1\xff\xd7\x02\xca\x02\xb3\xff\xd7\x02\xca\x02\xbf\xff\ +\xd7\x02\xca\x02\xc0\xff\xd7\x02\xca\x02\xc1\xff\xd7\x02\xca\x02\ +\xc2\xff\xd7\x02\xca\x02\xc5\xff\x9a\x02\xca\x02\xc7\xff\x9a\x02\ +\xca\x02\xd4\xff\xd7\x02\xca\x02\xd5\xff\xd7\x02\xca\x02\xef\xff\ +\xd7\x02\xca\x02\xf1\xff\xd7\x02\xca\x02\xf3\xff\xd7\x02\xca\x02\ +\xfd\xff\xd7\x02\xca\x02\xfe\xff\xd7\x02\xca\x03\x09\xff\xd7\x02\ +\xca\x03\x0b\xff\xd7\x02\xca\x03\x0e\xff\xd7\x02\xca\x03\x10\xff\ +\xd7\x02\xca\x03\x15\xff\xd7\x02\xca\x03\x19\xff\xec\x02\xcb\x01\ +\xcf\xff\xd7\x02\xcb\x01\xd8\xff\xd7\x02\xcb\x01\xdb\xff\xd7\x02\ +\xcb\x01\xde\xff\xd7\x02\xcb\x01\xe1\xff\xd7\x02\xcb\x01\xea\xff\ +\xd7\x02\xcb\x01\xed\xff\xd7\x02\xcb\x02j\xff\xd7\x02\xcb\x02\ +\x7f\xff\xd7\x02\xcb\x02\x85\xff\xd7\x02\xcb\x02\x87\xff\xd7\x02\ +\xcb\x02\x89\xff\xd7\x02\xcb\x02\x8d\xff\xd7\x02\xcb\x02\xb2\xff\ +\xd7\x02\xcb\x02\xb4\xff\xd7\x02\xcb\x02\xc0\xff\xd7\x02\xcb\x02\ +\xc2\xff\xd7\x02\xcb\x02\xc6\xff\xd7\x02\xcb\x02\xc8\xff\xd7\x02\ +\xcb\x02\xd5\xff\xd7\x02\xcb\x02\xe0\xff\xd7\x02\xcb\x02\xf0\xff\ +\xd7\x02\xcb\x02\xf2\xff\xd7\x02\xcb\x02\xf4\xff\xd7\x02\xcb\x02\ +\xfe\xff\xd7\x02\xcb\x03\x0a\xff\xd7\x02\xcb\x03\x0c\xff\xd7\x02\ +\xcb\x03\x16\xff\xd7\x02\xcb\x03\x1a\xff\xd7\x02\xcc\x00\x05\xff\ +\xc3\x02\xcc\x00\x0a\xff\xc3\x02\xcc\x01\xa3\x00f\x02\xcc\x01\ +\xbc\xff\xd7\x02\xcc\x01\xbe\xff\xd7\x02\xcc\x01\xc1\xff\xae\x02\ +\xcc\x01\xdc\xff\xc3\x02\xcc\x01\xe1\xff\xd7\x02\xcc\x01\xe4\xff\ +\xc3\x02\xcc\x02\x07\xff\xc3\x02\xcc\x02\x0b\xff\xc3\x02\xcc\x02\ +m\xff\xec\x02\xcc\x02|\xff\xae\x02\xcc\x02\x80\xff\xd7\x02\ +\xcc\x02\x81\xff\xec\x02\xcc\x02\x82\xff\xd7\x02\xcc\x02\x83\xff\ +\xec\x02\xcc\x02\x8b\xff\xec\x02\xcc\x02\xaa\xff\xc3\x02\xcc\x02\ +\xb5\xff\xd7\x02\xcc\x02\xb6\xff\xc3\x02\xcc\x02\xb7\xff\xd7\x02\ +\xcc\x02\xb8\xff\xec\x02\xcc\x02\xb9\xff\xd7\x02\xcc\x02\xba\xff\ +\xec\x02\xcc\x02\xbe\xff\xc3\x02\xcc\x02\xbf\xff\xae\x02\xcc\x02\ +\xc0\xff\xd7\x02\xcc\x02\xc1\xff\xae\x02\xcc\x02\xc2\xff\xd7\x02\ +\xcc\x02\xc5\xff\xc3\x02\xcc\x02\xc6\xff\xd7\x02\xcc\x02\xc7\xff\ +\xc3\x02\xcc\x02\xc8\xff\xd7\x02\xcc\x02\xd4\xff\xae\x02\xcc\x02\ +\xd5\xff\xd7\x02\xcc\x02\xfd\xff\xae\x02\xcc\x02\xfe\xff\xd7\x02\ +\xcc\x03\x0d\xff\xd7\x02\xcc\x03\x0e\xff\xc3\x02\xcc\x03\x0f\xff\ +\xd7\x02\xcc\x03\x10\xff\xc3\x02\xcc\x03\x18\xff\xc3\x02\xcd\x01\ +\xe1\xff\xd7\x02\xcd\x02\xc0\xff\xd7\x02\xcd\x02\xc2\xff\xd7\x02\ +\xcd\x02\xd5\xff\xd7\x02\xcd\x02\xfe\xff\xd7\x02\xce\x01\xa3\x00\ +\xe1\x02\xce\x02\xea\x00)\x02\xce\x03\x0e\xff\xd7\x02\xce\x03\ +\x10\xff\xd7\x02\xcf\x00\x05\xff\xec\x02\xcf\x00\x0a\xff\xec\x02\ +\xcf\x02\x07\xff\xec\x02\xcf\x02\x0b\xff\xec\x02\xd2\x01\xa3\x00\ +\xe1\x02\xd2\x02\xea\x00)\x02\xd2\x03\x0e\xff\xd7\x02\xd2\x03\ +\x10\xff\xd7\x02\xd3\x00\x05\xff\xec\x02\xd3\x00\x0a\xff\xec\x02\ +\xd3\x02\x07\xff\xec\x02\xd3\x02\x0b\xff\xec\x02\xd6\x01\xa3\x00\ +\xe1\x02\xd6\x02\xea\x00)\x02\xd6\x03\x0e\xff\xd7\x02\xd6\x03\ +\x10\xff\xd7\x02\xd7\x00\x05\xff\xec\x02\xd7\x00\x0a\xff\xec\x02\ +\xd7\x02\x07\xff\xec\x02\xd7\x02\x0b\xff\xec\x02\xd9\x00\x05\xff\ +q\x02\xd9\x00\x0a\xffq\x02\xd9\x01\x9d\xff\x9a\x02\xd9\x01\ +\xa6\xff\x9a\x02\xd9\x01\xbc\xffq\x02\xd9\x01\xbe\xff\xd7\x02\ +\xd9\x01\xc1\xff\x9a\x02\xd9\x01\xc4\xff\x9a\x02\xd9\x01\xdc\xff\ +\xd7\x02\xd9\x01\xe1\xff\xd7\x02\xd9\x01\xe4\xff\xd7\x02\xd9\x02\ +\x07\xffq\x02\xd9\x02\x0b\xffq\x02\xd9\x02n\xff\xd7\x02\ +\xd9\x02|\xff\x9a\x02\xd9\x02\x80\xff\xae\x02\xd9\x02\x82\xff\ +\xae\x02\xd9\x02\x97\xff\xd7\x02\xd9\x02\x9b\xff\xd7\x02\xd9\x02\ +\xa7\xff\xd7\x02\xd9\x02\xa9\xff\x9a\x02\xd9\x02\xaa\xff\xd7\x02\ +\xd9\x02\xb5\xffq\x02\xd9\x02\xb6\xff\xd7\x02\xd9\x02\xb7\xff\ +\x85\x02\xd9\x02\xb9\xff\x85\x02\xd9\x02\xbd\xff\x9a\x02\xd9\x02\ +\xbe\xff\xd7\x02\xd9\x02\xbf\xff\x9a\x02\xd9\x02\xc0\xff\xd7\x02\ +\xd9\x02\xc1\xff\x9a\x02\xd9\x02\xc2\xff\xd7\x02\xd9\x02\xc5\xff\ +\x9a\x02\xd9\x02\xc7\xff\x9a\x02\xd9\x02\xd4\xff\x9a\x02\xd9\x02\ +\xd5\xff\xd7\x02\xd9\x02\xe1\xff\xd7\x02\xd9\x02\xe3\xff\xd7\x02\ +\xd9\x02\xfd\xff\x9a\x02\xd9\x02\xfe\xff\xd7\x02\xd9\x03\x03\xff\ +\xd7\x02\xd9\x03\x0d\xffq\x02\xd9\x03\x0e\xff\xd7\x02\xd9\x03\ +\x0f\xffq\x02\xd9\x03\x10\xff\xd7\x02\xd9\x03\x17\xff\x9a\x02\ +\xd9\x03\x18\xff\xd7\x02\xda\x00\x05\xff\xec\x02\xda\x00\x0a\xff\ +\xec\x02\xda\x02\x07\xff\xec\x02\xda\x02\x0b\xff\xec\x02\xdb\x00\ +\x05\xffq\x02\xdb\x00\x0a\xffq\x02\xdb\x01\x9d\xff\x9a\x02\ +\xdb\x01\xa6\xff\x9a\x02\xdb\x01\xbc\xffq\x02\xdb\x01\xbe\xff\ +\xd7\x02\xdb\x01\xc1\xff\x9a\x02\xdb\x01\xc4\xff\x9a\x02\xdb\x01\ +\xdc\xff\xd7\x02\xdb\x01\xe1\xff\xd7\x02\xdb\x01\xe4\xff\xd7\x02\ +\xdb\x02\x07\xffq\x02\xdb\x02\x0b\xffq\x02\xdb\x02n\xff\ +\xd7\x02\xdb\x02|\xff\x9a\x02\xdb\x02\x80\xff\xae\x02\xdb\x02\ +\x82\xff\xae\x02\xdb\x02\x97\xff\xd7\x02\xdb\x02\x9b\xff\xd7\x02\ +\xdb\x02\xa7\xff\xd7\x02\xdb\x02\xa9\xff\x9a\x02\xdb\x02\xaa\xff\ +\xd7\x02\xdb\x02\xb5\xffq\x02\xdb\x02\xb6\xff\xd7\x02\xdb\x02\ +\xb7\xff\x85\x02\xdb\x02\xb9\xff\x85\x02\xdb\x02\xbd\xff\x9a\x02\ +\xdb\x02\xbe\xff\xd7\x02\xdb\x02\xbf\xff\x9a\x02\xdb\x02\xc0\xff\ +\xd7\x02\xdb\x02\xc1\xff\x9a\x02\xdb\x02\xc2\xff\xd7\x02\xdb\x02\ +\xc5\xff\x9a\x02\xdb\x02\xc7\xff\x9a\x02\xdb\x02\xd4\xff\x9a\x02\ +\xdb\x02\xd5\xff\xd7\x02\xdb\x02\xe1\xff\xd7\x02\xdb\x02\xe3\xff\ +\xd7\x02\xdb\x02\xfd\xff\x9a\x02\xdb\x02\xfe\xff\xd7\x02\xdb\x03\ +\x03\xff\xd7\x02\xdb\x03\x0d\xffq\x02\xdb\x03\x0e\xff\xd7\x02\ +\xdb\x03\x0f\xffq\x02\xdb\x03\x10\xff\xd7\x02\xdb\x03\x17\xff\ +\x9a\x02\xdb\x03\x18\xff\xd7\x02\xdc\x00\x05\xff\xec\x02\xdc\x00\ +\x0a\xff\xec\x02\xdc\x02\x07\xff\xec\x02\xdc\x02\x0b\xff\xec\x02\ +\xde\x00\x05\xff\xec\x02\xde\x00\x0a\xff\xec\x02\xde\x02\x07\xff\ +\xec\x02\xde\x02\x0b\xff\xec\x02\xe0\x00\x05\xff\xec\x02\xe0\x00\ +\x0a\xff\xec\x02\xe0\x02\x07\xff\xec\x02\xe0\x02\x0b\xff\xec\x02\ +\xe1\x00\x0f\xff\xae\x02\xe1\x00\x11\xff\xae\x02\xe1\x01\x9d\xff\ +\xec\x02\xe1\x01\xa4\xff\xd7\x02\xe1\x01\xa6\xff\xec\x02\xe1\x01\ +\xa8\xff\xd7\x02\xe1\x01\xaa\xff\xd7\x02\xe1\x01\xae\xff\xd7\x02\ +\xe1\x01\xb0\xff\xd7\x02\xe1\x01\xb1\xff\xec\x02\xe1\x01\xb5\xff\ +\xd7\x02\xe1\x01\xbc\xff\xc3\x02\xe1\x01\xbd\xff\xd7\x02\xe1\x01\ +\xbf\xff\xd7\x02\xe1\x01\xc1\xff\xd7\x02\xe1\x01\xc4\xff\xec\x02\ +\xe1\x01\xc7\xff\xec\x02\xe1\x01\xce\xff\xec\x02\xe1\x01\xd5\xff\ +\xec\x02\xe1\x01\xf2\xff\xec\x02\xe1\x02\x08\xff\xae\x02\xe1\x02\ +\x0c\xff\xae\x02\xe1\x02r\xff\xd7\x02\xe1\x02s\xff\xec\x02\ +\xe1\x02z\xff\xec\x02\xe1\x02|\xff\xd7\x02\xe1\x02\x80\xff\ +\xec\x02\xe1\x02\x82\xff\xec\x02\xe1\x02\x9f\xff\xd7\x02\xe1\x02\ +\xa1\xff\xec\x02\xe1\x02\xa9\xff\xec\x02\xe1\x02\xb5\xff\xc3\x02\ +\xe1\x02\xb7\xff\xec\x02\xe1\x02\xb9\xff\xec\x02\xe1\x02\xbb\xff\ +\xd7\x02\xe1\x02\xbd\xff\xec\x02\xe1\x02\xbf\xff\xd7\x02\xe1\x02\ +\xc1\xff\xd7\x02\xe1\x02\xca\xff\xd7\x02\xe1\x02\xce\xff\xd7\x02\ +\xe1\x02\xcf\xff\xec\x02\xe1\x02\xd4\xff\xd7\x02\xe1\x02\xd9\xff\ +\xd7\x02\xe1\x02\xdb\xff\xd7\x02\xe1\x02\xdd\xff\xd7\x02\xe1\x02\ +\xe5\xff\xd7\x02\xe1\x02\xe7\xff\xec\x02\xe1\x02\xf5\xff\xec\x02\ +\xe1\x02\xf7\xff\xd7\x02\xe1\x02\xf9\xff\xd7\x02\xe1\x02\xfb\xff\ +\xd7\x02\xe1\x02\xfd\xff\xd7\x02\xe1\x03\x05\xff\xd7\x02\xe1\x03\ +\x07\xff\xd7\x02\xe1\x03\x0d\xff\xd7\x02\xe1\x03\x0f\xff\xd7\x02\ +\xe1\x03\x11\xff\xd7\x02\xe1\x03\x12\xff\xec\x02\xe1\x03\x17\xff\ +\xec\x02\xe1\x03\x1b\xff\xd7\x02\xe1\x03\x1c\xff\xec\x02\xe2\x00\ +\x05\xff\xec\x02\xe2\x00\x0a\xff\xec\x02\xe2\x01\xd0\xff\xd7\x02\ +\xe2\x01\xdc\xff\xec\x02\xe2\x01\xdd\xff\xec\x02\xe2\x01\xdf\xff\ +\xd7\x02\xe2\x01\xe1\xff\xec\x02\xe2\x01\xe4\xff\xec\x02\xe2\x01\ +\xf6\xff\xec\x02\xe2\x02\x07\xff\xec\x02\xe2\x02\x0b\xff\xec\x02\ +\xe2\x02\xa0\xff\xd7\x02\xe2\x02\xaa\xff\xec\x02\xe2\x02\xb6\xff\ +\xec\x02\xe2\x02\xbc\xff\xd7\x02\xe2\x02\xbe\xff\xec\x02\xe2\x02\ +\xc0\xff\xec\x02\xe2\x02\xc2\xff\xec\x02\xe2\x02\xcb\xff\xd7\x02\ +\xe2\x02\xd5\xff\xec\x02\xe2\x02\xe6\xff\xd7\x02\xe2\x02\xf8\xff\ +\xec\x02\xe2\x02\xfa\xff\xec\x02\xe2\x02\xfc\xff\xec\x02\xe2\x02\ +\xfe\xff\xec\x02\xe2\x03\x06\xff\xd7\x02\xe2\x03\x08\xff\xd7\x02\ +\xe2\x03\x0e\xff\xec\x02\xe2\x03\x10\xff\xec\x02\xe2\x03\x18\xff\ +\xec\x02\xe3\x00\x0f\xff\xae\x02\xe3\x00\x11\xff\xae\x02\xe3\x01\ +\x9d\xff\xec\x02\xe3\x01\xa4\xff\xd7\x02\xe3\x01\xa6\xff\xec\x02\ +\xe3\x01\xa8\xff\xd7\x02\xe3\x01\xaa\xff\xd7\x02\xe3\x01\xae\xff\ +\xd7\x02\xe3\x01\xb0\xff\xd7\x02\xe3\x01\xb1\xff\xec\x02\xe3\x01\ +\xb5\xff\xd7\x02\xe3\x01\xbc\xff\xc3\x02\xe3\x01\xbd\xff\xd7\x02\ +\xe3\x01\xbf\xff\xd7\x02\xe3\x01\xc1\xff\xd7\x02\xe3\x01\xc4\xff\ +\xec\x02\xe3\x01\xc7\xff\xec\x02\xe3\x01\xce\xff\xec\x02\xe3\x01\ +\xd5\xff\xec\x02\xe3\x01\xf2\xff\xec\x02\xe3\x02\x08\xff\xae\x02\ +\xe3\x02\x0c\xff\xae\x02\xe3\x02r\xff\xd7\x02\xe3\x02s\xff\ +\xec\x02\xe3\x02z\xff\xec\x02\xe3\x02|\xff\xd7\x02\xe3\x02\ +\x80\xff\xec\x02\xe3\x02\x82\xff\xec\x02\xe3\x02\x9f\xff\xd7\x02\ +\xe3\x02\xa1\xff\xec\x02\xe3\x02\xa9\xff\xec\x02\xe3\x02\xb5\xff\ +\xc3\x02\xe3\x02\xb7\xff\xec\x02\xe3\x02\xb9\xff\xec\x02\xe3\x02\ +\xbb\xff\xd7\x02\xe3\x02\xbd\xff\xec\x02\xe3\x02\xbf\xff\xd7\x02\ +\xe3\x02\xc1\xff\xd7\x02\xe3\x02\xca\xff\xd7\x02\xe3\x02\xce\xff\ +\xd7\x02\xe3\x02\xcf\xff\xec\x02\xe3\x02\xd4\xff\xd7\x02\xe3\x02\ +\xd9\xff\xd7\x02\xe3\x02\xdb\xff\xd7\x02\xe3\x02\xdd\xff\xd7\x02\ +\xe3\x02\xe5\xff\xd7\x02\xe3\x02\xe7\xff\xec\x02\xe3\x02\xf5\xff\ +\xec\x02\xe3\x02\xf7\xff\xd7\x02\xe3\x02\xf9\xff\xd7\x02\xe3\x02\ +\xfb\xff\xd7\x02\xe3\x02\xfd\xff\xd7\x02\xe3\x03\x05\xff\xd7\x02\ +\xe3\x03\x07\xff\xd7\x02\xe3\x03\x0d\xff\xd7\x02\xe3\x03\x0f\xff\ +\xd7\x02\xe3\x03\x11\xff\xd7\x02\xe3\x03\x12\xff\xec\x02\xe3\x03\ +\x17\xff\xec\x02\xe3\x03\x1b\xff\xd7\x02\xe3\x03\x1c\xff\xec\x02\ +\xe4\x00\x05\xff\xec\x02\xe4\x00\x0a\xff\xec\x02\xe4\x01\xd0\xff\ +\xd7\x02\xe4\x01\xdc\xff\xec\x02\xe4\x01\xdd\xff\xec\x02\xe4\x01\ +\xdf\xff\xd7\x02\xe4\x01\xe1\xff\xec\x02\xe4\x01\xe4\xff\xec\x02\ +\xe4\x01\xf6\xff\xec\x02\xe4\x02\x07\xff\xec\x02\xe4\x02\x0b\xff\ +\xec\x02\xe4\x02\xa0\xff\xd7\x02\xe4\x02\xaa\xff\xec\x02\xe4\x02\ +\xb6\xff\xec\x02\xe4\x02\xbc\xff\xd7\x02\xe4\x02\xbe\xff\xec\x02\ +\xe4\x02\xc0\xff\xec\x02\xe4\x02\xc2\xff\xec\x02\xe4\x02\xcb\xff\ +\xd7\x02\xe4\x02\xd5\xff\xec\x02\xe4\x02\xe6\xff\xd7\x02\xe4\x02\ +\xf8\xff\xec\x02\xe4\x02\xfa\xff\xec\x02\xe4\x02\xfc\xff\xec\x02\ +\xe4\x02\xfe\xff\xec\x02\xe4\x03\x06\xff\xd7\x02\xe4\x03\x08\xff\ +\xd7\x02\xe4\x03\x0e\xff\xec\x02\xe4\x03\x10\xff\xec\x02\xe4\x03\ +\x18\xff\xec\x02\xe5\x01\x9f\xff\xd7\x02\xe5\x01\xb8\xff\xd7\x02\ +\xe5\x01\xbb\xff\xd7\x02\xe5\x01\xbe\xff\xd7\x02\xe5\x01\xc1\xff\ +\xd7\x02\xe5\x01\xe1\xff\xd7\x02\xe5\x02l\xff\xd7\x02\xe5\x02\ +|\xff\xd7\x02\xe5\x02~\xff\xd7\x02\xe5\x02\x84\xff\xd7\x02\ +\xe5\x02\x86\xff\xd7\x02\xe5\x02\x88\xff\xd7\x02\xe5\x02\x8a\xff\ +\xd7\x02\xe5\x02\x8c\xff\xd7\x02\xe5\x02\xb1\xff\xd7\x02\xe5\x02\ +\xb3\xff\xd7\x02\xe5\x02\xbf\xff\xd7\x02\xe5\x02\xc0\xff\xd7\x02\ +\xe5\x02\xc1\xff\xd7\x02\xe5\x02\xc2\xff\xd7\x02\xe5\x02\xc5\xff\ +\x9a\x02\xe5\x02\xc7\xff\x9a\x02\xe5\x02\xd4\xff\xd7\x02\xe5\x02\ +\xd5\xff\xd7\x02\xe5\x02\xef\xff\xd7\x02\xe5\x02\xf1\xff\xd7\x02\ +\xe5\x02\xf3\xff\xd7\x02\xe5\x02\xfd\xff\xd7\x02\xe5\x02\xfe\xff\ +\xd7\x02\xe5\x03\x09\xff\xd7\x02\xe5\x03\x0b\xff\xd7\x02\xe5\x03\ +\x0e\xff\xd7\x02\xe5\x03\x10\xff\xd7\x02\xe5\x03\x15\xff\xd7\x02\ +\xe5\x03\x19\xff\xec\x02\xe6\x01\xcf\xff\xd7\x02\xe6\x01\xd8\xff\ +\xd7\x02\xe6\x01\xdb\xff\xd7\x02\xe6\x01\xde\xff\xd7\x02\xe6\x01\ +\xe1\xff\xd7\x02\xe6\x01\xea\xff\xd7\x02\xe6\x01\xed\xff\xd7\x02\ +\xe6\x02j\xff\xd7\x02\xe6\x02\x7f\xff\xd7\x02\xe6\x02\x85\xff\ +\xd7\x02\xe6\x02\x87\xff\xd7\x02\xe6\x02\x89\xff\xd7\x02\xe6\x02\ +\x8d\xff\xd7\x02\xe6\x02\xb2\xff\xd7\x02\xe6\x02\xb4\xff\xd7\x02\ +\xe6\x02\xc0\xff\xd7\x02\xe6\x02\xc2\xff\xd7\x02\xe6\x02\xc6\xff\ +\xd7\x02\xe6\x02\xc8\xff\xd7\x02\xe6\x02\xd5\xff\xd7\x02\xe6\x02\ +\xe0\xff\xd7\x02\xe6\x02\xf0\xff\xd7\x02\xe6\x02\xf2\xff\xd7\x02\ +\xe6\x02\xf4\xff\xd7\x02\xe6\x02\xfe\xff\xd7\x02\xe6\x03\x0a\xff\ +\xd7\x02\xe6\x03\x0c\xff\xd7\x02\xe6\x03\x16\xff\xd7\x02\xe6\x03\ +\x1a\xff\xd7\x02\xe7\x00\x0f\xff\xae\x02\xe7\x00\x11\xff\xae\x02\ +\xe7\x02\x08\xff\xae\x02\xe7\x02\x0c\xff\xae\x02\xe7\x02\x80\xff\ +\xec\x02\xe7\x02\x82\xff\xec\x02\xe7\x02\xb7\xff\xec\x02\xe7\x02\ +\xb9\xff\xec\x02\xe7\x03\x0d\xff\xd7\x02\xe7\x03\x0f\xff\xd7\x02\ +\xe8\x01\xe9\x00)\x02\xe9\x00\x05\xff\xec\x02\xe9\x00\x0a\xff\ +\xec\x02\xe9\x02\x07\xff\xec\x02\xe9\x02\x0b\xff\xec\x02\xe9\x03\ +\x0e\xff\xd7\x02\xe9\x03\x10\xff\xd7\x02\xef\x00\x0f\xff\xae\x02\ +\xef\x00\x11\xff\xae\x02\xef\x01\x9d\xff\xec\x02\xef\x01\xa4\xff\ +\xd7\x02\xef\x01\xa6\xff\xec\x02\xef\x01\xa8\xff\xd7\x02\xef\x01\ +\xaa\xff\xd7\x02\xef\x01\xae\xff\xd7\x02\xef\x01\xb0\xff\xd7\x02\ +\xef\x01\xb1\xff\xec\x02\xef\x01\xb5\xff\xd7\x02\xef\x01\xbc\xff\ +\xc3\x02\xef\x01\xbd\xff\xd7\x02\xef\x01\xbf\xff\xd7\x02\xef\x01\ +\xc1\xff\xd7\x02\xef\x01\xc4\xff\xec\x02\xef\x01\xc7\xff\xec\x02\ +\xef\x01\xce\xff\xec\x02\xef\x01\xd5\xff\xec\x02\xef\x01\xf2\xff\ +\xec\x02\xef\x02\x08\xff\xae\x02\xef\x02\x0c\xff\xae\x02\xef\x02\ +r\xff\xd7\x02\xef\x02s\xff\xec\x02\xef\x02z\xff\xec\x02\ +\xef\x02|\xff\xd7\x02\xef\x02\x80\xff\xec\x02\xef\x02\x82\xff\ +\xec\x02\xef\x02\x9f\xff\xd7\x02\xef\x02\xa1\xff\xec\x02\xef\x02\ +\xa9\xff\xec\x02\xef\x02\xb5\xff\xc3\x02\xef\x02\xb7\xff\xec\x02\ +\xef\x02\xb9\xff\xec\x02\xef\x02\xbb\xff\xd7\x02\xef\x02\xbd\xff\ +\xec\x02\xef\x02\xbf\xff\xd7\x02\xef\x02\xc1\xff\xd7\x02\xef\x02\ +\xca\xff\xd7\x02\xef\x02\xce\xff\xd7\x02\xef\x02\xcf\xff\xec\x02\ +\xef\x02\xd4\xff\xd7\x02\xef\x02\xd9\xff\xd7\x02\xef\x02\xdb\xff\ +\xd7\x02\xef\x02\xdd\xff\xd7\x02\xef\x02\xe5\xff\xd7\x02\xef\x02\ +\xe7\xff\xec\x02\xef\x02\xf5\xff\xec\x02\xef\x02\xf7\xff\xd7\x02\ +\xef\x02\xf9\xff\xd7\x02\xef\x02\xfb\xff\xd7\x02\xef\x02\xfd\xff\ +\xd7\x02\xef\x03\x05\xff\xd7\x02\xef\x03\x07\xff\xd7\x02\xef\x03\ +\x0d\xff\xd7\x02\xef\x03\x0f\xff\xd7\x02\xef\x03\x11\xff\xd7\x02\ +\xef\x03\x12\xff\xec\x02\xef\x03\x17\xff\xec\x02\xef\x03\x1b\xff\ +\xd7\x02\xef\x03\x1c\xff\xec\x02\xf0\x00\x05\xff\xec\x02\xf0\x00\ +\x0a\xff\xec\x02\xf0\x01\xd0\xff\xd7\x02\xf0\x01\xdc\xff\xec\x02\ +\xf0\x01\xdd\xff\xec\x02\xf0\x01\xdf\xff\xd7\x02\xf0\x01\xe1\xff\ +\xec\x02\xf0\x01\xe4\xff\xec\x02\xf0\x01\xf6\xff\xec\x02\xf0\x02\ +\x07\xff\xec\x02\xf0\x02\x0b\xff\xec\x02\xf0\x02\xa0\xff\xd7\x02\ +\xf0\x02\xaa\xff\xec\x02\xf0\x02\xb6\xff\xec\x02\xf0\x02\xbc\xff\ +\xd7\x02\xf0\x02\xbe\xff\xec\x02\xf0\x02\xc0\xff\xec\x02\xf0\x02\ +\xc2\xff\xec\x02\xf0\x02\xcb\xff\xd7\x02\xf0\x02\xd5\xff\xec\x02\ +\xf0\x02\xe6\xff\xd7\x02\xf0\x02\xf8\xff\xec\x02\xf0\x02\xfa\xff\ +\xec\x02\xf0\x02\xfc\xff\xec\x02\xf0\x02\xfe\xff\xec\x02\xf0\x03\ +\x06\xff\xd7\x02\xf0\x03\x08\xff\xd7\x02\xf0\x03\x0e\xff\xec\x02\ +\xf0\x03\x10\xff\xec\x02\xf0\x03\x18\xff\xec\x02\xf1\x00\x0f\xff\ +\xae\x02\xf1\x00\x11\xff\xae\x02\xf1\x01\x9d\xff\xec\x02\xf1\x01\ +\xa4\xff\xd7\x02\xf1\x01\xa6\xff\xec\x02\xf1\x01\xa8\xff\xd7\x02\ +\xf1\x01\xaa\xff\xd7\x02\xf1\x01\xae\xff\xd7\x02\xf1\x01\xb0\xff\ +\xd7\x02\xf1\x01\xb1\xff\xec\x02\xf1\x01\xb5\xff\xd7\x02\xf1\x01\ +\xbc\xff\xc3\x02\xf1\x01\xbd\xff\xd7\x02\xf1\x01\xbf\xff\xd7\x02\ +\xf1\x01\xc1\xff\xd7\x02\xf1\x01\xc4\xff\xec\x02\xf1\x01\xc7\xff\ +\xec\x02\xf1\x01\xce\xff\xec\x02\xf1\x01\xd5\xff\xec\x02\xf1\x01\ +\xf2\xff\xec\x02\xf1\x02\x08\xff\xae\x02\xf1\x02\x0c\xff\xae\x02\ +\xf1\x02r\xff\xd7\x02\xf1\x02s\xff\xec\x02\xf1\x02z\xff\ +\xec\x02\xf1\x02|\xff\xd7\x02\xf1\x02\x80\xff\xec\x02\xf1\x02\ +\x82\xff\xec\x02\xf1\x02\x9f\xff\xd7\x02\xf1\x02\xa1\xff\xec\x02\ +\xf1\x02\xa9\xff\xec\x02\xf1\x02\xb5\xff\xc3\x02\xf1\x02\xb7\xff\ +\xec\x02\xf1\x02\xb9\xff\xec\x02\xf1\x02\xbb\xff\xd7\x02\xf1\x02\ +\xbd\xff\xec\x02\xf1\x02\xbf\xff\xd7\x02\xf1\x02\xc1\xff\xd7\x02\ +\xf1\x02\xca\xff\xd7\x02\xf1\x02\xce\xff\xd7\x02\xf1\x02\xcf\xff\ +\xec\x02\xf1\x02\xd4\xff\xd7\x02\xf1\x02\xd9\xff\xd7\x02\xf1\x02\ +\xdb\xff\xd7\x02\xf1\x02\xdd\xff\xd7\x02\xf1\x02\xe5\xff\xd7\x02\ +\xf1\x02\xe7\xff\xec\x02\xf1\x02\xf5\xff\xec\x02\xf1\x02\xf7\xff\ +\xd7\x02\xf1\x02\xf9\xff\xd7\x02\xf1\x02\xfb\xff\xd7\x02\xf1\x02\ +\xfd\xff\xd7\x02\xf1\x03\x05\xff\xd7\x02\xf1\x03\x07\xff\xd7\x02\ +\xf1\x03\x0d\xff\xd7\x02\xf1\x03\x0f\xff\xd7\x02\xf1\x03\x11\xff\ +\xd7\x02\xf1\x03\x12\xff\xec\x02\xf1\x03\x17\xff\xec\x02\xf1\x03\ +\x1b\xff\xd7\x02\xf1\x03\x1c\xff\xec\x02\xf2\x00\x05\xff\xec\x02\ +\xf2\x00\x0a\xff\xec\x02\xf2\x01\xd0\xff\xd7\x02\xf2\x01\xdc\xff\ +\xec\x02\xf2\x01\xdd\xff\xec\x02\xf2\x01\xdf\xff\xd7\x02\xf2\x01\ +\xe1\xff\xec\x02\xf2\x01\xe4\xff\xec\x02\xf2\x01\xf6\xff\xec\x02\ +\xf2\x02\x07\xff\xec\x02\xf2\x02\x0b\xff\xec\x02\xf2\x02\xa0\xff\ +\xd7\x02\xf2\x02\xaa\xff\xec\x02\xf2\x02\xb6\xff\xec\x02\xf2\x02\ +\xbc\xff\xd7\x02\xf2\x02\xbe\xff\xec\x02\xf2\x02\xc0\xff\xec\x02\ +\xf2\x02\xc2\xff\xec\x02\xf2\x02\xcb\xff\xd7\x02\xf2\x02\xd5\xff\ +\xec\x02\xf2\x02\xe6\xff\xd7\x02\xf2\x02\xf8\xff\xec\x02\xf2\x02\ +\xfa\xff\xec\x02\xf2\x02\xfc\xff\xec\x02\xf2\x02\xfe\xff\xec\x02\ +\xf2\x03\x06\xff\xd7\x02\xf2\x03\x08\xff\xd7\x02\xf2\x03\x0e\xff\ +\xec\x02\xf2\x03\x10\xff\xec\x02\xf2\x03\x18\xff\xec\x02\xf3\x00\ +\x0f\xff\xae\x02\xf3\x00\x11\xff\xae\x02\xf3\x01\x9d\xff\xec\x02\ +\xf3\x01\xa4\xff\xd7\x02\xf3\x01\xa6\xff\xec\x02\xf3\x01\xa8\xff\ +\xd7\x02\xf3\x01\xaa\xff\xd7\x02\xf3\x01\xae\xff\xd7\x02\xf3\x01\ +\xb0\xff\xd7\x02\xf3\x01\xb1\xff\xec\x02\xf3\x01\xb5\xff\xd7\x02\ +\xf3\x01\xbc\xff\xc3\x02\xf3\x01\xbd\xff\xd7\x02\xf3\x01\xbf\xff\ +\xd7\x02\xf3\x01\xc1\xff\xd7\x02\xf3\x01\xc4\xff\xec\x02\xf3\x01\ +\xc7\xff\xec\x02\xf3\x01\xce\xff\xec\x02\xf3\x01\xd5\xff\xec\x02\ +\xf3\x01\xf2\xff\xec\x02\xf3\x02\x08\xff\xae\x02\xf3\x02\x0c\xff\ +\xae\x02\xf3\x02r\xff\xd7\x02\xf3\x02s\xff\xec\x02\xf3\x02\ +z\xff\xec\x02\xf3\x02|\xff\xd7\x02\xf3\x02\x80\xff\xec\x02\ +\xf3\x02\x82\xff\xec\x02\xf3\x02\x9f\xff\xd7\x02\xf3\x02\xa1\xff\ +\xec\x02\xf3\x02\xa9\xff\xec\x02\xf3\x02\xb5\xff\xc3\x02\xf3\x02\ +\xb7\xff\xec\x02\xf3\x02\xb9\xff\xec\x02\xf3\x02\xbb\xff\xd7\x02\ +\xf3\x02\xbd\xff\xec\x02\xf3\x02\xbf\xff\xd7\x02\xf3\x02\xc1\xff\ +\xd7\x02\xf3\x02\xca\xff\xd7\x02\xf3\x02\xce\xff\xd7\x02\xf3\x02\ +\xcf\xff\xec\x02\xf3\x02\xd4\xff\xd7\x02\xf3\x02\xd9\xff\xd7\x02\ +\xf3\x02\xdb\xff\xd7\x02\xf3\x02\xdd\xff\xd7\x02\xf3\x02\xe5\xff\ +\xd7\x02\xf3\x02\xe7\xff\xec\x02\xf3\x02\xf5\xff\xec\x02\xf3\x02\ +\xf7\xff\xd7\x02\xf3\x02\xf9\xff\xd7\x02\xf3\x02\xfb\xff\xd7\x02\ +\xf3\x02\xfd\xff\xd7\x02\xf3\x03\x05\xff\xd7\x02\xf3\x03\x07\xff\ +\xd7\x02\xf3\x03\x0d\xff\xd7\x02\xf3\x03\x0f\xff\xd7\x02\xf3\x03\ +\x11\xff\xd7\x02\xf3\x03\x12\xff\xec\x02\xf3\x03\x17\xff\xec\x02\ +\xf3\x03\x1b\xff\xd7\x02\xf3\x03\x1c\xff\xec\x02\xf4\x00\x05\xff\ +\xec\x02\xf4\x00\x0a\xff\xec\x02\xf4\x01\xd0\xff\xd7\x02\xf4\x01\ +\xdc\xff\xec\x02\xf4\x01\xdd\xff\xec\x02\xf4\x01\xdf\xff\xd7\x02\ +\xf4\x01\xe1\xff\xec\x02\xf4\x01\xe4\xff\xec\x02\xf4\x01\xf6\xff\ +\xec\x02\xf4\x02\x07\xff\xec\x02\xf4\x02\x0b\xff\xec\x02\xf4\x02\ +\xa0\xff\xd7\x02\xf4\x02\xaa\xff\xec\x02\xf4\x02\xb6\xff\xec\x02\ +\xf4\x02\xbc\xff\xd7\x02\xf4\x02\xbe\xff\xec\x02\xf4\x02\xc0\xff\ +\xec\x02\xf4\x02\xc2\xff\xec\x02\xf4\x02\xcb\xff\xd7\x02\xf4\x02\ +\xd5\xff\xec\x02\xf4\x02\xe6\xff\xd7\x02\xf4\x02\xf8\xff\xec\x02\ +\xf4\x02\xfa\xff\xec\x02\xf4\x02\xfc\xff\xec\x02\xf4\x02\xfe\xff\ +\xec\x02\xf4\x03\x06\xff\xd7\x02\xf4\x03\x08\xff\xd7\x02\xf4\x03\ +\x0e\xff\xec\x02\xf4\x03\x10\xff\xec\x02\xf4\x03\x18\xff\xec\x02\ +\xf5\x00\x0f\xff\xae\x02\xf5\x00\x11\xff\xae\x02\xf5\x01\x9d\xff\ +\xec\x02\xf5\x01\xa4\xff\xd7\x02\xf5\x01\xa6\xff\xec\x02\xf5\x01\ +\xa8\xff\xd7\x02\xf5\x01\xaa\xff\xd7\x02\xf5\x01\xae\xff\xd7\x02\ +\xf5\x01\xb0\xff\xd7\x02\xf5\x01\xb1\xff\xec\x02\xf5\x01\xb5\xff\ +\xd7\x02\xf5\x01\xbc\xff\xc3\x02\xf5\x01\xbd\xff\xd7\x02\xf5\x01\ +\xbf\xff\xd7\x02\xf5\x01\xc1\xff\xd7\x02\xf5\x01\xc4\xff\xec\x02\ +\xf5\x01\xc7\xff\xec\x02\xf5\x01\xce\xff\xec\x02\xf5\x01\xd5\xff\ +\xec\x02\xf5\x01\xf2\xff\xec\x02\xf5\x02\x08\xff\xae\x02\xf5\x02\ +\x0c\xff\xae\x02\xf5\x02r\xff\xd7\x02\xf5\x02s\xff\xec\x02\ +\xf5\x02z\xff\xec\x02\xf5\x02|\xff\xd7\x02\xf5\x02\x80\xff\ +\xec\x02\xf5\x02\x82\xff\xec\x02\xf5\x02\x9f\xff\xd7\x02\xf5\x02\ +\xa1\xff\xec\x02\xf5\x02\xa9\xff\xec\x02\xf5\x02\xb5\xff\xc3\x02\ +\xf5\x02\xb7\xff\xec\x02\xf5\x02\xb9\xff\xec\x02\xf5\x02\xbb\xff\ +\xd7\x02\xf5\x02\xbd\xff\xec\x02\xf5\x02\xbf\xff\xd7\x02\xf5\x02\ +\xc1\xff\xd7\x02\xf5\x02\xca\xff\xd7\x02\xf5\x02\xce\xff\xd7\x02\ +\xf5\x02\xcf\xff\xec\x02\xf5\x02\xd4\xff\xd7\x02\xf5\x02\xd9\xff\ +\xd7\x02\xf5\x02\xdb\xff\xd7\x02\xf5\x02\xdd\xff\xd7\x02\xf5\x02\ +\xe5\xff\xd7\x02\xf5\x02\xe7\xff\xec\x02\xf5\x02\xf5\xff\xec\x02\ +\xf5\x02\xf7\xff\xd7\x02\xf5\x02\xf9\xff\xd7\x02\xf5\x02\xfb\xff\ +\xd7\x02\xf5\x02\xfd\xff\xd7\x02\xf5\x03\x05\xff\xd7\x02\xf5\x03\ +\x07\xff\xd7\x02\xf5\x03\x0d\xff\xd7\x02\xf5\x03\x0f\xff\xd7\x02\ +\xf5\x03\x11\xff\xd7\x02\xf5\x03\x12\xff\xec\x02\xf5\x03\x17\xff\ +\xec\x02\xf5\x03\x1b\xff\xd7\x02\xf5\x03\x1c\xff\xec\x02\xf6\x00\ +\x05\xff\xec\x02\xf6\x00\x0a\xff\xec\x02\xf6\x01\xd0\xff\xd7\x02\ +\xf6\x01\xdc\xff\xec\x02\xf6\x01\xdd\xff\xec\x02\xf6\x01\xdf\xff\ +\xd7\x02\xf6\x01\xe1\xff\xec\x02\xf6\x01\xe4\xff\xec\x02\xf6\x01\ +\xf6\xff\xec\x02\xf6\x02\x07\xff\xec\x02\xf6\x02\x0b\xff\xec\x02\ +\xf6\x02\xa0\xff\xd7\x02\xf6\x02\xaa\xff\xec\x02\xf6\x02\xb6\xff\ +\xec\x02\xf6\x02\xbc\xff\xd7\x02\xf6\x02\xbe\xff\xec\x02\xf6\x02\ +\xc0\xff\xec\x02\xf6\x02\xc2\xff\xec\x02\xf6\x02\xcb\xff\xd7\x02\ +\xf6\x02\xd5\xff\xec\x02\xf6\x02\xe6\xff\xd7\x02\xf6\x02\xf8\xff\ +\xec\x02\xf6\x02\xfa\xff\xec\x02\xf6\x02\xfc\xff\xec\x02\xf6\x02\ +\xfe\xff\xec\x02\xf6\x03\x06\xff\xd7\x02\xf6\x03\x08\xff\xd7\x02\ +\xf6\x03\x0e\xff\xec\x02\xf6\x03\x10\xff\xec\x02\xf6\x03\x18\xff\ +\xec\x02\xf7\x00\x0f\xff\x85\x02\xf7\x00\x11\xff\x85\x02\xf7\x01\ +\x9f\xff\xec\x02\xf7\x01\xa4\xff\x9a\x02\xf7\x01\xaa\xffq\x02\ +\xf7\x01\xae\xff\x9a\x02\xf7\x01\xb5\xff\x9a\x02\xf7\x01\xb8\xff\ +\xec\x02\xf7\x01\xbb\xff\xec\x02\xf7\x01\xbe\xff\xc3\x02\xf7\x01\ +\xc9\xff\xec\x02\xf7\x01\xce\xff\xae\x02\xf7\x01\xcf\xff\xd7\x02\ +\xf7\x01\xd5\xff\xae\x02\xf7\x01\xd8\xff\xd7\x02\xf7\x01\xdb\xff\ +\xd7\x02\xf7\x01\xde\xff\xd7\x02\xf7\x01\xe1\xff\xd7\x02\xf7\x01\ +\xea\xff\xd7\x02\xf7\x01\xeb\x00f\x02\xf7\x01\xed\xff\xd7\x02\ +\xf7\x01\xee\xff\xec\x02\xf7\x01\xf2\xff\xae\x02\xf7\x01\xf4\x00\ +f\x02\xf7\x02\x08\xff\x85\x02\xf7\x02\x0c\xff\x85\x02\xf7\x02\ +j\xff\xd7\x02\xf7\x02l\xff\xec\x02\xf7\x02r\xffq\x02\ +\xf7\x02s\xff\xae\x02\xf7\x02~\xff\xec\x02\xf7\x02\x7f\xff\ +\xd7\x02\xf7\x02\x84\xff\xec\x02\xf7\x02\x85\xff\xd7\x02\xf7\x02\ +\x86\xff\xec\x02\xf7\x02\x87\xff\xd7\x02\xf7\x02\x88\xff\xec\x02\ +\xf7\x02\x89\xff\xd7\x02\xf7\x02\x8a\xff\xec\x02\xf7\x02\x8c\xff\ +\xec\x02\xf7\x02\x8d\xff\xd7\x02\xf7\x02\x98\x00f\x02\xf7\x02\ +\xa8\x00f\x02\xf7\x02\xb1\xff\xec\x02\xf7\x02\xb2\xff\xd7\x02\ +\xf7\x02\xb3\xff\xec\x02\xf7\x02\xb4\xff\xd7\x02\xf7\x02\xc0\xff\ +\xd7\x02\xf7\x02\xc2\xff\xd7\x02\xf7\x02\xc5\xff\xd7\x02\xf7\x02\ +\xc6\xff\xc3\x02\xf7\x02\xc7\xff\xd7\x02\xf7\x02\xc8\xff\xc3\x02\ +\xf7\x02\xce\xff\x9a\x02\xf7\x02\xcf\xff\xae\x02\xf7\x02\xd5\xff\ +\xd7\x02\xf7\x02\xd9\xffq\x02\xf7\x02\xdb\xffq\x02\xf7\x02\ +\xdd\xffq\x02\xf7\x02\xe0\xff\xd7\x02\xf7\x02\xef\xff\xec\x02\ +\xf7\x02\xf0\xff\xd7\x02\xf7\x02\xf1\xff\xec\x02\xf7\x02\xf2\xff\ +\xd7\x02\xf7\x02\xf3\xff\xec\x02\xf7\x02\xf4\xff\xd7\x02\xf7\x02\ +\xfe\xff\xd7\x02\xf7\x03\x09\xffq\x02\xf7\x03\x0a\xff\xd7\x02\ +\xf7\x03\x0b\xffq\x02\xf7\x03\x0c\xff\xd7\x02\xf7\x03\x11\xff\ +\x9a\x02\xf7\x03\x12\xff\xae\x02\xf7\x03\x15\xff\xec\x02\xf7\x03\ +\x16\xff\xd7\x02\xf7\x03\x1a\xff\xd7\x02\xf7\x03\x1b\xff\x9a\x02\ +\xf7\x03\x1c\xff\xae\x02\xf8\x00\x0f\xff\xae\x02\xf8\x00\x11\xff\ +\xae\x02\xf8\x01\xce\xff\xd7\x02\xf8\x01\xd5\xff\xd7\x02\xf8\x01\ +\xf2\xff\xd7\x02\xf8\x02\x08\xff\xae\x02\xf8\x02\x0c\xff\xae\x02\ +\xf8\x02s\xff\xd7\x02\xf8\x02\xcf\xff\xd7\x02\xf8\x03\x12\xff\ +\xd7\x02\xf8\x03\x1c\xff\xd7\x02\xf9\x00\x0f\xff\x85\x02\xf9\x00\ +\x11\xff\x85\x02\xf9\x01\x9f\xff\xec\x02\xf9\x01\xa4\xff\x9a\x02\ +\xf9\x01\xaa\xffq\x02\xf9\x01\xae\xff\x9a\x02\xf9\x01\xb5\xff\ +\x9a\x02\xf9\x01\xb8\xff\xec\x02\xf9\x01\xbb\xff\xec\x02\xf9\x01\ +\xbe\xff\xc3\x02\xf9\x01\xc9\xff\xec\x02\xf9\x01\xce\xff\xae\x02\ +\xf9\x01\xcf\xff\xd7\x02\xf9\x01\xd5\xff\xae\x02\xf9\x01\xd8\xff\ +\xd7\x02\xf9\x01\xdb\xff\xd7\x02\xf9\x01\xde\xff\xd7\x02\xf9\x01\ +\xe1\xff\xd7\x02\xf9\x01\xea\xff\xd7\x02\xf9\x01\xeb\x00f\x02\ +\xf9\x01\xed\xff\xd7\x02\xf9\x01\xee\xff\xec\x02\xf9\x01\xf2\xff\ +\xae\x02\xf9\x01\xf4\x00f\x02\xf9\x02\x08\xff\x85\x02\xf9\x02\ +\x0c\xff\x85\x02\xf9\x02j\xff\xd7\x02\xf9\x02l\xff\xec\x02\ +\xf9\x02r\xffq\x02\xf9\x02s\xff\xae\x02\xf9\x02~\xff\ +\xec\x02\xf9\x02\x7f\xff\xd7\x02\xf9\x02\x84\xff\xec\x02\xf9\x02\ +\x85\xff\xd7\x02\xf9\x02\x86\xff\xec\x02\xf9\x02\x87\xff\xd7\x02\ +\xf9\x02\x88\xff\xec\x02\xf9\x02\x89\xff\xd7\x02\xf9\x02\x8a\xff\ +\xec\x02\xf9\x02\x8c\xff\xec\x02\xf9\x02\x8d\xff\xd7\x02\xf9\x02\ +\x98\x00f\x02\xf9\x02\xa8\x00f\x02\xf9\x02\xb1\xff\xec\x02\ +\xf9\x02\xb2\xff\xd7\x02\xf9\x02\xb3\xff\xec\x02\xf9\x02\xb4\xff\ +\xd7\x02\xf9\x02\xc0\xff\xd7\x02\xf9\x02\xc2\xff\xd7\x02\xf9\x02\ +\xc5\xff\xd7\x02\xf9\x02\xc6\xff\xc3\x02\xf9\x02\xc7\xff\xd7\x02\ +\xf9\x02\xc8\xff\xc3\x02\xf9\x02\xce\xff\x9a\x02\xf9\x02\xcf\xff\ +\xae\x02\xf9\x02\xd5\xff\xd7\x02\xf9\x02\xd9\xffq\x02\xf9\x02\ +\xdb\xffq\x02\xf9\x02\xdd\xffq\x02\xf9\x02\xe0\xff\xd7\x02\ +\xf9\x02\xef\xff\xec\x02\xf9\x02\xf0\xff\xd7\x02\xf9\x02\xf1\xff\ +\xec\x02\xf9\x02\xf2\xff\xd7\x02\xf9\x02\xf3\xff\xec\x02\xf9\x02\ +\xf4\xff\xd7\x02\xf9\x02\xfe\xff\xd7\x02\xf9\x03\x09\xffq\x02\ +\xf9\x03\x0a\xff\xd7\x02\xf9\x03\x0b\xffq\x02\xf9\x03\x0c\xff\ +\xd7\x02\xf9\x03\x11\xff\x9a\x02\xf9\x03\x12\xff\xae\x02\xf9\x03\ +\x15\xff\xec\x02\xf9\x03\x16\xff\xd7\x02\xf9\x03\x1a\xff\xd7\x02\ +\xf9\x03\x1b\xff\x9a\x02\xf9\x03\x1c\xff\xae\x02\xfa\x00\x0f\xff\ +\xae\x02\xfa\x00\x11\xff\xae\x02\xfa\x01\xce\xff\xd7\x02\xfa\x01\ +\xd5\xff\xd7\x02\xfa\x01\xf2\xff\xd7\x02\xfa\x02\x08\xff\xae\x02\ +\xfa\x02\x0c\xff\xae\x02\xfa\x02s\xff\xd7\x02\xfa\x02\xcf\xff\ +\xd7\x02\xfa\x03\x12\xff\xd7\x02\xfa\x03\x1c\xff\xd7\x02\xfb\x00\ +\x0f\xff\x85\x02\xfb\x00\x11\xff\x85\x02\xfb\x01\x9f\xff\xec\x02\ +\xfb\x01\xa4\xff\x9a\x02\xfb\x01\xaa\xffq\x02\xfb\x01\xae\xff\ +\x9a\x02\xfb\x01\xb5\xff\x9a\x02\xfb\x01\xb8\xff\xec\x02\xfb\x01\ +\xbb\xff\xec\x02\xfb\x01\xbe\xff\xc3\x02\xfb\x01\xc9\xff\xec\x02\ +\xfb\x01\xce\xff\xae\x02\xfb\x01\xcf\xff\xd7\x02\xfb\x01\xd5\xff\ +\xae\x02\xfb\x01\xd8\xff\xd7\x02\xfb\x01\xdb\xff\xd7\x02\xfb\x01\ +\xde\xff\xd7\x02\xfb\x01\xe1\xff\xd7\x02\xfb\x01\xea\xff\xd7\x02\ +\xfb\x01\xeb\x00f\x02\xfb\x01\xed\xff\xd7\x02\xfb\x01\xee\xff\ +\xec\x02\xfb\x01\xf2\xff\xae\x02\xfb\x01\xf4\x00f\x02\xfb\x02\ +\x08\xff\x85\x02\xfb\x02\x0c\xff\x85\x02\xfb\x02j\xff\xd7\x02\ +\xfb\x02l\xff\xec\x02\xfb\x02r\xffq\x02\xfb\x02s\xff\ +\xae\x02\xfb\x02~\xff\xec\x02\xfb\x02\x7f\xff\xd7\x02\xfb\x02\ +\x84\xff\xec\x02\xfb\x02\x85\xff\xd7\x02\xfb\x02\x86\xff\xec\x02\ +\xfb\x02\x87\xff\xd7\x02\xfb\x02\x88\xff\xec\x02\xfb\x02\x89\xff\ +\xd7\x02\xfb\x02\x8a\xff\xec\x02\xfb\x02\x8c\xff\xec\x02\xfb\x02\ +\x8d\xff\xd7\x02\xfb\x02\x98\x00f\x02\xfb\x02\xa8\x00f\x02\ +\xfb\x02\xb1\xff\xec\x02\xfb\x02\xb2\xff\xd7\x02\xfb\x02\xb3\xff\ +\xec\x02\xfb\x02\xb4\xff\xd7\x02\xfb\x02\xc0\xff\xd7\x02\xfb\x02\ +\xc2\xff\xd7\x02\xfb\x02\xc5\xff\xd7\x02\xfb\x02\xc6\xff\xc3\x02\ +\xfb\x02\xc7\xff\xd7\x02\xfb\x02\xc8\xff\xc3\x02\xfb\x02\xce\xff\ +\x9a\x02\xfb\x02\xcf\xff\xae\x02\xfb\x02\xd5\xff\xd7\x02\xfb\x02\ +\xd9\xffq\x02\xfb\x02\xdb\xffq\x02\xfb\x02\xdd\xffq\x02\ +\xfb\x02\xe0\xff\xd7\x02\xfb\x02\xef\xff\xec\x02\xfb\x02\xf0\xff\ +\xd7\x02\xfb\x02\xf1\xff\xec\x02\xfb\x02\xf2\xff\xd7\x02\xfb\x02\ +\xf3\xff\xec\x02\xfb\x02\xf4\xff\xd7\x02\xfb\x02\xfe\xff\xd7\x02\ +\xfb\x03\x09\xffq\x02\xfb\x03\x0a\xff\xd7\x02\xfb\x03\x0b\xff\ +q\x02\xfb\x03\x0c\xff\xd7\x02\xfb\x03\x11\xff\x9a\x02\xfb\x03\ +\x12\xff\xae\x02\xfb\x03\x15\xff\xec\x02\xfb\x03\x16\xff\xd7\x02\ +\xfb\x03\x1a\xff\xd7\x02\xfb\x03\x1b\xff\x9a\x02\xfb\x03\x1c\xff\ +\xae\x02\xfc\x00\x0f\xff\xae\x02\xfc\x00\x11\xff\xae\x02\xfc\x01\ +\xce\xff\xd7\x02\xfc\x01\xd5\xff\xd7\x02\xfc\x01\xf2\xff\xd7\x02\ +\xfc\x02\x08\xff\xae\x02\xfc\x02\x0c\xff\xae\x02\xfc\x02s\xff\ +\xd7\x02\xfc\x02\xcf\xff\xd7\x02\xfc\x03\x12\xff\xd7\x02\xfc\x03\ +\x1c\xff\xd7\x02\xff\x00\x0f\xff\x85\x02\xff\x00\x10\xff\xae\x02\ +\xff\x00\x11\xff\x85\x02\xff\x01\x9f\xff\xd7\x02\xff\x01\xa4\xff\ +\x9a\x02\xff\x01\xaa\xffq\x02\xff\x01\xae\xff\x9a\x02\xff\x01\ +\xb5\xff\x9a\x02\xff\x01\xb8\xff\xd7\x02\xff\x01\xbb\xff\xd7\x02\ +\xff\x01\xbc\x00)\x02\xff\x01\xbe\xff\xae\x02\xff\x01\xcc\xff\ +\x9a\x02\xff\x01\xcd\xff\x9a\x02\xff\x01\xce\xff\x85\x02\xff\x01\ +\xcf\xffq\x02\xff\x01\xd0\xff\xd7\x02\xff\x01\xd1\xff\xd7\x02\ +\xff\x01\xd2\xff\x9a\x02\xff\x01\xd3\xff\x9a\x02\xff\x01\xd4\xff\ +\x9a\x02\xff\x01\xd5\xff\x85\x02\xff\x01\xd6\xff\x9a\x02\xff\x01\ +\xd7\xff\x9a\x02\xff\x01\xd8\xffq\x02\xff\x01\xd9\xff\x9a\x02\ +\xff\x01\xda\xff\x9a\x02\xff\x01\xdb\xffq\x02\xff\x01\xdc\xff\ +\xae\x02\xff\x01\xdd\xff\xae\x02\xff\x01\xde\xffq\x02\xff\x01\ +\xdf\xff\xd7\x02\xff\x01\xe0\xff\x9a\x02\xff\x01\xe1\xff\x9a\x02\ +\xff\x01\xe2\xff\x9a\x02\xff\x01\xe3\xff\x9a\x02\xff\x01\xe4\xff\ +\xae\x02\xff\x01\xe5\xff\x9a\x02\xff\x01\xe6\xff\x9a\x02\xff\x01\ +\xe7\xff\xd7\x02\xff\x01\xe8\xff\x9a\x02\xff\x01\xe9\xff\xc3\x02\ +\xff\x01\xea\xffq\x02\xff\x01\xec\xff\x9a\x02\xff\x01\xed\xff\ +q\x02\xff\x01\xee\xff\x85\x02\xff\x01\xf2\xff\x85\x02\xff\x01\ +\xf3\xff\x9a\x02\xff\x01\xf5\xff\x9a\x02\xff\x01\xf6\xff\xae\x02\ +\xff\x01\xf7\xff\x9a\x02\xff\x01\xf9\xff\x9a\x02\xff\x02\x02\xff\ +\xae\x02\xff\x02\x03\xff\xae\x02\xff\x02\x04\xff\xae\x02\xff\x02\ +\x08\xff\x85\x02\xff\x02\x0c\xff\x85\x02\xff\x02j\xffq\x02\ +\xff\x02k\xff\x9a\x02\xff\x02l\xff\xd7\x02\xff\x02m\xff\ +\xd7\x02\xff\x02q\xff\x9a\x02\xff\x02r\xffq\x02\xff\x02\ +s\xff\x85\x02\xff\x02u\xff\x9a\x02\xff\x02w\xff\x9a\x02\ +\xff\x02y\xff\x9a\x02\xff\x02}\xff\x9a\x02\xff\x02~\xff\ +\xd7\x02\xff\x02\x7f\xffq\x02\xff\x02\x81\xff\xd7\x02\xff\x02\ +\x83\xff\xd7\x02\xff\x02\x84\xff\xd7\x02\xff\x02\x85\xffq\x02\ +\xff\x02\x86\xff\xd7\x02\xff\x02\x87\xffq\x02\xff\x02\x88\xff\ +\xd7\x02\xff\x02\x89\xffq\x02\xff\x02\x8a\xff\xd7\x02\xff\x02\ +\x8b\xff\xd7\x02\xff\x02\x8c\xff\xd7\x02\xff\x02\x8d\xffq\x02\ +\xff\x02\x96\xff\x9a\x02\xff\x02\x9a\xff\x9a\x02\xff\x02\x9e\xff\ +\x9a\x02\xff\x02\xa0\xff\xd7\x02\xff\x02\xa2\xff\xd7\x02\xff\x02\ +\xa4\xff\x9a\x02\xff\x02\xa6\xff\x9a\x02\xff\x02\xaa\xff\xae\x02\ +\xff\x02\xac\xff\x9a\x02\xff\x02\xae\xff\x9a\x02\xff\x02\xb0\xff\ +\x9a\x02\xff\x02\xb1\xff\xd7\x02\xff\x02\xb2\xffq\x02\xff\x02\ +\xb3\xff\xd7\x02\xff\x02\xb4\xffq\x02\xff\x02\xb5\x00)\x02\ +\xff\x02\xb6\xff\xae\x02\xff\x02\xb8\xff\xae\x02\xff\x02\xba\xff\ +\xae\x02\xff\x02\xbc\xff\xd7\x02\xff\x02\xbe\xff\xae\x02\xff\x02\ +\xc0\xff\x9a\x02\xff\x02\xc2\xff\x9a\x02\xff\x02\xc4\xff\x9a\x02\ +\xff\x02\xc5\xff\x9a\x02\xff\x02\xc6\xffq\x02\xff\x02\xc7\xff\ +\x9a\x02\xff\x02\xc8\xffq\x02\xff\x02\xcb\xff\xd7\x02\xff\x02\ +\xcd\xff\x9a\x02\xff\x02\xce\xff\x9a\x02\xff\x02\xcf\xff\x85\x02\ +\xff\x02\xd1\xff\x9a\x02\xff\x02\xd3\xff\x9a\x02\xff\x02\xd5\xff\ +\x9a\x02\xff\x02\xd7\xff\x9a\x02\xff\x02\xd9\xffq\x02\xff\x02\ +\xdb\xffq\x02\xff\x02\xdd\xffq\x02\xff\x02\xe0\xffq\x02\ +\xff\x02\xe6\xff\xd7\x02\xff\x02\xe8\xff\xd7\x02\xff\x02\xea\xff\ +\xc3\x02\xff\x02\xec\xff\x9a\x02\xff\x02\xee\xff\x9a\x02\xff\x02\ +\xef\xff\xd7\x02\xff\x02\xf0\xffq\x02\xff\x02\xf1\xff\xd7\x02\ +\xff\x02\xf2\xffq\x02\xff\x02\xf3\xff\xd7\x02\xff\x02\xf4\xff\ +q\x02\xff\x02\xf6\xff\xd7\x02\xff\x02\xf8\xff\xae\x02\xff\x02\ +\xfa\xff\xae\x02\xff\x02\xfc\xff\xae\x02\xff\x02\xfe\xff\x9a\x02\ +\xff\x03\x00\xff\x9a\x02\xff\x03\x02\xff\x9a\x02\xff\x03\x06\xff\ +\xd7\x02\xff\x03\x08\xff\xd7\x02\xff\x03\x09\xffq\x02\xff\x03\ +\x0a\xffq\x02\xff\x03\x0b\xffq\x02\xff\x03\x0c\xffq\x02\ +\xff\x03\x0e\xff\x9a\x02\xff\x03\x10\xff\x9a\x02\xff\x03\x11\xff\ +\x9a\x02\xff\x03\x12\xff\x85\x02\xff\x03\x14\xff\x9a\x02\xff\x03\ +\x15\xff\xd7\x02\xff\x03\x16\xffq\x02\xff\x03\x18\xff\xae\x02\ +\xff\x03\x1a\xffq\x02\xff\x03\x1b\xff\x9a\x02\xff\x03\x1c\xff\ +\x85\x03\x00\x00\x0f\xff\x9a\x03\x00\x00\x10\xff\xd7\x03\x00\x00\ +\x11\xff\x9a\x03\x00\x01\xce\xff\xc3\x03\x00\x01\xcf\xff\xec\x03\ +\x00\x01\xd5\xff\xc3\x03\x00\x01\xd8\xff\xec\x03\x00\x01\xdb\xff\ +\xec\x03\x00\x01\xde\xff\xec\x03\x00\x01\xea\xff\xec\x03\x00\x01\ +\xed\xff\xec\x03\x00\x01\xf2\xff\xc3\x03\x00\x02\x02\xff\xd7\x03\ +\x00\x02\x03\xff\xd7\x03\x00\x02\x04\xff\xd7\x03\x00\x02\x08\xff\ +\x9a\x03\x00\x02\x0c\xff\x9a\x03\x00\x02j\xff\xec\x03\x00\x02\ +s\xff\xc3\x03\x00\x02\x7f\xff\xec\x03\x00\x02\x85\xff\xec\x03\ +\x00\x02\x87\xff\xec\x03\x00\x02\x89\xff\xec\x03\x00\x02\x8d\xff\ +\xec\x03\x00\x02\xb2\xff\xec\x03\x00\x02\xb4\xff\xec\x03\x00\x02\ +\xcf\xff\xc3\x03\x00\x02\xe0\xff\xec\x03\x00\x02\xf0\xff\xec\x03\ +\x00\x02\xf2\xff\xec\x03\x00\x02\xf4\xff\xec\x03\x00\x03\x0a\xff\ +\xec\x03\x00\x03\x0c\xff\xec\x03\x00\x03\x12\xff\xc3\x03\x00\x03\ +\x16\xff\xec\x03\x00\x03\x1a\xff\xec\x03\x00\x03\x1c\xff\xc3\x03\ +\x03\x00\x0f\xff\x9a\x03\x03\x00\x10\xff\xd7\x03\x03\x00\x11\xff\ +\x9a\x03\x03\x01\x9d\x00)\x03\x03\x01\x9f\xff\xd7\x03\x03\x01\ +\xa4\xff\xae\x03\x03\x01\xa6\x00)\x03\x03\x01\xaa\xff\x85\x03\ +\x03\x01\xae\xff\xae\x03\x03\x01\xb5\xff\xae\x03\x03\x01\xb8\xff\ +\xd7\x03\x03\x01\xbb\xff\xd7\x03\x03\x01\xbc\x00)\x03\x03\x01\ +\xbe\xff\xc3\x03\x03\x01\xc4\x00)\x03\x03\x01\xcc\xff\xc3\x03\ +\x03\x01\xcd\xff\xc3\x03\x03\x01\xce\xff\x9a\x03\x03\x01\xcf\xff\ +\xae\x03\x03\x01\xd0\xff\xd7\x03\x03\x01\xd1\xff\xd7\x03\x03\x01\ +\xd2\xff\xc3\x03\x03\x01\xd3\xff\xc3\x03\x03\x01\xd4\xff\xc3\x03\ +\x03\x01\xd5\xff\x9a\x03\x03\x01\xd6\xff\xc3\x03\x03\x01\xd7\xff\ +\xc3\x03\x03\x01\xd8\xff\xae\x03\x03\x01\xd9\xff\xc3\x03\x03\x01\ +\xda\xff\xc3\x03\x03\x01\xdb\xff\xae\x03\x03\x01\xde\xff\xae\x03\ +\x03\x01\xdf\xff\xd7\x03\x03\x01\xe0\xff\xc3\x03\x03\x01\xe1\xff\ +\x9a\x03\x03\x01\xe2\xff\xc3\x03\x03\x01\xe3\xff\xc3\x03\x03\x01\ +\xe5\xff\xc3\x03\x03\x01\xe6\xff\xc3\x03\x03\x01\xe7\xff\xd7\x03\ +\x03\x01\xe8\xff\xc3\x03\x03\x01\xea\xff\xae\x03\x03\x01\xeb\x00\ +)\x03\x03\x01\xec\xff\xc3\x03\x03\x01\xed\xff\xae\x03\x03\x01\ +\xee\xff\xc3\x03\x03\x01\xf2\xff\x9a\x03\x03\x01\xf3\xff\xc3\x03\ +\x03\x01\xf4\x00)\x03\x03\x01\xf5\xff\xc3\x03\x03\x01\xf7\xff\ +\xc3\x03\x03\x01\xf9\xff\xc3\x03\x03\x02\x02\xff\xd7\x03\x03\x02\ +\x03\xff\xd7\x03\x03\x02\x04\xff\xd7\x03\x03\x02\x08\xff\x9a\x03\ +\x03\x02\x0c\xff\x9a\x03\x03\x02j\xff\xae\x03\x03\x02k\xff\ +\xc3\x03\x03\x02l\xff\xd7\x03\x03\x02q\xff\xc3\x03\x03\x02\ +r\xff\x85\x03\x03\x02s\xff\x9a\x03\x03\x02u\xff\xc3\x03\ +\x03\x02w\xff\xd7\x03\x03\x02y\xff\xc3\x03\x03\x02}\xff\ +\xc3\x03\x03\x02~\xff\xd7\x03\x03\x02\x7f\xff\xae\x03\x03\x02\ +\x84\xff\xd7\x03\x03\x02\x85\xff\xae\x03\x03\x02\x86\xff\xd7\x03\ +\x03\x02\x87\xff\xae\x03\x03\x02\x88\xff\xd7\x03\x03\x02\x89\xff\ +\xae\x03\x03\x02\x8a\xff\xd7\x03\x03\x02\x8c\xff\xd7\x03\x03\x02\ +\x8d\xff\xae\x03\x03\x02\x96\xff\xc3\x03\x03\x02\x98\x00)\x03\ +\x03\x02\x9a\xff\xc3\x03\x03\x02\x9e\xff\xc3\x03\x03\x02\xa0\xff\ +\xd7\x03\x03\x02\xa2\xff\xd7\x03\x03\x02\xa4\xff\xc3\x03\x03\x02\ +\xa6\xff\xc3\x03\x03\x02\xa8\x00)\x03\x03\x02\xa9\x00)\x03\ +\x03\x02\xac\xff\xc3\x03\x03\x02\xae\xff\xc3\x03\x03\x02\xb0\xff\ +\xc3\x03\x03\x02\xb1\xff\xd7\x03\x03\x02\xb2\xff\xae\x03\x03\x02\ +\xb3\xff\xd7\x03\x03\x02\xb4\xff\xae\x03\x03\x02\xb5\x00)\x03\ +\x03\x02\xbc\xff\xd7\x03\x03\x02\xbd\x00)\x03\x03\x02\xc0\xff\ +\x9a\x03\x03\x02\xc2\xff\x9a\x03\x03\x02\xc4\xff\xc3\x03\x03\x02\ +\xc5\xff\xd7\x03\x03\x02\xc6\xff\xc3\x03\x03\x02\xc7\xff\xd7\x03\ +\x03\x02\xc8\xff\xc3\x03\x03\x02\xcb\xff\xd7\x03\x03\x02\xcd\xff\ +\xc3\x03\x03\x02\xce\xff\xae\x03\x03\x02\xcf\xff\x9a\x03\x03\x02\ +\xd1\xff\xc3\x03\x03\x02\xd3\xff\xc3\x03\x03\x02\xd5\xff\x9a\x03\ +\x03\x02\xd7\xff\xc3\x03\x03\x02\xd9\xff\x85\x03\x03\x02\xdb\xff\ +\x85\x03\x03\x02\xdd\xff\x85\x03\x03\x02\xe0\xff\xae\x03\x03\x02\ +\xe6\xff\xd7\x03\x03\x02\xe8\xff\xd7\x03\x03\x02\xec\xff\xc3\x03\ +\x03\x02\xee\xff\xc3\x03\x03\x02\xef\xff\xd7\x03\x03\x02\xf0\xff\ +\xae\x03\x03\x02\xf1\xff\xd7\x03\x03\x02\xf2\xff\xae\x03\x03\x02\ +\xf3\xff\xd7\x03\x03\x02\xf4\xff\xae\x03\x03\x02\xf6\xff\xd7\x03\ +\x03\x02\xfe\xff\x9a\x03\x03\x03\x00\xff\xc3\x03\x03\x03\x02\xff\ +\xc3\x03\x03\x03\x06\xff\xd7\x03\x03\x03\x08\xff\xd7\x03\x03\x03\ +\x09\xff\x9a\x03\x03\x03\x0a\xff\xae\x03\x03\x03\x0b\xff\x9a\x03\ +\x03\x03\x0c\xff\xae\x03\x03\x03\x0e\xff\xd7\x03\x03\x03\x10\xff\ +\xd7\x03\x03\x03\x11\xff\xae\x03\x03\x03\x12\xff\x9a\x03\x03\x03\ +\x14\xff\xc3\x03\x03\x03\x15\xff\xd7\x03\x03\x03\x16\xff\xae\x03\ +\x03\x03\x17\x00)\x03\x03\x03\x1a\xff\xae\x03\x03\x03\x1b\xff\ +\xae\x03\x03\x03\x1c\xff\x9a\x03\x04\x00\x0f\xff\xc3\x03\x04\x00\ +\x11\xff\xc3\x03\x04\x01\xce\xff\xc3\x03\x04\x01\xcf\xff\xd7\x03\ +\x04\x01\xd5\xff\xc3\x03\x04\x01\xd8\xff\xd7\x03\x04\x01\xdb\xff\ +\xd7\x03\x04\x01\xde\xff\xd7\x03\x04\x01\xea\xff\xd7\x03\x04\x01\ +\xed\xff\xd7\x03\x04\x01\xf2\xff\xc3\x03\x04\x02\x08\xff\xc3\x03\ +\x04\x02\x0c\xff\xc3\x03\x04\x02j\xff\xd7\x03\x04\x02s\xff\ +\xc3\x03\x04\x02\x7f\xff\xd7\x03\x04\x02\x85\xff\xd7\x03\x04\x02\ +\x87\xff\xd7\x03\x04\x02\x89\xff\xd7\x03\x04\x02\x8d\xff\xd7\x03\ +\x04\x02\xb2\xff\xd7\x03\x04\x02\xb4\xff\xd7\x03\x04\x02\xcf\xff\ +\xc3\x03\x04\x02\xe0\xff\xd7\x03\x04\x02\xf0\xff\xd7\x03\x04\x02\ +\xf2\xff\xd7\x03\x04\x02\xf4\xff\xd7\x03\x04\x03\x0a\xff\xd7\x03\ +\x04\x03\x0c\xff\xd7\x03\x04\x03\x12\xff\xc3\x03\x04\x03\x16\xff\ +\xd7\x03\x04\x03\x1a\xff\xd7\x03\x04\x03\x1c\xff\xc3\x03\x05\x01\ +\x9f\xff\xd7\x03\x05\x01\xa3\x00\xe1\x03\x05\x01\xb8\xff\xd7\x03\ +\x05\x01\xbb\xff\xd7\x03\x05\x01\xbe\xff\xc3\x03\x05\x01\xdc\xff\ +\xd7\x03\x05\x01\xe1\xff\xae\x03\x05\x01\xe4\xff\xd7\x03\x05\x02\ +l\xff\xd7\x03\x05\x02{\x00=\x03\x05\x02}\xff\xec\x03\ +\x05\x02~\xff\xd7\x03\x05\x02\x84\xff\xd7\x03\x05\x02\x86\xff\ +\xd7\x03\x05\x02\x88\xff\xd7\x03\x05\x02\x8a\xff\xd7\x03\x05\x02\ +\x8c\xff\xd7\x03\x05\x02\xaa\xff\xd7\x03\x05\x02\xb1\xff\xd7\x03\ +\x05\x02\xb3\xff\xd7\x03\x05\x02\xb6\xff\xd7\x03\x05\x02\xbe\xff\ +\xd7\x03\x05\x02\xc0\xff\xae\x03\x05\x02\xc2\xff\xae\x03\x05\x02\ +\xc5\xff\xc3\x03\x05\x02\xc6\xff\xd7\x03\x05\x02\xc7\xff\xc3\x03\ +\x05\x02\xc8\xff\xd7\x03\x05\x02\xd5\xff\xae\x03\x05\x02\xef\xff\ +\xd7\x03\x05\x02\xf1\xff\xd7\x03\x05\x02\xf3\xff\xd7\x03\x05\x02\ +\xfe\xff\xae\x03\x05\x03\x0e\xff\xd7\x03\x05\x03\x10\xff\xd7\x03\ +\x05\x03\x15\xff\xd7\x03\x05\x03\x18\xff\xd7\x03\x06\x01\xcf\xff\ +\xec\x03\x06\x01\xd8\xff\xec\x03\x06\x01\xdb\xff\xec\x03\x06\x01\ +\xde\xff\xec\x03\x06\x01\xe1\xff\xec\x03\x06\x01\xea\xff\xec\x03\ +\x06\x01\xed\xff\xec\x03\x06\x02j\xff\xec\x03\x06\x02\x7f\xff\ +\xec\x03\x06\x02\x85\xff\xec\x03\x06\x02\x87\xff\xec\x03\x06\x02\ +\x89\xff\xec\x03\x06\x02\x8d\xff\xec\x03\x06\x02\xb2\xff\xec\x03\ +\x06\x02\xb4\xff\xec\x03\x06\x02\xc0\xff\xec\x03\x06\x02\xc2\xff\ +\xec\x03\x06\x02\xd5\xff\xec\x03\x06\x02\xe0\xff\xec\x03\x06\x02\ +\xf0\xff\xec\x03\x06\x02\xf2\xff\xec\x03\x06\x02\xf4\xff\xec\x03\ +\x06\x02\xfe\xff\xec\x03\x06\x03\x0a\xff\xec\x03\x06\x03\x0c\xff\ +\xec\x03\x06\x03\x0e\xff\xd7\x03\x06\x03\x10\xff\xd7\x03\x06\x03\ +\x16\xff\xec\x03\x06\x03\x1a\xff\xec\x03\x07\x01\x9f\xff\xd7\x03\ +\x07\x01\xb8\xff\xd7\x03\x07\x01\xbb\xff\xd7\x03\x07\x01\xbe\xff\ +\xd7\x03\x07\x01\xc1\xff\xd7\x03\x07\x01\xe1\xff\xd7\x03\x07\x02\ +l\xff\xd7\x03\x07\x02|\xff\xd7\x03\x07\x02~\xff\xd7\x03\ +\x07\x02\x84\xff\xd7\x03\x07\x02\x86\xff\xd7\x03\x07\x02\x88\xff\ +\xd7\x03\x07\x02\x8a\xff\xd7\x03\x07\x02\x8c\xff\xd7\x03\x07\x02\ +\xb1\xff\xd7\x03\x07\x02\xb3\xff\xd7\x03\x07\x02\xbf\xff\xd7\x03\ +\x07\x02\xc0\xff\xd7\x03\x07\x02\xc1\xff\xd7\x03\x07\x02\xc2\xff\ +\xd7\x03\x07\x02\xc5\xff\x9a\x03\x07\x02\xc7\xff\x9a\x03\x07\x02\ +\xd4\xff\xd7\x03\x07\x02\xd5\xff\xd7\x03\x07\x02\xef\xff\xd7\x03\ +\x07\x02\xf1\xff\xd7\x03\x07\x02\xf3\xff\xd7\x03\x07\x02\xfd\xff\ +\xd7\x03\x07\x02\xfe\xff\xd7\x03\x07\x03\x09\xff\xd7\x03\x07\x03\ +\x0b\xff\xd7\x03\x07\x03\x0e\xff\xd7\x03\x07\x03\x10\xff\xd7\x03\ +\x07\x03\x15\xff\xd7\x03\x07\x03\x19\xff\xec\x03\x08\x01\xcf\xff\ +\xec\x03\x08\x01\xd8\xff\xec\x03\x08\x01\xdb\xff\xec\x03\x08\x01\ +\xde\xff\xec\x03\x08\x01\xe1\xff\xec\x03\x08\x01\xea\xff\xec\x03\ +\x08\x01\xed\xff\xec\x03\x08\x02j\xff\xec\x03\x08\x02\x7f\xff\ +\xec\x03\x08\x02\x85\xff\xec\x03\x08\x02\x87\xff\xec\x03\x08\x02\ +\x89\xff\xec\x03\x08\x02\x8d\xff\xec\x03\x08\x02\xb2\xff\xec\x03\ +\x08\x02\xb4\xff\xec\x03\x08\x02\xc0\xff\xec\x03\x08\x02\xc2\xff\ +\xec\x03\x08\x02\xd5\xff\xec\x03\x08\x02\xe0\xff\xec\x03\x08\x02\ +\xf0\xff\xec\x03\x08\x02\xf2\xff\xec\x03\x08\x02\xf4\xff\xec\x03\ +\x08\x02\xfe\xff\xec\x03\x08\x03\x0a\xff\xec\x03\x08\x03\x0c\xff\ +\xec\x03\x08\x03\x0e\xff\xd7\x03\x08\x03\x10\xff\xd7\x03\x08\x03\ +\x16\xff\xec\x03\x08\x03\x1a\xff\xec\x03\x0b\x00\x05\xff\x9a\x03\ +\x0b\x00\x0a\xff\x9a\x03\x0b\x01\x9d\xff\xae\x03\x0b\x01\xa6\xff\ +\xae\x03\x0b\x01\xa8\xff\xc3\x03\x0b\x01\xaa\xff\xc3\x03\x0b\x01\ +\xb0\xff\xc3\x03\x0b\x01\xbc\xffq\x03\x0b\x01\xbd\xff\xc3\x03\ +\x0b\x01\xbf\xff\xc3\x03\x0b\x01\xc1\xff\xc3\x03\x0b\x01\xc4\xff\ +\xae\x03\x0b\x01\xd0\xff\xd7\x03\x0b\x01\xdc\xff\xc3\x03\x0b\x01\ +\xdf\xff\xd7\x03\x0b\x01\xe1\xff\xd7\x03\x0b\x01\xe4\xff\xc3\x03\ +\x0b\x02\x07\xff\x9a\x03\x0b\x02\x0b\xff\x9a\x03\x0b\x02r\xff\ +\xc3\x03\x0b\x02v\xff\xd7\x03\x0b\x02|\xff\xc3\x03\x0b\x02\ +\x80\xff\xc3\x03\x0b\x02\x82\xff\xc3\x03\x0b\x02\x9f\xff\xc3\x03\ +\x0b\x02\xa0\xff\xd7\x03\x0b\x02\xa9\xff\xae\x03\x0b\x02\xaa\xff\ +\xc3\x03\x0b\x02\xb5\xffq\x03\x0b\x02\xb6\xff\xc3\x03\x0b\x02\ +\xb7\xff\xc3\x03\x0b\x02\xb9\xff\xc3\x03\x0b\x02\xbb\xff\xc3\x03\ +\x0b\x02\xbc\xff\xd7\x03\x0b\x02\xbd\xff\xae\x03\x0b\x02\xbe\xff\ +\xc3\x03\x0b\x02\xbf\xff\xc3\x03\x0b\x02\xc0\xff\xd7\x03\x0b\x02\ +\xc1\xff\xc3\x03\x0b\x02\xc2\xff\xd7\x03\x0b\x02\xca\xff\xc3\x03\ +\x0b\x02\xcb\xff\xd7\x03\x0b\x02\xd4\xff\xc3\x03\x0b\x02\xd5\xff\ +\xd7\x03\x0b\x02\xd9\xff\xc3\x03\x0b\x02\xdb\xff\xc3\x03\x0b\x02\ +\xdd\xff\xc3\x03\x0b\x02\xe5\xff\xc3\x03\x0b\x02\xe6\xff\xd7\x03\ +\x0b\x02\xf7\xff\xc3\x03\x0b\x02\xf9\xff\xc3\x03\x0b\x02\xfb\xff\ +\xc3\x03\x0b\x02\xfd\xff\xc3\x03\x0b\x02\xfe\xff\xd7\x03\x0b\x03\ +\x05\xff\xc3\x03\x0b\x03\x06\xff\xd7\x03\x0b\x03\x07\xff\xc3\x03\ +\x0b\x03\x08\xff\xd7\x03\x0b\x03\x0d\xff\xd7\x03\x0b\x03\x0e\xff\ +\xd7\x03\x0b\x03\x0f\xff\xd7\x03\x0b\x03\x10\xff\xd7\x03\x0b\x03\ +\x17\xff\xae\x03\x0b\x03\x18\xff\xc3\x03\x0c\x00\x05\xff\x9a\x03\ +\x0c\x00\x0a\xff\x9a\x03\x0c\x01\xd0\xff\xd7\x03\x0c\x01\xdc\xff\ +\xc3\x03\x0c\x01\xdd\xff\xd7\x03\x0c\x01\xdf\xff\xd7\x03\x0c\x01\ +\xe1\xff\xd7\x03\x0c\x01\xe4\xff\xc3\x03\x0c\x01\xf6\xff\xd7\x03\ +\x0c\x02\x07\xff\x9a\x03\x0c\x02\x0b\xff\x9a\x03\x0c\x02\xa0\xff\ +\xd7\x03\x0c\x02\xaa\xff\xc3\x03\x0c\x02\xb6\xff\xc3\x03\x0c\x02\ +\xbc\xff\xd7\x03\x0c\x02\xbe\xff\xc3\x03\x0c\x02\xc0\xff\xd7\x03\ +\x0c\x02\xc2\xff\xd7\x03\x0c\x02\xcb\xff\xd7\x03\x0c\x02\xd5\xff\ +\xd7\x03\x0c\x02\xe6\xff\xd7\x03\x0c\x02\xf8\xff\xd7\x03\x0c\x02\ +\xfa\xff\xd7\x03\x0c\x02\xfc\xff\xd7\x03\x0c\x02\xfe\xff\xd7\x03\ +\x0c\x03\x06\xff\xd7\x03\x0c\x03\x08\xff\xd7\x03\x0c\x03\x0e\xff\ +\x9a\x03\x0c\x03\x10\xff\x9a\x03\x0c\x03\x18\xff\xc3\x03\x0d\x00\ +\x05\xff\x9a\x03\x0d\x00\x0a\xff\x9a\x03\x0d\x01\x9d\xff\xae\x03\ +\x0d\x01\xa6\xff\xae\x03\x0d\x01\xa8\xff\xc3\x03\x0d\x01\xaa\xff\ +\xc3\x03\x0d\x01\xb0\xff\xc3\x03\x0d\x01\xbc\xffq\x03\x0d\x01\ +\xbd\xff\xc3\x03\x0d\x01\xbf\xff\xc3\x03\x0d\x01\xc1\xff\xc3\x03\ +\x0d\x01\xc4\xff\xae\x03\x0d\x01\xd0\xff\xd7\x03\x0d\x01\xdc\xff\ +\xc3\x03\x0d\x01\xdf\xff\xd7\x03\x0d\x01\xe1\xff\xd7\x03\x0d\x01\ +\xe4\xff\xc3\x03\x0d\x02\x07\xff\x9a\x03\x0d\x02\x0b\xff\x9a\x03\ +\x0d\x02r\xff\xc3\x03\x0d\x02v\xff\xd7\x03\x0d\x02|\xff\ +\xc3\x03\x0d\x02\x80\xff\xc3\x03\x0d\x02\x82\xff\xc3\x03\x0d\x02\ +\x9f\xff\xc3\x03\x0d\x02\xa0\xff\xd7\x03\x0d\x02\xa9\xff\xae\x03\ +\x0d\x02\xaa\xff\xc3\x03\x0d\x02\xb5\xffq\x03\x0d\x02\xb6\xff\ +\xc3\x03\x0d\x02\xb7\xff\xc3\x03\x0d\x02\xb9\xff\xc3\x03\x0d\x02\ +\xbb\xff\xc3\x03\x0d\x02\xbc\xff\xd7\x03\x0d\x02\xbd\xff\xae\x03\ +\x0d\x02\xbe\xff\xc3\x03\x0d\x02\xbf\xff\xc3\x03\x0d\x02\xc0\xff\ +\xd7\x03\x0d\x02\xc1\xff\xc3\x03\x0d\x02\xc2\xff\xd7\x03\x0d\x02\ +\xca\xff\xc3\x03\x0d\x02\xcb\xff\xd7\x03\x0d\x02\xd4\xff\xc3\x03\ +\x0d\x02\xd5\xff\xd7\x03\x0d\x02\xd9\xff\xc3\x03\x0d\x02\xdb\xff\ +\xc3\x03\x0d\x02\xdd\xff\xc3\x03\x0d\x02\xe5\xff\xc3\x03\x0d\x02\ +\xe6\xff\xd7\x03\x0d\x02\xf7\xff\xc3\x03\x0d\x02\xf9\xff\xc3\x03\ +\x0d\x02\xfb\xff\xc3\x03\x0d\x02\xfd\xff\xc3\x03\x0d\x02\xfe\xff\ +\xd7\x03\x0d\x03\x05\xff\xc3\x03\x0d\x03\x06\xff\xd7\x03\x0d\x03\ +\x07\xff\xc3\x03\x0d\x03\x08\xff\xd7\x03\x0d\x03\x0d\xff\xd7\x03\ +\x0d\x03\x0e\xff\xd7\x03\x0d\x03\x0f\xff\xd7\x03\x0d\x03\x10\xff\ +\xd7\x03\x0d\x03\x17\xff\xae\x03\x0d\x03\x18\xff\xc3\x03\x0e\x00\ +\x05\xff\x9a\x03\x0e\x00\x0a\xff\x9a\x03\x0e\x01\xd0\xff\xd7\x03\ +\x0e\x01\xdc\xff\xc3\x03\x0e\x01\xdd\xff\xd7\x03\x0e\x01\xdf\xff\ +\xd7\x03\x0e\x01\xe1\xff\xd7\x03\x0e\x01\xe4\xff\xc3\x03\x0e\x01\ +\xf6\xff\xd7\x03\x0e\x02\x07\xff\x9a\x03\x0e\x02\x0b\xff\x9a\x03\ +\x0e\x02\xa0\xff\xd7\x03\x0e\x02\xaa\xff\xc3\x03\x0e\x02\xb6\xff\ +\xc3\x03\x0e\x02\xbc\xff\xd7\x03\x0e\x02\xbe\xff\xc3\x03\x0e\x02\ +\xc0\xff\xd7\x03\x0e\x02\xc2\xff\xd7\x03\x0e\x02\xcb\xff\xd7\x03\ +\x0e\x02\xd5\xff\xd7\x03\x0e\x02\xe6\xff\xd7\x03\x0e\x02\xf8\xff\ +\xd7\x03\x0e\x02\xfa\xff\xd7\x03\x0e\x02\xfc\xff\xd7\x03\x0e\x02\ +\xfe\xff\xd7\x03\x0e\x03\x06\xff\xd7\x03\x0e\x03\x08\xff\xd7\x03\ +\x0e\x03\x0e\xff\x9a\x03\x0e\x03\x10\xff\x9a\x03\x0e\x03\x18\xff\ +\xc3\x03\x0f\x01\xa3\x00\xe1\x03\x0f\x02\xea\x00)\x03\x0f\x03\ +\x0e\xff\xd7\x03\x0f\x03\x10\xff\xd7\x03\x10\x00\x05\xff\xec\x03\ +\x10\x00\x0a\xff\xec\x03\x10\x02\x07\xff\xec\x03\x10\x02\x0b\xff\ +\xec\x03\x11\x00\x05\xff\x9a\x03\x11\x00\x0a\xff\x9a\x03\x11\x01\ +\x9d\xff\xae\x03\x11\x01\xa6\xff\xae\x03\x11\x01\xa8\xff\xc3\x03\ +\x11\x01\xaa\xff\xc3\x03\x11\x01\xb0\xff\xc3\x03\x11\x01\xbc\xff\ +q\x03\x11\x01\xbd\xff\xc3\x03\x11\x01\xbf\xff\xc3\x03\x11\x01\ +\xc1\xff\xc3\x03\x11\x01\xc4\xff\xae\x03\x11\x01\xd0\xff\xd7\x03\ +\x11\x01\xdc\xff\xc3\x03\x11\x01\xdf\xff\xd7\x03\x11\x01\xe1\xff\ +\xd7\x03\x11\x01\xe4\xff\xc3\x03\x11\x02\x07\xff\x9a\x03\x11\x02\ +\x0b\xff\x9a\x03\x11\x02r\xff\xc3\x03\x11\x02v\xff\xd7\x03\ +\x11\x02|\xff\xc3\x03\x11\x02\x80\xff\xc3\x03\x11\x02\x82\xff\ +\xc3\x03\x11\x02\x9f\xff\xc3\x03\x11\x02\xa0\xff\xd7\x03\x11\x02\ +\xa9\xff\xae\x03\x11\x02\xaa\xff\xc3\x03\x11\x02\xb5\xffq\x03\ +\x11\x02\xb6\xff\xc3\x03\x11\x02\xb7\xff\xc3\x03\x11\x02\xb9\xff\ +\xc3\x03\x11\x02\xbb\xff\xc3\x03\x11\x02\xbc\xff\xd7\x03\x11\x02\ +\xbd\xff\xae\x03\x11\x02\xbe\xff\xc3\x03\x11\x02\xbf\xff\xc3\x03\ +\x11\x02\xc0\xff\xd7\x03\x11\x02\xc1\xff\xc3\x03\x11\x02\xc2\xff\ +\xd7\x03\x11\x02\xca\xff\xc3\x03\x11\x02\xcb\xff\xd7\x03\x11\x02\ +\xd4\xff\xc3\x03\x11\x02\xd5\xff\xd7\x03\x11\x02\xd9\xff\xc3\x03\ +\x11\x02\xdb\xff\xc3\x03\x11\x02\xdd\xff\xc3\x03\x11\x02\xe5\xff\ +\xc3\x03\x11\x02\xe6\xff\xd7\x03\x11\x02\xf7\xff\xc3\x03\x11\x02\ +\xf9\xff\xc3\x03\x11\x02\xfb\xff\xc3\x03\x11\x02\xfd\xff\xc3\x03\ +\x11\x02\xfe\xff\xd7\x03\x11\x03\x05\xff\xc3\x03\x11\x03\x06\xff\ +\xd7\x03\x11\x03\x07\xff\xc3\x03\x11\x03\x08\xff\xd7\x03\x11\x03\ +\x0d\xff\xd7\x03\x11\x03\x0e\xff\xd7\x03\x11\x03\x0f\xff\xd7\x03\ +\x11\x03\x10\xff\xd7\x03\x11\x03\x17\xff\xae\x03\x11\x03\x18\xff\ +\xc3\x03\x12\x00\x05\xff\x9a\x03\x12\x00\x0a\xff\x9a\x03\x12\x01\ +\xd0\xff\xd7\x03\x12\x01\xdc\xff\xc3\x03\x12\x01\xdd\xff\xd7\x03\ +\x12\x01\xdf\xff\xd7\x03\x12\x01\xe1\xff\xd7\x03\x12\x01\xe4\xff\ +\xc3\x03\x12\x01\xf6\xff\xd7\x03\x12\x02\x07\xff\x9a\x03\x12\x02\ +\x0b\xff\x9a\x03\x12\x02\xa0\xff\xd7\x03\x12\x02\xaa\xff\xc3\x03\ +\x12\x02\xb6\xff\xc3\x03\x12\x02\xbc\xff\xd7\x03\x12\x02\xbe\xff\ +\xc3\x03\x12\x02\xc0\xff\xd7\x03\x12\x02\xc2\xff\xd7\x03\x12\x02\ +\xcb\xff\xd7\x03\x12\x02\xd5\xff\xd7\x03\x12\x02\xe6\xff\xd7\x03\ +\x12\x02\xf8\xff\xd7\x03\x12\x02\xfa\xff\xd7\x03\x12\x02\xfc\xff\ +\xd7\x03\x12\x02\xfe\xff\xd7\x03\x12\x03\x06\xff\xd7\x03\x12\x03\ +\x08\xff\xd7\x03\x12\x03\x0e\xff\x9a\x03\x12\x03\x10\xff\x9a\x03\ +\x12\x03\x18\xff\xc3\x03\x13\x00\x05\xff\x9a\x03\x13\x00\x0a\xff\ +\x9a\x03\x13\x01\x9d\xff\xae\x03\x13\x01\xa6\xff\xae\x03\x13\x01\ +\xa8\xff\xc3\x03\x13\x01\xaa\xff\xc3\x03\x13\x01\xb0\xff\xc3\x03\ +\x13\x01\xbc\xffq\x03\x13\x01\xbd\xff\xc3\x03\x13\x01\xbf\xff\ +\xc3\x03\x13\x01\xc1\xff\xc3\x03\x13\x01\xc4\xff\xae\x03\x13\x01\ +\xd0\xff\xd7\x03\x13\x01\xdc\xff\xc3\x03\x13\x01\xdf\xff\xd7\x03\ +\x13\x01\xe1\xff\xd7\x03\x13\x01\xe4\xff\xc3\x03\x13\x02\x07\xff\ +\x9a\x03\x13\x02\x0b\xff\x9a\x03\x13\x02r\xff\xc3\x03\x13\x02\ +v\xff\xd7\x03\x13\x02|\xff\xc3\x03\x13\x02\x80\xff\xc3\x03\ +\x13\x02\x82\xff\xc3\x03\x13\x02\x9f\xff\xc3\x03\x13\x02\xa0\xff\ +\xd7\x03\x13\x02\xa9\xff\xae\x03\x13\x02\xaa\xff\xc3\x03\x13\x02\ +\xb5\xffq\x03\x13\x02\xb6\xff\xc3\x03\x13\x02\xb7\xff\xc3\x03\ +\x13\x02\xb9\xff\xc3\x03\x13\x02\xbb\xff\xc3\x03\x13\x02\xbc\xff\ +\xd7\x03\x13\x02\xbd\xff\xae\x03\x13\x02\xbe\xff\xc3\x03\x13\x02\ +\xbf\xff\xc3\x03\x13\x02\xc0\xff\xd7\x03\x13\x02\xc1\xff\xc3\x03\ +\x13\x02\xc2\xff\xd7\x03\x13\x02\xca\xff\xc3\x03\x13\x02\xcb\xff\ +\xd7\x03\x13\x02\xd4\xff\xc3\x03\x13\x02\xd5\xff\xd7\x03\x13\x02\ +\xd9\xff\xc3\x03\x13\x02\xdb\xff\xc3\x03\x13\x02\xdd\xff\xc3\x03\ +\x13\x02\xe5\xff\xc3\x03\x13\x02\xe6\xff\xd7\x03\x13\x02\xf7\xff\ +\xc3\x03\x13\x02\xf9\xff\xc3\x03\x13\x02\xfb\xff\xc3\x03\x13\x02\ +\xfd\xff\xc3\x03\x13\x02\xfe\xff\xd7\x03\x13\x03\x05\xff\xc3\x03\ +\x13\x03\x06\xff\xd7\x03\x13\x03\x07\xff\xc3\x03\x13\x03\x08\xff\ +\xd7\x03\x13\x03\x0d\xff\xd7\x03\x13\x03\x0e\xff\xd7\x03\x13\x03\ +\x0f\xff\xd7\x03\x13\x03\x10\xff\xd7\x03\x13\x03\x17\xff\xae\x03\ +\x13\x03\x18\xff\xc3\x03\x14\x00\x05\xff\x9a\x03\x14\x00\x0a\xff\ +\x9a\x03\x14\x01\xd0\xff\xd7\x03\x14\x01\xdc\xff\xc3\x03\x14\x01\ +\xdd\xff\xd7\x03\x14\x01\xdf\xff\xd7\x03\x14\x01\xe1\xff\xd7\x03\ +\x14\x01\xe4\xff\xc3\x03\x14\x01\xf6\xff\xd7\x03\x14\x02\x07\xff\ +\x9a\x03\x14\x02\x0b\xff\x9a\x03\x14\x02\xa0\xff\xd7\x03\x14\x02\ +\xaa\xff\xc3\x03\x14\x02\xb6\xff\xc3\x03\x14\x02\xbc\xff\xd7\x03\ +\x14\x02\xbe\xff\xc3\x03\x14\x02\xc0\xff\xd7\x03\x14\x02\xc2\xff\ +\xd7\x03\x14\x02\xcb\xff\xd7\x03\x14\x02\xd5\xff\xd7\x03\x14\x02\ +\xe6\xff\xd7\x03\x14\x02\xf8\xff\xd7\x03\x14\x02\xfa\xff\xd7\x03\ +\x14\x02\xfc\xff\xd7\x03\x14\x02\xfe\xff\xd7\x03\x14\x03\x06\xff\ +\xd7\x03\x14\x03\x08\xff\xd7\x03\x14\x03\x0e\xff\x9a\x03\x14\x03\ +\x10\xff\x9a\x03\x14\x03\x18\xff\xc3\x03\x15\x00\x0f\xff\xae\x03\ +\x15\x00\x11\xff\xae\x03\x15\x01\xaa\xff\xec\x03\x15\x01\xb0\xff\ +\xd7\x03\x15\x01\xbc\xff\xd7\x03\x15\x01\xbf\xff\xd7\x03\x15\x02\ +\x08\xff\xae\x03\x15\x02\x0c\xff\xae\x03\x15\x02r\xff\xec\x03\ +\x15\x02\x80\xff\xec\x03\x15\x02\x82\xff\xec\x03\x15\x02\x9f\xff\ +\xd7\x03\x15\x02\xb5\xff\xd7\x03\x15\x02\xb7\xff\xec\x03\x15\x02\ +\xb9\xff\xec\x03\x15\x02\xbb\xff\xd7\x03\x15\x02\xca\xff\xd7\x03\ +\x15\x02\xd9\xff\xec\x03\x15\x02\xdb\xff\xec\x03\x15\x02\xdd\xff\ +\xec\x03\x15\x02\xe5\xff\xd7\x03\x15\x03\x05\xff\xd7\x03\x15\x03\ +\x07\xff\xd7\x03\x16\x00\x05\xff\xd7\x03\x16\x00\x0a\xff\xd7\x03\ +\x16\x01\xd0\xff\xec\x03\x16\x01\xdd\xff\xec\x03\x16\x01\xdf\xff\ +\xec\x03\x16\x01\xf6\xff\xec\x03\x16\x02\x07\xff\xd7\x03\x16\x02\ +\x0b\xff\xd7\x03\x16\x02\xa0\xff\xec\x03\x16\x02\xbc\xff\xec\x03\ +\x16\x02\xcb\xff\xec\x03\x16\x02\xe6\xff\xec\x03\x16\x02\xf8\xff\ +\xec\x03\x16\x02\xfa\xff\xec\x03\x16\x02\xfc\xff\xec\x03\x16\x03\ +\x06\xff\xec\x03\x16\x03\x08\xff\xec\x03\x16\x03\x0e\xff\xd7\x03\ +\x16\x03\x10\xff\xd7\x03\x17\x00\x05\xff\xae\x03\x17\x00\x0a\xff\ +\xae\x03\x17\x01\x9d\xff\xc3\x03\x17\x01\xa6\xff\xc3\x03\x17\x01\ +\xaa\xff\xd7\x03\x17\x01\xb0\xff\xd7\x03\x17\x01\xbc\xff\xc3\x03\ +\x17\x01\xbf\xff\xd7\x03\x17\x01\xc1\xff\xd7\x03\x17\x01\xc4\xff\ +\xc3\x03\x17\x01\xdc\xff\xd7\x03\x17\x01\xe4\xff\xd7\x03\x17\x02\ +\x07\xff\xae\x03\x17\x02\x0b\xff\xae\x03\x17\x02r\xff\xd7\x03\ +\x17\x02|\xff\xd7\x03\x17\x02\x80\xff\xd7\x03\x17\x02\x82\xff\ +\xd7\x03\x17\x02\x9f\xff\xd7\x03\x17\x02\xa9\xff\xc3\x03\x17\x02\ +\xaa\xff\xd7\x03\x17\x02\xb5\xff\xc3\x03\x17\x02\xb6\xff\xd7\x03\ +\x17\x02\xb7\xff\xd7\x03\x17\x02\xb9\xff\xd7\x03\x17\x02\xbb\xff\ +\xd7\x03\x17\x02\xbd\xff\xc3\x03\x17\x02\xbe\xff\xd7\x03\x17\x02\ +\xbf\xff\xd7\x03\x17\x02\xc1\xff\xd7\x03\x17\x02\xca\xff\xd7\x03\ +\x17\x02\xd4\xff\xd7\x03\x17\x02\xd9\xff\xd7\x03\x17\x02\xdb\xff\ +\xd7\x03\x17\x02\xdd\xff\xd7\x03\x17\x02\xe5\xff\xd7\x03\x17\x02\ +\xfd\xff\xd7\x03\x17\x03\x05\xff\xd7\x03\x17\x03\x07\xff\xd7\x03\ +\x17\x03\x0d\xff\xd7\x03\x17\x03\x0f\xff\xd7\x03\x17\x03\x17\xff\ +\xc3\x03\x17\x03\x18\xff\xd7\x03\x18\x00\x05\xff\x9a\x03\x18\x00\ +\x0a\xff\x9a\x03\x18\x01\xd0\xff\xd7\x03\x18\x01\xdc\xff\xc3\x03\ +\x18\x01\xdd\xff\xd7\x03\x18\x01\xdf\xff\xd7\x03\x18\x01\xe1\xff\ +\xd7\x03\x18\x01\xe4\xff\xc3\x03\x18\x01\xf6\xff\xd7\x03\x18\x02\ +\x07\xff\x9a\x03\x18\x02\x0b\xff\x9a\x03\x18\x02\xa0\xff\xd7\x03\ +\x18\x02\xaa\xff\xc3\x03\x18\x02\xb6\xff\xc3\x03\x18\x02\xbc\xff\ +\xd7\x03\x18\x02\xbe\xff\xc3\x03\x18\x02\xc0\xff\xd7\x03\x18\x02\ +\xc2\xff\xd7\x03\x18\x02\xcb\xff\xd7\x03\x18\x02\xd5\xff\xd7\x03\ +\x18\x02\xe6\xff\xd7\x03\x18\x02\xf8\xff\xd7\x03\x18\x02\xfa\xff\ +\xd7\x03\x18\x02\xfc\xff\xd7\x03\x18\x02\xfe\xff\xd7\x03\x18\x03\ +\x06\xff\xd7\x03\x18\x03\x08\xff\xd7\x03\x18\x03\x0e\xff\x9a\x03\ +\x18\x03\x10\xff\x9a\x03\x18\x03\x18\xff\xc3\x03\x19\x01\xe1\xff\ +\xd7\x03\x19\x02\xc0\xff\xd7\x03\x19\x02\xc2\xff\xd7\x03\x19\x02\ +\xd5\xff\xd7\x03\x19\x02\xfe\xff\xd7\x03\x1b\x01\xa3\x00\xe1\x03\ +\x1b\x02\xea\x00)\x03\x1b\x03\x0e\xff\xd7\x03\x1b\x03\x10\xff\ +\xd7\x03\x1c\x00\x05\xff\xec\x03\x1c\x00\x0a\xff\xec\x03\x1c\x02\ +\x07\xff\xec\x03\x1c\x02\x0b\xff\xec\x03\x1d\x00\x05\xffq\x03\ +\x1d\x00\x0a\xffq\x03\x1d\x00&\xff\xd7\x03\x1d\x00*\xff\ +\xd7\x03\x1d\x00-\x01\x0a\x03\x1d\x002\xff\xd7\x03\x1d\x00\ +4\xff\xd7\x03\x1d\x007\xffq\x03\x1d\x009\xff\xae\x03\ +\x1d\x00:\xff\xae\x03\x1d\x00<\xff\x85\x03\x1d\x00\x89\xff\ +\xd7\x03\x1d\x00\x94\xff\xd7\x03\x1d\x00\x95\xff\xd7\x03\x1d\x00\ +\x96\xff\xd7\x03\x1d\x00\x97\xff\xd7\x03\x1d\x00\x98\xff\xd7\x03\ +\x1d\x00\x9a\xff\xd7\x03\x1d\x00\x9f\xff\x85\x03\x1d\x00\xc8\xff\ +\xd7\x03\x1d\x00\xca\xff\xd7\x03\x1d\x00\xcc\xff\xd7\x03\x1d\x00\ +\xce\xff\xd7\x03\x1d\x00\xde\xff\xd7\x03\x1d\x00\xe0\xff\xd7\x03\ +\x1d\x00\xe2\xff\xd7\x03\x1d\x00\xe4\xff\xd7\x03\x1d\x01\x0e\xff\ +\xd7\x03\x1d\x01\x10\xff\xd7\x03\x1d\x01\x12\xff\xd7\x03\x1d\x01\ +\x14\xff\xd7\x03\x1d\x01$\xffq\x03\x1d\x01&\xffq\x03\ +\x1d\x016\xff\xae\x03\x1d\x018\xff\x85\x03\x1d\x01:\xff\ +\x85\x03\x1d\x01G\xff\xd7\x03\x1d\x01\xfa\xff\xae\x03\x1d\x01\ +\xfc\xff\xae\x03\x1d\x01\xfe\xff\xae\x03\x1d\x02\x00\xff\x85\x03\ +\x1d\x02\x07\xffq\x03\x1d\x02\x0b\xffq\x03\x1d\x02_\xff\ +\xd7\x03\x1d\x03I\xff\xd7\x03\x1d\x03K\xff\xd7\x03\x1d\x03\ +M\xff\xd7\x03\x1d\x03O\xff\xd7\x03\x1d\x03Q\xff\xd7\x03\ +\x1d\x03S\xff\xd7\x03\x1d\x03U\xff\xd7\x03\x1d\x03W\xff\ +\xd7\x03\x1d\x03Y\xff\xd7\x03\x1d\x03[\xff\xd7\x03\x1d\x03\ +]\xff\xd7\x03\x1d\x03_\xff\xd7\x03\x1d\x03o\xff\x85\x03\ +\x1d\x03q\xff\x85\x03\x1d\x03s\xff\x85\x03\x1d\x03\x8f\xff\ +q\x03\x1e\x00\x05\xff\xec\x03\x1e\x00\x0a\xff\xec\x03\x1e\x02\ +\x07\xff\xec\x03\x1e\x02\x0b\xff\xec\x03\x1f\x00\x05\xffq\x03\ +\x1f\x00\x0a\xffq\x03\x1f\x00&\xff\xd7\x03\x1f\x00*\xff\ +\xd7\x03\x1f\x00-\x01\x0a\x03\x1f\x002\xff\xd7\x03\x1f\x00\ +4\xff\xd7\x03\x1f\x007\xffq\x03\x1f\x009\xff\xae\x03\ +\x1f\x00:\xff\xae\x03\x1f\x00<\xff\x85\x03\x1f\x00\x89\xff\ +\xd7\x03\x1f\x00\x94\xff\xd7\x03\x1f\x00\x95\xff\xd7\x03\x1f\x00\ +\x96\xff\xd7\x03\x1f\x00\x97\xff\xd7\x03\x1f\x00\x98\xff\xd7\x03\ +\x1f\x00\x9a\xff\xd7\x03\x1f\x00\x9f\xff\x85\x03\x1f\x00\xc8\xff\ +\xd7\x03\x1f\x00\xca\xff\xd7\x03\x1f\x00\xcc\xff\xd7\x03\x1f\x00\ +\xce\xff\xd7\x03\x1f\x00\xde\xff\xd7\x03\x1f\x00\xe0\xff\xd7\x03\ +\x1f\x00\xe2\xff\xd7\x03\x1f\x00\xe4\xff\xd7\x03\x1f\x01\x0e\xff\ +\xd7\x03\x1f\x01\x10\xff\xd7\x03\x1f\x01\x12\xff\xd7\x03\x1f\x01\ +\x14\xff\xd7\x03\x1f\x01$\xffq\x03\x1f\x01&\xffq\x03\ +\x1f\x016\xff\xae\x03\x1f\x018\xff\x85\x03\x1f\x01:\xff\ +\x85\x03\x1f\x01G\xff\xd7\x03\x1f\x01\xfa\xff\xae\x03\x1f\x01\ +\xfc\xff\xae\x03\x1f\x01\xfe\xff\xae\x03\x1f\x02\x00\xff\x85\x03\ +\x1f\x02\x07\xffq\x03\x1f\x02\x0b\xffq\x03\x1f\x02_\xff\ +\xd7\x03\x1f\x03I\xff\xd7\x03\x1f\x03K\xff\xd7\x03\x1f\x03\ +M\xff\xd7\x03\x1f\x03O\xff\xd7\x03\x1f\x03Q\xff\xd7\x03\ +\x1f\x03S\xff\xd7\x03\x1f\x03U\xff\xd7\x03\x1f\x03W\xff\ +\xd7\x03\x1f\x03Y\xff\xd7\x03\x1f\x03[\xff\xd7\x03\x1f\x03\ +]\xff\xd7\x03\x1f\x03_\xff\xd7\x03\x1f\x03o\xff\x85\x03\ +\x1f\x03q\xff\x85\x03\x1f\x03s\xff\x85\x03\x1f\x03\x8f\xff\ +q\x03 \x00\x05\xff\xec\x03 \x00\x0a\xff\xec\x03 \x02\ +\x07\xff\xec\x03 \x02\x0b\xff\xec\x03!\x00\x05\xffq\x03\ +!\x00\x0a\xffq\x03!\x00&\xff\xd7\x03!\x00*\xff\ +\xd7\x03!\x00-\x01\x0a\x03!\x002\xff\xd7\x03!\x00\ +4\xff\xd7\x03!\x007\xffq\x03!\x009\xff\xae\x03\ +!\x00:\xff\xae\x03!\x00<\xff\x85\x03!\x00\x89\xff\ +\xd7\x03!\x00\x94\xff\xd7\x03!\x00\x95\xff\xd7\x03!\x00\ +\x96\xff\xd7\x03!\x00\x97\xff\xd7\x03!\x00\x98\xff\xd7\x03\ +!\x00\x9a\xff\xd7\x03!\x00\x9f\xff\x85\x03!\x00\xc8\xff\ +\xd7\x03!\x00\xca\xff\xd7\x03!\x00\xcc\xff\xd7\x03!\x00\ +\xce\xff\xd7\x03!\x00\xde\xff\xd7\x03!\x00\xe0\xff\xd7\x03\ +!\x00\xe2\xff\xd7\x03!\x00\xe4\xff\xd7\x03!\x01\x0e\xff\ +\xd7\x03!\x01\x10\xff\xd7\x03!\x01\x12\xff\xd7\x03!\x01\ +\x14\xff\xd7\x03!\x01$\xffq\x03!\x01&\xffq\x03\ +!\x016\xff\xae\x03!\x018\xff\x85\x03!\x01:\xff\ +\x85\x03!\x01G\xff\xd7\x03!\x01\xfa\xff\xae\x03!\x01\ +\xfc\xff\xae\x03!\x01\xfe\xff\xae\x03!\x02\x00\xff\x85\x03\ +!\x02\x07\xffq\x03!\x02\x0b\xffq\x03!\x02_\xff\ +\xd7\x03!\x03I\xff\xd7\x03!\x03K\xff\xd7\x03!\x03\ +M\xff\xd7\x03!\x03O\xff\xd7\x03!\x03Q\xff\xd7\x03\ +!\x03S\xff\xd7\x03!\x03U\xff\xd7\x03!\x03W\xff\ +\xd7\x03!\x03Y\xff\xd7\x03!\x03[\xff\xd7\x03!\x03\ +]\xff\xd7\x03!\x03_\xff\xd7\x03!\x03o\xff\x85\x03\ +!\x03q\xff\x85\x03!\x03s\xff\x85\x03!\x03\x8f\xff\ +q\x03\x22\x00\x05\xff\xec\x03\x22\x00\x0a\xff\xec\x03\x22\x02\ +\x07\xff\xec\x03\x22\x02\x0b\xff\xec\x03#\x00\x05\xffq\x03\ +#\x00\x0a\xffq\x03#\x00&\xff\xd7\x03#\x00*\xff\ +\xd7\x03#\x00-\x01\x0a\x03#\x002\xff\xd7\x03#\x00\ +4\xff\xd7\x03#\x007\xffq\x03#\x009\xff\xae\x03\ +#\x00:\xff\xae\x03#\x00<\xff\x85\x03#\x00\x89\xff\ +\xd7\x03#\x00\x94\xff\xd7\x03#\x00\x95\xff\xd7\x03#\x00\ +\x96\xff\xd7\x03#\x00\x97\xff\xd7\x03#\x00\x98\xff\xd7\x03\ +#\x00\x9a\xff\xd7\x03#\x00\x9f\xff\x85\x03#\x00\xc8\xff\ +\xd7\x03#\x00\xca\xff\xd7\x03#\x00\xcc\xff\xd7\x03#\x00\ +\xce\xff\xd7\x03#\x00\xde\xff\xd7\x03#\x00\xe0\xff\xd7\x03\ +#\x00\xe2\xff\xd7\x03#\x00\xe4\xff\xd7\x03#\x01\x0e\xff\ +\xd7\x03#\x01\x10\xff\xd7\x03#\x01\x12\xff\xd7\x03#\x01\ +\x14\xff\xd7\x03#\x01$\xffq\x03#\x01&\xffq\x03\ +#\x016\xff\xae\x03#\x018\xff\x85\x03#\x01:\xff\ +\x85\x03#\x01G\xff\xd7\x03#\x01\xfa\xff\xae\x03#\x01\ +\xfc\xff\xae\x03#\x01\xfe\xff\xae\x03#\x02\x00\xff\x85\x03\ +#\x02\x07\xffq\x03#\x02\x0b\xffq\x03#\x02_\xff\ +\xd7\x03#\x03I\xff\xd7\x03#\x03K\xff\xd7\x03#\x03\ +M\xff\xd7\x03#\x03O\xff\xd7\x03#\x03Q\xff\xd7\x03\ +#\x03S\xff\xd7\x03#\x03U\xff\xd7\x03#\x03W\xff\ +\xd7\x03#\x03Y\xff\xd7\x03#\x03[\xff\xd7\x03#\x03\ +]\xff\xd7\x03#\x03_\xff\xd7\x03#\x03o\xff\x85\x03\ +#\x03q\xff\x85\x03#\x03s\xff\x85\x03#\x03\x8f\xff\ +q\x03$\x00\x05\xff\xec\x03$\x00\x0a\xff\xec\x03$\x02\ +\x07\xff\xec\x03$\x02\x0b\xff\xec\x03%\x00\x05\xffq\x03\ +%\x00\x0a\xffq\x03%\x00&\xff\xd7\x03%\x00*\xff\ +\xd7\x03%\x00-\x01\x0a\x03%\x002\xff\xd7\x03%\x00\ +4\xff\xd7\x03%\x007\xffq\x03%\x009\xff\xae\x03\ +%\x00:\xff\xae\x03%\x00<\xff\x85\x03%\x00\x89\xff\ +\xd7\x03%\x00\x94\xff\xd7\x03%\x00\x95\xff\xd7\x03%\x00\ +\x96\xff\xd7\x03%\x00\x97\xff\xd7\x03%\x00\x98\xff\xd7\x03\ +%\x00\x9a\xff\xd7\x03%\x00\x9f\xff\x85\x03%\x00\xc8\xff\ +\xd7\x03%\x00\xca\xff\xd7\x03%\x00\xcc\xff\xd7\x03%\x00\ +\xce\xff\xd7\x03%\x00\xde\xff\xd7\x03%\x00\xe0\xff\xd7\x03\ +%\x00\xe2\xff\xd7\x03%\x00\xe4\xff\xd7\x03%\x01\x0e\xff\ +\xd7\x03%\x01\x10\xff\xd7\x03%\x01\x12\xff\xd7\x03%\x01\ +\x14\xff\xd7\x03%\x01$\xffq\x03%\x01&\xffq\x03\ +%\x016\xff\xae\x03%\x018\xff\x85\x03%\x01:\xff\ +\x85\x03%\x01G\xff\xd7\x03%\x01\xfa\xff\xae\x03%\x01\ +\xfc\xff\xae\x03%\x01\xfe\xff\xae\x03%\x02\x00\xff\x85\x03\ +%\x02\x07\xffq\x03%\x02\x0b\xffq\x03%\x02_\xff\ +\xd7\x03%\x03I\xff\xd7\x03%\x03K\xff\xd7\x03%\x03\ +M\xff\xd7\x03%\x03O\xff\xd7\x03%\x03Q\xff\xd7\x03\ +%\x03S\xff\xd7\x03%\x03U\xff\xd7\x03%\x03W\xff\ +\xd7\x03%\x03Y\xff\xd7\x03%\x03[\xff\xd7\x03%\x03\ +]\xff\xd7\x03%\x03_\xff\xd7\x03%\x03o\xff\x85\x03\ +%\x03q\xff\x85\x03%\x03s\xff\x85\x03%\x03\x8f\xff\ +q\x03&\x00\x05\xff\xec\x03&\x00\x0a\xff\xec\x03&\x02\ +\x07\xff\xec\x03&\x02\x0b\xff\xec\x03'\x00\x05\xffq\x03\ +'\x00\x0a\xffq\x03'\x00&\xff\xd7\x03'\x00*\xff\ +\xd7\x03'\x00-\x01\x0a\x03'\x002\xff\xd7\x03'\x00\ +4\xff\xd7\x03'\x007\xffq\x03'\x009\xff\xae\x03\ +'\x00:\xff\xae\x03'\x00<\xff\x85\x03'\x00\x89\xff\ +\xd7\x03'\x00\x94\xff\xd7\x03'\x00\x95\xff\xd7\x03'\x00\ +\x96\xff\xd7\x03'\x00\x97\xff\xd7\x03'\x00\x98\xff\xd7\x03\ +'\x00\x9a\xff\xd7\x03'\x00\x9f\xff\x85\x03'\x00\xc8\xff\ +\xd7\x03'\x00\xca\xff\xd7\x03'\x00\xcc\xff\xd7\x03'\x00\ +\xce\xff\xd7\x03'\x00\xde\xff\xd7\x03'\x00\xe0\xff\xd7\x03\ +'\x00\xe2\xff\xd7\x03'\x00\xe4\xff\xd7\x03'\x01\x0e\xff\ +\xd7\x03'\x01\x10\xff\xd7\x03'\x01\x12\xff\xd7\x03'\x01\ +\x14\xff\xd7\x03'\x01$\xffq\x03'\x01&\xffq\x03\ +'\x016\xff\xae\x03'\x018\xff\x85\x03'\x01:\xff\ +\x85\x03'\x01G\xff\xd7\x03'\x01\xfa\xff\xae\x03'\x01\ +\xfc\xff\xae\x03'\x01\xfe\xff\xae\x03'\x02\x00\xff\x85\x03\ +'\x02\x07\xffq\x03'\x02\x0b\xffq\x03'\x02_\xff\ +\xd7\x03'\x03I\xff\xd7\x03'\x03K\xff\xd7\x03'\x03\ +M\xff\xd7\x03'\x03O\xff\xd7\x03'\x03Q\xff\xd7\x03\ +'\x03S\xff\xd7\x03'\x03U\xff\xd7\x03'\x03W\xff\ +\xd7\x03'\x03Y\xff\xd7\x03'\x03[\xff\xd7\x03'\x03\ +]\xff\xd7\x03'\x03_\xff\xd7\x03'\x03o\xff\x85\x03\ +'\x03q\xff\x85\x03'\x03s\xff\x85\x03'\x03\x8f\xff\ +q\x03(\x00\x05\xff\xec\x03(\x00\x0a\xff\xec\x03(\x02\ +\x07\xff\xec\x03(\x02\x0b\xff\xec\x03)\x00\x05\xffq\x03\ +)\x00\x0a\xffq\x03)\x00&\xff\xd7\x03)\x00*\xff\ +\xd7\x03)\x00-\x01\x0a\x03)\x002\xff\xd7\x03)\x00\ +4\xff\xd7\x03)\x007\xffq\x03)\x009\xff\xae\x03\ +)\x00:\xff\xae\x03)\x00<\xff\x85\x03)\x00\x89\xff\ +\xd7\x03)\x00\x94\xff\xd7\x03)\x00\x95\xff\xd7\x03)\x00\ +\x96\xff\xd7\x03)\x00\x97\xff\xd7\x03)\x00\x98\xff\xd7\x03\ +)\x00\x9a\xff\xd7\x03)\x00\x9f\xff\x85\x03)\x00\xc8\xff\ +\xd7\x03)\x00\xca\xff\xd7\x03)\x00\xcc\xff\xd7\x03)\x00\ +\xce\xff\xd7\x03)\x00\xde\xff\xd7\x03)\x00\xe0\xff\xd7\x03\ +)\x00\xe2\xff\xd7\x03)\x00\xe4\xff\xd7\x03)\x01\x0e\xff\ +\xd7\x03)\x01\x10\xff\xd7\x03)\x01\x12\xff\xd7\x03)\x01\ +\x14\xff\xd7\x03)\x01$\xffq\x03)\x01&\xffq\x03\ +)\x016\xff\xae\x03)\x018\xff\x85\x03)\x01:\xff\ +\x85\x03)\x01G\xff\xd7\x03)\x01\xfa\xff\xae\x03)\x01\ +\xfc\xff\xae\x03)\x01\xfe\xff\xae\x03)\x02\x00\xff\x85\x03\ +)\x02\x07\xffq\x03)\x02\x0b\xffq\x03)\x02_\xff\ +\xd7\x03)\x03I\xff\xd7\x03)\x03K\xff\xd7\x03)\x03\ +M\xff\xd7\x03)\x03O\xff\xd7\x03)\x03Q\xff\xd7\x03\ +)\x03S\xff\xd7\x03)\x03U\xff\xd7\x03)\x03W\xff\ +\xd7\x03)\x03Y\xff\xd7\x03)\x03[\xff\xd7\x03)\x03\ +]\xff\xd7\x03)\x03_\xff\xd7\x03)\x03o\xff\x85\x03\ +)\x03q\xff\x85\x03)\x03s\xff\x85\x03)\x03\x8f\xff\ +q\x03*\x00\x05\xff\xec\x03*\x00\x0a\xff\xec\x03*\x02\ +\x07\xff\xec\x03*\x02\x0b\xff\xec\x03+\x00\x05\xffq\x03\ ++\x00\x0a\xffq\x03+\x00&\xff\xd7\x03+\x00*\xff\ +\xd7\x03+\x00-\x01\x0a\x03+\x002\xff\xd7\x03+\x00\ +4\xff\xd7\x03+\x007\xffq\x03+\x009\xff\xae\x03\ ++\x00:\xff\xae\x03+\x00<\xff\x85\x03+\x00\x89\xff\ +\xd7\x03+\x00\x94\xff\xd7\x03+\x00\x95\xff\xd7\x03+\x00\ +\x96\xff\xd7\x03+\x00\x97\xff\xd7\x03+\x00\x98\xff\xd7\x03\ ++\x00\x9a\xff\xd7\x03+\x00\x9f\xff\x85\x03+\x00\xc8\xff\ +\xd7\x03+\x00\xca\xff\xd7\x03+\x00\xcc\xff\xd7\x03+\x00\ +\xce\xff\xd7\x03+\x00\xde\xff\xd7\x03+\x00\xe0\xff\xd7\x03\ ++\x00\xe2\xff\xd7\x03+\x00\xe4\xff\xd7\x03+\x01\x0e\xff\ +\xd7\x03+\x01\x10\xff\xd7\x03+\x01\x12\xff\xd7\x03+\x01\ +\x14\xff\xd7\x03+\x01$\xffq\x03+\x01&\xffq\x03\ ++\x016\xff\xae\x03+\x018\xff\x85\x03+\x01:\xff\ +\x85\x03+\x01G\xff\xd7\x03+\x01\xfa\xff\xae\x03+\x01\ +\xfc\xff\xae\x03+\x01\xfe\xff\xae\x03+\x02\x00\xff\x85\x03\ ++\x02\x07\xffq\x03+\x02\x0b\xffq\x03+\x02_\xff\ +\xd7\x03+\x03I\xff\xd7\x03+\x03K\xff\xd7\x03+\x03\ +M\xff\xd7\x03+\x03O\xff\xd7\x03+\x03Q\xff\xd7\x03\ ++\x03S\xff\xd7\x03+\x03U\xff\xd7\x03+\x03W\xff\ +\xd7\x03+\x03Y\xff\xd7\x03+\x03[\xff\xd7\x03+\x03\ +]\xff\xd7\x03+\x03_\xff\xd7\x03+\x03o\xff\x85\x03\ ++\x03q\xff\x85\x03+\x03s\xff\x85\x03+\x03\x8f\xff\ +q\x03,\x00\x05\xff\xec\x03,\x00\x0a\xff\xec\x03,\x02\ +\x07\xff\xec\x03,\x02\x0b\xff\xec\x03-\x00\x05\xffq\x03\ +-\x00\x0a\xffq\x03-\x00&\xff\xd7\x03-\x00*\xff\ +\xd7\x03-\x00-\x01\x0a\x03-\x002\xff\xd7\x03-\x00\ +4\xff\xd7\x03-\x007\xffq\x03-\x009\xff\xae\x03\ +-\x00:\xff\xae\x03-\x00<\xff\x85\x03-\x00\x89\xff\ +\xd7\x03-\x00\x94\xff\xd7\x03-\x00\x95\xff\xd7\x03-\x00\ +\x96\xff\xd7\x03-\x00\x97\xff\xd7\x03-\x00\x98\xff\xd7\x03\ +-\x00\x9a\xff\xd7\x03-\x00\x9f\xff\x85\x03-\x00\xc8\xff\ +\xd7\x03-\x00\xca\xff\xd7\x03-\x00\xcc\xff\xd7\x03-\x00\ +\xce\xff\xd7\x03-\x00\xde\xff\xd7\x03-\x00\xe0\xff\xd7\x03\ +-\x00\xe2\xff\xd7\x03-\x00\xe4\xff\xd7\x03-\x01\x0e\xff\ +\xd7\x03-\x01\x10\xff\xd7\x03-\x01\x12\xff\xd7\x03-\x01\ +\x14\xff\xd7\x03-\x01$\xffq\x03-\x01&\xffq\x03\ +-\x016\xff\xae\x03-\x018\xff\x85\x03-\x01:\xff\ +\x85\x03-\x01G\xff\xd7\x03-\x01\xfa\xff\xae\x03-\x01\ +\xfc\xff\xae\x03-\x01\xfe\xff\xae\x03-\x02\x00\xff\x85\x03\ +-\x02\x07\xffq\x03-\x02\x0b\xffq\x03-\x02_\xff\ +\xd7\x03-\x03I\xff\xd7\x03-\x03K\xff\xd7\x03-\x03\ +M\xff\xd7\x03-\x03O\xff\xd7\x03-\x03Q\xff\xd7\x03\ +-\x03S\xff\xd7\x03-\x03U\xff\xd7\x03-\x03W\xff\ +\xd7\x03-\x03Y\xff\xd7\x03-\x03[\xff\xd7\x03-\x03\ +]\xff\xd7\x03-\x03_\xff\xd7\x03-\x03o\xff\x85\x03\ +-\x03q\xff\x85\x03-\x03s\xff\x85\x03-\x03\x8f\xff\ +q\x03.\x00\x05\xff\xec\x03.\x00\x0a\xff\xec\x03.\x02\ +\x07\xff\xec\x03.\x02\x0b\xff\xec\x03/\x00\x05\xffq\x03\ +/\x00\x0a\xffq\x03/\x00&\xff\xd7\x03/\x00*\xff\ +\xd7\x03/\x00-\x01\x0a\x03/\x002\xff\xd7\x03/\x00\ +4\xff\xd7\x03/\x007\xffq\x03/\x009\xff\xae\x03\ +/\x00:\xff\xae\x03/\x00<\xff\x85\x03/\x00\x89\xff\ +\xd7\x03/\x00\x94\xff\xd7\x03/\x00\x95\xff\xd7\x03/\x00\ +\x96\xff\xd7\x03/\x00\x97\xff\xd7\x03/\x00\x98\xff\xd7\x03\ +/\x00\x9a\xff\xd7\x03/\x00\x9f\xff\x85\x03/\x00\xc8\xff\ +\xd7\x03/\x00\xca\xff\xd7\x03/\x00\xcc\xff\xd7\x03/\x00\ +\xce\xff\xd7\x03/\x00\xde\xff\xd7\x03/\x00\xe0\xff\xd7\x03\ +/\x00\xe2\xff\xd7\x03/\x00\xe4\xff\xd7\x03/\x01\x0e\xff\ +\xd7\x03/\x01\x10\xff\xd7\x03/\x01\x12\xff\xd7\x03/\x01\ +\x14\xff\xd7\x03/\x01$\xffq\x03/\x01&\xffq\x03\ +/\x016\xff\xae\x03/\x018\xff\x85\x03/\x01:\xff\ +\x85\x03/\x01G\xff\xd7\x03/\x01\xfa\xff\xae\x03/\x01\ +\xfc\xff\xae\x03/\x01\xfe\xff\xae\x03/\x02\x00\xff\x85\x03\ +/\x02\x07\xffq\x03/\x02\x0b\xffq\x03/\x02_\xff\ +\xd7\x03/\x03I\xff\xd7\x03/\x03K\xff\xd7\x03/\x03\ +M\xff\xd7\x03/\x03O\xff\xd7\x03/\x03Q\xff\xd7\x03\ +/\x03S\xff\xd7\x03/\x03U\xff\xd7\x03/\x03W\xff\ +\xd7\x03/\x03Y\xff\xd7\x03/\x03[\xff\xd7\x03/\x03\ +]\xff\xd7\x03/\x03_\xff\xd7\x03/\x03o\xff\x85\x03\ +/\x03q\xff\x85\x03/\x03s\xff\x85\x03/\x03\x8f\xff\ +q\x030\x00\x05\xff\xec\x030\x00\x0a\xff\xec\x030\x02\ +\x07\xff\xec\x030\x02\x0b\xff\xec\x031\x00\x05\xffq\x03\ +1\x00\x0a\xffq\x031\x00&\xff\xd7\x031\x00*\xff\ +\xd7\x031\x00-\x01\x0a\x031\x002\xff\xd7\x031\x00\ +4\xff\xd7\x031\x007\xffq\x031\x009\xff\xae\x03\ +1\x00:\xff\xae\x031\x00<\xff\x85\x031\x00\x89\xff\ +\xd7\x031\x00\x94\xff\xd7\x031\x00\x95\xff\xd7\x031\x00\ +\x96\xff\xd7\x031\x00\x97\xff\xd7\x031\x00\x98\xff\xd7\x03\ +1\x00\x9a\xff\xd7\x031\x00\x9f\xff\x85\x031\x00\xc8\xff\ +\xd7\x031\x00\xca\xff\xd7\x031\x00\xcc\xff\xd7\x031\x00\ +\xce\xff\xd7\x031\x00\xde\xff\xd7\x031\x00\xe0\xff\xd7\x03\ +1\x00\xe2\xff\xd7\x031\x00\xe4\xff\xd7\x031\x01\x0e\xff\ +\xd7\x031\x01\x10\xff\xd7\x031\x01\x12\xff\xd7\x031\x01\ +\x14\xff\xd7\x031\x01$\xffq\x031\x01&\xffq\x03\ +1\x016\xff\xae\x031\x018\xff\x85\x031\x01:\xff\ +\x85\x031\x01G\xff\xd7\x031\x01\xfa\xff\xae\x031\x01\ +\xfc\xff\xae\x031\x01\xfe\xff\xae\x031\x02\x00\xff\x85\x03\ +1\x02\x07\xffq\x031\x02\x0b\xffq\x031\x02_\xff\ +\xd7\x031\x03I\xff\xd7\x031\x03K\xff\xd7\x031\x03\ +M\xff\xd7\x031\x03O\xff\xd7\x031\x03Q\xff\xd7\x03\ +1\x03S\xff\xd7\x031\x03U\xff\xd7\x031\x03W\xff\ +\xd7\x031\x03Y\xff\xd7\x031\x03[\xff\xd7\x031\x03\ +]\xff\xd7\x031\x03_\xff\xd7\x031\x03o\xff\x85\x03\ +1\x03q\xff\x85\x031\x03s\xff\x85\x031\x03\x8f\xff\ +q\x032\x00\x05\xff\xec\x032\x00\x0a\xff\xec\x032\x02\ +\x07\xff\xec\x032\x02\x0b\xff\xec\x033\x00\x05\xffq\x03\ +3\x00\x0a\xffq\x033\x00&\xff\xd7\x033\x00*\xff\ +\xd7\x033\x00-\x01\x0a\x033\x002\xff\xd7\x033\x00\ +4\xff\xd7\x033\x007\xffq\x033\x009\xff\xae\x03\ +3\x00:\xff\xae\x033\x00<\xff\x85\x033\x00\x89\xff\ +\xd7\x033\x00\x94\xff\xd7\x033\x00\x95\xff\xd7\x033\x00\ +\x96\xff\xd7\x033\x00\x97\xff\xd7\x033\x00\x98\xff\xd7\x03\ +3\x00\x9a\xff\xd7\x033\x00\x9f\xff\x85\x033\x00\xc8\xff\ +\xd7\x033\x00\xca\xff\xd7\x033\x00\xcc\xff\xd7\x033\x00\ +\xce\xff\xd7\x033\x00\xde\xff\xd7\x033\x00\xe0\xff\xd7\x03\ +3\x00\xe2\xff\xd7\x033\x00\xe4\xff\xd7\x033\x01\x0e\xff\ +\xd7\x033\x01\x10\xff\xd7\x033\x01\x12\xff\xd7\x033\x01\ +\x14\xff\xd7\x033\x01$\xffq\x033\x01&\xffq\x03\ +3\x016\xff\xae\x033\x018\xff\x85\x033\x01:\xff\ +\x85\x033\x01G\xff\xd7\x033\x01\xfa\xff\xae\x033\x01\ +\xfc\xff\xae\x033\x01\xfe\xff\xae\x033\x02\x00\xff\x85\x03\ +3\x02\x07\xffq\x033\x02\x0b\xffq\x033\x02_\xff\ +\xd7\x033\x03I\xff\xd7\x033\x03K\xff\xd7\x033\x03\ +M\xff\xd7\x033\x03O\xff\xd7\x033\x03Q\xff\xd7\x03\ +3\x03S\xff\xd7\x033\x03U\xff\xd7\x033\x03W\xff\ +\xd7\x033\x03Y\xff\xd7\x033\x03[\xff\xd7\x033\x03\ +]\xff\xd7\x033\x03_\xff\xd7\x033\x03o\xff\x85\x03\ +3\x03q\xff\x85\x033\x03s\xff\x85\x033\x03\x8f\xff\ +q\x034\x00\x05\xff\xec\x034\x00\x0a\xff\xec\x034\x02\ +\x07\xff\xec\x034\x02\x0b\xff\xec\x035\x00-\x00{\x03\ +6\x00\x05\xff\xec\x036\x00\x0a\xff\xec\x036\x00Y\xff\ +\xd7\x036\x00Z\xff\xd7\x036\x00[\xff\xd7\x036\x00\ +\x5c\xff\xd7\x036\x00]\xff\xec\x036\x00\xbf\xff\xd7\x03\ +6\x017\xff\xd7\x036\x01<\xff\xec\x036\x01>\xff\ +\xec\x036\x01@\xff\xec\x036\x01\xfb\xff\xd7\x036\x01\ +\xfd\xff\xd7\x036\x02\x07\xff\xec\x036\x02\x0b\xff\xec\x03\ +6\x03p\xff\xd7\x037\x00-\x00{\x038\x00\x05\xff\ +\xec\x038\x00\x0a\xff\xec\x038\x00Y\xff\xd7\x038\x00\ +Z\xff\xd7\x038\x00[\xff\xd7\x038\x00\x5c\xff\xd7\x03\ +8\x00]\xff\xec\x038\x00\xbf\xff\xd7\x038\x017\xff\ +\xd7\x038\x01<\xff\xec\x038\x01>\xff\xec\x038\x01\ +@\xff\xec\x038\x01\xfb\xff\xd7\x038\x01\xfd\xff\xd7\x03\ +8\x02\x07\xff\xec\x038\x02\x0b\xff\xec\x038\x03p\xff\ +\xd7\x039\x00-\x00{\x03:\x00\x05\xff\xec\x03:\x00\ +\x0a\xff\xec\x03:\x00Y\xff\xd7\x03:\x00Z\xff\xd7\x03\ +:\x00[\xff\xd7\x03:\x00\x5c\xff\xd7\x03:\x00]\xff\ +\xec\x03:\x00\xbf\xff\xd7\x03:\x017\xff\xd7\x03:\x01\ +<\xff\xec\x03:\x01>\xff\xec\x03:\x01@\xff\xec\x03\ +:\x01\xfb\xff\xd7\x03:\x01\xfd\xff\xd7\x03:\x02\x07\xff\ +\xec\x03:\x02\x0b\xff\xec\x03:\x03p\xff\xd7\x03;\x00\ +-\x00{\x03<\x00\x05\xff\xec\x03<\x00\x0a\xff\xec\x03\ +<\x00Y\xff\xd7\x03<\x00Z\xff\xd7\x03<\x00[\xff\ +\xd7\x03<\x00\x5c\xff\xd7\x03<\x00]\xff\xec\x03<\x00\ +\xbf\xff\xd7\x03<\x017\xff\xd7\x03<\x01<\xff\xec\x03\ +<\x01>\xff\xec\x03<\x01@\xff\xec\x03<\x01\xfb\xff\ +\xd7\x03<\x01\xfd\xff\xd7\x03<\x02\x07\xff\xec\x03<\x02\ +\x0b\xff\xec\x03<\x03p\xff\xd7\x03=\x00-\x00{\x03\ +>\x00\x05\xff\xec\x03>\x00\x0a\xff\xec\x03>\x00Y\xff\ +\xd7\x03>\x00Z\xff\xd7\x03>\x00[\xff\xd7\x03>\x00\ +\x5c\xff\xd7\x03>\x00]\xff\xec\x03>\x00\xbf\xff\xd7\x03\ +>\x017\xff\xd7\x03>\x01<\xff\xec\x03>\x01>\xff\ +\xec\x03>\x01@\xff\xec\x03>\x01\xfb\xff\xd7\x03>\x01\ +\xfd\xff\xd7\x03>\x02\x07\xff\xec\x03>\x02\x0b\xff\xec\x03\ +>\x03p\xff\xd7\x03?\x00-\x00{\x03@\x00\x05\xff\ +\xec\x03@\x00\x0a\xff\xec\x03@\x00Y\xff\xd7\x03@\x00\ +Z\xff\xd7\x03@\x00[\xff\xd7\x03@\x00\x5c\xff\xd7\x03\ +@\x00]\xff\xec\x03@\x00\xbf\xff\xd7\x03@\x017\xff\ +\xd7\x03@\x01<\xff\xec\x03@\x01>\xff\xec\x03@\x01\ +@\xff\xec\x03@\x01\xfb\xff\xd7\x03@\x01\xfd\xff\xd7\x03\ +@\x02\x07\xff\xec\x03@\x02\x0b\xff\xec\x03@\x03p\xff\ +\xd7\x03A\x00-\x00{\x03B\x00\x05\xff\xec\x03B\x00\ +\x0a\xff\xec\x03B\x00Y\xff\xd7\x03B\x00Z\xff\xd7\x03\ +B\x00[\xff\xd7\x03B\x00\x5c\xff\xd7\x03B\x00]\xff\ +\xec\x03B\x00\xbf\xff\xd7\x03B\x017\xff\xd7\x03B\x01\ +<\xff\xec\x03B\x01>\xff\xec\x03B\x01@\xff\xec\x03\ +B\x01\xfb\xff\xd7\x03B\x01\xfd\xff\xd7\x03B\x02\x07\xff\ +\xec\x03B\x02\x0b\xff\xec\x03B\x03p\xff\xd7\x03C\x00\ +-\x00{\x03D\x00\x05\xff\xec\x03D\x00\x0a\xff\xec\x03\ +D\x00Y\xff\xd7\x03D\x00Z\xff\xd7\x03D\x00[\xff\ +\xd7\x03D\x00\x5c\xff\xd7\x03D\x00]\xff\xec\x03D\x00\ +\xbf\xff\xd7\x03D\x017\xff\xd7\x03D\x01<\xff\xec\x03\ +D\x01>\xff\xec\x03D\x01@\xff\xec\x03D\x01\xfb\xff\ +\xd7\x03D\x01\xfd\xff\xd7\x03D\x02\x07\xff\xec\x03D\x02\ +\x0b\xff\xec\x03D\x03p\xff\xd7\x03I\x00\x0f\xff\xae\x03\ +I\x00\x11\xff\xae\x03I\x00$\xff\xd7\x03I\x007\xff\ +\xc3\x03I\x009\xff\xec\x03I\x00:\xff\xec\x03I\x00\ +;\xff\xd7\x03I\x00<\xff\xec\x03I\x00=\xff\xec\x03\ +I\x00\x82\xff\xd7\x03I\x00\x83\xff\xd7\x03I\x00\x84\xff\ +\xd7\x03I\x00\x85\xff\xd7\x03I\x00\x86\xff\xd7\x03I\x00\ +\x87\xff\xd7\x03I\x00\x9f\xff\xec\x03I\x00\xc2\xff\xd7\x03\ +I\x00\xc4\xff\xd7\x03I\x00\xc6\xff\xd7\x03I\x01$\xff\ +\xc3\x03I\x01&\xff\xc3\x03I\x016\xff\xec\x03I\x01\ +8\xff\xec\x03I\x01:\xff\xec\x03I\x01;\xff\xec\x03\ +I\x01=\xff\xec\x03I\x01?\xff\xec\x03I\x01C\xff\ +\xd7\x03I\x01\xa0\xff\xec\x03I\x01\xfa\xff\xec\x03I\x01\ +\xfc\xff\xec\x03I\x01\xfe\xff\xec\x03I\x02\x00\xff\xec\x03\ +I\x02\x08\xff\xae\x03I\x02\x0c\xff\xae\x03I\x02X\xff\ +\xd7\x03I\x03\x1d\xff\xd7\x03I\x03\x1f\xff\xd7\x03I\x03\ +!\xff\xd7\x03I\x03#\xff\xd7\x03I\x03%\xff\xd7\x03\ +I\x03'\xff\xd7\x03I\x03)\xff\xd7\x03I\x03+\xff\ +\xd7\x03I\x03-\xff\xd7\x03I\x03/\xff\xd7\x03I\x03\ +1\xff\xd7\x03I\x033\xff\xd7\x03I\x03o\xff\xec\x03\ +I\x03q\xff\xec\x03I\x03s\xff\xec\x03I\x03\x8f\xff\ +\xc3\x03J\x00\x05\xff\xec\x03J\x00\x0a\xff\xec\x03J\x00\ +Y\xff\xd7\x03J\x00Z\xff\xd7\x03J\x00[\xff\xd7\x03\ +J\x00\x5c\xff\xd7\x03J\x00]\xff\xec\x03J\x00\xbf\xff\ +\xd7\x03J\x017\xff\xd7\x03J\x01<\xff\xec\x03J\x01\ +>\xff\xec\x03J\x01@\xff\xec\x03J\x01\xfb\xff\xd7\x03\ +J\x01\xfd\xff\xd7\x03J\x02\x07\xff\xec\x03J\x02\x0b\xff\ +\xec\x03J\x03p\xff\xd7\x03K\x00\x0f\xff\xae\x03K\x00\ +\x11\xff\xae\x03K\x00$\xff\xd7\x03K\x007\xff\xc3\x03\ +K\x009\xff\xec\x03K\x00:\xff\xec\x03K\x00;\xff\ +\xd7\x03K\x00<\xff\xec\x03K\x00=\xff\xec\x03K\x00\ +\x82\xff\xd7\x03K\x00\x83\xff\xd7\x03K\x00\x84\xff\xd7\x03\ +K\x00\x85\xff\xd7\x03K\x00\x86\xff\xd7\x03K\x00\x87\xff\ +\xd7\x03K\x00\x9f\xff\xec\x03K\x00\xc2\xff\xd7\x03K\x00\ +\xc4\xff\xd7\x03K\x00\xc6\xff\xd7\x03K\x01$\xff\xc3\x03\ +K\x01&\xff\xc3\x03K\x016\xff\xec\x03K\x018\xff\ +\xec\x03K\x01:\xff\xec\x03K\x01;\xff\xec\x03K\x01\ +=\xff\xec\x03K\x01?\xff\xec\x03K\x01C\xff\xd7\x03\ +K\x01\xa0\xff\xec\x03K\x01\xfa\xff\xec\x03K\x01\xfc\xff\ +\xec\x03K\x01\xfe\xff\xec\x03K\x02\x00\xff\xec\x03K\x02\ +\x08\xff\xae\x03K\x02\x0c\xff\xae\x03K\x02X\xff\xd7\x03\ +K\x03\x1d\xff\xd7\x03K\x03\x1f\xff\xd7\x03K\x03!\xff\ +\xd7\x03K\x03#\xff\xd7\x03K\x03%\xff\xd7\x03K\x03\ +'\xff\xd7\x03K\x03)\xff\xd7\x03K\x03+\xff\xd7\x03\ +K\x03-\xff\xd7\x03K\x03/\xff\xd7\x03K\x031\xff\ +\xd7\x03K\x033\xff\xd7\x03K\x03o\xff\xec\x03K\x03\ +q\xff\xec\x03K\x03s\xff\xec\x03K\x03\x8f\xff\xc3\x03\ +L\x00\x05\xff\xec\x03L\x00\x0a\xff\xec\x03L\x00Y\xff\ +\xd7\x03L\x00Z\xff\xd7\x03L\x00[\xff\xd7\x03L\x00\ +\x5c\xff\xd7\x03L\x00]\xff\xec\x03L\x00\xbf\xff\xd7\x03\ +L\x017\xff\xd7\x03L\x01<\xff\xec\x03L\x01>\xff\ +\xec\x03L\x01@\xff\xec\x03L\x01\xfb\xff\xd7\x03L\x01\ +\xfd\xff\xd7\x03L\x02\x07\xff\xec\x03L\x02\x0b\xff\xec\x03\ +L\x03p\xff\xd7\x03M\x00\x0f\xff\xae\x03M\x00\x11\xff\ +\xae\x03M\x00$\xff\xd7\x03M\x007\xff\xc3\x03M\x00\ +9\xff\xec\x03M\x00:\xff\xec\x03M\x00;\xff\xd7\x03\ +M\x00<\xff\xec\x03M\x00=\xff\xec\x03M\x00\x82\xff\ +\xd7\x03M\x00\x83\xff\xd7\x03M\x00\x84\xff\xd7\x03M\x00\ +\x85\xff\xd7\x03M\x00\x86\xff\xd7\x03M\x00\x87\xff\xd7\x03\ +M\x00\x9f\xff\xec\x03M\x00\xc2\xff\xd7\x03M\x00\xc4\xff\ +\xd7\x03M\x00\xc6\xff\xd7\x03M\x01$\xff\xc3\x03M\x01\ +&\xff\xc3\x03M\x016\xff\xec\x03M\x018\xff\xec\x03\ +M\x01:\xff\xec\x03M\x01;\xff\xec\x03M\x01=\xff\ +\xec\x03M\x01?\xff\xec\x03M\x01C\xff\xd7\x03M\x01\ +\xa0\xff\xec\x03M\x01\xfa\xff\xec\x03M\x01\xfc\xff\xec\x03\ +M\x01\xfe\xff\xec\x03M\x02\x00\xff\xec\x03M\x02\x08\xff\ +\xae\x03M\x02\x0c\xff\xae\x03M\x02X\xff\xd7\x03M\x03\ +\x1d\xff\xd7\x03M\x03\x1f\xff\xd7\x03M\x03!\xff\xd7\x03\ +M\x03#\xff\xd7\x03M\x03%\xff\xd7\x03M\x03'\xff\ +\xd7\x03M\x03)\xff\xd7\x03M\x03+\xff\xd7\x03M\x03\ +-\xff\xd7\x03M\x03/\xff\xd7\x03M\x031\xff\xd7\x03\ +M\x033\xff\xd7\x03M\x03o\xff\xec\x03M\x03q\xff\ +\xec\x03M\x03s\xff\xec\x03M\x03\x8f\xff\xc3\x03O\x00\ +\x0f\xff\xae\x03O\x00\x11\xff\xae\x03O\x00$\xff\xd7\x03\ +O\x007\xff\xc3\x03O\x009\xff\xec\x03O\x00:\xff\ +\xec\x03O\x00;\xff\xd7\x03O\x00<\xff\xec\x03O\x00\ +=\xff\xec\x03O\x00\x82\xff\xd7\x03O\x00\x83\xff\xd7\x03\ +O\x00\x84\xff\xd7\x03O\x00\x85\xff\xd7\x03O\x00\x86\xff\ +\xd7\x03O\x00\x87\xff\xd7\x03O\x00\x9f\xff\xec\x03O\x00\ +\xc2\xff\xd7\x03O\x00\xc4\xff\xd7\x03O\x00\xc6\xff\xd7\x03\ +O\x01$\xff\xc3\x03O\x01&\xff\xc3\x03O\x016\xff\ +\xec\x03O\x018\xff\xec\x03O\x01:\xff\xec\x03O\x01\ +;\xff\xec\x03O\x01=\xff\xec\x03O\x01?\xff\xec\x03\ +O\x01C\xff\xd7\x03O\x01\xa0\xff\xec\x03O\x01\xfa\xff\ +\xec\x03O\x01\xfc\xff\xec\x03O\x01\xfe\xff\xec\x03O\x02\ +\x00\xff\xec\x03O\x02\x08\xff\xae\x03O\x02\x0c\xff\xae\x03\ +O\x02X\xff\xd7\x03O\x03\x1d\xff\xd7\x03O\x03\x1f\xff\ +\xd7\x03O\x03!\xff\xd7\x03O\x03#\xff\xd7\x03O\x03\ +%\xff\xd7\x03O\x03'\xff\xd7\x03O\x03)\xff\xd7\x03\ +O\x03+\xff\xd7\x03O\x03-\xff\xd7\x03O\x03/\xff\ +\xd7\x03O\x031\xff\xd7\x03O\x033\xff\xd7\x03O\x03\ +o\xff\xec\x03O\x03q\xff\xec\x03O\x03s\xff\xec\x03\ +O\x03\x8f\xff\xc3\x03Q\x00\x0f\xff\xae\x03Q\x00\x11\xff\ +\xae\x03Q\x00$\xff\xd7\x03Q\x007\xff\xc3\x03Q\x00\ +9\xff\xec\x03Q\x00:\xff\xec\x03Q\x00;\xff\xd7\x03\ +Q\x00<\xff\xec\x03Q\x00=\xff\xec\x03Q\x00\x82\xff\ +\xd7\x03Q\x00\x83\xff\xd7\x03Q\x00\x84\xff\xd7\x03Q\x00\ +\x85\xff\xd7\x03Q\x00\x86\xff\xd7\x03Q\x00\x87\xff\xd7\x03\ +Q\x00\x9f\xff\xec\x03Q\x00\xc2\xff\xd7\x03Q\x00\xc4\xff\ +\xd7\x03Q\x00\xc6\xff\xd7\x03Q\x01$\xff\xc3\x03Q\x01\ +&\xff\xc3\x03Q\x016\xff\xec\x03Q\x018\xff\xec\x03\ +Q\x01:\xff\xec\x03Q\x01;\xff\xec\x03Q\x01=\xff\ +\xec\x03Q\x01?\xff\xec\x03Q\x01C\xff\xd7\x03Q\x01\ +\xa0\xff\xec\x03Q\x01\xfa\xff\xec\x03Q\x01\xfc\xff\xec\x03\ +Q\x01\xfe\xff\xec\x03Q\x02\x00\xff\xec\x03Q\x02\x08\xff\ +\xae\x03Q\x02\x0c\xff\xae\x03Q\x02X\xff\xd7\x03Q\x03\ +\x1d\xff\xd7\x03Q\x03\x1f\xff\xd7\x03Q\x03!\xff\xd7\x03\ +Q\x03#\xff\xd7\x03Q\x03%\xff\xd7\x03Q\x03'\xff\ +\xd7\x03Q\x03)\xff\xd7\x03Q\x03+\xff\xd7\x03Q\x03\ +-\xff\xd7\x03Q\x03/\xff\xd7\x03Q\x031\xff\xd7\x03\ +Q\x033\xff\xd7\x03Q\x03o\xff\xec\x03Q\x03q\xff\ +\xec\x03Q\x03s\xff\xec\x03Q\x03\x8f\xff\xc3\x03S\x00\ +\x0f\xff\xae\x03S\x00\x11\xff\xae\x03S\x00$\xff\xd7\x03\ +S\x007\xff\xc3\x03S\x009\xff\xec\x03S\x00:\xff\ +\xec\x03S\x00;\xff\xd7\x03S\x00<\xff\xec\x03S\x00\ +=\xff\xec\x03S\x00\x82\xff\xd7\x03S\x00\x83\xff\xd7\x03\ +S\x00\x84\xff\xd7\x03S\x00\x85\xff\xd7\x03S\x00\x86\xff\ +\xd7\x03S\x00\x87\xff\xd7\x03S\x00\x9f\xff\xec\x03S\x00\ +\xc2\xff\xd7\x03S\x00\xc4\xff\xd7\x03S\x00\xc6\xff\xd7\x03\ +S\x01$\xff\xc3\x03S\x01&\xff\xc3\x03S\x016\xff\ +\xec\x03S\x018\xff\xec\x03S\x01:\xff\xec\x03S\x01\ +;\xff\xec\x03S\x01=\xff\xec\x03S\x01?\xff\xec\x03\ +S\x01C\xff\xd7\x03S\x01\xa0\xff\xec\x03S\x01\xfa\xff\ +\xec\x03S\x01\xfc\xff\xec\x03S\x01\xfe\xff\xec\x03S\x02\ +\x00\xff\xec\x03S\x02\x08\xff\xae\x03S\x02\x0c\xff\xae\x03\ +S\x02X\xff\xd7\x03S\x03\x1d\xff\xd7\x03S\x03\x1f\xff\ +\xd7\x03S\x03!\xff\xd7\x03S\x03#\xff\xd7\x03S\x03\ +%\xff\xd7\x03S\x03'\xff\xd7\x03S\x03)\xff\xd7\x03\ +S\x03+\xff\xd7\x03S\x03-\xff\xd7\x03S\x03/\xff\ +\xd7\x03S\x031\xff\xd7\x03S\x033\xff\xd7\x03S\x03\ +o\xff\xec\x03S\x03q\xff\xec\x03S\x03s\xff\xec\x03\ +S\x03\x8f\xff\xc3\x03U\x00\x0f\xff\xae\x03U\x00\x11\xff\ +\xae\x03U\x00$\xff\xd7\x03U\x007\xff\xc3\x03U\x00\ +9\xff\xec\x03U\x00:\xff\xec\x03U\x00;\xff\xd7\x03\ +U\x00<\xff\xec\x03U\x00=\xff\xec\x03U\x00\x82\xff\ +\xd7\x03U\x00\x83\xff\xd7\x03U\x00\x84\xff\xd7\x03U\x00\ +\x85\xff\xd7\x03U\x00\x86\xff\xd7\x03U\x00\x87\xff\xd7\x03\ +U\x00\x9f\xff\xec\x03U\x00\xc2\xff\xd7\x03U\x00\xc4\xff\ +\xd7\x03U\x00\xc6\xff\xd7\x03U\x01$\xff\xc3\x03U\x01\ +&\xff\xc3\x03U\x016\xff\xec\x03U\x018\xff\xec\x03\ +U\x01:\xff\xec\x03U\x01;\xff\xec\x03U\x01=\xff\ +\xec\x03U\x01?\xff\xec\x03U\x01C\xff\xd7\x03U\x01\ +\xa0\xff\xec\x03U\x01\xfa\xff\xec\x03U\x01\xfc\xff\xec\x03\ +U\x01\xfe\xff\xec\x03U\x02\x00\xff\xec\x03U\x02\x08\xff\ +\xae\x03U\x02\x0c\xff\xae\x03U\x02X\xff\xd7\x03U\x03\ +\x1d\xff\xd7\x03U\x03\x1f\xff\xd7\x03U\x03!\xff\xd7\x03\ +U\x03#\xff\xd7\x03U\x03%\xff\xd7\x03U\x03'\xff\ +\xd7\x03U\x03)\xff\xd7\x03U\x03+\xff\xd7\x03U\x03\ +-\xff\xd7\x03U\x03/\xff\xd7\x03U\x031\xff\xd7\x03\ +U\x033\xff\xd7\x03U\x03o\xff\xec\x03U\x03q\xff\ +\xec\x03U\x03s\xff\xec\x03U\x03\x8f\xff\xc3\x03X\x00\ +I\x00R\x03X\x00W\x00R\x03X\x00Y\x00f\x03\ +X\x00Z\x00f\x03X\x00[\x00f\x03X\x00\x5c\x00\ +f\x03X\x00\xbf\x00f\x03X\x01%\x00R\x03X\x01\ +'\x00R\x03X\x017\x00f\x03X\x01\xfb\x00f\x03\ +X\x01\xfd\x00f\x03X\x024\x00R\x03X\x025\x00\ +R\x03X\x02]\x00R\x03X\x02^\x00R\x03X\x03\ +p\x00f\x03X\x03\x8d\x00R\x03X\x03\x90\x00R\x03\ +Z\x00I\x00R\x03Z\x00W\x00R\x03Z\x00Y\x00\ +f\x03Z\x00Z\x00f\x03Z\x00[\x00f\x03Z\x00\ +\x5c\x00f\x03Z\x00\xbf\x00f\x03Z\x01%\x00R\x03\ +Z\x01'\x00R\x03Z\x017\x00f\x03Z\x01\xfb\x00\ +f\x03Z\x01\xfd\x00f\x03Z\x024\x00R\x03Z\x02\ +5\x00R\x03Z\x02]\x00R\x03Z\x02^\x00R\x03\ +Z\x03p\x00f\x03Z\x03\x8d\x00R\x03Z\x03\x90\x00\ +R\x03\x5c\x00I\x00R\x03\x5c\x00W\x00R\x03\x5c\x00\ +Y\x00f\x03\x5c\x00Z\x00f\x03\x5c\x00[\x00f\x03\ +\x5c\x00\x5c\x00f\x03\x5c\x00\xbf\x00f\x03\x5c\x01%\x00\ +R\x03\x5c\x01'\x00R\x03\x5c\x017\x00f\x03\x5c\x01\ +\xfb\x00f\x03\x5c\x01\xfd\x00f\x03\x5c\x024\x00R\x03\ +\x5c\x025\x00R\x03\x5c\x02]\x00R\x03\x5c\x02^\x00\ +R\x03\x5c\x03p\x00f\x03\x5c\x03\x8d\x00R\x03\x5c\x03\ +\x90\x00R\x03^\x00I\x00R\x03^\x00W\x00R\x03\ +^\x00Y\x00f\x03^\x00Z\x00f\x03^\x00[\x00\ +f\x03^\x00\x5c\x00f\x03^\x00\xbf\x00f\x03^\x01\ +%\x00R\x03^\x01'\x00R\x03^\x017\x00f\x03\ +^\x01\xfb\x00f\x03^\x01\xfd\x00f\x03^\x024\x00\ +R\x03^\x025\x00R\x03^\x02]\x00R\x03^\x02\ +^\x00R\x03^\x03p\x00f\x03^\x03\x8d\x00R\x03\ +^\x03\x90\x00R\x03`\x00I\x00R\x03`\x00W\x00\ +R\x03`\x00Y\x00f\x03`\x00Z\x00f\x03`\x00\ +[\x00f\x03`\x00\x5c\x00f\x03`\x00\xbf\x00f\x03\ +`\x01%\x00R\x03`\x01'\x00R\x03`\x017\x00\ +f\x03`\x01\xfb\x00f\x03`\x01\xfd\x00f\x03`\x02\ +4\x00R\x03`\x025\x00R\x03`\x02]\x00R\x03\ +`\x02^\x00R\x03`\x03p\x00f\x03`\x03\x8d\x00\ +R\x03`\x03\x90\x00R\x03a\x00\x0f\xff\xd7\x03a\x00\ +\x11\xff\xd7\x03a\x00$\xff\xec\x03a\x00\x82\xff\xec\x03\ +a\x00\x83\xff\xec\x03a\x00\x84\xff\xec\x03a\x00\x85\xff\ +\xec\x03a\x00\x86\xff\xec\x03a\x00\x87\xff\xec\x03a\x00\ +\xc2\xff\xec\x03a\x00\xc4\xff\xec\x03a\x00\xc6\xff\xec\x03\ +a\x01C\xff\xec\x03a\x02\x08\xff\xd7\x03a\x02\x0c\xff\ +\xd7\x03a\x02X\xff\xec\x03a\x03\x1d\xff\xec\x03a\x03\ +\x1f\xff\xec\x03a\x03!\xff\xec\x03a\x03#\xff\xec\x03\ +a\x03%\xff\xec\x03a\x03'\xff\xec\x03a\x03)\xff\ +\xec\x03a\x03+\xff\xec\x03a\x03-\xff\xec\x03a\x03\ +/\xff\xec\x03a\x031\xff\xec\x03a\x033\xff\xec\x03\ +f\x00I\x00f\x03f\x00W\x00f\x03f\x00Y\x00\ +f\x03f\x00Z\x00f\x03f\x00[\x00f\x03f\x00\ +\x5c\x00f\x03f\x00\xbf\x00f\x03f\x01%\x00f\x03\ +f\x01'\x00f\x03f\x017\x00f\x03f\x01\xfb\x00\ +f\x03f\x01\xfd\x00f\x03f\x024\x00f\x03f\x02\ +5\x00f\x03f\x02]\x00f\x03f\x02^\x00f\x03\ +f\x03p\x00f\x03f\x03\x8d\x00f\x03f\x03\x90\x00\ +f\x03h\x00I\x00f\x03h\x00W\x00f\x03h\x00\ +Y\x00f\x03h\x00Z\x00f\x03h\x00[\x00f\x03\ +h\x00\x5c\x00f\x03h\x00\xbf\x00f\x03h\x01%\x00\ +f\x03h\x01'\x00f\x03h\x017\x00f\x03h\x01\ +\xfb\x00f\x03h\x01\xfd\x00f\x03h\x024\x00f\x03\ +h\x025\x00f\x03h\x02]\x00f\x03h\x02^\x00\ +f\x03h\x03p\x00f\x03h\x03\x8d\x00f\x03h\x03\ +\x90\x00f\x03j\x00I\x00f\x03j\x00W\x00f\x03\ +j\x00Y\x00f\x03j\x00Z\x00f\x03j\x00[\x00\ +f\x03j\x00\x5c\x00f\x03j\x00\xbf\x00f\x03j\x01\ +%\x00f\x03j\x01'\x00f\x03j\x017\x00f\x03\ +j\x01\xfb\x00f\x03j\x01\xfd\x00f\x03j\x024\x00\ +f\x03j\x025\x00f\x03j\x02]\x00f\x03j\x02\ +^\x00f\x03j\x03p\x00f\x03j\x03\x8d\x00f\x03\ +j\x03\x90\x00f\x03l\x00I\x00f\x03l\x00W\x00\ +f\x03l\x00Y\x00f\x03l\x00Z\x00f\x03l\x00\ +[\x00f\x03l\x00\x5c\x00f\x03l\x00\xbf\x00f\x03\ +l\x01%\x00f\x03l\x01'\x00f\x03l\x017\x00\ +f\x03l\x01\xfb\x00f\x03l\x01\xfd\x00f\x03l\x02\ +4\x00f\x03l\x025\x00f\x03l\x02]\x00f\x03\ +l\x02^\x00f\x03l\x03p\x00f\x03l\x03\x8d\x00\ +f\x03l\x03\x90\x00f\x03n\x00I\x00f\x03n\x00\ +W\x00f\x03n\x00Y\x00f\x03n\x00Z\x00f\x03\ +n\x00[\x00f\x03n\x00\x5c\x00f\x03n\x00\xbf\x00\ +f\x03n\x01%\x00f\x03n\x01'\x00f\x03n\x01\ +7\x00f\x03n\x01\xfb\x00f\x03n\x01\xfd\x00f\x03\ +n\x024\x00f\x03n\x025\x00f\x03n\x02]\x00\ +f\x03n\x02^\x00f\x03n\x03p\x00f\x03n\x03\ +\x8d\x00f\x03n\x03\x90\x00f\x03o\x00\x0f\xff\x85\x03\ +o\x00\x11\xff\x85\x03o\x00\x22\x00)\x03o\x00$\xff\ +\x85\x03o\x00&\xff\xd7\x03o\x00*\xff\xd7\x03o\x00\ +2\xff\xd7\x03o\x004\xff\xd7\x03o\x00D\xff\x9a\x03\ +o\x00F\xff\x9a\x03o\x00G\xff\x9a\x03o\x00H\xff\ +\x9a\x03o\x00J\xff\xd7\x03o\x00P\xff\xc3\x03o\x00\ +Q\xff\xc3\x03o\x00R\xff\x9a\x03o\x00S\xff\xc3\x03\ +o\x00T\xff\x9a\x03o\x00U\xff\xc3\x03o\x00V\xff\ +\xae\x03o\x00X\xff\xc3\x03o\x00]\xff\xd7\x03o\x00\ +\x82\xff\x85\x03o\x00\x83\xff\x85\x03o\x00\x84\xff\x85\x03\ +o\x00\x85\xff\x85\x03o\x00\x86\xff\x85\x03o\x00\x87\xff\ +\x85\x03o\x00\x89\xff\xd7\x03o\x00\x94\xff\xd7\x03o\x00\ +\x95\xff\xd7\x03o\x00\x96\xff\xd7\x03o\x00\x97\xff\xd7\x03\ +o\x00\x98\xff\xd7\x03o\x00\x9a\xff\xd7\x03o\x00\xa2\xff\ +\x9a\x03o\x00\xa3\xff\x9a\x03o\x00\xa4\xff\x9a\x03o\x00\ +\xa5\xff\x9a\x03o\x00\xa6\xff\x9a\x03o\x00\xa7\xff\x9a\x03\ +o\x00\xa8\xff\x9a\x03o\x00\xa9\xff\x9a\x03o\x00\xaa\xff\ +\x9a\x03o\x00\xab\xff\x9a\x03o\x00\xac\xff\x9a\x03o\x00\ +\xad\xff\x9a\x03o\x00\xb4\xff\x9a\x03o\x00\xb5\xff\x9a\x03\ +o\x00\xb6\xff\x9a\x03o\x00\xb7\xff\x9a\x03o\x00\xb8\xff\ +\x9a\x03o\x00\xba\xff\x9a\x03o\x00\xbb\xff\xc3\x03o\x00\ +\xbc\xff\xc3\x03o\x00\xbd\xff\xc3\x03o\x00\xbe\xff\xc3\x03\ +o\x00\xc2\xff\x85\x03o\x00\xc3\xff\x9a\x03o\x00\xc4\xff\ +\x85\x03o\x00\xc5\xff\x9a\x03o\x00\xc6\xff\x85\x03o\x00\ +\xc7\xff\x9a\x03o\x00\xc8\xff\xd7\x03o\x00\xc9\xff\x9a\x03\ +o\x00\xca\xff\xd7\x03o\x00\xcb\xff\x9a\x03o\x00\xcc\xff\ +\xd7\x03o\x00\xcd\xff\x9a\x03o\x00\xce\xff\xd7\x03o\x00\ +\xcf\xff\x9a\x03o\x00\xd1\xff\x9a\x03o\x00\xd3\xff\x9a\x03\ +o\x00\xd5\xff\x9a\x03o\x00\xd7\xff\x9a\x03o\x00\xd9\xff\ +\x9a\x03o\x00\xdb\xff\x9a\x03o\x00\xdd\xff\x9a\x03o\x00\ +\xde\xff\xd7\x03o\x00\xdf\xff\xd7\x03o\x00\xe0\xff\xd7\x03\ +o\x00\xe1\xff\xd7\x03o\x00\xe2\xff\xd7\x03o\x00\xe3\xff\ +\xd7\x03o\x00\xe4\xff\xd7\x03o\x00\xe5\xff\xd7\x03o\x00\ +\xfa\xff\xc3\x03o\x01\x06\xff\xc3\x03o\x01\x08\xff\xc3\x03\ +o\x01\x0d\xff\xc3\x03o\x01\x0e\xff\xd7\x03o\x01\x0f\xff\ +\x9a\x03o\x01\x10\xff\xd7\x03o\x01\x11\xff\x9a\x03o\x01\ +\x12\xff\xd7\x03o\x01\x13\xff\x9a\x03o\x01\x14\xff\xd7\x03\ +o\x01\x15\xff\x9a\x03o\x01\x17\xff\xc3\x03o\x01\x19\xff\ +\xc3\x03o\x01\x1d\xff\xae\x03o\x01!\xff\xae\x03o\x01\ ++\xff\xc3\x03o\x01-\xff\xc3\x03o\x01/\xff\xc3\x03\ +o\x011\xff\xc3\x03o\x013\xff\xc3\x03o\x015\xff\ +\xc3\x03o\x01<\xff\xd7\x03o\x01>\xff\xd7\x03o\x01\ +@\xff\xd7\x03o\x01C\xff\x85\x03o\x01D\xff\x9a\x03\ +o\x01F\xff\x9a\x03o\x01G\xff\xd7\x03o\x01H\xff\ +\x9a\x03o\x01J\xff\xae\x03o\x02\x08\xff\x85\x03o\x02\ +\x0c\xff\x85\x03o\x02W\xff\xc3\x03o\x02X\xff\x85\x03\ +o\x02Y\xff\x9a\x03o\x02_\xff\xd7\x03o\x02`\xff\ +\x9a\x03o\x02b\xff\xc3\x03o\x03\x1d\xff\x85\x03o\x03\ +\x1e\xff\x9a\x03o\x03\x1f\xff\x85\x03o\x03 \xff\x9a\x03\ +o\x03!\xff\x85\x03o\x03\x22\xff\x9a\x03o\x03#\xff\ +\x85\x03o\x03%\xff\x85\x03o\x03&\xff\x9a\x03o\x03\ +'\xff\x85\x03o\x03(\xff\x9a\x03o\x03)\xff\x85\x03\ +o\x03*\xff\x9a\x03o\x03+\xff\x85\x03o\x03,\xff\ +\x9a\x03o\x03-\xff\x85\x03o\x03.\xff\x9a\x03o\x03\ +/\xff\x85\x03o\x030\xff\x9a\x03o\x031\xff\x85\x03\ +o\x032\xff\x9a\x03o\x033\xff\x85\x03o\x034\xff\ +\x9a\x03o\x036\xff\x9a\x03o\x038\xff\x9a\x03o\x03\ +:\xff\x9a\x03o\x03<\xff\x9a\x03o\x03@\xff\x9a\x03\ +o\x03B\xff\x9a\x03o\x03D\xff\x9a\x03o\x03I\xff\ +\xd7\x03o\x03J\xff\x9a\x03o\x03K\xff\xd7\x03o\x03\ +L\xff\x9a\x03o\x03M\xff\xd7\x03o\x03N\xff\x9a\x03\ +o\x03O\xff\xd7\x03o\x03Q\xff\xd7\x03o\x03R\xff\ +\x9a\x03o\x03S\xff\xd7\x03o\x03T\xff\x9a\x03o\x03\ +U\xff\xd7\x03o\x03V\xff\x9a\x03o\x03W\xff\xd7\x03\ +o\x03X\xff\x9a\x03o\x03Y\xff\xd7\x03o\x03Z\xff\ +\x9a\x03o\x03[\xff\xd7\x03o\x03\x5c\xff\x9a\x03o\x03\ +]\xff\xd7\x03o\x03^\xff\x9a\x03o\x03_\xff\xd7\x03\ +o\x03`\xff\x9a\x03o\x03b\xff\xc3\x03o\x03d\xff\ +\xc3\x03o\x03f\xff\xc3\x03o\x03h\xff\xc3\x03o\x03\ +j\xff\xc3\x03o\x03l\xff\xc3\x03o\x03n\xff\xc3\x03\ +p\x00\x05\x00R\x03p\x00\x0a\x00R\x03p\x00\x0f\xff\ +\xae\x03p\x00\x11\xff\xae\x03p\x00\x22\x00)\x03p\x02\ +\x07\x00R\x03p\x02\x08\xff\xae\x03p\x02\x0b\x00R\x03\ +p\x02\x0c\xff\xae\x03q\x00\x0f\xff\x85\x03q\x00\x11\xff\ +\x85\x03q\x00\x22\x00)\x03q\x00$\xff\x85\x03q\x00\ +&\xff\xd7\x03q\x00*\xff\xd7\x03q\x002\xff\xd7\x03\ +q\x004\xff\xd7\x03q\x00D\xff\x9a\x03q\x00F\xff\ +\x9a\x03q\x00G\xff\x9a\x03q\x00H\xff\x9a\x03q\x00\ +J\xff\xd7\x03q\x00P\xff\xc3\x03q\x00Q\xff\xc3\x03\ +q\x00R\xff\x9a\x03q\x00S\xff\xc3\x03q\x00T\xff\ +\x9a\x03q\x00U\xff\xc3\x03q\x00V\xff\xae\x03q\x00\ +X\xff\xc3\x03q\x00]\xff\xd7\x03q\x00\x82\xff\x85\x03\ +q\x00\x83\xff\x85\x03q\x00\x84\xff\x85\x03q\x00\x85\xff\ +\x85\x03q\x00\x86\xff\x85\x03q\x00\x87\xff\x85\x03q\x00\ +\x89\xff\xd7\x03q\x00\x94\xff\xd7\x03q\x00\x95\xff\xd7\x03\ +q\x00\x96\xff\xd7\x03q\x00\x97\xff\xd7\x03q\x00\x98\xff\ +\xd7\x03q\x00\x9a\xff\xd7\x03q\x00\xa2\xff\x9a\x03q\x00\ +\xa3\xff\x9a\x03q\x00\xa4\xff\x9a\x03q\x00\xa5\xff\x9a\x03\ +q\x00\xa6\xff\x9a\x03q\x00\xa7\xff\x9a\x03q\x00\xa8\xff\ +\x9a\x03q\x00\xa9\xff\x9a\x03q\x00\xaa\xff\x9a\x03q\x00\ +\xab\xff\x9a\x03q\x00\xac\xff\x9a\x03q\x00\xad\xff\x9a\x03\ +q\x00\xb4\xff\x9a\x03q\x00\xb5\xff\x9a\x03q\x00\xb6\xff\ +\x9a\x03q\x00\xb7\xff\x9a\x03q\x00\xb8\xff\x9a\x03q\x00\ +\xba\xff\x9a\x03q\x00\xbb\xff\xc3\x03q\x00\xbc\xff\xc3\x03\ +q\x00\xbd\xff\xc3\x03q\x00\xbe\xff\xc3\x03q\x00\xc2\xff\ +\x85\x03q\x00\xc3\xff\x9a\x03q\x00\xc4\xff\x85\x03q\x00\ +\xc5\xff\x9a\x03q\x00\xc6\xff\x85\x03q\x00\xc7\xff\x9a\x03\ +q\x00\xc8\xff\xd7\x03q\x00\xc9\xff\x9a\x03q\x00\xca\xff\ +\xd7\x03q\x00\xcb\xff\x9a\x03q\x00\xcc\xff\xd7\x03q\x00\ +\xcd\xff\x9a\x03q\x00\xce\xff\xd7\x03q\x00\xcf\xff\x9a\x03\ +q\x00\xd1\xff\x9a\x03q\x00\xd3\xff\x9a\x03q\x00\xd5\xff\ +\x9a\x03q\x00\xd7\xff\x9a\x03q\x00\xd9\xff\x9a\x03q\x00\ +\xdb\xff\x9a\x03q\x00\xdd\xff\x9a\x03q\x00\xde\xff\xd7\x03\ +q\x00\xdf\xff\xd7\x03q\x00\xe0\xff\xd7\x03q\x00\xe1\xff\ +\xd7\x03q\x00\xe2\xff\xd7\x03q\x00\xe3\xff\xd7\x03q\x00\ +\xe4\xff\xd7\x03q\x00\xe5\xff\xd7\x03q\x00\xfa\xff\xc3\x03\ +q\x01\x06\xff\xc3\x03q\x01\x08\xff\xc3\x03q\x01\x0d\xff\ +\xc3\x03q\x01\x0e\xff\xd7\x03q\x01\x0f\xff\x9a\x03q\x01\ +\x10\xff\xd7\x03q\x01\x11\xff\x9a\x03q\x01\x12\xff\xd7\x03\ +q\x01\x13\xff\x9a\x03q\x01\x14\xff\xd7\x03q\x01\x15\xff\ +\x9a\x03q\x01\x17\xff\xc3\x03q\x01\x19\xff\xc3\x03q\x01\ +\x1d\xff\xae\x03q\x01!\xff\xae\x03q\x01+\xff\xc3\x03\ +q\x01-\xff\xc3\x03q\x01/\xff\xc3\x03q\x011\xff\ +\xc3\x03q\x013\xff\xc3\x03q\x015\xff\xc3\x03q\x01\ +<\xff\xd7\x03q\x01>\xff\xd7\x03q\x01@\xff\xd7\x03\ +q\x01C\xff\x85\x03q\x01D\xff\x9a\x03q\x01F\xff\ +\x9a\x03q\x01G\xff\xd7\x03q\x01H\xff\x9a\x03q\x01\ +J\xff\xae\x03q\x02\x08\xff\x85\x03q\x02\x0c\xff\x85\x03\ +q\x02W\xff\xc3\x03q\x02X\xff\x85\x03q\x02Y\xff\ +\x9a\x03q\x02_\xff\xd7\x03q\x02`\xff\x9a\x03q\x02\ +b\xff\xc3\x03q\x03\x1d\xff\x85\x03q\x03\x1e\xff\x9a\x03\ +q\x03\x1f\xff\x85\x03q\x03 \xff\x9a\x03q\x03!\xff\ +\x85\x03q\x03\x22\xff\x9a\x03q\x03#\xff\x85\x03q\x03\ +%\xff\x85\x03q\x03&\xff\x9a\x03q\x03'\xff\x85\x03\ +q\x03(\xff\x9a\x03q\x03)\xff\x85\x03q\x03*\xff\ +\x9a\x03q\x03+\xff\x85\x03q\x03,\xff\x9a\x03q\x03\ +-\xff\x85\x03q\x03.\xff\x9a\x03q\x03/\xff\x85\x03\ +q\x030\xff\x9a\x03q\x031\xff\x85\x03q\x032\xff\ +\x9a\x03q\x033\xff\x85\x03q\x034\xff\x9a\x03q\x03\ +6\xff\x9a\x03q\x038\xff\x9a\x03q\x03:\xff\x9a\x03\ +q\x03<\xff\x9a\x03q\x03@\xff\x9a\x03q\x03B\xff\ +\x9a\x03q\x03D\xff\x9a\x03q\x03I\xff\xd7\x03q\x03\ +J\xff\x9a\x03q\x03K\xff\xd7\x03q\x03L\xff\x9a\x03\ +q\x03M\xff\xd7\x03q\x03N\xff\x9a\x03q\x03O\xff\ +\xd7\x03q\x03Q\xff\xd7\x03q\x03R\xff\x9a\x03q\x03\ +S\xff\xd7\x03q\x03T\xff\x9a\x03q\x03U\xff\xd7\x03\ +q\x03V\xff\x9a\x03q\x03W\xff\xd7\x03q\x03X\xff\ +\x9a\x03q\x03Y\xff\xd7\x03q\x03Z\xff\x9a\x03q\x03\ +[\xff\xd7\x03q\x03\x5c\xff\x9a\x03q\x03]\xff\xd7\x03\ +q\x03^\xff\x9a\x03q\x03_\xff\xd7\x03q\x03`\xff\ +\x9a\x03q\x03b\xff\xc3\x03q\x03d\xff\xc3\x03q\x03\ +f\xff\xc3\x03q\x03h\xff\xc3\x03q\x03j\xff\xc3\x03\ +q\x03l\xff\xc3\x03q\x03n\xff\xc3\x03r\x00\x05\x00\ +R\x03r\x00\x0a\x00R\x03r\x00\x0f\xff\xae\x03r\x00\ +\x11\xff\xae\x03r\x00\x22\x00)\x03r\x02\x07\x00R\x03\ +r\x02\x08\xff\xae\x03r\x02\x0b\x00R\x03r\x02\x0c\xff\ +\xae\x03s\x00\x0f\xff\x85\x03s\x00\x11\xff\x85\x03s\x00\ +\x22\x00)\x03s\x00$\xff\x85\x03s\x00&\xff\xd7\x03\ +s\x00*\xff\xd7\x03s\x002\xff\xd7\x03s\x004\xff\ +\xd7\x03s\x00D\xff\x9a\x03s\x00F\xff\x9a\x03s\x00\ +G\xff\x9a\x03s\x00H\xff\x9a\x03s\x00J\xff\xd7\x03\ +s\x00P\xff\xc3\x03s\x00Q\xff\xc3\x03s\x00R\xff\ +\x9a\x03s\x00S\xff\xc3\x03s\x00T\xff\x9a\x03s\x00\ +U\xff\xc3\x03s\x00V\xff\xae\x03s\x00X\xff\xc3\x03\ +s\x00]\xff\xd7\x03s\x00\x82\xff\x85\x03s\x00\x83\xff\ +\x85\x03s\x00\x84\xff\x85\x03s\x00\x85\xff\x85\x03s\x00\ +\x86\xff\x85\x03s\x00\x87\xff\x85\x03s\x00\x89\xff\xd7\x03\ +s\x00\x94\xff\xd7\x03s\x00\x95\xff\xd7\x03s\x00\x96\xff\ +\xd7\x03s\x00\x97\xff\xd7\x03s\x00\x98\xff\xd7\x03s\x00\ +\x9a\xff\xd7\x03s\x00\xa2\xff\x9a\x03s\x00\xa3\xff\x9a\x03\ +s\x00\xa4\xff\x9a\x03s\x00\xa5\xff\x9a\x03s\x00\xa6\xff\ +\x9a\x03s\x00\xa7\xff\x9a\x03s\x00\xa8\xff\x9a\x03s\x00\ +\xa9\xff\x9a\x03s\x00\xaa\xff\x9a\x03s\x00\xab\xff\x9a\x03\ +s\x00\xac\xff\x9a\x03s\x00\xad\xff\x9a\x03s\x00\xb4\xff\ +\x9a\x03s\x00\xb5\xff\x9a\x03s\x00\xb6\xff\x9a\x03s\x00\ +\xb7\xff\x9a\x03s\x00\xb8\xff\x9a\x03s\x00\xba\xff\x9a\x03\ +s\x00\xbb\xff\xc3\x03s\x00\xbc\xff\xc3\x03s\x00\xbd\xff\ +\xc3\x03s\x00\xbe\xff\xc3\x03s\x00\xc2\xff\x85\x03s\x00\ +\xc3\xff\x9a\x03s\x00\xc4\xff\x85\x03s\x00\xc5\xff\x9a\x03\ +s\x00\xc6\xff\x85\x03s\x00\xc7\xff\x9a\x03s\x00\xc8\xff\ +\xd7\x03s\x00\xc9\xff\x9a\x03s\x00\xca\xff\xd7\x03s\x00\ +\xcb\xff\x9a\x03s\x00\xcc\xff\xd7\x03s\x00\xcd\xff\x9a\x03\ +s\x00\xce\xff\xd7\x03s\x00\xcf\xff\x9a\x03s\x00\xd1\xff\ +\x9a\x03s\x00\xd3\xff\x9a\x03s\x00\xd5\xff\x9a\x03s\x00\ +\xd7\xff\x9a\x03s\x00\xd9\xff\x9a\x03s\x00\xdb\xff\x9a\x03\ +s\x00\xdd\xff\x9a\x03s\x00\xde\xff\xd7\x03s\x00\xdf\xff\ +\xd7\x03s\x00\xe0\xff\xd7\x03s\x00\xe1\xff\xd7\x03s\x00\ +\xe2\xff\xd7\x03s\x00\xe3\xff\xd7\x03s\x00\xe4\xff\xd7\x03\ +s\x00\xe5\xff\xd7\x03s\x00\xfa\xff\xc3\x03s\x01\x06\xff\ +\xc3\x03s\x01\x08\xff\xc3\x03s\x01\x0d\xff\xc3\x03s\x01\ +\x0e\xff\xd7\x03s\x01\x0f\xff\x9a\x03s\x01\x10\xff\xd7\x03\ +s\x01\x11\xff\x9a\x03s\x01\x12\xff\xd7\x03s\x01\x13\xff\ +\x9a\x03s\x01\x14\xff\xd7\x03s\x01\x15\xff\x9a\x03s\x01\ +\x17\xff\xc3\x03s\x01\x19\xff\xc3\x03s\x01\x1d\xff\xae\x03\ +s\x01!\xff\xae\x03s\x01+\xff\xc3\x03s\x01-\xff\ +\xc3\x03s\x01/\xff\xc3\x03s\x011\xff\xc3\x03s\x01\ +3\xff\xc3\x03s\x015\xff\xc3\x03s\x01<\xff\xd7\x03\ +s\x01>\xff\xd7\x03s\x01@\xff\xd7\x03s\x01C\xff\ +\x85\x03s\x01D\xff\x9a\x03s\x01F\xff\x9a\x03s\x01\ +G\xff\xd7\x03s\x01H\xff\x9a\x03s\x01J\xff\xae\x03\ +s\x02\x08\xff\x85\x03s\x02\x0c\xff\x85\x03s\x02W\xff\ +\xc3\x03s\x02X\xff\x85\x03s\x02Y\xff\x9a\x03s\x02\ +_\xff\xd7\x03s\x02`\xff\x9a\x03s\x02b\xff\xc3\x03\ +s\x03\x1d\xff\x85\x03s\x03\x1e\xff\x9a\x03s\x03\x1f\xff\ +\x85\x03s\x03 \xff\x9a\x03s\x03!\xff\x85\x03s\x03\ +\x22\xff\x9a\x03s\x03#\xff\x85\x03s\x03%\xff\x85\x03\ +s\x03&\xff\x9a\x03s\x03'\xff\x85\x03s\x03(\xff\ +\x9a\x03s\x03)\xff\x85\x03s\x03*\xff\x9a\x03s\x03\ ++\xff\x85\x03s\x03,\xff\x9a\x03s\x03-\xff\x85\x03\ +s\x03.\xff\x9a\x03s\x03/\xff\x85\x03s\x030\xff\ +\x9a\x03s\x031\xff\x85\x03s\x032\xff\x9a\x03s\x03\ +3\xff\x85\x03s\x034\xff\x9a\x03s\x036\xff\x9a\x03\ +s\x038\xff\x9a\x03s\x03:\xff\x9a\x03s\x03<\xff\ +\x9a\x03s\x03@\xff\x9a\x03s\x03B\xff\x9a\x03s\x03\ +D\xff\x9a\x03s\x03I\xff\xd7\x03s\x03J\xff\x9a\x03\ +s\x03K\xff\xd7\x03s\x03L\xff\x9a\x03s\x03M\xff\ +\xd7\x03s\x03N\xff\x9a\x03s\x03O\xff\xd7\x03s\x03\ +Q\xff\xd7\x03s\x03R\xff\x9a\x03s\x03S\xff\xd7\x03\ +s\x03T\xff\x9a\x03s\x03U\xff\xd7\x03s\x03V\xff\ +\x9a\x03s\x03W\xff\xd7\x03s\x03X\xff\x9a\x03s\x03\ +Y\xff\xd7\x03s\x03Z\xff\x9a\x03s\x03[\xff\xd7\x03\ +s\x03\x5c\xff\x9a\x03s\x03]\xff\xd7\x03s\x03^\xff\ +\x9a\x03s\x03_\xff\xd7\x03s\x03`\xff\x9a\x03s\x03\ +b\xff\xc3\x03s\x03d\xff\xc3\x03s\x03f\xff\xc3\x03\ +s\x03h\xff\xc3\x03s\x03j\xff\xc3\x03s\x03l\xff\ +\xc3\x03s\x03n\xff\xc3\x03t\x00\x05\x00R\x03t\x00\ +\x0a\x00R\x03t\x00\x0f\xff\xae\x03t\x00\x11\xff\xae\x03\ +t\x00\x22\x00)\x03t\x02\x07\x00R\x03t\x02\x08\xff\ +\xae\x03t\x02\x0b\x00R\x03t\x02\x0c\xff\xae\x03\x8d\x00\ +\x05\x00{\x03\x8d\x00\x0a\x00{\x03\x8d\x02\x07\x00{\x03\ +\x8d\x02\x0b\x00{\x03\x8f\x00\x0f\xff\x85\x03\x8f\x00\x10\xff\ +\xae\x03\x8f\x00\x11\xff\x85\x03\x8f\x00\x22\x00)\x03\x8f\x00\ +$\xffq\x03\x8f\x00&\xff\xd7\x03\x8f\x00*\xff\xd7\x03\ +\x8f\x002\xff\xd7\x03\x8f\x004\xff\xd7\x03\x8f\x007\x00\ +)\x03\x8f\x00D\xff\x5c\x03\x8f\x00F\xffq\x03\x8f\x00\ +G\xffq\x03\x8f\x00H\xffq\x03\x8f\x00J\xffq\x03\ +\x8f\x00P\xff\x9a\x03\x8f\x00Q\xff\x9a\x03\x8f\x00R\xff\ +q\x03\x8f\x00S\xff\x9a\x03\x8f\x00T\xffq\x03\x8f\x00\ +U\xff\x9a\x03\x8f\x00V\xff\x85\x03\x8f\x00X\xff\x9a\x03\ +\x8f\x00Y\xff\xd7\x03\x8f\x00Z\xff\xd7\x03\x8f\x00[\xff\ +\xd7\x03\x8f\x00\x5c\xff\xd7\x03\x8f\x00]\xff\xae\x03\x8f\x00\ +\x82\xffq\x03\x8f\x00\x83\xffq\x03\x8f\x00\x84\xffq\x03\ +\x8f\x00\x85\xffq\x03\x8f\x00\x86\xffq\x03\x8f\x00\x87\xff\ +q\x03\x8f\x00\x89\xff\xd7\x03\x8f\x00\x94\xff\xd7\x03\x8f\x00\ +\x95\xff\xd7\x03\x8f\x00\x96\xff\xd7\x03\x8f\x00\x97\xff\xd7\x03\ +\x8f\x00\x98\xff\xd7\x03\x8f\x00\x9a\xff\xd7\x03\x8f\x00\xa2\xff\ +q\x03\x8f\x00\xa3\xff\x5c\x03\x8f\x00\xa4\xff\x5c\x03\x8f\x00\ +\xa5\xff\x5c\x03\x8f\x00\xa6\xff\x5c\x03\x8f\x00\xa7\xff\x5c\x03\ +\x8f\x00\xa8\xff\x5c\x03\x8f\x00\xa9\xffq\x03\x8f\x00\xaa\xff\ +q\x03\x8f\x00\xab\xffq\x03\x8f\x00\xac\xffq\x03\x8f\x00\ +\xad\xffq\x03\x8f\x00\xb4\xffq\x03\x8f\x00\xb5\xffq\x03\ +\x8f\x00\xb6\xffq\x03\x8f\x00\xb7\xffq\x03\x8f\x00\xb8\xff\ +q\x03\x8f\x00\xba\xffq\x03\x8f\x00\xbb\xff\x9a\x03\x8f\x00\ +\xbc\xff\x9a\x03\x8f\x00\xbd\xff\x9a\x03\x8f\x00\xbe\xff\x9a\x03\ +\x8f\x00\xbf\xff\xd7\x03\x8f\x00\xc2\xffq\x03\x8f\x00\xc3\xff\ +\x5c\x03\x8f\x00\xc4\xffq\x03\x8f\x00\xc5\xff\x5c\x03\x8f\x00\ +\xc6\xffq\x03\x8f\x00\xc7\xff\x5c\x03\x8f\x00\xc8\xff\xd7\x03\ +\x8f\x00\xc9\xffq\x03\x8f\x00\xca\xff\xd7\x03\x8f\x00\xcb\xff\ +q\x03\x8f\x00\xcc\xff\xd7\x03\x8f\x00\xcd\xffq\x03\x8f\x00\ +\xce\xff\xd7\x03\x8f\x00\xcf\xffq\x03\x8f\x00\xd1\xffq\x03\ +\x8f\x00\xd3\xffq\x03\x8f\x00\xd5\xffq\x03\x8f\x00\xd7\xff\ +q\x03\x8f\x00\xd9\xffq\x03\x8f\x00\xdb\xffq\x03\x8f\x00\ +\xdd\xffq\x03\x8f\x00\xde\xff\xd7\x03\x8f\x00\xdf\xffq\x03\ +\x8f\x00\xe0\xff\xd7\x03\x8f\x00\xe1\xffq\x03\x8f\x00\xe2\xff\ +\xd7\x03\x8f\x00\xe3\xffq\x03\x8f\x00\xe4\xff\xd7\x03\x8f\x00\ +\xe5\xffq\x03\x8f\x00\xfa\xff\x9a\x03\x8f\x01\x06\xff\x9a\x03\ +\x8f\x01\x08\xff\x9a\x03\x8f\x01\x0d\xff\x9a\x03\x8f\x01\x0e\xff\ +\xd7\x03\x8f\x01\x0f\xffq\x03\x8f\x01\x10\xff\xd7\x03\x8f\x01\ +\x11\xffq\x03\x8f\x01\x12\xff\xd7\x03\x8f\x01\x13\xffq\x03\ +\x8f\x01\x14\xff\xd7\x03\x8f\x01\x15\xffq\x03\x8f\x01\x17\xff\ +\x9a\x03\x8f\x01\x19\xff\x9a\x03\x8f\x01\x1d\xff\x85\x03\x8f\x01\ +!\xff\x85\x03\x8f\x01$\x00)\x03\x8f\x01&\x00)\x03\ +\x8f\x01+\xff\x9a\x03\x8f\x01-\xff\x9a\x03\x8f\x01/\xff\ +\x9a\x03\x8f\x011\xff\x9a\x03\x8f\x013\xff\x9a\x03\x8f\x01\ +5\xff\x9a\x03\x8f\x017\xff\xd7\x03\x8f\x01<\xff\xae\x03\ +\x8f\x01>\xff\xae\x03\x8f\x01@\xff\xae\x03\x8f\x01C\xff\ +q\x03\x8f\x01D\xff\x5c\x03\x8f\x01F\xff\x5c\x03\x8f\x01\ +G\xff\xd7\x03\x8f\x01H\xffq\x03\x8f\x01J\xff\x85\x03\ +\x8f\x01\xfb\xff\xd7\x03\x8f\x01\xfd\xff\xd7\x03\x8f\x02\x02\xff\ +\xae\x03\x8f\x02\x03\xff\xae\x03\x8f\x02\x04\xff\xae\x03\x8f\x02\ +\x08\xff\x85\x03\x8f\x02\x0c\xff\x85\x03\x8f\x02W\xff\x9a\x03\ +\x8f\x02X\xffq\x03\x8f\x02Y\xff\x5c\x03\x8f\x02_\xff\ +\xd7\x03\x8f\x02`\xffq\x03\x8f\x02b\xff\x9a\x03\x8f\x03\ +\x1d\xffq\x03\x8f\x03\x1e\xff\x5c\x03\x8f\x03\x1f\xffq\x03\ +\x8f\x03 \xff\x5c\x03\x8f\x03!\xffq\x03\x8f\x03\x22\xff\ +\x5c\x03\x8f\x03#\xffq\x03\x8f\x03%\xffq\x03\x8f\x03\ +&\xff\x5c\x03\x8f\x03'\xffq\x03\x8f\x03(\xff\x5c\x03\ +\x8f\x03)\xffq\x03\x8f\x03*\xff\x5c\x03\x8f\x03+\xff\ +q\x03\x8f\x03,\xff\x5c\x03\x8f\x03-\xffq\x03\x8f\x03\ +.\xff\x5c\x03\x8f\x03/\xffq\x03\x8f\x030\xff\x5c\x03\ +\x8f\x031\xffq\x03\x8f\x032\xff\x5c\x03\x8f\x033\xff\ +q\x03\x8f\x034\xff\x5c\x03\x8f\x036\xffq\x03\x8f\x03\ +8\xffq\x03\x8f\x03:\xffq\x03\x8f\x03<\xffq\x03\ +\x8f\x03@\xffq\x03\x8f\x03B\xffq\x03\x8f\x03D\xff\ +q\x03\x8f\x03I\xff\xd7\x03\x8f\x03J\xffq\x03\x8f\x03\ +K\xff\xd7\x03\x8f\x03L\xffq\x03\x8f\x03M\xff\xd7\x03\ +\x8f\x03N\xffq\x03\x8f\x03O\xff\xd7\x03\x8f\x03Q\xff\ +\xd7\x03\x8f\x03R\xffq\x03\x8f\x03S\xff\xd7\x03\x8f\x03\ +T\xffq\x03\x8f\x03U\xff\xd7\x03\x8f\x03V\xffq\x03\ +\x8f\x03W\xff\xd7\x03\x8f\x03X\xffq\x03\x8f\x03Y\xff\ +\xd7\x03\x8f\x03Z\xffq\x03\x8f\x03[\xff\xd7\x03\x8f\x03\ +\x5c\xffq\x03\x8f\x03]\xff\xd7\x03\x8f\x03^\xffq\x03\ +\x8f\x03_\xff\xd7\x03\x8f\x03`\xffq\x03\x8f\x03b\xff\ +\x9a\x03\x8f\x03d\xff\x9a\x03\x8f\x03f\xff\x9a\x03\x8f\x03\ +h\xff\x9a\x03\x8f\x03j\xff\x9a\x03\x8f\x03l\xff\x9a\x03\ +\x8f\x03n\xff\x9a\x03\x8f\x03p\xff\xd7\x03\x8f\x03\x8f\x00\ +)\x03\x90\x00\x05\x00)\x03\x90\x00\x0a\x00)\x03\x90\x02\ +\x07\x00)\x03\x90\x02\x0b\x00)\x00\x00\x00\x00\x00\x1e\x01\ +n\x00\x01\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x0f\x009\x00\x01\x00\x00\x00\x00\x00\ +\x02\x00\x07\x00H\x00\x01\x00\x00\x00\x00\x00\x03\x00$\x00\ +O\x00\x01\x00\x00\x00\x00\x00\x04\x00\x0f\x009\x00\x01\x00\ +\x00\x00\x00\x00\x05\x00\x0c\x00s\x00\x01\x00\x00\x00\x00\x00\ +\x06\x00\x0e\x00\x7f\x00\x01\x00\x00\x00\x00\x00\x07\x00R\x00\ +\x8d\x00\x01\x00\x00\x00\x00\x00\x08\x00\x14\x00\xdf\x00\x01\x00\ +\x00\x00\x00\x00\x0b\x00\x1c\x00\xf3\x00\x01\x00\x00\x00\x00\x00\ +\x0c\x00.\x01\x0f\x00\x01\x00\x00\x00\x00\x00\x0d\x00.\x01\ +=\x00\x01\x00\x00\x00\x00\x00\x0e\x00*\x01k\x00\x01\x00\ +\x00\x00\x00\x00\x10\x00\x09\x009\x00\x01\x00\x00\x00\x00\x00\ +\x11\x00\x05\x00C\x00\x03\x00\x01\x04\x09\x00\x00\x00r\x01\ +\x95\x00\x03\x00\x01\x04\x09\x00\x01\x00\x1e\x02\x07\x00\x03\x00\ +\x01\x04\x09\x00\x02\x00\x0e\x02%\x00\x03\x00\x01\x04\x09\x00\ +\x03\x00H\x023\x00\x03\x00\x01\x04\x09\x00\x04\x00\x1e\x02\ +\x07\x00\x03\x00\x01\x04\x09\x00\x05\x00\x18\x02{\x00\x03\x00\ +\x01\x04\x09\x00\x06\x00\x1c\x02\x93\x00\x03\x00\x01\x04\x09\x00\ +\x07\x00\xa4\x02\xaf\x00\x03\x00\x01\x04\x09\x00\x08\x00(\x03\ +S\x00\x03\x00\x01\x04\x09\x00\x0b\x008\x03{\x00\x03\x00\ +\x01\x04\x09\x00\x0c\x00\x5c\x03\xb3\x00\x03\x00\x01\x04\x09\x00\ +\x0d\x00\x5c\x04\x0f\x00\x03\x00\x01\x04\x09\x00\x0e\x00T\x04\ +k\x00\x03\x00\x01\x04\x09\x00\x10\x00\x12\x02\x07\x00\x03\x00\ +\x01\x04\x09\x00\x11\x00\x0a\x02\x1bDigitiz\ +ed data copyrigh\ +t \xa9 2010-2011, G\ +oogle Corporatio\ +n.Open Sans Ligh\ +tRegularAscender\ + - Open Sans Lig\ +ht Build 100Vers\ +ion 1.10OpenSans\ +-LightOpen Sans \ +is a trademark o\ +f Google and may\ + be registered i\ +n certain jurisd\ +ictions.Ascender\ + Corporationhttp\ +://www.ascenderc\ +orp.com/http://w\ +ww.ascendercorp.\ +com/typedesigner\ +s.htmlLicensed u\ +nder the Apache \ +License, Version\ + 2.0http://www.a\ +pache.org/licens\ +es/LICENSE-2.0\x00D\ +\x00i\x00g\x00i\x00t\x00i\x00z\x00e\x00d\ +\x00 \x00d\x00a\x00t\x00a\x00 \x00c\x00o\ +\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \ +\x00\xa9\x00 \x002\x000\x001\x000\x00-\x002\ +\x000\x001\x001\x00,\x00 \x00G\x00o\x00o\ +\x00g\x00l\x00e\x00 \x00C\x00o\x00r\x00p\ +\x00o\x00r\x00a\x00t\x00i\x00o\x00n\x00.\ +\x00O\x00p\x00e\x00n\x00 \x00S\x00a\x00n\ +\x00s\x00 \x00L\x00i\x00g\x00h\x00t\x00R\ +\x00e\x00g\x00u\x00l\x00a\x00r\x00A\x00s\ +\x00c\x00e\x00n\x00d\x00e\x00r\x00 \x00-\ +\x00 \x00O\x00p\x00e\x00n\x00 \x00S\x00a\ +\x00n\x00s\x00 \x00L\x00i\x00g\x00h\x00t\ +\x00 \x00B\x00u\x00i\x00l\x00d\x00 \x001\ +\x000\x000\x00V\x00e\x00r\x00s\x00i\x00o\ +\x00n\x00 \x001\x00.\x001\x000\x00O\x00p\ +\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00L\ +\x00i\x00g\x00h\x00t\x00O\x00p\x00e\x00n\ +\x00 \x00S\x00a\x00n\x00s\x00 \x00i\x00s\ +\x00 \x00a\x00 \x00t\x00r\x00a\x00d\x00e\ +\x00m\x00a\x00r\x00k\x00 \x00o\x00f\x00 \ +\x00G\x00o\x00o\x00g\x00l\x00e\x00 \x00a\ +\x00n\x00d\x00 \x00m\x00a\x00y\x00 \x00b\ +\x00e\x00 \x00r\x00e\x00g\x00i\x00s\x00t\ +\x00e\x00r\x00e\x00d\x00 \x00i\x00n\x00 \ +\x00c\x00e\x00r\x00t\x00a\x00i\x00n\x00 \ +\x00j\x00u\x00r\x00i\x00s\x00d\x00i\x00c\ +\x00t\x00i\x00o\x00n\x00s\x00.\x00A\x00s\ +\x00c\x00e\x00n\x00d\x00e\x00r\x00 \x00C\ +\x00o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\ +\x00o\x00n\x00h\x00t\x00t\x00p\x00:\x00/\ +\x00/\x00w\x00w\x00w\x00.\x00a\x00s\x00c\ +\x00e\x00n\x00d\x00e\x00r\x00c\x00o\x00r\ +\x00p\x00.\x00c\x00o\x00m\x00/\x00h\x00t\ +\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\ +\x00.\x00a\x00s\x00c\x00e\x00n\x00d\x00e\ +\x00r\x00c\x00o\x00r\x00p\x00.\x00c\x00o\ +\x00m\x00/\x00t\x00y\x00p\x00e\x00d\x00e\ +\x00s\x00i\x00g\x00n\x00e\x00r\x00s\x00.\ +\x00h\x00t\x00m\x00l\x00L\x00i\x00c\x00e\ +\x00n\x00s\x00e\x00d\x00 \x00u\x00n\x00d\ +\x00e\x00r\x00 \x00t\x00h\x00e\x00 \x00A\ +\x00p\x00a\x00c\x00h\x00e\x00 \x00L\x00i\ +\x00c\x00e\x00n\x00s\x00e\x00,\x00 \x00V\ +\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x002\ +\x00.\x000\x00h\x00t\x00t\x00p\x00:\x00/\ +\x00/\x00w\x00w\x00w\x00.\x00a\x00p\x00a\ +\x00c\x00h\x00e\x00.\x00o\x00r\x00g\x00/\ +\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00s\ +\x00/\x00L\x00I\x00C\x00E\x00N\x00S\x00E\ +\x00-\x002\x00.\x000\x00\x00\x00\x00\x02\x00\x00\x00\ +\x00\x00\x00\xfff\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xaa\x01\x02\x01\ +\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\ +\x0b\x01\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\ +\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\ +\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\x22\x01\ +#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\ ++\x01,\x01-\x01.\x01/\x010\x011\x012\x01\ +3\x014\x015\x016\x017\x018\x019\x01:\x01\ +;\x01<\x01=\x01>\x01?\x01@\x01A\x01B\x01\ +C\x01D\x01E\x01F\x01G\x01H\x01I\x01J\x01\ +K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01\ +S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x01\ +[\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x01\ +{\x01|\x01}\x01~\x01\x7f\x01\x80\x01\x81\x01\x82\x01\ +\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\ +\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\ +\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\ +\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\ +\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\ +\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\ +\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\ +\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\ +\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\ +\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\ +\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\ +\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\ +\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\ +\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\ +\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\ +\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\ +\x03\x02\x04\x02\x05\x02\x06\x02\x07\x02\x08\x02\x09\x02\x0a\x02\ +\x0b\x02\x0c\x02\x0d\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\ +\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\ +\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\x22\x02\ +#\x02$\x02%\x02&\x02'\x02(\x02)\x02*\x02\ ++\x02,\x02-\x02.\x02/\x020\x021\x022\x02\ +3\x024\x025\x026\x027\x028\x029\x02:\x02\ +;\x02<\x02=\x02>\x02?\x02@\x02A\x02B\x02\ +C\x02D\x02E\x02F\x02G\x02H\x02I\x02J\x02\ +K\x02L\x02M\x02N\x02O\x02P\x02Q\x02R\x02\ +S\x02T\x02U\x02V\x02W\x02X\x02Y\x02Z\x02\ +[\x02\x5c\x02]\x02^\x02_\x02`\x02a\x02b\x02\ +c\x02d\x02e\x02f\x02g\x02h\x02i\x02j\x02\ +k\x02l\x02m\x02n\x02o\x02p\x02q\x02r\x02\ +s\x02t\x02u\x02v\x02w\x02x\x02y\x02z\x02\ +{\x02|\x02}\x02~\x02\x7f\x02\x80\x02\x81\x02\x82\x02\ +\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\ +\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\ +\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\ +\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\ +\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\ +\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\ +\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\ +\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\ +\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\ +\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\ +\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\ +\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\ +\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\ +\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\ +\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\ +\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\ +\x03\x03\x04\x03\x05\x03\x06\x03\x07\x03\x08\x03\x09\x03\x0a\x03\ +\x0b\x03\x0c\x03\x0d\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\ +\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\ +\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\x22\x03\ +#\x03$\x03%\x03&\x03'\x03(\x03)\x03*\x03\ ++\x03,\x03-\x03.\x03/\x030\x031\x032\x03\ +3\x034\x035\x036\x037\x038\x039\x03:\x03\ +;\x03<\x03=\x03>\x03?\x03@\x03A\x03B\x03\ +C\x03D\x03E\x03F\x03G\x03H\x03I\x03J\x03\ +K\x03L\x03M\x03N\x03O\x03P\x03Q\x03R\x03\ +S\x03T\x03U\x03V\x03W\x03X\x03Y\x03Z\x03\ +[\x03\x5c\x03]\x03^\x03_\x03`\x03a\x03b\x03\ +c\x03d\x03e\x03f\x03g\x03h\x03i\x03j\x03\ +k\x03l\x03m\x03n\x03o\x03p\x03q\x03r\x03\ +s\x03t\x03u\x03v\x03w\x03x\x03y\x03z\x03\ +{\x03|\x03}\x03~\x03\x7f\x03\x80\x03\x81\x03\x82\x03\ +\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\ +\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\ +\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\ +\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\ +\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\ +\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x03\xb2\x03\ +\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\ +\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc2\x03\ +\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x03\xca\x03\ +\xcb\x03\xcc\x03\xcd\x03\xce\x03\xcf\x03\xd0\x03\xd1\x03\xd2\x03\ +\xd3\x03\xd4\x03\xd5\x03\xd6\x03\xd7\x03\xd8\x03\xd9\x03\xda\x03\ +\xdb\x03\xdc\x03\xdd\x03\xde\x03\xdf\x03\xe0\x03\xe1\x03\xe2\x03\ +\xe3\x03\xe4\x03\xe5\x03\xe6\x03\xe7\x03\xe8\x03\xe9\x03\xea\x03\ +\xeb\x03\xec\x03\xed\x03\xee\x03\xef\x03\xf0\x03\xf1\x03\xf2\x03\ +\xf3\x03\xf4\x03\xf5\x03\xf6\x03\xf7\x03\xf8\x03\xf9\x03\xfa\x03\ +\xfb\x03\xfc\x03\xfd\x03\xfe\x03\xff\x04\x00\x04\x01\x04\x02\x04\ +\x03\x04\x04\x04\x05\x04\x06\x04\x07\x04\x08\x04\x09\x04\x0a\x04\ +\x0b\x04\x0c\x04\x0d\x04\x0e\x04\x0f\x04\x10\x04\x11\x04\x12\x04\ +\x13\x04\x14\x04\x15\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\ +\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04 \x04!\x04\x22\x04\ +#\x04$\x04%\x04&\x04'\x04(\x04)\x04*\x04\ ++\x04,\x04-\x04.\x04/\x040\x041\x042\x04\ +3\x044\x045\x046\x047\x048\x049\x04:\x04\ +;\x04<\x04=\x04>\x04?\x04@\x04A\x04B\x04\ +C\x04D\x04E\x04F\x04G\x04H\x04I\x04J\x04\ +K\x04L\x04M\x04N\x04O\x04P\x04Q\x04R\x04\ +S\x04T\x04U\x04V\x04W\x04X\x04Y\x04Z\x04\ +[\x04\x5c\x04]\x04^\x04_\x04`\x04a\x04b\x04\ +c\x04d\x04e\x04f\x04g\x04h\x04i\x04j\x04\ +k\x04l\x04m\x04n\x04o\x04p\x04q\x04r\x04\ +s\x04t\x04u\x04v\x04w\x04x\x04y\x04z\x04\ +{\x04|\x04}\x04~\x04\x7f\x04\x80\x04\x81\x04\x82\x04\ +\x83\x04\x84\x04\x85\x04\x86\x04\x87\x04\x88\x04\x89\x04\x8a\x04\ +\x8b\x04\x8c\x04\x8d\x04\x8e\x04\x8f\x04\x90\x04\x91\x04\x92\x04\ +\x93\x04\x94\x04\x95\x04\x96\x04\x97\x04\x98\x04\x99\x04\x9a\x04\ +\x9b\x04\x9c\x04\x9d\x04\x9e\x04\x9f\x04\xa0\x04\xa1\x04\xa2\x04\ +\xa3\x04\xa4\x04\xa5\x04\xa6\x04\xa7\x04\xa8\x04\xa9\x04\xaa\x04\ +\xab\x07.notdef\x04null\x10n\ +onmarkingreturn\x05\ +space\x06exclam\x08quo\ +tedbl\x0anumbersign\ +\x06dollar\x07percent\x09\ +ampersand\x0bquotes\ +ingle\x09parenleft\x0a\ +parenright\x08aster\ +isk\x04plus\x05comma\x06h\ +yphen\x06period\x05sla\ +sh\x04zero\x03one\x03two\x05\ +three\x04four\x04five\x03\ +six\x05seven\x05eight\x04\ +nine\x05colon\x09semic\ +olon\x04less\x05equal\x07\ +greater\x08question\ +\x02at\x01A\x01B\x01C\x01D\x01E\x01F\x01\ +G\x01H\x05I.alt\x01J\x01K\x01L\x01\ +M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01\ +U\x01V\x01W\x01X\x01Y\x01Z\x0bbrac\ +ketleft\x09backslas\ +h\x0cbracketright\x0ba\ +sciicircum\x0aunder\ +score\x05grave\x01a\x01b\x01\ +c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x09\ +braceleft\x03bar\x0abr\ +aceright\x0aasciiti\ +lde\x10nonbreakings\ +pace\x0aexclamdown\x04\ +cent\x08sterling\x08cu\ +rrency\x03yen\x09broke\ +nbar\x07section\x08die\ +resis\x09copyright\x0b\ +ordfeminine\x0dguil\ +lemotleft\x0alogica\ +lnot\x07uni00AD\x0areg\ +istered\x09overscor\ +e\x06degree\x09plusmin\ +us\x0btwosuperior\x0dt\ +hreesuperior\x05acu\ +te\x02mu\x09paragraph\x0e\ +periodcentered\x07c\ +edilla\x0bonesuperi\ +or\x0cordmasculine\x0e\ +guillemotright\x0ao\ +nequarter\x07onehal\ +f\x0dthreequarters\x0c\ +questiondown\x06Agr\ +ave\x06Aacute\x0bAcirc\ +umflex\x06Atilde\x09Ad\ +ieresis\x05Aring\x02AE\ +\x08Ccedilla\x06Egrave\ +\x06Eacute\x0bEcircumf\ +lex\x09Edieresis\x0aIg\ +rave.alt\x0aIacute.\ +alt\x0fIcircumflex.\ +alt\x0dIdieresis.al\ +t\x03Eth\x06Ntilde\x06Ogr\ +ave\x06Oacute\x0bOcirc\ +umflex\x06Otilde\x09Od\ +ieresis\x08multiply\ +\x06Oslash\x06Ugrave\x06U\ +acute\x0bUcircumfle\ +x\x09Udieresis\x06Yacu\ +te\x05Thorn\x0agermand\ +bls\x06agrave\x06aacut\ +e\x0bacircumflex\x06at\ +ilde\x09adieresis\x05a\ +ring\x02ae\x08ccedilla\ +\x06egrave\x06eacute\x0be\ +circumflex\x09edier\ +esis\x06igrave\x06iacu\ +te\x0bicircumflex\x09i\ +dieresis\x03eth\x06nti\ +lde\x06ograve\x06oacut\ +e\x0bocircumflex\x06ot\ +ilde\x09odieresis\x06d\ +ivide\x06oslash\x06ugr\ +ave\x06uacute\x0bucirc\ +umflex\x09udieresis\ +\x06yacute\x05thorn\x09yd\ +ieresis\x07Amacron\x07\ +amacron\x06Abreve\x06a\ +breve\x07Aogonek\x07ao\ +gonek\x06Cacute\x06cac\ +ute\x0bCcircumflex\x0b\ +ccircumflex\x04Cdot\ +\x04cdot\x06Ccaron\x06cca\ +ron\x06Dcaron\x06dcaro\ +n\x06Dcroat\x06dcroat\x07\ +Emacron\x07emacron\x06\ +Ebreve\x06ebreve\x0aEd\ +otaccent\x0aedotacc\ +ent\x07Eogonek\x07eogo\ +nek\x06Ecaron\x06ecaro\ +n\x0bGcircumflex\x0bgc\ +ircumflex\x06Gbreve\ +\x06gbreve\x04Gdot\x04gdo\ +t\x0cGcommaaccent\x0cg\ +commaaccent\x0bHcir\ +cumflex\x0bhcircumf\ +lex\x04Hbar\x04hbar\x0aIt\ +ilde.alt\x06itilde\x0b\ +Imacron.alt\x07imac\ +ron\x0aIbreve.alt\x06i\ +breve\x0bIogonek.al\ +t\x07iogonek\x0eIdotac\ +cent.alt\x08dotless\ +i\x06IJ.alt\x02ij\x0bJcir\ +cumflex\x0bjcircumf\ +lex\x0cKcommaaccent\ +\x0ckcommaaccent\x0ckg\ +reenlandic\x06Lacut\ +e\x06lacute\x0cLcommaa\ +ccent\x0clcommaacce\ +nt\x06Lcaron\x06lcaron\ +\x04Ldot\x04ldot\x06Lslas\ +h\x06lslash\x06Nacute\x06\ +nacute\x0cNcommaacc\ +ent\x0cncommaaccent\ +\x06Ncaron\x06ncaron\x0bn\ +apostrophe\x03Eng\x03e\ +ng\x07Omacron\x07omacr\ +on\x06Obreve\x06obreve\ +\x0dOhungarumlaut\x0do\ +hungarumlaut\x02OE\x02\ +oe\x06Racute\x06racute\ +\x0cRcommaaccent\x0crc\ +ommaaccent\x06Rcaro\ +n\x06rcaron\x06Sacute\x06\ +sacute\x0bScircumfl\ +ex\x0bscircumflex\x08S\ +cedilla\x08scedilla\ +\x06Scaron\x06scaron\x0cT\ +commaaccent\x0ctcom\ +maaccent\x06Tcaron\x06\ +tcaron\x04Tbar\x04tbar\ +\x06Utilde\x06utilde\x07U\ +macron\x07umacron\x06U\ +breve\x06ubreve\x05Uri\ +ng\x05uring\x0dUhungar\ +umlaut\x0duhungarum\ +laut\x07Uogonek\x07uog\ +onek\x0bWcircumflex\ +\x0bwcircumflex\x0bYci\ +rcumflex\x0bycircum\ +flex\x09Ydieresis\x06Z\ +acute\x06zacute\x0aZdo\ +taccent\x0azdotacce\ +nt\x06Zcaron\x06zcaron\ +\x05longs\x06florin\x0aAr\ +ingacute\x0aaringac\ +ute\x07AEacute\x07aeac\ +ute\x0bOslashacute\x0b\ +oslashacute\x0cScom\ +maaccent\x0cscommaa\ +ccent\x0acircumflex\ +\x05caron\x06macron\x05br\ +eve\x09dotaccent\x04ri\ +ng\x06ogonek\x05tilde\x0c\ +hungarumlaut\x05ton\ +os\x0ddieresistonos\ +\x0aAlphatonos\x09anot\ +eleia\x0cEpsilonton\ +os\x08Etatonos\x0dIota\ +tonos.alt\x0cOmicro\ +ntonos\x0cUpsilonto\ +nos\x0aOmegatonos\x11i\ +otadieresistonos\ +\x05Alpha\x04Beta\x05Gamm\ +a\x07uni0394\x07Epsilo\ +n\x04Zeta\x03Eta\x05Theta\ +\x08Iota.alt\x05Kappa\x06\ +Lambda\x02Mu\x02Nu\x02Xi\x07\ +Omicron\x02Pi\x03Rho\x05S\ +igma\x03Tau\x07Upsilon\ +\x03Phi\x03Chi\x03Psi\x07uni\ +03A9\x10Iotadieresi\ +s.alt\x0fUpsilondie\ +resis\x0aalphatonos\ +\x0cepsilontonos\x08et\ +atonos\x09iotatonos\ +\x14upsilondieresis\ +tonos\x05alpha\x04beta\ +\x05gamma\x05delta\x07eps\ +ilon\x04zeta\x03eta\x05th\ +eta\x04iota\x05kappa\x06l\ +ambda\x07uni03BC\x02nu\ +\x02xi\x07omicron\x02pi\x03r\ +ho\x06sigma1\x05sigma\x03\ +tau\x07upsilon\x03phi\x03\ +chi\x03psi\x05omega\x0cio\ +tadieresis\x0fupsil\ +ondieresis\x0comicr\ +ontonos\x0cupsilont\ +onos\x0aomegatonos\x09\ +afii10023\x09afii10\ +051\x09afii10052\x09af\ +ii10053\x09afii1005\ +4\x0dafii10055.alt\x0d\ +afii10056.alt\x09af\ +ii10057\x09afii1005\ +8\x09afii10059\x09afii\ +10060\x09afii10061\x09\ +afii10062\x09afii10\ +145\x09afii10017\x09af\ +ii10018\x09afii1001\ +9\x09afii10020\x09afii\ +10021\x09afii10022\x09\ +afii10024\x09afii10\ +025\x09afii10026\x09af\ +ii10027\x09afii1002\ +8\x09afii10029\x09afii\ +10030\x09afii10031\x09\ +afii10032\x09afii10\ +033\x09afii10034\x09af\ +ii10035\x09afii1003\ +6\x09afii10037\x09afii\ +10038\x09afii10039\x09\ +afii10040\x09afii10\ +041\x09afii10042\x09af\ +ii10043\x09afii1004\ +4\x09afii10045\x09afii\ +10046\x09afii10047\x09\ +afii10048\x09afii10\ +049\x09afii10065\x09af\ +ii10066\x09afii1006\ +7\x09afii10068\x09afii\ +10069\x09afii10070\x09\ +afii10072\x09afii10\ +073\x09afii10074\x09af\ +ii10075\x09afii1007\ +6\x09afii10077\x09afii\ +10078\x09afii10079\x09\ +afii10080\x09afii10\ +081\x09afii10082\x09af\ +ii10083\x09afii1008\ +4\x09afii10085\x09afii\ +10086\x09afii10087\x09\ +afii10088\x09afii10\ +089\x09afii10090\x09af\ +ii10091\x09afii1009\ +2\x09afii10093\x09afii\ +10094\x09afii10095\x09\ +afii10096\x09afii10\ +097\x09afii10071\x09af\ +ii10099\x09afii1010\ +0\x09afii10101\x09afii\ +10102\x09afii10103\x09\ +afii10104\x09afii10\ +105\x09afii10106\x09af\ +ii10107\x09afii1010\ +8\x09afii10109\x09afii\ +10110\x09afii10193\x09\ +afii10050\x09afii10\ +098\x06Wgrave\x06wgrav\ +e\x06Wacute\x06wacute\x09\ +Wdieresis\x09wdiere\ +sis\x06Ygrave\x06ygrav\ +e\x06endash\x06emdash\x09\ +afii00208\x0dunders\ +coredbl\x09quotelef\ +t\x0aquoteright\x0equo\ +tesinglbase\x0dquot\ +ereversed\x0cquoted\ +blleft\x0dquotedblr\ +ight\x0cquotedblbas\ +e\x06dagger\x09daggerd\ +bl\x06bullet\x08ellips\ +is\x0bperthousand\x06m\ +inute\x06second\x0dgui\ +lsinglleft\x0eguils\ +inglright\x09exclam\ +dbl\x08fraction\x09nsu\ +perior\x05franc\x09afi\ +i08941\x06peseta\x04Eu\ +ro\x09afii61248\x09afi\ +i61289\x09afii61352\ +\x09trademark\x05Omega\ +\x09estimated\x09oneei\ +ghth\x0cthreeeighth\ +s\x0bfiveeighths\x0cse\ +veneighths\x0bparti\ +aldiff\x05Delta\x07pro\ +duct\x09summation\x05m\ +inus\x07radical\x08inf\ +inity\x08integral\x0ba\ +pproxequal\x08noteq\ +ual\x09lessequal\x0cgr\ +eaterequal\x07lozen\ +ge\x07uniFB01\x07uniFB\ +02\x0dcyrillicbreve\ +\x08dotlessj\x10caronc\ +ommaaccent\x0bcomma\ +accent\x11commaacce\ +ntrotate\x0czerosup\ +erior\x0cfoursuperi\ +or\x0cfivesuperior\x0b\ +sixsuperior\x0dseve\ +nsuperior\x0deights\ +uperior\x0cninesupe\ +rior\x07uni2000\x07uni\ +2001\x07uni2002\x07uni\ +2003\x07uni2004\x07uni\ +2005\x07uni2006\x07uni\ +2007\x07uni2008\x07uni\ +2009\x07uni200A\x07uni\ +200B\x07uniFEFF\x07uni\ +FFFC\x07uniFFFD\x07uni\ +01F0\x07uni02BC\x07uni\ +03D1\x07uni03D2\x07uni\ +03D6\x07uni1E3E\x07uni\ +1E3F\x07uni1E00\x07uni\ +1E01\x07uni1F4D\x07uni\ +02F3\x09dasiaoxia\x07u\ +niFB03\x07uniFB04\x05O\ +horn\x05ohorn\x05Uhorn\ +\x05uhorn\x07uni0300\x07u\ +ni0301\x07uni0303\x04h\ +ook\x08dotbelow\x07uni\ +0400\x07uni040D\x07uni\ +0450\x07uni045D\x07uni\ +0460\x07uni0461\x07uni\ +0462\x07uni0463\x07uni\ +0464\x07uni0465\x07uni\ +0466\x07uni0467\x07uni\ +0468\x07uni0469\x07uni\ +046A\x07uni046B\x07uni\ +046C\x07uni046D\x07uni\ +046E\x07uni046F\x07uni\ +0470\x07uni0471\x07uni\ +0472\x07uni0473\x07uni\ +0474\x07uni0475\x07uni\ +0476\x07uni0477\x07uni\ +0478\x07uni0479\x07uni\ +047A\x07uni047B\x07uni\ +047C\x07uni047D\x07uni\ +047E\x07uni047F\x07uni\ +0480\x07uni0481\x07uni\ +0482\x07uni0483\x07uni\ +0484\x07uni0485\x07uni\ +0486\x07uni0488\x07uni\ +0489\x07uni048A\x07uni\ +048B\x07uni048C\x07uni\ +048D\x07uni048E\x07uni\ +048F\x07uni0492\x07uni\ +0493\x07uni0494\x07uni\ +0495\x07uni0496\x07uni\ +0497\x07uni0498\x07uni\ +0499\x07uni049A\x07uni\ +049B\x07uni049C\x07uni\ +049D\x07uni049E\x07uni\ +049F\x07uni04A0\x07uni\ +04A1\x07uni04A2\x07uni\ +04A3\x07uni04A4\x07uni\ +04A5\x07uni04A6\x07uni\ +04A7\x07uni04A8\x07uni\ +04A9\x07uni04AA\x07uni\ +04AB\x07uni04AC\x07uni\ +04AD\x07uni04AE\x07uni\ +04AF\x07uni04B0\x07uni\ +04B1\x07uni04B2\x07uni\ +04B3\x07uni04B4\x07uni\ +04B5\x07uni04B6\x07uni\ +04B7\x07uni04B8\x07uni\ +04B9\x07uni04BA\x07uni\ +04BB\x07uni04BC\x07uni\ +04BD\x07uni04BE\x07uni\ +04BF\x0buni04C0.alt\ +\x07uni04C1\x07uni04C2\ +\x07uni04C3\x07uni04C4\ +\x07uni04C5\x07uni04C6\ +\x07uni04C7\x07uni04C8\ +\x07uni04C9\x07uni04CA\ +\x07uni04CB\x07uni04CC\ +\x07uni04CD\x07uni04CE\ +\x0buni04CF.alt\x07uni\ +04D0\x07uni04D1\x07uni\ +04D2\x07uni04D3\x07uni\ +04D4\x07uni04D5\x07uni\ +04D6\x07uni04D7\x07uni\ +04D8\x07uni04D9\x07uni\ +04DA\x07uni04DB\x07uni\ +04DC\x07uni04DD\x07uni\ +04DE\x07uni04DF\x07uni\ +04E0\x07uni04E1\x07uni\ +04E2\x07uni04E3\x07uni\ +04E4\x07uni04E5\x07uni\ +04E6\x07uni04E7\x07uni\ +04E8\x07uni04E9\x07uni\ +04EA\x07uni04EB\x07uni\ +04EC\x07uni04ED\x07uni\ +04EE\x07uni04EF\x07uni\ +04F0\x07uni04F1\x07uni\ +04F2\x07uni04F3\x07uni\ +04F4\x07uni04F5\x07uni\ +04F6\x07uni04F7\x07uni\ +04F8\x07uni04F9\x07uni\ +04FA\x07uni04FB\x07uni\ +04FC\x07uni04FD\x07uni\ +04FE\x07uni04FF\x07uni\ +0500\x07uni0501\x07uni\ +0502\x07uni0503\x07uni\ +0504\x07uni0505\x07uni\ +0506\x07uni0507\x07uni\ +0508\x07uni0509\x07uni\ +050A\x07uni050B\x07uni\ +050C\x07uni050D\x07uni\ +050E\x07uni050F\x07uni\ +0510\x07uni0511\x07uni\ +0512\x07uni0513\x07uni\ +1EA0\x07uni1EA1\x07uni\ +1EA2\x07uni1EA3\x07uni\ +1EA4\x07uni1EA5\x07uni\ +1EA6\x07uni1EA7\x07uni\ +1EA8\x07uni1EA9\x07uni\ +1EAA\x07uni1EAB\x07uni\ +1EAC\x07uni1EAD\x07uni\ +1EAE\x07uni1EAF\x07uni\ +1EB0\x07uni1EB1\x07uni\ +1EB2\x07uni1EB3\x07uni\ +1EB4\x07uni1EB5\x07uni\ +1EB6\x07uni1EB7\x07uni\ +1EB8\x07uni1EB9\x07uni\ +1EBA\x07uni1EBB\x07uni\ +1EBC\x07uni1EBD\x07uni\ +1EBE\x07uni1EBF\x07uni\ +1EC0\x07uni1EC1\x07uni\ +1EC2\x07uni1EC3\x07uni\ +1EC4\x07uni1EC5\x07uni\ +1EC6\x07uni1EC7\x0buni\ +1EC8.alt\x07uni1EC9\ +\x0buni1ECA.alt\x07uni\ +1ECB\x07uni1ECC\x07uni\ +1ECD\x07uni1ECE\x07uni\ +1ECF\x07uni1ED0\x07uni\ +1ED1\x07uni1ED2\x07uni\ +1ED3\x07uni1ED4\x07uni\ +1ED5\x07uni1ED6\x07uni\ +1ED7\x07uni1ED8\x07uni\ +1ED9\x07uni1EDA\x07uni\ +1EDB\x07uni1EDC\x07uni\ +1EDD\x07uni1EDE\x07uni\ +1EDF\x07uni1EE0\x07uni\ +1EE1\x07uni1EE2\x07uni\ +1EE3\x07uni1EE4\x07uni\ +1EE5\x07uni1EE6\x07uni\ +1EE7\x07uni1EE8\x07uni\ +1EE9\x07uni1EEA\x07uni\ +1EEB\x07uni1EEC\x07uni\ +1EED\x07uni1EEE\x07uni\ +1EEF\x07uni1EF0\x07uni\ +1EF1\x07uni1EF4\x07uni\ +1EF5\x07uni1EF6\x07uni\ +1EF7\x07uni1EF8\x07uni\ +1EF9\x07uni20AB\x07uni\ +030F\x13circumflexa\ +cutecomb\x13circumf\ +lexgravecomb\x12cir\ +cumflexhookcomb\x13\ +circumflextildec\ +omb\x0ebreveacuteco\ +mb\x0ebrevegravecom\ +b\x0dbrevehookcomb\x0e\ +brevetildecomb\x10c\ +yrillichookleft\x11\ +cyrillicbighookU\ +C\x11cyrillicbighoo\ +kLC\x08one.pnum\x07zer\ +o.os\x06one.os\x06two.\ +os\x08three.os\x07four\ +.os\x07five.os\x06six.\ +os\x08seven.os\x08eigh\ +t.os\x07nine.os\x02ff\x07\ +uni2120\x08Tcedilla\ +\x08tcedilla\x05g.alt\x0f\ +gcircumflex.alt\x0a\ +gbreve.alt\x08gdot.\ +alt\x10gcommaaccent\ +.alt\x01I\x06Igrave\x06Ia\ +cute\x0bIcircumflex\ +\x09Idieresis\x06Itild\ +e\x07Imacron\x06Ibreve\ +\x07Iogonek\x0aIdotacc\ +ent\x02IJ\x09Iotatonos\ +\x04Iota\x0cIotadieres\ +is\x09afii10055\x09afi\ +i10056\x07uni04C0\x07u\ +ni04CF\x07uni1EC8\x07u\ +ni1ECA\x00\x00\x01\x00\x03\x00\x08\x00\x0a\x00\ +\x16\x00\x07\xff\xff\x00\x0f\x00\x01\x00\x00\x00\x0c\x00\x00\x00\ +\x16\x00\x00\x00\x02\x00\x01\x00\x00\x03\xa9\x00\x01\x00\x04\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x004\x00\ +6\x00\x01latn\x00\x08\x00\x10\x00\x02MOL\ + \x00\x16ROM \x00\x1c\x00\x00\xff\xff\x00\x00\x00\ +\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\ +\x01\x00\x00\x00\x0a\x00n\x01\xe4\x00\x01latn\x00\ +\x08\x00\x10\x00\x02MOL \x00(ROM \x00\ +B\x00\x00\xff\xff\x00\x09\x00\x03\x00\x08\x00\x0b\x00\x00\x00\ +\x0e\x00\x11\x00\x14\x00\x17\x00\x1a\x00\x00\xff\xff\x00\x0a\x00\ +\x04\x00\x06\x00\x09\x00\x0c\x00\x01\x00\x0f\x00\x12\x00\x15\x00\ +\x18\x00\x1b\x00\x00\xff\xff\x00\x0a\x00\x05\x00\x07\x00\x0a\x00\ +\x0d\x00\x02\x00\x10\x00\x13\x00\x16\x00\x19\x00\x1c\x00\x1dl\ +iga\x00\xb0liga\x00\xb6liga\x00\ +\xbclnum\x00\xc2lnum\x00\xc8lnu\ +m\x00\xcelocl\x00\xd4locl\x00\xdao\ +num\x00\xe0onum\x00\xe8onum\x00\ +\xf0pnum\x00\xf8pnum\x00\xfepnu\ +m\x01\x04salt\x01\x0asalt\x01\x12s\ +alt\x01\x1ass01\x01\x22ss01\x01\ +*ss01\x012ss02\x01:ss0\ +2\x01@ss02\x01Fss03\x01Ls\ +s03\x01Rss03\x01Xtnum\x01\ +^tnum\x01ftnum\x01n\x00\x00\x00\ +\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\ +\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\ +\x07\x00\x00\x00\x01\x00\x08\x00\x00\x00\x01\x00\x08\x00\x00\x00\ +\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\ +\x02\x00\x02\x00\x03\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\ +\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\ +\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\ +\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\ +\x05\x00\x06\x00\x0a\x00\x16\x00\x1e\x00&\x00.\x006\x00\ +>\x00F\x00N\x00V\x00^\x00\x01\x00\x00\x00\x01\x00\ +P\x00\x01\x00\x00\x00\x01\x00z\x00\x01\x00\x00\x00\x01\x00\ +\xaa\x00\x01\x00\x00\x00\x01\x00\xc6\x00\x01\x00\x00\x00\x01\x00\ +\xee\x00\x01\x00\x00\x00\x01\x00\xf4\x00\x01\x00\x00\x00\x01\x01\ +\x10\x00\x01\x00\x00\x00\x01\x01\x16\x00\x01\x00\x00\x00\x01\x01\ +2\x00\x04\x00\x00\x00\x01\x01H\x00\x02\x00\x10\x00\x05\x03\ +\x91\x03\x92\x03\x93\x03\x94\x03\x95\x00\x02\x00\x05\x00J\x00\ +J\x00\x00\x00\xdf\x00\xdf\x00\x01\x00\xe1\x00\xe1\x00\x02\x00\ +\xe3\x00\xe3\x00\x03\x00\xe5\x00\xe5\x00\x04\x00\x02\x00.\x00\ +\x14\x00,\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\xea\x00\xec\x00\ +\xee\x00\xf0\x00\xf2\x00\xf4\x01Z\x01g\x01w\x01\xa1\x01\ +\xa2\x02\xc9\x02\xd8\x03E\x03G\x00\x02\x00\x01\x03\x96\x03\ +\xa9\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\x84\x03\x85\x03\ +\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x00\x02\x00\ +\x01\x00\x13\x00\x1c\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\ +\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\ +\x84\x00\x02\x00\x03\x00\x13\x00\x13\x00\x00\x00\x15\x00\x1c\x00\ +\x01\x03\x82\x03\x82\x00\x09\x00\x02\x00\x08\x00\x01\x03\x82\x00\ +\x01\x00\x01\x00\x14\x00\x02\x00\x1a\x00\x0a\x00\x13\x00\x14\x00\ +\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\ +\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x08\x00\x01\x00\ +\x14\x00\x01\x00\x01\x03\x82\x00\x02\x00\x1a\x00\x0a\x00\x13\x03\ +\x82\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\ +\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x0e\x00\ +\x04\x03\x8f\x03\x90\x01 \x01!\x00\x02\x00\x02\x01$\x01\ +%\x00\x00\x01I\x01J\x00\x02\x00\x01\x006\x00\x01\x00\ +\x08\x00\x05\x00\x0c\x00\x14\x00\x1c\x00\x22\x00(\x02^\x00\ +\x03\x00I\x00O\x02]\x00\x03\x00I\x00L\x03\x8d\x00\ +\x02\x00I\x025\x00\x02\x00O\x024\x00\x02\x00L\x00\ +\x01\x00\x01\x00I\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\ +\x00\x00\x01\x00\x00\x15^\x00\x00\x00\x14\x00\x00\x00\x00\x00\ +\x00\x15V0\x82\x15R\x06\x09*\x86H\x86\xf7\x0d\x01\ +\x07\x02\xa0\x82\x15C0\x82\x15?\x02\x01\x011\x0b0\ +\x09\x06\x05+\x0e\x03\x02\x1a\x05\x000a\x06\x0a+\x06\ +\x01\x04\x01\x827\x02\x01\x04\xa0S0Q0,\x06\x0a\ ++\x06\x01\x04\x01\x827\x02\x01\x1c\xa2\x1e\x80\x1c\x00<\ +\x00<\x00<\x00O\x00b\x00s\x00o\x00l\x00e\ +\x00t\x00e\x00>\x00>\x00>0!0\x09\x06\x05\ ++\x0e\x03\x02\x1a\x05\x00\x04\x14\xd0\xee\xd5\x01\x8f\x03\xcf\ +\x97\x8f\x98\x06\xfc\xd9\x08\x05m\xf1\xa0\x8dR\xa0\x82\x11\ +]0\x82\x03z0\x82\x02b\xa0\x03\x02\x01\x02\x02\x10\ +8%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd5\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000\ +S1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1+0)\x06\x03U\x04\x03\ +\x13\x22VeriSign Time \ +Stamping Service\ +s CA0\x1e\x17\x0d07061500\ +0000Z\x17\x0d120614235\ +959Z0\x5c1\x0b0\x09\x06\x03U\x04\x06\x13\ +\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVe\ +riSign, Inc.1402\ +\x06\x03U\x04\x03\x13+VeriSign \ +Time Stamping Se\ +rvices Signer - \ +G20\x81\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\ +\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xc4\ +\xb5\xf2R\x15\xbc\x88\x86`)\x16J[/K\x91k\ +\x87\x91\xf35TX5\xea\xd16^bMRQ4\ +q\xc2{f\x1d\x89\xc8\xdd*\xc4j\x0a\xf67\xd9\x98\ +t\x91\xf6\x92\xae\xb0\xb5v\x96\xf1\xa9JcEG.\ +k\x0b\x92NK+\x8c\xeeXJ\x8b\xd4\x07\xe4\x1a,\ +\xf8\x82\xaaX\xd9\xcdB\xf3-\xc0u\xde\x8d\xab\xc7\x8e\ +\x1d\x9alL\x08\x95\x1e\xde\xdb\xefg\xe1r\xc2I\xc2\ +\x9e`<\xe1\xe2\xbe\x16\xa3cxi\x14{\xad-\x02\ +\x03\x01\x00\x01\xa3\x81\xc40\x81\xc104\x06\x08+\x06\ +\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\x08+\x06\ +\x01\x05\x05\x070\x01\x86\x18http://o\ +csp.verisign.com\ +0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x020\x0003\ +\x06\x03U\x1d\x1f\x04,0*0(\xa0&\xa0$\x86\ +\x22http://crl.veri\ +sign.com/tss-ca.\ +crl0\x16\x06\x03U\x1d%\x01\x01\xff\x04\x0c0\ +\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\ +\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x06\xc00\x1e\x06\x03U\ +\x1d\x11\x04\x170\x15\xa4\x130\x111\x0f0\x0d\x06\x03\ +U\x04\x03\x13\x06TSA1-20\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00P\ +\xc5K\xc8$\x80\xdf\xe4\x0d$\xc2\xde\x1a\xb1\xa1\x02\xa1\ +\xa6\x82-\x0c\x83\x15\x817\x0a\x82\x0e,\xb0Z\x17a\ +\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\x91\xb3V\x1a@\xa6\xeb\x92\ +\xbe89\xb0u6t:\x98O\xe47\xba\x99\x89\xca\ +\x95B\x1d\xb0\xb9\xc7\xa0\x8dW\xe0\xfa\xd5d\x04B5\ +N\x01\xd13\xa2\x17\xc8M\xaa'\xc7\xf2\xe1\x86L\x02\ +8M\x83x\xc6\xfcS\xe0\xeb\xe0\x06\x87\xdd\xa4\x96\x9e\ +^\x0c\x98\xe2\xa5\xbe\xbf\x82\x85\xc3`\xe1\xdf\xad(\xd8\ +\xc7\xa5Kd\xda\xc7\x1b[\xbd\xac9\x08\xd58\x22\xa1\ +3\x8b/\x8a\x9a\xeb\xbc\x07!?DA\x09\x07\xb5e\ +\x1c$\xbcH\xd3D\x80\xeb\xa1\xcf\xc9\x02\xb4\x14\xcfT\ +\xc7\x16\xa3\x80\x5c\xf9y>]r}\x88\x17\x9e,C\ +\xa2\xcaS\xce}=\xf6*:\xb8O\x94\x00\xa5m\x0a\ +\x83]\xf9^S\xf4\x18\xb3W\x0fp\xc3\xfb\xf5\xad\x95\ +\xa0\x0e\x17\xde\xc4\x16\x80`\xc9\x0f+n\x86\x04\xf1\xeb\ +\xf4x'\xd1\x05\xc5\xee4[^\xb9I2\xf230\ +\x82\x03\xc40\x82\x03-\xa0\x03\x02\x01\x02\x02\x10G\xbf\ +\x19\x95\xdf\x8dRFC\xf7\xdbmH\x0d1\xa40\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\x8b\ +1\x0b0\x09\x06\x03U\x04\x06\x13\x02ZA1\x150\ +\x13\x06\x03U\x04\x08\x13\x0cWestern \ +Cape1\x140\x12\x06\x03U\x04\x07\x13\x0bD\ +urbanville1\x0f0\x0d\x06\x03\ +U\x04\x0a\x13\x06Thawte1\x1d0\x1b\x06\ +\x03U\x04\x0b\x13\x14Thawte Cer\ +tification1\x1f0\x1d\x06\x03\ +U\x04\x03\x13\x16Thawte Time\ +stamping CA0\x1e\x17\x0d0\ +31204000000Z\x17\x0d13\ +1203235959Z0S1\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1+0)\x06\x03U\x04\x03\x13\x22Ve\ +riSign Time Stam\ +ping Services CA\ +0\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\ +\x00\xa9\xca\xb2\xa4\xcc\xcd \xaf\x0a}\x89\xac\x87u\xf0\ +\xb4N\xf1\xdf\xc1\x0f\xbfga\xbd\xa3d\x1c\xda\xbb\xf9\ +\xca3\xab\x840\x89X~\x8c\xdbk\xdd6\x9e\x0f\xbf\ +\xd1\xecx\xf2w\xa6~o<\xbf\x93\xaf\x0d\xbah\xf4\ +l\x94\xca\xbdR-\xabH=\xf5\xb6\xd5]_\x1b\x02\ +\x9f\xfa/k\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\x02\xe1\x7fL\ +R\xe3\x0e`\xec@\x1c~\xb9\x0d\xde?\xc7\xb4\xdf\x87\ +\xbd_zj1.\x03\x99\x81\x13\xa8G \xce1s\ +\x0dW-\xcdx43\x95\x12\x99\x12\xb9\xdeh/\xaa\ +\xe6\xe3\xc2\x8a\x8c*\xc3\x8b!\x87f\xbd\x83XWo\ +u\xbf<\xaa&\x87]\xca\x10\x15<\x9f\x84\xeaT\xc1\ +\x0an\xc4\xfe\xc5J\xdd\xb9\x07\x11\x97\x22|\xdb>'\ +\xd1\x1ex\xec\x9f1\xc9\xf1\xe6\x22\x19\xdb\xc4\xb3GC\ +\x9a\x1a_\xa0\x1e\x90\xe4^\xf5\xee|\xf1}\xabb\x01\ +\x8f\xf5M\x0b\xde\xd0\x22V\xa8\x95\xcd\xae\x88v\xae\xee\ +\xba\x0d\xf3\xe4M\xd9\xa0\xfbh\xa0\xae\x14;\xb3\x87\xc1\ +\xbb\x02\x03\x01\x00\x01\xa3\x81\xdb0\x81\xd804\x06\x08\ ++\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\x08\ ++\x06\x01\x05\x05\x070\x01\x86\x18http:/\ +/ocsp.verisign.c\ +om0\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\ +\x01\x01\xff\x02\x01\x000A\x06\x03U\x1d\x1f\x04:0\ +806\xa04\xa02\x860http://\ +crl.verisign.com\ +/ThawteTimestamp\ +ingCA.crl0\x13\x06\x03U\x1d%\ +\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\ +\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060$\ +\x06\x03U\x1d\x11\x04\x1d0\x1b\xa4\x190\x171\x150\ +\x13\x06\x03U\x04\x03\x13\x0cTSA2048-\ +1-530\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x00\x03\x81\x81\x00Jk\xf9\xeaX\xc2D\x1c1\ +\x89y\x99+\x96\xbf\x82\xac\x01\xd6\x1cL\xcd\xb0\x8aX\ +n\xdf\x08)\xa3^\xc8\xca\x93\x13\xe7\x04R\x0d\xefG\ +'/\x008\xb0\xe4\xc9\x93N\x9a\xd4\x22b\x15\xf7?\ +7!Op1\x80\xf1\x8b8\x87\xb3\xe8\xe8\x97\x00\xfe\ +\xcfU\x96N$\xd2\xa9'Nz\xae\xb7aA\xf3*\ +\xce\xe7\xc9\xd9^\xdd\xbb+\x85>\xb5\x9d\xb5\xd9\xe1W\ +\xff\xbe\xb4\xc5~\xf5\xcf\x0c\x9e\xf0\x97\xfe+\xd3;R\ +\x1b\x1b8'\xf7?J0\x82\x04\xfc0\x82\x04e\xa0\ +\x03\x02\x01\x02\x02\x10eR&\xe1\xb2.\x18\xe1Y\x0f\ +)\x85\xac\x22\xe7\x5c0\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x000_1\x0b0\x09\x06\x03U\x04\x06\ +\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0eV\ +eriSign, Inc.170\ +5\x06\x03U\x04\x0b\x13.Class 3 \ +Public Primary C\ +ertification Aut\ +hority0\x1e\x17\x0d090521\ +000000Z\x17\x0d1905202\ +35959Z0\x81\xb61\x0b0\x09\x06\x03U\ +\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\ +\x0eVeriSign, Inc.1\ +\x1f0\x1d\x06\x03U\x04\x0b\x13\x16VeriSi\ +gn Trust Network\ +1;09\x06\x03U\x04\x0b\x132Terms\ + of use at https\ +://www.verisign.\ +com/rpa (c)09100\ +.\x06\x03U\x04\x03\x13'VeriSign\ + Class 3 Code Si\ +gning 2009-2 CA0\ +\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\ +\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\x00\ +\xbeg\x1d\xb4`\xaa\x10IoV\x17|f\xc9^\x86\ +\x0d\xd5\xf1\xac\xa7q\x83\x8e\x8b\x89\xf8\x88\x04\x89\x15\x06\ +\xba-\x84!\x95\xe4\xd1\x9cPL\xfb\xd2\x22\xbd\xda\xf2\ +\xb25;\x1e\x8f\xc3\x09\xfb\xfc\x13.Z\xbf\x89|=\ +;%\x1e\xf6\xf3X{\x9c\xf4\x01\xb5\xc6\x0a\xb8\x80\xce\ +\xbe'tag'Mj\xe5\xec\x81aXy\xa3\xe0\ +\x17\x10\x12\x15'\xb0\xe1M4\x7f+G D\xb9\xde\ +f$f\x8a\xcdO\xba\x1f\xc58\xc8T\x90\xe1r\xf6\ +\x19fuj\xb9Ih\xcf8y\x0d\xaa0\xa8\xdb,\ +`H\x9e\xd7\xaa\x14\x01\xa9\x83\xd78\x9109\x13\x96\ +\x03:|@T\xb6\xad\xe0/\x1b\x83\xdc\xa8\x11R>\ +\x02\xb3\xd7+\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\xa9\xa6\x10P\ +\x0e4.M\xa7\xce\xc9^%\xd4\x8c\xbc\xf3n|)\ +\xbc\x01]\xfc1\x87Z\xd5\x8c\x85gX\x88\x19\xa0\xbf\ +5\xf0\xea+\xa3!\xe7\x90\xf6\x83\xe5\xa8\xed`x^\ +{`\x83\xfdW\x0b]A\x0dcT`\xd6C!\xef\ +\x02\x03\x01\x00\x01\xa3\x82\x01\xdb0\x82\x01\xd70\x12\x06\ +\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\ +\x000p\x06\x03U\x1d \x04i0g0e\x06\x0b\ +`\x86H\x01\x86\xf8E\x01\x07\x17\x030V0(\x06\ +\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps\ +://www.verisign.\ +com/cps0*\x06\x08+\x06\x01\x05\x05\ +\x07\x02\x020\x1e\x1a\x1chttps://w\ +ww.verisign.com/\ +rpa0\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\ +\x02\x01\x060m\x06\x08+\x06\x01\x05\x05\x07\x01\x0c\x04\ +a0_\xa1]\xa0[0Y0W0U\x16\x09i\ +mage/gif0!0\x1f0\x07\x06\x05\ ++\x0e\x03\x02\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\xac\x8d\x8ek\ +\xc3\xcf\x80j\xd4H\x18,{\x19.0%\x16#h\ +ttp://logo.veris\ +ign.com/vslogo.g\ +if0\x1d\x06\x03U\x1d%\x04\x160\x14\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\x05\x05\x07\x03\ +\x0304\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0\ +&0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18h\ +ttp://ocsp.veris\ +ign.com01\x06\x03U\x1d\x1f\x04*\ +0(0&\xa0$\xa0\x22\x86 http:/\ +/crl.verisign.co\ +m/pca3.crl0)\x06\x03U\x1d\ +\x11\x04\x220 \xa4\x1e0\x1c1\x1a0\x18\x06\x03U\ +\x04\x03\x13\x11Class3CA2048\ +-1-550\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\ +\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\ +\xa4\xa1\x1e\xf20\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x00\x03\x81\x81\x00\x8b\x03\xc0\xdd\x94\xd8A\xa2a\ +i\xb0\x15\xa8x\xc70\xc6\x90<~B\xf7$\xb6\xe4\ +\x83s\x17\x04\x7f\x04\x10\x9c\xa1\xe2\xfa\x81/\xeb\xc0\xca\ +D\xe7r\xe0P\xb6U\x10 \x83n\x96\x92\xe4\x9aQ\ +j\xb471\xdc\xa5-\xeb\x8c\x00\xc7\x1dO\xe7M2\ +\xba\x85\xf8N\xbe\xfagUe\xf0j\xbez\xcad8\ +\x1a\x10\x10xEv1\xf3\x86z\x03\x0f`\xc2\xb3]\ +\x9d\xf6\x8bfv\x82\x1bY\xe1\x83\xe5\xbdI\xa58V\ +\xe5\xdeAw\x0eX\x0f0\x82\x05\x130\x82\x03\xfb\xa0\ +\x03\x02\x01\x02\x02\x10f\xe3\xf0gy\xca\x15\x16mP\ +So\x88\x19\x1a\x830\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x000\x81\xb61\x0b0\x09\x06\x03U\x04\ +\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0e\ +VeriSign, Inc.1\x1f\ +0\x1d\x06\x03U\x04\x0b\x13\x16VeriSig\ +n Trust Network1\ +;09\x06\x03U\x04\x0b\x132Terms \ +of use at https:\ +//www.verisign.c\ +om/rpa (c)09100.\ +\x06\x03U\x04\x03\x13'VeriSign \ +Class 3 Code Sig\ +ning 2009-2 CA0\x1e\ +\x17\x0d100729000000Z\x17\ +\x0d120808235959Z0\x81\ +\xd01\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x16\ +0\x14\x06\x03U\x04\x08\x13\x0dMassach\ +usetts1\x0f0\x0d\x06\x03U\x04\x07\x13\ +\x06Woburn1\x1e0\x1c\x06\x03U\x04\x0a\ +\x14\x15Monotype Imagi\ +ng Inc.1>0<\x06\x03U\x04\x0b\ +\x135Digital ID Cla\ +ss 3 - Microsoft\ + Software Valida\ +tion v21\x180\x16\x06\x03U\x04\x0b\ +\x14\x0fType Operation\ +s1\x1e0\x1c\x06\x03U\x04\x03\x14\x15Mono\ +type Imaging Inc\ +.0\x81\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x94D\ +\xa0\x95i|U\x0d\xd0\xdb\x16\x8d25\x8aL3\xab\ +^ \xa1L\xd7*\x878\xd7\x98\xa5@\xf0\x19I\x0b\ +\x22\x1eSO\xc2C\xa6\xca\x8b\xa9V\xefnH\x06\xa8\ +\x05\x159\x1ec;$\x12\x90\xb9\x98\xcf\xca\x085}\ +r\xe3GW\xfdy\xcb\x8aJ\xe7@p-5c\x7f\ +\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\xd7\xa4\xa0\xdb\ +\x09\xf2\xa2\xf2{\xef\xcdu\xc1\xf7ePd\x22\x9d\xbd\ +}\xbc\xad\xb8K\xccXE\x0eM\xd1YLM\x02\x03\ +\x01\x00\x01\xa3\x82\x01\x830\x82\x01\x7f0\x09\x06\x03U\ +\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\ +\x04\x04\x03\x02\x07\x800D\x06\x03U\x1d\x1f\x04=0\ +;09\xa07\xa05\x863http://\ +csc3-2009-2-crl.\ +verisign.com/CSC\ +3-2009-2.crl0D\x06\x03\ +U\x1d \x04=0;09\x06\x0b`\x86H\x01\x86\ +\xf8E\x01\x07\x17\x030*0(\x06\x08+\x06\x01\x05\ +\x05\x07\x02\x01\x16\x1chttps://ww\ +w.verisign.com/r\ +pa0\x13\x06\x03U\x1d%\x04\x0c0\x0a\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x030u\x06\x08+\x06\x01\x05\x05\ +\x07\x01\x01\x04i0g0$\x06\x08+\x06\x01\x05\x05\ +\x070\x01\x86\x18http://ocsp\ +.verisign.com0?\x06\ +\x08+\x06\x01\x05\x05\x070\x02\x863http:\ +//csc3-2009-2-ai\ +a.verisign.com/C\ +SC3-2009-2.cer0\x1f\ +\x06\x03U\x1d#\x04\x180\x16\x80\x14\x97\xd0k\xa8&\ +p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf20\ +\x11\x06\x09`\x86H\x01\x86\xf8B\x01\x01\x04\x04\x03\x02\ +\x04\x100\x16\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1b\ +\x04\x080\x06\x01\x01\x00\x01\x01\xff0\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00N\xe6\ +\x22\x87\xdfgA\x15\x17\xe2\xd2\xee~\x0e\xce\xc2\x99\xd6\ +c\xbd\xf0\xb5\x93\xe5jrb\xe1\xf5\xd2<8\xee\xa8\ +=\x08_\xbaG\x81\x82_[KI\xf4\x1d \xfa\x0f\ +\x93\x09\xd0\x1d\x19VD\x17\xa2\x88\xf3\xfb\x8d\x9d\xae\xf7\ +\x0d5\xde<\x0c\xacD\x94`E*\x9b\xfe\x9boL\ +;\xb14gp\x10\x86\xffZ9\x5cZ\xe3l\x82\xab\ +5|eK\xfd\x98m\xb5\x15\x94I\x9c\x88p\x10\xbe\ +=\xb1b\x95\xb4\xdb\xb4\xd4\xda\xe8\x9dA\x90~\xfe}\ +\xb9\xa4\x92\xebn\xf2\x22\x8a\xc6w6M\x8aZ\x0bS\ +\x051\xd3+(\xafR\xe1\x8dzk\xb5wD\xbd\x0c\ +\xad\xf4]%,\xe3\xcd\x8a0>K\x03\x9cy\xca\xa6\ +N\xae\x0b\xc2\xcc$\x07\x0b\xc1\x94\x82\xf6\x10\xf1\xba\x90\ +\xb6\x9b\x9a\xd8\x5c<\x13\xf1\xea\x02\x06\x18'M<\x89\ +o3\x8a\xd3\x86\xde\xe9X3u=\xeb\x93i\xe2D\ +oN\x00l\xcf\xd5\x85\xdaV\xa6\x9a\xa6?\xcbL!\ +h\x90\xf2`\xba\xe1\xe8\x06]9!\x132\xed1\x82\ +\x03g0\x82\x03c\x02\x01\x010\x81\xcb0\x81\xb61\ +\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\ +\x06\x03U\x04\x0a\x13\x0eVeriSign,\ + Inc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16\ +VeriSign Trust N\ +etwork1;09\x06\x03U\x04\x0b\x13\ +2Terms of use at\ + https://www.ver\ +isign.com/rpa (c\ +)09100.\x06\x03U\x04\x03\x13'Ve\ +riSign Class 3 C\ +ode Signing 2009\ +-2 CA\x02\x10f\xe3\xf0gy\xca\x15\x16m\ +PSo\x88\x19\x1a\x830\x09\x06\x05+\x0e\x03\x02\x1a\ +\x05\x00\xa0p0\x10\x06\x0a+\x06\x01\x04\x01\x827\x02\ +\x01\x0c1\x020\x000\x19\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x031\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\ +\x040\x1c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x0b1\ +\x0e0\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x150\ +#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14\ +\xe4\xfa8?\x16?}\xde\x9c\xc2\x06\x88,\xfb\xd8\x1e\ +\x00v\x1d\xfc0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x04\x81\x80k\xc4E\xa5\xd7\x1a$^%\x22\ +S}\x0a\x0f\x9fR; \xbd5+B\x9f\xeeG\xda\ +\x83I\xa4\x1eJ\xbc\xf3\xf4\xed\x03\x02\xbd\xc2p5r\ +\xfe+\x17\xb4\xfc\xc1\xcdc\x1aU\x0bLC\x1c\xe4\x07\ +\xfc~\xd7\xd7v2\xe0+I\xf4\x8e\xd4\xb4\xb2`\xe3\ +\xae\xd1\xdbS\xf7\xbc\xe4|\xbc\xd5r>DB\xf6\xea\ +k\xe9C.$\x9f\xb6.=\xc6\xab\xd0\x9d\xdd\xbf\xaf\ +D\x95\x94\xd1\x7f%J\xc1\xac\x95\xef\x14-\x01\x07+\ +\x03\xec@\xee\xc3\xfd\xa1\x82\x01\x7f0\x82\x01{\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x09\x061\x82\x01l0\x82\x01\ +h\x02\x01\x010g0S1\x0b0\x09\x06\x03U\x04\ +\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0e\ +VeriSign, Inc.1+\ +0)\x06\x03U\x04\x03\x13\x22VeriSig\ +n Time Stamping \ +Services CA\x02\x108%\xd7\ +\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd50\x09\x06\ +\x05+\x0e\x03\x02\x1a\x05\x00\xa0]0\x18\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x031\x0b\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x07\x010\x1c\x06\x09*\x86H\x86\xf7\x0d\x01\x09\ +\x051\x0f\x17\x0d11050516551\ +0Z0#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\ +\x16\x04\x14\xcf\x97~\xcc\xe7f\xe2Qi\xe8\x11\xa6\xc0\ +g\xf5\x99}\xa4\xb8\xed0\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x01\x05\x00\x04\x81\x80]\xad\x8c\xb6,X:\ +l\x03\xe2\xc9`\x04\xb5\xce\xaeZ4[\xf2\xf6\xd0\xcd\ +\x8c\xdb\xa1T\x85y\x1a\x0f?1\x9f1'%\xf9'\ +, \x09\xbb\x0et\xf0o\xfc\x9b6\x9d\xa1\x88\xf5\xf7\ +\x10\x00\xc1\x14\x01\xe1\x90L\xb6\xe8\x91\xacH\x1d\x22\x91\ +!\x19\xe0\xac}\xd8\xd9\xf1\x7f_\xb0F\xb9\xb0\x8a\x9d\ +dB\x9f\x92^3\x96\xa7\x16\xaa\x02\x16\xbb:<\xad\ +\x9f\xa2\xee\xe1?\x1bGO\x1b\xb2\x98Q\xfd\x94\xe5K\ +nM\xad\x03?}\x03I3\x00\x00\ +\x00\x03?\xa0\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIGZ\ +w\xfd@\x00\x03*,\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03&\x0c\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03&,\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03&d\x00\x00\x03\xc6OS/2\xa1\ +M\x96=\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x0e\ +\xc0\x17\x19\x00\x00\x1d\x90\x00\x00\x00\xa0fpgm~\ +a\xb6\x11\x00\x00\x14\xd0\x00\x00\x07\xb4gasp\x00\ +\x15\x00#\x00\x03%\xfc\x00\x00\x00\x10glyfP\ +X\xf2T\x00\x00%\x88\x00\x01\x1e\x1ehead\xf8\ +G\xf9c\x00\x00\x01<\x00\x00\x006hhea\x10\ + \x10\xe0\x00\x00\x01t\x00\x00\x00$hmtx\xd9\ +\x07\xcd\xe3\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01C\xa8\x00\x01\xb66locaM\ +\x85\x05\xa9\x00\x00\x1e0\x00\x00\x07Vmaxp\x05\ +C\x01\xa0\x00\x00\x01\x98\x00\x00\x00 nameS\ +t\x22\xce\x00\x02\xf9\xe0\x00\x00\x05\xeepost\x02\ +7\xefl\x00\x02\xff\xd0\x00\x00&+prepT\ +\x81\x96\x93\x00\x00\x1c\x84\x00\x00\x01\x09\x00\x01\x00\x00\x00\ +\x01\x19\x9a\xdf\xe5\x9f\x12_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9cH\xc0\x00\x00\x00\x00\xc9\xe8K\xce\xfc\ +\x04\xfd\xdb\x09\xd9\x08b\x00\x02\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x09y\xfc\ +\x04\xfe\x1c\x09\xd9\x08\x00\x01\xb3\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00W\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +\x0e\x00\x8d\x00\x03\x00\x01\x00\x03\x04k\x01\x90\x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x02\x00\x00\x00\x02\x0b\x06\x06\x03\x05\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00\x01\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04H\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc1\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x02\x12\x00+\x03\x17\x00\xe1\x05\ ++\x00?\x04h\x00H\x06X\x00\xa8\x05\x5c\x00B\x01\ +\xbc\x00\xe1\x02H\x00R\x02H\xff`\x04j\x00\xd7\x04\ +h\x00\x7f\x01\xec\xff\x9c\x02\x7f\x007\x02\x06\x00+\x02\ +\xcd\xff\xa2\x04h\x00y\x04h\x01/\x04h\x00\x0c\x04\ +h\x00/\x04h\x00\x10\x04h\x00P\x04h\x00\x85\x04\ +h\x00\xae\x04h\x00`\x04h\x00b\x02\x06\x00+\x02\ +\x06\xff\x9c\x04h\x00y\x04h\x00\x7f\x04h\x00y\x03\ +j\x00\x9e\x06\xc7\x00o\x04q\xff\x8b\x04\xc9\x00V\x04\ +\xae\x00\x96\x05T\x00V\x04\x17\x00V\x03\xc7\x00V\x05\ +j\x00\x96\x05m\x00V\x02\x8b\xff\xd9\x02#\xfe\xc1\x04\ +u\x00V\x03\xcb\x00V\x06\xb2\x00T\x05\x9e\x00T\x05\ +\xc3\x00\x96\x04\x87\x00V\x05\xc3\x00\x96\x04\x8d\x00V\x04\ +\x04\x00'\x03\xfc\x00\xba\x05h\x00\xa4\x04b\x00\xbc\x06\ +\xd1\x00\xdf\x04'\xff\x98\x04\x06\x00\xbc\x04?\xff\xf0\x02\ +J\xff\xf0\x02\xcd\x00\xdd\x02J\xffj\x04#\x005\x03\ +'\xffD\x04o\x02?\x04\x85\x00b\x04\x9e\x00;\x03\ +\x9a\x00b\x04\x9e\x00b\x03\xf2\x00b\x02\x81\xff\x1b\x04\ +\x02\xff\x81\x04\x9e\x00;\x02\x08\x00;\x02\x08\xfe\xfe\x03\ +\xe7\x009\x02\x08\x009\x06\xfa\x00;\x04\x9e\x00;\x04\ +}\x00b\x04\x9e\xff\xd5\x04\x9e\x00b\x03+\x00;\x03\ +m\x00\x08\x02\x98\x00Z\x04\x9e\x00q\x03\xb2\x00b\x05\ +\xbc\x00u\x03\xd3\xff\xb6\x03\xb2\xff;\x03\x8d\xff\xe3\x02\ +\xcb\x00\x1b\x04h\x02\x1d\x02\xcb\xff\xb6\x04h\x00s\x02\ +\x14\x00\x00\x02\x12\xff\xf2\x04h\x00\xe1\x04h\xff\xe9\x04\ +h\x00\xa8\x04h\x00\x7f\x04h\x02\x1d\x03\xe3\x00;\x04\ +o\x01\xc9\x06\xa8\x00\x8b\x02\xae\x00\xaa\x03\xbe\x00X\x04\ +h\x00\x7f\x02\x7f\x007\x06\xa8\x00\x8b\x03\x0e\x00\xe3\x03\ +m\x00\xd7\x04h\x00\x7f\x02\xcd\x00`\x02\xcd\x00w\x04\ +o\x02\x14\x04\xaa\xff\xd5\x05=\x00\xc7\x02\x06\x00\xaa\x01\ +\xa4\xffV\x02\xcd\x01\x02\x02\xb0\x00\xa8\x03\xbe\x00\x17\x05\ +\xee\x00{\x05\xee\x00B\x06\x1d\x00W\x03j\xff\xfc\x04\ +q\xff\x8b\x04q\xff\x8b\x04q\xff\x8b\x04q\xff\x8b\x04\ +q\xff\x8b\x04q\xff\x8b\x06\x89\xff\x89\x04\xae\x00\x96\x04\ +\x17\x00V\x04\x17\x00V\x04\x17\x00V\x04\x17\x00V\x02\ +\x8b\xff\xd9\x02\x8b\xff\xd9\x02\x8b\xff\xd9\x02\x8b\xff\xd9\x05\ +T\x00H\x05\x9e\x00T\x05\xc3\x00\x96\x05\xc3\x00\x96\x05\ +\xc3\x00\x96\x05\xc3\x00\x96\x05\xc3\x00\x96\x04h\x00\xa8\x05\ +\xc3\x00w\x05h\x00\xa4\x05h\x00\xa4\x05h\x00\xa4\x05\ +h\x00\xa4\x04\x06\x00\xbc\x04\x87\x00V\x04\x9e\xff\x00\x04\ +\x85\x00b\x04\x85\x00b\x04\x85\x00b\x04\x85\x00b\x04\ +\x85\x00b\x04\x85\x00b\x06\x85\x00b\x03\x9a\x00b\x03\ +\xf2\x00b\x03\xf2\x00b\x03\xf2\x00b\x03\xf2\x00b\x02\ +\x08\x00;\x02\x08\x00;\x02\x08\x00;\x02\x08\x00;\x04\ +\x8d\x00Z\x04\x9e\x00;\x04}\x00b\x04}\x00b\x04\ +}\x00b\x04}\x00b\x04}\x00b\x04h\x00\x7f\x04\ +}\x00=\x04\x9e\x00q\x04\x9e\x00q\x04\x9e\x00q\x04\ +\x9e\x00q\x03\xb2\xff;\x04\x9e\xff\xd5\x03\xb2\xff;\x04\ +q\xff\x8b\x04\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x04\ +q\xff\x8b\x04\x85\x00b\x04\xae\x00\x96\x03\x9a\x00b\x04\ +\xae\x00\x96\x03\x9a\x00b\x04\xae\x00\x96\x03\x9a\x00b\x04\ +\xae\x00\x96\x03\x9a\x00b\x05T\x00V\x04\x9e\x00b\x05\ +T\x00H\x04\x9e\x00b\x04\x17\x00V\x03\xf2\x00b\x04\ +\x17\x00V\x03\xf2\x00b\x04\x17\x00V\x03\xf2\x00b\x04\ +\x17\x00V\x03\xf2\x00b\x04\x17\x00V\x03\xf2\x00b\x05\ +j\x00\x96\x04\x02\xff\x81\x05j\x00\x96\x04\x02\xff\x81\x05\ +j\x00\x96\x04\x02\xff\x81\x05j\x00\x96\x04\x02\xff\x81\x05\ +m\x00V\x04\x9e\x00;\x05m\x00V\x04\x9e\x00;\x02\ +\x8b\xff\xd9\x02\x08\x00;\x02\x8b\xff\xd9\x02\x08\x00;\x02\ +\x8b\xff\xd9\x02\x08\x00;\x02\x8b\xff\xd9\x02\x08\xff\x9a\x02\ +\x8b\xff\xd9\x02\x08\x00;\x04\xac\xff\xd9\x04\x10\x00;\x02\ +#\xfe\xc1\x02\x08\xfe\xfe\x04u\x00V\x03\xe7\x009\x03\ +\xe7\x009\x03\xcb\x00V\x02\x08\x009\x03\xcb\x00V\x02\ +\x08\xff\x9f\x03\xcb\x00V\x02\x08\x009\x03\xcb\x00V\x02\ +D\x009\x03\xcb\x00\x17\x02\x00\x00\x04\x05\x9e\x00T\x04\ +\x9e\x00;\x05\x9e\x00T\x04\x9e\x00;\x05\x9e\x00T\x04\ +\x9e\x00;\x05)\x00]\x05\x9e\x00T\x04\x9e\x00;\x05\ +\xc3\x00\x96\x04}\x00b\x05\xc3\x00\x96\x04}\x00b\x05\ +\xc3\x00\x96\x04}\x00b\x06\xd7\x00\x96\x06\xe9\x00b\x04\ +\x8d\x00V\x03+\x00;\x04\x8d\x00V\x03+\xff\x99\x04\ +\x8d\x00V\x03+\x00;\x04\x04\x00'\x03m\x00\x08\x04\ +\x04\x00'\x03m\x00\x08\x04\x04\x00'\x03m\x00\x08\x04\ +\x04\x00'\x03m\x00\x08\x03\xfc\x00\x91\x02\x98\x00;\x03\ +\xfc\x00\xba\x02\x98\x00Z\x03\xfc\x00\xaa\x02\x98\x00+\x05\ +h\x00\xa4\x04\x9e\x00q\x05h\x00\xa4\x04\x9e\x00q\x05\ +h\x00\xa4\x04\x9e\x00q\x05h\x00\xa4\x04\x9e\x00q\x05\ +h\x00\xa4\x04\x9e\x00q\x05h\x00\xa4\x04\x9e\x00q\x06\ +\xd1\x00\xdf\x05\xbc\x00u\x04\x06\x00\xbc\x03\xb2\xff;\x04\ +\x06\x00\xbc\x04?\xff\xf0\x03\x8d\xff\xe3\x04?\xff\xf0\x03\ +\x8d\xff\xe3\x04?\xff\xf0\x03\x8d\xff\xe3\x023\xfe\xfc\x04\ +h\x00\x04\x04q\xff\x8d\x04\x85\x00b\x06\x89\xff\x89\x06\ +\x85\x00b\x05\xc3\x00w\x04}\x00=\x04\x04\x00'\x03\ +m\x00\x08\x04o\x01\x8f\x04o\x01\xd3\x04H\x01\x96\x04\ +o\x01\xdb\x01\xf2\x01D\x04\x9e\x02'\x01u\xffo\x04\ +o\x01P\x04o\x01\x8d\x04\x81\x02o\x04\x81\x01\xc1\x04\ +q\xff\x8b\x02\x06\x00\xaa\x04\x8b\x00G\x06\x08\x00G\x03\ +\x85\x00`\x06\x0e\x00\x5c\x05\x1f\x00G\x06B\x00T\x02\ +q\x00h\x04q\xff\x8b\x04\xc9\x00V\x03\xcf\x00V\x04\ +w\xff\xc9\x04\x17\x00V\x04?\xff\xf0\x05m\x00V\x05\ +\xc3\x00\x96\x02\x8b\xff\xd9\x04u\x00V\x04w\xff\x8b\x06\ +\xb2\x00T\x05\x9e\x00T\x04#\xff\xe5\x05\xc3\x00\x96\x05\ +o\x00V\x04\x87\x00V\x04+\xff\xe3\x03\xfc\x00\xba\x04\ +\x06\x00\xbc\x05\xf4\x00\x96\x04'\xff\x98\x05\xe1\x00\xc7\x05\ +\xdd\xff\xf0\x02\x8b\xff\xd9\x04\x06\x00\xbc\x04\x8d\x00b\x03\ +\x8f\x00?\x04\x9e\x00;\x02q\x00h\x04\x9c\x00\x85\x04\ +\x8d\x00b\x04\x9e\xff\xd3\x03\xac\x00T\x04m\x00J\x03\ +\x8f\x00?\x03\xa0\x00b\x04\x9e\x00;\x04X\x00b\x02\ +q\x00h\x03\xe7\x009\x03\xdd\xff\x8b\x04\xaa\xff\xd5\x03\ +\xe9\x00b\x03\x8f\x00R\x04}\x00b\x04\xcd\x00L\x04\ +\x91\xff\xd5\x03\xa0\x00b\x04\xa6\x00b\x03X\x00L\x04\ +\x9c\x00\x85\x05\x5c\x00b\x04\x06\xff\x1b\x05\xb6\x00\x8f\x05\ +\xd7\x00b\x02q\x00h\x04\x9c\x00\x85\x04}\x00b\x04\ +\x9c\x00\x85\x05\xd7\x00b\x04\x17\x00V\x05V\x00\xba\x03\ +\xcf\x00V\x04\xae\x00\x96\x04\x04\x00'\x02\x8b\xff\xd9\x02\ +\x8b\xff\xd9\x02#\xfe\xc1\x07\x1d\xff\xbe\x077\x00V\x05\ +V\x00\xba\x04y\x00V\x04\x93\xff\xfc\x05o\x00V\x04\ +q\xff\x8b\x04\x83\x00Z\x04\xc9\x00V\x03\xcf\x00V\x04\ +\xf8\xffV\x04\x17\x00V\x065\xff\x9c\x04B\xff\xfa\x05\ +\x93\x00V\x05\x93\x00V\x04y\x00V\x05'\xff\xbe\x06\ +\xb2\x00T\x05m\x00V\x05\xc3\x00\x96\x05o\x00V\x04\ +\x87\x00V\x04\xae\x00\x96\x03\xfc\x00\xba\x04\x93\xff\xfc\x05\ +\xf4\x00\x96\x04'\xff\x98\x05R\x00T\x05\x1d\x00\xfa\x07\ +\xa4\x00T\x07\xa8\x00T\x05\x00\x00\xba\x06J\x00V\x04\ +o\x00V\x04\xae\x00\x12\x07\xd5\x00V\x04\x8d\xff\xb4\x04\ +\x85\x00b\x04T\x00d\x04N\x00b\x03\xa8\x007\x04\ +\x81\x00b\x03\xf2\x00b\x06\xac\xff\xdd\x03}\xff\xfc\x04\ +\x9e\x00q\x04\x9e\x00q\x03\xd1\x00;\x04L\xff\xa2\x05\ +\x85\x00=\x04\xcb\x00;\x04}\x00b\x04\x9e\x00;\x04\ +\x9e\xff\xd5\x03\x9a\x00b\x06\xfa\x00;\x03\xb2\xff;\x05\ +N\x00b\x03\xd3\xff\xb6\x04\xc3\x00q\x04q\x00\x9e\x06\ +\xfa\x00q\x07\x1f\x00q\x04\xbc\x00T\x05\xc5\x00\x81\x04\ +'\x00\x81\x03\xa6\x00\x12\x06?\x00;\x047\xff\xd5\x03\ +\xf2\x00b\x04\x9e\x00;\x03\xa8\x007\x03\x9a\x00b\x03\ +m\x00\x08\x02\x08\x00;\x02\x08\x00;\x02\x08\xfe\xfe\x06\ +\x19\xff\xa2\x06\x7f\x009\x04\x9e\x00;\x03\xd1\x00;\x03\ +\xb2\xff;\x04\x9e\x00q\x03\xcf\x00V\x03\x10\x00;\x06\ +\xd1\x00\xdf\x05\xbc\x00u\x06\xd1\x00\xdf\x05\xbc\x00u\x06\ +\xd1\x00\xdf\x05\xbc\x00u\x04\x06\x00\xbc\x03\xb2\xff;\x03\ +\xd7\x007\x07\xae\x007\x07\xae\x007\x03'\xff1\x01\ +\x5c\x00{\x01\x5c\x00}\x01\xec\xff\x9c\x01\x5c\x00\xe5\x02\ +\xcf\x00{\x02\xcf\x00}\x03Z\xff\x9c\x03\xba\x00\xd9\x03\ +\xcf\x00N\x03\x06\x00\xc7\x06\x1b\x00+\x08\xf0\x00\xa8\x01\ +\xbc\x00\xe1\x03\x17\x00\xe1\x02D\x00X\x02D\x00\x17\x03\ +\xd7\xff\xe6\x01\x0c\xfe\x19\x02\xf2\x00\xa8\x04h\x00-\x04\ +h\xff\xe9\x05\xcd\x007\x04h\x00?\x069\x00\xcb\x04\ +\x00\x00\xa0\x07\x9a\x00;\x05\xfe\x00y\x05\xdd\xff\xf0\x04\ +\xf4\x00\x7f\x06\x06\x00V\x06\x81\x00S\x06\x8d\x00]\x06\ +\x00\x00R\x04\xa6\x00w\x04w\xff\xc9\x05\xee\x00\xf6\x05\ +\x0c\x00\xc3\x04h\x00\x7f\x04d\x00b\x05\xa8\x00\x98\x03\ +\x12\x00'\x04h\x00s\x04h\x00\x7f\x04h\x00\x7f\x04\ +h\x00\x7f\x04\xaa\x00\x98\x04\x8d\xff\x1b\x04\x8d\xff\x1b\x04\ +\x81\x01\x5c\x02\x08\xfe\xfe\x03\xd1\x02\x06\x03\xd1\x00\x9c\x03\ +\xd1\x01\xf8\x02\xcd\x00\x93\x02\xcd\x00\x5c\x02\xcd\x00\x87\x02\ +\xcd\x00\xa6\x02\xcd\x00\xae\x02\xcd\x00\x83\x02\xcd\x00\x8d\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +!\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00T\x08\x00\x00T\x02\x08\xfe\xfe\x01\ +\x5c\x00}\x04\x8f\x00/\x04\x14\x00\xbc\x06V\x00m\x06\ +\xb2\x00T\x06\xfa\x00;\x04q\xff\x8b\x04\x85\x00b\x06\ +;\xffs\x02\xaa\xff\xba\x03Z\x013\x07\x17\xff\x1b\x07\ +\x17\xff\x1b\x05\xb6\x00\x96\x04}\x00b\x05\xc7\x00\xa4\x04\ +\xf0\x00q\x00\x00\xfd.\x00\x00\xfd\xe6\x00\x00\xfc\xb5\x00\ +\x00\xfd\xbe\x00\x00\xfc\xac\x04\x17\x00V\x05\x93\x00V\x03\ +\xf2\x00b\x04\x9e\x00q\x07\xa0\x00\x96\x05\xbe\x00h\x04\ +\xf4\x00\x96\x04j\x00\x5c\x06\xe3\x00V\x05\x7f\x00;\x04\ +\xcf\xff\x8b\x04;\xff\xa4\x06\xba\x00V\x05\xc5\x00;\x05\ +H\xff\xae\x04\xd3\xff\x91\x07R\x00V\x06h\x00;\x04\ +B\xff\xb8\x03\x93\xff\xa2\x05\xe1\x00\xc7\x05\xb6\x00\x8f\x05\ +\xc3\x00\x96\x04}\x00b\x04y\x00\xbc\x03\x85\x00`\x04\ +y\x00\xbc\x03\x85\x00`\x09y\x00\x96\x08\x08\x00b\x05\ +\xe9\x00\x96\x04\xa0\x00b\x07\xa0\x00\x96\x06\x12\x00b\x07\ +\xa0\x00\x96\x05\xbe\x00h\x04\xae\x00\x96\x03\x9a\x00b\x04\ +\xdf\x00u\x04{\x01T\x04\xa4\x01w\x04\xa4\x02}\x04\ +\xa4\x02\x98\x07\xe9\x00)\x07\xa6\x00)\x05\xa0\x00V\x04\ +\xa2\x00q\x04m\x00V\x04'\x00\x7f\x04\x87\x00V\x04\ +\x9e\xff\xd5\x03\xc5\x00N\x03\x10\x00\x0c\x04\xd3\x00V\x03\ +\xee\x00;\x06\x93\xff\x9c\x06\xb4\xff\xdd\x04B\xff\xfa\x03\ +}\xff\xfc\x04\xcd\x00T\x04+\x00;\x04y\x00T\x03\ +\xcd\x005\x04u\x00V\x03\xd3\x009\x05\x0e\x00\xba\x04\ +{\x00N\x05j\x00V\x04\xcb\x00;\x06\x0a\x00V\x05\ +\x81\x00;\x07\xf8\x00V\x06\x8b\x00;\x05\xc3\x00\x96\x04\ +\xcb\x00b\x04\xae\x00\x96\x03\x9a\x00b\x03\xfc\x00\xba\x07\ +\x14\x00;\x04\x06\x00\xbc\x03\xb2\x00b\x04\x06\x00m\x03\ +\xb2\xff\xe5\x04\x8d\xff\x98\x04+\xff\xf2\x067\x00\xba\x05\ +B\x00Z\x05\x17\x00\xf8\x04Z\x00\x9c\x05\x1d\x00\xf8\x04\ +o\x00\x9c\x05\x1d\x00T\x04\x9c\x00;\x06\x1f\x00\x81\x04\ +\xbe\x00P\x06\x1f\x00\x81\x04\xbe\x00P\x02\x8b\xff\xd9\x06\ +5\xff\x9c\x06\xac\xff\xdd\x05\x08\x00V\x04\x1d\x00;\x05\ +3\xff\xbe\x04J\xff\xa2\x05m\x00V\x04\xcb\x00;\x05\ +y\x00V\x04\xcb\x00;\x05\x1d\x00\xf8\x04\xa0\x00\xcb\x06\ +\xbc\x00T\x05\x83\x00=\x02\x8b\xff\xd9\x04q\xff\x8b\x04\ +\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x06\x89\xff\x89\x06\ +\x85\x00b\x04\x17\x00V\x03\xf2\x00b\x05J\x00T\x03\ +\xf2\x00;\x05J\x00T\x03\xf2\x00;\x065\xff\x9c\x06\ +\xac\xff\xdd\x04B\xff\xfa\x03}\xff\xfc\x045\x00\x10\x03\ +\xa6\xffu\x05\x93\x00V\x04\x9e\x00q\x05\x93\x00V\x04\ +\x9e\x00q\x05\xc3\x00\x96\x04}\x00b\x05\xc3\x00\x96\x04\ +}\x00b\x05\xc3\x00\x96\x04}\x00b\x04\xae\x00\x12\x03\ +\xa6\x00\x12\x04\x93\xff\xfc\x03\xb2\xff;\x04\x93\xff\xfc\x03\ +\xb2\xff;\x04\x93\xff\xfc\x03\xb2\xff;\x05\x1d\x00\xfa\x04\ +q\x00\x9e\x03\xcf\x00V\x03\x10\x00;\x06J\x00V\x05\ +\xc5\x00\x81\x03\xc5\x00\x19\x03\x10\xff\xfa\x04\x12\xff\x98\x03\ +\xc1\xff\xb6\x04'\xff\x98\x03\xd3\xff\xb6\x04\x87\x00`\x04\ +\x9e\x00b\x06\xa6\x00f\x06\xcd\x00b\x06\xb4\x00\xf8\x05\ +\xf2\x00\x98\x04\x8f\x00\xf6\x03\xc3\x00\x98\x07+\xff\xbe\x06\ +s\xff\xa2\x07\xa0\x00V\x06\xf0\x00;\x05\x91\x00\x96\x04\ +\xb6\x00b\x05D\x00\xba\x04\xb2\x00V\x04P\x00y\x03\ +\x8f\x00?\x05\x12\xff\xbe\x047\xff\xa2\x04q\xff\x8b\x04\ +\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x04q\xff\x8b\x04\ +\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x04q\xff\x8b\x04\ +\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x04q\xff\x8b\x04\ +\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x04q\xff\x8b\x04\ +\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x04q\xff\x8b\x04\ +\x85\x00b\x04q\xff\x8b\x04\x85\x00b\x04\x17\x00V\x03\ +\xf2\x00b\x04\x17\x00V\x03\xf2\x00b\x04\x17\x00V\x03\ +\xf2\x00b\x04\x17\x00V\x03\xf2\x00b\x04\x17\x00V\x03\ +\xf2\x00b\x04\x17\x00V\x03\xf2\x00b\x04\x17\x00V\x03\ +\xf2\x00b\x04\x17\x00V\x03\xf2\x00b\x02\x8b\xff\xd9\x02\ +\x08\x00;\x02\x8b\xff\xd9\x02\x08\xff\xfa\x05\xc3\x00\x96\x04\ +}\x00b\x05\xc3\x00\x96\x04}\x00b\x05\xc3\x00\x96\x04\ +}\x00b\x05\xc3\x00\x96\x04}\x00b\x05\xc3\x00\x96\x04\ +}\x00b\x05\xc3\x00\x96\x04}\x00b\x05\xc3\x00\x96\x04\ +}\x00b\x05\xb6\x00\x96\x04}\x00b\x05\xb6\x00\x96\x04\ +}\x00b\x05\xb6\x00\x96\x04}\x00b\x05\xb6\x00\x96\x04\ +}\x00b\x05\xb6\x00\x96\x04}\x00b\x05h\x00\xa4\x04\ +\x9e\x00q\x05h\x00\xa4\x04\x9e\x00q\x05\xc7\x00\xa4\x04\ +\xf0\x00q\x05\xc7\x00\xa4\x04\xf0\x00q\x05\xc7\x00\xa4\x04\ +\xf0\x00q\x05\xc7\x00\xa4\x04\xf0\x00q\x05\xc7\x00\xa4\x04\ +\xf0\x00q\x04\x06\x00\xbc\x03\xb2\xff;\x04\x06\x00\xbc\x03\ +\xb2\xff;\x04\x06\x00\xbc\x03\xb2\xff;\x04\x9e\x00\x07\x00\ +\x00\xfc\x04\x00\x00\xfc\xe7\x00\x00\xfcV\x00\x00\xfc\xe7\x00\ +\x00\xfc\xe9\x00\x00\xfd\x0a\x00\x00\xfd\x0a\x00\x00\xfd\x0a\x00\ +\x00\xfc\xf6\x01\xa4\xffT\x01\x8d\xff\xe3\x01\x8d\xff\xe3\x03\ +\x00\x00\x88\x04o\x00b\x02\xdf\x00J\x03\xdf\xff\xd5\x03\ +\xdf\xffx\x04R\xff\xc7\x04\x08\xff\xde\x04R\x00o\x03\ +\xcb\xff\xff\x04F\x00<\x049\x00\x07\x05\x0c\xff\x1b\x06\ +\x19\x00R\x03\xfc\x00\x95\x02\x98\x00/\x04\x9e\x005\x04\ +\x9e\x005\x04\x9e\x005\x04\x9e\x005\x04\x9e\x005\x02\ +/\x00V\x02/\x00V\x02/\x00V\x02/\x00V\x02\ +/\x00V\x02/\x00V\x02/\x00V\x02/\x00V\x02\ +/\xff\xb5\x02/\x00V\x04R\x00V\x02\xe9\x00`\x02\ +/\x00V\x00V\x00V\x00V\x00V\x00V\x00V\x00\ +\x12\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,E#E`D-,K#QX\xb9\ +\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD\ +-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f\ +`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01\ +aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b\ +!!!!!Y-,\xb0\x02CTXKS#\ +KQZX8\x1b!!Y\x1b!!!!Y-\ +,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\ +\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#\ +D\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04\ +%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\ +\xb0\x07%\x08\xb0\x07%\x10\xb0\x06% F\xb0\x04%\ +\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\ +\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\x07%\x10\ +\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\ +\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\x07\ +%\x08\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y\ +!!!!!!!-,\x02\xb0\x04% F\ +\xb0\x04%#B\xb0\x05%\x08\xb0\x03%EH!!\ +!!-,\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%\ +CH!!!-,E# E\x18 \xb0\x00P\ + X#e#Y#h \xb0@PX!\xb0@\ +Y#XeY\x8a`D-,KS#KQZ\ +X E\x8a`D\x1b!!Y-,KTX \ +E\x8a`D\x1b!!Y-,KS#KQZ\ +X8\x1b!!Y-,\xb0\x00!KTX8\x1b\ +!!Y-,\xb0\x02CTX\xb0F+\x1b!!\ +!!Y-,\xb0\x02CTX\xb0G+\x1b!!\ +!Y-,\xb0\x02CTX\xb0H+\x1b!!!\ +!Y-,\xb0\x02CTX\xb0I+\x1b!!!\ +Y-, \x8a\x08#KS\x8aKQZX#8\ +\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \ +\xb0@8\x11\x1b!Y-,\x01F#F`#F\ +a# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\ +\x8apE`h:-, \x8a#Id\x8a#S\ +X<\x1b!Y-,KRX}\x1bzY-,\ +\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\ +\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88\ +TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\ +\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1\ +$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01K\ +RX\xb2\x02\x08\x02C`BY\x1b\xb9@\x00\x00\x80\ +\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80\ +c\xb8\x01\x00\x88TX\xb2\x02\x08\x02C`BY\xb9\ +@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C\ +`BY\xb1&\x01\x88QX\xb9@\x00\x02\x00c\xb8\ +\x04\x00\x88TX\xb2\x02@\x02C`BY\xb9@\x00\ +\x04\x00c\xb8\x08\x00\x88TX\xb2\x02\x80\x02C`B\ +YYYYYY\xb1\x00\x02CTX@\x0a\x05@\ +\x08@\x09@\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\ +\x05@\x08\xba\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\ +\xb1\x80\x02CRX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\ +\x1b\xb2\x05@\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\ +\x00\x80\x88U\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZ\ +X\xb3\x0c\x00\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYB\ +BBBB-,E\x18h#KQX# E\ + d\xb0@PX|Yh\x8a`YD-,\xb0\ +\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02\ +#>\xb1\x01\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\ +\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\ +\x06#eB\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\ +\xb0\x02CP\xb0\x01\xb0\x02CT[X!#\x10\xb0\ + \x1a\xc9\x1b\x8a\x10\xedY-,\xb0Y+-,\x8a\ +\x10\xe5-@\x99\x09!H U \x01\x1eU\x1fH\ +\x03U\x1f\x1e\x01\x0f\x1e?\x1e\xaf\x1e\x03MK&\x1f\ +LK3\x1fKF%\x1f&4\x10U%3$U\ +\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\xff\x1fJI3\x1f\ +IF%\x1f\x133\x12U\x05\x01\x03U\x043\x03U\ +\x1f\x03\x01\x0f\x03?\x03\xaf\x03\x03GF\x19\x1f\xebF\ +\x01#\x223\x1f\x1c3\x1bU\x163\x15U\x11\x01\x0f\ +U\x103\x0fU\x0f\x0fO\x0f\x02\x1f\x0f\xcf\x0f\x02\x0f\ +\x0f\xff\x0f\x02\x06\x02\x01\x00U\x013\x00Uo\x00\x7f\ +\x00\xaf\x00\xef\x00\x04\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\ +\x90\xb1TS++K\xb8\x07\xffRK\xb0\x09P[\ +\xb0\x01\x88\xb0%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\ +\xb0\x00UZ[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\ +\x1dK\xb02SX\xb0 \x1dYK\xb0dSX\xb0\ +\x10\x1d\xb1\x16\x00BYss++^stu+\ +++++t+st++++++++\ ++++++st+++\x18^\x00\x00\x00\x06\ +\x14\x00\x17\x00N\x05\xb6\x00\x17\x00u\x05\xb6\x05\xcd\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04H\x00\ +\x14\x00\x91\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\ +\x00\xff\xec\x00\x00\xfe\x14\xff\xec\x00\x00\x05\xb6\x00\x17\xfc\ +\x94\xff\xeb\xfe\x85\xfe^\xfe\xa8\xff\xeb\x00\x16\xfe\xbc\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x8b\x00\x81\x00\ +\xdd\x00\x98\x00\x8f\x00\x8e\x00\x99\x00\x88\x00\x81\x01\x0f\x00\ +\x00\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00I\x00f\x00\xbd\x01\ +%\x01\x93\x01\xff\x02\x12\x023\x02S\x02}\x02\x9c\x02\ +\xb2\x02\xc4\x02\xe0\x02\xf5\x03/\x03P\x03\x8c\x03\xde\x04\ +\x1a\x04`\x04\xb7\x04\xd5\x059\x05\x8f\x05\xbf\x05\xea\x06\ +\x0b\x06(\x06K\x06\x9a\x07\x16\x07F\x07\x93\x07\xca\x08\ +\x00\x08.\x08T\x08\x9c\x08\xc3\x08\xee\x09\x12\x09;\x09\ +U\x09\x8c\x09\xb7\x09\xf6\x0a*\x0av\x0a\xb4\x0a\xff\x0b\ +\x1e\x0bP\x0bs\x0b\xb3\x0b\xdb\x0b\xfb\x0c#\x0c?\x0c\ +S\x0cn\x0c\x8a\x0c\x9c\x0c\xb4\x0c\xfd\x0dI\x0d}\x0d\ +\xc8\x0e\x11\x0eZ\x0e\xe2\x0f!\x0fC\x0fx\x0f\xa7\x0f\ +\xb9\x10\x11\x10J\x10\x85\x10\xd1\x11\x1e\x11N\x11\x95\x11\ +\xd4\x12\x0c\x12.\x12r\x12\x9a\x12\xd2\x12\xfa\x13D\x13\ +V\x13\xa0\x13\xd1\x13\xd1\x13\xfb\x14A\x14\x8b\x14\xdb\x15\ +%\x15D\x15\xad\x15\xd7\x16F\x16\x84\x16\xb9\x16\xce\x16\ +\xd6\x17F\x17X\x17\x85\x17\xb5\x17\xe6\x18&\x18@\x18\ +~\x18\xa8\x18\xb1\x18\xd5\x18\xf5\x19\x22\x19V\x19l\x19\ +\x81\x19\x97\x19\xe4\x19\xf6\x1a\x08\x1a\x1a\x1a,\x1a?\x1a\ +Y\x1a\xa2\x1a\xae\x1a\xc0\x1a\xd2\x1a\xe4\x1a\xf7\x1b\x09\x1b\ +\x1b\x1b-\x1b@\x1b\x8c\x1b\x9e\x1b\xb0\x1b\xc2\x1b\xd4\x1b\ +\xe6\x1b\xf9\x1c%\x1c\x81\x1c\x93\x1c\xa5\x1c\xb7\x1c\xca\x1c\ +\xdc\x1d\x17\x1d\x89\x1d\x9a\x1d\xab\x1d\xbc\x1d\xcd\x1d\xdf\x1d\ +\xf1\x1et\x1e\x80\x1e\x91\x1e\xa2\x1e\xb3\x1e\xc5\x1e\xd7\x1e\ +\xe9\x1e\xfb\x1f\x0e\x1fr\x1f\x83\x1f\x94\x1f\xa5\x1f\xb6\x1f\ +\xc7\x1f\xd9 \x0b h y \x8a \x9b \xad \ +\xbe!\x0e! !2!C!U!f!r!\ +~!\x90!\xa1!\xb3!\xc4!\xd6!\xe8!\xfa\x22\ +\x0b\x22\x1d\x22)\x221\x22\x91\x22\xa3\x22\xb4\x22\xc6\x22\ +\xd7\x22\xe9\x22\xfb#\x07#\x13#%#6#H#\ +Y#k#|#\x8e#\xa0#\xac#\xbd#\xcf#\ +\xe1$'$r$\x84$\x96$\xa8$\xba$\xcc$\ +\xde$\xea$\xf5%\x07%\x18%$%0%B%\ +T%`%k%\x99%\xab%\xbd%\xc9%\xd5%\ +\xe1%\xec%\xf8&\x04&4&^&p&\x81&\ +\x8d&\x98&\xaa&\xbb&\xc7'\x06'P'b'\ +s'\x85'\x96'\xa9'\xbb(\x13(\x87(\x99(\ +\xaa(\xb6(\xc2(\xd4(\xe6(\xf8)\x09)\x1b)\ +-)9)E)W)i)t)\x7f)\x91)\ +\x9d)\xd2*$*6*G*Y*j*|*\ +\x8d*\xa0*\xb2*\xc5*\xd7*\xe3*\xef+\x01+\ +\x12+$+6+I+[+l+~+\x90+\ +\xa2+\xb4+\xe9,2,\x94-\x12-$-6-\ +H-Y-d-o-\x92-\xb6-\xc8-\xea.\ +\x03.4.W.\x85.\xb0.\xca/\x06/\x12/\ +\x1b/'/4/A/M/Z/f/z/\ +\x82/\x8a/\xa3/\xab/\xb3/\xbb/\xc30\x110\ +\x190!0A0I0Q0\x820\x8a0\xa90\ +\xb10\xe20\xea0\xf21E1M1\x931\xe01\ +\xf32\x062\x172(292K2^2\xbe3\ +\x1f3H3\x9d3\xee444o4\xba4\xe24\ +\xea51595^5\xbf5\xc76\x056K6\ +\x8e6\xce7\x05737\x857\xd18\x158e8\ +x8\x8a8\x9b8\xac8\xbe8\xd19\x1c9.9\ +s9{9\x839\x969\x9e9\xf2:7:t:\ +\x86:\x98:\xc1:\xc9;\x04;\x0c;\x14;R;\ +Z;\x92;\xe3<\x0e< .>a>\ +\xa9>\xff?F\x7fF\x87F\ +\x8fF\xa2F\xaaG\x11GaGiGzG\x8bG\ +\xd0G\xf1H\x11H#H4HFHXHkH\ +}H\x8fH\xa1H\xb3H\xc5H\xcdH\xdaH\xf1I\ +\x0aI I7I]I\x85I\xa9I\xd8J'J\ +AJQJ\xecJ\xf4J\xfcK\x1aK9KEK\ +ZK\x8bK\xc8L2L\x9dM\x01MaM\xadN\ +\x11NSN[N\x9cN\xb3N\xcaN\xe1N\xf8O\ +JOuO\x93O\xbfO\xd0O\xf0PJPsP\ +\xccQ\x05Q3Q`Q\x84Q\x90Q\x9cQ\xbfQ\ +\xe2Q\xfcR\x15R/R_R\x92R\xcbS\x12S\ +.S\x84S\xcbS\xcbS\xcbS\xcbS\xcbS\xcbS\ +\xcbS\xcbS\xcbS\xcbS\xcbS\xcbS\xcbS\xcbT\ +\xdfU1UCUKU\xc3U\xf4VTVfV\ +xV\x84V\x90V\x9cV\xc8V\xfdW\x95X\x19X\ +mX\xbcX\xfeYFYOYXYaY\x87Y\ +\xa2Y\xb4Y\xc6Y\xd8Y\xe9ZUZ\x90Z\xda[\ +/[\x87[\xda\x5c\x11\x5cF\x5c\x8f\x5c\xd5],]\ +\x81]\xe7^I^\xe4_y_\x81_\x89_\xda`\ +\x22`\x5c`\x91`\xa4`\xb7`\xc3`\xcfa:a\ +\xa2b?b\xd6cac\xbcc\xf5d,dcd\ +\x87d\xb3d\xd6d\xf7e\xcdfWf\xaag\x09g\ +Qg\xa6g\xf3hVh\x86h\xb5h\xffiJi\ +\x8ej\x06j\x12j\x1ejPj\x82j\xbej\xf9k\ +3ktk\xa3k\xd2l\x05l9lkl\x9cl\ +\xeam8m\xabn\x17n#n/nYn\xc8n\ +\xd0n\xf7o-oeo\x99o\xcdp\x04p[p\ +\x9dp\xe2q,qzq\xb1q\xebrVr\xb9s\ +,s\x99s\xa1s\xb3s\xc5t\x0btPt\x8ft\ +\xd5u\x12uLu\x7fu\xb3u\xf5v9v|v\ +\xbev\xc6v\xd8v\xe9v\xfcw\x0ew\x16w\x1ew\ +0wAw\x90w\xdaw\xedw\xffx\x12x%x\ +8xKx\x8fx\xd2x\xe4x\xf5y\x08y\x1ay\ +-y?yGyOybyty\x87y\x9ay\ +\xacy\xbdy\xd0y\xe2y\xf5z\x07z\x1az,z\ +Rzwz\x8az\x9dz\xe9{5{y{\xbd{\ +\xf9|4|e|m|\xc2}'}\x87}\xe3~\ +5~\x8a~\xda\x7f6\x7f\x7f\x7f\xc9\x80\x12\x80U\x80\ +\x92\x80\xd3\x81%\x81-\x81{\x81\xd0\x81\xdc\x81\xe8\x81\ +\xfa\x82\x0c\x82\x1f\x822\x82E\x82X\x82k\x82~\x82\ +\x91\x82\xa4\x82\xba\x82\xcf\x82\xe2\x82\xf5\x83\x08\x83\x1b\x83\ +.\x83A\x83T\x83g\x83}\x83\x92\x83\x9e\x83\xaa\x83\ +\xbc\x83\xce\x83\xe0\x83\xf1\x84\x04\x84\x17\x84*\x84=\x84\ +P\x84c\x84v\x84\x89\x84\x9f\x84\xb4\x84\xc6\x84\xd8\x84\ +\xe4\x84\xf0\x84\xfc\x85\x08\x85\x1a\x85,\x85?\x85R\x85\ +e\x85x\x85\x8b\x85\x9e\x85\xb1\x85\xc4\x85\xda\x85\xf7\x86\ +\x09\x86\x1a\x86,\x86=\x86O\x86a\x86s\x86\x84\x86\ +\x90\x86\x9c\x86\xa8\x86\xb4\x86\xc6\x86\xd8\x86\xea\x86\xfb\x87\ +\x0d\x87\x1e\x870\x87B\x87T\x87e\x87q\x87}\x87\ +\x89\x87\x95\x87\xa7\x87\xb9\x87\xcb\x87\xdc\x87\xe8\x88\x10\x88\ +H\x88}\x88\xc2\x89\x0e\x89@\x89r\x89\xb2\x89\xfc\x8a\ +\x1e\x8a>\x8a^\x8ag\x8a\xa1\x8a\xc3\x8a\xfe\x8bP\x8b\ +\x89\x8b\xcf\x8b\xd7\x8b\xf6\x8b\xfe\x8cT\x8c\xce\x8d,\x8d\ +8\x8dD\x8d\x9e\x8d\xaf\x8d\xc0\x8d\xd2\x8d\xe3\x8d\xf6\x8e\ +\x08\x8e\x1a\x8e,\x8e?\x8eQ\x8ec\x8eu\x8e\x80\x8e\ +\x92\x8e\x9e\x8e\xab\x8e\xb3\x8e\xc6\x8e\xce\x8e\xe1\x8e\xe9\x8e\ +\xf1\x8f\x03\x8f\x0f\x00\x00\x00\x02\x00\xc1\x00\x00\x04\x0a\x05\ +\xb6\x00\x03\x00\x07\x00\x0c\xb3\x04\x03\x07\x00\x00/2/\ +310\x13!\x11!7!\x11!\xc1\x03I\xfc\xb7\ +h\x02y\xfd\x87\x05\xb6\xfaJh\x04\xe6\x00\x00\x02\x00\ ++\xff\xe3\x02+\x05\xb6\x00\x04\x00\x10\x00\x18@\x0b\x02\ +\x02\x0e\x04\x03\x0e\x08OY\x0e\x16\x00?+\x00\x18?\ +\x129/10\x01\x01#\x12\x13\x014632\x16\ +\x15\x14\x06#\x22&\x02+\xfe\xeem1\x7f\xfe\xcfO\ +D-8NB17\x05\xb6\xfb\xdd\x013\x02\xf0\xfa\ +\x98LX76D^8\x00\x00\x02\x00\xe1\x03\xa6\x03\ +B\x05\xb6\x00\x03\x00\x07\x00\x0d\xb4\x06\x02\x07\x03\x03\x00\ +?3\xcd210\x01\x03#\x13!\x03#\x13\x01\xe5\ +\x99kH\x02\x19\x9akH\x05\xb6\xfd\xf0\x02\x10\xfd\xf0\ +\x02\x10\x00\x00\x02\x00?\x00\x00\x05;\x05\xb6\x00\x1b\x00\ +\x1f\x003@\x18\x00\x1f\x10\x10\x19\x15\x11\x11\x13\x04\x08\ +\x0c\x0c\x01\x1c\x0d\x0d\x0a\x17\x13\x03\x06\x0a\x12\x00?3\ +?3\x129/333\x1133\x119/33\ +3\x113310\x01\x03!\x07!\x03#\x13!\x03\ +#\x13!7!\x13!7!\x133\x03!\x133\x03\ +!\x07\x01!\x13!\x04\x0cb\x01\x1d\x0d\xfe\xcb}\x8b\ +\x81\xfe\xd1\x7f\x85y\xfe\xfb\x0d\x01\x1ce\xfe\xeb\x0d\x01\ +-{\x8b}\x011\x7f\x85}\x01\x08\x0c\xfc\xc5\x01/\ +`\xfe\xd1\x03\x83\xfe\xac\x81\xfeR\x01\xae\xfeR\x01\xae\ +\x81\x01T\x7f\x01\xb4\xfeL\x01\xb4\xfeL\x7f\xfe\xac\x01\ +T\x00\x03\x00H\xff\x89\x04/\x06\x10\x00\x1e\x00%\x00\ +,\x00:@\x1f\x1f\x0c\x03)\x22,\x1c\x0d%\x06\x06\ +\x13\x06\x0cKY\x1b&\x13&KY\x16\x13\x06\x13\x06\ +\x13\x15\x05\x15\x00//\x1299//\x113+\x11\ +\x003+\x11\x12\x00\x1792\x11310\x01\x14\x06\ +\x07\x07#7&'5\x16\x163\x13&&546\ +773\x07\x16\x17\x07&'\x03\x16\x16\x01665\ +4&'\x03\x06\x06\x15\x14\x16\x17\x03\xae\xe1\xc51\x85\ +1\xc3xR\xbbIb\x8b}\xd8\xbf'\x85'\x9f|\ +?y\x7f^\x95\x7f\xfewk~BQ\x08lvE\ +I\x01\xec\xa2\xca\x16\xe1\xdf\x0e:\x9a)-\x01\xc41\ +\x95r\x9f\xc0\x11\xb0\xb2\x0c@\x87?\x09\xfeH7\x8c\ +\xfe\xa2\x0d|\x5c6T \x02J\x0btb5Y\x1a\ +\x00\x00\x05\x00\xa8\xff\xec\x05\xfc\x05\xcb\x00\x03\x00\x0f\x00\ +\x1e\x00+\x00:\x00%@\x12\x04\x1c\x1c\x03%11\ +\x02\x03\x06\x02\x18\x1f8\x07\x0a\x15\x19\x00?3?3\ +??\x129/3\x119/310\x01\x01#\x01\ +\x03\x22\x06\x06\x15\x14326\x1254\x17\x14\x02\x06\ +\x06#\x22&54\x12632\x16\x01\x22\x06\x06\x15\ +\x1432>\x0254\x17\x14\x02\x06\x06#\x22&5\ +4\x12632\x16\x05\xbc\xfb\xc3\x98\x04>!Ci\ +?jAhE\x8b?e\x8dVnze\xacrt\ +x\xfc#Bj@k4T?&\x8c@e\x8cW\ +mze\xacrtx\x05\xb6\xfaJ\x05\xb6\xfdN\x81\ +\xf8t\xad\x82\x01\x0bg\xa6\x97k\xfe\xfe\xb1c\x95\x91\ +\xa6\x011\x98\x8f\x02\x5c~\xf9w\xacO\x95\xc9G\xa6\ +\x98l\xfe\xfd\xb0b\x96\x91\xa6\x011\x98\x90\x00\x03\x00\ +B\xff\xec\x05\x1f\x05\xcd\x00\x0b\x00\x16\x005\x000@\ +\x1b**\x1a\x05\x10'\x04\x0f(0-\x04\x1f/\x12\ +\x1f\x00JY\x1f\x043\x0cJY3\x13\x00?+\x00\ +\x18?+\x00\x18?\x12\x179\x1799/10\x01\ +\x22\x06\x15\x14\x17>\x0254&\x01267\x01\x0e\ +\x02\x15\x14\x16%467&54632\x16\x15\ +\x14\x0e\x02\x07\x01673\x06\x07\x13#'\x06\x06#\ +\x22&\x02\xe1itR\x8bh>U\xfe\xa5W\xa2r\ +\xfe\xce\x80p;\x85\xfe\xd8\xb4\xd5g\xd4\xaf\x95\xafA\ +n\x91Q\x01\x16\x7fH\xa8e\xb6\xcb\xc9ux\xdc\x89\ +\xa8\xca\x05DxnxsGN\x5c:MY\xfb3\ +B[\x01\xb1CbuIj\x81\xdf\x94\xdbf\xa5\x90\ +\xa4\xc9\x9e\x85NvbR*\xfe{n\xb9\xec\xb0\xfe\ +\xf2\xa6dV\xc0\x00\x01\x00\xe1\x03\xa6\x01\xe5\x05\xb6\x00\ +\x03\x00\x09\xb2\x02\x03\x03\x00?\xcd10\x01\x03#\x13\ +\x01\xe5\x99kH\x05\xb6\xfd\xf0\x02\x10\x00\x01\x00R\xfe\ +\xbc\x02\xe7\x05\xb6\x00\x0b\x00\x0a\xb3\x03\x03\x0a'\x00?\ +?10\x13\x10\x12\x013\x02\x02\x11\x10\x13#\x02R\ +\xf0\x01\x08\x9d\xf6\xfbr\x83\x93\x01\x10\x01S\x02@\x01\ +\x13\xfe\xf2\xfd\xa8\xfe\xc2\xfe\xad\xfe\xfd\x01\x0a\x00\x01\xff\ +`\xfe\xbc\x01\xf4\x05\xb6\x00\x0a\x00\x0a\xb3\x08\x03\x04'\ +\x00??10\x01\x10\x02\x01#\x00\x11\x10\x033\x12\ +\x01\xf4\xf3\xfe\xfb\x9c\x01\xf0q\x83\x92\x03`\xfe\xab\xfd\ +\xbf\xfe\xf2\x02'\x02}\x01U\x01\x01\xfe\xf3\x00\x01\x00\ +\xd7\x02j\x04\x81\x06\x1b\x00\x0e\x00\x0b\xb3\x06\x06\x0e\x00\ +\x00?3/10\x01\x03%\x07%\x13\x07\x03\x01'\ +\x01%7\x05\x13\x03V{\x01\xa6\x08\xfew\xb4\xa6q\ +\xfe\xfet\x015\xfe\x8b7\x01s)\x05\xf8\xfe\x81\x12\ +\x9d/\xfe\x814\x01\x96\xfe\xa8y\x01\x1cm\x9a\xb9\x01\ +\x90\x00\x01\x00\x7f\x01\x08\x04\x17\x04\xa0\x00\x0b\x00\x0e\xb4\ +\x09\x01\x01\x06\x02\x00/33\x11310\x01!5\ +!\x113\x11!\x15!\x11#\x02\x04\xfe{\x01\x85\x8d\ +\x01\x86\xfez\x8d\x02\x8b\x8e\x01\x87\xfey\x8e\xfe}\x00\ +\x01\xff\x9c\xfe\xf8\x01+\x00\xee\x00\x06\x00\x08\xb1\x04\x00\ +\x00/\xcd10%\x17\x06\x07#\x127\x01#\x08q\ +\x9d\x81~N\xee\x17\xeb\xf4\x01\x1e\xd8\x00\x01\x007\x01\ +\xd5\x029\x02s\x00\x03\x00\x08\xb1\x00\x01\x00/31\ +0\x137!\x077#\x01\xdf\x22\x01\xd5\x9e\x9e\x00\x00\ +\x01\x00+\xff\xe3\x01#\x00\xf2\x00\x0b\x00\x0c\xb5\x09\x03\ +OY\x09\x16\x00?+1074632\x16\x15\ +\x14\x06#\x22&+QG+5PD.6JM\ +[45G_4\x00\x00\x01\xff\xa2\x00\x00\x03}\x05\ +\xb6\x00\x03\x00\x0a\xb3\x03\x03\x02\x12\x00??10\x01\ +\x01#\x01\x03}\xfc\xd3\xae\x03-\x05\xb6\xfaJ\x05\xb6\ +\x00\x00\x02\x00y\xff\xec\x04D\x05\xcd\x00\x0c\x00\x19\x00\ +\x17@\x0c\x0b\x0dKY\x0b\x07\x04\x14KY\x04\x19\x00\ +?+\x00\x18?+10\x01\x10\x02\x04#\x22&5\ +\x10\x12$3 \x05\x22\x06\x02\x15\x14\x16326\x12\ +5\x10\x04D\x9d\xfe\xf1\xb3\xb0\xbc\xa4\x01\x0d\xad\x01m\ +\xfe\x89q\xc0wdos\xbcq\x03\xf6\xfe\xd9\xfe\x18\ +\xfb\xff\xf2\x01\x0e\x01\xe9\xf9\x90\xe7\xfea\xd8\xac\xb8\xe4\ +\x01\xac\xef\x01C\x00\x01\x01/\x00\x00\x03\x85\x05\xb6\x00\ +\x0a\x00\x10\xb6\x04\x07\x01\x09\x06\x01\x18\x00??\x129\ +910!#\x13\x127\x06\x07\x07'\x013\x02L\ +\xac\xc4;\x1d2Y\xb2P\x01\xc1\x95\x03\x91\x01\x05b\ +5:n\x7f\x01\x1c\x00\x00\x01\x00\x0c\x00\x00\x047\x05\ +\xcb\x00\x1b\x00\x1c@\x0e\x02\x1a\x11\x0bKY\x11\x07\x01\ +\x1aLY\x01\x18\x00?+\x00\x18?+\x11\x0031\ +0!!7\x01>\x0354&#\x22\x06\x07'6\ +32\x16\x15\x14\x06\x06\x07\x01\x15!\x03\x8f\xfc}\x1f\ +\x01\xd1f\x95a/xgM\x93YR\xbf\xde\xb0\xcd\ +O\xb7\xcb\xfe\xa0\x02\xa6\x93\x01\xa4]\x8d}{Kc\ +t9Ds\x9a\xb1\x9bo\xba\xd0\xb1\xfe\xcd\x08\x00\x00\ +\x01\x00/\xff\xec\x041\x05\xcb\x00(\x00-@\x17\x03\ +\x18\x19\x19\x18KY\x19\x19\x0b&& KY&\x07\ +\x0b\x11KY\x0b\x19\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x00910\x01\x14\x06\x07\x15\x16\ +\x16\x15\x14\x06\x06#\x22'5\x16\x1632654\ +&##732654&#\x22\x06\x07'6\ +32\x16\x041\xca\xb3|\x8e|\xee\xa4\xd2\xaf^\xd2\ +U\xa2\xb4\x9e\x8d\x83\x1f\x8b\xa5\xdatcP\x9abP\ +\xc3\xe5\xb3\xc4\x04\x87\x9c\xd9 \x09\x17\xa7}\x85\xcbr\ +O\xa415\x9f\x8a\x83\x87\x8f\xae\x8c\x5cl6Bv\ +\x90\xae\x00\x00\x02\x00\x10\x00\x00\x04L\x05\xbe\x00\x0a\x00\ +\x13\x00%@\x12\x06\x13\x0f\x07\x01\x05\x13\x05LY\x09\ +\x13\x13\x03\x07\x06\x03\x18\x00??\x129/3+\x11\ +\x003\x113\x11310\x01#\x03#\x13!7\x01\ +3\x033!6\x12\x13#\x06\x06\x07\x01\x04+\xe9H\ +\xa4J\xfdp\x1d\x03B\xc4\xcf\xe8\xfeu.@T\x08\ +\x11c\x17\xfd\xeb\x01N\xfe\xb2\x01N\x9e\x03\xd2\xfc)\ +\xdc\x012\x01$\x1d\x87\x1d\xfd\x8f\x00\x00\x01\x00P\xff\ +\xec\x04H\x05\xb6\x00\x1c\x00-@\x17\x1b\x07\x00\x00\x12\ +MY\x00\x00\x07\x17\x17\x1aLY\x17\x06\x07\x0cKY\ +\x07\x19\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x00910\x012\x16\x15\x14\x06\x04#\x22'\ +5\x1632654&#\x22\x06\x07'\x13!\x07\ +!\x036\x02V\xb6\xd7\x92\xfe\xfa\xb1\xc1\x89\xa4\xaa\xbf\ +\xd6\x93\x830bZJ\xc5\x02\x9c!\xfd\xf6\x7fW\x03\ +}\xd1\xb2\xa1\xf4yO\xa4f\xc0\xac~\x93\x0d\x189\ +\x02\xac\x99\xfeI\x17\x00\x00\x02\x00\x85\xff\xec\x04Z\x05\ +\xcb\x00\x1a\x00(\x00-@\x17\x0d\x18\x05\x11!MY\ +\x11\x11\x18\x05\x05\x0aKY\x05\x07\x18\x1bKY\x18\x19\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x134\x12\x12$32\x17\x07&#\x22\ +\x00\x0336632\x16\x15\x14\x02\x06#\x22&\x05\ +26654#\x22\x0e\x02\x15\x14\x16\x85y\xce\x01\ +\x1e\xb8oI#Df\xd4\xfe\xdfD\x08;\xafj\x9a\ +\xb4\x85\xe4\x93\xb6\xc7\x01\x8f^\x93Q\xddB|`0\ +y\x01\xa8\xd1\x01\x9c\x01#\x93\x17\x91\x16\xfe\xd6\xfe\xda\ +O^\xc5\xac\xa1\xfe\xf5\x8d\xe6Yl\xbeq\xf89_\ +rb\x89\x9e\x00\x00\x01\x00\xae\x00\x00\x04y\x05\xb6\x00\ +\x06\x00\x16@\x0a\x05\x02\x00\x18\x03\x02LY\x03\x06\x00\ +?+\x00\x18?\x113103\x01!7!\x07\x01\ +\xae\x03\x00\xfd1\x1f\x03{\x1b\xfd\x04\x05!\x95\x8b\xfa\ +\xd5\x00\x03\x00`\xff\xec\x04V\x05\xcd\x00\x19\x00%\x00\ +1\x002@\x1b\x13\x06)#\x04\x0d\x00,\x1aKY\ +,,\x0d\x00\x00&KY\x00\x07\x0d KY\x0d\x19\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00\x17910\x012\x16\x15\x14\x06\x07\x16\x16\x15\x14\ +\x06\x06#\x22&5467&&5466\x03\ +\x06\x06\x15\x14\x1632654&\x13\x22\x06\x15\x14\ +\x16\x176654&\x02\xe5\xae\xc3\x9c\xbc\x7fjx\ +\xe1\x98\xbe\xd8\xbe\xc9_Qm\xc6\x0a\xb9\x99\x8ap\x8b\ +\xa6h\x08r\x88NX\xa1\x86s\x05\xcd\xad\x95\x81\xc0\ +PN\xaesz\xbff\xc5\xa9\x94\xd8LE\x97`o\ +\xafa\xfc\xef<\xa7wk~\x94zc\x96\x02\xbd\x83\ +nR|6<\x8ffZj\x00\x02\x00b\xff\xec\x04\ ++\x05\xcb\x00\x1a\x00(\x00-@\x17\x0e\x05\x18!\x11\ +MY!!\x05\x18\x18\x1bKY\x18\x07\x05\x0aKY\ +\x05\x19\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x00910\x01\x14\x02\x02\x04#\x22'5\x16\ +32\x12\x13#\x06\x06#\x22&546632\ +\x16%\x22\x06\x15\x14\x1632>\x0254&\x04+\ +p\xb7\xfe\xfc\xac\x88j\x86p\xca\xfa@\x0a3\xa3c\ +\xa9\xb8\x81\xe7\x90\xb4\xc7\xfe\x7f\x96\xb6mlL\x80Y\ +)v\x04\x0a\xc2\xfeW\xfe\xd9\x8c\x22\x9e/\x01\x1a\x01\ +,KW\xc5\xbe\x99\xff\x8f\xe5W\xe2\xb1|\x849j\ +zZ\x83\x99\x00\x00\x02\x00+\xff\xe3\x01\xc3\x04d\x00\ +\x0b\x00\x16\x00\x17@\x0c\x0f\x14OY\x0f\x10\x09\x03O\ +Y\x09\x16\x00?+\x00\x18?+107463\ +2\x16\x15\x14\x06#\x22&\x134632\x15\x14\x06\ +#\x22&+QG+5PD.6\xa0PGa\ +SA.6JM[45G_4\x03\xa5M[\ +hI]5\x00\x00\x02\xff\x9c\xfe\xf8\x01\xc3\x04d\x00\ +\x06\x00\x11\x00\x15@\x09\x04@\x06\x0a\x0fOY\x0a\x10\ +\x00?+\x00\x18/\x1a\xce10%\x17\x06\x07#\x12\ +7\x134632\x15\x14\x06#\x22&\x01#\x08q\ +\x9d\x81~NcPGaSA.6\xee\x17\xeb\xf4\ +\x01\x1e\xd8\x02\xceM[hI]5\x00\x01\x00y\x00\ +\xf2\x04\x10\x04\xd9\x00\x06\x00\x17@\x09\x01\x02\x05\x05\x06\ +\x04\x03\x00\x03\x00//\x11329\x113310\ +%\x015\x01\x15\x01\x01\x04\x10\xfci\x03\x97\xfd\x15\x02\ +\xeb\xf2\x01\xa6b\x01\xdf\x95\xfe\x8d\xfe\xb8\x00\x00\x02\x00\ +\x7f\x01\xbc\x04\x17\x03\xe5\x00\x03\x00\x07\x00\x12\xb7\x05\x00\ +\x04\x01\x04\x04\x00\x01\x00/33/]310\x13\ +5!\x15\x015!\x15\x7f\x03\x98\xfch\x03\x98\x03Z\ +\x8b\x8b\xfeb\x8e\x8e\x00\x00\x01\x00y\x00\xf2\x04\x10\x04\ +\xd9\x00\x06\x00\x1b@\x0b\x05\x04\x01\x01\x03\x00\x06\x02\x03\ +\x06\x03\x00//\x113\x113\x129\x113310\ +\x13\x01\x015\x01\x15\x01y\x02\xe9\xfd\x17\x03\x97\xfci\ +\x01\x89\x01H\x01s\x95\xfe!b\xfeZ\x00\x00\x02\x00\ +\x9e\xff\xe3\x03\x9a\x05\xcb\x00\x1a\x00&\x00%@\x12\x07\ +\x11\x00\x00$\x11$\x1eOY$\x16\x11\x0aIY\x11\ +\x04\x00?+\x00\x18?+\x11\x12\x009\x18/\x129\ +10\x01667>\x0254&#\x22\x06\x07'\ +6632\x16\x15\x14\x06\x07\x06\x06\x07\x03463\ +2\x16\x15\x14\x06#\x22&\x01\x04\x16es\x80P.\ +g`Q\x94B=\x5c\xc8R\xa7\xb8\x83\xa0}X\x17\ +\xedPG,5SA.6\x01\x93\x82\xa7[dX\ +d>]e3\x1f\x8132\xa8\x9a{\xcfx[q\ +h\xfe\xb7M[45I]4\x00\x00\x02\x00o\xff\ +F\x06\x8f\x05\xb4\x005\x00A\x00*@\x13&+\x07\ +\x096\x10\x18==\x04\x09\x10\x09\x10\x09+\x1f2\x03\ +\x00?3\xc499//\x1133\x113\x113\x12\ +9\x11310\x01\x14\x02\x06#\x22'#\x06#\x22\ +&546632\x16\x17\x06\x06\x17\x14326\ +654\x00#\x22\x04\x02\x15\x10\x00!27\x15\x06\ +# \x00\x11\x10\x12$!2\x04\x12\x05\x22\x06\x06\x15\ +\x14\x1632\x13\x13&\x06\x8fn\xc8z\xc5\x10\x08o\ +\xb4s\x83\x88\xf1\x8cA}X@D\x03fN\x7fJ\ +\xff\x00\xf2\xe4\xfe\x9b\xc5\x01\x1f\x01\x0a\xc5\xdf\xdb\xe0\xfe\ +\xc6\xfe\x97\xfd\x01\xb2\x01\x0d\xbf\x01\x14\x91\xfdJ^\xa0\ +\x5cBA\xbbUF?\x03T\xb3\xfe\xde\xa4\xb8\xb8\x97\ +\x86\x9d\xfe\x90\x18$\xf2\xfc.u\x86\xe9\x7f\xef\x01\x00\ +\xd6\xfe\x87\xe4\xfe\xf2\xfe\xd7V\x7fZ\x01q\x01A\x01\ +\x05\x01\xc1\xf6\x97\xfe\xec_n\xc4r]S\x01;\x01\ +\x02\x17\x00\x00\x02\xff\x8b\x00\x00\x04\x10\x05\xb6\x00\x07\x00\ +\x0e\x00\x1d@\x0e\x0b\x04\x0e\x01IY\x0e\x0e\x03\x04\x03\ +\x07\x03\x12\x00?3?\x129/+\x11\x00310\ +\x01!\x03#\x013\x13#\x03\x03&'\x06\x06\x03\x03\ +-\xfe\x10\xf5\xbd\x03\x1f\xae\xb8\xaaK#\x18\x05%W\ +\xce\x01\xd1\xfe/\x05\xb6\xfaJ\x02m\x01+\xb3\xabX\ +\xae\xfe}\x00\x03\x00V\x00\x00\x04\xb2\x05\xb6\x00\x0e\x00\ +\x17\x00 \x00-@\x17\x05 \x0f\x0f JY\x0f\x0f\ +\x0d\x0e\x0e\x17JY\x0e\x03\x0d\x18JY\x0d\x12\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x01 \x11\x14\x06\x07\x15\x16\x16\x15\x14\x04#!\ +\x01\x1332654&##\x03!2654\ +&##\x03\x02\x01\xb0\xae\x9es{\xfe\xd0\xff\xfe1\ +\x015'\xf8\x9c\xba\x85\x8f\xd3\xfa\x01\x0a\xb5\xc2\x95\x8c\ +\xec\x05\xb6\xfe\xb0\x8d\xc2\x1d\x0a \x9dn\xd4\xf1\x05\xb6\ +\xfd\x8e\x92~hg\xfbn\xa1\x93t{\x00\x00\x01\x00\ +\x96\xff\xec\x05\x0a\x05\xcb\x00\x18\x00\x17@\x0c\x14\x00I\ +Y\x14\x04\x0d\x07IY\x0d\x13\x00?+\x00\x18?+\ +10\x01\x22\x04\x02\x15\x14\x16327\x15\x06\x06#\ +\x22\x00\x11\x10\x12$32\x17\x07&\x03\xae\xae\xfe\xed\ +\xa1\xc3\xab\x8b\xb7V\x9cn\xf2\xfe\xec\xd3\x01d\xe1\xc5\ +\x97E\x8a\x053\xc2\xfe\x89\xdd\xbb\xdf9\x95\x1f\x1c\x01\ ++\x01\x02\x01\x05\x01\xc1\xecP\x8dE\x00\x02\x00V\x00\ +\x00\x05\x14\x05\xb6\x00\x09\x00\x13\x00\x17@\x0c\x06\x12J\ +Y\x06\x03\x05\x13JY\x05\x12\x00?+\x00\x18?+\ +10\x01\x10\x02\x04!!\x01! \x00\x012$\x12\ +54&##\x03\x05\x14\xd2\xfez\xfe\xfa\xfe\xa0\x01\ +5\x01V\x01\x14\x01\x1f\xfc\xad\xca\x012\xa3\xce\xc7\xb2\ +\xfa\x03m\xfe\xfb\xfep\xd8\x05\xb6\xfe\xd5\xfc\x08\xb7\x01\ +N\xd7\xd7\xdd\xfbp\x00\x00\x01\x00V\x00\x00\x04j\x05\ +\xb6\x00\x0b\x00&@\x14\x06\x09IY\x06\x06\x01\x02\x02\ +\x05IY\x02\x03\x01\x0aIY\x01\x12\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+10!!\x01!\x07\ +!\x03!\x07!\x03!\x035\xfd!\x015\x02\xdf \ +\xfd\xcab\x02\x0f\x1d\xfd\xefr\x025\x05\xb6\x99\xfe+\ +\x98\xfd\xe8\x00\x01\x00V\x00\x00\x04j\x05\xb6\x00\x09\x00\ +\x1d@\x0f\x06\x09IY\x06\x06\x02\x01\x12\x02\x05IY\ +\x02\x03\x00?+\x00\x18?\x129/+10!#\ +\x01!\x07!\x03!\x07!\x01\x02\xac\x015\x02\xdf\x1e\ +\xfd\xc8n\x02\x10 \xfd\xef\x05\xb6\x99\xfd\xeb\x99\x00\x00\ +\x01\x00\x96\xff\xec\x05N\x05\xcb\x00\x1d\x00&@\x14\x00\ +\x1dIY\x00\x00\x04\x0b\x0b\x12IY\x0b\x04\x04\x19I\ +Y\x04\x13\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++10\x01!\x03\x06# \x00\x11\x10\x12$32\ +\x16\x17\x07&&#\x22\x04\x02\x15\x14\x16327\x13\ +!\x035\x01\xcb\x9a\xd8\xcb\xfe\xf8\xfe\xdb\xcb\x01h\xdb\ +u\xcdhBM\xb1j\xa9\xfe\xeb\x9a\xcd\xb8\x9aj`\ +\xfe\xdf\x02\xfe\xfd9K\x01!\x01\x03\x01\x0d\x01\xb9\xf5\ +(,\x98\x222\xcb\xfe\x94\xe1\xbe\xda'\x01\xbc\x00\x00\ +\x01\x00V\x00\x00\x05s\x05\xb6\x00\x0b\x00\x1a@\x0d\x08\ +\x03IY\x08\x08\x05\x0a\x06\x03\x01\x05\x12\x00?3?\ +3\x129/+10!#\x13!\x03#\x013\x03\ +!\x133\x04=\xa7\x8f\xfdl\x91\xaa\x015\xaa\x83\x02\ +\x94\x85\xa8\x02\xb0\xfdP\x05\xb6\xfd\x92\x02n\x00\x01\xff\ +\xd9\x00\x00\x03\x00\x05\xb6\x00\x0b\x00 @\x10\x09\x04\x06\ +\x04JY\x06\x03\x03\x0a\x01\x0aJY\x01\x12\x00?+\ +\x11\x003\x18?+\x11\x00310!!77\x01\ +'7!\x07\x07\x01\x17\x01\xcb\xfe\x0e\x13\xac\x01\x00\x9c\ +\x12\x01\xf2\x12\xaf\xff\x00\x9e\x5c%\x04\xb4#^^#\ +\xfbL%\x00\x01\xfe\xc1\xfe\x7f\x025\x05\xb6\x00\x0c\x00\ +\x11\xb7\x09\x03\x00\x05IY\x00\x22\x00?+\x00\x18?\ +10\x03\x22'7\x163267\x013\x01\x02\xa6\ +i0\x06ELd\x83\x19\x013\xaa\xfe\xcbO\xfe\x7f\ +\x19\x93\x14}x\x05\xaa\xfaD\xfe\x85\x00\x01\x00V\x00\ +\x00\x05+\x05\xb6\x00\x0d\x00\x15@\x09\x0a\x04\x07\x0b\x08\ +\x03\x01\x07\x12\x00?3?3\x129910!#\ +&\x02'\x07\x03#\x013\x03\x013\x01\x04\x0a\xbaH\ +\x95H\xae}\xaa\x015\xaa\x97\x02\xbc\xd1\xfd\x81\xb5\x01\ +e\xb7\x83\xfd\xb2\x05\xb6\xfd:\x02\xc6\xfd\x83\x00\x01\x00\ +V\x00\x00\x03V\x05\xb6\x00\x05\x00\x11\xb7\x01\x03\x00\x03\ +IY\x00\x12\x00?+\x00\x18?103\x013\x01\ +!\x07V\x015\xaa\xfe\xec\x025!\x05\xb6\xfa\xe4\x9a\ +\x00\x00\x01\x00T\x00\x00\x06\xb8\x05\xb6\x00\x14\x00\x19@\ +\x0c\x0a\x02\x13\x03\x07\x0c\x08\x03\x00\x0f\x07\x12\x00?3\ +3?3\x12\x17910!\x03#\x06\x06\x07\x03#\ +\x013\x133\x01!\x01#\x12\x127#\x01\x02\xa4\xa6\ +\x08\x07+\x10\xbe\xa2\x015\xf4\x95\x09\x02\x93\x01\x0a\xfe\ +\xd1\xae~\x86\x1b\x06\xfd3\x05\x10H\xfbJ\xfc}\x05\ +\xb6\xfbL\x04\xb4\xfaJ\x02N\x02wM\xfa\xee\x00\x00\ +\x01\x00T\x00\x00\x05\xa8\x05\xb6\x00\x0f\x00\x15@\x09\x03\ +\x0b\x07\x0e\x08\x03\x01\x07\x12\x00?3?3\x1299\ +10!#\x01#\x06\x07\x03#\x013\x01367\ +\x133\x04s\xb5\xfe4\x06 *\xac\xa2\x015\xb4\x01\ +\xcb\x06\x1e*\xae\xa4\x04\xc7\xdd\xc5\xfc\xdb\x05\xb6\xfb<\ +\xe0\xb5\x03/\x00\x00\x02\x00\x96\xff\xec\x05\x83\x05\xcd\x00\ +\x0d\x00\x1b\x00\x17@\x0c\x0b\x0eIY\x0b\x04\x04\x15I\ +Y\x04\x13\x00?+\x00\x18?+10\x01\x10\x02\x04\ +# \x00\x11\x10\x12$32\x00%\x22\x06\x02\x15\x14\ +\x16326\x1254&\x05\x83\xb0\xfe\xb8\xd7\xff\x00\ +\xfe\xe2\xc0\x01O\xd2\xf4\x01\x18\xfd\xe7\x9d\xf8\x89\xc4\xa8\ +\x98\xf1\x8c\xbc\x03\x8b\xfe\xf3\xfeW\xe9\x01+\x01\x0e\x01\ +\x08\x01\xb4\xec\xfe\xcc\x9c\xca\xfe\x98\xda\xc7\xdf\xc3\x01l\ +\xdd\xc7\xdf\x00\x02\x00V\x00\x00\x04\x87\x05\xb6\x00\x0a\x00\ +\x13\x00\x1d@\x0f\x0b\x04JY\x0b\x0b\x07\x06\x12\x07\x13\ +JY\x07\x03\x00?+\x00\x18?\x129/+10\ +\x01\x14\x00!#\x03#\x01!2\x16\x013265\ +4&##\x04\x87\xfe\xb8\xfe\xc3\x87{\xaa\x015\x01\ +J\xd6\xdc\xfd\x13\x85\xd8\xe0\x8b\x90\xa3\x04=\xf8\xfe\xfa\ +\xfd\xc1\x05\xb6\xbd\xfd\xd8\xb6\xb0}o\x00\x02\x00\x96\xfe\ +\xa4\x05\x83\x05\xcd\x00\x0d\x00\x1f\x00#@\x11\x1f\x10\x1d\ +\x10\x07\x17\x00IY\x17\x04\x10\x07IY\x10\x13\x00?\ ++\x00\x18?+\x11\x12\x009\x18\x10\xc610\x01\x22\ +\x06\x02\x15\x14\x16326\x1254&\x01\x07# \ +\x00\x11\x10\x12$32\x00\x11\x10\x00\x07\x01#\x03j\ +\x9d\xf8\x89\xc4\xa8\x9e\xf2\x85\xbc\xfe\xc4\x11\x10\xff\x00\xfe\ +\xe2\xc0\x01O\xd2\xf4\x01\x18\xfe\xea\xec\x01\x12\xdb\x055\ +\xca\xfe\x98\xda\xc7\xdf\xc8\x01i\xdb\xc7\xdf\xfa\xb9\x02\x01\ ++\x01\x0e\x01\x08\x01\xb4\xec\xfe\xcc\xfe\xf2\xfe\xb3\xfe\x1a\ +N\xfe\x9a\x00\x02\x00V\x00\x00\x04\x89\x05\xb6\x00\x0b\x00\ +\x15\x00&@\x13\x08\x00\x0e\x0e\x00JY\x0e\x0e\x03\x0a\ +\x02\x12\x03\x0cIY\x03\x03\x00?+\x00\x18?3\x12\ +9/+\x11\x12\x00910\x01\x03#\x01! \x11\ +\x10\x05\x13#\x03\x03\x02\x0732654&#\x01\ +\x81\x81\xaa\x015\x01@\x01\xbe\xfe\x90\xef\xba\xd1if\ +\x0e\xa8\xc1\xd0\x87\x98\x02`\xfd\xa0\x05\xb6\xfe\x92\xfe\xa4\ +e\xfdy\x02`\x02\xc1\xfe\x12A\xaa\x9fym\x00\x00\ +\x01\x00'\xff\xec\x04#\x05\xcb\x00&\x00 @\x10\x1f\ +\x0c\x15\x03\x15\x1cIY\x15\x04\x03\x09IY\x03\x13\x00\ +?+\x00\x18?+\x11\x12\x009910\x01\x14\x04\ +#\x22&'5\x1632654&'&&5\ +4$32\x16\x17\x07&&#\x22\x06\x15\x14\x16\x16\ +\x17\x1e\x02\x03\x91\xfe\xe7\xffj\xa1G\xa2\xb2\xa2\xbei\ +\x8f\x97u\x01\x08\xd7c\xab_BB\xa4E\x86\xa3\x22\ +Ji\x93g5\x01\xa8\xd3\xe9\x1d\x22\xaaT\x97\x84N\ +wQU\xaat\xbb\xeb&.\x96&,\x8bw6M\ +D=Xdy\x00\x01\x00\xba\x00\x00\x04\xb4\x05\xb6\x00\ +\x07\x00\x16@\x0a\x01\x12\x07\x03\x04\x03IY\x04\x03\x00\ +?+\x11\x003\x18?10!#\x01!7!\x07\ +!\x01\xe7\xac\x01\x15\xfej!\x03\xd9\x1e\xfeh\x05\x1f\ +\x97\x97\x00\x00\x01\x00\xa4\xff\xec\x05\x7f\x05\xb6\x00\x15\x00\ +\x14@\x09\x15\x0a\x03\x04\x11IY\x04\x13\x00?+\x00\ +\x18?310\x01\x03\x02\x04#\x22&547\x13\ +3\x03\x06\x15\x14\x163267\x13\x05\x7f\xcd7\xfe\ +\xe3\xf6\xe6\xde\x18\xbd\xaa\xbf\x16\x92\x91\xac\xbf,\xcd\x05\ +\xb6\xfc:\xfe\xf9\xfd\xd0\xc3Qx\x03n\xfc\x85jR\ +u\x87\xaf\xca\x03\xba\x00\x00\x01\x00\xbc\x00\x00\x05\x1f\x05\ +\xb6\x00\x0b\x00\x10\xb6\x0b\x06\x03\x07\x03\x06\x12\x00??\ +3\x11310%67\x013\x01#\x033\x13\x16\ +\x15\x01\xdf=e\x01\xdf\xbf\xfc\xf3\xb4\xa2\xaaa\x14\xc5\ +\x90\xc2\x03\x9f\xfaJ\x05\xb6\xfc^\xc4\x8b\x00\x00\x01\x00\ +\xdf\x00\x00\x07\x81\x05\xb6\x00\x1d\x00\x19@\x0c\x04\x0f\x18\ +\x03\x09\x1c\x13\x0a\x03\x01\x09\x12\x00?3?33\x12\ +\x17910!#\x03&5#\x06\x06\x01#\x033\ +\x13\x17\x14\x07367\x013\x13\x16\x15\x07367\ +\x013\x04\xe9\xaa1\x08\x06\x19H\xfe,\xae>\xaa\x1f\ +\x02\x0a\x06YC\x01\x95\xb2+\x09\x01\x09K8\x01\x83\ +\xb6\x03\xc5\x88\x92H\xa5\xfc\x0e\x05\xb6\xfc{Xb\xa0\ +\xf3\x8c\x03`\xfc\xa4\x99\x97S\xe0\x82\x03}\x00\x01\xff\ +\x98\x00\x00\x04\xd1\x05\xb6\x00\x0b\x00\x15@\x09\x08\x02\x04\ +\x09\x06\x03\x01\x04\x12\x00?3?3\x129910\ +!#\x03\x01#\x01\x013\x13\x013\x01\x03\xbc\xb4\xd5\ +\xfe\x1f\xba\x02T\xfe\xf9\xac\xcb\x01\xbb\xba\xfd\xd5\x02\x81\ +\xfd\x7f\x03\x08\x02\xae\xfd\xcd\x023\xfdJ\x00\x00\x01\x00\ +\xbc\x00\x00\x04\xc3\x05\xb6\x00\x08\x00\x10\xb6\x00\x05\x01\x07\ +\x03\x05\x12\x00??3\x12910\x01\x013\x01\x03\ +#\x13\x033\x02\x19\x01\xe9\xc1\xfd\x8dq\xacw\xee\xaa\ +\x02\xcb\x02\xeb\xfcg\xfd\xe3\x02%\x03\x91\x00\x00\x01\xff\ +\xf0\x00\x00\x04\x93\x05\xb6\x00\x09\x00 @\x10\x07\x04\x02\ +\x08\x05\x04IY\x05\x03\x01\x08IY\x01\x12\x00?+\ +\x00\x18?+\x11\x003\x11310!!7\x01!\ +7!\x07\x01!\x03u\xfc{\x1c\x03\x9c\xfdq \x03\ +Z\x1a\xfcd\x02\xb9\x89\x04\x92\x9b\x8b\xfbo\x00\x01\xff\ +\xf0\xfe\xbc\x02\xf0\x05\xb6\x00\x07\x00\x0e\xb5\x05\x02\x03\x06\ +\x01'\x00?3?310\x01!\x01!\x07#\x01\ +3\x01s\xfe}\x01}\x01\x83\x1f\xe3\xfe\xc2\xe3\xfe\xbc\ +\x06\xfa\x8d\xfa!\x00\x01\x00\xdd\x00\x00\x02P\x05\xb6\x00\ +\x03\x00\x0a\xb3\x03\x03\x02\x12\x00??10\x01\x13#\ +\x03\x01w\xd9\x9a\xd9\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\xff\ +j\xfe\xbc\x02j\x05\xb6\x00\x07\x00\x0e\xb5\x03\x04\x03\x00\ +\x07'\x00?3?310\x073\x01#7!\x01\ +!w\xe1\x01@\xe3\x1e\x01\x85\xfe\x84\xfe|\xb6\x05\xdf\ +\x8d\xf9\x06\x00\x01\x005\x02)\x04\x02\x05\xc1\x00\x06\x00\ +\x0e\xb4\x05\x01\x00\x04\x02\x00//3\x11310\x13\ +\x013\x01#\x03\x015\x02Vm\x01\x0a\x91\xc9\xfe-\ +\x02)\x03\x98\xfch\x02\xeb\xfd\x15\x00\x00\x01\xffD\xfe\ +\xbc\x02\x8d\xffH\x00\x03\x00\x08\xb1\x01\x02\x00/31\ +0\x01!7!\x02o\xfc\xd5\x1e\x03+\xfe\xbc\x8c\x00\ +\x01\x02?\x04\xd9\x03\x87\x06!\x00\x08\x00\x08\xb1\x06\x01\ +\x00/\xcd10\x01#&&'53\x16\x17\x03\x87\ +h=\x87\x1c\xb5+h\x04\xd9=\xba<\x15\x88\xa7\x00\ +\x02\x00b\xff\xec\x04`\x04\x5c\x00\x12\x00 \x00'@\ +\x14\x0a\x04\x0c\x00\x05\x0f\x08\x15\x00\x1aFY\x00\x10\x0c\ +\x13FY\x0c\x16\x00?+\x00\x18?+\x00\x18??\ +\x11\x129910\x012\x16\x17373\x03#7\ +#\x06#\x22&54\x126\x0326\x1254&\ +#\x22\x06\x02\x15\x14\x16\x02\x7f\x5c\x90(\x0bC\x7f\xe9\ +\x85\x1a\x08\xb3\xc6\x8b\x9e\x8e\xfa)a\xc0xp[h\ +\xb3f^\x04\x5cc]\xac\xfb\xb8\xd1\xe5\xc6\xac\xd0\x01\ +d\xca\xfc\x1b\xb9\x01)\x95gz\xac\xfe\xda\xa3rq\ +\x00\x00\x02\x00;\xff\xec\x049\x06\x14\x00\x15\x00\x22\x00\ +'@\x14\x0b\x04\x00\x0f\x07\x00\x06\x15\x0f\x16FY\x0f\ +\x10\x00\x1dFY\x00\x16\x00?+\x00\x18?+\x00\x18\ +??\x11\x129910\x05\x22&'#\x07#\x01\ +3\x06\x02\x0736632\x16\x15\x14\x02\x06\x13\x22\ +\x06\x02\x15\x14\x16326\x1254\x02!a\x93%\ +\x0aF}\x01J\xa8370\x09]\xb5`\x8d\x9e\x89\ +\xf5 `\xc7uoic\xabh\x14fX\xaa\x06\x14\ +\xf2\xfe\xff\xacvo\xc6\xad\xd1\xfe\x9d\xc7\x03\xe3\xbe\xfe\ +\xe0\x97nu\xa2\x01+\xa8\xe3\x00\x01\x00b\xff\xec\x03\ +\xaa\x04\x5c\x00\x18\x00\x17@\x0c\x07\x0cFY\x07\x10\x00\ +\x13FY\x00\x16\x00?+\x00\x18?+10\x05\x22\ +&54\x12$32\x17\x07&#\x22\x06\x02\x15\x14\ +\x163267\x15\x06\x01\xfa\xc2\xd6\x94\x01\x05\xa3\x89\ +\x83/xcp\xb9i\x85uH\x80>|\x14\xd6\xc3\ +\xc8\x01R\xbd3\x8d3\x99\xfe\xef\xa0\x80\x8e(\x1b\x8f\ +?\x00\x02\x00b\xff\xec\x04\xc3\x06\x14\x00\x14\x00!\x00\ +'@\x14\x03\x0b\x0e\x00\x06\x00\x09\x15\x00\x1cFY\x00\ +\x10\x0e\x15FY\x0e\x16\x00?+\x00\x18?+\x00\x18\ +??\x11\x129910\x012\x17367\x133\ +\x01#7#\x06\x06#\x22&54\x126\x0326\ +\x1254&#\x22\x06\x02\x15\x14\x02\x7f\xc2W\x0a\x11\ +\x1cN\xa6\xfe\xb6\x8b\x16\x08e\xb0^\x8b\x9c\x90\xf5&\ +^\xc8ulge\xadi\x04Z\xbe\x9bw\x01f\xf9\ +\xec\xd1}h\xc4\xae\xd6\x01d\xc2\xfc\x1d\xbb\x01#\x97\ +ot\xa5\xfe\xd5\xa5\xe3\x00\x02\x00b\xff\xec\x03\xb4\x04\ +\x5c\x00\x18\x00\x22\x00&@\x14\x1c\x0eFY\x1c\x1c\x00\ +\x07\x07\x19FY\x07\x10\x00\x12FY\x00\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x05\x22&\ +54\x12632\x16\x15\x14\x04!#\x07\x14\x163\ +267\x15\x06\x06\x13\x22\x06\x0732654&\ +\x01\xec\xb8\xd2\x95\xf6\x94\x99\x9a\xfe\xb4\xfe\xcb!\x04{\ +\x81?\x85c^\x904g\xb50\x0c\xe4\xf3I\x14\xda\ +\xc1\xbc\x01Y\xc0\x85w\xb4\xcdP\x83\x93$0\x92,\ +#\x03\xe1\xbc\xa7wq5F\x00\x01\xff\x1b\xfe\x14\x03\ +\x83\x06\x1f\x00 \x00*@\x16\x0c\x1a\x09\x1d\x10\x16F\ +Y\x10\x00\x1a\x1dGY\x1a\x0f\x00\x05FY\x00\x1b\x00\ +?+\x00\x18?+\x00\x18?+\x11\x003\x1131\ +0\x03\x22'5\x163267\x13#?\x0266\ +32\x16\x17\x07&#\x22\x06\x07\x073\x07#\x03\x06\ +\x06hE8@0LR\x19\xe3\xc1\x0d\xce\x17.\xa3\ +\xa0(t +L=W]\x1d\x19\xee\x19\xed\xe8'\ +\xa2\xfe\x14\x15\x8d\x16|s\x04:CBd\xc8\xa5\x17\ +\x0e\x81\x1da\x81l\x7f\xfb\xb6\xbd\xae\x00\x03\xff\x81\xfe\ +\x14\x04L\x04\x5c\x00(\x005\x00C\x00H@(\x1b\ +33\x0eFY\x079GY\x04 \x09\x03\x07&3\ +\x073\x07\x15(&@GY&\x10(\x02GY(\ +\x0f\x15,GY\x15\x1b\x00?+\x00\x18?+\x00\x18\ +?+\x11\x12\x0099\x18//\x11\x12\x179++\ +\x11\x00310\x01\x07\x07\x16\x15\x14\x06#\x22'\x06\ +\x15\x14\x16\x17\x17\x16\x16\x15\x14\x04!\x22&546\ +7&5467&&54632\x17\x01\x14\ +\x1632654&''\x06\x06\x01\x14\x1632\ +6654&#\x22\x06\x06\x04L\x19\xd3)\xe9\xc3\ +7\x1d\x8bB?u\xb5\xa3\xfe\xdc\xfe\xf7\xc2\xdc\x90\xa1\ +Nf[?P\xef\xbaNL\xfdJ\x82\x80\xb6\xcdl\ +\x82\x9fx\x80\x01\x16ZPOv?XRNuA\ +\x04Hk\x18>`\xbf\xe3\x085N)\x1b\x08\x0e\x16\ +\x84\x80\xb8\xca\x93\x86i\x9a6)PEc+ }\ +S\xc2\xf8\x14\xfa\xf5MZ\x7ft>H\x0e\x10\x19~\ +\x03\x12UYT\x93VRVQ\x91\x00\x01\x00;\x00\ +\x00\x04)\x06\x14\x00\x1d\x00\x1d@\x0e\x12\x0b\x16\x0c\x00\ +\x00\x0b\x15\x16\x05FY\x16\x10\x00?+\x00\x18?3\ +?\x11\x12910!\x13654#\x22\x06\x06\x07\ +\x03#\x013\x0e\x03\x0736632\x16\x15\x14\x07\ +\x06\x03\x02\xd9\x94\x12\x93Y\xa9\x81!e\xa8\x01J\xa8\ +\x12!#)\x1b\x0b^\xb7d\x83\x8f\x17'j\x02\xb4\ +^)\x94v\xe1\x9f\xfe'\x06\x14R\x9a\x9f\xaef{\ +j\x90\x84>h\xc1\xfe!\x00\x00\x02\x00;\x00\x00\x02\ +\x1f\x05\xdf\x00\x03\x00\x0e\x00\x0e\xb5\x0c\x07\x02\x0f\x01\x15\ +\x00??\xc42103#\x133\x034632\ +\x15\x14\x06#\x22&\xe3\xa8\xea\xa8y@3XC,\ +(4\x04H\x01\x188GZ7L1\x00\x00\x02\xfe\ +\xfe\xfe\x14\x02\x1d\x05\xdf\x00\x0c\x00\x17\x00\x16@\x0a\x15\ +\x10\x08\x0f\x00\x05FY\x00\x1b\x00?+\x00\x18?\xc4\ +210\x03\x22'5\x16327\x013\x01\x06\x06\ +\x014632\x15\x14\x06#\x22&\x87E6=:\ +}+\x01\x08\xa6\xfe\xf6$\x9d\x01T@3VC,\ +&4\xfe\x14\x15\x8d\x16\xcd\x04\xdb\xfb\x16\xab\x9f\x07L\ +8GZ7L1\x00\x00\x01\x009\x00\x00\x04!\x06\ +\x14\x00\x0e\x00\x18@\x0b\x06\x0e\x09\x01\x0a\x00\x01\x0f\x05\ +\x09\x15\x00?3??\x11\x129910\x01\x013\ +\x01\x01#\x03\x07\x03#\x013\x02\x02\x07\x01J\x02\x0e\ +\xc9\xfe+\x01'\xbb\xeb\x98R\xaa\x01J\xaaHr-\ +\x02/\x02\x19\xfe-\xfd\x8b\x02\x0c{\xfeo\x06\x14\xfe\ +\xb0\xfd\xec\x81\x00\x00\x01\x009\x00\x00\x02-\x06\x14\x00\ +\x03\x00\x0a\xb3\x02\x00\x01\x15\x00??103#\x01\ +3\xe1\xa8\x01L\xa8\x06\x14\x00\x00\x01\x00;\x00\x00\x06\ +\x87\x04\x5c\x00,\x00'@\x13\x16\x0f\x0c\x13\x0d\x0f\x00\ +!\x0c\x15'\x06\x13\x06FY\x1a\x13\x10\x00?3+\ +\x11\x003\x18?33?\x11\x129910!\x13\ +654&#\x22\x06\x06\x07\x03#\x133\x0736\ +632\x16\x1736632\x16\x15\x14\x07\x03#\ +\x13654&#\x22\x06\x06\x07\x03\x02\xb8\x94\x12>\ +KT\x9fy!e\xa8\xea\x8b\x16\x0aW\xad\x5cqz\ +\x0b\x08V\xc2c\x7f\x8b\x16\x90\xaa\x94\x14EJQ\x9e\ +w\x1fk\x02\xb4^)FNx\xdf\x9d\xfe%\x04H\ +\xcbwh\x82t}y\x88\x82Dn\xfd`\x02\xb4h\ +*>Kt\xd5\x92\xfe\x0c\x00\x00\x01\x00;\x00\x00\x04\ +)\x04\x5c\x00\x19\x00\x1d@\x0e\x0f\x0c\x13\x0d\x0f\x00\x0c\ +\x15\x13\x06FY\x13\x10\x00?+\x00\x18?3?\x11\ +\x12910!\x13654&#\x22\x06\x06\x07\x03\ +#\x133\x0736632\x16\x15\x14\x07\x03\x02\xd9\ +\x94\x14GNY\xa9\x81!e\xa8\xea\x8b\x16\x0a`\xb3\ +`\x7f\x93\x17\x8f\x02\xb4h(?Lx\xde\x9e\xfe%\ +\x04H\xcbze\x8b}Oe\xfd`\x00\x02\x00b\xff\ +\xf0\x04\x1d\x04V\x00\x0d\x00\x1b\x00\x17@\x0c\x00\x11F\ +Y\x00\x10\x07\x18FY\x07\x16\x00?+\x00\x18?+\ +10\x012\x16\x15\x14\x02\x06#\x22&54\x126\ +\x014&#\x22\x06\x02\x15\x14\x16326\x12\x02\x83\ +\xbe\xdc\x90\xf6\x9b\xc0\xda\x92\xf8\x01\x83}km\xad_\ +\x7fwh\xa6]\x04V\xe1\xc5\xbc\xfe\xb2\xb6\xe2\xc4\xbe\ +\x01O\xb3\xfeqs\x8f\x94\xfe\xf9\xa1\x83\x8f\x92\x01\x0d\ +\x00\x00\x02\xff\xd5\xfe\x14\x049\x04Z\x00\x15\x00\x22\x00\ +'@\x14\x04\x0c\x00\x0f\x0a\x0f\x09\x1b\x0f\x16FY\x0f\ +\x10\x00\x1dFY\x00\x16\x00?+\x00\x18?+\x00\x18\ +??\x11\x129910\x05\x22&'#\x07\x06\x06\ +\x03#\x013\x073632\x16\x15\x14\x02\x06\x13\x22\ +\x06\x02\x15\x14\x16326\x1254\x02!a\x92(\ +\x0a\x04\x03\x0fk\xa6\x01P\x8b\x1a\x08\xb3\xc1\x89\x9e\x8a\ +\xf4 `\xc7uoic\xabh\x14dZ&\x19Z\ +\xfe\x03\x064\xd1\xe3\xc3\xb0\xd4\xfe\x9e\xc5\x03\xe3\xbe\xfe\ +\xe0\x97nu\xa2\x01+\xa8\xe3\x00\x02\x00b\xfe\x14\x04\ +`\x04\x5c\x00\x15\x00\x22\x00'@\x14\x04\x0b\x00\x0f\x05\ +\x0f\x08\x1b\x00\x1dFY\x00\x10\x0f\x16FY\x0f\x16\x00\ +?+\x00\x18?+\x00\x18??\x11\x129910\ +\x012\x16\x17373\x01#\x1367#\x06\x06#\ +\x22&54\x126\x0326\x1254&#\x22\x06\ +\x02\x15\x14\x02\x81^\x8f%\x0dC}\xfe\xb0\xa6e\x09\ +0\x08_\xb4`\x8c\x9f\x91\xf7)\x5c\xc4ymbe\ +\xb0h\x04\x5ce[\xac\xf9\xcc\x01\xe0-\xb0yl\xc3\ +\xaf\xd4\x01h\xc2\xfc\x1b\xb8\x01\x22\x9biz\xa9\xfe\xd7\ +\xa3\xe3\x00\x00\x01\x00;\x00\x00\x03h\x04\x5c\x00\x12\x00\ +\x1b@\x0d\x0e\x0b\x00\x0c\x0f\x0b\x15\x00\x05FY\x00\x10\ +\x00?+\x00\x18??\x11\x12910\x012\x17\x07\ +&#\x22\x06\x06\x07\x03#\x133\x073>\x02\x02\xf0\ +E3$54[\x9fw\x1ck\xa8\xea\x8b\x16\x0aH\ +^g\x04\x5c\x0e\x96\x0dx\xd5\x82\xfe\x0a\x04H\xcb_\ +S-\x00\x00\x01\x00\x08\xff\xec\x03D\x04\x5c\x00$\x00\ + @\x10\x0c\x1e\x03\x15\x15\x1bFY\x15\x10\x03\x09F\ +Y\x03\x16\x00?+\x00\x18?+\x11\x12\x00991\ +0\x01\x14\x06#\x22'5\x16\x1632654&\ +'&&54632\x17\x07'&#\x22\x06\x15\ +\x14\x16\x17\x1e\x02\x02\xdf\xdd\xc9\xa9\x88F\xa2E~\x80\ +Ft\x82l\xca\xa5\xab\x9f68ew]jGo\ +k].\x017\x9c\xafE\x9e*.dN9ND\ +I\x8c`\x8a\xa9J\x89\x19+WE8P?n\x02\xa4\x00\x00\ +\x01\x00b\x00\x00\x04\x12\x04H\x00\x0b\x00\x0e\xb5\x09\x01\ +\x0f\x05\x00\x15\x00?2?3103\x033\x13\x12\ +\x153\x127\x013\x01\xdf}\xa8@\x18\x06\x7f4\x01\ +E\xb2\xfd\xb1\x04H\xfd\x9b\xfe\xfeh\x01\x13`\x02\x5c\ +\xfb\xb8\x00\x00\x01\x00u\x00\x00\x06\x06\x04H\x00\x1f\x00\ +\x19@\x0c\x05\x0f\x19\x03\x09\x1d\x13\x0a\x0f\x00\x09\x15\x00\ +?3?33\x12\x17910!\x03&55#\ +\x07\x07\x01#\x033\x13\x15\x14\x07367\x013\x13\ +\x16\x15\x15\x0736\x12\x013\x01\x03? \x04\x092\ +S\xfe\xdd\xca+\xa4\x12\x08\x06/Z\x01'\xb6%\x06\ +\x02\x06\x1cn\x01\x0c\xb2\xfe\x06\x02Z^N\x9cv\xbd\ +\xfd\x91\x04H\xfd\xaeX\x93z|\xc6\x02u\xfd\xae\xa8\ +^5*V\x01\x09\x02X\xfb\xb8\x00\x00\x01\xff\xb6\x00\ +\x00\x04\x06\x04H\x00\x0b\x00\x15@\x09\x06\x00\x02\x07\x04\ +\x0f\x0b\x02\x15\x00?3?3\x129910\x01\x01\ +#\x01\x033\x13\x013\x01\x13#\x01\xd3\xfe\xa6\xc3\x01\ +\xdb\xef\xaa\xae\x01J\xc2\xfe9\xfc\xa8\x01\xb2\xfeN\x02\ +5\x02\x13\xfed\x01\x9c\xfd\xe5\xfd\xd3\x00\x01\xff;\xfe\ +\x14\x04\x12\x04H\x00\x18\x00\x18@\x0b\x05\x0f\x0a\x00\x0f\ +\x0f\x14FY\x0f\x1b\x00?+\x00\x18?3\x1291\ +0\x133\x13\x16\x12\x153667\x013\x01\x06\x06\ +#\x22'5\x1632677b\xa8J\x0a\x13\x06\ +#h\x19\x01E\xb2\xfdH]\xb6\x80HD?DR\ +u7L\x04H\xfd\xdfE\xfe\xf3RW\xe2+\x02a\ +\xfa\xfe\xac\x86\x15\x87\x12ec\x88\x00\x00\x01\xff\xe3\x00\ +\x00\x03}\x04H\x00\x09\x00 @\x10\x07\x04\x02\x08\x05\ +\x04GY\x05\x0f\x01\x08GY\x01\x15\x00?+\x00\x18\ +?+\x11\x003\x11310!!7\x01!7!\ +\x07\x01!\x02\xb2\xfd1\x17\x02\xb6\xfe!\x1b\x02\x91\x1d\ +\xfdX\x02\x13u\x03V}\x8c\xfc\xc1\x00\x01\x00\x1b\xfe\ +\xbc\x03/\x05\xb6\x00'\x00\x19@\x0b\x1b\x0a\x0a\x0b\x0b\ +&\x14\x12\x03\x00'\x00??329/3\x129\ +10\x01\x22&54766'4#726\ +7\x136633\x07\x22\x06\x07\x03\x06\x06\x07\x15\x16\ +\x15\x14\x07\x07\x06\x15\x14\x163\x15\x01\xba\x8d\x97\x14!\ +%\x04\xd1 v\x8f\x16D\x22\xa7\xab!\x1fi\x5c\x14\ +G\x1c~h\x97\x12/\x0fIS\xfe\xbciw4Y\ +\x92\xa3\x15\x8f\x8fWh\x01F\xa0\x80\x8dIW\xfe\xbf\ +{z\x11\x05)\xac;H\xd3:(51\x8e\x00\x00\ +\x01\x02\x1d\xfe\x10\x02\xa8\x06\x14\x00\x03\x00\x0a\xb3\x00\x00\ +\x03\x1b\x00??10\x013\x11#\x02\x1d\x8b\x8b\x06\ +\x14\xf7\xfc\x00\x01\xff\xb6\xfe\xbc\x02\xc1\x05\xb6\x00'\x00\ +\x1b@\x0c\x1c\x0b\x0b\x0a\x0a\x14\x13&\x00\x03\x13'\x00\ +??2\x1139/3\x12910\x012\x16\x15\ +\x14\x07\x07\x06\x15\x143\x07\x22\x06\x07\x03\x06\x06##\ +5267\x136675&547765\ +4\x01\x1d\x90\x99\x151\x10\xd1!w\x8e\x16\ +C$\xa6\xb5\x0dsh\x13H\x19~k\x96\x122\x0e\ +Qc\x1c\x05\xb6iv0]\xdbD+\x8f\x90Vh\ +\xfe\xba\xa4}\x8eHW\x01Bu}\x12\x06*\xa9;\ +H\xd5A\x2251\x8d\x00\x01\x00s\x02P\x043\x03\ +T\x00\x17\x00\x12\xb6\x0f\x00\x06\x80\x0c\x03\x12\x00/3\ +3\x1a\xcd2210\x01\x22\x06\x075632\x16\ +\x17\x16\x163267\x15\x06#\x22&'&&\x01\ +\x5c6\x812b\x91EtV@a27\x813d\ +\x90H~HKZ\x02\xc9E4\x97m\x1d%\x1b\x1c\ +B7\x96n! \x18\x00\x00\x02\xff\xf2\xfe\x8b\x01\ +\xf2\x04^\x00\x03\x00\x0f\x00\x18@\x0b\x00\x00\x07\x03\x22\ +\x07\x0dOY\x07\x10\x00?+\x00\x18?\x129/1\ +0\x013\x03#\x014632\x16\x15\x14\x06#\x22\ +&\x01\x04m\xb0\xcf\x01\x08QF,5QA06\ +\x02\xac\xfb\xdf\x05+L\x5c46G]3\x00\x01\x00\ +\xe1\xff\xec\x04)\x05\xcb\x00\x1e\x00(@\x15\x02\x1e\x0c\ +\x09\x09\x11MY\x1e\x18KY\x1e\x09\x1e\x09\x01\x0a\x07\ +\x01\x19\x00??\x1299//++\x11\x003\x11\ +310\x05#7&&54\x126773\x07\ +\x16\x17\x07&#\x22\x06\x02\x15\x14\x163267\x15\ +\x06\x07\x02F}+\x84\x8f\x7f\xe6\x91#{%wb\ +/mnp\xb9i\x84vH\x80>{\xa3\x14\xd7\x22\ +\xcf\x9a\xb9\x01>\xc7\x15\xaa\xa8\x09(\x8e4\x99\xfe\xef\ +\xa0}\x92(\x1c\x8f>\x04\x00\x00\x01\xff\xe9\x00\x00\x04\ +\x9a\x05\xc9\x00\x1b\x001@\x19\x0b\x17\x18\x17NY\x08\ +\x18\x18\x12\x00\x00\x05KY\x00\x07\x13\x0f\x12\x0fLY\ +\x12\x18\x00?+\x11\x003\x18?+\x11\x12\x009\x18\ +/3+\x11\x00310\x012\x17\x07&#\x22\x07\ +\x03!\x07!\x07\x06\x06\x07!\x07!7677#\ +73\x13\x12\x03J\xb8\x98B\x92\x84\xd52E\x01r\ +\x1a\xfe\x8d/\x16XP\x02\xd5!\xfcG\x1b\xcd5/\ +\xc8\x1a\xc9LK\x05\xc9V\x85O\xed\xfe\xba\x7f\xdbb\ +\x89+\x9a\x8d.\xf3\xdd\x7f\x01^\x01a\x00\x00\x02\x00\ +\xa8\x01!\x04\x10\x04\x87\x00\x1b\x00'\x00$@\x13\x05\ +\x02\x1a\x17\x13\x10\x0c\x09\x08\x07\x12\x18\x15\x0a\x04\x1f\x15\ +%\x07\x00/3\xc42\xce2\x10\xce2\x12\x1791\ +0\x1347'7\x17632\x177\x17\x07\x16\x15\ +\x14\x07\x17\x07'\x06#\x22'\x07'7&7\x14\x16\ +32654&#\x22\x06\xe5D\x81\x5c\x7fgr\ +re\x81\x5c\x81FF\x7fZ\x81buwb\x7fZ\ +\x7fD\x81\x8fgh\x92\x92hf\x90\x02\xd3ub\x81\ +\x5c\x81FF\x81Z\x81hqwb\x7fZ\x7fDF\ +\x7fZ\x7f`wg\x8f\x8fgh\x92\x91\x00\x00\x01\x00\ +\x7f\x00\x00\x04\xec\x05\xb6\x00\x16\x00=@!\x0a\x0e\x0f\ +\x0eMY\x07\x0f\x06\x12\x13\x12MY\x03\x00\x13\x15\x0f\ +\x13\x1f\x13\x02\x0f\x13\x0f\x13\x0c\x01\x15\x06\x0c\x18\x00?\ +?3\x1299//]\x11\x1292+\x11\x003\ +\x113+\x11\x00310\x01\x013\x013\x07!\x07\ +!\x07!\x03#\x13!7!7!73\x033\x02\ +F\x01\xeb\xbb\xfd\xeb\xe7\x1c\xfe\xd7!\x01)\x1d\xfe\xd9\ +9\x9a8\xfe\xdd\x1d\x01\x22!\xfe\xdd\x1d\xe1\xca\xa3\x02\ +\xcb\x02\xeb\xfc\xfe\x85\xa0\x85\xfe\xf6\x01\x0a\x85\xa0\x85\x03\ +\x02\x00\x02\x02\x1d\xfe\x10\x02\xa8\x06\x14\x00\x03\x00\x07\x00\ +\x17@\x0a\x03\x03\x07\x04\x04\x07\x00\x00\x07\x1b\x00??\ +\x119/\x119/10\x013\x11#\x113\x11#\ +\x02\x1d\x8b\x8b\x8b\x8b\x06\x14\xfc\xf8\xfe\x0d\xfc\xf7\x00\x00\ +\x02\x00;\xff\xf8\x03\xe5\x06\x1d\x00,\x008\x00-@\ +\x19\x193\x02-\x0f-603'\x06\x1e\x07\x1e$\ +GY\x1e\x15\x07\x0cGY\x07\x00\x00?+\x00\x18?\ ++\x11\x12\x00\x179\x113\x11310\x1347&\ +54632\x17\x07&#\x22\x06\x15\x14\x16\x17\x1e\ +\x02\x15\x14\x06\x07\x16\x15\x14\x06#\x22'5\x16\x163\ +2654&'&&\x01\x06\x06\x15\x14\x16\x176\ +654&\xae\xeew\xcf\xb0\xbd\x845\x94vfy\ +L|db4zor\xe4\xcc\xb0w8\xa1L\x85\ +\x8eef\x8ap\x01TRje\x94P_c\x03\x02\ +\xc9jF\x85\x7f\x9eD{E\xce\x8c\x8b\x00\ +\x02\x00X\x00q\x03\xa8\x03\xbe\x00\x06\x00\x0d\x00!@\ +\x0e\x0d\x07\x0a\x06\x00\x03\x0a\x03\x05\x08\x01\x0c\x05\x01\x00\ +//3\x113\x1299\x1133\x113310\ +\x13\x01\x17\x01\x13\x07\x03\x05\x01\x17\x01\x13\x07\x03X\x01\ +\x87N\xfe\xd7\xacq\xe7\x01\x8b\x01oV\xfe\xe5\x9eq\ +\xd7\x02H\x01vQ\xfe\xb8\xfe}1\x01\xba\x0e\x01\x95\ +E\xfe\x93\xfe\xa21\x01\x8d\x00\x00\x01\x00\x7f\x01\x08\x04\ +\x17\x03\x19\x00\x05\x00\x0a\xb2\x02\x04\x05\x00/3/1\ +0\x01\x11#\x11!5\x04\x17\x8c\xfc\xf4\x03\x19\xfd\xef\ +\x01\x83\x8e\xff\xff\x007\x01\xd5\x029\x02s\x02\x06\x00\ +\x10\x00\x00\x00\x04\x00\x8b\xff\xec\x06j\x05\xcb\x00\x0f\x00\ +\x1f\x00-\x005\x00-@\x15%))\x045**\ +\x0c\x04#''..\x0c\x1c\x04\x04\x14\x0c\x13\x00?\ +3?3\x129/3\x129\x11\x129/3\x119\ +/310\x134\x12$32\x04\x12\x15\x14\x02\x04\ +#\x22$\x027\x14\x12\x0432$\x1254\x02$\ +#\x22\x04\x02%\x14\x06\x07\x13#\x03#\x11#\x113\ +2\x16\x013254&##\x8b\xc8\x01^\xca\xc5\ +\x01Z\xd0\xc9\xfe\xa7\xcd\xcf\xfe\xa2\xc3i\xae\x01-\xac\ +\xae\x01*\xaf\xae\xfe\xd7\xb0\xae\xfe\xd6\xaf\x03\xb6_U\ +\xe3\x95\xcfq\x7f\xe5\xa3\x9d\xfeZ\x5c\xc3_fZ\x02\ +\xdb\xc8\x01^\xca\xc2\xfe\xa2\xd0\xcc\xfe\xa7\xca\xcf\x01Z\ +\xc6\xad\xfe\xd3\xad\xae\x01)\xb0\xae\x01*\xaf\xae\xfe\xd7\ +\x08N~#\xfe\x7f\x01`\xfe\xa0\x03p~\xfe\xe5\x95\ +L>\x00\x00\x01\x00\xe3\x06\x14\x04\x17\x06\x98\x00\x03\x00\ +\x08\xb1\x01\x02\x00/310\x01!7!\x03\xf4\xfc\ +\xef!\x03\x13\x06\x14\x84\x00\x02\x00\xd7\x03^\x03F\x05\ +\xcb\x00\x0c\x00\x18\x00\x0c\xb3\x10\x0a\x16\x03\x00/3/\ +310\x134632\x16\x16\x15\x14\x06#\x22&\ +7\x14\x1632654&#\x22\x06\xd7\xb5\x82S\ +\x91T\xb5\x83\x83\xb4qtRSrsRPv\x04\ +\x93\x80\xb8S\x91T\x80\xb5\xb5\x80PtuORu\ +u\x00\x02\x00\x7f\x00\x00\x04\x17\x04\x98\x00\x0b\x00\x0f\x00\ +!@\x0e\x09\x01\x01\x06\x02\x0b\x02\x0b\x02\x0d\x05\x0d\x0c\ +\x05\x00//3\x11\x1299//\x1133\x113\ +10\x01!5!\x113\x11!\x15!\x11#\x015\ +!\x15\x02\x04\xfe{\x01\x85\x8d\x01\x86\xfez\x8d\xfe{\ +\x03\x98\x02\x83\x8d\x01\x88\xfex\x8d\xfe}\xff\x00\x8d\x8d\ +\x00\x00\x01\x00`\x02J\x02\xf6\x05\xc9\x00\x17\x00\x12\xb7\ +\x0a\x0f\x1f\x02\x16\x16\x01 \x00?3\x113?31\ +0\x01!7%>\x0254&#\x22\x07'63\ +2\x16\x15\x14\x06\x07\x07!\x02\x91\xfd\xcf\x17\x01\x08s\ +W(>;Zi;}\x95m}i\x91\xdd\x01\x8b\ +\x02Jj\xe4dcW/5@PZeq^c\ +\xa1}\xbb\x00\x01\x00w\x029\x02\xf4\x05\xc9\x00\x22\x00\ +\x1b@\x0c\x22\x10\x10\x11\x11\x06\x18\x1d\x1f\x0b\x06!\x00\ +?3?3\x129/3\x12910\x01\x16\x16\x15\ +\x14\x06#\x22'5\x163254##732\ +654&#\x22\x07'632\x16\x15\x14\x07\x02\ +%EN\xb6\xa2}l}r\xcd\xb2Z\x16_at\ +E;f^7m\x9fr\x80\xcf\x04\x0c\x11fE\x84\ +\x938\x7fH\xaa\x89kRG<=D]Xp_\ +\xb46\x00\x00\x01\x02\x14\x04\xd9\x03\xba\x06!\x00\x09\x00\ +\x08\xb1\x04\x09\x00/\xcd10\x016673\x15\x06\ +\x06\x07#\x02\x148\x8b%\xbe&\xccKi\x04\xf4<\ +\xb7:\x151\xcc6\x00\x00\x01\xff\xd5\xfe\x14\x04j\x04\ +H\x00\x1a\x00 @\x10\x12\x0c\x0f\x07\x17\x0f\x0a\x15\x16\ +\x1b\x0f\x02FY\x0f\x16\x00?+\x00\x18???3\ +\x129910\x01\x1432667\x133\x03#\ +7#\x06\x06#\x22'#\x06\x06\x03#\x013\x03\x06\ +\x01'\x93Y\xa6\x83\x22i\xa3\xe9\x8b\x18\x0c]\xb4b\ +p3\x09\x0b\x17H\xa4\x01P\xa8\x94\x12\x01\x0a\x93v\ +\xe0\x9d\x01\xde\xfb\xb8\xcdyh`N\x8c\xfe\xa2\x064\ +\xfdI\x5c\x00\x01\x00\xc7\xfe\xfc\x04\xb6\x06\x14\x00\x0f\x00\ +\x1a@\x0b\x06\x08\x08\x0e\x05\x01\x0e\x03IY\x0e\x00/\ ++\x00\x18/3\x129/910\x01#\x11#\x11\ +#\x11\x06#\x22&5\x1063!\x04\xb6r\xd5s\ +>T\xd8\xcb\xda\xe8\x02-\xfe\xfc\x06}\xf9\x83\x033\ +\x12\xfa\xfb\x01\x04\xfe\x00\xff\xff\x00\xaa\x02K\x01\xa2\x03\ +Z\x00\x07\x00\x11\x00\x7f\x02h\x00\x01\xffV\xfe\x14\x00\ +\xd3\x00\x00\x00\x11\x00\x0c\xb3\x08\x03\x10\x0f\x00/3\xcc\ +210\x13\x14\x06#\x22'5\x163254&\ +'73\x07\x16\xd3\xa2\x85)-&\x1e\xaeNZ\xc6W\xa8\xb6\ +\x84\x9f\x84Q\x16\xeeQG+5PC/6\x02\xa8\ +\x82\xa4]K\x7f\x94]f3\x1f\x8104\xa7\x9a|\ +\xd0wbmd\x01JM[44G_3\x00\xff\ +\xff\xff\x8b\x00\x00\x04\x10\x07s\x02&\x00$\x00\x00\x01\ +\x07\x00C\xff\xd8\x01R\x00\x0a\xb4\x02\x10\x10\x05&\x00\ ++\x115\xff\xff\xff\x8b\x00\x00\x04M\x07s\x02&\x00\ +$\x00\x00\x01\x07\x00v\x00\x93\x01R\x00\x0a\xb4\x02\x18\ +\x18\x05&\x00+\x115\xff\xff\xff\x8b\x00\x00\x048\x07\ +s\x02&\x00$\x00\x00\x01\x07\x01K\x00B\x01R\x00\ +\x0a\xb4\x02\x15\x15\x05&\x00+\x115\xff\xff\xff\x8b\x00\ +\x00\x04\x8f\x07/\x02&\x00$\x00\x00\x01\x07\x01R\x00\ +`\x01R\x00\x0a\xb4\x02\x18\x18\x05&\x00+\x115\xff\ +\xff\xff\x8b\x00\x00\x04+\x07%\x02&\x00$\x00\x00\x01\ +\x07\x00j\x00B\x01R\x00\x0c\xb5\x03\x02\x22\x22\x05&\ +\x00+\x1155\xff\xff\xff\x8b\x00\x00\x04\x10\x07\x02\x02\ +&\x00$\x00\x00\x01\x07\x01P\x00\x02\x00\x81\x00\x19@\ +\x0f\x03\x02\xef\x18\x01\xdf\x18\x01o\x18\x01\x0f\x18\x01\x18\ +\x00\x11]]]]55\x00\x00\x02\xff\x89\x00\x00\x06\ +\xdd\x05\xb6\x00\x0f\x00\x13\x00<@ \x0a\x0dIY\x0a\ +\x0a\x01\x06\x13\x03IY\x13\x13\x01\x06\x05\x12\x09\x12\x06\ +\x12IY\x06\x03\x01\x0eIY\x01\x12\x00?+\x00\x18\ +?+\x11\x003\x18?\x11\x129/+\x11\x12\x009\ +\x18/+10!!\x13!\x01#\x01!\x07!\x03\ +!\x07!\x03!\x01\x13#\x01\x05\xa8\xfd\x1fb\xfeJ\ +\xfe\xdb\xc5\x03\xaa\x03\xaa!\xfd\xcbd\x02\x10\x1c\xfd\xef\ +s\x026\xfd\x7f\x93T\xfeN\x01\xd1\xfe/\x05\xb6\x99\ +\xfe+\x96\xfd\xe6\x01\xd5\x02\xb0\xfdP\xff\xff\x00\x96\xfe\ +\x14\x05\x0a\x05\xcb\x02&\x00&\x00\x00\x00\x07\x00z\x02\ +#\x00\x00\xff\xff\x00V\x00\x00\x04j\x07s\x02&\x00\ +(\x00\x00\x01\x07\x00C\xff\xfb\x01R\x00\x0a\xb4\x01\x0d\ +\x0d\x05&\x00+\x115\xff\xff\x00V\x00\x00\x04j\x07\ +s\x02&\x00(\x00\x00\x01\x07\x00v\x00}\x01R\x00\ +\x0a\xb4\x01\x15\x15\x05&\x00+\x115\xff\xff\x00V\x00\ +\x00\x04j\x07s\x02&\x00(\x00\x00\x01\x07\x01K\x00\ +F\x01R\x00\x0a\xb4\x01\x12\x12\x05&\x00+\x115\xff\ +\xff\x00V\x00\x00\x04j\x07%\x02&\x00(\x00\x00\x01\ +\x07\x00j\x00B\x01R\x00\x0c\xb5\x02\x01\x1f\x1f\x05&\ +\x00+\x1155\xff\xff\xff\xd9\x00\x00\x03\x00\x07s\x02\ +&\x00,\x00\x00\x01\x07\x00C\xfe\xf3\x01R\x00\x0a\xb4\ +\x01\x0d\x0d\x05&\x00+\x115\xff\xff\xff\xd9\x00\x00\x03\ +k\x07s\x02&\x00,\x00\x00\x01\x07\x00v\xff\xb1\x01\ +R\x00\x0a\xb4\x01\x15\x15\x05&\x00+\x115\xff\xff\xff\ +\xd9\x00\x00\x03I\x07s\x02&\x00,\x00\x00\x01\x07\x01\ +K\xffS\x01R\x00\x0a\xb4\x01\x12\x12\x05&\x00+\x11\ +5\xff\xff\xff\xd9\x00\x00\x03>\x07%\x02&\x00,\x00\ +\x00\x01\x07\x00j\xffU\x01R\x00\x0c\xb5\x02\x01\x1f\x1f\ +\x05&\x00+\x1155\x00\x02\x00H\x00\x00\x05\x14\x05\ +\xb6\x00\x0d\x00\x1b\x00-@\x17\x1a\x07\x08\x07IY\x17\ +\x08\x08\x05\x0a\x0a\x16JY\x0a\x03\x05\x1bJY\x05\x12\ +\x00?+\x00\x18?+\x11\x12\x009\x18/3+\x11\ +\x00310\x01\x10\x02\x04!!\x13#73\x13!\ + \x00\x012$\x1254&##\x03!\x07!\x03\ +\x05\x14\xd2\xfez\xfe\xfa\xfe\xa0\x87\x95 \x96\x8d\x01V\ +\x01\x14\x01\x1f\xfc\xad\xca\x012\xa3\xce\xc7\xb2o\x01J\ +!\xfe\xb6j\x03m\xfe\xfb\xfep\xd8\x02\x89\x96\x02\x97\ +\xfe\xd5\xfc\x08\xb7\x01N\xd7\xd7\xdd\xfd\xfc\x96\xfe\x0a\xff\ +\xff\x00T\x00\x00\x05\xa8\x07/\x02&\x001\x00\x00\x01\ +\x07\x01R\x01\x08\x01R\x00\x0a\xb4\x01\x19\x19\x05&\x00\ ++\x115\xff\xff\x00\x96\xff\xec\x05\x83\x07s\x02&\x00\ +2\x00\x00\x01\x07\x00C\x00h\x01R\x00\x0a\xb4\x02\x1d\ +\x1d\x05&\x00+\x115\xff\xff\x00\x96\xff\xec\x05\x83\x07\ +s\x02&\x002\x00\x00\x01\x07\x00v\x01!\x01R\x00\ +\x0a\xb4\x02%%\x05&\x00+\x115\xff\xff\x00\x96\xff\ +\xec\x05\x83\x07s\x02&\x002\x00\x00\x01\x07\x01K\x00\ +\xd5\x01R\x00\x0a\xb4\x02\x22\x22\x05&\x00+\x115\xff\ +\xff\x00\x96\xff\xec\x05\x83\x07/\x02&\x002\x00\x00\x01\ +\x07\x01R\x00\xe5\x01R\x00\x0a\xb4\x02%%\x05&\x00\ ++\x115\xff\xff\x00\x96\xff\xec\x05\x83\x07%\x02&\x00\ +2\x00\x00\x01\x07\x00j\x00\xcf\x01R\x00\x0c\xb5\x03\x02\ +//\x05&\x00+\x1155\x00\x01\x00\xa8\x011\x03\ +\xf0\x04w\x00\x0b\x00\x16@\x0a\x03\x06\x00\x09\x04\x02\x0a\ +\x08\x04\x02\x00/3/3\x12\x17910\x01\x017\ +\x01\x01\x17\x01\x01\x07\x01\x01'\x01\xe7\xfe\xc1b\x01@\ +\x01Cc\xfe\xbc\x01Ba\xfe\xbd\xfe\xc0`\x02\xd3\x01\ +Ac\xfe\xc0\x01@`\xfe\xbc\xfe\xbe`\x01@\xfe\xc2\ +`\x00\x03\x00w\xff\xac\x05\xb6\x06\x04\x00\x17\x00 \x00\ +)\x00#@\x13\x1f#\x1e$\x04&\x18\x0f\x18IY\ +\x0f\x04\x04&IY\x04\x13\x00?+\x00\x18?+\x11\ +\x12\x00\x17910\x01\x10\x02\x04#\x22'\x07'7\ +&5\x10\x12$32\x16\x177\x17\x07\x16\x16\x01\x22\ +\x06\x02\x15\x14\x17\x01&\x134'\x01\x16326\x12\ +\x05\x83\xb0\xfe\xb8\xd7\xc8\x84\x81p\x89j\xc0\x01O\xd2\ +c\x9fH\x83r\x9502\xfd\xe7\x9d\xf8\x89)\x02\xe1\ +Z\xd1!\xfd#[\x8e\x98\xf1\x8c\x03\x8b\xfe\xf3\xfeW\ +\xe9`\xa0\x5c\xaa\x88\xeb\x01\x08\x01\xb4\xec69\xa6\x5c\ +\xb8>\xbc\x01?\xca\xfe\x98\xda\x87\x5c\x03\x97X\xfeZ\ +vW\xfcqJ\xc3\x01l\x00\xff\xff\x00\xa4\xff\xec\x05\ +\x7f\x07s\x02&\x008\x00\x00\x01\x07\x00C\x00X\x01\ +R\x00\x0a\xb4\x01\x17\x17\x05&\x00+\x115\xff\xff\x00\ +\xa4\xff\xec\x05\x7f\x07s\x02&\x008\x00\x00\x01\x07\x00\ +v\x01#\x01R\x00\x0a\xb4\x01\x1f\x1f\x05&\x00+\x11\ +5\xff\xff\x00\xa4\xff\xec\x05\x7f\x07s\x02&\x008\x00\ +\x00\x01\x07\x01K\x00\xcb\x01R\x00\x0a\xb4\x01\x1c\x1c\x05\ +&\x00+\x115\xff\xff\x00\xa4\xff\xec\x05\x7f\x07%\x02\ +&\x008\x00\x00\x01\x07\x00j\x00\xba\x01R\x00\x0c\xb5\ +\x02\x01))\x05&\x00+\x1155\xff\xff\x00\xbc\x00\ +\x00\x04\xc3\x07s\x02&\x00<\x00\x00\x01\x07\x00v\x00\ +T\x01R\x00\x0a\xb4\x01\x12\x12\x05&\x00+\x115\x00\ +\x02\x00V\x00\x00\x04R\x05\xb6\x00\x0c\x00\x15\x00%@\ +\x13\x09\x15JY\x09\x09\x06\x07\x0d\x04JY\x0d\x0d\x06\ +\x07\x03\x06\x12\x00??\x129/+\x11\x12\x009\x18\ +/+10\x01\x14\x00!#\x03#\x013\x0332\ +\x16\x0132654&##\x04R\xfe\xb8\xfe\xc1\ +\x85F\xaa\x015\xaa5\xa0\xd5\xdd\xfd\x10\x87\xd7\xe2\x8c\ +\x91\xa6\x03=\xf8\xfe\xfa\xfe\xc1\x05\xb6\xff\x00\xbe\xfd\xd9\ +\xb6\xb0~n\x00\x00\x01\xff\x00\xfe\x14\x04X\x06\x1f\x00\ +?\x00,@\x186\x15'\x03\x1e\x0c\x0c9FY\x0c\ +\x00\x1e$FY\x1e\x16\x00\x05FY\x00\x1b\x00?+\ +\x00\x18?+\x00\x18?+\x11\x12\x00\x17910\x03\ +\x22'5\x163267\x016632\x16\x15\x14\ +\x06\x06\x07\x06\x15\x14\x17\x1e\x02\x15\x14\x06#\x22'5\ +\x16\x1632654&&'&&5466\ +7>\x0254&#\x22\x06\x07\x01\x06\x06\x85E6\ +=2AT\x17\x01\x18+\xe2\xc2\xa2\xb4*Q\x8an\ +_/l3\xd9\xb8\xaf]3\x87>q\x88\x15.B\ +XE%>]P>\x22iYw\x86\x1c\xfe\xee(\ +\xa2\xfe\x14\x15\x8f\x16_n\x05\x22\xc8\xc6\x8e}9c\ +[iSD8B\x22kqC\xaf\xc7G\xa0)3\ +te(>87En<5VGE8?C\ +%@I}\x80\xfa\xe9\xbd\xae\xff\xff\x00b\xff\xec\x04\ +`\x06!\x02&\x00D\x00\x00\x01\x06\x00C\xb1\x00\x00\ +\x0a\xb4\x02\x22\x22\x11&\x00+\x115\xff\xff\x00b\xff\ +\xec\x04`\x06!\x02&\x00D\x00\x00\x01\x06\x00vD\ +\x00\x00\x0a\xb4\x02**\x11&\x00+\x115\xff\xff\x00\ +b\xff\xec\x04`\x06!\x02&\x00D\x00\x00\x01\x06\x01\ +K\xf7\x00\x00\x0a\xb4\x02''\x11&\x00+\x115\xff\ +\xff\x00b\xff\xec\x04`\x05\xdd\x02&\x00D\x00\x00\x01\ +\x06\x01R\x12\x00\x00\x0a\xb4\x02**\x11&\x00+\x11\ +5\xff\xff\x00b\xff\xec\x04`\x05\xd3\x02&\x00D\x00\ +\x00\x01\x06\x00j\xfd\x00\x00\x0c\xb5\x03\x0244\x11&\ +\x00+\x1155\xff\xff\x00b\xff\xec\x04`\x06\x81\x02\ +&\x00D\x00\x00\x01\x06\x01P\xda\x00\x00\x0c\xb5\x03\x02\ +$$\x11&\x00+\x1155\x00\x03\x00b\xff\xec\x06\ +X\x04\x5c\x00*\x008\x00B\x00B@$\x15\x18\x03\ +\x06\x04\x0a\x11\x02\xf5y=<:?>\x00\x00\x03\x00\ +=\xff\xb4\x04P\x04\x93\x00\x15\x00\x1e\x00'\x000@\ +\x1b\x12\x0f\x07\x04\x06\x09\x22\x1c\x1d!\x11\x14\x08\x0f\x04\ +\x0f\x16FY\x0f\x10\x04$FY\x04\x16\x00?+\x00\ +\x18?+\x11\x12\x00\x179\x18\x10\xc6\x10\xc610\x01\ +\x14\x02\x06#\x22'\x07'7&54\x12632\ +\x177\x17\x07\x16%\x22\x06\x02\x15\x14\x17\x01&\x134\ +'\x01\x16326\x12\x04\x17\x8b\xf4\x9a\x92dbi\ +mD\x93\xf4\x96\x92jhiw>\xfepl\xafd\ +\x11\x02\x066\x8c\x0d\xfd\xfe9eg\xab_\x02\xc1\xbd\ +\xfe\xaa\xbeA}R\x87g\xa2\xc2\x01N\xb0D\x81O\ +\x81ai\x92\xfe\xfe\x97\x5c-\x02\x85/\xfe\xe5T#\ +\xfd\x7f-\x8f\x01\x02\x00\xff\xff\x00q\xff\xec\x04^\x06\ +!\x02&\x00X\x00\x00\x01\x06\x00C\x99\x00\x00\x0a\xb4\ +\x01\x1a\x1a\x11&\x00+\x115\xff\xff\x00q\xff\xec\x04\ +^\x06!\x02&\x00X\x00\x00\x01\x06\x00vh\x00\x00\ +\x0a\xb4\x01\x22\x22\x11&\x00+\x115\xff\xff\x00q\xff\ +\xec\x04^\x06!\x02&\x00X\x00\x00\x01\x06\x01K\x0a\ +\x00\x00\x0a\xb4\x01\x1f\x1f\x11&\x00+\x115\xff\xff\x00\ +q\xff\xec\x04^\x05\xd3\x02&\x00X\x00\x00\x01\x06\x00\ +j\x00\x00\x00\x0c\xb5\x02\x01,,\x11&\x00+\x115\ +5\xff\xff\xff;\xfe\x14\x04\x12\x06!\x02&\x00\x5c\x00\ +\x00\x01\x06\x00v\xe0\x00\x00\x0a\xb4\x01\x22\x22\x11&\x00\ ++\x115\x00\x02\xff\xd5\xfe\x14\x049\x06\x14\x00\x17\x00\ +$\x00'@\x14\x04\x0d\x00\x11\x09\x00\x08\x1b\x11\x18F\ +Y\x11\x10\x00\x1fFY\x00\x16\x00?+\x00\x18?+\ +\x00\x18??\x11\x129910\x05\x22&'#\x06\ +\x07\x03#\x013\x02\x06\x0736632\x16\x15\x14\ +\x02\x06\x13\x22\x06\x02\x15\x14\x16326\x1254\x02\ +!b\x94'\x0a\x08\x11f\xa6\x01\xb0\xa8_(\x13\x09\ +e\xb0_\x8b\x9e\x8a\xf4 `\xc7uoic\xabh\ +\x14fXhH\xfe\x1a\x08\x00\xfeG\xa2D}h\xc3\ +\xb0\xd4\xfe\x9e\xc5\x03\xe3\xbe\xfe\xe0\x97nu\xa2\x01+\ +\xa8\xe3\x00\xff\xff\xff;\xfe\x14\x04\x12\x05\xd3\x02&\x00\ +\x5c\x00\x00\x01\x06\x00j\x86\x00\x00\x0c\xb5\x02\x01,,\ +\x11&\x00+\x1155\xff\xff\xff\x8b\x00\x00\x047\x06\ +\xb8\x02&\x00$\x00\x00\x01\x07\x01M\x00b\x01R\x00\ +\x0a\xb4\x02\x12\x12\x05&\x00+\x115\xff\xff\x00b\xff\ +\xec\x04`\x05f\x02&\x00D\x00\x00\x01\x06\x01M#\ +\x00\x00\x0a\xb4\x02$$\x11&\x00+\x115\xff\xff\xff\ +\x8b\x00\x00\x04N\x077\x02&\x00$\x00\x00\x01\x07\x01\ +N\x003\x01R\x00\x0a\xb4\x02\x12\x12\x05&\x00+\x11\ +5\xff\xff\x00b\xff\xec\x04`\x05\xe5\x02&\x00D\x00\ +\x00\x01\x06\x01N\x02\x00\x00\x0a\xb4\x02$$\x11&\x00\ ++\x115\xff\xff\xff\x8b\xfeH\x04\x10\x05\xb6\x02&\x00\ +$\x00\x00\x00\x07\x01Q\x03-\x00\x00\xff\xff\x00b\xfe\ +H\x04`\x04\x5c\x02&\x00D\x00\x00\x00\x07\x01Q\x02\ +\xa8\x00\x00\xff\xff\x00\x96\xff\xec\x05\x0a\x07s\x02&\x00\ +&\x00\x00\x01\x07\x00v\x019\x01R\x00\x0a\xb4\x01\x22\ +\x22\x05&\x00+\x115\xff\xff\x00b\xff\xec\x04\x00\x06\ +!\x02&\x00F\x00\x00\x01\x06\x00vF\x00\x00\x0a\xb4\ +\x01\x22\x22\x11&\x00+\x115\xff\xff\x00\x96\xff\xec\x05\ +\x0a\x07s\x02&\x00&\x00\x00\x01\x07\x01K\x00\xd5\x01\ +R\x00\x0a\xb4\x01\x1f\x1f\x05&\x00+\x115\xff\xff\x00\ +b\xff\xec\x03\xc4\x06!\x02&\x00F\x00\x00\x01\x06\x01\ +K\xce\x00\x00\x0a\xb4\x01\x1f\x1f\x11&\x00+\x115\xff\ +\xff\x00\x96\xff\xec\x05\x0a\x071\x02&\x00&\x00\x00\x01\ +\x07\x01O\x01\xf2\x01R\x00\x0a\xb4\x01!!\x05&\x00\ ++\x115\xff\xff\x00b\xff\xec\x03\xaa\x05\xdf\x02&\x00\ +F\x00\x00\x01\x07\x01O\x01\x19\x00\x00\x00\x0a\xb4\x01!\ +!\x11&\x00+\x115\xff\xff\x00\x96\xff\xec\x05\x0a\x07\ +s\x02&\x00&\x00\x00\x01\x07\x01L\x00\xa6\x01R\x00\ +\x0a\xb4\x01%%\x05&\x00+\x115\xff\xff\x00b\xff\ +\xec\x03\xf8\x06!\x02&\x00F\x00\x00\x01\x06\x01L\xbf\ +\x00\x00\x0a\xb4\x01%%\x11&\x00+\x115\xff\xff\x00\ +V\x00\x00\x05\x14\x07s\x02&\x00'\x00\x00\x01\x07\x01\ +L\x00^\x01R\x00\x0a\xb4\x02 \x05&\x00+\x11\ +5\xff\xff\x00b\xff\xec\x06\x10\x06\x14\x02&\x00G\x00\ +\x00\x00\x07\x028\x02\xd5\x00\x00\xff\xff\x00H\x00\x00\x05\ +\x14\x05\xb6\x02\x06\x00\x92\x00\x00\x00\x02\x00b\xff\xec\x05\ +/\x06\x14\x00\x1d\x00*\x009@\x1e\x13\x03\x17\x00\x10\ +\x08\x09\x08GY\x0d\x09\x09\x00\x0b\x00\x12\x15\x00%F\ +Y\x00\x10\x17\x1eFY\x17\x16\x00?+\x00\x18?+\ +\x00\x18??\x129/3+\x11\x003\x11\x1299\ +10\x012\x16\x173?\x02!7!73\x073\ +\x07#\x01#7#\x06\x06#\x22&54\x126\x03\ +26\x1254&#\x22\x06\x02\x15\x14\x02{a\x93\ +)\x0a\x0b\x0f\x1b\xfe\x8b\x1b\x01y'\xa6)\x95\x1b\x95\ +\xfe\xfa\x8b\x16\x08e\xb0^\x8b\x9c\x88\xf6\x1f^\xc9t\ +qfg\xa9g\x04bdZW_\x7f\x81\xba\xba\x81\ +\xfb'\xd1}h\xc4\xae\xd5\x01c\xcc\xfc\x15\xc1\x01#\ +\x97pu\xa8\xfe\xd6\xab\xe3\x00\xff\xff\x00V\x00\x00\x04\ +j\x06\xb8\x02&\x00(\x00\x00\x01\x07\x01M\x00Z\x01\ +R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00+\x115\xff\xff\x00\ +b\xff\xec\x03\xd5\x05f\x02&\x00H\x00\x00\x01\x06\x01\ +M\x00\x00\x00\x0a\xb4\x02&&\x11&\x00+\x115\xff\ +\xff\x00V\x00\x00\x04j\x077\x02&\x00(\x00\x00\x01\ +\x07\x01N\x00=\x01R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00\ ++\x115\xff\xff\x00b\xff\xec\x03\xed\x05\xe5\x02&\x00\ +H\x00\x00\x01\x06\x01N\xd2\x00\x00\x0a\xb4\x02&&\x11\ +&\x00+\x115\xff\xff\x00V\x00\x00\x04j\x07\x14\x02\ +&\x00(\x00\x00\x01\x07\x01O\x01\x5c\x015\x00\x0a\xb4\ +\x01\x14\x14\x05&\x00+\x115\xff\xff\x00b\xff\xec\x03\ +\xb4\x05\xdf\x02&\x00H\x00\x00\x01\x07\x01O\x01\x04\x00\ +\x00\x00\x0a\xb4\x02++\x11&\x00+\x115\xff\xff\x00\ +V\xfeH\x04j\x05\xb6\x02&\x00(\x00\x00\x00\x07\x01\ +Q\x02L\x00\x00\xff\xff\x00b\xfeg\x03\xb4\x04\x5c\x02\ +&\x00H\x00\x00\x00\x07\x01Q\x02!\x00\x1f\xff\xff\x00\ +V\x00\x00\x04j\x07s\x02&\x00(\x00\x00\x01\x07\x01\ +L\x00/\x01R\x00\x0a\xb4\x01\x18\x18\x05&\x00+\x11\ +5\xff\xff\x00b\xff\xec\x03\xfb\x06!\x02&\x00H\x00\ +\x00\x01\x06\x01L\xc2\x00\x00\x0a\xb4\x02//\x11&\x00\ ++\x115\xff\xff\x00\x96\xff\xec\x05N\x07s\x02&\x00\ +*\x00\x00\x01\x07\x01K\x00\xcd\x01R\x00\x0a\xb4\x01$\ +$\x05&\x00+\x115\xff\xff\xff\x81\xfe\x14\x04L\x06\ +!\x02&\x00J\x00\x00\x01\x06\x01K\xc2\x00\x00\x0a\xb4\ +\x03JJ\x11&\x00+\x115\xff\xff\x00\x96\xff\xec\x05\ +N\x077\x02&\x00*\x00\x00\x01\x07\x01N\x00\xba\x01\ +R\x00\x0a\xb4\x01!!\x05&\x00+\x115\xff\xff\xff\ +\x81\xfe\x14\x04L\x05\xe5\x02&\x00J\x00\x00\x01\x06\x01\ +N\xb9\x00\x00\x0a\xb4\x03GG\x11&\x00+\x115\xff\ +\xff\x00\x96\xff\xec\x05N\x071\x02&\x00*\x00\x00\x01\ +\x07\x01O\x02\x00\x01R\x00\x0a\xb4\x01&&\x05&\x00\ ++\x115\xff\xff\xff\x81\xfe\x14\x04L\x05\xdf\x02&\x00\ +J\x00\x00\x01\x07\x01O\x01\x1f\x00\x00\x00\x0a\xb4\x03L\ +L\x11&\x00+\x115\xff\xff\x00\x96\xfe;\x05N\x05\ +\xcb\x02&\x00*\x00\x00\x00\x07\x029\x01-\x00\x00\xff\ +\xff\xff\x81\xfe\x14\x04L\x06!\x02&\x00J\x00\x00\x01\ +\x06\x02:u\x00\x00\x0a\xb4\x03HH\x11&\x00+\x11\ +5\xff\xff\x00V\x00\x00\x05s\x07s\x02&\x00+\x00\ +\x00\x01\x07\x01K\x00\xba\x01R\x00\x0a\xb4\x01\x12\x12\x05\ +&\x00+\x115\xff\xff\x00;\x00\x00\x043\x07\xaa\x02\ +&\x00K\x00\x00\x01\x07\x01K\x00=\x01\x89\x00\x0a\xb4\ +\x01$$\x11&\x00+\x115\x00\x02\x00V\x00\x00\x05\ +\xfe\x05\xb6\x00\x13\x00\x17\x004@\x1a\x03\x16\x0b\x0c\x0b\ +JY\x00\x10\x0c\x0c\x09\x0e\x17\x07IY\x17\x17\x09\x12\ +\x0e\x03\x05\x09\x12\x00?3?3\x129/+\x11\x12\ +\x009\x18/33+\x11\x003310\x013\x07\ +#\x03#\x13!\x03#\x13#7373\x07!7\ +3\x017!\x07\x05D\xba\x1d\xbe\xe1\xac\x8f\xfdl\x91\ +\xaa\xe1\xba\x1f\xba5\xaa5\x02\x938\xac\xfe\xcf1\xfd\ +j/\x04\xbc\x8f\xfb\xd3\x02\xb0\xfdP\x04-\x8f\xfa\xfa\ +\xfa\xfd\x92\xe5\xe5\x00\x01\x00;\x00\x00\x04%\x06\x14\x00\ +\x1f\x00/@\x18\x16\x0b\x19\x15\x0d\x0e\x0dGY\x12\x0e\ +\x0e\x19\x10\x00\x00\x0b\x15\x19\x05FY\x19\x0f\x00?+\ +\x00\x18?3?\x129/3+\x11\x003\x11\x129\ +10!\x13654#\x22\x06\x06\x07\x03#\x01#\ +7373\x07!\x07!\x033632\x16\x15\x14\ +\x07\x03\x02\xd9\x91\x13\x94X\xaa\x82!a\xa8\x01\x09\x98\ +\x1d\x95'\xa8)\x01^\x1c\xfe\xa3X\x0b\xa5\xd1\x86\x8d\ +\x17\x8d\x02\xa6Y.\x98x\xe1\x9d\xfe1\x04\xd9\x81\xba\ +\xba\x81\xfe\x91\xe6\x93\x86:l\xfdo\xff\xff\xff\xd9\x00\ +\x00\x03\xa3\x07/\x02&\x00,\x00\x00\x01\x07\x01R\xff\ +t\x01R\x00\x0a\xb4\x01\x15\x15\x05&\x00+\x115\xff\ +\xff\x00;\x00\x00\x03\x1e\x05\xdd\x02&\x00\xf3\x00\x00\x01\ +\x07\x01R\xfe\xef\x00\x00\x00\x0a\xb4\x01\x0d\x0d\x11&\x00\ ++\x115\xff\xff\xff\xd9\x00\x00\x03E\x06\xb8\x02&\x00\ +,\x00\x00\x01\x07\x01M\xffp\x01R\x00\x0a\xb4\x01\x0f\ +\x0f\x05&\x00+\x115\xff\xff\x00;\x00\x00\x02\xbf\x05\ +f\x02&\x00\xf3\x00\x00\x01\x07\x01M\xfe\xea\x00\x00\x00\ +\x0a\xb4\x01\x07\x07\x11&\x00+\x115\xff\xff\xff\xd9\x00\ +\x00\x03`\x077\x02&\x00,\x00\x00\x01\x07\x01N\xff\ +E\x01R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00+\x115\xff\ +\xff\x00;\x00\x00\x02\xd8\x05\xe5\x02&\x00\xf3\x00\x00\x01\ +\x07\x01N\xfe\xbd\x00\x00\x00\x0a\xb4\x01\x07\x07\x11&\x00\ ++\x115\xff\xff\xff\xd9\xfeH\x03\x00\x05\xb6\x02&\x00\ +,\x00\x00\x00\x07\x01Q\x00\xa2\x00\x00\xff\xff\xff\x9a\xfe\ +H\x02\x1f\x05\xdf\x02&\x00L\x00\x00\x00\x06\x01Q+\ +\x00\xff\xff\xff\xd9\x00\x00\x03\x00\x071\x02&\x00,\x00\ +\x00\x01\x07\x01O\x00\x85\x01R\x00\x0a\xb4\x01\x14\x14\x05\ +&\x00+\x115\x00\x01\x00;\x00\x00\x01\xcd\x04H\x00\ +\x03\x00\x0a\xb3\x02\x0f\x01\x15\x00??103#\x13\ +3\xe3\xa8\xea\xa8\x04H\xff\xff\xff\xd9\xfe\x7f\x04\xbe\x05\ +\xb6\x00&\x00,\x00\x00\x00\x07\x00-\x02\x89\x00\x00\xff\ +\xff\x00;\xfe\x14\x04%\x05\xdf\x00&\x00L\x00\x00\x00\ +\x07\x00M\x02\x08\x00\x00\xff\xff\xfe\xc1\xfe\x7f\x03\x1c\x07\ +s\x02&\x00-\x00\x00\x01\x07\x01K\xff&\x01R\x00\ +\x0a\xb4\x01\x13\x13\x05&\x00+\x115\xff\xff\xfe\xfe\xfe\ +\x14\x02\xbc\x06!\x02&\x027\x00\x00\x01\x07\x01K\xfe\ +\xc6\x00\x00\x00\x0a\xb4\x01\x13\x13\x11&\x00+\x115\xff\ +\xff\x00V\xfe;\x05+\x05\xb6\x02&\x00.\x00\x00\x00\ +\x07\x029\x00\x8f\x00\x00\xff\xff\x009\xfe;\x04!\x06\ +\x14\x02&\x00N\x00\x00\x00\x06\x029F\x00\x00\x01\x00\ +9\x00\x00\x04!\x04H\x00\x0f\x00\x15@\x09\x0f\x06\x09\ +\x01\x0a\x0f\x05\x09\x15\x00?3?3\x129910\ +\x01\x013\x01\x01#\x03\x07\x03#\x133\x03\x06\x06\x07\ +\x01J\x02\x0e\xc9\xfe+\x01'\xbb\xeb\x98R\xaa\xe8\xaa\ +>\x06\x0f2\x02/\x02\x19\xfe-\xfd\x8b\x02\x0c{\xfe\ +o\x04H\xfe\xe7\x1f;\xa6\x00\xff\xff\x00V\x00\x00\x03\ +[\x07s\x02&\x00/\x00\x00\x01\x07\x00v\xff\xa1\x01\ +R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00+\x115\xff\xff\x00\ +9\x00\x00\x03<\x07\xac\x02&\x00O\x00\x00\x01\x07\x00\ +v\xff\x82\x01\x8b\x00\x0a\xb4\x01\x0c\x0c\x11&\x00+\x11\ +5\xff\xff\x00V\xfe;\x03V\x05\xb6\x02&\x00/\x00\ +\x00\x00\x07\x029\x00\x9c\x00\x00\xff\xff\xff\x9f\xfe;\x02\ +-\x06\x14\x02&\x00O\x00\x00\x00\x07\x029\xff\x03\x00\ +\x00\xff\xff\x00V\x00\x00\x04$\x05\xb7\x02&\x00/\x00\ +\x00\x00\x07\x028\x00\xe9\xff\xa3\xff\xff\x009\x00\x00\x03\ +z\x06\x14\x02&\x00O\x00\x00\x00\x06\x028?\x00\xff\ +\xff\x00V\x00\x00\x03v\x05\xb6\x02&\x00/\x00\x00\x00\ +\x07\x01O\x01h\xfde\xff\xff\x009\x00\x00\x02\xb8\x06\ +\x14\x00&\x00O\x00\x00\x00\x07\x01O\x00\xaa\xfd\x82\x00\ +\x01\x00\x17\x00\x00\x03V\x05\xb6\x00\x0d\x00%@\x13\x07\ +\x0a\x04\x01\x04\x02\x08\x02\x08\x02\x00\x05\x03\x00\x0bIY\ +\x00\x12\x00?+\x00\x18?\x1299//\x12\x179\ +103\x13\x07'7\x133\x037\x17\x05\x03!\x07\ +Tmo;\xca\xa8\xac\x91\xed<\xfe\xb6b\x025!\ +\x01\xfa@mu\x03\x1a\xfdV\x87j\xbf\xfe0\x9a\x00\ +\x01\x00\x04\x00\x00\x02J\x06\x14\x00\x0b\x00\x1e@\x0f\x09\ +\x00\x03\x06\x04\x07\x01\x07\x01\x07\x05\x0a\x00\x05\x15\x00?\ +?\x1299//\x12\x17910\x017\x17\x07\x03\ +#\x13\x07'7\x133\x01\x98|6\xd5\x98\xa8\x7fw\ +9\xd1\xac\xa8\x03fJh\x7f\xfd7\x02THi\x7f\ +\x03 \x00\xff\xff\x00T\x00\x00\x05\xa8\x07s\x02&\x00\ +1\x00\x00\x01\x07\x00v\x01+\x01R\x00\x0a\xb4\x01\x19\ +\x19\x05&\x00+\x115\xff\xff\x00;\x00\x00\x04+\x06\ +!\x02&\x00Q\x00\x00\x01\x06\x00vq\x00\x00\x0a\xb4\ +\x01##\x11&\x00+\x115\xff\xff\x00T\xfe;\x05\ +\xa8\x05\xb6\x02&\x001\x00\x00\x00\x07\x029\x00\xe1\x00\ +\x00\xff\xff\x00;\xfe;\x04)\x04\x5c\x02&\x00Q\x00\ +\x00\x00\x06\x029V\x00\xff\xff\x00T\x00\x00\x05\xa8\x07\ +s\x02&\x001\x00\x00\x01\x07\x01L\x00\xb6\x01R\x00\ +\x0a\xb4\x01\x1c\x1c\x05&\x00+\x115\xff\xff\x00;\x00\ +\x00\x042\x06!\x02&\x00Q\x00\x00\x01\x06\x01L\xf9\ +\x00\x00\x0a\xb4\x01&&\x11&\x00+\x115\xff\xff\x00\ +]\x00\x00\x04\xb4\x05\xb6\x00'\x00Q\x00\x8b\x00\x00\x00\ +\x06\x02\x07\xe0\x00\x00\x01\x00T\xfe\x81\x05\xa8\x05\xb6\x00\ +\x18\x00\x1d@\x0e\x09\x11\x0e\x15\x0f\x03\x0e\x12\x00\x05I\ +Y\x00\x22\x00?+\x00\x18??3\x129910\ +\x01\x22'7\x163267\x01#\x02\x07\x03#\x01\ +3\x0136\x12\x133\x01\x02\x02\xcdh2\x08@R\ +f\x7f\x17\xfe)\x09' \xac\xa2\x015\xb6\x01\xc7\x06\ +\x141\xb1\xa6\xfe\xcbR\xfe\x81\x19\x93\x14xo\x04\xc7\ +\xfe\xf7\x99\xfc\xdb\x05\xb6\xfbB{\x01\x0e\x035\xfaJ\ +\xfe\x81\x00\x00\x01\x00;\xfe\x14\x04)\x04\x5c\x00\x22\x00\ +%@\x13\x16\x13\x1a\x14\x0f\x13\x15\x1a\x0dFY\x1a\x10\ +\x00\x05FY\x00\x1b\x00?+\x00\x18?+\x00\x18?\ +?\x11\x12910\x01\x22'5\x16327\x136\ +54&#\x22\x06\x06\x07\x03#\x133\x07366\ +32\x16\x15\x14\x07\x03\x06\x06\x02\x19C8@6|\ +*\xb3\x14GNY\xa9\x81!e\xa8\xea\x8b\x16\x0a`\ +\xb3`\x7f\x93\x17\xb2$\x9d\xfe\x14\x15\x8d\x16\xcf\x03E\ +h(?Lx\xde\x9e\xfe%\x04H\xcbze\x8b}\ +Lh\xfc\xbc\xac\x9c\x00\xff\xff\x00\x96\xff\xec\x05\x83\x06\ +\xb8\x02&\x002\x00\x00\x01\x07\x01M\x00\xe7\x01R\x00\ +\x0a\xb4\x02\x1f\x1f\x05&\x00+\x115\xff\xff\x00b\xff\ +\xf0\x04\x1d\x05f\x02&\x00R\x00\x00\x01\x06\x01M\x02\ +\x00\x00\x0a\xb4\x02\x1f\x1f\x11&\x00+\x115\xff\xff\x00\ +\x96\xff\xec\x05\x83\x077\x02&\x002\x00\x00\x01\x07\x01\ +N\x00\xa6\x01R\x00\x0a\xb4\x02\x1f\x1f\x05&\x00+\x11\ +5\xff\xff\x00b\xff\xf0\x04\x1d\x05\xe5\x02&\x00R\x00\ +\x00\x01\x06\x01N\xd2\x00\x00\x0a\xb4\x02\x1f\x1f\x11&\x00\ ++\x115\xff\xff\x00\x96\xff\xec\x05\x9c\x07s\x02&\x00\ +2\x00\x00\x01\x07\x01S\x01'\x01R\x00\x0c\xb5\x03\x02\ +//\x05&\x00+\x1155\xff\xff\x00b\xff\xf0\x04\ +\x8c\x06!\x02&\x00R\x00\x00\x01\x06\x01S\x17\x00\x00\ +\x0c\xb5\x03\x02//\x11&\x00+\x1155\x00\x02\x00\ +\x96\xff\xec\x07)\x05\xcd\x00\x15\x00!\x009@ \x10\ +\x13IY\x10\x10\x01\x0c\x0c\x0fIY\x0c\x03\x0a\x1bI\ +Y\x0a\x04\x03\x16IY\x03\x12\x01\x12\x01\x14IY+\ +\x00\x18??+\x00\x18?+\x00\x18?+\x11\x12\x00\ +9\x18/+10!!\x06# \x00\x11\x10\x12$\ +32\x17!\x07!\x03!\x07!\x03!\x0527\x13\ +&#\x22\x06\x02\x15\x14\x16\x05\xf4\xfd^NP\xff\x00\ +\xfe\xe2\xc0\x01O\xd2\x98U\x02\xc5\x1f\xfd\xcbd\x02\x10\ +\x1f\xfd\xf0s\x025\xfc\xa4E6\xf6Ls\x9d\xf8\x89\ +\xc4\x14\x01+\x01\x0e\x01\x08\x01\xb4\xec\x17\x99\xfe+\x96\ +\xfd\xe6\x15\x13\x04\x89\x16\xca\xfe\x98\xda\xc7\xdf\x00\x03\x00\ +b\xff\xec\x06\xac\x04\x5c\x00!\x00.\x008\x00;@\ +\x1e\x02\x0e\x05\x0c2\x18FY22\x05\x0c/\x22\x0c\ +\x22FY\x11\x0c\x10\x1c)\x05)FY\x00\x05\x16\x00\ +?3+\x11\x003\x18?3+\x11\x003\x11\x129\ +\x18/+\x11\x12\x009910\x05 '\x06\x06#\ +\x22&54\x1263 \x176632\x16\x15\x14\ +\x04!#\x07\x14\x163267\x15\x06\x01\x22\x06\x02\ +\x15\x14\x1632\x12\x114&%\x22\x06\x07326\ +54&\x04\xe3\xfe\xf2VE\xcd{\xb8\xd8\x96\xfc\x9b\ +\x01\x0eYK\xcdw\x8b\x9c\xfe\xb7\xfe\xd0)\x04{\x81\ +K\x8cP\xa2\xfd\x02m\xae`|n\xb1\xcaw\x02\x89\ +}\xbf,\x12\xe7\xf0@\x14\xe1kr\xe4\xc2\xc1\x01N\ +\xb1\xe1mz\x83y\xb7\xcaP\x83\x931#\x96K\x03\ +\xdd\x92\xfe\xfe\x9b\x8d\x92\x01A\x01\x0b|\x86\x04\xbd\xa6\ +zt0E\x00\xff\xff\x00V\x00\x00\x04\x89\x07s\x02\ +&\x005\x00\x00\x01\x07\x00v\x00\x91\x01R\x00\x0a\xb4\ +\x02\x1f\x1f\x05&\x00+\x115\xff\xff\x00;\x00\x00\x03\ +\x9e\x06!\x02&\x00U\x00\x00\x01\x06\x00v\xe4\x00\x00\ +\x0a\xb4\x01\x1c\x1c\x11&\x00+\x115\xff\xff\x00V\xfe\ +;\x04\x89\x05\xb6\x02&\x005\x00\x00\x00\x07\x029\x00\ +\x9e\x00\x00\xff\xff\xff\x99\xfe;\x03h\x04\x5c\x02&\x00\ +U\x00\x00\x00\x07\x029\xfe\xfd\x00\x00\xff\xff\x00V\x00\ +\x00\x04\x89\x07s\x02&\x005\x00\x00\x01\x07\x01L\x00\ +3\x01R\x00\x0a\xb4\x02\x22\x22\x05&\x00+\x115\xff\ +\xff\x00;\x00\x00\x03\xb1\x06!\x02&\x00U\x00\x00\x01\ +\x07\x01L\xffx\x00\x00\x00\x0a\xb4\x01\x1f\x1f\x11&\x00\ ++\x115\xff\xff\x00'\xff\xec\x04'\x07s\x02&\x00\ +6\x00\x00\x01\x07\x00v\x00m\x01R\x00\x0a\xb4\x010\ +0\x05&\x00+\x115\xff\xff\x00\x08\xff\xec\x03\x8c\x06\ +!\x02&\x00V\x00\x00\x01\x06\x00v\xd2\x00\x00\x0a\xb4\ +\x01..\x11&\x00+\x115\xff\xff\x00'\xff\xec\x04\ +#\x07s\x02&\x006\x00\x00\x01\x07\x01K\x00\x00\x01\ +R\x00\x0a\xb4\x01--\x05&\x00+\x115\xff\xff\x00\ +\x08\xff\xec\x03U\x06!\x02&\x00V\x00\x00\x01\x07\x01\ +K\xff_\x00\x00\x00\x0a\xb4\x01++\x11&\x00+\x11\ +5\xff\xff\x00'\xfe\x14\x04#\x05\xcb\x02&\x006\x00\ +\x00\x00\x07\x00z\x01F\x00\x00\xff\xff\x00\x08\xfe\x14\x03\ +D\x04\x5c\x02&\x00V\x00\x00\x00\x07\x00z\x01\x00\x00\ +\x00\xff\xff\x00'\xff\xec\x04#\x07s\x02&\x006\x00\ +\x00\x01\x07\x01L\xff\xd2\x01R\x00\x0a\xb4\x0133\x05\ +&\x00+\x115\xff\xff\x00\x08\xff\xec\x03\x82\x06!\x02\ +&\x00V\x00\x00\x01\x07\x01L\xffI\x00\x00\x00\x0a\xb4\ +\x0111\x11&\x00+\x115\xff\xff\x00\x91\xfe;\x04\ +\xb4\x05\xb6\x02&\x007\x00\x00\x00\x06\x029\xf5\x00\xff\ +\xff\x00;\xfe;\x02\xdb\x05D\x02&\x00W\x00\x00\x00\ +\x06\x029\x9f\x00\xff\xff\x00\xba\x00\x00\x04\xb4\x07s\x02\ +&\x007\x00\x00\x01\x07\x01L\x00\x02\x01R\x00\x0a\xb4\ +\x01\x14\x14\x05&\x00+\x115\xff\xff\x00Z\xff\xec\x03\ +\xc0\x06\x13\x02&\x00W\x00\x00\x00\x07\x028\x00\x85\xff\ +\xff\x00\x01\x00\xaa\x00\x00\x04\xb4\x05\xb6\x00\x0f\x00(@\ +\x14\x03\x07\x08\x07JY\x00\x08\x08\x0c\x05\x12\x0f\x0b\x0c\ +\x0bIY\x0c\x03\x00?+\x11\x003\x18?\x129/\ +3+\x11\x00310\x01!\x07!\x03#\x13!7\ +!\x13!7!\x07!\x02\x93\x01'\x1c\xfe\xd9\x90\xac\ +\x90\xfe\xdf\x1f\x01\x1ck\xfej!\x03\xd9\x1e\xfeh\x03\ +/\x89\xfdZ\x02\xa6\x89\x01\xf0\x97\x97\x00\x01\x00+\xff\ +\xec\x02\xdb\x05D\x00\x22\x00:@\x1d\x13\x14\x16@\x1d\ +\x0d\x0e\x0dGY\x1a\x0e\x0e\x06\x16\x10\x19\x16\x19GY\ +\x16\x0f\x06\x00FY\x06\x16\x00?+\x00\x18?+\x11\ +\x003\x11\x129\x18/3+\x11\x003\x1a\x18\x10\xcd\ +310%27\x15\x06\x06#\x22&5467\ +#737#?\x023\x07!\x07!\x073\x07#\ +\x06\x06\x15\x14\x16\x01\x8b7Y\x22d\x1e}\x85\x0d2\ +\x89\x1b\x897\xac\x0e\xb9}b7\x01\x12\x1a\xfe\xef7\ +\xf4\x1b\xf44\x0d:u\x1a\x81\x0e\x14wv#^\xf0\ +\x81\xfeIN\xe4\xfc\x7f\xfe\x81\xf5J\x228<\x00\xff\ +\xff\x00\xa4\xff\xec\x05\x7f\x07/\x02&\x008\x00\x00\x01\ +\x07\x01R\x00\xdd\x01R\x00\x0a\xb4\x01\x1f\x1f\x05&\x00\ ++\x115\xff\xff\x00q\xff\xec\x04`\x05\xdd\x02&\x00\ +X\x00\x00\x01\x06\x01R1\x00\x00\x0a\xb4\x01\x22\x22\x11\ +&\x00+\x115\xff\xff\x00\xa4\xff\xec\x05\x7f\x06\xb8\x02\ +&\x008\x00\x00\x01\x07\x01M\x00\xdd\x01R\x00\x0a\xb4\ +\x01\x19\x19\x05&\x00+\x115\xff\xff\x00q\xff\xec\x04\ +^\x05f\x02&\x00X\x00\x00\x01\x06\x01M-\x00\x00\ +\x0a\xb4\x01\x1c\x1c\x11&\x00+\x115\xff\xff\x00\xa4\xff\ +\xec\x05\x7f\x077\x02&\x008\x00\x00\x01\x07\x01N\x00\ +\xaa\x01R\x00\x0a\xb4\x01\x19\x19\x05&\x00+\x115\xff\ +\xff\x00q\xff\xec\x04^\x05\xe5\x02&\x00X\x00\x00\x01\ +\x06\x01N\xf5\x00\x00\x0a\xb4\x01\x1c\x1c\x11&\x00+\x11\ +5\xff\xff\x00\xa4\xff\xec\x05\x7f\x07\xd3\x02&\x008\x00\ +\x00\x01\x07\x01P\x00\x8f\x01R\x00\x0c\xb5\x02\x01\x19\x19\ +\x05&\x00+\x1155\xff\xff\x00q\xff\xec\x04^\x06\ +\x81\x02&\x00X\x00\x00\x01\x06\x01P\xda\x00\x00\x0c\xb5\ +\x02\x01\x1c\x1c\x11&\x00+\x1155\xff\xff\x00\xa4\xff\ +\xec\x05\x7f\x07s\x02&\x008\x00\x00\x01\x07\x01S\x01\ +\x0a\x01R\x00\x0c\xb5\x02\x01))\x05&\x00+\x115\ +5\xff\xff\x00q\xff\xec\x04\xb2\x06!\x02&\x00X\x00\ +\x00\x01\x06\x01S=\x00\x00\x0c\xb5\x02\x01,,\x11&\ +\x00+\x1155\xff\xff\x00\xa4\xfeH\x05\x7f\x05\xb6\x02\ +&\x008\x00\x00\x00\x07\x01Q\x02w\x00\x00\xff\xff\x00\ +q\xfeH\x04^\x04H\x02&\x00X\x00\x00\x00\x07\x01\ +Q\x02\xa8\x00\x00\xff\xff\x00\xdf\x00\x00\x07\x81\x07s\x02\ +&\x00:\x00\x00\x01\x07\x01K\x01j\x01R\x00\x0a\xb4\ +\x01$$\x05&\x00+\x115\xff\xff\x00u\x00\x00\x06\ +\x06\x06!\x02&\x00Z\x00\x00\x01\x06\x01K}\x00\x00\ +\x0a\xb4\x01&&\x11&\x00+\x115\xff\xff\x00\xbc\x00\ +\x00\x04\xc3\x07s\x02&\x00<\x00\x00\x01\x07\x01K\xff\ +\xe6\x01R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00+\x115\xff\ +\xff\xff;\xfe\x14\x04\x12\x06!\x02&\x00\x5c\x00\x00\x01\ +\x07\x01K\xffp\x00\x00\x00\x0a\xb4\x01\x1f\x1f\x11&\x00\ ++\x115\xff\xff\x00\xbc\x00\x00\x04\xc3\x07%\x02&\x00\ +<\x00\x00\x01\x07\x00j\xff\xfb\x01R\x00\x0c\xb5\x02\x01\ +\x1c\x1c\x05&\x00+\x1155\xff\xff\xff\xf0\x00\x00\x04\ +\x93\x07s\x02&\x00=\x00\x00\x01\x07\x00v\x00\x93\x01\ +R\x00\x0a\xb4\x01\x13\x13\x05&\x00+\x115\xff\xff\xff\ +\xe3\x00\x00\x03\xb1\x06!\x02&\x00]\x00\x00\x01\x06\x00\ +v\xf7\x00\x00\x0a\xb4\x01\x13\x13\x11&\x00+\x115\xff\ +\xff\xff\xf0\x00\x00\x04\x93\x071\x02&\x00=\x00\x00\x01\ +\x07\x01O\x01T\x01R\x00\x0a\xb4\x01\x12\x12\x05&\x00\ ++\x115\xff\xff\xff\xe3\x00\x00\x03}\x05\xdf\x02&\x00\ +]\x00\x00\x01\x07\x01O\x00\xb0\x00\x00\x00\x0a\xb4\x01\x12\ +\x12\x11&\x00+\x115\xff\xff\xff\xf0\x00\x00\x04\x93\x07\ +s\x02&\x00=\x00\x00\x01\x07\x01L\x00#\x01R\x00\ +\x0a\xb4\x01\x16\x16\x05&\x00+\x115\xff\xff\xff\xe3\x00\ +\x00\x03\xb1\x06!\x02&\x00]\x00\x00\x01\x07\x01L\xff\ +x\x00\x00\x00\x0a\xb4\x01\x16\x16\x11&\x00+\x115\x00\ +\x01\xfe\xfc\xfe\x14\x03d\x06\x1f\x00\x17\x00\x17@\x0c\x0b\ +\x11FY\x0b\x00\x00\x05FY\x00\x1b\x00?+\x00\x18\ +?+10\x03\x22'5\x16327\x01663\ +2\x16\x17\x07&#\x22\x06\x07\x01\x06\x06\x89A:@\ +1\x822\x01\x14(\xa4\xa5)q$+L=X^\ +\x1b\xfe\xe8(\xa4\xfe\x14\x15\x8d\x16\xef\x05#\xc3\xaa\x16\ +\x0f\x81\x1de}\xfa\xcb\xbe\xad\x00\x01\x00\x04\xfe\x14\x04\ +X\x05\xcb\x00\x1f\x00,@\x17\x0f\x15FY\x0b\x19\x08\ +\x1c\x19\x1cGY\x19\x19\x0f\x00@\x00\x05FY\x00\x1b\ +\x00?+\x00\x1a\x18\x10\xcc9/+\x11\x003\x113\ ++10\x13\x22'5\x16327\x13#?\x026\ +632\x16\x17\x07&#\x22\x06\x07\x073\x07#\x03\ +\x06\x06\x7fE6=4\x822\xc9\xbf\x0c\xcd\x1d&\xab\ +\xa2*r +L=X^\x1b!\xee\x19\xed\xcd'\ +\xa1\xfe\x14\x15\x8d\x16\xef\x03\xb9AB\x93\xc3\xaa\x16\x0f\ +\x81\x1dc\x7f\x9b}\xfc7\xbc\xaf\x00\x00\x04\xff\x8d\x00\ +\x00\x04b\x07\xaa\x00\x10\x00\x19\x00%\x00,\x00/@\ +\x18\x1d\x0e\x02\x09&&#)\x06IY\x19\x0e#)\ +)#\x0e\x19\x04\x13\x04\x08\x12\x00?3\xc4\x179/\ +///+\x11\x003\x1299\x11310\x01\x14\ +\x07\x13#\x03!\x03#\x01&54632\x16%\ +673\x15\x06\x06\x07#\x134&#\x22\x06\x15\x14\ +\x16326\x07\x06\x06\x03!\x02'\x03\xcfZ\x9b\xa8\ +7\xfe\x0e\xf7\xbb\x02\xb7-}^dy\xfe\xdbg|\ +\xd5+\xceHw\xba?32A;83?\xa1%\ +U\xb6\x01\x8a3\x0b\x05\x98v?\xfb\x1d\x01\xd3\xfe-\ +\x05\x066Z_us\xbb[\x9d\x12.\xa1-\xfe\xfa\ +6<<66==\xa8O\xa8\xfe\xac\x01\xba\x91\x00\ +\x05\x00b\xff\xec\x04`\x07\xaa\x00\x08\x00\x14\x00 \x00\ +3\x00A\x007@\x1c*$-!\x08\x08\x02\x18\x12\ +\x0c\x1e!&\x0f)\x15!;FY!\x10-4F\ +Y-\x16\x00?+\x00\x18?+\x00\x18??\x10\xc4\ +2\xc42\xc49/\x11\x129910\x01673\ +\x15\x06\x06\x07#\x01\x14\x06#\x22&54632\ +\x16\x074&#\x22\x06\x15\x14\x16326\x072\x16\ +\x17373\x03#7#\x06#\x22&54\x126\ +\x0326\x1254&#\x22\x06\x02\x15\x14\x16\x02\x93\ +vn\xd51\xd6=u\x01\x1bybb{}`b\ +yhB13@:91B\xc7\x5c\x90(\x0bC\ +\x7f\xe9\x85\x1a\x08\xb3\xc6\x8b\x9e\x8e\xfa)a\xc0xp\ +[h\xb3f^\x06\xb2m\x8b\x123\xa3$\xfe\xe5c\ +rpcatsb6==65>>\xf0c\ +]\xac\xfb\xb8\xd1\xe5\xc6\xac\xd0\x01d\xca\xfc\x1b\xb9\x01\ +)\x95gz\xac\xfe\xda\xa3rq\x00\xff\xff\xff\x89\x00\ +\x00\x06\xdd\x07s\x02&\x00\x88\x00\x00\x01\x07\x00v\x02\ +T\x01R\x00\x0a\xb4\x02\x1d\x1d\x05&\x00+\x115\xff\ +\xff\x00b\xff\xec\x06X\x06!\x02&\x00\xa8\x00\x00\x01\ +\x07\x00v\x01\x85\x00\x00\x00\x0a\xb4\x03LL\x11&\x00\ ++\x115\xff\xff\x00w\xff\xac\x05\xb6\x07s\x02&\x00\ +\x9a\x00\x00\x01\x07\x00v\x01\x17\x01R\x00\x0a\xb4\x033\ +3\x05&\x00+\x115\xff\xff\x00=\xff\xb4\x04P\x06\ +!\x02&\x00\xba\x00\x00\x01\x06\x00v9\x00\x00\x0a\xb4\ +\x0311\x11&\x00+\x115\xff\xff\x00'\xfe;\x04\ +#\x05\xcb\x02&\x006\x00\x00\x00\x06\x029\x1b\x00\xff\ +\xff\x00\x08\xfe;\x03D\x04\x5c\x02&\x00V\x00\x00\x00\ +\x06\x029\xc4\x00\x00\x01\x01\x8f\x04\xd9\x03\xf6\x06!\x00\ +\x0e\x00\x0c\xb3\x03\x0b\x06\x01\x00/3\xcd210\x01\ +#&'\x06\x07#56673\x16\x17\x17\x03\xf6\ +g9h\x86lm\x91w\x17\x9e%[*\x04\xd90\ +\x8dwF\x1b\x85\x81'c\x88B\x00\x00\x01\x01\xd3\x04\ +\xd9\x049\x06!\x00\x0f\x00\x0c\xb3\x06\x01\x04\x0c\x00/\ +3\xcd210\x013\x16\x16\x17673\x15\x06\x06\ +\x07#&''\x01\xd3d)O*{{jW\xa7\ + \xa0\x22[+\x06! d9mP\x1bM\xac4\ +_\x8cB\x00\x01\x01\x96\x04\xd9\x03\xd5\x05f\x00\x03\x00\ +\x08\xb1\x00\x03\x00/310\x01!\x07!\x01\xb4\x02\ +!\x1f\xfd\xe0\x05f\x8d\x00\x01\x01\xdb\x04\xd9\x04\x1b\x05\ +\xe5\x00\x0e\x00\x0e\xb4\x08\x00\x80\x0c\x03\x00/3\x1a\xcc\ +210\x01\x06\x06#\x22&5573\x14\x163\ +27\x04\x1b\x22\xa2\x84q\x87\x02bJ\x5c\xa9\x22\x05\ +\xe5\x8a\x82wj\x15\x16;B}\x00\x00\x01\x01D\x05\ +\x02\x02\x0e\x05\xdf\x00\x0a\x00\x08\xb1\x03\x08\x00/\xcd1\ +0\x014632\x15\x14\x06#\x22&\x01D@2\ +XC+&6\x05`5JZ7L1\x00\x02\x02\ +'\x04\xd9\x03\xdd\x06\x81\x00\x0b\x00\x17\x00\x15@\x0b\x0f\ +\x1f\x09/\x09?\x09\x03\x09\x15\x03\x00/3\xcc]2\ +10\x01\x14\x06#\x22&54632\x16\x074\ +&#\x22\x06\x15\x14\x16326\x03\xddxcev\ +|_evh@31B;83@\x05\xb0c\ +tsb^ura5>>56==\x00\x00\ +\x01\xffo\xfeH\x00\xb8\x00\x00\x00\x12\x00\x0a\xb2\x06\x0b\ +\x00\x00/\xcc2103\x0e\x02\x15\x14327\x15\ +\x06#\x22&54667\xb8RD(E')\ +*DS_*P[AJM*F\x09k\x0eS\ +N5YO:\x00\x01\x01P\x04\xd9\x04/\x05\xdd\x00\ +\x15\x00\x12\xb6\x05\x13\x0b\x80\x10\x00\x09\x00/\xc42\x1a\ +\xdd\xc6310\x01\x22.\x02#\x22\x06\x07#\x123\ +2\x1e\x0232673\x02\x03F(KGC \ +,3\x16d:\xad,OG>\x1b,3\x1adB\ +\x04\xdb#+#9:\x01\x02$+$6?\xfe\xfe\ +\x00\x00\x02\x01\x8d\x04\xd9\x04u\x06!\x00\x09\x00\x13\x00\ +\x0c\xb3\x0d\x04\x13\x09\x00/3\xcd210\x0166\ +73\x15\x06\x06\x07#%6673\x15\x06\x06\x07\ +#\x01\x8d,\x8b/\xac3\xc4EV\x01V/\x8b,\ +\xac3\xc4EV\x04\xf4-\xb5K\x15A\xc02\x1b3\ +\xb4F\x15A\xc02\x00\x00\x01\x02o\x04\xd9\x03\xd7\x06\ +u\x00\x09\x00\x08\xb1\x04\x09\x00/\xcd10\x0166\ +73\x15\x06\x06\x07#\x02o.m\x17\xb6\x19\xa0G\ +h\x04\xf6T\xeb@\x1d<\xefT\x00\x00\x03\x01\xc1\x05\ +\x0e\x04\x08\x06\xb4\x00\x08\x00\x13\x00\x1e\x00\x17@\x09\x17\ +\x0c\x08\x0c\x08\x0c\x03\x1c\x11\x00/3\xcc99//\ +\x11310\x01673\x15\x06\x06\x07#\x0746\ +32\x15\x14\x06#\x22&%4632\x15\x14\x06\ +#\x22&\x02\x9aj3\xc32\x9aIK\xd99-N\ +=&#.\x01\x938.N;'#/\x05\x83\xbb\ +v\x14E\xabC\x0b1@P2C,(.CP\ +1D,\xff\xff\xff\x8b\x00\x00\x04\x10\x06\x0c\x02&\x00\ +$\x00\x00\x00\x07\x01T\xfe\x1c\xff\x97\xff\xff\x00\xaa\x02\ +K\x01\xa2\x03Z\x00\x07\x00\x11\x00\x7f\x02h\xff\xff\x00\ +G\x00\x00\x04\xe1\x06\x0c\x00&\x00(w\x00\x00\x07\x01\ +T\xfd\xd8\xff\x97\xff\xff\x00G\x00\x00\x06\x0d\x06\x0c\x00\ +'\x00+\x00\x9a\x00\x00\x00\x07\x01T\xfd\xd8\xff\x97\xff\ +\xff\x00`\x00\x00\x03\xfa\x06\x0c\x00'\x00,\x00\xfa\x00\ +\x00\x00\x07\x01T\xfd\xf1\xff\x97\xff\xff\x00\x5c\xff\xec\x05\ +\xcf\x06\x0c\x00&\x002L\x00\x00\x07\x01T\xfd\xed\xff\ +\x97\xff\xff\x00G\x00\x00\x05\xdc\x06\x0c\x00'\x00<\x01\ +\x19\x00\x00\x00\x07\x01T\xfd\xd8\xff\x97\xff\xff\x00T\x00\ +\x00\x05\xf3\x06\x0c\x00'\x01T\xfd\xff\xff\x97\x00\x06\x01\ +vd\x00\xff\xff\x00h\xff\xec\x02\xd0\x06\xb4\x02&\x01\ +\x86\x00\x00\x01\x07\x01U\xfe\xc8\x00\x00\x00\x0e\xb6\x03\x02\ +\x01..\x11&\x00+\x11555\xff\xff\xff\x8b\x00\ +\x00\x04\x10\x05\xb6\x02\x06\x00$\x00\x00\xff\xff\x00V\x00\ +\x00\x04\xb2\x05\xb6\x02\x06\x00%\x00\x00\x00\x01\x00V\x00\ +\x00\x04j\x05\xb6\x00\x05\x00\x11\xb7\x01\x12\x02\x05IY\ +\x02\x03\x00?+\x00\x18?10!#\x01!\x07!\ +\x01\x02\xac\x015\x02\xdf\x1e\xfd\xcb\x05\xb6\x99\xff\xff\xff\ +\xc9\x00\x00\x03\xf0\x05\xb4\x02\x06\x02(\x00\x00\xff\xff\x00\ +V\x00\x00\x04j\x05\xb6\x02\x06\x00(\x00\x00\xff\xff\xff\ +\xf0\x00\x00\x04\x93\x05\xb6\x02\x06\x00=\x00\x00\xff\xff\x00\ +V\x00\x00\x05s\x05\xb6\x02\x06\x00+\x00\x00\x00\x03\x00\ +\x96\xff\xec\x05\x83\x05\xcd\x00\x03\x00\x11\x00\x1f\x00&@\ +\x14\x03\x02IY\x03\x03\x08\x0f\x0f\x12IY\x0f\x04\x08\ +\x19IY\x08\x13\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01\x07!7%\x10\x02\x04# \x00\ +\x11\x10\x12$32\x00%\x22\x06\x02\x15\x14\x1632\ +6\x1254&\x04!\x1f\xfd\xec\x1e\x03w\xb0\xfe\xb8\ +\xd7\xff\x00\xfe\xe2\xc0\x01O\xd2\xf4\x01\x18\xfd\xe7\x9d\xf8\ +\x89\xc4\xa8\x98\xf1\x8c\xbc\x033\x95\x95X\xfe\xf3\xfeW\ +\xe9\x01+\x01\x0e\x01\x08\x01\xb4\xec\xfe\xcc\x9c\xca\xfe\x98\ +\xda\xc7\xdf\xc3\x01l\xdd\xc7\xdf\xff\xff\xff\xd9\x00\x00\x03\ +\x00\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00V\x00\x00\x05\ ++\x05\xb6\x02\x06\x00.\x00\x00\x00\x01\xff\x8b\x00\x00\x04\ +\x19\x05\xb4\x00\x0a\x00\x0e\xb5\x07\x01\x03\x04\x00\x12\x00?\ +2?310#\x013\x13#\x03&'\x06\x07\x01\ +u\x03!\xb2\xbb\xa8q\x13\x08Hh\xfe\x13\x05\xb4\xfa\ +L\x03\xa6\x9b\xbd\xa7\xbf\xfch\xff\xff\x00T\x00\x00\x06\ +\xb8\x05\xb6\x02\x06\x000\x00\x00\xff\xff\x00T\x00\x00\x05\ +\xa8\x05\xb6\x02\x06\x001\x00\x00\x00\x03\xff\xe5\x00\x00\x04\ +o\x05\xb6\x00\x03\x00\x07\x00\x0b\x00&@\x14\x00\x03I\ +Y\x00\x00\x0a\x04\x04\x07IY\x04\x03\x0a\x0bIY\x0a\ +\x12\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x01!\x07!\x13!\x07!\x01\x07!7\x01\x14\x02\ +\x7f\x1c\xfd\x7fL\x03-!\xfc\xd3\x02`!\xfc\x85\x1f\ +\x03H\x96\x03\x04\x99\xfb{\x98\x98\x00\xff\xff\x00\x96\xff\ +\xec\x05\x83\x05\xcd\x02\x06\x002\x00\x00\x00\x01\x00V\x00\ +\x00\x05y\x05\xb6\x00\x07\x00\x14@\x09\x01\x05\x12\x06\x03\ +IY\x06\x03\x00?+\x00\x18?310!#\x01\ +!\x01#\x01!\x04D\xae\x01\x14\xfdj\xfe\xec\xaa\x01\ +5\x03\xee\x05\x1f\xfa\xe1\x05\xb6\xff\xff\x00V\x00\x00\x04\ +\x87\x05\xb6\x02\x06\x003\x00\x00\x00\x01\xff\xe3\x00\x00\x04\ +\x7f\x05\xb6\x00\x0b\x00(@\x14\x08\x02\x00\x04\x01\x09\x03\ +\x07\x04\x07IY\x04\x03\x00\x09IY\x00\x12\x00?+\ +\x00\x18?+\x11\x003\x113\x11\x129910#\ +7\x01\x017!\x07!\x01\x01!\x07\x1d\x1b\x02\x14\xfe\ +\xf4\x1b\x03^!\xfd\x5c\x01\x0b\xfe\x02\x02\xdd!\x8b\x02\ +i\x029\x89\x99\xfd\xca\xfd\xb1\x98\x00\xff\xff\x00\xba\x00\ +\x00\x04\xb4\x05\xb6\x02\x06\x007\x00\x00\xff\xff\x00\xbc\x00\ +\x00\x04\xc3\x05\xb6\x02\x06\x00<\x00\x00\x00\x03\x00\x96\xff\ +\xec\x05\xb4\x05\xcb\x00\x12\x00\x19\x00!\x000@\x18\x19\ +\x1a\x07\x1aIY\x0a\x07\x07\x00\x08\x11\x01!\x01JY\ +\x13!!\x08\x04\x00\x13\x00??9/3+\x11\x00\ +3\x11\x129\x18/3+\x11\x00310\x057&\ +&5\x10\x00%73\x07\x16\x16\x15\x14\x02\x04\x07\x07\ +\x136\x1254&'#\x22\x06\x06\x15\x14\x16\x17\x02\ +)1\xd9\xeb\x01a\x01M$\xb1%\xd7\xe9\xa9\xfe\xce\ +\xcf1P\xe4\xf9\xa0\x93\xb0\x98\xd8o\xa1\x92\x14\xe1\x0f\ +\xed\xcf\x01\x22\x01S\x0a\xb4\xb4\x0d\xea\xca\xbe\xfe\xd9\x9c\ +\x08\xe1\x01t\x0d\x01\x05\xda\x90\x9f\x06w\xd7\x91\x93\xab\ +\x04\xff\xff\xff\x98\x00\x00\x04\xd1\x05\xb6\x02\x06\x00;\x00\ +\x00\x00\x01\x00\xc7\x00\x00\x06D\x05\xb6\x00\x1f\x00!@\ +\x10\x01\x04\x13\x04JY\x16\x13\x13\x03\x1b\x14\x0b\x03\x03\ +\x12\x00??33\x129/3+\x11\x00310\ +\x01#\x03#\x13#\x22&547\x133\x03\x06\x15\ +\x14\x1633\x133\x033267\x133\x03\x02\x04\ +\x03b'^\xb0^\x0e\xd2\xe4\x18T\xb2X\x18\x8f\x96\ +\x10\xb8\xb0\xb8\x0e\xb9\xdd+f\xb5i5\xfe\xc5\x01\xc1\ +\xfe?\x01\xc1\xd1\xc2]r\x01\x93\xfeZoG\x86\x82\ +\x03d\xfc\x9c\xb6\xcb\x01\xe3\xfe\x0f\xfe\xf7\xfb\x00\x01\xff\ +\xf0\x00\x00\x05\x8f\x05\xcd\x00!\x00&@\x13\x07\x0a\x11\ +\x00IY\x11\x04\x1c\x18\x18\x0a\x09\x0aIY\x1b\x09\x12\ +\x00?3+\x11\x003\x113\x18?+\x11\x0031\ +0\x01\x22\x06\x02\x15\x14\x12\x17\x07!7!&\x114\ +\x12$32\x16\x12\x15\x14\x02\x07!\x07!76\x12\ +54&\x03d\x9c\xed\x81er\x1a\xfd\xd9\x1e\x01\x5c\ +\xc6\xba\x01E\xce\xa9\xf6\x7f\xde\xd4\x01k\x1f\xfd\xa6\x1a\ +\xf7\xf9\xc3\x055\xa7\xfe\xd4\xbe\xaa\xfe\xfbr\x83\x98\xcb\ +\x01K\xe1\x01u\xc9\x8a\xfe\xff\xac\xe6\xfet\x8c\x98\x83\ +\x94\x01\x91\xf4\xc5\xd4\x00\xff\xff\xff\xd9\x00\x00\x03>\x07\ +%\x02&\x00,\x00\x00\x01\x07\x00j\xffU\x01R\x00\ +\x0c\xb5\x02\x01\x1f\x1f\x05&\x00+\x1155\xff\xff\x00\ +\xbc\x00\x00\x04\xc3\x07%\x02&\x00<\x00\x00\x01\x07\x00\ +j\xff\xfb\x01R\x00\x0c\xb5\x02\x01\x1c\x1c\x05&\x00+\ +\x1155\xff\xff\x00b\xff\xec\x04\x89\x06u\x02&\x01\ +~\x00\x00\x01\x06\x01T\x0c\x00\x00\x0a\xb4\x02;;\x11\ +&\x00+\x115\xff\xff\x00?\xff\xec\x03\x9c\x06u\x02\ +&\x01\x82\x00\x00\x01\x06\x01T\xbb\x00\x00\x0a\xb4\x012\ +2\x11&\x00+\x115\xff\xff\x00;\xfe\x14\x04)\x06\ +u\x02&\x01\x84\x00\x00\x01\x06\x01T\x0a\x00\x00\x0a\xb4\ +\x01##\x11&\x00+\x115\xff\xff\x00h\xff\xec\x02\ +\xb1\x06u\x02&\x01\x86\x00\x00\x01\x07\x01T\xfe\xda\x00\ +\x00\x00\x0a\xb4\x01\x1b\x1b\x11&\x00+\x115\xff\xff\x00\ +\x85\xff\xec\x04J\x06\xb4\x02&\x01\x92\x00\x00\x01\x06\x01\ +U\xe8\x00\x00\x0e\xb6\x03\x02\x0100\x11&\x00+\x11\ +555\x00\x02\x00b\xff\xec\x04\x89\x04\x5c\x00#\x00\ +1\x00*@\x15\x1a\x03\x1d\x00\x06\x0f\x00+FY\x00\ +\x10\x10$\x1d$FY\x16\x1d\x16\x00?3+\x11\x00\ +3\x18?+\x00\x18?\x11\x129910\x012\x16\ +\x173673\x06\x02\x07\x03\x06\x15\x14\x16327\ +\x15\x06\x06#\x2255#\x06\x06#\x22&54\x12\ +6\x0326\x1254&#\x22\x06\x02\x15\x14\x16\x02\ +wc\x91&\x0d6.\x87%X\x1aH\x10\x22\x1f\x1c\ +&\x13N\x18\xb2\x09Y\xa9\x5c\x8a\x9f\x8c\xf4!`\xbc\ +up[f\xadf^\x04\x5ca]x2L\xfe\xe8\ +u\xfe\xbeD-#&\x0cy\x0b\x0f\xc1\x0dma\xc5\ +\xad\xd1\x01e\xc8\xfc\x1b\xb8\x01)\x96gz\xa6\xfe\xdd\ +\xacrq\x00\x02\xff\xd3\xfe\x14\x04\x7f\x06\x1f\x00\x15\x00\ ++\x006@\x1c\x0b$%\x14\x11\x05%$FY%\ +%\x11\x05\x00\x1b\x05\x16FY\x05\x00\x11\x1dFY\x11\ +\x16\x00?+\x00\x18?+\x00\x18?\x11\x129/+\ +\x11\x12\x009\x11\x12910\x03\x01>\x0232\x16\ +\x15\x14\x06\x07\x16\x16\x15\x14\x00#\x22&'\x03\x01\x22\ +\x06\x07\x03\x16\x1632665\x10!#732\ +654&-\x01R'|\xc0\x8a\xac\xc1\xb0\xae|\ +\x82\xfe\xf4\xdeV\x95R}\x02\x85w\x93)\xbd5\x96\ +Pf\x9bQ\xfe\xd5D\x1fH\xab\xb5o\xfe\x14\x060\ +\xae\xc5h\xb8\xa2\xa2\xd0(\x1d\xb1\x86\xdf\xfe\xf43?\ +\xfd\xb6\x07\x7f\x96\xbb\xfc\x8b&2Z\x9f_\x01\x1c\x8e\ +\xa7\x9ccv\x00\x00\x01\x00T\xfe\x14\x04\x0c\x04H\x00\ +\x0f\x00\x10\xb6\x08\x01\x0c\x04\x0f\x01\x1b\x00??3\x12\ +910\x01#6\x13\x033\x13\x16\x15367\x01\ +3\x01\x06\x01\x04\xb0*\x8e\xaa\xaaP\x1b\x04JV\x01\ +?\xb2\xfd\xb9\x8b\xfe\x14\xe6\x01\x12\x04<\xfd\xb0\xd3\x92\ +\xb8\xa7\x02V\xfb\xcc\xfd\x00\x02\x00J\xff\xec\x04j\x06\ +\x1f\x00\x1f\x00+\x00#@\x11\x00&&\x1a\x06\x06\x0c\ +FY\x06\x00\x1a FY\x1a\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/310\x01&&546\ +32\x17\x07&&#\x22\x06\x15\x14\x16\x16\x17\x16\x16\ +\x15\x14\x02\x06#\x22&54\x00\x132654&\ +'\x06\x06\x15\x14\x16\x02TaQ\xc7\xa1\xb7\xa9Ck\ +z:ae\x1e>T\x8ds\x84\xf2\x9f\xb8\xdb\x01\x09\ +\x9d\x99\xbfDN\xda\xe8\x81\x03\xb4N\x94Q\x8b\xads\ +y>%ZU,EECr\xd8\x87\x9e\xfe\xfd\x90\ +\xd6\xb1\xd8\x01&\xfd\x06\xea\xbae\x9dC2\xf3\xb0\x81\ +\x93\x00\x01\x00?\xff\xec\x03\x9c\x04Z\x00(\x00-@\ +\x17\x14\x01''\x01FY''\x0d\x1b\x1b!FY\ +\x1b\x10\x0d\x07FY\x0d\x16\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x00910\x01#\x22\x06\ +\x15\x14\x16327\x15\x06\x06#\x22&5467\ +5&&546632\x17\x07&&#\x22\x06\ +\x15\x14\x1633\x02\x8fp\x9b\x9frg\x93\xb9F\xc1\ +_\xa9\xbc\x94\x97JOg\xb6r\xb4\x88>/\x8c;\ +w\x82hZ}\x01\xf0leTVZ\x90&-\x94\ +\x84\x7f\xa1\x1b\x07\x1csN_\x8dKH\x83\x1c\x22`\ +YFM\x00\x01\x00b\xfe^\x043\x06\x14\x00\x1f\x00\ +\x1e@\x0e\x1a\x0d\x17#\x03\x07\x09\x06\x07\x06FY\x07\ +\x00\x00?+\x11\x003\x129\x18?9910\x13\ +4\x00\x01\x06##7!\x07\x07\x00\x00\x15\x14\x16\x17\ +\x16\x16\x15\x14\x06\x07#6654&'&&b\ +\x01P\x01\xa2s\x95\xcd\x1f\x02\x95\x1c\xb2\xfe\xb7\xfe\xf2\ +Xw\x96hN\x5c\xb0nJC{\x9fz\x01\x81\xd4\ +\x01\xdc\x01^\x0c\x91\x85\x9d\xfe\xe1\xfeq\xaaku3\ +>uYG\x88N`p6-?2C\xa8\x00\x00\ +\x01\x00;\xfe\x14\x04)\x04\x5c\x00\x19\x00\x1e@\x0f\x0f\ +\x0c\x13\x0d\x0f\x0c\x15\x00\x1b\x13\x06FY\x13\x10\x00?\ ++\x00\x18???\x11\x12910\x01\x13654\ +&#\x22\x06\x06\x07\x03#\x133\x0736632\ +\x16\x15\x14\x07\x03\x02o\xfe\x14GNY\xa9\x81!e\ +\xa8\xea\x8b\x16\x0a`\xb3`\x7f\x93\x17\xfb\xfe\x14\x04\xa0\ +h(?Lx\xde\x9e\xfe%\x04H\xcbze\x8b}\ +Oe\xfbt\x00\x00\x03\x00b\xff\xec\x041\x06+\x00\ +\x0c\x00\x15\x00\x1d\x00&@\x14\x19\x11FY\x19\x19\x00\ +\x07\x07\x16FY\x07\x01\x00\x0dFY\x00\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x05\x22&\ +5\x10\x12\x003 \x11\x14\x02\x00'2\x12\x13!\x06\ +\x15\x14\x16\x01\x22\x02\x03!65\x10\x01\xac\x9d\xad\xb6\ +\x01\x12\xc2\x01E\xb0\xfe\xea\xaa\x87\xc2J\xfd\xd3!\x5c\ +\x01u\x85\xc1K\x02+\x1a\x14\xcf\xd8\x01\x0c\x02n\x01\ +\x1e\xfeF\xf9\xfd\x9a\xfe\xda\x8f\x01#\x01=\xa9\x8c\x9e\ +\x8d\x05!\xfe\xf8\xfe\xd9\x80\x8a\x01%\x00\x01\x00h\xff\ +\xec\x02\x08\x04H\x00\x11\x00\x11\xb7\x0c\x0f\x06\x00FY\ +\x06\x16\x00?+\x00\x18?10%27\x15\x06\x06\ +#\x22&546\x133\x03\x06\x15\x14\x01}0[\ +\x1fc&y\x7f\x13\x9c\xa7\x9b\x11u\x1a\x81\x0d\x15w\ +v!k\x02\xe3\xfd L0w\x00\xff\xff\x009\x00\ +\x00\x04!\x04H\x02\x06\x00\xfa\x00\x00\x00\x01\xff\x8b\xff\ +\xec\x03\x81\x06!\x00 \x00\x22@\x11\x1c\x16\x09 \x15\ +\x09\x04FY\x09\x01\x16\x10FY\x16\x16\x00?+\x00\ +\x18?+\x00\x18?\x11\x12910\x01'&&#\ +\x22\x07'632\x16\x16\x17\x13\x16327\x15\x06\ +\x06#\x22&'\x03&5\x06\x07\x01#\x01\xfa\x13\x0c\ +HC70\x14?H`w@\x0ew\x0b:\x22\x22\ +\x14A\x1aZS\x0b+\x127B\xfe\x97\xb0\x045\x94\ +m`\x0b\x85\x11<\x7fx\xfb\xe7b\x0c}\x09\x0dc\ +i\x01\x96\x99\xa0\x8ex\xfd\x7f\xff\xff\xff\xd5\xfe\x14\x04\ +j\x04H\x02\x06\x00w\x00\x00\x00\x01\x00b\x00\x00\x03\ +\xfe\x04H\x00\x0c\x00\x10\xb6\x04\x0c\x07\x00\x0f\x0c\x15\x00\ +??2\x11310\x133\x13\x16\x176\x12\x133\ +\x02\x00\x07#b\xa8J\x11\x0a\xb2\xedJ\xa6K\xfe\xe3\ +\xfc\xb1\x04H\xfd\x8d\xa1\xa3\xa2\x01\xc7\x01N\xfe\x93\xfe\ +\x02\xdd\x00\x00\x01\x00R\xfe^\x03\xe9\x06\x14\x000\x00\ +4@\x1a\x05-\x11&\x1b\x01//\x01GY//\ +&\x0e#(!%&&%FY&\x00\x00?+\ +\x11\x12\x0092\x18?\x129/+\x11\x12\x009\x11\ +\x129910\x01#\x22\x06\x06\x15\x14\x16\x17\x16\x15\ +\x14\x06\x07#6654&'&&5467\ +5&&5467\x07\x06##7!\x07#\x22\ +\x06\x06\x15\x14!3\x037P\x8a\xe1~\x5c\x81\xf4I\ +_\xb6mKG\x80\x90\x80\xe3\xcblm\xb6\x94.D\ +Y9\x1e\x02^\x1c\x06\x87\xec\x8b\x01/\x5c\x02\xeeY\ +\xa6r^k3W\xadE\x87S_l91C0\ +7\xa7\x86\xad\xf0,\x06 \x85_t\xba$\x04\x08\x91\ +\x85R\x94_\xd7\xff\xff\x00b\xff\xf0\x04\x1d\x04V\x02\ +\x06\x00R\x00\x00\x00\x01\x00L\xff\xec\x04\xf6\x04H\x00\ +\x1a\x00\x22@\x11\x0e\x15\x15\x0c\x10\x12\x10FY\x12\x0f\ +\x05\x00FY\x05\x16\x00?+\x00\x18?+\x11\x003\ +3\x18?10%27\x15\x06#\x22&547\ +\x13!\x03#\x13#77!\x07#\x03\x06\x15\x14\x16\ +\x03\xb0,(F?[_\x12\x87\xfeu\xcd\xaa\xcd\xdd\ +\x0c\xc5\x03\xd9\x1f\xd1\x8b\x0c!u\x10\x85\x14]Q=\ +R\x02\x8d\xfcJ\x03\xb6BP\x92\xfdc:)\x1d$\ +\x00\x00\x02\xff\xd5\xfe\x14\x04-\x04Z\x00\x10\x00\x1d\x00\ +\x22@\x11\x07\x0e\x04\x0b\x1b\x0e\x11FY\x0e\x10\x04\x17\ +FY\x04\x16\x00?+\x00\x18?+\x00\x18?\x11\x12\ +910\x01\x14\x02\x06#\x22&'\x06\x06\x03#\x13\ +\x12!2\x16%\x22\x06\x07\x03\x16326\x1254\ +&\x04-\x8c\xeb\x95X\x90G\x07\x14\x5c\xa6\xf2_\x01\ +\x84\xbd\xc6\xfesy\x97,Rn\x92k\xa8^u\x02\ +\xaa\xbb\xfe\xac\xaf9E/n\xfeG\x04w\x01\xcf\xdc\ +Q\xa7\xc6\xfe\x83n\x97\x01\x0c\x92\x90\x93\x00\x00\x01\x00\ +b\xfeR\x03\xaa\x04\x5c\x00!\x00\x18@\x0b\x0e\x00\x18\ +\x0b#\x18\x1eFY\x18\x10\x00?+\x00\x18?\x129\ +910\x01\x14\x16\x16\x17\x16\x16\x15\x14\x06\x07#6\ +654&'&&54\x12$32\x17\x07&\ +&#\x22\x06\x02\x01\x0e-]^\x85dM]\xb4^\ +ZDn\x99\x8c\x9a\x01\x01\xa3\x85\x85/*pGn\ +\xb2l\x01\xb6VsN$4yYF\x89TS\x80\ +?4=)9\xd6\x99\xbe\x01H\xb03\x8d\x11\x22\x8c\ +\xfe\xfc\x00\x00\x02\x00b\xff\xf0\x04\xc3\x04H\x00\x10\x00\ +\x1c\x00\x1c@\x0e\x0d\x11\x0a\x11FY\x0a\x0f\x04\x17F\ +Y\x04\x16\x00?+\x00\x18?+\x11\x00310\x01\ +\x14\x02\x06#\x22&5\x10\x00!!\x07!\x1e\x02\x01\ +\x22\x02\x15\x14\x1632\x1254'\x03\xfc\x8a\xe5\x97\ +\xc7\xcd\x01F\x01%\x01\xf6\x1d\xfe\xf6+\x22\x13\xfe\xcb\ +\xd7\xe2|x\xa3\xb1H\x02X\xae\xfe\xdb\x95\xe6\xde\x01\ +5\x01_\x92O]k\x01\x17\xfe\xf9\xf9\x9c\x9f\x01\x12\ +\xf6\xbdv\x00\x01\x00L\xff\xec\x03\x98\x04H\x00\x17\x00\ +\x1c@\x0e\x12\x0d\x0f\x0dFY\x0f\x0f\x06\x00FY\x06\ +\x16\x00?+\x00\x18?+\x11\x00310%27\ +\x15\x06\x06#\x22&547\x13!77!\x07!\ +\x03\x06\x15\x14\x16\x02\x0e5[!e }\x85\x1cq\ +\xfe\xc9\x0c\xc5\x02{\x1f\xfe\xb4u\x18:u\x1a\x81\x0e\ +\x14wvA\x82\x02\x1aBP\x92\xfd\xe0o>::\ +\x00\x00\x01\x00\x85\xff\xec\x04J\x04H\x00\x13\x00\x17@\ +\x0b\x12\x0f\x11\x06\x0f\x00\x0dFY\x00\x16\x00?+\x00\ +\x18?3?10\x05\x22&546\x133\x03\x06\ +\x15\x14\x16326\x12\x113\x10\x01\xfc\xb5\xc2\x15z\ +\xa8n!ud\x83\xb8a\xa8\x14\xbb\xab0\x81\x02E\ +\xfd\xf3\x94Mxm\xd6\x01\xb2\x01K\xfb\xa4\x00\x02\x00\ +b\xfe\x14\x04\xfa\x04Z\x00\x19\x00#\x00(@\x14\x19\ +\x1b\x06\x10\x10\x1cFY\x10\x10 \x0c\x17\x00\x00\x0cF\ +Y\x00\x16\x00?+\x11\x003\x113\x18?+\x11\x00\ +3\x18?10\x05&&54\x127\x17\x06\x02\x15\ +\x10\x17\x136632\x16\x15\x14\x02\x04\x07\x03#\x01\ +4#\x22\x06\x07\x0366\x12\x01\xd5\xaf\xc4\x9e\xb0k\ +\x92\x81\xec\x87'\xad\x8c\x8f\x90\xa0\xfe\xe3\xc4b\xa6\x02\ +\xe1\x81GP\x1b\x85\x85\xc4o\x12\x14\xe3\xb9\xc6\x01F\ +\xa6d\x8c\xfe\xf2\xa2\xfe\xe5\x1e\x02\x83\xb8\xa8\xc0\xac\xe1\ +\xfe\xa6\xbd\x0d\xfe+\x04\xd3\xe6h\x82\xfd\x94\x0d\x9c\x01\ +\x1c\x00\x01\xff\x1b\xfe\x14\x04L\x04J\x00\x1f\x00'@\ +\x14\x14\x04\x10\x00\x05\x0f\x16\x1b\x00\x1bFY\x00\x0f\x10\ +\x0bFY\x10\x1b\x00?+\x00\x18?+\x00\x18??\ +\x11\x129910\x132\x16\x17\x13\x013\x01\x13\x16\ +\x16327\x15\x06#\x22&'\x03\x01#\x01\x03&\ +&#\x22\x07'6\xf6em\x11)\x01\x9a\xb0\xfd\xdb\ +C\x0e9;&)B?fr\x13/\xfe9\xbe\x02\ +`<\x095.\x113\x1eF\x04Jt\x88\xfe\xa0\x02\ +Z\xfc\xe9\xfe\x0e]F\x0c}\x17~\x99\x01s\xfdv\ +\x03@\x01\xe1O?\x0f{\x1b\x00\x01\x00\x8f\xfe\x14\x05\ +f\x06\x12\x00\x1b\x00 @\x10\x1b\x00\x05\x13\x0f\x0c\x1b\ +\x01\x1a\x0d\x1aFY\x0a\x0d\x16\x00?3+\x11\x003\ +\x18??3?10\x01\x0166\x12\x113\x10\x02\ +\x04\x07\x03#\x13&&547\x133\x03\x06\x15\x14\ +\x16\x17\x01\x04\x02\xfe\xd1\xa9\xd9e\xac\x93\xfe\xcf\xeed\ +\xa6f\xba\xc7\x1bj\xa8j\x19zz\x01/\x06\x12\xfa\ +m\x11\xd1\x01\x92\x01U\xfey\xfe+\xec\x0e\xfe\x22\x01\ +\xde\x11\xc5\xaf\x5cy\x01\xfc\xfe\x00uH\x81\x83\x0c\x05\ +\x97\x00\x01\x00b\xff\xec\x05w\x04H\x00'\x00$@\ +\x11%\x06\x0e\x0e\x00\x1b\x06\x0f\x15\x0b\x00\x0bFY\x22\ +\x00\x16\x00?2+\x11\x003\x18?3\x129/\x11\ +910\x05\x22&54\x1273\x00\x11\x1432\ +\x13\x133\x03\x06\x15\x14\x16326\x1254'3\ +\x16\x15\x14\x02\x06#\x22&'\x06\x06\x01y\x84\x93\x88\ +~\xb1\xfe\xf5\x92\x9f:A\xa6=\x11C\xad\xb3\x91\x93\xab\xd9\xfe}\xc2aOX\ +X\xff\xff\x00h\xff\xec\x02\xab\x05\xd3\x02&\x01\x86\x00\ +\x00\x01\x07\x00j\xfe\xc2\x00\x00\x00\x0c\xb5\x02\x01%%\ +\x11&\x00+\x1155\xff\xff\x00\x85\xff\xec\x04J\x05\ +\xd3\x02&\x01\x92\x00\x00\x01\x06\x00j\xf9\x00\x00\x0c\xb5\ +\x02\x01''\x11&\x00+\x1155\xff\xff\x00b\xff\ +\xf0\x04\x1d\x06u\x02&\x00R\x00\x00\x01\x06\x01T\x02\ +\x00\x00\x0a\xb4\x02%%\x11&\x00+\x115\xff\xff\x00\ +\x85\xff\xec\x04J\x06u\x02&\x01\x92\x00\x00\x01\x06\x01\ +T\xf3\x00\x00\x0a\xb4\x01\x1d\x1d\x11&\x00+\x115\xff\ +\xff\x00b\xff\xec\x05w\x06u\x02&\x01\x96\x00\x00\x01\ +\x07\x01T\x00\xae\x00\x00\x00\x0a\xb4\x0111\x11&\x00\ ++\x115\xff\xff\x00V\x00\x00\x04j\x07%\x02&\x00\ +(\x00\x00\x01\x07\x00j\x00B\x01R\x00\x0c\xb5\x02\x01\ +\x1f\x1f\x05&\x00+\x1155\x00\x01\x00\xba\xff\xec\x04\ +\xc3\x05\xb6\x00\x1f\x00+@\x17\x17\x0eIY\x17\x17\x13\ +\x10\x12\x16\x12\x13\x12IY\x13\x03\x00\x05IY\x00\x13\ +\x00?+\x00\x18?+\x11\x003\x18?\x129/+\ +10\x05\x22'5\x163267654&#\ +!\x03#\x01!7!\x07!\x03! \x11\x14\x07\x07\ +\x06\x06\x03%FCY\xc3\xd79\x95\x1f\x1c\ +\x01%\x01\x08\x01\x05\x01\xc1\xecP\x8dE\x00\xff\xff\x00\ +'\xff\xec\x04#\x05\xcb\x02\x06\x006\x00\x00\xff\xff\xff\ +\xd9\x00\x00\x03\x00\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\xff\ +\xd9\x00\x00\x03>\x07%\x02&\x00,\x00\x00\x01\x07\x00\ +j\xffU\x01R\x00\x0c\xb5\x02\x01\x1f\x1f\x05&\x00+\ +\x1155\xff\xff\xfe\xc1\xfe\x7f\x025\x05\xb6\x02\x06\x00\ +-\x00\x00\x00\x02\xff\xbe\xff\xe9\x06\xa4\x05\xb6\x00\x19\x00\ +!\x000@\x1a\x11 IY\x11\x11\x18\x0f\x0f\x00I\ +Y\x0f\x03\x18!JY\x18\x12\x05\x0aIY\x05\x13\x00\ +?+\x00\x18?+\x00\x18?+\x11\x12\x009\x18/\ ++10\x01\x0a\x02\x06#\x22'5\x163266\ +\x12\x13!\x033 \x11\x14\x04!!\x01\x13 \x114\ +&##\x03\x02\xe5K\xb0\x81\xae\x80L143S\ +i^\x91\x98\x02\x9a\x83m\x01\xb8\xfe\xd6\xfe\xec\xfe\xbd\ +\x01\x14J\x01s\x7f\x87\x8et\x05\x1d\xfe\xdc\xfd\x9b\xfe\ +\xd6\x81\x17\x96\x15X\xd0\x01\xd8\x025\xfd\x90\xfe\x9b\xe7\ +\xfa\x05\x1d\xfbt\x01@sn\xfd\xdf\x00\x02\x00V\x00\ +\x00\x06\xbe\x05\xb6\x00\x11\x00\x19\x00)@\x15\x18\x0b\x10\ +\x0bIY\x02\x10\x10\x09\x00\x0e\x03\x0d\x12\x09\x19JY\ +\x09\x12\x00?+\x00\x18??3\x129/3+\x11\ +\x00310\x013\x033 \x11\x14\x04!!\x13!\ +\x03#\x013\x03!\x13 \x114&##\x03\x04s\ +\xaa\x85n\x01\xb8\xfe\xd8\xfe\xeb\xfe\xbc\x90\xfd\xc4\x91\xaa\ +\x015\xaa\x83\x02<\xae\x01r{\x8b\x8du\x05\xb6\xfd\ +\x92\xfe\x99\xe6\xfb\x02\xb0\xfdP\x05\xb6\xfd\x92\xfdI\x01\ +@po\xfd\xe1\x00\x01\x00\xba\x00\x00\x04\xc3\x05\xb6\x00\ +\x17\x00#@\x12\x0d\x04IY\x0d\x0d\x09\x15\x06\x12\x0c\ +\x08\x09\x08IY\x09\x03\x00?+\x11\x003\x18?3\ +\x129/+10\x014&#!\x03#\x01!7\ +!\x07!\x03!2\x16\x15\x14\x06\x03#\x136\x04\x19\ +il\xfe\xe9\x9c\xac\x01\x17\xfe\xbe!\x03\x85\x1e\xfef\ +Z\x01\x10\xb8\xad\x13Z\xacZ\x15\x02;ZP\xfd\x1b\ +\x05\x1f\x97\x97\xfe^\x9c\x9b'q\xfeR\x01\xa0]\xff\ +\xff\x00V\x00\x00\x051\x07s\x02&\x01\xb4\x00\x00\x01\ +\x07\x00v\x00\xc3\x01R\x00\x0a\xb4\x01\x14\x14\x05&\x00\ ++\x115\xff\xff\xff\xfc\xff\xec\x05P\x07b\x02&\x01\ +\xbd\x00\x00\x01\x07\x026\x00q\x01R\x00\x0a\xb4\x01\x18\ +\x18\x05&\x00+\x115\x00\x01\x00V\xfe\x83\x05y\x05\ +\xb6\x00\x0b\x00\x19@\x0c\x04\x00\x03\x09\x22\x0b\x02IY\ +\x07\x0b\x12\x00?3+\x00\x18??310\x013\ +\x01!\x013\x01!\x03#\x13!\x01\x8b\xac\xfe\xec\x02\ +\x95\x01\x15\xac\xfe\xcb\xfeZP\xa2R\xfeX\x05\xb6\xfa\ +\xe2\x05\x1e\xfaJ\xfe\x83\x01}\xff\xff\xff\x8b\x00\x00\x04\ +\x10\x05\xb6\x02\x06\x00$\x00\x00\x00\x02\x00Z\x00\x00\x04\ +j\x05\xb6\x00\x0b\x00\x13\x00&@\x14\x0b\x12IY\x0b\ +\x0b\x06\x07\x07\x0aIY\x07\x03\x06\x13JY\x06\x12\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ + \x11\x14\x04!!\x01!\x07!\x03\x13 \x114&\ +##\x03\x02N\x01\xb8\xfe\xd8\xfe\xeb\xfe\x91\x015\x02\ +\xdb \xfd\xd1e-\x01s}\x89\xb8u\x03F\xfe\x9b\ +\xe6\xfb\x05\xb6\x99\xfe)\xfdK\x01@ro\xfd\xdf\xff\ +\xff\x00V\x00\x00\x04\xb2\x05\xb6\x02\x06\x00%\x00\x00\xff\ +\xff\x00V\x00\x00\x04j\x05\xb6\x02\x06\x01a\x00\x00\x00\ +\x02\xffV\xfe\x85\x04\xee\x05\xb6\x00\x0e\x00\x14\x00$@\ +\x12\x00\x04\x22\x0a\x10IY\x0a\x03\x0c\x13\x05\x02\x05I\ +Y\x02\x12\x00?+\x11\x0033\x18?+\x00\x18?\ +310\x01\x13!\x03#\x1336\x00\x127!\x01\ +3\x03\x11#\x06\x00\x07!\x03\x7fP\xfcuP\x9eq\ +f\x8b\x01\x0f\xbc'\x02D\xfe\xeb\xbar\xfaM\xfe\xa7\ +\x93\x02=\xfe\x85\x01{\xfe\x85\x02\x15\xc0\x01\xf5\x01\xc5\ +\xa2\xfa\xe4\xfd\xeb\x06\x96\xf9\xfdE\xcd\xff\xff\x00V\x00\ +\x00\x04j\x05\xb6\x02\x06\x00(\x00\x00\x00\x01\xff\x9c\x00\ +\x00\x06\xf0\x05\xb6\x00\x11\x00\x1e@\x10\x00\x03\x0f\x06\x0c\ +\x09\x06\x11\x07\x04\x01\x03\x0e\x0b\x11\x12\x00?33?\ +33\x12\x17910\x01\x013\x01\x133\x03\x013\ +\x01\x01#\x01\x03#\x13\x01#\x02H\xfe\x93\xbb\x01h\ +\x93\xa6\x93\x02}\xcf\xfd^\x01w\xbf\xfe\x96\x9a\xa6\x9a\ +\xfdw\xd1\x03\x00\x02\xb6\xfdF\x02\xba\xfdF\x02\xba\xfd\ +!\xfd)\x02\xdb\xfd%\x02\xdb\xfd%\x00\x01\xff\xfa\xff\ +\xec\x04'\x05\xcb\x00'\x00-@\x17\x03\x17\x18\x18\x17\ +JY\x18\x18\x0b%%\x1fJY%\x04\x0b\x11JY\ +\x0b\x13\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x00910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x06\ +\x04#\x22'5\x16\x1632654!#73\ +2654&#\x22\x07'6632\x16\x04'\ +\xc9\xac\x81\x9a\x8f\xfe\xf7\xb4\xe1\xa6N\xd7p\xb9\xcf\xfe\ +\xbe\xd7\x1d\xc8\xbb\xd9}i\xa8\xb8Hq\xd7\x81\xac\xc9\ +\x04\x87\x9a\xd6#\x06\x13\xa6\x89\x82\xcepO\xa6-;\ +\xab\x90\xf8\x8d\xa6\x92jbv{J?\xad\x00\x01\x00\ +V\x00\x00\x05\x9e\x05\xb6\x00\x0e\x00\x15@\x09\x03\x0c\x0e\ +\x05\x00\x03\x08\x0e\x12\x00?3?2\x119910\ +\x013\x03\x033\x013\x01#\x13\x127#\x01#\x01\ +\x8b\xa4\xaeZ\x04\x03\xac\xc7\xfe\xca\xa1\xae<\x22\x04\xfc\ +N\xc7\x05\xb6\xfc\xcf\xfeu\x04\xbc\xfaJ\x039\x01!\ +y\xfb-\xff\xff\x00V\x00\x00\x05\x9e\x07b\x02&\x01\ +\xb2\x00\x00\x01\x07\x026\x00\xf2\x01R\x00\x0a\xb4\x01\x11\ +\x11\x05&\x00+\x115\x00\x01\x00V\x00\x00\x051\x05\ +\xb6\x00\x0a\x00\x17@\x0b\x07\x02\x0a\x03\x04\x08\x05\x03\x01\ +\x04\x12\x00?3?3\x12\x17910!#\x01\x03\ +#\x013\x03\x013\x01\x04)\xc5\xfe4\x98\xaa\x015\ +\xaa\x97\x02\xc0\xd3\xfd\x1f\x02\xd5\xfd+\x05\xb6\xfd8\x02\ +\xc8\xfd%\x00\x01\xff\xbe\xff\xe9\x051\x05\xb6\x00\x13\x00\ +\x1c@\x0e\x12\x12\x0f\x00IY\x0f\x03\x05\x0aIY\x05\ +\x13\x00?+\x00\x18?+\x00\x18?10\x01\x0a\x02\ +\x06#\x22'5\x163266\x12\x13!\x01#\x01\ +\x02\xe5K\xb0\x81\xae\x80L143Si^\x91\x98\ +\x02\xc9\xfe\xc9\xac\x01\x16\x05\x1d\xfe\xdc\xfd\x9b\xfe\xd6\x81\ +\x17\x96\x15X\xd0\x01\xd8\x025\xfaJ\x05\x1d\xff\xff\x00\ +T\x00\x00\x06\xb8\x05\xb6\x02\x06\x000\x00\x00\xff\xff\x00\ +V\x00\x00\x05s\x05\xb6\x02\x06\x00+\x00\x00\xff\xff\x00\ +\x96\xff\xec\x05\x83\x05\xcd\x02\x06\x002\x00\x00\xff\xff\x00\ +V\x00\x00\x05y\x05\xb6\x02\x06\x01n\x00\x00\xff\xff\x00\ +V\x00\x00\x04\x87\x05\xb6\x02\x06\x003\x00\x00\xff\xff\x00\ +\x96\xff\xec\x05\x0a\x05\xcb\x02\x06\x00&\x00\x00\xff\xff\x00\ +\xba\x00\x00\x04\xb4\x05\xb6\x02\x06\x007\x00\x00\x00\x01\xff\ +\xfc\xff\xec\x05P\x05\xb6\x00\x15\x00\x18@\x0b\x0e\x00\x11\ +\x0a\x03\x00\x06IY\x00\x13\x00?+\x00\x18?3\x12\ +910\x17\x22&'5\x163267\x013\x13\ +\x16\x1767\x013\x01\x06\x06\xa2'`\x1f[Ij\ +\xa0b\xfe\xcb\xac\xb21\x15=@\x01\x95\xc3\xfdV|\ +\xeb\x14\x10\x0c\xa8'{\xa0\x04\x12\xfd}\xb6k\x88n\ +\x02\xae\xfb\xb0\xcb\xaf\x00\xff\xff\x00\x96\xff\xec\x05\xb4\x05\ +\xcb\x02\x06\x01s\x00\x00\xff\xff\xff\x98\x00\x00\x04\xd1\x05\ +\xb6\x02\x06\x00;\x00\x00\x00\x01\x00T\xfe\x85\x05X\x05\ +\xb6\x00\x0b\x00\x1b@\x0d\x09\x05\x03\x02\x22\x0b\x07\x04\x07\ +IY\x04\x12\x00?+\x11\x003\x18??310\ +%\x03#\x13!\x013\x01!\x013\x01\x04\xe9r\xa2\ +P\xfc/\x015\xac\xfe\xec\x02w\x01\x14\xac\xfe\xec\x9c\ +\xfd\xe9\x01{\x05\xb6\xfa\xe4\x05\x1c\xfa\xe6\x00\x00\x01\x00\ +\xfa\x00\x00\x05'\x05\xb6\x00\x16\x00\x1d@\x0e\x01\x03\x09\ +\x10\x03IY\x10\x10\x14\x09\x03\x00\x12\x00??39\ +/+\x11\x12\x00910!\x13\x06#\x22&54\ +7\x133\x03\x06\x15\x14\x163267\x133\x01\x03\ +F\x7f\xc7\xc9\x9c\x9f\x16m\xaak\x14RdK\xb5\x87\ +\x96\xac\xfe\xcb\x02XX\x8f\x85J^\x01\xfa\xfe\x08d\ +%NO!.\x02\xcf\xfaJ\x00\x01\x00T\x00\x00\x07\ +\xae\x05\xb6\x00\x0b\x00\x1a@\x0c\x09\x05\x01\x03\x07\x03\x00\ +\x03IY\x00\x12\x00?+\x11\x003\x18?331\ +03\x013\x01!\x013\x01!\x013\x01T\x015\ +\xac\xfe\xea\x02\x14\x01\x15\xaa\xfe\xeb\x02\x13\x01\x14\xaa\xfe\ +\xcb\x05\xb6\xfa\xe4\x05\x1c\xfa\xe4\x05\x1c\xfaJ\x00\x01\x00\ +T\xfe\x85\x07\xae\x05\xb6\x00\x0f\x00\x1f@\x0f\x0d\x09\x05\ +\x03\x02\x22\x0b\x0f\x07\x04\x07IY\x04\x12\x00?+\x11\ +\x0033\x18??3310%\x03#\x13!\x01\ +3\x01!\x013\x01!\x013\x01\x07?r\xa2P\xf9\ +\xd9\x015\xac\xfe\xea\x02\x14\x01\x15\xaa\xfe\xeb\x02\x13\x01\ +\x14\xaa\xfe\xec\x9c\xfd\xe9\x01{\x05\xb6\xfa\xe4\x05\x1c\xfa\ +\xe4\x05\x1c\xfa\xe6\x00\x02\x00\xba\x00\x00\x04\x87\x05\xb6\x00\ +\x0b\x00\x13\x00&@\x14\x0b\x12IY\x0b\x0b\x06\x09\x09\ +\x08IY\x09\x03\x06\x13JY\x06\x12\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+10\x01 \x11\x14\x04\ +!!\x01!7!\x03\x13 \x114&##\x03\x02\ +\xcf\x01\xb8\xfe\xd8\xfe\xeb\xfe\x9d\x01\x15\xfe\xbe!\x01\xee\ +\x85 \x01s}\x89\xacu\x03F\xfe\x9b\xe6\xfb\x05\x1f\ +\x97\xfd\x90\xfdK\x01@ro\xfd\xdf\x00\x03\x00V\x00\ +\x00\x06T\x05\xb6\x00\x03\x00\x0d\x00\x15\x00\x22@\x12\x05\ +\x14IY\x05\x05\x0c\x02\x0d\x03\x01\x12\x0c\x15JY\x0c\ +\x12\x00?+\x00\x18??3\x129/+10!\ +#\x013!\x033 \x11\x14\x04!!\x01\x13 \x11\ +4&##\x03\x05\x1f\xaa\x015\xaa\xfb\xe3\x85\x8b\x01\ +\xb9\xfe\xd6\xfe\xec\xfe\x9e\x015H\x01s\x7f\x88\xact\ +\x05\xb6\xfd\x90\xfe\x9b\xe7\xfa\x05\xb6\xfa\xdb\x01@sn\ +\xfd\xdf\x00\x00\x02\x00V\x00\x00\x03\xf6\x05\xb6\x00\x09\x00\ +\x11\x00\x1d@\x0f\x01\x10IY\x01\x01\x08\x09\x03\x08\x11\ +JY\x08\x12\x00?+\x00\x18?\x129/+10\ +\x01\x033 \x11\x14\x04!!\x01\x13 \x114&#\ +#\x03\x027\x85\x8b\x01\xb9\xfe\xd6\xfe\xec\xfe\x9e\x015\ +H\x01s\x7f\x88\xact\x05\xb6\xfd\x90\xfe\x9b\xe7\xfa\x05\ +\xb6\xfa\xdb\x01@sn\xfd\xdf\x00\x01\x00\x12\xff\xec\x04\ +o\x05\xcb\x00\x1e\x00&@\x14\x05\x04IY\x05\x05\x17\ +\x10\x10\x0aIY\x10\x04\x17\x00IY\x17\x13\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10%2\x00\ +\x13!7!74&#\x22\x06\x07'632\x00\ +\x11\x10\x02\x04#\x22&'5\x1e\x02\x01w\xe3\x01\x1d\ +-\xfd\x91\x1d\x02d\x02\xb9\xa5?\x82\x80+\xc7\xb5\xf6\ +\x01\x0f\xbb\xfe\xa8\xf4d\xa3Oj\x5cc\x83\x01\x1d\x01\ +\x14\x98\x5c\xba\xd1\x16)\x8fH\xfe\xe0\xfe\xfd\xfe\xd5\xfe\ +L\xdd%*\xa60\x1d\x11\x00\x00\x02\x00V\xff\xec\x07\ +\x96\x05\xcd\x00\x15\x00#\x00*@\x17\x0f\x0aIY\x0f\ +\x0f\x0c\x0d\x03\x0c\x12\x13\x16IY\x13\x04\x04\x1dIY\ +\x04\x13\x00?+\x00\x18?+\x00\x18??\x129/\ ++10\x01\x10\x02\x04#\x22\x00\x1147!\x03#\ +\x013\x03!\x12\x00!2\x00%\x22\x06\x02\x15\x14\x16\ +326\x1254&\x07\x96\xaa\xfe\xc3\xd2\xfc\xfe\xf0\ +\x06\xfe\xba\x91\xaa\x015\xaa\x83\x01>B\x01t\x01\x00\ +\xe7\x01\x09\xfd\xf7\x96\xee\x82\xb5\xa7\x93\xe4\x85\xb1\x03\x8b\ +\xfe\xf3\xfeX\xea\x01+\x01\x0eDG\xfdP\x05\xb6\xfd\ +\x92\x01(\x01]\xfe\xcf\x99\xca\xfe\x9a\xdc\xc9\xdd\xbe\x01\ +o\xdf\xc9\xdd\x00\x00\x02\xff\xb4\x00\x00\x04\x98\x05\xb6\x00\ +\x0c\x00\x15\x00&@\x13\x03\x00\x14\x14\x00JY\x14\x14\ +\x08\x0b\x02\x12\x08\x0eJY\x08\x03\x00?+\x00\x18?\ +3\x129/+\x11\x12\x00910\x01\x01#\x01&\ +54$!!\x01#\x13\x13#\x22\x06\x15\x14\x163\ +3\x02R\xfe1\xcf\x02\x02\xc0\x01\x1f\x01\x06\x01}\xfe\ +\xcc\xac\x81\x98\xb6\xbc\xb9\x95\x8a\x95\x02b\xfd\x9e\x02\x9e\ +e\xe0\xe0\xf3\xfaJ\x02b\x02\xc1\x9b\x94|\x84\x00\xff\ +\xff\x00b\xff\xec\x04`\x04\x5c\x02\x06\x00D\x00\x00\x00\ +\x02\x00d\xff\xec\x04\x9a\x06\x1b\x00\x1a\x00(\x00$@\ +\x12\x0d\x18\x11\x11\x22FY\x11\x11\x18\x07\x00\x18\x1bF\ +Y\x18\x16\x00?+\x00\x18?\x129/+\x11\x12\x00\ +910\x134\x12\x1276$7\x17\x07\x04\x07\x04\ +\x03\x176632\x16\x15\x14\x02\x06#\x22&\x052\ +6654&#\x22\x06\x07\x06\x15\x10d\x90\xe9\x94\ +J\x01pZ\x15j\xfe\xf6v\xfe\xfeo\x05J\xc1g\ +\x9b\x9b\x81\xe7\x9b\xbc\xc9\x01\x94`\x91VXX\x5c\xc5\ +I\x17\x01\xb8\xdf\x01\xd8\x01\x1a+\x17B\x0e\x8a\x11,\ +%U\xfeh\x03Xc\xc3\xae\xc9\xfe\xca\x9e\xe9^\x7f\ +\xf6\x89\x82v{gsf\xfe\xc5\x00\x00\x03\x00b\xff\ +\xec\x04\x12\x04Z\x00\x13\x00\x1d\x00'\x00-@\x17\x05\ +\x14!!\x14FY!!\x0d\x00\x00\x1eFY\x00\x10\ +\x0d\x17FY\x0d\x16\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x00910\x012\x16\x15\x14\x05\ +\x15\x16\x16\x15\x14\x06\x06#\x22&54\x12$\x03\x15\ +\x10!2654&#\x13\x22\x06\x073265\ +4&\x02\xa4\xaf\xbf\xfe\xe8nah\xc9\x8a\xd1\xdb\x8f\ +\x01\x08\xeb\x01\x0f|\x90\x82\x8c\x8d\x98\xc9&\xe1\xb0\xb8\ +f\x04Z\x8a\x8a\xdd@\x04\x1dr[`\x98W\xe6\xde\ +\xc6\x01:\xaa\xfd\x81/\xfe\xcdi[QM\x01\xf0\xb7\ +\xaekbHP\x00\x01\x007\xff\xec\x03m\x04Z\x00\ +$\x00 @\x10\x0d \x15\x03\x03\x22FY\x03\x10\x15\ +\x10FY\x15\x16\x00?+\x00\x18?+\x11\x12\x009\ +910\x136632\x16\x15\x14\x06\x07\x0e\x02\x15\ +\x14\x16327\x15\x06#\x22&54667>\ +\x0254#\x22\x07\xcbt\xacL\x97\x9f\x98\xba\xa3d\ +3bi\x87\xb2\x9f\xb0\xa5\xbaL\x8b\x94\x85g5\x9a\ +\x80\xb1\x04\x0c,\x22\x80zj\xa3G=?M7D\ +OT\x96K\x92\x80T\x7fc93>I/wH\ +\x00\x00\x02\x00b\xff\xec\x045\x06)\x00\x1c\x00)\x00\ +-@\x17\x0f\x04\x1a\x0b#GY\x0b\x0b\x04\x1a\x1a\x14\ +FY\x1a\x01\x04\x1dFY\x04\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x00910\x01\x14\ +\x02\x04#\x22&54\x12632\x16\x17375\ +\x10&#\x22\x07'6632\x12\x012\x12\x13&\ +&#\x22\x06\x06\x15\x14\x16\x045\xa6\xfe\xea\xb2\xa8\xbd\ +\x89\xea\x8fe\x8d-\x06\x02\x89\x8bpg+8\x9f?\ +\xd6\xd4\xfd\xa4\x89\xd71\x1f\x83Y[\xa5ai\x03\xb4\ +\xff\xfe.\xf7\xd1\xba\xb2\x01B\xb0S[ \x19\x01\x00\ +\xf8/z\x1c$\xfe\xca\xfb\x86\x01/\x01\x02p~\x93\ +\xfc\x90z\x86\x00\xff\xff\x00b\xff\xec\x03\xb4\x04\x5c\x02\ +\x06\x00H\x00\x00\x00\x01\xff\xdd\xff\xec\x06\xe7\x04\x5c\x00\ +<\x00G@':\x01\x1a\x01GY\x1e\x0d\x1a\x1d\x1a\ +\x02\x0b\x03\x1a\x1a\x1c<\x15\x1c\x0f(\x11\x16\x11FY\ +#\x16\x10/\x0a\x05\x0aFY4\x05\x16\x00?3+\ +\x11\x003\x18?3+\x11\x003\x18??\x129/\ +_^]3+\x11\x00310\x01#\x0e\x02#\x22\ +'7\x16326\x1254&#\x22\x07563\ +2\x16\x15\x073\x133\x033>\x0232\x17\x07&\ +#\x22\x06\x02\x15\x14\x16327\x15\x06#\x22&5\ +47#\x03#\x03\x06\xa2!\x92\xd4\x85C8\x195\ +/i\xabchc1?W2\xaa\xb4\x04\xa8d\x9a\ +i\xa4\x1e\x99\xcfzO>\x1e67h\xa4bbd\ +9:S4\xac\xb2\x04\xaag\x97\x01\xe9\x98\xe5\x80\x10\ +\x8b\x10\x9a\x01\x10\x91\x8b\x92\x0e\x89\x12\xd7\xcfL\x01\xde\ +\xfe\x22\x93\xecs\x12\x89\x0e\x96\xfe\xed\x93\x8a\x92\x10\x8b\ +\x10\xd9\xcc8 \xfe\x17\x00\x01\xff\xfc\xff\xec\x03F\x04\ +\x5c\x00&\x00-@\x17\x12%&&%FY&&\ +\x18\x0c\x0c\x05FY\x0c\x10\x18\x1eFY\x18\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x01 54&#\x22\x06\x07'6632\ +\x16\x15\x14\x06\x07\x15\x16\x15\x14\x06#\x22'5\x16\x16\ +32654&##7\x01{\x01#VVB\ +\x82S5[\xa4c\x98\xa6\x83\x7f\xba\xf7\xd6\xb4\x81G\ +\xaeQ\x7f\x9dfk\x95!\x02\x81\xc3?J &\x81\ ++)\x87ym\x94\x1c\x041\xba\xa4\xc0E\x9e+-\ +qbYM\x91\xff\xff\x00q\xff\xec\x04^\x04H\x02\ +\x06\x00X\x00\x00\xff\xff\x00q\xff\xec\x04l\x06\x10\x02\ +&\x00X\x00\x00\x01\x06\x0267\x00\x00\x0a\xb4\x01\x1b\ +\x1b\x11&\x00+\x115\x00\x01\x00;\x00\x00\x043\x04\ +H\x00\x0a\x00\x17@\x0b\x02\x0a\x05\x03\x07\x00\x08\x0f\x04\ +\x07\x15\x00?3?3\x12\x17910\x013\x01\x01\ +#\x01\x03#\x133\x03\x03^\xd5\xfd\xdb\x01w\xcb\xfe\ +\x9cs\xa8\xe8\xa6q\x04H\xfd\xe3\xfd\xd5\x02#\xfd\xdd\ +\x04H\xfd\xef\x00\x00\x01\xff\xa2\xff\xf2\x04\x08\x04P\x00\ +\x1b\x00\x1c@\x0e\x01\x15\x19\x04FY\x19\x0f\x0c\x11F\ +Y\x0c\x16\x00?+\x00\x18?+\x00\x18?10!\ +#\x13&#\x22\x06\x06\x07\x0e\x02#\x22'5\x163\ +2667\x126632\x17\x03#\xaa\xcf''\ +M`RSTt\x8cd/\x1f\x1c'@[W@\ +Wz\xa6\x84~x\x03\xba\x09=\x97\xed\xf0\xc7Y\x0e\ +\x91\x0aL\xab\xbb\x01\x02\xbeW\x1f\x00\x00\x01\x00=\x00\ +\x00\x05F\x04H\x00\x14\x00\x19@\x0c\x08\x01\x0f\x03\x0a\ +\x12\x0b\x0f\x00\x05\x0a\x15\x00?33?3\x12\x179\ +10!\x13\x06\x07\x01#\x03&'\x03#\x133\x13\ +\x16\x1767\x013\x03\x03\xc9\xbc\x10e\xfey{n\ +\x13\x04\xba\x92\xe8\xbas\x14\x04\x22W\x01\x9c\xc7\xea\x03\ +q#\xaa\xfd\x5c\x02\xa6qX\xfc\x91\x04H\xfd+\x8e\ +AM\x94\x02\xc3\xfb\xb8\x00\x01\x00;\x00\x00\x04\x8b\x04\ +H\x00\x0b\x00\x1a@\x0d\x01\x08FY\x01\x01\x0a\x03\x0b\ +\x0f\x06\x0a\x15\x00?3?3\x129/+10\x01\ +\x03!\x133\x03#\x13!\x03#\x13\x01\xcba\x02\x17\ +b\xa8\xe7\xaah\xfd\xeai\xa8\xea\x04H\xfe5\x01\xcb\ +\xfb\xb8\x01\xee\xfe\x12\x04H\x00\xff\xff\x00b\xff\xf0\x04\ +\x1d\x04V\x02\x06\x00R\x00\x00\xff\xff\x00;\x00\x00\x04\ +)\x04\x5c\x02\x06\x00Q\x00\x00\xff\xff\xff\xd5\xfe\x14\x04\ +9\x04Z\x02\x06\x00S\x00\x00\xff\xff\x00b\xff\xec\x03\ +\xaa\x04\x5c\x02\x06\x00F\x00\x00\xff\xff\x00;\x00\x00\x06\ +\x87\x04\x5c\x02\x06\x00P\x00\x00\xff\xff\xff;\xfe\x14\x04\ +\x12\x04H\x02\x06\x00\x5c\x00\x00\x00\x03\x00b\xfe\x14\x04\ +\xf0\x06\x14\x00\x13\x00\x1b\x00#\x00+@\x16\x12\x00\x09\ +\x1b#\x18\x11\x18FY\x00\x11\x10\x1c\x17\x0a\x17FY\ +\x07\x0a\x16\x00?3+\x11\x003\x18?3+\x11\x00\ +3\x18??10\x01\x16\x16\x15\x14\x02\x04#\x03#\ +\x13&&54\x12$7\x133\x01\x14\x16\x17\x13\x0e\ +\x02\x01>\x0254&'\x03j\xbd\xc9\xa1\xfe\xe1\xb3\ +f\x9ad\xb9\xc6\x9a\x01\x1a\xbb^\x9c\xfdC\x84n\xb4\ +\x81\xc0e\x01\x8e\x80\xbdk\x80t\x04X\x19\xea\xc6\xbb\ +\xfe\xca\xae\xfe$\x01\xda\x18\xef\xcc\xb7\x01-\xad\x06\x01\ +\xbc\xfb\xaf\x93\xad\x08\x03P\x06\x8a\xe9\xfe)\x05\x85\xf1\ +\x91\x91\xa6\x0b\x00\xff\xff\xff\xb6\x00\x00\x04\x06\x04H\x02\ +\x06\x00[\x00\x00\x00\x01\x00q\xfe\x85\x04^\x04H\x00\ +!\x00!@\x10\x19\x1b\x0a!\x0f\x14\x22\x10\x05\x1b\x05\ +FY\x15\x1b\x16\x00?3+\x11\x003\x18??3\ +\x12910\x01\x03\x06\x15\x1432667\x133\ +\x03\x06\x15\x14327\x03#\x13&&5#\x06#\ +\x22&547\x13\x01\xc3\x96\x12\x93X\xaa\x82\x22d\ +\xa6\xa4\x10N\x1b3q\xacP>9\x08\x9c\xd9\x82\x92\ +\x16\x92\x04H\xfdIY2\x8fx\xe0\x9e\x01\xdb\xfc\xfa\ +N3N\x0e\xfe\x04\x01k\x10de\xdd\x8d\x7f>n\ +\x02\xa4\x00\x00\x01\x00\x9e\x00\x00\x043\x04H\x00\x18\x00\ +\x1f@\x0f\x10\x0d\x18\x06\x13FY\x06\x06\x0d\x0a\x18\x0f\ +\x0d\x15\x00??3\x129/+\x11\x12\x00910\ +\x01\x06\x06\x15\x14\x16326773\x03#\x136\ +7#\x06# \x11477\x01\x96''PG\x94\ +\xd00\x18\xa8\xe9\xacA\x1b+\x08\x91\xd8\xfe\xea\x186\ +\x04H\xb9\xba5SA\xef\xdcq\xfb\xb8\x015\x82\x88\ +\xc0\x01\x147\x80\xfe\x00\x00\x01\x00q\xff\xec\x06\xbc\x04\ +H\x00,\x00%@\x12\x0f\x16\x1a,\x0b \x0f\x0e\x15\ +\x06'\x1a'FY\x13\x1a\x16\x00?3+\x11\x003\ +\x18??33\x129910\x01\x03\x06\x15\x14\x16\ +32667\x133\x03#7#\x06\x06#\x22&\ +'#\x06\x06#\x22&547\x133\x03\x06\x15\x14\ +\x1632667\x13\x04?\x93\x12=LT\x9fy\ +!d\xa8\xe9\x8b\x16\x0aW\xad\x5cqz\x0b\x08T\xc3\ +d\x7f\x8b\x16\x90\xaa\x94\x14EJP\x9cz\x1fk\x04\ +H\xfdK\x5c+ENx\xdf\x9d\x01\xdb\xfb\xb8\xcbw\ +h\x82sz{\x88\x82Dn\x02\xa0\xfdKf+>\ +Kr\xd8\x91\x01\xf4\x00\x00\x01\x00q\xfe\x85\x06\xbc\x04\ +H\x006\x00)@\x14\x1c!$6\x0b*\x0f\x17\x22\ +\x12\x061$1FY\x1e\x18$\x16\x00?33+\ +\x11\x0033\x18??33\x129910\x01\x03\ +\x06\x15\x14\x1632667\x133\x03\x06\x15\x14\x16\ +3267\x03#\x13&&5#\x06#\x22&'\ +#\x06#\x22&547\x133\x03\x06\x15\x14\x163\ +2667\x13\x04B\x96\x12=LT\x9fy!d\ +\xa8\xa3\x11+#\x1a'\x0dq\xacP?<\x06\x99\xc9\ +qz\x0b\x08\xa9\xd2\x7f\x8b\x16\x90\xaa\x94\x14EJP\ +\x9ex\x1fk\x04H\xfdIY,GLx\xdf\x9d\x01\ +\xdb\xfc\xfaQ0''\x0b\x03\xfe\x04\x01k\x10de\ +\xdd\x82s\xf5\x88\x82?s\x02\xa0\xfdId+>K\ +t\xd4\x93\x01\xf4\x00\x02\x00T\xff\xec\x04;\x04H\x00\ +\x11\x00\x1e\x00-@\x17\x00\x08\x10\x02\x12FY\x02\x02\ +\x08\x10\x10\x0fFY\x10\x0f\x08\x19FY\x08\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x01632\x16\x15\x14\x06#\x22&547\ +\x13!7!\x13\x22\x07\x06\x15\x14\x1632654\ +&\x02\x10}_\xa9\xa6\xde\xc7\xaa\xb7\x17b\xfe\xa6\x1f\ +\x02\x04Geg\x17adr\x84b\x02h\x19\x96\x8b\ +\xa9\xcb\xa0\x99_c\x01\xcf\x92\xfd\xac\x15j>a]\ +vcTN\x00\x00\x03\x00\x81\xff\xec\x05\x85\x04H\x00\ +\x03\x00\x13\x00 \x00)@\x15\x05\x0d\x13\x07\x14FY\ +\x07\x07\x01\x02\x13\x0f\x01\x15\x0d\x1bFY\x0d\x16\x00?\ ++\x00\x18??3\x129/+\x11\x12\x00910\ +!#\x133!\x03632\x16\x15\x14\x06#\x22&\ +547\x13\x13\x22\x07\x06\x15\x14\x1632654\ +&\x04\x9c\xa6\xe7\xa8\xfc>g}^\xa9\xa7\xe0\xc6\xaa\ +\xb6\x17\x81\xf1di\x16ads\x82b\x04H\xfe \ +\x19\x96\x8b\xa9\xcb\xa1\x98_c\x02a\xfd\xac\x15n:\ +a]vcUM\x00\x00\x02\x00\x81\xff\xec\x03\xa6\x04\ +H\x00\x10\x00\x1d\x00$@\x12\x00\x09\x0f\x02\x11FY\ +\x02\x02\x09\x0f\x0f\x09\x18FY\x09\x16\x00?+\x00\x18\ +?\x129/+\x11\x12\x00910\x01632\x16\ +\x15\x14\x06\x06#\x22&547\x133\x13\x22\x07\x06\ +\x15\x14\x1632654&\x01Z\x87m\xa8\xb0m\ +\xc9\x84\xb1\xba\x17\x81\xaaf\x81k\x16ij|\x8ci\ +\x02h\x19\x90\x91m\xab\x5c\x9f\x9e[c\x02a\xfd\xac\ +\x15lM`B1\x1d\x15\x1c1D7 UF]d\ +\xe5\xc7\x01\x9e\xe8\xa6]\x8cpy\xd7\xbcN\x01\xb2F\ +n\x83[,\x0c\x85\x06>pDe\x1c\x1b\x81`\x9f\ +\xbb\xfb\xb8\x01\xb2\x02\x02j\x5c\xa8\x01n\x00\xff\xff\x00\ +b\xff\xec\x03\xbd\x05\xd3\x02&\x00H\x00\x00\x01\x06\x00\ +j\xd4\x00\x00\x0c\xb5\x03\x0266\x11&\x00+\x115\ +5\x00\x01\x00;\xfe\x14\x04!\x06\x14\x00*\x00<@\ +\x1f\x06$\x09\x03&'&GY\x00''$)\x09\ +\x1eFY\x09\x09$)\x00$\x15\x12\x17FY\x12\x1b\ +\x00?+\x00\x18??\x129/+\x11\x12\x009\x18\ +/3+\x11\x003\x11\x12910\x01!\x07!\x06\ +\x06\x073632\x16\x15\x14\x07\x03\x06\x06#\x22'\ +5\x16327\x13654#\x22\x06\x06\x07\x03#\ +\x01#7373\x02\x04\x01^\x1c\xfe\xa6& \x19\ +\x0b\x96\xe0\x85\x8e\x17\xaa$\x9c\x87E6;;|*\ +\xaa\x15\x96X\xa9\x82!\x5c\xa8\x01\x09\x98\x1d\x95'\xa8\ +\x05Z\x81\xb1\x80T\xe1\x92\x84>h\xfc\xe5\xab\x9f\x15\ +\x8f\x16\xcf\x03\x1cc$\x94w\xdf\x9e\xfeL\x04\xd9\x81\ +\xba\xff\xff\x007\xff\xec\x03\xc4\x06!\x02&\x01\xcd\x00\ +\x00\x01\x06\x00v\x0a\x00\x00\x0a\xb4\x01..\x11&\x00\ ++\x115\x00\x01\x00b\xff\xec\x03\xaa\x04\x5c\x00\x1c\x00\ +&@\x14\x0f\x12FY\x0f\x0f\x00\x07\x07\x0cFY\x07\ +\x10\x00\x17FY\x00\x16\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10\x05\x22&54\x12$32\ +\x17\x07&#\x22\x06\x07!\x07!\x06\x15\x14\x1632\ +67\x15\x06\x01\xfa\xc2\xd6\x98\x01\x01\xa3\x89\x83/x\ +c}\xc02\x01\xd7!\xfe+\x04\x83w9r[|\ +\x14\xd6\xc3\xc7\x01\x5c\xb43\x8d3\xb0\xa2\x94#A{\ +\x93\x1a)\x8f?\xff\xff\x00\x08\xff\xec\x03D\x04\x5c\x02\ +\x06\x00V\x00\x00\xff\xff\x00;\x00\x00\x02\x1f\x05\xdf\x02\ +\x06\x00L\x00\x00\xff\xff\x00;\x00\x00\x02\xc1\x05\xd3\x02\ +&\x00\xf3\x00\x00\x01\x07\x00j\xfe\xd8\x00\x00\x00\x0c\xb5\ +\x02\x01\x17\x17\x11&\x00+\x1155\xff\xff\xfe\xfe\xfe\ +\x14\x02\x1d\x05\xdf\x02\x06\x00M\x00\x00\x00\x02\xff\xa2\xff\ +\xec\x05\x98\x04P\x00(\x004\x005@\x1b\x00\x08&\ +\x02)FY\x02\x02\x18&&\x10FY&\x0f/\x1d\ +\x08\x18\x18\x1dFY\x18\x16\x00?+\x11\x003\x113\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x00910\ +\x01632\x16\x15\x14\x06#\x22&547\x13&\ +#\x22\x06\x06\x07\x0e\x02#\x22'5\x163266\ +7>\x0332\x17\x13\x22\x07\x06\x15\x143265\ +4&\x03j\x80^\xa9\xa7\xe0\xc6\xaa\xb7\x17`!\x1e\ +\xbevcTN\x00\x00\x02\x009\xff\xec\x05\ +\xfe\x04H\x00\x16\x00\x22\x002@\x1b\x00\x08\x02\x02\x17\ +FY\x13\x0eFY\x02\x13\x02\x13\x08\x15\x11\x0f\x10\x15\ +\x08\x1dFY\x08\x16\x00?+\x00\x18??3\x129\ +9//++\x11\x12\x00910\x01632\x16\ +\x15\x14\x06#\x22&547!\x03#\x133\x03!\ +\x133\x13\x22\x07\x06\x15\x1432654&\x03\xd3\ +{`\xa9\xa7\xe0\xc6\xaa\xb6\x18\xfen\x02\xa4\x00\x00\x01\x00V\x00\x00\x04\xa4\x06\ +\xe1\x00\x07\x00\x16@\x0a\x01\x07\x06\x12\x07\x04IY\x07\ +\x03\x00?+\x00\x18?\x10\xc610\x01\x133\x03!\ +\x01#\x01\x03\xc1?\xa4b\xfd\xd5\xfe\xeb\xac\x017\x05\ +\xb6\x01+\xfe:\xfa\xe5\x05\xb6\x00\x01\x00;\x00\x00\x03\ +\xa2\x05\x87\x00\x07\x00\x16@\x0a\x06\x04\x03\x15\x04\x01G\ +Y\x04\x0f\x00?+\x00\x18?\x10\xc610\x01!\x03\ +#\x13!\x133\x03B\xfen\xcd\xa8\xea\x01\x8bF\xac\ +\x03\xcb\xfc5\x04H\x01?\x00\xff\xff\x00\xdf\x00\x00\x07\ +\x81\x07s\x02&\x00:\x00\x00\x01\x07\x00C\x01\x00\x01\ +R\x00\x0a\xb4\x01\x1f\x1f\x05&\x00+\x115\xff\xff\x00\ +u\x00\x00\x06\x06\x06!\x02&\x00Z\x00\x00\x01\x06\x00\ +C\x1b\x00\x00\x0a\xb4\x01!!\x11&\x00+\x115\xff\ +\xff\x00\xdf\x00\x00\x07\x81\x07s\x02&\x00:\x00\x00\x01\ +\x07\x00v\x01\xe1\x01R\x00\x0a\xb4\x01''\x05&\x00\ ++\x115\xff\xff\x00u\x00\x00\x06\x06\x06!\x02&\x00\ +Z\x00\x00\x01\x07\x00v\x00\xf0\x00\x00\x00\x0a\xb4\x01)\ +)\x11&\x00+\x115\xff\xff\x00\xdf\x00\x00\x07\x81\x07\ +%\x02&\x00:\x00\x00\x01\x07\x00j\x01m\x01R\x00\ +\x0c\xb5\x02\x0111\x05&\x00+\x1155\xff\xff\x00\ +u\x00\x00\x06\x06\x05\xd3\x02&\x00Z\x00\x00\x01\x06\x00\ +j{\x00\x00\x0c\xb5\x02\x0133\x11&\x00+\x115\ +5\xff\xff\x00\xbc\x00\x00\x04\xc3\x07s\x02&\x00<\x00\ +\x00\x01\x07\x00C\xffz\x01R\x00\x0a\xb4\x01\x0a\x0a\x05\ +&\x00+\x115\xff\xff\xff;\xfe\x14\x04\x12\x06!\x02\ +&\x00\x5c\x00\x00\x01\x07\x00C\xff\x0b\x00\x00\x00\x0a\xb4\ +\x01\x1a\x1a\x11&\x00+\x115\x00\x01\x007\x01\xd5\x03\ +\x91\x02u\x00\x03\x00\x08\xb1\x00\x01\x00/310\x13\ +7!\x077#\x037\x22\x01\xd5\xa0\xa0\x00\x00\x01\x00\ +7\x01\xd5\x07h\x02u\x00\x03\x00\x08\xb1\x00\x01\x00/\ +310\x137!\x077#\x07\x0e\x22\x01\xd5\xa0\xa0\ +\x00\xff\xff\x007\x01\xd5\x07h\x02u\x02\x06\x02\x03\x00\ +\x00\xff\xff\xff1\xfe0\x02\xb2\xff\xd5\x00'\x00B\xff\ +\xed\xfft\x00\x07\x00B\x00%\x00\x8d\x00\x01\x00{\x03\ +\xc1\x02\x08\x05\xb6\x00\x06\x00\x09\xb2\x00\x03\x03\x00?\xcd\ +10\x13'6\x133\x02\x07\x81\x06b\xac\x7f\x938\ +\x03\xc1\x16\xd3\x01\x0c\xfe\xa7\x9c\x00\x01\x00}\x03\xc1\x02\ +\x0c\x05\xb6\x00\x07\x00\x09\xb2\x05\x07\x03\x00?\xc610\ +\x01\x17\x06\x06\x07#\x127\x02\x04\x08(\x8eX\x81\x86\ +E\x05\xb6\x16[\xff\x85\x01*\xcb\x00\x00\x01\xff\x9c\xfe\ +\xf8\x01+\x00\xee\x00\x06\x00\x08\xb1\x04\x00\x00/\xcd1\ +0%\x17\x06\x07#\x127\x01#\x08q\x9d\x81~N\ +\xee\x17\xeb\xf4\x01\x1e\xd8\x00\x01\x00\xe5\x03\xc1\x01\xac\x05\ +\xb6\x00\x06\x00\x09\xb2\x03\x06\x03\x00?\xcd10\x01\x10\ +\x17#&'7\x01\x9c\x10w=\x13\x11\x05\xb6\xfe\xef\ +\xe4\xe0\xff\x16\x00\x00\x02\x00{\x03\xc1\x03{\x05\xb6\x00\ +\x06\x00\x0d\x00\x0d\xb4\x00\x07\x03\x0a\x03\x00?3\xcd2\ +10\x01'6\x133\x02\x07!'6\x133\x02\x07\ +\x01\xf4\x08P\xc0\x7f\xa2)\xfd\xd1\x06b\xac\x7f\x938\ +\x03\xc1\x16\xb5\x01*\xfe\x85z\x16\xd3\x01\x0c\xfe\xa7\x9c\ +\x00\x00\x02\x00}\x03\xc1\x03\x7f\x05\xb6\x00\x07\x00\x0f\x00\ +\x0d\xb4\x0c\x05\x0f\x07\x03\x00?3\xc6210\x01\x17\ +\x06\x06\x07#\x127!\x17\x06\x03#6\x127\x02\x04\ +\x08(\x8eX\x81\x86E\x02-\x0a^\xb4\x7f9u\x1c\ +\x05\xb6\x16[\xff\x85\x01*\xcb\x16\xce\xfe\xef~\x01%\ +R\x00\x02\xff\x9c\xfe\xf8\x02\x9c\x00\xee\x00\x06\x00\x0d\x00\ +\x0c\xb3\x0b\x0d\x04\x00\x00/\xcd3210%\x17\x06\ +\x07#\x127!\x17\x06\x03#\x127\x01#\x08q\x9d\ +\x81~N\x02+\x09_\xb0\x81\x8c?\xee\x17\xeb\xf4\x01\ +\x1e\xd8\x17\xcd\xfe\xee\x01<\xba\x00\x01\x00\xd9\x00\x00\x03\ +\xcb\x06\x14\x00\x0b\x00\x22@\x11\x07\x0a\x04\x01\x04\x06\x00\ +\x05\x05\x0b\x06\x06\x08\x03\x12\x08\x00\x00??\x129/\ +33\x113\x12\x17910\x01%\x03#\x01\x057\ +\x05\x133\x03%\x03\xa8\xfe\xc7\xa6\xcf\x01\x10\xfe\xcf#\ +\x01%%\xce\x8f\x01F\x03\xe3\x1f\xfb\xfe\x04\x04!\xae\ + \x01\xa3\xfe] \x00\x00\x01\x00N\x00\x00\x03\xe9\x06\ +\x14\x00\x15\x00?@!\x09\x00\x03\x06\x04\x07\x08\x0e\x11\ +\x14\x0b\x04\x0c\x0d\x02\x07\x01\x07\x08\x13\x0c\x12\x0c\x0d\x08\ +\x0d\x08\x0d\x0f\x05\x12\x0f\x00\x00??\x1299//\ +\x1133\x113\x1133\x113\x11\x12\x179\x11\x12\ +\x17910\x01%\x07%\x03#\x13\x057\x05\x13\x13\ +\x057\x05\x133\x03%\x07%\x03\x02\x10\x01F%\xfe\ +\xc5\x1b\xcf\x85\xfe\xbd%\x017\x12g\xfe\xbc'\x017\ +\x1b\xcf\x85\x01G&\xfe\xc6\x0e\x01\xe7\x1f\xac\x1f\xfe\x87\ +\x01y\x1f\xac\x1f\x01+\x01\x1b!\xae \x01z\xfe\x86\ + \xae!\xfe\xe5\x00\x01\x00\xc7\x01\xec\x02\x91\x03\xe9\x00\ +\x0b\x00\x08\xb1\x09\x03\x00/\xcd10\x134632\ +\x16\x15\x14\x06#\x22&\xc7\x93}\x5c^\x94\x80Y]\ +\x02\xac\x91\xacb\x5c\x8d\xb2c\xff\xff\x00+\xff\xe3\x05\ +5\x00\xf2\x00'\x00\x11\x02\x08\x00\x00\x00'\x00\x11\x04\ +\x12\x00\x00\x00\x06\x00\x11\x00\x00\x00\x07\x00\xa8\xff\xec\x08\ +\x93\x05\xcb\x00\x03\x00\x10\x00\x1f\x00,\x00;\x00G\x00\ +V\x001@\x18\x04<<\x1dTT\x03&22\x02\ +\x03\x06\x02\x18 9\x07\x0aBB\x16M\x19\x00?3\ +3\x113?3??\x129/3\x119/33\ +\x11310\x01\x01#\x01\x01\x22\x06\x06\x15\x1432\ +>\x0254\x17\x14\x02\x06\x06#\x22&54\x126\ +32\x16\x01\x22\x06\x06\x15\x1432>\x0254\x17\ +\x14\x02\x06\x06#\x22&54\x12632\x16\x01\x22\ +\x06\x06\x15\x14326\x1254\x17\x14\x02\x06\x06#\ +\x22&54\x12632\x16\x05\xbc\xfb\xc3\x98\x04>\ +\x02wBj@k4T?&\x8b?e\x8dVm\ +ze\xacrtw\xf9\x8cBj@k4T?&\ +\x8c@e\x8cWmze\xacrtx\x01\xedCi\ +?jAhE\x8b?e\x8dVnze\xacrt\ +x\x05\xb6\xfaJ\x05\xb6\xfdN~\xf6y\xadO\x95\xc9\ +G\xa6\x97k\xfe\xfe\xb1c\x95\x91\xa6\x011\x98\x8f\x02\ +\x5c~\xf9w\xacO\x95\xc9G\xa6\x98l\xfe\xfd\xb0b\ +\x96\x91\xa6\x011\x98\x90\xfd\xc9\x81\xf8t\xad\x82\x01\x0b\ +g\xa6\x97k\xfe\xfe\xb1c\x95\x91\xa6\x011\x98\x8f\xff\ +\xff\x00\xe1\x03\xa6\x01\xe5\x05\xb6\x02\x06\x00\x0a\x00\x00\xff\ +\xff\x00\xe1\x03\xa6\x03B\x05\xb6\x02\x06\x00\x05\x00\x00\x00\ +\x01\x00X\x00q\x02-\x03\xbe\x00\x06\x00\x12\xb6\x06\x00\ +\x03\x03\x01\x05\x01\x00//\x129\x113310\x13\ +\x01\x17\x01\x13\x07\x03X\x01\x87N\xfe\xd7\xacq\xe7\x02\ +B\x01|Q\xfe\xb2\xfe\x831\x01\xb4\x00\x01\x00\x17\x00\ +s\x01\xec\x03\xc1\x00\x06\x00\x12\xb6\x00\x06\x03\x03\x05\x01\ +\x05\x00//\x129\x113310\x01\x01'\x01\x03\ +7\x13\x01\xec\xfexM\x01(\xacq\xe8\x01\xf0\xfe\x83\ +R\x01M\x01}2\xfeK\x00\xff\xff\xff\xe6\xff\xe3\x04\ +5\x05\xb6\x00&\x00\x04\xbb\x00\x00\x07\x00\x04\x02\x0a\x00\ +\x00\x00\x01\xfe\x19\x00\x00\x02\xf0\x05\xb6\x00\x03\x00\x0a\xb3\ +\x03\x03\x02\x12\x00??10\x01\x01#\x01\x02\xf0\xfb\ +\xc2\x99\x04=\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\x00\xa8\x03\ +!\x03\x1b\x05\xc7\x00\x15\x00\x15@\x09\x0d\x0f\x00\x0a\x0b\ +\x1e\x05\x0f\x1f\x00?3?\xcd2\x11910\x01\x13\ +654#\x22\x06\x07\x03#\x133\x07632\x16\ +\x15\x14\x07\x03\x02=V\x11LO\x93\x1a=w\x8fe\ +\x13h\x90DV\x17N\x03!\x01}D*T\xaey\ +\xfe\xe8\x02\x99\x8d\x9aNP1i\xfe\x92\x00\x00\x01\x00\ +-\x00\x00\x04\xa8\x05\xb6\x00\x11\x002@\x1a\x0e\x11L\ +Y\x0e\x0e\x05\x0a\x03\x07\x08\x07NY\x00\x08\x08\x0a\x05\ +\x18\x0a\x0dLY\x0a\x06\x00?+\x00\x18?\x129/\ +3+\x11\x003\x11\x129\x18/+10\x01!\x07\ +!\x03#\x13#73\x13!\x07!\x03!\x07!\x01\ +\x9a\x01\x1a\x1a\xfe\xe59\xa27\xae\x1d\xae\xe1\x02\xcf!\ +\xfd\xd5s\x02\x09!\xfd\xfa\x01\x89\x83\xfe\xfa\x01\x06\x83\ +\x04-\x99\xfd\xe5\x98\x00\x00\x01\xff\xe9\x00\x00\x04\x9a\x05\ +\xc9\x00'\x00S@/\x16\x22#\x22MY\x13#\x12\ +&'&MY\x0f'\x0f'\x1f'?'O'\x04\ +\x09\x03#'#'\x1c\x04\x1d\x19\x1c\x19LY\x1c\x18\ +\x04\x0bKY\x04\x07\x00?+\x00\x18?+\x11\x003\ +\x11\x1299\x18//_^]\x113+\x11\x003\ +\x113+\x11\x00310\x0176632\x16\x17\ +\x07&&#\x22\x06\x07\x07!\x07!\x07!\x07!\x06\ +\x06\x07!\x07!76677#737#7\ +\x01f6(\xd6\xb0[\xb4AB9\x9cAi\x83\x1b\ +/\x01s\x1d\xfe\x90%\x01r\x1a\xfe\x8d\x1d\x5cK\x02\ +\xd5!\xfcG\x1bny\x19\x06\xbe\x1c\xc1!\xc7\x1f\x03\ +s\xf5\xb4\xad/'\x85!.q|\xdd\x85\xa2\x85\x81\ +\x83)\x9a\x8d\x19\x90t\x1d\x85\xa2\x85\x00\x03\x007\xff\ +\xec\x05\xa8\x05\xb6\x00\x19\x00$\x00-\x00H@%\x0f\ +\x0f$\x1a\x0e\x11\x0b\x14\x11\x14NY\x11\x11$\x1a%\ +\x22KY%%\x1a$\x18\x1a-KY\x1a\x06\x05\x00\ +MY\x05\x19\x00?+\x00\x18?+\x00\x18?\x129\ +/+\x11\x12\x009\x18/+\x11\x003\x113\x11\x12\ +9\x18/10%27\x15\x06#\x22&547\ +\x13#?\x023\x073\x07#\x03\x06\x15\x14\x16\x013\ +2\x16\x15\x14\x00!#\x03#\x0132654&\ +##\x04\xb26EIa`g\x1bP\x9a\x11\xa6d\ +h-\xc5\x1b\xc4T\x13*\xfc\xe3\xcc\xcf\xdb\xfe\xc8\xfe\ +\xdc1{\xa6\x01B\x1f\xca\xd5\x89\x891w\x16\x81 \ +a[5y\x01wNK\xb7\xcf\x81\xfe\x7fV-&\ +,\x05?\xbc\xb6\xf7\xfe\xf2\xfd\xc1\x02\xd1\xb6\xa6\x7fw\ +\x00\x00\x01\x00?\xff\xec\x04\xd7\x05\xc9\x00&\x00K@\ +)\x0b\x17\x18\x17NY\x08\x18\x06\x1c\x1d\x1cMY\x03\ +\x1d\x0f\x1d\x1f\x1d\x02\x09\x03\x18\x1d\x18\x1d\x12!!\x00\ +LY!\x07\x12\x0dLY\x12\x19\x00?+\x00\x18?\ ++\x11\x12\x0099\x18//_^]\x113+\x11\ +\x003\x113+\x11\x00310\x01\x22\x06\x07!\x07\ +!\x06\x07!\x07!\x10!27\x15\x06#\x22\x025\ +5#7367#73\x12\x0032\x16\x17\x07\ +&\x03\xa0\x8c\xe4K\x01\xaa\x1a\xfeG\x15\x0b\x01}\x1d\ +\xfe\x97\x01){\x85\x7f\x97\xd4\xe9\xaa\x1b\x9a\x08\x16\x97\ +\x1b\x9fa\x01E\xcfY\x8eFPq\x051\xc6\xc7\x85\ +Ac\x83\xfe\x8b7\x93;\x01\x0b\xf5\x0c\x83PT\x85\ +\x01\x0b\x01\x1a+1\x8aN\x00\x00\x04\x00\xcb\xff\xfa\x05\ +\xaa\x05\xbe\x00\x03\x00\x10\x00\x1b\x002\x00%@\x12-\ +\x1c\x1c\x03\x11\x0e\x0e\x02\x03\x06\x02\x18(#\x06\x16\x07\ +\x18\x00?3?3??\x129/3\x119/3\ +10\x01\x01#\x01\x13\x14\x06#\x22&5466\ +32\x16%\x22\x06\x15\x14326654%\x22\ +&546632\x17\x07&#\x22\x06\x15\x143\ +267\x15\x06\x05\xaa\xfb\xbc\x9b\x04G\x81\xba\x9eu\ +\x82S\x98iv\x85\xfe\xfaYm\x81=\xa5Y\x83\ +\xa0\xfcyBo63nHNbb\x02\xa6Bo\ +95pGNbd\x02\xcd\x83\xb7\xe2gt\xac\x8d\ +\x85\xb4pqip\xab\xfe\xbb[da]lTU\ +h\x01wZda^pQPl\x00\x01\x00'\xfe\ +\x14\x03\x12\x06\x14\x00\x15\x00\x0c\xb3\x10\x0b\x05\x00\x00/\ +2/310\x012\x17\x15&#\x22\x15\x11\x14\x06\ +#\x22'5\x163265\x11\x10\x02\x98R(/\ +?\xb2\xaa\xa4F7<3^`\x06\x14\x10\x89\x16\xef\ +\xfa\xeb\xb9\xc0\x0f\x8b\x14yt\x05\x1b\x01r\x00\x02\x00\ +s\x01}\x043\x04\x1f\x00\x17\x00/\x00!@\x0e\x03\ +\x0f\x00\x0c\x06\x12\x1b'$*\x1e\x12\x18\x1e\x00/3\ +/\x10\xcd232\x10\xcd322310\x01\x22\ +\x06\x075632\x16\x17\x16\x163267\x15\x06\ +#\x22&'&&\x03\x22\x06\x075632\x16\x17\ +\x16\x163267\x15\x06#\x22&'&&\x01\x5c\ +3\x7f7b\x91EtV@a27\x813e\x8f\ +H~HKZ04\x7f6b\x91A\x7fO@a\ +27\x813d\x90H~HBb\x01\xf6@9\x97\ +m\x1d%\x1b\x1cB7\x95o! \x18\x01\x9dA\ +7\x97m \x22\x1b\x1cB7\x96n! \x1c\x1b\x00\ +\x01\x00\x7f\x00\xa6\x04\x17\x05\x02\x00\x13\x00'@\x11\x11\ +\x01\x01\x0e\x02\x0d\x05\x05\x0a\x06\x02\x06\x02\x06\x08\x12\x08\ +\x00//\x1299//\x1133\x113\x1133\ +\x11310\x01#5!\x13!5!\x13\x17\x073\ +\x15!\x03!\x15!\x03'\x01{\xfc\x01=\x7f\xfeD\ +\x01\xfe\x85\x81j\xfe\xfe\xc0\x81\x01\xc1\xfd\xfd\x81\x81\x01\ +\xbc\x8e\x01\x10\x8b\x01\x1d9\xe4\x8b\xfe\xf0\x8e\xfe\xea5\ +\x00\x00\x02\x00\x7f\x00\x00\x04\x17\x04\xd1\x00\x06\x00\x0a\x00\ +%@\x10\x01\x02\x05\x05\x03\x06\x00\x04\x03\x00\x00\x08\x03\ +\x08\x07\x03\x00//3\x11\x129/\x113\x113\x12\ +9\x113310%\x015\x01\x15\x09\x025!\x15\ +\x04\x17\xfch\x03\x98\xfd\x14\x02\xec\xfch\x03\x98\xe9\x01\ +\xa6c\x01\xdf\x96\xfe\x8e\xfe\xb8\xfe\x7f\x8d\x8d\x00\x02\x00\ +\x7f\x00\x00\x04\x17\x04\xd1\x00\x06\x00\x0a\x00%@\x10\x05\ +\x04\x01\x01\x03\x00\x06\x02\x03\x06\x06\x08\x03\x08\x07\x03\x00\ +//3\x11\x129/\x113\x113\x129\x1133\ +10\x13\x01\x015\x01\x15\x01\x155!\x15\x7f\x02\xee\ +\xfd\x12\x03\x98\xfch\x03\x98\x01\x81\x01H\x01p\x98\xfe\ +!c\xfeZ\xe9\x8d\x8d\x00\x02\x00\x98\x00\x00\x04f\x05\ +\xc3\x00\x05\x00\x09\x00\x0e\xb4\x02\x09\x02\x07\x05\x00/3\ +\x113/10\x01\x01#\x01\x013\x09\x03\x04f\xfe\ +\x01\xc2H\x01\x16\xfe\xc7\xfe\xc7\x019\x02\ +\xe1\xfd\x1f\x02\xdf\x02\xe4\xfd\x1e\x02\x0d\xfd\xf3\xfd\xf2\xff\ +\xff\xff\x1b\xfe\x14\x04\xa2\x06\x1f\x00&\x00I\x00\x00\x00\ +\x07\x00L\x02\x83\x00\x00\xff\xff\xff\x1b\xfe\x14\x04\xb0\x06\ +\x1f\x00&\x00I\x00\x00\x00\x07\x00O\x02\x83\x00\x00\x00\ +\x01\x01\x5c\x04\xd9\x045\x06\x10\x00\x0f\x00\x0c\xb3\x07\x00\ +\x0c\x02\x00/3\xcd210\x01\x02!\x22&54\ +73\x06\x15\x143267\x0459\xfe\x9c\x9c\xa0\ +\x0a\x92\x06\xaepq\x12\x06\x10\xfe\xc9zx %\x22\ +\x19\x7fXb\x00\x00\x01\xfe\xfe\xfe\x14\x01\xcb\x04H\x00\ +\x0c\x00\x11\xb7\x08\x0f\x00\x05FY\x00\x1b\x00?+\x00\ +\x18?10\x03\x22'5\x16327\x013\x01\x06\ +\x06\x87E6=:}+\x01\x08\xa6\xfe\xf6$\x9d\xfe\ +\x14\x15\x8d\x16\xcd\x04\xdb\xfb\x16\xab\x9f\x00\x01\x02\x06\x04\ +\xcd\x03;\x06\x14\x00\x09\x00\x09\xb2\x08\x03\x00\x00?\xcd\ +10\x016673\x15\x06\x06\x07#\x02\x06%^\ +\x13\x9f\x14\x8e7\x5c\x04\xe77\xc15\x147\xc75\x00\ +\x01\x00\x9c\xfe;\x01\xcf\xff\x83\x00\x09\x00\x08\xb1\x09\x04\ +\x00/\xcd10\x136673\x15\x06\x06\x07#\x9c\ +\x1fX\x1c\xa0\x16\x889\x5c\xfeV0\xafN\x14;\xc2\ +7\x00\x01\x01\xf8\x04\xd9\x03+\x06!\x00\x09\x00\x08\xb1\ +\x09\x04\x00/\xcd10\x01\x06\x06\x07#5667\ +3\x03+$\x5c\x13\xa0\x10\x8a=\x5c\x06\x066\xbf8\ +\x15.\xc9<\x00\x00\x02\x00\x93\x025\x02\xfc\x05\xcd\x00\ +\x0c\x00\x18\x00\x0e\xb5\x0d\x0b\x1f\x14\x04!\x00?3?\ +310\x01\x14\x02\x06#\x22&54\x12632\ +\x07\x22\x06\x06\x15\x14\x1632\x1254\x02\xfcb\xaa\ +mt|c\xa7k\xf4\xfaBk>7?j\x82\x04\ +\xa8\xb4\xfe\xd6\x95\x9e\x9e\xa4\x01%\x93w\x87\xe6x`\ +e\x01,\xd2\xac\x00\x02\x00\x5c\x02J\x02\xdf\x05\xbc\x00\ +\x0a\x00\x10\x00!@\x0f\x0d\x07\x06\x10\x01\x05\x05\x09\x10\ +\x10\x03\x07\x1e\x03 \x00??\x129/33\x113\ +\x113\x11310\x01#\x07#7!7\x013\x03\ +3#\x127\x06\x07\x07\x02\xc9\x81+\x7f+\xfe\x93\x17\ +\x01\xe1\x85y\x7f\xfeE\x15\x14Z\xcd\x03\x14\xca\xcae\ +\x02C\xfd\xcd\x01BI$q\xf6\x00\x00\x01\x00\x87\x02\ +9\x03\x00\x05\xb6\x00\x1a\x00\x1b@\x0c\x19\x15\x11\x00\x00\ +\x06\x18\x15\x1e\x0b\x06!\x00?3?3\x129/3\ +\x11910\x012\x16\x15\x14\x06#\x22'5\x163\ +2654&#\x22\x07'\x13!\x07!\x076\x01\ +\xc9p\x81\xbe\xa6s\x5cwdhoYJCC5\ +{\x01\xaa\x19\xfe\xc7A+\x04j\x7fp\x94\xae4\x85\ +HkZ?N\x17-\x01\xa4y\xdf\x0c\x00\x00\x02\x00\ +\xa6\x027\x03\x12\x05\xc1\x00\x19\x00%\x00\x1b@\x0c\x00\ +\x11\x1f\x03\x03\x0a\x16\x11\x1e\x1a\x0a!\x00?3?3\ +\x129/3\x11910\x016632\x16\x15\x14\ +\x06\x06#\x22&54\x12632\x17\x07&#\x22\ +\x06\x07\x132654#\x22\x06\x06\x15\x14\x16\x01J\ +\x1fe8`qP\x90_s\x7f\x82\xd5\x94C>\x1c\ +;Fp\xa0#bQaw/X3B\x04\x1d-\ +/~ha\xa1Z\x90\x83\xaa\x018\x95\x11s\x13\x9e\ +\x95\xfe\x8b\x81`\x811ODIU\x00\x01\x00\xae\x02\ +J\x03-\x05\xb6\x00\x06\x00\x10\xb6\x05\x02\x00 \x02\x03\ +\x1e\x00?3?\x11310\x13\x01!7!\x07\x01\ +\xae\x01\xd3\xfey\x18\x02\x1b\x12\xfe-\x02J\x02\xfar\ +^\xfc\xf2\x00\x03\x00\x83\x029\x03\x02\x05\xc7\x00\x16\x00\ +\x22\x00/\x00\x1d@\x0d\x06\x11\x17\x17))\x0c#\x00\ +\x1f\x1d\x0c!\x00?3?2\x119/3\x1299\ +10\x012\x16\x15\x14\x06\x07\x16\x16\x15\x14\x06#\x22\ +&547&&546\x13\x06\x06\x15\x14\x163\ +2654&\x13\x22\x06\x15\x14\x16\x17>\x0254\ +&\x02\x1bj}m^I<\xad\x8cu\x8b\xe1=/\ +\xa0$dTP@H[E\x18GJ*8D<\ +$B\x05\xc7pYQy /f@t\x92ve\ +\xb4U.U?j~\xfe\x18&\x5c<;@QD\ +1Y\x01\x95I6*B%\x18,=)06\x00\ +\x02\x00\x8d\x02=\x02\xfa\x05\xc7\x00\x19\x00%\x00\x1b@\ +\x0c\x19\x0a\x03\x1f\x1f\x11\x1a\x0a\x1f\x16\x11!\x00?3\ +?3\x129/3\x11910\x01\x06\x06#\x22&\ +546632\x16\x15\x14\x02\x06#\x22'5\x16\ +3267\x03\x22\x06\x15\x14326654&\ +\x02V\x1ff7`qP\x91^s\x7f\x84\xd3\x95C\ +>=Sy\xa5#bOcw/X3B\x03\xe1\ +-/|ia\xa2Z\x90\x83\xaa\xfe\xc8\x95\x11{\x1b\ +\x9e\x95\x01u\x7fb\x811ODIU\x00\x00\x16\x00\ +T\xfe\x81\x07\xc1\x05\xee\x00\x05\x00\x0b\x00\x11\x00\x17\x00\ +\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00\ +;\x00?\x00C\x00G\x00S\x00[\x00k\x00t\x00\ +|\x00\x89\x00\x8d@N*B)AF>\x01E=\ +&2%1\x0f\x15\x0dVKcuult\x5cZ\ +Q\x82}\x0a\x00vk\x0dK}kl\x85\x5cQ\x00\ +\x00Q\x5c\x85lk}K\x0d\x09\x01\x19\x1d-\x13\x04\ +\x0f\x0f\x12\x18\x1c,\x04\x0c 48\x06\x04\x04\x04\x07\ +!59\x04\x01\x00/\x1733\x11\x173/\x173\ +3\x11\x173\x12\x179/////////\ +\x113\x113\x113\x113\x113\x113\x129\x113\ +\x113\x10\xc42\xc42\xc42\x10\xc62\xc62\xc62\ +10\x13\x11!\x15#\x15%5!\x11#5\x01\x11\ +3\x153\x15!5353\x11!5!\x15!5\ +!\x15\x015!\x15\x01#\x113\x11#\x113\x015\ +!\x15\x01#\x113\x015!\x1535!\x15\x01#\ +\x1135#\x113\x01#\x113\x05\x14\x06#\x22&\ +54632\x16\x05\x143254#\x22%3\ +2\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06##\x133\ +2654&##\x15\x1532654#\x01\ +\x22'5\x16325\x113\x11\x14\x06T\x01/\xc0\ +\x05\xce\x010m\xf9\x00o\xc0\x05\x0e\xc3m\xfdI\x01\ +\x11\xfb\xe1\x01\x0e\xfe\xf2\x01\x0e\x04\xb7mmmm\xfb\ +\xc2\x01\x10\xfc0oo\x02\xc0\x01\x10w\x01\x11\xfa\xa8\ +oooo\x06\xfemm\xfb\x9f\x87\x7f\x7f\x87\x87\x7f\ +~\x88\xfes\x87\x87\x87\x87\x01\xe1\xacmp.,;\ +0m^\xcf{B.$*/;J1%Z\x01\ +^4\x1c+\x19V}i\x04\xbe\x010o\xc1\xc1o\ +\xfe\xd0\xc1\xf9\x02\x01/\xc2mm\xc2\xfe\xd1mmm\ +m\x06\xfeoo\xfa\xa8\x01\x0e\x02\x02\x01\x0f\xfa;m\ +m\x01\xa6\x01\x0e\x04Joooo\xfc/\x01\x10y\ +\x01\x0f\xfdh\x01\x10I\x91\x9c\x9c\x91\x92\x9b\x9a\x93\xc5\ +\xc5\xc4aCS1D\x08\x04\x0dD8QY\x01b\ +\x22 \x22\x1d\xe3\x9a+%J\xfe\xfa\x0af\x08V\x01\ +\x92\xfer_c\x00\x03\x00T\xfe\xc1\x07\xaa\x06\x14\x00\ +\x03\x00\x1e\x00*\x00\x1c@\x0d(\x1e\x22\x1e\x14\x0e\x0e\ +\x14\x1e\x22\x04\x02\x00\x00//\x179////\x11\ +310\x09\x03\x0554676654&#\ +\x22\x06\x07\x17632\x16\x15\x14\x06\x07\x06\x06\x15\x15\ +\x03\x14\x1632654&#\x22\x06\x03\xfe\x03\xac\ +\xfcT\xfcV\x03\xeb,AgI\xbb\xa5O\xbaGR\ +\xa0Z?>1HT;\x1bGFBIHCH\ +E\x06\x14\xfcV\xfcW\x03\xa9\xfb/2A1R~\ +X\x87\x9a8*\xb2P:/5K6DpJ;\ +\xfe\xed?HI>@IH\xff\xff\xfe\xfe\xfe\x14\x02\ +\xff\x06!\x02&\x027\x00\x00\x01\x07\x01L\xfe\xc6\x00\ +\x00\x00\x0a\xb4\x01\x19\x19\x11&\x00+\x115\xff\xff\x00\ +}\x03\xc1\x02\x0c\x05\xb6\x02\x06\x02\x07\x00\x00\x00\x02\x00\ +/\xff\xec\x04\xbe\x06+\x001\x00;\x00<@\x1f\x00\ +%5%GY/55\x04*\x16\x10FY\x16\x16\ +\x04**9FY*\x01\x04!FY\x04\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +\x18/3+\x11\x00310\x01\x02\x02\x04#\x22&\ +54676654&#\x22\x06\x07763\ +2\x16\x15\x14\x06\x07\x06\x06\x15\x14326\x127$\ +\x114632\x12\x15\x14\x073\x07\x01\x14\x1636\ +5\x10#\x22\x06\x04\x1f%\xbe\xfe\xf8\xa1\x96\xa5*\x1a\ +\x0f\x1c\x1f\x17\x159\x14\x0aNHJV$\x14\x15\x22\ +\xa4p\xbb\x8b\x1d\xfd\xf3\xc3\x9e\xad\xbb\x04\x8f\x1c\xfdn\ +\xb0\xc3\x06\xc0Wb\x03P\xfe\xf6\xfek\xc5\x92\x86K\ +\x85C&K\x22\x1d\x1c\x11\x0b\x83 VGR\x87N\x14\xb0\xb0\x91\x01A\x98BP\x92\ +~~\xca\xfe\xaa\xaecW\xba\x02\xd2\x85s\xfe\xb2\xfe\ +\xe6jk\x8d\x81\xb4\x97K:RT\xa1\x01\x0f\x00\xff\ +\xff\x00T\x00\x00\x06\xb8\x07u\x02&\x000\x00\x00\x01\ +\x07\x00v\x01\xc1\x01T\x00\x0a\xb4\x01\x1e\x1e\x05&\x00\ ++\x115\xff\xff\x00;\x00\x00\x06\x87\x06!\x02&\x00\ +P\x00\x00\x01\x07\x00v\x01\x98\x00\x00\x00\x0a\xb4\x016\ +6\x11&\x00+\x115\xff\xff\xff\x8b\xfd\xdb\x04\x10\x05\ +\xb6\x02&\x00$\x00\x00\x00\x07\x02[\x01\x19\x00\x00\xff\ +\xff\x00b\xfd\xdb\x04`\x04\x5c\x02&\x00D\x00\x00\x00\ +\x07\x02[\x01/\x00\x00\xff\xff\xffs\xff\xec\x05\xfc\x05\ +\xcd\x00&\x002y\x00\x00\x07\x02\x5c\xfe@\x00\x00\x00\ +\x02\xff\xba\xfd\xdb\x01y\xff\x83\x00\x0b\x00\x17\x00\x0c\xb3\ +\x15\x03\x0f\x09\x00/3\xcc210\x01\x14\x06#\x22\ +&54632\x16\x074&#\x22\x06\x15\x14\x16\ +326\x01y\x7fdewvfd\x7fq?3\ +3@:93?\xfe\xb0atrabsv_\ +6==65>>\x00\x02\x013\x04^\x03{\x05\ +\xc5\x00\x07\x00\x1a\x00\x10\xb5\x0c\x02\x0b\x07\x0b\x18\x00/\ +\xcc\xc4\x10\xc6310\x01673\x15\x06\x07#'\ +467\x07\x06\x06\x15\x14\x16\x17\x16\x16\x15\x14\x06#\ +\x22&\x02+V@\xba`\xaeB\xf8\x91\x82\x11>A\ +\x13\x0c\x0f\x184.07\x04\x7f\x9b\x9a\x1c\x82\xb2e\ +Z\x84\x1eV\x140\x17\x0e\x10\x08\x0a\x19\x19\x222>\ +\x00\x00\x03\xff\x1b\xfe\x14\x07-\x06\x1f\x00=\x00A\x00\ +L\x00J@&JE@@(?\x153$\x1e$\ +FY-\x1e\x00\x17\x0a\x1a(:\x0a(\x0aGY7\ +(\x0f\x05\x13\x0e\x13FY\x00\x0e\x1b\x00?3+\x11\ +\x003\x18?3+\x11\x003\x113\x113\x18?3\ ++\x11\x003\x18?\x113\x10\xc4210\x01\x22'\ +5\x163267\x13!\x03\x06\x06#\x22'5\x16\ +3267\x13#?\x026632\x16\x17\x07&\ +#\x22\x06\x07\x07!76632\x16\x17\x07&#\ +\x22\x06\x07\x073\x07#\x03\x06\x06\x01#\x133\x034\ +632\x15\x14\x06#\x22&\x02!G6=6D\ +V\x1a\xe3\xfe\x1f\xe8'\xa2\x84E8@0FX\x19\ +\xe3\xc1\x0d\xce\x17.\xa3\xa0(t +L=W]\ +\x1d\x19\x01\xe2\x18-\xa2\xa2)q$-L=Y\x5c\ +\x1c\x18\xef\x1a\xee\xe7+\xa1\x03O\xa8\xe9\xa8y@3\ +XC,&6\xfe\x14\x15\x8d\x16s|\x04:\xfb\xb6\ +\xbd\xae\x15\x8d\x16t{\x04:CBd\xc8\xa5\x17\x0e\ +\x81\x1da\x81ll\xc5\xa6\x16\x0f\x81\x1df|l\x7f\ +\xfb\xb6\xc3\xa8\x01\xec\x04H\x01\x186IZ7L1\ +\x00\x00\x02\xff\x1b\xfe\x14\x07;\x06\x1f\x00\x03\x00A\x00\ +A@\x22\x02\x00\x01\x157(\x22(FY1\x22\x00\ +>\x1b\x0e\x1e,,\x0eGY;,\x0f\x09\x17\x12\x17\ +FY\x04\x12\x1b\x00?3+\x11\x003\x18?3+\ +\x11\x003\x1133\x18?3+\x11\x003\x18??\ +10!#\x013\x01\x22'5\x163267\x13\ +!\x03\x06\x06#\x22'5\x163267\x13#?\ +\x026632\x16\x17\x07&#\x22\x06\x07\x07!7\ +6632\x16\x17\x07&#\x22\x06\x07\x073\x07#\ +\x03\x06\x06\x05\xf0\xa8\x01K\xa8\xfa\xe6G6=6D\ +V\x1a\xe3\xfe\x1f\xe8'\xa2\x84E8@0FX\x19\ +\xe3\xc1\x0d\xce\x17.\xa3\xa0(t +L=W]\ +\x1d\x19\x01\xe2\x18-\xa2\xa2)q$-L=Y\x5c\ +\x1c\x18\xef\x1a\xee\xe7+\xa1\x06\x14\xf8\x00\x15\x8d\x16s\ +|\x04:\xfb\xb6\xbd\xae\x15\x8d\x16t{\x04:CB\ +d\xc8\xa5\x17\x0e\x81\x1da\x81ll\xc5\xa6\x16\x0f\x81\ +\x1df|l\x7f\xfb\xb6\xc3\xa8\x00\x02\x00\x96\xff\xec\x06\ +\xa6\x06\x14\x00\x17\x00%\x00%@\x12\x16\x0e\x0e\x04\x11\ +\x0b\x0b\x18IY\x0b\x04\x04\x1fIY\x04\x13\x00?+\ +\x00\x18?+\x00\x18\x10\xc6\x129\x11310\x01\x10\ +\x02\x04# \x00\x11\x10\x12$32\x16\x17667\ +3\x17\x06\x06\x07\x16\x01\x22\x06\x02\x15\x14\x16326\ +\x1254&\x05\x83\xb0\xfe\xb8\xd7\xff\x00\xfe\xe2\xc0\x01\ +O\xd2\x94\xdcBQV\x13\xbb\x08!\xa2\x8d-\xfd\xe7\ +\x9d\xf8\x89\xc4\xa8\x98\xf1\x8c\xbc\x03\x8b\xfe\xf3\xfeW\xe9\ +\x01+\x01\x0e\x01\x08\x01\xb4\xecqj!\x80\x81\x16\x8a\ +\xab8u\x01\x19\xca\xfe\x98\xda\xc7\xdf\xc3\x01l\xdd\xc7\ +\xdf\x00\x02\x00b\xff\xf0\x05H\x04\xf0\x00\x16\x00$\x00\ +%@\x12\x0a\x02\x02\x10\x05\x00\x00\x1aFY\x00\x10\x10\ +!FY\x10\x16\x00?+\x00\x18?+\x00\x18\x10\xc6\ +\x129\x11310\x012\x176673\x17\x06\x06\ +\x07\x16\x15\x14\x02\x06#\x22&54\x126\x014&\ +#\x22\x06\x02\x15\x14\x16326\x12\x02\x83\xd8nO\ +X\x17\xb8\x09!\xa3\x8a#\x90\xf6\x9b\xc0\xda\x92\xf8\x01\ +\x83}km\xad_\x7fwh\xa6]\x04V\x8f!\x83\ +\x85\x17\x86\xb04Vi\xbc\xfe\xb2\xb6\xe2\xc4\xbe\x01O\ +\xb3\xfeqs\x8f\x94\xfe\xf9\xa1\x83\x8f\x92\x01\x0d\x00\x00\ +\x01\x00\xa4\xff\xec\x06\xe5\x06\x14\x00\x1c\x00\x1e@\x0e\x08\ +\x01\x01\x0c\x03\x1c\x12\x03\x0c\x18IY\x0c\x13\x00?+\ +\x00\x18?3\xc6\x129\x11310\x01\x076\x133\ +\x17\x06\x06\x07\x03\x02\x04#\x22&547\x133\x03\ +\x06\x15\x10!267\x13\x05\x7f+\xa9(\xb8\x08\x22\ +\xdd\xab\x897\xfe\xe6\xf2\xe7\xe4\x18\xbd\xaa\xbf\x16\x01#\ +\xa9\xc0.\xcd\x05\xb6\xc6$\x01\x00\x16\x99\xca\x22\xfdw\ +\xfe\xf6\xfa\xd4\xc3Vo\x03n\xfc\x83hD\xfe\xf6\xae\ +\xcd\x03\xb8\x00\x01\x00q\xff\xec\x05\xd7\x04\xf0\x00 \x00\ +#@\x11\x13\x0c\x0c\x16\x1a\x0e\x0a \x0f\x15\x15\x1a\x05\ +FY\x1a\x16\x00?+\x00\x18??3\xc6\x1299\ +\x11310\x01\x03\x06\x15\x1432667\x133\ +\x076\x133\x17\x06\x06\x07\x03#7#\x06\x06#\x22\ +&546\x13\x01\xc3\x96\x12\x93X\xaa\x82\x22d\xa6\ +\x1a\xab(\xb8\x08\x22\xe2\xa8\xb4\x8b\x16\x0cb\xb2_\x82\ +\x90\x12\x96\x04H\xfdIY,\x95x\xe0\x9e\x01\xdb\x7f\ +\x22\x01\x05\x17\x9b\xc9!\xfc\xac\xcb}b\x8d\x85,j\ +\x02\xb4\x00\xff\xff\xfd.\x04\xd9\xfev\x06!\x00\x07\x00\ +C\xfa\xef\x00\x00\xff\xff\xfd\xe6\x04\xd9\xff\x8c\x06!\x00\ +\x07\x00v\xfb\xd2\x00\x00\xff\xff\xfc\xb5\x04\xd9\xff\x94\x05\ +\xdd\x00\x07\x01R\xfbe\x00\x00\x00\x01\xfd\xbe\x04\xb6\xff\ +\x17\x06\x8d\x00\x13\x00\x0a\xb2\x0c\x11\x05\x00/\xcc21\ +0\x03\x14\x06\x07\x07#76654&#\x22\x07\ +5632\x16\xe9nc\x1bj\x14^^@4'\ +82Aow\x05\xecR^\x17o\xb9\x0f5.*\ +\x1a\x08d\x0cT\x00\x01\xfc\xac\xfe\xa0\xfdw\xff}\x00\ +\x0b\x00\x08\xb1\x09\x03\x00/\xcd10\x014632\ +\x16\x15\x14\x06#\x22&\xfc\xac@3.*C,&\ +6\xfe\xfe4K4&7L1\x00\xff\xff\x00V\x00\ +\x00\x04j\x07s\x02&\x00(\x00\x00\x01\x07\x00C\xff\ +\xfb\x01R\x00\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\ +\xff\x00V\x00\x00\x05\x9e\x07s\x02&\x01\xb2\x00\x00\x01\ +\x07\x00C\x00f\x01R\x00\x0a\xb4\x01\x10\x10\x05&\x00\ ++\x115\xff\xff\x00b\xff\xec\x03\xb4\x06!\x02&\x00\ +H\x00\x00\x01\x07\x00C\xffU\x00\x00\x00\x0a\xb4\x02$\ +$\x11&\x00+\x115\xff\xff\x00q\xff\xec\x04^\x06\ +!\x02&\x00X\x00\x00\x01\x06\x00C\x8e\x00\x00\x0a\xb4\ +\x01\x1a\x1a\x11&\x00+\x115\x00\x01\x00\x96\xff\xec\x07\ +`\x05\xc9\x008\x00/@\x17\x11,,\x14\x1b\x00!\ +\x1b!IY\x06\x1b\x042(\x14(IY\x0e\x14\x13\ +\x00?3+\x11\x003\x18?3+\x11\x003\x11\x12\ +9\x18/910\x01\x22\x06\x07'632\x16\x15\ +\x14\x02\x02\x06#\x22&'\x06\x06#\x22&54\x12\ +$32\x17\x07&&#\x22\x06\x02\x15\x14\x1632\ +6773\x02\x06\x15\x14326\x1254&\x05\ +\xdf6^4H\x84\xa1\xaf\xbdu\xbd\xe8\x92r\x9c!\ +1\xb1t\xc8\xd1\xb1\x01\x0d\xb4\xafhR3Z6|\ +\xc3\x7f\x84~m\x80\x1f5\xae6\x09\xb2\x92\xdc\x8el\ +\x05/+\x1f\x8eV\xf0\xdb\xb7\xfef\xfe\xce\x8f]S\ +R^\xfd\xf0\xfe\x01\xf3\xffX\x8a\x22&\xe5\xfe[\xc0\ +\xad\xb5\x8a\x8d\xf5\xff\x00E\x19\xae\xf7\x01\xb9\xcb\x99\x98\ +\x00\x00\x01\x00h\x00\x00\x05\xdf\x04H\x00\x17\x00\x18@\ +\x0c\x16\x05\x0b\x03\x0f\x07\x01\x0f\x14\x15\x00\x15\x00??\ +?33\x179103\x033\x13\x17\x17\x01\x033\ +\x13\x16\x1766\x12\x133\x02\x00\x07#\x03#\x01\xec\ +\x84\xaaF\x0d\x0c\x01?9\xa6C\x18\x09o\x9cq:\ +\xa8K\xfe\xf2\xdc\xaa5\x04\xfe\xef\x04H\xfdv\x90\xa7\ +\x01\xf4\x01\xcd\xfd\xb2\xc0\x9et\xfe\x013\x01\x07\xfe\x8a\ +\xfd\xfb\xcd\x01\xac\xfeT\x00\x02\x00\x96\x00\x00\x04{\x06\ +\x14\x00\x12\x00\x1b\x001@\x19\x0e\x06\x07\x06IY\x0b\ +\x07\x0f\x1bIY\x07\x0f\x07\x0f\x09\x04@\x04\x13JY\ +\x04\x12\x00?+\x00\x1a\x18\x10\xcd99//+\x11\ +\x003+\x11\x00310\x01\x14\x04!!\x13!7\ +!\x133\x03!\x07!\x0332\x16\x013265\ +4&##\x04{\xfe\xb7\xfe\xca\xfe\xe1\xee\xfe\xcb\x22\ +\x014=\xac=\x01r!\xfe\x8e>\x90\xd6\xdc\xfd+\ +u\xd4\xdc\x8e\x8f\x93\x01\xe1\xea\xf7\x04`\x9c\x01\x18\xfe\ +\xe8\x9c\xfe\xe6\xb4\xfe\x01\xaa\x9crc\x00\x02\x00\x5c\xff\ +\xec\x03\xe9\x05'\x00\x16\x00#\x008@\x1c\x02\x09\x04\ +\x13\x11\x04\x17FY\x04\x04\x09\x11\x01\x10\x11\x10FY\ +\x15\x11\x0f\x09\x1eFY\x09\x16\x00?+\x00\x18?3\ ++\x11\x003\x11\x129\x18/+\x00\x18\x10\xc6\x11\x12\ +910\x01!\x0363 \x11\x14\x06#\x22&5\ +47\x13#7373\x07!\x03\x22\x07\x06\x15\x14\ +\x1632654&\x03\x06\xfe\xe1I\x82q\x01X\ +\xf1\xc9\xac\xbe\x16b\xe1\x1f\xe1/\xa8-\x01\x1f\xb8}\ +o\x17ij{\x8em\x03\xb6\xfe\xb2\x19\xfe\xdf\xa9\xcb\ +\x9c\xa1Ui\x01\xcf\x92\xdf\xdf\xfd\xac\x15s5c[\ +teWK\x00\x00\x01\x00V\xff\xec\x07B\x05\xcb\x00\ +%\x001@\x1a\x06\x17\x1c\x17IY\x03\x1c\x1c\x19\x1a\ +\x03\x19\x12!\x00IY!\x04\x11\x0bIY\x11\x13\x00\ +?+\x00\x18?+\x00\x18??\x129/3+\x11\ +\x00310\x01\x22\x00\x07!\x07!\x06\x15\x14\x163\ +27\x15\x06\x06#\x22\x00\x1147!\x03#\x013\ +\x03!6\x12$32\x17\x07&\x05\xe3\xc9\xfe\xd4B\ +\x02o\x1f\xfd\x8f\x0a\xc1\xae\x8a\xb7V\x9cn\xf6\xfe\xf2\ +\x08\xfe\xbc\x91\xaa\x015\xaa\x83\x01B5\xd8\x01,\xb6\ +\xc3\x9cH\x87\x053\xfe\xfc\xe7\x98>U\xbf\xdb9\x95\ +\x1f\x1c\x01$\x01\x09Z=\xfdP\x05\xb6\xfd\x92\xc3\x01\ +'\x99P\x8dE\x00\x01\x00;\xff\xec\x05\x8d\x04\x5c\x00\ +%\x001@\x1a\x1a\x06\x0b\x06FY\x17\x0b\x0b\x08\x09\ +\x0f\x08\x15\x0f\x14FY\x0f\x10\x00 FY\x00\x16\x00\ +?+\x00\x18?+\x00\x18??\x129/3+\x11\ +\x00310\x05\x22&547!\x03#\x133\x03\ +36$32\x17\x07&#\x22\x06\x07!\x07!\x06\ +\x15\x15\x14\x163267\x15\x06\x03\xdd\xc3\xd2\x06\xfe\ +\xfei\xa8\xea\xa6a\xfe;\x01\x1c\xc2\x87\x85/xc\ +~\xbf2\x01\xd8!\xfe-\x06\x86vNz<~\x14\ +\xd5\xc445\xfe\x12\x04H\xfe5\xe2\xfd3\x8d3\xb2\ +\xa2\x926\x17\x17|\x92(\x1b\x8f?\x00\x02\xff\x8b\x00\ +\x00\x04q\x05\xb4\x00\x0b\x00\x12\x00#@\x11\x0f\x06\x0b\ +\x03\x12\x03IY\x12\x12\x05\x06\x03\x09\x01\x05\x12\x00?\ +33?\x129/+\x11\x003\x11310!#\ +\x13#\x01#\x013\x13#\x03#7'&'\x06\x06\ +\x07\x02R\x9e\x94{\xfep\xb2\x03Z\x90\xfc\xaaow\ +^\x18\x19\x04\x1aC\x86\x02\xb0\xfdP\x05\xb4\xfaL\x02\ +\xb0\x9a\x9b\x9ch;}\xe7\x00\x00\x02\xff\xa4\x00\x00\x03\ +\xb6\x04H\x00\x0b\x00\x10\x00!@\x10\x04\x08\x10\x08F\ +Y\x10\x10\x0b\x06\x02\x0a\x15\x0e\x0b\x0f\x00?3?3\ +3\x129/+\x11\x00310\x01\x13#\x03#\x03\ +#\x13#\x01#\x01\x13&'\x06\x07\x02\xfa\xbc\xa8P\ +\x5cf\x9eo\x5c\xfe\xdf\xac\x02\x81\x85\x1c\x15Js\x04\ +H\xfb\xb8\x01\xf2\xfe\x0e\x01\xf2\xfe\x0e\x04H\xfe1\x9d\ +\xb3\x8b\xc5\x00\x02\x00V\x00\x00\x06Z\x05\xb6\x00\x13\x00\ +\x1a\x00+@\x16\x17\x0e\x13\x03\x07\x0c\x07IY\x1a\x0c\ +\x0c\x09\x0e\x0a\x03\x01\x05\x11\x03\x09\x12\x00?\x173?\ +3\x129/3+\x11\x0033\x11310!#\ +\x13#\x01#\x01!\x03#\x013\x03!\x013\x13#\ +\x03#7'&'\x06\x06\x07\x04;\x9d\x95}\xfes\ +\xb4\x01\x95\xfe\x87\x8f\xac\x015\xac\x85\x01\xb0\x01m\x91\ +\xfa\xaanw\x5c\x17\x16\x04 F\x80\x02\xb0\xfdP\x02\ +\xb0\xfdP\x05\xb6\xfd\x92\x02l\xfaL\x02\xb0\x9a\x97\x95\ +xI\x87\xd4\x00\x00\x02\x00;\x00\x00\x05=\x04H\x00\ +\x13\x00\x16\x00,@\x17\x08\x04\x0c\x11\x0cFY\x16\x11\ +\x11\x0e\x13\x0f\x0f\x02\x06\x0a\x03\x0e\x15\x15\x13\x0f\x00?\ +3?\x173?\x11\x129/3+\x11\x00331\ +0\x01\x13#\x03#\x03#\x13#\x01#\x01#\x03#\ +\x133\x03!\x01\x13\x03\x03\x04\x81\xbc\xa7L^g\x9e\ +m\x5c\xfe\xe1\xae\x01!\xfci\xac\xea\xaa`\x013\x01\ +\x0c\x871\xbc\x04H\xfb\xb8\x01\xee\xfe\x12\x01\xee\xfe\x12\ +\x01\xee\xfe\x12\x04H\xfe5\x01\xcb\xfe1\x01P\xfe\xb0\ +\x00\x00\x02\xff\xae\x00\x00\x05{\x05\xb6\x00\x1e\x00!\x00\ +4@\x1a\x09\x06!\x1f\x05\x18\x15\x19\x05\x19JY\x0a\ +\x05\x05\x07\x17\x10\x00\x12\x07!IY\x07\x03\x00?+\ +\x00\x18?33\x129/3+\x11\x0033\x113\ +\x113310#\x13>\x027\x037!\x07\x01\x1e\ +\x02\x17\x13#\x03&&##\x03#\x13#\x22\x06\x06\ +\x07\x03\x01\x01!R\xd1Pt\x96k\xfe\x1c\x04\x19\x1f\ +\xfe)g{>\x07\x19\xac\x19\x09\x5cf\x12\x98\xaa\x96\ +\x0fIcQ6\xd7\x02\x85\x01\xa6\xfdw\x01\xbc\xaa\x8b\ +I\x05\x01\xec\x8b\x8b\xfe\x17\x07M\x90\x95\xfe7\x01\xc9\ +\x92h\xfd=\x02\xc3,cq\xfe=\x03\x5c\x01\xc3\x00\ +\x02\xff\x91\x00\x00\x04\xa4\x04H\x00\x1c\x00\x1f\x004@\ +\x1a\x09\x06\x1f\x0a\x05\x17\x14\x18\x05\x18GY\x1d\x05\x05\ +\x07\x16\x10\x00\x15\x07\x1fFY\x07\x0f\x00?+\x00\x18\ +?33\x129/3+\x11\x0033\x113\x113\ +310#\x13>\x027\x037!\x07\x01\x1e\x02\x17\ +\x13#\x03&&#\x03#\x13#\x22\x06\x07\x03\x01\x01\ +!o\xc38d\x84]\xe1\x14\x03\xa0\x17\xfe\x8cQc\ +:\x101\xa8/\x0fWcq\x9bn\x09[r<\xb4\ +\x02)\x017\xfe\x08\x01jjg<\x0a\x01^ii\ +\xfe\xa2\x0c@op\xfe\xaa\x01TlT\xfd\xec\x02\x12\ +Mq\xfe\xac\x02\x83\x011\x00\x00\x02\x00V\x00\x00\x07\ +{\x05\xb6\x00$\x00'\x00=@!\x0f\x0c'%\x0a\ +\x1c \x1f\x03\x05\x0a\x05IY\x10\x0a\x0a\x07\x0d\x08\x03\ +\x16\x1e\x00\x03\x07\x12\x0d'IY\x0d\x03\x00?+\x00\ +\x18?\x173?\x11\x129/3+\x11\x00\x173\x11\ +3\x113310!\x13667!\x03#\x013\ +\x03!\x037!\x07\x01\x1e\x02\x17\x13#\x03&&+\ +\x02\x03#\x13#\x22\x06\x07\x03\x01\x01!\x01\xae\xd5\x22\ +D+\xfe}\x91\xaa\x015\xaa\x83\x02\x8d\xf9\x1c\x04\x19\ +\x1f\xfe)g{>\x07\x19\xaa\x17\x06\x5cf\x07\x12\x98\ +\xaa\x96\x0fm}I\xd7\x02\x85\x01\xa6\xfdw\x01\xc5H\ +x+\xfdP\x05\xb6\xfd\x92\x01\xe3\x8b\x8b\xfe\x17\x07M\ +\x90\x95\xfe7\x01\xc9\x89q\xfd=\x02\xc3f\x98\xfe;\ +\x03\x5c\x01\xc3\x00\x00\x02\x00;\x00\x00\x06F\x04H\x00\ + \x00#\x00?@\x22\x0e\x0b#\x1b\x18\x1c\x09\x1cG\ +Y!\x09\x09\x04FY\x09\x09\x06\x0c\x07\x0f\x14\x1a\x00\ +\x03\x06\x15\x0c#FY\x0c\x0f\x00?+\x00\x18?\x17\ +3?\x11\x129/+\x11\x003+\x11\x0033\x11\ +3310!\x1367!\x03#\x133\x03!\x03\ +7!\x07\x01\x16\x16\x17\x13#\x03&&#\x03#\x13\ +#\x22\x06\x07\x03\x01\x01!\x013\xc5.4\xfe\xf6i\ +\xac\xea\xaa`\x02\x06\xe4\x13\x03\xa2\x17\xfe\x8bws\x14\ +1\xa70\x0fY`q\x9cm\x0a\x5cl>\xb5\x02)\ +\x018\xfe\x08\x01mW*\xfe\x12\x04H\xfe5\x01b\ +ii\xfe\xa2\x12\x80\x99\xfe\xaa\x01VpN\xfd\xec\x02\ +\x12Ms\xfe\xae\x02\x83\x011\x00\x01\xff\xb8\xfeZ\x04\ +'\x06\xcd\x00J\x00d@8?9IY??A\ +00GIY)\x03\x04\x04\x03JY0\x040\x04\ +A\x10A5IYA\x22\x1b JY\x1b\x0f\x14\x1f\ +\x14/\x14\x03\x09\x03\x14\x10#\x17\x10\x10\x0bJY\x10\ +\x04\x00?+\x11\x0033\x18\x10\xd4_^]\xc4+\ +\x00\x18?+\x11\x12\x0099\x18//+\x11\x12\x00\ +9+\x11\x12\x009\x18/+10\x014!#7\ +32654&#\x22\x07'67&''5\ +3\x16\x17>\x0232\x17\x15&#\x22\x06\x07\x16\x16\ +\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04\x05\x06\x06\x15\x143\ +27632\x16\x17\x15&#\x07\x07\x22&54\ +67>\x02\x03\x17\xfe\xbe\xd7\x1d\xc8\xbb\xd9}i\xa8\ +\xb8H\xae\xc1'J$xTBPAF'&*\ +%\x1b\x1f\x027>\x0254##7\x01\ +\x91\x01#\xaeD\x80P6\x87w0_yAPZ\ +h6/'%\x1a\x22C?[a\x83\x7fWcd\ +\xc4\xbf\x92^:;Z\x98L0Z0\x5c`\x9a\xa8\ +}\x8dEp\x8bG\x98rB\xd1\x94\x1f\x02\x81\xc3\x89\ +##\x81>\x10Y~\x1bHjtF\x0eq\x083\ +Z\x1a{[m\x94\x1c\x04\x15xVi\x8cY\x1e\x17\ +6,#)\x0a\x0c\x19\x8f'\x04\x04kYN^7\ +\x1d\x0f\x1c6SB\x9a\x91\x00\xff\xff\x00\xc7\x00\x00\x06\ +D\x05\xb6\x02\x06\x01u\x00\x00\xff\xff\x00\x8f\xfe\x14\x05\ +f\x06\x12\x02\x06\x01\x95\x00\x00\x00\x03\x00\x96\xff\xec\x05\ +\x83\x05\xcd\x00\x0d\x00\x16\x00\x1f\x00&@\x14\x1a\x12I\ +Y\x1a\x1a\x04\x0b\x0b\x17IY\x0b\x04\x04\x0eIY\x04\ +\x13\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x01\x10\x02\x04# \x00\x11\x10\x12$32\x00\x01\ +2\x007!\x06\x15\x14\x16\x01\x22\x00\x07!654\ +&\x05\x83\xb0\xfe\xb8\xd7\xff\x00\xfe\xe2\xc0\x01O\xd2\xf4\ +\x01\x18\xfd5\xba\x01\x0f5\xfc\x9c\x06\xc4\x01Z\xb9\xfe\ +\xec5\x03a\x04\xbc\x03\x8b\xfe\xf3\xfeW\xe9\x01+\x01\ +\x0e\x01\x08\x01\xb4\xec\xfe\xcc\xfb\xea\x01\x1f\xfc#R\xc7\ +\xdf\x04\xb2\xfe\xec\xee,0\xc7\xdf\x00\x00\x03\x00b\xff\ +\xf0\x04\x1b\x04V\x00\x0d\x00\x16\x00\x1e\x00&@\x14\x1a\ +\x12FY\x1a\x1a\x04\x0b\x0b\x17FY\x0b\x10\x04\x0eF\ +Y\x04\x16\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++10\x01\x14\x02\x06#\x22&54\x12632\ +\x16\x01267!\x06\x15\x14\x16\x13\x22\x06\x07!7\ +4&\x04\x1b\x90\xf4\x99\xc2\xda\x92\xf8\x97\xbf\xd9\xfd\xe9\ +x\xb8$\xfd\xbc\x06\x7f\xfaw\xb7*\x02>\x02u\x02\ +\xc1\xc1\xfe\xab\xbb\xe4\xc2\xbe\x01O\xb3\xd9\xfc\xfe\xc8\xa9\ +\x1eA\x83\x8f\x03N\xb1\x9bJ{\x87\x00\x01\x00\xbc\x00\ +\x00\x05d\x05\xc3\x00\x17\x00\x1e@\x10\x10\x0b\x0c\x03\x0b\ +\x12\x00\x05JY\x00\x05JY\x00\x04\x00?++\x00\ +\x18??\x11310\x012\x17\x15&#\x22\x06\x06\ +\x07\x01#\x033\x13\x16\x15767\x01>\x02\x04\xee\ +0F*<&>>A\xfd\xfc\xb9\xa2\xaaa\x14\x04\ +)b\x01\x05``p\x05\xc3\x0f\x89\x10+^\x85\xfb\ +\xd3\x05\xb6\xfcX\xb8\x93\x02\x7f\xd3\x02&\xcc\x828\x00\ +\x01\x00`\x00\x00\x04!\x04N\x00\x17\x00\x17@\x0b\x00\ +\x0f\x0d\x12GY\x0d\x0f\x05\x17\x15\x00?3?+\x00\ +\x18?10\x133\x13\x16\x17\x17367\x13>\x02\ +32\x17\x15&#\x22\x06\x07\x01#`\xaa@\x11\x03\ +\x04\x06FV\x9e=MaF)%'\x1b*=0\ +\xfe}\xe6\x04H\xfd\x9f\xcb?d\xb1\xbd\x01T\x84c\ +,\x08y\x06;a\xfc\xc9\x00\xff\xff\x00\xbc\x00\x00\x05\ +d\x07s\x02&\x02\x80\x00\x00\x01\x07\x03v\x05+\x01\ +R\x00\x0c\xb5\x02\x01\x22\x22\x05&\x00+\x1155\xff\ +\xff\x00`\x00\x00\x04!\x06!\x02&\x02\x81\x00\x00\x01\ +\x07\x03v\x04\x7f\x00\x00\x00\x0c\xb5\x02\x01\x22\x22\x11&\ +\x00+\x1155\xff\xff\x00\x96\xfe\x14\x09\xd9\x05\xcd\x00\ +&\x002\x00\x00\x00\x07\x00\x5c\x05\xc7\x00\x00\xff\xff\x00\ +b\xfe\x14\x08h\x04V\x00&\x00R\x00\x00\x00\x07\x00\ +\x5c\x04V\x00\x00\x00\x02\x00\x96\xff\x83\x05\xaa\x061\x00\ +\x18\x00.\x009@\x1c%\x07\x19\x13\x16\x07\x0a@\x1c\ +-\x11\x16\x16-IY\x16\x03\x04\x0a(#\x0a#I\ +Y\x0a\x12\x00?+\x11\x003\x113\x18?+\x11\x00\ +3\x113\x1a\x18\x10\xcd\x10\xcd2\x11310\x01\x14\ +\x02\x04\x07\x06\x06#\x22&'&\x0254\x12$7\ +632\x16\x17\x16\x12%\x22&'\x06\x06\x02\x15\x14\ +\x16\x17632\x16\x176\x12\x11\x10'\x06\x05\xaa\x9f\ +\xfe\xd8\xc4\x16J6;>\x02\xb2\xc6\xa3\x01+\xbd'\ +p;>\x02\xb8\xbf\xfd\xd53B\x08\x80\xc8ntu\ +0^1A\x08\xc4\xf3\xe6-\x03{\xf4\xfes\xf1\x17\ +>1K6+\x01%\xdf\xec\x01\x90\xfa\x1clC8\ +2\xfe\xdeg/-!\xd2\xfe\xbf\xba\x9e\xd5(P1\ +,0\x01\x9f\x01!\x01>^R\x00\x00\x02\x00b\xff\ +\x91\x04;\x04\xb6\x00\x19\x000\x005@\x1a%\x14\x17\ +\x1a\x1d/\x07\x0a@(#\x17#FY\x11\x17\x0f\x04\ +\x0a\x0a/FY\x0a\x15\x00?+\x11\x003\x18?3\ ++\x11\x003\x1a\x18\x10\xcd\x1132\x10\xcd210\ +\x01\x14\x02\x06\x07\x06\x06#\x22&'&&54\x12\ +676632\x16\x17\x16\x16\x012\x16\x176\x12\ +54&'\x06#\x22&'\x0e\x02\x15\x14\x16\x176\ +\x04;j\xc6\x84\x12F328\x03\x91\x9cp\xcd\x84\ +\x12E638\x02\x8c\x92\xfd\xee\x222\x0cv\x8eF\ +G(Q#6\x09N\x80IQM.\x02\xb0\xaa\xfe\ +\xdb\xc5 ;0;2\x19\xe1\xae\x9c\x01(\xc6\x1e;\ +-;3\x22\xd3\xfd|%\x19-\x01'\xd9`\x85\x17\ +A\x22\x1d\x1a\x99\xe5\x86n\x90\x13F\x00\x03\x00\x96\xff\ +\xec\x07`\x083\x00\x11\x00!\x00U\x00C@!\x15\ +\x14$>'\x1a\x1f\x07\x0c.\x0a\x02\x02\x11\x0cH4\ +.4IYN.\x04A;';IY\x22'\x13\ +\x00?3+\x11\x003\x18?3+\x11\x003\x18\x10\ +\xc42\x113\x10\xc42\xd42\x1299\xc4210\ +\x01\x07#\x22.\x02#\x22\x07#632\x1e\x023\ +\x05\x14\x077654&'&&5432\x16\ +\x03\x22'\x06\x06#\x22\x0254\x12$32\x17\x07\ +&&#\x22\x06\x02\x15\x14\x163267\x16\x163\ +26\x1254&#\x22\x06\x07'632\x16\x15\ +\x14\x02\x02\x06\x06f\x18\x0fQuc^9d\x1b\x83\ +2\xe0=kjnA\xfe\xe1\xf8\x11r\x15\x0f!\x1d\ +\x5c9B\x91\xa0\x91N\x9e`\xc0\xcd\xb1\x01\x0d\xb4\xaf\ +hR3Z6|\xc3\x7f\x80|S\xa8:5\x9bO\ +\xa3\xdc\x91la6^4H\x84\xa1\xaf\xbdy\xc2\xee\ +\x07\xc1y$*$r\xeb$*$\xd5\x98DJ,\ +.\x11\x10\x06\x0c\x1f\x19GC\xf8\xc9X'1\x01\x00\ +\xed\xfe\x01\xf3\xffX\x8a\x22&\xe5\xfe[\xc0\xb0\xb2F\ +9\x8a\x93\ +\x85\xed\x01\x12\x1b\x0e{}C[+c\x1c\x83\x1a\x91\ +h>kimA\xfe\xec{\x7f\x12s'$\x191\ ++;B\x14;;\xd6\xc5\xcb\x01X\xb0#\x18\x8c0\ +\x8a\xfe\xeb\x9f\x85\x7fPP\x94\x01$\xb7\xd3-\x89\x17\ +$\xb8\xb2\xec\xfe\x98\xb0\x06\xa3x9\x1e\x1bryp\ +#+#\xd7Hq\x22J..\x1a\x0f\x0d\x1e\x15#\ +&E\x00\x00\x02\x00\x96\xff\xec\x07`\x06\xfc\x00\x0d\x00\ +F\x00E@\x22\x1f)\x07\x03\x0b::\x22)\x05\x09\ +\x09\x0b@\x0d)\x0e/)/IY\x14)\x04@6\ +\x226IY\x1c\x22\x13\x00?3+\x11\x003\x18?\ +3+\x11\x003\x18\x10\xd4\x1a\xcd3\x113\x11\x129\ +/\x1133\x11910\x01\x07\x07#'#\x07#\ +'#\x07#'7\x01\x22\x06\x07'632\x16\x15\ +\x14\x02\x02\x06#\x22&'\x06\x06#\x22&54\x12\ +$32\x17\x07&&#\x22\x06\x02\x15\x14\x1632\ +6773\x02\x06\x15\x14326\x1254&\x06\ +N\x04w\x1f\x1a\xbfH\x1e\x1b\xbeJ\x1d-\x06\x02\xd1\ +6^4H\x84\xa1\xaf\xbdu\xbd\xe8\x92r\x9c!1\ +\xb1t\xc8\xd1\xb1\x01\x0d\xb4\xafhR3Z6|\xc3\ +\x7f\x84~m\x80\x1f5\xae6\x09\xb2\x92\xdc\x8el\x06\ +\xfc\x13\xacgggg\xac\x13\xfe3+\x1f\x8eV\xf0\ +\xdb\xb7\xfef\xfe\xce\x8f]SR^\xfd\xf0\xfe\x01\xf3\ +\xffX\x8a\x22&\xe5\xfe[\xc0\xad\xb5\x8a\x8d\xf5\xff\x00\ +E\x19\xae\xf7\x01\xb9\xcb\x99\x98\x00\x02\x00h\x00\x00\x05\ +\xdf\x05\xa4\x00\x0e\x00&\x00*@\x15$\x14\x1a\x03\x0f\ +\x10\x08\x04\x0c\x06\x0a\x0a\x0e\x1e\x16\x10\x0f#\x15\x0f\x15\ +\x00???33\xd62\x113\xcd22\x11\x12\x17\ +910\x01\x15\x07\x07#'#\x07#'#\x07#\ +'7\x03\x033\x13\x17\x17\x01\x033\x13\x16\x1766\ +\x12\x133\x02\x00\x07#\x03#\x01\x04\xdf\x02w\x1e\x1b\ +\xbeH\x1f\x1a\xc1H\x1e+\x04\xb4\x84\xaaF\x0d\x0c\x01\ +?9\xa6C\x18\x09o\x9cq:\xa8K\xfe\xf2\xdc\xaa\ +5\x04\xfe\xef\x05\xa4\x0a\x0b\xacgggg\xac\x15\xfa\ +\x5c\x04H\xfdv\x90\xa7\x01\xf4\x01\xcd\xfd\xb2\xc0\x9et\ +\xfe\x013\x01\x07\xfe\x8a\xfd\xfb\xcd\x01\xac\xfeT\x00\x00\ +\x01\x00\x96\xfe\x14\x05\x0a\x05\xcb\x00\x17\x00\x1c@\x0e\x00\ +\x1b\x08\x0dIY\x08\x04\x01\x14IY\x01\x13\x00?+\ +\x00\x18?+\x00\x18?10\x01\x13&\x025\x10\x12\ +$32\x17\x07&#\x22\x04\x02\x15\x14\x16327\ +\x03\x02\x0eg\xe0\xff\xd3\x01d\xe1\xc5\x97E\x8a\x8d\xae\ +\xfe\xed\xa1\xc7\xa5MC\x8c\xfe\x14\x01\xda\x0c\x01(\xf7\ +\x01\x05\x01\xc1\xecP\x8dE\xc2\xfe\x89\xdd\xbe\xda\x1d\xfd\ +r\x00\x01\x00b\xfe\x14\x03\xaa\x04\x5c\x00\x17\x00\x1c@\ +\x0e\x00\x1b\x08\x0dFY\x08\x10\x01\x14FY\x01\x16\x00\ +?+\x00\x18?+\x00\x18?10\x01\x13\x22&5\ +4\x12$32\x17\x07&#\x22\x06\x02\x15\x14\x163\ +27\x03\x01\x91e\xc0\xd4\x96\x01\x00\xa6\x89\x83/x\ +cq\xb8i\x83wgX\x8e\xfe\x14\x01\xd8\xd3\xbc\xcb\ +\x01_\xb73\x8d3\x9b\xfe\xeb\xa2\x80|/\xfdd\x00\ +\x01\x00u\xff\xfa\x04\x85\x05\x0a\x00\x13\x00\x15@\x0c\x0c\ +\x0d\x12\x13\x08\x09\x02\x03\x08\x0e\x04\x12\x00?\xcd\x179\ +10\x01\x05\x07%\x03'\x13%7\x05\x13%7\x05\ +\x13\x17\x03\x05\x07%\x02X\x01\x1dH\xfe\xe3\xb4\x81\xb4\ +\xfe\xe6E\x01\x1f\xc7\xfe\xe3H\x01\x1c\xb7\x7f\xb7\x01\x1f\ +J\xfe\xe6\x01\xb0\xa6{\xa4\xfe\xc7J\x01;\xa4{\xa4\ +\x01Z\xa4}\xa4\x019I\xfe\xc4\xa4{\xa4\x00\x01\x01\ +T\x04\x91\x04N\x05\xb6\x00\x10\x00\x0e\xb4\x00\x07\x07\x0a\ +\x02\x00/\xcc9/310\x01\x06#\x22&54\ +3!632\x16\x15\x14\x06\x07\x02\x12\x11Y(,\ +\x89\x01\xb0\x11Z*,CH\x04\xf0_1\x1fw^\ +'\x22>=\x02\x00\x01\x01w\x04\xe5\x04h\x05\xd1\x00\ +\x17\x00\x0e\xb4\x17\x10\x05\x0b\x16\x00/3\xcd231\ +0\x012>\x0232\x16\x15\x14\x07#754&\ +#\x22\x0e\x02##7\x01\x98Q\x87ys>dj\ +\x06{\x025)+p\x85\x97Q\x0c\x18\x05^$+\ +$_O\x1d\x1f\x18\x15$\x22%+%y\x00\x01\x02\ +}\x04\xd9\x03j\x06/\x00\x10\x00\x0a\xb2\x0e\x03\x0f\x00\ +/\xcc310\x014632\x16\x15\x14\x06\x07\x06\ +\x06\x15\x14\x17\x15&\x02}A>*,#\x14\x11\x18\ +x\xed\x05\xb89>(\x22\x1d\x18\x08\x06\x10\x110.\ +JC\x00\x00\x01\x02\x98\x04\xd9\x03}\x06/\x00\x0f\x00\ +\x0a\xb2\x04\x0d\x03\x00/\xcc310\x01\x14\x06\x075\ +654'&&5432\x16\x03}srp\ +)\x22\x19^9B\x05\xb4Hq\x22J,.\x1b\x0e\ +\x0c\x1f\x16HC\x00\x08\x00)\xfe\xc1\x07\xc1\x05\x91\x00\ +\x0c\x00\x1a\x00(\x006\x00D\x00R\x00_\x00m\x00\ +e@4\x0d\x14\x10\x00\x07\x03>7E\x03LHZ\ +S`\x03gc\x22\x1b)\x030,\x1e,,%3\ +Vcc\x5cj:HHAO3jOOj3\ +\x03\x17\x09\x17\x10\x03\x09\x00/3/3\x11\x12\x179\ +///\x1133\x113\x1133\x113\x1133\ +\x113\x10\xc4\x172\x10\xc4\x172\x10\xc4\x172\x10\xc4\ +2\x10\xc4210\x01&&#\x22\x06\x07#63\ +2\x16\x17\x03&&#\x22\x06\x07#6632\x16\ +\x17\x01&&#\x22\x06\x07#6632\x16\x17!\ +&&#\x22\x06\x07#6632\x16\x17\x01&&\ +#\x22\x06\x07#6632\x16\x17!&&#\x22\ +\x06\x07#6632\x16\x17\x01&&#\x22\x06\x07\ +#632\x16\x17!&&#\x22\x06\x07#66\ +32\x16\x17\x04o\x05\x003@\x17,\ +/2(\x15\x1c'$\x18\x05\x09<\x15\x0d8\x05\x07\ +\x10\x07\x10\x15\x05\x15\x00//\x1299//\x10\xc4\ +2\x10\xc42\x10\xc4\xc6\xc4\xc4\x10\xc4\xc4\xc6\xc410\ +\x05\x17\x06\x06\x07#67\x017\x16\x16\x17\x15&'\ +\x01'6673\x06\x07\x01&&'7\x17\x16\x16\ +\x17%\x07\x06\x07'67\x03'&'7\x16\x17%\ +\x17\x06\x07'766\x01\x07&&'5\x16\x17\x04\ +7\x0b\x11F$a5\x11\x02s\x0eG\xc8A\xdd\x81\ +\xfdR\x0b\x13I\x1fa4\x12\x02!\x1f\x82&b\x11\ +'Z\x16\xfc\x19\x02\x9b\xa9E\xb1x+\x11REC\ +{L\x04%E\xb1xb\x02C\xbe\xfbW\x0eB\xbf\ +O\xdd\x81#\x0eB\xbfO\xdd\x81\x02\xae\x0b\x13I\x1f\ +a5\x11\x02u\x0eG\xc8A\xdc\x82\xfa\xb82\xc34\ +b\x02E\xc2<\xba\x10Y?DnX\x02\xde\x02\x8c\ +\xb7F\xc6c\xd3DnXb\x10'X\xfd<\x0b\x11\ +F$a5\x11\x00\x02\x00V\xfe\x83\x05\x9e\x07b\x00\ +\x12\x00\x22\x00,@\x16\x10\x03\x12\x00\x22\x1a@\x1f\x15\ +\x05\x00\x03\x12\x12\x0a\x22\x0c\x07IY\x0c\x12\x00?+\ +\x00\x18???3\xd62\x1a\xcc2\x11\x12991\ +0\x013\x03\x033\x013\x013\x03#\x13#\x13\x12\ +7#\x01#\x01\x02!\x22&5473\x06\x15\x14\ +3267\x01\x8b\xa4\xaeZ\x04\x03\xac\xc7\xfe\xeb\xac\ +\xfa\xc8\xef\x9b\xae<\x22\x04\xfcN\xc7\x04\xd19\xfe\x9b\ +\x9b\xa0\x0a\x91\x06\xaeqr\x11\x05\xb6\xfc\xcf\xfeu\x04\ +\xbc\xfa\xe4\xfd\xe9\x01}\x039\x01!y\xfb-\x07b\ +\xfe\xc9{w %\x22\x19\x7f[_\x00\x02\x00q\xfe\ +\x85\x04o\x06\x10\x00\x1c\x00,\x001@\x19\x12\x1c\x16\ +,$@)\x1f\x0a\x1c\x0f\x0f\x22\x11\x0cFY\x11\x15\ +\x16\x05FY\x16\x16\x00?+\x00\x18?+\x00\x18?\ +?3\xd62\x1a\xcc2\x11\x12910\x01\x03\x06\x15\ +\x1432667\x133\x033\x03#\x13#7#\ +\x06\x06#\x22&547\x13\x01\x02!\x22&54\ +73\x06\x15\x143267\x01\xc3\x96\x12\x93X\xaa\ +\x82\x22d\xa6\xc8\xa3\xe3\xa8\xc7\x89\x16\x0c]\xb3c\x82\ +\x90\x16\x92\x03V9\xfe\x9b\x9b\xa0\x0a\x91\x06\xaeqr\ +\x11\x04H\xfdIZ1\x8fx\xe0\x9e\x01\xdb\xfcI\xfd\ +\xf4\x01{\xcbze\x8b\x81>n\x02\xa4\x01\xc8\xfe\xc9\ +{w %\x22\x19\x7f[_\x00\x02\x00V\x00\x00\x03\ +\xf2\x05\xb6\x00\x11\x00\x1a\x003@\x1a\x04\x0e\x0f\x0eI\ +Y\x01\x0f\x0f\x0c\x11\x05\x1aIY\x05\x05\x0c\x11\x03\x0c\ +\x12JY\x0c\x12\x00?+\x00\x18?\x129/+\x11\ +\x12\x009\x18/3+\x11\x00310\x01\x07!\x07\ +!\x033 \x11\x14\x04!!\x13#737\x033\ +2654&##\x025'\x01/ \xfe\xd1<\ +\x8d\x01\xb3\xfe\xb9\xfe\xca\xfe\xe1\xee\x9a!\x99)nt\ +\xd3\xde\x8f\x8e\x94\x05\xb6\xb6\x98\xfe\xde\xfe\x9b\xe9\xf8\x04\ +h\x98\xb6\xfa\xdd\xa9\x9drc\x00\x02\x00\x7f\xff\xec\x03\ +\xa4\x06\x14\x00\x15\x00\x22\x009@\x1d\x04\x0b\x06\x03\x11\ +\x12\x11GY\x00\x12\x12\x0b\x14\x06\x16FY\x06\x06\x0b\ +\x14\x00\x0b\x1dFY\x0b\x16\x00?+\x00\x18?\x129\ +/+\x11\x12\x009\x18/3+\x11\x003\x11\x129\ +10\x01!\x07!\x0363 \x11\x14\x06# \x03\ +47\x13#7373\x13\x22\x07\x06\x15\x14\x163\ +2654&\x01\xec\x01\x08\x1d\xfe\xfay\x84p\x01\ +X\xf3\xc8\xfe\x9a\x04\x17\x93\x96\x1d\x945\xa8\x06}o\ +\x16hk|\x8cm\x05\x1f\x83\xfd\xcc\x19\xfe\xdf\xaa\xca\ +\x01=[c\x02\xb5\x83\xf5\xfb\xe0\x15n:c[u\ +dWK\x00\x02\x00V\x00\x00\x04\x87\x05\xb6\x00\x0e\x00\ +\x1b\x009@\x1c\x08\x12\x05\x15\x12\x15\x14\x07\x14\x07\x14\ +\x0d\x0e\x0f\x0bJY\x0f\x0f\x0e\x0d\x12\x0e\x1bJY\x0e\ +\x03\x00?+\x00\x18?\x129/+\x11\x12\x0099\ +\x18//\x1299\x113\x11310\x012\x16\x15\ +\x10\x05\x17\x07'\x06##\x03#\x01\x13327'\ +7\x17654&##\x02\xd5\xd6\xdc\xff\x00J\x81\ +Ru\x87\x87{\xaa\x015\x0f\x85`BD\x7fJ\x91\ +\x8b\x92\xa3\x05\xb6\xbd\xbc\xfe\xc9}\x9b@\xaa\x19\xfd\xc1\ +\x05\xb6\xfd\x1b\x0e\x94=\x9e\x5c\xc9}o\x00\x00\x02\xff\ +\xd5\xfe\x14\x049\x04Z\x00\x18\x00)\x00?@ \x17\ +\x22\x14%\x22%$\x16$\x16$\x08\x04\x0b\x0e\x00\x09\ +\x0f\x08\x1b\x0e\x19FY\x0e\x10\x00 FY\x00\x16\x00\ +?+\x00\x18?+\x00\x18??\x11\x1299\x119\ +9//\x1299\x113\x11310\x05\x22&'\ +#\x06\x06\x03#\x013\x073632\x16\x15\x14\x02\ +\x07\x17\x07'\x06\x13\x22\x06\x02\x15\x14\x16327'\ +7\x176\x1254\x02!b\x94'\x0a\x09\x09m\xa6\ +\x01P\x8b\x1a\x08\xb3\xc1\x89\x9e\x9c\x8bJ\x81L=\x89\ +`\xc7urh\x1c\x1dJ\x7fHWg\x14fXV\ +9\xfd\xf9\x064\xd1\xe3\xc3\xb0\xde\xfe\x8a`\x99@\xa0\ +\x0e\x03\xe3\xbe\xfe\xe0\x97mv\x06\xa4;\x97S\x01,\ +\xa8\xe3\x00\x00\x01\x00N\x00\x00\x04b\x05\xb6\x00\x0d\x00\ +$@\x12\x06\x0a\x0b\x0aIY\x03\x0b\x0b\x0d\x08\x12\x0d\ +\x02IY\x0d\x03\x00?+\x00\x18?\x129/3+\ +\x11\x00310\x01\x07!\x03!\x07!\x03#\x13#\ +73\x13\x04b \xfd\xd5m\x01F!\xfe\xba\x87\xac\ +\x89\x91\x1f\x91\x8d\x05\xb6\x9b\xfe\x04\x96\xfdw\x02\x89\x96\ +\x02\x97\x00\x00\x01\x00\x0c\x00\x00\x03^\x04H\x00\x0d\x00\ +$@\x12\x0c\x02\x03\x02GY\x09\x03\x03\x05\x00\x15\x05\ +\x08FY\x05\x0f\x00?+\x00\x18?\x129/3+\ +\x11\x003103\x13#73\x13!\x07!\x03!\ +\x07!\x03;i\x98\x1b\x97g\x029\x1f\xfeoJ\x01\ +\x0f\x1b\xfe\xf4i\x01\xe9}\x01\xe2\x90\xfe\xae}\xfe\x17\ +\x00\x00\x01\x00V\xfe\x00\x04j\x05\xb6\x00\x1d\x00.@\ +\x18\x09\x04\x0b\x0b\x00JY\x0b\x0b\x05\x04\x12\x05\x08I\ +Y\x05\x03\x12\x17IY\x12\x1c\x00?+\x00\x18?+\ +\x00\x18?\x129/+\x11\x12\x00910\x01\x22\x07\ +\x03#\x01!\x07!\x03632\x00\x15\x14\x02\x04#\ +\x22'5\x16326\x1254&\x02\x0a\x5c%\x87\ +\xac\x015\x02\xdf\x1e\xfd\xcbq?J\xec\x01\x0e\xa5\xfe\ +\xd5\xc1\x98q}w\x91\xe1\x80\xbe\x02\x8f\x08\xfdy\x05\ +\xb6\x99\xfd\xf7\x0d\xfe\xe3\xfe\xe6\xfe\x9e\xbe/\x9c5\x98\ +\x01&\xb6\xb9\xcc\x00\x01\x00;\xfe\x0a\x03h\x04H\x00\ +\x1f\x00.@\x18\x16\x11\x18\x18\x0dFY\x18\x18\x12\x11\ +\x15\x12\x15FY\x12\x0f\x00\x07FY\x00\x1b\x00?+\ +\x00\x18?+\x00\x18?\x129/+\x11\x12\x0091\ +0\x01\x22&'5\x16\x1632\x1254&#\x22\ +\x07\x03#\x13!\x07!\x03632\x16\x16\x15\x14\x02\ +\x06\x01ND^+)[?\xa6\xcc\x7frK4c\ +\xa8\xea\x02C\x1e\xfedFS3l\xab]\x7f\xf2\xfe\ +\x0a\x1b\x18\x9e\x19$\x01,\xf0\x8f\xa0\x12\xfe)\x04H\ +\x90\xfe\xb2\x13n\xcb\x86\xcb\xfe\xc5\xae\x00\x01\xff\x9c\xfe\ +\x83\x06\xf0\x05\xb6\x00\x15\x00)@\x17\x00\x03\x13\x06\x10\ +\x09\x06\x15\x07\x04\x01\x03\x12\x15\x12\x0d\x22\x0f\x0aIY\ +\x0f\x12\x00?+\x00\x18??3?33\x12\x179\ +10\x01\x013\x01\x133\x03\x013\x01\x013\x03#\ +\x13#\x01\x03#\x13\x01#\x02H\xfe\x93\xbb\x01h\x93\ +\xa6\x93\x02}\xcf\xfd^\x01%\xb8s\xa1O`\xfe\x96\ +\x9a\xa6\x9a\xfdw\xd1\x03\x00\x02\xb6\xfdF\x02\xba\xfdF\ +\x02\xba\xfd!\xfd\xc5\xfd\xe7\x01}\x02\xdb\xfd%\x02\xdb\ +\xfd%\x00\x00\x01\xff\xdd\xfe\x87\x06\xe7\x04\x5c\x00<\x00\ +@@\x22:\x01\x1a\x01GY\x1e\x1a\x1a<\x1c\x0f<\ +\x153\x22(\x11\x16\x11FY#\x16\x10/\x0a\x05\x0a\ +FY4\x05\x16\x00?3+\x11\x003\x18?3+\ +\x11\x003\x18???\x129/3+\x11\x0031\ +0\x01#\x0e\x02#\x22'7\x16326\x1254\ +&#\x22\x075632\x16\x15\x073\x133\x033\ +>\x0232\x17\x07&#\x22\x06\x02\x15\x14\x1632\ +7\x03#\x13&&547#\x03#\x03\x06\xa2!\ +\x92\xd4\x85C8\x195/i\xabchc1?W\ +2\xaa\xb4\x04\xa8d\x9ai\xa4\x1e\x99\xcfzO>\x1e\ +67h\xa4bbdNBo\xa4J\x9f\x9a\x04\xaa\ +g\x97\x01\xe9\x98\xe5\x80\x10\x8b\x10\x9a\x01\x10\x91\x8b\x92\ +\x0e\x89\x12\xd7\xcfL\x01\xde\xfe\x22\x93\xecs\x12\x89\x0e\ +\x96\xfe\xed\x93\x8a\x92\x16\xfd\xfa\x01g\x0b\xdb\xbd8 \ +\xfe\x17\x00\xff\xff\xff\xfa\xfeH\x04'\x05\xcb\x02&\x01\ +\xb1\x00\x00\x00\x07\x03\x7f\x01d\x00\x00\xff\xff\xff\xfc\xfe\ +H\x03F\x04\x5c\x02&\x01\xd1\x00\x00\x00\x07\x03\x7f\x01\ +\x10\x00\x00\x00\x01\x00T\xfe\x85\x05/\x05\xb6\x00\x0e\x00\ +\x22@\x12\x0b\x06\x0e\x03\x08\x0c\x09\x03\x08\x12\x03\x22\x05\ +\x00IY\x05\x12\x00?+\x00\x18???3\x12\x17\ +910%3\x03#\x13#\x01\x03#\x013\x03\x01\ +3\x01\x03\xc1\x9fp\xa2R<\xfe4\x98\xac\x015\xac\ +\x97\x02\xc0\xd1\xfd!\x9c\xfd\xe9\x01{\x02\xd5\xfd+\x05\ +\xb6\xfd8\x02\xc8\xfd%\x00\x01\x00;\xfe\x85\x04#\x04\ +H\x00\x0e\x00\x22@\x12\x0e\x09\x02\x03\x0b\x00\x0c\x0f\x0b\ +\x15\x06\x22\x08\x03FY\x08\x15\x00?+\x00\x18??\ +?3\x12\x17910\x013\x01\x013\x03#\x13#\ +\x01\x03#\x133\x03\x03^\xc5\xfd\xdb\x01\x1b\xb0q\xa0\ +PN\xfe\x9cs\xa8\xe8\xa6o\x04H\xfd\xe5\xfe`\xfd\ +\xf8\x01{\x02#\xfd\xdd\x04H\xfd\xf7\x00\x01\x00T\x00\ +\x00\x05-\x05\xb6\x00\x12\x00+@\x16\x0c\x0f\x12\x02\x05\ +\x05\x04\x0d\x06\x0b\x09\x04\x0d\x04\x0d\x08\x10\x09\x03\x01\x08\ +\x12\x00?3?3\x1299//\x1199\x11\x12\ +\x17910!#\x03\x07#\x13\x07\x03#\x013\x03\ +7\x133\x07\x013\x01\x04\x0c\xba\xf4+\x89P}}\ +\xac\x015\xac\x97\x87E\x88\x1f\x01\x87\xd3\xfdf\x02\x00\ +\xcd\x01y`\xfd\xb4\x05\xb6\xfd8\x87\x01?\x8d\x01\x8f\ +\xfd^\x00\x00\x01\x005\x00\x00\x04?\x04F\x00\x13\x00\ +(@\x15\x08\x05\x0b\x0c\x0f\x12\x06\x06\x11\x06\x11\x06\x13\ +\x04\x01\x09\x02\x0f\x0e\x01\x15\x00?3?3\x1299\ +99//\x12\x179103#\x133\x037\x13\ +3\x07%3\x01\x07\x01#\x03\x07#\x13'\xdb\xa6\xe6\ +\xa8o{E\x82%\x01\x0a\xc4\xfd\xf0\x16\x01\x5c\xbf\xbc\ +)\x81JL\x04F\xfd\xf7u\x01D\xac\xfc\xfe\x1el\ +\xfe\x08\x01\x1f\xc5\x01Xs\x00\x00\x01\x00V\x00\x00\x05\ +)\x05\xb6\x00\x13\x00)@\x14\x02\x10\x05\x0a\x0f\x07\x08\ +\x07IY\x0c\x08\x08\x05\x11\x0a\x03\x01\x05\x12\x00?3\ +?3\x129/3+\x11\x003\x11\x129910\ +!#\x01\x07\x03#\x13#7373\x073\x07#\ +\x03\x013\x01\x04\x0a\xba\xfe\xdb\xae}\xaa\xec\x94!\x93\ +)\xaa'\xbf!\xbeP\x02\xbc\xcf\xfd\x83\x02\xd1\x81\xfd\ +\xb0\x04f\x98\xb8\xb8\x98\xfe\x8a\x02\xc6\xfd\x85\x00\x01\x00\ +9\x00\x00\x04!\x06\x14\x00\x16\x00*@\x15\x11\x0b\x14\ +\x0c\x07\x16\x00\x16GY\x04\x00\x00\x0c\x02\x00\x0c\x0f\x10\ +\x14\x15\x00?3??\x129/3+\x11\x003\x11\ +\x129910\x13373\x07!\x07!\x03\x06\x07\ +3\x013\x01\x01#\x03\x07\x03#\x01#\xc7\x95)\xa8\ +)\x01\x02\x1d\xfe\xfe=40\x04\x02\x0e\xc9\xfe+\x01\ +'\xbb\xeb\x98R\xaa\x01\x09\x98\x05\x5c\xb8\xb8\x83\xfe\xd9\ +\xe2\xa1\x02\x19\xfe-\xfd\x8b\x02\x0c{\xfeo\x04\xd9\x00\ +\x01\x00\xba\x00\x00\x05\xc7\x05\xb6\x00\x0c\x00!@\x11\x09\ +\x02\x0c\x03\x04\x07\x0a\x03\x01\x04\x12\x07\x06IY\x07\x03\ +\x00?+\x00\x18?3?\x11\x12\x17910!#\ +\x01\x03#\x01!7!\x03\x013\x01\x04\xbe\xc4\xfe3\ +\x97\xaa\x01\x14\xfe\xba!\x01\xf0\x98\x02\xc1\xd3\xfd\x1e\x02\ +\xd5\xfd+\x05\x1f\x97\xfd8\x02\xc8\xfd%\x00\x00\x01\x00\ +N\x00\x00\x04\xcb\x04H\x00\x0c\x00!@\x11\x0c\x05\x02\ +\x03\x07\x0a\x00\x0f\x04\x07\x15\x0a\x09FY\x0a\x0f\x00?\ ++\x00\x18?3?\x11\x12\x17910\x013\x01\x01\ +#\x01\x03#\x13!7!\x03\x04\x06\xc5\xfd\xd9\x01\x7f\ +\xc1\xfe\x9as\xa6\xc7\xfe\xa4\x1f\x02\x04o\x04H\xfd\xe5\ +\xfd\xd3\x02#\xfd\xdd\x03\xb6\x92\xfd\xf7\x00\x01\x00V\xfe\ +\x83\x05s\x05\xb6\x00\x0f\x00%@\x14\x0c\x07IY\x0c\ +\x0c\x05\x0e\x0a\x03\x09\x12\x03\x22\x05\x00IY\x05\x12\x00\ +?+\x00\x18???3\x129/+10%3\ +\x03#\x13#\x13!\x03#\x013\x03!\x133\x04^\ +\xa0q\xa1O\xa5\x8f\xfdl\x91\xaa\x015\xaa\x83\x02\x94\ +\x85\xa8\x9c\xfd\xe7\x01}\x02\xb0\xfdP\x05\xb6\xfd\x92\x02\ +n\x00\x01\x00;\xfe\x85\x04\x8b\x04H\x00\x0f\x00%@\ +\x14\x01\x0cFY\x01\x01\x0a\x03\x0f\x0f\x0e\x15\x08\x22\x0a\ +\x05FY\x0a\x15\x00?+\x00\x18???3\x129\ +/+10\x01\x03!\x133\x033\x03#\x13#\x13\ +!\x03#\x13\x01\xcba\x02\x17b\xa8\xca\x91q\xacP\ +\x8bh\xfd\xeai\xa8\xea\x04H\xfe5\x01\xcb\xfcE\xfd\ +\xf8\x01{\x01\xee\xfe\x12\x04H\x00\x01\x00V\x00\x00\x06\ +\xbe\x05\xb6\x00\x0d\x00$@\x13\x09\x04IY\x09\x09\x06\ +\x0b\x07\x03\x02\x06\x12\x0b\x00IY\x0b\x03\x00?+\x00\ +\x18?3?\x11\x129/+10\x01\x01#\x13!\ +\x03#\x013\x03!\x13!\x07\x05T\xfe\xe9\xa7\x8f\xfd\ +l\x91\xaa\x015\xaa\x83\x02\x94\x85\x01\xf3\x1e\x05\x1f\xfa\ +\xe1\x02\xb0\xfdP\x05\xb6\xfd\x92\x02n\x97\x00\x00\x01\x00\ +;\x00\x00\x05\xe7\x04H\x00\x0d\x00$@\x13\x01\x0aF\ +Y\x01\x01\x0c\x03\x0d\x0f\x08\x0c\x15\x03\x06FY\x03\x0f\ +\x00?+\x00\x18?3?\x11\x129/+10\x01\ +\x03!\x13!\x07!\x03#\x13!\x03#\x13\x01\xcba\ +\x02\x17b\x02\x04\x1e\xfe\xa4\xc9\xaah\xfd\xeai\xa8\xea\ +\x04H\xfe5\x01\xcb\x92\xfcJ\x01\xee\xfe\x12\x04H\x00\ +\x01\x00V\xfe\x00\x07N\x05\xb6\x00\x1f\x000@\x19\x08\ +\x01\x0a\x0a\x1dJY\x0a\x0a\x06\x01\x05\x12\x06\x03IY\ +\x06\x03\x11\x16IY\x11\x1c\x00?+\x00\x18?+\x00\ +\x18?3\x129/+\x11\x12\x00910!#\x01\ +!\x01#\x01!\x03632\x00\x15\x14\x02\x04#\x22\ +'5\x16326\x1254&#\x22\x07\x04'\xae\ +\x01\x14\xfd\x87\xfe\xec\xaa\x015\x03\xd1\x91?J\xee\x01\ +\x0c\xa5\xfe\xd4\xc1\x97q}w\x91\xe1\x80\xbe\xad\x5c%\ +\x05\x1f\xfa\xe1\x05\xb6\xfd^\x0d\xfe\xe2\xfd\xe6\xfe\x9f\xbf\ +/\x9c5\x98\x01&\xb6\xb9\xcc\x08\x00\x00\x01\x00;\xfe\ +\x0a\x05\xfe\x04H\x00!\x000@\x19\x00\x02\x1b\x02\x17\ +FY\x02\x02 \x1b\x1f\x15 \x1dFY \x0f\x0a\x10\ +FY\x0a\x1b\x00?+\x00\x18?+\x00\x18?3\x12\ +9/+\x11\x12\x00910\x01632\x16\x16\x15\ +\x14\x02\x06#\x22'5\x16\x16326654&\ +#\x22\x07\x03#\x13!\x03#\x13!\x03\xfcS:m\ +\xac\x5c\x80\xf1\xa4qY*X>m\xaa\x5c\x7fqP\ +5b\xaa\xcb\xfe\x10\xc9\xa8\xea\x03=\x02j\x13m\xca\ +\x88\xcb\xfe\xc4\xad3\x9e\x19$\x87\xfa\x9b\x8f\xa0\x14\xfe\ ++\x03\xb6\xfcJ\x04H\x00\x02\x00\x96\xff\xac\x05y\x05\ +\xcd\x00-\x009\x003@\x1d\x0d\x03%.\x04+\x10\ ++4JY\x0a\x05IY\x0a\x10\x17\x1cIY\x17\x04\ +\x10#IY\x10\x13\x00?+\x00\x18?+\x00\x18\x10\ +\xc4++\x11\x12\x00\x17910\x01\x14\x02\x07\x163\ +27\x15\x06#\x22&'\x06\x06#\x22\x00\x11\x10\x12\ +$32\x17\x07&#\x22\x04\x02\x15\x14\x16327\ +&54\x12632\x16\x016\x1254&#\x22\ +\x06\x02\x15\x14\x05y\xbe\xa4.@CJ@WQ\x8b\ +.9Z4\xfb\xfe\xe7\xbf\x01V\xd4y}:]a\ +\x9f\xfe\xfc\x8e\xbe\xa8*\x1cVu\xc9\x80\x8b\x8e\xfe!\ +\x89\xa09<\xbe<\xe5{y\xc3\ +\x83\x83\xfe\xbdE \xf3\xd3\xc0\x01A\xa9\x18\x8e\x19\x83\ +\xfe\xfc\xa6\x89\xa2\x06o\x9b\x87\xdc|\x8ez\x9a\xfe\xef\ +Q\x10\x12\x8b\x12\xff\xff\x00\x96\xfeH\x05\x0a\x05\xcb\x02\ +&\x00&\x00\x00\x00\x07\x03\x7f\x027\x00\x00\xff\xff\x00\ +b\xfeH\x03\xaa\x04\x5c\x02&\x00F\x00\x00\x00\x07\x03\ +\x7f\x01w\x00\x00\x00\x01\x00\xba\xfe\x83\x04\xb4\x05\xb6\x00\ +\x0b\x00 @\x10\x03\x22\x0b\x07\x08\x07IY\x08\x03\x05\ +\x00IY\x05\x12\x00?+\x00\x18?+\x11\x003\x18\ +?10%3\x03#\x13#\x01!7!\x07!\x02\ +\x08\x9aq\xa0P\xa6\x01\x15\xfej!\x03\xd9\x1e\xfeh\ +\x9c\xfd\xe7\x01}\x05\x1f\x97\x97\x00\x01\x00;\xfe\x85\x06\ +\xb0\x04\x5c\x009\x002@\x1a&-#*$\x0f\x17\ +#\x15\x07\x22\x11\x1d*\x1dFY1*\x10\x08\x03G\ +Y\x08\x16\x00?+\x00\x18?3+\x11\x003\x18?\ +?3?\x11\x129910%\x14\x16327\x03\ +#\x13&547\x13654#\x22\x06\x06\x07\x03\ +#\x13654&#\x22\x06\x06\x07\x03#\x133\x07\ +36632\x16\x1736632\x16\x15\x14\x06\ +\x07\x03\x06\x06\x0e%\x1d-3n\xacO\x85\x0f\x5c\x12\ +\x8dQ\x9ew\x1fk\xa8\x94\x12>KT\x9fy!e\ +\xa8\xea\x8b\x16\x0aW\xad\x5cqz\x0b\x08V\xc2c\x7f\ +\x8b\x0e\x08X\x0b\xba '\x14\xfd\xfe\x01k$\x8a0\ +<\x01\xaa].\x90t\xd5\x92\xfe\x0c\x02\xb4^)F\ +Nx\xdf\x9d\xfe%\x04H\xcbwh\x82t}y\x8b\ +\x8b)P-\xfel,\xff\xff\x00\xbc\x00\x00\x04\xc3\x05\ +\xb6\x02\x06\x00<\x00\x00\x00\x01\x00b\xfe\x14\x04\x12\x04\ +H\x00\x0d\x00\x10\xb6\x0d\x07\x03\x09\x0f\x07\x1b\x00??\ +3\x12910%67\x013\x01\x03#\x13\x033\ +\x13\x16\x17\x01u3\x85\x013\xb2\xfd\x8cg\xa8g\x94\ +\xa8D\x0d\x12\xc7y\xeb\x02\x1d\xfb\xb4\xfe\x18\x01\xe8\x04\ +L\xfd\xe9n\xfc\x00\x01\x00m\x00\x00\x04\xc3\x05\xb6\x00\ +\x10\x00%@\x12\x00\x0f\x09\x07\x0b\x0c\x0bIY\x04\x0c\ +\x0c\x09\x01\x0f\x03\x09\x12\x00??3\x129/3+\ +\x11\x003\x11\x12910\x01\x013\x01\x07!\x07!\ +\x03#\x13!7!7\x033\x02\x19\x01\xe9\xc1\xfd\x8d\ +\x0a\x01\x22 \xfe\xe1J\xacL\xfe\xee \x01\x15\x08\xee\ +\xaa\x02\xcb\x02\xeb\xfcg#\x9a\xfe\xa0\x01`\x9a+\x03\ +\x91\x00\x01\xff\xe5\xfe\x14\x04\x12\x04H\x00\x13\x00!@\ +\x10\x13\x0a\x03\x0f\x0f\x0a\x1b\x08\x0c\x0d\x0cGY\x05\x0d\ +\x15\x00?3+\x11\x003\x18??3\x12910\ +%67\x013\x01!\x07!\x03#\x13#73\x03\ +3\x13\x16\x17\x01u3\x85\x013\xb2\xfd\x8e\x01\x00\x1b\ +\xfe\xfeL\xa8L\xf6\x1b\xf4\x92\xa8D\x0d\x12\xc7y\xeb\ +\x02\x1d\xfb\xb8}\xfe\x91\x01o}\x04H\xfd\xe9n\xfc\ +\x00\x00\x01\xff\x98\xfe\x83\x04\xd1\x05\xb6\x00\x0f\x00 @\ +\x10\x06\x0c\x08\x0d\x0a\x03\x08\x12\x03\x22\x05\x00IY\x05\ +\x12\x00?+\x00\x18???3\x129910%\ +3\x03#\x13#\x03\x01#\x01\x013\x13\x013\x01\x03\ +\x81\xa4q\xa2R\x5c\xd3\xfe\x1d\xba\x02T\xfe\xf9\xac\xcb\ +\x01\xbb\xba\xfd\xd5\x9c\xfd\xe7\x01}\x02\x81\xfd\x7f\x03\x08\ +\x02\xae\xfd\xcd\x023\xfdJ\x00\x00\x01\xff\xf2\xfe\x85\x04\ +?\x04H\x00\x0f\x00 @\x10\x00\x06\x02\x07\x04\x0f\x02\ +\x15\x0d\x22\x0f\x0aFY\x0f\x15\x00?+\x00\x18??\ +?3\x129910\x01\x01#\x01\x033\x13\x013\ +\x01\x133\x03#\x13#\x02\x0e\xfe\xa4\xc0\x01\xd9\xee\xa8\ +\xae\x01J\xc2\xfe:\xbc\x96q\xa2R=\x01\xb2\xfeN\ +\x025\x02\x13\xfed\x01\x9c\xfd\xe5\xfe`\xfd\xf8\x01{\ +\x00\x00\x01\x00\xba\xfe\x85\x06=\x05\xb6\x00\x0f\x00'@\ +\x14\x0d\x03\x02\x22\x0a\x06\x07\x06IY\x07\x03\x0f\x0b\x04\ +\x0bIY\x04\x12\x00?+\x11\x003\x18?+\x11\x00\ +3\x18??10%\x03#\x13!\x01!7!\x07\ +!\x03!\x013\x01\x05\xcdq\xa2P\xfc/\x01\x17\xfe\ +j\x1f\x03\xdf \xfed\xf4\x02u\x01\x14\xac\xfe\xec\x98\ +\xfd\xed\x01{\x05\x1d\x99\x99\xfb}\x05\x1c\xfa\xe2\x00\x00\ +\x01\x00Z\xfe\x85\x04\xf8\x04H\x00'\x00/@\x18\x1a\ +\x1d%\x0a\x0f\x15\x22\x00$%$FY%\x0f\x11\x05\ +\x1d\x05FY\x16\x1d\x16\x00?3+\x11\x003\x18?\ ++\x11\x003\x18??\x11\x12910\x01\x03\x06\x15\ +\x1432667\x133\x03\x06\x15\x14\x16327\ +\x03#\x13&&5#\x06\x06#\x22&547\x13\ +!7!\x07\x02;v\x13\x94Y\xab\x81!d\xa8\xb0\ +\x0b#\x1d-3n\xaeQ?@\x08\x5c\xb1a\x83\x90\ +\x15r\xfe\xc9\x1d\x03\x18\x1e\x03\xb6\xfd\xdbU0\x95z\ +\xe1\x9b\x01\xdb\xfc\xc6,& )\x14\xfd\xfe\x01k\x10\ +dexe\x8e\x840v\x02\x12\x92\x92\x00\x00\x01\x00\ +\xf8\xfe\x85\x05'\x05\xb6\x00\x1a\x00)@\x15\x04\x06\x0c\ +\x13\x06IY\x13\x13\x03\x17\x0c\x03\x01\x22\x03\x19IY\ +\x03\x12\x00?+\x00\x18??3\x129/+\x11\x12\ +\x00910\x01#\x13#\x13\x06#\x22&547\ +\x133\x03\x06\x15\x14\x163267\x133\x013\x04\ +;\xa1O\xa3\x7f\xd9\xad\xa7\xa0\x10u\xaaq\x10R`\ +W\xae\x88\x96\xac\xfe\xeb\x9c\xfe\x85\x01{\x02XX\x91\ +\x814T\x02\x1c\xfd\xe4K(GH\x1f0\x02\xcf\xfa\ +\xe6\x00\x01\x00\x9c\xfe\x85\x043\x04H\x00\x1c\x00)@\ +\x15\x14\x16\x1c\x05\x16FY\x05\x05\x10\x09\x1c\x0f\x0e\x22\ +\x10\x0bFY\x10\x15\x00?+\x00\x18??3\x129\ +/+\x11\x12\x00910\x01\x03\x06\x15\x14326\ +773\x033\x03#\x13#\x1267#\x06#\x22\ +&546\x13\x01\x96>\x12\x93\x97\xd03\x18\xa8\xcb\ +\x92q\xacP\x8fS#\x15\x08\xa9\xc8\x85\x8f\x0bE\x04\ +H\xfe\xdf^)\x94\xed\xe0o\xfcE\xfd\xf8\x01{\x01\ +\x83\x84?\xc7\x92\x82&J\x01E\x00\x00\x01\x00\xf8\x00\ +\x00\x05'\x05\xb6\x00\x1a\x002@\x18\x01\x18\x03\x06\x15\ +\x12\x13\x13\x0b\x05\x05\x00\x0b\x12\x06IY\x12\x12\x18\x0b\ +\x03\x00\x12\x00??39/+\x11\x12\x009\x18/\ +\x119/\x113\x113\x12910!\x13\x06\x07\x03\ +#\x13 \x1147\x133\x03\x06\x15\x14\x163\x133\ +\x0367\x133\x01\x03F\x7f\x94bB\x87>\xfe\xb4\ +\x0cy\xaaw\x0aWeJ\x89G_\x98\x96\xac\xfe\xcb\ +\x02X:\x12\xfe\xcd\x01'\x01\x171;\x023\xfd\xcb\ +.(KH\x01Z\xfe\xb2\x0e5\x02\xcf\xfaJ\x00\x00\ +\x01\x00\x9c\x00\x00\x041\x04H\x00\x1d\x004@\x19\x11\ +\x0b\x14\x17\x08\x05\x06\x06\x1d\x16\x16\x0e\x1d\x05\x17FY\ +\x05\x05\x0e\x0b\x1d\x0f\x0e\x15\x00??3\x129/+\ +\x11\x12\x009\x18/\x119/\x113\x113\x1291\ +0\x01\x03\x06\x15\x14\x17\x133\x036\x1373\x03#\ +\x1367#\x06\x07\x03#7\x22&546\x13\x01\ +\x96>\x12\x87?\x7f=\xd0S\x18\xa8\xe9\xacA\x1d-\ +\x08m\x837\x7f5\x80\x92\x0fA\x04H\xfe\xddZ+\ +\x92\x04\x01#\xfe\xecJ\x01rs\xfb\xb8\x015\x8d\x84\ +\x8e-\xfe\xf8\xfc\x88\x8a+\x5c\x010\x00\x01\x00T\x00\ +\x00\x04\x83\x05\xb6\x00\x15\x00\x1f@\x0f\x00\x13\x02\x02\x0e\ +IY\x02\x02\x13\x14\x03\x08\x13\x12\x00?3?\x129\ +/+\x11\x12\x00910\x0163 \x11\x14\x07\x03\ +#\x13654&#\x22\x06\x07\x03#\x013\x01\xb8\ +\xde\xa5\x01H\x0cw\xacy\x0aT`Y\xa8\x8a\x98\xac\ +\x015\xac\x03\x5cZ\xfe\xe83:\xfd\xcf\x023.*\ +II\x1f1\xfd3\x05\xb6\x00\x00\x01\x00;\x00\x00\x03\ +\xd3\x04H\x00\x19\x00\x1f@\x0f\x0f\x13\x0a\x13\x05FY\ +\x13\x13\x0a\x0b\x0f\x00\x0a\x15\x00?3?\x129/+\ +\x11\x12\x00910!\x13654#\x22\x06\x07\x07\ +#\x133\x02\x06\x0736632\x16\x15\x14\x07\x03\ +\x02\xd9>\x12\x93\x9a\xd6,\x17\xa8\xea\xacU!\x0f\x08\ +Y\xb1`\x83\x92\x179\x01#[,\x93\xf8\xdbj\x04\ +H\xfel~2i\x5c\x8f\x84\ +\xb1\xcc\x8dwQJa\xa8\xe8\xa6o\x04H\xfe\x1a\x19\ +\xdd\xb8\xc7\xfe\xc9\xac3\x9e\x19$\x01!\xf7\x8e\xa5\x18\ +\xfe/\x04H\xfd\xf7\x00\x00\x01\xff\xbe\xfe\x85\x051\x05\ +\xb6\x00\x17\x00$@\x14\x04\x22\x17\x08IY\x17\x03\x0d\ +\x12IY\x06\x01IY\x06\x15\x0d\x12\x00??++\ +\x00\x18?+\x00\x18?10\x01\x013\x03#\x13#\ +\x01!\x0a\x02\x06#\x22'5\x163266\x12\x13\ +\x051\xfe\xea\xaa\xf6\xc9\xf0\xa8\x01\x16\xfe\x81K\xb0\x81\ +\xae\x80L143Si^\x91\x98\x05\xb6\xfa\xe2\xfd\ +\xed\x01{\x05\x1d\xfe\xdc\xfd\x9b\xfe\xd6\x81\x17\x96\x15X\ +\xd0\x01\xd8\x025\x00\x01\xff\xa2\xfe\x85\x04\x08\x04P\x00\ +\x1f\x00&@\x14\x03\x22\x1d\x08FY\x1d\x0f\x05\x00F\ +Y\x05\x15\x10\x15FY\x10\x12\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?10%3\x03#\x13#\x13\ +&#\x22\x06\x06\x07\x0e\x02#\x22'5\x16326\ +67\x126632\x17\x03B\xa3\xe5\xa6\xc7\xa8\xcf\ +''M`RSTt\x8cd/\x1f\x1c'@[\ +W@Wz\xa6\x84~x\x91\xfd\xf4\x01{\x03\xba\x09\ +=\x97\xed\xf0\xc7Y\x0e\x91\x0aL\xab\xbb\x01\x02\xbeW\ +\x1f\x00\x01\x00V\xfe\x00\x05s\x05\xb6\x00\x15\x00\x22@\ +\x12\x0f\x0aIY\x0f\x0f\x0c\x11\x0d\x03\x0c\x12\x00\x05I\ +Y\x00\x1c\x00?+\x00\x18??3\x129/+1\ +0\x01\x22'5\x16326\x13\x13!\x03#\x013\ +\x03!\x133\x01\x02\x00\x01\xcb\x94t}\x87\xd4\xdf8\ +s\xfdl\x91\xaa\x015\xaa\x83\x02\x94\x85\xa8\xfe\xe3D\ +\xfe\xc6\xfe\x001\xa45\xe0\x01\x09\x02'\xfdP\x05\xb6\ +\xfd\x92\x02n\xfa\xb7\xfe\xbd\xfe\xd6\x00\x00\x01\x00;\xfe\ +\x0a\x04\x8b\x04H\x00\x15\x00\x22@\x12\x01\x12FY\x01\ +\x01\x14\x03\x15\x0f\x14\x15\x08\x0dFY\x08\x1b\x00?+\ +\x00\x18??3\x129/+10\x01\x03!\x133\ +\x03\x02\x06#\x22'5\x163267\x13!\x03#\ +\x13\x01\xcba\x02\x17b\xa8\xe1?\xdf\xc5y`[|\ +\x7f\x93/\x5c\xfd\xeai\xa8\xea\x04H\xfe5\x01\xcb\xfb\ +\xd9\xfe\xdc\xf31\xa2?\xb9\xe4\x01\xb3\xfe\x12\x04H\x00\ +\x01\x00V\xfe\x83\x05s\x05\xb6\x00\x0f\x00%@\x14\x0c\ +\x07IY\x0c\x0c\x05\x0e\x0a\x03\x09\x12\x03\x22\x05\x00I\ +Y\x05\x12\x00?+\x00\x18???3\x129/+\ +10%3\x03#\x13#\x13!\x03#\x013\x03!\ +\x133\x04^\xb0\xf7\xc9\xef\xa7\x8f\xfdl\x91\xaa\x015\ +\xaa\x83\x02\x94\x85\xa8\x9a\xfd\xe9\x01}\x02\xb0\xfdP\x05\ +\xb6\xfd\x92\x02n\x00\x01\x00;\xfe\x85\x04\x8b\x04H\x00\ +\x0f\x00%@\x14\x01\x0cFY\x01\x01\x0a\x03\x0f\x0f\x0e\ +\x15\x08\x22\x0a\x05FY\x0a\x15\x00?+\x00\x18??\ +?3\x129/+10\x01\x03!\x133\x033\x03\ +#\x13#\x13!\x03#\x13\x01\xcba\x02\x17b\xa8\xc8\ +\xa3\xe3\xa8\xc7\xa8h\xfd\xeai\xa8\xea\x04H\xfe5\x01\ +\xcb\xfcI\xfd\xf4\x01{\x01\xee\xfe\x12\x04H\x00\x01\x00\ +\xf8\xfe\x85\x05'\x05\xb6\x00\x19\x00)@\x15\x05\x07\x13\ +\x13\x07IY\x13\x13\x00\x17\x0c\x03\x02\x22\x00\x03IY\ +\x00\x12\x00?+\x00\x18??3\x129/+\x11\x12\ +\x00910!\x03#\x133\x13\x06# \x1147\ +\x133\x03\x06\x15\x14\x163267\x133\x01\x03N\ +R\xa0q\x99_\xd9\xad\xfe\xb9\x0cy\xaaw\x0aR`\ +X\xb0\x83\x98\xac\xfe\xcb\xfe\x85\x02\x17\x01\xbcX\x01\x17\ +1;\x023\xfd\xcb.(JI /\x02\xcf\xfaJ\ +\x00\x00\x01\x00\xcb\xfe\x85\x04`\x04H\x00\x1c\x00)@\ +\x15\x13\x16\x1c\x05\x16FY\x05\x05\x0c\x09\x1c\x0f\x0e\x22\ +\x0c\x0fFY\x0c\x15\x00?+\x00\x18??3\x129\ +/+\x11\x12\x00910\x01\x03\x06\x15\x14326\ +773\x03#\x03#\x133667#\x06#\x22\ +&546\x13\x01\xc5>\x12\x91\x9b\xd5.\x16\xa6\xe7\ +\x89R\xaal\x8c/!\x1a\x0a\x93\xd8\x87\x8f\x0fA\x04\ +H\xfe\xdf^)\x94\xf2\xdfk\xfb\xb8\xfe\x85\x02\x08\xe6\ +~F\xb8\x8f\x85*V\x015\x00\x01\x00T\xfe\x85\x06\ +\xb8\x05\xb6\x00\x18\x00%@\x13\x0a\x02\x16\x03\x13\x0c\x08\ +\x03\x07\x00\x13\x11\x22\x13\x0eIY\x13\x12\x00?+\x00\ +\x18?\x1133?3\x12\x17910!\x03#\x06\ +\x06\x07\x03#\x013\x133\x01!\x013\x03#\x13#\ +\x12\x127#\x01\x02\xa4\xa6\x08\x07+\x10\xbe\xa2\x015\ +\xf4\x95\x09\x02\x93\x01\x0a\xfe\xf0\xac\xf6\xc8\xef\xaa~\x86\ +\x1b\x06\xfd3\x05\x10H\xfbJ\xfc}\x05\xb6\xfbL\x04\ +\xb4\xfa\xe2\xfd\xed\x01{\x02N\x02wM\xfa\xee\x00\x00\ +\x01\x00=\xfe\x87\x05F\x04H\x00\x18\x00%@\x13\x0e\ +\x00\x07\x03\x18\x11\x0a\x0f\x16\x22\x09\x04\x18\x18\x13FY\ +\x18\x15\x00?+\x11\x0033\x18??3\x12\x179\ +10\x01\x06\x07\x01#\x03&'\x03#\x133\x13\x16\ +\x1767\x013\x033\x03#\x13#\x04\x85\x10e\xfe\ +y{n\x13\x04\xba\x92\xe8\xbas\x14\x04\x22W\x01\x9c\ +\xc7\xcb\xa4\xe2\xaa\xc7\x91\x03q#\xaa\xfd\x5c\x02\xa6q\ +X\xfc\x91\x04H\xfd+\x8eAM\x94\x02\xc3\xfcG\xfd\ +\xf8\x01y\xff\xff\xff\xd9\x00\x00\x03\x00\x05\xb6\x02\x06\x00\ +,\x00\x00\xff\xff\xff\x8b\x00\x00\x04\xb4\x07b\x02&\x00\ +$\x00\x00\x01\x07\x026\x00\x7f\x01R\x00\x0a\xb4\x02\x11\ +\x11\x05&\x00+\x115\xff\xff\x00b\xff\xec\x04\x85\x06\ +\x10\x02&\x00D\x00\x00\x01\x06\x026P\x00\x00\x0a\xb4\ +\x02##\x11&\x00+\x115\xff\xff\xff\x8b\x00\x00\x04\ ++\x07%\x02&\x00$\x00\x00\x01\x07\x00j\x00B\x01\ +R\x00\x0c\xb5\x03\x02\x22\x22\x05&\x00+\x1155\xff\ +\xff\x00b\xff\xec\x04`\x05\xd3\x02&\x00D\x00\x00\x01\ +\x06\x00j\xfd\x00\x00\x0c\xb5\x03\x0244\x11&\x00+\ +\x1155\xff\xff\xff\x89\x00\x00\x06\xdd\x05\xb6\x02\x06\x00\ +\x88\x00\x00\xff\xff\x00b\xff\xec\x06X\x04\x5c\x02\x06\x00\ +\xa8\x00\x00\xff\xff\x00V\x00\x00\x04\xa8\x07b\x02&\x00\ +(\x00\x00\x01\x07\x026\x00s\x01R\x00\x0a\xb4\x01\x0e\ +\x0e\x05&\x00+\x115\xff\xff\x00b\xff\xec\x04,\x06\ +\x10\x02&\x00H\x00\x00\x01\x06\x026\xf7\x00\x00\x0a\xb4\ +\x02%%\x11&\x00+\x115\x00\x02\x00T\xff\xec\x05\ +\x04\x05\xcd\x00\x19\x00#\x00&@\x14\x14\x1dIY\x14\ +\x14\x0d\x06\x06\x00IY\x06\x04\x0d\x1aIY\x0d\x13\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +\x22\x0756632\x00\x11\x14\x02\x00#\x22&5\ +4$!36554&\x012\x007# \x04\ +\x15\x14\x16\x02\xee\xdd\xd2y\xccz\xf5\x01\x11\xc9\xfe\x96\ +\xd5\xc8\xe0\x01\xba\x01\xd5i\x06\xbb\xfec\xc7\x01(D\ +j\xfe\x9f\xfe\xaa~\x055`\xa02&\xfe\xd4\xfe\xfb\ +\xfd\xfeN\xfe\xff\xb0\xa1\xfb\xe39\x1b\x1e\xc6\xe2\xfbP\ +\x01\x0e\xf2\x9a\xa7Ze\x00\x02\x00;\xff\xec\x03\x8d\x04\ +\x5c\x00\x18\x00\x22\x00&@\x14\x0e\x1cFY\x0e\x0e\x07\ +\x00\x00\x12FY\x00\x10\x07\x19FY\x07\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x012\x16\ +\x15\x14\x02\x06#\x22&54$!374&#\ +\x22\x06\x07566\x03267#\x22\x06\x15\x14\x16\ +\x02\x04\xba\xcf\x96\xf5\x93\x99\x9b\x01O\x012!\x04\x82\ +zK\x8cPd\x91:h\xb6.\x0d\xe5\xf2I\x04\x5c\ +\xdd\xbe\xbe\xfe\xa7\xbe\x85v\xb5\xccP\x8a\x8d.&\x91\ +.\x22\xfc\x1f\xbf\xa3wp5F\x00\xff\xff\x00T\xff\ +\xec\x05\x04\x07%\x02&\x02\xe1\x00\x00\x01\x07\x00j\x00\ +\x81\x01R\x00\x0c\xb5\x03\x0277\x05&\x00+\x115\ +5\xff\xff\x00;\xff\xec\x03\x8d\x05\xd3\x02&\x02\xe2\x00\ +\x00\x01\x06\x00j\x8c\x00\x00\x0c\xb5\x03\x0266\x11&\ +\x00+\x1155\xff\xff\xff\x9c\x00\x00\x06\xf0\x07%\x02\ +&\x01\xb0\x00\x00\x01\x07\x00j\x019\x01R\x00\x0c\xb5\ +\x02\x01%%\x05&\x00+\x1155\xff\xff\xff\xdd\xff\ +\xec\x06\xe7\x05\xd3\x02&\x01\xd0\x00\x00\x01\x07\x00j\x01\ +#\x00\x00\x00\x0c\xb5\x02\x01PP\x11&\x00+\x115\ +5\xff\xff\xff\xfa\xff\xec\x04'\x07%\x02&\x01\xb1\x00\ +\x00\x01\x07\x00j\x00\x04\x01R\x00\x0c\xb5\x02\x01;;\ +\x05&\x00+\x1155\xff\xff\xff\xfc\xff\xec\x03c\x05\ +\xd3\x02&\x01\xd1\x00\x00\x01\x07\x00j\xffz\x00\x00\x00\ +\x0c\xb5\x02\x01::\x11&\x00+\x1155\x00\x01\x00\ +\x10\xff\xec\x04Z\x05\xb6\x00\x1a\x00/@\x18\x15\x00\x00\ +\x14JY\x00\x00\x07\x18\x1a\x17\x18\x17IY\x18\x03\x07\ +\x0dJY\x07\x13\x00?+\x00\x18?+\x11\x003\x11\ +\x129\x18/+\x11\x00310\x01\x16\x16\x15\x14\x06\ +\x04#\x22&'5\x1632654&##7\ +\x01!7!\x07\x02#\xc1\xd4\x8c\xfe\xf4\xb6^\xbbA\ +\xb3\xb6\xb8\xd3\x92\x8d\x9f\x1a\x02\x02\xfd\xbb \x03\x1d\x1d\ +\x033\x04\xbe\xa6\x8f\xdav-$\xa4h\xaf\x9dts\ +\x89\x01\xe6\x9b\x8b\x00\x01\xffu\xfe\x14\x03\x8b\x04H\x00\ +\x19\x00/@\x18\x14\x00\x19\x16\x00\x12GY\x00\x00\x07\ +\x17\x17\x16FY\x17\x0f\x07\x0cFY\x07\x1b\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x003\x113\ +10\x01\x16\x16\x15\x14\x06\x04#\x22'5\x1632\ +654&##7\x01!7!\x07\x01\x81\xa4\xc9\ +\x89\xfe\xfe\xab\xc5~\x93\xb9\xb3\xd2\xac\xa8H\x19\x01\xe7\ +\xfd\xe5\x1f\x02\xdd\x1a\x01\xc5\x0d\xd8\xb1\x9f\xf5\x87F\x9c\ +X\xd3\xb8\x8f\x92r\x01\xfc\x90}\x00\xff\xff\x00V\x00\ +\x00\x05\x9e\x06\xb8\x02&\x01\xb2\x00\x00\x01\x07\x01M\x00\ +\xf0\x01R\x00\x0a\xb4\x01\x12\x12\x05&\x00+\x115\xff\ +\xff\x00q\xff\xec\x04^\x05f\x02&\x00X\x00\x00\x01\ +\x06\x01M-\x00\x00\x0a\xb4\x01\x1c\x1c\x11&\x00+\x11\ +5\xff\xff\x00V\x00\x00\x05\x9e\x07%\x02&\x01\xb2\x00\ +\x00\x01\x07\x00j\x00\xcf\x01R\x00\x0c\xb5\x02\x01\x22\x22\ +\x05&\x00+\x1155\xff\xff\x00q\xff\xec\x04^\x05\ +\xd3\x02&\x00X\x00\x00\x01\x06\x00j\x00\x00\x00\x0c\xb5\ +\x02\x01,,\x11&\x00+\x1155\xff\xff\x00\x96\xff\ +\xec\x05\x83\x07%\x02&\x002\x00\x00\x01\x07\x00j\x00\ +\xcf\x01R\x00\x0c\xb5\x03\x02//\x05&\x00+\x115\ +5\xff\xff\x00b\xff\xf0\x04\x1d\x05\xd3\x02&\x00R\x00\ +\x00\x01\x06\x00j\xe8\x00\x00\x0c\xb5\x03\x02//\x11&\ +\x00+\x1155\xff\xff\x00\x96\xff\xec\x05\x83\x05\xcd\x02\ +\x06\x02~\x00\x00\xff\xff\x00b\xff\xf0\x04\x1b\x04V\x02\ +\x06\x02\x7f\x00\x00\xff\xff\x00\x96\xff\xec\x05\x83\x07%\x02\ +&\x02~\x00\x00\x01\x07\x00j\x00\xcf\x01R\x00\x0c\xb5\ +\x04\x0333\x05&\x00+\x1155\xff\xff\x00b\xff\ +\xf0\x04\x1b\x05\xd3\x02&\x02\x7f\x00\x00\x01\x06\x00j\xe8\ +\x00\x00\x0c\xb5\x04\x0322\x11&\x00+\x1155\xff\ +\xff\x00\x12\xff\xec\x04o\x07%\x02&\x01\xc7\x00\x00\x01\ +\x07\x00j\xff\xf5\x01R\x00\x0c\xb5\x02\x0122\x05&\ +\x00+\x1155\xff\xff\x00\x12\xff\xec\x03B\x05\xd3\x02\ +&\x01\xe7\x00\x00\x01\x07\x00j\xffU\x00\x00\x00\x0c\xb5\ +\x02\x01//\x11&\x00+\x1155\xff\xff\xff\xfc\xff\ +\xec\x05P\x06\xb8\x02&\x01\xbd\x00\x00\x01\x07\x01M\x00\ +\x5c\x01R\x00\x0a\xb4\x01\x19\x19\x05&\x00+\x115\xff\ +\xff\xff;\xfe\x14\x04\x12\x05f\x02&\x00\x5c\x00\x00\x01\ +\x06\x01M\x99\x00\x00\x0a\xb4\x01\x1c\x1c\x11&\x00+\x11\ +5\xff\xff\xff\xfc\xff\xec\x05P\x07%\x02&\x01\xbd\x00\ +\x00\x01\x07\x00j\x00D\x01R\x00\x0c\xb5\x02\x01))\ +\x05&\x00+\x1155\xff\xff\xff;\xfe\x14\x04\x12\x05\ +\xd3\x02&\x00\x5c\x00\x00\x01\x06\x00j\x88\x00\x00\x0c\xb5\ +\x02\x01,,\x11&\x00+\x1155\xff\xff\xff\xfc\xff\ +\xec\x05P\x07s\x02&\x01\xbd\x00\x00\x01\x07\x01S\x00\ +\x87\x01R\x00\x0c\xb5\x02\x01))\x05&\x00+\x115\ +5\xff\xff\xff;\xfe\x14\x04(\x06!\x02&\x00\x5c\x00\ +\x00\x01\x06\x01S\xb3\x00\x00\x0c\xb5\x02\x01,,\x11&\ +\x00+\x1155\xff\xff\x00\xfa\x00\x00\x05'\x07%\x02\ +&\x01\xc1\x00\x00\x01\x07\x00j\x00\x8d\x01R\x00\x0c\xb5\ +\x02\x01**\x05&\x00+\x1155\xff\xff\x00\x9e\x00\ +\x00\x043\x05\xd3\x02&\x01\xe1\x00\x00\x01\x06\x00j\xd4\ +\x00\x00\x0c\xb5\x02\x01,,\x11&\x00+\x1155\x00\ +\x01\x00V\xfe\x83\x04j\x05\xb6\x00\x09\x00\x1c@\x0e\x06\ +\x22\x09\x02IY\x09\x03\x08\x03IY\x08\x12\x00?+\ +\x00\x18?+\x00\x18?10\x01\x07!\x033\x03#\ +\x13#\x01\x04j\x1e\xfd\xcb\xf4\x9br\xa2P\xa4\x015\ +\x05\xb6\x99\xfb\x7f\xfd\xe7\x01}\x05\xb6\x00\x01\x00;\xfe\ +\x85\x03^\x04H\x00\x09\x00\x1c@\x0e\x08\x22\x01\x04F\ +Y\x01\x0f\x00\x05FY\x00\x15\x00?+\x00\x18?+\ +\x00\x18?103\x13!\x07!\x033\x03#\x13;\ +\xea\x029\x1f\xfeo\xac\x8fn\xaeP\x04H\x90\xfc\xd5\ +\xfd\xf8\x01{\x00\xff\xff\x00V\x00\x00\x06T\x07%\x02\ +&\x01\xc5\x00\x00\x01\x07\x00j\x01'\x01R\x00\x0c\xb5\ +\x04\x03))\x05&\x00+\x1155\xff\xff\x00\x81\xff\ +\xec\x05\x85\x05\xd3\x02&\x01\xe5\x00\x00\x01\x07\x00j\x00\ +\x85\x00\x00\x00\x0c\xb5\x04\x0344\x11&\x00+\x115\ +5\x00\x01\x00\x19\xfey\x04b\x05\xb6\x00\x1b\x007@\ +\x1d\x06\x18\x19\x18IY\x03\x19\x19\x16\x1b\x1b\x02IY\ +\x1b\x03\x16\x07JY\x16\x12\x0c\x11JY\x0c\x22\x00?\ ++\x00\x18?+\x00\x18?+\x11\x12\x009\x18/3\ ++\x11\x00310\x01\x07!\x03!\x07!\x033\x03\ +\x06\x06#\x22'5\x1632677#\x13#7\ +3\x13\x04b \xfd\xd5m\x01F!\xfe\xbah\x8b=\ +\x18scC%.4(5\x0b\x1d\xaa\x89\x91\x1f\x91\ +\x8d\x05\xb6\x9b\xfe\x04\x96\xfe\x0a\xfe\xd5zu\x14\x8e\x13\ +>3\x87\x02\x89\x96\x02\x97\x00\x00\x01\xff\xfa\xfey\x03\ +^\x04H\x00\x1b\x007@\x1d\x1a\x10\x11\x10GY\x17\ +\x11\x11\x0e\x13\x13\x16FY\x13\x0f\x0e\x1bFY\x0e\x15\ +\x04\x09FY\x04\x22\x00?+\x00\x18?+\x00\x18?\ ++\x11\x12\x009\x18/3+\x11\x00310%\x03\ +\x06\x06#\x22'5\x1632677#\x13#7\ +3\x13!\x07!\x03!\x07!\x03\x01\x8d=\x1bqb\ +B&/3(6\x0b\x1c\xa6i\x98\x1b\x97g\x029\ +\x1f\xfeoJ\x01\x0f\x1b\xfe\xf4L\x8b\xfe\xdd\x7fp\x14\ +\x8e\x13>3\x87\x01\xe9}\x01\xe2\x90\xfe\xae}\xfe\xa2\ +\x00\x00\x01\xff\x98\xfey\x04\xd1\x05\xb6\x00\x19\x00'@\ +\x14\x10\x16\x12\x17\x14\x03\x12\x12\x0f\x00JY\x0f\x12\x05\ +\x0aJY\x05\x22\x00?+\x00\x18?+\x00\x18??\ +3\x129910%3\x03\x06\x06#\x22'5\x16\ +32677#\x03\x01#\x01\x013\x13\x013\x01\ +\x03\x85\x8b=\x1dpaB&02(6\x0b\x1aZ\ +\xd3\xfe\x1d\xba\x02T\xfe\xf9\xac\xcb\x01\xbb\xba\xfd\xd5\x93\ +\xfe\xd5~q\x14\x8e\x13>3\x87\x02\x81\xfd\x7f\x03\x08\ +\x02\xae\xfd\xcd\x023\xfdJ\x00\x00\x01\xff\xb6\xfey\x04\ +\x06\x04H\x00\x19\x00'@\x14\x00\x06\x02\x07\x04\x0f\x02\ +\x15\x19\x0aFY\x19\x15\x0f\x14FY\x0f\x22\x00?+\ +\x00\x18?+\x00\x18??3\x129910\x01\x01\ +#\x01\x033\x13\x013\x01\x133\x03\x06\x06#\x22'\ +5\x1632677#\x01\xd3\xfe\xa6\xc3\x01\xdb\xef\ +\xaa\xae\x01J\xc2\xfe9\xbd\x8d=\x1bpcB&0\ +2(6\x0b\x1cJ\x01\xb2\xfeN\x025\x02\x13\xfed\ +\x01\x9c\xfd\xe5\xfe^\xfe\xdd{t\x14\x8e\x13>3\x87\ +\x00\x00\x01\xff\x98\x00\x00\x04\xd1\x05\xb6\x00\x11\x00)@\ +\x14\x03\x05\x00\x07\x08\x07IY\x0f\x0c\x0a\x08\x08\x05\x0d\ +\x0a\x03\x02\x05\x12\x00?3?3\x129/\x1293\ ++\x11\x003\x12910\x01\x01#\x03\x01#\x01!\ +7!\x033\x13\x013\x01!\x07\x02\xbc\x01\x00\xb4\xd3\ +\xfe\x1d\xba\x02\x18\xfe\xec \x01\x11\xe8\xac\xcb\x01\xbb\xba\ +\xfe\x1b\x01\x0c!\x02\xbc\xfdD\x02\x81\xfd\x7f\x02\xbc\x9a\ +\x02`\xfd\xcd\x023\xfd\xa0\x9a\x00\x01\xff\xb6\x00\x00\x04\ +\x06\x04H\x00\x11\x00)@\x14\x0d\x04\x0f\x02\x0a\x11\x00\ +\x11GY\x07\x00\x00\x0f\x05\x02\x0f\x0c\x0f\x15\x00?3\ +?3\x129/3+\x11\x003\x11\x129910\ +\x13!\x033\x13\x013\x01!\x07!\x13#\x03\x01#\ +\x01!u\x01\x00\xd3\xaa\xae\x01J\xc2\xfew\x01\x04\x1b\ +\xfe\xf2\xe3\xa8\xc0\xfe\xa6\xc3\x01\xa8\xfe\xfc\x02u\x01\xd3\ +\xfed\x01\x9c\xfe-}\xfe\x08\x01\xb2\xfeN\x01\xf8\x00\ +\x02\x00`\x00\x00\x04\x91\x05\xb6\x00\x09\x00\x11\x00\x1d@\ +\x0f\x04\x0aJY\x04\x04\x07\x05\x03\x07\x11JY\x07\x12\ +\x00?+\x00\x18?\x129/+10\x134$!\ +3\x133\x01! \x01#\x22\x06\x15\x14!3`\x01\ +8\x01\x16\xb2\x87\xaa\xfe\xcb\xfe\xc1\xfeC\x02\xe2\xb1\xb5\ +\xcc\x01!\x9e\x01{\xd5\xf6\x02p\xfaJ\x02\xb4\x9f\x92\ +\xf0\xff\xff\x00b\xff\xec\x04\xc3\x06\x14\x02\x06\x00G\x00\ +\x00\x00\x02\x00f\xff\xec\x06D\x05\xb6\x00\x1a\x00%\x00\ +1@\x18\x06\x0f\x1a\x1a\x08\x10\x0f\x1bIY\x0f\x0f\x08\ +\x10\x03\x17\x22\x08\x22IY\x04\x08\x13\x00?3+\x11\ +\x003\x18?\x129/+\x11\x12\x009\x18/\x119\ +10\x01\x03\x06\x06#\x22'\x06#\x22&54\x00\ +!3\x133\x03\x06\x15\x14\x16327\x13\x05#\x22\ +\x06\x15\x14\x163267\x06Dg(\xc9\xa4\xd4G\ +\x82\xe0\xaa\xbb\x01U\x01$\x8b\x86\xac\xea\x08UO\xb0\ +/i\xfd\xb6u\xdb\xe1jgo\x97\x14\x03P\xfe\x16\ +\xc0\xba\xaa\xa8\xb9\xa5\xed\x01\x0d\x02p\xfb\xb4 'N\ +R\xd9\x01\xf4\xa2\xb5\xaf[l{f\x00\x02\x00b\xff\ +\xec\x06H\x06\x14\x00$\x001\x000@\x18\x0f\x1e\x1a\ +\x07\x07\x13\x1a!\x00\x1a,FY\x1a\x10\x03%\x13%\ +FY\x0c\x13\x16\x00?3+\x11\x003\x18?+\x00\ +\x18?\x11\x129/\x119910\x01\x14\x1632\ +67\x133\x03\x06\x06#\x22&'#\x06\x06#\x22\ +&54\x12632\x16\x17367\x133\x03\x06\ +\x0526\x1254&#\x22\x06\x02\x15\x14\x03\xc1S\ +Vdu\x1fB\xa4B+\xc4\xb3\x86\x9e\x17\x08a\xc9\ +p\x8a\x9b\x8c\xf4\x99a\x93)\x0a\x10\x1fL\xa6\xf4\x0e\ +\xfe\x00]\xc5yohd\xabh\x01+Tbz\x90\ +\x01=\xfe\xc1\xd5\xbc\x80m~o\xc2\xb0\xd7\x01`\xc5\ +dZ\x8a\x8c\x01b\xfb\x8eH\xe3\xb5\x01$\x9cnu\ +\xa3\xfe\xd8\xaa\xe3\x00\x01\x00\xf8\xff\xec\x06R\x05\xcb\x00\ +-\x00:@\x1d\x0c\x15\x1b\x07\x08'',\x15\x08\x07\ +JY\x08\x08,\x15\x15\x0fJY\x15\x04,#IY\ +,\x13\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x009\x18/\x11\x129\x12910\x0146\ +54&##732654&#\x22\x07'\ +6632\x16\x15\x14\x06\x07\x15\x16\x16\x15\x07\x14\x16\ +3267\x133\x03\x06\x06# \x02\xf2\x0a\x90\x9b\ +\xc7\x1d\xcb\xbe\xd5up\xa9\xb8Gs\xd5\x81\xab\xc9\xc6\ +\xae\x85l\x06NXgo\x1e`\xacf,\xc0\xb2\xfe\ +\xa4\x01'#U8ta\x8f\xa5\x91dhv{K\ +>\xae\x96\x99\xd6$\x06\x1b|v\x9de\x5cp\x8c\x01\ +\xd1\xfe\x16\xc9\xb1\x00\x01\x00\x98\xff\xec\x05m\x04\x5c\x00\ +*\x008@\x1c\x07\x07\x0c\x18!'\x13\x14\x14\x13F\ +Y\x14\x14\x0c!!\x1bFY!\x10\x0c\x03FY\x0c\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x009\x129\x119\x18/10\x01\x07\x1432\ +67\x133\x03\x06\x06# \x1174&##7\ +32654&#\x22\x06\x07'632\x16\x15\ +\x14\x06\x07\x15\x16\x16\x02\xe9\x02\xa6du\x1fB\xa6B\ ++\xc5\xb6\xfe\xbf\x04Vg\xa2\x1fk\x8a\x90XVH\ +\x82H5\xb0\xa1\x9d\xb1\x81\x83Z\x5c\x01dX\x97z\ +\x90\x01=\xfe\xc1\xd6\xbb\x01\x0eZTH\x91c[D\ +J'\x1f\x81T\x85{l\x96\x1d\x04\x0em\x00\x01\x00\ +\xf6\xfe\x83\x043\x05\xcb\x00%\x004@\x1b\x0c\x15\x1b\ +\x07\x08\x08\x07JY\x08\x08\x01\x15%\x22\x15\x0fJY\ +\x15\x04\x01\x22IY\x01\x12\x00?+\x00\x18?+\x00\ +\x18?\x11\x129/+\x11\x12\x009\x12910!\ +#\x13654!#732654&#\x22\ +\x06\x07'632\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\ +\x06\x073\x03#\x03\x5c\xa4L\x10\xfe\xe8\xf2\x1d\xd9\xac\ +\xd7raj\xb2WG\xce\xf8\xaf\xc8\xc1\xb6\x82\x80\x11\ +*\x9cq\xa2\x01dL+\xd1\x8d\xaf\x91_e?7\ +{\x89\xae\x96\x98\xd0)\x04\x13\x8ep\x1ef\xc1\xfd\xe7\ +\x00\x00\x01\x00\x98\xfe\x87\x03\x5c\x04\x5c\x00&\x004@\ +\x1b\x14\x1d#\x0f\x10\x10\x0fFY\x10\x10\x08\x1d\x06\x22\ +\x1d\x17FY\x1d\x10\x08\x03FY\x08\x15\x00?+\x00\ +\x18?+\x00\x18?\x11\x129/+\x11\x12\x009\x12\ +910\x01\x14\x06\x073\x03#\x13#66'4\ +&##732654&#\x22\x06\x07'6\ +32\x16\x15\x14\x06\x07\x15\x16\x16\x02\xee\x05\x1e\x91n\ +\xaaM\x8d\x22%\x03^_\xa2\x1fk\x8a\x90XVH\ +\x82H5\xb0\xa1\x9d\xb1\x81\x83Za\x01h\x16,\x99\ +\xfd\xfa\x01y\x9d\xa9\x1aP@\x91c[DJ'\x1f\ +\x81T\x85{l\x96\x1d\x04\x0el\x00\x00\x01\xff\xbe\xff\ +\xe9\x06\xbc\x05\xb6\x00$\x00'@\x13\x09\x09\x1a$$\ +\x15IY$\x03\x05\x1f\x1a\x1fIY\x0e\x1a\x13\x00?\ +3+\x11\x003\x18?+\x11\x12\x009\x18/10\ +\x01\x03\x06\x15\x143267\x133\x03\x06\x06#\x22\ +&547\x13!\x0a\x02\x06#\x22'5\x1632\ +66\x12\x13\x05\x02\xd5\x19\xaaeq `\xa8h+\ +\xc6\xaf\x99\xb1\x1b\xb0\xfe\xb0K\xb0\x81\xae\x80L14\ +3Si^\x91\x98\x05\xb6\xfc\x1dw9\xa0o\x8d\x01\ +\xd1\xfe\x1a\xcb\xb3\x9e\x8dA\x87\x03>\xfe\xdc\xfd\x9b\xfe\ +\xd6\x81\x17\x96\x15X\xd0\x01\xd8\x025\x00\x01\xff\xa2\xff\ +\xec\x05\xf0\x04P\x00.\x00)@\x14\x07\x07\x1d**\ +\x15FY*\x0f\x02\x22\x0d\x1d\x1d\x22FY\x1d\x16\x00\ +?+\x11\x003\x113\x18?+\x11\x12\x009\x18/\ +10\x01\x1432667\x133\x03\x0e\x02#\x22\ +&547\x13&#\x22\x06\x06\x07\x0e\x02#\x22'\ +5\x1632667\x126632\x17\x03\x06\x03\ +j\xaaD[:\x19B\xa8H\x1fg\xa6z\x9a\xa5\x10\ +u''M`RSTt\x8cd/\x1f\x1c'@\ +[W@Wz\xa6\x84~x\x8f\x0f\x01\x1f\xa82i\ +m\x01=\xfe\xaa\x8f\x9cO\x96\x8e>H\x02$\x09=\ +\x97\xed\xf0\xc7Y\x0e\x91\x0aL\xab\xbb\x01\x02\xbeW\x1f\ +\xfdRH\x00\x01\x00V\xff\xec\x073\x05\xb6\x00\x1c\x00\ +,@\x16\x06\x06\x14\x15\x17\x12IY\x17\x17\x14\x19\x15\ +\x03\x14\x12\x0b\x02IY\x0b\x13\x00?+\x00\x18??\ +3\x129/+\x11\x12\x009\x18/10\x01\x143\ +267\x133\x03\x06\x06#\x22&547\x13!\ +\x03#\x013\x03!\x133\x03\x06\x04\x89\xacgr\x1d\ +`\xa8h-\xc3\xb0\x9b\xb3\x135\xfdl\x91\xaa\x015\ +\xaa\x83\x02\x94\x85\xac\xdf\x0f\x01#\xa0t\x88\x01\xd1\xfe\ +\x1a\xcc\xb2\x9e\x8d=X\x01\x04\xfdP\x05\xb6\xfd\x92\x02\ +n\xfb\xe2B\x00\x00\x01\x00;\xff\xec\x06m\x04H\x00\ +\x1e\x00,@\x16\x13\x13\x03\x04\x06\x01FY\x06\x06\x03\ +\x08\x04\x0f\x03\x15\x19\x0eFY\x19\x16\x00?+\x00\x18\ +??3\x129/+\x11\x12\x009\x18/10\x01\ +!\x03#\x133\x03!\x133\x03\x06\x15\x14326\ +67\x133\x03\x0e\x02#\x22&546\x03b\xfd\ +\xeai\xa8\xea\xa6a\x02\x17b\xa8\x95\x0f\xaaD[:\ +\x19B\xa8H\x1fg\xa6z\x9b\xa5\x08\x01\xee\xfe\x12\x04\ +H\xfe5\x01\xcb\xfd;H\x1c\xa82im\x01=\xfe\ +\xaa\x8f\x9cO\x98\x8c\x1dD\x00\x00\x01\x00\x96\xff\xec\x05\ +N\x05\xcb\x00\x1e\x00&@\x14\x00\x1eIY\x00\x00\x06\ +\x0d\x0d\x13IY\x0d\x04\x06\x1aIY\x06\x13\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x01!\x07\ +\x06\x02\x04#\x22\x00\x11\x10\x12$32\x17\x07&&\ +#\x22\x04\x02\x15\x14\x16326\x13!\x031\x02\x1d\ +\x17+\xa0\xfe\xfd\xbd\xfc\xfe\xe6\xce\x01e\xdd\xeb\xbdB\ +l\xa5U\xa8\xfe\xeb\x9d\xbb\xb3\xbe\xd61\xfe\x93\x02\xee\ +y\xee\xfe\xf0\x8b\x01'\x01\x12\x01\x06\x01\xae\xf2T\x98\ +/%\xc8\xfe\x9b\xdd\xcd\xd9\xd3\x01\x00\x00\x01\x00b\xff\ +\xec\x04\x5c\x04\x5c\x00\x1b\x00&@\x14\x00\x1bFY\x00\ +\x00\x05\x0c\x0c\x12FY\x0c\x10\x05\x18FY\x05\x16\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +!\x07\x02\x04#\x22&54\x12$32\x16\x17\x07\ +&#\x22\x00\x15\x14\x163 \x13!\x02o\x01\xed\x14\ +;\xfe\xfc\xe4\xd4\xef\xa0\x01*\xc4p\xa8J@\x8a\x98\ +\xdf\xfe\xfd\x95\x8c\x01\x22@\xfe\xc1\x02?\x5c\xfe\xf9\xf0\ +\xee\xd6\xc3\x01:\xaf&*\x85N\xfe\xd3\xfe\x93\xa4\x01\ +?\x00\x01\x00\xba\xff\xec\x04\xd5\x05\xb6\x00\x18\x00%@\ +\x12\x0d\x0d\x12\x01\x04\x00\x01\x00IY\x01\x03\x12\x09I\ +Y\x12\x13\x00?+\x00\x18?+\x11\x003\x11\x129\ +\x18/10\x137!\x07!\x03\x06\x15\x14326\ +7\x133\x03\x06\x06#\x22&547\x13\xba!\x03\ +\xd9!\xfei\xc1\x0e\xaceq `\xa6f-\xc4\xaf\ +\x9b\xb3\x15\xba\x05\x1f\x97\x97\xfcyH-\xa0o\x8d\x01\ +\xd1\xfe\x1a\xcc\xb2\x9e\x8d4a\x03s\x00\x01\x00V\xff\ +\xec\x04/\x04H\x00\x1a\x00%@\x12\x07\x07\x0d\x15\x18\ +\x14\x15\x14FY\x15\x0f\x0d\x02FY\x0d\x16\x00?+\ +\x00\x18?+\x11\x003\x11\x129\x18/10\x01\x14\ +32667\x133\x03\x0e\x02#\x22&547\ +\x13!7!\x07!\x03\x06\x01\xaa\xaaD[:\x19A\ +\xa8H\x1fg\xa7x\x9b\xa5\x10u\xfe\xcf\x1d\x03\x0a\x1f\ +\xfe\xd1w\x0e\x01\x1f\xa82im\x01=\xfe\xaa\x8f\x9d\ +N\x98\x8c>H\x02 \x92\x92\xfd\xcdD\x00\x00\x01\x00\ +y\xff\xec\x04\x98\x05\xcb\x00(\x00-@\x17&\x12\x11\ +\x11\x12JY\x11\x11\x1f\x03\x03\x0aJY\x03\x04\x1f\x19\ +JY\x1f\x13\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x014$32\x16\x17\x07\ +&&#\x22\x06\x15\x14\x1633\x07#\x22\x06\x15\x14\ +\x163267\x15\x06#\x22&54675&\ +&\x019\x01\x00\xd3\x82\xbdM[W\x87Q\x86\xa7\x91\ +\x8e\xb8\x1e\xb5\xda\xdc\x99\x8an\xb6S\xbf\xd7\xd0\xea\xe1\ +\xc5k{\x04-\xbb\xe3HFvC3\x98~tz\ +\x8d\xa0\x9bv\x826&\x98Q\xc2\xb0\xb1\xda\x11\x06\x22\ +\x9c\xff\xff\x00?\xff\xec\x03\x9c\x04Z\x02\x06\x01\x82\x00\ +\x00\x00\x01\xff\xbe\xfey\x051\x05\xb6\x00 \x00+@\ +\x18 \x11IY \x03\x0f\x01JY\x0f\x12\x16\x1bI\ +Y\x16\x13\x06\x0bJY\x06\x22\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?+10\x01\x013\x03\x06\x06\ +#\x22'5\x163277#\x01!\x0a\x02\x06#\ +\x22'5\x163266\x12\x13\x051\xfe\xe8\x8f@\ +\x1co`F#,7M\x1b\x19\xaa\x01\x18\xfe\x7fK\ +\xb0\x81\xae\x80L143Si^\x91\x98\x05\xb6\xfa\ +\xdd\xfe\xd5\x81n\x14\x8e\x13q\x87\x05\x1d\xfe\xdc\xfd\x9b\ +\xfe\xd6\x81\x17\x96\x15X\xd0\x01\xd8\x025\x00\x00\x01\xff\ +\xa2\xfey\x04\x08\x04P\x00)\x00+@\x18'\x12F\ +Y'\x0f\x0f\x00FY\x0f\x15\x1a\x1fFY\x1a\x16\x05\ +\x0aFY\x05\x22\x00?+\x00\x18?+\x00\x18?+\ +\x00\x18?+10%3\x03\x06\x06#\x22'5\x16\ +32677#\x13&#\x22\x06\x06\x07\x0e\x02#\ +\x22'5\x1632667\x126632\x17\x03\ +?\x8e>\x1bpbA(03(5\x0b\x1d\xa8\xcf\ +''M`RSTt\x8cd/\x1f\x1c'@[\ +W@Wz\xa6\x84~x\x8b\xfe\xdd~q\x14\x8e\x13\ +>3\x87\x03\xba\x09=\x97\xed\xf0\xc7Y\x0e\x91\x0aL\ +\xab\xbb\x01\x02\xbeW\x1f\xff\xff\xff\x8b\xfe\xa0\x04\x10\x05\ +\xb6\x02&\x00$\x00\x00\x00\x07\x02g\x04\xac\x00\x00\xff\ +\xff\x00b\xfe\xa0\x04`\x04\x5c\x02&\x00D\x00\x00\x00\ +\x07\x02g\x04\x96\x00\x00\xff\xff\xff\x8b\x00\x00\x04\x1b\x07\ +\xdf\x02&\x00$\x00\x00\x01\x07\x02f\x05\x04\x01R\x00\ +\x0a\xb4\x02\x14\x14\x05&\x00+\x115\xff\xff\x00b\xff\ +\xec\x04`\x06\x8d\x02&\x00D\x00\x00\x01\x07\x02f\x04\ +\xbe\x00\x00\x00\x0a\xb4\x02&&\x11&\x00+\x115\xff\ +\xff\xff\x8b\x00\x00\x05X\x07\xd1\x02&\x00$\x00\x00\x01\ +\x07\x03w\x04\xee\x01R\x00\x0c\xb5\x03\x02\x1a\x1a\x05&\ +\x00+\x1155\xff\xff\x00b\xff\xec\x05\x1e\x06\x7f\x02\ +&\x00D\x00\x00\x01\x07\x03w\x04\xb4\x00\x00\x00\x0c\xb5\ +\x03\x02,,\x11&\x00+\x1155\xff\xff\xff\x8b\x00\ +\x00\x04%\x07\xd1\x02&\x00$\x00\x00\x01\x07\x03x\x04\ +\xee\x01R\x00\x0c\xb5\x03\x02\x1a\x1a\x05&\x00+\x115\ +5\xff\xff\x00b\xff\xec\x04`\x06\x7f\x02&\x00D\x00\ +\x00\x01\x07\x03x\x04\xb4\x00\x00\x00\x0c\xb5\x03\x02,,\ +\x11&\x00+\x1155\xff\xff\xff\x8b\x00\x00\x05\x0b\x08\ +/\x02&\x00$\x00\x00\x01\x07\x03y\x04\xee\x01R\x00\ +\x0c\xb5\x03\x02\x1a\x1a\x05&\x00+\x1155\xff\xff\x00\ +b\xff\xec\x04\xd1\x06\xdd\x02&\x00D\x00\x00\x01\x07\x03\ +y\x04\xb4\x00\x00\x00\x0c\xb5\x03\x02,,\x11&\x00+\ +\x1155\xff\xff\xff\x8b\x00\x00\x04\xcd\x08b\x02&\x00\ +$\x00\x00\x01\x07\x03z\x04\xee\x01R\x00\x0c\xb5\x03\x02\ +00\x05&\x00+\x1155\xff\xff\x00b\xff\xec\x04\ +\x93\x07\x10\x02&\x00D\x00\x00\x01\x07\x03z\x04\xb4\x00\ +\x00\x00\x0c\xb5\x03\x02BB\x11&\x00+\x1155\xff\ +\xff\xff\x8b\xfe\xa0\x048\x07s\x02&\x00$\x00\x00\x00\ +'\x02g\x04\xac\x00\x00\x01\x07\x01K\x00B\x01R\x00\ +\x0a\xb4\x03\x1b\x1b\x05&\x00+\x115\xff\xff\x00b\xfe\ +\xa0\x04`\x06!\x02&\x00D\x00\x00\x00'\x02g\x04\ +\x96\x00\x00\x01\x06\x01K\xf7\x00\x00\x0a\xb4\x03--\x11\ +&\x00+\x115\xff\xff\xff\x8b\x00\x00\x04R\x08\x13\x02\ +&\x00$\x00\x00\x01\x07\x03{\x04\xf0\x01R\x00\x0c\xb5\ +\x03\x02\x0f\x0f\x05&\x00+\x1155\xff\xff\x00b\xff\ +\xec\x04`\x06\xc1\x02&\x00D\x00\x00\x01\x07\x03{\x04\ +\xba\x00\x00\x00\x0c\xb5\x03\x02!!\x11&\x00+\x115\ +5\xff\xff\xff\x8b\x00\x00\x04P\x08\x13\x02&\x00$\x00\ +\x00\x01\x07\x03|\x04\xf0\x01R\x00\x0c\xb5\x03\x02\x17\x17\ +\x05&\x00+\x1155\xff\xff\x00b\xff\xec\x04`\x06\ +\xc1\x02&\x00D\x00\x00\x01\x07\x03|\x04\xba\x00\x00\x00\ +\x0c\xb5\x03\x02))\x11&\x00+\x1155\xff\xff\xff\ +\x8b\x00\x00\x04P\x08X\x02&\x00$\x00\x00\x01\x07\x03\ +}\x04\xf0\x01R\x00\x0c\xb5\x03\x02##\x05&\x00+\ +\x1155\xff\xff\x00b\xff\xec\x04`\x07\x06\x02&\x00\ +D\x00\x00\x01\x07\x03}\x04\xba\x00\x00\x00\x0c\xb5\x03\x02\ +55\x11&\x00+\x1155\xff\xff\xff\x8b\x00\x00\x04\ +\xbb\x08b\x02&\x00$\x00\x00\x01\x07\x03~\x04\xf0\x01\ +R\x00\x0c\xb5\x03\x02%%\x05&\x00+\x1155\xff\ +\xff\x00b\xff\xec\x04\x85\x07\x10\x02&\x00D\x00\x00\x01\ +\x07\x03~\x04\xba\x00\x00\x00\x0c\xb5\x03\x0277\x11&\ +\x00+\x1155\xff\xff\xff\x8b\xfe\xa0\x04N\x077\x02\ +&\x00$\x00\x00\x00'\x01N\x003\x01R\x01\x07\x02\ +g\x04\xac\x00\x00\x00\x0a\xb4\x02\x12\x12\x05&\x00+\x11\ +5\xff\xff\x00b\xfe\xa0\x04`\x05\xe5\x02&\x00D\x00\ +\x00\x00&\x01N\x02\x00\x01\x07\x02g\x04\x96\x00\x00\x00\ +\x0a\xb4\x02$$\x11&\x00+\x115\xff\xff\x00V\xfe\ +\xa0\x04j\x05\xb6\x02&\x00(\x00\x00\x00\x07\x02g\x04\ +\x8f\x00\x00\xff\xff\x00b\xfe\xa0\x03\xb4\x04\x5c\x02&\x00\ +H\x00\x00\x00\x07\x02g\x04u\x00\x00\xff\xff\x00V\x00\ +\x00\x04j\x07\xdf\x02&\x00(\x00\x00\x01\x07\x02f\x04\ +\xf0\x01R\x00\x0a\xb4\x01\x11\x11\x05&\x00+\x115\xff\ +\xff\x00b\xff\xec\x03\xb4\x06\x8d\x02&\x00H\x00\x00\x01\ +\x07\x02f\x04\x83\x00\x00\x00\x0a\xb4\x02((\x11&\x00\ ++\x115\xff\xff\x00V\x00\x00\x04\x83\x07/\x02&\x00\ +(\x00\x00\x01\x07\x01R\x00T\x01R\x00\x0a\xb4\x01\x15\ +\x15\x05&\x00+\x115\xff\xff\x00b\xff\xec\x04\x09\x05\ +\xdd\x02&\x00H\x00\x00\x01\x06\x01R\xda\x00\x00\x0a\xb4\ +\x02,,\x11&\x00+\x115\xff\xff\x00V\x00\x00\x05\ +V\x07\xd1\x02&\x00(\x00\x00\x01\x07\x03w\x04\xec\x01\ +R\x00\x0c\xb5\x02\x01\x17\x17\x05&\x00+\x1155\xff\ +\xff\x00b\xff\xec\x04\xf1\x06\x7f\x02&\x00H\x00\x00\x01\ +\x07\x03w\x04\x87\x00\x00\x00\x0c\xb5\x03\x02..\x11&\ +\x00+\x1155\xff\xff\x00V\x00\x00\x04j\x07\xd1\x02\ +&\x00(\x00\x00\x01\x07\x03x\x04\xec\x01R\x00\x0c\xb5\ +\x02\x01\x17\x17\x05&\x00+\x1155\xff\xff\x00b\xff\ +\xec\x03\xbe\x06\x7f\x02&\x00H\x00\x00\x01\x07\x03x\x04\ +\x87\x00\x00\x00\x0c\xb5\x03\x02..\x11&\x00+\x115\ +5\xff\xff\x00V\x00\x00\x05\x09\x08/\x02&\x00(\x00\ +\x00\x01\x07\x03y\x04\xec\x01R\x00\x0c\xb5\x02\x01\x17\x17\ +\x05&\x00+\x1155\xff\xff\x00b\xff\xec\x04\xa4\x06\ +\xdd\x02&\x00H\x00\x00\x01\x07\x03y\x04\x87\x00\x00\x00\ +\x0c\xb5\x03\x02..\x11&\x00+\x1155\xff\xff\x00\ +V\x00\x00\x04\xcb\x08b\x02&\x00(\x00\x00\x01\x07\x03\ +z\x04\xec\x01R\x00\x0c\xb5\x02\x01--\x05&\x00+\ +\x1155\xff\xff\x00b\xff\xec\x04f\x07\x10\x02&\x00\ +H\x00\x00\x01\x07\x03z\x04\x87\x00\x00\x00\x0c\xb5\x03\x02\ +DD\x11&\x00+\x1155\xff\xff\x00V\xfe\xa0\x04\ +j\x07s\x02&\x00(\x00\x00\x00'\x02g\x04\x8f\x00\ +\x00\x01\x07\x01K\x00F\x01R\x00\x0a\xb4\x02\x18\x18\x05\ +&\x00+\x115\xff\xff\x00b\xfe\xa0\x03\xc6\x06!\x02\ +&\x00H\x00\x00\x00'\x02g\x04u\x00\x00\x01\x06\x01\ +K\xd0\x00\x00\x0a\xb4\x03//\x11&\x00+\x115\xff\ +\xff\xff\xd9\x00\x00\x03)\x07\xdf\x02&\x00,\x00\x00\x01\ +\x07\x02f\x04\x12\x01R\x00\x0a\xb4\x01\x11\x11\x05&\x00\ ++\x115\xff\xff\x00;\x00\x00\x02\xa6\x06\x8d\x02&\x00\ +\xf3\x00\x00\x01\x07\x02f\x03\x8f\x00\x00\x00\x0a\xb4\x01\x09\ +\x09\x11&\x00+\x115\xff\xff\xff\xd9\xfe\xa0\x03\x00\x05\ +\xb6\x02&\x00,\x00\x00\x00\x07\x02g\x03\xa0\x00\x00\xff\ +\xff\xff\xfa\xfe\xa0\x02\x1f\x05\xdf\x02&\x00L\x00\x00\x00\ +\x07\x02g\x03N\x00\x00\xff\xff\x00\x96\xfe\xa0\x05\x83\x05\ +\xcd\x02&\x002\x00\x00\x00\x07\x02g\x055\x00\x00\xff\ +\xff\x00b\xfe\xa0\x04\x1d\x04V\x02&\x00R\x00\x00\x00\ +\x07\x02g\x04\xb2\x00\x00\xff\xff\x00\x96\xff\xec\x05\x83\x07\ +\xdf\x02&\x002\x00\x00\x01\x07\x02f\x05\xaa\x01R\x00\ +\x0a\xb4\x02!!\x05&\x00+\x115\xff\xff\x00b\xff\ +\xf0\x04\x1d\x06\x8d\x02&\x00R\x00\x00\x01\x07\x02f\x04\ +\xa6\x00\x00\x00\x0a\xb4\x02!!\x11&\x00+\x115\xff\ +\xff\x00\x96\xff\xec\x05\xe3\x07\xd1\x02&\x002\x00\x00\x01\ +\x07\x03w\x05y\x01R\x00\x0c\xb5\x03\x02''\x05&\ +\x00+\x1155\xff\xff\x00b\xff\xf0\x04\xfd\x06\x7f\x02\ +&\x00R\x00\x00\x01\x07\x03w\x04\x93\x00\x00\x00\x0c\xb5\ +\x03\x02''\x11&\x00+\x1155\xff\xff\x00\x96\xff\ +\xec\x05\x83\x07\xd1\x02&\x002\x00\x00\x01\x07\x03x\x05\ +u\x01R\x00\x0c\xb5\x03\x02''\x05&\x00+\x115\ +5\xff\xff\x00b\xff\xf0\x04\x1d\x06\x7f\x02&\x00R\x00\ +\x00\x01\x07\x03x\x04\x93\x00\x00\x00\x0c\xb5\x03\x02''\ +\x11&\x00+\x1155\xff\xff\x00\x96\xff\xec\x05\x92\x08\ +/\x02&\x002\x00\x00\x01\x07\x03y\x05u\x01R\x00\ +\x0c\xb5\x03\x02''\x05&\x00+\x1155\xff\xff\x00\ +b\xff\xf0\x04\xb0\x06\xdd\x02&\x00R\x00\x00\x01\x07\x03\ +y\x04\x93\x00\x00\x00\x0c\xb5\x03\x02''\x11&\x00+\ +\x1155\xff\xff\x00\x96\xff\xec\x05\x83\x08b\x02&\x00\ +2\x00\x00\x01\x07\x03z\x05u\x01R\x00\x0c\xb5\x03\x02\ +==\x05&\x00+\x1155\xff\xff\x00b\xff\xf0\x04\ +r\x07\x10\x02&\x00R\x00\x00\x01\x07\x03z\x04\x93\x00\ +\x00\x00\x0c\xb5\x03\x02==\x11&\x00+\x1155\xff\ +\xff\x00\x96\xfe\xa0\x05\x83\x07s\x02&\x002\x00\x00\x00\ +'\x02g\x055\x00\x00\x01\x07\x01K\x00\xcd\x01R\x00\ +\x0a\xb4\x03((\x05&\x00+\x115\xff\xff\x00b\xfe\ +\xa0\x04\x1d\x06!\x02&\x00R\x00\x00\x00'\x02g\x04\ +\xb2\x00\x00\x01\x06\x01K\xef\x00\x00\x1a\xb1\x03-\xb8\xff\ +h@\x0a--\x00\x00%\x03((\x11&\x00+\x11\ +5\x01+\x115\xff\xff\x00\x96\xff\xec\x06\xa6\x07s\x02\ +&\x02_\x00\x00\x01\x07\x00v\x01\x17\x01R\x00\x0a\xb4\ +\x02//\x05&\x00+\x115\xff\xff\x00b\xff\xf0\x05\ +H\x06!\x02&\x02`\x00\x00\x01\x06\x00v9\x00\x00\ +\x0a\xb4\x02--\x11&\x00+\x115\xff\xff\x00\x96\xff\ +\xec\x06\xa6\x07s\x02&\x02_\x00\x00\x01\x07\x00C\x00\ +h\x01R\x00\x0a\xb4\x02''\x05&\x00+\x115\xff\ +\xff\x00b\xff\xf0\x05H\x06!\x02&\x02`\x00\x00\x01\ +\x06\x00C\x86\x00\x00\x0a\xb4\x02%%\x11&\x00+\x11\ +5\xff\xff\x00\x96\xff\xec\x06\xa6\x07\xdf\x02&\x02_\x00\ +\x00\x01\x07\x02f\x05\xaa\x01R\x00\x0a\xb4\x02**\x05\ +&\x00+\x115\xff\xff\x00b\xff\xf0\x05H\x06\x8d\x02\ +&\x02`\x00\x00\x01\x07\x02f\x04\xa6\x00\x00\x00\x0a\xb4\ +\x02**\x11&\x00+\x115\xff\xff\x00\x96\xff\xec\x06\ +\xa6\x07/\x02&\x02_\x00\x00\x01\x07\x01R\x00\xe5\x01\ +R\x00\x0a\xb4\x02//\x05&\x00+\x115\xff\xff\x00\ +b\xff\xf0\x05H\x05\xdd\x02&\x02`\x00\x00\x01\x06\x01\ +R\x06\x00\x00\x0a\xb4\x02--\x11&\x00+\x115\xff\ +\xff\x00\x96\xfe\xa0\x06\xa6\x06\x14\x02&\x02_\x00\x00\x00\ +\x07\x02g\x055\x00\x00\xff\xff\x00b\xfe\xa0\x05H\x04\ +\xf0\x02&\x02`\x00\x00\x00\x07\x02g\x04\xb2\x00\x00\xff\ +\xff\x00\xa4\xfe\xa0\x05\x7f\x05\xb6\x02&\x008\x00\x00\x00\ +\x07\x02g\x05\x1b\x00\x00\xff\xff\x00q\xfe\xa0\x04^\x04\ +H\x02&\x00X\x00\x00\x00\x07\x02g\x04\xcb\x00\x00\xff\ +\xff\x00\xa4\xff\xec\x05\x7f\x07\xdf\x02&\x008\x00\x00\x01\ +\x07\x02f\x05m\x01R\x00\x0a\xb4\x01\x1b\x1b\x05&\x00\ ++\x115\xff\xff\x00q\xff\xec\x04^\x06\x8d\x02&\x00\ +X\x00\x00\x01\x07\x02f\x04\xc3\x00\x00\x00\x0a\xb4\x01\x1e\ +\x1e\x11&\x00+\x115\xff\xff\x00\xa4\xff\xec\x06\xe5\x07\ +s\x02&\x02a\x00\x00\x01\x07\x00v\x01\x17\x01R\x00\ +\x0a\xb4\x01&&\x05&\x00+\x115\xff\xff\x00q\xff\ +\xec\x05\xd7\x06!\x02&\x02b\x00\x00\x01\x06\x00vT\ +\x00\x00\x0a\xb4\x01))\x11&\x00+\x115\xff\xff\x00\ +\xa4\xff\xec\x06\xe5\x07s\x02&\x02a\x00\x00\x01\x07\x00\ +C\x00=\x01R\x00\x0a\xb4\x01\x1e\x1e\x05&\x00+\x11\ +5\xff\xff\x00q\xff\xec\x05\xd7\x06!\x02&\x02b\x00\ +\x00\x01\x06\x00C\x8e\x00\x00\x0a\xb4\x01!!\x11&\x00\ ++\x115\xff\xff\x00\xa4\xff\xec\x06\xe5\x07\xdf\x02&\x02\ +a\x00\x00\x01\x07\x02f\x05s\x01R\x00\x0a\xb4\x01!\ +!\x05&\x00+\x115\xff\xff\x00q\xff\xec\x05\xd7\x06\ +\x8d\x02&\x02b\x00\x00\x01\x07\x02f\x04\xcb\x00\x00\x00\ +\x0a\xb4\x01%%\x11&\x00+\x115\xff\xff\x00\xa4\xff\ +\xec\x06\xe5\x07/\x02&\x02a\x00\x00\x01\x07\x01R\x00\ +\xdd\x01R\x00\x0a\xb4\x01&&\x05&\x00+\x115\xff\ +\xff\x00q\xff\xec\x05\xd7\x05\xdd\x02&\x02b\x00\x00\x01\ +\x06\x01R1\x00\x00\x0a\xb4\x01))\x11&\x00+\x11\ +5\xff\xff\x00\xa4\xfe\xa0\x06\xe5\x06\x14\x02&\x02a\x00\ +\x00\x00\x07\x02g\x05\x1b\x00\x00\xff\xff\x00q\xfe\xa0\x05\ +\xd7\x04\xf0\x02&\x02b\x00\x00\x00\x07\x02g\x04\xcb\x00\ +\x00\xff\xff\x00\xbc\xfe\xa0\x04\xc3\x05\xb6\x02&\x00<\x00\ +\x00\x00\x07\x02g\x04L\x00\x00\xff\xff\xff;\xfe\x14\x04\ +\x12\x04H\x02&\x00\x5c\x00\x00\x00\x07\x02g\x05y\x00\ +\x00\xff\xff\x00\xbc\x00\x00\x04\xc3\x07\xdf\x02&\x00<\x00\ +\x00\x01\x07\x02f\x04\xaa\x01R\x00\x0a\xb4\x01\x0e\x0e\x05\ +&\x00+\x115\xff\xff\xff;\xfe\x14\x04\x12\x06\x8d\x02\ +&\x00\x5c\x00\x00\x01\x07\x02f\x04/\x00\x00\x00\x0a\xb4\ +\x01\x1e\x1e\x11&\x00+\x115\xff\xff\x00\xbc\x00\x00\x04\ +\xc3\x07/\x02&\x00<\x00\x00\x01\x07\x01R\x00\x17\x01\ +R\x00\x0a\xb4\x01\x12\x12\x05&\x00+\x115\xff\xff\xff\ +;\xfe\x14\x04\x12\x05\xdd\x02&\x00\x5c\x00\x00\x01\x06\x01\ +R\x97\x00\x00\x0a\xb4\x01\x22\x22\x11&\x00+\x115\xff\ +\xff\x00\x07\xfe\xbc\x05/\x06\x14\x02&\x00\xd3\x00\x00\x00\ +\x07\x00B\x00\xc3\x00\x00\x00\x02\xfc\x04\x04\xd9\xfe\xae\x06\ +!\x00\x08\x00\x11\x00\x0c\xb3\x0e\x06\x0a\x01\x00/3\xcd\ +210\x01#&&'53\x16\x17\x05#&&\ +'53\x16\x17\xfdPm;\x84 \xba(j\x01^\ +o;\x84 \xbb,g\x04\xd9;\xb9?\x15\x86\xa9\x19\ +;\xb9?\x15\x91\x9e\x00\x00\x02\xfc\xe7\x04\xd9\x00j\x06\ +\x7f\x00\x0e\x00\x18\x00\x17@\x09\x08\x00\x18\x00\x18\x00\x13\ +\x0b\x06\x00/3\xcc99//\x11310\x013\ +\x16\x16\x17\x07#&'\x06\x07#766\x0576\ +73\x15\x06\x06\x07#\xfd\xf4\xae\x10V/\x069a\ +^\x90xJ\x09K\x97\x018.^+\xa9+\x90E\ +`\x05\xf65\x95<\x179ml:\x1b@\x96\x16/\ +^>\x19+u*\x00\x00\x02\xfcV\x04\xd9\xff7\x06\ +\x7f\x00\x0e\x00\x16\x00\x17@\x09\x08\x00\x0f\x00\x0f\x00\x13\ +\x0b\x06\x00/3\xcc99//\x11310\x013\ +\x16\x16\x17\x07#&'\x06\x07#766\x07&'\ +'3\x16\x17\x15\xfd\xf4\xae\x10V/\x069a^\x90\ +xJ\x09K\x97\xccCk\x02\x898A\x05\xf65\x95\ +<\x179ml:\x1b@\x96.=\x8f\x17p]\x16\ +\x00\x00\x02\xfc\xe7\x04\xd9\x00\x1d\x06\xdd\x00\x0e\x00\x22\x00\ +\x19@\x0a\x08\x00\x0f\x00\x0f\x00\x16\x1b\x0b\x06\x00/3\ +\xcc299//\x11310\x013\x16\x16\x17\x07\ +#&'\x06\x07#766\x0576654&\ +#\x22\x075632\x16\x15\x14\x06\x07\x07\xfd\xf4\xae\ +\x10V/\x069a^\x90xJ\x09K\x97\x01Q\x08\ +ED.(*\x1d\x16BVXTH\x0e\x05\xf65\ +\x95<\x179ml:\x1b@\x96 ^\x0b(#\x1f\ +\x14\x08N\x06<9AE\x11'\x00\x00\x02\xfc\xe9\x04\ +\xd9\xff\xdf\x07\x10\x00\x15\x00#\x00'@\x12\x09\x00\x1e\ +\x16\x00\x10\x05\x0b\x16\x10\x0b\x0b\x10\x16\x03\x14!\x1c\x00\ +/3\xcc\x179///\x113\x113\x113\x10\xc4\ +10\x01\x22.\x02#\x22\x06\x07#632\x1e\x02\ +32673\x06\x053\x16\x16\x17\x07#&'\x06\ +\x07#76\xfe\xf8'JD?\x1d+5\x18e:\ +\xae*LD<\x1a&3 d@\xfeW\xae\x0fW\ +/\x089[b\x85\x83J\x07\xb9\x065\x1e%\x1e.\ +5\xdb\x1e$\x1e';\xdb=3\x9b:\x177qi\ +?\x1b\x9f\x00\x02\xfd\x0a\x04\xd9\xffb\x06\xc1\x00\x0c\x00\ +\x15\x00\x17@\x09\x09\x03\x00\x15\x15\x07\x10\x07\x00\x00/\ +2\xcc\x119/\x10\xcd210\x01\x22&'3\x16\ +\x163273\x06\x06\x03673\x15\x06\x06\x07#\ +\xfe\x19x\x93\x04k\x0eWM\x945p\x22\xa8\x92i\ +I\xac,\xa1EL\x04\xd9\x8avA6w}\x83\x01\ +\x1b_n\x17,z'\x00\x02\xfd\x0a\x04\xd9\xff`\x06\ +\xc1\x00\x07\x00\x14\x00\x17@\x09\x11\x0b\x08\x00\x00\x0f\x04\ +\x0f\x08\x00/3\xcc\x119/\x10\xcd210\x01&\ +'73\x16\x17\x07\x03\x22&'3\x16\x16327\ +3\x06\x06\xfe'rH\x06\x8b1H\x08Vx\x93\x04\ +k\x0eWM\x945p\x22\xa8\x05\xddm`\x17bg\ +\x1b\xfe\xfc\x8avA6w}\x83\x00\x00\x02\xfd\x0a\x04\ +\xd9\xff`\x07\x06\x00\x13\x00 \x00\x19@\x0a\x1d\x17\x14\ +\x00\x00\x1b\x07\x0c\x1b\x14\x00/3\xcc2\x119/\x10\ +\xcd210\x0176654&#\x22\x0756\ +32\x16\x15\x14\x06\x0f\x02\x22&'3\x16\x1632\ +73\x06\x06\xfd\xf4\x06EF.(%#\x1e:W\ +\x5cVH\x10+x\x93\x04k\x0eWM\x945p\x22\ +\xa8\x05\xcb`\x0b'(\x1d\x14\x08P\x08=\xdd\xfe\xa6\x8avA6w}\x83\x00\ +\x01\xffT\xfeH\x00\xbe\x00\x00\x00\x10\x00\x0a\xb2\x00\x0c\ +\x06\x00/\xcc210\x032654'3\x16\x16\ +\x15\x14\x06#\x22'7\x16B9@)u\x19\x22\x82\ +{A,\x16$\xfe\xb8IEfT)p4qz\ +\x0ek\x09\x00\x01\xff\xe3\xfey\x01y\x00\x8b\x00\x0d\x00\ +\x0a\xb2\x09\x04\x00\x00/\xcd210%\x03\x06\x06#\ +\x22'5\x163267\x13\x01yB\x18qbA\ +(7%-4\x0e;\x8b\xfe\xc9ol\x14\x8e\x133\ +>\x01\x12\x00\x01\xff\xe3\xfey\x01y\x00\x8b\x00\x0d\x00\ +\x0a\xb2\x09\x04\x00\x00/\xcd210%\x03\x06\x06#\ +\x22'5\x163267\x13\x01yB\x18qbA\ +(7%-4\x0e;\x8b\xfe\xc9ol\x14\x8e\x133\ +>\x01\x12\xff\xff\x00\x88\x00\x00\x02\xde\x05\xb6\x00\x07\x00\ +\x14\xffY\x00\x00\x00\x02\x00b\xff\xec\x04\x0a\x04q\x00\ +\x0d\x00\x1b\x00\x17@\x0c\x0b\x0eKY\x0b&\x04\x15M\ +Y\x04\x19\x00?+\x00\x18?+10\x01\x14\x02\x06\ +#\x22&54\x12632\x16%\x22\x06\x02\x15\x14\ +\x16326\x1254&\x04\x0a\x8d\xf0\x9f\xbd\xcf\x8b\ +\xfc\x9e\xb5\xce\xfesh\xa8_zrg\xa0_q\x02\ +\xc3\xcb\xfe\xa5\xb1\xe9\xc9\xcf\x01K\xb9\xe5W\x96\xfe\xf2\ +\xa3\x8d\x98\x8f\x01\x19\xa8\x89\x93\x00\x01\x00J\x00\x00\x02\ +{\x04\x5c\x00\x0b\x00\x10\xb6\x05\x08\x01\x0a\x10\x01\x18\x00\ +??\x129910!#\x13667\x06\x06\x07\ +'\x013\x01\x8f\xa3|\x0c<\x13\x1cW\xb8N\x01\xa6\ +\x8b\x02?:\xf89\x1dG\x7fl\x01)\x00\x00\x01\xff\ +\xd5\x00\x00\x03\x8b\x04q\x00\x1b\x00\x1b@\x0e\x11\x0aK\ +Y\x11&\x02\x19\x01\x1aLY\x01\x18\x00?+\x11\x00\ +3\x18?+10!!7\x01>\x0254&#\ +\x22\x06\x07'6632\x16\x15\x14\x06\x06\x04\x07\x15\ +!\x03%\xfc\xb0\x1d\x01\xae\x95y5WUJ\x97j\ +Rz\xc8n\x9b\xa6B\x7f\xfe\xea\xd1\x02a\x85\x019\ +ltg=JW?RodL\x98\x85T\x8d\x82\ +\xc0\x8f\x08\x00\x01\xffx\xfe\x93\x03z\x04r\x00(\x00\ +-@\x17\x03\x18\x19\x19\x18KY\x19\x19\x0b&& \ +KY&&\x0b\x11KY\x0b%\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x00910\x01\x14\ +\x06\x07\x15\x16\x16\x15\x14\x06\x06#\x22'5\x16\x163\ +2654&##732654&#\x22\ +\x06\x07'632\x16\x03z\xca\xb3|\x8e|\xee\xa4\ +\xd2\xaf^\xd2U\xa2\xb4\x9e\x8d\x83\x1f\x8b\xa5\xdatc\ +P\x9abP\xc3\xe5\xb3\xc4\x03.\x9c\xd9 \x09\x17\xa7\ +}\x85\xcbrO\xa415\x9f\x8a\x83\x87\x8f\xae\x8c\x5c\ +l6Bv\x90\xae\x00\x00\x02\xff\xc7\xfe\xa8\x03\xdf\x04\ +\x5c\x00\x0a\x00\x13\x00!@\x10\x01\x05\x13\x05MY\x06\ +\x09\x13\x13\x03\x0f\x07\x10\x03$\x00??3\x129/\ +33+\x11\x00310%#\x03#\x13!7\x01\ +3\x033!\x13667'\x06\x07\x01\x03\xc3\xd1N\ +\xa2L\xfdy\x18\x03/\xcb\xcb\xd1\xfe\x8bH\x1a@\x1d\ +\x08_9\xfe\x13\x1b\xfe\x8d\x01s{\x03\xc6\xfcD\x01\ +Nx\xe3i\x02\x8b@\xfd\xb7\x00\x01\xff\xde\xfe\x93\x03\ +\xd6\x04]\x00\x1c\x00-@\x17\x1b\x07\x00\x00\x12MY\ +\x00\x00\x07\x17\x17\x1aLY\x17\x10\x07\x0cKY\x07%\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x012\x16\x15\x14\x06\x04#\x22'5\x16\ +32654&#\x22\x06\x07'\x13!\x07!\x03\ +6\x01\xe4\xb6\xd7\x92\xfe\xfa\xb1\xc1\x89\xa4\xaa\xbf\xd6\x93\ +\x830bZJ\xc5\x02\x9c!\xfd\xf6\x7fW\x02$\xd1\ +\xb2\xa1\xf4yO\xa4f\xc0\xac~\x93\x0d\x189\x02\xac\ +\x99\xfeI\x17\x00\xff\xff\x00o\xff\xec\x04D\x05\xcb\x00\ +\x06\x00\x19\xea\x00\x00\x01\xff\xff\xfe\xa7\x03\xca\x04]\x00\ +\x06\x00\x16@\x0a\x05\x02\x00$\x03\x02LY\x03\x10\x00\ +?+\x00\x18?\x11310\x03\x01!7!\x07\x01\ +\x01\x03\x00\xfd1\x1f\x03{\x1b\xfd\x04\xfe\xa7\x05!\x95\ +\x8b\xfa\xd5\xff\xff\x00<\xff\xec\x042\x05\xcd\x00\x06\x00\ +\x1b\xdc\x00\x00\x02\x00\x07\xfe\x93\x03\xd0\x04r\x00\x1a\x00\ +(\x00-@\x17\x0d\x18\x11!\x11MY!!\x05\x18\ +\x18\x1bKY\x18&\x05\x0aKY\x05%\x00?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x00910\ +\x01\x14\x02\x02\x04#\x22'5\x1632\x12\x13#\x06\ +\x06#\x22&546632\x16%\x22\x06\x15\x14\ +\x1632>\x0254&\x03\xd0p\xb7\xfe\xfc\xac\x88\ +j\x86p\xca\xfa@\x0a3\xa3c\xa9\xb8\x81\xe7\x90\xb4\ +\xc7\xfe\x7f\x96\xb6mlL\x80Y)v\x02\xb1\xc2\xfe\ +W\xfe\xd9\x8c\x22\x9e/\x01\x1a\x01,KW\xc5\xbe\x99\ +\xff\x8f\xe5W\xe2\xb1|\x849jzZ\x83\x99\x00\x00\ +\x01\xff\x1b\xfe\x14\x06\x0e\x06\x1f\x00=\x00:@\x1e\x1a\ +(3$\x1e$FY-\x1e\x00\x17:\x0a(\x0aG\ +Y7(\x0f\x05\x13\x0e\x13FY\x00\x0e\x1b\x00?3\ ++\x11\x003\x18?3+\x11\x0033\x18?3+\ +\x11\x003\x11310\x01\x22'5\x163267\ +\x13!\x03\x06\x06#\x22'5\x163267\x13#\ +?\x026632\x16\x17\x07&#\x22\x06\x07\x07!\ +76632\x16\x17\x07&#\x22\x06\x07\x073\x07\ +#\x03\x06\x06\x02!G6=6DV\x1a\xe3\xfe\x1f\ +\xe8'\xa2\x84E8@0FX\x19\xe3\xc1\x0d\xce\x17\ +.\xa3\xa0(t +L=W]\x1d\x19\x01\xe2\x18\ +-\xa2\xa2)q$-L=Y\x5c\x1c\x18\xef\x1a\xee\ +\xe7+\xa1\xfe\x14\x15\x8d\x16s|\x04:\xfb\xb6\xbd\xae\ +\x15\x8d\x16t{\x04:CBd\xc8\xa5\x17\x0e\x81\x1d\ +a\x81ll\xc5\xa6\x16\x0f\x81\x1df|l\x7f\xfb\xb6\ +\xc3\xa8\x00\x00\x02\x00R\x02\xdd\x05V\x05\xc1\x00\x10\x00\ +1\x00%@\x13,\x1b\x01\x08\x0e\x05\x14$\x00\x0c\x05\ +\x19\x14\x09\x06\x03)$\x03\x00?3?3\xc42\xcd\ +2210\x11\x12\x179\x01\x03#\x17\x11#\x113\ +\x13\x133\x11#\x117#\x03%\x14\x06#\x22'5\ +\x163254&'&&54632\x17\x07\ +&#\x22\x06\x15\x14\x16\x17\x16\x16\x03\xb6\xbc\x06\x04w\ +\xb2\xb9\xc0\xaay\x04\x06\xc7\xfe\x05\x8ey~B^b\ +\x904^iK~em^#PO5B7T\ +sJ\x02\xe5\x02'n\xfeG\x02\xd1\xfd\xd3\x02-\xfd\ +/\x01\xaey\xfd\xd9\xd1fs!l(j,2%\ ++\x5cDYn%c#/+(3\x220Y\xff\ +\xff\x00\x95\xfe\x14\x04\xb4\x05\xb6\x02&\x007\x00\x00\x00\ +\x07\x00z\x01?\x00\x00\xff\xff\x00/\xfe\x14\x02\xdb\x05\ +D\x02&\x00W\x00\x00\x00\x07\x00z\x00\xd9\x00\x00\x00\ +\x02\x005\xfe\x14\x04b\x04\x5c\x00\x0c\x00+\x00.@\ +\x18\x0d\x1b\x11\x18\x1c\x0f\x18\x07FY\x18\x10\x11\x00F\ +Y\x11\x16!'FY!\x1b\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?\x11\x129910%26\ +\x1254&#\x22\x06\x02\x15\x14%#\x06\x06#\x22\ +&54\x12632\x17373\x03\x06\x06#\x22\ +'5\x16\x1632676\x01\xc1]\xc3yif\ +e\xb0h\x01\xfa\x08_\xb4`\x8c\x9f\x91\xf7\x97\xbdX\ +\x0aC\x7f\xfa-\xf0\xd2\xb6\x8e>\xb4P\x8c\x9f\x1f$\ +w\xbb\x01#\x97ot\xa9\xfe\xd7\xa3\xe3Zyl\xc3\ +\xaf\xd4\x01h\xc2\xc0\xac\xfbt\xd8\xd0F\x9c$2\x88\ +\x8a\xa6\x00\xff\xff\x005\xfe\x14\x04b\x06!\x02&\x03\ +\x91\x00\x00\x01\x06\x01K\x19\x00\x00\x0a\xb4\x0222\x11\ +&\x00+\x115\xff\xff\x005\xfe\x14\x04b\x05\xe5\x02\ +&\x03\x91\x00\x00\x01\x06\x01N\x08\x00\x00\x0a\xb4\x02/\ +/\x11&\x00+\x115\xff\xff\x005\xfe\x14\x04b\x05\ +\xdf\x02&\x03\x91\x00\x00\x01\x07\x01O\x01#\x00\x00\x00\ +\x0a\xb4\x0244\x11&\x00+\x115\xff\xff\x005\xfe\ +\x14\x04b\x06!\x02&\x03\x91\x00\x00\x01\x06\x02:{\ +\x00\x00\x0a\xb4\x0200\x11&\x00+\x115\x00\x01\x00\ +V\x00\x00\x025\x05\xb6\x00\x03\x00\x0a\xb3\x01\x03\x00\x12\ +\x00??103\x013\x01V\x017\xa8\xfe\xc9\x05\ +\xb6\xfaJ\xff\xff\x00V\x00\x00\x02Q\x07s\x02&\x03\ +\x96\x00\x00\x01\x07\x00C\xfe\xca\x01R\x00\x0a\xb4\x01\x05\ +\x05\x05&\x00+\x115\xff\xff\x00V\x00\x00\x03B\x07\ +s\x02&\x03\x96\x00\x00\x01\x07\x00v\xff\x88\x01R\x00\ +\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\xff\x00V\x00\ +\x00\x03(\x07s\x02&\x03\x96\x00\x00\x01\x07\x01K\xff\ +2\x01R\x00\x0a\xb4\x01\x0a\x0a\x05&\x00+\x115\xff\ +\xff\x00V\x00\x00\x03)\x07%\x02&\x03\x96\x00\x00\x01\ +\x07\x00j\xff@\x01R\x00\x0c\xb5\x02\x01\x17\x17\x05&\ +\x00+\x1155\xff\xff\x00V\x00\x00\x03v\x07/\x02\ +&\x03\x96\x00\x00\x01\x07\x01R\xffG\x01R\x00\x0a\xb4\ +\x01\x0d\x0d\x05&\x00+\x115\xff\xff\x00V\x00\x00\x03\ +\x1e\x06\xb8\x02&\x03\x96\x00\x00\x01\x07\x01M\xffI\x01\ +R\x00\x0a\xb4\x01\x07\x07\x05&\x00+\x115\xff\xff\x00\ +V\x00\x00\x03A\x077\x02&\x03\x96\x00\x00\x01\x07\x01\ +N\xff&\x01R\x00\x0a\xb4\x01\x07\x07\x05&\x00+\x11\ +5\xff\xff\xff\xb5\xfeH\x025\x05\xb6\x02&\x03\x96\x00\ +\x00\x00\x06\x01QF\x00\xff\xff\x00V\x00\x00\x02t\x07\ +1\x02&\x03\x96\x00\x00\x01\x07\x01O\x00f\x01R\x00\ +\x0a\xb4\x01\x0c\x0c\x05&\x00+\x115\xff\xff\x00V\xfe\ +\x7f\x04d\x05\xb6\x00&\x03\x96\x00\x00\x00\x07\x00-\x02\ +/\x00\x00\xff\xff\x00`\x00\x00\x02\xed\x06\x0c\x00'\x03\ +\x96\x00\xb8\x00\x00\x00\x07\x01T\xfd\xf1\xff\x97\xff\xff\x00\ +V\x00\x00\x025\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00\ +V\x00\x00\x03\x1f\x07%\x02&\x03\x96\x00\x00\x01\x07\x00\ +j\xff6\x01R\x00\x0c\xb5\x02\x01\x17\x17\x05&\x00+\ +\x1155\xff\xff\x00V\x00\x00\x025\x05\xb6\x02\x06\x03\ +\x96\x00\x00\xff\xff\x00V\x00\x00\x03\x1f\x07%\x02&\x03\ +\x96\x00\x00\x01\x07\x00j\xff6\x01R\x00\x0c\xb5\x02\x01\ +\x17\x17\x05&\x00+\x1155\xff\xff\x00V\x00\x00\x02\ +5\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00V\x00\x00\x02\ +5\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00V\x00\x00\x03\ +\x0b\x07\xdf\x02&\x03\x96\x00\x00\x01\x07\x02f\x03\xf4\x01\ +R\x00\x0a\xb4\x01\x09\x09\x05&\x00+\x115\xff\xff\x00\ +\x12\xfe\xa0\x025\x05\xb6\x02&\x03\x96\x00\x00\x00\x07\x02\ +g\x03f\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\xb62\x00\ +\x01I\x06\x80\x00\x00\x0e6$\x00\x05\x00$\xffq\x00\ +\x05\x007\x00)\x00\x05\x009\x00)\x00\x05\x00:\x00\ +)\x00\x05\x00<\x00\x14\x00\x05\x00D\xff\xae\x00\x05\x00\ +F\xff\x85\x00\x05\x00G\xff\x85\x00\x05\x00H\xff\x85\x00\ +\x05\x00J\xff\xc3\x00\x05\x00P\xff\xc3\x00\x05\x00Q\xff\ +\xc3\x00\x05\x00R\xff\x85\x00\x05\x00S\xff\xc3\x00\x05\x00\ +T\xff\x85\x00\x05\x00U\xff\xc3\x00\x05\x00V\xff\xc3\x00\ +\x05\x00X\xff\xc3\x00\x05\x00\x82\xffq\x00\x05\x00\x83\xff\ +q\x00\x05\x00\x84\xffq\x00\x05\x00\x85\xffq\x00\x05\x00\ +\x86\xffq\x00\x05\x00\x87\xffq\x00\x05\x00\x9f\x00\x14\x00\ +\x05\x00\xa2\xff\x85\x00\x05\x00\xa3\xff\xae\x00\x05\x00\xa4\xff\ +\xae\x00\x05\x00\xa5\xff\xae\x00\x05\x00\xa6\xff\xae\x00\x05\x00\ +\xa7\xff\xae\x00\x05\x00\xa8\xff\xae\x00\x05\x00\xa9\xff\x85\x00\ +\x05\x00\xaa\xff\x85\x00\x05\x00\xab\xff\x85\x00\x05\x00\xac\xff\ +\x85\x00\x05\x00\xad\xff\x85\x00\x05\x00\xb4\xff\x85\x00\x05\x00\ +\xb5\xff\x85\x00\x05\x00\xb6\xff\x85\x00\x05\x00\xb7\xff\x85\x00\ +\x05\x00\xb8\xff\x85\x00\x05\x00\xba\xff\x85\x00\x05\x00\xbb\xff\ +\xc3\x00\x05\x00\xbc\xff\xc3\x00\x05\x00\xbd\xff\xc3\x00\x05\x00\ +\xbe\xff\xc3\x00\x05\x00\xc2\xffq\x00\x05\x00\xc3\xff\xae\x00\ +\x05\x00\xc4\xffq\x00\x05\x00\xc5\xff\xae\x00\x05\x00\xc6\xff\ +q\x00\x05\x00\xc7\xff\xae\x00\x05\x00\xc9\xff\x85\x00\x05\x00\ +\xcb\xff\x85\x00\x05\x00\xcd\xff\x85\x00\x05\x00\xcf\xff\x85\x00\ +\x05\x00\xd1\xff\x85\x00\x05\x00\xd3\xff\x85\x00\x05\x00\xd5\xff\ +\x85\x00\x05\x00\xd7\xff\x85\x00\x05\x00\xd9\xff\x85\x00\x05\x00\ +\xdb\xff\x85\x00\x05\x00\xdd\xff\x85\x00\x05\x00\xdf\xff\xc3\x00\ +\x05\x00\xe1\xff\xc3\x00\x05\x00\xe3\xff\xc3\x00\x05\x00\xe5\xff\ +\xc3\x00\x05\x00\xfa\xff\xc3\x00\x05\x01\x06\xff\xc3\x00\x05\x01\ +\x08\xff\xc3\x00\x05\x01\x0d\xff\xc3\x00\x05\x01\x0f\xff\x85\x00\ +\x05\x01\x11\xff\x85\x00\x05\x01\x13\xff\x85\x00\x05\x01\x15\xff\ +\x85\x00\x05\x01\x17\xff\xc3\x00\x05\x01\x19\xff\xc3\x00\x05\x01\ +\x1d\xff\xc3\x00\x05\x01!\xff\xc3\x00\x05\x01$\x00)\x00\ +\x05\x01&\x00)\x00\x05\x01+\xff\xc3\x00\x05\x01-\xff\ +\xc3\x00\x05\x01/\xff\xc3\x00\x05\x011\xff\xc3\x00\x05\x01\ +3\xff\xc3\x00\x05\x015\xff\xc3\x00\x05\x016\x00)\x00\ +\x05\x018\x00\x14\x00\x05\x01:\x00\x14\x00\x05\x01C\xff\ +q\x00\x05\x01D\xff\xae\x00\x05\x01F\xff\xae\x00\x05\x01\ +H\xff\x85\x00\x05\x01J\xff\xc3\x00\x05\x01V\xffq\x00\ +\x05\x01_\xffq\x00\x05\x01b\xffq\x00\x05\x01i\xff\ +q\x00\x05\x01y\xff\xae\x00\x05\x01z\xff\xd7\x00\x05\x01\ +{\xff\xd7\x00\x05\x01~\xff\xae\x00\x05\x01\x81\xff\xc3\x00\ +\x05\x01\x82\xff\xd7\x00\x05\x01\x83\xff\xd7\x00\x05\x01\x84\xff\ +\xd7\x00\x05\x01\x87\xff\xd7\x00\x05\x01\x89\xff\xd7\x00\x05\x01\ +\x8c\xff\xae\x00\x05\x01\x8e\xff\xc3\x00\x05\x01\x8f\xff\xae\x00\ +\x05\x01\x90\xff\xae\x00\x05\x01\x93\xff\xae\x00\x05\x01\x99\xff\ +\xae\x00\x05\x01\xa4\xff\x85\x00\x05\x01\xaa\xffq\x00\x05\x01\ +\xae\xff\x85\x00\x05\x01\xb5\xff\x85\x00\x05\x01\xca\xff\xd7\x00\ +\x05\x01\xce\xffq\x00\x05\x01\xcf\xff\x85\x00\x05\x01\xd5\xff\ +q\x00\x05\x01\xd8\xff\x85\x00\x05\x01\xdb\xff\x85\x00\x05\x01\ +\xde\xff\x85\x00\x05\x01\xea\xff\x85\x00\x05\x01\xed\xff\x85\x00\ +\x05\x01\xee\xff\xc3\x00\x05\x01\xf2\xffq\x00\x05\x01\xfa\x00\ +)\x00\x05\x01\xfc\x00)\x00\x05\x01\xfe\x00)\x00\x05\x02\ +\x00\x00\x14\x00\x05\x02W\xff\xc3\x00\x05\x02X\xffq\x00\ +\x05\x02Y\xff\xae\x00\x05\x02`\xff\x85\x00\x05\x02b\xff\ +\xc3\x00\x05\x02j\xff\x85\x00\x05\x02r\xffq\x00\x05\x02\ +s\xffq\x00\x05\x02}\xff\xec\x00\x05\x02\x7f\xff\x85\x00\ +\x05\x02\x85\xff\x85\x00\x05\x02\x87\xff\x85\x00\x05\x02\x89\xff\ +\x85\x00\x05\x02\x8d\xff\x85\x00\x05\x02\xb2\xff\x85\x00\x05\x02\ +\xb4\xff\x85\x00\x05\x02\xce\xff\x85\x00\x05\x02\xcf\xffq\x00\ +\x05\x02\xd9\xffq\x00\x05\x02\xda\xff\xd7\x00\x05\x02\xdb\xff\ +q\x00\x05\x02\xdc\xff\xd7\x00\x05\x02\xdd\xffq\x00\x05\x02\ +\xde\xff\xd7\x00\x05\x02\xe0\xff\x85\x00\x05\x02\xe2\xff\xd7\x00\ +\x05\x02\xe4\xff\xd7\x00\x05\x02\xf0\xff\x85\x00\x05\x02\xf2\xff\ +\x85\x00\x05\x02\xf4\xff\x85\x00\x05\x03\x09\xffq\x00\x05\x03\ +\x0a\xff\x85\x00\x05\x03\x0b\xffq\x00\x05\x03\x0c\xff\x85\x00\ +\x05\x03\x11\xff\x85\x00\x05\x03\x12\xffq\x00\x05\x03\x16\xff\ +\x85\x00\x05\x03\x1a\xff\x85\x00\x05\x03\x1b\xff\x85\x00\x05\x03\ +\x1c\xffq\x00\x05\x03\x1d\xffq\x00\x05\x03\x1e\xff\xae\x00\ +\x05\x03\x1f\xffq\x00\x05\x03 \xff\xae\x00\x05\x03!\xff\ +q\x00\x05\x03\x22\xff\xae\x00\x05\x03#\xffq\x00\x05\x03\ +%\xffq\x00\x05\x03&\xff\xae\x00\x05\x03'\xffq\x00\ +\x05\x03(\xff\xae\x00\x05\x03)\xffq\x00\x05\x03*\xff\ +\xae\x00\x05\x03+\xffq\x00\x05\x03,\xff\xae\x00\x05\x03\ +-\xffq\x00\x05\x03.\xff\xae\x00\x05\x03/\xffq\x00\ +\x05\x030\xff\xae\x00\x05\x031\xffq\x00\x05\x032\xff\ +\xae\x00\x05\x033\xffq\x00\x05\x034\xff\xae\x00\x05\x03\ +6\xff\x85\x00\x05\x038\xff\x85\x00\x05\x03:\xff\x85\x00\ +\x05\x03<\xff\x85\x00\x05\x03@\xff\x85\x00\x05\x03B\xff\ +\x85\x00\x05\x03D\xff\x85\x00\x05\x03J\xff\x85\x00\x05\x03\ +L\xff\x85\x00\x05\x03N\xff\x85\x00\x05\x03R\xff\x85\x00\ +\x05\x03T\xff\x85\x00\x05\x03V\xff\x85\x00\x05\x03X\xff\ +\x85\x00\x05\x03Z\xff\x85\x00\x05\x03\x5c\xff\x85\x00\x05\x03\ +^\xff\x85\x00\x05\x03`\xff\x85\x00\x05\x03b\xff\xc3\x00\ +\x05\x03d\xff\xc3\x00\x05\x03f\xff\xc3\x00\x05\x03h\xff\ +\xc3\x00\x05\x03j\xff\xc3\x00\x05\x03l\xff\xc3\x00\x05\x03\ +n\xff\xc3\x00\x05\x03o\x00\x14\x00\x05\x03q\x00\x14\x00\ +\x05\x03s\x00\x14\x00\x05\x03\x8f\x00)\x00\x0a\x00$\xff\ +q\x00\x0a\x007\x00)\x00\x0a\x009\x00)\x00\x0a\x00\ +:\x00)\x00\x0a\x00<\x00\x14\x00\x0a\x00D\xff\xae\x00\ +\x0a\x00F\xff\x85\x00\x0a\x00G\xff\x85\x00\x0a\x00H\xff\ +\x85\x00\x0a\x00J\xff\xc3\x00\x0a\x00P\xff\xc3\x00\x0a\x00\ +Q\xff\xc3\x00\x0a\x00R\xff\x85\x00\x0a\x00S\xff\xc3\x00\ +\x0a\x00T\xff\x85\x00\x0a\x00U\xff\xc3\x00\x0a\x00V\xff\ +\xc3\x00\x0a\x00X\xff\xc3\x00\x0a\x00\x82\xffq\x00\x0a\x00\ +\x83\xffq\x00\x0a\x00\x84\xffq\x00\x0a\x00\x85\xffq\x00\ +\x0a\x00\x86\xffq\x00\x0a\x00\x87\xffq\x00\x0a\x00\x9f\x00\ +\x14\x00\x0a\x00\xa2\xff\x85\x00\x0a\x00\xa3\xff\xae\x00\x0a\x00\ +\xa4\xff\xae\x00\x0a\x00\xa5\xff\xae\x00\x0a\x00\xa6\xff\xae\x00\ +\x0a\x00\xa7\xff\xae\x00\x0a\x00\xa8\xff\xae\x00\x0a\x00\xa9\xff\ +\x85\x00\x0a\x00\xaa\xff\x85\x00\x0a\x00\xab\xff\x85\x00\x0a\x00\ +\xac\xff\x85\x00\x0a\x00\xad\xff\x85\x00\x0a\x00\xb4\xff\x85\x00\ +\x0a\x00\xb5\xff\x85\x00\x0a\x00\xb6\xff\x85\x00\x0a\x00\xb7\xff\ +\x85\x00\x0a\x00\xb8\xff\x85\x00\x0a\x00\xba\xff\x85\x00\x0a\x00\ +\xbb\xff\xc3\x00\x0a\x00\xbc\xff\xc3\x00\x0a\x00\xbd\xff\xc3\x00\ +\x0a\x00\xbe\xff\xc3\x00\x0a\x00\xc2\xffq\x00\x0a\x00\xc3\xff\ +\xae\x00\x0a\x00\xc4\xffq\x00\x0a\x00\xc5\xff\xae\x00\x0a\x00\ +\xc6\xffq\x00\x0a\x00\xc7\xff\xae\x00\x0a\x00\xc9\xff\x85\x00\ +\x0a\x00\xcb\xff\x85\x00\x0a\x00\xcd\xff\x85\x00\x0a\x00\xcf\xff\ +\x85\x00\x0a\x00\xd1\xff\x85\x00\x0a\x00\xd3\xff\x85\x00\x0a\x00\ +\xd5\xff\x85\x00\x0a\x00\xd7\xff\x85\x00\x0a\x00\xd9\xff\x85\x00\ +\x0a\x00\xdb\xff\x85\x00\x0a\x00\xdd\xff\x85\x00\x0a\x00\xdf\xff\ +\xc3\x00\x0a\x00\xe1\xff\xc3\x00\x0a\x00\xe3\xff\xc3\x00\x0a\x00\ +\xe5\xff\xc3\x00\x0a\x00\xfa\xff\xc3\x00\x0a\x01\x06\xff\xc3\x00\ +\x0a\x01\x08\xff\xc3\x00\x0a\x01\x0d\xff\xc3\x00\x0a\x01\x0f\xff\ +\x85\x00\x0a\x01\x11\xff\x85\x00\x0a\x01\x13\xff\x85\x00\x0a\x01\ +\x15\xff\x85\x00\x0a\x01\x17\xff\xc3\x00\x0a\x01\x19\xff\xc3\x00\ +\x0a\x01\x1d\xff\xc3\x00\x0a\x01!\xff\xc3\x00\x0a\x01$\x00\ +)\x00\x0a\x01&\x00)\x00\x0a\x01+\xff\xc3\x00\x0a\x01\ +-\xff\xc3\x00\x0a\x01/\xff\xc3\x00\x0a\x011\xff\xc3\x00\ +\x0a\x013\xff\xc3\x00\x0a\x015\xff\xc3\x00\x0a\x016\x00\ +)\x00\x0a\x018\x00\x14\x00\x0a\x01:\x00\x14\x00\x0a\x01\ +C\xffq\x00\x0a\x01D\xff\xae\x00\x0a\x01F\xff\xae\x00\ +\x0a\x01H\xff\x85\x00\x0a\x01J\xff\xc3\x00\x0a\x01V\xff\ +q\x00\x0a\x01_\xffq\x00\x0a\x01b\xffq\x00\x0a\x01\ +i\xffq\x00\x0a\x01y\xff\xae\x00\x0a\x01z\xff\xd7\x00\ +\x0a\x01{\xff\xd7\x00\x0a\x01~\xff\xae\x00\x0a\x01\x81\xff\ +\xc3\x00\x0a\x01\x82\xff\xd7\x00\x0a\x01\x83\xff\xd7\x00\x0a\x01\ +\x84\xff\xd7\x00\x0a\x01\x87\xff\xd7\x00\x0a\x01\x89\xff\xd7\x00\ +\x0a\x01\x8c\xff\xae\x00\x0a\x01\x8e\xff\xc3\x00\x0a\x01\x8f\xff\ +\xae\x00\x0a\x01\x90\xff\xae\x00\x0a\x01\x93\xff\xae\x00\x0a\x01\ +\x99\xff\xae\x00\x0a\x01\xa4\xff\x85\x00\x0a\x01\xaa\xffq\x00\ +\x0a\x01\xae\xff\x85\x00\x0a\x01\xb5\xff\x85\x00\x0a\x01\xca\xff\ +\xd7\x00\x0a\x01\xce\xffq\x00\x0a\x01\xcf\xff\x85\x00\x0a\x01\ +\xd5\xffq\x00\x0a\x01\xd8\xff\x85\x00\x0a\x01\xdb\xff\x85\x00\ +\x0a\x01\xde\xff\x85\x00\x0a\x01\xea\xff\x85\x00\x0a\x01\xed\xff\ +\x85\x00\x0a\x01\xee\xff\xc3\x00\x0a\x01\xf2\xffq\x00\x0a\x01\ +\xfa\x00)\x00\x0a\x01\xfc\x00)\x00\x0a\x01\xfe\x00)\x00\ +\x0a\x02\x00\x00\x14\x00\x0a\x02W\xff\xc3\x00\x0a\x02X\xff\ +q\x00\x0a\x02Y\xff\xae\x00\x0a\x02`\xff\x85\x00\x0a\x02\ +b\xff\xc3\x00\x0a\x02j\xff\x85\x00\x0a\x02r\xffq\x00\ +\x0a\x02s\xffq\x00\x0a\x02}\xff\xec\x00\x0a\x02\x7f\xff\ +\x85\x00\x0a\x02\x85\xff\x85\x00\x0a\x02\x87\xff\x85\x00\x0a\x02\ +\x89\xff\x85\x00\x0a\x02\x8d\xff\x85\x00\x0a\x02\xb2\xff\x85\x00\ +\x0a\x02\xb4\xff\x85\x00\x0a\x02\xce\xff\x85\x00\x0a\x02\xcf\xff\ +q\x00\x0a\x02\xd9\xffq\x00\x0a\x02\xda\xff\xd7\x00\x0a\x02\ +\xdb\xffq\x00\x0a\x02\xdc\xff\xd7\x00\x0a\x02\xdd\xffq\x00\ +\x0a\x02\xde\xff\xd7\x00\x0a\x02\xe0\xff\x85\x00\x0a\x02\xe2\xff\ +\xd7\x00\x0a\x02\xe4\xff\xd7\x00\x0a\x02\xf0\xff\x85\x00\x0a\x02\ +\xf2\xff\x85\x00\x0a\x02\xf4\xff\x85\x00\x0a\x03\x09\xffq\x00\ +\x0a\x03\x0a\xff\x85\x00\x0a\x03\x0b\xffq\x00\x0a\x03\x0c\xff\ +\x85\x00\x0a\x03\x11\xff\x85\x00\x0a\x03\x12\xffq\x00\x0a\x03\ +\x16\xff\x85\x00\x0a\x03\x1a\xff\x85\x00\x0a\x03\x1b\xff\x85\x00\ +\x0a\x03\x1c\xffq\x00\x0a\x03\x1d\xffq\x00\x0a\x03\x1e\xff\ +\xae\x00\x0a\x03\x1f\xffq\x00\x0a\x03 \xff\xae\x00\x0a\x03\ +!\xffq\x00\x0a\x03\x22\xff\xae\x00\x0a\x03#\xffq\x00\ +\x0a\x03%\xffq\x00\x0a\x03&\xff\xae\x00\x0a\x03'\xff\ +q\x00\x0a\x03(\xff\xae\x00\x0a\x03)\xffq\x00\x0a\x03\ +*\xff\xae\x00\x0a\x03+\xffq\x00\x0a\x03,\xff\xae\x00\ +\x0a\x03-\xffq\x00\x0a\x03.\xff\xae\x00\x0a\x03/\xff\ +q\x00\x0a\x030\xff\xae\x00\x0a\x031\xffq\x00\x0a\x03\ +2\xff\xae\x00\x0a\x033\xffq\x00\x0a\x034\xff\xae\x00\ +\x0a\x036\xff\x85\x00\x0a\x038\xff\x85\x00\x0a\x03:\xff\ +\x85\x00\x0a\x03<\xff\x85\x00\x0a\x03@\xff\x85\x00\x0a\x03\ +B\xff\x85\x00\x0a\x03D\xff\x85\x00\x0a\x03J\xff\x85\x00\ +\x0a\x03L\xff\x85\x00\x0a\x03N\xff\x85\x00\x0a\x03R\xff\ +\x85\x00\x0a\x03T\xff\x85\x00\x0a\x03V\xff\x85\x00\x0a\x03\ +X\xff\x85\x00\x0a\x03Z\xff\x85\x00\x0a\x03\x5c\xff\x85\x00\ +\x0a\x03^\xff\x85\x00\x0a\x03`\xff\x85\x00\x0a\x03b\xff\ +\xc3\x00\x0a\x03d\xff\xc3\x00\x0a\x03f\xff\xc3\x00\x0a\x03\ +h\xff\xc3\x00\x0a\x03j\xff\xc3\x00\x0a\x03l\xff\xc3\x00\ +\x0a\x03n\xff\xc3\x00\x0a\x03o\x00\x14\x00\x0a\x03q\x00\ +\x14\x00\x0a\x03s\x00\x14\x00\x0a\x03\x8f\x00)\x00\x0b\x00\ +-\x00\xb8\x00\x0f\x00&\xff\x9a\x00\x0f\x00*\xff\x9a\x00\ +\x0f\x002\xff\x9a\x00\x0f\x004\xff\x9a\x00\x0f\x007\xff\ +q\x00\x0f\x008\xff\xd7\x00\x0f\x009\xff\x85\x00\x0f\x00\ +:\xff\x85\x00\x0f\x00<\xff\x85\x00\x0f\x00\x89\xff\x9a\x00\ +\x0f\x00\x94\xff\x9a\x00\x0f\x00\x95\xff\x9a\x00\x0f\x00\x96\xff\ +\x9a\x00\x0f\x00\x97\xff\x9a\x00\x0f\x00\x98\xff\x9a\x00\x0f\x00\ +\x9a\xff\x9a\x00\x0f\x00\x9b\xff\xd7\x00\x0f\x00\x9c\xff\xd7\x00\ +\x0f\x00\x9d\xff\xd7\x00\x0f\x00\x9e\xff\xd7\x00\x0f\x00\x9f\xff\ +\x85\x00\x0f\x00\xc8\xff\x9a\x00\x0f\x00\xca\xff\x9a\x00\x0f\x00\ +\xcc\xff\x9a\x00\x0f\x00\xce\xff\x9a\x00\x0f\x00\xde\xff\x9a\x00\ +\x0f\x00\xe0\xff\x9a\x00\x0f\x00\xe2\xff\x9a\x00\x0f\x00\xe4\xff\ +\x9a\x00\x0f\x01\x0e\xff\x9a\x00\x0f\x01\x10\xff\x9a\x00\x0f\x01\ +\x12\xff\x9a\x00\x0f\x01\x14\xff\x9a\x00\x0f\x01$\xffq\x00\ +\x0f\x01&\xffq\x00\x0f\x01*\xff\xd7\x00\x0f\x01,\xff\ +\xd7\x00\x0f\x01.\xff\xd7\x00\x0f\x010\xff\xd7\x00\x0f\x01\ +2\xff\xd7\x00\x0f\x014\xff\xd7\x00\x0f\x016\xff\x85\x00\ +\x0f\x018\xff\x85\x00\x0f\x01:\xff\x85\x00\x0f\x01G\xff\ +\x9a\x00\x0f\x01f\xff\xae\x00\x0f\x01m\xff\xae\x00\x0f\x01\ +q\xffq\x00\x0f\x01r\xff\x85\x00\x0f\x01s\xff\x9a\x00\ +\x0f\x01u\xff\x85\x00\x0f\x01x\xff\x85\x00\x0f\x01\x85\xff\ +\xd7\x00\x0f\x01\x9d\xffq\x00\x0f\x01\x9f\xff\x9a\x00\x0f\x01\ +\xa6\xffq\x00\x0f\x01\xb8\xff\x9a\x00\x0f\x01\xbb\xff\x9a\x00\ +\x0f\x01\xbc\xffq\x00\x0f\x01\xbe\xff\xae\x00\x0f\x01\xc1\xff\ +\x5c\x00\x0f\x01\xc4\xffq\x00\x0f\x01\xdc\xff\x9a\x00\x0f\x01\ +\xe1\xff\x85\x00\x0f\x01\xe4\xff\x9a\x00\x0f\x01\xfa\xff\x85\x00\ +\x0f\x01\xfc\xff\x85\x00\x0f\x01\xfe\xff\x85\x00\x0f\x02\x00\xff\ +\x85\x00\x0f\x02T\xff\x85\x00\x0f\x02_\xff\x9a\x00\x0f\x02\ +a\xff\xd7\x00\x0f\x02l\xff\x9a\x00\x0f\x02|\xff\x5c\x00\ +\x0f\x02~\xff\x9a\x00\x0f\x02\x80\xff\x85\x00\x0f\x02\x82\xff\ +\x85\x00\x0f\x02\x84\xff\x9a\x00\x0f\x02\x86\xff\x9a\x00\x0f\x02\ +\x88\xff\x9a\x00\x0f\x02\x8a\xff\x9a\x00\x0f\x02\x8c\xff\x9a\x00\ +\x0f\x02\xa9\xffq\x00\x0f\x02\xaa\xff\x9a\x00\x0f\x02\xb1\xff\ +\x9a\x00\x0f\x02\xb3\xff\x9a\x00\x0f\x02\xb5\xffq\x00\x0f\x02\ +\xb6\xff\x9a\x00\x0f\x02\xb7\xff\x85\x00\x0f\x02\xb9\xff\x85\x00\ +\x0f\x02\xbd\xffq\x00\x0f\x02\xbe\xff\x9a\x00\x0f\x02\xbf\xff\ +\x5c\x00\x0f\x02\xc0\xff\x85\x00\x0f\x02\xc1\xff\x5c\x00\x0f\x02\ +\xc2\xff\x85\x00\x0f\x02\xc5\xff\x85\x00\x0f\x02\xc7\xff\x85\x00\ +\x0f\x02\xd4\xff\x5c\x00\x0f\x02\xd5\xff\x85\x00\x0f\x02\xef\xff\ +\x9a\x00\x0f\x02\xf1\xff\x9a\x00\x0f\x02\xf3\xff\x9a\x00\x0f\x02\ +\xfd\xff\x5c\x00\x0f\x02\xfe\xff\x85\x00\x0f\x03\x0d\xff\x85\x00\ +\x0f\x03\x0e\xff\x9a\x00\x0f\x03\x0f\xff\x85\x00\x0f\x03\x10\xff\ +\x9a\x00\x0f\x03\x15\xff\x9a\x00\x0f\x03\x17\xffq\x00\x0f\x03\ +\x18\xff\x9a\x00\x0f\x03I\xff\x9a\x00\x0f\x03K\xff\x9a\x00\ +\x0f\x03M\xff\x9a\x00\x0f\x03O\xff\x9a\x00\x0f\x03Q\xff\ +\x9a\x00\x0f\x03S\xff\x9a\x00\x0f\x03U\xff\x9a\x00\x0f\x03\ +W\xff\x9a\x00\x0f\x03Y\xff\x9a\x00\x0f\x03[\xff\x9a\x00\ +\x0f\x03]\xff\x9a\x00\x0f\x03_\xff\x9a\x00\x0f\x03a\xff\ +\xd7\x00\x0f\x03c\xff\xd7\x00\x0f\x03e\xff\xd7\x00\x0f\x03\ +g\xff\xd7\x00\x0f\x03i\xff\xd7\x00\x0f\x03k\xff\xd7\x00\ +\x0f\x03m\xff\xd7\x00\x0f\x03o\xff\x85\x00\x0f\x03q\xff\ +\x85\x00\x0f\x03s\xff\x85\x00\x0f\x03\x8f\xffq\x00\x10\x00\ +7\xff\xae\x00\x10\x01$\xff\xae\x00\x10\x01&\xff\xae\x00\ +\x10\x01q\xff\xae\x00\x10\x01\x9d\xff\xae\x00\x10\x01\xa6\xff\ +\xae\x00\x10\x01\xbc\xff\xae\x00\x10\x01\xc4\xff\xae\x00\x10\x01\ +\xdc\xff\xd7\x00\x10\x01\xe4\xff\xd7\x00\x10\x02\xa9\xff\xae\x00\ +\x10\x02\xaa\xff\xd7\x00\x10\x02\xb5\xff\xae\x00\x10\x02\xb6\xff\ +\xd7\x00\x10\x02\xbd\xff\xae\x00\x10\x02\xbe\xff\xd7\x00\x10\x03\ +\x17\xff\xae\x00\x10\x03\x18\xff\xd7\x00\x10\x03\x8f\xff\xae\x00\ +\x11\x00&\xff\x9a\x00\x11\x00*\xff\x9a\x00\x11\x002\xff\ +\x9a\x00\x11\x004\xff\x9a\x00\x11\x007\xffq\x00\x11\x00\ +8\xff\xd7\x00\x11\x009\xff\x85\x00\x11\x00:\xff\x85\x00\ +\x11\x00<\xff\x85\x00\x11\x00\x89\xff\x9a\x00\x11\x00\x94\xff\ +\x9a\x00\x11\x00\x95\xff\x9a\x00\x11\x00\x96\xff\x9a\x00\x11\x00\ +\x97\xff\x9a\x00\x11\x00\x98\xff\x9a\x00\x11\x00\x9a\xff\x9a\x00\ +\x11\x00\x9b\xff\xd7\x00\x11\x00\x9c\xff\xd7\x00\x11\x00\x9d\xff\ +\xd7\x00\x11\x00\x9e\xff\xd7\x00\x11\x00\x9f\xff\x85\x00\x11\x00\ +\xc8\xff\x9a\x00\x11\x00\xca\xff\x9a\x00\x11\x00\xcc\xff\x9a\x00\ +\x11\x00\xce\xff\x9a\x00\x11\x00\xde\xff\x9a\x00\x11\x00\xe0\xff\ +\x9a\x00\x11\x00\xe2\xff\x9a\x00\x11\x00\xe4\xff\x9a\x00\x11\x01\ +\x0e\xff\x9a\x00\x11\x01\x10\xff\x9a\x00\x11\x01\x12\xff\x9a\x00\ +\x11\x01\x14\xff\x9a\x00\x11\x01$\xffq\x00\x11\x01&\xff\ +q\x00\x11\x01*\xff\xd7\x00\x11\x01,\xff\xd7\x00\x11\x01\ +.\xff\xd7\x00\x11\x010\xff\xd7\x00\x11\x012\xff\xd7\x00\ +\x11\x014\xff\xd7\x00\x11\x016\xff\x85\x00\x11\x018\xff\ +\x85\x00\x11\x01:\xff\x85\x00\x11\x01G\xff\x9a\x00\x11\x01\ +f\xff\xae\x00\x11\x01m\xff\xae\x00\x11\x01q\xffq\x00\ +\x11\x01r\xff\x85\x00\x11\x01s\xff\x9a\x00\x11\x01u\xff\ +\x85\x00\x11\x01x\xff\x85\x00\x11\x01\x85\xff\xd7\x00\x11\x01\ +\x9d\xffq\x00\x11\x01\x9f\xff\x9a\x00\x11\x01\xa6\xffq\x00\ +\x11\x01\xb8\xff\x9a\x00\x11\x01\xbb\xff\x9a\x00\x11\x01\xbc\xff\ +q\x00\x11\x01\xbe\xff\xae\x00\x11\x01\xc1\xff\x5c\x00\x11\x01\ +\xc4\xffq\x00\x11\x01\xdc\xff\x9a\x00\x11\x01\xe1\xff\x85\x00\ +\x11\x01\xe4\xff\x9a\x00\x11\x01\xfa\xff\x85\x00\x11\x01\xfc\xff\ +\x85\x00\x11\x01\xfe\xff\x85\x00\x11\x02\x00\xff\x85\x00\x11\x02\ +T\xff\x85\x00\x11\x02_\xff\x9a\x00\x11\x02a\xff\xd7\x00\ +\x11\x02l\xff\x9a\x00\x11\x02|\xff\x5c\x00\x11\x02~\xff\ +\x9a\x00\x11\x02\x80\xff\x85\x00\x11\x02\x82\xff\x85\x00\x11\x02\ +\x84\xff\x9a\x00\x11\x02\x86\xff\x9a\x00\x11\x02\x88\xff\x9a\x00\ +\x11\x02\x8a\xff\x9a\x00\x11\x02\x8c\xff\x9a\x00\x11\x02\xa9\xff\ +q\x00\x11\x02\xaa\xff\x9a\x00\x11\x02\xb1\xff\x9a\x00\x11\x02\ +\xb3\xff\x9a\x00\x11\x02\xb5\xffq\x00\x11\x02\xb6\xff\x9a\x00\ +\x11\x02\xb7\xff\x85\x00\x11\x02\xb9\xff\x85\x00\x11\x02\xbd\xff\ +q\x00\x11\x02\xbe\xff\x9a\x00\x11\x02\xbf\xff\x5c\x00\x11\x02\ +\xc0\xff\x85\x00\x11\x02\xc1\xff\x5c\x00\x11\x02\xc2\xff\x85\x00\ +\x11\x02\xc5\xff\x85\x00\x11\x02\xc7\xff\x85\x00\x11\x02\xd4\xff\ +\x5c\x00\x11\x02\xd5\xff\x85\x00\x11\x02\xef\xff\x9a\x00\x11\x02\ +\xf1\xff\x9a\x00\x11\x02\xf3\xff\x9a\x00\x11\x02\xfd\xff\x5c\x00\ +\x11\x02\xfe\xff\x85\x00\x11\x03\x0d\xff\x85\x00\x11\x03\x0e\xff\ +\x9a\x00\x11\x03\x0f\xff\x85\x00\x11\x03\x10\xff\x9a\x00\x11\x03\ +\x15\xff\x9a\x00\x11\x03\x17\xffq\x00\x11\x03\x18\xff\x9a\x00\ +\x11\x03I\xff\x9a\x00\x11\x03K\xff\x9a\x00\x11\x03M\xff\ +\x9a\x00\x11\x03O\xff\x9a\x00\x11\x03Q\xff\x9a\x00\x11\x03\ +S\xff\x9a\x00\x11\x03U\xff\x9a\x00\x11\x03W\xff\x9a\x00\ +\x11\x03Y\xff\x9a\x00\x11\x03[\xff\x9a\x00\x11\x03]\xff\ +\x9a\x00\x11\x03_\xff\x9a\x00\x11\x03a\xff\xd7\x00\x11\x03\ +c\xff\xd7\x00\x11\x03e\xff\xd7\x00\x11\x03g\xff\xd7\x00\ +\x11\x03i\xff\xd7\x00\x11\x03k\xff\xd7\x00\x11\x03m\xff\ +\xd7\x00\x11\x03o\xff\x85\x00\x11\x03q\xff\x85\x00\x11\x03\ +s\xff\x85\x00\x11\x03\x8f\xffq\x00$\x00\x05\xffq\x00\ +$\x00\x0a\xffq\x00$\x00&\xff\xd7\x00$\x00*\xff\ +\xd7\x00$\x00-\x01\x0a\x00$\x002\xff\xd7\x00$\x00\ +4\xff\xd7\x00$\x007\xffq\x00$\x009\xff\xae\x00\ +$\x00:\xff\xae\x00$\x00<\xff\x85\x00$\x00\x89\xff\ +\xd7\x00$\x00\x94\xff\xd7\x00$\x00\x95\xff\xd7\x00$\x00\ +\x96\xff\xd7\x00$\x00\x97\xff\xd7\x00$\x00\x98\xff\xd7\x00\ +$\x00\x9a\xff\xd7\x00$\x00\x9f\xff\x85\x00$\x00\xc8\xff\ +\xd7\x00$\x00\xca\xff\xd7\x00$\x00\xcc\xff\xd7\x00$\x00\ +\xce\xff\xd7\x00$\x00\xde\xff\xd7\x00$\x00\xe0\xff\xd7\x00\ +$\x00\xe2\xff\xd7\x00$\x00\xe4\xff\xd7\x00$\x01\x0e\xff\ +\xd7\x00$\x01\x10\xff\xd7\x00$\x01\x12\xff\xd7\x00$\x01\ +\x14\xff\xd7\x00$\x01$\xffq\x00$\x01&\xffq\x00\ +$\x016\xff\xae\x00$\x018\xff\x85\x00$\x01:\xff\ +\x85\x00$\x01G\xff\xd7\x00$\x01\xfa\xff\xae\x00$\x01\ +\xfc\xff\xae\x00$\x01\xfe\xff\xae\x00$\x02\x00\xff\x85\x00\ +$\x02\x07\xffq\x00$\x02\x0b\xffq\x00$\x02_\xff\ +\xd7\x00$\x03I\xff\xd7\x00$\x03K\xff\xd7\x00$\x03\ +M\xff\xd7\x00$\x03O\xff\xd7\x00$\x03Q\xff\xd7\x00\ +$\x03S\xff\xd7\x00$\x03U\xff\xd7\x00$\x03W\xff\ +\xd7\x00$\x03Y\xff\xd7\x00$\x03[\xff\xd7\x00$\x03\ +]\xff\xd7\x00$\x03_\xff\xd7\x00$\x03o\xff\x85\x00\ +$\x03q\xff\x85\x00$\x03s\xff\x85\x00$\x03\x8f\xff\ +q\x00%\x00\x0f\xff\xae\x00%\x00\x11\xff\xae\x00%\x00\ +$\xff\xd7\x00%\x007\xff\xc3\x00%\x009\xff\xec\x00\ +%\x00:\xff\xec\x00%\x00;\xff\xd7\x00%\x00<\xff\ +\xec\x00%\x00=\xff\xec\x00%\x00\x82\xff\xd7\x00%\x00\ +\x83\xff\xd7\x00%\x00\x84\xff\xd7\x00%\x00\x85\xff\xd7\x00\ +%\x00\x86\xff\xd7\x00%\x00\x87\xff\xd7\x00%\x00\x9f\xff\ +\xec\x00%\x00\xc2\xff\xd7\x00%\x00\xc4\xff\xd7\x00%\x00\ +\xc6\xff\xd7\x00%\x01$\xff\xc3\x00%\x01&\xff\xc3\x00\ +%\x016\xff\xec\x00%\x018\xff\xec\x00%\x01:\xff\ +\xec\x00%\x01;\xff\xec\x00%\x01=\xff\xec\x00%\x01\ +?\xff\xec\x00%\x01C\xff\xd7\x00%\x01\xa0\xff\xec\x00\ +%\x01\xfa\xff\xec\x00%\x01\xfc\xff\xec\x00%\x01\xfe\xff\ +\xec\x00%\x02\x00\xff\xec\x00%\x02\x08\xff\xae\x00%\x02\ +\x0c\xff\xae\x00%\x02X\xff\xd7\x00%\x03\x1d\xff\xd7\x00\ +%\x03\x1f\xff\xd7\x00%\x03!\xff\xd7\x00%\x03#\xff\ +\xd7\x00%\x03%\xff\xd7\x00%\x03'\xff\xd7\x00%\x03\ +)\xff\xd7\x00%\x03+\xff\xd7\x00%\x03-\xff\xd7\x00\ +%\x03/\xff\xd7\x00%\x031\xff\xd7\x00%\x033\xff\ +\xd7\x00%\x03o\xff\xec\x00%\x03q\xff\xec\x00%\x03\ +s\xff\xec\x00%\x03\x8f\xff\xc3\x00&\x00&\xff\xd7\x00\ +&\x00*\xff\xd7\x00&\x002\xff\xd7\x00&\x004\xff\ +\xd7\x00&\x00\x89\xff\xd7\x00&\x00\x94\xff\xd7\x00&\x00\ +\x95\xff\xd7\x00&\x00\x96\xff\xd7\x00&\x00\x97\xff\xd7\x00\ +&\x00\x98\xff\xd7\x00&\x00\x9a\xff\xd7\x00&\x00\xc8\xff\ +\xd7\x00&\x00\xca\xff\xd7\x00&\x00\xcc\xff\xd7\x00&\x00\ +\xce\xff\xd7\x00&\x00\xde\xff\xd7\x00&\x00\xe0\xff\xd7\x00\ +&\x00\xe2\xff\xd7\x00&\x00\xe4\xff\xd7\x00&\x01\x0e\xff\ +\xd7\x00&\x01\x10\xff\xd7\x00&\x01\x12\xff\xd7\x00&\x01\ +\x14\xff\xd7\x00&\x01G\xff\xd7\x00&\x02_\xff\xd7\x00\ +&\x03I\xff\xd7\x00&\x03K\xff\xd7\x00&\x03M\xff\ +\xd7\x00&\x03O\xff\xd7\x00&\x03Q\xff\xd7\x00&\x03\ +S\xff\xd7\x00&\x03U\xff\xd7\x00&\x03W\xff\xd7\x00\ +&\x03Y\xff\xd7\x00&\x03[\xff\xd7\x00&\x03]\xff\ +\xd7\x00&\x03_\xff\xd7\x00'\x00\x0f\xff\xae\x00'\x00\ +\x11\xff\xae\x00'\x00$\xff\xd7\x00'\x007\xff\xc3\x00\ +'\x009\xff\xec\x00'\x00:\xff\xec\x00'\x00;\xff\ +\xd7\x00'\x00<\xff\xec\x00'\x00=\xff\xec\x00'\x00\ +\x82\xff\xd7\x00'\x00\x83\xff\xd7\x00'\x00\x84\xff\xd7\x00\ +'\x00\x85\xff\xd7\x00'\x00\x86\xff\xd7\x00'\x00\x87\xff\ +\xd7\x00'\x00\x9f\xff\xec\x00'\x00\xc2\xff\xd7\x00'\x00\ +\xc4\xff\xd7\x00'\x00\xc6\xff\xd7\x00'\x01$\xff\xc3\x00\ +'\x01&\xff\xc3\x00'\x016\xff\xec\x00'\x018\xff\ +\xec\x00'\x01:\xff\xec\x00'\x01;\xff\xec\x00'\x01\ +=\xff\xec\x00'\x01?\xff\xec\x00'\x01C\xff\xd7\x00\ +'\x01\xa0\xff\xec\x00'\x01\xfa\xff\xec\x00'\x01\xfc\xff\ +\xec\x00'\x01\xfe\xff\xec\x00'\x02\x00\xff\xec\x00'\x02\ +\x08\xff\xae\x00'\x02\x0c\xff\xae\x00'\x02X\xff\xd7\x00\ +'\x03\x1d\xff\xd7\x00'\x03\x1f\xff\xd7\x00'\x03!\xff\ +\xd7\x00'\x03#\xff\xd7\x00'\x03%\xff\xd7\x00'\x03\ +'\xff\xd7\x00'\x03)\xff\xd7\x00'\x03+\xff\xd7\x00\ +'\x03-\xff\xd7\x00'\x03/\xff\xd7\x00'\x031\xff\ +\xd7\x00'\x033\xff\xd7\x00'\x03o\xff\xec\x00'\x03\ +q\xff\xec\x00'\x03s\xff\xec\x00'\x03\x8f\xff\xc3\x00\ +(\x00-\x00{\x00)\x00\x0f\xff\x85\x00)\x00\x11\xff\ +\x85\x00)\x00\x22\x00)\x00)\x00$\xff\xd7\x00)\x00\ +\x82\xff\xd7\x00)\x00\x83\xff\xd7\x00)\x00\x84\xff\xd7\x00\ +)\x00\x85\xff\xd7\x00)\x00\x86\xff\xd7\x00)\x00\x87\xff\ +\xd7\x00)\x00\xc2\xff\xd7\x00)\x00\xc4\xff\xd7\x00)\x00\ +\xc6\xff\xd7\x00)\x01C\xff\xd7\x00)\x02\x08\xff\x85\x00\ +)\x02\x0c\xff\x85\x00)\x02X\xff\xd7\x00)\x03\x1d\xff\ +\xd7\x00)\x03\x1f\xff\xd7\x00)\x03!\xff\xd7\x00)\x03\ +#\xff\xd7\x00)\x03%\xff\xd7\x00)\x03'\xff\xd7\x00\ +)\x03)\xff\xd7\x00)\x03+\xff\xd7\x00)\x03-\xff\ +\xd7\x00)\x03/\xff\xd7\x00)\x031\xff\xd7\x00)\x03\ +3\xff\xd7\x00.\x00&\xff\xd7\x00.\x00*\xff\xd7\x00\ +.\x002\xff\xd7\x00.\x004\xff\xd7\x00.\x00\x89\xff\ +\xd7\x00.\x00\x94\xff\xd7\x00.\x00\x95\xff\xd7\x00.\x00\ +\x96\xff\xd7\x00.\x00\x97\xff\xd7\x00.\x00\x98\xff\xd7\x00\ +.\x00\x9a\xff\xd7\x00.\x00\xc8\xff\xd7\x00.\x00\xca\xff\ +\xd7\x00.\x00\xcc\xff\xd7\x00.\x00\xce\xff\xd7\x00.\x00\ +\xde\xff\xd7\x00.\x00\xe0\xff\xd7\x00.\x00\xe2\xff\xd7\x00\ +.\x00\xe4\xff\xd7\x00.\x01\x0e\xff\xd7\x00.\x01\x10\xff\ +\xd7\x00.\x01\x12\xff\xd7\x00.\x01\x14\xff\xd7\x00.\x01\ +G\xff\xd7\x00.\x02_\xff\xd7\x00.\x03I\xff\xd7\x00\ +.\x03K\xff\xd7\x00.\x03M\xff\xd7\x00.\x03O\xff\ +\xd7\x00.\x03Q\xff\xd7\x00.\x03S\xff\xd7\x00.\x03\ +U\xff\xd7\x00.\x03W\xff\xd7\x00.\x03Y\xff\xd7\x00\ +.\x03[\xff\xd7\x00.\x03]\xff\xd7\x00.\x03_\xff\ +\xd7\x00/\x00\x05\xff\x5c\x00/\x00\x0a\xff\x5c\x00/\x00\ +&\xff\xd7\x00/\x00*\xff\xd7\x00/\x002\xff\xd7\x00\ +/\x004\xff\xd7\x00/\x007\xff\xd7\x00/\x008\xff\ +\xec\x00/\x009\xff\xd7\x00/\x00:\xff\xd7\x00/\x00\ +<\xff\xc3\x00/\x00\x89\xff\xd7\x00/\x00\x94\xff\xd7\x00\ +/\x00\x95\xff\xd7\x00/\x00\x96\xff\xd7\x00/\x00\x97\xff\ +\xd7\x00/\x00\x98\xff\xd7\x00/\x00\x9a\xff\xd7\x00/\x00\ +\x9b\xff\xec\x00/\x00\x9c\xff\xec\x00/\x00\x9d\xff\xec\x00\ +/\x00\x9e\xff\xec\x00/\x00\x9f\xff\xc3\x00/\x00\xc8\xff\ +\xd7\x00/\x00\xca\xff\xd7\x00/\x00\xcc\xff\xd7\x00/\x00\ +\xce\xff\xd7\x00/\x00\xde\xff\xd7\x00/\x00\xe0\xff\xd7\x00\ +/\x00\xe2\xff\xd7\x00/\x00\xe4\xff\xd7\x00/\x01\x0e\xff\ +\xd7\x00/\x01\x10\xff\xd7\x00/\x01\x12\xff\xd7\x00/\x01\ +\x14\xff\xd7\x00/\x01$\xff\xd7\x00/\x01&\xff\xd7\x00\ +/\x01*\xff\xec\x00/\x01,\xff\xec\x00/\x01.\xff\ +\xec\x00/\x010\xff\xec\x00/\x012\xff\xec\x00/\x01\ +4\xff\xec\x00/\x016\xff\xd7\x00/\x018\xff\xc3\x00\ +/\x01:\xff\xc3\x00/\x01G\xff\xd7\x00/\x01\xfa\xff\ +\xd7\x00/\x01\xfc\xff\xd7\x00/\x01\xfe\xff\xd7\x00/\x02\ +\x00\xff\xc3\x00/\x02\x07\xff\x5c\x00/\x02\x0b\xff\x5c\x00\ +/\x02_\xff\xd7\x00/\x02a\xff\xec\x00/\x03I\xff\ +\xd7\x00/\x03K\xff\xd7\x00/\x03M\xff\xd7\x00/\x03\ +O\xff\xd7\x00/\x03Q\xff\xd7\x00/\x03S\xff\xd7\x00\ +/\x03U\xff\xd7\x00/\x03W\xff\xd7\x00/\x03Y\xff\ +\xd7\x00/\x03[\xff\xd7\x00/\x03]\xff\xd7\x00/\x03\ +_\xff\xd7\x00/\x03a\xff\xec\x00/\x03c\xff\xec\x00\ +/\x03e\xff\xec\x00/\x03g\xff\xec\x00/\x03i\xff\ +\xec\x00/\x03k\xff\xec\x00/\x03m\xff\xec\x00/\x03\ +o\xff\xc3\x00/\x03q\xff\xc3\x00/\x03s\xff\xc3\x00\ +/\x03\x8f\xff\xd7\x002\x00\x0f\xff\xae\x002\x00\x11\xff\ +\xae\x002\x00$\xff\xd7\x002\x007\xff\xc3\x002\x00\ +9\xff\xec\x002\x00:\xff\xec\x002\x00;\xff\xd7\x00\ +2\x00<\xff\xec\x002\x00=\xff\xec\x002\x00\x82\xff\ +\xd7\x002\x00\x83\xff\xd7\x002\x00\x84\xff\xd7\x002\x00\ +\x85\xff\xd7\x002\x00\x86\xff\xd7\x002\x00\x87\xff\xd7\x00\ +2\x00\x9f\xff\xec\x002\x00\xc2\xff\xd7\x002\x00\xc4\xff\ +\xd7\x002\x00\xc6\xff\xd7\x002\x01$\xff\xc3\x002\x01\ +&\xff\xc3\x002\x016\xff\xec\x002\x018\xff\xec\x00\ +2\x01:\xff\xec\x002\x01;\xff\xec\x002\x01=\xff\ +\xec\x002\x01?\xff\xec\x002\x01C\xff\xd7\x002\x01\ +\xa0\xff\xec\x002\x01\xfa\xff\xec\x002\x01\xfc\xff\xec\x00\ +2\x01\xfe\xff\xec\x002\x02\x00\xff\xec\x002\x02\x08\xff\ +\xae\x002\x02\x0c\xff\xae\x002\x02X\xff\xd7\x002\x03\ +\x1d\xff\xd7\x002\x03\x1f\xff\xd7\x002\x03!\xff\xd7\x00\ +2\x03#\xff\xd7\x002\x03%\xff\xd7\x002\x03'\xff\ +\xd7\x002\x03)\xff\xd7\x002\x03+\xff\xd7\x002\x03\ +-\xff\xd7\x002\x03/\xff\xd7\x002\x031\xff\xd7\x00\ +2\x033\xff\xd7\x002\x03o\xff\xec\x002\x03q\xff\ +\xec\x002\x03s\xff\xec\x002\x03\x8f\xff\xc3\x003\x00\ +\x0f\xfe\xf6\x003\x00\x11\xfe\xf6\x003\x00$\xff\x9a\x00\ +3\x00;\xff\xd7\x003\x00=\xff\xec\x003\x00\x82\xff\ +\x9a\x003\x00\x83\xff\x9a\x003\x00\x84\xff\x9a\x003\x00\ +\x85\xff\x9a\x003\x00\x86\xff\x9a\x003\x00\x87\xff\x9a\x00\ +3\x00\xc2\xff\x9a\x003\x00\xc4\xff\x9a\x003\x00\xc6\xff\ +\x9a\x003\x01;\xff\xec\x003\x01=\xff\xec\x003\x01\ +?\xff\xec\x003\x01C\xff\x9a\x003\x02\x08\xfe\xf6\x00\ +3\x02\x0c\xfe\xf6\x003\x02X\xff\x9a\x003\x03\x1d\xff\ +\x9a\x003\x03\x1f\xff\x9a\x003\x03!\xff\x9a\x003\x03\ +#\xff\x9a\x003\x03%\xff\x9a\x003\x03'\xff\x9a\x00\ +3\x03)\xff\x9a\x003\x03+\xff\x9a\x003\x03-\xff\ +\x9a\x003\x03/\xff\x9a\x003\x031\xff\x9a\x003\x03\ +3\xff\x9a\x004\x00\x0f\xff\xae\x004\x00\x11\xff\xae\x00\ +4\x00$\xff\xd7\x004\x007\xff\xc3\x004\x009\xff\ +\xec\x004\x00:\xff\xec\x004\x00;\xff\xd7\x004\x00\ +<\xff\xec\x004\x00=\xff\xec\x004\x00\x82\xff\xd7\x00\ +4\x00\x83\xff\xd7\x004\x00\x84\xff\xd7\x004\x00\x85\xff\ +\xd7\x004\x00\x86\xff\xd7\x004\x00\x87\xff\xd7\x004\x00\ +\x9f\xff\xec\x004\x00\xc2\xff\xd7\x004\x00\xc4\xff\xd7\x00\ +4\x00\xc6\xff\xd7\x004\x01$\xff\xc3\x004\x01&\xff\ +\xc3\x004\x016\xff\xec\x004\x018\xff\xec\x004\x01\ +:\xff\xec\x004\x01;\xff\xec\x004\x01=\xff\xec\x00\ +4\x01?\xff\xec\x004\x01C\xff\xd7\x004\x01\xa0\xff\ +\xec\x004\x01\xfa\xff\xec\x004\x01\xfc\xff\xec\x004\x01\ +\xfe\xff\xec\x004\x02\x00\xff\xec\x004\x02\x08\xff\xae\x00\ +4\x02\x0c\xff\xae\x004\x02X\xff\xd7\x004\x03\x1d\xff\ +\xd7\x004\x03\x1f\xff\xd7\x004\x03!\xff\xd7\x004\x03\ +#\xff\xd7\x004\x03%\xff\xd7\x004\x03'\xff\xd7\x00\ +4\x03)\xff\xd7\x004\x03+\xff\xd7\x004\x03-\xff\ +\xd7\x004\x03/\xff\xd7\x004\x031\xff\xd7\x004\x03\ +3\xff\xd7\x004\x03o\xff\xec\x004\x03q\xff\xec\x00\ +4\x03s\xff\xec\x004\x03\x8f\xff\xc3\x007\x00\x0f\xff\ +\x85\x007\x00\x10\xff\xae\x007\x00\x11\xff\x85\x007\x00\ +\x22\x00)\x007\x00$\xffq\x007\x00&\xff\xd7\x00\ +7\x00*\xff\xd7\x007\x002\xff\xd7\x007\x004\xff\ +\xd7\x007\x007\x00)\x007\x00D\xff\x5c\x007\x00\ +F\xffq\x007\x00G\xffq\x007\x00H\xffq\x00\ +7\x00J\xffq\x007\x00P\xff\x9a\x007\x00Q\xff\ +\x9a\x007\x00R\xffq\x007\x00S\xff\x9a\x007\x00\ +T\xffq\x007\x00U\xff\x9a\x007\x00V\xff\x85\x00\ +7\x00X\xff\x9a\x007\x00Y\xff\xd7\x007\x00Z\xff\ +\xd7\x007\x00[\xff\xd7\x007\x00\x5c\xff\xd7\x007\x00\ +]\xff\xae\x007\x00\x82\xffq\x007\x00\x83\xffq\x00\ +7\x00\x84\xffq\x007\x00\x85\xffq\x007\x00\x86\xff\ +q\x007\x00\x87\xffq\x007\x00\x89\xff\xd7\x007\x00\ +\x94\xff\xd7\x007\x00\x95\xff\xd7\x007\x00\x96\xff\xd7\x00\ +7\x00\x97\xff\xd7\x007\x00\x98\xff\xd7\x007\x00\x9a\xff\ +\xd7\x007\x00\xa2\xffq\x007\x00\xa3\xff\x5c\x007\x00\ +\xa4\xff\x5c\x007\x00\xa5\xff\x5c\x007\x00\xa6\xff\x5c\x00\ +7\x00\xa7\xff\x5c\x007\x00\xa8\xff\x5c\x007\x00\xa9\xff\ +q\x007\x00\xaa\xffq\x007\x00\xab\xffq\x007\x00\ +\xac\xffq\x007\x00\xad\xffq\x007\x00\xb4\xffq\x00\ +7\x00\xb5\xffq\x007\x00\xb6\xffq\x007\x00\xb7\xff\ +q\x007\x00\xb8\xffq\x007\x00\xba\xffq\x007\x00\ +\xbb\xff\x9a\x007\x00\xbc\xff\x9a\x007\x00\xbd\xff\x9a\x00\ +7\x00\xbe\xff\x9a\x007\x00\xbf\xff\xd7\x007\x00\xc2\xff\ +q\x007\x00\xc3\xff\x5c\x007\x00\xc4\xffq\x007\x00\ +\xc5\xff\x5c\x007\x00\xc6\xffq\x007\x00\xc7\xff\x5c\x00\ +7\x00\xc8\xff\xd7\x007\x00\xc9\xffq\x007\x00\xca\xff\ +\xd7\x007\x00\xcb\xffq\x007\x00\xcc\xff\xd7\x007\x00\ +\xcd\xffq\x007\x00\xce\xff\xd7\x007\x00\xcf\xffq\x00\ +7\x00\xd1\xffq\x007\x00\xd3\xffq\x007\x00\xd5\xff\ +q\x007\x00\xd7\xffq\x007\x00\xd9\xffq\x007\x00\ +\xdb\xffq\x007\x00\xdd\xffq\x007\x00\xde\xff\xd7\x00\ +7\x00\xdf\xffq\x007\x00\xe0\xff\xd7\x007\x00\xe1\xff\ +q\x007\x00\xe2\xff\xd7\x007\x00\xe3\xffq\x007\x00\ +\xe4\xff\xd7\x007\x00\xe5\xffq\x007\x00\xfa\xff\x9a\x00\ +7\x01\x06\xff\x9a\x007\x01\x08\xff\x9a\x007\x01\x0d\xff\ +\x9a\x007\x01\x0e\xff\xd7\x007\x01\x0f\xffq\x007\x01\ +\x10\xff\xd7\x007\x01\x11\xffq\x007\x01\x12\xff\xd7\x00\ +7\x01\x13\xffq\x007\x01\x14\xff\xd7\x007\x01\x15\xff\ +q\x007\x01\x17\xff\x9a\x007\x01\x19\xff\x9a\x007\x01\ +\x1d\xff\x85\x007\x01!\xff\x85\x007\x01$\x00)\x00\ +7\x01&\x00)\x007\x01+\xff\x9a\x007\x01-\xff\ +\x9a\x007\x01/\xff\x9a\x007\x011\xff\x9a\x007\x01\ +3\xff\x9a\x007\x015\xff\x9a\x007\x017\xff\xd7\x00\ +7\x01<\xff\xae\x007\x01>\xff\xae\x007\x01@\xff\ +\xae\x007\x01C\xffq\x007\x01D\xff\x5c\x007\x01\ +F\xff\x5c\x007\x01G\xff\xd7\x007\x01H\xffq\x00\ +7\x01J\xff\x85\x007\x01\xfb\xff\xd7\x007\x01\xfd\xff\ +\xd7\x007\x02\x02\xff\xae\x007\x02\x03\xff\xae\x007\x02\ +\x04\xff\xae\x007\x02\x08\xff\x85\x007\x02\x0c\xff\x85\x00\ +7\x02W\xff\x9a\x007\x02X\xffq\x007\x02Y\xff\ +\x5c\x007\x02_\xff\xd7\x007\x02`\xffq\x007\x02\ +b\xff\x9a\x007\x03\x1d\xffq\x007\x03\x1e\xff\x5c\x00\ +7\x03\x1f\xffq\x007\x03 \xff\x5c\x007\x03!\xff\ +q\x007\x03\x22\xff\x5c\x007\x03#\xffq\x007\x03\ +%\xffq\x007\x03&\xff\x5c\x007\x03'\xffq\x00\ +7\x03(\xff\x5c\x007\x03)\xffq\x007\x03*\xff\ +\x5c\x007\x03+\xffq\x007\x03,\xff\x5c\x007\x03\ +-\xffq\x007\x03.\xff\x5c\x007\x03/\xffq\x00\ +7\x030\xff\x5c\x007\x031\xffq\x007\x032\xff\ +\x5c\x007\x033\xffq\x007\x034\xff\x5c\x007\x03\ +6\xffq\x007\x038\xffq\x007\x03:\xffq\x00\ +7\x03<\xffq\x007\x03@\xffq\x007\x03B\xff\ +q\x007\x03D\xffq\x007\x03I\xff\xd7\x007\x03\ +J\xffq\x007\x03K\xff\xd7\x007\x03L\xffq\x00\ +7\x03M\xff\xd7\x007\x03N\xffq\x007\x03O\xff\ +\xd7\x007\x03Q\xff\xd7\x007\x03R\xffq\x007\x03\ +S\xff\xd7\x007\x03T\xffq\x007\x03U\xff\xd7\x00\ +7\x03V\xffq\x007\x03W\xff\xd7\x007\x03X\xff\ +q\x007\x03Y\xff\xd7\x007\x03Z\xffq\x007\x03\ +[\xff\xd7\x007\x03\x5c\xffq\x007\x03]\xff\xd7\x00\ +7\x03^\xffq\x007\x03_\xff\xd7\x007\x03`\xff\ +q\x007\x03b\xff\x9a\x007\x03d\xff\x9a\x007\x03\ +f\xff\x9a\x007\x03h\xff\x9a\x007\x03j\xff\x9a\x00\ +7\x03l\xff\x9a\x007\x03n\xff\x9a\x007\x03p\xff\ +\xd7\x007\x03\x8f\x00)\x008\x00\x0f\xff\xd7\x008\x00\ +\x11\xff\xd7\x008\x00$\xff\xec\x008\x00\x82\xff\xec\x00\ +8\x00\x83\xff\xec\x008\x00\x84\xff\xec\x008\x00\x85\xff\ +\xec\x008\x00\x86\xff\xec\x008\x00\x87\xff\xec\x008\x00\ +\xc2\xff\xec\x008\x00\xc4\xff\xec\x008\x00\xc6\xff\xec\x00\ +8\x01C\xff\xec\x008\x02\x08\xff\xd7\x008\x02\x0c\xff\ +\xd7\x008\x02X\xff\xec\x008\x03\x1d\xff\xec\x008\x03\ +\x1f\xff\xec\x008\x03!\xff\xec\x008\x03#\xff\xec\x00\ +8\x03%\xff\xec\x008\x03'\xff\xec\x008\x03)\xff\ +\xec\x008\x03+\xff\xec\x008\x03-\xff\xec\x008\x03\ +/\xff\xec\x008\x031\xff\xec\x008\x033\xff\xec\x00\ +9\x00\x0f\xff\x9a\x009\x00\x11\xff\x9a\x009\x00\x22\x00\ +)\x009\x00$\xff\xae\x009\x00&\xff\xec\x009\x00\ +*\xff\xec\x009\x002\xff\xec\x009\x004\xff\xec\x00\ +9\x00D\xff\xd7\x009\x00F\xff\xd7\x009\x00G\xff\ +\xd7\x009\x00H\xff\xd7\x009\x00J\xff\xec\x009\x00\ +P\xff\xec\x009\x00Q\xff\xec\x009\x00R\xff\xd7\x00\ +9\x00S\xff\xec\x009\x00T\xff\xd7\x009\x00U\xff\ +\xec\x009\x00V\xff\xec\x009\x00X\xff\xec\x009\x00\ +\x82\xff\xae\x009\x00\x83\xff\xae\x009\x00\x84\xff\xae\x00\ +9\x00\x85\xff\xae\x009\x00\x86\xff\xae\x009\x00\x87\xff\ +\xae\x009\x00\x89\xff\xec\x009\x00\x94\xff\xec\x009\x00\ +\x95\xff\xec\x009\x00\x96\xff\xec\x009\x00\x97\xff\xec\x00\ +9\x00\x98\xff\xec\x009\x00\x9a\xff\xec\x009\x00\xa2\xff\ +\xd7\x009\x00\xa3\xff\xd7\x009\x00\xa4\xff\xd7\x009\x00\ +\xa5\xff\xd7\x009\x00\xa6\xff\xd7\x009\x00\xa7\xff\xd7\x00\ +9\x00\xa8\xff\xd7\x009\x00\xa9\xff\xd7\x009\x00\xaa\xff\ +\xd7\x009\x00\xab\xff\xd7\x009\x00\xac\xff\xd7\x009\x00\ +\xad\xff\xd7\x009\x00\xb4\xff\xd7\x009\x00\xb5\xff\xd7\x00\ +9\x00\xb6\xff\xd7\x009\x00\xb7\xff\xd7\x009\x00\xb8\xff\ +\xd7\x009\x00\xba\xff\xd7\x009\x00\xbb\xff\xec\x009\x00\ +\xbc\xff\xec\x009\x00\xbd\xff\xec\x009\x00\xbe\xff\xec\x00\ +9\x00\xc2\xff\xae\x009\x00\xc3\xff\xd7\x009\x00\xc4\xff\ +\xae\x009\x00\xc5\xff\xd7\x009\x00\xc6\xff\xae\x009\x00\ +\xc7\xff\xd7\x009\x00\xc8\xff\xec\x009\x00\xc9\xff\xd7\x00\ +9\x00\xca\xff\xec\x009\x00\xcb\xff\xd7\x009\x00\xcc\xff\ +\xec\x009\x00\xcd\xff\xd7\x009\x00\xce\xff\xec\x009\x00\ +\xcf\xff\xd7\x009\x00\xd1\xff\xd7\x009\x00\xd3\xff\xd7\x00\ +9\x00\xd5\xff\xd7\x009\x00\xd7\xff\xd7\x009\x00\xd9\xff\ +\xd7\x009\x00\xdb\xff\xd7\x009\x00\xdd\xff\xd7\x009\x00\ +\xde\xff\xec\x009\x00\xdf\xff\xec\x009\x00\xe0\xff\xec\x00\ +9\x00\xe1\xff\xec\x009\x00\xe2\xff\xec\x009\x00\xe3\xff\ +\xec\x009\x00\xe4\xff\xec\x009\x00\xe5\xff\xec\x009\x00\ +\xfa\xff\xec\x009\x01\x06\xff\xec\x009\x01\x08\xff\xec\x00\ +9\x01\x0d\xff\xec\x009\x01\x0e\xff\xec\x009\x01\x0f\xff\ +\xd7\x009\x01\x10\xff\xec\x009\x01\x11\xff\xd7\x009\x01\ +\x12\xff\xec\x009\x01\x13\xff\xd7\x009\x01\x14\xff\xec\x00\ +9\x01\x15\xff\xd7\x009\x01\x17\xff\xec\x009\x01\x19\xff\ +\xec\x009\x01\x1d\xff\xec\x009\x01!\xff\xec\x009\x01\ ++\xff\xec\x009\x01-\xff\xec\x009\x01/\xff\xec\x00\ +9\x011\xff\xec\x009\x013\xff\xec\x009\x015\xff\ +\xec\x009\x01C\xff\xae\x009\x01D\xff\xd7\x009\x01\ +F\xff\xd7\x009\x01G\xff\xec\x009\x01H\xff\xd7\x00\ +9\x01J\xff\xec\x009\x02\x08\xff\x9a\x009\x02\x0c\xff\ +\x9a\x009\x02W\xff\xec\x009\x02X\xff\xae\x009\x02\ +Y\xff\xd7\x009\x02_\xff\xec\x009\x02`\xff\xd7\x00\ +9\x02b\xff\xec\x009\x03\x1d\xff\xae\x009\x03\x1e\xff\ +\xd7\x009\x03\x1f\xff\xae\x009\x03 \xff\xd7\x009\x03\ +!\xff\xae\x009\x03\x22\xff\xd7\x009\x03#\xff\xae\x00\ +9\x03%\xff\xae\x009\x03&\xff\xd7\x009\x03'\xff\ +\xae\x009\x03(\xff\xd7\x009\x03)\xff\xae\x009\x03\ +*\xff\xd7\x009\x03+\xff\xae\x009\x03,\xff\xd7\x00\ +9\x03-\xff\xae\x009\x03.\xff\xd7\x009\x03/\xff\ +\xae\x009\x030\xff\xd7\x009\x031\xff\xae\x009\x03\ +2\xff\xd7\x009\x033\xff\xae\x009\x034\xff\xd7\x00\ +9\x036\xff\xd7\x009\x038\xff\xd7\x009\x03:\xff\ +\xd7\x009\x03<\xff\xd7\x009\x03@\xff\xd7\x009\x03\ +B\xff\xd7\x009\x03D\xff\xd7\x009\x03I\xff\xec\x00\ +9\x03J\xff\xd7\x009\x03K\xff\xec\x009\x03L\xff\ +\xd7\x009\x03M\xff\xec\x009\x03N\xff\xd7\x009\x03\ +O\xff\xec\x009\x03Q\xff\xec\x009\x03R\xff\xd7\x00\ +9\x03S\xff\xec\x009\x03T\xff\xd7\x009\x03U\xff\ +\xec\x009\x03V\xff\xd7\x009\x03W\xff\xec\x009\x03\ +X\xff\xd7\x009\x03Y\xff\xec\x009\x03Z\xff\xd7\x00\ +9\x03[\xff\xec\x009\x03\x5c\xff\xd7\x009\x03]\xff\ +\xec\x009\x03^\xff\xd7\x009\x03_\xff\xec\x009\x03\ +`\xff\xd7\x009\x03b\xff\xec\x009\x03d\xff\xec\x00\ +9\x03f\xff\xec\x009\x03h\xff\xec\x009\x03j\xff\ +\xec\x009\x03l\xff\xec\x009\x03n\xff\xec\x00:\x00\ +\x0f\xff\x9a\x00:\x00\x11\xff\x9a\x00:\x00\x22\x00)\x00\ +:\x00$\xff\xae\x00:\x00&\xff\xec\x00:\x00*\xff\ +\xec\x00:\x002\xff\xec\x00:\x004\xff\xec\x00:\x00\ +D\xff\xd7\x00:\x00F\xff\xd7\x00:\x00G\xff\xd7\x00\ +:\x00H\xff\xd7\x00:\x00J\xff\xec\x00:\x00P\xff\ +\xec\x00:\x00Q\xff\xec\x00:\x00R\xff\xd7\x00:\x00\ +S\xff\xec\x00:\x00T\xff\xd7\x00:\x00U\xff\xec\x00\ +:\x00V\xff\xec\x00:\x00X\xff\xec\x00:\x00\x82\xff\ +\xae\x00:\x00\x83\xff\xae\x00:\x00\x84\xff\xae\x00:\x00\ +\x85\xff\xae\x00:\x00\x86\xff\xae\x00:\x00\x87\xff\xae\x00\ +:\x00\x89\xff\xec\x00:\x00\x94\xff\xec\x00:\x00\x95\xff\ +\xec\x00:\x00\x96\xff\xec\x00:\x00\x97\xff\xec\x00:\x00\ +\x98\xff\xec\x00:\x00\x9a\xff\xec\x00:\x00\xa2\xff\xd7\x00\ +:\x00\xa3\xff\xd7\x00:\x00\xa4\xff\xd7\x00:\x00\xa5\xff\ +\xd7\x00:\x00\xa6\xff\xd7\x00:\x00\xa7\xff\xd7\x00:\x00\ +\xa8\xff\xd7\x00:\x00\xa9\xff\xd7\x00:\x00\xaa\xff\xd7\x00\ +:\x00\xab\xff\xd7\x00:\x00\xac\xff\xd7\x00:\x00\xad\xff\ +\xd7\x00:\x00\xb4\xff\xd7\x00:\x00\xb5\xff\xd7\x00:\x00\ +\xb6\xff\xd7\x00:\x00\xb7\xff\xd7\x00:\x00\xb8\xff\xd7\x00\ +:\x00\xba\xff\xd7\x00:\x00\xbb\xff\xec\x00:\x00\xbc\xff\ +\xec\x00:\x00\xbd\xff\xec\x00:\x00\xbe\xff\xec\x00:\x00\ +\xc2\xff\xae\x00:\x00\xc3\xff\xd7\x00:\x00\xc4\xff\xae\x00\ +:\x00\xc5\xff\xd7\x00:\x00\xc6\xff\xae\x00:\x00\xc7\xff\ +\xd7\x00:\x00\xc8\xff\xec\x00:\x00\xc9\xff\xd7\x00:\x00\ +\xca\xff\xec\x00:\x00\xcb\xff\xd7\x00:\x00\xcc\xff\xec\x00\ +:\x00\xcd\xff\xd7\x00:\x00\xce\xff\xec\x00:\x00\xcf\xff\ +\xd7\x00:\x00\xd1\xff\xd7\x00:\x00\xd3\xff\xd7\x00:\x00\ +\xd5\xff\xd7\x00:\x00\xd7\xff\xd7\x00:\x00\xd9\xff\xd7\x00\ +:\x00\xdb\xff\xd7\x00:\x00\xdd\xff\xd7\x00:\x00\xde\xff\ +\xec\x00:\x00\xdf\xff\xec\x00:\x00\xe0\xff\xec\x00:\x00\ +\xe1\xff\xec\x00:\x00\xe2\xff\xec\x00:\x00\xe3\xff\xec\x00\ +:\x00\xe4\xff\xec\x00:\x00\xe5\xff\xec\x00:\x00\xfa\xff\ +\xec\x00:\x01\x06\xff\xec\x00:\x01\x08\xff\xec\x00:\x01\ +\x0d\xff\xec\x00:\x01\x0e\xff\xec\x00:\x01\x0f\xff\xd7\x00\ +:\x01\x10\xff\xec\x00:\x01\x11\xff\xd7\x00:\x01\x12\xff\ +\xec\x00:\x01\x13\xff\xd7\x00:\x01\x14\xff\xec\x00:\x01\ +\x15\xff\xd7\x00:\x01\x17\xff\xec\x00:\x01\x19\xff\xec\x00\ +:\x01\x1d\xff\xec\x00:\x01!\xff\xec\x00:\x01+\xff\ +\xec\x00:\x01-\xff\xec\x00:\x01/\xff\xec\x00:\x01\ +1\xff\xec\x00:\x013\xff\xec\x00:\x015\xff\xec\x00\ +:\x01C\xff\xae\x00:\x01D\xff\xd7\x00:\x01F\xff\ +\xd7\x00:\x01G\xff\xec\x00:\x01H\xff\xd7\x00:\x01\ +J\xff\xec\x00:\x02\x08\xff\x9a\x00:\x02\x0c\xff\x9a\x00\ +:\x02W\xff\xec\x00:\x02X\xff\xae\x00:\x02Y\xff\ +\xd7\x00:\x02_\xff\xec\x00:\x02`\xff\xd7\x00:\x02\ +b\xff\xec\x00:\x03\x1d\xff\xae\x00:\x03\x1e\xff\xd7\x00\ +:\x03\x1f\xff\xae\x00:\x03 \xff\xd7\x00:\x03!\xff\ +\xae\x00:\x03\x22\xff\xd7\x00:\x03#\xff\xae\x00:\x03\ +%\xff\xae\x00:\x03&\xff\xd7\x00:\x03'\xff\xae\x00\ +:\x03(\xff\xd7\x00:\x03)\xff\xae\x00:\x03*\xff\ +\xd7\x00:\x03+\xff\xae\x00:\x03,\xff\xd7\x00:\x03\ +-\xff\xae\x00:\x03.\xff\xd7\x00:\x03/\xff\xae\x00\ +:\x030\xff\xd7\x00:\x031\xff\xae\x00:\x032\xff\ +\xd7\x00:\x033\xff\xae\x00:\x034\xff\xd7\x00:\x03\ +6\xff\xd7\x00:\x038\xff\xd7\x00:\x03:\xff\xd7\x00\ +:\x03<\xff\xd7\x00:\x03@\xff\xd7\x00:\x03B\xff\ +\xd7\x00:\x03D\xff\xd7\x00:\x03I\xff\xec\x00:\x03\ +J\xff\xd7\x00:\x03K\xff\xec\x00:\x03L\xff\xd7\x00\ +:\x03M\xff\xec\x00:\x03N\xff\xd7\x00:\x03O\xff\ +\xec\x00:\x03Q\xff\xec\x00:\x03R\xff\xd7\x00:\x03\ +S\xff\xec\x00:\x03T\xff\xd7\x00:\x03U\xff\xec\x00\ +:\x03V\xff\xd7\x00:\x03W\xff\xec\x00:\x03X\xff\ +\xd7\x00:\x03Y\xff\xec\x00:\x03Z\xff\xd7\x00:\x03\ +[\xff\xec\x00:\x03\x5c\xff\xd7\x00:\x03]\xff\xec\x00\ +:\x03^\xff\xd7\x00:\x03_\xff\xec\x00:\x03`\xff\ +\xd7\x00:\x03b\xff\xec\x00:\x03d\xff\xec\x00:\x03\ +f\xff\xec\x00:\x03h\xff\xec\x00:\x03j\xff\xec\x00\ +:\x03l\xff\xec\x00:\x03n\xff\xec\x00;\x00&\xff\ +\xd7\x00;\x00*\xff\xd7\x00;\x002\xff\xd7\x00;\x00\ +4\xff\xd7\x00;\x00\x89\xff\xd7\x00;\x00\x94\xff\xd7\x00\ +;\x00\x95\xff\xd7\x00;\x00\x96\xff\xd7\x00;\x00\x97\xff\ +\xd7\x00;\x00\x98\xff\xd7\x00;\x00\x9a\xff\xd7\x00;\x00\ +\xc8\xff\xd7\x00;\x00\xca\xff\xd7\x00;\x00\xcc\xff\xd7\x00\ +;\x00\xce\xff\xd7\x00;\x00\xde\xff\xd7\x00;\x00\xe0\xff\ +\xd7\x00;\x00\xe2\xff\xd7\x00;\x00\xe4\xff\xd7\x00;\x01\ +\x0e\xff\xd7\x00;\x01\x10\xff\xd7\x00;\x01\x12\xff\xd7\x00\ +;\x01\x14\xff\xd7\x00;\x01G\xff\xd7\x00;\x02_\xff\ +\xd7\x00;\x03I\xff\xd7\x00;\x03K\xff\xd7\x00;\x03\ +M\xff\xd7\x00;\x03O\xff\xd7\x00;\x03Q\xff\xd7\x00\ +;\x03S\xff\xd7\x00;\x03U\xff\xd7\x00;\x03W\xff\ +\xd7\x00;\x03Y\xff\xd7\x00;\x03[\xff\xd7\x00;\x03\ +]\xff\xd7\x00;\x03_\xff\xd7\x00<\x00\x0f\xff\x85\x00\ +<\x00\x11\xff\x85\x00<\x00\x22\x00)\x00<\x00$\xff\ +\x85\x00<\x00&\xff\xd7\x00<\x00*\xff\xd7\x00<\x00\ +2\xff\xd7\x00<\x004\xff\xd7\x00<\x00D\xff\x9a\x00\ +<\x00F\xff\x9a\x00<\x00G\xff\x9a\x00<\x00H\xff\ +\x9a\x00<\x00J\xff\xd7\x00<\x00P\xff\xc3\x00<\x00\ +Q\xff\xc3\x00<\x00R\xff\x9a\x00<\x00S\xff\xc3\x00\ +<\x00T\xff\x9a\x00<\x00U\xff\xc3\x00<\x00V\xff\ +\xae\x00<\x00X\xff\xc3\x00<\x00]\xff\xd7\x00<\x00\ +\x82\xff\x85\x00<\x00\x83\xff\x85\x00<\x00\x84\xff\x85\x00\ +<\x00\x85\xff\x85\x00<\x00\x86\xff\x85\x00<\x00\x87\xff\ +\x85\x00<\x00\x89\xff\xd7\x00<\x00\x94\xff\xd7\x00<\x00\ +\x95\xff\xd7\x00<\x00\x96\xff\xd7\x00<\x00\x97\xff\xd7\x00\ +<\x00\x98\xff\xd7\x00<\x00\x9a\xff\xd7\x00<\x00\xa2\xff\ +\x9a\x00<\x00\xa3\xff\x9a\x00<\x00\xa4\xff\x9a\x00<\x00\ +\xa5\xff\x9a\x00<\x00\xa6\xff\x9a\x00<\x00\xa7\xff\x9a\x00\ +<\x00\xa8\xff\x9a\x00<\x00\xa9\xff\x9a\x00<\x00\xaa\xff\ +\x9a\x00<\x00\xab\xff\x9a\x00<\x00\xac\xff\x9a\x00<\x00\ +\xad\xff\x9a\x00<\x00\xb4\xff\x9a\x00<\x00\xb5\xff\x9a\x00\ +<\x00\xb6\xff\x9a\x00<\x00\xb7\xff\x9a\x00<\x00\xb8\xff\ +\x9a\x00<\x00\xba\xff\x9a\x00<\x00\xbb\xff\xc3\x00<\x00\ +\xbc\xff\xc3\x00<\x00\xbd\xff\xc3\x00<\x00\xbe\xff\xc3\x00\ +<\x00\xc2\xff\x85\x00<\x00\xc3\xff\x9a\x00<\x00\xc4\xff\ +\x85\x00<\x00\xc5\xff\x9a\x00<\x00\xc6\xff\x85\x00<\x00\ +\xc7\xff\x9a\x00<\x00\xc8\xff\xd7\x00<\x00\xc9\xff\x9a\x00\ +<\x00\xca\xff\xd7\x00<\x00\xcb\xff\x9a\x00<\x00\xcc\xff\ +\xd7\x00<\x00\xcd\xff\x9a\x00<\x00\xce\xff\xd7\x00<\x00\ +\xcf\xff\x9a\x00<\x00\xd1\xff\x9a\x00<\x00\xd3\xff\x9a\x00\ +<\x00\xd5\xff\x9a\x00<\x00\xd7\xff\x9a\x00<\x00\xd9\xff\ +\x9a\x00<\x00\xdb\xff\x9a\x00<\x00\xdd\xff\x9a\x00<\x00\ +\xde\xff\xd7\x00<\x00\xdf\xff\xd7\x00<\x00\xe0\xff\xd7\x00\ +<\x00\xe1\xff\xd7\x00<\x00\xe2\xff\xd7\x00<\x00\xe3\xff\ +\xd7\x00<\x00\xe4\xff\xd7\x00<\x00\xe5\xff\xd7\x00<\x00\ +\xfa\xff\xc3\x00<\x01\x06\xff\xc3\x00<\x01\x08\xff\xc3\x00\ +<\x01\x0d\xff\xc3\x00<\x01\x0e\xff\xd7\x00<\x01\x0f\xff\ +\x9a\x00<\x01\x10\xff\xd7\x00<\x01\x11\xff\x9a\x00<\x01\ +\x12\xff\xd7\x00<\x01\x13\xff\x9a\x00<\x01\x14\xff\xd7\x00\ +<\x01\x15\xff\x9a\x00<\x01\x17\xff\xc3\x00<\x01\x19\xff\ +\xc3\x00<\x01\x1d\xff\xae\x00<\x01!\xff\xae\x00<\x01\ ++\xff\xc3\x00<\x01-\xff\xc3\x00<\x01/\xff\xc3\x00\ +<\x011\xff\xc3\x00<\x013\xff\xc3\x00<\x015\xff\ +\xc3\x00<\x01<\xff\xd7\x00<\x01>\xff\xd7\x00<\x01\ +@\xff\xd7\x00<\x01C\xff\x85\x00<\x01D\xff\x9a\x00\ +<\x01F\xff\x9a\x00<\x01G\xff\xd7\x00<\x01H\xff\ +\x9a\x00<\x01J\xff\xae\x00<\x02\x08\xff\x85\x00<\x02\ +\x0c\xff\x85\x00<\x02W\xff\xc3\x00<\x02X\xff\x85\x00\ +<\x02Y\xff\x9a\x00<\x02_\xff\xd7\x00<\x02`\xff\ +\x9a\x00<\x02b\xff\xc3\x00<\x03\x1d\xff\x85\x00<\x03\ +\x1e\xff\x9a\x00<\x03\x1f\xff\x85\x00<\x03 \xff\x9a\x00\ +<\x03!\xff\x85\x00<\x03\x22\xff\x9a\x00<\x03#\xff\ +\x85\x00<\x03%\xff\x85\x00<\x03&\xff\x9a\x00<\x03\ +'\xff\x85\x00<\x03(\xff\x9a\x00<\x03)\xff\x85\x00\ +<\x03*\xff\x9a\x00<\x03+\xff\x85\x00<\x03,\xff\ +\x9a\x00<\x03-\xff\x85\x00<\x03.\xff\x9a\x00<\x03\ +/\xff\x85\x00<\x030\xff\x9a\x00<\x031\xff\x85\x00\ +<\x032\xff\x9a\x00<\x033\xff\x85\x00<\x034\xff\ +\x9a\x00<\x036\xff\x9a\x00<\x038\xff\x9a\x00<\x03\ +:\xff\x9a\x00<\x03<\xff\x9a\x00<\x03@\xff\x9a\x00\ +<\x03B\xff\x9a\x00<\x03D\xff\x9a\x00<\x03I\xff\ +\xd7\x00<\x03J\xff\x9a\x00<\x03K\xff\xd7\x00<\x03\ +L\xff\x9a\x00<\x03M\xff\xd7\x00<\x03N\xff\x9a\x00\ +<\x03O\xff\xd7\x00<\x03Q\xff\xd7\x00<\x03R\xff\ +\x9a\x00<\x03S\xff\xd7\x00<\x03T\xff\x9a\x00<\x03\ +U\xff\xd7\x00<\x03V\xff\x9a\x00<\x03W\xff\xd7\x00\ +<\x03X\xff\x9a\x00<\x03Y\xff\xd7\x00<\x03Z\xff\ +\x9a\x00<\x03[\xff\xd7\x00<\x03\x5c\xff\x9a\x00<\x03\ +]\xff\xd7\x00<\x03^\xff\x9a\x00<\x03_\xff\xd7\x00\ +<\x03`\xff\x9a\x00<\x03b\xff\xc3\x00<\x03d\xff\ +\xc3\x00<\x03f\xff\xc3\x00<\x03h\xff\xc3\x00<\x03\ +j\xff\xc3\x00<\x03l\xff\xc3\x00<\x03n\xff\xc3\x00\ +=\x00&\xff\xec\x00=\x00*\xff\xec\x00=\x002\xff\ +\xec\x00=\x004\xff\xec\x00=\x00\x89\xff\xec\x00=\x00\ +\x94\xff\xec\x00=\x00\x95\xff\xec\x00=\x00\x96\xff\xec\x00\ +=\x00\x97\xff\xec\x00=\x00\x98\xff\xec\x00=\x00\x9a\xff\ +\xec\x00=\x00\xc8\xff\xec\x00=\x00\xca\xff\xec\x00=\x00\ +\xcc\xff\xec\x00=\x00\xce\xff\xec\x00=\x00\xde\xff\xec\x00\ +=\x00\xe0\xff\xec\x00=\x00\xe2\xff\xec\x00=\x00\xe4\xff\ +\xec\x00=\x01\x0e\xff\xec\x00=\x01\x10\xff\xec\x00=\x01\ +\x12\xff\xec\x00=\x01\x14\xff\xec\x00=\x01G\xff\xec\x00\ +=\x02_\xff\xec\x00=\x03I\xff\xec\x00=\x03K\xff\ +\xec\x00=\x03M\xff\xec\x00=\x03O\xff\xec\x00=\x03\ +Q\xff\xec\x00=\x03S\xff\xec\x00=\x03U\xff\xec\x00\ +=\x03W\xff\xec\x00=\x03Y\xff\xec\x00=\x03[\xff\ +\xec\x00=\x03]\xff\xec\x00=\x03_\xff\xec\x00>\x00\ +-\x00\xb8\x00D\x00\x05\xff\xec\x00D\x00\x0a\xff\xec\x00\ +D\x02\x07\xff\xec\x00D\x02\x0b\xff\xec\x00E\x00\x05\xff\ +\xec\x00E\x00\x0a\xff\xec\x00E\x00Y\xff\xd7\x00E\x00\ +Z\xff\xd7\x00E\x00[\xff\xd7\x00E\x00\x5c\xff\xd7\x00\ +E\x00]\xff\xec\x00E\x00\xbf\xff\xd7\x00E\x017\xff\ +\xd7\x00E\x01<\xff\xec\x00E\x01>\xff\xec\x00E\x01\ +@\xff\xec\x00E\x01\xfb\xff\xd7\x00E\x01\xfd\xff\xd7\x00\ +E\x02\x07\xff\xec\x00E\x02\x0b\xff\xec\x00E\x03p\xff\ +\xd7\x00F\x00\x05\x00)\x00F\x00\x0a\x00)\x00F\x02\ +\x07\x00)\x00F\x02\x0b\x00)\x00H\x00\x05\xff\xec\x00\ +H\x00\x0a\xff\xec\x00H\x00Y\xff\xd7\x00H\x00Z\xff\ +\xd7\x00H\x00[\xff\xd7\x00H\x00\x5c\xff\xd7\x00H\x00\ +]\xff\xec\x00H\x00\xbf\xff\xd7\x00H\x017\xff\xd7\x00\ +H\x01<\xff\xec\x00H\x01>\xff\xec\x00H\x01@\xff\ +\xec\x00H\x01\xfb\xff\xd7\x00H\x01\xfd\xff\xd7\x00H\x02\ +\x07\xff\xec\x00H\x02\x0b\xff\xec\x00H\x03p\xff\xd7\x00\ +I\x00\x05\x00{\x00I\x00\x0a\x00{\x00I\x02\x07\x00\ +{\x00I\x02\x0b\x00{\x00K\x00\x05\xff\xec\x00K\x00\ +\x0a\xff\xec\x00K\x02\x07\xff\xec\x00K\x02\x0b\xff\xec\x00\ +N\x00F\xff\xd7\x00N\x00G\xff\xd7\x00N\x00H\xff\ +\xd7\x00N\x00R\xff\xd7\x00N\x00T\xff\xd7\x00N\x00\ +\xa2\xff\xd7\x00N\x00\xa9\xff\xd7\x00N\x00\xaa\xff\xd7\x00\ +N\x00\xab\xff\xd7\x00N\x00\xac\xff\xd7\x00N\x00\xad\xff\ +\xd7\x00N\x00\xb4\xff\xd7\x00N\x00\xb5\xff\xd7\x00N\x00\ +\xb6\xff\xd7\x00N\x00\xb7\xff\xd7\x00N\x00\xb8\xff\xd7\x00\ +N\x00\xba\xff\xd7\x00N\x00\xc9\xff\xd7\x00N\x00\xcb\xff\ +\xd7\x00N\x00\xcd\xff\xd7\x00N\x00\xcf\xff\xd7\x00N\x00\ +\xd1\xff\xd7\x00N\x00\xd3\xff\xd7\x00N\x00\xd5\xff\xd7\x00\ +N\x00\xd7\xff\xd7\x00N\x00\xd9\xff\xd7\x00N\x00\xdb\xff\ +\xd7\x00N\x00\xdd\xff\xd7\x00N\x01\x0f\xff\xd7\x00N\x01\ +\x11\xff\xd7\x00N\x01\x13\xff\xd7\x00N\x01\x15\xff\xd7\x00\ +N\x01H\xff\xd7\x00N\x02`\xff\xd7\x00N\x036\xff\ +\xd7\x00N\x038\xff\xd7\x00N\x03:\xff\xd7\x00N\x03\ +<\xff\xd7\x00N\x03@\xff\xd7\x00N\x03B\xff\xd7\x00\ +N\x03D\xff\xd7\x00N\x03J\xff\xd7\x00N\x03L\xff\ +\xd7\x00N\x03N\xff\xd7\x00N\x03R\xff\xd7\x00N\x03\ +T\xff\xd7\x00N\x03V\xff\xd7\x00N\x03X\xff\xd7\x00\ +N\x03Z\xff\xd7\x00N\x03\x5c\xff\xd7\x00N\x03^\xff\ +\xd7\x00N\x03`\xff\xd7\x00P\x00\x05\xff\xec\x00P\x00\ +\x0a\xff\xec\x00P\x02\x07\xff\xec\x00P\x02\x0b\xff\xec\x00\ +Q\x00\x05\xff\xec\x00Q\x00\x0a\xff\xec\x00Q\x02\x07\xff\ +\xec\x00Q\x02\x0b\xff\xec\x00R\x00\x05\xff\xec\x00R\x00\ +\x0a\xff\xec\x00R\x00Y\xff\xd7\x00R\x00Z\xff\xd7\x00\ +R\x00[\xff\xd7\x00R\x00\x5c\xff\xd7\x00R\x00]\xff\ +\xec\x00R\x00\xbf\xff\xd7\x00R\x017\xff\xd7\x00R\x01\ +<\xff\xec\x00R\x01>\xff\xec\x00R\x01@\xff\xec\x00\ +R\x01\xfb\xff\xd7\x00R\x01\xfd\xff\xd7\x00R\x02\x07\xff\ +\xec\x00R\x02\x0b\xff\xec\x00R\x03p\xff\xd7\x00S\x00\ +\x05\xff\xec\x00S\x00\x0a\xff\xec\x00S\x00Y\xff\xd7\x00\ +S\x00Z\xff\xd7\x00S\x00[\xff\xd7\x00S\x00\x5c\xff\ +\xd7\x00S\x00]\xff\xec\x00S\x00\xbf\xff\xd7\x00S\x01\ +7\xff\xd7\x00S\x01<\xff\xec\x00S\x01>\xff\xec\x00\ +S\x01@\xff\xec\x00S\x01\xfb\xff\xd7\x00S\x01\xfd\xff\ +\xd7\x00S\x02\x07\xff\xec\x00S\x02\x0b\xff\xec\x00S\x03\ +p\xff\xd7\x00U\x00\x05\x00R\x00U\x00\x0a\x00R\x00\ +U\x00D\xff\xd7\x00U\x00F\xff\xd7\x00U\x00G\xff\ +\xd7\x00U\x00H\xff\xd7\x00U\x00J\xff\xec\x00U\x00\ +R\xff\xd7\x00U\x00T\xff\xd7\x00U\x00\xa2\xff\xd7\x00\ +U\x00\xa3\xff\xd7\x00U\x00\xa4\xff\xd7\x00U\x00\xa5\xff\ +\xd7\x00U\x00\xa6\xff\xd7\x00U\x00\xa7\xff\xd7\x00U\x00\ +\xa8\xff\xd7\x00U\x00\xa9\xff\xd7\x00U\x00\xaa\xff\xd7\x00\ +U\x00\xab\xff\xd7\x00U\x00\xac\xff\xd7\x00U\x00\xad\xff\ +\xd7\x00U\x00\xb4\xff\xd7\x00U\x00\xb5\xff\xd7\x00U\x00\ +\xb6\xff\xd7\x00U\x00\xb7\xff\xd7\x00U\x00\xb8\xff\xd7\x00\ +U\x00\xba\xff\xd7\x00U\x00\xc3\xff\xd7\x00U\x00\xc5\xff\ +\xd7\x00U\x00\xc7\xff\xd7\x00U\x00\xc9\xff\xd7\x00U\x00\ +\xcb\xff\xd7\x00U\x00\xcd\xff\xd7\x00U\x00\xcf\xff\xd7\x00\ +U\x00\xd1\xff\xd7\x00U\x00\xd3\xff\xd7\x00U\x00\xd5\xff\ +\xd7\x00U\x00\xd7\xff\xd7\x00U\x00\xd9\xff\xd7\x00U\x00\ +\xdb\xff\xd7\x00U\x00\xdd\xff\xd7\x00U\x00\xdf\xff\xec\x00\ +U\x00\xe1\xff\xec\x00U\x00\xe3\xff\xec\x00U\x00\xe5\xff\ +\xec\x00U\x01\x0f\xff\xd7\x00U\x01\x11\xff\xd7\x00U\x01\ +\x13\xff\xd7\x00U\x01\x15\xff\xd7\x00U\x01D\xff\xd7\x00\ +U\x01F\xff\xd7\x00U\x01H\xff\xd7\x00U\x02\x07\x00\ +R\x00U\x02\x0b\x00R\x00U\x02Y\xff\xd7\x00U\x02\ +`\xff\xd7\x00U\x03\x1e\xff\xd7\x00U\x03 \xff\xd7\x00\ +U\x03\x22\xff\xd7\x00U\x03&\xff\xd7\x00U\x03(\xff\ +\xd7\x00U\x03*\xff\xd7\x00U\x03,\xff\xd7\x00U\x03\ +.\xff\xd7\x00U\x030\xff\xd7\x00U\x032\xff\xd7\x00\ +U\x034\xff\xd7\x00U\x036\xff\xd7\x00U\x038\xff\ +\xd7\x00U\x03:\xff\xd7\x00U\x03<\xff\xd7\x00U\x03\ +@\xff\xd7\x00U\x03B\xff\xd7\x00U\x03D\xff\xd7\x00\ +U\x03J\xff\xd7\x00U\x03L\xff\xd7\x00U\x03N\xff\ +\xd7\x00U\x03R\xff\xd7\x00U\x03T\xff\xd7\x00U\x03\ +V\xff\xd7\x00U\x03X\xff\xd7\x00U\x03Z\xff\xd7\x00\ +U\x03\x5c\xff\xd7\x00U\x03^\xff\xd7\x00U\x03`\xff\ +\xd7\x00W\x00\x05\x00)\x00W\x00\x0a\x00)\x00W\x02\ +\x07\x00)\x00W\x02\x0b\x00)\x00Y\x00\x05\x00R\x00\ +Y\x00\x0a\x00R\x00Y\x00\x0f\xff\xae\x00Y\x00\x11\xff\ +\xae\x00Y\x00\x22\x00)\x00Y\x02\x07\x00R\x00Y\x02\ +\x08\xff\xae\x00Y\x02\x0b\x00R\x00Y\x02\x0c\xff\xae\x00\ +Z\x00\x05\x00R\x00Z\x00\x0a\x00R\x00Z\x00\x0f\xff\ +\xae\x00Z\x00\x11\xff\xae\x00Z\x00\x22\x00)\x00Z\x02\ +\x07\x00R\x00Z\x02\x08\xff\xae\x00Z\x02\x0b\x00R\x00\ +Z\x02\x0c\xff\xae\x00[\x00F\xff\xd7\x00[\x00G\xff\ +\xd7\x00[\x00H\xff\xd7\x00[\x00R\xff\xd7\x00[\x00\ +T\xff\xd7\x00[\x00\xa2\xff\xd7\x00[\x00\xa9\xff\xd7\x00\ +[\x00\xaa\xff\xd7\x00[\x00\xab\xff\xd7\x00[\x00\xac\xff\ +\xd7\x00[\x00\xad\xff\xd7\x00[\x00\xb4\xff\xd7\x00[\x00\ +\xb5\xff\xd7\x00[\x00\xb6\xff\xd7\x00[\x00\xb7\xff\xd7\x00\ +[\x00\xb8\xff\xd7\x00[\x00\xba\xff\xd7\x00[\x00\xc9\xff\ +\xd7\x00[\x00\xcb\xff\xd7\x00[\x00\xcd\xff\xd7\x00[\x00\ +\xcf\xff\xd7\x00[\x00\xd1\xff\xd7\x00[\x00\xd3\xff\xd7\x00\ +[\x00\xd5\xff\xd7\x00[\x00\xd7\xff\xd7\x00[\x00\xd9\xff\ +\xd7\x00[\x00\xdb\xff\xd7\x00[\x00\xdd\xff\xd7\x00[\x01\ +\x0f\xff\xd7\x00[\x01\x11\xff\xd7\x00[\x01\x13\xff\xd7\x00\ +[\x01\x15\xff\xd7\x00[\x01H\xff\xd7\x00[\x02`\xff\ +\xd7\x00[\x036\xff\xd7\x00[\x038\xff\xd7\x00[\x03\ +:\xff\xd7\x00[\x03<\xff\xd7\x00[\x03@\xff\xd7\x00\ +[\x03B\xff\xd7\x00[\x03D\xff\xd7\x00[\x03J\xff\ +\xd7\x00[\x03L\xff\xd7\x00[\x03N\xff\xd7\x00[\x03\ +R\xff\xd7\x00[\x03T\xff\xd7\x00[\x03V\xff\xd7\x00\ +[\x03X\xff\xd7\x00[\x03Z\xff\xd7\x00[\x03\x5c\xff\ +\xd7\x00[\x03^\xff\xd7\x00[\x03`\xff\xd7\x00\x5c\x00\ +\x05\x00R\x00\x5c\x00\x0a\x00R\x00\x5c\x00\x0f\xff\xae\x00\ +\x5c\x00\x11\xff\xae\x00\x5c\x00\x22\x00)\x00\x5c\x02\x07\x00\ +R\x00\x5c\x02\x08\xff\xae\x00\x5c\x02\x0b\x00R\x00\x5c\x02\ +\x0c\xff\xae\x00^\x00-\x00\xb8\x00\x82\x00\x05\xffq\x00\ +\x82\x00\x0a\xffq\x00\x82\x00&\xff\xd7\x00\x82\x00*\xff\ +\xd7\x00\x82\x00-\x01\x0a\x00\x82\x002\xff\xd7\x00\x82\x00\ +4\xff\xd7\x00\x82\x007\xffq\x00\x82\x009\xff\xae\x00\ +\x82\x00:\xff\xae\x00\x82\x00<\xff\x85\x00\x82\x00\x89\xff\ +\xd7\x00\x82\x00\x94\xff\xd7\x00\x82\x00\x95\xff\xd7\x00\x82\x00\ +\x96\xff\xd7\x00\x82\x00\x97\xff\xd7\x00\x82\x00\x98\xff\xd7\x00\ +\x82\x00\x9a\xff\xd7\x00\x82\x00\x9f\xff\x85\x00\x82\x00\xc8\xff\ +\xd7\x00\x82\x00\xca\xff\xd7\x00\x82\x00\xcc\xff\xd7\x00\x82\x00\ +\xce\xff\xd7\x00\x82\x00\xde\xff\xd7\x00\x82\x00\xe0\xff\xd7\x00\ +\x82\x00\xe2\xff\xd7\x00\x82\x00\xe4\xff\xd7\x00\x82\x01\x0e\xff\ +\xd7\x00\x82\x01\x10\xff\xd7\x00\x82\x01\x12\xff\xd7\x00\x82\x01\ +\x14\xff\xd7\x00\x82\x01$\xffq\x00\x82\x01&\xffq\x00\ +\x82\x016\xff\xae\x00\x82\x018\xff\x85\x00\x82\x01:\xff\ +\x85\x00\x82\x01G\xff\xd7\x00\x82\x01\xfa\xff\xae\x00\x82\x01\ +\xfc\xff\xae\x00\x82\x01\xfe\xff\xae\x00\x82\x02\x00\xff\x85\x00\ +\x82\x02\x07\xffq\x00\x82\x02\x0b\xffq\x00\x82\x02_\xff\ +\xd7\x00\x82\x03I\xff\xd7\x00\x82\x03K\xff\xd7\x00\x82\x03\ +M\xff\xd7\x00\x82\x03O\xff\xd7\x00\x82\x03Q\xff\xd7\x00\ +\x82\x03S\xff\xd7\x00\x82\x03U\xff\xd7\x00\x82\x03W\xff\ +\xd7\x00\x82\x03Y\xff\xd7\x00\x82\x03[\xff\xd7\x00\x82\x03\ +]\xff\xd7\x00\x82\x03_\xff\xd7\x00\x82\x03o\xff\x85\x00\ +\x82\x03q\xff\x85\x00\x82\x03s\xff\x85\x00\x82\x03\x8f\xff\ +q\x00\x83\x00\x05\xffq\x00\x83\x00\x0a\xffq\x00\x83\x00\ +&\xff\xd7\x00\x83\x00*\xff\xd7\x00\x83\x00-\x01\x0a\x00\ +\x83\x002\xff\xd7\x00\x83\x004\xff\xd7\x00\x83\x007\xff\ +q\x00\x83\x009\xff\xae\x00\x83\x00:\xff\xae\x00\x83\x00\ +<\xff\x85\x00\x83\x00\x89\xff\xd7\x00\x83\x00\x94\xff\xd7\x00\ +\x83\x00\x95\xff\xd7\x00\x83\x00\x96\xff\xd7\x00\x83\x00\x97\xff\ +\xd7\x00\x83\x00\x98\xff\xd7\x00\x83\x00\x9a\xff\xd7\x00\x83\x00\ +\x9f\xff\x85\x00\x83\x00\xc8\xff\xd7\x00\x83\x00\xca\xff\xd7\x00\ +\x83\x00\xcc\xff\xd7\x00\x83\x00\xce\xff\xd7\x00\x83\x00\xde\xff\ +\xd7\x00\x83\x00\xe0\xff\xd7\x00\x83\x00\xe2\xff\xd7\x00\x83\x00\ +\xe4\xff\xd7\x00\x83\x01\x0e\xff\xd7\x00\x83\x01\x10\xff\xd7\x00\ +\x83\x01\x12\xff\xd7\x00\x83\x01\x14\xff\xd7\x00\x83\x01$\xff\ +q\x00\x83\x01&\xffq\x00\x83\x016\xff\xae\x00\x83\x01\ +8\xff\x85\x00\x83\x01:\xff\x85\x00\x83\x01G\xff\xd7\x00\ +\x83\x01\xfa\xff\xae\x00\x83\x01\xfc\xff\xae\x00\x83\x01\xfe\xff\ +\xae\x00\x83\x02\x00\xff\x85\x00\x83\x02\x07\xffq\x00\x83\x02\ +\x0b\xffq\x00\x83\x02_\xff\xd7\x00\x83\x03I\xff\xd7\x00\ +\x83\x03K\xff\xd7\x00\x83\x03M\xff\xd7\x00\x83\x03O\xff\ +\xd7\x00\x83\x03Q\xff\xd7\x00\x83\x03S\xff\xd7\x00\x83\x03\ +U\xff\xd7\x00\x83\x03W\xff\xd7\x00\x83\x03Y\xff\xd7\x00\ +\x83\x03[\xff\xd7\x00\x83\x03]\xff\xd7\x00\x83\x03_\xff\ +\xd7\x00\x83\x03o\xff\x85\x00\x83\x03q\xff\x85\x00\x83\x03\ +s\xff\x85\x00\x83\x03\x8f\xffq\x00\x84\x00\x05\xffq\x00\ +\x84\x00\x0a\xffq\x00\x84\x00&\xff\xd7\x00\x84\x00*\xff\ +\xd7\x00\x84\x00-\x01\x0a\x00\x84\x002\xff\xd7\x00\x84\x00\ +4\xff\xd7\x00\x84\x007\xffq\x00\x84\x009\xff\xae\x00\ +\x84\x00:\xff\xae\x00\x84\x00<\xff\x85\x00\x84\x00\x89\xff\ +\xd7\x00\x84\x00\x94\xff\xd7\x00\x84\x00\x95\xff\xd7\x00\x84\x00\ +\x96\xff\xd7\x00\x84\x00\x97\xff\xd7\x00\x84\x00\x98\xff\xd7\x00\ +\x84\x00\x9a\xff\xd7\x00\x84\x00\x9f\xff\x85\x00\x84\x00\xc8\xff\ +\xd7\x00\x84\x00\xca\xff\xd7\x00\x84\x00\xcc\xff\xd7\x00\x84\x00\ +\xce\xff\xd7\x00\x84\x00\xde\xff\xd7\x00\x84\x00\xe0\xff\xd7\x00\ +\x84\x00\xe2\xff\xd7\x00\x84\x00\xe4\xff\xd7\x00\x84\x01\x0e\xff\ +\xd7\x00\x84\x01\x10\xff\xd7\x00\x84\x01\x12\xff\xd7\x00\x84\x01\ +\x14\xff\xd7\x00\x84\x01$\xffq\x00\x84\x01&\xffq\x00\ +\x84\x016\xff\xae\x00\x84\x018\xff\x85\x00\x84\x01:\xff\ +\x85\x00\x84\x01G\xff\xd7\x00\x84\x01\xfa\xff\xae\x00\x84\x01\ +\xfc\xff\xae\x00\x84\x01\xfe\xff\xae\x00\x84\x02\x00\xff\x85\x00\ +\x84\x02\x07\xffq\x00\x84\x02\x0b\xffq\x00\x84\x02_\xff\ +\xd7\x00\x84\x03I\xff\xd7\x00\x84\x03K\xff\xd7\x00\x84\x03\ +M\xff\xd7\x00\x84\x03O\xff\xd7\x00\x84\x03Q\xff\xd7\x00\ +\x84\x03S\xff\xd7\x00\x84\x03U\xff\xd7\x00\x84\x03W\xff\ +\xd7\x00\x84\x03Y\xff\xd7\x00\x84\x03[\xff\xd7\x00\x84\x03\ +]\xff\xd7\x00\x84\x03_\xff\xd7\x00\x84\x03o\xff\x85\x00\ +\x84\x03q\xff\x85\x00\x84\x03s\xff\x85\x00\x84\x03\x8f\xff\ +q\x00\x85\x00\x05\xffq\x00\x85\x00\x0a\xffq\x00\x85\x00\ +&\xff\xd7\x00\x85\x00*\xff\xd7\x00\x85\x00-\x01\x0a\x00\ +\x85\x002\xff\xd7\x00\x85\x004\xff\xd7\x00\x85\x007\xff\ +q\x00\x85\x009\xff\xae\x00\x85\x00:\xff\xae\x00\x85\x00\ +<\xff\x85\x00\x85\x00\x89\xff\xd7\x00\x85\x00\x94\xff\xd7\x00\ +\x85\x00\x95\xff\xd7\x00\x85\x00\x96\xff\xd7\x00\x85\x00\x97\xff\ +\xd7\x00\x85\x00\x98\xff\xd7\x00\x85\x00\x9a\xff\xd7\x00\x85\x00\ +\x9f\xff\x85\x00\x85\x00\xc8\xff\xd7\x00\x85\x00\xca\xff\xd7\x00\ +\x85\x00\xcc\xff\xd7\x00\x85\x00\xce\xff\xd7\x00\x85\x00\xde\xff\ +\xd7\x00\x85\x00\xe0\xff\xd7\x00\x85\x00\xe2\xff\xd7\x00\x85\x00\ +\xe4\xff\xd7\x00\x85\x01\x0e\xff\xd7\x00\x85\x01\x10\xff\xd7\x00\ +\x85\x01\x12\xff\xd7\x00\x85\x01\x14\xff\xd7\x00\x85\x01$\xff\ +q\x00\x85\x01&\xffq\x00\x85\x016\xff\xae\x00\x85\x01\ +8\xff\x85\x00\x85\x01:\xff\x85\x00\x85\x01G\xff\xd7\x00\ +\x85\x01\xfa\xff\xae\x00\x85\x01\xfc\xff\xae\x00\x85\x01\xfe\xff\ +\xae\x00\x85\x02\x00\xff\x85\x00\x85\x02\x07\xffq\x00\x85\x02\ +\x0b\xffq\x00\x85\x02_\xff\xd7\x00\x85\x03I\xff\xd7\x00\ +\x85\x03K\xff\xd7\x00\x85\x03M\xff\xd7\x00\x85\x03O\xff\ +\xd7\x00\x85\x03Q\xff\xd7\x00\x85\x03S\xff\xd7\x00\x85\x03\ +U\xff\xd7\x00\x85\x03W\xff\xd7\x00\x85\x03Y\xff\xd7\x00\ +\x85\x03[\xff\xd7\x00\x85\x03]\xff\xd7\x00\x85\x03_\xff\ +\xd7\x00\x85\x03o\xff\x85\x00\x85\x03q\xff\x85\x00\x85\x03\ +s\xff\x85\x00\x85\x03\x8f\xffq\x00\x86\x00\x05\xffq\x00\ +\x86\x00\x0a\xffq\x00\x86\x00&\xff\xd7\x00\x86\x00*\xff\ +\xd7\x00\x86\x00-\x01\x0a\x00\x86\x002\xff\xd7\x00\x86\x00\ +4\xff\xd7\x00\x86\x007\xffq\x00\x86\x009\xff\xae\x00\ +\x86\x00:\xff\xae\x00\x86\x00<\xff\x85\x00\x86\x00\x89\xff\ +\xd7\x00\x86\x00\x94\xff\xd7\x00\x86\x00\x95\xff\xd7\x00\x86\x00\ +\x96\xff\xd7\x00\x86\x00\x97\xff\xd7\x00\x86\x00\x98\xff\xd7\x00\ +\x86\x00\x9a\xff\xd7\x00\x86\x00\x9f\xff\x85\x00\x86\x00\xc8\xff\ +\xd7\x00\x86\x00\xca\xff\xd7\x00\x86\x00\xcc\xff\xd7\x00\x86\x00\ +\xce\xff\xd7\x00\x86\x00\xde\xff\xd7\x00\x86\x00\xe0\xff\xd7\x00\ +\x86\x00\xe2\xff\xd7\x00\x86\x00\xe4\xff\xd7\x00\x86\x01\x0e\xff\ +\xd7\x00\x86\x01\x10\xff\xd7\x00\x86\x01\x12\xff\xd7\x00\x86\x01\ +\x14\xff\xd7\x00\x86\x01$\xffq\x00\x86\x01&\xffq\x00\ +\x86\x016\xff\xae\x00\x86\x018\xff\x85\x00\x86\x01:\xff\ +\x85\x00\x86\x01G\xff\xd7\x00\x86\x01\xfa\xff\xae\x00\x86\x01\ +\xfc\xff\xae\x00\x86\x01\xfe\xff\xae\x00\x86\x02\x00\xff\x85\x00\ +\x86\x02\x07\xffq\x00\x86\x02\x0b\xffq\x00\x86\x02_\xff\ +\xd7\x00\x86\x03I\xff\xd7\x00\x86\x03K\xff\xd7\x00\x86\x03\ +M\xff\xd7\x00\x86\x03O\xff\xd7\x00\x86\x03Q\xff\xd7\x00\ +\x86\x03S\xff\xd7\x00\x86\x03U\xff\xd7\x00\x86\x03W\xff\ +\xd7\x00\x86\x03Y\xff\xd7\x00\x86\x03[\xff\xd7\x00\x86\x03\ +]\xff\xd7\x00\x86\x03_\xff\xd7\x00\x86\x03o\xff\x85\x00\ +\x86\x03q\xff\x85\x00\x86\x03s\xff\x85\x00\x86\x03\x8f\xff\ +q\x00\x87\x00\x05\xffq\x00\x87\x00\x0a\xffq\x00\x87\x00\ +&\xff\xd7\x00\x87\x00*\xff\xd7\x00\x87\x00-\x01\x0a\x00\ +\x87\x002\xff\xd7\x00\x87\x004\xff\xd7\x00\x87\x007\xff\ +q\x00\x87\x009\xff\xae\x00\x87\x00:\xff\xae\x00\x87\x00\ +<\xff\x85\x00\x87\x00\x89\xff\xd7\x00\x87\x00\x94\xff\xd7\x00\ +\x87\x00\x95\xff\xd7\x00\x87\x00\x96\xff\xd7\x00\x87\x00\x97\xff\ +\xd7\x00\x87\x00\x98\xff\xd7\x00\x87\x00\x9a\xff\xd7\x00\x87\x00\ +\x9f\xff\x85\x00\x87\x00\xc8\xff\xd7\x00\x87\x00\xca\xff\xd7\x00\ +\x87\x00\xcc\xff\xd7\x00\x87\x00\xce\xff\xd7\x00\x87\x00\xde\xff\ +\xd7\x00\x87\x00\xe0\xff\xd7\x00\x87\x00\xe2\xff\xd7\x00\x87\x00\ +\xe4\xff\xd7\x00\x87\x01\x0e\xff\xd7\x00\x87\x01\x10\xff\xd7\x00\ +\x87\x01\x12\xff\xd7\x00\x87\x01\x14\xff\xd7\x00\x87\x01$\xff\ +q\x00\x87\x01&\xffq\x00\x87\x016\xff\xae\x00\x87\x01\ +8\xff\x85\x00\x87\x01:\xff\x85\x00\x87\x01G\xff\xd7\x00\ +\x87\x01\xfa\xff\xae\x00\x87\x01\xfc\xff\xae\x00\x87\x01\xfe\xff\ +\xae\x00\x87\x02\x00\xff\x85\x00\x87\x02\x07\xffq\x00\x87\x02\ +\x0b\xffq\x00\x87\x02_\xff\xd7\x00\x87\x03I\xff\xd7\x00\ +\x87\x03K\xff\xd7\x00\x87\x03M\xff\xd7\x00\x87\x03O\xff\ +\xd7\x00\x87\x03Q\xff\xd7\x00\x87\x03S\xff\xd7\x00\x87\x03\ +U\xff\xd7\x00\x87\x03W\xff\xd7\x00\x87\x03Y\xff\xd7\x00\ +\x87\x03[\xff\xd7\x00\x87\x03]\xff\xd7\x00\x87\x03_\xff\ +\xd7\x00\x87\x03o\xff\x85\x00\x87\x03q\xff\x85\x00\x87\x03\ +s\xff\x85\x00\x87\x03\x8f\xffq\x00\x88\x00-\x00{\x00\ +\x89\x00&\xff\xd7\x00\x89\x00*\xff\xd7\x00\x89\x002\xff\ +\xd7\x00\x89\x004\xff\xd7\x00\x89\x00\x89\xff\xd7\x00\x89\x00\ +\x94\xff\xd7\x00\x89\x00\x95\xff\xd7\x00\x89\x00\x96\xff\xd7\x00\ +\x89\x00\x97\xff\xd7\x00\x89\x00\x98\xff\xd7\x00\x89\x00\x9a\xff\ +\xd7\x00\x89\x00\xc8\xff\xd7\x00\x89\x00\xca\xff\xd7\x00\x89\x00\ +\xcc\xff\xd7\x00\x89\x00\xce\xff\xd7\x00\x89\x00\xde\xff\xd7\x00\ +\x89\x00\xe0\xff\xd7\x00\x89\x00\xe2\xff\xd7\x00\x89\x00\xe4\xff\ +\xd7\x00\x89\x01\x0e\xff\xd7\x00\x89\x01\x10\xff\xd7\x00\x89\x01\ +\x12\xff\xd7\x00\x89\x01\x14\xff\xd7\x00\x89\x01G\xff\xd7\x00\ +\x89\x02_\xff\xd7\x00\x89\x03I\xff\xd7\x00\x89\x03K\xff\ +\xd7\x00\x89\x03M\xff\xd7\x00\x89\x03O\xff\xd7\x00\x89\x03\ +Q\xff\xd7\x00\x89\x03S\xff\xd7\x00\x89\x03U\xff\xd7\x00\ +\x89\x03W\xff\xd7\x00\x89\x03Y\xff\xd7\x00\x89\x03[\xff\ +\xd7\x00\x89\x03]\xff\xd7\x00\x89\x03_\xff\xd7\x00\x8a\x00\ +-\x00{\x00\x8b\x00-\x00{\x00\x8c\x00-\x00{\x00\ +\x8d\x00-\x00{\x00\x92\x00\x0f\xff\xae\x00\x92\x00\x11\xff\ +\xae\x00\x92\x00$\xff\xd7\x00\x92\x007\xff\xc3\x00\x92\x00\ +9\xff\xec\x00\x92\x00:\xff\xec\x00\x92\x00;\xff\xd7\x00\ +\x92\x00<\xff\xec\x00\x92\x00=\xff\xec\x00\x92\x00\x82\xff\ +\xd7\x00\x92\x00\x83\xff\xd7\x00\x92\x00\x84\xff\xd7\x00\x92\x00\ +\x85\xff\xd7\x00\x92\x00\x86\xff\xd7\x00\x92\x00\x87\xff\xd7\x00\ +\x92\x00\x9f\xff\xec\x00\x92\x00\xc2\xff\xd7\x00\x92\x00\xc4\xff\ +\xd7\x00\x92\x00\xc6\xff\xd7\x00\x92\x01$\xff\xc3\x00\x92\x01\ +&\xff\xc3\x00\x92\x016\xff\xec\x00\x92\x018\xff\xec\x00\ +\x92\x01:\xff\xec\x00\x92\x01;\xff\xec\x00\x92\x01=\xff\ +\xec\x00\x92\x01?\xff\xec\x00\x92\x01C\xff\xd7\x00\x92\x01\ +\xa0\xff\xec\x00\x92\x01\xfa\xff\xec\x00\x92\x01\xfc\xff\xec\x00\ +\x92\x01\xfe\xff\xec\x00\x92\x02\x00\xff\xec\x00\x92\x02\x08\xff\ +\xae\x00\x92\x02\x0c\xff\xae\x00\x92\x02X\xff\xd7\x00\x92\x03\ +\x1d\xff\xd7\x00\x92\x03\x1f\xff\xd7\x00\x92\x03!\xff\xd7\x00\ +\x92\x03#\xff\xd7\x00\x92\x03%\xff\xd7\x00\x92\x03'\xff\ +\xd7\x00\x92\x03)\xff\xd7\x00\x92\x03+\xff\xd7\x00\x92\x03\ +-\xff\xd7\x00\x92\x03/\xff\xd7\x00\x92\x031\xff\xd7\x00\ +\x92\x033\xff\xd7\x00\x92\x03o\xff\xec\x00\x92\x03q\xff\ +\xec\x00\x92\x03s\xff\xec\x00\x92\x03\x8f\xff\xc3\x00\x94\x00\ +\x0f\xff\xae\x00\x94\x00\x11\xff\xae\x00\x94\x00$\xff\xd7\x00\ +\x94\x007\xff\xc3\x00\x94\x009\xff\xec\x00\x94\x00:\xff\ +\xec\x00\x94\x00;\xff\xd7\x00\x94\x00<\xff\xec\x00\x94\x00\ +=\xff\xec\x00\x94\x00\x82\xff\xd7\x00\x94\x00\x83\xff\xd7\x00\ +\x94\x00\x84\xff\xd7\x00\x94\x00\x85\xff\xd7\x00\x94\x00\x86\xff\ +\xd7\x00\x94\x00\x87\xff\xd7\x00\x94\x00\x9f\xff\xec\x00\x94\x00\ +\xc2\xff\xd7\x00\x94\x00\xc4\xff\xd7\x00\x94\x00\xc6\xff\xd7\x00\ +\x94\x01$\xff\xc3\x00\x94\x01&\xff\xc3\x00\x94\x016\xff\ +\xec\x00\x94\x018\xff\xec\x00\x94\x01:\xff\xec\x00\x94\x01\ +;\xff\xec\x00\x94\x01=\xff\xec\x00\x94\x01?\xff\xec\x00\ +\x94\x01C\xff\xd7\x00\x94\x01\xa0\xff\xec\x00\x94\x01\xfa\xff\ +\xec\x00\x94\x01\xfc\xff\xec\x00\x94\x01\xfe\xff\xec\x00\x94\x02\ +\x00\xff\xec\x00\x94\x02\x08\xff\xae\x00\x94\x02\x0c\xff\xae\x00\ +\x94\x02X\xff\xd7\x00\x94\x03\x1d\xff\xd7\x00\x94\x03\x1f\xff\ +\xd7\x00\x94\x03!\xff\xd7\x00\x94\x03#\xff\xd7\x00\x94\x03\ +%\xff\xd7\x00\x94\x03'\xff\xd7\x00\x94\x03)\xff\xd7\x00\ +\x94\x03+\xff\xd7\x00\x94\x03-\xff\xd7\x00\x94\x03/\xff\ +\xd7\x00\x94\x031\xff\xd7\x00\x94\x033\xff\xd7\x00\x94\x03\ +o\xff\xec\x00\x94\x03q\xff\xec\x00\x94\x03s\xff\xec\x00\ +\x94\x03\x8f\xff\xc3\x00\x95\x00\x0f\xff\xae\x00\x95\x00\x11\xff\ +\xae\x00\x95\x00$\xff\xd7\x00\x95\x007\xff\xc3\x00\x95\x00\ +9\xff\xec\x00\x95\x00:\xff\xec\x00\x95\x00;\xff\xd7\x00\ +\x95\x00<\xff\xec\x00\x95\x00=\xff\xec\x00\x95\x00\x82\xff\ +\xd7\x00\x95\x00\x83\xff\xd7\x00\x95\x00\x84\xff\xd7\x00\x95\x00\ +\x85\xff\xd7\x00\x95\x00\x86\xff\xd7\x00\x95\x00\x87\xff\xd7\x00\ +\x95\x00\x9f\xff\xec\x00\x95\x00\xc2\xff\xd7\x00\x95\x00\xc4\xff\ +\xd7\x00\x95\x00\xc6\xff\xd7\x00\x95\x01$\xff\xc3\x00\x95\x01\ +&\xff\xc3\x00\x95\x016\xff\xec\x00\x95\x018\xff\xec\x00\ +\x95\x01:\xff\xec\x00\x95\x01;\xff\xec\x00\x95\x01=\xff\ +\xec\x00\x95\x01?\xff\xec\x00\x95\x01C\xff\xd7\x00\x95\x01\ +\xa0\xff\xec\x00\x95\x01\xfa\xff\xec\x00\x95\x01\xfc\xff\xec\x00\ +\x95\x01\xfe\xff\xec\x00\x95\x02\x00\xff\xec\x00\x95\x02\x08\xff\ +\xae\x00\x95\x02\x0c\xff\xae\x00\x95\x02X\xff\xd7\x00\x95\x03\ +\x1d\xff\xd7\x00\x95\x03\x1f\xff\xd7\x00\x95\x03!\xff\xd7\x00\ +\x95\x03#\xff\xd7\x00\x95\x03%\xff\xd7\x00\x95\x03'\xff\ +\xd7\x00\x95\x03)\xff\xd7\x00\x95\x03+\xff\xd7\x00\x95\x03\ +-\xff\xd7\x00\x95\x03/\xff\xd7\x00\x95\x031\xff\xd7\x00\ +\x95\x033\xff\xd7\x00\x95\x03o\xff\xec\x00\x95\x03q\xff\ +\xec\x00\x95\x03s\xff\xec\x00\x95\x03\x8f\xff\xc3\x00\x96\x00\ +\x0f\xff\xae\x00\x96\x00\x11\xff\xae\x00\x96\x00$\xff\xd7\x00\ +\x96\x007\xff\xc3\x00\x96\x009\xff\xec\x00\x96\x00:\xff\ +\xec\x00\x96\x00;\xff\xd7\x00\x96\x00<\xff\xec\x00\x96\x00\ +=\xff\xec\x00\x96\x00\x82\xff\xd7\x00\x96\x00\x83\xff\xd7\x00\ +\x96\x00\x84\xff\xd7\x00\x96\x00\x85\xff\xd7\x00\x96\x00\x86\xff\ +\xd7\x00\x96\x00\x87\xff\xd7\x00\x96\x00\x9f\xff\xec\x00\x96\x00\ +\xc2\xff\xd7\x00\x96\x00\xc4\xff\xd7\x00\x96\x00\xc6\xff\xd7\x00\ +\x96\x01$\xff\xc3\x00\x96\x01&\xff\xc3\x00\x96\x016\xff\ +\xec\x00\x96\x018\xff\xec\x00\x96\x01:\xff\xec\x00\x96\x01\ +;\xff\xec\x00\x96\x01=\xff\xec\x00\x96\x01?\xff\xec\x00\ +\x96\x01C\xff\xd7\x00\x96\x01\xa0\xff\xec\x00\x96\x01\xfa\xff\ +\xec\x00\x96\x01\xfc\xff\xec\x00\x96\x01\xfe\xff\xec\x00\x96\x02\ +\x00\xff\xec\x00\x96\x02\x08\xff\xae\x00\x96\x02\x0c\xff\xae\x00\ +\x96\x02X\xff\xd7\x00\x96\x03\x1d\xff\xd7\x00\x96\x03\x1f\xff\ +\xd7\x00\x96\x03!\xff\xd7\x00\x96\x03#\xff\xd7\x00\x96\x03\ +%\xff\xd7\x00\x96\x03'\xff\xd7\x00\x96\x03)\xff\xd7\x00\ +\x96\x03+\xff\xd7\x00\x96\x03-\xff\xd7\x00\x96\x03/\xff\ +\xd7\x00\x96\x031\xff\xd7\x00\x96\x033\xff\xd7\x00\x96\x03\ +o\xff\xec\x00\x96\x03q\xff\xec\x00\x96\x03s\xff\xec\x00\ +\x96\x03\x8f\xff\xc3\x00\x97\x00\x0f\xff\xae\x00\x97\x00\x11\xff\ +\xae\x00\x97\x00$\xff\xd7\x00\x97\x007\xff\xc3\x00\x97\x00\ +9\xff\xec\x00\x97\x00:\xff\xec\x00\x97\x00;\xff\xd7\x00\ +\x97\x00<\xff\xec\x00\x97\x00=\xff\xec\x00\x97\x00\x82\xff\ +\xd7\x00\x97\x00\x83\xff\xd7\x00\x97\x00\x84\xff\xd7\x00\x97\x00\ +\x85\xff\xd7\x00\x97\x00\x86\xff\xd7\x00\x97\x00\x87\xff\xd7\x00\ +\x97\x00\x9f\xff\xec\x00\x97\x00\xc2\xff\xd7\x00\x97\x00\xc4\xff\ +\xd7\x00\x97\x00\xc6\xff\xd7\x00\x97\x01$\xff\xc3\x00\x97\x01\ +&\xff\xc3\x00\x97\x016\xff\xec\x00\x97\x018\xff\xec\x00\ +\x97\x01:\xff\xec\x00\x97\x01;\xff\xec\x00\x97\x01=\xff\ +\xec\x00\x97\x01?\xff\xec\x00\x97\x01C\xff\xd7\x00\x97\x01\ +\xa0\xff\xec\x00\x97\x01\xfa\xff\xec\x00\x97\x01\xfc\xff\xec\x00\ +\x97\x01\xfe\xff\xec\x00\x97\x02\x00\xff\xec\x00\x97\x02\x08\xff\ +\xae\x00\x97\x02\x0c\xff\xae\x00\x97\x02X\xff\xd7\x00\x97\x03\ +\x1d\xff\xd7\x00\x97\x03\x1f\xff\xd7\x00\x97\x03!\xff\xd7\x00\ +\x97\x03#\xff\xd7\x00\x97\x03%\xff\xd7\x00\x97\x03'\xff\ +\xd7\x00\x97\x03)\xff\xd7\x00\x97\x03+\xff\xd7\x00\x97\x03\ +-\xff\xd7\x00\x97\x03/\xff\xd7\x00\x97\x031\xff\xd7\x00\ +\x97\x033\xff\xd7\x00\x97\x03o\xff\xec\x00\x97\x03q\xff\ +\xec\x00\x97\x03s\xff\xec\x00\x97\x03\x8f\xff\xc3\x00\x98\x00\ +\x0f\xff\xae\x00\x98\x00\x11\xff\xae\x00\x98\x00$\xff\xd7\x00\ +\x98\x007\xff\xc3\x00\x98\x009\xff\xec\x00\x98\x00:\xff\ +\xec\x00\x98\x00;\xff\xd7\x00\x98\x00<\xff\xec\x00\x98\x00\ +=\xff\xec\x00\x98\x00\x82\xff\xd7\x00\x98\x00\x83\xff\xd7\x00\ +\x98\x00\x84\xff\xd7\x00\x98\x00\x85\xff\xd7\x00\x98\x00\x86\xff\ +\xd7\x00\x98\x00\x87\xff\xd7\x00\x98\x00\x9f\xff\xec\x00\x98\x00\ +\xc2\xff\xd7\x00\x98\x00\xc4\xff\xd7\x00\x98\x00\xc6\xff\xd7\x00\ +\x98\x01$\xff\xc3\x00\x98\x01&\xff\xc3\x00\x98\x016\xff\ +\xec\x00\x98\x018\xff\xec\x00\x98\x01:\xff\xec\x00\x98\x01\ +;\xff\xec\x00\x98\x01=\xff\xec\x00\x98\x01?\xff\xec\x00\ +\x98\x01C\xff\xd7\x00\x98\x01\xa0\xff\xec\x00\x98\x01\xfa\xff\ +\xec\x00\x98\x01\xfc\xff\xec\x00\x98\x01\xfe\xff\xec\x00\x98\x02\ +\x00\xff\xec\x00\x98\x02\x08\xff\xae\x00\x98\x02\x0c\xff\xae\x00\ +\x98\x02X\xff\xd7\x00\x98\x03\x1d\xff\xd7\x00\x98\x03\x1f\xff\ +\xd7\x00\x98\x03!\xff\xd7\x00\x98\x03#\xff\xd7\x00\x98\x03\ +%\xff\xd7\x00\x98\x03'\xff\xd7\x00\x98\x03)\xff\xd7\x00\ +\x98\x03+\xff\xd7\x00\x98\x03-\xff\xd7\x00\x98\x03/\xff\ +\xd7\x00\x98\x031\xff\xd7\x00\x98\x033\xff\xd7\x00\x98\x03\ +o\xff\xec\x00\x98\x03q\xff\xec\x00\x98\x03s\xff\xec\x00\ +\x98\x03\x8f\xff\xc3\x00\x9a\x00\x0f\xff\xae\x00\x9a\x00\x11\xff\ +\xae\x00\x9a\x00$\xff\xd7\x00\x9a\x007\xff\xc3\x00\x9a\x00\ +9\xff\xec\x00\x9a\x00:\xff\xec\x00\x9a\x00;\xff\xd7\x00\ +\x9a\x00<\xff\xec\x00\x9a\x00=\xff\xec\x00\x9a\x00\x82\xff\ +\xd7\x00\x9a\x00\x83\xff\xd7\x00\x9a\x00\x84\xff\xd7\x00\x9a\x00\ +\x85\xff\xd7\x00\x9a\x00\x86\xff\xd7\x00\x9a\x00\x87\xff\xd7\x00\ +\x9a\x00\x9f\xff\xec\x00\x9a\x00\xc2\xff\xd7\x00\x9a\x00\xc4\xff\ +\xd7\x00\x9a\x00\xc6\xff\xd7\x00\x9a\x01$\xff\xc3\x00\x9a\x01\ +&\xff\xc3\x00\x9a\x016\xff\xec\x00\x9a\x018\xff\xec\x00\ +\x9a\x01:\xff\xec\x00\x9a\x01;\xff\xec\x00\x9a\x01=\xff\ +\xec\x00\x9a\x01?\xff\xec\x00\x9a\x01C\xff\xd7\x00\x9a\x01\ +\xa0\xff\xec\x00\x9a\x01\xfa\xff\xec\x00\x9a\x01\xfc\xff\xec\x00\ +\x9a\x01\xfe\xff\xec\x00\x9a\x02\x00\xff\xec\x00\x9a\x02\x08\xff\ +\xae\x00\x9a\x02\x0c\xff\xae\x00\x9a\x02X\xff\xd7\x00\x9a\x03\ +\x1d\xff\xd7\x00\x9a\x03\x1f\xff\xd7\x00\x9a\x03!\xff\xd7\x00\ +\x9a\x03#\xff\xd7\x00\x9a\x03%\xff\xd7\x00\x9a\x03'\xff\ +\xd7\x00\x9a\x03)\xff\xd7\x00\x9a\x03+\xff\xd7\x00\x9a\x03\ +-\xff\xd7\x00\x9a\x03/\xff\xd7\x00\x9a\x031\xff\xd7\x00\ +\x9a\x033\xff\xd7\x00\x9a\x03o\xff\xec\x00\x9a\x03q\xff\ +\xec\x00\x9a\x03s\xff\xec\x00\x9a\x03\x8f\xff\xc3\x00\x9b\x00\ +\x0f\xff\xd7\x00\x9b\x00\x11\xff\xd7\x00\x9b\x00$\xff\xec\x00\ +\x9b\x00\x82\xff\xec\x00\x9b\x00\x83\xff\xec\x00\x9b\x00\x84\xff\ +\xec\x00\x9b\x00\x85\xff\xec\x00\x9b\x00\x86\xff\xec\x00\x9b\x00\ +\x87\xff\xec\x00\x9b\x00\xc2\xff\xec\x00\x9b\x00\xc4\xff\xec\x00\ +\x9b\x00\xc6\xff\xec\x00\x9b\x01C\xff\xec\x00\x9b\x02\x08\xff\ +\xd7\x00\x9b\x02\x0c\xff\xd7\x00\x9b\x02X\xff\xec\x00\x9b\x03\ +\x1d\xff\xec\x00\x9b\x03\x1f\xff\xec\x00\x9b\x03!\xff\xec\x00\ +\x9b\x03#\xff\xec\x00\x9b\x03%\xff\xec\x00\x9b\x03'\xff\ +\xec\x00\x9b\x03)\xff\xec\x00\x9b\x03+\xff\xec\x00\x9b\x03\ +-\xff\xec\x00\x9b\x03/\xff\xec\x00\x9b\x031\xff\xec\x00\ +\x9b\x033\xff\xec\x00\x9c\x00\x0f\xff\xd7\x00\x9c\x00\x11\xff\ +\xd7\x00\x9c\x00$\xff\xec\x00\x9c\x00\x82\xff\xec\x00\x9c\x00\ +\x83\xff\xec\x00\x9c\x00\x84\xff\xec\x00\x9c\x00\x85\xff\xec\x00\ +\x9c\x00\x86\xff\xec\x00\x9c\x00\x87\xff\xec\x00\x9c\x00\xc2\xff\ +\xec\x00\x9c\x00\xc4\xff\xec\x00\x9c\x00\xc6\xff\xec\x00\x9c\x01\ +C\xff\xec\x00\x9c\x02\x08\xff\xd7\x00\x9c\x02\x0c\xff\xd7\x00\ +\x9c\x02X\xff\xec\x00\x9c\x03\x1d\xff\xec\x00\x9c\x03\x1f\xff\ +\xec\x00\x9c\x03!\xff\xec\x00\x9c\x03#\xff\xec\x00\x9c\x03\ +%\xff\xec\x00\x9c\x03'\xff\xec\x00\x9c\x03)\xff\xec\x00\ +\x9c\x03+\xff\xec\x00\x9c\x03-\xff\xec\x00\x9c\x03/\xff\ +\xec\x00\x9c\x031\xff\xec\x00\x9c\x033\xff\xec\x00\x9d\x00\ +\x0f\xff\xd7\x00\x9d\x00\x11\xff\xd7\x00\x9d\x00$\xff\xec\x00\ +\x9d\x00\x82\xff\xec\x00\x9d\x00\x83\xff\xec\x00\x9d\x00\x84\xff\ +\xec\x00\x9d\x00\x85\xff\xec\x00\x9d\x00\x86\xff\xec\x00\x9d\x00\ +\x87\xff\xec\x00\x9d\x00\xc2\xff\xec\x00\x9d\x00\xc4\xff\xec\x00\ +\x9d\x00\xc6\xff\xec\x00\x9d\x01C\xff\xec\x00\x9d\x02\x08\xff\ +\xd7\x00\x9d\x02\x0c\xff\xd7\x00\x9d\x02X\xff\xec\x00\x9d\x03\ +\x1d\xff\xec\x00\x9d\x03\x1f\xff\xec\x00\x9d\x03!\xff\xec\x00\ +\x9d\x03#\xff\xec\x00\x9d\x03%\xff\xec\x00\x9d\x03'\xff\ +\xec\x00\x9d\x03)\xff\xec\x00\x9d\x03+\xff\xec\x00\x9d\x03\ +-\xff\xec\x00\x9d\x03/\xff\xec\x00\x9d\x031\xff\xec\x00\ +\x9d\x033\xff\xec\x00\x9e\x00\x0f\xff\xd7\x00\x9e\x00\x11\xff\ +\xd7\x00\x9e\x00$\xff\xec\x00\x9e\x00\x82\xff\xec\x00\x9e\x00\ +\x83\xff\xec\x00\x9e\x00\x84\xff\xec\x00\x9e\x00\x85\xff\xec\x00\ +\x9e\x00\x86\xff\xec\x00\x9e\x00\x87\xff\xec\x00\x9e\x00\xc2\xff\ +\xec\x00\x9e\x00\xc4\xff\xec\x00\x9e\x00\xc6\xff\xec\x00\x9e\x01\ +C\xff\xec\x00\x9e\x02\x08\xff\xd7\x00\x9e\x02\x0c\xff\xd7\x00\ +\x9e\x02X\xff\xec\x00\x9e\x03\x1d\xff\xec\x00\x9e\x03\x1f\xff\ +\xec\x00\x9e\x03!\xff\xec\x00\x9e\x03#\xff\xec\x00\x9e\x03\ +%\xff\xec\x00\x9e\x03'\xff\xec\x00\x9e\x03)\xff\xec\x00\ +\x9e\x03+\xff\xec\x00\x9e\x03-\xff\xec\x00\x9e\x03/\xff\ +\xec\x00\x9e\x031\xff\xec\x00\x9e\x033\xff\xec\x00\x9f\x00\ +\x0f\xff\x85\x00\x9f\x00\x11\xff\x85\x00\x9f\x00\x22\x00)\x00\ +\x9f\x00$\xff\x85\x00\x9f\x00&\xff\xd7\x00\x9f\x00*\xff\ +\xd7\x00\x9f\x002\xff\xd7\x00\x9f\x004\xff\xd7\x00\x9f\x00\ +D\xff\x9a\x00\x9f\x00F\xff\x9a\x00\x9f\x00G\xff\x9a\x00\ +\x9f\x00H\xff\x9a\x00\x9f\x00J\xff\xd7\x00\x9f\x00P\xff\ +\xc3\x00\x9f\x00Q\xff\xc3\x00\x9f\x00R\xff\x9a\x00\x9f\x00\ +S\xff\xc3\x00\x9f\x00T\xff\x9a\x00\x9f\x00U\xff\xc3\x00\ +\x9f\x00V\xff\xae\x00\x9f\x00X\xff\xc3\x00\x9f\x00]\xff\ +\xd7\x00\x9f\x00\x82\xff\x85\x00\x9f\x00\x83\xff\x85\x00\x9f\x00\ +\x84\xff\x85\x00\x9f\x00\x85\xff\x85\x00\x9f\x00\x86\xff\x85\x00\ +\x9f\x00\x87\xff\x85\x00\x9f\x00\x89\xff\xd7\x00\x9f\x00\x94\xff\ +\xd7\x00\x9f\x00\x95\xff\xd7\x00\x9f\x00\x96\xff\xd7\x00\x9f\x00\ +\x97\xff\xd7\x00\x9f\x00\x98\xff\xd7\x00\x9f\x00\x9a\xff\xd7\x00\ +\x9f\x00\xa2\xff\x9a\x00\x9f\x00\xa3\xff\x9a\x00\x9f\x00\xa4\xff\ +\x9a\x00\x9f\x00\xa5\xff\x9a\x00\x9f\x00\xa6\xff\x9a\x00\x9f\x00\ +\xa7\xff\x9a\x00\x9f\x00\xa8\xff\x9a\x00\x9f\x00\xa9\xff\x9a\x00\ +\x9f\x00\xaa\xff\x9a\x00\x9f\x00\xab\xff\x9a\x00\x9f\x00\xac\xff\ +\x9a\x00\x9f\x00\xad\xff\x9a\x00\x9f\x00\xb4\xff\x9a\x00\x9f\x00\ +\xb5\xff\x9a\x00\x9f\x00\xb6\xff\x9a\x00\x9f\x00\xb7\xff\x9a\x00\ +\x9f\x00\xb8\xff\x9a\x00\x9f\x00\xba\xff\x9a\x00\x9f\x00\xbb\xff\ +\xc3\x00\x9f\x00\xbc\xff\xc3\x00\x9f\x00\xbd\xff\xc3\x00\x9f\x00\ +\xbe\xff\xc3\x00\x9f\x00\xc2\xff\x85\x00\x9f\x00\xc3\xff\x9a\x00\ +\x9f\x00\xc4\xff\x85\x00\x9f\x00\xc5\xff\x9a\x00\x9f\x00\xc6\xff\ +\x85\x00\x9f\x00\xc7\xff\x9a\x00\x9f\x00\xc8\xff\xd7\x00\x9f\x00\ +\xc9\xff\x9a\x00\x9f\x00\xca\xff\xd7\x00\x9f\x00\xcb\xff\x9a\x00\ +\x9f\x00\xcc\xff\xd7\x00\x9f\x00\xcd\xff\x9a\x00\x9f\x00\xce\xff\ +\xd7\x00\x9f\x00\xcf\xff\x9a\x00\x9f\x00\xd1\xff\x9a\x00\x9f\x00\ +\xd3\xff\x9a\x00\x9f\x00\xd5\xff\x9a\x00\x9f\x00\xd7\xff\x9a\x00\ +\x9f\x00\xd9\xff\x9a\x00\x9f\x00\xdb\xff\x9a\x00\x9f\x00\xdd\xff\ +\x9a\x00\x9f\x00\xde\xff\xd7\x00\x9f\x00\xdf\xff\xd7\x00\x9f\x00\ +\xe0\xff\xd7\x00\x9f\x00\xe1\xff\xd7\x00\x9f\x00\xe2\xff\xd7\x00\ +\x9f\x00\xe3\xff\xd7\x00\x9f\x00\xe4\xff\xd7\x00\x9f\x00\xe5\xff\ +\xd7\x00\x9f\x00\xfa\xff\xc3\x00\x9f\x01\x06\xff\xc3\x00\x9f\x01\ +\x08\xff\xc3\x00\x9f\x01\x0d\xff\xc3\x00\x9f\x01\x0e\xff\xd7\x00\ +\x9f\x01\x0f\xff\x9a\x00\x9f\x01\x10\xff\xd7\x00\x9f\x01\x11\xff\ +\x9a\x00\x9f\x01\x12\xff\xd7\x00\x9f\x01\x13\xff\x9a\x00\x9f\x01\ +\x14\xff\xd7\x00\x9f\x01\x15\xff\x9a\x00\x9f\x01\x17\xff\xc3\x00\ +\x9f\x01\x19\xff\xc3\x00\x9f\x01\x1d\xff\xae\x00\x9f\x01!\xff\ +\xae\x00\x9f\x01+\xff\xc3\x00\x9f\x01-\xff\xc3\x00\x9f\x01\ +/\xff\xc3\x00\x9f\x011\xff\xc3\x00\x9f\x013\xff\xc3\x00\ +\x9f\x015\xff\xc3\x00\x9f\x01<\xff\xd7\x00\x9f\x01>\xff\ +\xd7\x00\x9f\x01@\xff\xd7\x00\x9f\x01C\xff\x85\x00\x9f\x01\ +D\xff\x9a\x00\x9f\x01F\xff\x9a\x00\x9f\x01G\xff\xd7\x00\ +\x9f\x01H\xff\x9a\x00\x9f\x01J\xff\xae\x00\x9f\x02\x08\xff\ +\x85\x00\x9f\x02\x0c\xff\x85\x00\x9f\x02W\xff\xc3\x00\x9f\x02\ +X\xff\x85\x00\x9f\x02Y\xff\x9a\x00\x9f\x02_\xff\xd7\x00\ +\x9f\x02`\xff\x9a\x00\x9f\x02b\xff\xc3\x00\x9f\x03\x1d\xff\ +\x85\x00\x9f\x03\x1e\xff\x9a\x00\x9f\x03\x1f\xff\x85\x00\x9f\x03\ + \xff\x9a\x00\x9f\x03!\xff\x85\x00\x9f\x03\x22\xff\x9a\x00\ +\x9f\x03#\xff\x85\x00\x9f\x03%\xff\x85\x00\x9f\x03&\xff\ +\x9a\x00\x9f\x03'\xff\x85\x00\x9f\x03(\xff\x9a\x00\x9f\x03\ +)\xff\x85\x00\x9f\x03*\xff\x9a\x00\x9f\x03+\xff\x85\x00\ +\x9f\x03,\xff\x9a\x00\x9f\x03-\xff\x85\x00\x9f\x03.\xff\ +\x9a\x00\x9f\x03/\xff\x85\x00\x9f\x030\xff\x9a\x00\x9f\x03\ +1\xff\x85\x00\x9f\x032\xff\x9a\x00\x9f\x033\xff\x85\x00\ +\x9f\x034\xff\x9a\x00\x9f\x036\xff\x9a\x00\x9f\x038\xff\ +\x9a\x00\x9f\x03:\xff\x9a\x00\x9f\x03<\xff\x9a\x00\x9f\x03\ +@\xff\x9a\x00\x9f\x03B\xff\x9a\x00\x9f\x03D\xff\x9a\x00\ +\x9f\x03I\xff\xd7\x00\x9f\x03J\xff\x9a\x00\x9f\x03K\xff\ +\xd7\x00\x9f\x03L\xff\x9a\x00\x9f\x03M\xff\xd7\x00\x9f\x03\ +N\xff\x9a\x00\x9f\x03O\xff\xd7\x00\x9f\x03Q\xff\xd7\x00\ +\x9f\x03R\xff\x9a\x00\x9f\x03S\xff\xd7\x00\x9f\x03T\xff\ +\x9a\x00\x9f\x03U\xff\xd7\x00\x9f\x03V\xff\x9a\x00\x9f\x03\ +W\xff\xd7\x00\x9f\x03X\xff\x9a\x00\x9f\x03Y\xff\xd7\x00\ +\x9f\x03Z\xff\x9a\x00\x9f\x03[\xff\xd7\x00\x9f\x03\x5c\xff\ +\x9a\x00\x9f\x03]\xff\xd7\x00\x9f\x03^\xff\x9a\x00\x9f\x03\ +_\xff\xd7\x00\x9f\x03`\xff\x9a\x00\x9f\x03b\xff\xc3\x00\ +\x9f\x03d\xff\xc3\x00\x9f\x03f\xff\xc3\x00\x9f\x03h\xff\ +\xc3\x00\x9f\x03j\xff\xc3\x00\x9f\x03l\xff\xc3\x00\x9f\x03\ +n\xff\xc3\x00\xa0\x00\x0f\xfe\xf6\x00\xa0\x00\x11\xfe\xf6\x00\ +\xa0\x00$\xff\x9a\x00\xa0\x00;\xff\xd7\x00\xa0\x00=\xff\ +\xec\x00\xa0\x00\x82\xff\x9a\x00\xa0\x00\x83\xff\x9a\x00\xa0\x00\ +\x84\xff\x9a\x00\xa0\x00\x85\xff\x9a\x00\xa0\x00\x86\xff\x9a\x00\ +\xa0\x00\x87\xff\x9a\x00\xa0\x00\xc2\xff\x9a\x00\xa0\x00\xc4\xff\ +\x9a\x00\xa0\x00\xc6\xff\x9a\x00\xa0\x01;\xff\xec\x00\xa0\x01\ +=\xff\xec\x00\xa0\x01?\xff\xec\x00\xa0\x01C\xff\x9a\x00\ +\xa0\x02\x08\xfe\xf6\x00\xa0\x02\x0c\xfe\xf6\x00\xa0\x02X\xff\ +\x9a\x00\xa0\x03\x1d\xff\x9a\x00\xa0\x03\x1f\xff\x9a\x00\xa0\x03\ +!\xff\x9a\x00\xa0\x03#\xff\x9a\x00\xa0\x03%\xff\x9a\x00\ +\xa0\x03'\xff\x9a\x00\xa0\x03)\xff\x9a\x00\xa0\x03+\xff\ +\x9a\x00\xa0\x03-\xff\x9a\x00\xa0\x03/\xff\x9a\x00\xa0\x03\ +1\xff\x9a\x00\xa0\x033\xff\x9a\x00\xa2\x00\x05\xff\xec\x00\ +\xa2\x00\x0a\xff\xec\x00\xa2\x02\x07\xff\xec\x00\xa2\x02\x0b\xff\ +\xec\x00\xa3\x00\x05\xff\xec\x00\xa3\x00\x0a\xff\xec\x00\xa3\x02\ +\x07\xff\xec\x00\xa3\x02\x0b\xff\xec\x00\xa4\x00\x05\xff\xec\x00\ +\xa4\x00\x0a\xff\xec\x00\xa4\x02\x07\xff\xec\x00\xa4\x02\x0b\xff\ +\xec\x00\xa5\x00\x05\xff\xec\x00\xa5\x00\x0a\xff\xec\x00\xa5\x02\ +\x07\xff\xec\x00\xa5\x02\x0b\xff\xec\x00\xa6\x00\x05\xff\xec\x00\ +\xa6\x00\x0a\xff\xec\x00\xa6\x02\x07\xff\xec\x00\xa6\x02\x0b\xff\ +\xec\x00\xa7\x00\x05\xff\xec\x00\xa7\x00\x0a\xff\xec\x00\xa7\x02\ +\x07\xff\xec\x00\xa7\x02\x0b\xff\xec\x00\xaa\x00\x05\xff\xec\x00\ +\xaa\x00\x0a\xff\xec\x00\xaa\x00Y\xff\xd7\x00\xaa\x00Z\xff\ +\xd7\x00\xaa\x00[\xff\xd7\x00\xaa\x00\x5c\xff\xd7\x00\xaa\x00\ +]\xff\xec\x00\xaa\x00\xbf\xff\xd7\x00\xaa\x017\xff\xd7\x00\ +\xaa\x01<\xff\xec\x00\xaa\x01>\xff\xec\x00\xaa\x01@\xff\ +\xec\x00\xaa\x01\xfb\xff\xd7\x00\xaa\x01\xfd\xff\xd7\x00\xaa\x02\ +\x07\xff\xec\x00\xaa\x02\x0b\xff\xec\x00\xaa\x03p\xff\xd7\x00\ +\xab\x00\x05\xff\xec\x00\xab\x00\x0a\xff\xec\x00\xab\x00Y\xff\ +\xd7\x00\xab\x00Z\xff\xd7\x00\xab\x00[\xff\xd7\x00\xab\x00\ +\x5c\xff\xd7\x00\xab\x00]\xff\xec\x00\xab\x00\xbf\xff\xd7\x00\ +\xab\x017\xff\xd7\x00\xab\x01<\xff\xec\x00\xab\x01>\xff\ +\xec\x00\xab\x01@\xff\xec\x00\xab\x01\xfb\xff\xd7\x00\xab\x01\ +\xfd\xff\xd7\x00\xab\x02\x07\xff\xec\x00\xab\x02\x0b\xff\xec\x00\ +\xab\x03p\xff\xd7\x00\xac\x00\x05\xff\xec\x00\xac\x00\x0a\xff\ +\xec\x00\xac\x00Y\xff\xd7\x00\xac\x00Z\xff\xd7\x00\xac\x00\ +[\xff\xd7\x00\xac\x00\x5c\xff\xd7\x00\xac\x00]\xff\xec\x00\ +\xac\x00\xbf\xff\xd7\x00\xac\x017\xff\xd7\x00\xac\x01<\xff\ +\xec\x00\xac\x01>\xff\xec\x00\xac\x01@\xff\xec\x00\xac\x01\ +\xfb\xff\xd7\x00\xac\x01\xfd\xff\xd7\x00\xac\x02\x07\xff\xec\x00\ +\xac\x02\x0b\xff\xec\x00\xac\x03p\xff\xd7\x00\xad\x00\x05\xff\ +\xec\x00\xad\x00\x0a\xff\xec\x00\xad\x00Y\xff\xd7\x00\xad\x00\ +Z\xff\xd7\x00\xad\x00[\xff\xd7\x00\xad\x00\x5c\xff\xd7\x00\ +\xad\x00]\xff\xec\x00\xad\x00\xbf\xff\xd7\x00\xad\x017\xff\ +\xd7\x00\xad\x01<\xff\xec\x00\xad\x01>\xff\xec\x00\xad\x01\ +@\xff\xec\x00\xad\x01\xfb\xff\xd7\x00\xad\x01\xfd\xff\xd7\x00\ +\xad\x02\x07\xff\xec\x00\xad\x02\x0b\xff\xec\x00\xad\x03p\xff\ +\xd7\x00\xb2\x00\x05\xff\xec\x00\xb2\x00\x0a\xff\xec\x00\xb2\x00\ +Y\xff\xd7\x00\xb2\x00Z\xff\xd7\x00\xb2\x00[\xff\xd7\x00\ +\xb2\x00\x5c\xff\xd7\x00\xb2\x00]\xff\xec\x00\xb2\x00\xbf\xff\ +\xd7\x00\xb2\x017\xff\xd7\x00\xb2\x01<\xff\xec\x00\xb2\x01\ +>\xff\xec\x00\xb2\x01@\xff\xec\x00\xb2\x01\xfb\xff\xd7\x00\ +\xb2\x01\xfd\xff\xd7\x00\xb2\x02\x07\xff\xec\x00\xb2\x02\x0b\xff\ +\xec\x00\xb2\x03p\xff\xd7\x00\xb4\x00\x05\xff\xec\x00\xb4\x00\ +\x0a\xff\xec\x00\xb4\x00Y\xff\xd7\x00\xb4\x00Z\xff\xd7\x00\ +\xb4\x00[\xff\xd7\x00\xb4\x00\x5c\xff\xd7\x00\xb4\x00]\xff\ +\xec\x00\xb4\x00\xbf\xff\xd7\x00\xb4\x017\xff\xd7\x00\xb4\x01\ +<\xff\xec\x00\xb4\x01>\xff\xec\x00\xb4\x01@\xff\xec\x00\ +\xb4\x01\xfb\xff\xd7\x00\xb4\x01\xfd\xff\xd7\x00\xb4\x02\x07\xff\ +\xec\x00\xb4\x02\x0b\xff\xec\x00\xb4\x03p\xff\xd7\x00\xb5\x00\ +\x05\xff\xec\x00\xb5\x00\x0a\xff\xec\x00\xb5\x00Y\xff\xd7\x00\ +\xb5\x00Z\xff\xd7\x00\xb5\x00[\xff\xd7\x00\xb5\x00\x5c\xff\ +\xd7\x00\xb5\x00]\xff\xec\x00\xb5\x00\xbf\xff\xd7\x00\xb5\x01\ +7\xff\xd7\x00\xb5\x01<\xff\xec\x00\xb5\x01>\xff\xec\x00\ +\xb5\x01@\xff\xec\x00\xb5\x01\xfb\xff\xd7\x00\xb5\x01\xfd\xff\ +\xd7\x00\xb5\x02\x07\xff\xec\x00\xb5\x02\x0b\xff\xec\x00\xb5\x03\ +p\xff\xd7\x00\xb6\x00\x05\xff\xec\x00\xb6\x00\x0a\xff\xec\x00\ +\xb6\x00Y\xff\xd7\x00\xb6\x00Z\xff\xd7\x00\xb6\x00[\xff\ +\xd7\x00\xb6\x00\x5c\xff\xd7\x00\xb6\x00]\xff\xec\x00\xb6\x00\ +\xbf\xff\xd7\x00\xb6\x017\xff\xd7\x00\xb6\x01<\xff\xec\x00\ +\xb6\x01>\xff\xec\x00\xb6\x01@\xff\xec\x00\xb6\x01\xfb\xff\ +\xd7\x00\xb6\x01\xfd\xff\xd7\x00\xb6\x02\x07\xff\xec\x00\xb6\x02\ +\x0b\xff\xec\x00\xb6\x03p\xff\xd7\x00\xb8\x00\x05\xff\xd7\x00\ +\xb8\x00\x0a\xff\xd7\x00\xb8\x02\x07\xff\xd7\x00\xb8\x02\x0b\xff\ +\xd7\x00\xba\x00\x05\xff\xec\x00\xba\x00\x0a\xff\xec\x00\xba\x00\ +Y\xff\xd7\x00\xba\x00Z\xff\xd7\x00\xba\x00[\xff\xd7\x00\ +\xba\x00\x5c\xff\xd7\x00\xba\x00]\xff\xec\x00\xba\x00\xbf\xff\ +\xd7\x00\xba\x017\xff\xd7\x00\xba\x01<\xff\xec\x00\xba\x01\ +>\xff\xec\x00\xba\x01@\xff\xec\x00\xba\x01\xfb\xff\xd7\x00\ +\xba\x01\xfd\xff\xd7\x00\xba\x02\x07\xff\xec\x00\xba\x02\x0b\xff\ +\xec\x00\xba\x03p\xff\xd7\x00\xbf\x00\x05\x00R\x00\xbf\x00\ +\x0a\x00R\x00\xbf\x00\x0f\xff\xae\x00\xbf\x00\x11\xff\xae\x00\ +\xbf\x00\x22\x00)\x00\xbf\x02\x07\x00R\x00\xbf\x02\x08\xff\ +\xae\x00\xbf\x02\x0b\x00R\x00\xbf\x02\x0c\xff\xae\x00\xc0\x00\ +\x05\xff\xec\x00\xc0\x00\x0a\xff\xec\x00\xc0\x00Y\xff\xd7\x00\ +\xc0\x00Z\xff\xd7\x00\xc0\x00[\xff\xd7\x00\xc0\x00\x5c\xff\ +\xd7\x00\xc0\x00]\xff\xec\x00\xc0\x00\xbf\xff\xd7\x00\xc0\x01\ +7\xff\xd7\x00\xc0\x01<\xff\xec\x00\xc0\x01>\xff\xec\x00\ +\xc0\x01@\xff\xec\x00\xc0\x01\xfb\xff\xd7\x00\xc0\x01\xfd\xff\ +\xd7\x00\xc0\x02\x07\xff\xec\x00\xc0\x02\x0b\xff\xec\x00\xc0\x03\ +p\xff\xd7\x00\xc1\x00\x05\x00R\x00\xc1\x00\x0a\x00R\x00\ +\xc1\x00\x0f\xff\xae\x00\xc1\x00\x11\xff\xae\x00\xc1\x00\x22\x00\ +)\x00\xc1\x02\x07\x00R\x00\xc1\x02\x08\xff\xae\x00\xc1\x02\ +\x0b\x00R\x00\xc1\x02\x0c\xff\xae\x00\xc2\x00\x05\xffq\x00\ +\xc2\x00\x0a\xffq\x00\xc2\x00&\xff\xd7\x00\xc2\x00*\xff\ +\xd7\x00\xc2\x00-\x01\x0a\x00\xc2\x002\xff\xd7\x00\xc2\x00\ +4\xff\xd7\x00\xc2\x007\xffq\x00\xc2\x009\xff\xae\x00\ +\xc2\x00:\xff\xae\x00\xc2\x00<\xff\x85\x00\xc2\x00\x89\xff\ +\xd7\x00\xc2\x00\x94\xff\xd7\x00\xc2\x00\x95\xff\xd7\x00\xc2\x00\ +\x96\xff\xd7\x00\xc2\x00\x97\xff\xd7\x00\xc2\x00\x98\xff\xd7\x00\ +\xc2\x00\x9a\xff\xd7\x00\xc2\x00\x9f\xff\x85\x00\xc2\x00\xc8\xff\ +\xd7\x00\xc2\x00\xca\xff\xd7\x00\xc2\x00\xcc\xff\xd7\x00\xc2\x00\ +\xce\xff\xd7\x00\xc2\x00\xde\xff\xd7\x00\xc2\x00\xe0\xff\xd7\x00\ +\xc2\x00\xe2\xff\xd7\x00\xc2\x00\xe4\xff\xd7\x00\xc2\x01\x0e\xff\ +\xd7\x00\xc2\x01\x10\xff\xd7\x00\xc2\x01\x12\xff\xd7\x00\xc2\x01\ +\x14\xff\xd7\x00\xc2\x01$\xffq\x00\xc2\x01&\xffq\x00\ +\xc2\x016\xff\xae\x00\xc2\x018\xff\x85\x00\xc2\x01:\xff\ +\x85\x00\xc2\x01G\xff\xd7\x00\xc2\x01\xfa\xff\xae\x00\xc2\x01\ +\xfc\xff\xae\x00\xc2\x01\xfe\xff\xae\x00\xc2\x02\x00\xff\x85\x00\ +\xc2\x02\x07\xffq\x00\xc2\x02\x0b\xffq\x00\xc2\x02_\xff\ +\xd7\x00\xc2\x03I\xff\xd7\x00\xc2\x03K\xff\xd7\x00\xc2\x03\ +M\xff\xd7\x00\xc2\x03O\xff\xd7\x00\xc2\x03Q\xff\xd7\x00\ +\xc2\x03S\xff\xd7\x00\xc2\x03U\xff\xd7\x00\xc2\x03W\xff\ +\xd7\x00\xc2\x03Y\xff\xd7\x00\xc2\x03[\xff\xd7\x00\xc2\x03\ +]\xff\xd7\x00\xc2\x03_\xff\xd7\x00\xc2\x03o\xff\x85\x00\ +\xc2\x03q\xff\x85\x00\xc2\x03s\xff\x85\x00\xc2\x03\x8f\xff\ +q\x00\xc3\x00\x05\xff\xec\x00\xc3\x00\x0a\xff\xec\x00\xc3\x02\ +\x07\xff\xec\x00\xc3\x02\x0b\xff\xec\x00\xc4\x00\x05\xffq\x00\ +\xc4\x00\x0a\xffq\x00\xc4\x00&\xff\xd7\x00\xc4\x00*\xff\ +\xd7\x00\xc4\x00-\x01\x0a\x00\xc4\x002\xff\xd7\x00\xc4\x00\ +4\xff\xd7\x00\xc4\x007\xffq\x00\xc4\x009\xff\xae\x00\ +\xc4\x00:\xff\xae\x00\xc4\x00<\xff\x85\x00\xc4\x00\x89\xff\ +\xd7\x00\xc4\x00\x94\xff\xd7\x00\xc4\x00\x95\xff\xd7\x00\xc4\x00\ +\x96\xff\xd7\x00\xc4\x00\x97\xff\xd7\x00\xc4\x00\x98\xff\xd7\x00\ +\xc4\x00\x9a\xff\xd7\x00\xc4\x00\x9f\xff\x85\x00\xc4\x00\xc8\xff\ +\xd7\x00\xc4\x00\xca\xff\xd7\x00\xc4\x00\xcc\xff\xd7\x00\xc4\x00\ +\xce\xff\xd7\x00\xc4\x00\xde\xff\xd7\x00\xc4\x00\xe0\xff\xd7\x00\ +\xc4\x00\xe2\xff\xd7\x00\xc4\x00\xe4\xff\xd7\x00\xc4\x01\x0e\xff\ +\xd7\x00\xc4\x01\x10\xff\xd7\x00\xc4\x01\x12\xff\xd7\x00\xc4\x01\ +\x14\xff\xd7\x00\xc4\x01$\xffq\x00\xc4\x01&\xffq\x00\ +\xc4\x016\xff\xae\x00\xc4\x018\xff\x85\x00\xc4\x01:\xff\ +\x85\x00\xc4\x01G\xff\xd7\x00\xc4\x01\xfa\xff\xae\x00\xc4\x01\ +\xfc\xff\xae\x00\xc4\x01\xfe\xff\xae\x00\xc4\x02\x00\xff\x85\x00\ +\xc4\x02\x07\xffq\x00\xc4\x02\x0b\xffq\x00\xc4\x02_\xff\ +\xd7\x00\xc4\x03I\xff\xd7\x00\xc4\x03K\xff\xd7\x00\xc4\x03\ +M\xff\xd7\x00\xc4\x03O\xff\xd7\x00\xc4\x03Q\xff\xd7\x00\ +\xc4\x03S\xff\xd7\x00\xc4\x03U\xff\xd7\x00\xc4\x03W\xff\ +\xd7\x00\xc4\x03Y\xff\xd7\x00\xc4\x03[\xff\xd7\x00\xc4\x03\ +]\xff\xd7\x00\xc4\x03_\xff\xd7\x00\xc4\x03o\xff\x85\x00\ +\xc4\x03q\xff\x85\x00\xc4\x03s\xff\x85\x00\xc4\x03\x8f\xff\ +q\x00\xc5\x00\x05\xff\xec\x00\xc5\x00\x0a\xff\xec\x00\xc5\x02\ +\x07\xff\xec\x00\xc5\x02\x0b\xff\xec\x00\xc6\x00\x05\xffq\x00\ +\xc6\x00\x0a\xffq\x00\xc6\x00&\xff\xd7\x00\xc6\x00*\xff\ +\xd7\x00\xc6\x00-\x01\x0a\x00\xc6\x002\xff\xd7\x00\xc6\x00\ +4\xff\xd7\x00\xc6\x007\xffq\x00\xc6\x009\xff\xae\x00\ +\xc6\x00:\xff\xae\x00\xc6\x00<\xff\x85\x00\xc6\x00\x89\xff\ +\xd7\x00\xc6\x00\x94\xff\xd7\x00\xc6\x00\x95\xff\xd7\x00\xc6\x00\ +\x96\xff\xd7\x00\xc6\x00\x97\xff\xd7\x00\xc6\x00\x98\xff\xd7\x00\ +\xc6\x00\x9a\xff\xd7\x00\xc6\x00\x9f\xff\x85\x00\xc6\x00\xc8\xff\ +\xd7\x00\xc6\x00\xca\xff\xd7\x00\xc6\x00\xcc\xff\xd7\x00\xc6\x00\ +\xce\xff\xd7\x00\xc6\x00\xde\xff\xd7\x00\xc6\x00\xe0\xff\xd7\x00\ +\xc6\x00\xe2\xff\xd7\x00\xc6\x00\xe4\xff\xd7\x00\xc6\x01\x0e\xff\ +\xd7\x00\xc6\x01\x10\xff\xd7\x00\xc6\x01\x12\xff\xd7\x00\xc6\x01\ +\x14\xff\xd7\x00\xc6\x01$\xffq\x00\xc6\x01&\xffq\x00\ +\xc6\x016\xff\xae\x00\xc6\x018\xff\x85\x00\xc6\x01:\xff\ +\x85\x00\xc6\x01G\xff\xd7\x00\xc6\x01\xfa\xff\xae\x00\xc6\x01\ +\xfc\xff\xae\x00\xc6\x01\xfe\xff\xae\x00\xc6\x02\x00\xff\x85\x00\ +\xc6\x02\x07\xffq\x00\xc6\x02\x0b\xffq\x00\xc6\x02_\xff\ +\xd7\x00\xc6\x03I\xff\xd7\x00\xc6\x03K\xff\xd7\x00\xc6\x03\ +M\xff\xd7\x00\xc6\x03O\xff\xd7\x00\xc6\x03Q\xff\xd7\x00\ +\xc6\x03S\xff\xd7\x00\xc6\x03U\xff\xd7\x00\xc6\x03W\xff\ +\xd7\x00\xc6\x03Y\xff\xd7\x00\xc6\x03[\xff\xd7\x00\xc6\x03\ +]\xff\xd7\x00\xc6\x03_\xff\xd7\x00\xc6\x03o\xff\x85\x00\ +\xc6\x03q\xff\x85\x00\xc6\x03s\xff\x85\x00\xc6\x03\x8f\xff\ +q\x00\xc7\x00\x05\xff\xec\x00\xc7\x00\x0a\xff\xec\x00\xc7\x02\ +\x07\xff\xec\x00\xc7\x02\x0b\xff\xec\x00\xc8\x00&\xff\xd7\x00\ +\xc8\x00*\xff\xd7\x00\xc8\x002\xff\xd7\x00\xc8\x004\xff\ +\xd7\x00\xc8\x00\x89\xff\xd7\x00\xc8\x00\x94\xff\xd7\x00\xc8\x00\ +\x95\xff\xd7\x00\xc8\x00\x96\xff\xd7\x00\xc8\x00\x97\xff\xd7\x00\ +\xc8\x00\x98\xff\xd7\x00\xc8\x00\x9a\xff\xd7\x00\xc8\x00\xc8\xff\ +\xd7\x00\xc8\x00\xca\xff\xd7\x00\xc8\x00\xcc\xff\xd7\x00\xc8\x00\ +\xce\xff\xd7\x00\xc8\x00\xde\xff\xd7\x00\xc8\x00\xe0\xff\xd7\x00\ +\xc8\x00\xe2\xff\xd7\x00\xc8\x00\xe4\xff\xd7\x00\xc8\x01\x0e\xff\ +\xd7\x00\xc8\x01\x10\xff\xd7\x00\xc8\x01\x12\xff\xd7\x00\xc8\x01\ +\x14\xff\xd7\x00\xc8\x01G\xff\xd7\x00\xc8\x02_\xff\xd7\x00\ +\xc8\x03I\xff\xd7\x00\xc8\x03K\xff\xd7\x00\xc8\x03M\xff\ +\xd7\x00\xc8\x03O\xff\xd7\x00\xc8\x03Q\xff\xd7\x00\xc8\x03\ +S\xff\xd7\x00\xc8\x03U\xff\xd7\x00\xc8\x03W\xff\xd7\x00\ +\xc8\x03Y\xff\xd7\x00\xc8\x03[\xff\xd7\x00\xc8\x03]\xff\ +\xd7\x00\xc8\x03_\xff\xd7\x00\xca\x00&\xff\xd7\x00\xca\x00\ +*\xff\xd7\x00\xca\x002\xff\xd7\x00\xca\x004\xff\xd7\x00\ +\xca\x00\x89\xff\xd7\x00\xca\x00\x94\xff\xd7\x00\xca\x00\x95\xff\ +\xd7\x00\xca\x00\x96\xff\xd7\x00\xca\x00\x97\xff\xd7\x00\xca\x00\ +\x98\xff\xd7\x00\xca\x00\x9a\xff\xd7\x00\xca\x00\xc8\xff\xd7\x00\ +\xca\x00\xca\xff\xd7\x00\xca\x00\xcc\xff\xd7\x00\xca\x00\xce\xff\ +\xd7\x00\xca\x00\xde\xff\xd7\x00\xca\x00\xe0\xff\xd7\x00\xca\x00\ +\xe2\xff\xd7\x00\xca\x00\xe4\xff\xd7\x00\xca\x01\x0e\xff\xd7\x00\ +\xca\x01\x10\xff\xd7\x00\xca\x01\x12\xff\xd7\x00\xca\x01\x14\xff\ +\xd7\x00\xca\x01G\xff\xd7\x00\xca\x02_\xff\xd7\x00\xca\x03\ +I\xff\xd7\x00\xca\x03K\xff\xd7\x00\xca\x03M\xff\xd7\x00\ +\xca\x03O\xff\xd7\x00\xca\x03Q\xff\xd7\x00\xca\x03S\xff\ +\xd7\x00\xca\x03U\xff\xd7\x00\xca\x03W\xff\xd7\x00\xca\x03\ +Y\xff\xd7\x00\xca\x03[\xff\xd7\x00\xca\x03]\xff\xd7\x00\ +\xca\x03_\xff\xd7\x00\xcc\x00&\xff\xd7\x00\xcc\x00*\xff\ +\xd7\x00\xcc\x002\xff\xd7\x00\xcc\x004\xff\xd7\x00\xcc\x00\ +\x89\xff\xd7\x00\xcc\x00\x94\xff\xd7\x00\xcc\x00\x95\xff\xd7\x00\ +\xcc\x00\x96\xff\xd7\x00\xcc\x00\x97\xff\xd7\x00\xcc\x00\x98\xff\ +\xd7\x00\xcc\x00\x9a\xff\xd7\x00\xcc\x00\xc8\xff\xd7\x00\xcc\x00\ +\xca\xff\xd7\x00\xcc\x00\xcc\xff\xd7\x00\xcc\x00\xce\xff\xd7\x00\ +\xcc\x00\xde\xff\xd7\x00\xcc\x00\xe0\xff\xd7\x00\xcc\x00\xe2\xff\ +\xd7\x00\xcc\x00\xe4\xff\xd7\x00\xcc\x01\x0e\xff\xd7\x00\xcc\x01\ +\x10\xff\xd7\x00\xcc\x01\x12\xff\xd7\x00\xcc\x01\x14\xff\xd7\x00\ +\xcc\x01G\xff\xd7\x00\xcc\x02_\xff\xd7\x00\xcc\x03I\xff\ +\xd7\x00\xcc\x03K\xff\xd7\x00\xcc\x03M\xff\xd7\x00\xcc\x03\ +O\xff\xd7\x00\xcc\x03Q\xff\xd7\x00\xcc\x03S\xff\xd7\x00\ +\xcc\x03U\xff\xd7\x00\xcc\x03W\xff\xd7\x00\xcc\x03Y\xff\ +\xd7\x00\xcc\x03[\xff\xd7\x00\xcc\x03]\xff\xd7\x00\xcc\x03\ +_\xff\xd7\x00\xce\x00&\xff\xd7\x00\xce\x00*\xff\xd7\x00\ +\xce\x002\xff\xd7\x00\xce\x004\xff\xd7\x00\xce\x00\x89\xff\ +\xd7\x00\xce\x00\x94\xff\xd7\x00\xce\x00\x95\xff\xd7\x00\xce\x00\ +\x96\xff\xd7\x00\xce\x00\x97\xff\xd7\x00\xce\x00\x98\xff\xd7\x00\ +\xce\x00\x9a\xff\xd7\x00\xce\x00\xc8\xff\xd7\x00\xce\x00\xca\xff\ +\xd7\x00\xce\x00\xcc\xff\xd7\x00\xce\x00\xce\xff\xd7\x00\xce\x00\ +\xde\xff\xd7\x00\xce\x00\xe0\xff\xd7\x00\xce\x00\xe2\xff\xd7\x00\ +\xce\x00\xe4\xff\xd7\x00\xce\x01\x0e\xff\xd7\x00\xce\x01\x10\xff\ +\xd7\x00\xce\x01\x12\xff\xd7\x00\xce\x01\x14\xff\xd7\x00\xce\x01\ +G\xff\xd7\x00\xce\x02_\xff\xd7\x00\xce\x03I\xff\xd7\x00\ +\xce\x03K\xff\xd7\x00\xce\x03M\xff\xd7\x00\xce\x03O\xff\ +\xd7\x00\xce\x03Q\xff\xd7\x00\xce\x03S\xff\xd7\x00\xce\x03\ +U\xff\xd7\x00\xce\x03W\xff\xd7\x00\xce\x03Y\xff\xd7\x00\ +\xce\x03[\xff\xd7\x00\xce\x03]\xff\xd7\x00\xce\x03_\xff\ +\xd7\x00\xd0\x00\x0f\xff\xae\x00\xd0\x00\x11\xff\xae\x00\xd0\x00\ +$\xff\xd7\x00\xd0\x007\xff\xc3\x00\xd0\x009\xff\xec\x00\ +\xd0\x00:\xff\xec\x00\xd0\x00;\xff\xd7\x00\xd0\x00<\xff\ +\xec\x00\xd0\x00=\xff\xec\x00\xd0\x00\x82\xff\xd7\x00\xd0\x00\ +\x83\xff\xd7\x00\xd0\x00\x84\xff\xd7\x00\xd0\x00\x85\xff\xd7\x00\ +\xd0\x00\x86\xff\xd7\x00\xd0\x00\x87\xff\xd7\x00\xd0\x00\x9f\xff\ +\xec\x00\xd0\x00\xc2\xff\xd7\x00\xd0\x00\xc4\xff\xd7\x00\xd0\x00\ +\xc6\xff\xd7\x00\xd0\x01$\xff\xc3\x00\xd0\x01&\xff\xc3\x00\ +\xd0\x016\xff\xec\x00\xd0\x018\xff\xec\x00\xd0\x01:\xff\ +\xec\x00\xd0\x01;\xff\xec\x00\xd0\x01=\xff\xec\x00\xd0\x01\ +?\xff\xec\x00\xd0\x01C\xff\xd7\x00\xd0\x01\xa0\xff\xec\x00\ +\xd0\x01\xfa\xff\xec\x00\xd0\x01\xfc\xff\xec\x00\xd0\x01\xfe\xff\ +\xec\x00\xd0\x02\x00\xff\xec\x00\xd0\x02\x08\xff\xae\x00\xd0\x02\ +\x0c\xff\xae\x00\xd0\x02X\xff\xd7\x00\xd0\x03\x1d\xff\xd7\x00\ +\xd0\x03\x1f\xff\xd7\x00\xd0\x03!\xff\xd7\x00\xd0\x03#\xff\ +\xd7\x00\xd0\x03%\xff\xd7\x00\xd0\x03'\xff\xd7\x00\xd0\x03\ +)\xff\xd7\x00\xd0\x03+\xff\xd7\x00\xd0\x03-\xff\xd7\x00\ +\xd0\x03/\xff\xd7\x00\xd0\x031\xff\xd7\x00\xd0\x033\xff\ +\xd7\x00\xd0\x03o\xff\xec\x00\xd0\x03q\xff\xec\x00\xd0\x03\ +s\xff\xec\x00\xd0\x03\x8f\xff\xc3\x00\xd1\x00\x05\x00R\x00\ +\xd1\x00\x0a\x00R\x00\xd1\x00\x0c\x00\x8f\x00\xd1\x00\x22\x00\ +\xa4\x00\xd1\x00@\x00\x8f\x00\xd1\x00E\x00=\x00\xd1\x00\ +K\x00=\x00\xd1\x00N\x00=\x00\xd1\x00O\x00=\x00\ +\xd1\x00`\x00\x8f\x00\xd1\x00\xe7\x00=\x00\xd1\x00\xe9\x00\ +{\x00\xd1\x02\x07\x00R\x00\xd1\x02\x0b\x00R\x00\xd2\x00\ +\x0f\xff\xae\x00\xd2\x00\x11\xff\xae\x00\xd2\x00$\xff\xd7\x00\ +\xd2\x007\xff\xc3\x00\xd2\x009\xff\xec\x00\xd2\x00:\xff\ +\xec\x00\xd2\x00;\xff\xd7\x00\xd2\x00<\xff\xec\x00\xd2\x00\ +=\xff\xec\x00\xd2\x00\x82\xff\xd7\x00\xd2\x00\x83\xff\xd7\x00\ +\xd2\x00\x84\xff\xd7\x00\xd2\x00\x85\xff\xd7\x00\xd2\x00\x86\xff\ +\xd7\x00\xd2\x00\x87\xff\xd7\x00\xd2\x00\x9f\xff\xec\x00\xd2\x00\ +\xc2\xff\xd7\x00\xd2\x00\xc4\xff\xd7\x00\xd2\x00\xc6\xff\xd7\x00\ +\xd2\x01$\xff\xc3\x00\xd2\x01&\xff\xc3\x00\xd2\x016\xff\ +\xec\x00\xd2\x018\xff\xec\x00\xd2\x01:\xff\xec\x00\xd2\x01\ +;\xff\xec\x00\xd2\x01=\xff\xec\x00\xd2\x01?\xff\xec\x00\ +\xd2\x01C\xff\xd7\x00\xd2\x01\xa0\xff\xec\x00\xd2\x01\xfa\xff\ +\xec\x00\xd2\x01\xfc\xff\xec\x00\xd2\x01\xfe\xff\xec\x00\xd2\x02\ +\x00\xff\xec\x00\xd2\x02\x08\xff\xae\x00\xd2\x02\x0c\xff\xae\x00\ +\xd2\x02X\xff\xd7\x00\xd2\x03\x1d\xff\xd7\x00\xd2\x03\x1f\xff\ +\xd7\x00\xd2\x03!\xff\xd7\x00\xd2\x03#\xff\xd7\x00\xd2\x03\ +%\xff\xd7\x00\xd2\x03'\xff\xd7\x00\xd2\x03)\xff\xd7\x00\ +\xd2\x03+\xff\xd7\x00\xd2\x03-\xff\xd7\x00\xd2\x03/\xff\ +\xd7\x00\xd2\x031\xff\xd7\x00\xd2\x033\xff\xd7\x00\xd2\x03\ +o\xff\xec\x00\xd2\x03q\xff\xec\x00\xd2\x03s\xff\xec\x00\ +\xd2\x03\x8f\xff\xc3\x00\xd4\x00-\x00{\x00\xd5\x00\x05\xff\ +\xec\x00\xd5\x00\x0a\xff\xec\x00\xd5\x00Y\xff\xd7\x00\xd5\x00\ +Z\xff\xd7\x00\xd5\x00[\xff\xd7\x00\xd5\x00\x5c\xff\xd7\x00\ +\xd5\x00]\xff\xec\x00\xd5\x00\xbf\xff\xd7\x00\xd5\x017\xff\ +\xd7\x00\xd5\x01<\xff\xec\x00\xd5\x01>\xff\xec\x00\xd5\x01\ +@\xff\xec\x00\xd5\x01\xfb\xff\xd7\x00\xd5\x01\xfd\xff\xd7\x00\ +\xd5\x02\x07\xff\xec\x00\xd5\x02\x0b\xff\xec\x00\xd5\x03p\xff\ +\xd7\x00\xd6\x00-\x00{\x00\xd7\x00\x05\xff\xec\x00\xd7\x00\ +\x0a\xff\xec\x00\xd7\x00Y\xff\xd7\x00\xd7\x00Z\xff\xd7\x00\ +\xd7\x00[\xff\xd7\x00\xd7\x00\x5c\xff\xd7\x00\xd7\x00]\xff\ +\xec\x00\xd7\x00\xbf\xff\xd7\x00\xd7\x017\xff\xd7\x00\xd7\x01\ +<\xff\xec\x00\xd7\x01>\xff\xec\x00\xd7\x01@\xff\xec\x00\ +\xd7\x01\xfb\xff\xd7\x00\xd7\x01\xfd\xff\xd7\x00\xd7\x02\x07\xff\ +\xec\x00\xd7\x02\x0b\xff\xec\x00\xd7\x03p\xff\xd7\x00\xd8\x00\ +-\x00{\x00\xd9\x00\x05\xff\xec\x00\xd9\x00\x0a\xff\xec\x00\ +\xd9\x00Y\xff\xd7\x00\xd9\x00Z\xff\xd7\x00\xd9\x00[\xff\ +\xd7\x00\xd9\x00\x5c\xff\xd7\x00\xd9\x00]\xff\xec\x00\xd9\x00\ +\xbf\xff\xd7\x00\xd9\x017\xff\xd7\x00\xd9\x01<\xff\xec\x00\ +\xd9\x01>\xff\xec\x00\xd9\x01@\xff\xec\x00\xd9\x01\xfb\xff\ +\xd7\x00\xd9\x01\xfd\xff\xd7\x00\xd9\x02\x07\xff\xec\x00\xd9\x02\ +\x0b\xff\xec\x00\xd9\x03p\xff\xd7\x00\xda\x00-\x00{\x00\ +\xdb\x00\x05\xff\xec\x00\xdb\x00\x0a\xff\xec\x00\xdb\x00Y\xff\ +\xd7\x00\xdb\x00Z\xff\xd7\x00\xdb\x00[\xff\xd7\x00\xdb\x00\ +\x5c\xff\xd7\x00\xdb\x00]\xff\xec\x00\xdb\x00\xbf\xff\xd7\x00\ +\xdb\x017\xff\xd7\x00\xdb\x01<\xff\xec\x00\xdb\x01>\xff\ +\xec\x00\xdb\x01@\xff\xec\x00\xdb\x01\xfb\xff\xd7\x00\xdb\x01\ +\xfd\xff\xd7\x00\xdb\x02\x07\xff\xec\x00\xdb\x02\x0b\xff\xec\x00\ +\xdb\x03p\xff\xd7\x00\xdc\x00-\x00{\x00\xdd\x00\x05\xff\ +\xec\x00\xdd\x00\x0a\xff\xec\x00\xdd\x00Y\xff\xd7\x00\xdd\x00\ +Z\xff\xd7\x00\xdd\x00[\xff\xd7\x00\xdd\x00\x5c\xff\xd7\x00\ +\xdd\x00]\xff\xec\x00\xdd\x00\xbf\xff\xd7\x00\xdd\x017\xff\ +\xd7\x00\xdd\x01<\xff\xec\x00\xdd\x01>\xff\xec\x00\xdd\x01\ +@\xff\xec\x00\xdd\x01\xfb\xff\xd7\x00\xdd\x01\xfd\xff\xd7\x00\ +\xdd\x02\x07\xff\xec\x00\xdd\x02\x0b\xff\xec\x00\xdd\x03p\xff\ +\xd7\x00\xe7\x00\x05\xff\xec\x00\xe7\x00\x0a\xff\xec\x00\xe7\x02\ +\x07\xff\xec\x00\xe7\x02\x0b\xff\xec\x00\xf8\x00&\xff\xd7\x00\ +\xf8\x00*\xff\xd7\x00\xf8\x002\xff\xd7\x00\xf8\x004\xff\ +\xd7\x00\xf8\x00\x89\xff\xd7\x00\xf8\x00\x94\xff\xd7\x00\xf8\x00\ +\x95\xff\xd7\x00\xf8\x00\x96\xff\xd7\x00\xf8\x00\x97\xff\xd7\x00\ +\xf8\x00\x98\xff\xd7\x00\xf8\x00\x9a\xff\xd7\x00\xf8\x00\xc8\xff\ +\xd7\x00\xf8\x00\xca\xff\xd7\x00\xf8\x00\xcc\xff\xd7\x00\xf8\x00\ +\xce\xff\xd7\x00\xf8\x00\xde\xff\xd7\x00\xf8\x00\xe0\xff\xd7\x00\ +\xf8\x00\xe2\xff\xd7\x00\xf8\x00\xe4\xff\xd7\x00\xf8\x01\x0e\xff\ +\xd7\x00\xf8\x01\x10\xff\xd7\x00\xf8\x01\x12\xff\xd7\x00\xf8\x01\ +\x14\xff\xd7\x00\xf8\x01G\xff\xd7\x00\xf8\x02_\xff\xd7\x00\ +\xf8\x03I\xff\xd7\x00\xf8\x03K\xff\xd7\x00\xf8\x03M\xff\ +\xd7\x00\xf8\x03O\xff\xd7\x00\xf8\x03Q\xff\xd7\x00\xf8\x03\ +S\xff\xd7\x00\xf8\x03U\xff\xd7\x00\xf8\x03W\xff\xd7\x00\ +\xf8\x03Y\xff\xd7\x00\xf8\x03[\xff\xd7\x00\xf8\x03]\xff\ +\xd7\x00\xf8\x03_\xff\xd7\x00\xf9\x00F\xff\xd7\x00\xf9\x00\ +G\xff\xd7\x00\xf9\x00H\xff\xd7\x00\xf9\x00R\xff\xd7\x00\ +\xf9\x00T\xff\xd7\x00\xf9\x00\xa2\xff\xd7\x00\xf9\x00\xa9\xff\ +\xd7\x00\xf9\x00\xaa\xff\xd7\x00\xf9\x00\xab\xff\xd7\x00\xf9\x00\ +\xac\xff\xd7\x00\xf9\x00\xad\xff\xd7\x00\xf9\x00\xb4\xff\xd7\x00\ +\xf9\x00\xb5\xff\xd7\x00\xf9\x00\xb6\xff\xd7\x00\xf9\x00\xb7\xff\ +\xd7\x00\xf9\x00\xb8\xff\xd7\x00\xf9\x00\xba\xff\xd7\x00\xf9\x00\ +\xc9\xff\xd7\x00\xf9\x00\xcb\xff\xd7\x00\xf9\x00\xcd\xff\xd7\x00\ +\xf9\x00\xcf\xff\xd7\x00\xf9\x00\xd1\xff\xd7\x00\xf9\x00\xd3\xff\ +\xd7\x00\xf9\x00\xd5\xff\xd7\x00\xf9\x00\xd7\xff\xd7\x00\xf9\x00\ +\xd9\xff\xd7\x00\xf9\x00\xdb\xff\xd7\x00\xf9\x00\xdd\xff\xd7\x00\ +\xf9\x01\x0f\xff\xd7\x00\xf9\x01\x11\xff\xd7\x00\xf9\x01\x13\xff\ +\xd7\x00\xf9\x01\x15\xff\xd7\x00\xf9\x01H\xff\xd7\x00\xf9\x02\ +`\xff\xd7\x00\xf9\x036\xff\xd7\x00\xf9\x038\xff\xd7\x00\ +\xf9\x03:\xff\xd7\x00\xf9\x03<\xff\xd7\x00\xf9\x03@\xff\ +\xd7\x00\xf9\x03B\xff\xd7\x00\xf9\x03D\xff\xd7\x00\xf9\x03\ +J\xff\xd7\x00\xf9\x03L\xff\xd7\x00\xf9\x03N\xff\xd7\x00\ +\xf9\x03R\xff\xd7\x00\xf9\x03T\xff\xd7\x00\xf9\x03V\xff\ +\xd7\x00\xf9\x03X\xff\xd7\x00\xf9\x03Z\xff\xd7\x00\xf9\x03\ +\x5c\xff\xd7\x00\xf9\x03^\xff\xd7\x00\xf9\x03`\xff\xd7\x00\ +\xfa\x00F\xff\xd7\x00\xfa\x00G\xff\xd7\x00\xfa\x00H\xff\ +\xd7\x00\xfa\x00R\xff\xd7\x00\xfa\x00T\xff\xd7\x00\xfa\x00\ +\xa2\xff\xd7\x00\xfa\x00\xa9\xff\xd7\x00\xfa\x00\xaa\xff\xd7\x00\ +\xfa\x00\xab\xff\xd7\x00\xfa\x00\xac\xff\xd7\x00\xfa\x00\xad\xff\ +\xd7\x00\xfa\x00\xb4\xff\xd7\x00\xfa\x00\xb5\xff\xd7\x00\xfa\x00\ +\xb6\xff\xd7\x00\xfa\x00\xb7\xff\xd7\x00\xfa\x00\xb8\xff\xd7\x00\ +\xfa\x00\xba\xff\xd7\x00\xfa\x00\xc9\xff\xd7\x00\xfa\x00\xcb\xff\ +\xd7\x00\xfa\x00\xcd\xff\xd7\x00\xfa\x00\xcf\xff\xd7\x00\xfa\x00\ +\xd1\xff\xd7\x00\xfa\x00\xd3\xff\xd7\x00\xfa\x00\xd5\xff\xd7\x00\ +\xfa\x00\xd7\xff\xd7\x00\xfa\x00\xd9\xff\xd7\x00\xfa\x00\xdb\xff\ +\xd7\x00\xfa\x00\xdd\xff\xd7\x00\xfa\x01\x0f\xff\xd7\x00\xfa\x01\ +\x11\xff\xd7\x00\xfa\x01\x13\xff\xd7\x00\xfa\x01\x15\xff\xd7\x00\ +\xfa\x01H\xff\xd7\x00\xfa\x02`\xff\xd7\x00\xfa\x036\xff\ +\xd7\x00\xfa\x038\xff\xd7\x00\xfa\x03:\xff\xd7\x00\xfa\x03\ +<\xff\xd7\x00\xfa\x03@\xff\xd7\x00\xfa\x03B\xff\xd7\x00\ +\xfa\x03D\xff\xd7\x00\xfa\x03J\xff\xd7\x00\xfa\x03L\xff\ +\xd7\x00\xfa\x03N\xff\xd7\x00\xfa\x03R\xff\xd7\x00\xfa\x03\ +T\xff\xd7\x00\xfa\x03V\xff\xd7\x00\xfa\x03X\xff\xd7\x00\ +\xfa\x03Z\xff\xd7\x00\xfa\x03\x5c\xff\xd7\x00\xfa\x03^\xff\ +\xd7\x00\xfa\x03`\xff\xd7\x00\xfb\x00\x05\xff\x5c\x00\xfb\x00\ +\x0a\xff\x5c\x00\xfb\x00&\xff\xd7\x00\xfb\x00*\xff\xd7\x00\ +\xfb\x002\xff\xd7\x00\xfb\x004\xff\xd7\x00\xfb\x007\xff\ +\xd7\x00\xfb\x008\xff\xec\x00\xfb\x009\xff\xd7\x00\xfb\x00\ +:\xff\xd7\x00\xfb\x00<\xff\xc3\x00\xfb\x00\x89\xff\xd7\x00\ +\xfb\x00\x94\xff\xd7\x00\xfb\x00\x95\xff\xd7\x00\xfb\x00\x96\xff\ +\xd7\x00\xfb\x00\x97\xff\xd7\x00\xfb\x00\x98\xff\xd7\x00\xfb\x00\ +\x9a\xff\xd7\x00\xfb\x00\x9b\xff\xec\x00\xfb\x00\x9c\xff\xec\x00\ +\xfb\x00\x9d\xff\xec\x00\xfb\x00\x9e\xff\xec\x00\xfb\x00\x9f\xff\ +\xc3\x00\xfb\x00\xc8\xff\xd7\x00\xfb\x00\xca\xff\xd7\x00\xfb\x00\ +\xcc\xff\xd7\x00\xfb\x00\xce\xff\xd7\x00\xfb\x00\xde\xff\xd7\x00\ +\xfb\x00\xe0\xff\xd7\x00\xfb\x00\xe2\xff\xd7\x00\xfb\x00\xe4\xff\ +\xd7\x00\xfb\x01\x0e\xff\xd7\x00\xfb\x01\x10\xff\xd7\x00\xfb\x01\ +\x12\xff\xd7\x00\xfb\x01\x14\xff\xd7\x00\xfb\x01$\xff\xd7\x00\ +\xfb\x01&\xff\xd7\x00\xfb\x01*\xff\xec\x00\xfb\x01,\xff\ +\xec\x00\xfb\x01.\xff\xec\x00\xfb\x010\xff\xec\x00\xfb\x01\ +2\xff\xec\x00\xfb\x014\xff\xec\x00\xfb\x016\xff\xd7\x00\ +\xfb\x018\xff\xc3\x00\xfb\x01:\xff\xc3\x00\xfb\x01G\xff\ +\xd7\x00\xfb\x01\xfa\xff\xd7\x00\xfb\x01\xfc\xff\xd7\x00\xfb\x01\ +\xfe\xff\xd7\x00\xfb\x02\x00\xff\xc3\x00\xfb\x02\x07\xff\x5c\x00\ +\xfb\x02\x0b\xff\x5c\x00\xfb\x02_\xff\xd7\x00\xfb\x02a\xff\ +\xec\x00\xfb\x03I\xff\xd7\x00\xfb\x03K\xff\xd7\x00\xfb\x03\ +M\xff\xd7\x00\xfb\x03O\xff\xd7\x00\xfb\x03Q\xff\xd7\x00\ +\xfb\x03S\xff\xd7\x00\xfb\x03U\xff\xd7\x00\xfb\x03W\xff\ +\xd7\x00\xfb\x03Y\xff\xd7\x00\xfb\x03[\xff\xd7\x00\xfb\x03\ +]\xff\xd7\x00\xfb\x03_\xff\xd7\x00\xfb\x03a\xff\xec\x00\ +\xfb\x03c\xff\xec\x00\xfb\x03e\xff\xec\x00\xfb\x03g\xff\ +\xec\x00\xfb\x03i\xff\xec\x00\xfb\x03k\xff\xec\x00\xfb\x03\ +m\xff\xec\x00\xfb\x03o\xff\xc3\x00\xfb\x03q\xff\xc3\x00\ +\xfb\x03s\xff\xc3\x00\xfb\x03\x8f\xff\xd7\x00\xfd\x00\x05\xff\ +\x5c\x00\xfd\x00\x0a\xff\x5c\x00\xfd\x00&\xff\xd7\x00\xfd\x00\ +*\xff\xd7\x00\xfd\x002\xff\xd7\x00\xfd\x004\xff\xd7\x00\ +\xfd\x007\xff\xd7\x00\xfd\x008\xff\xec\x00\xfd\x009\xff\ +\xd7\x00\xfd\x00:\xff\xd7\x00\xfd\x00<\xff\xc3\x00\xfd\x00\ +\x89\xff\xd7\x00\xfd\x00\x94\xff\xd7\x00\xfd\x00\x95\xff\xd7\x00\ +\xfd\x00\x96\xff\xd7\x00\xfd\x00\x97\xff\xd7\x00\xfd\x00\x98\xff\ +\xd7\x00\xfd\x00\x9a\xff\xd7\x00\xfd\x00\x9b\xff\xec\x00\xfd\x00\ +\x9c\xff\xec\x00\xfd\x00\x9d\xff\xec\x00\xfd\x00\x9e\xff\xec\x00\ +\xfd\x00\x9f\xff\xc3\x00\xfd\x00\xc8\xff\xd7\x00\xfd\x00\xca\xff\ +\xd7\x00\xfd\x00\xcc\xff\xd7\x00\xfd\x00\xce\xff\xd7\x00\xfd\x00\ +\xde\xff\xd7\x00\xfd\x00\xe0\xff\xd7\x00\xfd\x00\xe2\xff\xd7\x00\ +\xfd\x00\xe4\xff\xd7\x00\xfd\x01\x0e\xff\xd7\x00\xfd\x01\x10\xff\ +\xd7\x00\xfd\x01\x12\xff\xd7\x00\xfd\x01\x14\xff\xd7\x00\xfd\x01\ +$\xff\xd7\x00\xfd\x01&\xff\xd7\x00\xfd\x01*\xff\xec\x00\ +\xfd\x01,\xff\xec\x00\xfd\x01.\xff\xec\x00\xfd\x010\xff\ +\xec\x00\xfd\x012\xff\xec\x00\xfd\x014\xff\xec\x00\xfd\x01\ +6\xff\xd7\x00\xfd\x018\xff\xc3\x00\xfd\x01:\xff\xc3\x00\ +\xfd\x01G\xff\xd7\x00\xfd\x01\xfa\xff\xd7\x00\xfd\x01\xfc\xff\ +\xd7\x00\xfd\x01\xfe\xff\xd7\x00\xfd\x02\x00\xff\xc3\x00\xfd\x02\ +\x07\xff\x5c\x00\xfd\x02\x0b\xff\x5c\x00\xfd\x02_\xff\xd7\x00\ +\xfd\x02a\xff\xec\x00\xfd\x03I\xff\xd7\x00\xfd\x03K\xff\ +\xd7\x00\xfd\x03M\xff\xd7\x00\xfd\x03O\xff\xd7\x00\xfd\x03\ +Q\xff\xd7\x00\xfd\x03S\xff\xd7\x00\xfd\x03U\xff\xd7\x00\ +\xfd\x03W\xff\xd7\x00\xfd\x03Y\xff\xd7\x00\xfd\x03[\xff\ +\xd7\x00\xfd\x03]\xff\xd7\x00\xfd\x03_\xff\xd7\x00\xfd\x03\ +a\xff\xec\x00\xfd\x03c\xff\xec\x00\xfd\x03e\xff\xec\x00\ +\xfd\x03g\xff\xec\x00\xfd\x03i\xff\xec\x00\xfd\x03k\xff\ +\xec\x00\xfd\x03m\xff\xec\x00\xfd\x03o\xff\xc3\x00\xfd\x03\ +q\xff\xc3\x00\xfd\x03s\xff\xc3\x00\xfd\x03\x8f\xff\xd7\x00\ +\xff\x00\x05\xff\x5c\x00\xff\x00\x0a\xff\x5c\x00\xff\x00&\xff\ +\xd7\x00\xff\x00*\xff\xd7\x00\xff\x002\xff\xd7\x00\xff\x00\ +4\xff\xd7\x00\xff\x007\xff\xd7\x00\xff\x008\xff\xec\x00\ +\xff\x009\xff\xd7\x00\xff\x00:\xff\xd7\x00\xff\x00<\xff\ +\xc3\x00\xff\x00\x89\xff\xd7\x00\xff\x00\x94\xff\xd7\x00\xff\x00\ +\x95\xff\xd7\x00\xff\x00\x96\xff\xd7\x00\xff\x00\x97\xff\xd7\x00\ +\xff\x00\x98\xff\xd7\x00\xff\x00\x9a\xff\xd7\x00\xff\x00\x9b\xff\ +\xec\x00\xff\x00\x9c\xff\xec\x00\xff\x00\x9d\xff\xec\x00\xff\x00\ +\x9e\xff\xec\x00\xff\x00\x9f\xff\xc3\x00\xff\x00\xc8\xff\xd7\x00\ +\xff\x00\xca\xff\xd7\x00\xff\x00\xcc\xff\xd7\x00\xff\x00\xce\xff\ +\xd7\x00\xff\x00\xde\xff\xd7\x00\xff\x00\xe0\xff\xd7\x00\xff\x00\ +\xe2\xff\xd7\x00\xff\x00\xe4\xff\xd7\x00\xff\x01\x0e\xff\xd7\x00\ +\xff\x01\x10\xff\xd7\x00\xff\x01\x12\xff\xd7\x00\xff\x01\x14\xff\ +\xd7\x00\xff\x01$\xff\xd7\x00\xff\x01&\xff\xd7\x00\xff\x01\ +*\xff\xec\x00\xff\x01,\xff\xec\x00\xff\x01.\xff\xec\x00\ +\xff\x010\xff\xec\x00\xff\x012\xff\xec\x00\xff\x014\xff\ +\xec\x00\xff\x016\xff\xd7\x00\xff\x018\xff\xc3\x00\xff\x01\ +:\xff\xc3\x00\xff\x01G\xff\xd7\x00\xff\x01\xfa\xff\xd7\x00\ +\xff\x01\xfc\xff\xd7\x00\xff\x01\xfe\xff\xd7\x00\xff\x02\x00\xff\ +\xc3\x00\xff\x02\x07\xff\x5c\x00\xff\x02\x0b\xff\x5c\x00\xff\x02\ +_\xff\xd7\x00\xff\x02a\xff\xec\x00\xff\x03I\xff\xd7\x00\ +\xff\x03K\xff\xd7\x00\xff\x03M\xff\xd7\x00\xff\x03O\xff\ +\xd7\x00\xff\x03Q\xff\xd7\x00\xff\x03S\xff\xd7\x00\xff\x03\ +U\xff\xd7\x00\xff\x03W\xff\xd7\x00\xff\x03Y\xff\xd7\x00\ +\xff\x03[\xff\xd7\x00\xff\x03]\xff\xd7\x00\xff\x03_\xff\ +\xd7\x00\xff\x03a\xff\xec\x00\xff\x03c\xff\xec\x00\xff\x03\ +e\xff\xec\x00\xff\x03g\xff\xec\x00\xff\x03i\xff\xec\x00\ +\xff\x03k\xff\xec\x00\xff\x03m\xff\xec\x00\xff\x03o\xff\ +\xc3\x00\xff\x03q\xff\xc3\x00\xff\x03s\xff\xc3\x00\xff\x03\ +\x8f\xff\xd7\x01\x00\x00\x05\x00R\x01\x00\x00\x0a\x00R\x01\ +\x00\x00\x0c\x00\x8f\x01\x00\x00\x22\x00\x8f\x01\x00\x00@\x00\ +\x8f\x01\x00\x00E\x00=\x01\x00\x00K\x00=\x01\x00\x00\ +N\x00=\x01\x00\x00O\x00=\x01\x00\x00`\x00\x8f\x01\ +\x00\x00\xe7\x00=\x01\x00\x00\xe9\x00\x8f\x01\x00\x02\x07\x00\ +R\x01\x00\x02\x0b\x00R\x01\x01\x00\x05\xff\x5c\x01\x01\x00\ +\x0a\xff\x5c\x01\x01\x00&\xff\xd7\x01\x01\x00*\xff\xd7\x01\ +\x01\x002\xff\xd7\x01\x01\x004\xff\xd7\x01\x01\x007\xff\ +\xd7\x01\x01\x008\xff\xec\x01\x01\x009\xff\xd7\x01\x01\x00\ +:\xff\xd7\x01\x01\x00<\xff\xc3\x01\x01\x00\x89\xff\xd7\x01\ +\x01\x00\x94\xff\xd7\x01\x01\x00\x95\xff\xd7\x01\x01\x00\x96\xff\ +\xd7\x01\x01\x00\x97\xff\xd7\x01\x01\x00\x98\xff\xd7\x01\x01\x00\ +\x9a\xff\xd7\x01\x01\x00\x9b\xff\xec\x01\x01\x00\x9c\xff\xec\x01\ +\x01\x00\x9d\xff\xec\x01\x01\x00\x9e\xff\xec\x01\x01\x00\x9f\xff\ +\xc3\x01\x01\x00\xc8\xff\xd7\x01\x01\x00\xca\xff\xd7\x01\x01\x00\ +\xcc\xff\xd7\x01\x01\x00\xce\xff\xd7\x01\x01\x00\xde\xff\xd7\x01\ +\x01\x00\xe0\xff\xd7\x01\x01\x00\xe2\xff\xd7\x01\x01\x00\xe4\xff\ +\xd7\x01\x01\x01\x0e\xff\xd7\x01\x01\x01\x10\xff\xd7\x01\x01\x01\ +\x12\xff\xd7\x01\x01\x01\x14\xff\xd7\x01\x01\x01$\xff\xd7\x01\ +\x01\x01&\xff\xd7\x01\x01\x01*\xff\xec\x01\x01\x01,\xff\ +\xec\x01\x01\x01.\xff\xec\x01\x01\x010\xff\xec\x01\x01\x01\ +2\xff\xec\x01\x01\x014\xff\xec\x01\x01\x016\xff\xd7\x01\ +\x01\x018\xff\xc3\x01\x01\x01:\xff\xc3\x01\x01\x01G\xff\ +\xd7\x01\x01\x01\xfa\xff\xd7\x01\x01\x01\xfc\xff\xd7\x01\x01\x01\ +\xfe\xff\xd7\x01\x01\x02\x00\xff\xc3\x01\x01\x02\x07\xff\x5c\x01\ +\x01\x02\x0b\xff\x5c\x01\x01\x02_\xff\xd7\x01\x01\x02a\xff\ +\xec\x01\x01\x03I\xff\xd7\x01\x01\x03K\xff\xd7\x01\x01\x03\ +M\xff\xd7\x01\x01\x03O\xff\xd7\x01\x01\x03Q\xff\xd7\x01\ +\x01\x03S\xff\xd7\x01\x01\x03U\xff\xd7\x01\x01\x03W\xff\ +\xd7\x01\x01\x03Y\xff\xd7\x01\x01\x03[\xff\xd7\x01\x01\x03\ +]\xff\xd7\x01\x01\x03_\xff\xd7\x01\x01\x03a\xff\xec\x01\ +\x01\x03c\xff\xec\x01\x01\x03e\xff\xec\x01\x01\x03g\xff\ +\xec\x01\x01\x03i\xff\xec\x01\x01\x03k\xff\xec\x01\x01\x03\ +m\xff\xec\x01\x01\x03o\xff\xc3\x01\x01\x03q\xff\xc3\x01\ +\x01\x03s\xff\xc3\x01\x01\x03\x8f\xff\xd7\x01\x03\x00\x05\xff\ +\x5c\x01\x03\x00\x0a\xff\x5c\x01\x03\x00&\xff\xd7\x01\x03\x00\ +*\xff\xd7\x01\x03\x002\xff\xd7\x01\x03\x004\xff\xd7\x01\ +\x03\x007\xff\xd7\x01\x03\x008\xff\xec\x01\x03\x009\xff\ +\xd7\x01\x03\x00:\xff\xd7\x01\x03\x00<\xff\xc3\x01\x03\x00\ +\x89\xff\xd7\x01\x03\x00\x94\xff\xd7\x01\x03\x00\x95\xff\xd7\x01\ +\x03\x00\x96\xff\xd7\x01\x03\x00\x97\xff\xd7\x01\x03\x00\x98\xff\ +\xd7\x01\x03\x00\x9a\xff\xd7\x01\x03\x00\x9b\xff\xec\x01\x03\x00\ +\x9c\xff\xec\x01\x03\x00\x9d\xff\xec\x01\x03\x00\x9e\xff\xec\x01\ +\x03\x00\x9f\xff\xc3\x01\x03\x00\xc8\xff\xd7\x01\x03\x00\xca\xff\ +\xd7\x01\x03\x00\xcc\xff\xd7\x01\x03\x00\xce\xff\xd7\x01\x03\x00\ +\xde\xff\xd7\x01\x03\x00\xe0\xff\xd7\x01\x03\x00\xe2\xff\xd7\x01\ +\x03\x00\xe4\xff\xd7\x01\x03\x01\x0e\xff\xd7\x01\x03\x01\x10\xff\ +\xd7\x01\x03\x01\x12\xff\xd7\x01\x03\x01\x14\xff\xd7\x01\x03\x01\ +$\xff\xd7\x01\x03\x01&\xff\xd7\x01\x03\x01*\xff\xec\x01\ +\x03\x01,\xff\xec\x01\x03\x01.\xff\xec\x01\x03\x010\xff\ +\xec\x01\x03\x012\xff\xec\x01\x03\x014\xff\xec\x01\x03\x01\ +6\xff\xd7\x01\x03\x018\xff\xc3\x01\x03\x01:\xff\xc3\x01\ +\x03\x01G\xff\xd7\x01\x03\x01\xfa\xff\xd7\x01\x03\x01\xfc\xff\ +\xd7\x01\x03\x01\xfe\xff\xd7\x01\x03\x02\x00\xff\xc3\x01\x03\x02\ +\x07\xff\x5c\x01\x03\x02\x0b\xff\x5c\x01\x03\x02_\xff\xd7\x01\ +\x03\x02a\xff\xec\x01\x03\x03I\xff\xd7\x01\x03\x03K\xff\ +\xd7\x01\x03\x03M\xff\xd7\x01\x03\x03O\xff\xd7\x01\x03\x03\ +Q\xff\xd7\x01\x03\x03S\xff\xd7\x01\x03\x03U\xff\xd7\x01\ +\x03\x03W\xff\xd7\x01\x03\x03Y\xff\xd7\x01\x03\x03[\xff\ +\xd7\x01\x03\x03]\xff\xd7\x01\x03\x03_\xff\xd7\x01\x03\x03\ +a\xff\xec\x01\x03\x03c\xff\xec\x01\x03\x03e\xff\xec\x01\ +\x03\x03g\xff\xec\x01\x03\x03i\xff\xec\x01\x03\x03k\xff\ +\xec\x01\x03\x03m\xff\xec\x01\x03\x03o\xff\xc3\x01\x03\x03\ +q\xff\xc3\x01\x03\x03s\xff\xc3\x01\x03\x03\x8f\xff\xd7\x01\ +\x08\x00\x05\xff\xec\x01\x08\x00\x0a\xff\xec\x01\x08\x02\x07\xff\ +\xec\x01\x08\x02\x0b\xff\xec\x01\x0e\x00\x0f\xff\xae\x01\x0e\x00\ +\x11\xff\xae\x01\x0e\x00$\xff\xd7\x01\x0e\x007\xff\xc3\x01\ +\x0e\x009\xff\xec\x01\x0e\x00:\xff\xec\x01\x0e\x00;\xff\ +\xd7\x01\x0e\x00<\xff\xec\x01\x0e\x00=\xff\xec\x01\x0e\x00\ +\x82\xff\xd7\x01\x0e\x00\x83\xff\xd7\x01\x0e\x00\x84\xff\xd7\x01\ +\x0e\x00\x85\xff\xd7\x01\x0e\x00\x86\xff\xd7\x01\x0e\x00\x87\xff\ +\xd7\x01\x0e\x00\x9f\xff\xec\x01\x0e\x00\xc2\xff\xd7\x01\x0e\x00\ +\xc4\xff\xd7\x01\x0e\x00\xc6\xff\xd7\x01\x0e\x01$\xff\xc3\x01\ +\x0e\x01&\xff\xc3\x01\x0e\x016\xff\xec\x01\x0e\x018\xff\ +\xec\x01\x0e\x01:\xff\xec\x01\x0e\x01;\xff\xec\x01\x0e\x01\ +=\xff\xec\x01\x0e\x01?\xff\xec\x01\x0e\x01C\xff\xd7\x01\ +\x0e\x01\xa0\xff\xec\x01\x0e\x01\xfa\xff\xec\x01\x0e\x01\xfc\xff\ +\xec\x01\x0e\x01\xfe\xff\xec\x01\x0e\x02\x00\xff\xec\x01\x0e\x02\ +\x08\xff\xae\x01\x0e\x02\x0c\xff\xae\x01\x0e\x02X\xff\xd7\x01\ +\x0e\x03\x1d\xff\xd7\x01\x0e\x03\x1f\xff\xd7\x01\x0e\x03!\xff\ +\xd7\x01\x0e\x03#\xff\xd7\x01\x0e\x03%\xff\xd7\x01\x0e\x03\ +'\xff\xd7\x01\x0e\x03)\xff\xd7\x01\x0e\x03+\xff\xd7\x01\ +\x0e\x03-\xff\xd7\x01\x0e\x03/\xff\xd7\x01\x0e\x031\xff\ +\xd7\x01\x0e\x033\xff\xd7\x01\x0e\x03o\xff\xec\x01\x0e\x03\ +q\xff\xec\x01\x0e\x03s\xff\xec\x01\x0e\x03\x8f\xff\xc3\x01\ +\x10\x00\x0f\xff\xae\x01\x10\x00\x11\xff\xae\x01\x10\x00$\xff\ +\xd7\x01\x10\x007\xff\xc3\x01\x10\x009\xff\xec\x01\x10\x00\ +:\xff\xec\x01\x10\x00;\xff\xd7\x01\x10\x00<\xff\xec\x01\ +\x10\x00=\xff\xec\x01\x10\x00\x82\xff\xd7\x01\x10\x00\x83\xff\ +\xd7\x01\x10\x00\x84\xff\xd7\x01\x10\x00\x85\xff\xd7\x01\x10\x00\ +\x86\xff\xd7\x01\x10\x00\x87\xff\xd7\x01\x10\x00\x9f\xff\xec\x01\ +\x10\x00\xc2\xff\xd7\x01\x10\x00\xc4\xff\xd7\x01\x10\x00\xc6\xff\ +\xd7\x01\x10\x01$\xff\xc3\x01\x10\x01&\xff\xc3\x01\x10\x01\ +6\xff\xec\x01\x10\x018\xff\xec\x01\x10\x01:\xff\xec\x01\ +\x10\x01;\xff\xec\x01\x10\x01=\xff\xec\x01\x10\x01?\xff\ +\xec\x01\x10\x01C\xff\xd7\x01\x10\x01\xa0\xff\xec\x01\x10\x01\ +\xfa\xff\xec\x01\x10\x01\xfc\xff\xec\x01\x10\x01\xfe\xff\xec\x01\ +\x10\x02\x00\xff\xec\x01\x10\x02\x08\xff\xae\x01\x10\x02\x0c\xff\ +\xae\x01\x10\x02X\xff\xd7\x01\x10\x03\x1d\xff\xd7\x01\x10\x03\ +\x1f\xff\xd7\x01\x10\x03!\xff\xd7\x01\x10\x03#\xff\xd7\x01\ +\x10\x03%\xff\xd7\x01\x10\x03'\xff\xd7\x01\x10\x03)\xff\ +\xd7\x01\x10\x03+\xff\xd7\x01\x10\x03-\xff\xd7\x01\x10\x03\ +/\xff\xd7\x01\x10\x031\xff\xd7\x01\x10\x033\xff\xd7\x01\ +\x10\x03o\xff\xec\x01\x10\x03q\xff\xec\x01\x10\x03s\xff\ +\xec\x01\x10\x03\x8f\xff\xc3\x01\x12\x00\x0f\xff\xae\x01\x12\x00\ +\x11\xff\xae\x01\x12\x00$\xff\xd7\x01\x12\x007\xff\xc3\x01\ +\x12\x009\xff\xec\x01\x12\x00:\xff\xec\x01\x12\x00;\xff\ +\xd7\x01\x12\x00<\xff\xec\x01\x12\x00=\xff\xec\x01\x12\x00\ +\x82\xff\xd7\x01\x12\x00\x83\xff\xd7\x01\x12\x00\x84\xff\xd7\x01\ +\x12\x00\x85\xff\xd7\x01\x12\x00\x86\xff\xd7\x01\x12\x00\x87\xff\ +\xd7\x01\x12\x00\x9f\xff\xec\x01\x12\x00\xc2\xff\xd7\x01\x12\x00\ +\xc4\xff\xd7\x01\x12\x00\xc6\xff\xd7\x01\x12\x01$\xff\xc3\x01\ +\x12\x01&\xff\xc3\x01\x12\x016\xff\xec\x01\x12\x018\xff\ +\xec\x01\x12\x01:\xff\xec\x01\x12\x01;\xff\xec\x01\x12\x01\ +=\xff\xec\x01\x12\x01?\xff\xec\x01\x12\x01C\xff\xd7\x01\ +\x12\x01\xa0\xff\xec\x01\x12\x01\xfa\xff\xec\x01\x12\x01\xfc\xff\ +\xec\x01\x12\x01\xfe\xff\xec\x01\x12\x02\x00\xff\xec\x01\x12\x02\ +\x08\xff\xae\x01\x12\x02\x0c\xff\xae\x01\x12\x02X\xff\xd7\x01\ +\x12\x03\x1d\xff\xd7\x01\x12\x03\x1f\xff\xd7\x01\x12\x03!\xff\ +\xd7\x01\x12\x03#\xff\xd7\x01\x12\x03%\xff\xd7\x01\x12\x03\ +'\xff\xd7\x01\x12\x03)\xff\xd7\x01\x12\x03+\xff\xd7\x01\ +\x12\x03-\xff\xd7\x01\x12\x03/\xff\xd7\x01\x12\x031\xff\ +\xd7\x01\x12\x033\xff\xd7\x01\x12\x03o\xff\xec\x01\x12\x03\ +q\xff\xec\x01\x12\x03s\xff\xec\x01\x12\x03\x8f\xff\xc3\x01\ +\x14\x00-\x00{\x01\x17\x00\x05\x00R\x01\x17\x00\x0a\x00\ +R\x01\x17\x00D\xff\xd7\x01\x17\x00F\xff\xd7\x01\x17\x00\ +G\xff\xd7\x01\x17\x00H\xff\xd7\x01\x17\x00J\xff\xec\x01\ +\x17\x00R\xff\xd7\x01\x17\x00T\xff\xd7\x01\x17\x00\xa2\xff\ +\xd7\x01\x17\x00\xa3\xff\xd7\x01\x17\x00\xa4\xff\xd7\x01\x17\x00\ +\xa5\xff\xd7\x01\x17\x00\xa6\xff\xd7\x01\x17\x00\xa7\xff\xd7\x01\ +\x17\x00\xa8\xff\xd7\x01\x17\x00\xa9\xff\xd7\x01\x17\x00\xaa\xff\ +\xd7\x01\x17\x00\xab\xff\xd7\x01\x17\x00\xac\xff\xd7\x01\x17\x00\ +\xad\xff\xd7\x01\x17\x00\xb4\xff\xd7\x01\x17\x00\xb5\xff\xd7\x01\ +\x17\x00\xb6\xff\xd7\x01\x17\x00\xb7\xff\xd7\x01\x17\x00\xb8\xff\ +\xd7\x01\x17\x00\xba\xff\xd7\x01\x17\x00\xc3\xff\xd7\x01\x17\x00\ +\xc5\xff\xd7\x01\x17\x00\xc7\xff\xd7\x01\x17\x00\xc9\xff\xd7\x01\ +\x17\x00\xcb\xff\xd7\x01\x17\x00\xcd\xff\xd7\x01\x17\x00\xcf\xff\ +\xd7\x01\x17\x00\xd1\xff\xd7\x01\x17\x00\xd3\xff\xd7\x01\x17\x00\ +\xd5\xff\xd7\x01\x17\x00\xd7\xff\xd7\x01\x17\x00\xd9\xff\xd7\x01\ +\x17\x00\xdb\xff\xd7\x01\x17\x00\xdd\xff\xd7\x01\x17\x00\xdf\xff\ +\xec\x01\x17\x00\xe1\xff\xec\x01\x17\x00\xe3\xff\xec\x01\x17\x00\ +\xe5\xff\xec\x01\x17\x01\x0f\xff\xd7\x01\x17\x01\x11\xff\xd7\x01\ +\x17\x01\x13\xff\xd7\x01\x17\x01\x15\xff\xd7\x01\x17\x01D\xff\ +\xd7\x01\x17\x01F\xff\xd7\x01\x17\x01H\xff\xd7\x01\x17\x02\ +\x07\x00R\x01\x17\x02\x0b\x00R\x01\x17\x02Y\xff\xd7\x01\ +\x17\x02`\xff\xd7\x01\x17\x03\x1e\xff\xd7\x01\x17\x03 \xff\ +\xd7\x01\x17\x03\x22\xff\xd7\x01\x17\x03&\xff\xd7\x01\x17\x03\ +(\xff\xd7\x01\x17\x03*\xff\xd7\x01\x17\x03,\xff\xd7\x01\ +\x17\x03.\xff\xd7\x01\x17\x030\xff\xd7\x01\x17\x032\xff\ +\xd7\x01\x17\x034\xff\xd7\x01\x17\x036\xff\xd7\x01\x17\x03\ +8\xff\xd7\x01\x17\x03:\xff\xd7\x01\x17\x03<\xff\xd7\x01\ +\x17\x03@\xff\xd7\x01\x17\x03B\xff\xd7\x01\x17\x03D\xff\ +\xd7\x01\x17\x03J\xff\xd7\x01\x17\x03L\xff\xd7\x01\x17\x03\ +N\xff\xd7\x01\x17\x03R\xff\xd7\x01\x17\x03T\xff\xd7\x01\ +\x17\x03V\xff\xd7\x01\x17\x03X\xff\xd7\x01\x17\x03Z\xff\ +\xd7\x01\x17\x03\x5c\xff\xd7\x01\x17\x03^\xff\xd7\x01\x17\x03\ +`\xff\xd7\x01\x19\x00\x05\x00R\x01\x19\x00\x0a\x00R\x01\ +\x19\x00D\xff\xd7\x01\x19\x00F\xff\xd7\x01\x19\x00G\xff\ +\xd7\x01\x19\x00H\xff\xd7\x01\x19\x00J\xff\xec\x01\x19\x00\ +R\xff\xd7\x01\x19\x00T\xff\xd7\x01\x19\x00\xa2\xff\xd7\x01\ +\x19\x00\xa3\xff\xd7\x01\x19\x00\xa4\xff\xd7\x01\x19\x00\xa5\xff\ +\xd7\x01\x19\x00\xa6\xff\xd7\x01\x19\x00\xa7\xff\xd7\x01\x19\x00\ +\xa8\xff\xd7\x01\x19\x00\xa9\xff\xd7\x01\x19\x00\xaa\xff\xd7\x01\ +\x19\x00\xab\xff\xd7\x01\x19\x00\xac\xff\xd7\x01\x19\x00\xad\xff\ +\xd7\x01\x19\x00\xb4\xff\xd7\x01\x19\x00\xb5\xff\xd7\x01\x19\x00\ +\xb6\xff\xd7\x01\x19\x00\xb7\xff\xd7\x01\x19\x00\xb8\xff\xd7\x01\ +\x19\x00\xba\xff\xd7\x01\x19\x00\xc3\xff\xd7\x01\x19\x00\xc5\xff\ +\xd7\x01\x19\x00\xc7\xff\xd7\x01\x19\x00\xc9\xff\xd7\x01\x19\x00\ +\xcb\xff\xd7\x01\x19\x00\xcd\xff\xd7\x01\x19\x00\xcf\xff\xd7\x01\ +\x19\x00\xd1\xff\xd7\x01\x19\x00\xd3\xff\xd7\x01\x19\x00\xd5\xff\ +\xd7\x01\x19\x00\xd7\xff\xd7\x01\x19\x00\xd9\xff\xd7\x01\x19\x00\ +\xdb\xff\xd7\x01\x19\x00\xdd\xff\xd7\x01\x19\x00\xdf\xff\xec\x01\ +\x19\x00\xe1\xff\xec\x01\x19\x00\xe3\xff\xec\x01\x19\x00\xe5\xff\ +\xec\x01\x19\x01\x0f\xff\xd7\x01\x19\x01\x11\xff\xd7\x01\x19\x01\ +\x13\xff\xd7\x01\x19\x01\x15\xff\xd7\x01\x19\x01D\xff\xd7\x01\ +\x19\x01F\xff\xd7\x01\x19\x01H\xff\xd7\x01\x19\x02\x07\x00\ +R\x01\x19\x02\x0b\x00R\x01\x19\x02Y\xff\xd7\x01\x19\x02\ +`\xff\xd7\x01\x19\x03\x1e\xff\xd7\x01\x19\x03 \xff\xd7\x01\ +\x19\x03\x22\xff\xd7\x01\x19\x03&\xff\xd7\x01\x19\x03(\xff\ +\xd7\x01\x19\x03*\xff\xd7\x01\x19\x03,\xff\xd7\x01\x19\x03\ +.\xff\xd7\x01\x19\x030\xff\xd7\x01\x19\x032\xff\xd7\x01\ +\x19\x034\xff\xd7\x01\x19\x036\xff\xd7\x01\x19\x038\xff\ +\xd7\x01\x19\x03:\xff\xd7\x01\x19\x03<\xff\xd7\x01\x19\x03\ +@\xff\xd7\x01\x19\x03B\xff\xd7\x01\x19\x03D\xff\xd7\x01\ +\x19\x03J\xff\xd7\x01\x19\x03L\xff\xd7\x01\x19\x03N\xff\ +\xd7\x01\x19\x03R\xff\xd7\x01\x19\x03T\xff\xd7\x01\x19\x03\ +V\xff\xd7\x01\x19\x03X\xff\xd7\x01\x19\x03Z\xff\xd7\x01\ +\x19\x03\x5c\xff\xd7\x01\x19\x03^\xff\xd7\x01\x19\x03`\xff\ +\xd7\x01\x1b\x00\x05\x00R\x01\x1b\x00\x0a\x00R\x01\x1b\x00\ +D\xff\xd7\x01\x1b\x00F\xff\xd7\x01\x1b\x00G\xff\xd7\x01\ +\x1b\x00H\xff\xd7\x01\x1b\x00J\xff\xec\x01\x1b\x00R\xff\ +\xd7\x01\x1b\x00T\xff\xd7\x01\x1b\x00\xa2\xff\xd7\x01\x1b\x00\ +\xa3\xff\xd7\x01\x1b\x00\xa4\xff\xd7\x01\x1b\x00\xa5\xff\xd7\x01\ +\x1b\x00\xa6\xff\xd7\x01\x1b\x00\xa7\xff\xd7\x01\x1b\x00\xa8\xff\ +\xd7\x01\x1b\x00\xa9\xff\xd7\x01\x1b\x00\xaa\xff\xd7\x01\x1b\x00\ +\xab\xff\xd7\x01\x1b\x00\xac\xff\xd7\x01\x1b\x00\xad\xff\xd7\x01\ +\x1b\x00\xb4\xff\xd7\x01\x1b\x00\xb5\xff\xd7\x01\x1b\x00\xb6\xff\ +\xd7\x01\x1b\x00\xb7\xff\xd7\x01\x1b\x00\xb8\xff\xd7\x01\x1b\x00\ +\xba\xff\xd7\x01\x1b\x00\xc3\xff\xd7\x01\x1b\x00\xc5\xff\xd7\x01\ +\x1b\x00\xc7\xff\xd7\x01\x1b\x00\xc9\xff\xd7\x01\x1b\x00\xcb\xff\ +\xd7\x01\x1b\x00\xcd\xff\xd7\x01\x1b\x00\xcf\xff\xd7\x01\x1b\x00\ +\xd1\xff\xd7\x01\x1b\x00\xd3\xff\xd7\x01\x1b\x00\xd5\xff\xd7\x01\ +\x1b\x00\xd7\xff\xd7\x01\x1b\x00\xd9\xff\xd7\x01\x1b\x00\xdb\xff\ +\xd7\x01\x1b\x00\xdd\xff\xd7\x01\x1b\x00\xdf\xff\xec\x01\x1b\x00\ +\xe1\xff\xec\x01\x1b\x00\xe3\xff\xec\x01\x1b\x00\xe5\xff\xec\x01\ +\x1b\x01\x0f\xff\xd7\x01\x1b\x01\x11\xff\xd7\x01\x1b\x01\x13\xff\ +\xd7\x01\x1b\x01\x15\xff\xd7\x01\x1b\x01D\xff\xd7\x01\x1b\x01\ +F\xff\xd7\x01\x1b\x01H\xff\xd7\x01\x1b\x02\x07\x00R\x01\ +\x1b\x02\x0b\x00R\x01\x1b\x02Y\xff\xd7\x01\x1b\x02`\xff\ +\xd7\x01\x1b\x03\x1e\xff\xd7\x01\x1b\x03 \xff\xd7\x01\x1b\x03\ +\x22\xff\xd7\x01\x1b\x03&\xff\xd7\x01\x1b\x03(\xff\xd7\x01\ +\x1b\x03*\xff\xd7\x01\x1b\x03,\xff\xd7\x01\x1b\x03.\xff\ +\xd7\x01\x1b\x030\xff\xd7\x01\x1b\x032\xff\xd7\x01\x1b\x03\ +4\xff\xd7\x01\x1b\x036\xff\xd7\x01\x1b\x038\xff\xd7\x01\ +\x1b\x03:\xff\xd7\x01\x1b\x03<\xff\xd7\x01\x1b\x03@\xff\ +\xd7\x01\x1b\x03B\xff\xd7\x01\x1b\x03D\xff\xd7\x01\x1b\x03\ +J\xff\xd7\x01\x1b\x03L\xff\xd7\x01\x1b\x03N\xff\xd7\x01\ +\x1b\x03R\xff\xd7\x01\x1b\x03T\xff\xd7\x01\x1b\x03V\xff\ +\xd7\x01\x1b\x03X\xff\xd7\x01\x1b\x03Z\xff\xd7\x01\x1b\x03\ +\x5c\xff\xd7\x01\x1b\x03^\xff\xd7\x01\x1b\x03`\xff\xd7\x01\ +$\x00\x0f\xff\x85\x01$\x00\x10\xff\xae\x01$\x00\x11\xff\ +\x85\x01$\x00\x22\x00)\x01$\x00$\xffq\x01$\x00\ +&\xff\xd7\x01$\x00*\xff\xd7\x01$\x002\xff\xd7\x01\ +$\x004\xff\xd7\x01$\x007\x00)\x01$\x00D\xff\ +\x5c\x01$\x00F\xffq\x01$\x00G\xffq\x01$\x00\ +H\xffq\x01$\x00J\xffq\x01$\x00P\xff\x9a\x01\ +$\x00Q\xff\x9a\x01$\x00R\xffq\x01$\x00S\xff\ +\x9a\x01$\x00T\xffq\x01$\x00U\xff\x9a\x01$\x00\ +V\xff\x85\x01$\x00X\xff\x9a\x01$\x00Y\xff\xd7\x01\ +$\x00Z\xff\xd7\x01$\x00[\xff\xd7\x01$\x00\x5c\xff\ +\xd7\x01$\x00]\xff\xae\x01$\x00\x82\xffq\x01$\x00\ +\x83\xffq\x01$\x00\x84\xffq\x01$\x00\x85\xffq\x01\ +$\x00\x86\xffq\x01$\x00\x87\xffq\x01$\x00\x89\xff\ +\xd7\x01$\x00\x94\xff\xd7\x01$\x00\x95\xff\xd7\x01$\x00\ +\x96\xff\xd7\x01$\x00\x97\xff\xd7\x01$\x00\x98\xff\xd7\x01\ +$\x00\x9a\xff\xd7\x01$\x00\xa2\xffq\x01$\x00\xa3\xff\ +\x5c\x01$\x00\xa4\xff\x5c\x01$\x00\xa5\xff\x5c\x01$\x00\ +\xa6\xff\x5c\x01$\x00\xa7\xff\x5c\x01$\x00\xa8\xff\x5c\x01\ +$\x00\xa9\xffq\x01$\x00\xaa\xffq\x01$\x00\xab\xff\ +q\x01$\x00\xac\xffq\x01$\x00\xad\xffq\x01$\x00\ +\xb4\xffq\x01$\x00\xb5\xffq\x01$\x00\xb6\xffq\x01\ +$\x00\xb7\xffq\x01$\x00\xb8\xffq\x01$\x00\xba\xff\ +q\x01$\x00\xbb\xff\x9a\x01$\x00\xbc\xff\x9a\x01$\x00\ +\xbd\xff\x9a\x01$\x00\xbe\xff\x9a\x01$\x00\xbf\xff\xd7\x01\ +$\x00\xc2\xffq\x01$\x00\xc3\xff\x5c\x01$\x00\xc4\xff\ +q\x01$\x00\xc5\xff\x5c\x01$\x00\xc6\xffq\x01$\x00\ +\xc7\xff\x5c\x01$\x00\xc8\xff\xd7\x01$\x00\xc9\xffq\x01\ +$\x00\xca\xff\xd7\x01$\x00\xcb\xffq\x01$\x00\xcc\xff\ +\xd7\x01$\x00\xcd\xffq\x01$\x00\xce\xff\xd7\x01$\x00\ +\xcf\xffq\x01$\x00\xd1\xffq\x01$\x00\xd3\xffq\x01\ +$\x00\xd5\xffq\x01$\x00\xd7\xffq\x01$\x00\xd9\xff\ +q\x01$\x00\xdb\xffq\x01$\x00\xdd\xffq\x01$\x00\ +\xde\xff\xd7\x01$\x00\xdf\xffq\x01$\x00\xe0\xff\xd7\x01\ +$\x00\xe1\xffq\x01$\x00\xe2\xff\xd7\x01$\x00\xe3\xff\ +q\x01$\x00\xe4\xff\xd7\x01$\x00\xe5\xffq\x01$\x00\ +\xfa\xff\x9a\x01$\x01\x06\xff\x9a\x01$\x01\x08\xff\x9a\x01\ +$\x01\x0d\xff\x9a\x01$\x01\x0e\xff\xd7\x01$\x01\x0f\xff\ +q\x01$\x01\x10\xff\xd7\x01$\x01\x11\xffq\x01$\x01\ +\x12\xff\xd7\x01$\x01\x13\xffq\x01$\x01\x14\xff\xd7\x01\ +$\x01\x15\xffq\x01$\x01\x17\xff\x9a\x01$\x01\x19\xff\ +\x9a\x01$\x01\x1d\xff\x85\x01$\x01!\xff\x85\x01$\x01\ +$\x00)\x01$\x01&\x00)\x01$\x01+\xff\x9a\x01\ +$\x01-\xff\x9a\x01$\x01/\xff\x9a\x01$\x011\xff\ +\x9a\x01$\x013\xff\x9a\x01$\x015\xff\x9a\x01$\x01\ +7\xff\xd7\x01$\x01<\xff\xae\x01$\x01>\xff\xae\x01\ +$\x01@\xff\xae\x01$\x01C\xffq\x01$\x01D\xff\ +\x5c\x01$\x01F\xff\x5c\x01$\x01G\xff\xd7\x01$\x01\ +H\xffq\x01$\x01J\xff\x85\x01$\x01\xfb\xff\xd7\x01\ +$\x01\xfd\xff\xd7\x01$\x02\x02\xff\xae\x01$\x02\x03\xff\ +\xae\x01$\x02\x04\xff\xae\x01$\x02\x08\xff\x85\x01$\x02\ +\x0c\xff\x85\x01$\x02W\xff\x9a\x01$\x02X\xffq\x01\ +$\x02Y\xff\x5c\x01$\x02_\xff\xd7\x01$\x02`\xff\ +q\x01$\x02b\xff\x9a\x01$\x03\x1d\xffq\x01$\x03\ +\x1e\xff\x5c\x01$\x03\x1f\xffq\x01$\x03 \xff\x5c\x01\ +$\x03!\xffq\x01$\x03\x22\xff\x5c\x01$\x03#\xff\ +q\x01$\x03%\xffq\x01$\x03&\xff\x5c\x01$\x03\ +'\xffq\x01$\x03(\xff\x5c\x01$\x03)\xffq\x01\ +$\x03*\xff\x5c\x01$\x03+\xffq\x01$\x03,\xff\ +\x5c\x01$\x03-\xffq\x01$\x03.\xff\x5c\x01$\x03\ +/\xffq\x01$\x030\xff\x5c\x01$\x031\xffq\x01\ +$\x032\xff\x5c\x01$\x033\xffq\x01$\x034\xff\ +\x5c\x01$\x036\xffq\x01$\x038\xffq\x01$\x03\ +:\xffq\x01$\x03<\xffq\x01$\x03@\xffq\x01\ +$\x03B\xffq\x01$\x03D\xffq\x01$\x03I\xff\ +\xd7\x01$\x03J\xffq\x01$\x03K\xff\xd7\x01$\x03\ +L\xffq\x01$\x03M\xff\xd7\x01$\x03N\xffq\x01\ +$\x03O\xff\xd7\x01$\x03Q\xff\xd7\x01$\x03R\xff\ +q\x01$\x03S\xff\xd7\x01$\x03T\xffq\x01$\x03\ +U\xff\xd7\x01$\x03V\xffq\x01$\x03W\xff\xd7\x01\ +$\x03X\xffq\x01$\x03Y\xff\xd7\x01$\x03Z\xff\ +q\x01$\x03[\xff\xd7\x01$\x03\x5c\xffq\x01$\x03\ +]\xff\xd7\x01$\x03^\xffq\x01$\x03_\xff\xd7\x01\ +$\x03`\xffq\x01$\x03b\xff\x9a\x01$\x03d\xff\ +\x9a\x01$\x03f\xff\x9a\x01$\x03h\xff\x9a\x01$\x03\ +j\xff\x9a\x01$\x03l\xff\x9a\x01$\x03n\xff\x9a\x01\ +$\x03p\xff\xd7\x01$\x03\x8f\x00)\x01%\x00\x05\x00\ +)\x01%\x00\x0a\x00)\x01%\x02\x07\x00)\x01%\x02\ +\x0b\x00)\x01&\x00\x0f\xff\x85\x01&\x00\x10\xff\xae\x01\ +&\x00\x11\xff\x85\x01&\x00\x22\x00)\x01&\x00$\xff\ +q\x01&\x00&\xff\xd7\x01&\x00*\xff\xd7\x01&\x00\ +2\xff\xd7\x01&\x004\xff\xd7\x01&\x007\x00)\x01\ +&\x00D\xff\x5c\x01&\x00F\xffq\x01&\x00G\xff\ +q\x01&\x00H\xffq\x01&\x00J\xffq\x01&\x00\ +P\xff\x9a\x01&\x00Q\xff\x9a\x01&\x00R\xffq\x01\ +&\x00S\xff\x9a\x01&\x00T\xffq\x01&\x00U\xff\ +\x9a\x01&\x00V\xff\x85\x01&\x00X\xff\x9a\x01&\x00\ +Y\xff\xd7\x01&\x00Z\xff\xd7\x01&\x00[\xff\xd7\x01\ +&\x00\x5c\xff\xd7\x01&\x00]\xff\xae\x01&\x00\x82\xff\ +q\x01&\x00\x83\xffq\x01&\x00\x84\xffq\x01&\x00\ +\x85\xffq\x01&\x00\x86\xffq\x01&\x00\x87\xffq\x01\ +&\x00\x89\xff\xd7\x01&\x00\x94\xff\xd7\x01&\x00\x95\xff\ +\xd7\x01&\x00\x96\xff\xd7\x01&\x00\x97\xff\xd7\x01&\x00\ +\x98\xff\xd7\x01&\x00\x9a\xff\xd7\x01&\x00\xa2\xffq\x01\ +&\x00\xa3\xff\x5c\x01&\x00\xa4\xff\x5c\x01&\x00\xa5\xff\ +\x5c\x01&\x00\xa6\xff\x5c\x01&\x00\xa7\xff\x5c\x01&\x00\ +\xa8\xff\x5c\x01&\x00\xa9\xffq\x01&\x00\xaa\xffq\x01\ +&\x00\xab\xffq\x01&\x00\xac\xffq\x01&\x00\xad\xff\ +q\x01&\x00\xb4\xffq\x01&\x00\xb5\xffq\x01&\x00\ +\xb6\xffq\x01&\x00\xb7\xffq\x01&\x00\xb8\xffq\x01\ +&\x00\xba\xffq\x01&\x00\xbb\xff\x9a\x01&\x00\xbc\xff\ +\x9a\x01&\x00\xbd\xff\x9a\x01&\x00\xbe\xff\x9a\x01&\x00\ +\xbf\xff\xd7\x01&\x00\xc2\xffq\x01&\x00\xc3\xff\x5c\x01\ +&\x00\xc4\xffq\x01&\x00\xc5\xff\x5c\x01&\x00\xc6\xff\ +q\x01&\x00\xc7\xff\x5c\x01&\x00\xc8\xff\xd7\x01&\x00\ +\xc9\xffq\x01&\x00\xca\xff\xd7\x01&\x00\xcb\xffq\x01\ +&\x00\xcc\xff\xd7\x01&\x00\xcd\xffq\x01&\x00\xce\xff\ +\xd7\x01&\x00\xcf\xffq\x01&\x00\xd1\xffq\x01&\x00\ +\xd3\xffq\x01&\x00\xd5\xffq\x01&\x00\xd7\xffq\x01\ +&\x00\xd9\xffq\x01&\x00\xdb\xffq\x01&\x00\xdd\xff\ +q\x01&\x00\xde\xff\xd7\x01&\x00\xdf\xffq\x01&\x00\ +\xe0\xff\xd7\x01&\x00\xe1\xffq\x01&\x00\xe2\xff\xd7\x01\ +&\x00\xe3\xffq\x01&\x00\xe4\xff\xd7\x01&\x00\xe5\xff\ +q\x01&\x00\xfa\xff\x9a\x01&\x01\x06\xff\x9a\x01&\x01\ +\x08\xff\x9a\x01&\x01\x0d\xff\x9a\x01&\x01\x0e\xff\xd7\x01\ +&\x01\x0f\xffq\x01&\x01\x10\xff\xd7\x01&\x01\x11\xff\ +q\x01&\x01\x12\xff\xd7\x01&\x01\x13\xffq\x01&\x01\ +\x14\xff\xd7\x01&\x01\x15\xffq\x01&\x01\x17\xff\x9a\x01\ +&\x01\x19\xff\x9a\x01&\x01\x1d\xff\x85\x01&\x01!\xff\ +\x85\x01&\x01$\x00)\x01&\x01&\x00)\x01&\x01\ ++\xff\x9a\x01&\x01-\xff\x9a\x01&\x01/\xff\x9a\x01\ +&\x011\xff\x9a\x01&\x013\xff\x9a\x01&\x015\xff\ +\x9a\x01&\x017\xff\xd7\x01&\x01<\xff\xae\x01&\x01\ +>\xff\xae\x01&\x01@\xff\xae\x01&\x01C\xffq\x01\ +&\x01D\xff\x5c\x01&\x01F\xff\x5c\x01&\x01G\xff\ +\xd7\x01&\x01H\xffq\x01&\x01J\xff\x85\x01&\x01\ +\xfb\xff\xd7\x01&\x01\xfd\xff\xd7\x01&\x02\x02\xff\xae\x01\ +&\x02\x03\xff\xae\x01&\x02\x04\xff\xae\x01&\x02\x08\xff\ +\x85\x01&\x02\x0c\xff\x85\x01&\x02W\xff\x9a\x01&\x02\ +X\xffq\x01&\x02Y\xff\x5c\x01&\x02_\xff\xd7\x01\ +&\x02`\xffq\x01&\x02b\xff\x9a\x01&\x03\x1d\xff\ +q\x01&\x03\x1e\xff\x5c\x01&\x03\x1f\xffq\x01&\x03\ + \xff\x5c\x01&\x03!\xffq\x01&\x03\x22\xff\x5c\x01\ +&\x03#\xffq\x01&\x03%\xffq\x01&\x03&\xff\ +\x5c\x01&\x03'\xffq\x01&\x03(\xff\x5c\x01&\x03\ +)\xffq\x01&\x03*\xff\x5c\x01&\x03+\xffq\x01\ +&\x03,\xff\x5c\x01&\x03-\xffq\x01&\x03.\xff\ +\x5c\x01&\x03/\xffq\x01&\x030\xff\x5c\x01&\x03\ +1\xffq\x01&\x032\xff\x5c\x01&\x033\xffq\x01\ +&\x034\xff\x5c\x01&\x036\xffq\x01&\x038\xff\ +q\x01&\x03:\xffq\x01&\x03<\xffq\x01&\x03\ +@\xffq\x01&\x03B\xffq\x01&\x03D\xffq\x01\ +&\x03I\xff\xd7\x01&\x03J\xffq\x01&\x03K\xff\ +\xd7\x01&\x03L\xffq\x01&\x03M\xff\xd7\x01&\x03\ +N\xffq\x01&\x03O\xff\xd7\x01&\x03Q\xff\xd7\x01\ +&\x03R\xffq\x01&\x03S\xff\xd7\x01&\x03T\xff\ +q\x01&\x03U\xff\xd7\x01&\x03V\xffq\x01&\x03\ +W\xff\xd7\x01&\x03X\xffq\x01&\x03Y\xff\xd7\x01\ +&\x03Z\xffq\x01&\x03[\xff\xd7\x01&\x03\x5c\xff\ +q\x01&\x03]\xff\xd7\x01&\x03^\xffq\x01&\x03\ +_\xff\xd7\x01&\x03`\xffq\x01&\x03b\xff\x9a\x01\ +&\x03d\xff\x9a\x01&\x03f\xff\x9a\x01&\x03h\xff\ +\x9a\x01&\x03j\xff\x9a\x01&\x03l\xff\x9a\x01&\x03\ +n\xff\x9a\x01&\x03p\xff\xd7\x01&\x03\x8f\x00)\x01\ +'\x00\x05\x00)\x01'\x00\x0a\x00)\x01'\x02\x07\x00\ +)\x01'\x02\x0b\x00)\x01(\x00\x0f\xff\x85\x01(\x00\ +\x10\xff\xae\x01(\x00\x11\xff\x85\x01(\x00\x22\x00)\x01\ +(\x00$\xffq\x01(\x00&\xff\xd7\x01(\x00*\xff\ +\xd7\x01(\x002\xff\xd7\x01(\x004\xff\xd7\x01(\x00\ +7\x00)\x01(\x00D\xff\x5c\x01(\x00F\xffq\x01\ +(\x00G\xffq\x01(\x00H\xffq\x01(\x00J\xff\ +q\x01(\x00P\xff\x9a\x01(\x00Q\xff\x9a\x01(\x00\ +R\xffq\x01(\x00S\xff\x9a\x01(\x00T\xffq\x01\ +(\x00U\xff\x9a\x01(\x00V\xff\x85\x01(\x00X\xff\ +\x9a\x01(\x00Y\xff\xd7\x01(\x00Z\xff\xd7\x01(\x00\ +[\xff\xd7\x01(\x00\x5c\xff\xd7\x01(\x00]\xff\xae\x01\ +(\x00\x82\xffq\x01(\x00\x83\xffq\x01(\x00\x84\xff\ +q\x01(\x00\x85\xffq\x01(\x00\x86\xffq\x01(\x00\ +\x87\xffq\x01(\x00\x89\xff\xd7\x01(\x00\x94\xff\xd7\x01\ +(\x00\x95\xff\xd7\x01(\x00\x96\xff\xd7\x01(\x00\x97\xff\ +\xd7\x01(\x00\x98\xff\xd7\x01(\x00\x9a\xff\xd7\x01(\x00\ +\xa2\xffq\x01(\x00\xa3\xff\x5c\x01(\x00\xa4\xff\x5c\x01\ +(\x00\xa5\xff\x5c\x01(\x00\xa6\xff\x5c\x01(\x00\xa7\xff\ +\x5c\x01(\x00\xa8\xff\x5c\x01(\x00\xa9\xffq\x01(\x00\ +\xaa\xffq\x01(\x00\xab\xffq\x01(\x00\xac\xffq\x01\ +(\x00\xad\xffq\x01(\x00\xb4\xffq\x01(\x00\xb5\xff\ +q\x01(\x00\xb6\xffq\x01(\x00\xb7\xffq\x01(\x00\ +\xb8\xffq\x01(\x00\xba\xffq\x01(\x00\xbb\xff\x9a\x01\ +(\x00\xbc\xff\x9a\x01(\x00\xbd\xff\x9a\x01(\x00\xbe\xff\ +\x9a\x01(\x00\xbf\xff\xd7\x01(\x00\xc2\xffq\x01(\x00\ +\xc3\xff\x5c\x01(\x00\xc4\xffq\x01(\x00\xc5\xff\x5c\x01\ +(\x00\xc6\xffq\x01(\x00\xc7\xff\x5c\x01(\x00\xc8\xff\ +\xd7\x01(\x00\xc9\xffq\x01(\x00\xca\xff\xd7\x01(\x00\ +\xcb\xffq\x01(\x00\xcc\xff\xd7\x01(\x00\xcd\xffq\x01\ +(\x00\xce\xff\xd7\x01(\x00\xcf\xffq\x01(\x00\xd1\xff\ +q\x01(\x00\xd3\xffq\x01(\x00\xd5\xffq\x01(\x00\ +\xd7\xffq\x01(\x00\xd9\xffq\x01(\x00\xdb\xffq\x01\ +(\x00\xdd\xffq\x01(\x00\xde\xff\xd7\x01(\x00\xdf\xff\ +q\x01(\x00\xe0\xff\xd7\x01(\x00\xe1\xffq\x01(\x00\ +\xe2\xff\xd7\x01(\x00\xe3\xffq\x01(\x00\xe4\xff\xd7\x01\ +(\x00\xe5\xffq\x01(\x00\xfa\xff\x9a\x01(\x01\x06\xff\ +\x9a\x01(\x01\x08\xff\x9a\x01(\x01\x0d\xff\x9a\x01(\x01\ +\x0e\xff\xd7\x01(\x01\x0f\xffq\x01(\x01\x10\xff\xd7\x01\ +(\x01\x11\xffq\x01(\x01\x12\xff\xd7\x01(\x01\x13\xff\ +q\x01(\x01\x14\xff\xd7\x01(\x01\x15\xffq\x01(\x01\ +\x17\xff\x9a\x01(\x01\x19\xff\x9a\x01(\x01\x1d\xff\x85\x01\ +(\x01!\xff\x85\x01(\x01$\x00)\x01(\x01&\x00\ +)\x01(\x01+\xff\x9a\x01(\x01-\xff\x9a\x01(\x01\ +/\xff\x9a\x01(\x011\xff\x9a\x01(\x013\xff\x9a\x01\ +(\x015\xff\x9a\x01(\x017\xff\xd7\x01(\x01<\xff\ +\xae\x01(\x01>\xff\xae\x01(\x01@\xff\xae\x01(\x01\ +C\xffq\x01(\x01D\xff\x5c\x01(\x01F\xff\x5c\x01\ +(\x01G\xff\xd7\x01(\x01H\xffq\x01(\x01J\xff\ +\x85\x01(\x01\xfb\xff\xd7\x01(\x01\xfd\xff\xd7\x01(\x02\ +\x02\xff\xae\x01(\x02\x03\xff\xae\x01(\x02\x04\xff\xae\x01\ +(\x02\x08\xff\x85\x01(\x02\x0c\xff\x85\x01(\x02W\xff\ +\x9a\x01(\x02X\xffq\x01(\x02Y\xff\x5c\x01(\x02\ +_\xff\xd7\x01(\x02`\xffq\x01(\x02b\xff\x9a\x01\ +(\x03\x1d\xffq\x01(\x03\x1e\xff\x5c\x01(\x03\x1f\xff\ +q\x01(\x03 \xff\x5c\x01(\x03!\xffq\x01(\x03\ +\x22\xff\x5c\x01(\x03#\xffq\x01(\x03%\xffq\x01\ +(\x03&\xff\x5c\x01(\x03'\xffq\x01(\x03(\xff\ +\x5c\x01(\x03)\xffq\x01(\x03*\xff\x5c\x01(\x03\ ++\xffq\x01(\x03,\xff\x5c\x01(\x03-\xffq\x01\ +(\x03.\xff\x5c\x01(\x03/\xffq\x01(\x030\xff\ +\x5c\x01(\x031\xffq\x01(\x032\xff\x5c\x01(\x03\ +3\xffq\x01(\x034\xff\x5c\x01(\x036\xffq\x01\ +(\x038\xffq\x01(\x03:\xffq\x01(\x03<\xff\ +q\x01(\x03@\xffq\x01(\x03B\xffq\x01(\x03\ +D\xffq\x01(\x03I\xff\xd7\x01(\x03J\xffq\x01\ +(\x03K\xff\xd7\x01(\x03L\xffq\x01(\x03M\xff\ +\xd7\x01(\x03N\xffq\x01(\x03O\xff\xd7\x01(\x03\ +Q\xff\xd7\x01(\x03R\xffq\x01(\x03S\xff\xd7\x01\ +(\x03T\xffq\x01(\x03U\xff\xd7\x01(\x03V\xff\ +q\x01(\x03W\xff\xd7\x01(\x03X\xffq\x01(\x03\ +Y\xff\xd7\x01(\x03Z\xffq\x01(\x03[\xff\xd7\x01\ +(\x03\x5c\xffq\x01(\x03]\xff\xd7\x01(\x03^\xff\ +q\x01(\x03_\xff\xd7\x01(\x03`\xffq\x01(\x03\ +b\xff\x9a\x01(\x03d\xff\x9a\x01(\x03f\xff\x9a\x01\ +(\x03h\xff\x9a\x01(\x03j\xff\x9a\x01(\x03l\xff\ +\x9a\x01(\x03n\xff\x9a\x01(\x03p\xff\xd7\x01(\x03\ +\x8f\x00)\x01*\x00\x0f\xff\xd7\x01*\x00\x11\xff\xd7\x01\ +*\x00$\xff\xec\x01*\x00\x82\xff\xec\x01*\x00\x83\xff\ +\xec\x01*\x00\x84\xff\xec\x01*\x00\x85\xff\xec\x01*\x00\ +\x86\xff\xec\x01*\x00\x87\xff\xec\x01*\x00\xc2\xff\xec\x01\ +*\x00\xc4\xff\xec\x01*\x00\xc6\xff\xec\x01*\x01C\xff\ +\xec\x01*\x02\x08\xff\xd7\x01*\x02\x0c\xff\xd7\x01*\x02\ +X\xff\xec\x01*\x03\x1d\xff\xec\x01*\x03\x1f\xff\xec\x01\ +*\x03!\xff\xec\x01*\x03#\xff\xec\x01*\x03%\xff\ +\xec\x01*\x03'\xff\xec\x01*\x03)\xff\xec\x01*\x03\ ++\xff\xec\x01*\x03-\xff\xec\x01*\x03/\xff\xec\x01\ +*\x031\xff\xec\x01*\x033\xff\xec\x01,\x00\x0f\xff\ +\xd7\x01,\x00\x11\xff\xd7\x01,\x00$\xff\xec\x01,\x00\ +\x82\xff\xec\x01,\x00\x83\xff\xec\x01,\x00\x84\xff\xec\x01\ +,\x00\x85\xff\xec\x01,\x00\x86\xff\xec\x01,\x00\x87\xff\ +\xec\x01,\x00\xc2\xff\xec\x01,\x00\xc4\xff\xec\x01,\x00\ +\xc6\xff\xec\x01,\x01C\xff\xec\x01,\x02\x08\xff\xd7\x01\ +,\x02\x0c\xff\xd7\x01,\x02X\xff\xec\x01,\x03\x1d\xff\ +\xec\x01,\x03\x1f\xff\xec\x01,\x03!\xff\xec\x01,\x03\ +#\xff\xec\x01,\x03%\xff\xec\x01,\x03'\xff\xec\x01\ +,\x03)\xff\xec\x01,\x03+\xff\xec\x01,\x03-\xff\ +\xec\x01,\x03/\xff\xec\x01,\x031\xff\xec\x01,\x03\ +3\xff\xec\x01.\x00\x0f\xff\xd7\x01.\x00\x11\xff\xd7\x01\ +.\x00$\xff\xec\x01.\x00\x82\xff\xec\x01.\x00\x83\xff\ +\xec\x01.\x00\x84\xff\xec\x01.\x00\x85\xff\xec\x01.\x00\ +\x86\xff\xec\x01.\x00\x87\xff\xec\x01.\x00\xc2\xff\xec\x01\ +.\x00\xc4\xff\xec\x01.\x00\xc6\xff\xec\x01.\x01C\xff\ +\xec\x01.\x02\x08\xff\xd7\x01.\x02\x0c\xff\xd7\x01.\x02\ +X\xff\xec\x01.\x03\x1d\xff\xec\x01.\x03\x1f\xff\xec\x01\ +.\x03!\xff\xec\x01.\x03#\xff\xec\x01.\x03%\xff\ +\xec\x01.\x03'\xff\xec\x01.\x03)\xff\xec\x01.\x03\ ++\xff\xec\x01.\x03-\xff\xec\x01.\x03/\xff\xec\x01\ +.\x031\xff\xec\x01.\x033\xff\xec\x010\x00\x0f\xff\ +\xd7\x010\x00\x11\xff\xd7\x010\x00$\xff\xec\x010\x00\ +\x82\xff\xec\x010\x00\x83\xff\xec\x010\x00\x84\xff\xec\x01\ +0\x00\x85\xff\xec\x010\x00\x86\xff\xec\x010\x00\x87\xff\ +\xec\x010\x00\xc2\xff\xec\x010\x00\xc4\xff\xec\x010\x00\ +\xc6\xff\xec\x010\x01C\xff\xec\x010\x02\x08\xff\xd7\x01\ +0\x02\x0c\xff\xd7\x010\x02X\xff\xec\x010\x03\x1d\xff\ +\xec\x010\x03\x1f\xff\xec\x010\x03!\xff\xec\x010\x03\ +#\xff\xec\x010\x03%\xff\xec\x010\x03'\xff\xec\x01\ +0\x03)\xff\xec\x010\x03+\xff\xec\x010\x03-\xff\ +\xec\x010\x03/\xff\xec\x010\x031\xff\xec\x010\x03\ +3\xff\xec\x012\x00\x0f\xff\xd7\x012\x00\x11\xff\xd7\x01\ +2\x00$\xff\xec\x012\x00\x82\xff\xec\x012\x00\x83\xff\ +\xec\x012\x00\x84\xff\xec\x012\x00\x85\xff\xec\x012\x00\ +\x86\xff\xec\x012\x00\x87\xff\xec\x012\x00\xc2\xff\xec\x01\ +2\x00\xc4\xff\xec\x012\x00\xc6\xff\xec\x012\x01C\xff\ +\xec\x012\x02\x08\xff\xd7\x012\x02\x0c\xff\xd7\x012\x02\ +X\xff\xec\x012\x03\x1d\xff\xec\x012\x03\x1f\xff\xec\x01\ +2\x03!\xff\xec\x012\x03#\xff\xec\x012\x03%\xff\ +\xec\x012\x03'\xff\xec\x012\x03)\xff\xec\x012\x03\ ++\xff\xec\x012\x03-\xff\xec\x012\x03/\xff\xec\x01\ +2\x031\xff\xec\x012\x033\xff\xec\x014\x00\x0f\xff\ +\xd7\x014\x00\x11\xff\xd7\x014\x00$\xff\xec\x014\x00\ +\x82\xff\xec\x014\x00\x83\xff\xec\x014\x00\x84\xff\xec\x01\ +4\x00\x85\xff\xec\x014\x00\x86\xff\xec\x014\x00\x87\xff\ +\xec\x014\x00\xc2\xff\xec\x014\x00\xc4\xff\xec\x014\x00\ +\xc6\xff\xec\x014\x01C\xff\xec\x014\x02\x08\xff\xd7\x01\ +4\x02\x0c\xff\xd7\x014\x02X\xff\xec\x014\x03\x1d\xff\ +\xec\x014\x03\x1f\xff\xec\x014\x03!\xff\xec\x014\x03\ +#\xff\xec\x014\x03%\xff\xec\x014\x03'\xff\xec\x01\ +4\x03)\xff\xec\x014\x03+\xff\xec\x014\x03-\xff\ +\xec\x014\x03/\xff\xec\x014\x031\xff\xec\x014\x03\ +3\xff\xec\x016\x00\x0f\xff\x9a\x016\x00\x11\xff\x9a\x01\ +6\x00\x22\x00)\x016\x00$\xff\xae\x016\x00&\xff\ +\xec\x016\x00*\xff\xec\x016\x002\xff\xec\x016\x00\ +4\xff\xec\x016\x00D\xff\xd7\x016\x00F\xff\xd7\x01\ +6\x00G\xff\xd7\x016\x00H\xff\xd7\x016\x00J\xff\ +\xec\x016\x00P\xff\xec\x016\x00Q\xff\xec\x016\x00\ +R\xff\xd7\x016\x00S\xff\xec\x016\x00T\xff\xd7\x01\ +6\x00U\xff\xec\x016\x00V\xff\xec\x016\x00X\xff\ +\xec\x016\x00\x82\xff\xae\x016\x00\x83\xff\xae\x016\x00\ +\x84\xff\xae\x016\x00\x85\xff\xae\x016\x00\x86\xff\xae\x01\ +6\x00\x87\xff\xae\x016\x00\x89\xff\xec\x016\x00\x94\xff\ +\xec\x016\x00\x95\xff\xec\x016\x00\x96\xff\xec\x016\x00\ +\x97\xff\xec\x016\x00\x98\xff\xec\x016\x00\x9a\xff\xec\x01\ +6\x00\xa2\xff\xd7\x016\x00\xa3\xff\xd7\x016\x00\xa4\xff\ +\xd7\x016\x00\xa5\xff\xd7\x016\x00\xa6\xff\xd7\x016\x00\ +\xa7\xff\xd7\x016\x00\xa8\xff\xd7\x016\x00\xa9\xff\xd7\x01\ +6\x00\xaa\xff\xd7\x016\x00\xab\xff\xd7\x016\x00\xac\xff\ +\xd7\x016\x00\xad\xff\xd7\x016\x00\xb4\xff\xd7\x016\x00\ +\xb5\xff\xd7\x016\x00\xb6\xff\xd7\x016\x00\xb7\xff\xd7\x01\ +6\x00\xb8\xff\xd7\x016\x00\xba\xff\xd7\x016\x00\xbb\xff\ +\xec\x016\x00\xbc\xff\xec\x016\x00\xbd\xff\xec\x016\x00\ +\xbe\xff\xec\x016\x00\xc2\xff\xae\x016\x00\xc3\xff\xd7\x01\ +6\x00\xc4\xff\xae\x016\x00\xc5\xff\xd7\x016\x00\xc6\xff\ +\xae\x016\x00\xc7\xff\xd7\x016\x00\xc8\xff\xec\x016\x00\ +\xc9\xff\xd7\x016\x00\xca\xff\xec\x016\x00\xcb\xff\xd7\x01\ +6\x00\xcc\xff\xec\x016\x00\xcd\xff\xd7\x016\x00\xce\xff\ +\xec\x016\x00\xcf\xff\xd7\x016\x00\xd1\xff\xd7\x016\x00\ +\xd3\xff\xd7\x016\x00\xd5\xff\xd7\x016\x00\xd7\xff\xd7\x01\ +6\x00\xd9\xff\xd7\x016\x00\xdb\xff\xd7\x016\x00\xdd\xff\ +\xd7\x016\x00\xde\xff\xec\x016\x00\xdf\xff\xec\x016\x00\ +\xe0\xff\xec\x016\x00\xe1\xff\xec\x016\x00\xe2\xff\xec\x01\ +6\x00\xe3\xff\xec\x016\x00\xe4\xff\xec\x016\x00\xe5\xff\ +\xec\x016\x00\xfa\xff\xec\x016\x01\x06\xff\xec\x016\x01\ +\x08\xff\xec\x016\x01\x0d\xff\xec\x016\x01\x0e\xff\xec\x01\ +6\x01\x0f\xff\xd7\x016\x01\x10\xff\xec\x016\x01\x11\xff\ +\xd7\x016\x01\x12\xff\xec\x016\x01\x13\xff\xd7\x016\x01\ +\x14\xff\xec\x016\x01\x15\xff\xd7\x016\x01\x17\xff\xec\x01\ +6\x01\x19\xff\xec\x016\x01\x1d\xff\xec\x016\x01!\xff\ +\xec\x016\x01+\xff\xec\x016\x01-\xff\xec\x016\x01\ +/\xff\xec\x016\x011\xff\xec\x016\x013\xff\xec\x01\ +6\x015\xff\xec\x016\x01C\xff\xae\x016\x01D\xff\ +\xd7\x016\x01F\xff\xd7\x016\x01G\xff\xec\x016\x01\ +H\xff\xd7\x016\x01J\xff\xec\x016\x02\x08\xff\x9a\x01\ +6\x02\x0c\xff\x9a\x016\x02W\xff\xec\x016\x02X\xff\ +\xae\x016\x02Y\xff\xd7\x016\x02_\xff\xec\x016\x02\ +`\xff\xd7\x016\x02b\xff\xec\x016\x03\x1d\xff\xae\x01\ +6\x03\x1e\xff\xd7\x016\x03\x1f\xff\xae\x016\x03 \xff\ +\xd7\x016\x03!\xff\xae\x016\x03\x22\xff\xd7\x016\x03\ +#\xff\xae\x016\x03%\xff\xae\x016\x03&\xff\xd7\x01\ +6\x03'\xff\xae\x016\x03(\xff\xd7\x016\x03)\xff\ +\xae\x016\x03*\xff\xd7\x016\x03+\xff\xae\x016\x03\ +,\xff\xd7\x016\x03-\xff\xae\x016\x03.\xff\xd7\x01\ +6\x03/\xff\xae\x016\x030\xff\xd7\x016\x031\xff\ +\xae\x016\x032\xff\xd7\x016\x033\xff\xae\x016\x03\ +4\xff\xd7\x016\x036\xff\xd7\x016\x038\xff\xd7\x01\ +6\x03:\xff\xd7\x016\x03<\xff\xd7\x016\x03@\xff\ +\xd7\x016\x03B\xff\xd7\x016\x03D\xff\xd7\x016\x03\ +I\xff\xec\x016\x03J\xff\xd7\x016\x03K\xff\xec\x01\ +6\x03L\xff\xd7\x016\x03M\xff\xec\x016\x03N\xff\ +\xd7\x016\x03O\xff\xec\x016\x03Q\xff\xec\x016\x03\ +R\xff\xd7\x016\x03S\xff\xec\x016\x03T\xff\xd7\x01\ +6\x03U\xff\xec\x016\x03V\xff\xd7\x016\x03W\xff\ +\xec\x016\x03X\xff\xd7\x016\x03Y\xff\xec\x016\x03\ +Z\xff\xd7\x016\x03[\xff\xec\x016\x03\x5c\xff\xd7\x01\ +6\x03]\xff\xec\x016\x03^\xff\xd7\x016\x03_\xff\ +\xec\x016\x03`\xff\xd7\x016\x03b\xff\xec\x016\x03\ +d\xff\xec\x016\x03f\xff\xec\x016\x03h\xff\xec\x01\ +6\x03j\xff\xec\x016\x03l\xff\xec\x016\x03n\xff\ +\xec\x017\x00\x05\x00R\x017\x00\x0a\x00R\x017\x00\ +\x0f\xff\xae\x017\x00\x11\xff\xae\x017\x00\x22\x00)\x01\ +7\x02\x07\x00R\x017\x02\x08\xff\xae\x017\x02\x0b\x00\ +R\x017\x02\x0c\xff\xae\x018\x00\x0f\xff\x85\x018\x00\ +\x11\xff\x85\x018\x00\x22\x00)\x018\x00$\xff\x85\x01\ +8\x00&\xff\xd7\x018\x00*\xff\xd7\x018\x002\xff\ +\xd7\x018\x004\xff\xd7\x018\x00D\xff\x9a\x018\x00\ +F\xff\x9a\x018\x00G\xff\x9a\x018\x00H\xff\x9a\x01\ +8\x00J\xff\xd7\x018\x00P\xff\xc3\x018\x00Q\xff\ +\xc3\x018\x00R\xff\x9a\x018\x00S\xff\xc3\x018\x00\ +T\xff\x9a\x018\x00U\xff\xc3\x018\x00V\xff\xae\x01\ +8\x00X\xff\xc3\x018\x00]\xff\xd7\x018\x00\x82\xff\ +\x85\x018\x00\x83\xff\x85\x018\x00\x84\xff\x85\x018\x00\ +\x85\xff\x85\x018\x00\x86\xff\x85\x018\x00\x87\xff\x85\x01\ +8\x00\x89\xff\xd7\x018\x00\x94\xff\xd7\x018\x00\x95\xff\ +\xd7\x018\x00\x96\xff\xd7\x018\x00\x97\xff\xd7\x018\x00\ +\x98\xff\xd7\x018\x00\x9a\xff\xd7\x018\x00\xa2\xff\x9a\x01\ +8\x00\xa3\xff\x9a\x018\x00\xa4\xff\x9a\x018\x00\xa5\xff\ +\x9a\x018\x00\xa6\xff\x9a\x018\x00\xa7\xff\x9a\x018\x00\ +\xa8\xff\x9a\x018\x00\xa9\xff\x9a\x018\x00\xaa\xff\x9a\x01\ +8\x00\xab\xff\x9a\x018\x00\xac\xff\x9a\x018\x00\xad\xff\ +\x9a\x018\x00\xb4\xff\x9a\x018\x00\xb5\xff\x9a\x018\x00\ +\xb6\xff\x9a\x018\x00\xb7\xff\x9a\x018\x00\xb8\xff\x9a\x01\ +8\x00\xba\xff\x9a\x018\x00\xbb\xff\xc3\x018\x00\xbc\xff\ +\xc3\x018\x00\xbd\xff\xc3\x018\x00\xbe\xff\xc3\x018\x00\ +\xc2\xff\x85\x018\x00\xc3\xff\x9a\x018\x00\xc4\xff\x85\x01\ +8\x00\xc5\xff\x9a\x018\x00\xc6\xff\x85\x018\x00\xc7\xff\ +\x9a\x018\x00\xc8\xff\xd7\x018\x00\xc9\xff\x9a\x018\x00\ +\xca\xff\xd7\x018\x00\xcb\xff\x9a\x018\x00\xcc\xff\xd7\x01\ +8\x00\xcd\xff\x9a\x018\x00\xce\xff\xd7\x018\x00\xcf\xff\ +\x9a\x018\x00\xd1\xff\x9a\x018\x00\xd3\xff\x9a\x018\x00\ +\xd5\xff\x9a\x018\x00\xd7\xff\x9a\x018\x00\xd9\xff\x9a\x01\ +8\x00\xdb\xff\x9a\x018\x00\xdd\xff\x9a\x018\x00\xde\xff\ +\xd7\x018\x00\xdf\xff\xd7\x018\x00\xe0\xff\xd7\x018\x00\ +\xe1\xff\xd7\x018\x00\xe2\xff\xd7\x018\x00\xe3\xff\xd7\x01\ +8\x00\xe4\xff\xd7\x018\x00\xe5\xff\xd7\x018\x00\xfa\xff\ +\xc3\x018\x01\x06\xff\xc3\x018\x01\x08\xff\xc3\x018\x01\ +\x0d\xff\xc3\x018\x01\x0e\xff\xd7\x018\x01\x0f\xff\x9a\x01\ +8\x01\x10\xff\xd7\x018\x01\x11\xff\x9a\x018\x01\x12\xff\ +\xd7\x018\x01\x13\xff\x9a\x018\x01\x14\xff\xd7\x018\x01\ +\x15\xff\x9a\x018\x01\x17\xff\xc3\x018\x01\x19\xff\xc3\x01\ +8\x01\x1d\xff\xae\x018\x01!\xff\xae\x018\x01+\xff\ +\xc3\x018\x01-\xff\xc3\x018\x01/\xff\xc3\x018\x01\ +1\xff\xc3\x018\x013\xff\xc3\x018\x015\xff\xc3\x01\ +8\x01<\xff\xd7\x018\x01>\xff\xd7\x018\x01@\xff\ +\xd7\x018\x01C\xff\x85\x018\x01D\xff\x9a\x018\x01\ +F\xff\x9a\x018\x01G\xff\xd7\x018\x01H\xff\x9a\x01\ +8\x01J\xff\xae\x018\x02\x08\xff\x85\x018\x02\x0c\xff\ +\x85\x018\x02W\xff\xc3\x018\x02X\xff\x85\x018\x02\ +Y\xff\x9a\x018\x02_\xff\xd7\x018\x02`\xff\x9a\x01\ +8\x02b\xff\xc3\x018\x03\x1d\xff\x85\x018\x03\x1e\xff\ +\x9a\x018\x03\x1f\xff\x85\x018\x03 \xff\x9a\x018\x03\ +!\xff\x85\x018\x03\x22\xff\x9a\x018\x03#\xff\x85\x01\ +8\x03%\xff\x85\x018\x03&\xff\x9a\x018\x03'\xff\ +\x85\x018\x03(\xff\x9a\x018\x03)\xff\x85\x018\x03\ +*\xff\x9a\x018\x03+\xff\x85\x018\x03,\xff\x9a\x01\ +8\x03-\xff\x85\x018\x03.\xff\x9a\x018\x03/\xff\ +\x85\x018\x030\xff\x9a\x018\x031\xff\x85\x018\x03\ +2\xff\x9a\x018\x033\xff\x85\x018\x034\xff\x9a\x01\ +8\x036\xff\x9a\x018\x038\xff\x9a\x018\x03:\xff\ +\x9a\x018\x03<\xff\x9a\x018\x03@\xff\x9a\x018\x03\ +B\xff\x9a\x018\x03D\xff\x9a\x018\x03I\xff\xd7\x01\ +8\x03J\xff\x9a\x018\x03K\xff\xd7\x018\x03L\xff\ +\x9a\x018\x03M\xff\xd7\x018\x03N\xff\x9a\x018\x03\ +O\xff\xd7\x018\x03Q\xff\xd7\x018\x03R\xff\x9a\x01\ +8\x03S\xff\xd7\x018\x03T\xff\x9a\x018\x03U\xff\ +\xd7\x018\x03V\xff\x9a\x018\x03W\xff\xd7\x018\x03\ +X\xff\x9a\x018\x03Y\xff\xd7\x018\x03Z\xff\x9a\x01\ +8\x03[\xff\xd7\x018\x03\x5c\xff\x9a\x018\x03]\xff\ +\xd7\x018\x03^\xff\x9a\x018\x03_\xff\xd7\x018\x03\ +`\xff\x9a\x018\x03b\xff\xc3\x018\x03d\xff\xc3\x01\ +8\x03f\xff\xc3\x018\x03h\xff\xc3\x018\x03j\xff\ +\xc3\x018\x03l\xff\xc3\x018\x03n\xff\xc3\x019\x00\ +\x05\x00R\x019\x00\x0a\x00R\x019\x00\x0f\xff\xae\x01\ +9\x00\x11\xff\xae\x019\x00\x22\x00)\x019\x02\x07\x00\ +R\x019\x02\x08\xff\xae\x019\x02\x0b\x00R\x019\x02\ +\x0c\xff\xae\x01:\x00\x0f\xff\x85\x01:\x00\x11\xff\x85\x01\ +:\x00\x22\x00)\x01:\x00$\xff\x85\x01:\x00&\xff\ +\xd7\x01:\x00*\xff\xd7\x01:\x002\xff\xd7\x01:\x00\ +4\xff\xd7\x01:\x00D\xff\x9a\x01:\x00F\xff\x9a\x01\ +:\x00G\xff\x9a\x01:\x00H\xff\x9a\x01:\x00J\xff\ +\xd7\x01:\x00P\xff\xc3\x01:\x00Q\xff\xc3\x01:\x00\ +R\xff\x9a\x01:\x00S\xff\xc3\x01:\x00T\xff\x9a\x01\ +:\x00U\xff\xc3\x01:\x00V\xff\xae\x01:\x00X\xff\ +\xc3\x01:\x00]\xff\xd7\x01:\x00\x82\xff\x85\x01:\x00\ +\x83\xff\x85\x01:\x00\x84\xff\x85\x01:\x00\x85\xff\x85\x01\ +:\x00\x86\xff\x85\x01:\x00\x87\xff\x85\x01:\x00\x89\xff\ +\xd7\x01:\x00\x94\xff\xd7\x01:\x00\x95\xff\xd7\x01:\x00\ +\x96\xff\xd7\x01:\x00\x97\xff\xd7\x01:\x00\x98\xff\xd7\x01\ +:\x00\x9a\xff\xd7\x01:\x00\xa2\xff\x9a\x01:\x00\xa3\xff\ +\x9a\x01:\x00\xa4\xff\x9a\x01:\x00\xa5\xff\x9a\x01:\x00\ +\xa6\xff\x9a\x01:\x00\xa7\xff\x9a\x01:\x00\xa8\xff\x9a\x01\ +:\x00\xa9\xff\x9a\x01:\x00\xaa\xff\x9a\x01:\x00\xab\xff\ +\x9a\x01:\x00\xac\xff\x9a\x01:\x00\xad\xff\x9a\x01:\x00\ +\xb4\xff\x9a\x01:\x00\xb5\xff\x9a\x01:\x00\xb6\xff\x9a\x01\ +:\x00\xb7\xff\x9a\x01:\x00\xb8\xff\x9a\x01:\x00\xba\xff\ +\x9a\x01:\x00\xbb\xff\xc3\x01:\x00\xbc\xff\xc3\x01:\x00\ +\xbd\xff\xc3\x01:\x00\xbe\xff\xc3\x01:\x00\xc2\xff\x85\x01\ +:\x00\xc3\xff\x9a\x01:\x00\xc4\xff\x85\x01:\x00\xc5\xff\ +\x9a\x01:\x00\xc6\xff\x85\x01:\x00\xc7\xff\x9a\x01:\x00\ +\xc8\xff\xd7\x01:\x00\xc9\xff\x9a\x01:\x00\xca\xff\xd7\x01\ +:\x00\xcb\xff\x9a\x01:\x00\xcc\xff\xd7\x01:\x00\xcd\xff\ +\x9a\x01:\x00\xce\xff\xd7\x01:\x00\xcf\xff\x9a\x01:\x00\ +\xd1\xff\x9a\x01:\x00\xd3\xff\x9a\x01:\x00\xd5\xff\x9a\x01\ +:\x00\xd7\xff\x9a\x01:\x00\xd9\xff\x9a\x01:\x00\xdb\xff\ +\x9a\x01:\x00\xdd\xff\x9a\x01:\x00\xde\xff\xd7\x01:\x00\ +\xdf\xff\xd7\x01:\x00\xe0\xff\xd7\x01:\x00\xe1\xff\xd7\x01\ +:\x00\xe2\xff\xd7\x01:\x00\xe3\xff\xd7\x01:\x00\xe4\xff\ +\xd7\x01:\x00\xe5\xff\xd7\x01:\x00\xfa\xff\xc3\x01:\x01\ +\x06\xff\xc3\x01:\x01\x08\xff\xc3\x01:\x01\x0d\xff\xc3\x01\ +:\x01\x0e\xff\xd7\x01:\x01\x0f\xff\x9a\x01:\x01\x10\xff\ +\xd7\x01:\x01\x11\xff\x9a\x01:\x01\x12\xff\xd7\x01:\x01\ +\x13\xff\x9a\x01:\x01\x14\xff\xd7\x01:\x01\x15\xff\x9a\x01\ +:\x01\x17\xff\xc3\x01:\x01\x19\xff\xc3\x01:\x01\x1d\xff\ +\xae\x01:\x01!\xff\xae\x01:\x01+\xff\xc3\x01:\x01\ +-\xff\xc3\x01:\x01/\xff\xc3\x01:\x011\xff\xc3\x01\ +:\x013\xff\xc3\x01:\x015\xff\xc3\x01:\x01<\xff\ +\xd7\x01:\x01>\xff\xd7\x01:\x01@\xff\xd7\x01:\x01\ +C\xff\x85\x01:\x01D\xff\x9a\x01:\x01F\xff\x9a\x01\ +:\x01G\xff\xd7\x01:\x01H\xff\x9a\x01:\x01J\xff\ +\xae\x01:\x02\x08\xff\x85\x01:\x02\x0c\xff\x85\x01:\x02\ +W\xff\xc3\x01:\x02X\xff\x85\x01:\x02Y\xff\x9a\x01\ +:\x02_\xff\xd7\x01:\x02`\xff\x9a\x01:\x02b\xff\ +\xc3\x01:\x03\x1d\xff\x85\x01:\x03\x1e\xff\x9a\x01:\x03\ +\x1f\xff\x85\x01:\x03 \xff\x9a\x01:\x03!\xff\x85\x01\ +:\x03\x22\xff\x9a\x01:\x03#\xff\x85\x01:\x03%\xff\ +\x85\x01:\x03&\xff\x9a\x01:\x03'\xff\x85\x01:\x03\ +(\xff\x9a\x01:\x03)\xff\x85\x01:\x03*\xff\x9a\x01\ +:\x03+\xff\x85\x01:\x03,\xff\x9a\x01:\x03-\xff\ +\x85\x01:\x03.\xff\x9a\x01:\x03/\xff\x85\x01:\x03\ +0\xff\x9a\x01:\x031\xff\x85\x01:\x032\xff\x9a\x01\ +:\x033\xff\x85\x01:\x034\xff\x9a\x01:\x036\xff\ +\x9a\x01:\x038\xff\x9a\x01:\x03:\xff\x9a\x01:\x03\ +<\xff\x9a\x01:\x03@\xff\x9a\x01:\x03B\xff\x9a\x01\ +:\x03D\xff\x9a\x01:\x03I\xff\xd7\x01:\x03J\xff\ +\x9a\x01:\x03K\xff\xd7\x01:\x03L\xff\x9a\x01:\x03\ +M\xff\xd7\x01:\x03N\xff\x9a\x01:\x03O\xff\xd7\x01\ +:\x03Q\xff\xd7\x01:\x03R\xff\x9a\x01:\x03S\xff\ +\xd7\x01:\x03T\xff\x9a\x01:\x03U\xff\xd7\x01:\x03\ +V\xff\x9a\x01:\x03W\xff\xd7\x01:\x03X\xff\x9a\x01\ +:\x03Y\xff\xd7\x01:\x03Z\xff\x9a\x01:\x03[\xff\ +\xd7\x01:\x03\x5c\xff\x9a\x01:\x03]\xff\xd7\x01:\x03\ +^\xff\x9a\x01:\x03_\xff\xd7\x01:\x03`\xff\x9a\x01\ +:\x03b\xff\xc3\x01:\x03d\xff\xc3\x01:\x03f\xff\ +\xc3\x01:\x03h\xff\xc3\x01:\x03j\xff\xc3\x01:\x03\ +l\xff\xc3\x01:\x03n\xff\xc3\x01;\x00&\xff\xec\x01\ +;\x00*\xff\xec\x01;\x002\xff\xec\x01;\x004\xff\ +\xec\x01;\x00\x89\xff\xec\x01;\x00\x94\xff\xec\x01;\x00\ +\x95\xff\xec\x01;\x00\x96\xff\xec\x01;\x00\x97\xff\xec\x01\ +;\x00\x98\xff\xec\x01;\x00\x9a\xff\xec\x01;\x00\xc8\xff\ +\xec\x01;\x00\xca\xff\xec\x01;\x00\xcc\xff\xec\x01;\x00\ +\xce\xff\xec\x01;\x00\xde\xff\xec\x01;\x00\xe0\xff\xec\x01\ +;\x00\xe2\xff\xec\x01;\x00\xe4\xff\xec\x01;\x01\x0e\xff\ +\xec\x01;\x01\x10\xff\xec\x01;\x01\x12\xff\xec\x01;\x01\ +\x14\xff\xec\x01;\x01G\xff\xec\x01;\x02_\xff\xec\x01\ +;\x03I\xff\xec\x01;\x03K\xff\xec\x01;\x03M\xff\ +\xec\x01;\x03O\xff\xec\x01;\x03Q\xff\xec\x01;\x03\ +S\xff\xec\x01;\x03U\xff\xec\x01;\x03W\xff\xec\x01\ +;\x03Y\xff\xec\x01;\x03[\xff\xec\x01;\x03]\xff\ +\xec\x01;\x03_\xff\xec\x01=\x00&\xff\xec\x01=\x00\ +*\xff\xec\x01=\x002\xff\xec\x01=\x004\xff\xec\x01\ +=\x00\x89\xff\xec\x01=\x00\x94\xff\xec\x01=\x00\x95\xff\ +\xec\x01=\x00\x96\xff\xec\x01=\x00\x97\xff\xec\x01=\x00\ +\x98\xff\xec\x01=\x00\x9a\xff\xec\x01=\x00\xc8\xff\xec\x01\ +=\x00\xca\xff\xec\x01=\x00\xcc\xff\xec\x01=\x00\xce\xff\ +\xec\x01=\x00\xde\xff\xec\x01=\x00\xe0\xff\xec\x01=\x00\ +\xe2\xff\xec\x01=\x00\xe4\xff\xec\x01=\x01\x0e\xff\xec\x01\ +=\x01\x10\xff\xec\x01=\x01\x12\xff\xec\x01=\x01\x14\xff\ +\xec\x01=\x01G\xff\xec\x01=\x02_\xff\xec\x01=\x03\ +I\xff\xec\x01=\x03K\xff\xec\x01=\x03M\xff\xec\x01\ +=\x03O\xff\xec\x01=\x03Q\xff\xec\x01=\x03S\xff\ +\xec\x01=\x03U\xff\xec\x01=\x03W\xff\xec\x01=\x03\ +Y\xff\xec\x01=\x03[\xff\xec\x01=\x03]\xff\xec\x01\ +=\x03_\xff\xec\x01?\x00&\xff\xec\x01?\x00*\xff\ +\xec\x01?\x002\xff\xec\x01?\x004\xff\xec\x01?\x00\ +\x89\xff\xec\x01?\x00\x94\xff\xec\x01?\x00\x95\xff\xec\x01\ +?\x00\x96\xff\xec\x01?\x00\x97\xff\xec\x01?\x00\x98\xff\ +\xec\x01?\x00\x9a\xff\xec\x01?\x00\xc8\xff\xec\x01?\x00\ +\xca\xff\xec\x01?\x00\xcc\xff\xec\x01?\x00\xce\xff\xec\x01\ +?\x00\xde\xff\xec\x01?\x00\xe0\xff\xec\x01?\x00\xe2\xff\ +\xec\x01?\x00\xe4\xff\xec\x01?\x01\x0e\xff\xec\x01?\x01\ +\x10\xff\xec\x01?\x01\x12\xff\xec\x01?\x01\x14\xff\xec\x01\ +?\x01G\xff\xec\x01?\x02_\xff\xec\x01?\x03I\xff\ +\xec\x01?\x03K\xff\xec\x01?\x03M\xff\xec\x01?\x03\ +O\xff\xec\x01?\x03Q\xff\xec\x01?\x03S\xff\xec\x01\ +?\x03U\xff\xec\x01?\x03W\xff\xec\x01?\x03Y\xff\ +\xec\x01?\x03[\xff\xec\x01?\x03]\xff\xec\x01?\x03\ +_\xff\xec\x01C\x00\x05\xffq\x01C\x00\x0a\xffq\x01\ +C\x00&\xff\xd7\x01C\x00*\xff\xd7\x01C\x00-\x01\ +\x0a\x01C\x002\xff\xd7\x01C\x004\xff\xd7\x01C\x00\ +7\xffq\x01C\x009\xff\xae\x01C\x00:\xff\xae\x01\ +C\x00<\xff\x85\x01C\x00\x89\xff\xd7\x01C\x00\x94\xff\ +\xd7\x01C\x00\x95\xff\xd7\x01C\x00\x96\xff\xd7\x01C\x00\ +\x97\xff\xd7\x01C\x00\x98\xff\xd7\x01C\x00\x9a\xff\xd7\x01\ +C\x00\x9f\xff\x85\x01C\x00\xc8\xff\xd7\x01C\x00\xca\xff\ +\xd7\x01C\x00\xcc\xff\xd7\x01C\x00\xce\xff\xd7\x01C\x00\ +\xde\xff\xd7\x01C\x00\xe0\xff\xd7\x01C\x00\xe2\xff\xd7\x01\ +C\x00\xe4\xff\xd7\x01C\x01\x0e\xff\xd7\x01C\x01\x10\xff\ +\xd7\x01C\x01\x12\xff\xd7\x01C\x01\x14\xff\xd7\x01C\x01\ +$\xffq\x01C\x01&\xffq\x01C\x016\xff\xae\x01\ +C\x018\xff\x85\x01C\x01:\xff\x85\x01C\x01G\xff\ +\xd7\x01C\x01\xfa\xff\xae\x01C\x01\xfc\xff\xae\x01C\x01\ +\xfe\xff\xae\x01C\x02\x00\xff\x85\x01C\x02\x07\xffq\x01\ +C\x02\x0b\xffq\x01C\x02_\xff\xd7\x01C\x03I\xff\ +\xd7\x01C\x03K\xff\xd7\x01C\x03M\xff\xd7\x01C\x03\ +O\xff\xd7\x01C\x03Q\xff\xd7\x01C\x03S\xff\xd7\x01\ +C\x03U\xff\xd7\x01C\x03W\xff\xd7\x01C\x03Y\xff\ +\xd7\x01C\x03[\xff\xd7\x01C\x03]\xff\xd7\x01C\x03\ +_\xff\xd7\x01C\x03o\xff\x85\x01C\x03q\xff\x85\x01\ +C\x03s\xff\x85\x01C\x03\x8f\xffq\x01D\x00\x05\xff\ +\xec\x01D\x00\x0a\xff\xec\x01D\x02\x07\xff\xec\x01D\x02\ +\x0b\xff\xec\x01E\x00-\x00{\x01G\x00\x0f\xff\xae\x01\ +G\x00\x11\xff\xae\x01G\x00$\xff\xd7\x01G\x007\xff\ +\xc3\x01G\x009\xff\xec\x01G\x00:\xff\xec\x01G\x00\ +;\xff\xd7\x01G\x00<\xff\xec\x01G\x00=\xff\xec\x01\ +G\x00\x82\xff\xd7\x01G\x00\x83\xff\xd7\x01G\x00\x84\xff\ +\xd7\x01G\x00\x85\xff\xd7\x01G\x00\x86\xff\xd7\x01G\x00\ +\x87\xff\xd7\x01G\x00\x9f\xff\xec\x01G\x00\xc2\xff\xd7\x01\ +G\x00\xc4\xff\xd7\x01G\x00\xc6\xff\xd7\x01G\x01$\xff\ +\xc3\x01G\x01&\xff\xc3\x01G\x016\xff\xec\x01G\x01\ +8\xff\xec\x01G\x01:\xff\xec\x01G\x01;\xff\xec\x01\ +G\x01=\xff\xec\x01G\x01?\xff\xec\x01G\x01C\xff\ +\xd7\x01G\x01\xa0\xff\xec\x01G\x01\xfa\xff\xec\x01G\x01\ +\xfc\xff\xec\x01G\x01\xfe\xff\xec\x01G\x02\x00\xff\xec\x01\ +G\x02\x08\xff\xae\x01G\x02\x0c\xff\xae\x01G\x02X\xff\ +\xd7\x01G\x03\x1d\xff\xd7\x01G\x03\x1f\xff\xd7\x01G\x03\ +!\xff\xd7\x01G\x03#\xff\xd7\x01G\x03%\xff\xd7\x01\ +G\x03'\xff\xd7\x01G\x03)\xff\xd7\x01G\x03+\xff\ +\xd7\x01G\x03-\xff\xd7\x01G\x03/\xff\xd7\x01G\x03\ +1\xff\xd7\x01G\x033\xff\xd7\x01G\x03o\xff\xec\x01\ +G\x03q\xff\xec\x01G\x03s\xff\xec\x01G\x03\x8f\xff\ +\xc3\x01V\x00\x05\xffq\x01V\x00\x0a\xffq\x01V\x01\ +f\xff\xd7\x01V\x01m\xff\xd7\x01V\x01q\xffq\x01\ +V\x01r\xff\x85\x01V\x01s\xff\xd7\x01V\x01u\xff\ +\xae\x01V\x01x\xff\x85\x01V\x02\x07\xffq\x01V\x02\ +\x0b\xffq\x01V\x02T\xff\x85\x01[\x00\x0f\xff\xae\x01\ +[\x00\x11\xff\xae\x01[\x01V\xff\xd7\x01[\x01_\xff\ +\xd7\x01[\x01b\xff\xd7\x01[\x01d\xff\xec\x01[\x01\ +i\xff\xd7\x01[\x01p\xff\xec\x01[\x01q\xff\xc3\x01\ +[\x01r\xff\xec\x01[\x01t\xff\xd7\x01[\x01u\xff\ +\xec\x01[\x01x\xff\xec\x01[\x01\x88\xff\xec\x01[\x02\ +\x08\xff\xae\x01[\x02\x0c\xff\xae\x01[\x02T\xff\xec\x01\ +\x5c\x00\x0f\xff\x85\x01\x5c\x00\x11\xff\x85\x01\x5c\x01V\xff\ +\x85\x01\x5c\x01_\xff\x85\x01\x5c\x01b\xff\x85\x01\x5c\x01\ +f\xff\xd7\x01\x5c\x01i\xff\x85\x01\x5c\x01m\xff\xd7\x01\ +\x5c\x01s\xff\xc3\x01\x5c\x01v\xff\xec\x01\x5c\x01y\xff\ +\x9a\x01\x5c\x01z\xff\xae\x01\x5c\x01{\xff\xc3\x01\x5c\x01\ +|\xff\xc3\x01\x5c\x01}\xff\xc3\x01\x5c\x01~\xff\x9a\x01\ +\x5c\x01\x81\xff\xc3\x01\x5c\x01\x82\xff\xae\x01\x5c\x01\x84\xff\ +\xc3\x01\x5c\x01\x86\xff\xc3\x01\x5c\x01\x87\xff\xc3\x01\x5c\x01\ +\x89\xff\xc3\x01\x5c\x01\x8c\xff\x9a\x01\x5c\x01\x8e\xff\x9a\x01\ +\x5c\x01\x8f\xff\x9a\x01\x5c\x01\x90\xff\x9a\x01\x5c\x01\x92\xff\ +\xc3\x01\x5c\x01\x93\xff\x9a\x01\x5c\x01\x95\xff\xc3\x01\x5c\x01\ +\x96\xff\xc3\x01\x5c\x01\x98\xff\xc3\x01\x5c\x01\x99\xff\x9a\x01\ +\x5c\x01\x9a\xff\xc3\x01\x5c\x01\x9b\xff\xc3\x01\x5c\x02\x08\xff\ +\x85\x01\x5c\x02\x0c\xff\x85\x01\x5c\x02!\xff\xec\x01]\x01\ +q\xff\xd7\x01]\x01r\xff\xec\x01]\x01x\xff\xec\x01\ +]\x02T\xff\xec\x01^\x00\x05\xff\xd7\x01^\x00\x0a\xff\ +\xd7\x01^\x02\x07\xff\xd7\x01^\x02\x0b\xff\xd7\x01_\x00\ +\x05\xffq\x01_\x00\x0a\xffq\x01_\x01f\xff\xd7\x01\ +_\x01m\xff\xd7\x01_\x01q\xffq\x01_\x01r\xff\ +\x85\x01_\x01s\xff\xd7\x01_\x01u\xff\xae\x01_\x01\ +x\xff\x85\x01_\x02\x07\xffq\x01_\x02\x0b\xffq\x01\ +_\x02T\xff\x85\x01`\x00\x0f\xff\xae\x01`\x00\x11\xff\ +\xae\x01`\x01V\xff\xd7\x01`\x01_\xff\xd7\x01`\x01\ +b\xff\xd7\x01`\x01i\xff\xd7\x01`\x01t\xff\xd7\x01\ +`\x02\x08\xff\xae\x01`\x02\x0c\xff\xae\x01a\x00\x0f\xff\ +\x85\x01a\x00\x10\xff\xae\x01a\x00\x11\xff\x85\x01a\x01\ +V\xff\x5c\x01a\x01_\xff\x5c\x01a\x01b\xff\x5c\x01\ +a\x01f\xff\xc3\x01a\x01i\xff\x5c\x01a\x01m\xff\ +\xc3\x01a\x01s\xff\x9a\x01a\x01v\xff\xc3\x01a\x01\ +y\xffq\x01a\x01z\xff\x9a\x01a\x01{\xff\x9a\x01\ +a\x01|\xff\xae\x01a\x01}\xff\x9a\x01a\x01~\xff\ +q\x01a\x01\x80\xff\xd7\x01a\x01\x81\xff\xc3\x01a\x01\ +\x82\xff\x9a\x01a\x01\x84\xff\x9a\x01a\x01\x86\xff\xae\x01\ +a\x01\x87\xff\x9a\x01a\x01\x89\xff\x9a\x01a\x01\x8a\xff\ +\xd7\x01a\x01\x8c\xffq\x01a\x01\x8e\xff\x9a\x01a\x01\ +\x8f\xffq\x01a\x01\x90\xffq\x01a\x01\x92\xff\x9a\x01\ +a\x01\x93\xffq\x01a\x01\x94\xff\xd7\x01a\x01\x95\xff\ +\x9a\x01a\x01\x96\xff\x9a\x01a\x01\x98\xff\x9a\x01a\x01\ +\x99\xffq\x01a\x01\x9a\xff\x9a\x01a\x01\x9b\xff\x9a\x01\ +a\x02\x02\xff\xae\x01a\x02\x03\xff\xae\x01a\x02\x04\xff\ +\xae\x01a\x02\x08\xff\x85\x01a\x02\x0c\xff\x85\x01a\x02\ +!\xff\xc3\x01a\x02S\xff\xd7\x01b\x00\x05\xffq\x01\ +b\x00\x0a\xffq\x01b\x01f\xff\xd7\x01b\x01m\xff\ +\xd7\x01b\x01q\xffq\x01b\x01r\xff\x85\x01b\x01\ +s\xff\xd7\x01b\x01u\xff\xae\x01b\x01x\xff\x85\x01\ +b\x02\x07\xffq\x01b\x02\x0b\xffq\x01b\x02T\xff\ +\x85\x01d\x01f\xff\xec\x01d\x01m\xff\xec\x01d\x01\ +s\xff\xc3\x01f\x00\x0f\xff\xae\x01f\x00\x11\xff\xae\x01\ +f\x01V\xff\xd7\x01f\x01_\xff\xd7\x01f\x01b\xff\ +\xd7\x01f\x01d\xff\xec\x01f\x01i\xff\xd7\x01f\x01\ +p\xff\xec\x01f\x01q\xff\xc3\x01f\x01r\xff\xec\x01\ +f\x01t\xff\xd7\x01f\x01u\xff\xec\x01f\x01x\xff\ +\xec\x01f\x01\x88\xff\xec\x01f\x02\x08\xff\xae\x01f\x02\ +\x0c\xff\xae\x01f\x02T\xff\xec\x01h\x01f\xff\xd7\x01\ +h\x01m\xff\xd7\x01h\x01s\xff\xc3\x01h\x01\x8d\xff\ +\xec\x01h\x01\x91\xff\xec\x01i\x00\x05\xffq\x01i\x00\ +\x0a\xffq\x01i\x01f\xff\xd7\x01i\x01m\xff\xd7\x01\ +i\x01q\xffq\x01i\x01r\xff\x85\x01i\x01s\xff\ +\xd7\x01i\x01u\xff\xae\x01i\x01x\xff\x85\x01i\x02\ +\x07\xffq\x01i\x02\x0b\xffq\x01i\x02T\xff\x85\x01\ +m\x00\x0f\xff\xae\x01m\x00\x11\xff\xae\x01m\x01V\xff\ +\xd7\x01m\x01_\xff\xd7\x01m\x01b\xff\xd7\x01m\x01\ +d\xff\xec\x01m\x01i\xff\xd7\x01m\x01p\xff\xec\x01\ +m\x01q\xff\xc3\x01m\x01r\xff\xec\x01m\x01t\xff\ +\xd7\x01m\x01u\xff\xec\x01m\x01x\xff\xec\x01m\x01\ +\x88\xff\xec\x01m\x02\x08\xff\xae\x01m\x02\x0c\xff\xae\x01\ +m\x02T\xff\xec\x01o\x00\x0f\xfe\xf6\x01o\x00\x11\xfe\ +\xf6\x01o\x01V\xff\x9a\x01o\x01_\xff\x9a\x01o\x01\ +b\xff\x9a\x01o\x01d\xff\xec\x01o\x01i\xff\x9a\x01\ +o\x01t\xff\xd7\x01o\x01\x88\xff\xd7\x01o\x02\x08\xfe\ +\xf6\x01o\x02\x0c\xfe\xf6\x01q\x00\x0f\xff\x85\x01q\x00\ +\x10\xff\xae\x01q\x00\x11\xff\x85\x01q\x01V\xff\x5c\x01\ +q\x01_\xff\x5c\x01q\x01b\xff\x5c\x01q\x01f\xff\ +\xc3\x01q\x01i\xff\x5c\x01q\x01m\xff\xc3\x01q\x01\ +s\xff\x9a\x01q\x01v\xff\xc3\x01q\x01y\xffq\x01\ +q\x01z\xff\x9a\x01q\x01{\xff\x9a\x01q\x01|\xff\ +\xae\x01q\x01}\xff\x9a\x01q\x01~\xffq\x01q\x01\ +\x80\xff\xd7\x01q\x01\x81\xff\xc3\x01q\x01\x82\xff\x9a\x01\ +q\x01\x84\xff\x9a\x01q\x01\x86\xff\xae\x01q\x01\x87\xff\ +\x9a\x01q\x01\x89\xff\x9a\x01q\x01\x8a\xff\xd7\x01q\x01\ +\x8c\xffq\x01q\x01\x8e\xff\x9a\x01q\x01\x8f\xffq\x01\ +q\x01\x90\xffq\x01q\x01\x92\xff\x9a\x01q\x01\x93\xff\ +q\x01q\x01\x94\xff\xd7\x01q\x01\x95\xff\x9a\x01q\x01\ +\x96\xff\x9a\x01q\x01\x98\xff\x9a\x01q\x01\x99\xffq\x01\ +q\x01\x9a\xff\x9a\x01q\x01\x9b\xff\x9a\x01q\x02\x02\xff\ +\xae\x01q\x02\x03\xff\xae\x01q\x02\x04\xff\xae\x01q\x02\ +\x08\xff\x85\x01q\x02\x0c\xff\x85\x01q\x02!\xff\xc3\x01\ +q\x02S\xff\xd7\x01r\x00\x0f\xff\x85\x01r\x00\x11\xff\ +\x85\x01r\x01V\xff\x85\x01r\x01_\xff\x85\x01r\x01\ +b\xff\x85\x01r\x01f\xff\xd7\x01r\x01i\xff\x85\x01\ +r\x01m\xff\xd7\x01r\x01s\xff\xc3\x01r\x01v\xff\ +\xec\x01r\x01y\xff\x9a\x01r\x01z\xff\xae\x01r\x01\ +{\xff\xc3\x01r\x01|\xff\xc3\x01r\x01}\xff\xc3\x01\ +r\x01~\xff\x9a\x01r\x01\x81\xff\xc3\x01r\x01\x82\xff\ +\xae\x01r\x01\x84\xff\xc3\x01r\x01\x86\xff\xc3\x01r\x01\ +\x87\xff\xc3\x01r\x01\x89\xff\xc3\x01r\x01\x8c\xff\x9a\x01\ +r\x01\x8e\xff\x9a\x01r\x01\x8f\xff\x9a\x01r\x01\x90\xff\ +\x9a\x01r\x01\x92\xff\xc3\x01r\x01\x93\xff\x9a\x01r\x01\ +\x95\xff\xc3\x01r\x01\x96\xff\xc3\x01r\x01\x98\xff\xc3\x01\ +r\x01\x99\xff\x9a\x01r\x01\x9a\xff\xc3\x01r\x01\x9b\xff\ +\xc3\x01r\x02\x08\xff\x85\x01r\x02\x0c\xff\x85\x01r\x02\ +!\xff\xec\x01s\x00\x0f\xff\x9a\x01s\x00\x11\xff\x9a\x01\ +s\x01V\xff\xd7\x01s\x01_\xff\xd7\x01s\x01b\xff\ +\xd7\x01s\x01d\xff\xc3\x01s\x01i\xff\xd7\x01s\x01\ +p\xff\xec\x01s\x01q\xff\xae\x01s\x01r\xff\xc3\x01\ +s\x01t\xff\xec\x01s\x01x\xff\xc3\x01s\x01\x88\xff\ +\xec\x01s\x02\x08\xff\x9a\x01s\x02\x0c\xff\x9a\x01s\x02\ +T\xff\xc3\x01t\x01f\xff\xd7\x01t\x01m\xff\xd7\x01\ +t\x01s\xff\xc3\x01t\x01\x8d\xff\xec\x01t\x01\x91\xff\ +\xec\x01u\x00\x0f\xff\x85\x01u\x00\x11\xff\x85\x01u\x01\ +V\xff\xae\x01u\x01_\xff\xae\x01u\x01b\xff\xae\x01\ +u\x01f\xff\xec\x01u\x01i\xff\xae\x01u\x01m\xff\ +\xec\x01u\x02\x08\xff\x85\x01u\x02\x0c\xff\x85\x01v\x01\ +q\xff\xd7\x01v\x01r\xff\xec\x01v\x01x\xff\xec\x01\ +v\x02T\xff\xec\x01x\x00\x0f\xff\x85\x01x\x00\x11\xff\ +\x85\x01x\x01V\xff\x85\x01x\x01_\xff\x85\x01x\x01\ +b\xff\x85\x01x\x01f\xff\xd7\x01x\x01i\xff\x85\x01\ +x\x01m\xff\xd7\x01x\x01s\xff\xc3\x01x\x01v\xff\ +\xec\x01x\x01y\xff\x9a\x01x\x01z\xff\xae\x01x\x01\ +{\xff\xc3\x01x\x01|\xff\xc3\x01x\x01}\xff\xc3\x01\ +x\x01~\xff\x9a\x01x\x01\x81\xff\xc3\x01x\x01\x82\xff\ +\xae\x01x\x01\x84\xff\xc3\x01x\x01\x86\xff\xc3\x01x\x01\ +\x87\xff\xc3\x01x\x01\x89\xff\xc3\x01x\x01\x8c\xff\x9a\x01\ +x\x01\x8e\xff\x9a\x01x\x01\x8f\xff\x9a\x01x\x01\x90\xff\ +\x9a\x01x\x01\x92\xff\xc3\x01x\x01\x93\xff\x9a\x01x\x01\ +\x95\xff\xc3\x01x\x01\x96\xff\xc3\x01x\x01\x98\xff\xc3\x01\ +x\x01\x99\xff\x9a\x01x\x01\x9a\xff\xc3\x01x\x01\x9b\xff\ +\xc3\x01x\x02\x08\xff\x85\x01x\x02\x0c\xff\x85\x01x\x02\ +!\xff\xec\x01y\x01\x88\x00)\x01{\x00\x05\xff\xec\x01\ +{\x00\x0a\xff\xec\x01{\x02\x07\xff\xec\x01{\x02\x0b\xff\ +\xec\x01|\x00\x05\xff\xae\x01|\x00\x0a\xff\xae\x01|\x01\ +\x8d\xff\xec\x01|\x01\x91\xff\xec\x01|\x02\x07\xff\xae\x01\ +|\x02\x0b\xff\xae\x01~\x01\x88\x00)\x01\x80\x00\x0f\xff\ +\xae\x01\x80\x00\x11\xff\xae\x01\x80\x01\x88\xff\xec\x01\x80\x02\ +\x08\xff\xae\x01\x80\x02\x0c\xff\xae\x01\x83\x00\x10\xff\x9a\x01\ +\x83\x01y\xff\xd7\x01\x83\x01~\xff\xd7\x01\x83\x01\x81\xff\ +\xd7\x01\x83\x01\x8c\xff\xd7\x01\x83\x01\x8d\xff\xd7\x01\x83\x01\ +\x8f\xff\xd7\x01\x83\x01\x90\xff\xd7\x01\x83\x01\x91\xff\xd7\x01\ +\x83\x01\x93\xff\xd7\x01\x83\x01\x99\xff\xd7\x01\x83\x02\x02\xff\ +\x9a\x01\x83\x02\x03\xff\x9a\x01\x83\x02\x04\xff\x9a\x01\x84\x00\ +\x05\xff\xec\x01\x84\x00\x0a\xff\xec\x01\x84\x02\x07\xff\xec\x01\ +\x84\x02\x0b\xff\xec\x01\x85\x00\x0f\xff\xd7\x01\x85\x00\x11\xff\ +\xd7\x01\x85\x02\x08\xff\xd7\x01\x85\x02\x0c\xff\xd7\x01\x86\x00\ +\x05\xff\xae\x01\x86\x00\x0a\xff\xae\x01\x86\x01\x8d\xff\xec\x01\ +\x86\x01\x91\xff\xec\x01\x86\x02\x07\xff\xae\x01\x86\x02\x0b\xff\ +\xae\x01\x87\x01y\xff\xd7\x01\x87\x01~\xff\xd7\x01\x87\x01\ +\x8c\xff\xd7\x01\x87\x01\x8f\xff\xd7\x01\x87\x01\x90\xff\xd7\x01\ +\x87\x01\x93\xff\xd7\x01\x87\x01\x99\xff\xd7\x01\x88\x00\x05\xff\ +\x85\x01\x88\x00\x0a\xff\x85\x01\x88\x01y\xff\xec\x01\x88\x01\ +~\xff\xec\x01\x88\x01\x80\xff\xd7\x01\x88\x01\x8a\xff\xd7\x01\ +\x88\x01\x8c\xff\xec\x01\x88\x01\x8d\xff\xd7\x01\x88\x01\x8f\xff\ +\xec\x01\x88\x01\x90\xff\xec\x01\x88\x01\x91\xff\xd7\x01\x88\x01\ +\x93\xff\xec\x01\x88\x01\x99\xff\xec\x01\x88\x02\x07\xff\x85\x01\ +\x88\x02\x0b\xff\x85\x01\x8a\x00\x0f\xff\xae\x01\x8a\x00\x11\xff\ +\xae\x01\x8a\x01\x88\xff\xec\x01\x8a\x02\x08\xff\xae\x01\x8a\x02\ +\x0c\xff\xae\x01\x8c\x00\x05\xff\xec\x01\x8c\x00\x0a\xff\xec\x01\ +\x8c\x01\x80\xff\xd7\x01\x8c\x01\x8a\xff\xd7\x01\x8c\x02\x07\xff\ +\xec\x01\x8c\x02\x0b\xff\xec\x01\x8e\x00\x05\xff\xec\x01\x8e\x00\ +\x0a\xff\xec\x01\x8e\x01\x80\xff\xd7\x01\x8e\x01\x8a\xff\xd7\x01\ +\x8e\x02\x07\xff\xec\x01\x8e\x02\x0b\xff\xec\x01\x90\x00\x0f\xff\ +\xec\x01\x90\x00\x11\xff\xec\x01\x90\x02\x08\xff\xec\x01\x90\x02\ +\x0c\xff\xec\x01\x93\x00\x05\xff\xec\x01\x93\x00\x0a\xff\xec\x01\ +\x93\x01\x80\xff\xd7\x01\x93\x01\x8a\xff\xd7\x01\x93\x02\x07\xff\ +\xec\x01\x93\x02\x0b\xff\xec\x01\x94\x00\x0f\xff\xc3\x01\x94\x00\ +\x10\xff\xd7\x01\x94\x00\x11\xff\xc3\x01\x94\x01y\xff\xd7\x01\ +\x94\x01~\xff\xd7\x01\x94\x01\x81\xff\xd7\x01\x94\x01\x8c\xff\ +\xd7\x01\x94\x01\x8f\xff\xd7\x01\x94\x01\x90\xff\xd7\x01\x94\x01\ +\x93\xff\xd7\x01\x94\x01\x99\xff\xd7\x01\x94\x02\x02\xff\xd7\x01\ +\x94\x02\x03\xff\xd7\x01\x94\x02\x04\xff\xd7\x01\x94\x02\x08\xff\ +\xc3\x01\x94\x02\x0c\xff\xc3\x01\x97\x00\x05\xff\xd7\x01\x97\x00\ +\x0a\xff\xd7\x01\x97\x02\x07\xff\xd7\x01\x97\x02\x0b\xff\xd7\x01\ +\x99\x00\x05\xff\xec\x01\x99\x00\x0a\xff\xec\x01\x99\x01\x80\xff\ +\xd7\x01\x99\x01\x8a\xff\xd7\x01\x99\x02\x07\xff\xec\x01\x99\x02\ +\x0b\xff\xec\x01\x9d\x00\x05\xff\xae\x01\x9d\x00\x0a\xff\xae\x01\ +\x9d\x01\x9d\xff\x85\x01\x9d\x01\xa6\xff\x85\x01\x9d\x01\xa8\xff\ +\xd7\x01\x9d\x01\xbc\xff\x9a\x01\x9d\x01\xbd\xff\xd7\x01\x9d\x01\ +\xc1\xff\x9a\x01\x9d\x01\xc4\xff\x85\x01\x9d\x01\xdc\xff\xd7\x01\ +\x9d\x01\xdd\xff\xd7\x01\x9d\x01\xe1\xff\xd7\x01\x9d\x01\xe4\xff\ +\xd7\x01\x9d\x01\xf6\xff\xd7\x01\x9d\x02\x07\xff\xae\x01\x9d\x02\ +\x0b\xff\xae\x01\x9d\x02n\xff\xae\x01\x9d\x02|\xff\x9a\x01\ +\x9d\x02\x80\xff\xae\x01\x9d\x02\x82\xff\xae\x01\x9d\x02\x97\xff\ +\xae\x01\x9d\x02\x9b\xff\xae\x01\x9d\x02\xa7\xff\xae\x01\x9d\x02\ +\xa9\xff\x85\x01\x9d\x02\xaa\xff\xd7\x01\x9d\x02\xb5\xff\x9a\x01\ +\x9d\x02\xb6\xff\xd7\x01\x9d\x02\xb7\xff\x9a\x01\x9d\x02\xb8\xff\ +\xd7\x01\x9d\x02\xb9\xff\x9a\x01\x9d\x02\xba\xff\xd7\x01\x9d\x02\ +\xbd\xff\x85\x01\x9d\x02\xbe\xff\xd7\x01\x9d\x02\xbf\xff\x9a\x01\ +\x9d\x02\xc0\xff\xd7\x01\x9d\x02\xc1\xff\x9a\x01\x9d\x02\xc2\xff\ +\xd7\x01\x9d\x02\xd4\xff\x9a\x01\x9d\x02\xd5\xff\xd7\x01\x9d\x02\ +\xf7\xff\xd7\x01\x9d\x02\xf8\xff\xd7\x01\x9d\x02\xf9\xff\xd7\x01\ +\x9d\x02\xfa\xff\xd7\x01\x9d\x02\xfb\xff\xd7\x01\x9d\x02\xfc\xff\ +\xd7\x01\x9d\x02\xfd\xff\x9a\x01\x9d\x02\xfe\xff\xd7\x01\x9d\x03\ +\x03\xff\xae\x01\x9d\x03\x0d\xff\x9a\x01\x9d\x03\x0e\xff\xc3\x01\ +\x9d\x03\x0f\xff\x9a\x01\x9d\x03\x10\xff\xc3\x01\x9d\x03\x17\xff\ +\x85\x01\x9d\x03\x18\xff\xd7\x01\x9e\x00\x0f\xff\x85\x01\x9e\x00\ +\x10\xff\xae\x01\x9e\x00\x11\xff\x85\x01\x9e\x01\x9f\xff\xd7\x01\ +\x9e\x01\xa4\xff\x9a\x01\x9e\x01\xaa\xffq\x01\x9e\x01\xae\xff\ +\x9a\x01\x9e\x01\xb5\xff\x9a\x01\x9e\x01\xb8\xff\xd7\x01\x9e\x01\ +\xbb\xff\xd7\x01\x9e\x01\xbc\x00)\x01\x9e\x01\xbe\xff\xae\x01\ +\x9e\x01\xcc\xff\x9a\x01\x9e\x01\xcd\xff\x9a\x01\x9e\x01\xce\xff\ +\x85\x01\x9e\x01\xcf\xffq\x01\x9e\x01\xd0\xff\xd7\x01\x9e\x01\ +\xd1\xff\xd7\x01\x9e\x01\xd2\xff\x9a\x01\x9e\x01\xd3\xff\x9a\x01\ +\x9e\x01\xd4\xff\x9a\x01\x9e\x01\xd5\xff\x85\x01\x9e\x01\xd6\xff\ +\x9a\x01\x9e\x01\xd7\xff\x9a\x01\x9e\x01\xd8\xffq\x01\x9e\x01\ +\xd9\xff\x9a\x01\x9e\x01\xda\xff\x9a\x01\x9e\x01\xdb\xffq\x01\ +\x9e\x01\xdc\xff\xae\x01\x9e\x01\xdd\xff\xae\x01\x9e\x01\xde\xff\ +q\x01\x9e\x01\xdf\xff\xd7\x01\x9e\x01\xe0\xff\x9a\x01\x9e\x01\ +\xe1\xff\x9a\x01\x9e\x01\xe2\xff\x9a\x01\x9e\x01\xe3\xff\x9a\x01\ +\x9e\x01\xe4\xff\xae\x01\x9e\x01\xe5\xff\x9a\x01\x9e\x01\xe6\xff\ +\x9a\x01\x9e\x01\xe7\xff\xd7\x01\x9e\x01\xe8\xff\x9a\x01\x9e\x01\ +\xe9\xff\xc3\x01\x9e\x01\xea\xffq\x01\x9e\x01\xec\xff\x9a\x01\ +\x9e\x01\xed\xffq\x01\x9e\x01\xee\xff\x85\x01\x9e\x01\xf2\xff\ +\x85\x01\x9e\x01\xf3\xff\x9a\x01\x9e\x01\xf5\xff\x9a\x01\x9e\x01\ +\xf6\xff\xae\x01\x9e\x01\xf7\xff\x9a\x01\x9e\x01\xf9\xff\x9a\x01\ +\x9e\x02\x02\xff\xae\x01\x9e\x02\x03\xff\xae\x01\x9e\x02\x04\xff\ +\xae\x01\x9e\x02\x08\xff\x85\x01\x9e\x02\x0c\xff\x85\x01\x9e\x02\ +j\xffq\x01\x9e\x02k\xff\x9a\x01\x9e\x02l\xff\xd7\x01\ +\x9e\x02m\xff\xd7\x01\x9e\x02q\xff\x9a\x01\x9e\x02r\xff\ +q\x01\x9e\x02s\xff\x85\x01\x9e\x02u\xff\x9a\x01\x9e\x02\ +w\xff\x9a\x01\x9e\x02y\xff\x9a\x01\x9e\x02}\xff\x9a\x01\ +\x9e\x02~\xff\xd7\x01\x9e\x02\x7f\xffq\x01\x9e\x02\x81\xff\ +\xd7\x01\x9e\x02\x83\xff\xd7\x01\x9e\x02\x84\xff\xd7\x01\x9e\x02\ +\x85\xffq\x01\x9e\x02\x86\xff\xd7\x01\x9e\x02\x87\xffq\x01\ +\x9e\x02\x88\xff\xd7\x01\x9e\x02\x89\xffq\x01\x9e\x02\x8a\xff\ +\xd7\x01\x9e\x02\x8b\xff\xd7\x01\x9e\x02\x8c\xff\xd7\x01\x9e\x02\ +\x8d\xffq\x01\x9e\x02\x96\xff\x9a\x01\x9e\x02\x9a\xff\x9a\x01\ +\x9e\x02\x9e\xff\x9a\x01\x9e\x02\xa0\xff\xd7\x01\x9e\x02\xa2\xff\ +\xd7\x01\x9e\x02\xa4\xff\x9a\x01\x9e\x02\xa6\xff\x9a\x01\x9e\x02\ +\xaa\xff\xae\x01\x9e\x02\xac\xff\x9a\x01\x9e\x02\xae\xff\x9a\x01\ +\x9e\x02\xb0\xff\x9a\x01\x9e\x02\xb1\xff\xd7\x01\x9e\x02\xb2\xff\ +q\x01\x9e\x02\xb3\xff\xd7\x01\x9e\x02\xb4\xffq\x01\x9e\x02\ +\xb5\x00)\x01\x9e\x02\xb6\xff\xae\x01\x9e\x02\xb8\xff\xae\x01\ +\x9e\x02\xba\xff\xae\x01\x9e\x02\xbc\xff\xd7\x01\x9e\x02\xbe\xff\ +\xae\x01\x9e\x02\xc0\xff\x9a\x01\x9e\x02\xc2\xff\x9a\x01\x9e\x02\ +\xc4\xff\x9a\x01\x9e\x02\xc5\xff\x9a\x01\x9e\x02\xc6\xffq\x01\ +\x9e\x02\xc7\xff\x9a\x01\x9e\x02\xc8\xffq\x01\x9e\x02\xcb\xff\ +\xd7\x01\x9e\x02\xcd\xff\x9a\x01\x9e\x02\xce\xff\x9a\x01\x9e\x02\ +\xcf\xff\x85\x01\x9e\x02\xd1\xff\x9a\x01\x9e\x02\xd3\xff\x9a\x01\ +\x9e\x02\xd5\xff\x9a\x01\x9e\x02\xd7\xff\x9a\x01\x9e\x02\xd9\xff\ +q\x01\x9e\x02\xdb\xffq\x01\x9e\x02\xdd\xffq\x01\x9e\x02\ +\xe0\xffq\x01\x9e\x02\xe6\xff\xd7\x01\x9e\x02\xe8\xff\xd7\x01\ +\x9e\x02\xea\xff\xc3\x01\x9e\x02\xec\xff\x9a\x01\x9e\x02\xee\xff\ +\x9a\x01\x9e\x02\xef\xff\xd7\x01\x9e\x02\xf0\xffq\x01\x9e\x02\ +\xf1\xff\xd7\x01\x9e\x02\xf2\xffq\x01\x9e\x02\xf3\xff\xd7\x01\ +\x9e\x02\xf4\xffq\x01\x9e\x02\xf6\xff\xd7\x01\x9e\x02\xf8\xff\ +\xae\x01\x9e\x02\xfa\xff\xae\x01\x9e\x02\xfc\xff\xae\x01\x9e\x02\ +\xfe\xff\x9a\x01\x9e\x03\x00\xff\x9a\x01\x9e\x03\x02\xff\x9a\x01\ +\x9e\x03\x06\xff\xd7\x01\x9e\x03\x08\xff\xd7\x01\x9e\x03\x09\xff\ +q\x01\x9e\x03\x0a\xffq\x01\x9e\x03\x0b\xffq\x01\x9e\x03\ +\x0c\xffq\x01\x9e\x03\x0e\xff\x9a\x01\x9e\x03\x10\xff\x9a\x01\ +\x9e\x03\x11\xff\x9a\x01\x9e\x03\x12\xff\x85\x01\x9e\x03\x14\xff\ +\x9a\x01\x9e\x03\x15\xff\xd7\x01\x9e\x03\x16\xffq\x01\x9e\x03\ +\x18\xff\xae\x01\x9e\x03\x1a\xffq\x01\x9e\x03\x1b\xff\x9a\x01\ +\x9e\x03\x1c\xff\x85\x01\x9f\x01\x9f\xff\xd7\x01\x9f\x01\xb8\xff\ +\xd7\x01\x9f\x01\xbb\xff\xd7\x01\x9f\x01\xbe\xff\xd7\x01\x9f\x01\ +\xe1\xff\xd7\x01\x9f\x02l\xff\xd7\x01\x9f\x02~\xff\xd7\x01\ +\x9f\x02\x84\xff\xd7\x01\x9f\x02\x86\xff\xd7\x01\x9f\x02\x88\xff\ +\xd7\x01\x9f\x02\x8a\xff\xd7\x01\x9f\x02\x8c\xff\xd7\x01\x9f\x02\ +\xb1\xff\xd7\x01\x9f\x02\xb3\xff\xd7\x01\x9f\x02\xc0\xff\xd7\x01\ +\x9f\x02\xc2\xff\xd7\x01\x9f\x02\xc5\xff\xd7\x01\x9f\x02\xc7\xff\ +\xd7\x01\x9f\x02\xd5\xff\xd7\x01\x9f\x02\xef\xff\xd7\x01\x9f\x02\ +\xf1\xff\xd7\x01\x9f\x02\xf3\xff\xd7\x01\x9f\x02\xfe\xff\xd7\x01\ +\x9f\x03\x09\xff\xd7\x01\x9f\x03\x0b\xff\xd7\x01\x9f\x03\x0e\xff\ +\xd7\x01\x9f\x03\x10\xff\xd7\x01\x9f\x03\x15\xff\xd7\x01\xa0\x03\ +\x0e\xff\xd7\x01\xa0\x03\x10\xff\xd7\x01\xa4\x00\x05\xff\xae\x01\ +\xa4\x00\x0a\xff\xae\x01\xa4\x01\x9d\xff\x85\x01\xa4\x01\xa6\xff\ +\x85\x01\xa4\x01\xa8\xff\xd7\x01\xa4\x01\xbc\xff\x9a\x01\xa4\x01\ +\xbd\xff\xd7\x01\xa4\x01\xc1\xff\x9a\x01\xa4\x01\xc4\xff\x85\x01\ +\xa4\x01\xdc\xff\xd7\x01\xa4\x01\xdd\xff\xd7\x01\xa4\x01\xe1\xff\ +\xd7\x01\xa4\x01\xe4\xff\xd7\x01\xa4\x01\xf6\xff\xd7\x01\xa4\x02\ +\x07\xff\xae\x01\xa4\x02\x0b\xff\xae\x01\xa4\x02n\xff\xae\x01\ +\xa4\x02|\xff\x9a\x01\xa4\x02\x80\xff\xae\x01\xa4\x02\x82\xff\ +\xae\x01\xa4\x02\x97\xff\xae\x01\xa4\x02\x9b\xff\xae\x01\xa4\x02\ +\xa7\xff\xae\x01\xa4\x02\xa9\xff\x85\x01\xa4\x02\xaa\xff\xd7\x01\ +\xa4\x02\xb5\xff\x9a\x01\xa4\x02\xb6\xff\xd7\x01\xa4\x02\xb7\xff\ +\x9a\x01\xa4\x02\xb8\xff\xd7\x01\xa4\x02\xb9\xff\x9a\x01\xa4\x02\ +\xba\xff\xd7\x01\xa4\x02\xbd\xff\x85\x01\xa4\x02\xbe\xff\xd7\x01\ +\xa4\x02\xbf\xff\x9a\x01\xa4\x02\xc0\xff\xd7\x01\xa4\x02\xc1\xff\ +\x9a\x01\xa4\x02\xc2\xff\xd7\x01\xa4\x02\xd4\xff\x9a\x01\xa4\x02\ +\xd5\xff\xd7\x01\xa4\x02\xf7\xff\xd7\x01\xa4\x02\xf8\xff\xd7\x01\ +\xa4\x02\xf9\xff\xd7\x01\xa4\x02\xfa\xff\xd7\x01\xa4\x02\xfb\xff\ +\xd7\x01\xa4\x02\xfc\xff\xd7\x01\xa4\x02\xfd\xff\x9a\x01\xa4\x02\ +\xfe\xff\xd7\x01\xa4\x03\x03\xff\xae\x01\xa4\x03\x0d\xff\x9a\x01\ +\xa4\x03\x0e\xff\xc3\x01\xa4\x03\x0f\xff\x9a\x01\xa4\x03\x10\xff\ +\xc3\x01\xa4\x03\x17\xff\x85\x01\xa4\x03\x18\xff\xd7\x01\xa5\x00\ +\x05\xff\xae\x01\xa5\x00\x0a\xff\xae\x01\xa5\x01\x9d\xff\x85\x01\ +\xa5\x01\xa6\xff\x85\x01\xa5\x01\xa8\xff\xd7\x01\xa5\x01\xbc\xff\ +\x9a\x01\xa5\x01\xbd\xff\xd7\x01\xa5\x01\xc1\xff\x9a\x01\xa5\x01\ +\xc4\xff\x85\x01\xa5\x01\xdc\xff\xd7\x01\xa5\x01\xdd\xff\xd7\x01\ +\xa5\x01\xe1\xff\xd7\x01\xa5\x01\xe4\xff\xd7\x01\xa5\x01\xf6\xff\ +\xd7\x01\xa5\x02\x07\xff\xae\x01\xa5\x02\x0b\xff\xae\x01\xa5\x02\ +n\xff\xae\x01\xa5\x02|\xff\x9a\x01\xa5\x02\x80\xff\xae\x01\ +\xa5\x02\x82\xff\xae\x01\xa5\x02\x97\xff\xae\x01\xa5\x02\x9b\xff\ +\xae\x01\xa5\x02\xa7\xff\xae\x01\xa5\x02\xa9\xff\x85\x01\xa5\x02\ +\xaa\xff\xd7\x01\xa5\x02\xb5\xff\x9a\x01\xa5\x02\xb6\xff\xd7\x01\ +\xa5\x02\xb7\xff\x9a\x01\xa5\x02\xb8\xff\xd7\x01\xa5\x02\xb9\xff\ +\x9a\x01\xa5\x02\xba\xff\xd7\x01\xa5\x02\xbd\xff\x85\x01\xa5\x02\ +\xbe\xff\xd7\x01\xa5\x02\xbf\xff\x9a\x01\xa5\x02\xc0\xff\xd7\x01\ +\xa5\x02\xc1\xff\x9a\x01\xa5\x02\xc2\xff\xd7\x01\xa5\x02\xd4\xff\ +\x9a\x01\xa5\x02\xd5\xff\xd7\x01\xa5\x02\xf7\xff\xd7\x01\xa5\x02\ +\xf8\xff\xd7\x01\xa5\x02\xf9\xff\xd7\x01\xa5\x02\xfa\xff\xd7\x01\ +\xa5\x02\xfb\xff\xd7\x01\xa5\x02\xfc\xff\xd7\x01\xa5\x02\xfd\xff\ +\x9a\x01\xa5\x02\xfe\xff\xd7\x01\xa5\x03\x03\xff\xae\x01\xa5\x03\ +\x0d\xff\x9a\x01\xa5\x03\x0e\xff\xc3\x01\xa5\x03\x0f\xff\x9a\x01\ +\xa5\x03\x10\xff\xc3\x01\xa5\x03\x17\xff\x85\x01\xa5\x03\x18\xff\ +\xd7\x01\xa6\x00\x05\xff\xae\x01\xa6\x00\x0a\xff\xae\x01\xa6\x01\ +\x9d\xff\x85\x01\xa6\x01\xa6\xff\x85\x01\xa6\x01\xa8\xff\xd7\x01\ +\xa6\x01\xbc\xff\x9a\x01\xa6\x01\xbd\xff\xd7\x01\xa6\x01\xc1\xff\ +\x9a\x01\xa6\x01\xc4\xff\x85\x01\xa6\x01\xdc\xff\xd7\x01\xa6\x01\ +\xdd\xff\xd7\x01\xa6\x01\xe1\xff\xd7\x01\xa6\x01\xe4\xff\xd7\x01\ +\xa6\x01\xf6\xff\xd7\x01\xa6\x02\x07\xff\xae\x01\xa6\x02\x0b\xff\ +\xae\x01\xa6\x02n\xff\xae\x01\xa6\x02|\xff\x9a\x01\xa6\x02\ +\x80\xff\xae\x01\xa6\x02\x82\xff\xae\x01\xa6\x02\x97\xff\xae\x01\ +\xa6\x02\x9b\xff\xae\x01\xa6\x02\xa7\xff\xae\x01\xa6\x02\xa9\xff\ +\x85\x01\xa6\x02\xaa\xff\xd7\x01\xa6\x02\xb5\xff\x9a\x01\xa6\x02\ +\xb6\xff\xd7\x01\xa6\x02\xb7\xff\x9a\x01\xa6\x02\xb8\xff\xd7\x01\ +\xa6\x02\xb9\xff\x9a\x01\xa6\x02\xba\xff\xd7\x01\xa6\x02\xbd\xff\ +\x85\x01\xa6\x02\xbe\xff\xd7\x01\xa6\x02\xbf\xff\x9a\x01\xa6\x02\ +\xc0\xff\xd7\x01\xa6\x02\xc1\xff\x9a\x01\xa6\x02\xc2\xff\xd7\x01\ +\xa6\x02\xd4\xff\x9a\x01\xa6\x02\xd5\xff\xd7\x01\xa6\x02\xf7\xff\ +\xd7\x01\xa6\x02\xf8\xff\xd7\x01\xa6\x02\xf9\xff\xd7\x01\xa6\x02\ +\xfa\xff\xd7\x01\xa6\x02\xfb\xff\xd7\x01\xa6\x02\xfc\xff\xd7\x01\ +\xa6\x02\xfd\xff\x9a\x01\xa6\x02\xfe\xff\xd7\x01\xa6\x03\x03\xff\ +\xae\x01\xa6\x03\x0d\xff\x9a\x01\xa6\x03\x0e\xff\xc3\x01\xa6\x03\ +\x0f\xff\x9a\x01\xa6\x03\x10\xff\xc3\x01\xa6\x03\x17\xff\x85\x01\ +\xa6\x03\x18\xff\xd7\x01\xa7\x01\x9f\xff\xd7\x01\xa7\x01\xb8\xff\ +\xd7\x01\xa7\x01\xbb\xff\xd7\x01\xa7\x01\xbe\xff\xd7\x01\xa7\x01\ +\xc1\xff\xd7\x01\xa7\x01\xe1\xff\xd7\x01\xa7\x02l\xff\xd7\x01\ +\xa7\x02|\xff\xd7\x01\xa7\x02~\xff\xd7\x01\xa7\x02\x84\xff\ +\xd7\x01\xa7\x02\x86\xff\xd7\x01\xa7\x02\x88\xff\xd7\x01\xa7\x02\ +\x8a\xff\xd7\x01\xa7\x02\x8c\xff\xd7\x01\xa7\x02\xb1\xff\xd7\x01\ +\xa7\x02\xb3\xff\xd7\x01\xa7\x02\xbf\xff\xd7\x01\xa7\x02\xc0\xff\ +\xd7\x01\xa7\x02\xc1\xff\xd7\x01\xa7\x02\xc2\xff\xd7\x01\xa7\x02\ +\xc5\xff\x9a\x01\xa7\x02\xc7\xff\x9a\x01\xa7\x02\xd4\xff\xd7\x01\ +\xa7\x02\xd5\xff\xd7\x01\xa7\x02\xef\xff\xd7\x01\xa7\x02\xf1\xff\ +\xd7\x01\xa7\x02\xf3\xff\xd7\x01\xa7\x02\xfd\xff\xd7\x01\xa7\x02\ +\xfe\xff\xd7\x01\xa7\x03\x09\xff\xd7\x01\xa7\x03\x0b\xff\xd7\x01\ +\xa7\x03\x0e\xff\xd7\x01\xa7\x03\x10\xff\xd7\x01\xa7\x03\x15\xff\ +\xd7\x01\xa7\x03\x19\xff\xec\x01\xa8\x00\x0f\xff\x85\x01\xa8\x00\ +\x11\xff\x85\x01\xa8\x01\x9f\xff\xec\x01\xa8\x01\xa4\xff\x9a\x01\ +\xa8\x01\xaa\xffq\x01\xa8\x01\xae\xff\x9a\x01\xa8\x01\xb5\xff\ +\x9a\x01\xa8\x01\xb8\xff\xec\x01\xa8\x01\xbb\xff\xec\x01\xa8\x01\ +\xbe\xff\xc3\x01\xa8\x01\xc9\xff\xec\x01\xa8\x01\xce\xff\xae\x01\ +\xa8\x01\xcf\xff\xd7\x01\xa8\x01\xd5\xff\xae\x01\xa8\x01\xd8\xff\ +\xd7\x01\xa8\x01\xdb\xff\xd7\x01\xa8\x01\xde\xff\xd7\x01\xa8\x01\ +\xe1\xff\xd7\x01\xa8\x01\xea\xff\xd7\x01\xa8\x01\xeb\x00f\x01\ +\xa8\x01\xed\xff\xd7\x01\xa8\x01\xee\xff\xec\x01\xa8\x01\xf2\xff\ +\xae\x01\xa8\x01\xf4\x00f\x01\xa8\x02\x08\xff\x85\x01\xa8\x02\ +\x0c\xff\x85\x01\xa8\x02j\xff\xd7\x01\xa8\x02l\xff\xec\x01\ +\xa8\x02r\xffq\x01\xa8\x02s\xff\xae\x01\xa8\x02~\xff\ +\xec\x01\xa8\x02\x7f\xff\xd7\x01\xa8\x02\x84\xff\xec\x01\xa8\x02\ +\x85\xff\xd7\x01\xa8\x02\x86\xff\xec\x01\xa8\x02\x87\xff\xd7\x01\ +\xa8\x02\x88\xff\xec\x01\xa8\x02\x89\xff\xd7\x01\xa8\x02\x8a\xff\ +\xec\x01\xa8\x02\x8c\xff\xec\x01\xa8\x02\x8d\xff\xd7\x01\xa8\x02\ +\x98\x00f\x01\xa8\x02\xa8\x00f\x01\xa8\x02\xb1\xff\xec\x01\ +\xa8\x02\xb2\xff\xd7\x01\xa8\x02\xb3\xff\xec\x01\xa8\x02\xb4\xff\ +\xd7\x01\xa8\x02\xc0\xff\xd7\x01\xa8\x02\xc2\xff\xd7\x01\xa8\x02\ +\xc5\xff\xd7\x01\xa8\x02\xc6\xff\xc3\x01\xa8\x02\xc7\xff\xd7\x01\ +\xa8\x02\xc8\xff\xc3\x01\xa8\x02\xce\xff\x9a\x01\xa8\x02\xcf\xff\ +\xae\x01\xa8\x02\xd5\xff\xd7\x01\xa8\x02\xd9\xffq\x01\xa8\x02\ +\xdb\xffq\x01\xa8\x02\xdd\xffq\x01\xa8\x02\xe0\xff\xd7\x01\ +\xa8\x02\xef\xff\xec\x01\xa8\x02\xf0\xff\xd7\x01\xa8\x02\xf1\xff\ +\xec\x01\xa8\x02\xf2\xff\xd7\x01\xa8\x02\xf3\xff\xec\x01\xa8\x02\ +\xf4\xff\xd7\x01\xa8\x02\xfe\xff\xd7\x01\xa8\x03\x09\xffq\x01\ +\xa8\x03\x0a\xff\xd7\x01\xa8\x03\x0b\xffq\x01\xa8\x03\x0c\xff\ +\xd7\x01\xa8\x03\x11\xff\x9a\x01\xa8\x03\x12\xff\xae\x01\xa8\x03\ +\x15\xff\xec\x01\xa8\x03\x16\xff\xd7\x01\xa8\x03\x1a\xff\xd7\x01\ +\xa8\x03\x1b\xff\x9a\x01\xa8\x03\x1c\xff\xae\x01\xaa\x00\x05\xff\ +q\x01\xaa\x00\x0a\xffq\x01\xaa\x01\x9d\xff\x9a\x01\xaa\x01\ +\xa6\xff\x9a\x01\xaa\x01\xbc\xffq\x01\xaa\x01\xbe\xff\xd7\x01\ +\xaa\x01\xc1\xff\x9a\x01\xaa\x01\xc4\xff\x9a\x01\xaa\x01\xdc\xff\ +\xd7\x01\xaa\x01\xe1\xff\xd7\x01\xaa\x01\xe4\xff\xd7\x01\xaa\x02\ +\x07\xffq\x01\xaa\x02\x0b\xffq\x01\xaa\x02n\xff\xd7\x01\ +\xaa\x02|\xff\x9a\x01\xaa\x02\x80\xff\xae\x01\xaa\x02\x82\xff\ +\xae\x01\xaa\x02\x97\xff\xd7\x01\xaa\x02\x9b\xff\xd7\x01\xaa\x02\ +\xa7\xff\xd7\x01\xaa\x02\xa9\xff\x9a\x01\xaa\x02\xaa\xff\xd7\x01\ +\xaa\x02\xb5\xffq\x01\xaa\x02\xb6\xff\xd7\x01\xaa\x02\xb7\xff\ +\x85\x01\xaa\x02\xb9\xff\x85\x01\xaa\x02\xbd\xff\x9a\x01\xaa\x02\ +\xbe\xff\xd7\x01\xaa\x02\xbf\xff\x9a\x01\xaa\x02\xc0\xff\xd7\x01\ +\xaa\x02\xc1\xff\x9a\x01\xaa\x02\xc2\xff\xd7\x01\xaa\x02\xc5\xff\ +\x9a\x01\xaa\x02\xc7\xff\x9a\x01\xaa\x02\xd4\xff\x9a\x01\xaa\x02\ +\xd5\xff\xd7\x01\xaa\x02\xe1\xff\xd7\x01\xaa\x02\xe3\xff\xd7\x01\ +\xaa\x02\xfd\xff\x9a\x01\xaa\x02\xfe\xff\xd7\x01\xaa\x03\x03\xff\ +\xd7\x01\xaa\x03\x0d\xffq\x01\xaa\x03\x0e\xff\xd7\x01\xaa\x03\ +\x0f\xffq\x01\xaa\x03\x10\xff\xd7\x01\xaa\x03\x17\xff\x9a\x01\ +\xaa\x03\x18\xff\xd7\x01\xab\x00\x05\xff\xd7\x01\xab\x00\x0a\xff\ +\xd7\x01\xab\x01\xaa\xff\xec\x01\xab\x01\xc1\xff\xd7\x01\xab\x02\ +\x07\xff\xd7\x01\xab\x02\x0b\xff\xd7\x01\xab\x02r\xff\xec\x01\ +\xab\x02|\xff\xd7\x01\xab\x02\xbf\xff\xd7\x01\xab\x02\xc1\xff\ +\xd7\x01\xab\x02\xc5\xff\xd7\x01\xab\x02\xc7\xff\xd7\x01\xab\x02\ +\xd4\xff\xd7\x01\xab\x02\xd9\xff\xec\x01\xab\x02\xdb\xff\xec\x01\ +\xab\x02\xdd\xff\xec\x01\xab\x02\xfd\xff\xd7\x01\xac\x00\x0f\xff\ +\xae\x01\xac\x00\x11\xff\xae\x01\xac\x02\x08\xff\xae\x01\xac\x02\ +\x0c\xff\xae\x01\xac\x02\x80\xff\xec\x01\xac\x02\x82\xff\xec\x01\ +\xac\x02\xb7\xff\xec\x01\xac\x02\xb9\xff\xec\x01\xac\x03\x0d\xff\ +\xd7\x01\xac\x03\x0f\xff\xd7\x01\xad\x00\x0f\xff\x85\x01\xad\x00\ +\x10\xff\xae\x01\xad\x00\x11\xff\x85\x01\xad\x01\x9f\xff\xd7\x01\ +\xad\x01\xa4\xff\x9a\x01\xad\x01\xaa\xffq\x01\xad\x01\xae\xff\ +\x9a\x01\xad\x01\xb5\xff\x9a\x01\xad\x01\xb8\xff\xd7\x01\xad\x01\ +\xbb\xff\xd7\x01\xad\x01\xbc\x00)\x01\xad\x01\xbe\xff\xae\x01\ +\xad\x01\xcc\xff\x9a\x01\xad\x01\xcd\xff\x9a\x01\xad\x01\xce\xff\ +\x85\x01\xad\x01\xcf\xffq\x01\xad\x01\xd0\xff\xd7\x01\xad\x01\ +\xd1\xff\xd7\x01\xad\x01\xd2\xff\x9a\x01\xad\x01\xd3\xff\x9a\x01\ +\xad\x01\xd4\xff\x9a\x01\xad\x01\xd5\xff\x85\x01\xad\x01\xd6\xff\ +\x9a\x01\xad\x01\xd7\xff\x9a\x01\xad\x01\xd8\xffq\x01\xad\x01\ +\xd9\xff\x9a\x01\xad\x01\xda\xff\x9a\x01\xad\x01\xdb\xffq\x01\ +\xad\x01\xdc\xff\xae\x01\xad\x01\xdd\xff\xae\x01\xad\x01\xde\xff\ +q\x01\xad\x01\xdf\xff\xd7\x01\xad\x01\xe0\xff\x9a\x01\xad\x01\ +\xe1\xff\x9a\x01\xad\x01\xe2\xff\x9a\x01\xad\x01\xe3\xff\x9a\x01\ +\xad\x01\xe4\xff\xae\x01\xad\x01\xe5\xff\x9a\x01\xad\x01\xe6\xff\ +\x9a\x01\xad\x01\xe7\xff\xd7\x01\xad\x01\xe8\xff\x9a\x01\xad\x01\ +\xe9\xff\xc3\x01\xad\x01\xea\xffq\x01\xad\x01\xec\xff\x9a\x01\ +\xad\x01\xed\xffq\x01\xad\x01\xee\xff\x85\x01\xad\x01\xf2\xff\ +\x85\x01\xad\x01\xf3\xff\x9a\x01\xad\x01\xf5\xff\x9a\x01\xad\x01\ +\xf6\xff\xae\x01\xad\x01\xf7\xff\x9a\x01\xad\x01\xf9\xff\x9a\x01\ +\xad\x02\x02\xff\xae\x01\xad\x02\x03\xff\xae\x01\xad\x02\x04\xff\ +\xae\x01\xad\x02\x08\xff\x85\x01\xad\x02\x0c\xff\x85\x01\xad\x02\ +j\xffq\x01\xad\x02k\xff\x9a\x01\xad\x02l\xff\xd7\x01\ +\xad\x02m\xff\xd7\x01\xad\x02q\xff\x9a\x01\xad\x02r\xff\ +q\x01\xad\x02s\xff\x85\x01\xad\x02u\xff\x9a\x01\xad\x02\ +w\xff\x9a\x01\xad\x02y\xff\x9a\x01\xad\x02}\xff\x9a\x01\ +\xad\x02~\xff\xd7\x01\xad\x02\x7f\xffq\x01\xad\x02\x81\xff\ +\xd7\x01\xad\x02\x83\xff\xd7\x01\xad\x02\x84\xff\xd7\x01\xad\x02\ +\x85\xffq\x01\xad\x02\x86\xff\xd7\x01\xad\x02\x87\xffq\x01\ +\xad\x02\x88\xff\xd7\x01\xad\x02\x89\xffq\x01\xad\x02\x8a\xff\ +\xd7\x01\xad\x02\x8b\xff\xd7\x01\xad\x02\x8c\xff\xd7\x01\xad\x02\ +\x8d\xffq\x01\xad\x02\x96\xff\x9a\x01\xad\x02\x9a\xff\x9a\x01\ +\xad\x02\x9e\xff\x9a\x01\xad\x02\xa0\xff\xd7\x01\xad\x02\xa2\xff\ +\xd7\x01\xad\x02\xa4\xff\x9a\x01\xad\x02\xa6\xff\x9a\x01\xad\x02\ +\xaa\xff\xae\x01\xad\x02\xac\xff\x9a\x01\xad\x02\xae\xff\x9a\x01\ +\xad\x02\xb0\xff\x9a\x01\xad\x02\xb1\xff\xd7\x01\xad\x02\xb2\xff\ +q\x01\xad\x02\xb3\xff\xd7\x01\xad\x02\xb4\xffq\x01\xad\x02\ +\xb5\x00)\x01\xad\x02\xb6\xff\xae\x01\xad\x02\xb8\xff\xae\x01\ +\xad\x02\xba\xff\xae\x01\xad\x02\xbc\xff\xd7\x01\xad\x02\xbe\xff\ +\xae\x01\xad\x02\xc0\xff\x9a\x01\xad\x02\xc2\xff\x9a\x01\xad\x02\ +\xc4\xff\x9a\x01\xad\x02\xc5\xff\x9a\x01\xad\x02\xc6\xffq\x01\ +\xad\x02\xc7\xff\x9a\x01\xad\x02\xc8\xffq\x01\xad\x02\xcb\xff\ +\xd7\x01\xad\x02\xcd\xff\x9a\x01\xad\x02\xce\xff\x9a\x01\xad\x02\ +\xcf\xff\x85\x01\xad\x02\xd1\xff\x9a\x01\xad\x02\xd3\xff\x9a\x01\ +\xad\x02\xd5\xff\x9a\x01\xad\x02\xd7\xff\x9a\x01\xad\x02\xd9\xff\ +q\x01\xad\x02\xdb\xffq\x01\xad\x02\xdd\xffq\x01\xad\x02\ +\xe0\xffq\x01\xad\x02\xe6\xff\xd7\x01\xad\x02\xe8\xff\xd7\x01\ +\xad\x02\xea\xff\xc3\x01\xad\x02\xec\xff\x9a\x01\xad\x02\xee\xff\ +\x9a\x01\xad\x02\xef\xff\xd7\x01\xad\x02\xf0\xffq\x01\xad\x02\ +\xf1\xff\xd7\x01\xad\x02\xf2\xffq\x01\xad\x02\xf3\xff\xd7\x01\ +\xad\x02\xf4\xffq\x01\xad\x02\xf6\xff\xd7\x01\xad\x02\xf8\xff\ +\xae\x01\xad\x02\xfa\xff\xae\x01\xad\x02\xfc\xff\xae\x01\xad\x02\ +\xfe\xff\x9a\x01\xad\x03\x00\xff\x9a\x01\xad\x03\x02\xff\x9a\x01\ +\xad\x03\x06\xff\xd7\x01\xad\x03\x08\xff\xd7\x01\xad\x03\x09\xff\ +q\x01\xad\x03\x0a\xffq\x01\xad\x03\x0b\xffq\x01\xad\x03\ +\x0c\xffq\x01\xad\x03\x0e\xff\x9a\x01\xad\x03\x10\xff\x9a\x01\ +\xad\x03\x11\xff\x9a\x01\xad\x03\x12\xff\x85\x01\xad\x03\x14\xff\ +\x9a\x01\xad\x03\x15\xff\xd7\x01\xad\x03\x16\xffq\x01\xad\x03\ +\x18\xff\xae\x01\xad\x03\x1a\xffq\x01\xad\x03\x1b\xff\x9a\x01\ +\xad\x03\x1c\xff\x85\x01\xae\x01\xa3\x00\xe1\x01\xae\x02\xea\x00\ +)\x01\xae\x03\x0e\xff\xd7\x01\xae\x03\x10\xff\xd7\x01\xb0\x01\ +\x9f\xff\xd7\x01\xb0\x01\xb8\xff\xd7\x01\xb0\x01\xbb\xff\xd7\x01\ +\xb0\x01\xbe\xff\xd7\x01\xb0\x01\xc1\xff\xd7\x01\xb0\x01\xe1\xff\ +\xd7\x01\xb0\x02l\xff\xd7\x01\xb0\x02|\xff\xd7\x01\xb0\x02\ +~\xff\xd7\x01\xb0\x02\x84\xff\xd7\x01\xb0\x02\x86\xff\xd7\x01\ +\xb0\x02\x88\xff\xd7\x01\xb0\x02\x8a\xff\xd7\x01\xb0\x02\x8c\xff\ +\xd7\x01\xb0\x02\xb1\xff\xd7\x01\xb0\x02\xb3\xff\xd7\x01\xb0\x02\ +\xbf\xff\xd7\x01\xb0\x02\xc0\xff\xd7\x01\xb0\x02\xc1\xff\xd7\x01\ +\xb0\x02\xc2\xff\xd7\x01\xb0\x02\xc5\xff\x9a\x01\xb0\x02\xc7\xff\ +\x9a\x01\xb0\x02\xd4\xff\xd7\x01\xb0\x02\xd5\xff\xd7\x01\xb0\x02\ +\xef\xff\xd7\x01\xb0\x02\xf1\xff\xd7\x01\xb0\x02\xf3\xff\xd7\x01\ +\xb0\x02\xfd\xff\xd7\x01\xb0\x02\xfe\xff\xd7\x01\xb0\x03\x09\xff\ +\xd7\x01\xb0\x03\x0b\xff\xd7\x01\xb0\x03\x0e\xff\xd7\x01\xb0\x03\ +\x10\xff\xd7\x01\xb0\x03\x15\xff\xd7\x01\xb0\x03\x19\xff\xec\x01\ +\xb1\x00\x0f\xff\xae\x01\xb1\x00\x11\xff\xae\x01\xb1\x02\x08\xff\ +\xae\x01\xb1\x02\x0c\xff\xae\x01\xb1\x02\x80\xff\xec\x01\xb1\x02\ +\x82\xff\xec\x01\xb1\x02\xb7\xff\xec\x01\xb1\x02\xb9\xff\xec\x01\ +\xb1\x03\x0d\xff\xd7\x01\xb1\x03\x0f\xff\xd7\x01\xb4\x01\x9f\xff\ +\xd7\x01\xb4\x01\xb8\xff\xd7\x01\xb4\x01\xbb\xff\xd7\x01\xb4\x01\ +\xbe\xff\xd7\x01\xb4\x01\xc1\xff\xd7\x01\xb4\x01\xe1\xff\xd7\x01\ +\xb4\x02l\xff\xd7\x01\xb4\x02|\xff\xd7\x01\xb4\x02~\xff\ +\xd7\x01\xb4\x02\x84\xff\xd7\x01\xb4\x02\x86\xff\xd7\x01\xb4\x02\ +\x88\xff\xd7\x01\xb4\x02\x8a\xff\xd7\x01\xb4\x02\x8c\xff\xd7\x01\ +\xb4\x02\xb1\xff\xd7\x01\xb4\x02\xb3\xff\xd7\x01\xb4\x02\xbf\xff\ +\xd7\x01\xb4\x02\xc0\xff\xd7\x01\xb4\x02\xc1\xff\xd7\x01\xb4\x02\ +\xc2\xff\xd7\x01\xb4\x02\xc5\xff\x9a\x01\xb4\x02\xc7\xff\x9a\x01\ +\xb4\x02\xd4\xff\xd7\x01\xb4\x02\xd5\xff\xd7\x01\xb4\x02\xef\xff\ +\xd7\x01\xb4\x02\xf1\xff\xd7\x01\xb4\x02\xf3\xff\xd7\x01\xb4\x02\ +\xfd\xff\xd7\x01\xb4\x02\xfe\xff\xd7\x01\xb4\x03\x09\xff\xd7\x01\ +\xb4\x03\x0b\xff\xd7\x01\xb4\x03\x0e\xff\xd7\x01\xb4\x03\x10\xff\ +\xd7\x01\xb4\x03\x15\xff\xd7\x01\xb4\x03\x19\xff\xec\x01\xb8\x00\ +\x0f\xff\xae\x01\xb8\x00\x11\xff\xae\x01\xb8\x01\x9d\xff\xec\x01\ +\xb8\x01\xa4\xff\xd7\x01\xb8\x01\xa6\xff\xec\x01\xb8\x01\xa8\xff\ +\xd7\x01\xb8\x01\xaa\xff\xd7\x01\xb8\x01\xae\xff\xd7\x01\xb8\x01\ +\xb0\xff\xd7\x01\xb8\x01\xb1\xff\xec\x01\xb8\x01\xb5\xff\xd7\x01\ +\xb8\x01\xbc\xff\xc3\x01\xb8\x01\xbd\xff\xd7\x01\xb8\x01\xbf\xff\ +\xd7\x01\xb8\x01\xc1\xff\xd7\x01\xb8\x01\xc4\xff\xec\x01\xb8\x01\ +\xc7\xff\xec\x01\xb8\x01\xce\xff\xec\x01\xb8\x01\xd5\xff\xec\x01\ +\xb8\x01\xf2\xff\xec\x01\xb8\x02\x08\xff\xae\x01\xb8\x02\x0c\xff\ +\xae\x01\xb8\x02r\xff\xd7\x01\xb8\x02s\xff\xec\x01\xb8\x02\ +z\xff\xec\x01\xb8\x02|\xff\xd7\x01\xb8\x02\x80\xff\xec\x01\ +\xb8\x02\x82\xff\xec\x01\xb8\x02\x9f\xff\xd7\x01\xb8\x02\xa1\xff\ +\xec\x01\xb8\x02\xa9\xff\xec\x01\xb8\x02\xb5\xff\xc3\x01\xb8\x02\ +\xb7\xff\xec\x01\xb8\x02\xb9\xff\xec\x01\xb8\x02\xbb\xff\xd7\x01\ +\xb8\x02\xbd\xff\xec\x01\xb8\x02\xbf\xff\xd7\x01\xb8\x02\xc1\xff\ +\xd7\x01\xb8\x02\xca\xff\xd7\x01\xb8\x02\xce\xff\xd7\x01\xb8\x02\ +\xcf\xff\xec\x01\xb8\x02\xd4\xff\xd7\x01\xb8\x02\xd9\xff\xd7\x01\ +\xb8\x02\xdb\xff\xd7\x01\xb8\x02\xdd\xff\xd7\x01\xb8\x02\xe5\xff\ +\xd7\x01\xb8\x02\xe7\xff\xec\x01\xb8\x02\xf5\xff\xec\x01\xb8\x02\ +\xf7\xff\xd7\x01\xb8\x02\xf9\xff\xd7\x01\xb8\x02\xfb\xff\xd7\x01\ +\xb8\x02\xfd\xff\xd7\x01\xb8\x03\x05\xff\xd7\x01\xb8\x03\x07\xff\ +\xd7\x01\xb8\x03\x0d\xff\xd7\x01\xb8\x03\x0f\xff\xd7\x01\xb8\x03\ +\x11\xff\xd7\x01\xb8\x03\x12\xff\xec\x01\xb8\x03\x17\xff\xec\x01\ +\xb8\x03\x1b\xff\xd7\x01\xb8\x03\x1c\xff\xec\x01\xba\x00\x0f\xfe\ +\xf6\x01\xba\x00\x11\xfe\xf6\x01\xba\x01\xa4\xff\x85\x01\xba\x01\ +\xaa\xff\x9a\x01\xba\x01\xae\xff\x85\x01\xba\x01\xb0\xff\xd7\x01\ +\xba\x01\xb5\xff\x85\x01\xba\x01\xbf\xff\xd7\x01\xba\x01\xce\xff\ +\x9a\x01\xba\x01\xd5\xff\x9a\x01\xba\x01\xf2\xff\x9a\x01\xba\x02\ +\x08\xfe\xf6\x01\xba\x02\x0c\xfe\xf6\x01\xba\x02r\xff\x9a\x01\ +\xba\x02s\xff\x9a\x01\xba\x02v\xff\xec\x01\xba\x02\x9f\xff\ +\xd7\x01\xba\x02\xbb\xff\xd7\x01\xba\x02\xca\xff\xd7\x01\xba\x02\ +\xce\xff\x85\x01\xba\x02\xcf\xff\x9a\x01\xba\x02\xd9\xff\x9a\x01\ +\xba\x02\xdb\xff\x9a\x01\xba\x02\xdd\xff\x9a\x01\xba\x02\xe5\xff\ +\xd7\x01\xba\x03\x05\xff\xd7\x01\xba\x03\x07\xff\xd7\x01\xba\x03\ +\x09\xff\xae\x01\xba\x03\x0b\xff\xae\x01\xba\x03\x11\xff\x85\x01\ +\xba\x03\x12\xff\x9a\x01\xba\x03\x1b\xff\x85\x01\xba\x03\x1c\xff\ +\x9a\x01\xbb\x01\x9f\xff\xd7\x01\xbb\x01\xb8\xff\xd7\x01\xbb\x01\ +\xbb\xff\xd7\x01\xbb\x01\xbe\xff\xd7\x01\xbb\x01\xe1\xff\xd7\x01\ +\xbb\x02l\xff\xd7\x01\xbb\x02~\xff\xd7\x01\xbb\x02\x84\xff\ +\xd7\x01\xbb\x02\x86\xff\xd7\x01\xbb\x02\x88\xff\xd7\x01\xbb\x02\ +\x8a\xff\xd7\x01\xbb\x02\x8c\xff\xd7\x01\xbb\x02\xb1\xff\xd7\x01\ +\xbb\x02\xb3\xff\xd7\x01\xbb\x02\xc0\xff\xd7\x01\xbb\x02\xc2\xff\ +\xd7\x01\xbb\x02\xc5\xff\xd7\x01\xbb\x02\xc7\xff\xd7\x01\xbb\x02\ +\xd5\xff\xd7\x01\xbb\x02\xef\xff\xd7\x01\xbb\x02\xf1\xff\xd7\x01\ +\xbb\x02\xf3\xff\xd7\x01\xbb\x02\xfe\xff\xd7\x01\xbb\x03\x09\xff\ +\xd7\x01\xbb\x03\x0b\xff\xd7\x01\xbb\x03\x0e\xff\xd7\x01\xbb\x03\ +\x10\xff\xd7\x01\xbb\x03\x15\xff\xd7\x01\xbc\x00\x0f\xff\x85\x01\ +\xbc\x00\x10\xff\xae\x01\xbc\x00\x11\xff\x85\x01\xbc\x01\x9f\xff\ +\xd7\x01\xbc\x01\xa4\xff\x9a\x01\xbc\x01\xaa\xffq\x01\xbc\x01\ +\xae\xff\x9a\x01\xbc\x01\xb5\xff\x9a\x01\xbc\x01\xb8\xff\xd7\x01\ +\xbc\x01\xbb\xff\xd7\x01\xbc\x01\xbc\x00)\x01\xbc\x01\xbe\xff\ +\xae\x01\xbc\x01\xcc\xff\x9a\x01\xbc\x01\xcd\xff\x9a\x01\xbc\x01\ +\xce\xff\x85\x01\xbc\x01\xcf\xffq\x01\xbc\x01\xd0\xff\xd7\x01\ +\xbc\x01\xd1\xff\xd7\x01\xbc\x01\xd2\xff\x9a\x01\xbc\x01\xd3\xff\ +\x9a\x01\xbc\x01\xd4\xff\x9a\x01\xbc\x01\xd5\xff\x85\x01\xbc\x01\ +\xd6\xff\x9a\x01\xbc\x01\xd7\xff\x9a\x01\xbc\x01\xd8\xffq\x01\ +\xbc\x01\xd9\xff\x9a\x01\xbc\x01\xda\xff\x9a\x01\xbc\x01\xdb\xff\ +q\x01\xbc\x01\xdc\xff\xae\x01\xbc\x01\xdd\xff\xae\x01\xbc\x01\ +\xde\xffq\x01\xbc\x01\xdf\xff\xd7\x01\xbc\x01\xe0\xff\x9a\x01\ +\xbc\x01\xe1\xff\x9a\x01\xbc\x01\xe2\xff\x9a\x01\xbc\x01\xe3\xff\ +\x9a\x01\xbc\x01\xe4\xff\xae\x01\xbc\x01\xe5\xff\x9a\x01\xbc\x01\ +\xe6\xff\x9a\x01\xbc\x01\xe7\xff\xd7\x01\xbc\x01\xe8\xff\x9a\x01\ +\xbc\x01\xe9\xff\xc3\x01\xbc\x01\xea\xffq\x01\xbc\x01\xec\xff\ +\x9a\x01\xbc\x01\xed\xffq\x01\xbc\x01\xee\xff\x85\x01\xbc\x01\ +\xf2\xff\x85\x01\xbc\x01\xf3\xff\x9a\x01\xbc\x01\xf5\xff\x9a\x01\ +\xbc\x01\xf6\xff\xae\x01\xbc\x01\xf7\xff\x9a\x01\xbc\x01\xf9\xff\ +\x9a\x01\xbc\x02\x02\xff\xae\x01\xbc\x02\x03\xff\xae\x01\xbc\x02\ +\x04\xff\xae\x01\xbc\x02\x08\xff\x85\x01\xbc\x02\x0c\xff\x85\x01\ +\xbc\x02j\xffq\x01\xbc\x02k\xff\x9a\x01\xbc\x02l\xff\ +\xd7\x01\xbc\x02m\xff\xd7\x01\xbc\x02q\xff\x9a\x01\xbc\x02\ +r\xffq\x01\xbc\x02s\xff\x85\x01\xbc\x02u\xff\x9a\x01\ +\xbc\x02w\xff\x9a\x01\xbc\x02y\xff\x9a\x01\xbc\x02}\xff\ +\x9a\x01\xbc\x02~\xff\xd7\x01\xbc\x02\x7f\xffq\x01\xbc\x02\ +\x81\xff\xd7\x01\xbc\x02\x83\xff\xd7\x01\xbc\x02\x84\xff\xd7\x01\ +\xbc\x02\x85\xffq\x01\xbc\x02\x86\xff\xd7\x01\xbc\x02\x87\xff\ +q\x01\xbc\x02\x88\xff\xd7\x01\xbc\x02\x89\xffq\x01\xbc\x02\ +\x8a\xff\xd7\x01\xbc\x02\x8b\xff\xd7\x01\xbc\x02\x8c\xff\xd7\x01\ +\xbc\x02\x8d\xffq\x01\xbc\x02\x96\xff\x9a\x01\xbc\x02\x9a\xff\ +\x9a\x01\xbc\x02\x9e\xff\x9a\x01\xbc\x02\xa0\xff\xd7\x01\xbc\x02\ +\xa2\xff\xd7\x01\xbc\x02\xa4\xff\x9a\x01\xbc\x02\xa6\xff\x9a\x01\ +\xbc\x02\xaa\xff\xae\x01\xbc\x02\xac\xff\x9a\x01\xbc\x02\xae\xff\ +\x9a\x01\xbc\x02\xb0\xff\x9a\x01\xbc\x02\xb1\xff\xd7\x01\xbc\x02\ +\xb2\xffq\x01\xbc\x02\xb3\xff\xd7\x01\xbc\x02\xb4\xffq\x01\ +\xbc\x02\xb5\x00)\x01\xbc\x02\xb6\xff\xae\x01\xbc\x02\xb8\xff\ +\xae\x01\xbc\x02\xba\xff\xae\x01\xbc\x02\xbc\xff\xd7\x01\xbc\x02\ +\xbe\xff\xae\x01\xbc\x02\xc0\xff\x9a\x01\xbc\x02\xc2\xff\x9a\x01\ +\xbc\x02\xc4\xff\x9a\x01\xbc\x02\xc5\xff\x9a\x01\xbc\x02\xc6\xff\ +q\x01\xbc\x02\xc7\xff\x9a\x01\xbc\x02\xc8\xffq\x01\xbc\x02\ +\xcb\xff\xd7\x01\xbc\x02\xcd\xff\x9a\x01\xbc\x02\xce\xff\x9a\x01\ +\xbc\x02\xcf\xff\x85\x01\xbc\x02\xd1\xff\x9a\x01\xbc\x02\xd3\xff\ +\x9a\x01\xbc\x02\xd5\xff\x9a\x01\xbc\x02\xd7\xff\x9a\x01\xbc\x02\ +\xd9\xffq\x01\xbc\x02\xdb\xffq\x01\xbc\x02\xdd\xffq\x01\ +\xbc\x02\xe0\xffq\x01\xbc\x02\xe6\xff\xd7\x01\xbc\x02\xe8\xff\ +\xd7\x01\xbc\x02\xea\xff\xc3\x01\xbc\x02\xec\xff\x9a\x01\xbc\x02\ +\xee\xff\x9a\x01\xbc\x02\xef\xff\xd7\x01\xbc\x02\xf0\xffq\x01\ +\xbc\x02\xf1\xff\xd7\x01\xbc\x02\xf2\xffq\x01\xbc\x02\xf3\xff\ +\xd7\x01\xbc\x02\xf4\xffq\x01\xbc\x02\xf6\xff\xd7\x01\xbc\x02\ +\xf8\xff\xae\x01\xbc\x02\xfa\xff\xae\x01\xbc\x02\xfc\xff\xae\x01\ +\xbc\x02\xfe\xff\x9a\x01\xbc\x03\x00\xff\x9a\x01\xbc\x03\x02\xff\ +\x9a\x01\xbc\x03\x06\xff\xd7\x01\xbc\x03\x08\xff\xd7\x01\xbc\x03\ +\x09\xffq\x01\xbc\x03\x0a\xffq\x01\xbc\x03\x0b\xffq\x01\ +\xbc\x03\x0c\xffq\x01\xbc\x03\x0e\xff\x9a\x01\xbc\x03\x10\xff\ +\x9a\x01\xbc\x03\x11\xff\x9a\x01\xbc\x03\x12\xff\x85\x01\xbc\x03\ +\x14\xff\x9a\x01\xbc\x03\x15\xff\xd7\x01\xbc\x03\x16\xffq\x01\ +\xbc\x03\x18\xff\xae\x01\xbc\x03\x1a\xffq\x01\xbc\x03\x1b\xff\ +\x9a\x01\xbc\x03\x1c\xff\x85\x01\xbd\x00\x0f\xff\x85\x01\xbd\x00\ +\x11\xff\x85\x01\xbd\x01\x9f\xff\xec\x01\xbd\x01\xa4\xff\x9a\x01\ +\xbd\x01\xaa\xffq\x01\xbd\x01\xae\xff\x9a\x01\xbd\x01\xb5\xff\ +\x9a\x01\xbd\x01\xb8\xff\xec\x01\xbd\x01\xbb\xff\xec\x01\xbd\x01\ +\xbe\xff\xc3\x01\xbd\x01\xc9\xff\xec\x01\xbd\x01\xce\xff\xae\x01\ +\xbd\x01\xcf\xff\xd7\x01\xbd\x01\xd5\xff\xae\x01\xbd\x01\xd8\xff\ +\xd7\x01\xbd\x01\xdb\xff\xd7\x01\xbd\x01\xde\xff\xd7\x01\xbd\x01\ +\xe1\xff\xd7\x01\xbd\x01\xea\xff\xd7\x01\xbd\x01\xeb\x00f\x01\ +\xbd\x01\xed\xff\xd7\x01\xbd\x01\xee\xff\xec\x01\xbd\x01\xf2\xff\ +\xae\x01\xbd\x01\xf4\x00f\x01\xbd\x02\x08\xff\x85\x01\xbd\x02\ +\x0c\xff\x85\x01\xbd\x02j\xff\xd7\x01\xbd\x02l\xff\xec\x01\ +\xbd\x02r\xffq\x01\xbd\x02s\xff\xae\x01\xbd\x02~\xff\ +\xec\x01\xbd\x02\x7f\xff\xd7\x01\xbd\x02\x84\xff\xec\x01\xbd\x02\ +\x85\xff\xd7\x01\xbd\x02\x86\xff\xec\x01\xbd\x02\x87\xff\xd7\x01\ +\xbd\x02\x88\xff\xec\x01\xbd\x02\x89\xff\xd7\x01\xbd\x02\x8a\xff\ +\xec\x01\xbd\x02\x8c\xff\xec\x01\xbd\x02\x8d\xff\xd7\x01\xbd\x02\ +\x98\x00f\x01\xbd\x02\xa8\x00f\x01\xbd\x02\xb1\xff\xec\x01\ +\xbd\x02\xb2\xff\xd7\x01\xbd\x02\xb3\xff\xec\x01\xbd\x02\xb4\xff\ +\xd7\x01\xbd\x02\xc0\xff\xd7\x01\xbd\x02\xc2\xff\xd7\x01\xbd\x02\ +\xc5\xff\xd7\x01\xbd\x02\xc6\xff\xc3\x01\xbd\x02\xc7\xff\xd7\x01\ +\xbd\x02\xc8\xff\xc3\x01\xbd\x02\xce\xff\x9a\x01\xbd\x02\xcf\xff\ +\xae\x01\xbd\x02\xd5\xff\xd7\x01\xbd\x02\xd9\xffq\x01\xbd\x02\ +\xdb\xffq\x01\xbd\x02\xdd\xffq\x01\xbd\x02\xe0\xff\xd7\x01\ +\xbd\x02\xef\xff\xec\x01\xbd\x02\xf0\xff\xd7\x01\xbd\x02\xf1\xff\ +\xec\x01\xbd\x02\xf2\xff\xd7\x01\xbd\x02\xf3\xff\xec\x01\xbd\x02\ +\xf4\xff\xd7\x01\xbd\x02\xfe\xff\xd7\x01\xbd\x03\x09\xffq\x01\ +\xbd\x03\x0a\xff\xd7\x01\xbd\x03\x0b\xffq\x01\xbd\x03\x0c\xff\ +\xd7\x01\xbd\x03\x11\xff\x9a\x01\xbd\x03\x12\xff\xae\x01\xbd\x03\ +\x15\xff\xec\x01\xbd\x03\x16\xff\xd7\x01\xbd\x03\x1a\xff\xd7\x01\ +\xbd\x03\x1b\xff\x9a\x01\xbd\x03\x1c\xff\xae\x01\xbe\x00\x0f\xff\ +\xae\x01\xbe\x00\x11\xff\xae\x01\xbe\x01\x9d\xff\xd7\x01\xbe\x01\ +\xa4\xff\xd7\x01\xbe\x01\xa6\xff\xd7\x01\xbe\x01\xa8\xff\xc3\x01\ +\xbe\x01\xaa\xff\xd7\x01\xbe\x01\xae\xff\xd7\x01\xbe\x01\xb0\xff\ +\xd7\x01\xbe\x01\xb1\xff\xd7\x01\xbe\x01\xb5\xff\xd7\x01\xbe\x01\ +\xbc\xff\xc3\x01\xbe\x01\xbd\xff\xc3\x01\xbe\x01\xbf\xff\xd7\x01\ +\xbe\x01\xc4\xff\xd7\x01\xbe\x01\xc7\xff\xd7\x01\xbe\x01\xce\xff\ +\xec\x01\xbe\x01\xd5\xff\xec\x01\xbe\x01\xf2\xff\xec\x01\xbe\x02\ +\x08\xff\xae\x01\xbe\x02\x0c\xff\xae\x01\xbe\x02r\xff\xd7\x01\ +\xbe\x02s\xff\xec\x01\xbe\x02z\xff\xd7\x01\xbe\x02\x80\xff\ +\xec\x01\xbe\x02\x82\xff\xec\x01\xbe\x02\x9f\xff\xd7\x01\xbe\x02\ +\xa1\xff\xd7\x01\xbe\x02\xa9\xff\xd7\x01\xbe\x02\xb5\xff\xc3\x01\ +\xbe\x02\xb7\xff\xc3\x01\xbe\x02\xb9\xff\xc3\x01\xbe\x02\xbb\xff\ +\xd7\x01\xbe\x02\xbd\xff\xd7\x01\xbe\x02\xca\xff\xd7\x01\xbe\x02\ +\xce\xff\xd7\x01\xbe\x02\xcf\xff\xec\x01\xbe\x02\xd9\xff\xd7\x01\ +\xbe\x02\xdb\xff\xd7\x01\xbe\x02\xdd\xff\xd7\x01\xbe\x02\xe5\xff\ +\xd7\x01\xbe\x02\xe7\xff\xd7\x01\xbe\x02\xf5\xff\xd7\x01\xbe\x02\ +\xf7\xff\xc3\x01\xbe\x02\xf9\xff\xc3\x01\xbe\x02\xfb\xff\xc3\x01\ +\xbe\x03\x05\xff\xd7\x01\xbe\x03\x07\xff\xd7\x01\xbe\x03\x0d\xff\ +\xd7\x01\xbe\x03\x0f\xff\xd7\x01\xbe\x03\x11\xff\xd7\x01\xbe\x03\ +\x12\xff\xec\x01\xbe\x03\x17\xff\xd7\x01\xbe\x03\x1b\xff\xd7\x01\ +\xbe\x03\x1c\xff\xec\x01\xbf\x01\x9f\xff\xd7\x01\xbf\x01\xb8\xff\ +\xd7\x01\xbf\x01\xbb\xff\xd7\x01\xbf\x01\xbe\xff\xd7\x01\xbf\x01\ +\xc1\xff\xd7\x01\xbf\x01\xe1\xff\xd7\x01\xbf\x02l\xff\xd7\x01\ +\xbf\x02|\xff\xd7\x01\xbf\x02~\xff\xd7\x01\xbf\x02\x84\xff\ +\xd7\x01\xbf\x02\x86\xff\xd7\x01\xbf\x02\x88\xff\xd7\x01\xbf\x02\ +\x8a\xff\xd7\x01\xbf\x02\x8c\xff\xd7\x01\xbf\x02\xb1\xff\xd7\x01\ +\xbf\x02\xb3\xff\xd7\x01\xbf\x02\xbf\xff\xd7\x01\xbf\x02\xc0\xff\ +\xd7\x01\xbf\x02\xc1\xff\xd7\x01\xbf\x02\xc2\xff\xd7\x01\xbf\x02\ +\xc5\xff\x9a\x01\xbf\x02\xc7\xff\x9a\x01\xbf\x02\xd4\xff\xd7\x01\ +\xbf\x02\xd5\xff\xd7\x01\xbf\x02\xef\xff\xd7\x01\xbf\x02\xf1\xff\ +\xd7\x01\xbf\x02\xf3\xff\xd7\x01\xbf\x02\xfd\xff\xd7\x01\xbf\x02\ +\xfe\xff\xd7\x01\xbf\x03\x09\xff\xd7\x01\xbf\x03\x0b\xff\xd7\x01\ +\xbf\x03\x0e\xff\xd7\x01\xbf\x03\x10\xff\xd7\x01\xbf\x03\x15\xff\ +\xd7\x01\xbf\x03\x19\xff\xec\x01\xc0\x01\xa3\x00\xe1\x01\xc0\x02\ +\xea\x00)\x01\xc0\x03\x0e\xff\xd7\x01\xc0\x03\x10\xff\xd7\x01\ +\xc3\x01\xa3\x00\xe1\x01\xc3\x02\xea\x00)\x01\xc3\x03\x0e\xff\ +\xd7\x01\xc3\x03\x10\xff\xd7\x01\xc4\x00\x05\xff\xae\x01\xc4\x00\ +\x0a\xff\xae\x01\xc4\x01\x9d\xff\x85\x01\xc4\x01\xa6\xff\x85\x01\ +\xc4\x01\xa8\xff\xd7\x01\xc4\x01\xbc\xff\x9a\x01\xc4\x01\xbd\xff\ +\xd7\x01\xc4\x01\xc1\xff\x9a\x01\xc4\x01\xc4\xff\x85\x01\xc4\x01\ +\xdc\xff\xd7\x01\xc4\x01\xdd\xff\xd7\x01\xc4\x01\xe1\xff\xd7\x01\ +\xc4\x01\xe4\xff\xd7\x01\xc4\x01\xf6\xff\xd7\x01\xc4\x02\x07\xff\ +\xae\x01\xc4\x02\x0b\xff\xae\x01\xc4\x02n\xff\xae\x01\xc4\x02\ +|\xff\x9a\x01\xc4\x02\x80\xff\xae\x01\xc4\x02\x82\xff\xae\x01\ +\xc4\x02\x97\xff\xae\x01\xc4\x02\x9b\xff\xae\x01\xc4\x02\xa7\xff\ +\xae\x01\xc4\x02\xa9\xff\x85\x01\xc4\x02\xaa\xff\xd7\x01\xc4\x02\ +\xb5\xff\x9a\x01\xc4\x02\xb6\xff\xd7\x01\xc4\x02\xb7\xff\x9a\x01\ +\xc4\x02\xb8\xff\xd7\x01\xc4\x02\xb9\xff\x9a\x01\xc4\x02\xba\xff\ +\xd7\x01\xc4\x02\xbd\xff\x85\x01\xc4\x02\xbe\xff\xd7\x01\xc4\x02\ +\xbf\xff\x9a\x01\xc4\x02\xc0\xff\xd7\x01\xc4\x02\xc1\xff\x9a\x01\ +\xc4\x02\xc2\xff\xd7\x01\xc4\x02\xd4\xff\x9a\x01\xc4\x02\xd5\xff\ +\xd7\x01\xc4\x02\xf7\xff\xd7\x01\xc4\x02\xf8\xff\xd7\x01\xc4\x02\ +\xf9\xff\xd7\x01\xc4\x02\xfa\xff\xd7\x01\xc4\x02\xfb\xff\xd7\x01\ +\xc4\x02\xfc\xff\xd7\x01\xc4\x02\xfd\xff\x9a\x01\xc4\x02\xfe\xff\ +\xd7\x01\xc4\x03\x03\xff\xae\x01\xc4\x03\x0d\xff\x9a\x01\xc4\x03\ +\x0e\xff\xc3\x01\xc4\x03\x0f\xff\x9a\x01\xc4\x03\x10\xff\xc3\x01\ +\xc4\x03\x17\xff\x85\x01\xc4\x03\x18\xff\xd7\x01\xc6\x00\x05\xff\ +\xae\x01\xc6\x00\x0a\xff\xae\x01\xc6\x01\x9d\xff\x85\x01\xc6\x01\ +\xa6\xff\x85\x01\xc6\x01\xa8\xff\xd7\x01\xc6\x01\xbc\xff\x9a\x01\ +\xc6\x01\xbd\xff\xd7\x01\xc6\x01\xc1\xff\x9a\x01\xc6\x01\xc4\xff\ +\x85\x01\xc6\x01\xdc\xff\xd7\x01\xc6\x01\xdd\xff\xd7\x01\xc6\x01\ +\xe1\xff\xd7\x01\xc6\x01\xe4\xff\xd7\x01\xc6\x01\xf6\xff\xd7\x01\ +\xc6\x02\x07\xff\xae\x01\xc6\x02\x0b\xff\xae\x01\xc6\x02n\xff\ +\xae\x01\xc6\x02|\xff\x9a\x01\xc6\x02\x80\xff\xae\x01\xc6\x02\ +\x82\xff\xae\x01\xc6\x02\x97\xff\xae\x01\xc6\x02\x9b\xff\xae\x01\ +\xc6\x02\xa7\xff\xae\x01\xc6\x02\xa9\xff\x85\x01\xc6\x02\xaa\xff\ +\xd7\x01\xc6\x02\xb5\xff\x9a\x01\xc6\x02\xb6\xff\xd7\x01\xc6\x02\ +\xb7\xff\x9a\x01\xc6\x02\xb8\xff\xd7\x01\xc6\x02\xb9\xff\x9a\x01\ +\xc6\x02\xba\xff\xd7\x01\xc6\x02\xbd\xff\x85\x01\xc6\x02\xbe\xff\ +\xd7\x01\xc6\x02\xbf\xff\x9a\x01\xc6\x02\xc0\xff\xd7\x01\xc6\x02\ +\xc1\xff\x9a\x01\xc6\x02\xc2\xff\xd7\x01\xc6\x02\xd4\xff\x9a\x01\ +\xc6\x02\xd5\xff\xd7\x01\xc6\x02\xf7\xff\xd7\x01\xc6\x02\xf8\xff\ +\xd7\x01\xc6\x02\xf9\xff\xd7\x01\xc6\x02\xfa\xff\xd7\x01\xc6\x02\ +\xfb\xff\xd7\x01\xc6\x02\xfc\xff\xd7\x01\xc6\x02\xfd\xff\x9a\x01\ +\xc6\x02\xfe\xff\xd7\x01\xc6\x03\x03\xff\xae\x01\xc6\x03\x0d\xff\ +\x9a\x01\xc6\x03\x0e\xff\xc3\x01\xc6\x03\x0f\xff\x9a\x01\xc6\x03\ +\x10\xff\xc3\x01\xc6\x03\x17\xff\x85\x01\xc6\x03\x18\xff\xd7\x01\ +\xc7\x00\x0f\xff\xae\x01\xc7\x00\x11\xff\xae\x01\xc7\x01\x9d\xff\ +\xec\x01\xc7\x01\xa4\xff\xd7\x01\xc7\x01\xa6\xff\xec\x01\xc7\x01\ +\xa8\xff\xd7\x01\xc7\x01\xaa\xff\xd7\x01\xc7\x01\xae\xff\xd7\x01\ +\xc7\x01\xb0\xff\xd7\x01\xc7\x01\xb1\xff\xec\x01\xc7\x01\xb5\xff\ +\xd7\x01\xc7\x01\xbc\xff\xc3\x01\xc7\x01\xbd\xff\xd7\x01\xc7\x01\ +\xbf\xff\xd7\x01\xc7\x01\xc1\xff\xd7\x01\xc7\x01\xc4\xff\xec\x01\ +\xc7\x01\xc7\xff\xec\x01\xc7\x01\xce\xff\xec\x01\xc7\x01\xd5\xff\ +\xec\x01\xc7\x01\xf2\xff\xec\x01\xc7\x02\x08\xff\xae\x01\xc7\x02\ +\x0c\xff\xae\x01\xc7\x02r\xff\xd7\x01\xc7\x02s\xff\xec\x01\ +\xc7\x02z\xff\xec\x01\xc7\x02|\xff\xd7\x01\xc7\x02\x80\xff\ +\xec\x01\xc7\x02\x82\xff\xec\x01\xc7\x02\x9f\xff\xd7\x01\xc7\x02\ +\xa1\xff\xec\x01\xc7\x02\xa9\xff\xec\x01\xc7\x02\xb5\xff\xc3\x01\ +\xc7\x02\xb7\xff\xec\x01\xc7\x02\xb9\xff\xec\x01\xc7\x02\xbb\xff\ +\xd7\x01\xc7\x02\xbd\xff\xec\x01\xc7\x02\xbf\xff\xd7\x01\xc7\x02\ +\xc1\xff\xd7\x01\xc7\x02\xca\xff\xd7\x01\xc7\x02\xce\xff\xd7\x01\ +\xc7\x02\xcf\xff\xec\x01\xc7\x02\xd4\xff\xd7\x01\xc7\x02\xd9\xff\ +\xd7\x01\xc7\x02\xdb\xff\xd7\x01\xc7\x02\xdd\xff\xd7\x01\xc7\x02\ +\xe5\xff\xd7\x01\xc7\x02\xe7\xff\xec\x01\xc7\x02\xf5\xff\xec\x01\ +\xc7\x02\xf7\xff\xd7\x01\xc7\x02\xf9\xff\xd7\x01\xc7\x02\xfb\xff\ +\xd7\x01\xc7\x02\xfd\xff\xd7\x01\xc7\x03\x05\xff\xd7\x01\xc7\x03\ +\x07\xff\xd7\x01\xc7\x03\x0d\xff\xd7\x01\xc7\x03\x0f\xff\xd7\x01\ +\xc7\x03\x11\xff\xd7\x01\xc7\x03\x12\xff\xec\x01\xc7\x03\x17\xff\ +\xec\x01\xc7\x03\x1b\xff\xd7\x01\xc7\x03\x1c\xff\xec\x01\xc8\x00\ +\x0f\xff\xae\x01\xc8\x00\x11\xff\xae\x01\xc8\x01\x9d\xff\xec\x01\ +\xc8\x01\xa4\xff\xd7\x01\xc8\x01\xa6\xff\xec\x01\xc8\x01\xa8\xff\ +\xd7\x01\xc8\x01\xaa\xff\xd7\x01\xc8\x01\xae\xff\xd7\x01\xc8\x01\ +\xb0\xff\xd7\x01\xc8\x01\xb1\xff\xec\x01\xc8\x01\xb5\xff\xd7\x01\ +\xc8\x01\xbc\xff\xc3\x01\xc8\x01\xbd\xff\xd7\x01\xc8\x01\xbf\xff\ +\xd7\x01\xc8\x01\xc1\xff\xd7\x01\xc8\x01\xc4\xff\xec\x01\xc8\x01\ +\xc7\xff\xec\x01\xc8\x01\xce\xff\xec\x01\xc8\x01\xd5\xff\xec\x01\ +\xc8\x01\xf2\xff\xec\x01\xc8\x02\x08\xff\xae\x01\xc8\x02\x0c\xff\ +\xae\x01\xc8\x02r\xff\xd7\x01\xc8\x02s\xff\xec\x01\xc8\x02\ +z\xff\xec\x01\xc8\x02|\xff\xd7\x01\xc8\x02\x80\xff\xec\x01\ +\xc8\x02\x82\xff\xec\x01\xc8\x02\x9f\xff\xd7\x01\xc8\x02\xa1\xff\ +\xec\x01\xc8\x02\xa9\xff\xec\x01\xc8\x02\xb5\xff\xc3\x01\xc8\x02\ +\xb7\xff\xec\x01\xc8\x02\xb9\xff\xec\x01\xc8\x02\xbb\xff\xd7\x01\ +\xc8\x02\xbd\xff\xec\x01\xc8\x02\xbf\xff\xd7\x01\xc8\x02\xc1\xff\ +\xd7\x01\xc8\x02\xca\xff\xd7\x01\xc8\x02\xce\xff\xd7\x01\xc8\x02\ +\xcf\xff\xec\x01\xc8\x02\xd4\xff\xd7\x01\xc8\x02\xd9\xff\xd7\x01\ +\xc8\x02\xdb\xff\xd7\x01\xc8\x02\xdd\xff\xd7\x01\xc8\x02\xe5\xff\ +\xd7\x01\xc8\x02\xe7\xff\xec\x01\xc8\x02\xf5\xff\xec\x01\xc8\x02\ +\xf7\xff\xd7\x01\xc8\x02\xf9\xff\xd7\x01\xc8\x02\xfb\xff\xd7\x01\ +\xc8\x02\xfd\xff\xd7\x01\xc8\x03\x05\xff\xd7\x01\xc8\x03\x07\xff\ +\xd7\x01\xc8\x03\x0d\xff\xd7\x01\xc8\x03\x0f\xff\xd7\x01\xc8\x03\ +\x11\xff\xd7\x01\xc8\x03\x12\xff\xec\x01\xc8\x03\x17\xff\xec\x01\ +\xc8\x03\x1b\xff\xd7\x01\xc8\x03\x1c\xff\xec\x01\xca\x00\x05\xff\ +\xec\x01\xca\x00\x0a\xff\xec\x01\xca\x02\x07\xff\xec\x01\xca\x02\ +\x0b\xff\xec\x01\xcc\x01\xe9\x00)\x01\xcd\x00\x0f\xff\x9a\x01\ +\xcd\x00\x10\xff\xd7\x01\xcd\x00\x11\xff\x9a\x01\xcd\x01\xce\xff\ +\xc3\x01\xcd\x01\xcf\xff\xec\x01\xcd\x01\xd5\xff\xc3\x01\xcd\x01\ +\xd8\xff\xec\x01\xcd\x01\xdb\xff\xec\x01\xcd\x01\xde\xff\xec\x01\ +\xcd\x01\xea\xff\xec\x01\xcd\x01\xed\xff\xec\x01\xcd\x01\xf2\xff\ +\xc3\x01\xcd\x02\x02\xff\xd7\x01\xcd\x02\x03\xff\xd7\x01\xcd\x02\ +\x04\xff\xd7\x01\xcd\x02\x08\xff\x9a\x01\xcd\x02\x0c\xff\x9a\x01\ +\xcd\x02j\xff\xec\x01\xcd\x02s\xff\xc3\x01\xcd\x02\x7f\xff\ +\xec\x01\xcd\x02\x85\xff\xec\x01\xcd\x02\x87\xff\xec\x01\xcd\x02\ +\x89\xff\xec\x01\xcd\x02\x8d\xff\xec\x01\xcd\x02\xb2\xff\xec\x01\ +\xcd\x02\xb4\xff\xec\x01\xcd\x02\xcf\xff\xc3\x01\xcd\x02\xe0\xff\ +\xec\x01\xcd\x02\xf0\xff\xec\x01\xcd\x02\xf2\xff\xec\x01\xcd\x02\ +\xf4\xff\xec\x01\xcd\x03\x0a\xff\xec\x01\xcd\x03\x0c\xff\xec\x01\ +\xcd\x03\x12\xff\xc3\x01\xcd\x03\x16\xff\xec\x01\xcd\x03\x1a\xff\ +\xec\x01\xcd\x03\x1c\xff\xc3\x01\xce\x00\x05\xff\xec\x01\xce\x00\ +\x0a\xff\xec\x01\xce\x02\x07\xff\xec\x01\xce\x02\x0b\xff\xec\x01\ +\xcf\x00\x05\xff\xec\x01\xcf\x00\x0a\xff\xec\x01\xcf\x02\x07\xff\ +\xec\x01\xcf\x02\x0b\xff\xec\x01\xd0\x01\xcf\xff\xd7\x01\xd0\x01\ +\xd8\xff\xd7\x01\xd0\x01\xdb\xff\xd7\x01\xd0\x01\xde\xff\xd7\x01\ +\xd0\x01\xe1\xff\xd7\x01\xd0\x01\xea\xff\xd7\x01\xd0\x01\xed\xff\ +\xd7\x01\xd0\x02j\xff\xd7\x01\xd0\x02\x7f\xff\xd7\x01\xd0\x02\ +\x85\xff\xd7\x01\xd0\x02\x87\xff\xd7\x01\xd0\x02\x89\xff\xd7\x01\ +\xd0\x02\x8d\xff\xd7\x01\xd0\x02\xb2\xff\xd7\x01\xd0\x02\xb4\xff\ +\xd7\x01\xd0\x02\xc0\xff\xd7\x01\xd0\x02\xc2\xff\xd7\x01\xd0\x02\ +\xc6\xff\xd7\x01\xd0\x02\xc8\xff\xd7\x01\xd0\x02\xd5\xff\xd7\x01\ +\xd0\x02\xe0\xff\xd7\x01\xd0\x02\xf0\xff\xd7\x01\xd0\x02\xf2\xff\ +\xd7\x01\xd0\x02\xf4\xff\xd7\x01\xd0\x02\xfe\xff\xd7\x01\xd0\x03\ +\x0a\xff\xd7\x01\xd0\x03\x0c\xff\xd7\x01\xd0\x03\x16\xff\xd7\x01\ +\xd0\x03\x1a\xff\xd7\x01\xd1\x01\xe9\x00)\x01\xd4\x01\xcf\xff\ +\xd7\x01\xd4\x01\xd8\xff\xd7\x01\xd4\x01\xdb\xff\xd7\x01\xd4\x01\ +\xde\xff\xd7\x01\xd4\x01\xe1\xff\xd7\x01\xd4\x01\xea\xff\xd7\x01\ +\xd4\x01\xed\xff\xd7\x01\xd4\x02j\xff\xd7\x01\xd4\x02\x7f\xff\ +\xd7\x01\xd4\x02\x85\xff\xd7\x01\xd4\x02\x87\xff\xd7\x01\xd4\x02\ +\x89\xff\xd7\x01\xd4\x02\x8d\xff\xd7\x01\xd4\x02\xb2\xff\xd7\x01\ +\xd4\x02\xb4\xff\xd7\x01\xd4\x02\xc0\xff\xd7\x01\xd4\x02\xc2\xff\ +\xd7\x01\xd4\x02\xc6\xff\xd7\x01\xd4\x02\xc8\xff\xd7\x01\xd4\x02\ +\xd5\xff\xd7\x01\xd4\x02\xe0\xff\xd7\x01\xd4\x02\xf0\xff\xd7\x01\ +\xd4\x02\xf2\xff\xd7\x01\xd4\x02\xf4\xff\xd7\x01\xd4\x02\xfe\xff\ +\xd7\x01\xd4\x03\x0a\xff\xd7\x01\xd4\x03\x0c\xff\xd7\x01\xd4\x03\ +\x16\xff\xd7\x01\xd4\x03\x1a\xff\xd7\x01\xd8\x00\x05\xff\xec\x01\ +\xd8\x00\x0a\xff\xec\x01\xd8\x01\xd0\xff\xd7\x01\xd8\x01\xdc\xff\ +\xec\x01\xd8\x01\xdd\xff\xec\x01\xd8\x01\xdf\xff\xd7\x01\xd8\x01\ +\xe1\xff\xec\x01\xd8\x01\xe4\xff\xec\x01\xd8\x01\xf6\xff\xec\x01\ +\xd8\x02\x07\xff\xec\x01\xd8\x02\x0b\xff\xec\x01\xd8\x02\xa0\xff\ +\xd7\x01\xd8\x02\xaa\xff\xec\x01\xd8\x02\xb6\xff\xec\x01\xd8\x02\ +\xbc\xff\xd7\x01\xd8\x02\xbe\xff\xec\x01\xd8\x02\xc0\xff\xec\x01\ +\xd8\x02\xc2\xff\xec\x01\xd8\x02\xcb\xff\xd7\x01\xd8\x02\xd5\xff\ +\xec\x01\xd8\x02\xe6\xff\xd7\x01\xd8\x02\xf8\xff\xec\x01\xd8\x02\ +\xfa\xff\xec\x01\xd8\x02\xfc\xff\xec\x01\xd8\x02\xfe\xff\xec\x01\ +\xd8\x03\x06\xff\xd7\x01\xd8\x03\x08\xff\xd7\x01\xd8\x03\x0e\xff\ +\xec\x01\xd8\x03\x10\xff\xec\x01\xd8\x03\x18\xff\xec\x01\xda\x00\ +\x05\xff\xec\x01\xda\x00\x0a\xff\xec\x01\xda\x01\xd0\xff\xd7\x01\ +\xda\x01\xdc\xff\xec\x01\xda\x01\xdd\xff\xec\x01\xda\x01\xdf\xff\ +\xd7\x01\xda\x01\xe1\xff\xec\x01\xda\x01\xe4\xff\xec\x01\xda\x01\ +\xf6\xff\xec\x01\xda\x02\x07\xff\xec\x01\xda\x02\x0b\xff\xec\x01\ +\xda\x02\xa0\xff\xd7\x01\xda\x02\xaa\xff\xec\x01\xda\x02\xb6\xff\ +\xec\x01\xda\x02\xbc\xff\xd7\x01\xda\x02\xbe\xff\xec\x01\xda\x02\ +\xc0\xff\xec\x01\xda\x02\xc2\xff\xec\x01\xda\x02\xcb\xff\xd7\x01\ +\xda\x02\xd5\xff\xec\x01\xda\x02\xe6\xff\xd7\x01\xda\x02\xf8\xff\ +\xec\x01\xda\x02\xfa\xff\xec\x01\xda\x02\xfc\xff\xec\x01\xda\x02\ +\xfe\xff\xec\x01\xda\x03\x06\xff\xd7\x01\xda\x03\x08\xff\xd7\x01\ +\xda\x03\x0e\xff\xec\x01\xda\x03\x10\xff\xec\x01\xda\x03\x18\xff\ +\xec\x01\xdc\x00\x0f\xff\x9a\x01\xdc\x00\x10\xff\xd7\x01\xdc\x00\ +\x11\xff\x9a\x01\xdc\x01\xce\xff\xc3\x01\xdc\x01\xcf\xff\xec\x01\ +\xdc\x01\xd5\xff\xc3\x01\xdc\x01\xd8\xff\xec\x01\xdc\x01\xdb\xff\ +\xec\x01\xdc\x01\xde\xff\xec\x01\xdc\x01\xea\xff\xec\x01\xdc\x01\ +\xed\xff\xec\x01\xdc\x01\xf2\xff\xc3\x01\xdc\x02\x02\xff\xd7\x01\ +\xdc\x02\x03\xff\xd7\x01\xdc\x02\x04\xff\xd7\x01\xdc\x02\x08\xff\ +\x9a\x01\xdc\x02\x0c\xff\x9a\x01\xdc\x02j\xff\xec\x01\xdc\x02\ +s\xff\xc3\x01\xdc\x02\x7f\xff\xec\x01\xdc\x02\x85\xff\xec\x01\ +\xdc\x02\x87\xff\xec\x01\xdc\x02\x89\xff\xec\x01\xdc\x02\x8d\xff\ +\xec\x01\xdc\x02\xb2\xff\xec\x01\xdc\x02\xb4\xff\xec\x01\xdc\x02\ +\xcf\xff\xc3\x01\xdc\x02\xe0\xff\xec\x01\xdc\x02\xf0\xff\xec\x01\ +\xdc\x02\xf2\xff\xec\x01\xdc\x02\xf4\xff\xec\x01\xdc\x03\x0a\xff\ +\xec\x01\xdc\x03\x0c\xff\xec\x01\xdc\x03\x12\xff\xc3\x01\xdc\x03\ +\x16\xff\xec\x01\xdc\x03\x1a\xff\xec\x01\xdc\x03\x1c\xff\xc3\x01\ +\xdd\x00\x0f\xff\xae\x01\xdd\x00\x11\xff\xae\x01\xdd\x01\xce\xff\ +\xd7\x01\xdd\x01\xd5\xff\xd7\x01\xdd\x01\xf2\xff\xd7\x01\xdd\x02\ +\x08\xff\xae\x01\xdd\x02\x0c\xff\xae\x01\xdd\x02s\xff\xd7\x01\ +\xdd\x02\xcf\xff\xd7\x01\xdd\x03\x12\xff\xd7\x01\xdd\x03\x1c\xff\ +\xd7\x01\xde\x00\x05\xff\xec\x01\xde\x00\x0a\xff\xec\x01\xde\x01\ +\xd0\xff\xd7\x01\xde\x01\xdc\xff\xec\x01\xde\x01\xdd\xff\xec\x01\ +\xde\x01\xdf\xff\xd7\x01\xde\x01\xe1\xff\xec\x01\xde\x01\xe4\xff\ +\xec\x01\xde\x01\xf6\xff\xec\x01\xde\x02\x07\xff\xec\x01\xde\x02\ +\x0b\xff\xec\x01\xde\x02\xa0\xff\xd7\x01\xde\x02\xaa\xff\xec\x01\ +\xde\x02\xb6\xff\xec\x01\xde\x02\xbc\xff\xd7\x01\xde\x02\xbe\xff\ +\xec\x01\xde\x02\xc0\xff\xec\x01\xde\x02\xc2\xff\xec\x01\xde\x02\ +\xcb\xff\xd7\x01\xde\x02\xd5\xff\xec\x01\xde\x02\xe6\xff\xd7\x01\ +\xde\x02\xf8\xff\xec\x01\xde\x02\xfa\xff\xec\x01\xde\x02\xfc\xff\ +\xec\x01\xde\x02\xfe\xff\xec\x01\xde\x03\x06\xff\xd7\x01\xde\x03\ +\x08\xff\xd7\x01\xde\x03\x0e\xff\xec\x01\xde\x03\x10\xff\xec\x01\ +\xde\x03\x18\xff\xec\x01\xdf\x01\xcf\xff\xd7\x01\xdf\x01\xd8\xff\ +\xd7\x01\xdf\x01\xdb\xff\xd7\x01\xdf\x01\xde\xff\xd7\x01\xdf\x01\ +\xe1\xff\xd7\x01\xdf\x01\xea\xff\xd7\x01\xdf\x01\xed\xff\xd7\x01\ +\xdf\x02j\xff\xd7\x01\xdf\x02\x7f\xff\xd7\x01\xdf\x02\x85\xff\ +\xd7\x01\xdf\x02\x87\xff\xd7\x01\xdf\x02\x89\xff\xd7\x01\xdf\x02\ +\x8d\xff\xd7\x01\xdf\x02\xb2\xff\xd7\x01\xdf\x02\xb4\xff\xd7\x01\ +\xdf\x02\xc0\xff\xd7\x01\xdf\x02\xc2\xff\xd7\x01\xdf\x02\xc6\xff\ +\xd7\x01\xdf\x02\xc8\xff\xd7\x01\xdf\x02\xd5\xff\xd7\x01\xdf\x02\ +\xe0\xff\xd7\x01\xdf\x02\xf0\xff\xd7\x01\xdf\x02\xf2\xff\xd7\x01\ +\xdf\x02\xf4\xff\xd7\x01\xdf\x02\xfe\xff\xd7\x01\xdf\x03\x0a\xff\ +\xd7\x01\xdf\x03\x0c\xff\xd7\x01\xdf\x03\x16\xff\xd7\x01\xdf\x03\ +\x1a\xff\xd7\x01\xe0\x00\x05\xff\xec\x01\xe0\x00\x0a\xff\xec\x01\ +\xe0\x02\x07\xff\xec\x01\xe0\x02\x0b\xff\xec\x01\xe3\x00\x05\xff\ +\xec\x01\xe3\x00\x0a\xff\xec\x01\xe3\x02\x07\xff\xec\x01\xe3\x02\ +\x0b\xff\xec\x01\xe4\x00\x05\xff\x85\x01\xe4\x00\x0a\xff\x85\x01\ +\xe4\x01\xd0\xff\xd7\x01\xe4\x01\xdc\xff\x9a\x01\xe4\x01\xdd\xff\ +\xc3\x01\xe4\x01\xdf\xff\xd7\x01\xe4\x01\xe1\xff\xae\x01\xe4\x01\ +\xe4\xff\x9a\x01\xe4\x01\xf6\xff\xc3\x01\xe4\x02\x07\xff\x85\x01\ +\xe4\x02\x0b\xff\x85\x01\xe4\x02m\xff\xd7\x01\xe4\x02\x81\xff\ +\xd7\x01\xe4\x02\x83\xff\xd7\x01\xe4\x02\x8b\xff\xd7\x01\xe4\x02\ +\xa0\xff\xd7\x01\xe4\x02\xaa\xff\x9a\x01\xe4\x02\xb6\xff\x9a\x01\ +\xe4\x02\xb8\xff\xc3\x01\xe4\x02\xba\xff\xc3\x01\xe4\x02\xbc\xff\ +\xd7\x01\xe4\x02\xbe\xff\x9a\x01\xe4\x02\xc0\xff\xae\x01\xe4\x02\ +\xc2\xff\xae\x01\xe4\x02\xc6\xff\xd7\x01\xe4\x02\xc8\xff\xd7\x01\ +\xe4\x02\xcb\xff\xd7\x01\xe4\x02\xd5\xff\xae\x01\xe4\x02\xe6\xff\ +\xd7\x01\xe4\x02\xea\xff\xd7\x01\xe4\x02\xf8\xff\xc3\x01\xe4\x02\ +\xfa\xff\xc3\x01\xe4\x02\xfc\xff\xc3\x01\xe4\x02\xfe\xff\xae\x01\ +\xe4\x03\x06\xff\xd7\x01\xe4\x03\x08\xff\xd7\x01\xe4\x03\x0e\xff\ +\x9a\x01\xe4\x03\x10\xff\x9a\x01\xe4\x03\x18\xff\x9a\x01\xe6\x00\ +\x05\xff\x85\x01\xe6\x00\x0a\xff\x85\x01\xe6\x01\xd0\xff\xd7\x01\ +\xe6\x01\xdc\xff\x9a\x01\xe6\x01\xdd\xff\xc3\x01\xe6\x01\xdf\xff\ +\xd7\x01\xe6\x01\xe1\xff\xae\x01\xe6\x01\xe4\xff\x9a\x01\xe6\x01\ +\xf6\xff\xc3\x01\xe6\x02\x07\xff\x85\x01\xe6\x02\x0b\xff\x85\x01\ +\xe6\x02m\xff\xd7\x01\xe6\x02\x81\xff\xd7\x01\xe6\x02\x83\xff\ +\xd7\x01\xe6\x02\x8b\xff\xd7\x01\xe6\x02\xa0\xff\xd7\x01\xe6\x02\ +\xaa\xff\x9a\x01\xe6\x02\xb6\xff\x9a\x01\xe6\x02\xb8\xff\xc3\x01\ +\xe6\x02\xba\xff\xc3\x01\xe6\x02\xbc\xff\xd7\x01\xe6\x02\xbe\xff\ +\x9a\x01\xe6\x02\xc0\xff\xae\x01\xe6\x02\xc2\xff\xae\x01\xe6\x02\ +\xc6\xff\xd7\x01\xe6\x02\xc8\xff\xd7\x01\xe6\x02\xcb\xff\xd7\x01\ +\xe6\x02\xd5\xff\xae\x01\xe6\x02\xe6\xff\xd7\x01\xe6\x02\xea\xff\ +\xd7\x01\xe6\x02\xf8\xff\xc3\x01\xe6\x02\xfa\xff\xc3\x01\xe6\x02\ +\xfc\xff\xc3\x01\xe6\x02\xfe\xff\xae\x01\xe6\x03\x06\xff\xd7\x01\ +\xe6\x03\x08\xff\xd7\x01\xe6\x03\x0e\xff\x9a\x01\xe6\x03\x10\xff\ +\x9a\x01\xe6\x03\x18\xff\x9a\x01\xe7\x00\x05\xff\xec\x01\xe7\x00\ +\x0a\xff\xec\x01\xe7\x01\xd0\xff\xd7\x01\xe7\x01\xdc\xff\xec\x01\ +\xe7\x01\xdd\xff\xec\x01\xe7\x01\xdf\xff\xd7\x01\xe7\x01\xe1\xff\ +\xec\x01\xe7\x01\xe4\xff\xec\x01\xe7\x01\xf6\xff\xec\x01\xe7\x02\ +\x07\xff\xec\x01\xe7\x02\x0b\xff\xec\x01\xe7\x02\xa0\xff\xd7\x01\ +\xe7\x02\xaa\xff\xec\x01\xe7\x02\xb6\xff\xec\x01\xe7\x02\xbc\xff\ +\xd7\x01\xe7\x02\xbe\xff\xec\x01\xe7\x02\xc0\xff\xec\x01\xe7\x02\ +\xc2\xff\xec\x01\xe7\x02\xcb\xff\xd7\x01\xe7\x02\xd5\xff\xec\x01\ +\xe7\x02\xe6\xff\xd7\x01\xe7\x02\xf8\xff\xec\x01\xe7\x02\xfa\xff\ +\xec\x01\xe7\x02\xfc\xff\xec\x01\xe7\x02\xfe\xff\xec\x01\xe7\x03\ +\x06\xff\xd7\x01\xe7\x03\x08\xff\xd7\x01\xe7\x03\x0e\xff\xec\x01\ +\xe7\x03\x10\xff\xec\x01\xe7\x03\x18\xff\xec\x01\xe8\x00\x05\xff\ +\xec\x01\xe8\x00\x0a\xff\xec\x01\xe8\x01\xd0\xff\xd7\x01\xe8\x01\ +\xdc\xff\xec\x01\xe8\x01\xdd\xff\xec\x01\xe8\x01\xdf\xff\xd7\x01\ +\xe8\x01\xe1\xff\xec\x01\xe8\x01\xe4\xff\xec\x01\xe8\x01\xf6\xff\ +\xec\x01\xe8\x02\x07\xff\xec\x01\xe8\x02\x0b\xff\xec\x01\xe8\x02\ +\xa0\xff\xd7\x01\xe8\x02\xaa\xff\xec\x01\xe8\x02\xb6\xff\xec\x01\ +\xe8\x02\xbc\xff\xd7\x01\xe8\x02\xbe\xff\xec\x01\xe8\x02\xc0\xff\ +\xec\x01\xe8\x02\xc2\xff\xec\x01\xe8\x02\xcb\xff\xd7\x01\xe8\x02\ +\xd5\xff\xec\x01\xe8\x02\xe6\xff\xd7\x01\xe8\x02\xf8\xff\xec\x01\ +\xe8\x02\xfa\xff\xec\x01\xe8\x02\xfc\xff\xec\x01\xe8\x02\xfe\xff\ +\xec\x01\xe8\x03\x06\xff\xd7\x01\xe8\x03\x08\xff\xd7\x01\xe8\x03\ +\x0e\xff\xec\x01\xe8\x03\x10\xff\xec\x01\xe8\x03\x18\xff\xec\x01\ +\xea\x00\x05\xff\xec\x01\xea\x00\x0a\xff\xec\x01\xea\x02\x07\xff\ +\xec\x01\xea\x02\x0b\xff\xec\x01\xeb\x00\x05\xff\xec\x01\xeb\x00\ +\x0a\xff\xec\x01\xeb\x02\x07\xff\xec\x01\xeb\x02\x0b\xff\xec\x01\ +\xeb\x03\x0e\xff\xd7\x01\xeb\x03\x10\xff\xd7\x01\xec\x00\x0f\xff\ +\x9a\x01\xec\x00\x10\xff\xd7\x01\xec\x00\x11\xff\x9a\x01\xec\x01\ +\xce\xff\xc3\x01\xec\x01\xcf\xff\xec\x01\xec\x01\xd5\xff\xc3\x01\ +\xec\x01\xd8\xff\xec\x01\xec\x01\xdb\xff\xec\x01\xec\x01\xde\xff\ +\xec\x01\xec\x01\xea\xff\xec\x01\xec\x01\xed\xff\xec\x01\xec\x01\ +\xf2\xff\xc3\x01\xec\x02\x02\xff\xd7\x01\xec\x02\x03\xff\xd7\x01\ +\xec\x02\x04\xff\xd7\x01\xec\x02\x08\xff\x9a\x01\xec\x02\x0c\xff\ +\x9a\x01\xec\x02j\xff\xec\x01\xec\x02s\xff\xc3\x01\xec\x02\ +\x7f\xff\xec\x01\xec\x02\x85\xff\xec\x01\xec\x02\x87\xff\xec\x01\ +\xec\x02\x89\xff\xec\x01\xec\x02\x8d\xff\xec\x01\xec\x02\xb2\xff\ +\xec\x01\xec\x02\xb4\xff\xec\x01\xec\x02\xcf\xff\xc3\x01\xec\x02\ +\xe0\xff\xec\x01\xec\x02\xf0\xff\xec\x01\xec\x02\xf2\xff\xec\x01\ +\xec\x02\xf4\xff\xec\x01\xec\x03\x0a\xff\xec\x01\xec\x03\x0c\xff\ +\xec\x01\xec\x03\x12\xff\xc3\x01\xec\x03\x16\xff\xec\x01\xec\x03\ +\x1a\xff\xec\x01\xec\x03\x1c\xff\xc3\x01\xf2\x00\x05\xff\x85\x01\ +\xf2\x00\x0a\xff\x85\x01\xf2\x01\xd0\xff\xd7\x01\xf2\x01\xdc\xff\ +\x9a\x01\xf2\x01\xdd\xff\xc3\x01\xf2\x01\xdf\xff\xd7\x01\xf2\x01\ +\xe1\xff\xae\x01\xf2\x01\xe4\xff\x9a\x01\xf2\x01\xf6\xff\xc3\x01\ +\xf2\x02\x07\xff\x85\x01\xf2\x02\x0b\xff\x85\x01\xf2\x02m\xff\ +\xd7\x01\xf2\x02\x81\xff\xd7\x01\xf2\x02\x83\xff\xd7\x01\xf2\x02\ +\x8b\xff\xd7\x01\xf2\x02\xa0\xff\xd7\x01\xf2\x02\xaa\xff\x9a\x01\ +\xf2\x02\xb6\xff\x9a\x01\xf2\x02\xb8\xff\xc3\x01\xf2\x02\xba\xff\ +\xc3\x01\xf2\x02\xbc\xff\xd7\x01\xf2\x02\xbe\xff\x9a\x01\xf2\x02\ +\xc0\xff\xae\x01\xf2\x02\xc2\xff\xae\x01\xf2\x02\xc6\xff\xd7\x01\ +\xf2\x02\xc8\xff\xd7\x01\xf2\x02\xcb\xff\xd7\x01\xf2\x02\xd5\xff\ +\xae\x01\xf2\x02\xe6\xff\xd7\x01\xf2\x02\xea\xff\xd7\x01\xf2\x02\ +\xf8\xff\xc3\x01\xf2\x02\xfa\xff\xc3\x01\xf2\x02\xfc\xff\xc3\x01\ +\xf2\x02\xfe\xff\xae\x01\xf2\x03\x06\xff\xd7\x01\xf2\x03\x08\xff\ +\xd7\x01\xf2\x03\x0e\xff\x9a\x01\xf2\x03\x10\xff\x9a\x01\xf2\x03\ +\x18\xff\x9a\x01\xf3\x00\x05\xff\x85\x01\xf3\x00\x0a\xff\x85\x01\ +\xf3\x01\xd0\xff\xd7\x01\xf3\x01\xdc\xff\x9a\x01\xf3\x01\xdd\xff\ +\xc3\x01\xf3\x01\xdf\xff\xd7\x01\xf3\x01\xe1\xff\xae\x01\xf3\x01\ +\xe4\xff\x9a\x01\xf3\x01\xf6\xff\xc3\x01\xf3\x02\x07\xff\x85\x01\ +\xf3\x02\x0b\xff\x85\x01\xf3\x02m\xff\xd7\x01\xf3\x02\x81\xff\ +\xd7\x01\xf3\x02\x83\xff\xd7\x01\xf3\x02\x8b\xff\xd7\x01\xf3\x02\ +\xa0\xff\xd7\x01\xf3\x02\xaa\xff\x9a\x01\xf3\x02\xb6\xff\x9a\x01\ +\xf3\x02\xb8\xff\xc3\x01\xf3\x02\xba\xff\xc3\x01\xf3\x02\xbc\xff\ +\xd7\x01\xf3\x02\xbe\xff\x9a\x01\xf3\x02\xc0\xff\xae\x01\xf3\x02\ +\xc2\xff\xae\x01\xf3\x02\xc6\xff\xd7\x01\xf3\x02\xc8\xff\xd7\x01\ +\xf3\x02\xcb\xff\xd7\x01\xf3\x02\xd5\xff\xae\x01\xf3\x02\xe6\xff\ +\xd7\x01\xf3\x02\xea\xff\xd7\x01\xf3\x02\xf8\xff\xc3\x01\xf3\x02\ +\xfa\xff\xc3\x01\xf3\x02\xfc\xff\xc3\x01\xf3\x02\xfe\xff\xae\x01\ +\xf3\x03\x06\xff\xd7\x01\xf3\x03\x08\xff\xd7\x01\xf3\x03\x0e\xff\ +\x9a\x01\xf3\x03\x10\xff\x9a\x01\xf3\x03\x18\xff\x9a\x01\xf4\x00\ +\x05\xff\xec\x01\xf4\x00\x0a\xff\xec\x01\xf4\x02\x07\xff\xec\x01\ +\xf4\x02\x0b\xff\xec\x01\xf4\x03\x0e\xff\xd7\x01\xf4\x03\x10\xff\ +\xd7\x01\xf5\x01\xcf\xff\xd7\x01\xf5\x01\xd8\xff\xd7\x01\xf5\x01\ +\xdb\xff\xd7\x01\xf5\x01\xde\xff\xd7\x01\xf5\x01\xe1\xff\xd7\x01\ +\xf5\x01\xea\xff\xd7\x01\xf5\x01\xed\xff\xd7\x01\xf5\x02j\xff\ +\xd7\x01\xf5\x02\x7f\xff\xd7\x01\xf5\x02\x85\xff\xd7\x01\xf5\x02\ +\x87\xff\xd7\x01\xf5\x02\x89\xff\xd7\x01\xf5\x02\x8d\xff\xd7\x01\ +\xf5\x02\xb2\xff\xd7\x01\xf5\x02\xb4\xff\xd7\x01\xf5\x02\xc0\xff\ +\xd7\x01\xf5\x02\xc2\xff\xd7\x01\xf5\x02\xc6\xff\xd7\x01\xf5\x02\ +\xc8\xff\xd7\x01\xf5\x02\xd5\xff\xd7\x01\xf5\x02\xe0\xff\xd7\x01\ +\xf5\x02\xf0\xff\xd7\x01\xf5\x02\xf2\xff\xd7\x01\xf5\x02\xf4\xff\ +\xd7\x01\xf5\x02\xfe\xff\xd7\x01\xf5\x03\x0a\xff\xd7\x01\xf5\x03\ +\x0c\xff\xd7\x01\xf5\x03\x16\xff\xd7\x01\xf5\x03\x1a\xff\xd7\x01\ +\xf6\x00\x0f\xff\xae\x01\xf6\x00\x11\xff\xae\x01\xf6\x01\xce\xff\ +\xd7\x01\xf6\x01\xd5\xff\xd7\x01\xf6\x01\xf2\xff\xd7\x01\xf6\x02\ +\x08\xff\xae\x01\xf6\x02\x0c\xff\xae\x01\xf6\x02s\xff\xd7\x01\ +\xf6\x02\xcf\xff\xd7\x01\xf6\x03\x12\xff\xd7\x01\xf6\x03\x1c\xff\ +\xd7\x01\xf8\x00\x0f\xff\x85\x01\xf8\x00\x10\xff\xae\x01\xf8\x00\ +\x11\xff\x85\x01\xf8\x01\x9f\xff\xd7\x01\xf8\x01\xa4\xff\x9a\x01\ +\xf8\x01\xaa\xffq\x01\xf8\x01\xae\xff\x9a\x01\xf8\x01\xb5\xff\ +\x9a\x01\xf8\x01\xb8\xff\xd7\x01\xf8\x01\xbb\xff\xd7\x01\xf8\x01\ +\xbc\x00)\x01\xf8\x01\xbe\xff\xae\x01\xf8\x01\xcc\xff\x9a\x01\ +\xf8\x01\xcd\xff\x9a\x01\xf8\x01\xce\xff\x85\x01\xf8\x01\xcf\xff\ +q\x01\xf8\x01\xd0\xff\xd7\x01\xf8\x01\xd1\xff\xd7\x01\xf8\x01\ +\xd2\xff\x9a\x01\xf8\x01\xd3\xff\x9a\x01\xf8\x01\xd4\xff\x9a\x01\ +\xf8\x01\xd5\xff\x85\x01\xf8\x01\xd6\xff\x9a\x01\xf8\x01\xd7\xff\ +\x9a\x01\xf8\x01\xd8\xffq\x01\xf8\x01\xd9\xff\x9a\x01\xf8\x01\ +\xda\xff\x9a\x01\xf8\x01\xdb\xffq\x01\xf8\x01\xdc\xff\xae\x01\ +\xf8\x01\xdd\xff\xae\x01\xf8\x01\xde\xffq\x01\xf8\x01\xdf\xff\ +\xd7\x01\xf8\x01\xe0\xff\x9a\x01\xf8\x01\xe1\xff\x9a\x01\xf8\x01\ +\xe2\xff\x9a\x01\xf8\x01\xe3\xff\x9a\x01\xf8\x01\xe4\xff\xae\x01\ +\xf8\x01\xe5\xff\x9a\x01\xf8\x01\xe6\xff\x9a\x01\xf8\x01\xe7\xff\ +\xd7\x01\xf8\x01\xe8\xff\x9a\x01\xf8\x01\xe9\xff\xc3\x01\xf8\x01\ +\xea\xffq\x01\xf8\x01\xec\xff\x9a\x01\xf8\x01\xed\xffq\x01\ +\xf8\x01\xee\xff\x85\x01\xf8\x01\xf2\xff\x85\x01\xf8\x01\xf3\xff\ +\x9a\x01\xf8\x01\xf5\xff\x9a\x01\xf8\x01\xf6\xff\xae\x01\xf8\x01\ +\xf7\xff\x9a\x01\xf8\x01\xf9\xff\x9a\x01\xf8\x02\x02\xff\xae\x01\ +\xf8\x02\x03\xff\xae\x01\xf8\x02\x04\xff\xae\x01\xf8\x02\x08\xff\ +\x85\x01\xf8\x02\x0c\xff\x85\x01\xf8\x02j\xffq\x01\xf8\x02\ +k\xff\x9a\x01\xf8\x02l\xff\xd7\x01\xf8\x02m\xff\xd7\x01\ +\xf8\x02q\xff\x9a\x01\xf8\x02r\xffq\x01\xf8\x02s\xff\ +\x85\x01\xf8\x02u\xff\x9a\x01\xf8\x02w\xff\x9a\x01\xf8\x02\ +y\xff\x9a\x01\xf8\x02}\xff\x9a\x01\xf8\x02~\xff\xd7\x01\ +\xf8\x02\x7f\xffq\x01\xf8\x02\x81\xff\xd7\x01\xf8\x02\x83\xff\ +\xd7\x01\xf8\x02\x84\xff\xd7\x01\xf8\x02\x85\xffq\x01\xf8\x02\ +\x86\xff\xd7\x01\xf8\x02\x87\xffq\x01\xf8\x02\x88\xff\xd7\x01\ +\xf8\x02\x89\xffq\x01\xf8\x02\x8a\xff\xd7\x01\xf8\x02\x8b\xff\ +\xd7\x01\xf8\x02\x8c\xff\xd7\x01\xf8\x02\x8d\xffq\x01\xf8\x02\ +\x96\xff\x9a\x01\xf8\x02\x9a\xff\x9a\x01\xf8\x02\x9e\xff\x9a\x01\ +\xf8\x02\xa0\xff\xd7\x01\xf8\x02\xa2\xff\xd7\x01\xf8\x02\xa4\xff\ +\x9a\x01\xf8\x02\xa6\xff\x9a\x01\xf8\x02\xaa\xff\xae\x01\xf8\x02\ +\xac\xff\x9a\x01\xf8\x02\xae\xff\x9a\x01\xf8\x02\xb0\xff\x9a\x01\ +\xf8\x02\xb1\xff\xd7\x01\xf8\x02\xb2\xffq\x01\xf8\x02\xb3\xff\ +\xd7\x01\xf8\x02\xb4\xffq\x01\xf8\x02\xb5\x00)\x01\xf8\x02\ +\xb6\xff\xae\x01\xf8\x02\xb8\xff\xae\x01\xf8\x02\xba\xff\xae\x01\ +\xf8\x02\xbc\xff\xd7\x01\xf8\x02\xbe\xff\xae\x01\xf8\x02\xc0\xff\ +\x9a\x01\xf8\x02\xc2\xff\x9a\x01\xf8\x02\xc4\xff\x9a\x01\xf8\x02\ +\xc5\xff\x9a\x01\xf8\x02\xc6\xffq\x01\xf8\x02\xc7\xff\x9a\x01\ +\xf8\x02\xc8\xffq\x01\xf8\x02\xcb\xff\xd7\x01\xf8\x02\xcd\xff\ +\x9a\x01\xf8\x02\xce\xff\x9a\x01\xf8\x02\xcf\xff\x85\x01\xf8\x02\ +\xd1\xff\x9a\x01\xf8\x02\xd3\xff\x9a\x01\xf8\x02\xd5\xff\x9a\x01\ +\xf8\x02\xd7\xff\x9a\x01\xf8\x02\xd9\xffq\x01\xf8\x02\xdb\xff\ +q\x01\xf8\x02\xdd\xffq\x01\xf8\x02\xe0\xffq\x01\xf8\x02\ +\xe6\xff\xd7\x01\xf8\x02\xe8\xff\xd7\x01\xf8\x02\xea\xff\xc3\x01\ +\xf8\x02\xec\xff\x9a\x01\xf8\x02\xee\xff\x9a\x01\xf8\x02\xef\xff\ +\xd7\x01\xf8\x02\xf0\xffq\x01\xf8\x02\xf1\xff\xd7\x01\xf8\x02\ +\xf2\xffq\x01\xf8\x02\xf3\xff\xd7\x01\xf8\x02\xf4\xffq\x01\ +\xf8\x02\xf6\xff\xd7\x01\xf8\x02\xf8\xff\xae\x01\xf8\x02\xfa\xff\ +\xae\x01\xf8\x02\xfc\xff\xae\x01\xf8\x02\xfe\xff\x9a\x01\xf8\x03\ +\x00\xff\x9a\x01\xf8\x03\x02\xff\x9a\x01\xf8\x03\x06\xff\xd7\x01\ +\xf8\x03\x08\xff\xd7\x01\xf8\x03\x09\xffq\x01\xf8\x03\x0a\xff\ +q\x01\xf8\x03\x0b\xffq\x01\xf8\x03\x0c\xffq\x01\xf8\x03\ +\x0e\xff\x9a\x01\xf8\x03\x10\xff\x9a\x01\xf8\x03\x11\xff\x9a\x01\ +\xf8\x03\x12\xff\x85\x01\xf8\x03\x14\xff\x9a\x01\xf8\x03\x15\xff\ +\xd7\x01\xf8\x03\x16\xffq\x01\xf8\x03\x18\xff\xae\x01\xf8\x03\ +\x1a\xffq\x01\xf8\x03\x1b\xff\x9a\x01\xf8\x03\x1c\xff\x85\x01\ +\xf9\x00\x0f\xff\x9a\x01\xf9\x00\x10\xff\xd7\x01\xf9\x00\x11\xff\ +\x9a\x01\xf9\x01\xce\xff\xc3\x01\xf9\x01\xcf\xff\xec\x01\xf9\x01\ +\xd5\xff\xc3\x01\xf9\x01\xd8\xff\xec\x01\xf9\x01\xdb\xff\xec\x01\ +\xf9\x01\xde\xff\xec\x01\xf9\x01\xea\xff\xec\x01\xf9\x01\xed\xff\ +\xec\x01\xf9\x01\xf2\xff\xc3\x01\xf9\x02\x02\xff\xd7\x01\xf9\x02\ +\x03\xff\xd7\x01\xf9\x02\x04\xff\xd7\x01\xf9\x02\x08\xff\x9a\x01\ +\xf9\x02\x0c\xff\x9a\x01\xf9\x02j\xff\xec\x01\xf9\x02s\xff\ +\xc3\x01\xf9\x02\x7f\xff\xec\x01\xf9\x02\x85\xff\xec\x01\xf9\x02\ +\x87\xff\xec\x01\xf9\x02\x89\xff\xec\x01\xf9\x02\x8d\xff\xec\x01\ +\xf9\x02\xb2\xff\xec\x01\xf9\x02\xb4\xff\xec\x01\xf9\x02\xcf\xff\ +\xc3\x01\xf9\x02\xe0\xff\xec\x01\xf9\x02\xf0\xff\xec\x01\xf9\x02\ +\xf2\xff\xec\x01\xf9\x02\xf4\xff\xec\x01\xf9\x03\x0a\xff\xec\x01\ +\xf9\x03\x0c\xff\xec\x01\xf9\x03\x12\xff\xc3\x01\xf9\x03\x16\xff\ +\xec\x01\xf9\x03\x1a\xff\xec\x01\xf9\x03\x1c\xff\xc3\x01\xfa\x00\ +\x0f\xff\x9a\x01\xfa\x00\x11\xff\x9a\x01\xfa\x00\x22\x00)\x01\ +\xfa\x00$\xff\xae\x01\xfa\x00&\xff\xec\x01\xfa\x00*\xff\ +\xec\x01\xfa\x002\xff\xec\x01\xfa\x004\xff\xec\x01\xfa\x00\ +D\xff\xd7\x01\xfa\x00F\xff\xd7\x01\xfa\x00G\xff\xd7\x01\ +\xfa\x00H\xff\xd7\x01\xfa\x00J\xff\xec\x01\xfa\x00P\xff\ +\xec\x01\xfa\x00Q\xff\xec\x01\xfa\x00R\xff\xd7\x01\xfa\x00\ +S\xff\xec\x01\xfa\x00T\xff\xd7\x01\xfa\x00U\xff\xec\x01\ +\xfa\x00V\xff\xec\x01\xfa\x00X\xff\xec\x01\xfa\x00\x82\xff\ +\xae\x01\xfa\x00\x83\xff\xae\x01\xfa\x00\x84\xff\xae\x01\xfa\x00\ +\x85\xff\xae\x01\xfa\x00\x86\xff\xae\x01\xfa\x00\x87\xff\xae\x01\ +\xfa\x00\x89\xff\xec\x01\xfa\x00\x94\xff\xec\x01\xfa\x00\x95\xff\ +\xec\x01\xfa\x00\x96\xff\xec\x01\xfa\x00\x97\xff\xec\x01\xfa\x00\ +\x98\xff\xec\x01\xfa\x00\x9a\xff\xec\x01\xfa\x00\xa2\xff\xd7\x01\ +\xfa\x00\xa3\xff\xd7\x01\xfa\x00\xa4\xff\xd7\x01\xfa\x00\xa5\xff\ +\xd7\x01\xfa\x00\xa6\xff\xd7\x01\xfa\x00\xa7\xff\xd7\x01\xfa\x00\ +\xa8\xff\xd7\x01\xfa\x00\xa9\xff\xd7\x01\xfa\x00\xaa\xff\xd7\x01\ +\xfa\x00\xab\xff\xd7\x01\xfa\x00\xac\xff\xd7\x01\xfa\x00\xad\xff\ +\xd7\x01\xfa\x00\xb4\xff\xd7\x01\xfa\x00\xb5\xff\xd7\x01\xfa\x00\ +\xb6\xff\xd7\x01\xfa\x00\xb7\xff\xd7\x01\xfa\x00\xb8\xff\xd7\x01\ +\xfa\x00\xba\xff\xd7\x01\xfa\x00\xbb\xff\xec\x01\xfa\x00\xbc\xff\ +\xec\x01\xfa\x00\xbd\xff\xec\x01\xfa\x00\xbe\xff\xec\x01\xfa\x00\ +\xc2\xff\xae\x01\xfa\x00\xc3\xff\xd7\x01\xfa\x00\xc4\xff\xae\x01\ +\xfa\x00\xc5\xff\xd7\x01\xfa\x00\xc6\xff\xae\x01\xfa\x00\xc7\xff\ +\xd7\x01\xfa\x00\xc8\xff\xec\x01\xfa\x00\xc9\xff\xd7\x01\xfa\x00\ +\xca\xff\xec\x01\xfa\x00\xcb\xff\xd7\x01\xfa\x00\xcc\xff\xec\x01\ +\xfa\x00\xcd\xff\xd7\x01\xfa\x00\xce\xff\xec\x01\xfa\x00\xcf\xff\ +\xd7\x01\xfa\x00\xd1\xff\xd7\x01\xfa\x00\xd3\xff\xd7\x01\xfa\x00\ +\xd5\xff\xd7\x01\xfa\x00\xd7\xff\xd7\x01\xfa\x00\xd9\xff\xd7\x01\ +\xfa\x00\xdb\xff\xd7\x01\xfa\x00\xdd\xff\xd7\x01\xfa\x00\xde\xff\ +\xec\x01\xfa\x00\xdf\xff\xec\x01\xfa\x00\xe0\xff\xec\x01\xfa\x00\ +\xe1\xff\xec\x01\xfa\x00\xe2\xff\xec\x01\xfa\x00\xe3\xff\xec\x01\ +\xfa\x00\xe4\xff\xec\x01\xfa\x00\xe5\xff\xec\x01\xfa\x00\xfa\xff\ +\xec\x01\xfa\x01\x06\xff\xec\x01\xfa\x01\x08\xff\xec\x01\xfa\x01\ +\x0d\xff\xec\x01\xfa\x01\x0e\xff\xec\x01\xfa\x01\x0f\xff\xd7\x01\ +\xfa\x01\x10\xff\xec\x01\xfa\x01\x11\xff\xd7\x01\xfa\x01\x12\xff\ +\xec\x01\xfa\x01\x13\xff\xd7\x01\xfa\x01\x14\xff\xec\x01\xfa\x01\ +\x15\xff\xd7\x01\xfa\x01\x17\xff\xec\x01\xfa\x01\x19\xff\xec\x01\ +\xfa\x01\x1d\xff\xec\x01\xfa\x01!\xff\xec\x01\xfa\x01+\xff\ +\xec\x01\xfa\x01-\xff\xec\x01\xfa\x01/\xff\xec\x01\xfa\x01\ +1\xff\xec\x01\xfa\x013\xff\xec\x01\xfa\x015\xff\xec\x01\ +\xfa\x01C\xff\xae\x01\xfa\x01D\xff\xd7\x01\xfa\x01F\xff\ +\xd7\x01\xfa\x01G\xff\xec\x01\xfa\x01H\xff\xd7\x01\xfa\x01\ +J\xff\xec\x01\xfa\x02\x08\xff\x9a\x01\xfa\x02\x0c\xff\x9a\x01\ +\xfa\x02W\xff\xec\x01\xfa\x02X\xff\xae\x01\xfa\x02Y\xff\ +\xd7\x01\xfa\x02_\xff\xec\x01\xfa\x02`\xff\xd7\x01\xfa\x02\ +b\xff\xec\x01\xfa\x03\x1d\xff\xae\x01\xfa\x03\x1e\xff\xd7\x01\ +\xfa\x03\x1f\xff\xae\x01\xfa\x03 \xff\xd7\x01\xfa\x03!\xff\ +\xae\x01\xfa\x03\x22\xff\xd7\x01\xfa\x03#\xff\xae\x01\xfa\x03\ +%\xff\xae\x01\xfa\x03&\xff\xd7\x01\xfa\x03'\xff\xae\x01\ +\xfa\x03(\xff\xd7\x01\xfa\x03)\xff\xae\x01\xfa\x03*\xff\ +\xd7\x01\xfa\x03+\xff\xae\x01\xfa\x03,\xff\xd7\x01\xfa\x03\ +-\xff\xae\x01\xfa\x03.\xff\xd7\x01\xfa\x03/\xff\xae\x01\ +\xfa\x030\xff\xd7\x01\xfa\x031\xff\xae\x01\xfa\x032\xff\ +\xd7\x01\xfa\x033\xff\xae\x01\xfa\x034\xff\xd7\x01\xfa\x03\ +6\xff\xd7\x01\xfa\x038\xff\xd7\x01\xfa\x03:\xff\xd7\x01\ +\xfa\x03<\xff\xd7\x01\xfa\x03@\xff\xd7\x01\xfa\x03B\xff\ +\xd7\x01\xfa\x03D\xff\xd7\x01\xfa\x03I\xff\xec\x01\xfa\x03\ +J\xff\xd7\x01\xfa\x03K\xff\xec\x01\xfa\x03L\xff\xd7\x01\ +\xfa\x03M\xff\xec\x01\xfa\x03N\xff\xd7\x01\xfa\x03O\xff\ +\xec\x01\xfa\x03Q\xff\xec\x01\xfa\x03R\xff\xd7\x01\xfa\x03\ +S\xff\xec\x01\xfa\x03T\xff\xd7\x01\xfa\x03U\xff\xec\x01\ +\xfa\x03V\xff\xd7\x01\xfa\x03W\xff\xec\x01\xfa\x03X\xff\ +\xd7\x01\xfa\x03Y\xff\xec\x01\xfa\x03Z\xff\xd7\x01\xfa\x03\ +[\xff\xec\x01\xfa\x03\x5c\xff\xd7\x01\xfa\x03]\xff\xec\x01\ +\xfa\x03^\xff\xd7\x01\xfa\x03_\xff\xec\x01\xfa\x03`\xff\ +\xd7\x01\xfa\x03b\xff\xec\x01\xfa\x03d\xff\xec\x01\xfa\x03\ +f\xff\xec\x01\xfa\x03h\xff\xec\x01\xfa\x03j\xff\xec\x01\ +\xfa\x03l\xff\xec\x01\xfa\x03n\xff\xec\x01\xfb\x00\x05\x00\ +R\x01\xfb\x00\x0a\x00R\x01\xfb\x00\x0f\xff\xae\x01\xfb\x00\ +\x11\xff\xae\x01\xfb\x00\x22\x00)\x01\xfb\x02\x07\x00R\x01\ +\xfb\x02\x08\xff\xae\x01\xfb\x02\x0b\x00R\x01\xfb\x02\x0c\xff\ +\xae\x01\xfc\x00\x0f\xff\x9a\x01\xfc\x00\x11\xff\x9a\x01\xfc\x00\ +\x22\x00)\x01\xfc\x00$\xff\xae\x01\xfc\x00&\xff\xec\x01\ +\xfc\x00*\xff\xec\x01\xfc\x002\xff\xec\x01\xfc\x004\xff\ +\xec\x01\xfc\x00D\xff\xd7\x01\xfc\x00F\xff\xd7\x01\xfc\x00\ +G\xff\xd7\x01\xfc\x00H\xff\xd7\x01\xfc\x00J\xff\xec\x01\ +\xfc\x00P\xff\xec\x01\xfc\x00Q\xff\xec\x01\xfc\x00R\xff\ +\xd7\x01\xfc\x00S\xff\xec\x01\xfc\x00T\xff\xd7\x01\xfc\x00\ +U\xff\xec\x01\xfc\x00V\xff\xec\x01\xfc\x00X\xff\xec\x01\ +\xfc\x00\x82\xff\xae\x01\xfc\x00\x83\xff\xae\x01\xfc\x00\x84\xff\ +\xae\x01\xfc\x00\x85\xff\xae\x01\xfc\x00\x86\xff\xae\x01\xfc\x00\ +\x87\xff\xae\x01\xfc\x00\x89\xff\xec\x01\xfc\x00\x94\xff\xec\x01\ +\xfc\x00\x95\xff\xec\x01\xfc\x00\x96\xff\xec\x01\xfc\x00\x97\xff\ +\xec\x01\xfc\x00\x98\xff\xec\x01\xfc\x00\x9a\xff\xec\x01\xfc\x00\ +\xa2\xff\xd7\x01\xfc\x00\xa3\xff\xd7\x01\xfc\x00\xa4\xff\xd7\x01\ +\xfc\x00\xa5\xff\xd7\x01\xfc\x00\xa6\xff\xd7\x01\xfc\x00\xa7\xff\ +\xd7\x01\xfc\x00\xa8\xff\xd7\x01\xfc\x00\xa9\xff\xd7\x01\xfc\x00\ +\xaa\xff\xd7\x01\xfc\x00\xab\xff\xd7\x01\xfc\x00\xac\xff\xd7\x01\ +\xfc\x00\xad\xff\xd7\x01\xfc\x00\xb4\xff\xd7\x01\xfc\x00\xb5\xff\ +\xd7\x01\xfc\x00\xb6\xff\xd7\x01\xfc\x00\xb7\xff\xd7\x01\xfc\x00\ +\xb8\xff\xd7\x01\xfc\x00\xba\xff\xd7\x01\xfc\x00\xbb\xff\xec\x01\ +\xfc\x00\xbc\xff\xec\x01\xfc\x00\xbd\xff\xec\x01\xfc\x00\xbe\xff\ +\xec\x01\xfc\x00\xc2\xff\xae\x01\xfc\x00\xc3\xff\xd7\x01\xfc\x00\ +\xc4\xff\xae\x01\xfc\x00\xc5\xff\xd7\x01\xfc\x00\xc6\xff\xae\x01\ +\xfc\x00\xc7\xff\xd7\x01\xfc\x00\xc8\xff\xec\x01\xfc\x00\xc9\xff\ +\xd7\x01\xfc\x00\xca\xff\xec\x01\xfc\x00\xcb\xff\xd7\x01\xfc\x00\ +\xcc\xff\xec\x01\xfc\x00\xcd\xff\xd7\x01\xfc\x00\xce\xff\xec\x01\ +\xfc\x00\xcf\xff\xd7\x01\xfc\x00\xd1\xff\xd7\x01\xfc\x00\xd3\xff\ +\xd7\x01\xfc\x00\xd5\xff\xd7\x01\xfc\x00\xd7\xff\xd7\x01\xfc\x00\ +\xd9\xff\xd7\x01\xfc\x00\xdb\xff\xd7\x01\xfc\x00\xdd\xff\xd7\x01\ +\xfc\x00\xde\xff\xec\x01\xfc\x00\xdf\xff\xec\x01\xfc\x00\xe0\xff\ +\xec\x01\xfc\x00\xe1\xff\xec\x01\xfc\x00\xe2\xff\xec\x01\xfc\x00\ +\xe3\xff\xec\x01\xfc\x00\xe4\xff\xec\x01\xfc\x00\xe5\xff\xec\x01\ +\xfc\x00\xfa\xff\xec\x01\xfc\x01\x06\xff\xec\x01\xfc\x01\x08\xff\ +\xec\x01\xfc\x01\x0d\xff\xec\x01\xfc\x01\x0e\xff\xec\x01\xfc\x01\ +\x0f\xff\xd7\x01\xfc\x01\x10\xff\xec\x01\xfc\x01\x11\xff\xd7\x01\ +\xfc\x01\x12\xff\xec\x01\xfc\x01\x13\xff\xd7\x01\xfc\x01\x14\xff\ +\xec\x01\xfc\x01\x15\xff\xd7\x01\xfc\x01\x17\xff\xec\x01\xfc\x01\ +\x19\xff\xec\x01\xfc\x01\x1d\xff\xec\x01\xfc\x01!\xff\xec\x01\ +\xfc\x01+\xff\xec\x01\xfc\x01-\xff\xec\x01\xfc\x01/\xff\ +\xec\x01\xfc\x011\xff\xec\x01\xfc\x013\xff\xec\x01\xfc\x01\ +5\xff\xec\x01\xfc\x01C\xff\xae\x01\xfc\x01D\xff\xd7\x01\ +\xfc\x01F\xff\xd7\x01\xfc\x01G\xff\xec\x01\xfc\x01H\xff\ +\xd7\x01\xfc\x01J\xff\xec\x01\xfc\x02\x08\xff\x9a\x01\xfc\x02\ +\x0c\xff\x9a\x01\xfc\x02W\xff\xec\x01\xfc\x02X\xff\xae\x01\ +\xfc\x02Y\xff\xd7\x01\xfc\x02_\xff\xec\x01\xfc\x02`\xff\ +\xd7\x01\xfc\x02b\xff\xec\x01\xfc\x03\x1d\xff\xae\x01\xfc\x03\ +\x1e\xff\xd7\x01\xfc\x03\x1f\xff\xae\x01\xfc\x03 \xff\xd7\x01\ +\xfc\x03!\xff\xae\x01\xfc\x03\x22\xff\xd7\x01\xfc\x03#\xff\ +\xae\x01\xfc\x03%\xff\xae\x01\xfc\x03&\xff\xd7\x01\xfc\x03\ +'\xff\xae\x01\xfc\x03(\xff\xd7\x01\xfc\x03)\xff\xae\x01\ +\xfc\x03*\xff\xd7\x01\xfc\x03+\xff\xae\x01\xfc\x03,\xff\ +\xd7\x01\xfc\x03-\xff\xae\x01\xfc\x03.\xff\xd7\x01\xfc\x03\ +/\xff\xae\x01\xfc\x030\xff\xd7\x01\xfc\x031\xff\xae\x01\ +\xfc\x032\xff\xd7\x01\xfc\x033\xff\xae\x01\xfc\x034\xff\ +\xd7\x01\xfc\x036\xff\xd7\x01\xfc\x038\xff\xd7\x01\xfc\x03\ +:\xff\xd7\x01\xfc\x03<\xff\xd7\x01\xfc\x03@\xff\xd7\x01\ +\xfc\x03B\xff\xd7\x01\xfc\x03D\xff\xd7\x01\xfc\x03I\xff\ +\xec\x01\xfc\x03J\xff\xd7\x01\xfc\x03K\xff\xec\x01\xfc\x03\ +L\xff\xd7\x01\xfc\x03M\xff\xec\x01\xfc\x03N\xff\xd7\x01\ +\xfc\x03O\xff\xec\x01\xfc\x03Q\xff\xec\x01\xfc\x03R\xff\ +\xd7\x01\xfc\x03S\xff\xec\x01\xfc\x03T\xff\xd7\x01\xfc\x03\ +U\xff\xec\x01\xfc\x03V\xff\xd7\x01\xfc\x03W\xff\xec\x01\ +\xfc\x03X\xff\xd7\x01\xfc\x03Y\xff\xec\x01\xfc\x03Z\xff\ +\xd7\x01\xfc\x03[\xff\xec\x01\xfc\x03\x5c\xff\xd7\x01\xfc\x03\ +]\xff\xec\x01\xfc\x03^\xff\xd7\x01\xfc\x03_\xff\xec\x01\ +\xfc\x03`\xff\xd7\x01\xfc\x03b\xff\xec\x01\xfc\x03d\xff\ +\xec\x01\xfc\x03f\xff\xec\x01\xfc\x03h\xff\xec\x01\xfc\x03\ +j\xff\xec\x01\xfc\x03l\xff\xec\x01\xfc\x03n\xff\xec\x01\ +\xfd\x00\x05\x00R\x01\xfd\x00\x0a\x00R\x01\xfd\x00\x0f\xff\ +\xae\x01\xfd\x00\x11\xff\xae\x01\xfd\x00\x22\x00)\x01\xfd\x02\ +\x07\x00R\x01\xfd\x02\x08\xff\xae\x01\xfd\x02\x0b\x00R\x01\ +\xfd\x02\x0c\xff\xae\x01\xfe\x00\x0f\xff\x9a\x01\xfe\x00\x11\xff\ +\x9a\x01\xfe\x00\x22\x00)\x01\xfe\x00$\xff\xae\x01\xfe\x00\ +&\xff\xec\x01\xfe\x00*\xff\xec\x01\xfe\x002\xff\xec\x01\ +\xfe\x004\xff\xec\x01\xfe\x00D\xff\xd7\x01\xfe\x00F\xff\ +\xd7\x01\xfe\x00G\xff\xd7\x01\xfe\x00H\xff\xd7\x01\xfe\x00\ +J\xff\xec\x01\xfe\x00P\xff\xec\x01\xfe\x00Q\xff\xec\x01\ +\xfe\x00R\xff\xd7\x01\xfe\x00S\xff\xec\x01\xfe\x00T\xff\ +\xd7\x01\xfe\x00U\xff\xec\x01\xfe\x00V\xff\xec\x01\xfe\x00\ +X\xff\xec\x01\xfe\x00\x82\xff\xae\x01\xfe\x00\x83\xff\xae\x01\ +\xfe\x00\x84\xff\xae\x01\xfe\x00\x85\xff\xae\x01\xfe\x00\x86\xff\ +\xae\x01\xfe\x00\x87\xff\xae\x01\xfe\x00\x89\xff\xec\x01\xfe\x00\ +\x94\xff\xec\x01\xfe\x00\x95\xff\xec\x01\xfe\x00\x96\xff\xec\x01\ +\xfe\x00\x97\xff\xec\x01\xfe\x00\x98\xff\xec\x01\xfe\x00\x9a\xff\ +\xec\x01\xfe\x00\xa2\xff\xd7\x01\xfe\x00\xa3\xff\xd7\x01\xfe\x00\ +\xa4\xff\xd7\x01\xfe\x00\xa5\xff\xd7\x01\xfe\x00\xa6\xff\xd7\x01\ +\xfe\x00\xa7\xff\xd7\x01\xfe\x00\xa8\xff\xd7\x01\xfe\x00\xa9\xff\ +\xd7\x01\xfe\x00\xaa\xff\xd7\x01\xfe\x00\xab\xff\xd7\x01\xfe\x00\ +\xac\xff\xd7\x01\xfe\x00\xad\xff\xd7\x01\xfe\x00\xb4\xff\xd7\x01\ +\xfe\x00\xb5\xff\xd7\x01\xfe\x00\xb6\xff\xd7\x01\xfe\x00\xb7\xff\ +\xd7\x01\xfe\x00\xb8\xff\xd7\x01\xfe\x00\xba\xff\xd7\x01\xfe\x00\ +\xbb\xff\xec\x01\xfe\x00\xbc\xff\xec\x01\xfe\x00\xbd\xff\xec\x01\ +\xfe\x00\xbe\xff\xec\x01\xfe\x00\xc2\xff\xae\x01\xfe\x00\xc3\xff\ +\xd7\x01\xfe\x00\xc4\xff\xae\x01\xfe\x00\xc5\xff\xd7\x01\xfe\x00\ +\xc6\xff\xae\x01\xfe\x00\xc7\xff\xd7\x01\xfe\x00\xc8\xff\xec\x01\ +\xfe\x00\xc9\xff\xd7\x01\xfe\x00\xca\xff\xec\x01\xfe\x00\xcb\xff\ +\xd7\x01\xfe\x00\xcc\xff\xec\x01\xfe\x00\xcd\xff\xd7\x01\xfe\x00\ +\xce\xff\xec\x01\xfe\x00\xcf\xff\xd7\x01\xfe\x00\xd1\xff\xd7\x01\ +\xfe\x00\xd3\xff\xd7\x01\xfe\x00\xd5\xff\xd7\x01\xfe\x00\xd7\xff\ +\xd7\x01\xfe\x00\xd9\xff\xd7\x01\xfe\x00\xdb\xff\xd7\x01\xfe\x00\ +\xdd\xff\xd7\x01\xfe\x00\xde\xff\xec\x01\xfe\x00\xdf\xff\xec\x01\ +\xfe\x00\xe0\xff\xec\x01\xfe\x00\xe1\xff\xec\x01\xfe\x00\xe2\xff\ +\xec\x01\xfe\x00\xe3\xff\xec\x01\xfe\x00\xe4\xff\xec\x01\xfe\x00\ +\xe5\xff\xec\x01\xfe\x00\xfa\xff\xec\x01\xfe\x01\x06\xff\xec\x01\ +\xfe\x01\x08\xff\xec\x01\xfe\x01\x0d\xff\xec\x01\xfe\x01\x0e\xff\ +\xec\x01\xfe\x01\x0f\xff\xd7\x01\xfe\x01\x10\xff\xec\x01\xfe\x01\ +\x11\xff\xd7\x01\xfe\x01\x12\xff\xec\x01\xfe\x01\x13\xff\xd7\x01\ +\xfe\x01\x14\xff\xec\x01\xfe\x01\x15\xff\xd7\x01\xfe\x01\x17\xff\ +\xec\x01\xfe\x01\x19\xff\xec\x01\xfe\x01\x1d\xff\xec\x01\xfe\x01\ +!\xff\xec\x01\xfe\x01+\xff\xec\x01\xfe\x01-\xff\xec\x01\ +\xfe\x01/\xff\xec\x01\xfe\x011\xff\xec\x01\xfe\x013\xff\ +\xec\x01\xfe\x015\xff\xec\x01\xfe\x01C\xff\xae\x01\xfe\x01\ +D\xff\xd7\x01\xfe\x01F\xff\xd7\x01\xfe\x01G\xff\xec\x01\ +\xfe\x01H\xff\xd7\x01\xfe\x01J\xff\xec\x01\xfe\x02\x08\xff\ +\x9a\x01\xfe\x02\x0c\xff\x9a\x01\xfe\x02W\xff\xec\x01\xfe\x02\ +X\xff\xae\x01\xfe\x02Y\xff\xd7\x01\xfe\x02_\xff\xec\x01\ +\xfe\x02`\xff\xd7\x01\xfe\x02b\xff\xec\x01\xfe\x03\x1d\xff\ +\xae\x01\xfe\x03\x1e\xff\xd7\x01\xfe\x03\x1f\xff\xae\x01\xfe\x03\ + \xff\xd7\x01\xfe\x03!\xff\xae\x01\xfe\x03\x22\xff\xd7\x01\ +\xfe\x03#\xff\xae\x01\xfe\x03%\xff\xae\x01\xfe\x03&\xff\ +\xd7\x01\xfe\x03'\xff\xae\x01\xfe\x03(\xff\xd7\x01\xfe\x03\ +)\xff\xae\x01\xfe\x03*\xff\xd7\x01\xfe\x03+\xff\xae\x01\ +\xfe\x03,\xff\xd7\x01\xfe\x03-\xff\xae\x01\xfe\x03.\xff\ +\xd7\x01\xfe\x03/\xff\xae\x01\xfe\x030\xff\xd7\x01\xfe\x03\ +1\xff\xae\x01\xfe\x032\xff\xd7\x01\xfe\x033\xff\xae\x01\ +\xfe\x034\xff\xd7\x01\xfe\x036\xff\xd7\x01\xfe\x038\xff\ +\xd7\x01\xfe\x03:\xff\xd7\x01\xfe\x03<\xff\xd7\x01\xfe\x03\ +@\xff\xd7\x01\xfe\x03B\xff\xd7\x01\xfe\x03D\xff\xd7\x01\ +\xfe\x03I\xff\xec\x01\xfe\x03J\xff\xd7\x01\xfe\x03K\xff\ +\xec\x01\xfe\x03L\xff\xd7\x01\xfe\x03M\xff\xec\x01\xfe\x03\ +N\xff\xd7\x01\xfe\x03O\xff\xec\x01\xfe\x03Q\xff\xec\x01\ +\xfe\x03R\xff\xd7\x01\xfe\x03S\xff\xec\x01\xfe\x03T\xff\ +\xd7\x01\xfe\x03U\xff\xec\x01\xfe\x03V\xff\xd7\x01\xfe\x03\ +W\xff\xec\x01\xfe\x03X\xff\xd7\x01\xfe\x03Y\xff\xec\x01\ +\xfe\x03Z\xff\xd7\x01\xfe\x03[\xff\xec\x01\xfe\x03\x5c\xff\ +\xd7\x01\xfe\x03]\xff\xec\x01\xfe\x03^\xff\xd7\x01\xfe\x03\ +_\xff\xec\x01\xfe\x03`\xff\xd7\x01\xfe\x03b\xff\xec\x01\ +\xfe\x03d\xff\xec\x01\xfe\x03f\xff\xec\x01\xfe\x03h\xff\ +\xec\x01\xfe\x03j\xff\xec\x01\xfe\x03l\xff\xec\x01\xfe\x03\ +n\xff\xec\x01\xff\x00\x05\x00R\x01\xff\x00\x0a\x00R\x01\ +\xff\x00\x0f\xff\xae\x01\xff\x00\x11\xff\xae\x01\xff\x00\x22\x00\ +)\x01\xff\x02\x07\x00R\x01\xff\x02\x08\xff\xae\x01\xff\x02\ +\x0b\x00R\x01\xff\x02\x0c\xff\xae\x02\x00\x00\x0f\xff\x85\x02\ +\x00\x00\x11\xff\x85\x02\x00\x00\x22\x00)\x02\x00\x00$\xff\ +\x85\x02\x00\x00&\xff\xd7\x02\x00\x00*\xff\xd7\x02\x00\x00\ +2\xff\xd7\x02\x00\x004\xff\xd7\x02\x00\x00D\xff\x9a\x02\ +\x00\x00F\xff\x9a\x02\x00\x00G\xff\x9a\x02\x00\x00H\xff\ +\x9a\x02\x00\x00J\xff\xd7\x02\x00\x00P\xff\xc3\x02\x00\x00\ +Q\xff\xc3\x02\x00\x00R\xff\x9a\x02\x00\x00S\xff\xc3\x02\ +\x00\x00T\xff\x9a\x02\x00\x00U\xff\xc3\x02\x00\x00V\xff\ +\xae\x02\x00\x00X\xff\xc3\x02\x00\x00]\xff\xd7\x02\x00\x00\ +\x82\xff\x85\x02\x00\x00\x83\xff\x85\x02\x00\x00\x84\xff\x85\x02\ +\x00\x00\x85\xff\x85\x02\x00\x00\x86\xff\x85\x02\x00\x00\x87\xff\ +\x85\x02\x00\x00\x89\xff\xd7\x02\x00\x00\x94\xff\xd7\x02\x00\x00\ +\x95\xff\xd7\x02\x00\x00\x96\xff\xd7\x02\x00\x00\x97\xff\xd7\x02\ +\x00\x00\x98\xff\xd7\x02\x00\x00\x9a\xff\xd7\x02\x00\x00\xa2\xff\ +\x9a\x02\x00\x00\xa3\xff\x9a\x02\x00\x00\xa4\xff\x9a\x02\x00\x00\ +\xa5\xff\x9a\x02\x00\x00\xa6\xff\x9a\x02\x00\x00\xa7\xff\x9a\x02\ +\x00\x00\xa8\xff\x9a\x02\x00\x00\xa9\xff\x9a\x02\x00\x00\xaa\xff\ +\x9a\x02\x00\x00\xab\xff\x9a\x02\x00\x00\xac\xff\x9a\x02\x00\x00\ +\xad\xff\x9a\x02\x00\x00\xb4\xff\x9a\x02\x00\x00\xb5\xff\x9a\x02\ +\x00\x00\xb6\xff\x9a\x02\x00\x00\xb7\xff\x9a\x02\x00\x00\xb8\xff\ +\x9a\x02\x00\x00\xba\xff\x9a\x02\x00\x00\xbb\xff\xc3\x02\x00\x00\ +\xbc\xff\xc3\x02\x00\x00\xbd\xff\xc3\x02\x00\x00\xbe\xff\xc3\x02\ +\x00\x00\xc2\xff\x85\x02\x00\x00\xc3\xff\x9a\x02\x00\x00\xc4\xff\ +\x85\x02\x00\x00\xc5\xff\x9a\x02\x00\x00\xc6\xff\x85\x02\x00\x00\ +\xc7\xff\x9a\x02\x00\x00\xc8\xff\xd7\x02\x00\x00\xc9\xff\x9a\x02\ +\x00\x00\xca\xff\xd7\x02\x00\x00\xcb\xff\x9a\x02\x00\x00\xcc\xff\ +\xd7\x02\x00\x00\xcd\xff\x9a\x02\x00\x00\xce\xff\xd7\x02\x00\x00\ +\xcf\xff\x9a\x02\x00\x00\xd1\xff\x9a\x02\x00\x00\xd3\xff\x9a\x02\ +\x00\x00\xd5\xff\x9a\x02\x00\x00\xd7\xff\x9a\x02\x00\x00\xd9\xff\ +\x9a\x02\x00\x00\xdb\xff\x9a\x02\x00\x00\xdd\xff\x9a\x02\x00\x00\ +\xde\xff\xd7\x02\x00\x00\xdf\xff\xd7\x02\x00\x00\xe0\xff\xd7\x02\ +\x00\x00\xe1\xff\xd7\x02\x00\x00\xe2\xff\xd7\x02\x00\x00\xe3\xff\ +\xd7\x02\x00\x00\xe4\xff\xd7\x02\x00\x00\xe5\xff\xd7\x02\x00\x00\ +\xfa\xff\xc3\x02\x00\x01\x06\xff\xc3\x02\x00\x01\x08\xff\xc3\x02\ +\x00\x01\x0d\xff\xc3\x02\x00\x01\x0e\xff\xd7\x02\x00\x01\x0f\xff\ +\x9a\x02\x00\x01\x10\xff\xd7\x02\x00\x01\x11\xff\x9a\x02\x00\x01\ +\x12\xff\xd7\x02\x00\x01\x13\xff\x9a\x02\x00\x01\x14\xff\xd7\x02\ +\x00\x01\x15\xff\x9a\x02\x00\x01\x17\xff\xc3\x02\x00\x01\x19\xff\ +\xc3\x02\x00\x01\x1d\xff\xae\x02\x00\x01!\xff\xae\x02\x00\x01\ ++\xff\xc3\x02\x00\x01-\xff\xc3\x02\x00\x01/\xff\xc3\x02\ +\x00\x011\xff\xc3\x02\x00\x013\xff\xc3\x02\x00\x015\xff\ +\xc3\x02\x00\x01<\xff\xd7\x02\x00\x01>\xff\xd7\x02\x00\x01\ +@\xff\xd7\x02\x00\x01C\xff\x85\x02\x00\x01D\xff\x9a\x02\ +\x00\x01F\xff\x9a\x02\x00\x01G\xff\xd7\x02\x00\x01H\xff\ +\x9a\x02\x00\x01J\xff\xae\x02\x00\x02\x08\xff\x85\x02\x00\x02\ +\x0c\xff\x85\x02\x00\x02W\xff\xc3\x02\x00\x02X\xff\x85\x02\ +\x00\x02Y\xff\x9a\x02\x00\x02_\xff\xd7\x02\x00\x02`\xff\ +\x9a\x02\x00\x02b\xff\xc3\x02\x00\x03\x1d\xff\x85\x02\x00\x03\ +\x1e\xff\x9a\x02\x00\x03\x1f\xff\x85\x02\x00\x03 \xff\x9a\x02\ +\x00\x03!\xff\x85\x02\x00\x03\x22\xff\x9a\x02\x00\x03#\xff\ +\x85\x02\x00\x03%\xff\x85\x02\x00\x03&\xff\x9a\x02\x00\x03\ +'\xff\x85\x02\x00\x03(\xff\x9a\x02\x00\x03)\xff\x85\x02\ +\x00\x03*\xff\x9a\x02\x00\x03+\xff\x85\x02\x00\x03,\xff\ +\x9a\x02\x00\x03-\xff\x85\x02\x00\x03.\xff\x9a\x02\x00\x03\ +/\xff\x85\x02\x00\x030\xff\x9a\x02\x00\x031\xff\x85\x02\ +\x00\x032\xff\x9a\x02\x00\x033\xff\x85\x02\x00\x034\xff\ +\x9a\x02\x00\x036\xff\x9a\x02\x00\x038\xff\x9a\x02\x00\x03\ +:\xff\x9a\x02\x00\x03<\xff\x9a\x02\x00\x03@\xff\x9a\x02\ +\x00\x03B\xff\x9a\x02\x00\x03D\xff\x9a\x02\x00\x03I\xff\ +\xd7\x02\x00\x03J\xff\x9a\x02\x00\x03K\xff\xd7\x02\x00\x03\ +L\xff\x9a\x02\x00\x03M\xff\xd7\x02\x00\x03N\xff\x9a\x02\ +\x00\x03O\xff\xd7\x02\x00\x03Q\xff\xd7\x02\x00\x03R\xff\ +\x9a\x02\x00\x03S\xff\xd7\x02\x00\x03T\xff\x9a\x02\x00\x03\ +U\xff\xd7\x02\x00\x03V\xff\x9a\x02\x00\x03W\xff\xd7\x02\ +\x00\x03X\xff\x9a\x02\x00\x03Y\xff\xd7\x02\x00\x03Z\xff\ +\x9a\x02\x00\x03[\xff\xd7\x02\x00\x03\x5c\xff\x9a\x02\x00\x03\ +]\xff\xd7\x02\x00\x03^\xff\x9a\x02\x00\x03_\xff\xd7\x02\ +\x00\x03`\xff\x9a\x02\x00\x03b\xff\xc3\x02\x00\x03d\xff\ +\xc3\x02\x00\x03f\xff\xc3\x02\x00\x03h\xff\xc3\x02\x00\x03\ +j\xff\xc3\x02\x00\x03l\xff\xc3\x02\x00\x03n\xff\xc3\x02\ +\x01\x00\x05\x00R\x02\x01\x00\x0a\x00R\x02\x01\x00\x0f\xff\ +\xae\x02\x01\x00\x11\xff\xae\x02\x01\x00\x22\x00)\x02\x01\x02\ +\x07\x00R\x02\x01\x02\x08\xff\xae\x02\x01\x02\x0b\x00R\x02\ +\x01\x02\x0c\xff\xae\x02\x02\x007\xff\xae\x02\x02\x01$\xff\ +\xae\x02\x02\x01&\xff\xae\x02\x02\x01q\xff\xae\x02\x02\x01\ +\x9d\xff\xae\x02\x02\x01\xa6\xff\xae\x02\x02\x01\xbc\xff\xae\x02\ +\x02\x01\xc4\xff\xae\x02\x02\x01\xdc\xff\xd7\x02\x02\x01\xe4\xff\ +\xd7\x02\x02\x02\xa9\xff\xae\x02\x02\x02\xaa\xff\xd7\x02\x02\x02\ +\xb5\xff\xae\x02\x02\x02\xb6\xff\xd7\x02\x02\x02\xbd\xff\xae\x02\ +\x02\x02\xbe\xff\xd7\x02\x02\x03\x17\xff\xae\x02\x02\x03\x18\xff\ +\xd7\x02\x02\x03\x8f\xff\xae\x02\x03\x007\xff\xae\x02\x03\x01\ +$\xff\xae\x02\x03\x01&\xff\xae\x02\x03\x01q\xff\xae\x02\ +\x03\x01\x9d\xff\xae\x02\x03\x01\xa6\xff\xae\x02\x03\x01\xbc\xff\ +\xae\x02\x03\x01\xc4\xff\xae\x02\x03\x01\xdc\xff\xd7\x02\x03\x01\ +\xe4\xff\xd7\x02\x03\x02\xa9\xff\xae\x02\x03\x02\xaa\xff\xd7\x02\ +\x03\x02\xb5\xff\xae\x02\x03\x02\xb6\xff\xd7\x02\x03\x02\xbd\xff\ +\xae\x02\x03\x02\xbe\xff\xd7\x02\x03\x03\x17\xff\xae\x02\x03\x03\ +\x18\xff\xd7\x02\x03\x03\x8f\xff\xae\x02\x04\x007\xff\xae\x02\ +\x04\x01$\xff\xae\x02\x04\x01&\xff\xae\x02\x04\x01q\xff\ +\xae\x02\x04\x01\x9d\xff\xae\x02\x04\x01\xa6\xff\xae\x02\x04\x01\ +\xbc\xff\xae\x02\x04\x01\xc4\xff\xae\x02\x04\x01\xdc\xff\xd7\x02\ +\x04\x01\xe4\xff\xd7\x02\x04\x02\xa9\xff\xae\x02\x04\x02\xaa\xff\ +\xd7\x02\x04\x02\xb5\xff\xae\x02\x04\x02\xb6\xff\xd7\x02\x04\x02\ +\xbd\xff\xae\x02\x04\x02\xbe\xff\xd7\x02\x04\x03\x17\xff\xae\x02\ +\x04\x03\x18\xff\xd7\x02\x04\x03\x8f\xff\xae\x02\x06\x00$\xff\ +q\x02\x06\x007\x00)\x02\x06\x009\x00)\x02\x06\x00\ +:\x00)\x02\x06\x00<\x00\x14\x02\x06\x00D\xff\xae\x02\ +\x06\x00F\xff\x85\x02\x06\x00G\xff\x85\x02\x06\x00H\xff\ +\x85\x02\x06\x00J\xff\xc3\x02\x06\x00P\xff\xc3\x02\x06\x00\ +Q\xff\xc3\x02\x06\x00R\xff\x85\x02\x06\x00S\xff\xc3\x02\ +\x06\x00T\xff\x85\x02\x06\x00U\xff\xc3\x02\x06\x00V\xff\ +\xc3\x02\x06\x00X\xff\xc3\x02\x06\x00\x82\xffq\x02\x06\x00\ +\x83\xffq\x02\x06\x00\x84\xffq\x02\x06\x00\x85\xffq\x02\ +\x06\x00\x86\xffq\x02\x06\x00\x87\xffq\x02\x06\x00\x9f\x00\ +\x14\x02\x06\x00\xa2\xff\x85\x02\x06\x00\xa3\xff\xae\x02\x06\x00\ +\xa4\xff\xae\x02\x06\x00\xa5\xff\xae\x02\x06\x00\xa6\xff\xae\x02\ +\x06\x00\xa7\xff\xae\x02\x06\x00\xa8\xff\xae\x02\x06\x00\xa9\xff\ +\x85\x02\x06\x00\xaa\xff\x85\x02\x06\x00\xab\xff\x85\x02\x06\x00\ +\xac\xff\x85\x02\x06\x00\xad\xff\x85\x02\x06\x00\xb4\xff\x85\x02\ +\x06\x00\xb5\xff\x85\x02\x06\x00\xb6\xff\x85\x02\x06\x00\xb7\xff\ +\x85\x02\x06\x00\xb8\xff\x85\x02\x06\x00\xba\xff\x85\x02\x06\x00\ +\xbb\xff\xc3\x02\x06\x00\xbc\xff\xc3\x02\x06\x00\xbd\xff\xc3\x02\ +\x06\x00\xbe\xff\xc3\x02\x06\x00\xc2\xffq\x02\x06\x00\xc3\xff\ +\xae\x02\x06\x00\xc4\xffq\x02\x06\x00\xc5\xff\xae\x02\x06\x00\ +\xc6\xffq\x02\x06\x00\xc7\xff\xae\x02\x06\x00\xc9\xff\x85\x02\ +\x06\x00\xcb\xff\x85\x02\x06\x00\xcd\xff\x85\x02\x06\x00\xcf\xff\ +\x85\x02\x06\x00\xd1\xff\x85\x02\x06\x00\xd3\xff\x85\x02\x06\x00\ +\xd5\xff\x85\x02\x06\x00\xd7\xff\x85\x02\x06\x00\xd9\xff\x85\x02\ +\x06\x00\xdb\xff\x85\x02\x06\x00\xdd\xff\x85\x02\x06\x00\xdf\xff\ +\xc3\x02\x06\x00\xe1\xff\xc3\x02\x06\x00\xe3\xff\xc3\x02\x06\x00\ +\xe5\xff\xc3\x02\x06\x00\xfa\xff\xc3\x02\x06\x01\x06\xff\xc3\x02\ +\x06\x01\x08\xff\xc3\x02\x06\x01\x0d\xff\xc3\x02\x06\x01\x0f\xff\ +\x85\x02\x06\x01\x11\xff\x85\x02\x06\x01\x13\xff\x85\x02\x06\x01\ +\x15\xff\x85\x02\x06\x01\x17\xff\xc3\x02\x06\x01\x19\xff\xc3\x02\ +\x06\x01\x1d\xff\xc3\x02\x06\x01!\xff\xc3\x02\x06\x01$\x00\ +)\x02\x06\x01&\x00)\x02\x06\x01+\xff\xc3\x02\x06\x01\ +-\xff\xc3\x02\x06\x01/\xff\xc3\x02\x06\x011\xff\xc3\x02\ +\x06\x013\xff\xc3\x02\x06\x015\xff\xc3\x02\x06\x016\x00\ +)\x02\x06\x018\x00\x14\x02\x06\x01:\x00\x14\x02\x06\x01\ +C\xffq\x02\x06\x01D\xff\xae\x02\x06\x01F\xff\xae\x02\ +\x06\x01H\xff\x85\x02\x06\x01J\xff\xc3\x02\x06\x01V\xff\ +q\x02\x06\x01_\xffq\x02\x06\x01b\xffq\x02\x06\x01\ +i\xffq\x02\x06\x01y\xff\xae\x02\x06\x01z\xff\xd7\x02\ +\x06\x01{\xff\xd7\x02\x06\x01~\xff\xae\x02\x06\x01\x81\xff\ +\xc3\x02\x06\x01\x82\xff\xd7\x02\x06\x01\x83\xff\xd7\x02\x06\x01\ +\x84\xff\xd7\x02\x06\x01\x87\xff\xd7\x02\x06\x01\x89\xff\xd7\x02\ +\x06\x01\x8c\xff\xae\x02\x06\x01\x8e\xff\xc3\x02\x06\x01\x8f\xff\ +\xae\x02\x06\x01\x90\xff\xae\x02\x06\x01\x93\xff\xae\x02\x06\x01\ +\x99\xff\xae\x02\x06\x01\xa4\xff\x85\x02\x06\x01\xaa\xffq\x02\ +\x06\x01\xae\xff\x85\x02\x06\x01\xb5\xff\x85\x02\x06\x01\xca\xff\ +\xd7\x02\x06\x01\xce\xffq\x02\x06\x01\xcf\xff\x85\x02\x06\x01\ +\xd5\xffq\x02\x06\x01\xd8\xff\x85\x02\x06\x01\xdb\xff\x85\x02\ +\x06\x01\xde\xff\x85\x02\x06\x01\xea\xff\x85\x02\x06\x01\xed\xff\ +\x85\x02\x06\x01\xee\xff\xc3\x02\x06\x01\xf2\xffq\x02\x06\x01\ +\xfa\x00)\x02\x06\x01\xfc\x00)\x02\x06\x01\xfe\x00)\x02\ +\x06\x02\x00\x00\x14\x02\x06\x02W\xff\xc3\x02\x06\x02X\xff\ +q\x02\x06\x02Y\xff\xae\x02\x06\x02`\xff\x85\x02\x06\x02\ +b\xff\xc3\x02\x06\x02j\xff\x85\x02\x06\x02r\xffq\x02\ +\x06\x02s\xffq\x02\x06\x02}\xff\xec\x02\x06\x02\x7f\xff\ +\x85\x02\x06\x02\x85\xff\x85\x02\x06\x02\x87\xff\x85\x02\x06\x02\ +\x89\xff\x85\x02\x06\x02\x8d\xff\x85\x02\x06\x02\xb2\xff\x85\x02\ +\x06\x02\xb4\xff\x85\x02\x06\x02\xce\xff\x85\x02\x06\x02\xcf\xff\ +q\x02\x06\x02\xd9\xffq\x02\x06\x02\xda\xff\xd7\x02\x06\x02\ +\xdb\xffq\x02\x06\x02\xdc\xff\xd7\x02\x06\x02\xdd\xffq\x02\ +\x06\x02\xde\xff\xd7\x02\x06\x02\xe0\xff\x85\x02\x06\x02\xe2\xff\ +\xd7\x02\x06\x02\xe4\xff\xd7\x02\x06\x02\xf0\xff\x85\x02\x06\x02\ +\xf2\xff\x85\x02\x06\x02\xf4\xff\x85\x02\x06\x03\x09\xffq\x02\ +\x06\x03\x0a\xff\x85\x02\x06\x03\x0b\xffq\x02\x06\x03\x0c\xff\ +\x85\x02\x06\x03\x11\xff\x85\x02\x06\x03\x12\xffq\x02\x06\x03\ +\x16\xff\x85\x02\x06\x03\x1a\xff\x85\x02\x06\x03\x1b\xff\x85\x02\ +\x06\x03\x1c\xffq\x02\x06\x03\x1d\xffq\x02\x06\x03\x1e\xff\ +\xae\x02\x06\x03\x1f\xffq\x02\x06\x03 \xff\xae\x02\x06\x03\ +!\xffq\x02\x06\x03\x22\xff\xae\x02\x06\x03#\xffq\x02\ +\x06\x03%\xffq\x02\x06\x03&\xff\xae\x02\x06\x03'\xff\ +q\x02\x06\x03(\xff\xae\x02\x06\x03)\xffq\x02\x06\x03\ +*\xff\xae\x02\x06\x03+\xffq\x02\x06\x03,\xff\xae\x02\ +\x06\x03-\xffq\x02\x06\x03.\xff\xae\x02\x06\x03/\xff\ +q\x02\x06\x030\xff\xae\x02\x06\x031\xffq\x02\x06\x03\ +2\xff\xae\x02\x06\x033\xffq\x02\x06\x034\xff\xae\x02\ +\x06\x036\xff\x85\x02\x06\x038\xff\x85\x02\x06\x03:\xff\ +\x85\x02\x06\x03<\xff\x85\x02\x06\x03@\xff\x85\x02\x06\x03\ +B\xff\x85\x02\x06\x03D\xff\x85\x02\x06\x03J\xff\x85\x02\ +\x06\x03L\xff\x85\x02\x06\x03N\xff\x85\x02\x06\x03R\xff\ +\x85\x02\x06\x03T\xff\x85\x02\x06\x03V\xff\x85\x02\x06\x03\ +X\xff\x85\x02\x06\x03Z\xff\x85\x02\x06\x03\x5c\xff\x85\x02\ +\x06\x03^\xff\x85\x02\x06\x03`\xff\x85\x02\x06\x03b\xff\ +\xc3\x02\x06\x03d\xff\xc3\x02\x06\x03f\xff\xc3\x02\x06\x03\ +h\xff\xc3\x02\x06\x03j\xff\xc3\x02\x06\x03l\xff\xc3\x02\ +\x06\x03n\xff\xc3\x02\x06\x03o\x00\x14\x02\x06\x03q\x00\ +\x14\x02\x06\x03s\x00\x14\x02\x06\x03\x8f\x00)\x02\x07\x00\ +$\xffq\x02\x07\x007\x00)\x02\x07\x009\x00)\x02\ +\x07\x00:\x00)\x02\x07\x00<\x00\x14\x02\x07\x00D\xff\ +\xae\x02\x07\x00F\xff\x85\x02\x07\x00G\xff\x85\x02\x07\x00\ +H\xff\x85\x02\x07\x00J\xff\xc3\x02\x07\x00P\xff\xc3\x02\ +\x07\x00Q\xff\xc3\x02\x07\x00R\xff\x85\x02\x07\x00S\xff\ +\xc3\x02\x07\x00T\xff\x85\x02\x07\x00U\xff\xc3\x02\x07\x00\ +V\xff\xc3\x02\x07\x00X\xff\xc3\x02\x07\x00\x82\xffq\x02\ +\x07\x00\x83\xffq\x02\x07\x00\x84\xffq\x02\x07\x00\x85\xff\ +q\x02\x07\x00\x86\xffq\x02\x07\x00\x87\xffq\x02\x07\x00\ +\x9f\x00\x14\x02\x07\x00\xa2\xff\x85\x02\x07\x00\xa3\xff\xae\x02\ +\x07\x00\xa4\xff\xae\x02\x07\x00\xa5\xff\xae\x02\x07\x00\xa6\xff\ +\xae\x02\x07\x00\xa7\xff\xae\x02\x07\x00\xa8\xff\xae\x02\x07\x00\ +\xa9\xff\x85\x02\x07\x00\xaa\xff\x85\x02\x07\x00\xab\xff\x85\x02\ +\x07\x00\xac\xff\x85\x02\x07\x00\xad\xff\x85\x02\x07\x00\xb4\xff\ +\x85\x02\x07\x00\xb5\xff\x85\x02\x07\x00\xb6\xff\x85\x02\x07\x00\ +\xb7\xff\x85\x02\x07\x00\xb8\xff\x85\x02\x07\x00\xba\xff\x85\x02\ +\x07\x00\xbb\xff\xc3\x02\x07\x00\xbc\xff\xc3\x02\x07\x00\xbd\xff\ +\xc3\x02\x07\x00\xbe\xff\xc3\x02\x07\x00\xc2\xffq\x02\x07\x00\ +\xc3\xff\xae\x02\x07\x00\xc4\xffq\x02\x07\x00\xc5\xff\xae\x02\ +\x07\x00\xc6\xffq\x02\x07\x00\xc7\xff\xae\x02\x07\x00\xc9\xff\ +\x85\x02\x07\x00\xcb\xff\x85\x02\x07\x00\xcd\xff\x85\x02\x07\x00\ +\xcf\xff\x85\x02\x07\x00\xd1\xff\x85\x02\x07\x00\xd3\xff\x85\x02\ +\x07\x00\xd5\xff\x85\x02\x07\x00\xd7\xff\x85\x02\x07\x00\xd9\xff\ +\x85\x02\x07\x00\xdb\xff\x85\x02\x07\x00\xdd\xff\x85\x02\x07\x00\ +\xdf\xff\xc3\x02\x07\x00\xe1\xff\xc3\x02\x07\x00\xe3\xff\xc3\x02\ +\x07\x00\xe5\xff\xc3\x02\x07\x00\xfa\xff\xc3\x02\x07\x01\x06\xff\ +\xc3\x02\x07\x01\x08\xff\xc3\x02\x07\x01\x0d\xff\xc3\x02\x07\x01\ +\x0f\xff\x85\x02\x07\x01\x11\xff\x85\x02\x07\x01\x13\xff\x85\x02\ +\x07\x01\x15\xff\x85\x02\x07\x01\x17\xff\xc3\x02\x07\x01\x19\xff\ +\xc3\x02\x07\x01\x1d\xff\xc3\x02\x07\x01!\xff\xc3\x02\x07\x01\ +$\x00)\x02\x07\x01&\x00)\x02\x07\x01+\xff\xc3\x02\ +\x07\x01-\xff\xc3\x02\x07\x01/\xff\xc3\x02\x07\x011\xff\ +\xc3\x02\x07\x013\xff\xc3\x02\x07\x015\xff\xc3\x02\x07\x01\ +6\x00)\x02\x07\x018\x00\x14\x02\x07\x01:\x00\x14\x02\ +\x07\x01C\xffq\x02\x07\x01D\xff\xae\x02\x07\x01F\xff\ +\xae\x02\x07\x01H\xff\x85\x02\x07\x01J\xff\xc3\x02\x07\x01\ +V\xffq\x02\x07\x01_\xffq\x02\x07\x01b\xffq\x02\ +\x07\x01i\xffq\x02\x07\x01y\xff\xae\x02\x07\x01z\xff\ +\xd7\x02\x07\x01{\xff\xd7\x02\x07\x01~\xff\xae\x02\x07\x01\ +\x81\xff\xc3\x02\x07\x01\x82\xff\xd7\x02\x07\x01\x83\xff\xd7\x02\ +\x07\x01\x84\xff\xd7\x02\x07\x01\x87\xff\xd7\x02\x07\x01\x89\xff\ +\xd7\x02\x07\x01\x8c\xff\xae\x02\x07\x01\x8e\xff\xc3\x02\x07\x01\ +\x8f\xff\xae\x02\x07\x01\x90\xff\xae\x02\x07\x01\x93\xff\xae\x02\ +\x07\x01\x99\xff\xae\x02\x07\x01\xa4\xff\x85\x02\x07\x01\xaa\xff\ +q\x02\x07\x01\xae\xff\x85\x02\x07\x01\xb5\xff\x85\x02\x07\x01\ +\xca\xff\xd7\x02\x07\x01\xce\xffq\x02\x07\x01\xcf\xff\x85\x02\ +\x07\x01\xd5\xffq\x02\x07\x01\xd8\xff\x85\x02\x07\x01\xdb\xff\ +\x85\x02\x07\x01\xde\xff\x85\x02\x07\x01\xea\xff\x85\x02\x07\x01\ +\xed\xff\x85\x02\x07\x01\xee\xff\xc3\x02\x07\x01\xf2\xffq\x02\ +\x07\x01\xfa\x00)\x02\x07\x01\xfc\x00)\x02\x07\x01\xfe\x00\ +)\x02\x07\x02\x00\x00\x14\x02\x07\x02W\xff\xc3\x02\x07\x02\ +X\xffq\x02\x07\x02Y\xff\xae\x02\x07\x02`\xff\x85\x02\ +\x07\x02b\xff\xc3\x02\x07\x02j\xff\x85\x02\x07\x02r\xff\ +q\x02\x07\x02s\xffq\x02\x07\x02}\xff\xec\x02\x07\x02\ +\x7f\xff\x85\x02\x07\x02\x85\xff\x85\x02\x07\x02\x87\xff\x85\x02\ +\x07\x02\x89\xff\x85\x02\x07\x02\x8d\xff\x85\x02\x07\x02\xb2\xff\ +\x85\x02\x07\x02\xb4\xff\x85\x02\x07\x02\xce\xff\x85\x02\x07\x02\ +\xcf\xffq\x02\x07\x02\xd9\xffq\x02\x07\x02\xda\xff\xd7\x02\ +\x07\x02\xdb\xffq\x02\x07\x02\xdc\xff\xd7\x02\x07\x02\xdd\xff\ +q\x02\x07\x02\xde\xff\xd7\x02\x07\x02\xe0\xff\x85\x02\x07\x02\ +\xe2\xff\xd7\x02\x07\x02\xe4\xff\xd7\x02\x07\x02\xf0\xff\x85\x02\ +\x07\x02\xf2\xff\x85\x02\x07\x02\xf4\xff\x85\x02\x07\x03\x09\xff\ +q\x02\x07\x03\x0a\xff\x85\x02\x07\x03\x0b\xffq\x02\x07\x03\ +\x0c\xff\x85\x02\x07\x03\x11\xff\x85\x02\x07\x03\x12\xffq\x02\ +\x07\x03\x16\xff\x85\x02\x07\x03\x1a\xff\x85\x02\x07\x03\x1b\xff\ +\x85\x02\x07\x03\x1c\xffq\x02\x07\x03\x1d\xffq\x02\x07\x03\ +\x1e\xff\xae\x02\x07\x03\x1f\xffq\x02\x07\x03 \xff\xae\x02\ +\x07\x03!\xffq\x02\x07\x03\x22\xff\xae\x02\x07\x03#\xff\ +q\x02\x07\x03%\xffq\x02\x07\x03&\xff\xae\x02\x07\x03\ +'\xffq\x02\x07\x03(\xff\xae\x02\x07\x03)\xffq\x02\ +\x07\x03*\xff\xae\x02\x07\x03+\xffq\x02\x07\x03,\xff\ +\xae\x02\x07\x03-\xffq\x02\x07\x03.\xff\xae\x02\x07\x03\ +/\xffq\x02\x07\x030\xff\xae\x02\x07\x031\xffq\x02\ +\x07\x032\xff\xae\x02\x07\x033\xffq\x02\x07\x034\xff\ +\xae\x02\x07\x036\xff\x85\x02\x07\x038\xff\x85\x02\x07\x03\ +:\xff\x85\x02\x07\x03<\xff\x85\x02\x07\x03@\xff\x85\x02\ +\x07\x03B\xff\x85\x02\x07\x03D\xff\x85\x02\x07\x03J\xff\ +\x85\x02\x07\x03L\xff\x85\x02\x07\x03N\xff\x85\x02\x07\x03\ +R\xff\x85\x02\x07\x03T\xff\x85\x02\x07\x03V\xff\x85\x02\ +\x07\x03X\xff\x85\x02\x07\x03Z\xff\x85\x02\x07\x03\x5c\xff\ +\x85\x02\x07\x03^\xff\x85\x02\x07\x03`\xff\x85\x02\x07\x03\ +b\xff\xc3\x02\x07\x03d\xff\xc3\x02\x07\x03f\xff\xc3\x02\ +\x07\x03h\xff\xc3\x02\x07\x03j\xff\xc3\x02\x07\x03l\xff\ +\xc3\x02\x07\x03n\xff\xc3\x02\x07\x03o\x00\x14\x02\x07\x03\ +q\x00\x14\x02\x07\x03s\x00\x14\x02\x07\x03\x8f\x00)\x02\ +\x08\x00&\xff\x9a\x02\x08\x00*\xff\x9a\x02\x08\x002\xff\ +\x9a\x02\x08\x004\xff\x9a\x02\x08\x007\xffq\x02\x08\x00\ +8\xff\xd7\x02\x08\x009\xff\x85\x02\x08\x00:\xff\x85\x02\ +\x08\x00<\xff\x85\x02\x08\x00\x89\xff\x9a\x02\x08\x00\x94\xff\ +\x9a\x02\x08\x00\x95\xff\x9a\x02\x08\x00\x96\xff\x9a\x02\x08\x00\ +\x97\xff\x9a\x02\x08\x00\x98\xff\x9a\x02\x08\x00\x9a\xff\x9a\x02\ +\x08\x00\x9b\xff\xd7\x02\x08\x00\x9c\xff\xd7\x02\x08\x00\x9d\xff\ +\xd7\x02\x08\x00\x9e\xff\xd7\x02\x08\x00\x9f\xff\x85\x02\x08\x00\ +\xc8\xff\x9a\x02\x08\x00\xca\xff\x9a\x02\x08\x00\xcc\xff\x9a\x02\ +\x08\x00\xce\xff\x9a\x02\x08\x00\xde\xff\x9a\x02\x08\x00\xe0\xff\ +\x9a\x02\x08\x00\xe2\xff\x9a\x02\x08\x00\xe4\xff\x9a\x02\x08\x01\ +\x0e\xff\x9a\x02\x08\x01\x10\xff\x9a\x02\x08\x01\x12\xff\x9a\x02\ +\x08\x01\x14\xff\x9a\x02\x08\x01$\xffq\x02\x08\x01&\xff\ +q\x02\x08\x01*\xff\xd7\x02\x08\x01,\xff\xd7\x02\x08\x01\ +.\xff\xd7\x02\x08\x010\xff\xd7\x02\x08\x012\xff\xd7\x02\ +\x08\x014\xff\xd7\x02\x08\x016\xff\x85\x02\x08\x018\xff\ +\x85\x02\x08\x01:\xff\x85\x02\x08\x01G\xff\x9a\x02\x08\x01\ +f\xff\xae\x02\x08\x01m\xff\xae\x02\x08\x01q\xffq\x02\ +\x08\x01r\xff\x85\x02\x08\x01s\xff\x9a\x02\x08\x01u\xff\ +\x85\x02\x08\x01x\xff\x85\x02\x08\x01\x85\xff\xd7\x02\x08\x01\ +\x9d\xffq\x02\x08\x01\x9f\xff\x9a\x02\x08\x01\xa6\xffq\x02\ +\x08\x01\xb8\xff\x9a\x02\x08\x01\xbb\xff\x9a\x02\x08\x01\xbc\xff\ +q\x02\x08\x01\xbe\xff\xae\x02\x08\x01\xc1\xff\x5c\x02\x08\x01\ +\xc4\xffq\x02\x08\x01\xdc\xff\x9a\x02\x08\x01\xe1\xff\x85\x02\ +\x08\x01\xe4\xff\x9a\x02\x08\x01\xfa\xff\x85\x02\x08\x01\xfc\xff\ +\x85\x02\x08\x01\xfe\xff\x85\x02\x08\x02\x00\xff\x85\x02\x08\x02\ +T\xff\x85\x02\x08\x02_\xff\x9a\x02\x08\x02a\xff\xd7\x02\ +\x08\x02l\xff\x9a\x02\x08\x02|\xff\x5c\x02\x08\x02~\xff\ +\x9a\x02\x08\x02\x80\xff\x85\x02\x08\x02\x82\xff\x85\x02\x08\x02\ +\x84\xff\x9a\x02\x08\x02\x86\xff\x9a\x02\x08\x02\x88\xff\x9a\x02\ +\x08\x02\x8a\xff\x9a\x02\x08\x02\x8c\xff\x9a\x02\x08\x02\xa9\xff\ +q\x02\x08\x02\xaa\xff\x9a\x02\x08\x02\xb1\xff\x9a\x02\x08\x02\ +\xb3\xff\x9a\x02\x08\x02\xb5\xffq\x02\x08\x02\xb6\xff\x9a\x02\ +\x08\x02\xb7\xff\x85\x02\x08\x02\xb9\xff\x85\x02\x08\x02\xbd\xff\ +q\x02\x08\x02\xbe\xff\x9a\x02\x08\x02\xbf\xff\x5c\x02\x08\x02\ +\xc0\xff\x85\x02\x08\x02\xc1\xff\x5c\x02\x08\x02\xc2\xff\x85\x02\ +\x08\x02\xc5\xff\x85\x02\x08\x02\xc7\xff\x85\x02\x08\x02\xd4\xff\ +\x5c\x02\x08\x02\xd5\xff\x85\x02\x08\x02\xef\xff\x9a\x02\x08\x02\ +\xf1\xff\x9a\x02\x08\x02\xf3\xff\x9a\x02\x08\x02\xfd\xff\x5c\x02\ +\x08\x02\xfe\xff\x85\x02\x08\x03\x0d\xff\x85\x02\x08\x03\x0e\xff\ +\x9a\x02\x08\x03\x0f\xff\x85\x02\x08\x03\x10\xff\x9a\x02\x08\x03\ +\x15\xff\x9a\x02\x08\x03\x17\xffq\x02\x08\x03\x18\xff\x9a\x02\ +\x08\x03I\xff\x9a\x02\x08\x03K\xff\x9a\x02\x08\x03M\xff\ +\x9a\x02\x08\x03O\xff\x9a\x02\x08\x03Q\xff\x9a\x02\x08\x03\ +S\xff\x9a\x02\x08\x03U\xff\x9a\x02\x08\x03W\xff\x9a\x02\ +\x08\x03Y\xff\x9a\x02\x08\x03[\xff\x9a\x02\x08\x03]\xff\ +\x9a\x02\x08\x03_\xff\x9a\x02\x08\x03a\xff\xd7\x02\x08\x03\ +c\xff\xd7\x02\x08\x03e\xff\xd7\x02\x08\x03g\xff\xd7\x02\ +\x08\x03i\xff\xd7\x02\x08\x03k\xff\xd7\x02\x08\x03m\xff\ +\xd7\x02\x08\x03o\xff\x85\x02\x08\x03q\xff\x85\x02\x08\x03\ +s\xff\x85\x02\x08\x03\x8f\xffq\x02\x0a\x00$\xffq\x02\ +\x0a\x007\x00)\x02\x0a\x009\x00)\x02\x0a\x00:\x00\ +)\x02\x0a\x00<\x00\x14\x02\x0a\x00D\xff\xae\x02\x0a\x00\ +F\xff\x85\x02\x0a\x00G\xff\x85\x02\x0a\x00H\xff\x85\x02\ +\x0a\x00J\xff\xc3\x02\x0a\x00P\xff\xc3\x02\x0a\x00Q\xff\ +\xc3\x02\x0a\x00R\xff\x85\x02\x0a\x00S\xff\xc3\x02\x0a\x00\ +T\xff\x85\x02\x0a\x00U\xff\xc3\x02\x0a\x00V\xff\xc3\x02\ +\x0a\x00X\xff\xc3\x02\x0a\x00\x82\xffq\x02\x0a\x00\x83\xff\ +q\x02\x0a\x00\x84\xffq\x02\x0a\x00\x85\xffq\x02\x0a\x00\ +\x86\xffq\x02\x0a\x00\x87\xffq\x02\x0a\x00\x9f\x00\x14\x02\ +\x0a\x00\xa2\xff\x85\x02\x0a\x00\xa3\xff\xae\x02\x0a\x00\xa4\xff\ +\xae\x02\x0a\x00\xa5\xff\xae\x02\x0a\x00\xa6\xff\xae\x02\x0a\x00\ +\xa7\xff\xae\x02\x0a\x00\xa8\xff\xae\x02\x0a\x00\xa9\xff\x85\x02\ +\x0a\x00\xaa\xff\x85\x02\x0a\x00\xab\xff\x85\x02\x0a\x00\xac\xff\ +\x85\x02\x0a\x00\xad\xff\x85\x02\x0a\x00\xb4\xff\x85\x02\x0a\x00\ +\xb5\xff\x85\x02\x0a\x00\xb6\xff\x85\x02\x0a\x00\xb7\xff\x85\x02\ +\x0a\x00\xb8\xff\x85\x02\x0a\x00\xba\xff\x85\x02\x0a\x00\xbb\xff\ +\xc3\x02\x0a\x00\xbc\xff\xc3\x02\x0a\x00\xbd\xff\xc3\x02\x0a\x00\ +\xbe\xff\xc3\x02\x0a\x00\xc2\xffq\x02\x0a\x00\xc3\xff\xae\x02\ +\x0a\x00\xc4\xffq\x02\x0a\x00\xc5\xff\xae\x02\x0a\x00\xc6\xff\ +q\x02\x0a\x00\xc7\xff\xae\x02\x0a\x00\xc9\xff\x85\x02\x0a\x00\ +\xcb\xff\x85\x02\x0a\x00\xcd\xff\x85\x02\x0a\x00\xcf\xff\x85\x02\ +\x0a\x00\xd1\xff\x85\x02\x0a\x00\xd3\xff\x85\x02\x0a\x00\xd5\xff\ +\x85\x02\x0a\x00\xd7\xff\x85\x02\x0a\x00\xd9\xff\x85\x02\x0a\x00\ +\xdb\xff\x85\x02\x0a\x00\xdd\xff\x85\x02\x0a\x00\xdf\xff\xc3\x02\ +\x0a\x00\xe1\xff\xc3\x02\x0a\x00\xe3\xff\xc3\x02\x0a\x00\xe5\xff\ +\xc3\x02\x0a\x00\xfa\xff\xc3\x02\x0a\x01\x06\xff\xc3\x02\x0a\x01\ +\x08\xff\xc3\x02\x0a\x01\x0d\xff\xc3\x02\x0a\x01\x0f\xff\x85\x02\ +\x0a\x01\x11\xff\x85\x02\x0a\x01\x13\xff\x85\x02\x0a\x01\x15\xff\ +\x85\x02\x0a\x01\x17\xff\xc3\x02\x0a\x01\x19\xff\xc3\x02\x0a\x01\ +\x1d\xff\xc3\x02\x0a\x01!\xff\xc3\x02\x0a\x01$\x00)\x02\ +\x0a\x01&\x00)\x02\x0a\x01+\xff\xc3\x02\x0a\x01-\xff\ +\xc3\x02\x0a\x01/\xff\xc3\x02\x0a\x011\xff\xc3\x02\x0a\x01\ +3\xff\xc3\x02\x0a\x015\xff\xc3\x02\x0a\x016\x00)\x02\ +\x0a\x018\x00\x14\x02\x0a\x01:\x00\x14\x02\x0a\x01C\xff\ +q\x02\x0a\x01D\xff\xae\x02\x0a\x01F\xff\xae\x02\x0a\x01\ +H\xff\x85\x02\x0a\x01J\xff\xc3\x02\x0a\x01V\xffq\x02\ +\x0a\x01_\xffq\x02\x0a\x01b\xffq\x02\x0a\x01i\xff\ +q\x02\x0a\x01y\xff\xae\x02\x0a\x01z\xff\xd7\x02\x0a\x01\ +{\xff\xd7\x02\x0a\x01~\xff\xae\x02\x0a\x01\x81\xff\xc3\x02\ +\x0a\x01\x82\xff\xd7\x02\x0a\x01\x83\xff\xd7\x02\x0a\x01\x84\xff\ +\xd7\x02\x0a\x01\x87\xff\xd7\x02\x0a\x01\x89\xff\xd7\x02\x0a\x01\ +\x8c\xff\xae\x02\x0a\x01\x8e\xff\xc3\x02\x0a\x01\x8f\xff\xae\x02\ +\x0a\x01\x90\xff\xae\x02\x0a\x01\x93\xff\xae\x02\x0a\x01\x99\xff\ +\xae\x02\x0a\x01\xa4\xff\x85\x02\x0a\x01\xaa\xffq\x02\x0a\x01\ +\xae\xff\x85\x02\x0a\x01\xb5\xff\x85\x02\x0a\x01\xca\xff\xd7\x02\ +\x0a\x01\xce\xffq\x02\x0a\x01\xcf\xff\x85\x02\x0a\x01\xd5\xff\ +q\x02\x0a\x01\xd8\xff\x85\x02\x0a\x01\xdb\xff\x85\x02\x0a\x01\ +\xde\xff\x85\x02\x0a\x01\xea\xff\x85\x02\x0a\x01\xed\xff\x85\x02\ +\x0a\x01\xee\xff\xc3\x02\x0a\x01\xf2\xffq\x02\x0a\x01\xfa\x00\ +)\x02\x0a\x01\xfc\x00)\x02\x0a\x01\xfe\x00)\x02\x0a\x02\ +\x00\x00\x14\x02\x0a\x02W\xff\xc3\x02\x0a\x02X\xffq\x02\ +\x0a\x02Y\xff\xae\x02\x0a\x02`\xff\x85\x02\x0a\x02b\xff\ +\xc3\x02\x0a\x02j\xff\x85\x02\x0a\x02r\xffq\x02\x0a\x02\ +s\xffq\x02\x0a\x02}\xff\xec\x02\x0a\x02\x7f\xff\x85\x02\ +\x0a\x02\x85\xff\x85\x02\x0a\x02\x87\xff\x85\x02\x0a\x02\x89\xff\ +\x85\x02\x0a\x02\x8d\xff\x85\x02\x0a\x02\xb2\xff\x85\x02\x0a\x02\ +\xb4\xff\x85\x02\x0a\x02\xce\xff\x85\x02\x0a\x02\xcf\xffq\x02\ +\x0a\x02\xd9\xffq\x02\x0a\x02\xda\xff\xd7\x02\x0a\x02\xdb\xff\ +q\x02\x0a\x02\xdc\xff\xd7\x02\x0a\x02\xdd\xffq\x02\x0a\x02\ +\xde\xff\xd7\x02\x0a\x02\xe0\xff\x85\x02\x0a\x02\xe2\xff\xd7\x02\ +\x0a\x02\xe4\xff\xd7\x02\x0a\x02\xf0\xff\x85\x02\x0a\x02\xf2\xff\ +\x85\x02\x0a\x02\xf4\xff\x85\x02\x0a\x03\x09\xffq\x02\x0a\x03\ +\x0a\xff\x85\x02\x0a\x03\x0b\xffq\x02\x0a\x03\x0c\xff\x85\x02\ +\x0a\x03\x11\xff\x85\x02\x0a\x03\x12\xffq\x02\x0a\x03\x16\xff\ +\x85\x02\x0a\x03\x1a\xff\x85\x02\x0a\x03\x1b\xff\x85\x02\x0a\x03\ +\x1c\xffq\x02\x0a\x03\x1d\xffq\x02\x0a\x03\x1e\xff\xae\x02\ +\x0a\x03\x1f\xffq\x02\x0a\x03 \xff\xae\x02\x0a\x03!\xff\ +q\x02\x0a\x03\x22\xff\xae\x02\x0a\x03#\xffq\x02\x0a\x03\ +%\xffq\x02\x0a\x03&\xff\xae\x02\x0a\x03'\xffq\x02\ +\x0a\x03(\xff\xae\x02\x0a\x03)\xffq\x02\x0a\x03*\xff\ +\xae\x02\x0a\x03+\xffq\x02\x0a\x03,\xff\xae\x02\x0a\x03\ +-\xffq\x02\x0a\x03.\xff\xae\x02\x0a\x03/\xffq\x02\ +\x0a\x030\xff\xae\x02\x0a\x031\xffq\x02\x0a\x032\xff\ +\xae\x02\x0a\x033\xffq\x02\x0a\x034\xff\xae\x02\x0a\x03\ +6\xff\x85\x02\x0a\x038\xff\x85\x02\x0a\x03:\xff\x85\x02\ +\x0a\x03<\xff\x85\x02\x0a\x03@\xff\x85\x02\x0a\x03B\xff\ +\x85\x02\x0a\x03D\xff\x85\x02\x0a\x03J\xff\x85\x02\x0a\x03\ +L\xff\x85\x02\x0a\x03N\xff\x85\x02\x0a\x03R\xff\x85\x02\ +\x0a\x03T\xff\x85\x02\x0a\x03V\xff\x85\x02\x0a\x03X\xff\ +\x85\x02\x0a\x03Z\xff\x85\x02\x0a\x03\x5c\xff\x85\x02\x0a\x03\ +^\xff\x85\x02\x0a\x03`\xff\x85\x02\x0a\x03b\xff\xc3\x02\ +\x0a\x03d\xff\xc3\x02\x0a\x03f\xff\xc3\x02\x0a\x03h\xff\ +\xc3\x02\x0a\x03j\xff\xc3\x02\x0a\x03l\xff\xc3\x02\x0a\x03\ +n\xff\xc3\x02\x0a\x03o\x00\x14\x02\x0a\x03q\x00\x14\x02\ +\x0a\x03s\x00\x14\x02\x0a\x03\x8f\x00)\x02\x0c\x00&\xff\ +\x9a\x02\x0c\x00*\xff\x9a\x02\x0c\x002\xff\x9a\x02\x0c\x00\ +4\xff\x9a\x02\x0c\x007\xffq\x02\x0c\x008\xff\xd7\x02\ +\x0c\x009\xff\x85\x02\x0c\x00:\xff\x85\x02\x0c\x00<\xff\ +\x85\x02\x0c\x00\x89\xff\x9a\x02\x0c\x00\x94\xff\x9a\x02\x0c\x00\ +\x95\xff\x9a\x02\x0c\x00\x96\xff\x9a\x02\x0c\x00\x97\xff\x9a\x02\ +\x0c\x00\x98\xff\x9a\x02\x0c\x00\x9a\xff\x9a\x02\x0c\x00\x9b\xff\ +\xd7\x02\x0c\x00\x9c\xff\xd7\x02\x0c\x00\x9d\xff\xd7\x02\x0c\x00\ +\x9e\xff\xd7\x02\x0c\x00\x9f\xff\x85\x02\x0c\x00\xc8\xff\x9a\x02\ +\x0c\x00\xca\xff\x9a\x02\x0c\x00\xcc\xff\x9a\x02\x0c\x00\xce\xff\ +\x9a\x02\x0c\x00\xde\xff\x9a\x02\x0c\x00\xe0\xff\x9a\x02\x0c\x00\ +\xe2\xff\x9a\x02\x0c\x00\xe4\xff\x9a\x02\x0c\x01\x0e\xff\x9a\x02\ +\x0c\x01\x10\xff\x9a\x02\x0c\x01\x12\xff\x9a\x02\x0c\x01\x14\xff\ +\x9a\x02\x0c\x01$\xffq\x02\x0c\x01&\xffq\x02\x0c\x01\ +*\xff\xd7\x02\x0c\x01,\xff\xd7\x02\x0c\x01.\xff\xd7\x02\ +\x0c\x010\xff\xd7\x02\x0c\x012\xff\xd7\x02\x0c\x014\xff\ +\xd7\x02\x0c\x016\xff\x85\x02\x0c\x018\xff\x85\x02\x0c\x01\ +:\xff\x85\x02\x0c\x01G\xff\x9a\x02\x0c\x01f\xff\xae\x02\ +\x0c\x01m\xff\xae\x02\x0c\x01q\xffq\x02\x0c\x01r\xff\ +\x85\x02\x0c\x01s\xff\x9a\x02\x0c\x01u\xff\x85\x02\x0c\x01\ +x\xff\x85\x02\x0c\x01\x85\xff\xd7\x02\x0c\x01\x9d\xffq\x02\ +\x0c\x01\x9f\xff\x9a\x02\x0c\x01\xa6\xffq\x02\x0c\x01\xb8\xff\ +\x9a\x02\x0c\x01\xbb\xff\x9a\x02\x0c\x01\xbc\xffq\x02\x0c\x01\ +\xbe\xff\xae\x02\x0c\x01\xc1\xff\x5c\x02\x0c\x01\xc4\xffq\x02\ +\x0c\x01\xdc\xff\x9a\x02\x0c\x01\xe1\xff\x85\x02\x0c\x01\xe4\xff\ +\x9a\x02\x0c\x01\xfa\xff\x85\x02\x0c\x01\xfc\xff\x85\x02\x0c\x01\ +\xfe\xff\x85\x02\x0c\x02\x00\xff\x85\x02\x0c\x02T\xff\x85\x02\ +\x0c\x02_\xff\x9a\x02\x0c\x02a\xff\xd7\x02\x0c\x02l\xff\ +\x9a\x02\x0c\x02|\xff\x5c\x02\x0c\x02~\xff\x9a\x02\x0c\x02\ +\x80\xff\x85\x02\x0c\x02\x82\xff\x85\x02\x0c\x02\x84\xff\x9a\x02\ +\x0c\x02\x86\xff\x9a\x02\x0c\x02\x88\xff\x9a\x02\x0c\x02\x8a\xff\ +\x9a\x02\x0c\x02\x8c\xff\x9a\x02\x0c\x02\xa9\xffq\x02\x0c\x02\ +\xaa\xff\x9a\x02\x0c\x02\xb1\xff\x9a\x02\x0c\x02\xb3\xff\x9a\x02\ +\x0c\x02\xb5\xffq\x02\x0c\x02\xb6\xff\x9a\x02\x0c\x02\xb7\xff\ +\x85\x02\x0c\x02\xb9\xff\x85\x02\x0c\x02\xbd\xffq\x02\x0c\x02\ +\xbe\xff\x9a\x02\x0c\x02\xbf\xff\x5c\x02\x0c\x02\xc0\xff\x85\x02\ +\x0c\x02\xc1\xff\x5c\x02\x0c\x02\xc2\xff\x85\x02\x0c\x02\xc5\xff\ +\x85\x02\x0c\x02\xc7\xff\x85\x02\x0c\x02\xd4\xff\x5c\x02\x0c\x02\ +\xd5\xff\x85\x02\x0c\x02\xef\xff\x9a\x02\x0c\x02\xf1\xff\x9a\x02\ +\x0c\x02\xf3\xff\x9a\x02\x0c\x02\xfd\xff\x5c\x02\x0c\x02\xfe\xff\ +\x85\x02\x0c\x03\x0d\xff\x85\x02\x0c\x03\x0e\xff\x9a\x02\x0c\x03\ +\x0f\xff\x85\x02\x0c\x03\x10\xff\x9a\x02\x0c\x03\x15\xff\x9a\x02\ +\x0c\x03\x17\xffq\x02\x0c\x03\x18\xff\x9a\x02\x0c\x03I\xff\ +\x9a\x02\x0c\x03K\xff\x9a\x02\x0c\x03M\xff\x9a\x02\x0c\x03\ +O\xff\x9a\x02\x0c\x03Q\xff\x9a\x02\x0c\x03S\xff\x9a\x02\ +\x0c\x03U\xff\x9a\x02\x0c\x03W\xff\x9a\x02\x0c\x03Y\xff\ +\x9a\x02\x0c\x03[\xff\x9a\x02\x0c\x03]\xff\x9a\x02\x0c\x03\ +_\xff\x9a\x02\x0c\x03a\xff\xd7\x02\x0c\x03c\xff\xd7\x02\ +\x0c\x03e\xff\xd7\x02\x0c\x03g\xff\xd7\x02\x0c\x03i\xff\ +\xd7\x02\x0c\x03k\xff\xd7\x02\x0c\x03m\xff\xd7\x02\x0c\x03\ +o\xff\x85\x02\x0c\x03q\xff\x85\x02\x0c\x03s\xff\x85\x02\ +\x0c\x03\x8f\xffq\x02!\x01q\xff\xd7\x02!\x01r\xff\ +\xec\x02!\x01x\xff\xec\x02!\x02T\xff\xec\x02S\x00\ +\x0f\xff\xc3\x02S\x00\x11\xff\xc3\x02S\x02\x08\xff\xc3\x02\ +S\x02\x0c\xff\xc3\x02T\x00\x0f\xff\x85\x02T\x00\x11\xff\ +\x85\x02T\x01V\xff\x85\x02T\x01_\xff\x85\x02T\x01\ +b\xff\x85\x02T\x01f\xff\xd7\x02T\x01i\xff\x85\x02\ +T\x01m\xff\xd7\x02T\x01s\xff\xc3\x02T\x01v\xff\ +\xec\x02T\x01y\xff\x9a\x02T\x01z\xff\xae\x02T\x01\ +{\xff\xc3\x02T\x01|\xff\xc3\x02T\x01}\xff\xc3\x02\ +T\x01~\xff\x9a\x02T\x01\x81\xff\xc3\x02T\x01\x82\xff\ +\xae\x02T\x01\x84\xff\xc3\x02T\x01\x86\xff\xc3\x02T\x01\ +\x87\xff\xc3\x02T\x01\x89\xff\xc3\x02T\x01\x8c\xff\x9a\x02\ +T\x01\x8e\xff\x9a\x02T\x01\x8f\xff\x9a\x02T\x01\x90\xff\ +\x9a\x02T\x01\x92\xff\xc3\x02T\x01\x93\xff\x9a\x02T\x01\ +\x95\xff\xc3\x02T\x01\x96\xff\xc3\x02T\x01\x98\xff\xc3\x02\ +T\x01\x99\xff\x9a\x02T\x01\x9a\xff\xc3\x02T\x01\x9b\xff\ +\xc3\x02T\x02\x08\xff\x85\x02T\x02\x0c\xff\x85\x02T\x02\ +!\xff\xec\x02X\x00\x05\xffq\x02X\x00\x0a\xffq\x02\ +X\x00&\xff\xd7\x02X\x00*\xff\xd7\x02X\x00-\x01\ +\x0a\x02X\x002\xff\xd7\x02X\x004\xff\xd7\x02X\x00\ +7\xffq\x02X\x009\xff\xae\x02X\x00:\xff\xae\x02\ +X\x00<\xff\x85\x02X\x00\x89\xff\xd7\x02X\x00\x94\xff\ +\xd7\x02X\x00\x95\xff\xd7\x02X\x00\x96\xff\xd7\x02X\x00\ +\x97\xff\xd7\x02X\x00\x98\xff\xd7\x02X\x00\x9a\xff\xd7\x02\ +X\x00\x9f\xff\x85\x02X\x00\xc8\xff\xd7\x02X\x00\xca\xff\ +\xd7\x02X\x00\xcc\xff\xd7\x02X\x00\xce\xff\xd7\x02X\x00\ +\xde\xff\xd7\x02X\x00\xe0\xff\xd7\x02X\x00\xe2\xff\xd7\x02\ +X\x00\xe4\xff\xd7\x02X\x01\x0e\xff\xd7\x02X\x01\x10\xff\ +\xd7\x02X\x01\x12\xff\xd7\x02X\x01\x14\xff\xd7\x02X\x01\ +$\xffq\x02X\x01&\xffq\x02X\x016\xff\xae\x02\ +X\x018\xff\x85\x02X\x01:\xff\x85\x02X\x01G\xff\ +\xd7\x02X\x01\xfa\xff\xae\x02X\x01\xfc\xff\xae\x02X\x01\ +\xfe\xff\xae\x02X\x02\x00\xff\x85\x02X\x02\x07\xffq\x02\ +X\x02\x0b\xffq\x02X\x02_\xff\xd7\x02X\x03I\xff\ +\xd7\x02X\x03K\xff\xd7\x02X\x03M\xff\xd7\x02X\x03\ +O\xff\xd7\x02X\x03Q\xff\xd7\x02X\x03S\xff\xd7\x02\ +X\x03U\xff\xd7\x02X\x03W\xff\xd7\x02X\x03Y\xff\ +\xd7\x02X\x03[\xff\xd7\x02X\x03]\xff\xd7\x02X\x03\ +_\xff\xd7\x02X\x03o\xff\x85\x02X\x03q\xff\x85\x02\ +X\x03s\xff\x85\x02X\x03\x8f\xffq\x02Y\x00\x05\xff\ +\xec\x02Y\x00\x0a\xff\xec\x02Y\x02\x07\xff\xec\x02Y\x02\ +\x0b\xff\xec\x02Z\x00\x0f\xff\xae\x02Z\x00\x11\xff\xae\x02\ +Z\x01V\xff\xd7\x02Z\x01_\xff\xd7\x02Z\x01b\xff\ +\xd7\x02Z\x01d\xff\xec\x02Z\x01i\xff\xd7\x02Z\x01\ +p\xff\xec\x02Z\x01q\xff\xc3\x02Z\x01r\xff\xec\x02\ +Z\x01t\xff\xd7\x02Z\x01u\xff\xec\x02Z\x01x\xff\ +\xec\x02Z\x01\x88\xff\xec\x02Z\x02\x08\xff\xae\x02Z\x02\ +\x0c\xff\xae\x02Z\x02T\xff\xec\x02`\x00I\x00R\x02\ +`\x00W\x00R\x02`\x00Y\x00f\x02`\x00Z\x00\ +f\x02`\x00[\x00f\x02`\x00\x5c\x00f\x02`\x00\ +\xbf\x00f\x02`\x01%\x00R\x02`\x01'\x00R\x02\ +`\x017\x00f\x02`\x01\xfb\x00f\x02`\x01\xfd\x00\ +f\x02`\x024\x00R\x02`\x025\x00R\x02`\x02\ +]\x00R\x02`\x02^\x00R\x02`\x03p\x00f\x02\ +`\x03\x8d\x00R\x02`\x03\x90\x00R\x02b\x00I\x00\ +f\x02b\x00W\x00f\x02b\x00Y\x00f\x02b\x00\ +Z\x00f\x02b\x00[\x00f\x02b\x00\x5c\x00f\x02\ +b\x00\xbf\x00f\x02b\x01%\x00f\x02b\x01'\x00\ +f\x02b\x017\x00f\x02b\x01\xfb\x00f\x02b\x01\ +\xfd\x00f\x02b\x024\x00f\x02b\x025\x00f\x02\ +b\x02]\x00f\x02b\x02^\x00f\x02b\x03p\x00\ +f\x02b\x03\x8d\x00f\x02b\x03\x90\x00f\x02j\x00\ +\x05\xff\xec\x02j\x00\x0a\xff\xec\x02j\x02\x07\xff\xec\x02\ +j\x02\x0b\xff\xec\x02l\x00\x0f\xff\xae\x02l\x00\x11\xff\ +\xae\x02l\x01\x9d\xff\xec\x02l\x01\xa4\xff\xd7\x02l\x01\ +\xa6\xff\xec\x02l\x01\xa8\xff\xd7\x02l\x01\xaa\xff\xd7\x02\ +l\x01\xae\xff\xd7\x02l\x01\xb0\xff\xd7\x02l\x01\xb1\xff\ +\xec\x02l\x01\xb5\xff\xd7\x02l\x01\xbc\xff\xc3\x02l\x01\ +\xbd\xff\xd7\x02l\x01\xbf\xff\xd7\x02l\x01\xc1\xff\xd7\x02\ +l\x01\xc4\xff\xec\x02l\x01\xc7\xff\xec\x02l\x01\xce\xff\ +\xec\x02l\x01\xd5\xff\xec\x02l\x01\xf2\xff\xec\x02l\x02\ +\x08\xff\xae\x02l\x02\x0c\xff\xae\x02l\x02r\xff\xd7\x02\ +l\x02s\xff\xec\x02l\x02z\xff\xec\x02l\x02|\xff\ +\xd7\x02l\x02\x80\xff\xec\x02l\x02\x82\xff\xec\x02l\x02\ +\x9f\xff\xd7\x02l\x02\xa1\xff\xec\x02l\x02\xa9\xff\xec\x02\ +l\x02\xb5\xff\xc3\x02l\x02\xb7\xff\xec\x02l\x02\xb9\xff\ +\xec\x02l\x02\xbb\xff\xd7\x02l\x02\xbd\xff\xec\x02l\x02\ +\xbf\xff\xd7\x02l\x02\xc1\xff\xd7\x02l\x02\xca\xff\xd7\x02\ +l\x02\xce\xff\xd7\x02l\x02\xcf\xff\xec\x02l\x02\xd4\xff\ +\xd7\x02l\x02\xd9\xff\xd7\x02l\x02\xdb\xff\xd7\x02l\x02\ +\xdd\xff\xd7\x02l\x02\xe5\xff\xd7\x02l\x02\xe7\xff\xec\x02\ +l\x02\xf5\xff\xec\x02l\x02\xf7\xff\xd7\x02l\x02\xf9\xff\ +\xd7\x02l\x02\xfb\xff\xd7\x02l\x02\xfd\xff\xd7\x02l\x03\ +\x05\xff\xd7\x02l\x03\x07\xff\xd7\x02l\x03\x0d\xff\xd7\x02\ +l\x03\x0f\xff\xd7\x02l\x03\x11\xff\xd7\x02l\x03\x12\xff\ +\xec\x02l\x03\x17\xff\xec\x02l\x03\x1b\xff\xd7\x02l\x03\ +\x1c\xff\xec\x02m\x00\x0f\xff\xae\x02m\x00\x11\xff\xae\x02\ +m\x01\xce\xff\xd7\x02m\x01\xd5\xff\xd7\x02m\x01\xf2\xff\ +\xd7\x02m\x02\x08\xff\xae\x02m\x02\x0c\xff\xae\x02m\x02\ +s\xff\xd7\x02m\x02\xcf\xff\xd7\x02m\x03\x12\xff\xd7\x02\ +m\x03\x1c\xff\xd7\x02n\x00\x05\xff\xae\x02n\x00\x0a\xff\ +\xae\x02n\x01\x9d\xff\xd7\x02n\x01\xa6\xff\xd7\x02n\x01\ +\xbc\xff\xae\x02n\x01\xc1\xff\xae\x02n\x01\xc4\xff\xd7\x02\ +n\x01\xdc\xff\xd7\x02n\x01\xe4\xff\xd7\x02n\x02\x07\xff\ +\xae\x02n\x02\x0b\xff\xae\x02n\x02|\xff\xae\x02n\x02\ +\x80\xff\xc3\x02n\x02\x82\xff\xc3\x02n\x02\xa9\xff\xd7\x02\ +n\x02\xaa\xff\xd7\x02n\x02\xb5\xff\xae\x02n\x02\xb6\xff\ +\xd7\x02n\x02\xb7\xff\xc3\x02n\x02\xb9\xff\xc3\x02n\x02\ +\xbd\xff\xd7\x02n\x02\xbe\xff\xd7\x02n\x02\xbf\xff\xae\x02\ +n\x02\xc1\xff\xae\x02n\x02\xd4\xff\xae\x02n\x02\xfd\xff\ +\xae\x02n\x03\x0d\xff\x9a\x02n\x03\x0f\xff\x9a\x02n\x03\ +\x17\xff\xd7\x02n\x03\x18\xff\xd7\x02o\x00\x05\xff\x85\x02\ +o\x00\x0a\xff\x85\x02o\x01\xd0\xff\xd7\x02o\x01\xdc\xff\ +\x9a\x02o\x01\xdd\xff\xc3\x02o\x01\xdf\xff\xd7\x02o\x01\ +\xe1\xff\xae\x02o\x01\xe4\xff\x9a\x02o\x01\xf6\xff\xc3\x02\ +o\x02\x07\xff\x85\x02o\x02\x0b\xff\x85\x02o\x02m\xff\ +\xd7\x02o\x02\x81\xff\xd7\x02o\x02\x83\xff\xd7\x02o\x02\ +\x8b\xff\xd7\x02o\x02\xa0\xff\xd7\x02o\x02\xaa\xff\x9a\x02\ +o\x02\xb6\xff\x9a\x02o\x02\xb8\xff\xc3\x02o\x02\xba\xff\ +\xc3\x02o\x02\xbc\xff\xd7\x02o\x02\xbe\xff\x9a\x02o\x02\ +\xc0\xff\xae\x02o\x02\xc2\xff\xae\x02o\x02\xc6\xff\xd7\x02\ +o\x02\xc8\xff\xd7\x02o\x02\xcb\xff\xd7\x02o\x02\xd5\xff\ +\xae\x02o\x02\xe6\xff\xd7\x02o\x02\xea\xff\xd7\x02o\x02\ +\xf8\xff\xc3\x02o\x02\xfa\xff\xc3\x02o\x02\xfc\xff\xc3\x02\ +o\x02\xfe\xff\xae\x02o\x03\x06\xff\xd7\x02o\x03\x08\xff\ +\xd7\x02o\x03\x0e\xff\x9a\x02o\x03\x10\xff\x9a\x02o\x03\ +\x18\xff\x9a\x02p\x01\x9f\xff\xd7\x02p\x01\xb8\xff\xd7\x02\ +p\x01\xbb\xff\xd7\x02p\x01\xbe\xff\xd7\x02p\x01\xe1\xff\ +\xd7\x02p\x02l\xff\xd7\x02p\x02~\xff\xd7\x02p\x02\ +\x84\xff\xd7\x02p\x02\x86\xff\xd7\x02p\x02\x88\xff\xd7\x02\ +p\x02\x8a\xff\xd7\x02p\x02\x8c\xff\xd7\x02p\x02\xb1\xff\ +\xd7\x02p\x02\xb3\xff\xd7\x02p\x02\xc0\xff\xd7\x02p\x02\ +\xc2\xff\xd7\x02p\x02\xc5\xff\xd7\x02p\x02\xc7\xff\xd7\x02\ +p\x02\xd5\xff\xd7\x02p\x02\xef\xff\xd7\x02p\x02\xf1\xff\ +\xd7\x02p\x02\xf3\xff\xd7\x02p\x02\xfe\xff\xd7\x02p\x03\ +\x09\xff\xd7\x02p\x03\x0b\xff\xd7\x02p\x03\x0e\xff\xd7\x02\ +p\x03\x10\xff\xd7\x02p\x03\x15\xff\xd7\x02r\x00\x05\xff\ +q\x02r\x00\x0a\xffq\x02r\x01\x9d\xff\x9a\x02r\x01\ +\xa6\xff\x9a\x02r\x01\xbc\xffq\x02r\x01\xbe\xff\xd7\x02\ +r\x01\xc1\xff\x9a\x02r\x01\xc4\xff\x9a\x02r\x01\xdc\xff\ +\xd7\x02r\x01\xe1\xff\xd7\x02r\x01\xe4\xff\xd7\x02r\x02\ +\x07\xffq\x02r\x02\x0b\xffq\x02r\x02n\xff\xd7\x02\ +r\x02|\xff\x9a\x02r\x02\x80\xff\xae\x02r\x02\x82\xff\ +\xae\x02r\x02\x97\xff\xd7\x02r\x02\x9b\xff\xd7\x02r\x02\ +\xa7\xff\xd7\x02r\x02\xa9\xff\x9a\x02r\x02\xaa\xff\xd7\x02\ +r\x02\xb5\xffq\x02r\x02\xb6\xff\xd7\x02r\x02\xb7\xff\ +\x85\x02r\x02\xb9\xff\x85\x02r\x02\xbd\xff\x9a\x02r\x02\ +\xbe\xff\xd7\x02r\x02\xbf\xff\x9a\x02r\x02\xc0\xff\xd7\x02\ +r\x02\xc1\xff\x9a\x02r\x02\xc2\xff\xd7\x02r\x02\xc5\xff\ +\x9a\x02r\x02\xc7\xff\x9a\x02r\x02\xd4\xff\x9a\x02r\x02\ +\xd5\xff\xd7\x02r\x02\xe1\xff\xd7\x02r\x02\xe3\xff\xd7\x02\ +r\x02\xfd\xff\x9a\x02r\x02\xfe\xff\xd7\x02r\x03\x03\xff\ +\xd7\x02r\x03\x0d\xffq\x02r\x03\x0e\xff\xd7\x02r\x03\ +\x0f\xffq\x02r\x03\x10\xff\xd7\x02r\x03\x17\xff\x9a\x02\ +r\x03\x18\xff\xd7\x02s\x00\x05\xffq\x02s\x00\x0a\xff\ +q\x02s\x01\xcf\xff\xd7\x02s\x01\xd8\xff\xd7\x02s\x01\ +\xdb\xff\xd7\x02s\x01\xdc\xff\x9a\x02s\x01\xdd\xff\xc3\x02\ +s\x01\xde\xff\xd7\x02s\x01\xe1\xff\xc3\x02s\x01\xe4\xff\ +\x9a\x02s\x01\xea\xff\xd7\x02s\x01\xed\xff\xd7\x02s\x01\ +\xf6\xff\xc3\x02s\x02\x07\xffq\x02s\x02\x0b\xffq\x02\ +s\x02j\xff\xd7\x02s\x02m\xff\xd7\x02s\x02}\xff\ +\xec\x02s\x02\x7f\xff\xd7\x02s\x02\x81\xff\xd7\x02s\x02\ +\x83\xff\xd7\x02s\x02\x85\xff\xd7\x02s\x02\x87\xff\xd7\x02\ +s\x02\x89\xff\xd7\x02s\x02\x8b\xff\xd7\x02s\x02\x8d\xff\ +\xd7\x02s\x02\xaa\xff\x9a\x02s\x02\xb2\xff\xd7\x02s\x02\ +\xb4\xff\xd7\x02s\x02\xb6\xff\x9a\x02s\x02\xb8\xff\xd7\x02\ +s\x02\xba\xff\xd7\x02s\x02\xbe\xff\x9a\x02s\x02\xc0\xff\ +\xc3\x02s\x02\xc2\xff\xc3\x02s\x02\xc6\xff\xd7\x02s\x02\ +\xc8\xff\xd7\x02s\x02\xd5\xff\xc3\x02s\x02\xe0\xff\xd7\x02\ +s\x02\xf0\xff\xd7\x02s\x02\xf2\xff\xd7\x02s\x02\xf4\xff\ +\xd7\x02s\x02\xf8\xff\xc3\x02s\x02\xfa\xff\xc3\x02s\x02\ +\xfc\xff\xc3\x02s\x02\xfe\xff\xc3\x02s\x03\x0a\xff\xd7\x02\ +s\x03\x0c\xff\xd7\x02s\x03\x0e\xff\x85\x02s\x03\x10\xff\ +\x85\x02s\x03\x16\xff\xd7\x02s\x03\x18\xff\x9a\x02s\x03\ +\x1a\xff\xd7\x02t\x00\x05\xffq\x02t\x00\x0a\xffq\x02\ +t\x01\x9d\xff\x9a\x02t\x01\xa6\xff\x9a\x02t\x01\xbc\xff\ +q\x02t\x01\xbe\xff\xd7\x02t\x01\xc1\xff\x9a\x02t\x01\ +\xc4\xff\x9a\x02t\x01\xdc\xff\xd7\x02t\x01\xe1\xff\xd7\x02\ +t\x01\xe4\xff\xd7\x02t\x02\x07\xffq\x02t\x02\x0b\xff\ +q\x02t\x02n\xff\xd7\x02t\x02|\xff\x9a\x02t\x02\ +\x80\xff\xae\x02t\x02\x82\xff\xae\x02t\x02\x97\xff\xd7\x02\ +t\x02\x9b\xff\xd7\x02t\x02\xa7\xff\xd7\x02t\x02\xa9\xff\ +\x9a\x02t\x02\xaa\xff\xd7\x02t\x02\xb5\xffq\x02t\x02\ +\xb6\xff\xd7\x02t\x02\xb7\xff\x85\x02t\x02\xb9\xff\x85\x02\ +t\x02\xbd\xff\x9a\x02t\x02\xbe\xff\xd7\x02t\x02\xbf\xff\ +\x9a\x02t\x02\xc0\xff\xd7\x02t\x02\xc1\xff\x9a\x02t\x02\ +\xc2\xff\xd7\x02t\x02\xc5\xff\x9a\x02t\x02\xc7\xff\x9a\x02\ +t\x02\xd4\xff\x9a\x02t\x02\xd5\xff\xd7\x02t\x02\xe1\xff\ +\xd7\x02t\x02\xe3\xff\xd7\x02t\x02\xfd\xff\x9a\x02t\x02\ +\xfe\xff\xd7\x02t\x03\x03\xff\xd7\x02t\x03\x0d\xffq\x02\ +t\x03\x0e\xff\xd7\x02t\x03\x0f\xffq\x02t\x03\x10\xff\ +\xd7\x02t\x03\x17\xff\x9a\x02t\x03\x18\xff\xd7\x02u\x00\ +\x05\xffq\x02u\x00\x0a\xffq\x02u\x01\xcf\xff\xd7\x02\ +u\x01\xd8\xff\xd7\x02u\x01\xdb\xff\xd7\x02u\x01\xdc\xff\ +\x9a\x02u\x01\xdd\xff\xc3\x02u\x01\xde\xff\xd7\x02u\x01\ +\xe1\xff\xc3\x02u\x01\xe4\xff\x9a\x02u\x01\xea\xff\xd7\x02\ +u\x01\xed\xff\xd7\x02u\x01\xf6\xff\xc3\x02u\x02\x07\xff\ +q\x02u\x02\x0b\xffq\x02u\x02j\xff\xd7\x02u\x02\ +m\xff\xd7\x02u\x02}\xff\xec\x02u\x02\x7f\xff\xd7\x02\ +u\x02\x81\xff\xd7\x02u\x02\x83\xff\xd7\x02u\x02\x85\xff\ +\xd7\x02u\x02\x87\xff\xd7\x02u\x02\x89\xff\xd7\x02u\x02\ +\x8b\xff\xd7\x02u\x02\x8d\xff\xd7\x02u\x02\xaa\xff\x9a\x02\ +u\x02\xb2\xff\xd7\x02u\x02\xb4\xff\xd7\x02u\x02\xb6\xff\ +\x9a\x02u\x02\xb8\xff\xd7\x02u\x02\xba\xff\xd7\x02u\x02\ +\xbe\xff\x9a\x02u\x02\xc0\xff\xc3\x02u\x02\xc2\xff\xc3\x02\ +u\x02\xc6\xff\xd7\x02u\x02\xc8\xff\xd7\x02u\x02\xd5\xff\ +\xc3\x02u\x02\xe0\xff\xd7\x02u\x02\xf0\xff\xd7\x02u\x02\ +\xf2\xff\xd7\x02u\x02\xf4\xff\xd7\x02u\x02\xf8\xff\xc3\x02\ +u\x02\xfa\xff\xc3\x02u\x02\xfc\xff\xc3\x02u\x02\xfe\xff\ +\xc3\x02u\x03\x0a\xff\xd7\x02u\x03\x0c\xff\xd7\x02u\x03\ +\x0e\xff\x85\x02u\x03\x10\xff\x85\x02u\x03\x16\xff\xd7\x02\ +u\x03\x18\xff\x9a\x02u\x03\x1a\xff\xd7\x02v\x03\x0d\xff\ +\xec\x02v\x03\x0f\xff\xec\x02x\x03\x0d\xff\xec\x02x\x03\ +\x0f\xff\xec\x02z\x00\x0f\xff\xae\x02z\x00\x11\xff\xae\x02\ +z\x02\x08\xff\xae\x02z\x02\x0c\xff\xae\x02z\x02\x80\xff\ +\xec\x02z\x02\x82\xff\xec\x02z\x02\xb7\xff\xec\x02z\x02\ +\xb9\xff\xec\x02z\x03\x0d\xff\xd7\x02z\x03\x0f\xff\xd7\x02\ +|\x00\x0f\xffq\x02|\x00\x11\xffq\x02|\x01\xa4\xff\ +\xc3\x02|\x01\xaa\xff\xae\x02|\x01\xae\xff\xc3\x02|\x01\ +\xb5\xff\xc3\x02|\x01\xce\xff\xd7\x02|\x01\xd5\xff\xd7\x02\ +|\x01\xf2\xff\xd7\x02|\x02\x08\xffq\x02|\x02\x0c\xff\ +q\x02|\x02r\xff\xae\x02|\x02s\xff\xd7\x02|\x02\ +\xce\xff\xc3\x02|\x02\xcf\xff\xd7\x02|\x02\xd9\xff\xae\x02\ +|\x02\xdb\xff\xae\x02|\x02\xdd\xff\xae\x02|\x03\x09\xff\ +\xae\x02|\x03\x0b\xff\xae\x02|\x03\x11\xff\xc3\x02|\x03\ +\x12\xff\xd7\x02|\x03\x1b\xff\xc3\x02|\x03\x1c\xff\xd7\x02\ +}\x00\x05\xff\xec\x02}\x00\x0a\xff\xec\x02}\x01\xd0\xff\ +\xd7\x02}\x01\xdc\xff\xec\x02}\x01\xdd\xff\xec\x02}\x01\ +\xdf\xff\xd7\x02}\x01\xe1\xff\xec\x02}\x01\xe4\xff\xec\x02\ +}\x01\xf6\xff\xec\x02}\x02\x07\xff\xec\x02}\x02\x0b\xff\ +\xec\x02}\x02\xa0\xff\xd7\x02}\x02\xaa\xff\xec\x02}\x02\ +\xb6\xff\xec\x02}\x02\xbc\xff\xd7\x02}\x02\xbe\xff\xec\x02\ +}\x02\xc0\xff\xec\x02}\x02\xc2\xff\xec\x02}\x02\xcb\xff\ +\xd7\x02}\x02\xd5\xff\xec\x02}\x02\xe6\xff\xd7\x02}\x02\ +\xf8\xff\xec\x02}\x02\xfa\xff\xec\x02}\x02\xfc\xff\xec\x02\ +}\x02\xfe\xff\xec\x02}\x03\x06\xff\xd7\x02}\x03\x08\xff\ +\xd7\x02}\x03\x0e\xff\xec\x02}\x03\x10\xff\xec\x02}\x03\ +\x18\xff\xec\x02~\x00\x0f\xff\xae\x02~\x00\x11\xff\xae\x02\ +~\x01\x9d\xff\xec\x02~\x01\xa4\xff\xd7\x02~\x01\xa6\xff\ +\xec\x02~\x01\xa8\xff\xd7\x02~\x01\xaa\xff\xd7\x02~\x01\ +\xae\xff\xd7\x02~\x01\xb0\xff\xd7\x02~\x01\xb1\xff\xec\x02\ +~\x01\xb5\xff\xd7\x02~\x01\xbc\xff\xc3\x02~\x01\xbd\xff\ +\xd7\x02~\x01\xbf\xff\xd7\x02~\x01\xc1\xff\xd7\x02~\x01\ +\xc4\xff\xec\x02~\x01\xc7\xff\xec\x02~\x01\xce\xff\xec\x02\ +~\x01\xd5\xff\xec\x02~\x01\xf2\xff\xec\x02~\x02\x08\xff\ +\xae\x02~\x02\x0c\xff\xae\x02~\x02r\xff\xd7\x02~\x02\ +s\xff\xec\x02~\x02z\xff\xec\x02~\x02|\xff\xd7\x02\ +~\x02\x80\xff\xec\x02~\x02\x82\xff\xec\x02~\x02\x9f\xff\ +\xd7\x02~\x02\xa1\xff\xec\x02~\x02\xa9\xff\xec\x02~\x02\ +\xb5\xff\xc3\x02~\x02\xb7\xff\xec\x02~\x02\xb9\xff\xec\x02\ +~\x02\xbb\xff\xd7\x02~\x02\xbd\xff\xec\x02~\x02\xbf\xff\ +\xd7\x02~\x02\xc1\xff\xd7\x02~\x02\xca\xff\xd7\x02~\x02\ +\xce\xff\xd7\x02~\x02\xcf\xff\xec\x02~\x02\xd4\xff\xd7\x02\ +~\x02\xd9\xff\xd7\x02~\x02\xdb\xff\xd7\x02~\x02\xdd\xff\ +\xd7\x02~\x02\xe5\xff\xd7\x02~\x02\xe7\xff\xec\x02~\x02\ +\xf5\xff\xec\x02~\x02\xf7\xff\xd7\x02~\x02\xf9\xff\xd7\x02\ +~\x02\xfb\xff\xd7\x02~\x02\xfd\xff\xd7\x02~\x03\x05\xff\ +\xd7\x02~\x03\x07\xff\xd7\x02~\x03\x0d\xff\xd7\x02~\x03\ +\x0f\xff\xd7\x02~\x03\x11\xff\xd7\x02~\x03\x12\xff\xec\x02\ +~\x03\x17\xff\xec\x02~\x03\x1b\xff\xd7\x02~\x03\x1c\xff\ +\xec\x02\x7f\x00\x05\xff\xec\x02\x7f\x00\x0a\xff\xec\x02\x7f\x01\ +\xd0\xff\xd7\x02\x7f\x01\xdc\xff\xec\x02\x7f\x01\xdd\xff\xec\x02\ +\x7f\x01\xdf\xff\xd7\x02\x7f\x01\xe1\xff\xec\x02\x7f\x01\xe4\xff\ +\xec\x02\x7f\x01\xf6\xff\xec\x02\x7f\x02\x07\xff\xec\x02\x7f\x02\ +\x0b\xff\xec\x02\x7f\x02\xa0\xff\xd7\x02\x7f\x02\xaa\xff\xec\x02\ +\x7f\x02\xb6\xff\xec\x02\x7f\x02\xbc\xff\xd7\x02\x7f\x02\xbe\xff\ +\xec\x02\x7f\x02\xc0\xff\xec\x02\x7f\x02\xc2\xff\xec\x02\x7f\x02\ +\xcb\xff\xd7\x02\x7f\x02\xd5\xff\xec\x02\x7f\x02\xe6\xff\xd7\x02\ +\x7f\x02\xf8\xff\xec\x02\x7f\x02\xfa\xff\xec\x02\x7f\x02\xfc\xff\ +\xec\x02\x7f\x02\xfe\xff\xec\x02\x7f\x03\x06\xff\xd7\x02\x7f\x03\ +\x08\xff\xd7\x02\x7f\x03\x0e\xff\xec\x02\x7f\x03\x10\xff\xec\x02\ +\x7f\x03\x18\xff\xec\x02\x80\x00\x0f\xff\x85\x02\x80\x00\x11\xff\ +\x85\x02\x80\x01\x9f\xff\xec\x02\x80\x01\xa4\xff\x9a\x02\x80\x01\ +\xaa\xffq\x02\x80\x01\xae\xff\x9a\x02\x80\x01\xb5\xff\x9a\x02\ +\x80\x01\xb8\xff\xec\x02\x80\x01\xbb\xff\xec\x02\x80\x01\xbe\xff\ +\xc3\x02\x80\x01\xc9\xff\xec\x02\x80\x01\xce\xff\xae\x02\x80\x01\ +\xcf\xff\xd7\x02\x80\x01\xd5\xff\xae\x02\x80\x01\xd8\xff\xd7\x02\ +\x80\x01\xdb\xff\xd7\x02\x80\x01\xde\xff\xd7\x02\x80\x01\xe1\xff\ +\xd7\x02\x80\x01\xea\xff\xd7\x02\x80\x01\xeb\x00f\x02\x80\x01\ +\xed\xff\xd7\x02\x80\x01\xee\xff\xec\x02\x80\x01\xf2\xff\xae\x02\ +\x80\x01\xf4\x00f\x02\x80\x02\x08\xff\x85\x02\x80\x02\x0c\xff\ +\x85\x02\x80\x02j\xff\xd7\x02\x80\x02l\xff\xec\x02\x80\x02\ +r\xffq\x02\x80\x02s\xff\xae\x02\x80\x02~\xff\xec\x02\ +\x80\x02\x7f\xff\xd7\x02\x80\x02\x84\xff\xec\x02\x80\x02\x85\xff\ +\xd7\x02\x80\x02\x86\xff\xec\x02\x80\x02\x87\xff\xd7\x02\x80\x02\ +\x88\xff\xec\x02\x80\x02\x89\xff\xd7\x02\x80\x02\x8a\xff\xec\x02\ +\x80\x02\x8c\xff\xec\x02\x80\x02\x8d\xff\xd7\x02\x80\x02\x98\x00\ +f\x02\x80\x02\xa8\x00f\x02\x80\x02\xb1\xff\xec\x02\x80\x02\ +\xb2\xff\xd7\x02\x80\x02\xb3\xff\xec\x02\x80\x02\xb4\xff\xd7\x02\ +\x80\x02\xc0\xff\xd7\x02\x80\x02\xc2\xff\xd7\x02\x80\x02\xc5\xff\ +\xd7\x02\x80\x02\xc6\xff\xc3\x02\x80\x02\xc7\xff\xd7\x02\x80\x02\ +\xc8\xff\xc3\x02\x80\x02\xce\xff\x9a\x02\x80\x02\xcf\xff\xae\x02\ +\x80\x02\xd5\xff\xd7\x02\x80\x02\xd9\xffq\x02\x80\x02\xdb\xff\ +q\x02\x80\x02\xdd\xffq\x02\x80\x02\xe0\xff\xd7\x02\x80\x02\ +\xef\xff\xec\x02\x80\x02\xf0\xff\xd7\x02\x80\x02\xf1\xff\xec\x02\ +\x80\x02\xf2\xff\xd7\x02\x80\x02\xf3\xff\xec\x02\x80\x02\xf4\xff\ +\xd7\x02\x80\x02\xfe\xff\xd7\x02\x80\x03\x09\xffq\x02\x80\x03\ +\x0a\xff\xd7\x02\x80\x03\x0b\xffq\x02\x80\x03\x0c\xff\xd7\x02\ +\x80\x03\x11\xff\x9a\x02\x80\x03\x12\xff\xae\x02\x80\x03\x15\xff\ +\xec\x02\x80\x03\x16\xff\xd7\x02\x80\x03\x1a\xff\xd7\x02\x80\x03\ +\x1b\xff\x9a\x02\x80\x03\x1c\xff\xae\x02\x81\x00\x0f\xff\xae\x02\ +\x81\x00\x11\xff\xae\x02\x81\x01\xce\xff\xd7\x02\x81\x01\xd5\xff\ +\xd7\x02\x81\x01\xf2\xff\xd7\x02\x81\x02\x08\xff\xae\x02\x81\x02\ +\x0c\xff\xae\x02\x81\x02s\xff\xd7\x02\x81\x02\xcf\xff\xd7\x02\ +\x81\x03\x12\xff\xd7\x02\x81\x03\x1c\xff\xd7\x02\x82\x00\x0f\xff\ +\x85\x02\x82\x00\x11\xff\x85\x02\x82\x01\x9f\xff\xec\x02\x82\x01\ +\xa4\xff\x9a\x02\x82\x01\xaa\xffq\x02\x82\x01\xae\xff\x9a\x02\ +\x82\x01\xb5\xff\x9a\x02\x82\x01\xb8\xff\xec\x02\x82\x01\xbb\xff\ +\xec\x02\x82\x01\xbe\xff\xc3\x02\x82\x01\xc9\xff\xec\x02\x82\x01\ +\xce\xff\xae\x02\x82\x01\xcf\xff\xd7\x02\x82\x01\xd5\xff\xae\x02\ +\x82\x01\xd8\xff\xd7\x02\x82\x01\xdb\xff\xd7\x02\x82\x01\xde\xff\ +\xd7\x02\x82\x01\xe1\xff\xd7\x02\x82\x01\xea\xff\xd7\x02\x82\x01\ +\xeb\x00f\x02\x82\x01\xed\xff\xd7\x02\x82\x01\xee\xff\xec\x02\ +\x82\x01\xf2\xff\xae\x02\x82\x01\xf4\x00f\x02\x82\x02\x08\xff\ +\x85\x02\x82\x02\x0c\xff\x85\x02\x82\x02j\xff\xd7\x02\x82\x02\ +l\xff\xec\x02\x82\x02r\xffq\x02\x82\x02s\xff\xae\x02\ +\x82\x02~\xff\xec\x02\x82\x02\x7f\xff\xd7\x02\x82\x02\x84\xff\ +\xec\x02\x82\x02\x85\xff\xd7\x02\x82\x02\x86\xff\xec\x02\x82\x02\ +\x87\xff\xd7\x02\x82\x02\x88\xff\xec\x02\x82\x02\x89\xff\xd7\x02\ +\x82\x02\x8a\xff\xec\x02\x82\x02\x8c\xff\xec\x02\x82\x02\x8d\xff\ +\xd7\x02\x82\x02\x98\x00f\x02\x82\x02\xa8\x00f\x02\x82\x02\ +\xb1\xff\xec\x02\x82\x02\xb2\xff\xd7\x02\x82\x02\xb3\xff\xec\x02\ +\x82\x02\xb4\xff\xd7\x02\x82\x02\xc0\xff\xd7\x02\x82\x02\xc2\xff\ +\xd7\x02\x82\x02\xc5\xff\xd7\x02\x82\x02\xc6\xff\xc3\x02\x82\x02\ +\xc7\xff\xd7\x02\x82\x02\xc8\xff\xc3\x02\x82\x02\xce\xff\x9a\x02\ +\x82\x02\xcf\xff\xae\x02\x82\x02\xd5\xff\xd7\x02\x82\x02\xd9\xff\ +q\x02\x82\x02\xdb\xffq\x02\x82\x02\xdd\xffq\x02\x82\x02\ +\xe0\xff\xd7\x02\x82\x02\xef\xff\xec\x02\x82\x02\xf0\xff\xd7\x02\ +\x82\x02\xf1\xff\xec\x02\x82\x02\xf2\xff\xd7\x02\x82\x02\xf3\xff\ +\xec\x02\x82\x02\xf4\xff\xd7\x02\x82\x02\xfe\xff\xd7\x02\x82\x03\ +\x09\xffq\x02\x82\x03\x0a\xff\xd7\x02\x82\x03\x0b\xffq\x02\ +\x82\x03\x0c\xff\xd7\x02\x82\x03\x11\xff\x9a\x02\x82\x03\x12\xff\ +\xae\x02\x82\x03\x15\xff\xec\x02\x82\x03\x16\xff\xd7\x02\x82\x03\ +\x1a\xff\xd7\x02\x82\x03\x1b\xff\x9a\x02\x82\x03\x1c\xff\xae\x02\ +\x83\x00\x0f\xff\xae\x02\x83\x00\x11\xff\xae\x02\x83\x01\xce\xff\ +\xd7\x02\x83\x01\xd5\xff\xd7\x02\x83\x01\xf2\xff\xd7\x02\x83\x02\ +\x08\xff\xae\x02\x83\x02\x0c\xff\xae\x02\x83\x02s\xff\xd7\x02\ +\x83\x02\xcf\xff\xd7\x02\x83\x03\x12\xff\xd7\x02\x83\x03\x1c\xff\ +\xd7\x02\x84\x00\x0f\xff\xae\x02\x84\x00\x11\xff\xae\x02\x84\x01\ +\xce\xff\xd7\x02\x84\x01\xd5\xff\xd7\x02\x84\x01\xf2\xff\xd7\x02\ +\x84\x02\x08\xff\xae\x02\x84\x02\x0c\xff\xae\x02\x84\x02s\xff\ +\xd7\x02\x84\x02\xcf\xff\xd7\x02\x84\x03\x12\xff\xd7\x02\x84\x03\ +\x1c\xff\xd7\x02\x85\x00\x0f\xff\xae\x02\x85\x00\x11\xff\xae\x02\ +\x85\x01\xce\xff\xd7\x02\x85\x01\xd5\xff\xd7\x02\x85\x01\xf2\xff\ +\xd7\x02\x85\x02\x08\xff\xae\x02\x85\x02\x0c\xff\xae\x02\x85\x02\ +s\xff\xd7\x02\x85\x02\xcf\xff\xd7\x02\x85\x03\x12\xff\xd7\x02\ +\x85\x03\x1c\xff\xd7\x02\x86\x00\x0f\xff\xae\x02\x86\x00\x11\xff\ +\xae\x02\x86\x01\x9d\xff\xec\x02\x86\x01\xa4\xff\xd7\x02\x86\x01\ +\xa6\xff\xec\x02\x86\x01\xa8\xff\xd7\x02\x86\x01\xaa\xff\xd7\x02\ +\x86\x01\xae\xff\xd7\x02\x86\x01\xb0\xff\xd7\x02\x86\x01\xb1\xff\ +\xec\x02\x86\x01\xb5\xff\xd7\x02\x86\x01\xbc\xff\xc3\x02\x86\x01\ +\xbd\xff\xd7\x02\x86\x01\xbf\xff\xd7\x02\x86\x01\xc1\xff\xd7\x02\ +\x86\x01\xc4\xff\xec\x02\x86\x01\xc7\xff\xec\x02\x86\x01\xce\xff\ +\xec\x02\x86\x01\xd5\xff\xec\x02\x86\x01\xf2\xff\xec\x02\x86\x02\ +\x08\xff\xae\x02\x86\x02\x0c\xff\xae\x02\x86\x02r\xff\xd7\x02\ +\x86\x02s\xff\xec\x02\x86\x02z\xff\xec\x02\x86\x02|\xff\ +\xd7\x02\x86\x02\x80\xff\xec\x02\x86\x02\x82\xff\xec\x02\x86\x02\ +\x9f\xff\xd7\x02\x86\x02\xa1\xff\xec\x02\x86\x02\xa9\xff\xec\x02\ +\x86\x02\xb5\xff\xc3\x02\x86\x02\xb7\xff\xec\x02\x86\x02\xb9\xff\ +\xec\x02\x86\x02\xbb\xff\xd7\x02\x86\x02\xbd\xff\xec\x02\x86\x02\ +\xbf\xff\xd7\x02\x86\x02\xc1\xff\xd7\x02\x86\x02\xca\xff\xd7\x02\ +\x86\x02\xce\xff\xd7\x02\x86\x02\xcf\xff\xec\x02\x86\x02\xd4\xff\ +\xd7\x02\x86\x02\xd9\xff\xd7\x02\x86\x02\xdb\xff\xd7\x02\x86\x02\ +\xdd\xff\xd7\x02\x86\x02\xe5\xff\xd7\x02\x86\x02\xe7\xff\xec\x02\ +\x86\x02\xf5\xff\xec\x02\x86\x02\xf7\xff\xd7\x02\x86\x02\xf9\xff\ +\xd7\x02\x86\x02\xfb\xff\xd7\x02\x86\x02\xfd\xff\xd7\x02\x86\x03\ +\x05\xff\xd7\x02\x86\x03\x07\xff\xd7\x02\x86\x03\x0d\xff\xd7\x02\ +\x86\x03\x0f\xff\xd7\x02\x86\x03\x11\xff\xd7\x02\x86\x03\x12\xff\ +\xec\x02\x86\x03\x17\xff\xec\x02\x86\x03\x1b\xff\xd7\x02\x86\x03\ +\x1c\xff\xec\x02\x87\x00\x05\xff\xec\x02\x87\x00\x0a\xff\xec\x02\ +\x87\x01\xd0\xff\xd7\x02\x87\x01\xdc\xff\xec\x02\x87\x01\xdd\xff\ +\xec\x02\x87\x01\xdf\xff\xd7\x02\x87\x01\xe1\xff\xec\x02\x87\x01\ +\xe4\xff\xec\x02\x87\x01\xf6\xff\xec\x02\x87\x02\x07\xff\xec\x02\ +\x87\x02\x0b\xff\xec\x02\x87\x02\xa0\xff\xd7\x02\x87\x02\xaa\xff\ +\xec\x02\x87\x02\xb6\xff\xec\x02\x87\x02\xbc\xff\xd7\x02\x87\x02\ +\xbe\xff\xec\x02\x87\x02\xc0\xff\xec\x02\x87\x02\xc2\xff\xec\x02\ +\x87\x02\xcb\xff\xd7\x02\x87\x02\xd5\xff\xec\x02\x87\x02\xe6\xff\ +\xd7\x02\x87\x02\xf8\xff\xec\x02\x87\x02\xfa\xff\xec\x02\x87\x02\ +\xfc\xff\xec\x02\x87\x02\xfe\xff\xec\x02\x87\x03\x06\xff\xd7\x02\ +\x87\x03\x08\xff\xd7\x02\x87\x03\x0e\xff\xec\x02\x87\x03\x10\xff\ +\xec\x02\x87\x03\x18\xff\xec\x02\x88\x00\x0f\xff\xae\x02\x88\x00\ +\x11\xff\xae\x02\x88\x01\x9d\xff\xec\x02\x88\x01\xa4\xff\xd7\x02\ +\x88\x01\xa6\xff\xec\x02\x88\x01\xa8\xff\xd7\x02\x88\x01\xaa\xff\ +\xd7\x02\x88\x01\xae\xff\xd7\x02\x88\x01\xb0\xff\xd7\x02\x88\x01\ +\xb1\xff\xec\x02\x88\x01\xb5\xff\xd7\x02\x88\x01\xbc\xff\xc3\x02\ +\x88\x01\xbd\xff\xd7\x02\x88\x01\xbf\xff\xd7\x02\x88\x01\xc1\xff\ +\xd7\x02\x88\x01\xc4\xff\xec\x02\x88\x01\xc7\xff\xec\x02\x88\x01\ +\xce\xff\xec\x02\x88\x01\xd5\xff\xec\x02\x88\x01\xf2\xff\xec\x02\ +\x88\x02\x08\xff\xae\x02\x88\x02\x0c\xff\xae\x02\x88\x02r\xff\ +\xd7\x02\x88\x02s\xff\xec\x02\x88\x02z\xff\xec\x02\x88\x02\ +|\xff\xd7\x02\x88\x02\x80\xff\xec\x02\x88\x02\x82\xff\xec\x02\ +\x88\x02\x9f\xff\xd7\x02\x88\x02\xa1\xff\xec\x02\x88\x02\xa9\xff\ +\xec\x02\x88\x02\xb5\xff\xc3\x02\x88\x02\xb7\xff\xec\x02\x88\x02\ +\xb9\xff\xec\x02\x88\x02\xbb\xff\xd7\x02\x88\x02\xbd\xff\xec\x02\ +\x88\x02\xbf\xff\xd7\x02\x88\x02\xc1\xff\xd7\x02\x88\x02\xca\xff\ +\xd7\x02\x88\x02\xce\xff\xd7\x02\x88\x02\xcf\xff\xec\x02\x88\x02\ +\xd4\xff\xd7\x02\x88\x02\xd9\xff\xd7\x02\x88\x02\xdb\xff\xd7\x02\ +\x88\x02\xdd\xff\xd7\x02\x88\x02\xe5\xff\xd7\x02\x88\x02\xe7\xff\ +\xec\x02\x88\x02\xf5\xff\xec\x02\x88\x02\xf7\xff\xd7\x02\x88\x02\ +\xf9\xff\xd7\x02\x88\x02\xfb\xff\xd7\x02\x88\x02\xfd\xff\xd7\x02\ +\x88\x03\x05\xff\xd7\x02\x88\x03\x07\xff\xd7\x02\x88\x03\x0d\xff\ +\xd7\x02\x88\x03\x0f\xff\xd7\x02\x88\x03\x11\xff\xd7\x02\x88\x03\ +\x12\xff\xec\x02\x88\x03\x17\xff\xec\x02\x88\x03\x1b\xff\xd7\x02\ +\x88\x03\x1c\xff\xec\x02\x89\x00\x05\xff\xec\x02\x89\x00\x0a\xff\ +\xec\x02\x89\x01\xd0\xff\xd7\x02\x89\x01\xdc\xff\xec\x02\x89\x01\ +\xdd\xff\xec\x02\x89\x01\xdf\xff\xd7\x02\x89\x01\xe1\xff\xec\x02\ +\x89\x01\xe4\xff\xec\x02\x89\x01\xf6\xff\xec\x02\x89\x02\x07\xff\ +\xec\x02\x89\x02\x0b\xff\xec\x02\x89\x02\xa0\xff\xd7\x02\x89\x02\ +\xaa\xff\xec\x02\x89\x02\xb6\xff\xec\x02\x89\x02\xbc\xff\xd7\x02\ +\x89\x02\xbe\xff\xec\x02\x89\x02\xc0\xff\xec\x02\x89\x02\xc2\xff\ +\xec\x02\x89\x02\xcb\xff\xd7\x02\x89\x02\xd5\xff\xec\x02\x89\x02\ +\xe6\xff\xd7\x02\x89\x02\xf8\xff\xec\x02\x89\x02\xfa\xff\xec\x02\ +\x89\x02\xfc\xff\xec\x02\x89\x02\xfe\xff\xec\x02\x89\x03\x06\xff\ +\xd7\x02\x89\x03\x08\xff\xd7\x02\x89\x03\x0e\xff\xec\x02\x89\x03\ +\x10\xff\xec\x02\x89\x03\x18\xff\xec\x02\x8a\x00\x0f\xff\xae\x02\ +\x8a\x00\x11\xff\xae\x02\x8a\x01\x9d\xff\xec\x02\x8a\x01\xa4\xff\ +\xd7\x02\x8a\x01\xa6\xff\xec\x02\x8a\x01\xa8\xff\xd7\x02\x8a\x01\ +\xaa\xff\xd7\x02\x8a\x01\xae\xff\xd7\x02\x8a\x01\xb0\xff\xd7\x02\ +\x8a\x01\xb1\xff\xec\x02\x8a\x01\xb5\xff\xd7\x02\x8a\x01\xbc\xff\ +\xc3\x02\x8a\x01\xbd\xff\xd7\x02\x8a\x01\xbf\xff\xd7\x02\x8a\x01\ +\xc1\xff\xd7\x02\x8a\x01\xc4\xff\xec\x02\x8a\x01\xc7\xff\xec\x02\ +\x8a\x01\xce\xff\xec\x02\x8a\x01\xd5\xff\xec\x02\x8a\x01\xf2\xff\ +\xec\x02\x8a\x02\x08\xff\xae\x02\x8a\x02\x0c\xff\xae\x02\x8a\x02\ +r\xff\xd7\x02\x8a\x02s\xff\xec\x02\x8a\x02z\xff\xec\x02\ +\x8a\x02|\xff\xd7\x02\x8a\x02\x80\xff\xec\x02\x8a\x02\x82\xff\ +\xec\x02\x8a\x02\x9f\xff\xd7\x02\x8a\x02\xa1\xff\xec\x02\x8a\x02\ +\xa9\xff\xec\x02\x8a\x02\xb5\xff\xc3\x02\x8a\x02\xb7\xff\xec\x02\ +\x8a\x02\xb9\xff\xec\x02\x8a\x02\xbb\xff\xd7\x02\x8a\x02\xbd\xff\ +\xec\x02\x8a\x02\xbf\xff\xd7\x02\x8a\x02\xc1\xff\xd7\x02\x8a\x02\ +\xca\xff\xd7\x02\x8a\x02\xce\xff\xd7\x02\x8a\x02\xcf\xff\xec\x02\ +\x8a\x02\xd4\xff\xd7\x02\x8a\x02\xd9\xff\xd7\x02\x8a\x02\xdb\xff\ +\xd7\x02\x8a\x02\xdd\xff\xd7\x02\x8a\x02\xe5\xff\xd7\x02\x8a\x02\ +\xe7\xff\xec\x02\x8a\x02\xf5\xff\xec\x02\x8a\x02\xf7\xff\xd7\x02\ +\x8a\x02\xf9\xff\xd7\x02\x8a\x02\xfb\xff\xd7\x02\x8a\x02\xfd\xff\ +\xd7\x02\x8a\x03\x05\xff\xd7\x02\x8a\x03\x07\xff\xd7\x02\x8a\x03\ +\x0d\xff\xd7\x02\x8a\x03\x0f\xff\xd7\x02\x8a\x03\x11\xff\xd7\x02\ +\x8a\x03\x12\xff\xec\x02\x8a\x03\x17\xff\xec\x02\x8a\x03\x1b\xff\ +\xd7\x02\x8a\x03\x1c\xff\xec\x02\x8b\x00\x0f\xff\xae\x02\x8b\x00\ +\x11\xff\xae\x02\x8b\x01\xce\xff\xd7\x02\x8b\x01\xd5\xff\xd7\x02\ +\x8b\x01\xf2\xff\xd7\x02\x8b\x02\x08\xff\xae\x02\x8b\x02\x0c\xff\ +\xae\x02\x8b\x02s\xff\xd7\x02\x8b\x02\xcf\xff\xd7\x02\x8b\x03\ +\x12\xff\xd7\x02\x8b\x03\x1c\xff\xd7\x02\x8c\x01\x9f\xff\xd7\x02\ +\x8c\x01\xb8\xff\xd7\x02\x8c\x01\xbb\xff\xd7\x02\x8c\x01\xbe\xff\ +\xd7\x02\x8c\x01\xe1\xff\xd7\x02\x8c\x02l\xff\xd7\x02\x8c\x02\ +~\xff\xd7\x02\x8c\x02\x84\xff\xd7\x02\x8c\x02\x86\xff\xd7\x02\ +\x8c\x02\x88\xff\xd7\x02\x8c\x02\x8a\xff\xd7\x02\x8c\x02\x8c\xff\ +\xd7\x02\x8c\x02\xb1\xff\xd7\x02\x8c\x02\xb3\xff\xd7\x02\x8c\x02\ +\xc0\xff\xd7\x02\x8c\x02\xc2\xff\xd7\x02\x8c\x02\xc5\xff\xd7\x02\ +\x8c\x02\xc7\xff\xd7\x02\x8c\x02\xd5\xff\xd7\x02\x8c\x02\xef\xff\ +\xd7\x02\x8c\x02\xf1\xff\xd7\x02\x8c\x02\xf3\xff\xd7\x02\x8c\x02\ +\xfe\xff\xd7\x02\x8c\x03\x09\xff\xd7\x02\x8c\x03\x0b\xff\xd7\x02\ +\x8c\x03\x0e\xff\xd7\x02\x8c\x03\x10\xff\xd7\x02\x8c\x03\x15\xff\ +\xd7\x02\x95\x01\xa3\x00\xe1\x02\x95\x02\xea\x00)\x02\x95\x03\ +\x0e\xff\xd7\x02\x95\x03\x10\xff\xd7\x02\x96\x00\x05\xff\xec\x02\ +\x96\x00\x0a\xff\xec\x02\x96\x02\x07\xff\xec\x02\x96\x02\x0b\xff\ +\xec\x02\x97\x00\x05\xff\xae\x02\x97\x00\x0a\xff\xae\x02\x97\x01\ +\x9d\xff\xd7\x02\x97\x01\xa6\xff\xd7\x02\x97\x01\xbc\xff\xae\x02\ +\x97\x01\xc1\xff\xae\x02\x97\x01\xc4\xff\xd7\x02\x97\x01\xdc\xff\ +\xd7\x02\x97\x01\xe4\xff\xd7\x02\x97\x02\x07\xff\xae\x02\x97\x02\ +\x0b\xff\xae\x02\x97\x02|\xff\xae\x02\x97\x02\x80\xff\xc3\x02\ +\x97\x02\x82\xff\xc3\x02\x97\x02\xa9\xff\xd7\x02\x97\x02\xaa\xff\ +\xd7\x02\x97\x02\xb5\xff\xae\x02\x97\x02\xb6\xff\xd7\x02\x97\x02\ +\xb7\xff\xc3\x02\x97\x02\xb9\xff\xc3\x02\x97\x02\xbd\xff\xd7\x02\ +\x97\x02\xbe\xff\xd7\x02\x97\x02\xbf\xff\xae\x02\x97\x02\xc1\xff\ +\xae\x02\x97\x02\xd4\xff\xae\x02\x97\x02\xfd\xff\xae\x02\x97\x03\ +\x0d\xff\x9a\x02\x97\x03\x0f\xff\x9a\x02\x97\x03\x17\xff\xd7\x02\ +\x97\x03\x18\xff\xd7\x02\x98\x00\x05\xff\x85\x02\x98\x00\x0a\xff\ +\x85\x02\x98\x01\xd0\xff\xd7\x02\x98\x01\xdc\xff\x9a\x02\x98\x01\ +\xdd\xff\xc3\x02\x98\x01\xdf\xff\xd7\x02\x98\x01\xe1\xff\xae\x02\ +\x98\x01\xe4\xff\x9a\x02\x98\x01\xf6\xff\xc3\x02\x98\x02\x07\xff\ +\x85\x02\x98\x02\x0b\xff\x85\x02\x98\x02m\xff\xd7\x02\x98\x02\ +\x81\xff\xd7\x02\x98\x02\x83\xff\xd7\x02\x98\x02\x8b\xff\xd7\x02\ +\x98\x02\xa0\xff\xd7\x02\x98\x02\xaa\xff\x9a\x02\x98\x02\xb6\xff\ +\x9a\x02\x98\x02\xb8\xff\xc3\x02\x98\x02\xba\xff\xc3\x02\x98\x02\ +\xbc\xff\xd7\x02\x98\x02\xbe\xff\x9a\x02\x98\x02\xc0\xff\xae\x02\ +\x98\x02\xc2\xff\xae\x02\x98\x02\xc6\xff\xd7\x02\x98\x02\xc8\xff\ +\xd7\x02\x98\x02\xcb\xff\xd7\x02\x98\x02\xd5\xff\xae\x02\x98\x02\ +\xe6\xff\xd7\x02\x98\x02\xea\xff\xd7\x02\x98\x02\xf8\xff\xc3\x02\ +\x98\x02\xfa\xff\xc3\x02\x98\x02\xfc\xff\xc3\x02\x98\x02\xfe\xff\ +\xae\x02\x98\x03\x06\xff\xd7\x02\x98\x03\x08\xff\xd7\x02\x98\x03\ +\x0e\xff\x9a\x02\x98\x03\x10\xff\x9a\x02\x98\x03\x18\xff\x9a\x02\ +\x99\x00\x0f\xfe\xf6\x02\x99\x00\x11\xfe\xf6\x02\x99\x01\xa4\xff\ +\x85\x02\x99\x01\xaa\xff\x9a\x02\x99\x01\xae\xff\x85\x02\x99\x01\ +\xb0\xff\xd7\x02\x99\x01\xb5\xff\x85\x02\x99\x01\xbf\xff\xd7\x02\ +\x99\x01\xce\xff\x9a\x02\x99\x01\xd5\xff\x9a\x02\x99\x01\xf2\xff\ +\x9a\x02\x99\x02\x08\xfe\xf6\x02\x99\x02\x0c\xfe\xf6\x02\x99\x02\ +r\xff\x9a\x02\x99\x02s\xff\x9a\x02\x99\x02v\xff\xec\x02\ +\x99\x02\x9f\xff\xd7\x02\x99\x02\xbb\xff\xd7\x02\x99\x02\xca\xff\ +\xd7\x02\x99\x02\xce\xff\x85\x02\x99\x02\xcf\xff\x9a\x02\x99\x02\ +\xd9\xff\x9a\x02\x99\x02\xdb\xff\x9a\x02\x99\x02\xdd\xff\x9a\x02\ +\x99\x02\xe5\xff\xd7\x02\x99\x03\x05\xff\xd7\x02\x99\x03\x07\xff\ +\xd7\x02\x99\x03\x09\xff\xae\x02\x99\x03\x0b\xff\xae\x02\x99\x03\ +\x11\xff\x85\x02\x99\x03\x12\xff\x9a\x02\x99\x03\x1b\xff\x85\x02\ +\x99\x03\x1c\xff\x9a\x02\x9a\x00\x05\xff\xec\x02\x9a\x00\x0a\xff\ +\xec\x02\x9a\x01\xd0\xff\xd7\x02\x9a\x01\xdc\xff\xec\x02\x9a\x01\ +\xdd\xff\xec\x02\x9a\x01\xdf\xff\xd7\x02\x9a\x01\xe1\xff\xec\x02\ +\x9a\x01\xe4\xff\xec\x02\x9a\x01\xf6\xff\xec\x02\x9a\x02\x07\xff\ +\xec\x02\x9a\x02\x0b\xff\xec\x02\x9a\x02\xa0\xff\xd7\x02\x9a\x02\ +\xaa\xff\xec\x02\x9a\x02\xb6\xff\xec\x02\x9a\x02\xbc\xff\xd7\x02\ +\x9a\x02\xbe\xff\xec\x02\x9a\x02\xc0\xff\xec\x02\x9a\x02\xc2\xff\ +\xec\x02\x9a\x02\xcb\xff\xd7\x02\x9a\x02\xd5\xff\xec\x02\x9a\x02\ +\xe6\xff\xd7\x02\x9a\x02\xf8\xff\xec\x02\x9a\x02\xfa\xff\xec\x02\ +\x9a\x02\xfc\xff\xec\x02\x9a\x02\xfe\xff\xec\x02\x9a\x03\x06\xff\ +\xd7\x02\x9a\x03\x08\xff\xd7\x02\x9a\x03\x0e\xff\xec\x02\x9a\x03\ +\x10\xff\xec\x02\x9a\x03\x18\xff\xec\x02\x9b\x00\x0f\xff\x9a\x02\ +\x9b\x00\x10\xff\xd7\x02\x9b\x00\x11\xff\x9a\x02\x9b\x01\x9d\x00\ +)\x02\x9b\x01\x9f\xff\xd7\x02\x9b\x01\xa4\xff\xae\x02\x9b\x01\ +\xa6\x00)\x02\x9b\x01\xaa\xff\x85\x02\x9b\x01\xae\xff\xae\x02\ +\x9b\x01\xb5\xff\xae\x02\x9b\x01\xb8\xff\xd7\x02\x9b\x01\xbb\xff\ +\xd7\x02\x9b\x01\xbc\x00)\x02\x9b\x01\xbe\xff\xc3\x02\x9b\x01\ +\xc4\x00)\x02\x9b\x01\xcc\xff\xc3\x02\x9b\x01\xcd\xff\xc3\x02\ +\x9b\x01\xce\xff\x9a\x02\x9b\x01\xcf\xff\xae\x02\x9b\x01\xd0\xff\ +\xd7\x02\x9b\x01\xd1\xff\xd7\x02\x9b\x01\xd2\xff\xc3\x02\x9b\x01\ +\xd3\xff\xc3\x02\x9b\x01\xd4\xff\xc3\x02\x9b\x01\xd5\xff\x9a\x02\ +\x9b\x01\xd6\xff\xc3\x02\x9b\x01\xd7\xff\xc3\x02\x9b\x01\xd8\xff\ +\xae\x02\x9b\x01\xd9\xff\xc3\x02\x9b\x01\xda\xff\xc3\x02\x9b\x01\ +\xdb\xff\xae\x02\x9b\x01\xde\xff\xae\x02\x9b\x01\xdf\xff\xd7\x02\ +\x9b\x01\xe0\xff\xc3\x02\x9b\x01\xe1\xff\x9a\x02\x9b\x01\xe2\xff\ +\xc3\x02\x9b\x01\xe3\xff\xc3\x02\x9b\x01\xe5\xff\xc3\x02\x9b\x01\ +\xe6\xff\xc3\x02\x9b\x01\xe7\xff\xd7\x02\x9b\x01\xe8\xff\xc3\x02\ +\x9b\x01\xea\xff\xae\x02\x9b\x01\xeb\x00)\x02\x9b\x01\xec\xff\ +\xc3\x02\x9b\x01\xed\xff\xae\x02\x9b\x01\xee\xff\xc3\x02\x9b\x01\ +\xf2\xff\x9a\x02\x9b\x01\xf3\xff\xc3\x02\x9b\x01\xf4\x00)\x02\ +\x9b\x01\xf5\xff\xc3\x02\x9b\x01\xf7\xff\xc3\x02\x9b\x01\xf9\xff\ +\xc3\x02\x9b\x02\x02\xff\xd7\x02\x9b\x02\x03\xff\xd7\x02\x9b\x02\ +\x04\xff\xd7\x02\x9b\x02\x08\xff\x9a\x02\x9b\x02\x0c\xff\x9a\x02\ +\x9b\x02j\xff\xae\x02\x9b\x02k\xff\xc3\x02\x9b\x02l\xff\ +\xd7\x02\x9b\x02q\xff\xc3\x02\x9b\x02r\xff\x85\x02\x9b\x02\ +s\xff\x9a\x02\x9b\x02u\xff\xc3\x02\x9b\x02w\xff\xd7\x02\ +\x9b\x02y\xff\xc3\x02\x9b\x02}\xff\xc3\x02\x9b\x02~\xff\ +\xd7\x02\x9b\x02\x7f\xff\xae\x02\x9b\x02\x84\xff\xd7\x02\x9b\x02\ +\x85\xff\xae\x02\x9b\x02\x86\xff\xd7\x02\x9b\x02\x87\xff\xae\x02\ +\x9b\x02\x88\xff\xd7\x02\x9b\x02\x89\xff\xae\x02\x9b\x02\x8a\xff\ +\xd7\x02\x9b\x02\x8c\xff\xd7\x02\x9b\x02\x8d\xff\xae\x02\x9b\x02\ +\x96\xff\xc3\x02\x9b\x02\x98\x00)\x02\x9b\x02\x9a\xff\xc3\x02\ +\x9b\x02\x9e\xff\xc3\x02\x9b\x02\xa0\xff\xd7\x02\x9b\x02\xa2\xff\ +\xd7\x02\x9b\x02\xa4\xff\xc3\x02\x9b\x02\xa6\xff\xc3\x02\x9b\x02\ +\xa8\x00)\x02\x9b\x02\xa9\x00)\x02\x9b\x02\xac\xff\xc3\x02\ +\x9b\x02\xae\xff\xc3\x02\x9b\x02\xb0\xff\xc3\x02\x9b\x02\xb1\xff\ +\xd7\x02\x9b\x02\xb2\xff\xae\x02\x9b\x02\xb3\xff\xd7\x02\x9b\x02\ +\xb4\xff\xae\x02\x9b\x02\xb5\x00)\x02\x9b\x02\xbc\xff\xd7\x02\ +\x9b\x02\xbd\x00)\x02\x9b\x02\xc0\xff\x9a\x02\x9b\x02\xc2\xff\ +\x9a\x02\x9b\x02\xc4\xff\xc3\x02\x9b\x02\xc5\xff\xd7\x02\x9b\x02\ +\xc6\xff\xc3\x02\x9b\x02\xc7\xff\xd7\x02\x9b\x02\xc8\xff\xc3\x02\ +\x9b\x02\xcb\xff\xd7\x02\x9b\x02\xcd\xff\xc3\x02\x9b\x02\xce\xff\ +\xae\x02\x9b\x02\xcf\xff\x9a\x02\x9b\x02\xd1\xff\xc3\x02\x9b\x02\ +\xd3\xff\xc3\x02\x9b\x02\xd5\xff\x9a\x02\x9b\x02\xd7\xff\xc3\x02\ +\x9b\x02\xd9\xff\x85\x02\x9b\x02\xdb\xff\x85\x02\x9b\x02\xdd\xff\ +\x85\x02\x9b\x02\xe0\xff\xae\x02\x9b\x02\xe6\xff\xd7\x02\x9b\x02\ +\xe8\xff\xd7\x02\x9b\x02\xec\xff\xc3\x02\x9b\x02\xee\xff\xc3\x02\ +\x9b\x02\xef\xff\xd7\x02\x9b\x02\xf0\xff\xae\x02\x9b\x02\xf1\xff\ +\xd7\x02\x9b\x02\xf2\xff\xae\x02\x9b\x02\xf3\xff\xd7\x02\x9b\x02\ +\xf4\xff\xae\x02\x9b\x02\xf6\xff\xd7\x02\x9b\x02\xfe\xff\x9a\x02\ +\x9b\x03\x00\xff\xc3\x02\x9b\x03\x02\xff\xc3\x02\x9b\x03\x06\xff\ +\xd7\x02\x9b\x03\x08\xff\xd7\x02\x9b\x03\x09\xff\x9a\x02\x9b\x03\ +\x0a\xff\xae\x02\x9b\x03\x0b\xff\x9a\x02\x9b\x03\x0c\xff\xae\x02\ +\x9b\x03\x0e\xff\xd7\x02\x9b\x03\x10\xff\xd7\x02\x9b\x03\x11\xff\ +\xae\x02\x9b\x03\x12\xff\x9a\x02\x9b\x03\x14\xff\xc3\x02\x9b\x03\ +\x15\xff\xd7\x02\x9b\x03\x16\xff\xae\x02\x9b\x03\x17\x00)\x02\ +\x9b\x03\x1a\xff\xae\x02\x9b\x03\x1b\xff\xae\x02\x9b\x03\x1c\xff\ +\x9a\x02\x9c\x00\x0f\xff\xc3\x02\x9c\x00\x11\xff\xc3\x02\x9c\x01\ +\xce\xff\xc3\x02\x9c\x01\xcf\xff\xd7\x02\x9c\x01\xd5\xff\xc3\x02\ +\x9c\x01\xd8\xff\xd7\x02\x9c\x01\xdb\xff\xd7\x02\x9c\x01\xde\xff\ +\xd7\x02\x9c\x01\xea\xff\xd7\x02\x9c\x01\xed\xff\xd7\x02\x9c\x01\ +\xf2\xff\xc3\x02\x9c\x02\x08\xff\xc3\x02\x9c\x02\x0c\xff\xc3\x02\ +\x9c\x02j\xff\xd7\x02\x9c\x02s\xff\xc3\x02\x9c\x02\x7f\xff\ +\xd7\x02\x9c\x02\x85\xff\xd7\x02\x9c\x02\x87\xff\xd7\x02\x9c\x02\ +\x89\xff\xd7\x02\x9c\x02\x8d\xff\xd7\x02\x9c\x02\xb2\xff\xd7\x02\ +\x9c\x02\xb4\xff\xd7\x02\x9c\x02\xcf\xff\xc3\x02\x9c\x02\xe0\xff\ +\xd7\x02\x9c\x02\xf0\xff\xd7\x02\x9c\x02\xf2\xff\xd7\x02\x9c\x02\ +\xf4\xff\xd7\x02\x9c\x03\x0a\xff\xd7\x02\x9c\x03\x0c\xff\xd7\x02\ +\x9c\x03\x12\xff\xc3\x02\x9c\x03\x16\xff\xd7\x02\x9c\x03\x1a\xff\ +\xd7\x02\x9c\x03\x1c\xff\xc3\x02\x9d\x00\x05\xff\xc3\x02\x9d\x00\ +\x0a\xff\xc3\x02\x9d\x01\x9d\xff\xc3\x02\x9d\x01\xa3\x00f\x02\ +\x9d\x01\xa6\xff\xc3\x02\x9d\x01\xbc\xff\xc3\x02\x9d\x01\xc1\xff\ +\xae\x02\x9d\x01\xc4\xff\xc3\x02\x9d\x01\xdc\xff\xd7\x02\x9d\x01\ +\xe1\xff\xd7\x02\x9d\x01\xe4\xff\xd7\x02\x9d\x02\x07\xff\xc3\x02\ +\x9d\x02\x0b\xff\xc3\x02\x9d\x02|\xff\xae\x02\x9d\x02\x80\xff\ +\xc3\x02\x9d\x02\x82\xff\xc3\x02\x9d\x02\xa9\xff\xc3\x02\x9d\x02\ +\xaa\xff\xd7\x02\x9d\x02\xb5\xff\xc3\x02\x9d\x02\xb6\xff\xd7\x02\ +\x9d\x02\xb7\xff\xd7\x02\x9d\x02\xb9\xff\xd7\x02\x9d\x02\xbd\xff\ +\xc3\x02\x9d\x02\xbe\xff\xd7\x02\x9d\x02\xbf\xff\xae\x02\x9d\x02\ +\xc0\xff\xd7\x02\x9d\x02\xc1\xff\xae\x02\x9d\x02\xc2\xff\xd7\x02\ +\x9d\x02\xd4\xff\xae\x02\x9d\x02\xd5\xff\xd7\x02\x9d\x02\xfd\xff\ +\xae\x02\x9d\x02\xfe\xff\xd7\x02\x9d\x03\x0d\xff\xd7\x02\x9d\x03\ +\x0e\xff\xc3\x02\x9d\x03\x0f\xff\xd7\x02\x9d\x03\x10\xff\xc3\x02\ +\x9d\x03\x17\xff\xc3\x02\x9d\x03\x18\xff\xd7\x02\x9e\x00\x05\xff\ +\xc3\x02\x9e\x00\x0a\xff\xc3\x02\x9e\x02\x07\xff\xc3\x02\x9e\x02\ +\x0b\xff\xc3\x02\x9e\x03\x0e\xff\xd7\x02\x9e\x03\x10\xff\xd7\x02\ +\x9f\x01\x9f\xff\xd7\x02\x9f\x01\xa3\x00\xe1\x02\x9f\x01\xb8\xff\ +\xd7\x02\x9f\x01\xbb\xff\xd7\x02\x9f\x01\xbe\xff\xc3\x02\x9f\x01\ +\xdc\xff\xd7\x02\x9f\x01\xe1\xff\xae\x02\x9f\x01\xe4\xff\xd7\x02\ +\x9f\x02l\xff\xd7\x02\x9f\x02{\x00=\x02\x9f\x02}\xff\ +\xec\x02\x9f\x02~\xff\xd7\x02\x9f\x02\x84\xff\xd7\x02\x9f\x02\ +\x86\xff\xd7\x02\x9f\x02\x88\xff\xd7\x02\x9f\x02\x8a\xff\xd7\x02\ +\x9f\x02\x8c\xff\xd7\x02\x9f\x02\xaa\xff\xd7\x02\x9f\x02\xb1\xff\ +\xd7\x02\x9f\x02\xb3\xff\xd7\x02\x9f\x02\xb6\xff\xd7\x02\x9f\x02\ +\xbe\xff\xd7\x02\x9f\x02\xc0\xff\xae\x02\x9f\x02\xc2\xff\xae\x02\ +\x9f\x02\xc5\xff\xc3\x02\x9f\x02\xc6\xff\xd7\x02\x9f\x02\xc7\xff\ +\xc3\x02\x9f\x02\xc8\xff\xd7\x02\x9f\x02\xd5\xff\xae\x02\x9f\x02\ +\xef\xff\xd7\x02\x9f\x02\xf1\xff\xd7\x02\x9f\x02\xf3\xff\xd7\x02\ +\x9f\x02\xfe\xff\xae\x02\x9f\x03\x0e\xff\xd7\x02\x9f\x03\x10\xff\ +\xd7\x02\x9f\x03\x15\xff\xd7\x02\x9f\x03\x18\xff\xd7\x02\xa0\x01\ +\xcf\xff\xec\x02\xa0\x01\xd8\xff\xec\x02\xa0\x01\xdb\xff\xec\x02\ +\xa0\x01\xde\xff\xec\x02\xa0\x01\xe1\xff\xec\x02\xa0\x01\xea\xff\ +\xec\x02\xa0\x01\xed\xff\xec\x02\xa0\x02j\xff\xec\x02\xa0\x02\ +\x7f\xff\xec\x02\xa0\x02\x85\xff\xec\x02\xa0\x02\x87\xff\xec\x02\ +\xa0\x02\x89\xff\xec\x02\xa0\x02\x8d\xff\xec\x02\xa0\x02\xb2\xff\ +\xec\x02\xa0\x02\xb4\xff\xec\x02\xa0\x02\xc0\xff\xec\x02\xa0\x02\ +\xc2\xff\xec\x02\xa0\x02\xd5\xff\xec\x02\xa0\x02\xe0\xff\xec\x02\ +\xa0\x02\xf0\xff\xec\x02\xa0\x02\xf2\xff\xec\x02\xa0\x02\xf4\xff\ +\xec\x02\xa0\x02\xfe\xff\xec\x02\xa0\x03\x0a\xff\xec\x02\xa0\x03\ +\x0c\xff\xec\x02\xa0\x03\x0e\xff\xd7\x02\xa0\x03\x10\xff\xd7\x02\ +\xa0\x03\x16\xff\xec\x02\xa0\x03\x1a\xff\xec\x02\xa1\x00\x0f\xff\ +\xae\x02\xa1\x00\x11\xff\xae\x02\xa1\x02\x08\xff\xae\x02\xa1\x02\ +\x0c\xff\xae\x02\xa1\x02\x80\xff\xec\x02\xa1\x02\x82\xff\xec\x02\ +\xa1\x02\xb7\xff\xec\x02\xa1\x02\xb9\xff\xec\x02\xa1\x03\x0d\xff\ +\xd7\x02\xa1\x03\x0f\xff\xd7\x02\xa2\x01\xe9\x00)\x02\xa3\x01\ +\x9f\xff\xd7\x02\xa3\x01\xa3\x00\xe1\x02\xa3\x01\xb8\xff\xd7\x02\ +\xa3\x01\xbb\xff\xd7\x02\xa3\x01\xbe\xff\xc3\x02\xa3\x01\xdc\xff\ +\xd7\x02\xa3\x01\xe1\xff\xae\x02\xa3\x01\xe4\xff\xd7\x02\xa3\x02\ +l\xff\xd7\x02\xa3\x02{\x00=\x02\xa3\x02}\xff\xec\x02\ +\xa3\x02~\xff\xd7\x02\xa3\x02\x84\xff\xd7\x02\xa3\x02\x86\xff\ +\xd7\x02\xa3\x02\x88\xff\xd7\x02\xa3\x02\x8a\xff\xd7\x02\xa3\x02\ +\x8c\xff\xd7\x02\xa3\x02\xaa\xff\xd7\x02\xa3\x02\xb1\xff\xd7\x02\ +\xa3\x02\xb3\xff\xd7\x02\xa3\x02\xb6\xff\xd7\x02\xa3\x02\xbe\xff\ +\xd7\x02\xa3\x02\xc0\xff\xae\x02\xa3\x02\xc2\xff\xae\x02\xa3\x02\ +\xc5\xff\xc3\x02\xa3\x02\xc6\xff\xd7\x02\xa3\x02\xc7\xff\xc3\x02\ +\xa3\x02\xc8\xff\xd7\x02\xa3\x02\xd5\xff\xae\x02\xa3\x02\xef\xff\ +\xd7\x02\xa3\x02\xf1\xff\xd7\x02\xa3\x02\xf3\xff\xd7\x02\xa3\x02\ +\xfe\xff\xae\x02\xa3\x03\x0e\xff\xd7\x02\xa3\x03\x10\xff\xd7\x02\ +\xa3\x03\x15\xff\xd7\x02\xa3\x03\x18\xff\xd7\x02\xa4\x01\xcf\xff\ +\xec\x02\xa4\x01\xd8\xff\xec\x02\xa4\x01\xdb\xff\xec\x02\xa4\x01\ +\xde\xff\xec\x02\xa4\x01\xe1\xff\xec\x02\xa4\x01\xea\xff\xec\x02\ +\xa4\x01\xed\xff\xec\x02\xa4\x02j\xff\xec\x02\xa4\x02\x7f\xff\ +\xec\x02\xa4\x02\x85\xff\xec\x02\xa4\x02\x87\xff\xec\x02\xa4\x02\ +\x89\xff\xec\x02\xa4\x02\x8d\xff\xec\x02\xa4\x02\xb2\xff\xec\x02\ +\xa4\x02\xb4\xff\xec\x02\xa4\x02\xc0\xff\xec\x02\xa4\x02\xc2\xff\ +\xec\x02\xa4\x02\xd5\xff\xec\x02\xa4\x02\xe0\xff\xec\x02\xa4\x02\ +\xf0\xff\xec\x02\xa4\x02\xf2\xff\xec\x02\xa4\x02\xf4\xff\xec\x02\ +\xa4\x02\xfe\xff\xec\x02\xa4\x03\x0a\xff\xec\x02\xa4\x03\x0c\xff\ +\xec\x02\xa4\x03\x0e\xff\xd7\x02\xa4\x03\x10\xff\xd7\x02\xa4\x03\ +\x16\xff\xec\x02\xa4\x03\x1a\xff\xec\x02\xa5\x01\x9f\xff\xd7\x02\ +\xa5\x01\xb8\xff\xd7\x02\xa5\x01\xbb\xff\xd7\x02\xa5\x01\xbe\xff\ +\xd7\x02\xa5\x01\xc1\xff\xd7\x02\xa5\x01\xe1\xff\xd7\x02\xa5\x02\ +l\xff\xd7\x02\xa5\x02|\xff\xd7\x02\xa5\x02~\xff\xd7\x02\ +\xa5\x02\x84\xff\xd7\x02\xa5\x02\x86\xff\xd7\x02\xa5\x02\x88\xff\ +\xd7\x02\xa5\x02\x8a\xff\xd7\x02\xa5\x02\x8c\xff\xd7\x02\xa5\x02\ +\xb1\xff\xd7\x02\xa5\x02\xb3\xff\xd7\x02\xa5\x02\xbf\xff\xd7\x02\ +\xa5\x02\xc0\xff\xd7\x02\xa5\x02\xc1\xff\xd7\x02\xa5\x02\xc2\xff\ +\xd7\x02\xa5\x02\xc5\xff\x9a\x02\xa5\x02\xc7\xff\x9a\x02\xa5\x02\ +\xd4\xff\xd7\x02\xa5\x02\xd5\xff\xd7\x02\xa5\x02\xef\xff\xd7\x02\ +\xa5\x02\xf1\xff\xd7\x02\xa5\x02\xf3\xff\xd7\x02\xa5\x02\xfd\xff\ +\xd7\x02\xa5\x02\xfe\xff\xd7\x02\xa5\x03\x09\xff\xd7\x02\xa5\x03\ +\x0b\xff\xd7\x02\xa5\x03\x0e\xff\xd7\x02\xa5\x03\x10\xff\xd7\x02\ +\xa5\x03\x15\xff\xd7\x02\xa5\x03\x19\xff\xec\x02\xa6\x01\xcf\xff\ +\xd7\x02\xa6\x01\xd8\xff\xd7\x02\xa6\x01\xdb\xff\xd7\x02\xa6\x01\ +\xde\xff\xd7\x02\xa6\x01\xe1\xff\xd7\x02\xa6\x01\xea\xff\xd7\x02\ +\xa6\x01\xed\xff\xd7\x02\xa6\x02j\xff\xd7\x02\xa6\x02\x7f\xff\ +\xd7\x02\xa6\x02\x85\xff\xd7\x02\xa6\x02\x87\xff\xd7\x02\xa6\x02\ +\x89\xff\xd7\x02\xa6\x02\x8d\xff\xd7\x02\xa6\x02\xb2\xff\xd7\x02\ +\xa6\x02\xb4\xff\xd7\x02\xa6\x02\xc0\xff\xd7\x02\xa6\x02\xc2\xff\ +\xd7\x02\xa6\x02\xc6\xff\xd7\x02\xa6\x02\xc8\xff\xd7\x02\xa6\x02\ +\xd5\xff\xd7\x02\xa6\x02\xe0\xff\xd7\x02\xa6\x02\xf0\xff\xd7\x02\ +\xa6\x02\xf2\xff\xd7\x02\xa6\x02\xf4\xff\xd7\x02\xa6\x02\xfe\xff\ +\xd7\x02\xa6\x03\x0a\xff\xd7\x02\xa6\x03\x0c\xff\xd7\x02\xa6\x03\ +\x16\xff\xd7\x02\xa6\x03\x1a\xff\xd7\x02\xa7\x01\x9f\xff\xd7\x02\ +\xa7\x01\xb8\xff\xd7\x02\xa7\x01\xbb\xff\xd7\x02\xa7\x01\xbe\xff\ +\xd7\x02\xa7\x01\xc1\xff\xd7\x02\xa7\x01\xe1\xff\xd7\x02\xa7\x02\ +l\xff\xd7\x02\xa7\x02|\xff\xd7\x02\xa7\x02~\xff\xd7\x02\ +\xa7\x02\x84\xff\xd7\x02\xa7\x02\x86\xff\xd7\x02\xa7\x02\x88\xff\ +\xd7\x02\xa7\x02\x8a\xff\xd7\x02\xa7\x02\x8c\xff\xd7\x02\xa7\x02\ +\xb1\xff\xd7\x02\xa7\x02\xb3\xff\xd7\x02\xa7\x02\xbf\xff\xd7\x02\ +\xa7\x02\xc0\xff\xd7\x02\xa7\x02\xc1\xff\xd7\x02\xa7\x02\xc2\xff\ +\xd7\x02\xa7\x02\xc5\xff\x9a\x02\xa7\x02\xc7\xff\x9a\x02\xa7\x02\ +\xd4\xff\xd7\x02\xa7\x02\xd5\xff\xd7\x02\xa7\x02\xef\xff\xd7\x02\ +\xa7\x02\xf1\xff\xd7\x02\xa7\x02\xf3\xff\xd7\x02\xa7\x02\xfd\xff\ +\xd7\x02\xa7\x02\xfe\xff\xd7\x02\xa7\x03\x09\xff\xd7\x02\xa7\x03\ +\x0b\xff\xd7\x02\xa7\x03\x0e\xff\xd7\x02\xa7\x03\x10\xff\xd7\x02\ +\xa7\x03\x15\xff\xd7\x02\xa7\x03\x19\xff\xec\x02\xa8\x01\xcf\xff\ +\xd7\x02\xa8\x01\xd8\xff\xd7\x02\xa8\x01\xdb\xff\xd7\x02\xa8\x01\ +\xde\xff\xd7\x02\xa8\x01\xe1\xff\xd7\x02\xa8\x01\xea\xff\xd7\x02\ +\xa8\x01\xed\xff\xd7\x02\xa8\x02j\xff\xd7\x02\xa8\x02\x7f\xff\ +\xd7\x02\xa8\x02\x85\xff\xd7\x02\xa8\x02\x87\xff\xd7\x02\xa8\x02\ +\x89\xff\xd7\x02\xa8\x02\x8d\xff\xd7\x02\xa8\x02\xb2\xff\xd7\x02\ +\xa8\x02\xb4\xff\xd7\x02\xa8\x02\xc0\xff\xd7\x02\xa8\x02\xc2\xff\ +\xd7\x02\xa8\x02\xc6\xff\xd7\x02\xa8\x02\xc8\xff\xd7\x02\xa8\x02\ +\xd5\xff\xd7\x02\xa8\x02\xe0\xff\xd7\x02\xa8\x02\xf0\xff\xd7\x02\ +\xa8\x02\xf2\xff\xd7\x02\xa8\x02\xf4\xff\xd7\x02\xa8\x02\xfe\xff\ +\xd7\x02\xa8\x03\x0a\xff\xd7\x02\xa8\x03\x0c\xff\xd7\x02\xa8\x03\ +\x16\xff\xd7\x02\xa8\x03\x1a\xff\xd7\x02\xa9\x01\x9f\xff\xd7\x02\ +\xa9\x01\xb8\xff\xd7\x02\xa9\x01\xbb\xff\xd7\x02\xa9\x01\xbe\xff\ +\xd7\x02\xa9\x01\xc1\xff\xd7\x02\xa9\x01\xe1\xff\xd7\x02\xa9\x02\ +l\xff\xd7\x02\xa9\x02|\xff\xd7\x02\xa9\x02~\xff\xd7\x02\ +\xa9\x02\x84\xff\xd7\x02\xa9\x02\x86\xff\xd7\x02\xa9\x02\x88\xff\ +\xd7\x02\xa9\x02\x8a\xff\xd7\x02\xa9\x02\x8c\xff\xd7\x02\xa9\x02\ +\xb1\xff\xd7\x02\xa9\x02\xb3\xff\xd7\x02\xa9\x02\xbf\xff\xd7\x02\ +\xa9\x02\xc0\xff\xd7\x02\xa9\x02\xc1\xff\xd7\x02\xa9\x02\xc2\xff\ +\xd7\x02\xa9\x02\xc5\xff\x9a\x02\xa9\x02\xc7\xff\x9a\x02\xa9\x02\ +\xd4\xff\xd7\x02\xa9\x02\xd5\xff\xd7\x02\xa9\x02\xef\xff\xd7\x02\ +\xa9\x02\xf1\xff\xd7\x02\xa9\x02\xf3\xff\xd7\x02\xa9\x02\xfd\xff\ +\xd7\x02\xa9\x02\xfe\xff\xd7\x02\xa9\x03\x09\xff\xd7\x02\xa9\x03\ +\x0b\xff\xd7\x02\xa9\x03\x0e\xff\xd7\x02\xa9\x03\x10\xff\xd7\x02\ +\xa9\x03\x15\xff\xd7\x02\xa9\x03\x19\xff\xec\x02\xaa\x01\xcf\xff\ +\xd7\x02\xaa\x01\xd8\xff\xd7\x02\xaa\x01\xdb\xff\xd7\x02\xaa\x01\ +\xde\xff\xd7\x02\xaa\x01\xe1\xff\xd7\x02\xaa\x01\xea\xff\xd7\x02\ +\xaa\x01\xed\xff\xd7\x02\xaa\x02j\xff\xd7\x02\xaa\x02\x7f\xff\ +\xd7\x02\xaa\x02\x85\xff\xd7\x02\xaa\x02\x87\xff\xd7\x02\xaa\x02\ +\x89\xff\xd7\x02\xaa\x02\x8d\xff\xd7\x02\xaa\x02\xb2\xff\xd7\x02\ +\xaa\x02\xb4\xff\xd7\x02\xaa\x02\xc0\xff\xd7\x02\xaa\x02\xc2\xff\ +\xd7\x02\xaa\x02\xc6\xff\xd7\x02\xaa\x02\xc8\xff\xd7\x02\xaa\x02\ +\xd5\xff\xd7\x02\xaa\x02\xe0\xff\xd7\x02\xaa\x02\xf0\xff\xd7\x02\ +\xaa\x02\xf2\xff\xd7\x02\xaa\x02\xf4\xff\xd7\x02\xaa\x02\xfe\xff\ +\xd7\x02\xaa\x03\x0a\xff\xd7\x02\xaa\x03\x0c\xff\xd7\x02\xaa\x03\ +\x16\xff\xd7\x02\xaa\x03\x1a\xff\xd7\x02\xab\x01\xa3\x00\xe1\x02\ +\xab\x02\xea\x00)\x02\xab\x03\x0e\xff\xd7\x02\xab\x03\x10\xff\ +\xd7\x02\xac\x00\x05\xff\xec\x02\xac\x00\x0a\xff\xec\x02\xac\x02\ +\x07\xff\xec\x02\xac\x02\x0b\xff\xec\x02\xad\x00\x0f\xff\x9a\x02\ +\xad\x00\x10\xff\xd7\x02\xad\x00\x11\xff\x9a\x02\xad\x01\x9d\x00\ +)\x02\xad\x01\x9f\xff\xd7\x02\xad\x01\xa4\xff\xae\x02\xad\x01\ +\xa6\x00)\x02\xad\x01\xaa\xff\x85\x02\xad\x01\xae\xff\xae\x02\ +\xad\x01\xb5\xff\xae\x02\xad\x01\xb8\xff\xd7\x02\xad\x01\xbb\xff\ +\xd7\x02\xad\x01\xbc\x00)\x02\xad\x01\xbe\xff\xc3\x02\xad\x01\ +\xc4\x00)\x02\xad\x01\xcc\xff\xc3\x02\xad\x01\xcd\xff\xc3\x02\ +\xad\x01\xce\xff\x9a\x02\xad\x01\xcf\xff\xae\x02\xad\x01\xd0\xff\ +\xd7\x02\xad\x01\xd1\xff\xd7\x02\xad\x01\xd2\xff\xc3\x02\xad\x01\ +\xd3\xff\xc3\x02\xad\x01\xd4\xff\xc3\x02\xad\x01\xd5\xff\x9a\x02\ +\xad\x01\xd6\xff\xc3\x02\xad\x01\xd7\xff\xc3\x02\xad\x01\xd8\xff\ +\xae\x02\xad\x01\xd9\xff\xc3\x02\xad\x01\xda\xff\xc3\x02\xad\x01\ +\xdb\xff\xae\x02\xad\x01\xde\xff\xae\x02\xad\x01\xdf\xff\xd7\x02\ +\xad\x01\xe0\xff\xc3\x02\xad\x01\xe1\xff\x9a\x02\xad\x01\xe2\xff\ +\xc3\x02\xad\x01\xe3\xff\xc3\x02\xad\x01\xe5\xff\xc3\x02\xad\x01\ +\xe6\xff\xc3\x02\xad\x01\xe7\xff\xd7\x02\xad\x01\xe8\xff\xc3\x02\ +\xad\x01\xea\xff\xae\x02\xad\x01\xeb\x00)\x02\xad\x01\xec\xff\ +\xc3\x02\xad\x01\xed\xff\xae\x02\xad\x01\xee\xff\xc3\x02\xad\x01\ +\xf2\xff\x9a\x02\xad\x01\xf3\xff\xc3\x02\xad\x01\xf4\x00)\x02\ +\xad\x01\xf5\xff\xc3\x02\xad\x01\xf7\xff\xc3\x02\xad\x01\xf9\xff\ +\xc3\x02\xad\x02\x02\xff\xd7\x02\xad\x02\x03\xff\xd7\x02\xad\x02\ +\x04\xff\xd7\x02\xad\x02\x08\xff\x9a\x02\xad\x02\x0c\xff\x9a\x02\ +\xad\x02j\xff\xae\x02\xad\x02k\xff\xc3\x02\xad\x02l\xff\ +\xd7\x02\xad\x02q\xff\xc3\x02\xad\x02r\xff\x85\x02\xad\x02\ +s\xff\x9a\x02\xad\x02u\xff\xc3\x02\xad\x02w\xff\xd7\x02\ +\xad\x02y\xff\xc3\x02\xad\x02}\xff\xc3\x02\xad\x02~\xff\ +\xd7\x02\xad\x02\x7f\xff\xae\x02\xad\x02\x84\xff\xd7\x02\xad\x02\ +\x85\xff\xae\x02\xad\x02\x86\xff\xd7\x02\xad\x02\x87\xff\xae\x02\ +\xad\x02\x88\xff\xd7\x02\xad\x02\x89\xff\xae\x02\xad\x02\x8a\xff\ +\xd7\x02\xad\x02\x8c\xff\xd7\x02\xad\x02\x8d\xff\xae\x02\xad\x02\ +\x96\xff\xc3\x02\xad\x02\x98\x00)\x02\xad\x02\x9a\xff\xc3\x02\ +\xad\x02\x9e\xff\xc3\x02\xad\x02\xa0\xff\xd7\x02\xad\x02\xa2\xff\ +\xd7\x02\xad\x02\xa4\xff\xc3\x02\xad\x02\xa6\xff\xc3\x02\xad\x02\ +\xa8\x00)\x02\xad\x02\xa9\x00)\x02\xad\x02\xac\xff\xc3\x02\ +\xad\x02\xae\xff\xc3\x02\xad\x02\xb0\xff\xc3\x02\xad\x02\xb1\xff\ +\xd7\x02\xad\x02\xb2\xff\xae\x02\xad\x02\xb3\xff\xd7\x02\xad\x02\ +\xb4\xff\xae\x02\xad\x02\xb5\x00)\x02\xad\x02\xbc\xff\xd7\x02\ +\xad\x02\xbd\x00)\x02\xad\x02\xc0\xff\x9a\x02\xad\x02\xc2\xff\ +\x9a\x02\xad\x02\xc4\xff\xc3\x02\xad\x02\xc5\xff\xd7\x02\xad\x02\ +\xc6\xff\xc3\x02\xad\x02\xc7\xff\xd7\x02\xad\x02\xc8\xff\xc3\x02\ +\xad\x02\xcb\xff\xd7\x02\xad\x02\xcd\xff\xc3\x02\xad\x02\xce\xff\ +\xae\x02\xad\x02\xcf\xff\x9a\x02\xad\x02\xd1\xff\xc3\x02\xad\x02\ +\xd3\xff\xc3\x02\xad\x02\xd5\xff\x9a\x02\xad\x02\xd7\xff\xc3\x02\ +\xad\x02\xd9\xff\x85\x02\xad\x02\xdb\xff\x85\x02\xad\x02\xdd\xff\ +\x85\x02\xad\x02\xe0\xff\xae\x02\xad\x02\xe6\xff\xd7\x02\xad\x02\ +\xe8\xff\xd7\x02\xad\x02\xec\xff\xc3\x02\xad\x02\xee\xff\xc3\x02\ +\xad\x02\xef\xff\xd7\x02\xad\x02\xf0\xff\xae\x02\xad\x02\xf1\xff\ +\xd7\x02\xad\x02\xf2\xff\xae\x02\xad\x02\xf3\xff\xd7\x02\xad\x02\ +\xf4\xff\xae\x02\xad\x02\xf6\xff\xd7\x02\xad\x02\xfe\xff\x9a\x02\ +\xad\x03\x00\xff\xc3\x02\xad\x03\x02\xff\xc3\x02\xad\x03\x06\xff\ +\xd7\x02\xad\x03\x08\xff\xd7\x02\xad\x03\x09\xff\x9a\x02\xad\x03\ +\x0a\xff\xae\x02\xad\x03\x0b\xff\x9a\x02\xad\x03\x0c\xff\xae\x02\ +\xad\x03\x0e\xff\xd7\x02\xad\x03\x10\xff\xd7\x02\xad\x03\x11\xff\ +\xae\x02\xad\x03\x12\xff\x9a\x02\xad\x03\x14\xff\xc3\x02\xad\x03\ +\x15\xff\xd7\x02\xad\x03\x16\xff\xae\x02\xad\x03\x17\x00)\x02\ +\xad\x03\x1a\xff\xae\x02\xad\x03\x1b\xff\xae\x02\xad\x03\x1c\xff\ +\x9a\x02\xae\x00\x0f\xff\x9a\x02\xae\x00\x10\xff\xd7\x02\xae\x00\ +\x11\xff\x9a\x02\xae\x01\xce\xff\xc3\x02\xae\x01\xcf\xff\xec\x02\ +\xae\x01\xd5\xff\xc3\x02\xae\x01\xd8\xff\xec\x02\xae\x01\xdb\xff\ +\xec\x02\xae\x01\xde\xff\xec\x02\xae\x01\xea\xff\xec\x02\xae\x01\ +\xed\xff\xec\x02\xae\x01\xf2\xff\xc3\x02\xae\x02\x02\xff\xd7\x02\ +\xae\x02\x03\xff\xd7\x02\xae\x02\x04\xff\xd7\x02\xae\x02\x08\xff\ +\x9a\x02\xae\x02\x0c\xff\x9a\x02\xae\x02j\xff\xec\x02\xae\x02\ +s\xff\xc3\x02\xae\x02\x7f\xff\xec\x02\xae\x02\x85\xff\xec\x02\ +\xae\x02\x87\xff\xec\x02\xae\x02\x89\xff\xec\x02\xae\x02\x8d\xff\ +\xec\x02\xae\x02\xb2\xff\xec\x02\xae\x02\xb4\xff\xec\x02\xae\x02\ +\xcf\xff\xc3\x02\xae\x02\xe0\xff\xec\x02\xae\x02\xf0\xff\xec\x02\ +\xae\x02\xf2\xff\xec\x02\xae\x02\xf4\xff\xec\x02\xae\x03\x0a\xff\ +\xec\x02\xae\x03\x0c\xff\xec\x02\xae\x03\x12\xff\xc3\x02\xae\x03\ +\x16\xff\xec\x02\xae\x03\x1a\xff\xec\x02\xae\x03\x1c\xff\xc3\x02\ +\xaf\x00\x05\xff\x5c\x02\xaf\x00\x0a\xff\x5c\x02\xaf\x01\x9d\xff\ +\x9a\x02\xaf\x01\xa3\x00f\x02\xaf\x01\xa6\xff\x9a\x02\xaf\x01\ +\xbc\xffH\x02\xaf\x01\xc1\xff\x85\x02\xaf\x01\xc4\xff\x9a\x02\ +\xaf\x01\xdc\xff\xae\x02\xaf\x01\xe1\xff\xd7\x02\xaf\x01\xe4\xff\ +\xae\x02\xaf\x02\x07\xff\x5c\x02\xaf\x02\x0b\xff\x5c\x02\xaf\x02\ +|\xff\x85\x02\xaf\x02\x80\xffq\x02\xaf\x02\x82\xffq\x02\ +\xaf\x02\xa9\xff\x9a\x02\xaf\x02\xaa\xff\xae\x02\xaf\x02\xb5\xff\ +H\x02\xaf\x02\xb6\xff\xae\x02\xaf\x02\xb7\xff\x9a\x02\xaf\x02\ +\xb9\xff\x9a\x02\xaf\x02\xbd\xff\x9a\x02\xaf\x02\xbe\xff\xae\x02\ +\xaf\x02\xbf\xff\x85\x02\xaf\x02\xc0\xff\xd7\x02\xaf\x02\xc1\xff\ +\x85\x02\xaf\x02\xc2\xff\xd7\x02\xaf\x02\xc5\xff\xc3\x02\xaf\x02\ +\xc6\xff\xd7\x02\xaf\x02\xc7\xff\xc3\x02\xaf\x02\xc8\xff\xd7\x02\ +\xaf\x02\xd4\xff\x85\x02\xaf\x02\xd5\xff\xd7\x02\xaf\x02\xfd\xff\ +\x85\x02\xaf\x02\xfe\xff\xd7\x02\xaf\x03\x0d\xffH\x02\xaf\x03\ +\x0e\xff\xae\x02\xaf\x03\x0f\xffH\x02\xaf\x03\x10\xff\xae\x02\ +\xaf\x03\x17\xff\x9a\x02\xaf\x03\x18\xff\xae\x02\xb0\x00\x05\xff\ +q\x02\xb0\x00\x0a\xffq\x02\xb0\x01\xdc\xff\x9a\x02\xb0\x01\ +\xe1\xff\xd7\x02\xb0\x01\xe4\xff\x9a\x02\xb0\x02\x07\xffq\x02\ +\xb0\x02\x0b\xffq\x02\xb0\x02m\xff\xd7\x02\xb0\x02\x81\xff\ +\xd7\x02\xb0\x02\x83\xff\xd7\x02\xb0\x02\x8b\xff\xd7\x02\xb0\x02\ +\xaa\xff\x9a\x02\xb0\x02\xb6\xff\x9a\x02\xb0\x02\xb8\xff\xd7\x02\ +\xb0\x02\xba\xff\xd7\x02\xb0\x02\xbe\xff\x9a\x02\xb0\x02\xc0\xff\ +\xd7\x02\xb0\x02\xc2\xff\xd7\x02\xb0\x02\xc6\xff\xd7\x02\xb0\x02\ +\xc8\xff\xd7\x02\xb0\x02\xd5\xff\xd7\x02\xb0\x02\xfe\xff\xd7\x02\ +\xb0\x03\x0e\xffq\x02\xb0\x03\x10\xffq\x02\xb0\x03\x18\xff\ +\x9a\x02\xb1\x01\x9d\xff\xd7\x02\xb1\x01\xa6\xff\xd7\x02\xb1\x01\ +\xbc\xff\xc3\x02\xb1\x01\xc4\xff\xd7\x02\xb1\x02\x80\xff\xec\x02\ +\xb1\x02\x82\xff\xec\x02\xb1\x02\xa9\xff\xd7\x02\xb1\x02\xb5\xff\ +\xc3\x02\xb1\x02\xb7\xff\xec\x02\xb1\x02\xb9\xff\xec\x02\xb1\x02\ +\xbd\xff\xd7\x02\xb1\x03\x0d\xff\xd7\x02\xb1\x03\x0f\xff\xd7\x02\ +\xb1\x03\x17\xff\xd7\x02\xb2\x00\x05\xff\xec\x02\xb2\x00\x0a\xff\ +\xec\x02\xb2\x01\xd0\xff\xd7\x02\xb2\x01\xdc\xff\xec\x02\xb2\x01\ +\xdd\xff\xec\x02\xb2\x01\xdf\xff\xd7\x02\xb2\x01\xe1\xff\xec\x02\ +\xb2\x01\xe4\xff\xec\x02\xb2\x01\xf6\xff\xec\x02\xb2\x02\x07\xff\ +\xec\x02\xb2\x02\x0b\xff\xec\x02\xb2\x02\xa0\xff\xd7\x02\xb2\x02\ +\xaa\xff\xec\x02\xb2\x02\xb6\xff\xec\x02\xb2\x02\xbc\xff\xd7\x02\ +\xb2\x02\xbe\xff\xec\x02\xb2\x02\xc0\xff\xec\x02\xb2\x02\xc2\xff\ +\xec\x02\xb2\x02\xcb\xff\xd7\x02\xb2\x02\xd5\xff\xec\x02\xb2\x02\ +\xe6\xff\xd7\x02\xb2\x02\xf8\xff\xec\x02\xb2\x02\xfa\xff\xec\x02\ +\xb2\x02\xfc\xff\xec\x02\xb2\x02\xfe\xff\xec\x02\xb2\x03\x06\xff\ +\xd7\x02\xb2\x03\x08\xff\xd7\x02\xb2\x03\x0e\xff\xec\x02\xb2\x03\ +\x10\xff\xec\x02\xb2\x03\x18\xff\xec\x02\xb3\x01\x9f\xff\xd7\x02\ +\xb3\x01\xb8\xff\xd7\x02\xb3\x01\xbb\xff\xd7\x02\xb3\x01\xbe\xff\ +\xd7\x02\xb3\x01\xe1\xff\xd7\x02\xb3\x02l\xff\xd7\x02\xb3\x02\ +~\xff\xd7\x02\xb3\x02\x84\xff\xd7\x02\xb3\x02\x86\xff\xd7\x02\ +\xb3\x02\x88\xff\xd7\x02\xb3\x02\x8a\xff\xd7\x02\xb3\x02\x8c\xff\ +\xd7\x02\xb3\x02\xb1\xff\xd7\x02\xb3\x02\xb3\xff\xd7\x02\xb3\x02\ +\xc0\xff\xd7\x02\xb3\x02\xc2\xff\xd7\x02\xb3\x02\xc5\xff\xd7\x02\ +\xb3\x02\xc7\xff\xd7\x02\xb3\x02\xd5\xff\xd7\x02\xb3\x02\xef\xff\ +\xd7\x02\xb3\x02\xf1\xff\xd7\x02\xb3\x02\xf3\xff\xd7\x02\xb3\x02\ +\xfe\xff\xd7\x02\xb3\x03\x09\xff\xd7\x02\xb3\x03\x0b\xff\xd7\x02\ +\xb3\x03\x0e\xff\xd7\x02\xb3\x03\x10\xff\xd7\x02\xb3\x03\x15\xff\ +\xd7\x02\xb5\x00\x0f\xff\x85\x02\xb5\x00\x10\xff\xae\x02\xb5\x00\ +\x11\xff\x85\x02\xb5\x01\x9f\xff\xd7\x02\xb5\x01\xa4\xff\x9a\x02\ +\xb5\x01\xaa\xffq\x02\xb5\x01\xae\xff\x9a\x02\xb5\x01\xb5\xff\ +\x9a\x02\xb5\x01\xb8\xff\xd7\x02\xb5\x01\xbb\xff\xd7\x02\xb5\x01\ +\xbc\x00)\x02\xb5\x01\xbe\xff\xae\x02\xb5\x01\xcc\xff\x9a\x02\ +\xb5\x01\xcd\xff\x9a\x02\xb5\x01\xce\xff\x85\x02\xb5\x01\xcf\xff\ +q\x02\xb5\x01\xd0\xff\xd7\x02\xb5\x01\xd1\xff\xd7\x02\xb5\x01\ +\xd2\xff\x9a\x02\xb5\x01\xd3\xff\x9a\x02\xb5\x01\xd4\xff\x9a\x02\ +\xb5\x01\xd5\xff\x85\x02\xb5\x01\xd6\xff\x9a\x02\xb5\x01\xd7\xff\ +\x9a\x02\xb5\x01\xd8\xffq\x02\xb5\x01\xd9\xff\x9a\x02\xb5\x01\ +\xda\xff\x9a\x02\xb5\x01\xdb\xffq\x02\xb5\x01\xdc\xff\xae\x02\ +\xb5\x01\xdd\xff\xae\x02\xb5\x01\xde\xffq\x02\xb5\x01\xdf\xff\ +\xd7\x02\xb5\x01\xe0\xff\x9a\x02\xb5\x01\xe1\xff\x9a\x02\xb5\x01\ +\xe2\xff\x9a\x02\xb5\x01\xe3\xff\x9a\x02\xb5\x01\xe4\xff\xae\x02\ +\xb5\x01\xe5\xff\x9a\x02\xb5\x01\xe6\xff\x9a\x02\xb5\x01\xe7\xff\ +\xd7\x02\xb5\x01\xe8\xff\x9a\x02\xb5\x01\xe9\xff\xc3\x02\xb5\x01\ +\xea\xffq\x02\xb5\x01\xec\xff\x9a\x02\xb5\x01\xed\xffq\x02\ +\xb5\x01\xee\xff\x85\x02\xb5\x01\xf2\xff\x85\x02\xb5\x01\xf3\xff\ +\x9a\x02\xb5\x01\xf5\xff\x9a\x02\xb5\x01\xf6\xff\xae\x02\xb5\x01\ +\xf7\xff\x9a\x02\xb5\x01\xf9\xff\x9a\x02\xb5\x02\x02\xff\xae\x02\ +\xb5\x02\x03\xff\xae\x02\xb5\x02\x04\xff\xae\x02\xb5\x02\x08\xff\ +\x85\x02\xb5\x02\x0c\xff\x85\x02\xb5\x02j\xffq\x02\xb5\x02\ +k\xff\x9a\x02\xb5\x02l\xff\xd7\x02\xb5\x02m\xff\xd7\x02\ +\xb5\x02q\xff\x9a\x02\xb5\x02r\xffq\x02\xb5\x02s\xff\ +\x85\x02\xb5\x02u\xff\x9a\x02\xb5\x02w\xff\x9a\x02\xb5\x02\ +y\xff\x9a\x02\xb5\x02}\xff\x9a\x02\xb5\x02~\xff\xd7\x02\ +\xb5\x02\x7f\xffq\x02\xb5\x02\x81\xff\xd7\x02\xb5\x02\x83\xff\ +\xd7\x02\xb5\x02\x84\xff\xd7\x02\xb5\x02\x85\xffq\x02\xb5\x02\ +\x86\xff\xd7\x02\xb5\x02\x87\xffq\x02\xb5\x02\x88\xff\xd7\x02\ +\xb5\x02\x89\xffq\x02\xb5\x02\x8a\xff\xd7\x02\xb5\x02\x8b\xff\ +\xd7\x02\xb5\x02\x8c\xff\xd7\x02\xb5\x02\x8d\xffq\x02\xb5\x02\ +\x96\xff\x9a\x02\xb5\x02\x9a\xff\x9a\x02\xb5\x02\x9e\xff\x9a\x02\ +\xb5\x02\xa0\xff\xd7\x02\xb5\x02\xa2\xff\xd7\x02\xb5\x02\xa4\xff\ +\x9a\x02\xb5\x02\xa6\xff\x9a\x02\xb5\x02\xaa\xff\xae\x02\xb5\x02\ +\xac\xff\x9a\x02\xb5\x02\xae\xff\x9a\x02\xb5\x02\xb0\xff\x9a\x02\ +\xb5\x02\xb1\xff\xd7\x02\xb5\x02\xb2\xffq\x02\xb5\x02\xb3\xff\ +\xd7\x02\xb5\x02\xb4\xffq\x02\xb5\x02\xb5\x00)\x02\xb5\x02\ +\xb6\xff\xae\x02\xb5\x02\xb8\xff\xae\x02\xb5\x02\xba\xff\xae\x02\ +\xb5\x02\xbc\xff\xd7\x02\xb5\x02\xbe\xff\xae\x02\xb5\x02\xc0\xff\ +\x9a\x02\xb5\x02\xc2\xff\x9a\x02\xb5\x02\xc4\xff\x9a\x02\xb5\x02\ +\xc5\xff\x9a\x02\xb5\x02\xc6\xffq\x02\xb5\x02\xc7\xff\x9a\x02\ +\xb5\x02\xc8\xffq\x02\xb5\x02\xcb\xff\xd7\x02\xb5\x02\xcd\xff\ +\x9a\x02\xb5\x02\xce\xff\x9a\x02\xb5\x02\xcf\xff\x85\x02\xb5\x02\ +\xd1\xff\x9a\x02\xb5\x02\xd3\xff\x9a\x02\xb5\x02\xd5\xff\x9a\x02\ +\xb5\x02\xd7\xff\x9a\x02\xb5\x02\xd9\xffq\x02\xb5\x02\xdb\xff\ +q\x02\xb5\x02\xdd\xffq\x02\xb5\x02\xe0\xffq\x02\xb5\x02\ +\xe6\xff\xd7\x02\xb5\x02\xe8\xff\xd7\x02\xb5\x02\xea\xff\xc3\x02\ +\xb5\x02\xec\xff\x9a\x02\xb5\x02\xee\xff\x9a\x02\xb5\x02\xef\xff\ +\xd7\x02\xb5\x02\xf0\xffq\x02\xb5\x02\xf1\xff\xd7\x02\xb5\x02\ +\xf2\xffq\x02\xb5\x02\xf3\xff\xd7\x02\xb5\x02\xf4\xffq\x02\ +\xb5\x02\xf6\xff\xd7\x02\xb5\x02\xf8\xff\xae\x02\xb5\x02\xfa\xff\ +\xae\x02\xb5\x02\xfc\xff\xae\x02\xb5\x02\xfe\xff\x9a\x02\xb5\x03\ +\x00\xff\x9a\x02\xb5\x03\x02\xff\x9a\x02\xb5\x03\x06\xff\xd7\x02\ +\xb5\x03\x08\xff\xd7\x02\xb5\x03\x09\xffq\x02\xb5\x03\x0a\xff\ +q\x02\xb5\x03\x0b\xffq\x02\xb5\x03\x0c\xffq\x02\xb5\x03\ +\x0e\xff\x9a\x02\xb5\x03\x10\xff\x9a\x02\xb5\x03\x11\xff\x9a\x02\ +\xb5\x03\x12\xff\x85\x02\xb5\x03\x14\xff\x9a\x02\xb5\x03\x15\xff\ +\xd7\x02\xb5\x03\x16\xffq\x02\xb5\x03\x18\xff\xae\x02\xb5\x03\ +\x1a\xffq\x02\xb5\x03\x1b\xff\x9a\x02\xb5\x03\x1c\xff\x85\x02\ +\xb6\x00\x0f\xff\x9a\x02\xb6\x00\x10\xff\xd7\x02\xb6\x00\x11\xff\ +\x9a\x02\xb6\x01\xce\xff\xc3\x02\xb6\x01\xcf\xff\xec\x02\xb6\x01\ +\xd5\xff\xc3\x02\xb6\x01\xd8\xff\xec\x02\xb6\x01\xdb\xff\xec\x02\ +\xb6\x01\xde\xff\xec\x02\xb6\x01\xea\xff\xec\x02\xb6\x01\xed\xff\ +\xec\x02\xb6\x01\xf2\xff\xc3\x02\xb6\x02\x02\xff\xd7\x02\xb6\x02\ +\x03\xff\xd7\x02\xb6\x02\x04\xff\xd7\x02\xb6\x02\x08\xff\x9a\x02\ +\xb6\x02\x0c\xff\x9a\x02\xb6\x02j\xff\xec\x02\xb6\x02s\xff\ +\xc3\x02\xb6\x02\x7f\xff\xec\x02\xb6\x02\x85\xff\xec\x02\xb6\x02\ +\x87\xff\xec\x02\xb6\x02\x89\xff\xec\x02\xb6\x02\x8d\xff\xec\x02\ +\xb6\x02\xb2\xff\xec\x02\xb6\x02\xb4\xff\xec\x02\xb6\x02\xcf\xff\ +\xc3\x02\xb6\x02\xe0\xff\xec\x02\xb6\x02\xf0\xff\xec\x02\xb6\x02\ +\xf2\xff\xec\x02\xb6\x02\xf4\xff\xec\x02\xb6\x03\x0a\xff\xec\x02\ +\xb6\x03\x0c\xff\xec\x02\xb6\x03\x12\xff\xc3\x02\xb6\x03\x16\xff\ +\xec\x02\xb6\x03\x1a\xff\xec\x02\xb6\x03\x1c\xff\xc3\x02\xb7\x00\ +\x0f\xff\x85\x02\xb7\x00\x11\xff\x85\x02\xb7\x01\x9f\xff\xd7\x02\ +\xb7\x01\xa4\xff\xae\x02\xb7\x01\xaa\xff\x85\x02\xb7\x01\xae\xff\ +\xae\x02\xb7\x01\xb5\xff\xae\x02\xb7\x01\xb8\xff\xd7\x02\xb7\x01\ +\xbb\xff\xd7\x02\xb7\x01\xbe\xff\xc3\x02\xb7\x01\xca\xff\xae\x02\ +\xb7\x01\xcc\xff\xc3\x02\xb7\x01\xcd\xff\xc3\x02\xb7\x01\xce\xff\ +\x9a\x02\xb7\x01\xcf\xff\x9a\x02\xb7\x01\xd2\xff\xc3\x02\xb7\x01\ +\xd3\xff\xc3\x02\xb7\x01\xd4\xff\xc3\x02\xb7\x01\xd5\xff\x9a\x02\ +\xb7\x01\xd6\xff\xc3\x02\xb7\x01\xd7\xff\xc3\x02\xb7\x01\xd8\xff\ +\x9a\x02\xb7\x01\xd9\xff\xc3\x02\xb7\x01\xda\xff\xc3\x02\xb7\x01\ +\xdb\xff\x9a\x02\xb7\x01\xde\xff\x9a\x02\xb7\x01\xe0\xff\xc3\x02\ +\xb7\x01\xe1\xff\xae\x02\xb7\x01\xe2\xff\xc3\x02\xb7\x01\xe3\xff\ +\xc3\x02\xb7\x01\xe5\xff\xc3\x02\xb7\x01\xe6\xff\xc3\x02\xb7\x01\ +\xe8\xff\xc3\x02\xb7\x01\xe9\xff\xd7\x02\xb7\x01\xea\xff\x9a\x02\ +\xb7\x01\xeb\x00)\x02\xb7\x01\xec\xff\xc3\x02\xb7\x01\xed\xff\ +\x9a\x02\xb7\x01\xee\xff\xae\x02\xb7\x01\xf2\xff\x9a\x02\xb7\x01\ +\xf3\xff\xc3\x02\xb7\x01\xf4\x00)\x02\xb7\x01\xf5\xff\xc3\x02\ +\xb7\x01\xf7\xff\xc3\x02\xb7\x01\xf9\xff\xc3\x02\xb7\x02\x08\xff\ +\x85\x02\xb7\x02\x0c\xff\x85\x02\xb7\x02j\xff\x9a\x02\xb7\x02\ +k\xff\xc3\x02\xb7\x02l\xff\xd7\x02\xb7\x02q\xff\xc3\x02\ +\xb7\x02r\xff\x85\x02\xb7\x02s\xff\x9a\x02\xb7\x02u\xff\ +\xc3\x02\xb7\x02w\xff\xd7\x02\xb7\x02y\xff\xc3\x02\xb7\x02\ +}\xff\xd7\x02\xb7\x02~\xff\xd7\x02\xb7\x02\x7f\xff\x9a\x02\ +\xb7\x02\x84\xff\xd7\x02\xb7\x02\x85\xff\x9a\x02\xb7\x02\x86\xff\ +\xd7\x02\xb7\x02\x87\xff\x9a\x02\xb7\x02\x88\xff\xd7\x02\xb7\x02\ +\x89\xff\x9a\x02\xb7\x02\x8a\xff\xd7\x02\xb7\x02\x8c\xff\xd7\x02\ +\xb7\x02\x8d\xff\x9a\x02\xb7\x02\x96\xff\xc3\x02\xb7\x02\x98\x00\ +)\x02\xb7\x02\x9a\xff\xc3\x02\xb7\x02\x9e\xff\xc3\x02\xb7\x02\ +\xa4\xff\xc3\x02\xb7\x02\xa6\xff\xc3\x02\xb7\x02\xa8\x00)\x02\ +\xb7\x02\xac\xff\xc3\x02\xb7\x02\xae\xff\xc3\x02\xb7\x02\xb0\xff\ +\xc3\x02\xb7\x02\xb1\xff\xd7\x02\xb7\x02\xb2\xff\x9a\x02\xb7\x02\ +\xb3\xff\xd7\x02\xb7\x02\xb4\xff\x9a\x02\xb7\x02\xc0\xff\xae\x02\ +\xb7\x02\xc2\xff\xae\x02\xb7\x02\xc4\xff\xc3\x02\xb7\x02\xc6\xff\ +\xae\x02\xb7\x02\xc8\xff\xae\x02\xb7\x02\xcd\xff\xc3\x02\xb7\x02\ +\xce\xff\xae\x02\xb7\x02\xcf\xff\x9a\x02\xb7\x02\xd1\xff\xc3\x02\ +\xb7\x02\xd3\xff\xc3\x02\xb7\x02\xd5\xff\xae\x02\xb7\x02\xd7\xff\ +\xc3\x02\xb7\x02\xd9\xff\x85\x02\xb7\x02\xda\xff\xae\x02\xb7\x02\ +\xdb\xff\x85\x02\xb7\x02\xdc\xff\xae\x02\xb7\x02\xdd\xff\x85\x02\ +\xb7\x02\xde\xff\xae\x02\xb7\x02\xe0\xff\x9a\x02\xb7\x02\xe1\xff\ +\xec\x02\xb7\x02\xe2\xff\xae\x02\xb7\x02\xe3\xff\xec\x02\xb7\x02\ +\xe4\xff\xae\x02\xb7\x02\xec\xff\xc3\x02\xb7\x02\xee\xff\xc3\x02\ +\xb7\x02\xef\xff\xd7\x02\xb7\x02\xf0\xff\x9a\x02\xb7\x02\xf1\xff\ +\xd7\x02\xb7\x02\xf2\xff\x9a\x02\xb7\x02\xf3\xff\xd7\x02\xb7\x02\ +\xf4\xff\x9a\x02\xb7\x02\xfe\xff\xae\x02\xb7\x03\x00\xff\xc3\x02\ +\xb7\x03\x02\xff\xc3\x02\xb7\x03\x09\xff\xae\x02\xb7\x03\x0a\xff\ +\x9a\x02\xb7\x03\x0b\xff\xae\x02\xb7\x03\x0c\xff\x9a\x02\xb7\x03\ +\x0e\xff\xd7\x02\xb7\x03\x10\xff\xd7\x02\xb7\x03\x11\xff\xae\x02\ +\xb7\x03\x12\xff\x9a\x02\xb7\x03\x14\xff\xc3\x02\xb7\x03\x15\xff\ +\xd7\x02\xb7\x03\x16\xff\x9a\x02\xb7\x03\x19\xff\xec\x02\xb7\x03\ +\x1a\xff\x9a\x02\xb7\x03\x1b\xff\xae\x02\xb7\x03\x1c\xff\x9a\x02\ +\xb8\x00\x0f\xff\xae\x02\xb8\x00\x11\xff\xae\x02\xb8\x01\xce\xff\ +\xec\x02\xb8\x01\xd5\xff\xec\x02\xb8\x01\xf2\xff\xec\x02\xb8\x02\ +\x08\xff\xae\x02\xb8\x02\x0c\xff\xae\x02\xb8\x02s\xff\xec\x02\ +\xb8\x02\xcf\xff\xec\x02\xb8\x03\x12\xff\xec\x02\xb8\x03\x1c\xff\ +\xec\x02\xb9\x00\x0f\xff\x85\x02\xb9\x00\x11\xff\x85\x02\xb9\x01\ +\x9f\xff\xd7\x02\xb9\x01\xa4\xff\xae\x02\xb9\x01\xaa\xff\x85\x02\ +\xb9\x01\xae\xff\xae\x02\xb9\x01\xb5\xff\xae\x02\xb9\x01\xb8\xff\ +\xd7\x02\xb9\x01\xbb\xff\xd7\x02\xb9\x01\xbe\xff\xc3\x02\xb9\x01\ +\xca\xff\xae\x02\xb9\x01\xcc\xff\xc3\x02\xb9\x01\xcd\xff\xc3\x02\ +\xb9\x01\xce\xff\x9a\x02\xb9\x01\xcf\xff\x9a\x02\xb9\x01\xd2\xff\ +\xc3\x02\xb9\x01\xd3\xff\xc3\x02\xb9\x01\xd4\xff\xc3\x02\xb9\x01\ +\xd5\xff\x9a\x02\xb9\x01\xd6\xff\xc3\x02\xb9\x01\xd7\xff\xc3\x02\ +\xb9\x01\xd8\xff\x9a\x02\xb9\x01\xd9\xff\xc3\x02\xb9\x01\xda\xff\ +\xc3\x02\xb9\x01\xdb\xff\x9a\x02\xb9\x01\xde\xff\x9a\x02\xb9\x01\ +\xe0\xff\xc3\x02\xb9\x01\xe1\xff\xae\x02\xb9\x01\xe2\xff\xc3\x02\ +\xb9\x01\xe3\xff\xc3\x02\xb9\x01\xe5\xff\xc3\x02\xb9\x01\xe6\xff\ +\xc3\x02\xb9\x01\xe8\xff\xc3\x02\xb9\x01\xe9\xff\xd7\x02\xb9\x01\ +\xea\xff\x9a\x02\xb9\x01\xeb\x00)\x02\xb9\x01\xec\xff\xc3\x02\ +\xb9\x01\xed\xff\x9a\x02\xb9\x01\xee\xff\xae\x02\xb9\x01\xf2\xff\ +\x9a\x02\xb9\x01\xf3\xff\xc3\x02\xb9\x01\xf4\x00)\x02\xb9\x01\ +\xf5\xff\xc3\x02\xb9\x01\xf7\xff\xc3\x02\xb9\x01\xf9\xff\xc3\x02\ +\xb9\x02\x08\xff\x85\x02\xb9\x02\x0c\xff\x85\x02\xb9\x02j\xff\ +\x9a\x02\xb9\x02k\xff\xc3\x02\xb9\x02l\xff\xd7\x02\xb9\x02\ +q\xff\xc3\x02\xb9\x02r\xff\x85\x02\xb9\x02s\xff\x9a\x02\ +\xb9\x02u\xff\xc3\x02\xb9\x02w\xff\xd7\x02\xb9\x02y\xff\ +\xc3\x02\xb9\x02}\xff\xd7\x02\xb9\x02~\xff\xd7\x02\xb9\x02\ +\x7f\xff\x9a\x02\xb9\x02\x84\xff\xd7\x02\xb9\x02\x85\xff\x9a\x02\ +\xb9\x02\x86\xff\xd7\x02\xb9\x02\x87\xff\x9a\x02\xb9\x02\x88\xff\ +\xd7\x02\xb9\x02\x89\xff\x9a\x02\xb9\x02\x8a\xff\xd7\x02\xb9\x02\ +\x8c\xff\xd7\x02\xb9\x02\x8d\xff\x9a\x02\xb9\x02\x96\xff\xc3\x02\ +\xb9\x02\x98\x00)\x02\xb9\x02\x9a\xff\xc3\x02\xb9\x02\x9e\xff\ +\xc3\x02\xb9\x02\xa4\xff\xc3\x02\xb9\x02\xa6\xff\xc3\x02\xb9\x02\ +\xa8\x00)\x02\xb9\x02\xac\xff\xc3\x02\xb9\x02\xae\xff\xc3\x02\ +\xb9\x02\xb0\xff\xc3\x02\xb9\x02\xb1\xff\xd7\x02\xb9\x02\xb2\xff\ +\x9a\x02\xb9\x02\xb3\xff\xd7\x02\xb9\x02\xb4\xff\x9a\x02\xb9\x02\ +\xc0\xff\xae\x02\xb9\x02\xc2\xff\xae\x02\xb9\x02\xc4\xff\xc3\x02\ +\xb9\x02\xc6\xff\xae\x02\xb9\x02\xc8\xff\xae\x02\xb9\x02\xcd\xff\ +\xc3\x02\xb9\x02\xce\xff\xae\x02\xb9\x02\xcf\xff\x9a\x02\xb9\x02\ +\xd1\xff\xc3\x02\xb9\x02\xd3\xff\xc3\x02\xb9\x02\xd5\xff\xae\x02\ +\xb9\x02\xd7\xff\xc3\x02\xb9\x02\xd9\xff\x85\x02\xb9\x02\xda\xff\ +\xae\x02\xb9\x02\xdb\xff\x85\x02\xb9\x02\xdc\xff\xae\x02\xb9\x02\ +\xdd\xff\x85\x02\xb9\x02\xde\xff\xae\x02\xb9\x02\xe0\xff\x9a\x02\ +\xb9\x02\xe1\xff\xec\x02\xb9\x02\xe2\xff\xae\x02\xb9\x02\xe3\xff\ +\xec\x02\xb9\x02\xe4\xff\xae\x02\xb9\x02\xec\xff\xc3\x02\xb9\x02\ +\xee\xff\xc3\x02\xb9\x02\xef\xff\xd7\x02\xb9\x02\xf0\xff\x9a\x02\ +\xb9\x02\xf1\xff\xd7\x02\xb9\x02\xf2\xff\x9a\x02\xb9\x02\xf3\xff\ +\xd7\x02\xb9\x02\xf4\xff\x9a\x02\xb9\x02\xfe\xff\xae\x02\xb9\x03\ +\x00\xff\xc3\x02\xb9\x03\x02\xff\xc3\x02\xb9\x03\x09\xff\xae\x02\ +\xb9\x03\x0a\xff\x9a\x02\xb9\x03\x0b\xff\xae\x02\xb9\x03\x0c\xff\ +\x9a\x02\xb9\x03\x0e\xff\xd7\x02\xb9\x03\x10\xff\xd7\x02\xb9\x03\ +\x11\xff\xae\x02\xb9\x03\x12\xff\x9a\x02\xb9\x03\x14\xff\xc3\x02\ +\xb9\x03\x15\xff\xd7\x02\xb9\x03\x16\xff\x9a\x02\xb9\x03\x19\xff\ +\xec\x02\xb9\x03\x1a\xff\x9a\x02\xb9\x03\x1b\xff\xae\x02\xb9\x03\ +\x1c\xff\x9a\x02\xba\x00\x0f\xff\xae\x02\xba\x00\x11\xff\xae\x02\ +\xba\x01\xce\xff\xec\x02\xba\x01\xd5\xff\xec\x02\xba\x01\xf2\xff\ +\xec\x02\xba\x02\x08\xff\xae\x02\xba\x02\x0c\xff\xae\x02\xba\x02\ +s\xff\xec\x02\xba\x02\xcf\xff\xec\x02\xba\x03\x12\xff\xec\x02\ +\xba\x03\x1c\xff\xec\x02\xbb\x01\x9f\xff\xd7\x02\xbb\x01\xa3\x00\ +\xe1\x02\xbb\x01\xb8\xff\xd7\x02\xbb\x01\xbb\xff\xd7\x02\xbb\x01\ +\xbe\xff\xc3\x02\xbb\x01\xdc\xff\xd7\x02\xbb\x01\xe1\xff\xae\x02\ +\xbb\x01\xe4\xff\xd7\x02\xbb\x02l\xff\xd7\x02\xbb\x02{\x00\ +=\x02\xbb\x02}\xff\xec\x02\xbb\x02~\xff\xd7\x02\xbb\x02\ +\x84\xff\xd7\x02\xbb\x02\x86\xff\xd7\x02\xbb\x02\x88\xff\xd7\x02\ +\xbb\x02\x8a\xff\xd7\x02\xbb\x02\x8c\xff\xd7\x02\xbb\x02\xaa\xff\ +\xd7\x02\xbb\x02\xb1\xff\xd7\x02\xbb\x02\xb3\xff\xd7\x02\xbb\x02\ +\xb6\xff\xd7\x02\xbb\x02\xbe\xff\xd7\x02\xbb\x02\xc0\xff\xae\x02\ +\xbb\x02\xc2\xff\xae\x02\xbb\x02\xc5\xff\xc3\x02\xbb\x02\xc6\xff\ +\xd7\x02\xbb\x02\xc7\xff\xc3\x02\xbb\x02\xc8\xff\xd7\x02\xbb\x02\ +\xd5\xff\xae\x02\xbb\x02\xef\xff\xd7\x02\xbb\x02\xf1\xff\xd7\x02\ +\xbb\x02\xf3\xff\xd7\x02\xbb\x02\xfe\xff\xae\x02\xbb\x03\x0e\xff\ +\xd7\x02\xbb\x03\x10\xff\xd7\x02\xbb\x03\x15\xff\xd7\x02\xbb\x03\ +\x18\xff\xd7\x02\xbc\x01\xcf\xff\xec\x02\xbc\x01\xd8\xff\xec\x02\ +\xbc\x01\xdb\xff\xec\x02\xbc\x01\xde\xff\xec\x02\xbc\x01\xe1\xff\ +\xec\x02\xbc\x01\xea\xff\xec\x02\xbc\x01\xed\xff\xec\x02\xbc\x02\ +j\xff\xec\x02\xbc\x02\x7f\xff\xec\x02\xbc\x02\x85\xff\xec\x02\ +\xbc\x02\x87\xff\xec\x02\xbc\x02\x89\xff\xec\x02\xbc\x02\x8d\xff\ +\xec\x02\xbc\x02\xb2\xff\xec\x02\xbc\x02\xb4\xff\xec\x02\xbc\x02\ +\xc0\xff\xec\x02\xbc\x02\xc2\xff\xec\x02\xbc\x02\xd5\xff\xec\x02\ +\xbc\x02\xe0\xff\xec\x02\xbc\x02\xf0\xff\xec\x02\xbc\x02\xf2\xff\ +\xec\x02\xbc\x02\xf4\xff\xec\x02\xbc\x02\xfe\xff\xec\x02\xbc\x03\ +\x0a\xff\xec\x02\xbc\x03\x0c\xff\xec\x02\xbc\x03\x0e\xff\xd7\x02\ +\xbc\x03\x10\xff\xd7\x02\xbc\x03\x16\xff\xec\x02\xbc\x03\x1a\xff\ +\xec\x02\xbd\x01\xa3\x00\xe1\x02\xbd\x02\xea\x00)\x02\xbd\x03\ +\x0e\xff\xd7\x02\xbd\x03\x10\xff\xd7\x02\xbe\x00\x05\xff\xec\x02\ +\xbe\x00\x0a\xff\xec\x02\xbe\x02\x07\xff\xec\x02\xbe\x02\x0b\xff\ +\xec\x02\xbf\x01\xa3\x00\xe1\x02\xbf\x02\xea\x00)\x02\xbf\x03\ +\x0e\xff\xd7\x02\xbf\x03\x10\xff\xd7\x02\xc0\x00\x05\xff\xec\x02\ +\xc0\x00\x0a\xff\xec\x02\xc0\x02\x07\xff\xec\x02\xc0\x02\x0b\xff\ +\xec\x02\xc3\x00\x05\xff\xc3\x02\xc3\x00\x0a\xff\xc3\x02\xc3\x01\ +\x9d\xff\xd7\x02\xc3\x01\xa6\xff\xd7\x02\xc3\x01\xbc\xff\x85\x02\ +\xc3\x01\xc1\xff\xae\x02\xc3\x01\xc4\xff\xd7\x02\xc3\x01\xdc\xff\ +\xd7\x02\xc3\x01\xdd\xff\xec\x02\xc3\x01\xe1\xff\xec\x02\xc3\x01\ +\xe4\xff\xd7\x02\xc3\x01\xf6\xff\xec\x02\xc3\x02\x07\xff\xc3\x02\ +\xc3\x02\x0b\xff\xc3\x02\xc3\x02|\xff\xae\x02\xc3\x02\x80\xff\ +\xc3\x02\xc3\x02\x82\xff\xc3\x02\xc3\x02\xa9\xff\xd7\x02\xc3\x02\ +\xaa\xff\xd7\x02\xc3\x02\xb5\xff\x85\x02\xc3\x02\xb6\xff\xd7\x02\ +\xc3\x02\xb7\xff\x9a\x02\xc3\x02\xb9\xff\x9a\x02\xc3\x02\xbd\xff\ +\xd7\x02\xc3\x02\xbe\xff\xd7\x02\xc3\x02\xbf\xff\xae\x02\xc3\x02\ +\xc0\xff\xec\x02\xc3\x02\xc1\xff\xae\x02\xc3\x02\xc2\xff\xec\x02\ +\xc3\x02\xd4\xff\xae\x02\xc3\x02\xd5\xff\xec\x02\xc3\x02\xf8\xff\ +\xec\x02\xc3\x02\xfa\xff\xec\x02\xc3\x02\xfc\xff\xec\x02\xc3\x02\ +\xfd\xff\xae\x02\xc3\x02\xfe\xff\xec\x02\xc3\x03\x0d\xff\xae\x02\ +\xc3\x03\x0e\xff\xd7\x02\xc3\x03\x0f\xff\xae\x02\xc3\x03\x10\xff\ +\xd7\x02\xc3\x03\x17\xff\xd7\x02\xc3\x03\x18\xff\xd7\x02\xc4\x00\ +\x05\xff\x9a\x02\xc4\x00\x0a\xff\x9a\x02\xc4\x01\xdc\xff\xd7\x02\ +\xc4\x01\xdd\xff\xd7\x02\xc4\x01\xe4\xff\xd7\x02\xc4\x01\xf6\xff\ +\xd7\x02\xc4\x02\x07\xff\x9a\x02\xc4\x02\x0b\xff\x9a\x02\xc4\x02\ +\xaa\xff\xd7\x02\xc4\x02\xb6\xff\xd7\x02\xc4\x02\xb8\xff\xd7\x02\ +\xc4\x02\xba\xff\xd7\x02\xc4\x02\xbe\xff\xd7\x02\xc4\x02\xf8\xff\ +\xd7\x02\xc4\x02\xfa\xff\xd7\x02\xc4\x02\xfc\xff\xd7\x02\xc4\x03\ +\x0e\xff\xae\x02\xc4\x03\x10\xff\xae\x02\xc4\x03\x18\xff\xd7\x02\ +\xc5\x01\xbc\xff\xd7\x02\xc5\x02\x80\xff\xec\x02\xc5\x02\x82\xff\ +\xec\x02\xc5\x02\xb5\xff\xd7\x02\xc5\x02\xb7\xff\xec\x02\xc5\x02\ +\xb9\xff\xec\x02\xc5\x03\x0d\xff\xec\x02\xc5\x03\x0f\xff\xec\x02\ +\xc6\x00\x05\xff\xec\x02\xc6\x00\x0a\xff\xec\x02\xc6\x02\x07\xff\ +\xec\x02\xc6\x02\x0b\xff\xec\x02\xc7\x01\xbc\xff\xd7\x02\xc7\x02\ +\x80\xff\xec\x02\xc7\x02\x82\xff\xec\x02\xc7\x02\xb5\xff\xd7\x02\ +\xc7\x02\xb7\xff\xec\x02\xc7\x02\xb9\xff\xec\x02\xc7\x03\x0d\xff\ +\xec\x02\xc7\x03\x0f\xff\xec\x02\xc8\x00\x05\xff\xec\x02\xc8\x00\ +\x0a\xff\xec\x02\xc8\x02\x07\xff\xec\x02\xc8\x02\x0b\xff\xec\x02\ +\xca\x01\x9f\xff\xd7\x02\xca\x01\xb8\xff\xd7\x02\xca\x01\xbb\xff\ +\xd7\x02\xca\x01\xbe\xff\xd7\x02\xca\x01\xc1\xff\xd7\x02\xca\x01\ +\xe1\xff\xd7\x02\xca\x02l\xff\xd7\x02\xca\x02|\xff\xd7\x02\ +\xca\x02~\xff\xd7\x02\xca\x02\x84\xff\xd7\x02\xca\x02\x86\xff\ +\xd7\x02\xca\x02\x88\xff\xd7\x02\xca\x02\x8a\xff\xd7\x02\xca\x02\ +\x8c\xff\xd7\x02\xca\x02\xb1\xff\xd7\x02\xca\x02\xb3\xff\xd7\x02\ +\xca\x02\xbf\xff\xd7\x02\xca\x02\xc0\xff\xd7\x02\xca\x02\xc1\xff\ +\xd7\x02\xca\x02\xc2\xff\xd7\x02\xca\x02\xc5\xff\x9a\x02\xca\x02\ +\xc7\xff\x9a\x02\xca\x02\xd4\xff\xd7\x02\xca\x02\xd5\xff\xd7\x02\ +\xca\x02\xef\xff\xd7\x02\xca\x02\xf1\xff\xd7\x02\xca\x02\xf3\xff\ +\xd7\x02\xca\x02\xfd\xff\xd7\x02\xca\x02\xfe\xff\xd7\x02\xca\x03\ +\x09\xff\xd7\x02\xca\x03\x0b\xff\xd7\x02\xca\x03\x0e\xff\xd7\x02\ +\xca\x03\x10\xff\xd7\x02\xca\x03\x15\xff\xd7\x02\xca\x03\x19\xff\ +\xec\x02\xcb\x01\xcf\xff\xd7\x02\xcb\x01\xd8\xff\xd7\x02\xcb\x01\ +\xdb\xff\xd7\x02\xcb\x01\xde\xff\xd7\x02\xcb\x01\xe1\xff\xd7\x02\ +\xcb\x01\xea\xff\xd7\x02\xcb\x01\xed\xff\xd7\x02\xcb\x02j\xff\ +\xd7\x02\xcb\x02\x7f\xff\xd7\x02\xcb\x02\x85\xff\xd7\x02\xcb\x02\ +\x87\xff\xd7\x02\xcb\x02\x89\xff\xd7\x02\xcb\x02\x8d\xff\xd7\x02\ +\xcb\x02\xb2\xff\xd7\x02\xcb\x02\xb4\xff\xd7\x02\xcb\x02\xc0\xff\ +\xd7\x02\xcb\x02\xc2\xff\xd7\x02\xcb\x02\xc6\xff\xd7\x02\xcb\x02\ +\xc8\xff\xd7\x02\xcb\x02\xd5\xff\xd7\x02\xcb\x02\xe0\xff\xd7\x02\ +\xcb\x02\xf0\xff\xd7\x02\xcb\x02\xf2\xff\xd7\x02\xcb\x02\xf4\xff\ +\xd7\x02\xcb\x02\xfe\xff\xd7\x02\xcb\x03\x0a\xff\xd7\x02\xcb\x03\ +\x0c\xff\xd7\x02\xcb\x03\x16\xff\xd7\x02\xcb\x03\x1a\xff\xd7\x02\ +\xcc\x00\x05\xff\xc3\x02\xcc\x00\x0a\xff\xc3\x02\xcc\x01\xa3\x00\ +f\x02\xcc\x01\xbc\xff\xd7\x02\xcc\x01\xbe\xff\xd7\x02\xcc\x01\ +\xc1\xff\xae\x02\xcc\x01\xdc\xff\xc3\x02\xcc\x01\xe1\xff\xd7\x02\ +\xcc\x01\xe4\xff\xc3\x02\xcc\x02\x07\xff\xc3\x02\xcc\x02\x0b\xff\ +\xc3\x02\xcc\x02m\xff\xec\x02\xcc\x02|\xff\xae\x02\xcc\x02\ +\x80\xff\xd7\x02\xcc\x02\x81\xff\xec\x02\xcc\x02\x82\xff\xd7\x02\ +\xcc\x02\x83\xff\xec\x02\xcc\x02\x8b\xff\xec\x02\xcc\x02\xaa\xff\ +\xc3\x02\xcc\x02\xb5\xff\xd7\x02\xcc\x02\xb6\xff\xc3\x02\xcc\x02\ +\xb7\xff\xd7\x02\xcc\x02\xb8\xff\xec\x02\xcc\x02\xb9\xff\xd7\x02\ +\xcc\x02\xba\xff\xec\x02\xcc\x02\xbe\xff\xc3\x02\xcc\x02\xbf\xff\ +\xae\x02\xcc\x02\xc0\xff\xd7\x02\xcc\x02\xc1\xff\xae\x02\xcc\x02\ +\xc2\xff\xd7\x02\xcc\x02\xc5\xff\xc3\x02\xcc\x02\xc6\xff\xd7\x02\ +\xcc\x02\xc7\xff\xc3\x02\xcc\x02\xc8\xff\xd7\x02\xcc\x02\xd4\xff\ +\xae\x02\xcc\x02\xd5\xff\xd7\x02\xcc\x02\xfd\xff\xae\x02\xcc\x02\ +\xfe\xff\xd7\x02\xcc\x03\x0d\xff\xd7\x02\xcc\x03\x0e\xff\xc3\x02\ +\xcc\x03\x0f\xff\xd7\x02\xcc\x03\x10\xff\xc3\x02\xcc\x03\x18\xff\ +\xc3\x02\xcd\x01\xe1\xff\xd7\x02\xcd\x02\xc0\xff\xd7\x02\xcd\x02\ +\xc2\xff\xd7\x02\xcd\x02\xd5\xff\xd7\x02\xcd\x02\xfe\xff\xd7\x02\ +\xce\x01\xa3\x00\xe1\x02\xce\x02\xea\x00)\x02\xce\x03\x0e\xff\ +\xd7\x02\xce\x03\x10\xff\xd7\x02\xcf\x00\x05\xff\xec\x02\xcf\x00\ +\x0a\xff\xec\x02\xcf\x02\x07\xff\xec\x02\xcf\x02\x0b\xff\xec\x02\ +\xd2\x01\xa3\x00\xe1\x02\xd2\x02\xea\x00)\x02\xd2\x03\x0e\xff\ +\xd7\x02\xd2\x03\x10\xff\xd7\x02\xd3\x00\x05\xff\xec\x02\xd3\x00\ +\x0a\xff\xec\x02\xd3\x02\x07\xff\xec\x02\xd3\x02\x0b\xff\xec\x02\ +\xd6\x01\xa3\x00\xe1\x02\xd6\x02\xea\x00)\x02\xd6\x03\x0e\xff\ +\xd7\x02\xd6\x03\x10\xff\xd7\x02\xd7\x00\x05\xff\xec\x02\xd7\x00\ +\x0a\xff\xec\x02\xd7\x02\x07\xff\xec\x02\xd7\x02\x0b\xff\xec\x02\ +\xd9\x00\x05\xffq\x02\xd9\x00\x0a\xffq\x02\xd9\x01\x9d\xff\ +\x9a\x02\xd9\x01\xa6\xff\x9a\x02\xd9\x01\xbc\xffq\x02\xd9\x01\ +\xbe\xff\xd7\x02\xd9\x01\xc1\xff\x9a\x02\xd9\x01\xc4\xff\x9a\x02\ +\xd9\x01\xdc\xff\xd7\x02\xd9\x01\xe1\xff\xd7\x02\xd9\x01\xe4\xff\ +\xd7\x02\xd9\x02\x07\xffq\x02\xd9\x02\x0b\xffq\x02\xd9\x02\ +n\xff\xd7\x02\xd9\x02|\xff\x9a\x02\xd9\x02\x80\xff\xae\x02\ +\xd9\x02\x82\xff\xae\x02\xd9\x02\x97\xff\xd7\x02\xd9\x02\x9b\xff\ +\xd7\x02\xd9\x02\xa7\xff\xd7\x02\xd9\x02\xa9\xff\x9a\x02\xd9\x02\ +\xaa\xff\xd7\x02\xd9\x02\xb5\xffq\x02\xd9\x02\xb6\xff\xd7\x02\ +\xd9\x02\xb7\xff\x85\x02\xd9\x02\xb9\xff\x85\x02\xd9\x02\xbd\xff\ +\x9a\x02\xd9\x02\xbe\xff\xd7\x02\xd9\x02\xbf\xff\x9a\x02\xd9\x02\ +\xc0\xff\xd7\x02\xd9\x02\xc1\xff\x9a\x02\xd9\x02\xc2\xff\xd7\x02\ +\xd9\x02\xc5\xff\x9a\x02\xd9\x02\xc7\xff\x9a\x02\xd9\x02\xd4\xff\ +\x9a\x02\xd9\x02\xd5\xff\xd7\x02\xd9\x02\xe1\xff\xd7\x02\xd9\x02\ +\xe3\xff\xd7\x02\xd9\x02\xfd\xff\x9a\x02\xd9\x02\xfe\xff\xd7\x02\ +\xd9\x03\x03\xff\xd7\x02\xd9\x03\x0d\xffq\x02\xd9\x03\x0e\xff\ +\xd7\x02\xd9\x03\x0f\xffq\x02\xd9\x03\x10\xff\xd7\x02\xd9\x03\ +\x17\xff\x9a\x02\xd9\x03\x18\xff\xd7\x02\xda\x00\x05\xff\xec\x02\ +\xda\x00\x0a\xff\xec\x02\xda\x02\x07\xff\xec\x02\xda\x02\x0b\xff\ +\xec\x02\xdb\x00\x05\xffq\x02\xdb\x00\x0a\xffq\x02\xdb\x01\ +\x9d\xff\x9a\x02\xdb\x01\xa6\xff\x9a\x02\xdb\x01\xbc\xffq\x02\ +\xdb\x01\xbe\xff\xd7\x02\xdb\x01\xc1\xff\x9a\x02\xdb\x01\xc4\xff\ +\x9a\x02\xdb\x01\xdc\xff\xd7\x02\xdb\x01\xe1\xff\xd7\x02\xdb\x01\ +\xe4\xff\xd7\x02\xdb\x02\x07\xffq\x02\xdb\x02\x0b\xffq\x02\ +\xdb\x02n\xff\xd7\x02\xdb\x02|\xff\x9a\x02\xdb\x02\x80\xff\ +\xae\x02\xdb\x02\x82\xff\xae\x02\xdb\x02\x97\xff\xd7\x02\xdb\x02\ +\x9b\xff\xd7\x02\xdb\x02\xa7\xff\xd7\x02\xdb\x02\xa9\xff\x9a\x02\ +\xdb\x02\xaa\xff\xd7\x02\xdb\x02\xb5\xffq\x02\xdb\x02\xb6\xff\ +\xd7\x02\xdb\x02\xb7\xff\x85\x02\xdb\x02\xb9\xff\x85\x02\xdb\x02\ +\xbd\xff\x9a\x02\xdb\x02\xbe\xff\xd7\x02\xdb\x02\xbf\xff\x9a\x02\ +\xdb\x02\xc0\xff\xd7\x02\xdb\x02\xc1\xff\x9a\x02\xdb\x02\xc2\xff\ +\xd7\x02\xdb\x02\xc5\xff\x9a\x02\xdb\x02\xc7\xff\x9a\x02\xdb\x02\ +\xd4\xff\x9a\x02\xdb\x02\xd5\xff\xd7\x02\xdb\x02\xe1\xff\xd7\x02\ +\xdb\x02\xe3\xff\xd7\x02\xdb\x02\xfd\xff\x9a\x02\xdb\x02\xfe\xff\ +\xd7\x02\xdb\x03\x03\xff\xd7\x02\xdb\x03\x0d\xffq\x02\xdb\x03\ +\x0e\xff\xd7\x02\xdb\x03\x0f\xffq\x02\xdb\x03\x10\xff\xd7\x02\ +\xdb\x03\x17\xff\x9a\x02\xdb\x03\x18\xff\xd7\x02\xdc\x00\x05\xff\ +\xec\x02\xdc\x00\x0a\xff\xec\x02\xdc\x02\x07\xff\xec\x02\xdc\x02\ +\x0b\xff\xec\x02\xde\x00\x05\xff\xec\x02\xde\x00\x0a\xff\xec\x02\ +\xde\x02\x07\xff\xec\x02\xde\x02\x0b\xff\xec\x02\xe0\x00\x05\xff\ +\xec\x02\xe0\x00\x0a\xff\xec\x02\xe0\x02\x07\xff\xec\x02\xe0\x02\ +\x0b\xff\xec\x02\xe1\x00\x0f\xff\xae\x02\xe1\x00\x11\xff\xae\x02\ +\xe1\x01\x9d\xff\xec\x02\xe1\x01\xa4\xff\xd7\x02\xe1\x01\xa6\xff\ +\xec\x02\xe1\x01\xa8\xff\xd7\x02\xe1\x01\xaa\xff\xd7\x02\xe1\x01\ +\xae\xff\xd7\x02\xe1\x01\xb0\xff\xd7\x02\xe1\x01\xb1\xff\xec\x02\ +\xe1\x01\xb5\xff\xd7\x02\xe1\x01\xbc\xff\xc3\x02\xe1\x01\xbd\xff\ +\xd7\x02\xe1\x01\xbf\xff\xd7\x02\xe1\x01\xc1\xff\xd7\x02\xe1\x01\ +\xc4\xff\xec\x02\xe1\x01\xc7\xff\xec\x02\xe1\x01\xce\xff\xec\x02\ +\xe1\x01\xd5\xff\xec\x02\xe1\x01\xf2\xff\xec\x02\xe1\x02\x08\xff\ +\xae\x02\xe1\x02\x0c\xff\xae\x02\xe1\x02r\xff\xd7\x02\xe1\x02\ +s\xff\xec\x02\xe1\x02z\xff\xec\x02\xe1\x02|\xff\xd7\x02\ +\xe1\x02\x80\xff\xec\x02\xe1\x02\x82\xff\xec\x02\xe1\x02\x9f\xff\ +\xd7\x02\xe1\x02\xa1\xff\xec\x02\xe1\x02\xa9\xff\xec\x02\xe1\x02\ +\xb5\xff\xc3\x02\xe1\x02\xb7\xff\xec\x02\xe1\x02\xb9\xff\xec\x02\ +\xe1\x02\xbb\xff\xd7\x02\xe1\x02\xbd\xff\xec\x02\xe1\x02\xbf\xff\ +\xd7\x02\xe1\x02\xc1\xff\xd7\x02\xe1\x02\xca\xff\xd7\x02\xe1\x02\ +\xce\xff\xd7\x02\xe1\x02\xcf\xff\xec\x02\xe1\x02\xd4\xff\xd7\x02\ +\xe1\x02\xd9\xff\xd7\x02\xe1\x02\xdb\xff\xd7\x02\xe1\x02\xdd\xff\ +\xd7\x02\xe1\x02\xe5\xff\xd7\x02\xe1\x02\xe7\xff\xec\x02\xe1\x02\ +\xf5\xff\xec\x02\xe1\x02\xf7\xff\xd7\x02\xe1\x02\xf9\xff\xd7\x02\ +\xe1\x02\xfb\xff\xd7\x02\xe1\x02\xfd\xff\xd7\x02\xe1\x03\x05\xff\ +\xd7\x02\xe1\x03\x07\xff\xd7\x02\xe1\x03\x0d\xff\xd7\x02\xe1\x03\ +\x0f\xff\xd7\x02\xe1\x03\x11\xff\xd7\x02\xe1\x03\x12\xff\xec\x02\ +\xe1\x03\x17\xff\xec\x02\xe1\x03\x1b\xff\xd7\x02\xe1\x03\x1c\xff\ +\xec\x02\xe2\x00\x05\xff\xec\x02\xe2\x00\x0a\xff\xec\x02\xe2\x01\ +\xd0\xff\xd7\x02\xe2\x01\xdc\xff\xec\x02\xe2\x01\xdd\xff\xec\x02\ +\xe2\x01\xdf\xff\xd7\x02\xe2\x01\xe1\xff\xec\x02\xe2\x01\xe4\xff\ +\xec\x02\xe2\x01\xf6\xff\xec\x02\xe2\x02\x07\xff\xec\x02\xe2\x02\ +\x0b\xff\xec\x02\xe2\x02\xa0\xff\xd7\x02\xe2\x02\xaa\xff\xec\x02\ +\xe2\x02\xb6\xff\xec\x02\xe2\x02\xbc\xff\xd7\x02\xe2\x02\xbe\xff\ +\xec\x02\xe2\x02\xc0\xff\xec\x02\xe2\x02\xc2\xff\xec\x02\xe2\x02\ +\xcb\xff\xd7\x02\xe2\x02\xd5\xff\xec\x02\xe2\x02\xe6\xff\xd7\x02\ +\xe2\x02\xf8\xff\xec\x02\xe2\x02\xfa\xff\xec\x02\xe2\x02\xfc\xff\ +\xec\x02\xe2\x02\xfe\xff\xec\x02\xe2\x03\x06\xff\xd7\x02\xe2\x03\ +\x08\xff\xd7\x02\xe2\x03\x0e\xff\xec\x02\xe2\x03\x10\xff\xec\x02\ +\xe2\x03\x18\xff\xec\x02\xe3\x00\x0f\xff\xae\x02\xe3\x00\x11\xff\ +\xae\x02\xe3\x01\x9d\xff\xec\x02\xe3\x01\xa4\xff\xd7\x02\xe3\x01\ +\xa6\xff\xec\x02\xe3\x01\xa8\xff\xd7\x02\xe3\x01\xaa\xff\xd7\x02\ +\xe3\x01\xae\xff\xd7\x02\xe3\x01\xb0\xff\xd7\x02\xe3\x01\xb1\xff\ +\xec\x02\xe3\x01\xb5\xff\xd7\x02\xe3\x01\xbc\xff\xc3\x02\xe3\x01\ +\xbd\xff\xd7\x02\xe3\x01\xbf\xff\xd7\x02\xe3\x01\xc1\xff\xd7\x02\ +\xe3\x01\xc4\xff\xec\x02\xe3\x01\xc7\xff\xec\x02\xe3\x01\xce\xff\ +\xec\x02\xe3\x01\xd5\xff\xec\x02\xe3\x01\xf2\xff\xec\x02\xe3\x02\ +\x08\xff\xae\x02\xe3\x02\x0c\xff\xae\x02\xe3\x02r\xff\xd7\x02\ +\xe3\x02s\xff\xec\x02\xe3\x02z\xff\xec\x02\xe3\x02|\xff\ +\xd7\x02\xe3\x02\x80\xff\xec\x02\xe3\x02\x82\xff\xec\x02\xe3\x02\ +\x9f\xff\xd7\x02\xe3\x02\xa1\xff\xec\x02\xe3\x02\xa9\xff\xec\x02\ +\xe3\x02\xb5\xff\xc3\x02\xe3\x02\xb7\xff\xec\x02\xe3\x02\xb9\xff\ +\xec\x02\xe3\x02\xbb\xff\xd7\x02\xe3\x02\xbd\xff\xec\x02\xe3\x02\ +\xbf\xff\xd7\x02\xe3\x02\xc1\xff\xd7\x02\xe3\x02\xca\xff\xd7\x02\ +\xe3\x02\xce\xff\xd7\x02\xe3\x02\xcf\xff\xec\x02\xe3\x02\xd4\xff\ +\xd7\x02\xe3\x02\xd9\xff\xd7\x02\xe3\x02\xdb\xff\xd7\x02\xe3\x02\ +\xdd\xff\xd7\x02\xe3\x02\xe5\xff\xd7\x02\xe3\x02\xe7\xff\xec\x02\ +\xe3\x02\xf5\xff\xec\x02\xe3\x02\xf7\xff\xd7\x02\xe3\x02\xf9\xff\ +\xd7\x02\xe3\x02\xfb\xff\xd7\x02\xe3\x02\xfd\xff\xd7\x02\xe3\x03\ +\x05\xff\xd7\x02\xe3\x03\x07\xff\xd7\x02\xe3\x03\x0d\xff\xd7\x02\ +\xe3\x03\x0f\xff\xd7\x02\xe3\x03\x11\xff\xd7\x02\xe3\x03\x12\xff\ +\xec\x02\xe3\x03\x17\xff\xec\x02\xe3\x03\x1b\xff\xd7\x02\xe3\x03\ +\x1c\xff\xec\x02\xe4\x00\x05\xff\xec\x02\xe4\x00\x0a\xff\xec\x02\ +\xe4\x01\xd0\xff\xd7\x02\xe4\x01\xdc\xff\xec\x02\xe4\x01\xdd\xff\ +\xec\x02\xe4\x01\xdf\xff\xd7\x02\xe4\x01\xe1\xff\xec\x02\xe4\x01\ +\xe4\xff\xec\x02\xe4\x01\xf6\xff\xec\x02\xe4\x02\x07\xff\xec\x02\ +\xe4\x02\x0b\xff\xec\x02\xe4\x02\xa0\xff\xd7\x02\xe4\x02\xaa\xff\ +\xec\x02\xe4\x02\xb6\xff\xec\x02\xe4\x02\xbc\xff\xd7\x02\xe4\x02\ +\xbe\xff\xec\x02\xe4\x02\xc0\xff\xec\x02\xe4\x02\xc2\xff\xec\x02\ +\xe4\x02\xcb\xff\xd7\x02\xe4\x02\xd5\xff\xec\x02\xe4\x02\xe6\xff\ +\xd7\x02\xe4\x02\xf8\xff\xec\x02\xe4\x02\xfa\xff\xec\x02\xe4\x02\ +\xfc\xff\xec\x02\xe4\x02\xfe\xff\xec\x02\xe4\x03\x06\xff\xd7\x02\ +\xe4\x03\x08\xff\xd7\x02\xe4\x03\x0e\xff\xec\x02\xe4\x03\x10\xff\ +\xec\x02\xe4\x03\x18\xff\xec\x02\xe5\x01\x9f\xff\xd7\x02\xe5\x01\ +\xb8\xff\xd7\x02\xe5\x01\xbb\xff\xd7\x02\xe5\x01\xbe\xff\xd7\x02\ +\xe5\x01\xc1\xff\xd7\x02\xe5\x01\xe1\xff\xd7\x02\xe5\x02l\xff\ +\xd7\x02\xe5\x02|\xff\xd7\x02\xe5\x02~\xff\xd7\x02\xe5\x02\ +\x84\xff\xd7\x02\xe5\x02\x86\xff\xd7\x02\xe5\x02\x88\xff\xd7\x02\ +\xe5\x02\x8a\xff\xd7\x02\xe5\x02\x8c\xff\xd7\x02\xe5\x02\xb1\xff\ +\xd7\x02\xe5\x02\xb3\xff\xd7\x02\xe5\x02\xbf\xff\xd7\x02\xe5\x02\ +\xc0\xff\xd7\x02\xe5\x02\xc1\xff\xd7\x02\xe5\x02\xc2\xff\xd7\x02\ +\xe5\x02\xc5\xff\x9a\x02\xe5\x02\xc7\xff\x9a\x02\xe5\x02\xd4\xff\ +\xd7\x02\xe5\x02\xd5\xff\xd7\x02\xe5\x02\xef\xff\xd7\x02\xe5\x02\ +\xf1\xff\xd7\x02\xe5\x02\xf3\xff\xd7\x02\xe5\x02\xfd\xff\xd7\x02\ +\xe5\x02\xfe\xff\xd7\x02\xe5\x03\x09\xff\xd7\x02\xe5\x03\x0b\xff\ +\xd7\x02\xe5\x03\x0e\xff\xd7\x02\xe5\x03\x10\xff\xd7\x02\xe5\x03\ +\x15\xff\xd7\x02\xe5\x03\x19\xff\xec\x02\xe6\x01\xcf\xff\xd7\x02\ +\xe6\x01\xd8\xff\xd7\x02\xe6\x01\xdb\xff\xd7\x02\xe6\x01\xde\xff\ +\xd7\x02\xe6\x01\xe1\xff\xd7\x02\xe6\x01\xea\xff\xd7\x02\xe6\x01\ +\xed\xff\xd7\x02\xe6\x02j\xff\xd7\x02\xe6\x02\x7f\xff\xd7\x02\ +\xe6\x02\x85\xff\xd7\x02\xe6\x02\x87\xff\xd7\x02\xe6\x02\x89\xff\ +\xd7\x02\xe6\x02\x8d\xff\xd7\x02\xe6\x02\xb2\xff\xd7\x02\xe6\x02\ +\xb4\xff\xd7\x02\xe6\x02\xc0\xff\xd7\x02\xe6\x02\xc2\xff\xd7\x02\ +\xe6\x02\xc6\xff\xd7\x02\xe6\x02\xc8\xff\xd7\x02\xe6\x02\xd5\xff\ +\xd7\x02\xe6\x02\xe0\xff\xd7\x02\xe6\x02\xf0\xff\xd7\x02\xe6\x02\ +\xf2\xff\xd7\x02\xe6\x02\xf4\xff\xd7\x02\xe6\x02\xfe\xff\xd7\x02\ +\xe6\x03\x0a\xff\xd7\x02\xe6\x03\x0c\xff\xd7\x02\xe6\x03\x16\xff\ +\xd7\x02\xe6\x03\x1a\xff\xd7\x02\xe7\x00\x0f\xff\xae\x02\xe7\x00\ +\x11\xff\xae\x02\xe7\x02\x08\xff\xae\x02\xe7\x02\x0c\xff\xae\x02\ +\xe7\x02\x80\xff\xec\x02\xe7\x02\x82\xff\xec\x02\xe7\x02\xb7\xff\ +\xec\x02\xe7\x02\xb9\xff\xec\x02\xe7\x03\x0d\xff\xd7\x02\xe7\x03\ +\x0f\xff\xd7\x02\xe8\x01\xe9\x00)\x02\xe9\x00\x05\xff\xec\x02\ +\xe9\x00\x0a\xff\xec\x02\xe9\x02\x07\xff\xec\x02\xe9\x02\x0b\xff\ +\xec\x02\xe9\x03\x0e\xff\xd7\x02\xe9\x03\x10\xff\xd7\x02\xef\x00\ +\x0f\xff\xae\x02\xef\x00\x11\xff\xae\x02\xef\x01\x9d\xff\xec\x02\ +\xef\x01\xa4\xff\xd7\x02\xef\x01\xa6\xff\xec\x02\xef\x01\xa8\xff\ +\xd7\x02\xef\x01\xaa\xff\xd7\x02\xef\x01\xae\xff\xd7\x02\xef\x01\ +\xb0\xff\xd7\x02\xef\x01\xb1\xff\xec\x02\xef\x01\xb5\xff\xd7\x02\ +\xef\x01\xbc\xff\xc3\x02\xef\x01\xbd\xff\xd7\x02\xef\x01\xbf\xff\ +\xd7\x02\xef\x01\xc1\xff\xd7\x02\xef\x01\xc4\xff\xec\x02\xef\x01\ +\xc7\xff\xec\x02\xef\x01\xce\xff\xec\x02\xef\x01\xd5\xff\xec\x02\ +\xef\x01\xf2\xff\xec\x02\xef\x02\x08\xff\xae\x02\xef\x02\x0c\xff\ +\xae\x02\xef\x02r\xff\xd7\x02\xef\x02s\xff\xec\x02\xef\x02\ +z\xff\xec\x02\xef\x02|\xff\xd7\x02\xef\x02\x80\xff\xec\x02\ +\xef\x02\x82\xff\xec\x02\xef\x02\x9f\xff\xd7\x02\xef\x02\xa1\xff\ +\xec\x02\xef\x02\xa9\xff\xec\x02\xef\x02\xb5\xff\xc3\x02\xef\x02\ +\xb7\xff\xec\x02\xef\x02\xb9\xff\xec\x02\xef\x02\xbb\xff\xd7\x02\ +\xef\x02\xbd\xff\xec\x02\xef\x02\xbf\xff\xd7\x02\xef\x02\xc1\xff\ +\xd7\x02\xef\x02\xca\xff\xd7\x02\xef\x02\xce\xff\xd7\x02\xef\x02\ +\xcf\xff\xec\x02\xef\x02\xd4\xff\xd7\x02\xef\x02\xd9\xff\xd7\x02\ +\xef\x02\xdb\xff\xd7\x02\xef\x02\xdd\xff\xd7\x02\xef\x02\xe5\xff\ +\xd7\x02\xef\x02\xe7\xff\xec\x02\xef\x02\xf5\xff\xec\x02\xef\x02\ +\xf7\xff\xd7\x02\xef\x02\xf9\xff\xd7\x02\xef\x02\xfb\xff\xd7\x02\ +\xef\x02\xfd\xff\xd7\x02\xef\x03\x05\xff\xd7\x02\xef\x03\x07\xff\ +\xd7\x02\xef\x03\x0d\xff\xd7\x02\xef\x03\x0f\xff\xd7\x02\xef\x03\ +\x11\xff\xd7\x02\xef\x03\x12\xff\xec\x02\xef\x03\x17\xff\xec\x02\ +\xef\x03\x1b\xff\xd7\x02\xef\x03\x1c\xff\xec\x02\xf0\x00\x05\xff\ +\xec\x02\xf0\x00\x0a\xff\xec\x02\xf0\x01\xd0\xff\xd7\x02\xf0\x01\ +\xdc\xff\xec\x02\xf0\x01\xdd\xff\xec\x02\xf0\x01\xdf\xff\xd7\x02\ +\xf0\x01\xe1\xff\xec\x02\xf0\x01\xe4\xff\xec\x02\xf0\x01\xf6\xff\ +\xec\x02\xf0\x02\x07\xff\xec\x02\xf0\x02\x0b\xff\xec\x02\xf0\x02\ +\xa0\xff\xd7\x02\xf0\x02\xaa\xff\xec\x02\xf0\x02\xb6\xff\xec\x02\ +\xf0\x02\xbc\xff\xd7\x02\xf0\x02\xbe\xff\xec\x02\xf0\x02\xc0\xff\ +\xec\x02\xf0\x02\xc2\xff\xec\x02\xf0\x02\xcb\xff\xd7\x02\xf0\x02\ +\xd5\xff\xec\x02\xf0\x02\xe6\xff\xd7\x02\xf0\x02\xf8\xff\xec\x02\ +\xf0\x02\xfa\xff\xec\x02\xf0\x02\xfc\xff\xec\x02\xf0\x02\xfe\xff\ +\xec\x02\xf0\x03\x06\xff\xd7\x02\xf0\x03\x08\xff\xd7\x02\xf0\x03\ +\x0e\xff\xec\x02\xf0\x03\x10\xff\xec\x02\xf0\x03\x18\xff\xec\x02\ +\xf1\x00\x0f\xff\xae\x02\xf1\x00\x11\xff\xae\x02\xf1\x01\x9d\xff\ +\xec\x02\xf1\x01\xa4\xff\xd7\x02\xf1\x01\xa6\xff\xec\x02\xf1\x01\ +\xa8\xff\xd7\x02\xf1\x01\xaa\xff\xd7\x02\xf1\x01\xae\xff\xd7\x02\ +\xf1\x01\xb0\xff\xd7\x02\xf1\x01\xb1\xff\xec\x02\xf1\x01\xb5\xff\ +\xd7\x02\xf1\x01\xbc\xff\xc3\x02\xf1\x01\xbd\xff\xd7\x02\xf1\x01\ +\xbf\xff\xd7\x02\xf1\x01\xc1\xff\xd7\x02\xf1\x01\xc4\xff\xec\x02\ +\xf1\x01\xc7\xff\xec\x02\xf1\x01\xce\xff\xec\x02\xf1\x01\xd5\xff\ +\xec\x02\xf1\x01\xf2\xff\xec\x02\xf1\x02\x08\xff\xae\x02\xf1\x02\ +\x0c\xff\xae\x02\xf1\x02r\xff\xd7\x02\xf1\x02s\xff\xec\x02\ +\xf1\x02z\xff\xec\x02\xf1\x02|\xff\xd7\x02\xf1\x02\x80\xff\ +\xec\x02\xf1\x02\x82\xff\xec\x02\xf1\x02\x9f\xff\xd7\x02\xf1\x02\ +\xa1\xff\xec\x02\xf1\x02\xa9\xff\xec\x02\xf1\x02\xb5\xff\xc3\x02\ +\xf1\x02\xb7\xff\xec\x02\xf1\x02\xb9\xff\xec\x02\xf1\x02\xbb\xff\ +\xd7\x02\xf1\x02\xbd\xff\xec\x02\xf1\x02\xbf\xff\xd7\x02\xf1\x02\ +\xc1\xff\xd7\x02\xf1\x02\xca\xff\xd7\x02\xf1\x02\xce\xff\xd7\x02\ +\xf1\x02\xcf\xff\xec\x02\xf1\x02\xd4\xff\xd7\x02\xf1\x02\xd9\xff\ +\xd7\x02\xf1\x02\xdb\xff\xd7\x02\xf1\x02\xdd\xff\xd7\x02\xf1\x02\ +\xe5\xff\xd7\x02\xf1\x02\xe7\xff\xec\x02\xf1\x02\xf5\xff\xec\x02\ +\xf1\x02\xf7\xff\xd7\x02\xf1\x02\xf9\xff\xd7\x02\xf1\x02\xfb\xff\ +\xd7\x02\xf1\x02\xfd\xff\xd7\x02\xf1\x03\x05\xff\xd7\x02\xf1\x03\ +\x07\xff\xd7\x02\xf1\x03\x0d\xff\xd7\x02\xf1\x03\x0f\xff\xd7\x02\ +\xf1\x03\x11\xff\xd7\x02\xf1\x03\x12\xff\xec\x02\xf1\x03\x17\xff\ +\xec\x02\xf1\x03\x1b\xff\xd7\x02\xf1\x03\x1c\xff\xec\x02\xf2\x00\ +\x05\xff\xec\x02\xf2\x00\x0a\xff\xec\x02\xf2\x01\xd0\xff\xd7\x02\ +\xf2\x01\xdc\xff\xec\x02\xf2\x01\xdd\xff\xec\x02\xf2\x01\xdf\xff\ +\xd7\x02\xf2\x01\xe1\xff\xec\x02\xf2\x01\xe4\xff\xec\x02\xf2\x01\ +\xf6\xff\xec\x02\xf2\x02\x07\xff\xec\x02\xf2\x02\x0b\xff\xec\x02\ +\xf2\x02\xa0\xff\xd7\x02\xf2\x02\xaa\xff\xec\x02\xf2\x02\xb6\xff\ +\xec\x02\xf2\x02\xbc\xff\xd7\x02\xf2\x02\xbe\xff\xec\x02\xf2\x02\ +\xc0\xff\xec\x02\xf2\x02\xc2\xff\xec\x02\xf2\x02\xcb\xff\xd7\x02\ +\xf2\x02\xd5\xff\xec\x02\xf2\x02\xe6\xff\xd7\x02\xf2\x02\xf8\xff\ +\xec\x02\xf2\x02\xfa\xff\xec\x02\xf2\x02\xfc\xff\xec\x02\xf2\x02\ +\xfe\xff\xec\x02\xf2\x03\x06\xff\xd7\x02\xf2\x03\x08\xff\xd7\x02\ +\xf2\x03\x0e\xff\xec\x02\xf2\x03\x10\xff\xec\x02\xf2\x03\x18\xff\ +\xec\x02\xf3\x00\x0f\xff\xae\x02\xf3\x00\x11\xff\xae\x02\xf3\x01\ +\x9d\xff\xec\x02\xf3\x01\xa4\xff\xd7\x02\xf3\x01\xa6\xff\xec\x02\ +\xf3\x01\xa8\xff\xd7\x02\xf3\x01\xaa\xff\xd7\x02\xf3\x01\xae\xff\ +\xd7\x02\xf3\x01\xb0\xff\xd7\x02\xf3\x01\xb1\xff\xec\x02\xf3\x01\ +\xb5\xff\xd7\x02\xf3\x01\xbc\xff\xc3\x02\xf3\x01\xbd\xff\xd7\x02\ +\xf3\x01\xbf\xff\xd7\x02\xf3\x01\xc1\xff\xd7\x02\xf3\x01\xc4\xff\ +\xec\x02\xf3\x01\xc7\xff\xec\x02\xf3\x01\xce\xff\xec\x02\xf3\x01\ +\xd5\xff\xec\x02\xf3\x01\xf2\xff\xec\x02\xf3\x02\x08\xff\xae\x02\ +\xf3\x02\x0c\xff\xae\x02\xf3\x02r\xff\xd7\x02\xf3\x02s\xff\ +\xec\x02\xf3\x02z\xff\xec\x02\xf3\x02|\xff\xd7\x02\xf3\x02\ +\x80\xff\xec\x02\xf3\x02\x82\xff\xec\x02\xf3\x02\x9f\xff\xd7\x02\ +\xf3\x02\xa1\xff\xec\x02\xf3\x02\xa9\xff\xec\x02\xf3\x02\xb5\xff\ +\xc3\x02\xf3\x02\xb7\xff\xec\x02\xf3\x02\xb9\xff\xec\x02\xf3\x02\ +\xbb\xff\xd7\x02\xf3\x02\xbd\xff\xec\x02\xf3\x02\xbf\xff\xd7\x02\ +\xf3\x02\xc1\xff\xd7\x02\xf3\x02\xca\xff\xd7\x02\xf3\x02\xce\xff\ +\xd7\x02\xf3\x02\xcf\xff\xec\x02\xf3\x02\xd4\xff\xd7\x02\xf3\x02\ +\xd9\xff\xd7\x02\xf3\x02\xdb\xff\xd7\x02\xf3\x02\xdd\xff\xd7\x02\ +\xf3\x02\xe5\xff\xd7\x02\xf3\x02\xe7\xff\xec\x02\xf3\x02\xf5\xff\ +\xec\x02\xf3\x02\xf7\xff\xd7\x02\xf3\x02\xf9\xff\xd7\x02\xf3\x02\ +\xfb\xff\xd7\x02\xf3\x02\xfd\xff\xd7\x02\xf3\x03\x05\xff\xd7\x02\ +\xf3\x03\x07\xff\xd7\x02\xf3\x03\x0d\xff\xd7\x02\xf3\x03\x0f\xff\ +\xd7\x02\xf3\x03\x11\xff\xd7\x02\xf3\x03\x12\xff\xec\x02\xf3\x03\ +\x17\xff\xec\x02\xf3\x03\x1b\xff\xd7\x02\xf3\x03\x1c\xff\xec\x02\ +\xf4\x00\x05\xff\xec\x02\xf4\x00\x0a\xff\xec\x02\xf4\x01\xd0\xff\ +\xd7\x02\xf4\x01\xdc\xff\xec\x02\xf4\x01\xdd\xff\xec\x02\xf4\x01\ +\xdf\xff\xd7\x02\xf4\x01\xe1\xff\xec\x02\xf4\x01\xe4\xff\xec\x02\ +\xf4\x01\xf6\xff\xec\x02\xf4\x02\x07\xff\xec\x02\xf4\x02\x0b\xff\ +\xec\x02\xf4\x02\xa0\xff\xd7\x02\xf4\x02\xaa\xff\xec\x02\xf4\x02\ +\xb6\xff\xec\x02\xf4\x02\xbc\xff\xd7\x02\xf4\x02\xbe\xff\xec\x02\ +\xf4\x02\xc0\xff\xec\x02\xf4\x02\xc2\xff\xec\x02\xf4\x02\xcb\xff\ +\xd7\x02\xf4\x02\xd5\xff\xec\x02\xf4\x02\xe6\xff\xd7\x02\xf4\x02\ +\xf8\xff\xec\x02\xf4\x02\xfa\xff\xec\x02\xf4\x02\xfc\xff\xec\x02\ +\xf4\x02\xfe\xff\xec\x02\xf4\x03\x06\xff\xd7\x02\xf4\x03\x08\xff\ +\xd7\x02\xf4\x03\x0e\xff\xec\x02\xf4\x03\x10\xff\xec\x02\xf4\x03\ +\x18\xff\xec\x02\xf5\x00\x0f\xff\xae\x02\xf5\x00\x11\xff\xae\x02\ +\xf5\x01\x9d\xff\xec\x02\xf5\x01\xa4\xff\xd7\x02\xf5\x01\xa6\xff\ +\xec\x02\xf5\x01\xa8\xff\xd7\x02\xf5\x01\xaa\xff\xd7\x02\xf5\x01\ +\xae\xff\xd7\x02\xf5\x01\xb0\xff\xd7\x02\xf5\x01\xb1\xff\xec\x02\ +\xf5\x01\xb5\xff\xd7\x02\xf5\x01\xbc\xff\xc3\x02\xf5\x01\xbd\xff\ +\xd7\x02\xf5\x01\xbf\xff\xd7\x02\xf5\x01\xc1\xff\xd7\x02\xf5\x01\ +\xc4\xff\xec\x02\xf5\x01\xc7\xff\xec\x02\xf5\x01\xce\xff\xec\x02\ +\xf5\x01\xd5\xff\xec\x02\xf5\x01\xf2\xff\xec\x02\xf5\x02\x08\xff\ +\xae\x02\xf5\x02\x0c\xff\xae\x02\xf5\x02r\xff\xd7\x02\xf5\x02\ +s\xff\xec\x02\xf5\x02z\xff\xec\x02\xf5\x02|\xff\xd7\x02\ +\xf5\x02\x80\xff\xec\x02\xf5\x02\x82\xff\xec\x02\xf5\x02\x9f\xff\ +\xd7\x02\xf5\x02\xa1\xff\xec\x02\xf5\x02\xa9\xff\xec\x02\xf5\x02\ +\xb5\xff\xc3\x02\xf5\x02\xb7\xff\xec\x02\xf5\x02\xb9\xff\xec\x02\ +\xf5\x02\xbb\xff\xd7\x02\xf5\x02\xbd\xff\xec\x02\xf5\x02\xbf\xff\ +\xd7\x02\xf5\x02\xc1\xff\xd7\x02\xf5\x02\xca\xff\xd7\x02\xf5\x02\ +\xce\xff\xd7\x02\xf5\x02\xcf\xff\xec\x02\xf5\x02\xd4\xff\xd7\x02\ +\xf5\x02\xd9\xff\xd7\x02\xf5\x02\xdb\xff\xd7\x02\xf5\x02\xdd\xff\ +\xd7\x02\xf5\x02\xe5\xff\xd7\x02\xf5\x02\xe7\xff\xec\x02\xf5\x02\ +\xf5\xff\xec\x02\xf5\x02\xf7\xff\xd7\x02\xf5\x02\xf9\xff\xd7\x02\ +\xf5\x02\xfb\xff\xd7\x02\xf5\x02\xfd\xff\xd7\x02\xf5\x03\x05\xff\ +\xd7\x02\xf5\x03\x07\xff\xd7\x02\xf5\x03\x0d\xff\xd7\x02\xf5\x03\ +\x0f\xff\xd7\x02\xf5\x03\x11\xff\xd7\x02\xf5\x03\x12\xff\xec\x02\ +\xf5\x03\x17\xff\xec\x02\xf5\x03\x1b\xff\xd7\x02\xf5\x03\x1c\xff\ +\xec\x02\xf6\x00\x05\xff\xec\x02\xf6\x00\x0a\xff\xec\x02\xf6\x01\ +\xd0\xff\xd7\x02\xf6\x01\xdc\xff\xec\x02\xf6\x01\xdd\xff\xec\x02\ +\xf6\x01\xdf\xff\xd7\x02\xf6\x01\xe1\xff\xec\x02\xf6\x01\xe4\xff\ +\xec\x02\xf6\x01\xf6\xff\xec\x02\xf6\x02\x07\xff\xec\x02\xf6\x02\ +\x0b\xff\xec\x02\xf6\x02\xa0\xff\xd7\x02\xf6\x02\xaa\xff\xec\x02\ +\xf6\x02\xb6\xff\xec\x02\xf6\x02\xbc\xff\xd7\x02\xf6\x02\xbe\xff\ +\xec\x02\xf6\x02\xc0\xff\xec\x02\xf6\x02\xc2\xff\xec\x02\xf6\x02\ +\xcb\xff\xd7\x02\xf6\x02\xd5\xff\xec\x02\xf6\x02\xe6\xff\xd7\x02\ +\xf6\x02\xf8\xff\xec\x02\xf6\x02\xfa\xff\xec\x02\xf6\x02\xfc\xff\ +\xec\x02\xf6\x02\xfe\xff\xec\x02\xf6\x03\x06\xff\xd7\x02\xf6\x03\ +\x08\xff\xd7\x02\xf6\x03\x0e\xff\xec\x02\xf6\x03\x10\xff\xec\x02\ +\xf6\x03\x18\xff\xec\x02\xf7\x00\x0f\xff\x85\x02\xf7\x00\x11\xff\ +\x85\x02\xf7\x01\x9f\xff\xec\x02\xf7\x01\xa4\xff\x9a\x02\xf7\x01\ +\xaa\xffq\x02\xf7\x01\xae\xff\x9a\x02\xf7\x01\xb5\xff\x9a\x02\ +\xf7\x01\xb8\xff\xec\x02\xf7\x01\xbb\xff\xec\x02\xf7\x01\xbe\xff\ +\xc3\x02\xf7\x01\xc9\xff\xec\x02\xf7\x01\xce\xff\xae\x02\xf7\x01\ +\xcf\xff\xd7\x02\xf7\x01\xd5\xff\xae\x02\xf7\x01\xd8\xff\xd7\x02\ +\xf7\x01\xdb\xff\xd7\x02\xf7\x01\xde\xff\xd7\x02\xf7\x01\xe1\xff\ +\xd7\x02\xf7\x01\xea\xff\xd7\x02\xf7\x01\xeb\x00f\x02\xf7\x01\ +\xed\xff\xd7\x02\xf7\x01\xee\xff\xec\x02\xf7\x01\xf2\xff\xae\x02\ +\xf7\x01\xf4\x00f\x02\xf7\x02\x08\xff\x85\x02\xf7\x02\x0c\xff\ +\x85\x02\xf7\x02j\xff\xd7\x02\xf7\x02l\xff\xec\x02\xf7\x02\ +r\xffq\x02\xf7\x02s\xff\xae\x02\xf7\x02~\xff\xec\x02\ +\xf7\x02\x7f\xff\xd7\x02\xf7\x02\x84\xff\xec\x02\xf7\x02\x85\xff\ +\xd7\x02\xf7\x02\x86\xff\xec\x02\xf7\x02\x87\xff\xd7\x02\xf7\x02\ +\x88\xff\xec\x02\xf7\x02\x89\xff\xd7\x02\xf7\x02\x8a\xff\xec\x02\ +\xf7\x02\x8c\xff\xec\x02\xf7\x02\x8d\xff\xd7\x02\xf7\x02\x98\x00\ +f\x02\xf7\x02\xa8\x00f\x02\xf7\x02\xb1\xff\xec\x02\xf7\x02\ +\xb2\xff\xd7\x02\xf7\x02\xb3\xff\xec\x02\xf7\x02\xb4\xff\xd7\x02\ +\xf7\x02\xc0\xff\xd7\x02\xf7\x02\xc2\xff\xd7\x02\xf7\x02\xc5\xff\ +\xd7\x02\xf7\x02\xc6\xff\xc3\x02\xf7\x02\xc7\xff\xd7\x02\xf7\x02\ +\xc8\xff\xc3\x02\xf7\x02\xce\xff\x9a\x02\xf7\x02\xcf\xff\xae\x02\ +\xf7\x02\xd5\xff\xd7\x02\xf7\x02\xd9\xffq\x02\xf7\x02\xdb\xff\ +q\x02\xf7\x02\xdd\xffq\x02\xf7\x02\xe0\xff\xd7\x02\xf7\x02\ +\xef\xff\xec\x02\xf7\x02\xf0\xff\xd7\x02\xf7\x02\xf1\xff\xec\x02\ +\xf7\x02\xf2\xff\xd7\x02\xf7\x02\xf3\xff\xec\x02\xf7\x02\xf4\xff\ +\xd7\x02\xf7\x02\xfe\xff\xd7\x02\xf7\x03\x09\xffq\x02\xf7\x03\ +\x0a\xff\xd7\x02\xf7\x03\x0b\xffq\x02\xf7\x03\x0c\xff\xd7\x02\ +\xf7\x03\x11\xff\x9a\x02\xf7\x03\x12\xff\xae\x02\xf7\x03\x15\xff\ +\xec\x02\xf7\x03\x16\xff\xd7\x02\xf7\x03\x1a\xff\xd7\x02\xf7\x03\ +\x1b\xff\x9a\x02\xf7\x03\x1c\xff\xae\x02\xf8\x00\x0f\xff\xae\x02\ +\xf8\x00\x11\xff\xae\x02\xf8\x01\xce\xff\xd7\x02\xf8\x01\xd5\xff\ +\xd7\x02\xf8\x01\xf2\xff\xd7\x02\xf8\x02\x08\xff\xae\x02\xf8\x02\ +\x0c\xff\xae\x02\xf8\x02s\xff\xd7\x02\xf8\x02\xcf\xff\xd7\x02\ +\xf8\x03\x12\xff\xd7\x02\xf8\x03\x1c\xff\xd7\x02\xf9\x00\x0f\xff\ +\x85\x02\xf9\x00\x11\xff\x85\x02\xf9\x01\x9f\xff\xec\x02\xf9\x01\ +\xa4\xff\x9a\x02\xf9\x01\xaa\xffq\x02\xf9\x01\xae\xff\x9a\x02\ +\xf9\x01\xb5\xff\x9a\x02\xf9\x01\xb8\xff\xec\x02\xf9\x01\xbb\xff\ +\xec\x02\xf9\x01\xbe\xff\xc3\x02\xf9\x01\xc9\xff\xec\x02\xf9\x01\ +\xce\xff\xae\x02\xf9\x01\xcf\xff\xd7\x02\xf9\x01\xd5\xff\xae\x02\ +\xf9\x01\xd8\xff\xd7\x02\xf9\x01\xdb\xff\xd7\x02\xf9\x01\xde\xff\ +\xd7\x02\xf9\x01\xe1\xff\xd7\x02\xf9\x01\xea\xff\xd7\x02\xf9\x01\ +\xeb\x00f\x02\xf9\x01\xed\xff\xd7\x02\xf9\x01\xee\xff\xec\x02\ +\xf9\x01\xf2\xff\xae\x02\xf9\x01\xf4\x00f\x02\xf9\x02\x08\xff\ +\x85\x02\xf9\x02\x0c\xff\x85\x02\xf9\x02j\xff\xd7\x02\xf9\x02\ +l\xff\xec\x02\xf9\x02r\xffq\x02\xf9\x02s\xff\xae\x02\ +\xf9\x02~\xff\xec\x02\xf9\x02\x7f\xff\xd7\x02\xf9\x02\x84\xff\ +\xec\x02\xf9\x02\x85\xff\xd7\x02\xf9\x02\x86\xff\xec\x02\xf9\x02\ +\x87\xff\xd7\x02\xf9\x02\x88\xff\xec\x02\xf9\x02\x89\xff\xd7\x02\ +\xf9\x02\x8a\xff\xec\x02\xf9\x02\x8c\xff\xec\x02\xf9\x02\x8d\xff\ +\xd7\x02\xf9\x02\x98\x00f\x02\xf9\x02\xa8\x00f\x02\xf9\x02\ +\xb1\xff\xec\x02\xf9\x02\xb2\xff\xd7\x02\xf9\x02\xb3\xff\xec\x02\ +\xf9\x02\xb4\xff\xd7\x02\xf9\x02\xc0\xff\xd7\x02\xf9\x02\xc2\xff\ +\xd7\x02\xf9\x02\xc5\xff\xd7\x02\xf9\x02\xc6\xff\xc3\x02\xf9\x02\ +\xc7\xff\xd7\x02\xf9\x02\xc8\xff\xc3\x02\xf9\x02\xce\xff\x9a\x02\ +\xf9\x02\xcf\xff\xae\x02\xf9\x02\xd5\xff\xd7\x02\xf9\x02\xd9\xff\ +q\x02\xf9\x02\xdb\xffq\x02\xf9\x02\xdd\xffq\x02\xf9\x02\ +\xe0\xff\xd7\x02\xf9\x02\xef\xff\xec\x02\xf9\x02\xf0\xff\xd7\x02\ +\xf9\x02\xf1\xff\xec\x02\xf9\x02\xf2\xff\xd7\x02\xf9\x02\xf3\xff\ +\xec\x02\xf9\x02\xf4\xff\xd7\x02\xf9\x02\xfe\xff\xd7\x02\xf9\x03\ +\x09\xffq\x02\xf9\x03\x0a\xff\xd7\x02\xf9\x03\x0b\xffq\x02\ +\xf9\x03\x0c\xff\xd7\x02\xf9\x03\x11\xff\x9a\x02\xf9\x03\x12\xff\ +\xae\x02\xf9\x03\x15\xff\xec\x02\xf9\x03\x16\xff\xd7\x02\xf9\x03\ +\x1a\xff\xd7\x02\xf9\x03\x1b\xff\x9a\x02\xf9\x03\x1c\xff\xae\x02\ +\xfa\x00\x0f\xff\xae\x02\xfa\x00\x11\xff\xae\x02\xfa\x01\xce\xff\ +\xd7\x02\xfa\x01\xd5\xff\xd7\x02\xfa\x01\xf2\xff\xd7\x02\xfa\x02\ +\x08\xff\xae\x02\xfa\x02\x0c\xff\xae\x02\xfa\x02s\xff\xd7\x02\ +\xfa\x02\xcf\xff\xd7\x02\xfa\x03\x12\xff\xd7\x02\xfa\x03\x1c\xff\ +\xd7\x02\xfb\x00\x0f\xff\x85\x02\xfb\x00\x11\xff\x85\x02\xfb\x01\ +\x9f\xff\xec\x02\xfb\x01\xa4\xff\x9a\x02\xfb\x01\xaa\xffq\x02\ +\xfb\x01\xae\xff\x9a\x02\xfb\x01\xb5\xff\x9a\x02\xfb\x01\xb8\xff\ +\xec\x02\xfb\x01\xbb\xff\xec\x02\xfb\x01\xbe\xff\xc3\x02\xfb\x01\ +\xc9\xff\xec\x02\xfb\x01\xce\xff\xae\x02\xfb\x01\xcf\xff\xd7\x02\ +\xfb\x01\xd5\xff\xae\x02\xfb\x01\xd8\xff\xd7\x02\xfb\x01\xdb\xff\ +\xd7\x02\xfb\x01\xde\xff\xd7\x02\xfb\x01\xe1\xff\xd7\x02\xfb\x01\ +\xea\xff\xd7\x02\xfb\x01\xeb\x00f\x02\xfb\x01\xed\xff\xd7\x02\ +\xfb\x01\xee\xff\xec\x02\xfb\x01\xf2\xff\xae\x02\xfb\x01\xf4\x00\ +f\x02\xfb\x02\x08\xff\x85\x02\xfb\x02\x0c\xff\x85\x02\xfb\x02\ +j\xff\xd7\x02\xfb\x02l\xff\xec\x02\xfb\x02r\xffq\x02\ +\xfb\x02s\xff\xae\x02\xfb\x02~\xff\xec\x02\xfb\x02\x7f\xff\ +\xd7\x02\xfb\x02\x84\xff\xec\x02\xfb\x02\x85\xff\xd7\x02\xfb\x02\ +\x86\xff\xec\x02\xfb\x02\x87\xff\xd7\x02\xfb\x02\x88\xff\xec\x02\ +\xfb\x02\x89\xff\xd7\x02\xfb\x02\x8a\xff\xec\x02\xfb\x02\x8c\xff\ +\xec\x02\xfb\x02\x8d\xff\xd7\x02\xfb\x02\x98\x00f\x02\xfb\x02\ +\xa8\x00f\x02\xfb\x02\xb1\xff\xec\x02\xfb\x02\xb2\xff\xd7\x02\ +\xfb\x02\xb3\xff\xec\x02\xfb\x02\xb4\xff\xd7\x02\xfb\x02\xc0\xff\ +\xd7\x02\xfb\x02\xc2\xff\xd7\x02\xfb\x02\xc5\xff\xd7\x02\xfb\x02\ +\xc6\xff\xc3\x02\xfb\x02\xc7\xff\xd7\x02\xfb\x02\xc8\xff\xc3\x02\ +\xfb\x02\xce\xff\x9a\x02\xfb\x02\xcf\xff\xae\x02\xfb\x02\xd5\xff\ +\xd7\x02\xfb\x02\xd9\xffq\x02\xfb\x02\xdb\xffq\x02\xfb\x02\ +\xdd\xffq\x02\xfb\x02\xe0\xff\xd7\x02\xfb\x02\xef\xff\xec\x02\ +\xfb\x02\xf0\xff\xd7\x02\xfb\x02\xf1\xff\xec\x02\xfb\x02\xf2\xff\ +\xd7\x02\xfb\x02\xf3\xff\xec\x02\xfb\x02\xf4\xff\xd7\x02\xfb\x02\ +\xfe\xff\xd7\x02\xfb\x03\x09\xffq\x02\xfb\x03\x0a\xff\xd7\x02\ +\xfb\x03\x0b\xffq\x02\xfb\x03\x0c\xff\xd7\x02\xfb\x03\x11\xff\ +\x9a\x02\xfb\x03\x12\xff\xae\x02\xfb\x03\x15\xff\xec\x02\xfb\x03\ +\x16\xff\xd7\x02\xfb\x03\x1a\xff\xd7\x02\xfb\x03\x1b\xff\x9a\x02\ +\xfb\x03\x1c\xff\xae\x02\xfc\x00\x0f\xff\xae\x02\xfc\x00\x11\xff\ +\xae\x02\xfc\x01\xce\xff\xd7\x02\xfc\x01\xd5\xff\xd7\x02\xfc\x01\ +\xf2\xff\xd7\x02\xfc\x02\x08\xff\xae\x02\xfc\x02\x0c\xff\xae\x02\ +\xfc\x02s\xff\xd7\x02\xfc\x02\xcf\xff\xd7\x02\xfc\x03\x12\xff\ +\xd7\x02\xfc\x03\x1c\xff\xd7\x02\xff\x00\x0f\xff\x85\x02\xff\x00\ +\x10\xff\xae\x02\xff\x00\x11\xff\x85\x02\xff\x01\x9f\xff\xd7\x02\ +\xff\x01\xa4\xff\x9a\x02\xff\x01\xaa\xffq\x02\xff\x01\xae\xff\ +\x9a\x02\xff\x01\xb5\xff\x9a\x02\xff\x01\xb8\xff\xd7\x02\xff\x01\ +\xbb\xff\xd7\x02\xff\x01\xbc\x00)\x02\xff\x01\xbe\xff\xae\x02\ +\xff\x01\xcc\xff\x9a\x02\xff\x01\xcd\xff\x9a\x02\xff\x01\xce\xff\ +\x85\x02\xff\x01\xcf\xffq\x02\xff\x01\xd0\xff\xd7\x02\xff\x01\ +\xd1\xff\xd7\x02\xff\x01\xd2\xff\x9a\x02\xff\x01\xd3\xff\x9a\x02\ +\xff\x01\xd4\xff\x9a\x02\xff\x01\xd5\xff\x85\x02\xff\x01\xd6\xff\ +\x9a\x02\xff\x01\xd7\xff\x9a\x02\xff\x01\xd8\xffq\x02\xff\x01\ +\xd9\xff\x9a\x02\xff\x01\xda\xff\x9a\x02\xff\x01\xdb\xffq\x02\ +\xff\x01\xdc\xff\xae\x02\xff\x01\xdd\xff\xae\x02\xff\x01\xde\xff\ +q\x02\xff\x01\xdf\xff\xd7\x02\xff\x01\xe0\xff\x9a\x02\xff\x01\ +\xe1\xff\x9a\x02\xff\x01\xe2\xff\x9a\x02\xff\x01\xe3\xff\x9a\x02\ +\xff\x01\xe4\xff\xae\x02\xff\x01\xe5\xff\x9a\x02\xff\x01\xe6\xff\ +\x9a\x02\xff\x01\xe7\xff\xd7\x02\xff\x01\xe8\xff\x9a\x02\xff\x01\ +\xe9\xff\xc3\x02\xff\x01\xea\xffq\x02\xff\x01\xec\xff\x9a\x02\ +\xff\x01\xed\xffq\x02\xff\x01\xee\xff\x85\x02\xff\x01\xf2\xff\ +\x85\x02\xff\x01\xf3\xff\x9a\x02\xff\x01\xf5\xff\x9a\x02\xff\x01\ +\xf6\xff\xae\x02\xff\x01\xf7\xff\x9a\x02\xff\x01\xf9\xff\x9a\x02\ +\xff\x02\x02\xff\xae\x02\xff\x02\x03\xff\xae\x02\xff\x02\x04\xff\ +\xae\x02\xff\x02\x08\xff\x85\x02\xff\x02\x0c\xff\x85\x02\xff\x02\ +j\xffq\x02\xff\x02k\xff\x9a\x02\xff\x02l\xff\xd7\x02\ +\xff\x02m\xff\xd7\x02\xff\x02q\xff\x9a\x02\xff\x02r\xff\ +q\x02\xff\x02s\xff\x85\x02\xff\x02u\xff\x9a\x02\xff\x02\ +w\xff\x9a\x02\xff\x02y\xff\x9a\x02\xff\x02}\xff\x9a\x02\ +\xff\x02~\xff\xd7\x02\xff\x02\x7f\xffq\x02\xff\x02\x81\xff\ +\xd7\x02\xff\x02\x83\xff\xd7\x02\xff\x02\x84\xff\xd7\x02\xff\x02\ +\x85\xffq\x02\xff\x02\x86\xff\xd7\x02\xff\x02\x87\xffq\x02\ +\xff\x02\x88\xff\xd7\x02\xff\x02\x89\xffq\x02\xff\x02\x8a\xff\ +\xd7\x02\xff\x02\x8b\xff\xd7\x02\xff\x02\x8c\xff\xd7\x02\xff\x02\ +\x8d\xffq\x02\xff\x02\x96\xff\x9a\x02\xff\x02\x9a\xff\x9a\x02\ +\xff\x02\x9e\xff\x9a\x02\xff\x02\xa0\xff\xd7\x02\xff\x02\xa2\xff\ +\xd7\x02\xff\x02\xa4\xff\x9a\x02\xff\x02\xa6\xff\x9a\x02\xff\x02\ +\xaa\xff\xae\x02\xff\x02\xac\xff\x9a\x02\xff\x02\xae\xff\x9a\x02\ +\xff\x02\xb0\xff\x9a\x02\xff\x02\xb1\xff\xd7\x02\xff\x02\xb2\xff\ +q\x02\xff\x02\xb3\xff\xd7\x02\xff\x02\xb4\xffq\x02\xff\x02\ +\xb5\x00)\x02\xff\x02\xb6\xff\xae\x02\xff\x02\xb8\xff\xae\x02\ +\xff\x02\xba\xff\xae\x02\xff\x02\xbc\xff\xd7\x02\xff\x02\xbe\xff\ +\xae\x02\xff\x02\xc0\xff\x9a\x02\xff\x02\xc2\xff\x9a\x02\xff\x02\ +\xc4\xff\x9a\x02\xff\x02\xc5\xff\x9a\x02\xff\x02\xc6\xffq\x02\ +\xff\x02\xc7\xff\x9a\x02\xff\x02\xc8\xffq\x02\xff\x02\xcb\xff\ +\xd7\x02\xff\x02\xcd\xff\x9a\x02\xff\x02\xce\xff\x9a\x02\xff\x02\ +\xcf\xff\x85\x02\xff\x02\xd1\xff\x9a\x02\xff\x02\xd3\xff\x9a\x02\ +\xff\x02\xd5\xff\x9a\x02\xff\x02\xd7\xff\x9a\x02\xff\x02\xd9\xff\ +q\x02\xff\x02\xdb\xffq\x02\xff\x02\xdd\xffq\x02\xff\x02\ +\xe0\xffq\x02\xff\x02\xe6\xff\xd7\x02\xff\x02\xe8\xff\xd7\x02\ +\xff\x02\xea\xff\xc3\x02\xff\x02\xec\xff\x9a\x02\xff\x02\xee\xff\ +\x9a\x02\xff\x02\xef\xff\xd7\x02\xff\x02\xf0\xffq\x02\xff\x02\ +\xf1\xff\xd7\x02\xff\x02\xf2\xffq\x02\xff\x02\xf3\xff\xd7\x02\ +\xff\x02\xf4\xffq\x02\xff\x02\xf6\xff\xd7\x02\xff\x02\xf8\xff\ +\xae\x02\xff\x02\xfa\xff\xae\x02\xff\x02\xfc\xff\xae\x02\xff\x02\ +\xfe\xff\x9a\x02\xff\x03\x00\xff\x9a\x02\xff\x03\x02\xff\x9a\x02\ +\xff\x03\x06\xff\xd7\x02\xff\x03\x08\xff\xd7\x02\xff\x03\x09\xff\ +q\x02\xff\x03\x0a\xffq\x02\xff\x03\x0b\xffq\x02\xff\x03\ +\x0c\xffq\x02\xff\x03\x0e\xff\x9a\x02\xff\x03\x10\xff\x9a\x02\ +\xff\x03\x11\xff\x9a\x02\xff\x03\x12\xff\x85\x02\xff\x03\x14\xff\ +\x9a\x02\xff\x03\x15\xff\xd7\x02\xff\x03\x16\xffq\x02\xff\x03\ +\x18\xff\xae\x02\xff\x03\x1a\xffq\x02\xff\x03\x1b\xff\x9a\x02\ +\xff\x03\x1c\xff\x85\x03\x00\x00\x0f\xff\x9a\x03\x00\x00\x10\xff\ +\xd7\x03\x00\x00\x11\xff\x9a\x03\x00\x01\xce\xff\xc3\x03\x00\x01\ +\xcf\xff\xec\x03\x00\x01\xd5\xff\xc3\x03\x00\x01\xd8\xff\xec\x03\ +\x00\x01\xdb\xff\xec\x03\x00\x01\xde\xff\xec\x03\x00\x01\xea\xff\ +\xec\x03\x00\x01\xed\xff\xec\x03\x00\x01\xf2\xff\xc3\x03\x00\x02\ +\x02\xff\xd7\x03\x00\x02\x03\xff\xd7\x03\x00\x02\x04\xff\xd7\x03\ +\x00\x02\x08\xff\x9a\x03\x00\x02\x0c\xff\x9a\x03\x00\x02j\xff\ +\xec\x03\x00\x02s\xff\xc3\x03\x00\x02\x7f\xff\xec\x03\x00\x02\ +\x85\xff\xec\x03\x00\x02\x87\xff\xec\x03\x00\x02\x89\xff\xec\x03\ +\x00\x02\x8d\xff\xec\x03\x00\x02\xb2\xff\xec\x03\x00\x02\xb4\xff\ +\xec\x03\x00\x02\xcf\xff\xc3\x03\x00\x02\xe0\xff\xec\x03\x00\x02\ +\xf0\xff\xec\x03\x00\x02\xf2\xff\xec\x03\x00\x02\xf4\xff\xec\x03\ +\x00\x03\x0a\xff\xec\x03\x00\x03\x0c\xff\xec\x03\x00\x03\x12\xff\ +\xc3\x03\x00\x03\x16\xff\xec\x03\x00\x03\x1a\xff\xec\x03\x00\x03\ +\x1c\xff\xc3\x03\x03\x00\x0f\xff\x9a\x03\x03\x00\x10\xff\xd7\x03\ +\x03\x00\x11\xff\x9a\x03\x03\x01\x9d\x00)\x03\x03\x01\x9f\xff\ +\xd7\x03\x03\x01\xa4\xff\xae\x03\x03\x01\xa6\x00)\x03\x03\x01\ +\xaa\xff\x85\x03\x03\x01\xae\xff\xae\x03\x03\x01\xb5\xff\xae\x03\ +\x03\x01\xb8\xff\xd7\x03\x03\x01\xbb\xff\xd7\x03\x03\x01\xbc\x00\ +)\x03\x03\x01\xbe\xff\xc3\x03\x03\x01\xc4\x00)\x03\x03\x01\ +\xcc\xff\xc3\x03\x03\x01\xcd\xff\xc3\x03\x03\x01\xce\xff\x9a\x03\ +\x03\x01\xcf\xff\xae\x03\x03\x01\xd0\xff\xd7\x03\x03\x01\xd1\xff\ +\xd7\x03\x03\x01\xd2\xff\xc3\x03\x03\x01\xd3\xff\xc3\x03\x03\x01\ +\xd4\xff\xc3\x03\x03\x01\xd5\xff\x9a\x03\x03\x01\xd6\xff\xc3\x03\ +\x03\x01\xd7\xff\xc3\x03\x03\x01\xd8\xff\xae\x03\x03\x01\xd9\xff\ +\xc3\x03\x03\x01\xda\xff\xc3\x03\x03\x01\xdb\xff\xae\x03\x03\x01\ +\xde\xff\xae\x03\x03\x01\xdf\xff\xd7\x03\x03\x01\xe0\xff\xc3\x03\ +\x03\x01\xe1\xff\x9a\x03\x03\x01\xe2\xff\xc3\x03\x03\x01\xe3\xff\ +\xc3\x03\x03\x01\xe5\xff\xc3\x03\x03\x01\xe6\xff\xc3\x03\x03\x01\ +\xe7\xff\xd7\x03\x03\x01\xe8\xff\xc3\x03\x03\x01\xea\xff\xae\x03\ +\x03\x01\xeb\x00)\x03\x03\x01\xec\xff\xc3\x03\x03\x01\xed\xff\ +\xae\x03\x03\x01\xee\xff\xc3\x03\x03\x01\xf2\xff\x9a\x03\x03\x01\ +\xf3\xff\xc3\x03\x03\x01\xf4\x00)\x03\x03\x01\xf5\xff\xc3\x03\ +\x03\x01\xf7\xff\xc3\x03\x03\x01\xf9\xff\xc3\x03\x03\x02\x02\xff\ +\xd7\x03\x03\x02\x03\xff\xd7\x03\x03\x02\x04\xff\xd7\x03\x03\x02\ +\x08\xff\x9a\x03\x03\x02\x0c\xff\x9a\x03\x03\x02j\xff\xae\x03\ +\x03\x02k\xff\xc3\x03\x03\x02l\xff\xd7\x03\x03\x02q\xff\ +\xc3\x03\x03\x02r\xff\x85\x03\x03\x02s\xff\x9a\x03\x03\x02\ +u\xff\xc3\x03\x03\x02w\xff\xd7\x03\x03\x02y\xff\xc3\x03\ +\x03\x02}\xff\xc3\x03\x03\x02~\xff\xd7\x03\x03\x02\x7f\xff\ +\xae\x03\x03\x02\x84\xff\xd7\x03\x03\x02\x85\xff\xae\x03\x03\x02\ +\x86\xff\xd7\x03\x03\x02\x87\xff\xae\x03\x03\x02\x88\xff\xd7\x03\ +\x03\x02\x89\xff\xae\x03\x03\x02\x8a\xff\xd7\x03\x03\x02\x8c\xff\ +\xd7\x03\x03\x02\x8d\xff\xae\x03\x03\x02\x96\xff\xc3\x03\x03\x02\ +\x98\x00)\x03\x03\x02\x9a\xff\xc3\x03\x03\x02\x9e\xff\xc3\x03\ +\x03\x02\xa0\xff\xd7\x03\x03\x02\xa2\xff\xd7\x03\x03\x02\xa4\xff\ +\xc3\x03\x03\x02\xa6\xff\xc3\x03\x03\x02\xa8\x00)\x03\x03\x02\ +\xa9\x00)\x03\x03\x02\xac\xff\xc3\x03\x03\x02\xae\xff\xc3\x03\ +\x03\x02\xb0\xff\xc3\x03\x03\x02\xb1\xff\xd7\x03\x03\x02\xb2\xff\ +\xae\x03\x03\x02\xb3\xff\xd7\x03\x03\x02\xb4\xff\xae\x03\x03\x02\ +\xb5\x00)\x03\x03\x02\xbc\xff\xd7\x03\x03\x02\xbd\x00)\x03\ +\x03\x02\xc0\xff\x9a\x03\x03\x02\xc2\xff\x9a\x03\x03\x02\xc4\xff\ +\xc3\x03\x03\x02\xc5\xff\xd7\x03\x03\x02\xc6\xff\xc3\x03\x03\x02\ +\xc7\xff\xd7\x03\x03\x02\xc8\xff\xc3\x03\x03\x02\xcb\xff\xd7\x03\ +\x03\x02\xcd\xff\xc3\x03\x03\x02\xce\xff\xae\x03\x03\x02\xcf\xff\ +\x9a\x03\x03\x02\xd1\xff\xc3\x03\x03\x02\xd3\xff\xc3\x03\x03\x02\ +\xd5\xff\x9a\x03\x03\x02\xd7\xff\xc3\x03\x03\x02\xd9\xff\x85\x03\ +\x03\x02\xdb\xff\x85\x03\x03\x02\xdd\xff\x85\x03\x03\x02\xe0\xff\ +\xae\x03\x03\x02\xe6\xff\xd7\x03\x03\x02\xe8\xff\xd7\x03\x03\x02\ +\xec\xff\xc3\x03\x03\x02\xee\xff\xc3\x03\x03\x02\xef\xff\xd7\x03\ +\x03\x02\xf0\xff\xae\x03\x03\x02\xf1\xff\xd7\x03\x03\x02\xf2\xff\ +\xae\x03\x03\x02\xf3\xff\xd7\x03\x03\x02\xf4\xff\xae\x03\x03\x02\ +\xf6\xff\xd7\x03\x03\x02\xfe\xff\x9a\x03\x03\x03\x00\xff\xc3\x03\ +\x03\x03\x02\xff\xc3\x03\x03\x03\x06\xff\xd7\x03\x03\x03\x08\xff\ +\xd7\x03\x03\x03\x09\xff\x9a\x03\x03\x03\x0a\xff\xae\x03\x03\x03\ +\x0b\xff\x9a\x03\x03\x03\x0c\xff\xae\x03\x03\x03\x0e\xff\xd7\x03\ +\x03\x03\x10\xff\xd7\x03\x03\x03\x11\xff\xae\x03\x03\x03\x12\xff\ +\x9a\x03\x03\x03\x14\xff\xc3\x03\x03\x03\x15\xff\xd7\x03\x03\x03\ +\x16\xff\xae\x03\x03\x03\x17\x00)\x03\x03\x03\x1a\xff\xae\x03\ +\x03\x03\x1b\xff\xae\x03\x03\x03\x1c\xff\x9a\x03\x04\x00\x0f\xff\ +\xc3\x03\x04\x00\x11\xff\xc3\x03\x04\x01\xce\xff\xc3\x03\x04\x01\ +\xcf\xff\xd7\x03\x04\x01\xd5\xff\xc3\x03\x04\x01\xd8\xff\xd7\x03\ +\x04\x01\xdb\xff\xd7\x03\x04\x01\xde\xff\xd7\x03\x04\x01\xea\xff\ +\xd7\x03\x04\x01\xed\xff\xd7\x03\x04\x01\xf2\xff\xc3\x03\x04\x02\ +\x08\xff\xc3\x03\x04\x02\x0c\xff\xc3\x03\x04\x02j\xff\xd7\x03\ +\x04\x02s\xff\xc3\x03\x04\x02\x7f\xff\xd7\x03\x04\x02\x85\xff\ +\xd7\x03\x04\x02\x87\xff\xd7\x03\x04\x02\x89\xff\xd7\x03\x04\x02\ +\x8d\xff\xd7\x03\x04\x02\xb2\xff\xd7\x03\x04\x02\xb4\xff\xd7\x03\ +\x04\x02\xcf\xff\xc3\x03\x04\x02\xe0\xff\xd7\x03\x04\x02\xf0\xff\ +\xd7\x03\x04\x02\xf2\xff\xd7\x03\x04\x02\xf4\xff\xd7\x03\x04\x03\ +\x0a\xff\xd7\x03\x04\x03\x0c\xff\xd7\x03\x04\x03\x12\xff\xc3\x03\ +\x04\x03\x16\xff\xd7\x03\x04\x03\x1a\xff\xd7\x03\x04\x03\x1c\xff\ +\xc3\x03\x05\x01\x9f\xff\xd7\x03\x05\x01\xa3\x00\xe1\x03\x05\x01\ +\xb8\xff\xd7\x03\x05\x01\xbb\xff\xd7\x03\x05\x01\xbe\xff\xc3\x03\ +\x05\x01\xdc\xff\xd7\x03\x05\x01\xe1\xff\xae\x03\x05\x01\xe4\xff\ +\xd7\x03\x05\x02l\xff\xd7\x03\x05\x02{\x00=\x03\x05\x02\ +}\xff\xec\x03\x05\x02~\xff\xd7\x03\x05\x02\x84\xff\xd7\x03\ +\x05\x02\x86\xff\xd7\x03\x05\x02\x88\xff\xd7\x03\x05\x02\x8a\xff\ +\xd7\x03\x05\x02\x8c\xff\xd7\x03\x05\x02\xaa\xff\xd7\x03\x05\x02\ +\xb1\xff\xd7\x03\x05\x02\xb3\xff\xd7\x03\x05\x02\xb6\xff\xd7\x03\ +\x05\x02\xbe\xff\xd7\x03\x05\x02\xc0\xff\xae\x03\x05\x02\xc2\xff\ +\xae\x03\x05\x02\xc5\xff\xc3\x03\x05\x02\xc6\xff\xd7\x03\x05\x02\ +\xc7\xff\xc3\x03\x05\x02\xc8\xff\xd7\x03\x05\x02\xd5\xff\xae\x03\ +\x05\x02\xef\xff\xd7\x03\x05\x02\xf1\xff\xd7\x03\x05\x02\xf3\xff\ +\xd7\x03\x05\x02\xfe\xff\xae\x03\x05\x03\x0e\xff\xd7\x03\x05\x03\ +\x10\xff\xd7\x03\x05\x03\x15\xff\xd7\x03\x05\x03\x18\xff\xd7\x03\ +\x06\x01\xcf\xff\xec\x03\x06\x01\xd8\xff\xec\x03\x06\x01\xdb\xff\ +\xec\x03\x06\x01\xde\xff\xec\x03\x06\x01\xe1\xff\xec\x03\x06\x01\ +\xea\xff\xec\x03\x06\x01\xed\xff\xec\x03\x06\x02j\xff\xec\x03\ +\x06\x02\x7f\xff\xec\x03\x06\x02\x85\xff\xec\x03\x06\x02\x87\xff\ +\xec\x03\x06\x02\x89\xff\xec\x03\x06\x02\x8d\xff\xec\x03\x06\x02\ +\xb2\xff\xec\x03\x06\x02\xb4\xff\xec\x03\x06\x02\xc0\xff\xec\x03\ +\x06\x02\xc2\xff\xec\x03\x06\x02\xd5\xff\xec\x03\x06\x02\xe0\xff\ +\xec\x03\x06\x02\xf0\xff\xec\x03\x06\x02\xf2\xff\xec\x03\x06\x02\ +\xf4\xff\xec\x03\x06\x02\xfe\xff\xec\x03\x06\x03\x0a\xff\xec\x03\ +\x06\x03\x0c\xff\xec\x03\x06\x03\x0e\xff\xd7\x03\x06\x03\x10\xff\ +\xd7\x03\x06\x03\x16\xff\xec\x03\x06\x03\x1a\xff\xec\x03\x07\x01\ +\x9f\xff\xd7\x03\x07\x01\xb8\xff\xd7\x03\x07\x01\xbb\xff\xd7\x03\ +\x07\x01\xbe\xff\xd7\x03\x07\x01\xc1\xff\xd7\x03\x07\x01\xe1\xff\ +\xd7\x03\x07\x02l\xff\xd7\x03\x07\x02|\xff\xd7\x03\x07\x02\ +~\xff\xd7\x03\x07\x02\x84\xff\xd7\x03\x07\x02\x86\xff\xd7\x03\ +\x07\x02\x88\xff\xd7\x03\x07\x02\x8a\xff\xd7\x03\x07\x02\x8c\xff\ +\xd7\x03\x07\x02\xb1\xff\xd7\x03\x07\x02\xb3\xff\xd7\x03\x07\x02\ +\xbf\xff\xd7\x03\x07\x02\xc0\xff\xd7\x03\x07\x02\xc1\xff\xd7\x03\ +\x07\x02\xc2\xff\xd7\x03\x07\x02\xc5\xff\x9a\x03\x07\x02\xc7\xff\ +\x9a\x03\x07\x02\xd4\xff\xd7\x03\x07\x02\xd5\xff\xd7\x03\x07\x02\ +\xef\xff\xd7\x03\x07\x02\xf1\xff\xd7\x03\x07\x02\xf3\xff\xd7\x03\ +\x07\x02\xfd\xff\xd7\x03\x07\x02\xfe\xff\xd7\x03\x07\x03\x09\xff\ +\xd7\x03\x07\x03\x0b\xff\xd7\x03\x07\x03\x0e\xff\xd7\x03\x07\x03\ +\x10\xff\xd7\x03\x07\x03\x15\xff\xd7\x03\x07\x03\x19\xff\xec\x03\ +\x08\x01\xcf\xff\xec\x03\x08\x01\xd8\xff\xec\x03\x08\x01\xdb\xff\ +\xec\x03\x08\x01\xde\xff\xec\x03\x08\x01\xe1\xff\xec\x03\x08\x01\ +\xea\xff\xec\x03\x08\x01\xed\xff\xec\x03\x08\x02j\xff\xec\x03\ +\x08\x02\x7f\xff\xec\x03\x08\x02\x85\xff\xec\x03\x08\x02\x87\xff\ +\xec\x03\x08\x02\x89\xff\xec\x03\x08\x02\x8d\xff\xec\x03\x08\x02\ +\xb2\xff\xec\x03\x08\x02\xb4\xff\xec\x03\x08\x02\xc0\xff\xec\x03\ +\x08\x02\xc2\xff\xec\x03\x08\x02\xd5\xff\xec\x03\x08\x02\xe0\xff\ +\xec\x03\x08\x02\xf0\xff\xec\x03\x08\x02\xf2\xff\xec\x03\x08\x02\ +\xf4\xff\xec\x03\x08\x02\xfe\xff\xec\x03\x08\x03\x0a\xff\xec\x03\ +\x08\x03\x0c\xff\xec\x03\x08\x03\x0e\xff\xd7\x03\x08\x03\x10\xff\ +\xd7\x03\x08\x03\x16\xff\xec\x03\x08\x03\x1a\xff\xec\x03\x0b\x00\ +\x05\xff\x9a\x03\x0b\x00\x0a\xff\x9a\x03\x0b\x01\x9d\xff\xae\x03\ +\x0b\x01\xa6\xff\xae\x03\x0b\x01\xa8\xff\xc3\x03\x0b\x01\xaa\xff\ +\xc3\x03\x0b\x01\xb0\xff\xc3\x03\x0b\x01\xbc\xffq\x03\x0b\x01\ +\xbd\xff\xc3\x03\x0b\x01\xbf\xff\xc3\x03\x0b\x01\xc1\xff\xc3\x03\ +\x0b\x01\xc4\xff\xae\x03\x0b\x01\xd0\xff\xd7\x03\x0b\x01\xdc\xff\ +\xc3\x03\x0b\x01\xdf\xff\xd7\x03\x0b\x01\xe1\xff\xd7\x03\x0b\x01\ +\xe4\xff\xc3\x03\x0b\x02\x07\xff\x9a\x03\x0b\x02\x0b\xff\x9a\x03\ +\x0b\x02r\xff\xc3\x03\x0b\x02v\xff\xd7\x03\x0b\x02|\xff\ +\xc3\x03\x0b\x02\x80\xff\xc3\x03\x0b\x02\x82\xff\xc3\x03\x0b\x02\ +\x9f\xff\xc3\x03\x0b\x02\xa0\xff\xd7\x03\x0b\x02\xa9\xff\xae\x03\ +\x0b\x02\xaa\xff\xc3\x03\x0b\x02\xb5\xffq\x03\x0b\x02\xb6\xff\ +\xc3\x03\x0b\x02\xb7\xff\xc3\x03\x0b\x02\xb9\xff\xc3\x03\x0b\x02\ +\xbb\xff\xc3\x03\x0b\x02\xbc\xff\xd7\x03\x0b\x02\xbd\xff\xae\x03\ +\x0b\x02\xbe\xff\xc3\x03\x0b\x02\xbf\xff\xc3\x03\x0b\x02\xc0\xff\ +\xd7\x03\x0b\x02\xc1\xff\xc3\x03\x0b\x02\xc2\xff\xd7\x03\x0b\x02\ +\xca\xff\xc3\x03\x0b\x02\xcb\xff\xd7\x03\x0b\x02\xd4\xff\xc3\x03\ +\x0b\x02\xd5\xff\xd7\x03\x0b\x02\xd9\xff\xc3\x03\x0b\x02\xdb\xff\ +\xc3\x03\x0b\x02\xdd\xff\xc3\x03\x0b\x02\xe5\xff\xc3\x03\x0b\x02\ +\xe6\xff\xd7\x03\x0b\x02\xf7\xff\xc3\x03\x0b\x02\xf9\xff\xc3\x03\ +\x0b\x02\xfb\xff\xc3\x03\x0b\x02\xfd\xff\xc3\x03\x0b\x02\xfe\xff\ +\xd7\x03\x0b\x03\x05\xff\xc3\x03\x0b\x03\x06\xff\xd7\x03\x0b\x03\ +\x07\xff\xc3\x03\x0b\x03\x08\xff\xd7\x03\x0b\x03\x0d\xff\xd7\x03\ +\x0b\x03\x0e\xff\xd7\x03\x0b\x03\x0f\xff\xd7\x03\x0b\x03\x10\xff\ +\xd7\x03\x0b\x03\x17\xff\xae\x03\x0b\x03\x18\xff\xc3\x03\x0c\x00\ +\x05\xff\x9a\x03\x0c\x00\x0a\xff\x9a\x03\x0c\x01\xd0\xff\xd7\x03\ +\x0c\x01\xdc\xff\xc3\x03\x0c\x01\xdd\xff\xd7\x03\x0c\x01\xdf\xff\ +\xd7\x03\x0c\x01\xe1\xff\xd7\x03\x0c\x01\xe4\xff\xc3\x03\x0c\x01\ +\xf6\xff\xd7\x03\x0c\x02\x07\xff\x9a\x03\x0c\x02\x0b\xff\x9a\x03\ +\x0c\x02\xa0\xff\xd7\x03\x0c\x02\xaa\xff\xc3\x03\x0c\x02\xb6\xff\ +\xc3\x03\x0c\x02\xbc\xff\xd7\x03\x0c\x02\xbe\xff\xc3\x03\x0c\x02\ +\xc0\xff\xd7\x03\x0c\x02\xc2\xff\xd7\x03\x0c\x02\xcb\xff\xd7\x03\ +\x0c\x02\xd5\xff\xd7\x03\x0c\x02\xe6\xff\xd7\x03\x0c\x02\xf8\xff\ +\xd7\x03\x0c\x02\xfa\xff\xd7\x03\x0c\x02\xfc\xff\xd7\x03\x0c\x02\ +\xfe\xff\xd7\x03\x0c\x03\x06\xff\xd7\x03\x0c\x03\x08\xff\xd7\x03\ +\x0c\x03\x0e\xff\x9a\x03\x0c\x03\x10\xff\x9a\x03\x0c\x03\x18\xff\ +\xc3\x03\x0d\x00\x05\xff\x9a\x03\x0d\x00\x0a\xff\x9a\x03\x0d\x01\ +\x9d\xff\xae\x03\x0d\x01\xa6\xff\xae\x03\x0d\x01\xa8\xff\xc3\x03\ +\x0d\x01\xaa\xff\xc3\x03\x0d\x01\xb0\xff\xc3\x03\x0d\x01\xbc\xff\ +q\x03\x0d\x01\xbd\xff\xc3\x03\x0d\x01\xbf\xff\xc3\x03\x0d\x01\ +\xc1\xff\xc3\x03\x0d\x01\xc4\xff\xae\x03\x0d\x01\xd0\xff\xd7\x03\ +\x0d\x01\xdc\xff\xc3\x03\x0d\x01\xdf\xff\xd7\x03\x0d\x01\xe1\xff\ +\xd7\x03\x0d\x01\xe4\xff\xc3\x03\x0d\x02\x07\xff\x9a\x03\x0d\x02\ +\x0b\xff\x9a\x03\x0d\x02r\xff\xc3\x03\x0d\x02v\xff\xd7\x03\ +\x0d\x02|\xff\xc3\x03\x0d\x02\x80\xff\xc3\x03\x0d\x02\x82\xff\ +\xc3\x03\x0d\x02\x9f\xff\xc3\x03\x0d\x02\xa0\xff\xd7\x03\x0d\x02\ +\xa9\xff\xae\x03\x0d\x02\xaa\xff\xc3\x03\x0d\x02\xb5\xffq\x03\ +\x0d\x02\xb6\xff\xc3\x03\x0d\x02\xb7\xff\xc3\x03\x0d\x02\xb9\xff\ +\xc3\x03\x0d\x02\xbb\xff\xc3\x03\x0d\x02\xbc\xff\xd7\x03\x0d\x02\ +\xbd\xff\xae\x03\x0d\x02\xbe\xff\xc3\x03\x0d\x02\xbf\xff\xc3\x03\ +\x0d\x02\xc0\xff\xd7\x03\x0d\x02\xc1\xff\xc3\x03\x0d\x02\xc2\xff\ +\xd7\x03\x0d\x02\xca\xff\xc3\x03\x0d\x02\xcb\xff\xd7\x03\x0d\x02\ +\xd4\xff\xc3\x03\x0d\x02\xd5\xff\xd7\x03\x0d\x02\xd9\xff\xc3\x03\ +\x0d\x02\xdb\xff\xc3\x03\x0d\x02\xdd\xff\xc3\x03\x0d\x02\xe5\xff\ +\xc3\x03\x0d\x02\xe6\xff\xd7\x03\x0d\x02\xf7\xff\xc3\x03\x0d\x02\ +\xf9\xff\xc3\x03\x0d\x02\xfb\xff\xc3\x03\x0d\x02\xfd\xff\xc3\x03\ +\x0d\x02\xfe\xff\xd7\x03\x0d\x03\x05\xff\xc3\x03\x0d\x03\x06\xff\ +\xd7\x03\x0d\x03\x07\xff\xc3\x03\x0d\x03\x08\xff\xd7\x03\x0d\x03\ +\x0d\xff\xd7\x03\x0d\x03\x0e\xff\xd7\x03\x0d\x03\x0f\xff\xd7\x03\ +\x0d\x03\x10\xff\xd7\x03\x0d\x03\x17\xff\xae\x03\x0d\x03\x18\xff\ +\xc3\x03\x0e\x00\x05\xff\x9a\x03\x0e\x00\x0a\xff\x9a\x03\x0e\x01\ +\xd0\xff\xd7\x03\x0e\x01\xdc\xff\xc3\x03\x0e\x01\xdd\xff\xd7\x03\ +\x0e\x01\xdf\xff\xd7\x03\x0e\x01\xe1\xff\xd7\x03\x0e\x01\xe4\xff\ +\xc3\x03\x0e\x01\xf6\xff\xd7\x03\x0e\x02\x07\xff\x9a\x03\x0e\x02\ +\x0b\xff\x9a\x03\x0e\x02\xa0\xff\xd7\x03\x0e\x02\xaa\xff\xc3\x03\ +\x0e\x02\xb6\xff\xc3\x03\x0e\x02\xbc\xff\xd7\x03\x0e\x02\xbe\xff\ +\xc3\x03\x0e\x02\xc0\xff\xd7\x03\x0e\x02\xc2\xff\xd7\x03\x0e\x02\ +\xcb\xff\xd7\x03\x0e\x02\xd5\xff\xd7\x03\x0e\x02\xe6\xff\xd7\x03\ +\x0e\x02\xf8\xff\xd7\x03\x0e\x02\xfa\xff\xd7\x03\x0e\x02\xfc\xff\ +\xd7\x03\x0e\x02\xfe\xff\xd7\x03\x0e\x03\x06\xff\xd7\x03\x0e\x03\ +\x08\xff\xd7\x03\x0e\x03\x0e\xff\x9a\x03\x0e\x03\x10\xff\x9a\x03\ +\x0e\x03\x18\xff\xc3\x03\x0f\x01\xa3\x00\xe1\x03\x0f\x02\xea\x00\ +)\x03\x0f\x03\x0e\xff\xd7\x03\x0f\x03\x10\xff\xd7\x03\x10\x00\ +\x05\xff\xec\x03\x10\x00\x0a\xff\xec\x03\x10\x02\x07\xff\xec\x03\ +\x10\x02\x0b\xff\xec\x03\x11\x00\x05\xff\x9a\x03\x11\x00\x0a\xff\ +\x9a\x03\x11\x01\x9d\xff\xae\x03\x11\x01\xa6\xff\xae\x03\x11\x01\ +\xa8\xff\xc3\x03\x11\x01\xaa\xff\xc3\x03\x11\x01\xb0\xff\xc3\x03\ +\x11\x01\xbc\xffq\x03\x11\x01\xbd\xff\xc3\x03\x11\x01\xbf\xff\ +\xc3\x03\x11\x01\xc1\xff\xc3\x03\x11\x01\xc4\xff\xae\x03\x11\x01\ +\xd0\xff\xd7\x03\x11\x01\xdc\xff\xc3\x03\x11\x01\xdf\xff\xd7\x03\ +\x11\x01\xe1\xff\xd7\x03\x11\x01\xe4\xff\xc3\x03\x11\x02\x07\xff\ +\x9a\x03\x11\x02\x0b\xff\x9a\x03\x11\x02r\xff\xc3\x03\x11\x02\ +v\xff\xd7\x03\x11\x02|\xff\xc3\x03\x11\x02\x80\xff\xc3\x03\ +\x11\x02\x82\xff\xc3\x03\x11\x02\x9f\xff\xc3\x03\x11\x02\xa0\xff\ +\xd7\x03\x11\x02\xa9\xff\xae\x03\x11\x02\xaa\xff\xc3\x03\x11\x02\ +\xb5\xffq\x03\x11\x02\xb6\xff\xc3\x03\x11\x02\xb7\xff\xc3\x03\ +\x11\x02\xb9\xff\xc3\x03\x11\x02\xbb\xff\xc3\x03\x11\x02\xbc\xff\ +\xd7\x03\x11\x02\xbd\xff\xae\x03\x11\x02\xbe\xff\xc3\x03\x11\x02\ +\xbf\xff\xc3\x03\x11\x02\xc0\xff\xd7\x03\x11\x02\xc1\xff\xc3\x03\ +\x11\x02\xc2\xff\xd7\x03\x11\x02\xca\xff\xc3\x03\x11\x02\xcb\xff\ +\xd7\x03\x11\x02\xd4\xff\xc3\x03\x11\x02\xd5\xff\xd7\x03\x11\x02\ +\xd9\xff\xc3\x03\x11\x02\xdb\xff\xc3\x03\x11\x02\xdd\xff\xc3\x03\ +\x11\x02\xe5\xff\xc3\x03\x11\x02\xe6\xff\xd7\x03\x11\x02\xf7\xff\ +\xc3\x03\x11\x02\xf9\xff\xc3\x03\x11\x02\xfb\xff\xc3\x03\x11\x02\ +\xfd\xff\xc3\x03\x11\x02\xfe\xff\xd7\x03\x11\x03\x05\xff\xc3\x03\ +\x11\x03\x06\xff\xd7\x03\x11\x03\x07\xff\xc3\x03\x11\x03\x08\xff\ +\xd7\x03\x11\x03\x0d\xff\xd7\x03\x11\x03\x0e\xff\xd7\x03\x11\x03\ +\x0f\xff\xd7\x03\x11\x03\x10\xff\xd7\x03\x11\x03\x17\xff\xae\x03\ +\x11\x03\x18\xff\xc3\x03\x12\x00\x05\xff\x9a\x03\x12\x00\x0a\xff\ +\x9a\x03\x12\x01\xd0\xff\xd7\x03\x12\x01\xdc\xff\xc3\x03\x12\x01\ +\xdd\xff\xd7\x03\x12\x01\xdf\xff\xd7\x03\x12\x01\xe1\xff\xd7\x03\ +\x12\x01\xe4\xff\xc3\x03\x12\x01\xf6\xff\xd7\x03\x12\x02\x07\xff\ +\x9a\x03\x12\x02\x0b\xff\x9a\x03\x12\x02\xa0\xff\xd7\x03\x12\x02\ +\xaa\xff\xc3\x03\x12\x02\xb6\xff\xc3\x03\x12\x02\xbc\xff\xd7\x03\ +\x12\x02\xbe\xff\xc3\x03\x12\x02\xc0\xff\xd7\x03\x12\x02\xc2\xff\ +\xd7\x03\x12\x02\xcb\xff\xd7\x03\x12\x02\xd5\xff\xd7\x03\x12\x02\ +\xe6\xff\xd7\x03\x12\x02\xf8\xff\xd7\x03\x12\x02\xfa\xff\xd7\x03\ +\x12\x02\xfc\xff\xd7\x03\x12\x02\xfe\xff\xd7\x03\x12\x03\x06\xff\ +\xd7\x03\x12\x03\x08\xff\xd7\x03\x12\x03\x0e\xff\x9a\x03\x12\x03\ +\x10\xff\x9a\x03\x12\x03\x18\xff\xc3\x03\x13\x00\x05\xff\x9a\x03\ +\x13\x00\x0a\xff\x9a\x03\x13\x01\x9d\xff\xae\x03\x13\x01\xa6\xff\ +\xae\x03\x13\x01\xa8\xff\xc3\x03\x13\x01\xaa\xff\xc3\x03\x13\x01\ +\xb0\xff\xc3\x03\x13\x01\xbc\xffq\x03\x13\x01\xbd\xff\xc3\x03\ +\x13\x01\xbf\xff\xc3\x03\x13\x01\xc1\xff\xc3\x03\x13\x01\xc4\xff\ +\xae\x03\x13\x01\xd0\xff\xd7\x03\x13\x01\xdc\xff\xc3\x03\x13\x01\ +\xdf\xff\xd7\x03\x13\x01\xe1\xff\xd7\x03\x13\x01\xe4\xff\xc3\x03\ +\x13\x02\x07\xff\x9a\x03\x13\x02\x0b\xff\x9a\x03\x13\x02r\xff\ +\xc3\x03\x13\x02v\xff\xd7\x03\x13\x02|\xff\xc3\x03\x13\x02\ +\x80\xff\xc3\x03\x13\x02\x82\xff\xc3\x03\x13\x02\x9f\xff\xc3\x03\ +\x13\x02\xa0\xff\xd7\x03\x13\x02\xa9\xff\xae\x03\x13\x02\xaa\xff\ +\xc3\x03\x13\x02\xb5\xffq\x03\x13\x02\xb6\xff\xc3\x03\x13\x02\ +\xb7\xff\xc3\x03\x13\x02\xb9\xff\xc3\x03\x13\x02\xbb\xff\xc3\x03\ +\x13\x02\xbc\xff\xd7\x03\x13\x02\xbd\xff\xae\x03\x13\x02\xbe\xff\ +\xc3\x03\x13\x02\xbf\xff\xc3\x03\x13\x02\xc0\xff\xd7\x03\x13\x02\ +\xc1\xff\xc3\x03\x13\x02\xc2\xff\xd7\x03\x13\x02\xca\xff\xc3\x03\ +\x13\x02\xcb\xff\xd7\x03\x13\x02\xd4\xff\xc3\x03\x13\x02\xd5\xff\ +\xd7\x03\x13\x02\xd9\xff\xc3\x03\x13\x02\xdb\xff\xc3\x03\x13\x02\ +\xdd\xff\xc3\x03\x13\x02\xe5\xff\xc3\x03\x13\x02\xe6\xff\xd7\x03\ +\x13\x02\xf7\xff\xc3\x03\x13\x02\xf9\xff\xc3\x03\x13\x02\xfb\xff\ +\xc3\x03\x13\x02\xfd\xff\xc3\x03\x13\x02\xfe\xff\xd7\x03\x13\x03\ +\x05\xff\xc3\x03\x13\x03\x06\xff\xd7\x03\x13\x03\x07\xff\xc3\x03\ +\x13\x03\x08\xff\xd7\x03\x13\x03\x0d\xff\xd7\x03\x13\x03\x0e\xff\ +\xd7\x03\x13\x03\x0f\xff\xd7\x03\x13\x03\x10\xff\xd7\x03\x13\x03\ +\x17\xff\xae\x03\x13\x03\x18\xff\xc3\x03\x14\x00\x05\xff\x9a\x03\ +\x14\x00\x0a\xff\x9a\x03\x14\x01\xd0\xff\xd7\x03\x14\x01\xdc\xff\ +\xc3\x03\x14\x01\xdd\xff\xd7\x03\x14\x01\xdf\xff\xd7\x03\x14\x01\ +\xe1\xff\xd7\x03\x14\x01\xe4\xff\xc3\x03\x14\x01\xf6\xff\xd7\x03\ +\x14\x02\x07\xff\x9a\x03\x14\x02\x0b\xff\x9a\x03\x14\x02\xa0\xff\ +\xd7\x03\x14\x02\xaa\xff\xc3\x03\x14\x02\xb6\xff\xc3\x03\x14\x02\ +\xbc\xff\xd7\x03\x14\x02\xbe\xff\xc3\x03\x14\x02\xc0\xff\xd7\x03\ +\x14\x02\xc2\xff\xd7\x03\x14\x02\xcb\xff\xd7\x03\x14\x02\xd5\xff\ +\xd7\x03\x14\x02\xe6\xff\xd7\x03\x14\x02\xf8\xff\xd7\x03\x14\x02\ +\xfa\xff\xd7\x03\x14\x02\xfc\xff\xd7\x03\x14\x02\xfe\xff\xd7\x03\ +\x14\x03\x06\xff\xd7\x03\x14\x03\x08\xff\xd7\x03\x14\x03\x0e\xff\ +\x9a\x03\x14\x03\x10\xff\x9a\x03\x14\x03\x18\xff\xc3\x03\x15\x00\ +\x0f\xff\xae\x03\x15\x00\x11\xff\xae\x03\x15\x01\xaa\xff\xec\x03\ +\x15\x01\xb0\xff\xd7\x03\x15\x01\xbc\xff\xd7\x03\x15\x01\xbf\xff\ +\xd7\x03\x15\x02\x08\xff\xae\x03\x15\x02\x0c\xff\xae\x03\x15\x02\ +r\xff\xec\x03\x15\x02\x80\xff\xec\x03\x15\x02\x82\xff\xec\x03\ +\x15\x02\x9f\xff\xd7\x03\x15\x02\xb5\xff\xd7\x03\x15\x02\xb7\xff\ +\xec\x03\x15\x02\xb9\xff\xec\x03\x15\x02\xbb\xff\xd7\x03\x15\x02\ +\xca\xff\xd7\x03\x15\x02\xd9\xff\xec\x03\x15\x02\xdb\xff\xec\x03\ +\x15\x02\xdd\xff\xec\x03\x15\x02\xe5\xff\xd7\x03\x15\x03\x05\xff\ +\xd7\x03\x15\x03\x07\xff\xd7\x03\x16\x00\x05\xff\xd7\x03\x16\x00\ +\x0a\xff\xd7\x03\x16\x01\xd0\xff\xec\x03\x16\x01\xdd\xff\xec\x03\ +\x16\x01\xdf\xff\xec\x03\x16\x01\xf6\xff\xec\x03\x16\x02\x07\xff\ +\xd7\x03\x16\x02\x0b\xff\xd7\x03\x16\x02\xa0\xff\xec\x03\x16\x02\ +\xbc\xff\xec\x03\x16\x02\xcb\xff\xec\x03\x16\x02\xe6\xff\xec\x03\ +\x16\x02\xf8\xff\xec\x03\x16\x02\xfa\xff\xec\x03\x16\x02\xfc\xff\ +\xec\x03\x16\x03\x06\xff\xec\x03\x16\x03\x08\xff\xec\x03\x16\x03\ +\x0e\xff\xd7\x03\x16\x03\x10\xff\xd7\x03\x17\x00\x05\xff\xae\x03\ +\x17\x00\x0a\xff\xae\x03\x17\x01\x9d\xff\xc3\x03\x17\x01\xa6\xff\ +\xc3\x03\x17\x01\xaa\xff\xd7\x03\x17\x01\xb0\xff\xd7\x03\x17\x01\ +\xbc\xff\xc3\x03\x17\x01\xbf\xff\xd7\x03\x17\x01\xc1\xff\xd7\x03\ +\x17\x01\xc4\xff\xc3\x03\x17\x01\xdc\xff\xd7\x03\x17\x01\xe4\xff\ +\xd7\x03\x17\x02\x07\xff\xae\x03\x17\x02\x0b\xff\xae\x03\x17\x02\ +r\xff\xd7\x03\x17\x02|\xff\xd7\x03\x17\x02\x80\xff\xd7\x03\ +\x17\x02\x82\xff\xd7\x03\x17\x02\x9f\xff\xd7\x03\x17\x02\xa9\xff\ +\xc3\x03\x17\x02\xaa\xff\xd7\x03\x17\x02\xb5\xff\xc3\x03\x17\x02\ +\xb6\xff\xd7\x03\x17\x02\xb7\xff\xd7\x03\x17\x02\xb9\xff\xd7\x03\ +\x17\x02\xbb\xff\xd7\x03\x17\x02\xbd\xff\xc3\x03\x17\x02\xbe\xff\ +\xd7\x03\x17\x02\xbf\xff\xd7\x03\x17\x02\xc1\xff\xd7\x03\x17\x02\ +\xca\xff\xd7\x03\x17\x02\xd4\xff\xd7\x03\x17\x02\xd9\xff\xd7\x03\ +\x17\x02\xdb\xff\xd7\x03\x17\x02\xdd\xff\xd7\x03\x17\x02\xe5\xff\ +\xd7\x03\x17\x02\xfd\xff\xd7\x03\x17\x03\x05\xff\xd7\x03\x17\x03\ +\x07\xff\xd7\x03\x17\x03\x0d\xff\xd7\x03\x17\x03\x0f\xff\xd7\x03\ +\x17\x03\x17\xff\xc3\x03\x17\x03\x18\xff\xd7\x03\x18\x00\x05\xff\ +\x9a\x03\x18\x00\x0a\xff\x9a\x03\x18\x01\xd0\xff\xd7\x03\x18\x01\ +\xdc\xff\xc3\x03\x18\x01\xdd\xff\xd7\x03\x18\x01\xdf\xff\xd7\x03\ +\x18\x01\xe1\xff\xd7\x03\x18\x01\xe4\xff\xc3\x03\x18\x01\xf6\xff\ +\xd7\x03\x18\x02\x07\xff\x9a\x03\x18\x02\x0b\xff\x9a\x03\x18\x02\ +\xa0\xff\xd7\x03\x18\x02\xaa\xff\xc3\x03\x18\x02\xb6\xff\xc3\x03\ +\x18\x02\xbc\xff\xd7\x03\x18\x02\xbe\xff\xc3\x03\x18\x02\xc0\xff\ +\xd7\x03\x18\x02\xc2\xff\xd7\x03\x18\x02\xcb\xff\xd7\x03\x18\x02\ +\xd5\xff\xd7\x03\x18\x02\xe6\xff\xd7\x03\x18\x02\xf8\xff\xd7\x03\ +\x18\x02\xfa\xff\xd7\x03\x18\x02\xfc\xff\xd7\x03\x18\x02\xfe\xff\ +\xd7\x03\x18\x03\x06\xff\xd7\x03\x18\x03\x08\xff\xd7\x03\x18\x03\ +\x0e\xff\x9a\x03\x18\x03\x10\xff\x9a\x03\x18\x03\x18\xff\xc3\x03\ +\x19\x01\xe1\xff\xd7\x03\x19\x02\xc0\xff\xd7\x03\x19\x02\xc2\xff\ +\xd7\x03\x19\x02\xd5\xff\xd7\x03\x19\x02\xfe\xff\xd7\x03\x1b\x01\ +\xa3\x00\xe1\x03\x1b\x02\xea\x00)\x03\x1b\x03\x0e\xff\xd7\x03\ +\x1b\x03\x10\xff\xd7\x03\x1c\x00\x05\xff\xec\x03\x1c\x00\x0a\xff\ +\xec\x03\x1c\x02\x07\xff\xec\x03\x1c\x02\x0b\xff\xec\x03\x1d\x00\ +\x05\xffq\x03\x1d\x00\x0a\xffq\x03\x1d\x00&\xff\xd7\x03\ +\x1d\x00*\xff\xd7\x03\x1d\x00-\x01\x0a\x03\x1d\x002\xff\ +\xd7\x03\x1d\x004\xff\xd7\x03\x1d\x007\xffq\x03\x1d\x00\ +9\xff\xae\x03\x1d\x00:\xff\xae\x03\x1d\x00<\xff\x85\x03\ +\x1d\x00\x89\xff\xd7\x03\x1d\x00\x94\xff\xd7\x03\x1d\x00\x95\xff\ +\xd7\x03\x1d\x00\x96\xff\xd7\x03\x1d\x00\x97\xff\xd7\x03\x1d\x00\ +\x98\xff\xd7\x03\x1d\x00\x9a\xff\xd7\x03\x1d\x00\x9f\xff\x85\x03\ +\x1d\x00\xc8\xff\xd7\x03\x1d\x00\xca\xff\xd7\x03\x1d\x00\xcc\xff\ +\xd7\x03\x1d\x00\xce\xff\xd7\x03\x1d\x00\xde\xff\xd7\x03\x1d\x00\ +\xe0\xff\xd7\x03\x1d\x00\xe2\xff\xd7\x03\x1d\x00\xe4\xff\xd7\x03\ +\x1d\x01\x0e\xff\xd7\x03\x1d\x01\x10\xff\xd7\x03\x1d\x01\x12\xff\ +\xd7\x03\x1d\x01\x14\xff\xd7\x03\x1d\x01$\xffq\x03\x1d\x01\ +&\xffq\x03\x1d\x016\xff\xae\x03\x1d\x018\xff\x85\x03\ +\x1d\x01:\xff\x85\x03\x1d\x01G\xff\xd7\x03\x1d\x01\xfa\xff\ +\xae\x03\x1d\x01\xfc\xff\xae\x03\x1d\x01\xfe\xff\xae\x03\x1d\x02\ +\x00\xff\x85\x03\x1d\x02\x07\xffq\x03\x1d\x02\x0b\xffq\x03\ +\x1d\x02_\xff\xd7\x03\x1d\x03I\xff\xd7\x03\x1d\x03K\xff\ +\xd7\x03\x1d\x03M\xff\xd7\x03\x1d\x03O\xff\xd7\x03\x1d\x03\ +Q\xff\xd7\x03\x1d\x03S\xff\xd7\x03\x1d\x03U\xff\xd7\x03\ +\x1d\x03W\xff\xd7\x03\x1d\x03Y\xff\xd7\x03\x1d\x03[\xff\ +\xd7\x03\x1d\x03]\xff\xd7\x03\x1d\x03_\xff\xd7\x03\x1d\x03\ +o\xff\x85\x03\x1d\x03q\xff\x85\x03\x1d\x03s\xff\x85\x03\ +\x1d\x03\x8f\xffq\x03\x1e\x00\x05\xff\xec\x03\x1e\x00\x0a\xff\ +\xec\x03\x1e\x02\x07\xff\xec\x03\x1e\x02\x0b\xff\xec\x03\x1f\x00\ +\x05\xffq\x03\x1f\x00\x0a\xffq\x03\x1f\x00&\xff\xd7\x03\ +\x1f\x00*\xff\xd7\x03\x1f\x00-\x01\x0a\x03\x1f\x002\xff\ +\xd7\x03\x1f\x004\xff\xd7\x03\x1f\x007\xffq\x03\x1f\x00\ +9\xff\xae\x03\x1f\x00:\xff\xae\x03\x1f\x00<\xff\x85\x03\ +\x1f\x00\x89\xff\xd7\x03\x1f\x00\x94\xff\xd7\x03\x1f\x00\x95\xff\ +\xd7\x03\x1f\x00\x96\xff\xd7\x03\x1f\x00\x97\xff\xd7\x03\x1f\x00\ +\x98\xff\xd7\x03\x1f\x00\x9a\xff\xd7\x03\x1f\x00\x9f\xff\x85\x03\ +\x1f\x00\xc8\xff\xd7\x03\x1f\x00\xca\xff\xd7\x03\x1f\x00\xcc\xff\ +\xd7\x03\x1f\x00\xce\xff\xd7\x03\x1f\x00\xde\xff\xd7\x03\x1f\x00\ +\xe0\xff\xd7\x03\x1f\x00\xe2\xff\xd7\x03\x1f\x00\xe4\xff\xd7\x03\ +\x1f\x01\x0e\xff\xd7\x03\x1f\x01\x10\xff\xd7\x03\x1f\x01\x12\xff\ +\xd7\x03\x1f\x01\x14\xff\xd7\x03\x1f\x01$\xffq\x03\x1f\x01\ +&\xffq\x03\x1f\x016\xff\xae\x03\x1f\x018\xff\x85\x03\ +\x1f\x01:\xff\x85\x03\x1f\x01G\xff\xd7\x03\x1f\x01\xfa\xff\ +\xae\x03\x1f\x01\xfc\xff\xae\x03\x1f\x01\xfe\xff\xae\x03\x1f\x02\ +\x00\xff\x85\x03\x1f\x02\x07\xffq\x03\x1f\x02\x0b\xffq\x03\ +\x1f\x02_\xff\xd7\x03\x1f\x03I\xff\xd7\x03\x1f\x03K\xff\ +\xd7\x03\x1f\x03M\xff\xd7\x03\x1f\x03O\xff\xd7\x03\x1f\x03\ +Q\xff\xd7\x03\x1f\x03S\xff\xd7\x03\x1f\x03U\xff\xd7\x03\ +\x1f\x03W\xff\xd7\x03\x1f\x03Y\xff\xd7\x03\x1f\x03[\xff\ +\xd7\x03\x1f\x03]\xff\xd7\x03\x1f\x03_\xff\xd7\x03\x1f\x03\ +o\xff\x85\x03\x1f\x03q\xff\x85\x03\x1f\x03s\xff\x85\x03\ +\x1f\x03\x8f\xffq\x03 \x00\x05\xff\xec\x03 \x00\x0a\xff\ +\xec\x03 \x02\x07\xff\xec\x03 \x02\x0b\xff\xec\x03!\x00\ +\x05\xffq\x03!\x00\x0a\xffq\x03!\x00&\xff\xd7\x03\ +!\x00*\xff\xd7\x03!\x00-\x01\x0a\x03!\x002\xff\ +\xd7\x03!\x004\xff\xd7\x03!\x007\xffq\x03!\x00\ +9\xff\xae\x03!\x00:\xff\xae\x03!\x00<\xff\x85\x03\ +!\x00\x89\xff\xd7\x03!\x00\x94\xff\xd7\x03!\x00\x95\xff\ +\xd7\x03!\x00\x96\xff\xd7\x03!\x00\x97\xff\xd7\x03!\x00\ +\x98\xff\xd7\x03!\x00\x9a\xff\xd7\x03!\x00\x9f\xff\x85\x03\ +!\x00\xc8\xff\xd7\x03!\x00\xca\xff\xd7\x03!\x00\xcc\xff\ +\xd7\x03!\x00\xce\xff\xd7\x03!\x00\xde\xff\xd7\x03!\x00\ +\xe0\xff\xd7\x03!\x00\xe2\xff\xd7\x03!\x00\xe4\xff\xd7\x03\ +!\x01\x0e\xff\xd7\x03!\x01\x10\xff\xd7\x03!\x01\x12\xff\ +\xd7\x03!\x01\x14\xff\xd7\x03!\x01$\xffq\x03!\x01\ +&\xffq\x03!\x016\xff\xae\x03!\x018\xff\x85\x03\ +!\x01:\xff\x85\x03!\x01G\xff\xd7\x03!\x01\xfa\xff\ +\xae\x03!\x01\xfc\xff\xae\x03!\x01\xfe\xff\xae\x03!\x02\ +\x00\xff\x85\x03!\x02\x07\xffq\x03!\x02\x0b\xffq\x03\ +!\x02_\xff\xd7\x03!\x03I\xff\xd7\x03!\x03K\xff\ +\xd7\x03!\x03M\xff\xd7\x03!\x03O\xff\xd7\x03!\x03\ +Q\xff\xd7\x03!\x03S\xff\xd7\x03!\x03U\xff\xd7\x03\ +!\x03W\xff\xd7\x03!\x03Y\xff\xd7\x03!\x03[\xff\ +\xd7\x03!\x03]\xff\xd7\x03!\x03_\xff\xd7\x03!\x03\ +o\xff\x85\x03!\x03q\xff\x85\x03!\x03s\xff\x85\x03\ +!\x03\x8f\xffq\x03\x22\x00\x05\xff\xec\x03\x22\x00\x0a\xff\ +\xec\x03\x22\x02\x07\xff\xec\x03\x22\x02\x0b\xff\xec\x03#\x00\ +\x05\xffq\x03#\x00\x0a\xffq\x03#\x00&\xff\xd7\x03\ +#\x00*\xff\xd7\x03#\x00-\x01\x0a\x03#\x002\xff\ +\xd7\x03#\x004\xff\xd7\x03#\x007\xffq\x03#\x00\ +9\xff\xae\x03#\x00:\xff\xae\x03#\x00<\xff\x85\x03\ +#\x00\x89\xff\xd7\x03#\x00\x94\xff\xd7\x03#\x00\x95\xff\ +\xd7\x03#\x00\x96\xff\xd7\x03#\x00\x97\xff\xd7\x03#\x00\ +\x98\xff\xd7\x03#\x00\x9a\xff\xd7\x03#\x00\x9f\xff\x85\x03\ +#\x00\xc8\xff\xd7\x03#\x00\xca\xff\xd7\x03#\x00\xcc\xff\ +\xd7\x03#\x00\xce\xff\xd7\x03#\x00\xde\xff\xd7\x03#\x00\ +\xe0\xff\xd7\x03#\x00\xe2\xff\xd7\x03#\x00\xe4\xff\xd7\x03\ +#\x01\x0e\xff\xd7\x03#\x01\x10\xff\xd7\x03#\x01\x12\xff\ +\xd7\x03#\x01\x14\xff\xd7\x03#\x01$\xffq\x03#\x01\ +&\xffq\x03#\x016\xff\xae\x03#\x018\xff\x85\x03\ +#\x01:\xff\x85\x03#\x01G\xff\xd7\x03#\x01\xfa\xff\ +\xae\x03#\x01\xfc\xff\xae\x03#\x01\xfe\xff\xae\x03#\x02\ +\x00\xff\x85\x03#\x02\x07\xffq\x03#\x02\x0b\xffq\x03\ +#\x02_\xff\xd7\x03#\x03I\xff\xd7\x03#\x03K\xff\ +\xd7\x03#\x03M\xff\xd7\x03#\x03O\xff\xd7\x03#\x03\ +Q\xff\xd7\x03#\x03S\xff\xd7\x03#\x03U\xff\xd7\x03\ +#\x03W\xff\xd7\x03#\x03Y\xff\xd7\x03#\x03[\xff\ +\xd7\x03#\x03]\xff\xd7\x03#\x03_\xff\xd7\x03#\x03\ +o\xff\x85\x03#\x03q\xff\x85\x03#\x03s\xff\x85\x03\ +#\x03\x8f\xffq\x03$\x00\x05\xff\xec\x03$\x00\x0a\xff\ +\xec\x03$\x02\x07\xff\xec\x03$\x02\x0b\xff\xec\x03%\x00\ +\x05\xffq\x03%\x00\x0a\xffq\x03%\x00&\xff\xd7\x03\ +%\x00*\xff\xd7\x03%\x00-\x01\x0a\x03%\x002\xff\ +\xd7\x03%\x004\xff\xd7\x03%\x007\xffq\x03%\x00\ +9\xff\xae\x03%\x00:\xff\xae\x03%\x00<\xff\x85\x03\ +%\x00\x89\xff\xd7\x03%\x00\x94\xff\xd7\x03%\x00\x95\xff\ +\xd7\x03%\x00\x96\xff\xd7\x03%\x00\x97\xff\xd7\x03%\x00\ +\x98\xff\xd7\x03%\x00\x9a\xff\xd7\x03%\x00\x9f\xff\x85\x03\ +%\x00\xc8\xff\xd7\x03%\x00\xca\xff\xd7\x03%\x00\xcc\xff\ +\xd7\x03%\x00\xce\xff\xd7\x03%\x00\xde\xff\xd7\x03%\x00\ +\xe0\xff\xd7\x03%\x00\xe2\xff\xd7\x03%\x00\xe4\xff\xd7\x03\ +%\x01\x0e\xff\xd7\x03%\x01\x10\xff\xd7\x03%\x01\x12\xff\ +\xd7\x03%\x01\x14\xff\xd7\x03%\x01$\xffq\x03%\x01\ +&\xffq\x03%\x016\xff\xae\x03%\x018\xff\x85\x03\ +%\x01:\xff\x85\x03%\x01G\xff\xd7\x03%\x01\xfa\xff\ +\xae\x03%\x01\xfc\xff\xae\x03%\x01\xfe\xff\xae\x03%\x02\ +\x00\xff\x85\x03%\x02\x07\xffq\x03%\x02\x0b\xffq\x03\ +%\x02_\xff\xd7\x03%\x03I\xff\xd7\x03%\x03K\xff\ +\xd7\x03%\x03M\xff\xd7\x03%\x03O\xff\xd7\x03%\x03\ +Q\xff\xd7\x03%\x03S\xff\xd7\x03%\x03U\xff\xd7\x03\ +%\x03W\xff\xd7\x03%\x03Y\xff\xd7\x03%\x03[\xff\ +\xd7\x03%\x03]\xff\xd7\x03%\x03_\xff\xd7\x03%\x03\ +o\xff\x85\x03%\x03q\xff\x85\x03%\x03s\xff\x85\x03\ +%\x03\x8f\xffq\x03&\x00\x05\xff\xec\x03&\x00\x0a\xff\ +\xec\x03&\x02\x07\xff\xec\x03&\x02\x0b\xff\xec\x03'\x00\ +\x05\xffq\x03'\x00\x0a\xffq\x03'\x00&\xff\xd7\x03\ +'\x00*\xff\xd7\x03'\x00-\x01\x0a\x03'\x002\xff\ +\xd7\x03'\x004\xff\xd7\x03'\x007\xffq\x03'\x00\ +9\xff\xae\x03'\x00:\xff\xae\x03'\x00<\xff\x85\x03\ +'\x00\x89\xff\xd7\x03'\x00\x94\xff\xd7\x03'\x00\x95\xff\ +\xd7\x03'\x00\x96\xff\xd7\x03'\x00\x97\xff\xd7\x03'\x00\ +\x98\xff\xd7\x03'\x00\x9a\xff\xd7\x03'\x00\x9f\xff\x85\x03\ +'\x00\xc8\xff\xd7\x03'\x00\xca\xff\xd7\x03'\x00\xcc\xff\ +\xd7\x03'\x00\xce\xff\xd7\x03'\x00\xde\xff\xd7\x03'\x00\ +\xe0\xff\xd7\x03'\x00\xe2\xff\xd7\x03'\x00\xe4\xff\xd7\x03\ +'\x01\x0e\xff\xd7\x03'\x01\x10\xff\xd7\x03'\x01\x12\xff\ +\xd7\x03'\x01\x14\xff\xd7\x03'\x01$\xffq\x03'\x01\ +&\xffq\x03'\x016\xff\xae\x03'\x018\xff\x85\x03\ +'\x01:\xff\x85\x03'\x01G\xff\xd7\x03'\x01\xfa\xff\ +\xae\x03'\x01\xfc\xff\xae\x03'\x01\xfe\xff\xae\x03'\x02\ +\x00\xff\x85\x03'\x02\x07\xffq\x03'\x02\x0b\xffq\x03\ +'\x02_\xff\xd7\x03'\x03I\xff\xd7\x03'\x03K\xff\ +\xd7\x03'\x03M\xff\xd7\x03'\x03O\xff\xd7\x03'\x03\ +Q\xff\xd7\x03'\x03S\xff\xd7\x03'\x03U\xff\xd7\x03\ +'\x03W\xff\xd7\x03'\x03Y\xff\xd7\x03'\x03[\xff\ +\xd7\x03'\x03]\xff\xd7\x03'\x03_\xff\xd7\x03'\x03\ +o\xff\x85\x03'\x03q\xff\x85\x03'\x03s\xff\x85\x03\ +'\x03\x8f\xffq\x03(\x00\x05\xff\xec\x03(\x00\x0a\xff\ +\xec\x03(\x02\x07\xff\xec\x03(\x02\x0b\xff\xec\x03)\x00\ +\x05\xffq\x03)\x00\x0a\xffq\x03)\x00&\xff\xd7\x03\ +)\x00*\xff\xd7\x03)\x00-\x01\x0a\x03)\x002\xff\ +\xd7\x03)\x004\xff\xd7\x03)\x007\xffq\x03)\x00\ +9\xff\xae\x03)\x00:\xff\xae\x03)\x00<\xff\x85\x03\ +)\x00\x89\xff\xd7\x03)\x00\x94\xff\xd7\x03)\x00\x95\xff\ +\xd7\x03)\x00\x96\xff\xd7\x03)\x00\x97\xff\xd7\x03)\x00\ +\x98\xff\xd7\x03)\x00\x9a\xff\xd7\x03)\x00\x9f\xff\x85\x03\ +)\x00\xc8\xff\xd7\x03)\x00\xca\xff\xd7\x03)\x00\xcc\xff\ +\xd7\x03)\x00\xce\xff\xd7\x03)\x00\xde\xff\xd7\x03)\x00\ +\xe0\xff\xd7\x03)\x00\xe2\xff\xd7\x03)\x00\xe4\xff\xd7\x03\ +)\x01\x0e\xff\xd7\x03)\x01\x10\xff\xd7\x03)\x01\x12\xff\ +\xd7\x03)\x01\x14\xff\xd7\x03)\x01$\xffq\x03)\x01\ +&\xffq\x03)\x016\xff\xae\x03)\x018\xff\x85\x03\ +)\x01:\xff\x85\x03)\x01G\xff\xd7\x03)\x01\xfa\xff\ +\xae\x03)\x01\xfc\xff\xae\x03)\x01\xfe\xff\xae\x03)\x02\ +\x00\xff\x85\x03)\x02\x07\xffq\x03)\x02\x0b\xffq\x03\ +)\x02_\xff\xd7\x03)\x03I\xff\xd7\x03)\x03K\xff\ +\xd7\x03)\x03M\xff\xd7\x03)\x03O\xff\xd7\x03)\x03\ +Q\xff\xd7\x03)\x03S\xff\xd7\x03)\x03U\xff\xd7\x03\ +)\x03W\xff\xd7\x03)\x03Y\xff\xd7\x03)\x03[\xff\ +\xd7\x03)\x03]\xff\xd7\x03)\x03_\xff\xd7\x03)\x03\ +o\xff\x85\x03)\x03q\xff\x85\x03)\x03s\xff\x85\x03\ +)\x03\x8f\xffq\x03*\x00\x05\xff\xec\x03*\x00\x0a\xff\ +\xec\x03*\x02\x07\xff\xec\x03*\x02\x0b\xff\xec\x03+\x00\ +\x05\xffq\x03+\x00\x0a\xffq\x03+\x00&\xff\xd7\x03\ ++\x00*\xff\xd7\x03+\x00-\x01\x0a\x03+\x002\xff\ +\xd7\x03+\x004\xff\xd7\x03+\x007\xffq\x03+\x00\ +9\xff\xae\x03+\x00:\xff\xae\x03+\x00<\xff\x85\x03\ ++\x00\x89\xff\xd7\x03+\x00\x94\xff\xd7\x03+\x00\x95\xff\ +\xd7\x03+\x00\x96\xff\xd7\x03+\x00\x97\xff\xd7\x03+\x00\ +\x98\xff\xd7\x03+\x00\x9a\xff\xd7\x03+\x00\x9f\xff\x85\x03\ ++\x00\xc8\xff\xd7\x03+\x00\xca\xff\xd7\x03+\x00\xcc\xff\ +\xd7\x03+\x00\xce\xff\xd7\x03+\x00\xde\xff\xd7\x03+\x00\ +\xe0\xff\xd7\x03+\x00\xe2\xff\xd7\x03+\x00\xe4\xff\xd7\x03\ ++\x01\x0e\xff\xd7\x03+\x01\x10\xff\xd7\x03+\x01\x12\xff\ +\xd7\x03+\x01\x14\xff\xd7\x03+\x01$\xffq\x03+\x01\ +&\xffq\x03+\x016\xff\xae\x03+\x018\xff\x85\x03\ ++\x01:\xff\x85\x03+\x01G\xff\xd7\x03+\x01\xfa\xff\ +\xae\x03+\x01\xfc\xff\xae\x03+\x01\xfe\xff\xae\x03+\x02\ +\x00\xff\x85\x03+\x02\x07\xffq\x03+\x02\x0b\xffq\x03\ ++\x02_\xff\xd7\x03+\x03I\xff\xd7\x03+\x03K\xff\ +\xd7\x03+\x03M\xff\xd7\x03+\x03O\xff\xd7\x03+\x03\ +Q\xff\xd7\x03+\x03S\xff\xd7\x03+\x03U\xff\xd7\x03\ ++\x03W\xff\xd7\x03+\x03Y\xff\xd7\x03+\x03[\xff\ +\xd7\x03+\x03]\xff\xd7\x03+\x03_\xff\xd7\x03+\x03\ +o\xff\x85\x03+\x03q\xff\x85\x03+\x03s\xff\x85\x03\ ++\x03\x8f\xffq\x03,\x00\x05\xff\xec\x03,\x00\x0a\xff\ +\xec\x03,\x02\x07\xff\xec\x03,\x02\x0b\xff\xec\x03-\x00\ +\x05\xffq\x03-\x00\x0a\xffq\x03-\x00&\xff\xd7\x03\ +-\x00*\xff\xd7\x03-\x00-\x01\x0a\x03-\x002\xff\ +\xd7\x03-\x004\xff\xd7\x03-\x007\xffq\x03-\x00\ +9\xff\xae\x03-\x00:\xff\xae\x03-\x00<\xff\x85\x03\ +-\x00\x89\xff\xd7\x03-\x00\x94\xff\xd7\x03-\x00\x95\xff\ +\xd7\x03-\x00\x96\xff\xd7\x03-\x00\x97\xff\xd7\x03-\x00\ +\x98\xff\xd7\x03-\x00\x9a\xff\xd7\x03-\x00\x9f\xff\x85\x03\ +-\x00\xc8\xff\xd7\x03-\x00\xca\xff\xd7\x03-\x00\xcc\xff\ +\xd7\x03-\x00\xce\xff\xd7\x03-\x00\xde\xff\xd7\x03-\x00\ +\xe0\xff\xd7\x03-\x00\xe2\xff\xd7\x03-\x00\xe4\xff\xd7\x03\ +-\x01\x0e\xff\xd7\x03-\x01\x10\xff\xd7\x03-\x01\x12\xff\ +\xd7\x03-\x01\x14\xff\xd7\x03-\x01$\xffq\x03-\x01\ +&\xffq\x03-\x016\xff\xae\x03-\x018\xff\x85\x03\ +-\x01:\xff\x85\x03-\x01G\xff\xd7\x03-\x01\xfa\xff\ +\xae\x03-\x01\xfc\xff\xae\x03-\x01\xfe\xff\xae\x03-\x02\ +\x00\xff\x85\x03-\x02\x07\xffq\x03-\x02\x0b\xffq\x03\ +-\x02_\xff\xd7\x03-\x03I\xff\xd7\x03-\x03K\xff\ +\xd7\x03-\x03M\xff\xd7\x03-\x03O\xff\xd7\x03-\x03\ +Q\xff\xd7\x03-\x03S\xff\xd7\x03-\x03U\xff\xd7\x03\ +-\x03W\xff\xd7\x03-\x03Y\xff\xd7\x03-\x03[\xff\ +\xd7\x03-\x03]\xff\xd7\x03-\x03_\xff\xd7\x03-\x03\ +o\xff\x85\x03-\x03q\xff\x85\x03-\x03s\xff\x85\x03\ +-\x03\x8f\xffq\x03.\x00\x05\xff\xec\x03.\x00\x0a\xff\ +\xec\x03.\x02\x07\xff\xec\x03.\x02\x0b\xff\xec\x03/\x00\ +\x05\xffq\x03/\x00\x0a\xffq\x03/\x00&\xff\xd7\x03\ +/\x00*\xff\xd7\x03/\x00-\x01\x0a\x03/\x002\xff\ +\xd7\x03/\x004\xff\xd7\x03/\x007\xffq\x03/\x00\ +9\xff\xae\x03/\x00:\xff\xae\x03/\x00<\xff\x85\x03\ +/\x00\x89\xff\xd7\x03/\x00\x94\xff\xd7\x03/\x00\x95\xff\ +\xd7\x03/\x00\x96\xff\xd7\x03/\x00\x97\xff\xd7\x03/\x00\ +\x98\xff\xd7\x03/\x00\x9a\xff\xd7\x03/\x00\x9f\xff\x85\x03\ +/\x00\xc8\xff\xd7\x03/\x00\xca\xff\xd7\x03/\x00\xcc\xff\ +\xd7\x03/\x00\xce\xff\xd7\x03/\x00\xde\xff\xd7\x03/\x00\ +\xe0\xff\xd7\x03/\x00\xe2\xff\xd7\x03/\x00\xe4\xff\xd7\x03\ +/\x01\x0e\xff\xd7\x03/\x01\x10\xff\xd7\x03/\x01\x12\xff\ +\xd7\x03/\x01\x14\xff\xd7\x03/\x01$\xffq\x03/\x01\ +&\xffq\x03/\x016\xff\xae\x03/\x018\xff\x85\x03\ +/\x01:\xff\x85\x03/\x01G\xff\xd7\x03/\x01\xfa\xff\ +\xae\x03/\x01\xfc\xff\xae\x03/\x01\xfe\xff\xae\x03/\x02\ +\x00\xff\x85\x03/\x02\x07\xffq\x03/\x02\x0b\xffq\x03\ +/\x02_\xff\xd7\x03/\x03I\xff\xd7\x03/\x03K\xff\ +\xd7\x03/\x03M\xff\xd7\x03/\x03O\xff\xd7\x03/\x03\ +Q\xff\xd7\x03/\x03S\xff\xd7\x03/\x03U\xff\xd7\x03\ +/\x03W\xff\xd7\x03/\x03Y\xff\xd7\x03/\x03[\xff\ +\xd7\x03/\x03]\xff\xd7\x03/\x03_\xff\xd7\x03/\x03\ +o\xff\x85\x03/\x03q\xff\x85\x03/\x03s\xff\x85\x03\ +/\x03\x8f\xffq\x030\x00\x05\xff\xec\x030\x00\x0a\xff\ +\xec\x030\x02\x07\xff\xec\x030\x02\x0b\xff\xec\x031\x00\ +\x05\xffq\x031\x00\x0a\xffq\x031\x00&\xff\xd7\x03\ +1\x00*\xff\xd7\x031\x00-\x01\x0a\x031\x002\xff\ +\xd7\x031\x004\xff\xd7\x031\x007\xffq\x031\x00\ +9\xff\xae\x031\x00:\xff\xae\x031\x00<\xff\x85\x03\ +1\x00\x89\xff\xd7\x031\x00\x94\xff\xd7\x031\x00\x95\xff\ +\xd7\x031\x00\x96\xff\xd7\x031\x00\x97\xff\xd7\x031\x00\ +\x98\xff\xd7\x031\x00\x9a\xff\xd7\x031\x00\x9f\xff\x85\x03\ +1\x00\xc8\xff\xd7\x031\x00\xca\xff\xd7\x031\x00\xcc\xff\ +\xd7\x031\x00\xce\xff\xd7\x031\x00\xde\xff\xd7\x031\x00\ +\xe0\xff\xd7\x031\x00\xe2\xff\xd7\x031\x00\xe4\xff\xd7\x03\ +1\x01\x0e\xff\xd7\x031\x01\x10\xff\xd7\x031\x01\x12\xff\ +\xd7\x031\x01\x14\xff\xd7\x031\x01$\xffq\x031\x01\ +&\xffq\x031\x016\xff\xae\x031\x018\xff\x85\x03\ +1\x01:\xff\x85\x031\x01G\xff\xd7\x031\x01\xfa\xff\ +\xae\x031\x01\xfc\xff\xae\x031\x01\xfe\xff\xae\x031\x02\ +\x00\xff\x85\x031\x02\x07\xffq\x031\x02\x0b\xffq\x03\ +1\x02_\xff\xd7\x031\x03I\xff\xd7\x031\x03K\xff\ +\xd7\x031\x03M\xff\xd7\x031\x03O\xff\xd7\x031\x03\ +Q\xff\xd7\x031\x03S\xff\xd7\x031\x03U\xff\xd7\x03\ +1\x03W\xff\xd7\x031\x03Y\xff\xd7\x031\x03[\xff\ +\xd7\x031\x03]\xff\xd7\x031\x03_\xff\xd7\x031\x03\ +o\xff\x85\x031\x03q\xff\x85\x031\x03s\xff\x85\x03\ +1\x03\x8f\xffq\x032\x00\x05\xff\xec\x032\x00\x0a\xff\ +\xec\x032\x02\x07\xff\xec\x032\x02\x0b\xff\xec\x033\x00\ +\x05\xffq\x033\x00\x0a\xffq\x033\x00&\xff\xd7\x03\ +3\x00*\xff\xd7\x033\x00-\x01\x0a\x033\x002\xff\ +\xd7\x033\x004\xff\xd7\x033\x007\xffq\x033\x00\ +9\xff\xae\x033\x00:\xff\xae\x033\x00<\xff\x85\x03\ +3\x00\x89\xff\xd7\x033\x00\x94\xff\xd7\x033\x00\x95\xff\ +\xd7\x033\x00\x96\xff\xd7\x033\x00\x97\xff\xd7\x033\x00\ +\x98\xff\xd7\x033\x00\x9a\xff\xd7\x033\x00\x9f\xff\x85\x03\ +3\x00\xc8\xff\xd7\x033\x00\xca\xff\xd7\x033\x00\xcc\xff\ +\xd7\x033\x00\xce\xff\xd7\x033\x00\xde\xff\xd7\x033\x00\ +\xe0\xff\xd7\x033\x00\xe2\xff\xd7\x033\x00\xe4\xff\xd7\x03\ +3\x01\x0e\xff\xd7\x033\x01\x10\xff\xd7\x033\x01\x12\xff\ +\xd7\x033\x01\x14\xff\xd7\x033\x01$\xffq\x033\x01\ +&\xffq\x033\x016\xff\xae\x033\x018\xff\x85\x03\ +3\x01:\xff\x85\x033\x01G\xff\xd7\x033\x01\xfa\xff\ +\xae\x033\x01\xfc\xff\xae\x033\x01\xfe\xff\xae\x033\x02\ +\x00\xff\x85\x033\x02\x07\xffq\x033\x02\x0b\xffq\x03\ +3\x02_\xff\xd7\x033\x03I\xff\xd7\x033\x03K\xff\ +\xd7\x033\x03M\xff\xd7\x033\x03O\xff\xd7\x033\x03\ +Q\xff\xd7\x033\x03S\xff\xd7\x033\x03U\xff\xd7\x03\ +3\x03W\xff\xd7\x033\x03Y\xff\xd7\x033\x03[\xff\ +\xd7\x033\x03]\xff\xd7\x033\x03_\xff\xd7\x033\x03\ +o\xff\x85\x033\x03q\xff\x85\x033\x03s\xff\x85\x03\ +3\x03\x8f\xffq\x034\x00\x05\xff\xec\x034\x00\x0a\xff\ +\xec\x034\x02\x07\xff\xec\x034\x02\x0b\xff\xec\x035\x00\ +-\x00{\x036\x00\x05\xff\xec\x036\x00\x0a\xff\xec\x03\ +6\x00Y\xff\xd7\x036\x00Z\xff\xd7\x036\x00[\xff\ +\xd7\x036\x00\x5c\xff\xd7\x036\x00]\xff\xec\x036\x00\ +\xbf\xff\xd7\x036\x017\xff\xd7\x036\x01<\xff\xec\x03\ +6\x01>\xff\xec\x036\x01@\xff\xec\x036\x01\xfb\xff\ +\xd7\x036\x01\xfd\xff\xd7\x036\x02\x07\xff\xec\x036\x02\ +\x0b\xff\xec\x036\x03p\xff\xd7\x037\x00-\x00{\x03\ +8\x00\x05\xff\xec\x038\x00\x0a\xff\xec\x038\x00Y\xff\ +\xd7\x038\x00Z\xff\xd7\x038\x00[\xff\xd7\x038\x00\ +\x5c\xff\xd7\x038\x00]\xff\xec\x038\x00\xbf\xff\xd7\x03\ +8\x017\xff\xd7\x038\x01<\xff\xec\x038\x01>\xff\ +\xec\x038\x01@\xff\xec\x038\x01\xfb\xff\xd7\x038\x01\ +\xfd\xff\xd7\x038\x02\x07\xff\xec\x038\x02\x0b\xff\xec\x03\ +8\x03p\xff\xd7\x039\x00-\x00{\x03:\x00\x05\xff\ +\xec\x03:\x00\x0a\xff\xec\x03:\x00Y\xff\xd7\x03:\x00\ +Z\xff\xd7\x03:\x00[\xff\xd7\x03:\x00\x5c\xff\xd7\x03\ +:\x00]\xff\xec\x03:\x00\xbf\xff\xd7\x03:\x017\xff\ +\xd7\x03:\x01<\xff\xec\x03:\x01>\xff\xec\x03:\x01\ +@\xff\xec\x03:\x01\xfb\xff\xd7\x03:\x01\xfd\xff\xd7\x03\ +:\x02\x07\xff\xec\x03:\x02\x0b\xff\xec\x03:\x03p\xff\ +\xd7\x03;\x00-\x00{\x03<\x00\x05\xff\xec\x03<\x00\ +\x0a\xff\xec\x03<\x00Y\xff\xd7\x03<\x00Z\xff\xd7\x03\ +<\x00[\xff\xd7\x03<\x00\x5c\xff\xd7\x03<\x00]\xff\ +\xec\x03<\x00\xbf\xff\xd7\x03<\x017\xff\xd7\x03<\x01\ +<\xff\xec\x03<\x01>\xff\xec\x03<\x01@\xff\xec\x03\ +<\x01\xfb\xff\xd7\x03<\x01\xfd\xff\xd7\x03<\x02\x07\xff\ +\xec\x03<\x02\x0b\xff\xec\x03<\x03p\xff\xd7\x03=\x00\ +-\x00{\x03>\x00\x05\xff\xec\x03>\x00\x0a\xff\xec\x03\ +>\x00Y\xff\xd7\x03>\x00Z\xff\xd7\x03>\x00[\xff\ +\xd7\x03>\x00\x5c\xff\xd7\x03>\x00]\xff\xec\x03>\x00\ +\xbf\xff\xd7\x03>\x017\xff\xd7\x03>\x01<\xff\xec\x03\ +>\x01>\xff\xec\x03>\x01@\xff\xec\x03>\x01\xfb\xff\ +\xd7\x03>\x01\xfd\xff\xd7\x03>\x02\x07\xff\xec\x03>\x02\ +\x0b\xff\xec\x03>\x03p\xff\xd7\x03?\x00-\x00{\x03\ +@\x00\x05\xff\xec\x03@\x00\x0a\xff\xec\x03@\x00Y\xff\ +\xd7\x03@\x00Z\xff\xd7\x03@\x00[\xff\xd7\x03@\x00\ +\x5c\xff\xd7\x03@\x00]\xff\xec\x03@\x00\xbf\xff\xd7\x03\ +@\x017\xff\xd7\x03@\x01<\xff\xec\x03@\x01>\xff\ +\xec\x03@\x01@\xff\xec\x03@\x01\xfb\xff\xd7\x03@\x01\ +\xfd\xff\xd7\x03@\x02\x07\xff\xec\x03@\x02\x0b\xff\xec\x03\ +@\x03p\xff\xd7\x03A\x00-\x00{\x03B\x00\x05\xff\ +\xec\x03B\x00\x0a\xff\xec\x03B\x00Y\xff\xd7\x03B\x00\ +Z\xff\xd7\x03B\x00[\xff\xd7\x03B\x00\x5c\xff\xd7\x03\ +B\x00]\xff\xec\x03B\x00\xbf\xff\xd7\x03B\x017\xff\ +\xd7\x03B\x01<\xff\xec\x03B\x01>\xff\xec\x03B\x01\ +@\xff\xec\x03B\x01\xfb\xff\xd7\x03B\x01\xfd\xff\xd7\x03\ +B\x02\x07\xff\xec\x03B\x02\x0b\xff\xec\x03B\x03p\xff\ +\xd7\x03C\x00-\x00{\x03D\x00\x05\xff\xec\x03D\x00\ +\x0a\xff\xec\x03D\x00Y\xff\xd7\x03D\x00Z\xff\xd7\x03\ +D\x00[\xff\xd7\x03D\x00\x5c\xff\xd7\x03D\x00]\xff\ +\xec\x03D\x00\xbf\xff\xd7\x03D\x017\xff\xd7\x03D\x01\ +<\xff\xec\x03D\x01>\xff\xec\x03D\x01@\xff\xec\x03\ +D\x01\xfb\xff\xd7\x03D\x01\xfd\xff\xd7\x03D\x02\x07\xff\ +\xec\x03D\x02\x0b\xff\xec\x03D\x03p\xff\xd7\x03I\x00\ +\x0f\xff\xae\x03I\x00\x11\xff\xae\x03I\x00$\xff\xd7\x03\ +I\x007\xff\xc3\x03I\x009\xff\xec\x03I\x00:\xff\ +\xec\x03I\x00;\xff\xd7\x03I\x00<\xff\xec\x03I\x00\ +=\xff\xec\x03I\x00\x82\xff\xd7\x03I\x00\x83\xff\xd7\x03\ +I\x00\x84\xff\xd7\x03I\x00\x85\xff\xd7\x03I\x00\x86\xff\ +\xd7\x03I\x00\x87\xff\xd7\x03I\x00\x9f\xff\xec\x03I\x00\ +\xc2\xff\xd7\x03I\x00\xc4\xff\xd7\x03I\x00\xc6\xff\xd7\x03\ +I\x01$\xff\xc3\x03I\x01&\xff\xc3\x03I\x016\xff\ +\xec\x03I\x018\xff\xec\x03I\x01:\xff\xec\x03I\x01\ +;\xff\xec\x03I\x01=\xff\xec\x03I\x01?\xff\xec\x03\ +I\x01C\xff\xd7\x03I\x01\xa0\xff\xec\x03I\x01\xfa\xff\ +\xec\x03I\x01\xfc\xff\xec\x03I\x01\xfe\xff\xec\x03I\x02\ +\x00\xff\xec\x03I\x02\x08\xff\xae\x03I\x02\x0c\xff\xae\x03\ +I\x02X\xff\xd7\x03I\x03\x1d\xff\xd7\x03I\x03\x1f\xff\ +\xd7\x03I\x03!\xff\xd7\x03I\x03#\xff\xd7\x03I\x03\ +%\xff\xd7\x03I\x03'\xff\xd7\x03I\x03)\xff\xd7\x03\ +I\x03+\xff\xd7\x03I\x03-\xff\xd7\x03I\x03/\xff\ +\xd7\x03I\x031\xff\xd7\x03I\x033\xff\xd7\x03I\x03\ +o\xff\xec\x03I\x03q\xff\xec\x03I\x03s\xff\xec\x03\ +I\x03\x8f\xff\xc3\x03J\x00\x05\xff\xec\x03J\x00\x0a\xff\ +\xec\x03J\x00Y\xff\xd7\x03J\x00Z\xff\xd7\x03J\x00\ +[\xff\xd7\x03J\x00\x5c\xff\xd7\x03J\x00]\xff\xec\x03\ +J\x00\xbf\xff\xd7\x03J\x017\xff\xd7\x03J\x01<\xff\ +\xec\x03J\x01>\xff\xec\x03J\x01@\xff\xec\x03J\x01\ +\xfb\xff\xd7\x03J\x01\xfd\xff\xd7\x03J\x02\x07\xff\xec\x03\ +J\x02\x0b\xff\xec\x03J\x03p\xff\xd7\x03K\x00\x0f\xff\ +\xae\x03K\x00\x11\xff\xae\x03K\x00$\xff\xd7\x03K\x00\ +7\xff\xc3\x03K\x009\xff\xec\x03K\x00:\xff\xec\x03\ +K\x00;\xff\xd7\x03K\x00<\xff\xec\x03K\x00=\xff\ +\xec\x03K\x00\x82\xff\xd7\x03K\x00\x83\xff\xd7\x03K\x00\ +\x84\xff\xd7\x03K\x00\x85\xff\xd7\x03K\x00\x86\xff\xd7\x03\ +K\x00\x87\xff\xd7\x03K\x00\x9f\xff\xec\x03K\x00\xc2\xff\ +\xd7\x03K\x00\xc4\xff\xd7\x03K\x00\xc6\xff\xd7\x03K\x01\ +$\xff\xc3\x03K\x01&\xff\xc3\x03K\x016\xff\xec\x03\ +K\x018\xff\xec\x03K\x01:\xff\xec\x03K\x01;\xff\ +\xec\x03K\x01=\xff\xec\x03K\x01?\xff\xec\x03K\x01\ +C\xff\xd7\x03K\x01\xa0\xff\xec\x03K\x01\xfa\xff\xec\x03\ +K\x01\xfc\xff\xec\x03K\x01\xfe\xff\xec\x03K\x02\x00\xff\ +\xec\x03K\x02\x08\xff\xae\x03K\x02\x0c\xff\xae\x03K\x02\ +X\xff\xd7\x03K\x03\x1d\xff\xd7\x03K\x03\x1f\xff\xd7\x03\ +K\x03!\xff\xd7\x03K\x03#\xff\xd7\x03K\x03%\xff\ +\xd7\x03K\x03'\xff\xd7\x03K\x03)\xff\xd7\x03K\x03\ ++\xff\xd7\x03K\x03-\xff\xd7\x03K\x03/\xff\xd7\x03\ +K\x031\xff\xd7\x03K\x033\xff\xd7\x03K\x03o\xff\ +\xec\x03K\x03q\xff\xec\x03K\x03s\xff\xec\x03K\x03\ +\x8f\xff\xc3\x03L\x00\x05\xff\xec\x03L\x00\x0a\xff\xec\x03\ +L\x00Y\xff\xd7\x03L\x00Z\xff\xd7\x03L\x00[\xff\ +\xd7\x03L\x00\x5c\xff\xd7\x03L\x00]\xff\xec\x03L\x00\ +\xbf\xff\xd7\x03L\x017\xff\xd7\x03L\x01<\xff\xec\x03\ +L\x01>\xff\xec\x03L\x01@\xff\xec\x03L\x01\xfb\xff\ +\xd7\x03L\x01\xfd\xff\xd7\x03L\x02\x07\xff\xec\x03L\x02\ +\x0b\xff\xec\x03L\x03p\xff\xd7\x03M\x00\x0f\xff\xae\x03\ +M\x00\x11\xff\xae\x03M\x00$\xff\xd7\x03M\x007\xff\ +\xc3\x03M\x009\xff\xec\x03M\x00:\xff\xec\x03M\x00\ +;\xff\xd7\x03M\x00<\xff\xec\x03M\x00=\xff\xec\x03\ +M\x00\x82\xff\xd7\x03M\x00\x83\xff\xd7\x03M\x00\x84\xff\ +\xd7\x03M\x00\x85\xff\xd7\x03M\x00\x86\xff\xd7\x03M\x00\ +\x87\xff\xd7\x03M\x00\x9f\xff\xec\x03M\x00\xc2\xff\xd7\x03\ +M\x00\xc4\xff\xd7\x03M\x00\xc6\xff\xd7\x03M\x01$\xff\ +\xc3\x03M\x01&\xff\xc3\x03M\x016\xff\xec\x03M\x01\ +8\xff\xec\x03M\x01:\xff\xec\x03M\x01;\xff\xec\x03\ +M\x01=\xff\xec\x03M\x01?\xff\xec\x03M\x01C\xff\ +\xd7\x03M\x01\xa0\xff\xec\x03M\x01\xfa\xff\xec\x03M\x01\ +\xfc\xff\xec\x03M\x01\xfe\xff\xec\x03M\x02\x00\xff\xec\x03\ +M\x02\x08\xff\xae\x03M\x02\x0c\xff\xae\x03M\x02X\xff\ +\xd7\x03M\x03\x1d\xff\xd7\x03M\x03\x1f\xff\xd7\x03M\x03\ +!\xff\xd7\x03M\x03#\xff\xd7\x03M\x03%\xff\xd7\x03\ +M\x03'\xff\xd7\x03M\x03)\xff\xd7\x03M\x03+\xff\ +\xd7\x03M\x03-\xff\xd7\x03M\x03/\xff\xd7\x03M\x03\ +1\xff\xd7\x03M\x033\xff\xd7\x03M\x03o\xff\xec\x03\ +M\x03q\xff\xec\x03M\x03s\xff\xec\x03M\x03\x8f\xff\ +\xc3\x03O\x00\x0f\xff\xae\x03O\x00\x11\xff\xae\x03O\x00\ +$\xff\xd7\x03O\x007\xff\xc3\x03O\x009\xff\xec\x03\ +O\x00:\xff\xec\x03O\x00;\xff\xd7\x03O\x00<\xff\ +\xec\x03O\x00=\xff\xec\x03O\x00\x82\xff\xd7\x03O\x00\ +\x83\xff\xd7\x03O\x00\x84\xff\xd7\x03O\x00\x85\xff\xd7\x03\ +O\x00\x86\xff\xd7\x03O\x00\x87\xff\xd7\x03O\x00\x9f\xff\ +\xec\x03O\x00\xc2\xff\xd7\x03O\x00\xc4\xff\xd7\x03O\x00\ +\xc6\xff\xd7\x03O\x01$\xff\xc3\x03O\x01&\xff\xc3\x03\ +O\x016\xff\xec\x03O\x018\xff\xec\x03O\x01:\xff\ +\xec\x03O\x01;\xff\xec\x03O\x01=\xff\xec\x03O\x01\ +?\xff\xec\x03O\x01C\xff\xd7\x03O\x01\xa0\xff\xec\x03\ +O\x01\xfa\xff\xec\x03O\x01\xfc\xff\xec\x03O\x01\xfe\xff\ +\xec\x03O\x02\x00\xff\xec\x03O\x02\x08\xff\xae\x03O\x02\ +\x0c\xff\xae\x03O\x02X\xff\xd7\x03O\x03\x1d\xff\xd7\x03\ +O\x03\x1f\xff\xd7\x03O\x03!\xff\xd7\x03O\x03#\xff\ +\xd7\x03O\x03%\xff\xd7\x03O\x03'\xff\xd7\x03O\x03\ +)\xff\xd7\x03O\x03+\xff\xd7\x03O\x03-\xff\xd7\x03\ +O\x03/\xff\xd7\x03O\x031\xff\xd7\x03O\x033\xff\ +\xd7\x03O\x03o\xff\xec\x03O\x03q\xff\xec\x03O\x03\ +s\xff\xec\x03O\x03\x8f\xff\xc3\x03Q\x00\x0f\xff\xae\x03\ +Q\x00\x11\xff\xae\x03Q\x00$\xff\xd7\x03Q\x007\xff\ +\xc3\x03Q\x009\xff\xec\x03Q\x00:\xff\xec\x03Q\x00\ +;\xff\xd7\x03Q\x00<\xff\xec\x03Q\x00=\xff\xec\x03\ +Q\x00\x82\xff\xd7\x03Q\x00\x83\xff\xd7\x03Q\x00\x84\xff\ +\xd7\x03Q\x00\x85\xff\xd7\x03Q\x00\x86\xff\xd7\x03Q\x00\ +\x87\xff\xd7\x03Q\x00\x9f\xff\xec\x03Q\x00\xc2\xff\xd7\x03\ +Q\x00\xc4\xff\xd7\x03Q\x00\xc6\xff\xd7\x03Q\x01$\xff\ +\xc3\x03Q\x01&\xff\xc3\x03Q\x016\xff\xec\x03Q\x01\ +8\xff\xec\x03Q\x01:\xff\xec\x03Q\x01;\xff\xec\x03\ +Q\x01=\xff\xec\x03Q\x01?\xff\xec\x03Q\x01C\xff\ +\xd7\x03Q\x01\xa0\xff\xec\x03Q\x01\xfa\xff\xec\x03Q\x01\ +\xfc\xff\xec\x03Q\x01\xfe\xff\xec\x03Q\x02\x00\xff\xec\x03\ +Q\x02\x08\xff\xae\x03Q\x02\x0c\xff\xae\x03Q\x02X\xff\ +\xd7\x03Q\x03\x1d\xff\xd7\x03Q\x03\x1f\xff\xd7\x03Q\x03\ +!\xff\xd7\x03Q\x03#\xff\xd7\x03Q\x03%\xff\xd7\x03\ +Q\x03'\xff\xd7\x03Q\x03)\xff\xd7\x03Q\x03+\xff\ +\xd7\x03Q\x03-\xff\xd7\x03Q\x03/\xff\xd7\x03Q\x03\ +1\xff\xd7\x03Q\x033\xff\xd7\x03Q\x03o\xff\xec\x03\ +Q\x03q\xff\xec\x03Q\x03s\xff\xec\x03Q\x03\x8f\xff\ +\xc3\x03S\x00\x0f\xff\xae\x03S\x00\x11\xff\xae\x03S\x00\ +$\xff\xd7\x03S\x007\xff\xc3\x03S\x009\xff\xec\x03\ +S\x00:\xff\xec\x03S\x00;\xff\xd7\x03S\x00<\xff\ +\xec\x03S\x00=\xff\xec\x03S\x00\x82\xff\xd7\x03S\x00\ +\x83\xff\xd7\x03S\x00\x84\xff\xd7\x03S\x00\x85\xff\xd7\x03\ +S\x00\x86\xff\xd7\x03S\x00\x87\xff\xd7\x03S\x00\x9f\xff\ +\xec\x03S\x00\xc2\xff\xd7\x03S\x00\xc4\xff\xd7\x03S\x00\ +\xc6\xff\xd7\x03S\x01$\xff\xc3\x03S\x01&\xff\xc3\x03\ +S\x016\xff\xec\x03S\x018\xff\xec\x03S\x01:\xff\ +\xec\x03S\x01;\xff\xec\x03S\x01=\xff\xec\x03S\x01\ +?\xff\xec\x03S\x01C\xff\xd7\x03S\x01\xa0\xff\xec\x03\ +S\x01\xfa\xff\xec\x03S\x01\xfc\xff\xec\x03S\x01\xfe\xff\ +\xec\x03S\x02\x00\xff\xec\x03S\x02\x08\xff\xae\x03S\x02\ +\x0c\xff\xae\x03S\x02X\xff\xd7\x03S\x03\x1d\xff\xd7\x03\ +S\x03\x1f\xff\xd7\x03S\x03!\xff\xd7\x03S\x03#\xff\ +\xd7\x03S\x03%\xff\xd7\x03S\x03'\xff\xd7\x03S\x03\ +)\xff\xd7\x03S\x03+\xff\xd7\x03S\x03-\xff\xd7\x03\ +S\x03/\xff\xd7\x03S\x031\xff\xd7\x03S\x033\xff\ +\xd7\x03S\x03o\xff\xec\x03S\x03q\xff\xec\x03S\x03\ +s\xff\xec\x03S\x03\x8f\xff\xc3\x03U\x00\x0f\xff\xae\x03\ +U\x00\x11\xff\xae\x03U\x00$\xff\xd7\x03U\x007\xff\ +\xc3\x03U\x009\xff\xec\x03U\x00:\xff\xec\x03U\x00\ +;\xff\xd7\x03U\x00<\xff\xec\x03U\x00=\xff\xec\x03\ +U\x00\x82\xff\xd7\x03U\x00\x83\xff\xd7\x03U\x00\x84\xff\ +\xd7\x03U\x00\x85\xff\xd7\x03U\x00\x86\xff\xd7\x03U\x00\ +\x87\xff\xd7\x03U\x00\x9f\xff\xec\x03U\x00\xc2\xff\xd7\x03\ +U\x00\xc4\xff\xd7\x03U\x00\xc6\xff\xd7\x03U\x01$\xff\ +\xc3\x03U\x01&\xff\xc3\x03U\x016\xff\xec\x03U\x01\ +8\xff\xec\x03U\x01:\xff\xec\x03U\x01;\xff\xec\x03\ +U\x01=\xff\xec\x03U\x01?\xff\xec\x03U\x01C\xff\ +\xd7\x03U\x01\xa0\xff\xec\x03U\x01\xfa\xff\xec\x03U\x01\ +\xfc\xff\xec\x03U\x01\xfe\xff\xec\x03U\x02\x00\xff\xec\x03\ +U\x02\x08\xff\xae\x03U\x02\x0c\xff\xae\x03U\x02X\xff\ +\xd7\x03U\x03\x1d\xff\xd7\x03U\x03\x1f\xff\xd7\x03U\x03\ +!\xff\xd7\x03U\x03#\xff\xd7\x03U\x03%\xff\xd7\x03\ +U\x03'\xff\xd7\x03U\x03)\xff\xd7\x03U\x03+\xff\ +\xd7\x03U\x03-\xff\xd7\x03U\x03/\xff\xd7\x03U\x03\ +1\xff\xd7\x03U\x033\xff\xd7\x03U\x03o\xff\xec\x03\ +U\x03q\xff\xec\x03U\x03s\xff\xec\x03U\x03\x8f\xff\ +\xc3\x03X\x00I\x00R\x03X\x00W\x00R\x03X\x00\ +Y\x00f\x03X\x00Z\x00f\x03X\x00[\x00f\x03\ +X\x00\x5c\x00f\x03X\x00\xbf\x00f\x03X\x01%\x00\ +R\x03X\x01'\x00R\x03X\x017\x00f\x03X\x01\ +\xfb\x00f\x03X\x01\xfd\x00f\x03X\x024\x00R\x03\ +X\x025\x00R\x03X\x02]\x00R\x03X\x02^\x00\ +R\x03X\x03p\x00f\x03X\x03\x8d\x00R\x03X\x03\ +\x90\x00R\x03Z\x00I\x00R\x03Z\x00W\x00R\x03\ +Z\x00Y\x00f\x03Z\x00Z\x00f\x03Z\x00[\x00\ +f\x03Z\x00\x5c\x00f\x03Z\x00\xbf\x00f\x03Z\x01\ +%\x00R\x03Z\x01'\x00R\x03Z\x017\x00f\x03\ +Z\x01\xfb\x00f\x03Z\x01\xfd\x00f\x03Z\x024\x00\ +R\x03Z\x025\x00R\x03Z\x02]\x00R\x03Z\x02\ +^\x00R\x03Z\x03p\x00f\x03Z\x03\x8d\x00R\x03\ +Z\x03\x90\x00R\x03\x5c\x00I\x00R\x03\x5c\x00W\x00\ +R\x03\x5c\x00Y\x00f\x03\x5c\x00Z\x00f\x03\x5c\x00\ +[\x00f\x03\x5c\x00\x5c\x00f\x03\x5c\x00\xbf\x00f\x03\ +\x5c\x01%\x00R\x03\x5c\x01'\x00R\x03\x5c\x017\x00\ +f\x03\x5c\x01\xfb\x00f\x03\x5c\x01\xfd\x00f\x03\x5c\x02\ +4\x00R\x03\x5c\x025\x00R\x03\x5c\x02]\x00R\x03\ +\x5c\x02^\x00R\x03\x5c\x03p\x00f\x03\x5c\x03\x8d\x00\ +R\x03\x5c\x03\x90\x00R\x03^\x00I\x00R\x03^\x00\ +W\x00R\x03^\x00Y\x00f\x03^\x00Z\x00f\x03\ +^\x00[\x00f\x03^\x00\x5c\x00f\x03^\x00\xbf\x00\ +f\x03^\x01%\x00R\x03^\x01'\x00R\x03^\x01\ +7\x00f\x03^\x01\xfb\x00f\x03^\x01\xfd\x00f\x03\ +^\x024\x00R\x03^\x025\x00R\x03^\x02]\x00\ +R\x03^\x02^\x00R\x03^\x03p\x00f\x03^\x03\ +\x8d\x00R\x03^\x03\x90\x00R\x03`\x00I\x00R\x03\ +`\x00W\x00R\x03`\x00Y\x00f\x03`\x00Z\x00\ +f\x03`\x00[\x00f\x03`\x00\x5c\x00f\x03`\x00\ +\xbf\x00f\x03`\x01%\x00R\x03`\x01'\x00R\x03\ +`\x017\x00f\x03`\x01\xfb\x00f\x03`\x01\xfd\x00\ +f\x03`\x024\x00R\x03`\x025\x00R\x03`\x02\ +]\x00R\x03`\x02^\x00R\x03`\x03p\x00f\x03\ +`\x03\x8d\x00R\x03`\x03\x90\x00R\x03a\x00\x0f\xff\ +\xd7\x03a\x00\x11\xff\xd7\x03a\x00$\xff\xec\x03a\x00\ +\x82\xff\xec\x03a\x00\x83\xff\xec\x03a\x00\x84\xff\xec\x03\ +a\x00\x85\xff\xec\x03a\x00\x86\xff\xec\x03a\x00\x87\xff\ +\xec\x03a\x00\xc2\xff\xec\x03a\x00\xc4\xff\xec\x03a\x00\ +\xc6\xff\xec\x03a\x01C\xff\xec\x03a\x02\x08\xff\xd7\x03\ +a\x02\x0c\xff\xd7\x03a\x02X\xff\xec\x03a\x03\x1d\xff\ +\xec\x03a\x03\x1f\xff\xec\x03a\x03!\xff\xec\x03a\x03\ +#\xff\xec\x03a\x03%\xff\xec\x03a\x03'\xff\xec\x03\ +a\x03)\xff\xec\x03a\x03+\xff\xec\x03a\x03-\xff\ +\xec\x03a\x03/\xff\xec\x03a\x031\xff\xec\x03a\x03\ +3\xff\xec\x03f\x00I\x00f\x03f\x00W\x00f\x03\ +f\x00Y\x00f\x03f\x00Z\x00f\x03f\x00[\x00\ +f\x03f\x00\x5c\x00f\x03f\x00\xbf\x00f\x03f\x01\ +%\x00f\x03f\x01'\x00f\x03f\x017\x00f\x03\ +f\x01\xfb\x00f\x03f\x01\xfd\x00f\x03f\x024\x00\ +f\x03f\x025\x00f\x03f\x02]\x00f\x03f\x02\ +^\x00f\x03f\x03p\x00f\x03f\x03\x8d\x00f\x03\ +f\x03\x90\x00f\x03h\x00I\x00f\x03h\x00W\x00\ +f\x03h\x00Y\x00f\x03h\x00Z\x00f\x03h\x00\ +[\x00f\x03h\x00\x5c\x00f\x03h\x00\xbf\x00f\x03\ +h\x01%\x00f\x03h\x01'\x00f\x03h\x017\x00\ +f\x03h\x01\xfb\x00f\x03h\x01\xfd\x00f\x03h\x02\ +4\x00f\x03h\x025\x00f\x03h\x02]\x00f\x03\ +h\x02^\x00f\x03h\x03p\x00f\x03h\x03\x8d\x00\ +f\x03h\x03\x90\x00f\x03j\x00I\x00f\x03j\x00\ +W\x00f\x03j\x00Y\x00f\x03j\x00Z\x00f\x03\ +j\x00[\x00f\x03j\x00\x5c\x00f\x03j\x00\xbf\x00\ +f\x03j\x01%\x00f\x03j\x01'\x00f\x03j\x01\ +7\x00f\x03j\x01\xfb\x00f\x03j\x01\xfd\x00f\x03\ +j\x024\x00f\x03j\x025\x00f\x03j\x02]\x00\ +f\x03j\x02^\x00f\x03j\x03p\x00f\x03j\x03\ +\x8d\x00f\x03j\x03\x90\x00f\x03l\x00I\x00f\x03\ +l\x00W\x00f\x03l\x00Y\x00f\x03l\x00Z\x00\ +f\x03l\x00[\x00f\x03l\x00\x5c\x00f\x03l\x00\ +\xbf\x00f\x03l\x01%\x00f\x03l\x01'\x00f\x03\ +l\x017\x00f\x03l\x01\xfb\x00f\x03l\x01\xfd\x00\ +f\x03l\x024\x00f\x03l\x025\x00f\x03l\x02\ +]\x00f\x03l\x02^\x00f\x03l\x03p\x00f\x03\ +l\x03\x8d\x00f\x03l\x03\x90\x00f\x03n\x00I\x00\ +f\x03n\x00W\x00f\x03n\x00Y\x00f\x03n\x00\ +Z\x00f\x03n\x00[\x00f\x03n\x00\x5c\x00f\x03\ +n\x00\xbf\x00f\x03n\x01%\x00f\x03n\x01'\x00\ +f\x03n\x017\x00f\x03n\x01\xfb\x00f\x03n\x01\ +\xfd\x00f\x03n\x024\x00f\x03n\x025\x00f\x03\ +n\x02]\x00f\x03n\x02^\x00f\x03n\x03p\x00\ +f\x03n\x03\x8d\x00f\x03n\x03\x90\x00f\x03o\x00\ +\x0f\xff\x85\x03o\x00\x11\xff\x85\x03o\x00\x22\x00)\x03\ +o\x00$\xff\x85\x03o\x00&\xff\xd7\x03o\x00*\xff\ +\xd7\x03o\x002\xff\xd7\x03o\x004\xff\xd7\x03o\x00\ +D\xff\x9a\x03o\x00F\xff\x9a\x03o\x00G\xff\x9a\x03\ +o\x00H\xff\x9a\x03o\x00J\xff\xd7\x03o\x00P\xff\ +\xc3\x03o\x00Q\xff\xc3\x03o\x00R\xff\x9a\x03o\x00\ +S\xff\xc3\x03o\x00T\xff\x9a\x03o\x00U\xff\xc3\x03\ +o\x00V\xff\xae\x03o\x00X\xff\xc3\x03o\x00]\xff\ +\xd7\x03o\x00\x82\xff\x85\x03o\x00\x83\xff\x85\x03o\x00\ +\x84\xff\x85\x03o\x00\x85\xff\x85\x03o\x00\x86\xff\x85\x03\ +o\x00\x87\xff\x85\x03o\x00\x89\xff\xd7\x03o\x00\x94\xff\ +\xd7\x03o\x00\x95\xff\xd7\x03o\x00\x96\xff\xd7\x03o\x00\ +\x97\xff\xd7\x03o\x00\x98\xff\xd7\x03o\x00\x9a\xff\xd7\x03\ +o\x00\xa2\xff\x9a\x03o\x00\xa3\xff\x9a\x03o\x00\xa4\xff\ +\x9a\x03o\x00\xa5\xff\x9a\x03o\x00\xa6\xff\x9a\x03o\x00\ +\xa7\xff\x9a\x03o\x00\xa8\xff\x9a\x03o\x00\xa9\xff\x9a\x03\ +o\x00\xaa\xff\x9a\x03o\x00\xab\xff\x9a\x03o\x00\xac\xff\ +\x9a\x03o\x00\xad\xff\x9a\x03o\x00\xb4\xff\x9a\x03o\x00\ +\xb5\xff\x9a\x03o\x00\xb6\xff\x9a\x03o\x00\xb7\xff\x9a\x03\ +o\x00\xb8\xff\x9a\x03o\x00\xba\xff\x9a\x03o\x00\xbb\xff\ +\xc3\x03o\x00\xbc\xff\xc3\x03o\x00\xbd\xff\xc3\x03o\x00\ +\xbe\xff\xc3\x03o\x00\xc2\xff\x85\x03o\x00\xc3\xff\x9a\x03\ +o\x00\xc4\xff\x85\x03o\x00\xc5\xff\x9a\x03o\x00\xc6\xff\ +\x85\x03o\x00\xc7\xff\x9a\x03o\x00\xc8\xff\xd7\x03o\x00\ +\xc9\xff\x9a\x03o\x00\xca\xff\xd7\x03o\x00\xcb\xff\x9a\x03\ +o\x00\xcc\xff\xd7\x03o\x00\xcd\xff\x9a\x03o\x00\xce\xff\ +\xd7\x03o\x00\xcf\xff\x9a\x03o\x00\xd1\xff\x9a\x03o\x00\ +\xd3\xff\x9a\x03o\x00\xd5\xff\x9a\x03o\x00\xd7\xff\x9a\x03\ +o\x00\xd9\xff\x9a\x03o\x00\xdb\xff\x9a\x03o\x00\xdd\xff\ +\x9a\x03o\x00\xde\xff\xd7\x03o\x00\xdf\xff\xd7\x03o\x00\ +\xe0\xff\xd7\x03o\x00\xe1\xff\xd7\x03o\x00\xe2\xff\xd7\x03\ +o\x00\xe3\xff\xd7\x03o\x00\xe4\xff\xd7\x03o\x00\xe5\xff\ +\xd7\x03o\x00\xfa\xff\xc3\x03o\x01\x06\xff\xc3\x03o\x01\ +\x08\xff\xc3\x03o\x01\x0d\xff\xc3\x03o\x01\x0e\xff\xd7\x03\ +o\x01\x0f\xff\x9a\x03o\x01\x10\xff\xd7\x03o\x01\x11\xff\ +\x9a\x03o\x01\x12\xff\xd7\x03o\x01\x13\xff\x9a\x03o\x01\ +\x14\xff\xd7\x03o\x01\x15\xff\x9a\x03o\x01\x17\xff\xc3\x03\ +o\x01\x19\xff\xc3\x03o\x01\x1d\xff\xae\x03o\x01!\xff\ +\xae\x03o\x01+\xff\xc3\x03o\x01-\xff\xc3\x03o\x01\ +/\xff\xc3\x03o\x011\xff\xc3\x03o\x013\xff\xc3\x03\ +o\x015\xff\xc3\x03o\x01<\xff\xd7\x03o\x01>\xff\ +\xd7\x03o\x01@\xff\xd7\x03o\x01C\xff\x85\x03o\x01\ +D\xff\x9a\x03o\x01F\xff\x9a\x03o\x01G\xff\xd7\x03\ +o\x01H\xff\x9a\x03o\x01J\xff\xae\x03o\x02\x08\xff\ +\x85\x03o\x02\x0c\xff\x85\x03o\x02W\xff\xc3\x03o\x02\ +X\xff\x85\x03o\x02Y\xff\x9a\x03o\x02_\xff\xd7\x03\ +o\x02`\xff\x9a\x03o\x02b\xff\xc3\x03o\x03\x1d\xff\ +\x85\x03o\x03\x1e\xff\x9a\x03o\x03\x1f\xff\x85\x03o\x03\ + \xff\x9a\x03o\x03!\xff\x85\x03o\x03\x22\xff\x9a\x03\ +o\x03#\xff\x85\x03o\x03%\xff\x85\x03o\x03&\xff\ +\x9a\x03o\x03'\xff\x85\x03o\x03(\xff\x9a\x03o\x03\ +)\xff\x85\x03o\x03*\xff\x9a\x03o\x03+\xff\x85\x03\ +o\x03,\xff\x9a\x03o\x03-\xff\x85\x03o\x03.\xff\ +\x9a\x03o\x03/\xff\x85\x03o\x030\xff\x9a\x03o\x03\ +1\xff\x85\x03o\x032\xff\x9a\x03o\x033\xff\x85\x03\ +o\x034\xff\x9a\x03o\x036\xff\x9a\x03o\x038\xff\ +\x9a\x03o\x03:\xff\x9a\x03o\x03<\xff\x9a\x03o\x03\ +@\xff\x9a\x03o\x03B\xff\x9a\x03o\x03D\xff\x9a\x03\ +o\x03I\xff\xd7\x03o\x03J\xff\x9a\x03o\x03K\xff\ +\xd7\x03o\x03L\xff\x9a\x03o\x03M\xff\xd7\x03o\x03\ +N\xff\x9a\x03o\x03O\xff\xd7\x03o\x03Q\xff\xd7\x03\ +o\x03R\xff\x9a\x03o\x03S\xff\xd7\x03o\x03T\xff\ +\x9a\x03o\x03U\xff\xd7\x03o\x03V\xff\x9a\x03o\x03\ +W\xff\xd7\x03o\x03X\xff\x9a\x03o\x03Y\xff\xd7\x03\ +o\x03Z\xff\x9a\x03o\x03[\xff\xd7\x03o\x03\x5c\xff\ +\x9a\x03o\x03]\xff\xd7\x03o\x03^\xff\x9a\x03o\x03\ +_\xff\xd7\x03o\x03`\xff\x9a\x03o\x03b\xff\xc3\x03\ +o\x03d\xff\xc3\x03o\x03f\xff\xc3\x03o\x03h\xff\ +\xc3\x03o\x03j\xff\xc3\x03o\x03l\xff\xc3\x03o\x03\ +n\xff\xc3\x03p\x00\x05\x00R\x03p\x00\x0a\x00R\x03\ +p\x00\x0f\xff\xae\x03p\x00\x11\xff\xae\x03p\x00\x22\x00\ +)\x03p\x02\x07\x00R\x03p\x02\x08\xff\xae\x03p\x02\ +\x0b\x00R\x03p\x02\x0c\xff\xae\x03q\x00\x0f\xff\x85\x03\ +q\x00\x11\xff\x85\x03q\x00\x22\x00)\x03q\x00$\xff\ +\x85\x03q\x00&\xff\xd7\x03q\x00*\xff\xd7\x03q\x00\ +2\xff\xd7\x03q\x004\xff\xd7\x03q\x00D\xff\x9a\x03\ +q\x00F\xff\x9a\x03q\x00G\xff\x9a\x03q\x00H\xff\ +\x9a\x03q\x00J\xff\xd7\x03q\x00P\xff\xc3\x03q\x00\ +Q\xff\xc3\x03q\x00R\xff\x9a\x03q\x00S\xff\xc3\x03\ +q\x00T\xff\x9a\x03q\x00U\xff\xc3\x03q\x00V\xff\ +\xae\x03q\x00X\xff\xc3\x03q\x00]\xff\xd7\x03q\x00\ +\x82\xff\x85\x03q\x00\x83\xff\x85\x03q\x00\x84\xff\x85\x03\ +q\x00\x85\xff\x85\x03q\x00\x86\xff\x85\x03q\x00\x87\xff\ +\x85\x03q\x00\x89\xff\xd7\x03q\x00\x94\xff\xd7\x03q\x00\ +\x95\xff\xd7\x03q\x00\x96\xff\xd7\x03q\x00\x97\xff\xd7\x03\ +q\x00\x98\xff\xd7\x03q\x00\x9a\xff\xd7\x03q\x00\xa2\xff\ +\x9a\x03q\x00\xa3\xff\x9a\x03q\x00\xa4\xff\x9a\x03q\x00\ +\xa5\xff\x9a\x03q\x00\xa6\xff\x9a\x03q\x00\xa7\xff\x9a\x03\ +q\x00\xa8\xff\x9a\x03q\x00\xa9\xff\x9a\x03q\x00\xaa\xff\ +\x9a\x03q\x00\xab\xff\x9a\x03q\x00\xac\xff\x9a\x03q\x00\ +\xad\xff\x9a\x03q\x00\xb4\xff\x9a\x03q\x00\xb5\xff\x9a\x03\ +q\x00\xb6\xff\x9a\x03q\x00\xb7\xff\x9a\x03q\x00\xb8\xff\ +\x9a\x03q\x00\xba\xff\x9a\x03q\x00\xbb\xff\xc3\x03q\x00\ +\xbc\xff\xc3\x03q\x00\xbd\xff\xc3\x03q\x00\xbe\xff\xc3\x03\ +q\x00\xc2\xff\x85\x03q\x00\xc3\xff\x9a\x03q\x00\xc4\xff\ +\x85\x03q\x00\xc5\xff\x9a\x03q\x00\xc6\xff\x85\x03q\x00\ +\xc7\xff\x9a\x03q\x00\xc8\xff\xd7\x03q\x00\xc9\xff\x9a\x03\ +q\x00\xca\xff\xd7\x03q\x00\xcb\xff\x9a\x03q\x00\xcc\xff\ +\xd7\x03q\x00\xcd\xff\x9a\x03q\x00\xce\xff\xd7\x03q\x00\ +\xcf\xff\x9a\x03q\x00\xd1\xff\x9a\x03q\x00\xd3\xff\x9a\x03\ +q\x00\xd5\xff\x9a\x03q\x00\xd7\xff\x9a\x03q\x00\xd9\xff\ +\x9a\x03q\x00\xdb\xff\x9a\x03q\x00\xdd\xff\x9a\x03q\x00\ +\xde\xff\xd7\x03q\x00\xdf\xff\xd7\x03q\x00\xe0\xff\xd7\x03\ +q\x00\xe1\xff\xd7\x03q\x00\xe2\xff\xd7\x03q\x00\xe3\xff\ +\xd7\x03q\x00\xe4\xff\xd7\x03q\x00\xe5\xff\xd7\x03q\x00\ +\xfa\xff\xc3\x03q\x01\x06\xff\xc3\x03q\x01\x08\xff\xc3\x03\ +q\x01\x0d\xff\xc3\x03q\x01\x0e\xff\xd7\x03q\x01\x0f\xff\ +\x9a\x03q\x01\x10\xff\xd7\x03q\x01\x11\xff\x9a\x03q\x01\ +\x12\xff\xd7\x03q\x01\x13\xff\x9a\x03q\x01\x14\xff\xd7\x03\ +q\x01\x15\xff\x9a\x03q\x01\x17\xff\xc3\x03q\x01\x19\xff\ +\xc3\x03q\x01\x1d\xff\xae\x03q\x01!\xff\xae\x03q\x01\ ++\xff\xc3\x03q\x01-\xff\xc3\x03q\x01/\xff\xc3\x03\ +q\x011\xff\xc3\x03q\x013\xff\xc3\x03q\x015\xff\ +\xc3\x03q\x01<\xff\xd7\x03q\x01>\xff\xd7\x03q\x01\ +@\xff\xd7\x03q\x01C\xff\x85\x03q\x01D\xff\x9a\x03\ +q\x01F\xff\x9a\x03q\x01G\xff\xd7\x03q\x01H\xff\ +\x9a\x03q\x01J\xff\xae\x03q\x02\x08\xff\x85\x03q\x02\ +\x0c\xff\x85\x03q\x02W\xff\xc3\x03q\x02X\xff\x85\x03\ +q\x02Y\xff\x9a\x03q\x02_\xff\xd7\x03q\x02`\xff\ +\x9a\x03q\x02b\xff\xc3\x03q\x03\x1d\xff\x85\x03q\x03\ +\x1e\xff\x9a\x03q\x03\x1f\xff\x85\x03q\x03 \xff\x9a\x03\ +q\x03!\xff\x85\x03q\x03\x22\xff\x9a\x03q\x03#\xff\ +\x85\x03q\x03%\xff\x85\x03q\x03&\xff\x9a\x03q\x03\ +'\xff\x85\x03q\x03(\xff\x9a\x03q\x03)\xff\x85\x03\ +q\x03*\xff\x9a\x03q\x03+\xff\x85\x03q\x03,\xff\ +\x9a\x03q\x03-\xff\x85\x03q\x03.\xff\x9a\x03q\x03\ +/\xff\x85\x03q\x030\xff\x9a\x03q\x031\xff\x85\x03\ +q\x032\xff\x9a\x03q\x033\xff\x85\x03q\x034\xff\ +\x9a\x03q\x036\xff\x9a\x03q\x038\xff\x9a\x03q\x03\ +:\xff\x9a\x03q\x03<\xff\x9a\x03q\x03@\xff\x9a\x03\ +q\x03B\xff\x9a\x03q\x03D\xff\x9a\x03q\x03I\xff\ +\xd7\x03q\x03J\xff\x9a\x03q\x03K\xff\xd7\x03q\x03\ +L\xff\x9a\x03q\x03M\xff\xd7\x03q\x03N\xff\x9a\x03\ +q\x03O\xff\xd7\x03q\x03Q\xff\xd7\x03q\x03R\xff\ +\x9a\x03q\x03S\xff\xd7\x03q\x03T\xff\x9a\x03q\x03\ +U\xff\xd7\x03q\x03V\xff\x9a\x03q\x03W\xff\xd7\x03\ +q\x03X\xff\x9a\x03q\x03Y\xff\xd7\x03q\x03Z\xff\ +\x9a\x03q\x03[\xff\xd7\x03q\x03\x5c\xff\x9a\x03q\x03\ +]\xff\xd7\x03q\x03^\xff\x9a\x03q\x03_\xff\xd7\x03\ +q\x03`\xff\x9a\x03q\x03b\xff\xc3\x03q\x03d\xff\ +\xc3\x03q\x03f\xff\xc3\x03q\x03h\xff\xc3\x03q\x03\ +j\xff\xc3\x03q\x03l\xff\xc3\x03q\x03n\xff\xc3\x03\ +r\x00\x05\x00R\x03r\x00\x0a\x00R\x03r\x00\x0f\xff\ +\xae\x03r\x00\x11\xff\xae\x03r\x00\x22\x00)\x03r\x02\ +\x07\x00R\x03r\x02\x08\xff\xae\x03r\x02\x0b\x00R\x03\ +r\x02\x0c\xff\xae\x03s\x00\x0f\xff\x85\x03s\x00\x11\xff\ +\x85\x03s\x00\x22\x00)\x03s\x00$\xff\x85\x03s\x00\ +&\xff\xd7\x03s\x00*\xff\xd7\x03s\x002\xff\xd7\x03\ +s\x004\xff\xd7\x03s\x00D\xff\x9a\x03s\x00F\xff\ +\x9a\x03s\x00G\xff\x9a\x03s\x00H\xff\x9a\x03s\x00\ +J\xff\xd7\x03s\x00P\xff\xc3\x03s\x00Q\xff\xc3\x03\ +s\x00R\xff\x9a\x03s\x00S\xff\xc3\x03s\x00T\xff\ +\x9a\x03s\x00U\xff\xc3\x03s\x00V\xff\xae\x03s\x00\ +X\xff\xc3\x03s\x00]\xff\xd7\x03s\x00\x82\xff\x85\x03\ +s\x00\x83\xff\x85\x03s\x00\x84\xff\x85\x03s\x00\x85\xff\ +\x85\x03s\x00\x86\xff\x85\x03s\x00\x87\xff\x85\x03s\x00\ +\x89\xff\xd7\x03s\x00\x94\xff\xd7\x03s\x00\x95\xff\xd7\x03\ +s\x00\x96\xff\xd7\x03s\x00\x97\xff\xd7\x03s\x00\x98\xff\ +\xd7\x03s\x00\x9a\xff\xd7\x03s\x00\xa2\xff\x9a\x03s\x00\ +\xa3\xff\x9a\x03s\x00\xa4\xff\x9a\x03s\x00\xa5\xff\x9a\x03\ +s\x00\xa6\xff\x9a\x03s\x00\xa7\xff\x9a\x03s\x00\xa8\xff\ +\x9a\x03s\x00\xa9\xff\x9a\x03s\x00\xaa\xff\x9a\x03s\x00\ +\xab\xff\x9a\x03s\x00\xac\xff\x9a\x03s\x00\xad\xff\x9a\x03\ +s\x00\xb4\xff\x9a\x03s\x00\xb5\xff\x9a\x03s\x00\xb6\xff\ +\x9a\x03s\x00\xb7\xff\x9a\x03s\x00\xb8\xff\x9a\x03s\x00\ +\xba\xff\x9a\x03s\x00\xbb\xff\xc3\x03s\x00\xbc\xff\xc3\x03\ +s\x00\xbd\xff\xc3\x03s\x00\xbe\xff\xc3\x03s\x00\xc2\xff\ +\x85\x03s\x00\xc3\xff\x9a\x03s\x00\xc4\xff\x85\x03s\x00\ +\xc5\xff\x9a\x03s\x00\xc6\xff\x85\x03s\x00\xc7\xff\x9a\x03\ +s\x00\xc8\xff\xd7\x03s\x00\xc9\xff\x9a\x03s\x00\xca\xff\ +\xd7\x03s\x00\xcb\xff\x9a\x03s\x00\xcc\xff\xd7\x03s\x00\ +\xcd\xff\x9a\x03s\x00\xce\xff\xd7\x03s\x00\xcf\xff\x9a\x03\ +s\x00\xd1\xff\x9a\x03s\x00\xd3\xff\x9a\x03s\x00\xd5\xff\ +\x9a\x03s\x00\xd7\xff\x9a\x03s\x00\xd9\xff\x9a\x03s\x00\ +\xdb\xff\x9a\x03s\x00\xdd\xff\x9a\x03s\x00\xde\xff\xd7\x03\ +s\x00\xdf\xff\xd7\x03s\x00\xe0\xff\xd7\x03s\x00\xe1\xff\ +\xd7\x03s\x00\xe2\xff\xd7\x03s\x00\xe3\xff\xd7\x03s\x00\ +\xe4\xff\xd7\x03s\x00\xe5\xff\xd7\x03s\x00\xfa\xff\xc3\x03\ +s\x01\x06\xff\xc3\x03s\x01\x08\xff\xc3\x03s\x01\x0d\xff\ +\xc3\x03s\x01\x0e\xff\xd7\x03s\x01\x0f\xff\x9a\x03s\x01\ +\x10\xff\xd7\x03s\x01\x11\xff\x9a\x03s\x01\x12\xff\xd7\x03\ +s\x01\x13\xff\x9a\x03s\x01\x14\xff\xd7\x03s\x01\x15\xff\ +\x9a\x03s\x01\x17\xff\xc3\x03s\x01\x19\xff\xc3\x03s\x01\ +\x1d\xff\xae\x03s\x01!\xff\xae\x03s\x01+\xff\xc3\x03\ +s\x01-\xff\xc3\x03s\x01/\xff\xc3\x03s\x011\xff\ +\xc3\x03s\x013\xff\xc3\x03s\x015\xff\xc3\x03s\x01\ +<\xff\xd7\x03s\x01>\xff\xd7\x03s\x01@\xff\xd7\x03\ +s\x01C\xff\x85\x03s\x01D\xff\x9a\x03s\x01F\xff\ +\x9a\x03s\x01G\xff\xd7\x03s\x01H\xff\x9a\x03s\x01\ +J\xff\xae\x03s\x02\x08\xff\x85\x03s\x02\x0c\xff\x85\x03\ +s\x02W\xff\xc3\x03s\x02X\xff\x85\x03s\x02Y\xff\ +\x9a\x03s\x02_\xff\xd7\x03s\x02`\xff\x9a\x03s\x02\ +b\xff\xc3\x03s\x03\x1d\xff\x85\x03s\x03\x1e\xff\x9a\x03\ +s\x03\x1f\xff\x85\x03s\x03 \xff\x9a\x03s\x03!\xff\ +\x85\x03s\x03\x22\xff\x9a\x03s\x03#\xff\x85\x03s\x03\ +%\xff\x85\x03s\x03&\xff\x9a\x03s\x03'\xff\x85\x03\ +s\x03(\xff\x9a\x03s\x03)\xff\x85\x03s\x03*\xff\ +\x9a\x03s\x03+\xff\x85\x03s\x03,\xff\x9a\x03s\x03\ +-\xff\x85\x03s\x03.\xff\x9a\x03s\x03/\xff\x85\x03\ +s\x030\xff\x9a\x03s\x031\xff\x85\x03s\x032\xff\ +\x9a\x03s\x033\xff\x85\x03s\x034\xff\x9a\x03s\x03\ +6\xff\x9a\x03s\x038\xff\x9a\x03s\x03:\xff\x9a\x03\ +s\x03<\xff\x9a\x03s\x03@\xff\x9a\x03s\x03B\xff\ +\x9a\x03s\x03D\xff\x9a\x03s\x03I\xff\xd7\x03s\x03\ +J\xff\x9a\x03s\x03K\xff\xd7\x03s\x03L\xff\x9a\x03\ +s\x03M\xff\xd7\x03s\x03N\xff\x9a\x03s\x03O\xff\ +\xd7\x03s\x03Q\xff\xd7\x03s\x03R\xff\x9a\x03s\x03\ +S\xff\xd7\x03s\x03T\xff\x9a\x03s\x03U\xff\xd7\x03\ +s\x03V\xff\x9a\x03s\x03W\xff\xd7\x03s\x03X\xff\ +\x9a\x03s\x03Y\xff\xd7\x03s\x03Z\xff\x9a\x03s\x03\ +[\xff\xd7\x03s\x03\x5c\xff\x9a\x03s\x03]\xff\xd7\x03\ +s\x03^\xff\x9a\x03s\x03_\xff\xd7\x03s\x03`\xff\ +\x9a\x03s\x03b\xff\xc3\x03s\x03d\xff\xc3\x03s\x03\ +f\xff\xc3\x03s\x03h\xff\xc3\x03s\x03j\xff\xc3\x03\ +s\x03l\xff\xc3\x03s\x03n\xff\xc3\x03t\x00\x05\x00\ +R\x03t\x00\x0a\x00R\x03t\x00\x0f\xff\xae\x03t\x00\ +\x11\xff\xae\x03t\x00\x22\x00)\x03t\x02\x07\x00R\x03\ +t\x02\x08\xff\xae\x03t\x02\x0b\x00R\x03t\x02\x0c\xff\ +\xae\x03\x8d\x00\x05\x00{\x03\x8d\x00\x0a\x00{\x03\x8d\x02\ +\x07\x00{\x03\x8d\x02\x0b\x00{\x03\x8f\x00\x0f\xff\x85\x03\ +\x8f\x00\x10\xff\xae\x03\x8f\x00\x11\xff\x85\x03\x8f\x00\x22\x00\ +)\x03\x8f\x00$\xffq\x03\x8f\x00&\xff\xd7\x03\x8f\x00\ +*\xff\xd7\x03\x8f\x002\xff\xd7\x03\x8f\x004\xff\xd7\x03\ +\x8f\x007\x00)\x03\x8f\x00D\xff\x5c\x03\x8f\x00F\xff\ +q\x03\x8f\x00G\xffq\x03\x8f\x00H\xffq\x03\x8f\x00\ +J\xffq\x03\x8f\x00P\xff\x9a\x03\x8f\x00Q\xff\x9a\x03\ +\x8f\x00R\xffq\x03\x8f\x00S\xff\x9a\x03\x8f\x00T\xff\ +q\x03\x8f\x00U\xff\x9a\x03\x8f\x00V\xff\x85\x03\x8f\x00\ +X\xff\x9a\x03\x8f\x00Y\xff\xd7\x03\x8f\x00Z\xff\xd7\x03\ +\x8f\x00[\xff\xd7\x03\x8f\x00\x5c\xff\xd7\x03\x8f\x00]\xff\ +\xae\x03\x8f\x00\x82\xffq\x03\x8f\x00\x83\xffq\x03\x8f\x00\ +\x84\xffq\x03\x8f\x00\x85\xffq\x03\x8f\x00\x86\xffq\x03\ +\x8f\x00\x87\xffq\x03\x8f\x00\x89\xff\xd7\x03\x8f\x00\x94\xff\ +\xd7\x03\x8f\x00\x95\xff\xd7\x03\x8f\x00\x96\xff\xd7\x03\x8f\x00\ +\x97\xff\xd7\x03\x8f\x00\x98\xff\xd7\x03\x8f\x00\x9a\xff\xd7\x03\ +\x8f\x00\xa2\xffq\x03\x8f\x00\xa3\xff\x5c\x03\x8f\x00\xa4\xff\ +\x5c\x03\x8f\x00\xa5\xff\x5c\x03\x8f\x00\xa6\xff\x5c\x03\x8f\x00\ +\xa7\xff\x5c\x03\x8f\x00\xa8\xff\x5c\x03\x8f\x00\xa9\xffq\x03\ +\x8f\x00\xaa\xffq\x03\x8f\x00\xab\xffq\x03\x8f\x00\xac\xff\ +q\x03\x8f\x00\xad\xffq\x03\x8f\x00\xb4\xffq\x03\x8f\x00\ +\xb5\xffq\x03\x8f\x00\xb6\xffq\x03\x8f\x00\xb7\xffq\x03\ +\x8f\x00\xb8\xffq\x03\x8f\x00\xba\xffq\x03\x8f\x00\xbb\xff\ +\x9a\x03\x8f\x00\xbc\xff\x9a\x03\x8f\x00\xbd\xff\x9a\x03\x8f\x00\ +\xbe\xff\x9a\x03\x8f\x00\xbf\xff\xd7\x03\x8f\x00\xc2\xffq\x03\ +\x8f\x00\xc3\xff\x5c\x03\x8f\x00\xc4\xffq\x03\x8f\x00\xc5\xff\ +\x5c\x03\x8f\x00\xc6\xffq\x03\x8f\x00\xc7\xff\x5c\x03\x8f\x00\ +\xc8\xff\xd7\x03\x8f\x00\xc9\xffq\x03\x8f\x00\xca\xff\xd7\x03\ +\x8f\x00\xcb\xffq\x03\x8f\x00\xcc\xff\xd7\x03\x8f\x00\xcd\xff\ +q\x03\x8f\x00\xce\xff\xd7\x03\x8f\x00\xcf\xffq\x03\x8f\x00\ +\xd1\xffq\x03\x8f\x00\xd3\xffq\x03\x8f\x00\xd5\xffq\x03\ +\x8f\x00\xd7\xffq\x03\x8f\x00\xd9\xffq\x03\x8f\x00\xdb\xff\ +q\x03\x8f\x00\xdd\xffq\x03\x8f\x00\xde\xff\xd7\x03\x8f\x00\ +\xdf\xffq\x03\x8f\x00\xe0\xff\xd7\x03\x8f\x00\xe1\xffq\x03\ +\x8f\x00\xe2\xff\xd7\x03\x8f\x00\xe3\xffq\x03\x8f\x00\xe4\xff\ +\xd7\x03\x8f\x00\xe5\xffq\x03\x8f\x00\xfa\xff\x9a\x03\x8f\x01\ +\x06\xff\x9a\x03\x8f\x01\x08\xff\x9a\x03\x8f\x01\x0d\xff\x9a\x03\ +\x8f\x01\x0e\xff\xd7\x03\x8f\x01\x0f\xffq\x03\x8f\x01\x10\xff\ +\xd7\x03\x8f\x01\x11\xffq\x03\x8f\x01\x12\xff\xd7\x03\x8f\x01\ +\x13\xffq\x03\x8f\x01\x14\xff\xd7\x03\x8f\x01\x15\xffq\x03\ +\x8f\x01\x17\xff\x9a\x03\x8f\x01\x19\xff\x9a\x03\x8f\x01\x1d\xff\ +\x85\x03\x8f\x01!\xff\x85\x03\x8f\x01$\x00)\x03\x8f\x01\ +&\x00)\x03\x8f\x01+\xff\x9a\x03\x8f\x01-\xff\x9a\x03\ +\x8f\x01/\xff\x9a\x03\x8f\x011\xff\x9a\x03\x8f\x013\xff\ +\x9a\x03\x8f\x015\xff\x9a\x03\x8f\x017\xff\xd7\x03\x8f\x01\ +<\xff\xae\x03\x8f\x01>\xff\xae\x03\x8f\x01@\xff\xae\x03\ +\x8f\x01C\xffq\x03\x8f\x01D\xff\x5c\x03\x8f\x01F\xff\ +\x5c\x03\x8f\x01G\xff\xd7\x03\x8f\x01H\xffq\x03\x8f\x01\ +J\xff\x85\x03\x8f\x01\xfb\xff\xd7\x03\x8f\x01\xfd\xff\xd7\x03\ +\x8f\x02\x02\xff\xae\x03\x8f\x02\x03\xff\xae\x03\x8f\x02\x04\xff\ +\xae\x03\x8f\x02\x08\xff\x85\x03\x8f\x02\x0c\xff\x85\x03\x8f\x02\ +W\xff\x9a\x03\x8f\x02X\xffq\x03\x8f\x02Y\xff\x5c\x03\ +\x8f\x02_\xff\xd7\x03\x8f\x02`\xffq\x03\x8f\x02b\xff\ +\x9a\x03\x8f\x03\x1d\xffq\x03\x8f\x03\x1e\xff\x5c\x03\x8f\x03\ +\x1f\xffq\x03\x8f\x03 \xff\x5c\x03\x8f\x03!\xffq\x03\ +\x8f\x03\x22\xff\x5c\x03\x8f\x03#\xffq\x03\x8f\x03%\xff\ +q\x03\x8f\x03&\xff\x5c\x03\x8f\x03'\xffq\x03\x8f\x03\ +(\xff\x5c\x03\x8f\x03)\xffq\x03\x8f\x03*\xff\x5c\x03\ +\x8f\x03+\xffq\x03\x8f\x03,\xff\x5c\x03\x8f\x03-\xff\ +q\x03\x8f\x03.\xff\x5c\x03\x8f\x03/\xffq\x03\x8f\x03\ +0\xff\x5c\x03\x8f\x031\xffq\x03\x8f\x032\xff\x5c\x03\ +\x8f\x033\xffq\x03\x8f\x034\xff\x5c\x03\x8f\x036\xff\ +q\x03\x8f\x038\xffq\x03\x8f\x03:\xffq\x03\x8f\x03\ +<\xffq\x03\x8f\x03@\xffq\x03\x8f\x03B\xffq\x03\ +\x8f\x03D\xffq\x03\x8f\x03I\xff\xd7\x03\x8f\x03J\xff\ +q\x03\x8f\x03K\xff\xd7\x03\x8f\x03L\xffq\x03\x8f\x03\ +M\xff\xd7\x03\x8f\x03N\xffq\x03\x8f\x03O\xff\xd7\x03\ +\x8f\x03Q\xff\xd7\x03\x8f\x03R\xffq\x03\x8f\x03S\xff\ +\xd7\x03\x8f\x03T\xffq\x03\x8f\x03U\xff\xd7\x03\x8f\x03\ +V\xffq\x03\x8f\x03W\xff\xd7\x03\x8f\x03X\xffq\x03\ +\x8f\x03Y\xff\xd7\x03\x8f\x03Z\xffq\x03\x8f\x03[\xff\ +\xd7\x03\x8f\x03\x5c\xffq\x03\x8f\x03]\xff\xd7\x03\x8f\x03\ +^\xffq\x03\x8f\x03_\xff\xd7\x03\x8f\x03`\xffq\x03\ +\x8f\x03b\xff\x9a\x03\x8f\x03d\xff\x9a\x03\x8f\x03f\xff\ +\x9a\x03\x8f\x03h\xff\x9a\x03\x8f\x03j\xff\x9a\x03\x8f\x03\ +l\xff\x9a\x03\x8f\x03n\xff\x9a\x03\x8f\x03p\xff\xd7\x03\ +\x8f\x03\x8f\x00)\x03\x90\x00\x05\x00)\x03\x90\x00\x0a\x00\ +)\x03\x90\x02\x07\x00)\x03\x90\x02\x0b\x00)\x00\x00\x00\ +\x00\x00\x1a\x01>\x00\x01\x00\x00\x00\x00\x00\x00\x009\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x09\x009\x00\x01\x00\ +\x00\x00\x00\x00\x02\x00\x06\x00B\x00\x01\x00\x00\x00\x00\x00\ +\x03\x00%\x00H\x00\x01\x00\x00\x00\x00\x00\x04\x00\x10\x00\ +S\x00\x01\x00\x00\x00\x00\x00\x05\x00\x0c\x00m\x00\x01\x00\ +\x00\x00\x00\x00\x06\x00\x0f\x00y\x00\x01\x00\x00\x00\x00\x00\ +\x07\x00R\x00\x88\x00\x01\x00\x00\x00\x00\x00\x08\x00\x14\x00\ +\xda\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x1c\x00\xee\x00\x01\x00\ +\x00\x00\x00\x00\x0c\x00.\x01\x0a\x00\x01\x00\x00\x00\x00\x00\ +\x0d\x00.\x018\x00\x01\x00\x00\x00\x00\x00\x0e\x00*\x01\ +f\x00\x03\x00\x01\x04\x09\x00\x00\x00r\x01\x90\x00\x03\x00\ +\x01\x04\x09\x00\x01\x00\x12\x02\x02\x00\x03\x00\x01\x04\x09\x00\ +\x02\x00\x0c\x02\x14\x00\x03\x00\x01\x04\x09\x00\x03\x00J\x02\ + \x00\x03\x00\x01\x04\x09\x00\x04\x00 \x026\x00\x03\x00\ +\x01\x04\x09\x00\x05\x00\x18\x02j\x00\x03\x00\x01\x04\x09\x00\ +\x06\x00\x1e\x02\x82\x00\x03\x00\x01\x04\x09\x00\x07\x00\xa4\x02\ +\xa0\x00\x03\x00\x01\x04\x09\x00\x08\x00(\x03D\x00\x03\x00\ +\x01\x04\x09\x00\x0b\x008\x03l\x00\x03\x00\x01\x04\x09\x00\ +\x0c\x00\x5c\x03\xa4\x00\x03\x00\x01\x04\x09\x00\x0d\x00\x5c\x04\ +\x00\x00\x03\x00\x01\x04\x09\x00\x0e\x00T\x04\x5cDig\ +itized data copy\ +right \xa9 2010-201\ +1, Google Corpor\ +ation.Open SansI\ +talicAscender - \ +Open Sans Italic\ + Build 100Versio\ +n 1.10OpenSans-I\ +talicOpen Sans i\ +s a trademark of\ + Google and may \ +be registered in\ + certain jurisdi\ +ctions.Ascender \ +Corporationhttp:\ +//www.ascenderco\ +rp.com/http://ww\ +w.ascendercorp.c\ +om/typedesigners\ +.htmlLicensed un\ +der the Apache L\ +icense, Version \ +2.0http://www.ap\ +ache.org/license\ +s/LICENSE-2.0\x00D\x00\ +i\x00g\x00i\x00t\x00i\x00z\x00e\x00d\x00\ + \x00d\x00a\x00t\x00a\x00 \x00c\x00o\x00\ +p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00\ +\xa9\x00 \x002\x000\x001\x000\x00-\x002\x00\ +0\x001\x001\x00,\x00 \x00G\x00o\x00o\x00\ +g\x00l\x00e\x00 \x00C\x00o\x00r\x00p\x00\ +o\x00r\x00a\x00t\x00i\x00o\x00n\x00.\x00\ +O\x00p\x00e\x00n\x00 \x00S\x00a\x00n\x00\ +s\x00I\x00t\x00a\x00l\x00i\x00c\x00A\x00\ +s\x00c\x00e\x00n\x00d\x00e\x00r\x00 \x00\ +-\x00 \x00O\x00p\x00e\x00n\x00 \x00S\x00\ +a\x00n\x00s\x00 \x00I\x00t\x00a\x00l\x00\ +i\x00c\x00 \x00B\x00u\x00i\x00l\x00d\x00\ + \x001\x000\x000\x00V\x00e\x00r\x00s\x00\ +i\x00o\x00n\x00 \x001\x00.\x001\x000\x00\ +O\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00\ +-\x00I\x00t\x00a\x00l\x00i\x00c\x00O\x00\ +p\x00e\x00n\x00 \x00S\x00a\x00n\x00s\x00\ + \x00i\x00s\x00 \x00a\x00 \x00t\x00r\x00\ +a\x00d\x00e\x00m\x00a\x00r\x00k\x00 \x00\ +o\x00f\x00 \x00G\x00o\x00o\x00g\x00l\x00\ +e\x00 \x00a\x00n\x00d\x00 \x00m\x00a\x00\ +y\x00 \x00b\x00e\x00 \x00r\x00e\x00g\x00\ +i\x00s\x00t\x00e\x00r\x00e\x00d\x00 \x00\ +i\x00n\x00 \x00c\x00e\x00r\x00t\x00a\x00\ +i\x00n\x00 \x00j\x00u\x00r\x00i\x00s\x00\ +d\x00i\x00c\x00t\x00i\x00o\x00n\x00s\x00\ +.\x00A\x00s\x00c\x00e\x00n\x00d\x00e\x00\ +r\x00 \x00C\x00o\x00r\x00p\x00o\x00r\x00\ +a\x00t\x00i\x00o\x00n\x00h\x00t\x00t\x00\ +p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00\ +a\x00s\x00c\x00e\x00n\x00d\x00e\x00r\x00\ +c\x00o\x00r\x00p\x00.\x00c\x00o\x00m\x00\ +/\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00\ +w\x00w\x00w\x00.\x00a\x00s\x00c\x00e\x00\ +n\x00d\x00e\x00r\x00c\x00o\x00r\x00p\x00\ +.\x00c\x00o\x00m\x00/\x00t\x00y\x00p\x00\ +e\x00d\x00e\x00s\x00i\x00g\x00n\x00e\x00\ +r\x00s\x00.\x00h\x00t\x00m\x00l\x00L\x00\ +i\x00c\x00e\x00n\x00s\x00e\x00d\x00 \x00\ +u\x00n\x00d\x00e\x00r\x00 \x00t\x00h\x00\ +e\x00 \x00A\x00p\x00a\x00c\x00h\x00e\x00\ + \x00L\x00i\x00c\x00e\x00n\x00s\x00e\x00\ +,\x00 \x00V\x00e\x00r\x00s\x00i\x00o\x00\ +n\x00 \x002\x00.\x000\x00h\x00t\x00t\x00\ +p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00\ +a\x00p\x00a\x00c\x00h\x00e\x00.\x00o\x00\ +r\x00g\x00/\x00l\x00i\x00c\x00e\x00n\x00\ +s\x00e\x00s\x00/\x00L\x00I\x00C\x00E\x00\ +N\x00S\x00E\x00-\x002\x00.\x000\x00\x00\x00\ +\x02\x00\x00\xff\xf4\x00\x00\xfff\x00f\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\ +\xaa\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\ +\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\ +\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\ +\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\ +!\x01\x22\x01#\x01$\x01%\x01&\x01'\x01(\x01\ +)\x01*\x01+\x01,\x01-\x01.\x01/\x010\x01\ +1\x012\x013\x014\x015\x016\x017\x018\x01\ +9\x01:\x01;\x01<\x01=\x01>\x01?\x01@\x01\ +A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x01\ +I\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01\ +Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01\ +Y\x01Z\x01[\x01\x5c\x01]\x01^\x01_\x01`\x01\ +a\x01b\x01c\x01d\x01e\x01f\x01g\x01h\x01\ +i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01\ +q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01\ +y\x01z\x01{\x01|\x01}\x01~\x01\x7f\x01\x80\x01\ +\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\ +\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\ +\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\ +\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\ +\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\ +\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\ +\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\ +\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\ +\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\ +\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\ +\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\ +\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\ +\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\ +\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\ +\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\ +\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\ +\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\x07\x02\x08\x02\ +\x09\x02\x0a\x02\x0b\x02\x0c\x02\x0d\x02\x0e\x02\x0f\x02\x10\x02\ +\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\ +\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02\ +!\x02\x22\x02#\x02$\x02%\x02&\x02'\x02(\x02\ +)\x02*\x02+\x02,\x02-\x02.\x02/\x020\x02\ +1\x022\x023\x024\x025\x026\x027\x028\x02\ +9\x02:\x02;\x02<\x02=\x02>\x02?\x02@\x02\ +A\x02B\x02C\x02D\x02E\x02F\x02G\x02H\x02\ +I\x02J\x02K\x02L\x02M\x02N\x02O\x02P\x02\ +Q\x02R\x02S\x02T\x02U\x02V\x02W\x02X\x02\ +Y\x02Z\x02[\x02\x5c\x02]\x02^\x02_\x02`\x02\ +a\x02b\x02c\x02d\x02e\x02f\x02g\x02h\x02\ +i\x02j\x02k\x02l\x02m\x02n\x02o\x02p\x02\ +q\x02r\x02s\x02t\x02u\x02v\x02w\x02x\x02\ +y\x02z\x02{\x02|\x02}\x02~\x02\x7f\x02\x80\x02\ +\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\ +\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\ +\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\ +\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\ +\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\ +\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\ +\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\ +\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\ +\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\ +\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\ +\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\ +\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\ +\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\ +\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\ +\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\ +\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\ +\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\x07\x03\x08\x03\ +\x09\x03\x0a\x03\x0b\x03\x0c\x03\x0d\x03\x0e\x03\x0f\x03\x10\x03\ +\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\ +\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03\ +!\x03\x22\x03#\x03$\x03%\x03&\x03'\x03(\x03\ +)\x03*\x03+\x03,\x03-\x03.\x03/\x030\x03\ +1\x032\x033\x034\x035\x036\x037\x038\x03\ +9\x03:\x03;\x03<\x03=\x03>\x03?\x03@\x03\ +A\x03B\x03C\x03D\x03E\x03F\x03G\x03H\x03\ +I\x03J\x03K\x03L\x03M\x03N\x03O\x03P\x03\ +Q\x03R\x03S\x03T\x03U\x03V\x03W\x03X\x03\ +Y\x03Z\x03[\x03\x5c\x03]\x03^\x03_\x03`\x03\ +a\x03b\x03c\x03d\x03e\x03f\x03g\x03h\x03\ +i\x03j\x03k\x03l\x03m\x03n\x03o\x03p\x03\ +q\x03r\x03s\x03t\x03u\x03v\x03w\x03x\x03\ +y\x03z\x03{\x03|\x03}\x03~\x03\x7f\x03\x80\x03\ +\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\ +\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\ +\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\ +\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\ +\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\ +\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\ +\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\ +\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\ +\xc1\x03\xc2\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\ +\xc9\x03\xca\x03\xcb\x03\xcc\x03\xcd\x03\xce\x03\xcf\x03\xd0\x03\ +\xd1\x03\xd2\x03\xd3\x03\xd4\x03\xd5\x03\xd6\x03\xd7\x03\xd8\x03\ +\xd9\x03\xda\x03\xdb\x03\xdc\x03\xdd\x03\xde\x03\xdf\x03\xe0\x03\ +\xe1\x03\xe2\x03\xe3\x03\xe4\x03\xe5\x03\xe6\x03\xe7\x03\xe8\x03\ +\xe9\x03\xea\x03\xeb\x03\xec\x03\xed\x03\xee\x03\xef\x03\xf0\x03\ +\xf1\x03\xf2\x03\xf3\x03\xf4\x03\xf5\x03\xf6\x03\xf7\x03\xf8\x03\ +\xf9\x03\xfa\x03\xfb\x03\xfc\x03\xfd\x03\xfe\x03\xff\x04\x00\x04\ +\x01\x04\x02\x04\x03\x04\x04\x04\x05\x04\x06\x04\x07\x04\x08\x04\ +\x09\x04\x0a\x04\x0b\x04\x0c\x04\x0d\x04\x0e\x04\x0f\x04\x10\x04\ +\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x16\x04\x17\x04\x18\x04\ +\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04 \x04\ +!\x04\x22\x04#\x04$\x04%\x04&\x04'\x04(\x04\ +)\x04*\x04+\x04,\x04-\x04.\x04/\x040\x04\ +1\x042\x043\x044\x045\x046\x047\x048\x04\ +9\x04:\x04;\x04<\x04=\x04>\x04?\x04@\x04\ +A\x04B\x04C\x04D\x04E\x04F\x04G\x04H\x04\ +I\x04J\x04K\x04L\x04M\x04N\x04O\x04P\x04\ +Q\x04R\x04S\x04T\x04U\x04V\x04W\x04X\x04\ +Y\x04Z\x04[\x04\x5c\x04]\x04^\x04_\x04`\x04\ +a\x04b\x04c\x04d\x04e\x04f\x04g\x04h\x04\ +i\x04j\x04k\x04l\x04m\x04n\x04o\x04p\x04\ +q\x04r\x04s\x04t\x04u\x04v\x04w\x04x\x04\ +y\x04z\x04{\x04|\x04}\x04~\x04\x7f\x04\x80\x04\ +\x81\x04\x82\x04\x83\x04\x84\x04\x85\x04\x86\x04\x87\x04\x88\x04\ +\x89\x04\x8a\x04\x8b\x04\x8c\x04\x8d\x04\x8e\x04\x8f\x04\x90\x04\ +\x91\x04\x92\x04\x93\x04\x94\x04\x95\x04\x96\x04\x97\x04\x98\x04\ +\x99\x04\x9a\x04\x9b\x04\x9c\x04\x9d\x04\x9e\x04\x9f\x04\xa0\x04\ +\xa1\x04\xa2\x04\xa3\x04\xa4\x04\xa5\x04\xa6\x04\xa7\x04\xa8\x04\ +\xa9\x04\xaa\x04\xab\x07.notdef\x04nu\ +ll\x10nonmarkingret\ +urn\x05space\x06exclam\ +\x08quotedbl\x0anumber\ +sign\x06dollar\x07perc\ +ent\x09ampersand\x0bqu\ +otesingle\x09parenl\ +eft\x0aparenright\x08a\ +sterisk\x04plus\x05com\ +ma\x06hyphen\x06period\ +\x05slash\x04zero\x03one\x03\ +two\x05three\x04four\x04f\ +ive\x03six\x05seven\x05ei\ +ght\x04nine\x05colon\x09s\ +emicolon\x04less\x05eq\ +ual\x07greater\x08ques\ +tion\x02at\x01A\x01B\x01C\x01D\x01\ +E\x01F\x01G\x01H\x05I.alt\x01J\x01\ +K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01\ +S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x0b\ +bracketleft\x09back\ +slash\x0cbracketrig\ +ht\x0basciicircum\x0au\ +nderscore\x05grave\x01\ +a\x01b\x01c\x01d\x01e\x01f\x01g\x01h\x01\ +i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01\ +q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01\ +y\x01z\x09braceleft\x03ba\ +r\x0abraceright\x0aasc\ +iitilde\x10nonbreak\ +ingspace\x0aexclamd\ +own\x04cent\x08sterlin\ +g\x08currency\x03yen\x09b\ +rokenbar\x07section\ +\x08dieresis\x09copyri\ +ght\x0bordfeminine\x0d\ +guillemotleft\x0alo\ +gicalnot\x07uni00AD\ +\x0aregistered\x09over\ +score\x06degree\x09plu\ +sminus\x0btwosuperi\ +or\x0dthreesuperior\ +\x05acute\x02mu\x09paragr\ +aph\x0eperiodcenter\ +ed\x07cedilla\x0bonesu\ +perior\x0cordmascul\ +ine\x0eguillemotrig\ +ht\x0aonequarter\x07on\ +ehalf\x0dthreequart\ +ers\x0cquestiondown\ +\x06Agrave\x06Aacute\x0bA\ +circumflex\x06Atild\ +e\x09Adieresis\x05Arin\ +g\x02AE\x08Ccedilla\x06Eg\ +rave\x06Eacute\x0bEcir\ +cumflex\x09Edieresi\ +s\x0aIgrave.alt\x0aIac\ +ute.alt\x0fIcircumf\ +lex.alt\x0dIdieresi\ +s.alt\x03Eth\x06Ntilde\ +\x06Ograve\x06Oacute\x0bO\ +circumflex\x06Otild\ +e\x09Odieresis\x08mult\ +iply\x06Oslash\x06Ugra\ +ve\x06Uacute\x0bUcircu\ +mflex\x09Udieresis\x06\ +Yacute\x05Thorn\x0ager\ +mandbls\x06agrave\x06a\ +acute\x0bacircumfle\ +x\x06atilde\x09adieres\ +is\x05aring\x02ae\x08cced\ +illa\x06egrave\x06eacu\ +te\x0becircumflex\x09e\ +dieresis\x06igrave\x06\ +iacute\x0bicircumfl\ +ex\x09idieresis\x03eth\ +\x06ntilde\x06ograve\x06o\ +acute\x0bocircumfle\ +x\x06otilde\x09odieres\ +is\x06divide\x06oslash\ +\x06ugrave\x06uacute\x0bu\ +circumflex\x09udier\ +esis\x06yacute\x05thor\ +n\x09ydieresis\x07Amac\ +ron\x07amacron\x06Abre\ +ve\x06abreve\x07Aogone\ +k\x07aogonek\x06Cacute\ +\x06cacute\x0bCcircumf\ +lex\x0bccircumflex\x04\ +Cdot\x04cdot\x06Ccaron\ +\x06ccaron\x06Dcaron\x06d\ +caron\x06Dcroat\x06dcr\ +oat\x07Emacron\x07emac\ +ron\x06Ebreve\x06ebrev\ +e\x0aEdotaccent\x0aedo\ +taccent\x07Eogonek\x07\ +eogonek\x06Ecaron\x06e\ +caron\x0bGcircumfle\ +x\x0bgcircumflex\x06Gb\ +reve\x06gbreve\x04Gdot\ +\x04gdot\x0cGcommaacce\ +nt\x0cgcommaaccent\x0b\ +Hcircumflex\x0bhcir\ +cumflex\x04Hbar\x04hba\ +r\x0aItilde.alt\x06iti\ +lde\x0bImacron.alt\x07\ +imacron\x0aIbreve.a\ +lt\x06ibreve\x0bIogone\ +k.alt\x07iogonek\x0eId\ +otaccent.alt\x08dot\ +lessi\x06IJ.alt\x02ij\x0b\ +Jcircumflex\x0bjcir\ +cumflex\x0cKcommaac\ +cent\x0ckcommaaccen\ +t\x0ckgreenlandic\x06L\ +acute\x06lacute\x0cLco\ +mmaaccent\x0clcomma\ +accent\x06Lcaron\x06lc\ +aron\x04Ldot\x04ldot\x06L\ +slash\x06lslash\x06Nac\ +ute\x06nacute\x0cNcomm\ +aaccent\x0cncommaac\ +cent\x06Ncaron\x06ncar\ +on\x0bnapostrophe\x03E\ +ng\x03eng\x07Omacron\x07o\ +macron\x06Obreve\x06ob\ +reve\x0dOhungarumla\ +ut\x0dohungarumlaut\ +\x02OE\x02oe\x06Racute\x06ra\ +cute\x0cRcommaaccen\ +t\x0crcommaaccent\x06R\ +caron\x06rcaron\x06Sac\ +ute\x06sacute\x0bScirc\ +umflex\x0bscircumfl\ +ex\x08Scedilla\x08sced\ +illa\x06Scaron\x06scar\ +on\x0cTcommaaccent\x0c\ +tcommaaccent\x06Tca\ +ron\x06tcaron\x04Tbar\x04\ +tbar\x06Utilde\x06util\ +de\x07Umacron\x07umacr\ +on\x06Ubreve\x06ubreve\ +\x05Uring\x05uring\x0dUhu\ +ngarumlaut\x0duhung\ +arumlaut\x07Uogonek\ +\x07uogonek\x0bWcircum\ +flex\x0bwcircumflex\ +\x0bYcircumflex\x0byci\ +rcumflex\x09Ydieres\ +is\x06Zacute\x06zacute\ +\x0aZdotaccent\x0azdot\ +accent\x06Zcaron\x06zc\ +aron\x05longs\x06flori\ +n\x0aAringacute\x0aari\ +ngacute\x07AEacute\x07\ +aeacute\x0bOslashac\ +ute\x0boslashacute\x0c\ +Scommaaccent\x0csco\ +mmaaccent\x0acircum\ +flex\x05caron\x06macro\ +n\x05breve\x09dotaccen\ +t\x04ring\x06ogonek\x05ti\ +lde\x0chungarumlaut\ +\x05tonos\x0ddieresist\ +onos\x0aAlphatonos\x09\ +anoteleia\x0cEpsilo\ +ntonos\x08Etatonos\x0d\ +Iotatonos.alt\x0cOm\ +icrontonos\x0cUpsil\ +ontonos\x0aOmegaton\ +os\x11iotadieresist\ +onos\x05Alpha\x04Beta\x05\ +Gamma\x07uni0394\x07Ep\ +silon\x04Zeta\x03Eta\x05T\ +heta\x08Iota.alt\x05Ka\ +ppa\x06Lambda\x02Mu\x02Nu\ +\x02Xi\x07Omicron\x02Pi\x03R\ +ho\x05Sigma\x03Tau\x07Ups\ +ilon\x03Phi\x03Chi\x03Psi\ +\x07uni03A9\x10Iotadie\ +resis.alt\x0fUpsilo\ +ndieresis\x0aalphat\ +onos\x0cepsilontono\ +s\x08etatonos\x09iotat\ +onos\x14upsilondier\ +esistonos\x05alpha\x04\ +beta\x05gamma\x05delta\ +\x07epsilon\x04zeta\x03et\ +a\x05theta\x04iota\x05kap\ +pa\x06lambda\x07uni03B\ +C\x02nu\x02xi\x07omicron\x02\ +pi\x03rho\x06sigma1\x05si\ +gma\x03tau\x07upsilon\x03\ +phi\x03chi\x03psi\x05omeg\ +a\x0ciotadieresis\x0fu\ +psilondieresis\x0co\ +microntonos\x0cupsi\ +lontonos\x0aomegato\ +nos\x09afii10023\x09af\ +ii10051\x09afii1005\ +2\x09afii10053\x09afii\ +10054\x0dafii10055.\ +alt\x0dafii10056.al\ +t\x09afii10057\x09afii\ +10058\x09afii10059\x09\ +afii10060\x09afii10\ +061\x09afii10062\x09af\ +ii10145\x09afii1001\ +7\x09afii10018\x09afii\ +10019\x09afii10020\x09\ +afii10021\x09afii10\ +022\x09afii10024\x09af\ +ii10025\x09afii1002\ +6\x09afii10027\x09afii\ +10028\x09afii10029\x09\ +afii10030\x09afii10\ +031\x09afii10032\x09af\ +ii10033\x09afii1003\ +4\x09afii10035\x09afii\ +10036\x09afii10037\x09\ +afii10038\x09afii10\ +039\x09afii10040\x09af\ +ii10041\x09afii1004\ +2\x09afii10043\x09afii\ +10044\x09afii10045\x09\ +afii10046\x09afii10\ +047\x09afii10048\x09af\ +ii10049\x09afii1006\ +5\x09afii10066\x09afii\ +10067\x09afii10068\x09\ +afii10069\x09afii10\ +070\x09afii10072\x09af\ +ii10073\x09afii1007\ +4\x09afii10075\x09afii\ +10076\x09afii10077\x09\ +afii10078\x09afii10\ +079\x09afii10080\x09af\ +ii10081\x09afii1008\ +2\x09afii10083\x09afii\ +10084\x09afii10085\x09\ +afii10086\x09afii10\ +087\x09afii10088\x09af\ +ii10089\x09afii1009\ +0\x09afii10091\x09afii\ +10092\x09afii10093\x09\ +afii10094\x09afii10\ +095\x09afii10096\x09af\ +ii10097\x09afii1007\ +1\x09afii10099\x09afii\ +10100\x09afii10101\x09\ +afii10102\x09afii10\ +103\x09afii10104\x09af\ +ii10105\x09afii1010\ +6\x09afii10107\x09afii\ +10108\x09afii10109\x09\ +afii10110\x09afii10\ +193\x09afii10050\x09af\ +ii10098\x06Wgrave\x06w\ +grave\x06Wacute\x06wac\ +ute\x09Wdieresis\x09wd\ +ieresis\x06Ygrave\x06y\ +grave\x06endash\x06emd\ +ash\x09afii00208\x0dun\ +derscoredbl\x09quot\ +eleft\x0aquoteright\ +\x0equotesinglbase\x0d\ +quotereversed\x0cqu\ +otedblleft\x0dquote\ +dblright\x0cquotedb\ +lbase\x06dagger\x09dag\ +gerdbl\x06bullet\x08el\ +lipsis\x0bperthousa\ +nd\x06minute\x06second\ +\x0dguilsinglleft\x0eg\ +uilsinglright\x09ex\ +clamdbl\x08fraction\ +\x09nsuperior\x05franc\ +\x09afii08941\x06peset\ +a\x04Euro\x09afii61248\ +\x09afii61289\x09afii6\ +1352\x09trademark\x05O\ +mega\x09estimated\x09o\ +neeighth\x0cthreeei\ +ghths\x0bfiveeighth\ +s\x0cseveneighths\x0bp\ +artialdiff\x05Delta\ +\x07product\x09summati\ +on\x05minus\x07radical\ +\x08infinity\x08integr\ +al\x0bapproxequal\x08n\ +otequal\x09lessequa\ +l\x0cgreaterequal\x07l\ +ozenge\x07uniFB01\x07u\ +niFB02\x0dcyrillicb\ +reve\x08dotlessj\x10ca\ +roncommaaccent\x0bc\ +ommaaccent\x11comma\ +accentrotate\x0czer\ +osuperior\x0cfoursu\ +perior\x0cfivesuper\ +ior\x0bsixsuperior\x0d\ +sevensuperior\x0dei\ +ghtsuperior\x0cnine\ +superior\x07uni2000\ +\x07uni2001\x07uni2002\ +\x07uni2003\x07uni2004\ +\x07uni2005\x07uni2006\ +\x07uni2007\x07uni2008\ +\x07uni2009\x07uni200A\ +\x07uni200B\x07uniFEFF\ +\x07uniFFFC\x07uniFFFD\ +\x07uni01F0\x07uni02BC\ +\x07uni03D1\x07uni03D2\ +\x07uni03D6\x07uni1E3E\ +\x07uni1E3F\x07uni1E00\ +\x07uni1E01\x07uni1F4D\ +\x07uni02F3\x09dasiaox\ +ia\x07uniFB03\x07uniFB\ +04\x05Ohorn\x05ohorn\x05U\ +horn\x05uhorn\x07uni03\ +00\x07uni0301\x07uni03\ +03\x04hook\x08dotbelow\ +\x07uni0400\x07uni040D\ +\x07uni0450\x07uni045D\ +\x07uni0460\x07uni0461\ +\x07uni0462\x07uni0463\ +\x07uni0464\x07uni0465\ +\x07uni0466\x07uni0467\ +\x07uni0468\x07uni0469\ +\x07uni046A\x07uni046B\ +\x07uni046C\x07uni046D\ +\x07uni046E\x07uni046F\ +\x07uni0470\x07uni0471\ +\x07uni0472\x07uni0473\ +\x07uni0474\x07uni0475\ +\x07uni0476\x07uni0477\ +\x07uni0478\x07uni0479\ +\x07uni047A\x07uni047B\ +\x07uni047C\x07uni047D\ +\x07uni047E\x07uni047F\ +\x07uni0480\x07uni0481\ +\x07uni0482\x07uni0483\ +\x07uni0484\x07uni0485\ +\x07uni0486\x07uni0488\ +\x07uni0489\x07uni048A\ +\x07uni048B\x07uni048C\ +\x07uni048D\x07uni048E\ +\x07uni048F\x07uni0492\ +\x07uni0493\x07uni0494\ +\x07uni0495\x07uni0496\ +\x07uni0497\x07uni0498\ +\x07uni0499\x07uni049A\ +\x07uni049B\x07uni049C\ +\x07uni049D\x07uni049E\ +\x07uni049F\x07uni04A0\ +\x07uni04A1\x07uni04A2\ +\x07uni04A3\x07uni04A4\ +\x07uni04A5\x07uni04A6\ +\x07uni04A7\x07uni04A8\ +\x07uni04A9\x07uni04AA\ +\x07uni04AB\x07uni04AC\ +\x07uni04AD\x07uni04AE\ +\x07uni04AF\x07uni04B0\ +\x07uni04B1\x07uni04B2\ +\x07uni04B3\x07uni04B4\ +\x07uni04B5\x07uni04B6\ +\x07uni04B7\x07uni04B8\ +\x07uni04B9\x07uni04BA\ +\x07uni04BB\x07uni04BC\ +\x07uni04BD\x07uni04BE\ +\x07uni04BF\x0buni04C0\ +.alt\x07uni04C1\x07uni\ +04C2\x07uni04C3\x07uni\ +04C4\x07uni04C5\x07uni\ +04C6\x07uni04C7\x07uni\ +04C8\x07uni04C9\x07uni\ +04CA\x07uni04CB\x07uni\ +04CC\x07uni04CD\x07uni\ +04CE\x0buni04CF.alt\ +\x07uni04D0\x07uni04D1\ +\x07uni04D2\x07uni04D3\ +\x07uni04D4\x07uni04D5\ +\x07uni04D6\x07uni04D7\ +\x07uni04D8\x07uni04D9\ +\x07uni04DA\x07uni04DB\ +\x07uni04DC\x07uni04DD\ +\x07uni04DE\x07uni04DF\ +\x07uni04E0\x07uni04E1\ +\x07uni04E2\x07uni04E3\ +\x07uni04E4\x07uni04E5\ +\x07uni04E6\x07uni04E7\ +\x07uni04E8\x07uni04E9\ +\x07uni04EA\x07uni04EB\ +\x07uni04EC\x07uni04ED\ +\x07uni04EE\x07uni04EF\ +\x07uni04F0\x07uni04F1\ +\x07uni04F2\x07uni04F3\ +\x07uni04F4\x07uni04F5\ +\x07uni04F6\x07uni04F7\ +\x07uni04F8\x07uni04F9\ +\x07uni04FA\x07uni04FB\ +\x07uni04FC\x07uni04FD\ +\x07uni04FE\x07uni04FF\ +\x07uni0500\x07uni0501\ +\x07uni0502\x07uni0503\ +\x07uni0504\x07uni0505\ +\x07uni0506\x07uni0507\ +\x07uni0508\x07uni0509\ +\x07uni050A\x07uni050B\ +\x07uni050C\x07uni050D\ +\x07uni050E\x07uni050F\ +\x07uni0510\x07uni0511\ +\x07uni0512\x07uni0513\ +\x07uni1EA0\x07uni1EA1\ +\x07uni1EA2\x07uni1EA3\ +\x07uni1EA4\x07uni1EA5\ +\x07uni1EA6\x07uni1EA7\ +\x07uni1EA8\x07uni1EA9\ +\x07uni1EAA\x07uni1EAB\ +\x07uni1EAC\x07uni1EAD\ +\x07uni1EAE\x07uni1EAF\ +\x07uni1EB0\x07uni1EB1\ +\x07uni1EB2\x07uni1EB3\ +\x07uni1EB4\x07uni1EB5\ +\x07uni1EB6\x07uni1EB7\ +\x07uni1EB8\x07uni1EB9\ +\x07uni1EBA\x07uni1EBB\ +\x07uni1EBC\x07uni1EBD\ +\x07uni1EBE\x07uni1EBF\ +\x07uni1EC0\x07uni1EC1\ +\x07uni1EC2\x07uni1EC3\ +\x07uni1EC4\x07uni1EC5\ +\x07uni1EC6\x07uni1EC7\ +\x0buni1EC8.alt\x07uni\ +1EC9\x0buni1ECA.alt\ +\x07uni1ECB\x07uni1ECC\ +\x07uni1ECD\x07uni1ECE\ +\x07uni1ECF\x07uni1ED0\ +\x07uni1ED1\x07uni1ED2\ +\x07uni1ED3\x07uni1ED4\ +\x07uni1ED5\x07uni1ED6\ +\x07uni1ED7\x07uni1ED8\ +\x07uni1ED9\x07uni1EDA\ +\x07uni1EDB\x07uni1EDC\ +\x07uni1EDD\x07uni1EDE\ +\x07uni1EDF\x07uni1EE0\ +\x07uni1EE1\x07uni1EE2\ +\x07uni1EE3\x07uni1EE4\ +\x07uni1EE5\x07uni1EE6\ +\x07uni1EE7\x07uni1EE8\ +\x07uni1EE9\x07uni1EEA\ +\x07uni1EEB\x07uni1EEC\ +\x07uni1EED\x07uni1EEE\ +\x07uni1EEF\x07uni1EF0\ +\x07uni1EF1\x07uni1EF4\ +\x07uni1EF5\x07uni1EF6\ +\x07uni1EF7\x07uni1EF8\ +\x07uni1EF9\x07uni20AB\ +\x07uni030F\x13circumf\ +lexacutecomb\x13cir\ +cumflexgravecomb\ +\x12circumflexhookc\ +omb\x13circumflexti\ +ldecomb\x0ebreveacu\ +tecomb\x0ebrevegrav\ +ecomb\x0dbrevehookc\ +omb\x0ebrevetildeco\ +mb\x10cyrillichookl\ +eft\x11cyrillicbigh\ +ookUC\x11cyrillicbi\ +ghookLC\x08one.pnum\ +\x07zero.os\x06one.os\x06\ +two.os\x08three.os\x07\ +four.os\x07five.os\x06\ +six.os\x08seven.os\x08\ +eight.os\x07nine.os\ +\x02ff\x07uni2120\x08Tced\ +illa\x08tcedilla\x05g.\ +alt\x0fgcircumflex.\ +alt\x0agbreve.alt\x08g\ +dot.alt\x10gcommaac\ +cent.alt\x01I\x06Igrav\ +e\x06Iacute\x0bIcircum\ +flex\x09Idieresis\x06I\ +tilde\x07Imacron\x06Ib\ +reve\x07Iogonek\x0aIdo\ +taccent\x02IJ\x09Iotat\ +onos\x04Iota\x0cIotadi\ +eresis\x09afii10055\ +\x09afii10056\x07uni04\ +C0\x07uni04CF\x07uni1E\ +C8\x07uni1ECA\x00\x00\x01\x00\x03\x00\ +\x08\x00\x0a\x00\x0d\x00\x07\xff\xff\x00\x0f\x00\x01\x00\x00\x00\ +\x0c\x00\x00\x00\x16\x00\x00\x00\x02\x00\x01\x00\x00\x03\xa9\x00\ +\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x0a\x004\x006\x00\x01latn\x00\x08\x00\x10\x00\ +\x02MOL \x00\x16ROM \x00\x1c\x00\x00\xff\ +\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x00n\x01\xe4\x00\x01l\ +atn\x00\x08\x00\x10\x00\x02MOL \x00(R\ +OM \x00B\x00\x00\xff\xff\x00\x09\x00\x03\x00\x08\x00\ +\x0b\x00\x00\x00\x0e\x00\x11\x00\x14\x00\x17\x00\x1a\x00\x00\xff\ +\xff\x00\x0a\x00\x04\x00\x06\x00\x09\x00\x0c\x00\x01\x00\x0f\x00\ +\x12\x00\x15\x00\x18\x00\x1b\x00\x00\xff\xff\x00\x0a\x00\x05\x00\ +\x07\x00\x0a\x00\x0d\x00\x02\x00\x10\x00\x13\x00\x16\x00\x19\x00\ +\x1c\x00\x1dliga\x00\xb0liga\x00\xb6l\ +iga\x00\xbclnum\x00\xc2lnum\x00\ +\xc8lnum\x00\xcelocl\x00\xd4loc\ +l\x00\xdaonum\x00\xe0onum\x00\xe8o\ +num\x00\xf0pnum\x00\xf8pnum\x00\ +\xfepnum\x01\x04salt\x01\x0asal\ +t\x01\x12salt\x01\x1ass01\x01\x22s\ +s01\x01*ss01\x012ss02\x01\ +:ss02\x01@ss02\x01Fss0\ +3\x01Lss03\x01Rss03\x01Xt\ +num\x01^tnum\x01ftnum\x01\ +n\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\ +\x01\x00\x09\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\ +\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x08\x00\x00\x00\x01\x00\ +\x08\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x01\x00\x04\x00\ +\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x0a\x00\x16\x00\x1e\x00&\x00\ +.\x006\x00>\x00F\x00N\x00V\x00^\x00\x01\x00\ +\x00\x00\x01\x00P\x00\x01\x00\x00\x00\x01\x00z\x00\x01\x00\ +\x00\x00\x01\x00\xaa\x00\x01\x00\x00\x00\x01\x00\xc6\x00\x01\x00\ +\x00\x00\x01\x00\xee\x00\x01\x00\x00\x00\x01\x00\xf4\x00\x01\x00\ +\x00\x00\x01\x01\x10\x00\x01\x00\x00\x00\x01\x01\x16\x00\x01\x00\ +\x00\x00\x01\x012\x00\x04\x00\x00\x00\x01\x01H\x00\x02\x00\ +\x10\x00\x05\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x00\x02\x00\ +\x05\x00J\x00J\x00\x00\x00\xdf\x00\xdf\x00\x01\x00\xe1\x00\ +\xe1\x00\x02\x00\xe3\x00\xe3\x00\x03\x00\xe5\x00\xe5\x00\x04\x00\ +\x02\x00.\x00\x14\x00,\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\ +\xea\x00\xec\x00\xee\x00\xf0\x00\xf2\x00\xf4\x01Z\x01g\x01\ +w\x01\xa1\x01\xa2\x02\xc9\x02\xd8\x03E\x03G\x00\x02\x00\ +\x01\x03\x96\x03\xa9\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\ +\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\ +\x8c\x00\x02\x00\x01\x00\x13\x00\x1c\x00\x00\x00\x02\x00\x1a\x00\ +\x0a\x03\x83\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\ +\x8b\x03\x8c\x03\x84\x00\x02\x00\x03\x00\x13\x00\x13\x00\x00\x00\ +\x15\x00\x1c\x00\x01\x03\x82\x03\x82\x00\x09\x00\x02\x00\x08\x00\ +\x01\x03\x82\x00\x01\x00\x01\x00\x14\x00\x02\x00\x1a\x00\x0a\x00\ +\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\ +\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\ +\x08\x00\x01\x00\x14\x00\x01\x00\x01\x03\x82\x00\x02\x00\x1a\x00\ +\x0a\x00\x13\x03\x82\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\ +\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\ +\x02\x00\x0e\x00\x04\x03\x8f\x03\x90\x01 \x01!\x00\x02\x00\ +\x02\x01$\x01%\x00\x00\x01I\x01J\x00\x02\x00\x01\x00\ +6\x00\x01\x00\x08\x00\x05\x00\x0c\x00\x14\x00\x1c\x00\x22\x00\ +(\x02^\x00\x03\x00I\x00O\x02]\x00\x03\x00I\x00\ +L\x03\x8d\x00\x02\x00I\x025\x00\x02\x00O\x024\x00\ +\x02\x00L\x00\x01\x00\x01\x00I\x00\x00\x00\x00\x00\x01\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x00\x15^\x00\x00\x00\x14\x00\ +\x00\x00\x00\x00\x00\x15V0\x82\x15R\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x07\x02\xa0\x82\x15C0\x82\x15?\x02\x01\ +\x011\x0b0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x000a\ +\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x04\xa0S0Q\ +0,\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1c\xa2\x1e\ +\x80\x1c\x00<\x00<\x00<\x00O\x00b\x00s\x00o\ +\x00l\x00e\x00t\x00e\x00>\x00>\x00>0!\ +0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x02\x05\xeb\ +U\xbc\x1d\xce\x7f\xdfaz\xa3\x80\xc6\xb2IVv\xab\ +\x08\xa0\x82\x11]0\x82\x03z0\x82\x02b\xa0\x03\x02\ +\x01\x02\x02\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\ +\xb5\xd6Z\xd50\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x000S1\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVer\ +iSign, Inc.1+0)\x06\ +\x03U\x04\x03\x13\x22VeriSign T\ +ime Stamping Ser\ +vices CA0\x1e\x17\x0d0706\ +15000000Z\x17\x0d12061\ +4235959Z0\x5c1\x0b0\x09\x06\x03\ +U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\ +\x13\x0eVeriSign, Inc.\ +1402\x06\x03U\x04\x03\x13+VeriS\ +ign Time Stampin\ +g Services Signe\ +r - G20\x81\x9f0\x0d\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\ +\x81\x81\x00\xc4\xb5\xf2R\x15\xbc\x88\x86`)\x16J[\ +/K\x91k\x87\x91\xf35TX5\xea\xd16^b\ +MRQ4q\xc2{f\x1d\x89\xc8\xdd*\xc4j\x0a\ +\xf67\xd9\x98t\x91\xf6\x92\xae\xb0\xb5v\x96\xf1\xa9J\ +cEG.k\x0b\x92NK+\x8c\xeeXJ\x8b\xd4\ +\x07\xe4\x1a,\xf8\x82\xaaX\xd9\xcdB\xf3-\xc0u\xde\ +\x8d\xab\xc7\x8e\x1d\x9alL\x08\x95\x1e\xde\xdb\xefg\xe1\ +r\xc2I\xc2\x9e`<\xe1\xe2\xbe\x16\xa3cxi\x14\ +{\xad-\x02\x03\x01\x00\x01\xa3\x81\xc40\x81\xc104\ +\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\ +\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18http\ +://ocsp.verisign\ +.com0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x02\ +0\x0003\x06\x03U\x1d\x1f\x04,0*0(\xa0\ +&\xa0$\x86\x22http://crl.\ +verisign.com/tss\ +-ca.crl0\x16\x06\x03U\x1d%\x01\x01\ +\xff\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\ +\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x06\xc00\ +\x1e\x06\x03U\x1d\x11\x04\x170\x15\xa4\x130\x111\x0f\ +0\x0d\x06\x03U\x04\x03\x13\x06TSA1-20\ +\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\ +\x01\x01\x00P\xc5K\xc8$\x80\xdf\xe4\x0d$\xc2\xde\x1a\ +\xb1\xa1\x02\xa1\xa6\x82-\x0c\x83\x15\x817\x0a\x82\x0e,\ +\xb0Z\x17a\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\x91\xb3V\x1a\ +@\xa6\xeb\x92\xbe89\xb0u6t:\x98O\xe47\ +\xba\x99\x89\xca\x95B\x1d\xb0\xb9\xc7\xa0\x8dW\xe0\xfa\xd5\ +d\x04B5N\x01\xd13\xa2\x17\xc8M\xaa'\xc7\xf2\ +\xe1\x86L\x028M\x83x\xc6\xfcS\xe0\xeb\xe0\x06\x87\ +\xdd\xa4\x96\x9e^\x0c\x98\xe2\xa5\xbe\xbf\x82\x85\xc3`\xe1\ +\xdf\xad(\xd8\xc7\xa5Kd\xda\xc7\x1b[\xbd\xac9\x08\ +\xd58\x22\xa13\x8b/\x8a\x9a\xeb\xbc\x07!?DA\ +\x09\x07\xb5e\x1c$\xbcH\xd3D\x80\xeb\xa1\xcf\xc9\x02\ +\xb4\x14\xcfT\xc7\x16\xa3\x80\x5c\xf9y>]r}\x88\ +\x17\x9e,C\xa2\xcaS\xce}=\xf6*:\xb8O\x94\ +\x00\xa5m\x0a\x83]\xf9^S\xf4\x18\xb3W\x0fp\xc3\ +\xfb\xf5\xad\x95\xa0\x0e\x17\xde\xc4\x16\x80`\xc9\x0f+n\ +\x86\x04\xf1\xeb\xf4x'\xd1\x05\xc5\xee4[^\xb9I\ +2\xf230\x82\x03\xc40\x82\x03-\xa0\x03\x02\x01\x02\ +\x02\x10G\xbf\x19\x95\xdf\x8dRFC\xf7\xdbmH\x0d\ +1\xa40\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000\x81\x8b1\x0b0\x09\x06\x03U\x04\x06\x13\x02Z\ +A1\x150\x13\x06\x03U\x04\x08\x13\x0cWest\ +ern Cape1\x140\x12\x06\x03U\x04\ +\x07\x13\x0bDurbanville1\x0f\ +0\x0d\x06\x03U\x04\x0a\x13\x06Thawte1\ +\x1d0\x1b\x06\x03U\x04\x0b\x13\x14Thawte\ + Certification1\x1f\ +0\x1d\x06\x03U\x04\x03\x13\x16Thawte \ +Timestamping CA0\ +\x1e\x17\x0d031204000000Z\ +\x17\x0d131203235959Z0\ +S1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1+0)\x06\x03U\x04\x03\ +\x13\x22VeriSign Time \ +Stamping Service\ +s CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\ +\x02\x82\x01\x01\x00\xa9\xca\xb2\xa4\xcc\xcd \xaf\x0a}\x89\ +\xac\x87u\xf0\xb4N\xf1\xdf\xc1\x0f\xbfga\xbd\xa3d\ +\x1c\xda\xbb\xf9\xca3\xab\x840\x89X~\x8c\xdbk\xdd\ +6\x9e\x0f\xbf\xd1\xecx\xf2w\xa6~o<\xbf\x93\xaf\ +\x0d\xbah\xf4l\x94\xca\xbdR-\xabH=\xf5\xb6\xd5\ +]_\x1b\x02\x9f\xfa/k\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\ +\x02\xe1\x7fLR\xe3\x0e`\xec@\x1c~\xb9\x0d\xde?\ +\xc7\xb4\xdf\x87\xbd_zj1.\x03\x99\x81\x13\xa8G\ + \xce1s\x0dW-\xcdx43\x95\x12\x99\x12\xb9\ +\xdeh/\xaa\xe6\xe3\xc2\x8a\x8c*\xc3\x8b!\x87f\xbd\ +\x83XWou\xbf<\xaa&\x87]\xca\x10\x15<\x9f\ +\x84\xeaT\xc1\x0an\xc4\xfe\xc5J\xdd\xb9\x07\x11\x97\x22\ +|\xdb>'\xd1\x1ex\xec\x9f1\xc9\xf1\xe6\x22\x19\xdb\ +\xc4\xb3GC\x9a\x1a_\xa0\x1e\x90\xe4^\xf5\xee|\xf1\ +}\xabb\x01\x8f\xf5M\x0b\xde\xd0\x22V\xa8\x95\xcd\xae\ +\x88v\xae\xee\xba\x0d\xf3\xe4M\xd9\xa0\xfbh\xa0\xae\x14\ +;\xb3\x87\xc1\xbb\x02\x03\x01\x00\x01\xa3\x81\xdb0\x81\xd8\ +04\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&\ +0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18ht\ +tp://ocsp.verisi\ +gn.com0\x12\x06\x03U\x1d\x13\x01\x01\xff\ +\x04\x080\x06\x01\x01\xff\x02\x01\x000A\x06\x03U\x1d\ +\x1f\x04:0806\xa04\xa02\x860htt\ +p://crl.verisign\ +.com/ThawteTimes\ +tampingCA.crl0\x13\x06\ +\x03U\x1d%\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\ +\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\ +\x01\x060$\x06\x03U\x1d\x11\x04\x1d0\x1b\xa4\x190\ +\x171\x150\x13\x06\x03U\x04\x03\x13\x0cTSA2\ +048-1-530\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00Jk\xf9\xeaX\ +\xc2D\x1c1\x89y\x99+\x96\xbf\x82\xac\x01\xd6\x1cL\ +\xcd\xb0\x8aXn\xdf\x08)\xa3^\xc8\xca\x93\x13\xe7\x04\ +R\x0d\xefG'/\x008\xb0\xe4\xc9\x93N\x9a\xd4\x22\ +b\x15\xf7?7!Op1\x80\xf1\x8b8\x87\xb3\xe8\ +\xe8\x97\x00\xfe\xcfU\x96N$\xd2\xa9'Nz\xae\xb7\ +aA\xf3*\xce\xe7\xc9\xd9^\xdd\xbb+\x85>\xb5\x9d\ +\xb5\xd9\xe1W\xff\xbe\xb4\xc5~\xf5\xcf\x0c\x9e\xf0\x97\xfe\ ++\xd3;R\x1b\x1b8'\xf7?J0\x82\x04\xfc0\ +\x82\x04e\xa0\x03\x02\x01\x02\x02\x10eR&\xe1\xb2.\ +\x18\xe1Y\x0f)\x85\xac\x22\xe7\x5c0\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000_1\x0b0\x09\x06\ +\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\ +\x0a\x13\x0eVeriSign, Inc\ +.1705\x06\x03U\x04\x0b\x13.Clas\ +s 3 Public Prima\ +ry Certification\ + Authority0\x1e\x17\x0d09\ +0521000000Z\x17\x0d190\ +520235959Z0\x81\xb61\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ve\ +riSign Trust Net\ +work1;09\x06\x03U\x04\x0b\x132T\ +erms of use at h\ +ttps://www.veris\ +ign.com/rpa (c)0\ +9100.\x06\x03U\x04\x03\x13'Veri\ +Sign Class 3 Cod\ +e Signing 2009-2\ + CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\ +\x82\x01\x01\x00\xbeg\x1d\xb4`\xaa\x10IoV\x17|\ +f\xc9^\x86\x0d\xd5\xf1\xac\xa7q\x83\x8e\x8b\x89\xf8\x88\ +\x04\x89\x15\x06\xba-\x84!\x95\xe4\xd1\x9cPL\xfb\xd2\ +\x22\xbd\xda\xf2\xb25;\x1e\x8f\xc3\x09\xfb\xfc\x13.Z\ +\xbf\x89|=;%\x1e\xf6\xf3X{\x9c\xf4\x01\xb5\xc6\ +\x0a\xb8\x80\xce\xbe'tag'Mj\xe5\xec\x81a\ +Xy\xa3\xe0\x17\x10\x12\x15'\xb0\xe1M4\x7f+G\ + D\xb9\xdef$f\x8a\xcdO\xba\x1f\xc58\xc8T\ +\x90\xe1r\xf6\x19fuj\xb9Ih\xcf8y\x0d\xaa\ +0\xa8\xdb,`H\x9e\xd7\xaa\x14\x01\xa9\x83\xd78\x91\ +09\x13\x96\x03:|@T\xb6\xad\xe0/\x1b\x83\xdc\ +\xa8\x11R>\x02\xb3\xd7+\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\ +\xa9\xa6\x10P\x0e4.M\xa7\xce\xc9^%\xd4\x8c\xbc\ +\xf3n|)\xbc\x01]\xfc1\x87Z\xd5\x8c\x85gX\ +\x88\x19\xa0\xbf5\xf0\xea+\xa3!\xe7\x90\xf6\x83\xe5\xa8\ +\xed`x^{`\x83\xfdW\x0b]A\x0dcT`\ +\xd6C!\xef\x02\x03\x01\x00\x01\xa3\x82\x01\xdb0\x82\x01\ +\xd70\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\ +\x01\xff\x02\x01\x000p\x06\x03U\x1d \x04i0g\ +0e\x06\x0b`\x86H\x01\x86\xf8E\x01\x07\x17\x030\ +V0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1ch\ +ttps://www.veris\ +ign.com/cps0*\x06\x08+\ +\x06\x01\x05\x05\x07\x02\x020\x1e\x1a\x1chttps\ +://www.verisign.\ +com/rpa0\x0e\x06\x03U\x1d\x0f\x01\x01\ +\xff\x04\x04\x03\x02\x01\x060m\x06\x08+\x06\x01\x05\x05\ +\x07\x01\x0c\x04a0_\xa1]\xa0[0Y0W0\ +U\x16\x09image/gif0!0\x1f\ +0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\ +\xac\x8d\x8ek\xc3\xcf\x80j\xd4H\x18,{\x19.0\ +%\x16#http://logo.v\ +erisign.com/vslo\ +go.gif0\x1d\x06\x03U\x1d%\x04\x160\ +\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\ +\x05\x05\x07\x03\x0304\x06\x08+\x06\x01\x05\x05\x07\x01\ +\x01\x04(0&0$\x06\x08+\x06\x01\x05\x05\x070\ +\x01\x86\x18http://ocsp.v\ +erisign.com01\x06\x03U\ +\x1d\x1f\x04*0(0&\xa0$\xa0\x22\x86 ht\ +tp://crl.verisig\ +n.com/pca3.crl0)\ +\x06\x03U\x1d\x11\x04\x220 \xa4\x1e0\x1c1\x1a0\ +\x18\x06\x03U\x04\x03\x13\x11Class3CA\ +2048-1-550\x1d\x06\x03U\x1d\x0e\ +\x04\x16\x04\x14\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08\ +-\xc45\x9b\xa4\xa1\x1e\xf20\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00\x8b\x03\xc0\xdd\x94\ +\xd8A\xa2ai\xb0\x15\xa8x\xc70\xc6\x90<~B\ +\xf7$\xb6\xe4\x83s\x17\x04\x7f\x04\x10\x9c\xa1\xe2\xfa\x81\ +/\xeb\xc0\xcaD\xe7r\xe0P\xb6U\x10 \x83n\x96\ +\x92\xe4\x9aQj\xb471\xdc\xa5-\xeb\x8c\x00\xc7\x1d\ +O\xe7M2\xba\x85\xf8N\xbe\xfagUe\xf0j\xbe\ +z\xcad8\x1a\x10\x10xEv1\xf3\x86z\x03\x0f\ +`\xc2\xb3]\x9d\xf6\x8bfv\x82\x1bY\xe1\x83\xe5\xbd\ +I\xa58V\xe5\xdeAw\x0eX\x0f0\x82\x05\x130\ +\x82\x03\xfb\xa0\x03\x02\x01\x02\x02\x10f\xe3\xf0gy\xca\ +\x15\x16mPSo\x88\x19\x1a\x830\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\xb61\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ver\ +iSign Trust Netw\ +ork1;09\x06\x03U\x04\x0b\x132Te\ +rms of use at ht\ +tps://www.verisi\ +gn.com/rpa (c)09\ +100.\x06\x03U\x04\x03\x13'VeriS\ +ign Class 3 Code\ + Signing 2009-2 \ +CA0\x1e\x17\x0d1007290000\ +00Z\x17\x0d12080823595\ +9Z0\x81\xd01\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x160\x14\x06\x03U\x04\x08\x13\x0dMas\ +sachusetts1\x0f0\x0d\x06\x03\ +U\x04\x07\x13\x06Woburn1\x1e0\x1c\x06\ +\x03U\x04\x0a\x14\x15Monotype I\ +maging Inc.1>0<\x06\ +\x03U\x04\x0b\x135Digital ID\ + Class 3 - Micro\ +soft Software Va\ +lidation v21\x180\x16\x06\ +\x03U\x04\x0b\x14\x0fType Opera\ +tions1\x1e0\x1c\x06\x03U\x04\x03\x14\x15\ +Monotype Imaging\ + Inc.0\x81\x9f0\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\ +\x81\x00\x94D\xa0\x95i|U\x0d\xd0\xdb\x16\x8d25\ +\x8aL3\xab^ \xa1L\xd7*\x878\xd7\x98\xa5@\ +\xf0\x19I\x0b\x22\x1eSO\xc2C\xa6\xca\x8b\xa9V\xef\ +nH\x06\xa8\x05\x159\x1ec;$\x12\x90\xb9\x98\xcf\ +\xca\x085}r\xe3GW\xfdy\xcb\x8aJ\xe7@p\ +-5c\x7f\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\ +\xd7\xa4\xa0\xdb\x09\xf2\xa2\xf2{\xef\xcdu\xc1\xf7eP\ +d\x22\x9d\xbd}\xbc\xad\xb8K\xccXE\x0eM\xd1Y\ +LM\x02\x03\x01\x00\x01\xa3\x82\x01\x830\x82\x01\x7f0\ +\x09\x06\x03U\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\ +\x0f\x01\x01\xff\x04\x04\x03\x02\x07\x800D\x06\x03U\x1d\ +\x1f\x04=0;09\xa07\xa05\x863htt\ +p://csc3-2009-2-\ +crl.verisign.com\ +/CSC3-2009-2.crl\ +0D\x06\x03U\x1d \x04=0;09\x06\x0b`\ +\x86H\x01\x86\xf8E\x01\x07\x17\x030*0(\x06\x08\ ++\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps:\ +//www.verisign.c\ +om/rpa0\x13\x06\x03U\x1d%\x04\x0c0\ +\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x030u\x06\x08+\ +\x06\x01\x05\x05\x07\x01\x01\x04i0g0$\x06\x08+\ +\x06\x01\x05\x05\x070\x01\x86\x18http://\ +ocsp.verisign.co\ +m0?\x06\x08+\x06\x01\x05\x05\x070\x02\x863h\ +ttp://csc3-2009-\ +2-aia.verisign.c\ +om/CSC3-2009-2.c\ +er0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\x97\ +\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\ +\xa1\x1e\xf20\x11\x06\x09`\x86H\x01\x86\xf8B\x01\x01\ +\x04\x04\x03\x02\x04\x100\x16\x06\x0a+\x06\x01\x04\x01\x82\ +7\x02\x01\x1b\x04\x080\x06\x01\x01\x00\x01\x01\xff0\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\ +\x01\x00N\xe6\x22\x87\xdfgA\x15\x17\xe2\xd2\xee~\x0e\ +\xce\xc2\x99\xd6c\xbd\xf0\xb5\x93\xe5jrb\xe1\xf5\xd2\ +<8\xee\xa8=\x08_\xbaG\x81\x82_[KI\xf4\ +\x1d \xfa\x0f\x93\x09\xd0\x1d\x19VD\x17\xa2\x88\xf3\xfb\ +\x8d\x9d\xae\xf7\x0d5\xde<\x0c\xacD\x94`E*\x9b\ +\xfe\x9boL;\xb14gp\x10\x86\xffZ9\x5cZ\ +\xe3l\x82\xab5|eK\xfd\x98m\xb5\x15\x94I\x9c\ +\x88p\x10\xbe=\xb1b\x95\xb4\xdb\xb4\xd4\xda\xe8\x9dA\ +\x90~\xfe}\xb9\xa4\x92\xebn\xf2\x22\x8a\xc6w6M\ +\x8aZ\x0bS\x051\xd3+(\xafR\xe1\x8dzk\xb5\ +wD\xbd\x0c\xad\xf4]%,\xe3\xcd\x8a0>K\x03\ +\x9cy\xca\xa6N\xae\x0b\xc2\xcc$\x07\x0b\xc1\x94\x82\xf6\ +\x10\xf1\xba\x90\xb6\x9b\x9a\xd8\x5c<\x13\xf1\xea\x02\x06\x18\ +'M<\x89o3\x8a\xd3\x86\xde\xe9X3u=\xeb\ +\x93i\xe2DoN\x00l\xcf\xd5\x85\xdaV\xa6\x9a\xa6\ +?\xcbL!h\x90\xf2`\xba\xe1\xe8\x06]9!\x13\ +2\xed1\x82\x03g0\x82\x03c\x02\x01\x010\x81\xcb\ +0\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02US\ +1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriS\ +ign, Inc.1\x1f0\x1d\x06\x03U\ +\x04\x0b\x13\x16VeriSign Tru\ +st Network1;09\x06\x03\ +U\x04\x0b\x132Terms of us\ +e at https://www\ +.verisign.com/rp\ +a (c)09100.\x06\x03U\x04\x03\ +\x13'VeriSign Class\ + 3 Code Signing \ +2009-2 CA\x02\x10f\xe3\xf0gy\ +\xca\x15\x16mPSo\x88\x19\x1a\x830\x09\x06\x05+\ +\x0e\x03\x02\x1a\x05\x00\xa0p0\x10\x06\x0a+\x06\x01\x04\ +\x01\x827\x02\x01\x0c1\x020\x000\x19\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x031\x0c\x06\x0a+\x06\x01\x04\x01\ +\x827\x02\x01\x040\x1c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x0b1\x0e0\x0c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x150#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x04\ +1\x16\x04\x14\x8c\x7f\xfd \xcc\xbf&.:m\x09\xec\ +Q\xd8\x8f\x88~)\x0c\x800\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80f\xf8\xe9\x8e\xb6J\ +\xf4\xae\xdf\x9b\x004\xda\xe5\x9e\xae\x81\x0e\x91\x91\xa4\xed\ +\xfc\xc5\xd2\x8a\xb3\x80\xcezp2\x11g\xa5+=\xac\ +\x94\x03\x9b\xae\xb6\x1c=\xa8Dc\xf5\xedDn\xbb\x9e\ +\x92\x9d\xda\xdc\xae\x9d\x11S\xc7\x1b\xee\x04\xad\x0c\xca\x81\ +v\xf2+D\x1c\xd0\xab#\xeb\xbe\xc0f\xf0\xf4\xce\x80\ +Ol\x08\x00\xd1\x82\xad\x0b\xefa_F\xedJ\x0a\xd4\ +\xf1q\xf9(\xf4l'R\x87\xcd-\xe9W\xb8I\xd8\ +?\xeb\xcbR\x9b\x1el\x02\xfc\x1d\xa1\x82\x01\x7f0\x82\ +\x01{\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x061\x82\x01\ +l0\x82\x01h\x02\x01\x010g0S1\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1+0)\x06\x03U\x04\x03\x13\x22Ver\ +iSign Time Stamp\ +ing Services CA\x02\ +\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\ +\xd50\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\xa0]0\x18\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\x0b\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x07\x010\x1c\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x09\x051\x0f\x17\x0d1105051\ +65510Z0#\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x041\x16\x04\x14\xc0\xefB\xbc\x08\xe0n\xc0&\ +\xe16\xe1\x8f\xf7\x08\xbc\x88\xfb\x1cu0\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80\x123\x84\ +\x96A\xd9\xf3\xd5\xc9\xbe\xdc\xb1a\xd6\xc3o\x10\xfcI\ +(*\x11l\x1f*\xf8\x09\xf2\x9b\xa1\xa2\x8d\xf8\xa6|\ +\xc7\xa0\xd6\xd0\x81/M\x07qy\xac)\xcc\xfc\x1a)\ +b\xee\xed\xd0u\xba'\xef\xb8\x93E\xbdJ\xed\x0eN\ +\xcc\x02|:\x9e\x22M&\xcd\xed.\xa2\x83\x1e\xdb\x0b\ +\xf1\x86O\xd6\xc1\xf7\xb6\x9b\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,E#E`D-,K#QX\xb9\ +\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD\ +-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f\ +`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01\ +aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b\ +!!!!!Y-,\xb0\x02CTXKS#\ +KQZX8\x1b!!Y\x1b!!!!Y-\ +,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\ +\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#\ +D\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04\ +%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\ +\xb0\x07%\x08\xb0\x07%\x10\xb0\x06% F\xb0\x04%\ +\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\ +\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\x07%\x10\ +\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\ +\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\x07\ +%\x08\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y\ +!!!!!!!-,\x02\xb0\x04% F\ +\xb0\x04%#B\xb0\x05%\x08\xb0\x03%EH!!\ +!!-,\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%\ +CH!!!-,E# E\x18 \xb0\x00P\ + X#e#Y#h \xb0@PX!\xb0@\ +Y#XeY\x8a`D-,KS#KQZ\ +X E\x8a`D\x1b!!Y-,KTX \ +E\x8a`D\x1b!!Y-,KS#KQZ\ +X8\x1b!!Y-,\xb0\x00!KTX8\x1b\ +!!Y-,\xb0\x02CTX\xb0F+\x1b!!\ +!!Y-,\xb0\x02CTX\xb0G+\x1b!!\ +!Y-,\xb0\x02CTX\xb0H+\x1b!!!\ +!Y-,\xb0\x02CTX\xb0I+\x1b!!!\ +Y-, \x8a\x08#KS\x8aKQZX#8\ +\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \ +\xb0@8\x11\x1b!Y-,\x01F#F`#F\ +a# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\ +\x8apE`h:-, \x8a#Id\x8a#S\ +X<\x1b!Y-,KRX}\x1bzY-,\ +\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\ +\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88\ +TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\ +\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1\ +$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01K\ +RX\xb2\x02\x08\x02C`BY\x1b\xb9@\x00\x00\x80\ +\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80\ +c\xb8\x01\x00\x88TX\xb2\x02\x08\x02C`BY\xb9\ +@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C\ +`BY\xb1&\x01\x88QX\xb9@\x00\x02\x00c\xb8\ +\x04\x00\x88TX\xb2\x02@\x02C`BY\xb9@\x00\ +\x04\x00c\xb8\x08\x00\x88TX\xb2\x02\x80\x02C`B\ +YYYYYY\xb1\x00\x02CTX@\x0a\x05@\ +\x08@\x09@\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\ +\x05@\x08\xba\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\ +\xb1\x80\x02CRX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\ +\x1b\xb2\x05@\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\ +\x00\x80\x88U\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZ\ +X\xb3\x0c\x00\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYB\ +BBBB-,E\x18h#KQX# E\ + d\xb0@PX|Yh\x8a`YD-,\xb0\ +\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02\ +#>\xb1\x01\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\ +\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\ +\x06#eB\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\ +\xb0\x02CP\xb0\x01\xb0\x02CT[X!#\x10\xb0\ + \x1a\xc9\x1b\x8a\x10\xedY-,\xb0Y+-,\x8a\ +\x10\xe5-@\xb0\x09TNd\x1fSF<\x1fRF\ +d\x1fPF3\x1fOF\xff\x1f!H U \x01\ +\x1eU\x1fH\x03U\x1f\x1e\x01\x0f\x1e?\x1e\xaf\x1e\x03\ +MJ\xff\x1fLI\xff\x1fKFr\x1f&4\x10U\ +%3$U\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\xff\x1f\ +JF?\x1fIF<\x1f\x133\x12U\x05\x01\x03U\ +\x043\x03U\x1f\x03\x01\x0f\x03?\x03\xaf\x03\x03HF\ +r\x1fGFk\x1f\x1c3\x1bU\x163\x15U\x11\x01\ +\x0fU\x103\x0fU\x0f\x0fO\x0f\x02\x1f\x0f\x7f\x0f\x9f\ +\x0f\xcf\x0f\x04\x0f\x0f\x8f\x0f\xff\x0f\x03\x06\x02\x01\x00U\ +\x013\x00Uo\x00\x7f\x00\xaf\x00\xef\x00\x04\x10\x00\x01\ +\x80\x16\x01\x05\x01\xb8\x01\x90\xb1TS++K\xb8\x07\ +\xffRK\xb0\x09P[\xb0\x01\x88\xb0%S\xb0\x01\x88\ +\xb0@QZ\xb0\x06\x88\xb0\x00UZ[X\xb1\x01\x01\ +\x8eY\x85\x8d\x8d\x00B\x1dK\xb02SX\xb0 \x1d\ +YK\xb0dSX\xb0\x16\x1d\xb1\x16\x00BYss\ +++^stu++++++st++\ ++++++++++++st+++\ ++++++\x18^\x06\x14\x00\x17\x00N\x05\xb6\x00\ +\x15\x00u\x05\xb6\x05\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x04?\x00\x15\x00\x9a\x00\x00\xff\xec\x00\ +\x00\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\xfe\x14\xff\ +\xec\x00\x00\x05\xb6\x00\x13\xfc\x94\xff\xe9\xfe\x93\xfeJ\xfe\ +\xa0\xff\xe3\x00\x12\xfe\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\ +\x00\x00\x00\x00V\x00Z\x00Q\x00^\x00R\x00X\x00\ +^\x00R\x00L\x00V\x00\x5c\x00\xc2\x00T\x00d\x00\ +J\x00\x00\x00\x00\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00E\x00\ +b\x00\xb8\x01%\x01\x90\x01\xfb\x02\x0e\x020\x02S\x02\ +\x88\x02\xa9\x02\xc2\x02\xd5\x02\xee\x03\x03\x03A\x03`\x03\ +\x9a\x03\xec\x04%\x04k\x04\xc1\x04\xdf\x05:\x05\x8d\x05\ +\xb9\x05\xe7\x06\x05\x06$\x06B\x06\x90\x07\x1c\x07M\x07\ +\x9c\x07\xd3\x08\x08\x086\x08[\x08\xa3\x08\xca\x08\xf5\x09\ +\x1a\x09D\x09^\x09\x94\x09\xbd\x09\xfd\x0a/\x0a|\x0a\ +\xba\x0b\x08\x0b'\x0bX\x0b{\x0b\xc0\x0b\xe8\x0c\x08\x0c\ +0\x0cM\x0ca\x0c~\x0c\x99\x0c\xb0\x0c\xc9\x0d\x14\x0d\ +`\x0d\x94\x0d\xde\x0e%\x0ek\x0e\xf6\x0f3\x0fU\x0f\ +\x8b\x0f\xba\x0f\xcc\x10\x22\x10Y\x10\x92\x10\xdd\x11*\x11\ +Z\x11\xa4\x11\xe1\x12\x19\x12;\x12y\x12\xa2\x12\xda\x13\ +\x02\x13U\x13g\x13\xbd\x13\xf1\x13\xf1\x14\x18\x14\x5c\x14\ +\xa9\x15\x0b\x15X\x15v\x15\xe2\x16\x09\x16\x80\x16\xc4\x16\ +\xf9\x17\x12\x17\x1a\x17\x9d\x17\xb1\x17\xe4\x18\x12\x18I\x18\ +\x99\x18\xb4\x18\xf3\x19 \x19)\x19N\x19r\x19\xa9\x19\ +\xde\x19\xf4\x1a\x09\x1a\x1f\x1am\x1a~\x1a\x8f\x1a\xa0\x1a\ +\xb1\x1a\xc3\x1a\xdc\x1b \x1b,\x1b=\x1bN\x1b_\x1b\ +q\x1b\x82\x1b\x93\x1b\xa4\x1b\xb6\x1c\x01\x1c\x12\x1c#\x1c\ +4\x1cE\x1cV\x1ch\x1c\x92\x1c\xf8\x1d\x09\x1d\x1a\x1d\ ++\x1d=\x1dN\x1d\x85\x1d\xf6\x1e\x06\x1e\x16\x1e&\x1e\ +6\x1eG\x1eX\x1e\xe0\x1e\xec\x1e\xfc\x1f\x0c\x1f\x1c\x1f\ +-\x1f>\x1fO\x1f`\x1fr\x1f\xdb\x1f\xeb\x1f\xfb \ +\x0b \x1b + < w \xd5 \xe5 \xf5!\ +\x05!\x16!&!r!\x84!\x95!\xa5!\xb6!\ +\xc6!\xd2!\xde!\xef!\xff\x22\x10\x22 \x221\x22\ +B\x22S\x22c\x22t\x22\x85\x22\x8d\x22\xf1#\x02#\ +\x12###3#D#U#a#m#~#\ +\x8e#\x9f#\xaf#\xc0#\xd0#\xe1#\xf2#\xfe$\ +\x0e$\x1f$0$w$\xcc$\xdd$\xee$\xff%\ +\x10%!%2%>%I%Z%k%w%\ +\x83%\x94%\xa5%\xb0%\xbb%\xe8%\xf9&\x0a&\ +\x15&!&2&B&N&Z&\x8b&\xb5&\ +\xc6&\xd6&\xe2&\xed&\xfe'\x0e'\x1e'b'\ +\xab'\xbc'\xcc'\xdd'\xed'\xff(\x10(h(\ +\xdd(\xee(\xfe)\x0a)\x16)')8)I)\ +Y)j){)\x87)\x93)\xa4)\xb5)\xc0)\ +\xcb)\xdc)\xec*!*u*\x86*\x96*\xa7*\ +\xb7*\xc8*\xd8*\xea*\xfb+\x0d+\x1e+*+\ +6+G+W+h+x+\x8a+\x9b+\xab+\ +\xbc+\xcd+\xde+\xef,&,q,\xea-\x11-\ +\x22-3-D-T-_-j-\x8f-\xb4-\ +\xc6-\xe9.\x01.2.T.\x86.\xb2.\xcc/\ +\x07/\x18/!/3/E/W/h/z/\ +\x8b/\x9e/\xa6/\xae/\xc7/\xcf/\xd7/\xdf/\ +\xe7060>0F0j0r0z0\xab0\ +\xb30\xd20\xda1\x111\x191!1v1~1\ +\xc52\x152'292I2Y2i2z2\ +\x8c2\xec3Q3|3\xd34)4t4\xb05\ +\x025(505\x845\x8c5\xb06\x156\x1d6\ +[6\x9f6\xdf7!7X7\x857\xd88+8\ +s8\xc48\xd68\xe78\xf79\x079\x189*9\ +x9\x899\xcd9\xd59\xdd9\xef9\xf7:L:\ +\x93:\xcf:\xe0:\xf1;\x1a;\x22;^;f;\ +n;\xad;\xb5;\xed<=\x0e>J>\ +\x88>\xbc?\x00?W?\x95?\x9d?\xf4@K@\ +\x98@\xf3@\xfbAoA\xc7A\xcfA\xdfB\x06B\ +@BzB\xa3B\xabB\xb3B\xbbB\xc3B\xcbB\ +\xd3C+C3C~C\xb9D\x0dDtD\xbeE\ +\x09EKE\x92E\xe2F7FHF\xacF\xbcF\ +\xfdG\x05G\x0dG\x1fG'G\x8dG\xe1G\xe9G\ +\xf9H\x09HPHqH\x91H\xa2H\xb2H\xc3H\ +\xd4H\xe6H\xf7I\x08I\x19I/IEIMI\ +ZItI\x8fI\xa8I\xc0I\xebJ\x16J@J\ +pJ\xc0J\xd9J\xe9K\x83K\x8bK\x93K\xb0K\ +\xccK\xd8K\xedL\x22L^L\xc7M2M\x96M\ +\xf4NEN\xa3N\xdfN\xe7O&O=OTO\ +kO\x82O\xd0O\xfaP\x18PDPVPvP\ +\xd3P\xfdQaQ\xa0Q\xc9Q\xf2R\x17R#R\ +/RSRxR\x93R\xacR\xc7R\xffS6S\ +vS\xc8S\xe7TBT\x95T\x95T\x95T\x95T\ +\x95T\x95T\x95T\x95T\x95T\x95T\x95T\x95T\ +\x95T\x95U\xaaU\xfcV\x0dV\x15V\x8fV\xc6W\ +&W7WHWTW`WmW\xa1W\xd3W\ +\xdfW\xebX>X\x8aX\xccY\x15Y\x1eY'Y\ +0YVYmY~Y\x8fY\x9fY\xafZ\x1eZ\ +YZ\xa3Z\xfb[T[\xa7[\xe1\x5c\x18\x5ce\x5c\ +\xaf]\x06]Z]\xc0^#^\xc0_]_e_\ +m_\xc6`\x15`K`}`\x8f`\xa1`\xad`\ +\xb9a0a\xa8boc$c\xb4d\x0fdHd\ +\x80d\xb9d\xdee\x0ce-ePf$f\x9bf\ +\xecgKg\x94g\xech=h\xa1h\xd1i\x00i\ +Ji\x94i\xd7jPj\x5cjhj\x9aj\xcck\ +\x0ckPk\x93k\xdal\x0al:lnl\xa2l\ +\xd4m\x03mQm\x9fn$n\x9bn\xa7n\xb3n\ +\xdeoNoVo}o\xb5o\xecp\x22pWp\ +\x8dp\xe5q&qlq\xber\x10rGr\x83r\ +\xeasIs\xbat#t+t\xcb\ +w\xfeT2,B2+C\x01y\x04=\xfa\x838\ +AH5E\x00\x00\x02\x00\xf8\x03\xa6\x03\x10\x05\xb6\x00\ +\x03\x00\x07\x00\x0d\xb4\x06\x02\x07\x03\x03\x00?3\xcd2\ +10\x01\x03#\x13!\x03#\x13\x01\xc7\x92=P\x01\ +\xc8\x91=O\x05\xb6\xfd\xf0\x02\x10\xfd\xf0\x02\x10\x00\x00\ +\x02\x00R\x00\x00\x05J\x05\xb6\x00\x1b\x00\x1f\x003@\ +\x18\x0e\x1f\x02\x02\x0b\x07\x03\x03\x05\x12\x16\x1a\x1a\x0f\x1c\ +\x1b\x1b\x18\x09\x05\x03\x14\x18\x12\x00?3?3\x129\ +/333\x1133\x119/333\x1133\ +10\x01\x13!7!\x133\x03!\x133\x03!\x07\ +!\x03!\x07!\x03#\x13!\x03#\x13!7!!\ +\x13!\x01\x85w\xfe\xd7\x08\x017\x86Z\x88\x01m\x87\ +V\x87\x01\x1d\x08\xfe\xd2v\x01/\x08\xfe\xc0\x85Z\x87\ +\xfe\x98\x86X\x86\xfe\xe5\x08\x01\x81\x01kx\xfe\x96\x02\ +\x12\x01\x8eP\x01\xc6\xfe:\x01\xc6\xfe:P\xferO\ +\xfe=\x01\xc3\xfe=\x01\xc3O\x01\x8e\x00\x03\x00\x8d\xff\ +\x89\x04!\x06\x10\x00!\x00(\x00/\x00>@\x22%\ +,\x12\x00(\x0e\x1e/\x08\x15\x0d\x03\x06\x0d\x06MY\ +\x22\x0d\x1d)\x15)MY\x18\x15\x0d\x15\x0d\x15\x17\x05\ +\x17\x00//\x1299//\x113+\x11\x003\x11\ +3+\x11\x003\x11\x12\x17910\x01\x14\x06\x07\x07\ +#7&&'5\x16\x163\x13.\x025467\ +73\x07\x16\x17\x07&'\x03\x1e\x02\x016654\ +&'\x13\x06\x06\x15\x14\x16\x17\x03\xa0\xdd\xbb5R3\ +O\x9e:A\xb1HnnV/\xd3\xa7)P)\x95\ +\x80#n\x92m|a2\xfey\x8e\xa3`m1\x86\ +\x8eJd\x01\xd3\x97\xb8\x0b\xf0\xf0\x02 \x1b^\x22'\ +\x02\x005LcC\x9b\xbf\x04\xc0\xc0\x05?N=\x09\ +\xfd\xfe\xfex\ +'\x01\x8a/\x06\x04\xfek\x08k\x1d\xfeo%\x01\xa1\ +\xfe\xa4N\x01>}f\xa8\x01\x98\x00\x00\x01\x00\xa2\x01\ +\x10\x04)\x04\x98\x00\x0b\x00\x12\xb7\x09\x01\x02\x01SY\ +\x06\x02\x00/3+\x11\x00310\x01!5!\x11\ +3\x11!\x15!\x11#\x023\xfeo\x01\x91e\x01\x91\ +\xfeoe\x02\xa0d\x01\x94\xfeld\xfep\x00\x01\xff\ +\xa6\xfe\xf8\x01\x02\x00\xee\x00\x08\x00\x08\xb1\x05\x00\x00/\ +\xcd107\x17\x06\x02\x07#6\x127\xfa\x08\x22\xa0\ +PJO|\x1a\xee\x17\x5c\xfe\xe5h\x84\x01\x16\x5c\x00\ +\x01\x00R\x01\xf6\x02-\x02P\x00\x03\x00\x0b\xb4\x01\x00\ +GY\x01\x00/+10\x137!\x07R\x12\x01\xc9\ +\x10\x01\xf6ZZ\x00\x01\x00R\xff\xee\x00\xf2\x00\xb0\x00\ +\x09\x00\x0c\xb5\x08\x03QY\x08\x16\x00?+107\ +4632\x15\x14\x06#\x22R2,B2*D\ +78AH5E\x00\x00\x01\xff\x9c\x00\x00\x03;\x05\ +\xb6\x00\x03\x00\x0a\xb3\x03\x03\x02\x12\x00??10\x01\ +\x01#\x01\x03;\xfc\xcfn\x03/\x05\xb6\xfaJ\x05\xb6\ +\x00\x00\x02\x00\x8b\xff\xec\x043\x05\xcd\x00\x0e\x00\x1c\x00\ +\x17@\x0c\x0d\x0fKY\x0d\x07\x05\x16KY\x05\x19\x00\ +?+\x00\x18?+10\x01\x14\x02\x02\x06#\x22&\ +\x114\x12\x1263 \x05\x22\x06\x02\x15\x14\x1632\ +6\x12\x114&\x043R\x97\xd8\x86\xb0\xb1Y\x9f\xd7\ +\x85\x01T\xfe\xa0\x86\xd7\x84}\x87\x8b\xd2zw\x03\xf8\ +\xc9\xfeh\xfe\xe4\x8f\xfd\x01\x05\xba\x01\x87\x01\x15\x89X\ +\xe2\xfeP\xeb\xde\xd6\xe0\x01\xc2\x01\x08\xc7\xc0\x00\x01\x01\ +b\x00\x00\x03R\x05\xb6\x00\x0a\x00\x0e\xb5\x04\x07\x09\x06\ +\x01\x18\x00??\xcd310!#\x1367\x06\x06\ +\x07'\x013\x02\x19i\xe1\x137*C\xd84\x01\x96\ +Z\x04\x1f\x5c\xc9$2\x88N\x01\x02\x00\x01\x00'\x00\ +\x00\x04-\x05\xcb\x00\x19\x00\x1e@\x0f\x07\x01\x0f\x0f\x0a\ +KY\x0f\x07\x01\x18LY\x01\x18\x00?+\x00\x18?\ ++\x11\x12\x00910!!7\x01>\x0254&\ +#\x22\x07'632\x16\x15\x14\x06\x06\x07\x01\x15!\ +\x03\x8d\xfc\x9a\x16\x01\xc1\xc6\xacQ\x84\x83\xb0\x9d6\xb4\ +\xd6\xad\xbfW\xc4\xd5\xfe\x81\x02\xe0h\x01\x92\xb1\xc7\xae\ +]p\x84\x81I\x92\xaa\x98n\xc5\xe2\xbe\xfe\xae\x04\x00\ +\x01\x007\xff\xec\x04\x19\x05\xcb\x00(\x00-@\x17\x03\ +\x18\x19\x19\x18LY\x19\x19\x0b&& KY&\x07\ +\x0b\x11KY\x0b\x19\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x00910\x01\x14\x06\x07\x15\x16\ +\x16\x15\x14\x06\x06#\x22&'5\x1632654\ +&##732654&#\x22\x07'66\ +32\x16\x04\x19\xd4\xb4u\x89\x80\xe7\x9f`\xb1A\xac\ +\xac\xc5\xd5\xb2\x9eu\x15n\xd1\xf8\x7f}\xa7\xb11T\ +\xd0r\xa1\xb7\x04\x96\xa2\xe2\x1e\x04\x18\xb7\x87\x86\xc6b\ +) eV\xb3\xa3\x91\x9c`\xbf\xa3rz\x83KC\ +K\xa5\x00\x00\x02\x00\x17\x00\x00\x04D\x05\xc5\x00\x0a\x00\ +\x12\x00!@\x10\x0f\x07\x01\x05\x12\x05KY\x09\x12\x12\ +\x03\x07\x07\x03\x18\x00??\x129/3+\x11\x003\ +\x11310\x01!\x03#\x13!7\x013\x03!!\ +\x12\x127#\x06\x07\x01\x04/\xfe\xf8P`P\xfdP\ +\x14\x03qv\xd7\x01\x09\xfe\x95OP.\x04B?\xfd\ +u\x01s\xfe\x8d\x01s`\x03\xf2\xfc\x06\x01q\x01{\ +\xa5[K\xfd\x15\x00\x01\x00X\xff\xec\x043\x05\xb6\x00\ +\x1b\x00/@\x18\x14\x1a\x1a\x00\x00\x12MY\x00\x00\x06\ +\x16\x16\x19LY\x16\x06\x06\x0cKY\x06\x19\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x003\x113\ +10\x012\x16\x15\x14\x00!\x22&'5\x1632\ +654&#\x22\x07'\x13!\x07!\x036\x02F\ +\xbc\xd1\xfe\xd8\xfe\xfdT\xbbA\xaa\xaa\xd0\xf1\xaa\x8c\x85\ +nB\xc1\x02p\x12\xfd\xe3\x95b\x03o\xcc\xb1\xed\xfe\ +\xe7(\x1fkZ\xe5\xc7\x8c\x9f)1\x02\x93`\xfd\xfc\ +\x1d\x00\x02\x00\xaa\xff\xec\x04V\x05\xc9\x00\x19\x00(\x00\ +-@\x17\x0c\x17\x04\x10!KY\x10\x10\x17\x04\x04\x09\ +KY\x04\x07\x17\x1aKY\x17\x19\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x00910\x13\x10\ +\x12$32\x17\x07&#\x22\x00\x0336632\ +\x16\x15\x14\x06\x06#\x22&\x0526654&#\ +\x22\x0e\x02\x15\x14\x16\xaa\xd2\x01I\xdb{;\x12VT\ +\xe9\xfe\xbfI\x08D\xc0s\xa1\xb3x\xde\x92\xab\xbd\x01\ +up\xa9[\x86\x80Q\x92p,\x91\x01\xac\x01\x1b\x02\ +\x0b\xf7\x15Z\x17\xfe\xa4\xfe\xb8^b\xc9\xb6\x9c\xfa\x8c\ +\xee\x96u\xcf~\x92\x9d?owr\xa4\xb6\x00\x01\x00\ +\xf4\x00\x00\x04\x83\x05\xb6\x00\x06\x00\x16@\x0a\x00\x18\x05\ +\x02\x03\x02LY\x03\x06\x00?+\x11\x003\x18?1\ +03\x01!7!\x07\x01\xf4\x03\x1c\xfd\x02\x17\x03Z\ +\x14\xfc\xf5\x05V`n\xfa\xb8\x00\x03\x00b\xff\xec\x04\ +B\x05\xcd\x00\x18\x00$\x000\x00#@\x13+\x13\x06\ +\x19\x04\x0d\x00\x0d\x1fKY\x0d\x19\x00%KY\x00\x07\ +\x00?+\x00\x18?+\x11\x12\x00\x17910\x012\ +\x16\x15\x14\x06\x07\x16\x16\x15\x14\x06\x06#\x22&54\ +67&&546\x13\x06\x06\x15\x14\x16326\ +54&\x03\x22\x06\x15\x14\x16\x176654&\x02\ +\xe1\xa3\xbe\xa8\xc9\x82xt\xd7\x99\xb2\xd3\xc9\xdddX\ +\xe42\xda\xbf\x9b\x8e\xa8\xcc|\x13\x82\xa9St\xc0\xae\ +\x8d\x05\xcd\xaa\x90\x8a\xc1LN\xb9tt\xb8i\xb9\xa1\ +\x9f\xdbNH\xa0d\x9f\xd4\xfd\x10I\xbd\x83\x88\x8d\xb6\ +\x8eh\xaa\x02\xe2\xa4y[\x88J>\xa4|m\x7f\x00\ +\x02\x00s\xff\xec\x04#\x05\xc9\x00\x17\x00&\x00-@\ +\x17\x0c\x04\x15\x1f\x0eLY\x1f\x1f\x04\x15\x15\x18KY\ +\x15\x07\x04\x09MY\x04\x19\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x00910\x01\x10\x02\x04\ +#\x22'5\x163 \x13#\x06#\x22&546\ +632\x16%\x22\x06\x06\x15\x14\x1632>\x025\ +4&\x04#\xcb\xfe\xbc\xe7rHWi\x01\xda\x99\x08\ +\x8c\xe3\xa2\xbaw\xde\x92\xae\xbb\xfe\x8bp\xabZ\x87}\ +S\x95m,\x8e\x04\x08\xfe\xe0\xfd\xf8\xf4\x16Z\x1d\x02\ +\xa2\xc0\xd2\xb3\x9b\xfc\x8c\xe7\x8fu\xd0~\x91\xa0An\ +vu\xa6\xb4\x00\x00\x02\x00f\xff\xee\x01\xa4\x04V\x00\ +\x09\x00\x13\x00\x17@\x0c\x03\x08QY\x03\x10\x12\x0dQ\ +Y\x12\x16\x00?+\x00\x18?+10\x01463\ +2\x15\x14\x06#\x22\x034632\x15\x14\x06#\x22\ +\x01\x043+B2*D\x9e3,A3)D\x03\ +\xdd9@H7D\xfc\xa48AH7C\x00\x02\xff\ +\xcb\xfe\xf8\x01\xaa\x04V\x00\x08\x00\x12\x00\x17@\x0a\x05\ +\x08\x05\x0c\x0c\x11QY\x0c\x10\x00?+\x00\x18\x10\xc4\ +/\xc610%\x17\x06\x02\x07#6\x127\x1346\ +32\x15\x14\x06#\x22\x01\x1f\x08#\xa7IIO|\ +\x1aZ3+B2*D\xee\x17`\xfe\xdc[\x84\x01\ +\x16\x5c\x02\xef9@H7D\x00\x01\x00\x89\x01\x06\x04\ +\x1b\x04\xc5\x00\x06\x00\x11\xb5\x00\x03 \x01\x02\x05\x00\x19\ +/33\x1a\xcd\xcd10\x01\x015\x01\x15\x01\x01\x04\ +\x1b\xfcn\x03\x92\xfc\xdf\x03!\x01\x06\x01\x9eJ\x01\xd7\ +g\xfeq\xfe\xa2\x00\x02\x00\xa8\x01\xcd\x04/\x03\xd9\x00\ +\x03\x00\x07\x00\x17@\x0b\x05\x04SY\x05\x01\x01\x00S\ +Y\x01\x00/+\x00\x18\x10\xc6+10\x135!\x15\ +\x015!\x15\xa8\x03\x87\xfcy\x03\x87\x03udd\xfe\ +Xbb\x00\x01\x00\xaa\x01\x06\x04=\x04\xc5\x00\x06\x00\ +\x11\xb5\x06\x03 \x05\x04\x01\x00\x19/33\x1a\xcd\xcd\ +10\x13\x01\x015\x01\x15\x01\xaa\x03!\xfc\xdf\x03\x93\ +\xfcm\x01q\x01^\x01\x8fg\xfe)J\xfeb\x00\x00\ +\x02\x00\xaa\xff\xf2\x03s\x05\xcb\x00\x1b\x00%\x00)@\ +\x14\x08\x11\x00\x00$\x11$\x1fQY$\x16\x0d\x11\x11\ +\x0bPY\x11\x04\x00?+\x11\x003\x18?+\x11\x12\ +\x009\x18/\x12910\x137667>\x025\ +4&#\x22\x07'6632\x16\x15\x14\x06\x07\x0e\ +\x02\x07\x034632\x15\x14\x06#\x22\xf2\x06\x1dj\ +hvr;\x87s\x8b\xa8'U\xade\x9f\xb7\x84\xa5\ +U_3\x15\xa42,B1+D\x01j\x1d\x84\x95\ +IT{\x84Kl|eV1:\xa9\x91\x7f\xd6w\ +=__`\xfe\xd18AG6E\x00\x02\x00}\xff\ +H\x06\x98\x05\xb2\x009\x00F\x00A@!\x08A6\ +\x12:FY\x12\x12.6\x04\x0bA\x0bFY\x1aA\ +A.6.)GY.6\x22GY6\x03\x00?\ ++\x00\x18/+\x11\x12\x009\x18/3+\x11\x003\ +\x11\x129\x18/+\x11\x12\x00910\x01\x14\x02\x06\ +#\x22&5#\x06\x06#\x22&546632\ +\x17\x03\x06\x15\x14\x16326654&&#\x22\ +\x04\x02\x15\x10\x00!27\x15\x06#\x22$\x025\x10\ +\x12$!2\x04\x12\x05\x22\x06\x06\x15\x14\x16326\ +7\x13&\x06\x98p\xc5qbq\x046\x9dZp\x84\ +~\xe6\x92z\x82T'EBV\x94W\x82\xf4\xaa\xeb\ +\xfe\x85\xd4\x016\x01\x18\xcf\xd5\xd2\xda\xcb\xfe\xcb\xa8\xf3\ +\x01\xaf\x01\x02\xbd\x01\x1b\x9f\xfdXq\xb7fQIe\ +\x9f-NB\x03Z\xb3\xfe\xdf\xa5nYaf\x92\x81\ +\x9c\xfe\x8f4\xfe\xc5\x8cQGQ\x93\xf9\x7f\x9c\xf2\x86\ +\xd9\xfey\xf4\xfe\xe0\xfe\xbeRZR\xa5\x019\xd6\x01\ +\x14\x01\xb3\xef\x91\xfe\xe7?v\xd5\x84\x5ce\xb2\xa6\x01\ +!\x17\x00\x00\x02\xff\x91\x00\x00\x03\xd3\x05\xbc\x00\x07\x00\ +\x0e\x00\x1d@\x0e\x0b\x04\x0e\x01IY\x0e\x0e\x03\x04\x03\ +\x07\x03\x12\x00?3?\x129/+\x11\x00310\ +\x01!\x01#\x013\x13#\x03\x03&'\x06\x06\x01\x03\ +%\xfe\x00\xfe\xe1u\x036C\xc9iQ'\x1f\x08\x1e\ +E\xfe\xf0\x02\x08\xfd\xf8\x05\xbc\xfaD\x02d\x01#\xf2\ +\xa0?\x86\xfe\x10\x00\x03\x00f\x00\x00\x04\x9e\x05\xb6\x00\ +\x0f\x00\x18\x00!\x00-@\x17\x07\x10\x19\x10\x19IY\ +\x10\x10\x0f\x00\x00\x18IY\x00\x03\x0f\x1aIY\x0f\x12\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x01!2\x16\x15\x14\x06\x07\x15\x16\x16\x15\ +\x14\x04#!\x01!2654&#!\x03\x03!\ +2654&#\x01\x9c\x01{\xbe\xc9\xb4\xa4}\x7f\ +\xfe\xe7\xfa\xfe7\x01\x13\x01\x16\xce\xd6\x9c\x97\xfe\xf0\x8a\ +\x87\x01V\xc9\xd9\xb4\xb9\x05\xb6\xa8\x9d\x99\xc0\x1c\x04\x1f\ +\xa5z\xcd\xed\x03+\xa2\x9dw{\xfdu\xfd\x89\xaf\xa9\ +\x91\x8e\x00\x00\x01\x00\xaa\xff\xec\x04\xf4\x05\xcb\x00\x18\x00\ +\x17@\x0c\x13\x00IY\x13\x04\x0c\x07IY\x0c\x13\x00\ +?+\x00\x18?+10\x01\x22\x04\x02\x15\x14\x163\ +27\x15\x06#\x22\x00\x11\x10\x12$32\x17\x07&\ +&\x03\xc1\xc5\xfe\xcb\xb5\xdd\xcf\x8c\xa4\x9c\xa0\xfc\xfe\xf4\ +\xd1\x01h\xde\xb1\x82-7\x8b\x05m\xd1\xfep\xf1\xe1\ +\xf23^1\x01\x22\x01\x09\x01\x0a\x01\xbc\xeeDZ\x1e\ +\x22\x00\x02\x00f\x00\x00\x05\x08\x05\xb6\x00\x09\x00\x12\x00\ +\x17@\x0c\x06\x11IY\x06\x03\x05\x12IY\x05\x12\x00\ +?+\x00\x18?+10\x01\x14\x02\x04#!\x01!\ + \x00\x012$\x125\x10!#\x01\x05\x08\xdb\xfe\x82\ +\xff\xfe\xb6\x016\x011\x01\x1a\x01!\xfc\xa6\xe2\x01Q\ +\xb9\xfe$\xce\xfe\xed\x03o\xfd\xfe_\xd1\x05\xb6\xfe\xd9\ +\xfb\xcb\xbd\x01j\xe7\x01\xf2\xfb\x00\x00\x00\x01\x00f\x00\ +\x00\x04s\x05\xb6\x00\x0b\x00&@\x14\x06\x09IY\x06\ +\x06\x01\x02\x02\x05IY\x02\x03\x01\x0aIY\x01\x12\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10!\ +!\x01!\x07!\x03!\x07!\x03!\x03=\xfd)\x01\ +6\x02\xd7\x15\xfd\x90u\x02N\x15\xfd\xb4\x87\x02s\x05\ +\xb6^\xfd\xd7^\xfd\x8d\x00\x01\x00f\x00\x00\x04`\x05\ +\xb6\x00\x09\x00\x1d@\x0f\x06\x09IY\x06\x06\x02\x01\x12\ +\x02\x05IY\x02\x03\x00?+\x00\x18?\x129/+\ +103#\x01!\x07!\x03!\x07!\xcdg\x016\ +\x02\xc4\x14\xfd\xa4\x86\x02:\x15\xfd\xc7\x05\xb6^\xfd\x94\ +_\x00\x01\x00\xaa\xff\xec\x05=\x05\xcb\x00\x1d\x00&@\ +\x14\x00\x1dIY\x00\x00\x04\x0b\x0b\x12IY\x0b\x04\x04\ +\x19IY\x04\x13\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01!\x03\x06# \x00\x11\x10\x12$\ +32\x16\x17\x07&&#\x22\x04\x02\x15\x14\x1632\ +7\x13!\x03X\x01\x96\x96\xd3\xc2\xfe\xff\xfe\xe8\xd2\x01\ +e\xd9q\xb4^&n\x9fX\xb8\xfe\xca\xb2\xe5\xd4\x9b\ +\x9au\xfe\xd1\x02\xdf\xfdVI\x01$\x01\x13\x01\x09\x01\ +\xb5\xea&(^. \xd7\xfe|\xef\xe5\xf6/\x02\x0e\ +\x00\x00\x01\x00f\x00\x00\x05\x5c\x05\xb6\x00\x0b\x00\x1a@\ +\x0d\x08\x03IY\x08\x08\x05\x0a\x06\x03\x01\x05\x12\x00?\ +3?3\x129/+10!#\x13!\x03#\x01\ +3\x03!\x133\x04'd\x97\xfd\x08\x95g\x016f\ +\x8b\x02\xf8\x89d\x02\xcf\xfd1\x05\xb6\xfdw\x02\x89\x00\ +\x01\xff\xdb\x00\x00\x02\xb2\x05\xb6\x00\x0b\x00 @\x10\x09\ +\x04\x06\x04JY\x06\x03\x0a\x03\x01\x03JY\x01\x12\x00\ +?+\x11\x003\x18?+\x11\x00310!!7\ +7\x01'7!\x07\x07\x01\x17\x01\x7f\xfe\x5c\x0e\xa4\x01\ +\x15\x9e\x0a\x01\xa4\x0a\xa0\xfe\xea\x99?\x0b\x05 \x0bA\ +A\x0b\xfa\xe0\x0b\x00\x01\xfe\xbc\xfe\x98\x01\xf4\x05\xb6\x00\ +\x0d\x00\x11\xb7\x09\x03\x00\x06IY\x00\x22\x00?+\x00\ +\x18?10\x03\x22&'7\x16327\x013\x01\ +\x06\x06\xb40P\x10\x0b9P\xd51\x015i\xfe\xc6\ +#\xb4\xfe\x98\x10\x08\x5c\x14\xf1\x05\xcd\xfa-\xaa\xa1\x00\ +\x01\x00f\x00\x00\x05\x1b\x05\xb6\x00\x0c\x00\x18@\x0c\x08\ +\x03\x02\x0c\x04\x05\x0a\x06\x03\x01\x05\x12\x00?3?3\ +\x12\x17910!#\x01\x07\x03#\x013\x037\x01\ +3\x01\x03\xd3o\xfe\xaa\xbe\x83g\x016f\x9e\x85\x02\ +\xa8\x8a\xfdE\x03\x14\x99\xfd\x85\x05\xb6\xfd-y\x02Z\ +\xfd\x9e\x00\x00\x01\x00f\x00\x00\x03N\x05\xb6\x00\x05\x00\ +\x11\xb7\x01\x03\x00\x03IY\x00\x12\x00?+\x00\x18?\ +103\x013\x01!\x07f\x016f\xfe\xdf\x02m\ +\x17\x05\xb6\xfa\xaa`\x00\x00\x01\x00m\x00\x00\x06w\x05\ +\xb6\x00\x13\x00\x19@\x0c\x00\x10\x01\x0c\x07\x03\x11\x03\x0a\ +\x04\x10\x12\x00?33?\x173\x11310%\x01\ +3\x01#\x13\x127#\x01#\x03#\x06\x03\x03#\x01\ +3\x13\x03\x04\x02\xdd\x96\xfe\xd3e\xbfO\x15\x06\xfc\xf4\ +3\xde\x06\x14:\xc4`\x015\x8f\xcd\xcd\x04\xe9\xfaJ\ +\x03\x85\x01qN\xfa\xbc\x05D\x9a\xfe\xf0\xfcf\x05\xb6\ +\xfb\x17\x00\x00\x01\x00f\x00\x00\x05b\x05\xb6\x00\x0f\x00\ +\x12\xb7\x03\x0e\x08\x03\x0b\x01\x07\x12\x00?33?3\ +310!#\x01#\x06\x06\x03#\x013\x0136\ +7\x133\x04-V\xfd\xfc\x08\x172\xbd_\x016P\ +\x02\x0a\x08\x173\xbc^\x05\x04\x95\xf8\xfc\x89\x05\xb6\xfa\ +\xf2\xb0\xf0\x03n\x00\x02\x00\xac\xff\xec\x05{\x05\xcb\x00\ +\x0d\x00\x1b\x00\x17@\x0c\x0b\x0eIY\x0b\x04\x04\x15I\ +Y\x04\x13\x00?+\x00\x18?+10\x01\x14\x02\x04\ +#\x22\x00\x11\x10\x12$32\x00%\x22\x04\x02\x15\x14\ +\x1232$\x1254&\x05{\xbc\xfe\xc4\xcf\xfa\xfe\ +\xf2\xba\x01D\xd3\xf7\x01\x07\xfd\xf4\xae\xfe\xf3\xa0\xdb\xd2\ +\xa9\x01\x06\x9e\xd1\x03\x8f\xff\xfe;\xdf\x01*\x01\x19\x01\ +\x06\x01\xaf\xe7\xfe\xd7\xcb\xca\xfev\xdc\xf5\xff\x00\xc5\x01\ +\x93\xe5\xf0\xf8\x00\x00\x02\x00f\x00\x00\x04y\x05\xb6\x00\ +\x09\x00\x11\x00\x1d@\x0f\x0a\x03IY\x0a\x0a\x06\x05\x12\ +\x06\x11IY\x06\x03\x00?+\x00\x18?\x129/+\ +10\x01\x10!#\x03#\x01!2\x16\x01326\ +5\x10!#\x04y\xfd\x9e\xc9\x81g\x016\x01;\xca\ +\xd8\xfc\xe5\xbf\xfc\xf3\xfe\xb7\xd3\x04N\xfe\x0c\xfd\xa6\x05\ +\xb6\xb9\xfd\xb9\xc1\xd1\x01\x12\x00\x00\x02\x00\xac\xfe\xa4\x05\ +{\x05\xcb\x00\x11\x00\x1f\x00#@\x11\x04\x07\x0f\x06\x08\ +\x0f\x12IY\x0f\x04\x08\x19IY\x08\x13\x00?+\x00\ +\x18?+\x00\x18\x10\xc6\x129910\x01\x14\x02\x06\ +\x07\x01#\x03\x07\x22\x00\x11\x10\x12$32\x00%\x22\ +\x04\x02\x15\x14\x1232$\x1254&\x05{\x8c\xe9\ +\x9e\x01\x0b\x8e\xe7J\xfa\xfe\xf2\xba\x01D\xd3\xf7\x01\x07\ +\xfd\xf4\xae\xfe\xf3\xa0\xdb\xd2\xa9\x01\x06\x9e\xd1\x03\x8f\xd8\ +\xfel\xf4-\xfe\xa2\x01L\x04\x01*\x01\x19\x01\x06\x01\ +\xaf\xe7\xfe\xd7\xcb\xca\xfev\xdc\xf5\xff\x00\xc5\x01\x93\xe5\ +\xf0\xf8\x00\x00\x02\x00f\x00\x00\x04y\x05\xb6\x00\x0d\x00\ +\x15\x00(@\x14\x09\x0d\x03\x00\x0e\x00IY\x0e\x0e\x03\ +\x0c\x02\x12\x03\x15IY\x03\x03\x00?+\x00\x18?3\ +\x129/+\x11\x12\x009910\x01\x03#\x01!\ + \x11\x14\x06\x07\x12\x17#\x03%3265\x10!\ +#\x01P\x83g\x016\x01/\x01\xae\xcf\xb2\xc9\x14o\ +\xd3\xfe\xd3\xfc\xd0\xda\xfe\xb7\xd3\x02y\xfd\x87\x05\xb6\xfe\ +\x98\xb6\xf2\x1f\xfd\xb18\x02y\x5c\xbf\xba\x01\x0c\x00\x00\ +\x01\x00%\xff\xec\x04\x0c\x05\xcb\x00)\x00 @\x10\x0d\ +#\x04\x19\x19 JY\x19\x04\x04\x0aIY\x04\x13\x00\ +?+\x00\x18?+\x11\x12\x009910\x01\x14\x06\ +\x06#\x22&'5\x1632654.\x02'&\ +&546632\x16\x17\x07&&#\x22\x06\x15\ +\x14\x16\x17\x1e\x02\x03\x7f\x83\xe4\x9bX\xa9W\xa3\xb9\xbc\ +\xd7\x22GoL\x96wv\xd4\x83c\xa2W B\xab\ +O\xa3\xc1b\x85\x9aw;\x01\x93~\xc5d\x22)m\ +\x5c\xad\x92=WFB*L\xb0vv\xb3c#+\ +^(.\xa5\x88g\x86BOf|\x00\x01\x00\xc1\x00\ +\x00\x04\xa2\x05\xb6\x00\x07\x00\x16@\x0a\x01\x12\x07\x03\x04\ +\x03IY\x04\x03\x00?+\x11\x003\x18?10!\ +#\x01!7!\x07!\x01\xb6f\x01!\xfeP\x14\x03\ +\xcd\x13\xfeH\x05X^^\x00\x00\x01\x00\xb0\xff\xec\x05\ +s\x05\xb6\x00\x13\x00\x14@\x09\x13\x09\x03\x04\x0fIY\ +\x04\x13\x00?+\x00\x18?310\x01\x03\x02\x04#\ + \x1147\x133\x03\x06\x15\x10!267\x13\x05\ +s\xcf:\xfe\xea\xec\xfeH\x1b\xbag\xc1\x14\x01V\xc3\ +\xe1.\xcf\x05\xb6\xfc/\xfe\xf2\xeb\x01\x91Sv\x03p\ +\xfc}Y_\xfe\xcb\xc1\xde\x03\xd1\x00\x00\x01\x00\xc9\x00\ +\x00\x04\xf6\x05\xb6\x00\x0b\x00\x10\xb6\x0b\x06\x03\x07\x03\x06\ +\x12\x00??3\x11310%67\x013\x01#\ +\x033\x13\x16\x17\x01\xc93I\x02\x0254&&#\x22\ +\x06\x02\x15\x14\x16\x02\x8f\xe8/\x06;P\xe5R-\x06\ +T\xce\x86\xfe\xe7\x96\xfbaY\xb1\x8dJ4fL|\ +\xc8\x80d\x04P\xdb\xca\xfb\xc1\x01\x12\x8e\x98\x01v\xc5\ +\x01f\xc3\xfb\xf6|\xd0\xfcWO}I\xa4\xfe\xb9\xa2\ +\x98\x8f\x00\x00\x02\x00L\xff\xf0\x04\x1d\x06\x14\x00\x13\x00\ +\x22\x00'@\x14\x0a\x04\x00\x0e\x07\x00\x06\x15\x0e\x14G\ +Y\x0e\x10\x00\x1cFY\x00\x16\x00?+\x00\x18?+\ +\x00\x18??\x11\x129910\x05\x22&'#\x07\ +#\x013\x02\x073663 \x11\x14\x02\x06\x13\x22\ +\x0e\x02\x15\x14\x16326\x1254&\x01\xf4q\x92\ +\x18\x067P\x01G_\x83\x1f\x06]\xd4}\x01\x19\x98\ +\xfac[\xb2\x8fF\x80f|\xc8\x80b\x10vk\xd1\ +\x06\x14\xfd\x8c{\x9c\x93\xfe\x89\xcb\xfe\x9e\xc0\x04\x0a{\ +\xd8\xfeO\x81\x93\xa6\x01D\xa3\x98\x8f\x00\x01\x00f\xff\ +\xec\x03\x89\x04P\x00\x18\x00\x17@\x0c\x07\x0cFY\x07\ +\x10\x00\x13GY\x00\x16\x00?+\x00\x18?+10\ +\x05\x22&54\x12632\x17\x07&#\x22\x06\x02\ +\x15\x14\x163267\x15\x06\x01\xdd\xae\xc9\x93\xfa\xa5\ +\x86k\x1cko\x81\xcfv\x93\x87GyGt\x14\xdd\ +\xc4\xc1\x01Q\xb1+Z/\x9a\xfe\xde\xaf\x9e\xab\x1a!\ +\x5c9\x00\x00\x02\x00f\xff\xec\x04\x9c\x06\x14\x00\x11\x00\ +\x1f\x00'@\x14\x02\x0a\x0c\x00\x05\x00\x08\x15\x00\x1aF\ +Y\x00\x10\x0c\x12GY\x0c\x16\x00?+\x00\x18?+\ +\x00\x18??\x11\x129910\x012\x1736\x13\ +3\x01#\x13#\x02# \x114\x126\x032>\x02\ +54&#\x22\x06\x02\x15\x10\x02\x8f\xe61\x04\x0c\x83\ +c\xfe\xb6R-\x06\xad\xfb\xfe\xe7\x8f\xfc[Y\xb3\x8d\ +H{k|\xc8\x80\x04P\xdbB\x02]\xf9\xec\x01\x12\ +\xfe\xda\x01v\xc1\x01b\xcb\xfb\xf6}\xd3\xfbT~\x97\ +\xa6\xfe\xc1\xa8\xfe\xd9\x00\x00\x02\x00f\xff\xec\x03}\x04\ +P\x00\x17\x00 \x00&@\x14\x1b\x0eFY\x1b\x1b\x00\ +\x07\x07\x18FY\x07\x10\x00\x13GY\x00\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x05\x22&\ +54\x12632\x16\x15\x14\x04!#\x06\x15\x14\x16\ +327\x15\x06\x13\x22\x06\x073 \x114&\x01\xd5\ +\xad\xc2\x8e\xf9\x96r\x88\xfe\xb9\xfe\xbe!\x06\x94\x8b\x84\ +\x90\x8c\x03\x83\xe121\x02\x05W\x14\xdb\xc4\xb5\x01L\ +\xc4zi\xb5\xbe,6\xa5\xadI^E\x04\x0e\xe7\xc1\ +\x01\x0eCW\x00\x00\x01\xff\x17\xfe\x14\x03q\x06\x1f\x00\ +\x1f\x00'@\x15\x10\x15FY\x10\x01\x1c\x0a\x0c\x0aH\ +Y\x19\x0c\x0f\x00\x05GY\x00\x1b\x00?+\x00\x18?\ +3+\x11\x003\x18?+10\x03\x22'5\x163\ +267\x13#?\x026632\x17\x07&#\x22\ +\x06\x07\x073\x07#\x03\x06\x06\x83065/X\x5c\ +\x1d\xf6\xcd\x0e\xcd##\xa3\x92I]\x19W<`s\ +\x1b#\xf8\x10\xf8\xfc!\x8e\xfe\x14\x13Z\x10j\x85\x04\ +\x8eC\x0e\xa0\xa8\x98\x1fP\x1bk}\xa4Q\xfbZ\xa1\ +\x93\x00\x03\xff\xa8\xfe\x14\x04L\x04T\x00*\x007\x00\ +E\x00H@(*\x02GY*\x0f\x1d55\x11H\ +Y\x05!\x0b\x03\x09(\x09;FY5\x095\x09\x18\ +((BFY(\x10\x18.FY\x18\x1b\x00?+\ +\x00\x18?+\x11\x12\x0099\x18//+\x11\x12\x00\ +\x179+\x11\x003\x18?+10\x01\x07\x07\x16\x16\ +\x15\x14\x06\x06#\x22'\x06\x06\x15\x14\x16\x17\x17\x04\x15\ +\x14\x06\x06#\x22&54%&547&&5\ +46632\x17\x01\x14\x1632654&'\ +'\x06\x06\x01\x14\x16326654&#\x22\x06\ +\x06\x04L\x11\xf3\x1a#m\xbbx?\x0ePX?R\ +y\x01Z\x82\xf4\xa9\xba\xd3\x015N\xbfGOk\xbd\ +pEN\xfd+\xa2\x8f\xcb\xe4}\x9c\xa0\x9d\x8a\x01\x0f\ +ujX\x84Ipe]\x88J\x04?O\x0b\x1cp\ +:m\xc3`\x09!P))/\x08\x0b\x1f\xe9p\xab\ +\x5c\x90\x83\xecb*Q{O$\x8bXo\xbaj\x15\ +\xfa\xf2eb\x95\x82U[\x0c\x0f-\x8b\x033pt\ +J\x9a\x5chsV\x92\x00\x01\x00L\x00\x00\x04\x0a\x06\ +\x14\x00\x1b\x00\x1c@\x0e\x11\x0c\x15\x15\x06FY\x15\x10\ +\x0d\x00\x00\x0c\x15\x00?3??+\x11\x12\x0091\ +0!\x13654&#\x22\x06\x06\x07\x03#\x013\ +\x03\x06\x0736632\x16\x15\x14\x07\x03\x02\xfc\x95\ +\x15W[p\xc5\x87$fb\x01L`V,\x16\x06\ +N\xd9y|\x88\x18\x94\x02\xb4\x5c@PZ\x86\xf2\xa5\ +\xfe#\x06\x14\xfee\xc8Oq}\x82vFp\xfd^\ +\x00\x00\x02\x00L\x00\x00\x01\xe9\x05\xcf\x00\x03\x00\x0e\x00\ +\x0e\xb5\x0c\x07\x02\x0f\x01\x15\x00??\xc42103\ +#\x133\x034632\x15\x14\x06#\x22&\xaeb\ +\xe7`5,&9,#\x1d\x1f\x04?\x01\x177B\ +H9B'\x00\x00\x02\xfe\xe9\xfe\x14\x01\xe9\x05\xcf\x00\ +\x0d\x00\x18\x00\x16@\x0a\x16\x11\x09\x0f\x00\x05GY\x00\ +\x1b\x00?+\x00\x18?\xc4210\x03\x22'5\x16\ +3267\x013\x01\x06\x06\x014632\x15\x14\ +\x06#\x22&\xa6>3/BR]\x1a\x01\x0a`\xfe\ +\xf4#\x8f\x01\x8f,&9,#\x1d\x1f\xfe\x14\x13\x5c\ +\x16g~\x04\xed\xfb\x09\xa5\x8f\x07B7BH9B\ +'\x00\x01\x00L\x00\x00\x03\xec\x06\x14\x00\x0d\x00\x1b@\ +\x0e\x0d\x06\x07\x03\x04\x09\x01\x0a\x00\x01\x0f\x05\x09\x15\x00\ +?3??\x11\x12\x17910\x01\x013\x01\x01#\ +\x01\x07\x03#\x013\x03\x03\x01\x0e\x02a}\xfe&\x01\ +)j\xfe\xf8\xcdP`\x01J`\xa6F\x01\xdd\x02b\ +\xfe+\xfd\x96\x02/\xbc\xfe\x8d\x06\x14\xfc\xf4\xfe\xd5\x00\ +\x01\x00L\x00\x00\x01\xf8\x06\x14\x00\x03\x00\x0a\xb3\x02\x00\ +\x01\x15\x00??103#\x013\xaa^\x01N^\ +\x06\x14\x00\x00\x01\x00H\x00\x00\x06^\x04P\x00+\x00\ +%@\x12\x0e\x15\x0b\x0c\x0f\x00!\x0b\x15'\x05\x12\x05\ +FY\x19\x12\x10\x00?3+\x11\x003\x18?33\ +?\x129910!\x13654#\x22\x06\x06\x07\ +\x03#\x133\x0736632\x16\x173663\ +2\x16\x15\x14\x06\x07\x03#\x13654&#\x22\x02\ +\x07\x03\x02\xc7\x93\x19\x9aj\xbc\x82#db\xe7P!\ +\x06P\xcbojr\x03\x06M\xd0vu\x83\x05\x11\x98\ +d\x95\x19VL\x9d\xf10m\x02\xa2}%\xb6\x87\xf2\ +\xa6\xfe%\x04?\xd2qr\x86\x80\x81\x85{s\x1d7\ +\x5c\xfdN\x02\xa8x8MU\xfe\xed\xe1\xfd\xfa\x00\x00\ +\x01\x00L\x00\x00\x04\x0a\x04P\x00\x18\x00\x1c@\x0e\x0f\ +\x0c\x12\x12\x06FY\x12\x10\x0d\x0f\x00\x0c\x15\x00?3\ +??+\x11\x12\x00910!\x13654&#\ +\x22\x06\x06\x07\x03#\x133\x073632\x16\x15\x14\ +\x07\x03\x02\xfc\x95\x15W[p\xc5\x87$fb\xe7R\ +%\x06\xa4\xfc\x82\x82\x18\x94\x02\xb4\x5c@PZ\x86\xf1\ +\xa6\xfe#\x04?\xdd\xee\x80xFp\xfd^\x00\x02\x00\ +b\xff\xec\x04\x02\x04T\x00\x0d\x00\x1a\x00\x17@\x0c\x00\ +\x0eFY\x00\x10\x07\x14FY\x07\x16\x00?+\x00\x18\ +?+10\x012\x16\x15\x14\x02\x06#\x22&54\ +\x126\x17\x22\x06\x02\x15\x10!26\x1254&\x02\ +\x89\xb4\xc5\x8f\xf8\xa2\xb8\xbf\x92\xf8\x95|\xc6v\x01\x1a\ +\x7f\xc5u\x92\x04T\xd9\xbf\xc5\xfe\xa9\xb4\xdb\xcc\xbf\x01\ +N\xb4V\x9d\xfe\xdb\xa4\xfe\xaa\x9b\x01-\xb4\x9a\xa6\x00\ +\x02\xff\xdf\xfe\x14\x04\x1b\x04T\x00\x13\x00!\x00&@\ +\x14\x03\x09\x00\x0d\x0d\x14GY\x0d\x10\x07\x0f\x06\x1b\x00\ +\x1cFY\x00\x16\x00?+\x00\x18???+\x11\x12\ +\x009910\x05\x22'#\x06\x03#\x013\x033\ +6632\x16\x15\x14\x02\x06\x13\x22\x06\x06\x02\x15\x14\ +\x16326\x125\x10\x01\xf2\xe61\x04\x0d\x88c\x01\ +PR-\x06[\xd1|\x87\x92\x90\xfb\x5cW\xae\x95H\ +{k|\xca~\x10\xdbH\xfd\x91\x06+\xfe\xee\x99\x8e\ +\xb9\xbe\xc3\xfe\xa0\xca\x04\x0au\xda\xfe\xffP}\x97\xa8\ +\x01?\xa6\x01'\x00\x02\x00b\xfe+\x043\x04P\x00\ +\x13\x00\x22\x00'@\x14\x03\x0b\x0e\x00\x05\x0f\x08\x1b\x00\ +\x1cFY\x00\x10\x0e\x14GY\x0e\x16\x00?+\x00\x18\ +?+\x00\x18??\x11\x129910\x012\x16\x17\ +373\x01#\x13\x13#\x06\x06# \x114\x126\ +\x032>\x0254&#\x22\x06\x02\x15\x14\x16\x02\x8b\ +m\x95\x19\x067P\xfe\xb9_b@\x06]\xd4}\xfe\ +\xe7\x97\xfab\x5c\xb4\x8dE\x7fg|\xc8\x80[\x04P\ +tm\xd0\xf9\xec\x01\xd6\x01\x1a\x9c\x93\x01v\xc9\x01d\ +\xc1\xfb\xf6}\xda\xffI\x82\x93\xa6\xfe\xbc\xa3\x8f\x98\x00\ +\x01\x00H\x00\x00\x03D\x04R\x00\x12\x00\x1b@\x0d\x0e\ +\x0b\x00\x0c\x0f\x0b\x15\x00\x05GY\x00\x10\x00?+\x00\ +\x18??\x11\x12910\x012\x17\x07&#\x22\x06\ +\x02\x07\x03#\x133\x073>\x02\x02\xc9E6\x15/\ +B^\xaa\x88 db\xe7P\x1d\x06Idq\x04R\ +\x0e]\x0f\x80\xff\x00\x95\xfe\x1f\x04?\xcc^S.\x00\ +\x01\x00\x19\xff\xec\x031\x04P\x00&\x00 @\x10\x0c\ +\x1f\x03\x16\x16\x1cFY\x16\x10\x03\x09FY\x03\x16\x00\ +?+\x00\x18?+\x11\x12\x009910\x01\x14\x06\ +#\x22'5\x16\x1632654&&'&&\ +54632\x16\x17\x07&#\x22\x06\x15\x14\x16\x16\ +\x17\x1e\x02\x02\xc9\xce\xb1\xad\x84J\x9eE\x8a\x92\x1fE\ +b\x94h\xc5\xa1K\xa79#\x88\x80t\x8c\x22WL\ +r_-\x01'\x90\xabKk.2sj*@;\ +8P\x83^\x80\xa3#\x1dX@jU7BG)\ +?Q\x5c\x00\x01\x00q\xff\xec\x02\xb6\x05?\x00\x18\x00\ +'@\x13\x16\x18@\x12\x02\x14\x18\x18\x02HY\x18\x0f\ +\x0c\x07FY\x0c\x16\x00?+\x00\x18?+\x11\x003\ +\x113\x1a\x18\x10\xcd10\x01\x07!\x03\x06\x15\x143\ +27\x15\x06#\x22&547\x13#?\x023\x03\ +\x02\xb6\x12\xfe\xe5\x87\x16~DTeEcl\x1d\x81\ +\xb6\x0e\xb8a77\x04?Q\xfd\x85cA\x8b\x1aV\ +\x1cmhI\x85\x02_C\x11\xfd\xff\x00\x00\x00\x01\x00\ +m\xff\xf0\x04+\x04?\x00\x18\x00\x1b@\x0d\x10\x12\x0b\ +\x18\x0f\x0e\x15\x12\x06FY\x12\x16\x00?+\x00\x18?\ +?3\x12910\x01\x03\x06\x15\x14\x163266\ +7\x133\x03#7#\x06#\x22&547\x13\x01\ +}\x98\x16_[n\xc3\x85!ib\xe7P\x1c\x06\xa7\ +\xec\x83\x87\x16\x96\x04?\xfdFj4JW\x83\xf3\x9e\ +\x01\xe5\xfb\xc1\xcd\xdd|w\x027\x136675&&547\ +\x13654&\x01L\x83u\x117\x13c\ +d\x14}\x84\x18X \x99\x89\x12`T5\x11J\x1b\ +ylKE\x126\x0c$HP\x14\x05\xb6f`)\ +J\xfc_ MSNam\xfev\x8buV\x02&\ +TO\x01R~\x7f\x13\x05\x14iA7L\x01\x02=\ +(,2\x16V\x00\x01\x00\x7f\x02h\x043\x03=\x00\ +\x15\x00\x1e@\x0e\x03\x11\x0e\x06\x11\x0bRY\x11\x06\x00\ +RY\x06\x00/+\x00\x18/+\x11\x003\x1131\ +0\x01\x22\x06\x075632\x16\x17\x163267\ +\x15\x06#\x22'&&\x01^1v8l}=l\ +f~]6k@ozu\x9a>e\x02\xe9=;\ +^n\x1b,::C`qH\x1d\x1c\x00\x00\x02\x00\ +\x04\xfe\x89\x01\xb0\x04P\x00\x03\x00\x0d\x00\x18@\x0b\x00\ +\x00\x0c\x03\x22\x0c\x07QY\x0c\x10\x00?+\x00\x18?\ +\x129/10\x013\x03#\x01\x14\x06#\x2254\ +632\x01\x08>\xcbw\x01\xac2,B2+C\ +\x02\xc7\xfb\xc2\x05}8AH7D\x00\x01\x00\xfa\xff\ +\xec\x04\x1d\x05\xcb\x00\x1d\x00(@\x15\x09\x11MY\x0c\ +\x09\x02\x1d\x18\x1dKY\x09\x18\x09\x18\x01\x0a\x07\x01\x19\ +\x00??\x1299//+\x11\x003\x113+1\ +0\x05#7&&54\x126773\x07\x16\x17\ +\x07&#\x22\x06\x02\x15\x14\x16327\x15\x06#\x02\ +B]-\x84\x94\x7f\xe5\x8e$Z&te\x1dkn\ +\x82\xcew\x95\x86\x7f\x89v\xa3\x14\xd7\x19\xd7\xa5\xb8\x01\ +:\xc0\x0f\xb2\xb0\x04'Z/\x98\xfe\xde\xb1\xa4\xa6<\ +\x5c:\x00\x00\x01\xff\xfc\x00\x00\x04\xa8\x05\xc7\x00\x1e\x00\ +-@\x17\x0d\x19\x1a\x19MY\x0a\x1a\x1a\x13\x00\x00\x06\ +KY\x00\x07\x13\x10LY\x13\x18\x00?+\x00\x18?\ ++\x11\x12\x009\x18/3+\x11\x00310\x012\ +\x17\x07'&#\x22\x06\x07\x03!\x07!\x03\x06\x07!\ +\x07!7667\x13#73\x1366\x03o\xaa\ +\x8f'6l{\x86\xad\x1fI\x01\x99\x12\xfeh92\ +\x8a\x02\xf7\x14\xfcV\x10]\x91#9\xc7\x11\xc6L)\ +\xe4\x05\xc7NT\x1a2\x95\x92\xfe\xacR\xfe\xf4\xe1Y\ +^T\x0b\xa9\x98\x01\x04R\x01^\xbb\xb8\x00\x00\x02\x00\ +\xcf\x013\x04\x12\x04u\x00\x1b\x00(\x00D@$\x0a\ +\x04\x07\x12\x18\x15\x13\x10\x0c\x09\x17\x1a\x02\x05\x05\x02\x1a\ +\x17\x09\x0c\x10\x13\x08\x15\x07\x15\x1fRY\x15\x07\x07&\ +RY\x07\x00/+\x00\x18\x10\xc4+\x11\x12\x00\x179\ +\x18////////\x10\xc62\x10\xc621\ +0\x0147'7\x17632\x177\x17\x07\x16\x15\ +\x14\x07\x17\x07'\x06#\x22'\x07'7&7\x14\x16\ +32654&&#\x22\x06\x01\x06J\x81?\x7f\ +i}vi\x83=\x81NN\x81=\x83hw~f\ +\x81=\x7fJX\xa0uu\xa3I\x84Kr\xa3\x02\xd3\ +vk\x81@\x81NN\x81>\x81jy\x87\x5c\x7f>\ +\x7fLP\x81>\x7fb\x7ft\xa1\xa2sK\x82N\xa4\ +\x00\x00\x01\x00\xa6\x00\x00\x04\xdd\x05\xb6\x00\x16\x00@@\ +#\x06\x12\x00\x03\x13\x13\x12MY\x0f\x13\x1f\x13/\x13\ +\x03\x09\x03\x13\x0f\x0a\x0e\x0f\x0eMY\x07\x0f\x0f\x0c\x01\ +\x15\x06\x0c\x18\x00??3\x129/3+\x11\x003\ +\x18\x10\xc4_^]+\x11\x0033\x11310\x01\ +\x013\x01!\x07!\x07!\x07!\x03#\x13!7!\ +7!7!\x033\x02H\x02 u\xfd\xd1\x01\x0a\x10\ +\xfe\xc5'\x01=\x12\xfe\xc4;i@\xfe\xd5\x12\x01+\ +)\xfe\xd3\x11\x01\x02\xd7d\x02\x85\x031\xfc\xc9L\xbe\ +T\xfe\xdf\x01!T\xbeL\x037\x00\x00\x02\x02B\xfe\ +\x02\x02\xa6\x06\x19\x00\x03\x00\x07\x00\x15@\x09\x03\x04\x03\ +\x04\x07\x00\x00\x07\x1c\x00??\x1199//10\ +\x013\x11#\x113\x11#\x02Bdddd\x06\x19\ +\xfd\x0c\xfd\xd1\xfd\x0c\x00\x00\x02\x00f\xff\xfe\x03\xee\x06\ +\x17\x00/\x00<\x00'@\x17\x12\x06\x1d*\x0307\ +\x1b\x08!\x0a\x0a\x0fFY\x0a\x00!'FY!\x15\ +\x00?+\x00\x18?+\x11\x12\x00\x17910\x134\ +67&&546632\x17\x07&#\x22\x06\ +\x15\x14\x16\x17\x1e\x02\x15\x14\x07\x16\x15\x14\x06\x06#\x22\ +'5\x16\x1632654&'&&\x01\x06\x06\ +\x15\x14\x16\x16\x176654&\xd3\x8b\x81@O\x5c\ +\xadt\xa3~\x1f\x8a~|\x9d\x5c\x89p]1\xf9z\ +`\xb7\x82\x9dv/\x9eJ\x95\x9eU|\x9bq\x01\x5c\ +w\x891q\x83gvs\x03\x0ae\xa21\x1fmB\ +JyD:P6]M;[=4K_?\xc5\ +x@\x85V\x87L5c\x1b'ib>X4A\ +\x82\x01b\x1e\x87W9OC01\x81\x5cHl\x00\ +\x02\x01\xec\x05\x17\x03\xc7\x05\xc1\x00\x09\x00\x13\x00\x0c\xb3\ +\x0d\x03\x12\x08\x00/3\xcd210\x014632\ +\x15\x14\x06#\x22%4632\x15\x14\x06#\x22\x03\ +D)$6*\x227\xfe\xa8)$6*\x227\x05\ +V1:@0:?1:@0:\x00\x00\x03\x00\ +\x93\xff\xec\x06s\x05\xcb\x00\x15\x00%\x005\x00?@\ +&\x0b\x06GY\x11\x00GY\x0f\x0b\x1f\x0b\x02\x00\x11\ +\x10\x11\x02\x09\x03\x0b\x11\x0b\x11\x22\x1a\x1a2GY\x1a\ +\x04\x22*GY\x22\x13\x00?+\x00\x18?+\x11\x12\ +\x0099\x18//_^]]++10\x01\x22\ +\x06\x15\x14\x16327\x15\x06#\x22&5463\ +2\x17\x07&\x014\x12$32\x04\x12\x15\x14\x02\x04\ +#\x22$\x027\x14\x12\x0432$\x1254\x02$\ +#\x22\x04\x02\x03\xb0\x8e\xa1\x95\x92Urhi\xbb\xca\ +\xdc\xbbwl$c\xfc\x87\xc8\x01^\xca\xc8\x01^\xca\ +\xc2\xfe\xa2\xd0\xcf\xfe\xa2\xc3]\xb1\x010\xb2\xae\x01.\ +\xb8\xb2\xfe\xd1\xb3\xb6\xfe\xce\xab\x04D\xbd\xaa\xba\xb2+\ +X-\xe8\xd6\xcf\xfa4S-\xfe\x97\xc8\x01^\xca\xc8\ +\xfe\xa2\xca\xc5\xfe\xa6\xd0\xcf\x01Z\xc6\xb2\xfe\xd1\xb2\xab\ +\x013\xb5\xb2\x010\xb2\xb8\xfe\xd2\x00\x00\x02\x00\xaa\x03\ ++\x02\xf6\x05\xcd\x00\x11\x00\x1e\x00&@\x13\x0a\x04\x0c\ +\x00\x0c\x12TY\x08\x0c\x00\x05\x1f\x00\x1aTY\x00\x1f\ +\x00?+\x00\x18?\x10\xc42+\x11\x12\x00991\ +0\x012\x16\x17373\x03#7#\x06#\x22&\ +54\x12\x13267654&#\x22\x06\x15\x14\ +\x01\xe77U\x18\x06#B\x89H\x16\x04`\x7fP^\ +\xb5\x12B\x87\x1e\x10H9^\x87\x05\xcd:9g\xfd\ +v}\x89ql\xbd\x01\x08\xfd\xa8\x97m3H:U\ +\xdf\xa0\x8f\x00\x02\x00=\x00{\x03L\x03\xa4\x00\x06\x00\ +\x0d\x00$@\x0f\x0b\x07\x09\x04\x00\x02 \x0d\x0c\x09\x06\ +\x05\x02\x09\x02\x00\x19//\x1133\x1133\x1a\x10\ +\xcd\xcd\x10\xcd\xcd10\x01\x17\x01\x13\x07\x037\x01\x17\ +\x01\x13\x07\x037\x01\xaa9\xfe\xc3\xd5@\xfe\x02\x02\xd3\ +:\xfe\xc6\xd1?\xfe\x02\x03\xa41\xfe\xb0\xfe\x7f'\x01\ +\xa2\x1a\x01m1\xfe\xb0\xfe\x7f'\x01\xa2\x1a\x00\x01\x00\ +}\x01\x10\x04\x04\x03\x04\x00\x05\x00\x11\xb6\x02\x05\x05\x04\ +SY\x05\x00/+\x00\x18\x10\xc410\x01\x11#\x11\ +!5\x04\x04d\xfc\xdd\x03\x04\xfe\x0c\x01\x90d\x00\xff\ +\xff\x00M\x01\xf6\x02(\x02P\x00\x06\x00\x10\xfb\x00\x00\ +\x04\x00\x96\xff\xec\x06u\x05\xcb\x00\x07\x00\x15\x00%\x00\ +5\x00R@.\x0b\x12\x0f\x0f\x00HY\x0f\x0f\x11\x12\ +\x12\x07FY\x0d\x0f\x11\x1f\x11\x02\x00\x12\x10\x12\x02\x09\ +\x03\x11\x12\x11\x12\x22\x1a\x1a2GY\x1a\x04\x22*G\ +Y\x22\x13\x00?+\x00\x18?+\x11\x12\x0099\x18\ +//_^]]3+\x11\x12\x009\x18/+\x11\ +\x12\x00910\x0132654##\x05\x14\x06\ +\x07\x13#\x03#\x11#\x1132\x16\x014\x12$3\ +2\x04\x12\x15\x14\x02\x04#\x22$\x027\x14\x12\x043\ +2$\x1254\x02$#\x22\x04\x02\x02\xf6p]f\ +\xc5n\x01\x9bOF\xedx\xd3\xa8e\xd3\x8f\x9e\xfc\x05\ +\xcf\x01Z\xc6\xc8\x01^\xca\xc2\xfe\xa2\xd0\xcc\xfe\xa7\xca\ +\x5c\xb1\x010\xb2\xae\x01.\xb8\xb2\xfe\xd1\xb3\xb6\xfe\xce\ +\xab\x02\xdb]Y\xac\xa7Pz \xfew\x01h\xfe\x98\ +\x03p|\xfe\xc4\xcf\x01^\xc3\xc8\xfe\xa2\xca\xc5\xfe\xa6\ +\xd0\xc9\x01Y\xcd\xb2\xfe\xd1\xb2\xab\x013\xb5\xb2\x010\ +\xb2\xb8\xfe\xd2\x00\x00\x01\x01\x5c\x06\x14\x04\x1f\x06u\x00\ +\x03\x00\x0b\xb4\x02\x01IY\x02\x00/+10\x01!\ +7!\x03\xe9\xfds5\x02\x8e\x06\x14a\x00\x00\x02\x00\ +\xf2\x03\x81\x03;\x05\xcb\x00\x0b\x00\x17\x00\x1a@\x0d\x09\ +\x0fRY\x09\x09\x03\x03\x15RY\x03\x04\x00?+\x11\ +\x003\x18/+10\x134632\x16\x15\x14\x06\ +#\x22&7\x14\x1632654&#\x22\x06\xf2\ +\xaa{z\xaa\xabyz\xabI\x81[\x5c\x7f\x80[Z\ +\x82\x04\xa6x\xad\xadxz\xab\xabzY\x80\x80YZ\ +\x83\x83\x00\x00\x02\x00\x7f\x00\x00\x04\x06\x04m\x00\x0b\x00\ +\x0f\x00\x1e@\x0e\x00\x09\x03\x06\x06\x09SY\x06\x0c\x0d\ +SY\x0c\x00/+\x00\x18/+\x11\x003\x1131\ +0\x01!5!\x113\x11!\x15!\x11#\x055!\ +\x15\x02\x10\xfeo\x01\x91e\x01\x91\xfeoe\xfeo\x03\ +\x87\x02ub\x01\x96\xfejb\xfep\xe5dd\x00\x00\ +\x01\x00R\x02J\x02\xc9\x05\xc7\x00\x17\x00\x1b@\x0e\x0e\ +\x09NY\x0e\x1f\x02\x16\x01\x16NY\x01 \x00?+\ +\x11\x003\x18?+10\x01!7\x016654\ +&#\x22\x07'632\x16\x16\x15\x14\x06\x07\x05!\ +\x02\x5c\xfd\xf6\x10\x01)\x89[MC_c)l\x83\ +Ih5v|\xfe\xf6\x01\xa0\x02JP\x01\x02v\x91\ +Q;LL>Z6Z7j\xb9f\xdf\x00\x01\x00\ +m\x029\x02\xc1\x05\xc9\x00'\x00-@\x17\x04\x19\x18\ +\x19\x18NY\x19\x19\x0b%% NY%\x1f\x0b\x12\ +NY\x0b!\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x01\x14\x06\x07\x15\x16\x16\x15\ +\x14\x06\x06#\x22&'5\x16\x1632654#\ +#732654&#\x22\x07'632\x16\ +\x02\xc1ajBON\x8c[;\x81).|?c\ +x\xc4T\x10Vf\x85KDdc(m\x8edv\ +\x04\xfcU~\x19\x04\x10hHM\x80F\x1f\x19Z\x1c\ +(iZ\xa2OcPDED@Vq\x00\x01\x02\ +D\x04\xd9\x03\xe5\x06!\x00\x09\x00\x0a\xb2\x04\x80\x09\x00\ +/\x1a\xcd10\x016673\x15\x06\x06\x07#\x02\ +DB\xa9-\x893\xd5VC\x04\xee3\xb6J\x17B\ +\xb96\x00\x00\x01\xff\xe3\xfe\x14\x04H\x04?\x00\x1b\x00\ + @\x10\x13\x0d\x0f\x08\x18\x0f\x0b\x15\x17\x1b\x0f\x03F\ +Y\x0f\x16\x00?+\x00\x18???3\x12991\ +07\x14\x1632667\x133\x03#7#\x06\ +#\x22&'#\x06\x07\x03#\x013\x03\x06\xeeaW\ +n\xc2\x83$hc\xeaN\x1d\x06\xa4\xf0Ul\x16\x06\ +\x12!?a\x01Re\x98\x14\xf2RZ\x81\xec\xa7\x01\ +\xe5\xfb\xc1\xcd\xddA9\x84\x98\xfe\xc6\x06+\xfdF`\ +\x00\x00\x01\x00\xd7\xfe\xfc\x04\xb8\x06\x14\x00\x0f\x00!@\ +\x0f\x01\x05\x06\x03\x08\x08\x05\x03@\x03\x0eIY\x03\x03\ +\x00?+\x00\x1a\x18\x10\xcd9/\x129\x11310\ +\x01#\x11#\x11#\x11\x06#\x22&5\x1063!\ +\x04\xb8d\xe3e@Q\xd8\xcc\xda\xe9\x02\x1e\xfe\xfc\x06\ +\xba\xf9F\x033\x12\xfa\xfb\x01\x04\xfe\xff\xff\x00\xcf\x02\ +q\x01o\x033\x00\x07\x00\x11\x00}\x02\x83\x00\x01\xff\ +R\xfe\x14\x00\xc5\x00\x00\x00\x10\x00\x10\xb5\x0f\x0c\x0c\x08\ +\x03\x0e\x00/\xcc29/310\x13\x14\x06#\x22\ +'5\x163254'73\x07\x16\xc5\x97\x8e.\ + \x1e*\xc6\x97nPN\x8c\xfe\xdf^m\x07O\x06\ +sa\x0a\xbe\x89\x1e\x00\x00\x01\x00\xfe\x02J\x02P\x05\ +\xb6\x00\x0d\x00\x10\xb6\x0c\x0c\x03 \x09\x00\x1e\x00?2\ +?9/10\x013\x03#\x13>\x037\x06\x06\x07\ +'\x02\x00P\xbaTv\x05\x0d\x0f\x10\x07\x224u'\ +\x05\xb6\xfc\x94\x029\x15;=9\x15\x1f)I;\x00\ +\x02\x00\xbe\x03'\x02\xe7\x05\xc7\x00\x0d\x00\x1a\x00\x18@\ +\x0c\x07\x14TY\x07\x00\x00\x0eTY\x00\x1f\x00?+\ +\x00\x18\x10\xc4+10\x012\x16\x15\x14\x06\x06#\x22\ +&5466\x17\x22\x06\x06\x15\x1432665\ +4&\x02\x06ixP\x94ernS\x95VFl\ +<\x9cIi:N\x05\xc7\x80ts\xc6s\x87up\ +\xc3qJ]\x9cY\xba]\xa2_S[\x00\x00\x02\x00\ +!\x00{\x03/\x03\xa4\x00\x06\x00\x0d\x00$@\x0f\x00\ +\x04\x02\x06\x05\x02\x07\x0b\x09 \x0d\x0c\x09\x02\x09\x00\x19\ +//\x1133\x1a\x10\xcd\xcd\x1133\x10\xcd\xcd1\ +0%'\x01\x037\x13\x07\x01'\x01\x037\x13\x07\x01\ +\xc3:\x01:\xd1?\xfe\x02\xfd-9\x019\xd1@\xfe\ +\x02{1\x01P\x01\x81'\xfe^\x1b\xfe\x941\x01P\ +\x01\x81'\xfe^\x1b\x00\xff\xff\x00\x81\x00\x00\x058\x05\ +\xb6\x00'\x02<\x02\x96\xfd\xb7\x00'\x02\x17\x02P\x00\ +\x00\x01\x06\x00{\xfd\x00\x00\x09\xb3\x01\x00\x02\x18\x00?\ +55\x00\xff\xff\x005\x00\x00\x05k\x05\xb6\x00'\x00\ +t\x02\xa2\xfd\xb7\x00&\x00{\xaf\x00\x01\x07\x02\x17\x02\ +\x04\x00\x00\x00\x07\xb2\x00\x01\x18\x00?5\x00\xff\xff\x00\ +G\x00\x00\x05\x7f\x05\xc9\x00'\x02<\x02\xd3\xfd\xb7\x00\ +&\x00u\xda\x00\x01\x07\x02\x17\x02\xa4\x00\x00\x00\x09\xb3\ +\x01\x00\x02\x18\x00?55\x00\x00\x02\x00\x00\xfem\x02\ +\xc9\x04F\x00\x1b\x00%\x00'@\x13\x08\x1b\x1b\x11$\ +$\x1fQY$\x0f\x0d\x11\x11\x0bPY\x11#\x00?\ ++\x11\x003\x18?+\x11\x12\x009\x18/910\ +\x01\x07\x06\x06\x07\x0e\x02\x15\x14\x16327\x17\x06\x06\ +#\x22&5467>\x027\x13\x14\x06#\x225\ +4632\x02\x81\x06\x1cfnvr;\x83w\x8d\ +\xa7&U\xabf\x9f\xb7\x8c\x9dUa1\x15\xa43,\ +A2*D\x02\xcd\x1d\x7f\x92QT{\x84Kj}\ +dV19\xa9\x90\x85\xd7q=`^_\x01/8\ +AH8C\x00\xff\xff\xff\x91\x00\x00\x03\xd3\x07s\x02\ +&\x00$\x00\x00\x01\x07\x00C\x001\x01R\x00\x08\xb3\ +\x02\x10\x05&\x00+5\xff\xff\xff\x91\x00\x00\x04=\x07\ +s\x02&\x00$\x00\x00\x01\x07\x00v\x00X\x01R\x00\ +\x08\xb3\x02\x18\x05&\x00+5\xff\xff\xff\x91\x00\x00\x03\ +\xef\x07s\x02&\x00$\x00\x00\x01\x07\x01K\x001\x01\ +R\x00\x08\xb3\x02\x16\x05&\x00+5\xff\xff\xff\x91\x00\ +\x00\x04V\x07\x17\x02&\x00$\x00\x00\x01\x07\x01R\x00\ +P\x01R\x00\x08\xb3\x02\x19\x05&\x00+5\xff\xff\xff\ +\x91\x00\x00\x03\xf2\x07\x13\x02&\x00$\x00\x00\x01\x07\x00\ +j\x00+\x01R\x00\x0a\xb4\x03\x02!\x05&\x00+5\ +5\xff\xff\xff\x91\x00\x00\x03\xd3\x07\x00\x02&\x00$\x00\ +\x00\x01\x07\x01P\xff\xea\x00\x98\x00\x17@\x0e\x03\x02\x7f\ +\x12\x8f\x12\x02?\x12\x01\x0f\x12\x01\x12\x00\x11]]q\ +55\x00\x00\x02\xff\x8b\x00\x00\x06\xb0\x05\xb6\x00\x0f\x00\ +\x13\x004@\x1d\x09\x13\x06\x13IY\x10\x03IY\x0a\ +\x0dIY\x10\x0a\x10\x0a\x01\x06\x03\x05\x01\x01\x0eIY\ +\x01\x12\x00?+\x11\x003\x18?\x1299//+\ +++\x11\x00310!!\x13!\x01#\x01!\x07\ +!\x03!\x07!\x03!\x01!\x13#\x05{\xfd)n\ +\xfeD\xfe\xb8\x83\x03\xb2\x03s\x14\xfd\x8fu\x02N\x14\ +\xfd\xb4\x87\x02r\xfc\x09\x01\x91\x9cX\x02\x0a\xfd\xf6\x05\ +\xb6^\xfd\xd7^\xfd\x8d\x02\x15\x02\xe5\xff\xff\x00\xaa\xfe\ +\x14\x04\xf4\x05\xcb\x02&\x00&\x00\x00\x00\x07\x00z\x02\ ++\x00\x00\xff\xff\x00f\x00\x00\x04s\x07s\x02&\x00\ +(\x00\x00\x01\x07\x00C\x00}\x01R\x00\x08\xb3\x01\x0d\ +\x05&\x00+5\xff\xff\x00f\x00\x00\x04s\x07s\x02\ +&\x00(\x00\x00\x01\x07\x00v\x00J\x01R\x00\x08\xb3\ +\x01\x15\x05&\x00+5\xff\xff\x00f\x00\x00\x04s\x07\ +s\x02&\x00(\x00\x00\x01\x07\x01K\x00N\x01R\x00\ +\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x00f\x00\x00\x04\ +s\x07\x13\x02&\x00(\x00\x00\x01\x07\x00j\x00B\x01\ +R\x00\x0a\xb4\x02\x01\x1e\x05&\x00+55\xff\xff\xff\ +\xdb\x00\x00\x02\xb2\x07s\x02&\x00,\x00\x00\x01\x07\x00\ +C\xffE\x01R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\ +\xff\xff\xdb\x00\x00\x03>\x07s\x02&\x00,\x00\x00\x01\ +\x07\x00v\xffY\x01R\x00\x08\xb3\x01\x15\x05&\x00+\ +5\xff\xff\xff\xdb\x00\x00\x02\xf6\x07s\x02&\x00,\x00\ +\x00\x01\x07\x01K\xff8\x01R\x00\x08\xb3\x01\x13\x05&\ +\x00+5\xff\xff\xff\xdb\x00\x00\x02\xfd\x07\x13\x02&\x00\ +,\x00\x00\x01\x07\x00j\xff6\x01R\x00\x0a\xb4\x02\x01\ +\x1e\x05&\x00+55\x00\x02\x00Z\x00\x00\x05\x08\x05\ +\xb6\x00\x0d\x00\x1a\x00-@\x17\x19\x07\x08\x07IY\x16\ +\x08\x08\x05\x0a\x0a\x15IY\x0a\x03\x05\x1aIY\x05\x12\ +\x00?+\x00\x18?+\x11\x12\x009\x18/3+\x11\ +\x00310\x01\x14\x02\x04#!\x13#73\x13!\ + \x00\x012$\x125\x10!#\x03!\x07!\x03\x05\ +\x08\xdb\xfe\x82\xff\xfe\xb6\x90\x9c\x15\x9b\x92\x011\x01\x1a\ +\x01!\xfc\xa6\xe2\x01Q\xb9\xfe$\xce\x81\x01z\x14\xfe\ +\x85}\x03o\xfd\xfe_\xd1\x02\xa4`\x02\xb2\xfe\xd9\xfb\ +\xcb\xbd\x01j\xe7\x01\xf2\xfd\xaa`\xfd\xb6\x00\xff\xff\x00\ +f\x00\x00\x05b\x07\x17\x02&\x001\x00\x00\x01\x07\x01\ +R\x00\xe7\x01R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\ +\xff\x00\xac\xff\xec\x05{\x07s\x02&\x002\x00\x00\x01\ +\x07\x00C\x00\xdf\x01R\x00\x08\xb3\x02\x1d\x05&\x00+\ +5\xff\xff\x00\xac\xff\xec\x05{\x07s\x02&\x002\x00\ +\x00\x01\x07\x00v\x01\x08\x01R\x00\x08\xb3\x02%\x05&\ +\x00+5\xff\xff\x00\xac\xff\xec\x05{\x07s\x02&\x00\ +2\x00\x00\x01\x07\x01K\x00\xd5\x01R\x00\x08\xb3\x02#\ +\x05&\x00+5\xff\xff\x00\xac\xff\xec\x05{\x07\x17\x02\ +&\x002\x00\x00\x01\x07\x01R\x00\xf6\x01R\x00\x08\xb3\ +\x02&\x05&\x00+5\xff\xff\x00\xac\xff\xec\x05{\x07\ +\x13\x02&\x002\x00\x00\x01\x07\x00j\x00\xc3\x01R\x00\ +\x0a\xb4\x03\x02.\x05&\x00+55\x00\x01\x00\xdd\x01\ +D\x03\xfe\x04d\x00\x0b\x00\x12\xb6\x09\x03\x02\x0a\x08\x04\ +\x02\x00/3/3\x129910\x01\x017\x01\x01\ +\x17\x01\x01\x07\x01\x01'\x02'\xfe\xb6F\x01J\x01M\ +D\xfe\xb4\x01LD\xfe\xb3\xfe\xb6D\x02\xd3\x01LE\ +\xfe\xb7\x01IC\xfe\xb2\xfe\xb4C\x01I\xfe\xb9C\x00\ +\x03\x00\x8b\xff\xb2\x05\xa8\x05\xfa\x00\x17\x00\x22\x00,\x00\ +.@\x1a!&' \x04)\x18\x12\x15\x07\x0a\x04\x05\ +\x10\x10\x18IY\x10\x04\x05)IY\x05\x13\x00?+\ +\x00\x18?+\x11\x12\x00\x179\x11\x12\x17910\x01\ +\x14\x02\x06\x04#\x22'\x07'7&5\x10\x12$3\ +2\x177\x17\x07\x16\x16\x01\x22\x06\x06\x02\x15\x14\x16\x17\ +\x01&\x134&'\x01\x1632$\x12\x05{h\xb9\ +\xfe\xfb\xa1\xd7\x85\x8bB\x92q\xbc\x01E\xd0\xdb\x85\x85\ +F\x91-7\xfd\xf4\x86\xdc\x9d\x5c+#\x03:k\xdd\ +#\x1a\xfc\xcbk\xba\xaa\x01\x06\x9d\x03\x8f\xbb\xfe\x9b\xfc\ +\x87p\xaa@\xac\x95\xfc\x01\x07\x01\xb1\xe4y\xa85\xb7\ +3\xdc\x01nw\xdd\xfe\xc6\xa2i\xac4\x04\x08q\xfe\ +\x18U\xae*\xfb\xfad\xc8\x01\x89\x00\xff\xff\x00\xb0\xff\ +\xec\x05s\x07s\x02&\x008\x00\x00\x01\x07\x00C\x00\ +\xb4\x01R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\ +\xb0\xff\xec\x05s\x07s\x02&\x008\x00\x00\x01\x07\x00\ +v\x01\x02\x01R\x00\x08\xb3\x01\x1d\x05&\x00+5\xff\ +\xff\x00\xb0\xff\xec\x05s\x07s\x02&\x008\x00\x00\x01\ +\x07\x01K\x00\xbe\x01R\x00\x08\xb3\x01\x1b\x05&\x00+\ +5\xff\xff\x00\xb0\xff\xec\x05s\x07\x13\x02&\x008\x00\ +\x00\x01\x07\x00j\x00\xba\x01R\x00\x0a\xb4\x02\x01&\x05\ +&\x00+55\xff\xff\x00\xc1\x00\x00\x04\x83\x07s\x02\ +&\x00<\x00\x00\x01\x07\x00v\xff\xef\x01R\x00\x08\xb3\ +\x01\x12\x05&\x00+5\x00\x02\x00f\x00\x00\x04?\x05\ +\xb6\x00\x0c\x00\x14\x00\x1f@\x11\x09\x14IY\x0d\x04I\ +Y\x09\x0d\x09\x0d\x06\x07\x03\x06\x12\x00??\x1299\ +//++10\x01\x14\x04!#\x03#\x013\x03\ +32\x16\x013 65\x10!#\x04?\xfe\xce\xfe\ +\xd0\xc9Gg\x016f9\xd5\xc8\xd9\xfc\xe6\xbe\x01\x00\ +\xf0\xfe\xb6\xd3\x03D\xf7\xfd\xfe\xb0\x05\xb6\xfe\xf6\xb9\xfd\ +\xb9\xc5\xcc\x01\x13\x00\x01\xfe\xe7\xfe\x14\x04\x02\x06\x1f\x00\ +<\x00/@\x1b3\x0e,\x14\x1a&\x06\x1d\x0b\x0b6\ +FY\x0b\x00\x1d#GY\x1d\x16\x00\x05GY\x00\x1b\ +\x00?+\x00\x18?+\x00\x18?+\x11\x12\x00\x179\ +10\x03\x22'5\x163267\x01\x12!2\x16\ +\x15\x14\x06\x07\x06\x06\x15\x14\x16\x17\x16\x16\x15\x14\x06#\ +\x22'5\x16\x1632654&'&&54\ +6676654&#\x22\x06\x07\x01\x06\x06\xa2\ +I.5>OX\x16\x011P\x01E\x89\x9cYz\ +kED;`T\xd5\xb4\x8f[-\x87>\x84\x99?\ +NRJ*Obe=n_\x81\x98 \xfe\xdd!\ +\x8d\xfe\x14\x17Z\x18eg\x05\x81\x01e{qK\x83\ +SLa:3K&?\x8d_\xaa\xc6Am$.\ +\x8e|Kl6:iE9\x5cUGF\x5c7F\ +P\x98\x99\xfa\x9f\x98\x89\xff\xff\x00f\xff\xec\x047\x06\ +!\x02&\x00D\x00\x00\x01\x06\x00C+\x00\x00\x08\xb3\ +\x02#\x11&\x00+5\xff\xff\x00f\xff\xec\x047\x06\ +!\x02&\x00D\x00\x00\x01\x06\x00v\x06\x00\x00\x08\xb3\ +\x02+\x11&\x00+5\xff\xff\x00f\xff\xec\x047\x06\ +#\x02&\x00D\x00\x00\x01\x06\x01K\xfd\x02\x00\x08\xb3\ +\x02)\x11&\x00+5\xff\xff\x00f\xff\xec\x047\x05\ +\xc5\x02&\x00D\x00\x00\x01\x06\x01R\x1b\x00\x00\x08\xb3\ +\x02,\x11&\x00+5\xff\xff\x00f\xff\xec\x047\x05\ +\xc1\x02&\x00D\x00\x00\x01\x06\x00j\xff\x00\x00\x0a\xb4\ +\x03\x024\x11&\x00+55\xff\xff\x00f\xff\xec\x04\ +7\x06h\x02&\x00D\x00\x00\x01\x06\x01P\xd8\x00\x00\ +\x0a\xb4\x03\x02%\x11&\x00+55\x00\x03\x00f\xff\ +\xec\x06\x1f\x04P\x00,\x00<\x00F\x00D@%\x07\ +\x03\x15\x18\x04\x0a\x11@!FY@@\x0a\x11\x16\x0f\ +\x05\x15=6\x116FY\x1a\x11\x10&-\x0a-G\ +Y\x00\x0a\x16\x00?3+\x11\x003\x18?3+\x11\ +\x003\x18??\x11\x129/+\x11\x12\x00\x1791\ +0\x05\x22&'\x07#7#\x06\x06#\x22&54\ +\x12632\x16\x17373\x07632\x16\x15\x14\ +\x04!#\x06\x15\x14\x163267\x15\x06\x06%2\ +>\x0354&#\x22\x06\x02\x15\x14\x16\x01\x22\x06\x07\ +3 654&\x04\x83{\xb0\x1d'M)\x09^\ +\xbeqx|\x8d\xf4\x98jx\x0e\x0a;B#\x8b\xd3\ +p~\xfe\xc3\xfe\xc8'\x08\x8b\x94E\x81BP\x86\xfc\ +\xa5C\x8f}W(b\x5c{\xc8qU\x04\x03w\xe2\ +;0\x01\x07\xf0M\x14xi\xcd\xfe\x8e\x84\xbc\xb0\xce\ +\x01e\xc5qd\xc0\xba\xcf{o\xb3\xb93-\xa1\xb3\ +*\x1f^% ZT\x97\xbe\xd0=v\x88\xac\xfe\xcc\ +\xba\x96\x84\x03\xb4\xe7\xc1\x86\x88GS\xff\xff\x00f\xfe\ +\x14\x03\x89\x04P\x02&\x00F\x00\x00\x00\x07\x00z\x01\ +y\x00\x00\xff\xff\x00f\xff\xec\x03}\x06!\x02&\x00\ +H\x00\x00\x01\x06\x00C\xf1\x00\x00\x08\xb3\x02\x22\x11&\ +\x00+5\xff\xff\x00f\xff\xec\x03\xb5\x06!\x02&\x00\ +H\x00\x00\x01\x06\x00v\xd0\x00\x00\x08\xb3\x02*\x11&\ +\x00+5\xff\xff\x00f\xff\xec\x03\x88\x06!\x02&\x00\ +H\x00\x00\x01\x06\x01K\xca\x00\x00\x08\xb3\x02(\x11&\ +\x00+5\xff\xff\x00f\xff\xec\x03\x8f\x05\xc1\x02&\x00\ +H\x00\x00\x01\x06\x00j\xc8\x00\x00\x0a\xb4\x03\x023\x11\ +&\x00+55\xff\xff\x00L\x00\x00\x01\xc6\x06!\x02\ +&\x00\xf3\x00\x00\x01\x07\x00C\xfe\xc8\x00\x00\x00\x08\xb3\ +\x01\x05\x11&\x00+5\xff\xff\x00L\x00\x00\x02\xbd\x06\ +!\x02&\x00\xf3\x00\x00\x01\x07\x00v\xfe\xd8\x00\x00\x00\ +\x08\xb3\x01\x0d\x11&\x00+5\xff\xff\x00L\x00\x00\x02\ +\x82\x06!\x02&\x00\xf3\x00\x00\x01\x07\x01K\xfe\xc4\x00\ +\x00\x00\x08\xb3\x01\x0b\x11&\x00+5\xff\xff\x00L\x00\ +\x00\x02\x86\x05\xc1\x02&\x00\xf3\x00\x00\x01\x07\x00j\xfe\ +\xbf\x00\x00\x00\x0a\xb4\x02\x01\x16\x11&\x00+55\x00\ +\x02\x00f\xff\xec\x04L\x06#\x00\x1f\x00.\x008@\ +\x1d\x06\x09\x00\x1d\x04\x1e\x07\x19\x0f\x1e\x1e\x16\x03\x16(\ +GY\x16\x16\x0f\x07\x03\x01\x0f GY\x0f\x16\x00?\ ++\x00\x18?3\x129/+\x11\x12\x009\x18/\x11\ +9\x11\x12\x17910\x01&'7\x16\x16\x17%\x17\ +\x05\x16\x12\x15\x10\x00!\x22&54\x12632\x16\ +\x1734\x02'\x05'\x1326654&&#\ +\x22\x06\x06\x15\x14\x16\x02\xc96h; b3\x01\x0a\ +'\xff\x00WY\xfe\xe5\xfe\xfe\xb1\xc8~\xe7\x93k\xa2\ +(\x05VH\xfe\xd9'=v\xb5kF\x82[|\xb3\ +`\x93\x05T\x0254&#\x22\x06\x02\x15\ +\x10\x02\x8f\xe34\x04\x07K\xfel\x15\x01\x91+c+\ +\x9d\x14\x9a\xfe\xf2R-\x06\xad\xfb\xfe\xe7\x8f\xfc[Y\ +\xb3\x8dH{k|\xc8\x80\x04P\xdb*\x01YT\xc8\ +\xc8T\xfb\x08\x01\x12\xfe\xda\x01v\xc1\x01b\xcb\xfb\xf6\ +}\xd3\xfbT~\x97\xa6\xfe\xc1\xa8\xfe\xd9\x00\xff\xff\x00\ +f\x00\x00\x04s\x06\x87\x02&\x00(\x00\x00\x01\x07\x01\ +M\x00m\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\ +\xff\x00f\xff\xec\x03\x9f\x055\x02&\x00H\x00\x00\x01\ +\x06\x01M\xf1\x00\x00\x08\xb3\x02$\x11&\x00+5\xff\ +\xff\x00f\x00\x00\x04s\x07\x1b\x02&\x00(\x00\x00\x01\ +\x07\x01N\x00P\x01R\x00\x08\xb3\x01\x0f\x05&\x00+\ +5\xff\xff\x00f\xff\xec\x03\xb2\x05\xc9\x02&\x00H\x00\ +\x00\x01\x06\x01N\xc2\x00\x00\x08\xb3\x02$\x11&\x00+\ +5\xff\xff\x00f\x00\x00\x04s\x07\x04\x02&\x00(\x00\ +\x00\x01\x07\x01O\x01\x98\x015\x00\x08\xb3\x01\x14\x05&\ +\x00+5\xff\xff\x00f\xff\xec\x03}\x05\xcf\x02&\x00\ +H\x00\x00\x01\x07\x01O\x00\xf8\x00\x00\x00\x08\xb3\x02)\ +\x11&\x00+5\xff\xff\x00f\xfeb\x04s\x05\xb6\x02\ +&\x00(\x00\x00\x00\x07\x01Q\x02L\x00\x00\xff\xff\x00\ +f\xfe\x81\x03}\x04P\x02&\x00H\x00\x00\x00\x07\x01\ +Q\x02!\x00\x1f\xff\xff\x00f\x00\x00\x04s\x07s\x02\ +&\x00(\x00\x00\x01\x07\x01L\x00D\x01R\x00\x08\xb3\ +\x01\x18\x05&\x00+5\xff\xff\x00f\xff\xec\x03\xbf\x06\ +!\x02&\x00H\x00\x00\x01\x06\x01L\xbb\x00\x00\x08\xb3\ +\x02-\x11&\x00+5\xff\xff\x00\xaa\xff\xec\x05=\x07\ +s\x02&\x00*\x00\x00\x01\x07\x01K\x00\xdb\x01R\x00\ +\x08\xb3\x01%\x05&\x00+5\xff\xff\xff\xa8\xfe\x14\x04\ +L\x06!\x02&\x00J\x00\x00\x01\x06\x01K\xc4\x00\x00\ +\x08\xb3\x03M\x11&\x00+5\xff\xff\x00\xaa\xff\xec\x05\ +=\x07\x1b\x02&\x00*\x00\x00\x01\x07\x01N\x00\xd1\x01\ +R\x00\x08\xb3\x01!\x05&\x00+5\xff\xff\xff\xa8\xfe\ +\x14\x04L\x05\xc9\x02&\x00J\x00\x00\x01\x06\x01N\xa9\ +\x00\x00\x08\xb3\x03I\x11&\x00+5\xff\xff\x00\xaa\xff\ +\xec\x05=\x07!\x02&\x00*\x00\x00\x01\x07\x01O\x02\ +\x1f\x01R\x00\x08\xb3\x01&\x05&\x00+5\xff\xff\xff\ +\xa8\xfe\x14\x04L\x05\xcf\x02&\x00J\x00\x00\x01\x07\x01\ +O\x01\x17\x00\x00\x00\x08\xb3\x03N\x11&\x00+5\xff\ +\xff\x00\xaa\xfe;\x05=\x05\xcb\x02&\x00*\x00\x00\x00\ +\x07\x029\x01!\x00\x00\xff\xff\xff\xa8\xfe\x14\x04L\x06\ +!\x02&\x00J\x00\x00\x01\x06\x02:9\x00\x00\x08\xb3\ +\x03J\x11&\x00+5\xff\xff\x00f\x00\x00\x05\x5c\x07\ +s\x02&\x00+\x00\x00\x01\x07\x01K\x00\xbe\x01R\x00\ +\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x00L\x00\x00\x04\ +\x0a\x07\xaa\x02&\x00K\x00\x00\x01\x07\x01K\x00)\x01\ +\x89\x00\x08\xb3\x01#\x02&\x00+5\x00\x02\x00f\x00\ +\x00\x05\xe7\x05\xb6\x00\x13\x00\x17\x001@\x19\x03\x16\x0b\ +\x0c\x0bIY\x00\x10\x0c\x17\x07IY\x0c\x17\x0c\x17\x09\ +\x12\x0e\x03\x05\x09\x12\x00?3?3\x1299//\ ++\x11\x0033+\x11\x003310\x013\x07#\ +\x03#\x13!\x03#\x13#73\x133\x03!\x133\ +\x03\x13!\x03\x05!\xc6\x14\xc5\xe7d\x97\xfd\x08\x95g\ +\xe8\xc1\x15\xbel\ +\xfdN\x00\xff\xff\xff\xdb\x00\x00\x03[\x07\x17\x02&\x00\ +,\x00\x00\x01\x07\x01R\xffU\x01R\x00\x08\xb3\x01\x16\ +\x05&\x00+5\xff\xff\x00B\x00\x00\x02\xee\x05\xc5\x02\ +&\x00\xf3\x00\x00\x01\x07\x01R\xfe\xe8\x00\x00\x00\x08\xb3\ +\x01\x0e\x11&\x00+5\xff\xff\xff\xdb\x00\x00\x03\x07\x06\ +\x87\x02&\x00,\x00\x00\x01\x07\x01M\xffY\x01R\x00\ +\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00L\x00\x00\x02\ +\x92\x055\x02&\x00\xf3\x00\x00\x01\x07\x01M\xfe\xe4\x00\ +\x00\x00\x08\xb3\x01\x07\x11&\x00+5\xff\xff\xff\xdb\x00\ +\x00\x03\x18\x07\x1b\x02&\x00,\x00\x00\x01\x07\x01N\xff\ +(\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00\ +L\x00\x00\x02\xa1\x05\xc9\x02&\x00\xf3\x00\x00\x01\x07\x01\ +N\xfe\xb1\x00\x00\x00\x08\xb3\x01\x07\x11&\x00+5\xff\ +\xff\xff\xdb\xfeb\x02\xb2\x05\xb6\x02&\x00,\x00\x00\x00\ +\x07\x01Q\x00\x9a\x00\x00\xff\xff\xff\x8d\xfeb\x01\xe9\x05\ +\xcf\x02&\x00L\x00\x00\x00\x06\x01Q\x14\x00\xff\xff\xff\ +\xdb\x00\x00\x02\xb2\x07!\x02&\x00,\x00\x00\x01\x07\x01\ +O\x00\x87\x01R\x00\x08\xb3\x01\x14\x05&\x00+5\x00\ +\x01\x00L\x00\x00\x01\x93\x04?\x00\x03\x00\x0a\xb3\x02\x0f\ +\x01\x15\x00??103#\x133\xaeb\xe7`\x04\ +?\xff\xff\xff\xe3\xfe\x98\x04:\x05\xb6\x00&\x00,\x08\ +\x00\x00\x07\x00-\x02F\x00\x00\xff\xff\x00I\xfe\x14\x03\ +\xc0\x05\xcf\x00&\x00L\xfd\x00\x00\x07\x00M\x01\xd7\x00\ +\x00\xff\xff\xfe\xbc\xfe\x98\x02\xd6\x07s\x02&\x00-\x00\ +\x00\x01\x07\x01K\xff\x18\x01R\x00\x08\xb3\x01\x15\x05&\ +\x00+5\xff\xff\xfe\xe9\xfe\x14\x02q\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01K\xfe\xb3\x00\x00\x00\x08\xb3\x01\x15\ +\x11&\x00+5\xff\xff\x00f\xfe;\x05\x1b\x05\xb6\x02\ +&\x00.\x00\x00\x00\x06\x029}\x00\xff\xff\x00L\xfe\ +;\x03\xec\x06\x14\x02&\x00N\x00\x00\x00\x06\x029-\ +\x00\x00\x01\x00L\x00\x00\x03\xec\x04?\x00\x0d\x00\x18@\ +\x0c\x0d\x03\x06\x07\x04\x09\x01\x0a\x0f\x05\x09\x15\x00?3\ +?3\x12\x17910\x01\x013\x01\x01#\x01\x07\x03\ +#\x133\x03\x03\x01\x0e\x02a}\xfe&\x01)j\xfe\ +\xf8\xcdP`\xe5`AF\x01\xdd\x02b\xfe+\xfd\x96\ +\x02/\xbc\xfe\x8d\x04?\xfe\xc9\xfe\xd5\xff\xff\x00f\x00\ +\x00\x03N\x07s\x02&\x00/\x00\x00\x01\x07\x00v\xff\ +[\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00\ +L\x00\x00\x034\x07\xac\x02&\x00O\x00\x00\x01\x07\x00\ +v\xffO\x01\x8b\x00\x08\xb3\x01\x0d\x02&\x00+5\xff\ +\xff\x00f\xfe;\x03N\x05\xb6\x02&\x00/\x00\x00\x00\ +\x06\x029w\x00\xff\xff\xff\xaf\xfe;\x01\xf8\x06\x14\x02\ +&\x00O\x00\x00\x00\x07\x029\xff\x03\x00\x00\xff\xff\x00\ +f\x00\x00\x03\xfd\x05\xb7\x02&\x00/\x00\x00\x01\x07\x02\ +8\x00\xe9\xff\xa3\x00\x07\xb2\x01\x09\x03\x00?5\x00\xff\ +\xff\x00L\x00\x00\x03S\x06\x14\x02&\x00O\x00\x00\x01\ +\x06\x028?\x00\x00\x07\xb2\x01\x07\x00\x00?5\x00\xff\ +\xff\x00f\x00\x00\x03N\x05\xb6\x02&\x00/\x00\x00\x00\ +\x07\x01O\x01f\xfdx\xff\xff\x00E\x00\x00\x02F\x06\ +\x14\x00&\x00O\xf9\x00\x00\x07\x01O\x00u\xfd\xa3\x00\ +\x01\x00'\x00\x00\x03N\x05\xb6\x00\x0d\x00%@\x13\x01\ +\x0a\x04\x07\x04\x02\x08\x02\x08\x02\x00\x05\x03\x00\x0bIY\ +\x00\x12\x00?+\x00\x18?\x1299//\x12\x179\ +103\x13\x07'7\x133\x03%\x17\x05\x03!\x07\ +dq\x87'\xc7\xaef\xa0\x01\x1d+\xfe\x9eg\x02m\ +\x17\x02\x0cPNw\x035\xfd\x0d\xaaL\xd5\xfe\x14`\ +\x00\x00\x01\x00\x0a\x00\x00\x02=\x06\x14\x00\x0b\x00\x1e@\ +\x0f\x06\x03\x09\x00\x04\x07\x01\x07\x01\x07\x05\x0a\x00\x05\x15\ +\x00??\x1299//\x12\x17910\x017\x17\ +\x07\x03#\x13\x07'7\x133\x01^\xb6)\xf7\x9c^\ +\x8d\xaa%\xe6\xaa^\x03DhH\x8d\xfd)\x02\x98c\ +H\x87\x03\x10\x00\xff\xff\x00f\x00\x00\x05b\x07s\x02\ +&\x001\x00\x00\x01\x07\x00v\x01\x08\x01R\x00\x08\xb3\ +\x01\x19\x05&\x00+5\xff\xff\x00L\x00\x00\x04;\x06\ +!\x02&\x00Q\x00\x00\x01\x06\x00vV\x00\x00\x08\xb3\ +\x01\x22\x11&\x00+5\xff\xff\x00f\xfe;\x05b\x05\ +\xb6\x02&\x001\x00\x00\x00\x07\x029\x00\xd7\x00\x00\xff\ +\xff\x00L\xfe;\x04\x0a\x04P\x02&\x00Q\x00\x00\x00\ +\x06\x029V\x00\xff\xff\x00f\x00\x00\x05b\x07s\x02\ +&\x001\x00\x00\x01\x07\x01L\x00\xc5\x01R\x00\x08\xb3\ +\x01\x1c\x05&\x00+5\xff\xff\x00L\x00\x00\x04\x0a\x06\ +!\x02&\x00Q\x00\x00\x01\x06\x01L\xf9\x00\x00\x08\xb3\ +\x01%\x11&\x00+5\xff\xff\x00\x87\x00\x00\x04\x87\x05\ +\xb6\x00&\x02\x07\x06\x00\x01\x06\x00Q}\x00\x00\x07\xb2\ +\x01\x00\x03\x00?5\x00\x00\x01\x00f\xfe\x98\x05b\x05\ +\xb6\x00\x1a\x00%@\x12\x13\x0b\x13\x0b\x10\x09\x0f\x16\x10\ +\x03\x0f\x12\x00\x06IY\x00\x22\x00?+\x00\x18??\ +3\x113\x1299//10\x01\x22&'7\x16\ +3267\x01#\x06\x06\x03#\x013\x01367\ +\x133\x01\x06\x06\x02\xb8%\x5c\x0e\x0a:Oq}#\ +\xfe\x06\x08\x172\xbd_\x016P\x02\x0a\x08\x173\xbc\ +^\xfe\xcf)\xb3\xfe\x98\x11\x07\x5c\x14\x82\x9d\x04\xed\x95\ +\xf8\xfc\x89\x05\xb6\xfa\xf2\xb0\xf0\x03n\xfa\x5c\xc4\xb6\x00\ +\x01\x00L\xfe\x14\x04\x0a\x04P\x00\x22\x00#@\x12\x17\ +\x14\x15\x0f\x14\x15\x1a\x0eFY\x1a\x10\x00\x05GY\x00\ +\x1b\x00?+\x00\x18?+\x00\x18??\x12910\ +\x01\x22'5\x163267\x13654&#\x22\ +\x06\x06\x07\x03#\x133\x073632\x16\x15\x14\x07\ +\x03\x06\x06\x02\x10A//AR[\x1a\xba\x15W[\ +p\xc5\x87$fb\xe7R%\x06\xa4\xfc\x82\x82\x18\xbb\ +#\x8f\xfe\x14\x13\x5c\x16f\x7f\x03b\x5c@PZ\x86\ +\xf1\xa6\xfe#\x04?\xdd\xee\x80xFp\xfc\xa6\xa5\x8f\ +\x00\xff\xff\x00\xac\xff\xec\x05{\x06\x87\x02&\x002\x00\ +\x00\x01\x07\x01M\x00\xe7\x01R\x00\x08\xb3\x02\x1f\x05&\ +\x00+5\xff\xff\x00b\xff\xec\x04\x02\x055\x02&\x00\ +R\x00\x00\x01\x06\x01M\x02\x00\x00\x08\xb3\x02\x1e\x11&\ +\x00+5\xff\xff\x00\xac\xff\xec\x05{\x07\x1b\x02&\x00\ +2\x00\x00\x01\x07\x01N\x00\xb0\x01R\x00\x08\xb3\x02\x1f\ +\x05&\x00+5\xff\xff\x00b\xff\xec\x04\x02\x05\xc9\x02\ +&\x00R\x00\x00\x01\x06\x01N\xce\x00\x00\x08\xb3\x02\x1e\ +\x11&\x00+5\xff\xff\x00\xac\xff\xec\x05{\x07s\x02\ +&\x002\x00\x00\x01\x07\x01S\x01'\x01R\x00\x0a\xb4\ +\x03\x02/\x05&\x00+55\xff\xff\x00b\xff\xec\x04\ +g\x06!\x02&\x00R\x00\x00\x01\x06\x01S\x17\x00\x00\ +\x0a\xb4\x03\x02.\x11&\x00+55\x00\x02\x00\xac\xff\ +\xec\x07/\x05\xcb\x00\x16\x00\x22\x004@\x1f\x0d\x10I\ +Y\x01\x15IY\x11\x14IY\x11\x11\x01\x0d\x03\x01\x12\ +\x0b\x1cIY\x0b\x04\x04\x17IY\x04\x13\x00?+\x00\ +\x18?+\x00\x18??\x129/+++10!\ +!\x06\x06#\x22\x00\x11\x10\x12$32\x17!\x07!\ +\x03!\x07!\x03!\x0527\x01&#\x22\x04\x02\x15\ +\x14\x12\x05\xfa\xfdf\x19i*\xfb\xfe\xf3\xc0\x01L\xd7\ +\x82n\x02\xb0\x14\xfd\x8fu\x02N\x14\xfd\xb4\x87\x02r\ +\xfc\xb3D0\x01\x0fnO\xb6\xfe\xe9\xa6\xda\x06\x0e\x01\ ++\x01\x18\x01\x07\x01\xb6\xdf\x15^\xfd\xd7^\xfd\x8d\x16\ +\x0c\x05\x0a\x0f\xc5\xfez\xe5\xf5\xff\x00\x00\x03\x00b\xff\ +\xec\x06\x96\x04T\x00#\x000\x009\x00;@\x1e\x10\ +\x03\x06\x0d4\x1aFY44\x06\x0d1$\x0d$F\ +Y\x13\x0d\x10\x1f*\x06*FY\x00\x06\x16\x00?3\ ++\x11\x003\x18?3+\x11\x003\x11\x129\x18/\ ++\x11\x12\x009910\x05\x22&'\x06\x06#\x22\ +&54\x12632\x16\x176632\x16\x15\x14\ +\x04!#\x06\x15\x14\x16327\x15\x06\x01\x22\x06\x02\ +\x15\x10!26\x1254&\x05\x22\x06\x073 \x11\ +4&\x04\xee\x87\xba A\xe4\x8f\xb8\xbf\x92\xf8\x9d\x8d\ +\xc0\x1eF\xe1\x81r\x88\xfe\xb9\xfe\xbd \x07\x94\x8b\x85\ +\x90\x8c\xfc\xf4|\xc6v\x01\x1a\x7f\xc5u\x92\x02\x85\x83\ +\xe021\x02\x04Y\x14\x8a\x84\x7f\x8f\xdb\xcc\xbf\x01N\ +\xb4\x95\x8a\x84\x97zi\xb5\xbe&<\xa5\xadI^E\ +\x04\x12\x9d\xfe\xdb\xa4\xfe\xaa\x9b\x01-\xb4\x9a\xa6\x04\xe6\ +\xc2\x01\x0eFT\xff\xff\x00f\x00\x00\x04y\x07s\x02\ +&\x005\x00\x00\x01\x07\x00v\x00\x91\x01R\x00\x08\xb3\ +\x02\x1f\x05&\x00+5\xff\xff\x00H\x00\x00\x03s\x06\ +!\x02&\x00U\x00\x00\x01\x06\x00v\x8e\x00\x00\x08\xb3\ +\x01\x1c\x11&\x00+5\xff\xff\x00f\xfe;\x04y\x05\ +\xb6\x02&\x005\x00\x00\x00\x07\x029\x00\x8f\x00\x00\xff\ +\xff\xff\xa9\xfe;\x03D\x04R\x02&\x00U\x00\x00\x00\ +\x07\x029\xfe\xfd\x00\x00\xff\xff\x00f\x00\x00\x04y\x07\ +s\x02&\x005\x00\x00\x01\x07\x01L\x003\x01R\x00\ +\x08\xb3\x02\x22\x05&\x00+5\xff\xff\x00H\x00\x00\x03\ +|\x06!\x02&\x00U\x00\x00\x01\x07\x01L\xffx\x00\ +\x00\x00\x08\xb3\x01\x1f\x11&\x00+5\xff\xff\x00%\xff\ +\xec\x04$\x07s\x02&\x006\x00\x00\x01\x07\x00v\x00\ +?\x01R\x00\x08\xb3\x013\x05&\x00+5\xff\xff\x00\ +\x19\xff\xec\x03e\x06!\x02&\x00V\x00\x00\x01\x06\x00\ +v\x80\x00\x00\x08\xb3\x010\x11&\x00+5\xff\xff\x00\ +%\xff\xec\x04\x0c\x07s\x02&\x006\x00\x00\x01\x07\x01\ +K\x00\x00\x01R\x00\x08\xb3\x011\x05&\x00+5\xff\ +\xff\x00\x19\xff\xec\x031\x06!\x02&\x00V\x00\x00\x01\ +\x07\x01K\xff_\x00\x00\x00\x08\xb3\x01.\x11&\x00+\ +5\xff\xff\x00%\xfe\x14\x04\x0c\x05\xcb\x02&\x006\x00\ +\x00\x00\x07\x00z\x017\x00\x00\xff\xff\x00\x19\xfe\x14\x03\ +1\x04P\x02&\x00V\x00\x00\x00\x07\x00z\x00\xfc\x00\ +\x00\xff\xff\x00%\xff\xec\x04\x0c\x07s\x02&\x006\x00\ +\x00\x01\x07\x01L\xff\xd2\x01R\x00\x08\xb3\x016\x05&\ +\x00+5\xff\xff\x00\x19\xff\xec\x03M\x06!\x02&\x00\ +V\x00\x00\x01\x07\x01L\xffI\x00\x00\x00\x08\xb3\x013\ +\x11&\x00+5\xff\xff\x00\xa1\xfe;\x04\xa2\x05\xb6\x02\ +&\x007\x00\x00\x00\x06\x029\xf5\x00\xff\xff\x00K\xfe\ +;\x02\xb6\x05?\x02&\x00W\x00\x00\x00\x06\x029\x9f\ +\x00\xff\xff\x00\xc1\x00\x00\x04\xa2\x07s\x02&\x007\x00\ +\x00\x01\x07\x01L\x00\x02\x01R\x00\x08\xb3\x01\x14\x05&\ +\x00+5\xff\xff\x00q\xff\xec\x03|\x06\x13\x02&\x00\ +W\x00\x00\x01\x06\x028h\xff\x00\x07\xb2\x01\x1c\x00\x00\ +?5\x00\x00\x01\x00\xa4\x00\x00\x04\xa2\x05\xb6\x00\x0f\x00\ +(@\x14\x0b\x0f\x00\x0fJY\x08\x00\x00\x04\x0d\x12\x07\ +\x03\x04\x03IY\x04\x03\x00?+\x11\x003\x18?\x12\ +9/3+\x11\x00310\x13!\x13!7!\x07\ +!\x03!\x07!\x03#\x13!\xb6\x01Dw\xfeP\x14\ +\x03\xcd\x13\xfeHy\x01L\x12\xfe\xb6\x98f\x97\xfe\xbd\ +\x03#\x025^^\xfd\xcbR\xfd/\x02\xd1\x00\x01\x00\ +-\xff\xec\x02\xb6\x05?\x00\x22\x00<@\x1e\x06\x08@\ +\x05\x08\x03\x0b\x0f\x22\x00\x22HY\x0c\x00\x00\x1b\x08\x08\ +\x0bHY\x08\x0f\x1b\x15FY\x1b\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x18/3+\x11\x003\x113\x11\ +3\x1a\x18\x10\xcd10\x133\x13#?\x023\x03!\ +\x07!\x033\x07#\x07\x06\x15\x14\x16327\x15\x06\ +\x06#\x22&5477#?\xa2F\xb6\x0e\xb8a\ +77\x01\x1e\x12\xfe\xe5E\xf9\x12\xfa/\x16=AD\ +T\x19k\x22bq\x19-\xa2\x02\xa8\x01FC\x11\xfd\ +\xff\x00Q\xfe\xbaR\xe3cG9L\x1aV\x0a\x12v\ +_Om\xd9\x00\xff\xff\x00\xb0\xff\xec\x05s\x07\x17\x02\ +&\x008\x00\x00\x01\x07\x01R\x00\xee\x01R\x00\x08\xb3\ +\x01\x1e\x05&\x00+5\xff\xff\x00m\xff\xf0\x04-\x05\ +\xc5\x02&\x00X\x00\x00\x01\x06\x01R'\x00\x00\x08\xb3\ +\x01#\x11&\x00+5\xff\xff\x00\xb0\xff\xec\x05s\x06\ +\x87\x02&\x008\x00\x00\x01\x07\x01M\x00\xe5\x01R\x00\ +\x08\xb3\x01\x17\x05&\x00+5\xff\xff\x00m\xff\xf0\x04\ ++\x055\x02&\x00X\x00\x00\x01\x06\x01M%\x00\x00\ +\x08\xb3\x01\x1c\x11&\x00+5\xff\xff\x00\xb0\xff\xec\x05\ +s\x07\x1b\x02&\x008\x00\x00\x01\x07\x01N\x00\xb4\x01\ +R\x00\x08\xb3\x01\x17\x05&\x00+5\xff\xff\x00m\xff\ +\xf0\x04+\x05\xc9\x02&\x00X\x00\x00\x01\x06\x01N\xe8\ +\x00\x00\x08\xb3\x01\x1c\x11&\x00+5\xff\xff\x00\xb0\xff\ +\xec\x05s\x07\xba\x02&\x008\x00\x00\x01\x07\x01P\x00\ +\x8f\x01R\x00\x0a\xb4\x02\x01\x17\x05&\x00+55\xff\ +\xff\x00m\xff\xf0\x04+\x06h\x02&\x00X\x00\x00\x01\ +\x06\x01P\xda\x00\x00\x0a\xb4\x02\x01\x1c\x11&\x00+5\ +5\xff\xff\x00\xb0\xff\xec\x05s\x07s\x02&\x008\x00\ +\x00\x01\x07\x01S\x00\xfc\x01R\x00\x0a\xb4\x02\x01'\x05\ +&\x00+55\xff\xff\x00m\xff\xf0\x04b\x06!\x02\ +&\x00X\x00\x00\x01\x06\x01S\x12\x00\x00\x0a\xb4\x02\x01\ +,\x11&\x00+55\xff\xff\x00\xb0\xfeb\x05s\x05\ +\xb6\x02&\x008\x00\x00\x00\x07\x01Q\x02w\x00\x00\xff\ +\xff\x00m\xfeb\x04+\x04?\x02&\x00X\x00\x00\x00\ +\x07\x01Q\x02\xa2\x00\x00\xff\xff\x00\xee\x00\x00\x07;\x07\ +s\x02&\x00:\x00\x00\x01\x07\x01K\x01`\x01R\x00\ +\x08\xb3\x01&\x05&\x00+5\xff\xff\x00y\x00\x00\x05\ +\xae\x06!\x02&\x00Z\x00\x00\x01\x06\x01Kq\x00\x00\ +\x08\xb3\x01\x22\x11&\x00+5\xff\xff\x00\xc1\x00\x00\x04\ +\x83\x07s\x02&\x00<\x00\x00\x01\x07\x01K\xff\xe2\x01\ +R\x00\x08\xb3\x01\x10\x05&\x00+5\xff\xff\xff'\xfe\ +\x14\x03\xf0\x06!\x02&\x00\x5c\x00\x00\x01\x06\x01K\x80\ +\x00\x00\x08\xb3\x01\x1f\x11&\x00+5\xff\xff\x00\xc1\x00\ +\x00\x04\x83\x07\x13\x02&\x00<\x00\x00\x01\x07\x00j\xff\ +\xda\x01R\x00\x0a\xb4\x02\x01\x1b\x05&\x00+55\xff\ +\xff\xff\xf4\x00\x00\x04\xc9\x07s\x02&\x00=\x00\x00\x01\ +\x07\x00v\x00X\x01R\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\xff\xe3\x00\x00\x03\x8a\x06!\x02&\x00]\x00\ +\x00\x01\x06\x00v\xa5\x00\x00\x08\xb3\x01\x13\x11&\x00+\ +5\xff\xff\xff\xf4\x00\x00\x04\xc9\x07!\x02&\x00=\x00\ +\x00\x01\x07\x01O\x01\x89\x01R\x00\x08\xb3\x01\x12\x05&\ +\x00+5\xff\xff\xff\xe3\x00\x00\x03\x7f\x05\xcf\x02&\x00\ +]\x00\x00\x01\x07\x01O\x00\xc9\x00\x00\x00\x08\xb3\x01\x12\ +\x11&\x00+5\xff\xff\xff\xf4\x00\x00\x04\xc9\x07s\x02\ +&\x00=\x00\x00\x01\x07\x01L\x005\x01R\x00\x08\xb3\ +\x01\x16\x05&\x00+5\xff\xff\xff\xe3\x00\x00\x03\x80\x06\ +!\x02&\x00]\x00\x00\x01\x07\x01L\xff|\x00\x00\x00\ +\x08\xb3\x01\x16\x11&\x00+5\x00\x01\xfe\xe1\xfe\x14\x03\ +;\x06\x1f\x00\x18\x00\x17@\x0c\x0c\x12FY\x0c\x00\x00\ +\x05GY\x00\x1b\x00?+\x00\x18?+10\x03\x22\ +'5\x163267\x016632\x16\x17\x07&\ +#\x22\x06\x07\x01\x06\x06\xb81650X\x5c\x1d\x01\ +&&\xa1\x92(d\x19\x18W=_r\x1c\xfe\xd1!\ +\x8e\xfe\x14\x13Z\x10j\x85\x05\x7f\xa9\x97\x16\x09P\x1b\ +j~\xfae\xa1\x93\x00\x00\x01\x00\x02\xfe\x14\x04J\x05\ +\xcb\x00\x1f\x000@\x18\x1c\x0a\x19\x0c\x0c\x0aHY\x0c\ +\x0c\x10\x00\x10\x15FY\x10\x00\x00\x05GY\x00\x1b\x00\ +?+\x00\x18\x10\xc4+\x11\x12\x009\x18/+\x11\x00\ +3\x11310\x13\x22'5\x163267\x13#\ +?\x026632\x17\x07&#\x22\x06\x07\x073\x07\ +#\x03\x06\x06h065/X\x5c\x1d\xd7\xcc\x0e\xcd\ +/#\xa3\x92I]\x19W<`s\x1b/\xf8\x11\xf7\ +\xde\x22\x8f\xfe\x14\x13Z\x10j\x85\x03\xfaD\x0e\xdf\xa8\ +\x98\x1fP\x1bk}\xe3R\xfb\xee\xa5\x8f\x00\x00\x04\xff\ +\x91\x00\x00\x04F\x07\xf4\x00\x12\x00\x1a\x00&\x000\x00\ +O@/\x1a\x07IY\x1a\x1a$\x09\x03\x0a\x17\x10$\ +\x17JY$\x10\x10\x1eJY0@\x09\x0fH0\x00\ +\x10\x10\x10 \x10\x03\x10\x10\x09*@\x09\x0cH*\x05\ +\x09\x12\x00?3/+\x129/]\xc6++\x00\x18\ +\x10\xc4+\x11\x12\x0099\x11\x129\x18/+10\ +\x01\x14\x06\x07\x13#\x03!\x01#\x01&&546\ +32\x16\x03\x03&'#\x06\x06\x03\x014&#\x22\ +\x06\x15\x14\x16326\x036673\x15\x06\x06\x07\ +#\x03\xa0>;\xaciE\xfe\x00\xfe\xe1u\x02\xc9%\ ++vY]j\x87'\x16\x0d!\x1c<\xfe\x01\xfcA\ +<6GA<8E\xb0B\xa9-\x8a:\xceWC\ +\x05\xa6?f\x15\xfb\x14\x02\x08\xfd\xf8\x04\xfc\x1aU5\ +Zpi\xfcc\x01#\x9b\xbb7s\xfe1\x03@9\ +DD9;BB\x01X3\xb6J\x17G\xb46\xff\ +\xff\x00f\xff\xec\x047\x07\xc7\x02&\x00D\x00\x00\x00\ +&\x01P\xdc\xce\x01\x07\x00v\x00L\x01\xa6\x00-@\ +#\x04\x0fB\x1fB/B?B_BoB\x7fB\ +\xbfB\xcfB\x09B\x03\x02\x0f%\xa0%\xcf%\xdf%\ +\xef%\x05%\x00/]55/]5\x00\xff\xff\xff\ +\x8b\x00\x00\x06\xb0\x07s\x02&\x00\x88\x00\x00\x01\x07\x00\ +v\x02\x08\x01R\x00\x08\xb3\x02\x1d\x05&\x00+5\xff\ +\xff\x00f\xff\xec\x06\x1f\x06!\x02&\x00\xa8\x00\x00\x01\ +\x07\x00v\x01\x85\x00\x00\x00\x08\xb3\x03P\x11&\x00+\ +5\xff\xff\x00\x8b\xff\xb2\x05\xa8\x07s\x02&\x00\x9a\x00\ +\x00\x01\x07\x00v\x00\xe9\x01R\x00\x08\xb3\x036\x05&\ +\x00+5\xff\xff\x00-\xff\xb8\x041\x06!\x02&\x00\ +\xba\x00\x00\x01\x06\x00v\x00\x00\x00\x08\xb3\x031\x11&\ +\x00+5\xff\xff\x00%\xfe;\x04\x0c\x05\xcb\x02&\x00\ +6\x00\x00\x00\x06\x029\x1b\x00\xff\xff\x00\x19\xfe;\x03\ +1\x04P\x02&\x00V\x00\x00\x00\x06\x029\xc4\x00\x00\ +\x01\x01\xbc\x04\xd9\x03\xbe\x06!\x00\x0f\x00\x0e\xb4\x03\x0c\ +\x80\x07\x01\x00/3\x1a\xcd210\x01#&'\x06\ +\x06\x07#56673\x16\x16\x17\x03\xbe1F[\ +7\x8c76D\xb3&@\x17c+\x04\xd9<\x939\ +s#\x1d8\xb9:@\xb1:\x00\x01\x02\x02\x04\xd9\x04\ +\x04\x06!\x00\x0f\x00\x0e\xb4\x06\x01\x80\x03\x0c\x00/3\ +\x1a\xcd210\x013\x16\x176673\x15\x06\x06\ +\x07#&&'\x02\x021HZ7\x8c75D\xaf\ +*?\x1d_*\x06!=\x929s#\x1d7\xb6>\ +J\xa89\x00\x01\x01\xa0\x04\xdd\x03\xae\x055\x00\x03\x00\ +\x08\xb1\x00\x03\x00/\xc910\x01!\x07!\x01\xb2\x01\ +\xfc\x12\xfe\x04\x055X\x00\x01\x01\xee\x04\xdf\x03\xf0\x05\ +\xc9\x00\x0f\x00\x0e\xb4\x08\x00\x80\x0c\x03\x00/3\x1a\xcd\ +210\x01\x06\x06#\x22&5573\x14\x163\ +267\x03\xf0\x1d\x90xit\x02EHVUg\ +\x19\x05\xc9xre\x5c\x15\x14DF=M\x00\x01\x01\ +F\x05\x0c\x01\xd1\x05\xcf\x00\x09\x00\x08\xb1\x03\x08\x00/\ +\xcd10\x014632\x15\x14\x06#\x22\x01F+\ +'9-#;\x05V8AH:A\x00\x00\x02\x02\ +1\x04\xdb\x03\xc7\x06h\x00\x0b\x00\x17\x00\x15@\x0b\x0f\ +\x1f\x09/\x09?\x09\x03\x09\x15\x03\x00/3\xcc]2\ +10\x01\x14\x06#\x22&54632\x16\x074\ +&#\x22\x06\x15\x14\x16326\x03\xc7sX]n\ +wZXmNC6\x00\x00\x00\x0c\xb5\x03\x02\x01#\ +\x11&\x00+555\xff\xff\xff\x91\x00\x00\x03\xd3\x05\ +\xbc\x02\x06\x00$\x00\x00\xff\xff\x00f\x00\x00\x04\x9e\x05\ +\xb6\x02\x06\x00%\x00\x00\x00\x01\x00f\x00\x00\x04`\x05\ +\xb6\x00\x05\x00\x11\xb7\x01\x12\x02\x05IY\x02\x03\x00?\ ++\x00\x18?103#\x01!\x07!\xcdg\x016\ +\x02\xc4\x14\xfd\xa4\x05\xb6^\x00\xff\xff\xff\xd3\x00\x00\x03\ +\xf4\x05\xbc\x02\x06\x02(\x00\x00\xff\xff\x00f\x00\x00\x04\ +s\x05\xb6\x02\x06\x00(\x00\x00\xff\xff\xff\xf4\x00\x00\x04\ +\xc9\x05\xb6\x02\x06\x00=\x00\x00\xff\xff\x00f\x00\x00\x05\ +\x5c\x05\xb6\x02\x06\x00+\x00\x00\x00\x03\x00\xac\xff\xec\x05\ +{\x05\xcb\x00\x03\x00\x11\x00\x1f\x00&@\x14\x03\x02I\ +Y\x03\x03\x08\x0f\x0f\x12IY\x0f\x04\x08\x19IY\x08\ +\x13\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x01\x07!7%\x14\x02\x04#\x22\x00\x11\x10\x12$\ +32\x00%\x22\x04\x02\x15\x14\x1232$\x1254\ +&\x04?\x12\xfd\xa8\x12\x03\x94\xbc\xfe\xc4\xcf\xfa\xfe\xf2\ +\xba\x01D\xd3\xf7\x01\x07\xfd\xf4\xae\xfe\xf3\xa0\xdb\xd2\xa9\ +\x01\x06\x9e\xd1\x03\x19aav\xff\xfe;\xdf\x01*\x01\ +\x19\x01\x06\x01\xaf\xe7\xfe\xd7\xcb\xca\xfev\xdc\xf5\xff\x00\ +\xc5\x01\x93\xe5\xf0\xf8\x00\xff\xff\xff\xdb\x00\x00\x02\xb2\x05\ +\xb6\x02\x06\x00,\x00\x00\xff\xff\x00f\x00\x00\x05\x1b\x05\ +\xb6\x02\x06\x00.\x00\x00\x00\x01\xff\x8f\x00\x00\x03\xf8\x05\ +\xb6\x00\x0b\x00\x10\xb6\x00\x04\x05\x03\x08\x04\x12\x00?3\ +?\x12910\x01\x06\x07\x01#\x013\x13#\x03&\ +'\x02\xe1C\x8a\xfd\xf2w\x03>\x5c\xcfe\x8b\x1d\x06\ +\x053\x94\xf3\xfcT\x05\xb6\xfaJ\x03\xd9\xce\x8c\x00\xff\ +\xff\x00m\x00\x00\x06w\x05\xb6\x02\x06\x000\x00\x00\xff\ +\xff\x00f\x00\x00\x05b\x05\xb6\x02\x06\x001\x00\x00\x00\ +\x03\xff\xee\x00\x00\x04s\x05\xb6\x00\x03\x00\x07\x00\x0b\x00\ +&@\x14\x00\x03IY\x00\x00\x0a\x04\x04\x07IY\x04\ +\x03\x0a\x0bIY\x0a\x12\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10\x01!\x07!\x13!\x07!\x01\ +\x07!7\x01\x1d\x02r\x12\xfd\x8d@\x03)\x13\xfc\xd5\ +\x02D\x15\xfc\x8a\x12\x03/^\x02\xe5^\xfb\x06^^\ +\x00\xff\xff\x00\xac\xff\xec\x05{\x05\xcb\x02\x06\x002\x00\ +\x00\x00\x01\x00f\x00\x00\x05\x5c\x05\xb6\x00\x07\x00\x14@\ +\x09\x01\x05\x12\x06\x03IY\x06\x03\x00?+\x00\x18?\ +310!#\x01!\x01#\x01!\x04'd\x01 \ +\xfd\x0b\xfe\xdfg\x016\x03\xc0\x05V\xfa\xaa\x05\xb6\xff\ +\xff\x00f\x00\x00\x04y\x05\xb6\x02\x06\x003\x00\x00\x00\ +\x01\xff\xe9\x00\x00\x04q\x05\xb6\x00\x0d\x00/@\x17\x09\ +\x02\x02\x00\x04\x03\x08\x07\x04\x07IY\x04\x03\x01\x0a\x0b\ +\x00\x0bIY\x00\x12\x00?+\x11\x0033\x18?+\ +\x11\x0033\x11\x129\x19/310#7\x01\x01\ +7!\x07!'\x01\x017!\x07\x17\x0f\x02r\xfe\xaf\ +\x10\x03H\x13\xfd\xee\xc5\x01P\xfd\x9c\x97\x02\x7f\x14X\ +\x02\x8f\x02{T^\x04\xfd\x7f\xfd\x7f\x04^\xff\xff\x00\ +\xc1\x00\x00\x04\xa2\x05\xb6\x02\x06\x007\x00\x00\xff\xff\x00\ +\xc1\x00\x00\x04\x83\x05\xb6\x02\x06\x00<\x00\x00\x00\x03\x00\ +\x9c\xff\xec\x05q\x05\xcb\x00\x14\x00\x1b\x00#\x00.@\ +\x18#\x1b\x15\x1c\x01\x0c\x13\x09\x13\x15IY\x09\x1cI\ +Y\x13\x09\x13\x09\x0a\x04\x00\x13\x00??99//\ +++\x11\x12\x0099\x11\x129910\x057.\ +\x0254\x12$773\x07\x16\x16\x15\x14\x02\x04\x07\ +\x07\x13$\x0054&'#\x0e\x02\x15\x14\x16\x17\x02\ +11\x90\xcbk\xa5\x013\xd4)d'\xda\xe9\xa8\xfe\ +\xce\xcc3E\x01\x08\x01#\xb8\xb6g\xab\xfb\x8b\xc8\xad\ +\x14\xe9\x08{\xc8\x82\xb1\x01\x1b\x98\x06\xbf\xbf\x0e\xe7\xc9\ +\xbb\xfe\xe1\x98\x07\xe9\x01E\x08\x01\x16\xf9\xa3\xbd\x06\x03\ +|\xec\x99\xae\xc7\x04\x00\xff\xff\xffy\x00\x00\x04}\x05\ +\xb6\x02\x06\x00;\x00\x00\x00\x01\x00\xd1\x00\x00\x05\xf6\x05\ +\xb6\x00\x1f\x00!@\x10\x01\x04\x13\x04JY\x16\x13\x13\ +\x03\x1b\x14\x0b\x03\x03\x12\x00??33\x129/3\ ++\x11\x00310\x01#\x03#\x13#\x22&54\ +7\x133\x02\x02\x17\x14\x1633\x133\x03326\ +7\x133\x03\x02\x04\x03\x02\x0c`g`\x08\xd4\xe2\x1d\ +Og7=\x05\xac\xb5\x0c\xc2g\xc3\x0a\xeb\xfb5d\ +ei8\xfe\xc3\x01\xc7\xfe9\x01\xc7\xc9\xc0f\x89\x01\ +w\xfe\xfe\xfe\xe5A\xa0\x99\x03\x97\xfci\xd2\xf6\x01\xcf\ +\xfe\x1b\xfe\xed\xf7\x00\x01\x00\x1b\x00\x00\x05{\x05\xcb\x00\ +$\x00!@\x11\x15\x00IY\x15\x04\x1f\x09\x1b\x0c\x0b\ +\x0cIY\x1e\x0b\x12\x00?3+\x11\x00333\x18\ +?+10\x01\x22\x06\x06\x02\x15\x14\x16\x16\x17\x07!\ +7!.\x0254\x12$32\x00\x11\x14\x02\x07!\ +\x07!7$\x00\x114&\x03o\x87\xdc\x9c\x5c7c\ +k\x0b\xfe\x0d\x12\x01ZTT3\xbd\x01=\xcd\xfb\x01\ +\x0d\xf6\xd3\x01y\x12\xfd\xd0\x0b\x01\x09\x01\x11\xd8\x05m\ +i\xc2\xfe\xe9\x8f\x81\xcb\xa9n9^^\xa1\xc8}\xe3\ +\x01\x84\xc2\xfe\xdd\xfe\xe7\xfd\xfeJ~^9\x92\x01\xbb\ +\x01\x12\xe0\xf5\x00\xff\xff\xff\xdb\x00\x00\x02\xfd\x07\x13\x02\ +&\x00,\x00\x00\x01\x07\x00j\xff6\x01R\x00\x0a\xb4\ +\x02\x01\x1e\x05&\x00+55\xff\xff\x00\xc1\x00\x00\x04\ +\x83\x07\x13\x02&\x00<\x00\x00\x01\x07\x00j\xff\xd8\x01\ +R\x00\x0a\xb4\x02\x01\x1b\x05&\x00+55\xff\xff\x00\ +f\xff\xec\x04m\x06\x7f\x02&\x01~\x00\x00\x01\x06\x01\ +T\xef\x00\x00\x08\xb3\x02;\x11&\x00+5\xff\xff\x00\ +;\xff\xec\x03p\x06\x7f\x02&\x01\x82\x00\x00\x01\x06\x01\ +T\xa3\x00\x00\x08\xb3\x012\x11&\x00+5\xff\xff\x00\ +L\xfe\x14\x04\x0a\x06\x7f\x02&\x01\x84\x00\x00\x01\x06\x01\ +T\x02\x00\x00\x08\xb3\x01\x22\x11&\x00+5\xff\xff\x00\ +p\xff\xec\x02z\x06\x7f\x00&\x01\x86\xf7\x00\x01\x07\x01\ +T\xfe\xad\x00\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\ +\xff\x00\x8d\xff\xec\x04%\x06\xb4\x02&\x01\x92\x00\x00\x01\ +\x06\x01U{\x00\x00\x0c\xb5\x03\x02\x01&\x11&\x00+\ +555\x00\x02\x00f\xff\xec\x04m\x04P\x00!\x00\ +1\x00*@\x15\x03\x1a\x1c\x00\x06\x0f\x00+FY\x00\ +\x10\x0f\x22\x1c\x22GY\x14\x1c\x16\x00?3+\x11\x00\ +3\x18?+\x00\x18?\x11\x129910\x012\x16\ +\x173673\x06\x06\x07\x02\x06\x15\x14327\x15\ +\x06#\x22&547#\x02# \x114\x126\x03\ +2>\x0254&&#\x22\x06\x02\x15\x14\x16\x02\x8f\ +q\x91\x1b\x0645R$R\x22I\x0dL'7<\ +?MF\x0c\x06\xa4\xfe\xfe\xe7\x96\xfba\x5c\xb3\x89I\ +4fL|\xc8\x80d\x04Prt\x8fF=\xf5\x9c\ +\xfe\xa8]\x18b\x16N\x1eYH7N\xfe\xda\x01v\ +\xc5\x01f\xc3\xfb\xf6{\xd0\xf6^O}I\xa4\xfe\xb9\ +\xa2\x98\x8f\x00\x02\xff\xe1\xfe\x14\x04V\x06\x1f\x00\x18\x00\ +.\x006@\x1c\x07'(\x12\x0e\x00('HY(\ +(\x0e\x00\x15\x1b\x00\x19FY\x00\x00\x0e!FY\x0e\ +\x16\x00?+\x00\x18?+\x00\x18?\x11\x129/+\ +\x11\x12\x009\x11\x12910\x012\x16\x15\x14\x06\x06\ +\x07\x16\x16\x15\x14\x06\x06#\x22&&'\x03\x03#\x01\ +66\x17\x22\x06\x06\x07\x03\x16\x163265\x10!\ +#732654&\x03\x02\x9b\xb9Z\x9fi}\ +\x89s\xd5\x8fEvbEAA^\x01\x5c2\xde\xa7\ +`\x88W\x1d\xc5F\xb0V\xaa\xca\xfe\x965\x10;\xd3\ +\xde\x85\x06\x1f\xb0\x98s\xb4p\x11\x1f\xc1\x8e\x88\xd6w\ +\x1c-3\xfe\xd8\xfe\xd4\x06R\xe9\xd0VQ\x99\x8b\xfc\ +h8B\xcb\xad\x01NR\xbf\xb8v\x82\x00\x00\x01\x00\ +w\xfe\x14\x03\xe3\x04?\x00\x0f\x00\x12\xb7\x08\x03\x01\x0c\ +\x04\x0f\x01\x1b\x00??3\x129910\x13#6\ +\x13\x033\x13\x16\x17367\x013\x01\x02\xddf\x1b\ +\xa1\xb8dg\x13\x1a\x04Ec\x01`d\xfd\xc9\xb1\xfe\ +\x14\xce\x01,\x041\xfd\x84q\xe5\x97\xb2\x02\x89\xfb\xee\ +\xfe\xbf\x00\x00\x02\x00N\xff\xec\x04B\x06\x1f\x00\x1d\x00\ +*\x00*@\x17\x08\x08%\x00\x02\x0d\x22\x15\x06\x19\x05\ +\x05\x0aFY\x05\x00\x19\x1eFY\x19\x16\x00?+\x00\ +\x18?+\x11\x12\x00\x1799\x18/10\x01&5\ +4632\x17\x07&#\x22\x06\x15\x14\x16\x16\x17\x1e\ +\x02\x15\x14\x02\x06#\x22&5\x10\x0126654\ +&'\x04\x06\x15\x14\x16\x02s\xcd\xb8\x96\xa1\xad.\xa0\ +\x8bhu#BZif5\x83\xe5\x92\xb4\xd3\x01\x91\ +w\xb2`Qa\xfe\xef\xf1\x9e\x03\xbe\x9b\xa7\x81\x9es\ +NkoX/QNKW\x8b\xa1`\x94\xff\x00\x86\ +\xd6\xaf\x01\xc8\xfd\x09u\xce\x81s\xb8PD\xff\xc3\x93\ +\xa6\x00\x01\x00;\xff\xec\x03m\x04P\x00(\x007@\ +\x1e\x15\x01''\x01GY\x0f'\x1f'\x02\x0b\x03'\ +'\x0e\x1b\x1b!FY\x1b\x10\x0e\x07FY\x0e\x16\x00\ +?+\x00\x18?+\x11\x12\x009\x18/_^]+\ +\x11\x12\x00910\x01#\x22\x06\x15\x14\x16326\ +7\x15\x06\x06#\x22&54675&&54\ +632\x17\x07&&#\x22\x06\x15\x14\x1633\x02\ +mq\xa8\xb2}tR\xbbED\xb6`\x9d\xb3\xa4\x92\ +HX\xce\xad\xa2\x7f'3\x8b>\x85\x8e~tV\x02\ +\x0c\x85}_i1']#.\x94\x82\x84\xab\x15\x04\ +\x19mQ\x8a\xa5BV\x1d#of[`\x00\x01\x00\ +u\xfeJ\x04\x1d\x06\x14\x00\x22\x00!@\x11\x00\x0e\x16\ +\x1d\x04\x07\x1a#\x03\x09\x06\x07\x06HY\x07\x00\x00?\ ++\x11\x0033\x18?\x12\x17910\x134\x00\x01\ +\x06#!7!\x07\x07\x06\x00\x02\x15\x14\x16\x16\x17\x1e\ +\x02\x15\x14\x06\x07#6654&'&&u\x01\ +t\x01\xb9`\x86\xfe\xf4\x13\x02Z\x13\xbf\xe2\xfe\xf7\x83\ +.]ofW*FYuZZIw\xa1\x88\x01\ +\x81\xe3\x01\xfb\x01h\x06SS\xac\xc8\xfe\xd6\xfe\xec\x82\ +UrO-)>N5@\x80VS|92I\ +-;\xb7\x00\x01\x00L\xfe\x14\x04\x0a\x04P\x00\x18\x00\ +\x22@\x11\x10\x0f\x0f\x0c\x12\x0d\x0f\x0c\x15\x00\x1b\x12\x06\ +FY\x12\x10\x00?+\x00\x18???\x11\x129\x11\ +310\x01\x01654&#\x22\x06\x06\x07\x03#\ +\x133\x073632\x16\x15\x14\x07\x01\x02\x91\x01\x00\ +\x15W[p\xc5\x87$fb\xe7R%\x06\xa4\xfc\x82\ +\x82\x18\xff\x00\xfe\x14\x04\xa0\x5c@PZ\x86\xf1\xa6\xfe\ +#\x04?\xdd\xee\x80xFp\xfbr\x00\x03\x00{\xff\ +\xec\x04=\x06+\x00\x09\x00\x11\x00\x22\x00&@\x14\x0c\ +\x04GY\x0c\x0c\x12\x1b\x1b\x0aFY\x1b\x01\x12\x00F\ +Y\x12\x16\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++10%2\x12\x13!\x06\x06\x15\x14\x16\x01 \x03\ +!654&\x01\x22&54\x12\x12663 \ +\x11\x14\x02\x02\x06\x06\x01\xd7\xa9\xe7O\xfdH\x0c\x17{\ +\x01\x8f\xfe\xb5\x8a\x02\xb5\x1ax\xfef\xaa\xa89r\x97\ +\xbfv\x01K8q\x92\xbdB\x01P\x01p7\xceE\ +\xbe\xb8\x05\x95\xfd\x85\x96\x85\xb6\xaa\xfa\x15\xe2\xe4\x8d\x01\ +X\x01S\xd8i\xfeP\x85\xfe\x9c\xfe\xa5\xdbp\x00\x00\ +\x01\x00y\xff\xec\x01\xdd\x04?\x00\x10\x00\x11\xb7\x0b\x0f\ +\x05\x00FY\x05\x16\x00?+\x00\x18?10%2\ +7\x15\x06#\x22&547\x133\x03\x06\x15\x14\x01\ +Z7LTAdk\x1d\x93b\x99\x17D\x14T\x18\ +sbS{\x02\xb0\xfd4g=\x8b\xff\xff\x00L\x00\ +\x00\x03\xec\x04?\x02\x06\x00\xfa\x00\x00\x00\x01\xff\x8d\xff\ +\xec\x03R\x06!\x00\x22\x000@\x18\x0d\x0d\x04\x10\x22\ +\x00\x00\x07\x1c\x10\x04\x15\x10\x0bFY\x10\x01\x1c\x17H\ +Y\x1c\x16\x00?+\x00\x18?+\x00\x18?\x11\x129\ +9\x113\x11\x129/10\x01\x06\x07\x01#\x12\x00\ +\x13'&&#\x22\x07'632\x16\x17\x13\x16\x16\ +327\x15\x06#\x22&'\x03&'\x02\x101L\ +\xfeag\x9b\x01>\x9c\x14\x0aQX'A\x083J\ +w{\x10n\x07%* $'1NI\x09/\x0f\ +\x05\x03\xc5k\x85\xfd+\x01\x10\x02\x1f\x01\x13\xc0ib\ +\x11R\x13~\x95\xfb\xa8?<\x0dN\x0eV`\x01\xef\ +\xaa\x8a\x00\xff\xff\xff\xe3\xfe\x14\x04H\x04?\x02\x06\x00\ +w\x00\x00\x00\x01\x00y\x00\x00\x03\xdb\x04?\x00\x0c\x00\ +\x0e\xb5\x07\x00\x0f\x04\x0c\x15\x00?3?210\x13\ +3\x13\x16\x176\x00\x133\x02\x00\x07#ybF\x1b\ +\x12\xca\x01!@bD\xfe\xce\xfbd\x04?\xfd\xc5\xe2\ +\xc8\xa7\x02\x01\x01=\xfe\xa7\xfd\xed\xd3\x00\x01\x00;\xfe\ +`\x03\xc7\x06\x14\x003\x005@\x1c\x1a\x05\x0c\x12\x04\ +\x10(\x1d\x0122\x01FY22(\x10#*$\ +'('HY(\x00\x00?+\x11\x0033\x18?\ +\x129/+\x11\x12\x009\x11\x12\x17910\x01#\ +\x22\x04\x06\x15\x14\x16\x17\x1e\x02\x15\x14\x06\x07#65\ +4&'.\x0354675&&5467\ +\x06##7!\x07#\x22\x04\x06\x15\x14\x1633\x03\ +\x1bH\xa4\xfe\xf8\x83j\x8ez\x5c.LFx\xa1>\ +G}xQ1\xef\xd6vz\xc9\xb8sWm\x13\x02\ +Z\x15!\x83\xfe\xf2\x8f\xbd\xb3N\x03\x0ef\xb1zg\ +\x882+=U==\x88=\x84\x800@\x1b-=\ +QuV\xaf\xee'\x04\x16\x88k\x86\xce/\x08SS\ +k\xa5euu\xff\xff\x00b\xff\xec\x04\x02\x04T\x02\ +\x06\x00R\x00\x00\x00\x01\x00Z\xff\xec\x04\x98\x04?\x00\ +\x1a\x00\x22@\x11\x0e\x15\x15\x0c\x10\x12\x10HY\x12\x0f\ +\x05\x00HY\x05\x16\x00?+\x00\x18?+\x11\x003\ +3\x18?10%27\x15\x06#\x22&547\ +\x13!\x03#\x13#77!\x07#\x03\x06\x15\x14\x16\ +\x03b+/+=HV\x15\x99\xfe-\xd5b\xd5\xd5\ +\x0e\xbb\x03u\x13\xc0\x9c\x10&=\x0dR\x0cV??\ +[\x02\xd3\xfc\x12\x03\xee?\x12Q\xfd\x1aK.#/\ +\x00\x00\x02\xff\xdf\xfe\x14\x04\x0e\x04T\x00\x0f\x00\x1c\x00\ +\x22@\x11\x0a\x07\x00\x0d\x1b\x00\x10FY\x00\x10\x07\x16\ +FY\x07\x16\x00?+\x00\x18?+\x00\x18?\x11\x12\ +910\x012\x16\x15\x14\x02\x06#\x22&'\x06\x03\ +#\x13\x12\x05\x22\x06\x07\x03\x16326\x1254&\ +\x02\x9c\xad\xc5\x90\xf2\x9aY\x8eM\x1c`c\xfa_\x01\ +U\x87\xaa/\x5c\x7f\xa0~\xc2x\x92\x04T\xd7\xc1\xc9\ +\xfe\xa9\xb08F\x98\xfeB\x04\x96\x01\xaaV\xb4\xd7\xfe\ +N\x7f\x9b\x010\xb1\x9a\xa6\x00\x00\x01\x00f\xfeJ\x03\ +\x89\x04P\x00\x1f\x00\x1b@\x0e\x19\x06\x0d\x13\x04\x1d\x10\ +#\x1d\x02FY\x1d\x10\x00?+\x00\x18?\x12\x179\ +10\x01&#\x22\x06\x02\x15\x14\x16\x16\x17\x16\x16\x15\ +\x14\x07#6654&'&&54\x1263\ +2\x17\x03mnl\x81\xd0u0fv\x88]\x91y\ +KYKk\xaf\x8d\x96\xfc\xa0\x83n\x03\xcb/\x9d\xfe\ +\xe7\xa6^}X.4hS\x81\x83Ax:=I\ +)@\xc6\xaa\xc3\x01H\xa9+\x00\x02\x00h\xff\xec\x04\ +\xa8\x04?\x00\x0f\x00\x1d\x00\x1c@\x0e\x0d\x10\x0a\x10H\ +Y\x0a\x0f\x03\x16FY\x03\x16\x00?+\x00\x18?+\ +\x11\x00310\x01\x10\x00#\x22&54\x12$3\ +!\x07#\x16\x16\x01\x22\x00\x11\x14\x1632665\ +4&'\x03\xf6\xfe\xf8\xf0\xc0\xd6\x9a\x01\x17\xc2\x01\xcd\ +\x12\xf0#-\xfe\xe9\xfc\xfe\xec\xa4\x99w\xae^%\x1e\ +\x02y\xfe\xcd\xfe\xa6\xf6\xda\xc5\x01(\x96QF\xcf\x01\ +\x15\xfe\xde\xfe\xfb\xbc\xc9\x84\xfe\xbbS\xceN\x00\x01\x00\ +H\xff\xec\x03R\x04?\x00\x17\x00\x1c@\x0e\x12\x0d\x0f\ +\x0dHY\x0f\x0f\x06\x00FY\x06\x16\x00?+\x00\x18\ +?+\x11\x00310%27\x15\x06\x06#\x22&\ +547\x13!77!\x07!\x03\x06\x15\x14\x16\x01\ +\xd9=[\x11o*cl\x1c\x82\xfe\xb2\x0e\xb8\x02D\ +\x10\xfe\xb6\x87\x17@D\x1aV\x07\x15ngR|\x02\ +_?\x12Q\xfd\x85k9AJ\x00\x00\x01\x00\x8d\xff\ +\xec\x04%\x04?\x00\x13\x00\x14@\x09\x11\x06\x0f\x00\x0e\ +FY\x00\x16\x00?+\x00\x18?310\x05\x22&\ +547\x133\x03\x06\x06\x15\x14\x1632\x12\x113\ +\x10\x01\xe3\xa2\xb4%iff\x1d\x0a\x80|\xe6\xe8g\ +\x14\xb7\xa3i\xa5\x01\xeb\xfe!\x8dW.\x84\x88\x02\x05\ +\x01\xf8\xfb\xad\x00\x00\x02\x00;\xfe\x14\x04\xc1\x04T\x00\ +\x1a\x00%\x00%@\x13\x06\x10\x1a\x1b\x11\x1eGY\x11\ +\x10\x22\x0d\x00\x0dFY\x18\x00\x16\x00?2+\x11\x00\ +3\x18?+\x00\x18??10\x05&&54\x12\ +7\x17\x06\x02\x15\x14\x16\x17\x136632\x16\x15\x14\ +\x02\x04\x07\x03#\x014&#\x22\x06\x07\x0366\x12\ +\x01\xcb\xbf\xd1\x9a\xaa?\x95\x89\xa3\x9a\xa0\x1f\x9ct\x83\ +\x92\xa0\xfe\xd5\xcdba\x02\xfaaWRf\x19\x9c\xaa\ +\xf9\x82\x17\x14\xf0\xc7\xbb\x01E\x9e@\x88\xfe\xe4\xb4\xaa\ +\xc2\x0f\x02\xe6\x95\x9a\xbe\xa6\xe2\xfe\xa2\xc1\x08\xfe-\x04\ +\xd1\x86\x8fpx\xfd-\x0a\xac\x01-\x00\x01\xff)\xfe\ +\x14\x04#\x04J\x00!\x00/@\x18\x14\x17\x11\x1c\x08\ +\x05\x0c\x00\x06\x0f\x16\x1b\x00\x1cFY\x00\x10\x11\x0cG\ +Y\x11\x1b\x00?+\x00\x18?+\x00\x18??\x11\x12\ +99\x11\x129910\x132\x16\x16\x17\x13\x013\ +\x01\x13\x16\x16327\x15\x06#\x22'\x03\x01#\x01\ +\x03.\x02#\x22\x07'66\xdf?J*\x0e7\x01\ +\xe1k\xfd\xc9E\x0c@;/'5;\xb1\x1a9\xfe\ +\x06w\x02^A\x0b\x19,#&(\x12\x14C\x04J\ ++Oj\xfe<\x02\x9d\xfc\xec\xfd\xf4dN\x0eR\x15\ +\xe6\x01\xd7\xfdC\x036\x02\x00U7\x1c\x11T\x08\x0d\ +\x00\x00\x01\x00\x9a\xfe\x14\x05\x06\x06\x14\x00\x1c\x00 @\ +\x10\x1c\x00\x05\x13\x0f\x0c\x1b\x02\x19\x0d\x19FY\x0a\x0d\ +\x15\x00?3+\x11\x003\x18??3?10\x01\ +\x02\x03$\x00\x113\x10\x02\x04\x07\x03#\x13&&5\ +47\x133\x03\x06\x15\x10\x05\x12\x12\x13\x03\xb6\xedP\ +\x01\x1e\x01\x09f\x95\xfe\xd5\xe0f^f\xb4\xba\x1ec\ +fb\x1f\x01\x1bv\x85B\x06\x14\xfb\xba\xfe\x80\x11\x01\ +\xe1\x01\xff\xfey\xfe.\xe5\x09\xfe\x1c\x01\xe4\x11\xcf\xaf\ +`\x8e\x01\xca\xfe:\x8b]\xfe\xdb\x1e\x02#\x02a\x01\ +B\x00\x01\x00D\xff\xec\x05\x0e\x04?\x00)\x00\x22@\ +\x10(\x11\x11\x00\x1d\x06\x0f\x18\x0d\x00\x0dFY%\x00\ +\x16\x00?2+\x11\x003\x18?3\x129/91\ +0\x05\x22&54\x1273\x06\x02\x15\x14\x1632\ +67\x133\x03\x06\x15\x14\x1632\x12\x114'3\ +\x16\x16\x15\x14\x02\x06#\x22&'\x06\x01R\x82\x8c\x88\ +\x88f\x8d\x87^\x5cV}#H`B\x12TN\x9d\ +\xc3\x1f\x5c\x0e\x17x\xcc\x86X{\x11]\x14\xbe\xae\xc0\ +\x01|\xab\xc4\xfe\x98\xb7\x8a\x8e\x88\x9c\x01L\xfe\xcbZ\ +3TZ\x01u\x01(\xc7\x978\xc8b\xd7\xfe\x99\xb3\ +^T\xb2\xff\xff\x00y\xff\xec\x02\x93\x05\xc1\x02&\x01\ +\x86\x00\x00\x01\x07\x00j\xfe\xcc\x00\x00\x00\x0a\xb4\x02\x01\ +#\x11&\x00+55\xff\xff\x00\x8d\xff\xec\x04%\x05\ +\xc1\x02&\x01\x92\x00\x00\x01\x06\x00j\xf9\x00\x00\x0a\xb4\ +\x02\x01&\x11&\x00+55\xff\xff\x00b\xff\xec\x04\ +\x02\x06\x7f\x02&\x00R\x00\x00\x01\x06\x01T\xf7\x00\x00\ +\x08\xb3\x02$\x11&\x00+5\xff\xff\x00\x8d\xff\xec\x04\ +%\x06\x7f\x02&\x01\x92\x00\x00\x01\x06\x01T\xe8\x00\x00\ +\x08\xb3\x01\x1d\x11&\x00+5\xff\xff\x00D\xff\xec\x05\ +\x0e\x06\x7f\x02&\x01\x96\x00\x00\x01\x07\x01T\x00\x8d\x00\ +\x00\x00\x08\xb3\x013\x11&\x00+5\xff\xff\x00f\x00\ +\x00\x04s\x07\x13\x02&\x00(\x00\x00\x01\x07\x00j\x00\ +B\x01R\x00\x0a\xb4\x02\x01\x1e\x05&\x00+55\x00\ +\x01\x00\xc5\xff\xf2\x04o\x05\xb6\x00\x22\x00+@\x17\x19\ +\x10IY\x19\x19\x15\x12\x12\x18\x14\x15\x14IY\x15\x03\ +\x00\x06IY\x00\x13\x00?+\x00\x18?+\x11\x003\ +\x18?\x129/+10\x05\x22'5\x16\x1632\ +677654&#!\x03#\x01!7!\x07\ +!\x03!2\x16\x15\x14\x07\x07\x06\x06\x02\xdb;F\x0e\ +E.y}\x1b\x10\x0cw\x83\xfe\xd3\xa4f\x01!\xfe\ +\xcd\x14\x03R\x12\xfeEj\x011\xa7\xa3\x0f\x18 \xb0\ +\x0e\x0eb\x03\x0fx\x96Z@Emd\xfc\xf2\x05X\ +^^\xfe\x10\x99\x87KI\x81\xa4\x9d\xff\xff\x00f\x00\ +\x00\x04`\x07s\x02&\x01a\x00\x00\x01\x07\x00v\x00\ +T\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\x00\x01\x00\ +\xaa\xff\xec\x04\xf4\x05\xcb\x00\x1b\x00&@\x14\x03\x06I\ +Y\x03\x03\x10\x17\x17\x00IY\x17\x04\x10\x0bIY\x10\ +\x13\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x01\x22\x00\x03!\x07!\x06\x15\x14\x16327\x15\ +\x06#\x22\x00\x11\x10\x12$32\x17\x07&\x03\xc1\xf1\ +\xfe\xacE\x02\xa4\x12\xfdZ\x11\xdf\xcd\x8c\xa4\x9c\xa0\xfc\ +\xfe\xf4\xca\x01g\xe6\xb1\x82-q\x05m\xfe\xd2\xfe\xf8\ +^Ui\xe2\xf13^1\x01\x1e\x01\x0d\x01\x02\x01\xba\ +\xf8DZ@\x00\xff\xff\x00%\xff\xec\x04\x0c\x05\xcb\x02\ +\x06\x006\x00\x00\xff\xff\xff\xdb\x00\x00\x02\xb2\x05\xb6\x02\ +\x06\x00,\x00\x00\xff\xff\xff\xdb\x00\x00\x02\xfd\x07\x13\x02\ +&\x00,\x00\x00\x01\x07\x00j\xff6\x01R\x00\x0a\xb4\ +\x02\x01\x1e\x05&\x00+55\xff\xff\xfe\xbc\xfe\x98\x01\ +\xf4\x05\xb6\x02\x06\x00-\x00\x00\x00\x02\xff\xac\xff\xe9\x06\ +\x9e\x05\xb6\x00\x1b\x00$\x00,@\x19\x04\x1dIY\x18\ +\x1cIY\x18\x18\x16\x04\x12\x16\x06IY\x16\x03\x0c\x11\ +IY\x0c\x13\x00?+\x00\x18?+\x00\x18?\x129\ +/++10\x01\x14\x04#!\x01!\x07\x02\x02\x06\ +\x06#\x22'5\x163266\x12\x13!\x0332\ +\x16%\x0332654&#\x06\x9e\xfe\xe8\xfb\xfe\ +\x96\x01!\xfe\x8d(\x84\xaar\x90e60-9N\ +mc\xb7\x9a\x02=\x8b\xe8\xbb\xc8\xfd\x83\x87\xef\xcd\xdd\ +\x95\x96\x01\xd1\xdf\xf2\x05X\x89\xfe<\xfe\x04\xc9]\x11\ +`\x10X\xc7\x027\x02\x16\xfdu\xb3Y\xfd\x89\xb8\xb9\ +\x86\x80\x00\x00\x02\x00f\x00\x00\x06\xec\x05\xb6\x00\x12\x00\ +\x1b\x00)@\x15\x13\x06\x0b\x06IY\x0f\x0b\x0b\x04\x0d\ +\x09\x03\x08\x12\x04\x14IY\x04\x12\x00?+\x00\x18?\ +?3\x129/3+\x11\x00310\x01\x14\x04#\ +!\x13!\x03#\x013\x03!\x133\x0332\x16%\ +\x0332654&#\x06\xec\xfe\xe8\xfb\xfe\x96\x97\ +\xfd\x5c\x95g\x016f\x8b\x02\xa4\x89h\x8b\xe7\xba\xca\ +\xfd\x83\x88\xf0\xcc\xde\x93\x98\x01\xd1\xdf\xf2\x02\xcf\xfd1\ +\x05\xb6\xfdw\x02\x89\xfdw\xb5W\xfd\x8b\xb8\xb9\x84\x80\ +\x00\x00\x01\x00\xc5\x00\x00\x04q\x05\xb6\x00\x16\x00#@\ +\x12\x10\x07IY\x10\x10\x0c\x00\x09\x12\x0f\x0b\x0c\x0bI\ +Y\x0c\x03\x00?+\x11\x003\x18?3\x129/+\ +10!\x13654&#!\x03#\x01!7!\ +\x07!\x03! \x11\x14\x06\x03\x03\x9cT\x1cw\x87\xfe\ +\xd3\xa4f\x01!\xfe\xcd\x14\x03R\x12\xfeEj\x011\ +\x01L\x0df\x01{uCsh\xfc\xf2\x05X^^\ +\xfe\x10\xfe\xda)S\xfe:\x00\xff\xff\x00f\x00\x00\x05\ +\x06\x07s\x02&\x01\xb4\x00\x00\x01\x07\x00v\x00\x8d\x01\ +R\x00\x08\xb3\x01\x14\x05&\x00+5\xff\xff\xff\xe9\xff\ +\xec\x055\x07J\x02&\x01\xbd\x00\x00\x01\x07\x026\x00\ +\x8d\x01R\x00\x08\xb3\x01\x18\x05&\x00+5\x00\x01\x00\ +f\xfe\x9c\x05\x5c\x05\xb6\x00\x0b\x00\x19@\x0c\x04\x00\x03\ +\x09\x22\x0b\x02IY\x07\x0b\x12\x00?3+\x00\x18?\ +?310\x013\x01!\x013\x01!\x03#\x13!\ +\x01\x9cd\xfe\xdf\x02\xf6\x01!f\xfe\xcb\xfeXLd\ +N\xfeI\x05\xb6\xfa\xaa\x05V\xfaJ\xfe\x9c\x01d\xff\ +\xff\xff\x91\x00\x00\x03\xd3\x05\xbc\x02\x06\x00$\x00\x00\x00\ +\x02\x00f\x00\x00\x04D\x05\xb6\x00\x0c\x00\x15\x00&@\ +\x14\x09\x0dIY\x09\x09\x04\x05\x05\x08IY\x05\x03\x04\ +\x0eIY\x04\x12\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01\x14\x04#!\x01!\x07!\x033\ +2\x16%\x0332654&#\x03\xe3\xfe\xea\xfc\ +\xfe\x95\x016\x02\xa8\x15\xfd\xc1w\xe7\xbb\xc8\xfd\x83\x87\ +\xf0\xcc\xde\x95\x96\x01\xd1\xde\xf3\x05\xb6^\xfd\xd3\xb3Y\ +\xfd\x89\xb8\xb9\x86\x80\x00\xff\xff\x00f\x00\x00\x04\x9e\x05\ +\xb6\x02\x06\x00%\x00\x00\xff\xff\x00f\x00\x00\x04`\x05\ +\xb6\x02\x06\x01a\x00\x00\x00\x02\xff\x5c\xfe\x9c\x04\xcd\x05\ +\xb6\x00\x0d\x00\x13\x00$@\x12\x02\x06\x22\x0b\x0eIY\ +\x0b\x03\x0d\x11\x07\x04\x07IY\x04\x12\x00?+\x11\x00\ +33\x18?+\x00\x18?310%\x03#\x13!\ +\x03#\x1336\x00\x13!\x01\x03\x02\x00\x07!\x01\x04\ +TbiP\xfc9QeiO\xb2\x01R\x9a\x02\x1b\ +\xfe\xdd\xb0\x92\xfe\xbb\x98\x02\xb9\x01\x0e^\xfe>\x01d\ +\xfe\x9c\x01\xc2\xcf\x02\xb9\x01\xd0\xfa\xa8\x04\xfa\xfeM\xfd\ +k\xb2\x04\xfa\x00\xff\xff\x00f\x00\x00\x04s\x05\xb6\x02\ +\x06\x00(\x00\x00\x00\x01\xff\xa8\x00\x00\x06\x96\x05\xb6\x00\ +\x11\x00\x1e@\x10\x00\x03\x06\x09\x0c\x0f\x06\x11\x07\x04\x01\ +\x03\x0e\x0b\x11\x12\x00?33?33\x12\x1791\ +0\x01\x013\x01\x133\x03\x013\x01\x01#\x01\x03#\ +\x13\x01#\x02\x81\xfeX}\x01\x9e\x93g\x98\x02\xb4\x8c\ +\xfd3\x01\xb2{\xfeR\x9af\x9e\xfdE\x8d\x02\xf8\x02\ +\xbe\xfd@\x02\xc0\xfd>\x02\xc2\xfd+\xfd\x1f\x02\xe1\xfd\ +\x1f\x02\xe3\xfd\x1d\x00\x01\xff\xe1\xff\xec\x03\xdb\x05\xcb\x00\ +&\x00-@\x17\x03\x16\x17\x17\x16IY\x17\x17\x0b$\ +$\x1fJY$\x04\x0b\x10IY\x0b\x13\x00?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x00910\ +\x01\x14\x06\x07\x15\x16\x16\x15\x14\x06\x06#\x22'5\x16\ +3265\x10!#7326654&#\ +\x22\x07'632\x16\x03\xdb\xb6\xb0\x82\x8a\x87\xef\xa5\ +\xd3\xb2\xb7\xdb\xcc\xdc\xfe\x8b\xb6\x12\xb2\x83\xd4h\x86|\ +\xa8\xac6\xbe\xd8\xa5\xb9\x04\x91\xa0\xcf*\x04\x17\xaf\x8c\ +\x82\xcdgOuj\xbb\xa7\x01\x1f`Z\x9dir|\ +wL\x81\xa4\x00\x00\x01\x00f\x00\x00\x05b\x05\xb6\x00\ +\x0d\x00\x12\xb7\x0b\x05\x00\x03\x04\x08\x0d\x12\x00?33\ +?2210\x013\x03\x02\x07\x013\x01#\x12\x12\ +7\x01#\x01\x9cf\xbaO\x10\x04\x0bn\xfe\xcbdx\ +\x81#\xfb\xe6e\x05\xb6\xfc\x92\xfe\xa6<\x05\x04\xfaJ\ +\x029\x02f|\xfa\xe5\xff\xff\x00f\x00\x00\x05b\x07\ +J\x02&\x01\xb2\x00\x00\x01\x07\x026\x01\x0a\x01R\x00\ +\x08\xb3\x01\x11\x05&\x00+5\x00\x01\x00f\x00\x00\x05\ +\x06\x05\xb6\x00\x0a\x00\x17@\x0b\x02\x07\x0a\x03\x04\x08\x05\ +\x03\x01\x04\x12\x00?3?3\x12\x17910!#\ +\x01\x03#\x013\x03\x013\x01\x04\x10\x81\xfd\xd5\x97g\ +\x016f\x9e\x03\x13\x8f\xfc\xd7\x02\xd9\xfd'\x05\xb6\xfd\ +)\x02\xd7\xfd#\x00\x01\xff\xac\xff\xe9\x04\xfa\x05\xb6\x00\ +\x14\x00\x1c@\x0e\x13\x12\x10\x00IY\x10\x03\x06\x0bI\ +Y\x06\x13\x00?+\x00\x18?+\x00\x18?10\x01\ +\x07\x02\x02\x06\x06#\x22'5\x163266\x12\x13\ +!\x01#\x01\x02\xcf(\x84\xaar\x90e60-9\ +Nmc\xb7\x9a\x02y\xfe\xcbe\x01!\x05X\x89\xfe\ +<\xfe\x04\xc9]\x11`\x10X\xc7\x027\x02\x16\xfaJ\ +\x05X\x00\xff\xff\x00m\x00\x00\x06w\x05\xb6\x02\x06\x00\ +0\x00\x00\xff\xff\x00f\x00\x00\x05\x5c\x05\xb6\x02\x06\x00\ ++\x00\x00\xff\xff\x00\xac\xff\xec\x05{\x05\xcb\x02\x06\x00\ +2\x00\x00\xff\xff\x00f\x00\x00\x05\x5c\x05\xb6\x02\x06\x01\ +n\x00\x00\xff\xff\x00f\x00\x00\x04y\x05\xb6\x02\x06\x00\ +3\x00\x00\xff\xff\x00\xaa\xff\xec\x04\xf4\x05\xcb\x02\x06\x00\ +&\x00\x00\xff\xff\x00\xc1\x00\x00\x04\xa2\x05\xb6\x02\x06\x00\ +7\x00\x00\x00\x01\xff\xe9\xff\xec\x055\x05\xb6\x00\x14\x00\ +\x1b@\x0d\x08\x0d\x00\x09\x00\x05IY\x00\x13\x10\x09\x03\ +\x00?3?+\x11\x12\x009910\x17\x22'5\ +\x163267\x013\x13\x16\x1366\x013\x01\x06\ +\x06\x85]?C_o\xb8u\xfe\xc2i\xc2\x0dL!\ +o\x01\xc4t\xfd-p\xdf\x14\x1eo%\x8f\xc1\x04\x12\ +\xfdu)\xfe\xea=\xbe\x02\xcf\xfb\x8c\xb4\xa2\xff\xff\x00\ +\x9c\xff\xec\x05q\x05\xcb\x02\x06\x01s\x00\x00\xff\xff\xff\ +y\x00\x00\x04}\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x00\ +f\xfe\x9c\x05\x5c\x05\xb6\x00\x0b\x00\x1b@\x0d\x00\x08\x03\ +\x05\x22\x02\x0a\x07\x0aIY\x07\x12\x00?+\x11\x003\ +\x18??310\x013\x013\x03#\x13!\x013\ +\x01!\x04\xf8d\xfe\xdf\xa8bhO\xfb\xfe\x016d\ +\xfe\xdf\x02\xf6\x05\xb6\xfa\xa8\xfe>\x01d\x05\xb6\xfa\xa8\ +\x00\x00\x01\x00\xcd\x00\x00\x04\xae\x05\xb6\x00\x15\x00\x1d@\ +\x0e\x01\x03\x09\x03\x10IY\x03\x03\x13\x09\x03\x00\x12\x00\ +??39/+\x11\x12\x00910!\x13\x06#\ +\x22&547\x133\x03\x06\x15\x14\x16327\x13\ +3\x01\x03\x14\x84\xdb\xbd\x92\xa1\x16iff\x19ri\ +\xc3\xd9\xa0d\xfe\xcb\x02m[\x8b\x84@d\x01\xf1\xfe\ +\x1dt8\x5c^Z\x02\xef\xfaJ\x00\x00\x01\x00f\x00\ +\x00\x07\x7f\x05\xb6\x00\x0b\x00\x1a@\x0c\x09\x05\x01\x03\x07\ +\x03\x00\x03IY\x00\x12\x00?+\x11\x003\x18?3\ +3103\x013\x01!\x013\x01!\x013\x01f\ +\x016d\xfe\xdf\x02X\x01#d\xfe\xe0\x02Z\x01#\ +d\xfe\xcb\x05\xb6\xfa\xa8\x05X\xfa\xa8\x05X\xfaJ\x00\ +\x01\x00f\xfe\x9c\x07\x7f\x05\xb6\x00\x0f\x00\x1f@\x0f\x0d\ +\x09\x05\x03\x02\x22\x0f\x0b\x07\x04\x07IY\x04\x12\x00?\ ++\x11\x0033\x18??3310%\x03#\x13\ +!\x013\x01!\x013\x01!\x013\x01\x07\x06bi\ +P\xf9\xdb\x016d\xfe\xdf\x02X\x01#d\xfe\xe0\x02\ +Z\x01#d\xfe\xdf^\xfe>\x01d\x05\xb6\xfa\xa8\x05\ +X\xfa\xa8\x05X\xfa\xa8\x00\x02\x00\xc1\x00\x00\x04s\x05\ +\xb6\x00\x0c\x00\x15\x00&@\x14\x09\x0dIY\x09\x09\x04\ +\x07\x07\x06IY\x07\x03\x04\x0eIY\x04\x12\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x01\x14\x04\ +#!\x01!7!\x0332\x16%\x033265\ +4&#\x04s\xfe\xe8\xfb\xfe\x96\x01!\xfe\xaa\x14\x01\ +\xbe\x8b\xe8\xbb\xc8\xfd\x83\x87\xef\xcd\xdd\x95\x96\x01\xd1\xdf\ +\xf2\x05X^\xfdu\xb3Y\xfd\x89\xb8\xb9\x86\x80\x00\x00\ +\x03\x00f\x00\x00\x06\x10\x05\xb6\x00\x0a\x00\x13\x00\x17\x00\ +\x22@\x12\x07\x0bIY\x07\x07\x04\x16\x05\x03\x15\x12\x04\ +\x0cIY\x04\x12\x00?+\x00\x18??3\x129/\ ++10\x01\x14\x04#!\x013\x0332\x16%\x03\ +32654&#\x01#\x013\x03\xe3\xfe\xea\xfc\ +\xfe\x95\x016h\x8b\xe7\xbb\xc8\xfd\x83\x87\xf0\xcc\xde\x95\ +\x96\x02\x8df\x015f\x01\xd1\xde\xf3\x05\xb6\xfdu\xb3\ +Y\xfd\x89\xb8\xb9\x86\x80\xfd/\x05\xb6\x00\x02\x00f\x00\ +\x00\x03\xe3\x05\xb6\x00\x0a\x00\x13\x00\x1d@\x0f\x07\x0bI\ +Y\x07\x07\x04\x05\x03\x04\x0cIY\x04\x12\x00?+\x00\ +\x18?\x129/+10\x01\x14\x04#!\x013\x03\ +32\x16%\x0332654&#\x03\xe3\xfe\xea\ +\xfc\xfe\x95\x016h\x8b\xe7\xbb\xc8\xfd\x83\x87\xf0\xcc\xde\ +\x95\x96\x01\xd1\xde\xf3\x05\xb6\xfdu\xb3Y\xfd\x89\xb8\xb9\ +\x86\x80\x00\x00\x01\x00\x0e\xff\xec\x04N\x05\xcb\x00\x1b\x00\ +&@\x14\x05\x04IY\x05\x05\x17\x10\x10\x0aIY\x10\ +\x04\x17\x00IY\x17\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10%2\x00\x13!7!74\ +&#\x22\x07'6632\x00\x11\x10\x02\x04#\x22\ +'5\x16\x01m\xfe\x0191\xfdf\x11\x02\x93\x02\xd3\ +\xcc\x80\xb2\x1ar\xa3E\xfa\x01\x04\xbf\xfe\xb8\xda\xce\x91\ +\xb8H\x01P\x01E`H\xef\xf9@^&\x1a\xfe\xd7\ +\xfe\xed\xfe\xf0\xfeH\xdbKm\x5c\x00\x00\x02\x00f\xff\ +\xec\x07\xac\x05\xcb\x00\x16\x00$\x00*@\x17\x0f\x0aI\ +Y\x0f\x0f\x0c\x0d\x03\x0c\x12\x14\x17IY\x14\x04\x04\x1e\ +IY\x04\x13\x00?+\x00\x18?+\x00\x18??\x12\ +9/+10\x01\x14\x02\x04#\x22\x00\x1147!\ +\x03#\x013\x03!6\x12$32\x00%\x22\x04\x02\ +\x15\x14\x1232$\x1254&\x07\xac\xb0\xfe\xc0\xd7\ +\xfa\xfe\xf2\x08\xfe}\x95g\x016f\x8b\x01\x7f(\xc1\ +\x01 \xaf\xf7\x01\x07\xfd\xf4\xad\xfe\xf3\xa0\xdb\xd1\xa9\x01\ +\x06\x9e\xd1\x03\x8f\xf5\xfe?\xed\x01*\x01\x19`@\xfd\ +1\x05\xb6\xfdw\xcb\x01/\xa4\xfe\xd7\xcb\xc9\xfes\xda\ +\xf5\xff\x00\xc5\x01\x93\xe5\xf0\xf8\x00\x02\xff\xcd\x00\x00\x04\ +m\x05\xb6\x00\x0d\x00\x16\x00&@\x13\x03\x09\x00\x15\x00\ +IY\x15\x15\x09\x0c\x02\x12\x09\x0fIY\x09\x03\x00?\ ++\x00\x18?3\x129/+\x11\x12\x00910\x01\ +\x01#\x01&&54$!!\x01#\x13\x13#\x22\ +\x06\x15\x14\x1633\x02L\xfd\xfe}\x02\x14ix\x01\ +\x1e\x01\x03\x01L\xfe\xcaf\x85\x9e\xc5\xe5\xe4\xa4\x94\xcc\ +\x02{\xfd\x85\x02\x96(\xb9w\xdb\xed\xfaJ\x02{\x02\ +\xdf\xb7\xaf\x85\x9a\xff\xff\x00f\xff\xec\x047\x04P\x02\ +\x06\x00D\x00\x00\x00\x02\x00b\xff\xec\x04T\x06\x12\x00\ +\x1a\x00*\x00$@\x12\x0e\x18\x07\x11\x22FY\x11\x11\ +\x18\x07\x00\x18\x1bFY\x18\x16\x00?+\x00\x18?\x12\ +9/+\x11\x12\x00910\x134\x12\x1276$\ +7\x17\x07\x04\x07\x06\x02\x073632\x16\x15\x14\x02\ +\x06#\x22&\x0526654&#\x22\x06\x07\x06\ +\x06\x15\x14\x16b\x87\xde\x8d]\x01LK\x0c?\xfe\xce\ +{\x85\xc57\x05\xb2\xdb\x96\xa7\x7f\xdc\x94\xac\xb9\x01s\ +t\xac[}me\xbfi\x06\x0c\x83\x01\xb2\xf0\x01\xc3\ +\x01\x13.\x1eC\x0bV\x0c9)/\xfe\xdf\xea\xda\xc6\ +\xbb\xbc\xfe\xd0\x95\xea\x94\x8a\xf6\x9e\x9e\x98t\x86#\x90\ +/\xc0\xb8\x00\x03\x00h\xff\xec\x03\xd9\x04P\x00\x14\x00\ +\x1e\x00(\x00-@\x17\x07\x15\x22\x22\x15FY\x22\x22\ +\x0e\x00\x00\x1fFY\x00\x10\x0e\x19GY\x0e\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x012\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06\x06\ +#\x22&54\x12$\x01\x07\x14\x1632654\ +!\x13\x22\x06\x0732654&\x02\xa2\x94\xa3\x92\ +\x86hue\xbf\x84\xc2\xcc\x92\x01\x05\xfe\xce\x02\xa1\x9a\ +\x90\xa1\xfe\xf2q\xa6\xf8'\xf0\xd5\xd9p\x04P\x8d}\ +w\x95\x1d\x04\x11w\x5c^\x96U\xe5\xd5\xb9\x01=\xb4\ +\xfd\x97I\xa9\xaf|k\xba\x02\x13\xf3\xc8\x82zXg\ +\x00\x00\x01\x00N\xff\xec\x03\x5c\x04P\x00(\x00#@\ +\x13\x1a\x0e\x22\x07\x04\x17\x04\x04%FY\x04\x10\x17\x11\ +FY\x17\x16\x00?+\x00\x18?+\x11\x12\x00\x179\ +10\x13>\x0232\x16\x15\x14\x06\x07\x0e\x02\x15\x14\ +\x16327\x15\x06\x06#\x22&54667>\ +\x0254&#\x22\x06\x07\xe7ydY)\x88\x8e\x99\ +\xbf\x98};nk\xa4\xa4B\xa6l\x92\xa1G\x92\x9a\ +\x94n3b[:\xa6U\x04\x06*\x16\x0aulo\ +\x9cE8N`CW]IZ\x1a+\x89}R}\ +e<;DN3KK'!\x00\x00\x02\x00f\xff\ +\xec\x04\x08\x06)\x00\x1d\x00(\x00-@\x17\x0e\x05\x0c\ +\x0c#FY\x0c\x0c\x05\x1b\x1b\x14GY\x1b\x01\x05\x1e\ +GY\x05\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x01\x14\x02\x02\x06#\x22&\ +54\x12632\x17365\x10\x02#\x22\x06\x07\ +'6632\x12\x012\x00\x13\x02#\x22\x06\x02\x15\ +\x10\x04\x08f\xad\xdc\x7f\x93\xa1\x94\xf4\x93\xd9B\x06\x04\ +\x91\x925}%'4\x90D\xc2\xb9\xfd\xa2\xa1\x01\x03\ +;F\xc6t\xc9s\x03\xcf\xb5\xfez\xfe\xe4\x8c\xc8\xae\ +\xb8\x01V\xbd\xd1\x1cK\x01\x0a\x01\x02'\x17R\x1e(\ +\xfe\xd8\xfbE\x01\x5c\x01+\x01\x0a\xaf\xfe\xe1\x9c\xfe\xd9\ +\x00\xff\xff\x00f\xff\xec\x03}\x04P\x02\x06\x00H\x00\ +\x00\x00\x01\xff\xcd\xff\xec\x06{\x04P\x00;\x00=@\ + \x1b\x1f8\x1fFY\x0088\x1d:\x0f\x1d\x15\x0a\ +/4/GY\x054\x10\x11(#(GY\x16#\ +\x16\x00?3+\x11\x003\x18?3+\x11\x003\x18\ +??\x129/3+\x11\x00310\x013>\x02\ +32\x17\x07&#\x22\x06\x02\x15\x14\x16327\x15\ +\x06# \x1147#\x03#\x13#\x0e\x02#\x22'\ +7\x16326\x1254&#\x22\x07563 \ +\x11\x14\x073\x133\x03^\xa2\x1c\x89\xcc\x83M:\x13\ +9Fq\xbbqv}5\x0232\x17\x02\xd5`\xd7&\ +$\x5cxhGVn\x84`%\x18\x1d\x1eJ`]\ +KT|\xa2wQ[\x03\xee\x06O\xbd\xd4\xff\xc6Y\ +\x08Z\x08L\xba\xdb\xf9\xc7W\x11\x00\x00\x01\x00-\x00\ +\x00\x04\xf2\x04?\x00\x15\x00\x1f@\x0e\x10\x10\x0c\x0f\x0b\ +\x01\x09\x13\x0c\x0f\x00\x05\x0b\x15\x00?33?33\ +3\x113\x129/10!\x13\x06\x06\x01#\x03&\ +&'\x03#\x133\x13\x16\x1566\x013\x03\x03\xb0\ +\xc5\x11,\xfe\x03C\x92\x06\x17\x01\xc1Z\xe7e\x99\x1b\ +\x1aI\x01\xedu\xea\x03\xa2 L\xfc\xca\x02\xd3\x1d\x8c\ + \xfcd\x04?\xfc\xe2\x9e\x0c7|\x03\x15\xfb\xc1\x00\ +\x01\x00J\x00\x00\x04m\x04?\x00\x0b\x00\x1a@\x0d\x01\ +\x08GY\x01\x01\x0a\x03\x0b\x0f\x06\x0a\x15\x00?3?\ +3\x129/+10\x01\x03!\x133\x03#\x13!\ +\x03#\x13\x01\x93d\x02qhe\xe8fn\xfd\x90o\ +d\xe9\x04?\xfe!\x01\xdf\xfb\xc1\x02\x04\xfd\xfc\x04?\ +\x00\xff\xff\x00b\xff\xec\x04\x02\x04T\x02\x06\x00R\x00\ +\x00\xff\xff\x00L\x00\x00\x04\x0a\x04P\x02\x06\x00Q\x00\ +\x00\xff\xff\xff\xdf\xfe\x14\x04\x1b\x04T\x00\x06\x00S\x00\ +\x00\xff\xff\x00f\xff\xec\x03\x89\x04P\x02\x06\x00F\x00\ +\x00\xff\xff\x00H\x00\x00\x06^\x04P\x02\x06\x00P\x00\ +\x00\xff\xff\xff'\xfe\x14\x03\xf0\x04?\x02\x06\x00\x5c\x00\ +\x00\x00\x03\x00b\xfe\x14\x04\x85\x06\x14\x00\x12\x00\x1a\x00\ +\x22\x00-@\x17\x11\x00\x08\x1b\x10\x00\x22\x17\x00\x17G\ +Y\x00\x0f\x1b\x16\x09\x16FY\x06\x09\x15\x00?3+\ +\x11\x003\x18?+\x11\x003\x113\x18??10\ +\x01\x04\x11\x14\x02\x04#\x03#\x13&&54\x12$\ +7\x133\x01\x14\x16\x17\x13\x06\x06\x02\x0126\x125\ +4&'\x03\x12\x01s\x9a\xfe\xf2\xb4kZi\xa9\xc2\ +\x91\x01\x0f\xb4c^\xfdR\x8d\x89\xc5\x8f\xd2z\x01r\ +\x8e\xd7\x7f\x92\x8d\x04B'\xfer\xb9\xfe\xcc\xa0\xfe\x14\ +\x01\xec\x0e\xe6\xc2\xb9\x01(\xa7\x01\x01\xd5\xfb\xad\xa4\xbc\ +\x0b\x03\x91\x03\x83\xfe\xfa\xfd\xfb\x84\x01\x0f\x9c\xa5\xb6\x07\ +\x00\xff\xff\xff\xb8\x00\x00\x03\xba\x04?\x02\x06\x00[\x00\ +\x00\x00\x01\x00m\xfe\x93\x04+\x04?\x00$\x00!@\ +\x10\x1b\x1e\x0b$\x0f\x15\x22\x11\x06\x1e\x06FY\x16\x1e\ +\x16\x00?3+\x11\x003\x18??3\x12910\ +\x01\x03\x06\x15\x14\x1632667\x133\x03\x06\x15\ +\x14327\x03#\x13&&57#\x06\x06#\x22\ +&547\x13\x01}\x98\x16_[n\xc3\x85!i\ +b\xa4\x16T\x17(dePC6\x02\x06T\xcfr\ +\x85\x87\x16\x96\x04?\xfdFg7JW\x83\xf3\x9e\x01\ +\xe5\xfd\x03hBY\x07\xfeM\x01_\x0dSN3q\ +r|w\x02\x01\xb8\xb2\xbd\x8f\xfd\xa98\x8005\ +\x829\xb0\xdf)\xfd\xf4\x12\x02\x04\x05\x88\x8b0dl\ +\x1bXKU\x04T\xd3\xc5\xd0\xfe\xad\xad\x18\x15f\x1b\ +\x1e\xe6\xe2X!%\xac\xa6\x16*T#\x15\x0a\x00\x00\ +\x02\x00J\xff\xec\x05\xb6\x04T\x00\x15\x00#\x00*@\ +\x17\x12\x0dGY\x12\x12\x0f\x10\x0f\x0f\x15\x00\x16FY\ +\x00\x10\x07\x1dFY\x07\x16\x00?+\x00\x18?+\x00\ +\x18??\x129/+10\x012\x16\x15\x14\x02\x06\ +#\x22&547!\x03#\x133\x03!6\x00\x17\ +\x22\x06\x02\x15\x14\x16326\x1254&\x04H\xae\ +\xc0\x8d\xf0\xa1\xb6\xb7\x06\xfe\xecod\xe9`d\x01\x13\ +3\x01\x11\xb9z\xc1s\x88\x89}\xc1p\x8b\x04T\xd3\ +\xc5\xcb\xfe\xaa\xaf\xd8\xcf6;\xfd\xfc\x04?\xfe!\xe7\ +\x01\x0dV\x9a\xfe\xda\xa6\xb3\xa3\x99\x012\xb1\x9e\xa2\x00\ +\x02\xff\xdb\xff\xf8\x03\xc3\x04?\x00\x1e\x00&\x00.@\ +\x18\x13\x00$$\x00HY$$\x1a\x1d\x15\x1a\x1fH\ +Y\x1a\x0f\x08\x0dFY\x08\x15\x00?+\x00\x18?+\ +\x00\x18?\x129/+\x11\x12\x00910\x01\x22\x06\ +\x06\x07\x0e\x02#\x22'5\x163267667\ +&&54663!\x03#\x13\x03\x22\x06\x15\x14\ +!3\x13\x02RSiL83AR>!\x12\x0c\ +\x1b\x033\ +2\x17\x13\x22\x07\x06\x15\x1432654&\x035\ +\x95Y\xa7\xa5\xd9\xb3\x9c\xa3\x07\x0cj\x15\x1ew\x9eZ\ +Tn\x86` \x1d \x1bKa]I*Pi\x91\ +kAOzsx\x1d\xdf\x86\x9bw\x02T\x16\x89\x8f\ +\xa0\xc6\xa1\x94\x1aLO\x02\x1a\x04\xd0\xfe\xf0\xfe\xc8X\ +\x08Z\x08M\xbd\xd7z\xc6\x8bL\x11\xfd\xdd\x16\x84K\ +\xe9\x8dwee\x00\x02\x00J\xff\xec\x05\xd5\x04?\x00\ +\x16\x00$\x002@\x1b\x00\x08\x03\x03\x17FY\x13\x0e\ +GY\x03\x13\x03\x13\x10\x15\x11\x0f\x10\x15\x08\x1fGY\ +\x08\x16\x00?+\x00\x18??3\x1299//+\ ++\x11\x12\x00910\x01763 \x11\x14\x06#\ +\x22&547!\x03#\x133\x03!\x133\x13\x22\ +\x06\x07\x06\x15\x14\x1632654&\x03s8u\ +a\x01T\xdf\xc1\xa3\xad\x19\xfe\x1fod\xe9`d\x01\ +\xe3id\x90N\x8b6\x18q\x84\x8f\xa3\x81\x02L\x0a\ +\x14\xfe\xe8\xa2\xc4\x9e\x99b\x7f\xfd\xfc\x04?\xfe!\x01\ +\xdf\xfd\xd5\x15\x09xKzs\x8azhb\xff\xff\x00\ +L\x00\x00\x04\x0a\x06\x14\x02\x06\x00\xe9\x00\x00\xff\xff\x00\ +H\x00\x00\x03\xf1\x06!\x02&\x01\xd4\x00\x00\x01\x06\x00\ +v\x0c\x00\x00\x08\xb3\x01\x14\x11&\x00+5\xff\xff\xff\ +'\xfe\x14\x03\xf0\x05\xf8\x02&\x00\x5c\x00\x00\x01\x06\x02\ +6\xca\x00\x00\x08\xb3\x01\x1b\x11&\x00+5\x00\x02\x00\ +m\xfe\x14\x04+\x04?\x00\x04\x00\x1d\x00(@\x14\x15\ +\x17\x1d\x00\x00\x03\x17\x10\x1d\x0f\x13\x15\x03\x1b\x17\x0bF\ +Y\x17\x16\x00?+\x00\x18???3\x11\x129/\ +\x11\x12910\x053\x03#\x13\x03\x03\x06\x15\x14\x16\ +32667\x133\x03#7#\x06#\x22&5\ +47\x13\x01\xf4 ZZX;\x98\x16_[n\xc3\ +\x85!ib\xe7P\x1c\x06\xa7\xec\x83\x87\x16\x96V\xfe\ +j\x01\x86\x04\xa5\xfdFj4JW\x83\xf3\x9e\x01\xe5\ +\xfb\xc1\xcd\xdd|w\x08\x19\x03\x06\x02\x18\x00?\ +??3\xc422\x113\x113\x113?3\xc42\ +10\x01\x01#\x01\x13\x14\x02\x06#\x22&54\x12\ +632\x16'\x22\x06\x02\x15\x14\x1632\x1254\ +&\x01\x14\x02\x06#\x22&54\x12632\x07\x22\ +\x06\x02\x15\x14\x16326\x1254&\x01\x14\x02\x06\ +#\x22&54\x12632\x16'\x22\x06\x02\x15\x14\ +\x16326\x1254&\x05\xb2\xfb\x8dj\x04o\xac\ +d\xacopxg\xabmyo\xecO\x85QRH\ +\x82\x9fH\xfd\xa6d\xacopxg\xabm\xe8\xecN\ +\x84SRHT\x81LH\x06Pd\xacooxg\ +\xabmxo\xecO\x84QQHT\x81LI\x05\xb6\ +\xfaJ\x05\xb6\xfc\xae\xaf\xfe\xd0\x9c\x97\x94\x9e\x010\x9d\ +\x8fE\x90\xfe\xfc\x86tt\x01M\xdcml\x01y\xaf\ +\xfe\xd0\x9c\x97\x94\x9e\x010\x9dJ\x8c\xfe\xfb\x8ast\ +\x90\x01\x08\x91ml\xfc\xe5\xaf\xfe\xd0\x9c\x97\x94\x9e\x01\ +0\x9d\x8fE\x8f\xfe\xfd\x88tt\x90\x01\x08\x91pi\ +\x00\xff\xff\x00\xfe\x03\xa6\x01\xcd\x05\xb6\x02\x06\x00\x0a\x00\ +\x00\xff\xff\x00\xf8\x03\xa6\x03\x10\x05\xb6\x02\x06\x00\x05\x00\ +\x00\x00\x01\x00V\x00{\x01\xfc\x03\xa4\x00\x06\x00\x11\xb5\ +\x04\x00 \x06\x05\x02\x00\x19/33\x1a\xcd\xcd10\ +\x01\x17\x01\x13\x07\x037\x01\xc39\xfe\xc2\xd5?\xfe\x02\ +\x03\xa41\xfe\xb0\xfe\x7f'\x01\xa2\x1a\x00\x01\x00%\x00\ +{\x01\xcb\x03\xa4\x00\x06\x00\x11\xb5\x04\x00 \x06\x05\x02\ +\x00\x19/33\x1a\xcd\xcd107'\x01\x037\x13\ +\x07^9\x01=\xd5@\xfe\x02{1\x01P\x01\x81'\ +\xfe^\x1b\xff\xff\x002\xff\xf0\x03\xa8\x05\xb6\x00'\x00\ +\x04\x01\xac\x00\x00\x00\x06\x00\x04\xe2\x00\x00\x01\xfe1\x00\ +\x00\x02\xdb\x05\xb6\x00\x03\x00\x0a\xb3\x03\x03\x02\x12\x00?\ +?10\x01\x01#\x01\x02\xdb\xfb\xc1k\x04>\x05\xb6\ +\xfaJ\x05\xb6\x00\x00\x01\x00\xbc\x033\x03\x00\x05\xc7\x00\ +\x16\x00\x1c@\x0d\x0d\x11\x00\x0a@\x0b\x1e\x11\x05TY\ +\x11\x1f\x00?+\x00\x18?\x1a\xcd2\x11910\x01\ +\x13654#\x22\x06\x07\x03#\x133\x07366\ +32\x15\x14\x07\x03\x02HV\x0eTY\x97\x1c\xfew\x00\ +\x01\x00?\x00\x00\x04\x89\x05\xb6\x00\x11\x00/@\x19\x05\ +\x08LY\x0c\x10\x11\x10LY\x09\x11\x05\x11\x05\x11\x01\ +\x0e\x18\x01\x04LY\x01\x06\x00?+\x00\x18?\x129\ +9//\x113+\x11\x003+10\x01\x13!\x07\ +!\x03!\x07!\x03!\x07!\x03#\x13#7\x01\x0c\ +\xe2\x02\x9b\x14\xfd\xcd\x7f\x02$\x14\xfd\xdb;\x015\x15\ +\xfe\xcb?g@\xb9\x15\x01\x8f\x04'^\xfd\xb0^\xfe\ +\xe5^\xfe\xcf\x011^\x00\x01\xff\xfc\x00\x00\x04\xa8\x05\ +\xc7\x00&\x00T@/\x0d!\x22!MY\x0a\x0f\x22\ +\x1f\x22?\x22O\x22\x04\x09\x03\x22\x22\x17\x00\x11\x1d\x1e\ +\x1dMY\x0e\x1e\x1e\x17\x00\x00\x06KY\x00\x07\x18\x14\ +\x17\x14LY\x17\x18\x00?+\x11\x003\x18?+\x11\ +\x12\x009\x18/3+\x11\x003\x11\x129\x18/_\ +^]3+\x11\x00310\x012\x17\x07'&#\ +\x22\x06\x07\x07!\x07!\x07!\x07!\x07\x06\x07!\x07\ +!76677#737#73766\ +\x03o\xaa\x8f'6l{\x86\xad\x1f+\x01\x9a\x12\xfe\ +h/\x01\x9e\x13\xfec\x171\x8b\x02\xf7\x14\xfcV\x10\ +_\x90\x22\x14\xbe\x10\xc11\xc7\x10\xc7-)\xe4\x05\xc7\ +NT\x1a2\x95\x92\xc5R\xe7Rd\xdfY^T\x0b\ +\xa9\x96\x5cR\xe7R\xcf\xbb\xb8\x00\x03\x00=\xff\xee\x05\ +o\x05\xb6\x00\x09\x00\x11\x00,\x00F@$**\x06\ +),'\x14,\x14MY,,\x05\x06\x0a\x03LY\ +\x0a\x0a\x06\x05\x18\x06\x11LY\x06\x06!\x1aKY!\ +\x19\x00?+\x00\x18?+\x00\x18?\x129/+\x11\ +\x12\x009\x18/+\x11\x003\x113\x129\x18/1\ +0\x01\x10!#\x03#\x0132\x16\x013265\ +\x10!#\x01\x07#\x03\x06\x15\x14\x163267\x15\ +\x06\x06#\x22547\x13#?\x023\x03\x03\xa6\xfd\ +\x9e\x1f\x81g\x016\x91\xca\xd8\xfd\x8f\x1b\xfc\xef\xfe\xb5\ +)\x03\xa8\x13\xf2S\x174A.;\x1a\x1dE4\xc4\ +\x1cN\x8d\x0e\x90`77\x04N\xfe\x0c\xfd\xa6\x05\xb6\ +\xb9\xfd\xb9\xc1\xd1\x01\x12\xfd\xf0R\xfe}g=BI\ +\x12\x08V\x08\x14\xd5N\x80\x01gC\x11\xfe\xff\x00\x00\ +\x01\x00P\xff\xec\x05\x02\x05\xcb\x00&\x00L@)\x06\ +\x1d\x1e\x1dMY\x03\x0f\x1e\x1f\x1e\x02\x09\x03\x1e\x1e\x19\ +\x22\x0b\x18\x19\x18MY\x08\x19\x19\x13\x22\x22\x00LY\ +\x22\x07\x13\x0eLY\x13\x19\x00?+\x00\x18?+\x11\ +\x12\x009\x18/3+\x11\x003\x11\x129\x18/_\ +^]3+\x11\x00310\x01\x22\x04\x07!\x07!\ +\x06\x07!\x07!\x14\x16327\x15\x06#\x22\x025\ +5#7367#73\x12\x0032\x17\x07&\ +\x03\xdf\xba\xfe\xdfR\x01\xc9\x15\xfe4\x1e\x09\x01\xba\x14\ +\xfeX\xb2\xb0s\x89\x81\x8d\xd1\xe8\xb8\x10\xac\x05\x1e\xaa\ +\x13\xae_\x01^\xe0\xa6y5f\x05m\xf1\xe2Rb\ +wR\xf3\xe29^7\x01\x17\xff\x1bRetR\x01\ +\x11\x01 ZRN\x00\x00\x04\x00\xfa\x00\x00\x05\xac\x05\ +\xba\x00\x03\x00\x19\x00'\x003\x00\x1d@\x0e+\x1a1\ +!\x18\x15\x04\x10\x0b\x06\x03\x06\x02\x18\x00???3\ +\xcc2?3\xc4210\x01\x01#\x01\x01\x22&5\ +46632\x17\x07&#\x22\x06\x15\x14327\ +\x15\x06\x052\x16\x15\x14\x06\x06#\x22&5466\ +\x174&#\x22\x06\x06\x15\x14326\x05\xac\xfb\xb8\ +j\x04H\xfc\xfbq\x80Y\x9c]RO\x1aHCg\ +\x8b\x97QUJ\x01\xeaw{N\x91au|R\x91\ +\xf2OGFf7\x9bey\x05\xb6\xfaJ\x05\xb6\xfd\ +uz~n\xbdl\x1cP\x1c\xbc\x87\xac'R%\x9e\ +\x84vp\xbai\x85wn\xbbh\xf3QTV\x97X\ +\xae\xb8\x00\x00\x02\x00s\xff\xee\x03m\x05\xcb\x00\x1c\x00\ +&\x00)@\x12$\x0f \x0d\x0d\x0a\x19\x0c\x13\x02\x0c\ +\x02\x0c\x13\x00\x06 \x13\x00/3/3\x1199/\ +/\x11\x12992\x11\x129910%273\ +\x06\x06#\x22&5\x11\x06\x07567\x11463\ +2\x16\x15\x14\x02\x07\x11\x14\x16\x134&#\x22\x06\x15\ +\x1166\x02Z\xab\x1aN\x05\x9b\x7f\x8f\x86h^j\ +\x5c}st\x82\xc6\xbdX\xcdQGID\x98\x8dH\ +\xe5\x92\xad\xa5\xa4\x01\x1d+\x15T\x1c&\x01\xfa\x90\x97\ +\x99\x8c\xbc\xfe\xe3V\xfe\xd3\x86|\x04\x5cij`s\ +\xfe1M\xe2\x00\x00\x04\x00N\x00\x00\x07D\x05\xb6\x00\ +\x0b\x00\x0f\x00\x1c\x00(\x001@\x19\x09\x06\x02\x07 \ +\x10\x10\x07&\x0f\x17\x1f\x17\x02\x17\x17\x0c\x0a\x07\x03\x01\ +\x06\x0d\x0c\x12\x00?333?3\x129/]3\ +\x119/3\x113\x11310!#\x01\x07\x07\x03\ +#\x013\x01\x013\x037!\x07\x032\x16\x15\x14\x06\ +\x06#\x22&546\x014&#\x22\x06\x15\x14\x16\ +326\x03\xdff\xfeJ)+\xc1`\x015{\x01\ +\xa8\x01\x12\x5cA\x12\x01\x96\x11(z\x88Z\x98bv\ +\x86\xba\x013UJl\x82ZHl\x7f\x05?\xdd\xd5\ +\xfcs\x05\xb6\xfa\xf0\x05\x10\xfaJVV\x03\xb6\x92~\ +r\xc1a\x91\x82\xae\xe3\xfe\xeeYg\xac\x8ddc\xb1\ +\x00\x00\x02\x00\xae\x02\xe5\x05\xba\x05\xb6\x00\x07\x00\x18\x00\ + @\x0f\x10\x16\x0a\x0d\x14\x08\x03\x01\x07\x03\x03\x11\x0e\ +\x04\x03\x00?333\x113\xc4\x1723321\ +0\x01#\x11#5!\x15#\x01\x03#\x17\x11#\x11\ +3\x13\x133\x11#\x117#\x03\x01\xddV\xd9\x02\x0a\ +\xdb\x02X\xdd\x06\x04R}\xdd\xdf}V\x04\x06\xe3\x02\ +\xe5\x02\x83NN\xfd}\x02a\xc9\xfeh\x02\xd1\xfd\xa2\ +\x02^\xfd/\x01\x8e\xcf\xfd\xa3\xff\xff\x00\x1b\x00\x00\x05\ +{\x05\xcb\x02\x06\x01v\x00\x00\x00\x02\x00\x89\xff\xdd\x04\ +\xae\x04H\x00\x17\x00\x1f\x00\x14\xb7\x0d\x1f\x1f\x08\x11\x00\ +\x1c\x08\x00/3/2\x129/310\x05\x22&\ +\x02546632\x16\x12\x15!\x11\x16\x1632\ +67\x17\x06\x06\x13\x11&&#\x22\x07\x11\x02\x9c\x9d\ +\xf1\x85\x8a\xf4\x95\x98\xf3\x87\xfc\xc51\xa6R\x83\xb7Q\ +Hb\xd9\x937\x9eX\xadz#\x93\x01\x05\x9d\xab\xff\ +\x8c\x8e\xfe\xfd\xa5\xfe\x9c5Fi\x81)\x9b|\x02\x8b\ +\x01\x157@u\xfe\xe9\xff\xff\x009\xff\xee\x05Z\x05\ +\xb6\x00'\x02@\x02\x89\xfd\xb3\x00&\x00{\xc4\x00\x01\ +\x07\x02\x17\x02\x08\x00\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00\ +?555\x00\xff\xff\x00S\xff\xee\x06\x17\x05\xc9\x00\ +'\x02@\x03F\xfd\xb3\x00&\x00u\xe6\x00\x01\x07\x02\ +\x17\x02\xc1\x00\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00?5\ +55\x00\xff\xff\x00S\xff\xee\x06\x06\x05\xb6\x00'\x02\ +@\x035\xfd\xb3\x00&\x02=\xf9\x00\x01\x07\x02\x17\x02\ +\xb6\x00\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00?555\ +\x00\xff\xff\x00=\xff\xee\x05P\x05\xb6\x00'\x02@\x02\ +\x7f\xfd\xb3\x00'\x02\x17\x02\x0c\x00\x00\x01\x06\x02?\xea\ +\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00?555\x00\x00\ +\x02\x00\x8f\xff\xec\x04-\x05\xc1\x00\x1a\x00'\x00\x19@\ +\x0b!\x0d\x0b\x0b\x04\x11\x18\x04\x1b\x04\x16\x00?3?\ +3\x129/9310\x01\x10\x02\x04#\x22&5\ +4\x12632\x177\x10&#\x22\x06\x07566\ +32\x12\x0126\x127&#\x22\x06\x02\x15\x14\x16\ +\x04-\x96\xfe\xf0\xb0\x9a\xae\x8e\xe6\x90\xdfU\x04\x98\xa0\ +9\x83-*\x939\xc0\xcd\xfd\xb8q\xba\x83\x1b_\xc0\ +u\xb7m}\x03\xac\xfe\xed\xfeG\xf4\xc8\xb0\xaa\x015\ +\x9e\xd5i\x01\x03\xf0#\x18b\x14\x1e\xfe\xf2\xfb\x93\x92\ +\x01\x0e\xab\xfa\x8b\xfe\xfb\x8c\x90\x99\x00\x00\x02\xff\xd3\x00\ +\x00\x03\xf4\x05\xbc\x00\x05\x00\x0c\x00\x14@\x09\x06\x00\x03\ +\x04\x09IY\x04\x12\x00?+\x00\x18?310\x01\ +3\x13\x07!7\x01\x06\x06\x01!\x02\x02\x02\xf0C\xc1\ +\x0b\xfb\xea\x0e\x03\x11*g\xfe\x03\x03!FJ\x05\xbc\ +\xfa\x86BF\x04\xd3Z\xc4\xfce\x02\x13\x022\x00\x00\ +\x01\x00\xcf\xfe\x02\x05\x0e\x05\xb6\x00\x07\x00\x14@\x09\x00\ +\x04\x1c\x05\x02IY\x05\x03\x00?+\x00\x18?31\ +0\x01\x11!\x11#\x11!\x11\x04\xa8\xfc\x8df\x04?\ +\xfe\x02\x07T\xf8\xac\x07\xb4\xf8L\x00\x00\x01\x00V\xfe\ +\x02\x04\xba\x05\xb6\x00\x0b\x00 @\x10\x01\x09\x03\x07\x04\ +\x07IY\x04\x03\x00\x09IY\x00\x1c\x00?+\x00\x18\ +?+\x11\x003\x11310\x135\x01\x015!\x15\ +!\x01\x01!\x15V\x02\x98\xfdx\x04\x11\xfc\x7f\x02t\ +\xfdw\x03\xd9\xfe\x02F\x03\xca\x03_E^\xfc\xc3\xfc\ +E^\x00\x00\x01\x00\xa8\x02\xa0\x04/\x03\x04\x00\x03\x00\ +\x0b\xb4\x01\x00SY\x01\x00/+10\x135!\x15\ +\xa8\x03\x87\x02\xa0dd\x00\x01\x00%\xff\xf2\x04\xa8\x06\ +\x81\x00\x08\x00\x14\xb7\x06\x01\x03\x04\x04\x08\x01\x08\x00/\ +/\x129/3\x11310\x05#\x01#53\x01\ +\x013\x02bn\xfe\xe7\xb6\xfa\x01\x0e\x02\x1d^\x0e\x03\ +\x1eX\xfd\x00\x06\x19\x00\x00\x03\x00{\x01\x9c\x05\x1f\x04\ +\x0a\x00\x17\x00#\x00/\x00*@\x14\x0f\x03\x12\x00\x1e\ +*\x12*SY\x0c\x12\x18$\x00$SY\x06\x00\x00\ +/2+\x11\x003\x18/3+\x11\x003\x11\x129\ +910\x012\x16\x176632\x16\x15\x14\x06#\ +\x22&'\x06\x06#\x22&546\x05\x22\x06\x07\x16\ +\x1632654&!\x22\x06\x15\x14\x16326\ +7&&\x01\xa0[\x91A?\x90^\x7f\xa6\xa7~^\ +\x90?B\x91Z\x7f\xa6\xa7\x02\xd8Ps77sP\ +Xhi\xfdOWjjWJs=e\x02\x1f?\ +:^o!'9}apG\x1b\x1f\x01\x9b=;\ +^n\x1b,::C`qH\x1d\x1c\x00\x00\x01\x00\ +o\x00\xb2\x04#\x04\xf8\x00\x13\x00/@\x17\x00\x04\x05\ +\x04RY\x11\x05\x10\x08\x09\x08RY\x0d\x09\x05\x09\x05\ +\x09\x0b\x01\x0b\x00//\x1299//\x113+\x11\ +\x003\x113+\x11\x00310\x01\x03'\x13!5\ +!\x13!5!\x13\x17\x03!\x15!\x03!\x15\x02\x02\ +\x8bL{\xfe\xc9\x01^\x99\xfe\x09\x02\x1e\x90I}\x01\ +:\xfe\xa0\x9a\x01\xfa\x01\xdd\xfe\xd5%\x01\x06R\x01F\ +R\x011'\xfe\xf6R\xfe\xbaR\x00\x00\x02\x00\x89\xff\ +\xf6\x04/\x04\xc5\x00\x06\x00\x0a\x00\x1a@\x0b\x07\x08S\ +Y\x07\x00\x03 \x01\x02\x05\x00\x19/\x113\x1a\xcd\xcd\ +\x18/+10\x01\x015\x01\x15\x09\x025!\x15\x04\ +\x1b\xfcn\x03\x92\xfc\xdf\x03!\xfc\x8d\x03\x87\x01\x06\x01\ +\x9eJ\x01\xd7g\xfeq\xfe\xa2\xfe\x85dd\x00\x02\x00\ +\xa8\xff\xf6\x04=\x04\xc5\x00\x06\x00\x0a\x00\x1a@\x0b\x07\ +\x08SY\x07\x06\x03 \x05\x04\x01\x00\x19/33\x1a\ +\xcd\xcd\x18/+10\x13\x01\x015\x01\x15\x01\x035\ +!\x15\xaa\x03!\xfc\xdf\x03\x93\xfcm\x02\x03\x87\x01q\ +\x01^\x01\x8fg\xfe)J\xfeb\xfe\xf0dd\x00\x00\ +\x02\x00w\x00\x00\x04-\x05\xc3\x00\x05\x00\x09\x00\x10\xb5\ +\x09\x05\x07\x02\x05\x02\x00//\x113\x11310\x13\ +\x013\x01\x01#\x09\x03w\x01\xc21\x01\xc3\xfe=1\ +\x01\x90\xfe\x89\xfe\x89\x01w\x02\xdf\x02\xe4\xfd\x1c\xfd!\ +\x02\xdf\x02m\xfd\x93\xfd\x9a\x00\xff\xff\xff\x06\xfe\x14\x04\ +\x1e\x06\x1f\x00'\x00L\x025\x00\x00\x00\x06\x00I\xef\ +\x00\xff\xff\xff\x06\xfe\x14\x04/\x06\x1f\x00'\x00O\x02\ +7\x00\x00\x00\x06\x00I\xef\x00\x00\x01\x01j\x04\xd9\x03\ +\xdb\x05\xf8\x00\x10\x00\x0e\xb4\x08\x00\x80\x0e\x03\x00/3\ +\x1a\xcc210\x01\x06\x06#\x22&5473\x06\ +\x15\x14\x16327\x03\xdb\x11\xbb\x96\x8c\x83\x0dR\x08\ +Ue\xe7\x1b\x05\xf8\x89\x96ta&$-\x11DG\ +\xc9\x00\x01\xfe\xe9\xfe\x14\x01\x8d\x04?\x00\x0d\x00\x11\xb7\ +\x09\x0f\x00\x05GY\x00\x1b\x00?+\x00\x18?10\ +\x03\x22'5\x163267\x013\x01\x06\x06\xa6>\ +3/BR]\x1a\x01\x0a`\xfe\xf4#\x8f\xfe\x14\x13\ +\x5c\x16g~\x04\xed\xfb\x09\xa5\x8f\x00\x00\x01\x02\x14\x04\ +\xcd\x03\x14\x06\x14\x00\x09\x00\x0a\xb2\x04\x80\x09\x00/\x1a\ +\xcd10\x016673\x15\x06\x06\x07#\x02\x14$\ +h\x14`\x09\x8d:0\x04\xe7.\xc96\x14'\xd66\ +\x00\x00\x01\x00\xac\xfe;\x01\xac\xff\x83\x00\x09\x00\x08\xb1\ +\x09\x04\x00/\xcd10\x136673\x15\x06\x06\x07\ +#\xac\x22g\x17`\x09\x8b=/\xfeV,\xc4=\x14\ +(\xd39\x00\x01\x02\x0a\x04\xd9\x03\x0a\x06!\x00\x09\x00\ +\x0a\xb2\x09\x80\x04\x00/\x1a\xcd10\x01\x06\x06\x07#\ +56673\x03\x0a\x22g\x17`\x08\x8a?/\x06\ +\x06,\xc4=\x15&\xd2;\x00\x00\x02\x00s\x023\x02\ +\xd9\x05\xc9\x00\x0c\x00\x1a\x00\x17@\x0c\x0b\x0dNY\x0b\ +\x1f\x04\x14NY\x04!\x00?+\x00\x18?+10\ +\x01\x14\x02\x06#\x22&54\x12632\x07\x22\x06\ +\x02\x15\x14\x16326\x1254&\x02\xd9d\xabp\ +oxg\xabm\xe7\xebN\x84SQHT\x81LI\ +\x04\xae\xae\xfe\xd0\x9d\x97\x94\x9e\x010\x9dJ\x8b\xfe\xfd\ +\x8dst\x90\x01\x08\x91pi\x00\x02\x005\x02J\x02\ +\xa2\x05\xbc\x00\x0a\x00\x11\x00%@\x12\x06\x11\x0e\x07\x01\ +\x05\x11\x05NY\x09\x11\x11\x03\x07\x1e\x03 \x00??\ +\x129/3+\x11\x003\x113\x11310\x01#\ +\x07#7!7\x013\x033#\x1267\x06\x06\x01\ +\x02\x91\x831R1\xfey\x15\x01\xfaV}\x85\xd7=\ +$\x0b\x0af\xfe\xe1\x03/\xe5\xe5L\x02A\xfd\xbb\x01\ +&\x8f\x22\x10~\xfe\xb7\x00\x01\x00Z\x027\x02\xcb\x05\ +\xb6\x00\x1a\x00(@\x14\x13\x06\x11\x00\x11NY\x19\x00\ +\x00\x06\x18\x15\x1e\x06\x0bNY\x06!\x00?+\x00\x18\ +?3\x129/9+\x11\x12\x00910\x012\x16\ +\x15\x14\x06#\x22'5\x1632654&#\x22\ +\x07'\x13!\x07!\x036\x01\x98p}\xc1\x99~S\ +fot\x8aVRNZ!y\x01\x96\x0f\xfe\xb3P\ +@\x04`tu\x8d\xb31]B\x86jMW\x1f\x16\ +\x01\xa8N\xfe\xe8\x10\x00\x00\x02\x00\x8b\x025\x02\xe5\x05\ +\xbc\x00\x19\x00&\x00-@\x17\x05\x0f\x08\x08 NY\ +\x08\x08\x0f\x16\x16\x02NY\x16\x1e\x0f\x1aNY\x0f!\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x01&#\x22\x06\x073632\x16\x15\ +\x14\x06\x06#\x22&54\x12632\x16\x17\x012\ +654&#\x22\x06\x06\x15\x14\x16\x02\xcf3B|\ +\xc3#\x08U\x84]pN\x8d^nt|\xd9\x88\x18\ +T\x11\xfe\x92]zHE:i=Q\x05Z\x10\xc1\ +\xa1`whZ\x9e\x5c\x92\x89\xaa\x01\x22\xa0\x09\x07\xfc\ +\xd3\x94lE[8_MUg\x00\x00\x01\x00\x9a\x02\ +J\x02\xee\x05\xb6\x00\x06\x00\x16@\x0a\x00 \x05\x02\x03\ +\x02NY\x03\x1e\x00?+\x11\x003\x18?10\x13\ +\x01!7!\x07\x01\x9a\x01\xe3\xfed\x11\x01\xfc\x09\xfe\ +\x1b\x02J\x03\x1cPA\xfc\xd5\x00\x03\x00m\x02;\x02\ +\xd1\x05\xc5\x00\x17\x00#\x000\x00#@\x13*\x18\x12\ +\x06\x04\x0c\x00\x00$NY\x00\x1f\x0c\x1eNY\x0c!\ +\x00?+\x00\x18?+\x11\x12\x00\x17910\x012\ +\x16\x15\x14\x06\x07\x16\x16\x15\x14\x06#\x22&546\ +7&&546\x13\x06\x06\x15\x14\x163265\ +4&\x13\x22\x06\x15\x14\x16\x17>\x0254&\x01\xf8\ +bwav?L\xa5\x86j\x83~s<2\x90\x1e\ +hsUJZoR\x15Q[2@SG+J\ +\x05\xc5fYOx1(dGp\x90qbb\x80\ +-/[8f\x80\xfe+#fSAL_O<\ +e\x01\x9fOC.Q-!2D07@\x00\x00\ +\x02\x00s\x025\x02\xc7\x05\xbc\x00\x18\x00'\x00-@\ +\x17\x06\x08\x0f\x08\x1fNY\x08\x08\x16\x0f\x0f\x19NY\ +\x0f\x1e\x16\x02NY\x16!\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x00910\x13\x1632\ +67#\x06#\x22&546632\x16\x15\x14\ +\x02\x06#\x22'\x01\x22\x06\x15\x14\x1632676\ +654&sE@|\xbe$\x08Zy_pN\ +\x8e]muz\xd9\x8bM)\x01h[vFCA\ +n\x1c\x05\x0aP\x02\x9e\x17\xbc\xa2f\x80g[\x9e]\ +\x94\x8a\xa8\xfe\xe1\xa2\x11\x03)\x8epIYE@\x0a\ +>\x1aRg\x00\x00\x16\x00T\xfe\x81\x07\xc1\x05\xee\x00\ +\x05\x00\x0b\x00\x11\x00\x17\x00\x1b\x00\x1f\x00#\x00'\x00\ ++\x00/\x003\x007\x00;\x00?\x00C\x00G\x00\ +S\x00[\x00k\x00t\x00|\x00\x89\x00\x8f@N-\ +\x1d\x19\x13\x0fluuk\x5c\x82}}VKvk\ +ZQ\x5c\x85t\x5c84 \x06\x04\x0f\x0e\x150%\ +3&1HT\ +;\x1bGFBIHCHE\x06\x14\xfcV\xfcW\ +\x03\xa9\xfb/2A1R~X\x87\x9a8*\xb2P\ +:/5K6DpJ;\xfe\xed?HI>@\ +IH\x00\xff\xff\xfe\xe9\xfe\x14\x02\xb7\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01L\xfe\xb3\x00\x00\x00\x08\xb3\x01\x1a\ +\x11&\x00+5\xff\xff\x00\x81\x03\xc1\x01\xdf\x05\xb6\x02\ +\x06\x02\x07\x00\x00\x00\x02\x00\x0c\xff\xec\x04D\x06)\x00\ +2\x00?\x00<@\x1f\x00&7&HY077\ +\x05,\x16\x10FY\x16\x16\x05,,=FY,\x01\ +\x05!FY\x05\x16\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x009\x18/3+\x11\x0031\ +0\x01\x06\x02\x06\x06#\x22&5476654\ +&#\x22\x06\x077632\x16\x15\x14\x07\x06\x06\x15\ +\x14\x16326\x127#\x22&54632\x16\ +\x15\x073\x07\x01\x14\x16\x1633654&#\x22\ +\x06\x03\xae\x0fu\xae\xd3z\x82\x92:D\x13%\x14\x13\ +;\x19\x0f668K3/+dZ\x85\xde\x98\x16\ +\x17\xfd\xfb\xaf\x8b\x9d\xa4\x04\x90\x0f\xfdmR\xa6\x99\x1d\ +\x04op`s\x03s\xa9\xfe\x97\xfbz\x91\x85g\x8c\ +\xa3B\x1a\x1f\x1c\x10\x0fZ\x1bM:Lsk\x90D\ +We\xca\x01\x85\xe0\xb3\xb9\x93\xb7\xf9\xee}R\x01p\ +e|=*@\xd6\xce\x81\x00\x00\x01\x00\xc1\x00\x00\x04\ +\xc3\x05\xc3\x00\x15\x00\x1d@\x0f\x00\x13\x10\x03\x12\x14\x03\ +\x12\x12\x05\x0bIY\x05\x04\x00?+\x00\x18??\x12\ +\x17910\x016\x126632\x16\x17\x07&#\ +\x22\x06\x06\x02\x07\x03#\x13\x033\x01\xee\x80\xebtf\ +<\x1d)\x0e\x1b\x1c\x1f;i\x9a\xc6]liw\xed\ +d\x02\x85\xef\x01\x88\x8e9\x0a\x03X\x0ai\xf0\xfe\xb1\ +\xae\xfd\xee\x02!\x03\x95\x00\x02\x00s\xff\xec\x05\xfa\x04\ +?\x00\x17\x00-\x00-@\x16##\x00\x09\x0c\x1b\x07\ +\x09\x07HY\x09\x0f*\x1f\x00\x1fFY\x13\x00\x16\x00\ +?2+\x11\x003\x18?+\x11\x0033\x11\x129\ +\x18/10\x05\x22&54\x127!77!\x07\ +#\x16\x16\x15\x14\x02\x06#\x22&'\x06\x014'!\ +\x00\x11\x103267\x133\x07\x06\x15\x14\x1632\ +6\x12\x01\x87\x82\x88\x88|\xfe\xf2\x0e\xba\x04\xbf\x13\xf7\ +\x0f\x1ct\xc2\x81Vr\x13^\x02\x8b \xfdQ\xfe\xfc\ +\xb3Rt#;a6\x12QF]\x95Z\x14\xb5\xb7\ +\xad\x01W\x92?\x12QE\xaev\xb6\xfe\xbb\x9e^T\ +\xb2\x02\x9d\xbf\xa6\xfe\xb9\xfe\xb9\xfe\xe4\x88\x9c\x01\x13\xfc\ +c&Pb\x8f\x01\x19\xff\xff\x00m\x00\x00\x06w\x07\ +u\x02&\x000\x00\x00\x01\x07\x00v\x01}\x01T\x00\ +\x08\xb3\x01\x1d\x05&\x00+5\xff\xff\x00H\x00\x00\x06\ +^\x06!\x02&\x00P\x00\x00\x01\x07\x00v\x01q\x00\ +\x00\x00\x08\xb3\x015\x11&\x00+5\xff\xff\xff\x91\xfd\ +\xf6\x03\xd3\x05\xbc\x02&\x00$\x00\x00\x00\x07\x02[\x00\ +\xf8\x00\x00\xff\xff\x00f\xfd\xf6\x047\x04P\x02&\x00\ +D\x00\x00\x00\x07\x02[\x01%\x00\x00\xff\xff\xff\xa7\xff\ +\xec\x05\xfc\x05\xcb\x00'\x02\x5c\xfe\x1c\x00\x00\x00\x07\x00\ +2\x00\x81\x00\x00\x00\x02\xff\xcb\xfd\xf6\x01m\xff\x83\x00\ +\x0b\x00\x17\x00\x1c\xb1\x15\x03\xb8\xff\xc0@\x0b\x09\x0cH\ +\x03\x0f\x09@\x09\x0dH\x09\x00/+3\xcc+21\ +0\x01\x14\x06#\x22&54632\x16\x074&\ +#\x22\x06\x15\x14\x16326\x01mta`mm\ +`atYE76E?<7E\xfe\xbe\x5cl\ +j\x5c]jnY9DD9:CC\x00\x02\x01\ +\x8b\x04Z\x03\xb4\x05\xc3\x00\x08\x00\x19\x00\x0d\xb4\x17\x07\ +\x0c\x02\x03\x00?3\xc4210\x01673\x15\x06\ +\x06\x07#'467\x07\x06\x06\x15\x14\x17\x16\x15\x14\ +\x06#\x22&\x02\x89i;\x87<\x9d9\x19\xfe\x86t\ +\x147<\x1d\x1e2&*,\x04\x85\x98\x95!U\xad\ +1`V\x8c#]\x0f3\x14\x14\x15\x19 #1:\ +\x00\xff\xff\xff\x06\xfe\x14\x06^\x06\x1f\x00&\x03\x8d\xef\ +\x00\x00\x07\x00L\x04u\x00\x00\xff\xff\xff\x06\xfe\x14\x06\ +w\x06\x1f\x00&\x03\x8d\xef\x00\x00\x07\x00O\x04\x7f\x00\ +\x00\x00\x02\x00\xac\xff\xec\x06\x7f\x06\x14\x00\x16\x00$\x00\ +%@\x12\x11\x0b\x15\x0e\x04\x0b\x0b\x17IY\x0b\x04\x04\ +\x1eIY\x04\x13\x00?+\x00\x18?+\x11\x12\x009\ +9\x18\x10\xc610\x01\x14\x02\x04#\x22\x00\x11\x10\x12\ +$32\x16\x176673\x17\x06\x07\x16\x01\x22\x04\ +\x02\x15\x14\x1232$\x1254&\x05{\xbc\xfe\xc4\ +\xcf\xfa\xfe\xf2\xba\x01D\xd3\x8f\xdbBfh\x13i\x0c\ +5\xfc-\xfd\xf4\xae\xfe\xf3\xa0\xdb\xd2\xa9\x01\x06\x9e\xd1\ +\x03\x8f\xff\xfe;\xdf\x01*\x01\x19\x01\x06\x01\xaf\xe7l\ +m)\x88q\x12\xf6by\x01<\xca\xfev\xdc\xf5\xff\ +\x00\xc5\x01\x93\xe5\xf0\xf8\x00\x02\x00b\xff\xec\x04\xf6\x04\ +\xe3\x00\x15\x00\x22\x00%@\x12\x05\x00\x09\x02\x0f\x00\x00\ +\x16FY\x00\x10\x0f\x1cFY\x0f\x16\x00?+\x00\x18\ +?+\x11\x12\x0099\x18\x10\xc610\x012\x176\ +673\x17\x06\x07\x16\x15\x14\x02\x06#\x22&54\ +\x126\x17\x22\x06\x02\x15\x10!26\x1254&\x02\ +\x89\xcbbWa\x13h\x0d4\xe5%\x8f\xf8\xa2\xb8\xbf\ +\x92\xf8\x95|\xc6v\x01\x1a\x7f\xc5u\x92\x04T\x89#\ +\x85p\x12\xf0^Wp\xc5\xfe\xa9\xb4\xdb\xcc\xbf\x01N\ +\xb4V\x9d\xfe\xdb\xa4\xfe\xaa\x9b\x01-\xb4\x9a\xa6\x00\x00\ +\x01\x00\xb0\xff\xec\x06\xae\x06\x14\x00\x1c\x00\x1c@\x0d\x09\ +\x01\x0d\x04\x1c\x12\x03\x0d\x18IY\x0d\x13\x00?+\x00\ +\x18?3\xc6\x129910\x01\x076673\x17\ +\x06\x06\x07\x03\x02\x04# \x1147\x133\x03\x06\x15\ +\x10!267\x13\x05s-ew\x17i\x0c#\xbd\ +\x9b\x8f:\xfe\xea\xec\xfeH\x1b\xbag\xc1\x14\x01V\xc3\ +\xe1.\xcf\x05\xb6\xd3\x1d\x8c\x88\x12\xa0\xb1&\xfdZ\xfe\ +\xf2\xeb\x01\x91Sv\x03p\xfc}Y_\xfe\xcb\xc1\xde\ +\x03\xd1\x00\x00\x01\x00m\xff\xf0\x05w\x04\xe5\x00!\x00\ +#@\x11\x19\x1b\x15\x0d\x17\x10\x0b!\x0f\x1b\x06FY\ +\x1b\x16\x17\x15\x00??+\x00\x18?3\xc6\x1299\ +\x12910\x01\x03\x06\x15\x14\x1632667\x13\ +3\x076673\x17\x06\x06\x07\x03#7#\x06#\ +\x22&547\x13\x01}\x98\x16_[n\xc3\x85!\ +ib\x1fgx\x17h\x0d#\xbe\x9c\xb6P\x1c\x06\xa7\ +\xec\x83\x87\x16\x96\x04?\xfdFj4JW\x83\xf3\x9e\ +\x01\xe5\x91\x1c\x8e\x8d\x12\xa2\xb8#\xfc\xaa\xcd\xdd|w\ +\xfe\xf3\xd7c=\x04\xfe\ +\xc0\x04?\xfd[\xefI\x01\xe0\x01\xfd\xfdq\xcb\x83\xb3\ +\x01\xde\x01L\xfe\x9d\xfd\xf0\xcc\x01\xc9\xfe7\x00\x02\x00\ +\xb2\x00\x00\x04s\x06\x14\x00\x12\x00\x1b\x001@\x19\x0e\ +\x06\x07\x06IY\x0b\x07\x0f\x13IY\x07\x0f\x07\x0f\x09\ +\x04@\x04\x14IY\x04\x12\x00?+\x00\x1a\x18\x10\xcd\ +99//+\x11\x003+\x11\x00310\x01\x14\ +\x04#!\x13!7!\x133\x03!\x07!\x0332\ +\x16%\x0332654&#\x04s\xfe\xe8\xfb\xfe\ +\x96\xf6\xfe\xc6\x15\x019DhD\x01\x9a\x12\xfedL\ +\xe8\xbb\xc8\xfd\x83\x87\xef\xcd\xdd\x95\x96\x01\xd1\xdf\xf2\x04\ +\x89^\x01-\xfe\xd3^\xfe\xa2\xb3Y\xfd\x89\xb8\xb9\x86\ +\x80\x00\x02\x00H\xff\xec\x03\x98\x05'\x00\x17\x00%\x00\ +8@\x1c\x04\x0c\x07\x16\x14\x07\x18FY\x07\x07\x0c\x14\ +\x03\x13\x14\x13HY\x00\x14\x0f\x0c GY\x0c\x16\x00\ +?+\x00\x18?3+\x11\x003\x11\x129\x18/+\ +\x00\x18\x10\xc6\x11\x12910\x01!\x07!\x0376\ +3 \x11\x14\x06#\x22&547\x13#737\ +3\x13\x22\x06\x07\x06\x15\x14\x1632654&\x01\ +\xa0\x01\x1c\x12\xfe\xe5Z8ub\x01T\xdf\xc1\xa3\xad\ +\x1fd\xe3\x10\xe34d^M\x8b6\x19r\x84\x90\xa1\ +\x80\x04?Q\xfe^\x0a\x14\xfe\xe8\xa2\xc4\x9e\x99i\x8f\ +\x01\xd3Q\xe8\xfc\xed\x15\x09vMzs\x8bygc\ +\x00\x00\x01\x00f\xff\xec\x07)\x05\xcb\x00%\x001@\ +\x1a\x06\x17\x1c\x17IY\x03\x1c\x1c\x19\x1a\x03\x19\x12!\ +\x00IY!\x04\x11\x0cIY\x11\x13\x00?+\x00\x18\ +?+\x00\x18??\x129/3+\x11\x00310\ +\x01\x22\x00\x03!\x07!\x06\x06\x15\x14\x16327\x15\ +\x06#\x22\x00\x1147!\x03#\x013\x03!6\x12\ +$32\x17\x07&\x05\xf6\xec\xfe\xa7G\x02\xa6\x12\xfd\ +Z\x07\x09\xdf\xcd\x8b\xa4\x9c\xa0\xfc\xfe\xf4\x0f\xfet\x95\ +g\x016f\x8b\x01\x890\xd6\x017\xb9\xb1\x82-o\ +\x05m\xfe\xcd\xfe\xf3^\x22r \xe2\xf13^1\x01\ +\x1e\x01\x0d`X\xfd1\x05\xb6\xfdw\xca\x01.\xa6D\ +Z@\x00\x00\x01\x00J\xff\xec\x05R\x04P\x00$\x00\ +1@\x1a\x1a\x06\x0b\x06FY\x17\x0b\x0b\x08\x09\x0f\x08\ +\x15\x0f\x14FY\x0f\x10\x00\x1fGY\x00\x16\x00?+\ +\x00\x18?+\x00\x18??\x129/3+\x11\x003\ +10\x05\x22&547!\x03#\x133\x03!6\ +\x0032\x17\x07&#\x22\x06\x07!\x07!\x06\x15\x14\ +\x163267\x15\x06\x03\xa8\xb4\xc5\x08\xfe\xe8qd\ +\xe9`d\x01\x174\x01\x1e\xc8\x87k\x1dkn\x99\xe6\ +1\x02\x17\x15\xfd\xf0\x08\x91\x89EyH{\x14\xde\xc3\ +J3\xfd\xf6\x04?\xfe\x1f\xea\x01\x08+Z/\xd5\xc7\ +T6E\xa0\xa9\x1a!\x5c9\x00\x02\xff\x91\x00\x00\x04\ +-\x05\xb6\x00\x0b\x00\x14\x00#@\x11\x0c\x06\x0b\x03\x10\ +\x03JY\x10\x10\x05\x06\x03\x09\x01\x05\x12\x00?33\ +?\x129/+\x11\x003\x11310!#\x13#\ +\x01#\x013\x13#\x03#\x13\x0e\x02\x07!'&'\ +\x02\x10^\x9c\xa6\xfeVm\x03_E\xf8`}\xa8L\ +\x0fTX^\x01g#$\x03\x02\xd5\xfd+\x05\xb6\xfa\ +J\x02\xd5\x02N$\x9f\x95\x9e\xd1\xccY\x00\x00\x02\xff\ +\xba\x00\x00\x03d\x04?\x00\x0b\x00\x11\x00!@\x10\x04\ +\x08\x0e\x08HY\x0e\x0e\x0b\x06\x02\x0a\x15\x0c\x0b\x0f\x00\ +?3?33\x129/+\x11\x00310\x01\x13\ +#\x03#\x03#\x13#\x01#\x01\x17\x06\x07!\x02'\ +\x02\xa8\xbcbR\x89m^s}\xfe\xcbc\x02\x8c\x1c\ +H\x99\x01#4\x08\x04?\xfb\xc1\x01\xfe\xfe\x02\x01\xfe\ +\xfe\x02\x04?b\x90\xff\x011^\x00\x00\x02\x00f\x00\ +\x00\x06\x14\x05\xb6\x00\x13\x00\x1c\x00-@\x17\x1c\x14\x13\ +\x03\x07\x0c\x07JY\x18\x0c\x0c\x09\x14\x0e\x0a\x03\x01\x05\ +\x11\x03\x09\x12\x00?\x173?33\x129/3+\ +\x11\x0033\x11310!#\x13#\x01#\x01!\ +\x03#\x013\x03!\x013\x13#\x03#\x13\x06\x06\x07\ +\x07!'&'\x03\xf8^\x9b\xa6\xfeVl\x01\xaa\xfe\ +A\x97g\x016f\x8b\x01\xe1\x01\x7fF\xf7`}\xa8\ +L\x0fX7z\x01f#$\x03\x02\xd5\xfd+\x02\xd5\ +\xfd+\x05\xb6\xfdw\x02\x89\xfaJ\x02\xd5\x02N%\xa6\ +\x5c\xcf\xd1\xccY\x00\x02\x00L\x00\x00\x04\xb8\x04?\x00\ +\x13\x00\x19\x00,@\x17\x08\x04\x0c\x11\x0cHY\x16\x11\ +\x11\x0e\x13\x0f\x0f\x02\x06\x0a\x03\x0e\x15\x14\x13\x0f\x00?\ +3?\x173?\x11\x129/3+\x11\x00331\ +0\x01\x13#\x03#\x03#\x13#\x01#\x01!\x03#\ +\x133\x03!\x01\x17\x06\x07!\x02'\x03\xfc\xbcbR\ +\x89m^s}\xfe\xcbc\x011\xfe\xd8m^\xe9^\ +j\x01F\x01+\x1cH\x99\x01#4\x08\x04?\xfb\xc1\ +\x01\xfe\xfe\x02\x01\xfe\xfe\x02\x01\xfe\xfe\x02\x04?\xfe\x0f\ +\x01\xf1b\x90\xff\x011^\x00\x00\x02\xff\xc3\x00\x00\x05\ +`\x05\xb6\x00\x1f\x00\x22\x000@\x18\x16\x1a\x05\x1aJ\ +Y\x0a \x05\x05\x07\x18\x10\x00\x12\x09\x06\x22\x07\x22I\ +Y\x07\x03\x00?+\x11\x0033\x18?33\x129\ +/33+\x11\x00310#\x13>\x027\x017\ +!\x07\x01\x1e\x02\x17\x13#\x03.\x02##\x03#\x13\ +#\x22\x06\x06\x07\x03\x01\x01!=\xf7Fl\x94h\xfe\ +\xec\x12\x03\xfa\x14\xfd\xf6m\x81A\x0a\x1fi\x1f\x084\ +j^\x10\xa6b\xa0\x13bw]=\xe1\x02\xa2\x01\xf6\ +\xfc\xfc\x02\x00\x8fv<\x03\x02\x18ZV\xfd\xe4\x07K\ +\x8a\x9b\xfe3\x01\xd7xm2\xfd\x12\x02\xee-m\x7f\ +\xfe+\x03D\x02\x18\x00\x00\x02\xff\x9e\x00\x00\x04\x8d\x04\ +?\x00\x1c\x00\x1f\x000@\x18\x14\x17\x05\x17HY\x0a\ +\x1d\x05\x05\x07\x16\x10\x00\x15\x09\x06\x1f\x07\x1fHY\x07\ +\x0f\x00?+\x11\x0033\x18?33\x129/3\ +3+\x11\x00310#\x13>\x027\x017!\x07\ +\x01\x1e\x02\x17\x13#\x03&&'\x03#\x13\x0e\x02\x07\ +\x03\x01\x01!b\xca9k\x93g\xfe\xfe\x0a\x03\x7f\x0c\ +\xfe^b{F\x126c3\x17{\x93v_wq\ +s[-\xbb\x02e\x01\x87\xfd\x83\x01oif8\x07\ +\x01}EE\xfe\x83\x0bDzu\xfe\xc1\x017\x8cf\ +\x02\xfd\xd5\x02+\x03'XQ\xfe\xa8\x02}\x01q\x00\ +\x02\x00f\x00\x00\x07`\x05\xb6\x00%\x00(\x009@\ +\x1e\x1f\x1c\x05\x0a\x05IY\x10&\x0a\x0a\x07\x0d\x08\x03\ +\x16\x1e\x00\x03\x07\x12\x0f\x0c(\x0d(IY\x0d\x03\x00\ +?+\x11\x0033\x18?\x173?\x11\x129/3\ +3+\x11\x003310!\x13667!\x03#\ +\x013\x03!\x017!\x07\x01\x1e\x02\x17\x13#\x03.\ +\x02##\x03#\x13#\x22\x06\x06\x07\x03\x01\x01!\x01\ +\xc3\xf7)O6\xfe\x00\x9bg\x016f\x85\x02\xe9\xfe\ +\xee\x12\x03\xfa\x14\xfd\xf6m\x81A\x0a\x1fi\x1f\x084\ +j^\x10\xa6b\xa0\x13bw]=\xe1\x02\xa2\x01\xf6\ +\xfc\xfc\x02\x00Um#\xfd\x1b\x05\xb6\xfd\x8e\x02\x18Z\ +V\xfd\xe4\x07K\x8a\x9b\xfe3\x01\xd7xm2\xfd\x12\ +\x02\xee-m\x7f\xfe+\x03D\x02\x18\x00\x02\x00J\x00\ +\x00\x05\xfc\x04?\x00\x22\x00%\x009@\x1e\x1d\x1a\x05\ +\x0a\x05GY\x10#\x0a\x0a\x07\x0d\x08\x0f\x16\x1c\x00\x03\ +\x07\x15\x0f\x0c%\x0d%HY\x0d\x0f\x00?+\x11\x00\ +33\x18?\x173?\x11\x129/33+\x11\x00\ +3310!\x13667!\x03#\x133\x03!\ +\x017!\x07\x01\x1e\x02\x17\x13#\x03&&'\x03#\ +\x13#\x22\x06\x07\x03\x01\x01!\x01\x0c\xcb#C0\xfe\ +\xb6ud\xe9`^\x02@\xfe\xfe\x0a\x03\x7f\x0c\xfe^\ +azF\x145b3\x17{\x93w^w\x0d\x86\x98\ +B\xba\x02d\x01\x87\xfd\x83\x01o?T\x1f\xfd\xdf\x04\ +?\xfe>\x01}EE\xfe\x83\x0bDxw\xfe\xc1\x01\ +7\x8cf\x02\xfd\xd5\x02+Zy\xfe\xa8\x02}\x01q\ +\x00\x00\x01\xff\xac\xfe\x5c\x03\xdb\x06\xc3\x00N\x00Z@\ +3A\x0232\x17\x15&#\x22\x06\x07\x16\ +\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04\x05\x06\x06\x15\x14\ +\x1637632\x17\x15&#\x07\x06#\x22&5\ +4667>\x02\x03\x1b\xfe\x8b\xb6\x12\xb2\x83\xd4h\ +\x88z_\xa6O6X\xb3p\x1e^!^>K@\ +DC#\x22\x1d&\x0f%c5u\x83\xb6\xb0\x80\x9a\ +\xfe\xd9\xfe\xda\xa7\x80QDK\xbeM\x99H^\x9bN\ +\xb4Bp\x8eO\x97\xa3\xbc\xc6d\x01\xa6\x01!`Z\ +\x9dir|C4L\x02\ +32\x17\x15&#\x22\x06\x027`g\x83{Ye\ +[\xb7\xae\xa0j\x8f8\xa8EMd*\x5c\x89B\x9b\ +JvrE\x8f\x9d\xc6\x92\x82\x8cT\x14Z\x95\x9fi\ +X=qJ)v\x8c _ ^=L@DC\ +\x22#\x1d!\x14&b\x04J\x11\x82]q\x94\x18\x04\ +\x12u\x5cg\x8aV\x1d\x1bB;^\x0a\x02\x14\x17`\ +/\x02\x0a`TE\x5c=\x1c\x22soaY\x5c{\ +kN^\x22.PI\x0d@\x85\x1e\x15E\x88^H\ +'\x0dM\x06Y\xff\xff\x00\xd1\x00\x00\x05\xf6\x05\xb6\x02\ +\x06\x01u\x00\x00\xff\xff\x00\x9a\xfe\x14\x05\x06\x06\x14\x02\ +\x06\x01\x95\x00\x00\x00\x03\x00\xac\xff\xec\x05{\x05\xcb\x00\ +\x0e\x00\x17\x00\x1f\x006@ \x1b\x13IY]\x1bm\ +\x1b\x02\x0f\x1b?\x1b\x02\x0b\x03\x1b\x1b\x05\x0c\x0c\x18I\ +Y\x0c\x04\x05\x0fIY\x05\x13\x00?+\x00\x18?+\ +\x11\x12\x009\x18/_^]]+10\x01\x14\x02\ +\x06\x04#\x22\x00\x11\x10\x12$32\x00\x012\x00\x13\ +!\x06\x15\x14\x16\x01\x22\x00\x03!74&\x05{k\ +\xb7\xfe\xfb\xa0\xfd\xfe\xf5\xb7\x01F\xd4\xf8\x01\x06\xfdF\ +\xdf\x01)3\xfc\x1f\x07\xdc\x01\x7f\xdd\xfe\xca3\x03\xe1\ +\x04\xd6\x03\x8f\xbd\xfe\x96\xf7\x85\x01,\x01\x17\x01\x00\x01\ +\xb1\xeb\xfe\xd7\xfb\xa6\x01E\x01)A8\xf6\xff\x05%\ +\xfe\xbc\xfe\xe9s\xf4\xf4\x00\x03\x00b\xff\xec\x04\x02\x04\ +T\x00\x0d\x00\x15\x00\x1e\x004@\x1f\x19\x12FY\x0f\ +\x19\x1f\x19?\x19O\x19\x04\x0b\x03\x19\x19\x07\x00\x00\x16\ +FY\x00\x10\x07\x0eFY\x07\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/_^]+10\x012\x16\ +\x15\x14\x02\x06#\x22&54\x126\x03267!\ +\x06\x15\x10\x01\x22\x06\x07!654&\x02\x89\xb4\xc5\ +\x8f\xf8\xa2\xb8\xbf\x92\xf8\x09\xa0\xde(\xfdF\x06\x01\xb8\ +\x97\xe0-\x02\xb9\x06\x92\x04T\xd9\xbf\xc5\xfe\xa9\xb4\xdb\ +\xcc\xbf\x01N\xb4\xfb\xee\xef\xd384\xfe\xaa\x03\xbc\xe5\ +\xc142\x9a\xa6\x00\x01\x00\xc9\x00\x00\x05H\x05\xc3\x00\ +\x16\x00\x19@\x0c\x16\x11\x12\x03\x11\x12\x07\x0cJY\x07\ +\x04\x00?+\x00\x18??\x11310%66\x01\ +>\x0232\x17\x15&#\x22\x06\x07\x01#\x033\x13\ +\x16\x17\x01\xc9\x12W\x01v<_rK+\x1d\x1d+\ +MnK\xfd\xddX\xb6du\x1b\x08\x93/\xc0\x03\x18\ +~t7\x07T\x09h\x9a\xfb\x91\x05\xb6\xfcJ\xe4\x89\ +\x00\x00\x01\x00h\x00\x00\x04\x06\x04P\x00\x15\x00\x17@\ +\x0b\x00\x0f\x0b\x10HY\x0b\x10\x04\x15\x15\x00?3?\ ++\x00\x18?10\x133\x13\x16\x1737\x13>\x02\ +32\x17\x15&#\x22\x06\x07\x01#hel\x1a\x07\ +\x06?\xee5SeD0\x18\x1c,<^;\xfe\x9c\ +q\x04?\xfd!\xb2L\x9d\x02,}o9\x0aN\x0a\ +c\x88\xfc\xe9\x00\xff\xff\x00\xc9\x00\x00\x05H\x07s\x02\ +&\x02\x80\x00\x00\x01\x07\x03v\x05f\x01R\x00\x0a\xb4\ +\x02\x01!\x05&\x00+55\xff\xff\x00h\x00\x00\x04\ +\x06\x06!\x02&\x02\x81\x00\x00\x01\x07\x03v\x04\x9c\x00\ +\x00\x00\x0a\xb4\x02\x01 \x11&\x00+55\xff\xff\x00\ +\xac\xfe\x14\x09\xae\x05\xcb\x00&\x002\x00\x00\x00\x07\x00\ +\x5c\x05\xbe\x00\x00\xff\xff\x00d\xfe\x14\x08\x0f\x04T\x00\ +'\x00\x5c\x04\x1f\x00\x00\x00\x06\x00R\x02\x00\x00\x02\x00\ +\xac\xff\xa2\x05{\x06\x14\x00\x19\x000\x00K@##\ +/)\x1c\x0a\x17\x04\x0f\x14\x1f\x14/\x14O\x14\x04\x09\ +\x04\x14\x11\x1a\x1c\x11\x1cIY\x11\x04&)\x04)I\ +Y\x07\xb8\xff\xe0\xb5\x09\x0dH\x07\x04\x13\x00?3+\ ++\x11\x003\x18?+\x11\x003\x113_^]\x12\ +99\x11\x129910\x01\x14\x02\x04\x07\x06\x06#\ +\x22&'&\x0254\x12$76632\x16\x17\ +\x16\x12%\x22'\x06\x06\x02\x15\x14\x16\x176632\ +\x16\x1766\x125\x10%\x06\x05{\xa9\xfe\xde\xba\x0b\ +9#&9\x09\xb9\xc2\xa9\x01,\xc3\x0c7#&;\ +\x09\xaf\xb8\xfe/R\x16\xa1\xf8\x95\x8f\x8a\x0c4\x22&\ +:\x0b\x9b\xeb\x8e\xfe\xfe\x1c\x03\x8f\xf1\xfeN\xec\x10'\ +'-+&\x01#\xec\xf9\x01\xa2\xef\x10%&-/\ +)\xfe\xe5\xa3S\x0c\xd0\xfe\x81\xd2\xc4\xf6)\x22$+\ ++\x11\xcf\x01\x85\xd6\x01zW?\x00\x00\x02\x00b\xff\ +\xaa\x04\x02\x04\x93\x00\x17\x00-\x00\x5c@8!,%\ +\x1b\x0f\x03\x0a\x16\x18\x1b+\x00;\x00K\x00\x03\x0f\x00\ +\x1f\x00\x02\x09\x04\x00\x16\x16\x1bFY\x16\x10#%$\ +\x0d4\x0dD\x0d\x03\x00\x0d\x10\x0d\x02\x09\x04\x0d\x0a\x0a\ +%FY\x0a\x16\x00?+\x11\x003_^]]\x11\ +3\x18?+\x11\x003_^]]\x113\x11\x129\ +9\x11\x129910\x012\x16\x17\x16\x16\x15\x14\x02\ +\x06\x07\x06#\x22&'&&54\x12676\x17\ +\x22&'\x06\x06\x02\x15\x10\x17632\x1766\x12\ +54&'\x06\x02\xac#3\x08y\x7f}\xd5\x8d\x17\ +E\x223\x08\x86\x82}\xe1\x92\x17C\x222\x08q\xb0\ +f\xa6\x18@J\x12q\xa6bLN\x18\x04\x93)(\ +$\xc8\x9a\xb9\xfe\xbc\xbb\x12H(&\x1f\xd5\xa7\xb2\x01\ +9\xc2\x10C\xe5'%\x0f\xa7\xfe\xeb\x97\xfe\xf7;;\ +I\x14\xa8\x01\x1e\x9ek\x99#7\x00\x00\x03\x00\xaa\xff\ +\xec\x07\x10\x08\x08\x002\x00H\x00[\x00}@\x0aP\ +YL>443JY4\xb8\xff\xc0@:\x09\x0f\ +H4B@\x00Y\x01\x09\x03\x00Y\x10Y Y\x03\ +\x0a\x04Y;B;JYB@\x09\x0fHB Y\ +L 0\x16\x19 \x08% %IY\x0e \x04\x00\ +-\x19-IY\x14\x19\x13\x00?3+\x11\x003\x18\ +?3+\x11\x003\x11\x1299\x18\x10\xd6\xc4\x10\xc4\ +++\x00\x18\x10\xc6_^]_^]\x1a\x10\xcd+\ ++\x00\x18\x10\xc4\x11\x12910%26\x12\x125\ +4&#\x22\x06\x07'63 \x11\x10\x02\x04#\x22\ +'\x06\x06#\x22&5\x10\x12\x0032\x17\x07&#\ +\x22\x06\x02\x02\x15\x14\x163267\x16\x16\x01\x07#\ +\x22&'&&#\x22\x06\x07#6632\x16\x17\ +\x16\x163\x05\x14\x06\x0776654&'&&\ +54632\x16\x04\x5c\x8e\xcb\x99Z{w;]\ +.-w\x87\x01O\xc4\xfe\xe5\xcd\x92\x80b|9\xc1\ +\xd0\xaa\x01\x0b\xb1\x86d9Za]\xb3\x93Q\x9c\x96\ +U\x8f05\x8b\x02<\x10\x11Kv?*O/>\ +Q\x0ac\x16\x81_0f\x5cKR+\xfe\xdepW\ +\x0a+8\x1c\x16\x0e\x1f+#38H\x8f\x01#\x01\ +u\xa5\xaa\xaf!\x19TD\xfeE\xfe\xea\xfd\xea\xf8I\ ++\x1e\xfa\xf1\x01\x04\x01\xe9\x01\x07HV@\x8c\xfe\xeb\ +\xfe\xad\x98\xcd\xcc6\x22&2\x07NR(\x1f\x14\x1b\ +=7^d\x17(\x22\x11\x98Jq\x12>\x0a2\x16\ +\x15\x0f\x0b\x08\x18\x17\x1f 7\x00\x03\x00m\xff\xec\x05\ +`\x06\xd7\x00-\x00C\x00V\x00n\xb5KGT9\ +/T\xb8\xff\xe0@\x0a\x09\x0cHT6/.HY\ +/\xb8\xff\xc0@(\x09\x0fH/=@=6HY\ +=@\x09\x0fH=G\x1d+\x14\x16\x1d\x07\x22\x1d\x22\ +GY\x0c\x1d\x10\x00(\x16(GY\x12\x16\x16\x00?\ +3+\x11\x003\x18?3+\x11\x003\x11\x1299\ +\x18\x10\xc6\xc4++\x00\x1a\x18\x10\xcd++\x00\x18\x10\ +\xc6+\x10\xc4\x11\x12910%26\x1254&\ +#\x22\x07'63 \x11\x14\x02\x06#\x22'\x06#\ +\x22&54\x12632\x17\x07&#\x22\x06\x02\x15\ +\x103267\x16\x16\x01\x07#\x22&'&&#\ +\x22\x06\x07#6632\x16\x17\x16\x163\x05\x14\x06\ +\x0776654'.\x0254632\x16\x03\ +J\x82\xae\x82UULR+mb\x01\x08\x9a\xe0\x96\ +obpc\x98\xa7\x88\xcc\x83eO7CCP\xa2\ +x\xe1>p%'l\x02\x0b\x11\x107n[*O\ +/>Q\x0ac\x16\x81_/g\x5cLL0\xfe\xde\ +pW\x0a(:\x1d\x08\x14%+#38H\x98\x01\ +s\xafs\x7f/R9\xfe\xb2\xd8\xfei\xa755\xbb\ +\xc3\xc2\x01l\xb8>T6\x96\xfe\xaf\x9a\xfe\xd5(\x19\ +\x1d$\x06\x1cR\x1c,\x14\x1b=8^e\x17(#\ +\x11\x97Jq\x12=\x0a3\x15\x19\x0d\x04\x09\x1c\x18\x1f\ + 7\x00\x00\x02\x00\xaa\xff\xec\x07\x10\x06\xfc\x007\x00\ +E\x00K@'=A=AE \x09\x0fHE@\ +;?B\x1a\x10\x1a**\x13\x1a\x00\x1f\x1a\x1fIY\ +\x06\x1a\x040&\x13&IY\x0d\x13\x13\x00?3+\ +\x11\x003\x18?3+\x11\x003\x11\x129\x18/\x11\ +9\x10\xd622\x1a\xcd+99//10\x01\x22\ +\x06\x07'63 \x11\x14\x02\x02\x06#\x22&'\x06\ +\x06#\x22&5\x10\x12\x0032\x17\x07&#\x22\x06\ +\x02\x02\x15\x10!26773\x07\x06\x15\x1432\ +6\x12\x1254&\x03\x07\x07#'#\x07#'#\ +\x07#'7\x05\xb6;].-w\x87\x01Ol\xb7\ +\xdc\x8cp\x92\x16)\xb3j\xb7\xc6\xaa\x01\x0b\xb1\x86d\ +9Za]\xb3\x93Q\x01\x1bz\x8e#5m)\x13\ +\xcft\xbb\x94X{\x08\x06s\x0c\x1d\xcbP\x0c\x1f\xca\ +N\x0c-\x06\x05m!\x19TD\xfeE\xbd\xfeb\xfe\ +\xc3\x8cd\x5cWi\xf5\xf6\x01\x04\x01\xe9\x01\x07HV\ +@\x8c\xfe\xeb\xfe\xad\x98\xfeg\x96\x9f\xf4\xc9Y6\xd1\ +\x99\x01'\x01p\x9c\xaa\xaf\x01\x8f\x1b\xa4uuuu\ +\xa4\x1b\x00\x00\x02\x00s\x00\x00\x05j\x05\xb0\x00\x16\x00\ +$\x001@\x19\x1c \x1c $ \x09\x10H$\x1a\ +\x1e!\x06\x15\x0e\x07\x01\x0f\x0b\x05\x05\x13\x00\x15\x00?\ +22\x113?3399\xd622\xcd+99\ +//103\x033\x13\x16\x17\x01\x033\x13\x16\x17\ +6\x12\x133\x02\x00\x07#\x03#\x01\x01\x07\x07#'\ +#\x07#'#\x07#'7\xf2\x7fbL\x18\x06\x01\ +TEb\x5c\x1c\x09\xb3\xe4@b>\xfe\xf3\xd7c=\ +\x04\xfe\xc0\x03]\x07r\x0d\x1c\xcbP\x0c\x1f\xcbM\x0d\ +-\x06\x04?\xfd[\xefI\x01\xe0\x01\xfd\xfdq\xcb\x83\ +\xb3\x01\xde\x01L\xfe\x9d\xfd\xf0\xcc\x01\xc9\xfe7\x05\xb0\ +\x1a\xa4tttt\xa4\x1a\x00\x00\x01\x00\xaa\xfe\x14\x04\ +\xf4\x05\xcb\x00\x17\x00\x1c@\x0e\x0b\x1b\x13\x00IY\x13\ +\x04\x0c\x07IY\x0c\x13\x00?+\x00\x18?+\x00\x18\ +?10\x01\x22\x04\x02\x15\x14\x16327\x03#\x13\ +&\x025\x10\x12$32\x17\x07&\x03\xc1\xc5\xfe\xcb\ +\xb5\xd9\xbd6\x1e}ff\xde\xf7\xd1\x01h\xde\xb1\x82\ +-\x80\x05m\xd1\xfep\xf1\xdd\xf6\x08\xfd\xc4\x01\xda\x09\ +\x01#\xfd\x01\x0a\x01\xbc\xeeDZ@\x00\x01\x00f\xfe\ +\x14\x03\x89\x04P\x00\x18\x00\x1c@\x0e\x04\x1b\x0d\x12F\ +Y\x0d\x10\x05\x00GY\x05\x16\x00?+\x00\x18?+\ +\x00\x18?10%27\x03#\x13\x07\x22&54\ +\x12632\x17\x07&#\x22\x06\x02\x15\x14\x16\x01\xe7\ +XL\x81bd\x1f\xbd\xca\x97\xfa\xa1\x86k\x1cko\ +\x83\xd0s\x94F$\xfd\xaa\x01\xd5\x01\xde\xc7\xc1\x01T\ +\xae+Z/\x9b\xfe\xe2\xb2\x9a\xaf\x00\x00\x01\x00\xa8\x00\ +'\x04^\x04\xd9\x00\x13\x00\x18@\x0e\x0c\x0d\x10\x12\x13\ +\x08\x09\x00\x02\x03\x0a\x0e\x04\x0e\x00//\x12\x1791\ +0\x01\x05\x07%\x03'\x13%7\x05\x13%7\x05\x13\ +\x17\x03\x05\x07%\x021\x01\x1d'\xfe\xe3\xb4H\xb5\xfe\ +\xe5'\x01\x1d\xe7\xfe\xe5%\x01\x1d\xb6F\xb7\x01\x1f)\ +\xfe\xe6\x01\xa4\xa6B\xa4\xfe\xc7)\x01;\xa6@\xa4\x01\ +\x93\xa4D\xa4\x015%\xfe\xc5\xa4B\xa4\x00\x00\x01\x01\ +u\x04\xa8\x04H\x05\x9e\x00\x11\x00\x0c\xb3\x02\x0b\x09\x00\ +\x00/\xcd2310\x01\x06#\x22&5463\ +!6632\x16\x15\x14\x07\x02\x14\x06R\x22%:\ +:\x01\xbb\x05*+\x22(y\x04\xfeV$\x1d,3\ +++\x22\x22W\x05\x00\x00\x01\x01\x93\x04\xee\x04u\x05\ +\xae\x00\x17\x00\x10\xb5\x10\x06\x80\x17\x0c\x16\x00/33\ +\x1a\xcd210\x012676632\x16\x15\x14\ +\x07#654#\x22\x06\x07\x06##7\x01\xb24\ +yd:uBXi\x04]\x05i,cc\xa4r\ +\x15\x11\x05?\x17#\x14!LC\x1f\x10\x0d\x11V\x19\ +$9Q\x00\x01\x02\x8f\x04\xe7\x03\x5c\x06\x1d\x00\x0e\x00\ +\x0c\xb3\x09\x03\x80\x0c\x00/\x1a\xcc910\x0146\ +32\x15\x14\x07\x06\x15\x14\x17\x15&&\x02\x8f0&\ +P%+wjc\x05\xb8,9>'\x0c\x11\x149\ +%B\x22n\x00\x00\x01\x02\xae\x04\xe7\x03{\x06\x1d\x00\ +\x10\x00\x0c\xb3\x06\x0e\x80\x03\x00/\x1a\xcc910\x01\ +\x14\x06\x075654'.\x025432\x16\x03\ +{jcw+\x14\x0c\x05P&0\x05\xb8Kk\x1b\ +B%9\x14\x11\x0a\x10\x10\x09>9\x00\x08\x00)\xfe\ +\xc1\x07\xc1\x05\x91\x00\x0c\x00\x1a\x00(\x006\x00D\x00\ +R\x00_\x00m\x00`@0\x1a\x13\x10\x17(!\x1e\ +%6/,3_YV\x5cmfcjD=:\ +ARKHO\x00\x07\x03\x09%3j\x5cAOO\ +A\x5cj3%\x06\x09\x17\x09\x00//\x12\x179/\ +/////\x10\xcd\xcd2\x10\xcd\xc42\x10\xcd\xc4\ +2\x10\xcd\xc42\x10\xcd\xc42\x10\xcd\xc42\x10\xcd\xc4\ +2\x10\xcd\xc4210\x01&&#\x22\x06\x07#6\ +32\x16\x17\x03&&#\x22\x06\x07#6632\ +\x16\x17\x01&&#\x22\x06\x07#6632\x16\x17\ +!&&#\x22\x06\x07#6632\x16\x17\x01&\ +&#\x22\x06\x07#6632\x16\x17!&&#\ +\x22\x06\x07#6632\x16\x17\x01&&#\x22\x06\ +\x07#632\x16\x17!&&#\x22\x06\x07#6\ +632\x16\x17\x04o\x05\x00\x0c\xb3\ +\x07\x05\x17\x15\x00/\xc6/\xc610\x05\x17\x06\x06\x07\ +#67\x017\x16\x16\x17\x15&'\x01'667\ +3\x06\x07\x01&&'7\x17\x16\x16\x17%\x07\x06\x07\ +'67\x03'&'7\x16\x17%\x17\x06\x07'7\ +66\x01\x07&&'5\x16\x17\x047\x0b\x11F$\ +a5\x11\x02s\x0eG\xc8A\xdd\x81\xfdR\x0b\x13I\ +\x1fa4\x12\x02!\x1f\x82&b\x11'Z\x16\xfc\x19\ +\x02\x9b\xa9E\xb1x+\x11REC{L\x04%E\ +\xb1xb\x02C\xbe\xfbW\x0eB\xbfO\xdd\x81#\x0e\ +B\xbfO\xdd\x81\x02\xae\x0b\x13I\x1fa5\x11\x02u\ +\x0eG\xc8A\xdc\x82\xfa\xb82\xc34b\x02E\xc2<\ +\xba\x10Y?DnX\x02\xde\x02\x8c\xb7F\xc6c\xd3\ +DnXb\x10'X\xfd<\x0b\x11F$a5\x11\ +\x00\x00\x02\x00f\xfe\x9c\x05b\x07J\x00\x11\x00\x22\x00\ +(@\x14\x11\x12\x0c\x07IY\x04\x0c\x12\x0a\x22\x22\x1a\ +\x80 \x15\x0f\x05\x00\x03\x00?22\xd62\x1a\xcc2\ +??3+\x00\x18?10\x013\x03\x06\x07\x013\ +\x013\x03#\x13#\x13\x127\x01#\x01\x06\x06#\x22\ +&5473\x06\x15\x14\x16327\x01\x9cf\xba\ +)6\x04\x0bn\xfe\xdd\xa4\xd9r\xd0\xa1\xb860\xfb\ +\xe6e\x04}\x11\xbb\x96\x85\x89\x0cR\x08Ue\xe7\x1b\ +\x05\xb6\xfc\x92\xc5\xd1\x05\x04\xfa\xa8\xfe>\x01d\x03`\ +\x01\x05\xb6\xfa\xe5\x07J\x89\x96ng(\x22-\x11D\ +G\xc9\x00\x00\x02\x00m\xfe\x91\x04+\x05\xfa\x00\x1c\x00\ +-\x00/@\x18-%\x80+ \x14\x12\x0b\x1c\x0f\x16\ +\x06FY\x16\x16\x12\x0dHY\x12\x15\x10\x22\x00??\ ++\x00\x18?+\x00\x18?3\x129\xd62\x1a\xcc2\ +10\x01\x03\x06\x15\x14\x1632667\x133\x03\ +3\x03#\x13#7#\x06#\x22&547\x13\x01\ +\x06\x06#\x22&5473\x06\x15\x14\x16327\ +\x01}\x98\x16_[n\xc3\x85!ib\xd7\xa4\xc9u\ +\xcf\x95\x1c\x06\xa7\xec\x84\x86\x16\x96\x03\x0a\x11\xbb\x96\x8c\ +\x83\x0cR\x08Uf\xe7\x1b\x04?\xfdFj8JS\ +\x83\xf3\x9e\x01\xe5\xfc\x11\xfeA\x01o\xcd\xdd|w<\ +n\x02\xb2\x01\xbb\x88\x97ta(\x22-\x11DG\xc9\ +\x00\x00\x02\x00f\x00\x00\x03\xe3\x05\xb6\x00\x12\x00\x1b\x00\ +3@\x1a\x0e\x06\x07\x06IY\x0b\x07\x07\x04\x09\x0f\x13\ +IY\x0f\x0f\x04\x09\x03\x04\x14IY\x04\x12\x00?+\ +\x00\x18?\x129/+\x11\x12\x009\x18/3+\x11\ +\x00310\x01\x14\x04#!\x13#7373\x07\ +!\x07!\x0332\x16%\x0332654&#\ +\x03\xe3\xfe\xea\xfc\xfe\x95\xf6\xa2\x15\xa2+h+\x01H\ +\x13\xfe\xb7L\xe7\xbb\xc8\xfd\x83\x87\xf0\xcc\xde\x95\x96\x01\ +\xd1\xde\xf3\x04\x91_\xc6\xc6_\xfe\x9a\xb3Y\xfd\x89\xb8\ +\xb9\x86\x80\x00\x02\x00\x8d\xff\xec\x03}\x06\x14\x00\x17\x00\ +%\x009@\x1d\x04\x0c\x07\x03\x13\x14\x13HY\x00\x14\ +\x14\x0c\x16\x07\x18FY\x07\x07\x0c\x16\x00\x0c GY\ +\x0c\x16\x00?+\x00\x18?\x129/+\x11\x12\x009\ +\x18/3+\x11\x003\x11\x12910\x013\x07#\ +\x03763 \x11\x14\x06#\x22&547\x13#\ +73\x133\x13\x22\x06\x07\x06\x15\x14\x163265\ +4&\x01\xae\xf4\x13\xf1\x838ua\x01T\xdf\xc1\xa3\ +\xad\x1f\x8d\xa6\x11\xa6=e+N\x8b6\x18q\x84\x8f\ +\xa3\x81\x05\x04R\xfd\x9a\x0a\x14\xfe\xe8\xa2\xc4\x9e\x99]\ +\x9b\x02\x97R\x01\x10\xfc\x00\x15\x09xKzs\x8az\ +hb\x00\x00\x02\x00f\x00\x00\x04y\x05\xb6\x00\x0e\x00\ +\x1b\x00=@\x1f\x04\x0a\x0b\x14\x12\x15\x15\x12\x14\x03\x0f\ +\x1b\x02\x05\x08\x0b\x0f\x08IY\x0f\x0f\x0b\x0a\x12\x0b\x1b\ +IY\x0b\x03\x00?+\x00\x18?\x129/+\x11\x12\ +\x0099\x11\x12\x179\x18///\x11\x12910\ +\x01\x10\x05\x17\x07'\x06##\x03#\x01!2\x16\x01\ +327'7\x17665\x10!#\x04y\xfe\xf8\ +bThn\x92\xc9\x81g\x016\x01;\xca\xd8\xfc\xe5\ +\xbf{V_Vcf^\xfe\xb7\xd3\x04N\xfe\xb8p\ +\xc9)\xd3\x1d\xfd\xa6\x05\xb6\xb9\xfd\xb9\x15\xc4)\xcf/\ +\xae\x82\x01\x12\x00\x00\x02\xff\xdf\xfe\x14\x04\x1b\x04T\x00\ +\x17\x00)\x00@@%\x15\x06\x0d$ \x09\x0cH%\ +\x22$\x03 \x18\x0a\x02\x16\x13\x04\x00\x0d\x07\x0f\x06\x1b\ +\x0d\x18GY\x0d\x10\x00 FY\x00\x16\x00?+\x00\ +\x18?+\x00\x18??\x11\x12\x179\x11\x12\x179+\ +\x11\x12910\x05\x22'#\x07\x03#\x013\x033\ +6632\x16\x15\x14\x02\x07\x17\x07'\x06\x13\x22\x06\ +\x06\x02\x15\x14\x16327'7\x176\x125\x10\x01\ +\xf2\xe61\x04%pc\x01PR-\x06[\xd1|\x87\ +\x92\xa6\x8egTdN\xa4W\xae\x95H{kD;\ +eVal\x87\x10\xdb\xb4\xfd\xfd\x06+\xfe\xee\x99\x8e\ +\xb9\xbe\xd2\xfe\x8c^\xd1)\xcf\x1e\x04\x0au\xda\xfe\xff\ +P}\x97\x18\xcd)\xc9R\x01J\xac\x01'\x00\x01\x00\ +f\x00\x00\x04`\x05\xb6\x00\x0d\x00$@\x12\x06\x0a\x0b\ +\x0aJY\x03\x0b\x0b\x0d\x08\x12\x0d\x02IY\x0d\x03\x00\ +?+\x00\x18?\x129/3+\x11\x00310\x01\ +\x07!\x03!\x07!\x03#\x13#73\x13\x04`\x14\ +\xfd\xa4\x81\x01O\x12\xfe\xb2\x91g\x92\x92\x13\x8f\x94\x05\ +\xb6^\xfd\xa6R\xfdT\x02\xacR\x02\xb8\x00\x00\x01\x00\ +\x17\x00\x00\x03#\x04?\x00\x0d\x00$@\x12\x0c\x02\x03\ +\x02HY\x09\x03\x03\x05\x00\x15\x05\x08HY\x05\x0f\x00\ +?+\x00\x18?\x129/3+\x11\x003103\ +\x13#73\x13!\x07!\x03!\x07!\x03Hj\x9b\ +\x12\x9ah\x01\xf8\x13\xfemV\x01\x12\x12\xfe\xedj\x02\ +\x02P\x01\xedQ\xfedP\xfd\xfe\x00\x00\x01\x00V\xfe\ +\x00\x04`\x05\xb6\x00\x1d\x00.@\x18\x09\x04\x0b\x0b\x00\ +IY\x0b\x0b\x05\x04\x12\x05\x08IY\x05\x03\x12\x17I\ +Y\x12\x1c\x00?+\x00\x18?+\x00\x18?\x129/\ ++\x11\x12\x00910\x01\x22\x07\x03#\x01!\x07!\ +\x03632\x00\x15\x14\x02\x04#\x22'5\x1632\ +6\x1254&\x01\xe5>E\x91k\x016\x02\xc4\x14\ +\xfd\xa4{D=\xec\x01\x03\xae\xfe\xd1\xcd\x86_ww\ +\xa9\xfd\x93\xd9\x02\xc1\x09\xfdH\x05\xb6^\xfd\xba\x0b\xfe\ +\xf3\xf3\xed\xfe\x89\xb9)h3\xa2\x01L\xcb\xc9\xe1\x00\ +\x01\x00H\xfe\x0e\x03'\x04?\x00\x1e\x00.@\x18\x15\ +\x10\x17\x17\x0cGY\x17\x17\x11\x10\x15\x11\x14HY\x11\ +\x0f\x00\x05FY\x00\x1b\x00?+\x00\x18?+\x00\x18\ +?\x129/+\x11\x12\x00910\x01\x22'5\x16\ +326\x1254&#\x22\x07\x03#\x13!\x07!\ +\x03632\x16\x16\x15\x14\x02\x06\x01\x1ffLXb\ +z\xbaf\x96\x85O@mb\xe3\x01\xf8\x13\xfemR\ +9Lp\xa7`\x87\xea\xfe\x0e%c0\x9f\x01\x1e\xae\ +\x9a\xb0\x11\xfd\xf6\x04?Q\xfez\x0d_\xbb\x88\xca\xfe\ +\xaf\xaa\x00\x00\x01\xff\xa8\xfe\x9c\x06\x96\x05\xb6\x00\x15\x00\ +(@\x15\x03\x06\x10\x13\x04\x0f\x07\x04\x01\x03\x12\x15\x0f\ +\x0d\x22\x0f\x0aIY\x0f\x12\x00?+\x00\x18?\x113\ +3?33\x12\x17910\x01\x013\x01\x133\x03\ +\x013\x01\x013\x03#\x13#\x01\x03#\x13\x01#\x02\ +\x81\xfeX}\x01\x9e\x93g\x98\x02\xb4\x8c\xfd3\x01{\ +\x95biP^\xfeR\x9af\x9e\xfdE\x8d\x02\xf8\x02\ +\xbe\xfd@\x02\xc0\xfd>\x02\xc2\xfd+\xfd}\xfe>\x01\ +d\x02\xe1\xfd\x1f\x02\xe3\xfd\x1d\x00\x01\xff\xcd\xfe\x93\x06\ +{\x04P\x00=\x00@@\x22\x07\x0b$\x0bFY(\ +$$\x09&\x0f\x09\x15=\x222\x1b \x1bGY-\ + \x109\x14\x0f\x14GY\x00\x0f\x16\x00?3+\x11\ +\x003\x18?3+\x11\x003\x18???\x129/\ +3+\x11\x00310\x05\x07# \x1147#\x03\ +#\x13#\x0e\x02#\x22'7\x16326\x1254\ +&#\x22\x07563 \x11\x14\x073\x133\x033\ +>\x0232\x17\x07&#\x22\x06\x02\x15\x14\x1632\ +7\x03#\x05R\x0d\x0e\xfe\xb2\x09\xa6m`m\x9e\x1e\ +\x8c\xce\x82K<\x128Gt\xbcnv~4\x01d\x02\xd9\xfd'\x05\xb6\xfd)\x02\xd7\xfd#\x00\ +\x01\x00H\xfe\x93\x03\xec\x04?\x00\x0e\x00\x22@\x12\x09\ +\x0e\x02\x03\x08\x00\x0c\x0f\x0b\x15\x06\x22\x08\x03HY\x08\ +\x15\x00?+\x00\x18???3\x12\x17910\x01\ +3\x01\x013\x03#\x13#\x01\x03#\x133\x03\x03Z\ +\x92\xfd\xa1\x01X{fdQE\xfeyqb\xe1b\ +n\x04?\xfd\xea\xfe'\xfeC\x01m\x02%\xfd\xdb\x04\ +?\xfd\xf4\x00\x01\x00f\x00\x00\x05\x1b\x05\xb6\x00\x12\x00\ +/@\x1d\x0f\x08\x1f\x08/\x08\x8f\x08\x04\x01\x06\x00\x07\ +\x0a\x0d\x10\x07\x04\x08\x12\x08\x12\x03\x0b\x04\x03\x0f\x03\x12\ +\x00?3?3\x1299//\x11\x179]10\ +\x01\x07\x03#\x013\x03773\x07\x013\x01\x01#\ +\x01\x03#\x01\xf8\xa8\x83g\x016f\x9c\xac6V!\ +\x02\x14\x8a\xfdE\x01so\xfe\xd7CV\x03\x02\x87\xfd\ +\x85\x05\xb6\xfd8\x93\xf8\x9c\x01\xd9\xfd\x9e\xfc\xac\x02\xac\ +\xfe\xc5\x00\x00\x01\x00H\x00\x00\x03\xec\x04?\x00\x13\x00\ +6@\x10\x02\x13\x12\x05\x06\x09\x0c\x0d\x08\x10\x0f\x0b\x1f\ +\x0b\x02\x00\xb8\xff\xc0@\x0e\x09\x0dH\x00\x0b\x00\x0b\x0f\ +\x03\x10\x0f\x08\x0f\x15\x00?3?3\x1299//\ ++]\x11\x17910\x013\x07\x013\x01\x07\x01#\ +\x03\x07#\x13'\x03#\x133\x037\x02\x02V+\x01\ +-\x92\xfe\x221\x01D\x7f\xdf0VDfqb\xe1\ +bn\xa6\x03\xf6\xcb\x01\x14\xfe[\xe2\xfeH\x019\xdf\ +\x01<\x8f\xfd\xdb\x04?\xfd\xf4\x98\x00\x00\x01\x00f\x00\ +\x00\x05\x1b\x05\xb6\x00\x14\x007@!\x10\x14\x02\x03\x05\ +\x0a\x0f\x07\x08\x07JY\x0c\x0f\x08\x1f\x08o\x08\x7f\x08\ +\x8f\x08\x05\x08\x08\x05\x12\x0a\x03\x01\x05\x12\x00?3?\ +3\x129/]3+\x11\x003\x11\x12\x17910\ +!#\x01\x07\x03#\x13#7373\x073\x07#\ +\x037\x013\x01\x03\xd3o\xfe\xaa\xbe\x83g\xf6\xa4\x13\ +\xa4-f/\xdf\x12\xdf]\x85\x02\xa8\x8a\xfdE\x03\x14\ +\x99\xfd\x85\x04\x8dR\xd7\xd7R\xfeVy\x02Z\xfd\x9e\ +\x00\x00\x01\x00L\x00\x00\x03\xec\x06\x14\x00\x15\x004@\ +\x1e\x15\x03\x06\x03\x09\x01\x13\x0b\x0c\x0bHY\x10\x0f\x0c\ +\x1f\x0c/\x0c\x03\x0c\x0c\x01\x0e\x00\x01\x0f\x05\x09\x15\x00\ +?3??\x129/]3+\x11\x003\x11\x12\x17\ +910\x01\x013\x01\x01#\x01\x07\x03#\x01#7\ +373\x07!\x07!\x03\x03\x01\x0e\x02a}\xfe&\ +\x01)j\xfe\xf8\xcdP`\x01\x0e\x8d\x10\x8d,`+\ +\x01y\x11\xfe\x87jF\x01\xdd\x02b\xfe+\xfd\x96\x02\ +/\xbc\xfe\x8d\x05\x02N\xc4\xc4N\xfe\x06\xfe\xd5\x00\x00\ +\x01\x00\xc1\x00\x00\x05\x98\x05\xb6\x00\x0c\x00!@\x11\x06\ +\x03\x00\x03\x08\x0b\x01\x03\x05\x08\x12\x0b\x0aIY\x0b\x03\ +\x00?+\x00\x18?3?\x11\x12\x17910\x01\x01\ +3\x01\x01#\x01\x03#\x01!7!\x01\xf6\x03\x12\x90\ +\xfc\xd7\x023\x81\xfd\xd5\x98f\x01!\xfe\xa8\x14\x01\xbe\ +\x02\xdf\x02\xd7\xfd#\xfd'\x02\xd9\xfd'\x05X^\x00\ +\x01\x00R\x00\x00\x04w\x04?\x00\x0c\x00!@\x11\x09\ +\x03\x06\x03\x0b\x01\x04\x0f\x08\x0b\x15\x01\x00HY\x01\x0f\ +\x00?+\x00\x18?3?\x11\x12\x17910\x137\ +!\x03\x013\x01\x01#\x01\x03#\x13R\x14\x01\xb1o\ +\x02=\x92\xfd\xa2\x01\x93\x7f\xfeyqb\xd1\x03\xeeQ\ +\xfd\xf4\x02\x0c\xfd\xea\xfd\xd7\x02%\xfd\xdb\x03\xee\x00\x00\ +\x01\x00f\xfe\x9c\x05\x5c\x05\xb6\x00\x0f\x00%@\x14\x07\ +\x02IY\x07\x07\x00\x09\x05\x03\x04\x12\x0e\x22\x00\x0bI\ +Y\x00\x12\x00?+\x00\x18???3\x129/+\ +10!\x13!\x03#\x013\x03!\x133\x013\x03\ +#\x13\x03\xc3\x97\xfd\x08\x95g\x016f\x8b\x02\xf8\x89\ +d\xfe\xdf\xa8bhO\x02\xcf\xfd1\x05\xb6\xfdw\x02\ +\x89\xfa\xa8\xfe>\x01d\x00\x01\x00J\xfe\x93\x04m\x04\ +?\x00\x0f\x00%@\x14\x01\x0cGY\x01\x01\x0a\x03\x0f\ +\x0f\x0e\x15\x08\x22\x0a\x05FY\x0a\x15\x00?+\x00\x18\ +???3\x129/+10\x01\x03!\x133\x03\ +3\x03#\x13#\x13!\x03#\x13\x01\x93d\x02qh\ +e\xd7\xb2gdT\xb2n\xfd\x90od\xe9\x04?\xfe\ +!\x01\xdf\xfc\x15\xfe?\x01m\x02\x04\xfd\xfc\x04?\x00\ +\x01\x00f\x00\x00\x06\xcb\x05\xb6\x00\x0d\x00$@\x13\x0a\ +\x05IY\x0a\x0a\x07\x0c\x08\x03\x03\x07\x12\x0c\x01IY\ +\x0c\x03\x00?+\x00\x18?3?\x11\x129/+1\ +0\x01!\x01#\x13!\x03#\x013\x03!\x13!\x06\ +\xb8\xfe\x90\xfe\xdfd\x97\xfd\x08\x95g\x016f\x8b\x02\ +\xf8\x89\x01\xd3\x05X\xfa\xa8\x02\xcf\xfd1\x05\xb6\xfdw\ +\x02\x89\x00\x00\x01\x00J\x00\x00\x05\xba\x04?\x00\x0d\x00\ +$@\x13\x08\x03GY\x08\x08\x05\x0a\x06\x0f\x01\x05\x15\ +\x0a\x0dHY\x0a\x0f\x00?+\x00\x18?3?\x11\x12\ +9/+10!#\x13!\x03#\x133\x03!\x13\ +!\x07!\x03\x85fn\xfd\x90od\xe9`d\x02q\ +h\x01\xb2\x14\xfe\xb6\x02\x04\xfd\xfc\x04?\xfe!\x01\xdf\ +Q\x00\x01\x00f\xfe\x00\x07=\x05\xb6\x00\x1f\x000@\ +\x19\x08\x05\x0a\x0a\x1dIY\x0a\x0a\x06\x01\x05\x12\x06\x03\ +IY\x06\x03\x11\x16IY\x11\x1c\x00?+\x00\x18?\ ++\x00\x18?3\x129/+\x11\x12\x00910!\ +#\x01!\x01#\x01!\x03632\x00\x15\x14\x02\x04\ +#\x22'5\x16326\x1254&#\x22\x07\x04\ +'d\x01 \xfd\x0b\xfe\xdfg\x016\x03\xc0\x8fD=\ +\xec\x01\x03\xae\xfe\xd1\xcd\x86_ww\xa9\xfd\x93\xd9\xbf\ +>E\x05V\xfa\xaa\x05\xb6\xfd\x5c\x0b\xfe\xf3\xf3\xed\xfe\ +\x89\xb9)h3\xa2\x01L\xcb\xc9\xe1\x09\x00\x00\x01\x00\ +F\xfe\x0e\x06\x02\x04?\x00 \x000@\x19\x01\x1f\x03\ +\x03\x17GY\x03\x03 \x1b\x1f\x15 \x1dGY \x0f\ +\x0b\x10FY\x0b\x1b\x00?+\x00\x18?+\x00\x18?\ +3\x129/+\x11\x12\x00910\x01\x03632\ +\x16\x16\x15\x14\x02\x06#\x22'5\x16326\x125\ +4&#\x22\x07\x03#\x13!\x03#\x13\x04hdD\ +Cp\xa7`\x87\xea\x97hJXbz\xbaf\x96\x85\ +?Rmh\xd5\xfd\x8f\xd5d\xe7\x04?\xfe)\x0d_\ +\xbb\x88\xca\xfe\xaf\xaa%c0\x9f\x01\x1e\xae\x9a\xb0\x11\ +\xfd\xf6\x03\xe3\xfc\x1d\x04?\x00\x00\x02\x00\xac\xff\xae\x05\ +m\x05\xcb\x00.\x00<\x00N@+%/#6\x0e\ +\x04\x10,\x0b\x06IY\x0b\x10,6IY\x00,\x10\ +, ,\x03\x09\x03,,\x10\x17\x17\x1cIY\x17\x04\ +\x10#IY\x10\x13\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/_^]+\x00\x18\x10\xc4+\x11\x12\x009\ +9\x11\x129910\x01\x14\x02\x06\x07\x16327\ +\x15\x06#\x22&'\x06#\x22\x00\x11\x10\x12$32\ +\x17\x07&#\x22\x04\x02\x15\x14\x16327&&5\ +4\x12632\x16\x0166\x1254&#\x22\x06\ +\x02\x15\x14\x16\x05mh\xb8t?kG4\x01d\x00\x01\x00H\xfe\x93\x06s\x04\ +P\x009\x002@\x1a\x1d\x17\x13\x1a\x14\x0f\x08\x13\x15\ +0\x22\x03\x0d\x1a\x0dFY!\x1a\x101,HY1\ +\x16\x00?+\x00\x18?3+\x11\x003\x18??3\ +?\x11\x129910\x014&#\x22\x02\x07\x03#\ +\x13654#\x22\x06\x06\x07\x03#\x133\x0736\ +632\x16\x1736632\x16\x15\x14\x06\x07\x03\ +\x06\x15\x14327\x03#\x13&&5466\x13\ +6\x05\xfaVL\x9d\xf10mf\x93\x19\x9aj\xbc\x82\ +#db\xe7P!\x06P\xcbojr\x03\x06M\xd0\ +vu\x83\x05\x11R\x17T\x1f!edP=D\x07\ +\x07Z\x19\x03XMU\xfe\xed\xe1\xfd\xfa\x02\xa2}%\ +\xb6\x87\xf2\xa6\xfe%\x04?\xd2qr\x86\x80\x81\x85{\ +s\x1d7\x5c\xfe\x8dg8a\x07\xfeM\x01_\x07Y\ +F\x156,\x01\x99x\xff\xff\x00\xc1\x00\x00\x04\x83\x05\ +\xb6\x02\x06\x00<\x00\x00\x00\x01\x00q\xfe\x14\x03\xe5\x04\ +?\x00\x0d\x00\x10\xb6\x0d\x07\x03\x09\x0f\x07\x1b\x00??\ +3\x12910%66\x013\x01\x03#\x13\x033\ +\x13\x16\x17\x01h >\x01\xb9f\xfd\x9cf]e\xb2\ +dm\x12\x0efCy\x03\x1d\xfb\xb1\xfe$\x01\xde\x04\ +M\xfd!v\x84\x00\x01\x00\x83\x00\x00\x04\x83\x05\xb6\x00\ +\x10\x00)@\x15\x00\x03\x0e\x03\x09\x0f\x07\x0b\x0c\x0bJ\ +Y\x04\x0c\x0c\x09\x01\x0f\x03\x09\x12\x00??3\x129\ +/3+\x11\x003\x11\x12\x17910\x01\x013\x01\ +\x07!\x07!\x03#\x13!7!7\x033\x01\xee\x02\ + u\xfd\x89\x0a\x01!\x13\xfe\xe2RiX\xfe\xf4\x13\ +\x01\x0a\x0e\xedd\x02\x85\x031\xfc\x5c-R\xfem\x01\ +\x93R<\x03\x95\x00\x01\x00\x1b\xfe\x14\x03\xe5\x04?\x00\ +\x13\x00%@\x12\x07\x06\x06\x00\x0a\x02\x0f\x11\x1b\x0f\x13\ +\x00\x13HY\x0c\x00\x15\x00?2+\x11\x003\x18?\ +?3\x129\x1131033\x033\x13\x16\x173\ +66\x013\x013\x07#\x03#\x13#-\xf4\xb0d\ +m\x12\x0e\x06 >\x01\xb9f\xfd\xa4\xf4\x13\xf7X]\ +V\xf9\x04?\xfd!v\x84Cy\x03\x1d\xfb\xc1R\xfe\ +f\x01\x9a\x00\x01\xffy\xfe\x9c\x04}\x05\xb6\x00\x0f\x00\ +\x22@\x12\x0b\x0e\x05\x03\x04\x0c\x09\x03\x07\x12\x04\x0fI\ +Y\x04\x12\x02\x22\x00??+\x00\x18??3\x12\x17\ +910%\x03#\x13#\x03\x01#\x01\x013\x13\x01\ +3\x01\x13\x03\xddbiP^\xfe\xfd\xf2\x7f\x02`\xfe\ +\xf0j\xf0\x01\xe3w\xfd\xd5\xf8^\xfe>\x01d\x02\xa6\ +\xfdZ\x02\xfe\x02\xb8\xfd\x8e\x02r\xfd1\xfdw\x00\x00\ +\x01\xff\xb8\xfe\x93\x03\xba\x04;\x00\x0f\x00\x22@\x12\x0b\ +\x0e\x05\x03\x04\x0c\x09\x0f\x07\x15\x04\x0fHY\x04\x15\x02\ +\x22\x00??+\x00\x18??3\x12\x17910%\ +\x03#\x13#\x03\x01#\x01\x033\x13\x013\x01\x13\x03\ +ffdRT\xe0\xfewy\x01\xd7\xf5d\xcf\x01u\ +x\xfe@\xddP\xfeC\x01m\x01\xdf\xfe!\x02+\x02\ +\x10\xfe2\x01\xce\xfd\xea\xfe+\x00\x01\x00\xc1\xfe\x9c\x06\ +H\x05\xb6\x00\x0f\x00'@\x14\x08\x03\x0d\x22\x05\x01\x02\ +\x01IY\x02\x03\x0a\x06\x0f\x06IY\x0f\x12\x00?+\ +\x11\x003\x18?+\x11\x003\x18??10\x01!\ +7!\x07!\x01!\x013\x013\x03#\x13!\x02q\ +\xfeP\x14\x03\xcd\x13\xfeH\xfe\xf4\x02\xf6\x01\x22e\xfe\ +\xdf\xa8biP\xfb\xfc\x05X^^\xfb\x06\x05X\xfa\ +\xa8\xfe>\x01d\x00\x01\x00T\xfe\x93\x04\xdb\x04?\x00\ +(\x00/@\x18\x1c\x1f'\x0c\x0f\x16\x22\x01&'&\ +HY'\x0f\x12\x07\x1f\x07FY\x17\x1f\x16\x00?3\ ++\x11\x003\x18?+\x11\x003\x18??\x11\x129\ +10\x01!\x03\x06\x15\x14\x1632667\x133\ +\x03\x06\x15\x14327\x03#\x13&&57#\x06\ +\x06#\x22&547\x13!7!\x03b\xfe\xb9\x85\ +\x17_[m\xc2\x84$ib\xa4\x16T\x17(dd\ +OA8\x03\x07N\xd2u\x85\x87\x16\x83\xfe\x9e\x14\x03\ +\x0f\x03\xee\xfd\x97c;JW\x82\xec\xa6\x01\xe5\xfd\x03\ +hBY\x07\xfeM\x01_\x0cRK8mv|w\ +\x01d\x00\x00\x01\x00\x9c\xfe\x93\x03\xfe\x04\ +?\x00\x1d\x00)@\x15\x01\x03\x09\x03\x10FY\x03\x03\ +\x1b\x14\x09\x0f\x19\x22\x1b\x16FY\x1b\x15\x00?+\x00\ +\x18??3\x129/+\x11\x12\x00910\x01#\ +\x06#\x22&547\x133\x02\x06\x15\x14\x1632\ +\x12773\x033\x03#\x13#\x136\x03?\x08\xa1\ +\xf0\x80\x8a\x16:dE\x0dYa\xa3\xfe0\x13b\xd7\ +\xb2feT\xb2T\x18\x02s\xddxuJf\x01\x0c\ +\xfe\xc2X\x1cJW\x01\x0f\xeaZ\xfc\x15\xfe?\x01m\ +\x01\x8fz\x00\x01\x00\xcd\x00\x00\x04\xae\x05\xb6\x00\x1d\x00\ +<@\x1e\x0f\x00\x01\x09\x03\x00\x00\x19\x01\x11\x11\x10\x1a\ +\x1c\x01\x13\x08\x10\x01\x10IY\x01\x01\x19\x16\x08\x03\x19\ +\x12\x00??3\x129/+\x11\x12\x009\x1199\ +\x119\x18/\x11\x129/_^]10%\x13#\ +\x22&547\x133\x03\x06\x15\x14\x1633\x133\ +\x0367\x133\x01#\x13\x06\x07\x03\x01\xc5A\x06\x92\ +\xa1\x16iff\x19ri\x0dOWP\x90\xa9\xa0d\ +\xfe\xcbe\x84\x99\xa1C\xdd\x015\x8b\x84@d\x01\xf1\ +\xfe\x1dt8\x5c^\x01x\xfe\x8e\x10D\x02\xef\xfaJ\ +\x02mB\x14\xfe\xc6\x00\x00\x01\x00\x9c\x00\x00\x03\xfe\x04\ +?\x00\x1f\x006@\x1a\x09\x06\x14\x16\x1f\x19\x07\x07\x06\ +\x1f\x18\x18\x10\x19\x19\x06FY\x19\x19\x10\x0d\x1f\x0f\x10\ +\x15\x00??3\x129/+\x11\x12\x009\x18/\x11\ +\x129/\x11\x1299\x11910\x01\x02\x06\x15\x14\ +\x163\x133\x036\x12773\x03#667#\ +\x06\x07\x03#\x13\x22&547\x13\x01PE\x0dW\ +_BV@\x89\xcb)\x13b\xeaf22-\x08\x83\ +\xba7V5\x80\x86\x16:\x04?\xfe\xc2X\x1cJW\ +\x013\xfe\xd7 \x01\x09\xc6Z\xfb\xc1\xe5\xe9\xa5\xb6!\ +\xfe\xf5\x01\x05{rJf\x01\x0c\x00\x00\x01\x00d\x00\ +\x00\x04F\x05\xb6\x00\x15\x00\x1f@\x0f\x01\x14\x03\x03\x10\ +IY\x03\x03\x14\x15\x03\x0a\x14\x12\x00?3?\x129\ +/+\x11\x12\x00910\x01\x03632\x16\x15\x14\ +\x07\x03#\x13654&#\x22\x07\x03#\x01\x01\xfe\ +\x83\xd4\xc3\x93\xa1\x17hgg\x18sh\xbd\xdf\x9fe\ +\x016\x05\xb6\xfd\x94Z\x8b\x83>f\xfe\x0e\x01\xe3o\ +=^]Z\xfd\x10\x05\xb6\x00\x00\x01\x00H\x00\x00\x03\ +\xaa\x04?\x00\x1a\x00\x1f@\x0f\x10\x0b\x14\x14\x06FY\ +\x14\x14\x0b\x0c\x0f\x00\x0b\x15\x00?3?\x129/+\ +\x11\x12\x00910!\x12654&#\x22\x02\x07\ +\x07#\x133\x06\x06\x0736632\x16\x15\x14\x06\ +\x03\x02\xf6E\x0dZa\xa6\xfc/\x12b\xe9g12\ +/\x08N\xd0t\x80\x8a\x10@\x01AV\x1bJX\xfe\ +\xea\xe4Z\x04?\xe2\xe8\xa8on|r*f\xfe\xd4\ +\x00\x00\x02\x00\x83\xff\xec\x05\xfc\x05\xcb\x00&\x000\x00\ +4@\x1a\x22\x22\x03\x0a\x1b&\x1bIY*&&\x16\ +\x03\x03'IY\x03\x04\x16\x0fIY\x16\x13\x00?+\ +\x00\x18?+\x11\x12\x009\x18/3+\x11\x003\x12\ +9\x18/10\x01\x12\x00!2\x16\x15\x14\x04!#\ +\x06\x15\x14\x163267\x15\x06\x06#\x22\x00\x114\ +7\x07\x22&5473\x06\x15\x143\x01\x22\x00\x03\ +3 $54&\x01mE\x01\x9d\x01\x15\xc7\xd1\xfe\ +1\xfe\x15\x81\x09\xd5\xcfj\xd0|~\xd2p\xf3\xfe\xf1\ +\x08\x1aXc\x1fd\x1fe\x03\x18\xe7\xfe\x9fK\x83\x01\ +\xa0\x01\x99\x9a\x03\x14\x01;\x01|\xaa\x9c\xea\xe38G\ +\xf5\xfa(0`1%\x01.\x01\x11U8\x01_P\ +F36:[\x02Y\xfe\xc3\xfe\xe4\xb2\xb7u{\x00\ +\x02\x00d\xff\xec\x04J\x04P\x00\x08\x00-\x004@\ +\x1a((\x0c\x13\x22-\x22FY\x03--\x1d\x0c\x0c\ +\x00FY\x0c\x10\x1d\x18GY\x1d\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x18/3+\x11\x003\x129\x18\ +/10\x01\x22\x06\x073 \x114&\x016\x003\ +2\x16\x15\x14\x04!#\x06\x15\x14\x16327\x15\x06\ +#\x22&547\x07\x22&5473\x06\x15\x14\ +3\x03D\x83\xe121\x02\x04Y\xfd\xc05\x01\x1c\xb5\ +r\x88\xfe\xb9\xfe\xbe!\x06\x94\x8a\x85\x90\x8c\x9f\xad\xc2\ +\x06\x1aXc\x1f`\x1eh\x03\xfa\xe7\xc1\x01\x0eFT\ +\xfeX\xe6\x01\x18zi\xb5\xbe,6\xa5\xadI^E\ +\xdb\xc4:5\x01_PF37:^\x00\x00\x02\x00\ +\x83\xfe\x9c\x05\xfc\x05\xcb\x00)\x003\x00=@\x1f$\ +$)\x03\x0a\x1e)\x1eIY-))\x16\x03\x18\x22\ +\x03*IY\x03\x04\x19\x16\x16\x0fIY\x16\x13\x00?\ ++\x11\x003\x18?+\x00\x18?\x11\x129/3+\ +\x11\x003\x11\x129\x18/10\x01\x12\x00!2\x16\ +\x15\x14\x04!#\x06\x15\x14\x163267\x15\x06\x06\ +\x07\x03#\x13&\x02547\x07\x22&5473\ +\x06\x15\x143\x01\x22\x00\x033 $54&\x01m\ +E\x01\x9d\x01\x15\xc7\xd1\xfe1\xfe\x15\x81\x09\xd5\xcfj\ +\xd0|v\xc4gHhK\xd4\xe8\x08\x1aXc\x1fd\ +\x1fe\x03\x18\xe7\xfe\x9fK\x83\x01\xa0\x01\x99\x9a\x03\x14\ +\x01;\x01|\xaa\x9c\xea\xe38G\xf5\xfa(0`/\ +%\x02\xfe\xb0\x01T\x15\x01+\xfbU8\x01_PF\ +36:[\x02Y\xfe\xc3\xfe\xe4\xb2\xb7u{\x00\x00\ +\x02\x00d\xfe\x93\x04J\x04P\x00'\x000\x00=@\ +\x1f\x17\x14\x22\x22'\x03\x0a\x1c'\x1cFY+''\ +\x14\x03\x16\x22\x03(FY\x03\x10\x14\x0fGY\x14\x16\ +\x00?+\x00\x18?+\x00\x18?\x11\x129/3+\ +\x11\x003\x11\x129\x18/\x11310\x016\x003\ +2\x16\x15\x14\x04!#\x06\x15\x14\x16327\x15\x06\ +\x07\x03#\x13&&547\x07\x22&5473\ +\x06\x15\x143\x01\x22\x06\x073 \x114&\x01J5\ +\x01\x1c\xb5r\x88\xfe\xb9\xfe\xbe!\x06\x94\x8a\x85\x90\x83\ +\x9c?eD\x85\x96\x06\x1aXc\x1f`\x1eh\x02\x17\ +\x83\xe121\x02\x04Y\x02R\xe6\x01\x18zi\xb5\xbe\ +,6\xa5\xadI^A\x04\xfe\xa7\x01a\x17\xd1\xaf:\ +5\x01_PF37:^\x01\xa8\xe7\xc1\x01\x0eF\ +T\xff\xff\xff\xdb\x00\x00\x02\xb2\x05\xb6\x02\x06\x00,\x00\ +\x00\xff\xff\xff\xa8\x00\x00\x06\x96\x07J\x02&\x01\xb0\x00\ +\x00\x01\x07\x026\x01f\x01R\x00\x08\xb3\x01\x15\x05&\ +\x00+5\xff\xff\xff\xcd\xff\xec\x06{\x05\xf8\x02&\x01\ +\xd0\x00\x00\x01\x07\x026\x01L\x00\x00\x00\x08\xb3\x01?\ +\x11&\x00+5\x00\x01\x00f\xfe\x00\x05\x06\x05\xb6\x00\ +\x1e\x00+@\x16\x00\x1c\x19\x02\x02\x15IY\x02\x02\x19\ +\x1d\x1a\x03\x19\x12\x09\x0eIY\x09\x1c\x00?+\x00\x18\ +??3\x129/+\x11\x12\x009910\x016\ +32\x16\x15\x14\x02\x04#\x22'5\x16326\x12\ +54&#\x22\x07\x03#\x013\x03\x013\x01\xf2(\ +*\xe4\xf9\xac\xfe\xd0\xce\x87_ww\xab\xfe\x90\xd1\xc6\ +al\x87g\x016f\x9e\x03\x13\x8f\x02\xf0\x04\xff\xed\ +\xe9\xfe\x95\xb4)h3\x9d\x01?\xc8\xc3\xd3\x13\xfd{\ +\x05\xb6\xfd)\x02\xd7\x00\x00\x01\x00H\xfd\xfa\x03\xec\x04\ +?\x00\x1c\x00)@\x15\x1a\x17\x00\x00\x13HY\x00\x00\ +\x17\x1b\x18\x0f\x17\x15\x07\x0cFY\x07\x1c\x00?+\x00\ +\x18??3\x129/+\x11\x12\x00910\x01\x16\ +\x16\x15\x14\x02\x06#\x22'5\x16326\x1254\ +&#\x22\x07\x03#\x133\x03\x013\x01\xc1\xad\xb3\x87\ +\xe8\x99eNVez\xbae\x9d\x96=8hb\xe1\ +bn\x02=\x92\x02V\x05\xd7\xbc\xcb\xfe\xb0\xa9%b\ +/\xa0\x01\x1c\xae\x9f\xad\x0a\xfe\x02\x04?\xfd\xf4\x02\x0c\ +\x00\x00\x01\xff\xac\xfe\x9c\x04\xfa\x05\xb6\x00\x18\x00$@\ +\x14\x16\x22\x11\x01IY\x11\x03\x18\x13IY\x07\x0cI\ +Y\x18\x12\x07\x13\x00??++\x00\x18?+\x00\x18\ +?10\x01!\x07\x02\x02\x06\x06#\x22'5\x163\ +266\x12\x13!\x013\x03#\x13#\x04\x81\xfeN\ +(\x84\xaar\x90e60-9Nmc\xb7\x9a\x02\ +y\xfe\xdd\xa4\xd9s\xd1\xa0\x05X\x89\xfe<\xfe\x04\xc9\ +]\x11`\x10X\xc7\x027\x02\x16\xfa\xa8\xfe>\x01d\ +\x00\x00\x01\xff\x9a\xfe\x91\x03\xbc\x04H\x00\x1f\x00$@\ +\x14\x1d\x22\x17\x02FY\x17\x0f\x1f\x1aHY\x0a\x0fG\ +Y\x1f\x15\x0a\x16\x00??++\x00\x18?+\x00\x18\ +?10\x01&#\x22\x06\x06\x07\x0e\x02#\x22'5\ +\x1632667>\x0232\x17\x033\x03#\x13\ +#\x03L&$\x5cxhGVn\x84`%\x18\x1d\ +\x1eJ`]KT|\xa2wQ[\xd7\xa4\xc8u\xcf\ +\xa6\x03\xee\x06O\xbd\xd4\xff\xc6Y\x08Z\x08L\xba\xdb\ +\xf9\xc7W\x11\xfc\x19\xfeA\x01o\x00\x00\x01\x00f\xfe\ +\x04\x05\x5c\x05\xb6\x00\x16\x00\x22@\x12\x10\x0bIY\x10\ +\x10\x0d\x12\x0e\x03\x0d\x12\x00\x06IY\x00\x1c\x00?+\ +\x00\x18??3\x129/+10\x01\x22'5\x16\ +\x1632\x00\x13\x13!\x03#\x013\x03!\x133\x01\ +\x02\x00\x01\xa4\x8cr,\x9c@\xea\x01\x09>{\xfd\x08\ +\x95g\x016f\x8b\x02\xf8\x89d\xfe\xe8H\xfe\xc2\xfe\ +\x04-i\x14\x22\x01\x05\x01 \x02F\xfd1\x05\xb6\xfd\ +w\x02\x89\xfa\xcf\xfe\xad\xfe\xd2\x00\x01\x00J\xfe\x0e\x04\ +m\x04?\x00\x16\x00\x22@\x12\x0f\x0aGY\x0f\x0f\x0c\ +\x11\x0d\x0f\x0c\x15\x00\x05FY\x00\x1b\x00?+\x00\x18\ +??3\x129/+10\x01\x22'5\x1632\ +67\x13!\x03#\x133\x03!\x133\x03\x0e\x02\x01\ +\xa4fLXb\x92\xb1.p\xfd\x90od\xe9`d\ +\x02qhe\xf0+y\xb5\xfe\x0e%c0\xbb\xd5\x02\ +\x0e\xfd\xfc\x04?\xfe!\x01\xdf\xfb\x94\xa9\xbc`\x00\x00\ +\x01\x00f\xfe\x9c\x05\x5c\x05\xb6\x00\x0f\x00%@\x14\x06\ +\x01IY\x06\x06\x0f\x08\x04\x03\x03\x12\x0d\x22\x0f\x0aI\ +Y\x0f\x12\x00?+\x00\x18???3\x129/+\ +10\x01!\x03#\x013\x03!\x133\x013\x03#\ +\x13#\x04Z\xfd\x08\x95g\x016f\x8b\x02\xf8\x89d\ +\xfe\xdf\xa4\xd9s\xd1\xa1\x02\xcf\xfd1\x05\xb6\xfdw\x02\ +\x89\xfa\xa8\xfe>\x01d\x00\x01\x00J\xfe\x91\x04m\x04\ +?\x00\x0f\x00%@\x14\x0b\x06GY\x0b\x0b\x04\x0d\x09\ +\x0f\x08\x15\x02\x22\x04\x0fFY\x04\x15\x00?+\x00\x18\ +???3\x129/+10%\x03#\x13#\x13\ +!\x03#\x133\x03!\x133\x03\x043\xc9t\xcf\xa6\ +n\xfd\x90od\xe9`d\x02qhe\xdeT\xfe=\ +\x01o\x02\x04\xfd\xfc\x04?\xfe!\x01\xdf\xfc\x15\x00\x00\ +\x01\x00\xcd\xfe\x9c\x04\xae\x05\xb6\x00\x19\x00)@\x15\x00\ +\x08\x02\x02\x0fIY\x02\x02\x15\x12\x08\x03\x17\x22\x15\x18\ +IY\x15\x12\x00?+\x00\x18??3\x129/+\ +\x11\x12\x00910\x01\x06#\x22&547\x133\ +\x03\x06\x15\x14\x16327\x133\x01#\x03#\x133\ +\x03\x98\xdb\xbd\x92\xa1\x16iff\x19ri\xc3\xd9\xa0\ +d\xfe\xcb\xa6Hh^\xa8\x02m[\x8b\x84@d\x01\ +\xf1\xfe\x1dt8\x5c^Z\x02\xef\xfaJ\xfe\x9c\x01\xc2\ +\x00\x00\x01\x00\x9c\xfe\x91\x03\xfe\x04?\x00\x1d\x00)@\ +\x15\x15\x1d\x17\x17\x06FY\x17\x17\x0d\x0a\x1d\x0f\x0f\x22\ +\x0d\x10FY\x0d\x15\x00?+\x00\x18??3\x129\ +/+\x11\x12\x00910\x01\x02\x06\x15\x14\x1632\ +\x12773\x03#\x03#\x133767#\x06#\ +\x22&547\x13\x01PE\x0dYa\xa3\xfe0\x13\ +b\xea\x8bJb\x5c\x881\x1a3\x08\xa1\xf0\x80\x8a\x16\ +:\x04?\xfe\xc2X\x1cJW\x01\x0f\xeaZ\xfb\xc1\xfe\ +\x91\x01\xc3\xe5|\xbe\xddxuJf\x01\x0c\x00\x01\x00\ +m\xfe\x9c\x06w\x05\xb6\x00\x17\x00$@\x13\x00\x14\x01\ +\x10\x0b\x03\x15\x03\x0e\x14\x12\x06\x22\x08\x03IY\x08\x12\ +\x00?+\x00\x18??3?\x173\x11310%\ +\x013\x013\x03#\x13#\x13\x127#\x01#\x03#\ +\x06\x03\x03#\x013\x13\x03\x04\x02\xdd\x96\xfe\xe5\xa4\xd9\ +s\xd1\xa0\xbfO\x15\x06\xfc\xf43\xde\x06\x14:\xc4`\ +\x015\x8f\xcd\xcd\x04\xe9\xfa\xa8\xfe>\x01d\x03\x85\x01\ +qN\xfa\xbc\x05D\x9a\xfe\xf0\xfcf\x05\xb6\xfb\x17\x00\ +\x01\x00-\xfe\x91\x04\xf2\x04?\x00\x19\x00$@\x13\x0e\ +\x0a\x12\x08\x00\x03\x0b\x0f\x04\x0a\x15\x17\x22\x19\x14HY\ +\x19\x15\x00?+\x00\x18??3?\x173\x1131\ +0\x01\x06\x06\x01#\x03&&'\x03#\x133\x13\x16\ +\x1566\x013\x033\x03#\x13#\x04u\x11,\xfe\ +\x03C\x92\x06\x17\x01\xc1Z\xe7e\x99\x1b\x1aI\x01\xed\ +u\xd9\xa3\xc8u\xcf\x9e\x03\xa2 L\xfc\xca\x02\xd3\x1d\ +\x8c \xfcd\x04?\xfc\xe2\x9e\x0c7|\x03\x15\xfc\x11\ +\xfeA\x01o\x00\xff\xff\xff\xdb\x00\x00\x02\xb2\x05\xb6\x02\ +\x06\x00,\x00\x00\xff\xff\xff\x91\x00\x00\x04V\x07J\x02\ +&\x00$\x00\x00\x01\x07\x026\x00{\x01R\x00\x08\xb3\ +\x02\x12\x05&\x00+5\xff\xff\x00f\xff\xec\x047\x05\ +\xf8\x02&\x00D\x00\x00\x01\x06\x026B\x00\x00\x08\xb3\ +\x02%\x11&\x00+5\xff\xff\xff\x91\x00\x00\x03\xf2\x07\ +\x13\x02&\x00$\x00\x00\x01\x07\x00j\x00+\x01R\x00\ +\x0a\xb4\x03\x02!\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x047\x05\xc1\x02&\x00D\x00\x00\x01\x06\x00j\xf1\ +\x00\x00\x0a\xb4\x03\x024\x11&\x00+55\xff\xff\xff\ +\x8b\x00\x00\x06\xb0\x05\xb6\x02\x06\x00\x88\x00\x00\xff\xff\x00\ +f\xff\xec\x06\x1f\x04P\x00\x06\x00\xa8\x00\x00\xff\xff\x00\ +f\x00\x00\x04s\x07J\x02&\x00(\x00\x00\x01\x07\x02\ +6\x00\x91\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\ +\xff\x00f\xff\xec\x03\xe1\x05\xf8\x02&\x00H\x00\x00\x01\ +\x06\x026\x06\x00\x00\x08\xb3\x02$\x11&\x00+5\x00\ +\x02\x00^\xff\xec\x05\x0a\x05\xcb\x00\x18\x00\x22\x00&@\ +\x14\x0a\x1dIY\x0a\x0a\x04\x16\x16\x10IY\x16\x04\x04\ +\x19IY\x04\x13\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01\x14\x02\x04#\x22&54$!\ +3654&#\x22\x0756632\x00\x012\ +\x00\x13# \x04\x15\x14\x16\x05\x0a\xd6\xfe\x9c\xda\xc7\xd1\ +\x01\xcf\x01\xec\x81\x08\xd5\xcf\xd2\xe4v\xd7s\xf1\x01\x11\ +\xfc\xec\xe6\x01bK\x83\xfeb\xfee\x9a\x03\x8b\xf5\xfe\ +E\xef\xaa\x9b\xec\xe12M\xf4\xfcYa/'\xfe\xd1\ +\xfb\xae\x01:\x01\x1e\xb1\xb8vy\x00\x00\x02\x00=\xff\ +\xec\x03T\x04P\x00\x17\x00 \x00&@\x14\x0d\x1cG\ +Y\x0d\x0d\x07\x00\x00\x13GY\x00\x10\x07\x18FY\x07\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x012\x16\x15\x14\x02\x06#\x22&54$!3\ +654&#\x22\x0756\x03267# \x11\ +\x14\x16\x01\xe5\xad\xc2\x96\xf5\x92r\x88\x01G\x01C \ +\x07\x94\x8b\x83\x92\x8f\x05\x84\xe011\xfd\xfcW\x04P\ +\xdb\xc5\xbd\xfe\xb3\xbazi\xb5\xbe%=\xa5\xadJ^\ +F\xfb\xf2\xe8\xbf\xfe\xf2ET\xff\xff\x00^\xff\xec\x05\ +\x0a\x07\x13\x02&\x02\xe1\x00\x00\x01\x07\x00j\x00\x81\x01\ +R\x00\x0a\xb4\x03\x025\x05&\x00+55\xff\xff\x00\ +=\xff\xec\x03T\x05\xc1\x02&\x02\xe2\x00\x00\x01\x06\x00\ +j\x8c\x00\x00\x0a\xb4\x03\x023\x11&\x00+55\xff\ +\xff\xff\xa8\x00\x00\x06\x96\x07\x13\x02&\x01\xb0\x00\x00\x01\ +\x07\x00j\x01\x17\x01R\x00\x0a\xb4\x02\x01$\x05&\x00\ ++55\xff\xff\xff\xcd\xff\xec\x06{\x05\xc1\x02&\x01\ +\xd0\x00\x00\x01\x07\x00j\x00\xe5\x00\x00\x00\x0a\xb4\x02\x01\ +N\x11&\x00+55\xff\xff\xff\xe1\xff\xec\x03\xdb\x07\ +\x13\x02&\x01\xb1\x00\x00\x01\x07\x00j\xff\xda\x01R\x00\ +\x0a\xb4\x02\x019\x05&\x00+55\xff\xff\xff\xee\xff\ +\xec\x03\x05\x05\xc1\x02&\x01\xd1\x00\x00\x01\x07\x00j\xff\ +>\x00\x00\x00\x0a\xb4\x02\x01<\x11&\x00+55\x00\ +\x01\x00\x0a\xff\xec\x049\x05\xb6\x00\x1b\x00&@\x14\x00\ +\x15IY\x00\x00\x07\x19\x19\x18IY\x19\x03\x07\x0dI\ +Y\x07\x13\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++10\x01\x16\x16\x15\x14\x06\x06#\x22&'5\x16\ +326654&##7\x01!7!\x07\x01\ +\xd5\xe2\xe5\x88\xed\xa0d\xb5d\xb7\xd2\x83\xbbd\xbe\xcd\ +h\x12\x02H\xfd\x9f\x17\x02\xe7\x12\x03)\x02\xb9\xb2\x88\ +\xdan#,uj^\xa5k\x91\x8aX\x021^X\ +\x00\x00\x01\xff\x5c\xfe\x14\x03'\x04?\x00\x1a\x00&@\ +\x14\x00\x14FY\x00\x00\x07\x18\x18\x17FY\x18\x0f\x07\ +\x0dFY\x07\x1b\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01\x16\x16\x15\x14\x06\x06#\x22'5\ +\x16\x1632665\x10!#7\x01!7!\x07\ +\x01\x1b\xae\xd3\x85\xf6\xaa\xa3x6\xa4K\x86\xc5k\xfe\ +\xaaK\x0e\x01\xf8\xfd\xe9\x13\x02\x8f\x10\x01\xae\x04\xcf\xae\ +\x9c\xf6\x87@h#/p\xca\x7f\x017P\x02=X\ +O\xff\xff\x00f\x00\x00\x05b\x06\x87\x02&\x01\xb2\x00\ +\x00\x01\x07\x01M\x00\xe9\x01R\x00\x08\xb3\x01\x11\x05&\ +\x00+5\xff\xff\x00m\xff\xf0\x04+\x055\x02&\x00\ +X\x00\x00\x01\x06\x01M%\x00\x00\x08\xb3\x01\x1c\x11&\ +\x00+5\xff\xff\x00f\x00\x00\x05b\x07\x13\x02&\x01\ +\xb2\x00\x00\x01\x07\x00j\x00\xb4\x01R\x00\x0a\xb4\x02\x01\ + \x05&\x00+55\xff\xff\x00m\xff\xf0\x04+\x05\ +\xc1\x02&\x00X\x00\x00\x01\x06\x00j\xf1\x00\x00\x0a\xb4\ +\x02\x01+\x11&\x00+55\xff\xff\x00\xac\xff\xec\x05\ +{\x07\x13\x02&\x002\x00\x00\x01\x07\x00j\x00\xcf\x01\ +R\x00\x0a\xb4\x03\x02.\x05&\x00+55\xff\xff\x00\ +b\xff\xec\x04\x02\x05\xc1\x02&\x00R\x00\x00\x01\x06\x00\ +j\xe8\x00\x00\x0a\xb4\x03\x02-\x11&\x00+55\xff\ +\xff\x00\xac\xff\xec\x05{\x05\xcb\x02\x06\x02~\x00\x00\xff\ +\xff\x00b\xff\xec\x04\x02\x04T\x02\x06\x02\x7f\x00\x00\xff\ +\xff\x00\xac\xff\xec\x05{\x07\x13\x02&\x02~\x00\x00\x01\ +\x07\x00j\x00\xcf\x01R\x00\x0a\xb4\x04\x032\x05&\x00\ ++55\xff\xff\x00b\xff\xec\x04\x02\x05\xc1\x02&\x02\ +\x7f\x00\x00\x01\x06\x00j\xe8\x00\x00\x0a\xb4\x04\x031\x11\ +&\x00+55\xff\xff\x00\x0e\xff\xec\x04N\x07\x13\x02\ +&\x01\xc7\x00\x00\x01\x07\x00j\xff\xf5\x01R\x00\x0a\xb4\ +\x02\x01.\x05&\x00+55\xff\xff\x00\x0a\xff\xec\x03\ +'\x05\xc1\x02&\x01\xe7\x00\x00\x01\x07\x00j\xff<\x00\ +\x00\x00\x0a\xb4\x02\x013\x11&\x00+55\xff\xff\xff\ +\xe9\xff\xec\x055\x06\x87\x02&\x01\xbd\x00\x00\x01\x07\x01\ +M\x00\x5c\x01R\x00\x08\xb3\x01\x18\x05&\x00+5\xff\ +\xff\xff'\xfe\x14\x03\xf0\x055\x02&\x00\x5c\x00\x00\x01\ +\x06\x01M\xa3\x00\x00\x08\xb3\x01\x1b\x11&\x00+5\xff\ +\xff\xff\xe9\xff\xec\x055\x07\x13\x02&\x01\xbd\x00\x00\x01\ +\x07\x00j\x00D\x01R\x00\x0a\xb4\x02\x01'\x05&\x00\ ++55\xff\xff\xff'\xfe\x14\x03\xf0\x05\xc1\x02&\x00\ +\x5c\x00\x00\x01\x07\x00j\xffr\x00\x00\x00\x0a\xb4\x02\x01\ +*\x11&\x00+55\xff\xff\xff\xe9\xff\xec\x055\x07\ +s\x02&\x01\xbd\x00\x00\x01\x07\x01S\x00h\x01R\x00\ +\x0a\xb4\x02\x01(\x05&\x00+55\xff\xff\xff'\xfe\ +\x14\x03\xf9\x06!\x02&\x00\x5c\x00\x00\x01\x06\x01S\xa9\ +\x00\x00\x0a\xb4\x02\x01+\x11&\x00+55\xff\xff\x00\ +\xcd\x00\x00\x04\xae\x07\x13\x02&\x01\xc1\x00\x00\x01\x07\x00\ +j\x00=\x01R\x00\x0a\xb4\x02\x01(\x05&\x00+5\ +5\xff\xff\x00\x9c\x00\x00\x03\xfe\x05\xc1\x02&\x01\xe1\x00\ +\x00\x01\x06\x00j\xc2\x00\x00\x0a\xb4\x02\x01,\x11&\x00\ ++55\x00\x01\x00f\xfe\x9c\x04`\x05\xb6\x00\x09\x00\ +\x1c@\x0e\x08\x22\x01\x04IY\x01\x03\x00\x05IY\x00\ +\x12\x00?+\x00\x18?+\x00\x18?103\x01!\ +\x07!\x013\x03#\x13f\x016\x02\xc4\x14\xfd\xa4\xfe\ +\xf1\xa8biP\x05\xb6^\xfb\x06\xfe>\x01d\x00\x00\ +\x01\x00H\xfe\x93\x03#\x04?\x00\x09\x00\x1c@\x0e\x02\ +\x22\x05\x08HY\x05\x0f\x04\x09FY\x04\x15\x00?+\ +\x00\x18?+\x00\x18?10%\x03#\x13#\x13!\ +\x07!\x03\x01mgdT\xae\xe3\x01\xf8\x13\xfem\xc3\ +T\xfe?\x01m\x04?Q\xfcf\x00\xff\xff\x00f\x00\ +\x00\x06\x10\x07\x13\x02&\x01\xc5\x00\x00\x01\x07\x00j\x01\ +\x17\x01R\x00\x0a\xb4\x04\x03*\x05&\x00+55\xff\ +\xff\x00\x8d\xff\xec\x05!\x05\xc1\x02&\x01\xe5\x00\x00\x01\ +\x07\x00j\x00\x85\x00\x00\x00\x0a\xb4\x04\x034\x11&\x00\ ++55\x00\x01\x00H\xfe\xb0\x04`\x05\xb6\x00\x1a\x00\ +7@\x1d\x06\x17\x18\x17JY\x03\x18\x18\x15\x1a\x1a\x02\ +IY\x1a\x03\x15\x07IY\x15\x12\x0c\x11IY\x0c\x22\ +\x00?+\x00\x18?+\x00\x18?+\x11\x12\x009\x18\ +/3+\x11\x00310\x01\x07!\x03!\x07!\x03\ +3\x03\x06\x06#\x22'5\x163277#\x13#\ +73\x13\x04`\x14\xfd\xa4\x81\x01O\x12\xfe\xb2}\x8e\ +8\x12QI0\x13 !T\x13\x1e\xa8\x92\x92\x13\x8f\ +\x94\x05\xb6^\xfd\xa6R\xfd\xb2\xfe\xfcWS\x11X\x0f\ +g\x8f\x02\xacR\x02\xb8\x00\x01\x00\x17\xfe\xb0\x03#\x04\ +?\x00\x1a\x007@\x1d\x0c\x02\x03\x02HY\x09\x03\x03\ +\x00\x05\x05\x08HY\x05\x0f\x00\x0dFY\x00\x15\x12\x17\ +GY\x12\x22\x00?+\x00\x18?+\x00\x18?+\x11\ +\x12\x009\x18/3+\x11\x003103\x13#7\ +3\x13!\x07!\x03!\x07!\x033\x07\x06\x06#\x22\ +'5\x163277Hj\x9b\x12\x9ah\x01\xf8\x13\ +\xfemV\x01\x12\x12\xfe\xedZ\x855\x12RH0\x13\ + !T\x13\x1e\x02\x02P\x01\xedQ\xfedP\xfeR\ +\xfaWS\x11X\x0fg\x8f\x00\x00\x01\xffy\xfe\xb0\x04\ +}\x05\xb6\x00\x18\x00'@\x14\x15\x0f\x0e\x16\x13\x03\x11\ +\x12\x0e\x00IY\x0e\x12\x05\x0aIY\x05\x22\x00?+\ +\x00\x18?+\x00\x18??3\x129910%3\ +\x03\x06\x06#\x22'5\x163277#\x03\x01#\ +\x01\x013\x13\x013\x01\x03J\x917\x13QH1\x13\ +\x22 S\x13\x1fw\xfe\xfd\xf2\x7f\x02`\xfe\xf0j\xf0\ +\x01\xe3w\xfd\xd5^\xfe\xfcWS\x11X\x0fg\x8f\x02\ +\xa6\xfdZ\x02\xfe\x02\xb8\xfd\x8e\x02r\xfd1\x00\x01\xff\ +\xb8\xfe\xb0\x03\xba\x04;\x00\x18\x00'@\x14\x06\x00\x18\ +\x07\x04\x0f\x02\x15\x18\x0aFY\x18\x15\x0f\x14GY\x0f\ +\x22\x00?+\x00\x18?+\x00\x18??3\x1299\ +10\x01\x01#\x01\x033\x13\x013\x01\x133\x07\x06\ +\x06#\x22'5\x163277#\x01\xba\xfewy\ +\x01\xd7\xf5d\xcf\x01ux\xfe@\xd9\x955\x12RH\ +0\x13 !T\x13\x1ep\x01\xdf\xfe!\x02+\x02\x10\ +\xfe2\x01\xce\xfd\xea\xfe/\xfaWS\x11X\x0fg\x8f\ +\x00\x00\x01\xffy\x00\x00\x04}\x05\xb6\x00\x11\x00)@\ +\x14\x0c\x03\x05\x0a\x00\x07\x08\x07JY\x0f\x08\x08\x05\x0d\ +\x0a\x03\x02\x05\x12\x00?3?3\x129/3+\x11\ +\x003\x11\x129910\x01\x01#\x03\x01#\x01!\ +7!\x013\x13\x013\x01!\x07\x02\x5c\x01\x13k\xfe\ +\xfd\xf2\x7f\x029\xfe\xf2\x12\x01\x15\xfe\xfej\xf0\x01\xe3\ +w\xfe\x00\x01-\x12\x02\xcd\xfd3\x02\xa6\xfdZ\x02\xcd\ +R\x02\x97\xfd\x8e\x02r\xfdiR\x00\x00\x01\xff\xb8\x00\ +\x00\x03\xba\x04;\x00\x11\x00)@\x14\x09\x00\x02\x07\x0f\ +\x04\x05\x04HY\x0c\x05\x05\x02\x0a\x07\x0f\x11\x02\x15\x00\ +?3?3\x129/3+\x11\x003\x11\x1299\ +10\x01\x01#\x01!7!\x033\x13\x013\x01!\ +\x07!\x13#\x01\xba\xfewy\x01\xb2\xfe\xf2\x13\x01\x0e\ +\xe3d\xcf\x01ux\xfee\x01\x1e\x12\xfe\xdf\xf2b\x01\ +\xdf\xfe!\x02\x00R\x01\xe9\xfe2\x01\xce\xfe\x17R\xfe\ +\x00\x00\x02\x00\x5c\x00\x00\x04o\x05\xb6\x00\x0a\x00\x12\x00\ +\x1d@\x0f\x03\x0cIY\x03\x03\x08\x05\x03\x08\x11IY\ +\x08\x12\x00?+\x00\x18?\x129/+10\x134\ +$!3\x133\x01!\x22&\x01# \x06\x15\x10!\ +3\x5c\x01 \x01\x15\xe8\x8fg\xfe\xca\xfe\xc5\xc8\xda\x03\ +\x0a\xbc\xfe\xff\xe0\x01I\xd3\x01h\xda\xe5\x02\x8f\xfaJ\ +\xb9\x02\x12\xa7\xbc\xfe\xf4\xff\xff\x00f\xff\xec\x04\x9c\x06\ +\x14\x02\x06\x00G\x00\x00\x00\x02\x00\x5c\xff\xec\x061\x05\ +\xb6\x00\x1c\x00(\x001@\x18\x07\x11\x1c\x1c\x09\x11\x0f\ +\x1eIY\x0f\x0f\x09\x11\x03\x19$\x09$IY\x04\x09\ +\x13\x00?3+\x11\x003\x18?\x129/+\x11\x12\ +\x009\x18/\x11910\x01\x03\x06\x06#\x22&'\ +\x06#\x22&54$!3\x133\x03\x06\x06\x15\x14\ +\x16327\x13\x05# \x06\x15\x14\x163266\ +7\x061n \xc9\x96m\x97\x1b{\xe7\xa4\xc3\x01\x1b\ +\x01\x1a\xe8\x8fg\xd3\x0a\x13qZ\xde2m\xfd\x9f\xbc\ +\xff\x00\xe1\x8cv\x5c\x8bZ\x0f\x03P\xfd\xeb\xa0\xafc\ +[\xbc\xc1\xa9\xe3\xec\x02\x8f\xfc\x1d(}$Ug\xf6\ +\x02\x0c\x85\xaf\xc2\x7f\x8dBwK\x00\x00\x02\x00f\xff\ +\xec\x06\x10\x06\x14\x00\x1f\x00-\x00.@\x17\x07\x07\x19\ +\x0f\x11\x17\x1c\x00\x17(FY\x17\x10\x03 \x11 G\ +Y\x0c\x11\x16\x00?3+\x11\x003\x18?+\x00\x18\ +?\x11\x12999/10\x01\x14\x163267\ +\x133\x03\x06\x06# \x03#\x02! \x114\x126\ +32\x1736\x133\x03\x06\x012>\x0254&\ +#\x22\x06\x02\x15\x10\x03\x9ah\x5ct{ G\x5cI\ +%\xb4\x98\xfe\xf4\x15\x06\xac\xfe\xfc\xfe\xe7\x8f\xfc\x9e\xe6\ +1\x04\x0c\x83c\xf2\x10\xfd\xfcY\xb3\x8dH{k|\ +\xc8\x80\x01\x14fh\x85\x97\x01Z\xfe\x92\xb4\xae\x01\x22\ +\xfe\xde\x01v\xc1\x01b\xcb\xdbB\x02]\xfb\x8cF\xfe\ +\xec}\xd3\xfbT~\x97\xa6\xfe\xc1\xa8\xfe\xd9\x00\x01\x00\ +\xe7\xff\xec\x06\x1d\x05\xcb\x002\x006@\x1b\x18\x04\x05\ +'',\x12\x05\x04IY\x05\x05,\x12\x12\x0dJY\ +\x12\x04,#IY,\x13\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x009\x18/\x11\x1291\ +0\x014&##7326654&#\x22\ +\x07'632\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x07\ +\x06\x15\x14\x163267\x133\x03\x06\x06#\x22&\ +&547\x03\x19\xa1\xad\xdb\x12\xb2\x83\xd4h\x86|\ +\xa8\xac6\xbe\xd8\xa5\xb9\xb6\xb0\x80\x88\x07\x07qYs\ +\x81\x19lkq#\xc4\x96X\x85H\x0d\x01\xc1\x85\x81\ +`Z\x9dir|wL\x81\xa4\x96\xa0\xcf*\x04\x11\ +\x97\x7f&??\x1fUg|z\x02\x0c\xfd\xe5\xa1\xa8\ +DzJ*{\x00\x01\x00\xa2\xff\xec\x04\xfc\x04P\x00\ ++\x006@\x1b\x1a\x05\x06$$)\x14\x06\x05GY\ +\x06\x06)\x14\x14\x0dFY\x14\x10) GY)\x16\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x009\x18/\x11\x12910%74&##7\ +32654&#\x22\x06\x07'6632\x16\ +\x15\x14\x06\x07\x15\x16\x15\x07\x143267\x133\x03\ +\x06\x06#\x22&\x027\x06bs\x87\x15Z\x92\xa1h\ +X=qJ)S\x8cV\x82\x90\x84y\xb6\x06\xb4p\ +w!H\x5cJ&\xa9\x99\x82\x91\xe5w[U\x5cw\ +oN^\x22.P2$\x82tq\x94\x18\x04\x1e\xb3\ +x\xaa\x7f\x9d\x01Z\xfe\x92\xb8\xaa|\x00\x01\x00\xe7\xfe\ +\x9c\x03\xec\x05\xcb\x00&\x000@\x19\x18\x04\x05\x05\x04\ +IY\x05\x05$\x12\x22\x22\x12\x0dJY\x12\x04$\x1f\ +IY$\x12\x00?+\x00\x18?+\x00\x18?\x11\x12\ +9/+\x11\x12\x00910\x014&##73\ +26654&#\x22\x07'632\x16\x15\x14\ +\x06\x07\x15\x16\x16\x15\x14\x07\x073\x03#\x13#\x126\ +\x03\x1b\xbd\xb8\xb6\x12\xb2\x83\xd4h\x86|\xa8\xac6\xbe\ +\xd8\xa5\xb9\xb6\xb0\x84\x88\x19$\xa8chP\xa6@\x10\ +\x01\xae\x91\x88`Z\x9dir|wL\x81\xa4\x96\xa0\ +\xcf*\x04\x18\xa3\x856r\xae\xfe>\x01d\x01%h\ +\x00\x00\x01\x00\xa2\xfe\x93\x03/\x04P\x00&\x000@\ +\x19!\x0c\x0d\x0d\x0cGY\x0d\x0d\x05\x1b\x03\x22\x1b\x14\ +FY\x1b\x10\x05\x00FY\x05\x15\x00?+\x00\x18?\ ++\x00\x18?\x11\x129/+\x11\x12\x00910%\ +3\x03#\x13#7654&##7326\ +54&#\x22\x06\x07'6632\x16\x15\x14\x06\ +\x07\x15\x16\x15\x14\x06\x02}\xb2feT\xb2/\x0f\x81\ +\x8eT\x15Z\x92\xa1hX=qJ)S\x8cV\x82\ +\x90\x84y\xbe\x0aT\xfe?\x01m\xddA$k_\x5c\ +woN^\x22.P2$\x82tq\x94\x18\x04(\ +\xc1\x1a@\x00\x01\xff\xac\xff\xe9\x06\x9e\x05\xb6\x00&\x00\ +'@\x13\x07\x07\x19#\x03\x1e\x19\x1eIY\x0c\x19\x13\ +#\x13IY#\x03\x00?+\x00\x18?3+\x11\x00\ +3\x11\x129\x18/10%\x14\x163267\x13\ +3\x03\x06\x06#\x22&547\x13!\x07\x02\x02\x06\ +\x06#\x22'5\x163266\x12\x13!\x03\x06\x03\ +\xf2m[s\x81\x19lkq#\xc4\x96\x87\x9e\x1b\xc2\ +\xfeg(\x84\xaar\x90e60-9Nmc\xb7\ +\x9a\x02`\xd5\x1a\xfeQ_|z\x02\x0c\xfd\xe5\xa1\xa8\ +\x92tB\x8a\x03\x9a\x89\xfe<\xfe\x04\xc9]\x11`\x10\ +X\xc7\x027\x02\x16\xfc\x11\x80\x00\x01\xff\x8f\xff\xec\x05\ +s\x04H\x00,\x00'@\x13\x06\x06\x1b((\x13F\ +Y(\x0f\x02 \x1b GY\x0b\x1b\x15\x00?3+\ +\x11\x003\x18?+\x11\x12\x009\x18/10%\x14\ +3267\x133\x03\x06\x06#\x22&547\x13\ +&#\x22\x06\x06\x07\x0e\x02#\x22'5\x16326\ +67>\x0232\x17\x03\x06\x03\x12\xb5pw!H\ +\x5cJ&\xa9\x99\x86\x8d\x17}&$\x5cxfIV\ +n\x84`#\x1b\x1d\x1fJ`]KSz\xa2zQ\ +[\x89\x17\xfe\xb8\x7f\x9d\x01Z\xfe\x92\xb8\xaa\x8a|G\ +k\x02J\x06O\xb8\xd9\xff\xc6Y\x08Z\x08L\xba\xdb\ +\xfa\xc4Y\x11\xfdq{\x00\x01\x00f\xff\xec\x07\x19\x05\ +\xb6\x00\x1d\x00,@\x16\x13\x13\x03\x04\x06\x01IY\x06\ +\x06\x03\x08\x04\x03\x03\x12\x18\x0fIY\x18\x13\x00?+\ +\x00\x18??3\x129/+\x11\x12\x009\x18/1\ +0\x01!\x03#\x013\x03!\x133\x03\x06\x15\x14\x16\ +3267\x133\x03\x06\x06#\x22&546\x04\ +Z\xfd\x08\x95g\x016f\x8b\x02\xf8\x89d\xd5\x1am\ +[s\x81\x19lkq#\xc4\x96\x87\x9e\x0e\x02\xcf\xfd\ +1\x05\xb6\xfdw\x02\x89\xfc\x11\x80IQ_|z\x02\ +\x0c\xfd\xe5\xa1\xa8\x92t/a\x00\x01\x00J\xff\xec\x06\ +)\x04?\x00\x1c\x00,@\x16\x12\x12\x03\x04\x06\x01G\ +Y\x06\x06\x03\x08\x04\x0f\x03\x15\x17\x0eGY\x17\x16\x00\ +?+\x00\x18??3\x129/+\x11\x12\x009\x18\ +/10\x01!\x03#\x133\x03!\x133\x03\x06\x15\ +\x143267\x133\x03\x06\x06#\x22&547\ +\x03\x8d\xfd\x90od\xe9`d\x02qhe\x8e\x16\xb4\ +pw!H\x5cJ&\xa9\x99\x86\x8f\x17\x02\x04\xfd\xfc\ +\x04?\xfe!\x01\xdf\xfdi`J\xb8\x7f\x9d\x01Z\xfe\ +\x92\xb8\xaa\x89}Gk\x00\x01\x00\xaa\xff\xec\x05=\x05\ +\xcb\x00\x1f\x00&@\x14\x00\x1fIY\x00\x00\x05\x0c\x0c\ +\x13IY\x0c\x04\x05\x1aIY\x05\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+10\x01!\x07\x02\x00\ +!\x22\x00\x11\x10\x12$32\x16\x17\x07&&#\x22\ +\x04\x02\x15\x14\x1632667!\x03T\x01\xcf\x13\ +0\xfe\xd5\xfe\xf9\xf4\xfe\xf0\xd2\x01e\xd9q\xb4^&\ +n\x9fX\xb8\xfe\xca\xb2\xdc\xc4\x97\xcav\x1f\xfe\x97\x02\ +\xc9w\xfe\xc2\xfe\xd8\x01-\x01\x0a\x01\x09\x01\xb5\xea&\ +(^. \xd7\xfe|\xef\xe1\xfas\xdc\xd1\x00\x01\x00\ +b\xff\xec\x04\x1b\x04T\x00\x1e\x000@\x1b\x00\x1eF\ +Y\x0f\x00\x1f\x00\x02\x09\x03\x00\x00\x05\x0c\x0c\x13FY\ +\x0c\x10\x05\x1aFY\x05\x16\x00?+\x00\x18?+\x11\ +\x12\x009\x18/_^]+10\x01!\x07\x02\x06\ +#\x22&54\x12$32\x16\x17\x07'&#\x22\ +\x06\x02\x15\x14\x163267!\x02f\x01\xb5\x0f3\ +\xfa\xcf\xcf\xdf\x95\x01\x0e\xabP\x99k)Ax|\x88\ +\xd9|\xac\xa2\x9f\xbe(\xfe\xb6\x02\x14E\xfe\xff\xe2\xef\ +\xdd\xbd\x012\xad*:T#?\x93\xfe\xed\x9e\xb5\xc3\ +\xb3\xc9\x00\x00\x01\x00\xc1\xff\xec\x04\xa8\x05\xb6\x00\x19\x00\ +%@\x12\x07\x07\x0c\x14\x17\x13\x14\x13IY\x14\x03\x0c\ +\x03IY\x0c\x13\x00?+\x00\x18?+\x11\x003\x11\ +\x129\x18/10%\x14\x163267\x133\x03\ +\x06\x06#\x22&547\x13!7!\x07!\x03\x06\ +\x01\xfcn[r\x81\x19lkq#\xc4\x96\x87\xa0\x1b\ +\xc3\xfeP\x14\x03\xcd\x13\xfeH\xc0\x1b\xfeR^|z\ +\x02\x0c\xfd\xe5\xa1\xa8\x94rB\x8a\x03\x9a^^\xfco\ +{\x00\x01\x00T\xff\xec\x03\xe7\x04?\x00\x18\x00%@\ +\x12\x0e\x0e\x13\x02\x05\x01\x02\x01HY\x02\x0f\x13\x0aG\ +Y\x13\x16\x00?+\x00\x18?+\x11\x003\x11\x129\ +\x18/10\x01!7!\x07!\x03\x06\x15\x1432\ +67\x133\x03\x06\x06#\x22&547\x01\xb6\xfe\ +\x9e\x14\x03\x0f\x15\xfe\xb9}\x17\xb4qx G\x5cI\ +&\xab\x98\x86\x8e\x16\x03\xeeQQ\xfd\xb8dD\xb8\x82\ +\x9a\x01Z\xfe\x92\xb9\xa9\x8a|Hj\x00\x01\x00\x93\xff\ +\xec\x04h\x05\xcb\x00'\x00-@\x17&\x12\x0f\x0f\x12\ +IY\x0f\x0f\x1f\x03\x03\x09JY\x03\x04\x1f\x18IY\ +\x1f\x13\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x00910\x014632\x16\x17\x07&#\ +\x22\x06\x15\x14\x1633\x07#\x22\x06\x15\x14\x1632\ +67\x15\x06\x06#\x22&54675&\x01P\ +\xf6\xc4d\xa7S5\x84\xab\x93\xb9\xa8\x92\xb2\x15\xc8\xde\ +\xe5\x9e\x95\x5c\xa2uu\xb4V\xc1\xd7\xda\xbc\xd9\x04+\ +\xb9\xe71>Vo\xb7\x93}\x8b`\xb8\xaf\x82\x92$\ +4c/\x22\xc2\xac\xb3\xe2\x0d\x04E\xff\xff\x00;\xff\ +\xec\x03m\x04P\x02\x06\x01\x82\x00\x00\x00\x01\xff\xac\xfe\ +\xb0\x04\xfa\x05\xb6\x00!\x00)@\x18\x10\x00IY\x10\ +\x03\x06\x0bIY \x12IY\x06\x13 \x12\x17\x1cI\ +Y\x17\x22\x00?+\x00\x18??++\x00\x18?+\ +10\x01\x07\x02\x02\x06\x06#\x22'5\x16326\ +6\x12\x13!\x013\x03\x06\x06#\x22'5\x1632\ +77#\x01\x02\xcf(\x84\xaar\x90e60-9\ +Nmc\xb7\x9a\x02y\xfe\xdd\x8d7\x13QH1\x13\ +\x22 S\x13\x1f\xa4\x01!\x05X\x89\xfe<\xfe\x04\xc9\ +]\x11`\x10X\xc7\x027\x02\x16\xfa\xa8\xfe\xfcWS\ +\x11X\x0fg\x8f\x05X\x00\x01\xff\x9a\xfe\xb0\x03\xbc\x04\ +H\x00(\x00)@\x18&\x11FY&\x0f\x0e\x00F\ +Y\x19\x1eGY\x19\x16\x0e\x15\x05\x0aGY\x05\x22\x00\ +?+\x00\x18??++\x00\x18?+10%3\ +\x07\x06\x06#\x22'5\x163277#\x13&#\ +\x22\x06\x06\x07\x0e\x02#\x22'5\x1632667\ +>\x0232\x17\x02\xe7\x866\x12QI0\x13 !\ +T\x13\x1e\x99\xd7&$\x5cxhGVn\x84`%\ +\x18\x1d\x1eJ`]KT|\xa2wQ[T\xfaW\ +S\x11X\x0fg\x8f\x03\xee\x06O\xbd\xd4\xff\xc6Y\x08\ +Z\x08L\xba\xdb\xf9\xc7W\x11\xff\xff\xff\x91\xfe\xc7\x03\ +\xd3\x05\xbc\x02&\x00$\x00\x00\x00\x07\x02g\x04\x9b\x00\ +\x00\xff\xff\x00f\xfe\xc7\x047\x04P\x02&\x00D\x00\ +\x00\x00\x07\x02g\x04\x91\x00\x00\xff\xff\xff\x91\x00\x00\x04\ +\x06\x07\xd3\x02&\x00$\x00\x00\x01\x07\x02f\x04\xfe\x01\ +R\x00\x08\xb3\x02\x13\x05&\x00+5\xff\xff\x00f\xff\ +\xec\x047\x06\x81\x02&\x00D\x00\x00\x01\x07\x02f\x04\ +\xc9\x00\x00\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\xff\ +\x91\x00\x00\x04\xf4\x07\xd1\x02&\x00$\x00\x00\x01\x07\x03\ +w\x04\xd9\x01R\x00\x0a\xb4\x03\x02\x1d\x05&\x00+5\ +5\xff\xff\x00f\xff\xec\x04\xe2\x06\x7f\x02&\x00D\x00\ +\x00\x01\x07\x03w\x04\xc7\x00\x00\x00\x0a\xb4\x03\x020\x11\ +&\x00+55\xff\xff\xff\x91\x00\x00\x03\xe9\x07\xcf\x02\ +&\x00$\x00\x00\x01\x07\x03x\x04\xd9\x01R\x00\x0a\xb4\ +\x03\x02'\x05&\x00+55\xff\xff\x00f\xff\xec\x04\ +7\x06}\x02&\x00D\x00\x00\x01\x07\x03x\x04\xc7\x00\ +\x00\x00\x0a\xb4\x03\x02:\x11&\x00+55\xff\xff\xff\ +\x91\x00\x00\x04\xbe\x08%\x02&\x00$\x00\x00\x01\x07\x03\ +y\x04\xd9\x01R\x00\x0a\xb4\x03\x02\x1d\x05&\x00+5\ +5\xff\xff\x00f\xff\xec\x04\xac\x06\xd3\x02&\x00D\x00\ +\x00\x01\x07\x03y\x04\xc7\x00\x00\x00\x0a\xb4\x03\x020\x11\ +&\x00+55\xff\xff\xff\x91\x00\x00\x04\xa6\x08i\x02\ +&\x00$\x00\x00\x01\x07\x03z\x04\xd9\x01R\x00\x0a\xb4\ +\x03\x02\x1d\x05&\x00+55\xff\xff\x00f\xff\xec\x04\ +\x94\x07\x17\x02&\x00D\x00\x00\x01\x07\x03z\x04\xc7\x00\ +\x00\x00\x0a\xb4\x03\x020\x11&\x00+55\xff\xff\xff\ +\x91\xfe\xc7\x03\xe9\x07s\x02&\x00$\x00\x00\x00'\x01\ +K\x00+\x01R\x01\x07\x02g\x04\x8d\x00\x00\x00\x08\xb3\ +\x02\x15\x05&\x00+5\xff\xff\x00f\xfe\xc7\x047\x06\ +#\x02&\x00D\x00\x00\x00&\x01K\xfd\x02\x01\x07\x02\ +g\x04\x97\x00\x00\x00\x08\xb3\x02)\x11&\x00+5\xff\ +\xff\xff\x91\x00\x00\x04\x1a\x08\x13\x02&\x00$\x00\x00\x01\ +\x07\x03{\x04\xe3\x01R\x00\x0a\xb4\x03\x02\x12\x05&\x00\ ++55\xff\xff\x00f\xff\xec\x047\x06\xc1\x02&\x00\ +D\x00\x00\x01\x07\x03{\x04\xcb\x00\x00\x00\x0a\xb4\x03\x02\ +%\x11&\x00+55\xff\xff\xff\x91\x00\x00\x04\x06\x08\ +\x13\x02&\x00$\x00\x00\x01\x07\x03|\x04\xe3\x01R\x00\ +\x0a\xb4\x03\x02\x12\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x047\x06\xc1\x02&\x00D\x00\x00\x01\x07\x03|\x04\ +\xcb\x00\x00\x00\x0a\xb4\x03\x02%\x11&\x00+55\xff\ +\xff\xff\x91\x00\x00\x04\x06\x08V\x02&\x00$\x00\x00\x01\ +\x07\x03}\x04\xe3\x01R\x00\x0a\xb4\x03\x02\x12\x05&\x00\ ++55\xff\xff\x00f\xff\xec\x047\x07\x04\x02&\x00\ +D\x00\x00\x01\x07\x03}\x04\xcb\x00\x00\x00\x0a\xb4\x03\x02\ +%\x11&\x00+55\xff\xff\xff\x91\x00\x00\x04\x81\x08\ +i\x02&\x00$\x00\x00\x01\x07\x03~\x04\xe3\x01R\x00\ +\x0a\xb4\x03\x02\x12\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x04i\x07\x17\x02&\x00D\x00\x00\x01\x07\x03~\x04\ +\xcb\x00\x00\x00\x0a\xb4\x03\x02%\x11&\x00+55\xff\ +\xff\xff\x91\xfe\xc7\x04#\x07\x1b\x02&\x00$\x00\x00\x00\ +'\x01N\x003\x01R\x01\x07\x02g\x04\x8d\x00\x00\x00\ +\x08\xb3\x02\x12\x05&\x00+5\xff\xff\x00f\xfe\xc7\x04\ +7\x05\xc9\x02&\x00D\x00\x00\x00&\x01N\x02\x00\x01\ +\x07\x02g\x04\x89\x00\x00\x00\x08\xb3\x02%\x11&\x00+\ +5\xff\xff\x00f\xfe\xc7\x04s\x05\xb6\x02&\x00(\x00\ +\x00\x00\x07\x02g\x04\xab\x00\x00\xff\xff\x00f\xfe\xc7\x03\ +}\x04P\x02&\x00H\x00\x00\x00\x07\x02g\x04\x82\x00\ +\x00\xff\xff\x00f\x00\x00\x04s\x07\xd3\x02&\x00(\x00\ +\x00\x01\x07\x02f\x04\xf0\x01R\x00\x08\xb3\x01\x10\x05&\ +\x00+5\xff\xff\x00f\xff\xec\x03\x8b\x06\x81\x02&\x00\ +H\x00\x00\x01\x07\x02f\x04\x83\x00\x00\x00\x08\xb3\x02%\ +\x11&\x00+5\xff\xff\x00f\x00\x00\x04s\x07\x17\x02\ +&\x00(\x00\x00\x01\x07\x01R\x00X\x01R\x00\x08\xb3\ +\x01\x16\x05&\x00+5\xff\xff\x00f\xff\xec\x03\xe0\x05\ +\xc5\x02&\x00H\x00\x00\x01\x06\x01R\xda\x00\x00\x08\xb3\ +\x02+\x11&\x00+5\xff\xff\x00f\x00\x00\x05\x07\x07\ +\xd1\x02&\x00(\x00\x00\x01\x07\x03w\x04\xec\x01R\x00\ +\x0a\xb4\x02\x01\x1a\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x04\xa2\x06\x7f\x02&\x00H\x00\x00\x01\x07\x03w\x04\ +\x87\x00\x00\x00\x0a\xb4\x03\x02/\x11&\x00+55\xff\ +\xff\x00f\x00\x00\x04s\x07\xcf\x02&\x00(\x00\x00\x01\ +\x07\x03x\x04\xf0\x01R\x00\x0a\xb4\x02\x01$\x05&\x00\ ++55\xff\xff\x00f\xff\xec\x03\x97\x06}\x02&\x00\ +H\x00\x00\x01\x07\x03x\x04\x87\x00\x00\x00\x0a\xb4\x03\x02\ +9\x11&\x00+55\xff\xff\x00f\x00\x00\x04\xd1\x08\ +%\x02&\x00(\x00\x00\x01\x07\x03y\x04\xec\x01R\x00\ +\x0a\xb4\x02\x01\x1a\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x04l\x06\xd3\x02&\x00H\x00\x00\x01\x07\x03y\x04\ +\x87\x00\x00\x00\x0a\xb4\x03\x02/\x11&\x00+55\xff\ +\xff\x00f\x00\x00\x04\xbd\x08i\x02&\x00(\x00\x00\x01\ +\x07\x03z\x04\xf0\x01R\x00\x0a\xb4\x02\x01\x1a\x05&\x00\ ++55\xff\xff\x00f\xff\xec\x04T\x07\x17\x02&\x00\ +H\x00\x00\x01\x07\x03z\x04\x87\x00\x00\x00\x0a\xb4\x03\x02\ +/\x11&\x00+55\xff\xff\x00f\xfe\xc7\x04s\x07\ +s\x02&\x00(\x00\x00\x00'\x01K\x00F\x01R\x01\ +\x07\x02g\x04\xab\x00\x00\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\x00f\xfe\xc7\x03\x8e\x06!\x02&\x00H\x00\ +\x00\x00&\x01K\xd0\x00\x01\x07\x02g\x04\x8f\x00\x00\x00\ +\x08\xb3\x02(\x11&\x00+5\xff\xff\xff\xdb\x00\x00\x03\ +\x12\x07\xd3\x02&\x00,\x00\x00\x01\x07\x02f\x04\x0a\x01\ +R\x00\x08\xb3\x01\x10\x05&\x00+5\xff\xff\x00L\x00\ +\x00\x02\x97\x06\x81\x02&\x00\xf3\x00\x00\x01\x07\x02f\x03\ +\x8f\x00\x00\x00\x08\xb3\x01\x08\x11&\x00+5\xff\xff\xff\ +\xdb\xfe\xc7\x02\xb2\x05\xb6\x02&\x00,\x00\x00\x00\x07\x02\ +g\x03w\x00\x00\xff\xff\x00\x12\xfe\xc7\x01\xe9\x05\xcf\x02\ +&\x00L\x00\x00\x00\x07\x02g\x03<\x00\x00\xff\xff\x00\ +\xac\xfe\xc7\x05{\x05\xcb\x02&\x002\x00\x00\x00\x07\x02\ +g\x05|\x00\x00\xff\xff\x00b\xfe\xc7\x04\x02\x04T\x02\ +&\x00R\x00\x00\x00\x07\x02g\x04\xad\x00\x00\xff\xff\x00\ +\xac\xff\xec\x05{\x07\xd3\x02&\x002\x00\x00\x01\x07\x02\ +f\x05\xaa\x01R\x00\x08\xb3\x02 \x05&\x00+5\xff\ +\xff\x00b\xff\xec\x04\x02\x06\x81\x02&\x00R\x00\x00\x01\ +\x07\x02f\x04\xa6\x00\x00\x00\x08\xb3\x02\x1f\x11&\x00+\ +5\xff\xff\x00\xac\xff\xec\x05\x94\x07\xd1\x02&\x002\x00\ +\x00\x01\x07\x03w\x05y\x01R\x00\x0a\xb4\x03\x02*\x05\ +&\x00+55\xff\xff\x00b\xff\xec\x04\xae\x06\x7f\x02\ +&\x00R\x00\x00\x01\x07\x03w\x04\x93\x00\x00\x00\x0a\xb4\ +\x03\x02)\x11&\x00+55\xff\xff\x00\xac\xff\xec\x05\ +{\x07\xcf\x02&\x002\x00\x00\x01\x07\x03x\x05u\x01\ +R\x00\x0a\xb4\x03\x024\x05&\x00+55\xff\xff\x00\ +b\xff\xec\x04\x02\x06}\x02&\x00R\x00\x00\x01\x07\x03\ +x\x04\x93\x00\x00\x00\x0a\xb4\x03\x023\x11&\x00+5\ +5\xff\xff\x00\xac\xff\xec\x05{\x08%\x02&\x002\x00\ +\x00\x01\x07\x03y\x05u\x01R\x00\x0a\xb4\x03\x02*\x05\ +&\x00+55\xff\xff\x00b\xff\xec\x04x\x06\xd3\x02\ +&\x00R\x00\x00\x01\x07\x03y\x04\x93\x00\x00\x00\x0a\xb4\ +\x03\x02)\x11&\x00+55\xff\xff\x00\xac\xff\xec\x05\ +{\x08i\x02&\x002\x00\x00\x01\x07\x03z\x05u\x01\ +R\x00\x0a\xb4\x03\x02*\x05&\x00+55\xff\xff\x00\ +b\xff\xec\x04`\x07\x17\x02&\x00R\x00\x00\x01\x07\x03\ +z\x04\x93\x00\x00\x00\x0a\xb4\x03\x02)\x11&\x00+5\ +5\xff\xff\x00\xac\xfe\xc7\x05{\x07s\x02&\x002\x00\ +\x00\x00'\x01K\x00\xcd\x01R\x01\x07\x02g\x05x\x00\ +\x00\x00\x08\xb3\x02#\x05&\x00+5\xff\xff\x00b\xfe\ +\xc7\x04\x02\x06!\x02&\x00R\x00\x00\x00&\x01K\xef\ +\x00\x01\x07\x02g\x04\xad\x00\x00\x00\x08\xb3\x02\x22\x11&\ +\x00+5\xff\xff\x00\xac\xff\xec\x06\x7f\x07s\x02&\x02\ +_\x00\x00\x01\x07\x00v\x00\xe7\x01R\x00\x08\xb3\x02.\ +\x05&\x00+5\xff\xff\x00b\xff\xec\x04\xf6\x06!\x02\ +&\x02`\x00\x00\x01\x06\x00v\x06\x00\x00\x08\xb3\x02+\ +\x11&\x00+5\xff\xff\x00\xac\xff\xec\x06\x7f\x07s\x02\ +&\x02_\x00\x00\x01\x07\x00C\x00\xcf\x01R\x00\x08\xb3\ +\x02&\x05&\x00+5\xff\xff\x00b\xff\xec\x04\xf6\x06\ +!\x02&\x02`\x00\x00\x01\x06\x00C\xef\x00\x00\x08\xb3\ +\x02$\x11&\x00+5\xff\xff\x00\xac\xff\xec\x06\x7f\x07\ +\xd3\x02&\x02_\x00\x00\x01\x07\x02f\x05\xaa\x01R\x00\ +\x08\xb3\x02(\x05&\x00+5\xff\xff\x00b\xff\xec\x04\ +\xf6\x06\x81\x02&\x02`\x00\x00\x01\x07\x02f\x04\xa6\x00\ +\x00\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\x00\xac\xff\ +\xec\x06\x7f\x07\x17\x02&\x02_\x00\x00\x01\x07\x01R\x00\ +\xe5\x01R\x00\x08\xb3\x02/\x05&\x00+5\xff\xff\x00\ +b\xff\xec\x04\xf6\x05\xc5\x02&\x02`\x00\x00\x01\x06\x01\ +R\x06\x00\x00\x08\xb3\x02#\x11&\x00+5\xff\xff\x00\ +\xac\xfe\xc7\x06\x7f\x06\x14\x02&\x02_\x00\x00\x00\x07\x02\ +g\x05x\x00\x00\xff\xff\x00b\xfe\xc7\x04\xf6\x04\xe3\x02\ +&\x02`\x00\x00\x00\x07\x02g\x04\x9d\x00\x00\xff\xff\x00\ +\xb0\xfe\xc7\x05s\x05\xb6\x02&\x008\x00\x00\x00\x07\x02\ +g\x05$\x00\x00\xff\xff\x00m\xfe\xc7\x04+\x04?\x02\ +&\x00X\x00\x00\x00\x07\x02g\x04\x91\x00\x00\xff\xff\x00\ +\xb0\xff\xec\x05s\x07\xd3\x02&\x008\x00\x00\x01\x07\x02\ +f\x05m\x01R\x00\x08\xb3\x01\x18\x05&\x00+5\xff\ +\xff\x00m\xff\xf0\x04+\x06\x81\x02&\x00X\x00\x00\x01\ +\x07\x02f\x04\xc3\x00\x00\x00\x08\xb3\x01\x1d\x11&\x00+\ +5\xff\xff\x00\xb0\xff\xec\x06\xae\x07s\x02&\x02a\x00\ +\x00\x01\x07\x00v\x00\xe7\x01R\x00\x08\xb3\x01&\x05&\ +\x00+5\xff\xff\x00m\xff\xf0\x05w\x06!\x02&\x02\ +b\x00\x00\x01\x06\x00v\x1b\x00\x00\x08\xb3\x01*\x11&\ +\x00+5\xff\xff\x00\xb0\xff\xec\x06\xae\x07s\x02&\x02\ +a\x00\x00\x01\x07\x00C\x00\xcf\x01R\x00\x08\xb3\x01\x1e\ +\x05&\x00+5\xff\xff\x00m\xff\xf0\x05w\x06!\x02\ +&\x02b\x00\x00\x01\x06\x00C\x04\x00\x00\x08\xb3\x01\x22\ +\x11&\x00+5\xff\xff\x00\xb0\xff\xec\x06\xae\x07\xd3\x02\ +&\x02a\x00\x00\x01\x07\x02f\x05\x83\x01R\x00\x08\xb3\ +\x01 \x05&\x00+5\xff\xff\x00m\xff\xf0\x05w\x06\ +\x81\x02&\x02b\x00\x00\x01\x07\x02f\x04\xcd\x00\x00\x00\ +\x08\xb3\x01%\x11&\x00+5\xff\xff\x00\xb0\xff\xec\x06\ +\xae\x07\x17\x02&\x02a\x00\x00\x01\x07\x01R\x00\xdd\x01\ +R\x00\x08\xb3\x01'\x05&\x00+5\xff\xff\x00m\xff\ +\xf0\x05w\x05\xc5\x02&\x02b\x00\x00\x01\x06\x01R\x19\ +\x00\x00\x08\xb3\x01\x22\x11&\x00+5\xff\xff\x00\xb0\xfe\ +\xc7\x06\xae\x06\x14\x02&\x02a\x00\x00\x00\x07\x02g\x05\ +$\x00\x00\xff\xff\x00m\xfe\xc7\x05w\x04\xe5\x02&\x02\ +b\x00\x00\x00\x07\x02g\x04\x97\x00\x00\xff\xff\x00\xc1\xfe\ +\xc7\x04\x83\x05\xb6\x02&\x00<\x00\x00\x00\x07\x02g\x04\ +2\x00\x00\xff\xff\xff'\xfe\x14\x03\xf0\x04?\x02&\x00\ +\x5c\x00\x00\x00\x07\x02g\x05t\x00\x00\xff\xff\x00\xc1\x00\ +\x00\x04\x83\x07\xd3\x02&\x00<\x00\x00\x01\x07\x02f\x04\ +\xaa\x01R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\xff\xff\ +'\xfe\x14\x03\xf0\x06\x81\x02&\x00\x5c\x00\x00\x01\x07\x02\ +f\x04/\x00\x00\x00\x08\xb3\x01\x1c\x11&\x00+5\xff\ +\xff\x00\xc1\x00\x00\x04\x83\x07\x17\x02&\x00<\x00\x00\x01\ +\x07\x01R\x00\x0c\x01R\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\xff'\xfe\x14\x03\xf0\x05\xc5\x02&\x00\x5c\x00\ +\x00\x01\x06\x01R\x97\x00\x00\x08\xb3\x01\x22\x11&\x00+\ +5\xff\xff\xff\xf4\xfe\xdd\x05\x0e\x06\x14\x02&\x00\xd3\x00\ +\x00\x00\x07\x00B\x00\xaa\x00\x00\x00\x02\xfb\xd3\x04\xd9\xfe\ +?\x06!\x00\x08\x00\x11\x00\x0e\xb4\x0e\x06\x80\x0a\x01\x00\ +/3\x1a\xcd210\x01#&&'53\x16\x17\ +\x05#&&'53\x16\x17\xfc\xf4J/\x8a\x1e}\ +1s\x01KI/\x8a\x1e}/t\x04\xd9/\xc8<\ +\x15\x89\xa6\x19/\xc8<\x15\x84\xab\x00\x00\x02\xfd\x02\x04\ +\xd9\x00\x1b\x06\x7f\x00\x0e\x00\x18\x00\x1f@\x11\x18\x12@\ +\x0d\x10H\x12\x80\x09\x0cH\x12\x0b\x03\x80\x0e\x09\x00/\ +3\x1a\xcd2\xdc++\xcc10\x016673\x16\ +\x16\x17\x15#&'\x06\x07#%6673\x15\x06\ +\x06\x07#\xfd\x02?\xa91M\x10_9$cZ\x7f\ +\x89%\x01\xdb2m\x1e\x817\x8f6B\x04\xf2'\x97\ +9+\x90>\x177ih8\xdf%w+\x1f9m\ +\x1e\x00\x02\xfcm\x04\xd9\xff\x10\x06}\x00\x09\x00\x18\x00\ +!@\x12\x15\x0d\x13\x00\x04@\x0d\x11H\x04\x80\x09\x0c\ +H\x04\x80\x18\x13\x00/3\x1a\xdc++\xcd\x10\xcd2\ +10\x01&&'53\x16\x16\x17\x15\x07667\ +3\x16\x16\x17\x15#&'\x06\x07#\xfd97{\x1a\ +r\x1fU$u?\xa91M\x10_9$cZ\x7f\ +\x89%\x05\x9a\x22t.\x1f;o\x1f\x1a\xa8'\x979\ ++\x90>\x177ih8\x00\x00\x02\xfd\x02\x04\xd9\xff\ +\xe5\x06\xd3\x00\x0e\x00\x1e\x003@\x1d\x11\x14\x14@\x09\ +\x0eH\x13\x14\x13\x14\x18\x1d@\x0b\x16H\x0f\x1d\x1f\x1d\ +\x02\x02\x1d\x0b\x03\x80\x0e\x09\x00/3\x1a\xcd2\xcc_\ +]+299//+\x11310\x01667\ +3\x16\x16\x17\x15#&'\x06\x07#\x01\x14\x07\x07#\ +7654#\x22\x075632\xfd\x02?\xa91\ +M\x10_9$cZ\x7f\x89%\x02\xe3\xac\x06?\x06\ +\x9cW\x1e1--\x9b\x04\xf2'\x979+\x90>\x17\ +7ih8\x01\x8fl!)X\x0cL8\x09:\x08\ +\x00\x00\x02\xfd\x02\x04\xd9\xff\xcd\x07\x17\x00\x0e\x00(\x00\ +%@\x13%\x15\x1c\x22\x18\xaf\x0f\x01\x0f@\x09\x0eH\ +\x0f\x0b\x03\x80\x0e\x09\x00/3\x1a\xcd2\xd4+]\xc6\ +3\xdd2\xc610\x016673\x16\x16\x17\x15#\ +&'\x06\x07#\x01\x22&'&&#\x22\x06\x07#\ +6632\x16\x17\x16\x1632673\x06\x06\xfd\ +\x02?\xa91M\x10_9$cZ\x7f\x89%\x01\xfe\ +*K)#>(.=\x16L\x13kU2M\x1d\ +;2\x1c-;\x13N\x1ae\x04\xf2'\x979+\x90\ +>\x177ih8\x01k\x22\x17\x16!4Cel\ +$\x13'\x14:Ane\x00\x00\x02\xfd!\x04\xdf\xff\ +7\x06\xc1\x00\x0f\x00\x19\x00\x19@\x0c\x13\x19@\x09\x11\ +H\x19\x00\x09\x80\x0c\x03\x00/3\x1a\xcc2\xdc+\xcc\ +10\x03\x06\x06#\x22&5573\x14\x1632\ +67'6673\x15\x06\x06\x07#\xdd\x1d\x8ez\ +it\x02EHVUg\x19\xe1*o#\x81.\x90\ +>A\x05\xc9wse\x5c\x15\x14DF=M1 \ +t3\x1f2q\x22\x00\x00\x02\xfd!\x04\xdf\xff#\x06\ +\xc1\x00\x0f\x00\x19\x00\x19@\x0c\x14\x10@\x09\x11H\x10\ +\x0f\x08\x80\x0c\x03\x00/3\x1a\xcd2\xdc+\xcd10\ +\x03\x06\x06#\x22&5573\x14\x163267\ +'&&'53\x16\x16\x17\x15\xdd\x1d\x8ezit\ +\x02EHVUg\x19\xba>w\x18s\x14Z)\x05\ +\xc9wse\x5c\x15\x14DF=M\x14&t+\x1f\ ++{#\x1b\x00\x00\x02\xfd!\x04\xdf\xff#\x07\x04\x00\ +\x0f\x00 \x000\xb3\x13\x16\x16\x1a\xb8\xff\xf0@\x15\x09\ +\x0cH\x1a\x1f@\x09\x10H\x1f\x15@\x09\x11H\x15\x0f\ +\x09\x80\x0c\x03\x00/3\x1a\xcc2\xdc+\xcc+2+\ +9/310\x03\x06\x06#\x22&5573\x14\ +\x1632677\x14\x06\x07\x07#7654#\ +\x22\x075632\xdd\x1d\x8ezit\x02EHV\ +Ug\x19\x11`U\x06C\x06\xa4[\x222? \xa4\ +\x05\xc9wse\x5c\x15\x14DF=M\xca8N\x0f\ ++^\x0bQ:\x09<\x0a\x00\x00\x02\xfc\xdd\x04\xdf\xff\ +\x9e\x07\x17\x00\x0f\x00)\x00!@\x10&\x16\x1d#\x19\ +\x10@\x09\x0eH\x10\x00\x09\x80\x0c\x03\x00/3\x1a\xcc\ +2\xd4+22\xcd2210\x03\x06\x06#\x22&\ +5573\x14\x163267'\x22&'&&\ +#\x22\x06\x07#6632\x16\x17\x16\x16326\ +73\x06\x06\xdd\x1d\x8ezit\x02EHVUg\ +\x19\x0a*L(#>(.=\x16L\x13kU2\ +M\x1d;2\x1c-;\x13N\x1ae\x05\xc9wse\ +\x5c\x15\x14DF=M{\x22\x17\x16!4Cel\ +$\x13'\x14:Ane\x00\x00\x01\xffs\xfeb\x00\ +\x9a\x00\x00\x00\x0e\x00\x0a\xb2\x00\x0a\x05\x00/\xcc21\ +0\x03254'3\x16\x15\x14\x06#\x22'7\x16\ +;v T+mh2 \x0e\x1b\xfe\xac\xa0dP\ +sKfz\x0fE\x0a\x00\x01\x00\x1b\xfe\xb0\x01B\x00\ +^\x00\x0c\x00\x0a\xb2\x09\x04\x00\x00/\xcc210%\ +\x03\x06\x06#\x22'5\x163277\x01B8\x12\ +RH0\x13 !T\x131^\xfe\xfcWS\x11X\ +\x0fg\xed\x00\x01\x00\x1b\xfe\xb0\x01?\x00T\x00\x0c\x00\ +\x0a\xb2\x09\x04\x00\x00/\xcc210%\x07\x06\x06#\ +\x22'5\x163277\x01?5\x12RH0\x13\ + !T\x13/T\xfaWS\x11X\x0fg\xe3\x00\xff\ +\xff\x00\x88\x00\x00\x02x\x05\xb6\x00\x07\x00\x14\xff&\x00\ +\x00\x00\x02\x00h\xff\xec\x03\xe9\x04d\x00\x0d\x00\x1b\x00\ +\x17@\x0c\x0b\x0eMY\x0b&\x04\x15MY\x04\x19\x00\ +?+\x00\x18?+10\x01\x14\x02\x06#\x22&5\ +4\x12632\x16%\x22\x06\x02\x15\x14\x16326\ +\x1254&\x03\xe9\x89\xec\x9b\xb3\xbe\x89\xf3\x93\xaf\xc3\ +\xfe\x8au\xc0q\x92\x84{\xbci\x8e\x02\xc1\xcc\xfe\xa7\ +\xb0\xdc\xd0\xc7\x01J\xbb\xdd\x89\x9f\xfe\xda\xab\xb6\xab\xa3\ +\x01'\xb3\xa2\xb2\x00\x01\x00/\x00\x00\x02\x1f\x04Z\x00\ +\x0a\x00\x0e\xb5\x04\x07\x09\x10\x01\x18\x00??\xcd31\ +0!#\x1367\x06\x06\x07'\x013\x01/h\x97\ +4\x16(Y\xc53\x01\x96Z\x02\xc1\xdfG#?{\ +N\x01\x02\x00\x01\xff\xcf\x00\x00\x03Z\x04d\x00\x1a\x00\ +\x1e@\x0f\x07\x01\x10\x10\x0aLY\x10&\x01\x19LY\ +\x01\x18\x00?+\x00\x18?+\x11\x12\x00910!\ +!7\x01>\x0254&#\x22\x07'6632\ +\x16\x15\x14\x06\x06\x07\x01\x15!\x02\xdd\xfc\xf2\x18\x01\xcb\ +\x8az8th\xa2\x9f;T\xb9q\x99\xadI\x84\x89\ +\xfek\x02\x81j\x01HcyuEXh\x8bNH\ +Q\x94~V\x95\x89_\xfe\xe7\x06\x00\x00\x01\xff\x82\xfe\ +\x87\x03d\x04f\x00(\x00-@\x17\x03\x18\x19\x19\x18\ +LY\x19\x19\x0b&& KY&&\x0b\x11KY\ +\x0b%\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x00910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x06\ +\x06#\x22&'5\x1632654&##7\ +32654&#\x22\x07'6632\x16\x03\ +d\xd4\xb4u\x89\x80\xe7\x9f`\xb1A\xac\xac\xc5\xd5\xb2\ +\x9eu\x15n\xd1\xf8\x7f}\xa7\xb11T\xd0r\xa1\xb7\ +\x031\xa2\xe2\x1e\x04\x18\xb7\x87\x86\xc6b) eV\ +\xb3\xa3\x91\x9c`\xbf\xa3rz\x83KCK\xa5\x00\x00\ +\x02\xff\xb8\xfe\xa0\x03\xe5\x04Z\x00\x0a\x00\x12\x00!@\ +\x10\x0f\x07\x01\x05\x12\x05KY\x09\x12\x12\x03\x07\x10\x03\ +$\x00??\x129/3+\x11\x003\x11310\ +%!\x03#\x13!7\x013\x03!!\x13\x127#\ +\x06\x07\x01\x03\xd1\xfe\xf8P`O\xfdP\x15\x03nw\ +\xd5\x01\x08\xfe\x96h;(\x048L\xfdy\x12\xfe\x8e\ +\x01ra\x03\xe7\xfc\x10\x01\xea\x01\x0b\x93RV\xfd \ +\x00\x00\x01\xff\xe8\xfe\x87\x03\xc3\x04Q\x00\x1b\x00/@\ +\x18\x14\x1a\x1a\x00\x00\x12MY\x00\x00\x06\x16\x16\x19L\ +Y\x16\x10\x06\x0cKY\x06%\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x003\x11310\x012\ +\x16\x15\x14\x00!\x22&'5\x1632654&\ +#\x22\x07'\x13!\x07!\x036\x01\xd6\xbc\xd1\xfe\xd8\ +\xfe\xfdT\xbbA\xaa\xaa\xd0\xf1\xaa\x8c\x85nB\xc1\x02\ +p\x12\xfd\xe3\x95b\x02\x0a\xcc\xb1\xed\xfe\xe7(\x1fk\ +Z\xe5\xc7\x8c\x9f)1\x02\x93`\xfd\xfc\x1d\xff\xff\x00\ +l\xff\xec\x04\x18\x05\xc9\x00\x06\x00\x19\xc2\x00\x00\x01\xff\ +\xf5\xfe\x99\x03\x84\x04O\x00\x06\x00\x16@\x0a\x00$\x05\ +\x02\x03\x02LY\x03\x10\x00?+\x11\x003\x18?1\ +0\x03\x01!7!\x07\x01\x0b\x03\x1c\xfd\x02\x17\x03Z\ +\x14\xfc\xf5\xfe\x99\x05V`n\xfa\xb8\xff\xff\x00W\xff\ +\xec\x047\x05\xcd\x00\x06\x00\x1b\xf5\x00\x00\x02\xff\xff\xfe\ +\x83\x03\xaf\x04`\x00\x17\x00&\x00-@\x17\x0c\x04\x15\ +\x1f\x0eLY\x1f\x1f\x04\x15\x15\x18KY\x15&\x04\x09\ +MY\x04%\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x01\x10\x02\x04#\x22'5\ +\x163 \x13#\x06#\x22&546632\x16\ +%\x22\x06\x06\x15\x14\x1632>\x0254&\x03\xaf\ +\xcb\xfe\xbc\xe7rHWi\x01\xda\x99\x08\x8c\xe3\xa2\xba\ +w\xde\x92\xae\xbb\xfe\x8bp\xabZ\x87}S\x95m,\ +\x8e\x02\x9f\xfe\xe0\xfd\xf8\xf4\x16Z\x1d\x02\xa2\xc0\xd2\xb3\ +\x9b\xfc\x8c\xe7\x8fu\xd0~\x91\xa0Anvu\xa6\xb4\ +\x00\x00\x01\xff\x17\xfe\x14\x05\xb2\x06\x1f\x00;\x008@\ +\x1d3\x05\x00\x05GY.\x00\x1b#\x15\x10\x15FY\ +\x1e\x10\x00*8\x0a\x0c\x0aHY'\x19\x0c\x0f\x00?\ +33+\x11\x0033\x18?3+\x11\x003\x18?\ +3+\x11\x00310\x03\x22'5\x163267\ +\x13#?\x026632\x17\x07&#\x22\x06\x07\x07\ +!76632\x17\x07&#\x22\x06\x07\x073\x07\ +#\x03\x06\x06#\x22'5\x163267\x13!\x03\ +\x06\x06\x83065/X\x5c\x1d\xf6\xcd\x0e\xcd##\ +\xa3\x92I]\x19W<`s\x1b#\x01\xdd##\xa3\ +\x92I]\x18W=as\x19#\xf8\x11\xf8\xfc\x22\x8f\ +z065/X\x5c\x1d\xf4\xfe#\xfc!\x8e\xfe\x14\ +\x13Z\x10j\x85\x04\x8eC\x0e\xa0\xa8\x98\x1fP\x1bk\ +}\xa4\xa0\xa8\x98\x1fP\x1bm{\xa4Q\xfbZ\xa5\x8f\ +\x13Z\x10j\x85\x04\x8e\xfbZ\xa1\x93\x00\x02\x00)\x02\ +\xdd\x05+\x05\xc1\x00$\x005\x00#@\x103'-\ +%1*+\x08\x03\x15.+\x03\x1b\x15\x04\x00?3\ +?3\x10\xc42\x10\xcd2223310\x01\x14\ +\x06#\x22'5\x1632654&'.\x025\ +4632\x17\x07&&#\x22\x06\x15\x14\x16\x17\x1e\ +\x02\x05\x03#\x17\x11#\x113\x13\x133\x11#\x117\ +#\x03\x01\xf0\x8dzoQ]a[\x5c?mQJ\ +\x1e\x81_Yk\x16!d)EG7_`L!\ +\x01\xb6\xdd\x06\x04R}\xdd\xdf}V\x04\x06\xe3\x03\xa8\ +]n\x1dR#C859+!3?:Oh\ +\x1fL\x0b\x12;2.6#&6H\xf6\x02a\xc9\ +\xfeh\x02\xd1\xfd\xa2\x02^\xfd/\x01\x8e\xcf\xfd\xa3\xff\ +\xff\x00y\xfe\x14\x04\xa2\x05\xb6\x02&\x007\x00\x00\x00\ +\x07\x00z\x01'\x00\x00\xff\xff\x007\xfe\x14\x02\xb6\x05\ +?\x02&\x00W\x00\x00\x00\x07\x00z\x00\xe5\x00\x00\x00\ +\x02\x00F\xfe\x14\x047\x04P\x00\x1e\x00-\x00.@\ +\x18\x0c\x18\x0f\x16\x1a\x0f\x16'FY\x16\x10\x0f\x1fG\ +Y\x0f\x16\x00\x07FY\x00\x1b\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?\x11\x129910\x01\x22&\ +'5\x16\x163267\x13#\x06\x06#\x22&5\ +4\x12632\x17373\x03\x06\x06\x03266\ +\x1254&#\x22\x06\x02\x15\x14\x16\x01fH\x9c<\ +>\xa3H\x9b\xb5*F\x08H\xe5{\x89\x8e\x95\xf6\x9e\ +\xe41\x06;P\xf11\xeb\x94U\xb3\x91H{k|\ +\xc8\x80e\xfe\x14'\x1fg'0\xa4\xbf\x01E\x88\x9e\ +\xbf\xb7\xc4\x01k\xbf\xdb\xca\xfb\x86\xe3\xce\x022x\xd5\ +\x01\x03O\x7f\x96\xa3\xfe\xc0\xaa\x98\x8f\xff\xff\x00F\xfe\ +\x14\x047\x06!\x02&\x03\x91\x00\x00\x01\x06\x01K\x12\ +\x00\x00\x08\xb3\x025\x11&\x00+5\xff\xff\x00F\xfe\ +\x14\x047\x05\xc9\x02&\x03\x91\x00\x00\x01\x06\x01N\xfb\ +\x00\x00\x08\xb3\x021\x11&\x00+5\xff\xff\x00F\xfe\ +\x14\x047\x05\xcf\x02&\x03\x91\x00\x00\x01\x07\x01O\x01\ +7\x00\x00\x00\x08\xb3\x026\x11&\x00+5\xff\xff\x00\ +F\xfe\x14\x047\x06!\x02&\x03\x91\x00\x00\x01\x06\x02\ +:j\x00\x00\x08\xb3\x022\x11&\x00+5\x00\x01\x00\ +f\x00\x00\x01\xfe\x05\xb6\x00\x03\x00\x0a\xb3\x01\x03\x00\x12\ +\x00??103\x013\x01f\x016b\xfe\xcb\x05\ +\xb6\xfaJ\xff\xff\x00f\x00\x00\x02\x0d\x07s\x02&\x03\ +\x96\x00\x00\x01\x07\x00C\xff\x0f\x01R\x00\x08\xb3\x01\x05\ +\x05&\x00+5\xff\xff\x00f\x00\x00\x03D\x07s\x02\ +&\x03\x96\x00\x00\x01\x07\x00v\xff_\x01R\x00\x08\xb3\ +\x01\x0d\x05&\x00+5\xff\xff\x00f\x00\x00\x02\xe2\x07\ +s\x02&\x03\x96\x00\x00\x01\x07\x01K\xff$\x01R\x00\ +\x08\xb3\x01\x0b\x05&\x00+5\xff\xff\x00f\x00\x00\x02\ +\xdf\x07\x13\x02&\x03\x96\x00\x00\x01\x07\x00j\xff\x18\x01\ +R\x00\x0a\xb4\x02\x01\x16\x05&\x00+55\xff\xff\x00\ +f\x00\x00\x03F\x07\x17\x02&\x03\x96\x00\x00\x01\x07\x01\ +R\xff@\x01R\x00\x08\xb3\x01\x0e\x05&\x00+5\xff\ +\xff\x00f\x00\x00\x02\xe4\x06\x87\x02&\x03\x96\x00\x00\x01\ +\x07\x01M\xff6\x01R\x00\x08\xb3\x01\x07\x05&\x00+\ +5\xff\xff\x00f\x00\x00\x03\x01\x07\x1b\x02&\x03\x96\x00\ +\x00\x01\x07\x01N\xff\x11\x01R\x00\x08\xb3\x01\x07\x05&\ +\x00+5\xff\xff\xff\xa8\xfeb\x01\xfe\x05\xb6\x02&\x03\ +\x96\x00\x00\x00\x06\x01Q/\x00\xff\xff\x00f\x00\x00\x02\ +B\x07!\x02&\x03\x96\x00\x00\x01\x07\x01O\x00q\x01\ +R\x00\x08\xb3\x01\x0c\x05&\x00+5\xff\xff\x00f\xfe\ +\x98\x03\xec\x05\xb6\x00&\x03\x96\x00\x00\x00\x07\x00-\x01\ +\xf8\x00\x00\xff\xff\x00m\x00\x00\x02\x9a\x06\x16\x00'\x03\ +\x96\x00\x9c\x00\x00\x01\x07\x01T\xfd\xe2\xff\x97\x00\x07\xb2\ +\x01\x08\x00\x00?5\x00\xff\xff\x00f\x00\x00\x01\xfe\x05\ +\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00f\x00\x00\x02\xdf\x07\ +\x13\x02&\x03\x96\x00\x00\x01\x07\x00j\xff\x18\x01R\x00\ +\x0a\xb4\x02\x01\x16\x05&\x00+55\xff\xff\x00f\x00\ +\x00\x01\xfe\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00f\x00\ +\x00\x02\xdf\x07\x13\x02&\x03\x96\x00\x00\x01\x07\x00j\xff\ +\x18\x01R\x00\x0a\xb4\x02\x01\x16\x05&\x00+55\xff\ +\xff\x00f\x00\x00\x01\xfe\x05\xb6\x02\x06\x03\x96\x00\x00\xff\ +\xff\x00f\x00\x00\x01\xfe\x05\xb6\x02\x06\x03\x96\x00\x00\xff\ +\xff\x00f\x00\x00\x02\xf1\x07\xd3\x02&\x03\x96\x00\x00\x01\ +\x07\x02f\x03\xe9\x01R\x00\x08\xb3\x01\x08\x05&\x00+\ +5\xff\xff\x000\xfe\xc7\x01\xfe\x05\xb6\x02&\x03\x96\x00\ +\x00\x00\x07\x02g\x03Z\x00\x00\x00\x00\x00\x00\x00\x01\x00\ +\x00\xb62\x00\x01I\x06\x80\x00\x00\x0e6$\x00\x05\x00\ +$\xffq\x00\x05\x007\x00)\x00\x05\x009\x00)\x00\ +\x05\x00:\x00)\x00\x05\x00<\x00\x14\x00\x05\x00D\xff\ +\xae\x00\x05\x00F\xff\x85\x00\x05\x00G\xff\x85\x00\x05\x00\ +H\xff\x85\x00\x05\x00J\xff\xc3\x00\x05\x00P\xff\xc3\x00\ +\x05\x00Q\xff\xc3\x00\x05\x00R\xff\x85\x00\x05\x00S\xff\ +\xc3\x00\x05\x00T\xff\x85\x00\x05\x00U\xff\xc3\x00\x05\x00\ +V\xff\xc3\x00\x05\x00X\xff\xc3\x00\x05\x00\x82\xffq\x00\ +\x05\x00\x83\xffq\x00\x05\x00\x84\xffq\x00\x05\x00\x85\xff\ +q\x00\x05\x00\x86\xffq\x00\x05\x00\x87\xffq\x00\x05\x00\ +\x9f\x00\x14\x00\x05\x00\xa2\xff\x85\x00\x05\x00\xa3\xff\xae\x00\ +\x05\x00\xa4\xff\xae\x00\x05\x00\xa5\xff\xae\x00\x05\x00\xa6\xff\ +\xae\x00\x05\x00\xa7\xff\xae\x00\x05\x00\xa8\xff\xae\x00\x05\x00\ +\xa9\xff\x85\x00\x05\x00\xaa\xff\x85\x00\x05\x00\xab\xff\x85\x00\ +\x05\x00\xac\xff\x85\x00\x05\x00\xad\xff\x85\x00\x05\x00\xb4\xff\ +\x85\x00\x05\x00\xb5\xff\x85\x00\x05\x00\xb6\xff\x85\x00\x05\x00\ +\xb7\xff\x85\x00\x05\x00\xb8\xff\x85\x00\x05\x00\xba\xff\x85\x00\ +\x05\x00\xbb\xff\xc3\x00\x05\x00\xbc\xff\xc3\x00\x05\x00\xbd\xff\ +\xc3\x00\x05\x00\xbe\xff\xc3\x00\x05\x00\xc2\xffq\x00\x05\x00\ +\xc3\xff\xae\x00\x05\x00\xc4\xffq\x00\x05\x00\xc5\xff\xae\x00\ +\x05\x00\xc6\xffq\x00\x05\x00\xc7\xff\xae\x00\x05\x00\xc9\xff\ +\x85\x00\x05\x00\xcb\xff\x85\x00\x05\x00\xcd\xff\x85\x00\x05\x00\ +\xcf\xff\x85\x00\x05\x00\xd1\xff\x85\x00\x05\x00\xd3\xff\x85\x00\ +\x05\x00\xd5\xff\x85\x00\x05\x00\xd7\xff\x85\x00\x05\x00\xd9\xff\ +\x85\x00\x05\x00\xdb\xff\x85\x00\x05\x00\xdd\xff\x85\x00\x05\x00\ +\xdf\xff\xc3\x00\x05\x00\xe1\xff\xc3\x00\x05\x00\xe3\xff\xc3\x00\ +\x05\x00\xe5\xff\xc3\x00\x05\x00\xfa\xff\xc3\x00\x05\x01\x06\xff\ +\xc3\x00\x05\x01\x08\xff\xc3\x00\x05\x01\x0d\xff\xc3\x00\x05\x01\ +\x0f\xff\x85\x00\x05\x01\x11\xff\x85\x00\x05\x01\x13\xff\x85\x00\ +\x05\x01\x15\xff\x85\x00\x05\x01\x17\xff\xc3\x00\x05\x01\x19\xff\ +\xc3\x00\x05\x01\x1d\xff\xc3\x00\x05\x01!\xff\xc3\x00\x05\x01\ +$\x00)\x00\x05\x01&\x00)\x00\x05\x01+\xff\xc3\x00\ +\x05\x01-\xff\xc3\x00\x05\x01/\xff\xc3\x00\x05\x011\xff\ +\xc3\x00\x05\x013\xff\xc3\x00\x05\x015\xff\xc3\x00\x05\x01\ +6\x00)\x00\x05\x018\x00\x14\x00\x05\x01:\x00\x14\x00\ +\x05\x01C\xffq\x00\x05\x01D\xff\xae\x00\x05\x01F\xff\ +\xae\x00\x05\x01H\xff\x85\x00\x05\x01J\xff\xc3\x00\x05\x01\ +V\xffq\x00\x05\x01_\xffq\x00\x05\x01b\xffq\x00\ +\x05\x01i\xffq\x00\x05\x01y\xff\xae\x00\x05\x01z\xff\ +\xd7\x00\x05\x01{\xff\xd7\x00\x05\x01~\xff\xae\x00\x05\x01\ +\x81\xff\xc3\x00\x05\x01\x82\xff\xd7\x00\x05\x01\x83\xff\xd7\x00\ +\x05\x01\x84\xff\xd7\x00\x05\x01\x87\xff\xd7\x00\x05\x01\x89\xff\ +\xd7\x00\x05\x01\x8c\xff\xae\x00\x05\x01\x8e\xff\xc3\x00\x05\x01\ +\x8f\xff\xae\x00\x05\x01\x90\xff\xae\x00\x05\x01\x93\xff\xae\x00\ +\x05\x01\x99\xff\xae\x00\x05\x01\xa4\xff\x85\x00\x05\x01\xaa\xff\ +q\x00\x05\x01\xae\xff\x85\x00\x05\x01\xb5\xff\x85\x00\x05\x01\ +\xca\xff\xd7\x00\x05\x01\xce\xffq\x00\x05\x01\xcf\xff\x85\x00\ +\x05\x01\xd5\xffq\x00\x05\x01\xd8\xff\x85\x00\x05\x01\xdb\xff\ +\x85\x00\x05\x01\xde\xff\x85\x00\x05\x01\xea\xff\x85\x00\x05\x01\ +\xed\xff\x85\x00\x05\x01\xee\xff\xc3\x00\x05\x01\xf2\xffq\x00\ +\x05\x01\xfa\x00)\x00\x05\x01\xfc\x00)\x00\x05\x01\xfe\x00\ +)\x00\x05\x02\x00\x00\x14\x00\x05\x02W\xff\xc3\x00\x05\x02\ +X\xffq\x00\x05\x02Y\xff\xae\x00\x05\x02`\xff\x85\x00\ +\x05\x02b\xff\xc3\x00\x05\x02j\xff\x85\x00\x05\x02r\xff\ +q\x00\x05\x02s\xffq\x00\x05\x02}\xff\xec\x00\x05\x02\ +\x7f\xff\x85\x00\x05\x02\x85\xff\x85\x00\x05\x02\x87\xff\x85\x00\ +\x05\x02\x89\xff\x85\x00\x05\x02\x8d\xff\x85\x00\x05\x02\xb2\xff\ +\x85\x00\x05\x02\xb4\xff\x85\x00\x05\x02\xce\xff\x85\x00\x05\x02\ +\xcf\xffq\x00\x05\x02\xd9\xffq\x00\x05\x02\xda\xff\xd7\x00\ +\x05\x02\xdb\xffq\x00\x05\x02\xdc\xff\xd7\x00\x05\x02\xdd\xff\ +q\x00\x05\x02\xde\xff\xd7\x00\x05\x02\xe0\xff\x85\x00\x05\x02\ +\xe2\xff\xd7\x00\x05\x02\xe4\xff\xd7\x00\x05\x02\xf0\xff\x85\x00\ +\x05\x02\xf2\xff\x85\x00\x05\x02\xf4\xff\x85\x00\x05\x03\x09\xff\ +q\x00\x05\x03\x0a\xff\x85\x00\x05\x03\x0b\xffq\x00\x05\x03\ +\x0c\xff\x85\x00\x05\x03\x11\xff\x85\x00\x05\x03\x12\xffq\x00\ +\x05\x03\x16\xff\x85\x00\x05\x03\x1a\xff\x85\x00\x05\x03\x1b\xff\ +\x85\x00\x05\x03\x1c\xffq\x00\x05\x03\x1d\xffq\x00\x05\x03\ +\x1e\xff\xae\x00\x05\x03\x1f\xffq\x00\x05\x03 \xff\xae\x00\ +\x05\x03!\xffq\x00\x05\x03\x22\xff\xae\x00\x05\x03#\xff\ +q\x00\x05\x03%\xffq\x00\x05\x03&\xff\xae\x00\x05\x03\ +'\xffq\x00\x05\x03(\xff\xae\x00\x05\x03)\xffq\x00\ +\x05\x03*\xff\xae\x00\x05\x03+\xffq\x00\x05\x03,\xff\ +\xae\x00\x05\x03-\xffq\x00\x05\x03.\xff\xae\x00\x05\x03\ +/\xffq\x00\x05\x030\xff\xae\x00\x05\x031\xffq\x00\ +\x05\x032\xff\xae\x00\x05\x033\xffq\x00\x05\x034\xff\ +\xae\x00\x05\x036\xff\x85\x00\x05\x038\xff\x85\x00\x05\x03\ +:\xff\x85\x00\x05\x03<\xff\x85\x00\x05\x03@\xff\x85\x00\ +\x05\x03B\xff\x85\x00\x05\x03D\xff\x85\x00\x05\x03J\xff\ +\x85\x00\x05\x03L\xff\x85\x00\x05\x03N\xff\x85\x00\x05\x03\ +R\xff\x85\x00\x05\x03T\xff\x85\x00\x05\x03V\xff\x85\x00\ +\x05\x03X\xff\x85\x00\x05\x03Z\xff\x85\x00\x05\x03\x5c\xff\ +\x85\x00\x05\x03^\xff\x85\x00\x05\x03`\xff\x85\x00\x05\x03\ +b\xff\xc3\x00\x05\x03d\xff\xc3\x00\x05\x03f\xff\xc3\x00\ +\x05\x03h\xff\xc3\x00\x05\x03j\xff\xc3\x00\x05\x03l\xff\ +\xc3\x00\x05\x03n\xff\xc3\x00\x05\x03o\x00\x14\x00\x05\x03\ +q\x00\x14\x00\x05\x03s\x00\x14\x00\x05\x03\x8f\x00)\x00\ +\x0a\x00$\xffq\x00\x0a\x007\x00)\x00\x0a\x009\x00\ +)\x00\x0a\x00:\x00)\x00\x0a\x00<\x00\x14\x00\x0a\x00\ +D\xff\xae\x00\x0a\x00F\xff\x85\x00\x0a\x00G\xff\x85\x00\ +\x0a\x00H\xff\x85\x00\x0a\x00J\xff\xc3\x00\x0a\x00P\xff\ +\xc3\x00\x0a\x00Q\xff\xc3\x00\x0a\x00R\xff\x85\x00\x0a\x00\ +S\xff\xc3\x00\x0a\x00T\xff\x85\x00\x0a\x00U\xff\xc3\x00\ +\x0a\x00V\xff\xc3\x00\x0a\x00X\xff\xc3\x00\x0a\x00\x82\xff\ +q\x00\x0a\x00\x83\xffq\x00\x0a\x00\x84\xffq\x00\x0a\x00\ +\x85\xffq\x00\x0a\x00\x86\xffq\x00\x0a\x00\x87\xffq\x00\ +\x0a\x00\x9f\x00\x14\x00\x0a\x00\xa2\xff\x85\x00\x0a\x00\xa3\xff\ +\xae\x00\x0a\x00\xa4\xff\xae\x00\x0a\x00\xa5\xff\xae\x00\x0a\x00\ +\xa6\xff\xae\x00\x0a\x00\xa7\xff\xae\x00\x0a\x00\xa8\xff\xae\x00\ +\x0a\x00\xa9\xff\x85\x00\x0a\x00\xaa\xff\x85\x00\x0a\x00\xab\xff\ +\x85\x00\x0a\x00\xac\xff\x85\x00\x0a\x00\xad\xff\x85\x00\x0a\x00\ +\xb4\xff\x85\x00\x0a\x00\xb5\xff\x85\x00\x0a\x00\xb6\xff\x85\x00\ +\x0a\x00\xb7\xff\x85\x00\x0a\x00\xb8\xff\x85\x00\x0a\x00\xba\xff\ +\x85\x00\x0a\x00\xbb\xff\xc3\x00\x0a\x00\xbc\xff\xc3\x00\x0a\x00\ +\xbd\xff\xc3\x00\x0a\x00\xbe\xff\xc3\x00\x0a\x00\xc2\xffq\x00\ +\x0a\x00\xc3\xff\xae\x00\x0a\x00\xc4\xffq\x00\x0a\x00\xc5\xff\ +\xae\x00\x0a\x00\xc6\xffq\x00\x0a\x00\xc7\xff\xae\x00\x0a\x00\ +\xc9\xff\x85\x00\x0a\x00\xcb\xff\x85\x00\x0a\x00\xcd\xff\x85\x00\ +\x0a\x00\xcf\xff\x85\x00\x0a\x00\xd1\xff\x85\x00\x0a\x00\xd3\xff\ +\x85\x00\x0a\x00\xd5\xff\x85\x00\x0a\x00\xd7\xff\x85\x00\x0a\x00\ +\xd9\xff\x85\x00\x0a\x00\xdb\xff\x85\x00\x0a\x00\xdd\xff\x85\x00\ +\x0a\x00\xdf\xff\xc3\x00\x0a\x00\xe1\xff\xc3\x00\x0a\x00\xe3\xff\ +\xc3\x00\x0a\x00\xe5\xff\xc3\x00\x0a\x00\xfa\xff\xc3\x00\x0a\x01\ +\x06\xff\xc3\x00\x0a\x01\x08\xff\xc3\x00\x0a\x01\x0d\xff\xc3\x00\ +\x0a\x01\x0f\xff\x85\x00\x0a\x01\x11\xff\x85\x00\x0a\x01\x13\xff\ +\x85\x00\x0a\x01\x15\xff\x85\x00\x0a\x01\x17\xff\xc3\x00\x0a\x01\ +\x19\xff\xc3\x00\x0a\x01\x1d\xff\xc3\x00\x0a\x01!\xff\xc3\x00\ +\x0a\x01$\x00)\x00\x0a\x01&\x00)\x00\x0a\x01+\xff\ +\xc3\x00\x0a\x01-\xff\xc3\x00\x0a\x01/\xff\xc3\x00\x0a\x01\ +1\xff\xc3\x00\x0a\x013\xff\xc3\x00\x0a\x015\xff\xc3\x00\ +\x0a\x016\x00)\x00\x0a\x018\x00\x14\x00\x0a\x01:\x00\ +\x14\x00\x0a\x01C\xffq\x00\x0a\x01D\xff\xae\x00\x0a\x01\ +F\xff\xae\x00\x0a\x01H\xff\x85\x00\x0a\x01J\xff\xc3\x00\ +\x0a\x01V\xffq\x00\x0a\x01_\xffq\x00\x0a\x01b\xff\ +q\x00\x0a\x01i\xffq\x00\x0a\x01y\xff\xae\x00\x0a\x01\ +z\xff\xd7\x00\x0a\x01{\xff\xd7\x00\x0a\x01~\xff\xae\x00\ +\x0a\x01\x81\xff\xc3\x00\x0a\x01\x82\xff\xd7\x00\x0a\x01\x83\xff\ +\xd7\x00\x0a\x01\x84\xff\xd7\x00\x0a\x01\x87\xff\xd7\x00\x0a\x01\ +\x89\xff\xd7\x00\x0a\x01\x8c\xff\xae\x00\x0a\x01\x8e\xff\xc3\x00\ +\x0a\x01\x8f\xff\xae\x00\x0a\x01\x90\xff\xae\x00\x0a\x01\x93\xff\ +\xae\x00\x0a\x01\x99\xff\xae\x00\x0a\x01\xa4\xff\x85\x00\x0a\x01\ +\xaa\xffq\x00\x0a\x01\xae\xff\x85\x00\x0a\x01\xb5\xff\x85\x00\ +\x0a\x01\xca\xff\xd7\x00\x0a\x01\xce\xffq\x00\x0a\x01\xcf\xff\ +\x85\x00\x0a\x01\xd5\xffq\x00\x0a\x01\xd8\xff\x85\x00\x0a\x01\ +\xdb\xff\x85\x00\x0a\x01\xde\xff\x85\x00\x0a\x01\xea\xff\x85\x00\ +\x0a\x01\xed\xff\x85\x00\x0a\x01\xee\xff\xc3\x00\x0a\x01\xf2\xff\ +q\x00\x0a\x01\xfa\x00)\x00\x0a\x01\xfc\x00)\x00\x0a\x01\ +\xfe\x00)\x00\x0a\x02\x00\x00\x14\x00\x0a\x02W\xff\xc3\x00\ +\x0a\x02X\xffq\x00\x0a\x02Y\xff\xae\x00\x0a\x02`\xff\ +\x85\x00\x0a\x02b\xff\xc3\x00\x0a\x02j\xff\x85\x00\x0a\x02\ +r\xffq\x00\x0a\x02s\xffq\x00\x0a\x02}\xff\xec\x00\ +\x0a\x02\x7f\xff\x85\x00\x0a\x02\x85\xff\x85\x00\x0a\x02\x87\xff\ +\x85\x00\x0a\x02\x89\xff\x85\x00\x0a\x02\x8d\xff\x85\x00\x0a\x02\ +\xb2\xff\x85\x00\x0a\x02\xb4\xff\x85\x00\x0a\x02\xce\xff\x85\x00\ +\x0a\x02\xcf\xffq\x00\x0a\x02\xd9\xffq\x00\x0a\x02\xda\xff\ +\xd7\x00\x0a\x02\xdb\xffq\x00\x0a\x02\xdc\xff\xd7\x00\x0a\x02\ +\xdd\xffq\x00\x0a\x02\xde\xff\xd7\x00\x0a\x02\xe0\xff\x85\x00\ +\x0a\x02\xe2\xff\xd7\x00\x0a\x02\xe4\xff\xd7\x00\x0a\x02\xf0\xff\ +\x85\x00\x0a\x02\xf2\xff\x85\x00\x0a\x02\xf4\xff\x85\x00\x0a\x03\ +\x09\xffq\x00\x0a\x03\x0a\xff\x85\x00\x0a\x03\x0b\xffq\x00\ +\x0a\x03\x0c\xff\x85\x00\x0a\x03\x11\xff\x85\x00\x0a\x03\x12\xff\ +q\x00\x0a\x03\x16\xff\x85\x00\x0a\x03\x1a\xff\x85\x00\x0a\x03\ +\x1b\xff\x85\x00\x0a\x03\x1c\xffq\x00\x0a\x03\x1d\xffq\x00\ +\x0a\x03\x1e\xff\xae\x00\x0a\x03\x1f\xffq\x00\x0a\x03 \xff\ +\xae\x00\x0a\x03!\xffq\x00\x0a\x03\x22\xff\xae\x00\x0a\x03\ +#\xffq\x00\x0a\x03%\xffq\x00\x0a\x03&\xff\xae\x00\ +\x0a\x03'\xffq\x00\x0a\x03(\xff\xae\x00\x0a\x03)\xff\ +q\x00\x0a\x03*\xff\xae\x00\x0a\x03+\xffq\x00\x0a\x03\ +,\xff\xae\x00\x0a\x03-\xffq\x00\x0a\x03.\xff\xae\x00\ +\x0a\x03/\xffq\x00\x0a\x030\xff\xae\x00\x0a\x031\xff\ +q\x00\x0a\x032\xff\xae\x00\x0a\x033\xffq\x00\x0a\x03\ +4\xff\xae\x00\x0a\x036\xff\x85\x00\x0a\x038\xff\x85\x00\ +\x0a\x03:\xff\x85\x00\x0a\x03<\xff\x85\x00\x0a\x03@\xff\ +\x85\x00\x0a\x03B\xff\x85\x00\x0a\x03D\xff\x85\x00\x0a\x03\ +J\xff\x85\x00\x0a\x03L\xff\x85\x00\x0a\x03N\xff\x85\x00\ +\x0a\x03R\xff\x85\x00\x0a\x03T\xff\x85\x00\x0a\x03V\xff\ +\x85\x00\x0a\x03X\xff\x85\x00\x0a\x03Z\xff\x85\x00\x0a\x03\ +\x5c\xff\x85\x00\x0a\x03^\xff\x85\x00\x0a\x03`\xff\x85\x00\ +\x0a\x03b\xff\xc3\x00\x0a\x03d\xff\xc3\x00\x0a\x03f\xff\ +\xc3\x00\x0a\x03h\xff\xc3\x00\x0a\x03j\xff\xc3\x00\x0a\x03\ +l\xff\xc3\x00\x0a\x03n\xff\xc3\x00\x0a\x03o\x00\x14\x00\ +\x0a\x03q\x00\x14\x00\x0a\x03s\x00\x14\x00\x0a\x03\x8f\x00\ +)\x00\x0b\x00-\x00\xb8\x00\x0f\x00&\xff\x9a\x00\x0f\x00\ +*\xff\x9a\x00\x0f\x002\xff\x9a\x00\x0f\x004\xff\x9a\x00\ +\x0f\x007\xffq\x00\x0f\x008\xff\xd7\x00\x0f\x009\xff\ +\x85\x00\x0f\x00:\xff\x85\x00\x0f\x00<\xff\x85\x00\x0f\x00\ +\x89\xff\x9a\x00\x0f\x00\x94\xff\x9a\x00\x0f\x00\x95\xff\x9a\x00\ +\x0f\x00\x96\xff\x9a\x00\x0f\x00\x97\xff\x9a\x00\x0f\x00\x98\xff\ +\x9a\x00\x0f\x00\x9a\xff\x9a\x00\x0f\x00\x9b\xff\xd7\x00\x0f\x00\ +\x9c\xff\xd7\x00\x0f\x00\x9d\xff\xd7\x00\x0f\x00\x9e\xff\xd7\x00\ +\x0f\x00\x9f\xff\x85\x00\x0f\x00\xc8\xff\x9a\x00\x0f\x00\xca\xff\ +\x9a\x00\x0f\x00\xcc\xff\x9a\x00\x0f\x00\xce\xff\x9a\x00\x0f\x00\ +\xde\xff\x9a\x00\x0f\x00\xe0\xff\x9a\x00\x0f\x00\xe2\xff\x9a\x00\ +\x0f\x00\xe4\xff\x9a\x00\x0f\x01\x0e\xff\x9a\x00\x0f\x01\x10\xff\ +\x9a\x00\x0f\x01\x12\xff\x9a\x00\x0f\x01\x14\xff\x9a\x00\x0f\x01\ +$\xffq\x00\x0f\x01&\xffq\x00\x0f\x01*\xff\xd7\x00\ +\x0f\x01,\xff\xd7\x00\x0f\x01.\xff\xd7\x00\x0f\x010\xff\ +\xd7\x00\x0f\x012\xff\xd7\x00\x0f\x014\xff\xd7\x00\x0f\x01\ +6\xff\x85\x00\x0f\x018\xff\x85\x00\x0f\x01:\xff\x85\x00\ +\x0f\x01G\xff\x9a\x00\x0f\x01f\xff\xae\x00\x0f\x01m\xff\ +\xae\x00\x0f\x01q\xffq\x00\x0f\x01r\xff\x85\x00\x0f\x01\ +s\xff\x9a\x00\x0f\x01u\xff\x85\x00\x0f\x01x\xff\x85\x00\ +\x0f\x01\x85\xff\xd7\x00\x0f\x01\x9d\xffq\x00\x0f\x01\x9f\xff\ +\x9a\x00\x0f\x01\xa6\xffq\x00\x0f\x01\xb8\xff\x9a\x00\x0f\x01\ +\xbb\xff\x9a\x00\x0f\x01\xbc\xffq\x00\x0f\x01\xbe\xff\xae\x00\ +\x0f\x01\xc1\xff\x5c\x00\x0f\x01\xc4\xffq\x00\x0f\x01\xdc\xff\ +\x9a\x00\x0f\x01\xe1\xff\x85\x00\x0f\x01\xe4\xff\x9a\x00\x0f\x01\ +\xfa\xff\x85\x00\x0f\x01\xfc\xff\x85\x00\x0f\x01\xfe\xff\x85\x00\ +\x0f\x02\x00\xff\x85\x00\x0f\x02T\xff\x85\x00\x0f\x02_\xff\ +\x9a\x00\x0f\x02a\xff\xd7\x00\x0f\x02l\xff\x9a\x00\x0f\x02\ +|\xff\x5c\x00\x0f\x02~\xff\x9a\x00\x0f\x02\x80\xff\x85\x00\ +\x0f\x02\x82\xff\x85\x00\x0f\x02\x84\xff\x9a\x00\x0f\x02\x86\xff\ +\x9a\x00\x0f\x02\x88\xff\x9a\x00\x0f\x02\x8a\xff\x9a\x00\x0f\x02\ +\x8c\xff\x9a\x00\x0f\x02\xa9\xffq\x00\x0f\x02\xaa\xff\x9a\x00\ +\x0f\x02\xb1\xff\x9a\x00\x0f\x02\xb3\xff\x9a\x00\x0f\x02\xb5\xff\ +q\x00\x0f\x02\xb6\xff\x9a\x00\x0f\x02\xb7\xff\x85\x00\x0f\x02\ +\xb9\xff\x85\x00\x0f\x02\xbd\xffq\x00\x0f\x02\xbe\xff\x9a\x00\ +\x0f\x02\xbf\xff\x5c\x00\x0f\x02\xc0\xff\x85\x00\x0f\x02\xc1\xff\ +\x5c\x00\x0f\x02\xc2\xff\x85\x00\x0f\x02\xc5\xff\x85\x00\x0f\x02\ +\xc7\xff\x85\x00\x0f\x02\xd4\xff\x5c\x00\x0f\x02\xd5\xff\x85\x00\ +\x0f\x02\xef\xff\x9a\x00\x0f\x02\xf1\xff\x9a\x00\x0f\x02\xf3\xff\ +\x9a\x00\x0f\x02\xfd\xff\x5c\x00\x0f\x02\xfe\xff\x85\x00\x0f\x03\ +\x0d\xff\x85\x00\x0f\x03\x0e\xff\x9a\x00\x0f\x03\x0f\xff\x85\x00\ +\x0f\x03\x10\xff\x9a\x00\x0f\x03\x15\xff\x9a\x00\x0f\x03\x17\xff\ +q\x00\x0f\x03\x18\xff\x9a\x00\x0f\x03I\xff\x9a\x00\x0f\x03\ +K\xff\x9a\x00\x0f\x03M\xff\x9a\x00\x0f\x03O\xff\x9a\x00\ +\x0f\x03Q\xff\x9a\x00\x0f\x03S\xff\x9a\x00\x0f\x03U\xff\ +\x9a\x00\x0f\x03W\xff\x9a\x00\x0f\x03Y\xff\x9a\x00\x0f\x03\ +[\xff\x9a\x00\x0f\x03]\xff\x9a\x00\x0f\x03_\xff\x9a\x00\ +\x0f\x03a\xff\xd7\x00\x0f\x03c\xff\xd7\x00\x0f\x03e\xff\ +\xd7\x00\x0f\x03g\xff\xd7\x00\x0f\x03i\xff\xd7\x00\x0f\x03\ +k\xff\xd7\x00\x0f\x03m\xff\xd7\x00\x0f\x03o\xff\x85\x00\ +\x0f\x03q\xff\x85\x00\x0f\x03s\xff\x85\x00\x0f\x03\x8f\xff\ +q\x00\x10\x007\xff\xae\x00\x10\x01$\xff\xae\x00\x10\x01\ +&\xff\xae\x00\x10\x01q\xff\xae\x00\x10\x01\x9d\xff\xae\x00\ +\x10\x01\xa6\xff\xae\x00\x10\x01\xbc\xff\xae\x00\x10\x01\xc4\xff\ +\xae\x00\x10\x01\xdc\xff\xd7\x00\x10\x01\xe4\xff\xd7\x00\x10\x02\ +\xa9\xff\xae\x00\x10\x02\xaa\xff\xd7\x00\x10\x02\xb5\xff\xae\x00\ +\x10\x02\xb6\xff\xd7\x00\x10\x02\xbd\xff\xae\x00\x10\x02\xbe\xff\ +\xd7\x00\x10\x03\x17\xff\xae\x00\x10\x03\x18\xff\xd7\x00\x10\x03\ +\x8f\xff\xae\x00\x11\x00&\xff\x9a\x00\x11\x00*\xff\x9a\x00\ +\x11\x002\xff\x9a\x00\x11\x004\xff\x9a\x00\x11\x007\xff\ +q\x00\x11\x008\xff\xd7\x00\x11\x009\xff\x85\x00\x11\x00\ +:\xff\x85\x00\x11\x00<\xff\x85\x00\x11\x00\x89\xff\x9a\x00\ +\x11\x00\x94\xff\x9a\x00\x11\x00\x95\xff\x9a\x00\x11\x00\x96\xff\ +\x9a\x00\x11\x00\x97\xff\x9a\x00\x11\x00\x98\xff\x9a\x00\x11\x00\ +\x9a\xff\x9a\x00\x11\x00\x9b\xff\xd7\x00\x11\x00\x9c\xff\xd7\x00\ +\x11\x00\x9d\xff\xd7\x00\x11\x00\x9e\xff\xd7\x00\x11\x00\x9f\xff\ +\x85\x00\x11\x00\xc8\xff\x9a\x00\x11\x00\xca\xff\x9a\x00\x11\x00\ +\xcc\xff\x9a\x00\x11\x00\xce\xff\x9a\x00\x11\x00\xde\xff\x9a\x00\ +\x11\x00\xe0\xff\x9a\x00\x11\x00\xe2\xff\x9a\x00\x11\x00\xe4\xff\ +\x9a\x00\x11\x01\x0e\xff\x9a\x00\x11\x01\x10\xff\x9a\x00\x11\x01\ +\x12\xff\x9a\x00\x11\x01\x14\xff\x9a\x00\x11\x01$\xffq\x00\ +\x11\x01&\xffq\x00\x11\x01*\xff\xd7\x00\x11\x01,\xff\ +\xd7\x00\x11\x01.\xff\xd7\x00\x11\x010\xff\xd7\x00\x11\x01\ +2\xff\xd7\x00\x11\x014\xff\xd7\x00\x11\x016\xff\x85\x00\ +\x11\x018\xff\x85\x00\x11\x01:\xff\x85\x00\x11\x01G\xff\ +\x9a\x00\x11\x01f\xff\xae\x00\x11\x01m\xff\xae\x00\x11\x01\ +q\xffq\x00\x11\x01r\xff\x85\x00\x11\x01s\xff\x9a\x00\ +\x11\x01u\xff\x85\x00\x11\x01x\xff\x85\x00\x11\x01\x85\xff\ +\xd7\x00\x11\x01\x9d\xffq\x00\x11\x01\x9f\xff\x9a\x00\x11\x01\ +\xa6\xffq\x00\x11\x01\xb8\xff\x9a\x00\x11\x01\xbb\xff\x9a\x00\ +\x11\x01\xbc\xffq\x00\x11\x01\xbe\xff\xae\x00\x11\x01\xc1\xff\ +\x5c\x00\x11\x01\xc4\xffq\x00\x11\x01\xdc\xff\x9a\x00\x11\x01\ +\xe1\xff\x85\x00\x11\x01\xe4\xff\x9a\x00\x11\x01\xfa\xff\x85\x00\ +\x11\x01\xfc\xff\x85\x00\x11\x01\xfe\xff\x85\x00\x11\x02\x00\xff\ +\x85\x00\x11\x02T\xff\x85\x00\x11\x02_\xff\x9a\x00\x11\x02\ +a\xff\xd7\x00\x11\x02l\xff\x9a\x00\x11\x02|\xff\x5c\x00\ +\x11\x02~\xff\x9a\x00\x11\x02\x80\xff\x85\x00\x11\x02\x82\xff\ +\x85\x00\x11\x02\x84\xff\x9a\x00\x11\x02\x86\xff\x9a\x00\x11\x02\ +\x88\xff\x9a\x00\x11\x02\x8a\xff\x9a\x00\x11\x02\x8c\xff\x9a\x00\ +\x11\x02\xa9\xffq\x00\x11\x02\xaa\xff\x9a\x00\x11\x02\xb1\xff\ +\x9a\x00\x11\x02\xb3\xff\x9a\x00\x11\x02\xb5\xffq\x00\x11\x02\ +\xb6\xff\x9a\x00\x11\x02\xb7\xff\x85\x00\x11\x02\xb9\xff\x85\x00\ +\x11\x02\xbd\xffq\x00\x11\x02\xbe\xff\x9a\x00\x11\x02\xbf\xff\ +\x5c\x00\x11\x02\xc0\xff\x85\x00\x11\x02\xc1\xff\x5c\x00\x11\x02\ +\xc2\xff\x85\x00\x11\x02\xc5\xff\x85\x00\x11\x02\xc7\xff\x85\x00\ +\x11\x02\xd4\xff\x5c\x00\x11\x02\xd5\xff\x85\x00\x11\x02\xef\xff\ +\x9a\x00\x11\x02\xf1\xff\x9a\x00\x11\x02\xf3\xff\x9a\x00\x11\x02\ +\xfd\xff\x5c\x00\x11\x02\xfe\xff\x85\x00\x11\x03\x0d\xff\x85\x00\ +\x11\x03\x0e\xff\x9a\x00\x11\x03\x0f\xff\x85\x00\x11\x03\x10\xff\ +\x9a\x00\x11\x03\x15\xff\x9a\x00\x11\x03\x17\xffq\x00\x11\x03\ +\x18\xff\x9a\x00\x11\x03I\xff\x9a\x00\x11\x03K\xff\x9a\x00\ +\x11\x03M\xff\x9a\x00\x11\x03O\xff\x9a\x00\x11\x03Q\xff\ +\x9a\x00\x11\x03S\xff\x9a\x00\x11\x03U\xff\x9a\x00\x11\x03\ +W\xff\x9a\x00\x11\x03Y\xff\x9a\x00\x11\x03[\xff\x9a\x00\ +\x11\x03]\xff\x9a\x00\x11\x03_\xff\x9a\x00\x11\x03a\xff\ +\xd7\x00\x11\x03c\xff\xd7\x00\x11\x03e\xff\xd7\x00\x11\x03\ +g\xff\xd7\x00\x11\x03i\xff\xd7\x00\x11\x03k\xff\xd7\x00\ +\x11\x03m\xff\xd7\x00\x11\x03o\xff\x85\x00\x11\x03q\xff\ +\x85\x00\x11\x03s\xff\x85\x00\x11\x03\x8f\xffq\x00$\x00\ +\x05\xffq\x00$\x00\x0a\xffq\x00$\x00&\xff\xd7\x00\ +$\x00*\xff\xd7\x00$\x00-\x01\x0a\x00$\x002\xff\ +\xd7\x00$\x004\xff\xd7\x00$\x007\xffq\x00$\x00\ +9\xff\xae\x00$\x00:\xff\xae\x00$\x00<\xff\x85\x00\ +$\x00\x89\xff\xd7\x00$\x00\x94\xff\xd7\x00$\x00\x95\xff\ +\xd7\x00$\x00\x96\xff\xd7\x00$\x00\x97\xff\xd7\x00$\x00\ +\x98\xff\xd7\x00$\x00\x9a\xff\xd7\x00$\x00\x9f\xff\x85\x00\ +$\x00\xc8\xff\xd7\x00$\x00\xca\xff\xd7\x00$\x00\xcc\xff\ +\xd7\x00$\x00\xce\xff\xd7\x00$\x00\xde\xff\xd7\x00$\x00\ +\xe0\xff\xd7\x00$\x00\xe2\xff\xd7\x00$\x00\xe4\xff\xd7\x00\ +$\x01\x0e\xff\xd7\x00$\x01\x10\xff\xd7\x00$\x01\x12\xff\ +\xd7\x00$\x01\x14\xff\xd7\x00$\x01$\xffq\x00$\x01\ +&\xffq\x00$\x016\xff\xae\x00$\x018\xff\x85\x00\ +$\x01:\xff\x85\x00$\x01G\xff\xd7\x00$\x01\xfa\xff\ +\xae\x00$\x01\xfc\xff\xae\x00$\x01\xfe\xff\xae\x00$\x02\ +\x00\xff\x85\x00$\x02\x07\xffq\x00$\x02\x0b\xffq\x00\ +$\x02_\xff\xd7\x00$\x03I\xff\xd7\x00$\x03K\xff\ +\xd7\x00$\x03M\xff\xd7\x00$\x03O\xff\xd7\x00$\x03\ +Q\xff\xd7\x00$\x03S\xff\xd7\x00$\x03U\xff\xd7\x00\ +$\x03W\xff\xd7\x00$\x03Y\xff\xd7\x00$\x03[\xff\ +\xd7\x00$\x03]\xff\xd7\x00$\x03_\xff\xd7\x00$\x03\ +o\xff\x85\x00$\x03q\xff\x85\x00$\x03s\xff\x85\x00\ +$\x03\x8f\xffq\x00%\x00\x0f\xff\xae\x00%\x00\x11\xff\ +\xae\x00%\x00$\xff\xd7\x00%\x007\xff\xc3\x00%\x00\ +9\xff\xec\x00%\x00:\xff\xec\x00%\x00;\xff\xd7\x00\ +%\x00<\xff\xec\x00%\x00=\xff\xec\x00%\x00\x82\xff\ +\xd7\x00%\x00\x83\xff\xd7\x00%\x00\x84\xff\xd7\x00%\x00\ +\x85\xff\xd7\x00%\x00\x86\xff\xd7\x00%\x00\x87\xff\xd7\x00\ +%\x00\x9f\xff\xec\x00%\x00\xc2\xff\xd7\x00%\x00\xc4\xff\ +\xd7\x00%\x00\xc6\xff\xd7\x00%\x01$\xff\xc3\x00%\x01\ +&\xff\xc3\x00%\x016\xff\xec\x00%\x018\xff\xec\x00\ +%\x01:\xff\xec\x00%\x01;\xff\xec\x00%\x01=\xff\ +\xec\x00%\x01?\xff\xec\x00%\x01C\xff\xd7\x00%\x01\ +\xa0\xff\xec\x00%\x01\xfa\xff\xec\x00%\x01\xfc\xff\xec\x00\ +%\x01\xfe\xff\xec\x00%\x02\x00\xff\xec\x00%\x02\x08\xff\ +\xae\x00%\x02\x0c\xff\xae\x00%\x02X\xff\xd7\x00%\x03\ +\x1d\xff\xd7\x00%\x03\x1f\xff\xd7\x00%\x03!\xff\xd7\x00\ +%\x03#\xff\xd7\x00%\x03%\xff\xd7\x00%\x03'\xff\ +\xd7\x00%\x03)\xff\xd7\x00%\x03+\xff\xd7\x00%\x03\ +-\xff\xd7\x00%\x03/\xff\xd7\x00%\x031\xff\xd7\x00\ +%\x033\xff\xd7\x00%\x03o\xff\xec\x00%\x03q\xff\ +\xec\x00%\x03s\xff\xec\x00%\x03\x8f\xff\xc3\x00&\x00\ +&\xff\xd7\x00&\x00*\xff\xd7\x00&\x002\xff\xd7\x00\ +&\x004\xff\xd7\x00&\x00\x89\xff\xd7\x00&\x00\x94\xff\ +\xd7\x00&\x00\x95\xff\xd7\x00&\x00\x96\xff\xd7\x00&\x00\ +\x97\xff\xd7\x00&\x00\x98\xff\xd7\x00&\x00\x9a\xff\xd7\x00\ +&\x00\xc8\xff\xd7\x00&\x00\xca\xff\xd7\x00&\x00\xcc\xff\ +\xd7\x00&\x00\xce\xff\xd7\x00&\x00\xde\xff\xd7\x00&\x00\ +\xe0\xff\xd7\x00&\x00\xe2\xff\xd7\x00&\x00\xe4\xff\xd7\x00\ +&\x01\x0e\xff\xd7\x00&\x01\x10\xff\xd7\x00&\x01\x12\xff\ +\xd7\x00&\x01\x14\xff\xd7\x00&\x01G\xff\xd7\x00&\x02\ +_\xff\xd7\x00&\x03I\xff\xd7\x00&\x03K\xff\xd7\x00\ +&\x03M\xff\xd7\x00&\x03O\xff\xd7\x00&\x03Q\xff\ +\xd7\x00&\x03S\xff\xd7\x00&\x03U\xff\xd7\x00&\x03\ +W\xff\xd7\x00&\x03Y\xff\xd7\x00&\x03[\xff\xd7\x00\ +&\x03]\xff\xd7\x00&\x03_\xff\xd7\x00'\x00\x0f\xff\ +\xae\x00'\x00\x11\xff\xae\x00'\x00$\xff\xd7\x00'\x00\ +7\xff\xc3\x00'\x009\xff\xec\x00'\x00:\xff\xec\x00\ +'\x00;\xff\xd7\x00'\x00<\xff\xec\x00'\x00=\xff\ +\xec\x00'\x00\x82\xff\xd7\x00'\x00\x83\xff\xd7\x00'\x00\ +\x84\xff\xd7\x00'\x00\x85\xff\xd7\x00'\x00\x86\xff\xd7\x00\ +'\x00\x87\xff\xd7\x00'\x00\x9f\xff\xec\x00'\x00\xc2\xff\ +\xd7\x00'\x00\xc4\xff\xd7\x00'\x00\xc6\xff\xd7\x00'\x01\ +$\xff\xc3\x00'\x01&\xff\xc3\x00'\x016\xff\xec\x00\ +'\x018\xff\xec\x00'\x01:\xff\xec\x00'\x01;\xff\ +\xec\x00'\x01=\xff\xec\x00'\x01?\xff\xec\x00'\x01\ +C\xff\xd7\x00'\x01\xa0\xff\xec\x00'\x01\xfa\xff\xec\x00\ +'\x01\xfc\xff\xec\x00'\x01\xfe\xff\xec\x00'\x02\x00\xff\ +\xec\x00'\x02\x08\xff\xae\x00'\x02\x0c\xff\xae\x00'\x02\ +X\xff\xd7\x00'\x03\x1d\xff\xd7\x00'\x03\x1f\xff\xd7\x00\ +'\x03!\xff\xd7\x00'\x03#\xff\xd7\x00'\x03%\xff\ +\xd7\x00'\x03'\xff\xd7\x00'\x03)\xff\xd7\x00'\x03\ ++\xff\xd7\x00'\x03-\xff\xd7\x00'\x03/\xff\xd7\x00\ +'\x031\xff\xd7\x00'\x033\xff\xd7\x00'\x03o\xff\ +\xec\x00'\x03q\xff\xec\x00'\x03s\xff\xec\x00'\x03\ +\x8f\xff\xc3\x00(\x00-\x00{\x00)\x00\x0f\xff\x85\x00\ +)\x00\x11\xff\x85\x00)\x00\x22\x00)\x00)\x00$\xff\ +\xd7\x00)\x00\x82\xff\xd7\x00)\x00\x83\xff\xd7\x00)\x00\ +\x84\xff\xd7\x00)\x00\x85\xff\xd7\x00)\x00\x86\xff\xd7\x00\ +)\x00\x87\xff\xd7\x00)\x00\xc2\xff\xd7\x00)\x00\xc4\xff\ +\xd7\x00)\x00\xc6\xff\xd7\x00)\x01C\xff\xd7\x00)\x02\ +\x08\xff\x85\x00)\x02\x0c\xff\x85\x00)\x02X\xff\xd7\x00\ +)\x03\x1d\xff\xd7\x00)\x03\x1f\xff\xd7\x00)\x03!\xff\ +\xd7\x00)\x03#\xff\xd7\x00)\x03%\xff\xd7\x00)\x03\ +'\xff\xd7\x00)\x03)\xff\xd7\x00)\x03+\xff\xd7\x00\ +)\x03-\xff\xd7\x00)\x03/\xff\xd7\x00)\x031\xff\ +\xd7\x00)\x033\xff\xd7\x00.\x00&\xff\xd7\x00.\x00\ +*\xff\xd7\x00.\x002\xff\xd7\x00.\x004\xff\xd7\x00\ +.\x00\x89\xff\xd7\x00.\x00\x94\xff\xd7\x00.\x00\x95\xff\ +\xd7\x00.\x00\x96\xff\xd7\x00.\x00\x97\xff\xd7\x00.\x00\ +\x98\xff\xd7\x00.\x00\x9a\xff\xd7\x00.\x00\xc8\xff\xd7\x00\ +.\x00\xca\xff\xd7\x00.\x00\xcc\xff\xd7\x00.\x00\xce\xff\ +\xd7\x00.\x00\xde\xff\xd7\x00.\x00\xe0\xff\xd7\x00.\x00\ +\xe2\xff\xd7\x00.\x00\xe4\xff\xd7\x00.\x01\x0e\xff\xd7\x00\ +.\x01\x10\xff\xd7\x00.\x01\x12\xff\xd7\x00.\x01\x14\xff\ +\xd7\x00.\x01G\xff\xd7\x00.\x02_\xff\xd7\x00.\x03\ +I\xff\xd7\x00.\x03K\xff\xd7\x00.\x03M\xff\xd7\x00\ +.\x03O\xff\xd7\x00.\x03Q\xff\xd7\x00.\x03S\xff\ +\xd7\x00.\x03U\xff\xd7\x00.\x03W\xff\xd7\x00.\x03\ +Y\xff\xd7\x00.\x03[\xff\xd7\x00.\x03]\xff\xd7\x00\ +.\x03_\xff\xd7\x00/\x00\x05\xff\x5c\x00/\x00\x0a\xff\ +\x5c\x00/\x00&\xff\xd7\x00/\x00*\xff\xd7\x00/\x00\ +2\xff\xd7\x00/\x004\xff\xd7\x00/\x007\xff\xd7\x00\ +/\x008\xff\xec\x00/\x009\xff\xd7\x00/\x00:\xff\ +\xd7\x00/\x00<\xff\xc3\x00/\x00\x89\xff\xd7\x00/\x00\ +\x94\xff\xd7\x00/\x00\x95\xff\xd7\x00/\x00\x96\xff\xd7\x00\ +/\x00\x97\xff\xd7\x00/\x00\x98\xff\xd7\x00/\x00\x9a\xff\ +\xd7\x00/\x00\x9b\xff\xec\x00/\x00\x9c\xff\xec\x00/\x00\ +\x9d\xff\xec\x00/\x00\x9e\xff\xec\x00/\x00\x9f\xff\xc3\x00\ +/\x00\xc8\xff\xd7\x00/\x00\xca\xff\xd7\x00/\x00\xcc\xff\ +\xd7\x00/\x00\xce\xff\xd7\x00/\x00\xde\xff\xd7\x00/\x00\ +\xe0\xff\xd7\x00/\x00\xe2\xff\xd7\x00/\x00\xe4\xff\xd7\x00\ +/\x01\x0e\xff\xd7\x00/\x01\x10\xff\xd7\x00/\x01\x12\xff\ +\xd7\x00/\x01\x14\xff\xd7\x00/\x01$\xff\xd7\x00/\x01\ +&\xff\xd7\x00/\x01*\xff\xec\x00/\x01,\xff\xec\x00\ +/\x01.\xff\xec\x00/\x010\xff\xec\x00/\x012\xff\ +\xec\x00/\x014\xff\xec\x00/\x016\xff\xd7\x00/\x01\ +8\xff\xc3\x00/\x01:\xff\xc3\x00/\x01G\xff\xd7\x00\ +/\x01\xfa\xff\xd7\x00/\x01\xfc\xff\xd7\x00/\x01\xfe\xff\ +\xd7\x00/\x02\x00\xff\xc3\x00/\x02\x07\xff\x5c\x00/\x02\ +\x0b\xff\x5c\x00/\x02_\xff\xd7\x00/\x02a\xff\xec\x00\ +/\x03I\xff\xd7\x00/\x03K\xff\xd7\x00/\x03M\xff\ +\xd7\x00/\x03O\xff\xd7\x00/\x03Q\xff\xd7\x00/\x03\ +S\xff\xd7\x00/\x03U\xff\xd7\x00/\x03W\xff\xd7\x00\ +/\x03Y\xff\xd7\x00/\x03[\xff\xd7\x00/\x03]\xff\ +\xd7\x00/\x03_\xff\xd7\x00/\x03a\xff\xec\x00/\x03\ +c\xff\xec\x00/\x03e\xff\xec\x00/\x03g\xff\xec\x00\ +/\x03i\xff\xec\x00/\x03k\xff\xec\x00/\x03m\xff\ +\xec\x00/\x03o\xff\xc3\x00/\x03q\xff\xc3\x00/\x03\ +s\xff\xc3\x00/\x03\x8f\xff\xd7\x002\x00\x0f\xff\xae\x00\ +2\x00\x11\xff\xae\x002\x00$\xff\xd7\x002\x007\xff\ +\xc3\x002\x009\xff\xec\x002\x00:\xff\xec\x002\x00\ +;\xff\xd7\x002\x00<\xff\xec\x002\x00=\xff\xec\x00\ +2\x00\x82\xff\xd7\x002\x00\x83\xff\xd7\x002\x00\x84\xff\ +\xd7\x002\x00\x85\xff\xd7\x002\x00\x86\xff\xd7\x002\x00\ +\x87\xff\xd7\x002\x00\x9f\xff\xec\x002\x00\xc2\xff\xd7\x00\ +2\x00\xc4\xff\xd7\x002\x00\xc6\xff\xd7\x002\x01$\xff\ +\xc3\x002\x01&\xff\xc3\x002\x016\xff\xec\x002\x01\ +8\xff\xec\x002\x01:\xff\xec\x002\x01;\xff\xec\x00\ +2\x01=\xff\xec\x002\x01?\xff\xec\x002\x01C\xff\ +\xd7\x002\x01\xa0\xff\xec\x002\x01\xfa\xff\xec\x002\x01\ +\xfc\xff\xec\x002\x01\xfe\xff\xec\x002\x02\x00\xff\xec\x00\ +2\x02\x08\xff\xae\x002\x02\x0c\xff\xae\x002\x02X\xff\ +\xd7\x002\x03\x1d\xff\xd7\x002\x03\x1f\xff\xd7\x002\x03\ +!\xff\xd7\x002\x03#\xff\xd7\x002\x03%\xff\xd7\x00\ +2\x03'\xff\xd7\x002\x03)\xff\xd7\x002\x03+\xff\ +\xd7\x002\x03-\xff\xd7\x002\x03/\xff\xd7\x002\x03\ +1\xff\xd7\x002\x033\xff\xd7\x002\x03o\xff\xec\x00\ +2\x03q\xff\xec\x002\x03s\xff\xec\x002\x03\x8f\xff\ +\xc3\x003\x00\x0f\xfe\xf6\x003\x00\x11\xfe\xf6\x003\x00\ +$\xff\x9a\x003\x00;\xff\xd7\x003\x00=\xff\xec\x00\ +3\x00\x82\xff\x9a\x003\x00\x83\xff\x9a\x003\x00\x84\xff\ +\x9a\x003\x00\x85\xff\x9a\x003\x00\x86\xff\x9a\x003\x00\ +\x87\xff\x9a\x003\x00\xc2\xff\x9a\x003\x00\xc4\xff\x9a\x00\ +3\x00\xc6\xff\x9a\x003\x01;\xff\xec\x003\x01=\xff\ +\xec\x003\x01?\xff\xec\x003\x01C\xff\x9a\x003\x02\ +\x08\xfe\xf6\x003\x02\x0c\xfe\xf6\x003\x02X\xff\x9a\x00\ +3\x03\x1d\xff\x9a\x003\x03\x1f\xff\x9a\x003\x03!\xff\ +\x9a\x003\x03#\xff\x9a\x003\x03%\xff\x9a\x003\x03\ +'\xff\x9a\x003\x03)\xff\x9a\x003\x03+\xff\x9a\x00\ +3\x03-\xff\x9a\x003\x03/\xff\x9a\x003\x031\xff\ +\x9a\x003\x033\xff\x9a\x004\x00\x0f\xff\xae\x004\x00\ +\x11\xff\xae\x004\x00$\xff\xd7\x004\x007\xff\xc3\x00\ +4\x009\xff\xec\x004\x00:\xff\xec\x004\x00;\xff\ +\xd7\x004\x00<\xff\xec\x004\x00=\xff\xec\x004\x00\ +\x82\xff\xd7\x004\x00\x83\xff\xd7\x004\x00\x84\xff\xd7\x00\ +4\x00\x85\xff\xd7\x004\x00\x86\xff\xd7\x004\x00\x87\xff\ +\xd7\x004\x00\x9f\xff\xec\x004\x00\xc2\xff\xd7\x004\x00\ +\xc4\xff\xd7\x004\x00\xc6\xff\xd7\x004\x01$\xff\xc3\x00\ +4\x01&\xff\xc3\x004\x016\xff\xec\x004\x018\xff\ +\xec\x004\x01:\xff\xec\x004\x01;\xff\xec\x004\x01\ +=\xff\xec\x004\x01?\xff\xec\x004\x01C\xff\xd7\x00\ +4\x01\xa0\xff\xec\x004\x01\xfa\xff\xec\x004\x01\xfc\xff\ +\xec\x004\x01\xfe\xff\xec\x004\x02\x00\xff\xec\x004\x02\ +\x08\xff\xae\x004\x02\x0c\xff\xae\x004\x02X\xff\xd7\x00\ +4\x03\x1d\xff\xd7\x004\x03\x1f\xff\xd7\x004\x03!\xff\ +\xd7\x004\x03#\xff\xd7\x004\x03%\xff\xd7\x004\x03\ +'\xff\xd7\x004\x03)\xff\xd7\x004\x03+\xff\xd7\x00\ +4\x03-\xff\xd7\x004\x03/\xff\xd7\x004\x031\xff\ +\xd7\x004\x033\xff\xd7\x004\x03o\xff\xec\x004\x03\ +q\xff\xec\x004\x03s\xff\xec\x004\x03\x8f\xff\xc3\x00\ +7\x00\x0f\xff\x85\x007\x00\x10\xff\xae\x007\x00\x11\xff\ +\x85\x007\x00\x22\x00)\x007\x00$\xffq\x007\x00\ +&\xff\xd7\x007\x00*\xff\xd7\x007\x002\xff\xd7\x00\ +7\x004\xff\xd7\x007\x007\x00)\x007\x00D\xff\ +\x5c\x007\x00F\xffq\x007\x00G\xffq\x007\x00\ +H\xffq\x007\x00J\xffq\x007\x00P\xff\x9a\x00\ +7\x00Q\xff\x9a\x007\x00R\xffq\x007\x00S\xff\ +\x9a\x007\x00T\xffq\x007\x00U\xff\x9a\x007\x00\ +V\xff\x85\x007\x00X\xff\x9a\x007\x00Y\xff\xd7\x00\ +7\x00Z\xff\xd7\x007\x00[\xff\xd7\x007\x00\x5c\xff\ +\xd7\x007\x00]\xff\xae\x007\x00\x82\xffq\x007\x00\ +\x83\xffq\x007\x00\x84\xffq\x007\x00\x85\xffq\x00\ +7\x00\x86\xffq\x007\x00\x87\xffq\x007\x00\x89\xff\ +\xd7\x007\x00\x94\xff\xd7\x007\x00\x95\xff\xd7\x007\x00\ +\x96\xff\xd7\x007\x00\x97\xff\xd7\x007\x00\x98\xff\xd7\x00\ +7\x00\x9a\xff\xd7\x007\x00\xa2\xffq\x007\x00\xa3\xff\ +\x5c\x007\x00\xa4\xff\x5c\x007\x00\xa5\xff\x5c\x007\x00\ +\xa6\xff\x5c\x007\x00\xa7\xff\x5c\x007\x00\xa8\xff\x5c\x00\ +7\x00\xa9\xffq\x007\x00\xaa\xffq\x007\x00\xab\xff\ +q\x007\x00\xac\xffq\x007\x00\xad\xffq\x007\x00\ +\xb4\xffq\x007\x00\xb5\xffq\x007\x00\xb6\xffq\x00\ +7\x00\xb7\xffq\x007\x00\xb8\xffq\x007\x00\xba\xff\ +q\x007\x00\xbb\xff\x9a\x007\x00\xbc\xff\x9a\x007\x00\ +\xbd\xff\x9a\x007\x00\xbe\xff\x9a\x007\x00\xbf\xff\xd7\x00\ +7\x00\xc2\xffq\x007\x00\xc3\xff\x5c\x007\x00\xc4\xff\ +q\x007\x00\xc5\xff\x5c\x007\x00\xc6\xffq\x007\x00\ +\xc7\xff\x5c\x007\x00\xc8\xff\xd7\x007\x00\xc9\xffq\x00\ +7\x00\xca\xff\xd7\x007\x00\xcb\xffq\x007\x00\xcc\xff\ +\xd7\x007\x00\xcd\xffq\x007\x00\xce\xff\xd7\x007\x00\ +\xcf\xffq\x007\x00\xd1\xffq\x007\x00\xd3\xffq\x00\ +7\x00\xd5\xffq\x007\x00\xd7\xffq\x007\x00\xd9\xff\ +q\x007\x00\xdb\xffq\x007\x00\xdd\xffq\x007\x00\ +\xde\xff\xd7\x007\x00\xdf\xffq\x007\x00\xe0\xff\xd7\x00\ +7\x00\xe1\xffq\x007\x00\xe2\xff\xd7\x007\x00\xe3\xff\ +q\x007\x00\xe4\xff\xd7\x007\x00\xe5\xffq\x007\x00\ +\xfa\xff\x9a\x007\x01\x06\xff\x9a\x007\x01\x08\xff\x9a\x00\ +7\x01\x0d\xff\x9a\x007\x01\x0e\xff\xd7\x007\x01\x0f\xff\ +q\x007\x01\x10\xff\xd7\x007\x01\x11\xffq\x007\x01\ +\x12\xff\xd7\x007\x01\x13\xffq\x007\x01\x14\xff\xd7\x00\ +7\x01\x15\xffq\x007\x01\x17\xff\x9a\x007\x01\x19\xff\ +\x9a\x007\x01\x1d\xff\x85\x007\x01!\xff\x85\x007\x01\ +$\x00)\x007\x01&\x00)\x007\x01+\xff\x9a\x00\ +7\x01-\xff\x9a\x007\x01/\xff\x9a\x007\x011\xff\ +\x9a\x007\x013\xff\x9a\x007\x015\xff\x9a\x007\x01\ +7\xff\xd7\x007\x01<\xff\xae\x007\x01>\xff\xae\x00\ +7\x01@\xff\xae\x007\x01C\xffq\x007\x01D\xff\ +\x5c\x007\x01F\xff\x5c\x007\x01G\xff\xd7\x007\x01\ +H\xffq\x007\x01J\xff\x85\x007\x01\xfb\xff\xd7\x00\ +7\x01\xfd\xff\xd7\x007\x02\x02\xff\xae\x007\x02\x03\xff\ +\xae\x007\x02\x04\xff\xae\x007\x02\x08\xff\x85\x007\x02\ +\x0c\xff\x85\x007\x02W\xff\x9a\x007\x02X\xffq\x00\ +7\x02Y\xff\x5c\x007\x02_\xff\xd7\x007\x02`\xff\ +q\x007\x02b\xff\x9a\x007\x03\x1d\xffq\x007\x03\ +\x1e\xff\x5c\x007\x03\x1f\xffq\x007\x03 \xff\x5c\x00\ +7\x03!\xffq\x007\x03\x22\xff\x5c\x007\x03#\xff\ +q\x007\x03%\xffq\x007\x03&\xff\x5c\x007\x03\ +'\xffq\x007\x03(\xff\x5c\x007\x03)\xffq\x00\ +7\x03*\xff\x5c\x007\x03+\xffq\x007\x03,\xff\ +\x5c\x007\x03-\xffq\x007\x03.\xff\x5c\x007\x03\ +/\xffq\x007\x030\xff\x5c\x007\x031\xffq\x00\ +7\x032\xff\x5c\x007\x033\xffq\x007\x034\xff\ +\x5c\x007\x036\xffq\x007\x038\xffq\x007\x03\ +:\xffq\x007\x03<\xffq\x007\x03@\xffq\x00\ +7\x03B\xffq\x007\x03D\xffq\x007\x03I\xff\ +\xd7\x007\x03J\xffq\x007\x03K\xff\xd7\x007\x03\ +L\xffq\x007\x03M\xff\xd7\x007\x03N\xffq\x00\ +7\x03O\xff\xd7\x007\x03Q\xff\xd7\x007\x03R\xff\ +q\x007\x03S\xff\xd7\x007\x03T\xffq\x007\x03\ +U\xff\xd7\x007\x03V\xffq\x007\x03W\xff\xd7\x00\ +7\x03X\xffq\x007\x03Y\xff\xd7\x007\x03Z\xff\ +q\x007\x03[\xff\xd7\x007\x03\x5c\xffq\x007\x03\ +]\xff\xd7\x007\x03^\xffq\x007\x03_\xff\xd7\x00\ +7\x03`\xffq\x007\x03b\xff\x9a\x007\x03d\xff\ +\x9a\x007\x03f\xff\x9a\x007\x03h\xff\x9a\x007\x03\ +j\xff\x9a\x007\x03l\xff\x9a\x007\x03n\xff\x9a\x00\ +7\x03p\xff\xd7\x007\x03\x8f\x00)\x008\x00\x0f\xff\ +\xd7\x008\x00\x11\xff\xd7\x008\x00$\xff\xec\x008\x00\ +\x82\xff\xec\x008\x00\x83\xff\xec\x008\x00\x84\xff\xec\x00\ +8\x00\x85\xff\xec\x008\x00\x86\xff\xec\x008\x00\x87\xff\ +\xec\x008\x00\xc2\xff\xec\x008\x00\xc4\xff\xec\x008\x00\ +\xc6\xff\xec\x008\x01C\xff\xec\x008\x02\x08\xff\xd7\x00\ +8\x02\x0c\xff\xd7\x008\x02X\xff\xec\x008\x03\x1d\xff\ +\xec\x008\x03\x1f\xff\xec\x008\x03!\xff\xec\x008\x03\ +#\xff\xec\x008\x03%\xff\xec\x008\x03'\xff\xec\x00\ +8\x03)\xff\xec\x008\x03+\xff\xec\x008\x03-\xff\ +\xec\x008\x03/\xff\xec\x008\x031\xff\xec\x008\x03\ +3\xff\xec\x009\x00\x0f\xff\x9a\x009\x00\x11\xff\x9a\x00\ +9\x00\x22\x00)\x009\x00$\xff\xae\x009\x00&\xff\ +\xec\x009\x00*\xff\xec\x009\x002\xff\xec\x009\x00\ +4\xff\xec\x009\x00D\xff\xd7\x009\x00F\xff\xd7\x00\ +9\x00G\xff\xd7\x009\x00H\xff\xd7\x009\x00J\xff\ +\xec\x009\x00P\xff\xec\x009\x00Q\xff\xec\x009\x00\ +R\xff\xd7\x009\x00S\xff\xec\x009\x00T\xff\xd7\x00\ +9\x00U\xff\xec\x009\x00V\xff\xec\x009\x00X\xff\ +\xec\x009\x00\x82\xff\xae\x009\x00\x83\xff\xae\x009\x00\ +\x84\xff\xae\x009\x00\x85\xff\xae\x009\x00\x86\xff\xae\x00\ +9\x00\x87\xff\xae\x009\x00\x89\xff\xec\x009\x00\x94\xff\ +\xec\x009\x00\x95\xff\xec\x009\x00\x96\xff\xec\x009\x00\ +\x97\xff\xec\x009\x00\x98\xff\xec\x009\x00\x9a\xff\xec\x00\ +9\x00\xa2\xff\xd7\x009\x00\xa3\xff\xd7\x009\x00\xa4\xff\ +\xd7\x009\x00\xa5\xff\xd7\x009\x00\xa6\xff\xd7\x009\x00\ +\xa7\xff\xd7\x009\x00\xa8\xff\xd7\x009\x00\xa9\xff\xd7\x00\ +9\x00\xaa\xff\xd7\x009\x00\xab\xff\xd7\x009\x00\xac\xff\ +\xd7\x009\x00\xad\xff\xd7\x009\x00\xb4\xff\xd7\x009\x00\ +\xb5\xff\xd7\x009\x00\xb6\xff\xd7\x009\x00\xb7\xff\xd7\x00\ +9\x00\xb8\xff\xd7\x009\x00\xba\xff\xd7\x009\x00\xbb\xff\ +\xec\x009\x00\xbc\xff\xec\x009\x00\xbd\xff\xec\x009\x00\ +\xbe\xff\xec\x009\x00\xc2\xff\xae\x009\x00\xc3\xff\xd7\x00\ +9\x00\xc4\xff\xae\x009\x00\xc5\xff\xd7\x009\x00\xc6\xff\ +\xae\x009\x00\xc7\xff\xd7\x009\x00\xc8\xff\xec\x009\x00\ +\xc9\xff\xd7\x009\x00\xca\xff\xec\x009\x00\xcb\xff\xd7\x00\ +9\x00\xcc\xff\xec\x009\x00\xcd\xff\xd7\x009\x00\xce\xff\ +\xec\x009\x00\xcf\xff\xd7\x009\x00\xd1\xff\xd7\x009\x00\ +\xd3\xff\xd7\x009\x00\xd5\xff\xd7\x009\x00\xd7\xff\xd7\x00\ +9\x00\xd9\xff\xd7\x009\x00\xdb\xff\xd7\x009\x00\xdd\xff\ +\xd7\x009\x00\xde\xff\xec\x009\x00\xdf\xff\xec\x009\x00\ +\xe0\xff\xec\x009\x00\xe1\xff\xec\x009\x00\xe2\xff\xec\x00\ +9\x00\xe3\xff\xec\x009\x00\xe4\xff\xec\x009\x00\xe5\xff\ +\xec\x009\x00\xfa\xff\xec\x009\x01\x06\xff\xec\x009\x01\ +\x08\xff\xec\x009\x01\x0d\xff\xec\x009\x01\x0e\xff\xec\x00\ +9\x01\x0f\xff\xd7\x009\x01\x10\xff\xec\x009\x01\x11\xff\ +\xd7\x009\x01\x12\xff\xec\x009\x01\x13\xff\xd7\x009\x01\ +\x14\xff\xec\x009\x01\x15\xff\xd7\x009\x01\x17\xff\xec\x00\ +9\x01\x19\xff\xec\x009\x01\x1d\xff\xec\x009\x01!\xff\ +\xec\x009\x01+\xff\xec\x009\x01-\xff\xec\x009\x01\ +/\xff\xec\x009\x011\xff\xec\x009\x013\xff\xec\x00\ +9\x015\xff\xec\x009\x01C\xff\xae\x009\x01D\xff\ +\xd7\x009\x01F\xff\xd7\x009\x01G\xff\xec\x009\x01\ +H\xff\xd7\x009\x01J\xff\xec\x009\x02\x08\xff\x9a\x00\ +9\x02\x0c\xff\x9a\x009\x02W\xff\xec\x009\x02X\xff\ +\xae\x009\x02Y\xff\xd7\x009\x02_\xff\xec\x009\x02\ +`\xff\xd7\x009\x02b\xff\xec\x009\x03\x1d\xff\xae\x00\ +9\x03\x1e\xff\xd7\x009\x03\x1f\xff\xae\x009\x03 \xff\ +\xd7\x009\x03!\xff\xae\x009\x03\x22\xff\xd7\x009\x03\ +#\xff\xae\x009\x03%\xff\xae\x009\x03&\xff\xd7\x00\ +9\x03'\xff\xae\x009\x03(\xff\xd7\x009\x03)\xff\ +\xae\x009\x03*\xff\xd7\x009\x03+\xff\xae\x009\x03\ +,\xff\xd7\x009\x03-\xff\xae\x009\x03.\xff\xd7\x00\ +9\x03/\xff\xae\x009\x030\xff\xd7\x009\x031\xff\ +\xae\x009\x032\xff\xd7\x009\x033\xff\xae\x009\x03\ +4\xff\xd7\x009\x036\xff\xd7\x009\x038\xff\xd7\x00\ +9\x03:\xff\xd7\x009\x03<\xff\xd7\x009\x03@\xff\ +\xd7\x009\x03B\xff\xd7\x009\x03D\xff\xd7\x009\x03\ +I\xff\xec\x009\x03J\xff\xd7\x009\x03K\xff\xec\x00\ +9\x03L\xff\xd7\x009\x03M\xff\xec\x009\x03N\xff\ +\xd7\x009\x03O\xff\xec\x009\x03Q\xff\xec\x009\x03\ +R\xff\xd7\x009\x03S\xff\xec\x009\x03T\xff\xd7\x00\ +9\x03U\xff\xec\x009\x03V\xff\xd7\x009\x03W\xff\ +\xec\x009\x03X\xff\xd7\x009\x03Y\xff\xec\x009\x03\ +Z\xff\xd7\x009\x03[\xff\xec\x009\x03\x5c\xff\xd7\x00\ +9\x03]\xff\xec\x009\x03^\xff\xd7\x009\x03_\xff\ +\xec\x009\x03`\xff\xd7\x009\x03b\xff\xec\x009\x03\ +d\xff\xec\x009\x03f\xff\xec\x009\x03h\xff\xec\x00\ +9\x03j\xff\xec\x009\x03l\xff\xec\x009\x03n\xff\ +\xec\x00:\x00\x0f\xff\x9a\x00:\x00\x11\xff\x9a\x00:\x00\ +\x22\x00)\x00:\x00$\xff\xae\x00:\x00&\xff\xec\x00\ +:\x00*\xff\xec\x00:\x002\xff\xec\x00:\x004\xff\ +\xec\x00:\x00D\xff\xd7\x00:\x00F\xff\xd7\x00:\x00\ +G\xff\xd7\x00:\x00H\xff\xd7\x00:\x00J\xff\xec\x00\ +:\x00P\xff\xec\x00:\x00Q\xff\xec\x00:\x00R\xff\ +\xd7\x00:\x00S\xff\xec\x00:\x00T\xff\xd7\x00:\x00\ +U\xff\xec\x00:\x00V\xff\xec\x00:\x00X\xff\xec\x00\ +:\x00\x82\xff\xae\x00:\x00\x83\xff\xae\x00:\x00\x84\xff\ +\xae\x00:\x00\x85\xff\xae\x00:\x00\x86\xff\xae\x00:\x00\ +\x87\xff\xae\x00:\x00\x89\xff\xec\x00:\x00\x94\xff\xec\x00\ +:\x00\x95\xff\xec\x00:\x00\x96\xff\xec\x00:\x00\x97\xff\ +\xec\x00:\x00\x98\xff\xec\x00:\x00\x9a\xff\xec\x00:\x00\ +\xa2\xff\xd7\x00:\x00\xa3\xff\xd7\x00:\x00\xa4\xff\xd7\x00\ +:\x00\xa5\xff\xd7\x00:\x00\xa6\xff\xd7\x00:\x00\xa7\xff\ +\xd7\x00:\x00\xa8\xff\xd7\x00:\x00\xa9\xff\xd7\x00:\x00\ +\xaa\xff\xd7\x00:\x00\xab\xff\xd7\x00:\x00\xac\xff\xd7\x00\ +:\x00\xad\xff\xd7\x00:\x00\xb4\xff\xd7\x00:\x00\xb5\xff\ +\xd7\x00:\x00\xb6\xff\xd7\x00:\x00\xb7\xff\xd7\x00:\x00\ +\xb8\xff\xd7\x00:\x00\xba\xff\xd7\x00:\x00\xbb\xff\xec\x00\ +:\x00\xbc\xff\xec\x00:\x00\xbd\xff\xec\x00:\x00\xbe\xff\ +\xec\x00:\x00\xc2\xff\xae\x00:\x00\xc3\xff\xd7\x00:\x00\ +\xc4\xff\xae\x00:\x00\xc5\xff\xd7\x00:\x00\xc6\xff\xae\x00\ +:\x00\xc7\xff\xd7\x00:\x00\xc8\xff\xec\x00:\x00\xc9\xff\ +\xd7\x00:\x00\xca\xff\xec\x00:\x00\xcb\xff\xd7\x00:\x00\ +\xcc\xff\xec\x00:\x00\xcd\xff\xd7\x00:\x00\xce\xff\xec\x00\ +:\x00\xcf\xff\xd7\x00:\x00\xd1\xff\xd7\x00:\x00\xd3\xff\ +\xd7\x00:\x00\xd5\xff\xd7\x00:\x00\xd7\xff\xd7\x00:\x00\ +\xd9\xff\xd7\x00:\x00\xdb\xff\xd7\x00:\x00\xdd\xff\xd7\x00\ +:\x00\xde\xff\xec\x00:\x00\xdf\xff\xec\x00:\x00\xe0\xff\ +\xec\x00:\x00\xe1\xff\xec\x00:\x00\xe2\xff\xec\x00:\x00\ +\xe3\xff\xec\x00:\x00\xe4\xff\xec\x00:\x00\xe5\xff\xec\x00\ +:\x00\xfa\xff\xec\x00:\x01\x06\xff\xec\x00:\x01\x08\xff\ +\xec\x00:\x01\x0d\xff\xec\x00:\x01\x0e\xff\xec\x00:\x01\ +\x0f\xff\xd7\x00:\x01\x10\xff\xec\x00:\x01\x11\xff\xd7\x00\ +:\x01\x12\xff\xec\x00:\x01\x13\xff\xd7\x00:\x01\x14\xff\ +\xec\x00:\x01\x15\xff\xd7\x00:\x01\x17\xff\xec\x00:\x01\ +\x19\xff\xec\x00:\x01\x1d\xff\xec\x00:\x01!\xff\xec\x00\ +:\x01+\xff\xec\x00:\x01-\xff\xec\x00:\x01/\xff\ +\xec\x00:\x011\xff\xec\x00:\x013\xff\xec\x00:\x01\ +5\xff\xec\x00:\x01C\xff\xae\x00:\x01D\xff\xd7\x00\ +:\x01F\xff\xd7\x00:\x01G\xff\xec\x00:\x01H\xff\ +\xd7\x00:\x01J\xff\xec\x00:\x02\x08\xff\x9a\x00:\x02\ +\x0c\xff\x9a\x00:\x02W\xff\xec\x00:\x02X\xff\xae\x00\ +:\x02Y\xff\xd7\x00:\x02_\xff\xec\x00:\x02`\xff\ +\xd7\x00:\x02b\xff\xec\x00:\x03\x1d\xff\xae\x00:\x03\ +\x1e\xff\xd7\x00:\x03\x1f\xff\xae\x00:\x03 \xff\xd7\x00\ +:\x03!\xff\xae\x00:\x03\x22\xff\xd7\x00:\x03#\xff\ +\xae\x00:\x03%\xff\xae\x00:\x03&\xff\xd7\x00:\x03\ +'\xff\xae\x00:\x03(\xff\xd7\x00:\x03)\xff\xae\x00\ +:\x03*\xff\xd7\x00:\x03+\xff\xae\x00:\x03,\xff\ +\xd7\x00:\x03-\xff\xae\x00:\x03.\xff\xd7\x00:\x03\ +/\xff\xae\x00:\x030\xff\xd7\x00:\x031\xff\xae\x00\ +:\x032\xff\xd7\x00:\x033\xff\xae\x00:\x034\xff\ +\xd7\x00:\x036\xff\xd7\x00:\x038\xff\xd7\x00:\x03\ +:\xff\xd7\x00:\x03<\xff\xd7\x00:\x03@\xff\xd7\x00\ +:\x03B\xff\xd7\x00:\x03D\xff\xd7\x00:\x03I\xff\ +\xec\x00:\x03J\xff\xd7\x00:\x03K\xff\xec\x00:\x03\ +L\xff\xd7\x00:\x03M\xff\xec\x00:\x03N\xff\xd7\x00\ +:\x03O\xff\xec\x00:\x03Q\xff\xec\x00:\x03R\xff\ +\xd7\x00:\x03S\xff\xec\x00:\x03T\xff\xd7\x00:\x03\ +U\xff\xec\x00:\x03V\xff\xd7\x00:\x03W\xff\xec\x00\ +:\x03X\xff\xd7\x00:\x03Y\xff\xec\x00:\x03Z\xff\ +\xd7\x00:\x03[\xff\xec\x00:\x03\x5c\xff\xd7\x00:\x03\ +]\xff\xec\x00:\x03^\xff\xd7\x00:\x03_\xff\xec\x00\ +:\x03`\xff\xd7\x00:\x03b\xff\xec\x00:\x03d\xff\ +\xec\x00:\x03f\xff\xec\x00:\x03h\xff\xec\x00:\x03\ +j\xff\xec\x00:\x03l\xff\xec\x00:\x03n\xff\xec\x00\ +;\x00&\xff\xd7\x00;\x00*\xff\xd7\x00;\x002\xff\ +\xd7\x00;\x004\xff\xd7\x00;\x00\x89\xff\xd7\x00;\x00\ +\x94\xff\xd7\x00;\x00\x95\xff\xd7\x00;\x00\x96\xff\xd7\x00\ +;\x00\x97\xff\xd7\x00;\x00\x98\xff\xd7\x00;\x00\x9a\xff\ +\xd7\x00;\x00\xc8\xff\xd7\x00;\x00\xca\xff\xd7\x00;\x00\ +\xcc\xff\xd7\x00;\x00\xce\xff\xd7\x00;\x00\xde\xff\xd7\x00\ +;\x00\xe0\xff\xd7\x00;\x00\xe2\xff\xd7\x00;\x00\xe4\xff\ +\xd7\x00;\x01\x0e\xff\xd7\x00;\x01\x10\xff\xd7\x00;\x01\ +\x12\xff\xd7\x00;\x01\x14\xff\xd7\x00;\x01G\xff\xd7\x00\ +;\x02_\xff\xd7\x00;\x03I\xff\xd7\x00;\x03K\xff\ +\xd7\x00;\x03M\xff\xd7\x00;\x03O\xff\xd7\x00;\x03\ +Q\xff\xd7\x00;\x03S\xff\xd7\x00;\x03U\xff\xd7\x00\ +;\x03W\xff\xd7\x00;\x03Y\xff\xd7\x00;\x03[\xff\ +\xd7\x00;\x03]\xff\xd7\x00;\x03_\xff\xd7\x00<\x00\ +\x0f\xff\x85\x00<\x00\x11\xff\x85\x00<\x00\x22\x00)\x00\ +<\x00$\xff\x85\x00<\x00&\xff\xd7\x00<\x00*\xff\ +\xd7\x00<\x002\xff\xd7\x00<\x004\xff\xd7\x00<\x00\ +D\xff\x9a\x00<\x00F\xff\x9a\x00<\x00G\xff\x9a\x00\ +<\x00H\xff\x9a\x00<\x00J\xff\xd7\x00<\x00P\xff\ +\xc3\x00<\x00Q\xff\xc3\x00<\x00R\xff\x9a\x00<\x00\ +S\xff\xc3\x00<\x00T\xff\x9a\x00<\x00U\xff\xc3\x00\ +<\x00V\xff\xae\x00<\x00X\xff\xc3\x00<\x00]\xff\ +\xd7\x00<\x00\x82\xff\x85\x00<\x00\x83\xff\x85\x00<\x00\ +\x84\xff\x85\x00<\x00\x85\xff\x85\x00<\x00\x86\xff\x85\x00\ +<\x00\x87\xff\x85\x00<\x00\x89\xff\xd7\x00<\x00\x94\xff\ +\xd7\x00<\x00\x95\xff\xd7\x00<\x00\x96\xff\xd7\x00<\x00\ +\x97\xff\xd7\x00<\x00\x98\xff\xd7\x00<\x00\x9a\xff\xd7\x00\ +<\x00\xa2\xff\x9a\x00<\x00\xa3\xff\x9a\x00<\x00\xa4\xff\ +\x9a\x00<\x00\xa5\xff\x9a\x00<\x00\xa6\xff\x9a\x00<\x00\ +\xa7\xff\x9a\x00<\x00\xa8\xff\x9a\x00<\x00\xa9\xff\x9a\x00\ +<\x00\xaa\xff\x9a\x00<\x00\xab\xff\x9a\x00<\x00\xac\xff\ +\x9a\x00<\x00\xad\xff\x9a\x00<\x00\xb4\xff\x9a\x00<\x00\ +\xb5\xff\x9a\x00<\x00\xb6\xff\x9a\x00<\x00\xb7\xff\x9a\x00\ +<\x00\xb8\xff\x9a\x00<\x00\xba\xff\x9a\x00<\x00\xbb\xff\ +\xc3\x00<\x00\xbc\xff\xc3\x00<\x00\xbd\xff\xc3\x00<\x00\ +\xbe\xff\xc3\x00<\x00\xc2\xff\x85\x00<\x00\xc3\xff\x9a\x00\ +<\x00\xc4\xff\x85\x00<\x00\xc5\xff\x9a\x00<\x00\xc6\xff\ +\x85\x00<\x00\xc7\xff\x9a\x00<\x00\xc8\xff\xd7\x00<\x00\ +\xc9\xff\x9a\x00<\x00\xca\xff\xd7\x00<\x00\xcb\xff\x9a\x00\ +<\x00\xcc\xff\xd7\x00<\x00\xcd\xff\x9a\x00<\x00\xce\xff\ +\xd7\x00<\x00\xcf\xff\x9a\x00<\x00\xd1\xff\x9a\x00<\x00\ +\xd3\xff\x9a\x00<\x00\xd5\xff\x9a\x00<\x00\xd7\xff\x9a\x00\ +<\x00\xd9\xff\x9a\x00<\x00\xdb\xff\x9a\x00<\x00\xdd\xff\ +\x9a\x00<\x00\xde\xff\xd7\x00<\x00\xdf\xff\xd7\x00<\x00\ +\xe0\xff\xd7\x00<\x00\xe1\xff\xd7\x00<\x00\xe2\xff\xd7\x00\ +<\x00\xe3\xff\xd7\x00<\x00\xe4\xff\xd7\x00<\x00\xe5\xff\ +\xd7\x00<\x00\xfa\xff\xc3\x00<\x01\x06\xff\xc3\x00<\x01\ +\x08\xff\xc3\x00<\x01\x0d\xff\xc3\x00<\x01\x0e\xff\xd7\x00\ +<\x01\x0f\xff\x9a\x00<\x01\x10\xff\xd7\x00<\x01\x11\xff\ +\x9a\x00<\x01\x12\xff\xd7\x00<\x01\x13\xff\x9a\x00<\x01\ +\x14\xff\xd7\x00<\x01\x15\xff\x9a\x00<\x01\x17\xff\xc3\x00\ +<\x01\x19\xff\xc3\x00<\x01\x1d\xff\xae\x00<\x01!\xff\ +\xae\x00<\x01+\xff\xc3\x00<\x01-\xff\xc3\x00<\x01\ +/\xff\xc3\x00<\x011\xff\xc3\x00<\x013\xff\xc3\x00\ +<\x015\xff\xc3\x00<\x01<\xff\xd7\x00<\x01>\xff\ +\xd7\x00<\x01@\xff\xd7\x00<\x01C\xff\x85\x00<\x01\ +D\xff\x9a\x00<\x01F\xff\x9a\x00<\x01G\xff\xd7\x00\ +<\x01H\xff\x9a\x00<\x01J\xff\xae\x00<\x02\x08\xff\ +\x85\x00<\x02\x0c\xff\x85\x00<\x02W\xff\xc3\x00<\x02\ +X\xff\x85\x00<\x02Y\xff\x9a\x00<\x02_\xff\xd7\x00\ +<\x02`\xff\x9a\x00<\x02b\xff\xc3\x00<\x03\x1d\xff\ +\x85\x00<\x03\x1e\xff\x9a\x00<\x03\x1f\xff\x85\x00<\x03\ + \xff\x9a\x00<\x03!\xff\x85\x00<\x03\x22\xff\x9a\x00\ +<\x03#\xff\x85\x00<\x03%\xff\x85\x00<\x03&\xff\ +\x9a\x00<\x03'\xff\x85\x00<\x03(\xff\x9a\x00<\x03\ +)\xff\x85\x00<\x03*\xff\x9a\x00<\x03+\xff\x85\x00\ +<\x03,\xff\x9a\x00<\x03-\xff\x85\x00<\x03.\xff\ +\x9a\x00<\x03/\xff\x85\x00<\x030\xff\x9a\x00<\x03\ +1\xff\x85\x00<\x032\xff\x9a\x00<\x033\xff\x85\x00\ +<\x034\xff\x9a\x00<\x036\xff\x9a\x00<\x038\xff\ +\x9a\x00<\x03:\xff\x9a\x00<\x03<\xff\x9a\x00<\x03\ +@\xff\x9a\x00<\x03B\xff\x9a\x00<\x03D\xff\x9a\x00\ +<\x03I\xff\xd7\x00<\x03J\xff\x9a\x00<\x03K\xff\ +\xd7\x00<\x03L\xff\x9a\x00<\x03M\xff\xd7\x00<\x03\ +N\xff\x9a\x00<\x03O\xff\xd7\x00<\x03Q\xff\xd7\x00\ +<\x03R\xff\x9a\x00<\x03S\xff\xd7\x00<\x03T\xff\ +\x9a\x00<\x03U\xff\xd7\x00<\x03V\xff\x9a\x00<\x03\ +W\xff\xd7\x00<\x03X\xff\x9a\x00<\x03Y\xff\xd7\x00\ +<\x03Z\xff\x9a\x00<\x03[\xff\xd7\x00<\x03\x5c\xff\ +\x9a\x00<\x03]\xff\xd7\x00<\x03^\xff\x9a\x00<\x03\ +_\xff\xd7\x00<\x03`\xff\x9a\x00<\x03b\xff\xc3\x00\ +<\x03d\xff\xc3\x00<\x03f\xff\xc3\x00<\x03h\xff\ +\xc3\x00<\x03j\xff\xc3\x00<\x03l\xff\xc3\x00<\x03\ +n\xff\xc3\x00=\x00&\xff\xec\x00=\x00*\xff\xec\x00\ +=\x002\xff\xec\x00=\x004\xff\xec\x00=\x00\x89\xff\ +\xec\x00=\x00\x94\xff\xec\x00=\x00\x95\xff\xec\x00=\x00\ +\x96\xff\xec\x00=\x00\x97\xff\xec\x00=\x00\x98\xff\xec\x00\ +=\x00\x9a\xff\xec\x00=\x00\xc8\xff\xec\x00=\x00\xca\xff\ +\xec\x00=\x00\xcc\xff\xec\x00=\x00\xce\xff\xec\x00=\x00\ +\xde\xff\xec\x00=\x00\xe0\xff\xec\x00=\x00\xe2\xff\xec\x00\ +=\x00\xe4\xff\xec\x00=\x01\x0e\xff\xec\x00=\x01\x10\xff\ +\xec\x00=\x01\x12\xff\xec\x00=\x01\x14\xff\xec\x00=\x01\ +G\xff\xec\x00=\x02_\xff\xec\x00=\x03I\xff\xec\x00\ +=\x03K\xff\xec\x00=\x03M\xff\xec\x00=\x03O\xff\ +\xec\x00=\x03Q\xff\xec\x00=\x03S\xff\xec\x00=\x03\ +U\xff\xec\x00=\x03W\xff\xec\x00=\x03Y\xff\xec\x00\ +=\x03[\xff\xec\x00=\x03]\xff\xec\x00=\x03_\xff\ +\xec\x00>\x00-\x00\xb8\x00D\x00\x05\xff\xec\x00D\x00\ +\x0a\xff\xec\x00D\x02\x07\xff\xec\x00D\x02\x0b\xff\xec\x00\ +E\x00\x05\xff\xec\x00E\x00\x0a\xff\xec\x00E\x00Y\xff\ +\xd7\x00E\x00Z\xff\xd7\x00E\x00[\xff\xd7\x00E\x00\ +\x5c\xff\xd7\x00E\x00]\xff\xec\x00E\x00\xbf\xff\xd7\x00\ +E\x017\xff\xd7\x00E\x01<\xff\xec\x00E\x01>\xff\ +\xec\x00E\x01@\xff\xec\x00E\x01\xfb\xff\xd7\x00E\x01\ +\xfd\xff\xd7\x00E\x02\x07\xff\xec\x00E\x02\x0b\xff\xec\x00\ +E\x03p\xff\xd7\x00F\x00\x05\x00)\x00F\x00\x0a\x00\ +)\x00F\x02\x07\x00)\x00F\x02\x0b\x00)\x00H\x00\ +\x05\xff\xec\x00H\x00\x0a\xff\xec\x00H\x00Y\xff\xd7\x00\ +H\x00Z\xff\xd7\x00H\x00[\xff\xd7\x00H\x00\x5c\xff\ +\xd7\x00H\x00]\xff\xec\x00H\x00\xbf\xff\xd7\x00H\x01\ +7\xff\xd7\x00H\x01<\xff\xec\x00H\x01>\xff\xec\x00\ +H\x01@\xff\xec\x00H\x01\xfb\xff\xd7\x00H\x01\xfd\xff\ +\xd7\x00H\x02\x07\xff\xec\x00H\x02\x0b\xff\xec\x00H\x03\ +p\xff\xd7\x00I\x00\x05\x00{\x00I\x00\x0a\x00{\x00\ +I\x02\x07\x00{\x00I\x02\x0b\x00{\x00K\x00\x05\xff\ +\xec\x00K\x00\x0a\xff\xec\x00K\x02\x07\xff\xec\x00K\x02\ +\x0b\xff\xec\x00N\x00F\xff\xd7\x00N\x00G\xff\xd7\x00\ +N\x00H\xff\xd7\x00N\x00R\xff\xd7\x00N\x00T\xff\ +\xd7\x00N\x00\xa2\xff\xd7\x00N\x00\xa9\xff\xd7\x00N\x00\ +\xaa\xff\xd7\x00N\x00\xab\xff\xd7\x00N\x00\xac\xff\xd7\x00\ +N\x00\xad\xff\xd7\x00N\x00\xb4\xff\xd7\x00N\x00\xb5\xff\ +\xd7\x00N\x00\xb6\xff\xd7\x00N\x00\xb7\xff\xd7\x00N\x00\ +\xb8\xff\xd7\x00N\x00\xba\xff\xd7\x00N\x00\xc9\xff\xd7\x00\ +N\x00\xcb\xff\xd7\x00N\x00\xcd\xff\xd7\x00N\x00\xcf\xff\ +\xd7\x00N\x00\xd1\xff\xd7\x00N\x00\xd3\xff\xd7\x00N\x00\ +\xd5\xff\xd7\x00N\x00\xd7\xff\xd7\x00N\x00\xd9\xff\xd7\x00\ +N\x00\xdb\xff\xd7\x00N\x00\xdd\xff\xd7\x00N\x01\x0f\xff\ +\xd7\x00N\x01\x11\xff\xd7\x00N\x01\x13\xff\xd7\x00N\x01\ +\x15\xff\xd7\x00N\x01H\xff\xd7\x00N\x02`\xff\xd7\x00\ +N\x036\xff\xd7\x00N\x038\xff\xd7\x00N\x03:\xff\ +\xd7\x00N\x03<\xff\xd7\x00N\x03@\xff\xd7\x00N\x03\ +B\xff\xd7\x00N\x03D\xff\xd7\x00N\x03J\xff\xd7\x00\ +N\x03L\xff\xd7\x00N\x03N\xff\xd7\x00N\x03R\xff\ +\xd7\x00N\x03T\xff\xd7\x00N\x03V\xff\xd7\x00N\x03\ +X\xff\xd7\x00N\x03Z\xff\xd7\x00N\x03\x5c\xff\xd7\x00\ +N\x03^\xff\xd7\x00N\x03`\xff\xd7\x00P\x00\x05\xff\ +\xec\x00P\x00\x0a\xff\xec\x00P\x02\x07\xff\xec\x00P\x02\ +\x0b\xff\xec\x00Q\x00\x05\xff\xec\x00Q\x00\x0a\xff\xec\x00\ +Q\x02\x07\xff\xec\x00Q\x02\x0b\xff\xec\x00R\x00\x05\xff\ +\xec\x00R\x00\x0a\xff\xec\x00R\x00Y\xff\xd7\x00R\x00\ +Z\xff\xd7\x00R\x00[\xff\xd7\x00R\x00\x5c\xff\xd7\x00\ +R\x00]\xff\xec\x00R\x00\xbf\xff\xd7\x00R\x017\xff\ +\xd7\x00R\x01<\xff\xec\x00R\x01>\xff\xec\x00R\x01\ +@\xff\xec\x00R\x01\xfb\xff\xd7\x00R\x01\xfd\xff\xd7\x00\ +R\x02\x07\xff\xec\x00R\x02\x0b\xff\xec\x00R\x03p\xff\ +\xd7\x00S\x00\x05\xff\xec\x00S\x00\x0a\xff\xec\x00S\x00\ +Y\xff\xd7\x00S\x00Z\xff\xd7\x00S\x00[\xff\xd7\x00\ +S\x00\x5c\xff\xd7\x00S\x00]\xff\xec\x00S\x00\xbf\xff\ +\xd7\x00S\x017\xff\xd7\x00S\x01<\xff\xec\x00S\x01\ +>\xff\xec\x00S\x01@\xff\xec\x00S\x01\xfb\xff\xd7\x00\ +S\x01\xfd\xff\xd7\x00S\x02\x07\xff\xec\x00S\x02\x0b\xff\ +\xec\x00S\x03p\xff\xd7\x00U\x00\x05\x00R\x00U\x00\ +\x0a\x00R\x00U\x00D\xff\xd7\x00U\x00F\xff\xd7\x00\ +U\x00G\xff\xd7\x00U\x00H\xff\xd7\x00U\x00J\xff\ +\xec\x00U\x00R\xff\xd7\x00U\x00T\xff\xd7\x00U\x00\ +\xa2\xff\xd7\x00U\x00\xa3\xff\xd7\x00U\x00\xa4\xff\xd7\x00\ +U\x00\xa5\xff\xd7\x00U\x00\xa6\xff\xd7\x00U\x00\xa7\xff\ +\xd7\x00U\x00\xa8\xff\xd7\x00U\x00\xa9\xff\xd7\x00U\x00\ +\xaa\xff\xd7\x00U\x00\xab\xff\xd7\x00U\x00\xac\xff\xd7\x00\ +U\x00\xad\xff\xd7\x00U\x00\xb4\xff\xd7\x00U\x00\xb5\xff\ +\xd7\x00U\x00\xb6\xff\xd7\x00U\x00\xb7\xff\xd7\x00U\x00\ +\xb8\xff\xd7\x00U\x00\xba\xff\xd7\x00U\x00\xc3\xff\xd7\x00\ +U\x00\xc5\xff\xd7\x00U\x00\xc7\xff\xd7\x00U\x00\xc9\xff\ +\xd7\x00U\x00\xcb\xff\xd7\x00U\x00\xcd\xff\xd7\x00U\x00\ +\xcf\xff\xd7\x00U\x00\xd1\xff\xd7\x00U\x00\xd3\xff\xd7\x00\ +U\x00\xd5\xff\xd7\x00U\x00\xd7\xff\xd7\x00U\x00\xd9\xff\ +\xd7\x00U\x00\xdb\xff\xd7\x00U\x00\xdd\xff\xd7\x00U\x00\ +\xdf\xff\xec\x00U\x00\xe1\xff\xec\x00U\x00\xe3\xff\xec\x00\ +U\x00\xe5\xff\xec\x00U\x01\x0f\xff\xd7\x00U\x01\x11\xff\ +\xd7\x00U\x01\x13\xff\xd7\x00U\x01\x15\xff\xd7\x00U\x01\ +D\xff\xd7\x00U\x01F\xff\xd7\x00U\x01H\xff\xd7\x00\ +U\x02\x07\x00R\x00U\x02\x0b\x00R\x00U\x02Y\xff\ +\xd7\x00U\x02`\xff\xd7\x00U\x03\x1e\xff\xd7\x00U\x03\ + \xff\xd7\x00U\x03\x22\xff\xd7\x00U\x03&\xff\xd7\x00\ +U\x03(\xff\xd7\x00U\x03*\xff\xd7\x00U\x03,\xff\ +\xd7\x00U\x03.\xff\xd7\x00U\x030\xff\xd7\x00U\x03\ +2\xff\xd7\x00U\x034\xff\xd7\x00U\x036\xff\xd7\x00\ +U\x038\xff\xd7\x00U\x03:\xff\xd7\x00U\x03<\xff\ +\xd7\x00U\x03@\xff\xd7\x00U\x03B\xff\xd7\x00U\x03\ +D\xff\xd7\x00U\x03J\xff\xd7\x00U\x03L\xff\xd7\x00\ +U\x03N\xff\xd7\x00U\x03R\xff\xd7\x00U\x03T\xff\ +\xd7\x00U\x03V\xff\xd7\x00U\x03X\xff\xd7\x00U\x03\ +Z\xff\xd7\x00U\x03\x5c\xff\xd7\x00U\x03^\xff\xd7\x00\ +U\x03`\xff\xd7\x00W\x00\x05\x00)\x00W\x00\x0a\x00\ +)\x00W\x02\x07\x00)\x00W\x02\x0b\x00)\x00Y\x00\ +\x05\x00R\x00Y\x00\x0a\x00R\x00Y\x00\x0f\xff\xae\x00\ +Y\x00\x11\xff\xae\x00Y\x00\x22\x00)\x00Y\x02\x07\x00\ +R\x00Y\x02\x08\xff\xae\x00Y\x02\x0b\x00R\x00Y\x02\ +\x0c\xff\xae\x00Z\x00\x05\x00R\x00Z\x00\x0a\x00R\x00\ +Z\x00\x0f\xff\xae\x00Z\x00\x11\xff\xae\x00Z\x00\x22\x00\ +)\x00Z\x02\x07\x00R\x00Z\x02\x08\xff\xae\x00Z\x02\ +\x0b\x00R\x00Z\x02\x0c\xff\xae\x00[\x00F\xff\xd7\x00\ +[\x00G\xff\xd7\x00[\x00H\xff\xd7\x00[\x00R\xff\ +\xd7\x00[\x00T\xff\xd7\x00[\x00\xa2\xff\xd7\x00[\x00\ +\xa9\xff\xd7\x00[\x00\xaa\xff\xd7\x00[\x00\xab\xff\xd7\x00\ +[\x00\xac\xff\xd7\x00[\x00\xad\xff\xd7\x00[\x00\xb4\xff\ +\xd7\x00[\x00\xb5\xff\xd7\x00[\x00\xb6\xff\xd7\x00[\x00\ +\xb7\xff\xd7\x00[\x00\xb8\xff\xd7\x00[\x00\xba\xff\xd7\x00\ +[\x00\xc9\xff\xd7\x00[\x00\xcb\xff\xd7\x00[\x00\xcd\xff\ +\xd7\x00[\x00\xcf\xff\xd7\x00[\x00\xd1\xff\xd7\x00[\x00\ +\xd3\xff\xd7\x00[\x00\xd5\xff\xd7\x00[\x00\xd7\xff\xd7\x00\ +[\x00\xd9\xff\xd7\x00[\x00\xdb\xff\xd7\x00[\x00\xdd\xff\ +\xd7\x00[\x01\x0f\xff\xd7\x00[\x01\x11\xff\xd7\x00[\x01\ +\x13\xff\xd7\x00[\x01\x15\xff\xd7\x00[\x01H\xff\xd7\x00\ +[\x02`\xff\xd7\x00[\x036\xff\xd7\x00[\x038\xff\ +\xd7\x00[\x03:\xff\xd7\x00[\x03<\xff\xd7\x00[\x03\ +@\xff\xd7\x00[\x03B\xff\xd7\x00[\x03D\xff\xd7\x00\ +[\x03J\xff\xd7\x00[\x03L\xff\xd7\x00[\x03N\xff\ +\xd7\x00[\x03R\xff\xd7\x00[\x03T\xff\xd7\x00[\x03\ +V\xff\xd7\x00[\x03X\xff\xd7\x00[\x03Z\xff\xd7\x00\ +[\x03\x5c\xff\xd7\x00[\x03^\xff\xd7\x00[\x03`\xff\ +\xd7\x00\x5c\x00\x05\x00R\x00\x5c\x00\x0a\x00R\x00\x5c\x00\ +\x0f\xff\xae\x00\x5c\x00\x11\xff\xae\x00\x5c\x00\x22\x00)\x00\ +\x5c\x02\x07\x00R\x00\x5c\x02\x08\xff\xae\x00\x5c\x02\x0b\x00\ +R\x00\x5c\x02\x0c\xff\xae\x00^\x00-\x00\xb8\x00\x82\x00\ +\x05\xffq\x00\x82\x00\x0a\xffq\x00\x82\x00&\xff\xd7\x00\ +\x82\x00*\xff\xd7\x00\x82\x00-\x01\x0a\x00\x82\x002\xff\ +\xd7\x00\x82\x004\xff\xd7\x00\x82\x007\xffq\x00\x82\x00\ +9\xff\xae\x00\x82\x00:\xff\xae\x00\x82\x00<\xff\x85\x00\ +\x82\x00\x89\xff\xd7\x00\x82\x00\x94\xff\xd7\x00\x82\x00\x95\xff\ +\xd7\x00\x82\x00\x96\xff\xd7\x00\x82\x00\x97\xff\xd7\x00\x82\x00\ +\x98\xff\xd7\x00\x82\x00\x9a\xff\xd7\x00\x82\x00\x9f\xff\x85\x00\ +\x82\x00\xc8\xff\xd7\x00\x82\x00\xca\xff\xd7\x00\x82\x00\xcc\xff\ +\xd7\x00\x82\x00\xce\xff\xd7\x00\x82\x00\xde\xff\xd7\x00\x82\x00\ +\xe0\xff\xd7\x00\x82\x00\xe2\xff\xd7\x00\x82\x00\xe4\xff\xd7\x00\ +\x82\x01\x0e\xff\xd7\x00\x82\x01\x10\xff\xd7\x00\x82\x01\x12\xff\ +\xd7\x00\x82\x01\x14\xff\xd7\x00\x82\x01$\xffq\x00\x82\x01\ +&\xffq\x00\x82\x016\xff\xae\x00\x82\x018\xff\x85\x00\ +\x82\x01:\xff\x85\x00\x82\x01G\xff\xd7\x00\x82\x01\xfa\xff\ +\xae\x00\x82\x01\xfc\xff\xae\x00\x82\x01\xfe\xff\xae\x00\x82\x02\ +\x00\xff\x85\x00\x82\x02\x07\xffq\x00\x82\x02\x0b\xffq\x00\ +\x82\x02_\xff\xd7\x00\x82\x03I\xff\xd7\x00\x82\x03K\xff\ +\xd7\x00\x82\x03M\xff\xd7\x00\x82\x03O\xff\xd7\x00\x82\x03\ +Q\xff\xd7\x00\x82\x03S\xff\xd7\x00\x82\x03U\xff\xd7\x00\ +\x82\x03W\xff\xd7\x00\x82\x03Y\xff\xd7\x00\x82\x03[\xff\ +\xd7\x00\x82\x03]\xff\xd7\x00\x82\x03_\xff\xd7\x00\x82\x03\ +o\xff\x85\x00\x82\x03q\xff\x85\x00\x82\x03s\xff\x85\x00\ +\x82\x03\x8f\xffq\x00\x83\x00\x05\xffq\x00\x83\x00\x0a\xff\ +q\x00\x83\x00&\xff\xd7\x00\x83\x00*\xff\xd7\x00\x83\x00\ +-\x01\x0a\x00\x83\x002\xff\xd7\x00\x83\x004\xff\xd7\x00\ +\x83\x007\xffq\x00\x83\x009\xff\xae\x00\x83\x00:\xff\ +\xae\x00\x83\x00<\xff\x85\x00\x83\x00\x89\xff\xd7\x00\x83\x00\ +\x94\xff\xd7\x00\x83\x00\x95\xff\xd7\x00\x83\x00\x96\xff\xd7\x00\ +\x83\x00\x97\xff\xd7\x00\x83\x00\x98\xff\xd7\x00\x83\x00\x9a\xff\ +\xd7\x00\x83\x00\x9f\xff\x85\x00\x83\x00\xc8\xff\xd7\x00\x83\x00\ +\xca\xff\xd7\x00\x83\x00\xcc\xff\xd7\x00\x83\x00\xce\xff\xd7\x00\ +\x83\x00\xde\xff\xd7\x00\x83\x00\xe0\xff\xd7\x00\x83\x00\xe2\xff\ +\xd7\x00\x83\x00\xe4\xff\xd7\x00\x83\x01\x0e\xff\xd7\x00\x83\x01\ +\x10\xff\xd7\x00\x83\x01\x12\xff\xd7\x00\x83\x01\x14\xff\xd7\x00\ +\x83\x01$\xffq\x00\x83\x01&\xffq\x00\x83\x016\xff\ +\xae\x00\x83\x018\xff\x85\x00\x83\x01:\xff\x85\x00\x83\x01\ +G\xff\xd7\x00\x83\x01\xfa\xff\xae\x00\x83\x01\xfc\xff\xae\x00\ +\x83\x01\xfe\xff\xae\x00\x83\x02\x00\xff\x85\x00\x83\x02\x07\xff\ +q\x00\x83\x02\x0b\xffq\x00\x83\x02_\xff\xd7\x00\x83\x03\ +I\xff\xd7\x00\x83\x03K\xff\xd7\x00\x83\x03M\xff\xd7\x00\ +\x83\x03O\xff\xd7\x00\x83\x03Q\xff\xd7\x00\x83\x03S\xff\ +\xd7\x00\x83\x03U\xff\xd7\x00\x83\x03W\xff\xd7\x00\x83\x03\ +Y\xff\xd7\x00\x83\x03[\xff\xd7\x00\x83\x03]\xff\xd7\x00\ +\x83\x03_\xff\xd7\x00\x83\x03o\xff\x85\x00\x83\x03q\xff\ +\x85\x00\x83\x03s\xff\x85\x00\x83\x03\x8f\xffq\x00\x84\x00\ +\x05\xffq\x00\x84\x00\x0a\xffq\x00\x84\x00&\xff\xd7\x00\ +\x84\x00*\xff\xd7\x00\x84\x00-\x01\x0a\x00\x84\x002\xff\ +\xd7\x00\x84\x004\xff\xd7\x00\x84\x007\xffq\x00\x84\x00\ +9\xff\xae\x00\x84\x00:\xff\xae\x00\x84\x00<\xff\x85\x00\ +\x84\x00\x89\xff\xd7\x00\x84\x00\x94\xff\xd7\x00\x84\x00\x95\xff\ +\xd7\x00\x84\x00\x96\xff\xd7\x00\x84\x00\x97\xff\xd7\x00\x84\x00\ +\x98\xff\xd7\x00\x84\x00\x9a\xff\xd7\x00\x84\x00\x9f\xff\x85\x00\ +\x84\x00\xc8\xff\xd7\x00\x84\x00\xca\xff\xd7\x00\x84\x00\xcc\xff\ +\xd7\x00\x84\x00\xce\xff\xd7\x00\x84\x00\xde\xff\xd7\x00\x84\x00\ +\xe0\xff\xd7\x00\x84\x00\xe2\xff\xd7\x00\x84\x00\xe4\xff\xd7\x00\ +\x84\x01\x0e\xff\xd7\x00\x84\x01\x10\xff\xd7\x00\x84\x01\x12\xff\ +\xd7\x00\x84\x01\x14\xff\xd7\x00\x84\x01$\xffq\x00\x84\x01\ +&\xffq\x00\x84\x016\xff\xae\x00\x84\x018\xff\x85\x00\ +\x84\x01:\xff\x85\x00\x84\x01G\xff\xd7\x00\x84\x01\xfa\xff\ +\xae\x00\x84\x01\xfc\xff\xae\x00\x84\x01\xfe\xff\xae\x00\x84\x02\ +\x00\xff\x85\x00\x84\x02\x07\xffq\x00\x84\x02\x0b\xffq\x00\ +\x84\x02_\xff\xd7\x00\x84\x03I\xff\xd7\x00\x84\x03K\xff\ +\xd7\x00\x84\x03M\xff\xd7\x00\x84\x03O\xff\xd7\x00\x84\x03\ +Q\xff\xd7\x00\x84\x03S\xff\xd7\x00\x84\x03U\xff\xd7\x00\ +\x84\x03W\xff\xd7\x00\x84\x03Y\xff\xd7\x00\x84\x03[\xff\ +\xd7\x00\x84\x03]\xff\xd7\x00\x84\x03_\xff\xd7\x00\x84\x03\ +o\xff\x85\x00\x84\x03q\xff\x85\x00\x84\x03s\xff\x85\x00\ +\x84\x03\x8f\xffq\x00\x85\x00\x05\xffq\x00\x85\x00\x0a\xff\ +q\x00\x85\x00&\xff\xd7\x00\x85\x00*\xff\xd7\x00\x85\x00\ +-\x01\x0a\x00\x85\x002\xff\xd7\x00\x85\x004\xff\xd7\x00\ +\x85\x007\xffq\x00\x85\x009\xff\xae\x00\x85\x00:\xff\ +\xae\x00\x85\x00<\xff\x85\x00\x85\x00\x89\xff\xd7\x00\x85\x00\ +\x94\xff\xd7\x00\x85\x00\x95\xff\xd7\x00\x85\x00\x96\xff\xd7\x00\ +\x85\x00\x97\xff\xd7\x00\x85\x00\x98\xff\xd7\x00\x85\x00\x9a\xff\ +\xd7\x00\x85\x00\x9f\xff\x85\x00\x85\x00\xc8\xff\xd7\x00\x85\x00\ +\xca\xff\xd7\x00\x85\x00\xcc\xff\xd7\x00\x85\x00\xce\xff\xd7\x00\ +\x85\x00\xde\xff\xd7\x00\x85\x00\xe0\xff\xd7\x00\x85\x00\xe2\xff\ +\xd7\x00\x85\x00\xe4\xff\xd7\x00\x85\x01\x0e\xff\xd7\x00\x85\x01\ +\x10\xff\xd7\x00\x85\x01\x12\xff\xd7\x00\x85\x01\x14\xff\xd7\x00\ +\x85\x01$\xffq\x00\x85\x01&\xffq\x00\x85\x016\xff\ +\xae\x00\x85\x018\xff\x85\x00\x85\x01:\xff\x85\x00\x85\x01\ +G\xff\xd7\x00\x85\x01\xfa\xff\xae\x00\x85\x01\xfc\xff\xae\x00\ +\x85\x01\xfe\xff\xae\x00\x85\x02\x00\xff\x85\x00\x85\x02\x07\xff\ +q\x00\x85\x02\x0b\xffq\x00\x85\x02_\xff\xd7\x00\x85\x03\ +I\xff\xd7\x00\x85\x03K\xff\xd7\x00\x85\x03M\xff\xd7\x00\ +\x85\x03O\xff\xd7\x00\x85\x03Q\xff\xd7\x00\x85\x03S\xff\ +\xd7\x00\x85\x03U\xff\xd7\x00\x85\x03W\xff\xd7\x00\x85\x03\ +Y\xff\xd7\x00\x85\x03[\xff\xd7\x00\x85\x03]\xff\xd7\x00\ +\x85\x03_\xff\xd7\x00\x85\x03o\xff\x85\x00\x85\x03q\xff\ +\x85\x00\x85\x03s\xff\x85\x00\x85\x03\x8f\xffq\x00\x86\x00\ +\x05\xffq\x00\x86\x00\x0a\xffq\x00\x86\x00&\xff\xd7\x00\ +\x86\x00*\xff\xd7\x00\x86\x00-\x01\x0a\x00\x86\x002\xff\ +\xd7\x00\x86\x004\xff\xd7\x00\x86\x007\xffq\x00\x86\x00\ +9\xff\xae\x00\x86\x00:\xff\xae\x00\x86\x00<\xff\x85\x00\ +\x86\x00\x89\xff\xd7\x00\x86\x00\x94\xff\xd7\x00\x86\x00\x95\xff\ +\xd7\x00\x86\x00\x96\xff\xd7\x00\x86\x00\x97\xff\xd7\x00\x86\x00\ +\x98\xff\xd7\x00\x86\x00\x9a\xff\xd7\x00\x86\x00\x9f\xff\x85\x00\ +\x86\x00\xc8\xff\xd7\x00\x86\x00\xca\xff\xd7\x00\x86\x00\xcc\xff\ +\xd7\x00\x86\x00\xce\xff\xd7\x00\x86\x00\xde\xff\xd7\x00\x86\x00\ +\xe0\xff\xd7\x00\x86\x00\xe2\xff\xd7\x00\x86\x00\xe4\xff\xd7\x00\ +\x86\x01\x0e\xff\xd7\x00\x86\x01\x10\xff\xd7\x00\x86\x01\x12\xff\ +\xd7\x00\x86\x01\x14\xff\xd7\x00\x86\x01$\xffq\x00\x86\x01\ +&\xffq\x00\x86\x016\xff\xae\x00\x86\x018\xff\x85\x00\ +\x86\x01:\xff\x85\x00\x86\x01G\xff\xd7\x00\x86\x01\xfa\xff\ +\xae\x00\x86\x01\xfc\xff\xae\x00\x86\x01\xfe\xff\xae\x00\x86\x02\ +\x00\xff\x85\x00\x86\x02\x07\xffq\x00\x86\x02\x0b\xffq\x00\ +\x86\x02_\xff\xd7\x00\x86\x03I\xff\xd7\x00\x86\x03K\xff\ +\xd7\x00\x86\x03M\xff\xd7\x00\x86\x03O\xff\xd7\x00\x86\x03\ +Q\xff\xd7\x00\x86\x03S\xff\xd7\x00\x86\x03U\xff\xd7\x00\ +\x86\x03W\xff\xd7\x00\x86\x03Y\xff\xd7\x00\x86\x03[\xff\ +\xd7\x00\x86\x03]\xff\xd7\x00\x86\x03_\xff\xd7\x00\x86\x03\ +o\xff\x85\x00\x86\x03q\xff\x85\x00\x86\x03s\xff\x85\x00\ +\x86\x03\x8f\xffq\x00\x87\x00\x05\xffq\x00\x87\x00\x0a\xff\ +q\x00\x87\x00&\xff\xd7\x00\x87\x00*\xff\xd7\x00\x87\x00\ +-\x01\x0a\x00\x87\x002\xff\xd7\x00\x87\x004\xff\xd7\x00\ +\x87\x007\xffq\x00\x87\x009\xff\xae\x00\x87\x00:\xff\ +\xae\x00\x87\x00<\xff\x85\x00\x87\x00\x89\xff\xd7\x00\x87\x00\ +\x94\xff\xd7\x00\x87\x00\x95\xff\xd7\x00\x87\x00\x96\xff\xd7\x00\ +\x87\x00\x97\xff\xd7\x00\x87\x00\x98\xff\xd7\x00\x87\x00\x9a\xff\ +\xd7\x00\x87\x00\x9f\xff\x85\x00\x87\x00\xc8\xff\xd7\x00\x87\x00\ +\xca\xff\xd7\x00\x87\x00\xcc\xff\xd7\x00\x87\x00\xce\xff\xd7\x00\ +\x87\x00\xde\xff\xd7\x00\x87\x00\xe0\xff\xd7\x00\x87\x00\xe2\xff\ +\xd7\x00\x87\x00\xe4\xff\xd7\x00\x87\x01\x0e\xff\xd7\x00\x87\x01\ +\x10\xff\xd7\x00\x87\x01\x12\xff\xd7\x00\x87\x01\x14\xff\xd7\x00\ +\x87\x01$\xffq\x00\x87\x01&\xffq\x00\x87\x016\xff\ +\xae\x00\x87\x018\xff\x85\x00\x87\x01:\xff\x85\x00\x87\x01\ +G\xff\xd7\x00\x87\x01\xfa\xff\xae\x00\x87\x01\xfc\xff\xae\x00\ +\x87\x01\xfe\xff\xae\x00\x87\x02\x00\xff\x85\x00\x87\x02\x07\xff\ +q\x00\x87\x02\x0b\xffq\x00\x87\x02_\xff\xd7\x00\x87\x03\ +I\xff\xd7\x00\x87\x03K\xff\xd7\x00\x87\x03M\xff\xd7\x00\ +\x87\x03O\xff\xd7\x00\x87\x03Q\xff\xd7\x00\x87\x03S\xff\ +\xd7\x00\x87\x03U\xff\xd7\x00\x87\x03W\xff\xd7\x00\x87\x03\ +Y\xff\xd7\x00\x87\x03[\xff\xd7\x00\x87\x03]\xff\xd7\x00\ +\x87\x03_\xff\xd7\x00\x87\x03o\xff\x85\x00\x87\x03q\xff\ +\x85\x00\x87\x03s\xff\x85\x00\x87\x03\x8f\xffq\x00\x88\x00\ +-\x00{\x00\x89\x00&\xff\xd7\x00\x89\x00*\xff\xd7\x00\ +\x89\x002\xff\xd7\x00\x89\x004\xff\xd7\x00\x89\x00\x89\xff\ +\xd7\x00\x89\x00\x94\xff\xd7\x00\x89\x00\x95\xff\xd7\x00\x89\x00\ +\x96\xff\xd7\x00\x89\x00\x97\xff\xd7\x00\x89\x00\x98\xff\xd7\x00\ +\x89\x00\x9a\xff\xd7\x00\x89\x00\xc8\xff\xd7\x00\x89\x00\xca\xff\ +\xd7\x00\x89\x00\xcc\xff\xd7\x00\x89\x00\xce\xff\xd7\x00\x89\x00\ +\xde\xff\xd7\x00\x89\x00\xe0\xff\xd7\x00\x89\x00\xe2\xff\xd7\x00\ +\x89\x00\xe4\xff\xd7\x00\x89\x01\x0e\xff\xd7\x00\x89\x01\x10\xff\ +\xd7\x00\x89\x01\x12\xff\xd7\x00\x89\x01\x14\xff\xd7\x00\x89\x01\ +G\xff\xd7\x00\x89\x02_\xff\xd7\x00\x89\x03I\xff\xd7\x00\ +\x89\x03K\xff\xd7\x00\x89\x03M\xff\xd7\x00\x89\x03O\xff\ +\xd7\x00\x89\x03Q\xff\xd7\x00\x89\x03S\xff\xd7\x00\x89\x03\ +U\xff\xd7\x00\x89\x03W\xff\xd7\x00\x89\x03Y\xff\xd7\x00\ +\x89\x03[\xff\xd7\x00\x89\x03]\xff\xd7\x00\x89\x03_\xff\ +\xd7\x00\x8a\x00-\x00{\x00\x8b\x00-\x00{\x00\x8c\x00\ +-\x00{\x00\x8d\x00-\x00{\x00\x92\x00\x0f\xff\xae\x00\ +\x92\x00\x11\xff\xae\x00\x92\x00$\xff\xd7\x00\x92\x007\xff\ +\xc3\x00\x92\x009\xff\xec\x00\x92\x00:\xff\xec\x00\x92\x00\ +;\xff\xd7\x00\x92\x00<\xff\xec\x00\x92\x00=\xff\xec\x00\ +\x92\x00\x82\xff\xd7\x00\x92\x00\x83\xff\xd7\x00\x92\x00\x84\xff\ +\xd7\x00\x92\x00\x85\xff\xd7\x00\x92\x00\x86\xff\xd7\x00\x92\x00\ +\x87\xff\xd7\x00\x92\x00\x9f\xff\xec\x00\x92\x00\xc2\xff\xd7\x00\ +\x92\x00\xc4\xff\xd7\x00\x92\x00\xc6\xff\xd7\x00\x92\x01$\xff\ +\xc3\x00\x92\x01&\xff\xc3\x00\x92\x016\xff\xec\x00\x92\x01\ +8\xff\xec\x00\x92\x01:\xff\xec\x00\x92\x01;\xff\xec\x00\ +\x92\x01=\xff\xec\x00\x92\x01?\xff\xec\x00\x92\x01C\xff\ +\xd7\x00\x92\x01\xa0\xff\xec\x00\x92\x01\xfa\xff\xec\x00\x92\x01\ +\xfc\xff\xec\x00\x92\x01\xfe\xff\xec\x00\x92\x02\x00\xff\xec\x00\ +\x92\x02\x08\xff\xae\x00\x92\x02\x0c\xff\xae\x00\x92\x02X\xff\ +\xd7\x00\x92\x03\x1d\xff\xd7\x00\x92\x03\x1f\xff\xd7\x00\x92\x03\ +!\xff\xd7\x00\x92\x03#\xff\xd7\x00\x92\x03%\xff\xd7\x00\ +\x92\x03'\xff\xd7\x00\x92\x03)\xff\xd7\x00\x92\x03+\xff\ +\xd7\x00\x92\x03-\xff\xd7\x00\x92\x03/\xff\xd7\x00\x92\x03\ +1\xff\xd7\x00\x92\x033\xff\xd7\x00\x92\x03o\xff\xec\x00\ +\x92\x03q\xff\xec\x00\x92\x03s\xff\xec\x00\x92\x03\x8f\xff\ +\xc3\x00\x94\x00\x0f\xff\xae\x00\x94\x00\x11\xff\xae\x00\x94\x00\ +$\xff\xd7\x00\x94\x007\xff\xc3\x00\x94\x009\xff\xec\x00\ +\x94\x00:\xff\xec\x00\x94\x00;\xff\xd7\x00\x94\x00<\xff\ +\xec\x00\x94\x00=\xff\xec\x00\x94\x00\x82\xff\xd7\x00\x94\x00\ +\x83\xff\xd7\x00\x94\x00\x84\xff\xd7\x00\x94\x00\x85\xff\xd7\x00\ +\x94\x00\x86\xff\xd7\x00\x94\x00\x87\xff\xd7\x00\x94\x00\x9f\xff\ +\xec\x00\x94\x00\xc2\xff\xd7\x00\x94\x00\xc4\xff\xd7\x00\x94\x00\ +\xc6\xff\xd7\x00\x94\x01$\xff\xc3\x00\x94\x01&\xff\xc3\x00\ +\x94\x016\xff\xec\x00\x94\x018\xff\xec\x00\x94\x01:\xff\ +\xec\x00\x94\x01;\xff\xec\x00\x94\x01=\xff\xec\x00\x94\x01\ +?\xff\xec\x00\x94\x01C\xff\xd7\x00\x94\x01\xa0\xff\xec\x00\ +\x94\x01\xfa\xff\xec\x00\x94\x01\xfc\xff\xec\x00\x94\x01\xfe\xff\ +\xec\x00\x94\x02\x00\xff\xec\x00\x94\x02\x08\xff\xae\x00\x94\x02\ +\x0c\xff\xae\x00\x94\x02X\xff\xd7\x00\x94\x03\x1d\xff\xd7\x00\ +\x94\x03\x1f\xff\xd7\x00\x94\x03!\xff\xd7\x00\x94\x03#\xff\ +\xd7\x00\x94\x03%\xff\xd7\x00\x94\x03'\xff\xd7\x00\x94\x03\ +)\xff\xd7\x00\x94\x03+\xff\xd7\x00\x94\x03-\xff\xd7\x00\ +\x94\x03/\xff\xd7\x00\x94\x031\xff\xd7\x00\x94\x033\xff\ +\xd7\x00\x94\x03o\xff\xec\x00\x94\x03q\xff\xec\x00\x94\x03\ +s\xff\xec\x00\x94\x03\x8f\xff\xc3\x00\x95\x00\x0f\xff\xae\x00\ +\x95\x00\x11\xff\xae\x00\x95\x00$\xff\xd7\x00\x95\x007\xff\ +\xc3\x00\x95\x009\xff\xec\x00\x95\x00:\xff\xec\x00\x95\x00\ +;\xff\xd7\x00\x95\x00<\xff\xec\x00\x95\x00=\xff\xec\x00\ +\x95\x00\x82\xff\xd7\x00\x95\x00\x83\xff\xd7\x00\x95\x00\x84\xff\ +\xd7\x00\x95\x00\x85\xff\xd7\x00\x95\x00\x86\xff\xd7\x00\x95\x00\ +\x87\xff\xd7\x00\x95\x00\x9f\xff\xec\x00\x95\x00\xc2\xff\xd7\x00\ +\x95\x00\xc4\xff\xd7\x00\x95\x00\xc6\xff\xd7\x00\x95\x01$\xff\ +\xc3\x00\x95\x01&\xff\xc3\x00\x95\x016\xff\xec\x00\x95\x01\ +8\xff\xec\x00\x95\x01:\xff\xec\x00\x95\x01;\xff\xec\x00\ +\x95\x01=\xff\xec\x00\x95\x01?\xff\xec\x00\x95\x01C\xff\ +\xd7\x00\x95\x01\xa0\xff\xec\x00\x95\x01\xfa\xff\xec\x00\x95\x01\ +\xfc\xff\xec\x00\x95\x01\xfe\xff\xec\x00\x95\x02\x00\xff\xec\x00\ +\x95\x02\x08\xff\xae\x00\x95\x02\x0c\xff\xae\x00\x95\x02X\xff\ +\xd7\x00\x95\x03\x1d\xff\xd7\x00\x95\x03\x1f\xff\xd7\x00\x95\x03\ +!\xff\xd7\x00\x95\x03#\xff\xd7\x00\x95\x03%\xff\xd7\x00\ +\x95\x03'\xff\xd7\x00\x95\x03)\xff\xd7\x00\x95\x03+\xff\ +\xd7\x00\x95\x03-\xff\xd7\x00\x95\x03/\xff\xd7\x00\x95\x03\ +1\xff\xd7\x00\x95\x033\xff\xd7\x00\x95\x03o\xff\xec\x00\ +\x95\x03q\xff\xec\x00\x95\x03s\xff\xec\x00\x95\x03\x8f\xff\ +\xc3\x00\x96\x00\x0f\xff\xae\x00\x96\x00\x11\xff\xae\x00\x96\x00\ +$\xff\xd7\x00\x96\x007\xff\xc3\x00\x96\x009\xff\xec\x00\ +\x96\x00:\xff\xec\x00\x96\x00;\xff\xd7\x00\x96\x00<\xff\ +\xec\x00\x96\x00=\xff\xec\x00\x96\x00\x82\xff\xd7\x00\x96\x00\ +\x83\xff\xd7\x00\x96\x00\x84\xff\xd7\x00\x96\x00\x85\xff\xd7\x00\ +\x96\x00\x86\xff\xd7\x00\x96\x00\x87\xff\xd7\x00\x96\x00\x9f\xff\ +\xec\x00\x96\x00\xc2\xff\xd7\x00\x96\x00\xc4\xff\xd7\x00\x96\x00\ +\xc6\xff\xd7\x00\x96\x01$\xff\xc3\x00\x96\x01&\xff\xc3\x00\ +\x96\x016\xff\xec\x00\x96\x018\xff\xec\x00\x96\x01:\xff\ +\xec\x00\x96\x01;\xff\xec\x00\x96\x01=\xff\xec\x00\x96\x01\ +?\xff\xec\x00\x96\x01C\xff\xd7\x00\x96\x01\xa0\xff\xec\x00\ +\x96\x01\xfa\xff\xec\x00\x96\x01\xfc\xff\xec\x00\x96\x01\xfe\xff\ +\xec\x00\x96\x02\x00\xff\xec\x00\x96\x02\x08\xff\xae\x00\x96\x02\ +\x0c\xff\xae\x00\x96\x02X\xff\xd7\x00\x96\x03\x1d\xff\xd7\x00\ +\x96\x03\x1f\xff\xd7\x00\x96\x03!\xff\xd7\x00\x96\x03#\xff\ +\xd7\x00\x96\x03%\xff\xd7\x00\x96\x03'\xff\xd7\x00\x96\x03\ +)\xff\xd7\x00\x96\x03+\xff\xd7\x00\x96\x03-\xff\xd7\x00\ +\x96\x03/\xff\xd7\x00\x96\x031\xff\xd7\x00\x96\x033\xff\ +\xd7\x00\x96\x03o\xff\xec\x00\x96\x03q\xff\xec\x00\x96\x03\ +s\xff\xec\x00\x96\x03\x8f\xff\xc3\x00\x97\x00\x0f\xff\xae\x00\ +\x97\x00\x11\xff\xae\x00\x97\x00$\xff\xd7\x00\x97\x007\xff\ +\xc3\x00\x97\x009\xff\xec\x00\x97\x00:\xff\xec\x00\x97\x00\ +;\xff\xd7\x00\x97\x00<\xff\xec\x00\x97\x00=\xff\xec\x00\ +\x97\x00\x82\xff\xd7\x00\x97\x00\x83\xff\xd7\x00\x97\x00\x84\xff\ +\xd7\x00\x97\x00\x85\xff\xd7\x00\x97\x00\x86\xff\xd7\x00\x97\x00\ +\x87\xff\xd7\x00\x97\x00\x9f\xff\xec\x00\x97\x00\xc2\xff\xd7\x00\ +\x97\x00\xc4\xff\xd7\x00\x97\x00\xc6\xff\xd7\x00\x97\x01$\xff\ +\xc3\x00\x97\x01&\xff\xc3\x00\x97\x016\xff\xec\x00\x97\x01\ +8\xff\xec\x00\x97\x01:\xff\xec\x00\x97\x01;\xff\xec\x00\ +\x97\x01=\xff\xec\x00\x97\x01?\xff\xec\x00\x97\x01C\xff\ +\xd7\x00\x97\x01\xa0\xff\xec\x00\x97\x01\xfa\xff\xec\x00\x97\x01\ +\xfc\xff\xec\x00\x97\x01\xfe\xff\xec\x00\x97\x02\x00\xff\xec\x00\ +\x97\x02\x08\xff\xae\x00\x97\x02\x0c\xff\xae\x00\x97\x02X\xff\ +\xd7\x00\x97\x03\x1d\xff\xd7\x00\x97\x03\x1f\xff\xd7\x00\x97\x03\ +!\xff\xd7\x00\x97\x03#\xff\xd7\x00\x97\x03%\xff\xd7\x00\ +\x97\x03'\xff\xd7\x00\x97\x03)\xff\xd7\x00\x97\x03+\xff\ +\xd7\x00\x97\x03-\xff\xd7\x00\x97\x03/\xff\xd7\x00\x97\x03\ +1\xff\xd7\x00\x97\x033\xff\xd7\x00\x97\x03o\xff\xec\x00\ +\x97\x03q\xff\xec\x00\x97\x03s\xff\xec\x00\x97\x03\x8f\xff\ +\xc3\x00\x98\x00\x0f\xff\xae\x00\x98\x00\x11\xff\xae\x00\x98\x00\ +$\xff\xd7\x00\x98\x007\xff\xc3\x00\x98\x009\xff\xec\x00\ +\x98\x00:\xff\xec\x00\x98\x00;\xff\xd7\x00\x98\x00<\xff\ +\xec\x00\x98\x00=\xff\xec\x00\x98\x00\x82\xff\xd7\x00\x98\x00\ +\x83\xff\xd7\x00\x98\x00\x84\xff\xd7\x00\x98\x00\x85\xff\xd7\x00\ +\x98\x00\x86\xff\xd7\x00\x98\x00\x87\xff\xd7\x00\x98\x00\x9f\xff\ +\xec\x00\x98\x00\xc2\xff\xd7\x00\x98\x00\xc4\xff\xd7\x00\x98\x00\ +\xc6\xff\xd7\x00\x98\x01$\xff\xc3\x00\x98\x01&\xff\xc3\x00\ +\x98\x016\xff\xec\x00\x98\x018\xff\xec\x00\x98\x01:\xff\ +\xec\x00\x98\x01;\xff\xec\x00\x98\x01=\xff\xec\x00\x98\x01\ +?\xff\xec\x00\x98\x01C\xff\xd7\x00\x98\x01\xa0\xff\xec\x00\ +\x98\x01\xfa\xff\xec\x00\x98\x01\xfc\xff\xec\x00\x98\x01\xfe\xff\ +\xec\x00\x98\x02\x00\xff\xec\x00\x98\x02\x08\xff\xae\x00\x98\x02\ +\x0c\xff\xae\x00\x98\x02X\xff\xd7\x00\x98\x03\x1d\xff\xd7\x00\ +\x98\x03\x1f\xff\xd7\x00\x98\x03!\xff\xd7\x00\x98\x03#\xff\ +\xd7\x00\x98\x03%\xff\xd7\x00\x98\x03'\xff\xd7\x00\x98\x03\ +)\xff\xd7\x00\x98\x03+\xff\xd7\x00\x98\x03-\xff\xd7\x00\ +\x98\x03/\xff\xd7\x00\x98\x031\xff\xd7\x00\x98\x033\xff\ +\xd7\x00\x98\x03o\xff\xec\x00\x98\x03q\xff\xec\x00\x98\x03\ +s\xff\xec\x00\x98\x03\x8f\xff\xc3\x00\x9a\x00\x0f\xff\xae\x00\ +\x9a\x00\x11\xff\xae\x00\x9a\x00$\xff\xd7\x00\x9a\x007\xff\ +\xc3\x00\x9a\x009\xff\xec\x00\x9a\x00:\xff\xec\x00\x9a\x00\ +;\xff\xd7\x00\x9a\x00<\xff\xec\x00\x9a\x00=\xff\xec\x00\ +\x9a\x00\x82\xff\xd7\x00\x9a\x00\x83\xff\xd7\x00\x9a\x00\x84\xff\ +\xd7\x00\x9a\x00\x85\xff\xd7\x00\x9a\x00\x86\xff\xd7\x00\x9a\x00\ +\x87\xff\xd7\x00\x9a\x00\x9f\xff\xec\x00\x9a\x00\xc2\xff\xd7\x00\ +\x9a\x00\xc4\xff\xd7\x00\x9a\x00\xc6\xff\xd7\x00\x9a\x01$\xff\ +\xc3\x00\x9a\x01&\xff\xc3\x00\x9a\x016\xff\xec\x00\x9a\x01\ +8\xff\xec\x00\x9a\x01:\xff\xec\x00\x9a\x01;\xff\xec\x00\ +\x9a\x01=\xff\xec\x00\x9a\x01?\xff\xec\x00\x9a\x01C\xff\ +\xd7\x00\x9a\x01\xa0\xff\xec\x00\x9a\x01\xfa\xff\xec\x00\x9a\x01\ +\xfc\xff\xec\x00\x9a\x01\xfe\xff\xec\x00\x9a\x02\x00\xff\xec\x00\ +\x9a\x02\x08\xff\xae\x00\x9a\x02\x0c\xff\xae\x00\x9a\x02X\xff\ +\xd7\x00\x9a\x03\x1d\xff\xd7\x00\x9a\x03\x1f\xff\xd7\x00\x9a\x03\ +!\xff\xd7\x00\x9a\x03#\xff\xd7\x00\x9a\x03%\xff\xd7\x00\ +\x9a\x03'\xff\xd7\x00\x9a\x03)\xff\xd7\x00\x9a\x03+\xff\ +\xd7\x00\x9a\x03-\xff\xd7\x00\x9a\x03/\xff\xd7\x00\x9a\x03\ +1\xff\xd7\x00\x9a\x033\xff\xd7\x00\x9a\x03o\xff\xec\x00\ +\x9a\x03q\xff\xec\x00\x9a\x03s\xff\xec\x00\x9a\x03\x8f\xff\ +\xc3\x00\x9b\x00\x0f\xff\xd7\x00\x9b\x00\x11\xff\xd7\x00\x9b\x00\ +$\xff\xec\x00\x9b\x00\x82\xff\xec\x00\x9b\x00\x83\xff\xec\x00\ +\x9b\x00\x84\xff\xec\x00\x9b\x00\x85\xff\xec\x00\x9b\x00\x86\xff\ +\xec\x00\x9b\x00\x87\xff\xec\x00\x9b\x00\xc2\xff\xec\x00\x9b\x00\ +\xc4\xff\xec\x00\x9b\x00\xc6\xff\xec\x00\x9b\x01C\xff\xec\x00\ +\x9b\x02\x08\xff\xd7\x00\x9b\x02\x0c\xff\xd7\x00\x9b\x02X\xff\ +\xec\x00\x9b\x03\x1d\xff\xec\x00\x9b\x03\x1f\xff\xec\x00\x9b\x03\ +!\xff\xec\x00\x9b\x03#\xff\xec\x00\x9b\x03%\xff\xec\x00\ +\x9b\x03'\xff\xec\x00\x9b\x03)\xff\xec\x00\x9b\x03+\xff\ +\xec\x00\x9b\x03-\xff\xec\x00\x9b\x03/\xff\xec\x00\x9b\x03\ +1\xff\xec\x00\x9b\x033\xff\xec\x00\x9c\x00\x0f\xff\xd7\x00\ +\x9c\x00\x11\xff\xd7\x00\x9c\x00$\xff\xec\x00\x9c\x00\x82\xff\ +\xec\x00\x9c\x00\x83\xff\xec\x00\x9c\x00\x84\xff\xec\x00\x9c\x00\ +\x85\xff\xec\x00\x9c\x00\x86\xff\xec\x00\x9c\x00\x87\xff\xec\x00\ +\x9c\x00\xc2\xff\xec\x00\x9c\x00\xc4\xff\xec\x00\x9c\x00\xc6\xff\ +\xec\x00\x9c\x01C\xff\xec\x00\x9c\x02\x08\xff\xd7\x00\x9c\x02\ +\x0c\xff\xd7\x00\x9c\x02X\xff\xec\x00\x9c\x03\x1d\xff\xec\x00\ +\x9c\x03\x1f\xff\xec\x00\x9c\x03!\xff\xec\x00\x9c\x03#\xff\ +\xec\x00\x9c\x03%\xff\xec\x00\x9c\x03'\xff\xec\x00\x9c\x03\ +)\xff\xec\x00\x9c\x03+\xff\xec\x00\x9c\x03-\xff\xec\x00\ +\x9c\x03/\xff\xec\x00\x9c\x031\xff\xec\x00\x9c\x033\xff\ +\xec\x00\x9d\x00\x0f\xff\xd7\x00\x9d\x00\x11\xff\xd7\x00\x9d\x00\ +$\xff\xec\x00\x9d\x00\x82\xff\xec\x00\x9d\x00\x83\xff\xec\x00\ +\x9d\x00\x84\xff\xec\x00\x9d\x00\x85\xff\xec\x00\x9d\x00\x86\xff\ +\xec\x00\x9d\x00\x87\xff\xec\x00\x9d\x00\xc2\xff\xec\x00\x9d\x00\ +\xc4\xff\xec\x00\x9d\x00\xc6\xff\xec\x00\x9d\x01C\xff\xec\x00\ +\x9d\x02\x08\xff\xd7\x00\x9d\x02\x0c\xff\xd7\x00\x9d\x02X\xff\ +\xec\x00\x9d\x03\x1d\xff\xec\x00\x9d\x03\x1f\xff\xec\x00\x9d\x03\ +!\xff\xec\x00\x9d\x03#\xff\xec\x00\x9d\x03%\xff\xec\x00\ +\x9d\x03'\xff\xec\x00\x9d\x03)\xff\xec\x00\x9d\x03+\xff\ +\xec\x00\x9d\x03-\xff\xec\x00\x9d\x03/\xff\xec\x00\x9d\x03\ +1\xff\xec\x00\x9d\x033\xff\xec\x00\x9e\x00\x0f\xff\xd7\x00\ +\x9e\x00\x11\xff\xd7\x00\x9e\x00$\xff\xec\x00\x9e\x00\x82\xff\ +\xec\x00\x9e\x00\x83\xff\xec\x00\x9e\x00\x84\xff\xec\x00\x9e\x00\ +\x85\xff\xec\x00\x9e\x00\x86\xff\xec\x00\x9e\x00\x87\xff\xec\x00\ +\x9e\x00\xc2\xff\xec\x00\x9e\x00\xc4\xff\xec\x00\x9e\x00\xc6\xff\ +\xec\x00\x9e\x01C\xff\xec\x00\x9e\x02\x08\xff\xd7\x00\x9e\x02\ +\x0c\xff\xd7\x00\x9e\x02X\xff\xec\x00\x9e\x03\x1d\xff\xec\x00\ +\x9e\x03\x1f\xff\xec\x00\x9e\x03!\xff\xec\x00\x9e\x03#\xff\ +\xec\x00\x9e\x03%\xff\xec\x00\x9e\x03'\xff\xec\x00\x9e\x03\ +)\xff\xec\x00\x9e\x03+\xff\xec\x00\x9e\x03-\xff\xec\x00\ +\x9e\x03/\xff\xec\x00\x9e\x031\xff\xec\x00\x9e\x033\xff\ +\xec\x00\x9f\x00\x0f\xff\x85\x00\x9f\x00\x11\xff\x85\x00\x9f\x00\ +\x22\x00)\x00\x9f\x00$\xff\x85\x00\x9f\x00&\xff\xd7\x00\ +\x9f\x00*\xff\xd7\x00\x9f\x002\xff\xd7\x00\x9f\x004\xff\ +\xd7\x00\x9f\x00D\xff\x9a\x00\x9f\x00F\xff\x9a\x00\x9f\x00\ +G\xff\x9a\x00\x9f\x00H\xff\x9a\x00\x9f\x00J\xff\xd7\x00\ +\x9f\x00P\xff\xc3\x00\x9f\x00Q\xff\xc3\x00\x9f\x00R\xff\ +\x9a\x00\x9f\x00S\xff\xc3\x00\x9f\x00T\xff\x9a\x00\x9f\x00\ +U\xff\xc3\x00\x9f\x00V\xff\xae\x00\x9f\x00X\xff\xc3\x00\ +\x9f\x00]\xff\xd7\x00\x9f\x00\x82\xff\x85\x00\x9f\x00\x83\xff\ +\x85\x00\x9f\x00\x84\xff\x85\x00\x9f\x00\x85\xff\x85\x00\x9f\x00\ +\x86\xff\x85\x00\x9f\x00\x87\xff\x85\x00\x9f\x00\x89\xff\xd7\x00\ +\x9f\x00\x94\xff\xd7\x00\x9f\x00\x95\xff\xd7\x00\x9f\x00\x96\xff\ +\xd7\x00\x9f\x00\x97\xff\xd7\x00\x9f\x00\x98\xff\xd7\x00\x9f\x00\ +\x9a\xff\xd7\x00\x9f\x00\xa2\xff\x9a\x00\x9f\x00\xa3\xff\x9a\x00\ +\x9f\x00\xa4\xff\x9a\x00\x9f\x00\xa5\xff\x9a\x00\x9f\x00\xa6\xff\ +\x9a\x00\x9f\x00\xa7\xff\x9a\x00\x9f\x00\xa8\xff\x9a\x00\x9f\x00\ +\xa9\xff\x9a\x00\x9f\x00\xaa\xff\x9a\x00\x9f\x00\xab\xff\x9a\x00\ +\x9f\x00\xac\xff\x9a\x00\x9f\x00\xad\xff\x9a\x00\x9f\x00\xb4\xff\ +\x9a\x00\x9f\x00\xb5\xff\x9a\x00\x9f\x00\xb6\xff\x9a\x00\x9f\x00\ +\xb7\xff\x9a\x00\x9f\x00\xb8\xff\x9a\x00\x9f\x00\xba\xff\x9a\x00\ +\x9f\x00\xbb\xff\xc3\x00\x9f\x00\xbc\xff\xc3\x00\x9f\x00\xbd\xff\ +\xc3\x00\x9f\x00\xbe\xff\xc3\x00\x9f\x00\xc2\xff\x85\x00\x9f\x00\ +\xc3\xff\x9a\x00\x9f\x00\xc4\xff\x85\x00\x9f\x00\xc5\xff\x9a\x00\ +\x9f\x00\xc6\xff\x85\x00\x9f\x00\xc7\xff\x9a\x00\x9f\x00\xc8\xff\ +\xd7\x00\x9f\x00\xc9\xff\x9a\x00\x9f\x00\xca\xff\xd7\x00\x9f\x00\ +\xcb\xff\x9a\x00\x9f\x00\xcc\xff\xd7\x00\x9f\x00\xcd\xff\x9a\x00\ +\x9f\x00\xce\xff\xd7\x00\x9f\x00\xcf\xff\x9a\x00\x9f\x00\xd1\xff\ +\x9a\x00\x9f\x00\xd3\xff\x9a\x00\x9f\x00\xd5\xff\x9a\x00\x9f\x00\ +\xd7\xff\x9a\x00\x9f\x00\xd9\xff\x9a\x00\x9f\x00\xdb\xff\x9a\x00\ +\x9f\x00\xdd\xff\x9a\x00\x9f\x00\xde\xff\xd7\x00\x9f\x00\xdf\xff\ +\xd7\x00\x9f\x00\xe0\xff\xd7\x00\x9f\x00\xe1\xff\xd7\x00\x9f\x00\ +\xe2\xff\xd7\x00\x9f\x00\xe3\xff\xd7\x00\x9f\x00\xe4\xff\xd7\x00\ +\x9f\x00\xe5\xff\xd7\x00\x9f\x00\xfa\xff\xc3\x00\x9f\x01\x06\xff\ +\xc3\x00\x9f\x01\x08\xff\xc3\x00\x9f\x01\x0d\xff\xc3\x00\x9f\x01\ +\x0e\xff\xd7\x00\x9f\x01\x0f\xff\x9a\x00\x9f\x01\x10\xff\xd7\x00\ +\x9f\x01\x11\xff\x9a\x00\x9f\x01\x12\xff\xd7\x00\x9f\x01\x13\xff\ +\x9a\x00\x9f\x01\x14\xff\xd7\x00\x9f\x01\x15\xff\x9a\x00\x9f\x01\ +\x17\xff\xc3\x00\x9f\x01\x19\xff\xc3\x00\x9f\x01\x1d\xff\xae\x00\ +\x9f\x01!\xff\xae\x00\x9f\x01+\xff\xc3\x00\x9f\x01-\xff\ +\xc3\x00\x9f\x01/\xff\xc3\x00\x9f\x011\xff\xc3\x00\x9f\x01\ +3\xff\xc3\x00\x9f\x015\xff\xc3\x00\x9f\x01<\xff\xd7\x00\ +\x9f\x01>\xff\xd7\x00\x9f\x01@\xff\xd7\x00\x9f\x01C\xff\ +\x85\x00\x9f\x01D\xff\x9a\x00\x9f\x01F\xff\x9a\x00\x9f\x01\ +G\xff\xd7\x00\x9f\x01H\xff\x9a\x00\x9f\x01J\xff\xae\x00\ +\x9f\x02\x08\xff\x85\x00\x9f\x02\x0c\xff\x85\x00\x9f\x02W\xff\ +\xc3\x00\x9f\x02X\xff\x85\x00\x9f\x02Y\xff\x9a\x00\x9f\x02\ +_\xff\xd7\x00\x9f\x02`\xff\x9a\x00\x9f\x02b\xff\xc3\x00\ +\x9f\x03\x1d\xff\x85\x00\x9f\x03\x1e\xff\x9a\x00\x9f\x03\x1f\xff\ +\x85\x00\x9f\x03 \xff\x9a\x00\x9f\x03!\xff\x85\x00\x9f\x03\ +\x22\xff\x9a\x00\x9f\x03#\xff\x85\x00\x9f\x03%\xff\x85\x00\ +\x9f\x03&\xff\x9a\x00\x9f\x03'\xff\x85\x00\x9f\x03(\xff\ +\x9a\x00\x9f\x03)\xff\x85\x00\x9f\x03*\xff\x9a\x00\x9f\x03\ ++\xff\x85\x00\x9f\x03,\xff\x9a\x00\x9f\x03-\xff\x85\x00\ +\x9f\x03.\xff\x9a\x00\x9f\x03/\xff\x85\x00\x9f\x030\xff\ +\x9a\x00\x9f\x031\xff\x85\x00\x9f\x032\xff\x9a\x00\x9f\x03\ +3\xff\x85\x00\x9f\x034\xff\x9a\x00\x9f\x036\xff\x9a\x00\ +\x9f\x038\xff\x9a\x00\x9f\x03:\xff\x9a\x00\x9f\x03<\xff\ +\x9a\x00\x9f\x03@\xff\x9a\x00\x9f\x03B\xff\x9a\x00\x9f\x03\ +D\xff\x9a\x00\x9f\x03I\xff\xd7\x00\x9f\x03J\xff\x9a\x00\ +\x9f\x03K\xff\xd7\x00\x9f\x03L\xff\x9a\x00\x9f\x03M\xff\ +\xd7\x00\x9f\x03N\xff\x9a\x00\x9f\x03O\xff\xd7\x00\x9f\x03\ +Q\xff\xd7\x00\x9f\x03R\xff\x9a\x00\x9f\x03S\xff\xd7\x00\ +\x9f\x03T\xff\x9a\x00\x9f\x03U\xff\xd7\x00\x9f\x03V\xff\ +\x9a\x00\x9f\x03W\xff\xd7\x00\x9f\x03X\xff\x9a\x00\x9f\x03\ +Y\xff\xd7\x00\x9f\x03Z\xff\x9a\x00\x9f\x03[\xff\xd7\x00\ +\x9f\x03\x5c\xff\x9a\x00\x9f\x03]\xff\xd7\x00\x9f\x03^\xff\ +\x9a\x00\x9f\x03_\xff\xd7\x00\x9f\x03`\xff\x9a\x00\x9f\x03\ +b\xff\xc3\x00\x9f\x03d\xff\xc3\x00\x9f\x03f\xff\xc3\x00\ +\x9f\x03h\xff\xc3\x00\x9f\x03j\xff\xc3\x00\x9f\x03l\xff\ +\xc3\x00\x9f\x03n\xff\xc3\x00\xa0\x00\x0f\xfe\xf6\x00\xa0\x00\ +\x11\xfe\xf6\x00\xa0\x00$\xff\x9a\x00\xa0\x00;\xff\xd7\x00\ +\xa0\x00=\xff\xec\x00\xa0\x00\x82\xff\x9a\x00\xa0\x00\x83\xff\ +\x9a\x00\xa0\x00\x84\xff\x9a\x00\xa0\x00\x85\xff\x9a\x00\xa0\x00\ +\x86\xff\x9a\x00\xa0\x00\x87\xff\x9a\x00\xa0\x00\xc2\xff\x9a\x00\ +\xa0\x00\xc4\xff\x9a\x00\xa0\x00\xc6\xff\x9a\x00\xa0\x01;\xff\ +\xec\x00\xa0\x01=\xff\xec\x00\xa0\x01?\xff\xec\x00\xa0\x01\ +C\xff\x9a\x00\xa0\x02\x08\xfe\xf6\x00\xa0\x02\x0c\xfe\xf6\x00\ +\xa0\x02X\xff\x9a\x00\xa0\x03\x1d\xff\x9a\x00\xa0\x03\x1f\xff\ +\x9a\x00\xa0\x03!\xff\x9a\x00\xa0\x03#\xff\x9a\x00\xa0\x03\ +%\xff\x9a\x00\xa0\x03'\xff\x9a\x00\xa0\x03)\xff\x9a\x00\ +\xa0\x03+\xff\x9a\x00\xa0\x03-\xff\x9a\x00\xa0\x03/\xff\ +\x9a\x00\xa0\x031\xff\x9a\x00\xa0\x033\xff\x9a\x00\xa2\x00\ +\x05\xff\xec\x00\xa2\x00\x0a\xff\xec\x00\xa2\x02\x07\xff\xec\x00\ +\xa2\x02\x0b\xff\xec\x00\xa3\x00\x05\xff\xec\x00\xa3\x00\x0a\xff\ +\xec\x00\xa3\x02\x07\xff\xec\x00\xa3\x02\x0b\xff\xec\x00\xa4\x00\ +\x05\xff\xec\x00\xa4\x00\x0a\xff\xec\x00\xa4\x02\x07\xff\xec\x00\ +\xa4\x02\x0b\xff\xec\x00\xa5\x00\x05\xff\xec\x00\xa5\x00\x0a\xff\ +\xec\x00\xa5\x02\x07\xff\xec\x00\xa5\x02\x0b\xff\xec\x00\xa6\x00\ +\x05\xff\xec\x00\xa6\x00\x0a\xff\xec\x00\xa6\x02\x07\xff\xec\x00\ +\xa6\x02\x0b\xff\xec\x00\xa7\x00\x05\xff\xec\x00\xa7\x00\x0a\xff\ +\xec\x00\xa7\x02\x07\xff\xec\x00\xa7\x02\x0b\xff\xec\x00\xaa\x00\ +\x05\xff\xec\x00\xaa\x00\x0a\xff\xec\x00\xaa\x00Y\xff\xd7\x00\ +\xaa\x00Z\xff\xd7\x00\xaa\x00[\xff\xd7\x00\xaa\x00\x5c\xff\ +\xd7\x00\xaa\x00]\xff\xec\x00\xaa\x00\xbf\xff\xd7\x00\xaa\x01\ +7\xff\xd7\x00\xaa\x01<\xff\xec\x00\xaa\x01>\xff\xec\x00\ +\xaa\x01@\xff\xec\x00\xaa\x01\xfb\xff\xd7\x00\xaa\x01\xfd\xff\ +\xd7\x00\xaa\x02\x07\xff\xec\x00\xaa\x02\x0b\xff\xec\x00\xaa\x03\ +p\xff\xd7\x00\xab\x00\x05\xff\xec\x00\xab\x00\x0a\xff\xec\x00\ +\xab\x00Y\xff\xd7\x00\xab\x00Z\xff\xd7\x00\xab\x00[\xff\ +\xd7\x00\xab\x00\x5c\xff\xd7\x00\xab\x00]\xff\xec\x00\xab\x00\ +\xbf\xff\xd7\x00\xab\x017\xff\xd7\x00\xab\x01<\xff\xec\x00\ +\xab\x01>\xff\xec\x00\xab\x01@\xff\xec\x00\xab\x01\xfb\xff\ +\xd7\x00\xab\x01\xfd\xff\xd7\x00\xab\x02\x07\xff\xec\x00\xab\x02\ +\x0b\xff\xec\x00\xab\x03p\xff\xd7\x00\xac\x00\x05\xff\xec\x00\ +\xac\x00\x0a\xff\xec\x00\xac\x00Y\xff\xd7\x00\xac\x00Z\xff\ +\xd7\x00\xac\x00[\xff\xd7\x00\xac\x00\x5c\xff\xd7\x00\xac\x00\ +]\xff\xec\x00\xac\x00\xbf\xff\xd7\x00\xac\x017\xff\xd7\x00\ +\xac\x01<\xff\xec\x00\xac\x01>\xff\xec\x00\xac\x01@\xff\ +\xec\x00\xac\x01\xfb\xff\xd7\x00\xac\x01\xfd\xff\xd7\x00\xac\x02\ +\x07\xff\xec\x00\xac\x02\x0b\xff\xec\x00\xac\x03p\xff\xd7\x00\ +\xad\x00\x05\xff\xec\x00\xad\x00\x0a\xff\xec\x00\xad\x00Y\xff\ +\xd7\x00\xad\x00Z\xff\xd7\x00\xad\x00[\xff\xd7\x00\xad\x00\ +\x5c\xff\xd7\x00\xad\x00]\xff\xec\x00\xad\x00\xbf\xff\xd7\x00\ +\xad\x017\xff\xd7\x00\xad\x01<\xff\xec\x00\xad\x01>\xff\ +\xec\x00\xad\x01@\xff\xec\x00\xad\x01\xfb\xff\xd7\x00\xad\x01\ +\xfd\xff\xd7\x00\xad\x02\x07\xff\xec\x00\xad\x02\x0b\xff\xec\x00\ +\xad\x03p\xff\xd7\x00\xb2\x00\x05\xff\xec\x00\xb2\x00\x0a\xff\ +\xec\x00\xb2\x00Y\xff\xd7\x00\xb2\x00Z\xff\xd7\x00\xb2\x00\ +[\xff\xd7\x00\xb2\x00\x5c\xff\xd7\x00\xb2\x00]\xff\xec\x00\ +\xb2\x00\xbf\xff\xd7\x00\xb2\x017\xff\xd7\x00\xb2\x01<\xff\ +\xec\x00\xb2\x01>\xff\xec\x00\xb2\x01@\xff\xec\x00\xb2\x01\ +\xfb\xff\xd7\x00\xb2\x01\xfd\xff\xd7\x00\xb2\x02\x07\xff\xec\x00\ +\xb2\x02\x0b\xff\xec\x00\xb2\x03p\xff\xd7\x00\xb4\x00\x05\xff\ +\xec\x00\xb4\x00\x0a\xff\xec\x00\xb4\x00Y\xff\xd7\x00\xb4\x00\ +Z\xff\xd7\x00\xb4\x00[\xff\xd7\x00\xb4\x00\x5c\xff\xd7\x00\ +\xb4\x00]\xff\xec\x00\xb4\x00\xbf\xff\xd7\x00\xb4\x017\xff\ +\xd7\x00\xb4\x01<\xff\xec\x00\xb4\x01>\xff\xec\x00\xb4\x01\ +@\xff\xec\x00\xb4\x01\xfb\xff\xd7\x00\xb4\x01\xfd\xff\xd7\x00\ +\xb4\x02\x07\xff\xec\x00\xb4\x02\x0b\xff\xec\x00\xb4\x03p\xff\ +\xd7\x00\xb5\x00\x05\xff\xec\x00\xb5\x00\x0a\xff\xec\x00\xb5\x00\ +Y\xff\xd7\x00\xb5\x00Z\xff\xd7\x00\xb5\x00[\xff\xd7\x00\ +\xb5\x00\x5c\xff\xd7\x00\xb5\x00]\xff\xec\x00\xb5\x00\xbf\xff\ +\xd7\x00\xb5\x017\xff\xd7\x00\xb5\x01<\xff\xec\x00\xb5\x01\ +>\xff\xec\x00\xb5\x01@\xff\xec\x00\xb5\x01\xfb\xff\xd7\x00\ +\xb5\x01\xfd\xff\xd7\x00\xb5\x02\x07\xff\xec\x00\xb5\x02\x0b\xff\ +\xec\x00\xb5\x03p\xff\xd7\x00\xb6\x00\x05\xff\xec\x00\xb6\x00\ +\x0a\xff\xec\x00\xb6\x00Y\xff\xd7\x00\xb6\x00Z\xff\xd7\x00\ +\xb6\x00[\xff\xd7\x00\xb6\x00\x5c\xff\xd7\x00\xb6\x00]\xff\ +\xec\x00\xb6\x00\xbf\xff\xd7\x00\xb6\x017\xff\xd7\x00\xb6\x01\ +<\xff\xec\x00\xb6\x01>\xff\xec\x00\xb6\x01@\xff\xec\x00\ +\xb6\x01\xfb\xff\xd7\x00\xb6\x01\xfd\xff\xd7\x00\xb6\x02\x07\xff\ +\xec\x00\xb6\x02\x0b\xff\xec\x00\xb6\x03p\xff\xd7\x00\xb8\x00\ +\x05\xff\xd7\x00\xb8\x00\x0a\xff\xd7\x00\xb8\x02\x07\xff\xd7\x00\ +\xb8\x02\x0b\xff\xd7\x00\xba\x00\x05\xff\xec\x00\xba\x00\x0a\xff\ +\xec\x00\xba\x00Y\xff\xd7\x00\xba\x00Z\xff\xd7\x00\xba\x00\ +[\xff\xd7\x00\xba\x00\x5c\xff\xd7\x00\xba\x00]\xff\xec\x00\ +\xba\x00\xbf\xff\xd7\x00\xba\x017\xff\xd7\x00\xba\x01<\xff\ +\xec\x00\xba\x01>\xff\xec\x00\xba\x01@\xff\xec\x00\xba\x01\ +\xfb\xff\xd7\x00\xba\x01\xfd\xff\xd7\x00\xba\x02\x07\xff\xec\x00\ +\xba\x02\x0b\xff\xec\x00\xba\x03p\xff\xd7\x00\xbf\x00\x05\x00\ +R\x00\xbf\x00\x0a\x00R\x00\xbf\x00\x0f\xff\xae\x00\xbf\x00\ +\x11\xff\xae\x00\xbf\x00\x22\x00)\x00\xbf\x02\x07\x00R\x00\ +\xbf\x02\x08\xff\xae\x00\xbf\x02\x0b\x00R\x00\xbf\x02\x0c\xff\ +\xae\x00\xc0\x00\x05\xff\xec\x00\xc0\x00\x0a\xff\xec\x00\xc0\x00\ +Y\xff\xd7\x00\xc0\x00Z\xff\xd7\x00\xc0\x00[\xff\xd7\x00\ +\xc0\x00\x5c\xff\xd7\x00\xc0\x00]\xff\xec\x00\xc0\x00\xbf\xff\ +\xd7\x00\xc0\x017\xff\xd7\x00\xc0\x01<\xff\xec\x00\xc0\x01\ +>\xff\xec\x00\xc0\x01@\xff\xec\x00\xc0\x01\xfb\xff\xd7\x00\ +\xc0\x01\xfd\xff\xd7\x00\xc0\x02\x07\xff\xec\x00\xc0\x02\x0b\xff\ +\xec\x00\xc0\x03p\xff\xd7\x00\xc1\x00\x05\x00R\x00\xc1\x00\ +\x0a\x00R\x00\xc1\x00\x0f\xff\xae\x00\xc1\x00\x11\xff\xae\x00\ +\xc1\x00\x22\x00)\x00\xc1\x02\x07\x00R\x00\xc1\x02\x08\xff\ +\xae\x00\xc1\x02\x0b\x00R\x00\xc1\x02\x0c\xff\xae\x00\xc2\x00\ +\x05\xffq\x00\xc2\x00\x0a\xffq\x00\xc2\x00&\xff\xd7\x00\ +\xc2\x00*\xff\xd7\x00\xc2\x00-\x01\x0a\x00\xc2\x002\xff\ +\xd7\x00\xc2\x004\xff\xd7\x00\xc2\x007\xffq\x00\xc2\x00\ +9\xff\xae\x00\xc2\x00:\xff\xae\x00\xc2\x00<\xff\x85\x00\ +\xc2\x00\x89\xff\xd7\x00\xc2\x00\x94\xff\xd7\x00\xc2\x00\x95\xff\ +\xd7\x00\xc2\x00\x96\xff\xd7\x00\xc2\x00\x97\xff\xd7\x00\xc2\x00\ +\x98\xff\xd7\x00\xc2\x00\x9a\xff\xd7\x00\xc2\x00\x9f\xff\x85\x00\ +\xc2\x00\xc8\xff\xd7\x00\xc2\x00\xca\xff\xd7\x00\xc2\x00\xcc\xff\ +\xd7\x00\xc2\x00\xce\xff\xd7\x00\xc2\x00\xde\xff\xd7\x00\xc2\x00\ +\xe0\xff\xd7\x00\xc2\x00\xe2\xff\xd7\x00\xc2\x00\xe4\xff\xd7\x00\ +\xc2\x01\x0e\xff\xd7\x00\xc2\x01\x10\xff\xd7\x00\xc2\x01\x12\xff\ +\xd7\x00\xc2\x01\x14\xff\xd7\x00\xc2\x01$\xffq\x00\xc2\x01\ +&\xffq\x00\xc2\x016\xff\xae\x00\xc2\x018\xff\x85\x00\ +\xc2\x01:\xff\x85\x00\xc2\x01G\xff\xd7\x00\xc2\x01\xfa\xff\ +\xae\x00\xc2\x01\xfc\xff\xae\x00\xc2\x01\xfe\xff\xae\x00\xc2\x02\ +\x00\xff\x85\x00\xc2\x02\x07\xffq\x00\xc2\x02\x0b\xffq\x00\ +\xc2\x02_\xff\xd7\x00\xc2\x03I\xff\xd7\x00\xc2\x03K\xff\ +\xd7\x00\xc2\x03M\xff\xd7\x00\xc2\x03O\xff\xd7\x00\xc2\x03\ +Q\xff\xd7\x00\xc2\x03S\xff\xd7\x00\xc2\x03U\xff\xd7\x00\ +\xc2\x03W\xff\xd7\x00\xc2\x03Y\xff\xd7\x00\xc2\x03[\xff\ +\xd7\x00\xc2\x03]\xff\xd7\x00\xc2\x03_\xff\xd7\x00\xc2\x03\ +o\xff\x85\x00\xc2\x03q\xff\x85\x00\xc2\x03s\xff\x85\x00\ +\xc2\x03\x8f\xffq\x00\xc3\x00\x05\xff\xec\x00\xc3\x00\x0a\xff\ +\xec\x00\xc3\x02\x07\xff\xec\x00\xc3\x02\x0b\xff\xec\x00\xc4\x00\ +\x05\xffq\x00\xc4\x00\x0a\xffq\x00\xc4\x00&\xff\xd7\x00\ +\xc4\x00*\xff\xd7\x00\xc4\x00-\x01\x0a\x00\xc4\x002\xff\ +\xd7\x00\xc4\x004\xff\xd7\x00\xc4\x007\xffq\x00\xc4\x00\ +9\xff\xae\x00\xc4\x00:\xff\xae\x00\xc4\x00<\xff\x85\x00\ +\xc4\x00\x89\xff\xd7\x00\xc4\x00\x94\xff\xd7\x00\xc4\x00\x95\xff\ +\xd7\x00\xc4\x00\x96\xff\xd7\x00\xc4\x00\x97\xff\xd7\x00\xc4\x00\ +\x98\xff\xd7\x00\xc4\x00\x9a\xff\xd7\x00\xc4\x00\x9f\xff\x85\x00\ +\xc4\x00\xc8\xff\xd7\x00\xc4\x00\xca\xff\xd7\x00\xc4\x00\xcc\xff\ +\xd7\x00\xc4\x00\xce\xff\xd7\x00\xc4\x00\xde\xff\xd7\x00\xc4\x00\ +\xe0\xff\xd7\x00\xc4\x00\xe2\xff\xd7\x00\xc4\x00\xe4\xff\xd7\x00\ +\xc4\x01\x0e\xff\xd7\x00\xc4\x01\x10\xff\xd7\x00\xc4\x01\x12\xff\ +\xd7\x00\xc4\x01\x14\xff\xd7\x00\xc4\x01$\xffq\x00\xc4\x01\ +&\xffq\x00\xc4\x016\xff\xae\x00\xc4\x018\xff\x85\x00\ +\xc4\x01:\xff\x85\x00\xc4\x01G\xff\xd7\x00\xc4\x01\xfa\xff\ +\xae\x00\xc4\x01\xfc\xff\xae\x00\xc4\x01\xfe\xff\xae\x00\xc4\x02\ +\x00\xff\x85\x00\xc4\x02\x07\xffq\x00\xc4\x02\x0b\xffq\x00\ +\xc4\x02_\xff\xd7\x00\xc4\x03I\xff\xd7\x00\xc4\x03K\xff\ +\xd7\x00\xc4\x03M\xff\xd7\x00\xc4\x03O\xff\xd7\x00\xc4\x03\ +Q\xff\xd7\x00\xc4\x03S\xff\xd7\x00\xc4\x03U\xff\xd7\x00\ +\xc4\x03W\xff\xd7\x00\xc4\x03Y\xff\xd7\x00\xc4\x03[\xff\ +\xd7\x00\xc4\x03]\xff\xd7\x00\xc4\x03_\xff\xd7\x00\xc4\x03\ +o\xff\x85\x00\xc4\x03q\xff\x85\x00\xc4\x03s\xff\x85\x00\ +\xc4\x03\x8f\xffq\x00\xc5\x00\x05\xff\xec\x00\xc5\x00\x0a\xff\ +\xec\x00\xc5\x02\x07\xff\xec\x00\xc5\x02\x0b\xff\xec\x00\xc6\x00\ +\x05\xffq\x00\xc6\x00\x0a\xffq\x00\xc6\x00&\xff\xd7\x00\ +\xc6\x00*\xff\xd7\x00\xc6\x00-\x01\x0a\x00\xc6\x002\xff\ +\xd7\x00\xc6\x004\xff\xd7\x00\xc6\x007\xffq\x00\xc6\x00\ +9\xff\xae\x00\xc6\x00:\xff\xae\x00\xc6\x00<\xff\x85\x00\ +\xc6\x00\x89\xff\xd7\x00\xc6\x00\x94\xff\xd7\x00\xc6\x00\x95\xff\ +\xd7\x00\xc6\x00\x96\xff\xd7\x00\xc6\x00\x97\xff\xd7\x00\xc6\x00\ +\x98\xff\xd7\x00\xc6\x00\x9a\xff\xd7\x00\xc6\x00\x9f\xff\x85\x00\ +\xc6\x00\xc8\xff\xd7\x00\xc6\x00\xca\xff\xd7\x00\xc6\x00\xcc\xff\ +\xd7\x00\xc6\x00\xce\xff\xd7\x00\xc6\x00\xde\xff\xd7\x00\xc6\x00\ +\xe0\xff\xd7\x00\xc6\x00\xe2\xff\xd7\x00\xc6\x00\xe4\xff\xd7\x00\ +\xc6\x01\x0e\xff\xd7\x00\xc6\x01\x10\xff\xd7\x00\xc6\x01\x12\xff\ +\xd7\x00\xc6\x01\x14\xff\xd7\x00\xc6\x01$\xffq\x00\xc6\x01\ +&\xffq\x00\xc6\x016\xff\xae\x00\xc6\x018\xff\x85\x00\ +\xc6\x01:\xff\x85\x00\xc6\x01G\xff\xd7\x00\xc6\x01\xfa\xff\ +\xae\x00\xc6\x01\xfc\xff\xae\x00\xc6\x01\xfe\xff\xae\x00\xc6\x02\ +\x00\xff\x85\x00\xc6\x02\x07\xffq\x00\xc6\x02\x0b\xffq\x00\ +\xc6\x02_\xff\xd7\x00\xc6\x03I\xff\xd7\x00\xc6\x03K\xff\ +\xd7\x00\xc6\x03M\xff\xd7\x00\xc6\x03O\xff\xd7\x00\xc6\x03\ +Q\xff\xd7\x00\xc6\x03S\xff\xd7\x00\xc6\x03U\xff\xd7\x00\ +\xc6\x03W\xff\xd7\x00\xc6\x03Y\xff\xd7\x00\xc6\x03[\xff\ +\xd7\x00\xc6\x03]\xff\xd7\x00\xc6\x03_\xff\xd7\x00\xc6\x03\ +o\xff\x85\x00\xc6\x03q\xff\x85\x00\xc6\x03s\xff\x85\x00\ +\xc6\x03\x8f\xffq\x00\xc7\x00\x05\xff\xec\x00\xc7\x00\x0a\xff\ +\xec\x00\xc7\x02\x07\xff\xec\x00\xc7\x02\x0b\xff\xec\x00\xc8\x00\ +&\xff\xd7\x00\xc8\x00*\xff\xd7\x00\xc8\x002\xff\xd7\x00\ +\xc8\x004\xff\xd7\x00\xc8\x00\x89\xff\xd7\x00\xc8\x00\x94\xff\ +\xd7\x00\xc8\x00\x95\xff\xd7\x00\xc8\x00\x96\xff\xd7\x00\xc8\x00\ +\x97\xff\xd7\x00\xc8\x00\x98\xff\xd7\x00\xc8\x00\x9a\xff\xd7\x00\ +\xc8\x00\xc8\xff\xd7\x00\xc8\x00\xca\xff\xd7\x00\xc8\x00\xcc\xff\ +\xd7\x00\xc8\x00\xce\xff\xd7\x00\xc8\x00\xde\xff\xd7\x00\xc8\x00\ +\xe0\xff\xd7\x00\xc8\x00\xe2\xff\xd7\x00\xc8\x00\xe4\xff\xd7\x00\ +\xc8\x01\x0e\xff\xd7\x00\xc8\x01\x10\xff\xd7\x00\xc8\x01\x12\xff\ +\xd7\x00\xc8\x01\x14\xff\xd7\x00\xc8\x01G\xff\xd7\x00\xc8\x02\ +_\xff\xd7\x00\xc8\x03I\xff\xd7\x00\xc8\x03K\xff\xd7\x00\ +\xc8\x03M\xff\xd7\x00\xc8\x03O\xff\xd7\x00\xc8\x03Q\xff\ +\xd7\x00\xc8\x03S\xff\xd7\x00\xc8\x03U\xff\xd7\x00\xc8\x03\ +W\xff\xd7\x00\xc8\x03Y\xff\xd7\x00\xc8\x03[\xff\xd7\x00\ +\xc8\x03]\xff\xd7\x00\xc8\x03_\xff\xd7\x00\xca\x00&\xff\ +\xd7\x00\xca\x00*\xff\xd7\x00\xca\x002\xff\xd7\x00\xca\x00\ +4\xff\xd7\x00\xca\x00\x89\xff\xd7\x00\xca\x00\x94\xff\xd7\x00\ +\xca\x00\x95\xff\xd7\x00\xca\x00\x96\xff\xd7\x00\xca\x00\x97\xff\ +\xd7\x00\xca\x00\x98\xff\xd7\x00\xca\x00\x9a\xff\xd7\x00\xca\x00\ +\xc8\xff\xd7\x00\xca\x00\xca\xff\xd7\x00\xca\x00\xcc\xff\xd7\x00\ +\xca\x00\xce\xff\xd7\x00\xca\x00\xde\xff\xd7\x00\xca\x00\xe0\xff\ +\xd7\x00\xca\x00\xe2\xff\xd7\x00\xca\x00\xe4\xff\xd7\x00\xca\x01\ +\x0e\xff\xd7\x00\xca\x01\x10\xff\xd7\x00\xca\x01\x12\xff\xd7\x00\ +\xca\x01\x14\xff\xd7\x00\xca\x01G\xff\xd7\x00\xca\x02_\xff\ +\xd7\x00\xca\x03I\xff\xd7\x00\xca\x03K\xff\xd7\x00\xca\x03\ +M\xff\xd7\x00\xca\x03O\xff\xd7\x00\xca\x03Q\xff\xd7\x00\ +\xca\x03S\xff\xd7\x00\xca\x03U\xff\xd7\x00\xca\x03W\xff\ +\xd7\x00\xca\x03Y\xff\xd7\x00\xca\x03[\xff\xd7\x00\xca\x03\ +]\xff\xd7\x00\xca\x03_\xff\xd7\x00\xcc\x00&\xff\xd7\x00\ +\xcc\x00*\xff\xd7\x00\xcc\x002\xff\xd7\x00\xcc\x004\xff\ +\xd7\x00\xcc\x00\x89\xff\xd7\x00\xcc\x00\x94\xff\xd7\x00\xcc\x00\ +\x95\xff\xd7\x00\xcc\x00\x96\xff\xd7\x00\xcc\x00\x97\xff\xd7\x00\ +\xcc\x00\x98\xff\xd7\x00\xcc\x00\x9a\xff\xd7\x00\xcc\x00\xc8\xff\ +\xd7\x00\xcc\x00\xca\xff\xd7\x00\xcc\x00\xcc\xff\xd7\x00\xcc\x00\ +\xce\xff\xd7\x00\xcc\x00\xde\xff\xd7\x00\xcc\x00\xe0\xff\xd7\x00\ +\xcc\x00\xe2\xff\xd7\x00\xcc\x00\xe4\xff\xd7\x00\xcc\x01\x0e\xff\ +\xd7\x00\xcc\x01\x10\xff\xd7\x00\xcc\x01\x12\xff\xd7\x00\xcc\x01\ +\x14\xff\xd7\x00\xcc\x01G\xff\xd7\x00\xcc\x02_\xff\xd7\x00\ +\xcc\x03I\xff\xd7\x00\xcc\x03K\xff\xd7\x00\xcc\x03M\xff\ +\xd7\x00\xcc\x03O\xff\xd7\x00\xcc\x03Q\xff\xd7\x00\xcc\x03\ +S\xff\xd7\x00\xcc\x03U\xff\xd7\x00\xcc\x03W\xff\xd7\x00\ +\xcc\x03Y\xff\xd7\x00\xcc\x03[\xff\xd7\x00\xcc\x03]\xff\ +\xd7\x00\xcc\x03_\xff\xd7\x00\xce\x00&\xff\xd7\x00\xce\x00\ +*\xff\xd7\x00\xce\x002\xff\xd7\x00\xce\x004\xff\xd7\x00\ +\xce\x00\x89\xff\xd7\x00\xce\x00\x94\xff\xd7\x00\xce\x00\x95\xff\ +\xd7\x00\xce\x00\x96\xff\xd7\x00\xce\x00\x97\xff\xd7\x00\xce\x00\ +\x98\xff\xd7\x00\xce\x00\x9a\xff\xd7\x00\xce\x00\xc8\xff\xd7\x00\ +\xce\x00\xca\xff\xd7\x00\xce\x00\xcc\xff\xd7\x00\xce\x00\xce\xff\ +\xd7\x00\xce\x00\xde\xff\xd7\x00\xce\x00\xe0\xff\xd7\x00\xce\x00\ +\xe2\xff\xd7\x00\xce\x00\xe4\xff\xd7\x00\xce\x01\x0e\xff\xd7\x00\ +\xce\x01\x10\xff\xd7\x00\xce\x01\x12\xff\xd7\x00\xce\x01\x14\xff\ +\xd7\x00\xce\x01G\xff\xd7\x00\xce\x02_\xff\xd7\x00\xce\x03\ +I\xff\xd7\x00\xce\x03K\xff\xd7\x00\xce\x03M\xff\xd7\x00\ +\xce\x03O\xff\xd7\x00\xce\x03Q\xff\xd7\x00\xce\x03S\xff\ +\xd7\x00\xce\x03U\xff\xd7\x00\xce\x03W\xff\xd7\x00\xce\x03\ +Y\xff\xd7\x00\xce\x03[\xff\xd7\x00\xce\x03]\xff\xd7\x00\ +\xce\x03_\xff\xd7\x00\xd0\x00\x0f\xff\xae\x00\xd0\x00\x11\xff\ +\xae\x00\xd0\x00$\xff\xd7\x00\xd0\x007\xff\xc3\x00\xd0\x00\ +9\xff\xec\x00\xd0\x00:\xff\xec\x00\xd0\x00;\xff\xd7\x00\ +\xd0\x00<\xff\xec\x00\xd0\x00=\xff\xec\x00\xd0\x00\x82\xff\ +\xd7\x00\xd0\x00\x83\xff\xd7\x00\xd0\x00\x84\xff\xd7\x00\xd0\x00\ +\x85\xff\xd7\x00\xd0\x00\x86\xff\xd7\x00\xd0\x00\x87\xff\xd7\x00\ +\xd0\x00\x9f\xff\xec\x00\xd0\x00\xc2\xff\xd7\x00\xd0\x00\xc4\xff\ +\xd7\x00\xd0\x00\xc6\xff\xd7\x00\xd0\x01$\xff\xc3\x00\xd0\x01\ +&\xff\xc3\x00\xd0\x016\xff\xec\x00\xd0\x018\xff\xec\x00\ +\xd0\x01:\xff\xec\x00\xd0\x01;\xff\xec\x00\xd0\x01=\xff\ +\xec\x00\xd0\x01?\xff\xec\x00\xd0\x01C\xff\xd7\x00\xd0\x01\ +\xa0\xff\xec\x00\xd0\x01\xfa\xff\xec\x00\xd0\x01\xfc\xff\xec\x00\ +\xd0\x01\xfe\xff\xec\x00\xd0\x02\x00\xff\xec\x00\xd0\x02\x08\xff\ +\xae\x00\xd0\x02\x0c\xff\xae\x00\xd0\x02X\xff\xd7\x00\xd0\x03\ +\x1d\xff\xd7\x00\xd0\x03\x1f\xff\xd7\x00\xd0\x03!\xff\xd7\x00\ +\xd0\x03#\xff\xd7\x00\xd0\x03%\xff\xd7\x00\xd0\x03'\xff\ +\xd7\x00\xd0\x03)\xff\xd7\x00\xd0\x03+\xff\xd7\x00\xd0\x03\ +-\xff\xd7\x00\xd0\x03/\xff\xd7\x00\xd0\x031\xff\xd7\x00\ +\xd0\x033\xff\xd7\x00\xd0\x03o\xff\xec\x00\xd0\x03q\xff\ +\xec\x00\xd0\x03s\xff\xec\x00\xd0\x03\x8f\xff\xc3\x00\xd1\x00\ +\x05\x00R\x00\xd1\x00\x0a\x00R\x00\xd1\x00\x0c\x00\x8f\x00\ +\xd1\x00\x22\x00\xa4\x00\xd1\x00@\x00\x8f\x00\xd1\x00E\x00\ +=\x00\xd1\x00K\x00=\x00\xd1\x00N\x00=\x00\xd1\x00\ +O\x00=\x00\xd1\x00`\x00\x8f\x00\xd1\x00\xe7\x00=\x00\ +\xd1\x00\xe9\x00{\x00\xd1\x02\x07\x00R\x00\xd1\x02\x0b\x00\ +R\x00\xd2\x00\x0f\xff\xae\x00\xd2\x00\x11\xff\xae\x00\xd2\x00\ +$\xff\xd7\x00\xd2\x007\xff\xc3\x00\xd2\x009\xff\xec\x00\ +\xd2\x00:\xff\xec\x00\xd2\x00;\xff\xd7\x00\xd2\x00<\xff\ +\xec\x00\xd2\x00=\xff\xec\x00\xd2\x00\x82\xff\xd7\x00\xd2\x00\ +\x83\xff\xd7\x00\xd2\x00\x84\xff\xd7\x00\xd2\x00\x85\xff\xd7\x00\ +\xd2\x00\x86\xff\xd7\x00\xd2\x00\x87\xff\xd7\x00\xd2\x00\x9f\xff\ +\xec\x00\xd2\x00\xc2\xff\xd7\x00\xd2\x00\xc4\xff\xd7\x00\xd2\x00\ +\xc6\xff\xd7\x00\xd2\x01$\xff\xc3\x00\xd2\x01&\xff\xc3\x00\ +\xd2\x016\xff\xec\x00\xd2\x018\xff\xec\x00\xd2\x01:\xff\ +\xec\x00\xd2\x01;\xff\xec\x00\xd2\x01=\xff\xec\x00\xd2\x01\ +?\xff\xec\x00\xd2\x01C\xff\xd7\x00\xd2\x01\xa0\xff\xec\x00\ +\xd2\x01\xfa\xff\xec\x00\xd2\x01\xfc\xff\xec\x00\xd2\x01\xfe\xff\ +\xec\x00\xd2\x02\x00\xff\xec\x00\xd2\x02\x08\xff\xae\x00\xd2\x02\ +\x0c\xff\xae\x00\xd2\x02X\xff\xd7\x00\xd2\x03\x1d\xff\xd7\x00\ +\xd2\x03\x1f\xff\xd7\x00\xd2\x03!\xff\xd7\x00\xd2\x03#\xff\ +\xd7\x00\xd2\x03%\xff\xd7\x00\xd2\x03'\xff\xd7\x00\xd2\x03\ +)\xff\xd7\x00\xd2\x03+\xff\xd7\x00\xd2\x03-\xff\xd7\x00\ +\xd2\x03/\xff\xd7\x00\xd2\x031\xff\xd7\x00\xd2\x033\xff\ +\xd7\x00\xd2\x03o\xff\xec\x00\xd2\x03q\xff\xec\x00\xd2\x03\ +s\xff\xec\x00\xd2\x03\x8f\xff\xc3\x00\xd4\x00-\x00{\x00\ +\xd5\x00\x05\xff\xec\x00\xd5\x00\x0a\xff\xec\x00\xd5\x00Y\xff\ +\xd7\x00\xd5\x00Z\xff\xd7\x00\xd5\x00[\xff\xd7\x00\xd5\x00\ +\x5c\xff\xd7\x00\xd5\x00]\xff\xec\x00\xd5\x00\xbf\xff\xd7\x00\ +\xd5\x017\xff\xd7\x00\xd5\x01<\xff\xec\x00\xd5\x01>\xff\ +\xec\x00\xd5\x01@\xff\xec\x00\xd5\x01\xfb\xff\xd7\x00\xd5\x01\ +\xfd\xff\xd7\x00\xd5\x02\x07\xff\xec\x00\xd5\x02\x0b\xff\xec\x00\ +\xd5\x03p\xff\xd7\x00\xd6\x00-\x00{\x00\xd7\x00\x05\xff\ +\xec\x00\xd7\x00\x0a\xff\xec\x00\xd7\x00Y\xff\xd7\x00\xd7\x00\ +Z\xff\xd7\x00\xd7\x00[\xff\xd7\x00\xd7\x00\x5c\xff\xd7\x00\ +\xd7\x00]\xff\xec\x00\xd7\x00\xbf\xff\xd7\x00\xd7\x017\xff\ +\xd7\x00\xd7\x01<\xff\xec\x00\xd7\x01>\xff\xec\x00\xd7\x01\ +@\xff\xec\x00\xd7\x01\xfb\xff\xd7\x00\xd7\x01\xfd\xff\xd7\x00\ +\xd7\x02\x07\xff\xec\x00\xd7\x02\x0b\xff\xec\x00\xd7\x03p\xff\ +\xd7\x00\xd8\x00-\x00{\x00\xd9\x00\x05\xff\xec\x00\xd9\x00\ +\x0a\xff\xec\x00\xd9\x00Y\xff\xd7\x00\xd9\x00Z\xff\xd7\x00\ +\xd9\x00[\xff\xd7\x00\xd9\x00\x5c\xff\xd7\x00\xd9\x00]\xff\ +\xec\x00\xd9\x00\xbf\xff\xd7\x00\xd9\x017\xff\xd7\x00\xd9\x01\ +<\xff\xec\x00\xd9\x01>\xff\xec\x00\xd9\x01@\xff\xec\x00\ +\xd9\x01\xfb\xff\xd7\x00\xd9\x01\xfd\xff\xd7\x00\xd9\x02\x07\xff\ +\xec\x00\xd9\x02\x0b\xff\xec\x00\xd9\x03p\xff\xd7\x00\xda\x00\ +-\x00{\x00\xdb\x00\x05\xff\xec\x00\xdb\x00\x0a\xff\xec\x00\ +\xdb\x00Y\xff\xd7\x00\xdb\x00Z\xff\xd7\x00\xdb\x00[\xff\ +\xd7\x00\xdb\x00\x5c\xff\xd7\x00\xdb\x00]\xff\xec\x00\xdb\x00\ +\xbf\xff\xd7\x00\xdb\x017\xff\xd7\x00\xdb\x01<\xff\xec\x00\ +\xdb\x01>\xff\xec\x00\xdb\x01@\xff\xec\x00\xdb\x01\xfb\xff\ +\xd7\x00\xdb\x01\xfd\xff\xd7\x00\xdb\x02\x07\xff\xec\x00\xdb\x02\ +\x0b\xff\xec\x00\xdb\x03p\xff\xd7\x00\xdc\x00-\x00{\x00\ +\xdd\x00\x05\xff\xec\x00\xdd\x00\x0a\xff\xec\x00\xdd\x00Y\xff\ +\xd7\x00\xdd\x00Z\xff\xd7\x00\xdd\x00[\xff\xd7\x00\xdd\x00\ +\x5c\xff\xd7\x00\xdd\x00]\xff\xec\x00\xdd\x00\xbf\xff\xd7\x00\ +\xdd\x017\xff\xd7\x00\xdd\x01<\xff\xec\x00\xdd\x01>\xff\ +\xec\x00\xdd\x01@\xff\xec\x00\xdd\x01\xfb\xff\xd7\x00\xdd\x01\ +\xfd\xff\xd7\x00\xdd\x02\x07\xff\xec\x00\xdd\x02\x0b\xff\xec\x00\ +\xdd\x03p\xff\xd7\x00\xe7\x00\x05\xff\xec\x00\xe7\x00\x0a\xff\ +\xec\x00\xe7\x02\x07\xff\xec\x00\xe7\x02\x0b\xff\xec\x00\xf8\x00\ +&\xff\xd7\x00\xf8\x00*\xff\xd7\x00\xf8\x002\xff\xd7\x00\ +\xf8\x004\xff\xd7\x00\xf8\x00\x89\xff\xd7\x00\xf8\x00\x94\xff\ +\xd7\x00\xf8\x00\x95\xff\xd7\x00\xf8\x00\x96\xff\xd7\x00\xf8\x00\ +\x97\xff\xd7\x00\xf8\x00\x98\xff\xd7\x00\xf8\x00\x9a\xff\xd7\x00\ +\xf8\x00\xc8\xff\xd7\x00\xf8\x00\xca\xff\xd7\x00\xf8\x00\xcc\xff\ +\xd7\x00\xf8\x00\xce\xff\xd7\x00\xf8\x00\xde\xff\xd7\x00\xf8\x00\ +\xe0\xff\xd7\x00\xf8\x00\xe2\xff\xd7\x00\xf8\x00\xe4\xff\xd7\x00\ +\xf8\x01\x0e\xff\xd7\x00\xf8\x01\x10\xff\xd7\x00\xf8\x01\x12\xff\ +\xd7\x00\xf8\x01\x14\xff\xd7\x00\xf8\x01G\xff\xd7\x00\xf8\x02\ +_\xff\xd7\x00\xf8\x03I\xff\xd7\x00\xf8\x03K\xff\xd7\x00\ +\xf8\x03M\xff\xd7\x00\xf8\x03O\xff\xd7\x00\xf8\x03Q\xff\ +\xd7\x00\xf8\x03S\xff\xd7\x00\xf8\x03U\xff\xd7\x00\xf8\x03\ +W\xff\xd7\x00\xf8\x03Y\xff\xd7\x00\xf8\x03[\xff\xd7\x00\ +\xf8\x03]\xff\xd7\x00\xf8\x03_\xff\xd7\x00\xf9\x00F\xff\ +\xd7\x00\xf9\x00G\xff\xd7\x00\xf9\x00H\xff\xd7\x00\xf9\x00\ +R\xff\xd7\x00\xf9\x00T\xff\xd7\x00\xf9\x00\xa2\xff\xd7\x00\ +\xf9\x00\xa9\xff\xd7\x00\xf9\x00\xaa\xff\xd7\x00\xf9\x00\xab\xff\ +\xd7\x00\xf9\x00\xac\xff\xd7\x00\xf9\x00\xad\xff\xd7\x00\xf9\x00\ +\xb4\xff\xd7\x00\xf9\x00\xb5\xff\xd7\x00\xf9\x00\xb6\xff\xd7\x00\ +\xf9\x00\xb7\xff\xd7\x00\xf9\x00\xb8\xff\xd7\x00\xf9\x00\xba\xff\ +\xd7\x00\xf9\x00\xc9\xff\xd7\x00\xf9\x00\xcb\xff\xd7\x00\xf9\x00\ +\xcd\xff\xd7\x00\xf9\x00\xcf\xff\xd7\x00\xf9\x00\xd1\xff\xd7\x00\ +\xf9\x00\xd3\xff\xd7\x00\xf9\x00\xd5\xff\xd7\x00\xf9\x00\xd7\xff\ +\xd7\x00\xf9\x00\xd9\xff\xd7\x00\xf9\x00\xdb\xff\xd7\x00\xf9\x00\ +\xdd\xff\xd7\x00\xf9\x01\x0f\xff\xd7\x00\xf9\x01\x11\xff\xd7\x00\ +\xf9\x01\x13\xff\xd7\x00\xf9\x01\x15\xff\xd7\x00\xf9\x01H\xff\ +\xd7\x00\xf9\x02`\xff\xd7\x00\xf9\x036\xff\xd7\x00\xf9\x03\ +8\xff\xd7\x00\xf9\x03:\xff\xd7\x00\xf9\x03<\xff\xd7\x00\ +\xf9\x03@\xff\xd7\x00\xf9\x03B\xff\xd7\x00\xf9\x03D\xff\ +\xd7\x00\xf9\x03J\xff\xd7\x00\xf9\x03L\xff\xd7\x00\xf9\x03\ +N\xff\xd7\x00\xf9\x03R\xff\xd7\x00\xf9\x03T\xff\xd7\x00\ +\xf9\x03V\xff\xd7\x00\xf9\x03X\xff\xd7\x00\xf9\x03Z\xff\ +\xd7\x00\xf9\x03\x5c\xff\xd7\x00\xf9\x03^\xff\xd7\x00\xf9\x03\ +`\xff\xd7\x00\xfa\x00F\xff\xd7\x00\xfa\x00G\xff\xd7\x00\ +\xfa\x00H\xff\xd7\x00\xfa\x00R\xff\xd7\x00\xfa\x00T\xff\ +\xd7\x00\xfa\x00\xa2\xff\xd7\x00\xfa\x00\xa9\xff\xd7\x00\xfa\x00\ +\xaa\xff\xd7\x00\xfa\x00\xab\xff\xd7\x00\xfa\x00\xac\xff\xd7\x00\ +\xfa\x00\xad\xff\xd7\x00\xfa\x00\xb4\xff\xd7\x00\xfa\x00\xb5\xff\ +\xd7\x00\xfa\x00\xb6\xff\xd7\x00\xfa\x00\xb7\xff\xd7\x00\xfa\x00\ +\xb8\xff\xd7\x00\xfa\x00\xba\xff\xd7\x00\xfa\x00\xc9\xff\xd7\x00\ +\xfa\x00\xcb\xff\xd7\x00\xfa\x00\xcd\xff\xd7\x00\xfa\x00\xcf\xff\ +\xd7\x00\xfa\x00\xd1\xff\xd7\x00\xfa\x00\xd3\xff\xd7\x00\xfa\x00\ +\xd5\xff\xd7\x00\xfa\x00\xd7\xff\xd7\x00\xfa\x00\xd9\xff\xd7\x00\ +\xfa\x00\xdb\xff\xd7\x00\xfa\x00\xdd\xff\xd7\x00\xfa\x01\x0f\xff\ +\xd7\x00\xfa\x01\x11\xff\xd7\x00\xfa\x01\x13\xff\xd7\x00\xfa\x01\ +\x15\xff\xd7\x00\xfa\x01H\xff\xd7\x00\xfa\x02`\xff\xd7\x00\ +\xfa\x036\xff\xd7\x00\xfa\x038\xff\xd7\x00\xfa\x03:\xff\ +\xd7\x00\xfa\x03<\xff\xd7\x00\xfa\x03@\xff\xd7\x00\xfa\x03\ +B\xff\xd7\x00\xfa\x03D\xff\xd7\x00\xfa\x03J\xff\xd7\x00\ +\xfa\x03L\xff\xd7\x00\xfa\x03N\xff\xd7\x00\xfa\x03R\xff\ +\xd7\x00\xfa\x03T\xff\xd7\x00\xfa\x03V\xff\xd7\x00\xfa\x03\ +X\xff\xd7\x00\xfa\x03Z\xff\xd7\x00\xfa\x03\x5c\xff\xd7\x00\ +\xfa\x03^\xff\xd7\x00\xfa\x03`\xff\xd7\x00\xfb\x00\x05\xff\ +\x5c\x00\xfb\x00\x0a\xff\x5c\x00\xfb\x00&\xff\xd7\x00\xfb\x00\ +*\xff\xd7\x00\xfb\x002\xff\xd7\x00\xfb\x004\xff\xd7\x00\ +\xfb\x007\xff\xd7\x00\xfb\x008\xff\xec\x00\xfb\x009\xff\ +\xd7\x00\xfb\x00:\xff\xd7\x00\xfb\x00<\xff\xc3\x00\xfb\x00\ +\x89\xff\xd7\x00\xfb\x00\x94\xff\xd7\x00\xfb\x00\x95\xff\xd7\x00\ +\xfb\x00\x96\xff\xd7\x00\xfb\x00\x97\xff\xd7\x00\xfb\x00\x98\xff\ +\xd7\x00\xfb\x00\x9a\xff\xd7\x00\xfb\x00\x9b\xff\xec\x00\xfb\x00\ +\x9c\xff\xec\x00\xfb\x00\x9d\xff\xec\x00\xfb\x00\x9e\xff\xec\x00\ +\xfb\x00\x9f\xff\xc3\x00\xfb\x00\xc8\xff\xd7\x00\xfb\x00\xca\xff\ +\xd7\x00\xfb\x00\xcc\xff\xd7\x00\xfb\x00\xce\xff\xd7\x00\xfb\x00\ +\xde\xff\xd7\x00\xfb\x00\xe0\xff\xd7\x00\xfb\x00\xe2\xff\xd7\x00\ +\xfb\x00\xe4\xff\xd7\x00\xfb\x01\x0e\xff\xd7\x00\xfb\x01\x10\xff\ +\xd7\x00\xfb\x01\x12\xff\xd7\x00\xfb\x01\x14\xff\xd7\x00\xfb\x01\ +$\xff\xd7\x00\xfb\x01&\xff\xd7\x00\xfb\x01*\xff\xec\x00\ +\xfb\x01,\xff\xec\x00\xfb\x01.\xff\xec\x00\xfb\x010\xff\ +\xec\x00\xfb\x012\xff\xec\x00\xfb\x014\xff\xec\x00\xfb\x01\ +6\xff\xd7\x00\xfb\x018\xff\xc3\x00\xfb\x01:\xff\xc3\x00\ +\xfb\x01G\xff\xd7\x00\xfb\x01\xfa\xff\xd7\x00\xfb\x01\xfc\xff\ +\xd7\x00\xfb\x01\xfe\xff\xd7\x00\xfb\x02\x00\xff\xc3\x00\xfb\x02\ +\x07\xff\x5c\x00\xfb\x02\x0b\xff\x5c\x00\xfb\x02_\xff\xd7\x00\ +\xfb\x02a\xff\xec\x00\xfb\x03I\xff\xd7\x00\xfb\x03K\xff\ +\xd7\x00\xfb\x03M\xff\xd7\x00\xfb\x03O\xff\xd7\x00\xfb\x03\ +Q\xff\xd7\x00\xfb\x03S\xff\xd7\x00\xfb\x03U\xff\xd7\x00\ +\xfb\x03W\xff\xd7\x00\xfb\x03Y\xff\xd7\x00\xfb\x03[\xff\ +\xd7\x00\xfb\x03]\xff\xd7\x00\xfb\x03_\xff\xd7\x00\xfb\x03\ +a\xff\xec\x00\xfb\x03c\xff\xec\x00\xfb\x03e\xff\xec\x00\ +\xfb\x03g\xff\xec\x00\xfb\x03i\xff\xec\x00\xfb\x03k\xff\ +\xec\x00\xfb\x03m\xff\xec\x00\xfb\x03o\xff\xc3\x00\xfb\x03\ +q\xff\xc3\x00\xfb\x03s\xff\xc3\x00\xfb\x03\x8f\xff\xd7\x00\ +\xfd\x00\x05\xff\x5c\x00\xfd\x00\x0a\xff\x5c\x00\xfd\x00&\xff\ +\xd7\x00\xfd\x00*\xff\xd7\x00\xfd\x002\xff\xd7\x00\xfd\x00\ +4\xff\xd7\x00\xfd\x007\xff\xd7\x00\xfd\x008\xff\xec\x00\ +\xfd\x009\xff\xd7\x00\xfd\x00:\xff\xd7\x00\xfd\x00<\xff\ +\xc3\x00\xfd\x00\x89\xff\xd7\x00\xfd\x00\x94\xff\xd7\x00\xfd\x00\ +\x95\xff\xd7\x00\xfd\x00\x96\xff\xd7\x00\xfd\x00\x97\xff\xd7\x00\ +\xfd\x00\x98\xff\xd7\x00\xfd\x00\x9a\xff\xd7\x00\xfd\x00\x9b\xff\ +\xec\x00\xfd\x00\x9c\xff\xec\x00\xfd\x00\x9d\xff\xec\x00\xfd\x00\ +\x9e\xff\xec\x00\xfd\x00\x9f\xff\xc3\x00\xfd\x00\xc8\xff\xd7\x00\ +\xfd\x00\xca\xff\xd7\x00\xfd\x00\xcc\xff\xd7\x00\xfd\x00\xce\xff\ +\xd7\x00\xfd\x00\xde\xff\xd7\x00\xfd\x00\xe0\xff\xd7\x00\xfd\x00\ +\xe2\xff\xd7\x00\xfd\x00\xe4\xff\xd7\x00\xfd\x01\x0e\xff\xd7\x00\ +\xfd\x01\x10\xff\xd7\x00\xfd\x01\x12\xff\xd7\x00\xfd\x01\x14\xff\ +\xd7\x00\xfd\x01$\xff\xd7\x00\xfd\x01&\xff\xd7\x00\xfd\x01\ +*\xff\xec\x00\xfd\x01,\xff\xec\x00\xfd\x01.\xff\xec\x00\ +\xfd\x010\xff\xec\x00\xfd\x012\xff\xec\x00\xfd\x014\xff\ +\xec\x00\xfd\x016\xff\xd7\x00\xfd\x018\xff\xc3\x00\xfd\x01\ +:\xff\xc3\x00\xfd\x01G\xff\xd7\x00\xfd\x01\xfa\xff\xd7\x00\ +\xfd\x01\xfc\xff\xd7\x00\xfd\x01\xfe\xff\xd7\x00\xfd\x02\x00\xff\ +\xc3\x00\xfd\x02\x07\xff\x5c\x00\xfd\x02\x0b\xff\x5c\x00\xfd\x02\ +_\xff\xd7\x00\xfd\x02a\xff\xec\x00\xfd\x03I\xff\xd7\x00\ +\xfd\x03K\xff\xd7\x00\xfd\x03M\xff\xd7\x00\xfd\x03O\xff\ +\xd7\x00\xfd\x03Q\xff\xd7\x00\xfd\x03S\xff\xd7\x00\xfd\x03\ +U\xff\xd7\x00\xfd\x03W\xff\xd7\x00\xfd\x03Y\xff\xd7\x00\ +\xfd\x03[\xff\xd7\x00\xfd\x03]\xff\xd7\x00\xfd\x03_\xff\ +\xd7\x00\xfd\x03a\xff\xec\x00\xfd\x03c\xff\xec\x00\xfd\x03\ +e\xff\xec\x00\xfd\x03g\xff\xec\x00\xfd\x03i\xff\xec\x00\ +\xfd\x03k\xff\xec\x00\xfd\x03m\xff\xec\x00\xfd\x03o\xff\ +\xc3\x00\xfd\x03q\xff\xc3\x00\xfd\x03s\xff\xc3\x00\xfd\x03\ +\x8f\xff\xd7\x00\xff\x00\x05\xff\x5c\x00\xff\x00\x0a\xff\x5c\x00\ +\xff\x00&\xff\xd7\x00\xff\x00*\xff\xd7\x00\xff\x002\xff\ +\xd7\x00\xff\x004\xff\xd7\x00\xff\x007\xff\xd7\x00\xff\x00\ +8\xff\xec\x00\xff\x009\xff\xd7\x00\xff\x00:\xff\xd7\x00\ +\xff\x00<\xff\xc3\x00\xff\x00\x89\xff\xd7\x00\xff\x00\x94\xff\ +\xd7\x00\xff\x00\x95\xff\xd7\x00\xff\x00\x96\xff\xd7\x00\xff\x00\ +\x97\xff\xd7\x00\xff\x00\x98\xff\xd7\x00\xff\x00\x9a\xff\xd7\x00\ +\xff\x00\x9b\xff\xec\x00\xff\x00\x9c\xff\xec\x00\xff\x00\x9d\xff\ +\xec\x00\xff\x00\x9e\xff\xec\x00\xff\x00\x9f\xff\xc3\x00\xff\x00\ +\xc8\xff\xd7\x00\xff\x00\xca\xff\xd7\x00\xff\x00\xcc\xff\xd7\x00\ +\xff\x00\xce\xff\xd7\x00\xff\x00\xde\xff\xd7\x00\xff\x00\xe0\xff\ +\xd7\x00\xff\x00\xe2\xff\xd7\x00\xff\x00\xe4\xff\xd7\x00\xff\x01\ +\x0e\xff\xd7\x00\xff\x01\x10\xff\xd7\x00\xff\x01\x12\xff\xd7\x00\ +\xff\x01\x14\xff\xd7\x00\xff\x01$\xff\xd7\x00\xff\x01&\xff\ +\xd7\x00\xff\x01*\xff\xec\x00\xff\x01,\xff\xec\x00\xff\x01\ +.\xff\xec\x00\xff\x010\xff\xec\x00\xff\x012\xff\xec\x00\ +\xff\x014\xff\xec\x00\xff\x016\xff\xd7\x00\xff\x018\xff\ +\xc3\x00\xff\x01:\xff\xc3\x00\xff\x01G\xff\xd7\x00\xff\x01\ +\xfa\xff\xd7\x00\xff\x01\xfc\xff\xd7\x00\xff\x01\xfe\xff\xd7\x00\ +\xff\x02\x00\xff\xc3\x00\xff\x02\x07\xff\x5c\x00\xff\x02\x0b\xff\ +\x5c\x00\xff\x02_\xff\xd7\x00\xff\x02a\xff\xec\x00\xff\x03\ +I\xff\xd7\x00\xff\x03K\xff\xd7\x00\xff\x03M\xff\xd7\x00\ +\xff\x03O\xff\xd7\x00\xff\x03Q\xff\xd7\x00\xff\x03S\xff\ +\xd7\x00\xff\x03U\xff\xd7\x00\xff\x03W\xff\xd7\x00\xff\x03\ +Y\xff\xd7\x00\xff\x03[\xff\xd7\x00\xff\x03]\xff\xd7\x00\ +\xff\x03_\xff\xd7\x00\xff\x03a\xff\xec\x00\xff\x03c\xff\ +\xec\x00\xff\x03e\xff\xec\x00\xff\x03g\xff\xec\x00\xff\x03\ +i\xff\xec\x00\xff\x03k\xff\xec\x00\xff\x03m\xff\xec\x00\ +\xff\x03o\xff\xc3\x00\xff\x03q\xff\xc3\x00\xff\x03s\xff\ +\xc3\x00\xff\x03\x8f\xff\xd7\x01\x00\x00\x05\x00R\x01\x00\x00\ +\x0a\x00R\x01\x00\x00\x0c\x00\x8f\x01\x00\x00\x22\x00\x8f\x01\ +\x00\x00@\x00\x8f\x01\x00\x00E\x00=\x01\x00\x00K\x00\ +=\x01\x00\x00N\x00=\x01\x00\x00O\x00=\x01\x00\x00\ +`\x00\x8f\x01\x00\x00\xe7\x00=\x01\x00\x00\xe9\x00\x8f\x01\ +\x00\x02\x07\x00R\x01\x00\x02\x0b\x00R\x01\x01\x00\x05\xff\ +\x5c\x01\x01\x00\x0a\xff\x5c\x01\x01\x00&\xff\xd7\x01\x01\x00\ +*\xff\xd7\x01\x01\x002\xff\xd7\x01\x01\x004\xff\xd7\x01\ +\x01\x007\xff\xd7\x01\x01\x008\xff\xec\x01\x01\x009\xff\ +\xd7\x01\x01\x00:\xff\xd7\x01\x01\x00<\xff\xc3\x01\x01\x00\ +\x89\xff\xd7\x01\x01\x00\x94\xff\xd7\x01\x01\x00\x95\xff\xd7\x01\ +\x01\x00\x96\xff\xd7\x01\x01\x00\x97\xff\xd7\x01\x01\x00\x98\xff\ +\xd7\x01\x01\x00\x9a\xff\xd7\x01\x01\x00\x9b\xff\xec\x01\x01\x00\ +\x9c\xff\xec\x01\x01\x00\x9d\xff\xec\x01\x01\x00\x9e\xff\xec\x01\ +\x01\x00\x9f\xff\xc3\x01\x01\x00\xc8\xff\xd7\x01\x01\x00\xca\xff\ +\xd7\x01\x01\x00\xcc\xff\xd7\x01\x01\x00\xce\xff\xd7\x01\x01\x00\ +\xde\xff\xd7\x01\x01\x00\xe0\xff\xd7\x01\x01\x00\xe2\xff\xd7\x01\ +\x01\x00\xe4\xff\xd7\x01\x01\x01\x0e\xff\xd7\x01\x01\x01\x10\xff\ +\xd7\x01\x01\x01\x12\xff\xd7\x01\x01\x01\x14\xff\xd7\x01\x01\x01\ +$\xff\xd7\x01\x01\x01&\xff\xd7\x01\x01\x01*\xff\xec\x01\ +\x01\x01,\xff\xec\x01\x01\x01.\xff\xec\x01\x01\x010\xff\ +\xec\x01\x01\x012\xff\xec\x01\x01\x014\xff\xec\x01\x01\x01\ +6\xff\xd7\x01\x01\x018\xff\xc3\x01\x01\x01:\xff\xc3\x01\ +\x01\x01G\xff\xd7\x01\x01\x01\xfa\xff\xd7\x01\x01\x01\xfc\xff\ +\xd7\x01\x01\x01\xfe\xff\xd7\x01\x01\x02\x00\xff\xc3\x01\x01\x02\ +\x07\xff\x5c\x01\x01\x02\x0b\xff\x5c\x01\x01\x02_\xff\xd7\x01\ +\x01\x02a\xff\xec\x01\x01\x03I\xff\xd7\x01\x01\x03K\xff\ +\xd7\x01\x01\x03M\xff\xd7\x01\x01\x03O\xff\xd7\x01\x01\x03\ +Q\xff\xd7\x01\x01\x03S\xff\xd7\x01\x01\x03U\xff\xd7\x01\ +\x01\x03W\xff\xd7\x01\x01\x03Y\xff\xd7\x01\x01\x03[\xff\ +\xd7\x01\x01\x03]\xff\xd7\x01\x01\x03_\xff\xd7\x01\x01\x03\ +a\xff\xec\x01\x01\x03c\xff\xec\x01\x01\x03e\xff\xec\x01\ +\x01\x03g\xff\xec\x01\x01\x03i\xff\xec\x01\x01\x03k\xff\ +\xec\x01\x01\x03m\xff\xec\x01\x01\x03o\xff\xc3\x01\x01\x03\ +q\xff\xc3\x01\x01\x03s\xff\xc3\x01\x01\x03\x8f\xff\xd7\x01\ +\x03\x00\x05\xff\x5c\x01\x03\x00\x0a\xff\x5c\x01\x03\x00&\xff\ +\xd7\x01\x03\x00*\xff\xd7\x01\x03\x002\xff\xd7\x01\x03\x00\ +4\xff\xd7\x01\x03\x007\xff\xd7\x01\x03\x008\xff\xec\x01\ +\x03\x009\xff\xd7\x01\x03\x00:\xff\xd7\x01\x03\x00<\xff\ +\xc3\x01\x03\x00\x89\xff\xd7\x01\x03\x00\x94\xff\xd7\x01\x03\x00\ +\x95\xff\xd7\x01\x03\x00\x96\xff\xd7\x01\x03\x00\x97\xff\xd7\x01\ +\x03\x00\x98\xff\xd7\x01\x03\x00\x9a\xff\xd7\x01\x03\x00\x9b\xff\ +\xec\x01\x03\x00\x9c\xff\xec\x01\x03\x00\x9d\xff\xec\x01\x03\x00\ +\x9e\xff\xec\x01\x03\x00\x9f\xff\xc3\x01\x03\x00\xc8\xff\xd7\x01\ +\x03\x00\xca\xff\xd7\x01\x03\x00\xcc\xff\xd7\x01\x03\x00\xce\xff\ +\xd7\x01\x03\x00\xde\xff\xd7\x01\x03\x00\xe0\xff\xd7\x01\x03\x00\ +\xe2\xff\xd7\x01\x03\x00\xe4\xff\xd7\x01\x03\x01\x0e\xff\xd7\x01\ +\x03\x01\x10\xff\xd7\x01\x03\x01\x12\xff\xd7\x01\x03\x01\x14\xff\ +\xd7\x01\x03\x01$\xff\xd7\x01\x03\x01&\xff\xd7\x01\x03\x01\ +*\xff\xec\x01\x03\x01,\xff\xec\x01\x03\x01.\xff\xec\x01\ +\x03\x010\xff\xec\x01\x03\x012\xff\xec\x01\x03\x014\xff\ +\xec\x01\x03\x016\xff\xd7\x01\x03\x018\xff\xc3\x01\x03\x01\ +:\xff\xc3\x01\x03\x01G\xff\xd7\x01\x03\x01\xfa\xff\xd7\x01\ +\x03\x01\xfc\xff\xd7\x01\x03\x01\xfe\xff\xd7\x01\x03\x02\x00\xff\ +\xc3\x01\x03\x02\x07\xff\x5c\x01\x03\x02\x0b\xff\x5c\x01\x03\x02\ +_\xff\xd7\x01\x03\x02a\xff\xec\x01\x03\x03I\xff\xd7\x01\ +\x03\x03K\xff\xd7\x01\x03\x03M\xff\xd7\x01\x03\x03O\xff\ +\xd7\x01\x03\x03Q\xff\xd7\x01\x03\x03S\xff\xd7\x01\x03\x03\ +U\xff\xd7\x01\x03\x03W\xff\xd7\x01\x03\x03Y\xff\xd7\x01\ +\x03\x03[\xff\xd7\x01\x03\x03]\xff\xd7\x01\x03\x03_\xff\ +\xd7\x01\x03\x03a\xff\xec\x01\x03\x03c\xff\xec\x01\x03\x03\ +e\xff\xec\x01\x03\x03g\xff\xec\x01\x03\x03i\xff\xec\x01\ +\x03\x03k\xff\xec\x01\x03\x03m\xff\xec\x01\x03\x03o\xff\ +\xc3\x01\x03\x03q\xff\xc3\x01\x03\x03s\xff\xc3\x01\x03\x03\ +\x8f\xff\xd7\x01\x08\x00\x05\xff\xec\x01\x08\x00\x0a\xff\xec\x01\ +\x08\x02\x07\xff\xec\x01\x08\x02\x0b\xff\xec\x01\x0e\x00\x0f\xff\ +\xae\x01\x0e\x00\x11\xff\xae\x01\x0e\x00$\xff\xd7\x01\x0e\x00\ +7\xff\xc3\x01\x0e\x009\xff\xec\x01\x0e\x00:\xff\xec\x01\ +\x0e\x00;\xff\xd7\x01\x0e\x00<\xff\xec\x01\x0e\x00=\xff\ +\xec\x01\x0e\x00\x82\xff\xd7\x01\x0e\x00\x83\xff\xd7\x01\x0e\x00\ +\x84\xff\xd7\x01\x0e\x00\x85\xff\xd7\x01\x0e\x00\x86\xff\xd7\x01\ +\x0e\x00\x87\xff\xd7\x01\x0e\x00\x9f\xff\xec\x01\x0e\x00\xc2\xff\ +\xd7\x01\x0e\x00\xc4\xff\xd7\x01\x0e\x00\xc6\xff\xd7\x01\x0e\x01\ +$\xff\xc3\x01\x0e\x01&\xff\xc3\x01\x0e\x016\xff\xec\x01\ +\x0e\x018\xff\xec\x01\x0e\x01:\xff\xec\x01\x0e\x01;\xff\ +\xec\x01\x0e\x01=\xff\xec\x01\x0e\x01?\xff\xec\x01\x0e\x01\ +C\xff\xd7\x01\x0e\x01\xa0\xff\xec\x01\x0e\x01\xfa\xff\xec\x01\ +\x0e\x01\xfc\xff\xec\x01\x0e\x01\xfe\xff\xec\x01\x0e\x02\x00\xff\ +\xec\x01\x0e\x02\x08\xff\xae\x01\x0e\x02\x0c\xff\xae\x01\x0e\x02\ +X\xff\xd7\x01\x0e\x03\x1d\xff\xd7\x01\x0e\x03\x1f\xff\xd7\x01\ +\x0e\x03!\xff\xd7\x01\x0e\x03#\xff\xd7\x01\x0e\x03%\xff\ +\xd7\x01\x0e\x03'\xff\xd7\x01\x0e\x03)\xff\xd7\x01\x0e\x03\ ++\xff\xd7\x01\x0e\x03-\xff\xd7\x01\x0e\x03/\xff\xd7\x01\ +\x0e\x031\xff\xd7\x01\x0e\x033\xff\xd7\x01\x0e\x03o\xff\ +\xec\x01\x0e\x03q\xff\xec\x01\x0e\x03s\xff\xec\x01\x0e\x03\ +\x8f\xff\xc3\x01\x10\x00\x0f\xff\xae\x01\x10\x00\x11\xff\xae\x01\ +\x10\x00$\xff\xd7\x01\x10\x007\xff\xc3\x01\x10\x009\xff\ +\xec\x01\x10\x00:\xff\xec\x01\x10\x00;\xff\xd7\x01\x10\x00\ +<\xff\xec\x01\x10\x00=\xff\xec\x01\x10\x00\x82\xff\xd7\x01\ +\x10\x00\x83\xff\xd7\x01\x10\x00\x84\xff\xd7\x01\x10\x00\x85\xff\ +\xd7\x01\x10\x00\x86\xff\xd7\x01\x10\x00\x87\xff\xd7\x01\x10\x00\ +\x9f\xff\xec\x01\x10\x00\xc2\xff\xd7\x01\x10\x00\xc4\xff\xd7\x01\ +\x10\x00\xc6\xff\xd7\x01\x10\x01$\xff\xc3\x01\x10\x01&\xff\ +\xc3\x01\x10\x016\xff\xec\x01\x10\x018\xff\xec\x01\x10\x01\ +:\xff\xec\x01\x10\x01;\xff\xec\x01\x10\x01=\xff\xec\x01\ +\x10\x01?\xff\xec\x01\x10\x01C\xff\xd7\x01\x10\x01\xa0\xff\ +\xec\x01\x10\x01\xfa\xff\xec\x01\x10\x01\xfc\xff\xec\x01\x10\x01\ +\xfe\xff\xec\x01\x10\x02\x00\xff\xec\x01\x10\x02\x08\xff\xae\x01\ +\x10\x02\x0c\xff\xae\x01\x10\x02X\xff\xd7\x01\x10\x03\x1d\xff\ +\xd7\x01\x10\x03\x1f\xff\xd7\x01\x10\x03!\xff\xd7\x01\x10\x03\ +#\xff\xd7\x01\x10\x03%\xff\xd7\x01\x10\x03'\xff\xd7\x01\ +\x10\x03)\xff\xd7\x01\x10\x03+\xff\xd7\x01\x10\x03-\xff\ +\xd7\x01\x10\x03/\xff\xd7\x01\x10\x031\xff\xd7\x01\x10\x03\ +3\xff\xd7\x01\x10\x03o\xff\xec\x01\x10\x03q\xff\xec\x01\ +\x10\x03s\xff\xec\x01\x10\x03\x8f\xff\xc3\x01\x12\x00\x0f\xff\ +\xae\x01\x12\x00\x11\xff\xae\x01\x12\x00$\xff\xd7\x01\x12\x00\ +7\xff\xc3\x01\x12\x009\xff\xec\x01\x12\x00:\xff\xec\x01\ +\x12\x00;\xff\xd7\x01\x12\x00<\xff\xec\x01\x12\x00=\xff\ +\xec\x01\x12\x00\x82\xff\xd7\x01\x12\x00\x83\xff\xd7\x01\x12\x00\ +\x84\xff\xd7\x01\x12\x00\x85\xff\xd7\x01\x12\x00\x86\xff\xd7\x01\ +\x12\x00\x87\xff\xd7\x01\x12\x00\x9f\xff\xec\x01\x12\x00\xc2\xff\ +\xd7\x01\x12\x00\xc4\xff\xd7\x01\x12\x00\xc6\xff\xd7\x01\x12\x01\ +$\xff\xc3\x01\x12\x01&\xff\xc3\x01\x12\x016\xff\xec\x01\ +\x12\x018\xff\xec\x01\x12\x01:\xff\xec\x01\x12\x01;\xff\ +\xec\x01\x12\x01=\xff\xec\x01\x12\x01?\xff\xec\x01\x12\x01\ +C\xff\xd7\x01\x12\x01\xa0\xff\xec\x01\x12\x01\xfa\xff\xec\x01\ +\x12\x01\xfc\xff\xec\x01\x12\x01\xfe\xff\xec\x01\x12\x02\x00\xff\ +\xec\x01\x12\x02\x08\xff\xae\x01\x12\x02\x0c\xff\xae\x01\x12\x02\ +X\xff\xd7\x01\x12\x03\x1d\xff\xd7\x01\x12\x03\x1f\xff\xd7\x01\ +\x12\x03!\xff\xd7\x01\x12\x03#\xff\xd7\x01\x12\x03%\xff\ +\xd7\x01\x12\x03'\xff\xd7\x01\x12\x03)\xff\xd7\x01\x12\x03\ ++\xff\xd7\x01\x12\x03-\xff\xd7\x01\x12\x03/\xff\xd7\x01\ +\x12\x031\xff\xd7\x01\x12\x033\xff\xd7\x01\x12\x03o\xff\ +\xec\x01\x12\x03q\xff\xec\x01\x12\x03s\xff\xec\x01\x12\x03\ +\x8f\xff\xc3\x01\x14\x00-\x00{\x01\x17\x00\x05\x00R\x01\ +\x17\x00\x0a\x00R\x01\x17\x00D\xff\xd7\x01\x17\x00F\xff\ +\xd7\x01\x17\x00G\xff\xd7\x01\x17\x00H\xff\xd7\x01\x17\x00\ +J\xff\xec\x01\x17\x00R\xff\xd7\x01\x17\x00T\xff\xd7\x01\ +\x17\x00\xa2\xff\xd7\x01\x17\x00\xa3\xff\xd7\x01\x17\x00\xa4\xff\ +\xd7\x01\x17\x00\xa5\xff\xd7\x01\x17\x00\xa6\xff\xd7\x01\x17\x00\ +\xa7\xff\xd7\x01\x17\x00\xa8\xff\xd7\x01\x17\x00\xa9\xff\xd7\x01\ +\x17\x00\xaa\xff\xd7\x01\x17\x00\xab\xff\xd7\x01\x17\x00\xac\xff\ +\xd7\x01\x17\x00\xad\xff\xd7\x01\x17\x00\xb4\xff\xd7\x01\x17\x00\ +\xb5\xff\xd7\x01\x17\x00\xb6\xff\xd7\x01\x17\x00\xb7\xff\xd7\x01\ +\x17\x00\xb8\xff\xd7\x01\x17\x00\xba\xff\xd7\x01\x17\x00\xc3\xff\ +\xd7\x01\x17\x00\xc5\xff\xd7\x01\x17\x00\xc7\xff\xd7\x01\x17\x00\ +\xc9\xff\xd7\x01\x17\x00\xcb\xff\xd7\x01\x17\x00\xcd\xff\xd7\x01\ +\x17\x00\xcf\xff\xd7\x01\x17\x00\xd1\xff\xd7\x01\x17\x00\xd3\xff\ +\xd7\x01\x17\x00\xd5\xff\xd7\x01\x17\x00\xd7\xff\xd7\x01\x17\x00\ +\xd9\xff\xd7\x01\x17\x00\xdb\xff\xd7\x01\x17\x00\xdd\xff\xd7\x01\ +\x17\x00\xdf\xff\xec\x01\x17\x00\xe1\xff\xec\x01\x17\x00\xe3\xff\ +\xec\x01\x17\x00\xe5\xff\xec\x01\x17\x01\x0f\xff\xd7\x01\x17\x01\ +\x11\xff\xd7\x01\x17\x01\x13\xff\xd7\x01\x17\x01\x15\xff\xd7\x01\ +\x17\x01D\xff\xd7\x01\x17\x01F\xff\xd7\x01\x17\x01H\xff\ +\xd7\x01\x17\x02\x07\x00R\x01\x17\x02\x0b\x00R\x01\x17\x02\ +Y\xff\xd7\x01\x17\x02`\xff\xd7\x01\x17\x03\x1e\xff\xd7\x01\ +\x17\x03 \xff\xd7\x01\x17\x03\x22\xff\xd7\x01\x17\x03&\xff\ +\xd7\x01\x17\x03(\xff\xd7\x01\x17\x03*\xff\xd7\x01\x17\x03\ +,\xff\xd7\x01\x17\x03.\xff\xd7\x01\x17\x030\xff\xd7\x01\ +\x17\x032\xff\xd7\x01\x17\x034\xff\xd7\x01\x17\x036\xff\ +\xd7\x01\x17\x038\xff\xd7\x01\x17\x03:\xff\xd7\x01\x17\x03\ +<\xff\xd7\x01\x17\x03@\xff\xd7\x01\x17\x03B\xff\xd7\x01\ +\x17\x03D\xff\xd7\x01\x17\x03J\xff\xd7\x01\x17\x03L\xff\ +\xd7\x01\x17\x03N\xff\xd7\x01\x17\x03R\xff\xd7\x01\x17\x03\ +T\xff\xd7\x01\x17\x03V\xff\xd7\x01\x17\x03X\xff\xd7\x01\ +\x17\x03Z\xff\xd7\x01\x17\x03\x5c\xff\xd7\x01\x17\x03^\xff\ +\xd7\x01\x17\x03`\xff\xd7\x01\x19\x00\x05\x00R\x01\x19\x00\ +\x0a\x00R\x01\x19\x00D\xff\xd7\x01\x19\x00F\xff\xd7\x01\ +\x19\x00G\xff\xd7\x01\x19\x00H\xff\xd7\x01\x19\x00J\xff\ +\xec\x01\x19\x00R\xff\xd7\x01\x19\x00T\xff\xd7\x01\x19\x00\ +\xa2\xff\xd7\x01\x19\x00\xa3\xff\xd7\x01\x19\x00\xa4\xff\xd7\x01\ +\x19\x00\xa5\xff\xd7\x01\x19\x00\xa6\xff\xd7\x01\x19\x00\xa7\xff\ +\xd7\x01\x19\x00\xa8\xff\xd7\x01\x19\x00\xa9\xff\xd7\x01\x19\x00\ +\xaa\xff\xd7\x01\x19\x00\xab\xff\xd7\x01\x19\x00\xac\xff\xd7\x01\ +\x19\x00\xad\xff\xd7\x01\x19\x00\xb4\xff\xd7\x01\x19\x00\xb5\xff\ +\xd7\x01\x19\x00\xb6\xff\xd7\x01\x19\x00\xb7\xff\xd7\x01\x19\x00\ +\xb8\xff\xd7\x01\x19\x00\xba\xff\xd7\x01\x19\x00\xc3\xff\xd7\x01\ +\x19\x00\xc5\xff\xd7\x01\x19\x00\xc7\xff\xd7\x01\x19\x00\xc9\xff\ +\xd7\x01\x19\x00\xcb\xff\xd7\x01\x19\x00\xcd\xff\xd7\x01\x19\x00\ +\xcf\xff\xd7\x01\x19\x00\xd1\xff\xd7\x01\x19\x00\xd3\xff\xd7\x01\ +\x19\x00\xd5\xff\xd7\x01\x19\x00\xd7\xff\xd7\x01\x19\x00\xd9\xff\ +\xd7\x01\x19\x00\xdb\xff\xd7\x01\x19\x00\xdd\xff\xd7\x01\x19\x00\ +\xdf\xff\xec\x01\x19\x00\xe1\xff\xec\x01\x19\x00\xe3\xff\xec\x01\ +\x19\x00\xe5\xff\xec\x01\x19\x01\x0f\xff\xd7\x01\x19\x01\x11\xff\ +\xd7\x01\x19\x01\x13\xff\xd7\x01\x19\x01\x15\xff\xd7\x01\x19\x01\ +D\xff\xd7\x01\x19\x01F\xff\xd7\x01\x19\x01H\xff\xd7\x01\ +\x19\x02\x07\x00R\x01\x19\x02\x0b\x00R\x01\x19\x02Y\xff\ +\xd7\x01\x19\x02`\xff\xd7\x01\x19\x03\x1e\xff\xd7\x01\x19\x03\ + \xff\xd7\x01\x19\x03\x22\xff\xd7\x01\x19\x03&\xff\xd7\x01\ +\x19\x03(\xff\xd7\x01\x19\x03*\xff\xd7\x01\x19\x03,\xff\ +\xd7\x01\x19\x03.\xff\xd7\x01\x19\x030\xff\xd7\x01\x19\x03\ +2\xff\xd7\x01\x19\x034\xff\xd7\x01\x19\x036\xff\xd7\x01\ +\x19\x038\xff\xd7\x01\x19\x03:\xff\xd7\x01\x19\x03<\xff\ +\xd7\x01\x19\x03@\xff\xd7\x01\x19\x03B\xff\xd7\x01\x19\x03\ +D\xff\xd7\x01\x19\x03J\xff\xd7\x01\x19\x03L\xff\xd7\x01\ +\x19\x03N\xff\xd7\x01\x19\x03R\xff\xd7\x01\x19\x03T\xff\ +\xd7\x01\x19\x03V\xff\xd7\x01\x19\x03X\xff\xd7\x01\x19\x03\ +Z\xff\xd7\x01\x19\x03\x5c\xff\xd7\x01\x19\x03^\xff\xd7\x01\ +\x19\x03`\xff\xd7\x01\x1b\x00\x05\x00R\x01\x1b\x00\x0a\x00\ +R\x01\x1b\x00D\xff\xd7\x01\x1b\x00F\xff\xd7\x01\x1b\x00\ +G\xff\xd7\x01\x1b\x00H\xff\xd7\x01\x1b\x00J\xff\xec\x01\ +\x1b\x00R\xff\xd7\x01\x1b\x00T\xff\xd7\x01\x1b\x00\xa2\xff\ +\xd7\x01\x1b\x00\xa3\xff\xd7\x01\x1b\x00\xa4\xff\xd7\x01\x1b\x00\ +\xa5\xff\xd7\x01\x1b\x00\xa6\xff\xd7\x01\x1b\x00\xa7\xff\xd7\x01\ +\x1b\x00\xa8\xff\xd7\x01\x1b\x00\xa9\xff\xd7\x01\x1b\x00\xaa\xff\ +\xd7\x01\x1b\x00\xab\xff\xd7\x01\x1b\x00\xac\xff\xd7\x01\x1b\x00\ +\xad\xff\xd7\x01\x1b\x00\xb4\xff\xd7\x01\x1b\x00\xb5\xff\xd7\x01\ +\x1b\x00\xb6\xff\xd7\x01\x1b\x00\xb7\xff\xd7\x01\x1b\x00\xb8\xff\ +\xd7\x01\x1b\x00\xba\xff\xd7\x01\x1b\x00\xc3\xff\xd7\x01\x1b\x00\ +\xc5\xff\xd7\x01\x1b\x00\xc7\xff\xd7\x01\x1b\x00\xc9\xff\xd7\x01\ +\x1b\x00\xcb\xff\xd7\x01\x1b\x00\xcd\xff\xd7\x01\x1b\x00\xcf\xff\ +\xd7\x01\x1b\x00\xd1\xff\xd7\x01\x1b\x00\xd3\xff\xd7\x01\x1b\x00\ +\xd5\xff\xd7\x01\x1b\x00\xd7\xff\xd7\x01\x1b\x00\xd9\xff\xd7\x01\ +\x1b\x00\xdb\xff\xd7\x01\x1b\x00\xdd\xff\xd7\x01\x1b\x00\xdf\xff\ +\xec\x01\x1b\x00\xe1\xff\xec\x01\x1b\x00\xe3\xff\xec\x01\x1b\x00\ +\xe5\xff\xec\x01\x1b\x01\x0f\xff\xd7\x01\x1b\x01\x11\xff\xd7\x01\ +\x1b\x01\x13\xff\xd7\x01\x1b\x01\x15\xff\xd7\x01\x1b\x01D\xff\ +\xd7\x01\x1b\x01F\xff\xd7\x01\x1b\x01H\xff\xd7\x01\x1b\x02\ +\x07\x00R\x01\x1b\x02\x0b\x00R\x01\x1b\x02Y\xff\xd7\x01\ +\x1b\x02`\xff\xd7\x01\x1b\x03\x1e\xff\xd7\x01\x1b\x03 \xff\ +\xd7\x01\x1b\x03\x22\xff\xd7\x01\x1b\x03&\xff\xd7\x01\x1b\x03\ +(\xff\xd7\x01\x1b\x03*\xff\xd7\x01\x1b\x03,\xff\xd7\x01\ +\x1b\x03.\xff\xd7\x01\x1b\x030\xff\xd7\x01\x1b\x032\xff\ +\xd7\x01\x1b\x034\xff\xd7\x01\x1b\x036\xff\xd7\x01\x1b\x03\ +8\xff\xd7\x01\x1b\x03:\xff\xd7\x01\x1b\x03<\xff\xd7\x01\ +\x1b\x03@\xff\xd7\x01\x1b\x03B\xff\xd7\x01\x1b\x03D\xff\ +\xd7\x01\x1b\x03J\xff\xd7\x01\x1b\x03L\xff\xd7\x01\x1b\x03\ +N\xff\xd7\x01\x1b\x03R\xff\xd7\x01\x1b\x03T\xff\xd7\x01\ +\x1b\x03V\xff\xd7\x01\x1b\x03X\xff\xd7\x01\x1b\x03Z\xff\ +\xd7\x01\x1b\x03\x5c\xff\xd7\x01\x1b\x03^\xff\xd7\x01\x1b\x03\ +`\xff\xd7\x01$\x00\x0f\xff\x85\x01$\x00\x10\xff\xae\x01\ +$\x00\x11\xff\x85\x01$\x00\x22\x00)\x01$\x00$\xff\ +q\x01$\x00&\xff\xd7\x01$\x00*\xff\xd7\x01$\x00\ +2\xff\xd7\x01$\x004\xff\xd7\x01$\x007\x00)\x01\ +$\x00D\xff\x5c\x01$\x00F\xffq\x01$\x00G\xff\ +q\x01$\x00H\xffq\x01$\x00J\xffq\x01$\x00\ +P\xff\x9a\x01$\x00Q\xff\x9a\x01$\x00R\xffq\x01\ +$\x00S\xff\x9a\x01$\x00T\xffq\x01$\x00U\xff\ +\x9a\x01$\x00V\xff\x85\x01$\x00X\xff\x9a\x01$\x00\ +Y\xff\xd7\x01$\x00Z\xff\xd7\x01$\x00[\xff\xd7\x01\ +$\x00\x5c\xff\xd7\x01$\x00]\xff\xae\x01$\x00\x82\xff\ +q\x01$\x00\x83\xffq\x01$\x00\x84\xffq\x01$\x00\ +\x85\xffq\x01$\x00\x86\xffq\x01$\x00\x87\xffq\x01\ +$\x00\x89\xff\xd7\x01$\x00\x94\xff\xd7\x01$\x00\x95\xff\ +\xd7\x01$\x00\x96\xff\xd7\x01$\x00\x97\xff\xd7\x01$\x00\ +\x98\xff\xd7\x01$\x00\x9a\xff\xd7\x01$\x00\xa2\xffq\x01\ +$\x00\xa3\xff\x5c\x01$\x00\xa4\xff\x5c\x01$\x00\xa5\xff\ +\x5c\x01$\x00\xa6\xff\x5c\x01$\x00\xa7\xff\x5c\x01$\x00\ +\xa8\xff\x5c\x01$\x00\xa9\xffq\x01$\x00\xaa\xffq\x01\ +$\x00\xab\xffq\x01$\x00\xac\xffq\x01$\x00\xad\xff\ +q\x01$\x00\xb4\xffq\x01$\x00\xb5\xffq\x01$\x00\ +\xb6\xffq\x01$\x00\xb7\xffq\x01$\x00\xb8\xffq\x01\ +$\x00\xba\xffq\x01$\x00\xbb\xff\x9a\x01$\x00\xbc\xff\ +\x9a\x01$\x00\xbd\xff\x9a\x01$\x00\xbe\xff\x9a\x01$\x00\ +\xbf\xff\xd7\x01$\x00\xc2\xffq\x01$\x00\xc3\xff\x5c\x01\ +$\x00\xc4\xffq\x01$\x00\xc5\xff\x5c\x01$\x00\xc6\xff\ +q\x01$\x00\xc7\xff\x5c\x01$\x00\xc8\xff\xd7\x01$\x00\ +\xc9\xffq\x01$\x00\xca\xff\xd7\x01$\x00\xcb\xffq\x01\ +$\x00\xcc\xff\xd7\x01$\x00\xcd\xffq\x01$\x00\xce\xff\ +\xd7\x01$\x00\xcf\xffq\x01$\x00\xd1\xffq\x01$\x00\ +\xd3\xffq\x01$\x00\xd5\xffq\x01$\x00\xd7\xffq\x01\ +$\x00\xd9\xffq\x01$\x00\xdb\xffq\x01$\x00\xdd\xff\ +q\x01$\x00\xde\xff\xd7\x01$\x00\xdf\xffq\x01$\x00\ +\xe0\xff\xd7\x01$\x00\xe1\xffq\x01$\x00\xe2\xff\xd7\x01\ +$\x00\xe3\xffq\x01$\x00\xe4\xff\xd7\x01$\x00\xe5\xff\ +q\x01$\x00\xfa\xff\x9a\x01$\x01\x06\xff\x9a\x01$\x01\ +\x08\xff\x9a\x01$\x01\x0d\xff\x9a\x01$\x01\x0e\xff\xd7\x01\ +$\x01\x0f\xffq\x01$\x01\x10\xff\xd7\x01$\x01\x11\xff\ +q\x01$\x01\x12\xff\xd7\x01$\x01\x13\xffq\x01$\x01\ +\x14\xff\xd7\x01$\x01\x15\xffq\x01$\x01\x17\xff\x9a\x01\ +$\x01\x19\xff\x9a\x01$\x01\x1d\xff\x85\x01$\x01!\xff\ +\x85\x01$\x01$\x00)\x01$\x01&\x00)\x01$\x01\ ++\xff\x9a\x01$\x01-\xff\x9a\x01$\x01/\xff\x9a\x01\ +$\x011\xff\x9a\x01$\x013\xff\x9a\x01$\x015\xff\ +\x9a\x01$\x017\xff\xd7\x01$\x01<\xff\xae\x01$\x01\ +>\xff\xae\x01$\x01@\xff\xae\x01$\x01C\xffq\x01\ +$\x01D\xff\x5c\x01$\x01F\xff\x5c\x01$\x01G\xff\ +\xd7\x01$\x01H\xffq\x01$\x01J\xff\x85\x01$\x01\ +\xfb\xff\xd7\x01$\x01\xfd\xff\xd7\x01$\x02\x02\xff\xae\x01\ +$\x02\x03\xff\xae\x01$\x02\x04\xff\xae\x01$\x02\x08\xff\ +\x85\x01$\x02\x0c\xff\x85\x01$\x02W\xff\x9a\x01$\x02\ +X\xffq\x01$\x02Y\xff\x5c\x01$\x02_\xff\xd7\x01\ +$\x02`\xffq\x01$\x02b\xff\x9a\x01$\x03\x1d\xff\ +q\x01$\x03\x1e\xff\x5c\x01$\x03\x1f\xffq\x01$\x03\ + \xff\x5c\x01$\x03!\xffq\x01$\x03\x22\xff\x5c\x01\ +$\x03#\xffq\x01$\x03%\xffq\x01$\x03&\xff\ +\x5c\x01$\x03'\xffq\x01$\x03(\xff\x5c\x01$\x03\ +)\xffq\x01$\x03*\xff\x5c\x01$\x03+\xffq\x01\ +$\x03,\xff\x5c\x01$\x03-\xffq\x01$\x03.\xff\ +\x5c\x01$\x03/\xffq\x01$\x030\xff\x5c\x01$\x03\ +1\xffq\x01$\x032\xff\x5c\x01$\x033\xffq\x01\ +$\x034\xff\x5c\x01$\x036\xffq\x01$\x038\xff\ +q\x01$\x03:\xffq\x01$\x03<\xffq\x01$\x03\ +@\xffq\x01$\x03B\xffq\x01$\x03D\xffq\x01\ +$\x03I\xff\xd7\x01$\x03J\xffq\x01$\x03K\xff\ +\xd7\x01$\x03L\xffq\x01$\x03M\xff\xd7\x01$\x03\ +N\xffq\x01$\x03O\xff\xd7\x01$\x03Q\xff\xd7\x01\ +$\x03R\xffq\x01$\x03S\xff\xd7\x01$\x03T\xff\ +q\x01$\x03U\xff\xd7\x01$\x03V\xffq\x01$\x03\ +W\xff\xd7\x01$\x03X\xffq\x01$\x03Y\xff\xd7\x01\ +$\x03Z\xffq\x01$\x03[\xff\xd7\x01$\x03\x5c\xff\ +q\x01$\x03]\xff\xd7\x01$\x03^\xffq\x01$\x03\ +_\xff\xd7\x01$\x03`\xffq\x01$\x03b\xff\x9a\x01\ +$\x03d\xff\x9a\x01$\x03f\xff\x9a\x01$\x03h\xff\ +\x9a\x01$\x03j\xff\x9a\x01$\x03l\xff\x9a\x01$\x03\ +n\xff\x9a\x01$\x03p\xff\xd7\x01$\x03\x8f\x00)\x01\ +%\x00\x05\x00)\x01%\x00\x0a\x00)\x01%\x02\x07\x00\ +)\x01%\x02\x0b\x00)\x01&\x00\x0f\xff\x85\x01&\x00\ +\x10\xff\xae\x01&\x00\x11\xff\x85\x01&\x00\x22\x00)\x01\ +&\x00$\xffq\x01&\x00&\xff\xd7\x01&\x00*\xff\ +\xd7\x01&\x002\xff\xd7\x01&\x004\xff\xd7\x01&\x00\ +7\x00)\x01&\x00D\xff\x5c\x01&\x00F\xffq\x01\ +&\x00G\xffq\x01&\x00H\xffq\x01&\x00J\xff\ +q\x01&\x00P\xff\x9a\x01&\x00Q\xff\x9a\x01&\x00\ +R\xffq\x01&\x00S\xff\x9a\x01&\x00T\xffq\x01\ +&\x00U\xff\x9a\x01&\x00V\xff\x85\x01&\x00X\xff\ +\x9a\x01&\x00Y\xff\xd7\x01&\x00Z\xff\xd7\x01&\x00\ +[\xff\xd7\x01&\x00\x5c\xff\xd7\x01&\x00]\xff\xae\x01\ +&\x00\x82\xffq\x01&\x00\x83\xffq\x01&\x00\x84\xff\ +q\x01&\x00\x85\xffq\x01&\x00\x86\xffq\x01&\x00\ +\x87\xffq\x01&\x00\x89\xff\xd7\x01&\x00\x94\xff\xd7\x01\ +&\x00\x95\xff\xd7\x01&\x00\x96\xff\xd7\x01&\x00\x97\xff\ +\xd7\x01&\x00\x98\xff\xd7\x01&\x00\x9a\xff\xd7\x01&\x00\ +\xa2\xffq\x01&\x00\xa3\xff\x5c\x01&\x00\xa4\xff\x5c\x01\ +&\x00\xa5\xff\x5c\x01&\x00\xa6\xff\x5c\x01&\x00\xa7\xff\ +\x5c\x01&\x00\xa8\xff\x5c\x01&\x00\xa9\xffq\x01&\x00\ +\xaa\xffq\x01&\x00\xab\xffq\x01&\x00\xac\xffq\x01\ +&\x00\xad\xffq\x01&\x00\xb4\xffq\x01&\x00\xb5\xff\ +q\x01&\x00\xb6\xffq\x01&\x00\xb7\xffq\x01&\x00\ +\xb8\xffq\x01&\x00\xba\xffq\x01&\x00\xbb\xff\x9a\x01\ +&\x00\xbc\xff\x9a\x01&\x00\xbd\xff\x9a\x01&\x00\xbe\xff\ +\x9a\x01&\x00\xbf\xff\xd7\x01&\x00\xc2\xffq\x01&\x00\ +\xc3\xff\x5c\x01&\x00\xc4\xffq\x01&\x00\xc5\xff\x5c\x01\ +&\x00\xc6\xffq\x01&\x00\xc7\xff\x5c\x01&\x00\xc8\xff\ +\xd7\x01&\x00\xc9\xffq\x01&\x00\xca\xff\xd7\x01&\x00\ +\xcb\xffq\x01&\x00\xcc\xff\xd7\x01&\x00\xcd\xffq\x01\ +&\x00\xce\xff\xd7\x01&\x00\xcf\xffq\x01&\x00\xd1\xff\ +q\x01&\x00\xd3\xffq\x01&\x00\xd5\xffq\x01&\x00\ +\xd7\xffq\x01&\x00\xd9\xffq\x01&\x00\xdb\xffq\x01\ +&\x00\xdd\xffq\x01&\x00\xde\xff\xd7\x01&\x00\xdf\xff\ +q\x01&\x00\xe0\xff\xd7\x01&\x00\xe1\xffq\x01&\x00\ +\xe2\xff\xd7\x01&\x00\xe3\xffq\x01&\x00\xe4\xff\xd7\x01\ +&\x00\xe5\xffq\x01&\x00\xfa\xff\x9a\x01&\x01\x06\xff\ +\x9a\x01&\x01\x08\xff\x9a\x01&\x01\x0d\xff\x9a\x01&\x01\ +\x0e\xff\xd7\x01&\x01\x0f\xffq\x01&\x01\x10\xff\xd7\x01\ +&\x01\x11\xffq\x01&\x01\x12\xff\xd7\x01&\x01\x13\xff\ +q\x01&\x01\x14\xff\xd7\x01&\x01\x15\xffq\x01&\x01\ +\x17\xff\x9a\x01&\x01\x19\xff\x9a\x01&\x01\x1d\xff\x85\x01\ +&\x01!\xff\x85\x01&\x01$\x00)\x01&\x01&\x00\ +)\x01&\x01+\xff\x9a\x01&\x01-\xff\x9a\x01&\x01\ +/\xff\x9a\x01&\x011\xff\x9a\x01&\x013\xff\x9a\x01\ +&\x015\xff\x9a\x01&\x017\xff\xd7\x01&\x01<\xff\ +\xae\x01&\x01>\xff\xae\x01&\x01@\xff\xae\x01&\x01\ +C\xffq\x01&\x01D\xff\x5c\x01&\x01F\xff\x5c\x01\ +&\x01G\xff\xd7\x01&\x01H\xffq\x01&\x01J\xff\ +\x85\x01&\x01\xfb\xff\xd7\x01&\x01\xfd\xff\xd7\x01&\x02\ +\x02\xff\xae\x01&\x02\x03\xff\xae\x01&\x02\x04\xff\xae\x01\ +&\x02\x08\xff\x85\x01&\x02\x0c\xff\x85\x01&\x02W\xff\ +\x9a\x01&\x02X\xffq\x01&\x02Y\xff\x5c\x01&\x02\ +_\xff\xd7\x01&\x02`\xffq\x01&\x02b\xff\x9a\x01\ +&\x03\x1d\xffq\x01&\x03\x1e\xff\x5c\x01&\x03\x1f\xff\ +q\x01&\x03 \xff\x5c\x01&\x03!\xffq\x01&\x03\ +\x22\xff\x5c\x01&\x03#\xffq\x01&\x03%\xffq\x01\ +&\x03&\xff\x5c\x01&\x03'\xffq\x01&\x03(\xff\ +\x5c\x01&\x03)\xffq\x01&\x03*\xff\x5c\x01&\x03\ ++\xffq\x01&\x03,\xff\x5c\x01&\x03-\xffq\x01\ +&\x03.\xff\x5c\x01&\x03/\xffq\x01&\x030\xff\ +\x5c\x01&\x031\xffq\x01&\x032\xff\x5c\x01&\x03\ +3\xffq\x01&\x034\xff\x5c\x01&\x036\xffq\x01\ +&\x038\xffq\x01&\x03:\xffq\x01&\x03<\xff\ +q\x01&\x03@\xffq\x01&\x03B\xffq\x01&\x03\ +D\xffq\x01&\x03I\xff\xd7\x01&\x03J\xffq\x01\ +&\x03K\xff\xd7\x01&\x03L\xffq\x01&\x03M\xff\ +\xd7\x01&\x03N\xffq\x01&\x03O\xff\xd7\x01&\x03\ +Q\xff\xd7\x01&\x03R\xffq\x01&\x03S\xff\xd7\x01\ +&\x03T\xffq\x01&\x03U\xff\xd7\x01&\x03V\xff\ +q\x01&\x03W\xff\xd7\x01&\x03X\xffq\x01&\x03\ +Y\xff\xd7\x01&\x03Z\xffq\x01&\x03[\xff\xd7\x01\ +&\x03\x5c\xffq\x01&\x03]\xff\xd7\x01&\x03^\xff\ +q\x01&\x03_\xff\xd7\x01&\x03`\xffq\x01&\x03\ +b\xff\x9a\x01&\x03d\xff\x9a\x01&\x03f\xff\x9a\x01\ +&\x03h\xff\x9a\x01&\x03j\xff\x9a\x01&\x03l\xff\ +\x9a\x01&\x03n\xff\x9a\x01&\x03p\xff\xd7\x01&\x03\ +\x8f\x00)\x01'\x00\x05\x00)\x01'\x00\x0a\x00)\x01\ +'\x02\x07\x00)\x01'\x02\x0b\x00)\x01(\x00\x0f\xff\ +\x85\x01(\x00\x10\xff\xae\x01(\x00\x11\xff\x85\x01(\x00\ +\x22\x00)\x01(\x00$\xffq\x01(\x00&\xff\xd7\x01\ +(\x00*\xff\xd7\x01(\x002\xff\xd7\x01(\x004\xff\ +\xd7\x01(\x007\x00)\x01(\x00D\xff\x5c\x01(\x00\ +F\xffq\x01(\x00G\xffq\x01(\x00H\xffq\x01\ +(\x00J\xffq\x01(\x00P\xff\x9a\x01(\x00Q\xff\ +\x9a\x01(\x00R\xffq\x01(\x00S\xff\x9a\x01(\x00\ +T\xffq\x01(\x00U\xff\x9a\x01(\x00V\xff\x85\x01\ +(\x00X\xff\x9a\x01(\x00Y\xff\xd7\x01(\x00Z\xff\ +\xd7\x01(\x00[\xff\xd7\x01(\x00\x5c\xff\xd7\x01(\x00\ +]\xff\xae\x01(\x00\x82\xffq\x01(\x00\x83\xffq\x01\ +(\x00\x84\xffq\x01(\x00\x85\xffq\x01(\x00\x86\xff\ +q\x01(\x00\x87\xffq\x01(\x00\x89\xff\xd7\x01(\x00\ +\x94\xff\xd7\x01(\x00\x95\xff\xd7\x01(\x00\x96\xff\xd7\x01\ +(\x00\x97\xff\xd7\x01(\x00\x98\xff\xd7\x01(\x00\x9a\xff\ +\xd7\x01(\x00\xa2\xffq\x01(\x00\xa3\xff\x5c\x01(\x00\ +\xa4\xff\x5c\x01(\x00\xa5\xff\x5c\x01(\x00\xa6\xff\x5c\x01\ +(\x00\xa7\xff\x5c\x01(\x00\xa8\xff\x5c\x01(\x00\xa9\xff\ +q\x01(\x00\xaa\xffq\x01(\x00\xab\xffq\x01(\x00\ +\xac\xffq\x01(\x00\xad\xffq\x01(\x00\xb4\xffq\x01\ +(\x00\xb5\xffq\x01(\x00\xb6\xffq\x01(\x00\xb7\xff\ +q\x01(\x00\xb8\xffq\x01(\x00\xba\xffq\x01(\x00\ +\xbb\xff\x9a\x01(\x00\xbc\xff\x9a\x01(\x00\xbd\xff\x9a\x01\ +(\x00\xbe\xff\x9a\x01(\x00\xbf\xff\xd7\x01(\x00\xc2\xff\ +q\x01(\x00\xc3\xff\x5c\x01(\x00\xc4\xffq\x01(\x00\ +\xc5\xff\x5c\x01(\x00\xc6\xffq\x01(\x00\xc7\xff\x5c\x01\ +(\x00\xc8\xff\xd7\x01(\x00\xc9\xffq\x01(\x00\xca\xff\ +\xd7\x01(\x00\xcb\xffq\x01(\x00\xcc\xff\xd7\x01(\x00\ +\xcd\xffq\x01(\x00\xce\xff\xd7\x01(\x00\xcf\xffq\x01\ +(\x00\xd1\xffq\x01(\x00\xd3\xffq\x01(\x00\xd5\xff\ +q\x01(\x00\xd7\xffq\x01(\x00\xd9\xffq\x01(\x00\ +\xdb\xffq\x01(\x00\xdd\xffq\x01(\x00\xde\xff\xd7\x01\ +(\x00\xdf\xffq\x01(\x00\xe0\xff\xd7\x01(\x00\xe1\xff\ +q\x01(\x00\xe2\xff\xd7\x01(\x00\xe3\xffq\x01(\x00\ +\xe4\xff\xd7\x01(\x00\xe5\xffq\x01(\x00\xfa\xff\x9a\x01\ +(\x01\x06\xff\x9a\x01(\x01\x08\xff\x9a\x01(\x01\x0d\xff\ +\x9a\x01(\x01\x0e\xff\xd7\x01(\x01\x0f\xffq\x01(\x01\ +\x10\xff\xd7\x01(\x01\x11\xffq\x01(\x01\x12\xff\xd7\x01\ +(\x01\x13\xffq\x01(\x01\x14\xff\xd7\x01(\x01\x15\xff\ +q\x01(\x01\x17\xff\x9a\x01(\x01\x19\xff\x9a\x01(\x01\ +\x1d\xff\x85\x01(\x01!\xff\x85\x01(\x01$\x00)\x01\ +(\x01&\x00)\x01(\x01+\xff\x9a\x01(\x01-\xff\ +\x9a\x01(\x01/\xff\x9a\x01(\x011\xff\x9a\x01(\x01\ +3\xff\x9a\x01(\x015\xff\x9a\x01(\x017\xff\xd7\x01\ +(\x01<\xff\xae\x01(\x01>\xff\xae\x01(\x01@\xff\ +\xae\x01(\x01C\xffq\x01(\x01D\xff\x5c\x01(\x01\ +F\xff\x5c\x01(\x01G\xff\xd7\x01(\x01H\xffq\x01\ +(\x01J\xff\x85\x01(\x01\xfb\xff\xd7\x01(\x01\xfd\xff\ +\xd7\x01(\x02\x02\xff\xae\x01(\x02\x03\xff\xae\x01(\x02\ +\x04\xff\xae\x01(\x02\x08\xff\x85\x01(\x02\x0c\xff\x85\x01\ +(\x02W\xff\x9a\x01(\x02X\xffq\x01(\x02Y\xff\ +\x5c\x01(\x02_\xff\xd7\x01(\x02`\xffq\x01(\x02\ +b\xff\x9a\x01(\x03\x1d\xffq\x01(\x03\x1e\xff\x5c\x01\ +(\x03\x1f\xffq\x01(\x03 \xff\x5c\x01(\x03!\xff\ +q\x01(\x03\x22\xff\x5c\x01(\x03#\xffq\x01(\x03\ +%\xffq\x01(\x03&\xff\x5c\x01(\x03'\xffq\x01\ +(\x03(\xff\x5c\x01(\x03)\xffq\x01(\x03*\xff\ +\x5c\x01(\x03+\xffq\x01(\x03,\xff\x5c\x01(\x03\ +-\xffq\x01(\x03.\xff\x5c\x01(\x03/\xffq\x01\ +(\x030\xff\x5c\x01(\x031\xffq\x01(\x032\xff\ +\x5c\x01(\x033\xffq\x01(\x034\xff\x5c\x01(\x03\ +6\xffq\x01(\x038\xffq\x01(\x03:\xffq\x01\ +(\x03<\xffq\x01(\x03@\xffq\x01(\x03B\xff\ +q\x01(\x03D\xffq\x01(\x03I\xff\xd7\x01(\x03\ +J\xffq\x01(\x03K\xff\xd7\x01(\x03L\xffq\x01\ +(\x03M\xff\xd7\x01(\x03N\xffq\x01(\x03O\xff\ +\xd7\x01(\x03Q\xff\xd7\x01(\x03R\xffq\x01(\x03\ +S\xff\xd7\x01(\x03T\xffq\x01(\x03U\xff\xd7\x01\ +(\x03V\xffq\x01(\x03W\xff\xd7\x01(\x03X\xff\ +q\x01(\x03Y\xff\xd7\x01(\x03Z\xffq\x01(\x03\ +[\xff\xd7\x01(\x03\x5c\xffq\x01(\x03]\xff\xd7\x01\ +(\x03^\xffq\x01(\x03_\xff\xd7\x01(\x03`\xff\ +q\x01(\x03b\xff\x9a\x01(\x03d\xff\x9a\x01(\x03\ +f\xff\x9a\x01(\x03h\xff\x9a\x01(\x03j\xff\x9a\x01\ +(\x03l\xff\x9a\x01(\x03n\xff\x9a\x01(\x03p\xff\ +\xd7\x01(\x03\x8f\x00)\x01*\x00\x0f\xff\xd7\x01*\x00\ +\x11\xff\xd7\x01*\x00$\xff\xec\x01*\x00\x82\xff\xec\x01\ +*\x00\x83\xff\xec\x01*\x00\x84\xff\xec\x01*\x00\x85\xff\ +\xec\x01*\x00\x86\xff\xec\x01*\x00\x87\xff\xec\x01*\x00\ +\xc2\xff\xec\x01*\x00\xc4\xff\xec\x01*\x00\xc6\xff\xec\x01\ +*\x01C\xff\xec\x01*\x02\x08\xff\xd7\x01*\x02\x0c\xff\ +\xd7\x01*\x02X\xff\xec\x01*\x03\x1d\xff\xec\x01*\x03\ +\x1f\xff\xec\x01*\x03!\xff\xec\x01*\x03#\xff\xec\x01\ +*\x03%\xff\xec\x01*\x03'\xff\xec\x01*\x03)\xff\ +\xec\x01*\x03+\xff\xec\x01*\x03-\xff\xec\x01*\x03\ +/\xff\xec\x01*\x031\xff\xec\x01*\x033\xff\xec\x01\ +,\x00\x0f\xff\xd7\x01,\x00\x11\xff\xd7\x01,\x00$\xff\ +\xec\x01,\x00\x82\xff\xec\x01,\x00\x83\xff\xec\x01,\x00\ +\x84\xff\xec\x01,\x00\x85\xff\xec\x01,\x00\x86\xff\xec\x01\ +,\x00\x87\xff\xec\x01,\x00\xc2\xff\xec\x01,\x00\xc4\xff\ +\xec\x01,\x00\xc6\xff\xec\x01,\x01C\xff\xec\x01,\x02\ +\x08\xff\xd7\x01,\x02\x0c\xff\xd7\x01,\x02X\xff\xec\x01\ +,\x03\x1d\xff\xec\x01,\x03\x1f\xff\xec\x01,\x03!\xff\ +\xec\x01,\x03#\xff\xec\x01,\x03%\xff\xec\x01,\x03\ +'\xff\xec\x01,\x03)\xff\xec\x01,\x03+\xff\xec\x01\ +,\x03-\xff\xec\x01,\x03/\xff\xec\x01,\x031\xff\ +\xec\x01,\x033\xff\xec\x01.\x00\x0f\xff\xd7\x01.\x00\ +\x11\xff\xd7\x01.\x00$\xff\xec\x01.\x00\x82\xff\xec\x01\ +.\x00\x83\xff\xec\x01.\x00\x84\xff\xec\x01.\x00\x85\xff\ +\xec\x01.\x00\x86\xff\xec\x01.\x00\x87\xff\xec\x01.\x00\ +\xc2\xff\xec\x01.\x00\xc4\xff\xec\x01.\x00\xc6\xff\xec\x01\ +.\x01C\xff\xec\x01.\x02\x08\xff\xd7\x01.\x02\x0c\xff\ +\xd7\x01.\x02X\xff\xec\x01.\x03\x1d\xff\xec\x01.\x03\ +\x1f\xff\xec\x01.\x03!\xff\xec\x01.\x03#\xff\xec\x01\ +.\x03%\xff\xec\x01.\x03'\xff\xec\x01.\x03)\xff\ +\xec\x01.\x03+\xff\xec\x01.\x03-\xff\xec\x01.\x03\ +/\xff\xec\x01.\x031\xff\xec\x01.\x033\xff\xec\x01\ +0\x00\x0f\xff\xd7\x010\x00\x11\xff\xd7\x010\x00$\xff\ +\xec\x010\x00\x82\xff\xec\x010\x00\x83\xff\xec\x010\x00\ +\x84\xff\xec\x010\x00\x85\xff\xec\x010\x00\x86\xff\xec\x01\ +0\x00\x87\xff\xec\x010\x00\xc2\xff\xec\x010\x00\xc4\xff\ +\xec\x010\x00\xc6\xff\xec\x010\x01C\xff\xec\x010\x02\ +\x08\xff\xd7\x010\x02\x0c\xff\xd7\x010\x02X\xff\xec\x01\ +0\x03\x1d\xff\xec\x010\x03\x1f\xff\xec\x010\x03!\xff\ +\xec\x010\x03#\xff\xec\x010\x03%\xff\xec\x010\x03\ +'\xff\xec\x010\x03)\xff\xec\x010\x03+\xff\xec\x01\ +0\x03-\xff\xec\x010\x03/\xff\xec\x010\x031\xff\ +\xec\x010\x033\xff\xec\x012\x00\x0f\xff\xd7\x012\x00\ +\x11\xff\xd7\x012\x00$\xff\xec\x012\x00\x82\xff\xec\x01\ +2\x00\x83\xff\xec\x012\x00\x84\xff\xec\x012\x00\x85\xff\ +\xec\x012\x00\x86\xff\xec\x012\x00\x87\xff\xec\x012\x00\ +\xc2\xff\xec\x012\x00\xc4\xff\xec\x012\x00\xc6\xff\xec\x01\ +2\x01C\xff\xec\x012\x02\x08\xff\xd7\x012\x02\x0c\xff\ +\xd7\x012\x02X\xff\xec\x012\x03\x1d\xff\xec\x012\x03\ +\x1f\xff\xec\x012\x03!\xff\xec\x012\x03#\xff\xec\x01\ +2\x03%\xff\xec\x012\x03'\xff\xec\x012\x03)\xff\ +\xec\x012\x03+\xff\xec\x012\x03-\xff\xec\x012\x03\ +/\xff\xec\x012\x031\xff\xec\x012\x033\xff\xec\x01\ +4\x00\x0f\xff\xd7\x014\x00\x11\xff\xd7\x014\x00$\xff\ +\xec\x014\x00\x82\xff\xec\x014\x00\x83\xff\xec\x014\x00\ +\x84\xff\xec\x014\x00\x85\xff\xec\x014\x00\x86\xff\xec\x01\ +4\x00\x87\xff\xec\x014\x00\xc2\xff\xec\x014\x00\xc4\xff\ +\xec\x014\x00\xc6\xff\xec\x014\x01C\xff\xec\x014\x02\ +\x08\xff\xd7\x014\x02\x0c\xff\xd7\x014\x02X\xff\xec\x01\ +4\x03\x1d\xff\xec\x014\x03\x1f\xff\xec\x014\x03!\xff\ +\xec\x014\x03#\xff\xec\x014\x03%\xff\xec\x014\x03\ +'\xff\xec\x014\x03)\xff\xec\x014\x03+\xff\xec\x01\ +4\x03-\xff\xec\x014\x03/\xff\xec\x014\x031\xff\ +\xec\x014\x033\xff\xec\x016\x00\x0f\xff\x9a\x016\x00\ +\x11\xff\x9a\x016\x00\x22\x00)\x016\x00$\xff\xae\x01\ +6\x00&\xff\xec\x016\x00*\xff\xec\x016\x002\xff\ +\xec\x016\x004\xff\xec\x016\x00D\xff\xd7\x016\x00\ +F\xff\xd7\x016\x00G\xff\xd7\x016\x00H\xff\xd7\x01\ +6\x00J\xff\xec\x016\x00P\xff\xec\x016\x00Q\xff\ +\xec\x016\x00R\xff\xd7\x016\x00S\xff\xec\x016\x00\ +T\xff\xd7\x016\x00U\xff\xec\x016\x00V\xff\xec\x01\ +6\x00X\xff\xec\x016\x00\x82\xff\xae\x016\x00\x83\xff\ +\xae\x016\x00\x84\xff\xae\x016\x00\x85\xff\xae\x016\x00\ +\x86\xff\xae\x016\x00\x87\xff\xae\x016\x00\x89\xff\xec\x01\ +6\x00\x94\xff\xec\x016\x00\x95\xff\xec\x016\x00\x96\xff\ +\xec\x016\x00\x97\xff\xec\x016\x00\x98\xff\xec\x016\x00\ +\x9a\xff\xec\x016\x00\xa2\xff\xd7\x016\x00\xa3\xff\xd7\x01\ +6\x00\xa4\xff\xd7\x016\x00\xa5\xff\xd7\x016\x00\xa6\xff\ +\xd7\x016\x00\xa7\xff\xd7\x016\x00\xa8\xff\xd7\x016\x00\ +\xa9\xff\xd7\x016\x00\xaa\xff\xd7\x016\x00\xab\xff\xd7\x01\ +6\x00\xac\xff\xd7\x016\x00\xad\xff\xd7\x016\x00\xb4\xff\ +\xd7\x016\x00\xb5\xff\xd7\x016\x00\xb6\xff\xd7\x016\x00\ +\xb7\xff\xd7\x016\x00\xb8\xff\xd7\x016\x00\xba\xff\xd7\x01\ +6\x00\xbb\xff\xec\x016\x00\xbc\xff\xec\x016\x00\xbd\xff\ +\xec\x016\x00\xbe\xff\xec\x016\x00\xc2\xff\xae\x016\x00\ +\xc3\xff\xd7\x016\x00\xc4\xff\xae\x016\x00\xc5\xff\xd7\x01\ +6\x00\xc6\xff\xae\x016\x00\xc7\xff\xd7\x016\x00\xc8\xff\ +\xec\x016\x00\xc9\xff\xd7\x016\x00\xca\xff\xec\x016\x00\ +\xcb\xff\xd7\x016\x00\xcc\xff\xec\x016\x00\xcd\xff\xd7\x01\ +6\x00\xce\xff\xec\x016\x00\xcf\xff\xd7\x016\x00\xd1\xff\ +\xd7\x016\x00\xd3\xff\xd7\x016\x00\xd5\xff\xd7\x016\x00\ +\xd7\xff\xd7\x016\x00\xd9\xff\xd7\x016\x00\xdb\xff\xd7\x01\ +6\x00\xdd\xff\xd7\x016\x00\xde\xff\xec\x016\x00\xdf\xff\ +\xec\x016\x00\xe0\xff\xec\x016\x00\xe1\xff\xec\x016\x00\ +\xe2\xff\xec\x016\x00\xe3\xff\xec\x016\x00\xe4\xff\xec\x01\ +6\x00\xe5\xff\xec\x016\x00\xfa\xff\xec\x016\x01\x06\xff\ +\xec\x016\x01\x08\xff\xec\x016\x01\x0d\xff\xec\x016\x01\ +\x0e\xff\xec\x016\x01\x0f\xff\xd7\x016\x01\x10\xff\xec\x01\ +6\x01\x11\xff\xd7\x016\x01\x12\xff\xec\x016\x01\x13\xff\ +\xd7\x016\x01\x14\xff\xec\x016\x01\x15\xff\xd7\x016\x01\ +\x17\xff\xec\x016\x01\x19\xff\xec\x016\x01\x1d\xff\xec\x01\ +6\x01!\xff\xec\x016\x01+\xff\xec\x016\x01-\xff\ +\xec\x016\x01/\xff\xec\x016\x011\xff\xec\x016\x01\ +3\xff\xec\x016\x015\xff\xec\x016\x01C\xff\xae\x01\ +6\x01D\xff\xd7\x016\x01F\xff\xd7\x016\x01G\xff\ +\xec\x016\x01H\xff\xd7\x016\x01J\xff\xec\x016\x02\ +\x08\xff\x9a\x016\x02\x0c\xff\x9a\x016\x02W\xff\xec\x01\ +6\x02X\xff\xae\x016\x02Y\xff\xd7\x016\x02_\xff\ +\xec\x016\x02`\xff\xd7\x016\x02b\xff\xec\x016\x03\ +\x1d\xff\xae\x016\x03\x1e\xff\xd7\x016\x03\x1f\xff\xae\x01\ +6\x03 \xff\xd7\x016\x03!\xff\xae\x016\x03\x22\xff\ +\xd7\x016\x03#\xff\xae\x016\x03%\xff\xae\x016\x03\ +&\xff\xd7\x016\x03'\xff\xae\x016\x03(\xff\xd7\x01\ +6\x03)\xff\xae\x016\x03*\xff\xd7\x016\x03+\xff\ +\xae\x016\x03,\xff\xd7\x016\x03-\xff\xae\x016\x03\ +.\xff\xd7\x016\x03/\xff\xae\x016\x030\xff\xd7\x01\ +6\x031\xff\xae\x016\x032\xff\xd7\x016\x033\xff\ +\xae\x016\x034\xff\xd7\x016\x036\xff\xd7\x016\x03\ +8\xff\xd7\x016\x03:\xff\xd7\x016\x03<\xff\xd7\x01\ +6\x03@\xff\xd7\x016\x03B\xff\xd7\x016\x03D\xff\ +\xd7\x016\x03I\xff\xec\x016\x03J\xff\xd7\x016\x03\ +K\xff\xec\x016\x03L\xff\xd7\x016\x03M\xff\xec\x01\ +6\x03N\xff\xd7\x016\x03O\xff\xec\x016\x03Q\xff\ +\xec\x016\x03R\xff\xd7\x016\x03S\xff\xec\x016\x03\ +T\xff\xd7\x016\x03U\xff\xec\x016\x03V\xff\xd7\x01\ +6\x03W\xff\xec\x016\x03X\xff\xd7\x016\x03Y\xff\ +\xec\x016\x03Z\xff\xd7\x016\x03[\xff\xec\x016\x03\ +\x5c\xff\xd7\x016\x03]\xff\xec\x016\x03^\xff\xd7\x01\ +6\x03_\xff\xec\x016\x03`\xff\xd7\x016\x03b\xff\ +\xec\x016\x03d\xff\xec\x016\x03f\xff\xec\x016\x03\ +h\xff\xec\x016\x03j\xff\xec\x016\x03l\xff\xec\x01\ +6\x03n\xff\xec\x017\x00\x05\x00R\x017\x00\x0a\x00\ +R\x017\x00\x0f\xff\xae\x017\x00\x11\xff\xae\x017\x00\ +\x22\x00)\x017\x02\x07\x00R\x017\x02\x08\xff\xae\x01\ +7\x02\x0b\x00R\x017\x02\x0c\xff\xae\x018\x00\x0f\xff\ +\x85\x018\x00\x11\xff\x85\x018\x00\x22\x00)\x018\x00\ +$\xff\x85\x018\x00&\xff\xd7\x018\x00*\xff\xd7\x01\ +8\x002\xff\xd7\x018\x004\xff\xd7\x018\x00D\xff\ +\x9a\x018\x00F\xff\x9a\x018\x00G\xff\x9a\x018\x00\ +H\xff\x9a\x018\x00J\xff\xd7\x018\x00P\xff\xc3\x01\ +8\x00Q\xff\xc3\x018\x00R\xff\x9a\x018\x00S\xff\ +\xc3\x018\x00T\xff\x9a\x018\x00U\xff\xc3\x018\x00\ +V\xff\xae\x018\x00X\xff\xc3\x018\x00]\xff\xd7\x01\ +8\x00\x82\xff\x85\x018\x00\x83\xff\x85\x018\x00\x84\xff\ +\x85\x018\x00\x85\xff\x85\x018\x00\x86\xff\x85\x018\x00\ +\x87\xff\x85\x018\x00\x89\xff\xd7\x018\x00\x94\xff\xd7\x01\ +8\x00\x95\xff\xd7\x018\x00\x96\xff\xd7\x018\x00\x97\xff\ +\xd7\x018\x00\x98\xff\xd7\x018\x00\x9a\xff\xd7\x018\x00\ +\xa2\xff\x9a\x018\x00\xa3\xff\x9a\x018\x00\xa4\xff\x9a\x01\ +8\x00\xa5\xff\x9a\x018\x00\xa6\xff\x9a\x018\x00\xa7\xff\ +\x9a\x018\x00\xa8\xff\x9a\x018\x00\xa9\xff\x9a\x018\x00\ +\xaa\xff\x9a\x018\x00\xab\xff\x9a\x018\x00\xac\xff\x9a\x01\ +8\x00\xad\xff\x9a\x018\x00\xb4\xff\x9a\x018\x00\xb5\xff\ +\x9a\x018\x00\xb6\xff\x9a\x018\x00\xb7\xff\x9a\x018\x00\ +\xb8\xff\x9a\x018\x00\xba\xff\x9a\x018\x00\xbb\xff\xc3\x01\ +8\x00\xbc\xff\xc3\x018\x00\xbd\xff\xc3\x018\x00\xbe\xff\ +\xc3\x018\x00\xc2\xff\x85\x018\x00\xc3\xff\x9a\x018\x00\ +\xc4\xff\x85\x018\x00\xc5\xff\x9a\x018\x00\xc6\xff\x85\x01\ +8\x00\xc7\xff\x9a\x018\x00\xc8\xff\xd7\x018\x00\xc9\xff\ +\x9a\x018\x00\xca\xff\xd7\x018\x00\xcb\xff\x9a\x018\x00\ +\xcc\xff\xd7\x018\x00\xcd\xff\x9a\x018\x00\xce\xff\xd7\x01\ +8\x00\xcf\xff\x9a\x018\x00\xd1\xff\x9a\x018\x00\xd3\xff\ +\x9a\x018\x00\xd5\xff\x9a\x018\x00\xd7\xff\x9a\x018\x00\ +\xd9\xff\x9a\x018\x00\xdb\xff\x9a\x018\x00\xdd\xff\x9a\x01\ +8\x00\xde\xff\xd7\x018\x00\xdf\xff\xd7\x018\x00\xe0\xff\ +\xd7\x018\x00\xe1\xff\xd7\x018\x00\xe2\xff\xd7\x018\x00\ +\xe3\xff\xd7\x018\x00\xe4\xff\xd7\x018\x00\xe5\xff\xd7\x01\ +8\x00\xfa\xff\xc3\x018\x01\x06\xff\xc3\x018\x01\x08\xff\ +\xc3\x018\x01\x0d\xff\xc3\x018\x01\x0e\xff\xd7\x018\x01\ +\x0f\xff\x9a\x018\x01\x10\xff\xd7\x018\x01\x11\xff\x9a\x01\ +8\x01\x12\xff\xd7\x018\x01\x13\xff\x9a\x018\x01\x14\xff\ +\xd7\x018\x01\x15\xff\x9a\x018\x01\x17\xff\xc3\x018\x01\ +\x19\xff\xc3\x018\x01\x1d\xff\xae\x018\x01!\xff\xae\x01\ +8\x01+\xff\xc3\x018\x01-\xff\xc3\x018\x01/\xff\ +\xc3\x018\x011\xff\xc3\x018\x013\xff\xc3\x018\x01\ +5\xff\xc3\x018\x01<\xff\xd7\x018\x01>\xff\xd7\x01\ +8\x01@\xff\xd7\x018\x01C\xff\x85\x018\x01D\xff\ +\x9a\x018\x01F\xff\x9a\x018\x01G\xff\xd7\x018\x01\ +H\xff\x9a\x018\x01J\xff\xae\x018\x02\x08\xff\x85\x01\ +8\x02\x0c\xff\x85\x018\x02W\xff\xc3\x018\x02X\xff\ +\x85\x018\x02Y\xff\x9a\x018\x02_\xff\xd7\x018\x02\ +`\xff\x9a\x018\x02b\xff\xc3\x018\x03\x1d\xff\x85\x01\ +8\x03\x1e\xff\x9a\x018\x03\x1f\xff\x85\x018\x03 \xff\ +\x9a\x018\x03!\xff\x85\x018\x03\x22\xff\x9a\x018\x03\ +#\xff\x85\x018\x03%\xff\x85\x018\x03&\xff\x9a\x01\ +8\x03'\xff\x85\x018\x03(\xff\x9a\x018\x03)\xff\ +\x85\x018\x03*\xff\x9a\x018\x03+\xff\x85\x018\x03\ +,\xff\x9a\x018\x03-\xff\x85\x018\x03.\xff\x9a\x01\ +8\x03/\xff\x85\x018\x030\xff\x9a\x018\x031\xff\ +\x85\x018\x032\xff\x9a\x018\x033\xff\x85\x018\x03\ +4\xff\x9a\x018\x036\xff\x9a\x018\x038\xff\x9a\x01\ +8\x03:\xff\x9a\x018\x03<\xff\x9a\x018\x03@\xff\ +\x9a\x018\x03B\xff\x9a\x018\x03D\xff\x9a\x018\x03\ +I\xff\xd7\x018\x03J\xff\x9a\x018\x03K\xff\xd7\x01\ +8\x03L\xff\x9a\x018\x03M\xff\xd7\x018\x03N\xff\ +\x9a\x018\x03O\xff\xd7\x018\x03Q\xff\xd7\x018\x03\ +R\xff\x9a\x018\x03S\xff\xd7\x018\x03T\xff\x9a\x01\ +8\x03U\xff\xd7\x018\x03V\xff\x9a\x018\x03W\xff\ +\xd7\x018\x03X\xff\x9a\x018\x03Y\xff\xd7\x018\x03\ +Z\xff\x9a\x018\x03[\xff\xd7\x018\x03\x5c\xff\x9a\x01\ +8\x03]\xff\xd7\x018\x03^\xff\x9a\x018\x03_\xff\ +\xd7\x018\x03`\xff\x9a\x018\x03b\xff\xc3\x018\x03\ +d\xff\xc3\x018\x03f\xff\xc3\x018\x03h\xff\xc3\x01\ +8\x03j\xff\xc3\x018\x03l\xff\xc3\x018\x03n\xff\ +\xc3\x019\x00\x05\x00R\x019\x00\x0a\x00R\x019\x00\ +\x0f\xff\xae\x019\x00\x11\xff\xae\x019\x00\x22\x00)\x01\ +9\x02\x07\x00R\x019\x02\x08\xff\xae\x019\x02\x0b\x00\ +R\x019\x02\x0c\xff\xae\x01:\x00\x0f\xff\x85\x01:\x00\ +\x11\xff\x85\x01:\x00\x22\x00)\x01:\x00$\xff\x85\x01\ +:\x00&\xff\xd7\x01:\x00*\xff\xd7\x01:\x002\xff\ +\xd7\x01:\x004\xff\xd7\x01:\x00D\xff\x9a\x01:\x00\ +F\xff\x9a\x01:\x00G\xff\x9a\x01:\x00H\xff\x9a\x01\ +:\x00J\xff\xd7\x01:\x00P\xff\xc3\x01:\x00Q\xff\ +\xc3\x01:\x00R\xff\x9a\x01:\x00S\xff\xc3\x01:\x00\ +T\xff\x9a\x01:\x00U\xff\xc3\x01:\x00V\xff\xae\x01\ +:\x00X\xff\xc3\x01:\x00]\xff\xd7\x01:\x00\x82\xff\ +\x85\x01:\x00\x83\xff\x85\x01:\x00\x84\xff\x85\x01:\x00\ +\x85\xff\x85\x01:\x00\x86\xff\x85\x01:\x00\x87\xff\x85\x01\ +:\x00\x89\xff\xd7\x01:\x00\x94\xff\xd7\x01:\x00\x95\xff\ +\xd7\x01:\x00\x96\xff\xd7\x01:\x00\x97\xff\xd7\x01:\x00\ +\x98\xff\xd7\x01:\x00\x9a\xff\xd7\x01:\x00\xa2\xff\x9a\x01\ +:\x00\xa3\xff\x9a\x01:\x00\xa4\xff\x9a\x01:\x00\xa5\xff\ +\x9a\x01:\x00\xa6\xff\x9a\x01:\x00\xa7\xff\x9a\x01:\x00\ +\xa8\xff\x9a\x01:\x00\xa9\xff\x9a\x01:\x00\xaa\xff\x9a\x01\ +:\x00\xab\xff\x9a\x01:\x00\xac\xff\x9a\x01:\x00\xad\xff\ +\x9a\x01:\x00\xb4\xff\x9a\x01:\x00\xb5\xff\x9a\x01:\x00\ +\xb6\xff\x9a\x01:\x00\xb7\xff\x9a\x01:\x00\xb8\xff\x9a\x01\ +:\x00\xba\xff\x9a\x01:\x00\xbb\xff\xc3\x01:\x00\xbc\xff\ +\xc3\x01:\x00\xbd\xff\xc3\x01:\x00\xbe\xff\xc3\x01:\x00\ +\xc2\xff\x85\x01:\x00\xc3\xff\x9a\x01:\x00\xc4\xff\x85\x01\ +:\x00\xc5\xff\x9a\x01:\x00\xc6\xff\x85\x01:\x00\xc7\xff\ +\x9a\x01:\x00\xc8\xff\xd7\x01:\x00\xc9\xff\x9a\x01:\x00\ +\xca\xff\xd7\x01:\x00\xcb\xff\x9a\x01:\x00\xcc\xff\xd7\x01\ +:\x00\xcd\xff\x9a\x01:\x00\xce\xff\xd7\x01:\x00\xcf\xff\ +\x9a\x01:\x00\xd1\xff\x9a\x01:\x00\xd3\xff\x9a\x01:\x00\ +\xd5\xff\x9a\x01:\x00\xd7\xff\x9a\x01:\x00\xd9\xff\x9a\x01\ +:\x00\xdb\xff\x9a\x01:\x00\xdd\xff\x9a\x01:\x00\xde\xff\ +\xd7\x01:\x00\xdf\xff\xd7\x01:\x00\xe0\xff\xd7\x01:\x00\ +\xe1\xff\xd7\x01:\x00\xe2\xff\xd7\x01:\x00\xe3\xff\xd7\x01\ +:\x00\xe4\xff\xd7\x01:\x00\xe5\xff\xd7\x01:\x00\xfa\xff\ +\xc3\x01:\x01\x06\xff\xc3\x01:\x01\x08\xff\xc3\x01:\x01\ +\x0d\xff\xc3\x01:\x01\x0e\xff\xd7\x01:\x01\x0f\xff\x9a\x01\ +:\x01\x10\xff\xd7\x01:\x01\x11\xff\x9a\x01:\x01\x12\xff\ +\xd7\x01:\x01\x13\xff\x9a\x01:\x01\x14\xff\xd7\x01:\x01\ +\x15\xff\x9a\x01:\x01\x17\xff\xc3\x01:\x01\x19\xff\xc3\x01\ +:\x01\x1d\xff\xae\x01:\x01!\xff\xae\x01:\x01+\xff\ +\xc3\x01:\x01-\xff\xc3\x01:\x01/\xff\xc3\x01:\x01\ +1\xff\xc3\x01:\x013\xff\xc3\x01:\x015\xff\xc3\x01\ +:\x01<\xff\xd7\x01:\x01>\xff\xd7\x01:\x01@\xff\ +\xd7\x01:\x01C\xff\x85\x01:\x01D\xff\x9a\x01:\x01\ +F\xff\x9a\x01:\x01G\xff\xd7\x01:\x01H\xff\x9a\x01\ +:\x01J\xff\xae\x01:\x02\x08\xff\x85\x01:\x02\x0c\xff\ +\x85\x01:\x02W\xff\xc3\x01:\x02X\xff\x85\x01:\x02\ +Y\xff\x9a\x01:\x02_\xff\xd7\x01:\x02`\xff\x9a\x01\ +:\x02b\xff\xc3\x01:\x03\x1d\xff\x85\x01:\x03\x1e\xff\ +\x9a\x01:\x03\x1f\xff\x85\x01:\x03 \xff\x9a\x01:\x03\ +!\xff\x85\x01:\x03\x22\xff\x9a\x01:\x03#\xff\x85\x01\ +:\x03%\xff\x85\x01:\x03&\xff\x9a\x01:\x03'\xff\ +\x85\x01:\x03(\xff\x9a\x01:\x03)\xff\x85\x01:\x03\ +*\xff\x9a\x01:\x03+\xff\x85\x01:\x03,\xff\x9a\x01\ +:\x03-\xff\x85\x01:\x03.\xff\x9a\x01:\x03/\xff\ +\x85\x01:\x030\xff\x9a\x01:\x031\xff\x85\x01:\x03\ +2\xff\x9a\x01:\x033\xff\x85\x01:\x034\xff\x9a\x01\ +:\x036\xff\x9a\x01:\x038\xff\x9a\x01:\x03:\xff\ +\x9a\x01:\x03<\xff\x9a\x01:\x03@\xff\x9a\x01:\x03\ +B\xff\x9a\x01:\x03D\xff\x9a\x01:\x03I\xff\xd7\x01\ +:\x03J\xff\x9a\x01:\x03K\xff\xd7\x01:\x03L\xff\ +\x9a\x01:\x03M\xff\xd7\x01:\x03N\xff\x9a\x01:\x03\ +O\xff\xd7\x01:\x03Q\xff\xd7\x01:\x03R\xff\x9a\x01\ +:\x03S\xff\xd7\x01:\x03T\xff\x9a\x01:\x03U\xff\ +\xd7\x01:\x03V\xff\x9a\x01:\x03W\xff\xd7\x01:\x03\ +X\xff\x9a\x01:\x03Y\xff\xd7\x01:\x03Z\xff\x9a\x01\ +:\x03[\xff\xd7\x01:\x03\x5c\xff\x9a\x01:\x03]\xff\ +\xd7\x01:\x03^\xff\x9a\x01:\x03_\xff\xd7\x01:\x03\ +`\xff\x9a\x01:\x03b\xff\xc3\x01:\x03d\xff\xc3\x01\ +:\x03f\xff\xc3\x01:\x03h\xff\xc3\x01:\x03j\xff\ +\xc3\x01:\x03l\xff\xc3\x01:\x03n\xff\xc3\x01;\x00\ +&\xff\xec\x01;\x00*\xff\xec\x01;\x002\xff\xec\x01\ +;\x004\xff\xec\x01;\x00\x89\xff\xec\x01;\x00\x94\xff\ +\xec\x01;\x00\x95\xff\xec\x01;\x00\x96\xff\xec\x01;\x00\ +\x97\xff\xec\x01;\x00\x98\xff\xec\x01;\x00\x9a\xff\xec\x01\ +;\x00\xc8\xff\xec\x01;\x00\xca\xff\xec\x01;\x00\xcc\xff\ +\xec\x01;\x00\xce\xff\xec\x01;\x00\xde\xff\xec\x01;\x00\ +\xe0\xff\xec\x01;\x00\xe2\xff\xec\x01;\x00\xe4\xff\xec\x01\ +;\x01\x0e\xff\xec\x01;\x01\x10\xff\xec\x01;\x01\x12\xff\ +\xec\x01;\x01\x14\xff\xec\x01;\x01G\xff\xec\x01;\x02\ +_\xff\xec\x01;\x03I\xff\xec\x01;\x03K\xff\xec\x01\ +;\x03M\xff\xec\x01;\x03O\xff\xec\x01;\x03Q\xff\ +\xec\x01;\x03S\xff\xec\x01;\x03U\xff\xec\x01;\x03\ +W\xff\xec\x01;\x03Y\xff\xec\x01;\x03[\xff\xec\x01\ +;\x03]\xff\xec\x01;\x03_\xff\xec\x01=\x00&\xff\ +\xec\x01=\x00*\xff\xec\x01=\x002\xff\xec\x01=\x00\ +4\xff\xec\x01=\x00\x89\xff\xec\x01=\x00\x94\xff\xec\x01\ +=\x00\x95\xff\xec\x01=\x00\x96\xff\xec\x01=\x00\x97\xff\ +\xec\x01=\x00\x98\xff\xec\x01=\x00\x9a\xff\xec\x01=\x00\ +\xc8\xff\xec\x01=\x00\xca\xff\xec\x01=\x00\xcc\xff\xec\x01\ +=\x00\xce\xff\xec\x01=\x00\xde\xff\xec\x01=\x00\xe0\xff\ +\xec\x01=\x00\xe2\xff\xec\x01=\x00\xe4\xff\xec\x01=\x01\ +\x0e\xff\xec\x01=\x01\x10\xff\xec\x01=\x01\x12\xff\xec\x01\ +=\x01\x14\xff\xec\x01=\x01G\xff\xec\x01=\x02_\xff\ +\xec\x01=\x03I\xff\xec\x01=\x03K\xff\xec\x01=\x03\ +M\xff\xec\x01=\x03O\xff\xec\x01=\x03Q\xff\xec\x01\ +=\x03S\xff\xec\x01=\x03U\xff\xec\x01=\x03W\xff\ +\xec\x01=\x03Y\xff\xec\x01=\x03[\xff\xec\x01=\x03\ +]\xff\xec\x01=\x03_\xff\xec\x01?\x00&\xff\xec\x01\ +?\x00*\xff\xec\x01?\x002\xff\xec\x01?\x004\xff\ +\xec\x01?\x00\x89\xff\xec\x01?\x00\x94\xff\xec\x01?\x00\ +\x95\xff\xec\x01?\x00\x96\xff\xec\x01?\x00\x97\xff\xec\x01\ +?\x00\x98\xff\xec\x01?\x00\x9a\xff\xec\x01?\x00\xc8\xff\ +\xec\x01?\x00\xca\xff\xec\x01?\x00\xcc\xff\xec\x01?\x00\ +\xce\xff\xec\x01?\x00\xde\xff\xec\x01?\x00\xe0\xff\xec\x01\ +?\x00\xe2\xff\xec\x01?\x00\xe4\xff\xec\x01?\x01\x0e\xff\ +\xec\x01?\x01\x10\xff\xec\x01?\x01\x12\xff\xec\x01?\x01\ +\x14\xff\xec\x01?\x01G\xff\xec\x01?\x02_\xff\xec\x01\ +?\x03I\xff\xec\x01?\x03K\xff\xec\x01?\x03M\xff\ +\xec\x01?\x03O\xff\xec\x01?\x03Q\xff\xec\x01?\x03\ +S\xff\xec\x01?\x03U\xff\xec\x01?\x03W\xff\xec\x01\ +?\x03Y\xff\xec\x01?\x03[\xff\xec\x01?\x03]\xff\ +\xec\x01?\x03_\xff\xec\x01C\x00\x05\xffq\x01C\x00\ +\x0a\xffq\x01C\x00&\xff\xd7\x01C\x00*\xff\xd7\x01\ +C\x00-\x01\x0a\x01C\x002\xff\xd7\x01C\x004\xff\ +\xd7\x01C\x007\xffq\x01C\x009\xff\xae\x01C\x00\ +:\xff\xae\x01C\x00<\xff\x85\x01C\x00\x89\xff\xd7\x01\ +C\x00\x94\xff\xd7\x01C\x00\x95\xff\xd7\x01C\x00\x96\xff\ +\xd7\x01C\x00\x97\xff\xd7\x01C\x00\x98\xff\xd7\x01C\x00\ +\x9a\xff\xd7\x01C\x00\x9f\xff\x85\x01C\x00\xc8\xff\xd7\x01\ +C\x00\xca\xff\xd7\x01C\x00\xcc\xff\xd7\x01C\x00\xce\xff\ +\xd7\x01C\x00\xde\xff\xd7\x01C\x00\xe0\xff\xd7\x01C\x00\ +\xe2\xff\xd7\x01C\x00\xe4\xff\xd7\x01C\x01\x0e\xff\xd7\x01\ +C\x01\x10\xff\xd7\x01C\x01\x12\xff\xd7\x01C\x01\x14\xff\ +\xd7\x01C\x01$\xffq\x01C\x01&\xffq\x01C\x01\ +6\xff\xae\x01C\x018\xff\x85\x01C\x01:\xff\x85\x01\ +C\x01G\xff\xd7\x01C\x01\xfa\xff\xae\x01C\x01\xfc\xff\ +\xae\x01C\x01\xfe\xff\xae\x01C\x02\x00\xff\x85\x01C\x02\ +\x07\xffq\x01C\x02\x0b\xffq\x01C\x02_\xff\xd7\x01\ +C\x03I\xff\xd7\x01C\x03K\xff\xd7\x01C\x03M\xff\ +\xd7\x01C\x03O\xff\xd7\x01C\x03Q\xff\xd7\x01C\x03\ +S\xff\xd7\x01C\x03U\xff\xd7\x01C\x03W\xff\xd7\x01\ +C\x03Y\xff\xd7\x01C\x03[\xff\xd7\x01C\x03]\xff\ +\xd7\x01C\x03_\xff\xd7\x01C\x03o\xff\x85\x01C\x03\ +q\xff\x85\x01C\x03s\xff\x85\x01C\x03\x8f\xffq\x01\ +D\x00\x05\xff\xec\x01D\x00\x0a\xff\xec\x01D\x02\x07\xff\ +\xec\x01D\x02\x0b\xff\xec\x01E\x00-\x00{\x01G\x00\ +\x0f\xff\xae\x01G\x00\x11\xff\xae\x01G\x00$\xff\xd7\x01\ +G\x007\xff\xc3\x01G\x009\xff\xec\x01G\x00:\xff\ +\xec\x01G\x00;\xff\xd7\x01G\x00<\xff\xec\x01G\x00\ +=\xff\xec\x01G\x00\x82\xff\xd7\x01G\x00\x83\xff\xd7\x01\ +G\x00\x84\xff\xd7\x01G\x00\x85\xff\xd7\x01G\x00\x86\xff\ +\xd7\x01G\x00\x87\xff\xd7\x01G\x00\x9f\xff\xec\x01G\x00\ +\xc2\xff\xd7\x01G\x00\xc4\xff\xd7\x01G\x00\xc6\xff\xd7\x01\ +G\x01$\xff\xc3\x01G\x01&\xff\xc3\x01G\x016\xff\ +\xec\x01G\x018\xff\xec\x01G\x01:\xff\xec\x01G\x01\ +;\xff\xec\x01G\x01=\xff\xec\x01G\x01?\xff\xec\x01\ +G\x01C\xff\xd7\x01G\x01\xa0\xff\xec\x01G\x01\xfa\xff\ +\xec\x01G\x01\xfc\xff\xec\x01G\x01\xfe\xff\xec\x01G\x02\ +\x00\xff\xec\x01G\x02\x08\xff\xae\x01G\x02\x0c\xff\xae\x01\ +G\x02X\xff\xd7\x01G\x03\x1d\xff\xd7\x01G\x03\x1f\xff\ +\xd7\x01G\x03!\xff\xd7\x01G\x03#\xff\xd7\x01G\x03\ +%\xff\xd7\x01G\x03'\xff\xd7\x01G\x03)\xff\xd7\x01\ +G\x03+\xff\xd7\x01G\x03-\xff\xd7\x01G\x03/\xff\ +\xd7\x01G\x031\xff\xd7\x01G\x033\xff\xd7\x01G\x03\ +o\xff\xec\x01G\x03q\xff\xec\x01G\x03s\xff\xec\x01\ +G\x03\x8f\xff\xc3\x01V\x00\x05\xffq\x01V\x00\x0a\xff\ +q\x01V\x01f\xff\xd7\x01V\x01m\xff\xd7\x01V\x01\ +q\xffq\x01V\x01r\xff\x85\x01V\x01s\xff\xd7\x01\ +V\x01u\xff\xae\x01V\x01x\xff\x85\x01V\x02\x07\xff\ +q\x01V\x02\x0b\xffq\x01V\x02T\xff\x85\x01[\x00\ +\x0f\xff\xae\x01[\x00\x11\xff\xae\x01[\x01V\xff\xd7\x01\ +[\x01_\xff\xd7\x01[\x01b\xff\xd7\x01[\x01d\xff\ +\xec\x01[\x01i\xff\xd7\x01[\x01p\xff\xec\x01[\x01\ +q\xff\xc3\x01[\x01r\xff\xec\x01[\x01t\xff\xd7\x01\ +[\x01u\xff\xec\x01[\x01x\xff\xec\x01[\x01\x88\xff\ +\xec\x01[\x02\x08\xff\xae\x01[\x02\x0c\xff\xae\x01[\x02\ +T\xff\xec\x01\x5c\x00\x0f\xff\x85\x01\x5c\x00\x11\xff\x85\x01\ +\x5c\x01V\xff\x85\x01\x5c\x01_\xff\x85\x01\x5c\x01b\xff\ +\x85\x01\x5c\x01f\xff\xd7\x01\x5c\x01i\xff\x85\x01\x5c\x01\ +m\xff\xd7\x01\x5c\x01s\xff\xc3\x01\x5c\x01v\xff\xec\x01\ +\x5c\x01y\xff\x9a\x01\x5c\x01z\xff\xae\x01\x5c\x01{\xff\ +\xc3\x01\x5c\x01|\xff\xc3\x01\x5c\x01}\xff\xc3\x01\x5c\x01\ +~\xff\x9a\x01\x5c\x01\x81\xff\xc3\x01\x5c\x01\x82\xff\xae\x01\ +\x5c\x01\x84\xff\xc3\x01\x5c\x01\x86\xff\xc3\x01\x5c\x01\x87\xff\ +\xc3\x01\x5c\x01\x89\xff\xc3\x01\x5c\x01\x8c\xff\x9a\x01\x5c\x01\ +\x8e\xff\x9a\x01\x5c\x01\x8f\xff\x9a\x01\x5c\x01\x90\xff\x9a\x01\ +\x5c\x01\x92\xff\xc3\x01\x5c\x01\x93\xff\x9a\x01\x5c\x01\x95\xff\ +\xc3\x01\x5c\x01\x96\xff\xc3\x01\x5c\x01\x98\xff\xc3\x01\x5c\x01\ +\x99\xff\x9a\x01\x5c\x01\x9a\xff\xc3\x01\x5c\x01\x9b\xff\xc3\x01\ +\x5c\x02\x08\xff\x85\x01\x5c\x02\x0c\xff\x85\x01\x5c\x02!\xff\ +\xec\x01]\x01q\xff\xd7\x01]\x01r\xff\xec\x01]\x01\ +x\xff\xec\x01]\x02T\xff\xec\x01^\x00\x05\xff\xd7\x01\ +^\x00\x0a\xff\xd7\x01^\x02\x07\xff\xd7\x01^\x02\x0b\xff\ +\xd7\x01_\x00\x05\xffq\x01_\x00\x0a\xffq\x01_\x01\ +f\xff\xd7\x01_\x01m\xff\xd7\x01_\x01q\xffq\x01\ +_\x01r\xff\x85\x01_\x01s\xff\xd7\x01_\x01u\xff\ +\xae\x01_\x01x\xff\x85\x01_\x02\x07\xffq\x01_\x02\ +\x0b\xffq\x01_\x02T\xff\x85\x01`\x00\x0f\xff\xae\x01\ +`\x00\x11\xff\xae\x01`\x01V\xff\xd7\x01`\x01_\xff\ +\xd7\x01`\x01b\xff\xd7\x01`\x01i\xff\xd7\x01`\x01\ +t\xff\xd7\x01`\x02\x08\xff\xae\x01`\x02\x0c\xff\xae\x01\ +a\x00\x0f\xff\x85\x01a\x00\x10\xff\xae\x01a\x00\x11\xff\ +\x85\x01a\x01V\xff\x5c\x01a\x01_\xff\x5c\x01a\x01\ +b\xff\x5c\x01a\x01f\xff\xc3\x01a\x01i\xff\x5c\x01\ +a\x01m\xff\xc3\x01a\x01s\xff\x9a\x01a\x01v\xff\ +\xc3\x01a\x01y\xffq\x01a\x01z\xff\x9a\x01a\x01\ +{\xff\x9a\x01a\x01|\xff\xae\x01a\x01}\xff\x9a\x01\ +a\x01~\xffq\x01a\x01\x80\xff\xd7\x01a\x01\x81\xff\ +\xc3\x01a\x01\x82\xff\x9a\x01a\x01\x84\xff\x9a\x01a\x01\ +\x86\xff\xae\x01a\x01\x87\xff\x9a\x01a\x01\x89\xff\x9a\x01\ +a\x01\x8a\xff\xd7\x01a\x01\x8c\xffq\x01a\x01\x8e\xff\ +\x9a\x01a\x01\x8f\xffq\x01a\x01\x90\xffq\x01a\x01\ +\x92\xff\x9a\x01a\x01\x93\xffq\x01a\x01\x94\xff\xd7\x01\ +a\x01\x95\xff\x9a\x01a\x01\x96\xff\x9a\x01a\x01\x98\xff\ +\x9a\x01a\x01\x99\xffq\x01a\x01\x9a\xff\x9a\x01a\x01\ +\x9b\xff\x9a\x01a\x02\x02\xff\xae\x01a\x02\x03\xff\xae\x01\ +a\x02\x04\xff\xae\x01a\x02\x08\xff\x85\x01a\x02\x0c\xff\ +\x85\x01a\x02!\xff\xc3\x01a\x02S\xff\xd7\x01b\x00\ +\x05\xffq\x01b\x00\x0a\xffq\x01b\x01f\xff\xd7\x01\ +b\x01m\xff\xd7\x01b\x01q\xffq\x01b\x01r\xff\ +\x85\x01b\x01s\xff\xd7\x01b\x01u\xff\xae\x01b\x01\ +x\xff\x85\x01b\x02\x07\xffq\x01b\x02\x0b\xffq\x01\ +b\x02T\xff\x85\x01d\x01f\xff\xec\x01d\x01m\xff\ +\xec\x01d\x01s\xff\xc3\x01f\x00\x0f\xff\xae\x01f\x00\ +\x11\xff\xae\x01f\x01V\xff\xd7\x01f\x01_\xff\xd7\x01\ +f\x01b\xff\xd7\x01f\x01d\xff\xec\x01f\x01i\xff\ +\xd7\x01f\x01p\xff\xec\x01f\x01q\xff\xc3\x01f\x01\ +r\xff\xec\x01f\x01t\xff\xd7\x01f\x01u\xff\xec\x01\ +f\x01x\xff\xec\x01f\x01\x88\xff\xec\x01f\x02\x08\xff\ +\xae\x01f\x02\x0c\xff\xae\x01f\x02T\xff\xec\x01h\x01\ +f\xff\xd7\x01h\x01m\xff\xd7\x01h\x01s\xff\xc3\x01\ +h\x01\x8d\xff\xec\x01h\x01\x91\xff\xec\x01i\x00\x05\xff\ +q\x01i\x00\x0a\xffq\x01i\x01f\xff\xd7\x01i\x01\ +m\xff\xd7\x01i\x01q\xffq\x01i\x01r\xff\x85\x01\ +i\x01s\xff\xd7\x01i\x01u\xff\xae\x01i\x01x\xff\ +\x85\x01i\x02\x07\xffq\x01i\x02\x0b\xffq\x01i\x02\ +T\xff\x85\x01m\x00\x0f\xff\xae\x01m\x00\x11\xff\xae\x01\ +m\x01V\xff\xd7\x01m\x01_\xff\xd7\x01m\x01b\xff\ +\xd7\x01m\x01d\xff\xec\x01m\x01i\xff\xd7\x01m\x01\ +p\xff\xec\x01m\x01q\xff\xc3\x01m\x01r\xff\xec\x01\ +m\x01t\xff\xd7\x01m\x01u\xff\xec\x01m\x01x\xff\ +\xec\x01m\x01\x88\xff\xec\x01m\x02\x08\xff\xae\x01m\x02\ +\x0c\xff\xae\x01m\x02T\xff\xec\x01o\x00\x0f\xfe\xf6\x01\ +o\x00\x11\xfe\xf6\x01o\x01V\xff\x9a\x01o\x01_\xff\ +\x9a\x01o\x01b\xff\x9a\x01o\x01d\xff\xec\x01o\x01\ +i\xff\x9a\x01o\x01t\xff\xd7\x01o\x01\x88\xff\xd7\x01\ +o\x02\x08\xfe\xf6\x01o\x02\x0c\xfe\xf6\x01q\x00\x0f\xff\ +\x85\x01q\x00\x10\xff\xae\x01q\x00\x11\xff\x85\x01q\x01\ +V\xff\x5c\x01q\x01_\xff\x5c\x01q\x01b\xff\x5c\x01\ +q\x01f\xff\xc3\x01q\x01i\xff\x5c\x01q\x01m\xff\ +\xc3\x01q\x01s\xff\x9a\x01q\x01v\xff\xc3\x01q\x01\ +y\xffq\x01q\x01z\xff\x9a\x01q\x01{\xff\x9a\x01\ +q\x01|\xff\xae\x01q\x01}\xff\x9a\x01q\x01~\xff\ +q\x01q\x01\x80\xff\xd7\x01q\x01\x81\xff\xc3\x01q\x01\ +\x82\xff\x9a\x01q\x01\x84\xff\x9a\x01q\x01\x86\xff\xae\x01\ +q\x01\x87\xff\x9a\x01q\x01\x89\xff\x9a\x01q\x01\x8a\xff\ +\xd7\x01q\x01\x8c\xffq\x01q\x01\x8e\xff\x9a\x01q\x01\ +\x8f\xffq\x01q\x01\x90\xffq\x01q\x01\x92\xff\x9a\x01\ +q\x01\x93\xffq\x01q\x01\x94\xff\xd7\x01q\x01\x95\xff\ +\x9a\x01q\x01\x96\xff\x9a\x01q\x01\x98\xff\x9a\x01q\x01\ +\x99\xffq\x01q\x01\x9a\xff\x9a\x01q\x01\x9b\xff\x9a\x01\ +q\x02\x02\xff\xae\x01q\x02\x03\xff\xae\x01q\x02\x04\xff\ +\xae\x01q\x02\x08\xff\x85\x01q\x02\x0c\xff\x85\x01q\x02\ +!\xff\xc3\x01q\x02S\xff\xd7\x01r\x00\x0f\xff\x85\x01\ +r\x00\x11\xff\x85\x01r\x01V\xff\x85\x01r\x01_\xff\ +\x85\x01r\x01b\xff\x85\x01r\x01f\xff\xd7\x01r\x01\ +i\xff\x85\x01r\x01m\xff\xd7\x01r\x01s\xff\xc3\x01\ +r\x01v\xff\xec\x01r\x01y\xff\x9a\x01r\x01z\xff\ +\xae\x01r\x01{\xff\xc3\x01r\x01|\xff\xc3\x01r\x01\ +}\xff\xc3\x01r\x01~\xff\x9a\x01r\x01\x81\xff\xc3\x01\ +r\x01\x82\xff\xae\x01r\x01\x84\xff\xc3\x01r\x01\x86\xff\ +\xc3\x01r\x01\x87\xff\xc3\x01r\x01\x89\xff\xc3\x01r\x01\ +\x8c\xff\x9a\x01r\x01\x8e\xff\x9a\x01r\x01\x8f\xff\x9a\x01\ +r\x01\x90\xff\x9a\x01r\x01\x92\xff\xc3\x01r\x01\x93\xff\ +\x9a\x01r\x01\x95\xff\xc3\x01r\x01\x96\xff\xc3\x01r\x01\ +\x98\xff\xc3\x01r\x01\x99\xff\x9a\x01r\x01\x9a\xff\xc3\x01\ +r\x01\x9b\xff\xc3\x01r\x02\x08\xff\x85\x01r\x02\x0c\xff\ +\x85\x01r\x02!\xff\xec\x01s\x00\x0f\xff\x9a\x01s\x00\ +\x11\xff\x9a\x01s\x01V\xff\xd7\x01s\x01_\xff\xd7\x01\ +s\x01b\xff\xd7\x01s\x01d\xff\xc3\x01s\x01i\xff\ +\xd7\x01s\x01p\xff\xec\x01s\x01q\xff\xae\x01s\x01\ +r\xff\xc3\x01s\x01t\xff\xec\x01s\x01x\xff\xc3\x01\ +s\x01\x88\xff\xec\x01s\x02\x08\xff\x9a\x01s\x02\x0c\xff\ +\x9a\x01s\x02T\xff\xc3\x01t\x01f\xff\xd7\x01t\x01\ +m\xff\xd7\x01t\x01s\xff\xc3\x01t\x01\x8d\xff\xec\x01\ +t\x01\x91\xff\xec\x01u\x00\x0f\xff\x85\x01u\x00\x11\xff\ +\x85\x01u\x01V\xff\xae\x01u\x01_\xff\xae\x01u\x01\ +b\xff\xae\x01u\x01f\xff\xec\x01u\x01i\xff\xae\x01\ +u\x01m\xff\xec\x01u\x02\x08\xff\x85\x01u\x02\x0c\xff\ +\x85\x01v\x01q\xff\xd7\x01v\x01r\xff\xec\x01v\x01\ +x\xff\xec\x01v\x02T\xff\xec\x01x\x00\x0f\xff\x85\x01\ +x\x00\x11\xff\x85\x01x\x01V\xff\x85\x01x\x01_\xff\ +\x85\x01x\x01b\xff\x85\x01x\x01f\xff\xd7\x01x\x01\ +i\xff\x85\x01x\x01m\xff\xd7\x01x\x01s\xff\xc3\x01\ +x\x01v\xff\xec\x01x\x01y\xff\x9a\x01x\x01z\xff\ +\xae\x01x\x01{\xff\xc3\x01x\x01|\xff\xc3\x01x\x01\ +}\xff\xc3\x01x\x01~\xff\x9a\x01x\x01\x81\xff\xc3\x01\ +x\x01\x82\xff\xae\x01x\x01\x84\xff\xc3\x01x\x01\x86\xff\ +\xc3\x01x\x01\x87\xff\xc3\x01x\x01\x89\xff\xc3\x01x\x01\ +\x8c\xff\x9a\x01x\x01\x8e\xff\x9a\x01x\x01\x8f\xff\x9a\x01\ +x\x01\x90\xff\x9a\x01x\x01\x92\xff\xc3\x01x\x01\x93\xff\ +\x9a\x01x\x01\x95\xff\xc3\x01x\x01\x96\xff\xc3\x01x\x01\ +\x98\xff\xc3\x01x\x01\x99\xff\x9a\x01x\x01\x9a\xff\xc3\x01\ +x\x01\x9b\xff\xc3\x01x\x02\x08\xff\x85\x01x\x02\x0c\xff\ +\x85\x01x\x02!\xff\xec\x01y\x01\x88\x00)\x01{\x00\ +\x05\xff\xec\x01{\x00\x0a\xff\xec\x01{\x02\x07\xff\xec\x01\ +{\x02\x0b\xff\xec\x01|\x00\x05\xff\xae\x01|\x00\x0a\xff\ +\xae\x01|\x01\x8d\xff\xec\x01|\x01\x91\xff\xec\x01|\x02\ +\x07\xff\xae\x01|\x02\x0b\xff\xae\x01~\x01\x88\x00)\x01\ +\x80\x00\x0f\xff\xae\x01\x80\x00\x11\xff\xae\x01\x80\x01\x88\xff\ +\xec\x01\x80\x02\x08\xff\xae\x01\x80\x02\x0c\xff\xae\x01\x83\x00\ +\x10\xff\x9a\x01\x83\x01y\xff\xd7\x01\x83\x01~\xff\xd7\x01\ +\x83\x01\x81\xff\xd7\x01\x83\x01\x8c\xff\xd7\x01\x83\x01\x8d\xff\ +\xd7\x01\x83\x01\x8f\xff\xd7\x01\x83\x01\x90\xff\xd7\x01\x83\x01\ +\x91\xff\xd7\x01\x83\x01\x93\xff\xd7\x01\x83\x01\x99\xff\xd7\x01\ +\x83\x02\x02\xff\x9a\x01\x83\x02\x03\xff\x9a\x01\x83\x02\x04\xff\ +\x9a\x01\x84\x00\x05\xff\xec\x01\x84\x00\x0a\xff\xec\x01\x84\x02\ +\x07\xff\xec\x01\x84\x02\x0b\xff\xec\x01\x85\x00\x0f\xff\xd7\x01\ +\x85\x00\x11\xff\xd7\x01\x85\x02\x08\xff\xd7\x01\x85\x02\x0c\xff\ +\xd7\x01\x86\x00\x05\xff\xae\x01\x86\x00\x0a\xff\xae\x01\x86\x01\ +\x8d\xff\xec\x01\x86\x01\x91\xff\xec\x01\x86\x02\x07\xff\xae\x01\ +\x86\x02\x0b\xff\xae\x01\x87\x01y\xff\xd7\x01\x87\x01~\xff\ +\xd7\x01\x87\x01\x8c\xff\xd7\x01\x87\x01\x8f\xff\xd7\x01\x87\x01\ +\x90\xff\xd7\x01\x87\x01\x93\xff\xd7\x01\x87\x01\x99\xff\xd7\x01\ +\x88\x00\x05\xff\x85\x01\x88\x00\x0a\xff\x85\x01\x88\x01y\xff\ +\xec\x01\x88\x01~\xff\xec\x01\x88\x01\x80\xff\xd7\x01\x88\x01\ +\x8a\xff\xd7\x01\x88\x01\x8c\xff\xec\x01\x88\x01\x8d\xff\xd7\x01\ +\x88\x01\x8f\xff\xec\x01\x88\x01\x90\xff\xec\x01\x88\x01\x91\xff\ +\xd7\x01\x88\x01\x93\xff\xec\x01\x88\x01\x99\xff\xec\x01\x88\x02\ +\x07\xff\x85\x01\x88\x02\x0b\xff\x85\x01\x8a\x00\x0f\xff\xae\x01\ +\x8a\x00\x11\xff\xae\x01\x8a\x01\x88\xff\xec\x01\x8a\x02\x08\xff\ +\xae\x01\x8a\x02\x0c\xff\xae\x01\x8c\x00\x05\xff\xec\x01\x8c\x00\ +\x0a\xff\xec\x01\x8c\x01\x80\xff\xd7\x01\x8c\x01\x8a\xff\xd7\x01\ +\x8c\x02\x07\xff\xec\x01\x8c\x02\x0b\xff\xec\x01\x8e\x00\x05\xff\ +\xec\x01\x8e\x00\x0a\xff\xec\x01\x8e\x01\x80\xff\xd7\x01\x8e\x01\ +\x8a\xff\xd7\x01\x8e\x02\x07\xff\xec\x01\x8e\x02\x0b\xff\xec\x01\ +\x90\x00\x0f\xff\xec\x01\x90\x00\x11\xff\xec\x01\x90\x02\x08\xff\ +\xec\x01\x90\x02\x0c\xff\xec\x01\x93\x00\x05\xff\xec\x01\x93\x00\ +\x0a\xff\xec\x01\x93\x01\x80\xff\xd7\x01\x93\x01\x8a\xff\xd7\x01\ +\x93\x02\x07\xff\xec\x01\x93\x02\x0b\xff\xec\x01\x94\x00\x0f\xff\ +\xc3\x01\x94\x00\x10\xff\xd7\x01\x94\x00\x11\xff\xc3\x01\x94\x01\ +y\xff\xd7\x01\x94\x01~\xff\xd7\x01\x94\x01\x81\xff\xd7\x01\ +\x94\x01\x8c\xff\xd7\x01\x94\x01\x8f\xff\xd7\x01\x94\x01\x90\xff\ +\xd7\x01\x94\x01\x93\xff\xd7\x01\x94\x01\x99\xff\xd7\x01\x94\x02\ +\x02\xff\xd7\x01\x94\x02\x03\xff\xd7\x01\x94\x02\x04\xff\xd7\x01\ +\x94\x02\x08\xff\xc3\x01\x94\x02\x0c\xff\xc3\x01\x97\x00\x05\xff\ +\xd7\x01\x97\x00\x0a\xff\xd7\x01\x97\x02\x07\xff\xd7\x01\x97\x02\ +\x0b\xff\xd7\x01\x99\x00\x05\xff\xec\x01\x99\x00\x0a\xff\xec\x01\ +\x99\x01\x80\xff\xd7\x01\x99\x01\x8a\xff\xd7\x01\x99\x02\x07\xff\ +\xec\x01\x99\x02\x0b\xff\xec\x01\x9d\x00\x05\xff\xae\x01\x9d\x00\ +\x0a\xff\xae\x01\x9d\x01\x9d\xff\x85\x01\x9d\x01\xa6\xff\x85\x01\ +\x9d\x01\xa8\xff\xd7\x01\x9d\x01\xbc\xff\x9a\x01\x9d\x01\xbd\xff\ +\xd7\x01\x9d\x01\xc1\xff\x9a\x01\x9d\x01\xc4\xff\x85\x01\x9d\x01\ +\xdc\xff\xd7\x01\x9d\x01\xdd\xff\xd7\x01\x9d\x01\xe1\xff\xd7\x01\ +\x9d\x01\xe4\xff\xd7\x01\x9d\x01\xf6\xff\xd7\x01\x9d\x02\x07\xff\ +\xae\x01\x9d\x02\x0b\xff\xae\x01\x9d\x02n\xff\xae\x01\x9d\x02\ +|\xff\x9a\x01\x9d\x02\x80\xff\xae\x01\x9d\x02\x82\xff\xae\x01\ +\x9d\x02\x97\xff\xae\x01\x9d\x02\x9b\xff\xae\x01\x9d\x02\xa7\xff\ +\xae\x01\x9d\x02\xa9\xff\x85\x01\x9d\x02\xaa\xff\xd7\x01\x9d\x02\ +\xb5\xff\x9a\x01\x9d\x02\xb6\xff\xd7\x01\x9d\x02\xb7\xff\x9a\x01\ +\x9d\x02\xb8\xff\xd7\x01\x9d\x02\xb9\xff\x9a\x01\x9d\x02\xba\xff\ +\xd7\x01\x9d\x02\xbd\xff\x85\x01\x9d\x02\xbe\xff\xd7\x01\x9d\x02\ +\xbf\xff\x9a\x01\x9d\x02\xc0\xff\xd7\x01\x9d\x02\xc1\xff\x9a\x01\ +\x9d\x02\xc2\xff\xd7\x01\x9d\x02\xd4\xff\x9a\x01\x9d\x02\xd5\xff\ +\xd7\x01\x9d\x02\xf7\xff\xd7\x01\x9d\x02\xf8\xff\xd7\x01\x9d\x02\ +\xf9\xff\xd7\x01\x9d\x02\xfa\xff\xd7\x01\x9d\x02\xfb\xff\xd7\x01\ +\x9d\x02\xfc\xff\xd7\x01\x9d\x02\xfd\xff\x9a\x01\x9d\x02\xfe\xff\ +\xd7\x01\x9d\x03\x03\xff\xae\x01\x9d\x03\x0d\xff\x9a\x01\x9d\x03\ +\x0e\xff\xc3\x01\x9d\x03\x0f\xff\x9a\x01\x9d\x03\x10\xff\xc3\x01\ +\x9d\x03\x17\xff\x85\x01\x9d\x03\x18\xff\xd7\x01\x9e\x00\x0f\xff\ +\x85\x01\x9e\x00\x10\xff\xae\x01\x9e\x00\x11\xff\x85\x01\x9e\x01\ +\x9f\xff\xd7\x01\x9e\x01\xa4\xff\x9a\x01\x9e\x01\xaa\xffq\x01\ +\x9e\x01\xae\xff\x9a\x01\x9e\x01\xb5\xff\x9a\x01\x9e\x01\xb8\xff\ +\xd7\x01\x9e\x01\xbb\xff\xd7\x01\x9e\x01\xbc\x00)\x01\x9e\x01\ +\xbe\xff\xae\x01\x9e\x01\xcc\xff\x9a\x01\x9e\x01\xcd\xff\x9a\x01\ +\x9e\x01\xce\xff\x85\x01\x9e\x01\xcf\xffq\x01\x9e\x01\xd0\xff\ +\xd7\x01\x9e\x01\xd1\xff\xd7\x01\x9e\x01\xd2\xff\x9a\x01\x9e\x01\ +\xd3\xff\x9a\x01\x9e\x01\xd4\xff\x9a\x01\x9e\x01\xd5\xff\x85\x01\ +\x9e\x01\xd6\xff\x9a\x01\x9e\x01\xd7\xff\x9a\x01\x9e\x01\xd8\xff\ +q\x01\x9e\x01\xd9\xff\x9a\x01\x9e\x01\xda\xff\x9a\x01\x9e\x01\ +\xdb\xffq\x01\x9e\x01\xdc\xff\xae\x01\x9e\x01\xdd\xff\xae\x01\ +\x9e\x01\xde\xffq\x01\x9e\x01\xdf\xff\xd7\x01\x9e\x01\xe0\xff\ +\x9a\x01\x9e\x01\xe1\xff\x9a\x01\x9e\x01\xe2\xff\x9a\x01\x9e\x01\ +\xe3\xff\x9a\x01\x9e\x01\xe4\xff\xae\x01\x9e\x01\xe5\xff\x9a\x01\ +\x9e\x01\xe6\xff\x9a\x01\x9e\x01\xe7\xff\xd7\x01\x9e\x01\xe8\xff\ +\x9a\x01\x9e\x01\xe9\xff\xc3\x01\x9e\x01\xea\xffq\x01\x9e\x01\ +\xec\xff\x9a\x01\x9e\x01\xed\xffq\x01\x9e\x01\xee\xff\x85\x01\ +\x9e\x01\xf2\xff\x85\x01\x9e\x01\xf3\xff\x9a\x01\x9e\x01\xf5\xff\ +\x9a\x01\x9e\x01\xf6\xff\xae\x01\x9e\x01\xf7\xff\x9a\x01\x9e\x01\ +\xf9\xff\x9a\x01\x9e\x02\x02\xff\xae\x01\x9e\x02\x03\xff\xae\x01\ +\x9e\x02\x04\xff\xae\x01\x9e\x02\x08\xff\x85\x01\x9e\x02\x0c\xff\ +\x85\x01\x9e\x02j\xffq\x01\x9e\x02k\xff\x9a\x01\x9e\x02\ +l\xff\xd7\x01\x9e\x02m\xff\xd7\x01\x9e\x02q\xff\x9a\x01\ +\x9e\x02r\xffq\x01\x9e\x02s\xff\x85\x01\x9e\x02u\xff\ +\x9a\x01\x9e\x02w\xff\x9a\x01\x9e\x02y\xff\x9a\x01\x9e\x02\ +}\xff\x9a\x01\x9e\x02~\xff\xd7\x01\x9e\x02\x7f\xffq\x01\ +\x9e\x02\x81\xff\xd7\x01\x9e\x02\x83\xff\xd7\x01\x9e\x02\x84\xff\ +\xd7\x01\x9e\x02\x85\xffq\x01\x9e\x02\x86\xff\xd7\x01\x9e\x02\ +\x87\xffq\x01\x9e\x02\x88\xff\xd7\x01\x9e\x02\x89\xffq\x01\ +\x9e\x02\x8a\xff\xd7\x01\x9e\x02\x8b\xff\xd7\x01\x9e\x02\x8c\xff\ +\xd7\x01\x9e\x02\x8d\xffq\x01\x9e\x02\x96\xff\x9a\x01\x9e\x02\ +\x9a\xff\x9a\x01\x9e\x02\x9e\xff\x9a\x01\x9e\x02\xa0\xff\xd7\x01\ +\x9e\x02\xa2\xff\xd7\x01\x9e\x02\xa4\xff\x9a\x01\x9e\x02\xa6\xff\ +\x9a\x01\x9e\x02\xaa\xff\xae\x01\x9e\x02\xac\xff\x9a\x01\x9e\x02\ +\xae\xff\x9a\x01\x9e\x02\xb0\xff\x9a\x01\x9e\x02\xb1\xff\xd7\x01\ +\x9e\x02\xb2\xffq\x01\x9e\x02\xb3\xff\xd7\x01\x9e\x02\xb4\xff\ +q\x01\x9e\x02\xb5\x00)\x01\x9e\x02\xb6\xff\xae\x01\x9e\x02\ +\xb8\xff\xae\x01\x9e\x02\xba\xff\xae\x01\x9e\x02\xbc\xff\xd7\x01\ +\x9e\x02\xbe\xff\xae\x01\x9e\x02\xc0\xff\x9a\x01\x9e\x02\xc2\xff\ +\x9a\x01\x9e\x02\xc4\xff\x9a\x01\x9e\x02\xc5\xff\x9a\x01\x9e\x02\ +\xc6\xffq\x01\x9e\x02\xc7\xff\x9a\x01\x9e\x02\xc8\xffq\x01\ +\x9e\x02\xcb\xff\xd7\x01\x9e\x02\xcd\xff\x9a\x01\x9e\x02\xce\xff\ +\x9a\x01\x9e\x02\xcf\xff\x85\x01\x9e\x02\xd1\xff\x9a\x01\x9e\x02\ +\xd3\xff\x9a\x01\x9e\x02\xd5\xff\x9a\x01\x9e\x02\xd7\xff\x9a\x01\ +\x9e\x02\xd9\xffq\x01\x9e\x02\xdb\xffq\x01\x9e\x02\xdd\xff\ +q\x01\x9e\x02\xe0\xffq\x01\x9e\x02\xe6\xff\xd7\x01\x9e\x02\ +\xe8\xff\xd7\x01\x9e\x02\xea\xff\xc3\x01\x9e\x02\xec\xff\x9a\x01\ +\x9e\x02\xee\xff\x9a\x01\x9e\x02\xef\xff\xd7\x01\x9e\x02\xf0\xff\ +q\x01\x9e\x02\xf1\xff\xd7\x01\x9e\x02\xf2\xffq\x01\x9e\x02\ +\xf3\xff\xd7\x01\x9e\x02\xf4\xffq\x01\x9e\x02\xf6\xff\xd7\x01\ +\x9e\x02\xf8\xff\xae\x01\x9e\x02\xfa\xff\xae\x01\x9e\x02\xfc\xff\ +\xae\x01\x9e\x02\xfe\xff\x9a\x01\x9e\x03\x00\xff\x9a\x01\x9e\x03\ +\x02\xff\x9a\x01\x9e\x03\x06\xff\xd7\x01\x9e\x03\x08\xff\xd7\x01\ +\x9e\x03\x09\xffq\x01\x9e\x03\x0a\xffq\x01\x9e\x03\x0b\xff\ +q\x01\x9e\x03\x0c\xffq\x01\x9e\x03\x0e\xff\x9a\x01\x9e\x03\ +\x10\xff\x9a\x01\x9e\x03\x11\xff\x9a\x01\x9e\x03\x12\xff\x85\x01\ +\x9e\x03\x14\xff\x9a\x01\x9e\x03\x15\xff\xd7\x01\x9e\x03\x16\xff\ +q\x01\x9e\x03\x18\xff\xae\x01\x9e\x03\x1a\xffq\x01\x9e\x03\ +\x1b\xff\x9a\x01\x9e\x03\x1c\xff\x85\x01\x9f\x01\x9f\xff\xd7\x01\ +\x9f\x01\xb8\xff\xd7\x01\x9f\x01\xbb\xff\xd7\x01\x9f\x01\xbe\xff\ +\xd7\x01\x9f\x01\xe1\xff\xd7\x01\x9f\x02l\xff\xd7\x01\x9f\x02\ +~\xff\xd7\x01\x9f\x02\x84\xff\xd7\x01\x9f\x02\x86\xff\xd7\x01\ +\x9f\x02\x88\xff\xd7\x01\x9f\x02\x8a\xff\xd7\x01\x9f\x02\x8c\xff\ +\xd7\x01\x9f\x02\xb1\xff\xd7\x01\x9f\x02\xb3\xff\xd7\x01\x9f\x02\ +\xc0\xff\xd7\x01\x9f\x02\xc2\xff\xd7\x01\x9f\x02\xc5\xff\xd7\x01\ +\x9f\x02\xc7\xff\xd7\x01\x9f\x02\xd5\xff\xd7\x01\x9f\x02\xef\xff\ +\xd7\x01\x9f\x02\xf1\xff\xd7\x01\x9f\x02\xf3\xff\xd7\x01\x9f\x02\ +\xfe\xff\xd7\x01\x9f\x03\x09\xff\xd7\x01\x9f\x03\x0b\xff\xd7\x01\ +\x9f\x03\x0e\xff\xd7\x01\x9f\x03\x10\xff\xd7\x01\x9f\x03\x15\xff\ +\xd7\x01\xa0\x03\x0e\xff\xd7\x01\xa0\x03\x10\xff\xd7\x01\xa4\x00\ +\x05\xff\xae\x01\xa4\x00\x0a\xff\xae\x01\xa4\x01\x9d\xff\x85\x01\ +\xa4\x01\xa6\xff\x85\x01\xa4\x01\xa8\xff\xd7\x01\xa4\x01\xbc\xff\ +\x9a\x01\xa4\x01\xbd\xff\xd7\x01\xa4\x01\xc1\xff\x9a\x01\xa4\x01\ +\xc4\xff\x85\x01\xa4\x01\xdc\xff\xd7\x01\xa4\x01\xdd\xff\xd7\x01\ +\xa4\x01\xe1\xff\xd7\x01\xa4\x01\xe4\xff\xd7\x01\xa4\x01\xf6\xff\ +\xd7\x01\xa4\x02\x07\xff\xae\x01\xa4\x02\x0b\xff\xae\x01\xa4\x02\ +n\xff\xae\x01\xa4\x02|\xff\x9a\x01\xa4\x02\x80\xff\xae\x01\ +\xa4\x02\x82\xff\xae\x01\xa4\x02\x97\xff\xae\x01\xa4\x02\x9b\xff\ +\xae\x01\xa4\x02\xa7\xff\xae\x01\xa4\x02\xa9\xff\x85\x01\xa4\x02\ +\xaa\xff\xd7\x01\xa4\x02\xb5\xff\x9a\x01\xa4\x02\xb6\xff\xd7\x01\ +\xa4\x02\xb7\xff\x9a\x01\xa4\x02\xb8\xff\xd7\x01\xa4\x02\xb9\xff\ +\x9a\x01\xa4\x02\xba\xff\xd7\x01\xa4\x02\xbd\xff\x85\x01\xa4\x02\ +\xbe\xff\xd7\x01\xa4\x02\xbf\xff\x9a\x01\xa4\x02\xc0\xff\xd7\x01\ +\xa4\x02\xc1\xff\x9a\x01\xa4\x02\xc2\xff\xd7\x01\xa4\x02\xd4\xff\ +\x9a\x01\xa4\x02\xd5\xff\xd7\x01\xa4\x02\xf7\xff\xd7\x01\xa4\x02\ +\xf8\xff\xd7\x01\xa4\x02\xf9\xff\xd7\x01\xa4\x02\xfa\xff\xd7\x01\ +\xa4\x02\xfb\xff\xd7\x01\xa4\x02\xfc\xff\xd7\x01\xa4\x02\xfd\xff\ +\x9a\x01\xa4\x02\xfe\xff\xd7\x01\xa4\x03\x03\xff\xae\x01\xa4\x03\ +\x0d\xff\x9a\x01\xa4\x03\x0e\xff\xc3\x01\xa4\x03\x0f\xff\x9a\x01\ +\xa4\x03\x10\xff\xc3\x01\xa4\x03\x17\xff\x85\x01\xa4\x03\x18\xff\ +\xd7\x01\xa5\x00\x05\xff\xae\x01\xa5\x00\x0a\xff\xae\x01\xa5\x01\ +\x9d\xff\x85\x01\xa5\x01\xa6\xff\x85\x01\xa5\x01\xa8\xff\xd7\x01\ +\xa5\x01\xbc\xff\x9a\x01\xa5\x01\xbd\xff\xd7\x01\xa5\x01\xc1\xff\ +\x9a\x01\xa5\x01\xc4\xff\x85\x01\xa5\x01\xdc\xff\xd7\x01\xa5\x01\ +\xdd\xff\xd7\x01\xa5\x01\xe1\xff\xd7\x01\xa5\x01\xe4\xff\xd7\x01\ +\xa5\x01\xf6\xff\xd7\x01\xa5\x02\x07\xff\xae\x01\xa5\x02\x0b\xff\ +\xae\x01\xa5\x02n\xff\xae\x01\xa5\x02|\xff\x9a\x01\xa5\x02\ +\x80\xff\xae\x01\xa5\x02\x82\xff\xae\x01\xa5\x02\x97\xff\xae\x01\ +\xa5\x02\x9b\xff\xae\x01\xa5\x02\xa7\xff\xae\x01\xa5\x02\xa9\xff\ +\x85\x01\xa5\x02\xaa\xff\xd7\x01\xa5\x02\xb5\xff\x9a\x01\xa5\x02\ +\xb6\xff\xd7\x01\xa5\x02\xb7\xff\x9a\x01\xa5\x02\xb8\xff\xd7\x01\ +\xa5\x02\xb9\xff\x9a\x01\xa5\x02\xba\xff\xd7\x01\xa5\x02\xbd\xff\ +\x85\x01\xa5\x02\xbe\xff\xd7\x01\xa5\x02\xbf\xff\x9a\x01\xa5\x02\ +\xc0\xff\xd7\x01\xa5\x02\xc1\xff\x9a\x01\xa5\x02\xc2\xff\xd7\x01\ +\xa5\x02\xd4\xff\x9a\x01\xa5\x02\xd5\xff\xd7\x01\xa5\x02\xf7\xff\ +\xd7\x01\xa5\x02\xf8\xff\xd7\x01\xa5\x02\xf9\xff\xd7\x01\xa5\x02\ +\xfa\xff\xd7\x01\xa5\x02\xfb\xff\xd7\x01\xa5\x02\xfc\xff\xd7\x01\ +\xa5\x02\xfd\xff\x9a\x01\xa5\x02\xfe\xff\xd7\x01\xa5\x03\x03\xff\ +\xae\x01\xa5\x03\x0d\xff\x9a\x01\xa5\x03\x0e\xff\xc3\x01\xa5\x03\ +\x0f\xff\x9a\x01\xa5\x03\x10\xff\xc3\x01\xa5\x03\x17\xff\x85\x01\ +\xa5\x03\x18\xff\xd7\x01\xa6\x00\x05\xff\xae\x01\xa6\x00\x0a\xff\ +\xae\x01\xa6\x01\x9d\xff\x85\x01\xa6\x01\xa6\xff\x85\x01\xa6\x01\ +\xa8\xff\xd7\x01\xa6\x01\xbc\xff\x9a\x01\xa6\x01\xbd\xff\xd7\x01\ +\xa6\x01\xc1\xff\x9a\x01\xa6\x01\xc4\xff\x85\x01\xa6\x01\xdc\xff\ +\xd7\x01\xa6\x01\xdd\xff\xd7\x01\xa6\x01\xe1\xff\xd7\x01\xa6\x01\ +\xe4\xff\xd7\x01\xa6\x01\xf6\xff\xd7\x01\xa6\x02\x07\xff\xae\x01\ +\xa6\x02\x0b\xff\xae\x01\xa6\x02n\xff\xae\x01\xa6\x02|\xff\ +\x9a\x01\xa6\x02\x80\xff\xae\x01\xa6\x02\x82\xff\xae\x01\xa6\x02\ +\x97\xff\xae\x01\xa6\x02\x9b\xff\xae\x01\xa6\x02\xa7\xff\xae\x01\ +\xa6\x02\xa9\xff\x85\x01\xa6\x02\xaa\xff\xd7\x01\xa6\x02\xb5\xff\ +\x9a\x01\xa6\x02\xb6\xff\xd7\x01\xa6\x02\xb7\xff\x9a\x01\xa6\x02\ +\xb8\xff\xd7\x01\xa6\x02\xb9\xff\x9a\x01\xa6\x02\xba\xff\xd7\x01\ +\xa6\x02\xbd\xff\x85\x01\xa6\x02\xbe\xff\xd7\x01\xa6\x02\xbf\xff\ +\x9a\x01\xa6\x02\xc0\xff\xd7\x01\xa6\x02\xc1\xff\x9a\x01\xa6\x02\ +\xc2\xff\xd7\x01\xa6\x02\xd4\xff\x9a\x01\xa6\x02\xd5\xff\xd7\x01\ +\xa6\x02\xf7\xff\xd7\x01\xa6\x02\xf8\xff\xd7\x01\xa6\x02\xf9\xff\ +\xd7\x01\xa6\x02\xfa\xff\xd7\x01\xa6\x02\xfb\xff\xd7\x01\xa6\x02\ +\xfc\xff\xd7\x01\xa6\x02\xfd\xff\x9a\x01\xa6\x02\xfe\xff\xd7\x01\ +\xa6\x03\x03\xff\xae\x01\xa6\x03\x0d\xff\x9a\x01\xa6\x03\x0e\xff\ +\xc3\x01\xa6\x03\x0f\xff\x9a\x01\xa6\x03\x10\xff\xc3\x01\xa6\x03\ +\x17\xff\x85\x01\xa6\x03\x18\xff\xd7\x01\xa7\x01\x9f\xff\xd7\x01\ +\xa7\x01\xb8\xff\xd7\x01\xa7\x01\xbb\xff\xd7\x01\xa7\x01\xbe\xff\ +\xd7\x01\xa7\x01\xc1\xff\xd7\x01\xa7\x01\xe1\xff\xd7\x01\xa7\x02\ +l\xff\xd7\x01\xa7\x02|\xff\xd7\x01\xa7\x02~\xff\xd7\x01\ +\xa7\x02\x84\xff\xd7\x01\xa7\x02\x86\xff\xd7\x01\xa7\x02\x88\xff\ +\xd7\x01\xa7\x02\x8a\xff\xd7\x01\xa7\x02\x8c\xff\xd7\x01\xa7\x02\ +\xb1\xff\xd7\x01\xa7\x02\xb3\xff\xd7\x01\xa7\x02\xbf\xff\xd7\x01\ +\xa7\x02\xc0\xff\xd7\x01\xa7\x02\xc1\xff\xd7\x01\xa7\x02\xc2\xff\ +\xd7\x01\xa7\x02\xc5\xff\x9a\x01\xa7\x02\xc7\xff\x9a\x01\xa7\x02\ +\xd4\xff\xd7\x01\xa7\x02\xd5\xff\xd7\x01\xa7\x02\xef\xff\xd7\x01\ +\xa7\x02\xf1\xff\xd7\x01\xa7\x02\xf3\xff\xd7\x01\xa7\x02\xfd\xff\ +\xd7\x01\xa7\x02\xfe\xff\xd7\x01\xa7\x03\x09\xff\xd7\x01\xa7\x03\ +\x0b\xff\xd7\x01\xa7\x03\x0e\xff\xd7\x01\xa7\x03\x10\xff\xd7\x01\ +\xa7\x03\x15\xff\xd7\x01\xa7\x03\x19\xff\xec\x01\xa8\x00\x0f\xff\ +\x85\x01\xa8\x00\x11\xff\x85\x01\xa8\x01\x9f\xff\xec\x01\xa8\x01\ +\xa4\xff\x9a\x01\xa8\x01\xaa\xffq\x01\xa8\x01\xae\xff\x9a\x01\ +\xa8\x01\xb5\xff\x9a\x01\xa8\x01\xb8\xff\xec\x01\xa8\x01\xbb\xff\ +\xec\x01\xa8\x01\xbe\xff\xc3\x01\xa8\x01\xc9\xff\xec\x01\xa8\x01\ +\xce\xff\xae\x01\xa8\x01\xcf\xff\xd7\x01\xa8\x01\xd5\xff\xae\x01\ +\xa8\x01\xd8\xff\xd7\x01\xa8\x01\xdb\xff\xd7\x01\xa8\x01\xde\xff\ +\xd7\x01\xa8\x01\xe1\xff\xd7\x01\xa8\x01\xea\xff\xd7\x01\xa8\x01\ +\xeb\x00f\x01\xa8\x01\xed\xff\xd7\x01\xa8\x01\xee\xff\xec\x01\ +\xa8\x01\xf2\xff\xae\x01\xa8\x01\xf4\x00f\x01\xa8\x02\x08\xff\ +\x85\x01\xa8\x02\x0c\xff\x85\x01\xa8\x02j\xff\xd7\x01\xa8\x02\ +l\xff\xec\x01\xa8\x02r\xffq\x01\xa8\x02s\xff\xae\x01\ +\xa8\x02~\xff\xec\x01\xa8\x02\x7f\xff\xd7\x01\xa8\x02\x84\xff\ +\xec\x01\xa8\x02\x85\xff\xd7\x01\xa8\x02\x86\xff\xec\x01\xa8\x02\ +\x87\xff\xd7\x01\xa8\x02\x88\xff\xec\x01\xa8\x02\x89\xff\xd7\x01\ +\xa8\x02\x8a\xff\xec\x01\xa8\x02\x8c\xff\xec\x01\xa8\x02\x8d\xff\ +\xd7\x01\xa8\x02\x98\x00f\x01\xa8\x02\xa8\x00f\x01\xa8\x02\ +\xb1\xff\xec\x01\xa8\x02\xb2\xff\xd7\x01\xa8\x02\xb3\xff\xec\x01\ +\xa8\x02\xb4\xff\xd7\x01\xa8\x02\xc0\xff\xd7\x01\xa8\x02\xc2\xff\ +\xd7\x01\xa8\x02\xc5\xff\xd7\x01\xa8\x02\xc6\xff\xc3\x01\xa8\x02\ +\xc7\xff\xd7\x01\xa8\x02\xc8\xff\xc3\x01\xa8\x02\xce\xff\x9a\x01\ +\xa8\x02\xcf\xff\xae\x01\xa8\x02\xd5\xff\xd7\x01\xa8\x02\xd9\xff\ +q\x01\xa8\x02\xdb\xffq\x01\xa8\x02\xdd\xffq\x01\xa8\x02\ +\xe0\xff\xd7\x01\xa8\x02\xef\xff\xec\x01\xa8\x02\xf0\xff\xd7\x01\ +\xa8\x02\xf1\xff\xec\x01\xa8\x02\xf2\xff\xd7\x01\xa8\x02\xf3\xff\ +\xec\x01\xa8\x02\xf4\xff\xd7\x01\xa8\x02\xfe\xff\xd7\x01\xa8\x03\ +\x09\xffq\x01\xa8\x03\x0a\xff\xd7\x01\xa8\x03\x0b\xffq\x01\ +\xa8\x03\x0c\xff\xd7\x01\xa8\x03\x11\xff\x9a\x01\xa8\x03\x12\xff\ +\xae\x01\xa8\x03\x15\xff\xec\x01\xa8\x03\x16\xff\xd7\x01\xa8\x03\ +\x1a\xff\xd7\x01\xa8\x03\x1b\xff\x9a\x01\xa8\x03\x1c\xff\xae\x01\ +\xaa\x00\x05\xffq\x01\xaa\x00\x0a\xffq\x01\xaa\x01\x9d\xff\ +\x9a\x01\xaa\x01\xa6\xff\x9a\x01\xaa\x01\xbc\xffq\x01\xaa\x01\ +\xbe\xff\xd7\x01\xaa\x01\xc1\xff\x9a\x01\xaa\x01\xc4\xff\x9a\x01\ +\xaa\x01\xdc\xff\xd7\x01\xaa\x01\xe1\xff\xd7\x01\xaa\x01\xe4\xff\ +\xd7\x01\xaa\x02\x07\xffq\x01\xaa\x02\x0b\xffq\x01\xaa\x02\ +n\xff\xd7\x01\xaa\x02|\xff\x9a\x01\xaa\x02\x80\xff\xae\x01\ +\xaa\x02\x82\xff\xae\x01\xaa\x02\x97\xff\xd7\x01\xaa\x02\x9b\xff\ +\xd7\x01\xaa\x02\xa7\xff\xd7\x01\xaa\x02\xa9\xff\x9a\x01\xaa\x02\ +\xaa\xff\xd7\x01\xaa\x02\xb5\xffq\x01\xaa\x02\xb6\xff\xd7\x01\ +\xaa\x02\xb7\xff\x85\x01\xaa\x02\xb9\xff\x85\x01\xaa\x02\xbd\xff\ +\x9a\x01\xaa\x02\xbe\xff\xd7\x01\xaa\x02\xbf\xff\x9a\x01\xaa\x02\ +\xc0\xff\xd7\x01\xaa\x02\xc1\xff\x9a\x01\xaa\x02\xc2\xff\xd7\x01\ +\xaa\x02\xc5\xff\x9a\x01\xaa\x02\xc7\xff\x9a\x01\xaa\x02\xd4\xff\ +\x9a\x01\xaa\x02\xd5\xff\xd7\x01\xaa\x02\xe1\xff\xd7\x01\xaa\x02\ +\xe3\xff\xd7\x01\xaa\x02\xfd\xff\x9a\x01\xaa\x02\xfe\xff\xd7\x01\ +\xaa\x03\x03\xff\xd7\x01\xaa\x03\x0d\xffq\x01\xaa\x03\x0e\xff\ +\xd7\x01\xaa\x03\x0f\xffq\x01\xaa\x03\x10\xff\xd7\x01\xaa\x03\ +\x17\xff\x9a\x01\xaa\x03\x18\xff\xd7\x01\xab\x00\x05\xff\xd7\x01\ +\xab\x00\x0a\xff\xd7\x01\xab\x01\xaa\xff\xec\x01\xab\x01\xc1\xff\ +\xd7\x01\xab\x02\x07\xff\xd7\x01\xab\x02\x0b\xff\xd7\x01\xab\x02\ +r\xff\xec\x01\xab\x02|\xff\xd7\x01\xab\x02\xbf\xff\xd7\x01\ +\xab\x02\xc1\xff\xd7\x01\xab\x02\xc5\xff\xd7\x01\xab\x02\xc7\xff\ +\xd7\x01\xab\x02\xd4\xff\xd7\x01\xab\x02\xd9\xff\xec\x01\xab\x02\ +\xdb\xff\xec\x01\xab\x02\xdd\xff\xec\x01\xab\x02\xfd\xff\xd7\x01\ +\xac\x00\x0f\xff\xae\x01\xac\x00\x11\xff\xae\x01\xac\x02\x08\xff\ +\xae\x01\xac\x02\x0c\xff\xae\x01\xac\x02\x80\xff\xec\x01\xac\x02\ +\x82\xff\xec\x01\xac\x02\xb7\xff\xec\x01\xac\x02\xb9\xff\xec\x01\ +\xac\x03\x0d\xff\xd7\x01\xac\x03\x0f\xff\xd7\x01\xad\x00\x0f\xff\ +\x85\x01\xad\x00\x10\xff\xae\x01\xad\x00\x11\xff\x85\x01\xad\x01\ +\x9f\xff\xd7\x01\xad\x01\xa4\xff\x9a\x01\xad\x01\xaa\xffq\x01\ +\xad\x01\xae\xff\x9a\x01\xad\x01\xb5\xff\x9a\x01\xad\x01\xb8\xff\ +\xd7\x01\xad\x01\xbb\xff\xd7\x01\xad\x01\xbc\x00)\x01\xad\x01\ +\xbe\xff\xae\x01\xad\x01\xcc\xff\x9a\x01\xad\x01\xcd\xff\x9a\x01\ +\xad\x01\xce\xff\x85\x01\xad\x01\xcf\xffq\x01\xad\x01\xd0\xff\ +\xd7\x01\xad\x01\xd1\xff\xd7\x01\xad\x01\xd2\xff\x9a\x01\xad\x01\ +\xd3\xff\x9a\x01\xad\x01\xd4\xff\x9a\x01\xad\x01\xd5\xff\x85\x01\ +\xad\x01\xd6\xff\x9a\x01\xad\x01\xd7\xff\x9a\x01\xad\x01\xd8\xff\ +q\x01\xad\x01\xd9\xff\x9a\x01\xad\x01\xda\xff\x9a\x01\xad\x01\ +\xdb\xffq\x01\xad\x01\xdc\xff\xae\x01\xad\x01\xdd\xff\xae\x01\ +\xad\x01\xde\xffq\x01\xad\x01\xdf\xff\xd7\x01\xad\x01\xe0\xff\ +\x9a\x01\xad\x01\xe1\xff\x9a\x01\xad\x01\xe2\xff\x9a\x01\xad\x01\ +\xe3\xff\x9a\x01\xad\x01\xe4\xff\xae\x01\xad\x01\xe5\xff\x9a\x01\ +\xad\x01\xe6\xff\x9a\x01\xad\x01\xe7\xff\xd7\x01\xad\x01\xe8\xff\ +\x9a\x01\xad\x01\xe9\xff\xc3\x01\xad\x01\xea\xffq\x01\xad\x01\ +\xec\xff\x9a\x01\xad\x01\xed\xffq\x01\xad\x01\xee\xff\x85\x01\ +\xad\x01\xf2\xff\x85\x01\xad\x01\xf3\xff\x9a\x01\xad\x01\xf5\xff\ +\x9a\x01\xad\x01\xf6\xff\xae\x01\xad\x01\xf7\xff\x9a\x01\xad\x01\ +\xf9\xff\x9a\x01\xad\x02\x02\xff\xae\x01\xad\x02\x03\xff\xae\x01\ +\xad\x02\x04\xff\xae\x01\xad\x02\x08\xff\x85\x01\xad\x02\x0c\xff\ +\x85\x01\xad\x02j\xffq\x01\xad\x02k\xff\x9a\x01\xad\x02\ +l\xff\xd7\x01\xad\x02m\xff\xd7\x01\xad\x02q\xff\x9a\x01\ +\xad\x02r\xffq\x01\xad\x02s\xff\x85\x01\xad\x02u\xff\ +\x9a\x01\xad\x02w\xff\x9a\x01\xad\x02y\xff\x9a\x01\xad\x02\ +}\xff\x9a\x01\xad\x02~\xff\xd7\x01\xad\x02\x7f\xffq\x01\ +\xad\x02\x81\xff\xd7\x01\xad\x02\x83\xff\xd7\x01\xad\x02\x84\xff\ +\xd7\x01\xad\x02\x85\xffq\x01\xad\x02\x86\xff\xd7\x01\xad\x02\ +\x87\xffq\x01\xad\x02\x88\xff\xd7\x01\xad\x02\x89\xffq\x01\ +\xad\x02\x8a\xff\xd7\x01\xad\x02\x8b\xff\xd7\x01\xad\x02\x8c\xff\ +\xd7\x01\xad\x02\x8d\xffq\x01\xad\x02\x96\xff\x9a\x01\xad\x02\ +\x9a\xff\x9a\x01\xad\x02\x9e\xff\x9a\x01\xad\x02\xa0\xff\xd7\x01\ +\xad\x02\xa2\xff\xd7\x01\xad\x02\xa4\xff\x9a\x01\xad\x02\xa6\xff\ +\x9a\x01\xad\x02\xaa\xff\xae\x01\xad\x02\xac\xff\x9a\x01\xad\x02\ +\xae\xff\x9a\x01\xad\x02\xb0\xff\x9a\x01\xad\x02\xb1\xff\xd7\x01\ +\xad\x02\xb2\xffq\x01\xad\x02\xb3\xff\xd7\x01\xad\x02\xb4\xff\ +q\x01\xad\x02\xb5\x00)\x01\xad\x02\xb6\xff\xae\x01\xad\x02\ +\xb8\xff\xae\x01\xad\x02\xba\xff\xae\x01\xad\x02\xbc\xff\xd7\x01\ +\xad\x02\xbe\xff\xae\x01\xad\x02\xc0\xff\x9a\x01\xad\x02\xc2\xff\ +\x9a\x01\xad\x02\xc4\xff\x9a\x01\xad\x02\xc5\xff\x9a\x01\xad\x02\ +\xc6\xffq\x01\xad\x02\xc7\xff\x9a\x01\xad\x02\xc8\xffq\x01\ +\xad\x02\xcb\xff\xd7\x01\xad\x02\xcd\xff\x9a\x01\xad\x02\xce\xff\ +\x9a\x01\xad\x02\xcf\xff\x85\x01\xad\x02\xd1\xff\x9a\x01\xad\x02\ +\xd3\xff\x9a\x01\xad\x02\xd5\xff\x9a\x01\xad\x02\xd7\xff\x9a\x01\ +\xad\x02\xd9\xffq\x01\xad\x02\xdb\xffq\x01\xad\x02\xdd\xff\ +q\x01\xad\x02\xe0\xffq\x01\xad\x02\xe6\xff\xd7\x01\xad\x02\ +\xe8\xff\xd7\x01\xad\x02\xea\xff\xc3\x01\xad\x02\xec\xff\x9a\x01\ +\xad\x02\xee\xff\x9a\x01\xad\x02\xef\xff\xd7\x01\xad\x02\xf0\xff\ +q\x01\xad\x02\xf1\xff\xd7\x01\xad\x02\xf2\xffq\x01\xad\x02\ +\xf3\xff\xd7\x01\xad\x02\xf4\xffq\x01\xad\x02\xf6\xff\xd7\x01\ +\xad\x02\xf8\xff\xae\x01\xad\x02\xfa\xff\xae\x01\xad\x02\xfc\xff\ +\xae\x01\xad\x02\xfe\xff\x9a\x01\xad\x03\x00\xff\x9a\x01\xad\x03\ +\x02\xff\x9a\x01\xad\x03\x06\xff\xd7\x01\xad\x03\x08\xff\xd7\x01\ +\xad\x03\x09\xffq\x01\xad\x03\x0a\xffq\x01\xad\x03\x0b\xff\ +q\x01\xad\x03\x0c\xffq\x01\xad\x03\x0e\xff\x9a\x01\xad\x03\ +\x10\xff\x9a\x01\xad\x03\x11\xff\x9a\x01\xad\x03\x12\xff\x85\x01\ +\xad\x03\x14\xff\x9a\x01\xad\x03\x15\xff\xd7\x01\xad\x03\x16\xff\ +q\x01\xad\x03\x18\xff\xae\x01\xad\x03\x1a\xffq\x01\xad\x03\ +\x1b\xff\x9a\x01\xad\x03\x1c\xff\x85\x01\xae\x01\xa3\x00\xe1\x01\ +\xae\x02\xea\x00)\x01\xae\x03\x0e\xff\xd7\x01\xae\x03\x10\xff\ +\xd7\x01\xb0\x01\x9f\xff\xd7\x01\xb0\x01\xb8\xff\xd7\x01\xb0\x01\ +\xbb\xff\xd7\x01\xb0\x01\xbe\xff\xd7\x01\xb0\x01\xc1\xff\xd7\x01\ +\xb0\x01\xe1\xff\xd7\x01\xb0\x02l\xff\xd7\x01\xb0\x02|\xff\ +\xd7\x01\xb0\x02~\xff\xd7\x01\xb0\x02\x84\xff\xd7\x01\xb0\x02\ +\x86\xff\xd7\x01\xb0\x02\x88\xff\xd7\x01\xb0\x02\x8a\xff\xd7\x01\ +\xb0\x02\x8c\xff\xd7\x01\xb0\x02\xb1\xff\xd7\x01\xb0\x02\xb3\xff\ +\xd7\x01\xb0\x02\xbf\xff\xd7\x01\xb0\x02\xc0\xff\xd7\x01\xb0\x02\ +\xc1\xff\xd7\x01\xb0\x02\xc2\xff\xd7\x01\xb0\x02\xc5\xff\x9a\x01\ +\xb0\x02\xc7\xff\x9a\x01\xb0\x02\xd4\xff\xd7\x01\xb0\x02\xd5\xff\ +\xd7\x01\xb0\x02\xef\xff\xd7\x01\xb0\x02\xf1\xff\xd7\x01\xb0\x02\ +\xf3\xff\xd7\x01\xb0\x02\xfd\xff\xd7\x01\xb0\x02\xfe\xff\xd7\x01\ +\xb0\x03\x09\xff\xd7\x01\xb0\x03\x0b\xff\xd7\x01\xb0\x03\x0e\xff\ +\xd7\x01\xb0\x03\x10\xff\xd7\x01\xb0\x03\x15\xff\xd7\x01\xb0\x03\ +\x19\xff\xec\x01\xb1\x00\x0f\xff\xae\x01\xb1\x00\x11\xff\xae\x01\ +\xb1\x02\x08\xff\xae\x01\xb1\x02\x0c\xff\xae\x01\xb1\x02\x80\xff\ +\xec\x01\xb1\x02\x82\xff\xec\x01\xb1\x02\xb7\xff\xec\x01\xb1\x02\ +\xb9\xff\xec\x01\xb1\x03\x0d\xff\xd7\x01\xb1\x03\x0f\xff\xd7\x01\ +\xb4\x01\x9f\xff\xd7\x01\xb4\x01\xb8\xff\xd7\x01\xb4\x01\xbb\xff\ +\xd7\x01\xb4\x01\xbe\xff\xd7\x01\xb4\x01\xc1\xff\xd7\x01\xb4\x01\ +\xe1\xff\xd7\x01\xb4\x02l\xff\xd7\x01\xb4\x02|\xff\xd7\x01\ +\xb4\x02~\xff\xd7\x01\xb4\x02\x84\xff\xd7\x01\xb4\x02\x86\xff\ +\xd7\x01\xb4\x02\x88\xff\xd7\x01\xb4\x02\x8a\xff\xd7\x01\xb4\x02\ +\x8c\xff\xd7\x01\xb4\x02\xb1\xff\xd7\x01\xb4\x02\xb3\xff\xd7\x01\ +\xb4\x02\xbf\xff\xd7\x01\xb4\x02\xc0\xff\xd7\x01\xb4\x02\xc1\xff\ +\xd7\x01\xb4\x02\xc2\xff\xd7\x01\xb4\x02\xc5\xff\x9a\x01\xb4\x02\ +\xc7\xff\x9a\x01\xb4\x02\xd4\xff\xd7\x01\xb4\x02\xd5\xff\xd7\x01\ +\xb4\x02\xef\xff\xd7\x01\xb4\x02\xf1\xff\xd7\x01\xb4\x02\xf3\xff\ +\xd7\x01\xb4\x02\xfd\xff\xd7\x01\xb4\x02\xfe\xff\xd7\x01\xb4\x03\ +\x09\xff\xd7\x01\xb4\x03\x0b\xff\xd7\x01\xb4\x03\x0e\xff\xd7\x01\ +\xb4\x03\x10\xff\xd7\x01\xb4\x03\x15\xff\xd7\x01\xb4\x03\x19\xff\ +\xec\x01\xb8\x00\x0f\xff\xae\x01\xb8\x00\x11\xff\xae\x01\xb8\x01\ +\x9d\xff\xec\x01\xb8\x01\xa4\xff\xd7\x01\xb8\x01\xa6\xff\xec\x01\ +\xb8\x01\xa8\xff\xd7\x01\xb8\x01\xaa\xff\xd7\x01\xb8\x01\xae\xff\ +\xd7\x01\xb8\x01\xb0\xff\xd7\x01\xb8\x01\xb1\xff\xec\x01\xb8\x01\ +\xb5\xff\xd7\x01\xb8\x01\xbc\xff\xc3\x01\xb8\x01\xbd\xff\xd7\x01\ +\xb8\x01\xbf\xff\xd7\x01\xb8\x01\xc1\xff\xd7\x01\xb8\x01\xc4\xff\ +\xec\x01\xb8\x01\xc7\xff\xec\x01\xb8\x01\xce\xff\xec\x01\xb8\x01\ +\xd5\xff\xec\x01\xb8\x01\xf2\xff\xec\x01\xb8\x02\x08\xff\xae\x01\ +\xb8\x02\x0c\xff\xae\x01\xb8\x02r\xff\xd7\x01\xb8\x02s\xff\ +\xec\x01\xb8\x02z\xff\xec\x01\xb8\x02|\xff\xd7\x01\xb8\x02\ +\x80\xff\xec\x01\xb8\x02\x82\xff\xec\x01\xb8\x02\x9f\xff\xd7\x01\ +\xb8\x02\xa1\xff\xec\x01\xb8\x02\xa9\xff\xec\x01\xb8\x02\xb5\xff\ +\xc3\x01\xb8\x02\xb7\xff\xec\x01\xb8\x02\xb9\xff\xec\x01\xb8\x02\ +\xbb\xff\xd7\x01\xb8\x02\xbd\xff\xec\x01\xb8\x02\xbf\xff\xd7\x01\ +\xb8\x02\xc1\xff\xd7\x01\xb8\x02\xca\xff\xd7\x01\xb8\x02\xce\xff\ +\xd7\x01\xb8\x02\xcf\xff\xec\x01\xb8\x02\xd4\xff\xd7\x01\xb8\x02\ +\xd9\xff\xd7\x01\xb8\x02\xdb\xff\xd7\x01\xb8\x02\xdd\xff\xd7\x01\ +\xb8\x02\xe5\xff\xd7\x01\xb8\x02\xe7\xff\xec\x01\xb8\x02\xf5\xff\ +\xec\x01\xb8\x02\xf7\xff\xd7\x01\xb8\x02\xf9\xff\xd7\x01\xb8\x02\ +\xfb\xff\xd7\x01\xb8\x02\xfd\xff\xd7\x01\xb8\x03\x05\xff\xd7\x01\ +\xb8\x03\x07\xff\xd7\x01\xb8\x03\x0d\xff\xd7\x01\xb8\x03\x0f\xff\ +\xd7\x01\xb8\x03\x11\xff\xd7\x01\xb8\x03\x12\xff\xec\x01\xb8\x03\ +\x17\xff\xec\x01\xb8\x03\x1b\xff\xd7\x01\xb8\x03\x1c\xff\xec\x01\ +\xba\x00\x0f\xfe\xf6\x01\xba\x00\x11\xfe\xf6\x01\xba\x01\xa4\xff\ +\x85\x01\xba\x01\xaa\xff\x9a\x01\xba\x01\xae\xff\x85\x01\xba\x01\ +\xb0\xff\xd7\x01\xba\x01\xb5\xff\x85\x01\xba\x01\xbf\xff\xd7\x01\ +\xba\x01\xce\xff\x9a\x01\xba\x01\xd5\xff\x9a\x01\xba\x01\xf2\xff\ +\x9a\x01\xba\x02\x08\xfe\xf6\x01\xba\x02\x0c\xfe\xf6\x01\xba\x02\ +r\xff\x9a\x01\xba\x02s\xff\x9a\x01\xba\x02v\xff\xec\x01\ +\xba\x02\x9f\xff\xd7\x01\xba\x02\xbb\xff\xd7\x01\xba\x02\xca\xff\ +\xd7\x01\xba\x02\xce\xff\x85\x01\xba\x02\xcf\xff\x9a\x01\xba\x02\ +\xd9\xff\x9a\x01\xba\x02\xdb\xff\x9a\x01\xba\x02\xdd\xff\x9a\x01\ +\xba\x02\xe5\xff\xd7\x01\xba\x03\x05\xff\xd7\x01\xba\x03\x07\xff\ +\xd7\x01\xba\x03\x09\xff\xae\x01\xba\x03\x0b\xff\xae\x01\xba\x03\ +\x11\xff\x85\x01\xba\x03\x12\xff\x9a\x01\xba\x03\x1b\xff\x85\x01\ +\xba\x03\x1c\xff\x9a\x01\xbb\x01\x9f\xff\xd7\x01\xbb\x01\xb8\xff\ +\xd7\x01\xbb\x01\xbb\xff\xd7\x01\xbb\x01\xbe\xff\xd7\x01\xbb\x01\ +\xe1\xff\xd7\x01\xbb\x02l\xff\xd7\x01\xbb\x02~\xff\xd7\x01\ +\xbb\x02\x84\xff\xd7\x01\xbb\x02\x86\xff\xd7\x01\xbb\x02\x88\xff\ +\xd7\x01\xbb\x02\x8a\xff\xd7\x01\xbb\x02\x8c\xff\xd7\x01\xbb\x02\ +\xb1\xff\xd7\x01\xbb\x02\xb3\xff\xd7\x01\xbb\x02\xc0\xff\xd7\x01\ +\xbb\x02\xc2\xff\xd7\x01\xbb\x02\xc5\xff\xd7\x01\xbb\x02\xc7\xff\ +\xd7\x01\xbb\x02\xd5\xff\xd7\x01\xbb\x02\xef\xff\xd7\x01\xbb\x02\ +\xf1\xff\xd7\x01\xbb\x02\xf3\xff\xd7\x01\xbb\x02\xfe\xff\xd7\x01\ +\xbb\x03\x09\xff\xd7\x01\xbb\x03\x0b\xff\xd7\x01\xbb\x03\x0e\xff\ +\xd7\x01\xbb\x03\x10\xff\xd7\x01\xbb\x03\x15\xff\xd7\x01\xbc\x00\ +\x0f\xff\x85\x01\xbc\x00\x10\xff\xae\x01\xbc\x00\x11\xff\x85\x01\ +\xbc\x01\x9f\xff\xd7\x01\xbc\x01\xa4\xff\x9a\x01\xbc\x01\xaa\xff\ +q\x01\xbc\x01\xae\xff\x9a\x01\xbc\x01\xb5\xff\x9a\x01\xbc\x01\ +\xb8\xff\xd7\x01\xbc\x01\xbb\xff\xd7\x01\xbc\x01\xbc\x00)\x01\ +\xbc\x01\xbe\xff\xae\x01\xbc\x01\xcc\xff\x9a\x01\xbc\x01\xcd\xff\ +\x9a\x01\xbc\x01\xce\xff\x85\x01\xbc\x01\xcf\xffq\x01\xbc\x01\ +\xd0\xff\xd7\x01\xbc\x01\xd1\xff\xd7\x01\xbc\x01\xd2\xff\x9a\x01\ +\xbc\x01\xd3\xff\x9a\x01\xbc\x01\xd4\xff\x9a\x01\xbc\x01\xd5\xff\ +\x85\x01\xbc\x01\xd6\xff\x9a\x01\xbc\x01\xd7\xff\x9a\x01\xbc\x01\ +\xd8\xffq\x01\xbc\x01\xd9\xff\x9a\x01\xbc\x01\xda\xff\x9a\x01\ +\xbc\x01\xdb\xffq\x01\xbc\x01\xdc\xff\xae\x01\xbc\x01\xdd\xff\ +\xae\x01\xbc\x01\xde\xffq\x01\xbc\x01\xdf\xff\xd7\x01\xbc\x01\ +\xe0\xff\x9a\x01\xbc\x01\xe1\xff\x9a\x01\xbc\x01\xe2\xff\x9a\x01\ +\xbc\x01\xe3\xff\x9a\x01\xbc\x01\xe4\xff\xae\x01\xbc\x01\xe5\xff\ +\x9a\x01\xbc\x01\xe6\xff\x9a\x01\xbc\x01\xe7\xff\xd7\x01\xbc\x01\ +\xe8\xff\x9a\x01\xbc\x01\xe9\xff\xc3\x01\xbc\x01\xea\xffq\x01\ +\xbc\x01\xec\xff\x9a\x01\xbc\x01\xed\xffq\x01\xbc\x01\xee\xff\ +\x85\x01\xbc\x01\xf2\xff\x85\x01\xbc\x01\xf3\xff\x9a\x01\xbc\x01\ +\xf5\xff\x9a\x01\xbc\x01\xf6\xff\xae\x01\xbc\x01\xf7\xff\x9a\x01\ +\xbc\x01\xf9\xff\x9a\x01\xbc\x02\x02\xff\xae\x01\xbc\x02\x03\xff\ +\xae\x01\xbc\x02\x04\xff\xae\x01\xbc\x02\x08\xff\x85\x01\xbc\x02\ +\x0c\xff\x85\x01\xbc\x02j\xffq\x01\xbc\x02k\xff\x9a\x01\ +\xbc\x02l\xff\xd7\x01\xbc\x02m\xff\xd7\x01\xbc\x02q\xff\ +\x9a\x01\xbc\x02r\xffq\x01\xbc\x02s\xff\x85\x01\xbc\x02\ +u\xff\x9a\x01\xbc\x02w\xff\x9a\x01\xbc\x02y\xff\x9a\x01\ +\xbc\x02}\xff\x9a\x01\xbc\x02~\xff\xd7\x01\xbc\x02\x7f\xff\ +q\x01\xbc\x02\x81\xff\xd7\x01\xbc\x02\x83\xff\xd7\x01\xbc\x02\ +\x84\xff\xd7\x01\xbc\x02\x85\xffq\x01\xbc\x02\x86\xff\xd7\x01\ +\xbc\x02\x87\xffq\x01\xbc\x02\x88\xff\xd7\x01\xbc\x02\x89\xff\ +q\x01\xbc\x02\x8a\xff\xd7\x01\xbc\x02\x8b\xff\xd7\x01\xbc\x02\ +\x8c\xff\xd7\x01\xbc\x02\x8d\xffq\x01\xbc\x02\x96\xff\x9a\x01\ +\xbc\x02\x9a\xff\x9a\x01\xbc\x02\x9e\xff\x9a\x01\xbc\x02\xa0\xff\ +\xd7\x01\xbc\x02\xa2\xff\xd7\x01\xbc\x02\xa4\xff\x9a\x01\xbc\x02\ +\xa6\xff\x9a\x01\xbc\x02\xaa\xff\xae\x01\xbc\x02\xac\xff\x9a\x01\ +\xbc\x02\xae\xff\x9a\x01\xbc\x02\xb0\xff\x9a\x01\xbc\x02\xb1\xff\ +\xd7\x01\xbc\x02\xb2\xffq\x01\xbc\x02\xb3\xff\xd7\x01\xbc\x02\ +\xb4\xffq\x01\xbc\x02\xb5\x00)\x01\xbc\x02\xb6\xff\xae\x01\ +\xbc\x02\xb8\xff\xae\x01\xbc\x02\xba\xff\xae\x01\xbc\x02\xbc\xff\ +\xd7\x01\xbc\x02\xbe\xff\xae\x01\xbc\x02\xc0\xff\x9a\x01\xbc\x02\ +\xc2\xff\x9a\x01\xbc\x02\xc4\xff\x9a\x01\xbc\x02\xc5\xff\x9a\x01\ +\xbc\x02\xc6\xffq\x01\xbc\x02\xc7\xff\x9a\x01\xbc\x02\xc8\xff\ +q\x01\xbc\x02\xcb\xff\xd7\x01\xbc\x02\xcd\xff\x9a\x01\xbc\x02\ +\xce\xff\x9a\x01\xbc\x02\xcf\xff\x85\x01\xbc\x02\xd1\xff\x9a\x01\ +\xbc\x02\xd3\xff\x9a\x01\xbc\x02\xd5\xff\x9a\x01\xbc\x02\xd7\xff\ +\x9a\x01\xbc\x02\xd9\xffq\x01\xbc\x02\xdb\xffq\x01\xbc\x02\ +\xdd\xffq\x01\xbc\x02\xe0\xffq\x01\xbc\x02\xe6\xff\xd7\x01\ +\xbc\x02\xe8\xff\xd7\x01\xbc\x02\xea\xff\xc3\x01\xbc\x02\xec\xff\ +\x9a\x01\xbc\x02\xee\xff\x9a\x01\xbc\x02\xef\xff\xd7\x01\xbc\x02\ +\xf0\xffq\x01\xbc\x02\xf1\xff\xd7\x01\xbc\x02\xf2\xffq\x01\ +\xbc\x02\xf3\xff\xd7\x01\xbc\x02\xf4\xffq\x01\xbc\x02\xf6\xff\ +\xd7\x01\xbc\x02\xf8\xff\xae\x01\xbc\x02\xfa\xff\xae\x01\xbc\x02\ +\xfc\xff\xae\x01\xbc\x02\xfe\xff\x9a\x01\xbc\x03\x00\xff\x9a\x01\ +\xbc\x03\x02\xff\x9a\x01\xbc\x03\x06\xff\xd7\x01\xbc\x03\x08\xff\ +\xd7\x01\xbc\x03\x09\xffq\x01\xbc\x03\x0a\xffq\x01\xbc\x03\ +\x0b\xffq\x01\xbc\x03\x0c\xffq\x01\xbc\x03\x0e\xff\x9a\x01\ +\xbc\x03\x10\xff\x9a\x01\xbc\x03\x11\xff\x9a\x01\xbc\x03\x12\xff\ +\x85\x01\xbc\x03\x14\xff\x9a\x01\xbc\x03\x15\xff\xd7\x01\xbc\x03\ +\x16\xffq\x01\xbc\x03\x18\xff\xae\x01\xbc\x03\x1a\xffq\x01\ +\xbc\x03\x1b\xff\x9a\x01\xbc\x03\x1c\xff\x85\x01\xbd\x00\x0f\xff\ +\x85\x01\xbd\x00\x11\xff\x85\x01\xbd\x01\x9f\xff\xec\x01\xbd\x01\ +\xa4\xff\x9a\x01\xbd\x01\xaa\xffq\x01\xbd\x01\xae\xff\x9a\x01\ +\xbd\x01\xb5\xff\x9a\x01\xbd\x01\xb8\xff\xec\x01\xbd\x01\xbb\xff\ +\xec\x01\xbd\x01\xbe\xff\xc3\x01\xbd\x01\xc9\xff\xec\x01\xbd\x01\ +\xce\xff\xae\x01\xbd\x01\xcf\xff\xd7\x01\xbd\x01\xd5\xff\xae\x01\ +\xbd\x01\xd8\xff\xd7\x01\xbd\x01\xdb\xff\xd7\x01\xbd\x01\xde\xff\ +\xd7\x01\xbd\x01\xe1\xff\xd7\x01\xbd\x01\xea\xff\xd7\x01\xbd\x01\ +\xeb\x00f\x01\xbd\x01\xed\xff\xd7\x01\xbd\x01\xee\xff\xec\x01\ +\xbd\x01\xf2\xff\xae\x01\xbd\x01\xf4\x00f\x01\xbd\x02\x08\xff\ +\x85\x01\xbd\x02\x0c\xff\x85\x01\xbd\x02j\xff\xd7\x01\xbd\x02\ +l\xff\xec\x01\xbd\x02r\xffq\x01\xbd\x02s\xff\xae\x01\ +\xbd\x02~\xff\xec\x01\xbd\x02\x7f\xff\xd7\x01\xbd\x02\x84\xff\ +\xec\x01\xbd\x02\x85\xff\xd7\x01\xbd\x02\x86\xff\xec\x01\xbd\x02\ +\x87\xff\xd7\x01\xbd\x02\x88\xff\xec\x01\xbd\x02\x89\xff\xd7\x01\ +\xbd\x02\x8a\xff\xec\x01\xbd\x02\x8c\xff\xec\x01\xbd\x02\x8d\xff\ +\xd7\x01\xbd\x02\x98\x00f\x01\xbd\x02\xa8\x00f\x01\xbd\x02\ +\xb1\xff\xec\x01\xbd\x02\xb2\xff\xd7\x01\xbd\x02\xb3\xff\xec\x01\ +\xbd\x02\xb4\xff\xd7\x01\xbd\x02\xc0\xff\xd7\x01\xbd\x02\xc2\xff\ +\xd7\x01\xbd\x02\xc5\xff\xd7\x01\xbd\x02\xc6\xff\xc3\x01\xbd\x02\ +\xc7\xff\xd7\x01\xbd\x02\xc8\xff\xc3\x01\xbd\x02\xce\xff\x9a\x01\ +\xbd\x02\xcf\xff\xae\x01\xbd\x02\xd5\xff\xd7\x01\xbd\x02\xd9\xff\ +q\x01\xbd\x02\xdb\xffq\x01\xbd\x02\xdd\xffq\x01\xbd\x02\ +\xe0\xff\xd7\x01\xbd\x02\xef\xff\xec\x01\xbd\x02\xf0\xff\xd7\x01\ +\xbd\x02\xf1\xff\xec\x01\xbd\x02\xf2\xff\xd7\x01\xbd\x02\xf3\xff\ +\xec\x01\xbd\x02\xf4\xff\xd7\x01\xbd\x02\xfe\xff\xd7\x01\xbd\x03\ +\x09\xffq\x01\xbd\x03\x0a\xff\xd7\x01\xbd\x03\x0b\xffq\x01\ +\xbd\x03\x0c\xff\xd7\x01\xbd\x03\x11\xff\x9a\x01\xbd\x03\x12\xff\ +\xae\x01\xbd\x03\x15\xff\xec\x01\xbd\x03\x16\xff\xd7\x01\xbd\x03\ +\x1a\xff\xd7\x01\xbd\x03\x1b\xff\x9a\x01\xbd\x03\x1c\xff\xae\x01\ +\xbe\x00\x0f\xff\xae\x01\xbe\x00\x11\xff\xae\x01\xbe\x01\x9d\xff\ +\xd7\x01\xbe\x01\xa4\xff\xd7\x01\xbe\x01\xa6\xff\xd7\x01\xbe\x01\ +\xa8\xff\xc3\x01\xbe\x01\xaa\xff\xd7\x01\xbe\x01\xae\xff\xd7\x01\ +\xbe\x01\xb0\xff\xd7\x01\xbe\x01\xb1\xff\xd7\x01\xbe\x01\xb5\xff\ +\xd7\x01\xbe\x01\xbc\xff\xc3\x01\xbe\x01\xbd\xff\xc3\x01\xbe\x01\ +\xbf\xff\xd7\x01\xbe\x01\xc4\xff\xd7\x01\xbe\x01\xc7\xff\xd7\x01\ +\xbe\x01\xce\xff\xec\x01\xbe\x01\xd5\xff\xec\x01\xbe\x01\xf2\xff\ +\xec\x01\xbe\x02\x08\xff\xae\x01\xbe\x02\x0c\xff\xae\x01\xbe\x02\ +r\xff\xd7\x01\xbe\x02s\xff\xec\x01\xbe\x02z\xff\xd7\x01\ +\xbe\x02\x80\xff\xec\x01\xbe\x02\x82\xff\xec\x01\xbe\x02\x9f\xff\ +\xd7\x01\xbe\x02\xa1\xff\xd7\x01\xbe\x02\xa9\xff\xd7\x01\xbe\x02\ +\xb5\xff\xc3\x01\xbe\x02\xb7\xff\xc3\x01\xbe\x02\xb9\xff\xc3\x01\ +\xbe\x02\xbb\xff\xd7\x01\xbe\x02\xbd\xff\xd7\x01\xbe\x02\xca\xff\ +\xd7\x01\xbe\x02\xce\xff\xd7\x01\xbe\x02\xcf\xff\xec\x01\xbe\x02\ +\xd9\xff\xd7\x01\xbe\x02\xdb\xff\xd7\x01\xbe\x02\xdd\xff\xd7\x01\ +\xbe\x02\xe5\xff\xd7\x01\xbe\x02\xe7\xff\xd7\x01\xbe\x02\xf5\xff\ +\xd7\x01\xbe\x02\xf7\xff\xc3\x01\xbe\x02\xf9\xff\xc3\x01\xbe\x02\ +\xfb\xff\xc3\x01\xbe\x03\x05\xff\xd7\x01\xbe\x03\x07\xff\xd7\x01\ +\xbe\x03\x0d\xff\xd7\x01\xbe\x03\x0f\xff\xd7\x01\xbe\x03\x11\xff\ +\xd7\x01\xbe\x03\x12\xff\xec\x01\xbe\x03\x17\xff\xd7\x01\xbe\x03\ +\x1b\xff\xd7\x01\xbe\x03\x1c\xff\xec\x01\xbf\x01\x9f\xff\xd7\x01\ +\xbf\x01\xb8\xff\xd7\x01\xbf\x01\xbb\xff\xd7\x01\xbf\x01\xbe\xff\ +\xd7\x01\xbf\x01\xc1\xff\xd7\x01\xbf\x01\xe1\xff\xd7\x01\xbf\x02\ +l\xff\xd7\x01\xbf\x02|\xff\xd7\x01\xbf\x02~\xff\xd7\x01\ +\xbf\x02\x84\xff\xd7\x01\xbf\x02\x86\xff\xd7\x01\xbf\x02\x88\xff\ +\xd7\x01\xbf\x02\x8a\xff\xd7\x01\xbf\x02\x8c\xff\xd7\x01\xbf\x02\ +\xb1\xff\xd7\x01\xbf\x02\xb3\xff\xd7\x01\xbf\x02\xbf\xff\xd7\x01\ +\xbf\x02\xc0\xff\xd7\x01\xbf\x02\xc1\xff\xd7\x01\xbf\x02\xc2\xff\ +\xd7\x01\xbf\x02\xc5\xff\x9a\x01\xbf\x02\xc7\xff\x9a\x01\xbf\x02\ +\xd4\xff\xd7\x01\xbf\x02\xd5\xff\xd7\x01\xbf\x02\xef\xff\xd7\x01\ +\xbf\x02\xf1\xff\xd7\x01\xbf\x02\xf3\xff\xd7\x01\xbf\x02\xfd\xff\ +\xd7\x01\xbf\x02\xfe\xff\xd7\x01\xbf\x03\x09\xff\xd7\x01\xbf\x03\ +\x0b\xff\xd7\x01\xbf\x03\x0e\xff\xd7\x01\xbf\x03\x10\xff\xd7\x01\ +\xbf\x03\x15\xff\xd7\x01\xbf\x03\x19\xff\xec\x01\xc0\x01\xa3\x00\ +\xe1\x01\xc0\x02\xea\x00)\x01\xc0\x03\x0e\xff\xd7\x01\xc0\x03\ +\x10\xff\xd7\x01\xc3\x01\xa3\x00\xe1\x01\xc3\x02\xea\x00)\x01\ +\xc3\x03\x0e\xff\xd7\x01\xc3\x03\x10\xff\xd7\x01\xc4\x00\x05\xff\ +\xae\x01\xc4\x00\x0a\xff\xae\x01\xc4\x01\x9d\xff\x85\x01\xc4\x01\ +\xa6\xff\x85\x01\xc4\x01\xa8\xff\xd7\x01\xc4\x01\xbc\xff\x9a\x01\ +\xc4\x01\xbd\xff\xd7\x01\xc4\x01\xc1\xff\x9a\x01\xc4\x01\xc4\xff\ +\x85\x01\xc4\x01\xdc\xff\xd7\x01\xc4\x01\xdd\xff\xd7\x01\xc4\x01\ +\xe1\xff\xd7\x01\xc4\x01\xe4\xff\xd7\x01\xc4\x01\xf6\xff\xd7\x01\ +\xc4\x02\x07\xff\xae\x01\xc4\x02\x0b\xff\xae\x01\xc4\x02n\xff\ +\xae\x01\xc4\x02|\xff\x9a\x01\xc4\x02\x80\xff\xae\x01\xc4\x02\ +\x82\xff\xae\x01\xc4\x02\x97\xff\xae\x01\xc4\x02\x9b\xff\xae\x01\ +\xc4\x02\xa7\xff\xae\x01\xc4\x02\xa9\xff\x85\x01\xc4\x02\xaa\xff\ +\xd7\x01\xc4\x02\xb5\xff\x9a\x01\xc4\x02\xb6\xff\xd7\x01\xc4\x02\ +\xb7\xff\x9a\x01\xc4\x02\xb8\xff\xd7\x01\xc4\x02\xb9\xff\x9a\x01\ +\xc4\x02\xba\xff\xd7\x01\xc4\x02\xbd\xff\x85\x01\xc4\x02\xbe\xff\ +\xd7\x01\xc4\x02\xbf\xff\x9a\x01\xc4\x02\xc0\xff\xd7\x01\xc4\x02\ +\xc1\xff\x9a\x01\xc4\x02\xc2\xff\xd7\x01\xc4\x02\xd4\xff\x9a\x01\ +\xc4\x02\xd5\xff\xd7\x01\xc4\x02\xf7\xff\xd7\x01\xc4\x02\xf8\xff\ +\xd7\x01\xc4\x02\xf9\xff\xd7\x01\xc4\x02\xfa\xff\xd7\x01\xc4\x02\ +\xfb\xff\xd7\x01\xc4\x02\xfc\xff\xd7\x01\xc4\x02\xfd\xff\x9a\x01\ +\xc4\x02\xfe\xff\xd7\x01\xc4\x03\x03\xff\xae\x01\xc4\x03\x0d\xff\ +\x9a\x01\xc4\x03\x0e\xff\xc3\x01\xc4\x03\x0f\xff\x9a\x01\xc4\x03\ +\x10\xff\xc3\x01\xc4\x03\x17\xff\x85\x01\xc4\x03\x18\xff\xd7\x01\ +\xc6\x00\x05\xff\xae\x01\xc6\x00\x0a\xff\xae\x01\xc6\x01\x9d\xff\ +\x85\x01\xc6\x01\xa6\xff\x85\x01\xc6\x01\xa8\xff\xd7\x01\xc6\x01\ +\xbc\xff\x9a\x01\xc6\x01\xbd\xff\xd7\x01\xc6\x01\xc1\xff\x9a\x01\ +\xc6\x01\xc4\xff\x85\x01\xc6\x01\xdc\xff\xd7\x01\xc6\x01\xdd\xff\ +\xd7\x01\xc6\x01\xe1\xff\xd7\x01\xc6\x01\xe4\xff\xd7\x01\xc6\x01\ +\xf6\xff\xd7\x01\xc6\x02\x07\xff\xae\x01\xc6\x02\x0b\xff\xae\x01\ +\xc6\x02n\xff\xae\x01\xc6\x02|\xff\x9a\x01\xc6\x02\x80\xff\ +\xae\x01\xc6\x02\x82\xff\xae\x01\xc6\x02\x97\xff\xae\x01\xc6\x02\ +\x9b\xff\xae\x01\xc6\x02\xa7\xff\xae\x01\xc6\x02\xa9\xff\x85\x01\ +\xc6\x02\xaa\xff\xd7\x01\xc6\x02\xb5\xff\x9a\x01\xc6\x02\xb6\xff\ +\xd7\x01\xc6\x02\xb7\xff\x9a\x01\xc6\x02\xb8\xff\xd7\x01\xc6\x02\ +\xb9\xff\x9a\x01\xc6\x02\xba\xff\xd7\x01\xc6\x02\xbd\xff\x85\x01\ +\xc6\x02\xbe\xff\xd7\x01\xc6\x02\xbf\xff\x9a\x01\xc6\x02\xc0\xff\ +\xd7\x01\xc6\x02\xc1\xff\x9a\x01\xc6\x02\xc2\xff\xd7\x01\xc6\x02\ +\xd4\xff\x9a\x01\xc6\x02\xd5\xff\xd7\x01\xc6\x02\xf7\xff\xd7\x01\ +\xc6\x02\xf8\xff\xd7\x01\xc6\x02\xf9\xff\xd7\x01\xc6\x02\xfa\xff\ +\xd7\x01\xc6\x02\xfb\xff\xd7\x01\xc6\x02\xfc\xff\xd7\x01\xc6\x02\ +\xfd\xff\x9a\x01\xc6\x02\xfe\xff\xd7\x01\xc6\x03\x03\xff\xae\x01\ +\xc6\x03\x0d\xff\x9a\x01\xc6\x03\x0e\xff\xc3\x01\xc6\x03\x0f\xff\ +\x9a\x01\xc6\x03\x10\xff\xc3\x01\xc6\x03\x17\xff\x85\x01\xc6\x03\ +\x18\xff\xd7\x01\xc7\x00\x0f\xff\xae\x01\xc7\x00\x11\xff\xae\x01\ +\xc7\x01\x9d\xff\xec\x01\xc7\x01\xa4\xff\xd7\x01\xc7\x01\xa6\xff\ +\xec\x01\xc7\x01\xa8\xff\xd7\x01\xc7\x01\xaa\xff\xd7\x01\xc7\x01\ +\xae\xff\xd7\x01\xc7\x01\xb0\xff\xd7\x01\xc7\x01\xb1\xff\xec\x01\ +\xc7\x01\xb5\xff\xd7\x01\xc7\x01\xbc\xff\xc3\x01\xc7\x01\xbd\xff\ +\xd7\x01\xc7\x01\xbf\xff\xd7\x01\xc7\x01\xc1\xff\xd7\x01\xc7\x01\ +\xc4\xff\xec\x01\xc7\x01\xc7\xff\xec\x01\xc7\x01\xce\xff\xec\x01\ +\xc7\x01\xd5\xff\xec\x01\xc7\x01\xf2\xff\xec\x01\xc7\x02\x08\xff\ +\xae\x01\xc7\x02\x0c\xff\xae\x01\xc7\x02r\xff\xd7\x01\xc7\x02\ +s\xff\xec\x01\xc7\x02z\xff\xec\x01\xc7\x02|\xff\xd7\x01\ +\xc7\x02\x80\xff\xec\x01\xc7\x02\x82\xff\xec\x01\xc7\x02\x9f\xff\ +\xd7\x01\xc7\x02\xa1\xff\xec\x01\xc7\x02\xa9\xff\xec\x01\xc7\x02\ +\xb5\xff\xc3\x01\xc7\x02\xb7\xff\xec\x01\xc7\x02\xb9\xff\xec\x01\ +\xc7\x02\xbb\xff\xd7\x01\xc7\x02\xbd\xff\xec\x01\xc7\x02\xbf\xff\ +\xd7\x01\xc7\x02\xc1\xff\xd7\x01\xc7\x02\xca\xff\xd7\x01\xc7\x02\ +\xce\xff\xd7\x01\xc7\x02\xcf\xff\xec\x01\xc7\x02\xd4\xff\xd7\x01\ +\xc7\x02\xd9\xff\xd7\x01\xc7\x02\xdb\xff\xd7\x01\xc7\x02\xdd\xff\ +\xd7\x01\xc7\x02\xe5\xff\xd7\x01\xc7\x02\xe7\xff\xec\x01\xc7\x02\ +\xf5\xff\xec\x01\xc7\x02\xf7\xff\xd7\x01\xc7\x02\xf9\xff\xd7\x01\ +\xc7\x02\xfb\xff\xd7\x01\xc7\x02\xfd\xff\xd7\x01\xc7\x03\x05\xff\ +\xd7\x01\xc7\x03\x07\xff\xd7\x01\xc7\x03\x0d\xff\xd7\x01\xc7\x03\ +\x0f\xff\xd7\x01\xc7\x03\x11\xff\xd7\x01\xc7\x03\x12\xff\xec\x01\ +\xc7\x03\x17\xff\xec\x01\xc7\x03\x1b\xff\xd7\x01\xc7\x03\x1c\xff\ +\xec\x01\xc8\x00\x0f\xff\xae\x01\xc8\x00\x11\xff\xae\x01\xc8\x01\ +\x9d\xff\xec\x01\xc8\x01\xa4\xff\xd7\x01\xc8\x01\xa6\xff\xec\x01\ +\xc8\x01\xa8\xff\xd7\x01\xc8\x01\xaa\xff\xd7\x01\xc8\x01\xae\xff\ +\xd7\x01\xc8\x01\xb0\xff\xd7\x01\xc8\x01\xb1\xff\xec\x01\xc8\x01\ +\xb5\xff\xd7\x01\xc8\x01\xbc\xff\xc3\x01\xc8\x01\xbd\xff\xd7\x01\ +\xc8\x01\xbf\xff\xd7\x01\xc8\x01\xc1\xff\xd7\x01\xc8\x01\xc4\xff\ +\xec\x01\xc8\x01\xc7\xff\xec\x01\xc8\x01\xce\xff\xec\x01\xc8\x01\ +\xd5\xff\xec\x01\xc8\x01\xf2\xff\xec\x01\xc8\x02\x08\xff\xae\x01\ +\xc8\x02\x0c\xff\xae\x01\xc8\x02r\xff\xd7\x01\xc8\x02s\xff\ +\xec\x01\xc8\x02z\xff\xec\x01\xc8\x02|\xff\xd7\x01\xc8\x02\ +\x80\xff\xec\x01\xc8\x02\x82\xff\xec\x01\xc8\x02\x9f\xff\xd7\x01\ +\xc8\x02\xa1\xff\xec\x01\xc8\x02\xa9\xff\xec\x01\xc8\x02\xb5\xff\ +\xc3\x01\xc8\x02\xb7\xff\xec\x01\xc8\x02\xb9\xff\xec\x01\xc8\x02\ +\xbb\xff\xd7\x01\xc8\x02\xbd\xff\xec\x01\xc8\x02\xbf\xff\xd7\x01\ +\xc8\x02\xc1\xff\xd7\x01\xc8\x02\xca\xff\xd7\x01\xc8\x02\xce\xff\ +\xd7\x01\xc8\x02\xcf\xff\xec\x01\xc8\x02\xd4\xff\xd7\x01\xc8\x02\ +\xd9\xff\xd7\x01\xc8\x02\xdb\xff\xd7\x01\xc8\x02\xdd\xff\xd7\x01\ +\xc8\x02\xe5\xff\xd7\x01\xc8\x02\xe7\xff\xec\x01\xc8\x02\xf5\xff\ +\xec\x01\xc8\x02\xf7\xff\xd7\x01\xc8\x02\xf9\xff\xd7\x01\xc8\x02\ +\xfb\xff\xd7\x01\xc8\x02\xfd\xff\xd7\x01\xc8\x03\x05\xff\xd7\x01\ +\xc8\x03\x07\xff\xd7\x01\xc8\x03\x0d\xff\xd7\x01\xc8\x03\x0f\xff\ +\xd7\x01\xc8\x03\x11\xff\xd7\x01\xc8\x03\x12\xff\xec\x01\xc8\x03\ +\x17\xff\xec\x01\xc8\x03\x1b\xff\xd7\x01\xc8\x03\x1c\xff\xec\x01\ +\xca\x00\x05\xff\xec\x01\xca\x00\x0a\xff\xec\x01\xca\x02\x07\xff\ +\xec\x01\xca\x02\x0b\xff\xec\x01\xcc\x01\xe9\x00)\x01\xcd\x00\ +\x0f\xff\x9a\x01\xcd\x00\x10\xff\xd7\x01\xcd\x00\x11\xff\x9a\x01\ +\xcd\x01\xce\xff\xc3\x01\xcd\x01\xcf\xff\xec\x01\xcd\x01\xd5\xff\ +\xc3\x01\xcd\x01\xd8\xff\xec\x01\xcd\x01\xdb\xff\xec\x01\xcd\x01\ +\xde\xff\xec\x01\xcd\x01\xea\xff\xec\x01\xcd\x01\xed\xff\xec\x01\ +\xcd\x01\xf2\xff\xc3\x01\xcd\x02\x02\xff\xd7\x01\xcd\x02\x03\xff\ +\xd7\x01\xcd\x02\x04\xff\xd7\x01\xcd\x02\x08\xff\x9a\x01\xcd\x02\ +\x0c\xff\x9a\x01\xcd\x02j\xff\xec\x01\xcd\x02s\xff\xc3\x01\ +\xcd\x02\x7f\xff\xec\x01\xcd\x02\x85\xff\xec\x01\xcd\x02\x87\xff\ +\xec\x01\xcd\x02\x89\xff\xec\x01\xcd\x02\x8d\xff\xec\x01\xcd\x02\ +\xb2\xff\xec\x01\xcd\x02\xb4\xff\xec\x01\xcd\x02\xcf\xff\xc3\x01\ +\xcd\x02\xe0\xff\xec\x01\xcd\x02\xf0\xff\xec\x01\xcd\x02\xf2\xff\ +\xec\x01\xcd\x02\xf4\xff\xec\x01\xcd\x03\x0a\xff\xec\x01\xcd\x03\ +\x0c\xff\xec\x01\xcd\x03\x12\xff\xc3\x01\xcd\x03\x16\xff\xec\x01\ +\xcd\x03\x1a\xff\xec\x01\xcd\x03\x1c\xff\xc3\x01\xce\x00\x05\xff\ +\xec\x01\xce\x00\x0a\xff\xec\x01\xce\x02\x07\xff\xec\x01\xce\x02\ +\x0b\xff\xec\x01\xcf\x00\x05\xff\xec\x01\xcf\x00\x0a\xff\xec\x01\ +\xcf\x02\x07\xff\xec\x01\xcf\x02\x0b\xff\xec\x01\xd0\x01\xcf\xff\ +\xd7\x01\xd0\x01\xd8\xff\xd7\x01\xd0\x01\xdb\xff\xd7\x01\xd0\x01\ +\xde\xff\xd7\x01\xd0\x01\xe1\xff\xd7\x01\xd0\x01\xea\xff\xd7\x01\ +\xd0\x01\xed\xff\xd7\x01\xd0\x02j\xff\xd7\x01\xd0\x02\x7f\xff\ +\xd7\x01\xd0\x02\x85\xff\xd7\x01\xd0\x02\x87\xff\xd7\x01\xd0\x02\ +\x89\xff\xd7\x01\xd0\x02\x8d\xff\xd7\x01\xd0\x02\xb2\xff\xd7\x01\ +\xd0\x02\xb4\xff\xd7\x01\xd0\x02\xc0\xff\xd7\x01\xd0\x02\xc2\xff\ +\xd7\x01\xd0\x02\xc6\xff\xd7\x01\xd0\x02\xc8\xff\xd7\x01\xd0\x02\ +\xd5\xff\xd7\x01\xd0\x02\xe0\xff\xd7\x01\xd0\x02\xf0\xff\xd7\x01\ +\xd0\x02\xf2\xff\xd7\x01\xd0\x02\xf4\xff\xd7\x01\xd0\x02\xfe\xff\ +\xd7\x01\xd0\x03\x0a\xff\xd7\x01\xd0\x03\x0c\xff\xd7\x01\xd0\x03\ +\x16\xff\xd7\x01\xd0\x03\x1a\xff\xd7\x01\xd1\x01\xe9\x00)\x01\ +\xd4\x01\xcf\xff\xd7\x01\xd4\x01\xd8\xff\xd7\x01\xd4\x01\xdb\xff\ +\xd7\x01\xd4\x01\xde\xff\xd7\x01\xd4\x01\xe1\xff\xd7\x01\xd4\x01\ +\xea\xff\xd7\x01\xd4\x01\xed\xff\xd7\x01\xd4\x02j\xff\xd7\x01\ +\xd4\x02\x7f\xff\xd7\x01\xd4\x02\x85\xff\xd7\x01\xd4\x02\x87\xff\ +\xd7\x01\xd4\x02\x89\xff\xd7\x01\xd4\x02\x8d\xff\xd7\x01\xd4\x02\ +\xb2\xff\xd7\x01\xd4\x02\xb4\xff\xd7\x01\xd4\x02\xc0\xff\xd7\x01\ +\xd4\x02\xc2\xff\xd7\x01\xd4\x02\xc6\xff\xd7\x01\xd4\x02\xc8\xff\ +\xd7\x01\xd4\x02\xd5\xff\xd7\x01\xd4\x02\xe0\xff\xd7\x01\xd4\x02\ +\xf0\xff\xd7\x01\xd4\x02\xf2\xff\xd7\x01\xd4\x02\xf4\xff\xd7\x01\ +\xd4\x02\xfe\xff\xd7\x01\xd4\x03\x0a\xff\xd7\x01\xd4\x03\x0c\xff\ +\xd7\x01\xd4\x03\x16\xff\xd7\x01\xd4\x03\x1a\xff\xd7\x01\xd8\x00\ +\x05\xff\xec\x01\xd8\x00\x0a\xff\xec\x01\xd8\x01\xd0\xff\xd7\x01\ +\xd8\x01\xdc\xff\xec\x01\xd8\x01\xdd\xff\xec\x01\xd8\x01\xdf\xff\ +\xd7\x01\xd8\x01\xe1\xff\xec\x01\xd8\x01\xe4\xff\xec\x01\xd8\x01\ +\xf6\xff\xec\x01\xd8\x02\x07\xff\xec\x01\xd8\x02\x0b\xff\xec\x01\ +\xd8\x02\xa0\xff\xd7\x01\xd8\x02\xaa\xff\xec\x01\xd8\x02\xb6\xff\ +\xec\x01\xd8\x02\xbc\xff\xd7\x01\xd8\x02\xbe\xff\xec\x01\xd8\x02\ +\xc0\xff\xec\x01\xd8\x02\xc2\xff\xec\x01\xd8\x02\xcb\xff\xd7\x01\ +\xd8\x02\xd5\xff\xec\x01\xd8\x02\xe6\xff\xd7\x01\xd8\x02\xf8\xff\ +\xec\x01\xd8\x02\xfa\xff\xec\x01\xd8\x02\xfc\xff\xec\x01\xd8\x02\ +\xfe\xff\xec\x01\xd8\x03\x06\xff\xd7\x01\xd8\x03\x08\xff\xd7\x01\ +\xd8\x03\x0e\xff\xec\x01\xd8\x03\x10\xff\xec\x01\xd8\x03\x18\xff\ +\xec\x01\xda\x00\x05\xff\xec\x01\xda\x00\x0a\xff\xec\x01\xda\x01\ +\xd0\xff\xd7\x01\xda\x01\xdc\xff\xec\x01\xda\x01\xdd\xff\xec\x01\ +\xda\x01\xdf\xff\xd7\x01\xda\x01\xe1\xff\xec\x01\xda\x01\xe4\xff\ +\xec\x01\xda\x01\xf6\xff\xec\x01\xda\x02\x07\xff\xec\x01\xda\x02\ +\x0b\xff\xec\x01\xda\x02\xa0\xff\xd7\x01\xda\x02\xaa\xff\xec\x01\ +\xda\x02\xb6\xff\xec\x01\xda\x02\xbc\xff\xd7\x01\xda\x02\xbe\xff\ +\xec\x01\xda\x02\xc0\xff\xec\x01\xda\x02\xc2\xff\xec\x01\xda\x02\ +\xcb\xff\xd7\x01\xda\x02\xd5\xff\xec\x01\xda\x02\xe6\xff\xd7\x01\ +\xda\x02\xf8\xff\xec\x01\xda\x02\xfa\xff\xec\x01\xda\x02\xfc\xff\ +\xec\x01\xda\x02\xfe\xff\xec\x01\xda\x03\x06\xff\xd7\x01\xda\x03\ +\x08\xff\xd7\x01\xda\x03\x0e\xff\xec\x01\xda\x03\x10\xff\xec\x01\ +\xda\x03\x18\xff\xec\x01\xdc\x00\x0f\xff\x9a\x01\xdc\x00\x10\xff\ +\xd7\x01\xdc\x00\x11\xff\x9a\x01\xdc\x01\xce\xff\xc3\x01\xdc\x01\ +\xcf\xff\xec\x01\xdc\x01\xd5\xff\xc3\x01\xdc\x01\xd8\xff\xec\x01\ +\xdc\x01\xdb\xff\xec\x01\xdc\x01\xde\xff\xec\x01\xdc\x01\xea\xff\ +\xec\x01\xdc\x01\xed\xff\xec\x01\xdc\x01\xf2\xff\xc3\x01\xdc\x02\ +\x02\xff\xd7\x01\xdc\x02\x03\xff\xd7\x01\xdc\x02\x04\xff\xd7\x01\ +\xdc\x02\x08\xff\x9a\x01\xdc\x02\x0c\xff\x9a\x01\xdc\x02j\xff\ +\xec\x01\xdc\x02s\xff\xc3\x01\xdc\x02\x7f\xff\xec\x01\xdc\x02\ +\x85\xff\xec\x01\xdc\x02\x87\xff\xec\x01\xdc\x02\x89\xff\xec\x01\ +\xdc\x02\x8d\xff\xec\x01\xdc\x02\xb2\xff\xec\x01\xdc\x02\xb4\xff\ +\xec\x01\xdc\x02\xcf\xff\xc3\x01\xdc\x02\xe0\xff\xec\x01\xdc\x02\ +\xf0\xff\xec\x01\xdc\x02\xf2\xff\xec\x01\xdc\x02\xf4\xff\xec\x01\ +\xdc\x03\x0a\xff\xec\x01\xdc\x03\x0c\xff\xec\x01\xdc\x03\x12\xff\ +\xc3\x01\xdc\x03\x16\xff\xec\x01\xdc\x03\x1a\xff\xec\x01\xdc\x03\ +\x1c\xff\xc3\x01\xdd\x00\x0f\xff\xae\x01\xdd\x00\x11\xff\xae\x01\ +\xdd\x01\xce\xff\xd7\x01\xdd\x01\xd5\xff\xd7\x01\xdd\x01\xf2\xff\ +\xd7\x01\xdd\x02\x08\xff\xae\x01\xdd\x02\x0c\xff\xae\x01\xdd\x02\ +s\xff\xd7\x01\xdd\x02\xcf\xff\xd7\x01\xdd\x03\x12\xff\xd7\x01\ +\xdd\x03\x1c\xff\xd7\x01\xde\x00\x05\xff\xec\x01\xde\x00\x0a\xff\ +\xec\x01\xde\x01\xd0\xff\xd7\x01\xde\x01\xdc\xff\xec\x01\xde\x01\ +\xdd\xff\xec\x01\xde\x01\xdf\xff\xd7\x01\xde\x01\xe1\xff\xec\x01\ +\xde\x01\xe4\xff\xec\x01\xde\x01\xf6\xff\xec\x01\xde\x02\x07\xff\ +\xec\x01\xde\x02\x0b\xff\xec\x01\xde\x02\xa0\xff\xd7\x01\xde\x02\ +\xaa\xff\xec\x01\xde\x02\xb6\xff\xec\x01\xde\x02\xbc\xff\xd7\x01\ +\xde\x02\xbe\xff\xec\x01\xde\x02\xc0\xff\xec\x01\xde\x02\xc2\xff\ +\xec\x01\xde\x02\xcb\xff\xd7\x01\xde\x02\xd5\xff\xec\x01\xde\x02\ +\xe6\xff\xd7\x01\xde\x02\xf8\xff\xec\x01\xde\x02\xfa\xff\xec\x01\ +\xde\x02\xfc\xff\xec\x01\xde\x02\xfe\xff\xec\x01\xde\x03\x06\xff\ +\xd7\x01\xde\x03\x08\xff\xd7\x01\xde\x03\x0e\xff\xec\x01\xde\x03\ +\x10\xff\xec\x01\xde\x03\x18\xff\xec\x01\xdf\x01\xcf\xff\xd7\x01\ +\xdf\x01\xd8\xff\xd7\x01\xdf\x01\xdb\xff\xd7\x01\xdf\x01\xde\xff\ +\xd7\x01\xdf\x01\xe1\xff\xd7\x01\xdf\x01\xea\xff\xd7\x01\xdf\x01\ +\xed\xff\xd7\x01\xdf\x02j\xff\xd7\x01\xdf\x02\x7f\xff\xd7\x01\ +\xdf\x02\x85\xff\xd7\x01\xdf\x02\x87\xff\xd7\x01\xdf\x02\x89\xff\ +\xd7\x01\xdf\x02\x8d\xff\xd7\x01\xdf\x02\xb2\xff\xd7\x01\xdf\x02\ +\xb4\xff\xd7\x01\xdf\x02\xc0\xff\xd7\x01\xdf\x02\xc2\xff\xd7\x01\ +\xdf\x02\xc6\xff\xd7\x01\xdf\x02\xc8\xff\xd7\x01\xdf\x02\xd5\xff\ +\xd7\x01\xdf\x02\xe0\xff\xd7\x01\xdf\x02\xf0\xff\xd7\x01\xdf\x02\ +\xf2\xff\xd7\x01\xdf\x02\xf4\xff\xd7\x01\xdf\x02\xfe\xff\xd7\x01\ +\xdf\x03\x0a\xff\xd7\x01\xdf\x03\x0c\xff\xd7\x01\xdf\x03\x16\xff\ +\xd7\x01\xdf\x03\x1a\xff\xd7\x01\xe0\x00\x05\xff\xec\x01\xe0\x00\ +\x0a\xff\xec\x01\xe0\x02\x07\xff\xec\x01\xe0\x02\x0b\xff\xec\x01\ +\xe3\x00\x05\xff\xec\x01\xe3\x00\x0a\xff\xec\x01\xe3\x02\x07\xff\ +\xec\x01\xe3\x02\x0b\xff\xec\x01\xe4\x00\x05\xff\x85\x01\xe4\x00\ +\x0a\xff\x85\x01\xe4\x01\xd0\xff\xd7\x01\xe4\x01\xdc\xff\x9a\x01\ +\xe4\x01\xdd\xff\xc3\x01\xe4\x01\xdf\xff\xd7\x01\xe4\x01\xe1\xff\ +\xae\x01\xe4\x01\xe4\xff\x9a\x01\xe4\x01\xf6\xff\xc3\x01\xe4\x02\ +\x07\xff\x85\x01\xe4\x02\x0b\xff\x85\x01\xe4\x02m\xff\xd7\x01\ +\xe4\x02\x81\xff\xd7\x01\xe4\x02\x83\xff\xd7\x01\xe4\x02\x8b\xff\ +\xd7\x01\xe4\x02\xa0\xff\xd7\x01\xe4\x02\xaa\xff\x9a\x01\xe4\x02\ +\xb6\xff\x9a\x01\xe4\x02\xb8\xff\xc3\x01\xe4\x02\xba\xff\xc3\x01\ +\xe4\x02\xbc\xff\xd7\x01\xe4\x02\xbe\xff\x9a\x01\xe4\x02\xc0\xff\ +\xae\x01\xe4\x02\xc2\xff\xae\x01\xe4\x02\xc6\xff\xd7\x01\xe4\x02\ +\xc8\xff\xd7\x01\xe4\x02\xcb\xff\xd7\x01\xe4\x02\xd5\xff\xae\x01\ +\xe4\x02\xe6\xff\xd7\x01\xe4\x02\xea\xff\xd7\x01\xe4\x02\xf8\xff\ +\xc3\x01\xe4\x02\xfa\xff\xc3\x01\xe4\x02\xfc\xff\xc3\x01\xe4\x02\ +\xfe\xff\xae\x01\xe4\x03\x06\xff\xd7\x01\xe4\x03\x08\xff\xd7\x01\ +\xe4\x03\x0e\xff\x9a\x01\xe4\x03\x10\xff\x9a\x01\xe4\x03\x18\xff\ +\x9a\x01\xe6\x00\x05\xff\x85\x01\xe6\x00\x0a\xff\x85\x01\xe6\x01\ +\xd0\xff\xd7\x01\xe6\x01\xdc\xff\x9a\x01\xe6\x01\xdd\xff\xc3\x01\ +\xe6\x01\xdf\xff\xd7\x01\xe6\x01\xe1\xff\xae\x01\xe6\x01\xe4\xff\ +\x9a\x01\xe6\x01\xf6\xff\xc3\x01\xe6\x02\x07\xff\x85\x01\xe6\x02\ +\x0b\xff\x85\x01\xe6\x02m\xff\xd7\x01\xe6\x02\x81\xff\xd7\x01\ +\xe6\x02\x83\xff\xd7\x01\xe6\x02\x8b\xff\xd7\x01\xe6\x02\xa0\xff\ +\xd7\x01\xe6\x02\xaa\xff\x9a\x01\xe6\x02\xb6\xff\x9a\x01\xe6\x02\ +\xb8\xff\xc3\x01\xe6\x02\xba\xff\xc3\x01\xe6\x02\xbc\xff\xd7\x01\ +\xe6\x02\xbe\xff\x9a\x01\xe6\x02\xc0\xff\xae\x01\xe6\x02\xc2\xff\ +\xae\x01\xe6\x02\xc6\xff\xd7\x01\xe6\x02\xc8\xff\xd7\x01\xe6\x02\ +\xcb\xff\xd7\x01\xe6\x02\xd5\xff\xae\x01\xe6\x02\xe6\xff\xd7\x01\ +\xe6\x02\xea\xff\xd7\x01\xe6\x02\xf8\xff\xc3\x01\xe6\x02\xfa\xff\ +\xc3\x01\xe6\x02\xfc\xff\xc3\x01\xe6\x02\xfe\xff\xae\x01\xe6\x03\ +\x06\xff\xd7\x01\xe6\x03\x08\xff\xd7\x01\xe6\x03\x0e\xff\x9a\x01\ +\xe6\x03\x10\xff\x9a\x01\xe6\x03\x18\xff\x9a\x01\xe7\x00\x05\xff\ +\xec\x01\xe7\x00\x0a\xff\xec\x01\xe7\x01\xd0\xff\xd7\x01\xe7\x01\ +\xdc\xff\xec\x01\xe7\x01\xdd\xff\xec\x01\xe7\x01\xdf\xff\xd7\x01\ +\xe7\x01\xe1\xff\xec\x01\xe7\x01\xe4\xff\xec\x01\xe7\x01\xf6\xff\ +\xec\x01\xe7\x02\x07\xff\xec\x01\xe7\x02\x0b\xff\xec\x01\xe7\x02\ +\xa0\xff\xd7\x01\xe7\x02\xaa\xff\xec\x01\xe7\x02\xb6\xff\xec\x01\ +\xe7\x02\xbc\xff\xd7\x01\xe7\x02\xbe\xff\xec\x01\xe7\x02\xc0\xff\ +\xec\x01\xe7\x02\xc2\xff\xec\x01\xe7\x02\xcb\xff\xd7\x01\xe7\x02\ +\xd5\xff\xec\x01\xe7\x02\xe6\xff\xd7\x01\xe7\x02\xf8\xff\xec\x01\ +\xe7\x02\xfa\xff\xec\x01\xe7\x02\xfc\xff\xec\x01\xe7\x02\xfe\xff\ +\xec\x01\xe7\x03\x06\xff\xd7\x01\xe7\x03\x08\xff\xd7\x01\xe7\x03\ +\x0e\xff\xec\x01\xe7\x03\x10\xff\xec\x01\xe7\x03\x18\xff\xec\x01\ +\xe8\x00\x05\xff\xec\x01\xe8\x00\x0a\xff\xec\x01\xe8\x01\xd0\xff\ +\xd7\x01\xe8\x01\xdc\xff\xec\x01\xe8\x01\xdd\xff\xec\x01\xe8\x01\ +\xdf\xff\xd7\x01\xe8\x01\xe1\xff\xec\x01\xe8\x01\xe4\xff\xec\x01\ +\xe8\x01\xf6\xff\xec\x01\xe8\x02\x07\xff\xec\x01\xe8\x02\x0b\xff\ +\xec\x01\xe8\x02\xa0\xff\xd7\x01\xe8\x02\xaa\xff\xec\x01\xe8\x02\ +\xb6\xff\xec\x01\xe8\x02\xbc\xff\xd7\x01\xe8\x02\xbe\xff\xec\x01\ +\xe8\x02\xc0\xff\xec\x01\xe8\x02\xc2\xff\xec\x01\xe8\x02\xcb\xff\ +\xd7\x01\xe8\x02\xd5\xff\xec\x01\xe8\x02\xe6\xff\xd7\x01\xe8\x02\ +\xf8\xff\xec\x01\xe8\x02\xfa\xff\xec\x01\xe8\x02\xfc\xff\xec\x01\ +\xe8\x02\xfe\xff\xec\x01\xe8\x03\x06\xff\xd7\x01\xe8\x03\x08\xff\ +\xd7\x01\xe8\x03\x0e\xff\xec\x01\xe8\x03\x10\xff\xec\x01\xe8\x03\ +\x18\xff\xec\x01\xea\x00\x05\xff\xec\x01\xea\x00\x0a\xff\xec\x01\ +\xea\x02\x07\xff\xec\x01\xea\x02\x0b\xff\xec\x01\xeb\x00\x05\xff\ +\xec\x01\xeb\x00\x0a\xff\xec\x01\xeb\x02\x07\xff\xec\x01\xeb\x02\ +\x0b\xff\xec\x01\xeb\x03\x0e\xff\xd7\x01\xeb\x03\x10\xff\xd7\x01\ +\xec\x00\x0f\xff\x9a\x01\xec\x00\x10\xff\xd7\x01\xec\x00\x11\xff\ +\x9a\x01\xec\x01\xce\xff\xc3\x01\xec\x01\xcf\xff\xec\x01\xec\x01\ +\xd5\xff\xc3\x01\xec\x01\xd8\xff\xec\x01\xec\x01\xdb\xff\xec\x01\ +\xec\x01\xde\xff\xec\x01\xec\x01\xea\xff\xec\x01\xec\x01\xed\xff\ +\xec\x01\xec\x01\xf2\xff\xc3\x01\xec\x02\x02\xff\xd7\x01\xec\x02\ +\x03\xff\xd7\x01\xec\x02\x04\xff\xd7\x01\xec\x02\x08\xff\x9a\x01\ +\xec\x02\x0c\xff\x9a\x01\xec\x02j\xff\xec\x01\xec\x02s\xff\ +\xc3\x01\xec\x02\x7f\xff\xec\x01\xec\x02\x85\xff\xec\x01\xec\x02\ +\x87\xff\xec\x01\xec\x02\x89\xff\xec\x01\xec\x02\x8d\xff\xec\x01\ +\xec\x02\xb2\xff\xec\x01\xec\x02\xb4\xff\xec\x01\xec\x02\xcf\xff\ +\xc3\x01\xec\x02\xe0\xff\xec\x01\xec\x02\xf0\xff\xec\x01\xec\x02\ +\xf2\xff\xec\x01\xec\x02\xf4\xff\xec\x01\xec\x03\x0a\xff\xec\x01\ +\xec\x03\x0c\xff\xec\x01\xec\x03\x12\xff\xc3\x01\xec\x03\x16\xff\ +\xec\x01\xec\x03\x1a\xff\xec\x01\xec\x03\x1c\xff\xc3\x01\xf2\x00\ +\x05\xff\x85\x01\xf2\x00\x0a\xff\x85\x01\xf2\x01\xd0\xff\xd7\x01\ +\xf2\x01\xdc\xff\x9a\x01\xf2\x01\xdd\xff\xc3\x01\xf2\x01\xdf\xff\ +\xd7\x01\xf2\x01\xe1\xff\xae\x01\xf2\x01\xe4\xff\x9a\x01\xf2\x01\ +\xf6\xff\xc3\x01\xf2\x02\x07\xff\x85\x01\xf2\x02\x0b\xff\x85\x01\ +\xf2\x02m\xff\xd7\x01\xf2\x02\x81\xff\xd7\x01\xf2\x02\x83\xff\ +\xd7\x01\xf2\x02\x8b\xff\xd7\x01\xf2\x02\xa0\xff\xd7\x01\xf2\x02\ +\xaa\xff\x9a\x01\xf2\x02\xb6\xff\x9a\x01\xf2\x02\xb8\xff\xc3\x01\ +\xf2\x02\xba\xff\xc3\x01\xf2\x02\xbc\xff\xd7\x01\xf2\x02\xbe\xff\ +\x9a\x01\xf2\x02\xc0\xff\xae\x01\xf2\x02\xc2\xff\xae\x01\xf2\x02\ +\xc6\xff\xd7\x01\xf2\x02\xc8\xff\xd7\x01\xf2\x02\xcb\xff\xd7\x01\ +\xf2\x02\xd5\xff\xae\x01\xf2\x02\xe6\xff\xd7\x01\xf2\x02\xea\xff\ +\xd7\x01\xf2\x02\xf8\xff\xc3\x01\xf2\x02\xfa\xff\xc3\x01\xf2\x02\ +\xfc\xff\xc3\x01\xf2\x02\xfe\xff\xae\x01\xf2\x03\x06\xff\xd7\x01\ +\xf2\x03\x08\xff\xd7\x01\xf2\x03\x0e\xff\x9a\x01\xf2\x03\x10\xff\ +\x9a\x01\xf2\x03\x18\xff\x9a\x01\xf3\x00\x05\xff\x85\x01\xf3\x00\ +\x0a\xff\x85\x01\xf3\x01\xd0\xff\xd7\x01\xf3\x01\xdc\xff\x9a\x01\ +\xf3\x01\xdd\xff\xc3\x01\xf3\x01\xdf\xff\xd7\x01\xf3\x01\xe1\xff\ +\xae\x01\xf3\x01\xe4\xff\x9a\x01\xf3\x01\xf6\xff\xc3\x01\xf3\x02\ +\x07\xff\x85\x01\xf3\x02\x0b\xff\x85\x01\xf3\x02m\xff\xd7\x01\ +\xf3\x02\x81\xff\xd7\x01\xf3\x02\x83\xff\xd7\x01\xf3\x02\x8b\xff\ +\xd7\x01\xf3\x02\xa0\xff\xd7\x01\xf3\x02\xaa\xff\x9a\x01\xf3\x02\ +\xb6\xff\x9a\x01\xf3\x02\xb8\xff\xc3\x01\xf3\x02\xba\xff\xc3\x01\ +\xf3\x02\xbc\xff\xd7\x01\xf3\x02\xbe\xff\x9a\x01\xf3\x02\xc0\xff\ +\xae\x01\xf3\x02\xc2\xff\xae\x01\xf3\x02\xc6\xff\xd7\x01\xf3\x02\ +\xc8\xff\xd7\x01\xf3\x02\xcb\xff\xd7\x01\xf3\x02\xd5\xff\xae\x01\ +\xf3\x02\xe6\xff\xd7\x01\xf3\x02\xea\xff\xd7\x01\xf3\x02\xf8\xff\ +\xc3\x01\xf3\x02\xfa\xff\xc3\x01\xf3\x02\xfc\xff\xc3\x01\xf3\x02\ +\xfe\xff\xae\x01\xf3\x03\x06\xff\xd7\x01\xf3\x03\x08\xff\xd7\x01\ +\xf3\x03\x0e\xff\x9a\x01\xf3\x03\x10\xff\x9a\x01\xf3\x03\x18\xff\ +\x9a\x01\xf4\x00\x05\xff\xec\x01\xf4\x00\x0a\xff\xec\x01\xf4\x02\ +\x07\xff\xec\x01\xf4\x02\x0b\xff\xec\x01\xf4\x03\x0e\xff\xd7\x01\ +\xf4\x03\x10\xff\xd7\x01\xf5\x01\xcf\xff\xd7\x01\xf5\x01\xd8\xff\ +\xd7\x01\xf5\x01\xdb\xff\xd7\x01\xf5\x01\xde\xff\xd7\x01\xf5\x01\ +\xe1\xff\xd7\x01\xf5\x01\xea\xff\xd7\x01\xf5\x01\xed\xff\xd7\x01\ +\xf5\x02j\xff\xd7\x01\xf5\x02\x7f\xff\xd7\x01\xf5\x02\x85\xff\ +\xd7\x01\xf5\x02\x87\xff\xd7\x01\xf5\x02\x89\xff\xd7\x01\xf5\x02\ +\x8d\xff\xd7\x01\xf5\x02\xb2\xff\xd7\x01\xf5\x02\xb4\xff\xd7\x01\ +\xf5\x02\xc0\xff\xd7\x01\xf5\x02\xc2\xff\xd7\x01\xf5\x02\xc6\xff\ +\xd7\x01\xf5\x02\xc8\xff\xd7\x01\xf5\x02\xd5\xff\xd7\x01\xf5\x02\ +\xe0\xff\xd7\x01\xf5\x02\xf0\xff\xd7\x01\xf5\x02\xf2\xff\xd7\x01\ +\xf5\x02\xf4\xff\xd7\x01\xf5\x02\xfe\xff\xd7\x01\xf5\x03\x0a\xff\ +\xd7\x01\xf5\x03\x0c\xff\xd7\x01\xf5\x03\x16\xff\xd7\x01\xf5\x03\ +\x1a\xff\xd7\x01\xf6\x00\x0f\xff\xae\x01\xf6\x00\x11\xff\xae\x01\ +\xf6\x01\xce\xff\xd7\x01\xf6\x01\xd5\xff\xd7\x01\xf6\x01\xf2\xff\ +\xd7\x01\xf6\x02\x08\xff\xae\x01\xf6\x02\x0c\xff\xae\x01\xf6\x02\ +s\xff\xd7\x01\xf6\x02\xcf\xff\xd7\x01\xf6\x03\x12\xff\xd7\x01\ +\xf6\x03\x1c\xff\xd7\x01\xf8\x00\x0f\xff\x85\x01\xf8\x00\x10\xff\ +\xae\x01\xf8\x00\x11\xff\x85\x01\xf8\x01\x9f\xff\xd7\x01\xf8\x01\ +\xa4\xff\x9a\x01\xf8\x01\xaa\xffq\x01\xf8\x01\xae\xff\x9a\x01\ +\xf8\x01\xb5\xff\x9a\x01\xf8\x01\xb8\xff\xd7\x01\xf8\x01\xbb\xff\ +\xd7\x01\xf8\x01\xbc\x00)\x01\xf8\x01\xbe\xff\xae\x01\xf8\x01\ +\xcc\xff\x9a\x01\xf8\x01\xcd\xff\x9a\x01\xf8\x01\xce\xff\x85\x01\ +\xf8\x01\xcf\xffq\x01\xf8\x01\xd0\xff\xd7\x01\xf8\x01\xd1\xff\ +\xd7\x01\xf8\x01\xd2\xff\x9a\x01\xf8\x01\xd3\xff\x9a\x01\xf8\x01\ +\xd4\xff\x9a\x01\xf8\x01\xd5\xff\x85\x01\xf8\x01\xd6\xff\x9a\x01\ +\xf8\x01\xd7\xff\x9a\x01\xf8\x01\xd8\xffq\x01\xf8\x01\xd9\xff\ +\x9a\x01\xf8\x01\xda\xff\x9a\x01\xf8\x01\xdb\xffq\x01\xf8\x01\ +\xdc\xff\xae\x01\xf8\x01\xdd\xff\xae\x01\xf8\x01\xde\xffq\x01\ +\xf8\x01\xdf\xff\xd7\x01\xf8\x01\xe0\xff\x9a\x01\xf8\x01\xe1\xff\ +\x9a\x01\xf8\x01\xe2\xff\x9a\x01\xf8\x01\xe3\xff\x9a\x01\xf8\x01\ +\xe4\xff\xae\x01\xf8\x01\xe5\xff\x9a\x01\xf8\x01\xe6\xff\x9a\x01\ +\xf8\x01\xe7\xff\xd7\x01\xf8\x01\xe8\xff\x9a\x01\xf8\x01\xe9\xff\ +\xc3\x01\xf8\x01\xea\xffq\x01\xf8\x01\xec\xff\x9a\x01\xf8\x01\ +\xed\xffq\x01\xf8\x01\xee\xff\x85\x01\xf8\x01\xf2\xff\x85\x01\ +\xf8\x01\xf3\xff\x9a\x01\xf8\x01\xf5\xff\x9a\x01\xf8\x01\xf6\xff\ +\xae\x01\xf8\x01\xf7\xff\x9a\x01\xf8\x01\xf9\xff\x9a\x01\xf8\x02\ +\x02\xff\xae\x01\xf8\x02\x03\xff\xae\x01\xf8\x02\x04\xff\xae\x01\ +\xf8\x02\x08\xff\x85\x01\xf8\x02\x0c\xff\x85\x01\xf8\x02j\xff\ +q\x01\xf8\x02k\xff\x9a\x01\xf8\x02l\xff\xd7\x01\xf8\x02\ +m\xff\xd7\x01\xf8\x02q\xff\x9a\x01\xf8\x02r\xffq\x01\ +\xf8\x02s\xff\x85\x01\xf8\x02u\xff\x9a\x01\xf8\x02w\xff\ +\x9a\x01\xf8\x02y\xff\x9a\x01\xf8\x02}\xff\x9a\x01\xf8\x02\ +~\xff\xd7\x01\xf8\x02\x7f\xffq\x01\xf8\x02\x81\xff\xd7\x01\ +\xf8\x02\x83\xff\xd7\x01\xf8\x02\x84\xff\xd7\x01\xf8\x02\x85\xff\ +q\x01\xf8\x02\x86\xff\xd7\x01\xf8\x02\x87\xffq\x01\xf8\x02\ +\x88\xff\xd7\x01\xf8\x02\x89\xffq\x01\xf8\x02\x8a\xff\xd7\x01\ +\xf8\x02\x8b\xff\xd7\x01\xf8\x02\x8c\xff\xd7\x01\xf8\x02\x8d\xff\ +q\x01\xf8\x02\x96\xff\x9a\x01\xf8\x02\x9a\xff\x9a\x01\xf8\x02\ +\x9e\xff\x9a\x01\xf8\x02\xa0\xff\xd7\x01\xf8\x02\xa2\xff\xd7\x01\ +\xf8\x02\xa4\xff\x9a\x01\xf8\x02\xa6\xff\x9a\x01\xf8\x02\xaa\xff\ +\xae\x01\xf8\x02\xac\xff\x9a\x01\xf8\x02\xae\xff\x9a\x01\xf8\x02\ +\xb0\xff\x9a\x01\xf8\x02\xb1\xff\xd7\x01\xf8\x02\xb2\xffq\x01\ +\xf8\x02\xb3\xff\xd7\x01\xf8\x02\xb4\xffq\x01\xf8\x02\xb5\x00\ +)\x01\xf8\x02\xb6\xff\xae\x01\xf8\x02\xb8\xff\xae\x01\xf8\x02\ +\xba\xff\xae\x01\xf8\x02\xbc\xff\xd7\x01\xf8\x02\xbe\xff\xae\x01\ +\xf8\x02\xc0\xff\x9a\x01\xf8\x02\xc2\xff\x9a\x01\xf8\x02\xc4\xff\ +\x9a\x01\xf8\x02\xc5\xff\x9a\x01\xf8\x02\xc6\xffq\x01\xf8\x02\ +\xc7\xff\x9a\x01\xf8\x02\xc8\xffq\x01\xf8\x02\xcb\xff\xd7\x01\ +\xf8\x02\xcd\xff\x9a\x01\xf8\x02\xce\xff\x9a\x01\xf8\x02\xcf\xff\ +\x85\x01\xf8\x02\xd1\xff\x9a\x01\xf8\x02\xd3\xff\x9a\x01\xf8\x02\ +\xd5\xff\x9a\x01\xf8\x02\xd7\xff\x9a\x01\xf8\x02\xd9\xffq\x01\ +\xf8\x02\xdb\xffq\x01\xf8\x02\xdd\xffq\x01\xf8\x02\xe0\xff\ +q\x01\xf8\x02\xe6\xff\xd7\x01\xf8\x02\xe8\xff\xd7\x01\xf8\x02\ +\xea\xff\xc3\x01\xf8\x02\xec\xff\x9a\x01\xf8\x02\xee\xff\x9a\x01\ +\xf8\x02\xef\xff\xd7\x01\xf8\x02\xf0\xffq\x01\xf8\x02\xf1\xff\ +\xd7\x01\xf8\x02\xf2\xffq\x01\xf8\x02\xf3\xff\xd7\x01\xf8\x02\ +\xf4\xffq\x01\xf8\x02\xf6\xff\xd7\x01\xf8\x02\xf8\xff\xae\x01\ +\xf8\x02\xfa\xff\xae\x01\xf8\x02\xfc\xff\xae\x01\xf8\x02\xfe\xff\ +\x9a\x01\xf8\x03\x00\xff\x9a\x01\xf8\x03\x02\xff\x9a\x01\xf8\x03\ +\x06\xff\xd7\x01\xf8\x03\x08\xff\xd7\x01\xf8\x03\x09\xffq\x01\ +\xf8\x03\x0a\xffq\x01\xf8\x03\x0b\xffq\x01\xf8\x03\x0c\xff\ +q\x01\xf8\x03\x0e\xff\x9a\x01\xf8\x03\x10\xff\x9a\x01\xf8\x03\ +\x11\xff\x9a\x01\xf8\x03\x12\xff\x85\x01\xf8\x03\x14\xff\x9a\x01\ +\xf8\x03\x15\xff\xd7\x01\xf8\x03\x16\xffq\x01\xf8\x03\x18\xff\ +\xae\x01\xf8\x03\x1a\xffq\x01\xf8\x03\x1b\xff\x9a\x01\xf8\x03\ +\x1c\xff\x85\x01\xf9\x00\x0f\xff\x9a\x01\xf9\x00\x10\xff\xd7\x01\ +\xf9\x00\x11\xff\x9a\x01\xf9\x01\xce\xff\xc3\x01\xf9\x01\xcf\xff\ +\xec\x01\xf9\x01\xd5\xff\xc3\x01\xf9\x01\xd8\xff\xec\x01\xf9\x01\ +\xdb\xff\xec\x01\xf9\x01\xde\xff\xec\x01\xf9\x01\xea\xff\xec\x01\ +\xf9\x01\xed\xff\xec\x01\xf9\x01\xf2\xff\xc3\x01\xf9\x02\x02\xff\ +\xd7\x01\xf9\x02\x03\xff\xd7\x01\xf9\x02\x04\xff\xd7\x01\xf9\x02\ +\x08\xff\x9a\x01\xf9\x02\x0c\xff\x9a\x01\xf9\x02j\xff\xec\x01\ +\xf9\x02s\xff\xc3\x01\xf9\x02\x7f\xff\xec\x01\xf9\x02\x85\xff\ +\xec\x01\xf9\x02\x87\xff\xec\x01\xf9\x02\x89\xff\xec\x01\xf9\x02\ +\x8d\xff\xec\x01\xf9\x02\xb2\xff\xec\x01\xf9\x02\xb4\xff\xec\x01\ +\xf9\x02\xcf\xff\xc3\x01\xf9\x02\xe0\xff\xec\x01\xf9\x02\xf0\xff\ +\xec\x01\xf9\x02\xf2\xff\xec\x01\xf9\x02\xf4\xff\xec\x01\xf9\x03\ +\x0a\xff\xec\x01\xf9\x03\x0c\xff\xec\x01\xf9\x03\x12\xff\xc3\x01\ +\xf9\x03\x16\xff\xec\x01\xf9\x03\x1a\xff\xec\x01\xf9\x03\x1c\xff\ +\xc3\x01\xfa\x00\x0f\xff\x9a\x01\xfa\x00\x11\xff\x9a\x01\xfa\x00\ +\x22\x00)\x01\xfa\x00$\xff\xae\x01\xfa\x00&\xff\xec\x01\ +\xfa\x00*\xff\xec\x01\xfa\x002\xff\xec\x01\xfa\x004\xff\ +\xec\x01\xfa\x00D\xff\xd7\x01\xfa\x00F\xff\xd7\x01\xfa\x00\ +G\xff\xd7\x01\xfa\x00H\xff\xd7\x01\xfa\x00J\xff\xec\x01\ +\xfa\x00P\xff\xec\x01\xfa\x00Q\xff\xec\x01\xfa\x00R\xff\ +\xd7\x01\xfa\x00S\xff\xec\x01\xfa\x00T\xff\xd7\x01\xfa\x00\ +U\xff\xec\x01\xfa\x00V\xff\xec\x01\xfa\x00X\xff\xec\x01\ +\xfa\x00\x82\xff\xae\x01\xfa\x00\x83\xff\xae\x01\xfa\x00\x84\xff\ +\xae\x01\xfa\x00\x85\xff\xae\x01\xfa\x00\x86\xff\xae\x01\xfa\x00\ +\x87\xff\xae\x01\xfa\x00\x89\xff\xec\x01\xfa\x00\x94\xff\xec\x01\ +\xfa\x00\x95\xff\xec\x01\xfa\x00\x96\xff\xec\x01\xfa\x00\x97\xff\ +\xec\x01\xfa\x00\x98\xff\xec\x01\xfa\x00\x9a\xff\xec\x01\xfa\x00\ +\xa2\xff\xd7\x01\xfa\x00\xa3\xff\xd7\x01\xfa\x00\xa4\xff\xd7\x01\ +\xfa\x00\xa5\xff\xd7\x01\xfa\x00\xa6\xff\xd7\x01\xfa\x00\xa7\xff\ +\xd7\x01\xfa\x00\xa8\xff\xd7\x01\xfa\x00\xa9\xff\xd7\x01\xfa\x00\ +\xaa\xff\xd7\x01\xfa\x00\xab\xff\xd7\x01\xfa\x00\xac\xff\xd7\x01\ +\xfa\x00\xad\xff\xd7\x01\xfa\x00\xb4\xff\xd7\x01\xfa\x00\xb5\xff\ +\xd7\x01\xfa\x00\xb6\xff\xd7\x01\xfa\x00\xb7\xff\xd7\x01\xfa\x00\ +\xb8\xff\xd7\x01\xfa\x00\xba\xff\xd7\x01\xfa\x00\xbb\xff\xec\x01\ +\xfa\x00\xbc\xff\xec\x01\xfa\x00\xbd\xff\xec\x01\xfa\x00\xbe\xff\ +\xec\x01\xfa\x00\xc2\xff\xae\x01\xfa\x00\xc3\xff\xd7\x01\xfa\x00\ +\xc4\xff\xae\x01\xfa\x00\xc5\xff\xd7\x01\xfa\x00\xc6\xff\xae\x01\ +\xfa\x00\xc7\xff\xd7\x01\xfa\x00\xc8\xff\xec\x01\xfa\x00\xc9\xff\ +\xd7\x01\xfa\x00\xca\xff\xec\x01\xfa\x00\xcb\xff\xd7\x01\xfa\x00\ +\xcc\xff\xec\x01\xfa\x00\xcd\xff\xd7\x01\xfa\x00\xce\xff\xec\x01\ +\xfa\x00\xcf\xff\xd7\x01\xfa\x00\xd1\xff\xd7\x01\xfa\x00\xd3\xff\ +\xd7\x01\xfa\x00\xd5\xff\xd7\x01\xfa\x00\xd7\xff\xd7\x01\xfa\x00\ +\xd9\xff\xd7\x01\xfa\x00\xdb\xff\xd7\x01\xfa\x00\xdd\xff\xd7\x01\ +\xfa\x00\xde\xff\xec\x01\xfa\x00\xdf\xff\xec\x01\xfa\x00\xe0\xff\ +\xec\x01\xfa\x00\xe1\xff\xec\x01\xfa\x00\xe2\xff\xec\x01\xfa\x00\ +\xe3\xff\xec\x01\xfa\x00\xe4\xff\xec\x01\xfa\x00\xe5\xff\xec\x01\ +\xfa\x00\xfa\xff\xec\x01\xfa\x01\x06\xff\xec\x01\xfa\x01\x08\xff\ +\xec\x01\xfa\x01\x0d\xff\xec\x01\xfa\x01\x0e\xff\xec\x01\xfa\x01\ +\x0f\xff\xd7\x01\xfa\x01\x10\xff\xec\x01\xfa\x01\x11\xff\xd7\x01\ +\xfa\x01\x12\xff\xec\x01\xfa\x01\x13\xff\xd7\x01\xfa\x01\x14\xff\ +\xec\x01\xfa\x01\x15\xff\xd7\x01\xfa\x01\x17\xff\xec\x01\xfa\x01\ +\x19\xff\xec\x01\xfa\x01\x1d\xff\xec\x01\xfa\x01!\xff\xec\x01\ +\xfa\x01+\xff\xec\x01\xfa\x01-\xff\xec\x01\xfa\x01/\xff\ +\xec\x01\xfa\x011\xff\xec\x01\xfa\x013\xff\xec\x01\xfa\x01\ +5\xff\xec\x01\xfa\x01C\xff\xae\x01\xfa\x01D\xff\xd7\x01\ +\xfa\x01F\xff\xd7\x01\xfa\x01G\xff\xec\x01\xfa\x01H\xff\ +\xd7\x01\xfa\x01J\xff\xec\x01\xfa\x02\x08\xff\x9a\x01\xfa\x02\ +\x0c\xff\x9a\x01\xfa\x02W\xff\xec\x01\xfa\x02X\xff\xae\x01\ +\xfa\x02Y\xff\xd7\x01\xfa\x02_\xff\xec\x01\xfa\x02`\xff\ +\xd7\x01\xfa\x02b\xff\xec\x01\xfa\x03\x1d\xff\xae\x01\xfa\x03\ +\x1e\xff\xd7\x01\xfa\x03\x1f\xff\xae\x01\xfa\x03 \xff\xd7\x01\ +\xfa\x03!\xff\xae\x01\xfa\x03\x22\xff\xd7\x01\xfa\x03#\xff\ +\xae\x01\xfa\x03%\xff\xae\x01\xfa\x03&\xff\xd7\x01\xfa\x03\ +'\xff\xae\x01\xfa\x03(\xff\xd7\x01\xfa\x03)\xff\xae\x01\ +\xfa\x03*\xff\xd7\x01\xfa\x03+\xff\xae\x01\xfa\x03,\xff\ +\xd7\x01\xfa\x03-\xff\xae\x01\xfa\x03.\xff\xd7\x01\xfa\x03\ +/\xff\xae\x01\xfa\x030\xff\xd7\x01\xfa\x031\xff\xae\x01\ +\xfa\x032\xff\xd7\x01\xfa\x033\xff\xae\x01\xfa\x034\xff\ +\xd7\x01\xfa\x036\xff\xd7\x01\xfa\x038\xff\xd7\x01\xfa\x03\ +:\xff\xd7\x01\xfa\x03<\xff\xd7\x01\xfa\x03@\xff\xd7\x01\ +\xfa\x03B\xff\xd7\x01\xfa\x03D\xff\xd7\x01\xfa\x03I\xff\ +\xec\x01\xfa\x03J\xff\xd7\x01\xfa\x03K\xff\xec\x01\xfa\x03\ +L\xff\xd7\x01\xfa\x03M\xff\xec\x01\xfa\x03N\xff\xd7\x01\ +\xfa\x03O\xff\xec\x01\xfa\x03Q\xff\xec\x01\xfa\x03R\xff\ +\xd7\x01\xfa\x03S\xff\xec\x01\xfa\x03T\xff\xd7\x01\xfa\x03\ +U\xff\xec\x01\xfa\x03V\xff\xd7\x01\xfa\x03W\xff\xec\x01\ +\xfa\x03X\xff\xd7\x01\xfa\x03Y\xff\xec\x01\xfa\x03Z\xff\ +\xd7\x01\xfa\x03[\xff\xec\x01\xfa\x03\x5c\xff\xd7\x01\xfa\x03\ +]\xff\xec\x01\xfa\x03^\xff\xd7\x01\xfa\x03_\xff\xec\x01\ +\xfa\x03`\xff\xd7\x01\xfa\x03b\xff\xec\x01\xfa\x03d\xff\ +\xec\x01\xfa\x03f\xff\xec\x01\xfa\x03h\xff\xec\x01\xfa\x03\ +j\xff\xec\x01\xfa\x03l\xff\xec\x01\xfa\x03n\xff\xec\x01\ +\xfb\x00\x05\x00R\x01\xfb\x00\x0a\x00R\x01\xfb\x00\x0f\xff\ +\xae\x01\xfb\x00\x11\xff\xae\x01\xfb\x00\x22\x00)\x01\xfb\x02\ +\x07\x00R\x01\xfb\x02\x08\xff\xae\x01\xfb\x02\x0b\x00R\x01\ +\xfb\x02\x0c\xff\xae\x01\xfc\x00\x0f\xff\x9a\x01\xfc\x00\x11\xff\ +\x9a\x01\xfc\x00\x22\x00)\x01\xfc\x00$\xff\xae\x01\xfc\x00\ +&\xff\xec\x01\xfc\x00*\xff\xec\x01\xfc\x002\xff\xec\x01\ +\xfc\x004\xff\xec\x01\xfc\x00D\xff\xd7\x01\xfc\x00F\xff\ +\xd7\x01\xfc\x00G\xff\xd7\x01\xfc\x00H\xff\xd7\x01\xfc\x00\ +J\xff\xec\x01\xfc\x00P\xff\xec\x01\xfc\x00Q\xff\xec\x01\ +\xfc\x00R\xff\xd7\x01\xfc\x00S\xff\xec\x01\xfc\x00T\xff\ +\xd7\x01\xfc\x00U\xff\xec\x01\xfc\x00V\xff\xec\x01\xfc\x00\ +X\xff\xec\x01\xfc\x00\x82\xff\xae\x01\xfc\x00\x83\xff\xae\x01\ +\xfc\x00\x84\xff\xae\x01\xfc\x00\x85\xff\xae\x01\xfc\x00\x86\xff\ +\xae\x01\xfc\x00\x87\xff\xae\x01\xfc\x00\x89\xff\xec\x01\xfc\x00\ +\x94\xff\xec\x01\xfc\x00\x95\xff\xec\x01\xfc\x00\x96\xff\xec\x01\ +\xfc\x00\x97\xff\xec\x01\xfc\x00\x98\xff\xec\x01\xfc\x00\x9a\xff\ +\xec\x01\xfc\x00\xa2\xff\xd7\x01\xfc\x00\xa3\xff\xd7\x01\xfc\x00\ +\xa4\xff\xd7\x01\xfc\x00\xa5\xff\xd7\x01\xfc\x00\xa6\xff\xd7\x01\ +\xfc\x00\xa7\xff\xd7\x01\xfc\x00\xa8\xff\xd7\x01\xfc\x00\xa9\xff\ +\xd7\x01\xfc\x00\xaa\xff\xd7\x01\xfc\x00\xab\xff\xd7\x01\xfc\x00\ +\xac\xff\xd7\x01\xfc\x00\xad\xff\xd7\x01\xfc\x00\xb4\xff\xd7\x01\ +\xfc\x00\xb5\xff\xd7\x01\xfc\x00\xb6\xff\xd7\x01\xfc\x00\xb7\xff\ +\xd7\x01\xfc\x00\xb8\xff\xd7\x01\xfc\x00\xba\xff\xd7\x01\xfc\x00\ +\xbb\xff\xec\x01\xfc\x00\xbc\xff\xec\x01\xfc\x00\xbd\xff\xec\x01\ +\xfc\x00\xbe\xff\xec\x01\xfc\x00\xc2\xff\xae\x01\xfc\x00\xc3\xff\ +\xd7\x01\xfc\x00\xc4\xff\xae\x01\xfc\x00\xc5\xff\xd7\x01\xfc\x00\ +\xc6\xff\xae\x01\xfc\x00\xc7\xff\xd7\x01\xfc\x00\xc8\xff\xec\x01\ +\xfc\x00\xc9\xff\xd7\x01\xfc\x00\xca\xff\xec\x01\xfc\x00\xcb\xff\ +\xd7\x01\xfc\x00\xcc\xff\xec\x01\xfc\x00\xcd\xff\xd7\x01\xfc\x00\ +\xce\xff\xec\x01\xfc\x00\xcf\xff\xd7\x01\xfc\x00\xd1\xff\xd7\x01\ +\xfc\x00\xd3\xff\xd7\x01\xfc\x00\xd5\xff\xd7\x01\xfc\x00\xd7\xff\ +\xd7\x01\xfc\x00\xd9\xff\xd7\x01\xfc\x00\xdb\xff\xd7\x01\xfc\x00\ +\xdd\xff\xd7\x01\xfc\x00\xde\xff\xec\x01\xfc\x00\xdf\xff\xec\x01\ +\xfc\x00\xe0\xff\xec\x01\xfc\x00\xe1\xff\xec\x01\xfc\x00\xe2\xff\ +\xec\x01\xfc\x00\xe3\xff\xec\x01\xfc\x00\xe4\xff\xec\x01\xfc\x00\ +\xe5\xff\xec\x01\xfc\x00\xfa\xff\xec\x01\xfc\x01\x06\xff\xec\x01\ +\xfc\x01\x08\xff\xec\x01\xfc\x01\x0d\xff\xec\x01\xfc\x01\x0e\xff\ +\xec\x01\xfc\x01\x0f\xff\xd7\x01\xfc\x01\x10\xff\xec\x01\xfc\x01\ +\x11\xff\xd7\x01\xfc\x01\x12\xff\xec\x01\xfc\x01\x13\xff\xd7\x01\ +\xfc\x01\x14\xff\xec\x01\xfc\x01\x15\xff\xd7\x01\xfc\x01\x17\xff\ +\xec\x01\xfc\x01\x19\xff\xec\x01\xfc\x01\x1d\xff\xec\x01\xfc\x01\ +!\xff\xec\x01\xfc\x01+\xff\xec\x01\xfc\x01-\xff\xec\x01\ +\xfc\x01/\xff\xec\x01\xfc\x011\xff\xec\x01\xfc\x013\xff\ +\xec\x01\xfc\x015\xff\xec\x01\xfc\x01C\xff\xae\x01\xfc\x01\ +D\xff\xd7\x01\xfc\x01F\xff\xd7\x01\xfc\x01G\xff\xec\x01\ +\xfc\x01H\xff\xd7\x01\xfc\x01J\xff\xec\x01\xfc\x02\x08\xff\ +\x9a\x01\xfc\x02\x0c\xff\x9a\x01\xfc\x02W\xff\xec\x01\xfc\x02\ +X\xff\xae\x01\xfc\x02Y\xff\xd7\x01\xfc\x02_\xff\xec\x01\ +\xfc\x02`\xff\xd7\x01\xfc\x02b\xff\xec\x01\xfc\x03\x1d\xff\ +\xae\x01\xfc\x03\x1e\xff\xd7\x01\xfc\x03\x1f\xff\xae\x01\xfc\x03\ + \xff\xd7\x01\xfc\x03!\xff\xae\x01\xfc\x03\x22\xff\xd7\x01\ +\xfc\x03#\xff\xae\x01\xfc\x03%\xff\xae\x01\xfc\x03&\xff\ +\xd7\x01\xfc\x03'\xff\xae\x01\xfc\x03(\xff\xd7\x01\xfc\x03\ +)\xff\xae\x01\xfc\x03*\xff\xd7\x01\xfc\x03+\xff\xae\x01\ +\xfc\x03,\xff\xd7\x01\xfc\x03-\xff\xae\x01\xfc\x03.\xff\ +\xd7\x01\xfc\x03/\xff\xae\x01\xfc\x030\xff\xd7\x01\xfc\x03\ +1\xff\xae\x01\xfc\x032\xff\xd7\x01\xfc\x033\xff\xae\x01\ +\xfc\x034\xff\xd7\x01\xfc\x036\xff\xd7\x01\xfc\x038\xff\ +\xd7\x01\xfc\x03:\xff\xd7\x01\xfc\x03<\xff\xd7\x01\xfc\x03\ +@\xff\xd7\x01\xfc\x03B\xff\xd7\x01\xfc\x03D\xff\xd7\x01\ +\xfc\x03I\xff\xec\x01\xfc\x03J\xff\xd7\x01\xfc\x03K\xff\ +\xec\x01\xfc\x03L\xff\xd7\x01\xfc\x03M\xff\xec\x01\xfc\x03\ +N\xff\xd7\x01\xfc\x03O\xff\xec\x01\xfc\x03Q\xff\xec\x01\ +\xfc\x03R\xff\xd7\x01\xfc\x03S\xff\xec\x01\xfc\x03T\xff\ +\xd7\x01\xfc\x03U\xff\xec\x01\xfc\x03V\xff\xd7\x01\xfc\x03\ +W\xff\xec\x01\xfc\x03X\xff\xd7\x01\xfc\x03Y\xff\xec\x01\ +\xfc\x03Z\xff\xd7\x01\xfc\x03[\xff\xec\x01\xfc\x03\x5c\xff\ +\xd7\x01\xfc\x03]\xff\xec\x01\xfc\x03^\xff\xd7\x01\xfc\x03\ +_\xff\xec\x01\xfc\x03`\xff\xd7\x01\xfc\x03b\xff\xec\x01\ +\xfc\x03d\xff\xec\x01\xfc\x03f\xff\xec\x01\xfc\x03h\xff\ +\xec\x01\xfc\x03j\xff\xec\x01\xfc\x03l\xff\xec\x01\xfc\x03\ +n\xff\xec\x01\xfd\x00\x05\x00R\x01\xfd\x00\x0a\x00R\x01\ +\xfd\x00\x0f\xff\xae\x01\xfd\x00\x11\xff\xae\x01\xfd\x00\x22\x00\ +)\x01\xfd\x02\x07\x00R\x01\xfd\x02\x08\xff\xae\x01\xfd\x02\ +\x0b\x00R\x01\xfd\x02\x0c\xff\xae\x01\xfe\x00\x0f\xff\x9a\x01\ +\xfe\x00\x11\xff\x9a\x01\xfe\x00\x22\x00)\x01\xfe\x00$\xff\ +\xae\x01\xfe\x00&\xff\xec\x01\xfe\x00*\xff\xec\x01\xfe\x00\ +2\xff\xec\x01\xfe\x004\xff\xec\x01\xfe\x00D\xff\xd7\x01\ +\xfe\x00F\xff\xd7\x01\xfe\x00G\xff\xd7\x01\xfe\x00H\xff\ +\xd7\x01\xfe\x00J\xff\xec\x01\xfe\x00P\xff\xec\x01\xfe\x00\ +Q\xff\xec\x01\xfe\x00R\xff\xd7\x01\xfe\x00S\xff\xec\x01\ +\xfe\x00T\xff\xd7\x01\xfe\x00U\xff\xec\x01\xfe\x00V\xff\ +\xec\x01\xfe\x00X\xff\xec\x01\xfe\x00\x82\xff\xae\x01\xfe\x00\ +\x83\xff\xae\x01\xfe\x00\x84\xff\xae\x01\xfe\x00\x85\xff\xae\x01\ +\xfe\x00\x86\xff\xae\x01\xfe\x00\x87\xff\xae\x01\xfe\x00\x89\xff\ +\xec\x01\xfe\x00\x94\xff\xec\x01\xfe\x00\x95\xff\xec\x01\xfe\x00\ +\x96\xff\xec\x01\xfe\x00\x97\xff\xec\x01\xfe\x00\x98\xff\xec\x01\ +\xfe\x00\x9a\xff\xec\x01\xfe\x00\xa2\xff\xd7\x01\xfe\x00\xa3\xff\ +\xd7\x01\xfe\x00\xa4\xff\xd7\x01\xfe\x00\xa5\xff\xd7\x01\xfe\x00\ +\xa6\xff\xd7\x01\xfe\x00\xa7\xff\xd7\x01\xfe\x00\xa8\xff\xd7\x01\ +\xfe\x00\xa9\xff\xd7\x01\xfe\x00\xaa\xff\xd7\x01\xfe\x00\xab\xff\ +\xd7\x01\xfe\x00\xac\xff\xd7\x01\xfe\x00\xad\xff\xd7\x01\xfe\x00\ +\xb4\xff\xd7\x01\xfe\x00\xb5\xff\xd7\x01\xfe\x00\xb6\xff\xd7\x01\ +\xfe\x00\xb7\xff\xd7\x01\xfe\x00\xb8\xff\xd7\x01\xfe\x00\xba\xff\ +\xd7\x01\xfe\x00\xbb\xff\xec\x01\xfe\x00\xbc\xff\xec\x01\xfe\x00\ +\xbd\xff\xec\x01\xfe\x00\xbe\xff\xec\x01\xfe\x00\xc2\xff\xae\x01\ +\xfe\x00\xc3\xff\xd7\x01\xfe\x00\xc4\xff\xae\x01\xfe\x00\xc5\xff\ +\xd7\x01\xfe\x00\xc6\xff\xae\x01\xfe\x00\xc7\xff\xd7\x01\xfe\x00\ +\xc8\xff\xec\x01\xfe\x00\xc9\xff\xd7\x01\xfe\x00\xca\xff\xec\x01\ +\xfe\x00\xcb\xff\xd7\x01\xfe\x00\xcc\xff\xec\x01\xfe\x00\xcd\xff\ +\xd7\x01\xfe\x00\xce\xff\xec\x01\xfe\x00\xcf\xff\xd7\x01\xfe\x00\ +\xd1\xff\xd7\x01\xfe\x00\xd3\xff\xd7\x01\xfe\x00\xd5\xff\xd7\x01\ +\xfe\x00\xd7\xff\xd7\x01\xfe\x00\xd9\xff\xd7\x01\xfe\x00\xdb\xff\ +\xd7\x01\xfe\x00\xdd\xff\xd7\x01\xfe\x00\xde\xff\xec\x01\xfe\x00\ +\xdf\xff\xec\x01\xfe\x00\xe0\xff\xec\x01\xfe\x00\xe1\xff\xec\x01\ +\xfe\x00\xe2\xff\xec\x01\xfe\x00\xe3\xff\xec\x01\xfe\x00\xe4\xff\ +\xec\x01\xfe\x00\xe5\xff\xec\x01\xfe\x00\xfa\xff\xec\x01\xfe\x01\ +\x06\xff\xec\x01\xfe\x01\x08\xff\xec\x01\xfe\x01\x0d\xff\xec\x01\ +\xfe\x01\x0e\xff\xec\x01\xfe\x01\x0f\xff\xd7\x01\xfe\x01\x10\xff\ +\xec\x01\xfe\x01\x11\xff\xd7\x01\xfe\x01\x12\xff\xec\x01\xfe\x01\ +\x13\xff\xd7\x01\xfe\x01\x14\xff\xec\x01\xfe\x01\x15\xff\xd7\x01\ +\xfe\x01\x17\xff\xec\x01\xfe\x01\x19\xff\xec\x01\xfe\x01\x1d\xff\ +\xec\x01\xfe\x01!\xff\xec\x01\xfe\x01+\xff\xec\x01\xfe\x01\ +-\xff\xec\x01\xfe\x01/\xff\xec\x01\xfe\x011\xff\xec\x01\ +\xfe\x013\xff\xec\x01\xfe\x015\xff\xec\x01\xfe\x01C\xff\ +\xae\x01\xfe\x01D\xff\xd7\x01\xfe\x01F\xff\xd7\x01\xfe\x01\ +G\xff\xec\x01\xfe\x01H\xff\xd7\x01\xfe\x01J\xff\xec\x01\ +\xfe\x02\x08\xff\x9a\x01\xfe\x02\x0c\xff\x9a\x01\xfe\x02W\xff\ +\xec\x01\xfe\x02X\xff\xae\x01\xfe\x02Y\xff\xd7\x01\xfe\x02\ +_\xff\xec\x01\xfe\x02`\xff\xd7\x01\xfe\x02b\xff\xec\x01\ +\xfe\x03\x1d\xff\xae\x01\xfe\x03\x1e\xff\xd7\x01\xfe\x03\x1f\xff\ +\xae\x01\xfe\x03 \xff\xd7\x01\xfe\x03!\xff\xae\x01\xfe\x03\ +\x22\xff\xd7\x01\xfe\x03#\xff\xae\x01\xfe\x03%\xff\xae\x01\ +\xfe\x03&\xff\xd7\x01\xfe\x03'\xff\xae\x01\xfe\x03(\xff\ +\xd7\x01\xfe\x03)\xff\xae\x01\xfe\x03*\xff\xd7\x01\xfe\x03\ ++\xff\xae\x01\xfe\x03,\xff\xd7\x01\xfe\x03-\xff\xae\x01\ +\xfe\x03.\xff\xd7\x01\xfe\x03/\xff\xae\x01\xfe\x030\xff\ +\xd7\x01\xfe\x031\xff\xae\x01\xfe\x032\xff\xd7\x01\xfe\x03\ +3\xff\xae\x01\xfe\x034\xff\xd7\x01\xfe\x036\xff\xd7\x01\ +\xfe\x038\xff\xd7\x01\xfe\x03:\xff\xd7\x01\xfe\x03<\xff\ +\xd7\x01\xfe\x03@\xff\xd7\x01\xfe\x03B\xff\xd7\x01\xfe\x03\ +D\xff\xd7\x01\xfe\x03I\xff\xec\x01\xfe\x03J\xff\xd7\x01\ +\xfe\x03K\xff\xec\x01\xfe\x03L\xff\xd7\x01\xfe\x03M\xff\ +\xec\x01\xfe\x03N\xff\xd7\x01\xfe\x03O\xff\xec\x01\xfe\x03\ +Q\xff\xec\x01\xfe\x03R\xff\xd7\x01\xfe\x03S\xff\xec\x01\ +\xfe\x03T\xff\xd7\x01\xfe\x03U\xff\xec\x01\xfe\x03V\xff\ +\xd7\x01\xfe\x03W\xff\xec\x01\xfe\x03X\xff\xd7\x01\xfe\x03\ +Y\xff\xec\x01\xfe\x03Z\xff\xd7\x01\xfe\x03[\xff\xec\x01\ +\xfe\x03\x5c\xff\xd7\x01\xfe\x03]\xff\xec\x01\xfe\x03^\xff\ +\xd7\x01\xfe\x03_\xff\xec\x01\xfe\x03`\xff\xd7\x01\xfe\x03\ +b\xff\xec\x01\xfe\x03d\xff\xec\x01\xfe\x03f\xff\xec\x01\ +\xfe\x03h\xff\xec\x01\xfe\x03j\xff\xec\x01\xfe\x03l\xff\ +\xec\x01\xfe\x03n\xff\xec\x01\xff\x00\x05\x00R\x01\xff\x00\ +\x0a\x00R\x01\xff\x00\x0f\xff\xae\x01\xff\x00\x11\xff\xae\x01\ +\xff\x00\x22\x00)\x01\xff\x02\x07\x00R\x01\xff\x02\x08\xff\ +\xae\x01\xff\x02\x0b\x00R\x01\xff\x02\x0c\xff\xae\x02\x00\x00\ +\x0f\xff\x85\x02\x00\x00\x11\xff\x85\x02\x00\x00\x22\x00)\x02\ +\x00\x00$\xff\x85\x02\x00\x00&\xff\xd7\x02\x00\x00*\xff\ +\xd7\x02\x00\x002\xff\xd7\x02\x00\x004\xff\xd7\x02\x00\x00\ +D\xff\x9a\x02\x00\x00F\xff\x9a\x02\x00\x00G\xff\x9a\x02\ +\x00\x00H\xff\x9a\x02\x00\x00J\xff\xd7\x02\x00\x00P\xff\ +\xc3\x02\x00\x00Q\xff\xc3\x02\x00\x00R\xff\x9a\x02\x00\x00\ +S\xff\xc3\x02\x00\x00T\xff\x9a\x02\x00\x00U\xff\xc3\x02\ +\x00\x00V\xff\xae\x02\x00\x00X\xff\xc3\x02\x00\x00]\xff\ +\xd7\x02\x00\x00\x82\xff\x85\x02\x00\x00\x83\xff\x85\x02\x00\x00\ +\x84\xff\x85\x02\x00\x00\x85\xff\x85\x02\x00\x00\x86\xff\x85\x02\ +\x00\x00\x87\xff\x85\x02\x00\x00\x89\xff\xd7\x02\x00\x00\x94\xff\ +\xd7\x02\x00\x00\x95\xff\xd7\x02\x00\x00\x96\xff\xd7\x02\x00\x00\ +\x97\xff\xd7\x02\x00\x00\x98\xff\xd7\x02\x00\x00\x9a\xff\xd7\x02\ +\x00\x00\xa2\xff\x9a\x02\x00\x00\xa3\xff\x9a\x02\x00\x00\xa4\xff\ +\x9a\x02\x00\x00\xa5\xff\x9a\x02\x00\x00\xa6\xff\x9a\x02\x00\x00\ +\xa7\xff\x9a\x02\x00\x00\xa8\xff\x9a\x02\x00\x00\xa9\xff\x9a\x02\ +\x00\x00\xaa\xff\x9a\x02\x00\x00\xab\xff\x9a\x02\x00\x00\xac\xff\ +\x9a\x02\x00\x00\xad\xff\x9a\x02\x00\x00\xb4\xff\x9a\x02\x00\x00\ +\xb5\xff\x9a\x02\x00\x00\xb6\xff\x9a\x02\x00\x00\xb7\xff\x9a\x02\ +\x00\x00\xb8\xff\x9a\x02\x00\x00\xba\xff\x9a\x02\x00\x00\xbb\xff\ +\xc3\x02\x00\x00\xbc\xff\xc3\x02\x00\x00\xbd\xff\xc3\x02\x00\x00\ +\xbe\xff\xc3\x02\x00\x00\xc2\xff\x85\x02\x00\x00\xc3\xff\x9a\x02\ +\x00\x00\xc4\xff\x85\x02\x00\x00\xc5\xff\x9a\x02\x00\x00\xc6\xff\ +\x85\x02\x00\x00\xc7\xff\x9a\x02\x00\x00\xc8\xff\xd7\x02\x00\x00\ +\xc9\xff\x9a\x02\x00\x00\xca\xff\xd7\x02\x00\x00\xcb\xff\x9a\x02\ +\x00\x00\xcc\xff\xd7\x02\x00\x00\xcd\xff\x9a\x02\x00\x00\xce\xff\ +\xd7\x02\x00\x00\xcf\xff\x9a\x02\x00\x00\xd1\xff\x9a\x02\x00\x00\ +\xd3\xff\x9a\x02\x00\x00\xd5\xff\x9a\x02\x00\x00\xd7\xff\x9a\x02\ +\x00\x00\xd9\xff\x9a\x02\x00\x00\xdb\xff\x9a\x02\x00\x00\xdd\xff\ +\x9a\x02\x00\x00\xde\xff\xd7\x02\x00\x00\xdf\xff\xd7\x02\x00\x00\ +\xe0\xff\xd7\x02\x00\x00\xe1\xff\xd7\x02\x00\x00\xe2\xff\xd7\x02\ +\x00\x00\xe3\xff\xd7\x02\x00\x00\xe4\xff\xd7\x02\x00\x00\xe5\xff\ +\xd7\x02\x00\x00\xfa\xff\xc3\x02\x00\x01\x06\xff\xc3\x02\x00\x01\ +\x08\xff\xc3\x02\x00\x01\x0d\xff\xc3\x02\x00\x01\x0e\xff\xd7\x02\ +\x00\x01\x0f\xff\x9a\x02\x00\x01\x10\xff\xd7\x02\x00\x01\x11\xff\ +\x9a\x02\x00\x01\x12\xff\xd7\x02\x00\x01\x13\xff\x9a\x02\x00\x01\ +\x14\xff\xd7\x02\x00\x01\x15\xff\x9a\x02\x00\x01\x17\xff\xc3\x02\ +\x00\x01\x19\xff\xc3\x02\x00\x01\x1d\xff\xae\x02\x00\x01!\xff\ +\xae\x02\x00\x01+\xff\xc3\x02\x00\x01-\xff\xc3\x02\x00\x01\ +/\xff\xc3\x02\x00\x011\xff\xc3\x02\x00\x013\xff\xc3\x02\ +\x00\x015\xff\xc3\x02\x00\x01<\xff\xd7\x02\x00\x01>\xff\ +\xd7\x02\x00\x01@\xff\xd7\x02\x00\x01C\xff\x85\x02\x00\x01\ +D\xff\x9a\x02\x00\x01F\xff\x9a\x02\x00\x01G\xff\xd7\x02\ +\x00\x01H\xff\x9a\x02\x00\x01J\xff\xae\x02\x00\x02\x08\xff\ +\x85\x02\x00\x02\x0c\xff\x85\x02\x00\x02W\xff\xc3\x02\x00\x02\ +X\xff\x85\x02\x00\x02Y\xff\x9a\x02\x00\x02_\xff\xd7\x02\ +\x00\x02`\xff\x9a\x02\x00\x02b\xff\xc3\x02\x00\x03\x1d\xff\ +\x85\x02\x00\x03\x1e\xff\x9a\x02\x00\x03\x1f\xff\x85\x02\x00\x03\ + \xff\x9a\x02\x00\x03!\xff\x85\x02\x00\x03\x22\xff\x9a\x02\ +\x00\x03#\xff\x85\x02\x00\x03%\xff\x85\x02\x00\x03&\xff\ +\x9a\x02\x00\x03'\xff\x85\x02\x00\x03(\xff\x9a\x02\x00\x03\ +)\xff\x85\x02\x00\x03*\xff\x9a\x02\x00\x03+\xff\x85\x02\ +\x00\x03,\xff\x9a\x02\x00\x03-\xff\x85\x02\x00\x03.\xff\ +\x9a\x02\x00\x03/\xff\x85\x02\x00\x030\xff\x9a\x02\x00\x03\ +1\xff\x85\x02\x00\x032\xff\x9a\x02\x00\x033\xff\x85\x02\ +\x00\x034\xff\x9a\x02\x00\x036\xff\x9a\x02\x00\x038\xff\ +\x9a\x02\x00\x03:\xff\x9a\x02\x00\x03<\xff\x9a\x02\x00\x03\ +@\xff\x9a\x02\x00\x03B\xff\x9a\x02\x00\x03D\xff\x9a\x02\ +\x00\x03I\xff\xd7\x02\x00\x03J\xff\x9a\x02\x00\x03K\xff\ +\xd7\x02\x00\x03L\xff\x9a\x02\x00\x03M\xff\xd7\x02\x00\x03\ +N\xff\x9a\x02\x00\x03O\xff\xd7\x02\x00\x03Q\xff\xd7\x02\ +\x00\x03R\xff\x9a\x02\x00\x03S\xff\xd7\x02\x00\x03T\xff\ +\x9a\x02\x00\x03U\xff\xd7\x02\x00\x03V\xff\x9a\x02\x00\x03\ +W\xff\xd7\x02\x00\x03X\xff\x9a\x02\x00\x03Y\xff\xd7\x02\ +\x00\x03Z\xff\x9a\x02\x00\x03[\xff\xd7\x02\x00\x03\x5c\xff\ +\x9a\x02\x00\x03]\xff\xd7\x02\x00\x03^\xff\x9a\x02\x00\x03\ +_\xff\xd7\x02\x00\x03`\xff\x9a\x02\x00\x03b\xff\xc3\x02\ +\x00\x03d\xff\xc3\x02\x00\x03f\xff\xc3\x02\x00\x03h\xff\ +\xc3\x02\x00\x03j\xff\xc3\x02\x00\x03l\xff\xc3\x02\x00\x03\ +n\xff\xc3\x02\x01\x00\x05\x00R\x02\x01\x00\x0a\x00R\x02\ +\x01\x00\x0f\xff\xae\x02\x01\x00\x11\xff\xae\x02\x01\x00\x22\x00\ +)\x02\x01\x02\x07\x00R\x02\x01\x02\x08\xff\xae\x02\x01\x02\ +\x0b\x00R\x02\x01\x02\x0c\xff\xae\x02\x02\x007\xff\xae\x02\ +\x02\x01$\xff\xae\x02\x02\x01&\xff\xae\x02\x02\x01q\xff\ +\xae\x02\x02\x01\x9d\xff\xae\x02\x02\x01\xa6\xff\xae\x02\x02\x01\ +\xbc\xff\xae\x02\x02\x01\xc4\xff\xae\x02\x02\x01\xdc\xff\xd7\x02\ +\x02\x01\xe4\xff\xd7\x02\x02\x02\xa9\xff\xae\x02\x02\x02\xaa\xff\ +\xd7\x02\x02\x02\xb5\xff\xae\x02\x02\x02\xb6\xff\xd7\x02\x02\x02\ +\xbd\xff\xae\x02\x02\x02\xbe\xff\xd7\x02\x02\x03\x17\xff\xae\x02\ +\x02\x03\x18\xff\xd7\x02\x02\x03\x8f\xff\xae\x02\x03\x007\xff\ +\xae\x02\x03\x01$\xff\xae\x02\x03\x01&\xff\xae\x02\x03\x01\ +q\xff\xae\x02\x03\x01\x9d\xff\xae\x02\x03\x01\xa6\xff\xae\x02\ +\x03\x01\xbc\xff\xae\x02\x03\x01\xc4\xff\xae\x02\x03\x01\xdc\xff\ +\xd7\x02\x03\x01\xe4\xff\xd7\x02\x03\x02\xa9\xff\xae\x02\x03\x02\ +\xaa\xff\xd7\x02\x03\x02\xb5\xff\xae\x02\x03\x02\xb6\xff\xd7\x02\ +\x03\x02\xbd\xff\xae\x02\x03\x02\xbe\xff\xd7\x02\x03\x03\x17\xff\ +\xae\x02\x03\x03\x18\xff\xd7\x02\x03\x03\x8f\xff\xae\x02\x04\x00\ +7\xff\xae\x02\x04\x01$\xff\xae\x02\x04\x01&\xff\xae\x02\ +\x04\x01q\xff\xae\x02\x04\x01\x9d\xff\xae\x02\x04\x01\xa6\xff\ +\xae\x02\x04\x01\xbc\xff\xae\x02\x04\x01\xc4\xff\xae\x02\x04\x01\ +\xdc\xff\xd7\x02\x04\x01\xe4\xff\xd7\x02\x04\x02\xa9\xff\xae\x02\ +\x04\x02\xaa\xff\xd7\x02\x04\x02\xb5\xff\xae\x02\x04\x02\xb6\xff\ +\xd7\x02\x04\x02\xbd\xff\xae\x02\x04\x02\xbe\xff\xd7\x02\x04\x03\ +\x17\xff\xae\x02\x04\x03\x18\xff\xd7\x02\x04\x03\x8f\xff\xae\x02\ +\x06\x00$\xffq\x02\x06\x007\x00)\x02\x06\x009\x00\ +)\x02\x06\x00:\x00)\x02\x06\x00<\x00\x14\x02\x06\x00\ +D\xff\xae\x02\x06\x00F\xff\x85\x02\x06\x00G\xff\x85\x02\ +\x06\x00H\xff\x85\x02\x06\x00J\xff\xc3\x02\x06\x00P\xff\ +\xc3\x02\x06\x00Q\xff\xc3\x02\x06\x00R\xff\x85\x02\x06\x00\ +S\xff\xc3\x02\x06\x00T\xff\x85\x02\x06\x00U\xff\xc3\x02\ +\x06\x00V\xff\xc3\x02\x06\x00X\xff\xc3\x02\x06\x00\x82\xff\ +q\x02\x06\x00\x83\xffq\x02\x06\x00\x84\xffq\x02\x06\x00\ +\x85\xffq\x02\x06\x00\x86\xffq\x02\x06\x00\x87\xffq\x02\ +\x06\x00\x9f\x00\x14\x02\x06\x00\xa2\xff\x85\x02\x06\x00\xa3\xff\ +\xae\x02\x06\x00\xa4\xff\xae\x02\x06\x00\xa5\xff\xae\x02\x06\x00\ +\xa6\xff\xae\x02\x06\x00\xa7\xff\xae\x02\x06\x00\xa8\xff\xae\x02\ +\x06\x00\xa9\xff\x85\x02\x06\x00\xaa\xff\x85\x02\x06\x00\xab\xff\ +\x85\x02\x06\x00\xac\xff\x85\x02\x06\x00\xad\xff\x85\x02\x06\x00\ +\xb4\xff\x85\x02\x06\x00\xb5\xff\x85\x02\x06\x00\xb6\xff\x85\x02\ +\x06\x00\xb7\xff\x85\x02\x06\x00\xb8\xff\x85\x02\x06\x00\xba\xff\ +\x85\x02\x06\x00\xbb\xff\xc3\x02\x06\x00\xbc\xff\xc3\x02\x06\x00\ +\xbd\xff\xc3\x02\x06\x00\xbe\xff\xc3\x02\x06\x00\xc2\xffq\x02\ +\x06\x00\xc3\xff\xae\x02\x06\x00\xc4\xffq\x02\x06\x00\xc5\xff\ +\xae\x02\x06\x00\xc6\xffq\x02\x06\x00\xc7\xff\xae\x02\x06\x00\ +\xc9\xff\x85\x02\x06\x00\xcb\xff\x85\x02\x06\x00\xcd\xff\x85\x02\ +\x06\x00\xcf\xff\x85\x02\x06\x00\xd1\xff\x85\x02\x06\x00\xd3\xff\ +\x85\x02\x06\x00\xd5\xff\x85\x02\x06\x00\xd7\xff\x85\x02\x06\x00\ +\xd9\xff\x85\x02\x06\x00\xdb\xff\x85\x02\x06\x00\xdd\xff\x85\x02\ +\x06\x00\xdf\xff\xc3\x02\x06\x00\xe1\xff\xc3\x02\x06\x00\xe3\xff\ +\xc3\x02\x06\x00\xe5\xff\xc3\x02\x06\x00\xfa\xff\xc3\x02\x06\x01\ +\x06\xff\xc3\x02\x06\x01\x08\xff\xc3\x02\x06\x01\x0d\xff\xc3\x02\ +\x06\x01\x0f\xff\x85\x02\x06\x01\x11\xff\x85\x02\x06\x01\x13\xff\ +\x85\x02\x06\x01\x15\xff\x85\x02\x06\x01\x17\xff\xc3\x02\x06\x01\ +\x19\xff\xc3\x02\x06\x01\x1d\xff\xc3\x02\x06\x01!\xff\xc3\x02\ +\x06\x01$\x00)\x02\x06\x01&\x00)\x02\x06\x01+\xff\ +\xc3\x02\x06\x01-\xff\xc3\x02\x06\x01/\xff\xc3\x02\x06\x01\ +1\xff\xc3\x02\x06\x013\xff\xc3\x02\x06\x015\xff\xc3\x02\ +\x06\x016\x00)\x02\x06\x018\x00\x14\x02\x06\x01:\x00\ +\x14\x02\x06\x01C\xffq\x02\x06\x01D\xff\xae\x02\x06\x01\ +F\xff\xae\x02\x06\x01H\xff\x85\x02\x06\x01J\xff\xc3\x02\ +\x06\x01V\xffq\x02\x06\x01_\xffq\x02\x06\x01b\xff\ +q\x02\x06\x01i\xffq\x02\x06\x01y\xff\xae\x02\x06\x01\ +z\xff\xd7\x02\x06\x01{\xff\xd7\x02\x06\x01~\xff\xae\x02\ +\x06\x01\x81\xff\xc3\x02\x06\x01\x82\xff\xd7\x02\x06\x01\x83\xff\ +\xd7\x02\x06\x01\x84\xff\xd7\x02\x06\x01\x87\xff\xd7\x02\x06\x01\ +\x89\xff\xd7\x02\x06\x01\x8c\xff\xae\x02\x06\x01\x8e\xff\xc3\x02\ +\x06\x01\x8f\xff\xae\x02\x06\x01\x90\xff\xae\x02\x06\x01\x93\xff\ +\xae\x02\x06\x01\x99\xff\xae\x02\x06\x01\xa4\xff\x85\x02\x06\x01\ +\xaa\xffq\x02\x06\x01\xae\xff\x85\x02\x06\x01\xb5\xff\x85\x02\ +\x06\x01\xca\xff\xd7\x02\x06\x01\xce\xffq\x02\x06\x01\xcf\xff\ +\x85\x02\x06\x01\xd5\xffq\x02\x06\x01\xd8\xff\x85\x02\x06\x01\ +\xdb\xff\x85\x02\x06\x01\xde\xff\x85\x02\x06\x01\xea\xff\x85\x02\ +\x06\x01\xed\xff\x85\x02\x06\x01\xee\xff\xc3\x02\x06\x01\xf2\xff\ +q\x02\x06\x01\xfa\x00)\x02\x06\x01\xfc\x00)\x02\x06\x01\ +\xfe\x00)\x02\x06\x02\x00\x00\x14\x02\x06\x02W\xff\xc3\x02\ +\x06\x02X\xffq\x02\x06\x02Y\xff\xae\x02\x06\x02`\xff\ +\x85\x02\x06\x02b\xff\xc3\x02\x06\x02j\xff\x85\x02\x06\x02\ +r\xffq\x02\x06\x02s\xffq\x02\x06\x02}\xff\xec\x02\ +\x06\x02\x7f\xff\x85\x02\x06\x02\x85\xff\x85\x02\x06\x02\x87\xff\ +\x85\x02\x06\x02\x89\xff\x85\x02\x06\x02\x8d\xff\x85\x02\x06\x02\ +\xb2\xff\x85\x02\x06\x02\xb4\xff\x85\x02\x06\x02\xce\xff\x85\x02\ +\x06\x02\xcf\xffq\x02\x06\x02\xd9\xffq\x02\x06\x02\xda\xff\ +\xd7\x02\x06\x02\xdb\xffq\x02\x06\x02\xdc\xff\xd7\x02\x06\x02\ +\xdd\xffq\x02\x06\x02\xde\xff\xd7\x02\x06\x02\xe0\xff\x85\x02\ +\x06\x02\xe2\xff\xd7\x02\x06\x02\xe4\xff\xd7\x02\x06\x02\xf0\xff\ +\x85\x02\x06\x02\xf2\xff\x85\x02\x06\x02\xf4\xff\x85\x02\x06\x03\ +\x09\xffq\x02\x06\x03\x0a\xff\x85\x02\x06\x03\x0b\xffq\x02\ +\x06\x03\x0c\xff\x85\x02\x06\x03\x11\xff\x85\x02\x06\x03\x12\xff\ +q\x02\x06\x03\x16\xff\x85\x02\x06\x03\x1a\xff\x85\x02\x06\x03\ +\x1b\xff\x85\x02\x06\x03\x1c\xffq\x02\x06\x03\x1d\xffq\x02\ +\x06\x03\x1e\xff\xae\x02\x06\x03\x1f\xffq\x02\x06\x03 \xff\ +\xae\x02\x06\x03!\xffq\x02\x06\x03\x22\xff\xae\x02\x06\x03\ +#\xffq\x02\x06\x03%\xffq\x02\x06\x03&\xff\xae\x02\ +\x06\x03'\xffq\x02\x06\x03(\xff\xae\x02\x06\x03)\xff\ +q\x02\x06\x03*\xff\xae\x02\x06\x03+\xffq\x02\x06\x03\ +,\xff\xae\x02\x06\x03-\xffq\x02\x06\x03.\xff\xae\x02\ +\x06\x03/\xffq\x02\x06\x030\xff\xae\x02\x06\x031\xff\ +q\x02\x06\x032\xff\xae\x02\x06\x033\xffq\x02\x06\x03\ +4\xff\xae\x02\x06\x036\xff\x85\x02\x06\x038\xff\x85\x02\ +\x06\x03:\xff\x85\x02\x06\x03<\xff\x85\x02\x06\x03@\xff\ +\x85\x02\x06\x03B\xff\x85\x02\x06\x03D\xff\x85\x02\x06\x03\ +J\xff\x85\x02\x06\x03L\xff\x85\x02\x06\x03N\xff\x85\x02\ +\x06\x03R\xff\x85\x02\x06\x03T\xff\x85\x02\x06\x03V\xff\ +\x85\x02\x06\x03X\xff\x85\x02\x06\x03Z\xff\x85\x02\x06\x03\ +\x5c\xff\x85\x02\x06\x03^\xff\x85\x02\x06\x03`\xff\x85\x02\ +\x06\x03b\xff\xc3\x02\x06\x03d\xff\xc3\x02\x06\x03f\xff\ +\xc3\x02\x06\x03h\xff\xc3\x02\x06\x03j\xff\xc3\x02\x06\x03\ +l\xff\xc3\x02\x06\x03n\xff\xc3\x02\x06\x03o\x00\x14\x02\ +\x06\x03q\x00\x14\x02\x06\x03s\x00\x14\x02\x06\x03\x8f\x00\ +)\x02\x07\x00$\xffq\x02\x07\x007\x00)\x02\x07\x00\ +9\x00)\x02\x07\x00:\x00)\x02\x07\x00<\x00\x14\x02\ +\x07\x00D\xff\xae\x02\x07\x00F\xff\x85\x02\x07\x00G\xff\ +\x85\x02\x07\x00H\xff\x85\x02\x07\x00J\xff\xc3\x02\x07\x00\ +P\xff\xc3\x02\x07\x00Q\xff\xc3\x02\x07\x00R\xff\x85\x02\ +\x07\x00S\xff\xc3\x02\x07\x00T\xff\x85\x02\x07\x00U\xff\ +\xc3\x02\x07\x00V\xff\xc3\x02\x07\x00X\xff\xc3\x02\x07\x00\ +\x82\xffq\x02\x07\x00\x83\xffq\x02\x07\x00\x84\xffq\x02\ +\x07\x00\x85\xffq\x02\x07\x00\x86\xffq\x02\x07\x00\x87\xff\ +q\x02\x07\x00\x9f\x00\x14\x02\x07\x00\xa2\xff\x85\x02\x07\x00\ +\xa3\xff\xae\x02\x07\x00\xa4\xff\xae\x02\x07\x00\xa5\xff\xae\x02\ +\x07\x00\xa6\xff\xae\x02\x07\x00\xa7\xff\xae\x02\x07\x00\xa8\xff\ +\xae\x02\x07\x00\xa9\xff\x85\x02\x07\x00\xaa\xff\x85\x02\x07\x00\ +\xab\xff\x85\x02\x07\x00\xac\xff\x85\x02\x07\x00\xad\xff\x85\x02\ +\x07\x00\xb4\xff\x85\x02\x07\x00\xb5\xff\x85\x02\x07\x00\xb6\xff\ +\x85\x02\x07\x00\xb7\xff\x85\x02\x07\x00\xb8\xff\x85\x02\x07\x00\ +\xba\xff\x85\x02\x07\x00\xbb\xff\xc3\x02\x07\x00\xbc\xff\xc3\x02\ +\x07\x00\xbd\xff\xc3\x02\x07\x00\xbe\xff\xc3\x02\x07\x00\xc2\xff\ +q\x02\x07\x00\xc3\xff\xae\x02\x07\x00\xc4\xffq\x02\x07\x00\ +\xc5\xff\xae\x02\x07\x00\xc6\xffq\x02\x07\x00\xc7\xff\xae\x02\ +\x07\x00\xc9\xff\x85\x02\x07\x00\xcb\xff\x85\x02\x07\x00\xcd\xff\ +\x85\x02\x07\x00\xcf\xff\x85\x02\x07\x00\xd1\xff\x85\x02\x07\x00\ +\xd3\xff\x85\x02\x07\x00\xd5\xff\x85\x02\x07\x00\xd7\xff\x85\x02\ +\x07\x00\xd9\xff\x85\x02\x07\x00\xdb\xff\x85\x02\x07\x00\xdd\xff\ +\x85\x02\x07\x00\xdf\xff\xc3\x02\x07\x00\xe1\xff\xc3\x02\x07\x00\ +\xe3\xff\xc3\x02\x07\x00\xe5\xff\xc3\x02\x07\x00\xfa\xff\xc3\x02\ +\x07\x01\x06\xff\xc3\x02\x07\x01\x08\xff\xc3\x02\x07\x01\x0d\xff\ +\xc3\x02\x07\x01\x0f\xff\x85\x02\x07\x01\x11\xff\x85\x02\x07\x01\ +\x13\xff\x85\x02\x07\x01\x15\xff\x85\x02\x07\x01\x17\xff\xc3\x02\ +\x07\x01\x19\xff\xc3\x02\x07\x01\x1d\xff\xc3\x02\x07\x01!\xff\ +\xc3\x02\x07\x01$\x00)\x02\x07\x01&\x00)\x02\x07\x01\ ++\xff\xc3\x02\x07\x01-\xff\xc3\x02\x07\x01/\xff\xc3\x02\ +\x07\x011\xff\xc3\x02\x07\x013\xff\xc3\x02\x07\x015\xff\ +\xc3\x02\x07\x016\x00)\x02\x07\x018\x00\x14\x02\x07\x01\ +:\x00\x14\x02\x07\x01C\xffq\x02\x07\x01D\xff\xae\x02\ +\x07\x01F\xff\xae\x02\x07\x01H\xff\x85\x02\x07\x01J\xff\ +\xc3\x02\x07\x01V\xffq\x02\x07\x01_\xffq\x02\x07\x01\ +b\xffq\x02\x07\x01i\xffq\x02\x07\x01y\xff\xae\x02\ +\x07\x01z\xff\xd7\x02\x07\x01{\xff\xd7\x02\x07\x01~\xff\ +\xae\x02\x07\x01\x81\xff\xc3\x02\x07\x01\x82\xff\xd7\x02\x07\x01\ +\x83\xff\xd7\x02\x07\x01\x84\xff\xd7\x02\x07\x01\x87\xff\xd7\x02\ +\x07\x01\x89\xff\xd7\x02\x07\x01\x8c\xff\xae\x02\x07\x01\x8e\xff\ +\xc3\x02\x07\x01\x8f\xff\xae\x02\x07\x01\x90\xff\xae\x02\x07\x01\ +\x93\xff\xae\x02\x07\x01\x99\xff\xae\x02\x07\x01\xa4\xff\x85\x02\ +\x07\x01\xaa\xffq\x02\x07\x01\xae\xff\x85\x02\x07\x01\xb5\xff\ +\x85\x02\x07\x01\xca\xff\xd7\x02\x07\x01\xce\xffq\x02\x07\x01\ +\xcf\xff\x85\x02\x07\x01\xd5\xffq\x02\x07\x01\xd8\xff\x85\x02\ +\x07\x01\xdb\xff\x85\x02\x07\x01\xde\xff\x85\x02\x07\x01\xea\xff\ +\x85\x02\x07\x01\xed\xff\x85\x02\x07\x01\xee\xff\xc3\x02\x07\x01\ +\xf2\xffq\x02\x07\x01\xfa\x00)\x02\x07\x01\xfc\x00)\x02\ +\x07\x01\xfe\x00)\x02\x07\x02\x00\x00\x14\x02\x07\x02W\xff\ +\xc3\x02\x07\x02X\xffq\x02\x07\x02Y\xff\xae\x02\x07\x02\ +`\xff\x85\x02\x07\x02b\xff\xc3\x02\x07\x02j\xff\x85\x02\ +\x07\x02r\xffq\x02\x07\x02s\xffq\x02\x07\x02}\xff\ +\xec\x02\x07\x02\x7f\xff\x85\x02\x07\x02\x85\xff\x85\x02\x07\x02\ +\x87\xff\x85\x02\x07\x02\x89\xff\x85\x02\x07\x02\x8d\xff\x85\x02\ +\x07\x02\xb2\xff\x85\x02\x07\x02\xb4\xff\x85\x02\x07\x02\xce\xff\ +\x85\x02\x07\x02\xcf\xffq\x02\x07\x02\xd9\xffq\x02\x07\x02\ +\xda\xff\xd7\x02\x07\x02\xdb\xffq\x02\x07\x02\xdc\xff\xd7\x02\ +\x07\x02\xdd\xffq\x02\x07\x02\xde\xff\xd7\x02\x07\x02\xe0\xff\ +\x85\x02\x07\x02\xe2\xff\xd7\x02\x07\x02\xe4\xff\xd7\x02\x07\x02\ +\xf0\xff\x85\x02\x07\x02\xf2\xff\x85\x02\x07\x02\xf4\xff\x85\x02\ +\x07\x03\x09\xffq\x02\x07\x03\x0a\xff\x85\x02\x07\x03\x0b\xff\ +q\x02\x07\x03\x0c\xff\x85\x02\x07\x03\x11\xff\x85\x02\x07\x03\ +\x12\xffq\x02\x07\x03\x16\xff\x85\x02\x07\x03\x1a\xff\x85\x02\ +\x07\x03\x1b\xff\x85\x02\x07\x03\x1c\xffq\x02\x07\x03\x1d\xff\ +q\x02\x07\x03\x1e\xff\xae\x02\x07\x03\x1f\xffq\x02\x07\x03\ + \xff\xae\x02\x07\x03!\xffq\x02\x07\x03\x22\xff\xae\x02\ +\x07\x03#\xffq\x02\x07\x03%\xffq\x02\x07\x03&\xff\ +\xae\x02\x07\x03'\xffq\x02\x07\x03(\xff\xae\x02\x07\x03\ +)\xffq\x02\x07\x03*\xff\xae\x02\x07\x03+\xffq\x02\ +\x07\x03,\xff\xae\x02\x07\x03-\xffq\x02\x07\x03.\xff\ +\xae\x02\x07\x03/\xffq\x02\x07\x030\xff\xae\x02\x07\x03\ +1\xffq\x02\x07\x032\xff\xae\x02\x07\x033\xffq\x02\ +\x07\x034\xff\xae\x02\x07\x036\xff\x85\x02\x07\x038\xff\ +\x85\x02\x07\x03:\xff\x85\x02\x07\x03<\xff\x85\x02\x07\x03\ +@\xff\x85\x02\x07\x03B\xff\x85\x02\x07\x03D\xff\x85\x02\ +\x07\x03J\xff\x85\x02\x07\x03L\xff\x85\x02\x07\x03N\xff\ +\x85\x02\x07\x03R\xff\x85\x02\x07\x03T\xff\x85\x02\x07\x03\ +V\xff\x85\x02\x07\x03X\xff\x85\x02\x07\x03Z\xff\x85\x02\ +\x07\x03\x5c\xff\x85\x02\x07\x03^\xff\x85\x02\x07\x03`\xff\ +\x85\x02\x07\x03b\xff\xc3\x02\x07\x03d\xff\xc3\x02\x07\x03\ +f\xff\xc3\x02\x07\x03h\xff\xc3\x02\x07\x03j\xff\xc3\x02\ +\x07\x03l\xff\xc3\x02\x07\x03n\xff\xc3\x02\x07\x03o\x00\ +\x14\x02\x07\x03q\x00\x14\x02\x07\x03s\x00\x14\x02\x07\x03\ +\x8f\x00)\x02\x08\x00&\xff\x9a\x02\x08\x00*\xff\x9a\x02\ +\x08\x002\xff\x9a\x02\x08\x004\xff\x9a\x02\x08\x007\xff\ +q\x02\x08\x008\xff\xd7\x02\x08\x009\xff\x85\x02\x08\x00\ +:\xff\x85\x02\x08\x00<\xff\x85\x02\x08\x00\x89\xff\x9a\x02\ +\x08\x00\x94\xff\x9a\x02\x08\x00\x95\xff\x9a\x02\x08\x00\x96\xff\ +\x9a\x02\x08\x00\x97\xff\x9a\x02\x08\x00\x98\xff\x9a\x02\x08\x00\ +\x9a\xff\x9a\x02\x08\x00\x9b\xff\xd7\x02\x08\x00\x9c\xff\xd7\x02\ +\x08\x00\x9d\xff\xd7\x02\x08\x00\x9e\xff\xd7\x02\x08\x00\x9f\xff\ +\x85\x02\x08\x00\xc8\xff\x9a\x02\x08\x00\xca\xff\x9a\x02\x08\x00\ +\xcc\xff\x9a\x02\x08\x00\xce\xff\x9a\x02\x08\x00\xde\xff\x9a\x02\ +\x08\x00\xe0\xff\x9a\x02\x08\x00\xe2\xff\x9a\x02\x08\x00\xe4\xff\ +\x9a\x02\x08\x01\x0e\xff\x9a\x02\x08\x01\x10\xff\x9a\x02\x08\x01\ +\x12\xff\x9a\x02\x08\x01\x14\xff\x9a\x02\x08\x01$\xffq\x02\ +\x08\x01&\xffq\x02\x08\x01*\xff\xd7\x02\x08\x01,\xff\ +\xd7\x02\x08\x01.\xff\xd7\x02\x08\x010\xff\xd7\x02\x08\x01\ +2\xff\xd7\x02\x08\x014\xff\xd7\x02\x08\x016\xff\x85\x02\ +\x08\x018\xff\x85\x02\x08\x01:\xff\x85\x02\x08\x01G\xff\ +\x9a\x02\x08\x01f\xff\xae\x02\x08\x01m\xff\xae\x02\x08\x01\ +q\xffq\x02\x08\x01r\xff\x85\x02\x08\x01s\xff\x9a\x02\ +\x08\x01u\xff\x85\x02\x08\x01x\xff\x85\x02\x08\x01\x85\xff\ +\xd7\x02\x08\x01\x9d\xffq\x02\x08\x01\x9f\xff\x9a\x02\x08\x01\ +\xa6\xffq\x02\x08\x01\xb8\xff\x9a\x02\x08\x01\xbb\xff\x9a\x02\ +\x08\x01\xbc\xffq\x02\x08\x01\xbe\xff\xae\x02\x08\x01\xc1\xff\ +\x5c\x02\x08\x01\xc4\xffq\x02\x08\x01\xdc\xff\x9a\x02\x08\x01\ +\xe1\xff\x85\x02\x08\x01\xe4\xff\x9a\x02\x08\x01\xfa\xff\x85\x02\ +\x08\x01\xfc\xff\x85\x02\x08\x01\xfe\xff\x85\x02\x08\x02\x00\xff\ +\x85\x02\x08\x02T\xff\x85\x02\x08\x02_\xff\x9a\x02\x08\x02\ +a\xff\xd7\x02\x08\x02l\xff\x9a\x02\x08\x02|\xff\x5c\x02\ +\x08\x02~\xff\x9a\x02\x08\x02\x80\xff\x85\x02\x08\x02\x82\xff\ +\x85\x02\x08\x02\x84\xff\x9a\x02\x08\x02\x86\xff\x9a\x02\x08\x02\ +\x88\xff\x9a\x02\x08\x02\x8a\xff\x9a\x02\x08\x02\x8c\xff\x9a\x02\ +\x08\x02\xa9\xffq\x02\x08\x02\xaa\xff\x9a\x02\x08\x02\xb1\xff\ +\x9a\x02\x08\x02\xb3\xff\x9a\x02\x08\x02\xb5\xffq\x02\x08\x02\ +\xb6\xff\x9a\x02\x08\x02\xb7\xff\x85\x02\x08\x02\xb9\xff\x85\x02\ +\x08\x02\xbd\xffq\x02\x08\x02\xbe\xff\x9a\x02\x08\x02\xbf\xff\ +\x5c\x02\x08\x02\xc0\xff\x85\x02\x08\x02\xc1\xff\x5c\x02\x08\x02\ +\xc2\xff\x85\x02\x08\x02\xc5\xff\x85\x02\x08\x02\xc7\xff\x85\x02\ +\x08\x02\xd4\xff\x5c\x02\x08\x02\xd5\xff\x85\x02\x08\x02\xef\xff\ +\x9a\x02\x08\x02\xf1\xff\x9a\x02\x08\x02\xf3\xff\x9a\x02\x08\x02\ +\xfd\xff\x5c\x02\x08\x02\xfe\xff\x85\x02\x08\x03\x0d\xff\x85\x02\ +\x08\x03\x0e\xff\x9a\x02\x08\x03\x0f\xff\x85\x02\x08\x03\x10\xff\ +\x9a\x02\x08\x03\x15\xff\x9a\x02\x08\x03\x17\xffq\x02\x08\x03\ +\x18\xff\x9a\x02\x08\x03I\xff\x9a\x02\x08\x03K\xff\x9a\x02\ +\x08\x03M\xff\x9a\x02\x08\x03O\xff\x9a\x02\x08\x03Q\xff\ +\x9a\x02\x08\x03S\xff\x9a\x02\x08\x03U\xff\x9a\x02\x08\x03\ +W\xff\x9a\x02\x08\x03Y\xff\x9a\x02\x08\x03[\xff\x9a\x02\ +\x08\x03]\xff\x9a\x02\x08\x03_\xff\x9a\x02\x08\x03a\xff\ +\xd7\x02\x08\x03c\xff\xd7\x02\x08\x03e\xff\xd7\x02\x08\x03\ +g\xff\xd7\x02\x08\x03i\xff\xd7\x02\x08\x03k\xff\xd7\x02\ +\x08\x03m\xff\xd7\x02\x08\x03o\xff\x85\x02\x08\x03q\xff\ +\x85\x02\x08\x03s\xff\x85\x02\x08\x03\x8f\xffq\x02\x0a\x00\ +$\xffq\x02\x0a\x007\x00)\x02\x0a\x009\x00)\x02\ +\x0a\x00:\x00)\x02\x0a\x00<\x00\x14\x02\x0a\x00D\xff\ +\xae\x02\x0a\x00F\xff\x85\x02\x0a\x00G\xff\x85\x02\x0a\x00\ +H\xff\x85\x02\x0a\x00J\xff\xc3\x02\x0a\x00P\xff\xc3\x02\ +\x0a\x00Q\xff\xc3\x02\x0a\x00R\xff\x85\x02\x0a\x00S\xff\ +\xc3\x02\x0a\x00T\xff\x85\x02\x0a\x00U\xff\xc3\x02\x0a\x00\ +V\xff\xc3\x02\x0a\x00X\xff\xc3\x02\x0a\x00\x82\xffq\x02\ +\x0a\x00\x83\xffq\x02\x0a\x00\x84\xffq\x02\x0a\x00\x85\xff\ +q\x02\x0a\x00\x86\xffq\x02\x0a\x00\x87\xffq\x02\x0a\x00\ +\x9f\x00\x14\x02\x0a\x00\xa2\xff\x85\x02\x0a\x00\xa3\xff\xae\x02\ +\x0a\x00\xa4\xff\xae\x02\x0a\x00\xa5\xff\xae\x02\x0a\x00\xa6\xff\ +\xae\x02\x0a\x00\xa7\xff\xae\x02\x0a\x00\xa8\xff\xae\x02\x0a\x00\ +\xa9\xff\x85\x02\x0a\x00\xaa\xff\x85\x02\x0a\x00\xab\xff\x85\x02\ +\x0a\x00\xac\xff\x85\x02\x0a\x00\xad\xff\x85\x02\x0a\x00\xb4\xff\ +\x85\x02\x0a\x00\xb5\xff\x85\x02\x0a\x00\xb6\xff\x85\x02\x0a\x00\ +\xb7\xff\x85\x02\x0a\x00\xb8\xff\x85\x02\x0a\x00\xba\xff\x85\x02\ +\x0a\x00\xbb\xff\xc3\x02\x0a\x00\xbc\xff\xc3\x02\x0a\x00\xbd\xff\ +\xc3\x02\x0a\x00\xbe\xff\xc3\x02\x0a\x00\xc2\xffq\x02\x0a\x00\ +\xc3\xff\xae\x02\x0a\x00\xc4\xffq\x02\x0a\x00\xc5\xff\xae\x02\ +\x0a\x00\xc6\xffq\x02\x0a\x00\xc7\xff\xae\x02\x0a\x00\xc9\xff\ +\x85\x02\x0a\x00\xcb\xff\x85\x02\x0a\x00\xcd\xff\x85\x02\x0a\x00\ +\xcf\xff\x85\x02\x0a\x00\xd1\xff\x85\x02\x0a\x00\xd3\xff\x85\x02\ +\x0a\x00\xd5\xff\x85\x02\x0a\x00\xd7\xff\x85\x02\x0a\x00\xd9\xff\ +\x85\x02\x0a\x00\xdb\xff\x85\x02\x0a\x00\xdd\xff\x85\x02\x0a\x00\ +\xdf\xff\xc3\x02\x0a\x00\xe1\xff\xc3\x02\x0a\x00\xe3\xff\xc3\x02\ +\x0a\x00\xe5\xff\xc3\x02\x0a\x00\xfa\xff\xc3\x02\x0a\x01\x06\xff\ +\xc3\x02\x0a\x01\x08\xff\xc3\x02\x0a\x01\x0d\xff\xc3\x02\x0a\x01\ +\x0f\xff\x85\x02\x0a\x01\x11\xff\x85\x02\x0a\x01\x13\xff\x85\x02\ +\x0a\x01\x15\xff\x85\x02\x0a\x01\x17\xff\xc3\x02\x0a\x01\x19\xff\ +\xc3\x02\x0a\x01\x1d\xff\xc3\x02\x0a\x01!\xff\xc3\x02\x0a\x01\ +$\x00)\x02\x0a\x01&\x00)\x02\x0a\x01+\xff\xc3\x02\ +\x0a\x01-\xff\xc3\x02\x0a\x01/\xff\xc3\x02\x0a\x011\xff\ +\xc3\x02\x0a\x013\xff\xc3\x02\x0a\x015\xff\xc3\x02\x0a\x01\ +6\x00)\x02\x0a\x018\x00\x14\x02\x0a\x01:\x00\x14\x02\ +\x0a\x01C\xffq\x02\x0a\x01D\xff\xae\x02\x0a\x01F\xff\ +\xae\x02\x0a\x01H\xff\x85\x02\x0a\x01J\xff\xc3\x02\x0a\x01\ +V\xffq\x02\x0a\x01_\xffq\x02\x0a\x01b\xffq\x02\ +\x0a\x01i\xffq\x02\x0a\x01y\xff\xae\x02\x0a\x01z\xff\ +\xd7\x02\x0a\x01{\xff\xd7\x02\x0a\x01~\xff\xae\x02\x0a\x01\ +\x81\xff\xc3\x02\x0a\x01\x82\xff\xd7\x02\x0a\x01\x83\xff\xd7\x02\ +\x0a\x01\x84\xff\xd7\x02\x0a\x01\x87\xff\xd7\x02\x0a\x01\x89\xff\ +\xd7\x02\x0a\x01\x8c\xff\xae\x02\x0a\x01\x8e\xff\xc3\x02\x0a\x01\ +\x8f\xff\xae\x02\x0a\x01\x90\xff\xae\x02\x0a\x01\x93\xff\xae\x02\ +\x0a\x01\x99\xff\xae\x02\x0a\x01\xa4\xff\x85\x02\x0a\x01\xaa\xff\ +q\x02\x0a\x01\xae\xff\x85\x02\x0a\x01\xb5\xff\x85\x02\x0a\x01\ +\xca\xff\xd7\x02\x0a\x01\xce\xffq\x02\x0a\x01\xcf\xff\x85\x02\ +\x0a\x01\xd5\xffq\x02\x0a\x01\xd8\xff\x85\x02\x0a\x01\xdb\xff\ +\x85\x02\x0a\x01\xde\xff\x85\x02\x0a\x01\xea\xff\x85\x02\x0a\x01\ +\xed\xff\x85\x02\x0a\x01\xee\xff\xc3\x02\x0a\x01\xf2\xffq\x02\ +\x0a\x01\xfa\x00)\x02\x0a\x01\xfc\x00)\x02\x0a\x01\xfe\x00\ +)\x02\x0a\x02\x00\x00\x14\x02\x0a\x02W\xff\xc3\x02\x0a\x02\ +X\xffq\x02\x0a\x02Y\xff\xae\x02\x0a\x02`\xff\x85\x02\ +\x0a\x02b\xff\xc3\x02\x0a\x02j\xff\x85\x02\x0a\x02r\xff\ +q\x02\x0a\x02s\xffq\x02\x0a\x02}\xff\xec\x02\x0a\x02\ +\x7f\xff\x85\x02\x0a\x02\x85\xff\x85\x02\x0a\x02\x87\xff\x85\x02\ +\x0a\x02\x89\xff\x85\x02\x0a\x02\x8d\xff\x85\x02\x0a\x02\xb2\xff\ +\x85\x02\x0a\x02\xb4\xff\x85\x02\x0a\x02\xce\xff\x85\x02\x0a\x02\ +\xcf\xffq\x02\x0a\x02\xd9\xffq\x02\x0a\x02\xda\xff\xd7\x02\ +\x0a\x02\xdb\xffq\x02\x0a\x02\xdc\xff\xd7\x02\x0a\x02\xdd\xff\ +q\x02\x0a\x02\xde\xff\xd7\x02\x0a\x02\xe0\xff\x85\x02\x0a\x02\ +\xe2\xff\xd7\x02\x0a\x02\xe4\xff\xd7\x02\x0a\x02\xf0\xff\x85\x02\ +\x0a\x02\xf2\xff\x85\x02\x0a\x02\xf4\xff\x85\x02\x0a\x03\x09\xff\ +q\x02\x0a\x03\x0a\xff\x85\x02\x0a\x03\x0b\xffq\x02\x0a\x03\ +\x0c\xff\x85\x02\x0a\x03\x11\xff\x85\x02\x0a\x03\x12\xffq\x02\ +\x0a\x03\x16\xff\x85\x02\x0a\x03\x1a\xff\x85\x02\x0a\x03\x1b\xff\ +\x85\x02\x0a\x03\x1c\xffq\x02\x0a\x03\x1d\xffq\x02\x0a\x03\ +\x1e\xff\xae\x02\x0a\x03\x1f\xffq\x02\x0a\x03 \xff\xae\x02\ +\x0a\x03!\xffq\x02\x0a\x03\x22\xff\xae\x02\x0a\x03#\xff\ +q\x02\x0a\x03%\xffq\x02\x0a\x03&\xff\xae\x02\x0a\x03\ +'\xffq\x02\x0a\x03(\xff\xae\x02\x0a\x03)\xffq\x02\ +\x0a\x03*\xff\xae\x02\x0a\x03+\xffq\x02\x0a\x03,\xff\ +\xae\x02\x0a\x03-\xffq\x02\x0a\x03.\xff\xae\x02\x0a\x03\ +/\xffq\x02\x0a\x030\xff\xae\x02\x0a\x031\xffq\x02\ +\x0a\x032\xff\xae\x02\x0a\x033\xffq\x02\x0a\x034\xff\ +\xae\x02\x0a\x036\xff\x85\x02\x0a\x038\xff\x85\x02\x0a\x03\ +:\xff\x85\x02\x0a\x03<\xff\x85\x02\x0a\x03@\xff\x85\x02\ +\x0a\x03B\xff\x85\x02\x0a\x03D\xff\x85\x02\x0a\x03J\xff\ +\x85\x02\x0a\x03L\xff\x85\x02\x0a\x03N\xff\x85\x02\x0a\x03\ +R\xff\x85\x02\x0a\x03T\xff\x85\x02\x0a\x03V\xff\x85\x02\ +\x0a\x03X\xff\x85\x02\x0a\x03Z\xff\x85\x02\x0a\x03\x5c\xff\ +\x85\x02\x0a\x03^\xff\x85\x02\x0a\x03`\xff\x85\x02\x0a\x03\ +b\xff\xc3\x02\x0a\x03d\xff\xc3\x02\x0a\x03f\xff\xc3\x02\ +\x0a\x03h\xff\xc3\x02\x0a\x03j\xff\xc3\x02\x0a\x03l\xff\ +\xc3\x02\x0a\x03n\xff\xc3\x02\x0a\x03o\x00\x14\x02\x0a\x03\ +q\x00\x14\x02\x0a\x03s\x00\x14\x02\x0a\x03\x8f\x00)\x02\ +\x0c\x00&\xff\x9a\x02\x0c\x00*\xff\x9a\x02\x0c\x002\xff\ +\x9a\x02\x0c\x004\xff\x9a\x02\x0c\x007\xffq\x02\x0c\x00\ +8\xff\xd7\x02\x0c\x009\xff\x85\x02\x0c\x00:\xff\x85\x02\ +\x0c\x00<\xff\x85\x02\x0c\x00\x89\xff\x9a\x02\x0c\x00\x94\xff\ +\x9a\x02\x0c\x00\x95\xff\x9a\x02\x0c\x00\x96\xff\x9a\x02\x0c\x00\ +\x97\xff\x9a\x02\x0c\x00\x98\xff\x9a\x02\x0c\x00\x9a\xff\x9a\x02\ +\x0c\x00\x9b\xff\xd7\x02\x0c\x00\x9c\xff\xd7\x02\x0c\x00\x9d\xff\ +\xd7\x02\x0c\x00\x9e\xff\xd7\x02\x0c\x00\x9f\xff\x85\x02\x0c\x00\ +\xc8\xff\x9a\x02\x0c\x00\xca\xff\x9a\x02\x0c\x00\xcc\xff\x9a\x02\ +\x0c\x00\xce\xff\x9a\x02\x0c\x00\xde\xff\x9a\x02\x0c\x00\xe0\xff\ +\x9a\x02\x0c\x00\xe2\xff\x9a\x02\x0c\x00\xe4\xff\x9a\x02\x0c\x01\ +\x0e\xff\x9a\x02\x0c\x01\x10\xff\x9a\x02\x0c\x01\x12\xff\x9a\x02\ +\x0c\x01\x14\xff\x9a\x02\x0c\x01$\xffq\x02\x0c\x01&\xff\ +q\x02\x0c\x01*\xff\xd7\x02\x0c\x01,\xff\xd7\x02\x0c\x01\ +.\xff\xd7\x02\x0c\x010\xff\xd7\x02\x0c\x012\xff\xd7\x02\ +\x0c\x014\xff\xd7\x02\x0c\x016\xff\x85\x02\x0c\x018\xff\ +\x85\x02\x0c\x01:\xff\x85\x02\x0c\x01G\xff\x9a\x02\x0c\x01\ +f\xff\xae\x02\x0c\x01m\xff\xae\x02\x0c\x01q\xffq\x02\ +\x0c\x01r\xff\x85\x02\x0c\x01s\xff\x9a\x02\x0c\x01u\xff\ +\x85\x02\x0c\x01x\xff\x85\x02\x0c\x01\x85\xff\xd7\x02\x0c\x01\ +\x9d\xffq\x02\x0c\x01\x9f\xff\x9a\x02\x0c\x01\xa6\xffq\x02\ +\x0c\x01\xb8\xff\x9a\x02\x0c\x01\xbb\xff\x9a\x02\x0c\x01\xbc\xff\ +q\x02\x0c\x01\xbe\xff\xae\x02\x0c\x01\xc1\xff\x5c\x02\x0c\x01\ +\xc4\xffq\x02\x0c\x01\xdc\xff\x9a\x02\x0c\x01\xe1\xff\x85\x02\ +\x0c\x01\xe4\xff\x9a\x02\x0c\x01\xfa\xff\x85\x02\x0c\x01\xfc\xff\ +\x85\x02\x0c\x01\xfe\xff\x85\x02\x0c\x02\x00\xff\x85\x02\x0c\x02\ +T\xff\x85\x02\x0c\x02_\xff\x9a\x02\x0c\x02a\xff\xd7\x02\ +\x0c\x02l\xff\x9a\x02\x0c\x02|\xff\x5c\x02\x0c\x02~\xff\ +\x9a\x02\x0c\x02\x80\xff\x85\x02\x0c\x02\x82\xff\x85\x02\x0c\x02\ +\x84\xff\x9a\x02\x0c\x02\x86\xff\x9a\x02\x0c\x02\x88\xff\x9a\x02\ +\x0c\x02\x8a\xff\x9a\x02\x0c\x02\x8c\xff\x9a\x02\x0c\x02\xa9\xff\ +q\x02\x0c\x02\xaa\xff\x9a\x02\x0c\x02\xb1\xff\x9a\x02\x0c\x02\ +\xb3\xff\x9a\x02\x0c\x02\xb5\xffq\x02\x0c\x02\xb6\xff\x9a\x02\ +\x0c\x02\xb7\xff\x85\x02\x0c\x02\xb9\xff\x85\x02\x0c\x02\xbd\xff\ +q\x02\x0c\x02\xbe\xff\x9a\x02\x0c\x02\xbf\xff\x5c\x02\x0c\x02\ +\xc0\xff\x85\x02\x0c\x02\xc1\xff\x5c\x02\x0c\x02\xc2\xff\x85\x02\ +\x0c\x02\xc5\xff\x85\x02\x0c\x02\xc7\xff\x85\x02\x0c\x02\xd4\xff\ +\x5c\x02\x0c\x02\xd5\xff\x85\x02\x0c\x02\xef\xff\x9a\x02\x0c\x02\ +\xf1\xff\x9a\x02\x0c\x02\xf3\xff\x9a\x02\x0c\x02\xfd\xff\x5c\x02\ +\x0c\x02\xfe\xff\x85\x02\x0c\x03\x0d\xff\x85\x02\x0c\x03\x0e\xff\ +\x9a\x02\x0c\x03\x0f\xff\x85\x02\x0c\x03\x10\xff\x9a\x02\x0c\x03\ +\x15\xff\x9a\x02\x0c\x03\x17\xffq\x02\x0c\x03\x18\xff\x9a\x02\ +\x0c\x03I\xff\x9a\x02\x0c\x03K\xff\x9a\x02\x0c\x03M\xff\ +\x9a\x02\x0c\x03O\xff\x9a\x02\x0c\x03Q\xff\x9a\x02\x0c\x03\ +S\xff\x9a\x02\x0c\x03U\xff\x9a\x02\x0c\x03W\xff\x9a\x02\ +\x0c\x03Y\xff\x9a\x02\x0c\x03[\xff\x9a\x02\x0c\x03]\xff\ +\x9a\x02\x0c\x03_\xff\x9a\x02\x0c\x03a\xff\xd7\x02\x0c\x03\ +c\xff\xd7\x02\x0c\x03e\xff\xd7\x02\x0c\x03g\xff\xd7\x02\ +\x0c\x03i\xff\xd7\x02\x0c\x03k\xff\xd7\x02\x0c\x03m\xff\ +\xd7\x02\x0c\x03o\xff\x85\x02\x0c\x03q\xff\x85\x02\x0c\x03\ +s\xff\x85\x02\x0c\x03\x8f\xffq\x02!\x01q\xff\xd7\x02\ +!\x01r\xff\xec\x02!\x01x\xff\xec\x02!\x02T\xff\ +\xec\x02S\x00\x0f\xff\xc3\x02S\x00\x11\xff\xc3\x02S\x02\ +\x08\xff\xc3\x02S\x02\x0c\xff\xc3\x02T\x00\x0f\xff\x85\x02\ +T\x00\x11\xff\x85\x02T\x01V\xff\x85\x02T\x01_\xff\ +\x85\x02T\x01b\xff\x85\x02T\x01f\xff\xd7\x02T\x01\ +i\xff\x85\x02T\x01m\xff\xd7\x02T\x01s\xff\xc3\x02\ +T\x01v\xff\xec\x02T\x01y\xff\x9a\x02T\x01z\xff\ +\xae\x02T\x01{\xff\xc3\x02T\x01|\xff\xc3\x02T\x01\ +}\xff\xc3\x02T\x01~\xff\x9a\x02T\x01\x81\xff\xc3\x02\ +T\x01\x82\xff\xae\x02T\x01\x84\xff\xc3\x02T\x01\x86\xff\ +\xc3\x02T\x01\x87\xff\xc3\x02T\x01\x89\xff\xc3\x02T\x01\ +\x8c\xff\x9a\x02T\x01\x8e\xff\x9a\x02T\x01\x8f\xff\x9a\x02\ +T\x01\x90\xff\x9a\x02T\x01\x92\xff\xc3\x02T\x01\x93\xff\ +\x9a\x02T\x01\x95\xff\xc3\x02T\x01\x96\xff\xc3\x02T\x01\ +\x98\xff\xc3\x02T\x01\x99\xff\x9a\x02T\x01\x9a\xff\xc3\x02\ +T\x01\x9b\xff\xc3\x02T\x02\x08\xff\x85\x02T\x02\x0c\xff\ +\x85\x02T\x02!\xff\xec\x02X\x00\x05\xffq\x02X\x00\ +\x0a\xffq\x02X\x00&\xff\xd7\x02X\x00*\xff\xd7\x02\ +X\x00-\x01\x0a\x02X\x002\xff\xd7\x02X\x004\xff\ +\xd7\x02X\x007\xffq\x02X\x009\xff\xae\x02X\x00\ +:\xff\xae\x02X\x00<\xff\x85\x02X\x00\x89\xff\xd7\x02\ +X\x00\x94\xff\xd7\x02X\x00\x95\xff\xd7\x02X\x00\x96\xff\ +\xd7\x02X\x00\x97\xff\xd7\x02X\x00\x98\xff\xd7\x02X\x00\ +\x9a\xff\xd7\x02X\x00\x9f\xff\x85\x02X\x00\xc8\xff\xd7\x02\ +X\x00\xca\xff\xd7\x02X\x00\xcc\xff\xd7\x02X\x00\xce\xff\ +\xd7\x02X\x00\xde\xff\xd7\x02X\x00\xe0\xff\xd7\x02X\x00\ +\xe2\xff\xd7\x02X\x00\xe4\xff\xd7\x02X\x01\x0e\xff\xd7\x02\ +X\x01\x10\xff\xd7\x02X\x01\x12\xff\xd7\x02X\x01\x14\xff\ +\xd7\x02X\x01$\xffq\x02X\x01&\xffq\x02X\x01\ +6\xff\xae\x02X\x018\xff\x85\x02X\x01:\xff\x85\x02\ +X\x01G\xff\xd7\x02X\x01\xfa\xff\xae\x02X\x01\xfc\xff\ +\xae\x02X\x01\xfe\xff\xae\x02X\x02\x00\xff\x85\x02X\x02\ +\x07\xffq\x02X\x02\x0b\xffq\x02X\x02_\xff\xd7\x02\ +X\x03I\xff\xd7\x02X\x03K\xff\xd7\x02X\x03M\xff\ +\xd7\x02X\x03O\xff\xd7\x02X\x03Q\xff\xd7\x02X\x03\ +S\xff\xd7\x02X\x03U\xff\xd7\x02X\x03W\xff\xd7\x02\ +X\x03Y\xff\xd7\x02X\x03[\xff\xd7\x02X\x03]\xff\ +\xd7\x02X\x03_\xff\xd7\x02X\x03o\xff\x85\x02X\x03\ +q\xff\x85\x02X\x03s\xff\x85\x02X\x03\x8f\xffq\x02\ +Y\x00\x05\xff\xec\x02Y\x00\x0a\xff\xec\x02Y\x02\x07\xff\ +\xec\x02Y\x02\x0b\xff\xec\x02Z\x00\x0f\xff\xae\x02Z\x00\ +\x11\xff\xae\x02Z\x01V\xff\xd7\x02Z\x01_\xff\xd7\x02\ +Z\x01b\xff\xd7\x02Z\x01d\xff\xec\x02Z\x01i\xff\ +\xd7\x02Z\x01p\xff\xec\x02Z\x01q\xff\xc3\x02Z\x01\ +r\xff\xec\x02Z\x01t\xff\xd7\x02Z\x01u\xff\xec\x02\ +Z\x01x\xff\xec\x02Z\x01\x88\xff\xec\x02Z\x02\x08\xff\ +\xae\x02Z\x02\x0c\xff\xae\x02Z\x02T\xff\xec\x02`\x00\ +I\x00R\x02`\x00W\x00R\x02`\x00Y\x00f\x02\ +`\x00Z\x00f\x02`\x00[\x00f\x02`\x00\x5c\x00\ +f\x02`\x00\xbf\x00f\x02`\x01%\x00R\x02`\x01\ +'\x00R\x02`\x017\x00f\x02`\x01\xfb\x00f\x02\ +`\x01\xfd\x00f\x02`\x024\x00R\x02`\x025\x00\ +R\x02`\x02]\x00R\x02`\x02^\x00R\x02`\x03\ +p\x00f\x02`\x03\x8d\x00R\x02`\x03\x90\x00R\x02\ +b\x00I\x00f\x02b\x00W\x00f\x02b\x00Y\x00\ +f\x02b\x00Z\x00f\x02b\x00[\x00f\x02b\x00\ +\x5c\x00f\x02b\x00\xbf\x00f\x02b\x01%\x00f\x02\ +b\x01'\x00f\x02b\x017\x00f\x02b\x01\xfb\x00\ +f\x02b\x01\xfd\x00f\x02b\x024\x00f\x02b\x02\ +5\x00f\x02b\x02]\x00f\x02b\x02^\x00f\x02\ +b\x03p\x00f\x02b\x03\x8d\x00f\x02b\x03\x90\x00\ +f\x02j\x00\x05\xff\xec\x02j\x00\x0a\xff\xec\x02j\x02\ +\x07\xff\xec\x02j\x02\x0b\xff\xec\x02l\x00\x0f\xff\xae\x02\ +l\x00\x11\xff\xae\x02l\x01\x9d\xff\xec\x02l\x01\xa4\xff\ +\xd7\x02l\x01\xa6\xff\xec\x02l\x01\xa8\xff\xd7\x02l\x01\ +\xaa\xff\xd7\x02l\x01\xae\xff\xd7\x02l\x01\xb0\xff\xd7\x02\ +l\x01\xb1\xff\xec\x02l\x01\xb5\xff\xd7\x02l\x01\xbc\xff\ +\xc3\x02l\x01\xbd\xff\xd7\x02l\x01\xbf\xff\xd7\x02l\x01\ +\xc1\xff\xd7\x02l\x01\xc4\xff\xec\x02l\x01\xc7\xff\xec\x02\ +l\x01\xce\xff\xec\x02l\x01\xd5\xff\xec\x02l\x01\xf2\xff\ +\xec\x02l\x02\x08\xff\xae\x02l\x02\x0c\xff\xae\x02l\x02\ +r\xff\xd7\x02l\x02s\xff\xec\x02l\x02z\xff\xec\x02\ +l\x02|\xff\xd7\x02l\x02\x80\xff\xec\x02l\x02\x82\xff\ +\xec\x02l\x02\x9f\xff\xd7\x02l\x02\xa1\xff\xec\x02l\x02\ +\xa9\xff\xec\x02l\x02\xb5\xff\xc3\x02l\x02\xb7\xff\xec\x02\ +l\x02\xb9\xff\xec\x02l\x02\xbb\xff\xd7\x02l\x02\xbd\xff\ +\xec\x02l\x02\xbf\xff\xd7\x02l\x02\xc1\xff\xd7\x02l\x02\ +\xca\xff\xd7\x02l\x02\xce\xff\xd7\x02l\x02\xcf\xff\xec\x02\ +l\x02\xd4\xff\xd7\x02l\x02\xd9\xff\xd7\x02l\x02\xdb\xff\ +\xd7\x02l\x02\xdd\xff\xd7\x02l\x02\xe5\xff\xd7\x02l\x02\ +\xe7\xff\xec\x02l\x02\xf5\xff\xec\x02l\x02\xf7\xff\xd7\x02\ +l\x02\xf9\xff\xd7\x02l\x02\xfb\xff\xd7\x02l\x02\xfd\xff\ +\xd7\x02l\x03\x05\xff\xd7\x02l\x03\x07\xff\xd7\x02l\x03\ +\x0d\xff\xd7\x02l\x03\x0f\xff\xd7\x02l\x03\x11\xff\xd7\x02\ +l\x03\x12\xff\xec\x02l\x03\x17\xff\xec\x02l\x03\x1b\xff\ +\xd7\x02l\x03\x1c\xff\xec\x02m\x00\x0f\xff\xae\x02m\x00\ +\x11\xff\xae\x02m\x01\xce\xff\xd7\x02m\x01\xd5\xff\xd7\x02\ +m\x01\xf2\xff\xd7\x02m\x02\x08\xff\xae\x02m\x02\x0c\xff\ +\xae\x02m\x02s\xff\xd7\x02m\x02\xcf\xff\xd7\x02m\x03\ +\x12\xff\xd7\x02m\x03\x1c\xff\xd7\x02n\x00\x05\xff\xae\x02\ +n\x00\x0a\xff\xae\x02n\x01\x9d\xff\xd7\x02n\x01\xa6\xff\ +\xd7\x02n\x01\xbc\xff\xae\x02n\x01\xc1\xff\xae\x02n\x01\ +\xc4\xff\xd7\x02n\x01\xdc\xff\xd7\x02n\x01\xe4\xff\xd7\x02\ +n\x02\x07\xff\xae\x02n\x02\x0b\xff\xae\x02n\x02|\xff\ +\xae\x02n\x02\x80\xff\xc3\x02n\x02\x82\xff\xc3\x02n\x02\ +\xa9\xff\xd7\x02n\x02\xaa\xff\xd7\x02n\x02\xb5\xff\xae\x02\ +n\x02\xb6\xff\xd7\x02n\x02\xb7\xff\xc3\x02n\x02\xb9\xff\ +\xc3\x02n\x02\xbd\xff\xd7\x02n\x02\xbe\xff\xd7\x02n\x02\ +\xbf\xff\xae\x02n\x02\xc1\xff\xae\x02n\x02\xd4\xff\xae\x02\ +n\x02\xfd\xff\xae\x02n\x03\x0d\xff\x9a\x02n\x03\x0f\xff\ +\x9a\x02n\x03\x17\xff\xd7\x02n\x03\x18\xff\xd7\x02o\x00\ +\x05\xff\x85\x02o\x00\x0a\xff\x85\x02o\x01\xd0\xff\xd7\x02\ +o\x01\xdc\xff\x9a\x02o\x01\xdd\xff\xc3\x02o\x01\xdf\xff\ +\xd7\x02o\x01\xe1\xff\xae\x02o\x01\xe4\xff\x9a\x02o\x01\ +\xf6\xff\xc3\x02o\x02\x07\xff\x85\x02o\x02\x0b\xff\x85\x02\ +o\x02m\xff\xd7\x02o\x02\x81\xff\xd7\x02o\x02\x83\xff\ +\xd7\x02o\x02\x8b\xff\xd7\x02o\x02\xa0\xff\xd7\x02o\x02\ +\xaa\xff\x9a\x02o\x02\xb6\xff\x9a\x02o\x02\xb8\xff\xc3\x02\ +o\x02\xba\xff\xc3\x02o\x02\xbc\xff\xd7\x02o\x02\xbe\xff\ +\x9a\x02o\x02\xc0\xff\xae\x02o\x02\xc2\xff\xae\x02o\x02\ +\xc6\xff\xd7\x02o\x02\xc8\xff\xd7\x02o\x02\xcb\xff\xd7\x02\ +o\x02\xd5\xff\xae\x02o\x02\xe6\xff\xd7\x02o\x02\xea\xff\ +\xd7\x02o\x02\xf8\xff\xc3\x02o\x02\xfa\xff\xc3\x02o\x02\ +\xfc\xff\xc3\x02o\x02\xfe\xff\xae\x02o\x03\x06\xff\xd7\x02\ +o\x03\x08\xff\xd7\x02o\x03\x0e\xff\x9a\x02o\x03\x10\xff\ +\x9a\x02o\x03\x18\xff\x9a\x02p\x01\x9f\xff\xd7\x02p\x01\ +\xb8\xff\xd7\x02p\x01\xbb\xff\xd7\x02p\x01\xbe\xff\xd7\x02\ +p\x01\xe1\xff\xd7\x02p\x02l\xff\xd7\x02p\x02~\xff\ +\xd7\x02p\x02\x84\xff\xd7\x02p\x02\x86\xff\xd7\x02p\x02\ +\x88\xff\xd7\x02p\x02\x8a\xff\xd7\x02p\x02\x8c\xff\xd7\x02\ +p\x02\xb1\xff\xd7\x02p\x02\xb3\xff\xd7\x02p\x02\xc0\xff\ +\xd7\x02p\x02\xc2\xff\xd7\x02p\x02\xc5\xff\xd7\x02p\x02\ +\xc7\xff\xd7\x02p\x02\xd5\xff\xd7\x02p\x02\xef\xff\xd7\x02\ +p\x02\xf1\xff\xd7\x02p\x02\xf3\xff\xd7\x02p\x02\xfe\xff\ +\xd7\x02p\x03\x09\xff\xd7\x02p\x03\x0b\xff\xd7\x02p\x03\ +\x0e\xff\xd7\x02p\x03\x10\xff\xd7\x02p\x03\x15\xff\xd7\x02\ +r\x00\x05\xffq\x02r\x00\x0a\xffq\x02r\x01\x9d\xff\ +\x9a\x02r\x01\xa6\xff\x9a\x02r\x01\xbc\xffq\x02r\x01\ +\xbe\xff\xd7\x02r\x01\xc1\xff\x9a\x02r\x01\xc4\xff\x9a\x02\ +r\x01\xdc\xff\xd7\x02r\x01\xe1\xff\xd7\x02r\x01\xe4\xff\ +\xd7\x02r\x02\x07\xffq\x02r\x02\x0b\xffq\x02r\x02\ +n\xff\xd7\x02r\x02|\xff\x9a\x02r\x02\x80\xff\xae\x02\ +r\x02\x82\xff\xae\x02r\x02\x97\xff\xd7\x02r\x02\x9b\xff\ +\xd7\x02r\x02\xa7\xff\xd7\x02r\x02\xa9\xff\x9a\x02r\x02\ +\xaa\xff\xd7\x02r\x02\xb5\xffq\x02r\x02\xb6\xff\xd7\x02\ +r\x02\xb7\xff\x85\x02r\x02\xb9\xff\x85\x02r\x02\xbd\xff\ +\x9a\x02r\x02\xbe\xff\xd7\x02r\x02\xbf\xff\x9a\x02r\x02\ +\xc0\xff\xd7\x02r\x02\xc1\xff\x9a\x02r\x02\xc2\xff\xd7\x02\ +r\x02\xc5\xff\x9a\x02r\x02\xc7\xff\x9a\x02r\x02\xd4\xff\ +\x9a\x02r\x02\xd5\xff\xd7\x02r\x02\xe1\xff\xd7\x02r\x02\ +\xe3\xff\xd7\x02r\x02\xfd\xff\x9a\x02r\x02\xfe\xff\xd7\x02\ +r\x03\x03\xff\xd7\x02r\x03\x0d\xffq\x02r\x03\x0e\xff\ +\xd7\x02r\x03\x0f\xffq\x02r\x03\x10\xff\xd7\x02r\x03\ +\x17\xff\x9a\x02r\x03\x18\xff\xd7\x02s\x00\x05\xffq\x02\ +s\x00\x0a\xffq\x02s\x01\xcf\xff\xd7\x02s\x01\xd8\xff\ +\xd7\x02s\x01\xdb\xff\xd7\x02s\x01\xdc\xff\x9a\x02s\x01\ +\xdd\xff\xc3\x02s\x01\xde\xff\xd7\x02s\x01\xe1\xff\xc3\x02\ +s\x01\xe4\xff\x9a\x02s\x01\xea\xff\xd7\x02s\x01\xed\xff\ +\xd7\x02s\x01\xf6\xff\xc3\x02s\x02\x07\xffq\x02s\x02\ +\x0b\xffq\x02s\x02j\xff\xd7\x02s\x02m\xff\xd7\x02\ +s\x02}\xff\xec\x02s\x02\x7f\xff\xd7\x02s\x02\x81\xff\ +\xd7\x02s\x02\x83\xff\xd7\x02s\x02\x85\xff\xd7\x02s\x02\ +\x87\xff\xd7\x02s\x02\x89\xff\xd7\x02s\x02\x8b\xff\xd7\x02\ +s\x02\x8d\xff\xd7\x02s\x02\xaa\xff\x9a\x02s\x02\xb2\xff\ +\xd7\x02s\x02\xb4\xff\xd7\x02s\x02\xb6\xff\x9a\x02s\x02\ +\xb8\xff\xd7\x02s\x02\xba\xff\xd7\x02s\x02\xbe\xff\x9a\x02\ +s\x02\xc0\xff\xc3\x02s\x02\xc2\xff\xc3\x02s\x02\xc6\xff\ +\xd7\x02s\x02\xc8\xff\xd7\x02s\x02\xd5\xff\xc3\x02s\x02\ +\xe0\xff\xd7\x02s\x02\xf0\xff\xd7\x02s\x02\xf2\xff\xd7\x02\ +s\x02\xf4\xff\xd7\x02s\x02\xf8\xff\xc3\x02s\x02\xfa\xff\ +\xc3\x02s\x02\xfc\xff\xc3\x02s\x02\xfe\xff\xc3\x02s\x03\ +\x0a\xff\xd7\x02s\x03\x0c\xff\xd7\x02s\x03\x0e\xff\x85\x02\ +s\x03\x10\xff\x85\x02s\x03\x16\xff\xd7\x02s\x03\x18\xff\ +\x9a\x02s\x03\x1a\xff\xd7\x02t\x00\x05\xffq\x02t\x00\ +\x0a\xffq\x02t\x01\x9d\xff\x9a\x02t\x01\xa6\xff\x9a\x02\ +t\x01\xbc\xffq\x02t\x01\xbe\xff\xd7\x02t\x01\xc1\xff\ +\x9a\x02t\x01\xc4\xff\x9a\x02t\x01\xdc\xff\xd7\x02t\x01\ +\xe1\xff\xd7\x02t\x01\xe4\xff\xd7\x02t\x02\x07\xffq\x02\ +t\x02\x0b\xffq\x02t\x02n\xff\xd7\x02t\x02|\xff\ +\x9a\x02t\x02\x80\xff\xae\x02t\x02\x82\xff\xae\x02t\x02\ +\x97\xff\xd7\x02t\x02\x9b\xff\xd7\x02t\x02\xa7\xff\xd7\x02\ +t\x02\xa9\xff\x9a\x02t\x02\xaa\xff\xd7\x02t\x02\xb5\xff\ +q\x02t\x02\xb6\xff\xd7\x02t\x02\xb7\xff\x85\x02t\x02\ +\xb9\xff\x85\x02t\x02\xbd\xff\x9a\x02t\x02\xbe\xff\xd7\x02\ +t\x02\xbf\xff\x9a\x02t\x02\xc0\xff\xd7\x02t\x02\xc1\xff\ +\x9a\x02t\x02\xc2\xff\xd7\x02t\x02\xc5\xff\x9a\x02t\x02\ +\xc7\xff\x9a\x02t\x02\xd4\xff\x9a\x02t\x02\xd5\xff\xd7\x02\ +t\x02\xe1\xff\xd7\x02t\x02\xe3\xff\xd7\x02t\x02\xfd\xff\ +\x9a\x02t\x02\xfe\xff\xd7\x02t\x03\x03\xff\xd7\x02t\x03\ +\x0d\xffq\x02t\x03\x0e\xff\xd7\x02t\x03\x0f\xffq\x02\ +t\x03\x10\xff\xd7\x02t\x03\x17\xff\x9a\x02t\x03\x18\xff\ +\xd7\x02u\x00\x05\xffq\x02u\x00\x0a\xffq\x02u\x01\ +\xcf\xff\xd7\x02u\x01\xd8\xff\xd7\x02u\x01\xdb\xff\xd7\x02\ +u\x01\xdc\xff\x9a\x02u\x01\xdd\xff\xc3\x02u\x01\xde\xff\ +\xd7\x02u\x01\xe1\xff\xc3\x02u\x01\xe4\xff\x9a\x02u\x01\ +\xea\xff\xd7\x02u\x01\xed\xff\xd7\x02u\x01\xf6\xff\xc3\x02\ +u\x02\x07\xffq\x02u\x02\x0b\xffq\x02u\x02j\xff\ +\xd7\x02u\x02m\xff\xd7\x02u\x02}\xff\xec\x02u\x02\ +\x7f\xff\xd7\x02u\x02\x81\xff\xd7\x02u\x02\x83\xff\xd7\x02\ +u\x02\x85\xff\xd7\x02u\x02\x87\xff\xd7\x02u\x02\x89\xff\ +\xd7\x02u\x02\x8b\xff\xd7\x02u\x02\x8d\xff\xd7\x02u\x02\ +\xaa\xff\x9a\x02u\x02\xb2\xff\xd7\x02u\x02\xb4\xff\xd7\x02\ +u\x02\xb6\xff\x9a\x02u\x02\xb8\xff\xd7\x02u\x02\xba\xff\ +\xd7\x02u\x02\xbe\xff\x9a\x02u\x02\xc0\xff\xc3\x02u\x02\ +\xc2\xff\xc3\x02u\x02\xc6\xff\xd7\x02u\x02\xc8\xff\xd7\x02\ +u\x02\xd5\xff\xc3\x02u\x02\xe0\xff\xd7\x02u\x02\xf0\xff\ +\xd7\x02u\x02\xf2\xff\xd7\x02u\x02\xf4\xff\xd7\x02u\x02\ +\xf8\xff\xc3\x02u\x02\xfa\xff\xc3\x02u\x02\xfc\xff\xc3\x02\ +u\x02\xfe\xff\xc3\x02u\x03\x0a\xff\xd7\x02u\x03\x0c\xff\ +\xd7\x02u\x03\x0e\xff\x85\x02u\x03\x10\xff\x85\x02u\x03\ +\x16\xff\xd7\x02u\x03\x18\xff\x9a\x02u\x03\x1a\xff\xd7\x02\ +v\x03\x0d\xff\xec\x02v\x03\x0f\xff\xec\x02x\x03\x0d\xff\ +\xec\x02x\x03\x0f\xff\xec\x02z\x00\x0f\xff\xae\x02z\x00\ +\x11\xff\xae\x02z\x02\x08\xff\xae\x02z\x02\x0c\xff\xae\x02\ +z\x02\x80\xff\xec\x02z\x02\x82\xff\xec\x02z\x02\xb7\xff\ +\xec\x02z\x02\xb9\xff\xec\x02z\x03\x0d\xff\xd7\x02z\x03\ +\x0f\xff\xd7\x02|\x00\x0f\xffq\x02|\x00\x11\xffq\x02\ +|\x01\xa4\xff\xc3\x02|\x01\xaa\xff\xae\x02|\x01\xae\xff\ +\xc3\x02|\x01\xb5\xff\xc3\x02|\x01\xce\xff\xd7\x02|\x01\ +\xd5\xff\xd7\x02|\x01\xf2\xff\xd7\x02|\x02\x08\xffq\x02\ +|\x02\x0c\xffq\x02|\x02r\xff\xae\x02|\x02s\xff\ +\xd7\x02|\x02\xce\xff\xc3\x02|\x02\xcf\xff\xd7\x02|\x02\ +\xd9\xff\xae\x02|\x02\xdb\xff\xae\x02|\x02\xdd\xff\xae\x02\ +|\x03\x09\xff\xae\x02|\x03\x0b\xff\xae\x02|\x03\x11\xff\ +\xc3\x02|\x03\x12\xff\xd7\x02|\x03\x1b\xff\xc3\x02|\x03\ +\x1c\xff\xd7\x02}\x00\x05\xff\xec\x02}\x00\x0a\xff\xec\x02\ +}\x01\xd0\xff\xd7\x02}\x01\xdc\xff\xec\x02}\x01\xdd\xff\ +\xec\x02}\x01\xdf\xff\xd7\x02}\x01\xe1\xff\xec\x02}\x01\ +\xe4\xff\xec\x02}\x01\xf6\xff\xec\x02}\x02\x07\xff\xec\x02\ +}\x02\x0b\xff\xec\x02}\x02\xa0\xff\xd7\x02}\x02\xaa\xff\ +\xec\x02}\x02\xb6\xff\xec\x02}\x02\xbc\xff\xd7\x02}\x02\ +\xbe\xff\xec\x02}\x02\xc0\xff\xec\x02}\x02\xc2\xff\xec\x02\ +}\x02\xcb\xff\xd7\x02}\x02\xd5\xff\xec\x02}\x02\xe6\xff\ +\xd7\x02}\x02\xf8\xff\xec\x02}\x02\xfa\xff\xec\x02}\x02\ +\xfc\xff\xec\x02}\x02\xfe\xff\xec\x02}\x03\x06\xff\xd7\x02\ +}\x03\x08\xff\xd7\x02}\x03\x0e\xff\xec\x02}\x03\x10\xff\ +\xec\x02}\x03\x18\xff\xec\x02~\x00\x0f\xff\xae\x02~\x00\ +\x11\xff\xae\x02~\x01\x9d\xff\xec\x02~\x01\xa4\xff\xd7\x02\ +~\x01\xa6\xff\xec\x02~\x01\xa8\xff\xd7\x02~\x01\xaa\xff\ +\xd7\x02~\x01\xae\xff\xd7\x02~\x01\xb0\xff\xd7\x02~\x01\ +\xb1\xff\xec\x02~\x01\xb5\xff\xd7\x02~\x01\xbc\xff\xc3\x02\ +~\x01\xbd\xff\xd7\x02~\x01\xbf\xff\xd7\x02~\x01\xc1\xff\ +\xd7\x02~\x01\xc4\xff\xec\x02~\x01\xc7\xff\xec\x02~\x01\ +\xce\xff\xec\x02~\x01\xd5\xff\xec\x02~\x01\xf2\xff\xec\x02\ +~\x02\x08\xff\xae\x02~\x02\x0c\xff\xae\x02~\x02r\xff\ +\xd7\x02~\x02s\xff\xec\x02~\x02z\xff\xec\x02~\x02\ +|\xff\xd7\x02~\x02\x80\xff\xec\x02~\x02\x82\xff\xec\x02\ +~\x02\x9f\xff\xd7\x02~\x02\xa1\xff\xec\x02~\x02\xa9\xff\ +\xec\x02~\x02\xb5\xff\xc3\x02~\x02\xb7\xff\xec\x02~\x02\ +\xb9\xff\xec\x02~\x02\xbb\xff\xd7\x02~\x02\xbd\xff\xec\x02\ +~\x02\xbf\xff\xd7\x02~\x02\xc1\xff\xd7\x02~\x02\xca\xff\ +\xd7\x02~\x02\xce\xff\xd7\x02~\x02\xcf\xff\xec\x02~\x02\ +\xd4\xff\xd7\x02~\x02\xd9\xff\xd7\x02~\x02\xdb\xff\xd7\x02\ +~\x02\xdd\xff\xd7\x02~\x02\xe5\xff\xd7\x02~\x02\xe7\xff\ +\xec\x02~\x02\xf5\xff\xec\x02~\x02\xf7\xff\xd7\x02~\x02\ +\xf9\xff\xd7\x02~\x02\xfb\xff\xd7\x02~\x02\xfd\xff\xd7\x02\ +~\x03\x05\xff\xd7\x02~\x03\x07\xff\xd7\x02~\x03\x0d\xff\ +\xd7\x02~\x03\x0f\xff\xd7\x02~\x03\x11\xff\xd7\x02~\x03\ +\x12\xff\xec\x02~\x03\x17\xff\xec\x02~\x03\x1b\xff\xd7\x02\ +~\x03\x1c\xff\xec\x02\x7f\x00\x05\xff\xec\x02\x7f\x00\x0a\xff\ +\xec\x02\x7f\x01\xd0\xff\xd7\x02\x7f\x01\xdc\xff\xec\x02\x7f\x01\ +\xdd\xff\xec\x02\x7f\x01\xdf\xff\xd7\x02\x7f\x01\xe1\xff\xec\x02\ +\x7f\x01\xe4\xff\xec\x02\x7f\x01\xf6\xff\xec\x02\x7f\x02\x07\xff\ +\xec\x02\x7f\x02\x0b\xff\xec\x02\x7f\x02\xa0\xff\xd7\x02\x7f\x02\ +\xaa\xff\xec\x02\x7f\x02\xb6\xff\xec\x02\x7f\x02\xbc\xff\xd7\x02\ +\x7f\x02\xbe\xff\xec\x02\x7f\x02\xc0\xff\xec\x02\x7f\x02\xc2\xff\ +\xec\x02\x7f\x02\xcb\xff\xd7\x02\x7f\x02\xd5\xff\xec\x02\x7f\x02\ +\xe6\xff\xd7\x02\x7f\x02\xf8\xff\xec\x02\x7f\x02\xfa\xff\xec\x02\ +\x7f\x02\xfc\xff\xec\x02\x7f\x02\xfe\xff\xec\x02\x7f\x03\x06\xff\ +\xd7\x02\x7f\x03\x08\xff\xd7\x02\x7f\x03\x0e\xff\xec\x02\x7f\x03\ +\x10\xff\xec\x02\x7f\x03\x18\xff\xec\x02\x80\x00\x0f\xff\x85\x02\ +\x80\x00\x11\xff\x85\x02\x80\x01\x9f\xff\xec\x02\x80\x01\xa4\xff\ +\x9a\x02\x80\x01\xaa\xffq\x02\x80\x01\xae\xff\x9a\x02\x80\x01\ +\xb5\xff\x9a\x02\x80\x01\xb8\xff\xec\x02\x80\x01\xbb\xff\xec\x02\ +\x80\x01\xbe\xff\xc3\x02\x80\x01\xc9\xff\xec\x02\x80\x01\xce\xff\ +\xae\x02\x80\x01\xcf\xff\xd7\x02\x80\x01\xd5\xff\xae\x02\x80\x01\ +\xd8\xff\xd7\x02\x80\x01\xdb\xff\xd7\x02\x80\x01\xde\xff\xd7\x02\ +\x80\x01\xe1\xff\xd7\x02\x80\x01\xea\xff\xd7\x02\x80\x01\xeb\x00\ +f\x02\x80\x01\xed\xff\xd7\x02\x80\x01\xee\xff\xec\x02\x80\x01\ +\xf2\xff\xae\x02\x80\x01\xf4\x00f\x02\x80\x02\x08\xff\x85\x02\ +\x80\x02\x0c\xff\x85\x02\x80\x02j\xff\xd7\x02\x80\x02l\xff\ +\xec\x02\x80\x02r\xffq\x02\x80\x02s\xff\xae\x02\x80\x02\ +~\xff\xec\x02\x80\x02\x7f\xff\xd7\x02\x80\x02\x84\xff\xec\x02\ +\x80\x02\x85\xff\xd7\x02\x80\x02\x86\xff\xec\x02\x80\x02\x87\xff\ +\xd7\x02\x80\x02\x88\xff\xec\x02\x80\x02\x89\xff\xd7\x02\x80\x02\ +\x8a\xff\xec\x02\x80\x02\x8c\xff\xec\x02\x80\x02\x8d\xff\xd7\x02\ +\x80\x02\x98\x00f\x02\x80\x02\xa8\x00f\x02\x80\x02\xb1\xff\ +\xec\x02\x80\x02\xb2\xff\xd7\x02\x80\x02\xb3\xff\xec\x02\x80\x02\ +\xb4\xff\xd7\x02\x80\x02\xc0\xff\xd7\x02\x80\x02\xc2\xff\xd7\x02\ +\x80\x02\xc5\xff\xd7\x02\x80\x02\xc6\xff\xc3\x02\x80\x02\xc7\xff\ +\xd7\x02\x80\x02\xc8\xff\xc3\x02\x80\x02\xce\xff\x9a\x02\x80\x02\ +\xcf\xff\xae\x02\x80\x02\xd5\xff\xd7\x02\x80\x02\xd9\xffq\x02\ +\x80\x02\xdb\xffq\x02\x80\x02\xdd\xffq\x02\x80\x02\xe0\xff\ +\xd7\x02\x80\x02\xef\xff\xec\x02\x80\x02\xf0\xff\xd7\x02\x80\x02\ +\xf1\xff\xec\x02\x80\x02\xf2\xff\xd7\x02\x80\x02\xf3\xff\xec\x02\ +\x80\x02\xf4\xff\xd7\x02\x80\x02\xfe\xff\xd7\x02\x80\x03\x09\xff\ +q\x02\x80\x03\x0a\xff\xd7\x02\x80\x03\x0b\xffq\x02\x80\x03\ +\x0c\xff\xd7\x02\x80\x03\x11\xff\x9a\x02\x80\x03\x12\xff\xae\x02\ +\x80\x03\x15\xff\xec\x02\x80\x03\x16\xff\xd7\x02\x80\x03\x1a\xff\ +\xd7\x02\x80\x03\x1b\xff\x9a\x02\x80\x03\x1c\xff\xae\x02\x81\x00\ +\x0f\xff\xae\x02\x81\x00\x11\xff\xae\x02\x81\x01\xce\xff\xd7\x02\ +\x81\x01\xd5\xff\xd7\x02\x81\x01\xf2\xff\xd7\x02\x81\x02\x08\xff\ +\xae\x02\x81\x02\x0c\xff\xae\x02\x81\x02s\xff\xd7\x02\x81\x02\ +\xcf\xff\xd7\x02\x81\x03\x12\xff\xd7\x02\x81\x03\x1c\xff\xd7\x02\ +\x82\x00\x0f\xff\x85\x02\x82\x00\x11\xff\x85\x02\x82\x01\x9f\xff\ +\xec\x02\x82\x01\xa4\xff\x9a\x02\x82\x01\xaa\xffq\x02\x82\x01\ +\xae\xff\x9a\x02\x82\x01\xb5\xff\x9a\x02\x82\x01\xb8\xff\xec\x02\ +\x82\x01\xbb\xff\xec\x02\x82\x01\xbe\xff\xc3\x02\x82\x01\xc9\xff\ +\xec\x02\x82\x01\xce\xff\xae\x02\x82\x01\xcf\xff\xd7\x02\x82\x01\ +\xd5\xff\xae\x02\x82\x01\xd8\xff\xd7\x02\x82\x01\xdb\xff\xd7\x02\ +\x82\x01\xde\xff\xd7\x02\x82\x01\xe1\xff\xd7\x02\x82\x01\xea\xff\ +\xd7\x02\x82\x01\xeb\x00f\x02\x82\x01\xed\xff\xd7\x02\x82\x01\ +\xee\xff\xec\x02\x82\x01\xf2\xff\xae\x02\x82\x01\xf4\x00f\x02\ +\x82\x02\x08\xff\x85\x02\x82\x02\x0c\xff\x85\x02\x82\x02j\xff\ +\xd7\x02\x82\x02l\xff\xec\x02\x82\x02r\xffq\x02\x82\x02\ +s\xff\xae\x02\x82\x02~\xff\xec\x02\x82\x02\x7f\xff\xd7\x02\ +\x82\x02\x84\xff\xec\x02\x82\x02\x85\xff\xd7\x02\x82\x02\x86\xff\ +\xec\x02\x82\x02\x87\xff\xd7\x02\x82\x02\x88\xff\xec\x02\x82\x02\ +\x89\xff\xd7\x02\x82\x02\x8a\xff\xec\x02\x82\x02\x8c\xff\xec\x02\ +\x82\x02\x8d\xff\xd7\x02\x82\x02\x98\x00f\x02\x82\x02\xa8\x00\ +f\x02\x82\x02\xb1\xff\xec\x02\x82\x02\xb2\xff\xd7\x02\x82\x02\ +\xb3\xff\xec\x02\x82\x02\xb4\xff\xd7\x02\x82\x02\xc0\xff\xd7\x02\ +\x82\x02\xc2\xff\xd7\x02\x82\x02\xc5\xff\xd7\x02\x82\x02\xc6\xff\ +\xc3\x02\x82\x02\xc7\xff\xd7\x02\x82\x02\xc8\xff\xc3\x02\x82\x02\ +\xce\xff\x9a\x02\x82\x02\xcf\xff\xae\x02\x82\x02\xd5\xff\xd7\x02\ +\x82\x02\xd9\xffq\x02\x82\x02\xdb\xffq\x02\x82\x02\xdd\xff\ +q\x02\x82\x02\xe0\xff\xd7\x02\x82\x02\xef\xff\xec\x02\x82\x02\ +\xf0\xff\xd7\x02\x82\x02\xf1\xff\xec\x02\x82\x02\xf2\xff\xd7\x02\ +\x82\x02\xf3\xff\xec\x02\x82\x02\xf4\xff\xd7\x02\x82\x02\xfe\xff\ +\xd7\x02\x82\x03\x09\xffq\x02\x82\x03\x0a\xff\xd7\x02\x82\x03\ +\x0b\xffq\x02\x82\x03\x0c\xff\xd7\x02\x82\x03\x11\xff\x9a\x02\ +\x82\x03\x12\xff\xae\x02\x82\x03\x15\xff\xec\x02\x82\x03\x16\xff\ +\xd7\x02\x82\x03\x1a\xff\xd7\x02\x82\x03\x1b\xff\x9a\x02\x82\x03\ +\x1c\xff\xae\x02\x83\x00\x0f\xff\xae\x02\x83\x00\x11\xff\xae\x02\ +\x83\x01\xce\xff\xd7\x02\x83\x01\xd5\xff\xd7\x02\x83\x01\xf2\xff\ +\xd7\x02\x83\x02\x08\xff\xae\x02\x83\x02\x0c\xff\xae\x02\x83\x02\ +s\xff\xd7\x02\x83\x02\xcf\xff\xd7\x02\x83\x03\x12\xff\xd7\x02\ +\x83\x03\x1c\xff\xd7\x02\x84\x00\x0f\xff\xae\x02\x84\x00\x11\xff\ +\xae\x02\x84\x01\xce\xff\xd7\x02\x84\x01\xd5\xff\xd7\x02\x84\x01\ +\xf2\xff\xd7\x02\x84\x02\x08\xff\xae\x02\x84\x02\x0c\xff\xae\x02\ +\x84\x02s\xff\xd7\x02\x84\x02\xcf\xff\xd7\x02\x84\x03\x12\xff\ +\xd7\x02\x84\x03\x1c\xff\xd7\x02\x85\x00\x0f\xff\xae\x02\x85\x00\ +\x11\xff\xae\x02\x85\x01\xce\xff\xd7\x02\x85\x01\xd5\xff\xd7\x02\ +\x85\x01\xf2\xff\xd7\x02\x85\x02\x08\xff\xae\x02\x85\x02\x0c\xff\ +\xae\x02\x85\x02s\xff\xd7\x02\x85\x02\xcf\xff\xd7\x02\x85\x03\ +\x12\xff\xd7\x02\x85\x03\x1c\xff\xd7\x02\x86\x00\x0f\xff\xae\x02\ +\x86\x00\x11\xff\xae\x02\x86\x01\x9d\xff\xec\x02\x86\x01\xa4\xff\ +\xd7\x02\x86\x01\xa6\xff\xec\x02\x86\x01\xa8\xff\xd7\x02\x86\x01\ +\xaa\xff\xd7\x02\x86\x01\xae\xff\xd7\x02\x86\x01\xb0\xff\xd7\x02\ +\x86\x01\xb1\xff\xec\x02\x86\x01\xb5\xff\xd7\x02\x86\x01\xbc\xff\ +\xc3\x02\x86\x01\xbd\xff\xd7\x02\x86\x01\xbf\xff\xd7\x02\x86\x01\ +\xc1\xff\xd7\x02\x86\x01\xc4\xff\xec\x02\x86\x01\xc7\xff\xec\x02\ +\x86\x01\xce\xff\xec\x02\x86\x01\xd5\xff\xec\x02\x86\x01\xf2\xff\ +\xec\x02\x86\x02\x08\xff\xae\x02\x86\x02\x0c\xff\xae\x02\x86\x02\ +r\xff\xd7\x02\x86\x02s\xff\xec\x02\x86\x02z\xff\xec\x02\ +\x86\x02|\xff\xd7\x02\x86\x02\x80\xff\xec\x02\x86\x02\x82\xff\ +\xec\x02\x86\x02\x9f\xff\xd7\x02\x86\x02\xa1\xff\xec\x02\x86\x02\ +\xa9\xff\xec\x02\x86\x02\xb5\xff\xc3\x02\x86\x02\xb7\xff\xec\x02\ +\x86\x02\xb9\xff\xec\x02\x86\x02\xbb\xff\xd7\x02\x86\x02\xbd\xff\ +\xec\x02\x86\x02\xbf\xff\xd7\x02\x86\x02\xc1\xff\xd7\x02\x86\x02\ +\xca\xff\xd7\x02\x86\x02\xce\xff\xd7\x02\x86\x02\xcf\xff\xec\x02\ +\x86\x02\xd4\xff\xd7\x02\x86\x02\xd9\xff\xd7\x02\x86\x02\xdb\xff\ +\xd7\x02\x86\x02\xdd\xff\xd7\x02\x86\x02\xe5\xff\xd7\x02\x86\x02\ +\xe7\xff\xec\x02\x86\x02\xf5\xff\xec\x02\x86\x02\xf7\xff\xd7\x02\ +\x86\x02\xf9\xff\xd7\x02\x86\x02\xfb\xff\xd7\x02\x86\x02\xfd\xff\ +\xd7\x02\x86\x03\x05\xff\xd7\x02\x86\x03\x07\xff\xd7\x02\x86\x03\ +\x0d\xff\xd7\x02\x86\x03\x0f\xff\xd7\x02\x86\x03\x11\xff\xd7\x02\ +\x86\x03\x12\xff\xec\x02\x86\x03\x17\xff\xec\x02\x86\x03\x1b\xff\ +\xd7\x02\x86\x03\x1c\xff\xec\x02\x87\x00\x05\xff\xec\x02\x87\x00\ +\x0a\xff\xec\x02\x87\x01\xd0\xff\xd7\x02\x87\x01\xdc\xff\xec\x02\ +\x87\x01\xdd\xff\xec\x02\x87\x01\xdf\xff\xd7\x02\x87\x01\xe1\xff\ +\xec\x02\x87\x01\xe4\xff\xec\x02\x87\x01\xf6\xff\xec\x02\x87\x02\ +\x07\xff\xec\x02\x87\x02\x0b\xff\xec\x02\x87\x02\xa0\xff\xd7\x02\ +\x87\x02\xaa\xff\xec\x02\x87\x02\xb6\xff\xec\x02\x87\x02\xbc\xff\ +\xd7\x02\x87\x02\xbe\xff\xec\x02\x87\x02\xc0\xff\xec\x02\x87\x02\ +\xc2\xff\xec\x02\x87\x02\xcb\xff\xd7\x02\x87\x02\xd5\xff\xec\x02\ +\x87\x02\xe6\xff\xd7\x02\x87\x02\xf8\xff\xec\x02\x87\x02\xfa\xff\ +\xec\x02\x87\x02\xfc\xff\xec\x02\x87\x02\xfe\xff\xec\x02\x87\x03\ +\x06\xff\xd7\x02\x87\x03\x08\xff\xd7\x02\x87\x03\x0e\xff\xec\x02\ +\x87\x03\x10\xff\xec\x02\x87\x03\x18\xff\xec\x02\x88\x00\x0f\xff\ +\xae\x02\x88\x00\x11\xff\xae\x02\x88\x01\x9d\xff\xec\x02\x88\x01\ +\xa4\xff\xd7\x02\x88\x01\xa6\xff\xec\x02\x88\x01\xa8\xff\xd7\x02\ +\x88\x01\xaa\xff\xd7\x02\x88\x01\xae\xff\xd7\x02\x88\x01\xb0\xff\ +\xd7\x02\x88\x01\xb1\xff\xec\x02\x88\x01\xb5\xff\xd7\x02\x88\x01\ +\xbc\xff\xc3\x02\x88\x01\xbd\xff\xd7\x02\x88\x01\xbf\xff\xd7\x02\ +\x88\x01\xc1\xff\xd7\x02\x88\x01\xc4\xff\xec\x02\x88\x01\xc7\xff\ +\xec\x02\x88\x01\xce\xff\xec\x02\x88\x01\xd5\xff\xec\x02\x88\x01\ +\xf2\xff\xec\x02\x88\x02\x08\xff\xae\x02\x88\x02\x0c\xff\xae\x02\ +\x88\x02r\xff\xd7\x02\x88\x02s\xff\xec\x02\x88\x02z\xff\ +\xec\x02\x88\x02|\xff\xd7\x02\x88\x02\x80\xff\xec\x02\x88\x02\ +\x82\xff\xec\x02\x88\x02\x9f\xff\xd7\x02\x88\x02\xa1\xff\xec\x02\ +\x88\x02\xa9\xff\xec\x02\x88\x02\xb5\xff\xc3\x02\x88\x02\xb7\xff\ +\xec\x02\x88\x02\xb9\xff\xec\x02\x88\x02\xbb\xff\xd7\x02\x88\x02\ +\xbd\xff\xec\x02\x88\x02\xbf\xff\xd7\x02\x88\x02\xc1\xff\xd7\x02\ +\x88\x02\xca\xff\xd7\x02\x88\x02\xce\xff\xd7\x02\x88\x02\xcf\xff\ +\xec\x02\x88\x02\xd4\xff\xd7\x02\x88\x02\xd9\xff\xd7\x02\x88\x02\ +\xdb\xff\xd7\x02\x88\x02\xdd\xff\xd7\x02\x88\x02\xe5\xff\xd7\x02\ +\x88\x02\xe7\xff\xec\x02\x88\x02\xf5\xff\xec\x02\x88\x02\xf7\xff\ +\xd7\x02\x88\x02\xf9\xff\xd7\x02\x88\x02\xfb\xff\xd7\x02\x88\x02\ +\xfd\xff\xd7\x02\x88\x03\x05\xff\xd7\x02\x88\x03\x07\xff\xd7\x02\ +\x88\x03\x0d\xff\xd7\x02\x88\x03\x0f\xff\xd7\x02\x88\x03\x11\xff\ +\xd7\x02\x88\x03\x12\xff\xec\x02\x88\x03\x17\xff\xec\x02\x88\x03\ +\x1b\xff\xd7\x02\x88\x03\x1c\xff\xec\x02\x89\x00\x05\xff\xec\x02\ +\x89\x00\x0a\xff\xec\x02\x89\x01\xd0\xff\xd7\x02\x89\x01\xdc\xff\ +\xec\x02\x89\x01\xdd\xff\xec\x02\x89\x01\xdf\xff\xd7\x02\x89\x01\ +\xe1\xff\xec\x02\x89\x01\xe4\xff\xec\x02\x89\x01\xf6\xff\xec\x02\ +\x89\x02\x07\xff\xec\x02\x89\x02\x0b\xff\xec\x02\x89\x02\xa0\xff\ +\xd7\x02\x89\x02\xaa\xff\xec\x02\x89\x02\xb6\xff\xec\x02\x89\x02\ +\xbc\xff\xd7\x02\x89\x02\xbe\xff\xec\x02\x89\x02\xc0\xff\xec\x02\ +\x89\x02\xc2\xff\xec\x02\x89\x02\xcb\xff\xd7\x02\x89\x02\xd5\xff\ +\xec\x02\x89\x02\xe6\xff\xd7\x02\x89\x02\xf8\xff\xec\x02\x89\x02\ +\xfa\xff\xec\x02\x89\x02\xfc\xff\xec\x02\x89\x02\xfe\xff\xec\x02\ +\x89\x03\x06\xff\xd7\x02\x89\x03\x08\xff\xd7\x02\x89\x03\x0e\xff\ +\xec\x02\x89\x03\x10\xff\xec\x02\x89\x03\x18\xff\xec\x02\x8a\x00\ +\x0f\xff\xae\x02\x8a\x00\x11\xff\xae\x02\x8a\x01\x9d\xff\xec\x02\ +\x8a\x01\xa4\xff\xd7\x02\x8a\x01\xa6\xff\xec\x02\x8a\x01\xa8\xff\ +\xd7\x02\x8a\x01\xaa\xff\xd7\x02\x8a\x01\xae\xff\xd7\x02\x8a\x01\ +\xb0\xff\xd7\x02\x8a\x01\xb1\xff\xec\x02\x8a\x01\xb5\xff\xd7\x02\ +\x8a\x01\xbc\xff\xc3\x02\x8a\x01\xbd\xff\xd7\x02\x8a\x01\xbf\xff\ +\xd7\x02\x8a\x01\xc1\xff\xd7\x02\x8a\x01\xc4\xff\xec\x02\x8a\x01\ +\xc7\xff\xec\x02\x8a\x01\xce\xff\xec\x02\x8a\x01\xd5\xff\xec\x02\ +\x8a\x01\xf2\xff\xec\x02\x8a\x02\x08\xff\xae\x02\x8a\x02\x0c\xff\ +\xae\x02\x8a\x02r\xff\xd7\x02\x8a\x02s\xff\xec\x02\x8a\x02\ +z\xff\xec\x02\x8a\x02|\xff\xd7\x02\x8a\x02\x80\xff\xec\x02\ +\x8a\x02\x82\xff\xec\x02\x8a\x02\x9f\xff\xd7\x02\x8a\x02\xa1\xff\ +\xec\x02\x8a\x02\xa9\xff\xec\x02\x8a\x02\xb5\xff\xc3\x02\x8a\x02\ +\xb7\xff\xec\x02\x8a\x02\xb9\xff\xec\x02\x8a\x02\xbb\xff\xd7\x02\ +\x8a\x02\xbd\xff\xec\x02\x8a\x02\xbf\xff\xd7\x02\x8a\x02\xc1\xff\ +\xd7\x02\x8a\x02\xca\xff\xd7\x02\x8a\x02\xce\xff\xd7\x02\x8a\x02\ +\xcf\xff\xec\x02\x8a\x02\xd4\xff\xd7\x02\x8a\x02\xd9\xff\xd7\x02\ +\x8a\x02\xdb\xff\xd7\x02\x8a\x02\xdd\xff\xd7\x02\x8a\x02\xe5\xff\ +\xd7\x02\x8a\x02\xe7\xff\xec\x02\x8a\x02\xf5\xff\xec\x02\x8a\x02\ +\xf7\xff\xd7\x02\x8a\x02\xf9\xff\xd7\x02\x8a\x02\xfb\xff\xd7\x02\ +\x8a\x02\xfd\xff\xd7\x02\x8a\x03\x05\xff\xd7\x02\x8a\x03\x07\xff\ +\xd7\x02\x8a\x03\x0d\xff\xd7\x02\x8a\x03\x0f\xff\xd7\x02\x8a\x03\ +\x11\xff\xd7\x02\x8a\x03\x12\xff\xec\x02\x8a\x03\x17\xff\xec\x02\ +\x8a\x03\x1b\xff\xd7\x02\x8a\x03\x1c\xff\xec\x02\x8b\x00\x0f\xff\ +\xae\x02\x8b\x00\x11\xff\xae\x02\x8b\x01\xce\xff\xd7\x02\x8b\x01\ +\xd5\xff\xd7\x02\x8b\x01\xf2\xff\xd7\x02\x8b\x02\x08\xff\xae\x02\ +\x8b\x02\x0c\xff\xae\x02\x8b\x02s\xff\xd7\x02\x8b\x02\xcf\xff\ +\xd7\x02\x8b\x03\x12\xff\xd7\x02\x8b\x03\x1c\xff\xd7\x02\x8c\x01\ +\x9f\xff\xd7\x02\x8c\x01\xb8\xff\xd7\x02\x8c\x01\xbb\xff\xd7\x02\ +\x8c\x01\xbe\xff\xd7\x02\x8c\x01\xe1\xff\xd7\x02\x8c\x02l\xff\ +\xd7\x02\x8c\x02~\xff\xd7\x02\x8c\x02\x84\xff\xd7\x02\x8c\x02\ +\x86\xff\xd7\x02\x8c\x02\x88\xff\xd7\x02\x8c\x02\x8a\xff\xd7\x02\ +\x8c\x02\x8c\xff\xd7\x02\x8c\x02\xb1\xff\xd7\x02\x8c\x02\xb3\xff\ +\xd7\x02\x8c\x02\xc0\xff\xd7\x02\x8c\x02\xc2\xff\xd7\x02\x8c\x02\ +\xc5\xff\xd7\x02\x8c\x02\xc7\xff\xd7\x02\x8c\x02\xd5\xff\xd7\x02\ +\x8c\x02\xef\xff\xd7\x02\x8c\x02\xf1\xff\xd7\x02\x8c\x02\xf3\xff\ +\xd7\x02\x8c\x02\xfe\xff\xd7\x02\x8c\x03\x09\xff\xd7\x02\x8c\x03\ +\x0b\xff\xd7\x02\x8c\x03\x0e\xff\xd7\x02\x8c\x03\x10\xff\xd7\x02\ +\x8c\x03\x15\xff\xd7\x02\x95\x01\xa3\x00\xe1\x02\x95\x02\xea\x00\ +)\x02\x95\x03\x0e\xff\xd7\x02\x95\x03\x10\xff\xd7\x02\x96\x00\ +\x05\xff\xec\x02\x96\x00\x0a\xff\xec\x02\x96\x02\x07\xff\xec\x02\ +\x96\x02\x0b\xff\xec\x02\x97\x00\x05\xff\xae\x02\x97\x00\x0a\xff\ +\xae\x02\x97\x01\x9d\xff\xd7\x02\x97\x01\xa6\xff\xd7\x02\x97\x01\ +\xbc\xff\xae\x02\x97\x01\xc1\xff\xae\x02\x97\x01\xc4\xff\xd7\x02\ +\x97\x01\xdc\xff\xd7\x02\x97\x01\xe4\xff\xd7\x02\x97\x02\x07\xff\ +\xae\x02\x97\x02\x0b\xff\xae\x02\x97\x02|\xff\xae\x02\x97\x02\ +\x80\xff\xc3\x02\x97\x02\x82\xff\xc3\x02\x97\x02\xa9\xff\xd7\x02\ +\x97\x02\xaa\xff\xd7\x02\x97\x02\xb5\xff\xae\x02\x97\x02\xb6\xff\ +\xd7\x02\x97\x02\xb7\xff\xc3\x02\x97\x02\xb9\xff\xc3\x02\x97\x02\ +\xbd\xff\xd7\x02\x97\x02\xbe\xff\xd7\x02\x97\x02\xbf\xff\xae\x02\ +\x97\x02\xc1\xff\xae\x02\x97\x02\xd4\xff\xae\x02\x97\x02\xfd\xff\ +\xae\x02\x97\x03\x0d\xff\x9a\x02\x97\x03\x0f\xff\x9a\x02\x97\x03\ +\x17\xff\xd7\x02\x97\x03\x18\xff\xd7\x02\x98\x00\x05\xff\x85\x02\ +\x98\x00\x0a\xff\x85\x02\x98\x01\xd0\xff\xd7\x02\x98\x01\xdc\xff\ +\x9a\x02\x98\x01\xdd\xff\xc3\x02\x98\x01\xdf\xff\xd7\x02\x98\x01\ +\xe1\xff\xae\x02\x98\x01\xe4\xff\x9a\x02\x98\x01\xf6\xff\xc3\x02\ +\x98\x02\x07\xff\x85\x02\x98\x02\x0b\xff\x85\x02\x98\x02m\xff\ +\xd7\x02\x98\x02\x81\xff\xd7\x02\x98\x02\x83\xff\xd7\x02\x98\x02\ +\x8b\xff\xd7\x02\x98\x02\xa0\xff\xd7\x02\x98\x02\xaa\xff\x9a\x02\ +\x98\x02\xb6\xff\x9a\x02\x98\x02\xb8\xff\xc3\x02\x98\x02\xba\xff\ +\xc3\x02\x98\x02\xbc\xff\xd7\x02\x98\x02\xbe\xff\x9a\x02\x98\x02\ +\xc0\xff\xae\x02\x98\x02\xc2\xff\xae\x02\x98\x02\xc6\xff\xd7\x02\ +\x98\x02\xc8\xff\xd7\x02\x98\x02\xcb\xff\xd7\x02\x98\x02\xd5\xff\ +\xae\x02\x98\x02\xe6\xff\xd7\x02\x98\x02\xea\xff\xd7\x02\x98\x02\ +\xf8\xff\xc3\x02\x98\x02\xfa\xff\xc3\x02\x98\x02\xfc\xff\xc3\x02\ +\x98\x02\xfe\xff\xae\x02\x98\x03\x06\xff\xd7\x02\x98\x03\x08\xff\ +\xd7\x02\x98\x03\x0e\xff\x9a\x02\x98\x03\x10\xff\x9a\x02\x98\x03\ +\x18\xff\x9a\x02\x99\x00\x0f\xfe\xf6\x02\x99\x00\x11\xfe\xf6\x02\ +\x99\x01\xa4\xff\x85\x02\x99\x01\xaa\xff\x9a\x02\x99\x01\xae\xff\ +\x85\x02\x99\x01\xb0\xff\xd7\x02\x99\x01\xb5\xff\x85\x02\x99\x01\ +\xbf\xff\xd7\x02\x99\x01\xce\xff\x9a\x02\x99\x01\xd5\xff\x9a\x02\ +\x99\x01\xf2\xff\x9a\x02\x99\x02\x08\xfe\xf6\x02\x99\x02\x0c\xfe\ +\xf6\x02\x99\x02r\xff\x9a\x02\x99\x02s\xff\x9a\x02\x99\x02\ +v\xff\xec\x02\x99\x02\x9f\xff\xd7\x02\x99\x02\xbb\xff\xd7\x02\ +\x99\x02\xca\xff\xd7\x02\x99\x02\xce\xff\x85\x02\x99\x02\xcf\xff\ +\x9a\x02\x99\x02\xd9\xff\x9a\x02\x99\x02\xdb\xff\x9a\x02\x99\x02\ +\xdd\xff\x9a\x02\x99\x02\xe5\xff\xd7\x02\x99\x03\x05\xff\xd7\x02\ +\x99\x03\x07\xff\xd7\x02\x99\x03\x09\xff\xae\x02\x99\x03\x0b\xff\ +\xae\x02\x99\x03\x11\xff\x85\x02\x99\x03\x12\xff\x9a\x02\x99\x03\ +\x1b\xff\x85\x02\x99\x03\x1c\xff\x9a\x02\x9a\x00\x05\xff\xec\x02\ +\x9a\x00\x0a\xff\xec\x02\x9a\x01\xd0\xff\xd7\x02\x9a\x01\xdc\xff\ +\xec\x02\x9a\x01\xdd\xff\xec\x02\x9a\x01\xdf\xff\xd7\x02\x9a\x01\ +\xe1\xff\xec\x02\x9a\x01\xe4\xff\xec\x02\x9a\x01\xf6\xff\xec\x02\ +\x9a\x02\x07\xff\xec\x02\x9a\x02\x0b\xff\xec\x02\x9a\x02\xa0\xff\ +\xd7\x02\x9a\x02\xaa\xff\xec\x02\x9a\x02\xb6\xff\xec\x02\x9a\x02\ +\xbc\xff\xd7\x02\x9a\x02\xbe\xff\xec\x02\x9a\x02\xc0\xff\xec\x02\ +\x9a\x02\xc2\xff\xec\x02\x9a\x02\xcb\xff\xd7\x02\x9a\x02\xd5\xff\ +\xec\x02\x9a\x02\xe6\xff\xd7\x02\x9a\x02\xf8\xff\xec\x02\x9a\x02\ +\xfa\xff\xec\x02\x9a\x02\xfc\xff\xec\x02\x9a\x02\xfe\xff\xec\x02\ +\x9a\x03\x06\xff\xd7\x02\x9a\x03\x08\xff\xd7\x02\x9a\x03\x0e\xff\ +\xec\x02\x9a\x03\x10\xff\xec\x02\x9a\x03\x18\xff\xec\x02\x9b\x00\ +\x0f\xff\x9a\x02\x9b\x00\x10\xff\xd7\x02\x9b\x00\x11\xff\x9a\x02\ +\x9b\x01\x9d\x00)\x02\x9b\x01\x9f\xff\xd7\x02\x9b\x01\xa4\xff\ +\xae\x02\x9b\x01\xa6\x00)\x02\x9b\x01\xaa\xff\x85\x02\x9b\x01\ +\xae\xff\xae\x02\x9b\x01\xb5\xff\xae\x02\x9b\x01\xb8\xff\xd7\x02\ +\x9b\x01\xbb\xff\xd7\x02\x9b\x01\xbc\x00)\x02\x9b\x01\xbe\xff\ +\xc3\x02\x9b\x01\xc4\x00)\x02\x9b\x01\xcc\xff\xc3\x02\x9b\x01\ +\xcd\xff\xc3\x02\x9b\x01\xce\xff\x9a\x02\x9b\x01\xcf\xff\xae\x02\ +\x9b\x01\xd0\xff\xd7\x02\x9b\x01\xd1\xff\xd7\x02\x9b\x01\xd2\xff\ +\xc3\x02\x9b\x01\xd3\xff\xc3\x02\x9b\x01\xd4\xff\xc3\x02\x9b\x01\ +\xd5\xff\x9a\x02\x9b\x01\xd6\xff\xc3\x02\x9b\x01\xd7\xff\xc3\x02\ +\x9b\x01\xd8\xff\xae\x02\x9b\x01\xd9\xff\xc3\x02\x9b\x01\xda\xff\ +\xc3\x02\x9b\x01\xdb\xff\xae\x02\x9b\x01\xde\xff\xae\x02\x9b\x01\ +\xdf\xff\xd7\x02\x9b\x01\xe0\xff\xc3\x02\x9b\x01\xe1\xff\x9a\x02\ +\x9b\x01\xe2\xff\xc3\x02\x9b\x01\xe3\xff\xc3\x02\x9b\x01\xe5\xff\ +\xc3\x02\x9b\x01\xe6\xff\xc3\x02\x9b\x01\xe7\xff\xd7\x02\x9b\x01\ +\xe8\xff\xc3\x02\x9b\x01\xea\xff\xae\x02\x9b\x01\xeb\x00)\x02\ +\x9b\x01\xec\xff\xc3\x02\x9b\x01\xed\xff\xae\x02\x9b\x01\xee\xff\ +\xc3\x02\x9b\x01\xf2\xff\x9a\x02\x9b\x01\xf3\xff\xc3\x02\x9b\x01\ +\xf4\x00)\x02\x9b\x01\xf5\xff\xc3\x02\x9b\x01\xf7\xff\xc3\x02\ +\x9b\x01\xf9\xff\xc3\x02\x9b\x02\x02\xff\xd7\x02\x9b\x02\x03\xff\ +\xd7\x02\x9b\x02\x04\xff\xd7\x02\x9b\x02\x08\xff\x9a\x02\x9b\x02\ +\x0c\xff\x9a\x02\x9b\x02j\xff\xae\x02\x9b\x02k\xff\xc3\x02\ +\x9b\x02l\xff\xd7\x02\x9b\x02q\xff\xc3\x02\x9b\x02r\xff\ +\x85\x02\x9b\x02s\xff\x9a\x02\x9b\x02u\xff\xc3\x02\x9b\x02\ +w\xff\xd7\x02\x9b\x02y\xff\xc3\x02\x9b\x02}\xff\xc3\x02\ +\x9b\x02~\xff\xd7\x02\x9b\x02\x7f\xff\xae\x02\x9b\x02\x84\xff\ +\xd7\x02\x9b\x02\x85\xff\xae\x02\x9b\x02\x86\xff\xd7\x02\x9b\x02\ +\x87\xff\xae\x02\x9b\x02\x88\xff\xd7\x02\x9b\x02\x89\xff\xae\x02\ +\x9b\x02\x8a\xff\xd7\x02\x9b\x02\x8c\xff\xd7\x02\x9b\x02\x8d\xff\ +\xae\x02\x9b\x02\x96\xff\xc3\x02\x9b\x02\x98\x00)\x02\x9b\x02\ +\x9a\xff\xc3\x02\x9b\x02\x9e\xff\xc3\x02\x9b\x02\xa0\xff\xd7\x02\ +\x9b\x02\xa2\xff\xd7\x02\x9b\x02\xa4\xff\xc3\x02\x9b\x02\xa6\xff\ +\xc3\x02\x9b\x02\xa8\x00)\x02\x9b\x02\xa9\x00)\x02\x9b\x02\ +\xac\xff\xc3\x02\x9b\x02\xae\xff\xc3\x02\x9b\x02\xb0\xff\xc3\x02\ +\x9b\x02\xb1\xff\xd7\x02\x9b\x02\xb2\xff\xae\x02\x9b\x02\xb3\xff\ +\xd7\x02\x9b\x02\xb4\xff\xae\x02\x9b\x02\xb5\x00)\x02\x9b\x02\ +\xbc\xff\xd7\x02\x9b\x02\xbd\x00)\x02\x9b\x02\xc0\xff\x9a\x02\ +\x9b\x02\xc2\xff\x9a\x02\x9b\x02\xc4\xff\xc3\x02\x9b\x02\xc5\xff\ +\xd7\x02\x9b\x02\xc6\xff\xc3\x02\x9b\x02\xc7\xff\xd7\x02\x9b\x02\ +\xc8\xff\xc3\x02\x9b\x02\xcb\xff\xd7\x02\x9b\x02\xcd\xff\xc3\x02\ +\x9b\x02\xce\xff\xae\x02\x9b\x02\xcf\xff\x9a\x02\x9b\x02\xd1\xff\ +\xc3\x02\x9b\x02\xd3\xff\xc3\x02\x9b\x02\xd5\xff\x9a\x02\x9b\x02\ +\xd7\xff\xc3\x02\x9b\x02\xd9\xff\x85\x02\x9b\x02\xdb\xff\x85\x02\ +\x9b\x02\xdd\xff\x85\x02\x9b\x02\xe0\xff\xae\x02\x9b\x02\xe6\xff\ +\xd7\x02\x9b\x02\xe8\xff\xd7\x02\x9b\x02\xec\xff\xc3\x02\x9b\x02\ +\xee\xff\xc3\x02\x9b\x02\xef\xff\xd7\x02\x9b\x02\xf0\xff\xae\x02\ +\x9b\x02\xf1\xff\xd7\x02\x9b\x02\xf2\xff\xae\x02\x9b\x02\xf3\xff\ +\xd7\x02\x9b\x02\xf4\xff\xae\x02\x9b\x02\xf6\xff\xd7\x02\x9b\x02\ +\xfe\xff\x9a\x02\x9b\x03\x00\xff\xc3\x02\x9b\x03\x02\xff\xc3\x02\ +\x9b\x03\x06\xff\xd7\x02\x9b\x03\x08\xff\xd7\x02\x9b\x03\x09\xff\ +\x9a\x02\x9b\x03\x0a\xff\xae\x02\x9b\x03\x0b\xff\x9a\x02\x9b\x03\ +\x0c\xff\xae\x02\x9b\x03\x0e\xff\xd7\x02\x9b\x03\x10\xff\xd7\x02\ +\x9b\x03\x11\xff\xae\x02\x9b\x03\x12\xff\x9a\x02\x9b\x03\x14\xff\ +\xc3\x02\x9b\x03\x15\xff\xd7\x02\x9b\x03\x16\xff\xae\x02\x9b\x03\ +\x17\x00)\x02\x9b\x03\x1a\xff\xae\x02\x9b\x03\x1b\xff\xae\x02\ +\x9b\x03\x1c\xff\x9a\x02\x9c\x00\x0f\xff\xc3\x02\x9c\x00\x11\xff\ +\xc3\x02\x9c\x01\xce\xff\xc3\x02\x9c\x01\xcf\xff\xd7\x02\x9c\x01\ +\xd5\xff\xc3\x02\x9c\x01\xd8\xff\xd7\x02\x9c\x01\xdb\xff\xd7\x02\ +\x9c\x01\xde\xff\xd7\x02\x9c\x01\xea\xff\xd7\x02\x9c\x01\xed\xff\ +\xd7\x02\x9c\x01\xf2\xff\xc3\x02\x9c\x02\x08\xff\xc3\x02\x9c\x02\ +\x0c\xff\xc3\x02\x9c\x02j\xff\xd7\x02\x9c\x02s\xff\xc3\x02\ +\x9c\x02\x7f\xff\xd7\x02\x9c\x02\x85\xff\xd7\x02\x9c\x02\x87\xff\ +\xd7\x02\x9c\x02\x89\xff\xd7\x02\x9c\x02\x8d\xff\xd7\x02\x9c\x02\ +\xb2\xff\xd7\x02\x9c\x02\xb4\xff\xd7\x02\x9c\x02\xcf\xff\xc3\x02\ +\x9c\x02\xe0\xff\xd7\x02\x9c\x02\xf0\xff\xd7\x02\x9c\x02\xf2\xff\ +\xd7\x02\x9c\x02\xf4\xff\xd7\x02\x9c\x03\x0a\xff\xd7\x02\x9c\x03\ +\x0c\xff\xd7\x02\x9c\x03\x12\xff\xc3\x02\x9c\x03\x16\xff\xd7\x02\ +\x9c\x03\x1a\xff\xd7\x02\x9c\x03\x1c\xff\xc3\x02\x9d\x00\x05\xff\ +\xc3\x02\x9d\x00\x0a\xff\xc3\x02\x9d\x01\x9d\xff\xc3\x02\x9d\x01\ +\xa3\x00f\x02\x9d\x01\xa6\xff\xc3\x02\x9d\x01\xbc\xff\xc3\x02\ +\x9d\x01\xc1\xff\xae\x02\x9d\x01\xc4\xff\xc3\x02\x9d\x01\xdc\xff\ +\xd7\x02\x9d\x01\xe1\xff\xd7\x02\x9d\x01\xe4\xff\xd7\x02\x9d\x02\ +\x07\xff\xc3\x02\x9d\x02\x0b\xff\xc3\x02\x9d\x02|\xff\xae\x02\ +\x9d\x02\x80\xff\xc3\x02\x9d\x02\x82\xff\xc3\x02\x9d\x02\xa9\xff\ +\xc3\x02\x9d\x02\xaa\xff\xd7\x02\x9d\x02\xb5\xff\xc3\x02\x9d\x02\ +\xb6\xff\xd7\x02\x9d\x02\xb7\xff\xd7\x02\x9d\x02\xb9\xff\xd7\x02\ +\x9d\x02\xbd\xff\xc3\x02\x9d\x02\xbe\xff\xd7\x02\x9d\x02\xbf\xff\ +\xae\x02\x9d\x02\xc0\xff\xd7\x02\x9d\x02\xc1\xff\xae\x02\x9d\x02\ +\xc2\xff\xd7\x02\x9d\x02\xd4\xff\xae\x02\x9d\x02\xd5\xff\xd7\x02\ +\x9d\x02\xfd\xff\xae\x02\x9d\x02\xfe\xff\xd7\x02\x9d\x03\x0d\xff\ +\xd7\x02\x9d\x03\x0e\xff\xc3\x02\x9d\x03\x0f\xff\xd7\x02\x9d\x03\ +\x10\xff\xc3\x02\x9d\x03\x17\xff\xc3\x02\x9d\x03\x18\xff\xd7\x02\ +\x9e\x00\x05\xff\xc3\x02\x9e\x00\x0a\xff\xc3\x02\x9e\x02\x07\xff\ +\xc3\x02\x9e\x02\x0b\xff\xc3\x02\x9e\x03\x0e\xff\xd7\x02\x9e\x03\ +\x10\xff\xd7\x02\x9f\x01\x9f\xff\xd7\x02\x9f\x01\xa3\x00\xe1\x02\ +\x9f\x01\xb8\xff\xd7\x02\x9f\x01\xbb\xff\xd7\x02\x9f\x01\xbe\xff\ +\xc3\x02\x9f\x01\xdc\xff\xd7\x02\x9f\x01\xe1\xff\xae\x02\x9f\x01\ +\xe4\xff\xd7\x02\x9f\x02l\xff\xd7\x02\x9f\x02{\x00=\x02\ +\x9f\x02}\xff\xec\x02\x9f\x02~\xff\xd7\x02\x9f\x02\x84\xff\ +\xd7\x02\x9f\x02\x86\xff\xd7\x02\x9f\x02\x88\xff\xd7\x02\x9f\x02\ +\x8a\xff\xd7\x02\x9f\x02\x8c\xff\xd7\x02\x9f\x02\xaa\xff\xd7\x02\ +\x9f\x02\xb1\xff\xd7\x02\x9f\x02\xb3\xff\xd7\x02\x9f\x02\xb6\xff\ +\xd7\x02\x9f\x02\xbe\xff\xd7\x02\x9f\x02\xc0\xff\xae\x02\x9f\x02\ +\xc2\xff\xae\x02\x9f\x02\xc5\xff\xc3\x02\x9f\x02\xc6\xff\xd7\x02\ +\x9f\x02\xc7\xff\xc3\x02\x9f\x02\xc8\xff\xd7\x02\x9f\x02\xd5\xff\ +\xae\x02\x9f\x02\xef\xff\xd7\x02\x9f\x02\xf1\xff\xd7\x02\x9f\x02\ +\xf3\xff\xd7\x02\x9f\x02\xfe\xff\xae\x02\x9f\x03\x0e\xff\xd7\x02\ +\x9f\x03\x10\xff\xd7\x02\x9f\x03\x15\xff\xd7\x02\x9f\x03\x18\xff\ +\xd7\x02\xa0\x01\xcf\xff\xec\x02\xa0\x01\xd8\xff\xec\x02\xa0\x01\ +\xdb\xff\xec\x02\xa0\x01\xde\xff\xec\x02\xa0\x01\xe1\xff\xec\x02\ +\xa0\x01\xea\xff\xec\x02\xa0\x01\xed\xff\xec\x02\xa0\x02j\xff\ +\xec\x02\xa0\x02\x7f\xff\xec\x02\xa0\x02\x85\xff\xec\x02\xa0\x02\ +\x87\xff\xec\x02\xa0\x02\x89\xff\xec\x02\xa0\x02\x8d\xff\xec\x02\ +\xa0\x02\xb2\xff\xec\x02\xa0\x02\xb4\xff\xec\x02\xa0\x02\xc0\xff\ +\xec\x02\xa0\x02\xc2\xff\xec\x02\xa0\x02\xd5\xff\xec\x02\xa0\x02\ +\xe0\xff\xec\x02\xa0\x02\xf0\xff\xec\x02\xa0\x02\xf2\xff\xec\x02\ +\xa0\x02\xf4\xff\xec\x02\xa0\x02\xfe\xff\xec\x02\xa0\x03\x0a\xff\ +\xec\x02\xa0\x03\x0c\xff\xec\x02\xa0\x03\x0e\xff\xd7\x02\xa0\x03\ +\x10\xff\xd7\x02\xa0\x03\x16\xff\xec\x02\xa0\x03\x1a\xff\xec\x02\ +\xa1\x00\x0f\xff\xae\x02\xa1\x00\x11\xff\xae\x02\xa1\x02\x08\xff\ +\xae\x02\xa1\x02\x0c\xff\xae\x02\xa1\x02\x80\xff\xec\x02\xa1\x02\ +\x82\xff\xec\x02\xa1\x02\xb7\xff\xec\x02\xa1\x02\xb9\xff\xec\x02\ +\xa1\x03\x0d\xff\xd7\x02\xa1\x03\x0f\xff\xd7\x02\xa2\x01\xe9\x00\ +)\x02\xa3\x01\x9f\xff\xd7\x02\xa3\x01\xa3\x00\xe1\x02\xa3\x01\ +\xb8\xff\xd7\x02\xa3\x01\xbb\xff\xd7\x02\xa3\x01\xbe\xff\xc3\x02\ +\xa3\x01\xdc\xff\xd7\x02\xa3\x01\xe1\xff\xae\x02\xa3\x01\xe4\xff\ +\xd7\x02\xa3\x02l\xff\xd7\x02\xa3\x02{\x00=\x02\xa3\x02\ +}\xff\xec\x02\xa3\x02~\xff\xd7\x02\xa3\x02\x84\xff\xd7\x02\ +\xa3\x02\x86\xff\xd7\x02\xa3\x02\x88\xff\xd7\x02\xa3\x02\x8a\xff\ +\xd7\x02\xa3\x02\x8c\xff\xd7\x02\xa3\x02\xaa\xff\xd7\x02\xa3\x02\ +\xb1\xff\xd7\x02\xa3\x02\xb3\xff\xd7\x02\xa3\x02\xb6\xff\xd7\x02\ +\xa3\x02\xbe\xff\xd7\x02\xa3\x02\xc0\xff\xae\x02\xa3\x02\xc2\xff\ +\xae\x02\xa3\x02\xc5\xff\xc3\x02\xa3\x02\xc6\xff\xd7\x02\xa3\x02\ +\xc7\xff\xc3\x02\xa3\x02\xc8\xff\xd7\x02\xa3\x02\xd5\xff\xae\x02\ +\xa3\x02\xef\xff\xd7\x02\xa3\x02\xf1\xff\xd7\x02\xa3\x02\xf3\xff\ +\xd7\x02\xa3\x02\xfe\xff\xae\x02\xa3\x03\x0e\xff\xd7\x02\xa3\x03\ +\x10\xff\xd7\x02\xa3\x03\x15\xff\xd7\x02\xa3\x03\x18\xff\xd7\x02\ +\xa4\x01\xcf\xff\xec\x02\xa4\x01\xd8\xff\xec\x02\xa4\x01\xdb\xff\ +\xec\x02\xa4\x01\xde\xff\xec\x02\xa4\x01\xe1\xff\xec\x02\xa4\x01\ +\xea\xff\xec\x02\xa4\x01\xed\xff\xec\x02\xa4\x02j\xff\xec\x02\ +\xa4\x02\x7f\xff\xec\x02\xa4\x02\x85\xff\xec\x02\xa4\x02\x87\xff\ +\xec\x02\xa4\x02\x89\xff\xec\x02\xa4\x02\x8d\xff\xec\x02\xa4\x02\ +\xb2\xff\xec\x02\xa4\x02\xb4\xff\xec\x02\xa4\x02\xc0\xff\xec\x02\ +\xa4\x02\xc2\xff\xec\x02\xa4\x02\xd5\xff\xec\x02\xa4\x02\xe0\xff\ +\xec\x02\xa4\x02\xf0\xff\xec\x02\xa4\x02\xf2\xff\xec\x02\xa4\x02\ +\xf4\xff\xec\x02\xa4\x02\xfe\xff\xec\x02\xa4\x03\x0a\xff\xec\x02\ +\xa4\x03\x0c\xff\xec\x02\xa4\x03\x0e\xff\xd7\x02\xa4\x03\x10\xff\ +\xd7\x02\xa4\x03\x16\xff\xec\x02\xa4\x03\x1a\xff\xec\x02\xa5\x01\ +\x9f\xff\xd7\x02\xa5\x01\xb8\xff\xd7\x02\xa5\x01\xbb\xff\xd7\x02\ +\xa5\x01\xbe\xff\xd7\x02\xa5\x01\xc1\xff\xd7\x02\xa5\x01\xe1\xff\ +\xd7\x02\xa5\x02l\xff\xd7\x02\xa5\x02|\xff\xd7\x02\xa5\x02\ +~\xff\xd7\x02\xa5\x02\x84\xff\xd7\x02\xa5\x02\x86\xff\xd7\x02\ +\xa5\x02\x88\xff\xd7\x02\xa5\x02\x8a\xff\xd7\x02\xa5\x02\x8c\xff\ +\xd7\x02\xa5\x02\xb1\xff\xd7\x02\xa5\x02\xb3\xff\xd7\x02\xa5\x02\ +\xbf\xff\xd7\x02\xa5\x02\xc0\xff\xd7\x02\xa5\x02\xc1\xff\xd7\x02\ +\xa5\x02\xc2\xff\xd7\x02\xa5\x02\xc5\xff\x9a\x02\xa5\x02\xc7\xff\ +\x9a\x02\xa5\x02\xd4\xff\xd7\x02\xa5\x02\xd5\xff\xd7\x02\xa5\x02\ +\xef\xff\xd7\x02\xa5\x02\xf1\xff\xd7\x02\xa5\x02\xf3\xff\xd7\x02\ +\xa5\x02\xfd\xff\xd7\x02\xa5\x02\xfe\xff\xd7\x02\xa5\x03\x09\xff\ +\xd7\x02\xa5\x03\x0b\xff\xd7\x02\xa5\x03\x0e\xff\xd7\x02\xa5\x03\ +\x10\xff\xd7\x02\xa5\x03\x15\xff\xd7\x02\xa5\x03\x19\xff\xec\x02\ +\xa6\x01\xcf\xff\xd7\x02\xa6\x01\xd8\xff\xd7\x02\xa6\x01\xdb\xff\ +\xd7\x02\xa6\x01\xde\xff\xd7\x02\xa6\x01\xe1\xff\xd7\x02\xa6\x01\ +\xea\xff\xd7\x02\xa6\x01\xed\xff\xd7\x02\xa6\x02j\xff\xd7\x02\ +\xa6\x02\x7f\xff\xd7\x02\xa6\x02\x85\xff\xd7\x02\xa6\x02\x87\xff\ +\xd7\x02\xa6\x02\x89\xff\xd7\x02\xa6\x02\x8d\xff\xd7\x02\xa6\x02\ +\xb2\xff\xd7\x02\xa6\x02\xb4\xff\xd7\x02\xa6\x02\xc0\xff\xd7\x02\ +\xa6\x02\xc2\xff\xd7\x02\xa6\x02\xc6\xff\xd7\x02\xa6\x02\xc8\xff\ +\xd7\x02\xa6\x02\xd5\xff\xd7\x02\xa6\x02\xe0\xff\xd7\x02\xa6\x02\ +\xf0\xff\xd7\x02\xa6\x02\xf2\xff\xd7\x02\xa6\x02\xf4\xff\xd7\x02\ +\xa6\x02\xfe\xff\xd7\x02\xa6\x03\x0a\xff\xd7\x02\xa6\x03\x0c\xff\ +\xd7\x02\xa6\x03\x16\xff\xd7\x02\xa6\x03\x1a\xff\xd7\x02\xa7\x01\ +\x9f\xff\xd7\x02\xa7\x01\xb8\xff\xd7\x02\xa7\x01\xbb\xff\xd7\x02\ +\xa7\x01\xbe\xff\xd7\x02\xa7\x01\xc1\xff\xd7\x02\xa7\x01\xe1\xff\ +\xd7\x02\xa7\x02l\xff\xd7\x02\xa7\x02|\xff\xd7\x02\xa7\x02\ +~\xff\xd7\x02\xa7\x02\x84\xff\xd7\x02\xa7\x02\x86\xff\xd7\x02\ +\xa7\x02\x88\xff\xd7\x02\xa7\x02\x8a\xff\xd7\x02\xa7\x02\x8c\xff\ +\xd7\x02\xa7\x02\xb1\xff\xd7\x02\xa7\x02\xb3\xff\xd7\x02\xa7\x02\ +\xbf\xff\xd7\x02\xa7\x02\xc0\xff\xd7\x02\xa7\x02\xc1\xff\xd7\x02\ +\xa7\x02\xc2\xff\xd7\x02\xa7\x02\xc5\xff\x9a\x02\xa7\x02\xc7\xff\ +\x9a\x02\xa7\x02\xd4\xff\xd7\x02\xa7\x02\xd5\xff\xd7\x02\xa7\x02\ +\xef\xff\xd7\x02\xa7\x02\xf1\xff\xd7\x02\xa7\x02\xf3\xff\xd7\x02\ +\xa7\x02\xfd\xff\xd7\x02\xa7\x02\xfe\xff\xd7\x02\xa7\x03\x09\xff\ +\xd7\x02\xa7\x03\x0b\xff\xd7\x02\xa7\x03\x0e\xff\xd7\x02\xa7\x03\ +\x10\xff\xd7\x02\xa7\x03\x15\xff\xd7\x02\xa7\x03\x19\xff\xec\x02\ +\xa8\x01\xcf\xff\xd7\x02\xa8\x01\xd8\xff\xd7\x02\xa8\x01\xdb\xff\ +\xd7\x02\xa8\x01\xde\xff\xd7\x02\xa8\x01\xe1\xff\xd7\x02\xa8\x01\ +\xea\xff\xd7\x02\xa8\x01\xed\xff\xd7\x02\xa8\x02j\xff\xd7\x02\ +\xa8\x02\x7f\xff\xd7\x02\xa8\x02\x85\xff\xd7\x02\xa8\x02\x87\xff\ +\xd7\x02\xa8\x02\x89\xff\xd7\x02\xa8\x02\x8d\xff\xd7\x02\xa8\x02\ +\xb2\xff\xd7\x02\xa8\x02\xb4\xff\xd7\x02\xa8\x02\xc0\xff\xd7\x02\ +\xa8\x02\xc2\xff\xd7\x02\xa8\x02\xc6\xff\xd7\x02\xa8\x02\xc8\xff\ +\xd7\x02\xa8\x02\xd5\xff\xd7\x02\xa8\x02\xe0\xff\xd7\x02\xa8\x02\ +\xf0\xff\xd7\x02\xa8\x02\xf2\xff\xd7\x02\xa8\x02\xf4\xff\xd7\x02\ +\xa8\x02\xfe\xff\xd7\x02\xa8\x03\x0a\xff\xd7\x02\xa8\x03\x0c\xff\ +\xd7\x02\xa8\x03\x16\xff\xd7\x02\xa8\x03\x1a\xff\xd7\x02\xa9\x01\ +\x9f\xff\xd7\x02\xa9\x01\xb8\xff\xd7\x02\xa9\x01\xbb\xff\xd7\x02\ +\xa9\x01\xbe\xff\xd7\x02\xa9\x01\xc1\xff\xd7\x02\xa9\x01\xe1\xff\ +\xd7\x02\xa9\x02l\xff\xd7\x02\xa9\x02|\xff\xd7\x02\xa9\x02\ +~\xff\xd7\x02\xa9\x02\x84\xff\xd7\x02\xa9\x02\x86\xff\xd7\x02\ +\xa9\x02\x88\xff\xd7\x02\xa9\x02\x8a\xff\xd7\x02\xa9\x02\x8c\xff\ +\xd7\x02\xa9\x02\xb1\xff\xd7\x02\xa9\x02\xb3\xff\xd7\x02\xa9\x02\ +\xbf\xff\xd7\x02\xa9\x02\xc0\xff\xd7\x02\xa9\x02\xc1\xff\xd7\x02\ +\xa9\x02\xc2\xff\xd7\x02\xa9\x02\xc5\xff\x9a\x02\xa9\x02\xc7\xff\ +\x9a\x02\xa9\x02\xd4\xff\xd7\x02\xa9\x02\xd5\xff\xd7\x02\xa9\x02\ +\xef\xff\xd7\x02\xa9\x02\xf1\xff\xd7\x02\xa9\x02\xf3\xff\xd7\x02\ +\xa9\x02\xfd\xff\xd7\x02\xa9\x02\xfe\xff\xd7\x02\xa9\x03\x09\xff\ +\xd7\x02\xa9\x03\x0b\xff\xd7\x02\xa9\x03\x0e\xff\xd7\x02\xa9\x03\ +\x10\xff\xd7\x02\xa9\x03\x15\xff\xd7\x02\xa9\x03\x19\xff\xec\x02\ +\xaa\x01\xcf\xff\xd7\x02\xaa\x01\xd8\xff\xd7\x02\xaa\x01\xdb\xff\ +\xd7\x02\xaa\x01\xde\xff\xd7\x02\xaa\x01\xe1\xff\xd7\x02\xaa\x01\ +\xea\xff\xd7\x02\xaa\x01\xed\xff\xd7\x02\xaa\x02j\xff\xd7\x02\ +\xaa\x02\x7f\xff\xd7\x02\xaa\x02\x85\xff\xd7\x02\xaa\x02\x87\xff\ +\xd7\x02\xaa\x02\x89\xff\xd7\x02\xaa\x02\x8d\xff\xd7\x02\xaa\x02\ +\xb2\xff\xd7\x02\xaa\x02\xb4\xff\xd7\x02\xaa\x02\xc0\xff\xd7\x02\ +\xaa\x02\xc2\xff\xd7\x02\xaa\x02\xc6\xff\xd7\x02\xaa\x02\xc8\xff\ +\xd7\x02\xaa\x02\xd5\xff\xd7\x02\xaa\x02\xe0\xff\xd7\x02\xaa\x02\ +\xf0\xff\xd7\x02\xaa\x02\xf2\xff\xd7\x02\xaa\x02\xf4\xff\xd7\x02\ +\xaa\x02\xfe\xff\xd7\x02\xaa\x03\x0a\xff\xd7\x02\xaa\x03\x0c\xff\ +\xd7\x02\xaa\x03\x16\xff\xd7\x02\xaa\x03\x1a\xff\xd7\x02\xab\x01\ +\xa3\x00\xe1\x02\xab\x02\xea\x00)\x02\xab\x03\x0e\xff\xd7\x02\ +\xab\x03\x10\xff\xd7\x02\xac\x00\x05\xff\xec\x02\xac\x00\x0a\xff\ +\xec\x02\xac\x02\x07\xff\xec\x02\xac\x02\x0b\xff\xec\x02\xad\x00\ +\x0f\xff\x9a\x02\xad\x00\x10\xff\xd7\x02\xad\x00\x11\xff\x9a\x02\ +\xad\x01\x9d\x00)\x02\xad\x01\x9f\xff\xd7\x02\xad\x01\xa4\xff\ +\xae\x02\xad\x01\xa6\x00)\x02\xad\x01\xaa\xff\x85\x02\xad\x01\ +\xae\xff\xae\x02\xad\x01\xb5\xff\xae\x02\xad\x01\xb8\xff\xd7\x02\ +\xad\x01\xbb\xff\xd7\x02\xad\x01\xbc\x00)\x02\xad\x01\xbe\xff\ +\xc3\x02\xad\x01\xc4\x00)\x02\xad\x01\xcc\xff\xc3\x02\xad\x01\ +\xcd\xff\xc3\x02\xad\x01\xce\xff\x9a\x02\xad\x01\xcf\xff\xae\x02\ +\xad\x01\xd0\xff\xd7\x02\xad\x01\xd1\xff\xd7\x02\xad\x01\xd2\xff\ +\xc3\x02\xad\x01\xd3\xff\xc3\x02\xad\x01\xd4\xff\xc3\x02\xad\x01\ +\xd5\xff\x9a\x02\xad\x01\xd6\xff\xc3\x02\xad\x01\xd7\xff\xc3\x02\ +\xad\x01\xd8\xff\xae\x02\xad\x01\xd9\xff\xc3\x02\xad\x01\xda\xff\ +\xc3\x02\xad\x01\xdb\xff\xae\x02\xad\x01\xde\xff\xae\x02\xad\x01\ +\xdf\xff\xd7\x02\xad\x01\xe0\xff\xc3\x02\xad\x01\xe1\xff\x9a\x02\ +\xad\x01\xe2\xff\xc3\x02\xad\x01\xe3\xff\xc3\x02\xad\x01\xe5\xff\ +\xc3\x02\xad\x01\xe6\xff\xc3\x02\xad\x01\xe7\xff\xd7\x02\xad\x01\ +\xe8\xff\xc3\x02\xad\x01\xea\xff\xae\x02\xad\x01\xeb\x00)\x02\ +\xad\x01\xec\xff\xc3\x02\xad\x01\xed\xff\xae\x02\xad\x01\xee\xff\ +\xc3\x02\xad\x01\xf2\xff\x9a\x02\xad\x01\xf3\xff\xc3\x02\xad\x01\ +\xf4\x00)\x02\xad\x01\xf5\xff\xc3\x02\xad\x01\xf7\xff\xc3\x02\ +\xad\x01\xf9\xff\xc3\x02\xad\x02\x02\xff\xd7\x02\xad\x02\x03\xff\ +\xd7\x02\xad\x02\x04\xff\xd7\x02\xad\x02\x08\xff\x9a\x02\xad\x02\ +\x0c\xff\x9a\x02\xad\x02j\xff\xae\x02\xad\x02k\xff\xc3\x02\ +\xad\x02l\xff\xd7\x02\xad\x02q\xff\xc3\x02\xad\x02r\xff\ +\x85\x02\xad\x02s\xff\x9a\x02\xad\x02u\xff\xc3\x02\xad\x02\ +w\xff\xd7\x02\xad\x02y\xff\xc3\x02\xad\x02}\xff\xc3\x02\ +\xad\x02~\xff\xd7\x02\xad\x02\x7f\xff\xae\x02\xad\x02\x84\xff\ +\xd7\x02\xad\x02\x85\xff\xae\x02\xad\x02\x86\xff\xd7\x02\xad\x02\ +\x87\xff\xae\x02\xad\x02\x88\xff\xd7\x02\xad\x02\x89\xff\xae\x02\ +\xad\x02\x8a\xff\xd7\x02\xad\x02\x8c\xff\xd7\x02\xad\x02\x8d\xff\ +\xae\x02\xad\x02\x96\xff\xc3\x02\xad\x02\x98\x00)\x02\xad\x02\ +\x9a\xff\xc3\x02\xad\x02\x9e\xff\xc3\x02\xad\x02\xa0\xff\xd7\x02\ +\xad\x02\xa2\xff\xd7\x02\xad\x02\xa4\xff\xc3\x02\xad\x02\xa6\xff\ +\xc3\x02\xad\x02\xa8\x00)\x02\xad\x02\xa9\x00)\x02\xad\x02\ +\xac\xff\xc3\x02\xad\x02\xae\xff\xc3\x02\xad\x02\xb0\xff\xc3\x02\ +\xad\x02\xb1\xff\xd7\x02\xad\x02\xb2\xff\xae\x02\xad\x02\xb3\xff\ +\xd7\x02\xad\x02\xb4\xff\xae\x02\xad\x02\xb5\x00)\x02\xad\x02\ +\xbc\xff\xd7\x02\xad\x02\xbd\x00)\x02\xad\x02\xc0\xff\x9a\x02\ +\xad\x02\xc2\xff\x9a\x02\xad\x02\xc4\xff\xc3\x02\xad\x02\xc5\xff\ +\xd7\x02\xad\x02\xc6\xff\xc3\x02\xad\x02\xc7\xff\xd7\x02\xad\x02\ +\xc8\xff\xc3\x02\xad\x02\xcb\xff\xd7\x02\xad\x02\xcd\xff\xc3\x02\ +\xad\x02\xce\xff\xae\x02\xad\x02\xcf\xff\x9a\x02\xad\x02\xd1\xff\ +\xc3\x02\xad\x02\xd3\xff\xc3\x02\xad\x02\xd5\xff\x9a\x02\xad\x02\ +\xd7\xff\xc3\x02\xad\x02\xd9\xff\x85\x02\xad\x02\xdb\xff\x85\x02\ +\xad\x02\xdd\xff\x85\x02\xad\x02\xe0\xff\xae\x02\xad\x02\xe6\xff\ +\xd7\x02\xad\x02\xe8\xff\xd7\x02\xad\x02\xec\xff\xc3\x02\xad\x02\ +\xee\xff\xc3\x02\xad\x02\xef\xff\xd7\x02\xad\x02\xf0\xff\xae\x02\ +\xad\x02\xf1\xff\xd7\x02\xad\x02\xf2\xff\xae\x02\xad\x02\xf3\xff\ +\xd7\x02\xad\x02\xf4\xff\xae\x02\xad\x02\xf6\xff\xd7\x02\xad\x02\ +\xfe\xff\x9a\x02\xad\x03\x00\xff\xc3\x02\xad\x03\x02\xff\xc3\x02\ +\xad\x03\x06\xff\xd7\x02\xad\x03\x08\xff\xd7\x02\xad\x03\x09\xff\ +\x9a\x02\xad\x03\x0a\xff\xae\x02\xad\x03\x0b\xff\x9a\x02\xad\x03\ +\x0c\xff\xae\x02\xad\x03\x0e\xff\xd7\x02\xad\x03\x10\xff\xd7\x02\ +\xad\x03\x11\xff\xae\x02\xad\x03\x12\xff\x9a\x02\xad\x03\x14\xff\ +\xc3\x02\xad\x03\x15\xff\xd7\x02\xad\x03\x16\xff\xae\x02\xad\x03\ +\x17\x00)\x02\xad\x03\x1a\xff\xae\x02\xad\x03\x1b\xff\xae\x02\ +\xad\x03\x1c\xff\x9a\x02\xae\x00\x0f\xff\x9a\x02\xae\x00\x10\xff\ +\xd7\x02\xae\x00\x11\xff\x9a\x02\xae\x01\xce\xff\xc3\x02\xae\x01\ +\xcf\xff\xec\x02\xae\x01\xd5\xff\xc3\x02\xae\x01\xd8\xff\xec\x02\ +\xae\x01\xdb\xff\xec\x02\xae\x01\xde\xff\xec\x02\xae\x01\xea\xff\ +\xec\x02\xae\x01\xed\xff\xec\x02\xae\x01\xf2\xff\xc3\x02\xae\x02\ +\x02\xff\xd7\x02\xae\x02\x03\xff\xd7\x02\xae\x02\x04\xff\xd7\x02\ +\xae\x02\x08\xff\x9a\x02\xae\x02\x0c\xff\x9a\x02\xae\x02j\xff\ +\xec\x02\xae\x02s\xff\xc3\x02\xae\x02\x7f\xff\xec\x02\xae\x02\ +\x85\xff\xec\x02\xae\x02\x87\xff\xec\x02\xae\x02\x89\xff\xec\x02\ +\xae\x02\x8d\xff\xec\x02\xae\x02\xb2\xff\xec\x02\xae\x02\xb4\xff\ +\xec\x02\xae\x02\xcf\xff\xc3\x02\xae\x02\xe0\xff\xec\x02\xae\x02\ +\xf0\xff\xec\x02\xae\x02\xf2\xff\xec\x02\xae\x02\xf4\xff\xec\x02\ +\xae\x03\x0a\xff\xec\x02\xae\x03\x0c\xff\xec\x02\xae\x03\x12\xff\ +\xc3\x02\xae\x03\x16\xff\xec\x02\xae\x03\x1a\xff\xec\x02\xae\x03\ +\x1c\xff\xc3\x02\xaf\x00\x05\xff\x5c\x02\xaf\x00\x0a\xff\x5c\x02\ +\xaf\x01\x9d\xff\x9a\x02\xaf\x01\xa3\x00f\x02\xaf\x01\xa6\xff\ +\x9a\x02\xaf\x01\xbc\xffH\x02\xaf\x01\xc1\xff\x85\x02\xaf\x01\ +\xc4\xff\x9a\x02\xaf\x01\xdc\xff\xae\x02\xaf\x01\xe1\xff\xd7\x02\ +\xaf\x01\xe4\xff\xae\x02\xaf\x02\x07\xff\x5c\x02\xaf\x02\x0b\xff\ +\x5c\x02\xaf\x02|\xff\x85\x02\xaf\x02\x80\xffq\x02\xaf\x02\ +\x82\xffq\x02\xaf\x02\xa9\xff\x9a\x02\xaf\x02\xaa\xff\xae\x02\ +\xaf\x02\xb5\xffH\x02\xaf\x02\xb6\xff\xae\x02\xaf\x02\xb7\xff\ +\x9a\x02\xaf\x02\xb9\xff\x9a\x02\xaf\x02\xbd\xff\x9a\x02\xaf\x02\ +\xbe\xff\xae\x02\xaf\x02\xbf\xff\x85\x02\xaf\x02\xc0\xff\xd7\x02\ +\xaf\x02\xc1\xff\x85\x02\xaf\x02\xc2\xff\xd7\x02\xaf\x02\xc5\xff\ +\xc3\x02\xaf\x02\xc6\xff\xd7\x02\xaf\x02\xc7\xff\xc3\x02\xaf\x02\ +\xc8\xff\xd7\x02\xaf\x02\xd4\xff\x85\x02\xaf\x02\xd5\xff\xd7\x02\ +\xaf\x02\xfd\xff\x85\x02\xaf\x02\xfe\xff\xd7\x02\xaf\x03\x0d\xff\ +H\x02\xaf\x03\x0e\xff\xae\x02\xaf\x03\x0f\xffH\x02\xaf\x03\ +\x10\xff\xae\x02\xaf\x03\x17\xff\x9a\x02\xaf\x03\x18\xff\xae\x02\ +\xb0\x00\x05\xffq\x02\xb0\x00\x0a\xffq\x02\xb0\x01\xdc\xff\ +\x9a\x02\xb0\x01\xe1\xff\xd7\x02\xb0\x01\xe4\xff\x9a\x02\xb0\x02\ +\x07\xffq\x02\xb0\x02\x0b\xffq\x02\xb0\x02m\xff\xd7\x02\ +\xb0\x02\x81\xff\xd7\x02\xb0\x02\x83\xff\xd7\x02\xb0\x02\x8b\xff\ +\xd7\x02\xb0\x02\xaa\xff\x9a\x02\xb0\x02\xb6\xff\x9a\x02\xb0\x02\ +\xb8\xff\xd7\x02\xb0\x02\xba\xff\xd7\x02\xb0\x02\xbe\xff\x9a\x02\ +\xb0\x02\xc0\xff\xd7\x02\xb0\x02\xc2\xff\xd7\x02\xb0\x02\xc6\xff\ +\xd7\x02\xb0\x02\xc8\xff\xd7\x02\xb0\x02\xd5\xff\xd7\x02\xb0\x02\ +\xfe\xff\xd7\x02\xb0\x03\x0e\xffq\x02\xb0\x03\x10\xffq\x02\ +\xb0\x03\x18\xff\x9a\x02\xb1\x01\x9d\xff\xd7\x02\xb1\x01\xa6\xff\ +\xd7\x02\xb1\x01\xbc\xff\xc3\x02\xb1\x01\xc4\xff\xd7\x02\xb1\x02\ +\x80\xff\xec\x02\xb1\x02\x82\xff\xec\x02\xb1\x02\xa9\xff\xd7\x02\ +\xb1\x02\xb5\xff\xc3\x02\xb1\x02\xb7\xff\xec\x02\xb1\x02\xb9\xff\ +\xec\x02\xb1\x02\xbd\xff\xd7\x02\xb1\x03\x0d\xff\xd7\x02\xb1\x03\ +\x0f\xff\xd7\x02\xb1\x03\x17\xff\xd7\x02\xb2\x00\x05\xff\xec\x02\ +\xb2\x00\x0a\xff\xec\x02\xb2\x01\xd0\xff\xd7\x02\xb2\x01\xdc\xff\ +\xec\x02\xb2\x01\xdd\xff\xec\x02\xb2\x01\xdf\xff\xd7\x02\xb2\x01\ +\xe1\xff\xec\x02\xb2\x01\xe4\xff\xec\x02\xb2\x01\xf6\xff\xec\x02\ +\xb2\x02\x07\xff\xec\x02\xb2\x02\x0b\xff\xec\x02\xb2\x02\xa0\xff\ +\xd7\x02\xb2\x02\xaa\xff\xec\x02\xb2\x02\xb6\xff\xec\x02\xb2\x02\ +\xbc\xff\xd7\x02\xb2\x02\xbe\xff\xec\x02\xb2\x02\xc0\xff\xec\x02\ +\xb2\x02\xc2\xff\xec\x02\xb2\x02\xcb\xff\xd7\x02\xb2\x02\xd5\xff\ +\xec\x02\xb2\x02\xe6\xff\xd7\x02\xb2\x02\xf8\xff\xec\x02\xb2\x02\ +\xfa\xff\xec\x02\xb2\x02\xfc\xff\xec\x02\xb2\x02\xfe\xff\xec\x02\ +\xb2\x03\x06\xff\xd7\x02\xb2\x03\x08\xff\xd7\x02\xb2\x03\x0e\xff\ +\xec\x02\xb2\x03\x10\xff\xec\x02\xb2\x03\x18\xff\xec\x02\xb3\x01\ +\x9f\xff\xd7\x02\xb3\x01\xb8\xff\xd7\x02\xb3\x01\xbb\xff\xd7\x02\ +\xb3\x01\xbe\xff\xd7\x02\xb3\x01\xe1\xff\xd7\x02\xb3\x02l\xff\ +\xd7\x02\xb3\x02~\xff\xd7\x02\xb3\x02\x84\xff\xd7\x02\xb3\x02\ +\x86\xff\xd7\x02\xb3\x02\x88\xff\xd7\x02\xb3\x02\x8a\xff\xd7\x02\ +\xb3\x02\x8c\xff\xd7\x02\xb3\x02\xb1\xff\xd7\x02\xb3\x02\xb3\xff\ +\xd7\x02\xb3\x02\xc0\xff\xd7\x02\xb3\x02\xc2\xff\xd7\x02\xb3\x02\ +\xc5\xff\xd7\x02\xb3\x02\xc7\xff\xd7\x02\xb3\x02\xd5\xff\xd7\x02\ +\xb3\x02\xef\xff\xd7\x02\xb3\x02\xf1\xff\xd7\x02\xb3\x02\xf3\xff\ +\xd7\x02\xb3\x02\xfe\xff\xd7\x02\xb3\x03\x09\xff\xd7\x02\xb3\x03\ +\x0b\xff\xd7\x02\xb3\x03\x0e\xff\xd7\x02\xb3\x03\x10\xff\xd7\x02\ +\xb3\x03\x15\xff\xd7\x02\xb5\x00\x0f\xff\x85\x02\xb5\x00\x10\xff\ +\xae\x02\xb5\x00\x11\xff\x85\x02\xb5\x01\x9f\xff\xd7\x02\xb5\x01\ +\xa4\xff\x9a\x02\xb5\x01\xaa\xffq\x02\xb5\x01\xae\xff\x9a\x02\ +\xb5\x01\xb5\xff\x9a\x02\xb5\x01\xb8\xff\xd7\x02\xb5\x01\xbb\xff\ +\xd7\x02\xb5\x01\xbc\x00)\x02\xb5\x01\xbe\xff\xae\x02\xb5\x01\ +\xcc\xff\x9a\x02\xb5\x01\xcd\xff\x9a\x02\xb5\x01\xce\xff\x85\x02\ +\xb5\x01\xcf\xffq\x02\xb5\x01\xd0\xff\xd7\x02\xb5\x01\xd1\xff\ +\xd7\x02\xb5\x01\xd2\xff\x9a\x02\xb5\x01\xd3\xff\x9a\x02\xb5\x01\ +\xd4\xff\x9a\x02\xb5\x01\xd5\xff\x85\x02\xb5\x01\xd6\xff\x9a\x02\ +\xb5\x01\xd7\xff\x9a\x02\xb5\x01\xd8\xffq\x02\xb5\x01\xd9\xff\ +\x9a\x02\xb5\x01\xda\xff\x9a\x02\xb5\x01\xdb\xffq\x02\xb5\x01\ +\xdc\xff\xae\x02\xb5\x01\xdd\xff\xae\x02\xb5\x01\xde\xffq\x02\ +\xb5\x01\xdf\xff\xd7\x02\xb5\x01\xe0\xff\x9a\x02\xb5\x01\xe1\xff\ +\x9a\x02\xb5\x01\xe2\xff\x9a\x02\xb5\x01\xe3\xff\x9a\x02\xb5\x01\ +\xe4\xff\xae\x02\xb5\x01\xe5\xff\x9a\x02\xb5\x01\xe6\xff\x9a\x02\ +\xb5\x01\xe7\xff\xd7\x02\xb5\x01\xe8\xff\x9a\x02\xb5\x01\xe9\xff\ +\xc3\x02\xb5\x01\xea\xffq\x02\xb5\x01\xec\xff\x9a\x02\xb5\x01\ +\xed\xffq\x02\xb5\x01\xee\xff\x85\x02\xb5\x01\xf2\xff\x85\x02\ +\xb5\x01\xf3\xff\x9a\x02\xb5\x01\xf5\xff\x9a\x02\xb5\x01\xf6\xff\ +\xae\x02\xb5\x01\xf7\xff\x9a\x02\xb5\x01\xf9\xff\x9a\x02\xb5\x02\ +\x02\xff\xae\x02\xb5\x02\x03\xff\xae\x02\xb5\x02\x04\xff\xae\x02\ +\xb5\x02\x08\xff\x85\x02\xb5\x02\x0c\xff\x85\x02\xb5\x02j\xff\ +q\x02\xb5\x02k\xff\x9a\x02\xb5\x02l\xff\xd7\x02\xb5\x02\ +m\xff\xd7\x02\xb5\x02q\xff\x9a\x02\xb5\x02r\xffq\x02\ +\xb5\x02s\xff\x85\x02\xb5\x02u\xff\x9a\x02\xb5\x02w\xff\ +\x9a\x02\xb5\x02y\xff\x9a\x02\xb5\x02}\xff\x9a\x02\xb5\x02\ +~\xff\xd7\x02\xb5\x02\x7f\xffq\x02\xb5\x02\x81\xff\xd7\x02\ +\xb5\x02\x83\xff\xd7\x02\xb5\x02\x84\xff\xd7\x02\xb5\x02\x85\xff\ +q\x02\xb5\x02\x86\xff\xd7\x02\xb5\x02\x87\xffq\x02\xb5\x02\ +\x88\xff\xd7\x02\xb5\x02\x89\xffq\x02\xb5\x02\x8a\xff\xd7\x02\ +\xb5\x02\x8b\xff\xd7\x02\xb5\x02\x8c\xff\xd7\x02\xb5\x02\x8d\xff\ +q\x02\xb5\x02\x96\xff\x9a\x02\xb5\x02\x9a\xff\x9a\x02\xb5\x02\ +\x9e\xff\x9a\x02\xb5\x02\xa0\xff\xd7\x02\xb5\x02\xa2\xff\xd7\x02\ +\xb5\x02\xa4\xff\x9a\x02\xb5\x02\xa6\xff\x9a\x02\xb5\x02\xaa\xff\ +\xae\x02\xb5\x02\xac\xff\x9a\x02\xb5\x02\xae\xff\x9a\x02\xb5\x02\ +\xb0\xff\x9a\x02\xb5\x02\xb1\xff\xd7\x02\xb5\x02\xb2\xffq\x02\ +\xb5\x02\xb3\xff\xd7\x02\xb5\x02\xb4\xffq\x02\xb5\x02\xb5\x00\ +)\x02\xb5\x02\xb6\xff\xae\x02\xb5\x02\xb8\xff\xae\x02\xb5\x02\ +\xba\xff\xae\x02\xb5\x02\xbc\xff\xd7\x02\xb5\x02\xbe\xff\xae\x02\ +\xb5\x02\xc0\xff\x9a\x02\xb5\x02\xc2\xff\x9a\x02\xb5\x02\xc4\xff\ +\x9a\x02\xb5\x02\xc5\xff\x9a\x02\xb5\x02\xc6\xffq\x02\xb5\x02\ +\xc7\xff\x9a\x02\xb5\x02\xc8\xffq\x02\xb5\x02\xcb\xff\xd7\x02\ +\xb5\x02\xcd\xff\x9a\x02\xb5\x02\xce\xff\x9a\x02\xb5\x02\xcf\xff\ +\x85\x02\xb5\x02\xd1\xff\x9a\x02\xb5\x02\xd3\xff\x9a\x02\xb5\x02\ +\xd5\xff\x9a\x02\xb5\x02\xd7\xff\x9a\x02\xb5\x02\xd9\xffq\x02\ +\xb5\x02\xdb\xffq\x02\xb5\x02\xdd\xffq\x02\xb5\x02\xe0\xff\ +q\x02\xb5\x02\xe6\xff\xd7\x02\xb5\x02\xe8\xff\xd7\x02\xb5\x02\ +\xea\xff\xc3\x02\xb5\x02\xec\xff\x9a\x02\xb5\x02\xee\xff\x9a\x02\ +\xb5\x02\xef\xff\xd7\x02\xb5\x02\xf0\xffq\x02\xb5\x02\xf1\xff\ +\xd7\x02\xb5\x02\xf2\xffq\x02\xb5\x02\xf3\xff\xd7\x02\xb5\x02\ +\xf4\xffq\x02\xb5\x02\xf6\xff\xd7\x02\xb5\x02\xf8\xff\xae\x02\ +\xb5\x02\xfa\xff\xae\x02\xb5\x02\xfc\xff\xae\x02\xb5\x02\xfe\xff\ +\x9a\x02\xb5\x03\x00\xff\x9a\x02\xb5\x03\x02\xff\x9a\x02\xb5\x03\ +\x06\xff\xd7\x02\xb5\x03\x08\xff\xd7\x02\xb5\x03\x09\xffq\x02\ +\xb5\x03\x0a\xffq\x02\xb5\x03\x0b\xffq\x02\xb5\x03\x0c\xff\ +q\x02\xb5\x03\x0e\xff\x9a\x02\xb5\x03\x10\xff\x9a\x02\xb5\x03\ +\x11\xff\x9a\x02\xb5\x03\x12\xff\x85\x02\xb5\x03\x14\xff\x9a\x02\ +\xb5\x03\x15\xff\xd7\x02\xb5\x03\x16\xffq\x02\xb5\x03\x18\xff\ +\xae\x02\xb5\x03\x1a\xffq\x02\xb5\x03\x1b\xff\x9a\x02\xb5\x03\ +\x1c\xff\x85\x02\xb6\x00\x0f\xff\x9a\x02\xb6\x00\x10\xff\xd7\x02\ +\xb6\x00\x11\xff\x9a\x02\xb6\x01\xce\xff\xc3\x02\xb6\x01\xcf\xff\ +\xec\x02\xb6\x01\xd5\xff\xc3\x02\xb6\x01\xd8\xff\xec\x02\xb6\x01\ +\xdb\xff\xec\x02\xb6\x01\xde\xff\xec\x02\xb6\x01\xea\xff\xec\x02\ +\xb6\x01\xed\xff\xec\x02\xb6\x01\xf2\xff\xc3\x02\xb6\x02\x02\xff\ +\xd7\x02\xb6\x02\x03\xff\xd7\x02\xb6\x02\x04\xff\xd7\x02\xb6\x02\ +\x08\xff\x9a\x02\xb6\x02\x0c\xff\x9a\x02\xb6\x02j\xff\xec\x02\ +\xb6\x02s\xff\xc3\x02\xb6\x02\x7f\xff\xec\x02\xb6\x02\x85\xff\ +\xec\x02\xb6\x02\x87\xff\xec\x02\xb6\x02\x89\xff\xec\x02\xb6\x02\ +\x8d\xff\xec\x02\xb6\x02\xb2\xff\xec\x02\xb6\x02\xb4\xff\xec\x02\ +\xb6\x02\xcf\xff\xc3\x02\xb6\x02\xe0\xff\xec\x02\xb6\x02\xf0\xff\ +\xec\x02\xb6\x02\xf2\xff\xec\x02\xb6\x02\xf4\xff\xec\x02\xb6\x03\ +\x0a\xff\xec\x02\xb6\x03\x0c\xff\xec\x02\xb6\x03\x12\xff\xc3\x02\ +\xb6\x03\x16\xff\xec\x02\xb6\x03\x1a\xff\xec\x02\xb6\x03\x1c\xff\ +\xc3\x02\xb7\x00\x0f\xff\x85\x02\xb7\x00\x11\xff\x85\x02\xb7\x01\ +\x9f\xff\xd7\x02\xb7\x01\xa4\xff\xae\x02\xb7\x01\xaa\xff\x85\x02\ +\xb7\x01\xae\xff\xae\x02\xb7\x01\xb5\xff\xae\x02\xb7\x01\xb8\xff\ +\xd7\x02\xb7\x01\xbb\xff\xd7\x02\xb7\x01\xbe\xff\xc3\x02\xb7\x01\ +\xca\xff\xae\x02\xb7\x01\xcc\xff\xc3\x02\xb7\x01\xcd\xff\xc3\x02\ +\xb7\x01\xce\xff\x9a\x02\xb7\x01\xcf\xff\x9a\x02\xb7\x01\xd2\xff\ +\xc3\x02\xb7\x01\xd3\xff\xc3\x02\xb7\x01\xd4\xff\xc3\x02\xb7\x01\ +\xd5\xff\x9a\x02\xb7\x01\xd6\xff\xc3\x02\xb7\x01\xd7\xff\xc3\x02\ +\xb7\x01\xd8\xff\x9a\x02\xb7\x01\xd9\xff\xc3\x02\xb7\x01\xda\xff\ +\xc3\x02\xb7\x01\xdb\xff\x9a\x02\xb7\x01\xde\xff\x9a\x02\xb7\x01\ +\xe0\xff\xc3\x02\xb7\x01\xe1\xff\xae\x02\xb7\x01\xe2\xff\xc3\x02\ +\xb7\x01\xe3\xff\xc3\x02\xb7\x01\xe5\xff\xc3\x02\xb7\x01\xe6\xff\ +\xc3\x02\xb7\x01\xe8\xff\xc3\x02\xb7\x01\xe9\xff\xd7\x02\xb7\x01\ +\xea\xff\x9a\x02\xb7\x01\xeb\x00)\x02\xb7\x01\xec\xff\xc3\x02\ +\xb7\x01\xed\xff\x9a\x02\xb7\x01\xee\xff\xae\x02\xb7\x01\xf2\xff\ +\x9a\x02\xb7\x01\xf3\xff\xc3\x02\xb7\x01\xf4\x00)\x02\xb7\x01\ +\xf5\xff\xc3\x02\xb7\x01\xf7\xff\xc3\x02\xb7\x01\xf9\xff\xc3\x02\ +\xb7\x02\x08\xff\x85\x02\xb7\x02\x0c\xff\x85\x02\xb7\x02j\xff\ +\x9a\x02\xb7\x02k\xff\xc3\x02\xb7\x02l\xff\xd7\x02\xb7\x02\ +q\xff\xc3\x02\xb7\x02r\xff\x85\x02\xb7\x02s\xff\x9a\x02\ +\xb7\x02u\xff\xc3\x02\xb7\x02w\xff\xd7\x02\xb7\x02y\xff\ +\xc3\x02\xb7\x02}\xff\xd7\x02\xb7\x02~\xff\xd7\x02\xb7\x02\ +\x7f\xff\x9a\x02\xb7\x02\x84\xff\xd7\x02\xb7\x02\x85\xff\x9a\x02\ +\xb7\x02\x86\xff\xd7\x02\xb7\x02\x87\xff\x9a\x02\xb7\x02\x88\xff\ +\xd7\x02\xb7\x02\x89\xff\x9a\x02\xb7\x02\x8a\xff\xd7\x02\xb7\x02\ +\x8c\xff\xd7\x02\xb7\x02\x8d\xff\x9a\x02\xb7\x02\x96\xff\xc3\x02\ +\xb7\x02\x98\x00)\x02\xb7\x02\x9a\xff\xc3\x02\xb7\x02\x9e\xff\ +\xc3\x02\xb7\x02\xa4\xff\xc3\x02\xb7\x02\xa6\xff\xc3\x02\xb7\x02\ +\xa8\x00)\x02\xb7\x02\xac\xff\xc3\x02\xb7\x02\xae\xff\xc3\x02\ +\xb7\x02\xb0\xff\xc3\x02\xb7\x02\xb1\xff\xd7\x02\xb7\x02\xb2\xff\ +\x9a\x02\xb7\x02\xb3\xff\xd7\x02\xb7\x02\xb4\xff\x9a\x02\xb7\x02\ +\xc0\xff\xae\x02\xb7\x02\xc2\xff\xae\x02\xb7\x02\xc4\xff\xc3\x02\ +\xb7\x02\xc6\xff\xae\x02\xb7\x02\xc8\xff\xae\x02\xb7\x02\xcd\xff\ +\xc3\x02\xb7\x02\xce\xff\xae\x02\xb7\x02\xcf\xff\x9a\x02\xb7\x02\ +\xd1\xff\xc3\x02\xb7\x02\xd3\xff\xc3\x02\xb7\x02\xd5\xff\xae\x02\ +\xb7\x02\xd7\xff\xc3\x02\xb7\x02\xd9\xff\x85\x02\xb7\x02\xda\xff\ +\xae\x02\xb7\x02\xdb\xff\x85\x02\xb7\x02\xdc\xff\xae\x02\xb7\x02\ +\xdd\xff\x85\x02\xb7\x02\xde\xff\xae\x02\xb7\x02\xe0\xff\x9a\x02\ +\xb7\x02\xe1\xff\xec\x02\xb7\x02\xe2\xff\xae\x02\xb7\x02\xe3\xff\ +\xec\x02\xb7\x02\xe4\xff\xae\x02\xb7\x02\xec\xff\xc3\x02\xb7\x02\ +\xee\xff\xc3\x02\xb7\x02\xef\xff\xd7\x02\xb7\x02\xf0\xff\x9a\x02\ +\xb7\x02\xf1\xff\xd7\x02\xb7\x02\xf2\xff\x9a\x02\xb7\x02\xf3\xff\ +\xd7\x02\xb7\x02\xf4\xff\x9a\x02\xb7\x02\xfe\xff\xae\x02\xb7\x03\ +\x00\xff\xc3\x02\xb7\x03\x02\xff\xc3\x02\xb7\x03\x09\xff\xae\x02\ +\xb7\x03\x0a\xff\x9a\x02\xb7\x03\x0b\xff\xae\x02\xb7\x03\x0c\xff\ +\x9a\x02\xb7\x03\x0e\xff\xd7\x02\xb7\x03\x10\xff\xd7\x02\xb7\x03\ +\x11\xff\xae\x02\xb7\x03\x12\xff\x9a\x02\xb7\x03\x14\xff\xc3\x02\ +\xb7\x03\x15\xff\xd7\x02\xb7\x03\x16\xff\x9a\x02\xb7\x03\x19\xff\ +\xec\x02\xb7\x03\x1a\xff\x9a\x02\xb7\x03\x1b\xff\xae\x02\xb7\x03\ +\x1c\xff\x9a\x02\xb8\x00\x0f\xff\xae\x02\xb8\x00\x11\xff\xae\x02\ +\xb8\x01\xce\xff\xec\x02\xb8\x01\xd5\xff\xec\x02\xb8\x01\xf2\xff\ +\xec\x02\xb8\x02\x08\xff\xae\x02\xb8\x02\x0c\xff\xae\x02\xb8\x02\ +s\xff\xec\x02\xb8\x02\xcf\xff\xec\x02\xb8\x03\x12\xff\xec\x02\ +\xb8\x03\x1c\xff\xec\x02\xb9\x00\x0f\xff\x85\x02\xb9\x00\x11\xff\ +\x85\x02\xb9\x01\x9f\xff\xd7\x02\xb9\x01\xa4\xff\xae\x02\xb9\x01\ +\xaa\xff\x85\x02\xb9\x01\xae\xff\xae\x02\xb9\x01\xb5\xff\xae\x02\ +\xb9\x01\xb8\xff\xd7\x02\xb9\x01\xbb\xff\xd7\x02\xb9\x01\xbe\xff\ +\xc3\x02\xb9\x01\xca\xff\xae\x02\xb9\x01\xcc\xff\xc3\x02\xb9\x01\ +\xcd\xff\xc3\x02\xb9\x01\xce\xff\x9a\x02\xb9\x01\xcf\xff\x9a\x02\ +\xb9\x01\xd2\xff\xc3\x02\xb9\x01\xd3\xff\xc3\x02\xb9\x01\xd4\xff\ +\xc3\x02\xb9\x01\xd5\xff\x9a\x02\xb9\x01\xd6\xff\xc3\x02\xb9\x01\ +\xd7\xff\xc3\x02\xb9\x01\xd8\xff\x9a\x02\xb9\x01\xd9\xff\xc3\x02\ +\xb9\x01\xda\xff\xc3\x02\xb9\x01\xdb\xff\x9a\x02\xb9\x01\xde\xff\ +\x9a\x02\xb9\x01\xe0\xff\xc3\x02\xb9\x01\xe1\xff\xae\x02\xb9\x01\ +\xe2\xff\xc3\x02\xb9\x01\xe3\xff\xc3\x02\xb9\x01\xe5\xff\xc3\x02\ +\xb9\x01\xe6\xff\xc3\x02\xb9\x01\xe8\xff\xc3\x02\xb9\x01\xe9\xff\ +\xd7\x02\xb9\x01\xea\xff\x9a\x02\xb9\x01\xeb\x00)\x02\xb9\x01\ +\xec\xff\xc3\x02\xb9\x01\xed\xff\x9a\x02\xb9\x01\xee\xff\xae\x02\ +\xb9\x01\xf2\xff\x9a\x02\xb9\x01\xf3\xff\xc3\x02\xb9\x01\xf4\x00\ +)\x02\xb9\x01\xf5\xff\xc3\x02\xb9\x01\xf7\xff\xc3\x02\xb9\x01\ +\xf9\xff\xc3\x02\xb9\x02\x08\xff\x85\x02\xb9\x02\x0c\xff\x85\x02\ +\xb9\x02j\xff\x9a\x02\xb9\x02k\xff\xc3\x02\xb9\x02l\xff\ +\xd7\x02\xb9\x02q\xff\xc3\x02\xb9\x02r\xff\x85\x02\xb9\x02\ +s\xff\x9a\x02\xb9\x02u\xff\xc3\x02\xb9\x02w\xff\xd7\x02\ +\xb9\x02y\xff\xc3\x02\xb9\x02}\xff\xd7\x02\xb9\x02~\xff\ +\xd7\x02\xb9\x02\x7f\xff\x9a\x02\xb9\x02\x84\xff\xd7\x02\xb9\x02\ +\x85\xff\x9a\x02\xb9\x02\x86\xff\xd7\x02\xb9\x02\x87\xff\x9a\x02\ +\xb9\x02\x88\xff\xd7\x02\xb9\x02\x89\xff\x9a\x02\xb9\x02\x8a\xff\ +\xd7\x02\xb9\x02\x8c\xff\xd7\x02\xb9\x02\x8d\xff\x9a\x02\xb9\x02\ +\x96\xff\xc3\x02\xb9\x02\x98\x00)\x02\xb9\x02\x9a\xff\xc3\x02\ +\xb9\x02\x9e\xff\xc3\x02\xb9\x02\xa4\xff\xc3\x02\xb9\x02\xa6\xff\ +\xc3\x02\xb9\x02\xa8\x00)\x02\xb9\x02\xac\xff\xc3\x02\xb9\x02\ +\xae\xff\xc3\x02\xb9\x02\xb0\xff\xc3\x02\xb9\x02\xb1\xff\xd7\x02\ +\xb9\x02\xb2\xff\x9a\x02\xb9\x02\xb3\xff\xd7\x02\xb9\x02\xb4\xff\ +\x9a\x02\xb9\x02\xc0\xff\xae\x02\xb9\x02\xc2\xff\xae\x02\xb9\x02\ +\xc4\xff\xc3\x02\xb9\x02\xc6\xff\xae\x02\xb9\x02\xc8\xff\xae\x02\ +\xb9\x02\xcd\xff\xc3\x02\xb9\x02\xce\xff\xae\x02\xb9\x02\xcf\xff\ +\x9a\x02\xb9\x02\xd1\xff\xc3\x02\xb9\x02\xd3\xff\xc3\x02\xb9\x02\ +\xd5\xff\xae\x02\xb9\x02\xd7\xff\xc3\x02\xb9\x02\xd9\xff\x85\x02\ +\xb9\x02\xda\xff\xae\x02\xb9\x02\xdb\xff\x85\x02\xb9\x02\xdc\xff\ +\xae\x02\xb9\x02\xdd\xff\x85\x02\xb9\x02\xde\xff\xae\x02\xb9\x02\ +\xe0\xff\x9a\x02\xb9\x02\xe1\xff\xec\x02\xb9\x02\xe2\xff\xae\x02\ +\xb9\x02\xe3\xff\xec\x02\xb9\x02\xe4\xff\xae\x02\xb9\x02\xec\xff\ +\xc3\x02\xb9\x02\xee\xff\xc3\x02\xb9\x02\xef\xff\xd7\x02\xb9\x02\ +\xf0\xff\x9a\x02\xb9\x02\xf1\xff\xd7\x02\xb9\x02\xf2\xff\x9a\x02\ +\xb9\x02\xf3\xff\xd7\x02\xb9\x02\xf4\xff\x9a\x02\xb9\x02\xfe\xff\ +\xae\x02\xb9\x03\x00\xff\xc3\x02\xb9\x03\x02\xff\xc3\x02\xb9\x03\ +\x09\xff\xae\x02\xb9\x03\x0a\xff\x9a\x02\xb9\x03\x0b\xff\xae\x02\ +\xb9\x03\x0c\xff\x9a\x02\xb9\x03\x0e\xff\xd7\x02\xb9\x03\x10\xff\ +\xd7\x02\xb9\x03\x11\xff\xae\x02\xb9\x03\x12\xff\x9a\x02\xb9\x03\ +\x14\xff\xc3\x02\xb9\x03\x15\xff\xd7\x02\xb9\x03\x16\xff\x9a\x02\ +\xb9\x03\x19\xff\xec\x02\xb9\x03\x1a\xff\x9a\x02\xb9\x03\x1b\xff\ +\xae\x02\xb9\x03\x1c\xff\x9a\x02\xba\x00\x0f\xff\xae\x02\xba\x00\ +\x11\xff\xae\x02\xba\x01\xce\xff\xec\x02\xba\x01\xd5\xff\xec\x02\ +\xba\x01\xf2\xff\xec\x02\xba\x02\x08\xff\xae\x02\xba\x02\x0c\xff\ +\xae\x02\xba\x02s\xff\xec\x02\xba\x02\xcf\xff\xec\x02\xba\x03\ +\x12\xff\xec\x02\xba\x03\x1c\xff\xec\x02\xbb\x01\x9f\xff\xd7\x02\ +\xbb\x01\xa3\x00\xe1\x02\xbb\x01\xb8\xff\xd7\x02\xbb\x01\xbb\xff\ +\xd7\x02\xbb\x01\xbe\xff\xc3\x02\xbb\x01\xdc\xff\xd7\x02\xbb\x01\ +\xe1\xff\xae\x02\xbb\x01\xe4\xff\xd7\x02\xbb\x02l\xff\xd7\x02\ +\xbb\x02{\x00=\x02\xbb\x02}\xff\xec\x02\xbb\x02~\xff\ +\xd7\x02\xbb\x02\x84\xff\xd7\x02\xbb\x02\x86\xff\xd7\x02\xbb\x02\ +\x88\xff\xd7\x02\xbb\x02\x8a\xff\xd7\x02\xbb\x02\x8c\xff\xd7\x02\ +\xbb\x02\xaa\xff\xd7\x02\xbb\x02\xb1\xff\xd7\x02\xbb\x02\xb3\xff\ +\xd7\x02\xbb\x02\xb6\xff\xd7\x02\xbb\x02\xbe\xff\xd7\x02\xbb\x02\ +\xc0\xff\xae\x02\xbb\x02\xc2\xff\xae\x02\xbb\x02\xc5\xff\xc3\x02\ +\xbb\x02\xc6\xff\xd7\x02\xbb\x02\xc7\xff\xc3\x02\xbb\x02\xc8\xff\ +\xd7\x02\xbb\x02\xd5\xff\xae\x02\xbb\x02\xef\xff\xd7\x02\xbb\x02\ +\xf1\xff\xd7\x02\xbb\x02\xf3\xff\xd7\x02\xbb\x02\xfe\xff\xae\x02\ +\xbb\x03\x0e\xff\xd7\x02\xbb\x03\x10\xff\xd7\x02\xbb\x03\x15\xff\ +\xd7\x02\xbb\x03\x18\xff\xd7\x02\xbc\x01\xcf\xff\xec\x02\xbc\x01\ +\xd8\xff\xec\x02\xbc\x01\xdb\xff\xec\x02\xbc\x01\xde\xff\xec\x02\ +\xbc\x01\xe1\xff\xec\x02\xbc\x01\xea\xff\xec\x02\xbc\x01\xed\xff\ +\xec\x02\xbc\x02j\xff\xec\x02\xbc\x02\x7f\xff\xec\x02\xbc\x02\ +\x85\xff\xec\x02\xbc\x02\x87\xff\xec\x02\xbc\x02\x89\xff\xec\x02\ +\xbc\x02\x8d\xff\xec\x02\xbc\x02\xb2\xff\xec\x02\xbc\x02\xb4\xff\ +\xec\x02\xbc\x02\xc0\xff\xec\x02\xbc\x02\xc2\xff\xec\x02\xbc\x02\ +\xd5\xff\xec\x02\xbc\x02\xe0\xff\xec\x02\xbc\x02\xf0\xff\xec\x02\ +\xbc\x02\xf2\xff\xec\x02\xbc\x02\xf4\xff\xec\x02\xbc\x02\xfe\xff\ +\xec\x02\xbc\x03\x0a\xff\xec\x02\xbc\x03\x0c\xff\xec\x02\xbc\x03\ +\x0e\xff\xd7\x02\xbc\x03\x10\xff\xd7\x02\xbc\x03\x16\xff\xec\x02\ +\xbc\x03\x1a\xff\xec\x02\xbd\x01\xa3\x00\xe1\x02\xbd\x02\xea\x00\ +)\x02\xbd\x03\x0e\xff\xd7\x02\xbd\x03\x10\xff\xd7\x02\xbe\x00\ +\x05\xff\xec\x02\xbe\x00\x0a\xff\xec\x02\xbe\x02\x07\xff\xec\x02\ +\xbe\x02\x0b\xff\xec\x02\xbf\x01\xa3\x00\xe1\x02\xbf\x02\xea\x00\ +)\x02\xbf\x03\x0e\xff\xd7\x02\xbf\x03\x10\xff\xd7\x02\xc0\x00\ +\x05\xff\xec\x02\xc0\x00\x0a\xff\xec\x02\xc0\x02\x07\xff\xec\x02\ +\xc0\x02\x0b\xff\xec\x02\xc3\x00\x05\xff\xc3\x02\xc3\x00\x0a\xff\ +\xc3\x02\xc3\x01\x9d\xff\xd7\x02\xc3\x01\xa6\xff\xd7\x02\xc3\x01\ +\xbc\xff\x85\x02\xc3\x01\xc1\xff\xae\x02\xc3\x01\xc4\xff\xd7\x02\ +\xc3\x01\xdc\xff\xd7\x02\xc3\x01\xdd\xff\xec\x02\xc3\x01\xe1\xff\ +\xec\x02\xc3\x01\xe4\xff\xd7\x02\xc3\x01\xf6\xff\xec\x02\xc3\x02\ +\x07\xff\xc3\x02\xc3\x02\x0b\xff\xc3\x02\xc3\x02|\xff\xae\x02\ +\xc3\x02\x80\xff\xc3\x02\xc3\x02\x82\xff\xc3\x02\xc3\x02\xa9\xff\ +\xd7\x02\xc3\x02\xaa\xff\xd7\x02\xc3\x02\xb5\xff\x85\x02\xc3\x02\ +\xb6\xff\xd7\x02\xc3\x02\xb7\xff\x9a\x02\xc3\x02\xb9\xff\x9a\x02\ +\xc3\x02\xbd\xff\xd7\x02\xc3\x02\xbe\xff\xd7\x02\xc3\x02\xbf\xff\ +\xae\x02\xc3\x02\xc0\xff\xec\x02\xc3\x02\xc1\xff\xae\x02\xc3\x02\ +\xc2\xff\xec\x02\xc3\x02\xd4\xff\xae\x02\xc3\x02\xd5\xff\xec\x02\ +\xc3\x02\xf8\xff\xec\x02\xc3\x02\xfa\xff\xec\x02\xc3\x02\xfc\xff\ +\xec\x02\xc3\x02\xfd\xff\xae\x02\xc3\x02\xfe\xff\xec\x02\xc3\x03\ +\x0d\xff\xae\x02\xc3\x03\x0e\xff\xd7\x02\xc3\x03\x0f\xff\xae\x02\ +\xc3\x03\x10\xff\xd7\x02\xc3\x03\x17\xff\xd7\x02\xc3\x03\x18\xff\ +\xd7\x02\xc4\x00\x05\xff\x9a\x02\xc4\x00\x0a\xff\x9a\x02\xc4\x01\ +\xdc\xff\xd7\x02\xc4\x01\xdd\xff\xd7\x02\xc4\x01\xe4\xff\xd7\x02\ +\xc4\x01\xf6\xff\xd7\x02\xc4\x02\x07\xff\x9a\x02\xc4\x02\x0b\xff\ +\x9a\x02\xc4\x02\xaa\xff\xd7\x02\xc4\x02\xb6\xff\xd7\x02\xc4\x02\ +\xb8\xff\xd7\x02\xc4\x02\xba\xff\xd7\x02\xc4\x02\xbe\xff\xd7\x02\ +\xc4\x02\xf8\xff\xd7\x02\xc4\x02\xfa\xff\xd7\x02\xc4\x02\xfc\xff\ +\xd7\x02\xc4\x03\x0e\xff\xae\x02\xc4\x03\x10\xff\xae\x02\xc4\x03\ +\x18\xff\xd7\x02\xc5\x01\xbc\xff\xd7\x02\xc5\x02\x80\xff\xec\x02\ +\xc5\x02\x82\xff\xec\x02\xc5\x02\xb5\xff\xd7\x02\xc5\x02\xb7\xff\ +\xec\x02\xc5\x02\xb9\xff\xec\x02\xc5\x03\x0d\xff\xec\x02\xc5\x03\ +\x0f\xff\xec\x02\xc6\x00\x05\xff\xec\x02\xc6\x00\x0a\xff\xec\x02\ +\xc6\x02\x07\xff\xec\x02\xc6\x02\x0b\xff\xec\x02\xc7\x01\xbc\xff\ +\xd7\x02\xc7\x02\x80\xff\xec\x02\xc7\x02\x82\xff\xec\x02\xc7\x02\ +\xb5\xff\xd7\x02\xc7\x02\xb7\xff\xec\x02\xc7\x02\xb9\xff\xec\x02\ +\xc7\x03\x0d\xff\xec\x02\xc7\x03\x0f\xff\xec\x02\xc8\x00\x05\xff\ +\xec\x02\xc8\x00\x0a\xff\xec\x02\xc8\x02\x07\xff\xec\x02\xc8\x02\ +\x0b\xff\xec\x02\xca\x01\x9f\xff\xd7\x02\xca\x01\xb8\xff\xd7\x02\ +\xca\x01\xbb\xff\xd7\x02\xca\x01\xbe\xff\xd7\x02\xca\x01\xc1\xff\ +\xd7\x02\xca\x01\xe1\xff\xd7\x02\xca\x02l\xff\xd7\x02\xca\x02\ +|\xff\xd7\x02\xca\x02~\xff\xd7\x02\xca\x02\x84\xff\xd7\x02\ +\xca\x02\x86\xff\xd7\x02\xca\x02\x88\xff\xd7\x02\xca\x02\x8a\xff\ +\xd7\x02\xca\x02\x8c\xff\xd7\x02\xca\x02\xb1\xff\xd7\x02\xca\x02\ +\xb3\xff\xd7\x02\xca\x02\xbf\xff\xd7\x02\xca\x02\xc0\xff\xd7\x02\ +\xca\x02\xc1\xff\xd7\x02\xca\x02\xc2\xff\xd7\x02\xca\x02\xc5\xff\ +\x9a\x02\xca\x02\xc7\xff\x9a\x02\xca\x02\xd4\xff\xd7\x02\xca\x02\ +\xd5\xff\xd7\x02\xca\x02\xef\xff\xd7\x02\xca\x02\xf1\xff\xd7\x02\ +\xca\x02\xf3\xff\xd7\x02\xca\x02\xfd\xff\xd7\x02\xca\x02\xfe\xff\ +\xd7\x02\xca\x03\x09\xff\xd7\x02\xca\x03\x0b\xff\xd7\x02\xca\x03\ +\x0e\xff\xd7\x02\xca\x03\x10\xff\xd7\x02\xca\x03\x15\xff\xd7\x02\ +\xca\x03\x19\xff\xec\x02\xcb\x01\xcf\xff\xd7\x02\xcb\x01\xd8\xff\ +\xd7\x02\xcb\x01\xdb\xff\xd7\x02\xcb\x01\xde\xff\xd7\x02\xcb\x01\ +\xe1\xff\xd7\x02\xcb\x01\xea\xff\xd7\x02\xcb\x01\xed\xff\xd7\x02\ +\xcb\x02j\xff\xd7\x02\xcb\x02\x7f\xff\xd7\x02\xcb\x02\x85\xff\ +\xd7\x02\xcb\x02\x87\xff\xd7\x02\xcb\x02\x89\xff\xd7\x02\xcb\x02\ +\x8d\xff\xd7\x02\xcb\x02\xb2\xff\xd7\x02\xcb\x02\xb4\xff\xd7\x02\ +\xcb\x02\xc0\xff\xd7\x02\xcb\x02\xc2\xff\xd7\x02\xcb\x02\xc6\xff\ +\xd7\x02\xcb\x02\xc8\xff\xd7\x02\xcb\x02\xd5\xff\xd7\x02\xcb\x02\ +\xe0\xff\xd7\x02\xcb\x02\xf0\xff\xd7\x02\xcb\x02\xf2\xff\xd7\x02\ +\xcb\x02\xf4\xff\xd7\x02\xcb\x02\xfe\xff\xd7\x02\xcb\x03\x0a\xff\ +\xd7\x02\xcb\x03\x0c\xff\xd7\x02\xcb\x03\x16\xff\xd7\x02\xcb\x03\ +\x1a\xff\xd7\x02\xcc\x00\x05\xff\xc3\x02\xcc\x00\x0a\xff\xc3\x02\ +\xcc\x01\xa3\x00f\x02\xcc\x01\xbc\xff\xd7\x02\xcc\x01\xbe\xff\ +\xd7\x02\xcc\x01\xc1\xff\xae\x02\xcc\x01\xdc\xff\xc3\x02\xcc\x01\ +\xe1\xff\xd7\x02\xcc\x01\xe4\xff\xc3\x02\xcc\x02\x07\xff\xc3\x02\ +\xcc\x02\x0b\xff\xc3\x02\xcc\x02m\xff\xec\x02\xcc\x02|\xff\ +\xae\x02\xcc\x02\x80\xff\xd7\x02\xcc\x02\x81\xff\xec\x02\xcc\x02\ +\x82\xff\xd7\x02\xcc\x02\x83\xff\xec\x02\xcc\x02\x8b\xff\xec\x02\ +\xcc\x02\xaa\xff\xc3\x02\xcc\x02\xb5\xff\xd7\x02\xcc\x02\xb6\xff\ +\xc3\x02\xcc\x02\xb7\xff\xd7\x02\xcc\x02\xb8\xff\xec\x02\xcc\x02\ +\xb9\xff\xd7\x02\xcc\x02\xba\xff\xec\x02\xcc\x02\xbe\xff\xc3\x02\ +\xcc\x02\xbf\xff\xae\x02\xcc\x02\xc0\xff\xd7\x02\xcc\x02\xc1\xff\ +\xae\x02\xcc\x02\xc2\xff\xd7\x02\xcc\x02\xc5\xff\xc3\x02\xcc\x02\ +\xc6\xff\xd7\x02\xcc\x02\xc7\xff\xc3\x02\xcc\x02\xc8\xff\xd7\x02\ +\xcc\x02\xd4\xff\xae\x02\xcc\x02\xd5\xff\xd7\x02\xcc\x02\xfd\xff\ +\xae\x02\xcc\x02\xfe\xff\xd7\x02\xcc\x03\x0d\xff\xd7\x02\xcc\x03\ +\x0e\xff\xc3\x02\xcc\x03\x0f\xff\xd7\x02\xcc\x03\x10\xff\xc3\x02\ +\xcc\x03\x18\xff\xc3\x02\xcd\x01\xe1\xff\xd7\x02\xcd\x02\xc0\xff\ +\xd7\x02\xcd\x02\xc2\xff\xd7\x02\xcd\x02\xd5\xff\xd7\x02\xcd\x02\ +\xfe\xff\xd7\x02\xce\x01\xa3\x00\xe1\x02\xce\x02\xea\x00)\x02\ +\xce\x03\x0e\xff\xd7\x02\xce\x03\x10\xff\xd7\x02\xcf\x00\x05\xff\ +\xec\x02\xcf\x00\x0a\xff\xec\x02\xcf\x02\x07\xff\xec\x02\xcf\x02\ +\x0b\xff\xec\x02\xd2\x01\xa3\x00\xe1\x02\xd2\x02\xea\x00)\x02\ +\xd2\x03\x0e\xff\xd7\x02\xd2\x03\x10\xff\xd7\x02\xd3\x00\x05\xff\ +\xec\x02\xd3\x00\x0a\xff\xec\x02\xd3\x02\x07\xff\xec\x02\xd3\x02\ +\x0b\xff\xec\x02\xd6\x01\xa3\x00\xe1\x02\xd6\x02\xea\x00)\x02\ +\xd6\x03\x0e\xff\xd7\x02\xd6\x03\x10\xff\xd7\x02\xd7\x00\x05\xff\ +\xec\x02\xd7\x00\x0a\xff\xec\x02\xd7\x02\x07\xff\xec\x02\xd7\x02\ +\x0b\xff\xec\x02\xd9\x00\x05\xffq\x02\xd9\x00\x0a\xffq\x02\ +\xd9\x01\x9d\xff\x9a\x02\xd9\x01\xa6\xff\x9a\x02\xd9\x01\xbc\xff\ +q\x02\xd9\x01\xbe\xff\xd7\x02\xd9\x01\xc1\xff\x9a\x02\xd9\x01\ +\xc4\xff\x9a\x02\xd9\x01\xdc\xff\xd7\x02\xd9\x01\xe1\xff\xd7\x02\ +\xd9\x01\xe4\xff\xd7\x02\xd9\x02\x07\xffq\x02\xd9\x02\x0b\xff\ +q\x02\xd9\x02n\xff\xd7\x02\xd9\x02|\xff\x9a\x02\xd9\x02\ +\x80\xff\xae\x02\xd9\x02\x82\xff\xae\x02\xd9\x02\x97\xff\xd7\x02\ +\xd9\x02\x9b\xff\xd7\x02\xd9\x02\xa7\xff\xd7\x02\xd9\x02\xa9\xff\ +\x9a\x02\xd9\x02\xaa\xff\xd7\x02\xd9\x02\xb5\xffq\x02\xd9\x02\ +\xb6\xff\xd7\x02\xd9\x02\xb7\xff\x85\x02\xd9\x02\xb9\xff\x85\x02\ +\xd9\x02\xbd\xff\x9a\x02\xd9\x02\xbe\xff\xd7\x02\xd9\x02\xbf\xff\ +\x9a\x02\xd9\x02\xc0\xff\xd7\x02\xd9\x02\xc1\xff\x9a\x02\xd9\x02\ +\xc2\xff\xd7\x02\xd9\x02\xc5\xff\x9a\x02\xd9\x02\xc7\xff\x9a\x02\ +\xd9\x02\xd4\xff\x9a\x02\xd9\x02\xd5\xff\xd7\x02\xd9\x02\xe1\xff\ +\xd7\x02\xd9\x02\xe3\xff\xd7\x02\xd9\x02\xfd\xff\x9a\x02\xd9\x02\ +\xfe\xff\xd7\x02\xd9\x03\x03\xff\xd7\x02\xd9\x03\x0d\xffq\x02\ +\xd9\x03\x0e\xff\xd7\x02\xd9\x03\x0f\xffq\x02\xd9\x03\x10\xff\ +\xd7\x02\xd9\x03\x17\xff\x9a\x02\xd9\x03\x18\xff\xd7\x02\xda\x00\ +\x05\xff\xec\x02\xda\x00\x0a\xff\xec\x02\xda\x02\x07\xff\xec\x02\ +\xda\x02\x0b\xff\xec\x02\xdb\x00\x05\xffq\x02\xdb\x00\x0a\xff\ +q\x02\xdb\x01\x9d\xff\x9a\x02\xdb\x01\xa6\xff\x9a\x02\xdb\x01\ +\xbc\xffq\x02\xdb\x01\xbe\xff\xd7\x02\xdb\x01\xc1\xff\x9a\x02\ +\xdb\x01\xc4\xff\x9a\x02\xdb\x01\xdc\xff\xd7\x02\xdb\x01\xe1\xff\ +\xd7\x02\xdb\x01\xe4\xff\xd7\x02\xdb\x02\x07\xffq\x02\xdb\x02\ +\x0b\xffq\x02\xdb\x02n\xff\xd7\x02\xdb\x02|\xff\x9a\x02\ +\xdb\x02\x80\xff\xae\x02\xdb\x02\x82\xff\xae\x02\xdb\x02\x97\xff\ +\xd7\x02\xdb\x02\x9b\xff\xd7\x02\xdb\x02\xa7\xff\xd7\x02\xdb\x02\ +\xa9\xff\x9a\x02\xdb\x02\xaa\xff\xd7\x02\xdb\x02\xb5\xffq\x02\ +\xdb\x02\xb6\xff\xd7\x02\xdb\x02\xb7\xff\x85\x02\xdb\x02\xb9\xff\ +\x85\x02\xdb\x02\xbd\xff\x9a\x02\xdb\x02\xbe\xff\xd7\x02\xdb\x02\ +\xbf\xff\x9a\x02\xdb\x02\xc0\xff\xd7\x02\xdb\x02\xc1\xff\x9a\x02\ +\xdb\x02\xc2\xff\xd7\x02\xdb\x02\xc5\xff\x9a\x02\xdb\x02\xc7\xff\ +\x9a\x02\xdb\x02\xd4\xff\x9a\x02\xdb\x02\xd5\xff\xd7\x02\xdb\x02\ +\xe1\xff\xd7\x02\xdb\x02\xe3\xff\xd7\x02\xdb\x02\xfd\xff\x9a\x02\ +\xdb\x02\xfe\xff\xd7\x02\xdb\x03\x03\xff\xd7\x02\xdb\x03\x0d\xff\ +q\x02\xdb\x03\x0e\xff\xd7\x02\xdb\x03\x0f\xffq\x02\xdb\x03\ +\x10\xff\xd7\x02\xdb\x03\x17\xff\x9a\x02\xdb\x03\x18\xff\xd7\x02\ +\xdc\x00\x05\xff\xec\x02\xdc\x00\x0a\xff\xec\x02\xdc\x02\x07\xff\ +\xec\x02\xdc\x02\x0b\xff\xec\x02\xde\x00\x05\xff\xec\x02\xde\x00\ +\x0a\xff\xec\x02\xde\x02\x07\xff\xec\x02\xde\x02\x0b\xff\xec\x02\ +\xe0\x00\x05\xff\xec\x02\xe0\x00\x0a\xff\xec\x02\xe0\x02\x07\xff\ +\xec\x02\xe0\x02\x0b\xff\xec\x02\xe1\x00\x0f\xff\xae\x02\xe1\x00\ +\x11\xff\xae\x02\xe1\x01\x9d\xff\xec\x02\xe1\x01\xa4\xff\xd7\x02\ +\xe1\x01\xa6\xff\xec\x02\xe1\x01\xa8\xff\xd7\x02\xe1\x01\xaa\xff\ +\xd7\x02\xe1\x01\xae\xff\xd7\x02\xe1\x01\xb0\xff\xd7\x02\xe1\x01\ +\xb1\xff\xec\x02\xe1\x01\xb5\xff\xd7\x02\xe1\x01\xbc\xff\xc3\x02\ +\xe1\x01\xbd\xff\xd7\x02\xe1\x01\xbf\xff\xd7\x02\xe1\x01\xc1\xff\ +\xd7\x02\xe1\x01\xc4\xff\xec\x02\xe1\x01\xc7\xff\xec\x02\xe1\x01\ +\xce\xff\xec\x02\xe1\x01\xd5\xff\xec\x02\xe1\x01\xf2\xff\xec\x02\ +\xe1\x02\x08\xff\xae\x02\xe1\x02\x0c\xff\xae\x02\xe1\x02r\xff\ +\xd7\x02\xe1\x02s\xff\xec\x02\xe1\x02z\xff\xec\x02\xe1\x02\ +|\xff\xd7\x02\xe1\x02\x80\xff\xec\x02\xe1\x02\x82\xff\xec\x02\ +\xe1\x02\x9f\xff\xd7\x02\xe1\x02\xa1\xff\xec\x02\xe1\x02\xa9\xff\ +\xec\x02\xe1\x02\xb5\xff\xc3\x02\xe1\x02\xb7\xff\xec\x02\xe1\x02\ +\xb9\xff\xec\x02\xe1\x02\xbb\xff\xd7\x02\xe1\x02\xbd\xff\xec\x02\ +\xe1\x02\xbf\xff\xd7\x02\xe1\x02\xc1\xff\xd7\x02\xe1\x02\xca\xff\ +\xd7\x02\xe1\x02\xce\xff\xd7\x02\xe1\x02\xcf\xff\xec\x02\xe1\x02\ +\xd4\xff\xd7\x02\xe1\x02\xd9\xff\xd7\x02\xe1\x02\xdb\xff\xd7\x02\ +\xe1\x02\xdd\xff\xd7\x02\xe1\x02\xe5\xff\xd7\x02\xe1\x02\xe7\xff\ +\xec\x02\xe1\x02\xf5\xff\xec\x02\xe1\x02\xf7\xff\xd7\x02\xe1\x02\ +\xf9\xff\xd7\x02\xe1\x02\xfb\xff\xd7\x02\xe1\x02\xfd\xff\xd7\x02\ +\xe1\x03\x05\xff\xd7\x02\xe1\x03\x07\xff\xd7\x02\xe1\x03\x0d\xff\ +\xd7\x02\xe1\x03\x0f\xff\xd7\x02\xe1\x03\x11\xff\xd7\x02\xe1\x03\ +\x12\xff\xec\x02\xe1\x03\x17\xff\xec\x02\xe1\x03\x1b\xff\xd7\x02\ +\xe1\x03\x1c\xff\xec\x02\xe2\x00\x05\xff\xec\x02\xe2\x00\x0a\xff\ +\xec\x02\xe2\x01\xd0\xff\xd7\x02\xe2\x01\xdc\xff\xec\x02\xe2\x01\ +\xdd\xff\xec\x02\xe2\x01\xdf\xff\xd7\x02\xe2\x01\xe1\xff\xec\x02\ +\xe2\x01\xe4\xff\xec\x02\xe2\x01\xf6\xff\xec\x02\xe2\x02\x07\xff\ +\xec\x02\xe2\x02\x0b\xff\xec\x02\xe2\x02\xa0\xff\xd7\x02\xe2\x02\ +\xaa\xff\xec\x02\xe2\x02\xb6\xff\xec\x02\xe2\x02\xbc\xff\xd7\x02\ +\xe2\x02\xbe\xff\xec\x02\xe2\x02\xc0\xff\xec\x02\xe2\x02\xc2\xff\ +\xec\x02\xe2\x02\xcb\xff\xd7\x02\xe2\x02\xd5\xff\xec\x02\xe2\x02\ +\xe6\xff\xd7\x02\xe2\x02\xf8\xff\xec\x02\xe2\x02\xfa\xff\xec\x02\ +\xe2\x02\xfc\xff\xec\x02\xe2\x02\xfe\xff\xec\x02\xe2\x03\x06\xff\ +\xd7\x02\xe2\x03\x08\xff\xd7\x02\xe2\x03\x0e\xff\xec\x02\xe2\x03\ +\x10\xff\xec\x02\xe2\x03\x18\xff\xec\x02\xe3\x00\x0f\xff\xae\x02\ +\xe3\x00\x11\xff\xae\x02\xe3\x01\x9d\xff\xec\x02\xe3\x01\xa4\xff\ +\xd7\x02\xe3\x01\xa6\xff\xec\x02\xe3\x01\xa8\xff\xd7\x02\xe3\x01\ +\xaa\xff\xd7\x02\xe3\x01\xae\xff\xd7\x02\xe3\x01\xb0\xff\xd7\x02\ +\xe3\x01\xb1\xff\xec\x02\xe3\x01\xb5\xff\xd7\x02\xe3\x01\xbc\xff\ +\xc3\x02\xe3\x01\xbd\xff\xd7\x02\xe3\x01\xbf\xff\xd7\x02\xe3\x01\ +\xc1\xff\xd7\x02\xe3\x01\xc4\xff\xec\x02\xe3\x01\xc7\xff\xec\x02\ +\xe3\x01\xce\xff\xec\x02\xe3\x01\xd5\xff\xec\x02\xe3\x01\xf2\xff\ +\xec\x02\xe3\x02\x08\xff\xae\x02\xe3\x02\x0c\xff\xae\x02\xe3\x02\ +r\xff\xd7\x02\xe3\x02s\xff\xec\x02\xe3\x02z\xff\xec\x02\ +\xe3\x02|\xff\xd7\x02\xe3\x02\x80\xff\xec\x02\xe3\x02\x82\xff\ +\xec\x02\xe3\x02\x9f\xff\xd7\x02\xe3\x02\xa1\xff\xec\x02\xe3\x02\ +\xa9\xff\xec\x02\xe3\x02\xb5\xff\xc3\x02\xe3\x02\xb7\xff\xec\x02\ +\xe3\x02\xb9\xff\xec\x02\xe3\x02\xbb\xff\xd7\x02\xe3\x02\xbd\xff\ +\xec\x02\xe3\x02\xbf\xff\xd7\x02\xe3\x02\xc1\xff\xd7\x02\xe3\x02\ +\xca\xff\xd7\x02\xe3\x02\xce\xff\xd7\x02\xe3\x02\xcf\xff\xec\x02\ +\xe3\x02\xd4\xff\xd7\x02\xe3\x02\xd9\xff\xd7\x02\xe3\x02\xdb\xff\ +\xd7\x02\xe3\x02\xdd\xff\xd7\x02\xe3\x02\xe5\xff\xd7\x02\xe3\x02\ +\xe7\xff\xec\x02\xe3\x02\xf5\xff\xec\x02\xe3\x02\xf7\xff\xd7\x02\ +\xe3\x02\xf9\xff\xd7\x02\xe3\x02\xfb\xff\xd7\x02\xe3\x02\xfd\xff\ +\xd7\x02\xe3\x03\x05\xff\xd7\x02\xe3\x03\x07\xff\xd7\x02\xe3\x03\ +\x0d\xff\xd7\x02\xe3\x03\x0f\xff\xd7\x02\xe3\x03\x11\xff\xd7\x02\ +\xe3\x03\x12\xff\xec\x02\xe3\x03\x17\xff\xec\x02\xe3\x03\x1b\xff\ +\xd7\x02\xe3\x03\x1c\xff\xec\x02\xe4\x00\x05\xff\xec\x02\xe4\x00\ +\x0a\xff\xec\x02\xe4\x01\xd0\xff\xd7\x02\xe4\x01\xdc\xff\xec\x02\ +\xe4\x01\xdd\xff\xec\x02\xe4\x01\xdf\xff\xd7\x02\xe4\x01\xe1\xff\ +\xec\x02\xe4\x01\xe4\xff\xec\x02\xe4\x01\xf6\xff\xec\x02\xe4\x02\ +\x07\xff\xec\x02\xe4\x02\x0b\xff\xec\x02\xe4\x02\xa0\xff\xd7\x02\ +\xe4\x02\xaa\xff\xec\x02\xe4\x02\xb6\xff\xec\x02\xe4\x02\xbc\xff\ +\xd7\x02\xe4\x02\xbe\xff\xec\x02\xe4\x02\xc0\xff\xec\x02\xe4\x02\ +\xc2\xff\xec\x02\xe4\x02\xcb\xff\xd7\x02\xe4\x02\xd5\xff\xec\x02\ +\xe4\x02\xe6\xff\xd7\x02\xe4\x02\xf8\xff\xec\x02\xe4\x02\xfa\xff\ +\xec\x02\xe4\x02\xfc\xff\xec\x02\xe4\x02\xfe\xff\xec\x02\xe4\x03\ +\x06\xff\xd7\x02\xe4\x03\x08\xff\xd7\x02\xe4\x03\x0e\xff\xec\x02\ +\xe4\x03\x10\xff\xec\x02\xe4\x03\x18\xff\xec\x02\xe5\x01\x9f\xff\ +\xd7\x02\xe5\x01\xb8\xff\xd7\x02\xe5\x01\xbb\xff\xd7\x02\xe5\x01\ +\xbe\xff\xd7\x02\xe5\x01\xc1\xff\xd7\x02\xe5\x01\xe1\xff\xd7\x02\ +\xe5\x02l\xff\xd7\x02\xe5\x02|\xff\xd7\x02\xe5\x02~\xff\ +\xd7\x02\xe5\x02\x84\xff\xd7\x02\xe5\x02\x86\xff\xd7\x02\xe5\x02\ +\x88\xff\xd7\x02\xe5\x02\x8a\xff\xd7\x02\xe5\x02\x8c\xff\xd7\x02\ +\xe5\x02\xb1\xff\xd7\x02\xe5\x02\xb3\xff\xd7\x02\xe5\x02\xbf\xff\ +\xd7\x02\xe5\x02\xc0\xff\xd7\x02\xe5\x02\xc1\xff\xd7\x02\xe5\x02\ +\xc2\xff\xd7\x02\xe5\x02\xc5\xff\x9a\x02\xe5\x02\xc7\xff\x9a\x02\ +\xe5\x02\xd4\xff\xd7\x02\xe5\x02\xd5\xff\xd7\x02\xe5\x02\xef\xff\ +\xd7\x02\xe5\x02\xf1\xff\xd7\x02\xe5\x02\xf3\xff\xd7\x02\xe5\x02\ +\xfd\xff\xd7\x02\xe5\x02\xfe\xff\xd7\x02\xe5\x03\x09\xff\xd7\x02\ +\xe5\x03\x0b\xff\xd7\x02\xe5\x03\x0e\xff\xd7\x02\xe5\x03\x10\xff\ +\xd7\x02\xe5\x03\x15\xff\xd7\x02\xe5\x03\x19\xff\xec\x02\xe6\x01\ +\xcf\xff\xd7\x02\xe6\x01\xd8\xff\xd7\x02\xe6\x01\xdb\xff\xd7\x02\ +\xe6\x01\xde\xff\xd7\x02\xe6\x01\xe1\xff\xd7\x02\xe6\x01\xea\xff\ +\xd7\x02\xe6\x01\xed\xff\xd7\x02\xe6\x02j\xff\xd7\x02\xe6\x02\ +\x7f\xff\xd7\x02\xe6\x02\x85\xff\xd7\x02\xe6\x02\x87\xff\xd7\x02\ +\xe6\x02\x89\xff\xd7\x02\xe6\x02\x8d\xff\xd7\x02\xe6\x02\xb2\xff\ +\xd7\x02\xe6\x02\xb4\xff\xd7\x02\xe6\x02\xc0\xff\xd7\x02\xe6\x02\ +\xc2\xff\xd7\x02\xe6\x02\xc6\xff\xd7\x02\xe6\x02\xc8\xff\xd7\x02\ +\xe6\x02\xd5\xff\xd7\x02\xe6\x02\xe0\xff\xd7\x02\xe6\x02\xf0\xff\ +\xd7\x02\xe6\x02\xf2\xff\xd7\x02\xe6\x02\xf4\xff\xd7\x02\xe6\x02\ +\xfe\xff\xd7\x02\xe6\x03\x0a\xff\xd7\x02\xe6\x03\x0c\xff\xd7\x02\ +\xe6\x03\x16\xff\xd7\x02\xe6\x03\x1a\xff\xd7\x02\xe7\x00\x0f\xff\ +\xae\x02\xe7\x00\x11\xff\xae\x02\xe7\x02\x08\xff\xae\x02\xe7\x02\ +\x0c\xff\xae\x02\xe7\x02\x80\xff\xec\x02\xe7\x02\x82\xff\xec\x02\ +\xe7\x02\xb7\xff\xec\x02\xe7\x02\xb9\xff\xec\x02\xe7\x03\x0d\xff\ +\xd7\x02\xe7\x03\x0f\xff\xd7\x02\xe8\x01\xe9\x00)\x02\xe9\x00\ +\x05\xff\xec\x02\xe9\x00\x0a\xff\xec\x02\xe9\x02\x07\xff\xec\x02\ +\xe9\x02\x0b\xff\xec\x02\xe9\x03\x0e\xff\xd7\x02\xe9\x03\x10\xff\ +\xd7\x02\xef\x00\x0f\xff\xae\x02\xef\x00\x11\xff\xae\x02\xef\x01\ +\x9d\xff\xec\x02\xef\x01\xa4\xff\xd7\x02\xef\x01\xa6\xff\xec\x02\ +\xef\x01\xa8\xff\xd7\x02\xef\x01\xaa\xff\xd7\x02\xef\x01\xae\xff\ +\xd7\x02\xef\x01\xb0\xff\xd7\x02\xef\x01\xb1\xff\xec\x02\xef\x01\ +\xb5\xff\xd7\x02\xef\x01\xbc\xff\xc3\x02\xef\x01\xbd\xff\xd7\x02\ +\xef\x01\xbf\xff\xd7\x02\xef\x01\xc1\xff\xd7\x02\xef\x01\xc4\xff\ +\xec\x02\xef\x01\xc7\xff\xec\x02\xef\x01\xce\xff\xec\x02\xef\x01\ +\xd5\xff\xec\x02\xef\x01\xf2\xff\xec\x02\xef\x02\x08\xff\xae\x02\ +\xef\x02\x0c\xff\xae\x02\xef\x02r\xff\xd7\x02\xef\x02s\xff\ +\xec\x02\xef\x02z\xff\xec\x02\xef\x02|\xff\xd7\x02\xef\x02\ +\x80\xff\xec\x02\xef\x02\x82\xff\xec\x02\xef\x02\x9f\xff\xd7\x02\ +\xef\x02\xa1\xff\xec\x02\xef\x02\xa9\xff\xec\x02\xef\x02\xb5\xff\ +\xc3\x02\xef\x02\xb7\xff\xec\x02\xef\x02\xb9\xff\xec\x02\xef\x02\ +\xbb\xff\xd7\x02\xef\x02\xbd\xff\xec\x02\xef\x02\xbf\xff\xd7\x02\ +\xef\x02\xc1\xff\xd7\x02\xef\x02\xca\xff\xd7\x02\xef\x02\xce\xff\ +\xd7\x02\xef\x02\xcf\xff\xec\x02\xef\x02\xd4\xff\xd7\x02\xef\x02\ +\xd9\xff\xd7\x02\xef\x02\xdb\xff\xd7\x02\xef\x02\xdd\xff\xd7\x02\ +\xef\x02\xe5\xff\xd7\x02\xef\x02\xe7\xff\xec\x02\xef\x02\xf5\xff\ +\xec\x02\xef\x02\xf7\xff\xd7\x02\xef\x02\xf9\xff\xd7\x02\xef\x02\ +\xfb\xff\xd7\x02\xef\x02\xfd\xff\xd7\x02\xef\x03\x05\xff\xd7\x02\ +\xef\x03\x07\xff\xd7\x02\xef\x03\x0d\xff\xd7\x02\xef\x03\x0f\xff\ +\xd7\x02\xef\x03\x11\xff\xd7\x02\xef\x03\x12\xff\xec\x02\xef\x03\ +\x17\xff\xec\x02\xef\x03\x1b\xff\xd7\x02\xef\x03\x1c\xff\xec\x02\ +\xf0\x00\x05\xff\xec\x02\xf0\x00\x0a\xff\xec\x02\xf0\x01\xd0\xff\ +\xd7\x02\xf0\x01\xdc\xff\xec\x02\xf0\x01\xdd\xff\xec\x02\xf0\x01\ +\xdf\xff\xd7\x02\xf0\x01\xe1\xff\xec\x02\xf0\x01\xe4\xff\xec\x02\ +\xf0\x01\xf6\xff\xec\x02\xf0\x02\x07\xff\xec\x02\xf0\x02\x0b\xff\ +\xec\x02\xf0\x02\xa0\xff\xd7\x02\xf0\x02\xaa\xff\xec\x02\xf0\x02\ +\xb6\xff\xec\x02\xf0\x02\xbc\xff\xd7\x02\xf0\x02\xbe\xff\xec\x02\ +\xf0\x02\xc0\xff\xec\x02\xf0\x02\xc2\xff\xec\x02\xf0\x02\xcb\xff\ +\xd7\x02\xf0\x02\xd5\xff\xec\x02\xf0\x02\xe6\xff\xd7\x02\xf0\x02\ +\xf8\xff\xec\x02\xf0\x02\xfa\xff\xec\x02\xf0\x02\xfc\xff\xec\x02\ +\xf0\x02\xfe\xff\xec\x02\xf0\x03\x06\xff\xd7\x02\xf0\x03\x08\xff\ +\xd7\x02\xf0\x03\x0e\xff\xec\x02\xf0\x03\x10\xff\xec\x02\xf0\x03\ +\x18\xff\xec\x02\xf1\x00\x0f\xff\xae\x02\xf1\x00\x11\xff\xae\x02\ +\xf1\x01\x9d\xff\xec\x02\xf1\x01\xa4\xff\xd7\x02\xf1\x01\xa6\xff\ +\xec\x02\xf1\x01\xa8\xff\xd7\x02\xf1\x01\xaa\xff\xd7\x02\xf1\x01\ +\xae\xff\xd7\x02\xf1\x01\xb0\xff\xd7\x02\xf1\x01\xb1\xff\xec\x02\ +\xf1\x01\xb5\xff\xd7\x02\xf1\x01\xbc\xff\xc3\x02\xf1\x01\xbd\xff\ +\xd7\x02\xf1\x01\xbf\xff\xd7\x02\xf1\x01\xc1\xff\xd7\x02\xf1\x01\ +\xc4\xff\xec\x02\xf1\x01\xc7\xff\xec\x02\xf1\x01\xce\xff\xec\x02\ +\xf1\x01\xd5\xff\xec\x02\xf1\x01\xf2\xff\xec\x02\xf1\x02\x08\xff\ +\xae\x02\xf1\x02\x0c\xff\xae\x02\xf1\x02r\xff\xd7\x02\xf1\x02\ +s\xff\xec\x02\xf1\x02z\xff\xec\x02\xf1\x02|\xff\xd7\x02\ +\xf1\x02\x80\xff\xec\x02\xf1\x02\x82\xff\xec\x02\xf1\x02\x9f\xff\ +\xd7\x02\xf1\x02\xa1\xff\xec\x02\xf1\x02\xa9\xff\xec\x02\xf1\x02\ +\xb5\xff\xc3\x02\xf1\x02\xb7\xff\xec\x02\xf1\x02\xb9\xff\xec\x02\ +\xf1\x02\xbb\xff\xd7\x02\xf1\x02\xbd\xff\xec\x02\xf1\x02\xbf\xff\ +\xd7\x02\xf1\x02\xc1\xff\xd7\x02\xf1\x02\xca\xff\xd7\x02\xf1\x02\ +\xce\xff\xd7\x02\xf1\x02\xcf\xff\xec\x02\xf1\x02\xd4\xff\xd7\x02\ +\xf1\x02\xd9\xff\xd7\x02\xf1\x02\xdb\xff\xd7\x02\xf1\x02\xdd\xff\ +\xd7\x02\xf1\x02\xe5\xff\xd7\x02\xf1\x02\xe7\xff\xec\x02\xf1\x02\ +\xf5\xff\xec\x02\xf1\x02\xf7\xff\xd7\x02\xf1\x02\xf9\xff\xd7\x02\ +\xf1\x02\xfb\xff\xd7\x02\xf1\x02\xfd\xff\xd7\x02\xf1\x03\x05\xff\ +\xd7\x02\xf1\x03\x07\xff\xd7\x02\xf1\x03\x0d\xff\xd7\x02\xf1\x03\ +\x0f\xff\xd7\x02\xf1\x03\x11\xff\xd7\x02\xf1\x03\x12\xff\xec\x02\ +\xf1\x03\x17\xff\xec\x02\xf1\x03\x1b\xff\xd7\x02\xf1\x03\x1c\xff\ +\xec\x02\xf2\x00\x05\xff\xec\x02\xf2\x00\x0a\xff\xec\x02\xf2\x01\ +\xd0\xff\xd7\x02\xf2\x01\xdc\xff\xec\x02\xf2\x01\xdd\xff\xec\x02\ +\xf2\x01\xdf\xff\xd7\x02\xf2\x01\xe1\xff\xec\x02\xf2\x01\xe4\xff\ +\xec\x02\xf2\x01\xf6\xff\xec\x02\xf2\x02\x07\xff\xec\x02\xf2\x02\ +\x0b\xff\xec\x02\xf2\x02\xa0\xff\xd7\x02\xf2\x02\xaa\xff\xec\x02\ +\xf2\x02\xb6\xff\xec\x02\xf2\x02\xbc\xff\xd7\x02\xf2\x02\xbe\xff\ +\xec\x02\xf2\x02\xc0\xff\xec\x02\xf2\x02\xc2\xff\xec\x02\xf2\x02\ +\xcb\xff\xd7\x02\xf2\x02\xd5\xff\xec\x02\xf2\x02\xe6\xff\xd7\x02\ +\xf2\x02\xf8\xff\xec\x02\xf2\x02\xfa\xff\xec\x02\xf2\x02\xfc\xff\ +\xec\x02\xf2\x02\xfe\xff\xec\x02\xf2\x03\x06\xff\xd7\x02\xf2\x03\ +\x08\xff\xd7\x02\xf2\x03\x0e\xff\xec\x02\xf2\x03\x10\xff\xec\x02\ +\xf2\x03\x18\xff\xec\x02\xf3\x00\x0f\xff\xae\x02\xf3\x00\x11\xff\ +\xae\x02\xf3\x01\x9d\xff\xec\x02\xf3\x01\xa4\xff\xd7\x02\xf3\x01\ +\xa6\xff\xec\x02\xf3\x01\xa8\xff\xd7\x02\xf3\x01\xaa\xff\xd7\x02\ +\xf3\x01\xae\xff\xd7\x02\xf3\x01\xb0\xff\xd7\x02\xf3\x01\xb1\xff\ +\xec\x02\xf3\x01\xb5\xff\xd7\x02\xf3\x01\xbc\xff\xc3\x02\xf3\x01\ +\xbd\xff\xd7\x02\xf3\x01\xbf\xff\xd7\x02\xf3\x01\xc1\xff\xd7\x02\ +\xf3\x01\xc4\xff\xec\x02\xf3\x01\xc7\xff\xec\x02\xf3\x01\xce\xff\ +\xec\x02\xf3\x01\xd5\xff\xec\x02\xf3\x01\xf2\xff\xec\x02\xf3\x02\ +\x08\xff\xae\x02\xf3\x02\x0c\xff\xae\x02\xf3\x02r\xff\xd7\x02\ +\xf3\x02s\xff\xec\x02\xf3\x02z\xff\xec\x02\xf3\x02|\xff\ +\xd7\x02\xf3\x02\x80\xff\xec\x02\xf3\x02\x82\xff\xec\x02\xf3\x02\ +\x9f\xff\xd7\x02\xf3\x02\xa1\xff\xec\x02\xf3\x02\xa9\xff\xec\x02\ +\xf3\x02\xb5\xff\xc3\x02\xf3\x02\xb7\xff\xec\x02\xf3\x02\xb9\xff\ +\xec\x02\xf3\x02\xbb\xff\xd7\x02\xf3\x02\xbd\xff\xec\x02\xf3\x02\ +\xbf\xff\xd7\x02\xf3\x02\xc1\xff\xd7\x02\xf3\x02\xca\xff\xd7\x02\ +\xf3\x02\xce\xff\xd7\x02\xf3\x02\xcf\xff\xec\x02\xf3\x02\xd4\xff\ +\xd7\x02\xf3\x02\xd9\xff\xd7\x02\xf3\x02\xdb\xff\xd7\x02\xf3\x02\ +\xdd\xff\xd7\x02\xf3\x02\xe5\xff\xd7\x02\xf3\x02\xe7\xff\xec\x02\ +\xf3\x02\xf5\xff\xec\x02\xf3\x02\xf7\xff\xd7\x02\xf3\x02\xf9\xff\ +\xd7\x02\xf3\x02\xfb\xff\xd7\x02\xf3\x02\xfd\xff\xd7\x02\xf3\x03\ +\x05\xff\xd7\x02\xf3\x03\x07\xff\xd7\x02\xf3\x03\x0d\xff\xd7\x02\ +\xf3\x03\x0f\xff\xd7\x02\xf3\x03\x11\xff\xd7\x02\xf3\x03\x12\xff\ +\xec\x02\xf3\x03\x17\xff\xec\x02\xf3\x03\x1b\xff\xd7\x02\xf3\x03\ +\x1c\xff\xec\x02\xf4\x00\x05\xff\xec\x02\xf4\x00\x0a\xff\xec\x02\ +\xf4\x01\xd0\xff\xd7\x02\xf4\x01\xdc\xff\xec\x02\xf4\x01\xdd\xff\ +\xec\x02\xf4\x01\xdf\xff\xd7\x02\xf4\x01\xe1\xff\xec\x02\xf4\x01\ +\xe4\xff\xec\x02\xf4\x01\xf6\xff\xec\x02\xf4\x02\x07\xff\xec\x02\ +\xf4\x02\x0b\xff\xec\x02\xf4\x02\xa0\xff\xd7\x02\xf4\x02\xaa\xff\ +\xec\x02\xf4\x02\xb6\xff\xec\x02\xf4\x02\xbc\xff\xd7\x02\xf4\x02\ +\xbe\xff\xec\x02\xf4\x02\xc0\xff\xec\x02\xf4\x02\xc2\xff\xec\x02\ +\xf4\x02\xcb\xff\xd7\x02\xf4\x02\xd5\xff\xec\x02\xf4\x02\xe6\xff\ +\xd7\x02\xf4\x02\xf8\xff\xec\x02\xf4\x02\xfa\xff\xec\x02\xf4\x02\ +\xfc\xff\xec\x02\xf4\x02\xfe\xff\xec\x02\xf4\x03\x06\xff\xd7\x02\ +\xf4\x03\x08\xff\xd7\x02\xf4\x03\x0e\xff\xec\x02\xf4\x03\x10\xff\ +\xec\x02\xf4\x03\x18\xff\xec\x02\xf5\x00\x0f\xff\xae\x02\xf5\x00\ +\x11\xff\xae\x02\xf5\x01\x9d\xff\xec\x02\xf5\x01\xa4\xff\xd7\x02\ +\xf5\x01\xa6\xff\xec\x02\xf5\x01\xa8\xff\xd7\x02\xf5\x01\xaa\xff\ +\xd7\x02\xf5\x01\xae\xff\xd7\x02\xf5\x01\xb0\xff\xd7\x02\xf5\x01\ +\xb1\xff\xec\x02\xf5\x01\xb5\xff\xd7\x02\xf5\x01\xbc\xff\xc3\x02\ +\xf5\x01\xbd\xff\xd7\x02\xf5\x01\xbf\xff\xd7\x02\xf5\x01\xc1\xff\ +\xd7\x02\xf5\x01\xc4\xff\xec\x02\xf5\x01\xc7\xff\xec\x02\xf5\x01\ +\xce\xff\xec\x02\xf5\x01\xd5\xff\xec\x02\xf5\x01\xf2\xff\xec\x02\ +\xf5\x02\x08\xff\xae\x02\xf5\x02\x0c\xff\xae\x02\xf5\x02r\xff\ +\xd7\x02\xf5\x02s\xff\xec\x02\xf5\x02z\xff\xec\x02\xf5\x02\ +|\xff\xd7\x02\xf5\x02\x80\xff\xec\x02\xf5\x02\x82\xff\xec\x02\ +\xf5\x02\x9f\xff\xd7\x02\xf5\x02\xa1\xff\xec\x02\xf5\x02\xa9\xff\ +\xec\x02\xf5\x02\xb5\xff\xc3\x02\xf5\x02\xb7\xff\xec\x02\xf5\x02\ +\xb9\xff\xec\x02\xf5\x02\xbb\xff\xd7\x02\xf5\x02\xbd\xff\xec\x02\ +\xf5\x02\xbf\xff\xd7\x02\xf5\x02\xc1\xff\xd7\x02\xf5\x02\xca\xff\ +\xd7\x02\xf5\x02\xce\xff\xd7\x02\xf5\x02\xcf\xff\xec\x02\xf5\x02\ +\xd4\xff\xd7\x02\xf5\x02\xd9\xff\xd7\x02\xf5\x02\xdb\xff\xd7\x02\ +\xf5\x02\xdd\xff\xd7\x02\xf5\x02\xe5\xff\xd7\x02\xf5\x02\xe7\xff\ +\xec\x02\xf5\x02\xf5\xff\xec\x02\xf5\x02\xf7\xff\xd7\x02\xf5\x02\ +\xf9\xff\xd7\x02\xf5\x02\xfb\xff\xd7\x02\xf5\x02\xfd\xff\xd7\x02\ +\xf5\x03\x05\xff\xd7\x02\xf5\x03\x07\xff\xd7\x02\xf5\x03\x0d\xff\ +\xd7\x02\xf5\x03\x0f\xff\xd7\x02\xf5\x03\x11\xff\xd7\x02\xf5\x03\ +\x12\xff\xec\x02\xf5\x03\x17\xff\xec\x02\xf5\x03\x1b\xff\xd7\x02\ +\xf5\x03\x1c\xff\xec\x02\xf6\x00\x05\xff\xec\x02\xf6\x00\x0a\xff\ +\xec\x02\xf6\x01\xd0\xff\xd7\x02\xf6\x01\xdc\xff\xec\x02\xf6\x01\ +\xdd\xff\xec\x02\xf6\x01\xdf\xff\xd7\x02\xf6\x01\xe1\xff\xec\x02\ +\xf6\x01\xe4\xff\xec\x02\xf6\x01\xf6\xff\xec\x02\xf6\x02\x07\xff\ +\xec\x02\xf6\x02\x0b\xff\xec\x02\xf6\x02\xa0\xff\xd7\x02\xf6\x02\ +\xaa\xff\xec\x02\xf6\x02\xb6\xff\xec\x02\xf6\x02\xbc\xff\xd7\x02\ +\xf6\x02\xbe\xff\xec\x02\xf6\x02\xc0\xff\xec\x02\xf6\x02\xc2\xff\ +\xec\x02\xf6\x02\xcb\xff\xd7\x02\xf6\x02\xd5\xff\xec\x02\xf6\x02\ +\xe6\xff\xd7\x02\xf6\x02\xf8\xff\xec\x02\xf6\x02\xfa\xff\xec\x02\ +\xf6\x02\xfc\xff\xec\x02\xf6\x02\xfe\xff\xec\x02\xf6\x03\x06\xff\ +\xd7\x02\xf6\x03\x08\xff\xd7\x02\xf6\x03\x0e\xff\xec\x02\xf6\x03\ +\x10\xff\xec\x02\xf6\x03\x18\xff\xec\x02\xf7\x00\x0f\xff\x85\x02\ +\xf7\x00\x11\xff\x85\x02\xf7\x01\x9f\xff\xec\x02\xf7\x01\xa4\xff\ +\x9a\x02\xf7\x01\xaa\xffq\x02\xf7\x01\xae\xff\x9a\x02\xf7\x01\ +\xb5\xff\x9a\x02\xf7\x01\xb8\xff\xec\x02\xf7\x01\xbb\xff\xec\x02\ +\xf7\x01\xbe\xff\xc3\x02\xf7\x01\xc9\xff\xec\x02\xf7\x01\xce\xff\ +\xae\x02\xf7\x01\xcf\xff\xd7\x02\xf7\x01\xd5\xff\xae\x02\xf7\x01\ +\xd8\xff\xd7\x02\xf7\x01\xdb\xff\xd7\x02\xf7\x01\xde\xff\xd7\x02\ +\xf7\x01\xe1\xff\xd7\x02\xf7\x01\xea\xff\xd7\x02\xf7\x01\xeb\x00\ +f\x02\xf7\x01\xed\xff\xd7\x02\xf7\x01\xee\xff\xec\x02\xf7\x01\ +\xf2\xff\xae\x02\xf7\x01\xf4\x00f\x02\xf7\x02\x08\xff\x85\x02\ +\xf7\x02\x0c\xff\x85\x02\xf7\x02j\xff\xd7\x02\xf7\x02l\xff\ +\xec\x02\xf7\x02r\xffq\x02\xf7\x02s\xff\xae\x02\xf7\x02\ +~\xff\xec\x02\xf7\x02\x7f\xff\xd7\x02\xf7\x02\x84\xff\xec\x02\ +\xf7\x02\x85\xff\xd7\x02\xf7\x02\x86\xff\xec\x02\xf7\x02\x87\xff\ +\xd7\x02\xf7\x02\x88\xff\xec\x02\xf7\x02\x89\xff\xd7\x02\xf7\x02\ +\x8a\xff\xec\x02\xf7\x02\x8c\xff\xec\x02\xf7\x02\x8d\xff\xd7\x02\ +\xf7\x02\x98\x00f\x02\xf7\x02\xa8\x00f\x02\xf7\x02\xb1\xff\ +\xec\x02\xf7\x02\xb2\xff\xd7\x02\xf7\x02\xb3\xff\xec\x02\xf7\x02\ +\xb4\xff\xd7\x02\xf7\x02\xc0\xff\xd7\x02\xf7\x02\xc2\xff\xd7\x02\ +\xf7\x02\xc5\xff\xd7\x02\xf7\x02\xc6\xff\xc3\x02\xf7\x02\xc7\xff\ +\xd7\x02\xf7\x02\xc8\xff\xc3\x02\xf7\x02\xce\xff\x9a\x02\xf7\x02\ +\xcf\xff\xae\x02\xf7\x02\xd5\xff\xd7\x02\xf7\x02\xd9\xffq\x02\ +\xf7\x02\xdb\xffq\x02\xf7\x02\xdd\xffq\x02\xf7\x02\xe0\xff\ +\xd7\x02\xf7\x02\xef\xff\xec\x02\xf7\x02\xf0\xff\xd7\x02\xf7\x02\ +\xf1\xff\xec\x02\xf7\x02\xf2\xff\xd7\x02\xf7\x02\xf3\xff\xec\x02\ +\xf7\x02\xf4\xff\xd7\x02\xf7\x02\xfe\xff\xd7\x02\xf7\x03\x09\xff\ +q\x02\xf7\x03\x0a\xff\xd7\x02\xf7\x03\x0b\xffq\x02\xf7\x03\ +\x0c\xff\xd7\x02\xf7\x03\x11\xff\x9a\x02\xf7\x03\x12\xff\xae\x02\ +\xf7\x03\x15\xff\xec\x02\xf7\x03\x16\xff\xd7\x02\xf7\x03\x1a\xff\ +\xd7\x02\xf7\x03\x1b\xff\x9a\x02\xf7\x03\x1c\xff\xae\x02\xf8\x00\ +\x0f\xff\xae\x02\xf8\x00\x11\xff\xae\x02\xf8\x01\xce\xff\xd7\x02\ +\xf8\x01\xd5\xff\xd7\x02\xf8\x01\xf2\xff\xd7\x02\xf8\x02\x08\xff\ +\xae\x02\xf8\x02\x0c\xff\xae\x02\xf8\x02s\xff\xd7\x02\xf8\x02\ +\xcf\xff\xd7\x02\xf8\x03\x12\xff\xd7\x02\xf8\x03\x1c\xff\xd7\x02\ +\xf9\x00\x0f\xff\x85\x02\xf9\x00\x11\xff\x85\x02\xf9\x01\x9f\xff\ +\xec\x02\xf9\x01\xa4\xff\x9a\x02\xf9\x01\xaa\xffq\x02\xf9\x01\ +\xae\xff\x9a\x02\xf9\x01\xb5\xff\x9a\x02\xf9\x01\xb8\xff\xec\x02\ +\xf9\x01\xbb\xff\xec\x02\xf9\x01\xbe\xff\xc3\x02\xf9\x01\xc9\xff\ +\xec\x02\xf9\x01\xce\xff\xae\x02\xf9\x01\xcf\xff\xd7\x02\xf9\x01\ +\xd5\xff\xae\x02\xf9\x01\xd8\xff\xd7\x02\xf9\x01\xdb\xff\xd7\x02\ +\xf9\x01\xde\xff\xd7\x02\xf9\x01\xe1\xff\xd7\x02\xf9\x01\xea\xff\ +\xd7\x02\xf9\x01\xeb\x00f\x02\xf9\x01\xed\xff\xd7\x02\xf9\x01\ +\xee\xff\xec\x02\xf9\x01\xf2\xff\xae\x02\xf9\x01\xf4\x00f\x02\ +\xf9\x02\x08\xff\x85\x02\xf9\x02\x0c\xff\x85\x02\xf9\x02j\xff\ +\xd7\x02\xf9\x02l\xff\xec\x02\xf9\x02r\xffq\x02\xf9\x02\ +s\xff\xae\x02\xf9\x02~\xff\xec\x02\xf9\x02\x7f\xff\xd7\x02\ +\xf9\x02\x84\xff\xec\x02\xf9\x02\x85\xff\xd7\x02\xf9\x02\x86\xff\ +\xec\x02\xf9\x02\x87\xff\xd7\x02\xf9\x02\x88\xff\xec\x02\xf9\x02\ +\x89\xff\xd7\x02\xf9\x02\x8a\xff\xec\x02\xf9\x02\x8c\xff\xec\x02\ +\xf9\x02\x8d\xff\xd7\x02\xf9\x02\x98\x00f\x02\xf9\x02\xa8\x00\ +f\x02\xf9\x02\xb1\xff\xec\x02\xf9\x02\xb2\xff\xd7\x02\xf9\x02\ +\xb3\xff\xec\x02\xf9\x02\xb4\xff\xd7\x02\xf9\x02\xc0\xff\xd7\x02\ +\xf9\x02\xc2\xff\xd7\x02\xf9\x02\xc5\xff\xd7\x02\xf9\x02\xc6\xff\ +\xc3\x02\xf9\x02\xc7\xff\xd7\x02\xf9\x02\xc8\xff\xc3\x02\xf9\x02\ +\xce\xff\x9a\x02\xf9\x02\xcf\xff\xae\x02\xf9\x02\xd5\xff\xd7\x02\ +\xf9\x02\xd9\xffq\x02\xf9\x02\xdb\xffq\x02\xf9\x02\xdd\xff\ +q\x02\xf9\x02\xe0\xff\xd7\x02\xf9\x02\xef\xff\xec\x02\xf9\x02\ +\xf0\xff\xd7\x02\xf9\x02\xf1\xff\xec\x02\xf9\x02\xf2\xff\xd7\x02\ +\xf9\x02\xf3\xff\xec\x02\xf9\x02\xf4\xff\xd7\x02\xf9\x02\xfe\xff\ +\xd7\x02\xf9\x03\x09\xffq\x02\xf9\x03\x0a\xff\xd7\x02\xf9\x03\ +\x0b\xffq\x02\xf9\x03\x0c\xff\xd7\x02\xf9\x03\x11\xff\x9a\x02\ +\xf9\x03\x12\xff\xae\x02\xf9\x03\x15\xff\xec\x02\xf9\x03\x16\xff\ +\xd7\x02\xf9\x03\x1a\xff\xd7\x02\xf9\x03\x1b\xff\x9a\x02\xf9\x03\ +\x1c\xff\xae\x02\xfa\x00\x0f\xff\xae\x02\xfa\x00\x11\xff\xae\x02\ +\xfa\x01\xce\xff\xd7\x02\xfa\x01\xd5\xff\xd7\x02\xfa\x01\xf2\xff\ +\xd7\x02\xfa\x02\x08\xff\xae\x02\xfa\x02\x0c\xff\xae\x02\xfa\x02\ +s\xff\xd7\x02\xfa\x02\xcf\xff\xd7\x02\xfa\x03\x12\xff\xd7\x02\ +\xfa\x03\x1c\xff\xd7\x02\xfb\x00\x0f\xff\x85\x02\xfb\x00\x11\xff\ +\x85\x02\xfb\x01\x9f\xff\xec\x02\xfb\x01\xa4\xff\x9a\x02\xfb\x01\ +\xaa\xffq\x02\xfb\x01\xae\xff\x9a\x02\xfb\x01\xb5\xff\x9a\x02\ +\xfb\x01\xb8\xff\xec\x02\xfb\x01\xbb\xff\xec\x02\xfb\x01\xbe\xff\ +\xc3\x02\xfb\x01\xc9\xff\xec\x02\xfb\x01\xce\xff\xae\x02\xfb\x01\ +\xcf\xff\xd7\x02\xfb\x01\xd5\xff\xae\x02\xfb\x01\xd8\xff\xd7\x02\ +\xfb\x01\xdb\xff\xd7\x02\xfb\x01\xde\xff\xd7\x02\xfb\x01\xe1\xff\ +\xd7\x02\xfb\x01\xea\xff\xd7\x02\xfb\x01\xeb\x00f\x02\xfb\x01\ +\xed\xff\xd7\x02\xfb\x01\xee\xff\xec\x02\xfb\x01\xf2\xff\xae\x02\ +\xfb\x01\xf4\x00f\x02\xfb\x02\x08\xff\x85\x02\xfb\x02\x0c\xff\ +\x85\x02\xfb\x02j\xff\xd7\x02\xfb\x02l\xff\xec\x02\xfb\x02\ +r\xffq\x02\xfb\x02s\xff\xae\x02\xfb\x02~\xff\xec\x02\ +\xfb\x02\x7f\xff\xd7\x02\xfb\x02\x84\xff\xec\x02\xfb\x02\x85\xff\ +\xd7\x02\xfb\x02\x86\xff\xec\x02\xfb\x02\x87\xff\xd7\x02\xfb\x02\ +\x88\xff\xec\x02\xfb\x02\x89\xff\xd7\x02\xfb\x02\x8a\xff\xec\x02\ +\xfb\x02\x8c\xff\xec\x02\xfb\x02\x8d\xff\xd7\x02\xfb\x02\x98\x00\ +f\x02\xfb\x02\xa8\x00f\x02\xfb\x02\xb1\xff\xec\x02\xfb\x02\ +\xb2\xff\xd7\x02\xfb\x02\xb3\xff\xec\x02\xfb\x02\xb4\xff\xd7\x02\ +\xfb\x02\xc0\xff\xd7\x02\xfb\x02\xc2\xff\xd7\x02\xfb\x02\xc5\xff\ +\xd7\x02\xfb\x02\xc6\xff\xc3\x02\xfb\x02\xc7\xff\xd7\x02\xfb\x02\ +\xc8\xff\xc3\x02\xfb\x02\xce\xff\x9a\x02\xfb\x02\xcf\xff\xae\x02\ +\xfb\x02\xd5\xff\xd7\x02\xfb\x02\xd9\xffq\x02\xfb\x02\xdb\xff\ +q\x02\xfb\x02\xdd\xffq\x02\xfb\x02\xe0\xff\xd7\x02\xfb\x02\ +\xef\xff\xec\x02\xfb\x02\xf0\xff\xd7\x02\xfb\x02\xf1\xff\xec\x02\ +\xfb\x02\xf2\xff\xd7\x02\xfb\x02\xf3\xff\xec\x02\xfb\x02\xf4\xff\ +\xd7\x02\xfb\x02\xfe\xff\xd7\x02\xfb\x03\x09\xffq\x02\xfb\x03\ +\x0a\xff\xd7\x02\xfb\x03\x0b\xffq\x02\xfb\x03\x0c\xff\xd7\x02\ +\xfb\x03\x11\xff\x9a\x02\xfb\x03\x12\xff\xae\x02\xfb\x03\x15\xff\ +\xec\x02\xfb\x03\x16\xff\xd7\x02\xfb\x03\x1a\xff\xd7\x02\xfb\x03\ +\x1b\xff\x9a\x02\xfb\x03\x1c\xff\xae\x02\xfc\x00\x0f\xff\xae\x02\ +\xfc\x00\x11\xff\xae\x02\xfc\x01\xce\xff\xd7\x02\xfc\x01\xd5\xff\ +\xd7\x02\xfc\x01\xf2\xff\xd7\x02\xfc\x02\x08\xff\xae\x02\xfc\x02\ +\x0c\xff\xae\x02\xfc\x02s\xff\xd7\x02\xfc\x02\xcf\xff\xd7\x02\ +\xfc\x03\x12\xff\xd7\x02\xfc\x03\x1c\xff\xd7\x02\xff\x00\x0f\xff\ +\x85\x02\xff\x00\x10\xff\xae\x02\xff\x00\x11\xff\x85\x02\xff\x01\ +\x9f\xff\xd7\x02\xff\x01\xa4\xff\x9a\x02\xff\x01\xaa\xffq\x02\ +\xff\x01\xae\xff\x9a\x02\xff\x01\xb5\xff\x9a\x02\xff\x01\xb8\xff\ +\xd7\x02\xff\x01\xbb\xff\xd7\x02\xff\x01\xbc\x00)\x02\xff\x01\ +\xbe\xff\xae\x02\xff\x01\xcc\xff\x9a\x02\xff\x01\xcd\xff\x9a\x02\ +\xff\x01\xce\xff\x85\x02\xff\x01\xcf\xffq\x02\xff\x01\xd0\xff\ +\xd7\x02\xff\x01\xd1\xff\xd7\x02\xff\x01\xd2\xff\x9a\x02\xff\x01\ +\xd3\xff\x9a\x02\xff\x01\xd4\xff\x9a\x02\xff\x01\xd5\xff\x85\x02\ +\xff\x01\xd6\xff\x9a\x02\xff\x01\xd7\xff\x9a\x02\xff\x01\xd8\xff\ +q\x02\xff\x01\xd9\xff\x9a\x02\xff\x01\xda\xff\x9a\x02\xff\x01\ +\xdb\xffq\x02\xff\x01\xdc\xff\xae\x02\xff\x01\xdd\xff\xae\x02\ +\xff\x01\xde\xffq\x02\xff\x01\xdf\xff\xd7\x02\xff\x01\xe0\xff\ +\x9a\x02\xff\x01\xe1\xff\x9a\x02\xff\x01\xe2\xff\x9a\x02\xff\x01\ +\xe3\xff\x9a\x02\xff\x01\xe4\xff\xae\x02\xff\x01\xe5\xff\x9a\x02\ +\xff\x01\xe6\xff\x9a\x02\xff\x01\xe7\xff\xd7\x02\xff\x01\xe8\xff\ +\x9a\x02\xff\x01\xe9\xff\xc3\x02\xff\x01\xea\xffq\x02\xff\x01\ +\xec\xff\x9a\x02\xff\x01\xed\xffq\x02\xff\x01\xee\xff\x85\x02\ +\xff\x01\xf2\xff\x85\x02\xff\x01\xf3\xff\x9a\x02\xff\x01\xf5\xff\ +\x9a\x02\xff\x01\xf6\xff\xae\x02\xff\x01\xf7\xff\x9a\x02\xff\x01\ +\xf9\xff\x9a\x02\xff\x02\x02\xff\xae\x02\xff\x02\x03\xff\xae\x02\ +\xff\x02\x04\xff\xae\x02\xff\x02\x08\xff\x85\x02\xff\x02\x0c\xff\ +\x85\x02\xff\x02j\xffq\x02\xff\x02k\xff\x9a\x02\xff\x02\ +l\xff\xd7\x02\xff\x02m\xff\xd7\x02\xff\x02q\xff\x9a\x02\ +\xff\x02r\xffq\x02\xff\x02s\xff\x85\x02\xff\x02u\xff\ +\x9a\x02\xff\x02w\xff\x9a\x02\xff\x02y\xff\x9a\x02\xff\x02\ +}\xff\x9a\x02\xff\x02~\xff\xd7\x02\xff\x02\x7f\xffq\x02\ +\xff\x02\x81\xff\xd7\x02\xff\x02\x83\xff\xd7\x02\xff\x02\x84\xff\ +\xd7\x02\xff\x02\x85\xffq\x02\xff\x02\x86\xff\xd7\x02\xff\x02\ +\x87\xffq\x02\xff\x02\x88\xff\xd7\x02\xff\x02\x89\xffq\x02\ +\xff\x02\x8a\xff\xd7\x02\xff\x02\x8b\xff\xd7\x02\xff\x02\x8c\xff\ +\xd7\x02\xff\x02\x8d\xffq\x02\xff\x02\x96\xff\x9a\x02\xff\x02\ +\x9a\xff\x9a\x02\xff\x02\x9e\xff\x9a\x02\xff\x02\xa0\xff\xd7\x02\ +\xff\x02\xa2\xff\xd7\x02\xff\x02\xa4\xff\x9a\x02\xff\x02\xa6\xff\ +\x9a\x02\xff\x02\xaa\xff\xae\x02\xff\x02\xac\xff\x9a\x02\xff\x02\ +\xae\xff\x9a\x02\xff\x02\xb0\xff\x9a\x02\xff\x02\xb1\xff\xd7\x02\ +\xff\x02\xb2\xffq\x02\xff\x02\xb3\xff\xd7\x02\xff\x02\xb4\xff\ +q\x02\xff\x02\xb5\x00)\x02\xff\x02\xb6\xff\xae\x02\xff\x02\ +\xb8\xff\xae\x02\xff\x02\xba\xff\xae\x02\xff\x02\xbc\xff\xd7\x02\ +\xff\x02\xbe\xff\xae\x02\xff\x02\xc0\xff\x9a\x02\xff\x02\xc2\xff\ +\x9a\x02\xff\x02\xc4\xff\x9a\x02\xff\x02\xc5\xff\x9a\x02\xff\x02\ +\xc6\xffq\x02\xff\x02\xc7\xff\x9a\x02\xff\x02\xc8\xffq\x02\ +\xff\x02\xcb\xff\xd7\x02\xff\x02\xcd\xff\x9a\x02\xff\x02\xce\xff\ +\x9a\x02\xff\x02\xcf\xff\x85\x02\xff\x02\xd1\xff\x9a\x02\xff\x02\ +\xd3\xff\x9a\x02\xff\x02\xd5\xff\x9a\x02\xff\x02\xd7\xff\x9a\x02\ +\xff\x02\xd9\xffq\x02\xff\x02\xdb\xffq\x02\xff\x02\xdd\xff\ +q\x02\xff\x02\xe0\xffq\x02\xff\x02\xe6\xff\xd7\x02\xff\x02\ +\xe8\xff\xd7\x02\xff\x02\xea\xff\xc3\x02\xff\x02\xec\xff\x9a\x02\ +\xff\x02\xee\xff\x9a\x02\xff\x02\xef\xff\xd7\x02\xff\x02\xf0\xff\ +q\x02\xff\x02\xf1\xff\xd7\x02\xff\x02\xf2\xffq\x02\xff\x02\ +\xf3\xff\xd7\x02\xff\x02\xf4\xffq\x02\xff\x02\xf6\xff\xd7\x02\ +\xff\x02\xf8\xff\xae\x02\xff\x02\xfa\xff\xae\x02\xff\x02\xfc\xff\ +\xae\x02\xff\x02\xfe\xff\x9a\x02\xff\x03\x00\xff\x9a\x02\xff\x03\ +\x02\xff\x9a\x02\xff\x03\x06\xff\xd7\x02\xff\x03\x08\xff\xd7\x02\ +\xff\x03\x09\xffq\x02\xff\x03\x0a\xffq\x02\xff\x03\x0b\xff\ +q\x02\xff\x03\x0c\xffq\x02\xff\x03\x0e\xff\x9a\x02\xff\x03\ +\x10\xff\x9a\x02\xff\x03\x11\xff\x9a\x02\xff\x03\x12\xff\x85\x02\ +\xff\x03\x14\xff\x9a\x02\xff\x03\x15\xff\xd7\x02\xff\x03\x16\xff\ +q\x02\xff\x03\x18\xff\xae\x02\xff\x03\x1a\xffq\x02\xff\x03\ +\x1b\xff\x9a\x02\xff\x03\x1c\xff\x85\x03\x00\x00\x0f\xff\x9a\x03\ +\x00\x00\x10\xff\xd7\x03\x00\x00\x11\xff\x9a\x03\x00\x01\xce\xff\ +\xc3\x03\x00\x01\xcf\xff\xec\x03\x00\x01\xd5\xff\xc3\x03\x00\x01\ +\xd8\xff\xec\x03\x00\x01\xdb\xff\xec\x03\x00\x01\xde\xff\xec\x03\ +\x00\x01\xea\xff\xec\x03\x00\x01\xed\xff\xec\x03\x00\x01\xf2\xff\ +\xc3\x03\x00\x02\x02\xff\xd7\x03\x00\x02\x03\xff\xd7\x03\x00\x02\ +\x04\xff\xd7\x03\x00\x02\x08\xff\x9a\x03\x00\x02\x0c\xff\x9a\x03\ +\x00\x02j\xff\xec\x03\x00\x02s\xff\xc3\x03\x00\x02\x7f\xff\ +\xec\x03\x00\x02\x85\xff\xec\x03\x00\x02\x87\xff\xec\x03\x00\x02\ +\x89\xff\xec\x03\x00\x02\x8d\xff\xec\x03\x00\x02\xb2\xff\xec\x03\ +\x00\x02\xb4\xff\xec\x03\x00\x02\xcf\xff\xc3\x03\x00\x02\xe0\xff\ +\xec\x03\x00\x02\xf0\xff\xec\x03\x00\x02\xf2\xff\xec\x03\x00\x02\ +\xf4\xff\xec\x03\x00\x03\x0a\xff\xec\x03\x00\x03\x0c\xff\xec\x03\ +\x00\x03\x12\xff\xc3\x03\x00\x03\x16\xff\xec\x03\x00\x03\x1a\xff\ +\xec\x03\x00\x03\x1c\xff\xc3\x03\x03\x00\x0f\xff\x9a\x03\x03\x00\ +\x10\xff\xd7\x03\x03\x00\x11\xff\x9a\x03\x03\x01\x9d\x00)\x03\ +\x03\x01\x9f\xff\xd7\x03\x03\x01\xa4\xff\xae\x03\x03\x01\xa6\x00\ +)\x03\x03\x01\xaa\xff\x85\x03\x03\x01\xae\xff\xae\x03\x03\x01\ +\xb5\xff\xae\x03\x03\x01\xb8\xff\xd7\x03\x03\x01\xbb\xff\xd7\x03\ +\x03\x01\xbc\x00)\x03\x03\x01\xbe\xff\xc3\x03\x03\x01\xc4\x00\ +)\x03\x03\x01\xcc\xff\xc3\x03\x03\x01\xcd\xff\xc3\x03\x03\x01\ +\xce\xff\x9a\x03\x03\x01\xcf\xff\xae\x03\x03\x01\xd0\xff\xd7\x03\ +\x03\x01\xd1\xff\xd7\x03\x03\x01\xd2\xff\xc3\x03\x03\x01\xd3\xff\ +\xc3\x03\x03\x01\xd4\xff\xc3\x03\x03\x01\xd5\xff\x9a\x03\x03\x01\ +\xd6\xff\xc3\x03\x03\x01\xd7\xff\xc3\x03\x03\x01\xd8\xff\xae\x03\ +\x03\x01\xd9\xff\xc3\x03\x03\x01\xda\xff\xc3\x03\x03\x01\xdb\xff\ +\xae\x03\x03\x01\xde\xff\xae\x03\x03\x01\xdf\xff\xd7\x03\x03\x01\ +\xe0\xff\xc3\x03\x03\x01\xe1\xff\x9a\x03\x03\x01\xe2\xff\xc3\x03\ +\x03\x01\xe3\xff\xc3\x03\x03\x01\xe5\xff\xc3\x03\x03\x01\xe6\xff\ +\xc3\x03\x03\x01\xe7\xff\xd7\x03\x03\x01\xe8\xff\xc3\x03\x03\x01\ +\xea\xff\xae\x03\x03\x01\xeb\x00)\x03\x03\x01\xec\xff\xc3\x03\ +\x03\x01\xed\xff\xae\x03\x03\x01\xee\xff\xc3\x03\x03\x01\xf2\xff\ +\x9a\x03\x03\x01\xf3\xff\xc3\x03\x03\x01\xf4\x00)\x03\x03\x01\ +\xf5\xff\xc3\x03\x03\x01\xf7\xff\xc3\x03\x03\x01\xf9\xff\xc3\x03\ +\x03\x02\x02\xff\xd7\x03\x03\x02\x03\xff\xd7\x03\x03\x02\x04\xff\ +\xd7\x03\x03\x02\x08\xff\x9a\x03\x03\x02\x0c\xff\x9a\x03\x03\x02\ +j\xff\xae\x03\x03\x02k\xff\xc3\x03\x03\x02l\xff\xd7\x03\ +\x03\x02q\xff\xc3\x03\x03\x02r\xff\x85\x03\x03\x02s\xff\ +\x9a\x03\x03\x02u\xff\xc3\x03\x03\x02w\xff\xd7\x03\x03\x02\ +y\xff\xc3\x03\x03\x02}\xff\xc3\x03\x03\x02~\xff\xd7\x03\ +\x03\x02\x7f\xff\xae\x03\x03\x02\x84\xff\xd7\x03\x03\x02\x85\xff\ +\xae\x03\x03\x02\x86\xff\xd7\x03\x03\x02\x87\xff\xae\x03\x03\x02\ +\x88\xff\xd7\x03\x03\x02\x89\xff\xae\x03\x03\x02\x8a\xff\xd7\x03\ +\x03\x02\x8c\xff\xd7\x03\x03\x02\x8d\xff\xae\x03\x03\x02\x96\xff\ +\xc3\x03\x03\x02\x98\x00)\x03\x03\x02\x9a\xff\xc3\x03\x03\x02\ +\x9e\xff\xc3\x03\x03\x02\xa0\xff\xd7\x03\x03\x02\xa2\xff\xd7\x03\ +\x03\x02\xa4\xff\xc3\x03\x03\x02\xa6\xff\xc3\x03\x03\x02\xa8\x00\ +)\x03\x03\x02\xa9\x00)\x03\x03\x02\xac\xff\xc3\x03\x03\x02\ +\xae\xff\xc3\x03\x03\x02\xb0\xff\xc3\x03\x03\x02\xb1\xff\xd7\x03\ +\x03\x02\xb2\xff\xae\x03\x03\x02\xb3\xff\xd7\x03\x03\x02\xb4\xff\ +\xae\x03\x03\x02\xb5\x00)\x03\x03\x02\xbc\xff\xd7\x03\x03\x02\ +\xbd\x00)\x03\x03\x02\xc0\xff\x9a\x03\x03\x02\xc2\xff\x9a\x03\ +\x03\x02\xc4\xff\xc3\x03\x03\x02\xc5\xff\xd7\x03\x03\x02\xc6\xff\ +\xc3\x03\x03\x02\xc7\xff\xd7\x03\x03\x02\xc8\xff\xc3\x03\x03\x02\ +\xcb\xff\xd7\x03\x03\x02\xcd\xff\xc3\x03\x03\x02\xce\xff\xae\x03\ +\x03\x02\xcf\xff\x9a\x03\x03\x02\xd1\xff\xc3\x03\x03\x02\xd3\xff\ +\xc3\x03\x03\x02\xd5\xff\x9a\x03\x03\x02\xd7\xff\xc3\x03\x03\x02\ +\xd9\xff\x85\x03\x03\x02\xdb\xff\x85\x03\x03\x02\xdd\xff\x85\x03\ +\x03\x02\xe0\xff\xae\x03\x03\x02\xe6\xff\xd7\x03\x03\x02\xe8\xff\ +\xd7\x03\x03\x02\xec\xff\xc3\x03\x03\x02\xee\xff\xc3\x03\x03\x02\ +\xef\xff\xd7\x03\x03\x02\xf0\xff\xae\x03\x03\x02\xf1\xff\xd7\x03\ +\x03\x02\xf2\xff\xae\x03\x03\x02\xf3\xff\xd7\x03\x03\x02\xf4\xff\ +\xae\x03\x03\x02\xf6\xff\xd7\x03\x03\x02\xfe\xff\x9a\x03\x03\x03\ +\x00\xff\xc3\x03\x03\x03\x02\xff\xc3\x03\x03\x03\x06\xff\xd7\x03\ +\x03\x03\x08\xff\xd7\x03\x03\x03\x09\xff\x9a\x03\x03\x03\x0a\xff\ +\xae\x03\x03\x03\x0b\xff\x9a\x03\x03\x03\x0c\xff\xae\x03\x03\x03\ +\x0e\xff\xd7\x03\x03\x03\x10\xff\xd7\x03\x03\x03\x11\xff\xae\x03\ +\x03\x03\x12\xff\x9a\x03\x03\x03\x14\xff\xc3\x03\x03\x03\x15\xff\ +\xd7\x03\x03\x03\x16\xff\xae\x03\x03\x03\x17\x00)\x03\x03\x03\ +\x1a\xff\xae\x03\x03\x03\x1b\xff\xae\x03\x03\x03\x1c\xff\x9a\x03\ +\x04\x00\x0f\xff\xc3\x03\x04\x00\x11\xff\xc3\x03\x04\x01\xce\xff\ +\xc3\x03\x04\x01\xcf\xff\xd7\x03\x04\x01\xd5\xff\xc3\x03\x04\x01\ +\xd8\xff\xd7\x03\x04\x01\xdb\xff\xd7\x03\x04\x01\xde\xff\xd7\x03\ +\x04\x01\xea\xff\xd7\x03\x04\x01\xed\xff\xd7\x03\x04\x01\xf2\xff\ +\xc3\x03\x04\x02\x08\xff\xc3\x03\x04\x02\x0c\xff\xc3\x03\x04\x02\ +j\xff\xd7\x03\x04\x02s\xff\xc3\x03\x04\x02\x7f\xff\xd7\x03\ +\x04\x02\x85\xff\xd7\x03\x04\x02\x87\xff\xd7\x03\x04\x02\x89\xff\ +\xd7\x03\x04\x02\x8d\xff\xd7\x03\x04\x02\xb2\xff\xd7\x03\x04\x02\ +\xb4\xff\xd7\x03\x04\x02\xcf\xff\xc3\x03\x04\x02\xe0\xff\xd7\x03\ +\x04\x02\xf0\xff\xd7\x03\x04\x02\xf2\xff\xd7\x03\x04\x02\xf4\xff\ +\xd7\x03\x04\x03\x0a\xff\xd7\x03\x04\x03\x0c\xff\xd7\x03\x04\x03\ +\x12\xff\xc3\x03\x04\x03\x16\xff\xd7\x03\x04\x03\x1a\xff\xd7\x03\ +\x04\x03\x1c\xff\xc3\x03\x05\x01\x9f\xff\xd7\x03\x05\x01\xa3\x00\ +\xe1\x03\x05\x01\xb8\xff\xd7\x03\x05\x01\xbb\xff\xd7\x03\x05\x01\ +\xbe\xff\xc3\x03\x05\x01\xdc\xff\xd7\x03\x05\x01\xe1\xff\xae\x03\ +\x05\x01\xe4\xff\xd7\x03\x05\x02l\xff\xd7\x03\x05\x02{\x00\ +=\x03\x05\x02}\xff\xec\x03\x05\x02~\xff\xd7\x03\x05\x02\ +\x84\xff\xd7\x03\x05\x02\x86\xff\xd7\x03\x05\x02\x88\xff\xd7\x03\ +\x05\x02\x8a\xff\xd7\x03\x05\x02\x8c\xff\xd7\x03\x05\x02\xaa\xff\ +\xd7\x03\x05\x02\xb1\xff\xd7\x03\x05\x02\xb3\xff\xd7\x03\x05\x02\ +\xb6\xff\xd7\x03\x05\x02\xbe\xff\xd7\x03\x05\x02\xc0\xff\xae\x03\ +\x05\x02\xc2\xff\xae\x03\x05\x02\xc5\xff\xc3\x03\x05\x02\xc6\xff\ +\xd7\x03\x05\x02\xc7\xff\xc3\x03\x05\x02\xc8\xff\xd7\x03\x05\x02\ +\xd5\xff\xae\x03\x05\x02\xef\xff\xd7\x03\x05\x02\xf1\xff\xd7\x03\ +\x05\x02\xf3\xff\xd7\x03\x05\x02\xfe\xff\xae\x03\x05\x03\x0e\xff\ +\xd7\x03\x05\x03\x10\xff\xd7\x03\x05\x03\x15\xff\xd7\x03\x05\x03\ +\x18\xff\xd7\x03\x06\x01\xcf\xff\xec\x03\x06\x01\xd8\xff\xec\x03\ +\x06\x01\xdb\xff\xec\x03\x06\x01\xde\xff\xec\x03\x06\x01\xe1\xff\ +\xec\x03\x06\x01\xea\xff\xec\x03\x06\x01\xed\xff\xec\x03\x06\x02\ +j\xff\xec\x03\x06\x02\x7f\xff\xec\x03\x06\x02\x85\xff\xec\x03\ +\x06\x02\x87\xff\xec\x03\x06\x02\x89\xff\xec\x03\x06\x02\x8d\xff\ +\xec\x03\x06\x02\xb2\xff\xec\x03\x06\x02\xb4\xff\xec\x03\x06\x02\ +\xc0\xff\xec\x03\x06\x02\xc2\xff\xec\x03\x06\x02\xd5\xff\xec\x03\ +\x06\x02\xe0\xff\xec\x03\x06\x02\xf0\xff\xec\x03\x06\x02\xf2\xff\ +\xec\x03\x06\x02\xf4\xff\xec\x03\x06\x02\xfe\xff\xec\x03\x06\x03\ +\x0a\xff\xec\x03\x06\x03\x0c\xff\xec\x03\x06\x03\x0e\xff\xd7\x03\ +\x06\x03\x10\xff\xd7\x03\x06\x03\x16\xff\xec\x03\x06\x03\x1a\xff\ +\xec\x03\x07\x01\x9f\xff\xd7\x03\x07\x01\xb8\xff\xd7\x03\x07\x01\ +\xbb\xff\xd7\x03\x07\x01\xbe\xff\xd7\x03\x07\x01\xc1\xff\xd7\x03\ +\x07\x01\xe1\xff\xd7\x03\x07\x02l\xff\xd7\x03\x07\x02|\xff\ +\xd7\x03\x07\x02~\xff\xd7\x03\x07\x02\x84\xff\xd7\x03\x07\x02\ +\x86\xff\xd7\x03\x07\x02\x88\xff\xd7\x03\x07\x02\x8a\xff\xd7\x03\ +\x07\x02\x8c\xff\xd7\x03\x07\x02\xb1\xff\xd7\x03\x07\x02\xb3\xff\ +\xd7\x03\x07\x02\xbf\xff\xd7\x03\x07\x02\xc0\xff\xd7\x03\x07\x02\ +\xc1\xff\xd7\x03\x07\x02\xc2\xff\xd7\x03\x07\x02\xc5\xff\x9a\x03\ +\x07\x02\xc7\xff\x9a\x03\x07\x02\xd4\xff\xd7\x03\x07\x02\xd5\xff\ +\xd7\x03\x07\x02\xef\xff\xd7\x03\x07\x02\xf1\xff\xd7\x03\x07\x02\ +\xf3\xff\xd7\x03\x07\x02\xfd\xff\xd7\x03\x07\x02\xfe\xff\xd7\x03\ +\x07\x03\x09\xff\xd7\x03\x07\x03\x0b\xff\xd7\x03\x07\x03\x0e\xff\ +\xd7\x03\x07\x03\x10\xff\xd7\x03\x07\x03\x15\xff\xd7\x03\x07\x03\ +\x19\xff\xec\x03\x08\x01\xcf\xff\xec\x03\x08\x01\xd8\xff\xec\x03\ +\x08\x01\xdb\xff\xec\x03\x08\x01\xde\xff\xec\x03\x08\x01\xe1\xff\ +\xec\x03\x08\x01\xea\xff\xec\x03\x08\x01\xed\xff\xec\x03\x08\x02\ +j\xff\xec\x03\x08\x02\x7f\xff\xec\x03\x08\x02\x85\xff\xec\x03\ +\x08\x02\x87\xff\xec\x03\x08\x02\x89\xff\xec\x03\x08\x02\x8d\xff\ +\xec\x03\x08\x02\xb2\xff\xec\x03\x08\x02\xb4\xff\xec\x03\x08\x02\ +\xc0\xff\xec\x03\x08\x02\xc2\xff\xec\x03\x08\x02\xd5\xff\xec\x03\ +\x08\x02\xe0\xff\xec\x03\x08\x02\xf0\xff\xec\x03\x08\x02\xf2\xff\ +\xec\x03\x08\x02\xf4\xff\xec\x03\x08\x02\xfe\xff\xec\x03\x08\x03\ +\x0a\xff\xec\x03\x08\x03\x0c\xff\xec\x03\x08\x03\x0e\xff\xd7\x03\ +\x08\x03\x10\xff\xd7\x03\x08\x03\x16\xff\xec\x03\x08\x03\x1a\xff\ +\xec\x03\x0b\x00\x05\xff\x9a\x03\x0b\x00\x0a\xff\x9a\x03\x0b\x01\ +\x9d\xff\xae\x03\x0b\x01\xa6\xff\xae\x03\x0b\x01\xa8\xff\xc3\x03\ +\x0b\x01\xaa\xff\xc3\x03\x0b\x01\xb0\xff\xc3\x03\x0b\x01\xbc\xff\ +q\x03\x0b\x01\xbd\xff\xc3\x03\x0b\x01\xbf\xff\xc3\x03\x0b\x01\ +\xc1\xff\xc3\x03\x0b\x01\xc4\xff\xae\x03\x0b\x01\xd0\xff\xd7\x03\ +\x0b\x01\xdc\xff\xc3\x03\x0b\x01\xdf\xff\xd7\x03\x0b\x01\xe1\xff\ +\xd7\x03\x0b\x01\xe4\xff\xc3\x03\x0b\x02\x07\xff\x9a\x03\x0b\x02\ +\x0b\xff\x9a\x03\x0b\x02r\xff\xc3\x03\x0b\x02v\xff\xd7\x03\ +\x0b\x02|\xff\xc3\x03\x0b\x02\x80\xff\xc3\x03\x0b\x02\x82\xff\ +\xc3\x03\x0b\x02\x9f\xff\xc3\x03\x0b\x02\xa0\xff\xd7\x03\x0b\x02\ +\xa9\xff\xae\x03\x0b\x02\xaa\xff\xc3\x03\x0b\x02\xb5\xffq\x03\ +\x0b\x02\xb6\xff\xc3\x03\x0b\x02\xb7\xff\xc3\x03\x0b\x02\xb9\xff\ +\xc3\x03\x0b\x02\xbb\xff\xc3\x03\x0b\x02\xbc\xff\xd7\x03\x0b\x02\ +\xbd\xff\xae\x03\x0b\x02\xbe\xff\xc3\x03\x0b\x02\xbf\xff\xc3\x03\ +\x0b\x02\xc0\xff\xd7\x03\x0b\x02\xc1\xff\xc3\x03\x0b\x02\xc2\xff\ +\xd7\x03\x0b\x02\xca\xff\xc3\x03\x0b\x02\xcb\xff\xd7\x03\x0b\x02\ +\xd4\xff\xc3\x03\x0b\x02\xd5\xff\xd7\x03\x0b\x02\xd9\xff\xc3\x03\ +\x0b\x02\xdb\xff\xc3\x03\x0b\x02\xdd\xff\xc3\x03\x0b\x02\xe5\xff\ +\xc3\x03\x0b\x02\xe6\xff\xd7\x03\x0b\x02\xf7\xff\xc3\x03\x0b\x02\ +\xf9\xff\xc3\x03\x0b\x02\xfb\xff\xc3\x03\x0b\x02\xfd\xff\xc3\x03\ +\x0b\x02\xfe\xff\xd7\x03\x0b\x03\x05\xff\xc3\x03\x0b\x03\x06\xff\ +\xd7\x03\x0b\x03\x07\xff\xc3\x03\x0b\x03\x08\xff\xd7\x03\x0b\x03\ +\x0d\xff\xd7\x03\x0b\x03\x0e\xff\xd7\x03\x0b\x03\x0f\xff\xd7\x03\ +\x0b\x03\x10\xff\xd7\x03\x0b\x03\x17\xff\xae\x03\x0b\x03\x18\xff\ +\xc3\x03\x0c\x00\x05\xff\x9a\x03\x0c\x00\x0a\xff\x9a\x03\x0c\x01\ +\xd0\xff\xd7\x03\x0c\x01\xdc\xff\xc3\x03\x0c\x01\xdd\xff\xd7\x03\ +\x0c\x01\xdf\xff\xd7\x03\x0c\x01\xe1\xff\xd7\x03\x0c\x01\xe4\xff\ +\xc3\x03\x0c\x01\xf6\xff\xd7\x03\x0c\x02\x07\xff\x9a\x03\x0c\x02\ +\x0b\xff\x9a\x03\x0c\x02\xa0\xff\xd7\x03\x0c\x02\xaa\xff\xc3\x03\ +\x0c\x02\xb6\xff\xc3\x03\x0c\x02\xbc\xff\xd7\x03\x0c\x02\xbe\xff\ +\xc3\x03\x0c\x02\xc0\xff\xd7\x03\x0c\x02\xc2\xff\xd7\x03\x0c\x02\ +\xcb\xff\xd7\x03\x0c\x02\xd5\xff\xd7\x03\x0c\x02\xe6\xff\xd7\x03\ +\x0c\x02\xf8\xff\xd7\x03\x0c\x02\xfa\xff\xd7\x03\x0c\x02\xfc\xff\ +\xd7\x03\x0c\x02\xfe\xff\xd7\x03\x0c\x03\x06\xff\xd7\x03\x0c\x03\ +\x08\xff\xd7\x03\x0c\x03\x0e\xff\x9a\x03\x0c\x03\x10\xff\x9a\x03\ +\x0c\x03\x18\xff\xc3\x03\x0d\x00\x05\xff\x9a\x03\x0d\x00\x0a\xff\ +\x9a\x03\x0d\x01\x9d\xff\xae\x03\x0d\x01\xa6\xff\xae\x03\x0d\x01\ +\xa8\xff\xc3\x03\x0d\x01\xaa\xff\xc3\x03\x0d\x01\xb0\xff\xc3\x03\ +\x0d\x01\xbc\xffq\x03\x0d\x01\xbd\xff\xc3\x03\x0d\x01\xbf\xff\ +\xc3\x03\x0d\x01\xc1\xff\xc3\x03\x0d\x01\xc4\xff\xae\x03\x0d\x01\ +\xd0\xff\xd7\x03\x0d\x01\xdc\xff\xc3\x03\x0d\x01\xdf\xff\xd7\x03\ +\x0d\x01\xe1\xff\xd7\x03\x0d\x01\xe4\xff\xc3\x03\x0d\x02\x07\xff\ +\x9a\x03\x0d\x02\x0b\xff\x9a\x03\x0d\x02r\xff\xc3\x03\x0d\x02\ +v\xff\xd7\x03\x0d\x02|\xff\xc3\x03\x0d\x02\x80\xff\xc3\x03\ +\x0d\x02\x82\xff\xc3\x03\x0d\x02\x9f\xff\xc3\x03\x0d\x02\xa0\xff\ +\xd7\x03\x0d\x02\xa9\xff\xae\x03\x0d\x02\xaa\xff\xc3\x03\x0d\x02\ +\xb5\xffq\x03\x0d\x02\xb6\xff\xc3\x03\x0d\x02\xb7\xff\xc3\x03\ +\x0d\x02\xb9\xff\xc3\x03\x0d\x02\xbb\xff\xc3\x03\x0d\x02\xbc\xff\ +\xd7\x03\x0d\x02\xbd\xff\xae\x03\x0d\x02\xbe\xff\xc3\x03\x0d\x02\ +\xbf\xff\xc3\x03\x0d\x02\xc0\xff\xd7\x03\x0d\x02\xc1\xff\xc3\x03\ +\x0d\x02\xc2\xff\xd7\x03\x0d\x02\xca\xff\xc3\x03\x0d\x02\xcb\xff\ +\xd7\x03\x0d\x02\xd4\xff\xc3\x03\x0d\x02\xd5\xff\xd7\x03\x0d\x02\ +\xd9\xff\xc3\x03\x0d\x02\xdb\xff\xc3\x03\x0d\x02\xdd\xff\xc3\x03\ +\x0d\x02\xe5\xff\xc3\x03\x0d\x02\xe6\xff\xd7\x03\x0d\x02\xf7\xff\ +\xc3\x03\x0d\x02\xf9\xff\xc3\x03\x0d\x02\xfb\xff\xc3\x03\x0d\x02\ +\xfd\xff\xc3\x03\x0d\x02\xfe\xff\xd7\x03\x0d\x03\x05\xff\xc3\x03\ +\x0d\x03\x06\xff\xd7\x03\x0d\x03\x07\xff\xc3\x03\x0d\x03\x08\xff\ +\xd7\x03\x0d\x03\x0d\xff\xd7\x03\x0d\x03\x0e\xff\xd7\x03\x0d\x03\ +\x0f\xff\xd7\x03\x0d\x03\x10\xff\xd7\x03\x0d\x03\x17\xff\xae\x03\ +\x0d\x03\x18\xff\xc3\x03\x0e\x00\x05\xff\x9a\x03\x0e\x00\x0a\xff\ +\x9a\x03\x0e\x01\xd0\xff\xd7\x03\x0e\x01\xdc\xff\xc3\x03\x0e\x01\ +\xdd\xff\xd7\x03\x0e\x01\xdf\xff\xd7\x03\x0e\x01\xe1\xff\xd7\x03\ +\x0e\x01\xe4\xff\xc3\x03\x0e\x01\xf6\xff\xd7\x03\x0e\x02\x07\xff\ +\x9a\x03\x0e\x02\x0b\xff\x9a\x03\x0e\x02\xa0\xff\xd7\x03\x0e\x02\ +\xaa\xff\xc3\x03\x0e\x02\xb6\xff\xc3\x03\x0e\x02\xbc\xff\xd7\x03\ +\x0e\x02\xbe\xff\xc3\x03\x0e\x02\xc0\xff\xd7\x03\x0e\x02\xc2\xff\ +\xd7\x03\x0e\x02\xcb\xff\xd7\x03\x0e\x02\xd5\xff\xd7\x03\x0e\x02\ +\xe6\xff\xd7\x03\x0e\x02\xf8\xff\xd7\x03\x0e\x02\xfa\xff\xd7\x03\ +\x0e\x02\xfc\xff\xd7\x03\x0e\x02\xfe\xff\xd7\x03\x0e\x03\x06\xff\ +\xd7\x03\x0e\x03\x08\xff\xd7\x03\x0e\x03\x0e\xff\x9a\x03\x0e\x03\ +\x10\xff\x9a\x03\x0e\x03\x18\xff\xc3\x03\x0f\x01\xa3\x00\xe1\x03\ +\x0f\x02\xea\x00)\x03\x0f\x03\x0e\xff\xd7\x03\x0f\x03\x10\xff\ +\xd7\x03\x10\x00\x05\xff\xec\x03\x10\x00\x0a\xff\xec\x03\x10\x02\ +\x07\xff\xec\x03\x10\x02\x0b\xff\xec\x03\x11\x00\x05\xff\x9a\x03\ +\x11\x00\x0a\xff\x9a\x03\x11\x01\x9d\xff\xae\x03\x11\x01\xa6\xff\ +\xae\x03\x11\x01\xa8\xff\xc3\x03\x11\x01\xaa\xff\xc3\x03\x11\x01\ +\xb0\xff\xc3\x03\x11\x01\xbc\xffq\x03\x11\x01\xbd\xff\xc3\x03\ +\x11\x01\xbf\xff\xc3\x03\x11\x01\xc1\xff\xc3\x03\x11\x01\xc4\xff\ +\xae\x03\x11\x01\xd0\xff\xd7\x03\x11\x01\xdc\xff\xc3\x03\x11\x01\ +\xdf\xff\xd7\x03\x11\x01\xe1\xff\xd7\x03\x11\x01\xe4\xff\xc3\x03\ +\x11\x02\x07\xff\x9a\x03\x11\x02\x0b\xff\x9a\x03\x11\x02r\xff\ +\xc3\x03\x11\x02v\xff\xd7\x03\x11\x02|\xff\xc3\x03\x11\x02\ +\x80\xff\xc3\x03\x11\x02\x82\xff\xc3\x03\x11\x02\x9f\xff\xc3\x03\ +\x11\x02\xa0\xff\xd7\x03\x11\x02\xa9\xff\xae\x03\x11\x02\xaa\xff\ +\xc3\x03\x11\x02\xb5\xffq\x03\x11\x02\xb6\xff\xc3\x03\x11\x02\ +\xb7\xff\xc3\x03\x11\x02\xb9\xff\xc3\x03\x11\x02\xbb\xff\xc3\x03\ +\x11\x02\xbc\xff\xd7\x03\x11\x02\xbd\xff\xae\x03\x11\x02\xbe\xff\ +\xc3\x03\x11\x02\xbf\xff\xc3\x03\x11\x02\xc0\xff\xd7\x03\x11\x02\ +\xc1\xff\xc3\x03\x11\x02\xc2\xff\xd7\x03\x11\x02\xca\xff\xc3\x03\ +\x11\x02\xcb\xff\xd7\x03\x11\x02\xd4\xff\xc3\x03\x11\x02\xd5\xff\ +\xd7\x03\x11\x02\xd9\xff\xc3\x03\x11\x02\xdb\xff\xc3\x03\x11\x02\ +\xdd\xff\xc3\x03\x11\x02\xe5\xff\xc3\x03\x11\x02\xe6\xff\xd7\x03\ +\x11\x02\xf7\xff\xc3\x03\x11\x02\xf9\xff\xc3\x03\x11\x02\xfb\xff\ +\xc3\x03\x11\x02\xfd\xff\xc3\x03\x11\x02\xfe\xff\xd7\x03\x11\x03\ +\x05\xff\xc3\x03\x11\x03\x06\xff\xd7\x03\x11\x03\x07\xff\xc3\x03\ +\x11\x03\x08\xff\xd7\x03\x11\x03\x0d\xff\xd7\x03\x11\x03\x0e\xff\ +\xd7\x03\x11\x03\x0f\xff\xd7\x03\x11\x03\x10\xff\xd7\x03\x11\x03\ +\x17\xff\xae\x03\x11\x03\x18\xff\xc3\x03\x12\x00\x05\xff\x9a\x03\ +\x12\x00\x0a\xff\x9a\x03\x12\x01\xd0\xff\xd7\x03\x12\x01\xdc\xff\ +\xc3\x03\x12\x01\xdd\xff\xd7\x03\x12\x01\xdf\xff\xd7\x03\x12\x01\ +\xe1\xff\xd7\x03\x12\x01\xe4\xff\xc3\x03\x12\x01\xf6\xff\xd7\x03\ +\x12\x02\x07\xff\x9a\x03\x12\x02\x0b\xff\x9a\x03\x12\x02\xa0\xff\ +\xd7\x03\x12\x02\xaa\xff\xc3\x03\x12\x02\xb6\xff\xc3\x03\x12\x02\ +\xbc\xff\xd7\x03\x12\x02\xbe\xff\xc3\x03\x12\x02\xc0\xff\xd7\x03\ +\x12\x02\xc2\xff\xd7\x03\x12\x02\xcb\xff\xd7\x03\x12\x02\xd5\xff\ +\xd7\x03\x12\x02\xe6\xff\xd7\x03\x12\x02\xf8\xff\xd7\x03\x12\x02\ +\xfa\xff\xd7\x03\x12\x02\xfc\xff\xd7\x03\x12\x02\xfe\xff\xd7\x03\ +\x12\x03\x06\xff\xd7\x03\x12\x03\x08\xff\xd7\x03\x12\x03\x0e\xff\ +\x9a\x03\x12\x03\x10\xff\x9a\x03\x12\x03\x18\xff\xc3\x03\x13\x00\ +\x05\xff\x9a\x03\x13\x00\x0a\xff\x9a\x03\x13\x01\x9d\xff\xae\x03\ +\x13\x01\xa6\xff\xae\x03\x13\x01\xa8\xff\xc3\x03\x13\x01\xaa\xff\ +\xc3\x03\x13\x01\xb0\xff\xc3\x03\x13\x01\xbc\xffq\x03\x13\x01\ +\xbd\xff\xc3\x03\x13\x01\xbf\xff\xc3\x03\x13\x01\xc1\xff\xc3\x03\ +\x13\x01\xc4\xff\xae\x03\x13\x01\xd0\xff\xd7\x03\x13\x01\xdc\xff\ +\xc3\x03\x13\x01\xdf\xff\xd7\x03\x13\x01\xe1\xff\xd7\x03\x13\x01\ +\xe4\xff\xc3\x03\x13\x02\x07\xff\x9a\x03\x13\x02\x0b\xff\x9a\x03\ +\x13\x02r\xff\xc3\x03\x13\x02v\xff\xd7\x03\x13\x02|\xff\ +\xc3\x03\x13\x02\x80\xff\xc3\x03\x13\x02\x82\xff\xc3\x03\x13\x02\ +\x9f\xff\xc3\x03\x13\x02\xa0\xff\xd7\x03\x13\x02\xa9\xff\xae\x03\ +\x13\x02\xaa\xff\xc3\x03\x13\x02\xb5\xffq\x03\x13\x02\xb6\xff\ +\xc3\x03\x13\x02\xb7\xff\xc3\x03\x13\x02\xb9\xff\xc3\x03\x13\x02\ +\xbb\xff\xc3\x03\x13\x02\xbc\xff\xd7\x03\x13\x02\xbd\xff\xae\x03\ +\x13\x02\xbe\xff\xc3\x03\x13\x02\xbf\xff\xc3\x03\x13\x02\xc0\xff\ +\xd7\x03\x13\x02\xc1\xff\xc3\x03\x13\x02\xc2\xff\xd7\x03\x13\x02\ +\xca\xff\xc3\x03\x13\x02\xcb\xff\xd7\x03\x13\x02\xd4\xff\xc3\x03\ +\x13\x02\xd5\xff\xd7\x03\x13\x02\xd9\xff\xc3\x03\x13\x02\xdb\xff\ +\xc3\x03\x13\x02\xdd\xff\xc3\x03\x13\x02\xe5\xff\xc3\x03\x13\x02\ +\xe6\xff\xd7\x03\x13\x02\xf7\xff\xc3\x03\x13\x02\xf9\xff\xc3\x03\ +\x13\x02\xfb\xff\xc3\x03\x13\x02\xfd\xff\xc3\x03\x13\x02\xfe\xff\ +\xd7\x03\x13\x03\x05\xff\xc3\x03\x13\x03\x06\xff\xd7\x03\x13\x03\ +\x07\xff\xc3\x03\x13\x03\x08\xff\xd7\x03\x13\x03\x0d\xff\xd7\x03\ +\x13\x03\x0e\xff\xd7\x03\x13\x03\x0f\xff\xd7\x03\x13\x03\x10\xff\ +\xd7\x03\x13\x03\x17\xff\xae\x03\x13\x03\x18\xff\xc3\x03\x14\x00\ +\x05\xff\x9a\x03\x14\x00\x0a\xff\x9a\x03\x14\x01\xd0\xff\xd7\x03\ +\x14\x01\xdc\xff\xc3\x03\x14\x01\xdd\xff\xd7\x03\x14\x01\xdf\xff\ +\xd7\x03\x14\x01\xe1\xff\xd7\x03\x14\x01\xe4\xff\xc3\x03\x14\x01\ +\xf6\xff\xd7\x03\x14\x02\x07\xff\x9a\x03\x14\x02\x0b\xff\x9a\x03\ +\x14\x02\xa0\xff\xd7\x03\x14\x02\xaa\xff\xc3\x03\x14\x02\xb6\xff\ +\xc3\x03\x14\x02\xbc\xff\xd7\x03\x14\x02\xbe\xff\xc3\x03\x14\x02\ +\xc0\xff\xd7\x03\x14\x02\xc2\xff\xd7\x03\x14\x02\xcb\xff\xd7\x03\ +\x14\x02\xd5\xff\xd7\x03\x14\x02\xe6\xff\xd7\x03\x14\x02\xf8\xff\ +\xd7\x03\x14\x02\xfa\xff\xd7\x03\x14\x02\xfc\xff\xd7\x03\x14\x02\ +\xfe\xff\xd7\x03\x14\x03\x06\xff\xd7\x03\x14\x03\x08\xff\xd7\x03\ +\x14\x03\x0e\xff\x9a\x03\x14\x03\x10\xff\x9a\x03\x14\x03\x18\xff\ +\xc3\x03\x15\x00\x0f\xff\xae\x03\x15\x00\x11\xff\xae\x03\x15\x01\ +\xaa\xff\xec\x03\x15\x01\xb0\xff\xd7\x03\x15\x01\xbc\xff\xd7\x03\ +\x15\x01\xbf\xff\xd7\x03\x15\x02\x08\xff\xae\x03\x15\x02\x0c\xff\ +\xae\x03\x15\x02r\xff\xec\x03\x15\x02\x80\xff\xec\x03\x15\x02\ +\x82\xff\xec\x03\x15\x02\x9f\xff\xd7\x03\x15\x02\xb5\xff\xd7\x03\ +\x15\x02\xb7\xff\xec\x03\x15\x02\xb9\xff\xec\x03\x15\x02\xbb\xff\ +\xd7\x03\x15\x02\xca\xff\xd7\x03\x15\x02\xd9\xff\xec\x03\x15\x02\ +\xdb\xff\xec\x03\x15\x02\xdd\xff\xec\x03\x15\x02\xe5\xff\xd7\x03\ +\x15\x03\x05\xff\xd7\x03\x15\x03\x07\xff\xd7\x03\x16\x00\x05\xff\ +\xd7\x03\x16\x00\x0a\xff\xd7\x03\x16\x01\xd0\xff\xec\x03\x16\x01\ +\xdd\xff\xec\x03\x16\x01\xdf\xff\xec\x03\x16\x01\xf6\xff\xec\x03\ +\x16\x02\x07\xff\xd7\x03\x16\x02\x0b\xff\xd7\x03\x16\x02\xa0\xff\ +\xec\x03\x16\x02\xbc\xff\xec\x03\x16\x02\xcb\xff\xec\x03\x16\x02\ +\xe6\xff\xec\x03\x16\x02\xf8\xff\xec\x03\x16\x02\xfa\xff\xec\x03\ +\x16\x02\xfc\xff\xec\x03\x16\x03\x06\xff\xec\x03\x16\x03\x08\xff\ +\xec\x03\x16\x03\x0e\xff\xd7\x03\x16\x03\x10\xff\xd7\x03\x17\x00\ +\x05\xff\xae\x03\x17\x00\x0a\xff\xae\x03\x17\x01\x9d\xff\xc3\x03\ +\x17\x01\xa6\xff\xc3\x03\x17\x01\xaa\xff\xd7\x03\x17\x01\xb0\xff\ +\xd7\x03\x17\x01\xbc\xff\xc3\x03\x17\x01\xbf\xff\xd7\x03\x17\x01\ +\xc1\xff\xd7\x03\x17\x01\xc4\xff\xc3\x03\x17\x01\xdc\xff\xd7\x03\ +\x17\x01\xe4\xff\xd7\x03\x17\x02\x07\xff\xae\x03\x17\x02\x0b\xff\ +\xae\x03\x17\x02r\xff\xd7\x03\x17\x02|\xff\xd7\x03\x17\x02\ +\x80\xff\xd7\x03\x17\x02\x82\xff\xd7\x03\x17\x02\x9f\xff\xd7\x03\ +\x17\x02\xa9\xff\xc3\x03\x17\x02\xaa\xff\xd7\x03\x17\x02\xb5\xff\ +\xc3\x03\x17\x02\xb6\xff\xd7\x03\x17\x02\xb7\xff\xd7\x03\x17\x02\ +\xb9\xff\xd7\x03\x17\x02\xbb\xff\xd7\x03\x17\x02\xbd\xff\xc3\x03\ +\x17\x02\xbe\xff\xd7\x03\x17\x02\xbf\xff\xd7\x03\x17\x02\xc1\xff\ +\xd7\x03\x17\x02\xca\xff\xd7\x03\x17\x02\xd4\xff\xd7\x03\x17\x02\ +\xd9\xff\xd7\x03\x17\x02\xdb\xff\xd7\x03\x17\x02\xdd\xff\xd7\x03\ +\x17\x02\xe5\xff\xd7\x03\x17\x02\xfd\xff\xd7\x03\x17\x03\x05\xff\ +\xd7\x03\x17\x03\x07\xff\xd7\x03\x17\x03\x0d\xff\xd7\x03\x17\x03\ +\x0f\xff\xd7\x03\x17\x03\x17\xff\xc3\x03\x17\x03\x18\xff\xd7\x03\ +\x18\x00\x05\xff\x9a\x03\x18\x00\x0a\xff\x9a\x03\x18\x01\xd0\xff\ +\xd7\x03\x18\x01\xdc\xff\xc3\x03\x18\x01\xdd\xff\xd7\x03\x18\x01\ +\xdf\xff\xd7\x03\x18\x01\xe1\xff\xd7\x03\x18\x01\xe4\xff\xc3\x03\ +\x18\x01\xf6\xff\xd7\x03\x18\x02\x07\xff\x9a\x03\x18\x02\x0b\xff\ +\x9a\x03\x18\x02\xa0\xff\xd7\x03\x18\x02\xaa\xff\xc3\x03\x18\x02\ +\xb6\xff\xc3\x03\x18\x02\xbc\xff\xd7\x03\x18\x02\xbe\xff\xc3\x03\ +\x18\x02\xc0\xff\xd7\x03\x18\x02\xc2\xff\xd7\x03\x18\x02\xcb\xff\ +\xd7\x03\x18\x02\xd5\xff\xd7\x03\x18\x02\xe6\xff\xd7\x03\x18\x02\ +\xf8\xff\xd7\x03\x18\x02\xfa\xff\xd7\x03\x18\x02\xfc\xff\xd7\x03\ +\x18\x02\xfe\xff\xd7\x03\x18\x03\x06\xff\xd7\x03\x18\x03\x08\xff\ +\xd7\x03\x18\x03\x0e\xff\x9a\x03\x18\x03\x10\xff\x9a\x03\x18\x03\ +\x18\xff\xc3\x03\x19\x01\xe1\xff\xd7\x03\x19\x02\xc0\xff\xd7\x03\ +\x19\x02\xc2\xff\xd7\x03\x19\x02\xd5\xff\xd7\x03\x19\x02\xfe\xff\ +\xd7\x03\x1b\x01\xa3\x00\xe1\x03\x1b\x02\xea\x00)\x03\x1b\x03\ +\x0e\xff\xd7\x03\x1b\x03\x10\xff\xd7\x03\x1c\x00\x05\xff\xec\x03\ +\x1c\x00\x0a\xff\xec\x03\x1c\x02\x07\xff\xec\x03\x1c\x02\x0b\xff\ +\xec\x03\x1d\x00\x05\xffq\x03\x1d\x00\x0a\xffq\x03\x1d\x00\ +&\xff\xd7\x03\x1d\x00*\xff\xd7\x03\x1d\x00-\x01\x0a\x03\ +\x1d\x002\xff\xd7\x03\x1d\x004\xff\xd7\x03\x1d\x007\xff\ +q\x03\x1d\x009\xff\xae\x03\x1d\x00:\xff\xae\x03\x1d\x00\ +<\xff\x85\x03\x1d\x00\x89\xff\xd7\x03\x1d\x00\x94\xff\xd7\x03\ +\x1d\x00\x95\xff\xd7\x03\x1d\x00\x96\xff\xd7\x03\x1d\x00\x97\xff\ +\xd7\x03\x1d\x00\x98\xff\xd7\x03\x1d\x00\x9a\xff\xd7\x03\x1d\x00\ +\x9f\xff\x85\x03\x1d\x00\xc8\xff\xd7\x03\x1d\x00\xca\xff\xd7\x03\ +\x1d\x00\xcc\xff\xd7\x03\x1d\x00\xce\xff\xd7\x03\x1d\x00\xde\xff\ +\xd7\x03\x1d\x00\xe0\xff\xd7\x03\x1d\x00\xe2\xff\xd7\x03\x1d\x00\ +\xe4\xff\xd7\x03\x1d\x01\x0e\xff\xd7\x03\x1d\x01\x10\xff\xd7\x03\ +\x1d\x01\x12\xff\xd7\x03\x1d\x01\x14\xff\xd7\x03\x1d\x01$\xff\ +q\x03\x1d\x01&\xffq\x03\x1d\x016\xff\xae\x03\x1d\x01\ +8\xff\x85\x03\x1d\x01:\xff\x85\x03\x1d\x01G\xff\xd7\x03\ +\x1d\x01\xfa\xff\xae\x03\x1d\x01\xfc\xff\xae\x03\x1d\x01\xfe\xff\ +\xae\x03\x1d\x02\x00\xff\x85\x03\x1d\x02\x07\xffq\x03\x1d\x02\ +\x0b\xffq\x03\x1d\x02_\xff\xd7\x03\x1d\x03I\xff\xd7\x03\ +\x1d\x03K\xff\xd7\x03\x1d\x03M\xff\xd7\x03\x1d\x03O\xff\ +\xd7\x03\x1d\x03Q\xff\xd7\x03\x1d\x03S\xff\xd7\x03\x1d\x03\ +U\xff\xd7\x03\x1d\x03W\xff\xd7\x03\x1d\x03Y\xff\xd7\x03\ +\x1d\x03[\xff\xd7\x03\x1d\x03]\xff\xd7\x03\x1d\x03_\xff\ +\xd7\x03\x1d\x03o\xff\x85\x03\x1d\x03q\xff\x85\x03\x1d\x03\ +s\xff\x85\x03\x1d\x03\x8f\xffq\x03\x1e\x00\x05\xff\xec\x03\ +\x1e\x00\x0a\xff\xec\x03\x1e\x02\x07\xff\xec\x03\x1e\x02\x0b\xff\ +\xec\x03\x1f\x00\x05\xffq\x03\x1f\x00\x0a\xffq\x03\x1f\x00\ +&\xff\xd7\x03\x1f\x00*\xff\xd7\x03\x1f\x00-\x01\x0a\x03\ +\x1f\x002\xff\xd7\x03\x1f\x004\xff\xd7\x03\x1f\x007\xff\ +q\x03\x1f\x009\xff\xae\x03\x1f\x00:\xff\xae\x03\x1f\x00\ +<\xff\x85\x03\x1f\x00\x89\xff\xd7\x03\x1f\x00\x94\xff\xd7\x03\ +\x1f\x00\x95\xff\xd7\x03\x1f\x00\x96\xff\xd7\x03\x1f\x00\x97\xff\ +\xd7\x03\x1f\x00\x98\xff\xd7\x03\x1f\x00\x9a\xff\xd7\x03\x1f\x00\ +\x9f\xff\x85\x03\x1f\x00\xc8\xff\xd7\x03\x1f\x00\xca\xff\xd7\x03\ +\x1f\x00\xcc\xff\xd7\x03\x1f\x00\xce\xff\xd7\x03\x1f\x00\xde\xff\ +\xd7\x03\x1f\x00\xe0\xff\xd7\x03\x1f\x00\xe2\xff\xd7\x03\x1f\x00\ +\xe4\xff\xd7\x03\x1f\x01\x0e\xff\xd7\x03\x1f\x01\x10\xff\xd7\x03\ +\x1f\x01\x12\xff\xd7\x03\x1f\x01\x14\xff\xd7\x03\x1f\x01$\xff\ +q\x03\x1f\x01&\xffq\x03\x1f\x016\xff\xae\x03\x1f\x01\ +8\xff\x85\x03\x1f\x01:\xff\x85\x03\x1f\x01G\xff\xd7\x03\ +\x1f\x01\xfa\xff\xae\x03\x1f\x01\xfc\xff\xae\x03\x1f\x01\xfe\xff\ +\xae\x03\x1f\x02\x00\xff\x85\x03\x1f\x02\x07\xffq\x03\x1f\x02\ +\x0b\xffq\x03\x1f\x02_\xff\xd7\x03\x1f\x03I\xff\xd7\x03\ +\x1f\x03K\xff\xd7\x03\x1f\x03M\xff\xd7\x03\x1f\x03O\xff\ +\xd7\x03\x1f\x03Q\xff\xd7\x03\x1f\x03S\xff\xd7\x03\x1f\x03\ +U\xff\xd7\x03\x1f\x03W\xff\xd7\x03\x1f\x03Y\xff\xd7\x03\ +\x1f\x03[\xff\xd7\x03\x1f\x03]\xff\xd7\x03\x1f\x03_\xff\ +\xd7\x03\x1f\x03o\xff\x85\x03\x1f\x03q\xff\x85\x03\x1f\x03\ +s\xff\x85\x03\x1f\x03\x8f\xffq\x03 \x00\x05\xff\xec\x03\ + \x00\x0a\xff\xec\x03 \x02\x07\xff\xec\x03 \x02\x0b\xff\ +\xec\x03!\x00\x05\xffq\x03!\x00\x0a\xffq\x03!\x00\ +&\xff\xd7\x03!\x00*\xff\xd7\x03!\x00-\x01\x0a\x03\ +!\x002\xff\xd7\x03!\x004\xff\xd7\x03!\x007\xff\ +q\x03!\x009\xff\xae\x03!\x00:\xff\xae\x03!\x00\ +<\xff\x85\x03!\x00\x89\xff\xd7\x03!\x00\x94\xff\xd7\x03\ +!\x00\x95\xff\xd7\x03!\x00\x96\xff\xd7\x03!\x00\x97\xff\ +\xd7\x03!\x00\x98\xff\xd7\x03!\x00\x9a\xff\xd7\x03!\x00\ +\x9f\xff\x85\x03!\x00\xc8\xff\xd7\x03!\x00\xca\xff\xd7\x03\ +!\x00\xcc\xff\xd7\x03!\x00\xce\xff\xd7\x03!\x00\xde\xff\ +\xd7\x03!\x00\xe0\xff\xd7\x03!\x00\xe2\xff\xd7\x03!\x00\ +\xe4\xff\xd7\x03!\x01\x0e\xff\xd7\x03!\x01\x10\xff\xd7\x03\ +!\x01\x12\xff\xd7\x03!\x01\x14\xff\xd7\x03!\x01$\xff\ +q\x03!\x01&\xffq\x03!\x016\xff\xae\x03!\x01\ +8\xff\x85\x03!\x01:\xff\x85\x03!\x01G\xff\xd7\x03\ +!\x01\xfa\xff\xae\x03!\x01\xfc\xff\xae\x03!\x01\xfe\xff\ +\xae\x03!\x02\x00\xff\x85\x03!\x02\x07\xffq\x03!\x02\ +\x0b\xffq\x03!\x02_\xff\xd7\x03!\x03I\xff\xd7\x03\ +!\x03K\xff\xd7\x03!\x03M\xff\xd7\x03!\x03O\xff\ +\xd7\x03!\x03Q\xff\xd7\x03!\x03S\xff\xd7\x03!\x03\ +U\xff\xd7\x03!\x03W\xff\xd7\x03!\x03Y\xff\xd7\x03\ +!\x03[\xff\xd7\x03!\x03]\xff\xd7\x03!\x03_\xff\ +\xd7\x03!\x03o\xff\x85\x03!\x03q\xff\x85\x03!\x03\ +s\xff\x85\x03!\x03\x8f\xffq\x03\x22\x00\x05\xff\xec\x03\ +\x22\x00\x0a\xff\xec\x03\x22\x02\x07\xff\xec\x03\x22\x02\x0b\xff\ +\xec\x03#\x00\x05\xffq\x03#\x00\x0a\xffq\x03#\x00\ +&\xff\xd7\x03#\x00*\xff\xd7\x03#\x00-\x01\x0a\x03\ +#\x002\xff\xd7\x03#\x004\xff\xd7\x03#\x007\xff\ +q\x03#\x009\xff\xae\x03#\x00:\xff\xae\x03#\x00\ +<\xff\x85\x03#\x00\x89\xff\xd7\x03#\x00\x94\xff\xd7\x03\ +#\x00\x95\xff\xd7\x03#\x00\x96\xff\xd7\x03#\x00\x97\xff\ +\xd7\x03#\x00\x98\xff\xd7\x03#\x00\x9a\xff\xd7\x03#\x00\ +\x9f\xff\x85\x03#\x00\xc8\xff\xd7\x03#\x00\xca\xff\xd7\x03\ +#\x00\xcc\xff\xd7\x03#\x00\xce\xff\xd7\x03#\x00\xde\xff\ +\xd7\x03#\x00\xe0\xff\xd7\x03#\x00\xe2\xff\xd7\x03#\x00\ +\xe4\xff\xd7\x03#\x01\x0e\xff\xd7\x03#\x01\x10\xff\xd7\x03\ +#\x01\x12\xff\xd7\x03#\x01\x14\xff\xd7\x03#\x01$\xff\ +q\x03#\x01&\xffq\x03#\x016\xff\xae\x03#\x01\ +8\xff\x85\x03#\x01:\xff\x85\x03#\x01G\xff\xd7\x03\ +#\x01\xfa\xff\xae\x03#\x01\xfc\xff\xae\x03#\x01\xfe\xff\ +\xae\x03#\x02\x00\xff\x85\x03#\x02\x07\xffq\x03#\x02\ +\x0b\xffq\x03#\x02_\xff\xd7\x03#\x03I\xff\xd7\x03\ +#\x03K\xff\xd7\x03#\x03M\xff\xd7\x03#\x03O\xff\ +\xd7\x03#\x03Q\xff\xd7\x03#\x03S\xff\xd7\x03#\x03\ +U\xff\xd7\x03#\x03W\xff\xd7\x03#\x03Y\xff\xd7\x03\ +#\x03[\xff\xd7\x03#\x03]\xff\xd7\x03#\x03_\xff\ +\xd7\x03#\x03o\xff\x85\x03#\x03q\xff\x85\x03#\x03\ +s\xff\x85\x03#\x03\x8f\xffq\x03$\x00\x05\xff\xec\x03\ +$\x00\x0a\xff\xec\x03$\x02\x07\xff\xec\x03$\x02\x0b\xff\ +\xec\x03%\x00\x05\xffq\x03%\x00\x0a\xffq\x03%\x00\ +&\xff\xd7\x03%\x00*\xff\xd7\x03%\x00-\x01\x0a\x03\ +%\x002\xff\xd7\x03%\x004\xff\xd7\x03%\x007\xff\ +q\x03%\x009\xff\xae\x03%\x00:\xff\xae\x03%\x00\ +<\xff\x85\x03%\x00\x89\xff\xd7\x03%\x00\x94\xff\xd7\x03\ +%\x00\x95\xff\xd7\x03%\x00\x96\xff\xd7\x03%\x00\x97\xff\ +\xd7\x03%\x00\x98\xff\xd7\x03%\x00\x9a\xff\xd7\x03%\x00\ +\x9f\xff\x85\x03%\x00\xc8\xff\xd7\x03%\x00\xca\xff\xd7\x03\ +%\x00\xcc\xff\xd7\x03%\x00\xce\xff\xd7\x03%\x00\xde\xff\ +\xd7\x03%\x00\xe0\xff\xd7\x03%\x00\xe2\xff\xd7\x03%\x00\ +\xe4\xff\xd7\x03%\x01\x0e\xff\xd7\x03%\x01\x10\xff\xd7\x03\ +%\x01\x12\xff\xd7\x03%\x01\x14\xff\xd7\x03%\x01$\xff\ +q\x03%\x01&\xffq\x03%\x016\xff\xae\x03%\x01\ +8\xff\x85\x03%\x01:\xff\x85\x03%\x01G\xff\xd7\x03\ +%\x01\xfa\xff\xae\x03%\x01\xfc\xff\xae\x03%\x01\xfe\xff\ +\xae\x03%\x02\x00\xff\x85\x03%\x02\x07\xffq\x03%\x02\ +\x0b\xffq\x03%\x02_\xff\xd7\x03%\x03I\xff\xd7\x03\ +%\x03K\xff\xd7\x03%\x03M\xff\xd7\x03%\x03O\xff\ +\xd7\x03%\x03Q\xff\xd7\x03%\x03S\xff\xd7\x03%\x03\ +U\xff\xd7\x03%\x03W\xff\xd7\x03%\x03Y\xff\xd7\x03\ +%\x03[\xff\xd7\x03%\x03]\xff\xd7\x03%\x03_\xff\ +\xd7\x03%\x03o\xff\x85\x03%\x03q\xff\x85\x03%\x03\ +s\xff\x85\x03%\x03\x8f\xffq\x03&\x00\x05\xff\xec\x03\ +&\x00\x0a\xff\xec\x03&\x02\x07\xff\xec\x03&\x02\x0b\xff\ +\xec\x03'\x00\x05\xffq\x03'\x00\x0a\xffq\x03'\x00\ +&\xff\xd7\x03'\x00*\xff\xd7\x03'\x00-\x01\x0a\x03\ +'\x002\xff\xd7\x03'\x004\xff\xd7\x03'\x007\xff\ +q\x03'\x009\xff\xae\x03'\x00:\xff\xae\x03'\x00\ +<\xff\x85\x03'\x00\x89\xff\xd7\x03'\x00\x94\xff\xd7\x03\ +'\x00\x95\xff\xd7\x03'\x00\x96\xff\xd7\x03'\x00\x97\xff\ +\xd7\x03'\x00\x98\xff\xd7\x03'\x00\x9a\xff\xd7\x03'\x00\ +\x9f\xff\x85\x03'\x00\xc8\xff\xd7\x03'\x00\xca\xff\xd7\x03\ +'\x00\xcc\xff\xd7\x03'\x00\xce\xff\xd7\x03'\x00\xde\xff\ +\xd7\x03'\x00\xe0\xff\xd7\x03'\x00\xe2\xff\xd7\x03'\x00\ +\xe4\xff\xd7\x03'\x01\x0e\xff\xd7\x03'\x01\x10\xff\xd7\x03\ +'\x01\x12\xff\xd7\x03'\x01\x14\xff\xd7\x03'\x01$\xff\ +q\x03'\x01&\xffq\x03'\x016\xff\xae\x03'\x01\ +8\xff\x85\x03'\x01:\xff\x85\x03'\x01G\xff\xd7\x03\ +'\x01\xfa\xff\xae\x03'\x01\xfc\xff\xae\x03'\x01\xfe\xff\ +\xae\x03'\x02\x00\xff\x85\x03'\x02\x07\xffq\x03'\x02\ +\x0b\xffq\x03'\x02_\xff\xd7\x03'\x03I\xff\xd7\x03\ +'\x03K\xff\xd7\x03'\x03M\xff\xd7\x03'\x03O\xff\ +\xd7\x03'\x03Q\xff\xd7\x03'\x03S\xff\xd7\x03'\x03\ +U\xff\xd7\x03'\x03W\xff\xd7\x03'\x03Y\xff\xd7\x03\ +'\x03[\xff\xd7\x03'\x03]\xff\xd7\x03'\x03_\xff\ +\xd7\x03'\x03o\xff\x85\x03'\x03q\xff\x85\x03'\x03\ +s\xff\x85\x03'\x03\x8f\xffq\x03(\x00\x05\xff\xec\x03\ +(\x00\x0a\xff\xec\x03(\x02\x07\xff\xec\x03(\x02\x0b\xff\ +\xec\x03)\x00\x05\xffq\x03)\x00\x0a\xffq\x03)\x00\ +&\xff\xd7\x03)\x00*\xff\xd7\x03)\x00-\x01\x0a\x03\ +)\x002\xff\xd7\x03)\x004\xff\xd7\x03)\x007\xff\ +q\x03)\x009\xff\xae\x03)\x00:\xff\xae\x03)\x00\ +<\xff\x85\x03)\x00\x89\xff\xd7\x03)\x00\x94\xff\xd7\x03\ +)\x00\x95\xff\xd7\x03)\x00\x96\xff\xd7\x03)\x00\x97\xff\ +\xd7\x03)\x00\x98\xff\xd7\x03)\x00\x9a\xff\xd7\x03)\x00\ +\x9f\xff\x85\x03)\x00\xc8\xff\xd7\x03)\x00\xca\xff\xd7\x03\ +)\x00\xcc\xff\xd7\x03)\x00\xce\xff\xd7\x03)\x00\xde\xff\ +\xd7\x03)\x00\xe0\xff\xd7\x03)\x00\xe2\xff\xd7\x03)\x00\ +\xe4\xff\xd7\x03)\x01\x0e\xff\xd7\x03)\x01\x10\xff\xd7\x03\ +)\x01\x12\xff\xd7\x03)\x01\x14\xff\xd7\x03)\x01$\xff\ +q\x03)\x01&\xffq\x03)\x016\xff\xae\x03)\x01\ +8\xff\x85\x03)\x01:\xff\x85\x03)\x01G\xff\xd7\x03\ +)\x01\xfa\xff\xae\x03)\x01\xfc\xff\xae\x03)\x01\xfe\xff\ +\xae\x03)\x02\x00\xff\x85\x03)\x02\x07\xffq\x03)\x02\ +\x0b\xffq\x03)\x02_\xff\xd7\x03)\x03I\xff\xd7\x03\ +)\x03K\xff\xd7\x03)\x03M\xff\xd7\x03)\x03O\xff\ +\xd7\x03)\x03Q\xff\xd7\x03)\x03S\xff\xd7\x03)\x03\ +U\xff\xd7\x03)\x03W\xff\xd7\x03)\x03Y\xff\xd7\x03\ +)\x03[\xff\xd7\x03)\x03]\xff\xd7\x03)\x03_\xff\ +\xd7\x03)\x03o\xff\x85\x03)\x03q\xff\x85\x03)\x03\ +s\xff\x85\x03)\x03\x8f\xffq\x03*\x00\x05\xff\xec\x03\ +*\x00\x0a\xff\xec\x03*\x02\x07\xff\xec\x03*\x02\x0b\xff\ +\xec\x03+\x00\x05\xffq\x03+\x00\x0a\xffq\x03+\x00\ +&\xff\xd7\x03+\x00*\xff\xd7\x03+\x00-\x01\x0a\x03\ ++\x002\xff\xd7\x03+\x004\xff\xd7\x03+\x007\xff\ +q\x03+\x009\xff\xae\x03+\x00:\xff\xae\x03+\x00\ +<\xff\x85\x03+\x00\x89\xff\xd7\x03+\x00\x94\xff\xd7\x03\ ++\x00\x95\xff\xd7\x03+\x00\x96\xff\xd7\x03+\x00\x97\xff\ +\xd7\x03+\x00\x98\xff\xd7\x03+\x00\x9a\xff\xd7\x03+\x00\ +\x9f\xff\x85\x03+\x00\xc8\xff\xd7\x03+\x00\xca\xff\xd7\x03\ ++\x00\xcc\xff\xd7\x03+\x00\xce\xff\xd7\x03+\x00\xde\xff\ +\xd7\x03+\x00\xe0\xff\xd7\x03+\x00\xe2\xff\xd7\x03+\x00\ +\xe4\xff\xd7\x03+\x01\x0e\xff\xd7\x03+\x01\x10\xff\xd7\x03\ ++\x01\x12\xff\xd7\x03+\x01\x14\xff\xd7\x03+\x01$\xff\ +q\x03+\x01&\xffq\x03+\x016\xff\xae\x03+\x01\ +8\xff\x85\x03+\x01:\xff\x85\x03+\x01G\xff\xd7\x03\ ++\x01\xfa\xff\xae\x03+\x01\xfc\xff\xae\x03+\x01\xfe\xff\ +\xae\x03+\x02\x00\xff\x85\x03+\x02\x07\xffq\x03+\x02\ +\x0b\xffq\x03+\x02_\xff\xd7\x03+\x03I\xff\xd7\x03\ ++\x03K\xff\xd7\x03+\x03M\xff\xd7\x03+\x03O\xff\ +\xd7\x03+\x03Q\xff\xd7\x03+\x03S\xff\xd7\x03+\x03\ +U\xff\xd7\x03+\x03W\xff\xd7\x03+\x03Y\xff\xd7\x03\ ++\x03[\xff\xd7\x03+\x03]\xff\xd7\x03+\x03_\xff\ +\xd7\x03+\x03o\xff\x85\x03+\x03q\xff\x85\x03+\x03\ +s\xff\x85\x03+\x03\x8f\xffq\x03,\x00\x05\xff\xec\x03\ +,\x00\x0a\xff\xec\x03,\x02\x07\xff\xec\x03,\x02\x0b\xff\ +\xec\x03-\x00\x05\xffq\x03-\x00\x0a\xffq\x03-\x00\ +&\xff\xd7\x03-\x00*\xff\xd7\x03-\x00-\x01\x0a\x03\ +-\x002\xff\xd7\x03-\x004\xff\xd7\x03-\x007\xff\ +q\x03-\x009\xff\xae\x03-\x00:\xff\xae\x03-\x00\ +<\xff\x85\x03-\x00\x89\xff\xd7\x03-\x00\x94\xff\xd7\x03\ +-\x00\x95\xff\xd7\x03-\x00\x96\xff\xd7\x03-\x00\x97\xff\ +\xd7\x03-\x00\x98\xff\xd7\x03-\x00\x9a\xff\xd7\x03-\x00\ +\x9f\xff\x85\x03-\x00\xc8\xff\xd7\x03-\x00\xca\xff\xd7\x03\ +-\x00\xcc\xff\xd7\x03-\x00\xce\xff\xd7\x03-\x00\xde\xff\ +\xd7\x03-\x00\xe0\xff\xd7\x03-\x00\xe2\xff\xd7\x03-\x00\ +\xe4\xff\xd7\x03-\x01\x0e\xff\xd7\x03-\x01\x10\xff\xd7\x03\ +-\x01\x12\xff\xd7\x03-\x01\x14\xff\xd7\x03-\x01$\xff\ +q\x03-\x01&\xffq\x03-\x016\xff\xae\x03-\x01\ +8\xff\x85\x03-\x01:\xff\x85\x03-\x01G\xff\xd7\x03\ +-\x01\xfa\xff\xae\x03-\x01\xfc\xff\xae\x03-\x01\xfe\xff\ +\xae\x03-\x02\x00\xff\x85\x03-\x02\x07\xffq\x03-\x02\ +\x0b\xffq\x03-\x02_\xff\xd7\x03-\x03I\xff\xd7\x03\ +-\x03K\xff\xd7\x03-\x03M\xff\xd7\x03-\x03O\xff\ +\xd7\x03-\x03Q\xff\xd7\x03-\x03S\xff\xd7\x03-\x03\ +U\xff\xd7\x03-\x03W\xff\xd7\x03-\x03Y\xff\xd7\x03\ +-\x03[\xff\xd7\x03-\x03]\xff\xd7\x03-\x03_\xff\ +\xd7\x03-\x03o\xff\x85\x03-\x03q\xff\x85\x03-\x03\ +s\xff\x85\x03-\x03\x8f\xffq\x03.\x00\x05\xff\xec\x03\ +.\x00\x0a\xff\xec\x03.\x02\x07\xff\xec\x03.\x02\x0b\xff\ +\xec\x03/\x00\x05\xffq\x03/\x00\x0a\xffq\x03/\x00\ +&\xff\xd7\x03/\x00*\xff\xd7\x03/\x00-\x01\x0a\x03\ +/\x002\xff\xd7\x03/\x004\xff\xd7\x03/\x007\xff\ +q\x03/\x009\xff\xae\x03/\x00:\xff\xae\x03/\x00\ +<\xff\x85\x03/\x00\x89\xff\xd7\x03/\x00\x94\xff\xd7\x03\ +/\x00\x95\xff\xd7\x03/\x00\x96\xff\xd7\x03/\x00\x97\xff\ +\xd7\x03/\x00\x98\xff\xd7\x03/\x00\x9a\xff\xd7\x03/\x00\ +\x9f\xff\x85\x03/\x00\xc8\xff\xd7\x03/\x00\xca\xff\xd7\x03\ +/\x00\xcc\xff\xd7\x03/\x00\xce\xff\xd7\x03/\x00\xde\xff\ +\xd7\x03/\x00\xe0\xff\xd7\x03/\x00\xe2\xff\xd7\x03/\x00\ +\xe4\xff\xd7\x03/\x01\x0e\xff\xd7\x03/\x01\x10\xff\xd7\x03\ +/\x01\x12\xff\xd7\x03/\x01\x14\xff\xd7\x03/\x01$\xff\ +q\x03/\x01&\xffq\x03/\x016\xff\xae\x03/\x01\ +8\xff\x85\x03/\x01:\xff\x85\x03/\x01G\xff\xd7\x03\ +/\x01\xfa\xff\xae\x03/\x01\xfc\xff\xae\x03/\x01\xfe\xff\ +\xae\x03/\x02\x00\xff\x85\x03/\x02\x07\xffq\x03/\x02\ +\x0b\xffq\x03/\x02_\xff\xd7\x03/\x03I\xff\xd7\x03\ +/\x03K\xff\xd7\x03/\x03M\xff\xd7\x03/\x03O\xff\ +\xd7\x03/\x03Q\xff\xd7\x03/\x03S\xff\xd7\x03/\x03\ +U\xff\xd7\x03/\x03W\xff\xd7\x03/\x03Y\xff\xd7\x03\ +/\x03[\xff\xd7\x03/\x03]\xff\xd7\x03/\x03_\xff\ +\xd7\x03/\x03o\xff\x85\x03/\x03q\xff\x85\x03/\x03\ +s\xff\x85\x03/\x03\x8f\xffq\x030\x00\x05\xff\xec\x03\ +0\x00\x0a\xff\xec\x030\x02\x07\xff\xec\x030\x02\x0b\xff\ +\xec\x031\x00\x05\xffq\x031\x00\x0a\xffq\x031\x00\ +&\xff\xd7\x031\x00*\xff\xd7\x031\x00-\x01\x0a\x03\ +1\x002\xff\xd7\x031\x004\xff\xd7\x031\x007\xff\ +q\x031\x009\xff\xae\x031\x00:\xff\xae\x031\x00\ +<\xff\x85\x031\x00\x89\xff\xd7\x031\x00\x94\xff\xd7\x03\ +1\x00\x95\xff\xd7\x031\x00\x96\xff\xd7\x031\x00\x97\xff\ +\xd7\x031\x00\x98\xff\xd7\x031\x00\x9a\xff\xd7\x031\x00\ +\x9f\xff\x85\x031\x00\xc8\xff\xd7\x031\x00\xca\xff\xd7\x03\ +1\x00\xcc\xff\xd7\x031\x00\xce\xff\xd7\x031\x00\xde\xff\ +\xd7\x031\x00\xe0\xff\xd7\x031\x00\xe2\xff\xd7\x031\x00\ +\xe4\xff\xd7\x031\x01\x0e\xff\xd7\x031\x01\x10\xff\xd7\x03\ +1\x01\x12\xff\xd7\x031\x01\x14\xff\xd7\x031\x01$\xff\ +q\x031\x01&\xffq\x031\x016\xff\xae\x031\x01\ +8\xff\x85\x031\x01:\xff\x85\x031\x01G\xff\xd7\x03\ +1\x01\xfa\xff\xae\x031\x01\xfc\xff\xae\x031\x01\xfe\xff\ +\xae\x031\x02\x00\xff\x85\x031\x02\x07\xffq\x031\x02\ +\x0b\xffq\x031\x02_\xff\xd7\x031\x03I\xff\xd7\x03\ +1\x03K\xff\xd7\x031\x03M\xff\xd7\x031\x03O\xff\ +\xd7\x031\x03Q\xff\xd7\x031\x03S\xff\xd7\x031\x03\ +U\xff\xd7\x031\x03W\xff\xd7\x031\x03Y\xff\xd7\x03\ +1\x03[\xff\xd7\x031\x03]\xff\xd7\x031\x03_\xff\ +\xd7\x031\x03o\xff\x85\x031\x03q\xff\x85\x031\x03\ +s\xff\x85\x031\x03\x8f\xffq\x032\x00\x05\xff\xec\x03\ +2\x00\x0a\xff\xec\x032\x02\x07\xff\xec\x032\x02\x0b\xff\ +\xec\x033\x00\x05\xffq\x033\x00\x0a\xffq\x033\x00\ +&\xff\xd7\x033\x00*\xff\xd7\x033\x00-\x01\x0a\x03\ +3\x002\xff\xd7\x033\x004\xff\xd7\x033\x007\xff\ +q\x033\x009\xff\xae\x033\x00:\xff\xae\x033\x00\ +<\xff\x85\x033\x00\x89\xff\xd7\x033\x00\x94\xff\xd7\x03\ +3\x00\x95\xff\xd7\x033\x00\x96\xff\xd7\x033\x00\x97\xff\ +\xd7\x033\x00\x98\xff\xd7\x033\x00\x9a\xff\xd7\x033\x00\ +\x9f\xff\x85\x033\x00\xc8\xff\xd7\x033\x00\xca\xff\xd7\x03\ +3\x00\xcc\xff\xd7\x033\x00\xce\xff\xd7\x033\x00\xde\xff\ +\xd7\x033\x00\xe0\xff\xd7\x033\x00\xe2\xff\xd7\x033\x00\ +\xe4\xff\xd7\x033\x01\x0e\xff\xd7\x033\x01\x10\xff\xd7\x03\ +3\x01\x12\xff\xd7\x033\x01\x14\xff\xd7\x033\x01$\xff\ +q\x033\x01&\xffq\x033\x016\xff\xae\x033\x01\ +8\xff\x85\x033\x01:\xff\x85\x033\x01G\xff\xd7\x03\ +3\x01\xfa\xff\xae\x033\x01\xfc\xff\xae\x033\x01\xfe\xff\ +\xae\x033\x02\x00\xff\x85\x033\x02\x07\xffq\x033\x02\ +\x0b\xffq\x033\x02_\xff\xd7\x033\x03I\xff\xd7\x03\ +3\x03K\xff\xd7\x033\x03M\xff\xd7\x033\x03O\xff\ +\xd7\x033\x03Q\xff\xd7\x033\x03S\xff\xd7\x033\x03\ +U\xff\xd7\x033\x03W\xff\xd7\x033\x03Y\xff\xd7\x03\ +3\x03[\xff\xd7\x033\x03]\xff\xd7\x033\x03_\xff\ +\xd7\x033\x03o\xff\x85\x033\x03q\xff\x85\x033\x03\ +s\xff\x85\x033\x03\x8f\xffq\x034\x00\x05\xff\xec\x03\ +4\x00\x0a\xff\xec\x034\x02\x07\xff\xec\x034\x02\x0b\xff\ +\xec\x035\x00-\x00{\x036\x00\x05\xff\xec\x036\x00\ +\x0a\xff\xec\x036\x00Y\xff\xd7\x036\x00Z\xff\xd7\x03\ +6\x00[\xff\xd7\x036\x00\x5c\xff\xd7\x036\x00]\xff\ +\xec\x036\x00\xbf\xff\xd7\x036\x017\xff\xd7\x036\x01\ +<\xff\xec\x036\x01>\xff\xec\x036\x01@\xff\xec\x03\ +6\x01\xfb\xff\xd7\x036\x01\xfd\xff\xd7\x036\x02\x07\xff\ +\xec\x036\x02\x0b\xff\xec\x036\x03p\xff\xd7\x037\x00\ +-\x00{\x038\x00\x05\xff\xec\x038\x00\x0a\xff\xec\x03\ +8\x00Y\xff\xd7\x038\x00Z\xff\xd7\x038\x00[\xff\ +\xd7\x038\x00\x5c\xff\xd7\x038\x00]\xff\xec\x038\x00\ +\xbf\xff\xd7\x038\x017\xff\xd7\x038\x01<\xff\xec\x03\ +8\x01>\xff\xec\x038\x01@\xff\xec\x038\x01\xfb\xff\ +\xd7\x038\x01\xfd\xff\xd7\x038\x02\x07\xff\xec\x038\x02\ +\x0b\xff\xec\x038\x03p\xff\xd7\x039\x00-\x00{\x03\ +:\x00\x05\xff\xec\x03:\x00\x0a\xff\xec\x03:\x00Y\xff\ +\xd7\x03:\x00Z\xff\xd7\x03:\x00[\xff\xd7\x03:\x00\ +\x5c\xff\xd7\x03:\x00]\xff\xec\x03:\x00\xbf\xff\xd7\x03\ +:\x017\xff\xd7\x03:\x01<\xff\xec\x03:\x01>\xff\ +\xec\x03:\x01@\xff\xec\x03:\x01\xfb\xff\xd7\x03:\x01\ +\xfd\xff\xd7\x03:\x02\x07\xff\xec\x03:\x02\x0b\xff\xec\x03\ +:\x03p\xff\xd7\x03;\x00-\x00{\x03<\x00\x05\xff\ +\xec\x03<\x00\x0a\xff\xec\x03<\x00Y\xff\xd7\x03<\x00\ +Z\xff\xd7\x03<\x00[\xff\xd7\x03<\x00\x5c\xff\xd7\x03\ +<\x00]\xff\xec\x03<\x00\xbf\xff\xd7\x03<\x017\xff\ +\xd7\x03<\x01<\xff\xec\x03<\x01>\xff\xec\x03<\x01\ +@\xff\xec\x03<\x01\xfb\xff\xd7\x03<\x01\xfd\xff\xd7\x03\ +<\x02\x07\xff\xec\x03<\x02\x0b\xff\xec\x03<\x03p\xff\ +\xd7\x03=\x00-\x00{\x03>\x00\x05\xff\xec\x03>\x00\ +\x0a\xff\xec\x03>\x00Y\xff\xd7\x03>\x00Z\xff\xd7\x03\ +>\x00[\xff\xd7\x03>\x00\x5c\xff\xd7\x03>\x00]\xff\ +\xec\x03>\x00\xbf\xff\xd7\x03>\x017\xff\xd7\x03>\x01\ +<\xff\xec\x03>\x01>\xff\xec\x03>\x01@\xff\xec\x03\ +>\x01\xfb\xff\xd7\x03>\x01\xfd\xff\xd7\x03>\x02\x07\xff\ +\xec\x03>\x02\x0b\xff\xec\x03>\x03p\xff\xd7\x03?\x00\ +-\x00{\x03@\x00\x05\xff\xec\x03@\x00\x0a\xff\xec\x03\ +@\x00Y\xff\xd7\x03@\x00Z\xff\xd7\x03@\x00[\xff\ +\xd7\x03@\x00\x5c\xff\xd7\x03@\x00]\xff\xec\x03@\x00\ +\xbf\xff\xd7\x03@\x017\xff\xd7\x03@\x01<\xff\xec\x03\ +@\x01>\xff\xec\x03@\x01@\xff\xec\x03@\x01\xfb\xff\ +\xd7\x03@\x01\xfd\xff\xd7\x03@\x02\x07\xff\xec\x03@\x02\ +\x0b\xff\xec\x03@\x03p\xff\xd7\x03A\x00-\x00{\x03\ +B\x00\x05\xff\xec\x03B\x00\x0a\xff\xec\x03B\x00Y\xff\ +\xd7\x03B\x00Z\xff\xd7\x03B\x00[\xff\xd7\x03B\x00\ +\x5c\xff\xd7\x03B\x00]\xff\xec\x03B\x00\xbf\xff\xd7\x03\ +B\x017\xff\xd7\x03B\x01<\xff\xec\x03B\x01>\xff\ +\xec\x03B\x01@\xff\xec\x03B\x01\xfb\xff\xd7\x03B\x01\ +\xfd\xff\xd7\x03B\x02\x07\xff\xec\x03B\x02\x0b\xff\xec\x03\ +B\x03p\xff\xd7\x03C\x00-\x00{\x03D\x00\x05\xff\ +\xec\x03D\x00\x0a\xff\xec\x03D\x00Y\xff\xd7\x03D\x00\ +Z\xff\xd7\x03D\x00[\xff\xd7\x03D\x00\x5c\xff\xd7\x03\ +D\x00]\xff\xec\x03D\x00\xbf\xff\xd7\x03D\x017\xff\ +\xd7\x03D\x01<\xff\xec\x03D\x01>\xff\xec\x03D\x01\ +@\xff\xec\x03D\x01\xfb\xff\xd7\x03D\x01\xfd\xff\xd7\x03\ +D\x02\x07\xff\xec\x03D\x02\x0b\xff\xec\x03D\x03p\xff\ +\xd7\x03I\x00\x0f\xff\xae\x03I\x00\x11\xff\xae\x03I\x00\ +$\xff\xd7\x03I\x007\xff\xc3\x03I\x009\xff\xec\x03\ +I\x00:\xff\xec\x03I\x00;\xff\xd7\x03I\x00<\xff\ +\xec\x03I\x00=\xff\xec\x03I\x00\x82\xff\xd7\x03I\x00\ +\x83\xff\xd7\x03I\x00\x84\xff\xd7\x03I\x00\x85\xff\xd7\x03\ +I\x00\x86\xff\xd7\x03I\x00\x87\xff\xd7\x03I\x00\x9f\xff\ +\xec\x03I\x00\xc2\xff\xd7\x03I\x00\xc4\xff\xd7\x03I\x00\ +\xc6\xff\xd7\x03I\x01$\xff\xc3\x03I\x01&\xff\xc3\x03\ +I\x016\xff\xec\x03I\x018\xff\xec\x03I\x01:\xff\ +\xec\x03I\x01;\xff\xec\x03I\x01=\xff\xec\x03I\x01\ +?\xff\xec\x03I\x01C\xff\xd7\x03I\x01\xa0\xff\xec\x03\ +I\x01\xfa\xff\xec\x03I\x01\xfc\xff\xec\x03I\x01\xfe\xff\ +\xec\x03I\x02\x00\xff\xec\x03I\x02\x08\xff\xae\x03I\x02\ +\x0c\xff\xae\x03I\x02X\xff\xd7\x03I\x03\x1d\xff\xd7\x03\ +I\x03\x1f\xff\xd7\x03I\x03!\xff\xd7\x03I\x03#\xff\ +\xd7\x03I\x03%\xff\xd7\x03I\x03'\xff\xd7\x03I\x03\ +)\xff\xd7\x03I\x03+\xff\xd7\x03I\x03-\xff\xd7\x03\ +I\x03/\xff\xd7\x03I\x031\xff\xd7\x03I\x033\xff\ +\xd7\x03I\x03o\xff\xec\x03I\x03q\xff\xec\x03I\x03\ +s\xff\xec\x03I\x03\x8f\xff\xc3\x03J\x00\x05\xff\xec\x03\ +J\x00\x0a\xff\xec\x03J\x00Y\xff\xd7\x03J\x00Z\xff\ +\xd7\x03J\x00[\xff\xd7\x03J\x00\x5c\xff\xd7\x03J\x00\ +]\xff\xec\x03J\x00\xbf\xff\xd7\x03J\x017\xff\xd7\x03\ +J\x01<\xff\xec\x03J\x01>\xff\xec\x03J\x01@\xff\ +\xec\x03J\x01\xfb\xff\xd7\x03J\x01\xfd\xff\xd7\x03J\x02\ +\x07\xff\xec\x03J\x02\x0b\xff\xec\x03J\x03p\xff\xd7\x03\ +K\x00\x0f\xff\xae\x03K\x00\x11\xff\xae\x03K\x00$\xff\ +\xd7\x03K\x007\xff\xc3\x03K\x009\xff\xec\x03K\x00\ +:\xff\xec\x03K\x00;\xff\xd7\x03K\x00<\xff\xec\x03\ +K\x00=\xff\xec\x03K\x00\x82\xff\xd7\x03K\x00\x83\xff\ +\xd7\x03K\x00\x84\xff\xd7\x03K\x00\x85\xff\xd7\x03K\x00\ +\x86\xff\xd7\x03K\x00\x87\xff\xd7\x03K\x00\x9f\xff\xec\x03\ +K\x00\xc2\xff\xd7\x03K\x00\xc4\xff\xd7\x03K\x00\xc6\xff\ +\xd7\x03K\x01$\xff\xc3\x03K\x01&\xff\xc3\x03K\x01\ +6\xff\xec\x03K\x018\xff\xec\x03K\x01:\xff\xec\x03\ +K\x01;\xff\xec\x03K\x01=\xff\xec\x03K\x01?\xff\ +\xec\x03K\x01C\xff\xd7\x03K\x01\xa0\xff\xec\x03K\x01\ +\xfa\xff\xec\x03K\x01\xfc\xff\xec\x03K\x01\xfe\xff\xec\x03\ +K\x02\x00\xff\xec\x03K\x02\x08\xff\xae\x03K\x02\x0c\xff\ +\xae\x03K\x02X\xff\xd7\x03K\x03\x1d\xff\xd7\x03K\x03\ +\x1f\xff\xd7\x03K\x03!\xff\xd7\x03K\x03#\xff\xd7\x03\ +K\x03%\xff\xd7\x03K\x03'\xff\xd7\x03K\x03)\xff\ +\xd7\x03K\x03+\xff\xd7\x03K\x03-\xff\xd7\x03K\x03\ +/\xff\xd7\x03K\x031\xff\xd7\x03K\x033\xff\xd7\x03\ +K\x03o\xff\xec\x03K\x03q\xff\xec\x03K\x03s\xff\ +\xec\x03K\x03\x8f\xff\xc3\x03L\x00\x05\xff\xec\x03L\x00\ +\x0a\xff\xec\x03L\x00Y\xff\xd7\x03L\x00Z\xff\xd7\x03\ +L\x00[\xff\xd7\x03L\x00\x5c\xff\xd7\x03L\x00]\xff\ +\xec\x03L\x00\xbf\xff\xd7\x03L\x017\xff\xd7\x03L\x01\ +<\xff\xec\x03L\x01>\xff\xec\x03L\x01@\xff\xec\x03\ +L\x01\xfb\xff\xd7\x03L\x01\xfd\xff\xd7\x03L\x02\x07\xff\ +\xec\x03L\x02\x0b\xff\xec\x03L\x03p\xff\xd7\x03M\x00\ +\x0f\xff\xae\x03M\x00\x11\xff\xae\x03M\x00$\xff\xd7\x03\ +M\x007\xff\xc3\x03M\x009\xff\xec\x03M\x00:\xff\ +\xec\x03M\x00;\xff\xd7\x03M\x00<\xff\xec\x03M\x00\ +=\xff\xec\x03M\x00\x82\xff\xd7\x03M\x00\x83\xff\xd7\x03\ +M\x00\x84\xff\xd7\x03M\x00\x85\xff\xd7\x03M\x00\x86\xff\ +\xd7\x03M\x00\x87\xff\xd7\x03M\x00\x9f\xff\xec\x03M\x00\ +\xc2\xff\xd7\x03M\x00\xc4\xff\xd7\x03M\x00\xc6\xff\xd7\x03\ +M\x01$\xff\xc3\x03M\x01&\xff\xc3\x03M\x016\xff\ +\xec\x03M\x018\xff\xec\x03M\x01:\xff\xec\x03M\x01\ +;\xff\xec\x03M\x01=\xff\xec\x03M\x01?\xff\xec\x03\ +M\x01C\xff\xd7\x03M\x01\xa0\xff\xec\x03M\x01\xfa\xff\ +\xec\x03M\x01\xfc\xff\xec\x03M\x01\xfe\xff\xec\x03M\x02\ +\x00\xff\xec\x03M\x02\x08\xff\xae\x03M\x02\x0c\xff\xae\x03\ +M\x02X\xff\xd7\x03M\x03\x1d\xff\xd7\x03M\x03\x1f\xff\ +\xd7\x03M\x03!\xff\xd7\x03M\x03#\xff\xd7\x03M\x03\ +%\xff\xd7\x03M\x03'\xff\xd7\x03M\x03)\xff\xd7\x03\ +M\x03+\xff\xd7\x03M\x03-\xff\xd7\x03M\x03/\xff\ +\xd7\x03M\x031\xff\xd7\x03M\x033\xff\xd7\x03M\x03\ +o\xff\xec\x03M\x03q\xff\xec\x03M\x03s\xff\xec\x03\ +M\x03\x8f\xff\xc3\x03O\x00\x0f\xff\xae\x03O\x00\x11\xff\ +\xae\x03O\x00$\xff\xd7\x03O\x007\xff\xc3\x03O\x00\ +9\xff\xec\x03O\x00:\xff\xec\x03O\x00;\xff\xd7\x03\ +O\x00<\xff\xec\x03O\x00=\xff\xec\x03O\x00\x82\xff\ +\xd7\x03O\x00\x83\xff\xd7\x03O\x00\x84\xff\xd7\x03O\x00\ +\x85\xff\xd7\x03O\x00\x86\xff\xd7\x03O\x00\x87\xff\xd7\x03\ +O\x00\x9f\xff\xec\x03O\x00\xc2\xff\xd7\x03O\x00\xc4\xff\ +\xd7\x03O\x00\xc6\xff\xd7\x03O\x01$\xff\xc3\x03O\x01\ +&\xff\xc3\x03O\x016\xff\xec\x03O\x018\xff\xec\x03\ +O\x01:\xff\xec\x03O\x01;\xff\xec\x03O\x01=\xff\ +\xec\x03O\x01?\xff\xec\x03O\x01C\xff\xd7\x03O\x01\ +\xa0\xff\xec\x03O\x01\xfa\xff\xec\x03O\x01\xfc\xff\xec\x03\ +O\x01\xfe\xff\xec\x03O\x02\x00\xff\xec\x03O\x02\x08\xff\ +\xae\x03O\x02\x0c\xff\xae\x03O\x02X\xff\xd7\x03O\x03\ +\x1d\xff\xd7\x03O\x03\x1f\xff\xd7\x03O\x03!\xff\xd7\x03\ +O\x03#\xff\xd7\x03O\x03%\xff\xd7\x03O\x03'\xff\ +\xd7\x03O\x03)\xff\xd7\x03O\x03+\xff\xd7\x03O\x03\ +-\xff\xd7\x03O\x03/\xff\xd7\x03O\x031\xff\xd7\x03\ +O\x033\xff\xd7\x03O\x03o\xff\xec\x03O\x03q\xff\ +\xec\x03O\x03s\xff\xec\x03O\x03\x8f\xff\xc3\x03Q\x00\ +\x0f\xff\xae\x03Q\x00\x11\xff\xae\x03Q\x00$\xff\xd7\x03\ +Q\x007\xff\xc3\x03Q\x009\xff\xec\x03Q\x00:\xff\ +\xec\x03Q\x00;\xff\xd7\x03Q\x00<\xff\xec\x03Q\x00\ +=\xff\xec\x03Q\x00\x82\xff\xd7\x03Q\x00\x83\xff\xd7\x03\ +Q\x00\x84\xff\xd7\x03Q\x00\x85\xff\xd7\x03Q\x00\x86\xff\ +\xd7\x03Q\x00\x87\xff\xd7\x03Q\x00\x9f\xff\xec\x03Q\x00\ +\xc2\xff\xd7\x03Q\x00\xc4\xff\xd7\x03Q\x00\xc6\xff\xd7\x03\ +Q\x01$\xff\xc3\x03Q\x01&\xff\xc3\x03Q\x016\xff\ +\xec\x03Q\x018\xff\xec\x03Q\x01:\xff\xec\x03Q\x01\ +;\xff\xec\x03Q\x01=\xff\xec\x03Q\x01?\xff\xec\x03\ +Q\x01C\xff\xd7\x03Q\x01\xa0\xff\xec\x03Q\x01\xfa\xff\ +\xec\x03Q\x01\xfc\xff\xec\x03Q\x01\xfe\xff\xec\x03Q\x02\ +\x00\xff\xec\x03Q\x02\x08\xff\xae\x03Q\x02\x0c\xff\xae\x03\ +Q\x02X\xff\xd7\x03Q\x03\x1d\xff\xd7\x03Q\x03\x1f\xff\ +\xd7\x03Q\x03!\xff\xd7\x03Q\x03#\xff\xd7\x03Q\x03\ +%\xff\xd7\x03Q\x03'\xff\xd7\x03Q\x03)\xff\xd7\x03\ +Q\x03+\xff\xd7\x03Q\x03-\xff\xd7\x03Q\x03/\xff\ +\xd7\x03Q\x031\xff\xd7\x03Q\x033\xff\xd7\x03Q\x03\ +o\xff\xec\x03Q\x03q\xff\xec\x03Q\x03s\xff\xec\x03\ +Q\x03\x8f\xff\xc3\x03S\x00\x0f\xff\xae\x03S\x00\x11\xff\ +\xae\x03S\x00$\xff\xd7\x03S\x007\xff\xc3\x03S\x00\ +9\xff\xec\x03S\x00:\xff\xec\x03S\x00;\xff\xd7\x03\ +S\x00<\xff\xec\x03S\x00=\xff\xec\x03S\x00\x82\xff\ +\xd7\x03S\x00\x83\xff\xd7\x03S\x00\x84\xff\xd7\x03S\x00\ +\x85\xff\xd7\x03S\x00\x86\xff\xd7\x03S\x00\x87\xff\xd7\x03\ +S\x00\x9f\xff\xec\x03S\x00\xc2\xff\xd7\x03S\x00\xc4\xff\ +\xd7\x03S\x00\xc6\xff\xd7\x03S\x01$\xff\xc3\x03S\x01\ +&\xff\xc3\x03S\x016\xff\xec\x03S\x018\xff\xec\x03\ +S\x01:\xff\xec\x03S\x01;\xff\xec\x03S\x01=\xff\ +\xec\x03S\x01?\xff\xec\x03S\x01C\xff\xd7\x03S\x01\ +\xa0\xff\xec\x03S\x01\xfa\xff\xec\x03S\x01\xfc\xff\xec\x03\ +S\x01\xfe\xff\xec\x03S\x02\x00\xff\xec\x03S\x02\x08\xff\ +\xae\x03S\x02\x0c\xff\xae\x03S\x02X\xff\xd7\x03S\x03\ +\x1d\xff\xd7\x03S\x03\x1f\xff\xd7\x03S\x03!\xff\xd7\x03\ +S\x03#\xff\xd7\x03S\x03%\xff\xd7\x03S\x03'\xff\ +\xd7\x03S\x03)\xff\xd7\x03S\x03+\xff\xd7\x03S\x03\ +-\xff\xd7\x03S\x03/\xff\xd7\x03S\x031\xff\xd7\x03\ +S\x033\xff\xd7\x03S\x03o\xff\xec\x03S\x03q\xff\ +\xec\x03S\x03s\xff\xec\x03S\x03\x8f\xff\xc3\x03U\x00\ +\x0f\xff\xae\x03U\x00\x11\xff\xae\x03U\x00$\xff\xd7\x03\ +U\x007\xff\xc3\x03U\x009\xff\xec\x03U\x00:\xff\ +\xec\x03U\x00;\xff\xd7\x03U\x00<\xff\xec\x03U\x00\ +=\xff\xec\x03U\x00\x82\xff\xd7\x03U\x00\x83\xff\xd7\x03\ +U\x00\x84\xff\xd7\x03U\x00\x85\xff\xd7\x03U\x00\x86\xff\ +\xd7\x03U\x00\x87\xff\xd7\x03U\x00\x9f\xff\xec\x03U\x00\ +\xc2\xff\xd7\x03U\x00\xc4\xff\xd7\x03U\x00\xc6\xff\xd7\x03\ +U\x01$\xff\xc3\x03U\x01&\xff\xc3\x03U\x016\xff\ +\xec\x03U\x018\xff\xec\x03U\x01:\xff\xec\x03U\x01\ +;\xff\xec\x03U\x01=\xff\xec\x03U\x01?\xff\xec\x03\ +U\x01C\xff\xd7\x03U\x01\xa0\xff\xec\x03U\x01\xfa\xff\ +\xec\x03U\x01\xfc\xff\xec\x03U\x01\xfe\xff\xec\x03U\x02\ +\x00\xff\xec\x03U\x02\x08\xff\xae\x03U\x02\x0c\xff\xae\x03\ +U\x02X\xff\xd7\x03U\x03\x1d\xff\xd7\x03U\x03\x1f\xff\ +\xd7\x03U\x03!\xff\xd7\x03U\x03#\xff\xd7\x03U\x03\ +%\xff\xd7\x03U\x03'\xff\xd7\x03U\x03)\xff\xd7\x03\ +U\x03+\xff\xd7\x03U\x03-\xff\xd7\x03U\x03/\xff\ +\xd7\x03U\x031\xff\xd7\x03U\x033\xff\xd7\x03U\x03\ +o\xff\xec\x03U\x03q\xff\xec\x03U\x03s\xff\xec\x03\ +U\x03\x8f\xff\xc3\x03X\x00I\x00R\x03X\x00W\x00\ +R\x03X\x00Y\x00f\x03X\x00Z\x00f\x03X\x00\ +[\x00f\x03X\x00\x5c\x00f\x03X\x00\xbf\x00f\x03\ +X\x01%\x00R\x03X\x01'\x00R\x03X\x017\x00\ +f\x03X\x01\xfb\x00f\x03X\x01\xfd\x00f\x03X\x02\ +4\x00R\x03X\x025\x00R\x03X\x02]\x00R\x03\ +X\x02^\x00R\x03X\x03p\x00f\x03X\x03\x8d\x00\ +R\x03X\x03\x90\x00R\x03Z\x00I\x00R\x03Z\x00\ +W\x00R\x03Z\x00Y\x00f\x03Z\x00Z\x00f\x03\ +Z\x00[\x00f\x03Z\x00\x5c\x00f\x03Z\x00\xbf\x00\ +f\x03Z\x01%\x00R\x03Z\x01'\x00R\x03Z\x01\ +7\x00f\x03Z\x01\xfb\x00f\x03Z\x01\xfd\x00f\x03\ +Z\x024\x00R\x03Z\x025\x00R\x03Z\x02]\x00\ +R\x03Z\x02^\x00R\x03Z\x03p\x00f\x03Z\x03\ +\x8d\x00R\x03Z\x03\x90\x00R\x03\x5c\x00I\x00R\x03\ +\x5c\x00W\x00R\x03\x5c\x00Y\x00f\x03\x5c\x00Z\x00\ +f\x03\x5c\x00[\x00f\x03\x5c\x00\x5c\x00f\x03\x5c\x00\ +\xbf\x00f\x03\x5c\x01%\x00R\x03\x5c\x01'\x00R\x03\ +\x5c\x017\x00f\x03\x5c\x01\xfb\x00f\x03\x5c\x01\xfd\x00\ +f\x03\x5c\x024\x00R\x03\x5c\x025\x00R\x03\x5c\x02\ +]\x00R\x03\x5c\x02^\x00R\x03\x5c\x03p\x00f\x03\ +\x5c\x03\x8d\x00R\x03\x5c\x03\x90\x00R\x03^\x00I\x00\ +R\x03^\x00W\x00R\x03^\x00Y\x00f\x03^\x00\ +Z\x00f\x03^\x00[\x00f\x03^\x00\x5c\x00f\x03\ +^\x00\xbf\x00f\x03^\x01%\x00R\x03^\x01'\x00\ +R\x03^\x017\x00f\x03^\x01\xfb\x00f\x03^\x01\ +\xfd\x00f\x03^\x024\x00R\x03^\x025\x00R\x03\ +^\x02]\x00R\x03^\x02^\x00R\x03^\x03p\x00\ +f\x03^\x03\x8d\x00R\x03^\x03\x90\x00R\x03`\x00\ +I\x00R\x03`\x00W\x00R\x03`\x00Y\x00f\x03\ +`\x00Z\x00f\x03`\x00[\x00f\x03`\x00\x5c\x00\ +f\x03`\x00\xbf\x00f\x03`\x01%\x00R\x03`\x01\ +'\x00R\x03`\x017\x00f\x03`\x01\xfb\x00f\x03\ +`\x01\xfd\x00f\x03`\x024\x00R\x03`\x025\x00\ +R\x03`\x02]\x00R\x03`\x02^\x00R\x03`\x03\ +p\x00f\x03`\x03\x8d\x00R\x03`\x03\x90\x00R\x03\ +a\x00\x0f\xff\xd7\x03a\x00\x11\xff\xd7\x03a\x00$\xff\ +\xec\x03a\x00\x82\xff\xec\x03a\x00\x83\xff\xec\x03a\x00\ +\x84\xff\xec\x03a\x00\x85\xff\xec\x03a\x00\x86\xff\xec\x03\ +a\x00\x87\xff\xec\x03a\x00\xc2\xff\xec\x03a\x00\xc4\xff\ +\xec\x03a\x00\xc6\xff\xec\x03a\x01C\xff\xec\x03a\x02\ +\x08\xff\xd7\x03a\x02\x0c\xff\xd7\x03a\x02X\xff\xec\x03\ +a\x03\x1d\xff\xec\x03a\x03\x1f\xff\xec\x03a\x03!\xff\ +\xec\x03a\x03#\xff\xec\x03a\x03%\xff\xec\x03a\x03\ +'\xff\xec\x03a\x03)\xff\xec\x03a\x03+\xff\xec\x03\ +a\x03-\xff\xec\x03a\x03/\xff\xec\x03a\x031\xff\ +\xec\x03a\x033\xff\xec\x03f\x00I\x00f\x03f\x00\ +W\x00f\x03f\x00Y\x00f\x03f\x00Z\x00f\x03\ +f\x00[\x00f\x03f\x00\x5c\x00f\x03f\x00\xbf\x00\ +f\x03f\x01%\x00f\x03f\x01'\x00f\x03f\x01\ +7\x00f\x03f\x01\xfb\x00f\x03f\x01\xfd\x00f\x03\ +f\x024\x00f\x03f\x025\x00f\x03f\x02]\x00\ +f\x03f\x02^\x00f\x03f\x03p\x00f\x03f\x03\ +\x8d\x00f\x03f\x03\x90\x00f\x03h\x00I\x00f\x03\ +h\x00W\x00f\x03h\x00Y\x00f\x03h\x00Z\x00\ +f\x03h\x00[\x00f\x03h\x00\x5c\x00f\x03h\x00\ +\xbf\x00f\x03h\x01%\x00f\x03h\x01'\x00f\x03\ +h\x017\x00f\x03h\x01\xfb\x00f\x03h\x01\xfd\x00\ +f\x03h\x024\x00f\x03h\x025\x00f\x03h\x02\ +]\x00f\x03h\x02^\x00f\x03h\x03p\x00f\x03\ +h\x03\x8d\x00f\x03h\x03\x90\x00f\x03j\x00I\x00\ +f\x03j\x00W\x00f\x03j\x00Y\x00f\x03j\x00\ +Z\x00f\x03j\x00[\x00f\x03j\x00\x5c\x00f\x03\ +j\x00\xbf\x00f\x03j\x01%\x00f\x03j\x01'\x00\ +f\x03j\x017\x00f\x03j\x01\xfb\x00f\x03j\x01\ +\xfd\x00f\x03j\x024\x00f\x03j\x025\x00f\x03\ +j\x02]\x00f\x03j\x02^\x00f\x03j\x03p\x00\ +f\x03j\x03\x8d\x00f\x03j\x03\x90\x00f\x03l\x00\ +I\x00f\x03l\x00W\x00f\x03l\x00Y\x00f\x03\ +l\x00Z\x00f\x03l\x00[\x00f\x03l\x00\x5c\x00\ +f\x03l\x00\xbf\x00f\x03l\x01%\x00f\x03l\x01\ +'\x00f\x03l\x017\x00f\x03l\x01\xfb\x00f\x03\ +l\x01\xfd\x00f\x03l\x024\x00f\x03l\x025\x00\ +f\x03l\x02]\x00f\x03l\x02^\x00f\x03l\x03\ +p\x00f\x03l\x03\x8d\x00f\x03l\x03\x90\x00f\x03\ +n\x00I\x00f\x03n\x00W\x00f\x03n\x00Y\x00\ +f\x03n\x00Z\x00f\x03n\x00[\x00f\x03n\x00\ +\x5c\x00f\x03n\x00\xbf\x00f\x03n\x01%\x00f\x03\ +n\x01'\x00f\x03n\x017\x00f\x03n\x01\xfb\x00\ +f\x03n\x01\xfd\x00f\x03n\x024\x00f\x03n\x02\ +5\x00f\x03n\x02]\x00f\x03n\x02^\x00f\x03\ +n\x03p\x00f\x03n\x03\x8d\x00f\x03n\x03\x90\x00\ +f\x03o\x00\x0f\xff\x85\x03o\x00\x11\xff\x85\x03o\x00\ +\x22\x00)\x03o\x00$\xff\x85\x03o\x00&\xff\xd7\x03\ +o\x00*\xff\xd7\x03o\x002\xff\xd7\x03o\x004\xff\ +\xd7\x03o\x00D\xff\x9a\x03o\x00F\xff\x9a\x03o\x00\ +G\xff\x9a\x03o\x00H\xff\x9a\x03o\x00J\xff\xd7\x03\ +o\x00P\xff\xc3\x03o\x00Q\xff\xc3\x03o\x00R\xff\ +\x9a\x03o\x00S\xff\xc3\x03o\x00T\xff\x9a\x03o\x00\ +U\xff\xc3\x03o\x00V\xff\xae\x03o\x00X\xff\xc3\x03\ +o\x00]\xff\xd7\x03o\x00\x82\xff\x85\x03o\x00\x83\xff\ +\x85\x03o\x00\x84\xff\x85\x03o\x00\x85\xff\x85\x03o\x00\ +\x86\xff\x85\x03o\x00\x87\xff\x85\x03o\x00\x89\xff\xd7\x03\ +o\x00\x94\xff\xd7\x03o\x00\x95\xff\xd7\x03o\x00\x96\xff\ +\xd7\x03o\x00\x97\xff\xd7\x03o\x00\x98\xff\xd7\x03o\x00\ +\x9a\xff\xd7\x03o\x00\xa2\xff\x9a\x03o\x00\xa3\xff\x9a\x03\ +o\x00\xa4\xff\x9a\x03o\x00\xa5\xff\x9a\x03o\x00\xa6\xff\ +\x9a\x03o\x00\xa7\xff\x9a\x03o\x00\xa8\xff\x9a\x03o\x00\ +\xa9\xff\x9a\x03o\x00\xaa\xff\x9a\x03o\x00\xab\xff\x9a\x03\ +o\x00\xac\xff\x9a\x03o\x00\xad\xff\x9a\x03o\x00\xb4\xff\ +\x9a\x03o\x00\xb5\xff\x9a\x03o\x00\xb6\xff\x9a\x03o\x00\ +\xb7\xff\x9a\x03o\x00\xb8\xff\x9a\x03o\x00\xba\xff\x9a\x03\ +o\x00\xbb\xff\xc3\x03o\x00\xbc\xff\xc3\x03o\x00\xbd\xff\ +\xc3\x03o\x00\xbe\xff\xc3\x03o\x00\xc2\xff\x85\x03o\x00\ +\xc3\xff\x9a\x03o\x00\xc4\xff\x85\x03o\x00\xc5\xff\x9a\x03\ +o\x00\xc6\xff\x85\x03o\x00\xc7\xff\x9a\x03o\x00\xc8\xff\ +\xd7\x03o\x00\xc9\xff\x9a\x03o\x00\xca\xff\xd7\x03o\x00\ +\xcb\xff\x9a\x03o\x00\xcc\xff\xd7\x03o\x00\xcd\xff\x9a\x03\ +o\x00\xce\xff\xd7\x03o\x00\xcf\xff\x9a\x03o\x00\xd1\xff\ +\x9a\x03o\x00\xd3\xff\x9a\x03o\x00\xd5\xff\x9a\x03o\x00\ +\xd7\xff\x9a\x03o\x00\xd9\xff\x9a\x03o\x00\xdb\xff\x9a\x03\ +o\x00\xdd\xff\x9a\x03o\x00\xde\xff\xd7\x03o\x00\xdf\xff\ +\xd7\x03o\x00\xe0\xff\xd7\x03o\x00\xe1\xff\xd7\x03o\x00\ +\xe2\xff\xd7\x03o\x00\xe3\xff\xd7\x03o\x00\xe4\xff\xd7\x03\ +o\x00\xe5\xff\xd7\x03o\x00\xfa\xff\xc3\x03o\x01\x06\xff\ +\xc3\x03o\x01\x08\xff\xc3\x03o\x01\x0d\xff\xc3\x03o\x01\ +\x0e\xff\xd7\x03o\x01\x0f\xff\x9a\x03o\x01\x10\xff\xd7\x03\ +o\x01\x11\xff\x9a\x03o\x01\x12\xff\xd7\x03o\x01\x13\xff\ +\x9a\x03o\x01\x14\xff\xd7\x03o\x01\x15\xff\x9a\x03o\x01\ +\x17\xff\xc3\x03o\x01\x19\xff\xc3\x03o\x01\x1d\xff\xae\x03\ +o\x01!\xff\xae\x03o\x01+\xff\xc3\x03o\x01-\xff\ +\xc3\x03o\x01/\xff\xc3\x03o\x011\xff\xc3\x03o\x01\ +3\xff\xc3\x03o\x015\xff\xc3\x03o\x01<\xff\xd7\x03\ +o\x01>\xff\xd7\x03o\x01@\xff\xd7\x03o\x01C\xff\ +\x85\x03o\x01D\xff\x9a\x03o\x01F\xff\x9a\x03o\x01\ +G\xff\xd7\x03o\x01H\xff\x9a\x03o\x01J\xff\xae\x03\ +o\x02\x08\xff\x85\x03o\x02\x0c\xff\x85\x03o\x02W\xff\ +\xc3\x03o\x02X\xff\x85\x03o\x02Y\xff\x9a\x03o\x02\ +_\xff\xd7\x03o\x02`\xff\x9a\x03o\x02b\xff\xc3\x03\ +o\x03\x1d\xff\x85\x03o\x03\x1e\xff\x9a\x03o\x03\x1f\xff\ +\x85\x03o\x03 \xff\x9a\x03o\x03!\xff\x85\x03o\x03\ +\x22\xff\x9a\x03o\x03#\xff\x85\x03o\x03%\xff\x85\x03\ +o\x03&\xff\x9a\x03o\x03'\xff\x85\x03o\x03(\xff\ +\x9a\x03o\x03)\xff\x85\x03o\x03*\xff\x9a\x03o\x03\ ++\xff\x85\x03o\x03,\xff\x9a\x03o\x03-\xff\x85\x03\ +o\x03.\xff\x9a\x03o\x03/\xff\x85\x03o\x030\xff\ +\x9a\x03o\x031\xff\x85\x03o\x032\xff\x9a\x03o\x03\ +3\xff\x85\x03o\x034\xff\x9a\x03o\x036\xff\x9a\x03\ +o\x038\xff\x9a\x03o\x03:\xff\x9a\x03o\x03<\xff\ +\x9a\x03o\x03@\xff\x9a\x03o\x03B\xff\x9a\x03o\x03\ +D\xff\x9a\x03o\x03I\xff\xd7\x03o\x03J\xff\x9a\x03\ +o\x03K\xff\xd7\x03o\x03L\xff\x9a\x03o\x03M\xff\ +\xd7\x03o\x03N\xff\x9a\x03o\x03O\xff\xd7\x03o\x03\ +Q\xff\xd7\x03o\x03R\xff\x9a\x03o\x03S\xff\xd7\x03\ +o\x03T\xff\x9a\x03o\x03U\xff\xd7\x03o\x03V\xff\ +\x9a\x03o\x03W\xff\xd7\x03o\x03X\xff\x9a\x03o\x03\ +Y\xff\xd7\x03o\x03Z\xff\x9a\x03o\x03[\xff\xd7\x03\ +o\x03\x5c\xff\x9a\x03o\x03]\xff\xd7\x03o\x03^\xff\ +\x9a\x03o\x03_\xff\xd7\x03o\x03`\xff\x9a\x03o\x03\ +b\xff\xc3\x03o\x03d\xff\xc3\x03o\x03f\xff\xc3\x03\ +o\x03h\xff\xc3\x03o\x03j\xff\xc3\x03o\x03l\xff\ +\xc3\x03o\x03n\xff\xc3\x03p\x00\x05\x00R\x03p\x00\ +\x0a\x00R\x03p\x00\x0f\xff\xae\x03p\x00\x11\xff\xae\x03\ +p\x00\x22\x00)\x03p\x02\x07\x00R\x03p\x02\x08\xff\ +\xae\x03p\x02\x0b\x00R\x03p\x02\x0c\xff\xae\x03q\x00\ +\x0f\xff\x85\x03q\x00\x11\xff\x85\x03q\x00\x22\x00)\x03\ +q\x00$\xff\x85\x03q\x00&\xff\xd7\x03q\x00*\xff\ +\xd7\x03q\x002\xff\xd7\x03q\x004\xff\xd7\x03q\x00\ +D\xff\x9a\x03q\x00F\xff\x9a\x03q\x00G\xff\x9a\x03\ +q\x00H\xff\x9a\x03q\x00J\xff\xd7\x03q\x00P\xff\ +\xc3\x03q\x00Q\xff\xc3\x03q\x00R\xff\x9a\x03q\x00\ +S\xff\xc3\x03q\x00T\xff\x9a\x03q\x00U\xff\xc3\x03\ +q\x00V\xff\xae\x03q\x00X\xff\xc3\x03q\x00]\xff\ +\xd7\x03q\x00\x82\xff\x85\x03q\x00\x83\xff\x85\x03q\x00\ +\x84\xff\x85\x03q\x00\x85\xff\x85\x03q\x00\x86\xff\x85\x03\ +q\x00\x87\xff\x85\x03q\x00\x89\xff\xd7\x03q\x00\x94\xff\ +\xd7\x03q\x00\x95\xff\xd7\x03q\x00\x96\xff\xd7\x03q\x00\ +\x97\xff\xd7\x03q\x00\x98\xff\xd7\x03q\x00\x9a\xff\xd7\x03\ +q\x00\xa2\xff\x9a\x03q\x00\xa3\xff\x9a\x03q\x00\xa4\xff\ +\x9a\x03q\x00\xa5\xff\x9a\x03q\x00\xa6\xff\x9a\x03q\x00\ +\xa7\xff\x9a\x03q\x00\xa8\xff\x9a\x03q\x00\xa9\xff\x9a\x03\ +q\x00\xaa\xff\x9a\x03q\x00\xab\xff\x9a\x03q\x00\xac\xff\ +\x9a\x03q\x00\xad\xff\x9a\x03q\x00\xb4\xff\x9a\x03q\x00\ +\xb5\xff\x9a\x03q\x00\xb6\xff\x9a\x03q\x00\xb7\xff\x9a\x03\ +q\x00\xb8\xff\x9a\x03q\x00\xba\xff\x9a\x03q\x00\xbb\xff\ +\xc3\x03q\x00\xbc\xff\xc3\x03q\x00\xbd\xff\xc3\x03q\x00\ +\xbe\xff\xc3\x03q\x00\xc2\xff\x85\x03q\x00\xc3\xff\x9a\x03\ +q\x00\xc4\xff\x85\x03q\x00\xc5\xff\x9a\x03q\x00\xc6\xff\ +\x85\x03q\x00\xc7\xff\x9a\x03q\x00\xc8\xff\xd7\x03q\x00\ +\xc9\xff\x9a\x03q\x00\xca\xff\xd7\x03q\x00\xcb\xff\x9a\x03\ +q\x00\xcc\xff\xd7\x03q\x00\xcd\xff\x9a\x03q\x00\xce\xff\ +\xd7\x03q\x00\xcf\xff\x9a\x03q\x00\xd1\xff\x9a\x03q\x00\ +\xd3\xff\x9a\x03q\x00\xd5\xff\x9a\x03q\x00\xd7\xff\x9a\x03\ +q\x00\xd9\xff\x9a\x03q\x00\xdb\xff\x9a\x03q\x00\xdd\xff\ +\x9a\x03q\x00\xde\xff\xd7\x03q\x00\xdf\xff\xd7\x03q\x00\ +\xe0\xff\xd7\x03q\x00\xe1\xff\xd7\x03q\x00\xe2\xff\xd7\x03\ +q\x00\xe3\xff\xd7\x03q\x00\xe4\xff\xd7\x03q\x00\xe5\xff\ +\xd7\x03q\x00\xfa\xff\xc3\x03q\x01\x06\xff\xc3\x03q\x01\ +\x08\xff\xc3\x03q\x01\x0d\xff\xc3\x03q\x01\x0e\xff\xd7\x03\ +q\x01\x0f\xff\x9a\x03q\x01\x10\xff\xd7\x03q\x01\x11\xff\ +\x9a\x03q\x01\x12\xff\xd7\x03q\x01\x13\xff\x9a\x03q\x01\ +\x14\xff\xd7\x03q\x01\x15\xff\x9a\x03q\x01\x17\xff\xc3\x03\ +q\x01\x19\xff\xc3\x03q\x01\x1d\xff\xae\x03q\x01!\xff\ +\xae\x03q\x01+\xff\xc3\x03q\x01-\xff\xc3\x03q\x01\ +/\xff\xc3\x03q\x011\xff\xc3\x03q\x013\xff\xc3\x03\ +q\x015\xff\xc3\x03q\x01<\xff\xd7\x03q\x01>\xff\ +\xd7\x03q\x01@\xff\xd7\x03q\x01C\xff\x85\x03q\x01\ +D\xff\x9a\x03q\x01F\xff\x9a\x03q\x01G\xff\xd7\x03\ +q\x01H\xff\x9a\x03q\x01J\xff\xae\x03q\x02\x08\xff\ +\x85\x03q\x02\x0c\xff\x85\x03q\x02W\xff\xc3\x03q\x02\ +X\xff\x85\x03q\x02Y\xff\x9a\x03q\x02_\xff\xd7\x03\ +q\x02`\xff\x9a\x03q\x02b\xff\xc3\x03q\x03\x1d\xff\ +\x85\x03q\x03\x1e\xff\x9a\x03q\x03\x1f\xff\x85\x03q\x03\ + \xff\x9a\x03q\x03!\xff\x85\x03q\x03\x22\xff\x9a\x03\ +q\x03#\xff\x85\x03q\x03%\xff\x85\x03q\x03&\xff\ +\x9a\x03q\x03'\xff\x85\x03q\x03(\xff\x9a\x03q\x03\ +)\xff\x85\x03q\x03*\xff\x9a\x03q\x03+\xff\x85\x03\ +q\x03,\xff\x9a\x03q\x03-\xff\x85\x03q\x03.\xff\ +\x9a\x03q\x03/\xff\x85\x03q\x030\xff\x9a\x03q\x03\ +1\xff\x85\x03q\x032\xff\x9a\x03q\x033\xff\x85\x03\ +q\x034\xff\x9a\x03q\x036\xff\x9a\x03q\x038\xff\ +\x9a\x03q\x03:\xff\x9a\x03q\x03<\xff\x9a\x03q\x03\ +@\xff\x9a\x03q\x03B\xff\x9a\x03q\x03D\xff\x9a\x03\ +q\x03I\xff\xd7\x03q\x03J\xff\x9a\x03q\x03K\xff\ +\xd7\x03q\x03L\xff\x9a\x03q\x03M\xff\xd7\x03q\x03\ +N\xff\x9a\x03q\x03O\xff\xd7\x03q\x03Q\xff\xd7\x03\ +q\x03R\xff\x9a\x03q\x03S\xff\xd7\x03q\x03T\xff\ +\x9a\x03q\x03U\xff\xd7\x03q\x03V\xff\x9a\x03q\x03\ +W\xff\xd7\x03q\x03X\xff\x9a\x03q\x03Y\xff\xd7\x03\ +q\x03Z\xff\x9a\x03q\x03[\xff\xd7\x03q\x03\x5c\xff\ +\x9a\x03q\x03]\xff\xd7\x03q\x03^\xff\x9a\x03q\x03\ +_\xff\xd7\x03q\x03`\xff\x9a\x03q\x03b\xff\xc3\x03\ +q\x03d\xff\xc3\x03q\x03f\xff\xc3\x03q\x03h\xff\ +\xc3\x03q\x03j\xff\xc3\x03q\x03l\xff\xc3\x03q\x03\ +n\xff\xc3\x03r\x00\x05\x00R\x03r\x00\x0a\x00R\x03\ +r\x00\x0f\xff\xae\x03r\x00\x11\xff\xae\x03r\x00\x22\x00\ +)\x03r\x02\x07\x00R\x03r\x02\x08\xff\xae\x03r\x02\ +\x0b\x00R\x03r\x02\x0c\xff\xae\x03s\x00\x0f\xff\x85\x03\ +s\x00\x11\xff\x85\x03s\x00\x22\x00)\x03s\x00$\xff\ +\x85\x03s\x00&\xff\xd7\x03s\x00*\xff\xd7\x03s\x00\ +2\xff\xd7\x03s\x004\xff\xd7\x03s\x00D\xff\x9a\x03\ +s\x00F\xff\x9a\x03s\x00G\xff\x9a\x03s\x00H\xff\ +\x9a\x03s\x00J\xff\xd7\x03s\x00P\xff\xc3\x03s\x00\ +Q\xff\xc3\x03s\x00R\xff\x9a\x03s\x00S\xff\xc3\x03\ +s\x00T\xff\x9a\x03s\x00U\xff\xc3\x03s\x00V\xff\ +\xae\x03s\x00X\xff\xc3\x03s\x00]\xff\xd7\x03s\x00\ +\x82\xff\x85\x03s\x00\x83\xff\x85\x03s\x00\x84\xff\x85\x03\ +s\x00\x85\xff\x85\x03s\x00\x86\xff\x85\x03s\x00\x87\xff\ +\x85\x03s\x00\x89\xff\xd7\x03s\x00\x94\xff\xd7\x03s\x00\ +\x95\xff\xd7\x03s\x00\x96\xff\xd7\x03s\x00\x97\xff\xd7\x03\ +s\x00\x98\xff\xd7\x03s\x00\x9a\xff\xd7\x03s\x00\xa2\xff\ +\x9a\x03s\x00\xa3\xff\x9a\x03s\x00\xa4\xff\x9a\x03s\x00\ +\xa5\xff\x9a\x03s\x00\xa6\xff\x9a\x03s\x00\xa7\xff\x9a\x03\ +s\x00\xa8\xff\x9a\x03s\x00\xa9\xff\x9a\x03s\x00\xaa\xff\ +\x9a\x03s\x00\xab\xff\x9a\x03s\x00\xac\xff\x9a\x03s\x00\ +\xad\xff\x9a\x03s\x00\xb4\xff\x9a\x03s\x00\xb5\xff\x9a\x03\ +s\x00\xb6\xff\x9a\x03s\x00\xb7\xff\x9a\x03s\x00\xb8\xff\ +\x9a\x03s\x00\xba\xff\x9a\x03s\x00\xbb\xff\xc3\x03s\x00\ +\xbc\xff\xc3\x03s\x00\xbd\xff\xc3\x03s\x00\xbe\xff\xc3\x03\ +s\x00\xc2\xff\x85\x03s\x00\xc3\xff\x9a\x03s\x00\xc4\xff\ +\x85\x03s\x00\xc5\xff\x9a\x03s\x00\xc6\xff\x85\x03s\x00\ +\xc7\xff\x9a\x03s\x00\xc8\xff\xd7\x03s\x00\xc9\xff\x9a\x03\ +s\x00\xca\xff\xd7\x03s\x00\xcb\xff\x9a\x03s\x00\xcc\xff\ +\xd7\x03s\x00\xcd\xff\x9a\x03s\x00\xce\xff\xd7\x03s\x00\ +\xcf\xff\x9a\x03s\x00\xd1\xff\x9a\x03s\x00\xd3\xff\x9a\x03\ +s\x00\xd5\xff\x9a\x03s\x00\xd7\xff\x9a\x03s\x00\xd9\xff\ +\x9a\x03s\x00\xdb\xff\x9a\x03s\x00\xdd\xff\x9a\x03s\x00\ +\xde\xff\xd7\x03s\x00\xdf\xff\xd7\x03s\x00\xe0\xff\xd7\x03\ +s\x00\xe1\xff\xd7\x03s\x00\xe2\xff\xd7\x03s\x00\xe3\xff\ +\xd7\x03s\x00\xe4\xff\xd7\x03s\x00\xe5\xff\xd7\x03s\x00\ +\xfa\xff\xc3\x03s\x01\x06\xff\xc3\x03s\x01\x08\xff\xc3\x03\ +s\x01\x0d\xff\xc3\x03s\x01\x0e\xff\xd7\x03s\x01\x0f\xff\ +\x9a\x03s\x01\x10\xff\xd7\x03s\x01\x11\xff\x9a\x03s\x01\ +\x12\xff\xd7\x03s\x01\x13\xff\x9a\x03s\x01\x14\xff\xd7\x03\ +s\x01\x15\xff\x9a\x03s\x01\x17\xff\xc3\x03s\x01\x19\xff\ +\xc3\x03s\x01\x1d\xff\xae\x03s\x01!\xff\xae\x03s\x01\ ++\xff\xc3\x03s\x01-\xff\xc3\x03s\x01/\xff\xc3\x03\ +s\x011\xff\xc3\x03s\x013\xff\xc3\x03s\x015\xff\ +\xc3\x03s\x01<\xff\xd7\x03s\x01>\xff\xd7\x03s\x01\ +@\xff\xd7\x03s\x01C\xff\x85\x03s\x01D\xff\x9a\x03\ +s\x01F\xff\x9a\x03s\x01G\xff\xd7\x03s\x01H\xff\ +\x9a\x03s\x01J\xff\xae\x03s\x02\x08\xff\x85\x03s\x02\ +\x0c\xff\x85\x03s\x02W\xff\xc3\x03s\x02X\xff\x85\x03\ +s\x02Y\xff\x9a\x03s\x02_\xff\xd7\x03s\x02`\xff\ +\x9a\x03s\x02b\xff\xc3\x03s\x03\x1d\xff\x85\x03s\x03\ +\x1e\xff\x9a\x03s\x03\x1f\xff\x85\x03s\x03 \xff\x9a\x03\ +s\x03!\xff\x85\x03s\x03\x22\xff\x9a\x03s\x03#\xff\ +\x85\x03s\x03%\xff\x85\x03s\x03&\xff\x9a\x03s\x03\ +'\xff\x85\x03s\x03(\xff\x9a\x03s\x03)\xff\x85\x03\ +s\x03*\xff\x9a\x03s\x03+\xff\x85\x03s\x03,\xff\ +\x9a\x03s\x03-\xff\x85\x03s\x03.\xff\x9a\x03s\x03\ +/\xff\x85\x03s\x030\xff\x9a\x03s\x031\xff\x85\x03\ +s\x032\xff\x9a\x03s\x033\xff\x85\x03s\x034\xff\ +\x9a\x03s\x036\xff\x9a\x03s\x038\xff\x9a\x03s\x03\ +:\xff\x9a\x03s\x03<\xff\x9a\x03s\x03@\xff\x9a\x03\ +s\x03B\xff\x9a\x03s\x03D\xff\x9a\x03s\x03I\xff\ +\xd7\x03s\x03J\xff\x9a\x03s\x03K\xff\xd7\x03s\x03\ +L\xff\x9a\x03s\x03M\xff\xd7\x03s\x03N\xff\x9a\x03\ +s\x03O\xff\xd7\x03s\x03Q\xff\xd7\x03s\x03R\xff\ +\x9a\x03s\x03S\xff\xd7\x03s\x03T\xff\x9a\x03s\x03\ +U\xff\xd7\x03s\x03V\xff\x9a\x03s\x03W\xff\xd7\x03\ +s\x03X\xff\x9a\x03s\x03Y\xff\xd7\x03s\x03Z\xff\ +\x9a\x03s\x03[\xff\xd7\x03s\x03\x5c\xff\x9a\x03s\x03\ +]\xff\xd7\x03s\x03^\xff\x9a\x03s\x03_\xff\xd7\x03\ +s\x03`\xff\x9a\x03s\x03b\xff\xc3\x03s\x03d\xff\ +\xc3\x03s\x03f\xff\xc3\x03s\x03h\xff\xc3\x03s\x03\ +j\xff\xc3\x03s\x03l\xff\xc3\x03s\x03n\xff\xc3\x03\ +t\x00\x05\x00R\x03t\x00\x0a\x00R\x03t\x00\x0f\xff\ +\xae\x03t\x00\x11\xff\xae\x03t\x00\x22\x00)\x03t\x02\ +\x07\x00R\x03t\x02\x08\xff\xae\x03t\x02\x0b\x00R\x03\ +t\x02\x0c\xff\xae\x03\x8d\x00\x05\x00{\x03\x8d\x00\x0a\x00\ +{\x03\x8d\x02\x07\x00{\x03\x8d\x02\x0b\x00{\x03\x8f\x00\ +\x0f\xff\x85\x03\x8f\x00\x10\xff\xae\x03\x8f\x00\x11\xff\x85\x03\ +\x8f\x00\x22\x00)\x03\x8f\x00$\xffq\x03\x8f\x00&\xff\ +\xd7\x03\x8f\x00*\xff\xd7\x03\x8f\x002\xff\xd7\x03\x8f\x00\ +4\xff\xd7\x03\x8f\x007\x00)\x03\x8f\x00D\xff\x5c\x03\ +\x8f\x00F\xffq\x03\x8f\x00G\xffq\x03\x8f\x00H\xff\ +q\x03\x8f\x00J\xffq\x03\x8f\x00P\xff\x9a\x03\x8f\x00\ +Q\xff\x9a\x03\x8f\x00R\xffq\x03\x8f\x00S\xff\x9a\x03\ +\x8f\x00T\xffq\x03\x8f\x00U\xff\x9a\x03\x8f\x00V\xff\ +\x85\x03\x8f\x00X\xff\x9a\x03\x8f\x00Y\xff\xd7\x03\x8f\x00\ +Z\xff\xd7\x03\x8f\x00[\xff\xd7\x03\x8f\x00\x5c\xff\xd7\x03\ +\x8f\x00]\xff\xae\x03\x8f\x00\x82\xffq\x03\x8f\x00\x83\xff\ +q\x03\x8f\x00\x84\xffq\x03\x8f\x00\x85\xffq\x03\x8f\x00\ +\x86\xffq\x03\x8f\x00\x87\xffq\x03\x8f\x00\x89\xff\xd7\x03\ +\x8f\x00\x94\xff\xd7\x03\x8f\x00\x95\xff\xd7\x03\x8f\x00\x96\xff\ +\xd7\x03\x8f\x00\x97\xff\xd7\x03\x8f\x00\x98\xff\xd7\x03\x8f\x00\ +\x9a\xff\xd7\x03\x8f\x00\xa2\xffq\x03\x8f\x00\xa3\xff\x5c\x03\ +\x8f\x00\xa4\xff\x5c\x03\x8f\x00\xa5\xff\x5c\x03\x8f\x00\xa6\xff\ +\x5c\x03\x8f\x00\xa7\xff\x5c\x03\x8f\x00\xa8\xff\x5c\x03\x8f\x00\ +\xa9\xffq\x03\x8f\x00\xaa\xffq\x03\x8f\x00\xab\xffq\x03\ +\x8f\x00\xac\xffq\x03\x8f\x00\xad\xffq\x03\x8f\x00\xb4\xff\ +q\x03\x8f\x00\xb5\xffq\x03\x8f\x00\xb6\xffq\x03\x8f\x00\ +\xb7\xffq\x03\x8f\x00\xb8\xffq\x03\x8f\x00\xba\xffq\x03\ +\x8f\x00\xbb\xff\x9a\x03\x8f\x00\xbc\xff\x9a\x03\x8f\x00\xbd\xff\ +\x9a\x03\x8f\x00\xbe\xff\x9a\x03\x8f\x00\xbf\xff\xd7\x03\x8f\x00\ +\xc2\xffq\x03\x8f\x00\xc3\xff\x5c\x03\x8f\x00\xc4\xffq\x03\ +\x8f\x00\xc5\xff\x5c\x03\x8f\x00\xc6\xffq\x03\x8f\x00\xc7\xff\ +\x5c\x03\x8f\x00\xc8\xff\xd7\x03\x8f\x00\xc9\xffq\x03\x8f\x00\ +\xca\xff\xd7\x03\x8f\x00\xcb\xffq\x03\x8f\x00\xcc\xff\xd7\x03\ +\x8f\x00\xcd\xffq\x03\x8f\x00\xce\xff\xd7\x03\x8f\x00\xcf\xff\ +q\x03\x8f\x00\xd1\xffq\x03\x8f\x00\xd3\xffq\x03\x8f\x00\ +\xd5\xffq\x03\x8f\x00\xd7\xffq\x03\x8f\x00\xd9\xffq\x03\ +\x8f\x00\xdb\xffq\x03\x8f\x00\xdd\xffq\x03\x8f\x00\xde\xff\ +\xd7\x03\x8f\x00\xdf\xffq\x03\x8f\x00\xe0\xff\xd7\x03\x8f\x00\ +\xe1\xffq\x03\x8f\x00\xe2\xff\xd7\x03\x8f\x00\xe3\xffq\x03\ +\x8f\x00\xe4\xff\xd7\x03\x8f\x00\xe5\xffq\x03\x8f\x00\xfa\xff\ +\x9a\x03\x8f\x01\x06\xff\x9a\x03\x8f\x01\x08\xff\x9a\x03\x8f\x01\ +\x0d\xff\x9a\x03\x8f\x01\x0e\xff\xd7\x03\x8f\x01\x0f\xffq\x03\ +\x8f\x01\x10\xff\xd7\x03\x8f\x01\x11\xffq\x03\x8f\x01\x12\xff\ +\xd7\x03\x8f\x01\x13\xffq\x03\x8f\x01\x14\xff\xd7\x03\x8f\x01\ +\x15\xffq\x03\x8f\x01\x17\xff\x9a\x03\x8f\x01\x19\xff\x9a\x03\ +\x8f\x01\x1d\xff\x85\x03\x8f\x01!\xff\x85\x03\x8f\x01$\x00\ +)\x03\x8f\x01&\x00)\x03\x8f\x01+\xff\x9a\x03\x8f\x01\ +-\xff\x9a\x03\x8f\x01/\xff\x9a\x03\x8f\x011\xff\x9a\x03\ +\x8f\x013\xff\x9a\x03\x8f\x015\xff\x9a\x03\x8f\x017\xff\ +\xd7\x03\x8f\x01<\xff\xae\x03\x8f\x01>\xff\xae\x03\x8f\x01\ +@\xff\xae\x03\x8f\x01C\xffq\x03\x8f\x01D\xff\x5c\x03\ +\x8f\x01F\xff\x5c\x03\x8f\x01G\xff\xd7\x03\x8f\x01H\xff\ +q\x03\x8f\x01J\xff\x85\x03\x8f\x01\xfb\xff\xd7\x03\x8f\x01\ +\xfd\xff\xd7\x03\x8f\x02\x02\xff\xae\x03\x8f\x02\x03\xff\xae\x03\ +\x8f\x02\x04\xff\xae\x03\x8f\x02\x08\xff\x85\x03\x8f\x02\x0c\xff\ +\x85\x03\x8f\x02W\xff\x9a\x03\x8f\x02X\xffq\x03\x8f\x02\ +Y\xff\x5c\x03\x8f\x02_\xff\xd7\x03\x8f\x02`\xffq\x03\ +\x8f\x02b\xff\x9a\x03\x8f\x03\x1d\xffq\x03\x8f\x03\x1e\xff\ +\x5c\x03\x8f\x03\x1f\xffq\x03\x8f\x03 \xff\x5c\x03\x8f\x03\ +!\xffq\x03\x8f\x03\x22\xff\x5c\x03\x8f\x03#\xffq\x03\ +\x8f\x03%\xffq\x03\x8f\x03&\xff\x5c\x03\x8f\x03'\xff\ +q\x03\x8f\x03(\xff\x5c\x03\x8f\x03)\xffq\x03\x8f\x03\ +*\xff\x5c\x03\x8f\x03+\xffq\x03\x8f\x03,\xff\x5c\x03\ +\x8f\x03-\xffq\x03\x8f\x03.\xff\x5c\x03\x8f\x03/\xff\ +q\x03\x8f\x030\xff\x5c\x03\x8f\x031\xffq\x03\x8f\x03\ +2\xff\x5c\x03\x8f\x033\xffq\x03\x8f\x034\xff\x5c\x03\ +\x8f\x036\xffq\x03\x8f\x038\xffq\x03\x8f\x03:\xff\ +q\x03\x8f\x03<\xffq\x03\x8f\x03@\xffq\x03\x8f\x03\ +B\xffq\x03\x8f\x03D\xffq\x03\x8f\x03I\xff\xd7\x03\ +\x8f\x03J\xffq\x03\x8f\x03K\xff\xd7\x03\x8f\x03L\xff\ +q\x03\x8f\x03M\xff\xd7\x03\x8f\x03N\xffq\x03\x8f\x03\ +O\xff\xd7\x03\x8f\x03Q\xff\xd7\x03\x8f\x03R\xffq\x03\ +\x8f\x03S\xff\xd7\x03\x8f\x03T\xffq\x03\x8f\x03U\xff\ +\xd7\x03\x8f\x03V\xffq\x03\x8f\x03W\xff\xd7\x03\x8f\x03\ +X\xffq\x03\x8f\x03Y\xff\xd7\x03\x8f\x03Z\xffq\x03\ +\x8f\x03[\xff\xd7\x03\x8f\x03\x5c\xffq\x03\x8f\x03]\xff\ +\xd7\x03\x8f\x03^\xffq\x03\x8f\x03_\xff\xd7\x03\x8f\x03\ +`\xffq\x03\x8f\x03b\xff\x9a\x03\x8f\x03d\xff\x9a\x03\ +\x8f\x03f\xff\x9a\x03\x8f\x03h\xff\x9a\x03\x8f\x03j\xff\ +\x9a\x03\x8f\x03l\xff\x9a\x03\x8f\x03n\xff\x9a\x03\x8f\x03\ +p\xff\xd7\x03\x8f\x03\x8f\x00)\x03\x90\x00\x05\x00)\x03\ +\x90\x00\x0a\x00)\x03\x90\x02\x07\x00)\x03\x90\x02\x0b\x00\ +)\x00\x00\x00\x00\x00\x1e\x01n\x00\x01\x00\x00\x00\x00\x00\ +\x00\x009\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x0f\x00\ +9\x00\x01\x00\x00\x00\x00\x00\x02\x00\x06\x00H\x00\x01\x00\ +\x00\x00\x00\x00\x03\x00+\x00N\x00\x01\x00\x00\x00\x00\x00\ +\x04\x00\x16\x00Y\x00\x01\x00\x00\x00\x00\x00\x05\x00\x0c\x00\ +y\x00\x01\x00\x00\x00\x00\x00\x06\x00\x14\x00\x85\x00\x01\x00\ +\x00\x00\x00\x00\x07\x00R\x00\x99\x00\x01\x00\x00\x00\x00\x00\ +\x08\x00\x14\x00\xeb\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x1c\x00\ +\xff\x00\x01\x00\x00\x00\x00\x00\x0c\x00.\x01\x1b\x00\x01\x00\ +\x00\x00\x00\x00\x0d\x00.\x01I\x00\x01\x00\x00\x00\x00\x00\ +\x0e\x00*\x01w\x00\x01\x00\x00\x00\x00\x00\x10\x00\x09\x00\ +9\x00\x01\x00\x00\x00\x00\x00\x11\x00\x0c\x00c\x00\x03\x00\ +\x01\x04\x09\x00\x00\x00r\x01\xa1\x00\x03\x00\x01\x04\x09\x00\ +\x01\x00\x1e\x02\x13\x00\x03\x00\x01\x04\x09\x00\x02\x00\x0c\x02\ +1\x00\x03\x00\x01\x04\x09\x00\x03\x00V\x02=\x00\x03\x00\ +\x01\x04\x09\x00\x04\x00,\x02S\x00\x03\x00\x01\x04\x09\x00\ +\x05\x00\x18\x02\x93\x00\x03\x00\x01\x04\x09\x00\x06\x00(\x02\ +\xab\x00\x03\x00\x01\x04\x09\x00\x07\x00\xa4\x02\xd3\x00\x03\x00\ +\x01\x04\x09\x00\x08\x00(\x03w\x00\x03\x00\x01\x04\x09\x00\ +\x0b\x008\x03\x9f\x00\x03\x00\x01\x04\x09\x00\x0c\x00\x5c\x03\ +\xd7\x00\x03\x00\x01\x04\x09\x00\x0d\x00\x5c\x043\x00\x03\x00\ +\x01\x04\x09\x00\x0e\x00T\x04\x8f\x00\x03\x00\x01\x04\x09\x00\ +\x10\x00\x12\x02\x13\x00\x03\x00\x01\x04\x09\x00\x11\x00\x18\x02\ +gDigitized data \ +copyright \xa9 2010\ +-2011, Google Co\ +rporation.Open S\ +ans LightItalicA\ +scender - Open S\ +ans Light Italic\ + Build 100Versio\ +n 1.10OpenSansLi\ +ght-ItalicOpen S\ +ans is a tradema\ +rk of Google and\ + may be register\ +ed in certain ju\ +risdictions.Asce\ +nder Corporation\ +http://www.ascen\ +dercorp.com/http\ +://www.ascenderc\ +orp.com/typedesi\ +gners.htmlLicens\ +ed under the Apa\ +che License, Ver\ +sion 2.0http://w\ +ww.apache.org/li\ +censes/LICENSE-2\ +.0\x00D\x00i\x00g\x00i\x00t\x00i\x00z\ +\x00e\x00d\x00 \x00d\x00a\x00t\x00a\x00 \ +\x00c\x00o\x00p\x00y\x00r\x00i\x00g\x00h\ +\x00t\x00 \x00\xa9\x00 \x002\x000\x001\x000\ +\x00-\x002\x000\x001\x001\x00,\x00 \x00G\ +\x00o\x00o\x00g\x00l\x00e\x00 \x00C\x00o\ +\x00r\x00p\x00o\x00r\x00a\x00t\x00i\x00o\ +\x00n\x00.\x00O\x00p\x00e\x00n\x00 \x00S\ +\x00a\x00n\x00s\x00 \x00L\x00i\x00g\x00h\ +\x00t\x00I\x00t\x00a\x00l\x00i\x00c\x00A\ +\x00s\x00c\x00e\x00n\x00d\x00e\x00r\x00 \ +\x00-\x00 \x00O\x00p\x00e\x00n\x00 \x00S\ +\x00a\x00n\x00s\x00 \x00L\x00i\x00g\x00h\ +\x00t\x00 \x00I\x00t\x00a\x00l\x00i\x00c\ +\x00 \x00B\x00u\x00i\x00l\x00d\x00 \x001\ +\x000\x000\x00V\x00e\x00r\x00s\x00i\x00o\ +\x00n\x00 \x001\x00.\x001\x000\x00O\x00p\ +\x00e\x00n\x00S\x00a\x00n\x00s\x00L\x00i\ +\x00g\x00h\x00t\x00-\x00I\x00t\x00a\x00l\ +\x00i\x00c\x00O\x00p\x00e\x00n\x00 \x00S\ +\x00a\x00n\x00s\x00 \x00i\x00s\x00 \x00a\ +\x00 \x00t\x00r\x00a\x00d\x00e\x00m\x00a\ +\x00r\x00k\x00 \x00o\x00f\x00 \x00G\x00o\ +\x00o\x00g\x00l\x00e\x00 \x00a\x00n\x00d\ +\x00 \x00m\x00a\x00y\x00 \x00b\x00e\x00 \ +\x00r\x00e\x00g\x00i\x00s\x00t\x00e\x00r\ +\x00e\x00d\x00 \x00i\x00n\x00 \x00c\x00e\ +\x00r\x00t\x00a\x00i\x00n\x00 \x00j\x00u\ +\x00r\x00i\x00s\x00d\x00i\x00c\x00t\x00i\ +\x00o\x00n\x00s\x00.\x00A\x00s\x00c\x00e\ +\x00n\x00d\x00e\x00r\x00 \x00C\x00o\x00r\ +\x00p\x00o\x00r\x00a\x00t\x00i\x00o\x00n\ +\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\ +\x00w\x00w\x00.\x00a\x00s\x00c\x00e\x00n\ +\x00d\x00e\x00r\x00c\x00o\x00r\x00p\x00.\ +\x00c\x00o\x00m\x00/\x00h\x00t\x00t\x00p\ +\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00a\ +\x00s\x00c\x00e\x00n\x00d\x00e\x00r\x00c\ +\x00o\x00r\x00p\x00.\x00c\x00o\x00m\x00/\ +\x00t\x00y\x00p\x00e\x00d\x00e\x00s\x00i\ +\x00g\x00n\x00e\x00r\x00s\x00.\x00h\x00t\ +\x00m\x00l\x00L\x00i\x00c\x00e\x00n\x00s\ +\x00e\x00d\x00 \x00u\x00n\x00d\x00e\x00r\ +\x00 \x00t\x00h\x00e\x00 \x00A\x00p\x00a\ +\x00c\x00h\x00e\x00 \x00L\x00i\x00c\x00e\ +\x00n\x00s\x00e\x00,\x00 \x00V\x00e\x00r\ +\x00s\x00i\x00o\x00n\x00 \x002\x00.\x000\ +\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\ +\x00w\x00w\x00.\x00a\x00p\x00a\x00c\x00h\ +\x00e\x00.\x00o\x00r\x00g\x00/\x00l\x00i\ +\x00c\x00e\x00n\x00s\x00e\x00s\x00/\x00L\ +\x00I\x00C\x00E\x00N\x00S\x00E\x00-\x002\ +\x00.\x000\x00\x00\x00\x00\x02\x00\x00\xff\xf4\x00\x00\xff\ +f\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x03\xaa\x01\x02\x01\x03\x01\x04\x01\ +\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\ +\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\ +\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\ +\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\x22\x01#\x01$\x01\ +%\x01&\x01'\x01(\x01)\x01*\x01+\x01,\x01\ +-\x01.\x01/\x010\x011\x012\x013\x014\x01\ +5\x016\x017\x018\x019\x01:\x01;\x01<\x01\ +=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01\ +E\x01F\x01G\x01H\x01I\x01J\x01K\x01L\x01\ +M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01\ +U\x01V\x01W\x01X\x01Y\x01Z\x01[\x01\x5c\x01\ +]\x01^\x01_\x01`\x01a\x01b\x01c\x01d\x01\ +e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01\ +m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01\ +u\x01v\x01w\x01x\x01y\x01z\x01{\x01|\x01\ +}\x01~\x01\x7f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\ +\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\ +\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\ +\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\ +\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\ +\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\ +\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\ +\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\ +\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\ +\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\ +\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\ +\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\ +\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\ +\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\ +\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\ +\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\ +\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\ +\x05\x02\x06\x02\x07\x02\x08\x02\x09\x02\x0a\x02\x0b\x02\x0c\x02\ +\x0d\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\ +\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\ +\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\x22\x02#\x02$\x02\ +%\x02&\x02'\x02(\x02)\x02*\x02+\x02,\x02\ +-\x02.\x02/\x020\x021\x022\x023\x024\x02\ +5\x026\x027\x028\x029\x02:\x02;\x02<\x02\ +=\x02>\x02?\x02@\x02A\x02B\x02C\x02D\x02\ +E\x02F\x02G\x02H\x02I\x02J\x02K\x02L\x02\ +M\x02N\x02O\x02P\x02Q\x02R\x02S\x02T\x02\ +U\x02V\x02W\x02X\x02Y\x02Z\x02[\x02\x5c\x02\ +]\x02^\x02_\x02`\x02a\x02b\x02c\x02d\x02\ +e\x02f\x02g\x02h\x02i\x02j\x02k\x02l\x02\ +m\x02n\x02o\x02p\x02q\x02r\x02s\x02t\x02\ +u\x02v\x02w\x02x\x02y\x02z\x02{\x02|\x02\ +}\x02~\x02\x7f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\ +\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\ +\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\ +\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\ +\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\ +\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\ +\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\ +\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\ +\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\ +\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\ +\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\ +\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\ +\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\ +\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\ +\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\ +\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\ +\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\ +\x05\x03\x06\x03\x07\x03\x08\x03\x09\x03\x0a\x03\x0b\x03\x0c\x03\ +\x0d\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\ +\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\ +\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\x22\x03#\x03$\x03\ +%\x03&\x03'\x03(\x03)\x03*\x03+\x03,\x03\ +-\x03.\x03/\x030\x031\x032\x033\x034\x03\ +5\x036\x037\x038\x039\x03:\x03;\x03<\x03\ +=\x03>\x03?\x03@\x03A\x03B\x03C\x03D\x03\ +E\x03F\x03G\x03H\x03I\x03J\x03K\x03L\x03\ +M\x03N\x03O\x03P\x03Q\x03R\x03S\x03T\x03\ +U\x03V\x03W\x03X\x03Y\x03Z\x03[\x03\x5c\x03\ +]\x03^\x03_\x03`\x03a\x03b\x03c\x03d\x03\ +e\x03f\x03g\x03h\x03i\x03j\x03k\x03l\x03\ +m\x03n\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x03v\x03w\x03x\x03y\x03z\x03{\x03|\x03\ +}\x03~\x03\x7f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\ +\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\ +\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\ +\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\ +\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\ +\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\ +\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\ +\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\ +\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc2\x03\xc3\x03\xc4\x03\ +\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x03\xca\x03\xcb\x03\xcc\x03\ +\xcd\x03\xce\x03\xcf\x03\xd0\x03\xd1\x03\xd2\x03\xd3\x03\xd4\x03\ +\xd5\x03\xd6\x03\xd7\x03\xd8\x03\xd9\x03\xda\x03\xdb\x03\xdc\x03\ +\xdd\x03\xde\x03\xdf\x03\xe0\x03\xe1\x03\xe2\x03\xe3\x03\xe4\x03\ +\xe5\x03\xe6\x03\xe7\x03\xe8\x03\xe9\x03\xea\x03\xeb\x03\xec\x03\ +\xed\x03\xee\x03\xef\x03\xf0\x03\xf1\x03\xf2\x03\xf3\x03\xf4\x03\ +\xf5\x03\xf6\x03\xf7\x03\xf8\x03\xf9\x03\xfa\x03\xfb\x03\xfc\x03\ +\xfd\x03\xfe\x03\xff\x04\x00\x04\x01\x04\x02\x04\x03\x04\x04\x04\ +\x05\x04\x06\x04\x07\x04\x08\x04\x09\x04\x0a\x04\x0b\x04\x0c\x04\ +\x0d\x04\x0e\x04\x0f\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\ +\x15\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\ +\x1d\x04\x1e\x04\x1f\x04 \x04!\x04\x22\x04#\x04$\x04\ +%\x04&\x04'\x04(\x04)\x04*\x04+\x04,\x04\ +-\x04.\x04/\x040\x041\x042\x043\x044\x04\ +5\x046\x047\x048\x049\x04:\x04;\x04<\x04\ +=\x04>\x04?\x04@\x04A\x04B\x04C\x04D\x04\ +E\x04F\x04G\x04H\x04I\x04J\x04K\x04L\x04\ +M\x04N\x04O\x04P\x04Q\x04R\x04S\x04T\x04\ +U\x04V\x04W\x04X\x04Y\x04Z\x04[\x04\x5c\x04\ +]\x04^\x04_\x04`\x04a\x04b\x04c\x04d\x04\ +e\x04f\x04g\x04h\x04i\x04j\x04k\x04l\x04\ +m\x04n\x04o\x04p\x04q\x04r\x04s\x04t\x04\ +u\x04v\x04w\x04x\x04y\x04z\x04{\x04|\x04\ +}\x04~\x04\x7f\x04\x80\x04\x81\x04\x82\x04\x83\x04\x84\x04\ +\x85\x04\x86\x04\x87\x04\x88\x04\x89\x04\x8a\x04\x8b\x04\x8c\x04\ +\x8d\x04\x8e\x04\x8f\x04\x90\x04\x91\x04\x92\x04\x93\x04\x94\x04\ +\x95\x04\x96\x04\x97\x04\x98\x04\x99\x04\x9a\x04\x9b\x04\x9c\x04\ +\x9d\x04\x9e\x04\x9f\x04\xa0\x04\xa1\x04\xa2\x04\xa3\x04\xa4\x04\ +\xa5\x04\xa6\x04\xa7\x04\xa8\x04\xa9\x04\xaa\x04\xab\x07.n\ +otdef\x04null\x10nonma\ +rkingreturn\x05spac\ +e\x06exclam\x08quotedb\ +l\x0anumbersign\x06dol\ +lar\x07percent\x09ampe\ +rsand\x0bquotesingl\ +e\x09parenleft\x0apare\ +nright\x08asterisk\x04\ +plus\x05comma\x06hyphe\ +n\x06period\x05slash\x04z\ +ero\x03one\x03two\x05thre\ +e\x04four\x04five\x03six\x05\ +seven\x05eight\x04nine\ +\x05colon\x09semicolon\ +\x04less\x05equal\x07grea\ +ter\x08question\x02at\x01\ +A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x05\ +I.alt\x01J\x01K\x01L\x01M\x01N\x01\ +O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01\ +W\x01X\x01Y\x01Z\x0bbracketl\ +eft\x09backslash\x0cbr\ +acketright\x0bascii\ +circum\x0aunderscor\ +e\x05grave\x01a\x01b\x01c\x01d\x01\ +e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01\ +m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01\ +u\x01v\x01w\x01x\x01y\x01z\x09brac\ +eleft\x03bar\x0abracer\ +ight\x0aasciitilde\x10\ +nonbreakingspace\ +\x0aexclamdown\x04cent\ +\x08sterling\x08curren\ +cy\x03yen\x09brokenbar\ +\x07section\x08dieresi\ +s\x09copyright\x0bordf\ +eminine\x0dguillemo\ +tleft\x0alogicalnot\ +\x07uni00AD\x0aregiste\ +red\x09overscore\x06de\ +gree\x09plusminus\x0bt\ +wosuperior\x0dthree\ +superior\x05acute\x02m\ +u\x09paragraph\x0eperi\ +odcentered\x07cedil\ +la\x0bonesuperior\x0co\ +rdmasculine\x0eguil\ +lemotright\x0aonequ\ +arter\x07onehalf\x0dth\ +reequarters\x0cques\ +tiondown\x06Agrave\x06\ +Aacute\x0bAcircumfl\ +ex\x06Atilde\x09Adiere\ +sis\x05Aring\x02AE\x08Cce\ +dilla\x06Egrave\x06Eac\ +ute\x0bEcircumflex\x09\ +Edieresis\x0aIgrave\ +.alt\x0aIacute.alt\x0f\ +Icircumflex.alt\x0d\ +Idieresis.alt\x03Et\ +h\x06Ntilde\x06Ograve\x06\ +Oacute\x0bOcircumfl\ +ex\x06Otilde\x09Odiere\ +sis\x08multiply\x06Osl\ +ash\x06Ugrave\x06Uacut\ +e\x0bUcircumflex\x09Ud\ +ieresis\x06Yacute\x05T\ +horn\x0agermandbls\x06\ +agrave\x06aacute\x0bac\ +ircumflex\x06atilde\ +\x09adieresis\x05aring\ +\x02ae\x08ccedilla\x06egr\ +ave\x06eacute\x0becirc\ +umflex\x09edieresis\ +\x06igrave\x06iacute\x0bi\ +circumflex\x09idier\ +esis\x03eth\x06ntilde\x06\ +ograve\x06oacute\x0boc\ +ircumflex\x06otilde\ +\x09odieresis\x06divid\ +e\x06oslash\x06ugrave\x06\ +uacute\x0bucircumfl\ +ex\x09udieresis\x06yac\ +ute\x05thorn\x09ydiere\ +sis\x07Amacron\x07amac\ +ron\x06Abreve\x06abrev\ +e\x07Aogonek\x07aogone\ +k\x06Cacute\x06cacute\x0b\ +Ccircumflex\x0bccir\ +cumflex\x04Cdot\x04cdo\ +t\x06Ccaron\x06ccaron\x06\ +Dcaron\x06dcaron\x06Dc\ +roat\x06dcroat\x07Emac\ +ron\x07emacron\x06Ebre\ +ve\x06ebreve\x0aEdotac\ +cent\x0aedotaccent\x07\ +Eogonek\x07eogonek\x06\ +Ecaron\x06ecaron\x0bGc\ +ircumflex\x0bgcircu\ +mflex\x06Gbreve\x06gbr\ +eve\x04Gdot\x04gdot\x0cGc\ +ommaaccent\x0cgcomm\ +aaccent\x0bHcircumf\ +lex\x0bhcircumflex\x04\ +Hbar\x04hbar\x0aItilde\ +.alt\x06itilde\x0bImac\ +ron.alt\x07imacron\x0a\ +Ibreve.alt\x06ibrev\ +e\x0bIogonek.alt\x07io\ +gonek\x0eIdotaccent\ +.alt\x08dotlessi\x06IJ\ +.alt\x02ij\x0bJcircumf\ +lex\x0bjcircumflex\x0c\ +Kcommaaccent\x0ckco\ +mmaaccent\x0ckgreen\ +landic\x06Lacute\x06la\ +cute\x0cLcommaaccen\ +t\x0clcommaaccent\x06L\ +caron\x06lcaron\x04Ldo\ +t\x04ldot\x06Lslash\x06ls\ +lash\x06Nacute\x06nacu\ +te\x0cNcommaaccent\x0c\ +ncommaaccent\x06Nca\ +ron\x06ncaron\x0bnapos\ +trophe\x03Eng\x03eng\x07O\ +macron\x07omacron\x06O\ +breve\x06obreve\x0dOhu\ +ngarumlaut\x0dohung\ +arumlaut\x02OE\x02oe\x06R\ +acute\x06racute\x0cRco\ +mmaaccent\x0crcomma\ +accent\x06Rcaron\x06rc\ +aron\x06Sacute\x06sacu\ +te\x0bScircumflex\x0bs\ +circumflex\x08Scedi\ +lla\x08scedilla\x06Sca\ +ron\x06scaron\x0cTcomm\ +aaccent\x0ctcommaac\ +cent\x06Tcaron\x06tcar\ +on\x04Tbar\x04tbar\x06Uti\ +lde\x06utilde\x07Umacr\ +on\x07umacron\x06Ubrev\ +e\x06ubreve\x05Uring\x05u\ +ring\x0dUhungarumla\ +ut\x0duhungarumlaut\ +\x07Uogonek\x07uogonek\ +\x0bWcircumflex\x0bwci\ +rcumflex\x0bYcircum\ +flex\x0bycircumflex\ +\x09Ydieresis\x06Zacut\ +e\x06zacute\x0aZdotacc\ +ent\x0azdotaccent\x06Z\ +caron\x06zcaron\x05lon\ +gs\x06florin\x0aAringa\ +cute\x0aaringacute\x07\ +AEacute\x07aeacute\x0b\ +Oslashacute\x0bosla\ +shacute\x0cScommaac\ +cent\x0cscommaaccen\ +t\x0acircumflex\x05car\ +on\x06macron\x05breve\x09\ +dotaccent\x04ring\x06o\ +gonek\x05tilde\x0chung\ +arumlaut\x05tonos\x0dd\ +ieresistonos\x0aAlp\ +hatonos\x09anotelei\ +a\x0cEpsilontonos\x08E\ +tatonos\x0dIotatono\ +s.alt\x0cOmicronton\ +os\x0cUpsilontonos\x0a\ +Omegatonos\x11iotad\ +ieresistonos\x05Alp\ +ha\x04Beta\x05Gamma\x07un\ +i0394\x07Epsilon\x04Ze\ +ta\x03Eta\x05Theta\x08Iot\ +a.alt\x05Kappa\x06Lamb\ +da\x02Mu\x02Nu\x02Xi\x07Omic\ +ron\x02Pi\x03Rho\x05Sigma\ +\x03Tau\x07Upsilon\x03Phi\ +\x03Chi\x03Psi\x07uni03A9\ +\x10Iotadieresis.al\ +t\x0fUpsilondieresi\ +s\x0aalphatonos\x0ceps\ +ilontonos\x08etaton\ +os\x09iotatonos\x14ups\ +ilondieresistono\ +s\x05alpha\x04beta\x05gam\ +ma\x05delta\x07epsilon\ +\x04zeta\x03eta\x05theta\x04\ +iota\x05kappa\x06lambd\ +a\x07uni03BC\x02nu\x02xi\x07\ +omicron\x02pi\x03rho\x06s\ +igma1\x05sigma\x03tau\x07\ +upsilon\x03phi\x03chi\x03\ +psi\x05omega\x0ciotadi\ +eresis\x0fupsilondi\ +eresis\x0comicronto\ +nos\x0cupsilontonos\ +\x0aomegatonos\x09afii\ +10023\x09afii10051\x09\ +afii10052\x09afii10\ +053\x09afii10054\x0daf\ +ii10055.alt\x0dafii\ +10056.alt\x09afii10\ +057\x09afii10058\x09af\ +ii10059\x09afii1006\ +0\x09afii10061\x09afii\ +10062\x09afii10145\x09\ +afii10017\x09afii10\ +018\x09afii10019\x09af\ +ii10020\x09afii1002\ +1\x09afii10022\x09afii\ +10024\x09afii10025\x09\ +afii10026\x09afii10\ +027\x09afii10028\x09af\ +ii10029\x09afii1003\ +0\x09afii10031\x09afii\ +10032\x09afii10033\x09\ +afii10034\x09afii10\ +035\x09afii10036\x09af\ +ii10037\x09afii1003\ +8\x09afii10039\x09afii\ +10040\x09afii10041\x09\ +afii10042\x09afii10\ +043\x09afii10044\x09af\ +ii10045\x09afii1004\ +6\x09afii10047\x09afii\ +10048\x09afii10049\x09\ +afii10065\x09afii10\ +066\x09afii10067\x09af\ +ii10068\x09afii1006\ +9\x09afii10070\x09afii\ +10072\x09afii10073\x09\ +afii10074\x09afii10\ +075\x09afii10076\x09af\ +ii10077\x09afii1007\ +8\x09afii10079\x09afii\ +10080\x09afii10081\x09\ +afii10082\x09afii10\ +083\x09afii10084\x09af\ +ii10085\x09afii1008\ +6\x09afii10087\x09afii\ +10088\x09afii10089\x09\ +afii10090\x09afii10\ +091\x09afii10092\x09af\ +ii10093\x09afii1009\ +4\x09afii10095\x09afii\ +10096\x09afii10097\x09\ +afii10071\x09afii10\ +099\x09afii10100\x09af\ +ii10101\x09afii1010\ +2\x09afii10103\x09afii\ +10104\x09afii10105\x09\ +afii10106\x09afii10\ +107\x09afii10108\x09af\ +ii10109\x09afii1011\ +0\x09afii10193\x09afii\ +10050\x09afii10098\x06\ +Wgrave\x06wgrave\x06Wa\ +cute\x06wacute\x09Wdie\ +resis\x09wdieresis\x06\ +Ygrave\x06ygrave\x06en\ +dash\x06emdash\x09afii\ +00208\x0dunderscore\ +dbl\x09quoteleft\x0aqu\ +oteright\x0equotesi\ +nglbase\x0dquoterev\ +ersed\x0cquotedblle\ +ft\x0dquotedblright\ +\x0cquotedblbase\x06da\ +gger\x09daggerdbl\x06b\ +ullet\x08ellipsis\x0bp\ +erthousand\x06minut\ +e\x06second\x0dguilsin\ +glleft\x0eguilsingl\ +right\x09exclamdbl\x08\ +fraction\x09nsuperi\ +or\x05franc\x09afii089\ +41\x06peseta\x04Euro\x09a\ +fii61248\x09afii612\ +89\x09afii61352\x09tra\ +demark\x05Omega\x09est\ +imated\x09oneeighth\ +\x0cthreeeighths\x0bfi\ +veeighths\x0csevene\ +ighths\x0bpartialdi\ +ff\x05Delta\x07product\ +\x09summation\x05minus\ +\x07radical\x08infinit\ +y\x08integral\x0bappro\ +xequal\x08notequal\x09\ +lessequal\x0cgreate\ +requal\x07lozenge\x07u\ +niFB01\x07uniFB02\x0dc\ +yrillicbreve\x08dot\ +lessj\x10caroncomma\ +accent\x0bcommaacce\ +nt\x11commaaccentro\ +tate\x0czerosuperio\ +r\x0cfoursuperior\x0cf\ +ivesuperior\x0bsixs\ +uperior\x0dsevensup\ +erior\x0deightsuper\ +ior\x0cninesuperior\ +\x07uni2000\x07uni2001\ +\x07uni2002\x07uni2003\ +\x07uni2004\x07uni2005\ +\x07uni2006\x07uni2007\ +\x07uni2008\x07uni2009\ +\x07uni200A\x07uni200B\ +\x07uniFEFF\x07uniFFFC\ +\x07uniFFFD\x07uni01F0\ +\x07uni02BC\x07uni03D1\ +\x07uni03D2\x07uni03D6\ +\x07uni1E3E\x07uni1E3F\ +\x07uni1E00\x07uni1E01\ +\x07uni1F4D\x07uni02F3\ +\x09dasiaoxia\x07uniFB\ +03\x07uniFB04\x05Ohorn\ +\x05ohorn\x05Uhorn\x05uho\ +rn\x07uni0300\x07uni03\ +01\x07uni0303\x04hook\x08\ +dotbelow\x07uni0400\ +\x07uni040D\x07uni0450\ +\x07uni045D\x07uni0460\ +\x07uni0461\x07uni0462\ +\x07uni0463\x07uni0464\ +\x07uni0465\x07uni0466\ +\x07uni0467\x07uni0468\ +\x07uni0469\x07uni046A\ +\x07uni046B\x07uni046C\ +\x07uni046D\x07uni046E\ +\x07uni046F\x07uni0470\ +\x07uni0471\x07uni0472\ +\x07uni0473\x07uni0474\ +\x07uni0475\x07uni0476\ +\x07uni0477\x07uni0478\ +\x07uni0479\x07uni047A\ +\x07uni047B\x07uni047C\ +\x07uni047D\x07uni047E\ +\x07uni047F\x07uni0480\ +\x07uni0481\x07uni0482\ +\x07uni0483\x07uni0484\ +\x07uni0485\x07uni0486\ +\x07uni0488\x07uni0489\ +\x07uni048A\x07uni048B\ +\x07uni048C\x07uni048D\ +\x07uni048E\x07uni048F\ +\x07uni0492\x07uni0493\ +\x07uni0494\x07uni0495\ +\x07uni0496\x07uni0497\ +\x07uni0498\x07uni0499\ +\x07uni049A\x07uni049B\ +\x07uni049C\x07uni049D\ +\x07uni049E\x07uni049F\ +\x07uni04A0\x07uni04A1\ +\x07uni04A2\x07uni04A3\ +\x07uni04A4\x07uni04A5\ +\x07uni04A6\x07uni04A7\ +\x07uni04A8\x07uni04A9\ +\x07uni04AA\x07uni04AB\ +\x07uni04AC\x07uni04AD\ +\x07uni04AE\x07uni04AF\ +\x07uni04B0\x07uni04B1\ +\x07uni04B2\x07uni04B3\ +\x07uni04B4\x07uni04B5\ +\x07uni04B6\x07uni04B7\ +\x07uni04B8\x07uni04B9\ +\x07uni04BA\x07uni04BB\ +\x07uni04BC\x07uni04BD\ +\x07uni04BE\x07uni04BF\ +\x0buni04C0.alt\x07uni\ +04C1\x07uni04C2\x07uni\ +04C3\x07uni04C4\x07uni\ +04C5\x07uni04C6\x07uni\ +04C7\x07uni04C8\x07uni\ +04C9\x07uni04CA\x07uni\ +04CB\x07uni04CC\x07uni\ +04CD\x07uni04CE\x0buni\ +04CF.alt\x07uni04D0\ +\x07uni04D1\x07uni04D2\ +\x07uni04D3\x07uni04D4\ +\x07uni04D5\x07uni04D6\ +\x07uni04D7\x07uni04D8\ +\x07uni04D9\x07uni04DA\ +\x07uni04DB\x07uni04DC\ +\x07uni04DD\x07uni04DE\ +\x07uni04DF\x07uni04E0\ +\x07uni04E1\x07uni04E2\ +\x07uni04E3\x07uni04E4\ +\x07uni04E5\x07uni04E6\ +\x07uni04E7\x07uni04E8\ +\x07uni04E9\x07uni04EA\ +\x07uni04EB\x07uni04EC\ +\x07uni04ED\x07uni04EE\ +\x07uni04EF\x07uni04F0\ +\x07uni04F1\x07uni04F2\ +\x07uni04F3\x07uni04F4\ +\x07uni04F5\x07uni04F6\ +\x07uni04F7\x07uni04F8\ +\x07uni04F9\x07uni04FA\ +\x07uni04FB\x07uni04FC\ +\x07uni04FD\x07uni04FE\ +\x07uni04FF\x07uni0500\ +\x07uni0501\x07uni0502\ +\x07uni0503\x07uni0504\ +\x07uni0505\x07uni0506\ +\x07uni0507\x07uni0508\ +\x07uni0509\x07uni050A\ +\x07uni050B\x07uni050C\ +\x07uni050D\x07uni050E\ +\x07uni050F\x07uni0510\ +\x07uni0511\x07uni0512\ +\x07uni0513\x07uni1EA0\ +\x07uni1EA1\x07uni1EA2\ +\x07uni1EA3\x07uni1EA4\ +\x07uni1EA5\x07uni1EA6\ +\x07uni1EA7\x07uni1EA8\ +\x07uni1EA9\x07uni1EAA\ +\x07uni1EAB\x07uni1EAC\ +\x07uni1EAD\x07uni1EAE\ +\x07uni1EAF\x07uni1EB0\ +\x07uni1EB1\x07uni1EB2\ +\x07uni1EB3\x07uni1EB4\ +\x07uni1EB5\x07uni1EB6\ +\x07uni1EB7\x07uni1EB8\ +\x07uni1EB9\x07uni1EBA\ +\x07uni1EBB\x07uni1EBC\ +\x07uni1EBD\x07uni1EBE\ +\x07uni1EBF\x07uni1EC0\ +\x07uni1EC1\x07uni1EC2\ +\x07uni1EC3\x07uni1EC4\ +\x07uni1EC5\x07uni1EC6\ +\x07uni1EC7\x0buni1EC8\ +.alt\x07uni1EC9\x0buni\ +1ECA.alt\x07uni1ECB\ +\x07uni1ECC\x07uni1ECD\ +\x07uni1ECE\x07uni1ECF\ +\x07uni1ED0\x07uni1ED1\ +\x07uni1ED2\x07uni1ED3\ +\x07uni1ED4\x07uni1ED5\ +\x07uni1ED6\x07uni1ED7\ +\x07uni1ED8\x07uni1ED9\ +\x07uni1EDA\x07uni1EDB\ +\x07uni1EDC\x07uni1EDD\ +\x07uni1EDE\x07uni1EDF\ +\x07uni1EE0\x07uni1EE1\ +\x07uni1EE2\x07uni1EE3\ +\x07uni1EE4\x07uni1EE5\ +\x07uni1EE6\x07uni1EE7\ +\x07uni1EE8\x07uni1EE9\ +\x07uni1EEA\x07uni1EEB\ +\x07uni1EEC\x07uni1EED\ +\x07uni1EEE\x07uni1EEF\ +\x07uni1EF0\x07uni1EF1\ +\x07uni1EF4\x07uni1EF5\ +\x07uni1EF6\x07uni1EF7\ +\x07uni1EF8\x07uni1EF9\ +\x07uni20AB\x07uni030F\ +\x13circumflexacute\ +comb\x13circumflexg\ +ravecomb\x12circumf\ +lexhookcomb\x13circ\ +umflextildecomb\x0e\ +breveacutecomb\x0eb\ +revegravecomb\x0dbr\ +evehookcomb\x0ebrev\ +etildecomb\x10cyril\ +lichookleft\x11cyri\ +llicbighookUC\x11cy\ +rillicbighookLC\x08\ +one.pnum\x07zero.os\ +\x06one.os\x06two.os\x08t\ +hree.os\x07four.os\x07\ +five.os\x06six.os\x08s\ +even.os\x08eight.os\ +\x07nine.os\x02ff\x07uni2\ +120\x08Tcedilla\x08tce\ +dilla\x05g.alt\x0fgcir\ +cumflex.alt\x0agbre\ +ve.alt\x08gdot.alt\x10\ +gcommaaccent.alt\ +\x01I\x06Igrave\x06Iacute\ +\x0bIcircumflex\x09Idi\ +eresis\x06Itilde\x07Im\ +acron\x06Ibreve\x07Iog\ +onek\x0aIdotaccent\x02\ +IJ\x09Iotatonos\x04Iot\ +a\x0cIotadieresis\x09a\ +fii10055\x09afii100\ +56\x07uni04C0\x07uni04\ +CF\x07uni1EC8\x07uni1E\ +CA\x00\x00\x01\x00\x03\x00\x08\x00\x0a\x00\x16\x00\x07\xff\ +\xff\x00\x0f\x00\x01\x00\x00\x00\x0c\x00\x00\x00\x16\x00\x00\x00\ +\x02\x00\x01\x00\x00\x03\xa9\x00\x01\x00\x04\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x004\x006\x00\x01l\ +atn\x00\x08\x00\x10\x00\x02MOL \x00\x16R\ +OM \x00\x1c\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\ +\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x0a\x00n\x01\xe4\x00\x01latn\x00\x08\x00\x10\x00\ +\x02MOL \x00(ROM \x00B\x00\x00\xff\ +\xff\x00\x09\x00\x03\x00\x08\x00\x0b\x00\x00\x00\x0e\x00\x11\x00\ +\x14\x00\x17\x00\x1a\x00\x00\xff\xff\x00\x0a\x00\x04\x00\x06\x00\ +\x09\x00\x0c\x00\x01\x00\x0f\x00\x12\x00\x15\x00\x18\x00\x1b\x00\ +\x00\xff\xff\x00\x0a\x00\x05\x00\x07\x00\x0a\x00\x0d\x00\x02\x00\ +\x10\x00\x13\x00\x16\x00\x19\x00\x1c\x00\x1dliga\x00\ +\xb0liga\x00\xb6liga\x00\xbclnu\ +m\x00\xc2lnum\x00\xc8lnum\x00\xcel\ +ocl\x00\xd4locl\x00\xdaonum\x00\ +\xe0onum\x00\xe8onum\x00\xf0pnu\ +m\x00\xf8pnum\x00\xfepnum\x01\x04s\ +alt\x01\x0asalt\x01\x12salt\x01\ +\x1ass01\x01\x22ss01\x01*ss0\ +1\x012ss02\x01:ss02\x01@s\ +s02\x01Fss03\x01Lss03\x01\ +Rss03\x01Xtnum\x01^tnu\ +m\x01ftnum\x01n\x00\x00\x00\x01\x00\x09\x00\ +\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\ +\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\ +\x01\x00\x08\x00\x00\x00\x01\x00\x08\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\ +\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\ +\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x0a\x00\x16\x00\x1e\x00&\x00.\x006\x00>\x00F\x00\ +N\x00V\x00^\x00\x01\x00\x00\x00\x01\x00P\x00\x01\x00\ +\x00\x00\x01\x00z\x00\x01\x00\x00\x00\x01\x00\xaa\x00\x01\x00\ +\x00\x00\x01\x00\xc6\x00\x01\x00\x00\x00\x01\x00\xee\x00\x01\x00\ +\x00\x00\x01\x00\xf4\x00\x01\x00\x00\x00\x01\x01\x10\x00\x01\x00\ +\x00\x00\x01\x01\x16\x00\x01\x00\x00\x00\x01\x012\x00\x04\x00\ +\x00\x00\x01\x01H\x00\x02\x00\x10\x00\x05\x03\x91\x03\x92\x03\ +\x93\x03\x94\x03\x95\x00\x02\x00\x05\x00J\x00J\x00\x00\x00\ +\xdf\x00\xdf\x00\x01\x00\xe1\x00\xe1\x00\x02\x00\xe3\x00\xe3\x00\ +\x03\x00\xe5\x00\xe5\x00\x04\x00\x02\x00.\x00\x14\x00,\x00\ +\x8e\x00\x8f\x00\x90\x00\x91\x00\xea\x00\xec\x00\xee\x00\xf0\x00\ +\xf2\x00\xf4\x01Z\x01g\x01w\x01\xa1\x01\xa2\x02\xc9\x02\ +\xd8\x03E\x03G\x00\x02\x00\x01\x03\x96\x03\xa9\x00\x00\x00\ +\x02\x00\x1a\x00\x0a\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\ +\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x00\x02\x00\x01\x00\x13\x00\ +\x1c\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\x85\x03\x86\x03\ +\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x84\x00\x02\x00\ +\x03\x00\x13\x00\x13\x00\x00\x00\x15\x00\x1c\x00\x01\x03\x82\x03\ +\x82\x00\x09\x00\x02\x00\x08\x00\x01\x03\x82\x00\x01\x00\x01\x00\ +\x14\x00\x02\x00\x1a\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\ +\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\ +\x83\x03\x8c\x00\x00\x00\x02\x00\x08\x00\x01\x00\x14\x00\x01\x00\ +\x01\x03\x82\x00\x02\x00\x1a\x00\x0a\x00\x13\x03\x82\x00\x15\x00\ +\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x02\x00\ +\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x0e\x00\x04\x03\x8f\x03\ +\x90\x01 \x01!\x00\x02\x00\x02\x01$\x01%\x00\x00\x01\ +I\x01J\x00\x02\x00\x01\x006\x00\x01\x00\x08\x00\x05\x00\ +\x0c\x00\x14\x00\x1c\x00\x22\x00(\x02^\x00\x03\x00I\x00\ +O\x02]\x00\x03\x00I\x00L\x03\x8d\x00\x02\x00I\x02\ +5\x00\x02\x00O\x024\x00\x02\x00L\x00\x01\x00\x01\x00\ +I\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x00\x00\x01\x00\ +\x00\x15^\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x15V0\ +\x82\x15R\x06\x09*\x86H\x86\xf7\x0d\x01\x07\x02\xa0\x82\ +\x15C0\x82\x15?\x02\x01\x011\x0b0\x09\x06\x05+\ +\x0e\x03\x02\x1a\x05\x000a\x06\x0a+\x06\x01\x04\x01\x82\ +7\x02\x01\x04\xa0S0Q0,\x06\x0a+\x06\x01\x04\ +\x01\x827\x02\x01\x1c\xa2\x1e\x80\x1c\x00<\x00<\x00<\ +\x00O\x00b\x00s\x00o\x00l\x00e\x00t\x00e\ +\x00>\x00>\x00>0!0\x09\x06\x05+\x0e\x03\x02\ +\x1a\x05\x00\x04\x14\xb4\xe9 \x96\x15\xd0\xfb\xce\xadX[\ +;\xf4\xd9&\xf5*\xe5\x17\xeb\xa0\x82\x11]0\x82\x03\ +z0\x82\x02b\xa0\x03\x02\x01\x02\x02\x108%\xd7\xfa\ +\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd50\x0d\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000S1\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1+0)\x06\x03U\x04\x03\x13\x22Ve\ +riSign Time Stam\ +ping Services CA\ +0\x1e\x17\x0d070615000000\ +Z\x17\x0d120614235959Z\ +0\x5c1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\ +\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriSi\ +gn, Inc.1402\x06\x03U\x04\ +\x03\x13+VeriSign Time\ + Stamping Servic\ +es Signer - G20\x81\ +\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\ +\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xc4\xb5\xf2R\x15\ +\xbc\x88\x86`)\x16J[/K\x91k\x87\x91\xf35\ +TX5\xea\xd16^bMRQ4q\xc2{f\ +\x1d\x89\xc8\xdd*\xc4j\x0a\xf67\xd9\x98t\x91\xf6\x92\ +\xae\xb0\xb5v\x96\xf1\xa9JcEG.k\x0b\x92N\ +K+\x8c\xeeXJ\x8b\xd4\x07\xe4\x1a,\xf8\x82\xaaX\ +\xd9\xcdB\xf3-\xc0u\xde\x8d\xab\xc7\x8e\x1d\x9alL\ +\x08\x95\x1e\xde\xdb\xefg\xe1r\xc2I\xc2\x9e`<\xe1\ +\xe2\xbe\x16\xa3cxi\x14{\xad-\x02\x03\x01\x00\x01\ +\xa3\x81\xc40\x81\xc104\x06\x08+\x06\x01\x05\x05\x07\ +\x01\x01\x04(0&0$\x06\x08+\x06\x01\x05\x05\x07\ +0\x01\x86\x18http://ocsp.\ +verisign.com0\x0c\x06\x03\ +U\x1d\x13\x01\x01\xff\x04\x020\x0003\x06\x03U\x1d\ +\x1f\x04,0*0(\xa0&\xa0$\x86\x22htt\ +p://crl.verisign\ +.com/tss-ca.crl0\ +\x16\x06\x03U\x1d%\x01\x01\xff\x04\x0c0\x0a\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\ +\xff\x04\x04\x03\x02\x06\xc00\x1e\x06\x03U\x1d\x11\x04\x17\ +0\x15\xa4\x130\x111\x0f0\x0d\x06\x03U\x04\x03\x13\ +\x06TSA1-20\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00P\xc5K\xc8$\ +\x80\xdf\xe4\x0d$\xc2\xde\x1a\xb1\xa1\x02\xa1\xa6\x82-\x0c\ +\x83\x15\x817\x0a\x82\x0e,\xb0Z\x17a\xb5\xd8\x05\xfe\ +\x88\xdb\xf1\x91\x91\xb3V\x1a@\xa6\xeb\x92\xbe89\xb0\ +u6t:\x98O\xe47\xba\x99\x89\xca\x95B\x1d\xb0\ +\xb9\xc7\xa0\x8dW\xe0\xfa\xd5d\x04B5N\x01\xd13\ +\xa2\x17\xc8M\xaa'\xc7\xf2\xe1\x86L\x028M\x83x\ +\xc6\xfcS\xe0\xeb\xe0\x06\x87\xdd\xa4\x96\x9e^\x0c\x98\xe2\ +\xa5\xbe\xbf\x82\x85\xc3`\xe1\xdf\xad(\xd8\xc7\xa5Kd\ +\xda\xc7\x1b[\xbd\xac9\x08\xd58\x22\xa13\x8b/\x8a\ +\x9a\xeb\xbc\x07!?DA\x09\x07\xb5e\x1c$\xbcH\ +\xd3D\x80\xeb\xa1\xcf\xc9\x02\xb4\x14\xcfT\xc7\x16\xa3\x80\ +\x5c\xf9y>]r}\x88\x17\x9e,C\xa2\xcaS\xce\ +}=\xf6*:\xb8O\x94\x00\xa5m\x0a\x83]\xf9^\ +S\xf4\x18\xb3W\x0fp\xc3\xfb\xf5\xad\x95\xa0\x0e\x17\xde\ +\xc4\x16\x80`\xc9\x0f+n\x86\x04\xf1\xeb\xf4x'\xd1\ +\x05\xc5\xee4[^\xb9I2\xf230\x82\x03\xc40\ +\x82\x03-\xa0\x03\x02\x01\x02\x02\x10G\xbf\x19\x95\xdf\x8d\ +RFC\xf7\xdbmH\x0d1\xa40\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\x8b1\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02ZA1\x150\x13\x06\x03U\ +\x04\x08\x13\x0cWestern Cape\ +1\x140\x12\x06\x03U\x04\x07\x13\x0bDurba\ +nville1\x0f0\x0d\x06\x03U\x04\x0a\x13\ +\x06Thawte1\x1d0\x1b\x06\x03U\x04\x0b\ +\x13\x14Thawte Certifi\ +cation1\x1f0\x1d\x06\x03U\x04\x03\x13\ +\x16Thawte Timestam\ +ping CA0\x1e\x17\x0d03120\ +4000000Z\x17\x0d131203\ +235959Z0S1\x0b0\x09\x06\x03U\ +\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\ +\x0eVeriSign, Inc.1\ ++0)\x06\x03U\x04\x03\x13\x22VeriSi\ +gn Time Stamping\ + Services CA0\x82\x01\x22\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\ +\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\x00\xa9\xca\xb2\ +\xa4\xcc\xcd \xaf\x0a}\x89\xac\x87u\xf0\xb4N\xf1\xdf\ +\xc1\x0f\xbfga\xbd\xa3d\x1c\xda\xbb\xf9\xca3\xab\x84\ +0\x89X~\x8c\xdbk\xdd6\x9e\x0f\xbf\xd1\xecx\xf2\ +w\xa6~o<\xbf\x93\xaf\x0d\xbah\xf4l\x94\xca\xbd\ +R-\xabH=\xf5\xb6\xd5]_\x1b\x02\x9f\xfa/k\ +\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\x02\xe1\x7fLR\xe3\x0e`\ +\xec@\x1c~\xb9\x0d\xde?\xc7\xb4\xdf\x87\xbd_zj\ +1.\x03\x99\x81\x13\xa8G \xce1s\x0dW-\xcd\ +x43\x95\x12\x99\x12\xb9\xdeh/\xaa\xe6\xe3\xc2\x8a\ +\x8c*\xc3\x8b!\x87f\xbd\x83XWou\xbf<\xaa\ +&\x87]\xca\x10\x15<\x9f\x84\xeaT\xc1\x0an\xc4\xfe\ +\xc5J\xdd\xb9\x07\x11\x97\x22|\xdb>'\xd1\x1ex\xec\ +\x9f1\xc9\xf1\xe6\x22\x19\xdb\xc4\xb3GC\x9a\x1a_\xa0\ +\x1e\x90\xe4^\xf5\xee|\xf1}\xabb\x01\x8f\xf5M\x0b\ +\xde\xd0\x22V\xa8\x95\xcd\xae\x88v\xae\xee\xba\x0d\xf3\xe4\ +M\xd9\xa0\xfbh\xa0\xae\x14;\xb3\x87\xc1\xbb\x02\x03\x01\ +\x00\x01\xa3\x81\xdb0\x81\xd804\x06\x08+\x06\x01\x05\ +\x05\x07\x01\x01\x04(0&0$\x06\x08+\x06\x01\x05\ +\x05\x070\x01\x86\x18http://ocs\ +p.verisign.com0\x12\ +\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\ +\x01\x000A\x06\x03U\x1d\x1f\x04:0806\xa0\ +4\xa02\x860http://crl.\ +verisign.com/Tha\ +wteTimestampingC\ +A.crl0\x13\x06\x03U\x1d%\x04\x0c0\x0a\ +\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\x1d\ +\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060$\x06\x03U\x1d\ +\x11\x04\x1d0\x1b\xa4\x190\x171\x150\x13\x06\x03U\ +\x04\x03\x13\x0cTSA2048-1-53\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\ +\x81\x81\x00Jk\xf9\xeaX\xc2D\x1c1\x89y\x99+\ +\x96\xbf\x82\xac\x01\xd6\x1cL\xcd\xb0\x8aXn\xdf\x08)\ +\xa3^\xc8\xca\x93\x13\xe7\x04R\x0d\xefG'/\x008\ +\xb0\xe4\xc9\x93N\x9a\xd4\x22b\x15\xf7?7!Op\ +1\x80\xf1\x8b8\x87\xb3\xe8\xe8\x97\x00\xfe\xcfU\x96N\ +$\xd2\xa9'Nz\xae\xb7aA\xf3*\xce\xe7\xc9\xd9\ +^\xdd\xbb+\x85>\xb5\x9d\xb5\xd9\xe1W\xff\xbe\xb4\xc5\ +~\xf5\xcf\x0c\x9e\xf0\x97\xfe+\xd3;R\x1b\x1b8'\ +\xf7?J0\x82\x04\xfc0\x82\x04e\xa0\x03\x02\x01\x02\ +\x02\x10eR&\xe1\xb2.\x18\xe1Y\x0f)\x85\xac\x22\ +\xe7\x5c0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000_1\x0b0\x09\x06\x03U\x04\x06\x13\x02US\ +1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriS\ +ign, Inc.1705\x06\x03U\ +\x04\x0b\x13.Class 3 Publ\ +ic Primary Certi\ +fication Authori\ +ty0\x1e\x17\x0d0905210000\ +00Z\x17\x0d19052023595\ +9Z0\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVer\ +iSign, Inc.1\x1f0\x1d\x06\ +\x03U\x04\x0b\x13\x16VeriSign T\ +rust Network1;09\ +\x06\x03U\x04\x0b\x132Terms of \ +use at https://w\ +ww.verisign.com/\ +rpa (c)09100.\x06\x03U\ +\x04\x03\x13'VeriSign Cla\ +ss 3 Code Signin\ +g 2009-2 CA0\x82\x01\x220\ +\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\ +\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\x00\xbeg\x1d\xb4\ +`\xaa\x10IoV\x17|f\xc9^\x86\x0d\xd5\xf1\xac\ +\xa7q\x83\x8e\x8b\x89\xf8\x88\x04\x89\x15\x06\xba-\x84!\ +\x95\xe4\xd1\x9cPL\xfb\xd2\x22\xbd\xda\xf2\xb25;\x1e\ +\x8f\xc3\x09\xfb\xfc\x13.Z\xbf\x89|=;%\x1e\xf6\ +\xf3X{\x9c\xf4\x01\xb5\xc6\x0a\xb8\x80\xce\xbe'ta\ +g'Mj\xe5\xec\x81aXy\xa3\xe0\x17\x10\x12\x15\ +'\xb0\xe1M4\x7f+G D\xb9\xdef$f\x8a\ +\xcdO\xba\x1f\xc58\xc8T\x90\xe1r\xf6\x19fuj\ +\xb9Ih\xcf8y\x0d\xaa0\xa8\xdb,`H\x9e\xd7\ +\xaa\x14\x01\xa9\x83\xd78\x9109\x13\x96\x03:|@\ +T\xb6\xad\xe0/\x1b\x83\xdc\xa8\x11R>\x02\xb3\xd7+\ +\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\xa9\xa6\x10P\x0e4.M\ +\xa7\xce\xc9^%\xd4\x8c\xbc\xf3n|)\xbc\x01]\xfc\ +1\x87Z\xd5\x8c\x85gX\x88\x19\xa0\xbf5\xf0\xea+\ +\xa3!\xe7\x90\xf6\x83\xe5\xa8\xed`x^{`\x83\xfd\ +W\x0b]A\x0dcT`\xd6C!\xef\x02\x03\x01\x00\ +\x01\xa3\x82\x01\xdb0\x82\x01\xd70\x12\x06\x03U\x1d\x13\ +\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x000p\x06\ +\x03U\x1d \x04i0g0e\x06\x0b`\x86H\x01\ +\x86\xf8E\x01\x07\x17\x030V0(\x06\x08+\x06\x01\ +\x05\x05\x07\x02\x01\x16\x1chttps://w\ +ww.verisign.com/\ +cps0*\x06\x08+\x06\x01\x05\x05\x07\x02\x020\ +\x1e\x1a\x1chttps://www.v\ +erisign.com/rpa0\ +\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060\ +m\x06\x08+\x06\x01\x05\x05\x07\x01\x0c\x04a0_\xa1\ +]\xa0[0Y0W0U\x16\x09image\ +/gif0!0\x1f0\x07\x06\x05+\x0e\x03\x02\ +\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\xac\x8d\x8ek\xc3\xcf\x80j\ +\xd4H\x18,{\x19.0%\x16#http:\ +//logo.verisign.\ +com/vslogo.gif0\x1d\ +\x06\x03U\x1d%\x04\x160\x14\x06\x08+\x06\x01\x05\x05\ +\x07\x03\x02\x06\x08+\x06\x01\x05\x05\x07\x03\x0304\x06\ +\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\ +\x08+\x06\x01\x05\x05\x070\x01\x86\x18http:\ +//ocsp.verisign.\ +com01\x06\x03U\x1d\x1f\x04*0(0&\ +\xa0$\xa0\x22\x86 http://crl\ +.verisign.com/pc\ +a3.crl0)\x06\x03U\x1d\x11\x04\x220\ + \xa4\x1e0\x1c1\x1a0\x18\x06\x03U\x04\x03\x13\x11\ +Class3CA2048-1-5\ +50\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\x97\xd0k\xa8\ +&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf2\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\ +\x81\x81\x00\x8b\x03\xc0\xdd\x94\xd8A\xa2ai\xb0\x15\xa8\ +x\xc70\xc6\x90<~B\xf7$\xb6\xe4\x83s\x17\x04\ +\x7f\x04\x10\x9c\xa1\xe2\xfa\x81/\xeb\xc0\xcaD\xe7r\xe0\ +P\xb6U\x10 \x83n\x96\x92\xe4\x9aQj\xb471\ +\xdc\xa5-\xeb\x8c\x00\xc7\x1dO\xe7M2\xba\x85\xf8N\ +\xbe\xfagUe\xf0j\xbez\xcad8\x1a\x10\x10x\ +Ev1\xf3\x86z\x03\x0f`\xc2\xb3]\x9d\xf6\x8bf\ +v\x82\x1bY\xe1\x83\xe5\xbdI\xa58V\xe5\xdeAw\ +\x0eX\x0f0\x82\x05\x130\x82\x03\xfb\xa0\x03\x02\x01\x02\ +\x02\x10f\xe3\xf0gy\xca\x15\x16mPSo\x88\x19\ +\x1a\x830\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02U\ +S1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeri\ +Sign, Inc.1\x1f0\x1d\x06\x03\ +U\x04\x0b\x13\x16VeriSign Tr\ +ust Network1;09\x06\ +\x03U\x04\x0b\x132Terms of u\ +se at https://ww\ +w.verisign.com/r\ +pa (c)09100.\x06\x03U\x04\ +\x03\x13'VeriSign Clas\ +s 3 Code Signing\ + 2009-2 CA0\x1e\x17\x0d10\ +0729000000Z\x17\x0d120\ +808235959Z0\x81\xd01\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x160\x14\x06\x03\ +U\x04\x08\x13\x0dMassachuset\ +ts1\x0f0\x0d\x06\x03U\x04\x07\x13\x06Wob\ +urn1\x1e0\x1c\x06\x03U\x04\x0a\x14\x15Mo\ +notype Imaging I\ +nc.1>0<\x06\x03U\x04\x0b\x135Di\ +gital ID Class 3\ + - Microsoft Sof\ +tware Validation\ + v21\x180\x16\x06\x03U\x04\x0b\x14\x0fTy\ +pe Operations1\x1e0\ +\x1c\x06\x03U\x04\x03\x14\x15Monotype\ + Imaging Inc.0\x81\x9f\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\ +\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x94D\xa0\x95i|\ +U\x0d\xd0\xdb\x16\x8d25\x8aL3\xab^ \xa1L\ +\xd7*\x878\xd7\x98\xa5@\xf0\x19I\x0b\x22\x1eSO\ +\xc2C\xa6\xca\x8b\xa9V\xefnH\x06\xa8\x05\x159\x1e\ +c;$\x12\x90\xb9\x98\xcf\xca\x085}r\xe3GW\ +\xfdy\xcb\x8aJ\xe7@p-5c\x7f\xae\x80\xcf\xc4\ +\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\xd7\xa4\xa0\xdb\x09\xf2\xa2\xf2\ +{\xef\xcdu\xc1\xf7ePd\x22\x9d\xbd}\xbc\xad\xb8\ +K\xccXE\x0eM\xd1YLM\x02\x03\x01\x00\x01\xa3\ +\x82\x01\x830\x82\x01\x7f0\x09\x06\x03U\x1d\x13\x04\x02\ +0\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\ +\x07\x800D\x06\x03U\x1d\x1f\x04=0;09\xa0\ +7\xa05\x863http://csc3\ +-2009-2-crl.veri\ +sign.com/CSC3-20\ +09-2.crl0D\x06\x03U\x1d \x04\ +=0;09\x06\x0b`\x86H\x01\x86\xf8E\x01\x07\ +\x17\x030*0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\ +\x16\x1chttps://www.ve\ +risign.com/rpa0\x13\ +\x06\x03U\x1d%\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\ +\x07\x03\x030u\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04\ +i0g0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\ +\x18http://ocsp.ver\ +isign.com0?\x06\x08+\x06\x01\ +\x05\x05\x070\x02\x863http://cs\ +c3-2009-2-aia.ve\ +risign.com/CSC3-\ +2009-2.cer0\x1f\x06\x03U\x1d\ +#\x04\x180\x16\x80\x14\x97\xd0k\xa8&p\xc8\xa1?\ +\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf20\x11\x06\x09`\ +\x86H\x01\x86\xf8B\x01\x01\x04\x04\x03\x02\x04\x100\x16\ +\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1b\x04\x080\x06\ +\x01\x01\x00\x01\x01\xff0\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00N\xe6\x22\x87\xdfg\ +A\x15\x17\xe2\xd2\xee~\x0e\xce\xc2\x99\xd6c\xbd\xf0\xb5\ +\x93\xe5jrb\xe1\xf5\xd2<8\xee\xa8=\x08_\xba\ +G\x81\x82_[KI\xf4\x1d \xfa\x0f\x93\x09\xd0\x1d\ +\x19VD\x17\xa2\x88\xf3\xfb\x8d\x9d\xae\xf7\x0d5\xde<\ +\x0c\xacD\x94`E*\x9b\xfe\x9boL;\xb14g\ +p\x10\x86\xffZ9\x5cZ\xe3l\x82\xab5|eK\ +\xfd\x98m\xb5\x15\x94I\x9c\x88p\x10\xbe=\xb1b\x95\ +\xb4\xdb\xb4\xd4\xda\xe8\x9dA\x90~\xfe}\xb9\xa4\x92\xeb\ +n\xf2\x22\x8a\xc6w6M\x8aZ\x0bS\x051\xd3+\ +(\xafR\xe1\x8dzk\xb5wD\xbd\x0c\xad\xf4]%\ +,\xe3\xcd\x8a0>K\x03\x9cy\xca\xa6N\xae\x0b\xc2\ +\xcc$\x07\x0b\xc1\x94\x82\xf6\x10\xf1\xba\x90\xb6\x9b\x9a\xd8\ +\x5c<\x13\xf1\xea\x02\x06\x18'M<\x89o3\x8a\xd3\ +\x86\xde\xe9X3u=\xeb\x93i\xe2DoN\x00l\ +\xcf\xd5\x85\xdaV\xa6\x9a\xa6?\xcbL!h\x90\xf2`\ +\xba\xe1\xe8\x06]9!\x132\xed1\x82\x03g0\x82\ +\x03c\x02\x01\x010\x81\xcb0\x81\xb61\x0b0\x09\x06\ +\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\ +\x0a\x13\x0eVeriSign, Inc\ +.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Veri\ +Sign Trust Netwo\ +rk1;09\x06\x03U\x04\x0b\x132Ter\ +ms of use at htt\ +ps://www.verisig\ +n.com/rpa (c)091\ +00.\x06\x03U\x04\x03\x13'VeriSi\ +gn Class 3 Code \ +Signing 2009-2 C\ +A\x02\x10f\xe3\xf0gy\xca\x15\x16mPSo\x88\ +\x19\x1a\x830\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\xa0p\ +0\x10\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x0c1\x02\ +0\x000\x19\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\ +\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x040\x1c\x06\ +\x0a+\x06\x01\x04\x01\x827\x02\x01\x0b1\x0e0\x0c\x06\ +\x0a+\x06\x01\x04\x01\x827\x02\x01\x150#\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14\x0e\xf9\xff\xfd\ +\x5c\x0a\xdc\x0c\xd6v\xbc\xe9\xd2\x00\xee\xd6\x5c\xc0\x9aT\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\ +\x81\x80s\x05\x09\x09.\xc15\xd2\xb0\xec\x81\xf5NP\ +\xae M\xd1/\xe9\xa9>\xd1'\x98\xb3Yh\x89\x15\ +\xde\xb0=\x9a n\xad\xd4\xe3\x1aWAmz\x8cv\ +\xb1\xa6\x89\x86(\xb4\x22\xa4\xc3\xe4\xbd\x8f\x96\xcd\x12K\ +\x1d\x9d\x8d\xbc\x10\xeb\x196,`\x8e'\xa4\xac\xe0\x85\ +\x5c\x9cK?\xb6\xf7\xecn}\xe9\xaf\x95\x1f^\xd6F\ +\x1f\xd6\x80\xe4\x17c\xd4\xa3h\x10\x14\xf2D\xfd\xca\x9d\ +i\xcd\x9e\xf0zQn\x0a3\x93SB\xed\xa3\x860\ +\x82|\xa1\x82\x01\x7f0\x82\x01{\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x09\x061\x82\x01l0\x82\x01h\x02\x01\x01\ +0g0S1\x0b0\x09\x06\x03U\x04\x06\x13\x02U\ +S1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeri\ +Sign, Inc.1+0)\x06\x03\ +U\x04\x03\x13\x22VeriSign Ti\ +me Stamping Serv\ +ices CA\x02\x108%\xd7\xfa\xf8a\xaf\ +\x9e\xf4\x90\xe7&\xb5\xd6Z\xd50\x09\x06\x05+\x0e\x03\ +\x02\x1a\x05\x00\xa0]0\x18\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x031\x0b\x06\x09*\x86H\x86\xf7\x0d\x01\x07\x01\ +0\x1c\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x051\x0f\x17\ +\x0d110505165510Z0#\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14~\ +\x94\x9a-\x14X\x8f\x1b\x0a`\x9e\xd2\x8e\xdb\x85\x00d\ +\xfe\xd5\x150\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\ +\x05\x00\x04\x81\x80C\x9b\xfe\x86\x85\xb7\xe6\x0e\xbfN\xa5\ +\xf7E\x84Nj\xe3\xa6\x88\xb2\xa2\x17z\x0a\x85C|\ +\x1f\x01\x0crSR\xb7\x97P\xbcf\xfdE\x9e\xe1\xab\ +\x92\xd7\x8b\x96A\xc4\xcbjz d\xa5\xa3\xcb\xcc5\ +\xf85e\x13\xab\x82\xfb\x9d\xfd+KX\xd5\x9f\x8fh\ +\x9b\xb6\xf1\xa3\x04<\xca\xee\x8c\xffD\xd0<\xf9\x81\xcc\ +\x82\xdb\xe86\xef\x87o[x1\xa4\x93\x89\x815\xfc\ +\x90\xef\xc9\xbdT\xaa\xc5]\x8bh}j\x82e:\xa8\ +\x7f\x80\xe3\x12\x87\x00\x00\ +\x00\x03ex\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIG\x8d\ +\xb9Y9\x00\x03P\x04\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03K\xe4\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03L\x04\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03L<\x00\x00\x03\xc6OS/2\xa2\ +\xe3\xa26\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x16\ +o\x19[\x00\x00\x1d\xe4\x00\x00\x00\xb6fpgm\xbb\ +s\xa4u\x00\x00\x14\xd0\x00\x00\x07\xe0gasp\x00\ +\x13\x00#\x00\x03K\xd4\x00\x00\x00\x10glyf\xa7\ +:\xa9+\x00\x00%\xf4\x00\x01C6head\xf7\ +\xc0\x9bL\x00\x00\x01<\x00\x00\x006hhea\x0d\ +\xfe\x0a\xdd\x00\x00\x01t\x00\x00\x00$hmtx\xcc\ +\xb2\xd4*\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01i,\x00\x01\xb66locaX\ +\xb5\x07\xee\x00\x00\x1e\x9c\x00\x00\x07Vmaxp\x05\ +[\x02\x1f\x00\x00\x01\x98\x00\x00\x00 name\x17\ +\xe7@S\x00\x03\x1fd\x00\x00\x06Bpost\x02\ +C\xefl\x00\x03%\xa8\x00\x00&+prep\xe2\ +\xa1\x06S\x00\x00\x1c\xb0\x00\x00\x011\x00\x01\x00\x00\x00\ +\x01\x19\x9a\xa1#\xc6\x82_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9L\xea\x93\x00\x00\x00\x00\xc9\xe8K{\xfa\ +-\xfd\xa8\x0bA\x08\xfe\x00\x00\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x0bB\xfa\ +-\xfeO\x0bA\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00X\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +&\x01\x0b\x00\x03\x00\x01\x00\x03\x05>\x03 \x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x02\x03\x08\x02\x02\x0b\x09\x06\x03\x08\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00\x00\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04m\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xa8\x00\xae\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x02R\x00R\x041\x00y\x05\ +L\x00%\x04\xb0\x00P\x07\x96\x00%\x06d\x00H\x02\ +V\x00y\x02\xdf\x00J\x02\xdf\x007\x04L\x00-\x04\ +\x87\x00H\x02y\x009\x02\x8b\x00+\x02P\x00V\x03\ +\x89\x00\x0a\x04\xb0\x00H\x04\xb0\x00T\x04\xb0\x00-\x04\ +\xb0\x00F\x04\xb0\x00#\x04\xb0\x00^\x04\xb0\x00F\x04\ +\xb0\x00N\x04\xb0\x00D\x04\xb0\x005\x02P\x00V\x02\ +`\x009\x04\x87\x00H\x04\x87\x00H\x04\x87\x00H\x04\ +\x0a\x00\x00\x07-\x00R\x05\xcf\x00\x00\x05d\x00\x9e\x05\ +1\x00h\x05\xdf\x00\x9e\x04d\x00\x9e\x04P\x00\x9e\x05\ +\xec\x00h\x06!\x00\x9e\x03\x85\x00F\x02\xd1\xff^\x05\ +\x7f\x00\x9e\x04\xa8\x00\x9e\x07\xbc\x00\x9e\x06\xac\x00\x9e\x06\ +`\x00h\x05\x0e\x00\x9e\x06`\x00h\x05j\x00\x9e\x04\ +\x9e\x00Z\x04\xba\x003\x06\x0e\x00\x96\x05\x8d\x00\x00\x08\ +P\x00\x1f\x05\xc9\x00\x04\x05P\x00\x00\x04\xe3\x00=\x02\ +\x98\x00u\x03\x89\x00\x06\x02\x98\x00/\x043\xff\xf0\x04\ +\x00\xff\xfc\x04\xc9\x01\x08\x04\xfc\x00J\x05%\x00\x87\x04\ +P\x00V\x05%\x00V\x04\xf2\x00V\x03N\x00-\x04\ +\xd9\x00\x14\x05\x5c\x00\x87\x02\x9a\x00\x7f\x02\x98\xff\x98\x05\ +F\x00\x87\x02\x96\x00\x87\x08\x00\x00\x87\x05\x5c\x00\x87\x05\ +\x19\x00V\x05%\x00\x87\x05%\x00V\x03\xc1\x00\x87\x04\ +D\x00w\x03\xae\x005\x05\x5c\x00\x85\x04\xe3\x00\x00\x07\ +H\x00\x19\x05\x0a\x00\x0a\x04\xe1\xff\xfe\x04\x0e\x001\x03\ +w\x00=\x04\x12\x01\x83\x03w\x00B\x04\x87\x00H\x02\ +\x14\x00\x00\x02R\x00R\x04\xb0\x00\x81\x04\xb0\x00f\x04\ +\x87\x00`\x04\xb0\x00\x08\x04\x12\x01\x83\x04\x00\x00j\x04\ +\xd1\x00\xdf\x06\x98\x00\x5c\x03-\x001\x05s\x00J\x04\ +\x87\x00H\x02\x8b\x00+\x06\x98\x00\x5c\x04\x00\xff\xfa\x03\ +`\x00?\x04\x87\x00H\x031\x00=\x031\x00?\x04\ +\xc9\x01\x08\x05`\x00\x87\x05%\x00f\x02P\x00V\x01\ +\x7f\xff\xa6\x031\x009\x03#\x001\x05s\x00L\x07\ +\x7f\xff\xf4\x07\x81\xff\xf4\x07\x81\x00S\x04\x0a\x00%\x05\ +\xcf\x00\x00\x05\xcf\x00\x00\x05\xcf\x00\x00\x05\xcf\x00\x00\x05\ +\xcf\x00\x00\x05\xcf\x00\x00\x07\x91\xff\xf6\x051\x00h\x04\ +d\x00\x9a\x04d\x00\x9e\x04d\x00\x97\x04d\x00\x9e\x03\ +\x85\xff\xea\x03\x85\x00F\x03\x85\xff\xff\x03\x85\x00(\x05\ +\xdf\x00\x1f\x06\xac\x00\x9e\x06`\x00h\x06`\x00h\x06\ +`\x00h\x06`\x00h\x06`\x00h\x04\x87\x00y\x06\ +`\x00h\x06\x0e\x00\x96\x06\x0e\x00\x96\x06\x0e\x00\x96\x06\ +\x0e\x00\x96\x05P\x00\x00\x05\x04\x00\x9e\x06\x00\x00\x87\x04\ +\xfc\x00J\x04\xfc\x00J\x04\xfc\x00J\x04\xfc\x00J\x04\ +\xfc\x00J\x04\xfc\x00J\x07{\x00J\x04P\x00V\x04\ +\xf2\x00V\x04\xf2\x00V\x04\xf2\x00V\x04\xf2\x00V\x02\ +\x9a\xff~\x02\x9a\x00k\x02\x9a\xff\x88\x02\x9a\xff\xc3\x05\ +!\x00X\x05\x5c\x00\x87\x05\x19\x00V\x05\x19\x00V\x05\ +\x19\x00V\x05\x19\x00V\x05\x19\x00V\x04\x87\x00H\x05\ +R\x00V\x05\x5c\x00\x85\x05\x5c\x00\x85\x05\x5c\x00\x85\x05\ +\x5c\x00\x85\x04\xe1\xff\xfe\x05%\x00\x87\x04\xe1\xff\xfe\x05\ +\xcf\x00\x00\x04\xfc\x00J\x05\xcf\x00\x00\x04\xfc\x00J\x05\ +\xcf\x00\x00\x04\xfc\x00J\x051\x00h\x04P\x00V\x05\ +1\x00h\x04P\x00V\x051\x00h\x04P\x00V\x05\ +1\x00h\x04P\x00V\x05\xdf\x00\x9e\x05%\x00V\x05\ +\xdf\x00\x1f\x05N\x00V\x04d\x00\x9e\x04\xf2\x00V\x04\ +d\x00\x9e\x04\xf2\x00V\x04d\x00\x9e\x04\xf2\x00V\x04\ +d\x00\x9e\x04\xf2\x00V\x04d\x00\x88\x04\xf2\x00V\x05\ +\xec\x00h\x04\xd9\x00\x14\x05\xec\x00h\x04\xd9\x00\x14\x05\ +\xec\x00h\x04\xd9\x00\x14\x05\xec\x00h\x04\xd9\x00\x14\x06\ +!\x00\x9e\x05\x5c\x00\x87\x06B\x00\x00\x05q\x00\x00\x03\ +\x85\x00 \x02\x9a\xff\xab\x03\x85\x00F\x02\x9a\xff\xe5\x03\ +\x85\x002\x02\x9a\xff\xb9\x03\x85\x00F\x02\x9a\x00^\x03\ +\x85\x00F\x02\x9a\x00\x89\x06B\x00F\x05\x0e\x00\x7f\x02\ +\xd1\xff^\x02\x98\xff\x82\x05\x7f\x00\x9e\x05F\x00\x87\x05\ +F\x00\x87\x04\xa8\x00\x9e\x02\x96\x00o\x04\xa8\x00\x9e\x02\ +\x96\x00q\x04\xa8\x00\x9e\x02\x96\x00\x87\x04\xa8\x00\x9e\x04\ +\x1f\x00\x87\x04\xdf\xff\xe1\x03V\xff\xe1\x06\xac\x00\x9e\x05\ +\x5c\x00\x87\x06\xac\x00\x9e\x05\x5c\x00\x87\x06\xac\x00\x9e\x05\ +\x5c\x00\x87\x06\xaa\x00\x01\x06\xac\x00\x9e\x05\x5c\x00\x87\x06\ +`\x00h\x05\x19\x00V\x06`\x00h\x05\x19\x00V\x06\ +`\x00h\x05\x19\x00V\x07\xa8\x00h\x07\xd7\x00V\x05\ +j\x00\x9e\x03\xc1\x00\x87\x05j\x00\x9e\x03\xc1\x00m\x05\ +j\x00\x9e\x03\xc1\x00[\x04\x9e\x00Z\x04D\x00w\x04\ +\x9e\x00Z\x04D\x00W\x04\x9e\x00Z\x04D\x00w\x04\ +\x9e\x00Z\x04D\x00a\x04\xba\x003\x03\xae\x005\x04\ +\xba\x003\x03\xd7\x00=\x04\xba\x003\x03\xd7\x005\x06\ +\x0e\x00\x96\x05\x5c\x00\x85\x06\x0e\x00\x96\x05\x5c\x00\x85\x06\ +\x0e\x00\x96\x05\x5c\x00\x85\x06\x0e\x00\x96\x05\x5c\x00\x85\x06\ +\x0e\x00\x96\x05\x5c\x00\x85\x06\x0e\x00\x96\x05\x5c\x00\x85\x08\ +P\x00\x1f\x07H\x00\x19\x05P\x00\x00\x04\xe1\xff\xfe\x05\ +P\x00\x00\x04\xe3\x00=\x04\x0e\x001\x04\xe3\x00=\x04\ +\x0e\x001\x04\xe3\x00=\x04\x0e\x001\x039\x00\x87\x04\ +q\x00\x8b\x05\xcb\x00\x00\x04\xfc\x00J\x07\x91\xff\xf6\x07\ +{\x00J\x06`\x00h\x05R\x00V\x04\x9e\x00Z\x04\ +D\x00w\x04\xd5\x00\xa4\x04\xd5\x00\xa4\x04\xbe\x00\xf4\x04\ +\xc9\x00\xd1\x02\x9a\x00\x7f\x04`\x01%\x01\xb2\xff\xfa\x04\ +\xc9\x00\xb0\x04\xae\x00N\x04T\x01\x96\x04\x85\x00s\x05\ +\xe9\xff\xb0\x02P\x00V\x05F\xff\xb0\x06\xf2\xff\xb0\x04\ +\xb8\xff\xb0\x06\xd7\xff\xb0\x06\xd1\xff\xb0\x06\xd1\xff\xb0\x03\ +{\xff\xa1\x05\xcf\x00\x00\x05d\x00\x9e\x04\xa0\x00\x9e\x05\ +\xa6\x00!\x04d\x00\x9e\x04\xe3\x00=\x06!\x00\x9e\x06\ +`\x00h\x03\x85\x00F\x05\x7f\x00\x9e\x05\x8d\x00\x00\x07\ +\xbc\x00\x9e\x06\xac\x00\x9e\x04\x98\x00P\x06`\x00h\x05\ +\xe9\x00\x9e\x05\x0e\x00\x9e\x04\xd1\x00J\x04\xba\x003\x05\ +P\x00\x00\x07'\x00L\x05\xc9\x00\x04\x07q\x00q\x06\ +^\x001\x03\x85\x00&\x05P\x00\x00\x05`\x00V\x04\ +o\x00?\x05\x5c\x00\x87\x03{\x00\x85\x05N\x00\x83\x05\ +`\x00V\x05{\x00\x87\x04\xd3\xff\xfe\x05\x17\x00V\x04\ +o\x00?\x04\x14\x00V\x05\x5c\x00\x87\x05#\x00V\x03\ +{\x00\x85\x05F\x00\x87\x05R\x00\x00\x05`\x00\x87\x04\ +\xf6\x00\x00\x04!\x00V\x05\x19\x00V\x06\x5c\x00\x17\x05\ +3\x00\x83\x04D\x00V\x05s\x00V\x04;\x00\x17\x05\ +N\x00\x83\x06\xc5\x00V\x05+\xff\xcb\x07'\x00\x83\x07\ +P\x00b\x03{\xff\xd6\x05N\x00\x83\x05\x19\x00V\x05\ +N\x00\x83\x07P\x00b\x04d\x00\x9e\x06\xa0\x003\x04\ +\xa0\x00\x9e\x05}\x00h\x04\x9e\x00Z\x03\x85\x00F\x03\ +\x85\x00(\x02\xd1\xff^\x08?\x00\x19\x08\x12\x00\x9e\x06\ +\xa8\x003\x05\x93\x00\x9e\x05s\x00\x19\x05\xec\x00\x9e\x05\ +\xcf\x00\x00\x05-\x00\x9e\x05d\x00\x9e\x04\xa0\x00\x9e\x06\ +\x83\x00\x08\x04d\x00\x9e\x085\xff\xf8\x05T\x00X\x06\ +\xc3\x00\x9e\x06\xc3\x00\x9e\x05\x93\x00\x9e\x06\x19\x00\x19\x07\ +\xbc\x00\x9e\x06!\x00\x9e\x06`\x00h\x05\xe9\x00\x9e\x05\ +\x0e\x00\x9e\x051\x00h\x04\xba\x003\x05s\x00\x19\x07\ +'\x00L\x05\xc9\x00\x04\x06\xa6\x00\x9e\x06\x12\x00j\x08\ +\xb4\x00\x9e\x09o\x00\x9e\x06\x1b\x003\x07b\x00\x9e\x04\ +\xfc\x00\x9e\x05\x5c\x00R\x08\x9c\x00\x9e\x05o\xff\xec\x04\ +\xfc\x00J\x057\x00X\x05\x5c\x00\x87\x04\x02\x00\x87\x05\ +\xcb\x00\x19\x04\xf2\x00V\x07\xc3\xff\xf8\x04o\x00H\x05\ +\xd1\x00\x87\x05\xd1\x00\x87\x05h\x00\x87\x05\x7f\x00\x10\x06\ +\xdf\x00\x87\x05R\x00\x87\x05\x19\x00V\x05B\x00\x87\x05\ +%\x00\x87\x04P\x00V\x04\xd3\x001\x04\xe1\xff\xfe\x06\ +\xee\x00V\x05\x0a\x00\x0a\x06\x17\x00\x87\x05^\x00V\x08\ +\x08\x00\x87\x08\x98\x00\x87\x05\xb4\x001\x06\xee\x00\x87\x04\ +\xa4\x00\x87\x04T\x003\x079\x00\x87\x04\xdf\xff\xe7\x04\ +\xf2\x00V\x05q\x00\x00\x04\x02\x00\x87\x04V\x00V\x04\ +D\x00w\x02\x9a\x00\x7f\x02\x9a\xff\xb7\x02\x98\xff\x98\x07\ +o\x00\x10\x07%\x00\x87\x05q\x00\x00\x05h\x00\x87\x04\ +\xe1\xff\xfe\x05\x83\x00\x87\x04\xdb\x00\x9e\x04X\x00\x87\x08\ +P\x00\x1f\x07H\x00\x19\x08P\x00\x1f\x07H\x00\x19\x08\ +P\x00\x1f\x07H\x00\x19\x05P\x00\x00\x04\xe1\xff\xfe\x04\ +\x00\x00J\x08\x00\x00J\x08\x00\x00L\x04\x00\xff\xfc\x02\ +\x00\x00\x14\x02\x00\x00%\x02y\x009\x02\x00\x00\x14\x03\ +\xfe\x00\x14\x03\xfe\x00%\x04w\x009\x04\x1b\x00o\x04\ +1\x00o\x03#\x00J\x06\xf0\x00V\x0a\xc5\x00%\x02\ +V\x00y\x041\x00y\x033\x00J\x033\x00L\x04\ +\xa4\x00R\x00\xbc\xfeN\x03\xae\x00o\x04\xb0\x00\x1f\x04\ +\xb0\x00f\x07\xb4\x00\x9e\x04\xb0\x007\x06m\x00)\x04\ +\xb0\x007\x08\xc5\x00\x8f\x06)\x00%\x06^\x001\x04\ +\xf4\x00f\x07\x7f\x00\x0b\x07\x81\x00A\x07\x81\x00]\x07\ +{\x00*\x04\xc5\x003\x05\xa6\x00!\x05\xd3\x00\x8f\x05\ +\x0a\x00\x19\x04\x87\x00H\x04f\x00#\x05\x96\x00b\x03\ +o\xff\xe3\x04\x87\x00H\x04\x87\x00H\x04\x87\x00H\x04\ +\x87\x00H\x04\x9e\x00F\x05\xe7\x00-\x05\xe3\x00-\x04\ +\x9a\x00`\x02\x98\xff\x98\x03\xc5\x01%\x03\xc5\x011\x03\ +\xc5\x01\x10\x031\x00)\x031\x00\x1d\x031\x00`\x03\ +1\x001\x031\x00=\x031\x00)\x031\x00/\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +`\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00J\x08\x00\x00V\x02\x98\xff\x80\x02\ +\x00\x00%\x06\x08\x00\x0c\x05`\x00\x00\x08\x83\x00=\x07\ +\xbc\x00\x9e\x08\x00\x00\x87\x05\xcf\x00\x00\x04\xfc\x00J\x08\ +b\xff\xad\x02\x9e\x00?\x03\x91\x00\x5c\x095\x00-\x09\ +1\x00-\x06\xc3\x00h\x05\xc7\x00V\x073\x00\x96\x06\ +{\x00\x85\x00\x00\xfb\x88\x00\x00\xfcU\x00\x00\xfbe\x00\ +\x00\xfcj\x00\x00\xfcF\x04d\x00\x9e\x06\xc3\x00\x9e\x04\ +\xf2\x00V\x05\xd1\x00\x87\x09\x0c\x00h\x07\x19\x00\x00\x05\ +X\xff\xf8\x05}\x00\x00\x07\xaa\x00\x9e\x06\xbc\x00\x87\x06\ +\xc5\xff\xf6\x05\x9a\xff\xf0\x09L\x00\x9e\x08\x00\x00\x87\x06\ +\xdd\xff\xf6\x05\xb6\x00\x00\x09b\x00\x9e\x08\x1d\x00\x87\x05\ +T\x00-\x04o\xff\xfe\x07q\x00q\x07'\x00\x83\x06\ +`\x00h\x05\x19\x00V\x05\xfa\x00\x00\x05\x19\x00\x00\x05\ +\xfa\x00\x00\x05\x19\x00\x00\x0bB\x00h\x09\xd1\x00V\x06\ +\xb2\x00h\x05\x9e\x00V\x09\x0c\x00h\x07=\x00)\x09\ +\x0c\x00h\x07\x19\x00\x00\x05P\x00h\x04Z\x00V\x04\ +\xb0\x003\x04V\x00{\x04}\x00\xdb\x04P\x01\x96\x04\ +N\x01\x83\x07\xe1\x00%\x07\x9e\x00%\x07q\x00\x9e\x06\ +X\x00\x87\x05X\xff\xf8\x05\x17\x00\x00\x05`\x00\x9e\x05\ +V\x00\x87\x04\xa0\x00\x14\x04\x02\x00\x14\x05\xf8\x00\x9e\x05\ +-\x00\x87\x08\xe7\xff\xf8\x085\xff\xf8\x05T\x00X\x04\ +o\x00H\x06?\x00\x9e\x05\xc9\x00\x87\x05\xfa\x00\x9e\x05\ +\xba\x00\x87\x05\x7f\x00\x0e\x05}\x00\x00\x06Z\x003\x06\ +y\x001\x06\xdb\x00\x9e\x05\xe1\x00\x87\x06\xfc\x00\x9e\x06\ +H\x00\x87\x08\xfa\x00\x9e\x07\xc5\x00\x87\x06\xa2\x00h\x05\ +\x7f\x00V\x051\x00h\x04P\x00V\x04\xba\x003\x04\ +\xd3\x001\x05P\x00\x00\x04\xe3\x00\x00\x05P\x00\x00\x04\ +\xe3\x00\x00\x06\x5c\x00\x04\x05\x7f\x00\x0a\x07\x89\x003\x07\ +\x0c\x001\x06\xd1\x00o\x05\xee\x00V\x06\x12\x00j\x05\ +\x8b\x00V\x06\x12\x00\x9e\x05^\x00\x87\x07\x9c\xff\xdf\x05\ +\xe3\xff\xdf\x07\x9c\xff\xdf\x05\xe3\xff\xdf\x03\x85\x00F\x08\ +5\xff\xf8\x07\xc3\xff\xf8\x06J\x00\x9e\x05\xc7\x00\x87\x06\ +\xc7\x00\x19\x06\x06\x00\x10\x06!\x00\x9e\x05R\x00\x87\x06\ +\xcf\x00\x9e\x05\xd9\x00\x87\x06\x12\x00j\x05^\x00V\x08\ +j\x00\x9e\x07\xb8\x00\x87\x03\x85\x00F\x05\xcf\x00\x00\x04\ +\xfc\x00J\x05\xcf\x00\x00\x04\xfc\x00J\x07\x91\xff\xf6\x07\ +{\x00J\x04d\x00_\x04\xf2\x00V\x06X\x00^\x04\ +\xf2\x00V\x06X\x00^\x04\xf2\x00V\x085\xff\xf8\x07\ +\xc3\xff\xf8\x05T\x00X\x04o\x00H\x05\x12\x00J\x04\ +\xdb\x00\x14\x06\xc3\x00\x9e\x05\xd1\x00\x87\x06\xc3\x00\x9e\x05\ +\xd1\x00\x87\x06`\x00h\x05\x19\x00V\x06`\x00h\x05\ +\x19\x00V\x06`\x00h\x05\x19\x00V\x05\x5c\x00R\x04\ +T\x003\x05s\x00\x19\x04\xe1\xff\xfe\x05s\x00\x19\x04\ +\xe1\xff\xfe\x05s\x00\x19\x04\xe1\xff\xfe\x06\x12\x00j\x05\ +^\x00V\x04\xa0\x00\x9e\x04\x02\x00\x87\x07b\x00\x9e\x06\ +\xee\x00\x87\x04\xa0\x00\x14\x04\x02\x00\x14\x06f\x00\x04\x05\ +\xc1\x00\x0a\x05\xc9\x00\x04\x05\x0a\x00\x0a\x04\xfc\x00J\x05\ +%\x00V\x07X\x00J\x07\x96\x00V\x07o\x00\x0a\x07\ +3\x00H\x05\xb6\x00\x0a\x05D\x00H\x08Z\x00\x19\x07\ +\xd7\x00\x10\x08b\x00\x9e\x07\xc3\x00\x87\x06P\x00h\x05\ +H\x00V\x06-\x003\x06%\x001\x05T\x00`\x04\ +o\x00?\x07!\x00\x19\x06\x8d\x00\x10\x05\xcf\x00\x00\x04\ +\xfc\x00J\x05\xcf\x00\x00\x04\xfc\x00J\x05\xcf\x00\x00\x04\ +\xfc\x00J\x05\xcf\xff\xfc\x04\xfc\xff\x93\x05\xcf\x00\x00\x04\ +\xfc\x00J\x05\xcf\x00\x00\x04\xfc\x00J\x05\xcf\x00\x00\x04\ +\xfc\x00J\x05\xcf\x00\x00\x04\xfc\x00J\x05\xcf\x00\x00\x04\ +\xfc\x00J\x05\xcf\x00\x00\x04\xfc\x00J\x05\xcf\x00\x00\x04\ +\xfc\x00J\x05\xcf\x00\x00\x04\xfc\x00J\x04d\x00\x9e\x04\ +\xf2\x00V\x04d\x00\x9e\x04\xf2\x00V\x04d\x00\x9e\x04\ +\xf2\x00V\x04d\x00\x9e\x04\xf2\x00V\x04d\xffb\x04\ +\xf2\xff\x95\x04d\x00\x9e\x04\xf2\x00V\x04d\x00\x9e\x04\ +\xf2\x00V\x04d\x00\x84\x04\xf2\x00V\x03\x85\x00F\x02\ +\x9a\x00h\x03\x85\x00F\x02\x9a\x00}\x06`\x00h\x05\ +\x19\x00V\x06`\x00h\x05\x19\x00V\x06`\x00h\x05\ +\x19\x00V\x06`\x007\x05\x19\xff\x97\x06`\x00h\x05\ +\x19\x00V\x06`\x00h\x05\x19\x00V\x06`\x00h\x05\ +\x19\x00V\x06\xc3\x00h\x05\xc7\x00V\x06\xc3\x00h\x05\ +\xc7\x00V\x06\xc3\x00h\x05\xc7\x00V\x06\xc3\x00h\x05\ +\xc7\x00V\x06\xc3\x00h\x05\xc7\x00V\x06\x0e\x00\x96\x05\ +\x5c\x00\x85\x06\x0e\x00\x96\x05\x5c\x00\x85\x073\x00\x96\x06\ +{\x00\x85\x073\x00\x96\x06{\x00\x85\x073\x00\x96\x06\ +{\x00\x85\x073\x00\x96\x06{\x00\x85\x073\x00\x96\x06\ +{\x00\x85\x05P\x00\x00\x04\xe1\xff\xfe\x05P\x00\x00\x04\ +\xe1\xff\xfe\x05P\x00\x00\x04\xe1\xff\xfe\x05N\x00V\x00\ +\x00\xfa\xe5\x00\x00\xfb\x9e\x00\x00\xfa-\x00\x00\xfb\x9e\x00\ +\x00\xfb\xa2\x00\x00\xfb\xa0\x00\x00\xfb\xa0\x00\x00\xfb\xa0\x00\ +\x00\xfb\xa0\x01\xa6\xff\xfa\x02\xc3\x00\x0c\x02\xc3\x00\x0c\x04\ +3\x00\x17\x05\x04\x00V\x049\x001\x04\xd1\x009\x04\ +\xb0\x00F\x04\x91\x00\x14\x04\xb0\x00^\x04\xb0\x00F\x04\ +\xb0\x00N\x04\xb0\x00D\x04\xb0\x005\x06\x9c\x00-\x06\ +7\x00B\x04\xba\x003\x03\xae\x005\x05%\x00V\x05\ +%\x00V\x05%\x00V\x05%\x00V\x05%\x00V\x02\ +\xc9\x00\x9e\x02\xc9\xff\x8c\x02\xc9\x00\x9c\x02\xc9\xff\xa1\x02\ +\xc9\xff\xc9\x02\xc9\xff\xc1\x02\xc9\xff\xfd\x02\xc9\xff\xd4\x02\ +\xc9\x00X\x02\xc9\x00\x93\x05\x9a\x00\x9e\x03\xa0\xff\xb0\x02\ +\xc9\x00\x9e\xff\xc7\x00\x9e\xff\xc9\x00\x9e\x00\x9e\x00r\x00\ +\x94\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,F#F`\x8a\x8aF# F\x8a`\ +\x8aa\xb8\xff\x80b# \x10#\x8a\xb1\x0c\x0c\x8ap\ +E` \xb0\x00PX\xb0\x01a\xb8\xff\x80\x8b\x1b\xb0\ +\x81\x8cYh:-,K#QX\xb9\x003\xff\xe0\ +\xb14 \x1b\xb33\x004\x00YDD-,\xb0\x16\ +CX\xb0\x03&E\x8aXdf\xb0\x1f`\x1bd\xb0\ + `f X\x1b!\xb0@Y\xb0\x01aY#X\ +eY\xb0)#D#\x10\xb0)\xe0\x1b!!!!\ +!Y-,\xb0\x02CTXKS#KQZX\ +8\x1b!!Y\x1b!!!!Y-,\xb0\x16C\ +X\xb0\x04%Ed\xb0 `f X\x1b!\xb0@\ +Y\xb0\x01a#X\x1beY\xb0)#D\xb0\x05%\ +\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04%\x10\xb0\x05\ +% F\xb0\x04%#B<\xb0\x04%\xb0\x07%\x08\ +\xb0\x07%\x10\xb0\x06% F\xb0\x04%\xb0\x01`#\ +B< X\x01\x1b\x00Y\xb0\x04%\x10\xb0\x05%\xb0\ +)\xe0\xb0) EeD\xb0\x07%\x10\xb0\x06%\xb0\ +)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\ +\x05%\xb0\x03%CH\xb0\x04%\xb0\x07%\x08\xb0\x06\ +%\xb0\x03%\xb0\x01`CH\x1b!Y!!!!\ +!!!-,\x02\xb0\x04% F\xb0\x04%#\ +B\xb0\x05%\x08\xb0\x03%EH!!!!-,\ +\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%CH!!\ +!-,E# E\x18 \xb0\x00P X#e\ +#Y#h \xb0@PX!\xb0@Y#Xe\ +Y\x8a`D-,KS#KQZX E\x8a\ +`D\x1b!!Y-,KTX E\x8a`D\ +\x1b!!Y-,KS#KQZX8\x1b!\ +!Y-,\xb0\x00!KTX8\x1b!!Y-\ +,\xb0\x02CTX\xb0F+\x1b!!!!Y-\ +,\xb0\x02CTX\xb0G+\x1b!!!Y-,\ +\xb0\x02CTX\xb0H+\x1b!!!!Y-,\ +\xb0\x02CTX\xb0I+\x1b!!!Y-, \ +\x8a\x08#KS\x8aKQZX#8\x1b!!Y\ +-,\x00\xb0\x02%I\xb0\x00SX \xb0@8\x11\ +\x1b!Y-,\x01F#F`#Fa# \x10\ + F\x8aa\xb8\xff\x80b\x8a\xb1@@\x8apE`\ +h:-, \x8a#Id\x8a#SX<\x1b!\ +Y-,KRX}\x1bzY-,\xb0\x12\x00K\ +\x01KTB-,\xb1\x02\x00B\xb1#\x01\x88Q\xb1\ +@\x01\x88SZX\xb9\x10\x00\x00 \x88TX\xb2\x02\ +\x01\x02C`BY\xb1$\x01\x88QX\xb9 \x00\x00\ +@\x88TX\xb2\x02\x02\x02C`B\xb1$\x01\x88T\ +X\xb2\x02 \x02C`B\x00K\x01KRX\xb2\x02\ +\x08\x02C`BY\x1b\xb9@\x00\x00\x80\x88TX\xb2\ +\x02\x04\x02C`BY\xb9@\x00\x00\x80c\xb8\x01\x00\ +\x88TX\xb2\x02\x08\x02C`BY\xb9@\x00\x01\x00\ +c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C`BY\xb1\ +&\x01\x88QX\xb9@\x00\x02\x00c\xb8\x04\x00\x88T\ +X\xb2\x02@\x02C`BY\xb9@\x00\x04\x00c\xb8\ +\x08\x00\x88TX\xb2\x02\x80\x02C`BYYYY\ +YY\xb1\x00\x02CTX@\x0a\x05@\x08@\x09@\ +\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\x05@\x08\xba\ +\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\xb1\x80\x02C\ +RX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\x1b\xb2\x05@\ +\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\x00\x80\x88U\ +\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZX\xb3\x0c\x00\ +\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYBBBBB\ +-,E\x18h#KQX# E d\xb0@\ +PX|Yh\x8a`YD-,\xb0\x00\x16\xb0\x02\ +%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02#>\xb1\x01\ +\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\x01\xb0\x01#\ +?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\x06#eB\ +\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\xb0\x02CP\ +\xb0\x01\xb0\x02CT[X!#\x10\xb0 \x1a\xc9\x1b\ +\x8a\x10\xedY-,\xb0Y+-,\x8a\x10\xe5-@\ +\xbb\x09YG\xff\x1f!H U \x01\x03U\x1fH\ +\x03U\x1e\x03\xff\x1f\x94X\xa4X\xb4X\x03WT\x0c\ +\x1fVT\x0c\x1fUT\x17\x1fDTTT\x02&4\ +\x10U\x193\x18U\x073\x03U\x06\x03\xff\x1fQN\ +\x0c\x1fPN\x0c\x1fON\x17\x1fDNTN\xa4N\ +\x03\x133\x12U\x05\x01\x03U\x043\x03U\x1f\x03\x01\ +\x0f\x03?\x03\xaf\x03\x03\x06dM\x01DL\x01KF\ +\x0d\x1fJF\x0d\x1fIF\x0d\x1f\x04H\x14H$H\ +\x03GF\x0d\x1f$F\x01\x1b\x1c3\x1f\x11\x01\x0fU\ +\x103\x0fU\x1f\x0f?\x0f_\x0f\x03\x1f\x0f\xaf\x0f\xcf\ +\x0f\x03\x10\x0f\x01\x013\x00U?\x00o\x00\x7f\x00\xaf\ +\x00\xef\x00\x05\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\x90\xb1\ +TS++K\xb8\x07\xffRK\xb0\x09P[\xb0\x01\ +\x88\xb0%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\xb0\x00\ +UZ[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\x1dK\ +\xb02SX\xb0 \x1dYK\xb0dSX\xb0\x10\x1d\ +\xb1\x16\x00BYss+stu+++s+\ +s+++ss^st+++s+++\ +++++s+++s+++++\x18^\ +\x00\x00\x00\x06\x14\x00\x17\x00\x00\x05\xb6\x00\x17\x00u\x05\ +\xb6\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x04m\x00\x14\x00l\x00\x00\xff\xec\x00\x00\x00\x00\xff\ +\xec\x00\x00\x00\x00\xff\xec\x00\x00\xfe5\xfe\x14\x00\x00\x05\ +\xb6\x00\x17\xfc\x94\xff\xe9\xfe\x93\xfe`\xfe\xcb\xfe\xa8\x00\ +\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x01\ +#\x013\x01Z\x01\x17\x01\x0a\x01\x00\x00\xf6\x00\xd7\x01\ +D\x01=\x01/\x01#\x01\x13\x01\x00\x01<\x01F\x01\ +/\x01\x1c\x00\xcd\x013\x01\x7f\x00\x00\x00\x00\x00$\x00\ +$\x00$\x00$\x00X\x00}\x01\x00\x01\x82\x01\xf7\x02\ +|\x02\x94\x02\xc8\x02\xfd\x03-\x03Z\x03y\x03\x8f\x03\ +\xb0\x03\xcd\x04\x10\x04=\x04\x8b\x04\xf0\x05=\x05\x91\x05\ +\xed\x06\x17\x06\x8d\x06\xeb\x07$\x07Z\x07\x83\x07\xa8\x07\ +\xd3\x08/\x08\xc5\x09\x0b\x09e\x09\xa3\x09\xdc\x0a\x12\x0a\ +A\x0a\x91\x0a\xc4\x0a\xef\x0b\x1c\x0b]\x0b|\x0b\xcc\x0c\ +\x0b\x0cL\x0c\x8a\x0c\xdf\x0d)\x0d\x80\x0d\xa5\x0d\xdb\x0e\ +\x14\x0ey\x0e\xbd\x0e\xf0\x0f%\x0fL\x0fj\x0f\x90\x0f\ +\xbd\x0f\xd3\x0f\xf6\x10Q\x10\xa7\x10\xe4\x11:\x11\x96\x11\ +\xdc\x12x\x12\xb5\x12\xe2\x13 \x13a\x13y\x13\xd3\x14\ +\x0e\x14Q\x14\xa5\x14\xf6\x15*\x15\x82\x15\xc6\x16\x01\x16\ +:\x16\x9e\x16\xe2\x176\x17l\x17\xbd\x17\xd6\x18%\x18\ +V\x18V\x18\x89\x18\xd8\x193\x19\x8f\x19\xed\x1a\x14\x1a\ +\x8c\x1a\xc2\x1b:\x1b\x94\x1b\xd8\x1b\xf9\x1c\x01\x1c\x90\x1c\ +\xa7\x1c\xdf\x1d\x1c\x1dZ\x1d\xb1\x1d\xd3\x1e\x1a\x1eM\x1e\ +o\x1e\xa3\x1e\xd2\x1f\x04\x1fI\x1f_\x1ft\x1f\x8a\x1f\ +\xe6\x1f\xf7 \x08 \x19 * < Q \xaf \ +\xbb \xcc \xdd \xee!\x00!\x11!\x22!3!\ +E!\x98!\xa9!\xba!\xcb!\xdc!\xed!\xff\x22\ +/\x22\x8c\x22\x9d\x22\xae\x22\xbf\x22\xd1\x22\xe2###\ +\x9a#\xaa#\xbb#\xcb#\xdb#\xec#\xfd$\x95$\ +\xa1$\xb1$\xc2$\xd2$\xe3$\xf4%\x05%\x16%\ +(%\x8f%\x9f%\xaf%\xc0%\xd0%\xe0%\xf1&\ +4&\x92&\xa2&\xb3&\xc3&\xd4&\xe5'<'\ +M'^'n'\x7f'\x8f'\x9b'\xa7'\xb8'\ +\xc9'\xda'\xea'\xfb(\x0c(\x1d(-(>(\ +J(R(\xb8(\xc9(\xd9(\xea(\xfa)\x0b)\ +\x1c)()4)E)U)f)v)\x87)\ +\x97)\xa8)\xb9)\xc5)\xd6)\xe7)\xfb*L*\ +\xa1*\xb2*\xc3*\xd4*\xe5*\xf6+\x07+\x13+\ +\x1e+/+G+S+_+p+\x81+\x8d+\ +\x99+\xd9+\xea+\xfe,\x09,\x15,&,2,\ +F,[,\x91,\xc1,\xd2,\xe3,\xef,\xfb-\ +\x0c-\x1c-(-v-\xc9-\xda-\xea-\xfb.\ +\x0b.\x1d./.\x9a/\x1e///?/K/\ +W/h/x/\x89/\x99/\xaa/\xba/\xc6/\ +\xd2/\xe3/\xf3/\xfe0\x090\x1a0.0m0\ +\xcc0\xdd0\xed0\xfe1\x0e1\x1f1/1A1\ +R1d1v1\x821\x8e1\x9f1\xb01\xc11\ +\xd11\xe31\xf42\x042\x152&272G2\ +r2\xc93V3\xf84\x094\x1a4+4<4\ +G4R4}4\xaa4\xc14\xeb5\x085:5\ +e5\x9f5\xd55\xf3666J6R6g6\ +|6\x916\xa56\xba6\xce6\xe16\xe96\xf17\ +\x117\x197!7)717\x8b7\x937\x9b7\ +\xcd7\xd57\xdd8\x1a8\x228G8O8\x948\ +\x9c8\xa49\x0e9\x169f9\xc79\xd99\xeb9\ +\xfb:\x0c:\x1d:.:@:\xa5;\x15;[;\ +\xc4=F=\xa8=\ +\xb0=\xe3>V>^>\xa8>\xf4?@?\x8c?\ +\xc8@\x01@e@\xd1A$A\x87A\x99A\xaaA\ +\xbbA\xccA\xddA\xefBBBSB\xa4B\xacB\ +\xb4B\xc6B\xceC1C\x88C\xceC\xdfC\xf0D\ +\x22D*DrDzD\x82D\xcfD\xd7E0E\ +\x98E\xcfE\xe0F\x18FVF^FfFnF\ +vF~F\x86F\x8eF\xdfF\xe7F\xefG$G\ +ZG\x8eG\xcfH\x15H`H\x9bH\xf2IGI\ +\x98I\xa0J\x09JbJ\x82J\xcfJ\xd7K*K\ +\x8fK\xc6K\xd7L\x0eLIL\x95L\xc9L\xd1L\ +\xf7L\xffM\x07M-M5M\x9bM\xa3M\xd8N\ +\x0dN@N\x82N\xccO\x19OZO\xadP\x0dP\ +]PnP\xd2P\xe2Q3Q;QCQUQ\ +]Q\xc3R\x1eR&R7RGRzR\xa0R\ +\xc5R\xd6R\xe7R\xf8S\x09S\x1bS-S>S\ +OSeS{S\x91S\xb5S\xd3S\xf1S\xf9T\ +\x17THTyT\xabT\xf0U^U\x84U\xd1V\ +rVzV\x82V\xaaV\xd3V\xdfV\xfcW5W\ +}W\xf1XeX\xe6YYY\xb3Z-Z\x8bZ\ +\x93Z\xe9[\x00[\x17[.[E[\xa3[\xdf\x5c\ +\x04\x5cB\x5cX\x5c\x8a\x5c\xf2])]?]\x91]\ +\xa2]\xb3]\xf0]\xfc^\x08^0^Z^z^\ +\x9d^\xbb^\xf2_0_{_\xd3_\xfa`c`\ +\xb5`\xb5`\xb5`\xb5`\xb5`\xb5`\xb5`\xb5`\ +\xb5`\xb5`\xb5`\xb5`\xb5`\xb5b\x08bxb\ +\x89b\x91c\x19c_c\xd2c\xe3c\xf4d\x00d\ +\x0cd\x19dLd\x90d\xa0d\xb0e\x12exe\ +\xc6f\x1df&f/f8fbf{f\x8cf\ +\x9df\xadf\xbdg;g\xa3g\xf7hPh\xbbi\ +%ini\xbcj)j\x94k\x01khk\xefl\ +pm m\xd6m\xdem\xe6n9n\x8dn\xd8o\ + o2oDoPo\x5co\xd1pEq\x10q\ +\xc2rkr\xfas@s\x82s\xb1s\xddt\x0dt\ +=tnu`v\x03vlv\xd3w'w\x7fw\ +\xdfxFx\x80x\xbay\x0ey`y\xc7z-z\ +9zEz\x8cz\xd2{%{{{\xcf|\x1f|\ +d|\xab|\xee}1}n}\xac~\x09~c~\ +\xf0\x7fw\x7f\x83\x7f\x8f\x7f\xc4\x7f\xf9\x80\x01\x80;\x80\ +\x8c\x80\xe2\x816\x81\x87\x81\xcd\x82\x12\x82Y\x82\x9e\x82\ +\xf5\x83J\x83\x80\x83\xb4\x84&\x84\x8f\x85\x0c\x85\x82\x85\ +\x8a\x85\x9b\x85\xac\x86\x01\x86X\x86\xac\x86\xfd\x87C\x87\ +\x88\x87\xd1\x88\x1a\x88`\x88\xa2\x88\xfe\x89_\x89g\x89\ +x\x89\x88\x89\x9a\x89\xab\x89\xb3\x89\xbb\x89\xcc\x89\xdc\x8a\ +4\x8a\x87\x8a\x99\x8a\xaa\x8a\xbc\x8a\xce\x8a\xe0\x8a\xf1\x8b\ +K\x8b\xa6\x8b\xb7\x8b\xc8\x8b\xda\x8b\xec\x8b\xfe\x8c\x0f\x8c\ +\x17\x8c\x1f\x8c1\x8cB\x8cT\x8cf\x8cw\x8c\x87\x8c\ +\x99\x8c\xaa\x8c\xbc\x8c\xce\x8c\xe0\x8c\xf1\x8d\x1f\x8dM\x8d\ +_\x8dq\x8d}\x8d\x89\x8d\x95\x8d\xa1\x8d\xff\x8eT\x8e\ +\x92\x8e\x9a\x8e\xf6\x8fg\x8f\xd2\x90B\x90\xa4\x91\x06\x91\ +d\x91\xc2\x92\x10\x92a\x92\xb2\x93\x07\x93M\x93\x95\x93\ +\xfb\x94\x03\x94\x0f\x94\x1b\x94'\x943\x94D\x94U\x94\ +g\x94y\x94\x8b\x94\x9d\x94\xaf\x94\xc1\x94\xd3\x94\xe5\x94\ +\xfb\x95\x10\x95\x22\x954\x95F\x95X\x95j\x95|\x95\ +\x8e\x95\xa0\x95\xb6\x95\xcb\x95\xd7\x95\xe3\x95\xf4\x96\x05\x96\ +\x16\x96&\x968\x96J\x96\x5c\x96n\x96\x80\x96\x92\x96\ +\xa4\x96\xb6\x96\xcc\x96\xe1\x96\xf2\x97\x03\x97\x0f\x97\x1b\x97\ +'\x973\x97D\x97U\x97g\x97y\x97\x8b\x97\x9d\x97\ +\xaf\x97\xc1\x97\xd3\x97\xe5\x97\xfb\x98\x10\x98!\x983\x98\ +D\x98U\x98f\x98x\x98\x89\x98\x9a\x98\xa6\x98\xb2\x98\ +\xbe\x98\xca\x98\xdb\x98\xec\x98\xfd\x99\x0f\x99 \x991\x99\ +B\x99T\x99e\x99v\x99\x82\x99\x8e\x99\x9a\x99\xa6\x99\ +\xb7\x99\xc8\x99\xd9\x99\xe9\x99\xf5\x9a\x22\x9aV\x9a\x8a\x9a\ +\xcc\x9b%\x9bW\x9b\x88\x9b\xcc\x9c\x19\x9cJ\x9cp\x9c\ +\x96\x9c\xc3\x9d\x06\x9d3\x9d~\x9d\xe4\x9e)\x9e\x81\x9e\ +\x89\x9e\xb4\x9e\xbc\x9f\x1a\x9f&\x9f\xaf\x9f\xbb\x9f\xc7\xa0\ +.\xa0>\xa0N\xa0_\xa0p\xa0\x85\xa0\x96\xa0\xa7\xa0\ +\xb8\xa0\xca\xa0\xdb\xa0\xec\xa0\xfd\xa1\x08\xa1\x19\xa1%\xa1\ +:\xa1B\xa1T\xa1\x5c\xa1n\xa1v\xa1~\xa1\x8f\xa1\ +\x9b\x00\x00\x00\x02\x00\xae\x00\x00\x03\xf8\x05\xb6\x00\x03\x00\ +\x07\x00\x1f@\x0d\x04\x03\x05\x02\x03\x02\x08\x09\x04\x03\x07\ +\x00\x03\x00?2/3\x11\x12\x0199\x113\x113\ +10\x13!\x11!7!\x11!\xae\x03J\xfc\xb6i\ +\x02x\xfd\x88\x05\xb6\xfaJh\x04\xe6\x00\x02\x00R\xff\ +\xe7\x02\x02\x05\xb6\x00\x03\x00\x0f\x00)@\x13\x03\x0a\x0a\ +\x02\x04\x04\x10\x01\x01\x0d\x02\x0d\x07ZY\x0d\x13\x02\x03\ +\x00??+\x11\x12\x009\x18/\x11\x013\x1133\ +\x11310\x01!\x03!\x014632\x16\x15\x14\ +\x06#\x22&\x01\xcf\xfe\xb63\x01\xb0\xfeTlgf\ +imbcp\x02\x04\x03\xb2\xfa\xf0[ee[Z\ +ee\x00\x00\x02\x00y\x03\xa6\x03\xb8\x05\xb6\x00\x03\x00\ +\x07\x00\x1b@\x0b\x04\x07\x00\x03\x03\x08\x06\x02\x07\x03\x03\ +\x00?3\xcd2\x11\x013\x113\xcc210\x01\x03\ +!\x03!\x03!\x03\x01\xdd)\xfe\xee)\x03?)\xfe\ +\xee)\x05\xb6\xfd\xf0\x02\x10\xfd\xf0\x02\x10\x00\x00\x02\x00\ +%\x00\x00\x05'\x05\xb6\x00\x1b\x00\x1f\x00\x94@Q\x0b\ +\x0e\x0f\x12\x04\x13\x0a\x08\x1c\x1f\x15\x04\x14\x09\x04\x01\x00\ +\x19\x04\x18\x05\x07\x1d\x1e\x16\x04\x06\x14\x13\x13\x11\x17\x0c\ +\x0c\x0a\x05\x06\x06\x03\x09\x1a\x09\x0a\x1a\x17\x18\x0a\x18 \ +!\x1c\x01\x04\x08\x04\x0c\x0c\x0d\x15\x19\x00\x1f\x04\x10\x10\ +\x11\x0d\x11\x0d\x11\x0a\x18\x17\x14\x13\x03\x09\x06\x05\x0a\x12\ +\x00?333?333\x1299//\x113\ +\x12\x179\x113\x12\x179\x11\x12\x0199\x1133\ +\x113\x11\x1299\x113\x113\x11\x1299\x113\ +\x11\x179\x11\x12\x179\x11\x12\x179\x11\x12\x1791\ +0\x01\x073\x15!\x03!\x13#\x03!\x13#5!\ +7#\x11!\x13!\x033\x13!\x033\x11\x0537\ +#\x04\x12\x1e\xf3\xfe\xdeJ\xfe\xf4I\xa8G\xfe\xf5H\ +\xe1\x01\x12\x1f\xee\x01\x1fH\x01\x0cJ\xa6H\x01\x0cI\ +\xe5\xfd\x1b\xa5\x1f\xa6\x03-\xa8\xfe\xfey\x01\x87\xfey\ +\x01\x87\xfe\xa8\x01\x04\x01\x85\xfe{\x01\x85\xfe{\xfe\xfc\ +\xa8\xa8\x00\x00\x02\x00P\xff\x89\x04h\x06\x12\x00+\x00\ +,\x00{@D\x17**\x14++\x11\x19\x09&&\ +.\x1f\x02\x11\x11-%\x0a\x10 \x00 \x10 \ +\x03\x0f\x0a\x1f\x0a/\x0a\x03\x09\x05\x1a \x03\x0a\x04\x06\ +\x1c\x17\x1cWY\x16\x17@\x14\x17\x00\x06WY+\x00\ +)\x00\x17\x00\x17\x00.,\x06\x00?\x1299//\ +\x113\x10\xcd+\x11\x003\x1a\x18\x10\xcd+\x11\x12\x00\ +\x179_^]]\x113\x113\x11\x013\x1133\ +\x113\x1133\x129\x1133\x11310%&\ +'\x11\x16\x0432654&&'.\x0254\ +6753\x15\x16\x17\x03&#\x22\x06\x15\x14\x16\x16\ +\x17\x16\x16\x15\x14\x06\x07\x15#\x13\x01\xf8\xdb\xcbt\x01\ +\x10gUO9\x85q\x7f\x9cG\xd4\xd4\xcf\xc7\xcaw\ +\xd1\xa8PA/tg\xd1\xb6\xd5\xcc\xcfmD\x0aX\ +\x01L;O)0!.:)/u\x91l\xa5\xba\ +\x16\x89\x87\x0bW\xfe\xe3^'&!+5#J\xbd\ +\x95\xa8\xd2\x19\xc1\x06-\x00\x05\x00%\xff\xf0\x07o\x05\ +\xcb\x00\x0b\x00\x17\x00\x1b\x00'\x003\x00J@$\x1b\ +\x18\x18(.\x1c\x22\x22((5\x19\x1a\x1a\x12\x0c\x06\ +\x00\x00\x12\x124%1\x1f+\x13\x1b\x03\x1a\x12\x03\x0f\ +\x09\x15\x04\x00?3\xcc2???3\xcc2\x11\x01\ +3\x113\x10\xca2\x119\x113\x113\x113\x10\xca\ +2\x119\x11310\x01\x14\x1632654&\ +#\x22\x06\x05\x14\x06#\x22&54632\x16%\ +\x01!\x01\x13\x14\x1632654&#\x22\x06\x05\ +\x14\x06#\x22&54632\x16\x01R&&&\ +%%&'%\x01\xc5\xc6\xb7\xac\xc9\xc4\xb1\xaf\xce\x02\ +\xd9\xfc\xd5\xfe\xd7\x03+\xe3&&+!!+'%\ +\x01\xc5\xc7\xb6\xac\xc9\xc4\xb1\xaf\xce\x03\xfesfdu\ +sfhm\xdc\xf1\xf9\xd4\xdc\xed\xf6\xe1\xfaJ\x05\xb6\ +\xfc\x02sfudduhm\xdb\xf1\xf9\xd3\xdc\xed\ +\xf6\x00\x03\x00H\xff\xec\x06o\x05\xc9\x00\x1f\x00(\x00\ +3\x00e@6\x17\x1e/5/\x01&\x0b\x03\x0e\x00\ +)\x14\x1a\x1b\x1b\x14\x0e\x03\x09\x00\x1f\x1f5 \x09\x09\ +4\x1a\x1a\x00\x11\x17\x0b''1\x01\x1e&\x181\x05\ +\x05,S\x11\x04#O\x05\x13\x00\x12\x00??\xed?\ +\xed\x12\x179\x113\x1299\x11\x129/\x11\x013\ +\x113\x113\x113\x12\x179\x113\x113\x11\x12\x17\ +92\x11\x129910!'\x0e\x02#\x22&&\ +5\x10%&&54632\x16\x15\x14\x06\x07\x17\ +67!\x06\x02\x07\x01\x01\x14\x163267'\x06\ +\x014&#\x22\x06\x15\x14\x1766\x04ucZs\ +\x8f\x5c\x9e\xf3\x81\x01\x10>E\xf7\xd8\xd3\xeb\x7f\x89\xc7\ +K\x1d\x01\x96\x1e\x81Q\x01@\xfblZJ9V\x17\ +\xf8R\x01'9+*?X9IJ=>II>\x02\xd9\xfe|\xfe\x97\x01\ +y\x01t\x01\x86\x01l\xfe\x85\xfe\x89\xf8\xba\xc0\xf2\xf3\ +\xc3\xbc\x00\x00\x01\x00T\x00\x00\x03\xae\x05\xb6\x00\x0a\x00\ +*@\x13\x09\x04\x00\x00\x08\x01\x01\x0b\x0c\x08\x07\x07\x01\ +\x04\x04\x09\x06\x01\x18\x00??3\x11\x129\x113\x11\ +\x12\x019\x1133\x129910!!\x1147\ +\x06\x07\x07'\x01!\x03\xae\xfeo\x06%7\xa6\xcd\x01\ +\xf6\x01d\x03\x06\x8du-1\x89\xfc\x01\x99\x00\x01\x00\ +-\x00\x00\x04b\x05\xcb\x00\x1d\x00=@\x1e\x1c\x0e\x01\ +\x07\x00\x16\x01\x16\x1e\x1f\x16\x07\x07\x02\x0a\x12\x0aUY\ +\x12\x07\x02\x01\x1c\x01\x1cUY\x01\x18\x00?+\x11\x12\ +\x009\x18?+\x11\x12\x009\x113\x11\x12\x0199\ +\x1133\x113310!!\x11\x01>\x0254\ +&#\x22\x06\x07'>\x0232\x16\x16\x15\x14\x0e\x02\ +\x07\x15!\x04b\xfb\xdb\x01e\x99^%JCE\x8d\ +Y\xd9q\x9a\xb5q\x8e\xdf{+Z\x95\xf3\x02)\x01\ +\x04\x01i\xa0uT.9BOM\xfeeW.d\ +\xb9sV\x92\x8d\x9c\xda\x0a\x00\x00\x01\x00F\xff\xec\x04\ +\x5c\x05\xcb\x00'\x00N@'\x18\x22\x13\x0c\x13\x06\x03\ +\x1c\x1c\x00\x00\x06\x0c\x06()\x03\x19\x18\x19\x18VY\ +\x19\x19\x09%%\x1fTY%\x07\x09\x10TY\x09\x19\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x009\x11\x12\x0199\x113\x113\x129\x113\x11\ +\x129910\x01\x14\x06\x07\x15\x04\x11\x14\x04!\x22\ +&'\x11\x16\x1632654&&##\x113\ + 54&#\x22\x07\x036632\x04\x041\xa6\ +\x9d\x01n\xfe\xbd\xfe\xe1v\xc9u`\xc7T\x82w>\ +\x8aoZ\x5c\x01-YK\x8c\x96\xa4t\xf3\x9d\xe3\x01\ +\x02\x04y\x88\xc3,\x06.\xfe\xd4\xcc\xea\x22-\x01H\ +1/INK\x811_;/\ +_\x02\xe8;/VB)D+0:\x00\x00\x02\x00\ +5\xff\xec\x04m\x05\xc5\x00\x18\x00$\x00D@\x22\x1c\ +\x05\x13\x0b\x22\x22\x00\x13\x00%&\x0b\x10\x1f\x1f\x10V\ +Y\x1f\x1f\x03\x16\x16\x19TY\x16\x07\x03\x08VY\x03\ +\x19\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x009\x11\x12\x0199\x113\x113\x11331\ +0\x01\x10\x00!\x22'\x11\x163267#\x0e\x02\ +#\x22&54\x003 \x00%\x22\x06\x15\x14\x163\ +2654&\x04m\xfe\x8e\xfei\x86FVV\xd4\ +\xe6\x0a\x0c'LnR\xbe\xd6\x01\x15\xf1\x01\x0c\x01&\ +\xfd\xd9AQFHA`Y\x03\x19\xfeS\xfe\x80\x0a\ +\x019\x10\xaf\xbdH@\x22\xfe\xdf\xf3\x01\x14\xfe\x9c(\ +^hRa^BY\x80\x00\x00\x02\x00V\xff\xe7\x01\ +\xf8\x04{\x00\x0b\x00\x17\x00(@\x14\x12\x06\x06\x0c\x00\ +\x00\x18\x19\x0f\x15ZY\x0f\x10\x09\x03ZY\x09\x13\x00\ +?+\x00\x18?+\x11\x12\x019\x1133\x1131\ +074632\x16\x15\x14\x06#\x22&\x1146\ +32\x16\x15\x14\x06#\x22&Vmhcjm`\ +crngcjlafo\xa6\x5cdd\x5cZ\ +ed\x03q[dd[Zff\x00\x02\x009\xfe\ +\xe3\x02\x00\x04{\x00\x07\x00\x13\x00\x22@\x10\x01\x04\x0e\ +\x08\x04\x08\x14\x15\x0b\x11ZY\x0b\x10\x04\x07\x00/\xce\ +?+\x11\x12\x0199\x113\x11310\x01\x17\x02\ +\x07!6\x127\x034632\x16\x15\x14\x06#\x22\ +&\x01\xf2\x0eaO\xfe\xe9\x1d;\x0b@khdk\ +lcfm\x01+\x17\xfe\x83\xb4\x8a\x01Wg\x02\x91\ +[deZZfe\x00\x01\x00H\x00\xb2\x04;\x05\ +\x19\x00\x06\x00'@\x10\x05\x01\x04\x00\x01\x00\x07\x08\x04\ +\x03\x03\x06\x00\x02\x01\x05\x00=/33323\x11\ +3\x11\x12\x0199\x113\x11310%\x015\x01\ +\x11\x01\x05\x04;\xfc\x0d\x03\xf3\xfd\x94\x02l\xb2\x01\xc1\ +\xac\x01\xfa\xfe\xd7\xfe\xe5\xfc\x00\x00\x02\x00H\x01f\x04\ +?\x04;\x00\x03\x00\x07\x00\x1e@\x0c\x04\x00\x07\x03\x00\ +\x03\x08\x09\x00\x01\x04\x05\x00/3\xc62\x11\x12\x019\ +9\x113\x11310\x13\x11!\x11\x01\x11!\x11H\ +\x03\xf7\xfc\x09\x03\xf7\x03/\x01\x0c\xfe\xf4\xfe7\x01\x0f\ +\xfe\xf1\x00\x00\x01\x00H\x00\xb2\x04;\x05\x19\x00\x06\x00\ ++@\x12\x02\x00\x01\x05\x00\x05\x07\x08\x00\x06\x06\x01\x02\ +\x03\x03\x05\x04\x01\x00=/333\x113\x113\x11\ +3\x11\x12\x0199\x113\x11310\x13%\x01\x11\ +\x01\x15\x01H\x02l\xfd\x94\x03\xf3\xfc\x0d\x01\xd9\xfc\x01\ +\x1b\x01)\xfe\x06\xac\xfe?\x00\x00\x02\x00\x00\xff\xe7\x03\ +\xe5\x05\xcb\x00\x19\x00%\x00B@ \x1a\x1a\x19\x00\ +\x00\x0d\x07\x07\x12\x12'\x0d&\x07\x0f\x00\x00#\x0f#\ +\x1dZY#\x13\x0f\x0aYY\x0f\x04\x00?+\x00\x18\ +?+\x11\x12\x009\x18/\x129\x11\x013\x129\x11\ +3\x11\x129\x1133\x11310\x015467\ +6654&#\x22\x07\x036!2\x16\x15\x14\x06\ +\x07\x06\x06\x15\x15\x014632\x16\x15\x14\x06#\x22\ +&\x01'PfQGL=\x97\xca\x8b\xf9\x01\x0f\xdf\ +\xfeq|i5\xfe\xa2khdko`cp\x02\ +\x04Vb\x87@3R5*1k\x01\x10\x8e\xc4\xa9\ +y\xb1OD?+3\xfe\xa2\x5cde[[dc\ +\x00\x00\x02\x00R\xfff\x06\xdb\x05\xc9\x005\x00A\x00\ +a@.\x08\x17\x17;;66\x0d)=\x1b=\x14\ +\x0d\x14\x22\x1b\x22.\x1b\x00.\x00BC\x08\x0a\x189\ +9(%\x04\x0a?\x11\x0a\x11\x0a\x11+\x1e2\x04%\ ++\x00/3?3\x1299//\x113\x113\x12\ +93\x113\x129\x11\x12\x0199\x113\x113\x11\ +\x1299\x113\x11\x129\x113\x119\x113\x129\ +10\x01\x14\x06\x06#\x22&'#\x06#\x22&5\ +46632\x16\x17\x03\x07\x1432654\x00\ +#\x22\x04\x02\x15\x14\x00!2$7\x15\x06! \x00\ +\x114\x12$32\x04\x12\x01\x14\x1632677\ +&#\x22\x06\x06\xdba\xacnO\x80$\x0fk\x99\xb7\ +\xc4|\xea\x9aQ\xc3Q\x15\x0214A\xfe\xf2\xf8\xbe\ +\xfe\xe7\x94\x01\x1d\x01\x04t\x01\x0d\x81\xe0\xfe\xec\xfe|\ +\xfeE\xe5\x01\x93\xff\xea\x01g\xc1\xfc\x1dI@ \x11\x0b\x05\x02\x04\x03\x03\ +\x16\x00\x00\x02\x09\x0b\x04\x1b\x1c\x02\x08\x0e\x0e\x19NY\ +\x0e\x04\x08\x13NY\x04\x08\x13\x00?\xc4+\x00\x18?\ ++\x11\x12\x009\x11\x12\x01\x179\x1133\x113\x11\ +3\x11310\x01\x10\x05\x01!\x01'5' \x00\ +\x11\x10\x00! \x00\x01\x10!2654&# \ +\x05\xf6\xfe\xc4\x01e\xfe\x14\xfe\xfe\x01\x01\xfe\xa8\xfe\x91\ +\x01m\x01\x5c\x01]\x01h\xfc\x12\x01'\x96\x91\x93\x92\ +\xfe\xd7\x02\xdd\xfe\x0f\xad\xfee\x01E\x01\x01\x01\x01\x82\ +\x01q\x01m\x01\x81\xfe\x82\xfe\x8e\xfeX\xce\xda\xdb\xd1\ +\x00\x00\x02\x00\x9e\x00\x00\x05\x83\x05\xb6\x00\x0b\x00\x12\x00\ +K@%\x08\x0f\x0f\x06\x06\x01\x0a\x09\x09\x14\x0c\x01\x01\ +\x02\x02\x13\x14\x08\x03\x00\x00\x0cQY\x00\x00\x02\x03\x03\ +\x12PY\x03\x03\x0a\x02\x12\x00?3?+\x11\x12\x00\ +9\x18/+\x11\x12\x009\x11\x12\x019\x113\x113\ +\x113\x113\x129\x113\x12910\x01\x11!\x11\ +! \x11\x14\x07\x01!\x01\x033254##\x02\ +)\xfeu\x01\xdf\x02T\xf8\x01\xaa\xfe@\xfe\xcadJ\ +\xcf\xcbN\x02\x14\xfd\xec\x05\xb6\xfeP\xfe\x8b\xfd\x83\x02\ +\x14\x01)\xb7\x97\x00\x01\x00Z\xff\xec\x04Z\x05\xcb\x00\ +&\x004@\x1b!\x16\x0e\x00\x00\x1b\x16\x07\x04'(\ +\x0e!\x04\x19\x19\x1eOY\x19\x04\x04\x0bNY\x04\x13\ +\x00?+\x00\x18?+\x11\x12\x0099\x11\x12\x01\x17\ +9\x113\x11310\x01\x14\x06\x04#\x22&'\x11\ +\x16\x1632654&&'.\x0254$!\ +2\x17\x03&#\x22\x06\x15\x14\x16\x17\x16\x16\x04Z\x8a\ +\xfe\xfc\xaf\x92\xc6kq\xf4fXR!I\x9e\x8f\x8f\ +E\x01&\x01\x01\xe3\xecy\xcd\x95MFY\xc5\xbd\x93\ +\x01\xbc\x88\xd3u)3\x01`:A=0\x1e-.\ +GAz\x9el\xca\xe2i\xfe\xcf^6(+DZ\ +U\xc3\x00\x00\x01\x003\x00\x00\x04\x87\x05\xb6\x00\x07\x00\ +$@\x12\x00\x01\x06\x01\x03\x03\x08\x09\x07\x03\x04\x03N\ +Y\x04\x03\x01\x12\x00??+\x11\x003\x11\x12\x01\x17\ +9\x11310!!\x11!\x11!\x11!\x03#\xfe\ +u\xfe\x9b\x04T\xfe\x9c\x04s\x01C\xfe\xbd\x00\x01\x00\ +\x96\xff\xec\x05y\x05\xb6\x00\x11\x00%@\x11\x10\x01\x0a\ +\x07\x01\x07\x13\x12\x11\x08\x03\x04\x0dNY\x04\x13\x00?\ ++\x00\x18?3\x11\x12\x0199\x113\x11310\ +\x01\x11\x10\x00! \x00\x11\x11!\x11\x14\x16326\ +5\x11\x05y\xfe\xbb\xfe\xce\xfe\xd5\xfe\xbf\x01\x8dtq\ +ym\x05\xb6\xfc\x90\xfe\xe1\xfe\xc5\x012\x01\x1f\x03y\ +\xfc\xa6\x9b\x8c\x8b\x9e\x03X\x00\x00\x01\x00\x00\x00\x00\x05\ +\x8d\x05\xb6\x00\x0b\x009@\x0f\x03\x02\x08\x08\x05\x00\x00\ +\x01\x01\x0d\x05\x04\x04\x0c\x08\xb8\xff\xc0@\x0b\x09\x0b\x02\ +L\x08\x03\x00\x04\x03\x03\x12\x00??3\x129+\x11\ +\x013\x113\x113\x113\x11\x129\x113310\ +\x01!\x01!\x01!\x13\x16\x17667\x03\xd3\x01\xba\ +\xfe!\xfe/\xfe#\x01\xbc\xc7>\x06\x07*\x10\x05\xb6\ +\xfaJ\x05\xb6\xfd\x1b\xf7aF\xd2<\x00\x01\x00\x1f\x00\ +\x00\x081\x05\xb6\x00\x1c\x00Z@\x1a\x0a\x09\x0f\x14\x13\ +\x05\x01\x00\x18\x18\x05\x0f\x03\x0c\x1b\x1b\x1c\x1c\x1e\x0c\x0b\ +\x0b\x1d\x18\x0f\x0f\xb8\xff\xc0@\x14\x09\x0b\x02L\x05@\ +\x09\x0b\x02L\x0f\x05\x0a\x1b\x13\x0b\x03\x01\x0a\x12\x00?\ +3?33\x1299++\x113\x11\x013\x113\ +\x113\x113\x11\x12\x179\x1133\x1133\x113\ +310!!\x03&&'\x0e\x02\x03!\x01!\x13\ +\x16\x176\x127\x13!\x13\x16\x12\x176\x13\x13!\x06\ +\xc9\xfe-\x8c\x0a+\x0a\x08$#\x80\xfe-\xfe\x96\x01\ +}\x9f6\x14\x0dC\x1d\x81\x01n} B\x0b\x0d:\ +\xa2\x01}\x02}(\xeePA\xc1\xa2\xfd\xc1\x05\xb6\xfd\ +#\xf3\x90f\x01^s\x02)\xfd\xd7\x85\xfe\xa4Vo\ +\x01\x12\x02\xdf\x00\x00\x01\x00\x04\x00\x00\x05\xc3\x05\xb6\x00\ +\x0b\x00H@\x11\x09\x0a\x07\x06\x06\x05\x0b\x0a\x04\x01\x00\ +\x00\x0d\x03\x04\x0c\x08\xb8\xff\xe0@\x16\x09\x0b\x02L\x02\ + \x09\x0b\x02L\x08\x05\x0b\x02\x04\x04\x09\x06\x03\x01\x04\ +\x12\x00?3?3\x12\x179++\x11\x0132\x11\ +3\x113\x179\x113\x11310!!\x01\x01!\ +\x01\x01!\x01\x13!\x01\x05\xc3\xfe7\xfe\xe3\xfe\xe6\xfe\ +A\x01\xe5\xfe8\x01\xb6\x01\x08\xfe\x01\xc3\xfe1\x01\xc9\ +\xfe7\x02\xec\x02\xca\xfe<\x01\xc4\xfd\x17\x00\x00\x01\x00\ +\x00\x00\x00\x05P\x05\xb6\x00\x08\x005@\x0d\x04\x05\x05\ +\x07\x01\x02\x02\x0a\x08\x07\x07\x09\x00\xb8\xff\xc0@\x0b\x09\ +\x0b\x02L\x00\x05\x01\x07\x03\x05\x12\x00??3\x129\ ++\x11\x013\x113\x113\x113\x129\x11310\ +\x01\x13!\x01\x11!\x11\x01!\x02\xa8\xfc\x01\xac\xfe\x1f\ +\xfer\xfe\x1f\x01\xae\x03\x98\x02\x1e\xfc\x85\xfd\xc5\x02/\ +\x03\x87\x00\x00\x01\x00=\x00\x00\x04\xb0\x05\xb6\x00\x09\x00\ +;@\x1d\x08\x04\x01\x03\x07\x07\x00\x01\x00\x0a\x0b\x07\x04\ +\x05\x05\x04OY\x05\x03\x02\x01\x08\x01\x08OY\x01\x12\ +\x00?+\x11\x12\x009\x18?+\x11\x12\x009\x11\x12\ +\x0199\x113\x113\x113310!!5\x01\ +!\x11!\x15\x01!\x04\xb0\xfb\x8d\x02y\xfd\x96\x04T\ +\xfd\x87\x02\x89\xf4\x03\x83\x01?\xf3\xfc|\x00\x00\x02\x00\ +u\xfe\xa8\x02h\x05\xdf\x00\x07\x00\x08\x00\x22@\x0f\x06\ +\x01\x01\x09\x04\x00\x00\x0a\x05\x02\x08\x04\x06\x01%\x00?\ +3?\xc52\x11\x013\x113\x129\x11310\x01\ +!\x11!\x15#\x113\x01\x02h\xfe\x0d\x01\xf3\xb6\xb6\ +\xfe\xfb\xfe\xa8\x077\xfe\xfa\xc5\x06'\x00\x01\x00\x06\xff\ +\xec\x03\x81\x05\xcb\x00\x03\x00\x1c@\x0c\x02\x01\x01\x05\x00\ +\x03\x03\x04\x03\x04\x02\x13\x00??\x11\x013\x113\x11\ +3\x11310\x01\x01!\x01\x01`\x02!\xfe\xa6\xfd\ +\xdf\x05\xcb\xfa!\x05\xdf\x00\x02\x00/\xfe\xa8\x02#\x05\ +\xdf\x00\x07\x00\x08\x00\x22@\x0f\x01\x06\x06\x0a\x03\x07\x07\ +\x09\x03\x04\x08\x04\x00\x07%\x00?3?\xc52\x11\x01\ +3\x113\x129\x11310\x173\x11#5!\x11\ +!\x01/\xb6\xb6\x01\xf4\xfe\x0c\x01\x0eZ\x05;\xfe\xf8\ +\xc9\x07%\x00\x01\xff\xf0\x01\xf6\x04N\x05\xbc\x00\x07\x00\ +,@\x13\x02\x01\x05\x05\x07\x04\x04\x03\x03\x09\x07\x00\x00\ +\x00\x04\x04\x08\x05\x02\x00/3\x129/3\x012\x11\ +3\x113\x113\x11\x129\x113310\x03\x013\ +\x01!\x01\x03\x03\x10\x01\xb8\xaa\x01\xfc\xfe\xd9\xfe\xdf|\ +|\x01\xf6\x03\xc6\xfc:\x02A\xfe\xdd\xfe\xe2\x00\x01\xff\ +\xfc\xfe\x85\x04\x04\xff{\x00\x03\x00\x11\xb5\x00\x05\x01\x04\ +\x01\x02\x00/3\x11\x013\x11310\x01!5!\ +\x04\x04\xfb\xf8\x04\x08\xfe\x85\xf6\x00\x01\x01\x08\x04\xd9\x03\ +\xbc\x06!\x00\x09\x00\x18@\x0a\x03\x08\x08\x0a\x0b\x0f\x04\ +\x01\x04\x00\x00/\xcd]\x11\x12\x019\x10\xc110\x01\ +&$'5!\x16\x17\x17\x15\x02\xb8E\xfe\xf3^\x01\ +\xae4\x97;\x04\xd9,\xbdJ\x15F\xa3B\x1d\x00\x00\ +\x02\x00J\xff\xec\x04y\x04\x81\x00\x18\x00!\x00M@\ +( \x12\x0c\x08\x0c\x01\x1c\x1c\x18\x08\x18\x22#\x11\x0c\ +\x0f\x14\x0fIY\x0c\x1dMY\x0c\x0c\x00\x14\x10\x02\x19\ +\x05\x05\x19IY\x05\x16\x00\x15\x00??+\x11\x12\x00\ +9\x18?\x129/++\x11\x12\x009\x11\x12\x019\ +9\x113\x1133\x11\x129310!'#\x06\ +\x06#\x22&5467754#\x22\x07\x036\ +!2\x16\x15\x11\x012655\x07\x06\x15\x14\x03j\ +K\x08O\xa4\x82\xa0\xb8\xfc\xef\xbd\x8a|\xbfq\xc6\x01\ +.\xda\xef\xfd\xcfGeZ\xc1\x96bH\xc0\xae\xb5\xb1\ +\x0b\x06\x10\x8cT\x01\x02f\xd8\xc2\xfd\x19\x01\x00ZH\ +X\x04\x07\x87h\x00\x02\x00\x87\xff\xec\x04\xcd\x06\x14\x00\ +\x15\x00!\x00>@\x1f\x19\x0a\x10\x10\x0d \x03\x0d\x03\ +\x22#\x0e\x00\x0d\x15\x12\x0b\x00\x06\x06\x1dGY\x06\x16\ +\x00\x16GY\x00\x10\x00?+\x00\x18?+\x11\x12\x00\ +99\x18??\x11\x12\x0199\x113\x113\x113\ +310\x012\x12\x11\x10\x02#\x22&&'#\x07\ +!\x11!\x11\x14\x07366\x03\x22\x06\x15\x15\x14\x16\ +3265\x10\x03;\xb9\xd9\xdb\xc3?bM3\x18\ +>\xfe\xcf\x01\x87\x0e\x0e9\x950RLLVEJ\ +\x04\x81\xfe\xca\xfe\xee\xfe\xec\xfe\xc7\x1b08o\x06\x14\ +\xfe\xa0?\x9aXN\xfe\xcdrz7\x8by\x8d\x89\x01\ +\x11\x00\x01\x00V\xff\xec\x04\x1d\x04\x81\x00\x15\x00*@\ +\x15\x14\x08\x0f\x0f\x03\x03\x08\x16\x17\x06\x0cGY\x06\x10\ +\x00\x11GY\x00\x16\x00?+\x00\x18?+\x11\x12\x01\ +99\x113\x11\x12910\x05 \x00\x11\x10\x00!\ +2\x17\x03&&#\x22\x06\x15\x10327\x11\x06\x02\ +\x8b\xfe\xea\xfe\xe1\x016\x01\x1e\xc5\xaesGxA_\ +h\xc9\xac\x9e\x97\x14\x01,\x01\x19\x01\x1a\x016V\xfe\ +\xdf\x1f%\x94\x87\xfe\xf0d\xfe\xc9d\x00\x02\x00V\xff\ +\xec\x04\x9e\x06\x14\x00\x14\x00!\x00@@ \x1f\x04\x19\ +\x10\x13\x0d\x0d\x10\x04\x10\x22#\x11\x15\x0e\x00\x0b\x12\x07\ +\x00\x07\x1cGY\x07\x10\x00\x15GY\x00\x16\x00?+\ +\x00\x18?+\x11\x12\x0099\x18??\x11\x12\x019\ +9\x113\x113\x129\x11310\x05\x22&\x025\ +\x10\x1232\x16\x173&5\x11!\x11!'#\x06\ +\x0326754&#\x22\x06\x15\x14\x16\x01\xe7y\ +\xb5c\xde\xc2_\x8f;\x08\x13\x01\x8a\xfe\xd9T\x0fe\ +(^M\x03V\x5cMUV\x14\x8a\x01\x0c\xb3\x01\x14\ +\x018LZ\x85\x85\x01/\xf9\xec\x8f\xa3\x015v{\ +\x1f\x96\x7f\x91\x86\x84\x8a\x00\x02\x00V\xff\xec\x04\x9c\x04\ +\x81\x00\x14\x00\x1b\x00P@)\x18\x19\x12\x0b\x0a\x0b\x03\ +\x19\x0a\x03\x0a\x1c\x1d\x11\x0b\x0e\x18\x0bLY\x0d\x18\x01\ +\x0d\x04\x18\x18\x06\x00\x06\x15JY\x06\x10\x00\x0eIY\ +\x00\x16\x00?+\x00\x18?+\x11\x12\x009\x18/_\ +^]+\x11\x12\x009\x11\x12\x0199\x113\x113\ +\x11\x129\x11910\x05 \x00\x11\x10\x00! \x00\ +\x15\x15!\x16\x163267\x11\x06\x06\x03\x22\x06\x07\ +!&&\x02\xaa\xfe\xe5\xfe\xc7\x01\x22\x01\x0d\x01\x00\x01\ +\x17\xfdE\x04\x83qg\xade\x5c\xc4\x9fE]\x08\x01\ +P\x02Y\x14\x01-\x01\x16\x01\x1f\x013\xfe\xf5\xfb\xae\ +_l'/\xfe\xe7/$\x03\x8bW]Rb\x00\x00\ +\x01\x00-\x00\x00\x03\x81\x06\x1f\x00\x16\x00B@!\x0e\ +\x00\x00\x18\x15\x02\x02\x07\x05\x03\x03\x17\x18\x0f\x15\x11\x05\ +\x01\x15\x01FY\x07\x15\x0f\x0b\x11FY\x0b\x01\x03\x15\ +\x00??+\x00\x18?3+\x11\x003\x11\x129\x11\ +\x12\x019\x11333\x113\x129\x11310\x01\ +#\x11!\x11#5754632\x16\x17\x07&\ +#\x22\x06\x15\x153\x03;\xf1\xfey\x96\x9e\xb7\xcaN\ +\x8b\x5cTHE-)\xf1\x03H\xfc\xb8\x03H\xc0`\ +\x13\xe0\xc4\x18\x1e\xfd\x147>\x1e\x00\x00\x03\x00\x14\xfe\ +\x14\x04\xb4\x04\x81\x00(\x005\x00>\x00\x83@E/\ +\x11\x11\x04\x19)\x0b\x1c\x1c\x1f\x17\x1f(\x02\x03\x22;\ +\x01\x04\x046@6\x22)\x17\x17\x22\x22?@\x02(\ +\x0f\x193\x0e\x0e3GY\x078MY\x04\x1f\x09\x03\ +\x07%\x0e\x0e\x07\x07\x14%%=MY%\x10\x14,\ +LY\x14\x1c\x00?+\x00\x18?+\x11\x12\x009\x18\ +/9/\x11\x12\x179++\x11\x12\x009\x18?3\ +\x11\x12\x019\x113\x113\x113\x11\x129\x1133\ +\x12\x179\x11\x129\x113\x129\x113\x11310\ +\x01\x15\x07\x16\x15\x14\x04#\x22'\x06\x15\x14\x1633\ + \x11\x14\x04!\x22$547&&5467\ +&&54632\x16\x17\x01\x14\x163265\ +4&##\x22\x06\x13\x1432654#\x22\x04\ +\xb4\x9b \xfe\xff\xff?%\x0e^L\xbc\x01}\xfe\x9f\ +\xfe\xc1\xf1\xfe\xfb\xfc4M:\x5cXe\xfc\xea\x1f\x98\ +$\xfe5hW\x8e\xabha\x99?W{y8=\ +uy\x04m\xbd9:M\xb7\xca\x08\x1a\x17\x1d\x1f\xfe\ +\xbf\xcf\xe6\xa1\x97\xcb;\x16b05Q8'\xa6w\ +\xb9\xcc\x0e\x06\xfb\x060;G8-%;\x03\x5c\xae\ +VV\xb0\x00\x01\x00\x87\x00\x00\x04\xd9\x06\x14\x00\x15\x00\ +3@\x19\x00\x15\x0d\x0b\x07\x07\x08\x15\x08\x17\x16\x0d\x08\ +\x11\x11\x03GY\x11\x10\x09\x00\x00\x08\x15\x00?3?\ +?+\x11\x12\x009\x11\x12\x0199\x113\x1133\ +\x11310!\x114#\x22\x06\x15\x11!\x11!\x15\ +\x14\x0736632\x16\x15\x11\x03P\x87`[\xfe\ +y\x01\x87\x10\x128\x9af\xbe\xd3\x02j\xe4\xa1\xbb\xfe\ +\x0e\x06\x14\xdd\x96\xc0XH\xdb\xc5\xfd\x1f\x00\x00\x02\x00\ +\x7f\x00\x00\x02\x1f\x065\x00\x03\x00\x0d\x00$@\x12\x0a\ +\x00\x00\x04\x01\x01\x0e\x0f\x07\x0cHY\x07\x01\x02\x0f\x01\ +\x15\x00???+\x11\x12\x019\x1133\x1131\ +0!!\x11!\x014632\x16\x15\x14#\x22\x02\ +\x10\xfey\x01\x87\xfeobmmd\xd1\xcf\x04m\x01\ +\x1aXVXV\xac\x00\x00\x02\xff\x98\xfe\x14\x02\x1d\x06\ +5\x00\x0d\x00\x17\x00-@\x17\x14\x0b\x0b\x0e\x03\x08\x08\ +\x18\x19\x11\x16HY\x11\x01\x09\x0f\x00\x06GY\x00\x1c\ +\x00?+\x00\x18??+\x11\x12\x019\x11333\ +\x11310\x13\x22&'\x11\x16325\x11!\x11\ +\x14\x06\x034632\x16\x15\x14#\x22j0}%\ +@8w\x01\x87\xdb\xb6bmmd\xd1\xcf\xfe\x14\x0f\ +\x0a\x011\x12\xaa\x04w\xfb7\xbb\xd5\x07sXVX\ +V\xac\x00\x00\x01\x00\x87\x00\x00\x05F\x06\x14\x00\x10\x00\ +9@\x1b\x0e\x05\x0a\x0a\x0b\x0b\x11\x12\x03\x04\x04\x07\x06\ +\x06\x12\x0c\x00\x08\x05\x10\x10\x03\x07\x0b\x15\x03\x0f\x00?\ +?3\x129\x1133?\x11\x013\x1133\x113\ +\x11\x129\x113\x113310\x0167\x13!\x01\ +\x01!\x03\x07\x11!\x11!\x11\x14\x07\x02\x02G2\xfe\ +\x01\xb4\xfew\x01\xa2\xfeA\xf8\x7f\xfew\x01\x89\x16\x02\ +}q?\x01@\xfe\x1e\xfdu\x01\x96a\xfe\xcb\x06\x14\ +\xfd\x9c\x9d\x96\x00\x00\x01\x00\x87\x00\x00\x02\x0e\x06\x14\x00\ +\x03\x00\x16@\x09\x00\x01\x01\x04\x05\x02\x00\x01\x15\x00?\ +?\x11\x12\x019\x11310!!\x11!\x02\x0e\xfe\ +y\x01\x87\x06\x14\x00\x01\x00\x87\x00\x00\x07}\x04\x81\x00\ +#\x00I@$\x16\x11\x11\x1c\x08\x08\x09\x09\x12\x00\x00\ +#\x12#$%\x1b\x15\x15\x12\x19\x04\x0d\x19\x0dGY\ +\x1f\x19\x10\x13\x0f\x09\x00\x12\x15\x00?33??3\ ++\x11\x003\x11\x129\x113\x11\x12\x0199\x113\ +\x11\x129\x113\x1132\x11310!\x114&\ +#\x22\x06\x15\x11!\x114&#\x22\x06\x15\x11!\x11\ +!\x1736632\x1736632\x16\x15\x11\ +\x05\xf6?DZT\xfex\x01\x0f\x01\x15\x013\x8e\xfe\xf7\xb1\x92\x99\ +\x99\x92\x91\x94\x93\x00\x02\x00\x87\xfe\x14\x04\xcd\x04\x81\x00\ +\x13\x00 \x00=@\x1f\x18\x0c\x07\x07\x08\x1e\x11\x08\x11\ +!\x22\x04\x0c\x00\x0e\x0e\x14GY\x0e\x10\x09\x0f\x08\x1c\ +\x00\x1bGY\x00\x16\x00?+\x00\x18???+\x11\ +\x12\x0099\x11\x12\x0199\x113\x113\x1133\ +10\x05\x22&'#\x16\x15\x11!\x11!\x1736\ +32\x12\x11\x10\x02\x01\x22\x06\x07\x15\x14\x16326\ +54&\x03/V\x88C\x12\x12\xfey\x01>7\x12\ +m\xc0\xbc\xd6\xdf\xfe\xbeVE\x03NTKDD\x14\ +9Jw\x1d\xfe9\x06Y\x90\xa4\xfe\xc8\xfe\xf0\xfe\xee\ +\xfe\xc5\x03b{y\x1f\x92\x82\x81\x95\x92\x7f\x00\x02\x00\ +V\xfe\x14\x04\x9e\x04\x81\x00\x12\x00\x1e\x00>@\x1f\x1c\ +\x03\x16\x08\x0d\x0d\x0c\x03\x0c\x1f \x0d\x1c\x0a\x0f\x11\x09\ +\x00\x06\x06\x1aGY\x06\x10\x00\x13GY\x00\x16\x00?\ ++\x00\x18?+\x11\x12\x0099\x18??\x11\x12\x01\ +99\x113\x1133\x11310\x05\x22\x02\x11\x10\ +\x1232\x1737!\x11!\x1147#\x06\x032\ +6554&#\x22\x11\x14\x16\x01\xec\xbe\xd8\xdd\xbf\ +\xcdh\x08\x1d\x01R\xfey\x0c\x0c`,YQR^\ +\xa2R\x14\x018\x01\x11\x01\x14\x018\xa0\x8c\xf9\xa7\x01\ +\xd5\x22\x84\xa3\x01/n\x83/\x96\x81\xfe\xdd\x94\x80\x00\ +\x01\x00\x87\x00\x00\x03\xaa\x04\x81\x00\x11\x00%@\x11\x0f\ +\x0a\x0a\x0b\x0b\x03\x12\x13\x0c\x0f\x0b\x15\x0f\x06\x06\x00\x10\ +\x00?2\x129??\x11\x12\x0199\x113\x113\ +10\x012\x17\x17\x03&#\x22\x06\x15\x11!\x11!\ +\x17366\x0333.\x16#0U\x80t\xfey\ +\x01#=\x131\xaf\x04\x81\x08\x04\xfe\x8f\x0cun\xfd\ +\xd3\x04m\xb5Zo\x00\x00\x01\x00w\xff\xec\x03\xf2\x04\ +\x81\x00$\x00@@!\x1e\x06\x12\x18\x0c\x00\x12\x00%\ +&\x11\x1f$\x0d\x0d\x07\x19\x1f\x04\x1c\x0a\x15\x1cJY\ +\x15\x10\x03\x0aIY\x03\x16\x00?+\x00\x18?+\x11\ +\x12\x00\x179\x113\x113\x11\x12\x0199\x1133\ +\x113310\x01\x14\x06#\x22&'\x11\x16\x163\ +254&'&&54632\x16\x17\x07&\ +&#\x22\x15\x14\x16\x17\x1e\x02\x03\xf2\xf8\xe8~\xbaa\ +[\xd9U\x7fG\xab\x9c|\xf4\xdfp\xc5jjN\xae\ +7`C\xa0wu7\x01\x5c\xb6\xba\x1b$\x019(\ +4:\x1e/D@\xa3}\x9e\xb01/\xfc#1/\ +\x1d)?1^\x7f\x00\x00\x01\x005\xff\xec\x03o\x05\ +P\x00\x15\x00=@\x1e\x0d\x09\x10\x14\x14\x0b\x09\x12\x03\ +\x09\x03\x16\x17\x0b\x13\x10\x13FY\x0e@\x0d\x10\x0f\x06\ +\x00GY\x06\x16\x00?+\x00\x18?3\x1a\xc9+\x11\ +\x003\x11\x12\x0199\x113\x1133\x113\x129\ +10\x0127\x11\x06\x06#\x22&5\x11#57\ +7!\x15!\x11!\x11\x14\x02\xb2OnO\x8f`\xc5\ +\xae\x89\xaee\x01\x00\x01\x16\xfe\xea\x01!'\xfe\xe3\x22\ +\x1d\xc1\xc8\x01\xd3\x9f{\xee\xe3\xfe\xdb\xfeGn\x00\x00\ +\x01\x00\x85\xff\xec\x04\xd5\x04m\x00\x14\x000@\x17\x0b\ +\x08\x02\x11\x11\x14\x08\x14\x15\x16\x02\x05\x12\x09\x0f\x05\x0e\ +GY\x05\x16\x00\x15\x00??+\x00\x18?3\x129\ +\x11\x12\x0199\x113\x113\x11310!'#\ +\x06\x06#\x22&5\x11!\x11\x14\x163265\x11\ +!\x11\x03\xae1\x171\xafv\xbb\xd0\x01\x87?He\ +V\x01\x87\x8dNS\xd9\xc6\x02\xe2\xfd\x95or\x9f\xbd\ +\x01\xf0\xfb\x93\x00\x00\x01\x00\x00\x00\x00\x04\xe3\x04m\x00\ +\x0e\x006@\x12\x0e\x00\x08\x08\x02\x0c\x0c\x0d\x0d\x10\x02\ +\x01\x01\x0f\x0c\x01\x0f\x08\xb8\xff\xe0\xb6\x09\x0b\x02L\x08\ +\x00\x15\x00?2+?3\x11\x013\x113\x113\x11\ +3\x11\x129\x113310!\x01!\x13\x1e\x03\x15\ +347\x13!\x01\x01\xb0\xfeP\x01\x98\xc0\x01\x06\x06\ +\x05\x07\x12\xc9\x01\x97\xfeP\x04m\xfdb\x05\x18!%\ +\x104=\x02\xa0\xfb\x93\x00\x01\x00\x19\x00\x00\x07/\x04\ +m\x00\x1c\x00Y@&\x08\x07\x0d\x12\x11\x03\x1c\x00\x16\ +\x16\x03\x0d\x03\x0a\x1a\x1a\x1b\x1b\x1e\x0a\x09\x09\x1d\x04 \ +\x09\x0b\x02L\x04\x11\x11\x1a\x09\x0f\x16\x0d\x0d\xb8\xff\xe0\ +\xb7\x09\x0b\x02L\x0d\x00\x08\x15\x00?33+\x113\ +?33\x113+\x11\x013\x113\x113\x113\x11\ +\x12\x179\x1133\x1133\x113310!\x03\ +''#\x02\x07\x03!\x01!\x13\x16\x1736\x13\x13\ +!\x13\x16\x173667\x13!\x01\x04V\x80\x1e\x14\ +\x061\x11s\xfee\xfe\xcb\x01\x81\x5c,\x07\x06\x034\ +i\x01\xb0`.\x0c\x06\x06\x1c\x11d\x01y\xfe\xc9\x02\ +\x1c\xa3\x83\xfe\xe8I\xfe\x1f\x04m\xfeM\xe0\x94\x5c\x01\ +\x02\x01\xc9\xfe1\xdd{L\xe3E\x01\xb3\xfb\x93\x00\x00\ +\x01\x00\x0a\x00\x00\x05\x00\x04m\x00\x0b\x00J@\x18\x00\ +\x06\x05\x02\x01\x01\x0a\x0b\x04\x05\x05\x08\x07\x0b\x07\x0c\x0d\ +\x09 \x09\x0b\x02L\x03\xb8\xff\xe0@\x0d\x09\x0b\x02L\ +\x09\x03\x01\x08\x0b\x15\x04\x01\x0f\x00?3?3\x129\ +9++\x11\x12\x0199\x1133\x113\x1133\ +\x113\x129910\x01\x01!\x13\x13!\x01\x01!\ +\x03\x03!\x01w\xfe\xa6\x01\xbc\xac\xb0\x01\xbd\xfe\x9d\x01\ +q\xfeD\xbf\xbe\xfeC\x02B\x02+\xfe\xc2\x01>\xfd\ +\xd5\xfd\xbe\x01X\xfe\xa8\x00\x01\xff\xfe\xfe\x14\x04\xe1\x04\ +m\x00\x16\x00U@\x18\x0b\x14\x14\x10\x16\x16\x04\x04\x01\ +\x08\x08\x09\x09\x18\x10\x01\x00\x00\x17\x0b\x14\x14\x12\x04\xb8\ +\xff\xe0@\x11\x09\x0b\x02L\x04\x16\x16\x17\x0d\x12GY\ +\x0d\x1b\x08\x00\x0f\x00?2?+\x11\x003\x113+\ +\x129\x113\x11\x013\x1133\x113\x113\x11\x12\ +9\x113\x11\x129\x11310\x03!\x13\x16\x173\ +67\x13!\x01\x06\x06#\x22'\x11\x163266\ +7\x02\x01\x9c\xc0\x0e\x05\x08\x08\x10\xc5\x01\x8f\xfe@V\ +\xfb\xcaNR5D4N:!\x04m\xfdv3H\ +E4\x02\x8c\xfbK\xe6\xbe\x11\x013\x0c(IS\x00\ +\x01\x001\x00\x00\x03\xdb\x04m\x00\x09\x00=@\x1e\x03\ +\x07\x04\x07\x01\x00\x00\x0b\x08\x01\x01\x0a\x07\x04\x05\x05\x04\ +FY\x05\x0f\x02\x08\x01\x01\x08FY\x01\x15\x00?+\ +\x11\x12\x009\x18?+\x11\x12\x009\x11\x013\x113\ +\x113\x11\x1299\x11310!!5\x01!\x11\ +!\x15\x01!\x03\xdb\xfcV\x01\xd5\xfeF\x03y\xfe?\ +\x01\xd7\xdf\x02c\x01+\xf2\xfd\xb0\x00\x00\x01\x00=\xfe\ +\xa8\x035\x05\xcb\x00#\x006@\x19\x12\x16\x03\x1f\x1f\ +\x0e\x16\x16#$\x09\x1b\x1b%#\x00\x11\x11\x08\x1a\x1b\ +%\x09\x08\x04\x00?3?3\x129\x1133\x11\x01\ +3\x113\x1299\x1133\x113\x12910\x13\ +26554663\x11\x0e\x02\x15\x11\x14\x06\x07\ +\x15\x16\x16\x15\x11\x14\x16\x16\x17\x11\x22&&554\ +&#=s\x83b\xdd\xc3Y?&q\x7f\x80p*\ +FN\xc5\xdca\x86p\x02\xcfYQ\xfe\x8b\x8a?\xfe\ +\xe9\x03\x15,&\xfe\xf1qy\x12\x0c\x14vl\xfe\xec\ +',\x15\x03\xfe\xea@\x8b\x8d\xf8PZ\x00\x00\x01\x01\ +\x83\xfeB\x02\x8f\x06\x14\x00\x03\x00\x16@\x09\x02\x03\x03\ +\x04\x05\x03\x1b\x00\x00\x00??\x11\x12\x019\x1131\ +0\x01!\x11!\x01\x83\x01\x0c\xfe\xf4\x06\x14\xf8.\x00\ +\x01\x00B\xfe\xa8\x039\x05\xcb\x00\x22\x004@\x18\x10\ +\x0c\x1f\x04\x04\x14\x0c\x0c\x00$\x19\x08#\x22\x00\x11\x11\ +\x08\x19\x1a\x04\x09\x08%\x00?3?3\x129\x113\ +3\x11\x0132\x1199\x1133\x113\x1291\ +0\x01\x22\x06\x15\x15\x14\x06\x06#\x11665\x114\ +675&&5\x114&&'\x112\x16\x16\x15\ +\x15\x14\x163\x039o\x86b\xdc\xc4lRp\x80\x7f\ +q'=Z\xc4\xdcb\x82s\x01\xa2ZP\xf8\x8c\x8c\ +@\x01\x16\x0434\x01\x14lv\x14\x0c\x12yq\x01\ +\x0f'+\x15\x03\x01\x17?\x8a\x8b\xfeQY\x00\x01\x00\ +H\x02\x0e\x04=\x03\x96\x00\x14\x00\x1a@\x0a\x02\x0d\x15\ +\x16\x0a\x02\x10\x0d\x00\x05\x00/3\xc6\xdd\xc63\x11\x12\ +\x019910\x01\x22\x07\x11632\x16\x17\x163\ +267\x11\x06#\x22&'&\x011n{h\xa0\ +EzY\x83k2}8i\x9fG}T\x83\x02\x87\ +y\x01\x19l\x1b$7@9\xfe\xe7m\x1e\x227\x00\ +\x02\x00R\xfe\xb2\x02\x02\x04\x81\x00\x03\x00\x0f\x00)@\ +\x13\x03\x0a\x0a\x02\x04\x04\x11\x00\x00\x03\x0d\x0d\x07ZY\ +\x0d\x10\x03%\x00??+\x11\x12\x009\x18/\x11\x01\ +3\x1133\x11310\x13!\x13!\x01\x14\x06#\ +\x22&54632\x16\x85\x01J3\xfeP\x01\xac\ +khfilcen\x02d\xfcN\x05\x11[f\ +e\x5cZde\x00\x01\x00\x81\xff\xec\x04H\x05\xcb\x00\ +\x1b\x00B@\x22\x0b\x02\x13\x13\x1b\x14\x14\x18\x10\x10\x04\ +\x18\x04\x1c\x1d\x12\x0dVY\x02\x08VY\x15\x1b\x02\x12\ +\x02\x12\x02\x14\x19\x00\x07\x00??99//\x129\ +9++\x11\x12\x0199\x113\x11\x129\x1133\ +\x113210\x013\x15\x16\x17\x03&&#\x22\x06\ +\x15\x10327\x11\x06\x07\x15#5&\x0254\x12\ +7\x025\xcf\xab\x99sGxA_h\xc9\xac\x9e\x7f\ +\x9e\xcf\xd4\xe0\xe2\xd2\x05\xcb\x9a\x09K\xfe\xdf\x1f%\x94\ +\x87\xfe\xf0d\xfe\xc9R\x10\xb4\xba\x1f\x01\x22\xfc\xf0\x01\ +))\x00\x00\x01\x00f\x00\x00\x04\x8d\x05\xcd\x00\x1e\x00\ +V@+\x19\x0f\x12\x0b\x09\x0c\x0c\x1b\x18\x18\x02\x12\x02\ +\x10\x12\x10\x1f \x0c\x19\x1a\x19WY\x09\x1a\x1a\x00\x13\ +\x0f\x12\x12\x0fUY\x12\x18\x00\x05TY\x00\x07\x00?\ ++\x00\x18?+\x11\x12\x009\x129\x18/3+\x11\ +\x003\x11\x12\x0199\x113\x11\x129\x1133\x11\ +39\x129210\x012\x17\x03&#\x22\x06\x15\ +\x15!\x11!\x15\x14\x07!\x11!\x11>\x0255#\ +\x113546\x02\xd3\xd2\xc3n\x94h:7\x01X\ +\xfe\xa8\x9f\x02\x9f\xfb\xdbQ9\x1a\xa6\xa6\xea\x05\xcdR\ +\xfe\xdf7BGj\xfe\xeb`\x96M\xfe\xba\x019/\ +;L8b\x01\x15v\xd7\xe2\x00\x02\x00`\x00\xfa\x04\ +\x1d\x04\xb0\x00\x1b\x00'\x00<@\x22\x10\x0c\x13\x09\x05\ +\x17\x1a\x02\x08\x00\x0e\x0e\x22\x1c\x00\x1c\x1c()\x17\x13\ +\x10\x1a\x02\x0c\x09\x05\x08\x07\x15\x15\x1f\x07%\x00/3\ +\xc62\x11\x12\x179\x11\x12\x019\x113\x10\xc22\x11\ +\x12\x17910\x1347'7\x17632\x177\ +\x17\x07\x16\x15\x14\x07\x17\x07'\x06#\x22'\x07'7\ +&%\x14\x1632654&#\x22\x06\xb4)}\ +\xb4{TX[Vx\xb9\x7f))y\xb3xYX\ +dLw\xb2{)\x01\x00Q6:TT:8O\ +\x02\xd3YWw\xb6{)-\x7f\xae}Lf^R\ +w\xb2w'%s\xb2wR\x5c8OM::O\ +Q\x00\x01\x00\x08\x00\x00\x04\xa8\x05\xb6\x00\x16\x00q@\ +8\x0e\x12\x14\x12\x15\x0d\x11\x11\x00\x09\x05\x03\x05\x02\x0a\ +\x06\x06\x00\x00\x16\x01\x01\x02\x02\x18\x16\x15\x15\x17\x06\x12\ +\x13\x12XY\x00\x03\x01\x03\x13\x0f\x0a\x0e\x0f\x0eXY\ +\x07\x0f\x0f\x0c\x01\x15\x06\x0c\x18\x00??3\x129/\ +3+\x11\x003\x18\x10\xc62\x11\x129+\x11\x003\ +\x11\x013\x113\x113\x113\x11\x129\x113\x113\ +\x1299\x113\x113\x113\x1299\x11310\ +\x01\x13!\x013\x15#\x153\x15#\x15!5#5\ +35#53\x01!\x02X\xc1\x01\x8f\xfe\x95\xc3\xf2\ +\xf2\xf2\xfe\x94\xf6\xf6\xf6\xbe\xfe\x9e\x01\x90\x03\xbe\x01\xf8\ +\xfd8\xd3u\xd1\xd5\xd5\xd1u\xd3\x02\xc8\x00\x00\x02\x01\ +\x83\xfeB\x02\x8f\x06\x14\x00\x03\x00\x07\x00$@\x10\x02\ +\x06\x06\x03\x07\x07\x08\x09\x04\x03\x04\x03\x07\x1b\x00\x00\x00\ +??99//\x11\x12\x019\x1133\x1131\ +0\x01!\x11!\x11!\x11!\x01\x83\x01\x0c\xfe\xf4\x01\ +\x0c\xfe\xf4\x06\x14\xfc\xb9\xfe\xbc\xfc\xb9\x00\x02\x00j\xff\ +\xe7\x03\xa0\x06)\x00,\x006\x00Q@(\x10\x05\x05\ +- \x00&\x1b\x1b2\x0a\x16\x00\x1678\x1900\ +(\x0355\x12(\x12\x1e\x08\x1e$MY\x1e\x16\x08\ +\x0eMY\x08\x01\x00?+\x00\x18?+\x11\x12\x009\ +9\x113\x113\x113\x113\x11\x12\x0199\x113\ +33\x113\x11333\x11310\x13467\ +&54632\x17\x07&&#\x22\x15\x14\x16\x17\ +\x16\x16\x15\x14\x06\x07\x16\x15\x14\x06#\x22'5\x16\x16\ +3254&'.\x02%\x14\x16\x17654&\ +'\x06jVN\x8d\xde\xb8\xbf\xb3bI\x937l[\ +S\xaf\x9b@T}\xe9\xcb\xcc\x94O\xceE\x8b>l\ +\x8d\x81@\x01#Xo)Tb:\x03#@z/\ +f\x90\x89\x9eV\xdd(.J+H\x22G\xa2aM\ +y<^\x96\x95\xb1V\xf4,@`*=0?b\ +vo3P:/<9V) \x00\x02\x00\xdf\x04\ +\xe9\x04\x17\x06#\x00\x0b\x00\x17\x00 @\x0d\x00\x06\x12\ +\x0c\x06\x0c\x18\x19\x0f\x03\x03\x15\x09\x00/33\x113\ +\x11\x12\x0199\x113\x11310\x134632\ +\x16\x15\x14\x06#\x22&%4632\x16\x15\x14\x06\ +#\x22&\xdf\x5cNO]]ON\x5c\x01\xdf\x5cP\ +P]]PQ[\x05\x85KSUIGURJ\ +KSVHGUS\x00\x03\x00\x5c\xff\xec\x06;\x05\ +\xcb\x00\x15\x00%\x005\x00B@\x1f\x03\x0e\x09\x13\x0e\ +\x13&.&\x16.\x1e\x16\x1e67\x05\x0b\x00\x11\x0b\ +\x11\x0b\x11\x1a*\x22\x132\x1a\x04\x00?3?3\x12\ +99//\x113\x113\x11\x12\x0199\x113\x11\ +3\x11\x1299\x113\x11310\x01\x22\x06\x15\x14\ +\x16327\x15\x06#\x22&54632\x17\x07\ +&\x054\x12$32\x04\x12\x15\x14\x02\x04#\x22$\ +\x027\x14\x12\x0432$\x1254\x02$#\x22\x04\ +\x02\x03wQ[W[\x8ax~\x92\xd4\xe9\xe2\xd0\xa6\ +\x9c\x5cj\xfc|\xc8\x01^\xca\xc5\x01Z\xd0\xc9\xfe\xa7\ +\xcd\xcf\xfe\xa2\xc3\xa4\x9f\x01\x10\x9d\x9e\x01\x10\x9e\x9b\xfe\ +\xef\xa0\x9e\xfe\xef\x9d\x03\xcbzv\x80rD\xe7@\xf8\ +\xe1\xd9\xf6N\xcd8\xf0\xc8\x01^\xca\xc2\xfe\xa2\xd0\xcc\ +\xfe\xa7\xca\xcf\x01Z\xc6\x9e\xfe\xed\x9b\x9d\x01\x11\x9e\x9d\ +\x01\x10\x9f\x9d\xfe\xef\x00\x00\x02\x001\x02\xd9\x02\xdd\x05\ +\xc7\x00\x1a\x00$\x00A@\x1e\x1b\x07\x01\x1a\x1a!\x13\ +\x07\x0b\x0b!\x07!%&\x01\x1e\x00\x1e\x04\x22\x0b\x0b\ +\x0f\x04\x04\x00\x0f\x16\x04\x00?3\xc42/\x129\x11\ +3\x113\x11\x129\x11\x12\x0199\x113\x11\x129\ +\x113\x129\x11310\x01'\x06\x06#\x22&5\ +467754&#\x22\x06\x07'6632\ +\x16\x15\x11%\x14\x1632655\x07\x06\x02;-\ +0qRm}\x9a\xbeX339e5Ll\x91\ +[\x8b\x9e\xfeP$\x222\ +~p.RW_~\x00\x01\x00?\x029\x02\xf2\x05\ +\xc9\x00%\x00B@\x1f\x15\x0c\x04\x1a\x1a\x00\x00!\x07\ +!\x0c\x11\x07\x0c\x07&'\x04\x15\x15\x16\x16\x0a \x1d\ +#\x1f\x0f\x0d\x0a!\x00?33?33\x129/\ +3\x129\x11\x12\x0199\x113\x113\x11\x129\x11\ +3\x129\x11910\x01\x14\x06\x07\x15\x16\x16\x15\x14\ +\x06#\x22'5\x163254&##532\ +654&#\x22\x06\x07'632\x16\x02\xd5J\ +Xa^\xc4\xb3\xb9|u\xb4tAFhPGD\ +*22X5u\x95\xc2\x92\xad\x04\xf2Nm \x09\ +\x18hWx\x86F\xe9QC)\x1f\xc2%)\x19+\ +\x22(\xaass\x00\x01\x01\x08\x04\xd9\x03\xbc\x06!\x00\ +\x09\x00\x16@\x09\x05\x00\x0a\x0b\x0f\x04\x01\x04\x00\x00/\ +\xcc]\x11\x12\x019\xc910\x015667!\x15\ +\x06\x04\x07\x01\x08\x9aS\x1b\x01\xacP\xfe\xe8H\x04\xd9\ +\x1d\xa5`&\x15@\xc6-\x00\x00\x01\x00\x87\xfe\x14\x04\ +\xd9\x04m\x00\x18\x00;@\x1d\x00\x15\x15\x16\x0c\x06\x06\ +\x0b\x09\x16\x09\x19\x1a\x12\x0c\x0f\x07\x17\x0f\x16\x1c\x0f\x03\ +GY\x0f\x16\x0a\x15\x00??+\x00\x18??3\x12\ +99\x11\x12\x0199\x1133\x113\x113\x113\ +10\x01\x14\x163265\x11!\x11!'#\x06\ +\x06#\x22&'\x16\x15\x11!\x11!\x02\x0eCO]\ +S\x01\x89\xfe\xdb5\x10\x22qB8D\x1c\x0c\xfey\ +\x01\x87\x02\x06sr\xa6\xb6\x01\xf0\xfb\x93\x98XT(\ ++Z\x91\xfe\xc0\x06Y\x00\x01\x00f\xfe\xfc\x04\xa2\x06\ +\x14\x00\x0f\x00+@\x13\x05\x04\x04\x01\x0b\x01\x00\x0b\x00\ +\x10\x11\x08\x08\x01\x03\x0e\x00\x05\x01\x00/3?3\x12\ +9/\x11\x12\x0199\x113\x11\x129\x11310\ +\x01#\x11#\x11#\x11\x06#\x22&5\x10\x123!\ +\x04\xa2\xbf\x9d\xbf6G\xd8\xcc\xd7\xec\x02y\xfe\xfc\x06\ +3\xf9\xcd\x033\x12\xfa\xfb\x01\x00\x01\x02\x00\x00\x01\x00\ +V\x02\x12\x01\xf8\x03\x93\x00\x0b\x00\x17@\x0a\x06\x00\x00\ +\x0c\x0d\x03\x09ZY\x03\x00/+\x11\x12\x019\x113\ +10\x134632\x16\x15\x14\x06#\x22&Vm\ +hcjm`dq\x02\xd3\x5cdd\x5cZgf\ +\x00\x00\x01\xff\xa6\xfe\x14\x01\x8d\x00\x00\x00\x12\x00)@\ +\x12\x0d\x05\x05\x10\x00\x00\x0a\x0a\x13\x14\x00\x0a\x0a\x08\x0e\ +\x08\x03\x1c\x00?3/\x129\x113\x11\x12\x019\x11\ +3\x1293\x12910\x05\x14\x06#\x22'5\x16\ +3254&'73\x07\x16\x16\x01\x8d\x96|\x88\ +MS@4RBH\xcb\x09`J\xfcm\x83\x1d\xcd\ +\x1b/!3\x0f\x8b\x1d'k\x00\x01\x009\x02J\x02\ +h\x05\xb6\x00\x0b\x00*@\x13\x05\x0a\x00\x00\x09\x01\x01\ +\x0c\x0d\x09\x08\x08\x01\x05\x05\x0a\x1e\x01 \x00??3\ +\x11\x129\x113\x11\x12\x019\x1133\x12991\ +0\x01!\x11467\x06\x06\x07'\x013\x02h\xfe\ +\xe6\x07\x03\x09-W\x92\x01T\xdb\x02J\x01d#\xa6\ +\x10\x130J\xaa\x01\x12\x00\x02\x001\x02\xd9\x02\xf4\x05\ +\xc7\x00\x0b\x00\x14\x00\x1f@\x0d\x0c\x06\x11\x00\x06\x00\x15\ +\x16\x0f\x03\x13\x09\x04\x00?3\xc42\x11\x12\x0199\ +\x113\x11310\x01\x14\x06#\x22&5463\ +2\x16\x05\x14\x163254#\x22\x02\xf4\xbf\xa6\x9f\ +\xbf\xbd\xa5\x9d\xc4\xfe904ccd\x04P\xae\xc9\ +\xcd\xaa\xb1\xc6\xce\xa9WU\xac\xae\x00\x00\x02\x00L\x00\ +P\x05)\x04/\x00\x06\x00\x0d\x008@\x19\x0c\x08\x08\ +\x0a\x07\x09\x0b\x09\x05\x01\x01\x03\x00\x02\x04\x02\x09\x02\x0f\ +\x08\x01\x01\x0e\x0c\x05\x00/3\x129/3\x11\x019\ +9\x113\x10\xc123\x113\x113\x10\xc123\x11\ +310\x01\x01%\x01\x01%\x01\x05\x01%\x01\x01%\ +\x01\x05)\xfe}\xfe\xe3\x01\x13\xfe\xed\x01\x1d\x01\x83\xfd\ +\xc0\xfe}\xfe\xe6\x01\x10\xfe\xf0\x01\x1a\x01\x83\x021\xfe\ +\x1f\x93\x01\x5c\x01[\x95\xfe\x1d\x1b\xfe\x1f\x93\x01\x5c\x01\ +[\x95\xfe\x1d\x00\xff\xff\xff\xf4\x00\x00\x07\x06\x05\xb6\x00\ +'\x02<\x03\xe7\xfd\xb7\x00'\x02\x17\x03\x17\x00\x00\x01\ +\x06\x00{\xbb\x00\x00\x09\xb3\x01\x00\x03\x18\x00?55\ +\x00\xff\xff\xff\xf4\x00\x00\x07%\x05\xb6\x00'\x00t\x04\ +7\xfd\xb7\x00'\x02\x17\x03/\x00\x00\x01\x06\x00{\xbb\ +\x00\x00\x07\xb2\x00\x01\x18\x00?5\x00\xff\xff\x00S\x00\ +\x00\x07N\x05\xc9\x00'\x02<\x04/\xfd\xb7\x00&\x00\ +u\x14\x00\x01\x07\x02\x17\x03\x83\x00\x00\x00\x09\xb3\x01\x00\ +\x03\x18\x00?55\x00\x00\x02\x00%\xfe\x9e\x04\x0a\x04\ +\x81\x00\x1a\x00&\x00@@\x1f!\x1b\x1b\x1a\x01\x01\x08\ +\x0e\x08\x13\x13'\x0e(\x08\x1a\x1a\x10$$\x1eZY\ +$\x10\x10\x0bYY\x10%\x00?+\x00\x18?+\x11\ +\x12\x009\x18/9\x11\x013\x129\x113\x11\x129\ +\x1133\x11310\x01\x15\x14\x06\x07\x0e\x02\x15\x14\ +\x16327\x13\x06!\x22&5467665\ +5\x01\x14\x06#\x22&54632\x16\x02\xe3P\ +f9B\x1cK>\x94\xcc\x8b\xf3\xfe\xeb\xdf\xfen\x7f\ +d:\x01^jieilben\x02dVb\ +\x87@$<3'*0j\xfe\xf0\x8d\xc4\xa8x\xb0\ +Q@B,3\x01_]dd]Zdc\x00\xff\ +\xff\x00\x00\x00\x00\x05\xcf\x07s\x02&\x00$\x00\x00\x01\ +\x07\x00C\x00\x08\x01R\x00\x08\xb3\x02\x19\x05&\x00+\ +5\xff\xff\x00\x00\x00\x00\x05\xcf\x07s\x02&\x00$\x00\ +\x00\x01\x07\x00v\x01\x0c\x01R\x00\x08\xb3\x02\x19\x05&\ +\x00+5\xff\xff\x00\x00\x00\x00\x05\xcf\x07s\x02&\x00\ +$\x00\x00\x01\x07\x01K\x00\x83\x01R\x00\x08\xb3\x02\x1d\ +\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05\xcf\x07\x7f\x02\ +&\x00$\x00\x00\x01\x07\x01R\x00\x9a\x01R\x00\x08\xb3\ +\x02\x18\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05\xcf\x07\ +u\x02&\x00$\x00\x00\x01\x07\x00j\x00\x81\x01R\x00\ +\x0a\xb4\x03\x02%\x05&\x00+55\xff\xff\x00\x00\x00\ +\x00\x05\xcf\x07L\x02&\x00$\x00\x00\x01\x07\x01P\x00\ +\xb6\x00}\x00\x10@\x09\x03\x02%>%%\x05\x05>\ +\x00+\x1155\x00\x02\xff\xf6\x00\x00\x07/\x05\xb6\x00\ +\x0f\x00\x13\x00m@9\x0b\x0e\x08\x08\x00\x10\x03\x04\x06\ +\x13\x13\x01\x0a\x0e\x0e\x11\x01\x01\x05\x00\x00\x15\x14\x04\x05\ +\x05\x14\x10\x03NY\x0a\x0dOY\x10\x0a\x10\x0a\x01\x06\ +\x13\x09\x06\x09OY\x06\x03\x05\x12\x01\x0eNY\x01\x12\ +\x00?+\x00\x18??+\x11\x003\x11\x1299\x18\ +//++\x11\x013\x113\x11\x129\x11\x129\x11\ +33\x113\x113\x113\x1299\x113\x11\x129\ +10!!\x11!\x03!\x01!\x11!\x15!\x11!\ +\x11!\x01!\x11#\x07/\xfc\x9a\xfeKd\xfeF\x02\ +t\x04\xc5\xfe'\x01\xb6\xfeJ\x01\xd9\xfb^\x01\x89\xb6a\x9d\xfe\xab\xfdThpy\xf2\ +\x8e\xff\xff\x00\x87\x00\x00\x04\xd9\x06-\x02&\x00Q\x00\ +\x00\x01\x06\x01Rb\x00\x00\x08\xb3\x01\x1d\x11&\x00+\ +5\xff\xff\x00V\xff\xec\x04\xc1\x06!\x02&\x00R\x00\ +\x00\x01\x06\x00C\xa7\x00\x00\x08\xb3\x02\x22\x11&\x00+\ +5\xff\xff\x00V\xff\xec\x04\xc1\x06!\x02&\x00R\x00\ +\x00\x01\x07\x00v\x00\x98\x00\x00\x00\x08\xb3\x02\x22\x11&\ +\x00+5\xff\xff\x00V\xff\xec\x04\xc1\x06!\x02&\x00\ +R\x00\x00\x01\x06\x01K#\x00\x00\x08\xb3\x02&\x11&\ +\x00+5\xff\xff\x00V\xff\xec\x04\xc1\x06-\x02&\x00\ +R\x00\x00\x01\x06\x01R7\x00\x00\x08\xb3\x02!\x11&\ +\x00+5\xff\xff\x00V\xff\xec\x04\xc1\x06#\x02&\x00\ +R\x00\x00\x01\x06\x00j\x10\x00\x00\x0a\xb4\x03\x02.\x11\ +&\x00+55\x00\x03\x00H\x00\xa2\x04=\x05\x02\x00\ +\x03\x00\x0f\x00\x1b\x00*@\x12\x16\x0a\x0a\x10\x04\x04\x00\ +\x03\x03\x1d\x00\x1c\x19\x13\x0d\x07\x00\x01\x00/3\xc42\ +\xc42\x11\x013\x113\x11\x129\x1133\x1131\ +0\x13\x11!\x11\x014632\x16\x15\x14\x06#\x22\ +&\x114632\x16\x15\x14\x06#\x22&H\x03\xf5\ +\xfdiOMKRWFGUOMKRWF\ +GU\x02L\x01\x0c\xfe\xf4\xff\x00RXWSPZ\ +X\x03^RXWSPZX\x00\x00\x03\x00V\xff\ +\x8b\x04\xfa\x04\xc9\x00\x13\x00\x1b\x00#\x009@\x1c\x1f\ +\x17\x14\x1c\x14\x02\x1c\x0c\x02\x0c$%\x1e\x16\x19!\x0f\ +!JY\x0f\x16\x05\x19JY\x05\x10\x00?+\x00\x18\ +?+\x11\x12\x0099\x11\x12\x0199\x113\x113\ +\x11\x129910%&\x11\x10\x00!2\x177\x17\ +\x07\x16\x11\x10\x00!\x22'\x07'\x01\x14\x17\x01&#\ +\x22\x06\x054'\x01\x16326\x01\x12\xbc\x01:\x01\ +\x1c}mG\xa8C\xb8\xfe\xc7\xfe\xe5}hT\xaa\x01\ +\x0a\x0c\x01!$.ri\x01\xb6\x0a\xfe\xe5\x1b1r\ +gq\x9e\x01*\x01\x15\x013'oih\x9e\xfe\xdf\ +\xfe\xe8\xfe\xcb\x22\x83k\x02Cc0\x01\xc0\x0d\x94\xa6\ +V-\xfeF\x08\x92\x00\xff\xff\x00\x85\xff\xec\x04\xd5\x06\ +!\x02&\x00X\x00\x00\x01\x06\x00C\xa7\x00\x00\x08\xb3\ +\x01\x1e\x11&\x00+5\xff\xff\x00\x85\xff\xec\x04\xd5\x06\ +!\x02&\x00X\x00\x00\x01\x07\x00v\x00\xcf\x00\x00\x00\ +\x08\xb3\x01\x1e\x11&\x00+5\xff\xff\x00\x85\xff\xec\x04\ +\xd5\x06!\x02&\x00X\x00\x00\x01\x06\x01KB\x00\x00\ +\x08\xb3\x01\x22\x11&\x00+5\xff\xff\x00\x85\xff\xec\x04\ +\xd5\x06#\x02&\x00X\x00\x00\x01\x06\x00j1\x00\x00\ +\x0a\xb4\x02\x01*\x11&\x00+55\xff\xff\xff\xfe\xfe\ +\x14\x04\xe1\x06!\x02&\x00\x5c\x00\x00\x01\x07\x00v\x00\ +\x89\x00\x00\x00\x08\xb3\x01 \x11&\x00+5\x00\x02\x00\ +\x87\xfe\x14\x04\xcd\x06\x14\x00\x15\x00\x22\x00>@\x1f\x1a\ +\x13\x0f\x0f\x10 \x06\x10\x06#$\x11\x00\x10\x1c\x0c\x15\ +\x09\x03\x09\x1dGY\x09\x16\x03\x16GY\x03\x10\x00?\ ++\x00\x18?+\x11\x12\x0099\x18??\x11\x12\x01\ +99\x113\x113\x113310\x016632\ +\x12\x11\x10\x02#\x22'#\x17\x17\x11!\x11!\x11\x14\ +\x07\x17\x22\x06\x07\x15\x14\x1632654&\x02\x0e\ ++\x9ed\xb9\xd9\xdf\xc1\xadr\x0e\x07\x07\xfey\x01\x87\ +\x12\xaeUD\x03NTP?B\x03\xdbNX\xfe\xcc\ +\xfe\xec\xfe\xf1\xfe\xc2\x81<\x5c\xfe?\x08\x00\xfe\xa8j\ +w\x8d{{\x1d\x92\x82\x8d\x89\x86\x8b\xff\xff\xff\xfe\xfe\ +\x14\x04\xe1\x06#\x02&\x00\x5c\x00\x00\x01\x06\x00j\xf9\ +\x00\x00\x0a\xb4\x02\x01,\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05\xcf\x07\x17\x02&\x00$\x00\x00\x01\x07\x01\ +M\x00\x81\x01R\x00\x08\xb3\x02\x13\x05&\x00+5\xff\ +\xff\x00J\xff\xec\x04y\x05\xc5\x02&\x00D\x00\x00\x01\ +\x06\x01M+\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\ +\xff\x00\x00\x00\x00\x05\xcf\x07\x9e\x02&\x00$\x00\x00\x01\ +\x07\x01N\x00\x83\x01R\x00\x08\xb3\x02\x13\x05&\x00+\ +5\xff\xff\x00J\xff\xec\x04y\x06L\x02&\x00D\x00\ +\x00\x01\x06\x01N/\x00\x00\x08\xb3\x02%\x11&\x00+\ +5\xff\xff\x00\x00\xfe\x14\x05\xcf\x05\xbc\x02&\x00$\x00\ +\x00\x00\x07\x01Q\x03y\x00\x00\xff\xff\x00J\xfe\x14\x04\ +\x7f\x04\x81\x02&\x00D\x00\x00\x00\x07\x01Q\x02\xc3\x00\ +\x00\xff\xff\x00h\xff\xec\x04\xf2\x07s\x02&\x00&\x00\ +\x00\x01\x07\x00v\x01\x1f\x01R\x00\x08\xb3\x01!\x05&\ +\x00+5\xff\xff\x00V\xff\xec\x04Z\x06!\x02&\x00\ +F\x00\x00\x01\x07\x00v\x00\x9e\x00\x00\x00\x08\xb3\x01\x1f\ +\x11&\x00+5\xff\xff\x00h\xff\xec\x04\xf2\x07s\x02\ +&\x00&\x00\x00\x01\x07\x01K\x00\xaa\x01R\x00\x08\xb3\ +\x01%\x05&\x00+5\xff\xff\x00V\xff\xec\x041\x06\ +!\x02&\x00F\x00\x00\x01\x06\x01K\x02\x00\x00\x08\xb3\ +\x01#\x11&\x00+5\xff\xff\x00h\xff\xec\x04\xf2\x07\ +\x87\x02&\x00&\x00\x00\x01\x07\x01O\x01\xb2\x01R\x00\ +\x08\xb3\x01 \x05&\x00+5\xff\xff\x00V\xff\xec\x04\ +\x1d\x065\x02&\x00F\x00\x00\x01\x07\x01O\x013\x00\ +\x00\x00\x08\xb3\x01\x1e\x11&\x00+5\xff\xff\x00h\xff\ +\xec\x04\xf2\x07s\x02&\x00&\x00\x00\x01\x07\x01L\x00\ +\xa2\x01R\x00\x08\xb3\x01\x1d\x05&\x00+5\xff\xff\x00\ +V\xff\xec\x04;\x06!\x02&\x00F\x00\x00\x01\x06\x01\ +L\x0c\x00\x00\x08\xb3\x01\x1b\x11&\x00+5\xff\xff\x00\ +\x9e\x00\x00\x05w\x07s\x02&\x00'\x00\x00\x01\x07\x01\ +L\x00o\x01R\x00\x08\xb3\x02\x17\x05&\x00+5\xff\ +\xff\x00V\xff\xec\x06\x8e\x06\x14\x02&\x00G\x00\x00\x00\ +\x07\x028\x03\xcd\x00\x00\xff\xff\x00\x1f\x00\x00\x05w\x05\ +\xb6\x02\x06\x00\x92\x00\x00\x00\x02\x00V\xff\xec\x059\x06\ +\x14\x00\x1b\x00'\x00W@,%\x0e\x03\x1f\x19\x10\x0d\ +\x0d\x15\x13\x17\x03\x17()\x18\x15\x06#GY\x16\x0e\ +\x0f\x0eLY\x13\x0f\x19\x09\x06\x0f\x06\x0f\x00\x11\x00\x00\ +\x1cGY\x00\x16\x00?+\x00\x18?\x1299//\ +99\x113+\x11\x003+\x00\x18?\x11\x12\x019\ +9\x11333\x11333\x129210\x05\x22\ +\x025\x10\x1232\x173&&55#535\ +!\x153\x15#\x11!'#\x06\x1326754\ +&#\x22\x15\x14\x16\x01\xd7\xb2\xcf\xde\xc8\xc5j\x08\x0c\ +\x13\xe7\xe7\x01\x8a\x9b\x9b\xfe\xc0X\x0ei\x0dTB\x03\ +WH\x90R\x14\x01!\xf5\x01\x00\x01\x1b\xa4/\x94I\ +\x0a\xf2\x93\x93\xf2\xfbq\x8f\xa3\x015bd\x19mt\ +\xe3gv\xff\xff\x00\x9e\x00\x00\x04\x02\x07\x17\x02&\x00\ +(\x00\x00\x01\x07\x01M\xff\xef\x01R\x00\x08\xb3\x01\x0f\ +\x05&\x00+5\xff\xff\x00V\xff\xec\x04\x9c\x05\xc5\x02\ +&\x00H\x00\x00\x01\x06\x01M\x12\x00\x00\x08\xb3\x02\x1f\ +\x11&\x00+5\xff\xff\x00\x9e\x00\x00\x04\x02\x07\x9e\x02\ +&\x00(\x00\x00\x01\x07\x01N\xff\xd8\x01R\x00\x08\xb3\ +\x01\x0f\x05&\x00+5\xff\xff\x00V\xff\xec\x04\x9c\x06\ +L\x02&\x00H\x00\x00\x01\x06\x01N\x1f\x00\x00\x08\xb3\ +\x02\x1f\x11&\x00+5\xff\xff\x00\x9e\x00\x00\x04\x02\x07\ +j\x02&\x00(\x00\x00\x01\x07\x01O\x01\x04\x015\x00\ +\x08\xb3\x01\x14\x05&\x00+5\xff\xff\x00V\xff\xec\x04\ +\x9c\x065\x02&\x00H\x00\x00\x01\x07\x01O\x01H\x00\ +\x00\x00\x08\xb3\x02$\x11&\x00+5\xff\xff\x00\x9e\xfe\ +\x14\x04\x02\x05\xb6\x02&\x00(\x00\x00\x00\x07\x01Q\x01\ +\xfe\x00\x00\xff\xff\x00V\xfe\x14\x04\x9c\x04\x81\x02&\x00\ +H\x00\x00\x00\x07\x01Q\x02\x19\x00\x00\xff\xff\x00\x88\x00\ +\x00\x04\x13\x07s\x02&\x00(\x00\x00\x01\x07\x01L\xff\ +\xe4\x01R\x00\x08\xb3\x01\x11\x05&\x00+5\xff\xff\x00\ +V\xff\xec\x04\x9c\x06!\x02&\x00H\x00\x00\x01\x06\x01\ +L\x1d\x00\x00\x08\xb3\x02!\x11&\x00+5\xff\xff\x00\ +h\xff\xec\x05`\x07s\x02&\x00*\x00\x00\x01\x07\x01\ +K\x00\x9c\x01R\x00\x08\xb3\x01(\x05&\x00+5\xff\ +\xff\x00\x14\xfe\x14\x04\xb4\x06!\x02&\x00J\x00\x00\x01\ +\x06\x01K\x00\x00\x00\x08\xb3\x03L\x11&\x00+5\xff\ +\xff\x00h\xff\xec\x05`\x07\x9e\x02&\x00*\x00\x00\x01\ +\x07\x01N\x00\x9e\x01R\x00\x08\xb3\x01\x1e\x05&\x00+\ +5\xff\xff\x00\x14\xfe\x14\x04\xb4\x06L\x02&\x00J\x00\ +\x00\x01\x06\x01N\x0c\x00\x00\x08\xb3\x03B\x11&\x00+\ +5\xff\xff\x00h\xff\xec\x05`\x07\x87\x02&\x00*\x00\ +\x00\x01\x07\x01O\x01\xbc\x01R\x00\x08\xb3\x01#\x05&\ +\x00+5\xff\xff\x00\x14\xfe\x14\x04\xb4\x065\x02&\x00\ +J\x00\x00\x01\x07\x01O\x01\x12\x00\x00\x00\x08\xb3\x03G\ +\x11&\x00+5\xff\xff\x00h\xfe;\x05`\x05\xcb\x02\ +&\x00*\x00\x00\x00\x07\x029\x01#\x00\x00\xff\xff\x00\ +\x14\xfe\x14\x04\xb4\x06!\x02&\x00J\x00\x00\x01\x07\x02\ +:\x00\x93\x00\x00\x00\x08\xb3\x03B\x11&\x00+5\xff\ +\xff\x00\x9e\x00\x00\x05\x83\x07s\x02&\x00+\x00\x00\x01\ +\x07\x01K\x00\xa2\x01R\x00\x08\xb3\x01\x19\x05&\x00+\ +5\xff\xff\x00\x87\x00\x00\x04\xd9\x07\xaa\x02&\x00K\x00\ +\x00\x01\x07\x01K\x00B\x01\x89\x00\x0d\xb7\x01\x16l\x16\ +\x16\x09\x09>\x00+\x115\x00\x00\x02\x00\x00\x00\x00\x06\ +B\x05\xb6\x00\x13\x00\x17\x00Q@(\x17\x03\x0f\x0f\x12\ +\x00\x10\x14\x04\x0c\x0c\x09\x07\x0b\x10\x0b\x18\x19\x17\x0eN\ +Y\x16\x0a\x12\x12\x07\x03\x13\x17\x13\x17\x13\x01\x0c\x10\x12\ +\x05\x01\x03\x00?3?3\x1299//\x1133\ +3\x1133+\x11\x12\x0199\x11333\x113\ +3\x11333\x113310\x135!\x15!5\ +!\x153\x15#\x11!\x11!\x11!\x11#5\x015\ +!\x15\xae\x01\x8b\x01\xcd\x01\x8d\xaf\xaf\xfes\xfe3\xfe\ +u\xae\x04\x06\xfe3\x05\x14\xa2\xa2\xa2\xa2\xe9\xfb\xd5\x02\ +T\xfd\xac\x04+\xe9\xfe\x84\x93\x93\x00\x00\x01\x00\x00\x00\ +\x00\x04\xee\x06\x14\x00\x1e\x00O@(\x07\x09\x15\x09\x06\ +\x1d\x1d\x03\x01\x1e\x16\x15\x1e\x15\x1f \x11\x19GY\x09\ +\x01\x02\x01LY\x06\x02\x0d\x1e\x11\x02\x11\x02\x04\x16\x1e\ +\x15\x04\x00\x00??3\x1299//\x129\x113\ ++\x11\x003+\x11\x12\x0199\x113\x11333\ +\x1133\x11\x12910\x13#535!\x153\ +\x15#\x15\x14\x06\x0736632\x16\x15\x11!\x11\ +4#\x22\x06\x15\x11!\x9c\x9c\x9c\x01\x87\xe9\xeb\x0a\x05\ +\x177\x97g\xbd\xd3\xfev\x87`Z\xfey\x04\x8f\xf2\ +\x93\x93\xf2)%\x9a*VJ\xda\xc4\xfd\x81\x02\x06\xe3\ +\xa2\xbc\xfeu\x00\xff\xff\x00 \x00\x00\x03j\x07\x7f\x02\ +&\x00,\x00\x00\x01\x07\x01R\xffp\x01R\x00\x08\xb3\ +\x01\x14\x05&\x00+5\xff\xff\xff\xab\x00\x00\x02\xf5\x06\ +-\x02&\x00\xf3\x00\x00\x01\x07\x01R\xfe\xfb\x00\x00\x00\ +\x08\xb3\x01\x0c\x11&\x00+5\xff\xff\x00F\x00\x00\x03\ +?\x07\x17\x02&\x00,\x00\x00\x01\x07\x01M\xffg\x01\ +R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\xff\xe5\x00\ +\x00\x02\xbc\x05\xc5\x02&\x00\xf3\x00\x00\x01\x07\x01M\xfe\ +\xf1\x00\x00\x00\x08\xb3\x01\x07\x11&\x00+5\xff\xff\x00\ +2\x00\x00\x03[\x07\x9e\x02&\x00,\x00\x00\x01\x07\x01\ +N\xffa\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\ +\xff\xff\xb9\x00\x00\x02\xe2\x06L\x02&\x00\xf3\x00\x00\x01\ +\x07\x01N\xfe\xe8\x00\x00\x00\x08\xb3\x01\x07\x11&\x00+\ +5\xff\xff\x00F\xfe\x14\x03?\x05\xb6\x02&\x00,\x00\ +\x00\x00\x07\x01Q\x00\xbc\x00\x00\xff\xff\x00^\xfe\x14\x02\ + \x065\x02&\x00L\x00\x00\x00\x06\x01Qd\x00\xff\ +\xff\x00F\x00\x00\x03?\x07\x87\x02&\x00,\x00\x00\x01\ +\x07\x01O\x00s\x01R\x00\x08\xb3\x01\x14\x05&\x00+\ +5\x00\x01\x00\x89\x00\x00\x02\x10\x04m\x00\x03\x00\x16@\ +\x09\x00\x01\x01\x04\x05\x02\x0f\x01\x15\x00??\x11\x12\x01\ +9\x11310!!\x11!\x02\x10\xfey\x01\x87\x04\ +m\xff\xff\x00F\xfe5\x05\xa4\x05\xb6\x00&\x00,\x00\ +\x00\x00\x07\x00-\x03q\x00\x00\xff\xff\x00\x7f\xfe\x14\x04\ +\x94\x065\x00&\x00L\x00\x00\x00\x07\x00M\x02w\x00\ +\x00\xff\xff\xff^\xfe5\x03:\x07s\x02&\x00-\x00\ +\x00\x01\x07\x01K\xff\x0b\x01R\x00\x08\xb3\x01\x1c\x05&\ +\x00+5\xff\xff\xff\x82\xfe\x14\x03\x0d\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01K\xfe\xde\x00\x00\x00\x08\xb3\x01\x1b\ +\x11&\x00+5\xff\xff\x00\x9e\xfe;\x05\x87\x05\xb6\x02\ +&\x00.\x00\x00\x00\x07\x029\x00\xb8\x00\x00\xff\xff\x00\ +\x87\xfe;\x05F\x06\x14\x02&\x00N\x00\x00\x00\x07\x02\ +9\x00\xb4\x00\x00\x00\x01\x00\x87\x00\x00\x05F\x04m\x00\ +\x11\x008@\x1a\x09\x00\x05\x05\x06\x06\x12\x13\x10\x11\x11\ +\x02\x01\x01\x13\x03\x00\x0b\x0b\x06\x10\x07\x0f\x02\x06\x15\x00\ +?3?3\x129\x1133\x11\x013\x1133\x11\ +3\x11\x129\x113\x113310\x01\x01!\x03\x07\ +\x11!\x11!\x15\x14\x073667\x13!\x03\x9e\x01\ +\xa8\xfeG\xfc\x81\xfew\x01\x89\x0a\x08\x13<*\xf6\x01\ +\xb6\x02}\xfd\x83\x01\x8fb\xfe\xd3\x04m\xf6u\x7f\x1a\ +^6\x01<\x00\xff\xff\x00\x9e\x00\x00\x04\x5c\x07s\x02\ +&\x00/\x00\x00\x01\x07\x00v\x00\x04\x01R\x00\x08\xb3\ +\x01\x0f\x05&\x00+5\xff\xff\x00o\x00\x00\x03#\x07\ +\xac\x02&\x00O\x00\x00\x01\x07\x00v\xffg\x01\x8b\x00\ +\x0d\xb7\x01\x0dl\x0d\x0d\x02\x02>\x00+\x115\x00\xff\ +\xff\x00\x9e\xfe;\x04\x5c\x05\xb6\x02&\x00/\x00\x00\x00\ +\x06\x029h\x00\xff\xff\x00q\xfe;\x02\x0e\x06\x14\x02\ +&\x00O\x00\x00\x00\x07\x029\xff@\x00\x00\xff\xff\x00\ +\x9e\x00\x00\x04u\x05\xb7\x02&\x00/\x00\x00\x01\x07\x02\ +8\x01\xb4\xff\xa3\x00\x07\xb2\x01\x08\x03\x00?5\x00\xff\ +\xff\x00\x87\x00\x00\x03\xfe\x06\x14\x02&\x00O\x00\x00\x00\ +\x07\x028\x01=\x00\x00\xff\xff\x00\x9e\x00\x00\x04\x7f\x05\ +\xb6\x02&\x00/\x00\x00\x01\x07\x01O\x02`\xfdt\x00\ +\x0d\xb7\x01\x0e!\x0e\x09\x00\x01>\x00+\x115\x00\xff\ +\xff\x00\x87\x00\x00\x04)\x06\x14\x00&\x00O\x00\x00\x01\ +\x07\x01O\x02\x0a\xfd8\x00\x10\xb1\x01\x0c\xb8\xff\xb6\xb4\ +\x0c\x07\x01\x02>\x00+\x115\x00\x01\xff\xe1\x00\x00\x04\ +\x93\x05\xb6\x00\x0d\x003@\x18\x07\x0b\x0b\x04\x00\x00\x0c\ +\x0e\x0f\x0a\x04\x07\x07\x01\x01\x00\x05\x03\x00\x0bOY\x00\ +\x12\x00?+\x00\x18?\x129\x113\x1299\x11\x12\ +\x0199\x1133\x113103\x11\x07'7\x11\ +!\x117\x17\x05\x11!\x11\xd5f\x8e\xf4\x01\x8b\xd3\x94\ +\xfe\x99\x023\x01\xe19\xf8\x91\x02\x85\xfeo\x83\xf4\xdf\ +\xfej\xfe\xc1\x00\x00\x01\xff\xe1\x00\x00\x03u\x06\x14\x00\ +\x0b\x00*@\x13\x00\x04\x04\x09\x05\x05\x0c\x0d\x09\x03\x00\ +\x00\x06\x06\x05\x0a\x00\x05\x15\x00??\x129\x113\x12\ +99\x11\x12\x019\x1133\x11310\x017\x17\ +\x05\x11!\x11\x07'%\x11!\x02qr\x92\xfe\xfc\xfe\ +x|\x8c\x01\x08\x01\x88\x03\xcbE\xf7\x9a\xfd\x81\x01\x93\ +C\xf8\x97\x035\xff\xff\x00\x9e\x00\x00\x06\x0e\x07s\x02\ +&\x001\x00\x00\x01\x07\x00v\x01y\x01R\x00\x08\xb3\ +\x01\x19\x05&\x00+5\xff\xff\x00\x87\x00\x00\x04\xd9\x06\ +!\x02&\x00Q\x00\x00\x01\x07\x00v\x00\xd7\x00\x00\x00\ +\x08\xb3\x01\x1e\x11&\x00+5\xff\xff\x00\x9e\xfe;\x06\ +\x0e\x05\xb6\x02&\x001\x00\x00\x00\x07\x029\x01#\x00\ +\x00\xff\xff\x00\x87\xfe;\x04\xd9\x04\x81\x02&\x00Q\x00\ +\x00\x00\x07\x029\x00\x9a\x00\x00\xff\xff\x00\x9e\x00\x00\x06\ +\x0e\x07s\x02&\x001\x00\x00\x01\x07\x01L\x00\xee\x01\ +R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\x87\x00\ +\x00\x04\xd9\x06!\x02&\x00Q\x00\x00\x01\x06\x01LJ\ +\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\xff\x00\x01\x00\ +\x00\x06'\x05\xb4\x00'\x00Q\x01N\x00\x00\x00\x06\x02\ +\x07\xdc\x00\x00\x01\x00\x9e\xfe\x17\x06\x0e\x05\xb6\x00\x1a\x00\ +<@\x1d\x02\x11\x0e\x0e\x0f\x09\x15\x15\x18\x0f\x18\x1b\x1c\ +\x13\x0b\x0f\x16\x10\x03\x18\x09\x0f\x12\x00\x06PY\x00\x1c\ +\x00?+\x00\x18?33?3\x1299\x11\x12\x01\ +99\x113\x129\x113\x119910\x01\x22'\ +\x11\x16\x163267\x01#\x16\x15\x11!\x11!\x01\ +3&5\x11!\x11\x14\x00\x04\x04\x80_&S3w\ +s\x08\xfd/\x09\x13\xfe\xa2\x01\xdb\x02=\x08\x10\x01`\ +\xfe\xe8\xfe\x17\x14\x013\x06\x0e[[\x04\x06\xbe\xe2\xfd\ +\x9a\x05\xb6\xfc\xd7\xe8\xbe\x01\x83\xfaB\xe1\xff\x00\x00\x00\ +\x01\x00\x87\xfe\x14\x04\xd9\x04\x81\x00\x1e\x00E@#\x03\ +\x08\x15\x10\x10\x14\x11\x08\x1c\x11\x1c\x1f \x14\x11\x18\x18\ +\x0cGY\x18\x10\x12\x0f\x1c\x08\x08\x11\x15\x00\x06GY\ +\x00\x1c\x00?+\x00\x18?3\x113??+\x11\x12\ +\x009\x11\x12\x0199\x113\x1133\x113\x129\ +10\x01\x22&'\x11\x16325\x114&#\x22\ +\x06\x15\x11!\x11!\x1736632\x16\x15\x11\x14\ +\x06\x03=-z,D1qFAcX\xfey\x01\ +'1\x192\xb3q\xba\xd1\xd8\xfe\x14\x0f\x0a\x011\x12\ +\xaa\x02\x99^a\x9e\xc0\xfe\x10\x04m\x8cOQ\xdc\xc4\ +\xfc\xc3\xbc\xd4\x00\xff\xff\x00h\xff\xec\x05\xf6\x07\x17\x02\ +&\x002\x00\x00\x01\x07\x01M\x00\xd1\x01R\x00\x08\xb3\ +\x02\x19\x05&\x00+5\xff\xff\x00V\xff\xec\x04\xc1\x05\ +\xc5\x02&\x00R\x00\x00\x01\x06\x01M+\x00\x00\x08\xb3\ +\x02\x1c\x11&\x00+5\xff\xff\x00h\xff\xec\x05\xf6\x07\ +\x9e\x02&\x002\x00\x00\x01\x07\x01N\x00\xcf\x01R\x00\ +\x08\xb3\x02\x19\x05&\x00+5\xff\xff\x00V\xff\xec\x04\ +\xc1\x06L\x02&\x00R\x00\x00\x01\x06\x01N%\x00\x00\ +\x08\xb3\x02\x1c\x11&\x00+5\xff\xff\x00h\xff\xec\x05\ +\xf6\x07s\x02&\x002\x00\x00\x01\x07\x01S\x01^\x01\ +R\x00\x0a\xb4\x03\x02)\x05&\x00+55\xff\xff\x00\ +V\xff\xec\x05\x02\x06!\x02&\x00R\x00\x00\x01\x07\x01\ +S\x00\xa2\x00\x00\x00\x0a\xb4\x03\x02,\x11&\x00+5\ +5\x00\x02\x00h\xff\xec\x07F\x05\xcd\x00\x16\x00\x22\x00\ +_@2\x1a\x07\x12\x0f\x11\x15\x15\x0d\x01\x1f\x1f\x07\x0f\ +\x00\x07\x00#$\x11\x14OY\x11\x11\x0d\x01\x0d\x10O\ +Y\x0d\x03\x0a\x17NY\x0a\x04\x04\x1dNY\x04\x12\x01\ +\x15NY\x01\x12\x00?+\x00\x18?+\x00\x18?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x0199\ +\x113\x129\x11333\x113\x129\x11310\ +!!\x06\x06# \x00\x11\x10\x00!2\x16\x17!\x11\ +!\x15!\x11!\x11!\x01\x22\x06\x15\x14\x16327\ +\x11&&\x07F\xfc\xb4\x22\x999\xfe\xc1\xfe\xa1\x01^\ +\x01BC\x99\x1e\x03D\xfe'\x01\xb4\xfeL\x01\xd9\xfb\ +\xc4}\x85\x81\x7f\x8dL\x22v\x08\x0c\x01\x90\x01c\x01\ +g\x01\x87\x0e\x09\xfe\xc3\xe6\xfe\xc3\xfe\xec\x03G\xdb\xd1\ +\xcd\xdb+\x02\xf8\x17\x1a\x00\x03\x00V\xff\xec\x07\x81\x04\ +\x81\x00\x1b\x00'\x00-\x00r@;\x1c\x07*+\x19\ +\x12\x02\x0c\x13\x13\x22\x22+\x07+\x12\x07\x12./\x18\ +\x13\x16*\x13LY**\x0e\x00\x0e(JY\x0e\x10\ +\x02\x0c\x04\x0a\x0a%FY\x0a\x10\x00\x16IY\x00\x04\ +\x04\x1fFY\x04\x16\x00?+\x11\x003+\x00\x18?\ ++\x11\x12\x0099\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x009\x11\x12\x0199\x113\x11\x129\x113\ +\x1299\x119\x119\x11310\x05\x22'\x06#\ + \x00\x11\x10\x00!2\x17632\x00\x15\x15!\x16\ +\x16327\x11\x06\x06\x01\x14\x1632654&\ +#\x22\x06%\x22\x07!&&\x05\x9a\xee\x91\x97\xfb\xfe\ +\xfe\xfe\xcf\x01+\x01\x0e\xe2\x95\x9b\xf5\xe3\x01\x08\xfdH\ +\x04\x8ct\xc2\xaa\x5c\xbe\xfb\xc6L\x5c[KL\x5cY\ +M\x03\x9a\xa2\x0e\x01T\x02\x5c\x14\x89\x89\x01>\x01\x0f\ +\x01\x15\x013\x7f\x7f\xfe\xf0\xf8\xacZqV\xfe\xe7/\ +$\x02M\x92\x99\x99\x92\x91\x94\x94\xad\xb4Rb\x00\xff\ +\xff\x00\x9e\x00\x00\x05\x83\x07s\x02&\x005\x00\x00\x01\ +\x07\x00v\x00\xac\x01R\x00\x08\xb3\x02\x1c\x05&\x00+\ +5\xff\xff\x00\x87\x00\x00\x03\xeb\x06!\x02&\x00U\x00\ +\x00\x01\x06\x00v/\x00\x00\x08\xb3\x01\x1b\x11&\x00+\ +5\xff\xff\x00\x9e\xfe;\x05\x83\x05\xb6\x02&\x005\x00\ +\x00\x00\x07\x029\x00\xe7\x00\x00\xff\xff\x00m\xfe;\x03\ +\xaa\x04\x81\x02&\x00U\x00\x00\x00\x07\x029\xff<\x00\ +\x00\xff\xff\x00\x9e\x00\x00\x05\x83\x07s\x02&\x005\x00\ +\x00\x01\x07\x01L\x00=\x01R\x00\x08\xb3\x02\x18\x05&\ +\x00+5\xff\xff\x00[\x00\x00\x03\xe6\x06!\x02&\x00\ +U\x00\x00\x01\x06\x01L\xb7\x00\x00\x08\xb3\x01\x17\x11&\ +\x00+5\xff\xff\x00Z\xff\xec\x04Z\x07s\x02&\x00\ +6\x00\x00\x01\x07\x00v\x00\x98\x01R\x00\x08\xb3\x010\ +\x05&\x00+5\xff\xff\x00w\xff\xec\x04\x12\x06!\x02\ +&\x00V\x00\x00\x01\x06\x00vV\x00\x00\x08\xb3\x01.\ +\x11&\x00+5\xff\xff\x00Z\xff\xec\x04Z\x07s\x02\ +&\x006\x00\x00\x01\x07\x01K\x00\x06\x01R\x00\x08\xb3\ +\x014\x05&\x00+5\xff\xff\x00W\xff\xec\x03\xf2\x06\ +!\x02&\x00V\x00\x00\x01\x06\x01K\xb3\x00\x00\x08\xb3\ +\x012\x11&\x00+5\xff\xff\x00Z\xfe\x14\x04Z\x05\ +\xcb\x02&\x006\x00\x00\x00\x07\x00z\x01\x87\x00\x00\xff\ +\xff\x00w\xfe\x14\x03\xf2\x04\x81\x02&\x00V\x00\x00\x00\ +\x07\x00z\x01d\x00\x00\xff\xff\x00Z\xff\xec\x04Z\x07\ +s\x02&\x006\x00\x00\x01\x07\x01L\x00\x0e\x01R\x00\ +\x08\xb3\x01,\x05&\x00+5\xff\xff\x00a\xff\xec\x03\ +\xf2\x06!\x02&\x00V\x00\x00\x01\x06\x01L\xbd\x00\x00\ +\x08\xb3\x01*\x11&\x00+5\xff\xff\x003\xfe;\x04\ +\x87\x05\xb6\x02&\x007\x00\x00\x00\x06\x029P\x00\xff\ +\xff\x005\xfe;\x03o\x05P\x02&\x00W\x00\x00\x00\ +\x06\x029\x10\x00\xff\xff\x003\x00\x00\x04\x87\x07s\x02\ +&\x007\x00\x00\x01\x07\x01L\xff\xf5\x01R\x00\x08\xb3\ +\x01\x0d\x05&\x00+5\xff\xff\x00=\xff\xec\x04F\x06\ +(\x00&\x00W\x08\x00\x01\x07\x028\x01\x85\x00\x14\x00\ +\x0d\xb7\x01\x1ct\x1c\x1c\x10\x10>\x00+\x115\x00\x00\ +\x01\x003\x00\x00\x04\x87\x05\xb6\x00\x0f\x00A@!\x09\ +\x07\x0b\x0b\x0e\x00\x0c\x05\x0c\x02\x03\x10\x11\x0a\x0e\x0f\x0e\ +NY\x07\x0f\x0f\x03\x0c\x12\x06\x02\x03\x02NY\x03\x03\ +\x00?+\x11\x003\x18?\x129/3+\x11\x003\ +\x11\x12\x01\x179\x11333\x113310\x01\x11\ +!\x11!\x11!\x113\x11#\x11!\x11#\x11\x01\x98\ +\xfe\x9b\x04T\xfe\x9c\xd3\xd3\xfeu\xcf\x03h\x01\x0b\x01\ +C\xfe\xbd\xfe\xf5\xfe\xbb\xfd\xdd\x02#\x01E\x00\x01\x00\ +5\xff\xec\x03\x8d\x05P\x00\x1e\x00a@1\x11\x09\x18\ +\x14\x1c\x1c\x09\x0c\x19\x0f\x16\x0f\x0d\x09\x16\x04\x09\x04\x1f\ + \x0f\x17\x14\x17FY\x03\x00\x1b\x1b\x0b\x0c\x0bLY\ +\x18\x0c\x0c\x06\x12\x11\x14\x0f\x06\x00GY\x06\x16\x00?\ ++\x00\x18?3\xc1\x129/3+\x11\x003\x11\x12\ +9+\x11\x003\x11\x12\x0199\x113\x1133\x11\ +\x1299\x113\x1133\x12910\x01267\ +\x11\x06#\x22&55#535#577!\ +\x15!\x11!\x15!\x15!\x15\x14\x16\x02\xb2(Ji\ +\x92\xca\xc5\xaett\x89\xaee\x01\x00\x015\xfe\xcb\x01\ +\x08\xfe\xf87\x01!\x0c!\xfe\xdd?\xc1\xc8G\xf4\x98\ +\x9f{\xee\xe3\xfe\xdb\x98\xf4-?/\xff\xff\x00\x96\xff\ +\xec\x05y\x07\x7f\x02&\x008\x00\x00\x01\x07\x01R\x00\ +\xb8\x01R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\xff\x00\ +\x85\xff\xec\x04\xd5\x06-\x02&\x00X\x00\x00\x01\x06\x01\ +RX\x00\x00\x08\xb3\x01\x1d\x11&\x00+5\xff\xff\x00\ +\x96\xff\xec\x05y\x07\x17\x02&\x008\x00\x00\x01\x07\x01\ +M\x00\xa8\x01R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\ +\xff\x00\x85\xff\xec\x04\xd5\x05\xc5\x02&\x00X\x00\x00\x01\ +\x06\x01MJ\x00\x00\x08\xb3\x01\x18\x11&\x00+5\xff\ +\xff\x00\x96\xff\xec\x05y\x07\x9e\x02&\x008\x00\x00\x01\ +\x07\x01N\x00\xa4\x01R\x00\x08\xb3\x01\x15\x05&\x00+\ +5\xff\xff\x00\x85\xff\xec\x04\xd5\x06L\x02&\x00X\x00\ +\x00\x01\x06\x01NH\x00\x00\x08\xb3\x01\x18\x11&\x00+\ +5\xff\xff\x00\x96\xff\xec\x05y\x08!\x02&\x008\x00\ +\x00\x01\x07\x01P\x00\xd9\x01R\x00\x0a\xb4\x02\x01\x15\x05\ +&\x00+55\xff\xff\x00\x85\xff\xec\x04\xd5\x06\xcf\x02\ +&\x00X\x00\x00\x01\x06\x01Py\x00\x00\x0a\xb4\x02\x01\ +\x18\x11&\x00+55\xff\xff\x00\x96\xff\xec\x05}\x07\ +s\x02&\x008\x00\x00\x01\x07\x01S\x01\x1d\x01R\x00\ +\x0a\xb4\x02\x01%\x05&\x00+55\xff\xff\x00\x85\xff\ +\xec\x05\x0e\x06!\x02&\x00X\x00\x00\x01\x07\x01S\x00\ +\xae\x00\x00\x00\x0a\xb4\x02\x01(\x11&\x00+55\xff\ +\xff\x00\x96\xfe\x14\x05y\x05\xb6\x02&\x008\x00\x00\x00\ +\x07\x01Q\x02F\x00\x00\xff\xff\x00\x85\xfe\x14\x04\xd5\x04\ +m\x02&\x00X\x00\x00\x00\x07\x01Q\x03\x0a\x00\x00\xff\ +\xff\x00\x1f\x00\x00\x081\x07s\x02&\x00:\x00\x00\x01\ +\x07\x01K\x01\xb6\x01R\x00\x08\xb3\x01*\x05&\x00+\ +5\xff\xff\x00\x19\x00\x00\x07/\x06!\x02&\x00Z\x00\ +\x00\x01\x07\x01K\x013\x00\x00\x00\x08\xb3\x01*\x11&\ +\x00+5\xff\xff\x00\x00\x00\x00\x05P\x07s\x02&\x00\ +<\x00\x00\x01\x07\x01K\x00B\x01R\x00\x08\xb3\x01\x16\ +\x05&\x00+5\xff\xff\xff\xfe\xfe\x14\x04\xe1\x06!\x02\ +&\x00\x5c\x00\x00\x01\x06\x01K\x04\x00\x00\x08\xb3\x01$\ +\x11&\x00+5\xff\xff\x00\x00\x00\x00\x05P\x07u\x02\ +&\x00<\x00\x00\x01\x07\x00j\x00-\x01R\x00\x0a\xb4\ +\x02\x01\x1e\x05&\x00+55\xff\xff\x00=\x00\x00\x04\ +\xb0\x07s\x02&\x00=\x00\x00\x01\x07\x00v\x00q\x01\ +R\x00\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x001\x00\ +\x00\x04\x08\x06!\x02&\x00]\x00\x00\x01\x06\x00vL\ +\x00\x00\x08\xb3\x01\x13\x11&\x00+5\xff\xff\x00=\x00\ +\x00\x04\xb0\x07\x87\x02&\x00=\x00\x00\x01\x07\x01O\x01\ +\x04\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\xff\xff\x00\ +1\x00\x00\x03\xdb\x065\x02&\x00]\x00\x00\x01\x07\x01\ +O\x00\xa8\x00\x00\x00\x08\xb3\x01\x12\x11&\x00+5\xff\ +\xff\x00=\x00\x00\x04\xb0\x07s\x02&\x00=\x00\x00\x01\ +\x07\x01L\x00\x14\x01R\x00\x08\xb3\x01\x0f\x05&\x00+\ +5\xff\xff\x001\x00\x00\x03\xdb\x06!\x02&\x00]\x00\ +\x00\x01\x06\x01L\xa9\x00\x00\x08\xb3\x01\x0f\x11&\x00+\ +5\x00\x01\x00\x87\x00\x00\x03b\x06\x1f\x00\x0f\x00\x1d@\ +\x0e\x00\x01\x01\x10\x08\x11\x06\x0cIY\x06\x00\x01\x15\x00\ +??+\x11\x013\x129\x11310!!\x114\ +6632\x17\x03&&#\x22\x06\x15\x02\x0e\xfey\ +T\xa9\xa3\xbb\x80K&H.<1\x04y\x9a\xb9S\ +6\xfe\xfc\x0b\x16AT\x00\x01\x00\x8b\xfe\x14\x04\x1b\x06\ +\x1f\x00\x1f\x00L@'\x17\x00\x00!\x1e\x02\x02\x11\x0f\ +\x08\x0d\x0d !\x0f\x01\x1e\x01FY\x11\x1e\x0f\x18\x1a\ +\x1d\x0f\x15\x1aFY\x15\x00\x05\x0bGY\x05\x1c\x00?\ ++\x00\x18?+\x00\x18?\x129?3+\x11\x003\ +\x11\x12\x019\x113333\x113\x129\x1131\ +0\x01!\x11\x14\x06#\x22&'\x11\x16325\x11\ +#5754632\x17\x03&#\x22\x06\x15\x15\ +!\x03\xdf\xff\x00\xc7\xb6*\x81,>1^\x95\x9d\xae\ +\xc7\xa6\xa0LP;50\x01\x00\x03H\xfcd\xc5\xd3\ +\x0f\x0e\x01-\x12\x8f\x03m\xc0`%\xd5\xbd6\xfe\xfe\ +\x19BM\x04\x00\x00\x05\x00\x00\x00\x00\x05\xcf\x07\xaa\x00\ +\x12\x00\x1a\x00$\x000\x001\x00q@7\x13\x05\x1a\ +\x08\x17\x1f$$\x0d\x0d++\x17\x00%%\x0a\x03\x17\ +\x17\x08\x05\x05\x04\x043\x08\x09\x092#\x10\x1e\x10(\ +.@\x1a\x07NY\x1a\x1a\x05\x03\x0a\x17..\x081\ +\x03\x05\x08\x12\x00?3?\x129/3\xc42\x129\ +/+\x00\x1a\x18\x10\xde2\xcc\x119\x11\x013\x113\ +\x113\x113\x11\x129\x11333\x113\x113\x11\ +3\x129\x113\x11\x129\x12910\x01\x14\x073\ +\x01!\x03!\x03!\x013&54632\x16\x03\ +'&&'\x06\x06\x03\x03667!\x15\x06\x06\x07\ +!\x134&#\x22\x06\x15\x14\x16326'\x03\xf4\ +\x13\x0b\x01\xe3\xfePN\xfe+J\xfeN\x01\xdd\x0c\x0e\ +\x90xw\x9au@\x168\x0a\x0a!h\x19$h\x22\ +\x01\xaf\x1d\xedO\xfe\xfc\xfc1##1**#1\ +T\x05\xcb7*\xfa\x96\x01\x12\xfe\xee\x05j)6t\ +\x8a\x8e\xfc!\xd1G\xd368\x82\xfe\x99\x04\xbd\x17V\ +&\x14\x1be\x18\xfe\xcb&..&%//\x12\x00\ +\x05\x00J\xff\xec\x04y\x07\xb6\x00\x18\x00!\x00+\x00\ +7\x00C\x00|@@\x12\x0c\x08\x0c\x01\x1c\x1c\x18(\ +\x22\x222,,8>2> \x08\x08>\x18\x03E\ +D+&55;@/AA\x14&\x11\x0c\x0f\x14\ +\x0fIY\x0c\x1dMY\x0c\x0c\x00\x14\x10\x02\x19\x05\x05\ +\x19IY\x05\x16\x00\x15\x00??+\x11\x12\x009\x18\ +?\x129/++\x11\x12\x009\x18/\x129/3\ +\x1a\xce2\x11\x129\x11\x12\x01\x179\x113\x113\x10\ +\xca2\x11\x129\x113\x113\x1133\x11\x1291\ +0!'#\x06\x06#\x22&546%754\ +#\x22\x07\x036!2\x16\x15\x11\x012655\x07\ +\x06\x15\x14\x035667!\x15\x06\x06\x07\x13\x14\x06\ +#\x22&54632\x16\x074&#\x22\x06\x15\ +\x14\x16326\x03jK\x08O\xa4\x82\xa1\xb7\xe6\x01\ +\x05\xbd\x8a|\xbfq\xc6\x01.\xda\xef\xfd\xcfGeZ\ +\xc1\x0a2a\x1b\x01\x89\x15\xa4\x80\xd1\x98yx\x90\x90\ +xv\x9b\xbd1##1**#1\x96bH\xc3\ +\xb1\xb4\xaf\x08\x06\x10\x8cT\x01\x02f\xd8\xc2\xfd\x19\x01\ +\x00ZHX\x04\x07\x87h\x05\xe5\x11-n%\x0c\x18\ +iD\xfe\xcfo\x8f\x8art\x8a\x8bs&..&\ +%//\xff\xff\xff\xf6\x00\x00\x07/\x07s\x02&\x00\ +\x88\x00\x00\x01\x07\x00v\x02\x98\x01R\x00\x08\xb3\x02\x1d\ +\x05&\x00+5\xff\xff\x00J\xff\xec\x07%\x06!\x02\ +&\x00\xa8\x00\x00\x01\x07\x00v\x02\x00\x00\x00\x00\x08\xb3\ +\x03@\x11&\x00+5\xff\xff\x00h\xff\x93\x05\xf6\x07\ +s\x02&\x00\x9a\x00\x00\x01\x07\x00v\x01R\x01R\x00\ +\x08\xb3\x03,\x05&\x00+5\xff\xff\x00V\xff\x8b\x04\ +\xfa\x06!\x02&\x00\xba\x00\x00\x01\x07\x00v\x00\xd3\x00\ +\x00\x00\x08\xb3\x03-\x11&\x00+5\xff\xff\x00Z\xfe\ +;\x04Z\x05\xcb\x02&\x006\x00\x00\x00\x06\x029\x0a\ +\x00\xff\xff\x00w\xfe;\x03\xf2\x04\x81\x02&\x00V\x00\ +\x00\x00\x06\x029\xe8\x00\x00\x01\x00\xa4\x04\xd9\x04/\x06\ +!\x00\x0d\x00\x1e@\x0d\x0c\x05\x02\x02\x0e\x0f\x02\x0f\x0a\ +\x01\x0a\x05\x00\x00/2\xcd]2\x11\x12\x019\x113\ +310\x01&'\x06\x07!5667!\x16\x17\ +\x15\x031Tu}E\xfe\xfeE\x97&\x01\x89^\xa2\ +\x04\xd90fk+\x1dA\xb0:\x89\xa2\x1d\x00\x01\x00\ +\xa4\x04\xd9\x04/\x06!\x00\x0e\x00\x1e@\x0d\x08\x00\x0c\ +\x0c\x0f\x10\x09\x0f\x00\x01\x00\x0c\x05\x00/3\xcd]2\ +\x11\x12\x019\x113310\x01\x15\x06\x06\x07!&\ +&'5!\x16\x1767\x04/B\x92,\xfew'\ +\x8fL\x01\x02E}uT\x06!\x1dB\xa8A<\xa5\ +J\x1d+kf0\x00\x00\x01\x00\xf4\x04\xd9\x03\xcb\x05\ +\xc5\x00\x03\x00\x13\xb6\x01\x00\x00\x04\x05\x00\x03\x00/3\ +\x11\x12\x019\x10\xc910\x13!\x15!\xf4\x02\xd7\xfd\ +)\x05\xc5\xec\x00\x00\x01\x00\xd1\x04\xd9\x03\xfa\x06L\x00\ +\x0d\x00\x1e@\x0c\x00\x0d\x07\x06\x07\x07\x0e\x0f\x06\x00\x0a\ +\x03\x00/3\xcd2\x11\x12\x019\x113\x10\xca21\ +0\x01\x06\x06#\x22&'3\x16\x163267\x03\ +\xfa\x0a\xd8\xb6\xbb\xcd\x09\xd3\x14K_QY\x13\x06L\ +\xab\xc8\xbe\xb5N5?D\x00\x00\x01\x00\x7f\x04\xdb\x02\ +\x1f\x065\x00\x09\x00\x13\xb6\x06\x00\x00\x0a\x0b\x03\x08\x00\ +/3\x11\x12\x019\x11310\x134632\x16\ +\x15\x14#\x22\x7fbmmd\xd1\xcf\x05\x87XVX\ +V\xac\x00\x00\x02\x01%\x04\xd5\x03=\x06\xcf\x00\x0b\x00\ +\x17\x00\x18@\x09\x06\x12\x12\x18\x19\x09\x0f\x03\x15\x00/\ +3\xce2\x11\x12\x019\x11310\x01\x14\x06#\x22\ +&54632\x16\x074&#\x22\x06\x15\x14\x16\ +326\x03=\x98xy\x8f\x8fyv\x9a\xbc1#\ +#1**#1\x05\xd3q\x8d\x89st\x8a\x8cr\ +&..&%//\x00\x01\xff\xfa\xfe\x14\x01\xbc\x00\ +\x00\x00\x10\x00\x1d@\x0c\x0e\x04\x04\x0a\x00\x00\x11\x12\x0d\ +\x02\x07\x1c\x00?3/\x11\x12\x019\x1133\x129\ +10\x17\x14327\x15\x06#\x22&5467\ +3\x06\x06\xf8NF0S[z\x9aP^\xd5O6\ +\xc7C\x16\xdd\x1b\x81gE}BJV\x00\x00\x01\x00\ +\xb0\x04\xd5\x03\xfa\x06-\x00\x16\x00*@\x12\x14\x13\x07\ +\x08\x07\x07\x17\x18\x10\x00\x05\x0b\x00\x0b\x00\x0b\x14\x08\x00\ +/\xcc99//\x113\x113\x11\x12\x019\x113\ +\x10\xc8210\x01\x22.\x02#\x22\x07#663\ +2\x1e\x0232673\x06\x06\x03\x04-[XS\ +%6\x12\xb4\x0bzw&VXV&\x1d\x22\x09\xb6\ +\x0b~\x04\xd7\x1e$\x1eb\xaf\xa7\x1e$\x1e20\xa7\ +\xaf\x00\x02\x00N\x04\xd9\x04`\x06!\x00\x09\x00\x13\x00\ +\x22@\x0f\x10\x0a\x01\x06\x0a\x06\x14\x15\x0e\x0f\x04\x01\x04\ +\x0a\x00\x00/2\xc4]2\x11\x12\x0199\x113\x11\ +310\x135767!\x15\x06\x06\x07!57\ +67!\x15\x06\x06\x07N1t*\x01r\x18\xcf\x8f\ +\x01\x041t*\x01t\x1a\xe5z\x04\xd9\x1dC\x9eJ\ +\x15'\xa9c\x1dC\x9bM\x15+\xb6R\x00\x00\x01\x01\ +\x96\x04\xd9\x039\x06\x5c\x00\x08\x00\x13\xb6\x05\x00\x00\x09\ +\x0a\x04\x08\x00/\xcd\x11\x12\x019\x11310\x016\ +67!\x15\x06\x07#\x01\x96\x14.\x09\x01XRp\ +\xe1\x04\xfaD\xdf?\x1a\xb4\xb5\x00\x03\x00s\x04\xe9\x04\ +\x12\x06\xb4\x00\x07\x00\x11\x00\x1b\x00,@\x16\x04\x07\x07\ +\x0d\x0d\x12\x1c\x1d\x14\x0a\x0a\x07\x0f\x03\x1f\x03/\x03\x03\ +\x03\x1a\x10\x00/3\xcc]93\x113\x11\x12\x019\ +9\x113\x11310\x0167!\x15\x06\x07#%\ +432\x16\x15\x14\x06#\x22%432\x16\x15\x14\ +\x06#\x22\x01\xcd$\x03\x0132|\xac\xfe\xa6\x99E\ +WWE\x99\x02f\x9eGTTG\x9e\x05\x89\xd2Y\ +\x14v\xbd\x18\x9eLRPL\x9c\x9eLRPL\xff\ +\xff\xff\xb0\x00\x00\x05\xea\x05\xf3\x00&\x00$\x1b\x00\x01\ +\x07\x01T\xfe\x1a\xff\x97\x00\x0d\xb7\x02\x132\x13\x13\x05\ +\x05>\x00+\x115\x00\xff\xff\x00V\x02\x12\x01\xf8\x03\ +\x93\x02\x06\x00y\x00\x00\xff\xff\xff\xb0\x00\x00\x04\xe3\x05\ +\xf3\x00'\x00(\x00\xe1\x00\x00\x01\x07\x01T\xfe\x1a\xff\ +\x97\x00\x0d\xb7\x01\x0f2\x0f\x0f\x02\x02>\x00+\x115\ +\x00\xff\xff\xff\xb0\x00\x00\x06T\x05\xf3\x00'\x00+\x00\ +\xd1\x00\x00\x01\x07\x01T\xfe\x1a\xff\x97\x00\x0d\xb7\x01\x0f\ +2\x0f\x0f\x06\x06>\x00+\x115\x00\xff\xff\xff\xb0\x00\ +\x00\x04r\x05\xf3\x00'\x00,\x013\x00\x00\x01\x07\x01\ +T\xfe\x1a\xff\x97\x00\x0d\xb7\x01\x0f2\x0f\x0f\x06\x06>\ +\x00+\x115\x00\xff\xff\xff\xb0\xff\xec\x06m\x05\xf3\x00\ +&\x002w\x00\x01\x07\x01T\xfe\x1a\xff\x97\x00\x0d\xb7\ +\x02\x192\x19\x19\x09\x09>\x00+\x115\x00\xff\xff\xff\ +\xb0\x00\x00\x06\xd1\x05\xf3\x00'\x00<\x01\x81\x00\x00\x01\ +\x07\x01T\xfe\x1a\xff\x97\x00\x0d\xb7\x01\x0c2\x0c\x0c\x07\ +\x07>\x00+\x115\x00\xff\xff\xff\xb0\x00\x00\x06\xac\x05\ +\xf3\x00&\x01v\x7f\x00\x01\x07\x01T\xfe\x1a\xff\x97\x00\ +\x0d\xb7\x01$2$$\x10\x10>\x00+\x115\x00\xff\ +\xff\xff\xa1\xff\xec\x03R\x06\xb4\x02&\x01\x86\x00\x00\x01\ +\x07\x01U\xff.\x00\x00\x00\x0c\xb5\x03\x02\x01(\x11&\ +\x00+555\xff\xff\x00\x00\x00\x00\x05\xcf\x05\xbc\x02\ +\x06\x00$\x00\x00\xff\xff\x00\x9e\x00\x00\x05\x04\x05\xb6\x02\ +\x06\x00%\x00\x00\x00\x01\x00\x9e\x00\x00\x04m\x05\xb6\x00\ +\x05\x00\x1d@\x0e\x03\x04\x04\x00\x06\x07\x05\x02OY\x05\ +\x03\x04\x12\x00??+\x11\x12\x0199\x11310\ +\x01\x11!\x11!\x11\x04m\xfd\xbe\xfes\x05\xb6\xfe\xc1\ +\xfb\x89\x05\xb6\x00\xff\xff\x00!\x00\x00\x05\x85\x05\xc1\x02\ +\x06\x02(\x00\x00\xff\xff\x00\x9e\x00\x00\x04\x02\x05\xb6\x02\ +\x06\x00(\x00\x00\xff\xff\x00=\x00\x00\x04\xb0\x05\xb6\x02\ +\x06\x00=\x00\x00\xff\xff\x00\x9e\x00\x00\x05\x83\x05\xb6\x02\ +\x06\x00+\x00\x00\x00\x03\x00h\xff\xec\x05\xf6\x05\xcd\x00\ +\x0b\x00\x17\x00\x1b\x00I@'\x1b\x1a\x0c\x12\x0c\x06\x12\ +\x00\x06\x00\x1c\x1d\x18\x1bPY\x0d\x18\x1d\x18\x02\x0c\x03\ +\x18\x18\x03\x09\x09\x15OY\x09\x04\x03\x0fOY\x03\x13\ +\x00?+\x00\x18?+\x11\x12\x009\x18/_^]\ ++\x11\x12\x0199\x113\x113\x11\x129910\ +\x01\x10\x00! \x00\x11\x10\x00! \x00\x01\x14\x163\ +2654&#\x22\x06\x17!\x11!\x05\xf6\xfe\x96\ +\xfe\xa3\xfe\xa8\xfe\x91\x01m\x01\x5c\x01]\x01h\xfb\xfa\ +\xa0\x9f\xa3\x9d\x9c\xa2\xa3\x9er\x01\x9c\xfed\x02\xdd\xfe\ +\x8f\xfe\x80\x01\x82\x01q\x01m\x01\x81\xfe\x82\xfe\x8e\xde\ +\xd6\xd4\xe0\xe0\xd9\xdb>\xfe\xd5\xff\xff\x00F\x00\x00\x03\ +?\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00\x9e\x00\x00\x05\ +\x87\x05\xb6\x02\x06\x00.\x00\x00\x00\x01\x00\x00\x00\x00\x05\ +\x8d\x05\xb6\x00\x0c\x00*@\x13\x03\x02\x09\x09\x05\x05\x04\ +\x04\x0e\x00\x01\x01\x0d\x09\x02\x03\x05\x01\x12\x00?3?\ +3\x11\x013\x113\x113\x113\x119\x11331\ +0!!\x01!\x01!\x03&&'\x06\x06\x07\x01\xba\ +\xfeF\x01\xdf\x01\xd1\x01\xdd\xfeD\xc7\x13-\x03\x05)\ +\x14\x05\xb6\xfaJ\x02\xe5L\xdc03\xdbF\xff\xff\x00\ +\x9e\x00\x00\x07\x1f\x05\xb6\x02\x06\x000\x00\x00\xff\xff\x00\ +\x9e\x00\x00\x06\x0e\x05\xb6\x02\x06\x001\x00\x00\x00\x03\x00\ +P\x00\x00\x04H\x05\xb6\x00\x03\x00\x07\x00\x0b\x00?@\ + \x03\x02\x07\x06\x07\x0a\x06\x09\x0a\x09\x0c\x0d\x00\x03O\ +Y\x00\x00\x0a\x04\x0a\x0bNY\x0a\x12\x04\x07OY\x04\ +\x03\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x0199\x113\x113\x11\x129910\x13!\ +\x11!\x03!\x11!\x01\x11!\x11\xcb\x03\x02\xfc\xfeR\ +\x03\xa6\xfcZ\x03\xcf\xfc\x08\x03\x93\xfe\xc3\x03`\xfe\xc3\ +\xfc\xc9\xfe\xbe\x01B\x00\xff\xff\x00h\xff\xec\x05\xf6\x05\ +\xcd\x02\x06\x002\x00\x00\x00\x01\x00\x9e\x00\x00\x05L\x05\ +\xb6\x00\x07\x00#@\x11\x04\x05\x01\x00\x05\x00\x08\x09\x06\ +\x03NY\x06\x03\x01\x05\x12\x00?3?+\x11\x12\x01\ +99\x113\x11310!!\x11!\x11!\x11!\ +\x05L\xfer\xfem\xfes\x04\xae\x04s\xfb\x8d\x05\xb6\ +\x00\xff\xff\x00\x9e\x00\x00\x04\xc3\x05\xb6\x02\x06\x003\x00\ +\x00\x00\x01\x00J\x00\x00\x04\x85\x05\xb6\x00\x0f\x00G@\ +#\x02\x0a\x0a\x06\x09\x03\x03\x0b\x00\x06\x0f\x00\x0f\x10\x11\ +\x0a\x02\x02\x0d\x03\x07\x04\x07OY\x04\x03\x01\x0d\x00\x0d\ +NY\x00\x12\x00?+\x11\x003\x18?+\x11\x003\ +\x129\x113\x11\x12\x0199\x113\x1133\x113\ +\x129\x113103\x11\x01\x01\x11!\x11!\x22'\ +\x01\x0163!\x11J\x01\xbc\xfeP\x03\xf4\xfe\xb0\x9e\ +N\x01\xa6\xfeD\x8fm\x01\x91\x013\x01\xcd\x01\x8d\x01\ +)\xfe\xc3\x0a\xfe\x7f\xfe3\x0d\xfe\xbe\xff\xff\x003\x00\ +\x00\x04\x87\x05\xb6\x02\x06\x007\x00\x00\xff\xff\x00\x00\x00\ +\x00\x05P\x05\xb6\x02\x06\x00<\x00\x00\x00\x03\x00L\xff\ +\xec\x06\xdb\x05\xcb\x00\x19\x00\x22\x00+\x00P@('\ +\x1a\x02\x0d\x0d+\x19\x0e\x0e\x14\x1e\x1e\x07\x14\x07,-\ +\x1a*\x0f*PY\x0c\x0f\x22$\x18$PY\x02\x0f\ +\x0e\x18\x18\x0e\x13\x00\x04\x00??9/\x1293+\ +\x11\x003\x113+\x11\x003\x11\x12\x0199\x113\ +\x11\x129\x11333\x1133210\x01!\x15\ +32\x04\x16\x15\x14\x06\x04##\x15!5#\x22$\ +&546$33\x0132654&##\ +!#\x22\x06\x15\x14\x1633\x02\xd5\x01}\x1d\xbc\x01\ +\x19\x97\x94\xfe\xe2\xcb\x0c\xfe\x83\x14\xca\xfe\xe5\x90\x99\x01\ +\x13\xb8%\x01}\x0c~~\x82v\x10\xfe\x83\x17u|\ +y{\x14\x05\xcb\xb4\x8a\xfa\x9f\xa6\xf9\x88\xe1\xe1\x85\xf7\ +\xad\xa3\xfd\x81\xfc\xe1|\x82r\x81|w\x87w\x00\xff\ +\xff\x00\x04\x00\x00\x05\xc3\x05\xb6\x02\x06\x00;\x00\x00\x00\ +\x01\x00q\x00\x00\x07\x00\x05\xb6\x00\x1b\x00B@ \x09\ +\x06\x10\x00\x00\x0d\x01\x01\x14\x06\x14\x17\x06\x17\x1c\x1d\x10\ +\x0d\x02\x0dNY\x1b\x02\x02\x01\x15\x0e\x07\x03\x01\x12\x00\ +??33\x129/3+\x11\x003\x11\x12\x019\ +9\x113\x11\x129\x1133\x113\x11310!\ +!\x11# \x00\x11\x11!\x11\x14\x1633\x11!\x11\ +3265\x11!\x11\x10\x00!#\x04w\xfe\x83%\ +\xfe\xba\xfe\xe2\x01\x85p\x83\x11\x01}\x14r~\x01\x85\ +\xfe\xde\xfe\xc0'\x01\x8d\x01\x07\x01*\x01\xf8\xfe\x0d~\ +r\x02\xe3\xfd\x1d{p\x01\xf8\xfe#\xfe\xcf\xfe\xe5\x00\ +\x01\x001\x00\x00\x06-\x05\xcd\x00 \x00Q@(\x0a\ +\x0d\x07\x17\x1a\x14\x07\x1a\x03\x1e\x03\x08\x0d\x1e\x19\x14\x0d\ +\x14!\x22\x1b\x06\x06\x09\x00\x10\x00NY\x10\x04\x17\x09\ +\x08\x09NY\x1a\x08\x12\x00?3+\x11\x003\x18?\ ++\x11\x12\x009\x113\x11\x12\x0199\x1133\x11\ +33\x11\x1299\x11\x129\x11\x12910\x01\x22\ +\x06\x15\x14\x16\x17\x11!\x11!&\x025\x10\x00!2\ +\x04\x12\x15\x14\x02\x07!\x11!\x116654&\x03\ +/\x90\xa3cr\xfd`\x01u\x95\xab\x01\x84\x01E\xd4\ +\x01E\xb0\xaa\x9e\x01}\xfdZxc\xa4\x04\x89\xc5\xa7\ +\xa4\xc4H\xfe\x93\x01DH\x01%\xaf\x01\x1f\x01N\x97\ +\xfe\xe5\xb9\xb2\xfe\xe3O\xfe\xbc\x01mK\xc6\xa3\xa6\xc2\ +\x00\xff\xff\x00&\x00\x00\x03^\x07u\x02&\x00,\x00\ +\x00\x01\x07\x00j\xffG\x01R\x00\x0a\xb4\x02\x01!\x05\ +&\x00+55\xff\xff\x00\x00\x00\x00\x05P\x07u\x02\ +&\x00<\x00\x00\x01\x07\x00j\x00F\x01R\x00\x0a\xb4\ +\x02\x01\x1e\x05&\x00+55\xff\xff\x00V\xff\xec\x05\ +-\x06\x5c\x02&\x01~\x00\x00\x01\x06\x01Tq\x00\x00\ +\x08\xb3\x023\x11&\x00+5\xff\xff\x00?\xff\xec\x04\ +'\x06\x5c\x02&\x01\x82\x00\x00\x01\x07\x01T\x00\x85\x00\ +\x00\x00\x08\xb3\x01/\x11&\x00+5\xff\xff\x00\x87\xfe\ +\x14\x04\xd9\x06\x5c\x02&\x01\x84\x00\x00\x01\x07\x01T\x00\ +\xb8\x00\x00\x00\x08\xb3\x01\x1c\x11&\x00+5\xff\xff\x00\ +\x85\xff\xec\x03R\x06\x5c\x02&\x01\x86\x00\x00\x01\x07\x01\ +T\xffO\x00\x00\x00\x08\xb3\x01\x16\x11&\x00+5\xff\ +\xff\x00\x83\xff\xf0\x04\xec\x06\xb4\x02&\x01\x92\x00\x00\x01\ +\x06\x01UT\x00\x00\x0c\xb5\x03\x02\x01/\x11&\x00+\ +555\x00\x02\x00V\xff\xec\x05-\x04}\x00\x1e\x00\ +*\x00E@#)\x03\x1c\x0a##\x11\x03\x11+,\ +\x0c\x0f\x0a\x1d\x06\x00\x06&GY\x06\x10\x19\x13GY\ +\x19\x00\x00\x1fGY\x00\x16\x00?+\x11\x003+\x00\ +\x18?+\x11\x12\x0099\x18?\x11\x12\x0199\x11\ +3\x1133\x11310\x05\x22\x02\x11\x10\x1232\ +\x16\x17367!\x06\x06\x15\x11\x14327\x11\x06\ +\x06#\x22&'#\x06\x0326754&#\x22\ +\x06\x15\x10\x02\x04\xca\xe4\xf1\xd8t\x94/\x10\x1d)\x01\ +H'-R \x1b\x10o\x1d\x81\x8b+\x18nKY\ +S\x02V\x5cPR\x14\x015\x01\x10\x01\x18\x014R\ +Vi/i\xfcp\xff\x00y\x0a\xfe\xdd\x0a\x10NY\ +\xa7\x01/w\x97\x0a\x95\x86\x94\x8b\xfe\xec\x00\x00\x02\x00\ +\x87\xfe\x14\x05)\x06\x1f\x00\x15\x00+\x00Z@-$\ + \x1a\x06))\x03\x03\x1a\x0a\x1a\x11\x11\x12 \x0a\x12\ +\x0a,-\x12\x1c\x07%$%$FY%%\x0d\x00\ +\x0d\x1dGY\x0d\x16\x00\x16FY\x00\x00\x00?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x009\x18?\ +\x11\x12\x0199\x113\x113\x113\x11\x129\x113\ +\x129\x11\x12910\x012\x04\x15\x14\x06\x07\x15\x16\ +\x16\x15\x14\x04#\x22&'\x11!\x114$\x01\x22\x06\ +\x15\x11\x16\x1632654&##\x11326\ +54&\x02\xbe\xf8\x01\x19\x93\x86\xc0\xb3\xfe\xfa\xdb`\ +\xa64\xfey\x01+\x01\x00UO\x1es.`ol\ +a9&DJT\x06\x1f\xd2\xba\x94\xaa\x16\x08\x19\xbd\ +\xa5\xd5\xfb!\x1a\xfd\xed\x064\xe0\xf7\xfe\xddkl\xfd\ +/\x16\x1faaO]\x01#\x5cNNT\x00\x01\xff\ +\xfe\xfe\x14\x04\xd9\x04m\x00\x12\x00<@\x1c\x00\x01\x01\ +\x05\x04\x04\x0a\x0a\x06\x0e\x0e\x0f\x0f\x14\x06\x05\x05\x13\x11\ +\x0a\x04\x04\x13\x0e\x05\x0f\x01\x1c\x00??3\x113\x11\ +33\x11\x013\x113\x113\x113\x11\x129\x113\ +\x11\x129\x11310\x01!4\x127\x01!\x13\x16\ +\x16\x17367\x13!\x01\x06\x02\x02\xd5\xfed4-\ +\xfed\x01\x98t0!\x07\x08\x15F}\x01\x97\xfe^\ ++7\xfe\x14Q\x01\x19\x8e\x04a\xfe\x91\x9e\x97<\x90\ +\xcf\x01\x81\xfb\xa1o\xfe\xe3\x00\x00\x02\x00V\xff\xec\x04\ +\xc3\x06'\x00\x19\x00$\x00Y@,\x00\x1c\x02\x1c\x1f\ +\x1f\x18\x0c\x02\x02\x1a\x18\x1a\x07\x12\x18\x12%&\x00\x1c\ +\x12\x1a\x1c\x1a\x01\x22\x01\x0d\x0d\x0a\x22\x15\x22FY\x15\ +\x16\x05\x0aFY\x05\x01\x00?+\x00\x18?+\x11\x12\ +\x009\x113\x11\x1299\x113\x113\x11\x12\x019\ +9\x1133\x11\x129\x113\x113\x119\x11\x129\ +10\x01&5463 \x17\x03&#\x22\x15\x14\ +\x16\x17\x16\x12\x15\x14\x00!\x22$5\x10\x014'\x06\ +\x06\x15\x14\x16326\x01\xbe\xd9\xfb\xed\x01\x08\xee\x92\ +\xd4\x8ayM\xb9\xb5\xac\xfe\xd3\xfe\xf1\xfd\xfe\xce\x02\xdd\ +\xa4KaZLO[\x03\x83\x8d\xd3\x9c\xa8s\xfe\xe6\ +jA @gd\xfe\xfd\xb6\xf0\xfe\xfd\xf8\xd2\x01V\ +\xfe\xd5\x98u\x19\xa1gWho\x00\x00\x01\x00?\xff\ +\xec\x04'\x04\x81\x00&\x00b@3\x06\x11\x14\x18\x00\ +##\x18\x18\x1e\x11\x1e\x0a\x11\x0a'(\x1f!\x15&\ +\x0a\x08\x02&\x02KY\x0c&\x1c&\x02\x0c\x03&&\ +\x0e\x1b\x1b!IY\x1b\x10\x0e\x08FY\x0e\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/_^]+\x11\ +\x12\x009\x129\x119\x11\x12\x0199\x113\x11\x12\ +9\x113\x119\x129\x11310\x01\x15#\x22\x06\ +\x06\x15\x14327\x11\x06\x06# $5467\ +5&&54$32\x16\x17\x03&#\x22\x15\x14\ +\x163\x03J\x94Zf/\xcf\xd1\xc0m\xd8\x86\xfe\xeb\ +\xfe\xf8\x93~^o\x01\x02\xf4o\xc3|o\x9e\x91\x95\ +fu\x02\xcb\xfe\x12%'aX\xfe\xd5.!\xa6\xb0\ +h\x92\x10\x0a\x19\x84[\x94\x9f$2\xfe\xf8GK-\ +'\x00\x01\x00V\xfe\x93\x04%\x06\x14\x00\x1f\x00?@\ +\x1e\x18\x12\x12!\x0c\x06\x00\x03\x03\x09\x00\x09 !\x0e\ +\x1b\x1b \x15\x22\x09\x03\x07\x06\x07\x06FY\x07\x00\x00\ +?+\x11\x12\x0099\x18?\x113\x113\x11\x12\x01\ +99\x113\x11\x1292\x113\x11310\x134\ +\x00%\x06#!\x11!\x15\x04\x00\x15\x14\x16\x17\x16\x16\ +\x15\x14\x07!6654&&'.\x02V\x01\x01\ +\x01\x09K[\xfe\xd3\x03\x81\xfe\xe0\xfe\xf5m\xaa\x96\x95\ +\x8b\xfepAW&\x5ch\x83\x9aE\x01\xd7\xd4\x01\x94\ +\xc9\x16\x01\x22\xe7\xeb\xfeu\xceUQ&\x1f\x93}\xa3\ +\xb8G\x9c$\x1f$\x22\x1a\x1fl\xa4\x00\x01\x00\x87\xfe\ +\x14\x04\xd9\x04\x81\x00\x13\x002@\x19\x0c\x07\x07\x08\x00\ +\x13\x08\x13\x14\x15\x0b\x08\x0f\x0f\x03GY\x0f\x10\x09\x0f\ +\x08\x15\x00\x1c\x00????+\x11\x12\x009\x11\x12\ +\x0199\x113\x113\x11310\x01\x114#\x22\ +\x06\x15\x11!\x11!\x1736632\x16\x15\x11\x03\ +R\x89cX\xfey\x01'1\x172\xb1s\xbc\xd1\xfe\ +\x14\x04q\xc9\x9e\xc0\xfe\x10\x04m\x8cPP\xda\xc6\xfb\ +3\x00\x03\x00V\xff\xec\x04\xcd\x06+\x00\x0b\x00\x12\x00\ +\x19\x00?@ \x16\x0f\x10\x17\x10\x06\x17\x00\x06\x00\x1a\ +\x1b\x16\x10IY\x16\x16\x03\x09\x09\x13IY\x09\x01\x03\ +\x0cIY\x03\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x12\x0199\x113\x113\x11\x1299\ +10\x01\x10\x00! \x00\x11\x10\x00! \x00\x012\ +67!\x16\x16\x13\x22\x06\x07!&&\x04\xcd\xfe\xe3\ +\xfe\xdf\xfe\xeb\xfe\xdc\x01\x1a\x01\x1f\x01\x19\x01%\xfd\xc2\ +XU\x03\xfe\xa4\x02R\x5cVQ\x05\x01[\x07S\x03\ +\x0c\xfej\xfev\x01\x99\x01\x87\x01\x98\x01\x87\xfee\xfc\ +n\xc2\xc1\xbe\xc5\x04\x1b\xc0\xc6\xc6\xc0\x00\x01\x00\x85\xff\ +\xec\x03R\x04m\x00\x0d\x00\x1f@\x0e\x01\x0c\x0c\x07\x0e\ +\x0f\x0d\x0f\x09\x03GY\x09\x16\x00?+\x00\x18?\x11\ +\x12\x0199\x11310\x01\x11\x143267\x11\ +\x06#\x22&5\x11\x02\x0cu7^<\x85\xb0\xd2\xc6\ +\x04m\xfd\x18f\x15\x16\xfe\xe1?\xc5\xc2\x02\xfa\x00\xff\ +\xff\x00\x87\x00\x00\x05F\x04m\x02\x06\x00\xfa\x00\x00\x00\ +\x01\x00\x00\xff\xec\x05?\x06!\x00#\x00Q@)\x0d\ +\x03\x03\x07\x01\x07\x00\x01\x1f\x1f#\x1b\x1b\x11\x11\x15\x15\ +%#\x00\x00$\x19\x13GY\x19\x16\x1f\x01\x01\x00\x05\ +\x0b\x05GY\x0b\x01\x00\x15\x00??+\x11\x12\x009\ +\x113\x18?+\x11\x013\x113\x113\x113\x113\ +\x11\x129\x113\x129\x11\x129\x113101\x01\ +'&&#\x22\x07\x116632\x16\x17\x13\x1e\x02\ +327\x11\x06\x06#\x22&''&'#\x06\x07\ +\x03\x01\xe7\x0e\x1c]PCD(t!\xca\xe0I\xf6\ +!5:5%&\x17\x95-|\xad;F$\x0f\x08\ +\x14\x1d\xba\x04!)RR\x11\x013\x09\x08\xa7\xca\xfd\ +PZ_(\x0a\xfe\xe5\x0c\x16\x86\x9c\xbfjVwG\ +\xfe1\x00\xff\xff\x00\x87\xfe\x14\x04\xd9\x04m\x02\x06\x00\ +w\x00\x00\x00\x01\x00\x00\x00\x00\x04\xae\x04m\x00\x0d\x00\ +*@\x13\x0d\x0c\x05\x05\x01\x08\x08\x09\x09\x0f\x01\x00\x0e\ +\x04\x0d\x15\x08\x00\x0f\x00?2?3\x11\x0132\x12\ +9\x113\x11\x129\x113310\x11!\x13\x16\x17\ +36\x12\x11!\x10\x02\x03!\x01\x91\xcd\x17\x0c\x0aU\ +G\x01\x87\xcf\xeb\xfe\xb8\x04m\xfd\x81GG\x9f\x01f\ +\x01\x08\xfe\xac\xfd\xeb\xfe\xfc\x00\x00\x01\x00V\xfe\x93\x04\ +%\x06\x14\x00-\x00_@/\x18\x1c\x10\x09\x04\x04\x13\ +\x13\x0d\x06\x06\x00\x10\x10(\x22\x22\x1c\x00\x00/.\x1f\ +**.\x03\x16\x19\x16\x19FY\x16\x16.\x0e%\x22\ +\x11\x0d\x0e\x0dFY\x0e\x00\x00?+\x11\x003\x18?\ +\x11\x129/+\x11\x12\x009\x113\x113\x11\x12\x01\ +9\x1132\x1133\x11\x129\x1133\x129\x11\ +3\x11\x12910\x134675&5467\ +\x07\x06##\x11!\x11# \x15\x14\x1633\x11#\ +\x22\x06\x15\x14\x16\x16\x17\x04\x15\x14\x07!6654\ +&'&&V\x8d\x8c\xd9qc(;Y7\x03{\ +\xa4\xfe\xcdry\xa2\xa0\x90\x950tg\x017\x8b\xfe\ +pAWKt\xcf\xbe\x01\xaa\x8d\xb99\x08.\xc0T\ +v\x15\x04\x08\x01\x22\xfe\xde\xb7I>\xfe\xe2Xe9\ +<0\x15@\xf1\xa3\xb8G\x9c$,0\x1a.\xce\xff\ +\xff\x00V\xff\xec\x04\xc1\x04\x81\x02\x06\x00R\x00\x00\x00\ +\x01\x00\x17\xff\xec\x06\x0c\x04m\x00\x18\x00B@!\x12\ +\x10\x0a\x16\x0d\x0e\x16\x0e\x04\x10\x04\x14\x10\x14\x19\x1a\x15\ +\x0c\x10\x12\x10FY\x12\x0f\x0e\x15\x07\x00GY\x07\x16\ +\x00?+\x00\x18??+\x11\x0033\x11\x12\x019\ +9\x113\x11\x1299\x113\x113\x11310\x01\ +267\x11\x06\x06#\x22&5\x11#\x11!\x11#\ +57!\x11#\x11\x14\x16\x05q\x22W\x223\xa9S\ +\xad\xa5\xfc\xfey\xf1\xc8\x05-\xfa2\x01\x1f\x13\x10\xfe\ +\xf3 )\xb7\xbd\x01\xea\xfc\xb6\x03J\xa6}\xfe\xdd\xfe\ +A39\x00\x02\x00\x83\xfe\x14\x04\xdd\x04\x81\x00\x12\x00\ +\x1e\x00/@\x18\x16\x0a\x0a\x0b\x1c\x00\x0b\x00\x1f \x0f\ +\x13FY\x0f\x10\x0b\x1c\x03\x19GY\x03\x16\x00?+\ +\x00\x18??+\x11\x12\x0199\x113\x113\x113\ +10\x01\x10\x02#\x22&'#\x16\x15\x11!\x11\x10\ +\x00!2\x16\x12%\x22\x15\x15\x16\x1632654\ +&\x04\xdd\xee\xd0L\x923\x1a\x16\xfey\x01(\x01\x0b\ +\xa1\xfd\x89\xfd\xd3\xa6\x1f^+UIM\x025\xfe\xed\ +\xfe\xca$\x1f\x9el\xfe\xef\x04\x1b\x01\x18\x01:\x92\xfe\ +\xf4{\xfa\xfe%&\x84\x96\x9d\x8c\x00\x00\x01\x00V\xfe\ +\x93\x04)\x04\x81\x00 \x00-@\x16\x0c\x00\x19\x13\x05\ +\x13\x00\x03!\x22\x0f\x1c\x1c!\x16\x22\x03\x09GY\x03\ +\x10\x00?+\x00\x18?\x113\x113\x11\x12\x01\x179\ +\x113\x11310\x13\x10\x00!2\x17\x03&&#\ +\x22\x06\x15\x14\x16\x16\x17\x16\x16\x15\x14\x07!665\ +4&&'.\x02V\x01-\x01\x19\xcb\xc2oG\x9d\ +:Z_5xj\x96\x95\x8b\xfepAW+jU\ +\x85\x93J\x02-\x01\x1f\x015^\xfe\xe1\x1e,\x95\x92\ +X\x5c?\x17\x1f\x93}\xa3\xb8G\x9c$!%%\x14\ +\x1f\x80\xd5\x00\x02\x00V\xff\xec\x05=\x04m\x00\x0e\x00\ +\x1b\x005@\x1a\x06\x0f\x14\x0f\x03\x14\x08\x0b\x03\x0b\x1c\ +\x1d\x09\x19\x06\x19FY\x06\x0f\x00\x12GY\x00\x16\x00\ +?+\x00\x18?+\x11\x003\x11\x12\x0199\x113\ +3\x113\x11\x12910\x05 \x005\x10\x00!!\ +\x11!\x16\x15\x14\x06\x04\x01\x14\x163254&&\ +'#\x22\x06\x02\x98\xfe\xf4\xfe\xca\x01K\x01]\x02?\ +\xfe\xea\xb6\x8c\xfe\xfa\xfe\x9aaV\xb4\x11$2\x16\x7f\ +o\x14\x01\x22\xfe\x019\x01(\xfe\xdd\x84\xe9\x95\xe3y\ +\x02\x22qz\xf6@\x5cPE\x93\x00\x00\x01\x00\x17\xff\ +\xee\x03\xfa\x04m\x00\x12\x005@\x1b\x10\x0e\x07\x01\x12\ +\x01\x0c\x12\x0c\x0e\x03\x13\x14\x00\x0e\x10\x0eFY\x10\x0f\ +\x09\x04GY\x09\x16\x00?+\x00\x18?+\x11\x003\ +\x11\x12\x01\x179\x113\x11\x129\x11310\x01\x11\ +\x14\x16327\x11\x06#\x22&5\x11!57!\ +\x11\x02\xac40Or\x80\xb1\xcc\xaf\xfe\xf2\xc2\x03!\ +\x03J\xfeA48+\xfe\xe3?\xbd\xca\x01\xd5\xa6}\ +\xfe\xdd\x00\x00\x01\x00\x83\xff\xf0\x04\xec\x04m\x00\x14\x00\ +%@\x11\x06\x03\x0c\x12\x03\x12\x15\x16\x0e\x04\x0f\x00\x09\ +GY\x00\x16\x00?+\x00\x18?3\x11\x12\x0199\ +\x113\x11310\x05 \x00\x11\x11!\x11\x14\x163\ +2654\x03!\x16\x16\x15\x10\x00\x02\xa4\xfe\xf0\xfe\ +\xef\x01\x87OScUM\x01\x8b* \xfe\xe1\x10\x01\ +\x03\x01\x13\x02g\xfd\x85r]\x97\xb0\xdf\x01$\x9e\xed\ +\x80\xfe\xc6\xfe\xc8\x00\x02\x00V\xfe\x14\x06o\x04\x8f\x00\ +\x19\x00#\x00I@%\x08\x0e\x0b\x0b\x04!\x19\x19\x0e\ +\x00\x00\x1a\x04\x1a\x15\x04\x15$%\x12\x1dFY\x07\x12\ +\x10!\x0e\x01\x0eFY\x18\x01\x15\x00\x1c\x00??3\ ++\x11\x003\x18?\xc6+\x11\x12\x0199\x113\x11\ +\x129\x1133\x113\x113\x11\x12910\x01\x11\ +$\x0054\x127\x05\x06\x06\x15\x14\x16\x17\x1146\ +32\x00\x11\x10\x00\x05\x11\x134&#\x22\x06\x15\x11\ +66\x02\x98\xfe\xee\xfe\xd0ox\x01#ALe`\ +\xdc\xe6\xf6\x01\x1f\xfe\xbb\xfe\xe0\xdfHA1%iv\ +\xfe\x14\x01\xe4\x13\x01)\xf7\xa7\x01)\x94\xb0V\xeev\ +q\x7f\x1a\x01\x95\xe9\xe2\xfe\xe2\xfe\xff\xfe\xf7\xfe\xbf\x1a\ +\xfe\x1c\x04F~\x80EU\xfe]\x08\xa4\x00\x00\x01\xff\ +\xcb\xfe\x14\x05\x17\x04\x7f\x00\x1d\x00l@6\x0f\x0a\x0a\ +\x07\x0d\x0d\x06\x00\x19\x19\x1b\x13\x16\x16\x07\x04\x04\x05\x1b\ +\x05\x06\x06\x1f\x14\x15\x15\x1b\x1b\x1e\x13\x16\x15\x1c\x04\x05\ +\x07\x16\x16\x0f\x00\x0f\x0aGY\x0f\x1c\x05\x0f\x00\x19G\ +Y\x00\x10\x00?+\x00\x18??+\x11\x12\x009\x11\ +3\x129\x18?\x129\x11\x013\x113\x113\x113\ +\x113\x11\x129\x1133\x113\x129\x113\x113\ +\x11\x129\x11310\x012\x16\x17\x17\x13!\x01\x13\ +\x16327\x11\x06#\x22&''\x03!\x01\x03&\ +#\x22\x07\x116\x01\x10\xa0\xac>)\xbc\x01\x98\xfeZ\ +\xb4+T64l\x85\x86\xa81I\xf4\xfeJ\x01\xfc\ +w0Y=Hi\x04\x7f\x81\xa2j\x01{\xfd\x10\xfe\ +9n\x0e\xfe\xe7)\x93\x9d\xdf\xfd\xf1\x03\x84\x019{\ +\x19\x01%'\x00\x00\x01\x00\x83\xfe\x14\x06\xc5\x06\x12\x00\ +\x19\x00E@\x22\x15\x12\x06\x01\x01\x0e\x0e\x18\x0f\x0f\x04\ +\x12\x04\x0a\x12\x0a\x1a\x1b\x19\x00\x06\x13\x0f\x01\x18\x10\x18\ +GY\x0d\x10\x16\x0f\x1c\x00??3+\x11\x003\x18\ +?3?\x11\x12\x0199\x113\x11\x129\x1133\ +\x113\x119\x11310\x01\x11665\x10\x03!\ +\x16\x12\x15\x10\x00\x05\x11!\x11$\x11\x11!\x11\x14\x16\ +\x17\x11\x04T\x8biZ\x01x7(\xfe\xc5\xfe\xca\xfe\ +\x8d\xfd\xa2\x01}f{\x06\x12\xfb\x11\x0e\x84\x8f\x01\x05\ +\x01$\xab\xfe\xfa\x7f\xfe\xef\xfe\xd4\x10\xfe$\x01\xdc\x12\ +\x02+\x02@\xfd\xb6\x7fx\x09\x04\xef\x00\x01\x00b\xff\ +\xec\x06\xee\x04m\x00)\x00A@\x1f\x10\x0a\x03\x19\x19\ +\x16\x16\x0a '\x0a'*+\x17\x17#\x0d\x0f\x03\ +\x07\x1d\x13\x07\x13GY\x00\x07\x16\x00?3+\x11\x00\ +3\x129\x18?39/\x11\x12\x0199\x113\x11\ +\x129\x113\x129\x11310\x05\x22&'#\x06\ +\x06#\x22\x00\x114\x127!\x06\x11\x14\x16326\ +5\x11!\x11\x14\x16\x1632654\x02'!\x16\ +\x12\x15\x10\x00\x05\x00\x86\xa2*\x0c&\xa0\x8e\xe7\xfe\xfb\ +0;\x01\x8f}AOL3\x01t\x1636IG\ +\ +U\x1b\xfe#\x01\xaa\xb4\x0a\x1d\x1c\x18\x07\x0e\x22C\x95\ +\x01\xaa\xfeDS\xa0\xdf\x14\x1e\x01:%9H\x04\x16\ +\xfeB\x1aHML\x1c\x88\xb6\x01\x97\xfb\xfe\xc0\xb5S\ +\x00\xff\xff\x00L\xff\xec\x06\xdb\x05\xcb\x02\x06\x01s\x00\ +\x00\xff\xff\x00\x04\x00\x00\x05\xc3\x05\xb6\x02\x06\x00;\x00\ +\x00\x00\x01\x00\x9e\xfe9\x06\x81\x05\xb6\x00\x0b\x006@\ +\x1a\x09\x00\x00\x08\x02\x08\x05\x03\x02\x05\x02\x0c\x0d\x0a\x06\ +\x03\x00\x08\x05\x08NY\x05\x12\x03\x1b\x00??+\x11\ +\x003\x18?3\x11\x12\x0199\x113\x113\x11\x12\ +9\x11310\x01!\x11!\x11!\x11!\x11!\x11\ +!\x05N\x013\xfe\x7f\xfb\x9e\x01\x8d\x01\x96\x01\x8d\x01\ +D\xfc\xf5\x01\xc7\x05\xb6\xfb\x8e\x04r\x00\x01\x00j\x00\ +\x00\x05u\x05\xb6\x00\x11\x00-@\x16\x0a\x07\x0f\x01\x01\ +\x00\x07\x00\x12\x13\x04\x0dNY\x04\x04\x01\x10\x08\x03\x01\ +\x12\x00??3\x129/+\x11\x12\x0199\x113\ +\x113\x11310!!\x11\x06#\x22&5\x11!\ +\x11\x14\x16327\x11!\x05u\xfer\xfd\xc7\xd0\xe9\ +\x01\x8eV^\x80\xbb\x01\x8e\x02\x1dX\xcd\xba\x02j\xfe\ +\x19k\x5cD\x02j\x00\x00\x01\x00\x9e\x00\x00\x08\x17\x05\ +\xb6\x00\x0b\x005@\x19\x04\x01\x08\x05\x05\x09\x01\x09\x00\ +\x01\x00\x0c\x0d\x0a\x06\x02\x03\x08\x04\x01\x04NY\x01\x12\ +\x00?+\x11\x003\x18?33\x11\x12\x0199\x11\ +3\x11\x129\x113\x11310!!\x11!\x11!\ +\x11!\x11!\x11!\x08\x17\xf8\x87\x01\x8d\x01m\x01\x85\ +\x01l\x01\x8e\x05\xb6\xfb\x8e\x04r\xfb\x8e\x04r\x00\x00\ +\x01\x00\x9e\xfe9\x09J\x05\xb6\x00\x0f\x00D@!\x07\ +\x04\x04\x00\x08\x08\x0b\x0b\x0d\x03\x03\x00\x0e\x0d\x00\x0d\x10\ +\x11\x0e\x1b\x09\x05\x01\x03\x0b\x07\x03\x00\x03NY\x00\x12\ +\x00?+\x11\x0033\x18?33?\x11\x12\x019\ +9\x113\x113\x11\x129\x113\x11\x129\x1131\ +03\x11!\x11!\x11!\x11!\x11!\x11!\x11!\ +\x11\x9e\x01\x8d\x01m\x01\x85\x01l\x01\x8e\x013\xfe\x7f\ +\x05\xb6\xfb\x8e\x04r\xfb\x8e\x04r\xfb\x8e\xfc\xf5\x01\xc7\ +\x00\x00\x02\x003\x00\x00\x05\xd1\x05\xb6\x00\x0c\x00\x13\x00\ +A@!\x09\x0d\x0d\x04\x04\x06\x10\x10\x00\x06\x00\x14\x15\ +\x09\x13PY\x09\x09\x04\x07\x07\x06NY\x07\x03\x04\x0d\ +PY\x04\x12\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x0199\x113\x11\x129\x113\x113\ +10\x01\x14\x04!!\x11!\x11!\x113 \x04\x01\ +3254##\x05\xd1\xfe\xc1\xfe\xdb\xfe+\xfe\x9b\ +\x02\xf29\x012\x01A\xfdT5\xe8\xea3\x01\xe5\xea\ +\xfb\x04s\x01C\xfd\xf8\xe7\xfej\xac\xa6\x00\x00\x03\x00\ +\x9e\x00\x00\x06\xc5\x05\xb6\x00\x0a\x00\x11\x00\x15\x00A@\ + \x0e\x00\x00\x13\x07\x0b\x0b\x04\x13\x12\x04\x12\x16\x17\x13\ +\x12\x07\x11PY\x07\x07\x04\x14\x05\x03\x04\x0bPY\x04\ +\x12\x00?+\x00\x18?3\x129/+\x00\x18?\x11\ +\x12\x0199\x113\x113\x113\x129\x11310\ +\x01\x14\x04!!\x11!\x113 \x04\x013254\ +##\x01!\x11!\x04\xb2\xfe\xc1\xfe\xdb\xfeP\x01\x8d\ +\x14\x012\x01A\xfdy\x10\xe8\xea\x0e\x04\x9a\xfer\x01\ +\x8e\x01\xe5\xea\xfb\x05\xb6\xfd\xf8\xe7\xfej\xac\xa6\xfd}\ +\x05\xb6\x00\x00\x02\x00\x9e\x00\x00\x04\xb2\x05\xb6\x00\x0a\x00\ +\x11\x002@\x19\x07\x0b\x0b\x04\x0e\x00\x04\x00\x12\x13\x07\ +\x11PY\x07\x07\x04\x05\x03\x04\x0bPY\x04\x12\x00?\ ++\x00\x18?\x129/+\x11\x12\x0199\x113\x11\ +3\x11310\x01\x14\x04!!\x11!\x113 \x04\ +\x013254##\x04\xb2\xfe\xc1\xfe\xdb\xfeP\x01\ +\x8d\x14\x012\x01A\xfdy\x12\xe8\xea\x10\x01\xe5\xea\xfb\ +\x05\xb6\xfd\xf8\xe7\xfeh\xac\xa4\x00\x01\x00R\xff\xec\x04\ +\xf2\x05\xc9\x00\x1a\x00L@&\x16\x0f\x15\x0f\x04\x18\x15\ +\x15\x0a\x04\x0a\x1b\x1c\x10\x12\x16\x17\x16OY\x03\x00\x17\ +\x17\x0d\x07\x0d\x12NY\x0d\x13\x07\x00NY\x07\x04\x00\ +?+\x00\x18?+\x11\x12\x009\x18/\x129+\x11\ +\x12\x009\x11\x12\x0199\x113\x113\x113\x11\x12\ +910\x01\x22\x06\x07\x03663 \x00\x11\x10\x00\ +! '\x11\x163267!\x11!&&\x02)\ +H\xcaRs\x88\xe6w\x01N\x01m\xfe\x95\xfe\xa4\xfe\ +\xfd\xcc\xee\xe1\x86\x96\x09\xfd\xb8\x02H\x09\x9b\x04\x852\ +(\x015;.\xfe{\xfe\x9b\xfe\x8f\xfe~S\x01L\ +\x5c\x84~\x01>\x86\x90\x00\x02\x00\x9e\xff\xec\x081\x05\ +\xcd\x00\x10\x00\x19\x00I@&\x0b\x07\x07\x11\x0c\x05\x05\ +\x08\x16\x16\x00\x08\x00\x1a\x1b\x0e\x18NY\x0e\x04\x0b\x06\ +NY\x0b\x0b\x08\x09\x03\x08\x12\x03\x13NY\x03\x13\x00\ +?+\x00\x18??\x129/+\x00\x18?+\x11\x12\ +\x0199\x113\x11\x129\x11332\x11310\ +\x01\x10\x00! \x03#\x11!\x11!\x113\x12! \ +\x00\x01\x103265\x10#\x22\x081\xfe\xae\xfe\xbd\ +\xfd\xc0=\xf4\xfes\x01\x8d\xfaN\x02+\x01D\x01O\ +\xfcu\xf6|y\xf3\xf8\x02\xdd\xfe\x8d\xfe\x82\x02h\xfd\ +\xac\x05\xb6\xfd\xe2\x025\xfe\x82\xfe\x8e\xfeX\xce\xda\x01\ +\xac\x00\x02\xff\xec\x00\x00\x04\xd1\x05\xb6\x00\x0c\x00\x15\x00\ +P@(\x03\x00\x00\x11\x15\x15\x0b\x11\x06\x06\x02\x0b\x0b\ +\x0a\x0a\x16\x17\x01\x02\x02\x16\x00\x15QY\x03\x08\x00\x00\ +\x02\x08\x08\x0ePY\x08\x03\x0b\x02\x12\x00?3?+\ +\x11\x12\x009\x18/\x129+\x11\x013\x113\x11\x12\ +9\x113\x11\x129\x113\x113\x11\x129\x1131\ +0\x01\x01!\x01&&5\x10!!\x11!\x11\x11#\ +\x22\x06\x15\x14\x1633\x02\xcd\xfe\xdf\xfe@\x01\x91o\ +v\x02T\x01\xe5\xfeuT_lgnJ\x02\x14\xfd\ +\xec\x02\x7f>\xcb~\x01\xb0\xfaJ\x02\x14\x02wLK\ +[\x5c\x00\xff\xff\x00J\xff\xec\x04y\x04\x81\x02\x06\x00\ +D\x00\x00\x00\x02\x00X\xff\xec\x04\xdf\x06'\x00\x19\x00\ +#\x00V@+\x04\x0a\x0a\x0d\x07\x0d!!\x00\x07\x1c\ +\x14\x00\x14$%\x0d\x1e\x11\x11\x1eIY\x02\x0b\x0b\x07\ +\x11\x11\x17\x06\x17\x1aFY\x17\x16\x06\x07GY\x06\x01\ +\x00?+\x00\x18?+\x11\x12\x009\x18/\x129\x11\ +3+\x11\x12\x009\x11\x12\x0199\x1133\x113\ +\x113\x11\x129\x11310\x134\x1266$%\ +\x13\x06\x04\x0e\x02\x0736632\x16\x15\x10\x00!\ + \x00\x052\x114#\x22\x06\x07\x14\x16X=\x8b\xdf\ +\x01:\x01\x81%t\xfep\x83Q'\x05\x11#\xa8h\ +\xd4\xe6\xfe\xcd\xfe\xf0\xfe\xf4\xfe\xce\x02R\xa2\x94:\x84\ +\x15j\x02\xa6\xac\x01\x15\xcd\x8aI \xfe\xbc\x09+*\ +GkVF^\xfb\xed\xfe\xeb\xfe\xc8\x01pN\x01\x00\ +\xfc]0\xa4\xcb\x00\x03\x00\x87\x00\x00\x05\x00\x04m\x00\ +\x0e\x00\x16\x00\x1e\x00N@'\x03\x17\x17\x00\x00\x07\x1b\ +\x14\x14\x0a\x0f\x07\x0a\x07\x1f \x03\x1b\x13\x1b\x13LY\ +\x1b\x1b\x0a\x0b\x0b\x1aKY\x0b\x0f\x0a\x14KY\x0a\x15\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x009\x11\x12\x0199\x113\x113\x113\x129\x11\ +3\x12910\x01\x14\x06\x07\x15\x16\x16\x15\x10!!\ +\x11!2\x16\x014&##\x1532\x034##\ +\x15326\x04\xddtez\x82\xfd\xf0\xfd\x97\x02k\ +\xf7\xf4\xfe\x96HD\xd9\xd5\x90\x1bl\xde\xcf>=\x03\ +Hc\x82\x11\x08\x0e\x8bm\xfe\xbc\x04m\x90\xfd\x8d5\ +.\xcd\x02\x14Y\xaa.\x00\x01\x00\x87\x00\x00\x03\xd1\x04\ +m\x00\x05\x00\x1d@\x0e\x03\x04\x04\x00\x06\x07\x05\x02F\ +Y\x05\x0f\x04\x15\x00??+\x11\x12\x0199\x113\ +10\x01\x11!\x11!\x11\x03\xd1\xfe=\xfey\x04m\ +\xfe\xdd\xfc\xb6\x04m\x00\x00\x02\x00\x19\xfe`\x05\xb2\x04\ +m\x00\x0d\x00\x13\x00M@'\x0a\x10\x10\x0e\x13\x13\x07\ +\x07\x0e\x0e\x0c\x0c\x05\x01\x00\x00\x15\x04\x05\x05\x14\x0a\x10\ +FY\x0a\x0f\x01\x05#\x13\x0c\x06\x03\x06FY\x03\x15\ +\x00?+\x11\x0033\x18?3?+\x11\x013\x11\ +3\x113\x113\x129\x113\x119\x113\x11\x129\ +\x11310\x01!\x11!\x11!\x1136\x127!\ +\x113!\x11#\x06\x02\x07\x05\xb2\xfe\xaa\xfd\x13\xfe\xaa\ +dWw\x17\x03\xa8\xa8\xfd\xd1\xdf\x12>;\xfe`\x01\ +\xa0\xfe`\x02\xc3\x94\x01\xbb\xfb\xfc\xb6\x02'\x87\xff\x00\ +\xa0\xff\xff\x00V\xff\xec\x04\x9c\x04\x81\x02\x06\x00H\x00\ +\x00\x00\x01\xff\xf8\x00\x00\x07\xcb\x04m\x00\x11\x00R@\ +'\x06\x03\x0a\x0a\x0f\x00\x0b\x0b\x07\x04\x05\x05\x08\x07\x07\ +\x13\x11\x10\x10\x0d\x0e\x12\x09\x03\x06\x06\x0c\x00\x0f\x0f\x0e\ +\x04\x01\x10\x0f\x0b\x08\x0e\x15\x00?33?33\x12\ +9\x11333\x1133\x11\x01322\x113\x11\ +3\x1133\x113\x119\x11333\x11331\ +0\x01\x11!\x11\x01!\x01\x01!\x01\x11!\x11\x01!\ +\x01\x01!\x03#\x01}\x01`\x01\xa4\xfe\x81\x01\xa6\xfe\ +V\xfe\x7f\xfe\x83\xfe\x7f\xfeV\x01\xa6\xfe\x81\x01\xa4\x02\ +H\x02%\xfd\xdb\x02%\xfd\xe5\xfd\xae\x02?\xfd\xc1\x02\ +?\xfd\xc1\x02R\x02\x1b\x00\x01\x00H\xff\xec\x04/\x04\ +\x81\x00%\x00X@,$\x1a\x11\x03\x03\x0e\x0e\x08\x15\ +\x08\x1a \x15\x1a\x15&'\x1b\x1d\x11%$%$K\ +Y\x07\x05%%\x17\x0b\x17\x1dFY\x17\x16\x0b\x05I\ +Y\x0b\x10\x00?+\x00\x18?+\x11\x12\x009\x18/\ +\x129+\x11\x12\x009\x129\x11\x12\x0199\x113\ +\x113\x11\x129\x113\x129\x11910\x0126\ +54#\x22\x07\x036632\x04\x15\x14\x06\x07\x15\ +\x16\x16\x15\x10!\x22&'\x11\x1632654&\ +##5\x01\xb4uf\x95\x91\x9eoy\xc5p\xf3\x01\ +\x03o^x\x84\xfd\xc9}\xc3p\xc1\xd8]j_|\ +\x94\x02\xcb(,KG\x01\x082$\x9f\x94[\x85\x18\ +\x0a\x10\x8ap\xfe\xaa /\x01+X016(\xfe\ +\x00\x00\x01\x00\x87\x00\x00\x05J\x04m\x00\x0e\x00.@\ +\x15\x0c\x05\x01\x08\x01\x0d\x08\x07\x0d\x07\x0f\x10\x04\x0b\x0d\ +\x05\x0e\x0f\x08\x0d\x15\x00?3?3\x1299\x11\x12\ +\x0199\x113\x113\x11\x129910\x01\x11\x14\ +\x06\x03\x01!\x11!\x1147\x01!\x11\x01\xe3\x01\x0d\ +\x01\xc5\x01\xb0\xfe\xa4\x0e\xfe=\xfeN\x04m\xfe\xe3\x18\ +8\xfe\xb8\x02\xb5\xfb\x93\x013\xa1\xdc\xfdP\x04m\xff\ +\xff\x00\x87\x00\x00\x05J\x06V\x02&\x01\xd2\x00\x00\x01\ +\x07\x026\x00\xac\x00\x00\x00\x08\xb3\x01\x0f\x11&\x00+\ +5\x00\x01\x00\x87\x00\x00\x05q\x04m\x00\x0a\x006@\ +\x19\x04\x03\x03\x00\x01\x01\x0a\x02\x06\x06\x07\x07\x0c\x0b\x0a\ +\x05\x02\x02\x07\x00\x08\x0f\x04\x07\x15\x00?3?3\x12\ +9\x1133\x11\x12\x019\x113\x11332\x113\ +2\x11310\x01!\x01\x01!\x01\x11!\x11!\x11\ +\x03\xa0\x01\xb0\xfeX\x01\xc9\xfeA\xfe\x5c\xfey\x01\x87\ +\x04m\xfd\xe1\xfd\xb2\x02?\xfd\xc1\x04m\xfd\xdb\x00\x00\ +\x01\x00\x10\xff\xec\x04\xf8\x04m\x00\x12\x001@\x19\x11\ +\x03\x03\x0a\x01\x01\x00\x0a\x00\x13\x14\x11\x03FY\x11\x0f\ +\x07\x0cGY\x07\x16\x01\x15\x00??+\x00\x18?+\ +\x11\x12\x0199\x113\x11\x129\x11310!!\ +\x11#\x02\x02\x06#\x22'\x11\x163266\x127\ +!\x04\xf8\xfey\xe6!d\xb0\x95hI!7-8\ ++#\x10\x03\xcd\x03J\xfe\x93\xfe\xa9\x9a\x1e\x01#\x12\ +]\xcc\x01@\xe9\x00\x01\x00\x87\x00\x00\x06X\x04m\x00\ +\x17\x00<@\x1d\x06\x05\x12\x16\x12\x0e\x03\x0b\x01\x0b\x0c\ +\x01\x00\x0c\x00\x18\x19\x02\x0a\x12\x0a\x0c\x16\x0d\x0f\x06\x01\ +\x0c\x15\x00?33?3\x1299\x113\x11\x12\x01\ +99\x113\x113\x11\x12\x179\x113310!\ +!\x11\x06\x02\x03!\x03&''\x11!\x11!\x13\x16\ +\x12\x17677\x13!\x06X\xfe\xa2 Q\x93\xfe\xf6\ +u;A\x16\xfe\xa2\x02\x17X\x19X\x0a\x06A'm\ +\x02\x0c\x03N\x81\xfe\xed\xfeF\x01j\xb6\xe3K\xfc\xb2\ +\x04m\xfe\xf7L\xfe\xb5@/\xdb\x86\x01P\x00\x01\x00\ +\x87\x00\x00\x04\xcb\x04m\x00\x0b\x003@\x19\x01\x09\x09\ +\x0a\x02\x06\x06\x05\x0a\x05\x0c\x0d\x01\x08FY\x01\x01\x0a\ +\x03\x0b\x0f\x06\x0a\x15\x00?3?3\x129/+\x11\ +\x12\x0199\x113\x113\x113\x11310\x01\x11\ +!\x11!\x11!\x11!\x11!\x11\x02\x0e\x016\x01\x87\ +\xfey\xfe\xca\xfey\x04m\xfeh\x01\x98\xfb\x93\x01\xb2\ +\xfeN\x04m\x00\xff\xff\x00V\xff\xec\x04\xc1\x04\x81\x02\ +\x06\x00R\x00\x00\x00\x01\x00\x87\x00\x00\x04\xba\x04m\x00\ +\x07\x00#@\x11\x05\x06\x02\x01\x06\x01\x08\x09\x07\x04F\ +Y\x07\x0f\x02\x06\x15\x00?3?+\x11\x12\x0199\ +\x113\x11310\x01\x11!\x11!\x11!\x11\x04\xba\ +\xfey\xfe\xdb\xfey\x04m\xfb\x93\x03J\xfc\xb6\x04m\ +\x00\xff\xff\x00\x87\xfe\x14\x04\xcd\x04\x81\x02\x06\x00S\x00\ +\x00\xff\xff\x00V\xff\xec\x04\x1d\x04\x81\x02\x06\x00F\x00\ +\x00\x00\x01\x001\x00\x00\x04\xa2\x04m\x00\x07\x00$@\ +\x12\x02\x03\x00\x03\x05\x03\x08\x09\x01\x05\x06\x05FY\x06\ +\x0f\x03\x15\x00??+\x11\x003\x11\x12\x01\x179\x11\ +310\x01!\x11!\x11!\x11!\x04\xa2\xfe\x8b\xfe\ +y\xfe\x8b\x04q\x03J\xfc\xb6\x03J\x01#\xff\xff\xff\ +\xfe\xfe\x14\x04\xe1\x04m\x02\x06\x00\x5c\x00\x00\x00\x03\x00\ +V\xfe\x14\x06\x98\x06\x14\x00\x11\x00\x18\x00\x1f\x00N@\ +'\x12\x1d\x0f\x04\x04\x15\x0c\x05\x05\x09\x19\x19\x00\x09\x00\ + !\x0d\x00\x1c\x16\x0c\x16FY\x0f\x0c\x0f\x1d\x15\x06\ +\x15FY\x03\x06\x15\x05\x1c\x00??3+\x11\x003\ +\x18?3+\x11\x003\x18?\x11\x12\x0199\x113\ +\x11\x129\x11333\x1133210\x01\x14\x00\ +\x05\x11!\x11$\x005\x10\x00%\x11!\x11\x04\x00\x05\ +\x14\x16\x17\x11\x06\x06\x054&'\x1166\x06\x98\xfe\ +\xc0\xfe\xd9\xfe\x92\xfe\xde\xfe\xb5\x018\x010\x01s\x01\ +%\x01B\xfbA\x83b^\x87\x039\x81`b\x7f\x02\ +5\xf6\xfe\xda\x19\xfe\x14\x01\xec\x1e\x01+\xec\x01\x02\x01\ +#\x13\x01\xa7\xfeY\x1a\xfe\xd4\xf2u\x9b\x02\x02'\x04\ +\xa2or\x9f\x04\xfd\xd9\x02\x99\xff\xff\x00\x0a\x00\x00\x05\ +\x00\x04m\x02\x06\x00[\x00\x00\x00\x01\x00\x87\xfe`\x05\ +\xfe\x04m\x00\x0b\x006@\x1a\x07\x0a\x0a\x06\x00\x06\x03\ +\x01\x00\x03\x00\x0c\x0d\x08\x04\x0f\x0a\x06\x03\x06FY\x03\ +\x15\x01#\x00??+\x11\x003\x18?3\x11\x12\x01\ +99\x113\x113\x11\x129\x11310\x01!\x11\ +!\x11!\x11!\x11!\x113\x05\xfe\xfe\xaa\xfb\xdf\x01\ +\x87\x01k\x01\x87\xfe\xfe`\x01\xa0\x04m\xfc\xb6\x03J\ +\xfc\xb6\x00\x00\x01\x00V\x00\x00\x04\xd7\x04m\x00\x10\x00\ +-@\x16\x01\x0f\x05\x09\x09\x08\x0f\x08\x11\x12\x0c\x03F\ +Y\x0c\x0c\x09\x06\x10\x0f\x09\x15\x00??3\x129/\ ++\x11\x12\x0199\x113\x113\x11310\x01\x11\ +\x14327\x11!\x11!\x11\x06#\x22&5\x11\x01\ +\xddkr\x96\x01\x87\xfey\xc2\xa5\xce\xc5\x04m\xfer\ +u2\x01\xd1\xfb\x93\x01\x9cT\xbd\xc6\x01\xa2\x00\x01\x00\ +\x87\x00\x00\x07\x81\x04m\x00\x0b\x003@\x18\x04\x08\x05\ +\x05\x01\x09\x09\x00\x01\x00\x0c\x0d\x0a\x06\x02\x0f\x08\x04\x01\ +\x04FY\x01\x15\x00?+\x11\x003\x18?33\x11\ +\x12\x0199\x113\x11\x129\x113210!!\ +\x11!\x11!\x11!\x11!\x11!\x07\x81\xf9\x06\x01\x87\ +\x01:\x01}\x015\x01\x87\x04m\xfc\xb6\x03J\xfc\xb6\ +\x03J\x00\x00\x01\x00\x87\xfe`\x08\x7f\x04m\x00\x0f\x00\ +D@!\x0c\x09\x09\x05\x0d\x0d\x00\x00\x08\x02\x08\x05\x03\ +\x02\x05\x02\x10\x11\x0e\x0a\x06\x0f\x0c\x00\x08\x05\x08FY\ +\x05\x15\x03#\x00??+\x11\x0033\x18?33\ +\x11\x12\x0199\x113\x113\x11\x129\x113\x11\x12\ +9\x11310\x013\x11!\x11!\x11!\x11!\x11\ +!\x11!\x11!\x07\x81\xfe\xfe\xaa\xf9^\x01\x87\x01:\ +\x01}\x015\x01\x87\x01#\xfd=\x01\xa0\x04m\xfc\xb6\ +\x03J\xfc\xb6\x03J\x00\x00\x02\x001\x00\x00\x05s\x04\ +m\x00\x0d\x00\x15\x00K@(\x05\x13\x13\x00\x00\x0e\x02\ +\x0e\x0a\x02\x0a\x16\x17\x05\x12KY\x0f\x05\x1f\x05\x02\x0c\ +\x03\x05\x05\x00\x03\x03\x02FY\x03\x0f\x00\x13KY\x00\ +\x15\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]+\x11\x12\x0199\x113\x11\x129\x113\x113\ +10!\x11!\x11!\x1132\x16\x16\x15\x14\x06!\ +\x134&##\x1532\x01\x98\xfe\x99\x02\xee%\xc7\ +\xf5s\xfe\xfe\xfeyBN=A\x8c\x03J\x01#\xfe\ +hI\x97~\xc3\xb4\x01f;4\xd5\x00\x03\x00\x87\x00\ +\x00\x06f\x04m\x00\x03\x00\x0e\x00\x16\x00I@'\x0f\ +\x09\x09\x01\x05\x14\x14\x0d\x01\x00\x0d\x00\x17\x18\x05\x13K\ +Y\x0f\x05\x1f\x05\x02\x0c\x03\x05\x05\x0d\x02\x0e\x0f\x0d\x14\ +KY\x0d\x15\x01\x15\x00??+\x00\x18?3\x129\ +/_^]+\x11\x12\x0199\x113\x113\x113\ +\x129\x11310!!\x11!!\x113 \x04\x15\ +\x14\x06!!\x11\x014&##\x1532\x06f\xfe\ +y\x01\x87\xfb\xa8%\x01'\x01\x08\xfe\xfe\xfe\xfe%\x02\ +TBM>B\x8b\x04m\xfeh\xa4\xba\xc3\xb4\x04m\ +\xfc\xf9;4\xd5\x00\x02\x00\x87\x00\x00\x04b\x04m\x00\ +\x0a\x00\x12\x00<@ \x01\x10\x10\x09\x0b\x05\x09\x05\x13\ +\x14\x01\x0fKY\x0f\x01\x1f\x01\x02\x0c\x03\x01\x01\x09\x0a\ +\x0f\x09\x10KY\x09\x15\x00?+\x00\x18?\x129/\ +_^]+\x11\x12\x0199\x113\x113\x1131\ +0\x01\x113 \x04\x15\x14\x06!!\x11\x014&#\ +#\x1532\x02\x0e%\x01'\x01\x08\xfe\xfe\xfe\xfe%\ +\x02TBM>B\x8b\x04m\xfeh\xa4\xba\xc3\xb4\x04\ +m\xfc\xf9;4\xd5\x00\x00\x01\x003\xff\xec\x03\xfe\x04\ +\x81\x00\x1b\x00G@$\x03\x0a\x13\x0c\x09\x09\x19\x13\x19\ +\x1c\x1d\x12\x0b\x0f\x16\x0fIY\x04\x0a\x06\x0b\x0aLY\ +\x0b\x0b\x00\x16\x10\x00\x06IY\x00\x16\x00?+\x00\x18\ +?\x129/+\x11\x12\x009+\x11\x12\x009\x11\x12\ +\x0199\x113\x113\x129210\x05\x22&'\ +\x11\x163267!5!&&#\x22\x06\x07'\ +6632\x00\x11\x10\x00\x01\xc3t\xb8Q\xbd\x90g\ +v\x01\xfe}\x01\x83\x04iT<\x93?o`\xe4j\ +\xfd\x01 \xfe\xd8\x14\x22+\x01%\x5cbT\xf6Xd\ +\x22\x1f\xfc-/\xfe\xd9\xfe\xf0\xfe\xda\xfe\xc8\x00\x02\x00\ +\x87\xff\xec\x06\xe1\x04\x81\x00\x13\x00\x1f\x00S@-\x14\ +\x0d\x06\x06\x1a\x0c\x08\x08\x09\x1a\x00\x09\x00 !\x10\x1d\ +FY\x10\x10\x0c\x07FY\x0f\x0c\x1f\x0c\x02\x0c\x03\x0c\ +\x0c\x09\x0a\x0f\x09\x15\x03\x17FY\x03\x16\x00?+\x00\ +\x18??\x129/_^]+\x00\x18?+\x11\x12\ +\x0199\x113\x113\x113\x129\x113310\ +\x01\x10\x00!\x22$'#\x11!\x11!\x1136$\ +32\x16\x12\x05\x14\x1632654&#\x22\x06\ +\x06\xe1\xfe\xde\xfe\xfb\xd6\xfe\xe5#\x98\xfey\x01\x87\x9a\ +&\x01\x17\xdc\xa2\xf7\x87\xfdHGNRDESP\ +C\x029\xfe\xe8\xfe\xcb\xee\xd8\xfeN\x04m\xfeh\xce\ +\xde\x8c\xfe\xf8\xb4\x9a\x91\x99\x92\x91\x94\x93\x00\x00\x02\xff\ +\xe7\x00\x00\x04X\x04m\x00\x0d\x00\x16\x00P@(\x02\ +\x0d\x0d\x0e\x12\x12\x0b\x0e\x05\x05\x01\x0b\x0b\x0a\x0a\x18\x17\ +\x00\x01\x01\x17\x0d\x12KY\x02\x08\x0d\x0d\x01\x08\x08\x14\ +KY\x08\x0f\x0b\x01\x15\x00?3?+\x11\x12\x009\ +\x18/\x129+\x11\x013\x113\x11\x129\x113\x11\ +\x129\x113\x113\x11\x129\x11310!!\x01\ +&&54$3!\x11!\x11#\x03\x14\x1633\ +5#\x22\x06\x01\x85\xfeb\x01#Xf\x01\x03\xec\x02\ +\x1d\xfeys\x8bJEoqBK\x01\xae0\xb0t\ +\xae\xbd\xfb\x93\x01\x89\x01m49\xe4>\x00\xff\xff\x00\ +V\xff\xec\x04\x9c\x06#\x02&\x00H\x00\x00\x01\x06\x00\ +j\x1d\x00\x00\x0a\xb4\x03\x021\x11&\x00+55\x00\ +\x01\x00\x00\xfe\x14\x04\xee\x06\x14\x00'\x00Y@.\x1c\ +\x1d\x00\x1d\x06\x0b\x1a\x12\x12\x17\x15\x13\x0b\x00\x13\x00(\ +)$\x0eGY\x1d\x15\x16\x15LY\x1a\x16 $\x16\ +$\x16\x13\x18\x00\x13\x15\x03\x09GY\x03\x1c\x00?+\ +\x00\x18??\x1299//9\x113+\x11\x003\ ++\x11\x12\x0199\x113\x11333\x113\x129\ +3\x11\x12910\x05\x14\x06#\x22&'\x11\x163\ +25\x114#\x22\x06\x15\x11!\x11#535!\ +\x153\x15#\x15\x14\x0736632\x16\x15\x04\xee\ +\xdb\xc71\x81'B\x8b\x02\xd5\xa4\xba\xc3\ +\xb4\x03J\xfe\x93\xfe\xa9\x9a\x1e\x01#\x12]\xcc\x01@\ +\xe9\xfeh\xfe\x91;4\xd5\x00\x00\x02\x00\x87\x00\x00\x06\ +\xe3\x04m\x00\x12\x00\x1a\x00\x5c@1\x00\x18\x18\x10\x08\ +\x08\x13\x0f\x0b\x0b\x0c\x13\x04\x0c\x04\x1b\x1c\x0f\x0aFY\ +\x0f\x0f\x00\x00\x17KY\x0f\x00\x1f\x00\x02\x0c\x03\x00\x00\ +\x08\x11\x0d\x0f\x0c\x15\x08\x18KY\x08\x15\x00?+\x00\ +\x18??3\x129/_^]+\x11\x003\x18/\ ++\x11\x12\x0199\x113\x113\x113\x129\x113\ +3\x11310\x013 \x04\x15\x14\x06!!\x11#\ +\x11!\x11!\x113\x11!\x134&##\x1532\ +\x04\x8f%\x01'\x01\x08\xfe\xfe\xfe\xfe%\xfa\xfey\x01\ +\x87\xfa\x01\x87\xcdBM>B\x8b\x02\xd5\xa4\xba\xc3\xb4\ +\x01\xb2\xfeN\x04m\xfeh\x01\x98\xfc\xf9;4\xd5\xff\ +\xff\x00\x00\x00\x00\x04\xee\x06\x14\x02\x06\x00\xe9\x00\x00\xff\ +\xff\x00\x87\x00\x00\x05q\x06!\x02&\x01\xd4\x00\x00\x01\ +\x07\x00v\x01\x08\x00\x00\x00\x08\xb3\x01\x14\x11&\x00+\ +5\xff\xff\xff\xfe\xfe\x14\x04\xe1\x06V\x02&\x00\x5c\x00\ +\x00\x01\x06\x026'\x00\x00\x08\xb3\x01\x17\x11&\x00+\ +5\x00\x01\x00\x87\xfe`\x04\xfc\x04m\x00\x0b\x004@\ +\x19\x04\x0a\x0b\x0b\x01\x05\x05\x08\x01\x08\x0c\x0d\x0b#\x06\ +\x02\x0f\x09\x01\x01\x04FY\x01\x15\x00?+\x11\x003\ +\x18?3?\x11\x12\x0199\x113\x11\x129\x113\ +210!!\x11!\x11!\x11!\x11!\x11!\x02\ +\x17\xfep\x01\x87\x01g\x01\x87\xfeq\xfe\xaa\x04m\xfc\ +\xb6\x03J\xfb\x93\xfe`\x00\x01\x00\x9e\x00\x00\x04\xb6\x06\ +\xf0\x00\x07\x00#@\x11\x05\x06\x00\x03\x06\x03\x08\x09\x07\ +\x04OY\x01\x07\x03\x06\x12\x00??\xc6+\x11\x12\x01\ +99\x113\x11310\x01\x11!\x11!\x11!\x11\ +\x03\x5c\x01Z\xfdu\xfes\x05\xb6\x01:\xfd\x87\xfb\x89\ +\x05\xb6\x00\x00\x01\x00\x87\x00\x00\x04\x02\x05\x93\x00\x07\x00\ +#@\x11\x00\x01\x03\x06\x01\x06\x08\x09\x02\x07FY\x04\ +\x02\x0f\x01\x15\x00??\xc6+\x11\x12\x0199\x113\ +\x11310!!\x11!\x11!\x11!\x02\x0e\xfey\ +\x02%\x01V\xfe\x0c\x04m\x01&\xfd\xb7\x00\xff\xff\x00\ +\x1f\x00\x00\x081\x07s\x02&\x00:\x00\x00\x01\x07\x00\ +C\x01T\x01R\x00\x08\xb3\x01&\x05&\x00+5\xff\ +\xff\x00\x19\x00\x00\x07/\x06!\x02&\x00Z\x00\x00\x01\ +\x07\x00C\x00\xb6\x00\x00\x00\x08\xb3\x01&\x11&\x00+\ +5\xff\xff\x00\x1f\x00\x00\x081\x07s\x02&\x00:\x00\ +\x00\x01\x07\x00v\x02V\x01R\x00\x08\xb3\x01&\x05&\ +\x00+5\xff\xff\x00\x19\x00\x00\x07/\x06!\x02&\x00\ +Z\x00\x00\x01\x07\x00v\x01\xb4\x00\x00\x00\x08\xb3\x01&\ +\x11&\x00+5\xff\xff\x00\x1f\x00\x00\x081\x07u\x02\ +&\x00:\x00\x00\x01\x07\x00j\x01\xbc\x01R\x00\x0a\xb4\ +\x02\x012\x05&\x00+55\xff\xff\x00\x19\x00\x00\x07\ +/\x06#\x02&\x00Z\x00\x00\x01\x07\x00j\x019\x00\ +\x00\x00\x0a\xb4\x02\x012\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05P\x07s\x02&\x00<\x00\x00\x01\x07\x00\ +C\xff\x8a\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\xff\ +\xff\xff\xfe\xfe\x14\x04\xe1\x06!\x02&\x00\x5c\x00\x00\x01\ +\x07\x00C\xffr\x00\x00\x00\x08\xb3\x01 \x11&\x00+\ +5\x00\x01\x00J\x01\x9e\x03\xb6\x02\xb2\x00\x03\x00\x11\xb5\ +\x02\x05\x00\x04\x00\x01\x00/3\x11\x013\x11310\ +\x13\x11!\x11J\x03l\x01\x9e\x01\x14\xfe\xec\x00\x01\x00\ +J\x01\x9e\x07\xb2\x02\xb2\x00\x03\x00\x11\xb5\x02\x05\x00\x04\ +\x00\x01\x00/3\x11\x013\x11310\x13\x11!\x11\ +J\x07h\x01\x9e\x01\x14\xfe\xec\x00\x01\x00L\x01\x9e\x07\ +\xb4\x02\xb2\x00\x03\x00\x11\xb5\x02\x05\x00\x04\x00\x01\x00/\ +3\x11\x013\x11310\x13\x11!\x11L\x07h\x01\ +\x9e\x01\x14\xfe\xec\x00\x02\xff\xfc\xfe1\x04\x04\xff\xd3\x00\ +\x03\x00\x07\x00!@\x0e\x04\x00\x00\x09\x05\x01\x01\x06\x05\ +\x05\x08\x02\x01\x1b\x00?3\x129/3\x012\x113\ +\x113\x11310\x01!5!5!5!\x04\x04\ +\xfb\xf8\x04\x08\xfb\xf8\x04\x08\xfe1\xa4Z\xa4\x00\x01\x00\ +\x14\x03m\x01\xdb\x05\xb4\x00\x06\x00\x14\xb7\x04\x01\x01\x07\ +\x08\x00\x03\x03\x00?\xcd\x11\x12\x019\x11310\x13\ +'\x127!\x02\x03#\x0fdM\x01\x16C\x1f\x03m\ +\x16\x01\x87\xaa\xfe\xc8\xfe\xf1\x00\x00\x01\x00%\x03m\x01\ +\xec\x05\xb4\x00\x06\x00\x14\xb7\x01\x04\x04\x07\x08\x04\x06\x03\ +\x00?\xc6\x11\x12\x019\x11310\x01\x17\x02\x07!\ +\x12\x13\x01\xdd\x0f\x5cU\xfe\xeaD\x1e\x05\xb4\x16\xfe\x92\ +\xc3\x01=\x01\x0a\xff\xff\x009\xfe\xe3\x02\x00\x01+\x02\ +\x06\x00\x0f\x00\x00\x00\x01\x00\x14\x03m\x01\xdb\x05\xb4\x00\ +\x06\x00\x14\xb7\x05\x02\x02\x08\x07\x03\x06\x03\x00?\xcd\x11\ +\x12\x019\x11310\x01\x12\x13!&\x037\x01y\ +\x1eD\xfe\xeaQ`\x0f\x05\xb4\xfe\xf6\xfe\xc3\xb2\x01\x7f\ +\x16\x00\x02\x00\x14\x03m\x03\xd9\x05\xb4\x00\x06\x00\x0d\x00\ +\x1f@\x0d\x04\x01\x08\x0b\x01\x0b\x0f\x0e\x00\x07\x03\x0a\x03\ +\x00?3\xcd2\x11\x12\x0199\x113\x11310\ +\x01'\x127!\x02\x03!'\x127!\x02\x03\x02!\ +\x0fdM\x01\x16C\x1f\xfc\xac\x0fdM\x01\x16C\x1f\ +\x03m\x16\x01\x87\xaa\xfe\xc8\xfe\xf1\x16\x01\x87\xaa\xfe\xc8\ +\xfe\xf1\x00\x00\x02\x00%\x03m\x03\xe9\x05\xb4\x00\x06\x00\ +\x0d\x00\x1f@\x0d\x04\x01\x08\x0b\x01\x0b\x0e\x0f\x0b\x04\x0d\ +\x06\x03\x00?3\xc62\x11\x12\x0199\x113\x113\ +10\x01\x17\x02\x07!\x12\x13!\x17\x02\x07!\x12\x13\ +\x01\xdd\x0f\x5cU\xfe\xeaD\x1e\x03T\x0e]S\xfe\xea\ +D\x1e\x05\xb4\x16\xfe\x92\xc3\x01=\x01\x0a\x16\xfe\x8d\xbe\ +\x01=\x01\x0a\x00\x00\x02\x009\xfe\xe3\x03\xfe\x01+\x00\ +\x07\x00\x0f\x00\x1e@\x0c\x04\x01\x09\x0c\x01\x0c\x10\x11\x0c\ +\x04\x0f\x00\x00/2/3\x11\x12\x0199\x113\x11\ +310\x01\x17\x02\x07!6\x127!\x17\x02\x07!\ +6\x127\x01\xf2\x0eaO\xfe\xe9\x1d;\x0b\x03T\x0e\ +aO\xfe\xe9\x1d;\x0b\x01+\x17\xfe\x83\xb4\x8a\x01W\ +g\x17\xfe\x83\xb4\x8a\x01Wg\x00\x01\x00o\x00\x00\x03\ +\xac\x06\x14\x00\x0b\x00N@%\x07\x04\x0a\x01\x04\x01\x03\ +\x09\x02\x02\x08\x03\x03\x05\x00\x00\x0d\x05\x0c\x0a\x07\x01\x04\ +\x07\x04\x06\x00\x05\x05\x0b\x06\x06\x03\x08\x00\x03\x12\x00?\ +?\x129/33\x113\x1299\x113\x113\x11\ +\x013\x113\x11\x129\x1133\x113\x1299\x11\ +3\x11310\x01%\x13!\x13\x05\x11\x05\x03!\x03\ +%\x03\xac\xfe\xc1;\xfe\xb6<\xfe\xd5\x01+<\x01J\ +;\x01?\x03s\x1e\xfco\x03\x91\x1e\x01\x1e\x1e\x01\xa1\ +\xfe_\x1e\x00\x01\x00o\x00\x00\x03\xc3\x06\x14\x00\x15\x00\ +}@>\x0e\x0b\x09\x06\x14\x11\x00\x03\x15\x03\x06\x0a\x04\ +\x05\x10\x04\x04\x0f\x05\x05\x07\x13\x02\x02\x17\x0c\x07\x07\x16\ +\x00\x09\x03\x06\x09\x06\x08\x02\x07\x07\x01\x08\x11\x0e\x14\x0b\ +\x0e\x0b\x0d\x13\x0c\x0c\x12\x0d\x08\x0d\x08\x0d\x05\x0f\x00\x05\ +\x12\x00??\x1299//\x1133\x113\x129\ +9\x113\x113\x1133\x113\x1299\x113\x11\ +3\x11\x013\x113\x113\x113\x129\x1133\x11\ +3\x12\x179\x11333\x1133310\x01%\ +\x11%\x13!\x13\x05\x11\x05'7\x05\x11\x05\x03!\x03\ +%\x11%\x17\x02\x83\x01@\xfe\xc0;\xfe\xb9;\xfe\xbd\ +\x01C33\xfe\xbd\x01C;\x01G;\x01@\xfe\xc0\ +1\x02X\x1f\xfe\xe1\x1f\xfe\x89\x01w\x1f\x01\x1f\x1f\xba\ +\xaa\x1e\x01\x1e\x1e\x01v\xfe\x8a\x1e\xfe\xe2\x1e\xaa\x00\x00\ +\x02\x00J\x01\x83\x02\xd9\x04m\x00\x0b\x00\x0c\x00\x19@\ +\x0a\x06\x00\x00\x0d\x09\x03\x03\x0e\x0c\x0f\x00?\x129/\ +3\x11\x019\x11310\x134632\x16\x15\x14\ +\x06#\x22&\x01J\xa9\x9e\x9e\xaa\xae\x9a\x9b\xac\x02R\ +\x02\xec\xae\xba\xbd\xab\xac\xbd\xba\x020\x00\x03\x00V\xff\ +\xe7\x06\x98\x01f\x00\x0b\x00\x17\x00#\x00/@\x17\x06\ +\x00\x12\x0c\x1e\x18\x18\x0c\x00\x03$%\x1b\x0f\x03\x09\x03\ +ZY!\x15\x09\x13\x00?33+\x11\x0033\x11\ +\x12\x01\x179\x113\x113\x113107463\ +2\x16\x15\x14\x06#\x22&%4632\x16\x15\x14\ +\x06#\x22&%4632\x16\x15\x14\x06#\x22&\ +Vmhcjm`cr\x02Pmhcjm\ +`cr\x02Pmhcjm`cr\xa6\x5cd\ +d\x5cZed[\x5cdd\x5cZed[\x5cd\ +d\x5cZed\x00\x07\x00%\xff\xf0\x0a\xa0\x05\xcb\x00\ +\x0b\x00\x17\x00\x1b\x00'\x003\x00>\x00J\x00d@\ +1\x1b\x18\x18(.\x1c\x22\x22((EE499\ +??L\x19\x1a\x1a\x12\x0c\x06\x00\x00\x12\x12K<%\ +%H16\x1f\x1fB+\x13\x1b\x03\x1a\x12\x03\x0f\x09\ +\x15\x04\x00?3\xcc2???33\x113\xcc2\ +2\x113\x11\x013\x113\x10\xca2\x119\x113\x11\ +3\x113\x10\xca2\x113\x113\x10\xca2\x119\x11\ +310\x01\x14\x1632654&#\x22\x06\x05\ +\x14\x06#\x22&54632\x16%\x01!\x01\x13\ +\x14\x1632654&#\x22\x06\x05\x14\x06#\x22\ +&54632\x16\x05\x1432654&#\ +\x22\x06\x05\x14\x06#\x22&54632\x16\x01R\ +&&&%%&'%\x01\xc5\xc6\xb7\xac\xc9\xc4\xb1\ +\xaf\xce\x02\xd9\xfc\xd5\xfe\xd7\x03+\xe3&&+!!\ ++'%\x01\xc5\xc7\xb6\xac\xc9\xc4\xb1\xaf\xce\x01lL\ ++!!++!\x01\xc5\xc9\xb4\xaa\xcb\xc4\xb1\xaf\xce\ +\x03\xfesfdusfhm\xdc\xf1\xf9\xd4\xdc\xed\ +\xf6\xe1\xfaJ\x05\xb6\xfc\x02sfudduhm\ +\xdb\xf1\xf9\xd3\xdc\xed\xf6\xd7\xd9udduu`\xdf\ +\xed\xf9\xd3\xdc\xed\xf6\x00\xff\xff\x00y\x03\xa6\x01\xdd\x05\ +\xb6\x02\x06\x00\x0a\x00\x00\xff\xff\x00y\x03\xa6\x03\xb8\x05\ +\xb6\x02\x06\x00\x05\x00\x00\x00\x01\x00J\x00P\x02\xe7\x04\ +/\x00\x06\x00\x22@\x0e\x03\x06\x04\x01\x05\x05\x02\x04\x04\ +\x08\x05\x05\x07\x01\x00/\x129/\x11\x019\x1133\ +\x113\x10\xc9210\x13\x01\x05\x01\x01\x05\x01J\x01\ +\x85\x01\x18\xfe\xf0\x01\x10\xfe\xe8\xfe{\x02L\x01\xe3\x95\ +\xfe\xa5\xfe\xa4\x93\x01\xe1\x00\x01\x00L\x00P\x02\xe9\x04\ +/\x00\x06\x00\x22@\x0e\x05\x01\x01\x03\x00\x02\x04\x02\x02\ +\x08\x01\x01\x07\x05\x00/\x129/\x11\x019\x113\x10\ +\xc923\x11310\x01\x01%\x01\x01%\x01\x02\xe9\ +\xfe}\xfe\xe6\x01\x10\xfe\xf0\x01\x1a\x01\x83\x021\xfe\x1f\ +\x93\x01\x5c\x01[\x95\xfe\x1d\x00\xff\xff\x00R\xff\xe7\x04\ +T\x05\xb6\x00'\x00\x04\x02R\x00\x00\x00\x06\x00\x04\x00\ +\x00\x00\x01\xfeN\x00\x00\x02m\x05\xb6\x00\x03\x00\x1a@\ +\x0b\x03\x00\x02\x01\x02\x02\x04\x03\x03\x02\x12\x00??\x11\ +\x013\x113\x10\xc9210\x01\x01!\x01\x02m\xfd\ +\x0e\xfe\xd3\x02\xf1\x05\xb6\xfaJ\x05\xb6\x00\x01\x00o\x02\ +\xe5\x03D\x05\xc7\x00\x14\x00+@\x13\x0d\x08\x08\x09\x14\ +\x00\x09\x00\x15\x16\x0a\x0a\x00\x09\x0d\x04\x04\x10\x04\x00?\ +3\x129\xc429/\x11\x12\x0199\x113\x113\ +\x11310\x01\x114&#\x22\x06\x15\x11!\x113\ +\x1736632\x16\x15\x11\x027%-9/\xfe\ +\xf2\xdf#\x10%_Qq}\x02\xe5\x01\x85F<]\ +h\xfe\xbe\x02\xcfR41{\x7f\xfe\x18\x00\x00\x01\x00\ +\x1f\x00\x00\x04L\x05\xb6\x00\x11\x00O@(\x02\x10\x0c\ +\x0e\x00\x04\x04\x09\x07\x05\x05\x0c\x12\x13\x03\x07\x08\x07X\ +Y\x00\x08\x0e\x11TY\x08\x0e\x08\x0e\x05\x0a\x0a\x0dT\ +Y\x0a\x06\x05\x18\x00??+\x11\x12\x0099\x18/\ +/+\x11\x003+\x11\x003\x11\x12\x0199\x113\ +33\x1133\x129910\x01!\x15!\x11!\ +\x11#53\x11!\x11!\x15!\x11!\x02+\x01?\ +\xfe\xc1\xfey\x85\x85\x03\xa8\xfd\xdf\x01\xfe\xfe\x02\x01\xd5\ +\xd1\xfe\xfc\x01\x04\xd1\x03\xe1\xfe\xc3\xd5\xfe\xc2\x00\x01\x00\ +f\x00\x00\x04\x8d\x05\xcd\x00$\x00x@?\x1b\x13\x16\ +\x0c\x10\x10\x0d\x0a\x11\x11!\x1e\x1a\x1a\x03\x16\x03\x15\x16\ +\x15%&\x0d\x1f \x1fXY\x11\x1b\x1c\x1bXY\x0e\ +\x00\x1c\x10\x1c\x02\x09\x03\x1c@\x0a \x16\x00\x17\x13\ +\x16\x13UY\x16\x18\x00\x06TY\x00\x07\x00?+\x00\ +\x18?+\x11\x003\x11\x129\x18/3\x1a\xce_^\ +]2+\x11\x003+\x11\x003\x11\x12\x0199\x11\ +3\x11\x129\x11333\x11339\x113\x113\ +310\x012\x16\x17\x03&#\x22\x06\x15\x15!\x15\ +!\x15!\x15!\x06\x07!\x11!\x11667#5\ +35#53546\x02\xdfZ\xd4[p\x8fo\ +3:\x01@\xfe\xc0\x01@\xfe\xc0)v\x02\x9f\xfb\xd9\ +FP\x10\xa6\xa6\xa6\xa6\xe9\x05\xcd+%\xfe\xdd7B\ +?5\xcdX\xcdv-\xfe\xba\x01;\x1bQB\xcdX\ +\xcd9\xd7\xe2\x00\x00\x03\x00\x9e\xff\xec\x07j\x05\xb6\x00\ +\x17\x00\x22\x00*\x00_@0\x0e\x0a\x11\x15\x15\x0a'\ +\x18\x0a\x18\x04#\x1d\x1d\x1e\x13\x04\x1e\x04+,\x1c#\ +TY\x0c\x14\x14\x10\x0e\x11\x1c\x11\x1c\x11\x1e\x1f\x1f*\ +TY\x1f\x06\x1e\x18\x00\x07\x19\x00?3??+\x11\ +\x12\x0099\x18//\x11333\x113+\x11\x12\ +\x0199\x113\x113\x113\x1299\x113\x113\ +\x113\x12910\x01267\x11\x06\x06#\x22&\ +55#57\x133\x15!\x11!\x15\x14\x16\x01\x14\ +\x04!#\x11!\x11! \x04\x0132654#\ +#\x06\xac9e 6\x91K\xc3\xa7\x8a\xaei\xcf\x01\ +\x1e\xfe\xe22\xfe\x0f\xfe\xce\xfe\xe2-\xfe\x90\x01\xa6\x01\ +\x1d\x01*\xfd\x83-ho\xcc8\x01\x00\x1a\x13\xfe\xfe\ +\x1c#\xb8\xc4\xe4}{\x01\x08\xfe\xfe\xfe\xe219\x02\ +\xdb\xf7\xff\xfe\x1b\x05\xb6\xf2\xfeY[W\xb0\x00\x01\x00\ +7\xff\xec\x04\x9a\x05\xcb\x00'\x00\x87@L\x1e\x18\x18\ +\x1c\x09\x0d\x12\x04\x0b\x03\x06\x04\x08%\x08\x17\x1c\x12\x12\ +%% \x1c\x03()\x06\x1e\x1f\x1eXY\x03{\x1f\ +\x8b\x1f\x02\x1f\x1f\x0fI\x0f\x1f\x1f\x1f\x02\x09\x03\x1f\x19\ +@\x0d\x18\x19\x18XY\x0a\x09\x19\x19\x14##\x00U\ +Y#\x07\x14\x0fUY\x14\x19\x00?+\x00\x18?+\ +\x11\x12\x009\x18/33+\x11\x003\x1a\x18\x10\xce\ +_^]+]2+\x11\x003\x11\x12\x01\x179\x11\ +3\x11\x1292\x11\x12\x179\x1199\x113\x113\ +10\x01\x22\x06\x07!\x15!\x07\x15\x175!\x15!\ +\x16327\x11\x06#\x22$'#53'57\ +#536\x0032\x17\x03&\x03=pw\x0c\x01\ +R\xfe\x9f\x02\x02\x01\x1f\xfe\xf8!\xe3\x91yf\xbd\xfd\ +\xfe\xc2/\x9c\x81\x02\x02\x81\x943\x01C\xfc\xb4\xa9w\ +x\x04\x87kY\xcd\x1d\x0e,\x01\xcd\xa47\xfe\xbd7\ +\xfc\xeb\xcd\x15\x16+\xcd\xff\x01\x09L\xfe\xd53\x00\x00\ +\x04\x00)\xff\xe3\x06D\x05\xc1\x00\x03\x00\x0f\x00\x18\x00\ +,\x00[@1*&&\x1c\x03\x00\x00\x04!\x1c\x01\ +\x02\x02\x1c\x0a\x0a\x10\x15\x15\x04\x1c\x04-.\x17\x0d\x13\ +\x07\x13(\x10\x19@\x19\x90\x19\x03`\x19\x90\x19\x02\x19\ +$\x1f\x03\x03\x02\x12\x00??\xd42\xcc]q2?\ +3\xcc2\x11\x12\x0199\x113\x10\xca2\x11\x129\ +\x113\x10\xc8\x119\x113\x113\x11910\x01\x01\ +!\x01\x01\x14\x06#\x22&54632\x16\x05\x14\ +\x163254#\x22%\x22&54632\x17\ +\x07&#\x22\x15\x14327\x15\x06\x059\xfc\xd5\xfe\ +\xd7\x03+\x024\xbe\xa3\x9b\xbd\xb8\xa6\x9d\xbe\xfeG.\ +.XX\x5c\xfc\xfc\xa4\xba\xb2\xae|n@SHi\ +o][N\x05\xb6\xfaJ\x05\xb6\xfb\xa8\xb2\xc9\xce\xad\ +\xb3\xc4\xcd\xaaQ]\xae\xaa\xd7\xc3\xaa\xb9\xbc:\xba'\ +\xa6\xa2+\xc53\x00\x02\x007\xff\xf0\x04J\x05\xc7\x00\ +\x1a\x00#\x00F@ \x22\x18\x18\x0e\x0c\x0a\x1b\x15\x15\ +\x03\x04\x0a\x04$%\x03\x17\x00\x17\x22\x22\x0e\x1e\x1e\x12\ +\x0e\x0b\x0b\x07\x12\x00\x07\x00/3/\x129\x113\x11\ +3\x11\x129\x113\x11\x129\x11\x12\x0199\x113\ +3\x113\x11333\x11310%265!\ +\x14\x06#\x22&55\x0757\x114632\x16\ +\x15\x10\x05\x15\x14\x16\x134&#\x22\x06\x15\x116\x02\ +\xc34(\x01+\xdd\xee\xbf\xd9\xb0\xb0\xe5\xdc\xc7\xd7\xfe\ +\x1c.\x5c\x1f%& \x8a\xf0g[\xf2\xd0\xe7\xcd;\ +/\xfe/\x01J\xce\xd2\xc9\xba\xfe\x90\x90\xb7WF\x03\ +^ED7<\xfe\xe8A\x00\x00\x04\x00\x8f\x00\x00\x08\ +o\x05\xb6\x00\x0f\x00\x1b\x00\x1f\x00+\x00d@6\x01\ +\x09\x0d\x06\x06\x07\x0d\x00 \x1c\x16&\x1f\x10\x10\x16\x00\ +\x07\x04,-)\x19#\x13\x0f\x19\x1f\x19\x02\x0f\x13\x1f\ +\x13\x02\x19\x13\x19\x13\x0e\x1c\x0e\x0a\x03\x01\x08\x03\x07\x12\ +\x1d\x1c\x1c\x01\x12\x00?3\x113??\x12993\ +\x11\x1299//]]\x113\x113\x11\x12\x01\x17\ +9\x1133\x1133\x113\x113\x11\x12991\ +0!!\x01#\x12\x15\x11!\x11!\x013&5\x11\ +!\x01\x14\x06#\x22&54632\x16\x015!\ +\x15\x01\x14\x1632654&#\x22\x06\x05\x19\xfe\ +A\xfe\x96\x13\x13\xfe\x9f\x01\xbd\x01d\x19\x11\x01a\x03\ +V\xc5\xaa\xa4\xc9\xc4\xad\xa2\xc9\xfd/\x02\xcc\xfe4/\ +53//35/\x03\x87\xfe\xd8\x88\xfe)\x05\xb6\ +\xfc\x87\xe4\xbc\x01\xd9\xfc\xf4\xaf\xca\xcf\xaa\xab\xca\xcf\xfc\ +\xb0\xdd\xdd\x02\xa6WQQWWUU\x00\x00\x02\x00\ +%\x02\xe5\x05\xd7\x05\xb6\x00\x07\x00\x1a\x00]@.\x1a\ +\x08\x11\x10\x11\x12\x03\x15\x0d\x0d\x0e\x00\x01\x01\x06\x03\x06\ +\x0e\x15\x14\x14\x0e\x03\x03\x1b\x1c\x18\x0a\x0a\x11\x0f\x08\x08\ +\x15\x0e\x01\x01\x1b\x0f\x04\x07\x03\x03\x12\x04\x03\x00?3\ +3\x113\x113\x129/333\x11\x1299\x11\ +3\x11\x12\x01\x179\x113\x113\x11\x129\x113\x11\ +3\x11\x12\x179\x113310\x01#\x11#5!\ +\x15#\x01\x03#\x16\x15\x11#\x11!\x13\x13!\x11#\ +\x1147#\x03\x01\x93\xc4\xaa\x02\x18\xaa\x02D\x8f\x09\ +\x07\xc1\x01\x1f\x89\x96\x01\x14\xc3\x07\x09\x97\x02\xe5\x02!\ +\xb0\xb0\xfd\xdf\x01\xfe86\xfep\x02\xd1\xfe!\x01\xdf\ +\xfd/\x01\x90D*\xfe\x02\x00\xff\xff\x001\x00\x00\x06\ +-\x05\xcd\x02\x06\x01v\x00\x00\x00\x02\x00f\xff\xdd\x04\ +\x8b\x04H\x00\x17\x00\x1f\x00B@\x1f\x14\x15\x15\x0c\x1f\ +\x0e\x0e\x04\x18\x0c\x04\x0c !\x1e\x19\x0e\x03\x1c\x1c\x08\ +\x15\x14\x14\x11\x1f\x0d\x0d\x08\x11\x00\x00/2/9/\ +3\x129\x113\x113\x11\x179\x11\x12\x0199\x11\ +3\x113\x113\x129\x11310\x05\x22&\x025\ +46632\x16\x12\x15!\x11\x16\x163267\ +\x17\x06\x06\x13\x11&&#\x22\x07\x11\x02y\x9d\xf1\x85\ +\x8a\xf4\x95\x98\xf3\x87\xfc\xc51\xa6R\x83\xb7QHb\ +\xd9\x932\xa3X\xadz#\x93\x01\x05\x9d\xab\xff\x8c\x8e\ +\xfe\xfd\xa5\xfe\x9c5Fi\x81)\x9b|\x02\x8b\x01\x15\ +5Bu\xfe\xe9\xff\xff\x00\x0b\xff\xe6\x07\x1f\x05\xb6\x00\ +'\x02@\x04\x17\xfd\xb3\x00'\x02\x17\x03\x0a\x00\x00\x01\ +\x06\x00{\xd2\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00?5\ +55\x00\xff\xff\x00A\xff\xe6\x07G\x05\xc9\x00'\x02\ +@\x04?\xfd\xb3\x00&\x00u\x02\x00\x01\x07\x02\x17\x03\ +N\x00\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00?555\ +\x00\xff\xff\x00]\xff\xe6\x07J\x05\xbe\x00'\x02@\x04\ +B\xfd\xb3\x00&\x02=\xfd\x00\x01\x07\x02\x17\x03P\x00\ +\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00?555\x00\xff\ +\xff\x00*\xff\xe6\x06\xf6\x05\xb6\x00'\x02@\x03\xee\xfd\ +\xb3\x00'\x02\x17\x02\xf8\x00\x00\x01\x06\x02?\xed\x00\x00\ +\x0b\xb4\x02\x01\x00\x0c\x19\x00?555\x00\x00\x02\x00\ +3\xff\xec\x04\x91\x05\xcb\x00\x19\x00%\x00A@!\x1d\ +$$\x13\x0d\x07\x0d\x00\x07\x00&'\x13\x10\x0b\x17\x10\ +FY\x0b IY\x0b\x0b\x17\x04\x04\x1aFY\x04\x16\ +\x00?+\x00\x18\x10\xc49/++\x11\x12\x009\x11\ +\x12\x0199\x113\x11\x1293\x11910\x01\x10\ +\x02\x04#\x22&54\x12632\x174&#\x22\ +\x06\x07\x116632\x00\x01267&&#\x22\ +\x06\x06\x15\x14\x04\x91\xb1\xfe\xd2\xc2\xd8\xe5\x8c\xf4\x9dn\ +YfWO\x9a<>\xc7h\xef\x01\x00\xfd{K{\ +&\x0dD\x221^:\x03\x8f\xfe\xfc\xfeF\xe5\xd9\xd5\ +\xae\x01%\x9f%[f))\x01/!%\xfe\xd6\xfc\ +m\xde\xd9\x12\x1be\xad[w\x00\x02\x00!\x00\x00\x05\ +\x85\x05\xc1\x00\x05\x00\x0c\x00:@\x1c\x02\x01\x06\x06\x09\ +\x0a\x09\x00\x0a\x03\x00\x03\x0d\x0e\x03\x00\x00\x05\x09\x05\x09\ +NY\x05\x12\x06\x01\x03\x00?3?+\x11\x12\x009\ +\x113\x11\x12\x0199\x113\x113\x11\x129\x113\ +3107\x01!\x01\x15!\x01\x06\x07\x03!\x03&\ +!\x01\xcb\x01\xd2\x01\xc7\xfa\x9c\x02\xb2\x0c\x13\xe3\x02\x06\ +\xe3\x14\xdf\x04\xe2\xfb\x1c\xdd\x04\x89R=\xfdJ\x02\xb6\ +8\x00\x01\x00\x8f\xfeP\x05D\x05\xb6\x00\x07\x00\x22@\ +\x10\x03\x04\x00\x07\x04\x07\x08\x09\x05\x02NY\x05\x03\x00\ +\x04\x00/3?+\x11\x12\x0199\x113\x1131\ +0\x01\x11!\x11!\x11!\x11\x03\xb6\xfeg\xfer\x04\ +\xb5\xfeP\x06#\xf9\xdd\x07f\xf8\x9a\x00\x01\x00\x19\xfe\ +P\x04\xf6\x05\xb6\x00\x0b\x00B@ \x02\x08\x08\x06\x07\ +\x03\x03\x09\x00\x06\x0a\x00\x0a\x0c\x0d\x03\x07\x04\x04\x07N\ +Y\x04\x03\x01\x00\x09\x00\x09NY\x00\x00/+\x11\x12\ +\x009\x18?+\x11\x12\x009\x11\x12\x0199\x113\ +\x1133\x113\x129\x11310\x135\x01\x015\ +!\x11!\x01\x01!\x11\x19\x02\x16\xfd\xfa\x04\x95\xfd\x7f\ +\x01\xac\xfe8\x02\xd5\xfeP\xd1\x03\x0a\x02\xc3\xc8\xfe\xbd\ +\xfd\xbc\xfdd\xfe\xbd\x00\x00\x01\x00H\x02L\x04=\x03\ +X\x00\x03\x00\x11\xb5\x00\x02\x04\x05\x00\x01\x00/3\x11\ +\x12\x019910\x13\x11!\x11H\x03\xf5\x02L\x01\ +\x0c\xfe\xf4\x00\x01\x00#\xff\xf2\x05\x12\x06\xdd\x00\x08\x00\ +6@\x18\x01\x00\x06\x06\x05\x07\x05\x02\x02\x03\x07\x07\x08\ +\x08\x0a\x03\x09\x03\x04\x04\x01\x08\x06\x01\x00/3/\x12\ +9/3\x11\x013\x113\x113\x11\x129\x113\x11\ +\x129\x113310\x05#\x01#\x11!\x13\x01!\ +\x02\xae\xd7\xfe\xfa\xae\x01\x5c\xba\x01\xcb\x01\x0e\x0e\x02\xc4\ +\x01\x06\xfd\xfe\x05#\x00\x00\x03\x00b\x01m\x053\x04\ +1\x00\x16\x00 \x00+\x00J@\x22#\x19\x06\x11\x11\ +\x1e)\x1e\x0c)\x00\x0c\x00,-\x06\x11\x09!\x14\x14\ +&\x0f&\x04\x17\x09\x09\x1b\x04\x04-\x1b\x0f\x00/3\ +\x129/\x129/3\x113\x11\x129\x113\x129\ +9\x11\x12\x0199\x113\x113\x11\x129\x1133\ +310\x01\x14\x06\x06#\x22'\x06\x06#\x22&5\ +4632\x176632\x16\x0527&#\x22\ +\x06\x15\x14\x16%\x22\x07\x16\x1632654&\x05\ +3U\x9a]\xa7{?\x8fE\x95\xbb\xbe\x92\xb0k;\ +\x87X\x95\xb7\xfc\x8b@=?@+36\x02E?\ +D\x1fG\x1f*24\x02\xcb^\xa2^\x93CJ\xc1\ +\x9f\x98\xc6\x91BK\xc2\xfcdd:,-5\xc2b\ +-<>+*8\x00\x00\x01\xff\xe3\xfe\x14\x03m\x06\ +\x14\x00\x17\x00 @\x0d\x09\x14\x14\x0e\x03\x03\x19\x0e\x18\ +\x11\x0c\x05\x00\x00/2/3\x11\x013\x113\x11\x12\ +9\x11310\x012\x17\x11&#\x22\x06\x15\x11\x14\ +\x06#\x22'\x11\x163265\x1146\x02}\x82\ +n\x801**\xd0\xcb\x80jn40&\xd6\x06\x14\ +7\xfe\xc31/8\xfb0\xbe\xc88\x01=131\ +\x04\xd3\xbf\xc6\x00\xff\xff\x00H\x01&\x04=\x04y\x00\ +'\x00a\x00\x00\x00\xe3\x01\x07\x00a\x00\x00\xff\x18\x00\ +\x10\xb1\x01\x1a\xb8\xffA\xb4\x1a\x1a\x00\x00>\x00+\x11\ +5\x00\x01\x00H\x00\x81\x04?\x05'\x00\x13\x00Z@\ +-\x0d\x10\x11\x00\x04\x01\x0c\x01\x0a\x07\x06\x03\x04\x02\x0b\ +\x0b\x0c\x02\x0c\x04\x0e\x0e\x13\x13\x15\x08\x04\x04\x14\x0c\x0b\ +\x0b\x10\x07\x07\x0d\x0a\x02\x01\x01\x00\x03\x03\x11\x06\x00/\ +33\x1133\x113\xc522\x1132\x113\x11\ +\x013\x113\x113\x113\x11\x1299\x113\x11\x12\ +\x1792\x11\x12\x17910\x01\x07'7#\x11!\ +7!\x11!7\x17\x073\x11!\x07!\x11\x02-j\ +\xf8;\xbe\x01;V\xfeo\x02\x0em\xf7?\xc4\xfe\xc1\ +V\x01\x95\x01f\xe5f\x7f\x01\x0f\xba\x01\x0c\xeci\x83\ +\xfe\xf4\xba\xfe\xf1\xff\xff\x00H\x00\x01\x04=\x05\x94\x00\ +&\x00\x1f\x00{\x01\x07\x02+\x00\x00\xfd\xb5\x00\x07\xb2\ +\x01\x07\x18\x00?5\x00\xff\xff\x00H\x00\x01\x04=\x05\ +\x94\x00&\x00!\x00{\x01\x07\x02+\x00\x00\xfd\xb5\x00\ +\x07\xb2\x01\x07\x18\x00?5\x00\x00\x02\x00F\x00\x00\x04\ +X\x05\xbe\x00\x05\x00\x09\x00B@ \x05\x04\x07\x07\x02\ +\x01\x09\x09\x08\x06\x08\x03\x06\x00\x03\x00\x0a\x0b\x00\x06\x06\ +\x03\x08\x07\x08\x09\x03\x02\x05\x07\x02\x18\x00??\x12\x17\ +9\x1133\x113\x11\x12\x0199\x113\x113\x11\ +\x129\x11333\x113310\x13\x013\x01\x01\ +#\x01\x03\x03\x13F\x01\xc2\x8e\x01\xc2\xfe>\x8e\x01\x0c\ +\xc6\xc5\xc5\x02\xdf\x02\xdf\xfd!\xfd!\x02\xdd\x01P\xfe\ +\xb0\xfe\xb4\xff\xff\x00-\x00\x00\x05m\x065\x00'\x00\ +L\x03N\x00\x00\x00\x06\x00I\x00\x00\xff\xff\x00-\x00\ +\x00\x05\x5c\x06\x1f\x00'\x00O\x03N\x00\x00\x00\x06\x00\ +I\x00\x00\x00\x01\x00`\x04\xd9\x049\x06V\x00\x0b\x00\ +\x1e@\x0c\x0a\x09\x09\x03\x04\x04\x0c\x0d\x09\x04\x07\x00\x00\ +/2\xcc2\x11\x12\x019\x1133\x11310\x01\ +\x22&'!\x16\x16327!\x02\x02J\xef\xed\x0e\ +\x01F\x05LS\x96\x0e\x01K)\x04\xd9\xba\xc3bX\ +\xba\xfe\x83\x00\x01\xff\x98\xfe\x14\x02\x0e\x04m\x00\x0d\x00\ +\x1f@\x0e\x0b\x03\x08\x08\x0e\x0f\x09\x0f\x00\x06GY\x00\ +\x1c\x00?+\x00\x18?\x11\x12\x019\x113310\ +\x13\x22&'\x11\x16325\x11!\x11\x14\x06j0\ +}%@8w\x01\x87\xdb\xfe\x14\x0f\x0a\x011\x12\xaa\ +\x04w\xfb7\xbb\xd5\x00\x00\x01\x01%\x04\xcd\x02\xc1\x06\ +\x14\x00\x07\x00\x19@\x0b\x04\x00\x00\x08\x09\x00\x06\x01\x06\ +\x02\x00\x00?\xcd]\x11\x12\x019\x11310\x016\ +7!\x15\x06\x07#\x01%+\x0e\x01c\x90#\xe9\x04\ +\xe9\xb9r\x16\xf98\x00\x00\x01\x011\xfe;\x02\xc3\xff\ +\x83\x00\x08\x00\x1d@\x0e\x05\x00\x00\x0a\x03\x03\x09\x00\x07\ +\x10\x07\x02\x07\x1b\x00?]\x129/\x11\x019\x113\ +10\x01667!\x15\x06\x07#\x011\x10\x1d\x02\ +\x01cGa\xea\xfeX8\xb4?\x16\xa5\x8d\x00\x01\x01\ +\x10\x04\xd9\x02\xa2\x06!\x00\x06\x00\x18@\x0a\x00\x03\x03\ +\x07\x08\x0f\x05\x01\x05\x03\x00/\xcd]\x11\x12\x019\x11\ +310\x01\x06\x07!5\x133\x02\xa2#\x0a\xfe\x9b\ +\xaa\xe8\x06\x04\xb8s\x17\x011\x00\x02\x00)\x023\x03\ +\x08\x05\xcd\x00\x0b\x00\x17\x00 @\x0e\x00\x12\x06\x0c\x12\ +\x0c\x18\x19\x09\x15\x1f\x03\x0f!\x00?3?3\x11\x12\ +\x0199\x113\x11310\x01\x14\x163265\ +4&#\x22\x06\x05\x14\x06#\x22&54632\ +\x16\x01H$,+&&+,$\x01\xc0\xbd\xba\xaa\ +\xbe\xb7\xb1\xb4\xc3\x04\x00\x83ss\x81\x80tp\x80\xe2\ +\xed\xf3\xdc\xe6\xe5\xf0\x00\x00\x02\x00\x1d\x02J\x03\x1f\x05\ +\xbc\x00\x0a\x00\x11\x008@\x1a\x11\x05\x09\x00\x02\x02\x0b\ +\x07\x03\x05\x03\x12\x13\x09\x06\x11\x11\x01\x05\x05\x03\x0e\x07\ +\x1e\x03 \x00??3\x129/33\x1133\x11\ +\x12\x0199\x11333\x1133\x11310\x01\ +#\x15!5!5\x01!\x113!547\x06\x07\ +\x07\x03\x1f}\xfe\xed\xfe\x8e\x01^\x01'}\xfep\x07\ +(\x16f\x02\xd5\x8b\x8b\xbc\x02+\xfd\xe2\xa6EBd\ +!\xa8\x00\x00\x01\x00`\x02;\x02\xf2\x05\xbe\x00\x19\x00\ +D@ \x16\x03\x12\x18\x18\x13\x13\x08\x0e\x0e\x03\x08\x03\ +\x1a\x1b\x13\x12\x09\x12\x0c\x10\x10\x00\x00\x06\x17\x17\x14\x1e\ +\x0c\x06!\x00?3?3\x11\x129/3\x11\x129\ +9\x113\x11\x12\x0199\x113\x11\x129\x113\x12\ +9\x11910\x012\x16\x15\x14\x06#\x22'5\x16\ +\x163254#\x22\x07'\x13!\x15!\x076\x01\ +\xb6\x8f\xad\xcc\xc0\xa0f2\x851\x97\x8d7#\x8b&\ +\x02\x17\xfe\xac\x0eH\x04\x8d\x9a\x80\x95\xa32\xe7\x22*\ +kf\x0e+\x01\xc8\xd7b\x08\x00\x02\x001\x023\x02\ +\xfe\x05\xcb\x00\x0b\x00#\x00@@\x1f\x0c\x18\x09\x11\x11\ +\x1e\x03\x18\x1e\x18$%\x1f\x10\x10\x11\x06\x06\x00\x15\x01\ +\x15\x15\x1b\x0e\x0e!\x1f\x00\x1b!\x00?3?3\x11\ +\x129/]3\x1293\x113\x11\x12\x0199\x11\ +3\x113\x129\x11910\x012654&#\ +\x22\x06\x15\x14\x16\x01&#\x22\x06\x0736632\ +\x16\x15\x14\x06#\x22&5\x10\x12!2\x17\x01\x8f/\ +'(#0/.\x01U6Ixw\x04\x0a\x1dW\ +Hp|\xb4\xa0\xb1\xc8\xfe\x01\x02GF\x03\x0458\ +027#0E\x01\xe3\x09^i*,\x88\x86\x94\ +\xaa\xd1\xb6\x01\x11\x01\x00\x0a\x00\x00\x01\x00=\x02J\x03\ +\x04\x05\xb6\x00\x06\x00(@\x12\x06\x00\x00\x01\x02\x01\x05\ +\x02\x05\x07\x08\x05\x02\x02\x03\x1e\x00 \x00??3\x12\ +9\x11\x12\x0199\x113\x11\x129\x11310\x13\ +\x01!5!\x15\x01\x96\x01V\xfeQ\x02\xc7\xfe\xd1\x02\ +J\x02\x95\xd7\xb8\xfdL\x00\x03\x00)\x023\x03\x08\x05\ +\xcd\x00\x17\x00!\x00-\x00F@!\x13\x06\x15\x03\x15\ +%\x03+%+\x18\x1d\x18\x0f\x1d\x09\x0f\x09./\x06\ +\x13\x13 ((\x1b\x0d!\x22\x00\x1f\x00?2?\ +39\x113\x129\x113\x11\x12\x0199\x113\x11\ +3\x11\x1299\x113\x113\x11\x129910\x01\ +2\x16\x15\x14\x06\x07\x16\x16\x15\x14\x06#\x22&54\ +667&546\x13\x14\x163254&'\ +\x06\x13\x22\x06\x15\x14\x16\x176654&\x01\x9a\x97\ +\xb4=P^R\xcb\xa3\xac\xc5\x1d5L}\xb6-6\ +3l2Abk)'&,\x22+(\x05\xcd{\ +i;a2&jLx\x94\x8c\x804F2%V\ +\x88gx\xfd}*.P%.\x11\x22\x01\x88!\x1a\ +\x1c+\x15\x11)\x22\x1c\x1f\x00\x00\x02\x00/\x023\x02\ +\xfc\x05\xcb\x00\x0b\x00\x22\x008@\x1b\x03\x22\x18\x09\x11\ +\x11\x1e\x18\x1e#$\x11\x06\x06\x0f\x15\x01\x15\x15\x0e\x1b\ +\x0e !\x00\x1b\x1f\x00?3?3\x11\x129/]\ +3\x129\x11\x12\x0199\x113\x129\x11931\ +0\x01\x22\x06\x15\x14\x1632654&\x01\x163\ +267#\x06\x06#\x22&54632\x16\x15\ +\x10!\x22'\x01\x9e/'(#0/.\xfe\xab3\ +ljd\x05\x0a\x1dWHp|\xb8\xa8\xaa\xc3\xfe!\ +\x80.\x04\xfa58027#0E\xfe#\x0ff\ +a*,\x88\x86\x96\xa8\xd1\xb6\xfd\xef\x11\x00\x00\x16\x00\ +J\xfe\x81\x07\xb6\x05\xee\x00\x05\x00\x0b\x00\x11\x00\x17\x00\ +\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00\ +;\x00?\x00C\x00G\x00S\x00[\x00k\x00t\x00\ +|\x00\x89\x01\x0b@\x87@<0\x05\x0f\x0fA=1\ +\x00\x0cNTcpp``ll\x80zggv\ +\x84vkkH\x84HX\x84\x87\x87XT\x03\x0c\x17\ +E)%\x0a\x14\x14D($\x09\x17\x0c\x17\x8a\x8b\x82\ +}}kduullvvkVKKkk\ +\x5c\x0cZQQ\x85t\x5c\x5c\x07\x12\x12\x0c-\x1d\x19\ +\x13\x0f\x0f\x0c\x16\x0d$1'2D=G>(A\ ++B\x09\x00\x00BA>=21\x0d\x08\x01,\x1c\ +\x18\x0c\x07\x0184 \x06\x04\x0495!\x01\x00/\ +3333\x113333\x113/333\x12\ +\x179\x113\x113\x113\x113\x113\x113\x113\ +\x113\x113\x113333\x113\x11\x129/3\ +33/3\x11\x129/3/3\x113\x119/\ +3\x129\x113/3\x11\x12\x0199\x11333\ +33\x113333\x11\x12\x179\x113\x113\x11\ +\x129\x113\x11\x129\x11332\x129\x113\x11\ +3\x113\x1133333\x11333310\ +\x13\x11!\x15#\x15%5!\x11#5\x01\x113\x15\ +3\x15!5353\x11!5!\x15!5!\x15\ +\x015!\x15\x01#\x113\x11#\x113\x015!\x15\ +\x01#\x113\x015!\x1535!\x15\x01#\x113\ +5#\x113\x01#\x113\x05\x14\x06#\x22&54\ +632\x16\x05\x143254#\x22%32\x16\ +\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06##\x13326\ +54&##\x15\x1532654#\x01\x22'\ +5\x16325\x113\x11\x14\x06J\x01/\xc1\x05\xcf\ +\x01/l\xf9\x00n\xc1\x05\x0e\xc3l\xfdJ\x01\x10\xfb\ +\xe2\x01\x0e\xfe\xf2\x01\x0e\x04\xb6llll\xfb\xc3\x01\ +\x10\xfc/nn\x02\xc1\x01\x10w\x01\x10\xfa\xa8nn\ +nn\x06\xfell\xfb\xa0\x87\x7f\x7f\x87\x87\x7f~\x88\ +\xfes\x87\x87\x87\x87\x01\xe1\xacmp/+;0m\ +^\xcf{A/#)/;J1%[\x01_4\ +\x1c(\x1bV}i\x04\xbe\x010o\xc1\xc1o\xfe\xd0\ +\xc1\xf9\x02\x01/\xc2mm\xc2\xfe\xd1mmmm\x06\ +\xfeoo\xfa\xa8\x01\x0e\x02\x02\x01\x0f\xfa;mm\x01\ +\xa6\x01\x0e\x04Joooo\xfc/\x01\x10y\x01\x0f\ +\xfdh\x01\x10I\x91\x9c\x9c\x91\x92\x9b\x9a\x93\xc5\xc5\xc4\ +aCS1B\x08\x08\x0dD6QY\x01b\x22 \ +\x22\x1d\xe3\x9a+%J\xfe\xfa\x0af\x08V\x01\x92\xfe\ +r_c\x00\x03\x00V\xfe\xc1\x07\xaa\x06\x14\x00\x03\x00\ +\x1e\x00*\x00X@)\x12%\x1f\x1f\x04\x1e\x1e\x11\x17\ +\x17\x0b\x11\x0b\x03\x01\x03\x01+,\x1c\x06\x0b\x17\x06\x17\ +\x14\x1e\x1e((\x22\x12\x14\x14\x0e\x22\x0e\x22\x0e\x02\x00\ +\x00//99//\x113\x113\x113\x113/\ +\x1299\x113\x113\x11\x12\x0199\x11\x1299\ +\x113\x11\x129\x1133\x113210\x09\x03\x05\ +54676654&#\x22\x06\x07\x1763\ +2\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\x16326\ +54&#\x22\x06\x03\xfe\x03\xac\xfcT\xfcX\x03\xe9\ +,AgI\xbb\xa5X\xa8PR\x8el?>1H\ +T;\x1bGFBIHCHE\x06\x14\xfcV\xfc\ +W\x03\xa9\xfb/2A1R~X\x87\x9a11\xb2\ +P:/5K6DpJ;\xfe\xed?HI>\ +@IH\xff\xff\xff\x80\xfe\x14\x03\x0b\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01L\xfe\xdc\x00\x00\x00\x08\xb3\x01\x13\ +\x11&\x00+5\xff\xff\x00%\x03m\x01\xec\x05\xb4\x02\ +\x06\x02\x07\x00\x00\x00\x02\x00\x0c\xff\xec\x05\xe5\x06'\x00\ +-\x005\x00j@6\x18\x08+(\x02(11.\ +3\x1e3$\x08$\x0f\x1e\x1e-\x02\x0f\x0267+\ +. .FY\x00 \x11\x0cGY \x11 \x11\x05\ +((1FY(\x01\x05\x1bFY\x05\x16\x00?+\ +\x00\x18?+\x11\x12\x0099\x18//+\x11\x003\ ++\x11\x003\x11\x12\x0199\x1133\x11\x1299\ +\x113\x11\x1299\x113\x11\x129\x11310\x01\ +\x17\x15\x10\x00! &574&#\x22\x07'6\ +32\x16\x15\x14\x07\x06\x15\x14\x1632655'\ +&$&54663 \x00\x133\x11\x01&&\ +#\x22\x15\x14\x16\x05h\x02\xfe\xc4\xfe\xcc\xfe\xfc\xfc\x06\ +\x1c\x19*.g\xc0\xbbb\x81\x05\x05U_na\x02\ +\xe1\xfe\xbf\xa6r\xd7\x90\x01\x04\x011+\x93\xfd\xee\x10\ +oZZ\xa5\x02\xc5.\x1c\xfe\xc0\xfe\xb1\xa4\xadc&\ +\x17\x1f\xe0rbR,+,\x1dcK\xbc\xc1\x1c\x1e\ +\x02|\xd9\x90o\xad_\xfe\xe5\xfe\xdb\xfe\xde\x01\x22\x8c\ +\x91\x5cSk\x00\x00\x01\x00\x00\x00\x00\x05\x5c\x05\xc3\x00\ +\x13\x00B@ \x10\x0f\x00\x00\x13\x03\x03\x0a\x0a\x06\x06\ +\x15\x13\x12\x12\x14\x0e\x11\x11\x00\x00\x10\x12\x03\x10\x12\x04\ +\x09PY\x04\x04\x00?+\x00\x18??\x129\x113\ +\x113\x11\x013\x113\x113\x113\x113\x11\x129\ +\x113310\x0176632\x17\x11&#\x22\ +\x0e\x02\x07\x11!\x11\x01!\x02\xa8:y\xaf\x94gW\ +*\x22,Nzt3\xfer\xfe\x19\x01\xae\x03\xa8y\ +\xfb\xa7#\xfe\xe1\x0e?\xb7\xe3\x83\xfd\xcd\x02/\x03\x87\ +\x00\x00\x02\x00=\xff\xec\x08F\x04m\x00\x16\x00-\x00\ +\x5c@-\x1a\x03\x14##\x22\x22+\x03+\x0d\x03\x0d\ +\x06\x0a\x0a/\x08\x06\x06.\x22\x22\x00\x08\x17\x0b\x06\x08\ +\x06FY\x08\x0f\x14\x00(\x1d\x00\x1dGY\x10\x00\x16\ +\x00?2+\x11\x003\x129\x18?+\x11\x0033\ +\x11\x129\x18/\x11\x013\x113\x113\x11\x1299\ +\x113\x11\x129\x113\x129\x11310\x05\x22\x02\ +\x1147#57!\x11#\x16\x15\x10\x02#\x22&\ +'#\x06\x06\x03\x06\x06\x15\x14\x16326655\ +!\x15\x14\x16\x1632654'\x02\xe7\xee\xfd3\ +\xf2\xc3\x07F\xf23\xff\xee|\xa8.\x0d2\xa8\xb5\x14\ +\x1f@O17\x17\x01u\x1751OB5\x14\x01\ + \x01\x0b\xa0\x93\xa6}\xfe\xdd\xbay\xfe\xf9\xfe\xdcn\ +wzk\x03^1\xaaN\x94r1dwqq\x84\ +[-u\x89o\xc2\x00\xff\xff\x00\x9e\x00\x00\x07\x1f\x07\ +u\x02&\x000\x00\x00\x01\x07\x00v\x01\xe7\x01T\x00\ +\x08\xb3\x01\x1e\x05&\x00+5\xff\xff\x00\x87\x00\x00\x07\ +}\x06!\x02&\x00P\x00\x00\x01\x07\x00v\x02\x10\x00\ +\x00\x00\x08\xb3\x01-\x11&\x00+5\xff\xff\x00\x00\xfd\ +\xa8\x05\xcf\x05\xbc\x02&\x00$\x00\x00\x00\x07\x02[\x01\ +\xa0\x00\x00\xff\xff\x00J\xfd\xa8\x04y\x04\x81\x02&\x00\ +D\x00\x00\x00\x07\x02[\x01!\x00\x00\xff\xff\xff\xad\xff\ +\xec\x07\xf8\x05\xcd\x00'\x02\x5c\xffQ\x00\x00\x00\x07\x00\ +2\x02\x02\x00\x00\x00\x02\x00?\xfd\xa8\x02V\xff\xa0\x00\ +\x0b\x00\x17\x00\x1a@\x0a\x06\x12\x12\x19\x0f\x09\x09\x18\x15\ +\x03\x00/3\x129/3\x11\x019\x11310\x01\ +\x14\x06#\x22&54632\x16\x074&#\x22\ +\x06\x15\x14\x16326\x02V\x97wx\x91\x90yt\ +\x9a\xb8/%#/(*#1\xfe\xa6r\x8c\x88t\ +r\x8a\x8bq%//%%//\x00\x02\x00\x5c\x04\ +^\x03;\x05\xc9\x00\x10\x00\x18\x003@\x18\x06\x00\x00\ +\x03\x0b\x14\x18\x0b\x18\x19\x1a\x00\x07\x07\x03\x0e\x00\x18\x01\ +\x18\x03\x02\x13\x03\x00?\xc62\xdc]\xc4\x119\x113\ +\x11\x12\x0199\x113\x1133\x12910\x134\ +%\x15\x06\x06\x15\x14\x16\x17\x16\x15\x14\x06#\x22&\x05\ +67!\x15\x06\x07#\x5c\x01FT>\x1b\x19GO\ +HDT\x01e/\x18\x0134\x98\xae\x04\xfa\xbf\x10\ +g\x08\x19\x18\x13\x0b\x03\x0a@+5S$\xa3\x8a\x14\ +y\xba\x00\xff\xff\x00-\x00\x00\x08\xbb\x065\x00&\x00\ +I\x00\x00\x00'\x00I\x03N\x00\x00\x00\x07\x00L\x06\ +\x9c\x00\x00\xff\xff\x00-\x00\x00\x08\xaa\x06\x1f\x00&\x00\ +I\x00\x00\x00'\x00I\x03N\x00\x00\x00\x07\x00O\x06\ +\x9c\x00\x00\x00\x02\x00h\xff\xec\x07\x14\x06\x14\x00\x14\x00\ +\x1e\x00S@)\x10\x0e\x0e\x0b\x0b\x13\x09\x00\x09\x1d\x1d\ +\x1a\x15\x15\x06\x1a\x00\x06\x00\x1f \x13\x0b\x00\x0b\x03\x09\ +\x09\x1dNY\x0e@\x09\x04\x03\x17NY\x03\x13\x00?\ ++\x00\x18?\x1a\xca+\x11\x12\x0099\x113\x11\x12\ +\x0199\x113\x113\x11\x129\x113\x11\x1299\ +\x113\x11310\x01\x10\x00! \x00\x11\x10\x00!\ + \x17665!\x17\x06\x06\x07\x16\x05\x10!26\ +54&# \x05\xf8\xfe\x95\xfe\xa2\xfe\xa8\xfe\x91\x01\ +p\x01]\x01i\xb0'\x1a\x01w\x0e)\x96\x84'\xfc\ +\x10\x01'\x97\x92\x93\x94\xfe\xd7\x02\xdd\xfe\x90\xfe\x7f\x01\ +\x84\x01o\x01m\x01\x81\xc3JzF\x16\xc6\xd49\x92\ +\xbc\xfeX\xd2\xd6\xd9\xd3\x00\x02\x00V\xff\xec\x06\x10\x05\ +\x14\x00\x16\x00\x22\x00S@)\x11\x0f\x0f\x0c\x0c\x15\x09\ +\x00\x09 \x1d\x17\x17\x06\x1d\x00\x06\x00#$\x15\x0c\ +\x00\x0c\x03\x09\x09 GY\x0f@\x09\x10\x03\x1aGY\ +\x03\x16\x00?+\x00\x18?\x1a\xce+\x11\x12\x0099\ +\x113\x11\x12\x0199\x113\x113\x11\x129\x113\ +\x11\x1299\x113\x11310\x01\x10\x00! \x00\ +\x11\x10\x00!2\x16\x17665!\x17\x0e\x02\x07\x16\ +\x05\x14\x1632654&#\x22\x06\x04\xc1\xfe\xd5\ +\xfe\xf3\xfe\xfe\xfe\xcf\x01+\x01\x0et\xd3K17\x01\ +y\x0e\x1cW\x92o%\xfd$M[XNM[Z\ +L\x029\xfe\xea\xfe\xc9\x01>\x01\x0f\x01\x15\x013C\ +D\x17\x94o\x16\x9a\xa5o\x1ds\x87\x8b\x8b\x8b\x8b\x8b\ +\x86\x85\x00\x00\x01\x00\x96\xff\xec\x07\x85\x06\x14\x00\x1c\x00\ +;@\x1c\x15\x12\x06\x04\x01\x01\x1b\x0b\x12\x0b\x1d\x1e\x0a\ +\x01\x0b\x01\x0f\x1c\x04@\x13\x03\x0f\x18NY\x0f\x13\x00\ +?+\x00\x18?\x1a\xca3\x1299\x113\x11\x12\x01\ +99\x1133\x10\xca2\x11310\x01\x1566\ +5!\x17\x0e\x02\x07\x11\x14\x06\x04# \x005\x11!\ +\x11\x14\x163265\x11\x05yAD\x01y\x0e&\ +y\xcd\xa0\x9b\xfe\xdd\xc3\xfe\xde\xfe\xc0\x01\x8dd}|\ +n\x05\xb6\xca!\x9dj\x16\xb2\xb8s\x15\xfd\xf8\x9f\xf4\ +\x85\x01!\xfb\x03\xae\xfc\x7f\x8buy\x89\x03\x7f\x00\x00\ +\x01\x00\x85\xff\xec\x06\xc5\x05\x12\x00\x22\x00D@!\x0e\ +\x0b\x1c\x1a\x17\x17\x22\x05\x14\x14\x22\x0b\x22#$\x22\x15\ +!\x17\x05\x17\x08\x1a@\x15\x0c\x0f\x08\x11GY\x08\x15\ +\x00?+\x00\x18?3\x1a\xca\x1299\x113?\x11\ +\x12\x0199\x113\x113\x113\x10\xca2\x1131\ +0!\x15\x15'\x17#\x06\x06#\x22&5\x11!\x11\ +\x14\x163265\x11!\x15665!\x17\x0e\x03\ +\x07\x11\x03\xae2\x01\x1b1\xb0s\xba\xcf\x01\x87?H\ +bW\x01\x8917\x01y\x0f\x1cJt\xa7o\x03\x01\ +\x95\x04OR\xda\xc5\x02\xe2\xfd\x95or\x9a\xc2\x01\xf0\ +\x86\x1c\xa2m\x16\x8c\x9epJ\x12\xfc\xfa\x00\xff\xff\xfb\ +\x88\x04\xd9\xfe<\x06!\x00\x07\x00C\xfa\x80\x00\x00\xff\ +\xff\xfcU\x04\xd9\xff\x09\x06!\x00\x07\x00v\xfbM\x00\ +\x00\xff\xff\xfbe\x04\xd5\xfe\xaf\x06-\x00\x07\x01R\xfa\ +\xb5\x00\x00\x00\x01\xfcj\x04\xc9\xfej\x06\xb0\x00\x14\x00\ +\x0e\xb4\x06\x0c\x0c\x12\x05\x00/\xcc2\x12910\x01\ +\x14\x06\x07\x07#'6654&#\x22\x06\x075\ +632\x16\xfejSV\x0b\xcf\x1cB.(\x1f\x1e\ +0<]\x7f\x8f\x95\x05\xcbNn\x17/\x81\x08+%\ +\x1d\x22\x08\x14\xcc\x1fx\x00\x01\xfcF\xfe!\xfd\xe5\xff\ +}\x00\x0a\x00\x08\xb1\x08\x03\x00/\xc910\x0146\ +32\x16\x15\x14#\x22&\xfcFblmd\xd1i\ +e\xfe\xcfXVXV\xaeV\xff\xff\x00\x9e\x00\x00\x04\ +\x02\x07s\x02&\x00(\x00\x00\x01\x07\x00C\xff\xa7\x01\ +R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\x9e\x00\ +\x00\x06%\x07s\x02&\x01\xb2\x00\x00\x01\x07\x00C\x00\ +T\x01R\x00\x08\xb3\x01\x19\x05&\x00+5\xff\xff\x00\ +V\xff\xec\x04\x9c\x06!\x02&\x00H\x00\x00\x01\x06\x00\ +C\xb5\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\xff\x00\ +\x87\x00\x00\x05J\x06!\x02&\x01\xd2\x00\x00\x01\x06\x00\ +C%\x00\x00\x08\xb3\x01\x18\x11&\x00+5\x00\x01\x00\ +h\xff\xec\x08\xa2\x05\xc9\x003\x00X@+\x1d\x03#\ +1#\x17\x10,,))1\x171\x09\x17\x0945\ +**\x13\x1a\x00 \x1a NY\x06\x1a\x04\x10\x13.\ +&\x13&NY\x0d\x13\x13\x00?3+\x11\x003\x12\ +9\x18?3+\x11\x003\x11\x129\x18/\x11\x12\x01\ +99\x113\x11\x129\x113\x129\x113\x11\x129\ +910\x01\x22\x07\x03663 \x00\x11\x14\x02\x04\ +#\x22&'\x06\x06#\x22$\x025\x10\x00!2\x16\ +\x17\x03&#\x22\x06\x15\x14\x163267\x11!\x11\ +\x1632654&\x06'aY\x86?\xbfV\x01\ +&\x01A\x9a\xfe\xd8\xd0\x88\xb6OU\xc6\x97\xbe\xfe\xe8\ +\x93\x01B\x01'Q\xc5<\x83dYm\x80\x98\x8d>\ +L\x1c\x01\x85?k\x8a\x9a\x80\x04\x85F\x01\x175>\ +\xfe\x88\xfe\xb1\xf3\xfe\x9b\xbeO__O\xc3\x01e\xee\ +\x01N\x01y@3\xfe\xe9F\xcd\xcc\xd3\xe4(\x1a\x01\ +d\xfe\x9cB\xe0\xd7\xcc\xcd\x00\x00\x01\x00\x00\x00\x00\x06\ +\xd1\x04m\x00\x1e\x00^@-\x05\x04\x0a\x0a\x0e\x07\x00\ +\x0e\x1c\x0f\x1c\x1b\x13\x13\x10\x17\x10\x0f\x0f\x06\x17\x17\x18\ +\x18 \x07\x06\x06\x1f\x0e\x00\x0f\x1c\x0f\x06\x14\x0a\x0a\x05\ +\x17\x06\x0f\x1c\x05\x15\x00?3?3\x129\x113\x11\ +3\x11\x1299\x11\x013\x113\x113\x113\x11\x12\ +9\x113\x11\x129\x1133\x11\x1299\x11\x129\ +\x113310\x01#\x06\x07\x03!\x01!\x13\x16\x15\ +367\x13\x03!\x13\x16\x1736\x12\x11!\x10\x02\ +\x07!'&\x03y\x08\x0a.l\xfe\xb6\xfe}\x01\x91\ +\xa2\x1f\x08\x05(oP\x01w\x7f\x17\x07\x0bK:\x01\ +\x87\xdb\xd1\xfe\xbaG\x13\x01\xb2;q\xfe\xfa\x04m\xfd\ +\xc6t\x012\x01@\xfdP<\xe7\xe9:\x01\ +\xd1\xe0\xf1\x04m\x01\x00\xa7\xa7\xff\x00\xe8\xde\xfe\x88\x98\ +\x8f\x00\x02\x00\x00\x00\x00\x05;\x05P\x00\x12\x00\x1b\x00\ +V@.\x05\x07\x0b\x07\x03\x18\x18\x11\x00\x0f\x13\x0b\x0f\ +\x0b\x1c\x1d\x06\x11\x12\x11KY\x07\x17KY\x0f\x07\x1f\ +\x07\x02\x0c\x03\x07\x07\x0f\x03\x01\x12\x0f\x0f\x18KY\x0f\ +\x15\x00?+\x00\x18?\xc63\x129/_^]+\ ++\x11\x003\x11\x12\x0199\x113\x11333\x11\ +33\x11\x12910\x135!\x15!\x11!\x153\ + \x04\x15\x14\x04!!\x11#\x11\x014&##\x15\ +326\xfa\x01\x87\x01y\xfe\x87\x8b\x01!\x01\x0e\xfe\ +\xf6\xfe\xf6\xfd\xd3\xfa\x03\xb4MW\x8f\x93IW\x04m\ +\xe3\xe3\xff\x00\xa0\xad\xad\xbd\xb6\x03m\x01\x00\xfc\xf55\ +6\xcd1\x00\x01\x00\x9e\xff\xec\x07m\x05\xc9\x00!\x00\ +`@1\x04\x0c\x02\x05\x05\x19\x12\x12\x1f\x18\x14\x14\x15\ +\x15\x1f\x22# \x00\x02\x1c\x00NY\x1c\x04\x0b\x05\x08\ +\x05\x13\x18\x13NY\x02\x18\x18\x15\x16\x03\x15\x12\x0f\x08\ +NY\x0f\x13\x00?+\x00\x18??\x129/3+\ +\x11\x003\x11\x129\x18?+\x11\x12\x009\x11\x12\x01\ +99\x113\x113\x129\x1133\x113991\ +0\x01 \x07!\x11!\x14\x163267\x11\x06\x06\ +# \x00\x03#\x11!\x11!\x113\x12\x00!2\x16\ +\x17\x03&\x05q\xfe\xfd9\x02B\xfd\xb6\xba\x92Y\xc6\ +\x9fz\xcb\x88\xfe\xc2\xfe\x92\x22q\xfes\x01\x8d}7\ +\x01\x84\x01$\x82\xe9{\x88\xbb\x04\x85\xed\xfe\xbc\x82\xa3\ +*2\xfe\xb91'\x01=\x01+\xfd\xac\x05\xb6\xfd\xe2\ +\x01\x07\x01*5:\xfe\xc1j\x00\x01\x00\x87\xff\xec\x06\ +\x85\x04\x81\x00\x1e\x00l@9\x16\x1c\x14\x17\x17\x09\x02\ +\x02\x0e\x08\x04\x04\x05\x05\x0e\x1f \x0f\x14\x11\x0c\x11I\ +Y\x0c\x10\x14\x08\x1c\x17\x1a\x17\x03\x08\x03IY\x0c\x08\ +\x1c\x08\x02\x0c\x03\x08\x08\x05\x06\x0f\x05\x15\x00\x1aIY\ +\x00\x16\x00?+\x00\x18??\x129/_^]+\ +\x11\x003\x11\x129\x113\x18?+\x11\x12\x009\x11\ +\x12\x0199\x113\x113\x129\x1133\x1139\ +910\x05 \x03#\x11!\x11!\x1136$!\ +2\x17\x03&#\x22\x06\x07!\x11!\x16\x16327\ +\x11\x06\x05\x04\xfd\xf39\xb0\xfey\x01\x87\xb5\x22\x01\x16\ +\x01\x01\xc7\xc2q\x98\x86UO\x0c\x01p\xfe\x90\x08_\ +O\xa4\xba\x9c\x14\x01\xc6\xfeN\x04m\xfe`\xdc\xd8T\ +\xfe\xf8EPM\xfe\xe5aO\x5c\xfe\xe1S\x00\x02\xff\ +\xf6\x00\x00\x06\xcf\x05\xb6\x00\x0b\x00\x0e\x00L@%\x00\ +\x0d\x0b\x05\x0c\x09\x08\x04\x01\x0e\x0e\x06\x0b\x0b\x0a\x0a\x10\ +\x06\x07\x07\x0f\x01\x05\x0c\x05QY\x0c\x0c\x07\x0e\x08\x03\ +\x0b\x03\x07\x12\x00?33?3\x129/+\x11\x00\ +3\x11\x013\x113\x113\x113\x11\x129\x1133\ +3399\x129910\x01#\x11!\x11#\x03\ +!\x01!\x01!\x01!\x03\x04bR\xfe\xa4R\xd5\xfe\ +i\x02\x81\x01\xd1\x02\x87\xfej\xfd\x9c\x01\x19\x8c\x02+\ +\xfd\xd5\x02+\xfd\xd5\x05\xb6\xfaJ\x03N\x01h\x00\x00\ +\x02\xff\xf0\x00\x00\x05\xaa\x04m\x00\x0b\x00\x0f\x00U@\ ++\x08\x0c\x09\x0f\x03\x0d\x02\x0e\x0b\x0f\x0f\x00\x05\x06\x04\ +\x0e\x0e\x09\x02\x02\x01\x01\x11\x09\x0a\x0a\x10\x04\x08\x0c\x08\ +KY\x0c\x0c\x0a\x0f\x0b\x0f\x06\x02\x0a\x15\x00?33\ +?3\x129/+\x11\x003\x11\x013\x113\x113\ +\x113\x11\x129\x11\x173\x113\x11\x1299\x11\x12\ +9910\x01\x01!\x03#\x11!\x11#\x03!\x01\ +\x133\x03#\x03\xa2\x02\x08\xfe\x87\x89>\xfe\xc7=\x8c\ +\xfe\x88\x02\x02n\xddh\x0a\x04m\xfb\x93\x01u\xfe\x8b\ +\x01u\xfe\x8b\x04m\xfe\x0a\x01\x14\x00\x00\x02\x00\x9e\x00\ +\x00\x09X\x05\xb6\x00\x13\x00\x16\x00|@B\x00\x15\x13\ +\x05\x14\x06\x16\x0f\x08\x10\x07\x01\x04\x11\x10\x04\x16\x16\x06\ +\x06\x07\x07\x13\x0a\x13\x12\x12\x0e\x0a\x0a\x0b\x0b\x18\x17\x01\ +\x05\x14\x05QY\x0e\x09NY\x15\x14\x0e\x0e\x14\x15\x03\ +\x0b\x10\x10\x16SY\x10\x03\x0c\x03\x13\x07\x03\x0b\x12\x00\ +?333??+\x11\x12\x00\x179\x18///\ +++\x11\x003\x11\x12\x019\x113\x1132\x113\ +\x11\x129\x113\x119\x11\x173\x11\x1299\x11\x12\ +99\x129910\x01#\x11!\x11#\x03!\x01\ +!\x11!\x11!\x11!\x13!\x01!\x01!\x03\x06\xec\ +R\xfe\xa3Q\xd5\xfeh\x01\x04\xfe\xa8\xfes\x01\x8d\x01\ +\xe7\xee\x01\xd1\x02\x87\xfek\xfd\x9b\x01\x19\x8b\x02+\xfd\ +\xd5\x02+\xfd\xd5\x02T\xfd\xac\x05\xb6\xfd\xe2\x02\x1e\xfa\ +J\x03N\x01h\x00\x02\x00\x87\x00\x00\x08\x0e\x04m\x00\ +\x13\x00\x17\x00x@=\x03\x15\x02\x16\x08\x14\x09\x17\x12\ +\x0b\x13\x0a\x13\x17\x17\x07\x04\x00\x16\x16\x09\x09\x0a\x0a\x02\ +\x11\x0d\x0d\x0e\x0e\x18\x19\x02\x01\x01\x19\x04\x08\x14\x08K\ +Y\x11\x0cFY\x14\x11\x14\x11\x0e\x16\x13\x0f\x0f\x0f\x0a\ +\x06\x02\x0e\x15\x00?333??3\x1299/\ +/++\x11\x003\x11\x013\x113\x11\x129\x113\ +\x113\x129\x113\x119\x113333\x113\x11\ +\x1299\x11\x1299\x11\x129910\x01\x01!\ +\x03#\x11!\x11#\x03!\x13!\x11!\x11!\x11!\ +\x13\x133\x03#\x06\x06\x02\x08\xfe\x88\x8a=\xfe\xc7>\ +\x8b\xfe\x87\xc5\xfe\xe1\xfe\x8d\x01s\x01\xa2\xbao\xddi\ +\x0a\x04m\xfb\x93\x01u\xfe\x8b\x01u\xfe\x8b\x01\xb2\xfe\ +N\x04m\xfeh\x01\x98\xfe\x0a\x01\x14\x00\x02\xff\xf6\x00\ +\x00\x06\xe7\x05\xb6\x00\x02\x00\x1e\x00c@0\x01\x1d\x00\ +\x04\x1c\x11\x10\x05\x02\x02\x16\x0b\x0b\x1d\x04\x17\x0a\x0a \ +\x16\x17\x17\x1f\x0f\x12\x12\x02\x01\x05\x1c\x1c\x17\x1e\x04\x1d\ +\x1d\x01\x1e\x1e\x01QY\x1e\x03\x11\x0b\x17\x12\x00?3\ +3?+\x11\x12\x009\x113\x11\x129\x18/3\x12\ +93\x113\x11\x013\x113\x113\x11\x12993\ +\x11\x129\x113333\x129\x12910\x01!\ +\x13\x01\x15\x01\x1e\x02\x17\x13!\x03&&'\x11!\x11\ +\x06\x06\x07\x03!\x13>\x027\x015\x04/\xfe{\xc0\ +\x02\xb9\xfe\xa4hy`3\xac\xfeo{7M0\xfe\ +\x8f.G?{\xfeo\xac6Zpl\xfe\xac\x04\x93\ +\xfe\xda\x02I\xae\xfeP\x1dZ\x97\x85\xfe;\x01T\x9e\ +r\x04\xfd\x98\x02h\x02e\xad\xfe\xac\x01\xc5\x8f\x94S\ +\x1d\x01\xb0\xae\x00\x00\x02\x00\x00\x00\x00\x05\xb6\x04m\x00\ +\x16\x00\x19\x00f@3\x18\x15\x17\x01\x14\x0c\x0b\x02\x19\ +\x19\x10\x07\x07\x15\x01\x11\x06\x06\x1b\x10\x11\x11\x1a\x19\x18\ +\x14\x01\x15\x15\x16\x18\x16\x18LY\x0a\x0d\x14\x0dMY\ +\x02\x14\x14\x11\x16\x0f\x0c\x07\x11\x15\x00?33?\x12\ +9/3+\x11\x003+\x11\x12\x009\x113\x11\x12\ +9\x11\x013\x113\x113\x11\x12993\x11\x129\ +\x113333\x129\x12910\x01\x15\x01\x16\x16\ +\x17\x13!\x03&'\x11!\x11\x22\x07\x03!\x13\x127\ +\x015\x05!\x17\x05\x1f\xfe\xf1s\x93,t\xfe\x89S\ +'L\xfe\xc4I)T\xfe\x89mQ\xea\xfe\xe7\x02\xe6\ +\xfe\xc4\x9e\x04m\x96\xfe\xb2\x1c\x8e\x7f\xfe\xa0\x013\x84\ +\x07\xfeB\x01\xbe\x89\xfe\xcb\x01`\x01\x01*\x01L\x96\ +\xfa\xcf\x00\x00\x02\x00\x9e\x00\x00\x09m\x05\xb6\x00 \x00\ +#\x00\x87@D\x22\x1f!#\x01\x17\x1e\x14\x1e\x0e\x0d\ +\x02##\x08\x13\x13\x1f\x01\x14\x07\x14\x08\x1d\x19\x19\x1a\ +\x1a%$\x08\x07\x07%#\x22\x02\x01\x1f\x1f \x22 \ +\x22QY\x0f\x0c\x0c\x02\x1d\x18NY\x02\x1d\x02\x1d\x1a\ + \x03\x1b\x03\x14\x0e\x08\x1a\x12\x00?333??\ +\x1299//+\x11\x003\x113+\x11\x12\x009\ +\x113\x11\x129\x11\x013\x113\x11\x129\x113\x11\ +3\x129\x11\x12992\x11\x129\x113333\ +\x11\x129\x11\x129\x11910\x01\x15\x01\x1e\x02\x17\ +\x13!\x03&&'\x11!\x11\x06\x06\x07\x03!\x136\ +7!\x11!\x11!\x11!\x015\x01!\x13\x08\xa8\xfe\ +\xa4hzb1\xac\xfen{7M0\xfe\x8f.G\ +?{\xfeo\xac\x15&\xfe\xc9\xfes\x01\x8d\x025\xfe\ +\xdf\x03u\xfe{\xc1\x05\xb6\xae\xfeP\x1eY\x9b\x81\xfe\ +;\x01T\x9er\x04\xfd\x98\x02h\x02e\xad\xfe\xac\x01\ +\xc5;T\xfd\xac\x05\xb6\xfd\xe2\x01p\xae\xfe\xdd\xfe\xda\ +\x00\x00\x02\x00\x87\x00\x00\x08\x1d\x04m\x00\x1d\x00 \x00\ +\x88@F\x1f\x1c\x1e \x01\x14\x1b\x11\x1b\x0c\x0b\x02 \ + \x07\x10\x10\x1c\x01\x11\x06\x11\x07\x1a\x16\x16\x17\x17\x22\ +!\x07\x06\x06\x22 \x02\x1f\x01\x1c\x1c\x1d\x1f\x1d\x1fL\ +Y\x0d\x0a\x02\x0aMY\x1a\x15FY\x02\x1a\x02\x1a\x17\ +\x1d\x0f\x18\x0f\x11\x0c\x07\x17\x15\x00?333??\ +\x1299//++\x11\x003+\x11\x12\x009\x11\ +3\x11\x129\x11\x013\x113\x11\x129\x113\x113\ +\x129\x11\x12992\x11\x129\x113333\x11\ +\x129\x11\x129\x11910\x01\x15\x01\x16\x16\x17\x13\ +!\x03&'\x11!\x11\x22\x07\x03!\x1367#\x11\ +!\x11!\x11!\x035\x05!\x17\x07\x85\xfe\xf2s\x93\ ++u\xfe\x89T'L\xfe\xc5J)T\xfe\x89m\x0a\ +\x17\xfa\xfe\x8d\x01s\x01\xd5\xd9\x02\xe5\xfe\xc5\x9d\x04m\ +\x96\xfe\xb2\x1c\x8d\x80\xfe\xa0\x013\x84\x07\xfeB\x01\xbe\ +\x89\xfe\xcb\x01`#/\xfeN\x04m\xfeh\x01\x02\x96\ +\xfa\xcf\x00\x00\x01\x00-\xfe\x1d\x04\xf4\x07\x02\x00H\x00\ +\x8d@J.\x112(\x0d88\x0bDBB@@\ +F\x03\x07\x07F\x09F?\x03=\x0b=\x17(( \ +\x0b\x11\x04JI<3:@:PY\x0d323\ +2OY33@\x13DD\x05\x0f\x00\x01\x09\x03\x00\ +F\x08@\x03%\x1aQY%\x1b,\x13\x13\x00?3\ +?+\x00\x18?33\xc4_^]29|/\x11\ +\x129\x18/+\x11\x12\x009+\x11\x12\x009\x11\x12\ +\x01\x179\x1133\x11\x12\x179\x113\x113\x113\ +\x113\x113\x113\x113\x129\x11310\x012\ +\x17\x15&#\x22\x06\x07\x16\x16\x15\x10\x05\x15\x16\x16\x15\ +\x14\x04\x05\x06\x06\x15\x14\x1632632\x16\x17\x11\ +&#\x07\x07\x22&54676654&#\ +#\x11326654#\x22\x07\x03667&\ +'5!\x16\x1766\x04\x19a*\x1d53Y.\ +\x8a\x9a\xfe\xa8\xc6\xca\xfe\xc6\xfe\xe4}g:Ed\xac\ +8B_\x0f&\x92\xcf\xdf\xbf\xdf\xfe\xfc\xae\x89\xa8\xa8\ +\xac\x9at\x83<\xd3\xc7\x97\xa6Y\xb1o\x90S\x01\x06\ +g_m\x89\x07\x02\x10\xbb\x0dOK*\xads\xfe\xdf\ +;\x08\x11\xb2\x97\xcb\xe6\x05\x04#-#\x1d\x0a\x18\x13\ +\xfe\xe6\x22\x04\x04\xc5\xa2\xc8\xc5\x04\x02GOIJ\x01\ +@\x1744nf\x01\x109C\x0f\xb1O\x1bNu\ +\x95Y\x00\x00\x01\xff\xfe\xfe\x14\x04/\x05s\x00K\x00\ +\x97@N5+\x0e::\x0bGEECCI\x03\ +\x08\x08I\x09IB\x03@\x0b \x0b+1\x12\x12M\ +@\x18++L?=6I=IY\x0e656\ +5KY66I\x16GG\x05\x0f\x00\x01\x09\x03\x00\ +@C\x08I\x10'\x1aIY'\x1b\x16-IY\x16\ +\x16\x00?+\x00\x18?+\x00\x18?33\x1a\xcd_\ +^]29|/\x11\x129\x18/+\x11\x12\x009\ ++\x11\x12\x009\x11\x013\x1133\x113\x113\x12\ +99\x11\x12\x179\x113\x113\x113\x113\x113\ +\x113\x113\x12910\x012\x17\x15&#\x22\x06\ +\x07\x16\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06\x05\x06\x06\ +\x15\x14\x1632632\x17\x11&&#\x22\x07\x06\ +#\x22&54676654&##53\ +2654&#\x22\x07\x03667&'53\ +\x16\x1766\x03\x81R9\x22D%H\x1cqro\ +^x\x84\xfa\xfe\xf2mPH\x01\x0f\x01\x15\x013\ +\x8e\xfe\xf7\x85\xcfej\xfd\x8fdaad\x00\x01\x00\ +\x00\x00\x00\x05\xe1\x05\xcb\x00\x18\x008@\x1b\x0b\x0a\x11\ +\x11\x0d\x16\x16\x08\x08\x03\x03\x1a\x0d\x0c\x0c\x19\x0c\x03\x11\ +\x0b\x12\x00\x06NY\x00\x04\x00?+\x00\x18?3?\ +\x11\x013\x113\x113\x113\x113\x11\x129\x113\ +310\x012\x16\x17\x11&#\x22\x06\x07\x01!\x01\ +!\x13\x16\x16\x17667\x13>\x02\x04\xfe9\x83'\ +&>59\x15\xfe\xc9\xfe/\xfe\x0e\x01\xbc\xd7\x10-\ +\x03\x06/\x11\x5c(_\x94\x05\xcb\x18\x13\xfe\xd3\x14B\ +G\xfc\x02\x05\xb6\xfd\x00:\xd99:\xd0>\x01\x8b\xa5\ +\x9eK\x00\x00\x01\x00\x00\x00\x00\x05\x04\x04\x81\x00\x1a\x00\ +6@\x1b\x01\x00\x0a\x0a\x0e\x03\x0e\x19\x19\x14\x14\x1c\x03\ +\x02\x02\x1b\x11\x17GY\x11\x10\x02\x0f\x0a\x01\x15\x00?\ +3??+\x11\x013\x113\x113\x113\x113\x11\ +\x129\x113310!!\x01!\x13\x1e\x03\x153\ +47\x13>\x0232\x16\x17\x11&#\x22\x06\x07\x03\ +3\xfe}\xfeP\x01\x98\xc0\x01\x06\x05\x04\x09\x12q0\ +Xx`)d#(*).\x13\x04m\xfdb\x05\ +\x18!%\x104=\x01^\x92\x8a:\x12\x0f\xfe\xe4\x0e\ +,4\x00\xff\xff\x00\x00\x00\x00\x05\xe1\x07s\x02&\x02\ +\x80\x00\x00\x01\x07\x03v\x05\xd1\x01R\x00\x0a\xb4\x02\x01\ +,\x05&\x00+55\xff\xff\x00\x00\x00\x00\x05\x04\x06\ +!\x02&\x02\x81\x00\x00\x01\x07\x03v\x05\x83\x00\x00\x00\ +\x0a\xb4\x02\x01.\x11&\x00+55\xff\xff\x00h\xfe\ +\x14\x0bA\x05\xcd\x00&\x002\x00\x00\x00\x07\x00\x5c\x06\ +`\x00\x00\xff\xff\x00V\xfe\x14\x09\xd1\x04\x81\x00&\x00\ +R\x00\x00\x00\x07\x00\x5c\x04\xf0\x00\x00\x00\x02\x00h\xff\ +\x81\x06H\x063\x00\x16\x00'\x00[@.\x0e&&\ +\x08\x19\x19 \x17\x17\x0b\x14\x22\x22\x03\x1d \x00\x00\x1d\ +\x0b\x03()$\x22&\x0e&NY\x14\x11@\x0e\x04\ +\x1d\x1b\x19\x08\x19NY\x05\x03\x08\x13\x00?3\xcd+\ +\x11\x0033\x18?\x1a\xcd3+\x11\x0033\x11\x12\ +\x01\x179\x113\x1133\x113\x113\x11\x129\x11\ +33\x11310\x01\x10\x00\x05\x06#\x22&'$\ +\x00\x11\x10\x00%6632\x16\x17\x04\x00\x01\x10\x17\ +632\x17665\x10'\x06#\x22'\x06\x06H\ +\xfe\xce\xfe\xda!s$\x01|\x01I\x01F\x01x&=3\ +3=&\xfe\x85\xfe\xbb\xfe\xbbL``(\xcf\x9a\x01\ +EMggN\x00\x02\x00V\xff\x89\x05F\x04\xe3\x00\ +\x17\x00+\x00W@+$\x15\x03 *\x0f\x09\x1a \ +\x1a\x22\x18\x18\x0c\x22\x00\x0c\x00,-'$*\x0f*\ +FY\x15\x12@\x0f\x0f \x1d\x1a\x03\x1aFY\x09\x06\ +\x03\x15\x00?\xcd3+\x11\x0033\x18?\x1a\xcd3\ ++\x11\x0033\x11\x12\x0199\x113\x113\x11\x12\ +99\x11333\x1133310\x01\x14\x00\x07\ +\x06\x06#\x22&'&\x0054\x0076632\ +\x16\x17\x16\x00\x05\x14\x176632\x16\x17654\ +'\x06\x06#\x22&'\x06\x05F\xfe\xfd\xeb\x09J8\ +6J\x0b\xea\xfe\xfe\x01\x00\xec\x09L84L\x09\xe9\ +\x01\x05\xfc\x9d_\x09K94L\x09``\x08K8\ +5K\x0b_\x029\xf5\xfe\xdc 6AB5$\x01\ ++\xea\xef\x01% 6@B4$\xfe\xd7\xe7\xd1E\ +6AC4H\xce\xc9H6AB3J\x00\x03\x00\ +h\xff\xec\x08\xa2\x08\xfe\x00\x15\x00J\x00[\x00\x8b@\ +E3\x199H9-RKK\x0c\x01\x0bVNV\ +V&BB??-HH\x1f-\x1f\x5c]ON\ +N0@@)0\x16606NY\x1c0\x04&\ +)E<)L\ +\x1c\x01\x85\x1bMB\x8a\x9a\x80\xfe\xc4\xbd\xa5;7B\ +CdW[_\x08\x83\xf2\x11\x1c\x22\x1c92>\xa1\ +\x8e&/&\xfc\x02F\x01\x175>\xfe\x88\xfe\xb1\xf3\ +\xfe\x9b\xbeO__O\xc3\x01e\xee\x01N\x01y@\ +3\xfe\xe9F\xcd\xcc\xd3\xe4(\x1a\x01d\xfe\x9c\x22 \ +\xe0\xd7\xcc\xcd\x02Rx\x88f\x042\x1c.\x0e\x0d:\ +9Df\x00\x03\x00)\xff\xec\x07\x14\x07\xbe\x00)\x00\ +:\x00O\x00{@=FL\x1c\x01\x85\x1bMB\x8a\x9a\x80\x07D\ +\x7f\xacffff\xac\x7f\xfdAF\x01\x175>\xfe\ +\x88\xfe\xb1\xf3\xfe\x9b\xbeO__O\xc3\x01e\xee\x01\ +N\x01y@3\xfe\xe9F\xcd\xcc\xd3\xe4(\x1a\x01d\ +\xfe\x9c\x22 \xe0\xd7\xcc\xcd\x00\x00\x02\x00\x00\x00\x00\x06\ +\xd1\x05\xd1\x00\x0d\x00,\x00\x84@@\x13\x12\x18\x18\x1c\ +\x15\x1c\x0f\x1d**)!!\x1e\x1e\x1d\x1d\x14\x0a\x0b\ +\x0b\x07\x03\x02\x02\x06\x06\x07\x07%\x15%&&.\x15\ +\x14\x14-\x1c\x0f\x1d*\x1d\x14\x22\x18\x18\x13\x14\x0d\x0d\ +\x05\x09\x07\x03\x0b%\x14\x0f*\x13\x15\x00?3?3\ +\xde22\xc922/\x11\x129\x113\x113\x11\x12\ +99\x11\x013\x113\x113\x113\x11\x129\x113\ +\x113\x113\x113\x113\x119\x113\x119\x113\ +3\x11\x1299\x11\x129\x113310\x01\x15\x07\ +#'#\x07#'#\x07#'5\x01#\x06\x07\x03\ +!\x01!\x13\x16\x15367\x13\x03!\x13\x16\x173\ +6\x12\x11!\x10\x02\x07!'&\x05\x19RF1\x85\ +1F1\x851FP\x01\xa2\x08\x0a.l\xfe\xb6\xfe\ +}\x01\x91\xa2\x1f\x08\x05(kL\x01w\x83\x0e\x0c\x0b\ +K:\x01\x87\xdb\xd1\xfe\xbaG\x13\x05\xd1\x7f\xacff\ +ff\xac\x7f\xfb\xe1;q\xfe\xfa\x04m\xfd\xc6t<\ +Bh\x01\x1b\x01%\xfd\x9d/^\x9d\x01O\x01\x04\xfe\ +\x99\xfd\xbf\xc5\xfcS\x00\x00\x01\x00h\xfe\x14\x04\xf2\x05\ +\xcb\x00\x19\x001@\x19\x01\x00\x00\x14\x0d\x14\x07\x07\x0d\ +\x1a\x1b\x0b\x11NY\x0b\x04\x04\x16NY\x04\x13\x01\x1c\ +\x00??+\x00\x18?+\x11\x12\x0199\x113\x11\ +\x129\x11310\x01!\x11\x07# \x00\x114\x12\ +$32\x17\x03&&#\x22\x06\x15\x10!267\ +\x04\xd7\xfes\x1b\x1b\xfe\xb5\xfe\x9f\xab\x01A\xd9\xed\xd8\ +yQ\xa2]\x8d\x9e\x01As\xc8]\xfe\x14\x01\xda\x02\ +\x01\x80\x01k\xe3\x01X\xb9g\xfe\xc9&4\xe7\xcb\xfe\ +Z6&\x00\x01\x00V\xfe\x14\x04\x1d\x04\x81\x00\x15\x00\ +1@\x19\x00\x15\x15\x09\x10\x10\x04\x04\x09\x16\x17\x07\x0d\ +GY\x07\x10\x01\x12GY\x01\x16\x00\x1c\x00??+\ +\x00\x18?+\x11\x12\x0199\x113\x11\x129\x113\ +10\x01\x11$\x00\x11\x10\x00!2\x17\x03&&#\ +\x22\x06\x15\x10327\x11\x02o\xfe\xf7\xfe\xf0\x016\ +\x01\x1e\xc5\xaesGxA_h\xc9\xac\x9e\xfe\x14\x01\ +\xd8\x09\x01)\x01\x13\x01\x1a\x016V\xfe\xdf\x1f%\x94\ +\x87\xfe\xf0d\xfc\x8d\x00\x00\x01\x003\xff\xfa\x04}\x05\ +\x0a\x00\x13\x00\x12\xb6\x07\x11\x14\x15\x0e\x04\x12\x00?/\ +\x11\x12\x019910\x01\x17\x07'\x07'7'7\ +\x177'7\x177\x17\x07\x17\x07'\x02\x8b\xe2\x81\xe0\ +\x8b\xe7\x89\xf0\x7f\xf4\x8d\xf1\x81\xef\x89\xe6\x87\xe3\x83\xdd\ +\x01\xc5\x86\xdb\x81\xeb\x85\xeb\x8e\xdb\x8b\xf7\x8e\xdd\x8b\xeb\ +\x85\xeb\x83\xdc\x81\x00\x01\x00{\x04y\x03\xdb\x06\x10\x00\ +\x10\x00\x1e@\x0c\x09\x0e\x06\x00\x00\x11\x12\x0c\x08\x08\x03\ +\x00\x00/22\x113\x11\x12\x019\x113\xc921\ +0\x01\x06\x06#\x22&543!6632\x15\ +\x14#\x01\x87\x08E8\x0232\x16\ +\x15\x15#4&#\x22\x07\x07\x06##5\xe9N\x87\ +}{D\x8a\x90\xdb1/%?<}\xd0\x11\x05\xc1\ +&.&\x8e\xa1=19\x1b\x1a5\xf2\x00\x00\x01\x01\ +\x96\x04\xb6\x03\x0a\x06o\x00\x11\x00\x22@\x0e\x0b\x0f\x06\ +\x00\x00\x12\x13\x00\x0a\x0a\x0e\x0e\x03\x0f\x00/\xcc3\x11\ +9\x113\x11\x12\x019\x10\xc92910\x0146\ +32\x16\x15\x14\x07\x06\x06\x15\x14\x16\x17\x15\x22&\x01\ +\x96_[WcB$\x1fA2\xa6\xbc\x05\xb6Rg\ +D99\x0f\x08\x1b\x18\x22.\x02g\x88\x00\x00\x01\x01\ +\x83\x04\xb6\x02\xf8\x06o\x00\x11\x00$@\x0f\x07\x00\x0c\ +\x03\x0c\x0c\x12\x13\x00\x08\x08\x04\x0f\x04\x03\x00/3\xcc\ +\x119\x113\x11\x12\x019\x113\x10\xc9910\x01\ +\x14\x06#56654&'&54632\ +\x16\x02\xf8\xbd\xa5:8\x1f#CdVVe\x05\xb6\ +x\x88g\x033\x1c\x18\x1b\x08\x0f99Db\x00\x00\ +\x08\x00%\xfe\xc1\x07\xbc\x05\x91\x00\x0c\x00\x1a\x00(\x00\ +6\x00D\x00R\x00`\x00n\x00\x9a@JP4,\ +H,,\x18dl:\x1e&B&&^\x03\x10\x18\ +\x0a\x18\x18l^VlVope^WkhS\ +aahIA;O7EE>LLZ\x07-\ +%\x1f3\x1b))\x2200\x14ZZhh\x07\x11\ +\x17\x0d\x14\x04\x0a\x00\x07\x00/3\xc82/3\xca2\ +\x129/3\x11\x129/33\x113\xca222\ +\x11\x129/33\x113\xca222\x113\x113\ +\x10\xca222\x11\x12\x0199\x10\xc8\x119\x113\ +\x10\xc82\x119\x113\x10\xc82\x10\xc8\x119\x113\ +\x10\xc8210\x012\x16\x17#&&#\x22\x07#\ +66\x132\x16\x17#&&#\x22\x06\x07#66\ +\x012\x16\x17#&&#\x22\x06\x07#66!2\ +\x16\x17#&&#\x22\x06\x07#66\x012\x16\x17\ +#&&#\x22\x06\x07#66!2\x16\x17#&\ +&#\x22\x06\x07#66\x012\x16\x17#&&#\ +\x22\x06\x07#66!2\x16\x17#&&#\x22\x06\ +\x07#66\x03\xe9j\x82\x04s\x033Gw\x03w\ +\x04\x89dj\x82\x04s\x033G<=\x01w\x04\x89\ +\x02\xb4i\x83\x04s\x033G9?\x03v\x04\x88\xfb\ +\xd6h\x82\x06s\x033G9@\x02w\x04\x8b\x04\xf2\ +i\x83\x04s\x033G;=\x03v\x04\x88\xfb\xd6h\ +\x82\x06s\x033G<>\x01w\x04\x8b\x05\x86j\x81\ +\x04r\x033G<>\x01w\x04\x8b\xfa\xadj\x81\x04\ +s\x033F<>\x01w\x04\x89\x05\x91r\x5c\x22\x1f\ +AYu\xf9\xfer\x5c\x22\x1f! Yu\x01\x17q\ +^!!#\x1fYvp_!!#\x1fZu\x03\ +\xcfq^\x22\x1f! Yvp_\x22\x1f! Z\ +u\xfe\x1eq]\x22\x1f! Ztq]#\x1e!\ + Yu\x00\x08\x00%\xfe\x7f\x07y\x05\xd3\x00\x07\x00\ +\x0f\x00\x17\x00\x1f\x00'\x000\x007\x00@\x00`@\ +3\x1b\x1e14)-\x00\x06\x08\x0e!%8<\x13\ +\x16\x16<%\x0e\x06-4\x1e\x08AB $25\ +\x18\x1e\x10\x169=(,,=\x16\x1e5$\x06\x06\ +\x0c\x0e\x04\x06\x00/3/3\x12\x179\x113\x113\ +\x113\x113\x113\x113\x11\x12\x01\x179\x113\x11\ +3\x113\x113\x113\x113\x113\x11310\x05\ +\x06\x06\x07#673\x016673\x06\x07#\x01\ +\x16\x16\x17\x15&'5\x01&&'5\x16\x17\x15\x01\ +\x17\x06\x06\x07'76\x01'667\x17\x07\x06\x06\ +\x037\x16\x17\x07'&\x01\x07&&'7\x17\x16\x16\ +\x04f\x15=(\xb35\x11\xdd\xfe\xdd\x13I\x1f\xb22\ +\x13\xdd\x02\xe5S\xa8U\xdd\x81\xfbZB\xbfO\xd3\x8b\ +\x04\xd1}2\xc34\x9c\x02\x86\xfb\xb8},\xbe=\x9d\ +\x04H\xb8l\x7f[k\x9d\x11Q\x05\x10}5c/\ +\x9c\x12*K1Q\xa8W\xdd\x81\x04\xa6G\xc8A\xd3\ +\x8b\xfeI\x16='\xb35\x11\xdd\xfe\xdd\x11F$\xb2\ +2\x13\xdd\x03\x22|\x1f\x82&\x9c\x12O\xfa\xf0\x7f\x1a\ +~/\x9e\x10+T\x05\x17|\x99\x8d\x9e\x04\x8a\xfb\xb1\ +}T\x94A\x9c\x02K\xa3\x00\x00\x02\x00\x9e\xfe9\x07\ +`\x07\xa8\x00\x13\x00 \x00[@.\x1f\x1e\x1e\x17\x18\ +\x06\x18\x12\x03\x02\x0d\x02\x13\x0d\x0c\x08\x0a\x0b\x0b\x09\x08\ +\x13\x08!\x22\x13\x12\x04\x11\x0d\x00\x0d\x08NY\x0d\x12\ +\x0b\x1b\x1e\x17\x1b\x14\x06\x00\x03\x00?2\xde2\xcd2\ +??+\x11\x12\x0099\x18?\x11\x12\x0199\x11\ +33\x113\x1292\x113\x11\x12\x179\x1133\ +\x11310\x13!\x11\x14\x033\x01!\x11!\x03!\ +\x13#\x114\x13#\x01!\x01\x22&'!\x16\x163\ +267!\x02\x9e\x01`\x10\x08\x02G\x01\xe8\x01;\ +\xbe\xfeL\xc8\xef\x12\x08\xfd\xb4\xfe\x19\x02\xc0\xf2\xea\x0d\ +\x01E\x05JUMO\x08\x01L)\x05\xb6\xfd\x8cd\ +\xfe\xd4\x04\x04\xfb\x8e\xfc\xf5\x01\xc7\x02d\x8b\x01\x15\xfb\ +\xfc\x06+\xbd\xc0^\x5c\x5c^\xfe\x83\x00\x02\x00\x87\xfe\ +`\x06L\x06V\x00\x12\x00\x1e\x00[@.\x1d\x1c\x1c\ +\x16\x17\x05\x17\x10\x03\x01\x0c\x01\x11\x0c\x0b\x07\x09\x0a\x0a\ +\x08\x07\x11\x07\x1f \x1c\x16\x1a\x13@\x04\x0f\x0c\x05\x12\ +\x0f\x11\x15\x0c\x07JY\x0c\x15\x0a#\x00??+\x00\ +\x18??3\x1299\x1a\xde2\xcd2\x11\x12\x019\ +9\x1133\x113\x1292\x113\x11\x12\x179\x11\ +33\x11310\x01\x11\x14\x06\x03\x01!\x11!\x03\ +!\x13#\x1147\x01!\x11%\x22&'!\x16\x16\ +327!\x02\x01\xe3\x01\x0d\x01\xc5\x01\xb0\x01\x02\x9c\ +\xfe\x94\x91\xe7\x0e\xfe=\xfeN\x02o\xef\xed\x0e\x01F\ +\x05LS\x96\x0e\x01K)\x04m\xfe\xe3\x188\xfe\xb8\ +\x02\xb5\xfc\xa3\xfdP\x01\xa0\x013\xa1\xdc\xfdP\x04m\ +l\xba\xc3bX\xba\xfe\x83\x00\x00\x02\xff\xf8\x00\x00\x05\ +\x0e\x05\xb6\x00\x12\x00\x19\x00P@)\x0d\x0f\x00\x0f\x0b\ +\x13\x13\x08\x06\x04\x16\x00\x04\x00\x1a\x1b\x0f\x19PY\x0e\ +\x06\x07\x06SY\x0b\x07\x0f\x07\x0f\x07\x04\x09\x03\x04\x13\ +PY\x04\x12\x00?+\x00\x18?\x1299//\x11\ +3+\x11\x003+\x11\x12\x0199\x113\x1133\ +3\x1133\x11\x12910\x01\x14\x04!!\x11#\ +\x1135!\x15!\x11!\x153 \x04\x01325\ +4##\x05\x0e\xfe\xc2\xfe\xda\xfe'\xd9\xd9\x01\x8d\x01\ +3\xfe\xcd>\x012\x01@\xfdP<\xe7\xe9:\x01\xd1\ +\xe0\xf1\x04\x0e\x01\x00\xa8\xa8\xff\x00\x89\xde\xfe\x88\x98\x8f\ +\x00\x00\x02\x00\x00\x00\x00\x04\xd5\x06\x14\x00\x12\x00\x1b\x00\ +R@*\x05\x07\x0b\x07\x03\x18\x18\x11\x00\x0f\x13\x0b\x0f\ +\x0b\x1c\x1d\x07\x17KY\x06\x11\x12\x11KY\x03\x12\x07\ +\x12\x07\x12\x0f\x01\x0f\x18KY\x0f\x15\x01\x00\x00??\ ++\x11\x12\x0099\x18//\x113+\x11\x003+\ +\x11\x12\x0199\x113\x11333\x1133\x11\x12\ +910\x135!\x15!\x11!\x113 \x04\x15\x14\ +\x04!!\x11#\x11\x014&##\x15326\x93\ +\x01\x88\x01x\xfe\x88\x8b\x01!\x01\x0e\xfe\xf6\xfe\xf6\xfd\ +\xd2\x93\x03NMW\x8f\x93HX\x05Z\xba\xba\xff\x00\ +\xfes\xad\xad\xbd\xb6\x04Z\x01\x00\xfc\x0856\xcd1\ +\x00\x00\x02\x00\x9e\x00\x00\x05\x14\x05\xb6\x00\x0f\x00\x19\x00\ +e@4\x00\x0d\x0d\x0a\x11\x14\x14\x10\x16\x10\x04\x04\x05\ +\x16\x0a\x05\x0a\x1a\x1b\x0e\x0f\x0f\x00\x00\x0d\x03\x0a\x0a\x16\ +\x12\x13\x13\x16\x14\x03\x11\x19\x06\x19QY\x03\x11QY\ +\x03\x03\x05\x06\x03\x05\x12\x00??\x129/++\x11\ +\x12\x00\x179\x113\x113\x11\x1299\x113\x113\ +\x11\x12\x0199\x113\x113\x113\x11\x129\x113\ +\x129\x11310\x01\x06##\x11!\x11! \x04\ +\x15\x14\x06\x07\x17\x07\x013'7\x17654##\ +\x03\x7f?W\xc0\xfeu\x02K\x01\x16\x01\x15c_\x5c\ +\xb4\xfe/\x93h\xb4m\x10\xa4\xb8\x01\xf2\x0d\xfe\x1b\x05\ +\xb6\xf2\xdf\x8e\xd4?\x86\x7f\x01\xc5\x9c\x81\xa2,<\xb1\ +\x00\x00\x02\x00\x87\xfe\x14\x04\xfe\x04\x81\x00\x17\x00&\x00\ +P@*\x1f\x1c$\x1c\x0d\x08\x08\x09$\x12\x09\x12'\ +(\x12$\x22$\x1f\x18\x0f\x18GY\x0d\x04\x15\x00\x04\ +\x01\x0f\x10\x0a\x0f\x09\x1c\x01\x1fFY\x01\x16\x00?+\ +\x00\x18???\x12\x179+\x11\x12\x0099\x113\ +\x11\x12\x0199\x113\x113\x1133\x11\x1291\ +0\x05\x07\x22&'#\x16\x15\x11!\x11!\x1736\ +32\x12\x11\x14\x06\x07\x17\x07\x01\x22\x06\x07\x15\x14\x16\ +\x17'7\x17654&\x03{7\x5c\x95E\x12\x12\ +\xfey\x01>7\x12r\xd2\xc9\xe3ZNZ\xcb\xfe\xe0\ +^W\x02W`}\xcc[\x08U\x10\x04;Hw\x1d\ +\xfe9\x06Y\x90\xa4\xfe\xc6\xfe\xf2\xaa\xf3H\x8f\x7f\x04\ +\x0at\x82\x1f\x9f\x88\x02\xc7\x81\x91E/\x90\x83\x00\x00\ +\x01\x00\x14\x00\x00\x04m\x05\xb6\x00\x0d\x00=@\x1e\x08\ +\x03\x06\x0a\x0a\x0d\x01\x0b\x0b\x03\x0e\x0f\x09\x0d\x00\x0dO\ +Y\x06\x00\x00\x02\x0b\x12\x02\x05OY\x02\x03\x00?+\ +\x00\x18?\x129/3+\x11\x003\x11\x12\x0199\ +\x11333\x113\x12910\x133\x11!\x11!\ +\x11!\x11!\x11!\x11#\x14\xb3\x03\xa6\xfd\xe7\x01f\ +\xfe\x9a\xfes\xb3\x03s\x02C\xfe\xc1\xfe\xfc\xfe\xc0\xfd\ +\xcd\x023\x00\x01\x00\x14\x00\x00\x03\xd1\x04m\x00\x0d\x00\ +=@\x1e\x08\x03\x06\x0a\x0a\x0d\x01\x0b\x0b\x03\x0e\x0f\x09\ +\x0d\x00\x0dFY\x06\x00\x00\x02\x0b\x15\x02\x05FY\x02\ +\x0f\x00?+\x00\x18?\x129/3+\x11\x003\x11\ +\x12\x0199\x11333\x113\x12910\x133\ +\x11!\x11!\x15!\x11!\x11!\x11#\x14\x92\x03+\ +\xfe\x5c\x01\x19\xfe\xe7\xfey\x92\x02\xa2\x01\xcb\xfe\xdd\xa8\ +\xfe\xdd\xfe\x81\x01\x7f\x00\x00\x01\x00\x9e\xfe5\x05\xae\x05\ +\xb6\x00\x1d\x00F@$\x04\x06\x0c\x06\x13\x00\x00\x01\x19\ +\x0c\x01\x0c\x1e\x1f\x10\x16NY\x10\x1b\x08\x1bNY\x08\ +\x08\x01\x02\x02\x05OY\x02\x03\x01\x12\x00??+\x11\ +\x12\x009\x18/+\x00\x18?+\x11\x12\x0199\x11\ +3\x113\x10\xc23\x11\x12910!!\x11!\x11\ +!\x11632\x04\x12\x15\x14\x02\x04#\x22&'\x11\ +\x163265\x10!\x22\x07\x02+\xfes\x03\xcf\xfd\ +\xbe\x85\x9a\xb6\x01\x15\x99\x91\xfe\xf5\xbaG\xa02dk\ +\x81\x8a\xfe\xe7|Y\x05\xb6\xfe\xc1\xfe\x9b+\x97\xfe\xdf\ +\xc9\xcf\xfe\xdc\x94\x14\x0f\x01D#\xa9\x9f\x019\x1f\x00\ +\x01\x00\x87\xfe5\x04\xd5\x04m\x00\x1c\x00F@$\x15\ +\x17\x00\x17\x05\x11\x11\x12\x0b\x00\x12\x00\x1d\x1e\x19\x0eF\ +Y\x19\x19\x12\x13\x13\x16FY\x13\x0f\x12\x15\x03\x08F\ +Y\x03\x1b\x00?+\x00\x18??+\x11\x12\x009\x18\ +/+\x11\x12\x0199\x113\x113\x1292\x11\x12\ +910%\x10\x00#\x22'\x11\x1632654\ +&#\x22\x07\x11!\x11!\x11!\x15632\x16\x16\ +\x04\xd5\xfe\xec\xfe\x8dzJqlekp8'\xfe\ +y\x03s\xfe\x14WE\xa9\xfd\x85f\xfe\xf2\xfe\xdd/\ +\x01\x1f+~\x86o\x81\x11\xfe\xc5\x04m\xfe\xdd\xee\x13\ +\x82\xed\x00\x00\x01\xff\xf8\xfe9\x08\xc3\x05\xb6\x00\x15\x00\ +o@7\x0f\x0a\x0a\x09\x0c\x09\x06\x11\x11\x03\x00\x12\x12\ +\x01\x07\x07\x08\x08\x0d\x0c\x0c\x17\x16\x02\x01\x01\x14\x15\x15\ +\x16\x10\x06\x09\x09\x13\x03\x00\x00\x12\x01\x12\x15\x12\x0f\x0a\ +NY\x0f\x12\x0d\x1b\x07\x04\x01\x03\x00?33??\ ++\x00\x18?3\x11\x129\x11333\x1133\x11\ +\x013\x1133\x113\x11\x129\x1133\x113\x11\ +\x129\x11333\x1133\x11\x129\x11310\ +\x01\x01!\x01\x11!\x11\x01!\x01\x01!\x11!\x11#\ +\x01\x11!\x11\x01!\x01\xc7\xfeV\x01\xaa\x01\x95\x01}\ +\x01\x98\x01\xaa\xfeR\x01\x0c\x01J\xfe\x7f\xb9\xfeP\xfe\ +\x83\xfeP\xfeL\x02\xfc\x02\xba\xfd<\x02\xc4\xfd<\x02\ +\xc4\xfdF\xfeH\xfc\xf5\x01\xc7\x02\xe5\xfd\x1b\x02\xe5\xfd\ +\x1b\x00\x01\xff\xf8\xfe`\x08\x1d\x04m\x00\x15\x00m@\ +6\x0c\x07\x07\x06\x09\x06\x03\x0e\x0e\x13\x00\x0f\x0f\x14\x04\ +\x04\x05\x05\x0a\x09\x09\x17\x16\x15\x14\x14\x11\x12\x12\x16\x0d\ +\x03\x06\x06\x10\x00\x13\x13\x0c\x04\x01\x14\x0f\x0f\x12\x15\x0c\ +\x07FY\x0c\x15\x0a#\x00??+\x00\x18?3?\ +33\x129\x11333\x1133\x11\x013\x113\ +3\x113\x11\x129\x1133\x113\x11\x129\x113\ +33\x1133\x11\x129\x11310\x01\x11!\x11\ +\x01!\x01\x13!\x11!\x11#\x01\x11!\x11\x01!\x01\ +\x01!\x03#\x01}\x01`\x01\xa4\xfe\x81\xd7\x01!\xfe\ +\xaa\xa6\xfe\x7f\xfe\x83\xfe\x7f\xfeV\x01\xa6\xfe\x81\x01\xa4\ +\x02H\x02%\xfd\xdb\x02%\xfd\xe5\xfe\xd1\xfd=\x01\xa0\ +\x02?\xfd\xc1\x02?\xfd\xc1\x02R\x02\x1b\x00\xff\xff\x00\ +X\xfe\x14\x04\xf4\x05\xcb\x02&\x01\xb1\x00\x00\x00\x07\x03\ +\x7f\x01\xd9\x00\x00\xff\xff\x00H\xfe\x14\x04/\x04\x81\x02\ +&\x01\xd1\x00\x00\x00\x07\x03\x7f\x01j\x00\x00\x00\x01\x00\ +\x9e\xfe9\x06\x1b\x05\xb6\x00\x0e\x00K@%\x05\x00\x00\ +\x0e\x02\x0e\x0b\x07\x07\x08\x0c\x0d\x0d\x03\x02\x08\x02\x0f\x10\ +\x0b\x06\x0e\x0e\x05\x0c\x09\x03\x08\x12\x05\x00NY\x05\x12\ +\x03\x1b\x00??+\x00\x18??3\x129\x1133\ +\x11\x12\x0199\x1133\x113\x113\x1133\x11\ +\x129\x11310\x01!\x11!\x11#\x01\x11!\x11\ +!\x11\x01!\x01\x04\xd1\x01J\xfe\x7f\xbd\xfeN\xfes\ +\x01\x8d\x01\xa2\x01\xb2\xfe=\x01D\xfc\xf5\x01\xc7\x02\xe5\ +\xfd\x1b\x05\xb6\xfd<\x02\xc4\xfdF\x00\x00\x01\x00\x87\xfe\ +`\x05\xb0\x04m\x00\x0e\x00K@%\x08\x03\x03\x02\x05\ +\x02\x0e\x0a\x0a\x0b\x00\x01\x01\x06\x05\x0b\x05\x0f\x10\x0e\x09\ +\x02\x02\x08\x00\x0c\x0f\x0b\x15\x08\x03FY\x08\x15\x06#\ +\x00??+\x00\x18??3\x129\x1133\x11\x12\ +\x0199\x1133\x113\x113\x1133\x11\x129\ +\x11310\x01!\x01\x13!\x11!\x11#\x01\x11!\ +\x11!\x11\x03\xa0\x01\xb0\xfeX\xe7\x01!\xfe\xaa\xa8\xfe\ +\x5c\xfey\x01\x87\x04m\xfd\xe1\xfe\xd5\xfd=\x01\xa0\x02\ +?\xfd\xc1\x04m\xfd\xdb\x00\x01\x00\x9e\x00\x00\x06\x02\x05\ +\xb6\x00\x12\x00^@.\x12\x11\x0f\x03\x03\x0c\x04\x04\x01\ +\x0b\x07\x07\x08\x08\x14\x13\x10\x11\x11\x01\x00\x00\x14\x0c\x0f\ +\x0b\x10\x10\x09\x0b\x12\x02\x05\x01\x05\x12\x04\x12\x0d\x03\x08\ +\x09\x03\x01\x08\x12\x00?3?\x12\x179\x113\x11\x12\ +9\x113\x113\x11\x1299\x11\x013\x1133\x11\ +3\x11\x129\x113\x113\x129\x1133\x113\x12\ +910!!\x03\x15#\x11\x07\x11!\x11!\x117\ +\x113\x15\x13!\x01\x06\x02\xfe7\xfe\x9fq\xfes\x01\ +\x8dq\x9f\xee\x01\xbc\xfd\xe2\x01d\xe9\x01\xb6H\xfe\x17\ +\x05\xb6\xfd<\x9b\x01\xdb\xfb\x01I\xfdF\x00\x00\x01\x00\ +\x87\x00\x00\x05\xc3\x04m\x00\x12\x00`@/\x03\x0a\x0a\ +\x00\x0b\x0b\x08\x12\x06\x0e\x0e\x0f\x0f\x14\x13\x08\x07\x04\x05\ +\x05\x07\x07\x14\x03\x00\x04\x12\x04\x10\x12\x06\x09\x0c\x08\x0d\ +\x0d\x06\x01\x06\x0b\x03\x0f\x10\x0f\x08\x0f\x15\x00?3?\ +\x12\x179\x113\x11\x1299\x113\x113\x11\x129\ +9\x11\x013\x113\x113\x113\x11\x129\x113\x11\ +33\x129\x1133\x11310\x01\x113\x15\x13\ +!\x01\x01!\x03\x15#\x11'\x11!\x11!\x11\x02j\ +\x98\xe5\x01\xbb\xfe\x1a\x02\x07\xfe7\xf8\x98\x5c\xfey\x01\ +\x87\x02\xb2\x01X\xa8\x01\x0b\xfd\xe1\xfd\xb2\x01#\xc1\x01\ +ql\xfd\xc1\x04m\xfd\xdb\x00\x00\x01\x00\x0e\x00\x00\x05\ +\x87\x05\xb6\x00\x15\x00X@+\x0e\x0c\x13\x0c\x15\x10\x04\ +\x04\x09\x07\x05\x05\x17\x16\x13\x14\x14\x01\x00\x00\x17\x0f\x07\ +\x08\x07SY\x0c\x08\x08\x10\x0a\x10\x02\x15\x15\x05\x13\x0a\ +\x03\x01\x05\x12\x00?3?3\x129\x1133\x11\x12\ +9/3+\x11\x003\x11\x013\x1133\x113\x11\ +\x129\x11333\x11333\x11\x12910!\ +!\x01\x07\x11!\x11#\x1135!\x153\x11#\x15\ +67\x01!\x01\x05\x7f\xfeB\xfe\xdfu\xfes\x90\x90\ +\x01\x8d\x8f\x8f\x1e[\x013\x01\xb0\xfe3\x02/F\xfe\ +\x17\x04'\x01\x00\x8f\x8f\xff\x00\xec;\x80\x01\xc0\xfdq\ +\x00\x00\x01\x00\x00\x00\x00\x05\x85\x06\x14\x00\x12\x00V@\ +*\x09\x06\x04\x02\x0d\x0d\x12\x10\x0e\x0e\x14\x13\x07\x08\x08\ +\x0b\x0a\x0a\x14\x09\x06\x0c\x06\x0c\x06\x07\x0b\x0e\x15\x05\x10\ +\x11\x10LY\x02\x11\x11\x07\x0f\x00\x00\x00??9/\ +3+\x11\x003\x18?3\x1299//\x113\x11\ +\x013\x1133\x113\x11\x129\x11333\x113\ +33310\x13!\x153\x15#\x11\x01!\x01\x01\ +!\x01\x11!\x11#53\x9c\x01\x87\xe9\xe9\x01\x91\x01\ +\xb0\xfeX\x01\xc9\xfeB\xfe\x5c\xfey\x9c\x9c\x06\x14\x93\ +\xf2\xfd\xb9\x02%\xfd\xe1\xfd\xb2\x02?\xfd\xc1\x04\x8f\xf2\ +\x00\x00\x01\x003\x00\x00\x06b\x05\xb6\x00\x0f\x00F@\ +\x22\x0f\x0a\x04\x04\x05\x05\x07\x01\x07\x11\x10\x0d\x0e\x0e\x01\ +\x00\x00\x11\x0a\x02\x0f\x0f\x05\x0d\x08\x08\x07NY\x08\x03\ +\x01\x05\x12\x00?3?+\x11\x003\x129\x1133\ +\x11\x013\x1133\x113\x11\x129\x11\x129\x113\ +\x113310!!\x01\x07\x11!\x11!\x11!\x11\ +67\x01!\x01\x06Z\xfeB\xfe\xdfu\xfes\xfe\xba\ +\x02\xd3\x1e[\x013\x01\xb0\xfe4\x02/F\xfe\x17\x04\ +s\x01C\xfd\x85;\x80\x01\xc0\xfdq\x00\x01\x001\x00\ +\x00\x06\x81\x04m\x00\x0c\x00N@&\x03\x00\x07\x07\x08\ +\x08\x05\x0a\x0a\x0e\x0d\x05\x04\x01\x02\x02\x04\x04\x0e\x03\x00\ +\x06\x00\x06\x00\x08\x0b\x0b\x0aFY\x0b\x0f\x05\x08\x15\x01\ +\x0f\x00??3?+\x11\x12\x0099\x18//\x11\ +3\x11\x013\x113\x113\x113\x11\x129\x11\x129\ +\x113\x113310\x01\x01!\x01\x01!\x01\x11!\ +\x11!\x11!\x03\x1f\x01\x91\x01\xb0\xfeX\x01\xc9\xfeB\ +\xfe\x5c\xfey\xfe\x99\x02\xee\x02H\x02%\xfd\xe1\xfd\xb2\ +\x02?\xfd\xc1\x03J\x01#\x00\x00\x01\x00\x9e\xfe9\x06\ +\xb6\x05\xb6\x00\x0f\x00F@$\x0d\x05\x05\x00\x00\x02\x0c\ +\x08\x08\x09\x03\x02\x09\x02\x10\x11\x0c\x07NY\x0c\x0c\x05\ +\x0e\x0a\x03\x09\x12\x05\x00NY\x05\x12\x03\x1b\x00??\ ++\x00\x18??3\x129/+\x11\x12\x0199\x11\ +3\x113\x113\x129\x113\x11310\x01!\x11\ +!\x11!\x11!\x11!\x11!\x11!\x11!\x05\x83\x01\ +3\xfe\x7f\xfe\xc1\xfe5\xfes\x01\x8d\x01\xcb\x01\x8d\x01\ +D\xfc\xf5\x01\xc7\x02T\xfd\xac\x05\xb6\xfd\xe2\x02\x1e\x00\ +\x01\x00\x87\xfe`\x05\xc9\x04m\x00\x0f\x00F@$\x02\ +\x0a\x0a\x05\x05\x07\x01\x0d\x0d\x0e\x08\x07\x0e\x07\x10\x11\x01\ +\x0cFY\x01\x01\x0a\x03\x0f\x0f\x0e\x15\x0a\x05FY\x0a\ +\x15\x08#\x00??+\x00\x18??3\x129/+\ +\x11\x12\x0199\x113\x113\x113\x129\x113\x11\ +310\x01\x11!\x11!\x113\x11!\x11!\x11!\ +\x11!\x11\x02\x0e\x016\x01\x87\xfe\xfe\xaa\xfe\xd1\xfe\xca\ +\xfey\x04m\xfeh\x01\x98\xfc\xb6\xfd=\x01\xa0\x01\xb2\ +\xfeN\x04m\x00\x00\x01\x00\x9e\x00\x00\x06\xc9\x05\xb6\x00\ +\x0d\x00A@!\x09\x01\x01\x00\x00\x0c\x08\x04\x04\x05\x05\ +\x0c\x0e\x0f\x08\x03NY\x08\x08\x05\x0a\x0a\x0dNY\x0a\ +\x03\x06\x03\x01\x05\x12\x00?3??+\x11\x12\x009\ +\x18/+\x11\x12\x0199\x113\x113\x129\x113\ +\x11310!!\x11!\x11!\x11!\x11!\x11!\ +\x11!\x05\x83\xfes\xfe5\xfes\x01\x8d\x01\xcb\x02\xd3\ +\xfe\xba\x02T\xfd\xac\x05\xb6\xfd\xe2\x02\x1e\xfe\xbd\x00\x00\ +\x01\x00\x87\x00\x00\x06\x17\x04m\x00\x0d\x00A@!\x0c\ +\x04\x04\x03\x03\x01\x0b\x07\x07\x08\x08\x01\x0e\x0f\x0b\x06F\ +Y\x0b\x0b\x08\x0d\x0d\x02FY\x0d\x0f\x09\x0f\x04\x08\x15\ +\x00?3??+\x11\x12\x009\x18/+\x11\x12\x01\ +99\x113\x113\x129\x113\x11310\x01\x11\ +!\x11!\x11!\x11!\x11!\x11!\x11\x06\x17\xfe\xb4\ +\xfey\xfe\xca\xfey\x01\x87\x016\x04m\xfe\xdd\xfc\xb6\ +\x01\xb2\xfeN\x04m\xfeh\x01\x98\x00\x00\x01\x00\x9e\xfe\ +5\x08\xb0\x05\xb6\x00 \x00N@(\x1d\x1e\x0d\x19\x00\ +\x19\x19\x1a\x1a\x13\x1e\x13\x06\x1e\x06!\x22\x02\x16NY\ +\x02\x02\x1e\x1f\x1f\x1cNY\x1f\x03\x1a\x1e\x12\x0a\x10N\ +Y\x0a\x1b\x00?+\x00\x18?3?+\x11\x12\x009\ +\x18/+\x11\x12\x0199\x113\x11\x129\x113\x11\ +3\x10\xc2\x11310\x01632\x04\x12\x15\x14\x02\ +\x04#\x22&'\x11\x1632654&#\x22\x07\ +\x11!\x11!\x11!\x11!\x05L\x7f\x95\xb0\x01\x0d\x93\ +\x8b\xfe\xfe\xb4D\x9a1]fw\x81\x87\x80uS\xfe\ +r\xfem\xfes\x04\xae\x03\x12+\x98\xfe\xdf\xc8\xce\xfe\ +\xdd\x96\x14\x0f\x01D#\xa9\x9f\x96\xa3\x1f\xfe%\x04s\ +\xfb\x8d\x05\xb6\x00\x00\x01\x00\x87\xfe5\x07m\x04m\x00\ +\x1f\x00N@(\x04\x05\x13\x01\x08\x00\x00\x01\x01\x1a\x05\ +\x1a\x0e\x05\x0e !\x11\x17FY\x11\x1b\x0a\x1dFY\ +\x0a\x0a\x05\x06\x06\x03FY\x06\x0f\x01\x05\x15\x00?3\ +?+\x11\x12\x009\x18/+\x00\x18?+\x11\x12\x01\ +99\x113\x11\x129\x113\x113\x129\x1131\ +0!!\x11!\x11!\x11!\x11632\x16\x16\x15\ +\x10\x00#\x22'\x11\x16\x1632654&#\x22\ +\x07\x04\xa6\xfey\xfe\xef\xfey\x04\x1fTH\xa9\xfd\x85\ +\xfe\xec\xff\x8ex%g.lekp:$\x03J\ +\xfc\xb6\x04m\xfd\xef\x13\x82\xed\x9a\xfe\xf2\xfe\xdd/\x01\ +\x1f\x16\x15~\x86o\x81\x11\x00\x00\x02\x00h\xff\xac\x06\ +P\x05\xcd\x00-\x007\x00q@9\x1a . \x14\ +\x0e663.3%\x03(\x00(\x14..\x09\x00\ +\x14\x008960\x06+0QY++\x10\x17\x17\ +\x1dNY\x17\x04\x0e\x10\x06\x0c\x06PY\x0c\x10\x10#\ +NY\x10\x13\x00?+\x00\x18\x10\xc4+\x11\x12\x009\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x009\x11\x12\ +\x0199\x1133\x11\x129\x11\x12992\x11\x12\ +9\x113\x113\x11\x12910\x01\x14\x06\x07\x16\x16\ +327\x11\x06\x06#\x22'\x06#\x22$\x025\x10\ +\x00!2\x16\x17\x03&#\x22\x06\x15\x14\x16327\ +&&54632\x16\x054#\x22\x06\x15\x14\x16\ +\x176\x06!yi\x12P\x17OI\x1bx:\xd4\x98\ +f\xc3\xc5\xfe\xdb\x9c\x01:\x01/K\xab/`XP\ +s{\x87s5\x171D\xd9\xcb\xcc\xe0\xfe\xaeV%\ +1 'e\x02\xa6}\xedU\x08\x08\x17\xfe\xd7\x0b\x0e\ +o/\xaf\x01K\xe1\x01{\x01\x8b\x1c\x13\xfe\xcf\x1c\xe6\ +\xd0\xc3\xe1\x06;\xc5^\xd2\xe3\xd9\xd3\x8dJL?r\ +@_\x00\x00\x02\x00V\xff\xba\x05N\x04\x81\x00'\x00\ +2\x00q@9\x14.\x1b\x1b\x0f\x0a++(.(\ +\x1f\x03\x22\x00\x22\x0f..\x06\x00\x0f\x0034+1\ +\x03%1JY%%\x0c\x12\x12\x18FY\x12\x10\x08\ +\x03JY\x08\x0a\x0a\x0c\x1e\x0c\x1eIY\x0c\x16\x00?\ ++\x11\x12\x009\x18/\xc5+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x009\x11\x12\x0199\x1133\ +\x11\x129\x11\x12992\x11\x129\x113\x113\x11\ +\x12910\x01\x14\x06\x0727\x11\x06#\x22'\x06\ +#\x22\x00\x11\x10\x00!2\x17\x03&&#\x22\x06\x15\ +\x14\x16\x173&&54632\x16\x05\x14\x16\x17\ +6654&#\x22\x05=A7I@Rq\xad\ +vl\x9c\xf5\xfe\xeb\x01 \x01\x09\x83m]\x1fK\x19\ +YY`V\x1b\x1a!\xbe\xa8\xa4\xc0\xfeP%\x1d'\ +-&\x22N\x01\xfeV\xa7<\x18\xfe\xfe!P\x1e\x01\ +6\x01\x15\x01\x1a\x0101\xfe\xed\x0e\x13\x9e\x8b\x8c\x9d\ +\x04.\x8a<\xa0\xb6\xb6\xb3*[\x22\x16^:*.\ +\x00\xff\xff\x00h\xfe\x14\x04\xf2\x05\xcb\x02&\x00&\x00\ +\x00\x00\x07\x03\x7f\x02)\x00\x00\xff\xff\x00V\xfe\x14\x04\ +\x1d\x04\x81\x02&\x00F\x00\x00\x00\x07\x03\x7f\x01\xaa\x00\ +\x00\x00\x01\x003\xfe9\x04\x87\x05\xb6\x00\x0b\x006@\ +\x1c\x02\x03\x03\x00\x00\x05\x0a\x05\x07\x03\x0c\x0d\x0b\x07\x08\ +\x07NY\x08\x03\x05\x00NY\x05\x12\x03\x1b\x00??\ ++\x00\x18?+\x11\x003\x11\x12\x01\x179\x113\x12\ +9\x11310\x01!\x11!\x11!\x11!\x11!\x11\ +!\x03#\x01\x1f\xfe\x7f\xfe\xd7\xfe\x9b\x04T\xfe\x9c\x01\ +D\xfc\xf5\x01\xc7\x04s\x01C\xfe\xbd\x00\x01\x001\xfe\ +`\x04\xa2\x04m\x00\x0b\x006@\x1c\x04\x05\x05\x02\x02\ +\x07\x00\x07\x09\x03\x0c\x0d\x01\x09\x0a\x09FY\x0a\x0f\x07\ +\x02FY\x07\x15\x05#\x00??+\x00\x18?+\x11\ +\x003\x11\x12\x01\x179\x113\x129\x11310\x01\ +!\x113\x11!\x11!\x11!\x11!\x04\xa2\xfe\x8b\xea\ +\xfe\xaa\xfe\xe5\xfe\x8b\x04q\x03J\xfd\xd9\xfd=\x01\xa0\ +\x03J\x01#\x00\xff\xff\x00\x00\x00\x00\x05P\x05\xb6\x02\ +\x06\x00<\x00\x00\x00\x01\x00\x00\xfe\x14\x04\xe3\x04m\x00\ +\x10\x000@\x16\x0e\x00\x09\x09\x02\x0c\x0c\x0d\x0d\x12\x02\ +\x01\x01\x0e\x08\x00\x11\x10\x1c\x0c\x01\x0f\x00?3?\x11\ +322\x013\x113\x113\x113\x11\x129\x113\ +310%\x01!\x13\x1e\x03\x15347\x13!\x01\ +\x11!\x01\xae\xfeR\x01\x98\xc0\x01\x06\x06\x05\x09\x10\xc9\ +\x01\x97\xfeR\xfey\x04\x04i\xfdb\x05\x18!%\x10\ +;6\x02\xa0\xfb\x97\xfe\x10\x00\x00\x01\x00\x00\x00\x00\x05\ +P\x05\xb6\x00\x10\x00^@.\x0b\x06\x0f\x02\x09\x0e\x0e\ +\x00\x08\x03\x03\x00\x00\x10\x01\x01\x02\x02\x12\x10\x0f\x0f\x11\ +\x07\x0b\x0c\x0bNY\x00\x0e\x0f\x0e\x03\x03\x04\x01\x04\x0c\ +\x0c\x09\x01\x0f\x03\x09\x12\x00??3\x129/3\x11\ +\x129\x113\x11\x129+\x11\x003\x11\x013\x113\ +\x113\x113\x11\x129\x113\x113\x113\x113\x11\ +\x129910\x01\x13!\x01\x15!\x11!\x15!5\ +!\x11!5\x01!\x02\xa8\xfc\x01\xac\xfe\x1f\x01G\xfe\ +\xb9\xfer\xfe\xb9\x01G\xfe\x1f\x01\xae\x03\x98\x02\x1e\xfc\ +\x85\x1e\xfe\xbc\xd9\xd9\x01D\x12\x03\x87\x00\x01\x00\x00\xfe\ +\x14\x04\xe3\x04m\x00\x18\x00V@*\x18\x13\x03\x0f\x15\ +\x11\x11\x0b\x16\x01\x01\x0b\x0b\x04\x0e\x0e\x0f\x0f\x1a\x04\x03\ +\x03\x19\x16\x1c\x10\x0a\x02\x02\x00\x0e\x03\x0f\x14\x18\x00\x18\ +FY\x11\x00\x15\x00?2+\x11\x003\x18?3\x12\ +9\x1133?\x11\x013\x113\x113\x113\x11\x12\ +9\x113\x113\x113\x113\x11\x1299103\ +!5\x01!\x13\x1e\x03\x15347\x13!\x01\x15!\ +\x11!\x15!5!w\x017\xfeR\x01\x98\xc0\x01\x06\ +\x06\x05\x09\x10\xc9\x01\x97\xfeR\x018\xfe\xc8\xfey\xfe\ +\xc9#\x04J\xfdv\x05\x18!$\x10:6\x02\x8c\xfb\ +\xb6#\xfe\xdd\xc9\xc9\x00\x00\x01\x00\x04\xfe9\x067\x05\ +\xb6\x00\x0f\x00[@-\x05\x00\x00\x0f\x02\x09\x0f\x0a\x0d\ +\x0e\x0e\x03\x02\x02\x11\x0b\x0a\x0a\x07\x08\x08\x10\x0c\x0f\x0d\ +\x0d\x0a\x06\x0f\x0f\x09\x09\x05\x0a\x03\x08\x12\x05\x00NY\ +\x05\x12\x03\x1b\x00??+\x00\x18??\x129\x113\ +\x119\x113\x11\x129\x11\x013\x1133\x113\x11\ +3\x1133\x113\x1299\x11\x129\x11310\ +\x01!\x11!\x11#\x01\x01!\x01\x01!\x01\x13!\x01\ +\x04\xe1\x01V\xfe\x7f\xbc\xfe\xe3\xfe\xe6\xfeA\x01\xe5\xfe\ +8\x01\xb6\x01\x08\xfe\x01\xc3\xfe1\x01D\xfc\xf5\x01\xc7\ +\x01\xc9\xfe7\x02\xec\x02\xca\xfe<\x01\xc4\xfd\x17\x00\x00\ +\x01\x00\x0a\xfe`\x05f\x04m\x00\x0f\x00Y@,\x0c\ +\x07\x07\x06\x09\x00\x06\x01\x04\x05\x05\x0a\x09\x09\x11\x02\x01\ +\x01\x0e\x0f\x0f\x10\x0f\x15\x0d\x0c\x03\x06\x06\x00\x00\x01\x0c\ +\x0c\x07FY\x0c\x15\x0a#\x04\x01\x0f\x00?3??\ ++\x11\x12\x009\x113\x119\x129\x18?\x11\x013\ +\x1133\x113\x113\x1133\x113\x1299\x11\ +\x129\x11310\x01\x01!\x13\x13!\x01\x13!\x11\ +!\x11#\x03\x03!\x01w\xfe\xa6\x01\xbc\xac\xb0\x01\xbd\ +\xfe\x9d\xb7\x01 \xfe\xaa\xcc\xbf\xbe\xfeC\x02B\x02+\ +\xfe\xc2\x01>\xfd\xd5\xfe\xe1\xfd=\x01\xa0\x01X\xfe\xa8\ +\x00\x00\x01\x003\xfe9\x07d\x05\xb6\x00\x0f\x00L@\ +&\x0d\x0f\x00\x00\x03\x03\x05\x0f\x0f\x08\x08\x06\x0a\x06\x05\ +\x0a\x05\x10\x11\x0e\x0a\x0b\x0aNY\x01\x0b\x03\x03\x0f\x08\ +\x0fNY\x08\x12\x06\x1b\x00??+\x11\x003\x18?\ +3+\x11\x003\x11\x12\x0199\x113\x11\x129\x11\ +3\x11\x129\x113\x11\x12910\x01\x11!\x11!\ +\x11!\x11!\x11!\x11!\x11!\x11\x04\xa4\x01\x8d\x01\ +3\xfe\x7f\xfb\x90\xfe\xc0\x03\xfa\xfe\xd5\x01D\x04r\xfb\ +\x8e\xfc\xf5\x01\xc7\x04s\x01C\xfe\xbd\xfc\xd1\x00\x01\x00\ +1\xfe`\x06\xf4\x04m\x00\x0f\x00J@%\x00\x03\x03\ +\x06\x06\x02\x08\x02\x0b\x0b\x09\x0d\x09\x08\x0d\x08\x10\x11\x01\ +\x0d\x0e\x0dFY\x04\x0e\x0f\x06\x02\x0b\x02FY\x0b\x15\ +\x09#\x00??+\x11\x003\x18?3+\x11\x003\ +\x11\x12\x0199\x113\x11\x129\x113\x11\x129\x11\ +3\x11910\x01!\x11!\x11!\x113\x11!\x11\ +!\x11!\x11!\x04\x12\xfe\xde\x01\x7f\x01\x87\xfe\xfe\xaa\ +\xfb\xca\xfe\xc9\x03\xe1\x03J\xfd\xd9\x03J\xfc\xb6\xfd=\ +\x01\xa0\x03J\x01#\x00\x00\x01\x00o\xfe9\x06\xac\x05\ +\xb6\x00\x15\x00A@!\x13\x05\x05\x00\x00\x0e\x02\x0e\x0b\ +\x03\x02\x0b\x02\x16\x17\x08\x11NY\x08\x08\x05\x14\x0c\x03\ +\x05\x00NY\x05\x12\x03\x1b\x00??+\x00\x18?3\ +\x129/+\x11\x12\x0199\x113\x113\x11\x129\ +\x113\x11310\x01!\x11!\x11!\x11\x06#\x22\ +&5\x11!\x11\x14\x16327\x11!\x05y\x013\ +\xfe\x7f\xfe\xc1\xff\xc6\xcf\xe9\x01\x8dV^\x81\xbb\x01\x8d\ +\x01D\xfc\xf5\x01\xc7\x02\x1dX\xcd\xba\x02j\xfe\x19k\ +\x5cD\x02j\x00\x00\x01\x00V\xfe`\x05\xd5\x04m\x00\ +\x14\x00A@!\x05\x0d\x0d\x08\x08\x01\x0a\x01\x13\x0b\x0a\ +\x13\x0a\x15\x16\x10\x03FY\x10\x10\x0d\x06\x14\x0f\x0d\x08\ +JY\x0d\x15\x0b#\x00??+\x00\x18?3\x129\ +/+\x11\x12\x0199\x113\x113\x11\x129\x113\ +\x11310\x01\x11\x14327\x11!\x113\x11!\ +\x11!\x11\x06#\x22&5\x11\x01\xddmy\x8d\x01\x87\ +\xfe\xfe\xaa\xfe\xd1\xb4\xb3\xc3\xd0\x04m\xfetw)\x01\ +\xda\xfc\xa3\xfdP\x01\xa0\x01\x9cT\xc5\xbe\x01\xa2\x00\x00\ +\x01\x00j\x00\x00\x05u\x05\xb6\x00\x19\x00V@*\x00\ +\x0a\x0a\x17\x0b\x0b\x14\x06\x14\x11\x02\x06\x06\x05\x11\x05\x1a\ +\x1b\x00\x02\x02\x17\x0e\x17NY\x0c\x09\x07\x07\x0e\x0e\x12\ +\x18\x0b\x03\x06\x03\x12\x03\x06\x12\x00??3\x11\x129\ +9\x129/3\x1299+\x11\x003\x129\x11\x12\ +\x0199\x113\x113\x113\x11\x129\x1133\x11\ +310\x0167\x11!\x11!\x11\x06\x07\x11#\x11\ +\x06#\x22&5\x11!\x11\x14\x16\x17\x113\x03?P\ +X\x01\x8e\xferFb\x9fA<\xd0\xe9\x01\x8eJ^\ +\x9f\x03\x19\x12!\x02j\xfaJ\x02\x1d\x18\x1c\xfe\xa6\x01\ +<\x06\xcd\xba\x02j\xfe\x19_e\x03\x01B\x00\x01\x00\ +V\x00\x00\x05\x04\x04m\x00\x19\x00V@*\x00\x0a\x0a\ +\x17\x0b\x0b\x14\x06\x14\x11\x02\x06\x06\x05\x11\x05\x1a\x1b\x00\ +\x02\x02\x17\x0e\x17FY\x0c\x09\x07\x07\x0e\x0e\x12\x18\x0b\ +\x03\x06\x03\x12\x0f\x06\x15\x00??3\x11\x1299\x12\ +9/3\x1299+\x11\x003\x129\x11\x12\x019\ +9\x113\x113\x113\x11\x129\x1133\x1131\ +0\x0167\x11!\x11!\x11\x06\x07\x15#5\x06#\ +\x22&5\x11!\x11\x14\x16353\x02\xfaM6\x01\ +\x87\xfeyD?\x9a42\xd6\xce\x01\x87;H\x9a\x02\ +{\x0e\x13\x01\xd1\xfb\x93\x01\x9c\x1d\x12\xee\xcf\x06\xbd\xc6\ +\x01\xa2\xferA4\xd1\x00\x01\x00\x9e\x00\x00\x05\xa8\x05\ +\xb6\x00\x11\x00+@\x15\x02\x10\x10\x11\x09\x08\x11\x08\x12\ +\x13\x04\x0dNY\x04\x04\x09\x11\x12\x00\x03\x00??3\ +9/+\x11\x12\x0199\x113\x113\x11310\ +\x13!\x11$32\x16\x15\x11!\x114&#\x22\x07\ +\x11!\x9e\x01\x8d\x01\x02\xc3\xcf\xe9\xfesV_\x86\xb5\ +\xfes\x05\xb6\xfd\xe4X\xcd\xbb\xfd\x96\x01\xe7k\x5cD\ +\xfd\x96\x00\x00\x01\x00\x87\x00\x00\x05\x08\x04m\x00\x10\x00\ +-@\x16\x0a\x06\x06\x07\x00\x10\x07\x10\x11\x12\x0c\x03F\ +Y\x0c\x0c\x07\x08\x0f\x00\x07\x15\x00?3?\x129/\ ++\x11\x12\x0199\x113\x113\x11310!\x11\ +4#\x22\x07\x11!\x11!\x11632\x16\x15\x11\x03\ +\x81jv\x93\xfey\x01\x87\xc2\xa5\xcd\xc6\x01\x8du1\ +\xfe/\x04m\xfedT\xbd\xc6\xfe^\x00\x02\xff\xdf\xff\ +\xec\x07=\x05\xcb\x00!\x00(\x00Z@-\x1f\x18%\ +\x19\x19\x11\x04&\x18\x04\x18\x0d*\x0d\x08\x08)\x1e\x19\ +\x1c\x19\x05%\x0b\x10\x05\x10RY\x05\x05\x14\x00\x14\x22\ +PY\x14\x04\x00\x1cNY\x00\x13\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x0033\x113\x11\x12\ +9\x11\x013\x113\x11\x1299\x113\x1133\x11\ +3\x12910\x05\x22$\x02'#\x22&547\ +!\x06\x15\x14\x1633\x12\x00! \x00\x11\x15!\x16\ +\x163 %\x11\x06\x04\x03\x22\x06\x07!&&\x04}\ +\xcb\xfe\xc8\xbc\x12\x98\x96\x9f@\x01'\x1d%5/*\ +\x01t\x013\x01R\x01h\xfc\x11\x05\xb8\xa1\x01)\x01\ +\x04o\xfe\xbd\xb0w\xa6\x0c\x02V\x06\xa2\x14\x94\x01!\ +\xc7\x86\x7fhfF4##\x01#\x01-\xfe^\xfe\ +}>\x93\xa6\xac\xfe\xa6FO\x04\xb0\x9c\x85\x87\x9a\x00\ +\x02\xff\xdf\xff\xec\x05\x8d\x04\x81\x00\x1f\x00%\x00X@\ +,\x1d\x16\x22\x17\x17\x0f\x03#\x16\x03\x16\x0b'\x0b\x06\ +\x06&\x1c\x17\x1a\x17\x04\x0f\x04LY\x22\x09\x0f\x0f\x00\ +\x12\x12 JY\x12\x10\x00\x1aIY\x00\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/33+\x11\x003\ +\x11\x129\x11\x013\x113\x11\x1299\x113\x113\ +3\x113\x12910\x05 $'# 547\ +3\x06\x15\x14\x16336$3 \x00\x15\x15!\x16\ +\x16327\x11\x06\x06\x03\x22\x07!&&\x03\x9c\xfe\ +\xfe\xfe\xcd\x1bD\xfe\xd73\xf6\x1c%5\x0c\x22\x01\x1a\ +\xe9\x01\x01\x01\x15\xfdF\x04\x7fm\xcd\xb4^\xc8\x99\xa3\ +\x07\x01P\x02Y\x14\xf9\xe8\xdfh[A.\x1d \xd7\ +\xe7\xfe\xf5\xfb\xae^mV\xfe\xe70#\x03\x8b\xb4R\ +b\x00\x02\xff\xdf\xfe9\x07=\x05\xcb\x00\x22\x00)\x00\ +l@8!\x01 \x01\x02\x03\x04\x1f\x1f\x18&\x19\x19\ +\x11\x04'\x18\x04\x18\x0d+\x0d\x08\x08*\x1e\x19\x1c!\ +\x1cOY\x19\x05&\x0b\x10\x05\x10RY\x05\x05\x14\x01\ +\x01!\x12\x14#PY\x14\x04\x00\x1b\x00??+\x00\ +\x18?3\x11\x129/+\x11\x0033\x113+\x11\ +\x12\x009\x11\x013\x113\x11\x1299\x113\x113\ +3\x113\x129\x11\x12\x179\x11310\x01\x11&\ +\x00'#\x22&547!\x06\x15\x14\x1633\x12\ +\x00! \x00\x11\x15!\x16\x163 %\x11\x06\x07\x11\ +\x03\x22\x06\x07!&&\x03\xb8\xe6\xfe\xf0\x16\x98\x96\x9f\ +@\x01'\x1d%5/*\x01t\x013\x01R\x01h\ +\xfc\x11\x05\xb8\xa1\x01)\x01\x04\xa1\xff\xc2w\xa6\x0c\x02\ +V\x06\xa2\xfe9\x01\xc71\x01@\xf7\x86\x7fhfF\ +4##\x01#\x01-\xfe^\xfe}>\x93\xa6\xac\xfe\ +\xa6g\x22\xfeA\x06c\x9c\x85\x87\x9a\x00\x02\xff\xdf\xfe\ +`\x05\x8d\x04\x81\x00!\x00'\x00k@7\x03\x04\x06\ +\x04\x01\x03\x00\x08\x00\x1b$\x1c\x1c\x14\x08%\x1b\x08\x1b\ +\x10)\x10\x0b\x0b(!\x1c\x1f\x1c\x09\x14\x09LY$\ +\x0d\x14\x14\x02\x17\x17\x22JY\x17\x10\x04#\x02\x1fJ\ +Y\x05\x02\x16\x00?3+\x00\x18??+\x11\x12\x00\ +9\x18/33+\x11\x003\x11\x129\x11\x013\x11\ +3\x11\x1299\x113\x1133\x113\x129\x11\x12\ +\x179\x11310%\x06\x07\x11!\x11&&'#\ + 5473\x06\x15\x14\x16336$3 \x00\ +\x15\x15!\x16\x16327\x01\x22\x07!&&\x05D\ +y\x9c\xfe\xaa\xad\xcc\x14D\xfe\xd73\xf6\x1c%5\x0c\ +\x22\x01\x1a\xe9\x01\x01\x01\x15\xfdF\x04\x7fm\xcd\xb4\xfe\ +A\xa3\x07\x01P\x02Y?=\x10\xfen\x01\xa0+\xed\ +\xb5\xdfh[A.\x1d \xd7\xe7\xfe\xf5\xfb\xae^m\ +V\x02\x1f\xb4Rb\x00\xff\xff\x00F\x00\x00\x03?\x05\ +\xb6\x02\x06\x00,\x00\x00\xff\xff\xff\xf8\x00\x00\x08=\x07\ +\xa6\x02&\x01\xb0\x00\x00\x01\x07\x026\x01\xc5\x01P\x00\ +\x08\xb3\x01\x12\x05&\x00+5\xff\xff\xff\xf8\x00\x00\x07\ +\xcb\x06V\x02&\x01\xd0\x00\x00\x01\x07\x026\x01\x8b\x00\ +\x00\x00\x08\xb3\x01\x12\x11&\x00+5\x00\x01\x00\x9e\xfe\ +5\x06\x00\x05\xb6\x00\x1b\x00G@$\x05\x06\x06\x0b\x10\ +\x00\x07\x04\x00\x00\x01\x16\x0b\x01\x0b\x1c\x1d\x0e\x13NY\ +\x0e\x1b\x07\x19QY\x04\x07\x07\x01\x05\x02\x03\x01\x12\x00\ +??3\x129/3+\x00\x18?+\x11\x12\x019\ +9\x113\x113\x1133\x10\xc2\x129\x11310\ +!!\x11!\x11\x01!\x01\x16\x04\x12\x15\x10\x00!\x22\ +'\x11\x1632654&#\x22\x07\x02+\xfes\ +\x01\x8d\x01\xb6\x01\xb2\xfe\x1d\xb3\x01\x0d\x90\xfe\xbd\xfe\xed\ +\x9a\x8f{bx\x94\xab\x9a\x93g\x05\xb6\xfde\x02\x9b\ +\xfdw\x0d\x9f\xfe\xec\xb9\xfe\xcf\xfe\xb2-\x01D-\xa8\ +\x8f\xa7\xad!\x00\x00\x01\x00\x87\xfe5\x05o\x04m\x00\ +\x1c\x00L@&\x00\x01\x01\x1c\x06\x1c\x0b\x18\x02\x18\x18\ +\x19\x12\x06\x19\x06\x1d\x1e\x1c\x02\x02\x15IY\x02\x02\x19\ +\x00\x1a\x0f\x19\x15\x09\x0fFY\x09\x1b\x00?+\x00\x18\ +??3\x129/+\x11\x003\x11\x12\x0199\x11\ +3\x113\x113\x10\xc23\x11\x129\x11310\x01\ +!\x01\x1e\x02\x15\x10\x00#\x22'\x11\x16\x16326\ +54&#\x22\x07\x11!\x11!\x11\x03\xa0\x01\xb0\xfe\ +A\x94\xd8r\xfe\xec\xff\x8ex%g.le\x87}\ +dk\xfey\x01\x87\x04m\xfd\xf9\x0b\x88\xe3\x8a\xfe\xf2\ +\xfe\xdd/\x01\x1f\x16\x15~\x86p\x80!\xfe\xd5\x04m\ +\xfe\x04\x00\x00\x01\x00\x19\xfe9\x06\xb6\x05\xb6\x00\x18\x00\ +M@(\x04\x03\x00\x03\x02\x02\x01\x07\x17\x17\x05\x10\x05\ +\x00\x00\x01\x10\x01\x19\x1a\x17\x07NY\x17\x03\x0d\x12P\ +Y\x0d\x12\x05\x00NY\x05\x12\x03\x1b\x00??+\x00\ +\x18?+\x00\x18?+\x11\x12\x0199\x113\x113\ +\x11\x129\x113\x113\x113\x11\x12910\x01!\ +\x03!\x13!\x11!\x06\x02\x0e\x02#\x22'\x11\x163\ +266\x12\x13!\x05{\x01;\xbe\xfeL\xc8\xfe\xe2\ +\xfe\xe9\x17MFk\x9epUF<&47.R\ +#\x03\xf2\x01D\xfc\xf5\x01\xc7\x04s\xf9\xfd\xfc\xd0{\ +?\x16\x011\x14W\xd1\x027\x018\x00\x01\x00\x10\xfe\ +`\x05\xfa\x04m\x00\x16\x00M@(\x04\x03\x00\x03\x02\ +\x02\x01\x07\x15\x15\x0e\x05\x05\x00\x00\x01\x0e\x01\x17\x18\x15\ +\x07FY\x15\x0f\x0b\x10GY\x0b\x15\x05\x00JY\x05\ +\x15\x03#\x00??+\x00\x18?+\x00\x18?+\x11\ +\x12\x0199\x113\x113\x11\x129\x113\x113\x11\ +3\x11\x12910\x01!\x03!\x13!\x11#\x02\x02\ +\x06#\x22'\x11\x163266\x127!\x04\xf8\x01\ +\x02\x9c\xfe\x94\x91\xfe\xee\xe6!d\xb0\x95hI!7\ +-8+#\x10\x03\xcd\x01\x10\xfdP\x01\xa0\x03J\xfe\ +\x93\xfe\xa9\x9a\x1e\x01#\x12]\xcc\x01@\xe9\x00\x01\x00\ +\x9e\xfe5\x05\x83\x05\xb6\x00\x15\x00=@\x1f\x12\x05\x0e\ +\x0e\x0f\x13\x0b\x0b\x00\x0f\x00\x16\x17\x12\x0dNY\x12\x12\ +\x0f\x14\x10\x03\x0f\x12\x03\x08NY\x03\x1b\x00?+\x00\ +\x18??3\x129/+\x11\x12\x0199\x113\x11\ +3\x113\x10\xc2310%\x10\x00!\x22'\x11\x16\ +3265\x11!\x11!\x11!\x11!\x11!\x05\x83\ +\xfe\xcf\xfe\xe3\x84|hqoy\xfe5\xfes\x01\x8d\ +\x01\xcb\x01\x8d\x8b\xfe\xdf\xfe\xcb-\x01D-\x8d\x83\x01\ +\xcb\xfd\xac\x05\xb6\xfd\xe2\x02\x1e\x00\x01\x00\x87\xfe5\x04\ +\xcb\x04m\x00\x14\x00?@ \x05\x0e\x11\x0d\x0d\x0e\x12\ +\x0a\x0a\x00\x0e\x00\x15\x16\x11\x0cFY\x11\x11\x0e\x13\x0f\ +\x0f\x0e\x15\x03\x08FY\x03\x1b\x00?+\x00\x18??\ +3\x129/+\x11\x12\x0199\x113\x113\x113\ +\x113\x12910%\x10\x00#\x22'\x11\x1632\ +5\x11!\x11!\x11!\x11!\x11!\x04\xcb\xfe\xe9\xfa\ +\x8czHs\xd5\xfe\xca\xfey\x01\x87\x016\x01\x87R\ +\xfe\xfd\xfe\xe6/\x01\x1f+\xe7\x01s\xfeN\x04m\xfe\ +h\x01\x98\x00\x01\x00\x9e\xfe9\x06\xbe\x05\xb6\x00\x0f\x00\ +P@)\x0c\x08\x08\x09\x04\x03\x00\x03\x02\x02\x01\x0d\x05\ +\x05\x00\x00\x01\x09\x01\x10\x11\x0c\x07NY\x0c\x0c\x05\x0e\ +\x0a\x03\x09\x12\x05\x00NY\x05\x12\x03\x1b\x00??+\ +\x00\x18??3\x129/+\x11\x12\x0199\x113\ +\x113\x113\x113\x113\x11\x129\x113\x1131\ +0\x01!\x03!\x13!\x11!\x11!\x11!\x11!\x11\ +!\x05\x83\x01;\xbe\xfeL\xc8\xfe\xe2\xfe5\xfes\x01\ +\x8d\x01\xcb\x01\x8d\x01D\xfc\xf5\x01\xc7\x02T\xfd\xac\x05\ +\xb6\xfd\xe2\x02\x1e\x00\x01\x00\x87\xfe`\x05\xcd\x04m\x00\ +\x0f\x00P@)\x01\x0d\x0d\x0e\x09\x08\x05\x08\x07\x07\x06\ +\x02\x0a\x0a\x05\x05\x06\x0e\x06\x10\x11\x01\x0cFY\x01\x01\ +\x0a\x03\x0f\x0f\x0e\x15\x0a\x05JY\x0a\x15\x08#\x00?\ +?+\x00\x18??3\x129/+\x11\x12\x0199\ +\x113\x113\x113\x113\x113\x11\x129\x113\x11\ +310\x01\x11!\x11!\x11!\x03!\x13!\x11!\ +\x11!\x11\x02\x0e\x016\x01\x87\x01\x02\x9c\xfe\x94\x91\xfe\ +\xee\xfe\xca\xfey\x04m\xfeh\x01\x98\xfc\xa3\xfdP\x01\ +\xa0\x01\xb2\xfeN\x04m\x00\x01\x00j\xfe9\x05u\x05\ +\xb6\x00\x15\x00A@!\x0c\x09\x01\x00\x00\x14\x11\x03\x03\ +\x14\x09\x14\x16\x17\x06\x0fNY\x06\x06\x0a\x15\x15\x02N\ +Y\x15\x12\x12\x0a\x03\x01\x1b\x00??3?+\x11\x12\ +\x009\x18/+\x11\x12\x0199\x113\x113\x129\ +\x113\x11310\x01!\x11!5\x06#\x22&5\ +\x11!\x11\x14\x16327\x11!\x11!\x045\xfe\x7f\ +\x013\xfd\xc7\xd0\xe9\x01\x8eV^\x80\xbb\x01\x8e\xfe\xc0\ +\xfe9\x03\x0b\xd9X\xcd\xba\x02j\xfe\x19k\x5cD\x02\ +j\xfaJ\x00\x01\x00V\xfe`\x04\xd7\x04m\x00\x14\x00\ +=@\x1f\x01\x13\x0a\x0b\x0b\x05\x0d\x0d\x08\x13\x08\x15\x16\ +\x10\x03FY\x10\x10\x09\x06\x14\x0f\x0b#\x09\x0cJY\ +\x09\x15\x00?+\x00\x18??3\x129/+\x11\x12\ +\x0199\x113\x1133\x113\x11310\x01\x11\ +\x14327\x11!\x11!\x11!\x1135\x06#\x22\ +&5\x11\x01\xddku\x93\x01\x87\xfe\xd1\xfe\xaa\xfe\xc2\ +\xa5\xce\xc5\x04m\xfe\xa5t1\x01\x9e\xfb\x93\xfe`\x02\ +\xb0\xbfT\xbd\xc6\x01o\x00\x01\x00\x9e\xfe9\x08Z\x05\ +\xb6\x00\x18\x00Z@.\x18\x00\x0a\x08\x0a\x0b\x03\x12\x05\ +\x05\x06\x11\x10\x0d\x10\x0f\x0f\x0e\x12\x0d\x0d\x0e\x06\x0e\x19\ +\x1a\x16\x02\x09\x02\x12\x07\x12\x0dNY\x12\x12\x10\x1b\x0b\ +\x07\x03\x00\x06\x12\x00?3?3??+\x11\x12\x00\ +99\x113\x11\x12\x0199\x113\x113\x113\x11\ +3\x11\x129\x113\x11\x12\x179\x113310!\ +\x01#\x12\x15\x11!\x11!\x013\x01!\x11!\x03!\ +\x13#\x11467#\x01\x03\x1b\xfe\xd5\x09\x15\xfe\xa2\ +\x02\x0e\x011\x08\x01+\x02\x0f\x01;\xbe\xfeK\xc9\xfc\ +\x03\x0c\x09\xfe\xd9\x04\x1d\xfe\xf3\x95\xfd\x85\x05\xb6\xfb\xf2\ +\x04\x0e\xfb\x8e\xfc\xf5\x01\xc7\x02\x812z\xee\xfb\xe5\x00\ +\x01\x00\x87\xfe`\x07\xac\x04m\x00\x1b\x00Y@-\x0b\ +\x0a\x16\x13\x16\x1a\x03\x05\x10\x10\x11\x04\x03\x00\x03\x02\x02\ +\x01\x05\x00\x00\x01\x11\x01\x1c\x1d\x06\x0f\x16\x0f\x05\x1a\x12\ +\x0f\x0b\x11\x15\x05\x00JY\x05\x15\x03#\x00??+\ +\x00\x18?3?3\x1299\x113\x11\x12\x0199\ +\x113\x113\x113\x113\x11\x129\x113\x11\x12\x17\ +9\x113310\x01!\x03!\x13#\x11\x07\x06\x07\ +\x03!\x03&''\x11!\x11!\x13\x16\x13>\x027\ +!\x06\xaa\x01\x02\x9c\xfe\x94\x91\xfe\x0f2L\x8b\xfe\xf5\ +\x8f=;\x13\xfe\x8d\x02+gZ'\x0d\x9a\x9f\ +\xac\x01ZFP\xfbP\xa1\x7f\x81\x9f\x00\x02\x00V\xff\ +\xec\x04\x9c\x04\x81\x00\x13\x00\x19\x00D@\x22\x17\x10\x09\ +\x16\x0b\x0b\x03\x09\x03\x1a\x1b\x10\x0a\x0e\x0a\x17LY\x0a\ +\x0a\x06\x00\x06\x14JY\x06\x16\x00\x0eIY\x00\x10\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x00\ +9\x11\x12\x0199\x113\x113\x129210\x01\ + \x00\x11\x10\x00! \x0055!&&#\x22\x07\ +\x1166\x1327!\x16\x16\x02H\x01\x1b\x019\xfe\ +\xe0\xfe\xf1\xff\x00\xfe\xe9\x02\xba\x04\x7fl\xcd\xb4U\xc3\ +\xa6\xa3\x07\xfe\xb0\x02Z\x04\x81\xfe\xd2\xfe\xea\xfe\xe1\xfe\ +\xce\x01\x0b\xfb\xae^lV\x01\x19-'\xfcu\xb4R\ +b\xff\xff\x00^\xff\xec\x05\xf4\x07u\x02&\x02\xe1\x00\ +\x00\x01\x07\x00j\x00\xbc\x01R\x00\x0a\xb4\x03\x021\x05\ +&\x00+55\xff\xff\x00V\xff\xec\x04\x9c\x06#\x02\ +&\x02\xe2\x00\x00\x01\x06\x00j\xe2\x00\x00\x0a\xb4\x03\x02\ +/\x11&\x00+55\xff\xff\xff\xf8\x00\x00\x08=\x07\ +u\x02&\x01\xb0\x00\x00\x01\x07\x00j\x01\x9c\x01R\x00\ +\x0a\xb4\x02\x01'\x05&\x00+55\xff\xff\xff\xf8\x00\ +\x00\x07\xcb\x06#\x02&\x01\xd0\x00\x00\x01\x07\x00j\x01\ +^\x00\x00\x00\x0a\xb4\x02\x01'\x11&\x00+55\xff\ +\xff\x00X\xff\xec\x04\xf4\x07u\x02&\x01\xb1\x00\x00\x01\ +\x07\x00j\x00\x19\x01R\x00\x0a\xb4\x02\x01<\x05&\x00\ ++55\xff\xff\x00H\xff\xec\x04/\x06#\x02&\x01\ +\xd1\x00\x00\x01\x06\x00j\xaf\x00\x00\x0a\xb4\x02\x01;\x11\ +&\x00+55\x00\x01\x00J\xff\xec\x04\xb4\x05\xb6\x00\ +\x19\x00Z@-\x01\x05\x05\x06\x09\x06\x19\x02\x19\x0e\x15\ +\x15\x09\x0e\x09\x1a\x1b\x0f\x12\x19\x06\x00\x19\x00SY\x19\ +\x19\x0c\x03\x0c\x12NY\x0c\x13\x05\x03\x02\x03\x02NY\ +\x03\x03\x00?+\x11\x12\x009\x18?+\x11\x12\x009\ +\x18/+\x11\x003\x11\x129\x11\x12\x0199\x113\ +\x11\x1299\x113\x11\x129\x11310\x01\x01!\ +\x11!\x15\x01\x16\x04\x15\x14\x04!\x22'\x11\x16\x163\ +2654&##\x01#\x013\xfe+\x03\xdf\xfe\ +m\xe1\x01\x06\xfe\xaa\xfe\xc1\xff\xd6c\xf0c\x8e\x91\xc8\ +\xc4p\x03b\x01\x11\x01C\xf3\xfe\x9d\x0c\xde\xb5\xe0\xf5\ +O\x01T-3KSM@\x00\x01\x00\x14\xfe\x14\x04\ +\x8d\x04m\x00\x19\x00X@,\x06\x19\x19\x01\x0e\x01\x05\ +\x05\x02\x09\x02\x15\x0e\x15\x09\x0e\x09\x1a\x1b\x06\x00\x19\x00\ +JY\x19\x19\x0c\x03\x0c\x12GY\x0c\x1c\x05\x03\x02\x03\ +\x02FY\x03\x0f\x00?+\x11\x12\x009\x18?+\x11\ +\x12\x009\x18/+\x11\x003\x11\x12\x0199\x113\ +\x11\x129\x11\x129\x113\x11\x129\x11310\x01\ +\x01!\x11!\x15\x01\x16\x12\x15\x10\x00! '\x11\x16\ +\x1632654&##\x01\x04\x01V\xfd\xf8\x04\ +\x14\xfe_\xdf\xe9\xfe\xab\xfe\xc4\xfe\xe1\xc9a\xf6x\x89\ +\x94\xb3\xc2\x87\x02\x19\x01)\x01+\xf2\xfe\x99\x1f\xfe\xfe\ +\xd4\xff\x00\xfe\xf5N\x01P/7spyb\x00\xff\ +\xff\x00\x9e\x00\x00\x06%\x07\x17\x02&\x01\xb2\x00\x00\x01\ +\x07\x01M\x00\xfe\x01R\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\x00\x87\x00\x00\x05J\x05\xc5\x02&\x01\xd2\x00\ +\x00\x01\x07\x01M\x00\x98\x00\x00\x00\x08\xb3\x01\x12\x11&\ +\x00+5\xff\xff\x00\x9e\x00\x00\x06%\x07u\x02&\x01\ +\xb2\x00\x00\x01\x07\x00j\x00\xf8\x01R\x00\x0a\xb4\x02\x01\ +%\x05&\x00+55\xff\xff\x00\x87\x00\x00\x05J\x06\ +#\x02&\x01\xd2\x00\x00\x01\x07\x00j\x00\x8d\x00\x00\x00\ +\x0a\xb4\x02\x01$\x11&\x00+55\xff\xff\x00h\xff\ +\xec\x05\xf6\x07u\x02&\x002\x00\x00\x01\x07\x00j\x00\ +\xb4\x01R\x00\x0a\xb4\x03\x02+\x05&\x00+55\xff\ +\xff\x00V\xff\xec\x04\xc1\x06#\x02&\x00R\x00\x00\x01\ +\x06\x00j\x10\x00\x00\x0a\xb4\x03\x02.\x11&\x00+5\ +5\xff\xff\x00h\xff\xec\x05\xf6\x05\xcd\x02\x06\x02~\x00\ +\x00\xff\xff\x00V\xff\xec\x04\xc1\x04\x81\x02\x06\x02\x7f\x00\ +\x00\xff\xff\x00h\xff\xec\x05\xf6\x07u\x02&\x02~\x00\ +\x00\x01\x07\x00j\x00\xb4\x01R\x00\x0a\xb4\x04\x03+\x05\ +&\x00+55\xff\xff\x00V\xff\xec\x04\xc1\x06#\x02\ +&\x02\x7f\x00\x00\x01\x06\x00j\x10\x00\x00\x0a\xb4\x04\x03\ +/\x11&\x00+55\xff\xff\x00R\xff\xec\x04\xf2\x07\ +u\x02&\x01\xc7\x00\x00\x01\x07\x00j\x00\x04\x01R\x00\ +\x0a\xb4\x02\x010\x05&\x00+55\xff\xff\x003\xff\ +\xec\x03\xfe\x06#\x02&\x01\xe7\x00\x00\x01\x07\x00j\xff\ +~\x00\x00\x00\x0a\xb4\x02\x011\x11&\x00+55\xff\ +\xff\x00\x19\xff\xec\x05\x8b\x07\x17\x02&\x01\xbd\x00\x00\x01\ +\x07\x01M\x00w\x01R\x00\x08\xb3\x01\x1d\x05&\x00+\ +5\xff\xff\xff\xfe\xfe\x14\x04\xe1\x05\xc5\x02&\x00\x5c\x00\ +\x00\x01\x06\x01M\x12\x00\x00\x08\xb3\x01\x1a\x11&\x00+\ +5\xff\xff\x00\x19\xff\xec\x05\x8b\x07u\x02&\x01\xbd\x00\ +\x00\x01\x07\x00j\x00X\x01R\x00\x0a\xb4\x02\x01/\x05\ +&\x00+55\xff\xff\xff\xfe\xfe\x14\x04\xe1\x06#\x02\ +&\x00\x5c\x00\x00\x01\x06\x00j\xf9\x00\x00\x0a\xb4\x02\x01\ +,\x11&\x00+55\xff\xff\x00\x19\xff\xec\x05\x8b\x07\ +s\x02&\x01\xbd\x00\x00\x01\x07\x01S\x00\xf2\x01R\x00\ +\x0a\xb4\x02\x01-\x05&\x00+55\xff\xff\xff\xfe\xfe\ +\x14\x04\xed\x06!\x02&\x00\x5c\x00\x00\x01\x07\x01S\x00\ +\x8d\x00\x00\x00\x0a\xb4\x02\x01*\x11&\x00+55\xff\ +\xff\x00j\x00\x00\x05u\x07u\x02&\x01\xc1\x00\x00\x01\ +\x07\x00j\x00\x87\x01R\x00\x0a\xb4\x02\x01'\x05&\x00\ ++55\xff\xff\x00V\x00\x00\x04\xd7\x06#\x02&\x01\ +\xe1\x00\x00\x01\x06\x00j3\x00\x00\x0a\xb4\x02\x01&\x11\ +&\x00+55\x00\x01\x00\x9e\xfe9\x04m\x05\xb6\x00\ +\x09\x001@\x18\x07\x08\x08\x05\x05\x00\x00\x03\x0a\x0b\x08\ +\x1b\x01\x04OY\x01\x03\x00\x05NY\x00\x12\x00?+\ +\x00\x18?+\x00\x18?\x11\x12\x0199\x113\x129\ +\x113103\x11!\x11!\x11!\x11!\x11\x9e\x03\ +\xcf\xfd\xbe\x013\xfe\x7f\x05\xb6\xfe\xc1\xfc\xcd\xfc\xf5\x01\ +\xc7\x00\x01\x00\x87\xfe`\x03\xd1\x04m\x00\x09\x00/@\ +\x18\x05\x06\x06\x03\x03\x08\x08\x01\x0a\x0b\x09\x02FY\x09\ +\x0f\x08\x03FY\x08\x15\x06#\x00??+\x00\x18?\ ++\x11\x12\x0199\x113\x129\x11310\x01\x11\ +!\x113\x11!\x11!\x11\x03\xd1\xfe=\xfe\xfe\xaa\xfe\ +\xd1\x04m\xfe\xdd\xfd\xd9\xfd=\x01\xa0\x04m\xff\xff\x00\ +\x9e\x00\x00\x06\xc5\x07u\x02&\x01\xc5\x00\x00\x01\x07\x00\ +j\x019\x01R\x00\x0a\xb4\x04\x03+\x05&\x00+5\ +5\xff\xff\x00\x87\x00\x00\x06f\x06#\x02&\x01\xe5\x00\ +\x00\x01\x07\x00j\x00\xfc\x00\x00\x00\x0a\xb4\x04\x03,\x11\ +&\x00+55\xff\xff\x00\x14\xfd\xd1\x04m\x05\xb6\x02\ +&\x02\x9b\x00\x00\x00\x07\x03\x80\x011\x00\x00\xff\xff\x00\ +\x14\xfd\xd1\x03\xd1\x04m\x02&\x02\x9c\x00\x00\x00\x07\x03\ +\x81\x01\x00\x00\x00\xff\xff\x00\x04\xfd\xd1\x06D\x05\xb6\x00\ +&\x00;\x00\x00\x00\x07\x03\x80\x03\xa8\x00\x00\xff\xff\x00\ +\x0a\xfd\xd1\x05\xa6\x04m\x00&\x00[\x00\x00\x00\x07\x03\ +\x81\x03\x0a\x00\x00\x00\x01\x00\x04\x00\x00\x05\xc3\x05\xb6\x00\ +\x11\x00f@4\x06\x09\x00\x0f\x09\x0f\x0a\x0d\x0e\x0e\x07\ +\x11\x05\x02\x01\x01\x13\x0b\x0a\x0a\x04\x05\x05\x12\x03\x07\x02\ +\x0c\x0d\x08\x0d\x0a\x00\x07\x08\x07OY\x0f>\x08N\x08\ +\x02\x08\x08\x05\x0a\x03\x02\x05\x12\x00?3?\x129/\ +]3+\x11\x003\x113\x11\x129\x11\x129\x11\x01\ +3\x1133\x113\x113\x113\x12993\x113\ +\x1299\x113\x11310\x01\x01!\x01\x01!\x01\ +!\x11!\x01!\x01\x13!\x01!\x11\x047\x01\x8c\xfe\ +7\xfe\xe3\xfe\xe6\xfeA\x01q\xfe\xf3\x01)\xfe\x90\x01\ +\xb6\x01\x08\xfe\x01\xc3\xfe\x99\x01\x1f\x027\xfd\xc9\x01\xc9\ +\xfe7\x027\x01>\x02A\xfe<\x01\xc4\xfd\xbf\xfe\xc2\ +\x00\x00\x01\x00\x0a\x00\x00\x05\x00\x04m\x00\x11\x00^@\ +.\x0b\x01\x0d\x11\x00\x03\x0c\x09\x03\x09\x04\x07\x08\x08\x0e\ +\x0d\x0d\x13\x05\x04\x04\x10\x11\x11\x12\x06\x0f\x07\x0e\x0e\x11\ +\x0c\x01\x02\x01FY\x09\x02\x02\x04\x11\x15\x07\x04\x0f\x00\ +?3?\x129/3+\x11\x003\x113\x11\x129\ +9\x11\x013\x1133\x113\x113\x1133\x113\ +\x1299\x113\x113\x11\x129910\x01#\x11\ +3\x01!\x13\x13!\x013\x11#\x01!\x03\x03!\x01\ +'\xd7\xe7\xfe\xe6\x01\xbc\xac\xb0\x01\xbd\xfe\xdd\xe5\xd5\x01\ +!\xfeD\xbf\xbe\xfeC\x01\xa4\x01#\x01\xa6\xfe\xc2\x01\ +>\xfeZ\xfe\xdd\xfe\x5c\x01X\xfe\xa8\x00\x02\x00J\x00\ +\x00\x04^\x05\xb6\x00\x0a\x00\x11\x009@\x1c\x0e\x00\x04\ +\x11\x11\x07\x00\x07\x12\x13\x0b\x0c\x03\x0cPY\x03\x03\x08\ +\x05\x08\x11PY\x08\x12\x05\x03\x00??+\x11\x12\x00\ +9\x18/+\x11\x003\x11\x12\x0199\x113\x113\ +\x11310\x134$!3\x11!\x11! $\x01\ +#\x22\x15\x1433J\x01A\x011\x15\x01\x8d\xfeP\ +\xfe\xdb\xfe\xc1\x02\x87\x10\xea\xe7\x13\x01\xe5\xe2\xe7\x02\x08\ +\xfaJ\xfb\x01\x84\xa4\xac\xff\xff\x00V\xff\xec\x04\x9e\x06\ +\x14\x02\x06\x00G\x00\x00\x00\x02\x00J\xff\xec\x06\xd5\x05\ +\xb6\x00\x19\x00#\x00J@%\x1d\x07\x02\x0e\x0e\x0b#\ +#\x14\x07\x14\x17\x07\x17$%\x0b\x1bPY\x15\x0b\x15\ +\x0b\x0c\x03\x02\x04\x11 \x04 NY\x00\x04\x13\x00?\ +3+\x11\x003\x129\x18?99//+\x11\x12\ +\x0199\x113\x11\x129\x1133\x129\x1131\ +0\x05\x22'\x06#\x22&54$!3\x11!\x11\ +\x14\x163265\x11!\x11\x14\x06\x01#\x22\x15\x14\ +\x163265\x04\xcd\xd9\x83~\xcc\xea\xf3\x01=\x01\ +1\x0b\x01\x8d:CF5\x01\x8d\xf8\xfc\xe6\x17\xd3K\ +8<+\x14tt\xf6\xef\xed\xf0\x02\x08\xfc#XP\ +Q[\x01s\xfe{\xf9\xe6\x02\x93\xbeEM07\x00\ +\x02\x00V\xff\xf0\x07'\x06\x14\x00!\x00.\x00S@\ +),\x09&\x03\x15\x15\x12\x12\x1b\x09\x1b\x1e\x09\x1e/\ +0\x13\x00\x03\x06\x0f\x0c\x1c\x1c\x06\x0c\x0c)GY\x0c\ +\x10\x18\x22\x06\x22FY\x00\x06\x16\x00?3+\x11\x00\ +3\x18?+\x11\x12\x009\x18/\x129\x129?\x11\ +\x12\x0199\x113\x11\x129\x113\x1299\x113\ +10\x05\x22&'\x06\x06#\x22\x02\x11\x10\x1232\ +\x16\x173&5\x11!\x11\x14\x163265\x11!\ +\x11\x14\x06\x06\x0126754&#\x22\x06\x15\x14\ +\x16\x05\x1f\x88\xb07J\xb5z\xe5\xfc\xde\xc2_\x8f;\ +\x08\x13\x01\x8aE\x01\ +\x14\xfe\xe8\x87\xcac\x01+}z\x1f\x96\x7f\x91\x86\x8d\ +\x87\x00\x01\x00\x0a\xff\xec\x06\xec\x05\xcb\x00)\x00W@\ +,\x10$\x15\x15!!\x0d&&\x1b\x03\x03\x06\x1b\x06\ +*+\x1a\x11\x17\x1e\x17NY$\x10\x11\x11\x10OY\ +\x04\x11\x04\x11\x09\x1e\x04\x09\x00NY\x09\x13\x00?+\ +\x00\x18?\x1299//+\x11\x12\x009+\x11\x12\ +\x009\x11\x12\x0199\x113\x11\x129\x1133\x11\ +3\x113910\x01265\x11!\x11\x14\x06!\ + &54&##\x1132654#\x22\x06\ +\x07\x036$32\x04\x15\x10\x05\x15\x16\x16\x15\x14\x16\ +\x04\xe3F5\x01\x8e\xf8\xfe\xef\xfe\xe9\xfb\x8e\x8f\xcd\xbd\ +\x89u\xb6O\xa8E\xa6{\x01\x08\xb2\xe0\x01\x10\xfe\xa8\ +\xbe\xd17\x011Q[\x01s\xfe{\xf9\xe6\xd7\xf1X\ +N\x01@\x01\x14\xfe\xe4\x88\ +\xc9cH\x99pS=\xfe(,K$#\x01\x082\ +$\xa0\x93[\x85\x18\x00\x00\x01\x00\x0a\xfe9\x05\x91\x05\ +\xcb\x00!\x00X@-\x0a\x15\x02\x1d\x0f\x0f\x1b\x1b\x05\ +\x00\x00\x03\x03\x02\x15\x02\x22#\x14\x0b\x11\x18\x11NY\ +\x1e\x0a\x0b\x0b\x0aOY\x0b\x0b\x05\x18\x04\x05\x00NY\ +\x05\x12\x03\x1b\x00??+\x00\x18?\x129/+\x11\ +\x12\x009+\x11\x12\x009\x11\x12\x0199\x113\x12\ +9\x1133\x113\x129\x11\x12910\x01!\x11\ +!\x11!\x114&##\x1132654#\x22\ +\x06\x07\x036$32\x04\x15\x10\x05\x15\x16\x16\x15\x04\ +^\x013\xfe\x7f\xfe\xc1\x7f\x9e\xcd\xbd\x89u\xb6O\xa8\ +E\xa6{\x01\x08\xb2\xe0\x01\x10\xfe\xa8\xbc\xcb\x01D\xfc\ +\xf5\x01\xc7\x01\x93l[\x01@\x01\ +\x14\xfe\xe4\x87\xc1l\x00\x00\x01\x00\x9e\xff\xec\x07\xdf\x05\ +\xb6\x00\x19\x00E@#\x0a\x06\x06\x0e\x0b\x03\x03\x07\x14\ +\x14\x17\x07\x17\x1a\x1b\x0a\x05NY\x15\x0a\x15\x0a\x07\x0c\ +\x08\x03\x07\x12\x00\x11NY\x00\x13\x00?+\x00\x18?\ +?3\x1299//+\x11\x12\x0199\x113\x11\ +\x129\x11332\x11310\x05 &55!\ +\x11!\x11!\x11!\x11!\x11\x14\x163265\x11\ +!\x11\x14\x06\x05\xd7\xfe\xeb\xf5\xfe^\xfes\x01\x8d\x01\ +\xa2\x01\x8d4IF5\x01\x8d\xf8\x14\xd4\xf4\xa0\xfd\xac\ +\x05\xb6\xfd\xe2\x02\x1e\xfc+jFQ[\x01s\xfe{\ +\xfb\xe4\x00\x00\x01\x00\x87\xff\xf0\x07T\x04m\x00\x1b\x00\ +G@$\x01\x19\x19\x1a\x05\x02\x17\x17\x0b\x1a\x0b\x0e\x1a\ +\x0e\x1c\x1d\x01\x18FY\x0c\x01\x0c\x01\x1a\x03\x1b\x0f\x1a\ +\x15\x12\x08FY\x12\x16\x00?+\x00\x18??3\x12\ +99//+\x11\x12\x0199\x113\x11\x129\x11\ +33\x113\x11310\x01\x11!\x11!\x11\x14\x16\ +3265\x11!\x11\x14\x06\x06#\x22&&55\ +!\x11!\x11\x02\x0e\x016\x01\x87E\x01\x14\xfe\xe8\x87\xcacb\xc8\x88\ +\x10\xfeN\x04m\x00\x01\x00h\xff\xec\x05\xee\x05\xcb\x00\ +\x1a\x00A@!\x12\x06\x03\x18\x02\x18\x0c\x02\x06\x0c\x06\ +\x1b\x1c\x04\x03PY\x04\x04\x09\x0f\x0f\x15NY\x0f\x04\ +\x09\x00NY\x09\x13\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x0199\x113\x113\x11\x129\ +\x11910\x01 5!\x11!\x15\x10\x00! \x00\ +\x11\x10\x00!2\x16\x17\x03&#\x22\x06\x15\x14\x16\x03\ +L\x01\x14\xfe\xb2\x02\xdc\xfe\x9c\xfe\xc8\xfe\x97\xfe\x7f\x01\ +\x94\x01l\x8a\xf5[}\xa2\xb9\xad\xbd\xab\x011\xf6\x01\ +1\xba\xfe\xbb\xfe\x93\x01\x82\x01q\x01b\x01\x8a8/\ +\xfe\xcbX\xe1\xd1\xcd\xd7\x00\x01\x00V\xff\xec\x04\xf6\x04\ +\x81\x00\x1a\x00H@$\x19\x18\x0c\x01\x12\x12\x07\x18\x01\ +\x07\x01\x1b\x1c\x0d\x1a\x10\x1a\x19JY\x1a\x1a\x04\x0a\x0a\ +\x10FY\x0a\x10\x04\x15IY\x04\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x009\x11\x12\x01\ +99\x113\x113\x11\x129\x12910\x01\x15\x10\ +\x00! \x00\x11\x10\x00!2\x17\x03&&# \x11\ +\x14\x163267#\x11\x04\xf6\xfe\xd9\xfe\xed\xfe\xdc\ +\xfe\xbe\x01U\x014\xf4\x9ee.\x9fQ\xfe\xf5mq\ +QY\x06\xd9\x02\xb4{\xfe\xe6\xfe\xcd\x015\x01\x1c\x01\ +\x17\x01-R\xfe\xee\x1a'\xfe\xd3\x9c\x8fUO\x01\x0a\ +\x00\x00\x01\x003\xff\xec\x05\xaa\x05\xb6\x00\x15\x00?@\ +\x1f\x14\x00\x09\x00\x0f\x0f\x06\x11\x06\x09\x11\x09\x16\x17\x15\ +\x11\x12\x11NY\x07\x07\x0c\x12\x03\x0c\x03NY\x0c\x13\ +\x00?+\x00\x18?\x129/+\x11\x003\x11\x12\x01\ +99\x113\x11\x129\x113\x11\x12910\x01\x14\ +\x163265\x11!\x11\x14\x06! &5\x11!\ +\x11!\x11!\x03%4IF5\x01\x8d\xf8\xfe\xf0\xfe\ +\xeb\xf5\xfe\x9b\x04T\xfe\x9e\x01\xe1jFQ[\x01s\ +\xfe{\xf9\xe6\xd4\xf4\x02\xbf\x01C\xfe\xbd\x00\x00\x01\x00\ +1\xff\xec\x05\xb6\x04m\x00\x17\x00?@\x1f\x16\x09\x00\ +\x00\x11\x11\x06\x13\x06\x09\x13\x09\x18\x19\x17\x13\x14\x13F\ +Y\x07\x07\x0d\x14\x0f\x0d\x03GY\x0d\x16\x00?+\x00\ +\x18?\x129/+\x11\x003\x11\x12\x0199\x113\ +\x11\x129\x113\x11\x12910\x01\x14\x16326\ +5\x11!\x11\x14\x06\x06#\x22&&5\x11!\x11!\ +\x11!\x03-E\x01\x14\xfe\xe4\ +\x87\xc1lb\xc8\x88\x01\xac\x01#\xfe\xdd\x00\x00\x01\x00\ +`\xff\xec\x05\x08\x05\xcb\x00&\x00T@*\x10\x06$\ +\x14\x14!\x0b\x00\x00\x1b!\x1b\x06!\x06'($\x12\ +\x0f\x0f\x12OY\x07\x09\x0f\x0f\x1d\x03\x1d\x17NY\x1d\ +\x13\x03\x09NY\x03\x04\x00?+\x00\x18?+\x11\x12\ +\x009\x18/\x129+\x11\x12\x009\x11\x12\x0199\ +\x113\x11\x129\x113\x113\x113\x12910\x13\ +4$32\x04\x17\x03&#\x22\x15\x14\x16\x1633\ +\x11# \x15\x14\x1632$7\x11\x06!\x22$&\ +54675$\xa4\x01#\xf1\xc1\x01\x0b\x84\xa6\x97\ +\xc7\xd38}r\x9a\xac\xfe\xb0\x8e\xa9m\x01\x06T\xd0\ +\xfe\xa3\xbd\xfe\xea\x94\xc9\xc7\xfe\xb4\x04`\xa2\xc9FT\ +\xfe\xf0fn72\x16\xfe\xc0\x93RF5+\xfe\xac\ +Ok\xc7\x84\x96\xb2\x12\x08:\xff\xff\x00?\xff\xec\x04\ +'\x04\x81\x02\x06\x01\x82\x00\x00\xff\xff\x00\x19\xfd\xd1\x06\ +\xfc\x05\xb6\x00&\x01\xb5\x00\x00\x00\x07\x03\x80\x04`\x00\ +\x00\xff\xff\x00\x10\xfd\xd1\x06u\x04m\x00&\x01\xd5\x00\ +\x00\x00\x07\x03\x81\x03\xd9\x00\x00\xff\xff\x00\x00\xfe!\x05\ +\xcf\x05\xbc\x02&\x00$\x00\x00\x00\x07\x02g\x05\xd1\x00\ +\x00\xff\xff\x00J\xfe!\x04y\x04\x81\x02&\x00D\x00\ +\x00\x00\x07\x02g\x05F\x00\x00\xff\xff\x00\x00\x00\x00\x05\ +\xcf\x08\x02\x02&\x00$\x00\x00\x01\x07\x02f\x05\x8d\x01\ +R\x00\x08\xb3\x02\x15\x05&\x00+5\xff\xff\x00J\xff\ +\xec\x04y\x06\xb0\x02&\x00D\x00\x00\x01\x07\x02f\x05\ ++\x00\x00\x00\x08\xb3\x02'\x11&\x00+5\xff\xff\x00\ +\x00\x00\x00\x05\xd5\x07\xd1\x02&\x00$\x00\x00\x01\x07\x03\ +w\x05\xaa\x01R\x00\x0a\xb4\x03\x02\x16\x05&\x00+5\ +5\xff\xff\x00J\xff\xec\x05j\x06\x7f\x02&\x00D\x00\ +\x00\x01\x07\x03w\x05?\x00\x00\x00\x0a\xb4\x03\x02(\x11\ +&\x00+55\xff\xff\xff\xfc\x00\x00\x05\xcf\x07\xd1\x02\ +&\x00$\x00\x00\x01\x07\x03x\x05\xcf\x01R\x00\x0a\xb4\ +\x03\x02\x16\x05&\x00+55\xff\xff\xff\x93\xff\xec\x04\ +y\x06\x7f\x02&\x00D\x00\x00\x01\x07\x03x\x05f\x00\ +\x00\x00\x0a\xb4\x03\x02(\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05\xcf\x08J\x02&\x00$\x00\x00\x01\x07\x03\ +y\x05\xb2\x01R\x00\x0a\xb4\x03\x02\x16\x05&\x00+5\ +5\xff\xff\x00J\xff\xec\x04\xfc\x06\xf8\x02&\x00D\x00\ +\x00\x01\x07\x03y\x05B\x00\x00\x00\x0a\xb4\x03\x02(\x11\ +&\x00+55\xff\xff\x00\x00\x00\x00\x05\xcf\x08b\x02\ +&\x00$\x00\x00\x01\x07\x03z\x05\xa4\x01R\x00\x0a\xb4\ +\x03\x02.\x05&\x00+55\xff\xff\x00J\xff\xec\x04\ +y\x07\x10\x02&\x00D\x00\x00\x01\x07\x03z\x05B\x00\ +\x00\x00\x0a\xb4\x03\x02@\x11&\x00+55\xff\xff\x00\ +\x00\xfe!\x05\xcf\x07s\x02&\x00$\x00\x00\x00'\x01\ +K\x00\x81\x01R\x01\x07\x02g\x05\xd1\x00\x00\x00\x0a\xb4\ +\x02\x10\x10\x05&\x00+\x115\xff\xff\x00J\xfe!\x04\ +y\x06\x1e\x02&\x00D\x00\x00\x00&\x01K\x17\xfd\x01\ +\x07\x02g\x05X\x00\x00\x00\x0a\xb4\x02\x22\x22\x11&\x00\ ++\x115\xff\xff\x00\x00\x00\x00\x05\xcf\x08\x13\x02&\x00\ +$\x00\x00\x01\x07\x03{\x05\xc9\x01R\x00\x0a\xb4\x03\x02\ +\x19\x05&\x00+55\xff\xff\x00J\xff\xec\x04y\x06\ +\xc1\x02&\x00D\x00\x00\x01\x07\x03{\x05^\x00\x00\x00\ +\x0a\xb4\x03\x02+\x11&\x00+55\xff\xff\x00\x00\x00\ +\x00\x05\xcf\x08\x13\x02&\x00$\x00\x00\x01\x07\x03|\x05\ +\xc9\x01R\x00\x0a\xb4\x03\x02\x18\x05&\x00+55\xff\ +\xff\x00J\xff\xec\x04y\x06\xc1\x02&\x00D\x00\x00\x01\ +\x07\x03|\x05^\x00\x00\x00\x0a\xb4\x03\x02*\x11&\x00\ ++55\xff\xff\x00\x00\x00\x00\x05\xcf\x08\x5c\x02&\x00\ +$\x00\x00\x01\x07\x03}\x05\xb2\x01R\x00\x0a\xb4\x03\x02\ +\x10\x05&\x00+55\xff\xff\x00J\xff\xec\x04y\x07\ +\x0a\x02&\x00D\x00\x00\x01\x07\x03}\x05F\x00\x00\x00\ +\x0a\xb4\x03\x02\x22\x11&\x00+55\xff\xff\x00\x00\x00\ +\x00\x05\xcf\x08b\x02&\x00$\x00\x00\x01\x07\x03~\x05\ +\xb6\x01R\x00\x0a\xb4\x03\x02\x10\x05&\x00+55\xff\ +\xff\x00J\xff\xec\x04y\x07\x10\x02&\x00D\x00\x00\x01\ +\x07\x03~\x05J\x00\x00\x00\x0a\xb4\x03\x02\x22\x11&\x00\ ++55\xff\xff\x00\x00\xfe!\x05\xcf\x07\x92\x02&\x00\ +$\x00\x00\x00'\x02g\x05\xd1\x00\x00\x01\x07\x01N\x00\ +\x81\x01F\x00\x0a\xb4\x03\x1e\x1e\x05&\x00+\x115\xff\ +\xff\x00J\xfe!\x04y\x06L\x02&\x00D\x00\x00\x00\ +'\x02g\x05H\x00\x00\x01\x06\x01N\x1b\x00\x00\x0a\xb4\ +\x0300\x11&\x00+\x115\xff\xff\x00\x9e\xfe!\x04\ +\x02\x05\xb6\x02&\x00(\x00\x00\x00\x07\x02g\x051\x00\ +\x00\xff\xff\x00V\xfe!\x04\x9c\x04\x81\x02&\x00H\x00\ +\x00\x00\x07\x02g\x05m\x00\x00\xff\xff\x00\x9e\x00\x00\x04\ +\x02\x08\x02\x02&\x00(\x00\x00\x01\x07\x02f\x04\xfe\x01\ +R\x00\x08\xb3\x01\x11\x05&\x00+5\xff\xff\x00V\xff\ +\xec\x04\x9c\x06\xb0\x02&\x00H\x00\x00\x01\x07\x02f\x05\ +B\x00\x00\x00\x08\xb3\x02!\x11&\x00+5\xff\xff\x00\ +\x9e\x00\x00\x04\x02\x07\x7f\x02&\x00(\x00\x00\x01\x07\x01\ +R\xff\xf5\x01R\x00\x08\xb3\x01\x14\x05&\x00+5\xff\ +\xff\x00V\xff\xec\x04\x9c\x06-\x02&\x00H\x00\x00\x01\ +\x06\x01R-\x00\x00\x08\xb3\x02$\x11&\x00+5\xff\ +\xff\x00\x9e\x00\x00\x059\x07\xd1\x02&\x00(\x00\x00\x01\ +\x07\x03w\x05\x0e\x01R\x00\x0a\xb4\x02\x01\x12\x05&\x00\ ++55\xff\xff\x00V\xff\xec\x05u\x06\x7f\x02&\x00\ +H\x00\x00\x01\x07\x03w\x05J\x00\x00\x00\x0a\xb4\x03\x02\ +\x22\x11&\x00+55\xff\xff\xffb\x00\x00\x04\x02\x07\ +\xd1\x02&\x00(\x00\x00\x01\x07\x03x\x055\x01R\x00\ +\x0a\xb4\x02\x01\x12\x05&\x00+55\xff\xff\xff\x95\xff\ +\xec\x04\x9c\x06\x7f\x02&\x00H\x00\x00\x01\x07\x03x\x05\ +h\x00\x00\x00\x0a\xb4\x03\x02\x22\x11&\x00+55\xff\ +\xff\x00\x9e\x00\x00\x04\xc8\x08J\x02&\x00(\x00\x00\x01\ +\x07\x03y\x05\x0e\x01R\x00\x0a\xb4\x02\x01\x12\x05&\x00\ ++55\xff\xff\x00V\xff\xec\x05\x0c\x06\xf8\x02&\x00\ +H\x00\x00\x01\x07\x03y\x05R\x00\x00\x00\x0a\xb4\x03\x02\ +\x22\x11&\x00+55\xff\xff\x00\x9e\x00\x00\x04\x02\x08\ +b\x02&\x00(\x00\x00\x01\x07\x03z\x05\x12\x01R\x00\ +\x0a\xb4\x02\x01*\x05&\x00+55\xff\xff\x00V\xff\ +\xec\x04\x9c\x07\x10\x02&\x00H\x00\x00\x01\x07\x03z\x05\ +R\x00\x00\x00\x0a\xb4\x03\x02:\x11&\x00+55\xff\ +\xff\x00\x84\xfe!\x04\x0f\x07s\x02&\x00(\x00\x00\x00\ +'\x02g\x053\x00\x00\x01\x07\x01K\xff\xe0\x01R\x00\ +\x0a\xb4\x02\x17\x17\x05&\x00+\x115\xff\xff\x00V\xfe\ +%\x04\x9c\x06!\x02&\x00H\x00\x00\x00'\x02g\x05\ +X\x00\x04\x01\x06\x01K\x08\x00\x00\x0a\xb4\x03''\x11\ +&\x00+\x115\xff\xff\x00F\x00\x00\x03?\x08\x02\x02\ +&\x00,\x00\x00\x01\x07\x02f\x04f\x01R\x00\x08\xb3\ +\x01\x11\x05&\x00+5\xff\xff\x00h\x00\x00\x02h\x06\ +\xb0\x02&\x00\xf3\x00\x00\x01\x07\x02f\x03\xfe\x00\x00\x00\ +\x08\xb3\x01\x09\x11&\x00+5\xff\xff\x00F\xfe!\x03\ +?\x05\xb6\x02&\x00,\x00\x00\x00\x07\x02g\x04\xac\x00\ +\x00\xff\xff\x00}\xfe!\x02\x1f\x065\x02&\x00L\x00\ +\x00\x00\x07\x02g\x047\x00\x00\xff\xff\x00h\xfe!\x05\ +\xf6\x05\xcd\x02&\x002\x00\x00\x00\x07\x02g\x06\x1b\x00\ +\x00\xff\xff\x00V\xfe!\x04\xc1\x04\x81\x02&\x00R\x00\ +\x00\x00\x07\x02g\x05s\x00\x00\xff\xff\x00h\xff\xec\x05\ +\xf6\x08\x02\x02&\x002\x00\x00\x01\x07\x02f\x05\xdb\x01\ +R\x00\x08\xb3\x02\x1b\x05&\x00+5\xff\xff\x00V\xff\ +\xec\x04\xc1\x06\xb0\x02&\x00R\x00\x00\x01\x07\x02f\x05\ +7\x00\x00\x00\x08\xb3\x02\x1e\x11&\x00+5\xff\xff\x00\ +h\xff\xec\x06\x0e\x07\xd1\x02&\x002\x00\x00\x01\x07\x03\ +w\x05\xe3\x01R\x00\x0a\xb4\x03\x02\x1c\x05&\x00+5\ +5\xff\xff\x00V\xff\xec\x05o\x06\x7f\x02&\x00R\x00\ +\x00\x01\x07\x03w\x05D\x00\x00\x00\x0a\xb4\x03\x02\x1f\x11\ +&\x00+55\xff\xff\x007\xff\xec\x05\xf6\x07\xd1\x02\ +&\x002\x00\x00\x01\x07\x03x\x06\x0a\x01R\x00\x0a\xb4\ +\x03\x02\x1c\x05&\x00+55\xff\xff\xff\x97\xff\xec\x04\ +\xc1\x06\x7f\x02&\x00R\x00\x00\x01\x07\x03x\x05j\x00\ +\x00\x00\x0a\xb4\x03\x02\x1f\x11&\x00+55\xff\xff\x00\ +h\xff\xec\x05\xf6\x08J\x02&\x002\x00\x00\x01\x07\x03\ +y\x05\xe5\x01R\x00\x0a\xb4\x03\x02\x1c\x05&\x00+5\ +5\xff\xff\x00V\xff\xec\x04\xfe\x06\xf8\x02&\x00R\x00\ +\x00\x01\x07\x03y\x05D\x00\x00\x00\x0a\xb4\x03\x02\x1f\x11\ +&\x00+55\xff\xff\x00h\xff\xec\x05\xf6\x08b\x02\ +&\x002\x00\x00\x01\x07\x03z\x05\xe9\x01R\x00\x0a\xb4\ +\x03\x024\x05&\x00+55\xff\xff\x00V\xff\xec\x04\ +\xc1\x07\x10\x02&\x00R\x00\x00\x01\x07\x03z\x05L\x00\ +\x00\x00\x0a\xb4\x03\x027\x11&\x00+55\xff\xff\x00\ +h\xfe!\x05\xf6\x07s\x02&\x002\x00\x00\x00'\x01\ +K\x00\xc3\x01R\x01\x07\x02g\x06\x1b\x00\x00\x00\x0a\xb4\ +\x02\x16\x16\x05&\x00+\x115\xff\xff\x00V\xfe!\x04\ +\xc1\x06!\x02&\x00R\x00\x00\x00&\x01K\x1f\x00\x01\ +\x07\x02g\x05w\x00\x00\x00\x0a\xb4\x02\x19\x19\x11&\x00\ ++\x115\xff\xff\x00h\xff\xec\x07\x14\x07s\x02&\x02\ +_\x00\x00\x01\x07\x00v\x01\x1f\x01R\x00\x08\xb3\x02(\ +\x05&\x00+5\xff\xff\x00V\xff\xec\x06\x10\x06!\x02\ +&\x02`\x00\x00\x01\x07\x00v\x00\xac\x00\x00\x00\x0a\xb4\ +\x02,,\x11&\x00+\x115\xff\xff\x00h\xff\xec\x07\ +\x14\x07s\x02&\x02_\x00\x00\x01\x07\x00C\x00`\x01\ +R\x00\x08\xb3\x02(\x05&\x00+5\xff\xff\x00V\xff\ +\xec\x06\x10\x06!\x02&\x02`\x00\x00\x01\x06\x00C\xad\ +\x00\x00\x0a\xb4\x02,,\x11&\x00+\x115\xff\xff\x00\ +h\xff\xec\x07\x14\x08\x02\x02&\x02_\x00\x00\x01\x07\x02\ +f\x05\xfc\x01R\x00\x08\xb3\x02$\x05&\x00+5\xff\ +\xff\x00V\xff\xec\x06\x10\x06\xb0\x02&\x02`\x00\x00\x01\ +\x07\x02f\x05J\x00\x00\x00\x0a\xb4\x02((\x11&\x00\ ++\x115\xff\xff\x00h\xff\xec\x07\x14\x07\x7f\x02&\x02\ +_\x00\x00\x01\x07\x01R\x00\xec\x01R\x00\x08\xb3\x02'\ +\x05&\x00+5\xff\xff\x00V\xff\xec\x06\x10\x06-\x02\ +&\x02`\x00\x00\x01\x06\x01RB\x00\x00\x0a\xb4\x02#\ +#\x11&\x00+\x115\xff\xff\x00h\xfe!\x07\x14\x06\ +\x14\x02&\x02_\x00\x00\x00\x07\x02g\x06!\x00\x00\xff\ +\xff\x00V\xfe!\x06\x10\x05\x14\x02&\x02`\x00\x00\x00\ +\x07\x02g\x05}\x00\x00\xff\xff\x00\x96\xfe!\x05y\x05\ +\xb6\x02&\x008\x00\x00\x00\x07\x02g\x05\xf4\x00\x00\xff\ +\xff\x00\x85\xfe!\x04\xd5\x04m\x02&\x00X\x00\x00\x00\ +\x07\x02g\x05\xa6\x00\x00\xff\xff\x00\x96\xff\xec\x05y\x08\ +\x02\x02&\x008\x00\x00\x01\x07\x02f\x05\xa6\x01R\x00\ +\x08\xb3\x01\x17\x05&\x00+5\xff\xff\x00\x85\xff\xec\x04\ +\xd5\x06\xb0\x02&\x00X\x00\x00\x01\x07\x02f\x05R\x00\ +\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\xff\x00\x96\xff\ +\xec\x07\x85\x07s\x02&\x02a\x00\x00\x01\x07\x00v\x01\ +;\x01R\x00\x08\xb3\x01&\x05&\x00+5\xff\xff\x00\ +\x85\xff\xec\x06\xc5\x06!\x02&\x02b\x00\x00\x01\x07\x00\ +v\x00\xd7\x00\x00\x00\x0a\xb4\x01,,\x11&\x00+\x11\ +5\xff\xff\x00\x96\xff\xec\x07\x85\x07s\x02&\x02a\x00\ +\x00\x01\x07\x00C\xff\xf7\x01R\x00\x08\xb3\x01&\x05&\ +\x00+5\xff\xff\x00\x85\xff\xec\x06\xc5\x06!\x02&\x02\ +b\x00\x00\x01\x06\x00C\xa3\x00\x00\x0a\xb4\x01,,\x11\ +&\x00+\x115\xff\xff\x00\x96\xff\xec\x07\x85\x08\x02\x02\ +&\x02a\x00\x00\x01\x07\x02f\x05\xa8\x01R\x00\x08\xb3\ +\x01\x22\x05&\x00+5\xff\xff\x00\x85\xff\xec\x06\xc5\x06\ +\xb0\x02&\x02b\x00\x00\x01\x07\x02f\x05X\x00\x00\x00\ +\x0a\xb4\x01((\x11&\x00+\x115\xff\xff\x00\x96\xff\ +\xec\x07\x85\x07\x7f\x02&\x02a\x00\x00\x01\x07\x01R\x00\ +\xaa\x01R\x00\x08\xb3\x01%\x05&\x00+5\xff\xff\x00\ +\x85\xff\xec\x06\xc5\x06-\x02&\x02b\x00\x00\x01\x06\x01\ +RV\x00\x00\x0a\xb4\x01##\x11&\x00+\x115\xff\ +\xff\x00\x96\xfe!\x07\x85\x06\x14\x02&\x02a\x00\x00\x00\ +\x07\x02g\x05\xe1\x00\x00\xff\xff\x00\x85\xfe!\x06\xc5\x05\ +\x12\x02&\x02b\x00\x00\x00\x07\x02g\x05\x9e\x00\x00\xff\ +\xff\x00\x00\xfe!\x05P\x05\xb6\x02&\x00<\x00\x00\x00\ +\x07\x02g\x05\x91\x00\x00\xff\xff\xff\xfe\xfe\x14\x04\xef\x04\ +m\x02&\x00\x5c\x00\x00\x00\x07\x02g\x07\x0a\x00\x02\xff\ +\xff\x00\x00\x00\x00\x05P\x08\x02\x02&\x00<\x00\x00\x01\ +\x07\x02f\x05H\x01R\x00\x08\xb3\x01\x0e\x05&\x00+\ +5\xff\xff\xff\xfe\xfe\x14\x04\xe1\x06\xb0\x02&\x00\x5c\x00\ +\x00\x01\x07\x02f\x05\x17\x00\x00\x00\x08\xb3\x01\x1c\x11&\ +\x00+5\xff\xff\x00\x00\x00\x00\x05P\x07\x7f\x02&\x00\ +<\x00\x00\x01\x07\x01R\x00V\x01R\x00\x08\xb3\x01\x11\ +\x05&\x00+5\xff\xff\xff\xfe\xfe\x14\x04\xe1\x06-\x02\ +&\x00\x5c\x00\x00\x01\x06\x01R%\x00\x00\x08\xb3\x01\x1f\ +\x11&\x00+5\xff\xff\x00V\xfe\x85\x059\x06\x14\x02\ +&\x00\xd3\x00\x00\x00\x07\x00B\x00\xa6\x00\x00\x00\x02\xfa\ +\xe5\x04\xd9\xfe\x8f\x06!\x00\x09\x00\x13\x00\x10\xb6\x04\x0f\ +\x0e\x01\x0e\x0a\x00\x00/2\xcc]210\x01&&\ +'5!\x16\x16\x17\x15!&&'5!\x16\x16\x17\ +\x15\xfd\xc5S\xca\x1d\x01V\x22c)\xfd\x8eS\xca\x1b\ +\x01V e'\x04\xd9A\xc20\x15K\xa79\x1dA\ +\xc5-\x15F\xb05\x1d\x00\x02\xfb\x9e\x04\xd9\x00+\x06\ +\x7f\x00\x0c\x00\x14\x00\x1b@\x0c\x14\x14\x01\x03\x06\x10\x0f\ +\x09\x01\x09\x06\x01\x00/3\xdc]\xcc\x129\x129/\ +10\x01#&'\x06\x07#567!\x16\x17'\ +67!\x15\x06\x07#\xfe\xdd\xcdijra\xcc^\ +y\x01\x91y^^X7\x01\x1d=\xb5\xba\x04\xd9F\ +`eA\x1dn\xb7\xb7n\xc2Vq\x15Tz\x00\x00\ +\x02\xfa-\x04\xd9\xfe\xba\x06\x7f\x00\x0c\x00\x14\x00\x1b@\ +\x0c\x0e\x0e\x01\x03\x06\x12\x0f\x09\x01\x09\x06\x01\x00/3\ +\xdc]\xce\x129\x129/10\x01#&'\x06\x07\ +#567!\x16\x17%#&'5!\x16\x17\xfe\ +\xba\xccarji\xcb;\x9a\x01\x93rc\xfd\x1f\xba\ +\xb5=\x01\x1d7X\x04\xd9Ae`F\x1dE\xe0\xad\ +x\xa6zT\x15qV\x00\x02\xfb\x9e\x04\xd9\xff\xba\x06\ +\xf8\x00\x0c\x00\x1d\x00#@\x10\x12\x16\x16\x1b\x0f\x11\x11\ +\x01\x03\x06\x0f\x09\x01\x09\x06\x01\x00/3\xcc]\x119\ +\x119/\xc9\xcc2\x12910\x01#&'\x06\x07\ +#567!\x16\x17\x13\x14\x07\x07#'254\ +#\x22\x075632\x16\xfe\xdd\xcdijra\xcc\ +^y\x01\x91y^\xdd}\x06\x9b\x0byC$$\x1e\ +Fho\x04\xd9F`eA\x1dn\xb7\xb7n\x01b\ +w\x181l1-\x0c\x98\x0aQ\x00\x00\x02\xfb\xa2\x04\ +\xd9\xfe\xe1\x07\x10\x00\x16\x00&\x007@!\x1a\x22\x18\ +\x04\x0b\x0f\x14\x1f\x14/\x14\x03\x14\x14\x10\x10\x00\x00\x08\ +\x10\x08\x02\x08\x0f\x22\x1f\x22/\x22\x03\x22\x1e\x18\x00/\ +3\xdd]\xde]\xc42\x113/]\xc02\x11\x129\ +10\x01\x22'&#\x22\x06\x07#6632\x1e\ +\x0232673\x06\x06\x13#&'\x06\x06\x07#\ +5767!\x16\x16\x17\xfd\xd90ff#1#\ +\x0c}\x09lX%PKC\x1a/%\x0e\x7f\x0cp\ +\xb5\xac\xa2Q8}?\xac?\x827\x01O\x1cU\x87\ +\x06\x10##\x1f){\x85\x17\x1b\x17!*{\x85\xfe\ +\xc97L0:\x19\x1d7qP(Yw\x00\x02\xfb\ +\xa0\x04\xd9\xfe\xc9\x06\xc1\x00\x08\x00\x16\x00\x14\xb7\x08\x10\ +\x10\x09\x13\x04\x0c\x09\x00/\xdd\xcc3\x113\x10\xc21\ +0\x017673\x15\x06\x07#\x13\x22&'3\x16\ +\x1632673\x06\x06\xfc\xbc\x19<\x18\xfczU\ +\x9a\x81\xb2\xdf\x0c\xba\x0brb^|\x06\xb0\x04\xca\x05\ +\xfa+d8\x15\x88G\xfe\xfc\xb9\x9bISUG\xa6\ +\xae\x00\x02\xfb\xa0\x04\xd9\xfe\xc9\x06\xc1\x00\x07\x00\x15\x00\ +\x14\xb7\x01\x0f\x0f\x08\x12\x05\x0b\x08\x00/\xdd\xcc3\x11\ +3\x10\xc210\x01#&'53\x17\x17\x03\x22&\ +'3\x16\x1632673\x06\x06\xfd\xb6\x99=\x94\ +\xfc77y\xb2\xdf\x0c\xba\x0brb^|\x06\xb0\x04\ +\xca\x05\xdd3\x9c\x15g`\xfe\xdf\xb9\x9bISUG\ +\xa6\xae\x00\x00\x02\xfb\xa0\x04\xd9\xfe\xc9\x07\x0a\x00\x0d\x00\ +\x1f\x00#@\x10\x13\x18\x11\x18\x0f\x1d\x01\x1d\x1d\x10\x11\ +\x07\x07\x0a\x03\x00\x00/\xcd23\x10\xd2\xc9\xc9/]\ +2\x11\x12910\x01\x22&'3\x16\x16326\ +73\x06\x06\x03\x14\x07\x07#'2654#\x22\ +\x075632\x16\xfd=\xb2\xdf\x0c\xba\x0brb^\ +|\x06\xb0\x04\xca(k\x06y\x08/'5\x220)\ +BZ^\x04\xd9\xb9\x9bISUG\xa6\xae\x01\xa2i\ +\x18+`\x1e\x0f)\x0c\x85\x0cK\x00\x00\x02\xfb\xa0\x04\ +\xcf\xfe\xc9\x07\x10\x00\x0d\x00$\x00'@\x16\x12\x19\x0f\ +\x22\x1f\x22/\x22\x03\x22\x1e\x0e\x16\x0a\x0f\x03\x1f\x03\x02\ +\x03\x07\x00\x00/2\xdd]2\xde\xc42\xdc]\xc02\ +10\x01\x22&'3\x16\x1632673\x06\x06\ +\x03\x22'&#\x22\x06\x07#6632\x1e\x023\ +2673\x06\x06\xfd=\xb2\xdf\x0c\xba\x08\x80W^\ +{\x07\xb0\x04\xcb!0ff#1#\x0c}\x09l\ +X%PKC\x1a/%\x0e\x7f\x0cp\x04\xcf\xa0\x81\ +,=45\x8c\x95\x01A##\x1f){\x85\x17\x1b\ +\x17!*{\x85\x00\x01\xff\xfa\xfe\x14\x01\xbc\x00\x00\x00\ +\x11\x00&@\x10\x03\x0c\x0c\x07\x00\x00\x12\x13\x06\x00\x00\ +\x10\x04\x10\x0a\x04\x00//3\x11\x129\x113\x11\x12\ +\x019\x1133\x12910\x174&'3\x16\x16\ +\x15\x14\x06#\x22'5\x16\x1632\xbe5P\xd5^\ +P\x9cx[S\x14G\x1cM\xc7)RLB}E\ +i\x7f\x1b\xdd\x09\x0d\x00\x00\x01\x00\x0c\xfd\xd1\x02\x9c\x01\ +P\x00\x0d\x00\x18@\x09\x0b\x02\x08\x08\x0e\x0f\x09\x05\x00\ +\x00/2/\x11\x12\x019\x113310\x13\x22'\ +\x11\x163265\x11!\x11\x14\x06\xee\x8eT?@\ +JD\x01\x83\xe4\xfd\xd1\x18\x010\x13kj\x01u\xfe\ +9\xcd\xeb\x00\x01\x00\x0c\xfd\xd1\x02\x9c\x01\x10\x00\x0d\x00\ +\x18@\x09\x0b\x03\x08\x08\x0e\x0f\x09\x05\x00\x00/2/\ +\x11\x12\x019\x113310\x13\x22'\x11\x1632\ +65\x11!\x11\x14\x06\xee\x8eT?@JD\x01\x83\ +\xe4\xfd\xd1\x18\x010\x13kj\x015\xfey\xcd\xeb\x00\ +\x01\x00\x17\x00\x00\x03q\x05\xb6\x00\x0a\x00*@\x13\x09\ +\x04\x00\x00\x08\x01\x01\x0b\x0c\x08\x07\x07\x01\x04\x04\x09\x06\ +\x01\x18\x00??3\x11\x129\x113\x11\x12\x019\x11\ +33\x129910!!\x1147\x06\x07\x07'\ +\x01!\x03q\xfen\x06,0\xa6\xcc\x01\xf5\x01e\x03\ +\x06\x8du5)\x89\xfc\x01\x99\x00\x02\x00V\xff\xec\x04\ +\xae\x04\x93\x00\x0b\x00\x17\x00(@\x14\x0c\x06\x12\x00\x06\ +\x00\x18\x19\x09\x15TY\x09&\x03\x0fTY\x03\x19\x00\ +?+\x00\x18?+\x11\x12\x0199\x113\x1131\ +0\x01\x10\x00! \x00\x11\x10\x00! \x00\x01\x14\x16\ +32654&#\x22\x06\x04\xae\xfe\xe4\xfe\xed\xfe\ +\xf1\xfe\xe6\x01$\x01\x0d\x01\x0a\x01\x1d\xfd5IYV\ +FIUWI\x02D\xfe\xdd\xfe\xcb\x012\x01&\x01\ +\x1d\x012\xfe\xd1\xfe\xe0\x98\x89\x89\x98\x9b}\x81\x00\x00\ +\x01\x001\x00\x00\x03\x81\x04\x7f\x00\x0a\x00*@\x13\x09\ +\x04\x00\x00\x08\x01\x01\x0b\x0c\x08\x07\x07\x01\x04\x04\x09\x10\ +\x01\x18\x00??3\x11\x129\x113\x11\x12\x019\x11\ +33\x129910!!\x1147\x06\x07\x07'\ +\x01!\x03\x81\xfeo\x081<\x9b\xbf\x01\xfa\x01V\x01\ +\xf2u\x806.w\xf6\x01}\x00\x01\x009\x00\x00\x04\ +{\x04\x93\x00\x18\x00C@!\x17\x01\x07\x12\x12\x0c\x00\ +\x0c\x01\x01\x00\x19\x1a\x13\x07\x07\x02\x09\x0f\x09UY\x0f\ +&\x02\x17\x01\x01\x17UY\x01\x18\x00?+\x11\x12\x00\ +9\x18?+\x11\x12\x009\x113\x11\x12\x0199\x11\ +3\x11\x129\x113\x12910!!\x11%>\x02\ +54#\x22\x07\x036$32\x16\x15\x14\x06\x07\x07\ +\x15!\x04{\xfb\xe3\x01Jhw5\x83\x80\xb1\xcf\x8d\ +\x01\x11\xa6\xd5\xf6\x8c\x99\x5c\x01\xb4\x01#\xc9?ZF\ ++R\x94\x01\x00ze\xb7\xa3u\xc6f>\x14\x00\x00\ +\x01\x00F\xfe\xb4\x04\x5c\x04\x93\x00&\x00S@*\x17\ +\x0c\x03\x1b\x1b\x00\x00!\x06!\x0c\x13\x06\x0c\x06'(\ + \x18\x1e$\x1eTY\x03\x17\x18\x18\x17VY\x18\x18\ +\x09$&\x09\x10TY\x09%\x00?+\x00\x18?\x12\ +9/+\x11\x12\x009+\x11\x12\x009\x11\x12\x019\ +9\x113\x113\x11\x129\x113\x113\x12910\ +\x01\x14\x06\x07\x15\x04\x11\x14\x04!\x22&'\x11\x16\x16\ +32654&##\x113 54&#\x22\ +\x07\x036632\x04\x041\xa6\x9d\x01n\xfe\xbb\xfe\ +\xe3y\xc3x`\xc7T\x82w\x96\xa1Z\x5c\x01-Y\ +K\x8c\x96\xa4q\xf8\x9b\xe3\x01\x02\x03B\x88\xc3,\x06\ +.\xfe\xd3\xcc\xea\x22.\x01H2.INXF\x01\ +)\x99;8^\x01\x08NE\xb4\x00\x00\x02\x00\x14\xfe\ +\xa8\x04\x83\x04\x7f\x00\x0a\x00\x13\x00@@ \x13\x05\x07\ +\x0e\x02\x0b\x03\x03\x09\x02\x00\x02\x05\x03\x14\x15\x0e\x13\x07\ +\x10\x09\x06\x13\x04\x13VY\x01\x04&\x03%\x00??\ +3+\x11\x0033\x18?\x129\x11\x12\x01\x179\x11\ +33\x113\x1299\x11310%#\x11!\x11\ +!5\x01!\x113!5467#\x06\x07\x07\x04\ +\x83\x97\xfez\xfd\xae\x02}\x01[\x97\xfd\xe3\x0a\x03\x09\ +YB^\x1b\xfe\x8d\x01s\xfe\x03f\xfc\xcb\x8d8\x9f\ +\x02\x99Ty\x00\x00\x01\x00^\xfe\xb4\x04R\x04\x7f\x00\ +\x1d\x00L@&\x19\x1b\x04\x1b\x15\x16\x16\x09\x10\x10\x04\ +\x09\x04\x1e\x1f\x16\x13\x00\x13VY\x1b\x00\x00\x07\x17\x17\ +\x1aUY\x17\x10\x07\x0dTY\x07%\x00?+\x00\x18\ +?+\x11\x12\x009\x18/3+\x11\x003\x11\x12\x01\ +99\x113\x11\x129\x1133\x11\x12910\x01\ +2\x16\x16\x15\x14\x00!\x22'\x11\x16\x163265\ +4&#\x22\x07'\x13!\x11!\x0766\x02\x98~\ +\xcbq\xfe\xd9\xfe\xd5\xfd\xa5W\xdbOnvxz]\ +l\x917\x03B\xfe\x0e\x12NB\x02\x87u\xd6\x8c\xf6\ +\xfe\xfaP\x01D(4][S_#H\x03\x04\xfe\ +\xb6\xc0\x0f\x03\x00\xff\xff\x00F\xff\xec\x04q\x05\xcb\x02\ +\x06\x00\x19\x00\x00\x00\x01\x00N\xfe\xcb\x04m\x04\x7f\x00\ +\x06\x00.@\x16\x06\x00\x00\x01\x02\x01\x04\x02\x04\x07\x08\ +\x05\x03\x02\x03\x02UY\x03\x10\x00$\x00??+\x11\ +\x12\x009\x11\x12\x0199\x113\x11\x129\x1131\ +0\x13\x01!\x11!\x15\x01\xd1\x01\xf6\xfd\x87\x04\x1f\xfd\ +\xfd\xfe\xcb\x04l\x01H\xe9\xfb5\x00\xff\xff\x00D\xff\ +\xec\x04o\x05\xcb\x02\x06\x00\x1b\x00\x00\x00\x02\x005\xfe\ +\xba\x04m\x04\x93\x00\x18\x00$\x00D@\x22\x1c\x05\x13\ +\x0b\x22\x22\x00\x13\x00%&\x0b\x10\x1f\x1f\x10VY\x1f\ +\x1f\x03\x16\x16\x19TY\x16$\x03\x08VY\x03&\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x00\ +9\x11\x12\x0199\x113\x113\x113310\x01\ +\x10\x00!\x22'\x11\x163267#\x0e\x02#\x22\ +&54\x003 \x00%\x22\x06\x15\x14\x16326\ +54&\x04m\xfe\x8c\xfek\x7fMVV\xd4\xe6\x0a\ +\x0c'LnR\xbe\xd6\x01\x12\xf4\x01\x0c\x01&\xfd\xd9\ +AQFHA`[\x01\xe7\xfeS\xfe\x80\x0b\x019\ +\x10\xaf\xbdH@\x22\xfe\xdf\xf2\x01\x14\xfe\x9c)^i\ +Qa^B[~\x00\xff\xff\x00-\x00\x00\x06\xcf\x06\ +\x1f\x00&\x00I\x00\x00\x00\x07\x00I\x03N\x00\x00\x00\ +\x02\x00B\x02\xdd\x05\xc3\x05\xc1\x00 \x003\x00u@\ +93!*+*)\x03&.&''\x16\x0b\x00\ +\x00\x05-\x05\x1b\x11.-\x11-451#*#\ +!+!'\x11\x1b\x00\x0b\x1b\x0b\x19\x08\x08\x03\x03.\ +''4+(\x19\x14\x14(\x03\x00?3/3\x11\ +3\x129/33/3\x11\x1299\x113\x113\ +\x113\x11\x1299\x113\x11\x12\x0199\x113\x11\ +33\x11\x129\x11333\x113\x11\x12\x179\x11\ +3310\x01\x14\x06#\x22'5\x163265\ +4'.\x0254632\x17\x07&#\x22\x15\x14\ +\x16\x17\x16\x16\x01\x03#\x16\x15\x11#\x11!\x13\x13!\ +\x11#\x1147#\x03\x02\x1d\x96}j^ea \ +(CVN'\x8byonDO>D-8U\ +U\x01\xa6\x90\x08\x06\xc0\x01\x1e\x8a\x95\x01\x15\xc3\x06\x08\ +\x98\x03\xb6du-\xa69\x1d\x1c*\x1e%AT5\ +gs<\x8d/7\x1c,\x19&d\xfe\xe0\x01\xfe@\ +.\xfep\x02\xd1\xfe!\x01\xdf\xfd/\x01\x90J$\xfe\ +\x02\xff\xff\x003\xfe\x14\x04\x87\x05\xb6\x02&\x007\x00\ +\x00\x00\x07\x00z\x01\xc3\x00\x00\xff\xff\x005\xfe\x14\x03\ +o\x05P\x02&\x00W\x00\x00\x00\x07\x00z\x01}\x00\ +\x00\x00\x02\x00V\xfe\x14\x04\x9e\x04\x81\x00\x0b\x00*\x00\ +J@'\x09\x14\x19\x0e\x04\x1d\x1d$\x14\x03+,$\ + \x11 'IY \x1c\x1c\x0f\x19\x0e\x17\x11\x17\x07\ +GY\x17\x10\x11\x00GY\x11\x16\x00?+\x00\x18?\ ++\x11\x12\x0099\x18??+\x11\x12\x009\x11\x12\ +\x01\x179\x11333\x11310\x012655\ +4&#\x22\x11\x14\x16\x1347#\x06#\x22\x02\x11\ +\x10\x1232\x1737!\x11\x14\x04!\x22&'\x11\ +\x16\x163265\x02\x8bYQR^\xa2R\xe2\x0c\ +\x0c`\xcb\xbe\xd8\xdd\xbf\xcdh\x08\x1d\x01R\xfe\xe4\xfe\ +\xef\x94\xafv\x85\xab^hi\x01\x1bn\x83/\x96\x81\ +\xfe\xdd\x94\x80\xfe\xf1'\x5c\xa3\x018\x01\x11\x01\x14\x01\ +8\xa0\x8c\xfb\x99\xf7\xfb\x19'\x0195'fc\xff\ +\xff\x00V\xfe\x14\x04\x9e\x06!\x02&\x03\x91\x00\x00\x01\ +\x06\x01K3\x00\x00\x08\xb3\x028\x11&\x00+5\xff\ +\xff\x00V\xfe\x14\x04\x9e\x06L\x02&\x03\x91\x00\x00\x01\ +\x06\x01N3\x00\x00\x08\xb3\x02.\x11&\x00+5\xff\ +\xff\x00V\xfe\x14\x04\x9e\x065\x02&\x03\x91\x00\x00\x01\ +\x07\x01O\x01^\x00\x00\x00\x08\xb3\x023\x11&\x00+\ +5\xff\xff\x00V\xfe\x14\x04\x9e\x06!\x02&\x03\x91\x00\ +\x00\x01\x07\x02:\x00\xd1\x00\x00\x00\x08\xb3\x02.\x11&\ +\x00+5\x00\x01\x00\x9e\x00\x00\x02+\x05\xb6\x00\x03\x00\ +\x11\xb6\x00\x05\x04\x01\x03\x00\x12\x00??\x11\x12\x019\ +103\x11!\x11\x9e\x01\x8d\x05\xb6\xfaJ\xff\xff\xff\ +\x8c\x00\x00\x02@\x07s\x02&\x03\x96\x00\x00\x01\x07\x00\ +C\xfe\x84\x01R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\ +\xff\x00\x9c\x00\x00\x03P\x07s\x02&\x03\x96\x00\x00\x01\ +\x07\x00v\xff\x94\x01R\x00\x08\xb3\x01\x0d\x05&\x00+\ +5\xff\xff\xff\xa1\x00\x00\x03,\x07s\x02&\x03\x96\x00\ +\x00\x01\x07\x01K\xfe\xfd\x01R\x00\x08\xb3\x01\x11\x05&\ +\x00+5\xff\xff\xff\xc9\x00\x00\x03\x01\x07u\x02&\x03\ +\x96\x00\x00\x01\x07\x00j\xfe\xea\x01R\x00\x0a\xb4\x02\x01\ +\x19\x05&\x00+55\xff\xff\xff\xc1\x00\x00\x03\x0b\x07\ +\x7f\x02&\x03\x96\x00\x00\x01\x07\x01R\xff\x11\x01R\x00\ +\x08\xb3\x01\x0c\x05&\x00+5\xff\xff\xff\xfd\x00\x00\x02\ +\xd4\x07\x17\x02&\x03\x96\x00\x00\x01\x07\x01M\xff\x09\x01\ +R\x00\x08\xb3\x01\x06\x05&\x00+5\xff\xff\xff\xd4\x00\ +\x00\x02\xfd\x07\x9e\x02&\x03\x96\x00\x00\x01\x07\x01N\xff\ +\x03\x01R\x00\x08\xb3\x01\x07\x05&\x00+5\xff\xff\x00\ +X\xfe\x14\x02+\x05\xb6\x02&\x03\x96\x00\x00\x00\x06\x01\ +Q^\x00\xff\xff\x00\x93\x00\x00\x023\x07\x87\x02&\x03\ +\x96\x00\x00\x01\x07\x01O\x00\x14\x01R\x00\x08\xb3\x01\x0c\ +\x05&\x00+5\xff\xff\x00\x9e\xfe5\x04\xfc\x05\xb6\x00\ +&\x03\x96\x00\x00\x00\x07\x00-\x02\xc9\x00\x00\xff\xff\xff\ +\xb0\x00\x00\x03\x02\x05\xf3\x00'\x03\x96\x00\xd7\x00\x00\x01\ +\x07\x01T\xfe\x1a\xff\x97\x00\x0d\xb7\x01\x072\x07\x07\x01\ +\x01>\x00+\x115\x00\xff\xff\x00\x9e\x00\x00\x02+\x05\ +\xb6\x02\x06\x03\x96\x00\x00\xff\xff\xff\xc7\x00\x00\x02\xff\x07\ +u\x02&\x03\x96\x00\x00\x01\x07\x00j\xfe\xe8\x01R\x00\ +\x0a\xb4\x02\x01\x19\x05&\x00+55\xff\xff\x00\x9e\x00\ +\x00\x02+\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\xff\xc9\x00\ +\x00\x03\x01\x07u\x02&\x03\x96\x00\x00\x01\x07\x00j\xfe\ +\xea\x01R\x00\x0a\xb4\x02\x01\x19\x05&\x00+55\xff\ +\xff\x00\x9e\x00\x00\x02+\x05\xb6\x02\x06\x03\x96\x00\x00\xff\ +\xff\x00\x9e\x00\x00\x02+\x05\xb6\x02\x06\x03\x96\x00\x00\xff\ +\xff\x00r\x00\x00\x02r\x08\x02\x02&\x03\x96\x00\x00\x01\ +\x07\x02f\x04\x08\x01R\x00\x08\xb3\x01\x09\x05&\x00+\ +5\xff\xff\x00\x94\xfe!\x023\x05\xb6\x02&\x03\x96\x00\ +\x00\x00\x07\x02g\x04N\x00\x00\x00\x00\x00\x00\x00\x01\x00\ +\x00\xb62\x00\x01I\x06\x80\x00\x00\x0e6$\x00\x05\x00\ +$\xffq\x00\x05\x007\x00)\x00\x05\x009\x00)\x00\ +\x05\x00:\x00)\x00\x05\x00<\x00\x14\x00\x05\x00D\xff\ +\xae\x00\x05\x00F\xff\x85\x00\x05\x00G\xff\x85\x00\x05\x00\ +H\xff\x85\x00\x05\x00J\xff\xc3\x00\x05\x00P\xff\xc3\x00\ +\x05\x00Q\xff\xc3\x00\x05\x00R\xff\x85\x00\x05\x00S\xff\ +\xc3\x00\x05\x00T\xff\x85\x00\x05\x00U\xff\xc3\x00\x05\x00\ +V\xff\xc3\x00\x05\x00X\xff\xc3\x00\x05\x00\x82\xffq\x00\ +\x05\x00\x83\xffq\x00\x05\x00\x84\xffq\x00\x05\x00\x85\xff\ +q\x00\x05\x00\x86\xffq\x00\x05\x00\x87\xffq\x00\x05\x00\ +\x9f\x00\x14\x00\x05\x00\xa2\xff\x85\x00\x05\x00\xa3\xff\xae\x00\ +\x05\x00\xa4\xff\xae\x00\x05\x00\xa5\xff\xae\x00\x05\x00\xa6\xff\ +\xae\x00\x05\x00\xa7\xff\xae\x00\x05\x00\xa8\xff\xae\x00\x05\x00\ +\xa9\xff\x85\x00\x05\x00\xaa\xff\x85\x00\x05\x00\xab\xff\x85\x00\ +\x05\x00\xac\xff\x85\x00\x05\x00\xad\xff\x85\x00\x05\x00\xb4\xff\ +\x85\x00\x05\x00\xb5\xff\x85\x00\x05\x00\xb6\xff\x85\x00\x05\x00\ +\xb7\xff\x85\x00\x05\x00\xb8\xff\x85\x00\x05\x00\xba\xff\x85\x00\ +\x05\x00\xbb\xff\xc3\x00\x05\x00\xbc\xff\xc3\x00\x05\x00\xbd\xff\ +\xc3\x00\x05\x00\xbe\xff\xc3\x00\x05\x00\xc2\xffq\x00\x05\x00\ +\xc3\xff\xae\x00\x05\x00\xc4\xffq\x00\x05\x00\xc5\xff\xae\x00\ +\x05\x00\xc6\xffq\x00\x05\x00\xc7\xff\xae\x00\x05\x00\xc9\xff\ +\x85\x00\x05\x00\xcb\xff\x85\x00\x05\x00\xcd\xff\x85\x00\x05\x00\ +\xcf\xff\x85\x00\x05\x00\xd1\xff\x85\x00\x05\x00\xd3\xff\x85\x00\ +\x05\x00\xd5\xff\x85\x00\x05\x00\xd7\xff\x85\x00\x05\x00\xd9\xff\ +\x85\x00\x05\x00\xdb\xff\x85\x00\x05\x00\xdd\xff\x85\x00\x05\x00\ +\xdf\xff\xc3\x00\x05\x00\xe1\xff\xc3\x00\x05\x00\xe3\xff\xc3\x00\ +\x05\x00\xe5\xff\xc3\x00\x05\x00\xfa\xff\xc3\x00\x05\x01\x06\xff\ +\xc3\x00\x05\x01\x08\xff\xc3\x00\x05\x01\x0d\xff\xc3\x00\x05\x01\ +\x0f\xff\x85\x00\x05\x01\x11\xff\x85\x00\x05\x01\x13\xff\x85\x00\ +\x05\x01\x15\xff\x85\x00\x05\x01\x17\xff\xc3\x00\x05\x01\x19\xff\ +\xc3\x00\x05\x01\x1d\xff\xc3\x00\x05\x01!\xff\xc3\x00\x05\x01\ +$\x00)\x00\x05\x01&\x00)\x00\x05\x01+\xff\xc3\x00\ +\x05\x01-\xff\xc3\x00\x05\x01/\xff\xc3\x00\x05\x011\xff\ +\xc3\x00\x05\x013\xff\xc3\x00\x05\x015\xff\xc3\x00\x05\x01\ +6\x00)\x00\x05\x018\x00\x14\x00\x05\x01:\x00\x14\x00\ +\x05\x01C\xffq\x00\x05\x01D\xff\xae\x00\x05\x01F\xff\ +\xae\x00\x05\x01H\xff\x85\x00\x05\x01J\xff\xc3\x00\x05\x01\ +V\xffq\x00\x05\x01_\xffq\x00\x05\x01b\xffq\x00\ +\x05\x01i\xffq\x00\x05\x01y\xff\xae\x00\x05\x01z\xff\ +\xd7\x00\x05\x01{\xff\xd7\x00\x05\x01~\xff\xae\x00\x05\x01\ +\x81\xff\xc3\x00\x05\x01\x82\xff\xd7\x00\x05\x01\x83\xff\xd7\x00\ +\x05\x01\x84\xff\xd7\x00\x05\x01\x87\xff\xd7\x00\x05\x01\x89\xff\ +\xd7\x00\x05\x01\x8c\xff\xae\x00\x05\x01\x8e\xff\xc3\x00\x05\x01\ +\x8f\xff\xae\x00\x05\x01\x90\xff\xae\x00\x05\x01\x93\xff\xae\x00\ +\x05\x01\x99\xff\xae\x00\x05\x01\xa4\xff\x85\x00\x05\x01\xaa\xff\ +q\x00\x05\x01\xae\xff\x85\x00\x05\x01\xb5\xff\x85\x00\x05\x01\ +\xca\xff\xd7\x00\x05\x01\xce\xffq\x00\x05\x01\xcf\xff\x85\x00\ +\x05\x01\xd5\xffq\x00\x05\x01\xd8\xff\x85\x00\x05\x01\xdb\xff\ +\x85\x00\x05\x01\xde\xff\x85\x00\x05\x01\xea\xff\x85\x00\x05\x01\ +\xed\xff\x85\x00\x05\x01\xee\xff\xc3\x00\x05\x01\xf2\xffq\x00\ +\x05\x01\xfa\x00)\x00\x05\x01\xfc\x00)\x00\x05\x01\xfe\x00\ +)\x00\x05\x02\x00\x00\x14\x00\x05\x02W\xff\xc3\x00\x05\x02\ +X\xffq\x00\x05\x02Y\xff\xae\x00\x05\x02`\xff\x85\x00\ +\x05\x02b\xff\xc3\x00\x05\x02j\xff\x85\x00\x05\x02r\xff\ +q\x00\x05\x02s\xffq\x00\x05\x02}\xff\xec\x00\x05\x02\ +\x7f\xff\x85\x00\x05\x02\x85\xff\x85\x00\x05\x02\x87\xff\x85\x00\ +\x05\x02\x89\xff\x85\x00\x05\x02\x8d\xff\x85\x00\x05\x02\xb2\xff\ +\x85\x00\x05\x02\xb4\xff\x85\x00\x05\x02\xce\xff\x85\x00\x05\x02\ +\xcf\xffq\x00\x05\x02\xd9\xffq\x00\x05\x02\xda\xff\xd7\x00\ +\x05\x02\xdb\xffq\x00\x05\x02\xdc\xff\xd7\x00\x05\x02\xdd\xff\ +q\x00\x05\x02\xde\xff\xd7\x00\x05\x02\xe0\xff\x85\x00\x05\x02\ +\xe2\xff\xd7\x00\x05\x02\xe4\xff\xd7\x00\x05\x02\xf0\xff\x85\x00\ +\x05\x02\xf2\xff\x85\x00\x05\x02\xf4\xff\x85\x00\x05\x03\x09\xff\ +q\x00\x05\x03\x0a\xff\x85\x00\x05\x03\x0b\xffq\x00\x05\x03\ +\x0c\xff\x85\x00\x05\x03\x11\xff\x85\x00\x05\x03\x12\xffq\x00\ +\x05\x03\x16\xff\x85\x00\x05\x03\x1a\xff\x85\x00\x05\x03\x1b\xff\ +\x85\x00\x05\x03\x1c\xffq\x00\x05\x03\x1d\xffq\x00\x05\x03\ +\x1e\xff\xae\x00\x05\x03\x1f\xffq\x00\x05\x03 \xff\xae\x00\ +\x05\x03!\xffq\x00\x05\x03\x22\xff\xae\x00\x05\x03#\xff\ +q\x00\x05\x03%\xffq\x00\x05\x03&\xff\xae\x00\x05\x03\ +'\xffq\x00\x05\x03(\xff\xae\x00\x05\x03)\xffq\x00\ +\x05\x03*\xff\xae\x00\x05\x03+\xffq\x00\x05\x03,\xff\ +\xae\x00\x05\x03-\xffq\x00\x05\x03.\xff\xae\x00\x05\x03\ +/\xffq\x00\x05\x030\xff\xae\x00\x05\x031\xffq\x00\ +\x05\x032\xff\xae\x00\x05\x033\xffq\x00\x05\x034\xff\ +\xae\x00\x05\x036\xff\x85\x00\x05\x038\xff\x85\x00\x05\x03\ +:\xff\x85\x00\x05\x03<\xff\x85\x00\x05\x03@\xff\x85\x00\ +\x05\x03B\xff\x85\x00\x05\x03D\xff\x85\x00\x05\x03J\xff\ +\x85\x00\x05\x03L\xff\x85\x00\x05\x03N\xff\x85\x00\x05\x03\ +R\xff\x85\x00\x05\x03T\xff\x85\x00\x05\x03V\xff\x85\x00\ +\x05\x03X\xff\x85\x00\x05\x03Z\xff\x85\x00\x05\x03\x5c\xff\ +\x85\x00\x05\x03^\xff\x85\x00\x05\x03`\xff\x85\x00\x05\x03\ +b\xff\xc3\x00\x05\x03d\xff\xc3\x00\x05\x03f\xff\xc3\x00\ +\x05\x03h\xff\xc3\x00\x05\x03j\xff\xc3\x00\x05\x03l\xff\ +\xc3\x00\x05\x03n\xff\xc3\x00\x05\x03o\x00\x14\x00\x05\x03\ +q\x00\x14\x00\x05\x03s\x00\x14\x00\x05\x03\x8f\x00)\x00\ +\x0a\x00$\xffq\x00\x0a\x007\x00)\x00\x0a\x009\x00\ +)\x00\x0a\x00:\x00)\x00\x0a\x00<\x00\x14\x00\x0a\x00\ +D\xff\xae\x00\x0a\x00F\xff\x85\x00\x0a\x00G\xff\x85\x00\ +\x0a\x00H\xff\x85\x00\x0a\x00J\xff\xc3\x00\x0a\x00P\xff\ +\xc3\x00\x0a\x00Q\xff\xc3\x00\x0a\x00R\xff\x85\x00\x0a\x00\ +S\xff\xc3\x00\x0a\x00T\xff\x85\x00\x0a\x00U\xff\xc3\x00\ +\x0a\x00V\xff\xc3\x00\x0a\x00X\xff\xc3\x00\x0a\x00\x82\xff\ +q\x00\x0a\x00\x83\xffq\x00\x0a\x00\x84\xffq\x00\x0a\x00\ +\x85\xffq\x00\x0a\x00\x86\xffq\x00\x0a\x00\x87\xffq\x00\ +\x0a\x00\x9f\x00\x14\x00\x0a\x00\xa2\xff\x85\x00\x0a\x00\xa3\xff\ +\xae\x00\x0a\x00\xa4\xff\xae\x00\x0a\x00\xa5\xff\xae\x00\x0a\x00\ +\xa6\xff\xae\x00\x0a\x00\xa7\xff\xae\x00\x0a\x00\xa8\xff\xae\x00\ +\x0a\x00\xa9\xff\x85\x00\x0a\x00\xaa\xff\x85\x00\x0a\x00\xab\xff\ +\x85\x00\x0a\x00\xac\xff\x85\x00\x0a\x00\xad\xff\x85\x00\x0a\x00\ +\xb4\xff\x85\x00\x0a\x00\xb5\xff\x85\x00\x0a\x00\xb6\xff\x85\x00\ +\x0a\x00\xb7\xff\x85\x00\x0a\x00\xb8\xff\x85\x00\x0a\x00\xba\xff\ +\x85\x00\x0a\x00\xbb\xff\xc3\x00\x0a\x00\xbc\xff\xc3\x00\x0a\x00\ +\xbd\xff\xc3\x00\x0a\x00\xbe\xff\xc3\x00\x0a\x00\xc2\xffq\x00\ +\x0a\x00\xc3\xff\xae\x00\x0a\x00\xc4\xffq\x00\x0a\x00\xc5\xff\ +\xae\x00\x0a\x00\xc6\xffq\x00\x0a\x00\xc7\xff\xae\x00\x0a\x00\ +\xc9\xff\x85\x00\x0a\x00\xcb\xff\x85\x00\x0a\x00\xcd\xff\x85\x00\ +\x0a\x00\xcf\xff\x85\x00\x0a\x00\xd1\xff\x85\x00\x0a\x00\xd3\xff\ +\x85\x00\x0a\x00\xd5\xff\x85\x00\x0a\x00\xd7\xff\x85\x00\x0a\x00\ +\xd9\xff\x85\x00\x0a\x00\xdb\xff\x85\x00\x0a\x00\xdd\xff\x85\x00\ +\x0a\x00\xdf\xff\xc3\x00\x0a\x00\xe1\xff\xc3\x00\x0a\x00\xe3\xff\ +\xc3\x00\x0a\x00\xe5\xff\xc3\x00\x0a\x00\xfa\xff\xc3\x00\x0a\x01\ +\x06\xff\xc3\x00\x0a\x01\x08\xff\xc3\x00\x0a\x01\x0d\xff\xc3\x00\ +\x0a\x01\x0f\xff\x85\x00\x0a\x01\x11\xff\x85\x00\x0a\x01\x13\xff\ +\x85\x00\x0a\x01\x15\xff\x85\x00\x0a\x01\x17\xff\xc3\x00\x0a\x01\ +\x19\xff\xc3\x00\x0a\x01\x1d\xff\xc3\x00\x0a\x01!\xff\xc3\x00\ +\x0a\x01$\x00)\x00\x0a\x01&\x00)\x00\x0a\x01+\xff\ +\xc3\x00\x0a\x01-\xff\xc3\x00\x0a\x01/\xff\xc3\x00\x0a\x01\ +1\xff\xc3\x00\x0a\x013\xff\xc3\x00\x0a\x015\xff\xc3\x00\ +\x0a\x016\x00)\x00\x0a\x018\x00\x14\x00\x0a\x01:\x00\ +\x14\x00\x0a\x01C\xffq\x00\x0a\x01D\xff\xae\x00\x0a\x01\ +F\xff\xae\x00\x0a\x01H\xff\x85\x00\x0a\x01J\xff\xc3\x00\ +\x0a\x01V\xffq\x00\x0a\x01_\xffq\x00\x0a\x01b\xff\ +q\x00\x0a\x01i\xffq\x00\x0a\x01y\xff\xae\x00\x0a\x01\ +z\xff\xd7\x00\x0a\x01{\xff\xd7\x00\x0a\x01~\xff\xae\x00\ +\x0a\x01\x81\xff\xc3\x00\x0a\x01\x82\xff\xd7\x00\x0a\x01\x83\xff\ +\xd7\x00\x0a\x01\x84\xff\xd7\x00\x0a\x01\x87\xff\xd7\x00\x0a\x01\ +\x89\xff\xd7\x00\x0a\x01\x8c\xff\xae\x00\x0a\x01\x8e\xff\xc3\x00\ +\x0a\x01\x8f\xff\xae\x00\x0a\x01\x90\xff\xae\x00\x0a\x01\x93\xff\ +\xae\x00\x0a\x01\x99\xff\xae\x00\x0a\x01\xa4\xff\x85\x00\x0a\x01\ +\xaa\xffq\x00\x0a\x01\xae\xff\x85\x00\x0a\x01\xb5\xff\x85\x00\ +\x0a\x01\xca\xff\xd7\x00\x0a\x01\xce\xffq\x00\x0a\x01\xcf\xff\ +\x85\x00\x0a\x01\xd5\xffq\x00\x0a\x01\xd8\xff\x85\x00\x0a\x01\ +\xdb\xff\x85\x00\x0a\x01\xde\xff\x85\x00\x0a\x01\xea\xff\x85\x00\ +\x0a\x01\xed\xff\x85\x00\x0a\x01\xee\xff\xc3\x00\x0a\x01\xf2\xff\ +q\x00\x0a\x01\xfa\x00)\x00\x0a\x01\xfc\x00)\x00\x0a\x01\ +\xfe\x00)\x00\x0a\x02\x00\x00\x14\x00\x0a\x02W\xff\xc3\x00\ +\x0a\x02X\xffq\x00\x0a\x02Y\xff\xae\x00\x0a\x02`\xff\ +\x85\x00\x0a\x02b\xff\xc3\x00\x0a\x02j\xff\x85\x00\x0a\x02\ +r\xffq\x00\x0a\x02s\xffq\x00\x0a\x02}\xff\xec\x00\ +\x0a\x02\x7f\xff\x85\x00\x0a\x02\x85\xff\x85\x00\x0a\x02\x87\xff\ +\x85\x00\x0a\x02\x89\xff\x85\x00\x0a\x02\x8d\xff\x85\x00\x0a\x02\ +\xb2\xff\x85\x00\x0a\x02\xb4\xff\x85\x00\x0a\x02\xce\xff\x85\x00\ +\x0a\x02\xcf\xffq\x00\x0a\x02\xd9\xffq\x00\x0a\x02\xda\xff\ +\xd7\x00\x0a\x02\xdb\xffq\x00\x0a\x02\xdc\xff\xd7\x00\x0a\x02\ +\xdd\xffq\x00\x0a\x02\xde\xff\xd7\x00\x0a\x02\xe0\xff\x85\x00\ +\x0a\x02\xe2\xff\xd7\x00\x0a\x02\xe4\xff\xd7\x00\x0a\x02\xf0\xff\ +\x85\x00\x0a\x02\xf2\xff\x85\x00\x0a\x02\xf4\xff\x85\x00\x0a\x03\ +\x09\xffq\x00\x0a\x03\x0a\xff\x85\x00\x0a\x03\x0b\xffq\x00\ +\x0a\x03\x0c\xff\x85\x00\x0a\x03\x11\xff\x85\x00\x0a\x03\x12\xff\ +q\x00\x0a\x03\x16\xff\x85\x00\x0a\x03\x1a\xff\x85\x00\x0a\x03\ +\x1b\xff\x85\x00\x0a\x03\x1c\xffq\x00\x0a\x03\x1d\xffq\x00\ +\x0a\x03\x1e\xff\xae\x00\x0a\x03\x1f\xffq\x00\x0a\x03 \xff\ +\xae\x00\x0a\x03!\xffq\x00\x0a\x03\x22\xff\xae\x00\x0a\x03\ +#\xffq\x00\x0a\x03%\xffq\x00\x0a\x03&\xff\xae\x00\ +\x0a\x03'\xffq\x00\x0a\x03(\xff\xae\x00\x0a\x03)\xff\ +q\x00\x0a\x03*\xff\xae\x00\x0a\x03+\xffq\x00\x0a\x03\ +,\xff\xae\x00\x0a\x03-\xffq\x00\x0a\x03.\xff\xae\x00\ +\x0a\x03/\xffq\x00\x0a\x030\xff\xae\x00\x0a\x031\xff\ +q\x00\x0a\x032\xff\xae\x00\x0a\x033\xffq\x00\x0a\x03\ +4\xff\xae\x00\x0a\x036\xff\x85\x00\x0a\x038\xff\x85\x00\ +\x0a\x03:\xff\x85\x00\x0a\x03<\xff\x85\x00\x0a\x03@\xff\ +\x85\x00\x0a\x03B\xff\x85\x00\x0a\x03D\xff\x85\x00\x0a\x03\ +J\xff\x85\x00\x0a\x03L\xff\x85\x00\x0a\x03N\xff\x85\x00\ +\x0a\x03R\xff\x85\x00\x0a\x03T\xff\x85\x00\x0a\x03V\xff\ +\x85\x00\x0a\x03X\xff\x85\x00\x0a\x03Z\xff\x85\x00\x0a\x03\ +\x5c\xff\x85\x00\x0a\x03^\xff\x85\x00\x0a\x03`\xff\x85\x00\ +\x0a\x03b\xff\xc3\x00\x0a\x03d\xff\xc3\x00\x0a\x03f\xff\ +\xc3\x00\x0a\x03h\xff\xc3\x00\x0a\x03j\xff\xc3\x00\x0a\x03\ +l\xff\xc3\x00\x0a\x03n\xff\xc3\x00\x0a\x03o\x00\x14\x00\ +\x0a\x03q\x00\x14\x00\x0a\x03s\x00\x14\x00\x0a\x03\x8f\x00\ +)\x00\x0b\x00-\x00\xb8\x00\x0f\x00&\xff\x9a\x00\x0f\x00\ +*\xff\x9a\x00\x0f\x002\xff\x9a\x00\x0f\x004\xff\x9a\x00\ +\x0f\x007\xffq\x00\x0f\x008\xff\xd7\x00\x0f\x009\xff\ +\x85\x00\x0f\x00:\xff\x85\x00\x0f\x00<\xff\x85\x00\x0f\x00\ +\x89\xff\x9a\x00\x0f\x00\x94\xff\x9a\x00\x0f\x00\x95\xff\x9a\x00\ +\x0f\x00\x96\xff\x9a\x00\x0f\x00\x97\xff\x9a\x00\x0f\x00\x98\xff\ +\x9a\x00\x0f\x00\x9a\xff\x9a\x00\x0f\x00\x9b\xff\xd7\x00\x0f\x00\ +\x9c\xff\xd7\x00\x0f\x00\x9d\xff\xd7\x00\x0f\x00\x9e\xff\xd7\x00\ +\x0f\x00\x9f\xff\x85\x00\x0f\x00\xc8\xff\x9a\x00\x0f\x00\xca\xff\ +\x9a\x00\x0f\x00\xcc\xff\x9a\x00\x0f\x00\xce\xff\x9a\x00\x0f\x00\ +\xde\xff\x9a\x00\x0f\x00\xe0\xff\x9a\x00\x0f\x00\xe2\xff\x9a\x00\ +\x0f\x00\xe4\xff\x9a\x00\x0f\x01\x0e\xff\x9a\x00\x0f\x01\x10\xff\ +\x9a\x00\x0f\x01\x12\xff\x9a\x00\x0f\x01\x14\xff\x9a\x00\x0f\x01\ +$\xffq\x00\x0f\x01&\xffq\x00\x0f\x01*\xff\xd7\x00\ +\x0f\x01,\xff\xd7\x00\x0f\x01.\xff\xd7\x00\x0f\x010\xff\ +\xd7\x00\x0f\x012\xff\xd7\x00\x0f\x014\xff\xd7\x00\x0f\x01\ +6\xff\x85\x00\x0f\x018\xff\x85\x00\x0f\x01:\xff\x85\x00\ +\x0f\x01G\xff\x9a\x00\x0f\x01f\xff\xae\x00\x0f\x01m\xff\ +\xae\x00\x0f\x01q\xffq\x00\x0f\x01r\xff\x85\x00\x0f\x01\ +s\xff\x9a\x00\x0f\x01u\xff\x85\x00\x0f\x01x\xff\x85\x00\ +\x0f\x01\x85\xff\xd7\x00\x0f\x01\x9d\xffq\x00\x0f\x01\x9f\xff\ +\x9a\x00\x0f\x01\xa6\xffq\x00\x0f\x01\xb8\xff\x9a\x00\x0f\x01\ +\xbb\xff\x9a\x00\x0f\x01\xbc\xffq\x00\x0f\x01\xbe\xff\xae\x00\ +\x0f\x01\xc1\xff\x5c\x00\x0f\x01\xc4\xffq\x00\x0f\x01\xdc\xff\ +\x9a\x00\x0f\x01\xe1\xff\x85\x00\x0f\x01\xe4\xff\x9a\x00\x0f\x01\ +\xfa\xff\x85\x00\x0f\x01\xfc\xff\x85\x00\x0f\x01\xfe\xff\x85\x00\ +\x0f\x02\x00\xff\x85\x00\x0f\x02T\xff\x85\x00\x0f\x02_\xff\ +\x9a\x00\x0f\x02a\xff\xd7\x00\x0f\x02l\xff\x9a\x00\x0f\x02\ +|\xff\x5c\x00\x0f\x02~\xff\x9a\x00\x0f\x02\x80\xff\x85\x00\ +\x0f\x02\x82\xff\x85\x00\x0f\x02\x84\xff\x9a\x00\x0f\x02\x86\xff\ +\x9a\x00\x0f\x02\x88\xff\x9a\x00\x0f\x02\x8a\xff\x9a\x00\x0f\x02\ +\x8c\xff\x9a\x00\x0f\x02\xa9\xffq\x00\x0f\x02\xaa\xff\x9a\x00\ +\x0f\x02\xb1\xff\x9a\x00\x0f\x02\xb3\xff\x9a\x00\x0f\x02\xb5\xff\ +q\x00\x0f\x02\xb6\xff\x9a\x00\x0f\x02\xb7\xff\x85\x00\x0f\x02\ +\xb9\xff\x85\x00\x0f\x02\xbd\xffq\x00\x0f\x02\xbe\xff\x9a\x00\ +\x0f\x02\xbf\xff\x5c\x00\x0f\x02\xc0\xff\x85\x00\x0f\x02\xc1\xff\ +\x5c\x00\x0f\x02\xc2\xff\x85\x00\x0f\x02\xc5\xff\x85\x00\x0f\x02\ +\xc7\xff\x85\x00\x0f\x02\xd4\xff\x5c\x00\x0f\x02\xd5\xff\x85\x00\ +\x0f\x02\xef\xff\x9a\x00\x0f\x02\xf1\xff\x9a\x00\x0f\x02\xf3\xff\ +\x9a\x00\x0f\x02\xfd\xff\x5c\x00\x0f\x02\xfe\xff\x85\x00\x0f\x03\ +\x0d\xff\x85\x00\x0f\x03\x0e\xff\x9a\x00\x0f\x03\x0f\xff\x85\x00\ +\x0f\x03\x10\xff\x9a\x00\x0f\x03\x15\xff\x9a\x00\x0f\x03\x17\xff\ +q\x00\x0f\x03\x18\xff\x9a\x00\x0f\x03I\xff\x9a\x00\x0f\x03\ +K\xff\x9a\x00\x0f\x03M\xff\x9a\x00\x0f\x03O\xff\x9a\x00\ +\x0f\x03Q\xff\x9a\x00\x0f\x03S\xff\x9a\x00\x0f\x03U\xff\ +\x9a\x00\x0f\x03W\xff\x9a\x00\x0f\x03Y\xff\x9a\x00\x0f\x03\ +[\xff\x9a\x00\x0f\x03]\xff\x9a\x00\x0f\x03_\xff\x9a\x00\ +\x0f\x03a\xff\xd7\x00\x0f\x03c\xff\xd7\x00\x0f\x03e\xff\ +\xd7\x00\x0f\x03g\xff\xd7\x00\x0f\x03i\xff\xd7\x00\x0f\x03\ +k\xff\xd7\x00\x0f\x03m\xff\xd7\x00\x0f\x03o\xff\x85\x00\ +\x0f\x03q\xff\x85\x00\x0f\x03s\xff\x85\x00\x0f\x03\x8f\xff\ +q\x00\x10\x007\xff\xae\x00\x10\x01$\xff\xae\x00\x10\x01\ +&\xff\xae\x00\x10\x01q\xff\xae\x00\x10\x01\x9d\xff\xae\x00\ +\x10\x01\xa6\xff\xae\x00\x10\x01\xbc\xff\xae\x00\x10\x01\xc4\xff\ +\xae\x00\x10\x01\xdc\xff\xd7\x00\x10\x01\xe4\xff\xd7\x00\x10\x02\ +\xa9\xff\xae\x00\x10\x02\xaa\xff\xd7\x00\x10\x02\xb5\xff\xae\x00\ +\x10\x02\xb6\xff\xd7\x00\x10\x02\xbd\xff\xae\x00\x10\x02\xbe\xff\ +\xd7\x00\x10\x03\x17\xff\xae\x00\x10\x03\x18\xff\xd7\x00\x10\x03\ +\x8f\xff\xae\x00\x11\x00&\xff\x9a\x00\x11\x00*\xff\x9a\x00\ +\x11\x002\xff\x9a\x00\x11\x004\xff\x9a\x00\x11\x007\xff\ +q\x00\x11\x008\xff\xd7\x00\x11\x009\xff\x85\x00\x11\x00\ +:\xff\x85\x00\x11\x00<\xff\x85\x00\x11\x00\x89\xff\x9a\x00\ +\x11\x00\x94\xff\x9a\x00\x11\x00\x95\xff\x9a\x00\x11\x00\x96\xff\ +\x9a\x00\x11\x00\x97\xff\x9a\x00\x11\x00\x98\xff\x9a\x00\x11\x00\ +\x9a\xff\x9a\x00\x11\x00\x9b\xff\xd7\x00\x11\x00\x9c\xff\xd7\x00\ +\x11\x00\x9d\xff\xd7\x00\x11\x00\x9e\xff\xd7\x00\x11\x00\x9f\xff\ +\x85\x00\x11\x00\xc8\xff\x9a\x00\x11\x00\xca\xff\x9a\x00\x11\x00\ +\xcc\xff\x9a\x00\x11\x00\xce\xff\x9a\x00\x11\x00\xde\xff\x9a\x00\ +\x11\x00\xe0\xff\x9a\x00\x11\x00\xe2\xff\x9a\x00\x11\x00\xe4\xff\ +\x9a\x00\x11\x01\x0e\xff\x9a\x00\x11\x01\x10\xff\x9a\x00\x11\x01\ +\x12\xff\x9a\x00\x11\x01\x14\xff\x9a\x00\x11\x01$\xffq\x00\ +\x11\x01&\xffq\x00\x11\x01*\xff\xd7\x00\x11\x01,\xff\ +\xd7\x00\x11\x01.\xff\xd7\x00\x11\x010\xff\xd7\x00\x11\x01\ +2\xff\xd7\x00\x11\x014\xff\xd7\x00\x11\x016\xff\x85\x00\ +\x11\x018\xff\x85\x00\x11\x01:\xff\x85\x00\x11\x01G\xff\ +\x9a\x00\x11\x01f\xff\xae\x00\x11\x01m\xff\xae\x00\x11\x01\ +q\xffq\x00\x11\x01r\xff\x85\x00\x11\x01s\xff\x9a\x00\ +\x11\x01u\xff\x85\x00\x11\x01x\xff\x85\x00\x11\x01\x85\xff\ +\xd7\x00\x11\x01\x9d\xffq\x00\x11\x01\x9f\xff\x9a\x00\x11\x01\ +\xa6\xffq\x00\x11\x01\xb8\xff\x9a\x00\x11\x01\xbb\xff\x9a\x00\ +\x11\x01\xbc\xffq\x00\x11\x01\xbe\xff\xae\x00\x11\x01\xc1\xff\ +\x5c\x00\x11\x01\xc4\xffq\x00\x11\x01\xdc\xff\x9a\x00\x11\x01\ +\xe1\xff\x85\x00\x11\x01\xe4\xff\x9a\x00\x11\x01\xfa\xff\x85\x00\ +\x11\x01\xfc\xff\x85\x00\x11\x01\xfe\xff\x85\x00\x11\x02\x00\xff\ +\x85\x00\x11\x02T\xff\x85\x00\x11\x02_\xff\x9a\x00\x11\x02\ +a\xff\xd7\x00\x11\x02l\xff\x9a\x00\x11\x02|\xff\x5c\x00\ +\x11\x02~\xff\x9a\x00\x11\x02\x80\xff\x85\x00\x11\x02\x82\xff\ +\x85\x00\x11\x02\x84\xff\x9a\x00\x11\x02\x86\xff\x9a\x00\x11\x02\ +\x88\xff\x9a\x00\x11\x02\x8a\xff\x9a\x00\x11\x02\x8c\xff\x9a\x00\ +\x11\x02\xa9\xffq\x00\x11\x02\xaa\xff\x9a\x00\x11\x02\xb1\xff\ +\x9a\x00\x11\x02\xb3\xff\x9a\x00\x11\x02\xb5\xffq\x00\x11\x02\ +\xb6\xff\x9a\x00\x11\x02\xb7\xff\x85\x00\x11\x02\xb9\xff\x85\x00\ +\x11\x02\xbd\xffq\x00\x11\x02\xbe\xff\x9a\x00\x11\x02\xbf\xff\ +\x5c\x00\x11\x02\xc0\xff\x85\x00\x11\x02\xc1\xff\x5c\x00\x11\x02\ +\xc2\xff\x85\x00\x11\x02\xc5\xff\x85\x00\x11\x02\xc7\xff\x85\x00\ +\x11\x02\xd4\xff\x5c\x00\x11\x02\xd5\xff\x85\x00\x11\x02\xef\xff\ +\x9a\x00\x11\x02\xf1\xff\x9a\x00\x11\x02\xf3\xff\x9a\x00\x11\x02\ +\xfd\xff\x5c\x00\x11\x02\xfe\xff\x85\x00\x11\x03\x0d\xff\x85\x00\ +\x11\x03\x0e\xff\x9a\x00\x11\x03\x0f\xff\x85\x00\x11\x03\x10\xff\ +\x9a\x00\x11\x03\x15\xff\x9a\x00\x11\x03\x17\xffq\x00\x11\x03\ +\x18\xff\x9a\x00\x11\x03I\xff\x9a\x00\x11\x03K\xff\x9a\x00\ +\x11\x03M\xff\x9a\x00\x11\x03O\xff\x9a\x00\x11\x03Q\xff\ +\x9a\x00\x11\x03S\xff\x9a\x00\x11\x03U\xff\x9a\x00\x11\x03\ +W\xff\x9a\x00\x11\x03Y\xff\x9a\x00\x11\x03[\xff\x9a\x00\ +\x11\x03]\xff\x9a\x00\x11\x03_\xff\x9a\x00\x11\x03a\xff\ +\xd7\x00\x11\x03c\xff\xd7\x00\x11\x03e\xff\xd7\x00\x11\x03\ +g\xff\xd7\x00\x11\x03i\xff\xd7\x00\x11\x03k\xff\xd7\x00\ +\x11\x03m\xff\xd7\x00\x11\x03o\xff\x85\x00\x11\x03q\xff\ +\x85\x00\x11\x03s\xff\x85\x00\x11\x03\x8f\xffq\x00$\x00\ +\x05\xffq\x00$\x00\x0a\xffq\x00$\x00&\xff\xd7\x00\ +$\x00*\xff\xd7\x00$\x00-\x01\x0a\x00$\x002\xff\ +\xd7\x00$\x004\xff\xd7\x00$\x007\xffq\x00$\x00\ +9\xff\xae\x00$\x00:\xff\xae\x00$\x00<\xff\x85\x00\ +$\x00\x89\xff\xd7\x00$\x00\x94\xff\xd7\x00$\x00\x95\xff\ +\xd7\x00$\x00\x96\xff\xd7\x00$\x00\x97\xff\xd7\x00$\x00\ +\x98\xff\xd7\x00$\x00\x9a\xff\xd7\x00$\x00\x9f\xff\x85\x00\ +$\x00\xc8\xff\xd7\x00$\x00\xca\xff\xd7\x00$\x00\xcc\xff\ +\xd7\x00$\x00\xce\xff\xd7\x00$\x00\xde\xff\xd7\x00$\x00\ +\xe0\xff\xd7\x00$\x00\xe2\xff\xd7\x00$\x00\xe4\xff\xd7\x00\ +$\x01\x0e\xff\xd7\x00$\x01\x10\xff\xd7\x00$\x01\x12\xff\ +\xd7\x00$\x01\x14\xff\xd7\x00$\x01$\xffq\x00$\x01\ +&\xffq\x00$\x016\xff\xae\x00$\x018\xff\x85\x00\ +$\x01:\xff\x85\x00$\x01G\xff\xd7\x00$\x01\xfa\xff\ +\xae\x00$\x01\xfc\xff\xae\x00$\x01\xfe\xff\xae\x00$\x02\ +\x00\xff\x85\x00$\x02\x07\xffq\x00$\x02\x0b\xffq\x00\ +$\x02_\xff\xd7\x00$\x03I\xff\xd7\x00$\x03K\xff\ +\xd7\x00$\x03M\xff\xd7\x00$\x03O\xff\xd7\x00$\x03\ +Q\xff\xd7\x00$\x03S\xff\xd7\x00$\x03U\xff\xd7\x00\ +$\x03W\xff\xd7\x00$\x03Y\xff\xd7\x00$\x03[\xff\ +\xd7\x00$\x03]\xff\xd7\x00$\x03_\xff\xd7\x00$\x03\ +o\xff\x85\x00$\x03q\xff\x85\x00$\x03s\xff\x85\x00\ +$\x03\x8f\xffq\x00%\x00\x0f\xff\xae\x00%\x00\x11\xff\ +\xae\x00%\x00$\xff\xd7\x00%\x007\xff\xc3\x00%\x00\ +9\xff\xec\x00%\x00:\xff\xec\x00%\x00;\xff\xd7\x00\ +%\x00<\xff\xec\x00%\x00=\xff\xec\x00%\x00\x82\xff\ +\xd7\x00%\x00\x83\xff\xd7\x00%\x00\x84\xff\xd7\x00%\x00\ +\x85\xff\xd7\x00%\x00\x86\xff\xd7\x00%\x00\x87\xff\xd7\x00\ +%\x00\x9f\xff\xec\x00%\x00\xc2\xff\xd7\x00%\x00\xc4\xff\ +\xd7\x00%\x00\xc6\xff\xd7\x00%\x01$\xff\xc3\x00%\x01\ +&\xff\xc3\x00%\x016\xff\xec\x00%\x018\xff\xec\x00\ +%\x01:\xff\xec\x00%\x01;\xff\xec\x00%\x01=\xff\ +\xec\x00%\x01?\xff\xec\x00%\x01C\xff\xd7\x00%\x01\ +\xa0\xff\xec\x00%\x01\xfa\xff\xec\x00%\x01\xfc\xff\xec\x00\ +%\x01\xfe\xff\xec\x00%\x02\x00\xff\xec\x00%\x02\x08\xff\ +\xae\x00%\x02\x0c\xff\xae\x00%\x02X\xff\xd7\x00%\x03\ +\x1d\xff\xd7\x00%\x03\x1f\xff\xd7\x00%\x03!\xff\xd7\x00\ +%\x03#\xff\xd7\x00%\x03%\xff\xd7\x00%\x03'\xff\ +\xd7\x00%\x03)\xff\xd7\x00%\x03+\xff\xd7\x00%\x03\ +-\xff\xd7\x00%\x03/\xff\xd7\x00%\x031\xff\xd7\x00\ +%\x033\xff\xd7\x00%\x03o\xff\xec\x00%\x03q\xff\ +\xec\x00%\x03s\xff\xec\x00%\x03\x8f\xff\xc3\x00&\x00\ +&\xff\xd7\x00&\x00*\xff\xd7\x00&\x002\xff\xd7\x00\ +&\x004\xff\xd7\x00&\x00\x89\xff\xd7\x00&\x00\x94\xff\ +\xd7\x00&\x00\x95\xff\xd7\x00&\x00\x96\xff\xd7\x00&\x00\ +\x97\xff\xd7\x00&\x00\x98\xff\xd7\x00&\x00\x9a\xff\xd7\x00\ +&\x00\xc8\xff\xd7\x00&\x00\xca\xff\xd7\x00&\x00\xcc\xff\ +\xd7\x00&\x00\xce\xff\xd7\x00&\x00\xde\xff\xd7\x00&\x00\ +\xe0\xff\xd7\x00&\x00\xe2\xff\xd7\x00&\x00\xe4\xff\xd7\x00\ +&\x01\x0e\xff\xd7\x00&\x01\x10\xff\xd7\x00&\x01\x12\xff\ +\xd7\x00&\x01\x14\xff\xd7\x00&\x01G\xff\xd7\x00&\x02\ +_\xff\xd7\x00&\x03I\xff\xd7\x00&\x03K\xff\xd7\x00\ +&\x03M\xff\xd7\x00&\x03O\xff\xd7\x00&\x03Q\xff\ +\xd7\x00&\x03S\xff\xd7\x00&\x03U\xff\xd7\x00&\x03\ +W\xff\xd7\x00&\x03Y\xff\xd7\x00&\x03[\xff\xd7\x00\ +&\x03]\xff\xd7\x00&\x03_\xff\xd7\x00'\x00\x0f\xff\ +\xae\x00'\x00\x11\xff\xae\x00'\x00$\xff\xd7\x00'\x00\ +7\xff\xc3\x00'\x009\xff\xec\x00'\x00:\xff\xec\x00\ +'\x00;\xff\xd7\x00'\x00<\xff\xec\x00'\x00=\xff\ +\xec\x00'\x00\x82\xff\xd7\x00'\x00\x83\xff\xd7\x00'\x00\ +\x84\xff\xd7\x00'\x00\x85\xff\xd7\x00'\x00\x86\xff\xd7\x00\ +'\x00\x87\xff\xd7\x00'\x00\x9f\xff\xec\x00'\x00\xc2\xff\ +\xd7\x00'\x00\xc4\xff\xd7\x00'\x00\xc6\xff\xd7\x00'\x01\ +$\xff\xc3\x00'\x01&\xff\xc3\x00'\x016\xff\xec\x00\ +'\x018\xff\xec\x00'\x01:\xff\xec\x00'\x01;\xff\ +\xec\x00'\x01=\xff\xec\x00'\x01?\xff\xec\x00'\x01\ +C\xff\xd7\x00'\x01\xa0\xff\xec\x00'\x01\xfa\xff\xec\x00\ +'\x01\xfc\xff\xec\x00'\x01\xfe\xff\xec\x00'\x02\x00\xff\ +\xec\x00'\x02\x08\xff\xae\x00'\x02\x0c\xff\xae\x00'\x02\ +X\xff\xd7\x00'\x03\x1d\xff\xd7\x00'\x03\x1f\xff\xd7\x00\ +'\x03!\xff\xd7\x00'\x03#\xff\xd7\x00'\x03%\xff\ +\xd7\x00'\x03'\xff\xd7\x00'\x03)\xff\xd7\x00'\x03\ ++\xff\xd7\x00'\x03-\xff\xd7\x00'\x03/\xff\xd7\x00\ +'\x031\xff\xd7\x00'\x033\xff\xd7\x00'\x03o\xff\ +\xec\x00'\x03q\xff\xec\x00'\x03s\xff\xec\x00'\x03\ +\x8f\xff\xc3\x00(\x00-\x00{\x00)\x00\x0f\xff\x85\x00\ +)\x00\x11\xff\x85\x00)\x00\x22\x00)\x00)\x00$\xff\ +\xd7\x00)\x00\x82\xff\xd7\x00)\x00\x83\xff\xd7\x00)\x00\ +\x84\xff\xd7\x00)\x00\x85\xff\xd7\x00)\x00\x86\xff\xd7\x00\ +)\x00\x87\xff\xd7\x00)\x00\xc2\xff\xd7\x00)\x00\xc4\xff\ +\xd7\x00)\x00\xc6\xff\xd7\x00)\x01C\xff\xd7\x00)\x02\ +\x08\xff\x85\x00)\x02\x0c\xff\x85\x00)\x02X\xff\xd7\x00\ +)\x03\x1d\xff\xd7\x00)\x03\x1f\xff\xd7\x00)\x03!\xff\ +\xd7\x00)\x03#\xff\xd7\x00)\x03%\xff\xd7\x00)\x03\ +'\xff\xd7\x00)\x03)\xff\xd7\x00)\x03+\xff\xd7\x00\ +)\x03-\xff\xd7\x00)\x03/\xff\xd7\x00)\x031\xff\ +\xd7\x00)\x033\xff\xd7\x00.\x00&\xff\xd7\x00.\x00\ +*\xff\xd7\x00.\x002\xff\xd7\x00.\x004\xff\xd7\x00\ +.\x00\x89\xff\xd7\x00.\x00\x94\xff\xd7\x00.\x00\x95\xff\ +\xd7\x00.\x00\x96\xff\xd7\x00.\x00\x97\xff\xd7\x00.\x00\ +\x98\xff\xd7\x00.\x00\x9a\xff\xd7\x00.\x00\xc8\xff\xd7\x00\ +.\x00\xca\xff\xd7\x00.\x00\xcc\xff\xd7\x00.\x00\xce\xff\ +\xd7\x00.\x00\xde\xff\xd7\x00.\x00\xe0\xff\xd7\x00.\x00\ +\xe2\xff\xd7\x00.\x00\xe4\xff\xd7\x00.\x01\x0e\xff\xd7\x00\ +.\x01\x10\xff\xd7\x00.\x01\x12\xff\xd7\x00.\x01\x14\xff\ +\xd7\x00.\x01G\xff\xd7\x00.\x02_\xff\xd7\x00.\x03\ +I\xff\xd7\x00.\x03K\xff\xd7\x00.\x03M\xff\xd7\x00\ +.\x03O\xff\xd7\x00.\x03Q\xff\xd7\x00.\x03S\xff\ +\xd7\x00.\x03U\xff\xd7\x00.\x03W\xff\xd7\x00.\x03\ +Y\xff\xd7\x00.\x03[\xff\xd7\x00.\x03]\xff\xd7\x00\ +.\x03_\xff\xd7\x00/\x00\x05\xff\x5c\x00/\x00\x0a\xff\ +\x5c\x00/\x00&\xff\xd7\x00/\x00*\xff\xd7\x00/\x00\ +2\xff\xd7\x00/\x004\xff\xd7\x00/\x007\xff\xd7\x00\ +/\x008\xff\xec\x00/\x009\xff\xd7\x00/\x00:\xff\ +\xd7\x00/\x00<\xff\xc3\x00/\x00\x89\xff\xd7\x00/\x00\ +\x94\xff\xd7\x00/\x00\x95\xff\xd7\x00/\x00\x96\xff\xd7\x00\ +/\x00\x97\xff\xd7\x00/\x00\x98\xff\xd7\x00/\x00\x9a\xff\ +\xd7\x00/\x00\x9b\xff\xec\x00/\x00\x9c\xff\xec\x00/\x00\ +\x9d\xff\xec\x00/\x00\x9e\xff\xec\x00/\x00\x9f\xff\xc3\x00\ +/\x00\xc8\xff\xd7\x00/\x00\xca\xff\xd7\x00/\x00\xcc\xff\ +\xd7\x00/\x00\xce\xff\xd7\x00/\x00\xde\xff\xd7\x00/\x00\ +\xe0\xff\xd7\x00/\x00\xe2\xff\xd7\x00/\x00\xe4\xff\xd7\x00\ +/\x01\x0e\xff\xd7\x00/\x01\x10\xff\xd7\x00/\x01\x12\xff\ +\xd7\x00/\x01\x14\xff\xd7\x00/\x01$\xff\xd7\x00/\x01\ +&\xff\xd7\x00/\x01*\xff\xec\x00/\x01,\xff\xec\x00\ +/\x01.\xff\xec\x00/\x010\xff\xec\x00/\x012\xff\ +\xec\x00/\x014\xff\xec\x00/\x016\xff\xd7\x00/\x01\ +8\xff\xc3\x00/\x01:\xff\xc3\x00/\x01G\xff\xd7\x00\ +/\x01\xfa\xff\xd7\x00/\x01\xfc\xff\xd7\x00/\x01\xfe\xff\ +\xd7\x00/\x02\x00\xff\xc3\x00/\x02\x07\xff\x5c\x00/\x02\ +\x0b\xff\x5c\x00/\x02_\xff\xd7\x00/\x02a\xff\xec\x00\ +/\x03I\xff\xd7\x00/\x03K\xff\xd7\x00/\x03M\xff\ +\xd7\x00/\x03O\xff\xd7\x00/\x03Q\xff\xd7\x00/\x03\ +S\xff\xd7\x00/\x03U\xff\xd7\x00/\x03W\xff\xd7\x00\ +/\x03Y\xff\xd7\x00/\x03[\xff\xd7\x00/\x03]\xff\ +\xd7\x00/\x03_\xff\xd7\x00/\x03a\xff\xec\x00/\x03\ +c\xff\xec\x00/\x03e\xff\xec\x00/\x03g\xff\xec\x00\ +/\x03i\xff\xec\x00/\x03k\xff\xec\x00/\x03m\xff\ +\xec\x00/\x03o\xff\xc3\x00/\x03q\xff\xc3\x00/\x03\ +s\xff\xc3\x00/\x03\x8f\xff\xd7\x002\x00\x0f\xff\xae\x00\ +2\x00\x11\xff\xae\x002\x00$\xff\xd7\x002\x007\xff\ +\xc3\x002\x009\xff\xec\x002\x00:\xff\xec\x002\x00\ +;\xff\xd7\x002\x00<\xff\xec\x002\x00=\xff\xec\x00\ +2\x00\x82\xff\xd7\x002\x00\x83\xff\xd7\x002\x00\x84\xff\ +\xd7\x002\x00\x85\xff\xd7\x002\x00\x86\xff\xd7\x002\x00\ +\x87\xff\xd7\x002\x00\x9f\xff\xec\x002\x00\xc2\xff\xd7\x00\ +2\x00\xc4\xff\xd7\x002\x00\xc6\xff\xd7\x002\x01$\xff\ +\xc3\x002\x01&\xff\xc3\x002\x016\xff\xec\x002\x01\ +8\xff\xec\x002\x01:\xff\xec\x002\x01;\xff\xec\x00\ +2\x01=\xff\xec\x002\x01?\xff\xec\x002\x01C\xff\ +\xd7\x002\x01\xa0\xff\xec\x002\x01\xfa\xff\xec\x002\x01\ +\xfc\xff\xec\x002\x01\xfe\xff\xec\x002\x02\x00\xff\xec\x00\ +2\x02\x08\xff\xae\x002\x02\x0c\xff\xae\x002\x02X\xff\ +\xd7\x002\x03\x1d\xff\xd7\x002\x03\x1f\xff\xd7\x002\x03\ +!\xff\xd7\x002\x03#\xff\xd7\x002\x03%\xff\xd7\x00\ +2\x03'\xff\xd7\x002\x03)\xff\xd7\x002\x03+\xff\ +\xd7\x002\x03-\xff\xd7\x002\x03/\xff\xd7\x002\x03\ +1\xff\xd7\x002\x033\xff\xd7\x002\x03o\xff\xec\x00\ +2\x03q\xff\xec\x002\x03s\xff\xec\x002\x03\x8f\xff\ +\xc3\x003\x00\x0f\xfe\xf6\x003\x00\x11\xfe\xf6\x003\x00\ +$\xff\x9a\x003\x00;\xff\xd7\x003\x00=\xff\xec\x00\ +3\x00\x82\xff\x9a\x003\x00\x83\xff\x9a\x003\x00\x84\xff\ +\x9a\x003\x00\x85\xff\x9a\x003\x00\x86\xff\x9a\x003\x00\ +\x87\xff\x9a\x003\x00\xc2\xff\x9a\x003\x00\xc4\xff\x9a\x00\ +3\x00\xc6\xff\x9a\x003\x01;\xff\xec\x003\x01=\xff\ +\xec\x003\x01?\xff\xec\x003\x01C\xff\x9a\x003\x02\ +\x08\xfe\xf6\x003\x02\x0c\xfe\xf6\x003\x02X\xff\x9a\x00\ +3\x03\x1d\xff\x9a\x003\x03\x1f\xff\x9a\x003\x03!\xff\ +\x9a\x003\x03#\xff\x9a\x003\x03%\xff\x9a\x003\x03\ +'\xff\x9a\x003\x03)\xff\x9a\x003\x03+\xff\x9a\x00\ +3\x03-\xff\x9a\x003\x03/\xff\x9a\x003\x031\xff\ +\x9a\x003\x033\xff\x9a\x004\x00\x0f\xff\xae\x004\x00\ +\x11\xff\xae\x004\x00$\xff\xd7\x004\x007\xff\xc3\x00\ +4\x009\xff\xec\x004\x00:\xff\xec\x004\x00;\xff\ +\xd7\x004\x00<\xff\xec\x004\x00=\xff\xec\x004\x00\ +\x82\xff\xd7\x004\x00\x83\xff\xd7\x004\x00\x84\xff\xd7\x00\ +4\x00\x85\xff\xd7\x004\x00\x86\xff\xd7\x004\x00\x87\xff\ +\xd7\x004\x00\x9f\xff\xec\x004\x00\xc2\xff\xd7\x004\x00\ +\xc4\xff\xd7\x004\x00\xc6\xff\xd7\x004\x01$\xff\xc3\x00\ +4\x01&\xff\xc3\x004\x016\xff\xec\x004\x018\xff\ +\xec\x004\x01:\xff\xec\x004\x01;\xff\xec\x004\x01\ +=\xff\xec\x004\x01?\xff\xec\x004\x01C\xff\xd7\x00\ +4\x01\xa0\xff\xec\x004\x01\xfa\xff\xec\x004\x01\xfc\xff\ +\xec\x004\x01\xfe\xff\xec\x004\x02\x00\xff\xec\x004\x02\ +\x08\xff\xae\x004\x02\x0c\xff\xae\x004\x02X\xff\xd7\x00\ +4\x03\x1d\xff\xd7\x004\x03\x1f\xff\xd7\x004\x03!\xff\ +\xd7\x004\x03#\xff\xd7\x004\x03%\xff\xd7\x004\x03\ +'\xff\xd7\x004\x03)\xff\xd7\x004\x03+\xff\xd7\x00\ +4\x03-\xff\xd7\x004\x03/\xff\xd7\x004\x031\xff\ +\xd7\x004\x033\xff\xd7\x004\x03o\xff\xec\x004\x03\ +q\xff\xec\x004\x03s\xff\xec\x004\x03\x8f\xff\xc3\x00\ +7\x00\x0f\xff\x85\x007\x00\x10\xff\xae\x007\x00\x11\xff\ +\x85\x007\x00\x22\x00)\x007\x00$\xffq\x007\x00\ +&\xff\xd7\x007\x00*\xff\xd7\x007\x002\xff\xd7\x00\ +7\x004\xff\xd7\x007\x007\x00)\x007\x00D\xff\ +\x5c\x007\x00F\xffq\x007\x00G\xffq\x007\x00\ +H\xffq\x007\x00J\xffq\x007\x00P\xff\x9a\x00\ +7\x00Q\xff\x9a\x007\x00R\xffq\x007\x00S\xff\ +\x9a\x007\x00T\xffq\x007\x00U\xff\x9a\x007\x00\ +V\xff\x85\x007\x00X\xff\x9a\x007\x00Y\xff\xd7\x00\ +7\x00Z\xff\xd7\x007\x00[\xff\xd7\x007\x00\x5c\xff\ +\xd7\x007\x00]\xff\xae\x007\x00\x82\xffq\x007\x00\ +\x83\xffq\x007\x00\x84\xffq\x007\x00\x85\xffq\x00\ +7\x00\x86\xffq\x007\x00\x87\xffq\x007\x00\x89\xff\ +\xd7\x007\x00\x94\xff\xd7\x007\x00\x95\xff\xd7\x007\x00\ +\x96\xff\xd7\x007\x00\x97\xff\xd7\x007\x00\x98\xff\xd7\x00\ +7\x00\x9a\xff\xd7\x007\x00\xa2\xffq\x007\x00\xa3\xff\ +\x5c\x007\x00\xa4\xff\x5c\x007\x00\xa5\xff\x5c\x007\x00\ +\xa6\xff\x5c\x007\x00\xa7\xff\x5c\x007\x00\xa8\xff\x5c\x00\ +7\x00\xa9\xffq\x007\x00\xaa\xffq\x007\x00\xab\xff\ +q\x007\x00\xac\xffq\x007\x00\xad\xffq\x007\x00\ +\xb4\xffq\x007\x00\xb5\xffq\x007\x00\xb6\xffq\x00\ +7\x00\xb7\xffq\x007\x00\xb8\xffq\x007\x00\xba\xff\ +q\x007\x00\xbb\xff\x9a\x007\x00\xbc\xff\x9a\x007\x00\ +\xbd\xff\x9a\x007\x00\xbe\xff\x9a\x007\x00\xbf\xff\xd7\x00\ +7\x00\xc2\xffq\x007\x00\xc3\xff\x5c\x007\x00\xc4\xff\ +q\x007\x00\xc5\xff\x5c\x007\x00\xc6\xffq\x007\x00\ +\xc7\xff\x5c\x007\x00\xc8\xff\xd7\x007\x00\xc9\xffq\x00\ +7\x00\xca\xff\xd7\x007\x00\xcb\xffq\x007\x00\xcc\xff\ +\xd7\x007\x00\xcd\xffq\x007\x00\xce\xff\xd7\x007\x00\ +\xcf\xffq\x007\x00\xd1\xffq\x007\x00\xd3\xffq\x00\ +7\x00\xd5\xffq\x007\x00\xd7\xffq\x007\x00\xd9\xff\ +q\x007\x00\xdb\xffq\x007\x00\xdd\xffq\x007\x00\ +\xde\xff\xd7\x007\x00\xdf\xffq\x007\x00\xe0\xff\xd7\x00\ +7\x00\xe1\xffq\x007\x00\xe2\xff\xd7\x007\x00\xe3\xff\ +q\x007\x00\xe4\xff\xd7\x007\x00\xe5\xffq\x007\x00\ +\xfa\xff\x9a\x007\x01\x06\xff\x9a\x007\x01\x08\xff\x9a\x00\ +7\x01\x0d\xff\x9a\x007\x01\x0e\xff\xd7\x007\x01\x0f\xff\ +q\x007\x01\x10\xff\xd7\x007\x01\x11\xffq\x007\x01\ +\x12\xff\xd7\x007\x01\x13\xffq\x007\x01\x14\xff\xd7\x00\ +7\x01\x15\xffq\x007\x01\x17\xff\x9a\x007\x01\x19\xff\ +\x9a\x007\x01\x1d\xff\x85\x007\x01!\xff\x85\x007\x01\ +$\x00)\x007\x01&\x00)\x007\x01+\xff\x9a\x00\ +7\x01-\xff\x9a\x007\x01/\xff\x9a\x007\x011\xff\ +\x9a\x007\x013\xff\x9a\x007\x015\xff\x9a\x007\x01\ +7\xff\xd7\x007\x01<\xff\xae\x007\x01>\xff\xae\x00\ +7\x01@\xff\xae\x007\x01C\xffq\x007\x01D\xff\ +\x5c\x007\x01F\xff\x5c\x007\x01G\xff\xd7\x007\x01\ +H\xffq\x007\x01J\xff\x85\x007\x01\xfb\xff\xd7\x00\ +7\x01\xfd\xff\xd7\x007\x02\x02\xff\xae\x007\x02\x03\xff\ +\xae\x007\x02\x04\xff\xae\x007\x02\x08\xff\x85\x007\x02\ +\x0c\xff\x85\x007\x02W\xff\x9a\x007\x02X\xffq\x00\ +7\x02Y\xff\x5c\x007\x02_\xff\xd7\x007\x02`\xff\ +q\x007\x02b\xff\x9a\x007\x03\x1d\xffq\x007\x03\ +\x1e\xff\x5c\x007\x03\x1f\xffq\x007\x03 \xff\x5c\x00\ +7\x03!\xffq\x007\x03\x22\xff\x5c\x007\x03#\xff\ +q\x007\x03%\xffq\x007\x03&\xff\x5c\x007\x03\ +'\xffq\x007\x03(\xff\x5c\x007\x03)\xffq\x00\ +7\x03*\xff\x5c\x007\x03+\xffq\x007\x03,\xff\ +\x5c\x007\x03-\xffq\x007\x03.\xff\x5c\x007\x03\ +/\xffq\x007\x030\xff\x5c\x007\x031\xffq\x00\ +7\x032\xff\x5c\x007\x033\xffq\x007\x034\xff\ +\x5c\x007\x036\xffq\x007\x038\xffq\x007\x03\ +:\xffq\x007\x03<\xffq\x007\x03@\xffq\x00\ +7\x03B\xffq\x007\x03D\xffq\x007\x03I\xff\ +\xd7\x007\x03J\xffq\x007\x03K\xff\xd7\x007\x03\ +L\xffq\x007\x03M\xff\xd7\x007\x03N\xffq\x00\ +7\x03O\xff\xd7\x007\x03Q\xff\xd7\x007\x03R\xff\ +q\x007\x03S\xff\xd7\x007\x03T\xffq\x007\x03\ +U\xff\xd7\x007\x03V\xffq\x007\x03W\xff\xd7\x00\ +7\x03X\xffq\x007\x03Y\xff\xd7\x007\x03Z\xff\ +q\x007\x03[\xff\xd7\x007\x03\x5c\xffq\x007\x03\ +]\xff\xd7\x007\x03^\xffq\x007\x03_\xff\xd7\x00\ +7\x03`\xffq\x007\x03b\xff\x9a\x007\x03d\xff\ +\x9a\x007\x03f\xff\x9a\x007\x03h\xff\x9a\x007\x03\ +j\xff\x9a\x007\x03l\xff\x9a\x007\x03n\xff\x9a\x00\ +7\x03p\xff\xd7\x007\x03\x8f\x00)\x008\x00\x0f\xff\ +\xd7\x008\x00\x11\xff\xd7\x008\x00$\xff\xec\x008\x00\ +\x82\xff\xec\x008\x00\x83\xff\xec\x008\x00\x84\xff\xec\x00\ +8\x00\x85\xff\xec\x008\x00\x86\xff\xec\x008\x00\x87\xff\ +\xec\x008\x00\xc2\xff\xec\x008\x00\xc4\xff\xec\x008\x00\ +\xc6\xff\xec\x008\x01C\xff\xec\x008\x02\x08\xff\xd7\x00\ +8\x02\x0c\xff\xd7\x008\x02X\xff\xec\x008\x03\x1d\xff\ +\xec\x008\x03\x1f\xff\xec\x008\x03!\xff\xec\x008\x03\ +#\xff\xec\x008\x03%\xff\xec\x008\x03'\xff\xec\x00\ +8\x03)\xff\xec\x008\x03+\xff\xec\x008\x03-\xff\ +\xec\x008\x03/\xff\xec\x008\x031\xff\xec\x008\x03\ +3\xff\xec\x009\x00\x0f\xff\x9a\x009\x00\x11\xff\x9a\x00\ +9\x00\x22\x00)\x009\x00$\xff\xae\x009\x00&\xff\ +\xec\x009\x00*\xff\xec\x009\x002\xff\xec\x009\x00\ +4\xff\xec\x009\x00D\xff\xd7\x009\x00F\xff\xd7\x00\ +9\x00G\xff\xd7\x009\x00H\xff\xd7\x009\x00J\xff\ +\xec\x009\x00P\xff\xec\x009\x00Q\xff\xec\x009\x00\ +R\xff\xd7\x009\x00S\xff\xec\x009\x00T\xff\xd7\x00\ +9\x00U\xff\xec\x009\x00V\xff\xec\x009\x00X\xff\ +\xec\x009\x00\x82\xff\xae\x009\x00\x83\xff\xae\x009\x00\ +\x84\xff\xae\x009\x00\x85\xff\xae\x009\x00\x86\xff\xae\x00\ +9\x00\x87\xff\xae\x009\x00\x89\xff\xec\x009\x00\x94\xff\ +\xec\x009\x00\x95\xff\xec\x009\x00\x96\xff\xec\x009\x00\ +\x97\xff\xec\x009\x00\x98\xff\xec\x009\x00\x9a\xff\xec\x00\ +9\x00\xa2\xff\xd7\x009\x00\xa3\xff\xd7\x009\x00\xa4\xff\ +\xd7\x009\x00\xa5\xff\xd7\x009\x00\xa6\xff\xd7\x009\x00\ +\xa7\xff\xd7\x009\x00\xa8\xff\xd7\x009\x00\xa9\xff\xd7\x00\ +9\x00\xaa\xff\xd7\x009\x00\xab\xff\xd7\x009\x00\xac\xff\ +\xd7\x009\x00\xad\xff\xd7\x009\x00\xb4\xff\xd7\x009\x00\ +\xb5\xff\xd7\x009\x00\xb6\xff\xd7\x009\x00\xb7\xff\xd7\x00\ +9\x00\xb8\xff\xd7\x009\x00\xba\xff\xd7\x009\x00\xbb\xff\ +\xec\x009\x00\xbc\xff\xec\x009\x00\xbd\xff\xec\x009\x00\ +\xbe\xff\xec\x009\x00\xc2\xff\xae\x009\x00\xc3\xff\xd7\x00\ +9\x00\xc4\xff\xae\x009\x00\xc5\xff\xd7\x009\x00\xc6\xff\ +\xae\x009\x00\xc7\xff\xd7\x009\x00\xc8\xff\xec\x009\x00\ +\xc9\xff\xd7\x009\x00\xca\xff\xec\x009\x00\xcb\xff\xd7\x00\ +9\x00\xcc\xff\xec\x009\x00\xcd\xff\xd7\x009\x00\xce\xff\ +\xec\x009\x00\xcf\xff\xd7\x009\x00\xd1\xff\xd7\x009\x00\ +\xd3\xff\xd7\x009\x00\xd5\xff\xd7\x009\x00\xd7\xff\xd7\x00\ +9\x00\xd9\xff\xd7\x009\x00\xdb\xff\xd7\x009\x00\xdd\xff\ +\xd7\x009\x00\xde\xff\xec\x009\x00\xdf\xff\xec\x009\x00\ +\xe0\xff\xec\x009\x00\xe1\xff\xec\x009\x00\xe2\xff\xec\x00\ +9\x00\xe3\xff\xec\x009\x00\xe4\xff\xec\x009\x00\xe5\xff\ +\xec\x009\x00\xfa\xff\xec\x009\x01\x06\xff\xec\x009\x01\ +\x08\xff\xec\x009\x01\x0d\xff\xec\x009\x01\x0e\xff\xec\x00\ +9\x01\x0f\xff\xd7\x009\x01\x10\xff\xec\x009\x01\x11\xff\ +\xd7\x009\x01\x12\xff\xec\x009\x01\x13\xff\xd7\x009\x01\ +\x14\xff\xec\x009\x01\x15\xff\xd7\x009\x01\x17\xff\xec\x00\ +9\x01\x19\xff\xec\x009\x01\x1d\xff\xec\x009\x01!\xff\ +\xec\x009\x01+\xff\xec\x009\x01-\xff\xec\x009\x01\ +/\xff\xec\x009\x011\xff\xec\x009\x013\xff\xec\x00\ +9\x015\xff\xec\x009\x01C\xff\xae\x009\x01D\xff\ +\xd7\x009\x01F\xff\xd7\x009\x01G\xff\xec\x009\x01\ +H\xff\xd7\x009\x01J\xff\xec\x009\x02\x08\xff\x9a\x00\ +9\x02\x0c\xff\x9a\x009\x02W\xff\xec\x009\x02X\xff\ +\xae\x009\x02Y\xff\xd7\x009\x02_\xff\xec\x009\x02\ +`\xff\xd7\x009\x02b\xff\xec\x009\x03\x1d\xff\xae\x00\ +9\x03\x1e\xff\xd7\x009\x03\x1f\xff\xae\x009\x03 \xff\ +\xd7\x009\x03!\xff\xae\x009\x03\x22\xff\xd7\x009\x03\ +#\xff\xae\x009\x03%\xff\xae\x009\x03&\xff\xd7\x00\ +9\x03'\xff\xae\x009\x03(\xff\xd7\x009\x03)\xff\ +\xae\x009\x03*\xff\xd7\x009\x03+\xff\xae\x009\x03\ +,\xff\xd7\x009\x03-\xff\xae\x009\x03.\xff\xd7\x00\ +9\x03/\xff\xae\x009\x030\xff\xd7\x009\x031\xff\ +\xae\x009\x032\xff\xd7\x009\x033\xff\xae\x009\x03\ +4\xff\xd7\x009\x036\xff\xd7\x009\x038\xff\xd7\x00\ +9\x03:\xff\xd7\x009\x03<\xff\xd7\x009\x03@\xff\ +\xd7\x009\x03B\xff\xd7\x009\x03D\xff\xd7\x009\x03\ +I\xff\xec\x009\x03J\xff\xd7\x009\x03K\xff\xec\x00\ +9\x03L\xff\xd7\x009\x03M\xff\xec\x009\x03N\xff\ +\xd7\x009\x03O\xff\xec\x009\x03Q\xff\xec\x009\x03\ +R\xff\xd7\x009\x03S\xff\xec\x009\x03T\xff\xd7\x00\ +9\x03U\xff\xec\x009\x03V\xff\xd7\x009\x03W\xff\ +\xec\x009\x03X\xff\xd7\x009\x03Y\xff\xec\x009\x03\ +Z\xff\xd7\x009\x03[\xff\xec\x009\x03\x5c\xff\xd7\x00\ +9\x03]\xff\xec\x009\x03^\xff\xd7\x009\x03_\xff\ +\xec\x009\x03`\xff\xd7\x009\x03b\xff\xec\x009\x03\ +d\xff\xec\x009\x03f\xff\xec\x009\x03h\xff\xec\x00\ +9\x03j\xff\xec\x009\x03l\xff\xec\x009\x03n\xff\ +\xec\x00:\x00\x0f\xff\x9a\x00:\x00\x11\xff\x9a\x00:\x00\ +\x22\x00)\x00:\x00$\xff\xae\x00:\x00&\xff\xec\x00\ +:\x00*\xff\xec\x00:\x002\xff\xec\x00:\x004\xff\ +\xec\x00:\x00D\xff\xd7\x00:\x00F\xff\xd7\x00:\x00\ +G\xff\xd7\x00:\x00H\xff\xd7\x00:\x00J\xff\xec\x00\ +:\x00P\xff\xec\x00:\x00Q\xff\xec\x00:\x00R\xff\ +\xd7\x00:\x00S\xff\xec\x00:\x00T\xff\xd7\x00:\x00\ +U\xff\xec\x00:\x00V\xff\xec\x00:\x00X\xff\xec\x00\ +:\x00\x82\xff\xae\x00:\x00\x83\xff\xae\x00:\x00\x84\xff\ +\xae\x00:\x00\x85\xff\xae\x00:\x00\x86\xff\xae\x00:\x00\ +\x87\xff\xae\x00:\x00\x89\xff\xec\x00:\x00\x94\xff\xec\x00\ +:\x00\x95\xff\xec\x00:\x00\x96\xff\xec\x00:\x00\x97\xff\ +\xec\x00:\x00\x98\xff\xec\x00:\x00\x9a\xff\xec\x00:\x00\ +\xa2\xff\xd7\x00:\x00\xa3\xff\xd7\x00:\x00\xa4\xff\xd7\x00\ +:\x00\xa5\xff\xd7\x00:\x00\xa6\xff\xd7\x00:\x00\xa7\xff\ +\xd7\x00:\x00\xa8\xff\xd7\x00:\x00\xa9\xff\xd7\x00:\x00\ +\xaa\xff\xd7\x00:\x00\xab\xff\xd7\x00:\x00\xac\xff\xd7\x00\ +:\x00\xad\xff\xd7\x00:\x00\xb4\xff\xd7\x00:\x00\xb5\xff\ +\xd7\x00:\x00\xb6\xff\xd7\x00:\x00\xb7\xff\xd7\x00:\x00\ +\xb8\xff\xd7\x00:\x00\xba\xff\xd7\x00:\x00\xbb\xff\xec\x00\ +:\x00\xbc\xff\xec\x00:\x00\xbd\xff\xec\x00:\x00\xbe\xff\ +\xec\x00:\x00\xc2\xff\xae\x00:\x00\xc3\xff\xd7\x00:\x00\ +\xc4\xff\xae\x00:\x00\xc5\xff\xd7\x00:\x00\xc6\xff\xae\x00\ +:\x00\xc7\xff\xd7\x00:\x00\xc8\xff\xec\x00:\x00\xc9\xff\ +\xd7\x00:\x00\xca\xff\xec\x00:\x00\xcb\xff\xd7\x00:\x00\ +\xcc\xff\xec\x00:\x00\xcd\xff\xd7\x00:\x00\xce\xff\xec\x00\ +:\x00\xcf\xff\xd7\x00:\x00\xd1\xff\xd7\x00:\x00\xd3\xff\ +\xd7\x00:\x00\xd5\xff\xd7\x00:\x00\xd7\xff\xd7\x00:\x00\ +\xd9\xff\xd7\x00:\x00\xdb\xff\xd7\x00:\x00\xdd\xff\xd7\x00\ +:\x00\xde\xff\xec\x00:\x00\xdf\xff\xec\x00:\x00\xe0\xff\ +\xec\x00:\x00\xe1\xff\xec\x00:\x00\xe2\xff\xec\x00:\x00\ +\xe3\xff\xec\x00:\x00\xe4\xff\xec\x00:\x00\xe5\xff\xec\x00\ +:\x00\xfa\xff\xec\x00:\x01\x06\xff\xec\x00:\x01\x08\xff\ +\xec\x00:\x01\x0d\xff\xec\x00:\x01\x0e\xff\xec\x00:\x01\ +\x0f\xff\xd7\x00:\x01\x10\xff\xec\x00:\x01\x11\xff\xd7\x00\ +:\x01\x12\xff\xec\x00:\x01\x13\xff\xd7\x00:\x01\x14\xff\ +\xec\x00:\x01\x15\xff\xd7\x00:\x01\x17\xff\xec\x00:\x01\ +\x19\xff\xec\x00:\x01\x1d\xff\xec\x00:\x01!\xff\xec\x00\ +:\x01+\xff\xec\x00:\x01-\xff\xec\x00:\x01/\xff\ +\xec\x00:\x011\xff\xec\x00:\x013\xff\xec\x00:\x01\ +5\xff\xec\x00:\x01C\xff\xae\x00:\x01D\xff\xd7\x00\ +:\x01F\xff\xd7\x00:\x01G\xff\xec\x00:\x01H\xff\ +\xd7\x00:\x01J\xff\xec\x00:\x02\x08\xff\x9a\x00:\x02\ +\x0c\xff\x9a\x00:\x02W\xff\xec\x00:\x02X\xff\xae\x00\ +:\x02Y\xff\xd7\x00:\x02_\xff\xec\x00:\x02`\xff\ +\xd7\x00:\x02b\xff\xec\x00:\x03\x1d\xff\xae\x00:\x03\ +\x1e\xff\xd7\x00:\x03\x1f\xff\xae\x00:\x03 \xff\xd7\x00\ +:\x03!\xff\xae\x00:\x03\x22\xff\xd7\x00:\x03#\xff\ +\xae\x00:\x03%\xff\xae\x00:\x03&\xff\xd7\x00:\x03\ +'\xff\xae\x00:\x03(\xff\xd7\x00:\x03)\xff\xae\x00\ +:\x03*\xff\xd7\x00:\x03+\xff\xae\x00:\x03,\xff\ +\xd7\x00:\x03-\xff\xae\x00:\x03.\xff\xd7\x00:\x03\ +/\xff\xae\x00:\x030\xff\xd7\x00:\x031\xff\xae\x00\ +:\x032\xff\xd7\x00:\x033\xff\xae\x00:\x034\xff\ +\xd7\x00:\x036\xff\xd7\x00:\x038\xff\xd7\x00:\x03\ +:\xff\xd7\x00:\x03<\xff\xd7\x00:\x03@\xff\xd7\x00\ +:\x03B\xff\xd7\x00:\x03D\xff\xd7\x00:\x03I\xff\ +\xec\x00:\x03J\xff\xd7\x00:\x03K\xff\xec\x00:\x03\ +L\xff\xd7\x00:\x03M\xff\xec\x00:\x03N\xff\xd7\x00\ +:\x03O\xff\xec\x00:\x03Q\xff\xec\x00:\x03R\xff\ +\xd7\x00:\x03S\xff\xec\x00:\x03T\xff\xd7\x00:\x03\ +U\xff\xec\x00:\x03V\xff\xd7\x00:\x03W\xff\xec\x00\ +:\x03X\xff\xd7\x00:\x03Y\xff\xec\x00:\x03Z\xff\ +\xd7\x00:\x03[\xff\xec\x00:\x03\x5c\xff\xd7\x00:\x03\ +]\xff\xec\x00:\x03^\xff\xd7\x00:\x03_\xff\xec\x00\ +:\x03`\xff\xd7\x00:\x03b\xff\xec\x00:\x03d\xff\ +\xec\x00:\x03f\xff\xec\x00:\x03h\xff\xec\x00:\x03\ +j\xff\xec\x00:\x03l\xff\xec\x00:\x03n\xff\xec\x00\ +;\x00&\xff\xd7\x00;\x00*\xff\xd7\x00;\x002\xff\ +\xd7\x00;\x004\xff\xd7\x00;\x00\x89\xff\xd7\x00;\x00\ +\x94\xff\xd7\x00;\x00\x95\xff\xd7\x00;\x00\x96\xff\xd7\x00\ +;\x00\x97\xff\xd7\x00;\x00\x98\xff\xd7\x00;\x00\x9a\xff\ +\xd7\x00;\x00\xc8\xff\xd7\x00;\x00\xca\xff\xd7\x00;\x00\ +\xcc\xff\xd7\x00;\x00\xce\xff\xd7\x00;\x00\xde\xff\xd7\x00\ +;\x00\xe0\xff\xd7\x00;\x00\xe2\xff\xd7\x00;\x00\xe4\xff\ +\xd7\x00;\x01\x0e\xff\xd7\x00;\x01\x10\xff\xd7\x00;\x01\ +\x12\xff\xd7\x00;\x01\x14\xff\xd7\x00;\x01G\xff\xd7\x00\ +;\x02_\xff\xd7\x00;\x03I\xff\xd7\x00;\x03K\xff\ +\xd7\x00;\x03M\xff\xd7\x00;\x03O\xff\xd7\x00;\x03\ +Q\xff\xd7\x00;\x03S\xff\xd7\x00;\x03U\xff\xd7\x00\ +;\x03W\xff\xd7\x00;\x03Y\xff\xd7\x00;\x03[\xff\ +\xd7\x00;\x03]\xff\xd7\x00;\x03_\xff\xd7\x00<\x00\ +\x0f\xff\x85\x00<\x00\x11\xff\x85\x00<\x00\x22\x00)\x00\ +<\x00$\xff\x85\x00<\x00&\xff\xd7\x00<\x00*\xff\ +\xd7\x00<\x002\xff\xd7\x00<\x004\xff\xd7\x00<\x00\ +D\xff\x9a\x00<\x00F\xff\x9a\x00<\x00G\xff\x9a\x00\ +<\x00H\xff\x9a\x00<\x00J\xff\xd7\x00<\x00P\xff\ +\xc3\x00<\x00Q\xff\xc3\x00<\x00R\xff\x9a\x00<\x00\ +S\xff\xc3\x00<\x00T\xff\x9a\x00<\x00U\xff\xc3\x00\ +<\x00V\xff\xae\x00<\x00X\xff\xc3\x00<\x00]\xff\ +\xd7\x00<\x00\x82\xff\x85\x00<\x00\x83\xff\x85\x00<\x00\ +\x84\xff\x85\x00<\x00\x85\xff\x85\x00<\x00\x86\xff\x85\x00\ +<\x00\x87\xff\x85\x00<\x00\x89\xff\xd7\x00<\x00\x94\xff\ +\xd7\x00<\x00\x95\xff\xd7\x00<\x00\x96\xff\xd7\x00<\x00\ +\x97\xff\xd7\x00<\x00\x98\xff\xd7\x00<\x00\x9a\xff\xd7\x00\ +<\x00\xa2\xff\x9a\x00<\x00\xa3\xff\x9a\x00<\x00\xa4\xff\ +\x9a\x00<\x00\xa5\xff\x9a\x00<\x00\xa6\xff\x9a\x00<\x00\ +\xa7\xff\x9a\x00<\x00\xa8\xff\x9a\x00<\x00\xa9\xff\x9a\x00\ +<\x00\xaa\xff\x9a\x00<\x00\xab\xff\x9a\x00<\x00\xac\xff\ +\x9a\x00<\x00\xad\xff\x9a\x00<\x00\xb4\xff\x9a\x00<\x00\ +\xb5\xff\x9a\x00<\x00\xb6\xff\x9a\x00<\x00\xb7\xff\x9a\x00\ +<\x00\xb8\xff\x9a\x00<\x00\xba\xff\x9a\x00<\x00\xbb\xff\ +\xc3\x00<\x00\xbc\xff\xc3\x00<\x00\xbd\xff\xc3\x00<\x00\ +\xbe\xff\xc3\x00<\x00\xc2\xff\x85\x00<\x00\xc3\xff\x9a\x00\ +<\x00\xc4\xff\x85\x00<\x00\xc5\xff\x9a\x00<\x00\xc6\xff\ +\x85\x00<\x00\xc7\xff\x9a\x00<\x00\xc8\xff\xd7\x00<\x00\ +\xc9\xff\x9a\x00<\x00\xca\xff\xd7\x00<\x00\xcb\xff\x9a\x00\ +<\x00\xcc\xff\xd7\x00<\x00\xcd\xff\x9a\x00<\x00\xce\xff\ +\xd7\x00<\x00\xcf\xff\x9a\x00<\x00\xd1\xff\x9a\x00<\x00\ +\xd3\xff\x9a\x00<\x00\xd5\xff\x9a\x00<\x00\xd7\xff\x9a\x00\ +<\x00\xd9\xff\x9a\x00<\x00\xdb\xff\x9a\x00<\x00\xdd\xff\ +\x9a\x00<\x00\xde\xff\xd7\x00<\x00\xdf\xff\xd7\x00<\x00\ +\xe0\xff\xd7\x00<\x00\xe1\xff\xd7\x00<\x00\xe2\xff\xd7\x00\ +<\x00\xe3\xff\xd7\x00<\x00\xe4\xff\xd7\x00<\x00\xe5\xff\ +\xd7\x00<\x00\xfa\xff\xc3\x00<\x01\x06\xff\xc3\x00<\x01\ +\x08\xff\xc3\x00<\x01\x0d\xff\xc3\x00<\x01\x0e\xff\xd7\x00\ +<\x01\x0f\xff\x9a\x00<\x01\x10\xff\xd7\x00<\x01\x11\xff\ +\x9a\x00<\x01\x12\xff\xd7\x00<\x01\x13\xff\x9a\x00<\x01\ +\x14\xff\xd7\x00<\x01\x15\xff\x9a\x00<\x01\x17\xff\xc3\x00\ +<\x01\x19\xff\xc3\x00<\x01\x1d\xff\xae\x00<\x01!\xff\ +\xae\x00<\x01+\xff\xc3\x00<\x01-\xff\xc3\x00<\x01\ +/\xff\xc3\x00<\x011\xff\xc3\x00<\x013\xff\xc3\x00\ +<\x015\xff\xc3\x00<\x01<\xff\xd7\x00<\x01>\xff\ +\xd7\x00<\x01@\xff\xd7\x00<\x01C\xff\x85\x00<\x01\ +D\xff\x9a\x00<\x01F\xff\x9a\x00<\x01G\xff\xd7\x00\ +<\x01H\xff\x9a\x00<\x01J\xff\xae\x00<\x02\x08\xff\ +\x85\x00<\x02\x0c\xff\x85\x00<\x02W\xff\xc3\x00<\x02\ +X\xff\x85\x00<\x02Y\xff\x9a\x00<\x02_\xff\xd7\x00\ +<\x02`\xff\x9a\x00<\x02b\xff\xc3\x00<\x03\x1d\xff\ +\x85\x00<\x03\x1e\xff\x9a\x00<\x03\x1f\xff\x85\x00<\x03\ + \xff\x9a\x00<\x03!\xff\x85\x00<\x03\x22\xff\x9a\x00\ +<\x03#\xff\x85\x00<\x03%\xff\x85\x00<\x03&\xff\ +\x9a\x00<\x03'\xff\x85\x00<\x03(\xff\x9a\x00<\x03\ +)\xff\x85\x00<\x03*\xff\x9a\x00<\x03+\xff\x85\x00\ +<\x03,\xff\x9a\x00<\x03-\xff\x85\x00<\x03.\xff\ +\x9a\x00<\x03/\xff\x85\x00<\x030\xff\x9a\x00<\x03\ +1\xff\x85\x00<\x032\xff\x9a\x00<\x033\xff\x85\x00\ +<\x034\xff\x9a\x00<\x036\xff\x9a\x00<\x038\xff\ +\x9a\x00<\x03:\xff\x9a\x00<\x03<\xff\x9a\x00<\x03\ +@\xff\x9a\x00<\x03B\xff\x9a\x00<\x03D\xff\x9a\x00\ +<\x03I\xff\xd7\x00<\x03J\xff\x9a\x00<\x03K\xff\ +\xd7\x00<\x03L\xff\x9a\x00<\x03M\xff\xd7\x00<\x03\ +N\xff\x9a\x00<\x03O\xff\xd7\x00<\x03Q\xff\xd7\x00\ +<\x03R\xff\x9a\x00<\x03S\xff\xd7\x00<\x03T\xff\ +\x9a\x00<\x03U\xff\xd7\x00<\x03V\xff\x9a\x00<\x03\ +W\xff\xd7\x00<\x03X\xff\x9a\x00<\x03Y\xff\xd7\x00\ +<\x03Z\xff\x9a\x00<\x03[\xff\xd7\x00<\x03\x5c\xff\ +\x9a\x00<\x03]\xff\xd7\x00<\x03^\xff\x9a\x00<\x03\ +_\xff\xd7\x00<\x03`\xff\x9a\x00<\x03b\xff\xc3\x00\ +<\x03d\xff\xc3\x00<\x03f\xff\xc3\x00<\x03h\xff\ +\xc3\x00<\x03j\xff\xc3\x00<\x03l\xff\xc3\x00<\x03\ +n\xff\xc3\x00=\x00&\xff\xec\x00=\x00*\xff\xec\x00\ +=\x002\xff\xec\x00=\x004\xff\xec\x00=\x00\x89\xff\ +\xec\x00=\x00\x94\xff\xec\x00=\x00\x95\xff\xec\x00=\x00\ +\x96\xff\xec\x00=\x00\x97\xff\xec\x00=\x00\x98\xff\xec\x00\ +=\x00\x9a\xff\xec\x00=\x00\xc8\xff\xec\x00=\x00\xca\xff\ +\xec\x00=\x00\xcc\xff\xec\x00=\x00\xce\xff\xec\x00=\x00\ +\xde\xff\xec\x00=\x00\xe0\xff\xec\x00=\x00\xe2\xff\xec\x00\ +=\x00\xe4\xff\xec\x00=\x01\x0e\xff\xec\x00=\x01\x10\xff\ +\xec\x00=\x01\x12\xff\xec\x00=\x01\x14\xff\xec\x00=\x01\ +G\xff\xec\x00=\x02_\xff\xec\x00=\x03I\xff\xec\x00\ +=\x03K\xff\xec\x00=\x03M\xff\xec\x00=\x03O\xff\ +\xec\x00=\x03Q\xff\xec\x00=\x03S\xff\xec\x00=\x03\ +U\xff\xec\x00=\x03W\xff\xec\x00=\x03Y\xff\xec\x00\ +=\x03[\xff\xec\x00=\x03]\xff\xec\x00=\x03_\xff\ +\xec\x00>\x00-\x00\xb8\x00D\x00\x05\xff\xec\x00D\x00\ +\x0a\xff\xec\x00D\x02\x07\xff\xec\x00D\x02\x0b\xff\xec\x00\ +E\x00\x05\xff\xec\x00E\x00\x0a\xff\xec\x00E\x00Y\xff\ +\xd7\x00E\x00Z\xff\xd7\x00E\x00[\xff\xd7\x00E\x00\ +\x5c\xff\xd7\x00E\x00]\xff\xec\x00E\x00\xbf\xff\xd7\x00\ +E\x017\xff\xd7\x00E\x01<\xff\xec\x00E\x01>\xff\ +\xec\x00E\x01@\xff\xec\x00E\x01\xfb\xff\xd7\x00E\x01\ +\xfd\xff\xd7\x00E\x02\x07\xff\xec\x00E\x02\x0b\xff\xec\x00\ +E\x03p\xff\xd7\x00F\x00\x05\x00)\x00F\x00\x0a\x00\ +)\x00F\x02\x07\x00)\x00F\x02\x0b\x00)\x00H\x00\ +\x05\xff\xec\x00H\x00\x0a\xff\xec\x00H\x00Y\xff\xd7\x00\ +H\x00Z\xff\xd7\x00H\x00[\xff\xd7\x00H\x00\x5c\xff\ +\xd7\x00H\x00]\xff\xec\x00H\x00\xbf\xff\xd7\x00H\x01\ +7\xff\xd7\x00H\x01<\xff\xec\x00H\x01>\xff\xec\x00\ +H\x01@\xff\xec\x00H\x01\xfb\xff\xd7\x00H\x01\xfd\xff\ +\xd7\x00H\x02\x07\xff\xec\x00H\x02\x0b\xff\xec\x00H\x03\ +p\xff\xd7\x00I\x00\x05\x00{\x00I\x00\x0a\x00{\x00\ +I\x02\x07\x00{\x00I\x02\x0b\x00{\x00K\x00\x05\xff\ +\xec\x00K\x00\x0a\xff\xec\x00K\x02\x07\xff\xec\x00K\x02\ +\x0b\xff\xec\x00N\x00F\xff\xd7\x00N\x00G\xff\xd7\x00\ +N\x00H\xff\xd7\x00N\x00R\xff\xd7\x00N\x00T\xff\ +\xd7\x00N\x00\xa2\xff\xd7\x00N\x00\xa9\xff\xd7\x00N\x00\ +\xaa\xff\xd7\x00N\x00\xab\xff\xd7\x00N\x00\xac\xff\xd7\x00\ +N\x00\xad\xff\xd7\x00N\x00\xb4\xff\xd7\x00N\x00\xb5\xff\ +\xd7\x00N\x00\xb6\xff\xd7\x00N\x00\xb7\xff\xd7\x00N\x00\ +\xb8\xff\xd7\x00N\x00\xba\xff\xd7\x00N\x00\xc9\xff\xd7\x00\ +N\x00\xcb\xff\xd7\x00N\x00\xcd\xff\xd7\x00N\x00\xcf\xff\ +\xd7\x00N\x00\xd1\xff\xd7\x00N\x00\xd3\xff\xd7\x00N\x00\ +\xd5\xff\xd7\x00N\x00\xd7\xff\xd7\x00N\x00\xd9\xff\xd7\x00\ +N\x00\xdb\xff\xd7\x00N\x00\xdd\xff\xd7\x00N\x01\x0f\xff\ +\xd7\x00N\x01\x11\xff\xd7\x00N\x01\x13\xff\xd7\x00N\x01\ +\x15\xff\xd7\x00N\x01H\xff\xd7\x00N\x02`\xff\xd7\x00\ +N\x036\xff\xd7\x00N\x038\xff\xd7\x00N\x03:\xff\ +\xd7\x00N\x03<\xff\xd7\x00N\x03@\xff\xd7\x00N\x03\ +B\xff\xd7\x00N\x03D\xff\xd7\x00N\x03J\xff\xd7\x00\ +N\x03L\xff\xd7\x00N\x03N\xff\xd7\x00N\x03R\xff\ +\xd7\x00N\x03T\xff\xd7\x00N\x03V\xff\xd7\x00N\x03\ +X\xff\xd7\x00N\x03Z\xff\xd7\x00N\x03\x5c\xff\xd7\x00\ +N\x03^\xff\xd7\x00N\x03`\xff\xd7\x00P\x00\x05\xff\ +\xec\x00P\x00\x0a\xff\xec\x00P\x02\x07\xff\xec\x00P\x02\ +\x0b\xff\xec\x00Q\x00\x05\xff\xec\x00Q\x00\x0a\xff\xec\x00\ +Q\x02\x07\xff\xec\x00Q\x02\x0b\xff\xec\x00R\x00\x05\xff\ +\xec\x00R\x00\x0a\xff\xec\x00R\x00Y\xff\xd7\x00R\x00\ +Z\xff\xd7\x00R\x00[\xff\xd7\x00R\x00\x5c\xff\xd7\x00\ +R\x00]\xff\xec\x00R\x00\xbf\xff\xd7\x00R\x017\xff\ +\xd7\x00R\x01<\xff\xec\x00R\x01>\xff\xec\x00R\x01\ +@\xff\xec\x00R\x01\xfb\xff\xd7\x00R\x01\xfd\xff\xd7\x00\ +R\x02\x07\xff\xec\x00R\x02\x0b\xff\xec\x00R\x03p\xff\ +\xd7\x00S\x00\x05\xff\xec\x00S\x00\x0a\xff\xec\x00S\x00\ +Y\xff\xd7\x00S\x00Z\xff\xd7\x00S\x00[\xff\xd7\x00\ +S\x00\x5c\xff\xd7\x00S\x00]\xff\xec\x00S\x00\xbf\xff\ +\xd7\x00S\x017\xff\xd7\x00S\x01<\xff\xec\x00S\x01\ +>\xff\xec\x00S\x01@\xff\xec\x00S\x01\xfb\xff\xd7\x00\ +S\x01\xfd\xff\xd7\x00S\x02\x07\xff\xec\x00S\x02\x0b\xff\ +\xec\x00S\x03p\xff\xd7\x00U\x00\x05\x00R\x00U\x00\ +\x0a\x00R\x00U\x00D\xff\xd7\x00U\x00F\xff\xd7\x00\ +U\x00G\xff\xd7\x00U\x00H\xff\xd7\x00U\x00J\xff\ +\xec\x00U\x00R\xff\xd7\x00U\x00T\xff\xd7\x00U\x00\ +\xa2\xff\xd7\x00U\x00\xa3\xff\xd7\x00U\x00\xa4\xff\xd7\x00\ +U\x00\xa5\xff\xd7\x00U\x00\xa6\xff\xd7\x00U\x00\xa7\xff\ +\xd7\x00U\x00\xa8\xff\xd7\x00U\x00\xa9\xff\xd7\x00U\x00\ +\xaa\xff\xd7\x00U\x00\xab\xff\xd7\x00U\x00\xac\xff\xd7\x00\ +U\x00\xad\xff\xd7\x00U\x00\xb4\xff\xd7\x00U\x00\xb5\xff\ +\xd7\x00U\x00\xb6\xff\xd7\x00U\x00\xb7\xff\xd7\x00U\x00\ +\xb8\xff\xd7\x00U\x00\xba\xff\xd7\x00U\x00\xc3\xff\xd7\x00\ +U\x00\xc5\xff\xd7\x00U\x00\xc7\xff\xd7\x00U\x00\xc9\xff\ +\xd7\x00U\x00\xcb\xff\xd7\x00U\x00\xcd\xff\xd7\x00U\x00\ +\xcf\xff\xd7\x00U\x00\xd1\xff\xd7\x00U\x00\xd3\xff\xd7\x00\ +U\x00\xd5\xff\xd7\x00U\x00\xd7\xff\xd7\x00U\x00\xd9\xff\ +\xd7\x00U\x00\xdb\xff\xd7\x00U\x00\xdd\xff\xd7\x00U\x00\ +\xdf\xff\xec\x00U\x00\xe1\xff\xec\x00U\x00\xe3\xff\xec\x00\ +U\x00\xe5\xff\xec\x00U\x01\x0f\xff\xd7\x00U\x01\x11\xff\ +\xd7\x00U\x01\x13\xff\xd7\x00U\x01\x15\xff\xd7\x00U\x01\ +D\xff\xd7\x00U\x01F\xff\xd7\x00U\x01H\xff\xd7\x00\ +U\x02\x07\x00R\x00U\x02\x0b\x00R\x00U\x02Y\xff\ +\xd7\x00U\x02`\xff\xd7\x00U\x03\x1e\xff\xd7\x00U\x03\ + \xff\xd7\x00U\x03\x22\xff\xd7\x00U\x03&\xff\xd7\x00\ +U\x03(\xff\xd7\x00U\x03*\xff\xd7\x00U\x03,\xff\ +\xd7\x00U\x03.\xff\xd7\x00U\x030\xff\xd7\x00U\x03\ +2\xff\xd7\x00U\x034\xff\xd7\x00U\x036\xff\xd7\x00\ +U\x038\xff\xd7\x00U\x03:\xff\xd7\x00U\x03<\xff\ +\xd7\x00U\x03@\xff\xd7\x00U\x03B\xff\xd7\x00U\x03\ +D\xff\xd7\x00U\x03J\xff\xd7\x00U\x03L\xff\xd7\x00\ +U\x03N\xff\xd7\x00U\x03R\xff\xd7\x00U\x03T\xff\ +\xd7\x00U\x03V\xff\xd7\x00U\x03X\xff\xd7\x00U\x03\ +Z\xff\xd7\x00U\x03\x5c\xff\xd7\x00U\x03^\xff\xd7\x00\ +U\x03`\xff\xd7\x00W\x00\x05\x00)\x00W\x00\x0a\x00\ +)\x00W\x02\x07\x00)\x00W\x02\x0b\x00)\x00Y\x00\ +\x05\x00R\x00Y\x00\x0a\x00R\x00Y\x00\x0f\xff\xae\x00\ +Y\x00\x11\xff\xae\x00Y\x00\x22\x00)\x00Y\x02\x07\x00\ +R\x00Y\x02\x08\xff\xae\x00Y\x02\x0b\x00R\x00Y\x02\ +\x0c\xff\xae\x00Z\x00\x05\x00R\x00Z\x00\x0a\x00R\x00\ +Z\x00\x0f\xff\xae\x00Z\x00\x11\xff\xae\x00Z\x00\x22\x00\ +)\x00Z\x02\x07\x00R\x00Z\x02\x08\xff\xae\x00Z\x02\ +\x0b\x00R\x00Z\x02\x0c\xff\xae\x00[\x00F\xff\xd7\x00\ +[\x00G\xff\xd7\x00[\x00H\xff\xd7\x00[\x00R\xff\ +\xd7\x00[\x00T\xff\xd7\x00[\x00\xa2\xff\xd7\x00[\x00\ +\xa9\xff\xd7\x00[\x00\xaa\xff\xd7\x00[\x00\xab\xff\xd7\x00\ +[\x00\xac\xff\xd7\x00[\x00\xad\xff\xd7\x00[\x00\xb4\xff\ +\xd7\x00[\x00\xb5\xff\xd7\x00[\x00\xb6\xff\xd7\x00[\x00\ +\xb7\xff\xd7\x00[\x00\xb8\xff\xd7\x00[\x00\xba\xff\xd7\x00\ +[\x00\xc9\xff\xd7\x00[\x00\xcb\xff\xd7\x00[\x00\xcd\xff\ +\xd7\x00[\x00\xcf\xff\xd7\x00[\x00\xd1\xff\xd7\x00[\x00\ +\xd3\xff\xd7\x00[\x00\xd5\xff\xd7\x00[\x00\xd7\xff\xd7\x00\ +[\x00\xd9\xff\xd7\x00[\x00\xdb\xff\xd7\x00[\x00\xdd\xff\ +\xd7\x00[\x01\x0f\xff\xd7\x00[\x01\x11\xff\xd7\x00[\x01\ +\x13\xff\xd7\x00[\x01\x15\xff\xd7\x00[\x01H\xff\xd7\x00\ +[\x02`\xff\xd7\x00[\x036\xff\xd7\x00[\x038\xff\ +\xd7\x00[\x03:\xff\xd7\x00[\x03<\xff\xd7\x00[\x03\ +@\xff\xd7\x00[\x03B\xff\xd7\x00[\x03D\xff\xd7\x00\ +[\x03J\xff\xd7\x00[\x03L\xff\xd7\x00[\x03N\xff\ +\xd7\x00[\x03R\xff\xd7\x00[\x03T\xff\xd7\x00[\x03\ +V\xff\xd7\x00[\x03X\xff\xd7\x00[\x03Z\xff\xd7\x00\ +[\x03\x5c\xff\xd7\x00[\x03^\xff\xd7\x00[\x03`\xff\ +\xd7\x00\x5c\x00\x05\x00R\x00\x5c\x00\x0a\x00R\x00\x5c\x00\ +\x0f\xff\xae\x00\x5c\x00\x11\xff\xae\x00\x5c\x00\x22\x00)\x00\ +\x5c\x02\x07\x00R\x00\x5c\x02\x08\xff\xae\x00\x5c\x02\x0b\x00\ +R\x00\x5c\x02\x0c\xff\xae\x00^\x00-\x00\xb8\x00\x82\x00\ +\x05\xffq\x00\x82\x00\x0a\xffq\x00\x82\x00&\xff\xd7\x00\ +\x82\x00*\xff\xd7\x00\x82\x00-\x01\x0a\x00\x82\x002\xff\ +\xd7\x00\x82\x004\xff\xd7\x00\x82\x007\xffq\x00\x82\x00\ +9\xff\xae\x00\x82\x00:\xff\xae\x00\x82\x00<\xff\x85\x00\ +\x82\x00\x89\xff\xd7\x00\x82\x00\x94\xff\xd7\x00\x82\x00\x95\xff\ +\xd7\x00\x82\x00\x96\xff\xd7\x00\x82\x00\x97\xff\xd7\x00\x82\x00\ +\x98\xff\xd7\x00\x82\x00\x9a\xff\xd7\x00\x82\x00\x9f\xff\x85\x00\ +\x82\x00\xc8\xff\xd7\x00\x82\x00\xca\xff\xd7\x00\x82\x00\xcc\xff\ +\xd7\x00\x82\x00\xce\xff\xd7\x00\x82\x00\xde\xff\xd7\x00\x82\x00\ +\xe0\xff\xd7\x00\x82\x00\xe2\xff\xd7\x00\x82\x00\xe4\xff\xd7\x00\ +\x82\x01\x0e\xff\xd7\x00\x82\x01\x10\xff\xd7\x00\x82\x01\x12\xff\ +\xd7\x00\x82\x01\x14\xff\xd7\x00\x82\x01$\xffq\x00\x82\x01\ +&\xffq\x00\x82\x016\xff\xae\x00\x82\x018\xff\x85\x00\ +\x82\x01:\xff\x85\x00\x82\x01G\xff\xd7\x00\x82\x01\xfa\xff\ +\xae\x00\x82\x01\xfc\xff\xae\x00\x82\x01\xfe\xff\xae\x00\x82\x02\ +\x00\xff\x85\x00\x82\x02\x07\xffq\x00\x82\x02\x0b\xffq\x00\ +\x82\x02_\xff\xd7\x00\x82\x03I\xff\xd7\x00\x82\x03K\xff\ +\xd7\x00\x82\x03M\xff\xd7\x00\x82\x03O\xff\xd7\x00\x82\x03\ +Q\xff\xd7\x00\x82\x03S\xff\xd7\x00\x82\x03U\xff\xd7\x00\ +\x82\x03W\xff\xd7\x00\x82\x03Y\xff\xd7\x00\x82\x03[\xff\ +\xd7\x00\x82\x03]\xff\xd7\x00\x82\x03_\xff\xd7\x00\x82\x03\ +o\xff\x85\x00\x82\x03q\xff\x85\x00\x82\x03s\xff\x85\x00\ +\x82\x03\x8f\xffq\x00\x83\x00\x05\xffq\x00\x83\x00\x0a\xff\ +q\x00\x83\x00&\xff\xd7\x00\x83\x00*\xff\xd7\x00\x83\x00\ +-\x01\x0a\x00\x83\x002\xff\xd7\x00\x83\x004\xff\xd7\x00\ +\x83\x007\xffq\x00\x83\x009\xff\xae\x00\x83\x00:\xff\ +\xae\x00\x83\x00<\xff\x85\x00\x83\x00\x89\xff\xd7\x00\x83\x00\ +\x94\xff\xd7\x00\x83\x00\x95\xff\xd7\x00\x83\x00\x96\xff\xd7\x00\ +\x83\x00\x97\xff\xd7\x00\x83\x00\x98\xff\xd7\x00\x83\x00\x9a\xff\ +\xd7\x00\x83\x00\x9f\xff\x85\x00\x83\x00\xc8\xff\xd7\x00\x83\x00\ +\xca\xff\xd7\x00\x83\x00\xcc\xff\xd7\x00\x83\x00\xce\xff\xd7\x00\ +\x83\x00\xde\xff\xd7\x00\x83\x00\xe0\xff\xd7\x00\x83\x00\xe2\xff\ +\xd7\x00\x83\x00\xe4\xff\xd7\x00\x83\x01\x0e\xff\xd7\x00\x83\x01\ +\x10\xff\xd7\x00\x83\x01\x12\xff\xd7\x00\x83\x01\x14\xff\xd7\x00\ +\x83\x01$\xffq\x00\x83\x01&\xffq\x00\x83\x016\xff\ +\xae\x00\x83\x018\xff\x85\x00\x83\x01:\xff\x85\x00\x83\x01\ +G\xff\xd7\x00\x83\x01\xfa\xff\xae\x00\x83\x01\xfc\xff\xae\x00\ +\x83\x01\xfe\xff\xae\x00\x83\x02\x00\xff\x85\x00\x83\x02\x07\xff\ +q\x00\x83\x02\x0b\xffq\x00\x83\x02_\xff\xd7\x00\x83\x03\ +I\xff\xd7\x00\x83\x03K\xff\xd7\x00\x83\x03M\xff\xd7\x00\ +\x83\x03O\xff\xd7\x00\x83\x03Q\xff\xd7\x00\x83\x03S\xff\ +\xd7\x00\x83\x03U\xff\xd7\x00\x83\x03W\xff\xd7\x00\x83\x03\ +Y\xff\xd7\x00\x83\x03[\xff\xd7\x00\x83\x03]\xff\xd7\x00\ +\x83\x03_\xff\xd7\x00\x83\x03o\xff\x85\x00\x83\x03q\xff\ +\x85\x00\x83\x03s\xff\x85\x00\x83\x03\x8f\xffq\x00\x84\x00\ +\x05\xffq\x00\x84\x00\x0a\xffq\x00\x84\x00&\xff\xd7\x00\ +\x84\x00*\xff\xd7\x00\x84\x00-\x01\x0a\x00\x84\x002\xff\ +\xd7\x00\x84\x004\xff\xd7\x00\x84\x007\xffq\x00\x84\x00\ +9\xff\xae\x00\x84\x00:\xff\xae\x00\x84\x00<\xff\x85\x00\ +\x84\x00\x89\xff\xd7\x00\x84\x00\x94\xff\xd7\x00\x84\x00\x95\xff\ +\xd7\x00\x84\x00\x96\xff\xd7\x00\x84\x00\x97\xff\xd7\x00\x84\x00\ +\x98\xff\xd7\x00\x84\x00\x9a\xff\xd7\x00\x84\x00\x9f\xff\x85\x00\ +\x84\x00\xc8\xff\xd7\x00\x84\x00\xca\xff\xd7\x00\x84\x00\xcc\xff\ +\xd7\x00\x84\x00\xce\xff\xd7\x00\x84\x00\xde\xff\xd7\x00\x84\x00\ +\xe0\xff\xd7\x00\x84\x00\xe2\xff\xd7\x00\x84\x00\xe4\xff\xd7\x00\ +\x84\x01\x0e\xff\xd7\x00\x84\x01\x10\xff\xd7\x00\x84\x01\x12\xff\ +\xd7\x00\x84\x01\x14\xff\xd7\x00\x84\x01$\xffq\x00\x84\x01\ +&\xffq\x00\x84\x016\xff\xae\x00\x84\x018\xff\x85\x00\ +\x84\x01:\xff\x85\x00\x84\x01G\xff\xd7\x00\x84\x01\xfa\xff\ +\xae\x00\x84\x01\xfc\xff\xae\x00\x84\x01\xfe\xff\xae\x00\x84\x02\ +\x00\xff\x85\x00\x84\x02\x07\xffq\x00\x84\x02\x0b\xffq\x00\ +\x84\x02_\xff\xd7\x00\x84\x03I\xff\xd7\x00\x84\x03K\xff\ +\xd7\x00\x84\x03M\xff\xd7\x00\x84\x03O\xff\xd7\x00\x84\x03\ +Q\xff\xd7\x00\x84\x03S\xff\xd7\x00\x84\x03U\xff\xd7\x00\ +\x84\x03W\xff\xd7\x00\x84\x03Y\xff\xd7\x00\x84\x03[\xff\ +\xd7\x00\x84\x03]\xff\xd7\x00\x84\x03_\xff\xd7\x00\x84\x03\ +o\xff\x85\x00\x84\x03q\xff\x85\x00\x84\x03s\xff\x85\x00\ +\x84\x03\x8f\xffq\x00\x85\x00\x05\xffq\x00\x85\x00\x0a\xff\ +q\x00\x85\x00&\xff\xd7\x00\x85\x00*\xff\xd7\x00\x85\x00\ +-\x01\x0a\x00\x85\x002\xff\xd7\x00\x85\x004\xff\xd7\x00\ +\x85\x007\xffq\x00\x85\x009\xff\xae\x00\x85\x00:\xff\ +\xae\x00\x85\x00<\xff\x85\x00\x85\x00\x89\xff\xd7\x00\x85\x00\ +\x94\xff\xd7\x00\x85\x00\x95\xff\xd7\x00\x85\x00\x96\xff\xd7\x00\ +\x85\x00\x97\xff\xd7\x00\x85\x00\x98\xff\xd7\x00\x85\x00\x9a\xff\ +\xd7\x00\x85\x00\x9f\xff\x85\x00\x85\x00\xc8\xff\xd7\x00\x85\x00\ +\xca\xff\xd7\x00\x85\x00\xcc\xff\xd7\x00\x85\x00\xce\xff\xd7\x00\ +\x85\x00\xde\xff\xd7\x00\x85\x00\xe0\xff\xd7\x00\x85\x00\xe2\xff\ +\xd7\x00\x85\x00\xe4\xff\xd7\x00\x85\x01\x0e\xff\xd7\x00\x85\x01\ +\x10\xff\xd7\x00\x85\x01\x12\xff\xd7\x00\x85\x01\x14\xff\xd7\x00\ +\x85\x01$\xffq\x00\x85\x01&\xffq\x00\x85\x016\xff\ +\xae\x00\x85\x018\xff\x85\x00\x85\x01:\xff\x85\x00\x85\x01\ +G\xff\xd7\x00\x85\x01\xfa\xff\xae\x00\x85\x01\xfc\xff\xae\x00\ +\x85\x01\xfe\xff\xae\x00\x85\x02\x00\xff\x85\x00\x85\x02\x07\xff\ +q\x00\x85\x02\x0b\xffq\x00\x85\x02_\xff\xd7\x00\x85\x03\ +I\xff\xd7\x00\x85\x03K\xff\xd7\x00\x85\x03M\xff\xd7\x00\ +\x85\x03O\xff\xd7\x00\x85\x03Q\xff\xd7\x00\x85\x03S\xff\ +\xd7\x00\x85\x03U\xff\xd7\x00\x85\x03W\xff\xd7\x00\x85\x03\ +Y\xff\xd7\x00\x85\x03[\xff\xd7\x00\x85\x03]\xff\xd7\x00\ +\x85\x03_\xff\xd7\x00\x85\x03o\xff\x85\x00\x85\x03q\xff\ +\x85\x00\x85\x03s\xff\x85\x00\x85\x03\x8f\xffq\x00\x86\x00\ +\x05\xffq\x00\x86\x00\x0a\xffq\x00\x86\x00&\xff\xd7\x00\ +\x86\x00*\xff\xd7\x00\x86\x00-\x01\x0a\x00\x86\x002\xff\ +\xd7\x00\x86\x004\xff\xd7\x00\x86\x007\xffq\x00\x86\x00\ +9\xff\xae\x00\x86\x00:\xff\xae\x00\x86\x00<\xff\x85\x00\ +\x86\x00\x89\xff\xd7\x00\x86\x00\x94\xff\xd7\x00\x86\x00\x95\xff\ +\xd7\x00\x86\x00\x96\xff\xd7\x00\x86\x00\x97\xff\xd7\x00\x86\x00\ +\x98\xff\xd7\x00\x86\x00\x9a\xff\xd7\x00\x86\x00\x9f\xff\x85\x00\ +\x86\x00\xc8\xff\xd7\x00\x86\x00\xca\xff\xd7\x00\x86\x00\xcc\xff\ +\xd7\x00\x86\x00\xce\xff\xd7\x00\x86\x00\xde\xff\xd7\x00\x86\x00\ +\xe0\xff\xd7\x00\x86\x00\xe2\xff\xd7\x00\x86\x00\xe4\xff\xd7\x00\ +\x86\x01\x0e\xff\xd7\x00\x86\x01\x10\xff\xd7\x00\x86\x01\x12\xff\ +\xd7\x00\x86\x01\x14\xff\xd7\x00\x86\x01$\xffq\x00\x86\x01\ +&\xffq\x00\x86\x016\xff\xae\x00\x86\x018\xff\x85\x00\ +\x86\x01:\xff\x85\x00\x86\x01G\xff\xd7\x00\x86\x01\xfa\xff\ +\xae\x00\x86\x01\xfc\xff\xae\x00\x86\x01\xfe\xff\xae\x00\x86\x02\ +\x00\xff\x85\x00\x86\x02\x07\xffq\x00\x86\x02\x0b\xffq\x00\ +\x86\x02_\xff\xd7\x00\x86\x03I\xff\xd7\x00\x86\x03K\xff\ +\xd7\x00\x86\x03M\xff\xd7\x00\x86\x03O\xff\xd7\x00\x86\x03\ +Q\xff\xd7\x00\x86\x03S\xff\xd7\x00\x86\x03U\xff\xd7\x00\ +\x86\x03W\xff\xd7\x00\x86\x03Y\xff\xd7\x00\x86\x03[\xff\ +\xd7\x00\x86\x03]\xff\xd7\x00\x86\x03_\xff\xd7\x00\x86\x03\ +o\xff\x85\x00\x86\x03q\xff\x85\x00\x86\x03s\xff\x85\x00\ +\x86\x03\x8f\xffq\x00\x87\x00\x05\xffq\x00\x87\x00\x0a\xff\ +q\x00\x87\x00&\xff\xd7\x00\x87\x00*\xff\xd7\x00\x87\x00\ +-\x01\x0a\x00\x87\x002\xff\xd7\x00\x87\x004\xff\xd7\x00\ +\x87\x007\xffq\x00\x87\x009\xff\xae\x00\x87\x00:\xff\ +\xae\x00\x87\x00<\xff\x85\x00\x87\x00\x89\xff\xd7\x00\x87\x00\ +\x94\xff\xd7\x00\x87\x00\x95\xff\xd7\x00\x87\x00\x96\xff\xd7\x00\ +\x87\x00\x97\xff\xd7\x00\x87\x00\x98\xff\xd7\x00\x87\x00\x9a\xff\ +\xd7\x00\x87\x00\x9f\xff\x85\x00\x87\x00\xc8\xff\xd7\x00\x87\x00\ +\xca\xff\xd7\x00\x87\x00\xcc\xff\xd7\x00\x87\x00\xce\xff\xd7\x00\ +\x87\x00\xde\xff\xd7\x00\x87\x00\xe0\xff\xd7\x00\x87\x00\xe2\xff\ +\xd7\x00\x87\x00\xe4\xff\xd7\x00\x87\x01\x0e\xff\xd7\x00\x87\x01\ +\x10\xff\xd7\x00\x87\x01\x12\xff\xd7\x00\x87\x01\x14\xff\xd7\x00\ +\x87\x01$\xffq\x00\x87\x01&\xffq\x00\x87\x016\xff\ +\xae\x00\x87\x018\xff\x85\x00\x87\x01:\xff\x85\x00\x87\x01\ +G\xff\xd7\x00\x87\x01\xfa\xff\xae\x00\x87\x01\xfc\xff\xae\x00\ +\x87\x01\xfe\xff\xae\x00\x87\x02\x00\xff\x85\x00\x87\x02\x07\xff\ +q\x00\x87\x02\x0b\xffq\x00\x87\x02_\xff\xd7\x00\x87\x03\ +I\xff\xd7\x00\x87\x03K\xff\xd7\x00\x87\x03M\xff\xd7\x00\ +\x87\x03O\xff\xd7\x00\x87\x03Q\xff\xd7\x00\x87\x03S\xff\ +\xd7\x00\x87\x03U\xff\xd7\x00\x87\x03W\xff\xd7\x00\x87\x03\ +Y\xff\xd7\x00\x87\x03[\xff\xd7\x00\x87\x03]\xff\xd7\x00\ +\x87\x03_\xff\xd7\x00\x87\x03o\xff\x85\x00\x87\x03q\xff\ +\x85\x00\x87\x03s\xff\x85\x00\x87\x03\x8f\xffq\x00\x88\x00\ +-\x00{\x00\x89\x00&\xff\xd7\x00\x89\x00*\xff\xd7\x00\ +\x89\x002\xff\xd7\x00\x89\x004\xff\xd7\x00\x89\x00\x89\xff\ +\xd7\x00\x89\x00\x94\xff\xd7\x00\x89\x00\x95\xff\xd7\x00\x89\x00\ +\x96\xff\xd7\x00\x89\x00\x97\xff\xd7\x00\x89\x00\x98\xff\xd7\x00\ +\x89\x00\x9a\xff\xd7\x00\x89\x00\xc8\xff\xd7\x00\x89\x00\xca\xff\ +\xd7\x00\x89\x00\xcc\xff\xd7\x00\x89\x00\xce\xff\xd7\x00\x89\x00\ +\xde\xff\xd7\x00\x89\x00\xe0\xff\xd7\x00\x89\x00\xe2\xff\xd7\x00\ +\x89\x00\xe4\xff\xd7\x00\x89\x01\x0e\xff\xd7\x00\x89\x01\x10\xff\ +\xd7\x00\x89\x01\x12\xff\xd7\x00\x89\x01\x14\xff\xd7\x00\x89\x01\ +G\xff\xd7\x00\x89\x02_\xff\xd7\x00\x89\x03I\xff\xd7\x00\ +\x89\x03K\xff\xd7\x00\x89\x03M\xff\xd7\x00\x89\x03O\xff\ +\xd7\x00\x89\x03Q\xff\xd7\x00\x89\x03S\xff\xd7\x00\x89\x03\ +U\xff\xd7\x00\x89\x03W\xff\xd7\x00\x89\x03Y\xff\xd7\x00\ +\x89\x03[\xff\xd7\x00\x89\x03]\xff\xd7\x00\x89\x03_\xff\ +\xd7\x00\x8a\x00-\x00{\x00\x8b\x00-\x00{\x00\x8c\x00\ +-\x00{\x00\x8d\x00-\x00{\x00\x92\x00\x0f\xff\xae\x00\ +\x92\x00\x11\xff\xae\x00\x92\x00$\xff\xd7\x00\x92\x007\xff\ +\xc3\x00\x92\x009\xff\xec\x00\x92\x00:\xff\xec\x00\x92\x00\ +;\xff\xd7\x00\x92\x00<\xff\xec\x00\x92\x00=\xff\xec\x00\ +\x92\x00\x82\xff\xd7\x00\x92\x00\x83\xff\xd7\x00\x92\x00\x84\xff\ +\xd7\x00\x92\x00\x85\xff\xd7\x00\x92\x00\x86\xff\xd7\x00\x92\x00\ +\x87\xff\xd7\x00\x92\x00\x9f\xff\xec\x00\x92\x00\xc2\xff\xd7\x00\ +\x92\x00\xc4\xff\xd7\x00\x92\x00\xc6\xff\xd7\x00\x92\x01$\xff\ +\xc3\x00\x92\x01&\xff\xc3\x00\x92\x016\xff\xec\x00\x92\x01\ +8\xff\xec\x00\x92\x01:\xff\xec\x00\x92\x01;\xff\xec\x00\ +\x92\x01=\xff\xec\x00\x92\x01?\xff\xec\x00\x92\x01C\xff\ +\xd7\x00\x92\x01\xa0\xff\xec\x00\x92\x01\xfa\xff\xec\x00\x92\x01\ +\xfc\xff\xec\x00\x92\x01\xfe\xff\xec\x00\x92\x02\x00\xff\xec\x00\ +\x92\x02\x08\xff\xae\x00\x92\x02\x0c\xff\xae\x00\x92\x02X\xff\ +\xd7\x00\x92\x03\x1d\xff\xd7\x00\x92\x03\x1f\xff\xd7\x00\x92\x03\ +!\xff\xd7\x00\x92\x03#\xff\xd7\x00\x92\x03%\xff\xd7\x00\ +\x92\x03'\xff\xd7\x00\x92\x03)\xff\xd7\x00\x92\x03+\xff\ +\xd7\x00\x92\x03-\xff\xd7\x00\x92\x03/\xff\xd7\x00\x92\x03\ +1\xff\xd7\x00\x92\x033\xff\xd7\x00\x92\x03o\xff\xec\x00\ +\x92\x03q\xff\xec\x00\x92\x03s\xff\xec\x00\x92\x03\x8f\xff\ +\xc3\x00\x94\x00\x0f\xff\xae\x00\x94\x00\x11\xff\xae\x00\x94\x00\ +$\xff\xd7\x00\x94\x007\xff\xc3\x00\x94\x009\xff\xec\x00\ +\x94\x00:\xff\xec\x00\x94\x00;\xff\xd7\x00\x94\x00<\xff\ +\xec\x00\x94\x00=\xff\xec\x00\x94\x00\x82\xff\xd7\x00\x94\x00\ +\x83\xff\xd7\x00\x94\x00\x84\xff\xd7\x00\x94\x00\x85\xff\xd7\x00\ +\x94\x00\x86\xff\xd7\x00\x94\x00\x87\xff\xd7\x00\x94\x00\x9f\xff\ +\xec\x00\x94\x00\xc2\xff\xd7\x00\x94\x00\xc4\xff\xd7\x00\x94\x00\ +\xc6\xff\xd7\x00\x94\x01$\xff\xc3\x00\x94\x01&\xff\xc3\x00\ +\x94\x016\xff\xec\x00\x94\x018\xff\xec\x00\x94\x01:\xff\ +\xec\x00\x94\x01;\xff\xec\x00\x94\x01=\xff\xec\x00\x94\x01\ +?\xff\xec\x00\x94\x01C\xff\xd7\x00\x94\x01\xa0\xff\xec\x00\ +\x94\x01\xfa\xff\xec\x00\x94\x01\xfc\xff\xec\x00\x94\x01\xfe\xff\ +\xec\x00\x94\x02\x00\xff\xec\x00\x94\x02\x08\xff\xae\x00\x94\x02\ +\x0c\xff\xae\x00\x94\x02X\xff\xd7\x00\x94\x03\x1d\xff\xd7\x00\ +\x94\x03\x1f\xff\xd7\x00\x94\x03!\xff\xd7\x00\x94\x03#\xff\ +\xd7\x00\x94\x03%\xff\xd7\x00\x94\x03'\xff\xd7\x00\x94\x03\ +)\xff\xd7\x00\x94\x03+\xff\xd7\x00\x94\x03-\xff\xd7\x00\ +\x94\x03/\xff\xd7\x00\x94\x031\xff\xd7\x00\x94\x033\xff\ +\xd7\x00\x94\x03o\xff\xec\x00\x94\x03q\xff\xec\x00\x94\x03\ +s\xff\xec\x00\x94\x03\x8f\xff\xc3\x00\x95\x00\x0f\xff\xae\x00\ +\x95\x00\x11\xff\xae\x00\x95\x00$\xff\xd7\x00\x95\x007\xff\ +\xc3\x00\x95\x009\xff\xec\x00\x95\x00:\xff\xec\x00\x95\x00\ +;\xff\xd7\x00\x95\x00<\xff\xec\x00\x95\x00=\xff\xec\x00\ +\x95\x00\x82\xff\xd7\x00\x95\x00\x83\xff\xd7\x00\x95\x00\x84\xff\ +\xd7\x00\x95\x00\x85\xff\xd7\x00\x95\x00\x86\xff\xd7\x00\x95\x00\ +\x87\xff\xd7\x00\x95\x00\x9f\xff\xec\x00\x95\x00\xc2\xff\xd7\x00\ +\x95\x00\xc4\xff\xd7\x00\x95\x00\xc6\xff\xd7\x00\x95\x01$\xff\ +\xc3\x00\x95\x01&\xff\xc3\x00\x95\x016\xff\xec\x00\x95\x01\ +8\xff\xec\x00\x95\x01:\xff\xec\x00\x95\x01;\xff\xec\x00\ +\x95\x01=\xff\xec\x00\x95\x01?\xff\xec\x00\x95\x01C\xff\ +\xd7\x00\x95\x01\xa0\xff\xec\x00\x95\x01\xfa\xff\xec\x00\x95\x01\ +\xfc\xff\xec\x00\x95\x01\xfe\xff\xec\x00\x95\x02\x00\xff\xec\x00\ +\x95\x02\x08\xff\xae\x00\x95\x02\x0c\xff\xae\x00\x95\x02X\xff\ +\xd7\x00\x95\x03\x1d\xff\xd7\x00\x95\x03\x1f\xff\xd7\x00\x95\x03\ +!\xff\xd7\x00\x95\x03#\xff\xd7\x00\x95\x03%\xff\xd7\x00\ +\x95\x03'\xff\xd7\x00\x95\x03)\xff\xd7\x00\x95\x03+\xff\ +\xd7\x00\x95\x03-\xff\xd7\x00\x95\x03/\xff\xd7\x00\x95\x03\ +1\xff\xd7\x00\x95\x033\xff\xd7\x00\x95\x03o\xff\xec\x00\ +\x95\x03q\xff\xec\x00\x95\x03s\xff\xec\x00\x95\x03\x8f\xff\ +\xc3\x00\x96\x00\x0f\xff\xae\x00\x96\x00\x11\xff\xae\x00\x96\x00\ +$\xff\xd7\x00\x96\x007\xff\xc3\x00\x96\x009\xff\xec\x00\ +\x96\x00:\xff\xec\x00\x96\x00;\xff\xd7\x00\x96\x00<\xff\ +\xec\x00\x96\x00=\xff\xec\x00\x96\x00\x82\xff\xd7\x00\x96\x00\ +\x83\xff\xd7\x00\x96\x00\x84\xff\xd7\x00\x96\x00\x85\xff\xd7\x00\ +\x96\x00\x86\xff\xd7\x00\x96\x00\x87\xff\xd7\x00\x96\x00\x9f\xff\ +\xec\x00\x96\x00\xc2\xff\xd7\x00\x96\x00\xc4\xff\xd7\x00\x96\x00\ +\xc6\xff\xd7\x00\x96\x01$\xff\xc3\x00\x96\x01&\xff\xc3\x00\ +\x96\x016\xff\xec\x00\x96\x018\xff\xec\x00\x96\x01:\xff\ +\xec\x00\x96\x01;\xff\xec\x00\x96\x01=\xff\xec\x00\x96\x01\ +?\xff\xec\x00\x96\x01C\xff\xd7\x00\x96\x01\xa0\xff\xec\x00\ +\x96\x01\xfa\xff\xec\x00\x96\x01\xfc\xff\xec\x00\x96\x01\xfe\xff\ +\xec\x00\x96\x02\x00\xff\xec\x00\x96\x02\x08\xff\xae\x00\x96\x02\ +\x0c\xff\xae\x00\x96\x02X\xff\xd7\x00\x96\x03\x1d\xff\xd7\x00\ +\x96\x03\x1f\xff\xd7\x00\x96\x03!\xff\xd7\x00\x96\x03#\xff\ +\xd7\x00\x96\x03%\xff\xd7\x00\x96\x03'\xff\xd7\x00\x96\x03\ +)\xff\xd7\x00\x96\x03+\xff\xd7\x00\x96\x03-\xff\xd7\x00\ +\x96\x03/\xff\xd7\x00\x96\x031\xff\xd7\x00\x96\x033\xff\ +\xd7\x00\x96\x03o\xff\xec\x00\x96\x03q\xff\xec\x00\x96\x03\ +s\xff\xec\x00\x96\x03\x8f\xff\xc3\x00\x97\x00\x0f\xff\xae\x00\ +\x97\x00\x11\xff\xae\x00\x97\x00$\xff\xd7\x00\x97\x007\xff\ +\xc3\x00\x97\x009\xff\xec\x00\x97\x00:\xff\xec\x00\x97\x00\ +;\xff\xd7\x00\x97\x00<\xff\xec\x00\x97\x00=\xff\xec\x00\ +\x97\x00\x82\xff\xd7\x00\x97\x00\x83\xff\xd7\x00\x97\x00\x84\xff\ +\xd7\x00\x97\x00\x85\xff\xd7\x00\x97\x00\x86\xff\xd7\x00\x97\x00\ +\x87\xff\xd7\x00\x97\x00\x9f\xff\xec\x00\x97\x00\xc2\xff\xd7\x00\ +\x97\x00\xc4\xff\xd7\x00\x97\x00\xc6\xff\xd7\x00\x97\x01$\xff\ +\xc3\x00\x97\x01&\xff\xc3\x00\x97\x016\xff\xec\x00\x97\x01\ +8\xff\xec\x00\x97\x01:\xff\xec\x00\x97\x01;\xff\xec\x00\ +\x97\x01=\xff\xec\x00\x97\x01?\xff\xec\x00\x97\x01C\xff\ +\xd7\x00\x97\x01\xa0\xff\xec\x00\x97\x01\xfa\xff\xec\x00\x97\x01\ +\xfc\xff\xec\x00\x97\x01\xfe\xff\xec\x00\x97\x02\x00\xff\xec\x00\ +\x97\x02\x08\xff\xae\x00\x97\x02\x0c\xff\xae\x00\x97\x02X\xff\ +\xd7\x00\x97\x03\x1d\xff\xd7\x00\x97\x03\x1f\xff\xd7\x00\x97\x03\ +!\xff\xd7\x00\x97\x03#\xff\xd7\x00\x97\x03%\xff\xd7\x00\ +\x97\x03'\xff\xd7\x00\x97\x03)\xff\xd7\x00\x97\x03+\xff\ +\xd7\x00\x97\x03-\xff\xd7\x00\x97\x03/\xff\xd7\x00\x97\x03\ +1\xff\xd7\x00\x97\x033\xff\xd7\x00\x97\x03o\xff\xec\x00\ +\x97\x03q\xff\xec\x00\x97\x03s\xff\xec\x00\x97\x03\x8f\xff\ +\xc3\x00\x98\x00\x0f\xff\xae\x00\x98\x00\x11\xff\xae\x00\x98\x00\ +$\xff\xd7\x00\x98\x007\xff\xc3\x00\x98\x009\xff\xec\x00\ +\x98\x00:\xff\xec\x00\x98\x00;\xff\xd7\x00\x98\x00<\xff\ +\xec\x00\x98\x00=\xff\xec\x00\x98\x00\x82\xff\xd7\x00\x98\x00\ +\x83\xff\xd7\x00\x98\x00\x84\xff\xd7\x00\x98\x00\x85\xff\xd7\x00\ +\x98\x00\x86\xff\xd7\x00\x98\x00\x87\xff\xd7\x00\x98\x00\x9f\xff\ +\xec\x00\x98\x00\xc2\xff\xd7\x00\x98\x00\xc4\xff\xd7\x00\x98\x00\ +\xc6\xff\xd7\x00\x98\x01$\xff\xc3\x00\x98\x01&\xff\xc3\x00\ +\x98\x016\xff\xec\x00\x98\x018\xff\xec\x00\x98\x01:\xff\ +\xec\x00\x98\x01;\xff\xec\x00\x98\x01=\xff\xec\x00\x98\x01\ +?\xff\xec\x00\x98\x01C\xff\xd7\x00\x98\x01\xa0\xff\xec\x00\ +\x98\x01\xfa\xff\xec\x00\x98\x01\xfc\xff\xec\x00\x98\x01\xfe\xff\ +\xec\x00\x98\x02\x00\xff\xec\x00\x98\x02\x08\xff\xae\x00\x98\x02\ +\x0c\xff\xae\x00\x98\x02X\xff\xd7\x00\x98\x03\x1d\xff\xd7\x00\ +\x98\x03\x1f\xff\xd7\x00\x98\x03!\xff\xd7\x00\x98\x03#\xff\ +\xd7\x00\x98\x03%\xff\xd7\x00\x98\x03'\xff\xd7\x00\x98\x03\ +)\xff\xd7\x00\x98\x03+\xff\xd7\x00\x98\x03-\xff\xd7\x00\ +\x98\x03/\xff\xd7\x00\x98\x031\xff\xd7\x00\x98\x033\xff\ +\xd7\x00\x98\x03o\xff\xec\x00\x98\x03q\xff\xec\x00\x98\x03\ +s\xff\xec\x00\x98\x03\x8f\xff\xc3\x00\x9a\x00\x0f\xff\xae\x00\ +\x9a\x00\x11\xff\xae\x00\x9a\x00$\xff\xd7\x00\x9a\x007\xff\ +\xc3\x00\x9a\x009\xff\xec\x00\x9a\x00:\xff\xec\x00\x9a\x00\ +;\xff\xd7\x00\x9a\x00<\xff\xec\x00\x9a\x00=\xff\xec\x00\ +\x9a\x00\x82\xff\xd7\x00\x9a\x00\x83\xff\xd7\x00\x9a\x00\x84\xff\ +\xd7\x00\x9a\x00\x85\xff\xd7\x00\x9a\x00\x86\xff\xd7\x00\x9a\x00\ +\x87\xff\xd7\x00\x9a\x00\x9f\xff\xec\x00\x9a\x00\xc2\xff\xd7\x00\ +\x9a\x00\xc4\xff\xd7\x00\x9a\x00\xc6\xff\xd7\x00\x9a\x01$\xff\ +\xc3\x00\x9a\x01&\xff\xc3\x00\x9a\x016\xff\xec\x00\x9a\x01\ +8\xff\xec\x00\x9a\x01:\xff\xec\x00\x9a\x01;\xff\xec\x00\ +\x9a\x01=\xff\xec\x00\x9a\x01?\xff\xec\x00\x9a\x01C\xff\ +\xd7\x00\x9a\x01\xa0\xff\xec\x00\x9a\x01\xfa\xff\xec\x00\x9a\x01\ +\xfc\xff\xec\x00\x9a\x01\xfe\xff\xec\x00\x9a\x02\x00\xff\xec\x00\ +\x9a\x02\x08\xff\xae\x00\x9a\x02\x0c\xff\xae\x00\x9a\x02X\xff\ +\xd7\x00\x9a\x03\x1d\xff\xd7\x00\x9a\x03\x1f\xff\xd7\x00\x9a\x03\ +!\xff\xd7\x00\x9a\x03#\xff\xd7\x00\x9a\x03%\xff\xd7\x00\ +\x9a\x03'\xff\xd7\x00\x9a\x03)\xff\xd7\x00\x9a\x03+\xff\ +\xd7\x00\x9a\x03-\xff\xd7\x00\x9a\x03/\xff\xd7\x00\x9a\x03\ +1\xff\xd7\x00\x9a\x033\xff\xd7\x00\x9a\x03o\xff\xec\x00\ +\x9a\x03q\xff\xec\x00\x9a\x03s\xff\xec\x00\x9a\x03\x8f\xff\ +\xc3\x00\x9b\x00\x0f\xff\xd7\x00\x9b\x00\x11\xff\xd7\x00\x9b\x00\ +$\xff\xec\x00\x9b\x00\x82\xff\xec\x00\x9b\x00\x83\xff\xec\x00\ +\x9b\x00\x84\xff\xec\x00\x9b\x00\x85\xff\xec\x00\x9b\x00\x86\xff\ +\xec\x00\x9b\x00\x87\xff\xec\x00\x9b\x00\xc2\xff\xec\x00\x9b\x00\ +\xc4\xff\xec\x00\x9b\x00\xc6\xff\xec\x00\x9b\x01C\xff\xec\x00\ +\x9b\x02\x08\xff\xd7\x00\x9b\x02\x0c\xff\xd7\x00\x9b\x02X\xff\ +\xec\x00\x9b\x03\x1d\xff\xec\x00\x9b\x03\x1f\xff\xec\x00\x9b\x03\ +!\xff\xec\x00\x9b\x03#\xff\xec\x00\x9b\x03%\xff\xec\x00\ +\x9b\x03'\xff\xec\x00\x9b\x03)\xff\xec\x00\x9b\x03+\xff\ +\xec\x00\x9b\x03-\xff\xec\x00\x9b\x03/\xff\xec\x00\x9b\x03\ +1\xff\xec\x00\x9b\x033\xff\xec\x00\x9c\x00\x0f\xff\xd7\x00\ +\x9c\x00\x11\xff\xd7\x00\x9c\x00$\xff\xec\x00\x9c\x00\x82\xff\ +\xec\x00\x9c\x00\x83\xff\xec\x00\x9c\x00\x84\xff\xec\x00\x9c\x00\ +\x85\xff\xec\x00\x9c\x00\x86\xff\xec\x00\x9c\x00\x87\xff\xec\x00\ +\x9c\x00\xc2\xff\xec\x00\x9c\x00\xc4\xff\xec\x00\x9c\x00\xc6\xff\ +\xec\x00\x9c\x01C\xff\xec\x00\x9c\x02\x08\xff\xd7\x00\x9c\x02\ +\x0c\xff\xd7\x00\x9c\x02X\xff\xec\x00\x9c\x03\x1d\xff\xec\x00\ +\x9c\x03\x1f\xff\xec\x00\x9c\x03!\xff\xec\x00\x9c\x03#\xff\ +\xec\x00\x9c\x03%\xff\xec\x00\x9c\x03'\xff\xec\x00\x9c\x03\ +)\xff\xec\x00\x9c\x03+\xff\xec\x00\x9c\x03-\xff\xec\x00\ +\x9c\x03/\xff\xec\x00\x9c\x031\xff\xec\x00\x9c\x033\xff\ +\xec\x00\x9d\x00\x0f\xff\xd7\x00\x9d\x00\x11\xff\xd7\x00\x9d\x00\ +$\xff\xec\x00\x9d\x00\x82\xff\xec\x00\x9d\x00\x83\xff\xec\x00\ +\x9d\x00\x84\xff\xec\x00\x9d\x00\x85\xff\xec\x00\x9d\x00\x86\xff\ +\xec\x00\x9d\x00\x87\xff\xec\x00\x9d\x00\xc2\xff\xec\x00\x9d\x00\ +\xc4\xff\xec\x00\x9d\x00\xc6\xff\xec\x00\x9d\x01C\xff\xec\x00\ +\x9d\x02\x08\xff\xd7\x00\x9d\x02\x0c\xff\xd7\x00\x9d\x02X\xff\ +\xec\x00\x9d\x03\x1d\xff\xec\x00\x9d\x03\x1f\xff\xec\x00\x9d\x03\ +!\xff\xec\x00\x9d\x03#\xff\xec\x00\x9d\x03%\xff\xec\x00\ +\x9d\x03'\xff\xec\x00\x9d\x03)\xff\xec\x00\x9d\x03+\xff\ +\xec\x00\x9d\x03-\xff\xec\x00\x9d\x03/\xff\xec\x00\x9d\x03\ +1\xff\xec\x00\x9d\x033\xff\xec\x00\x9e\x00\x0f\xff\xd7\x00\ +\x9e\x00\x11\xff\xd7\x00\x9e\x00$\xff\xec\x00\x9e\x00\x82\xff\ +\xec\x00\x9e\x00\x83\xff\xec\x00\x9e\x00\x84\xff\xec\x00\x9e\x00\ +\x85\xff\xec\x00\x9e\x00\x86\xff\xec\x00\x9e\x00\x87\xff\xec\x00\ +\x9e\x00\xc2\xff\xec\x00\x9e\x00\xc4\xff\xec\x00\x9e\x00\xc6\xff\ +\xec\x00\x9e\x01C\xff\xec\x00\x9e\x02\x08\xff\xd7\x00\x9e\x02\ +\x0c\xff\xd7\x00\x9e\x02X\xff\xec\x00\x9e\x03\x1d\xff\xec\x00\ +\x9e\x03\x1f\xff\xec\x00\x9e\x03!\xff\xec\x00\x9e\x03#\xff\ +\xec\x00\x9e\x03%\xff\xec\x00\x9e\x03'\xff\xec\x00\x9e\x03\ +)\xff\xec\x00\x9e\x03+\xff\xec\x00\x9e\x03-\xff\xec\x00\ +\x9e\x03/\xff\xec\x00\x9e\x031\xff\xec\x00\x9e\x033\xff\ +\xec\x00\x9f\x00\x0f\xff\x85\x00\x9f\x00\x11\xff\x85\x00\x9f\x00\ +\x22\x00)\x00\x9f\x00$\xff\x85\x00\x9f\x00&\xff\xd7\x00\ +\x9f\x00*\xff\xd7\x00\x9f\x002\xff\xd7\x00\x9f\x004\xff\ +\xd7\x00\x9f\x00D\xff\x9a\x00\x9f\x00F\xff\x9a\x00\x9f\x00\ +G\xff\x9a\x00\x9f\x00H\xff\x9a\x00\x9f\x00J\xff\xd7\x00\ +\x9f\x00P\xff\xc3\x00\x9f\x00Q\xff\xc3\x00\x9f\x00R\xff\ +\x9a\x00\x9f\x00S\xff\xc3\x00\x9f\x00T\xff\x9a\x00\x9f\x00\ +U\xff\xc3\x00\x9f\x00V\xff\xae\x00\x9f\x00X\xff\xc3\x00\ +\x9f\x00]\xff\xd7\x00\x9f\x00\x82\xff\x85\x00\x9f\x00\x83\xff\ +\x85\x00\x9f\x00\x84\xff\x85\x00\x9f\x00\x85\xff\x85\x00\x9f\x00\ +\x86\xff\x85\x00\x9f\x00\x87\xff\x85\x00\x9f\x00\x89\xff\xd7\x00\ +\x9f\x00\x94\xff\xd7\x00\x9f\x00\x95\xff\xd7\x00\x9f\x00\x96\xff\ +\xd7\x00\x9f\x00\x97\xff\xd7\x00\x9f\x00\x98\xff\xd7\x00\x9f\x00\ +\x9a\xff\xd7\x00\x9f\x00\xa2\xff\x9a\x00\x9f\x00\xa3\xff\x9a\x00\ +\x9f\x00\xa4\xff\x9a\x00\x9f\x00\xa5\xff\x9a\x00\x9f\x00\xa6\xff\ +\x9a\x00\x9f\x00\xa7\xff\x9a\x00\x9f\x00\xa8\xff\x9a\x00\x9f\x00\ +\xa9\xff\x9a\x00\x9f\x00\xaa\xff\x9a\x00\x9f\x00\xab\xff\x9a\x00\ +\x9f\x00\xac\xff\x9a\x00\x9f\x00\xad\xff\x9a\x00\x9f\x00\xb4\xff\ +\x9a\x00\x9f\x00\xb5\xff\x9a\x00\x9f\x00\xb6\xff\x9a\x00\x9f\x00\ +\xb7\xff\x9a\x00\x9f\x00\xb8\xff\x9a\x00\x9f\x00\xba\xff\x9a\x00\ +\x9f\x00\xbb\xff\xc3\x00\x9f\x00\xbc\xff\xc3\x00\x9f\x00\xbd\xff\ +\xc3\x00\x9f\x00\xbe\xff\xc3\x00\x9f\x00\xc2\xff\x85\x00\x9f\x00\ +\xc3\xff\x9a\x00\x9f\x00\xc4\xff\x85\x00\x9f\x00\xc5\xff\x9a\x00\ +\x9f\x00\xc6\xff\x85\x00\x9f\x00\xc7\xff\x9a\x00\x9f\x00\xc8\xff\ +\xd7\x00\x9f\x00\xc9\xff\x9a\x00\x9f\x00\xca\xff\xd7\x00\x9f\x00\ +\xcb\xff\x9a\x00\x9f\x00\xcc\xff\xd7\x00\x9f\x00\xcd\xff\x9a\x00\ +\x9f\x00\xce\xff\xd7\x00\x9f\x00\xcf\xff\x9a\x00\x9f\x00\xd1\xff\ +\x9a\x00\x9f\x00\xd3\xff\x9a\x00\x9f\x00\xd5\xff\x9a\x00\x9f\x00\ +\xd7\xff\x9a\x00\x9f\x00\xd9\xff\x9a\x00\x9f\x00\xdb\xff\x9a\x00\ +\x9f\x00\xdd\xff\x9a\x00\x9f\x00\xde\xff\xd7\x00\x9f\x00\xdf\xff\ +\xd7\x00\x9f\x00\xe0\xff\xd7\x00\x9f\x00\xe1\xff\xd7\x00\x9f\x00\ +\xe2\xff\xd7\x00\x9f\x00\xe3\xff\xd7\x00\x9f\x00\xe4\xff\xd7\x00\ +\x9f\x00\xe5\xff\xd7\x00\x9f\x00\xfa\xff\xc3\x00\x9f\x01\x06\xff\ +\xc3\x00\x9f\x01\x08\xff\xc3\x00\x9f\x01\x0d\xff\xc3\x00\x9f\x01\ +\x0e\xff\xd7\x00\x9f\x01\x0f\xff\x9a\x00\x9f\x01\x10\xff\xd7\x00\ +\x9f\x01\x11\xff\x9a\x00\x9f\x01\x12\xff\xd7\x00\x9f\x01\x13\xff\ +\x9a\x00\x9f\x01\x14\xff\xd7\x00\x9f\x01\x15\xff\x9a\x00\x9f\x01\ +\x17\xff\xc3\x00\x9f\x01\x19\xff\xc3\x00\x9f\x01\x1d\xff\xae\x00\ +\x9f\x01!\xff\xae\x00\x9f\x01+\xff\xc3\x00\x9f\x01-\xff\ +\xc3\x00\x9f\x01/\xff\xc3\x00\x9f\x011\xff\xc3\x00\x9f\x01\ +3\xff\xc3\x00\x9f\x015\xff\xc3\x00\x9f\x01<\xff\xd7\x00\ +\x9f\x01>\xff\xd7\x00\x9f\x01@\xff\xd7\x00\x9f\x01C\xff\ +\x85\x00\x9f\x01D\xff\x9a\x00\x9f\x01F\xff\x9a\x00\x9f\x01\ +G\xff\xd7\x00\x9f\x01H\xff\x9a\x00\x9f\x01J\xff\xae\x00\ +\x9f\x02\x08\xff\x85\x00\x9f\x02\x0c\xff\x85\x00\x9f\x02W\xff\ +\xc3\x00\x9f\x02X\xff\x85\x00\x9f\x02Y\xff\x9a\x00\x9f\x02\ +_\xff\xd7\x00\x9f\x02`\xff\x9a\x00\x9f\x02b\xff\xc3\x00\ +\x9f\x03\x1d\xff\x85\x00\x9f\x03\x1e\xff\x9a\x00\x9f\x03\x1f\xff\ +\x85\x00\x9f\x03 \xff\x9a\x00\x9f\x03!\xff\x85\x00\x9f\x03\ +\x22\xff\x9a\x00\x9f\x03#\xff\x85\x00\x9f\x03%\xff\x85\x00\ +\x9f\x03&\xff\x9a\x00\x9f\x03'\xff\x85\x00\x9f\x03(\xff\ +\x9a\x00\x9f\x03)\xff\x85\x00\x9f\x03*\xff\x9a\x00\x9f\x03\ ++\xff\x85\x00\x9f\x03,\xff\x9a\x00\x9f\x03-\xff\x85\x00\ +\x9f\x03.\xff\x9a\x00\x9f\x03/\xff\x85\x00\x9f\x030\xff\ +\x9a\x00\x9f\x031\xff\x85\x00\x9f\x032\xff\x9a\x00\x9f\x03\ +3\xff\x85\x00\x9f\x034\xff\x9a\x00\x9f\x036\xff\x9a\x00\ +\x9f\x038\xff\x9a\x00\x9f\x03:\xff\x9a\x00\x9f\x03<\xff\ +\x9a\x00\x9f\x03@\xff\x9a\x00\x9f\x03B\xff\x9a\x00\x9f\x03\ +D\xff\x9a\x00\x9f\x03I\xff\xd7\x00\x9f\x03J\xff\x9a\x00\ +\x9f\x03K\xff\xd7\x00\x9f\x03L\xff\x9a\x00\x9f\x03M\xff\ +\xd7\x00\x9f\x03N\xff\x9a\x00\x9f\x03O\xff\xd7\x00\x9f\x03\ +Q\xff\xd7\x00\x9f\x03R\xff\x9a\x00\x9f\x03S\xff\xd7\x00\ +\x9f\x03T\xff\x9a\x00\x9f\x03U\xff\xd7\x00\x9f\x03V\xff\ +\x9a\x00\x9f\x03W\xff\xd7\x00\x9f\x03X\xff\x9a\x00\x9f\x03\ +Y\xff\xd7\x00\x9f\x03Z\xff\x9a\x00\x9f\x03[\xff\xd7\x00\ +\x9f\x03\x5c\xff\x9a\x00\x9f\x03]\xff\xd7\x00\x9f\x03^\xff\ +\x9a\x00\x9f\x03_\xff\xd7\x00\x9f\x03`\xff\x9a\x00\x9f\x03\ +b\xff\xc3\x00\x9f\x03d\xff\xc3\x00\x9f\x03f\xff\xc3\x00\ +\x9f\x03h\xff\xc3\x00\x9f\x03j\xff\xc3\x00\x9f\x03l\xff\ +\xc3\x00\x9f\x03n\xff\xc3\x00\xa0\x00\x0f\xfe\xf6\x00\xa0\x00\ +\x11\xfe\xf6\x00\xa0\x00$\xff\x9a\x00\xa0\x00;\xff\xd7\x00\ +\xa0\x00=\xff\xec\x00\xa0\x00\x82\xff\x9a\x00\xa0\x00\x83\xff\ +\x9a\x00\xa0\x00\x84\xff\x9a\x00\xa0\x00\x85\xff\x9a\x00\xa0\x00\ +\x86\xff\x9a\x00\xa0\x00\x87\xff\x9a\x00\xa0\x00\xc2\xff\x9a\x00\ +\xa0\x00\xc4\xff\x9a\x00\xa0\x00\xc6\xff\x9a\x00\xa0\x01;\xff\ +\xec\x00\xa0\x01=\xff\xec\x00\xa0\x01?\xff\xec\x00\xa0\x01\ +C\xff\x9a\x00\xa0\x02\x08\xfe\xf6\x00\xa0\x02\x0c\xfe\xf6\x00\ +\xa0\x02X\xff\x9a\x00\xa0\x03\x1d\xff\x9a\x00\xa0\x03\x1f\xff\ +\x9a\x00\xa0\x03!\xff\x9a\x00\xa0\x03#\xff\x9a\x00\xa0\x03\ +%\xff\x9a\x00\xa0\x03'\xff\x9a\x00\xa0\x03)\xff\x9a\x00\ +\xa0\x03+\xff\x9a\x00\xa0\x03-\xff\x9a\x00\xa0\x03/\xff\ +\x9a\x00\xa0\x031\xff\x9a\x00\xa0\x033\xff\x9a\x00\xa2\x00\ +\x05\xff\xec\x00\xa2\x00\x0a\xff\xec\x00\xa2\x02\x07\xff\xec\x00\ +\xa2\x02\x0b\xff\xec\x00\xa3\x00\x05\xff\xec\x00\xa3\x00\x0a\xff\ +\xec\x00\xa3\x02\x07\xff\xec\x00\xa3\x02\x0b\xff\xec\x00\xa4\x00\ +\x05\xff\xec\x00\xa4\x00\x0a\xff\xec\x00\xa4\x02\x07\xff\xec\x00\ +\xa4\x02\x0b\xff\xec\x00\xa5\x00\x05\xff\xec\x00\xa5\x00\x0a\xff\ +\xec\x00\xa5\x02\x07\xff\xec\x00\xa5\x02\x0b\xff\xec\x00\xa6\x00\ +\x05\xff\xec\x00\xa6\x00\x0a\xff\xec\x00\xa6\x02\x07\xff\xec\x00\ +\xa6\x02\x0b\xff\xec\x00\xa7\x00\x05\xff\xec\x00\xa7\x00\x0a\xff\ +\xec\x00\xa7\x02\x07\xff\xec\x00\xa7\x02\x0b\xff\xec\x00\xaa\x00\ +\x05\xff\xec\x00\xaa\x00\x0a\xff\xec\x00\xaa\x00Y\xff\xd7\x00\ +\xaa\x00Z\xff\xd7\x00\xaa\x00[\xff\xd7\x00\xaa\x00\x5c\xff\ +\xd7\x00\xaa\x00]\xff\xec\x00\xaa\x00\xbf\xff\xd7\x00\xaa\x01\ +7\xff\xd7\x00\xaa\x01<\xff\xec\x00\xaa\x01>\xff\xec\x00\ +\xaa\x01@\xff\xec\x00\xaa\x01\xfb\xff\xd7\x00\xaa\x01\xfd\xff\ +\xd7\x00\xaa\x02\x07\xff\xec\x00\xaa\x02\x0b\xff\xec\x00\xaa\x03\ +p\xff\xd7\x00\xab\x00\x05\xff\xec\x00\xab\x00\x0a\xff\xec\x00\ +\xab\x00Y\xff\xd7\x00\xab\x00Z\xff\xd7\x00\xab\x00[\xff\ +\xd7\x00\xab\x00\x5c\xff\xd7\x00\xab\x00]\xff\xec\x00\xab\x00\ +\xbf\xff\xd7\x00\xab\x017\xff\xd7\x00\xab\x01<\xff\xec\x00\ +\xab\x01>\xff\xec\x00\xab\x01@\xff\xec\x00\xab\x01\xfb\xff\ +\xd7\x00\xab\x01\xfd\xff\xd7\x00\xab\x02\x07\xff\xec\x00\xab\x02\ +\x0b\xff\xec\x00\xab\x03p\xff\xd7\x00\xac\x00\x05\xff\xec\x00\ +\xac\x00\x0a\xff\xec\x00\xac\x00Y\xff\xd7\x00\xac\x00Z\xff\ +\xd7\x00\xac\x00[\xff\xd7\x00\xac\x00\x5c\xff\xd7\x00\xac\x00\ +]\xff\xec\x00\xac\x00\xbf\xff\xd7\x00\xac\x017\xff\xd7\x00\ +\xac\x01<\xff\xec\x00\xac\x01>\xff\xec\x00\xac\x01@\xff\ +\xec\x00\xac\x01\xfb\xff\xd7\x00\xac\x01\xfd\xff\xd7\x00\xac\x02\ +\x07\xff\xec\x00\xac\x02\x0b\xff\xec\x00\xac\x03p\xff\xd7\x00\ +\xad\x00\x05\xff\xec\x00\xad\x00\x0a\xff\xec\x00\xad\x00Y\xff\ +\xd7\x00\xad\x00Z\xff\xd7\x00\xad\x00[\xff\xd7\x00\xad\x00\ +\x5c\xff\xd7\x00\xad\x00]\xff\xec\x00\xad\x00\xbf\xff\xd7\x00\ +\xad\x017\xff\xd7\x00\xad\x01<\xff\xec\x00\xad\x01>\xff\ +\xec\x00\xad\x01@\xff\xec\x00\xad\x01\xfb\xff\xd7\x00\xad\x01\ +\xfd\xff\xd7\x00\xad\x02\x07\xff\xec\x00\xad\x02\x0b\xff\xec\x00\ +\xad\x03p\xff\xd7\x00\xb2\x00\x05\xff\xec\x00\xb2\x00\x0a\xff\ +\xec\x00\xb2\x00Y\xff\xd7\x00\xb2\x00Z\xff\xd7\x00\xb2\x00\ +[\xff\xd7\x00\xb2\x00\x5c\xff\xd7\x00\xb2\x00]\xff\xec\x00\ +\xb2\x00\xbf\xff\xd7\x00\xb2\x017\xff\xd7\x00\xb2\x01<\xff\ +\xec\x00\xb2\x01>\xff\xec\x00\xb2\x01@\xff\xec\x00\xb2\x01\ +\xfb\xff\xd7\x00\xb2\x01\xfd\xff\xd7\x00\xb2\x02\x07\xff\xec\x00\ +\xb2\x02\x0b\xff\xec\x00\xb2\x03p\xff\xd7\x00\xb4\x00\x05\xff\ +\xec\x00\xb4\x00\x0a\xff\xec\x00\xb4\x00Y\xff\xd7\x00\xb4\x00\ +Z\xff\xd7\x00\xb4\x00[\xff\xd7\x00\xb4\x00\x5c\xff\xd7\x00\ +\xb4\x00]\xff\xec\x00\xb4\x00\xbf\xff\xd7\x00\xb4\x017\xff\ +\xd7\x00\xb4\x01<\xff\xec\x00\xb4\x01>\xff\xec\x00\xb4\x01\ +@\xff\xec\x00\xb4\x01\xfb\xff\xd7\x00\xb4\x01\xfd\xff\xd7\x00\ +\xb4\x02\x07\xff\xec\x00\xb4\x02\x0b\xff\xec\x00\xb4\x03p\xff\ +\xd7\x00\xb5\x00\x05\xff\xec\x00\xb5\x00\x0a\xff\xec\x00\xb5\x00\ +Y\xff\xd7\x00\xb5\x00Z\xff\xd7\x00\xb5\x00[\xff\xd7\x00\ +\xb5\x00\x5c\xff\xd7\x00\xb5\x00]\xff\xec\x00\xb5\x00\xbf\xff\ +\xd7\x00\xb5\x017\xff\xd7\x00\xb5\x01<\xff\xec\x00\xb5\x01\ +>\xff\xec\x00\xb5\x01@\xff\xec\x00\xb5\x01\xfb\xff\xd7\x00\ +\xb5\x01\xfd\xff\xd7\x00\xb5\x02\x07\xff\xec\x00\xb5\x02\x0b\xff\ +\xec\x00\xb5\x03p\xff\xd7\x00\xb6\x00\x05\xff\xec\x00\xb6\x00\ +\x0a\xff\xec\x00\xb6\x00Y\xff\xd7\x00\xb6\x00Z\xff\xd7\x00\ +\xb6\x00[\xff\xd7\x00\xb6\x00\x5c\xff\xd7\x00\xb6\x00]\xff\ +\xec\x00\xb6\x00\xbf\xff\xd7\x00\xb6\x017\xff\xd7\x00\xb6\x01\ +<\xff\xec\x00\xb6\x01>\xff\xec\x00\xb6\x01@\xff\xec\x00\ +\xb6\x01\xfb\xff\xd7\x00\xb6\x01\xfd\xff\xd7\x00\xb6\x02\x07\xff\ +\xec\x00\xb6\x02\x0b\xff\xec\x00\xb6\x03p\xff\xd7\x00\xb8\x00\ +\x05\xff\xd7\x00\xb8\x00\x0a\xff\xd7\x00\xb8\x02\x07\xff\xd7\x00\ +\xb8\x02\x0b\xff\xd7\x00\xba\x00\x05\xff\xec\x00\xba\x00\x0a\xff\ +\xec\x00\xba\x00Y\xff\xd7\x00\xba\x00Z\xff\xd7\x00\xba\x00\ +[\xff\xd7\x00\xba\x00\x5c\xff\xd7\x00\xba\x00]\xff\xec\x00\ +\xba\x00\xbf\xff\xd7\x00\xba\x017\xff\xd7\x00\xba\x01<\xff\ +\xec\x00\xba\x01>\xff\xec\x00\xba\x01@\xff\xec\x00\xba\x01\ +\xfb\xff\xd7\x00\xba\x01\xfd\xff\xd7\x00\xba\x02\x07\xff\xec\x00\ +\xba\x02\x0b\xff\xec\x00\xba\x03p\xff\xd7\x00\xbf\x00\x05\x00\ +R\x00\xbf\x00\x0a\x00R\x00\xbf\x00\x0f\xff\xae\x00\xbf\x00\ +\x11\xff\xae\x00\xbf\x00\x22\x00)\x00\xbf\x02\x07\x00R\x00\ +\xbf\x02\x08\xff\xae\x00\xbf\x02\x0b\x00R\x00\xbf\x02\x0c\xff\ +\xae\x00\xc0\x00\x05\xff\xec\x00\xc0\x00\x0a\xff\xec\x00\xc0\x00\ +Y\xff\xd7\x00\xc0\x00Z\xff\xd7\x00\xc0\x00[\xff\xd7\x00\ +\xc0\x00\x5c\xff\xd7\x00\xc0\x00]\xff\xec\x00\xc0\x00\xbf\xff\ +\xd7\x00\xc0\x017\xff\xd7\x00\xc0\x01<\xff\xec\x00\xc0\x01\ +>\xff\xec\x00\xc0\x01@\xff\xec\x00\xc0\x01\xfb\xff\xd7\x00\ +\xc0\x01\xfd\xff\xd7\x00\xc0\x02\x07\xff\xec\x00\xc0\x02\x0b\xff\ +\xec\x00\xc0\x03p\xff\xd7\x00\xc1\x00\x05\x00R\x00\xc1\x00\ +\x0a\x00R\x00\xc1\x00\x0f\xff\xae\x00\xc1\x00\x11\xff\xae\x00\ +\xc1\x00\x22\x00)\x00\xc1\x02\x07\x00R\x00\xc1\x02\x08\xff\ +\xae\x00\xc1\x02\x0b\x00R\x00\xc1\x02\x0c\xff\xae\x00\xc2\x00\ +\x05\xffq\x00\xc2\x00\x0a\xffq\x00\xc2\x00&\xff\xd7\x00\ +\xc2\x00*\xff\xd7\x00\xc2\x00-\x01\x0a\x00\xc2\x002\xff\ +\xd7\x00\xc2\x004\xff\xd7\x00\xc2\x007\xffq\x00\xc2\x00\ +9\xff\xae\x00\xc2\x00:\xff\xae\x00\xc2\x00<\xff\x85\x00\ +\xc2\x00\x89\xff\xd7\x00\xc2\x00\x94\xff\xd7\x00\xc2\x00\x95\xff\ +\xd7\x00\xc2\x00\x96\xff\xd7\x00\xc2\x00\x97\xff\xd7\x00\xc2\x00\ +\x98\xff\xd7\x00\xc2\x00\x9a\xff\xd7\x00\xc2\x00\x9f\xff\x85\x00\ +\xc2\x00\xc8\xff\xd7\x00\xc2\x00\xca\xff\xd7\x00\xc2\x00\xcc\xff\ +\xd7\x00\xc2\x00\xce\xff\xd7\x00\xc2\x00\xde\xff\xd7\x00\xc2\x00\ +\xe0\xff\xd7\x00\xc2\x00\xe2\xff\xd7\x00\xc2\x00\xe4\xff\xd7\x00\ +\xc2\x01\x0e\xff\xd7\x00\xc2\x01\x10\xff\xd7\x00\xc2\x01\x12\xff\ +\xd7\x00\xc2\x01\x14\xff\xd7\x00\xc2\x01$\xffq\x00\xc2\x01\ +&\xffq\x00\xc2\x016\xff\xae\x00\xc2\x018\xff\x85\x00\ +\xc2\x01:\xff\x85\x00\xc2\x01G\xff\xd7\x00\xc2\x01\xfa\xff\ +\xae\x00\xc2\x01\xfc\xff\xae\x00\xc2\x01\xfe\xff\xae\x00\xc2\x02\ +\x00\xff\x85\x00\xc2\x02\x07\xffq\x00\xc2\x02\x0b\xffq\x00\ +\xc2\x02_\xff\xd7\x00\xc2\x03I\xff\xd7\x00\xc2\x03K\xff\ +\xd7\x00\xc2\x03M\xff\xd7\x00\xc2\x03O\xff\xd7\x00\xc2\x03\ +Q\xff\xd7\x00\xc2\x03S\xff\xd7\x00\xc2\x03U\xff\xd7\x00\ +\xc2\x03W\xff\xd7\x00\xc2\x03Y\xff\xd7\x00\xc2\x03[\xff\ +\xd7\x00\xc2\x03]\xff\xd7\x00\xc2\x03_\xff\xd7\x00\xc2\x03\ +o\xff\x85\x00\xc2\x03q\xff\x85\x00\xc2\x03s\xff\x85\x00\ +\xc2\x03\x8f\xffq\x00\xc3\x00\x05\xff\xec\x00\xc3\x00\x0a\xff\ +\xec\x00\xc3\x02\x07\xff\xec\x00\xc3\x02\x0b\xff\xec\x00\xc4\x00\ +\x05\xffq\x00\xc4\x00\x0a\xffq\x00\xc4\x00&\xff\xd7\x00\ +\xc4\x00*\xff\xd7\x00\xc4\x00-\x01\x0a\x00\xc4\x002\xff\ +\xd7\x00\xc4\x004\xff\xd7\x00\xc4\x007\xffq\x00\xc4\x00\ +9\xff\xae\x00\xc4\x00:\xff\xae\x00\xc4\x00<\xff\x85\x00\ +\xc4\x00\x89\xff\xd7\x00\xc4\x00\x94\xff\xd7\x00\xc4\x00\x95\xff\ +\xd7\x00\xc4\x00\x96\xff\xd7\x00\xc4\x00\x97\xff\xd7\x00\xc4\x00\ +\x98\xff\xd7\x00\xc4\x00\x9a\xff\xd7\x00\xc4\x00\x9f\xff\x85\x00\ +\xc4\x00\xc8\xff\xd7\x00\xc4\x00\xca\xff\xd7\x00\xc4\x00\xcc\xff\ +\xd7\x00\xc4\x00\xce\xff\xd7\x00\xc4\x00\xde\xff\xd7\x00\xc4\x00\ +\xe0\xff\xd7\x00\xc4\x00\xe2\xff\xd7\x00\xc4\x00\xe4\xff\xd7\x00\ +\xc4\x01\x0e\xff\xd7\x00\xc4\x01\x10\xff\xd7\x00\xc4\x01\x12\xff\ +\xd7\x00\xc4\x01\x14\xff\xd7\x00\xc4\x01$\xffq\x00\xc4\x01\ +&\xffq\x00\xc4\x016\xff\xae\x00\xc4\x018\xff\x85\x00\ +\xc4\x01:\xff\x85\x00\xc4\x01G\xff\xd7\x00\xc4\x01\xfa\xff\ +\xae\x00\xc4\x01\xfc\xff\xae\x00\xc4\x01\xfe\xff\xae\x00\xc4\x02\ +\x00\xff\x85\x00\xc4\x02\x07\xffq\x00\xc4\x02\x0b\xffq\x00\ +\xc4\x02_\xff\xd7\x00\xc4\x03I\xff\xd7\x00\xc4\x03K\xff\ +\xd7\x00\xc4\x03M\xff\xd7\x00\xc4\x03O\xff\xd7\x00\xc4\x03\ +Q\xff\xd7\x00\xc4\x03S\xff\xd7\x00\xc4\x03U\xff\xd7\x00\ +\xc4\x03W\xff\xd7\x00\xc4\x03Y\xff\xd7\x00\xc4\x03[\xff\ +\xd7\x00\xc4\x03]\xff\xd7\x00\xc4\x03_\xff\xd7\x00\xc4\x03\ +o\xff\x85\x00\xc4\x03q\xff\x85\x00\xc4\x03s\xff\x85\x00\ +\xc4\x03\x8f\xffq\x00\xc5\x00\x05\xff\xec\x00\xc5\x00\x0a\xff\ +\xec\x00\xc5\x02\x07\xff\xec\x00\xc5\x02\x0b\xff\xec\x00\xc6\x00\ +\x05\xffq\x00\xc6\x00\x0a\xffq\x00\xc6\x00&\xff\xd7\x00\ +\xc6\x00*\xff\xd7\x00\xc6\x00-\x01\x0a\x00\xc6\x002\xff\ +\xd7\x00\xc6\x004\xff\xd7\x00\xc6\x007\xffq\x00\xc6\x00\ +9\xff\xae\x00\xc6\x00:\xff\xae\x00\xc6\x00<\xff\x85\x00\ +\xc6\x00\x89\xff\xd7\x00\xc6\x00\x94\xff\xd7\x00\xc6\x00\x95\xff\ +\xd7\x00\xc6\x00\x96\xff\xd7\x00\xc6\x00\x97\xff\xd7\x00\xc6\x00\ +\x98\xff\xd7\x00\xc6\x00\x9a\xff\xd7\x00\xc6\x00\x9f\xff\x85\x00\ +\xc6\x00\xc8\xff\xd7\x00\xc6\x00\xca\xff\xd7\x00\xc6\x00\xcc\xff\ +\xd7\x00\xc6\x00\xce\xff\xd7\x00\xc6\x00\xde\xff\xd7\x00\xc6\x00\ +\xe0\xff\xd7\x00\xc6\x00\xe2\xff\xd7\x00\xc6\x00\xe4\xff\xd7\x00\ +\xc6\x01\x0e\xff\xd7\x00\xc6\x01\x10\xff\xd7\x00\xc6\x01\x12\xff\ +\xd7\x00\xc6\x01\x14\xff\xd7\x00\xc6\x01$\xffq\x00\xc6\x01\ +&\xffq\x00\xc6\x016\xff\xae\x00\xc6\x018\xff\x85\x00\ +\xc6\x01:\xff\x85\x00\xc6\x01G\xff\xd7\x00\xc6\x01\xfa\xff\ +\xae\x00\xc6\x01\xfc\xff\xae\x00\xc6\x01\xfe\xff\xae\x00\xc6\x02\ +\x00\xff\x85\x00\xc6\x02\x07\xffq\x00\xc6\x02\x0b\xffq\x00\ +\xc6\x02_\xff\xd7\x00\xc6\x03I\xff\xd7\x00\xc6\x03K\xff\ +\xd7\x00\xc6\x03M\xff\xd7\x00\xc6\x03O\xff\xd7\x00\xc6\x03\ +Q\xff\xd7\x00\xc6\x03S\xff\xd7\x00\xc6\x03U\xff\xd7\x00\ +\xc6\x03W\xff\xd7\x00\xc6\x03Y\xff\xd7\x00\xc6\x03[\xff\ +\xd7\x00\xc6\x03]\xff\xd7\x00\xc6\x03_\xff\xd7\x00\xc6\x03\ +o\xff\x85\x00\xc6\x03q\xff\x85\x00\xc6\x03s\xff\x85\x00\ +\xc6\x03\x8f\xffq\x00\xc7\x00\x05\xff\xec\x00\xc7\x00\x0a\xff\ +\xec\x00\xc7\x02\x07\xff\xec\x00\xc7\x02\x0b\xff\xec\x00\xc8\x00\ +&\xff\xd7\x00\xc8\x00*\xff\xd7\x00\xc8\x002\xff\xd7\x00\ +\xc8\x004\xff\xd7\x00\xc8\x00\x89\xff\xd7\x00\xc8\x00\x94\xff\ +\xd7\x00\xc8\x00\x95\xff\xd7\x00\xc8\x00\x96\xff\xd7\x00\xc8\x00\ +\x97\xff\xd7\x00\xc8\x00\x98\xff\xd7\x00\xc8\x00\x9a\xff\xd7\x00\ +\xc8\x00\xc8\xff\xd7\x00\xc8\x00\xca\xff\xd7\x00\xc8\x00\xcc\xff\ +\xd7\x00\xc8\x00\xce\xff\xd7\x00\xc8\x00\xde\xff\xd7\x00\xc8\x00\ +\xe0\xff\xd7\x00\xc8\x00\xe2\xff\xd7\x00\xc8\x00\xe4\xff\xd7\x00\ +\xc8\x01\x0e\xff\xd7\x00\xc8\x01\x10\xff\xd7\x00\xc8\x01\x12\xff\ +\xd7\x00\xc8\x01\x14\xff\xd7\x00\xc8\x01G\xff\xd7\x00\xc8\x02\ +_\xff\xd7\x00\xc8\x03I\xff\xd7\x00\xc8\x03K\xff\xd7\x00\ +\xc8\x03M\xff\xd7\x00\xc8\x03O\xff\xd7\x00\xc8\x03Q\xff\ +\xd7\x00\xc8\x03S\xff\xd7\x00\xc8\x03U\xff\xd7\x00\xc8\x03\ +W\xff\xd7\x00\xc8\x03Y\xff\xd7\x00\xc8\x03[\xff\xd7\x00\ +\xc8\x03]\xff\xd7\x00\xc8\x03_\xff\xd7\x00\xca\x00&\xff\ +\xd7\x00\xca\x00*\xff\xd7\x00\xca\x002\xff\xd7\x00\xca\x00\ +4\xff\xd7\x00\xca\x00\x89\xff\xd7\x00\xca\x00\x94\xff\xd7\x00\ +\xca\x00\x95\xff\xd7\x00\xca\x00\x96\xff\xd7\x00\xca\x00\x97\xff\ +\xd7\x00\xca\x00\x98\xff\xd7\x00\xca\x00\x9a\xff\xd7\x00\xca\x00\ +\xc8\xff\xd7\x00\xca\x00\xca\xff\xd7\x00\xca\x00\xcc\xff\xd7\x00\ +\xca\x00\xce\xff\xd7\x00\xca\x00\xde\xff\xd7\x00\xca\x00\xe0\xff\ +\xd7\x00\xca\x00\xe2\xff\xd7\x00\xca\x00\xe4\xff\xd7\x00\xca\x01\ +\x0e\xff\xd7\x00\xca\x01\x10\xff\xd7\x00\xca\x01\x12\xff\xd7\x00\ +\xca\x01\x14\xff\xd7\x00\xca\x01G\xff\xd7\x00\xca\x02_\xff\ +\xd7\x00\xca\x03I\xff\xd7\x00\xca\x03K\xff\xd7\x00\xca\x03\ +M\xff\xd7\x00\xca\x03O\xff\xd7\x00\xca\x03Q\xff\xd7\x00\ +\xca\x03S\xff\xd7\x00\xca\x03U\xff\xd7\x00\xca\x03W\xff\ +\xd7\x00\xca\x03Y\xff\xd7\x00\xca\x03[\xff\xd7\x00\xca\x03\ +]\xff\xd7\x00\xca\x03_\xff\xd7\x00\xcc\x00&\xff\xd7\x00\ +\xcc\x00*\xff\xd7\x00\xcc\x002\xff\xd7\x00\xcc\x004\xff\ +\xd7\x00\xcc\x00\x89\xff\xd7\x00\xcc\x00\x94\xff\xd7\x00\xcc\x00\ +\x95\xff\xd7\x00\xcc\x00\x96\xff\xd7\x00\xcc\x00\x97\xff\xd7\x00\ +\xcc\x00\x98\xff\xd7\x00\xcc\x00\x9a\xff\xd7\x00\xcc\x00\xc8\xff\ +\xd7\x00\xcc\x00\xca\xff\xd7\x00\xcc\x00\xcc\xff\xd7\x00\xcc\x00\ +\xce\xff\xd7\x00\xcc\x00\xde\xff\xd7\x00\xcc\x00\xe0\xff\xd7\x00\ +\xcc\x00\xe2\xff\xd7\x00\xcc\x00\xe4\xff\xd7\x00\xcc\x01\x0e\xff\ +\xd7\x00\xcc\x01\x10\xff\xd7\x00\xcc\x01\x12\xff\xd7\x00\xcc\x01\ +\x14\xff\xd7\x00\xcc\x01G\xff\xd7\x00\xcc\x02_\xff\xd7\x00\ +\xcc\x03I\xff\xd7\x00\xcc\x03K\xff\xd7\x00\xcc\x03M\xff\ +\xd7\x00\xcc\x03O\xff\xd7\x00\xcc\x03Q\xff\xd7\x00\xcc\x03\ +S\xff\xd7\x00\xcc\x03U\xff\xd7\x00\xcc\x03W\xff\xd7\x00\ +\xcc\x03Y\xff\xd7\x00\xcc\x03[\xff\xd7\x00\xcc\x03]\xff\ +\xd7\x00\xcc\x03_\xff\xd7\x00\xce\x00&\xff\xd7\x00\xce\x00\ +*\xff\xd7\x00\xce\x002\xff\xd7\x00\xce\x004\xff\xd7\x00\ +\xce\x00\x89\xff\xd7\x00\xce\x00\x94\xff\xd7\x00\xce\x00\x95\xff\ +\xd7\x00\xce\x00\x96\xff\xd7\x00\xce\x00\x97\xff\xd7\x00\xce\x00\ +\x98\xff\xd7\x00\xce\x00\x9a\xff\xd7\x00\xce\x00\xc8\xff\xd7\x00\ +\xce\x00\xca\xff\xd7\x00\xce\x00\xcc\xff\xd7\x00\xce\x00\xce\xff\ +\xd7\x00\xce\x00\xde\xff\xd7\x00\xce\x00\xe0\xff\xd7\x00\xce\x00\ +\xe2\xff\xd7\x00\xce\x00\xe4\xff\xd7\x00\xce\x01\x0e\xff\xd7\x00\ +\xce\x01\x10\xff\xd7\x00\xce\x01\x12\xff\xd7\x00\xce\x01\x14\xff\ +\xd7\x00\xce\x01G\xff\xd7\x00\xce\x02_\xff\xd7\x00\xce\x03\ +I\xff\xd7\x00\xce\x03K\xff\xd7\x00\xce\x03M\xff\xd7\x00\ +\xce\x03O\xff\xd7\x00\xce\x03Q\xff\xd7\x00\xce\x03S\xff\ +\xd7\x00\xce\x03U\xff\xd7\x00\xce\x03W\xff\xd7\x00\xce\x03\ +Y\xff\xd7\x00\xce\x03[\xff\xd7\x00\xce\x03]\xff\xd7\x00\ +\xce\x03_\xff\xd7\x00\xd0\x00\x0f\xff\xae\x00\xd0\x00\x11\xff\ +\xae\x00\xd0\x00$\xff\xd7\x00\xd0\x007\xff\xc3\x00\xd0\x00\ +9\xff\xec\x00\xd0\x00:\xff\xec\x00\xd0\x00;\xff\xd7\x00\ +\xd0\x00<\xff\xec\x00\xd0\x00=\xff\xec\x00\xd0\x00\x82\xff\ +\xd7\x00\xd0\x00\x83\xff\xd7\x00\xd0\x00\x84\xff\xd7\x00\xd0\x00\ +\x85\xff\xd7\x00\xd0\x00\x86\xff\xd7\x00\xd0\x00\x87\xff\xd7\x00\ +\xd0\x00\x9f\xff\xec\x00\xd0\x00\xc2\xff\xd7\x00\xd0\x00\xc4\xff\ +\xd7\x00\xd0\x00\xc6\xff\xd7\x00\xd0\x01$\xff\xc3\x00\xd0\x01\ +&\xff\xc3\x00\xd0\x016\xff\xec\x00\xd0\x018\xff\xec\x00\ +\xd0\x01:\xff\xec\x00\xd0\x01;\xff\xec\x00\xd0\x01=\xff\ +\xec\x00\xd0\x01?\xff\xec\x00\xd0\x01C\xff\xd7\x00\xd0\x01\ +\xa0\xff\xec\x00\xd0\x01\xfa\xff\xec\x00\xd0\x01\xfc\xff\xec\x00\ +\xd0\x01\xfe\xff\xec\x00\xd0\x02\x00\xff\xec\x00\xd0\x02\x08\xff\ +\xae\x00\xd0\x02\x0c\xff\xae\x00\xd0\x02X\xff\xd7\x00\xd0\x03\ +\x1d\xff\xd7\x00\xd0\x03\x1f\xff\xd7\x00\xd0\x03!\xff\xd7\x00\ +\xd0\x03#\xff\xd7\x00\xd0\x03%\xff\xd7\x00\xd0\x03'\xff\ +\xd7\x00\xd0\x03)\xff\xd7\x00\xd0\x03+\xff\xd7\x00\xd0\x03\ +-\xff\xd7\x00\xd0\x03/\xff\xd7\x00\xd0\x031\xff\xd7\x00\ +\xd0\x033\xff\xd7\x00\xd0\x03o\xff\xec\x00\xd0\x03q\xff\ +\xec\x00\xd0\x03s\xff\xec\x00\xd0\x03\x8f\xff\xc3\x00\xd1\x00\ +\x05\x00R\x00\xd1\x00\x0a\x00R\x00\xd1\x00\x0c\x00\x8f\x00\ +\xd1\x00\x22\x00\xa4\x00\xd1\x00@\x00\x8f\x00\xd1\x00E\x00\ +=\x00\xd1\x00K\x00=\x00\xd1\x00N\x00=\x00\xd1\x00\ +O\x00=\x00\xd1\x00`\x00\x8f\x00\xd1\x00\xe7\x00=\x00\ +\xd1\x00\xe9\x00{\x00\xd1\x02\x07\x00R\x00\xd1\x02\x0b\x00\ +R\x00\xd2\x00\x0f\xff\xae\x00\xd2\x00\x11\xff\xae\x00\xd2\x00\ +$\xff\xd7\x00\xd2\x007\xff\xc3\x00\xd2\x009\xff\xec\x00\ +\xd2\x00:\xff\xec\x00\xd2\x00;\xff\xd7\x00\xd2\x00<\xff\ +\xec\x00\xd2\x00=\xff\xec\x00\xd2\x00\x82\xff\xd7\x00\xd2\x00\ +\x83\xff\xd7\x00\xd2\x00\x84\xff\xd7\x00\xd2\x00\x85\xff\xd7\x00\ +\xd2\x00\x86\xff\xd7\x00\xd2\x00\x87\xff\xd7\x00\xd2\x00\x9f\xff\ +\xec\x00\xd2\x00\xc2\xff\xd7\x00\xd2\x00\xc4\xff\xd7\x00\xd2\x00\ +\xc6\xff\xd7\x00\xd2\x01$\xff\xc3\x00\xd2\x01&\xff\xc3\x00\ +\xd2\x016\xff\xec\x00\xd2\x018\xff\xec\x00\xd2\x01:\xff\ +\xec\x00\xd2\x01;\xff\xec\x00\xd2\x01=\xff\xec\x00\xd2\x01\ +?\xff\xec\x00\xd2\x01C\xff\xd7\x00\xd2\x01\xa0\xff\xec\x00\ +\xd2\x01\xfa\xff\xec\x00\xd2\x01\xfc\xff\xec\x00\xd2\x01\xfe\xff\ +\xec\x00\xd2\x02\x00\xff\xec\x00\xd2\x02\x08\xff\xae\x00\xd2\x02\ +\x0c\xff\xae\x00\xd2\x02X\xff\xd7\x00\xd2\x03\x1d\xff\xd7\x00\ +\xd2\x03\x1f\xff\xd7\x00\xd2\x03!\xff\xd7\x00\xd2\x03#\xff\ +\xd7\x00\xd2\x03%\xff\xd7\x00\xd2\x03'\xff\xd7\x00\xd2\x03\ +)\xff\xd7\x00\xd2\x03+\xff\xd7\x00\xd2\x03-\xff\xd7\x00\ +\xd2\x03/\xff\xd7\x00\xd2\x031\xff\xd7\x00\xd2\x033\xff\ +\xd7\x00\xd2\x03o\xff\xec\x00\xd2\x03q\xff\xec\x00\xd2\x03\ +s\xff\xec\x00\xd2\x03\x8f\xff\xc3\x00\xd4\x00-\x00{\x00\ +\xd5\x00\x05\xff\xec\x00\xd5\x00\x0a\xff\xec\x00\xd5\x00Y\xff\ +\xd7\x00\xd5\x00Z\xff\xd7\x00\xd5\x00[\xff\xd7\x00\xd5\x00\ +\x5c\xff\xd7\x00\xd5\x00]\xff\xec\x00\xd5\x00\xbf\xff\xd7\x00\ +\xd5\x017\xff\xd7\x00\xd5\x01<\xff\xec\x00\xd5\x01>\xff\ +\xec\x00\xd5\x01@\xff\xec\x00\xd5\x01\xfb\xff\xd7\x00\xd5\x01\ +\xfd\xff\xd7\x00\xd5\x02\x07\xff\xec\x00\xd5\x02\x0b\xff\xec\x00\ +\xd5\x03p\xff\xd7\x00\xd6\x00-\x00{\x00\xd7\x00\x05\xff\ +\xec\x00\xd7\x00\x0a\xff\xec\x00\xd7\x00Y\xff\xd7\x00\xd7\x00\ +Z\xff\xd7\x00\xd7\x00[\xff\xd7\x00\xd7\x00\x5c\xff\xd7\x00\ +\xd7\x00]\xff\xec\x00\xd7\x00\xbf\xff\xd7\x00\xd7\x017\xff\ +\xd7\x00\xd7\x01<\xff\xec\x00\xd7\x01>\xff\xec\x00\xd7\x01\ +@\xff\xec\x00\xd7\x01\xfb\xff\xd7\x00\xd7\x01\xfd\xff\xd7\x00\ +\xd7\x02\x07\xff\xec\x00\xd7\x02\x0b\xff\xec\x00\xd7\x03p\xff\ +\xd7\x00\xd8\x00-\x00{\x00\xd9\x00\x05\xff\xec\x00\xd9\x00\ +\x0a\xff\xec\x00\xd9\x00Y\xff\xd7\x00\xd9\x00Z\xff\xd7\x00\ +\xd9\x00[\xff\xd7\x00\xd9\x00\x5c\xff\xd7\x00\xd9\x00]\xff\ +\xec\x00\xd9\x00\xbf\xff\xd7\x00\xd9\x017\xff\xd7\x00\xd9\x01\ +<\xff\xec\x00\xd9\x01>\xff\xec\x00\xd9\x01@\xff\xec\x00\ +\xd9\x01\xfb\xff\xd7\x00\xd9\x01\xfd\xff\xd7\x00\xd9\x02\x07\xff\ +\xec\x00\xd9\x02\x0b\xff\xec\x00\xd9\x03p\xff\xd7\x00\xda\x00\ +-\x00{\x00\xdb\x00\x05\xff\xec\x00\xdb\x00\x0a\xff\xec\x00\ +\xdb\x00Y\xff\xd7\x00\xdb\x00Z\xff\xd7\x00\xdb\x00[\xff\ +\xd7\x00\xdb\x00\x5c\xff\xd7\x00\xdb\x00]\xff\xec\x00\xdb\x00\ +\xbf\xff\xd7\x00\xdb\x017\xff\xd7\x00\xdb\x01<\xff\xec\x00\ +\xdb\x01>\xff\xec\x00\xdb\x01@\xff\xec\x00\xdb\x01\xfb\xff\ +\xd7\x00\xdb\x01\xfd\xff\xd7\x00\xdb\x02\x07\xff\xec\x00\xdb\x02\ +\x0b\xff\xec\x00\xdb\x03p\xff\xd7\x00\xdc\x00-\x00{\x00\ +\xdd\x00\x05\xff\xec\x00\xdd\x00\x0a\xff\xec\x00\xdd\x00Y\xff\ +\xd7\x00\xdd\x00Z\xff\xd7\x00\xdd\x00[\xff\xd7\x00\xdd\x00\ +\x5c\xff\xd7\x00\xdd\x00]\xff\xec\x00\xdd\x00\xbf\xff\xd7\x00\ +\xdd\x017\xff\xd7\x00\xdd\x01<\xff\xec\x00\xdd\x01>\xff\ +\xec\x00\xdd\x01@\xff\xec\x00\xdd\x01\xfb\xff\xd7\x00\xdd\x01\ +\xfd\xff\xd7\x00\xdd\x02\x07\xff\xec\x00\xdd\x02\x0b\xff\xec\x00\ +\xdd\x03p\xff\xd7\x00\xe7\x00\x05\xff\xec\x00\xe7\x00\x0a\xff\ +\xec\x00\xe7\x02\x07\xff\xec\x00\xe7\x02\x0b\xff\xec\x00\xf8\x00\ +&\xff\xd7\x00\xf8\x00*\xff\xd7\x00\xf8\x002\xff\xd7\x00\ +\xf8\x004\xff\xd7\x00\xf8\x00\x89\xff\xd7\x00\xf8\x00\x94\xff\ +\xd7\x00\xf8\x00\x95\xff\xd7\x00\xf8\x00\x96\xff\xd7\x00\xf8\x00\ +\x97\xff\xd7\x00\xf8\x00\x98\xff\xd7\x00\xf8\x00\x9a\xff\xd7\x00\ +\xf8\x00\xc8\xff\xd7\x00\xf8\x00\xca\xff\xd7\x00\xf8\x00\xcc\xff\ +\xd7\x00\xf8\x00\xce\xff\xd7\x00\xf8\x00\xde\xff\xd7\x00\xf8\x00\ +\xe0\xff\xd7\x00\xf8\x00\xe2\xff\xd7\x00\xf8\x00\xe4\xff\xd7\x00\ +\xf8\x01\x0e\xff\xd7\x00\xf8\x01\x10\xff\xd7\x00\xf8\x01\x12\xff\ +\xd7\x00\xf8\x01\x14\xff\xd7\x00\xf8\x01G\xff\xd7\x00\xf8\x02\ +_\xff\xd7\x00\xf8\x03I\xff\xd7\x00\xf8\x03K\xff\xd7\x00\ +\xf8\x03M\xff\xd7\x00\xf8\x03O\xff\xd7\x00\xf8\x03Q\xff\ +\xd7\x00\xf8\x03S\xff\xd7\x00\xf8\x03U\xff\xd7\x00\xf8\x03\ +W\xff\xd7\x00\xf8\x03Y\xff\xd7\x00\xf8\x03[\xff\xd7\x00\ +\xf8\x03]\xff\xd7\x00\xf8\x03_\xff\xd7\x00\xf9\x00F\xff\ +\xd7\x00\xf9\x00G\xff\xd7\x00\xf9\x00H\xff\xd7\x00\xf9\x00\ +R\xff\xd7\x00\xf9\x00T\xff\xd7\x00\xf9\x00\xa2\xff\xd7\x00\ +\xf9\x00\xa9\xff\xd7\x00\xf9\x00\xaa\xff\xd7\x00\xf9\x00\xab\xff\ +\xd7\x00\xf9\x00\xac\xff\xd7\x00\xf9\x00\xad\xff\xd7\x00\xf9\x00\ +\xb4\xff\xd7\x00\xf9\x00\xb5\xff\xd7\x00\xf9\x00\xb6\xff\xd7\x00\ +\xf9\x00\xb7\xff\xd7\x00\xf9\x00\xb8\xff\xd7\x00\xf9\x00\xba\xff\ +\xd7\x00\xf9\x00\xc9\xff\xd7\x00\xf9\x00\xcb\xff\xd7\x00\xf9\x00\ +\xcd\xff\xd7\x00\xf9\x00\xcf\xff\xd7\x00\xf9\x00\xd1\xff\xd7\x00\ +\xf9\x00\xd3\xff\xd7\x00\xf9\x00\xd5\xff\xd7\x00\xf9\x00\xd7\xff\ +\xd7\x00\xf9\x00\xd9\xff\xd7\x00\xf9\x00\xdb\xff\xd7\x00\xf9\x00\ +\xdd\xff\xd7\x00\xf9\x01\x0f\xff\xd7\x00\xf9\x01\x11\xff\xd7\x00\ +\xf9\x01\x13\xff\xd7\x00\xf9\x01\x15\xff\xd7\x00\xf9\x01H\xff\ +\xd7\x00\xf9\x02`\xff\xd7\x00\xf9\x036\xff\xd7\x00\xf9\x03\ +8\xff\xd7\x00\xf9\x03:\xff\xd7\x00\xf9\x03<\xff\xd7\x00\ +\xf9\x03@\xff\xd7\x00\xf9\x03B\xff\xd7\x00\xf9\x03D\xff\ +\xd7\x00\xf9\x03J\xff\xd7\x00\xf9\x03L\xff\xd7\x00\xf9\x03\ +N\xff\xd7\x00\xf9\x03R\xff\xd7\x00\xf9\x03T\xff\xd7\x00\ +\xf9\x03V\xff\xd7\x00\xf9\x03X\xff\xd7\x00\xf9\x03Z\xff\ +\xd7\x00\xf9\x03\x5c\xff\xd7\x00\xf9\x03^\xff\xd7\x00\xf9\x03\ +`\xff\xd7\x00\xfa\x00F\xff\xd7\x00\xfa\x00G\xff\xd7\x00\ +\xfa\x00H\xff\xd7\x00\xfa\x00R\xff\xd7\x00\xfa\x00T\xff\ +\xd7\x00\xfa\x00\xa2\xff\xd7\x00\xfa\x00\xa9\xff\xd7\x00\xfa\x00\ +\xaa\xff\xd7\x00\xfa\x00\xab\xff\xd7\x00\xfa\x00\xac\xff\xd7\x00\ +\xfa\x00\xad\xff\xd7\x00\xfa\x00\xb4\xff\xd7\x00\xfa\x00\xb5\xff\ +\xd7\x00\xfa\x00\xb6\xff\xd7\x00\xfa\x00\xb7\xff\xd7\x00\xfa\x00\ +\xb8\xff\xd7\x00\xfa\x00\xba\xff\xd7\x00\xfa\x00\xc9\xff\xd7\x00\ +\xfa\x00\xcb\xff\xd7\x00\xfa\x00\xcd\xff\xd7\x00\xfa\x00\xcf\xff\ +\xd7\x00\xfa\x00\xd1\xff\xd7\x00\xfa\x00\xd3\xff\xd7\x00\xfa\x00\ +\xd5\xff\xd7\x00\xfa\x00\xd7\xff\xd7\x00\xfa\x00\xd9\xff\xd7\x00\ +\xfa\x00\xdb\xff\xd7\x00\xfa\x00\xdd\xff\xd7\x00\xfa\x01\x0f\xff\ +\xd7\x00\xfa\x01\x11\xff\xd7\x00\xfa\x01\x13\xff\xd7\x00\xfa\x01\ +\x15\xff\xd7\x00\xfa\x01H\xff\xd7\x00\xfa\x02`\xff\xd7\x00\ +\xfa\x036\xff\xd7\x00\xfa\x038\xff\xd7\x00\xfa\x03:\xff\ +\xd7\x00\xfa\x03<\xff\xd7\x00\xfa\x03@\xff\xd7\x00\xfa\x03\ +B\xff\xd7\x00\xfa\x03D\xff\xd7\x00\xfa\x03J\xff\xd7\x00\ +\xfa\x03L\xff\xd7\x00\xfa\x03N\xff\xd7\x00\xfa\x03R\xff\ +\xd7\x00\xfa\x03T\xff\xd7\x00\xfa\x03V\xff\xd7\x00\xfa\x03\ +X\xff\xd7\x00\xfa\x03Z\xff\xd7\x00\xfa\x03\x5c\xff\xd7\x00\ +\xfa\x03^\xff\xd7\x00\xfa\x03`\xff\xd7\x00\xfb\x00\x05\xff\ +\x5c\x00\xfb\x00\x0a\xff\x5c\x00\xfb\x00&\xff\xd7\x00\xfb\x00\ +*\xff\xd7\x00\xfb\x002\xff\xd7\x00\xfb\x004\xff\xd7\x00\ +\xfb\x007\xff\xd7\x00\xfb\x008\xff\xec\x00\xfb\x009\xff\ +\xd7\x00\xfb\x00:\xff\xd7\x00\xfb\x00<\xff\xc3\x00\xfb\x00\ +\x89\xff\xd7\x00\xfb\x00\x94\xff\xd7\x00\xfb\x00\x95\xff\xd7\x00\ +\xfb\x00\x96\xff\xd7\x00\xfb\x00\x97\xff\xd7\x00\xfb\x00\x98\xff\ +\xd7\x00\xfb\x00\x9a\xff\xd7\x00\xfb\x00\x9b\xff\xec\x00\xfb\x00\ +\x9c\xff\xec\x00\xfb\x00\x9d\xff\xec\x00\xfb\x00\x9e\xff\xec\x00\ +\xfb\x00\x9f\xff\xc3\x00\xfb\x00\xc8\xff\xd7\x00\xfb\x00\xca\xff\ +\xd7\x00\xfb\x00\xcc\xff\xd7\x00\xfb\x00\xce\xff\xd7\x00\xfb\x00\ +\xde\xff\xd7\x00\xfb\x00\xe0\xff\xd7\x00\xfb\x00\xe2\xff\xd7\x00\ +\xfb\x00\xe4\xff\xd7\x00\xfb\x01\x0e\xff\xd7\x00\xfb\x01\x10\xff\ +\xd7\x00\xfb\x01\x12\xff\xd7\x00\xfb\x01\x14\xff\xd7\x00\xfb\x01\ +$\xff\xd7\x00\xfb\x01&\xff\xd7\x00\xfb\x01*\xff\xec\x00\ +\xfb\x01,\xff\xec\x00\xfb\x01.\xff\xec\x00\xfb\x010\xff\ +\xec\x00\xfb\x012\xff\xec\x00\xfb\x014\xff\xec\x00\xfb\x01\ +6\xff\xd7\x00\xfb\x018\xff\xc3\x00\xfb\x01:\xff\xc3\x00\ +\xfb\x01G\xff\xd7\x00\xfb\x01\xfa\xff\xd7\x00\xfb\x01\xfc\xff\ +\xd7\x00\xfb\x01\xfe\xff\xd7\x00\xfb\x02\x00\xff\xc3\x00\xfb\x02\ +\x07\xff\x5c\x00\xfb\x02\x0b\xff\x5c\x00\xfb\x02_\xff\xd7\x00\ +\xfb\x02a\xff\xec\x00\xfb\x03I\xff\xd7\x00\xfb\x03K\xff\ +\xd7\x00\xfb\x03M\xff\xd7\x00\xfb\x03O\xff\xd7\x00\xfb\x03\ +Q\xff\xd7\x00\xfb\x03S\xff\xd7\x00\xfb\x03U\xff\xd7\x00\ +\xfb\x03W\xff\xd7\x00\xfb\x03Y\xff\xd7\x00\xfb\x03[\xff\ +\xd7\x00\xfb\x03]\xff\xd7\x00\xfb\x03_\xff\xd7\x00\xfb\x03\ +a\xff\xec\x00\xfb\x03c\xff\xec\x00\xfb\x03e\xff\xec\x00\ +\xfb\x03g\xff\xec\x00\xfb\x03i\xff\xec\x00\xfb\x03k\xff\ +\xec\x00\xfb\x03m\xff\xec\x00\xfb\x03o\xff\xc3\x00\xfb\x03\ +q\xff\xc3\x00\xfb\x03s\xff\xc3\x00\xfb\x03\x8f\xff\xd7\x00\ +\xfd\x00\x05\xff\x5c\x00\xfd\x00\x0a\xff\x5c\x00\xfd\x00&\xff\ +\xd7\x00\xfd\x00*\xff\xd7\x00\xfd\x002\xff\xd7\x00\xfd\x00\ +4\xff\xd7\x00\xfd\x007\xff\xd7\x00\xfd\x008\xff\xec\x00\ +\xfd\x009\xff\xd7\x00\xfd\x00:\xff\xd7\x00\xfd\x00<\xff\ +\xc3\x00\xfd\x00\x89\xff\xd7\x00\xfd\x00\x94\xff\xd7\x00\xfd\x00\ +\x95\xff\xd7\x00\xfd\x00\x96\xff\xd7\x00\xfd\x00\x97\xff\xd7\x00\ +\xfd\x00\x98\xff\xd7\x00\xfd\x00\x9a\xff\xd7\x00\xfd\x00\x9b\xff\ +\xec\x00\xfd\x00\x9c\xff\xec\x00\xfd\x00\x9d\xff\xec\x00\xfd\x00\ +\x9e\xff\xec\x00\xfd\x00\x9f\xff\xc3\x00\xfd\x00\xc8\xff\xd7\x00\ +\xfd\x00\xca\xff\xd7\x00\xfd\x00\xcc\xff\xd7\x00\xfd\x00\xce\xff\ +\xd7\x00\xfd\x00\xde\xff\xd7\x00\xfd\x00\xe0\xff\xd7\x00\xfd\x00\ +\xe2\xff\xd7\x00\xfd\x00\xe4\xff\xd7\x00\xfd\x01\x0e\xff\xd7\x00\ +\xfd\x01\x10\xff\xd7\x00\xfd\x01\x12\xff\xd7\x00\xfd\x01\x14\xff\ +\xd7\x00\xfd\x01$\xff\xd7\x00\xfd\x01&\xff\xd7\x00\xfd\x01\ +*\xff\xec\x00\xfd\x01,\xff\xec\x00\xfd\x01.\xff\xec\x00\ +\xfd\x010\xff\xec\x00\xfd\x012\xff\xec\x00\xfd\x014\xff\ +\xec\x00\xfd\x016\xff\xd7\x00\xfd\x018\xff\xc3\x00\xfd\x01\ +:\xff\xc3\x00\xfd\x01G\xff\xd7\x00\xfd\x01\xfa\xff\xd7\x00\ +\xfd\x01\xfc\xff\xd7\x00\xfd\x01\xfe\xff\xd7\x00\xfd\x02\x00\xff\ +\xc3\x00\xfd\x02\x07\xff\x5c\x00\xfd\x02\x0b\xff\x5c\x00\xfd\x02\ +_\xff\xd7\x00\xfd\x02a\xff\xec\x00\xfd\x03I\xff\xd7\x00\ +\xfd\x03K\xff\xd7\x00\xfd\x03M\xff\xd7\x00\xfd\x03O\xff\ +\xd7\x00\xfd\x03Q\xff\xd7\x00\xfd\x03S\xff\xd7\x00\xfd\x03\ +U\xff\xd7\x00\xfd\x03W\xff\xd7\x00\xfd\x03Y\xff\xd7\x00\ +\xfd\x03[\xff\xd7\x00\xfd\x03]\xff\xd7\x00\xfd\x03_\xff\ +\xd7\x00\xfd\x03a\xff\xec\x00\xfd\x03c\xff\xec\x00\xfd\x03\ +e\xff\xec\x00\xfd\x03g\xff\xec\x00\xfd\x03i\xff\xec\x00\ +\xfd\x03k\xff\xec\x00\xfd\x03m\xff\xec\x00\xfd\x03o\xff\ +\xc3\x00\xfd\x03q\xff\xc3\x00\xfd\x03s\xff\xc3\x00\xfd\x03\ +\x8f\xff\xd7\x00\xff\x00\x05\xff\x5c\x00\xff\x00\x0a\xff\x5c\x00\ +\xff\x00&\xff\xd7\x00\xff\x00*\xff\xd7\x00\xff\x002\xff\ +\xd7\x00\xff\x004\xff\xd7\x00\xff\x007\xff\xd7\x00\xff\x00\ +8\xff\xec\x00\xff\x009\xff\xd7\x00\xff\x00:\xff\xd7\x00\ +\xff\x00<\xff\xc3\x00\xff\x00\x89\xff\xd7\x00\xff\x00\x94\xff\ +\xd7\x00\xff\x00\x95\xff\xd7\x00\xff\x00\x96\xff\xd7\x00\xff\x00\ +\x97\xff\xd7\x00\xff\x00\x98\xff\xd7\x00\xff\x00\x9a\xff\xd7\x00\ +\xff\x00\x9b\xff\xec\x00\xff\x00\x9c\xff\xec\x00\xff\x00\x9d\xff\ +\xec\x00\xff\x00\x9e\xff\xec\x00\xff\x00\x9f\xff\xc3\x00\xff\x00\ +\xc8\xff\xd7\x00\xff\x00\xca\xff\xd7\x00\xff\x00\xcc\xff\xd7\x00\ +\xff\x00\xce\xff\xd7\x00\xff\x00\xde\xff\xd7\x00\xff\x00\xe0\xff\ +\xd7\x00\xff\x00\xe2\xff\xd7\x00\xff\x00\xe4\xff\xd7\x00\xff\x01\ +\x0e\xff\xd7\x00\xff\x01\x10\xff\xd7\x00\xff\x01\x12\xff\xd7\x00\ +\xff\x01\x14\xff\xd7\x00\xff\x01$\xff\xd7\x00\xff\x01&\xff\ +\xd7\x00\xff\x01*\xff\xec\x00\xff\x01,\xff\xec\x00\xff\x01\ +.\xff\xec\x00\xff\x010\xff\xec\x00\xff\x012\xff\xec\x00\ +\xff\x014\xff\xec\x00\xff\x016\xff\xd7\x00\xff\x018\xff\ +\xc3\x00\xff\x01:\xff\xc3\x00\xff\x01G\xff\xd7\x00\xff\x01\ +\xfa\xff\xd7\x00\xff\x01\xfc\xff\xd7\x00\xff\x01\xfe\xff\xd7\x00\ +\xff\x02\x00\xff\xc3\x00\xff\x02\x07\xff\x5c\x00\xff\x02\x0b\xff\ +\x5c\x00\xff\x02_\xff\xd7\x00\xff\x02a\xff\xec\x00\xff\x03\ +I\xff\xd7\x00\xff\x03K\xff\xd7\x00\xff\x03M\xff\xd7\x00\ +\xff\x03O\xff\xd7\x00\xff\x03Q\xff\xd7\x00\xff\x03S\xff\ +\xd7\x00\xff\x03U\xff\xd7\x00\xff\x03W\xff\xd7\x00\xff\x03\ +Y\xff\xd7\x00\xff\x03[\xff\xd7\x00\xff\x03]\xff\xd7\x00\ +\xff\x03_\xff\xd7\x00\xff\x03a\xff\xec\x00\xff\x03c\xff\ +\xec\x00\xff\x03e\xff\xec\x00\xff\x03g\xff\xec\x00\xff\x03\ +i\xff\xec\x00\xff\x03k\xff\xec\x00\xff\x03m\xff\xec\x00\ +\xff\x03o\xff\xc3\x00\xff\x03q\xff\xc3\x00\xff\x03s\xff\ +\xc3\x00\xff\x03\x8f\xff\xd7\x01\x00\x00\x05\x00R\x01\x00\x00\ +\x0a\x00R\x01\x00\x00\x0c\x00\x8f\x01\x00\x00\x22\x00\x8f\x01\ +\x00\x00@\x00\x8f\x01\x00\x00E\x00=\x01\x00\x00K\x00\ +=\x01\x00\x00N\x00=\x01\x00\x00O\x00=\x01\x00\x00\ +`\x00\x8f\x01\x00\x00\xe7\x00=\x01\x00\x00\xe9\x00\x8f\x01\ +\x00\x02\x07\x00R\x01\x00\x02\x0b\x00R\x01\x01\x00\x05\xff\ +\x5c\x01\x01\x00\x0a\xff\x5c\x01\x01\x00&\xff\xd7\x01\x01\x00\ +*\xff\xd7\x01\x01\x002\xff\xd7\x01\x01\x004\xff\xd7\x01\ +\x01\x007\xff\xd7\x01\x01\x008\xff\xec\x01\x01\x009\xff\ +\xd7\x01\x01\x00:\xff\xd7\x01\x01\x00<\xff\xc3\x01\x01\x00\ +\x89\xff\xd7\x01\x01\x00\x94\xff\xd7\x01\x01\x00\x95\xff\xd7\x01\ +\x01\x00\x96\xff\xd7\x01\x01\x00\x97\xff\xd7\x01\x01\x00\x98\xff\ +\xd7\x01\x01\x00\x9a\xff\xd7\x01\x01\x00\x9b\xff\xec\x01\x01\x00\ +\x9c\xff\xec\x01\x01\x00\x9d\xff\xec\x01\x01\x00\x9e\xff\xec\x01\ +\x01\x00\x9f\xff\xc3\x01\x01\x00\xc8\xff\xd7\x01\x01\x00\xca\xff\ +\xd7\x01\x01\x00\xcc\xff\xd7\x01\x01\x00\xce\xff\xd7\x01\x01\x00\ +\xde\xff\xd7\x01\x01\x00\xe0\xff\xd7\x01\x01\x00\xe2\xff\xd7\x01\ +\x01\x00\xe4\xff\xd7\x01\x01\x01\x0e\xff\xd7\x01\x01\x01\x10\xff\ +\xd7\x01\x01\x01\x12\xff\xd7\x01\x01\x01\x14\xff\xd7\x01\x01\x01\ +$\xff\xd7\x01\x01\x01&\xff\xd7\x01\x01\x01*\xff\xec\x01\ +\x01\x01,\xff\xec\x01\x01\x01.\xff\xec\x01\x01\x010\xff\ +\xec\x01\x01\x012\xff\xec\x01\x01\x014\xff\xec\x01\x01\x01\ +6\xff\xd7\x01\x01\x018\xff\xc3\x01\x01\x01:\xff\xc3\x01\ +\x01\x01G\xff\xd7\x01\x01\x01\xfa\xff\xd7\x01\x01\x01\xfc\xff\ +\xd7\x01\x01\x01\xfe\xff\xd7\x01\x01\x02\x00\xff\xc3\x01\x01\x02\ +\x07\xff\x5c\x01\x01\x02\x0b\xff\x5c\x01\x01\x02_\xff\xd7\x01\ +\x01\x02a\xff\xec\x01\x01\x03I\xff\xd7\x01\x01\x03K\xff\ +\xd7\x01\x01\x03M\xff\xd7\x01\x01\x03O\xff\xd7\x01\x01\x03\ +Q\xff\xd7\x01\x01\x03S\xff\xd7\x01\x01\x03U\xff\xd7\x01\ +\x01\x03W\xff\xd7\x01\x01\x03Y\xff\xd7\x01\x01\x03[\xff\ +\xd7\x01\x01\x03]\xff\xd7\x01\x01\x03_\xff\xd7\x01\x01\x03\ +a\xff\xec\x01\x01\x03c\xff\xec\x01\x01\x03e\xff\xec\x01\ +\x01\x03g\xff\xec\x01\x01\x03i\xff\xec\x01\x01\x03k\xff\ +\xec\x01\x01\x03m\xff\xec\x01\x01\x03o\xff\xc3\x01\x01\x03\ +q\xff\xc3\x01\x01\x03s\xff\xc3\x01\x01\x03\x8f\xff\xd7\x01\ +\x03\x00\x05\xff\x5c\x01\x03\x00\x0a\xff\x5c\x01\x03\x00&\xff\ +\xd7\x01\x03\x00*\xff\xd7\x01\x03\x002\xff\xd7\x01\x03\x00\ +4\xff\xd7\x01\x03\x007\xff\xd7\x01\x03\x008\xff\xec\x01\ +\x03\x009\xff\xd7\x01\x03\x00:\xff\xd7\x01\x03\x00<\xff\ +\xc3\x01\x03\x00\x89\xff\xd7\x01\x03\x00\x94\xff\xd7\x01\x03\x00\ +\x95\xff\xd7\x01\x03\x00\x96\xff\xd7\x01\x03\x00\x97\xff\xd7\x01\ +\x03\x00\x98\xff\xd7\x01\x03\x00\x9a\xff\xd7\x01\x03\x00\x9b\xff\ +\xec\x01\x03\x00\x9c\xff\xec\x01\x03\x00\x9d\xff\xec\x01\x03\x00\ +\x9e\xff\xec\x01\x03\x00\x9f\xff\xc3\x01\x03\x00\xc8\xff\xd7\x01\ +\x03\x00\xca\xff\xd7\x01\x03\x00\xcc\xff\xd7\x01\x03\x00\xce\xff\ +\xd7\x01\x03\x00\xde\xff\xd7\x01\x03\x00\xe0\xff\xd7\x01\x03\x00\ +\xe2\xff\xd7\x01\x03\x00\xe4\xff\xd7\x01\x03\x01\x0e\xff\xd7\x01\ +\x03\x01\x10\xff\xd7\x01\x03\x01\x12\xff\xd7\x01\x03\x01\x14\xff\ +\xd7\x01\x03\x01$\xff\xd7\x01\x03\x01&\xff\xd7\x01\x03\x01\ +*\xff\xec\x01\x03\x01,\xff\xec\x01\x03\x01.\xff\xec\x01\ +\x03\x010\xff\xec\x01\x03\x012\xff\xec\x01\x03\x014\xff\ +\xec\x01\x03\x016\xff\xd7\x01\x03\x018\xff\xc3\x01\x03\x01\ +:\xff\xc3\x01\x03\x01G\xff\xd7\x01\x03\x01\xfa\xff\xd7\x01\ +\x03\x01\xfc\xff\xd7\x01\x03\x01\xfe\xff\xd7\x01\x03\x02\x00\xff\ +\xc3\x01\x03\x02\x07\xff\x5c\x01\x03\x02\x0b\xff\x5c\x01\x03\x02\ +_\xff\xd7\x01\x03\x02a\xff\xec\x01\x03\x03I\xff\xd7\x01\ +\x03\x03K\xff\xd7\x01\x03\x03M\xff\xd7\x01\x03\x03O\xff\ +\xd7\x01\x03\x03Q\xff\xd7\x01\x03\x03S\xff\xd7\x01\x03\x03\ +U\xff\xd7\x01\x03\x03W\xff\xd7\x01\x03\x03Y\xff\xd7\x01\ +\x03\x03[\xff\xd7\x01\x03\x03]\xff\xd7\x01\x03\x03_\xff\ +\xd7\x01\x03\x03a\xff\xec\x01\x03\x03c\xff\xec\x01\x03\x03\ +e\xff\xec\x01\x03\x03g\xff\xec\x01\x03\x03i\xff\xec\x01\ +\x03\x03k\xff\xec\x01\x03\x03m\xff\xec\x01\x03\x03o\xff\ +\xc3\x01\x03\x03q\xff\xc3\x01\x03\x03s\xff\xc3\x01\x03\x03\ +\x8f\xff\xd7\x01\x08\x00\x05\xff\xec\x01\x08\x00\x0a\xff\xec\x01\ +\x08\x02\x07\xff\xec\x01\x08\x02\x0b\xff\xec\x01\x0e\x00\x0f\xff\ +\xae\x01\x0e\x00\x11\xff\xae\x01\x0e\x00$\xff\xd7\x01\x0e\x00\ +7\xff\xc3\x01\x0e\x009\xff\xec\x01\x0e\x00:\xff\xec\x01\ +\x0e\x00;\xff\xd7\x01\x0e\x00<\xff\xec\x01\x0e\x00=\xff\ +\xec\x01\x0e\x00\x82\xff\xd7\x01\x0e\x00\x83\xff\xd7\x01\x0e\x00\ +\x84\xff\xd7\x01\x0e\x00\x85\xff\xd7\x01\x0e\x00\x86\xff\xd7\x01\ +\x0e\x00\x87\xff\xd7\x01\x0e\x00\x9f\xff\xec\x01\x0e\x00\xc2\xff\ +\xd7\x01\x0e\x00\xc4\xff\xd7\x01\x0e\x00\xc6\xff\xd7\x01\x0e\x01\ +$\xff\xc3\x01\x0e\x01&\xff\xc3\x01\x0e\x016\xff\xec\x01\ +\x0e\x018\xff\xec\x01\x0e\x01:\xff\xec\x01\x0e\x01;\xff\ +\xec\x01\x0e\x01=\xff\xec\x01\x0e\x01?\xff\xec\x01\x0e\x01\ +C\xff\xd7\x01\x0e\x01\xa0\xff\xec\x01\x0e\x01\xfa\xff\xec\x01\ +\x0e\x01\xfc\xff\xec\x01\x0e\x01\xfe\xff\xec\x01\x0e\x02\x00\xff\ +\xec\x01\x0e\x02\x08\xff\xae\x01\x0e\x02\x0c\xff\xae\x01\x0e\x02\ +X\xff\xd7\x01\x0e\x03\x1d\xff\xd7\x01\x0e\x03\x1f\xff\xd7\x01\ +\x0e\x03!\xff\xd7\x01\x0e\x03#\xff\xd7\x01\x0e\x03%\xff\ +\xd7\x01\x0e\x03'\xff\xd7\x01\x0e\x03)\xff\xd7\x01\x0e\x03\ ++\xff\xd7\x01\x0e\x03-\xff\xd7\x01\x0e\x03/\xff\xd7\x01\ +\x0e\x031\xff\xd7\x01\x0e\x033\xff\xd7\x01\x0e\x03o\xff\ +\xec\x01\x0e\x03q\xff\xec\x01\x0e\x03s\xff\xec\x01\x0e\x03\ +\x8f\xff\xc3\x01\x10\x00\x0f\xff\xae\x01\x10\x00\x11\xff\xae\x01\ +\x10\x00$\xff\xd7\x01\x10\x007\xff\xc3\x01\x10\x009\xff\ +\xec\x01\x10\x00:\xff\xec\x01\x10\x00;\xff\xd7\x01\x10\x00\ +<\xff\xec\x01\x10\x00=\xff\xec\x01\x10\x00\x82\xff\xd7\x01\ +\x10\x00\x83\xff\xd7\x01\x10\x00\x84\xff\xd7\x01\x10\x00\x85\xff\ +\xd7\x01\x10\x00\x86\xff\xd7\x01\x10\x00\x87\xff\xd7\x01\x10\x00\ +\x9f\xff\xec\x01\x10\x00\xc2\xff\xd7\x01\x10\x00\xc4\xff\xd7\x01\ +\x10\x00\xc6\xff\xd7\x01\x10\x01$\xff\xc3\x01\x10\x01&\xff\ +\xc3\x01\x10\x016\xff\xec\x01\x10\x018\xff\xec\x01\x10\x01\ +:\xff\xec\x01\x10\x01;\xff\xec\x01\x10\x01=\xff\xec\x01\ +\x10\x01?\xff\xec\x01\x10\x01C\xff\xd7\x01\x10\x01\xa0\xff\ +\xec\x01\x10\x01\xfa\xff\xec\x01\x10\x01\xfc\xff\xec\x01\x10\x01\ +\xfe\xff\xec\x01\x10\x02\x00\xff\xec\x01\x10\x02\x08\xff\xae\x01\ +\x10\x02\x0c\xff\xae\x01\x10\x02X\xff\xd7\x01\x10\x03\x1d\xff\ +\xd7\x01\x10\x03\x1f\xff\xd7\x01\x10\x03!\xff\xd7\x01\x10\x03\ +#\xff\xd7\x01\x10\x03%\xff\xd7\x01\x10\x03'\xff\xd7\x01\ +\x10\x03)\xff\xd7\x01\x10\x03+\xff\xd7\x01\x10\x03-\xff\ +\xd7\x01\x10\x03/\xff\xd7\x01\x10\x031\xff\xd7\x01\x10\x03\ +3\xff\xd7\x01\x10\x03o\xff\xec\x01\x10\x03q\xff\xec\x01\ +\x10\x03s\xff\xec\x01\x10\x03\x8f\xff\xc3\x01\x12\x00\x0f\xff\ +\xae\x01\x12\x00\x11\xff\xae\x01\x12\x00$\xff\xd7\x01\x12\x00\ +7\xff\xc3\x01\x12\x009\xff\xec\x01\x12\x00:\xff\xec\x01\ +\x12\x00;\xff\xd7\x01\x12\x00<\xff\xec\x01\x12\x00=\xff\ +\xec\x01\x12\x00\x82\xff\xd7\x01\x12\x00\x83\xff\xd7\x01\x12\x00\ +\x84\xff\xd7\x01\x12\x00\x85\xff\xd7\x01\x12\x00\x86\xff\xd7\x01\ +\x12\x00\x87\xff\xd7\x01\x12\x00\x9f\xff\xec\x01\x12\x00\xc2\xff\ +\xd7\x01\x12\x00\xc4\xff\xd7\x01\x12\x00\xc6\xff\xd7\x01\x12\x01\ +$\xff\xc3\x01\x12\x01&\xff\xc3\x01\x12\x016\xff\xec\x01\ +\x12\x018\xff\xec\x01\x12\x01:\xff\xec\x01\x12\x01;\xff\ +\xec\x01\x12\x01=\xff\xec\x01\x12\x01?\xff\xec\x01\x12\x01\ +C\xff\xd7\x01\x12\x01\xa0\xff\xec\x01\x12\x01\xfa\xff\xec\x01\ +\x12\x01\xfc\xff\xec\x01\x12\x01\xfe\xff\xec\x01\x12\x02\x00\xff\ +\xec\x01\x12\x02\x08\xff\xae\x01\x12\x02\x0c\xff\xae\x01\x12\x02\ +X\xff\xd7\x01\x12\x03\x1d\xff\xd7\x01\x12\x03\x1f\xff\xd7\x01\ +\x12\x03!\xff\xd7\x01\x12\x03#\xff\xd7\x01\x12\x03%\xff\ +\xd7\x01\x12\x03'\xff\xd7\x01\x12\x03)\xff\xd7\x01\x12\x03\ ++\xff\xd7\x01\x12\x03-\xff\xd7\x01\x12\x03/\xff\xd7\x01\ +\x12\x031\xff\xd7\x01\x12\x033\xff\xd7\x01\x12\x03o\xff\ +\xec\x01\x12\x03q\xff\xec\x01\x12\x03s\xff\xec\x01\x12\x03\ +\x8f\xff\xc3\x01\x14\x00-\x00{\x01\x17\x00\x05\x00R\x01\ +\x17\x00\x0a\x00R\x01\x17\x00D\xff\xd7\x01\x17\x00F\xff\ +\xd7\x01\x17\x00G\xff\xd7\x01\x17\x00H\xff\xd7\x01\x17\x00\ +J\xff\xec\x01\x17\x00R\xff\xd7\x01\x17\x00T\xff\xd7\x01\ +\x17\x00\xa2\xff\xd7\x01\x17\x00\xa3\xff\xd7\x01\x17\x00\xa4\xff\ +\xd7\x01\x17\x00\xa5\xff\xd7\x01\x17\x00\xa6\xff\xd7\x01\x17\x00\ +\xa7\xff\xd7\x01\x17\x00\xa8\xff\xd7\x01\x17\x00\xa9\xff\xd7\x01\ +\x17\x00\xaa\xff\xd7\x01\x17\x00\xab\xff\xd7\x01\x17\x00\xac\xff\ +\xd7\x01\x17\x00\xad\xff\xd7\x01\x17\x00\xb4\xff\xd7\x01\x17\x00\ +\xb5\xff\xd7\x01\x17\x00\xb6\xff\xd7\x01\x17\x00\xb7\xff\xd7\x01\ +\x17\x00\xb8\xff\xd7\x01\x17\x00\xba\xff\xd7\x01\x17\x00\xc3\xff\ +\xd7\x01\x17\x00\xc5\xff\xd7\x01\x17\x00\xc7\xff\xd7\x01\x17\x00\ +\xc9\xff\xd7\x01\x17\x00\xcb\xff\xd7\x01\x17\x00\xcd\xff\xd7\x01\ +\x17\x00\xcf\xff\xd7\x01\x17\x00\xd1\xff\xd7\x01\x17\x00\xd3\xff\ +\xd7\x01\x17\x00\xd5\xff\xd7\x01\x17\x00\xd7\xff\xd7\x01\x17\x00\ +\xd9\xff\xd7\x01\x17\x00\xdb\xff\xd7\x01\x17\x00\xdd\xff\xd7\x01\ +\x17\x00\xdf\xff\xec\x01\x17\x00\xe1\xff\xec\x01\x17\x00\xe3\xff\ +\xec\x01\x17\x00\xe5\xff\xec\x01\x17\x01\x0f\xff\xd7\x01\x17\x01\ +\x11\xff\xd7\x01\x17\x01\x13\xff\xd7\x01\x17\x01\x15\xff\xd7\x01\ +\x17\x01D\xff\xd7\x01\x17\x01F\xff\xd7\x01\x17\x01H\xff\ +\xd7\x01\x17\x02\x07\x00R\x01\x17\x02\x0b\x00R\x01\x17\x02\ +Y\xff\xd7\x01\x17\x02`\xff\xd7\x01\x17\x03\x1e\xff\xd7\x01\ +\x17\x03 \xff\xd7\x01\x17\x03\x22\xff\xd7\x01\x17\x03&\xff\ +\xd7\x01\x17\x03(\xff\xd7\x01\x17\x03*\xff\xd7\x01\x17\x03\ +,\xff\xd7\x01\x17\x03.\xff\xd7\x01\x17\x030\xff\xd7\x01\ +\x17\x032\xff\xd7\x01\x17\x034\xff\xd7\x01\x17\x036\xff\ +\xd7\x01\x17\x038\xff\xd7\x01\x17\x03:\xff\xd7\x01\x17\x03\ +<\xff\xd7\x01\x17\x03@\xff\xd7\x01\x17\x03B\xff\xd7\x01\ +\x17\x03D\xff\xd7\x01\x17\x03J\xff\xd7\x01\x17\x03L\xff\ +\xd7\x01\x17\x03N\xff\xd7\x01\x17\x03R\xff\xd7\x01\x17\x03\ +T\xff\xd7\x01\x17\x03V\xff\xd7\x01\x17\x03X\xff\xd7\x01\ +\x17\x03Z\xff\xd7\x01\x17\x03\x5c\xff\xd7\x01\x17\x03^\xff\ +\xd7\x01\x17\x03`\xff\xd7\x01\x19\x00\x05\x00R\x01\x19\x00\ +\x0a\x00R\x01\x19\x00D\xff\xd7\x01\x19\x00F\xff\xd7\x01\ +\x19\x00G\xff\xd7\x01\x19\x00H\xff\xd7\x01\x19\x00J\xff\ +\xec\x01\x19\x00R\xff\xd7\x01\x19\x00T\xff\xd7\x01\x19\x00\ +\xa2\xff\xd7\x01\x19\x00\xa3\xff\xd7\x01\x19\x00\xa4\xff\xd7\x01\ +\x19\x00\xa5\xff\xd7\x01\x19\x00\xa6\xff\xd7\x01\x19\x00\xa7\xff\ +\xd7\x01\x19\x00\xa8\xff\xd7\x01\x19\x00\xa9\xff\xd7\x01\x19\x00\ +\xaa\xff\xd7\x01\x19\x00\xab\xff\xd7\x01\x19\x00\xac\xff\xd7\x01\ +\x19\x00\xad\xff\xd7\x01\x19\x00\xb4\xff\xd7\x01\x19\x00\xb5\xff\ +\xd7\x01\x19\x00\xb6\xff\xd7\x01\x19\x00\xb7\xff\xd7\x01\x19\x00\ +\xb8\xff\xd7\x01\x19\x00\xba\xff\xd7\x01\x19\x00\xc3\xff\xd7\x01\ +\x19\x00\xc5\xff\xd7\x01\x19\x00\xc7\xff\xd7\x01\x19\x00\xc9\xff\ +\xd7\x01\x19\x00\xcb\xff\xd7\x01\x19\x00\xcd\xff\xd7\x01\x19\x00\ +\xcf\xff\xd7\x01\x19\x00\xd1\xff\xd7\x01\x19\x00\xd3\xff\xd7\x01\ +\x19\x00\xd5\xff\xd7\x01\x19\x00\xd7\xff\xd7\x01\x19\x00\xd9\xff\ +\xd7\x01\x19\x00\xdb\xff\xd7\x01\x19\x00\xdd\xff\xd7\x01\x19\x00\ +\xdf\xff\xec\x01\x19\x00\xe1\xff\xec\x01\x19\x00\xe3\xff\xec\x01\ +\x19\x00\xe5\xff\xec\x01\x19\x01\x0f\xff\xd7\x01\x19\x01\x11\xff\ +\xd7\x01\x19\x01\x13\xff\xd7\x01\x19\x01\x15\xff\xd7\x01\x19\x01\ +D\xff\xd7\x01\x19\x01F\xff\xd7\x01\x19\x01H\xff\xd7\x01\ +\x19\x02\x07\x00R\x01\x19\x02\x0b\x00R\x01\x19\x02Y\xff\ +\xd7\x01\x19\x02`\xff\xd7\x01\x19\x03\x1e\xff\xd7\x01\x19\x03\ + \xff\xd7\x01\x19\x03\x22\xff\xd7\x01\x19\x03&\xff\xd7\x01\ +\x19\x03(\xff\xd7\x01\x19\x03*\xff\xd7\x01\x19\x03,\xff\ +\xd7\x01\x19\x03.\xff\xd7\x01\x19\x030\xff\xd7\x01\x19\x03\ +2\xff\xd7\x01\x19\x034\xff\xd7\x01\x19\x036\xff\xd7\x01\ +\x19\x038\xff\xd7\x01\x19\x03:\xff\xd7\x01\x19\x03<\xff\ +\xd7\x01\x19\x03@\xff\xd7\x01\x19\x03B\xff\xd7\x01\x19\x03\ +D\xff\xd7\x01\x19\x03J\xff\xd7\x01\x19\x03L\xff\xd7\x01\ +\x19\x03N\xff\xd7\x01\x19\x03R\xff\xd7\x01\x19\x03T\xff\ +\xd7\x01\x19\x03V\xff\xd7\x01\x19\x03X\xff\xd7\x01\x19\x03\ +Z\xff\xd7\x01\x19\x03\x5c\xff\xd7\x01\x19\x03^\xff\xd7\x01\ +\x19\x03`\xff\xd7\x01\x1b\x00\x05\x00R\x01\x1b\x00\x0a\x00\ +R\x01\x1b\x00D\xff\xd7\x01\x1b\x00F\xff\xd7\x01\x1b\x00\ +G\xff\xd7\x01\x1b\x00H\xff\xd7\x01\x1b\x00J\xff\xec\x01\ +\x1b\x00R\xff\xd7\x01\x1b\x00T\xff\xd7\x01\x1b\x00\xa2\xff\ +\xd7\x01\x1b\x00\xa3\xff\xd7\x01\x1b\x00\xa4\xff\xd7\x01\x1b\x00\ +\xa5\xff\xd7\x01\x1b\x00\xa6\xff\xd7\x01\x1b\x00\xa7\xff\xd7\x01\ +\x1b\x00\xa8\xff\xd7\x01\x1b\x00\xa9\xff\xd7\x01\x1b\x00\xaa\xff\ +\xd7\x01\x1b\x00\xab\xff\xd7\x01\x1b\x00\xac\xff\xd7\x01\x1b\x00\ +\xad\xff\xd7\x01\x1b\x00\xb4\xff\xd7\x01\x1b\x00\xb5\xff\xd7\x01\ +\x1b\x00\xb6\xff\xd7\x01\x1b\x00\xb7\xff\xd7\x01\x1b\x00\xb8\xff\ +\xd7\x01\x1b\x00\xba\xff\xd7\x01\x1b\x00\xc3\xff\xd7\x01\x1b\x00\ +\xc5\xff\xd7\x01\x1b\x00\xc7\xff\xd7\x01\x1b\x00\xc9\xff\xd7\x01\ +\x1b\x00\xcb\xff\xd7\x01\x1b\x00\xcd\xff\xd7\x01\x1b\x00\xcf\xff\ +\xd7\x01\x1b\x00\xd1\xff\xd7\x01\x1b\x00\xd3\xff\xd7\x01\x1b\x00\ +\xd5\xff\xd7\x01\x1b\x00\xd7\xff\xd7\x01\x1b\x00\xd9\xff\xd7\x01\ +\x1b\x00\xdb\xff\xd7\x01\x1b\x00\xdd\xff\xd7\x01\x1b\x00\xdf\xff\ +\xec\x01\x1b\x00\xe1\xff\xec\x01\x1b\x00\xe3\xff\xec\x01\x1b\x00\ +\xe5\xff\xec\x01\x1b\x01\x0f\xff\xd7\x01\x1b\x01\x11\xff\xd7\x01\ +\x1b\x01\x13\xff\xd7\x01\x1b\x01\x15\xff\xd7\x01\x1b\x01D\xff\ +\xd7\x01\x1b\x01F\xff\xd7\x01\x1b\x01H\xff\xd7\x01\x1b\x02\ +\x07\x00R\x01\x1b\x02\x0b\x00R\x01\x1b\x02Y\xff\xd7\x01\ +\x1b\x02`\xff\xd7\x01\x1b\x03\x1e\xff\xd7\x01\x1b\x03 \xff\ +\xd7\x01\x1b\x03\x22\xff\xd7\x01\x1b\x03&\xff\xd7\x01\x1b\x03\ +(\xff\xd7\x01\x1b\x03*\xff\xd7\x01\x1b\x03,\xff\xd7\x01\ +\x1b\x03.\xff\xd7\x01\x1b\x030\xff\xd7\x01\x1b\x032\xff\ +\xd7\x01\x1b\x034\xff\xd7\x01\x1b\x036\xff\xd7\x01\x1b\x03\ +8\xff\xd7\x01\x1b\x03:\xff\xd7\x01\x1b\x03<\xff\xd7\x01\ +\x1b\x03@\xff\xd7\x01\x1b\x03B\xff\xd7\x01\x1b\x03D\xff\ +\xd7\x01\x1b\x03J\xff\xd7\x01\x1b\x03L\xff\xd7\x01\x1b\x03\ +N\xff\xd7\x01\x1b\x03R\xff\xd7\x01\x1b\x03T\xff\xd7\x01\ +\x1b\x03V\xff\xd7\x01\x1b\x03X\xff\xd7\x01\x1b\x03Z\xff\ +\xd7\x01\x1b\x03\x5c\xff\xd7\x01\x1b\x03^\xff\xd7\x01\x1b\x03\ +`\xff\xd7\x01$\x00\x0f\xff\x85\x01$\x00\x10\xff\xae\x01\ +$\x00\x11\xff\x85\x01$\x00\x22\x00)\x01$\x00$\xff\ +q\x01$\x00&\xff\xd7\x01$\x00*\xff\xd7\x01$\x00\ +2\xff\xd7\x01$\x004\xff\xd7\x01$\x007\x00)\x01\ +$\x00D\xff\x5c\x01$\x00F\xffq\x01$\x00G\xff\ +q\x01$\x00H\xffq\x01$\x00J\xffq\x01$\x00\ +P\xff\x9a\x01$\x00Q\xff\x9a\x01$\x00R\xffq\x01\ +$\x00S\xff\x9a\x01$\x00T\xffq\x01$\x00U\xff\ +\x9a\x01$\x00V\xff\x85\x01$\x00X\xff\x9a\x01$\x00\ +Y\xff\xd7\x01$\x00Z\xff\xd7\x01$\x00[\xff\xd7\x01\ +$\x00\x5c\xff\xd7\x01$\x00]\xff\xae\x01$\x00\x82\xff\ +q\x01$\x00\x83\xffq\x01$\x00\x84\xffq\x01$\x00\ +\x85\xffq\x01$\x00\x86\xffq\x01$\x00\x87\xffq\x01\ +$\x00\x89\xff\xd7\x01$\x00\x94\xff\xd7\x01$\x00\x95\xff\ +\xd7\x01$\x00\x96\xff\xd7\x01$\x00\x97\xff\xd7\x01$\x00\ +\x98\xff\xd7\x01$\x00\x9a\xff\xd7\x01$\x00\xa2\xffq\x01\ +$\x00\xa3\xff\x5c\x01$\x00\xa4\xff\x5c\x01$\x00\xa5\xff\ +\x5c\x01$\x00\xa6\xff\x5c\x01$\x00\xa7\xff\x5c\x01$\x00\ +\xa8\xff\x5c\x01$\x00\xa9\xffq\x01$\x00\xaa\xffq\x01\ +$\x00\xab\xffq\x01$\x00\xac\xffq\x01$\x00\xad\xff\ +q\x01$\x00\xb4\xffq\x01$\x00\xb5\xffq\x01$\x00\ +\xb6\xffq\x01$\x00\xb7\xffq\x01$\x00\xb8\xffq\x01\ +$\x00\xba\xffq\x01$\x00\xbb\xff\x9a\x01$\x00\xbc\xff\ +\x9a\x01$\x00\xbd\xff\x9a\x01$\x00\xbe\xff\x9a\x01$\x00\ +\xbf\xff\xd7\x01$\x00\xc2\xffq\x01$\x00\xc3\xff\x5c\x01\ +$\x00\xc4\xffq\x01$\x00\xc5\xff\x5c\x01$\x00\xc6\xff\ +q\x01$\x00\xc7\xff\x5c\x01$\x00\xc8\xff\xd7\x01$\x00\ +\xc9\xffq\x01$\x00\xca\xff\xd7\x01$\x00\xcb\xffq\x01\ +$\x00\xcc\xff\xd7\x01$\x00\xcd\xffq\x01$\x00\xce\xff\ +\xd7\x01$\x00\xcf\xffq\x01$\x00\xd1\xffq\x01$\x00\ +\xd3\xffq\x01$\x00\xd5\xffq\x01$\x00\xd7\xffq\x01\ +$\x00\xd9\xffq\x01$\x00\xdb\xffq\x01$\x00\xdd\xff\ +q\x01$\x00\xde\xff\xd7\x01$\x00\xdf\xffq\x01$\x00\ +\xe0\xff\xd7\x01$\x00\xe1\xffq\x01$\x00\xe2\xff\xd7\x01\ +$\x00\xe3\xffq\x01$\x00\xe4\xff\xd7\x01$\x00\xe5\xff\ +q\x01$\x00\xfa\xff\x9a\x01$\x01\x06\xff\x9a\x01$\x01\ +\x08\xff\x9a\x01$\x01\x0d\xff\x9a\x01$\x01\x0e\xff\xd7\x01\ +$\x01\x0f\xffq\x01$\x01\x10\xff\xd7\x01$\x01\x11\xff\ +q\x01$\x01\x12\xff\xd7\x01$\x01\x13\xffq\x01$\x01\ +\x14\xff\xd7\x01$\x01\x15\xffq\x01$\x01\x17\xff\x9a\x01\ +$\x01\x19\xff\x9a\x01$\x01\x1d\xff\x85\x01$\x01!\xff\ +\x85\x01$\x01$\x00)\x01$\x01&\x00)\x01$\x01\ ++\xff\x9a\x01$\x01-\xff\x9a\x01$\x01/\xff\x9a\x01\ +$\x011\xff\x9a\x01$\x013\xff\x9a\x01$\x015\xff\ +\x9a\x01$\x017\xff\xd7\x01$\x01<\xff\xae\x01$\x01\ +>\xff\xae\x01$\x01@\xff\xae\x01$\x01C\xffq\x01\ +$\x01D\xff\x5c\x01$\x01F\xff\x5c\x01$\x01G\xff\ +\xd7\x01$\x01H\xffq\x01$\x01J\xff\x85\x01$\x01\ +\xfb\xff\xd7\x01$\x01\xfd\xff\xd7\x01$\x02\x02\xff\xae\x01\ +$\x02\x03\xff\xae\x01$\x02\x04\xff\xae\x01$\x02\x08\xff\ +\x85\x01$\x02\x0c\xff\x85\x01$\x02W\xff\x9a\x01$\x02\ +X\xffq\x01$\x02Y\xff\x5c\x01$\x02_\xff\xd7\x01\ +$\x02`\xffq\x01$\x02b\xff\x9a\x01$\x03\x1d\xff\ +q\x01$\x03\x1e\xff\x5c\x01$\x03\x1f\xffq\x01$\x03\ + \xff\x5c\x01$\x03!\xffq\x01$\x03\x22\xff\x5c\x01\ +$\x03#\xffq\x01$\x03%\xffq\x01$\x03&\xff\ +\x5c\x01$\x03'\xffq\x01$\x03(\xff\x5c\x01$\x03\ +)\xffq\x01$\x03*\xff\x5c\x01$\x03+\xffq\x01\ +$\x03,\xff\x5c\x01$\x03-\xffq\x01$\x03.\xff\ +\x5c\x01$\x03/\xffq\x01$\x030\xff\x5c\x01$\x03\ +1\xffq\x01$\x032\xff\x5c\x01$\x033\xffq\x01\ +$\x034\xff\x5c\x01$\x036\xffq\x01$\x038\xff\ +q\x01$\x03:\xffq\x01$\x03<\xffq\x01$\x03\ +@\xffq\x01$\x03B\xffq\x01$\x03D\xffq\x01\ +$\x03I\xff\xd7\x01$\x03J\xffq\x01$\x03K\xff\ +\xd7\x01$\x03L\xffq\x01$\x03M\xff\xd7\x01$\x03\ +N\xffq\x01$\x03O\xff\xd7\x01$\x03Q\xff\xd7\x01\ +$\x03R\xffq\x01$\x03S\xff\xd7\x01$\x03T\xff\ +q\x01$\x03U\xff\xd7\x01$\x03V\xffq\x01$\x03\ +W\xff\xd7\x01$\x03X\xffq\x01$\x03Y\xff\xd7\x01\ +$\x03Z\xffq\x01$\x03[\xff\xd7\x01$\x03\x5c\xff\ +q\x01$\x03]\xff\xd7\x01$\x03^\xffq\x01$\x03\ +_\xff\xd7\x01$\x03`\xffq\x01$\x03b\xff\x9a\x01\ +$\x03d\xff\x9a\x01$\x03f\xff\x9a\x01$\x03h\xff\ +\x9a\x01$\x03j\xff\x9a\x01$\x03l\xff\x9a\x01$\x03\ +n\xff\x9a\x01$\x03p\xff\xd7\x01$\x03\x8f\x00)\x01\ +%\x00\x05\x00)\x01%\x00\x0a\x00)\x01%\x02\x07\x00\ +)\x01%\x02\x0b\x00)\x01&\x00\x0f\xff\x85\x01&\x00\ +\x10\xff\xae\x01&\x00\x11\xff\x85\x01&\x00\x22\x00)\x01\ +&\x00$\xffq\x01&\x00&\xff\xd7\x01&\x00*\xff\ +\xd7\x01&\x002\xff\xd7\x01&\x004\xff\xd7\x01&\x00\ +7\x00)\x01&\x00D\xff\x5c\x01&\x00F\xffq\x01\ +&\x00G\xffq\x01&\x00H\xffq\x01&\x00J\xff\ +q\x01&\x00P\xff\x9a\x01&\x00Q\xff\x9a\x01&\x00\ +R\xffq\x01&\x00S\xff\x9a\x01&\x00T\xffq\x01\ +&\x00U\xff\x9a\x01&\x00V\xff\x85\x01&\x00X\xff\ +\x9a\x01&\x00Y\xff\xd7\x01&\x00Z\xff\xd7\x01&\x00\ +[\xff\xd7\x01&\x00\x5c\xff\xd7\x01&\x00]\xff\xae\x01\ +&\x00\x82\xffq\x01&\x00\x83\xffq\x01&\x00\x84\xff\ +q\x01&\x00\x85\xffq\x01&\x00\x86\xffq\x01&\x00\ +\x87\xffq\x01&\x00\x89\xff\xd7\x01&\x00\x94\xff\xd7\x01\ +&\x00\x95\xff\xd7\x01&\x00\x96\xff\xd7\x01&\x00\x97\xff\ +\xd7\x01&\x00\x98\xff\xd7\x01&\x00\x9a\xff\xd7\x01&\x00\ +\xa2\xffq\x01&\x00\xa3\xff\x5c\x01&\x00\xa4\xff\x5c\x01\ +&\x00\xa5\xff\x5c\x01&\x00\xa6\xff\x5c\x01&\x00\xa7\xff\ +\x5c\x01&\x00\xa8\xff\x5c\x01&\x00\xa9\xffq\x01&\x00\ +\xaa\xffq\x01&\x00\xab\xffq\x01&\x00\xac\xffq\x01\ +&\x00\xad\xffq\x01&\x00\xb4\xffq\x01&\x00\xb5\xff\ +q\x01&\x00\xb6\xffq\x01&\x00\xb7\xffq\x01&\x00\ +\xb8\xffq\x01&\x00\xba\xffq\x01&\x00\xbb\xff\x9a\x01\ +&\x00\xbc\xff\x9a\x01&\x00\xbd\xff\x9a\x01&\x00\xbe\xff\ +\x9a\x01&\x00\xbf\xff\xd7\x01&\x00\xc2\xffq\x01&\x00\ +\xc3\xff\x5c\x01&\x00\xc4\xffq\x01&\x00\xc5\xff\x5c\x01\ +&\x00\xc6\xffq\x01&\x00\xc7\xff\x5c\x01&\x00\xc8\xff\ +\xd7\x01&\x00\xc9\xffq\x01&\x00\xca\xff\xd7\x01&\x00\ +\xcb\xffq\x01&\x00\xcc\xff\xd7\x01&\x00\xcd\xffq\x01\ +&\x00\xce\xff\xd7\x01&\x00\xcf\xffq\x01&\x00\xd1\xff\ +q\x01&\x00\xd3\xffq\x01&\x00\xd5\xffq\x01&\x00\ +\xd7\xffq\x01&\x00\xd9\xffq\x01&\x00\xdb\xffq\x01\ +&\x00\xdd\xffq\x01&\x00\xde\xff\xd7\x01&\x00\xdf\xff\ +q\x01&\x00\xe0\xff\xd7\x01&\x00\xe1\xffq\x01&\x00\ +\xe2\xff\xd7\x01&\x00\xe3\xffq\x01&\x00\xe4\xff\xd7\x01\ +&\x00\xe5\xffq\x01&\x00\xfa\xff\x9a\x01&\x01\x06\xff\ +\x9a\x01&\x01\x08\xff\x9a\x01&\x01\x0d\xff\x9a\x01&\x01\ +\x0e\xff\xd7\x01&\x01\x0f\xffq\x01&\x01\x10\xff\xd7\x01\ +&\x01\x11\xffq\x01&\x01\x12\xff\xd7\x01&\x01\x13\xff\ +q\x01&\x01\x14\xff\xd7\x01&\x01\x15\xffq\x01&\x01\ +\x17\xff\x9a\x01&\x01\x19\xff\x9a\x01&\x01\x1d\xff\x85\x01\ +&\x01!\xff\x85\x01&\x01$\x00)\x01&\x01&\x00\ +)\x01&\x01+\xff\x9a\x01&\x01-\xff\x9a\x01&\x01\ +/\xff\x9a\x01&\x011\xff\x9a\x01&\x013\xff\x9a\x01\ +&\x015\xff\x9a\x01&\x017\xff\xd7\x01&\x01<\xff\ +\xae\x01&\x01>\xff\xae\x01&\x01@\xff\xae\x01&\x01\ +C\xffq\x01&\x01D\xff\x5c\x01&\x01F\xff\x5c\x01\ +&\x01G\xff\xd7\x01&\x01H\xffq\x01&\x01J\xff\ +\x85\x01&\x01\xfb\xff\xd7\x01&\x01\xfd\xff\xd7\x01&\x02\ +\x02\xff\xae\x01&\x02\x03\xff\xae\x01&\x02\x04\xff\xae\x01\ +&\x02\x08\xff\x85\x01&\x02\x0c\xff\x85\x01&\x02W\xff\ +\x9a\x01&\x02X\xffq\x01&\x02Y\xff\x5c\x01&\x02\ +_\xff\xd7\x01&\x02`\xffq\x01&\x02b\xff\x9a\x01\ +&\x03\x1d\xffq\x01&\x03\x1e\xff\x5c\x01&\x03\x1f\xff\ +q\x01&\x03 \xff\x5c\x01&\x03!\xffq\x01&\x03\ +\x22\xff\x5c\x01&\x03#\xffq\x01&\x03%\xffq\x01\ +&\x03&\xff\x5c\x01&\x03'\xffq\x01&\x03(\xff\ +\x5c\x01&\x03)\xffq\x01&\x03*\xff\x5c\x01&\x03\ ++\xffq\x01&\x03,\xff\x5c\x01&\x03-\xffq\x01\ +&\x03.\xff\x5c\x01&\x03/\xffq\x01&\x030\xff\ +\x5c\x01&\x031\xffq\x01&\x032\xff\x5c\x01&\x03\ +3\xffq\x01&\x034\xff\x5c\x01&\x036\xffq\x01\ +&\x038\xffq\x01&\x03:\xffq\x01&\x03<\xff\ +q\x01&\x03@\xffq\x01&\x03B\xffq\x01&\x03\ +D\xffq\x01&\x03I\xff\xd7\x01&\x03J\xffq\x01\ +&\x03K\xff\xd7\x01&\x03L\xffq\x01&\x03M\xff\ +\xd7\x01&\x03N\xffq\x01&\x03O\xff\xd7\x01&\x03\ +Q\xff\xd7\x01&\x03R\xffq\x01&\x03S\xff\xd7\x01\ +&\x03T\xffq\x01&\x03U\xff\xd7\x01&\x03V\xff\ +q\x01&\x03W\xff\xd7\x01&\x03X\xffq\x01&\x03\ +Y\xff\xd7\x01&\x03Z\xffq\x01&\x03[\xff\xd7\x01\ +&\x03\x5c\xffq\x01&\x03]\xff\xd7\x01&\x03^\xff\ +q\x01&\x03_\xff\xd7\x01&\x03`\xffq\x01&\x03\ +b\xff\x9a\x01&\x03d\xff\x9a\x01&\x03f\xff\x9a\x01\ +&\x03h\xff\x9a\x01&\x03j\xff\x9a\x01&\x03l\xff\ +\x9a\x01&\x03n\xff\x9a\x01&\x03p\xff\xd7\x01&\x03\ +\x8f\x00)\x01'\x00\x05\x00)\x01'\x00\x0a\x00)\x01\ +'\x02\x07\x00)\x01'\x02\x0b\x00)\x01(\x00\x0f\xff\ +\x85\x01(\x00\x10\xff\xae\x01(\x00\x11\xff\x85\x01(\x00\ +\x22\x00)\x01(\x00$\xffq\x01(\x00&\xff\xd7\x01\ +(\x00*\xff\xd7\x01(\x002\xff\xd7\x01(\x004\xff\ +\xd7\x01(\x007\x00)\x01(\x00D\xff\x5c\x01(\x00\ +F\xffq\x01(\x00G\xffq\x01(\x00H\xffq\x01\ +(\x00J\xffq\x01(\x00P\xff\x9a\x01(\x00Q\xff\ +\x9a\x01(\x00R\xffq\x01(\x00S\xff\x9a\x01(\x00\ +T\xffq\x01(\x00U\xff\x9a\x01(\x00V\xff\x85\x01\ +(\x00X\xff\x9a\x01(\x00Y\xff\xd7\x01(\x00Z\xff\ +\xd7\x01(\x00[\xff\xd7\x01(\x00\x5c\xff\xd7\x01(\x00\ +]\xff\xae\x01(\x00\x82\xffq\x01(\x00\x83\xffq\x01\ +(\x00\x84\xffq\x01(\x00\x85\xffq\x01(\x00\x86\xff\ +q\x01(\x00\x87\xffq\x01(\x00\x89\xff\xd7\x01(\x00\ +\x94\xff\xd7\x01(\x00\x95\xff\xd7\x01(\x00\x96\xff\xd7\x01\ +(\x00\x97\xff\xd7\x01(\x00\x98\xff\xd7\x01(\x00\x9a\xff\ +\xd7\x01(\x00\xa2\xffq\x01(\x00\xa3\xff\x5c\x01(\x00\ +\xa4\xff\x5c\x01(\x00\xa5\xff\x5c\x01(\x00\xa6\xff\x5c\x01\ +(\x00\xa7\xff\x5c\x01(\x00\xa8\xff\x5c\x01(\x00\xa9\xff\ +q\x01(\x00\xaa\xffq\x01(\x00\xab\xffq\x01(\x00\ +\xac\xffq\x01(\x00\xad\xffq\x01(\x00\xb4\xffq\x01\ +(\x00\xb5\xffq\x01(\x00\xb6\xffq\x01(\x00\xb7\xff\ +q\x01(\x00\xb8\xffq\x01(\x00\xba\xffq\x01(\x00\ +\xbb\xff\x9a\x01(\x00\xbc\xff\x9a\x01(\x00\xbd\xff\x9a\x01\ +(\x00\xbe\xff\x9a\x01(\x00\xbf\xff\xd7\x01(\x00\xc2\xff\ +q\x01(\x00\xc3\xff\x5c\x01(\x00\xc4\xffq\x01(\x00\ +\xc5\xff\x5c\x01(\x00\xc6\xffq\x01(\x00\xc7\xff\x5c\x01\ +(\x00\xc8\xff\xd7\x01(\x00\xc9\xffq\x01(\x00\xca\xff\ +\xd7\x01(\x00\xcb\xffq\x01(\x00\xcc\xff\xd7\x01(\x00\ +\xcd\xffq\x01(\x00\xce\xff\xd7\x01(\x00\xcf\xffq\x01\ +(\x00\xd1\xffq\x01(\x00\xd3\xffq\x01(\x00\xd5\xff\ +q\x01(\x00\xd7\xffq\x01(\x00\xd9\xffq\x01(\x00\ +\xdb\xffq\x01(\x00\xdd\xffq\x01(\x00\xde\xff\xd7\x01\ +(\x00\xdf\xffq\x01(\x00\xe0\xff\xd7\x01(\x00\xe1\xff\ +q\x01(\x00\xe2\xff\xd7\x01(\x00\xe3\xffq\x01(\x00\ +\xe4\xff\xd7\x01(\x00\xe5\xffq\x01(\x00\xfa\xff\x9a\x01\ +(\x01\x06\xff\x9a\x01(\x01\x08\xff\x9a\x01(\x01\x0d\xff\ +\x9a\x01(\x01\x0e\xff\xd7\x01(\x01\x0f\xffq\x01(\x01\ +\x10\xff\xd7\x01(\x01\x11\xffq\x01(\x01\x12\xff\xd7\x01\ +(\x01\x13\xffq\x01(\x01\x14\xff\xd7\x01(\x01\x15\xff\ +q\x01(\x01\x17\xff\x9a\x01(\x01\x19\xff\x9a\x01(\x01\ +\x1d\xff\x85\x01(\x01!\xff\x85\x01(\x01$\x00)\x01\ +(\x01&\x00)\x01(\x01+\xff\x9a\x01(\x01-\xff\ +\x9a\x01(\x01/\xff\x9a\x01(\x011\xff\x9a\x01(\x01\ +3\xff\x9a\x01(\x015\xff\x9a\x01(\x017\xff\xd7\x01\ +(\x01<\xff\xae\x01(\x01>\xff\xae\x01(\x01@\xff\ +\xae\x01(\x01C\xffq\x01(\x01D\xff\x5c\x01(\x01\ +F\xff\x5c\x01(\x01G\xff\xd7\x01(\x01H\xffq\x01\ +(\x01J\xff\x85\x01(\x01\xfb\xff\xd7\x01(\x01\xfd\xff\ +\xd7\x01(\x02\x02\xff\xae\x01(\x02\x03\xff\xae\x01(\x02\ +\x04\xff\xae\x01(\x02\x08\xff\x85\x01(\x02\x0c\xff\x85\x01\ +(\x02W\xff\x9a\x01(\x02X\xffq\x01(\x02Y\xff\ +\x5c\x01(\x02_\xff\xd7\x01(\x02`\xffq\x01(\x02\ +b\xff\x9a\x01(\x03\x1d\xffq\x01(\x03\x1e\xff\x5c\x01\ +(\x03\x1f\xffq\x01(\x03 \xff\x5c\x01(\x03!\xff\ +q\x01(\x03\x22\xff\x5c\x01(\x03#\xffq\x01(\x03\ +%\xffq\x01(\x03&\xff\x5c\x01(\x03'\xffq\x01\ +(\x03(\xff\x5c\x01(\x03)\xffq\x01(\x03*\xff\ +\x5c\x01(\x03+\xffq\x01(\x03,\xff\x5c\x01(\x03\ +-\xffq\x01(\x03.\xff\x5c\x01(\x03/\xffq\x01\ +(\x030\xff\x5c\x01(\x031\xffq\x01(\x032\xff\ +\x5c\x01(\x033\xffq\x01(\x034\xff\x5c\x01(\x03\ +6\xffq\x01(\x038\xffq\x01(\x03:\xffq\x01\ +(\x03<\xffq\x01(\x03@\xffq\x01(\x03B\xff\ +q\x01(\x03D\xffq\x01(\x03I\xff\xd7\x01(\x03\ +J\xffq\x01(\x03K\xff\xd7\x01(\x03L\xffq\x01\ +(\x03M\xff\xd7\x01(\x03N\xffq\x01(\x03O\xff\ +\xd7\x01(\x03Q\xff\xd7\x01(\x03R\xffq\x01(\x03\ +S\xff\xd7\x01(\x03T\xffq\x01(\x03U\xff\xd7\x01\ +(\x03V\xffq\x01(\x03W\xff\xd7\x01(\x03X\xff\ +q\x01(\x03Y\xff\xd7\x01(\x03Z\xffq\x01(\x03\ +[\xff\xd7\x01(\x03\x5c\xffq\x01(\x03]\xff\xd7\x01\ +(\x03^\xffq\x01(\x03_\xff\xd7\x01(\x03`\xff\ +q\x01(\x03b\xff\x9a\x01(\x03d\xff\x9a\x01(\x03\ +f\xff\x9a\x01(\x03h\xff\x9a\x01(\x03j\xff\x9a\x01\ +(\x03l\xff\x9a\x01(\x03n\xff\x9a\x01(\x03p\xff\ +\xd7\x01(\x03\x8f\x00)\x01*\x00\x0f\xff\xd7\x01*\x00\ +\x11\xff\xd7\x01*\x00$\xff\xec\x01*\x00\x82\xff\xec\x01\ +*\x00\x83\xff\xec\x01*\x00\x84\xff\xec\x01*\x00\x85\xff\ +\xec\x01*\x00\x86\xff\xec\x01*\x00\x87\xff\xec\x01*\x00\ +\xc2\xff\xec\x01*\x00\xc4\xff\xec\x01*\x00\xc6\xff\xec\x01\ +*\x01C\xff\xec\x01*\x02\x08\xff\xd7\x01*\x02\x0c\xff\ +\xd7\x01*\x02X\xff\xec\x01*\x03\x1d\xff\xec\x01*\x03\ +\x1f\xff\xec\x01*\x03!\xff\xec\x01*\x03#\xff\xec\x01\ +*\x03%\xff\xec\x01*\x03'\xff\xec\x01*\x03)\xff\ +\xec\x01*\x03+\xff\xec\x01*\x03-\xff\xec\x01*\x03\ +/\xff\xec\x01*\x031\xff\xec\x01*\x033\xff\xec\x01\ +,\x00\x0f\xff\xd7\x01,\x00\x11\xff\xd7\x01,\x00$\xff\ +\xec\x01,\x00\x82\xff\xec\x01,\x00\x83\xff\xec\x01,\x00\ +\x84\xff\xec\x01,\x00\x85\xff\xec\x01,\x00\x86\xff\xec\x01\ +,\x00\x87\xff\xec\x01,\x00\xc2\xff\xec\x01,\x00\xc4\xff\ +\xec\x01,\x00\xc6\xff\xec\x01,\x01C\xff\xec\x01,\x02\ +\x08\xff\xd7\x01,\x02\x0c\xff\xd7\x01,\x02X\xff\xec\x01\ +,\x03\x1d\xff\xec\x01,\x03\x1f\xff\xec\x01,\x03!\xff\ +\xec\x01,\x03#\xff\xec\x01,\x03%\xff\xec\x01,\x03\ +'\xff\xec\x01,\x03)\xff\xec\x01,\x03+\xff\xec\x01\ +,\x03-\xff\xec\x01,\x03/\xff\xec\x01,\x031\xff\ +\xec\x01,\x033\xff\xec\x01.\x00\x0f\xff\xd7\x01.\x00\ +\x11\xff\xd7\x01.\x00$\xff\xec\x01.\x00\x82\xff\xec\x01\ +.\x00\x83\xff\xec\x01.\x00\x84\xff\xec\x01.\x00\x85\xff\ +\xec\x01.\x00\x86\xff\xec\x01.\x00\x87\xff\xec\x01.\x00\ +\xc2\xff\xec\x01.\x00\xc4\xff\xec\x01.\x00\xc6\xff\xec\x01\ +.\x01C\xff\xec\x01.\x02\x08\xff\xd7\x01.\x02\x0c\xff\ +\xd7\x01.\x02X\xff\xec\x01.\x03\x1d\xff\xec\x01.\x03\ +\x1f\xff\xec\x01.\x03!\xff\xec\x01.\x03#\xff\xec\x01\ +.\x03%\xff\xec\x01.\x03'\xff\xec\x01.\x03)\xff\ +\xec\x01.\x03+\xff\xec\x01.\x03-\xff\xec\x01.\x03\ +/\xff\xec\x01.\x031\xff\xec\x01.\x033\xff\xec\x01\ +0\x00\x0f\xff\xd7\x010\x00\x11\xff\xd7\x010\x00$\xff\ +\xec\x010\x00\x82\xff\xec\x010\x00\x83\xff\xec\x010\x00\ +\x84\xff\xec\x010\x00\x85\xff\xec\x010\x00\x86\xff\xec\x01\ +0\x00\x87\xff\xec\x010\x00\xc2\xff\xec\x010\x00\xc4\xff\ +\xec\x010\x00\xc6\xff\xec\x010\x01C\xff\xec\x010\x02\ +\x08\xff\xd7\x010\x02\x0c\xff\xd7\x010\x02X\xff\xec\x01\ +0\x03\x1d\xff\xec\x010\x03\x1f\xff\xec\x010\x03!\xff\ +\xec\x010\x03#\xff\xec\x010\x03%\xff\xec\x010\x03\ +'\xff\xec\x010\x03)\xff\xec\x010\x03+\xff\xec\x01\ +0\x03-\xff\xec\x010\x03/\xff\xec\x010\x031\xff\ +\xec\x010\x033\xff\xec\x012\x00\x0f\xff\xd7\x012\x00\ +\x11\xff\xd7\x012\x00$\xff\xec\x012\x00\x82\xff\xec\x01\ +2\x00\x83\xff\xec\x012\x00\x84\xff\xec\x012\x00\x85\xff\ +\xec\x012\x00\x86\xff\xec\x012\x00\x87\xff\xec\x012\x00\ +\xc2\xff\xec\x012\x00\xc4\xff\xec\x012\x00\xc6\xff\xec\x01\ +2\x01C\xff\xec\x012\x02\x08\xff\xd7\x012\x02\x0c\xff\ +\xd7\x012\x02X\xff\xec\x012\x03\x1d\xff\xec\x012\x03\ +\x1f\xff\xec\x012\x03!\xff\xec\x012\x03#\xff\xec\x01\ +2\x03%\xff\xec\x012\x03'\xff\xec\x012\x03)\xff\ +\xec\x012\x03+\xff\xec\x012\x03-\xff\xec\x012\x03\ +/\xff\xec\x012\x031\xff\xec\x012\x033\xff\xec\x01\ +4\x00\x0f\xff\xd7\x014\x00\x11\xff\xd7\x014\x00$\xff\ +\xec\x014\x00\x82\xff\xec\x014\x00\x83\xff\xec\x014\x00\ +\x84\xff\xec\x014\x00\x85\xff\xec\x014\x00\x86\xff\xec\x01\ +4\x00\x87\xff\xec\x014\x00\xc2\xff\xec\x014\x00\xc4\xff\ +\xec\x014\x00\xc6\xff\xec\x014\x01C\xff\xec\x014\x02\ +\x08\xff\xd7\x014\x02\x0c\xff\xd7\x014\x02X\xff\xec\x01\ +4\x03\x1d\xff\xec\x014\x03\x1f\xff\xec\x014\x03!\xff\ +\xec\x014\x03#\xff\xec\x014\x03%\xff\xec\x014\x03\ +'\xff\xec\x014\x03)\xff\xec\x014\x03+\xff\xec\x01\ +4\x03-\xff\xec\x014\x03/\xff\xec\x014\x031\xff\ +\xec\x014\x033\xff\xec\x016\x00\x0f\xff\x9a\x016\x00\ +\x11\xff\x9a\x016\x00\x22\x00)\x016\x00$\xff\xae\x01\ +6\x00&\xff\xec\x016\x00*\xff\xec\x016\x002\xff\ +\xec\x016\x004\xff\xec\x016\x00D\xff\xd7\x016\x00\ +F\xff\xd7\x016\x00G\xff\xd7\x016\x00H\xff\xd7\x01\ +6\x00J\xff\xec\x016\x00P\xff\xec\x016\x00Q\xff\ +\xec\x016\x00R\xff\xd7\x016\x00S\xff\xec\x016\x00\ +T\xff\xd7\x016\x00U\xff\xec\x016\x00V\xff\xec\x01\ +6\x00X\xff\xec\x016\x00\x82\xff\xae\x016\x00\x83\xff\ +\xae\x016\x00\x84\xff\xae\x016\x00\x85\xff\xae\x016\x00\ +\x86\xff\xae\x016\x00\x87\xff\xae\x016\x00\x89\xff\xec\x01\ +6\x00\x94\xff\xec\x016\x00\x95\xff\xec\x016\x00\x96\xff\ +\xec\x016\x00\x97\xff\xec\x016\x00\x98\xff\xec\x016\x00\ +\x9a\xff\xec\x016\x00\xa2\xff\xd7\x016\x00\xa3\xff\xd7\x01\ +6\x00\xa4\xff\xd7\x016\x00\xa5\xff\xd7\x016\x00\xa6\xff\ +\xd7\x016\x00\xa7\xff\xd7\x016\x00\xa8\xff\xd7\x016\x00\ +\xa9\xff\xd7\x016\x00\xaa\xff\xd7\x016\x00\xab\xff\xd7\x01\ +6\x00\xac\xff\xd7\x016\x00\xad\xff\xd7\x016\x00\xb4\xff\ +\xd7\x016\x00\xb5\xff\xd7\x016\x00\xb6\xff\xd7\x016\x00\ +\xb7\xff\xd7\x016\x00\xb8\xff\xd7\x016\x00\xba\xff\xd7\x01\ +6\x00\xbb\xff\xec\x016\x00\xbc\xff\xec\x016\x00\xbd\xff\ +\xec\x016\x00\xbe\xff\xec\x016\x00\xc2\xff\xae\x016\x00\ +\xc3\xff\xd7\x016\x00\xc4\xff\xae\x016\x00\xc5\xff\xd7\x01\ +6\x00\xc6\xff\xae\x016\x00\xc7\xff\xd7\x016\x00\xc8\xff\ +\xec\x016\x00\xc9\xff\xd7\x016\x00\xca\xff\xec\x016\x00\ +\xcb\xff\xd7\x016\x00\xcc\xff\xec\x016\x00\xcd\xff\xd7\x01\ +6\x00\xce\xff\xec\x016\x00\xcf\xff\xd7\x016\x00\xd1\xff\ +\xd7\x016\x00\xd3\xff\xd7\x016\x00\xd5\xff\xd7\x016\x00\ +\xd7\xff\xd7\x016\x00\xd9\xff\xd7\x016\x00\xdb\xff\xd7\x01\ +6\x00\xdd\xff\xd7\x016\x00\xde\xff\xec\x016\x00\xdf\xff\ +\xec\x016\x00\xe0\xff\xec\x016\x00\xe1\xff\xec\x016\x00\ +\xe2\xff\xec\x016\x00\xe3\xff\xec\x016\x00\xe4\xff\xec\x01\ +6\x00\xe5\xff\xec\x016\x00\xfa\xff\xec\x016\x01\x06\xff\ +\xec\x016\x01\x08\xff\xec\x016\x01\x0d\xff\xec\x016\x01\ +\x0e\xff\xec\x016\x01\x0f\xff\xd7\x016\x01\x10\xff\xec\x01\ +6\x01\x11\xff\xd7\x016\x01\x12\xff\xec\x016\x01\x13\xff\ +\xd7\x016\x01\x14\xff\xec\x016\x01\x15\xff\xd7\x016\x01\ +\x17\xff\xec\x016\x01\x19\xff\xec\x016\x01\x1d\xff\xec\x01\ +6\x01!\xff\xec\x016\x01+\xff\xec\x016\x01-\xff\ +\xec\x016\x01/\xff\xec\x016\x011\xff\xec\x016\x01\ +3\xff\xec\x016\x015\xff\xec\x016\x01C\xff\xae\x01\ +6\x01D\xff\xd7\x016\x01F\xff\xd7\x016\x01G\xff\ +\xec\x016\x01H\xff\xd7\x016\x01J\xff\xec\x016\x02\ +\x08\xff\x9a\x016\x02\x0c\xff\x9a\x016\x02W\xff\xec\x01\ +6\x02X\xff\xae\x016\x02Y\xff\xd7\x016\x02_\xff\ +\xec\x016\x02`\xff\xd7\x016\x02b\xff\xec\x016\x03\ +\x1d\xff\xae\x016\x03\x1e\xff\xd7\x016\x03\x1f\xff\xae\x01\ +6\x03 \xff\xd7\x016\x03!\xff\xae\x016\x03\x22\xff\ +\xd7\x016\x03#\xff\xae\x016\x03%\xff\xae\x016\x03\ +&\xff\xd7\x016\x03'\xff\xae\x016\x03(\xff\xd7\x01\ +6\x03)\xff\xae\x016\x03*\xff\xd7\x016\x03+\xff\ +\xae\x016\x03,\xff\xd7\x016\x03-\xff\xae\x016\x03\ +.\xff\xd7\x016\x03/\xff\xae\x016\x030\xff\xd7\x01\ +6\x031\xff\xae\x016\x032\xff\xd7\x016\x033\xff\ +\xae\x016\x034\xff\xd7\x016\x036\xff\xd7\x016\x03\ +8\xff\xd7\x016\x03:\xff\xd7\x016\x03<\xff\xd7\x01\ +6\x03@\xff\xd7\x016\x03B\xff\xd7\x016\x03D\xff\ +\xd7\x016\x03I\xff\xec\x016\x03J\xff\xd7\x016\x03\ +K\xff\xec\x016\x03L\xff\xd7\x016\x03M\xff\xec\x01\ +6\x03N\xff\xd7\x016\x03O\xff\xec\x016\x03Q\xff\ +\xec\x016\x03R\xff\xd7\x016\x03S\xff\xec\x016\x03\ +T\xff\xd7\x016\x03U\xff\xec\x016\x03V\xff\xd7\x01\ +6\x03W\xff\xec\x016\x03X\xff\xd7\x016\x03Y\xff\ +\xec\x016\x03Z\xff\xd7\x016\x03[\xff\xec\x016\x03\ +\x5c\xff\xd7\x016\x03]\xff\xec\x016\x03^\xff\xd7\x01\ +6\x03_\xff\xec\x016\x03`\xff\xd7\x016\x03b\xff\ +\xec\x016\x03d\xff\xec\x016\x03f\xff\xec\x016\x03\ +h\xff\xec\x016\x03j\xff\xec\x016\x03l\xff\xec\x01\ +6\x03n\xff\xec\x017\x00\x05\x00R\x017\x00\x0a\x00\ +R\x017\x00\x0f\xff\xae\x017\x00\x11\xff\xae\x017\x00\ +\x22\x00)\x017\x02\x07\x00R\x017\x02\x08\xff\xae\x01\ +7\x02\x0b\x00R\x017\x02\x0c\xff\xae\x018\x00\x0f\xff\ +\x85\x018\x00\x11\xff\x85\x018\x00\x22\x00)\x018\x00\ +$\xff\x85\x018\x00&\xff\xd7\x018\x00*\xff\xd7\x01\ +8\x002\xff\xd7\x018\x004\xff\xd7\x018\x00D\xff\ +\x9a\x018\x00F\xff\x9a\x018\x00G\xff\x9a\x018\x00\ +H\xff\x9a\x018\x00J\xff\xd7\x018\x00P\xff\xc3\x01\ +8\x00Q\xff\xc3\x018\x00R\xff\x9a\x018\x00S\xff\ +\xc3\x018\x00T\xff\x9a\x018\x00U\xff\xc3\x018\x00\ +V\xff\xae\x018\x00X\xff\xc3\x018\x00]\xff\xd7\x01\ +8\x00\x82\xff\x85\x018\x00\x83\xff\x85\x018\x00\x84\xff\ +\x85\x018\x00\x85\xff\x85\x018\x00\x86\xff\x85\x018\x00\ +\x87\xff\x85\x018\x00\x89\xff\xd7\x018\x00\x94\xff\xd7\x01\ +8\x00\x95\xff\xd7\x018\x00\x96\xff\xd7\x018\x00\x97\xff\ +\xd7\x018\x00\x98\xff\xd7\x018\x00\x9a\xff\xd7\x018\x00\ +\xa2\xff\x9a\x018\x00\xa3\xff\x9a\x018\x00\xa4\xff\x9a\x01\ +8\x00\xa5\xff\x9a\x018\x00\xa6\xff\x9a\x018\x00\xa7\xff\ +\x9a\x018\x00\xa8\xff\x9a\x018\x00\xa9\xff\x9a\x018\x00\ +\xaa\xff\x9a\x018\x00\xab\xff\x9a\x018\x00\xac\xff\x9a\x01\ +8\x00\xad\xff\x9a\x018\x00\xb4\xff\x9a\x018\x00\xb5\xff\ +\x9a\x018\x00\xb6\xff\x9a\x018\x00\xb7\xff\x9a\x018\x00\ +\xb8\xff\x9a\x018\x00\xba\xff\x9a\x018\x00\xbb\xff\xc3\x01\ +8\x00\xbc\xff\xc3\x018\x00\xbd\xff\xc3\x018\x00\xbe\xff\ +\xc3\x018\x00\xc2\xff\x85\x018\x00\xc3\xff\x9a\x018\x00\ +\xc4\xff\x85\x018\x00\xc5\xff\x9a\x018\x00\xc6\xff\x85\x01\ +8\x00\xc7\xff\x9a\x018\x00\xc8\xff\xd7\x018\x00\xc9\xff\ +\x9a\x018\x00\xca\xff\xd7\x018\x00\xcb\xff\x9a\x018\x00\ +\xcc\xff\xd7\x018\x00\xcd\xff\x9a\x018\x00\xce\xff\xd7\x01\ +8\x00\xcf\xff\x9a\x018\x00\xd1\xff\x9a\x018\x00\xd3\xff\ +\x9a\x018\x00\xd5\xff\x9a\x018\x00\xd7\xff\x9a\x018\x00\ +\xd9\xff\x9a\x018\x00\xdb\xff\x9a\x018\x00\xdd\xff\x9a\x01\ +8\x00\xde\xff\xd7\x018\x00\xdf\xff\xd7\x018\x00\xe0\xff\ +\xd7\x018\x00\xe1\xff\xd7\x018\x00\xe2\xff\xd7\x018\x00\ +\xe3\xff\xd7\x018\x00\xe4\xff\xd7\x018\x00\xe5\xff\xd7\x01\ +8\x00\xfa\xff\xc3\x018\x01\x06\xff\xc3\x018\x01\x08\xff\ +\xc3\x018\x01\x0d\xff\xc3\x018\x01\x0e\xff\xd7\x018\x01\ +\x0f\xff\x9a\x018\x01\x10\xff\xd7\x018\x01\x11\xff\x9a\x01\ +8\x01\x12\xff\xd7\x018\x01\x13\xff\x9a\x018\x01\x14\xff\ +\xd7\x018\x01\x15\xff\x9a\x018\x01\x17\xff\xc3\x018\x01\ +\x19\xff\xc3\x018\x01\x1d\xff\xae\x018\x01!\xff\xae\x01\ +8\x01+\xff\xc3\x018\x01-\xff\xc3\x018\x01/\xff\ +\xc3\x018\x011\xff\xc3\x018\x013\xff\xc3\x018\x01\ +5\xff\xc3\x018\x01<\xff\xd7\x018\x01>\xff\xd7\x01\ +8\x01@\xff\xd7\x018\x01C\xff\x85\x018\x01D\xff\ +\x9a\x018\x01F\xff\x9a\x018\x01G\xff\xd7\x018\x01\ +H\xff\x9a\x018\x01J\xff\xae\x018\x02\x08\xff\x85\x01\ +8\x02\x0c\xff\x85\x018\x02W\xff\xc3\x018\x02X\xff\ +\x85\x018\x02Y\xff\x9a\x018\x02_\xff\xd7\x018\x02\ +`\xff\x9a\x018\x02b\xff\xc3\x018\x03\x1d\xff\x85\x01\ +8\x03\x1e\xff\x9a\x018\x03\x1f\xff\x85\x018\x03 \xff\ +\x9a\x018\x03!\xff\x85\x018\x03\x22\xff\x9a\x018\x03\ +#\xff\x85\x018\x03%\xff\x85\x018\x03&\xff\x9a\x01\ +8\x03'\xff\x85\x018\x03(\xff\x9a\x018\x03)\xff\ +\x85\x018\x03*\xff\x9a\x018\x03+\xff\x85\x018\x03\ +,\xff\x9a\x018\x03-\xff\x85\x018\x03.\xff\x9a\x01\ +8\x03/\xff\x85\x018\x030\xff\x9a\x018\x031\xff\ +\x85\x018\x032\xff\x9a\x018\x033\xff\x85\x018\x03\ +4\xff\x9a\x018\x036\xff\x9a\x018\x038\xff\x9a\x01\ +8\x03:\xff\x9a\x018\x03<\xff\x9a\x018\x03@\xff\ +\x9a\x018\x03B\xff\x9a\x018\x03D\xff\x9a\x018\x03\ +I\xff\xd7\x018\x03J\xff\x9a\x018\x03K\xff\xd7\x01\ +8\x03L\xff\x9a\x018\x03M\xff\xd7\x018\x03N\xff\ +\x9a\x018\x03O\xff\xd7\x018\x03Q\xff\xd7\x018\x03\ +R\xff\x9a\x018\x03S\xff\xd7\x018\x03T\xff\x9a\x01\ +8\x03U\xff\xd7\x018\x03V\xff\x9a\x018\x03W\xff\ +\xd7\x018\x03X\xff\x9a\x018\x03Y\xff\xd7\x018\x03\ +Z\xff\x9a\x018\x03[\xff\xd7\x018\x03\x5c\xff\x9a\x01\ +8\x03]\xff\xd7\x018\x03^\xff\x9a\x018\x03_\xff\ +\xd7\x018\x03`\xff\x9a\x018\x03b\xff\xc3\x018\x03\ +d\xff\xc3\x018\x03f\xff\xc3\x018\x03h\xff\xc3\x01\ +8\x03j\xff\xc3\x018\x03l\xff\xc3\x018\x03n\xff\ +\xc3\x019\x00\x05\x00R\x019\x00\x0a\x00R\x019\x00\ +\x0f\xff\xae\x019\x00\x11\xff\xae\x019\x00\x22\x00)\x01\ +9\x02\x07\x00R\x019\x02\x08\xff\xae\x019\x02\x0b\x00\ +R\x019\x02\x0c\xff\xae\x01:\x00\x0f\xff\x85\x01:\x00\ +\x11\xff\x85\x01:\x00\x22\x00)\x01:\x00$\xff\x85\x01\ +:\x00&\xff\xd7\x01:\x00*\xff\xd7\x01:\x002\xff\ +\xd7\x01:\x004\xff\xd7\x01:\x00D\xff\x9a\x01:\x00\ +F\xff\x9a\x01:\x00G\xff\x9a\x01:\x00H\xff\x9a\x01\ +:\x00J\xff\xd7\x01:\x00P\xff\xc3\x01:\x00Q\xff\ +\xc3\x01:\x00R\xff\x9a\x01:\x00S\xff\xc3\x01:\x00\ +T\xff\x9a\x01:\x00U\xff\xc3\x01:\x00V\xff\xae\x01\ +:\x00X\xff\xc3\x01:\x00]\xff\xd7\x01:\x00\x82\xff\ +\x85\x01:\x00\x83\xff\x85\x01:\x00\x84\xff\x85\x01:\x00\ +\x85\xff\x85\x01:\x00\x86\xff\x85\x01:\x00\x87\xff\x85\x01\ +:\x00\x89\xff\xd7\x01:\x00\x94\xff\xd7\x01:\x00\x95\xff\ +\xd7\x01:\x00\x96\xff\xd7\x01:\x00\x97\xff\xd7\x01:\x00\ +\x98\xff\xd7\x01:\x00\x9a\xff\xd7\x01:\x00\xa2\xff\x9a\x01\ +:\x00\xa3\xff\x9a\x01:\x00\xa4\xff\x9a\x01:\x00\xa5\xff\ +\x9a\x01:\x00\xa6\xff\x9a\x01:\x00\xa7\xff\x9a\x01:\x00\ +\xa8\xff\x9a\x01:\x00\xa9\xff\x9a\x01:\x00\xaa\xff\x9a\x01\ +:\x00\xab\xff\x9a\x01:\x00\xac\xff\x9a\x01:\x00\xad\xff\ +\x9a\x01:\x00\xb4\xff\x9a\x01:\x00\xb5\xff\x9a\x01:\x00\ +\xb6\xff\x9a\x01:\x00\xb7\xff\x9a\x01:\x00\xb8\xff\x9a\x01\ +:\x00\xba\xff\x9a\x01:\x00\xbb\xff\xc3\x01:\x00\xbc\xff\ +\xc3\x01:\x00\xbd\xff\xc3\x01:\x00\xbe\xff\xc3\x01:\x00\ +\xc2\xff\x85\x01:\x00\xc3\xff\x9a\x01:\x00\xc4\xff\x85\x01\ +:\x00\xc5\xff\x9a\x01:\x00\xc6\xff\x85\x01:\x00\xc7\xff\ +\x9a\x01:\x00\xc8\xff\xd7\x01:\x00\xc9\xff\x9a\x01:\x00\ +\xca\xff\xd7\x01:\x00\xcb\xff\x9a\x01:\x00\xcc\xff\xd7\x01\ +:\x00\xcd\xff\x9a\x01:\x00\xce\xff\xd7\x01:\x00\xcf\xff\ +\x9a\x01:\x00\xd1\xff\x9a\x01:\x00\xd3\xff\x9a\x01:\x00\ +\xd5\xff\x9a\x01:\x00\xd7\xff\x9a\x01:\x00\xd9\xff\x9a\x01\ +:\x00\xdb\xff\x9a\x01:\x00\xdd\xff\x9a\x01:\x00\xde\xff\ +\xd7\x01:\x00\xdf\xff\xd7\x01:\x00\xe0\xff\xd7\x01:\x00\ +\xe1\xff\xd7\x01:\x00\xe2\xff\xd7\x01:\x00\xe3\xff\xd7\x01\ +:\x00\xe4\xff\xd7\x01:\x00\xe5\xff\xd7\x01:\x00\xfa\xff\ +\xc3\x01:\x01\x06\xff\xc3\x01:\x01\x08\xff\xc3\x01:\x01\ +\x0d\xff\xc3\x01:\x01\x0e\xff\xd7\x01:\x01\x0f\xff\x9a\x01\ +:\x01\x10\xff\xd7\x01:\x01\x11\xff\x9a\x01:\x01\x12\xff\ +\xd7\x01:\x01\x13\xff\x9a\x01:\x01\x14\xff\xd7\x01:\x01\ +\x15\xff\x9a\x01:\x01\x17\xff\xc3\x01:\x01\x19\xff\xc3\x01\ +:\x01\x1d\xff\xae\x01:\x01!\xff\xae\x01:\x01+\xff\ +\xc3\x01:\x01-\xff\xc3\x01:\x01/\xff\xc3\x01:\x01\ +1\xff\xc3\x01:\x013\xff\xc3\x01:\x015\xff\xc3\x01\ +:\x01<\xff\xd7\x01:\x01>\xff\xd7\x01:\x01@\xff\ +\xd7\x01:\x01C\xff\x85\x01:\x01D\xff\x9a\x01:\x01\ +F\xff\x9a\x01:\x01G\xff\xd7\x01:\x01H\xff\x9a\x01\ +:\x01J\xff\xae\x01:\x02\x08\xff\x85\x01:\x02\x0c\xff\ +\x85\x01:\x02W\xff\xc3\x01:\x02X\xff\x85\x01:\x02\ +Y\xff\x9a\x01:\x02_\xff\xd7\x01:\x02`\xff\x9a\x01\ +:\x02b\xff\xc3\x01:\x03\x1d\xff\x85\x01:\x03\x1e\xff\ +\x9a\x01:\x03\x1f\xff\x85\x01:\x03 \xff\x9a\x01:\x03\ +!\xff\x85\x01:\x03\x22\xff\x9a\x01:\x03#\xff\x85\x01\ +:\x03%\xff\x85\x01:\x03&\xff\x9a\x01:\x03'\xff\ +\x85\x01:\x03(\xff\x9a\x01:\x03)\xff\x85\x01:\x03\ +*\xff\x9a\x01:\x03+\xff\x85\x01:\x03,\xff\x9a\x01\ +:\x03-\xff\x85\x01:\x03.\xff\x9a\x01:\x03/\xff\ +\x85\x01:\x030\xff\x9a\x01:\x031\xff\x85\x01:\x03\ +2\xff\x9a\x01:\x033\xff\x85\x01:\x034\xff\x9a\x01\ +:\x036\xff\x9a\x01:\x038\xff\x9a\x01:\x03:\xff\ +\x9a\x01:\x03<\xff\x9a\x01:\x03@\xff\x9a\x01:\x03\ +B\xff\x9a\x01:\x03D\xff\x9a\x01:\x03I\xff\xd7\x01\ +:\x03J\xff\x9a\x01:\x03K\xff\xd7\x01:\x03L\xff\ +\x9a\x01:\x03M\xff\xd7\x01:\x03N\xff\x9a\x01:\x03\ +O\xff\xd7\x01:\x03Q\xff\xd7\x01:\x03R\xff\x9a\x01\ +:\x03S\xff\xd7\x01:\x03T\xff\x9a\x01:\x03U\xff\ +\xd7\x01:\x03V\xff\x9a\x01:\x03W\xff\xd7\x01:\x03\ +X\xff\x9a\x01:\x03Y\xff\xd7\x01:\x03Z\xff\x9a\x01\ +:\x03[\xff\xd7\x01:\x03\x5c\xff\x9a\x01:\x03]\xff\ +\xd7\x01:\x03^\xff\x9a\x01:\x03_\xff\xd7\x01:\x03\ +`\xff\x9a\x01:\x03b\xff\xc3\x01:\x03d\xff\xc3\x01\ +:\x03f\xff\xc3\x01:\x03h\xff\xc3\x01:\x03j\xff\ +\xc3\x01:\x03l\xff\xc3\x01:\x03n\xff\xc3\x01;\x00\ +&\xff\xec\x01;\x00*\xff\xec\x01;\x002\xff\xec\x01\ +;\x004\xff\xec\x01;\x00\x89\xff\xec\x01;\x00\x94\xff\ +\xec\x01;\x00\x95\xff\xec\x01;\x00\x96\xff\xec\x01;\x00\ +\x97\xff\xec\x01;\x00\x98\xff\xec\x01;\x00\x9a\xff\xec\x01\ +;\x00\xc8\xff\xec\x01;\x00\xca\xff\xec\x01;\x00\xcc\xff\ +\xec\x01;\x00\xce\xff\xec\x01;\x00\xde\xff\xec\x01;\x00\ +\xe0\xff\xec\x01;\x00\xe2\xff\xec\x01;\x00\xe4\xff\xec\x01\ +;\x01\x0e\xff\xec\x01;\x01\x10\xff\xec\x01;\x01\x12\xff\ +\xec\x01;\x01\x14\xff\xec\x01;\x01G\xff\xec\x01;\x02\ +_\xff\xec\x01;\x03I\xff\xec\x01;\x03K\xff\xec\x01\ +;\x03M\xff\xec\x01;\x03O\xff\xec\x01;\x03Q\xff\ +\xec\x01;\x03S\xff\xec\x01;\x03U\xff\xec\x01;\x03\ +W\xff\xec\x01;\x03Y\xff\xec\x01;\x03[\xff\xec\x01\ +;\x03]\xff\xec\x01;\x03_\xff\xec\x01=\x00&\xff\ +\xec\x01=\x00*\xff\xec\x01=\x002\xff\xec\x01=\x00\ +4\xff\xec\x01=\x00\x89\xff\xec\x01=\x00\x94\xff\xec\x01\ +=\x00\x95\xff\xec\x01=\x00\x96\xff\xec\x01=\x00\x97\xff\ +\xec\x01=\x00\x98\xff\xec\x01=\x00\x9a\xff\xec\x01=\x00\ +\xc8\xff\xec\x01=\x00\xca\xff\xec\x01=\x00\xcc\xff\xec\x01\ +=\x00\xce\xff\xec\x01=\x00\xde\xff\xec\x01=\x00\xe0\xff\ +\xec\x01=\x00\xe2\xff\xec\x01=\x00\xe4\xff\xec\x01=\x01\ +\x0e\xff\xec\x01=\x01\x10\xff\xec\x01=\x01\x12\xff\xec\x01\ +=\x01\x14\xff\xec\x01=\x01G\xff\xec\x01=\x02_\xff\ +\xec\x01=\x03I\xff\xec\x01=\x03K\xff\xec\x01=\x03\ +M\xff\xec\x01=\x03O\xff\xec\x01=\x03Q\xff\xec\x01\ +=\x03S\xff\xec\x01=\x03U\xff\xec\x01=\x03W\xff\ +\xec\x01=\x03Y\xff\xec\x01=\x03[\xff\xec\x01=\x03\ +]\xff\xec\x01=\x03_\xff\xec\x01?\x00&\xff\xec\x01\ +?\x00*\xff\xec\x01?\x002\xff\xec\x01?\x004\xff\ +\xec\x01?\x00\x89\xff\xec\x01?\x00\x94\xff\xec\x01?\x00\ +\x95\xff\xec\x01?\x00\x96\xff\xec\x01?\x00\x97\xff\xec\x01\ +?\x00\x98\xff\xec\x01?\x00\x9a\xff\xec\x01?\x00\xc8\xff\ +\xec\x01?\x00\xca\xff\xec\x01?\x00\xcc\xff\xec\x01?\x00\ +\xce\xff\xec\x01?\x00\xde\xff\xec\x01?\x00\xe0\xff\xec\x01\ +?\x00\xe2\xff\xec\x01?\x00\xe4\xff\xec\x01?\x01\x0e\xff\ +\xec\x01?\x01\x10\xff\xec\x01?\x01\x12\xff\xec\x01?\x01\ +\x14\xff\xec\x01?\x01G\xff\xec\x01?\x02_\xff\xec\x01\ +?\x03I\xff\xec\x01?\x03K\xff\xec\x01?\x03M\xff\ +\xec\x01?\x03O\xff\xec\x01?\x03Q\xff\xec\x01?\x03\ +S\xff\xec\x01?\x03U\xff\xec\x01?\x03W\xff\xec\x01\ +?\x03Y\xff\xec\x01?\x03[\xff\xec\x01?\x03]\xff\ +\xec\x01?\x03_\xff\xec\x01C\x00\x05\xffq\x01C\x00\ +\x0a\xffq\x01C\x00&\xff\xd7\x01C\x00*\xff\xd7\x01\ +C\x00-\x01\x0a\x01C\x002\xff\xd7\x01C\x004\xff\ +\xd7\x01C\x007\xffq\x01C\x009\xff\xae\x01C\x00\ +:\xff\xae\x01C\x00<\xff\x85\x01C\x00\x89\xff\xd7\x01\ +C\x00\x94\xff\xd7\x01C\x00\x95\xff\xd7\x01C\x00\x96\xff\ +\xd7\x01C\x00\x97\xff\xd7\x01C\x00\x98\xff\xd7\x01C\x00\ +\x9a\xff\xd7\x01C\x00\x9f\xff\x85\x01C\x00\xc8\xff\xd7\x01\ +C\x00\xca\xff\xd7\x01C\x00\xcc\xff\xd7\x01C\x00\xce\xff\ +\xd7\x01C\x00\xde\xff\xd7\x01C\x00\xe0\xff\xd7\x01C\x00\ +\xe2\xff\xd7\x01C\x00\xe4\xff\xd7\x01C\x01\x0e\xff\xd7\x01\ +C\x01\x10\xff\xd7\x01C\x01\x12\xff\xd7\x01C\x01\x14\xff\ +\xd7\x01C\x01$\xffq\x01C\x01&\xffq\x01C\x01\ +6\xff\xae\x01C\x018\xff\x85\x01C\x01:\xff\x85\x01\ +C\x01G\xff\xd7\x01C\x01\xfa\xff\xae\x01C\x01\xfc\xff\ +\xae\x01C\x01\xfe\xff\xae\x01C\x02\x00\xff\x85\x01C\x02\ +\x07\xffq\x01C\x02\x0b\xffq\x01C\x02_\xff\xd7\x01\ +C\x03I\xff\xd7\x01C\x03K\xff\xd7\x01C\x03M\xff\ +\xd7\x01C\x03O\xff\xd7\x01C\x03Q\xff\xd7\x01C\x03\ +S\xff\xd7\x01C\x03U\xff\xd7\x01C\x03W\xff\xd7\x01\ +C\x03Y\xff\xd7\x01C\x03[\xff\xd7\x01C\x03]\xff\ +\xd7\x01C\x03_\xff\xd7\x01C\x03o\xff\x85\x01C\x03\ +q\xff\x85\x01C\x03s\xff\x85\x01C\x03\x8f\xffq\x01\ +D\x00\x05\xff\xec\x01D\x00\x0a\xff\xec\x01D\x02\x07\xff\ +\xec\x01D\x02\x0b\xff\xec\x01E\x00-\x00{\x01G\x00\ +\x0f\xff\xae\x01G\x00\x11\xff\xae\x01G\x00$\xff\xd7\x01\ +G\x007\xff\xc3\x01G\x009\xff\xec\x01G\x00:\xff\ +\xec\x01G\x00;\xff\xd7\x01G\x00<\xff\xec\x01G\x00\ +=\xff\xec\x01G\x00\x82\xff\xd7\x01G\x00\x83\xff\xd7\x01\ +G\x00\x84\xff\xd7\x01G\x00\x85\xff\xd7\x01G\x00\x86\xff\ +\xd7\x01G\x00\x87\xff\xd7\x01G\x00\x9f\xff\xec\x01G\x00\ +\xc2\xff\xd7\x01G\x00\xc4\xff\xd7\x01G\x00\xc6\xff\xd7\x01\ +G\x01$\xff\xc3\x01G\x01&\xff\xc3\x01G\x016\xff\ +\xec\x01G\x018\xff\xec\x01G\x01:\xff\xec\x01G\x01\ +;\xff\xec\x01G\x01=\xff\xec\x01G\x01?\xff\xec\x01\ +G\x01C\xff\xd7\x01G\x01\xa0\xff\xec\x01G\x01\xfa\xff\ +\xec\x01G\x01\xfc\xff\xec\x01G\x01\xfe\xff\xec\x01G\x02\ +\x00\xff\xec\x01G\x02\x08\xff\xae\x01G\x02\x0c\xff\xae\x01\ +G\x02X\xff\xd7\x01G\x03\x1d\xff\xd7\x01G\x03\x1f\xff\ +\xd7\x01G\x03!\xff\xd7\x01G\x03#\xff\xd7\x01G\x03\ +%\xff\xd7\x01G\x03'\xff\xd7\x01G\x03)\xff\xd7\x01\ +G\x03+\xff\xd7\x01G\x03-\xff\xd7\x01G\x03/\xff\ +\xd7\x01G\x031\xff\xd7\x01G\x033\xff\xd7\x01G\x03\ +o\xff\xec\x01G\x03q\xff\xec\x01G\x03s\xff\xec\x01\ +G\x03\x8f\xff\xc3\x01V\x00\x05\xffq\x01V\x00\x0a\xff\ +q\x01V\x01f\xff\xd7\x01V\x01m\xff\xd7\x01V\x01\ +q\xffq\x01V\x01r\xff\x85\x01V\x01s\xff\xd7\x01\ +V\x01u\xff\xae\x01V\x01x\xff\x85\x01V\x02\x07\xff\ +q\x01V\x02\x0b\xffq\x01V\x02T\xff\x85\x01[\x00\ +\x0f\xff\xae\x01[\x00\x11\xff\xae\x01[\x01V\xff\xd7\x01\ +[\x01_\xff\xd7\x01[\x01b\xff\xd7\x01[\x01d\xff\ +\xec\x01[\x01i\xff\xd7\x01[\x01p\xff\xec\x01[\x01\ +q\xff\xc3\x01[\x01r\xff\xec\x01[\x01t\xff\xd7\x01\ +[\x01u\xff\xec\x01[\x01x\xff\xec\x01[\x01\x88\xff\ +\xec\x01[\x02\x08\xff\xae\x01[\x02\x0c\xff\xae\x01[\x02\ +T\xff\xec\x01\x5c\x00\x0f\xff\x85\x01\x5c\x00\x11\xff\x85\x01\ +\x5c\x01V\xff\x85\x01\x5c\x01_\xff\x85\x01\x5c\x01b\xff\ +\x85\x01\x5c\x01f\xff\xd7\x01\x5c\x01i\xff\x85\x01\x5c\x01\ +m\xff\xd7\x01\x5c\x01s\xff\xc3\x01\x5c\x01v\xff\xec\x01\ +\x5c\x01y\xff\x9a\x01\x5c\x01z\xff\xae\x01\x5c\x01{\xff\ +\xc3\x01\x5c\x01|\xff\xc3\x01\x5c\x01}\xff\xc3\x01\x5c\x01\ +~\xff\x9a\x01\x5c\x01\x81\xff\xc3\x01\x5c\x01\x82\xff\xae\x01\ +\x5c\x01\x84\xff\xc3\x01\x5c\x01\x86\xff\xc3\x01\x5c\x01\x87\xff\ +\xc3\x01\x5c\x01\x89\xff\xc3\x01\x5c\x01\x8c\xff\x9a\x01\x5c\x01\ +\x8e\xff\x9a\x01\x5c\x01\x8f\xff\x9a\x01\x5c\x01\x90\xff\x9a\x01\ +\x5c\x01\x92\xff\xc3\x01\x5c\x01\x93\xff\x9a\x01\x5c\x01\x95\xff\ +\xc3\x01\x5c\x01\x96\xff\xc3\x01\x5c\x01\x98\xff\xc3\x01\x5c\x01\ +\x99\xff\x9a\x01\x5c\x01\x9a\xff\xc3\x01\x5c\x01\x9b\xff\xc3\x01\ +\x5c\x02\x08\xff\x85\x01\x5c\x02\x0c\xff\x85\x01\x5c\x02!\xff\ +\xec\x01]\x01q\xff\xd7\x01]\x01r\xff\xec\x01]\x01\ +x\xff\xec\x01]\x02T\xff\xec\x01^\x00\x05\xff\xd7\x01\ +^\x00\x0a\xff\xd7\x01^\x02\x07\xff\xd7\x01^\x02\x0b\xff\ +\xd7\x01_\x00\x05\xffq\x01_\x00\x0a\xffq\x01_\x01\ +f\xff\xd7\x01_\x01m\xff\xd7\x01_\x01q\xffq\x01\ +_\x01r\xff\x85\x01_\x01s\xff\xd7\x01_\x01u\xff\ +\xae\x01_\x01x\xff\x85\x01_\x02\x07\xffq\x01_\x02\ +\x0b\xffq\x01_\x02T\xff\x85\x01`\x00\x0f\xff\xae\x01\ +`\x00\x11\xff\xae\x01`\x01V\xff\xd7\x01`\x01_\xff\ +\xd7\x01`\x01b\xff\xd7\x01`\x01i\xff\xd7\x01`\x01\ +t\xff\xd7\x01`\x02\x08\xff\xae\x01`\x02\x0c\xff\xae\x01\ +a\x00\x0f\xff\x85\x01a\x00\x10\xff\xae\x01a\x00\x11\xff\ +\x85\x01a\x01V\xff\x5c\x01a\x01_\xff\x5c\x01a\x01\ +b\xff\x5c\x01a\x01f\xff\xc3\x01a\x01i\xff\x5c\x01\ +a\x01m\xff\xc3\x01a\x01s\xff\x9a\x01a\x01v\xff\ +\xc3\x01a\x01y\xffq\x01a\x01z\xff\x9a\x01a\x01\ +{\xff\x9a\x01a\x01|\xff\xae\x01a\x01}\xff\x9a\x01\ +a\x01~\xffq\x01a\x01\x80\xff\xd7\x01a\x01\x81\xff\ +\xc3\x01a\x01\x82\xff\x9a\x01a\x01\x84\xff\x9a\x01a\x01\ +\x86\xff\xae\x01a\x01\x87\xff\x9a\x01a\x01\x89\xff\x9a\x01\ +a\x01\x8a\xff\xd7\x01a\x01\x8c\xffq\x01a\x01\x8e\xff\ +\x9a\x01a\x01\x8f\xffq\x01a\x01\x90\xffq\x01a\x01\ +\x92\xff\x9a\x01a\x01\x93\xffq\x01a\x01\x94\xff\xd7\x01\ +a\x01\x95\xff\x9a\x01a\x01\x96\xff\x9a\x01a\x01\x98\xff\ +\x9a\x01a\x01\x99\xffq\x01a\x01\x9a\xff\x9a\x01a\x01\ +\x9b\xff\x9a\x01a\x02\x02\xff\xae\x01a\x02\x03\xff\xae\x01\ +a\x02\x04\xff\xae\x01a\x02\x08\xff\x85\x01a\x02\x0c\xff\ +\x85\x01a\x02!\xff\xc3\x01a\x02S\xff\xd7\x01b\x00\ +\x05\xffq\x01b\x00\x0a\xffq\x01b\x01f\xff\xd7\x01\ +b\x01m\xff\xd7\x01b\x01q\xffq\x01b\x01r\xff\ +\x85\x01b\x01s\xff\xd7\x01b\x01u\xff\xae\x01b\x01\ +x\xff\x85\x01b\x02\x07\xffq\x01b\x02\x0b\xffq\x01\ +b\x02T\xff\x85\x01d\x01f\xff\xec\x01d\x01m\xff\ +\xec\x01d\x01s\xff\xc3\x01f\x00\x0f\xff\xae\x01f\x00\ +\x11\xff\xae\x01f\x01V\xff\xd7\x01f\x01_\xff\xd7\x01\ +f\x01b\xff\xd7\x01f\x01d\xff\xec\x01f\x01i\xff\ +\xd7\x01f\x01p\xff\xec\x01f\x01q\xff\xc3\x01f\x01\ +r\xff\xec\x01f\x01t\xff\xd7\x01f\x01u\xff\xec\x01\ +f\x01x\xff\xec\x01f\x01\x88\xff\xec\x01f\x02\x08\xff\ +\xae\x01f\x02\x0c\xff\xae\x01f\x02T\xff\xec\x01h\x01\ +f\xff\xd7\x01h\x01m\xff\xd7\x01h\x01s\xff\xc3\x01\ +h\x01\x8d\xff\xec\x01h\x01\x91\xff\xec\x01i\x00\x05\xff\ +q\x01i\x00\x0a\xffq\x01i\x01f\xff\xd7\x01i\x01\ +m\xff\xd7\x01i\x01q\xffq\x01i\x01r\xff\x85\x01\ +i\x01s\xff\xd7\x01i\x01u\xff\xae\x01i\x01x\xff\ +\x85\x01i\x02\x07\xffq\x01i\x02\x0b\xffq\x01i\x02\ +T\xff\x85\x01m\x00\x0f\xff\xae\x01m\x00\x11\xff\xae\x01\ +m\x01V\xff\xd7\x01m\x01_\xff\xd7\x01m\x01b\xff\ +\xd7\x01m\x01d\xff\xec\x01m\x01i\xff\xd7\x01m\x01\ +p\xff\xec\x01m\x01q\xff\xc3\x01m\x01r\xff\xec\x01\ +m\x01t\xff\xd7\x01m\x01u\xff\xec\x01m\x01x\xff\ +\xec\x01m\x01\x88\xff\xec\x01m\x02\x08\xff\xae\x01m\x02\ +\x0c\xff\xae\x01m\x02T\xff\xec\x01o\x00\x0f\xfe\xf6\x01\ +o\x00\x11\xfe\xf6\x01o\x01V\xff\x9a\x01o\x01_\xff\ +\x9a\x01o\x01b\xff\x9a\x01o\x01d\xff\xec\x01o\x01\ +i\xff\x9a\x01o\x01t\xff\xd7\x01o\x01\x88\xff\xd7\x01\ +o\x02\x08\xfe\xf6\x01o\x02\x0c\xfe\xf6\x01q\x00\x0f\xff\ +\x85\x01q\x00\x10\xff\xae\x01q\x00\x11\xff\x85\x01q\x01\ +V\xff\x5c\x01q\x01_\xff\x5c\x01q\x01b\xff\x5c\x01\ +q\x01f\xff\xc3\x01q\x01i\xff\x5c\x01q\x01m\xff\ +\xc3\x01q\x01s\xff\x9a\x01q\x01v\xff\xc3\x01q\x01\ +y\xffq\x01q\x01z\xff\x9a\x01q\x01{\xff\x9a\x01\ +q\x01|\xff\xae\x01q\x01}\xff\x9a\x01q\x01~\xff\ +q\x01q\x01\x80\xff\xd7\x01q\x01\x81\xff\xc3\x01q\x01\ +\x82\xff\x9a\x01q\x01\x84\xff\x9a\x01q\x01\x86\xff\xae\x01\ +q\x01\x87\xff\x9a\x01q\x01\x89\xff\x9a\x01q\x01\x8a\xff\ +\xd7\x01q\x01\x8c\xffq\x01q\x01\x8e\xff\x9a\x01q\x01\ +\x8f\xffq\x01q\x01\x90\xffq\x01q\x01\x92\xff\x9a\x01\ +q\x01\x93\xffq\x01q\x01\x94\xff\xd7\x01q\x01\x95\xff\ +\x9a\x01q\x01\x96\xff\x9a\x01q\x01\x98\xff\x9a\x01q\x01\ +\x99\xffq\x01q\x01\x9a\xff\x9a\x01q\x01\x9b\xff\x9a\x01\ +q\x02\x02\xff\xae\x01q\x02\x03\xff\xae\x01q\x02\x04\xff\ +\xae\x01q\x02\x08\xff\x85\x01q\x02\x0c\xff\x85\x01q\x02\ +!\xff\xc3\x01q\x02S\xff\xd7\x01r\x00\x0f\xff\x85\x01\ +r\x00\x11\xff\x85\x01r\x01V\xff\x85\x01r\x01_\xff\ +\x85\x01r\x01b\xff\x85\x01r\x01f\xff\xd7\x01r\x01\ +i\xff\x85\x01r\x01m\xff\xd7\x01r\x01s\xff\xc3\x01\ +r\x01v\xff\xec\x01r\x01y\xff\x9a\x01r\x01z\xff\ +\xae\x01r\x01{\xff\xc3\x01r\x01|\xff\xc3\x01r\x01\ +}\xff\xc3\x01r\x01~\xff\x9a\x01r\x01\x81\xff\xc3\x01\ +r\x01\x82\xff\xae\x01r\x01\x84\xff\xc3\x01r\x01\x86\xff\ +\xc3\x01r\x01\x87\xff\xc3\x01r\x01\x89\xff\xc3\x01r\x01\ +\x8c\xff\x9a\x01r\x01\x8e\xff\x9a\x01r\x01\x8f\xff\x9a\x01\ +r\x01\x90\xff\x9a\x01r\x01\x92\xff\xc3\x01r\x01\x93\xff\ +\x9a\x01r\x01\x95\xff\xc3\x01r\x01\x96\xff\xc3\x01r\x01\ +\x98\xff\xc3\x01r\x01\x99\xff\x9a\x01r\x01\x9a\xff\xc3\x01\ +r\x01\x9b\xff\xc3\x01r\x02\x08\xff\x85\x01r\x02\x0c\xff\ +\x85\x01r\x02!\xff\xec\x01s\x00\x0f\xff\x9a\x01s\x00\ +\x11\xff\x9a\x01s\x01V\xff\xd7\x01s\x01_\xff\xd7\x01\ +s\x01b\xff\xd7\x01s\x01d\xff\xc3\x01s\x01i\xff\ +\xd7\x01s\x01p\xff\xec\x01s\x01q\xff\xae\x01s\x01\ +r\xff\xc3\x01s\x01t\xff\xec\x01s\x01x\xff\xc3\x01\ +s\x01\x88\xff\xec\x01s\x02\x08\xff\x9a\x01s\x02\x0c\xff\ +\x9a\x01s\x02T\xff\xc3\x01t\x01f\xff\xd7\x01t\x01\ +m\xff\xd7\x01t\x01s\xff\xc3\x01t\x01\x8d\xff\xec\x01\ +t\x01\x91\xff\xec\x01u\x00\x0f\xff\x85\x01u\x00\x11\xff\ +\x85\x01u\x01V\xff\xae\x01u\x01_\xff\xae\x01u\x01\ +b\xff\xae\x01u\x01f\xff\xec\x01u\x01i\xff\xae\x01\ +u\x01m\xff\xec\x01u\x02\x08\xff\x85\x01u\x02\x0c\xff\ +\x85\x01v\x01q\xff\xd7\x01v\x01r\xff\xec\x01v\x01\ +x\xff\xec\x01v\x02T\xff\xec\x01x\x00\x0f\xff\x85\x01\ +x\x00\x11\xff\x85\x01x\x01V\xff\x85\x01x\x01_\xff\ +\x85\x01x\x01b\xff\x85\x01x\x01f\xff\xd7\x01x\x01\ +i\xff\x85\x01x\x01m\xff\xd7\x01x\x01s\xff\xc3\x01\ +x\x01v\xff\xec\x01x\x01y\xff\x9a\x01x\x01z\xff\ +\xae\x01x\x01{\xff\xc3\x01x\x01|\xff\xc3\x01x\x01\ +}\xff\xc3\x01x\x01~\xff\x9a\x01x\x01\x81\xff\xc3\x01\ +x\x01\x82\xff\xae\x01x\x01\x84\xff\xc3\x01x\x01\x86\xff\ +\xc3\x01x\x01\x87\xff\xc3\x01x\x01\x89\xff\xc3\x01x\x01\ +\x8c\xff\x9a\x01x\x01\x8e\xff\x9a\x01x\x01\x8f\xff\x9a\x01\ +x\x01\x90\xff\x9a\x01x\x01\x92\xff\xc3\x01x\x01\x93\xff\ +\x9a\x01x\x01\x95\xff\xc3\x01x\x01\x96\xff\xc3\x01x\x01\ +\x98\xff\xc3\x01x\x01\x99\xff\x9a\x01x\x01\x9a\xff\xc3\x01\ +x\x01\x9b\xff\xc3\x01x\x02\x08\xff\x85\x01x\x02\x0c\xff\ +\x85\x01x\x02!\xff\xec\x01y\x01\x88\x00)\x01{\x00\ +\x05\xff\xec\x01{\x00\x0a\xff\xec\x01{\x02\x07\xff\xec\x01\ +{\x02\x0b\xff\xec\x01|\x00\x05\xff\xae\x01|\x00\x0a\xff\ +\xae\x01|\x01\x8d\xff\xec\x01|\x01\x91\xff\xec\x01|\x02\ +\x07\xff\xae\x01|\x02\x0b\xff\xae\x01~\x01\x88\x00)\x01\ +\x80\x00\x0f\xff\xae\x01\x80\x00\x11\xff\xae\x01\x80\x01\x88\xff\ +\xec\x01\x80\x02\x08\xff\xae\x01\x80\x02\x0c\xff\xae\x01\x83\x00\ +\x10\xff\x9a\x01\x83\x01y\xff\xd7\x01\x83\x01~\xff\xd7\x01\ +\x83\x01\x81\xff\xd7\x01\x83\x01\x8c\xff\xd7\x01\x83\x01\x8d\xff\ +\xd7\x01\x83\x01\x8f\xff\xd7\x01\x83\x01\x90\xff\xd7\x01\x83\x01\ +\x91\xff\xd7\x01\x83\x01\x93\xff\xd7\x01\x83\x01\x99\xff\xd7\x01\ +\x83\x02\x02\xff\x9a\x01\x83\x02\x03\xff\x9a\x01\x83\x02\x04\xff\ +\x9a\x01\x84\x00\x05\xff\xec\x01\x84\x00\x0a\xff\xec\x01\x84\x02\ +\x07\xff\xec\x01\x84\x02\x0b\xff\xec\x01\x85\x00\x0f\xff\xd7\x01\ +\x85\x00\x11\xff\xd7\x01\x85\x02\x08\xff\xd7\x01\x85\x02\x0c\xff\ +\xd7\x01\x86\x00\x05\xff\xae\x01\x86\x00\x0a\xff\xae\x01\x86\x01\ +\x8d\xff\xec\x01\x86\x01\x91\xff\xec\x01\x86\x02\x07\xff\xae\x01\ +\x86\x02\x0b\xff\xae\x01\x87\x01y\xff\xd7\x01\x87\x01~\xff\ +\xd7\x01\x87\x01\x8c\xff\xd7\x01\x87\x01\x8f\xff\xd7\x01\x87\x01\ +\x90\xff\xd7\x01\x87\x01\x93\xff\xd7\x01\x87\x01\x99\xff\xd7\x01\ +\x88\x00\x05\xff\x85\x01\x88\x00\x0a\xff\x85\x01\x88\x01y\xff\ +\xec\x01\x88\x01~\xff\xec\x01\x88\x01\x80\xff\xd7\x01\x88\x01\ +\x8a\xff\xd7\x01\x88\x01\x8c\xff\xec\x01\x88\x01\x8d\xff\xd7\x01\ +\x88\x01\x8f\xff\xec\x01\x88\x01\x90\xff\xec\x01\x88\x01\x91\xff\ +\xd7\x01\x88\x01\x93\xff\xec\x01\x88\x01\x99\xff\xec\x01\x88\x02\ +\x07\xff\x85\x01\x88\x02\x0b\xff\x85\x01\x8a\x00\x0f\xff\xae\x01\ +\x8a\x00\x11\xff\xae\x01\x8a\x01\x88\xff\xec\x01\x8a\x02\x08\xff\ +\xae\x01\x8a\x02\x0c\xff\xae\x01\x8c\x00\x05\xff\xec\x01\x8c\x00\ +\x0a\xff\xec\x01\x8c\x01\x80\xff\xd7\x01\x8c\x01\x8a\xff\xd7\x01\ +\x8c\x02\x07\xff\xec\x01\x8c\x02\x0b\xff\xec\x01\x8e\x00\x05\xff\ +\xec\x01\x8e\x00\x0a\xff\xec\x01\x8e\x01\x80\xff\xd7\x01\x8e\x01\ +\x8a\xff\xd7\x01\x8e\x02\x07\xff\xec\x01\x8e\x02\x0b\xff\xec\x01\ +\x90\x00\x0f\xff\xec\x01\x90\x00\x11\xff\xec\x01\x90\x02\x08\xff\ +\xec\x01\x90\x02\x0c\xff\xec\x01\x93\x00\x05\xff\xec\x01\x93\x00\ +\x0a\xff\xec\x01\x93\x01\x80\xff\xd7\x01\x93\x01\x8a\xff\xd7\x01\ +\x93\x02\x07\xff\xec\x01\x93\x02\x0b\xff\xec\x01\x94\x00\x0f\xff\ +\xc3\x01\x94\x00\x10\xff\xd7\x01\x94\x00\x11\xff\xc3\x01\x94\x01\ +y\xff\xd7\x01\x94\x01~\xff\xd7\x01\x94\x01\x81\xff\xd7\x01\ +\x94\x01\x8c\xff\xd7\x01\x94\x01\x8f\xff\xd7\x01\x94\x01\x90\xff\ +\xd7\x01\x94\x01\x93\xff\xd7\x01\x94\x01\x99\xff\xd7\x01\x94\x02\ +\x02\xff\xd7\x01\x94\x02\x03\xff\xd7\x01\x94\x02\x04\xff\xd7\x01\ +\x94\x02\x08\xff\xc3\x01\x94\x02\x0c\xff\xc3\x01\x97\x00\x05\xff\ +\xd7\x01\x97\x00\x0a\xff\xd7\x01\x97\x02\x07\xff\xd7\x01\x97\x02\ +\x0b\xff\xd7\x01\x99\x00\x05\xff\xec\x01\x99\x00\x0a\xff\xec\x01\ +\x99\x01\x80\xff\xd7\x01\x99\x01\x8a\xff\xd7\x01\x99\x02\x07\xff\ +\xec\x01\x99\x02\x0b\xff\xec\x01\x9d\x00\x05\xff\xae\x01\x9d\x00\ +\x0a\xff\xae\x01\x9d\x01\x9d\xff\x85\x01\x9d\x01\xa6\xff\x85\x01\ +\x9d\x01\xa8\xff\xd7\x01\x9d\x01\xbc\xff\x9a\x01\x9d\x01\xbd\xff\ +\xd7\x01\x9d\x01\xc1\xff\x9a\x01\x9d\x01\xc4\xff\x85\x01\x9d\x01\ +\xdc\xff\xd7\x01\x9d\x01\xdd\xff\xd7\x01\x9d\x01\xe1\xff\xd7\x01\ +\x9d\x01\xe4\xff\xd7\x01\x9d\x01\xf6\xff\xd7\x01\x9d\x02\x07\xff\ +\xae\x01\x9d\x02\x0b\xff\xae\x01\x9d\x02n\xff\xae\x01\x9d\x02\ +|\xff\x9a\x01\x9d\x02\x80\xff\xae\x01\x9d\x02\x82\xff\xae\x01\ +\x9d\x02\x97\xff\xae\x01\x9d\x02\x9b\xff\xae\x01\x9d\x02\xa7\xff\ +\xae\x01\x9d\x02\xa9\xff\x85\x01\x9d\x02\xaa\xff\xd7\x01\x9d\x02\ +\xb5\xff\x9a\x01\x9d\x02\xb6\xff\xd7\x01\x9d\x02\xb7\xff\x9a\x01\ +\x9d\x02\xb8\xff\xd7\x01\x9d\x02\xb9\xff\x9a\x01\x9d\x02\xba\xff\ +\xd7\x01\x9d\x02\xbd\xff\x85\x01\x9d\x02\xbe\xff\xd7\x01\x9d\x02\ +\xbf\xff\x9a\x01\x9d\x02\xc0\xff\xd7\x01\x9d\x02\xc1\xff\x9a\x01\ +\x9d\x02\xc2\xff\xd7\x01\x9d\x02\xd4\xff\x9a\x01\x9d\x02\xd5\xff\ +\xd7\x01\x9d\x02\xf7\xff\xd7\x01\x9d\x02\xf8\xff\xd7\x01\x9d\x02\ +\xf9\xff\xd7\x01\x9d\x02\xfa\xff\xd7\x01\x9d\x02\xfb\xff\xd7\x01\ +\x9d\x02\xfc\xff\xd7\x01\x9d\x02\xfd\xff\x9a\x01\x9d\x02\xfe\xff\ +\xd7\x01\x9d\x03\x03\xff\xae\x01\x9d\x03\x0d\xff\x9a\x01\x9d\x03\ +\x0e\xff\xc3\x01\x9d\x03\x0f\xff\x9a\x01\x9d\x03\x10\xff\xc3\x01\ +\x9d\x03\x17\xff\x85\x01\x9d\x03\x18\xff\xd7\x01\x9e\x00\x0f\xff\ +\x85\x01\x9e\x00\x10\xff\xae\x01\x9e\x00\x11\xff\x85\x01\x9e\x01\ +\x9f\xff\xd7\x01\x9e\x01\xa4\xff\x9a\x01\x9e\x01\xaa\xffq\x01\ +\x9e\x01\xae\xff\x9a\x01\x9e\x01\xb5\xff\x9a\x01\x9e\x01\xb8\xff\ +\xd7\x01\x9e\x01\xbb\xff\xd7\x01\x9e\x01\xbc\x00)\x01\x9e\x01\ +\xbe\xff\xae\x01\x9e\x01\xcc\xff\x9a\x01\x9e\x01\xcd\xff\x9a\x01\ +\x9e\x01\xce\xff\x85\x01\x9e\x01\xcf\xffq\x01\x9e\x01\xd0\xff\ +\xd7\x01\x9e\x01\xd1\xff\xd7\x01\x9e\x01\xd2\xff\x9a\x01\x9e\x01\ +\xd3\xff\x9a\x01\x9e\x01\xd4\xff\x9a\x01\x9e\x01\xd5\xff\x85\x01\ +\x9e\x01\xd6\xff\x9a\x01\x9e\x01\xd7\xff\x9a\x01\x9e\x01\xd8\xff\ +q\x01\x9e\x01\xd9\xff\x9a\x01\x9e\x01\xda\xff\x9a\x01\x9e\x01\ +\xdb\xffq\x01\x9e\x01\xdc\xff\xae\x01\x9e\x01\xdd\xff\xae\x01\ +\x9e\x01\xde\xffq\x01\x9e\x01\xdf\xff\xd7\x01\x9e\x01\xe0\xff\ +\x9a\x01\x9e\x01\xe1\xff\x9a\x01\x9e\x01\xe2\xff\x9a\x01\x9e\x01\ +\xe3\xff\x9a\x01\x9e\x01\xe4\xff\xae\x01\x9e\x01\xe5\xff\x9a\x01\ +\x9e\x01\xe6\xff\x9a\x01\x9e\x01\xe7\xff\xd7\x01\x9e\x01\xe8\xff\ +\x9a\x01\x9e\x01\xe9\xff\xc3\x01\x9e\x01\xea\xffq\x01\x9e\x01\ +\xec\xff\x9a\x01\x9e\x01\xed\xffq\x01\x9e\x01\xee\xff\x85\x01\ +\x9e\x01\xf2\xff\x85\x01\x9e\x01\xf3\xff\x9a\x01\x9e\x01\xf5\xff\ +\x9a\x01\x9e\x01\xf6\xff\xae\x01\x9e\x01\xf7\xff\x9a\x01\x9e\x01\ +\xf9\xff\x9a\x01\x9e\x02\x02\xff\xae\x01\x9e\x02\x03\xff\xae\x01\ +\x9e\x02\x04\xff\xae\x01\x9e\x02\x08\xff\x85\x01\x9e\x02\x0c\xff\ +\x85\x01\x9e\x02j\xffq\x01\x9e\x02k\xff\x9a\x01\x9e\x02\ +l\xff\xd7\x01\x9e\x02m\xff\xd7\x01\x9e\x02q\xff\x9a\x01\ +\x9e\x02r\xffq\x01\x9e\x02s\xff\x85\x01\x9e\x02u\xff\ +\x9a\x01\x9e\x02w\xff\x9a\x01\x9e\x02y\xff\x9a\x01\x9e\x02\ +}\xff\x9a\x01\x9e\x02~\xff\xd7\x01\x9e\x02\x7f\xffq\x01\ +\x9e\x02\x81\xff\xd7\x01\x9e\x02\x83\xff\xd7\x01\x9e\x02\x84\xff\ +\xd7\x01\x9e\x02\x85\xffq\x01\x9e\x02\x86\xff\xd7\x01\x9e\x02\ +\x87\xffq\x01\x9e\x02\x88\xff\xd7\x01\x9e\x02\x89\xffq\x01\ +\x9e\x02\x8a\xff\xd7\x01\x9e\x02\x8b\xff\xd7\x01\x9e\x02\x8c\xff\ +\xd7\x01\x9e\x02\x8d\xffq\x01\x9e\x02\x96\xff\x9a\x01\x9e\x02\ +\x9a\xff\x9a\x01\x9e\x02\x9e\xff\x9a\x01\x9e\x02\xa0\xff\xd7\x01\ +\x9e\x02\xa2\xff\xd7\x01\x9e\x02\xa4\xff\x9a\x01\x9e\x02\xa6\xff\ +\x9a\x01\x9e\x02\xaa\xff\xae\x01\x9e\x02\xac\xff\x9a\x01\x9e\x02\ +\xae\xff\x9a\x01\x9e\x02\xb0\xff\x9a\x01\x9e\x02\xb1\xff\xd7\x01\ +\x9e\x02\xb2\xffq\x01\x9e\x02\xb3\xff\xd7\x01\x9e\x02\xb4\xff\ +q\x01\x9e\x02\xb5\x00)\x01\x9e\x02\xb6\xff\xae\x01\x9e\x02\ +\xb8\xff\xae\x01\x9e\x02\xba\xff\xae\x01\x9e\x02\xbc\xff\xd7\x01\ +\x9e\x02\xbe\xff\xae\x01\x9e\x02\xc0\xff\x9a\x01\x9e\x02\xc2\xff\ +\x9a\x01\x9e\x02\xc4\xff\x9a\x01\x9e\x02\xc5\xff\x9a\x01\x9e\x02\ +\xc6\xffq\x01\x9e\x02\xc7\xff\x9a\x01\x9e\x02\xc8\xffq\x01\ +\x9e\x02\xcb\xff\xd7\x01\x9e\x02\xcd\xff\x9a\x01\x9e\x02\xce\xff\ +\x9a\x01\x9e\x02\xcf\xff\x85\x01\x9e\x02\xd1\xff\x9a\x01\x9e\x02\ +\xd3\xff\x9a\x01\x9e\x02\xd5\xff\x9a\x01\x9e\x02\xd7\xff\x9a\x01\ +\x9e\x02\xd9\xffq\x01\x9e\x02\xdb\xffq\x01\x9e\x02\xdd\xff\ +q\x01\x9e\x02\xe0\xffq\x01\x9e\x02\xe6\xff\xd7\x01\x9e\x02\ +\xe8\xff\xd7\x01\x9e\x02\xea\xff\xc3\x01\x9e\x02\xec\xff\x9a\x01\ +\x9e\x02\xee\xff\x9a\x01\x9e\x02\xef\xff\xd7\x01\x9e\x02\xf0\xff\ +q\x01\x9e\x02\xf1\xff\xd7\x01\x9e\x02\xf2\xffq\x01\x9e\x02\ +\xf3\xff\xd7\x01\x9e\x02\xf4\xffq\x01\x9e\x02\xf6\xff\xd7\x01\ +\x9e\x02\xf8\xff\xae\x01\x9e\x02\xfa\xff\xae\x01\x9e\x02\xfc\xff\ +\xae\x01\x9e\x02\xfe\xff\x9a\x01\x9e\x03\x00\xff\x9a\x01\x9e\x03\ +\x02\xff\x9a\x01\x9e\x03\x06\xff\xd7\x01\x9e\x03\x08\xff\xd7\x01\ +\x9e\x03\x09\xffq\x01\x9e\x03\x0a\xffq\x01\x9e\x03\x0b\xff\ +q\x01\x9e\x03\x0c\xffq\x01\x9e\x03\x0e\xff\x9a\x01\x9e\x03\ +\x10\xff\x9a\x01\x9e\x03\x11\xff\x9a\x01\x9e\x03\x12\xff\x85\x01\ +\x9e\x03\x14\xff\x9a\x01\x9e\x03\x15\xff\xd7\x01\x9e\x03\x16\xff\ +q\x01\x9e\x03\x18\xff\xae\x01\x9e\x03\x1a\xffq\x01\x9e\x03\ +\x1b\xff\x9a\x01\x9e\x03\x1c\xff\x85\x01\x9f\x01\x9f\xff\xd7\x01\ +\x9f\x01\xb8\xff\xd7\x01\x9f\x01\xbb\xff\xd7\x01\x9f\x01\xbe\xff\ +\xd7\x01\x9f\x01\xe1\xff\xd7\x01\x9f\x02l\xff\xd7\x01\x9f\x02\ +~\xff\xd7\x01\x9f\x02\x84\xff\xd7\x01\x9f\x02\x86\xff\xd7\x01\ +\x9f\x02\x88\xff\xd7\x01\x9f\x02\x8a\xff\xd7\x01\x9f\x02\x8c\xff\ +\xd7\x01\x9f\x02\xb1\xff\xd7\x01\x9f\x02\xb3\xff\xd7\x01\x9f\x02\ +\xc0\xff\xd7\x01\x9f\x02\xc2\xff\xd7\x01\x9f\x02\xc5\xff\xd7\x01\ +\x9f\x02\xc7\xff\xd7\x01\x9f\x02\xd5\xff\xd7\x01\x9f\x02\xef\xff\ +\xd7\x01\x9f\x02\xf1\xff\xd7\x01\x9f\x02\xf3\xff\xd7\x01\x9f\x02\ +\xfe\xff\xd7\x01\x9f\x03\x09\xff\xd7\x01\x9f\x03\x0b\xff\xd7\x01\ +\x9f\x03\x0e\xff\xd7\x01\x9f\x03\x10\xff\xd7\x01\x9f\x03\x15\xff\ +\xd7\x01\xa0\x03\x0e\xff\xd7\x01\xa0\x03\x10\xff\xd7\x01\xa4\x00\ +\x05\xff\xae\x01\xa4\x00\x0a\xff\xae\x01\xa4\x01\x9d\xff\x85\x01\ +\xa4\x01\xa6\xff\x85\x01\xa4\x01\xa8\xff\xd7\x01\xa4\x01\xbc\xff\ +\x9a\x01\xa4\x01\xbd\xff\xd7\x01\xa4\x01\xc1\xff\x9a\x01\xa4\x01\ +\xc4\xff\x85\x01\xa4\x01\xdc\xff\xd7\x01\xa4\x01\xdd\xff\xd7\x01\ +\xa4\x01\xe1\xff\xd7\x01\xa4\x01\xe4\xff\xd7\x01\xa4\x01\xf6\xff\ +\xd7\x01\xa4\x02\x07\xff\xae\x01\xa4\x02\x0b\xff\xae\x01\xa4\x02\ +n\xff\xae\x01\xa4\x02|\xff\x9a\x01\xa4\x02\x80\xff\xae\x01\ +\xa4\x02\x82\xff\xae\x01\xa4\x02\x97\xff\xae\x01\xa4\x02\x9b\xff\ +\xae\x01\xa4\x02\xa7\xff\xae\x01\xa4\x02\xa9\xff\x85\x01\xa4\x02\ +\xaa\xff\xd7\x01\xa4\x02\xb5\xff\x9a\x01\xa4\x02\xb6\xff\xd7\x01\ +\xa4\x02\xb7\xff\x9a\x01\xa4\x02\xb8\xff\xd7\x01\xa4\x02\xb9\xff\ +\x9a\x01\xa4\x02\xba\xff\xd7\x01\xa4\x02\xbd\xff\x85\x01\xa4\x02\ +\xbe\xff\xd7\x01\xa4\x02\xbf\xff\x9a\x01\xa4\x02\xc0\xff\xd7\x01\ +\xa4\x02\xc1\xff\x9a\x01\xa4\x02\xc2\xff\xd7\x01\xa4\x02\xd4\xff\ +\x9a\x01\xa4\x02\xd5\xff\xd7\x01\xa4\x02\xf7\xff\xd7\x01\xa4\x02\ +\xf8\xff\xd7\x01\xa4\x02\xf9\xff\xd7\x01\xa4\x02\xfa\xff\xd7\x01\ +\xa4\x02\xfb\xff\xd7\x01\xa4\x02\xfc\xff\xd7\x01\xa4\x02\xfd\xff\ +\x9a\x01\xa4\x02\xfe\xff\xd7\x01\xa4\x03\x03\xff\xae\x01\xa4\x03\ +\x0d\xff\x9a\x01\xa4\x03\x0e\xff\xc3\x01\xa4\x03\x0f\xff\x9a\x01\ +\xa4\x03\x10\xff\xc3\x01\xa4\x03\x17\xff\x85\x01\xa4\x03\x18\xff\ +\xd7\x01\xa5\x00\x05\xff\xae\x01\xa5\x00\x0a\xff\xae\x01\xa5\x01\ +\x9d\xff\x85\x01\xa5\x01\xa6\xff\x85\x01\xa5\x01\xa8\xff\xd7\x01\ +\xa5\x01\xbc\xff\x9a\x01\xa5\x01\xbd\xff\xd7\x01\xa5\x01\xc1\xff\ +\x9a\x01\xa5\x01\xc4\xff\x85\x01\xa5\x01\xdc\xff\xd7\x01\xa5\x01\ +\xdd\xff\xd7\x01\xa5\x01\xe1\xff\xd7\x01\xa5\x01\xe4\xff\xd7\x01\ +\xa5\x01\xf6\xff\xd7\x01\xa5\x02\x07\xff\xae\x01\xa5\x02\x0b\xff\ +\xae\x01\xa5\x02n\xff\xae\x01\xa5\x02|\xff\x9a\x01\xa5\x02\ +\x80\xff\xae\x01\xa5\x02\x82\xff\xae\x01\xa5\x02\x97\xff\xae\x01\ +\xa5\x02\x9b\xff\xae\x01\xa5\x02\xa7\xff\xae\x01\xa5\x02\xa9\xff\ +\x85\x01\xa5\x02\xaa\xff\xd7\x01\xa5\x02\xb5\xff\x9a\x01\xa5\x02\ +\xb6\xff\xd7\x01\xa5\x02\xb7\xff\x9a\x01\xa5\x02\xb8\xff\xd7\x01\ +\xa5\x02\xb9\xff\x9a\x01\xa5\x02\xba\xff\xd7\x01\xa5\x02\xbd\xff\ +\x85\x01\xa5\x02\xbe\xff\xd7\x01\xa5\x02\xbf\xff\x9a\x01\xa5\x02\ +\xc0\xff\xd7\x01\xa5\x02\xc1\xff\x9a\x01\xa5\x02\xc2\xff\xd7\x01\ +\xa5\x02\xd4\xff\x9a\x01\xa5\x02\xd5\xff\xd7\x01\xa5\x02\xf7\xff\ +\xd7\x01\xa5\x02\xf8\xff\xd7\x01\xa5\x02\xf9\xff\xd7\x01\xa5\x02\ +\xfa\xff\xd7\x01\xa5\x02\xfb\xff\xd7\x01\xa5\x02\xfc\xff\xd7\x01\ +\xa5\x02\xfd\xff\x9a\x01\xa5\x02\xfe\xff\xd7\x01\xa5\x03\x03\xff\ +\xae\x01\xa5\x03\x0d\xff\x9a\x01\xa5\x03\x0e\xff\xc3\x01\xa5\x03\ +\x0f\xff\x9a\x01\xa5\x03\x10\xff\xc3\x01\xa5\x03\x17\xff\x85\x01\ +\xa5\x03\x18\xff\xd7\x01\xa6\x00\x05\xff\xae\x01\xa6\x00\x0a\xff\ +\xae\x01\xa6\x01\x9d\xff\x85\x01\xa6\x01\xa6\xff\x85\x01\xa6\x01\ +\xa8\xff\xd7\x01\xa6\x01\xbc\xff\x9a\x01\xa6\x01\xbd\xff\xd7\x01\ +\xa6\x01\xc1\xff\x9a\x01\xa6\x01\xc4\xff\x85\x01\xa6\x01\xdc\xff\ +\xd7\x01\xa6\x01\xdd\xff\xd7\x01\xa6\x01\xe1\xff\xd7\x01\xa6\x01\ +\xe4\xff\xd7\x01\xa6\x01\xf6\xff\xd7\x01\xa6\x02\x07\xff\xae\x01\ +\xa6\x02\x0b\xff\xae\x01\xa6\x02n\xff\xae\x01\xa6\x02|\xff\ +\x9a\x01\xa6\x02\x80\xff\xae\x01\xa6\x02\x82\xff\xae\x01\xa6\x02\ +\x97\xff\xae\x01\xa6\x02\x9b\xff\xae\x01\xa6\x02\xa7\xff\xae\x01\ +\xa6\x02\xa9\xff\x85\x01\xa6\x02\xaa\xff\xd7\x01\xa6\x02\xb5\xff\ +\x9a\x01\xa6\x02\xb6\xff\xd7\x01\xa6\x02\xb7\xff\x9a\x01\xa6\x02\ +\xb8\xff\xd7\x01\xa6\x02\xb9\xff\x9a\x01\xa6\x02\xba\xff\xd7\x01\ +\xa6\x02\xbd\xff\x85\x01\xa6\x02\xbe\xff\xd7\x01\xa6\x02\xbf\xff\ +\x9a\x01\xa6\x02\xc0\xff\xd7\x01\xa6\x02\xc1\xff\x9a\x01\xa6\x02\ +\xc2\xff\xd7\x01\xa6\x02\xd4\xff\x9a\x01\xa6\x02\xd5\xff\xd7\x01\ +\xa6\x02\xf7\xff\xd7\x01\xa6\x02\xf8\xff\xd7\x01\xa6\x02\xf9\xff\ +\xd7\x01\xa6\x02\xfa\xff\xd7\x01\xa6\x02\xfb\xff\xd7\x01\xa6\x02\ +\xfc\xff\xd7\x01\xa6\x02\xfd\xff\x9a\x01\xa6\x02\xfe\xff\xd7\x01\ +\xa6\x03\x03\xff\xae\x01\xa6\x03\x0d\xff\x9a\x01\xa6\x03\x0e\xff\ +\xc3\x01\xa6\x03\x0f\xff\x9a\x01\xa6\x03\x10\xff\xc3\x01\xa6\x03\ +\x17\xff\x85\x01\xa6\x03\x18\xff\xd7\x01\xa7\x01\x9f\xff\xd7\x01\ +\xa7\x01\xb8\xff\xd7\x01\xa7\x01\xbb\xff\xd7\x01\xa7\x01\xbe\xff\ +\xd7\x01\xa7\x01\xc1\xff\xd7\x01\xa7\x01\xe1\xff\xd7\x01\xa7\x02\ +l\xff\xd7\x01\xa7\x02|\xff\xd7\x01\xa7\x02~\xff\xd7\x01\ +\xa7\x02\x84\xff\xd7\x01\xa7\x02\x86\xff\xd7\x01\xa7\x02\x88\xff\ +\xd7\x01\xa7\x02\x8a\xff\xd7\x01\xa7\x02\x8c\xff\xd7\x01\xa7\x02\ +\xb1\xff\xd7\x01\xa7\x02\xb3\xff\xd7\x01\xa7\x02\xbf\xff\xd7\x01\ +\xa7\x02\xc0\xff\xd7\x01\xa7\x02\xc1\xff\xd7\x01\xa7\x02\xc2\xff\ +\xd7\x01\xa7\x02\xc5\xff\x9a\x01\xa7\x02\xc7\xff\x9a\x01\xa7\x02\ +\xd4\xff\xd7\x01\xa7\x02\xd5\xff\xd7\x01\xa7\x02\xef\xff\xd7\x01\ +\xa7\x02\xf1\xff\xd7\x01\xa7\x02\xf3\xff\xd7\x01\xa7\x02\xfd\xff\ +\xd7\x01\xa7\x02\xfe\xff\xd7\x01\xa7\x03\x09\xff\xd7\x01\xa7\x03\ +\x0b\xff\xd7\x01\xa7\x03\x0e\xff\xd7\x01\xa7\x03\x10\xff\xd7\x01\ +\xa7\x03\x15\xff\xd7\x01\xa7\x03\x19\xff\xec\x01\xa8\x00\x0f\xff\ +\x85\x01\xa8\x00\x11\xff\x85\x01\xa8\x01\x9f\xff\xec\x01\xa8\x01\ +\xa4\xff\x9a\x01\xa8\x01\xaa\xffq\x01\xa8\x01\xae\xff\x9a\x01\ +\xa8\x01\xb5\xff\x9a\x01\xa8\x01\xb8\xff\xec\x01\xa8\x01\xbb\xff\ +\xec\x01\xa8\x01\xbe\xff\xc3\x01\xa8\x01\xc9\xff\xec\x01\xa8\x01\ +\xce\xff\xae\x01\xa8\x01\xcf\xff\xd7\x01\xa8\x01\xd5\xff\xae\x01\ +\xa8\x01\xd8\xff\xd7\x01\xa8\x01\xdb\xff\xd7\x01\xa8\x01\xde\xff\ +\xd7\x01\xa8\x01\xe1\xff\xd7\x01\xa8\x01\xea\xff\xd7\x01\xa8\x01\ +\xeb\x00f\x01\xa8\x01\xed\xff\xd7\x01\xa8\x01\xee\xff\xec\x01\ +\xa8\x01\xf2\xff\xae\x01\xa8\x01\xf4\x00f\x01\xa8\x02\x08\xff\ +\x85\x01\xa8\x02\x0c\xff\x85\x01\xa8\x02j\xff\xd7\x01\xa8\x02\ +l\xff\xec\x01\xa8\x02r\xffq\x01\xa8\x02s\xff\xae\x01\ +\xa8\x02~\xff\xec\x01\xa8\x02\x7f\xff\xd7\x01\xa8\x02\x84\xff\ +\xec\x01\xa8\x02\x85\xff\xd7\x01\xa8\x02\x86\xff\xec\x01\xa8\x02\ +\x87\xff\xd7\x01\xa8\x02\x88\xff\xec\x01\xa8\x02\x89\xff\xd7\x01\ +\xa8\x02\x8a\xff\xec\x01\xa8\x02\x8c\xff\xec\x01\xa8\x02\x8d\xff\ +\xd7\x01\xa8\x02\x98\x00f\x01\xa8\x02\xa8\x00f\x01\xa8\x02\ +\xb1\xff\xec\x01\xa8\x02\xb2\xff\xd7\x01\xa8\x02\xb3\xff\xec\x01\ +\xa8\x02\xb4\xff\xd7\x01\xa8\x02\xc0\xff\xd7\x01\xa8\x02\xc2\xff\ +\xd7\x01\xa8\x02\xc5\xff\xd7\x01\xa8\x02\xc6\xff\xc3\x01\xa8\x02\ +\xc7\xff\xd7\x01\xa8\x02\xc8\xff\xc3\x01\xa8\x02\xce\xff\x9a\x01\ +\xa8\x02\xcf\xff\xae\x01\xa8\x02\xd5\xff\xd7\x01\xa8\x02\xd9\xff\ +q\x01\xa8\x02\xdb\xffq\x01\xa8\x02\xdd\xffq\x01\xa8\x02\ +\xe0\xff\xd7\x01\xa8\x02\xef\xff\xec\x01\xa8\x02\xf0\xff\xd7\x01\ +\xa8\x02\xf1\xff\xec\x01\xa8\x02\xf2\xff\xd7\x01\xa8\x02\xf3\xff\ +\xec\x01\xa8\x02\xf4\xff\xd7\x01\xa8\x02\xfe\xff\xd7\x01\xa8\x03\ +\x09\xffq\x01\xa8\x03\x0a\xff\xd7\x01\xa8\x03\x0b\xffq\x01\ +\xa8\x03\x0c\xff\xd7\x01\xa8\x03\x11\xff\x9a\x01\xa8\x03\x12\xff\ +\xae\x01\xa8\x03\x15\xff\xec\x01\xa8\x03\x16\xff\xd7\x01\xa8\x03\ +\x1a\xff\xd7\x01\xa8\x03\x1b\xff\x9a\x01\xa8\x03\x1c\xff\xae\x01\ +\xaa\x00\x05\xffq\x01\xaa\x00\x0a\xffq\x01\xaa\x01\x9d\xff\ +\x9a\x01\xaa\x01\xa6\xff\x9a\x01\xaa\x01\xbc\xffq\x01\xaa\x01\ +\xbe\xff\xd7\x01\xaa\x01\xc1\xff\x9a\x01\xaa\x01\xc4\xff\x9a\x01\ +\xaa\x01\xdc\xff\xd7\x01\xaa\x01\xe1\xff\xd7\x01\xaa\x01\xe4\xff\ +\xd7\x01\xaa\x02\x07\xffq\x01\xaa\x02\x0b\xffq\x01\xaa\x02\ +n\xff\xd7\x01\xaa\x02|\xff\x9a\x01\xaa\x02\x80\xff\xae\x01\ +\xaa\x02\x82\xff\xae\x01\xaa\x02\x97\xff\xd7\x01\xaa\x02\x9b\xff\ +\xd7\x01\xaa\x02\xa7\xff\xd7\x01\xaa\x02\xa9\xff\x9a\x01\xaa\x02\ +\xaa\xff\xd7\x01\xaa\x02\xb5\xffq\x01\xaa\x02\xb6\xff\xd7\x01\ +\xaa\x02\xb7\xff\x85\x01\xaa\x02\xb9\xff\x85\x01\xaa\x02\xbd\xff\ +\x9a\x01\xaa\x02\xbe\xff\xd7\x01\xaa\x02\xbf\xff\x9a\x01\xaa\x02\ +\xc0\xff\xd7\x01\xaa\x02\xc1\xff\x9a\x01\xaa\x02\xc2\xff\xd7\x01\ +\xaa\x02\xc5\xff\x9a\x01\xaa\x02\xc7\xff\x9a\x01\xaa\x02\xd4\xff\ +\x9a\x01\xaa\x02\xd5\xff\xd7\x01\xaa\x02\xe1\xff\xd7\x01\xaa\x02\ +\xe3\xff\xd7\x01\xaa\x02\xfd\xff\x9a\x01\xaa\x02\xfe\xff\xd7\x01\ +\xaa\x03\x03\xff\xd7\x01\xaa\x03\x0d\xffq\x01\xaa\x03\x0e\xff\ +\xd7\x01\xaa\x03\x0f\xffq\x01\xaa\x03\x10\xff\xd7\x01\xaa\x03\ +\x17\xff\x9a\x01\xaa\x03\x18\xff\xd7\x01\xab\x00\x05\xff\xd7\x01\ +\xab\x00\x0a\xff\xd7\x01\xab\x01\xaa\xff\xec\x01\xab\x01\xc1\xff\ +\xd7\x01\xab\x02\x07\xff\xd7\x01\xab\x02\x0b\xff\xd7\x01\xab\x02\ +r\xff\xec\x01\xab\x02|\xff\xd7\x01\xab\x02\xbf\xff\xd7\x01\ +\xab\x02\xc1\xff\xd7\x01\xab\x02\xc5\xff\xd7\x01\xab\x02\xc7\xff\ +\xd7\x01\xab\x02\xd4\xff\xd7\x01\xab\x02\xd9\xff\xec\x01\xab\x02\ +\xdb\xff\xec\x01\xab\x02\xdd\xff\xec\x01\xab\x02\xfd\xff\xd7\x01\ +\xac\x00\x0f\xff\xae\x01\xac\x00\x11\xff\xae\x01\xac\x02\x08\xff\ +\xae\x01\xac\x02\x0c\xff\xae\x01\xac\x02\x80\xff\xec\x01\xac\x02\ +\x82\xff\xec\x01\xac\x02\xb7\xff\xec\x01\xac\x02\xb9\xff\xec\x01\ +\xac\x03\x0d\xff\xd7\x01\xac\x03\x0f\xff\xd7\x01\xad\x00\x0f\xff\ +\x85\x01\xad\x00\x10\xff\xae\x01\xad\x00\x11\xff\x85\x01\xad\x01\ +\x9f\xff\xd7\x01\xad\x01\xa4\xff\x9a\x01\xad\x01\xaa\xffq\x01\ +\xad\x01\xae\xff\x9a\x01\xad\x01\xb5\xff\x9a\x01\xad\x01\xb8\xff\ +\xd7\x01\xad\x01\xbb\xff\xd7\x01\xad\x01\xbc\x00)\x01\xad\x01\ +\xbe\xff\xae\x01\xad\x01\xcc\xff\x9a\x01\xad\x01\xcd\xff\x9a\x01\ +\xad\x01\xce\xff\x85\x01\xad\x01\xcf\xffq\x01\xad\x01\xd0\xff\ +\xd7\x01\xad\x01\xd1\xff\xd7\x01\xad\x01\xd2\xff\x9a\x01\xad\x01\ +\xd3\xff\x9a\x01\xad\x01\xd4\xff\x9a\x01\xad\x01\xd5\xff\x85\x01\ +\xad\x01\xd6\xff\x9a\x01\xad\x01\xd7\xff\x9a\x01\xad\x01\xd8\xff\ +q\x01\xad\x01\xd9\xff\x9a\x01\xad\x01\xda\xff\x9a\x01\xad\x01\ +\xdb\xffq\x01\xad\x01\xdc\xff\xae\x01\xad\x01\xdd\xff\xae\x01\ +\xad\x01\xde\xffq\x01\xad\x01\xdf\xff\xd7\x01\xad\x01\xe0\xff\ +\x9a\x01\xad\x01\xe1\xff\x9a\x01\xad\x01\xe2\xff\x9a\x01\xad\x01\ +\xe3\xff\x9a\x01\xad\x01\xe4\xff\xae\x01\xad\x01\xe5\xff\x9a\x01\ +\xad\x01\xe6\xff\x9a\x01\xad\x01\xe7\xff\xd7\x01\xad\x01\xe8\xff\ +\x9a\x01\xad\x01\xe9\xff\xc3\x01\xad\x01\xea\xffq\x01\xad\x01\ +\xec\xff\x9a\x01\xad\x01\xed\xffq\x01\xad\x01\xee\xff\x85\x01\ +\xad\x01\xf2\xff\x85\x01\xad\x01\xf3\xff\x9a\x01\xad\x01\xf5\xff\ +\x9a\x01\xad\x01\xf6\xff\xae\x01\xad\x01\xf7\xff\x9a\x01\xad\x01\ +\xf9\xff\x9a\x01\xad\x02\x02\xff\xae\x01\xad\x02\x03\xff\xae\x01\ +\xad\x02\x04\xff\xae\x01\xad\x02\x08\xff\x85\x01\xad\x02\x0c\xff\ +\x85\x01\xad\x02j\xffq\x01\xad\x02k\xff\x9a\x01\xad\x02\ +l\xff\xd7\x01\xad\x02m\xff\xd7\x01\xad\x02q\xff\x9a\x01\ +\xad\x02r\xffq\x01\xad\x02s\xff\x85\x01\xad\x02u\xff\ +\x9a\x01\xad\x02w\xff\x9a\x01\xad\x02y\xff\x9a\x01\xad\x02\ +}\xff\x9a\x01\xad\x02~\xff\xd7\x01\xad\x02\x7f\xffq\x01\ +\xad\x02\x81\xff\xd7\x01\xad\x02\x83\xff\xd7\x01\xad\x02\x84\xff\ +\xd7\x01\xad\x02\x85\xffq\x01\xad\x02\x86\xff\xd7\x01\xad\x02\ +\x87\xffq\x01\xad\x02\x88\xff\xd7\x01\xad\x02\x89\xffq\x01\ +\xad\x02\x8a\xff\xd7\x01\xad\x02\x8b\xff\xd7\x01\xad\x02\x8c\xff\ +\xd7\x01\xad\x02\x8d\xffq\x01\xad\x02\x96\xff\x9a\x01\xad\x02\ +\x9a\xff\x9a\x01\xad\x02\x9e\xff\x9a\x01\xad\x02\xa0\xff\xd7\x01\ +\xad\x02\xa2\xff\xd7\x01\xad\x02\xa4\xff\x9a\x01\xad\x02\xa6\xff\ +\x9a\x01\xad\x02\xaa\xff\xae\x01\xad\x02\xac\xff\x9a\x01\xad\x02\ +\xae\xff\x9a\x01\xad\x02\xb0\xff\x9a\x01\xad\x02\xb1\xff\xd7\x01\ +\xad\x02\xb2\xffq\x01\xad\x02\xb3\xff\xd7\x01\xad\x02\xb4\xff\ +q\x01\xad\x02\xb5\x00)\x01\xad\x02\xb6\xff\xae\x01\xad\x02\ +\xb8\xff\xae\x01\xad\x02\xba\xff\xae\x01\xad\x02\xbc\xff\xd7\x01\ +\xad\x02\xbe\xff\xae\x01\xad\x02\xc0\xff\x9a\x01\xad\x02\xc2\xff\ +\x9a\x01\xad\x02\xc4\xff\x9a\x01\xad\x02\xc5\xff\x9a\x01\xad\x02\ +\xc6\xffq\x01\xad\x02\xc7\xff\x9a\x01\xad\x02\xc8\xffq\x01\ +\xad\x02\xcb\xff\xd7\x01\xad\x02\xcd\xff\x9a\x01\xad\x02\xce\xff\ +\x9a\x01\xad\x02\xcf\xff\x85\x01\xad\x02\xd1\xff\x9a\x01\xad\x02\ +\xd3\xff\x9a\x01\xad\x02\xd5\xff\x9a\x01\xad\x02\xd7\xff\x9a\x01\ +\xad\x02\xd9\xffq\x01\xad\x02\xdb\xffq\x01\xad\x02\xdd\xff\ +q\x01\xad\x02\xe0\xffq\x01\xad\x02\xe6\xff\xd7\x01\xad\x02\ +\xe8\xff\xd7\x01\xad\x02\xea\xff\xc3\x01\xad\x02\xec\xff\x9a\x01\ +\xad\x02\xee\xff\x9a\x01\xad\x02\xef\xff\xd7\x01\xad\x02\xf0\xff\ +q\x01\xad\x02\xf1\xff\xd7\x01\xad\x02\xf2\xffq\x01\xad\x02\ +\xf3\xff\xd7\x01\xad\x02\xf4\xffq\x01\xad\x02\xf6\xff\xd7\x01\ +\xad\x02\xf8\xff\xae\x01\xad\x02\xfa\xff\xae\x01\xad\x02\xfc\xff\ +\xae\x01\xad\x02\xfe\xff\x9a\x01\xad\x03\x00\xff\x9a\x01\xad\x03\ +\x02\xff\x9a\x01\xad\x03\x06\xff\xd7\x01\xad\x03\x08\xff\xd7\x01\ +\xad\x03\x09\xffq\x01\xad\x03\x0a\xffq\x01\xad\x03\x0b\xff\ +q\x01\xad\x03\x0c\xffq\x01\xad\x03\x0e\xff\x9a\x01\xad\x03\ +\x10\xff\x9a\x01\xad\x03\x11\xff\x9a\x01\xad\x03\x12\xff\x85\x01\ +\xad\x03\x14\xff\x9a\x01\xad\x03\x15\xff\xd7\x01\xad\x03\x16\xff\ +q\x01\xad\x03\x18\xff\xae\x01\xad\x03\x1a\xffq\x01\xad\x03\ +\x1b\xff\x9a\x01\xad\x03\x1c\xff\x85\x01\xae\x01\xa3\x00\xe1\x01\ +\xae\x02\xea\x00)\x01\xae\x03\x0e\xff\xd7\x01\xae\x03\x10\xff\ +\xd7\x01\xb0\x01\x9f\xff\xd7\x01\xb0\x01\xb8\xff\xd7\x01\xb0\x01\ +\xbb\xff\xd7\x01\xb0\x01\xbe\xff\xd7\x01\xb0\x01\xc1\xff\xd7\x01\ +\xb0\x01\xe1\xff\xd7\x01\xb0\x02l\xff\xd7\x01\xb0\x02|\xff\ +\xd7\x01\xb0\x02~\xff\xd7\x01\xb0\x02\x84\xff\xd7\x01\xb0\x02\ +\x86\xff\xd7\x01\xb0\x02\x88\xff\xd7\x01\xb0\x02\x8a\xff\xd7\x01\ +\xb0\x02\x8c\xff\xd7\x01\xb0\x02\xb1\xff\xd7\x01\xb0\x02\xb3\xff\ +\xd7\x01\xb0\x02\xbf\xff\xd7\x01\xb0\x02\xc0\xff\xd7\x01\xb0\x02\ +\xc1\xff\xd7\x01\xb0\x02\xc2\xff\xd7\x01\xb0\x02\xc5\xff\x9a\x01\ +\xb0\x02\xc7\xff\x9a\x01\xb0\x02\xd4\xff\xd7\x01\xb0\x02\xd5\xff\ +\xd7\x01\xb0\x02\xef\xff\xd7\x01\xb0\x02\xf1\xff\xd7\x01\xb0\x02\ +\xf3\xff\xd7\x01\xb0\x02\xfd\xff\xd7\x01\xb0\x02\xfe\xff\xd7\x01\ +\xb0\x03\x09\xff\xd7\x01\xb0\x03\x0b\xff\xd7\x01\xb0\x03\x0e\xff\ +\xd7\x01\xb0\x03\x10\xff\xd7\x01\xb0\x03\x15\xff\xd7\x01\xb0\x03\ +\x19\xff\xec\x01\xb1\x00\x0f\xff\xae\x01\xb1\x00\x11\xff\xae\x01\ +\xb1\x02\x08\xff\xae\x01\xb1\x02\x0c\xff\xae\x01\xb1\x02\x80\xff\ +\xec\x01\xb1\x02\x82\xff\xec\x01\xb1\x02\xb7\xff\xec\x01\xb1\x02\ +\xb9\xff\xec\x01\xb1\x03\x0d\xff\xd7\x01\xb1\x03\x0f\xff\xd7\x01\ +\xb4\x01\x9f\xff\xd7\x01\xb4\x01\xb8\xff\xd7\x01\xb4\x01\xbb\xff\ +\xd7\x01\xb4\x01\xbe\xff\xd7\x01\xb4\x01\xc1\xff\xd7\x01\xb4\x01\ +\xe1\xff\xd7\x01\xb4\x02l\xff\xd7\x01\xb4\x02|\xff\xd7\x01\ +\xb4\x02~\xff\xd7\x01\xb4\x02\x84\xff\xd7\x01\xb4\x02\x86\xff\ +\xd7\x01\xb4\x02\x88\xff\xd7\x01\xb4\x02\x8a\xff\xd7\x01\xb4\x02\ +\x8c\xff\xd7\x01\xb4\x02\xb1\xff\xd7\x01\xb4\x02\xb3\xff\xd7\x01\ +\xb4\x02\xbf\xff\xd7\x01\xb4\x02\xc0\xff\xd7\x01\xb4\x02\xc1\xff\ +\xd7\x01\xb4\x02\xc2\xff\xd7\x01\xb4\x02\xc5\xff\x9a\x01\xb4\x02\ +\xc7\xff\x9a\x01\xb4\x02\xd4\xff\xd7\x01\xb4\x02\xd5\xff\xd7\x01\ +\xb4\x02\xef\xff\xd7\x01\xb4\x02\xf1\xff\xd7\x01\xb4\x02\xf3\xff\ +\xd7\x01\xb4\x02\xfd\xff\xd7\x01\xb4\x02\xfe\xff\xd7\x01\xb4\x03\ +\x09\xff\xd7\x01\xb4\x03\x0b\xff\xd7\x01\xb4\x03\x0e\xff\xd7\x01\ +\xb4\x03\x10\xff\xd7\x01\xb4\x03\x15\xff\xd7\x01\xb4\x03\x19\xff\ +\xec\x01\xb8\x00\x0f\xff\xae\x01\xb8\x00\x11\xff\xae\x01\xb8\x01\ +\x9d\xff\xec\x01\xb8\x01\xa4\xff\xd7\x01\xb8\x01\xa6\xff\xec\x01\ +\xb8\x01\xa8\xff\xd7\x01\xb8\x01\xaa\xff\xd7\x01\xb8\x01\xae\xff\ +\xd7\x01\xb8\x01\xb0\xff\xd7\x01\xb8\x01\xb1\xff\xec\x01\xb8\x01\ +\xb5\xff\xd7\x01\xb8\x01\xbc\xff\xc3\x01\xb8\x01\xbd\xff\xd7\x01\ +\xb8\x01\xbf\xff\xd7\x01\xb8\x01\xc1\xff\xd7\x01\xb8\x01\xc4\xff\ +\xec\x01\xb8\x01\xc7\xff\xec\x01\xb8\x01\xce\xff\xec\x01\xb8\x01\ +\xd5\xff\xec\x01\xb8\x01\xf2\xff\xec\x01\xb8\x02\x08\xff\xae\x01\ +\xb8\x02\x0c\xff\xae\x01\xb8\x02r\xff\xd7\x01\xb8\x02s\xff\ +\xec\x01\xb8\x02z\xff\xec\x01\xb8\x02|\xff\xd7\x01\xb8\x02\ +\x80\xff\xec\x01\xb8\x02\x82\xff\xec\x01\xb8\x02\x9f\xff\xd7\x01\ +\xb8\x02\xa1\xff\xec\x01\xb8\x02\xa9\xff\xec\x01\xb8\x02\xb5\xff\ +\xc3\x01\xb8\x02\xb7\xff\xec\x01\xb8\x02\xb9\xff\xec\x01\xb8\x02\ +\xbb\xff\xd7\x01\xb8\x02\xbd\xff\xec\x01\xb8\x02\xbf\xff\xd7\x01\ +\xb8\x02\xc1\xff\xd7\x01\xb8\x02\xca\xff\xd7\x01\xb8\x02\xce\xff\ +\xd7\x01\xb8\x02\xcf\xff\xec\x01\xb8\x02\xd4\xff\xd7\x01\xb8\x02\ +\xd9\xff\xd7\x01\xb8\x02\xdb\xff\xd7\x01\xb8\x02\xdd\xff\xd7\x01\ +\xb8\x02\xe5\xff\xd7\x01\xb8\x02\xe7\xff\xec\x01\xb8\x02\xf5\xff\ +\xec\x01\xb8\x02\xf7\xff\xd7\x01\xb8\x02\xf9\xff\xd7\x01\xb8\x02\ +\xfb\xff\xd7\x01\xb8\x02\xfd\xff\xd7\x01\xb8\x03\x05\xff\xd7\x01\ +\xb8\x03\x07\xff\xd7\x01\xb8\x03\x0d\xff\xd7\x01\xb8\x03\x0f\xff\ +\xd7\x01\xb8\x03\x11\xff\xd7\x01\xb8\x03\x12\xff\xec\x01\xb8\x03\ +\x17\xff\xec\x01\xb8\x03\x1b\xff\xd7\x01\xb8\x03\x1c\xff\xec\x01\ +\xba\x00\x0f\xfe\xf6\x01\xba\x00\x11\xfe\xf6\x01\xba\x01\xa4\xff\ +\x85\x01\xba\x01\xaa\xff\x9a\x01\xba\x01\xae\xff\x85\x01\xba\x01\ +\xb0\xff\xd7\x01\xba\x01\xb5\xff\x85\x01\xba\x01\xbf\xff\xd7\x01\ +\xba\x01\xce\xff\x9a\x01\xba\x01\xd5\xff\x9a\x01\xba\x01\xf2\xff\ +\x9a\x01\xba\x02\x08\xfe\xf6\x01\xba\x02\x0c\xfe\xf6\x01\xba\x02\ +r\xff\x9a\x01\xba\x02s\xff\x9a\x01\xba\x02v\xff\xec\x01\ +\xba\x02\x9f\xff\xd7\x01\xba\x02\xbb\xff\xd7\x01\xba\x02\xca\xff\ +\xd7\x01\xba\x02\xce\xff\x85\x01\xba\x02\xcf\xff\x9a\x01\xba\x02\ +\xd9\xff\x9a\x01\xba\x02\xdb\xff\x9a\x01\xba\x02\xdd\xff\x9a\x01\ +\xba\x02\xe5\xff\xd7\x01\xba\x03\x05\xff\xd7\x01\xba\x03\x07\xff\ +\xd7\x01\xba\x03\x09\xff\xae\x01\xba\x03\x0b\xff\xae\x01\xba\x03\ +\x11\xff\x85\x01\xba\x03\x12\xff\x9a\x01\xba\x03\x1b\xff\x85\x01\ +\xba\x03\x1c\xff\x9a\x01\xbb\x01\x9f\xff\xd7\x01\xbb\x01\xb8\xff\ +\xd7\x01\xbb\x01\xbb\xff\xd7\x01\xbb\x01\xbe\xff\xd7\x01\xbb\x01\ +\xe1\xff\xd7\x01\xbb\x02l\xff\xd7\x01\xbb\x02~\xff\xd7\x01\ +\xbb\x02\x84\xff\xd7\x01\xbb\x02\x86\xff\xd7\x01\xbb\x02\x88\xff\ +\xd7\x01\xbb\x02\x8a\xff\xd7\x01\xbb\x02\x8c\xff\xd7\x01\xbb\x02\ +\xb1\xff\xd7\x01\xbb\x02\xb3\xff\xd7\x01\xbb\x02\xc0\xff\xd7\x01\ +\xbb\x02\xc2\xff\xd7\x01\xbb\x02\xc5\xff\xd7\x01\xbb\x02\xc7\xff\ +\xd7\x01\xbb\x02\xd5\xff\xd7\x01\xbb\x02\xef\xff\xd7\x01\xbb\x02\ +\xf1\xff\xd7\x01\xbb\x02\xf3\xff\xd7\x01\xbb\x02\xfe\xff\xd7\x01\ +\xbb\x03\x09\xff\xd7\x01\xbb\x03\x0b\xff\xd7\x01\xbb\x03\x0e\xff\ +\xd7\x01\xbb\x03\x10\xff\xd7\x01\xbb\x03\x15\xff\xd7\x01\xbc\x00\ +\x0f\xff\x85\x01\xbc\x00\x10\xff\xae\x01\xbc\x00\x11\xff\x85\x01\ +\xbc\x01\x9f\xff\xd7\x01\xbc\x01\xa4\xff\x9a\x01\xbc\x01\xaa\xff\ +q\x01\xbc\x01\xae\xff\x9a\x01\xbc\x01\xb5\xff\x9a\x01\xbc\x01\ +\xb8\xff\xd7\x01\xbc\x01\xbb\xff\xd7\x01\xbc\x01\xbc\x00)\x01\ +\xbc\x01\xbe\xff\xae\x01\xbc\x01\xcc\xff\x9a\x01\xbc\x01\xcd\xff\ +\x9a\x01\xbc\x01\xce\xff\x85\x01\xbc\x01\xcf\xffq\x01\xbc\x01\ +\xd0\xff\xd7\x01\xbc\x01\xd1\xff\xd7\x01\xbc\x01\xd2\xff\x9a\x01\ +\xbc\x01\xd3\xff\x9a\x01\xbc\x01\xd4\xff\x9a\x01\xbc\x01\xd5\xff\ +\x85\x01\xbc\x01\xd6\xff\x9a\x01\xbc\x01\xd7\xff\x9a\x01\xbc\x01\ +\xd8\xffq\x01\xbc\x01\xd9\xff\x9a\x01\xbc\x01\xda\xff\x9a\x01\ +\xbc\x01\xdb\xffq\x01\xbc\x01\xdc\xff\xae\x01\xbc\x01\xdd\xff\ +\xae\x01\xbc\x01\xde\xffq\x01\xbc\x01\xdf\xff\xd7\x01\xbc\x01\ +\xe0\xff\x9a\x01\xbc\x01\xe1\xff\x9a\x01\xbc\x01\xe2\xff\x9a\x01\ +\xbc\x01\xe3\xff\x9a\x01\xbc\x01\xe4\xff\xae\x01\xbc\x01\xe5\xff\ +\x9a\x01\xbc\x01\xe6\xff\x9a\x01\xbc\x01\xe7\xff\xd7\x01\xbc\x01\ +\xe8\xff\x9a\x01\xbc\x01\xe9\xff\xc3\x01\xbc\x01\xea\xffq\x01\ +\xbc\x01\xec\xff\x9a\x01\xbc\x01\xed\xffq\x01\xbc\x01\xee\xff\ +\x85\x01\xbc\x01\xf2\xff\x85\x01\xbc\x01\xf3\xff\x9a\x01\xbc\x01\ +\xf5\xff\x9a\x01\xbc\x01\xf6\xff\xae\x01\xbc\x01\xf7\xff\x9a\x01\ +\xbc\x01\xf9\xff\x9a\x01\xbc\x02\x02\xff\xae\x01\xbc\x02\x03\xff\ +\xae\x01\xbc\x02\x04\xff\xae\x01\xbc\x02\x08\xff\x85\x01\xbc\x02\ +\x0c\xff\x85\x01\xbc\x02j\xffq\x01\xbc\x02k\xff\x9a\x01\ +\xbc\x02l\xff\xd7\x01\xbc\x02m\xff\xd7\x01\xbc\x02q\xff\ +\x9a\x01\xbc\x02r\xffq\x01\xbc\x02s\xff\x85\x01\xbc\x02\ +u\xff\x9a\x01\xbc\x02w\xff\x9a\x01\xbc\x02y\xff\x9a\x01\ +\xbc\x02}\xff\x9a\x01\xbc\x02~\xff\xd7\x01\xbc\x02\x7f\xff\ +q\x01\xbc\x02\x81\xff\xd7\x01\xbc\x02\x83\xff\xd7\x01\xbc\x02\ +\x84\xff\xd7\x01\xbc\x02\x85\xffq\x01\xbc\x02\x86\xff\xd7\x01\ +\xbc\x02\x87\xffq\x01\xbc\x02\x88\xff\xd7\x01\xbc\x02\x89\xff\ +q\x01\xbc\x02\x8a\xff\xd7\x01\xbc\x02\x8b\xff\xd7\x01\xbc\x02\ +\x8c\xff\xd7\x01\xbc\x02\x8d\xffq\x01\xbc\x02\x96\xff\x9a\x01\ +\xbc\x02\x9a\xff\x9a\x01\xbc\x02\x9e\xff\x9a\x01\xbc\x02\xa0\xff\ +\xd7\x01\xbc\x02\xa2\xff\xd7\x01\xbc\x02\xa4\xff\x9a\x01\xbc\x02\ +\xa6\xff\x9a\x01\xbc\x02\xaa\xff\xae\x01\xbc\x02\xac\xff\x9a\x01\ +\xbc\x02\xae\xff\x9a\x01\xbc\x02\xb0\xff\x9a\x01\xbc\x02\xb1\xff\ +\xd7\x01\xbc\x02\xb2\xffq\x01\xbc\x02\xb3\xff\xd7\x01\xbc\x02\ +\xb4\xffq\x01\xbc\x02\xb5\x00)\x01\xbc\x02\xb6\xff\xae\x01\ +\xbc\x02\xb8\xff\xae\x01\xbc\x02\xba\xff\xae\x01\xbc\x02\xbc\xff\ +\xd7\x01\xbc\x02\xbe\xff\xae\x01\xbc\x02\xc0\xff\x9a\x01\xbc\x02\ +\xc2\xff\x9a\x01\xbc\x02\xc4\xff\x9a\x01\xbc\x02\xc5\xff\x9a\x01\ +\xbc\x02\xc6\xffq\x01\xbc\x02\xc7\xff\x9a\x01\xbc\x02\xc8\xff\ +q\x01\xbc\x02\xcb\xff\xd7\x01\xbc\x02\xcd\xff\x9a\x01\xbc\x02\ +\xce\xff\x9a\x01\xbc\x02\xcf\xff\x85\x01\xbc\x02\xd1\xff\x9a\x01\ +\xbc\x02\xd3\xff\x9a\x01\xbc\x02\xd5\xff\x9a\x01\xbc\x02\xd7\xff\ +\x9a\x01\xbc\x02\xd9\xffq\x01\xbc\x02\xdb\xffq\x01\xbc\x02\ +\xdd\xffq\x01\xbc\x02\xe0\xffq\x01\xbc\x02\xe6\xff\xd7\x01\ +\xbc\x02\xe8\xff\xd7\x01\xbc\x02\xea\xff\xc3\x01\xbc\x02\xec\xff\ +\x9a\x01\xbc\x02\xee\xff\x9a\x01\xbc\x02\xef\xff\xd7\x01\xbc\x02\ +\xf0\xffq\x01\xbc\x02\xf1\xff\xd7\x01\xbc\x02\xf2\xffq\x01\ +\xbc\x02\xf3\xff\xd7\x01\xbc\x02\xf4\xffq\x01\xbc\x02\xf6\xff\ +\xd7\x01\xbc\x02\xf8\xff\xae\x01\xbc\x02\xfa\xff\xae\x01\xbc\x02\ +\xfc\xff\xae\x01\xbc\x02\xfe\xff\x9a\x01\xbc\x03\x00\xff\x9a\x01\ +\xbc\x03\x02\xff\x9a\x01\xbc\x03\x06\xff\xd7\x01\xbc\x03\x08\xff\ +\xd7\x01\xbc\x03\x09\xffq\x01\xbc\x03\x0a\xffq\x01\xbc\x03\ +\x0b\xffq\x01\xbc\x03\x0c\xffq\x01\xbc\x03\x0e\xff\x9a\x01\ +\xbc\x03\x10\xff\x9a\x01\xbc\x03\x11\xff\x9a\x01\xbc\x03\x12\xff\ +\x85\x01\xbc\x03\x14\xff\x9a\x01\xbc\x03\x15\xff\xd7\x01\xbc\x03\ +\x16\xffq\x01\xbc\x03\x18\xff\xae\x01\xbc\x03\x1a\xffq\x01\ +\xbc\x03\x1b\xff\x9a\x01\xbc\x03\x1c\xff\x85\x01\xbd\x00\x0f\xff\ +\x85\x01\xbd\x00\x11\xff\x85\x01\xbd\x01\x9f\xff\xec\x01\xbd\x01\ +\xa4\xff\x9a\x01\xbd\x01\xaa\xffq\x01\xbd\x01\xae\xff\x9a\x01\ +\xbd\x01\xb5\xff\x9a\x01\xbd\x01\xb8\xff\xec\x01\xbd\x01\xbb\xff\ +\xec\x01\xbd\x01\xbe\xff\xc3\x01\xbd\x01\xc9\xff\xec\x01\xbd\x01\ +\xce\xff\xae\x01\xbd\x01\xcf\xff\xd7\x01\xbd\x01\xd5\xff\xae\x01\ +\xbd\x01\xd8\xff\xd7\x01\xbd\x01\xdb\xff\xd7\x01\xbd\x01\xde\xff\ +\xd7\x01\xbd\x01\xe1\xff\xd7\x01\xbd\x01\xea\xff\xd7\x01\xbd\x01\ +\xeb\x00f\x01\xbd\x01\xed\xff\xd7\x01\xbd\x01\xee\xff\xec\x01\ +\xbd\x01\xf2\xff\xae\x01\xbd\x01\xf4\x00f\x01\xbd\x02\x08\xff\ +\x85\x01\xbd\x02\x0c\xff\x85\x01\xbd\x02j\xff\xd7\x01\xbd\x02\ +l\xff\xec\x01\xbd\x02r\xffq\x01\xbd\x02s\xff\xae\x01\ +\xbd\x02~\xff\xec\x01\xbd\x02\x7f\xff\xd7\x01\xbd\x02\x84\xff\ +\xec\x01\xbd\x02\x85\xff\xd7\x01\xbd\x02\x86\xff\xec\x01\xbd\x02\ +\x87\xff\xd7\x01\xbd\x02\x88\xff\xec\x01\xbd\x02\x89\xff\xd7\x01\ +\xbd\x02\x8a\xff\xec\x01\xbd\x02\x8c\xff\xec\x01\xbd\x02\x8d\xff\ +\xd7\x01\xbd\x02\x98\x00f\x01\xbd\x02\xa8\x00f\x01\xbd\x02\ +\xb1\xff\xec\x01\xbd\x02\xb2\xff\xd7\x01\xbd\x02\xb3\xff\xec\x01\ +\xbd\x02\xb4\xff\xd7\x01\xbd\x02\xc0\xff\xd7\x01\xbd\x02\xc2\xff\ +\xd7\x01\xbd\x02\xc5\xff\xd7\x01\xbd\x02\xc6\xff\xc3\x01\xbd\x02\ +\xc7\xff\xd7\x01\xbd\x02\xc8\xff\xc3\x01\xbd\x02\xce\xff\x9a\x01\ +\xbd\x02\xcf\xff\xae\x01\xbd\x02\xd5\xff\xd7\x01\xbd\x02\xd9\xff\ +q\x01\xbd\x02\xdb\xffq\x01\xbd\x02\xdd\xffq\x01\xbd\x02\ +\xe0\xff\xd7\x01\xbd\x02\xef\xff\xec\x01\xbd\x02\xf0\xff\xd7\x01\ +\xbd\x02\xf1\xff\xec\x01\xbd\x02\xf2\xff\xd7\x01\xbd\x02\xf3\xff\ +\xec\x01\xbd\x02\xf4\xff\xd7\x01\xbd\x02\xfe\xff\xd7\x01\xbd\x03\ +\x09\xffq\x01\xbd\x03\x0a\xff\xd7\x01\xbd\x03\x0b\xffq\x01\ +\xbd\x03\x0c\xff\xd7\x01\xbd\x03\x11\xff\x9a\x01\xbd\x03\x12\xff\ +\xae\x01\xbd\x03\x15\xff\xec\x01\xbd\x03\x16\xff\xd7\x01\xbd\x03\ +\x1a\xff\xd7\x01\xbd\x03\x1b\xff\x9a\x01\xbd\x03\x1c\xff\xae\x01\ +\xbe\x00\x0f\xff\xae\x01\xbe\x00\x11\xff\xae\x01\xbe\x01\x9d\xff\ +\xd7\x01\xbe\x01\xa4\xff\xd7\x01\xbe\x01\xa6\xff\xd7\x01\xbe\x01\ +\xa8\xff\xc3\x01\xbe\x01\xaa\xff\xd7\x01\xbe\x01\xae\xff\xd7\x01\ +\xbe\x01\xb0\xff\xd7\x01\xbe\x01\xb1\xff\xd7\x01\xbe\x01\xb5\xff\ +\xd7\x01\xbe\x01\xbc\xff\xc3\x01\xbe\x01\xbd\xff\xc3\x01\xbe\x01\ +\xbf\xff\xd7\x01\xbe\x01\xc4\xff\xd7\x01\xbe\x01\xc7\xff\xd7\x01\ +\xbe\x01\xce\xff\xec\x01\xbe\x01\xd5\xff\xec\x01\xbe\x01\xf2\xff\ +\xec\x01\xbe\x02\x08\xff\xae\x01\xbe\x02\x0c\xff\xae\x01\xbe\x02\ +r\xff\xd7\x01\xbe\x02s\xff\xec\x01\xbe\x02z\xff\xd7\x01\ +\xbe\x02\x80\xff\xec\x01\xbe\x02\x82\xff\xec\x01\xbe\x02\x9f\xff\ +\xd7\x01\xbe\x02\xa1\xff\xd7\x01\xbe\x02\xa9\xff\xd7\x01\xbe\x02\ +\xb5\xff\xc3\x01\xbe\x02\xb7\xff\xc3\x01\xbe\x02\xb9\xff\xc3\x01\ +\xbe\x02\xbb\xff\xd7\x01\xbe\x02\xbd\xff\xd7\x01\xbe\x02\xca\xff\ +\xd7\x01\xbe\x02\xce\xff\xd7\x01\xbe\x02\xcf\xff\xec\x01\xbe\x02\ +\xd9\xff\xd7\x01\xbe\x02\xdb\xff\xd7\x01\xbe\x02\xdd\xff\xd7\x01\ +\xbe\x02\xe5\xff\xd7\x01\xbe\x02\xe7\xff\xd7\x01\xbe\x02\xf5\xff\ +\xd7\x01\xbe\x02\xf7\xff\xc3\x01\xbe\x02\xf9\xff\xc3\x01\xbe\x02\ +\xfb\xff\xc3\x01\xbe\x03\x05\xff\xd7\x01\xbe\x03\x07\xff\xd7\x01\ +\xbe\x03\x0d\xff\xd7\x01\xbe\x03\x0f\xff\xd7\x01\xbe\x03\x11\xff\ +\xd7\x01\xbe\x03\x12\xff\xec\x01\xbe\x03\x17\xff\xd7\x01\xbe\x03\ +\x1b\xff\xd7\x01\xbe\x03\x1c\xff\xec\x01\xbf\x01\x9f\xff\xd7\x01\ +\xbf\x01\xb8\xff\xd7\x01\xbf\x01\xbb\xff\xd7\x01\xbf\x01\xbe\xff\ +\xd7\x01\xbf\x01\xc1\xff\xd7\x01\xbf\x01\xe1\xff\xd7\x01\xbf\x02\ +l\xff\xd7\x01\xbf\x02|\xff\xd7\x01\xbf\x02~\xff\xd7\x01\ +\xbf\x02\x84\xff\xd7\x01\xbf\x02\x86\xff\xd7\x01\xbf\x02\x88\xff\ +\xd7\x01\xbf\x02\x8a\xff\xd7\x01\xbf\x02\x8c\xff\xd7\x01\xbf\x02\ +\xb1\xff\xd7\x01\xbf\x02\xb3\xff\xd7\x01\xbf\x02\xbf\xff\xd7\x01\ +\xbf\x02\xc0\xff\xd7\x01\xbf\x02\xc1\xff\xd7\x01\xbf\x02\xc2\xff\ +\xd7\x01\xbf\x02\xc5\xff\x9a\x01\xbf\x02\xc7\xff\x9a\x01\xbf\x02\ +\xd4\xff\xd7\x01\xbf\x02\xd5\xff\xd7\x01\xbf\x02\xef\xff\xd7\x01\ +\xbf\x02\xf1\xff\xd7\x01\xbf\x02\xf3\xff\xd7\x01\xbf\x02\xfd\xff\ +\xd7\x01\xbf\x02\xfe\xff\xd7\x01\xbf\x03\x09\xff\xd7\x01\xbf\x03\ +\x0b\xff\xd7\x01\xbf\x03\x0e\xff\xd7\x01\xbf\x03\x10\xff\xd7\x01\ +\xbf\x03\x15\xff\xd7\x01\xbf\x03\x19\xff\xec\x01\xc0\x01\xa3\x00\ +\xe1\x01\xc0\x02\xea\x00)\x01\xc0\x03\x0e\xff\xd7\x01\xc0\x03\ +\x10\xff\xd7\x01\xc3\x01\xa3\x00\xe1\x01\xc3\x02\xea\x00)\x01\ +\xc3\x03\x0e\xff\xd7\x01\xc3\x03\x10\xff\xd7\x01\xc4\x00\x05\xff\ +\xae\x01\xc4\x00\x0a\xff\xae\x01\xc4\x01\x9d\xff\x85\x01\xc4\x01\ +\xa6\xff\x85\x01\xc4\x01\xa8\xff\xd7\x01\xc4\x01\xbc\xff\x9a\x01\ +\xc4\x01\xbd\xff\xd7\x01\xc4\x01\xc1\xff\x9a\x01\xc4\x01\xc4\xff\ +\x85\x01\xc4\x01\xdc\xff\xd7\x01\xc4\x01\xdd\xff\xd7\x01\xc4\x01\ +\xe1\xff\xd7\x01\xc4\x01\xe4\xff\xd7\x01\xc4\x01\xf6\xff\xd7\x01\ +\xc4\x02\x07\xff\xae\x01\xc4\x02\x0b\xff\xae\x01\xc4\x02n\xff\ +\xae\x01\xc4\x02|\xff\x9a\x01\xc4\x02\x80\xff\xae\x01\xc4\x02\ +\x82\xff\xae\x01\xc4\x02\x97\xff\xae\x01\xc4\x02\x9b\xff\xae\x01\ +\xc4\x02\xa7\xff\xae\x01\xc4\x02\xa9\xff\x85\x01\xc4\x02\xaa\xff\ +\xd7\x01\xc4\x02\xb5\xff\x9a\x01\xc4\x02\xb6\xff\xd7\x01\xc4\x02\ +\xb7\xff\x9a\x01\xc4\x02\xb8\xff\xd7\x01\xc4\x02\xb9\xff\x9a\x01\ +\xc4\x02\xba\xff\xd7\x01\xc4\x02\xbd\xff\x85\x01\xc4\x02\xbe\xff\ +\xd7\x01\xc4\x02\xbf\xff\x9a\x01\xc4\x02\xc0\xff\xd7\x01\xc4\x02\ +\xc1\xff\x9a\x01\xc4\x02\xc2\xff\xd7\x01\xc4\x02\xd4\xff\x9a\x01\ +\xc4\x02\xd5\xff\xd7\x01\xc4\x02\xf7\xff\xd7\x01\xc4\x02\xf8\xff\ +\xd7\x01\xc4\x02\xf9\xff\xd7\x01\xc4\x02\xfa\xff\xd7\x01\xc4\x02\ +\xfb\xff\xd7\x01\xc4\x02\xfc\xff\xd7\x01\xc4\x02\xfd\xff\x9a\x01\ +\xc4\x02\xfe\xff\xd7\x01\xc4\x03\x03\xff\xae\x01\xc4\x03\x0d\xff\ +\x9a\x01\xc4\x03\x0e\xff\xc3\x01\xc4\x03\x0f\xff\x9a\x01\xc4\x03\ +\x10\xff\xc3\x01\xc4\x03\x17\xff\x85\x01\xc4\x03\x18\xff\xd7\x01\ +\xc6\x00\x05\xff\xae\x01\xc6\x00\x0a\xff\xae\x01\xc6\x01\x9d\xff\ +\x85\x01\xc6\x01\xa6\xff\x85\x01\xc6\x01\xa8\xff\xd7\x01\xc6\x01\ +\xbc\xff\x9a\x01\xc6\x01\xbd\xff\xd7\x01\xc6\x01\xc1\xff\x9a\x01\ +\xc6\x01\xc4\xff\x85\x01\xc6\x01\xdc\xff\xd7\x01\xc6\x01\xdd\xff\ +\xd7\x01\xc6\x01\xe1\xff\xd7\x01\xc6\x01\xe4\xff\xd7\x01\xc6\x01\ +\xf6\xff\xd7\x01\xc6\x02\x07\xff\xae\x01\xc6\x02\x0b\xff\xae\x01\ +\xc6\x02n\xff\xae\x01\xc6\x02|\xff\x9a\x01\xc6\x02\x80\xff\ +\xae\x01\xc6\x02\x82\xff\xae\x01\xc6\x02\x97\xff\xae\x01\xc6\x02\ +\x9b\xff\xae\x01\xc6\x02\xa7\xff\xae\x01\xc6\x02\xa9\xff\x85\x01\ +\xc6\x02\xaa\xff\xd7\x01\xc6\x02\xb5\xff\x9a\x01\xc6\x02\xb6\xff\ +\xd7\x01\xc6\x02\xb7\xff\x9a\x01\xc6\x02\xb8\xff\xd7\x01\xc6\x02\ +\xb9\xff\x9a\x01\xc6\x02\xba\xff\xd7\x01\xc6\x02\xbd\xff\x85\x01\ +\xc6\x02\xbe\xff\xd7\x01\xc6\x02\xbf\xff\x9a\x01\xc6\x02\xc0\xff\ +\xd7\x01\xc6\x02\xc1\xff\x9a\x01\xc6\x02\xc2\xff\xd7\x01\xc6\x02\ +\xd4\xff\x9a\x01\xc6\x02\xd5\xff\xd7\x01\xc6\x02\xf7\xff\xd7\x01\ +\xc6\x02\xf8\xff\xd7\x01\xc6\x02\xf9\xff\xd7\x01\xc6\x02\xfa\xff\ +\xd7\x01\xc6\x02\xfb\xff\xd7\x01\xc6\x02\xfc\xff\xd7\x01\xc6\x02\ +\xfd\xff\x9a\x01\xc6\x02\xfe\xff\xd7\x01\xc6\x03\x03\xff\xae\x01\ +\xc6\x03\x0d\xff\x9a\x01\xc6\x03\x0e\xff\xc3\x01\xc6\x03\x0f\xff\ +\x9a\x01\xc6\x03\x10\xff\xc3\x01\xc6\x03\x17\xff\x85\x01\xc6\x03\ +\x18\xff\xd7\x01\xc7\x00\x0f\xff\xae\x01\xc7\x00\x11\xff\xae\x01\ +\xc7\x01\x9d\xff\xec\x01\xc7\x01\xa4\xff\xd7\x01\xc7\x01\xa6\xff\ +\xec\x01\xc7\x01\xa8\xff\xd7\x01\xc7\x01\xaa\xff\xd7\x01\xc7\x01\ +\xae\xff\xd7\x01\xc7\x01\xb0\xff\xd7\x01\xc7\x01\xb1\xff\xec\x01\ +\xc7\x01\xb5\xff\xd7\x01\xc7\x01\xbc\xff\xc3\x01\xc7\x01\xbd\xff\ +\xd7\x01\xc7\x01\xbf\xff\xd7\x01\xc7\x01\xc1\xff\xd7\x01\xc7\x01\ +\xc4\xff\xec\x01\xc7\x01\xc7\xff\xec\x01\xc7\x01\xce\xff\xec\x01\ +\xc7\x01\xd5\xff\xec\x01\xc7\x01\xf2\xff\xec\x01\xc7\x02\x08\xff\ +\xae\x01\xc7\x02\x0c\xff\xae\x01\xc7\x02r\xff\xd7\x01\xc7\x02\ +s\xff\xec\x01\xc7\x02z\xff\xec\x01\xc7\x02|\xff\xd7\x01\ +\xc7\x02\x80\xff\xec\x01\xc7\x02\x82\xff\xec\x01\xc7\x02\x9f\xff\ +\xd7\x01\xc7\x02\xa1\xff\xec\x01\xc7\x02\xa9\xff\xec\x01\xc7\x02\ +\xb5\xff\xc3\x01\xc7\x02\xb7\xff\xec\x01\xc7\x02\xb9\xff\xec\x01\ +\xc7\x02\xbb\xff\xd7\x01\xc7\x02\xbd\xff\xec\x01\xc7\x02\xbf\xff\ +\xd7\x01\xc7\x02\xc1\xff\xd7\x01\xc7\x02\xca\xff\xd7\x01\xc7\x02\ +\xce\xff\xd7\x01\xc7\x02\xcf\xff\xec\x01\xc7\x02\xd4\xff\xd7\x01\ +\xc7\x02\xd9\xff\xd7\x01\xc7\x02\xdb\xff\xd7\x01\xc7\x02\xdd\xff\ +\xd7\x01\xc7\x02\xe5\xff\xd7\x01\xc7\x02\xe7\xff\xec\x01\xc7\x02\ +\xf5\xff\xec\x01\xc7\x02\xf7\xff\xd7\x01\xc7\x02\xf9\xff\xd7\x01\ +\xc7\x02\xfb\xff\xd7\x01\xc7\x02\xfd\xff\xd7\x01\xc7\x03\x05\xff\ +\xd7\x01\xc7\x03\x07\xff\xd7\x01\xc7\x03\x0d\xff\xd7\x01\xc7\x03\ +\x0f\xff\xd7\x01\xc7\x03\x11\xff\xd7\x01\xc7\x03\x12\xff\xec\x01\ +\xc7\x03\x17\xff\xec\x01\xc7\x03\x1b\xff\xd7\x01\xc7\x03\x1c\xff\ +\xec\x01\xc8\x00\x0f\xff\xae\x01\xc8\x00\x11\xff\xae\x01\xc8\x01\ +\x9d\xff\xec\x01\xc8\x01\xa4\xff\xd7\x01\xc8\x01\xa6\xff\xec\x01\ +\xc8\x01\xa8\xff\xd7\x01\xc8\x01\xaa\xff\xd7\x01\xc8\x01\xae\xff\ +\xd7\x01\xc8\x01\xb0\xff\xd7\x01\xc8\x01\xb1\xff\xec\x01\xc8\x01\ +\xb5\xff\xd7\x01\xc8\x01\xbc\xff\xc3\x01\xc8\x01\xbd\xff\xd7\x01\ +\xc8\x01\xbf\xff\xd7\x01\xc8\x01\xc1\xff\xd7\x01\xc8\x01\xc4\xff\ +\xec\x01\xc8\x01\xc7\xff\xec\x01\xc8\x01\xce\xff\xec\x01\xc8\x01\ +\xd5\xff\xec\x01\xc8\x01\xf2\xff\xec\x01\xc8\x02\x08\xff\xae\x01\ +\xc8\x02\x0c\xff\xae\x01\xc8\x02r\xff\xd7\x01\xc8\x02s\xff\ +\xec\x01\xc8\x02z\xff\xec\x01\xc8\x02|\xff\xd7\x01\xc8\x02\ +\x80\xff\xec\x01\xc8\x02\x82\xff\xec\x01\xc8\x02\x9f\xff\xd7\x01\ +\xc8\x02\xa1\xff\xec\x01\xc8\x02\xa9\xff\xec\x01\xc8\x02\xb5\xff\ +\xc3\x01\xc8\x02\xb7\xff\xec\x01\xc8\x02\xb9\xff\xec\x01\xc8\x02\ +\xbb\xff\xd7\x01\xc8\x02\xbd\xff\xec\x01\xc8\x02\xbf\xff\xd7\x01\ +\xc8\x02\xc1\xff\xd7\x01\xc8\x02\xca\xff\xd7\x01\xc8\x02\xce\xff\ +\xd7\x01\xc8\x02\xcf\xff\xec\x01\xc8\x02\xd4\xff\xd7\x01\xc8\x02\ +\xd9\xff\xd7\x01\xc8\x02\xdb\xff\xd7\x01\xc8\x02\xdd\xff\xd7\x01\ +\xc8\x02\xe5\xff\xd7\x01\xc8\x02\xe7\xff\xec\x01\xc8\x02\xf5\xff\ +\xec\x01\xc8\x02\xf7\xff\xd7\x01\xc8\x02\xf9\xff\xd7\x01\xc8\x02\ +\xfb\xff\xd7\x01\xc8\x02\xfd\xff\xd7\x01\xc8\x03\x05\xff\xd7\x01\ +\xc8\x03\x07\xff\xd7\x01\xc8\x03\x0d\xff\xd7\x01\xc8\x03\x0f\xff\ +\xd7\x01\xc8\x03\x11\xff\xd7\x01\xc8\x03\x12\xff\xec\x01\xc8\x03\ +\x17\xff\xec\x01\xc8\x03\x1b\xff\xd7\x01\xc8\x03\x1c\xff\xec\x01\ +\xca\x00\x05\xff\xec\x01\xca\x00\x0a\xff\xec\x01\xca\x02\x07\xff\ +\xec\x01\xca\x02\x0b\xff\xec\x01\xcc\x01\xe9\x00)\x01\xcd\x00\ +\x0f\xff\x9a\x01\xcd\x00\x10\xff\xd7\x01\xcd\x00\x11\xff\x9a\x01\ +\xcd\x01\xce\xff\xc3\x01\xcd\x01\xcf\xff\xec\x01\xcd\x01\xd5\xff\ +\xc3\x01\xcd\x01\xd8\xff\xec\x01\xcd\x01\xdb\xff\xec\x01\xcd\x01\ +\xde\xff\xec\x01\xcd\x01\xea\xff\xec\x01\xcd\x01\xed\xff\xec\x01\ +\xcd\x01\xf2\xff\xc3\x01\xcd\x02\x02\xff\xd7\x01\xcd\x02\x03\xff\ +\xd7\x01\xcd\x02\x04\xff\xd7\x01\xcd\x02\x08\xff\x9a\x01\xcd\x02\ +\x0c\xff\x9a\x01\xcd\x02j\xff\xec\x01\xcd\x02s\xff\xc3\x01\ +\xcd\x02\x7f\xff\xec\x01\xcd\x02\x85\xff\xec\x01\xcd\x02\x87\xff\ +\xec\x01\xcd\x02\x89\xff\xec\x01\xcd\x02\x8d\xff\xec\x01\xcd\x02\ +\xb2\xff\xec\x01\xcd\x02\xb4\xff\xec\x01\xcd\x02\xcf\xff\xc3\x01\ +\xcd\x02\xe0\xff\xec\x01\xcd\x02\xf0\xff\xec\x01\xcd\x02\xf2\xff\ +\xec\x01\xcd\x02\xf4\xff\xec\x01\xcd\x03\x0a\xff\xec\x01\xcd\x03\ +\x0c\xff\xec\x01\xcd\x03\x12\xff\xc3\x01\xcd\x03\x16\xff\xec\x01\ +\xcd\x03\x1a\xff\xec\x01\xcd\x03\x1c\xff\xc3\x01\xce\x00\x05\xff\ +\xec\x01\xce\x00\x0a\xff\xec\x01\xce\x02\x07\xff\xec\x01\xce\x02\ +\x0b\xff\xec\x01\xcf\x00\x05\xff\xec\x01\xcf\x00\x0a\xff\xec\x01\ +\xcf\x02\x07\xff\xec\x01\xcf\x02\x0b\xff\xec\x01\xd0\x01\xcf\xff\ +\xd7\x01\xd0\x01\xd8\xff\xd7\x01\xd0\x01\xdb\xff\xd7\x01\xd0\x01\ +\xde\xff\xd7\x01\xd0\x01\xe1\xff\xd7\x01\xd0\x01\xea\xff\xd7\x01\ +\xd0\x01\xed\xff\xd7\x01\xd0\x02j\xff\xd7\x01\xd0\x02\x7f\xff\ +\xd7\x01\xd0\x02\x85\xff\xd7\x01\xd0\x02\x87\xff\xd7\x01\xd0\x02\ +\x89\xff\xd7\x01\xd0\x02\x8d\xff\xd7\x01\xd0\x02\xb2\xff\xd7\x01\ +\xd0\x02\xb4\xff\xd7\x01\xd0\x02\xc0\xff\xd7\x01\xd0\x02\xc2\xff\ +\xd7\x01\xd0\x02\xc6\xff\xd7\x01\xd0\x02\xc8\xff\xd7\x01\xd0\x02\ +\xd5\xff\xd7\x01\xd0\x02\xe0\xff\xd7\x01\xd0\x02\xf0\xff\xd7\x01\ +\xd0\x02\xf2\xff\xd7\x01\xd0\x02\xf4\xff\xd7\x01\xd0\x02\xfe\xff\ +\xd7\x01\xd0\x03\x0a\xff\xd7\x01\xd0\x03\x0c\xff\xd7\x01\xd0\x03\ +\x16\xff\xd7\x01\xd0\x03\x1a\xff\xd7\x01\xd1\x01\xe9\x00)\x01\ +\xd4\x01\xcf\xff\xd7\x01\xd4\x01\xd8\xff\xd7\x01\xd4\x01\xdb\xff\ +\xd7\x01\xd4\x01\xde\xff\xd7\x01\xd4\x01\xe1\xff\xd7\x01\xd4\x01\ +\xea\xff\xd7\x01\xd4\x01\xed\xff\xd7\x01\xd4\x02j\xff\xd7\x01\ +\xd4\x02\x7f\xff\xd7\x01\xd4\x02\x85\xff\xd7\x01\xd4\x02\x87\xff\ +\xd7\x01\xd4\x02\x89\xff\xd7\x01\xd4\x02\x8d\xff\xd7\x01\xd4\x02\ +\xb2\xff\xd7\x01\xd4\x02\xb4\xff\xd7\x01\xd4\x02\xc0\xff\xd7\x01\ +\xd4\x02\xc2\xff\xd7\x01\xd4\x02\xc6\xff\xd7\x01\xd4\x02\xc8\xff\ +\xd7\x01\xd4\x02\xd5\xff\xd7\x01\xd4\x02\xe0\xff\xd7\x01\xd4\x02\ +\xf0\xff\xd7\x01\xd4\x02\xf2\xff\xd7\x01\xd4\x02\xf4\xff\xd7\x01\ +\xd4\x02\xfe\xff\xd7\x01\xd4\x03\x0a\xff\xd7\x01\xd4\x03\x0c\xff\ +\xd7\x01\xd4\x03\x16\xff\xd7\x01\xd4\x03\x1a\xff\xd7\x01\xd8\x00\ +\x05\xff\xec\x01\xd8\x00\x0a\xff\xec\x01\xd8\x01\xd0\xff\xd7\x01\ +\xd8\x01\xdc\xff\xec\x01\xd8\x01\xdd\xff\xec\x01\xd8\x01\xdf\xff\ +\xd7\x01\xd8\x01\xe1\xff\xec\x01\xd8\x01\xe4\xff\xec\x01\xd8\x01\ +\xf6\xff\xec\x01\xd8\x02\x07\xff\xec\x01\xd8\x02\x0b\xff\xec\x01\ +\xd8\x02\xa0\xff\xd7\x01\xd8\x02\xaa\xff\xec\x01\xd8\x02\xb6\xff\ +\xec\x01\xd8\x02\xbc\xff\xd7\x01\xd8\x02\xbe\xff\xec\x01\xd8\x02\ +\xc0\xff\xec\x01\xd8\x02\xc2\xff\xec\x01\xd8\x02\xcb\xff\xd7\x01\ +\xd8\x02\xd5\xff\xec\x01\xd8\x02\xe6\xff\xd7\x01\xd8\x02\xf8\xff\ +\xec\x01\xd8\x02\xfa\xff\xec\x01\xd8\x02\xfc\xff\xec\x01\xd8\x02\ +\xfe\xff\xec\x01\xd8\x03\x06\xff\xd7\x01\xd8\x03\x08\xff\xd7\x01\ +\xd8\x03\x0e\xff\xec\x01\xd8\x03\x10\xff\xec\x01\xd8\x03\x18\xff\ +\xec\x01\xda\x00\x05\xff\xec\x01\xda\x00\x0a\xff\xec\x01\xda\x01\ +\xd0\xff\xd7\x01\xda\x01\xdc\xff\xec\x01\xda\x01\xdd\xff\xec\x01\ +\xda\x01\xdf\xff\xd7\x01\xda\x01\xe1\xff\xec\x01\xda\x01\xe4\xff\ +\xec\x01\xda\x01\xf6\xff\xec\x01\xda\x02\x07\xff\xec\x01\xda\x02\ +\x0b\xff\xec\x01\xda\x02\xa0\xff\xd7\x01\xda\x02\xaa\xff\xec\x01\ +\xda\x02\xb6\xff\xec\x01\xda\x02\xbc\xff\xd7\x01\xda\x02\xbe\xff\ +\xec\x01\xda\x02\xc0\xff\xec\x01\xda\x02\xc2\xff\xec\x01\xda\x02\ +\xcb\xff\xd7\x01\xda\x02\xd5\xff\xec\x01\xda\x02\xe6\xff\xd7\x01\ +\xda\x02\xf8\xff\xec\x01\xda\x02\xfa\xff\xec\x01\xda\x02\xfc\xff\ +\xec\x01\xda\x02\xfe\xff\xec\x01\xda\x03\x06\xff\xd7\x01\xda\x03\ +\x08\xff\xd7\x01\xda\x03\x0e\xff\xec\x01\xda\x03\x10\xff\xec\x01\ +\xda\x03\x18\xff\xec\x01\xdc\x00\x0f\xff\x9a\x01\xdc\x00\x10\xff\ +\xd7\x01\xdc\x00\x11\xff\x9a\x01\xdc\x01\xce\xff\xc3\x01\xdc\x01\ +\xcf\xff\xec\x01\xdc\x01\xd5\xff\xc3\x01\xdc\x01\xd8\xff\xec\x01\ +\xdc\x01\xdb\xff\xec\x01\xdc\x01\xde\xff\xec\x01\xdc\x01\xea\xff\ +\xec\x01\xdc\x01\xed\xff\xec\x01\xdc\x01\xf2\xff\xc3\x01\xdc\x02\ +\x02\xff\xd7\x01\xdc\x02\x03\xff\xd7\x01\xdc\x02\x04\xff\xd7\x01\ +\xdc\x02\x08\xff\x9a\x01\xdc\x02\x0c\xff\x9a\x01\xdc\x02j\xff\ +\xec\x01\xdc\x02s\xff\xc3\x01\xdc\x02\x7f\xff\xec\x01\xdc\x02\ +\x85\xff\xec\x01\xdc\x02\x87\xff\xec\x01\xdc\x02\x89\xff\xec\x01\ +\xdc\x02\x8d\xff\xec\x01\xdc\x02\xb2\xff\xec\x01\xdc\x02\xb4\xff\ +\xec\x01\xdc\x02\xcf\xff\xc3\x01\xdc\x02\xe0\xff\xec\x01\xdc\x02\ +\xf0\xff\xec\x01\xdc\x02\xf2\xff\xec\x01\xdc\x02\xf4\xff\xec\x01\ +\xdc\x03\x0a\xff\xec\x01\xdc\x03\x0c\xff\xec\x01\xdc\x03\x12\xff\ +\xc3\x01\xdc\x03\x16\xff\xec\x01\xdc\x03\x1a\xff\xec\x01\xdc\x03\ +\x1c\xff\xc3\x01\xdd\x00\x0f\xff\xae\x01\xdd\x00\x11\xff\xae\x01\ +\xdd\x01\xce\xff\xd7\x01\xdd\x01\xd5\xff\xd7\x01\xdd\x01\xf2\xff\ +\xd7\x01\xdd\x02\x08\xff\xae\x01\xdd\x02\x0c\xff\xae\x01\xdd\x02\ +s\xff\xd7\x01\xdd\x02\xcf\xff\xd7\x01\xdd\x03\x12\xff\xd7\x01\ +\xdd\x03\x1c\xff\xd7\x01\xde\x00\x05\xff\xec\x01\xde\x00\x0a\xff\ +\xec\x01\xde\x01\xd0\xff\xd7\x01\xde\x01\xdc\xff\xec\x01\xde\x01\ +\xdd\xff\xec\x01\xde\x01\xdf\xff\xd7\x01\xde\x01\xe1\xff\xec\x01\ +\xde\x01\xe4\xff\xec\x01\xde\x01\xf6\xff\xec\x01\xde\x02\x07\xff\ +\xec\x01\xde\x02\x0b\xff\xec\x01\xde\x02\xa0\xff\xd7\x01\xde\x02\ +\xaa\xff\xec\x01\xde\x02\xb6\xff\xec\x01\xde\x02\xbc\xff\xd7\x01\ +\xde\x02\xbe\xff\xec\x01\xde\x02\xc0\xff\xec\x01\xde\x02\xc2\xff\ +\xec\x01\xde\x02\xcb\xff\xd7\x01\xde\x02\xd5\xff\xec\x01\xde\x02\ +\xe6\xff\xd7\x01\xde\x02\xf8\xff\xec\x01\xde\x02\xfa\xff\xec\x01\ +\xde\x02\xfc\xff\xec\x01\xde\x02\xfe\xff\xec\x01\xde\x03\x06\xff\ +\xd7\x01\xde\x03\x08\xff\xd7\x01\xde\x03\x0e\xff\xec\x01\xde\x03\ +\x10\xff\xec\x01\xde\x03\x18\xff\xec\x01\xdf\x01\xcf\xff\xd7\x01\ +\xdf\x01\xd8\xff\xd7\x01\xdf\x01\xdb\xff\xd7\x01\xdf\x01\xde\xff\ +\xd7\x01\xdf\x01\xe1\xff\xd7\x01\xdf\x01\xea\xff\xd7\x01\xdf\x01\ +\xed\xff\xd7\x01\xdf\x02j\xff\xd7\x01\xdf\x02\x7f\xff\xd7\x01\ +\xdf\x02\x85\xff\xd7\x01\xdf\x02\x87\xff\xd7\x01\xdf\x02\x89\xff\ +\xd7\x01\xdf\x02\x8d\xff\xd7\x01\xdf\x02\xb2\xff\xd7\x01\xdf\x02\ +\xb4\xff\xd7\x01\xdf\x02\xc0\xff\xd7\x01\xdf\x02\xc2\xff\xd7\x01\ +\xdf\x02\xc6\xff\xd7\x01\xdf\x02\xc8\xff\xd7\x01\xdf\x02\xd5\xff\ +\xd7\x01\xdf\x02\xe0\xff\xd7\x01\xdf\x02\xf0\xff\xd7\x01\xdf\x02\ +\xf2\xff\xd7\x01\xdf\x02\xf4\xff\xd7\x01\xdf\x02\xfe\xff\xd7\x01\ +\xdf\x03\x0a\xff\xd7\x01\xdf\x03\x0c\xff\xd7\x01\xdf\x03\x16\xff\ +\xd7\x01\xdf\x03\x1a\xff\xd7\x01\xe0\x00\x05\xff\xec\x01\xe0\x00\ +\x0a\xff\xec\x01\xe0\x02\x07\xff\xec\x01\xe0\x02\x0b\xff\xec\x01\ +\xe3\x00\x05\xff\xec\x01\xe3\x00\x0a\xff\xec\x01\xe3\x02\x07\xff\ +\xec\x01\xe3\x02\x0b\xff\xec\x01\xe4\x00\x05\xff\x85\x01\xe4\x00\ +\x0a\xff\x85\x01\xe4\x01\xd0\xff\xd7\x01\xe4\x01\xdc\xff\x9a\x01\ +\xe4\x01\xdd\xff\xc3\x01\xe4\x01\xdf\xff\xd7\x01\xe4\x01\xe1\xff\ +\xae\x01\xe4\x01\xe4\xff\x9a\x01\xe4\x01\xf6\xff\xc3\x01\xe4\x02\ +\x07\xff\x85\x01\xe4\x02\x0b\xff\x85\x01\xe4\x02m\xff\xd7\x01\ +\xe4\x02\x81\xff\xd7\x01\xe4\x02\x83\xff\xd7\x01\xe4\x02\x8b\xff\ +\xd7\x01\xe4\x02\xa0\xff\xd7\x01\xe4\x02\xaa\xff\x9a\x01\xe4\x02\ +\xb6\xff\x9a\x01\xe4\x02\xb8\xff\xc3\x01\xe4\x02\xba\xff\xc3\x01\ +\xe4\x02\xbc\xff\xd7\x01\xe4\x02\xbe\xff\x9a\x01\xe4\x02\xc0\xff\ +\xae\x01\xe4\x02\xc2\xff\xae\x01\xe4\x02\xc6\xff\xd7\x01\xe4\x02\ +\xc8\xff\xd7\x01\xe4\x02\xcb\xff\xd7\x01\xe4\x02\xd5\xff\xae\x01\ +\xe4\x02\xe6\xff\xd7\x01\xe4\x02\xea\xff\xd7\x01\xe4\x02\xf8\xff\ +\xc3\x01\xe4\x02\xfa\xff\xc3\x01\xe4\x02\xfc\xff\xc3\x01\xe4\x02\ +\xfe\xff\xae\x01\xe4\x03\x06\xff\xd7\x01\xe4\x03\x08\xff\xd7\x01\ +\xe4\x03\x0e\xff\x9a\x01\xe4\x03\x10\xff\x9a\x01\xe4\x03\x18\xff\ +\x9a\x01\xe6\x00\x05\xff\x85\x01\xe6\x00\x0a\xff\x85\x01\xe6\x01\ +\xd0\xff\xd7\x01\xe6\x01\xdc\xff\x9a\x01\xe6\x01\xdd\xff\xc3\x01\ +\xe6\x01\xdf\xff\xd7\x01\xe6\x01\xe1\xff\xae\x01\xe6\x01\xe4\xff\ +\x9a\x01\xe6\x01\xf6\xff\xc3\x01\xe6\x02\x07\xff\x85\x01\xe6\x02\ +\x0b\xff\x85\x01\xe6\x02m\xff\xd7\x01\xe6\x02\x81\xff\xd7\x01\ +\xe6\x02\x83\xff\xd7\x01\xe6\x02\x8b\xff\xd7\x01\xe6\x02\xa0\xff\ +\xd7\x01\xe6\x02\xaa\xff\x9a\x01\xe6\x02\xb6\xff\x9a\x01\xe6\x02\ +\xb8\xff\xc3\x01\xe6\x02\xba\xff\xc3\x01\xe6\x02\xbc\xff\xd7\x01\ +\xe6\x02\xbe\xff\x9a\x01\xe6\x02\xc0\xff\xae\x01\xe6\x02\xc2\xff\ +\xae\x01\xe6\x02\xc6\xff\xd7\x01\xe6\x02\xc8\xff\xd7\x01\xe6\x02\ +\xcb\xff\xd7\x01\xe6\x02\xd5\xff\xae\x01\xe6\x02\xe6\xff\xd7\x01\ +\xe6\x02\xea\xff\xd7\x01\xe6\x02\xf8\xff\xc3\x01\xe6\x02\xfa\xff\ +\xc3\x01\xe6\x02\xfc\xff\xc3\x01\xe6\x02\xfe\xff\xae\x01\xe6\x03\ +\x06\xff\xd7\x01\xe6\x03\x08\xff\xd7\x01\xe6\x03\x0e\xff\x9a\x01\ +\xe6\x03\x10\xff\x9a\x01\xe6\x03\x18\xff\x9a\x01\xe7\x00\x05\xff\ +\xec\x01\xe7\x00\x0a\xff\xec\x01\xe7\x01\xd0\xff\xd7\x01\xe7\x01\ +\xdc\xff\xec\x01\xe7\x01\xdd\xff\xec\x01\xe7\x01\xdf\xff\xd7\x01\ +\xe7\x01\xe1\xff\xec\x01\xe7\x01\xe4\xff\xec\x01\xe7\x01\xf6\xff\ +\xec\x01\xe7\x02\x07\xff\xec\x01\xe7\x02\x0b\xff\xec\x01\xe7\x02\ +\xa0\xff\xd7\x01\xe7\x02\xaa\xff\xec\x01\xe7\x02\xb6\xff\xec\x01\ +\xe7\x02\xbc\xff\xd7\x01\xe7\x02\xbe\xff\xec\x01\xe7\x02\xc0\xff\ +\xec\x01\xe7\x02\xc2\xff\xec\x01\xe7\x02\xcb\xff\xd7\x01\xe7\x02\ +\xd5\xff\xec\x01\xe7\x02\xe6\xff\xd7\x01\xe7\x02\xf8\xff\xec\x01\ +\xe7\x02\xfa\xff\xec\x01\xe7\x02\xfc\xff\xec\x01\xe7\x02\xfe\xff\ +\xec\x01\xe7\x03\x06\xff\xd7\x01\xe7\x03\x08\xff\xd7\x01\xe7\x03\ +\x0e\xff\xec\x01\xe7\x03\x10\xff\xec\x01\xe7\x03\x18\xff\xec\x01\ +\xe8\x00\x05\xff\xec\x01\xe8\x00\x0a\xff\xec\x01\xe8\x01\xd0\xff\ +\xd7\x01\xe8\x01\xdc\xff\xec\x01\xe8\x01\xdd\xff\xec\x01\xe8\x01\ +\xdf\xff\xd7\x01\xe8\x01\xe1\xff\xec\x01\xe8\x01\xe4\xff\xec\x01\ +\xe8\x01\xf6\xff\xec\x01\xe8\x02\x07\xff\xec\x01\xe8\x02\x0b\xff\ +\xec\x01\xe8\x02\xa0\xff\xd7\x01\xe8\x02\xaa\xff\xec\x01\xe8\x02\ +\xb6\xff\xec\x01\xe8\x02\xbc\xff\xd7\x01\xe8\x02\xbe\xff\xec\x01\ +\xe8\x02\xc0\xff\xec\x01\xe8\x02\xc2\xff\xec\x01\xe8\x02\xcb\xff\ +\xd7\x01\xe8\x02\xd5\xff\xec\x01\xe8\x02\xe6\xff\xd7\x01\xe8\x02\ +\xf8\xff\xec\x01\xe8\x02\xfa\xff\xec\x01\xe8\x02\xfc\xff\xec\x01\ +\xe8\x02\xfe\xff\xec\x01\xe8\x03\x06\xff\xd7\x01\xe8\x03\x08\xff\ +\xd7\x01\xe8\x03\x0e\xff\xec\x01\xe8\x03\x10\xff\xec\x01\xe8\x03\ +\x18\xff\xec\x01\xea\x00\x05\xff\xec\x01\xea\x00\x0a\xff\xec\x01\ +\xea\x02\x07\xff\xec\x01\xea\x02\x0b\xff\xec\x01\xeb\x00\x05\xff\ +\xec\x01\xeb\x00\x0a\xff\xec\x01\xeb\x02\x07\xff\xec\x01\xeb\x02\ +\x0b\xff\xec\x01\xeb\x03\x0e\xff\xd7\x01\xeb\x03\x10\xff\xd7\x01\ +\xec\x00\x0f\xff\x9a\x01\xec\x00\x10\xff\xd7\x01\xec\x00\x11\xff\ +\x9a\x01\xec\x01\xce\xff\xc3\x01\xec\x01\xcf\xff\xec\x01\xec\x01\ +\xd5\xff\xc3\x01\xec\x01\xd8\xff\xec\x01\xec\x01\xdb\xff\xec\x01\ +\xec\x01\xde\xff\xec\x01\xec\x01\xea\xff\xec\x01\xec\x01\xed\xff\ +\xec\x01\xec\x01\xf2\xff\xc3\x01\xec\x02\x02\xff\xd7\x01\xec\x02\ +\x03\xff\xd7\x01\xec\x02\x04\xff\xd7\x01\xec\x02\x08\xff\x9a\x01\ +\xec\x02\x0c\xff\x9a\x01\xec\x02j\xff\xec\x01\xec\x02s\xff\ +\xc3\x01\xec\x02\x7f\xff\xec\x01\xec\x02\x85\xff\xec\x01\xec\x02\ +\x87\xff\xec\x01\xec\x02\x89\xff\xec\x01\xec\x02\x8d\xff\xec\x01\ +\xec\x02\xb2\xff\xec\x01\xec\x02\xb4\xff\xec\x01\xec\x02\xcf\xff\ +\xc3\x01\xec\x02\xe0\xff\xec\x01\xec\x02\xf0\xff\xec\x01\xec\x02\ +\xf2\xff\xec\x01\xec\x02\xf4\xff\xec\x01\xec\x03\x0a\xff\xec\x01\ +\xec\x03\x0c\xff\xec\x01\xec\x03\x12\xff\xc3\x01\xec\x03\x16\xff\ +\xec\x01\xec\x03\x1a\xff\xec\x01\xec\x03\x1c\xff\xc3\x01\xf2\x00\ +\x05\xff\x85\x01\xf2\x00\x0a\xff\x85\x01\xf2\x01\xd0\xff\xd7\x01\ +\xf2\x01\xdc\xff\x9a\x01\xf2\x01\xdd\xff\xc3\x01\xf2\x01\xdf\xff\ +\xd7\x01\xf2\x01\xe1\xff\xae\x01\xf2\x01\xe4\xff\x9a\x01\xf2\x01\ +\xf6\xff\xc3\x01\xf2\x02\x07\xff\x85\x01\xf2\x02\x0b\xff\x85\x01\ +\xf2\x02m\xff\xd7\x01\xf2\x02\x81\xff\xd7\x01\xf2\x02\x83\xff\ +\xd7\x01\xf2\x02\x8b\xff\xd7\x01\xf2\x02\xa0\xff\xd7\x01\xf2\x02\ +\xaa\xff\x9a\x01\xf2\x02\xb6\xff\x9a\x01\xf2\x02\xb8\xff\xc3\x01\ +\xf2\x02\xba\xff\xc3\x01\xf2\x02\xbc\xff\xd7\x01\xf2\x02\xbe\xff\ +\x9a\x01\xf2\x02\xc0\xff\xae\x01\xf2\x02\xc2\xff\xae\x01\xf2\x02\ +\xc6\xff\xd7\x01\xf2\x02\xc8\xff\xd7\x01\xf2\x02\xcb\xff\xd7\x01\ +\xf2\x02\xd5\xff\xae\x01\xf2\x02\xe6\xff\xd7\x01\xf2\x02\xea\xff\ +\xd7\x01\xf2\x02\xf8\xff\xc3\x01\xf2\x02\xfa\xff\xc3\x01\xf2\x02\ +\xfc\xff\xc3\x01\xf2\x02\xfe\xff\xae\x01\xf2\x03\x06\xff\xd7\x01\ +\xf2\x03\x08\xff\xd7\x01\xf2\x03\x0e\xff\x9a\x01\xf2\x03\x10\xff\ +\x9a\x01\xf2\x03\x18\xff\x9a\x01\xf3\x00\x05\xff\x85\x01\xf3\x00\ +\x0a\xff\x85\x01\xf3\x01\xd0\xff\xd7\x01\xf3\x01\xdc\xff\x9a\x01\ +\xf3\x01\xdd\xff\xc3\x01\xf3\x01\xdf\xff\xd7\x01\xf3\x01\xe1\xff\ +\xae\x01\xf3\x01\xe4\xff\x9a\x01\xf3\x01\xf6\xff\xc3\x01\xf3\x02\ +\x07\xff\x85\x01\xf3\x02\x0b\xff\x85\x01\xf3\x02m\xff\xd7\x01\ +\xf3\x02\x81\xff\xd7\x01\xf3\x02\x83\xff\xd7\x01\xf3\x02\x8b\xff\ +\xd7\x01\xf3\x02\xa0\xff\xd7\x01\xf3\x02\xaa\xff\x9a\x01\xf3\x02\ +\xb6\xff\x9a\x01\xf3\x02\xb8\xff\xc3\x01\xf3\x02\xba\xff\xc3\x01\ +\xf3\x02\xbc\xff\xd7\x01\xf3\x02\xbe\xff\x9a\x01\xf3\x02\xc0\xff\ +\xae\x01\xf3\x02\xc2\xff\xae\x01\xf3\x02\xc6\xff\xd7\x01\xf3\x02\ +\xc8\xff\xd7\x01\xf3\x02\xcb\xff\xd7\x01\xf3\x02\xd5\xff\xae\x01\ +\xf3\x02\xe6\xff\xd7\x01\xf3\x02\xea\xff\xd7\x01\xf3\x02\xf8\xff\ +\xc3\x01\xf3\x02\xfa\xff\xc3\x01\xf3\x02\xfc\xff\xc3\x01\xf3\x02\ +\xfe\xff\xae\x01\xf3\x03\x06\xff\xd7\x01\xf3\x03\x08\xff\xd7\x01\ +\xf3\x03\x0e\xff\x9a\x01\xf3\x03\x10\xff\x9a\x01\xf3\x03\x18\xff\ +\x9a\x01\xf4\x00\x05\xff\xec\x01\xf4\x00\x0a\xff\xec\x01\xf4\x02\ +\x07\xff\xec\x01\xf4\x02\x0b\xff\xec\x01\xf4\x03\x0e\xff\xd7\x01\ +\xf4\x03\x10\xff\xd7\x01\xf5\x01\xcf\xff\xd7\x01\xf5\x01\xd8\xff\ +\xd7\x01\xf5\x01\xdb\xff\xd7\x01\xf5\x01\xde\xff\xd7\x01\xf5\x01\ +\xe1\xff\xd7\x01\xf5\x01\xea\xff\xd7\x01\xf5\x01\xed\xff\xd7\x01\ +\xf5\x02j\xff\xd7\x01\xf5\x02\x7f\xff\xd7\x01\xf5\x02\x85\xff\ +\xd7\x01\xf5\x02\x87\xff\xd7\x01\xf5\x02\x89\xff\xd7\x01\xf5\x02\ +\x8d\xff\xd7\x01\xf5\x02\xb2\xff\xd7\x01\xf5\x02\xb4\xff\xd7\x01\ +\xf5\x02\xc0\xff\xd7\x01\xf5\x02\xc2\xff\xd7\x01\xf5\x02\xc6\xff\ +\xd7\x01\xf5\x02\xc8\xff\xd7\x01\xf5\x02\xd5\xff\xd7\x01\xf5\x02\ +\xe0\xff\xd7\x01\xf5\x02\xf0\xff\xd7\x01\xf5\x02\xf2\xff\xd7\x01\ +\xf5\x02\xf4\xff\xd7\x01\xf5\x02\xfe\xff\xd7\x01\xf5\x03\x0a\xff\ +\xd7\x01\xf5\x03\x0c\xff\xd7\x01\xf5\x03\x16\xff\xd7\x01\xf5\x03\ +\x1a\xff\xd7\x01\xf6\x00\x0f\xff\xae\x01\xf6\x00\x11\xff\xae\x01\ +\xf6\x01\xce\xff\xd7\x01\xf6\x01\xd5\xff\xd7\x01\xf6\x01\xf2\xff\ +\xd7\x01\xf6\x02\x08\xff\xae\x01\xf6\x02\x0c\xff\xae\x01\xf6\x02\ +s\xff\xd7\x01\xf6\x02\xcf\xff\xd7\x01\xf6\x03\x12\xff\xd7\x01\ +\xf6\x03\x1c\xff\xd7\x01\xf8\x00\x0f\xff\x85\x01\xf8\x00\x10\xff\ +\xae\x01\xf8\x00\x11\xff\x85\x01\xf8\x01\x9f\xff\xd7\x01\xf8\x01\ +\xa4\xff\x9a\x01\xf8\x01\xaa\xffq\x01\xf8\x01\xae\xff\x9a\x01\ +\xf8\x01\xb5\xff\x9a\x01\xf8\x01\xb8\xff\xd7\x01\xf8\x01\xbb\xff\ +\xd7\x01\xf8\x01\xbc\x00)\x01\xf8\x01\xbe\xff\xae\x01\xf8\x01\ +\xcc\xff\x9a\x01\xf8\x01\xcd\xff\x9a\x01\xf8\x01\xce\xff\x85\x01\ +\xf8\x01\xcf\xffq\x01\xf8\x01\xd0\xff\xd7\x01\xf8\x01\xd1\xff\ +\xd7\x01\xf8\x01\xd2\xff\x9a\x01\xf8\x01\xd3\xff\x9a\x01\xf8\x01\ +\xd4\xff\x9a\x01\xf8\x01\xd5\xff\x85\x01\xf8\x01\xd6\xff\x9a\x01\ +\xf8\x01\xd7\xff\x9a\x01\xf8\x01\xd8\xffq\x01\xf8\x01\xd9\xff\ +\x9a\x01\xf8\x01\xda\xff\x9a\x01\xf8\x01\xdb\xffq\x01\xf8\x01\ +\xdc\xff\xae\x01\xf8\x01\xdd\xff\xae\x01\xf8\x01\xde\xffq\x01\ +\xf8\x01\xdf\xff\xd7\x01\xf8\x01\xe0\xff\x9a\x01\xf8\x01\xe1\xff\ +\x9a\x01\xf8\x01\xe2\xff\x9a\x01\xf8\x01\xe3\xff\x9a\x01\xf8\x01\ +\xe4\xff\xae\x01\xf8\x01\xe5\xff\x9a\x01\xf8\x01\xe6\xff\x9a\x01\ +\xf8\x01\xe7\xff\xd7\x01\xf8\x01\xe8\xff\x9a\x01\xf8\x01\xe9\xff\ +\xc3\x01\xf8\x01\xea\xffq\x01\xf8\x01\xec\xff\x9a\x01\xf8\x01\ +\xed\xffq\x01\xf8\x01\xee\xff\x85\x01\xf8\x01\xf2\xff\x85\x01\ +\xf8\x01\xf3\xff\x9a\x01\xf8\x01\xf5\xff\x9a\x01\xf8\x01\xf6\xff\ +\xae\x01\xf8\x01\xf7\xff\x9a\x01\xf8\x01\xf9\xff\x9a\x01\xf8\x02\ +\x02\xff\xae\x01\xf8\x02\x03\xff\xae\x01\xf8\x02\x04\xff\xae\x01\ +\xf8\x02\x08\xff\x85\x01\xf8\x02\x0c\xff\x85\x01\xf8\x02j\xff\ +q\x01\xf8\x02k\xff\x9a\x01\xf8\x02l\xff\xd7\x01\xf8\x02\ +m\xff\xd7\x01\xf8\x02q\xff\x9a\x01\xf8\x02r\xffq\x01\ +\xf8\x02s\xff\x85\x01\xf8\x02u\xff\x9a\x01\xf8\x02w\xff\ +\x9a\x01\xf8\x02y\xff\x9a\x01\xf8\x02}\xff\x9a\x01\xf8\x02\ +~\xff\xd7\x01\xf8\x02\x7f\xffq\x01\xf8\x02\x81\xff\xd7\x01\ +\xf8\x02\x83\xff\xd7\x01\xf8\x02\x84\xff\xd7\x01\xf8\x02\x85\xff\ +q\x01\xf8\x02\x86\xff\xd7\x01\xf8\x02\x87\xffq\x01\xf8\x02\ +\x88\xff\xd7\x01\xf8\x02\x89\xffq\x01\xf8\x02\x8a\xff\xd7\x01\ +\xf8\x02\x8b\xff\xd7\x01\xf8\x02\x8c\xff\xd7\x01\xf8\x02\x8d\xff\ +q\x01\xf8\x02\x96\xff\x9a\x01\xf8\x02\x9a\xff\x9a\x01\xf8\x02\ +\x9e\xff\x9a\x01\xf8\x02\xa0\xff\xd7\x01\xf8\x02\xa2\xff\xd7\x01\ +\xf8\x02\xa4\xff\x9a\x01\xf8\x02\xa6\xff\x9a\x01\xf8\x02\xaa\xff\ +\xae\x01\xf8\x02\xac\xff\x9a\x01\xf8\x02\xae\xff\x9a\x01\xf8\x02\ +\xb0\xff\x9a\x01\xf8\x02\xb1\xff\xd7\x01\xf8\x02\xb2\xffq\x01\ +\xf8\x02\xb3\xff\xd7\x01\xf8\x02\xb4\xffq\x01\xf8\x02\xb5\x00\ +)\x01\xf8\x02\xb6\xff\xae\x01\xf8\x02\xb8\xff\xae\x01\xf8\x02\ +\xba\xff\xae\x01\xf8\x02\xbc\xff\xd7\x01\xf8\x02\xbe\xff\xae\x01\ +\xf8\x02\xc0\xff\x9a\x01\xf8\x02\xc2\xff\x9a\x01\xf8\x02\xc4\xff\ +\x9a\x01\xf8\x02\xc5\xff\x9a\x01\xf8\x02\xc6\xffq\x01\xf8\x02\ +\xc7\xff\x9a\x01\xf8\x02\xc8\xffq\x01\xf8\x02\xcb\xff\xd7\x01\ +\xf8\x02\xcd\xff\x9a\x01\xf8\x02\xce\xff\x9a\x01\xf8\x02\xcf\xff\ +\x85\x01\xf8\x02\xd1\xff\x9a\x01\xf8\x02\xd3\xff\x9a\x01\xf8\x02\ +\xd5\xff\x9a\x01\xf8\x02\xd7\xff\x9a\x01\xf8\x02\xd9\xffq\x01\ +\xf8\x02\xdb\xffq\x01\xf8\x02\xdd\xffq\x01\xf8\x02\xe0\xff\ +q\x01\xf8\x02\xe6\xff\xd7\x01\xf8\x02\xe8\xff\xd7\x01\xf8\x02\ +\xea\xff\xc3\x01\xf8\x02\xec\xff\x9a\x01\xf8\x02\xee\xff\x9a\x01\ +\xf8\x02\xef\xff\xd7\x01\xf8\x02\xf0\xffq\x01\xf8\x02\xf1\xff\ +\xd7\x01\xf8\x02\xf2\xffq\x01\xf8\x02\xf3\xff\xd7\x01\xf8\x02\ +\xf4\xffq\x01\xf8\x02\xf6\xff\xd7\x01\xf8\x02\xf8\xff\xae\x01\ +\xf8\x02\xfa\xff\xae\x01\xf8\x02\xfc\xff\xae\x01\xf8\x02\xfe\xff\ +\x9a\x01\xf8\x03\x00\xff\x9a\x01\xf8\x03\x02\xff\x9a\x01\xf8\x03\ +\x06\xff\xd7\x01\xf8\x03\x08\xff\xd7\x01\xf8\x03\x09\xffq\x01\ +\xf8\x03\x0a\xffq\x01\xf8\x03\x0b\xffq\x01\xf8\x03\x0c\xff\ +q\x01\xf8\x03\x0e\xff\x9a\x01\xf8\x03\x10\xff\x9a\x01\xf8\x03\ +\x11\xff\x9a\x01\xf8\x03\x12\xff\x85\x01\xf8\x03\x14\xff\x9a\x01\ +\xf8\x03\x15\xff\xd7\x01\xf8\x03\x16\xffq\x01\xf8\x03\x18\xff\ +\xae\x01\xf8\x03\x1a\xffq\x01\xf8\x03\x1b\xff\x9a\x01\xf8\x03\ +\x1c\xff\x85\x01\xf9\x00\x0f\xff\x9a\x01\xf9\x00\x10\xff\xd7\x01\ +\xf9\x00\x11\xff\x9a\x01\xf9\x01\xce\xff\xc3\x01\xf9\x01\xcf\xff\ +\xec\x01\xf9\x01\xd5\xff\xc3\x01\xf9\x01\xd8\xff\xec\x01\xf9\x01\ +\xdb\xff\xec\x01\xf9\x01\xde\xff\xec\x01\xf9\x01\xea\xff\xec\x01\ +\xf9\x01\xed\xff\xec\x01\xf9\x01\xf2\xff\xc3\x01\xf9\x02\x02\xff\ +\xd7\x01\xf9\x02\x03\xff\xd7\x01\xf9\x02\x04\xff\xd7\x01\xf9\x02\ +\x08\xff\x9a\x01\xf9\x02\x0c\xff\x9a\x01\xf9\x02j\xff\xec\x01\ +\xf9\x02s\xff\xc3\x01\xf9\x02\x7f\xff\xec\x01\xf9\x02\x85\xff\ +\xec\x01\xf9\x02\x87\xff\xec\x01\xf9\x02\x89\xff\xec\x01\xf9\x02\ +\x8d\xff\xec\x01\xf9\x02\xb2\xff\xec\x01\xf9\x02\xb4\xff\xec\x01\ +\xf9\x02\xcf\xff\xc3\x01\xf9\x02\xe0\xff\xec\x01\xf9\x02\xf0\xff\ +\xec\x01\xf9\x02\xf2\xff\xec\x01\xf9\x02\xf4\xff\xec\x01\xf9\x03\ +\x0a\xff\xec\x01\xf9\x03\x0c\xff\xec\x01\xf9\x03\x12\xff\xc3\x01\ +\xf9\x03\x16\xff\xec\x01\xf9\x03\x1a\xff\xec\x01\xf9\x03\x1c\xff\ +\xc3\x01\xfa\x00\x0f\xff\x9a\x01\xfa\x00\x11\xff\x9a\x01\xfa\x00\ +\x22\x00)\x01\xfa\x00$\xff\xae\x01\xfa\x00&\xff\xec\x01\ +\xfa\x00*\xff\xec\x01\xfa\x002\xff\xec\x01\xfa\x004\xff\ +\xec\x01\xfa\x00D\xff\xd7\x01\xfa\x00F\xff\xd7\x01\xfa\x00\ +G\xff\xd7\x01\xfa\x00H\xff\xd7\x01\xfa\x00J\xff\xec\x01\ +\xfa\x00P\xff\xec\x01\xfa\x00Q\xff\xec\x01\xfa\x00R\xff\ +\xd7\x01\xfa\x00S\xff\xec\x01\xfa\x00T\xff\xd7\x01\xfa\x00\ +U\xff\xec\x01\xfa\x00V\xff\xec\x01\xfa\x00X\xff\xec\x01\ +\xfa\x00\x82\xff\xae\x01\xfa\x00\x83\xff\xae\x01\xfa\x00\x84\xff\ +\xae\x01\xfa\x00\x85\xff\xae\x01\xfa\x00\x86\xff\xae\x01\xfa\x00\ +\x87\xff\xae\x01\xfa\x00\x89\xff\xec\x01\xfa\x00\x94\xff\xec\x01\ +\xfa\x00\x95\xff\xec\x01\xfa\x00\x96\xff\xec\x01\xfa\x00\x97\xff\ +\xec\x01\xfa\x00\x98\xff\xec\x01\xfa\x00\x9a\xff\xec\x01\xfa\x00\ +\xa2\xff\xd7\x01\xfa\x00\xa3\xff\xd7\x01\xfa\x00\xa4\xff\xd7\x01\ +\xfa\x00\xa5\xff\xd7\x01\xfa\x00\xa6\xff\xd7\x01\xfa\x00\xa7\xff\ +\xd7\x01\xfa\x00\xa8\xff\xd7\x01\xfa\x00\xa9\xff\xd7\x01\xfa\x00\ +\xaa\xff\xd7\x01\xfa\x00\xab\xff\xd7\x01\xfa\x00\xac\xff\xd7\x01\ +\xfa\x00\xad\xff\xd7\x01\xfa\x00\xb4\xff\xd7\x01\xfa\x00\xb5\xff\ +\xd7\x01\xfa\x00\xb6\xff\xd7\x01\xfa\x00\xb7\xff\xd7\x01\xfa\x00\ +\xb8\xff\xd7\x01\xfa\x00\xba\xff\xd7\x01\xfa\x00\xbb\xff\xec\x01\ +\xfa\x00\xbc\xff\xec\x01\xfa\x00\xbd\xff\xec\x01\xfa\x00\xbe\xff\ +\xec\x01\xfa\x00\xc2\xff\xae\x01\xfa\x00\xc3\xff\xd7\x01\xfa\x00\ +\xc4\xff\xae\x01\xfa\x00\xc5\xff\xd7\x01\xfa\x00\xc6\xff\xae\x01\ +\xfa\x00\xc7\xff\xd7\x01\xfa\x00\xc8\xff\xec\x01\xfa\x00\xc9\xff\ +\xd7\x01\xfa\x00\xca\xff\xec\x01\xfa\x00\xcb\xff\xd7\x01\xfa\x00\ +\xcc\xff\xec\x01\xfa\x00\xcd\xff\xd7\x01\xfa\x00\xce\xff\xec\x01\ +\xfa\x00\xcf\xff\xd7\x01\xfa\x00\xd1\xff\xd7\x01\xfa\x00\xd3\xff\ +\xd7\x01\xfa\x00\xd5\xff\xd7\x01\xfa\x00\xd7\xff\xd7\x01\xfa\x00\ +\xd9\xff\xd7\x01\xfa\x00\xdb\xff\xd7\x01\xfa\x00\xdd\xff\xd7\x01\ +\xfa\x00\xde\xff\xec\x01\xfa\x00\xdf\xff\xec\x01\xfa\x00\xe0\xff\ +\xec\x01\xfa\x00\xe1\xff\xec\x01\xfa\x00\xe2\xff\xec\x01\xfa\x00\ +\xe3\xff\xec\x01\xfa\x00\xe4\xff\xec\x01\xfa\x00\xe5\xff\xec\x01\ +\xfa\x00\xfa\xff\xec\x01\xfa\x01\x06\xff\xec\x01\xfa\x01\x08\xff\ +\xec\x01\xfa\x01\x0d\xff\xec\x01\xfa\x01\x0e\xff\xec\x01\xfa\x01\ +\x0f\xff\xd7\x01\xfa\x01\x10\xff\xec\x01\xfa\x01\x11\xff\xd7\x01\ +\xfa\x01\x12\xff\xec\x01\xfa\x01\x13\xff\xd7\x01\xfa\x01\x14\xff\ +\xec\x01\xfa\x01\x15\xff\xd7\x01\xfa\x01\x17\xff\xec\x01\xfa\x01\ +\x19\xff\xec\x01\xfa\x01\x1d\xff\xec\x01\xfa\x01!\xff\xec\x01\ +\xfa\x01+\xff\xec\x01\xfa\x01-\xff\xec\x01\xfa\x01/\xff\ +\xec\x01\xfa\x011\xff\xec\x01\xfa\x013\xff\xec\x01\xfa\x01\ +5\xff\xec\x01\xfa\x01C\xff\xae\x01\xfa\x01D\xff\xd7\x01\ +\xfa\x01F\xff\xd7\x01\xfa\x01G\xff\xec\x01\xfa\x01H\xff\ +\xd7\x01\xfa\x01J\xff\xec\x01\xfa\x02\x08\xff\x9a\x01\xfa\x02\ +\x0c\xff\x9a\x01\xfa\x02W\xff\xec\x01\xfa\x02X\xff\xae\x01\ +\xfa\x02Y\xff\xd7\x01\xfa\x02_\xff\xec\x01\xfa\x02`\xff\ +\xd7\x01\xfa\x02b\xff\xec\x01\xfa\x03\x1d\xff\xae\x01\xfa\x03\ +\x1e\xff\xd7\x01\xfa\x03\x1f\xff\xae\x01\xfa\x03 \xff\xd7\x01\ +\xfa\x03!\xff\xae\x01\xfa\x03\x22\xff\xd7\x01\xfa\x03#\xff\ +\xae\x01\xfa\x03%\xff\xae\x01\xfa\x03&\xff\xd7\x01\xfa\x03\ +'\xff\xae\x01\xfa\x03(\xff\xd7\x01\xfa\x03)\xff\xae\x01\ +\xfa\x03*\xff\xd7\x01\xfa\x03+\xff\xae\x01\xfa\x03,\xff\ +\xd7\x01\xfa\x03-\xff\xae\x01\xfa\x03.\xff\xd7\x01\xfa\x03\ +/\xff\xae\x01\xfa\x030\xff\xd7\x01\xfa\x031\xff\xae\x01\ +\xfa\x032\xff\xd7\x01\xfa\x033\xff\xae\x01\xfa\x034\xff\ +\xd7\x01\xfa\x036\xff\xd7\x01\xfa\x038\xff\xd7\x01\xfa\x03\ +:\xff\xd7\x01\xfa\x03<\xff\xd7\x01\xfa\x03@\xff\xd7\x01\ +\xfa\x03B\xff\xd7\x01\xfa\x03D\xff\xd7\x01\xfa\x03I\xff\ +\xec\x01\xfa\x03J\xff\xd7\x01\xfa\x03K\xff\xec\x01\xfa\x03\ +L\xff\xd7\x01\xfa\x03M\xff\xec\x01\xfa\x03N\xff\xd7\x01\ +\xfa\x03O\xff\xec\x01\xfa\x03Q\xff\xec\x01\xfa\x03R\xff\ +\xd7\x01\xfa\x03S\xff\xec\x01\xfa\x03T\xff\xd7\x01\xfa\x03\ +U\xff\xec\x01\xfa\x03V\xff\xd7\x01\xfa\x03W\xff\xec\x01\ +\xfa\x03X\xff\xd7\x01\xfa\x03Y\xff\xec\x01\xfa\x03Z\xff\ +\xd7\x01\xfa\x03[\xff\xec\x01\xfa\x03\x5c\xff\xd7\x01\xfa\x03\ +]\xff\xec\x01\xfa\x03^\xff\xd7\x01\xfa\x03_\xff\xec\x01\ +\xfa\x03`\xff\xd7\x01\xfa\x03b\xff\xec\x01\xfa\x03d\xff\ +\xec\x01\xfa\x03f\xff\xec\x01\xfa\x03h\xff\xec\x01\xfa\x03\ +j\xff\xec\x01\xfa\x03l\xff\xec\x01\xfa\x03n\xff\xec\x01\ +\xfb\x00\x05\x00R\x01\xfb\x00\x0a\x00R\x01\xfb\x00\x0f\xff\ +\xae\x01\xfb\x00\x11\xff\xae\x01\xfb\x00\x22\x00)\x01\xfb\x02\ +\x07\x00R\x01\xfb\x02\x08\xff\xae\x01\xfb\x02\x0b\x00R\x01\ +\xfb\x02\x0c\xff\xae\x01\xfc\x00\x0f\xff\x9a\x01\xfc\x00\x11\xff\ +\x9a\x01\xfc\x00\x22\x00)\x01\xfc\x00$\xff\xae\x01\xfc\x00\ +&\xff\xec\x01\xfc\x00*\xff\xec\x01\xfc\x002\xff\xec\x01\ +\xfc\x004\xff\xec\x01\xfc\x00D\xff\xd7\x01\xfc\x00F\xff\ +\xd7\x01\xfc\x00G\xff\xd7\x01\xfc\x00H\xff\xd7\x01\xfc\x00\ +J\xff\xec\x01\xfc\x00P\xff\xec\x01\xfc\x00Q\xff\xec\x01\ +\xfc\x00R\xff\xd7\x01\xfc\x00S\xff\xec\x01\xfc\x00T\xff\ +\xd7\x01\xfc\x00U\xff\xec\x01\xfc\x00V\xff\xec\x01\xfc\x00\ +X\xff\xec\x01\xfc\x00\x82\xff\xae\x01\xfc\x00\x83\xff\xae\x01\ +\xfc\x00\x84\xff\xae\x01\xfc\x00\x85\xff\xae\x01\xfc\x00\x86\xff\ +\xae\x01\xfc\x00\x87\xff\xae\x01\xfc\x00\x89\xff\xec\x01\xfc\x00\ +\x94\xff\xec\x01\xfc\x00\x95\xff\xec\x01\xfc\x00\x96\xff\xec\x01\ +\xfc\x00\x97\xff\xec\x01\xfc\x00\x98\xff\xec\x01\xfc\x00\x9a\xff\ +\xec\x01\xfc\x00\xa2\xff\xd7\x01\xfc\x00\xa3\xff\xd7\x01\xfc\x00\ +\xa4\xff\xd7\x01\xfc\x00\xa5\xff\xd7\x01\xfc\x00\xa6\xff\xd7\x01\ +\xfc\x00\xa7\xff\xd7\x01\xfc\x00\xa8\xff\xd7\x01\xfc\x00\xa9\xff\ +\xd7\x01\xfc\x00\xaa\xff\xd7\x01\xfc\x00\xab\xff\xd7\x01\xfc\x00\ +\xac\xff\xd7\x01\xfc\x00\xad\xff\xd7\x01\xfc\x00\xb4\xff\xd7\x01\ +\xfc\x00\xb5\xff\xd7\x01\xfc\x00\xb6\xff\xd7\x01\xfc\x00\xb7\xff\ +\xd7\x01\xfc\x00\xb8\xff\xd7\x01\xfc\x00\xba\xff\xd7\x01\xfc\x00\ +\xbb\xff\xec\x01\xfc\x00\xbc\xff\xec\x01\xfc\x00\xbd\xff\xec\x01\ +\xfc\x00\xbe\xff\xec\x01\xfc\x00\xc2\xff\xae\x01\xfc\x00\xc3\xff\ +\xd7\x01\xfc\x00\xc4\xff\xae\x01\xfc\x00\xc5\xff\xd7\x01\xfc\x00\ +\xc6\xff\xae\x01\xfc\x00\xc7\xff\xd7\x01\xfc\x00\xc8\xff\xec\x01\ +\xfc\x00\xc9\xff\xd7\x01\xfc\x00\xca\xff\xec\x01\xfc\x00\xcb\xff\ +\xd7\x01\xfc\x00\xcc\xff\xec\x01\xfc\x00\xcd\xff\xd7\x01\xfc\x00\ +\xce\xff\xec\x01\xfc\x00\xcf\xff\xd7\x01\xfc\x00\xd1\xff\xd7\x01\ +\xfc\x00\xd3\xff\xd7\x01\xfc\x00\xd5\xff\xd7\x01\xfc\x00\xd7\xff\ +\xd7\x01\xfc\x00\xd9\xff\xd7\x01\xfc\x00\xdb\xff\xd7\x01\xfc\x00\ +\xdd\xff\xd7\x01\xfc\x00\xde\xff\xec\x01\xfc\x00\xdf\xff\xec\x01\ +\xfc\x00\xe0\xff\xec\x01\xfc\x00\xe1\xff\xec\x01\xfc\x00\xe2\xff\ +\xec\x01\xfc\x00\xe3\xff\xec\x01\xfc\x00\xe4\xff\xec\x01\xfc\x00\ +\xe5\xff\xec\x01\xfc\x00\xfa\xff\xec\x01\xfc\x01\x06\xff\xec\x01\ +\xfc\x01\x08\xff\xec\x01\xfc\x01\x0d\xff\xec\x01\xfc\x01\x0e\xff\ +\xec\x01\xfc\x01\x0f\xff\xd7\x01\xfc\x01\x10\xff\xec\x01\xfc\x01\ +\x11\xff\xd7\x01\xfc\x01\x12\xff\xec\x01\xfc\x01\x13\xff\xd7\x01\ +\xfc\x01\x14\xff\xec\x01\xfc\x01\x15\xff\xd7\x01\xfc\x01\x17\xff\ +\xec\x01\xfc\x01\x19\xff\xec\x01\xfc\x01\x1d\xff\xec\x01\xfc\x01\ +!\xff\xec\x01\xfc\x01+\xff\xec\x01\xfc\x01-\xff\xec\x01\ +\xfc\x01/\xff\xec\x01\xfc\x011\xff\xec\x01\xfc\x013\xff\ +\xec\x01\xfc\x015\xff\xec\x01\xfc\x01C\xff\xae\x01\xfc\x01\ +D\xff\xd7\x01\xfc\x01F\xff\xd7\x01\xfc\x01G\xff\xec\x01\ +\xfc\x01H\xff\xd7\x01\xfc\x01J\xff\xec\x01\xfc\x02\x08\xff\ +\x9a\x01\xfc\x02\x0c\xff\x9a\x01\xfc\x02W\xff\xec\x01\xfc\x02\ +X\xff\xae\x01\xfc\x02Y\xff\xd7\x01\xfc\x02_\xff\xec\x01\ +\xfc\x02`\xff\xd7\x01\xfc\x02b\xff\xec\x01\xfc\x03\x1d\xff\ +\xae\x01\xfc\x03\x1e\xff\xd7\x01\xfc\x03\x1f\xff\xae\x01\xfc\x03\ + \xff\xd7\x01\xfc\x03!\xff\xae\x01\xfc\x03\x22\xff\xd7\x01\ +\xfc\x03#\xff\xae\x01\xfc\x03%\xff\xae\x01\xfc\x03&\xff\ +\xd7\x01\xfc\x03'\xff\xae\x01\xfc\x03(\xff\xd7\x01\xfc\x03\ +)\xff\xae\x01\xfc\x03*\xff\xd7\x01\xfc\x03+\xff\xae\x01\ +\xfc\x03,\xff\xd7\x01\xfc\x03-\xff\xae\x01\xfc\x03.\xff\ +\xd7\x01\xfc\x03/\xff\xae\x01\xfc\x030\xff\xd7\x01\xfc\x03\ +1\xff\xae\x01\xfc\x032\xff\xd7\x01\xfc\x033\xff\xae\x01\ +\xfc\x034\xff\xd7\x01\xfc\x036\xff\xd7\x01\xfc\x038\xff\ +\xd7\x01\xfc\x03:\xff\xd7\x01\xfc\x03<\xff\xd7\x01\xfc\x03\ +@\xff\xd7\x01\xfc\x03B\xff\xd7\x01\xfc\x03D\xff\xd7\x01\ +\xfc\x03I\xff\xec\x01\xfc\x03J\xff\xd7\x01\xfc\x03K\xff\ +\xec\x01\xfc\x03L\xff\xd7\x01\xfc\x03M\xff\xec\x01\xfc\x03\ +N\xff\xd7\x01\xfc\x03O\xff\xec\x01\xfc\x03Q\xff\xec\x01\ +\xfc\x03R\xff\xd7\x01\xfc\x03S\xff\xec\x01\xfc\x03T\xff\ +\xd7\x01\xfc\x03U\xff\xec\x01\xfc\x03V\xff\xd7\x01\xfc\x03\ +W\xff\xec\x01\xfc\x03X\xff\xd7\x01\xfc\x03Y\xff\xec\x01\ +\xfc\x03Z\xff\xd7\x01\xfc\x03[\xff\xec\x01\xfc\x03\x5c\xff\ +\xd7\x01\xfc\x03]\xff\xec\x01\xfc\x03^\xff\xd7\x01\xfc\x03\ +_\xff\xec\x01\xfc\x03`\xff\xd7\x01\xfc\x03b\xff\xec\x01\ +\xfc\x03d\xff\xec\x01\xfc\x03f\xff\xec\x01\xfc\x03h\xff\ +\xec\x01\xfc\x03j\xff\xec\x01\xfc\x03l\xff\xec\x01\xfc\x03\ +n\xff\xec\x01\xfd\x00\x05\x00R\x01\xfd\x00\x0a\x00R\x01\ +\xfd\x00\x0f\xff\xae\x01\xfd\x00\x11\xff\xae\x01\xfd\x00\x22\x00\ +)\x01\xfd\x02\x07\x00R\x01\xfd\x02\x08\xff\xae\x01\xfd\x02\ +\x0b\x00R\x01\xfd\x02\x0c\xff\xae\x01\xfe\x00\x0f\xff\x9a\x01\ +\xfe\x00\x11\xff\x9a\x01\xfe\x00\x22\x00)\x01\xfe\x00$\xff\ +\xae\x01\xfe\x00&\xff\xec\x01\xfe\x00*\xff\xec\x01\xfe\x00\ +2\xff\xec\x01\xfe\x004\xff\xec\x01\xfe\x00D\xff\xd7\x01\ +\xfe\x00F\xff\xd7\x01\xfe\x00G\xff\xd7\x01\xfe\x00H\xff\ +\xd7\x01\xfe\x00J\xff\xec\x01\xfe\x00P\xff\xec\x01\xfe\x00\ +Q\xff\xec\x01\xfe\x00R\xff\xd7\x01\xfe\x00S\xff\xec\x01\ +\xfe\x00T\xff\xd7\x01\xfe\x00U\xff\xec\x01\xfe\x00V\xff\ +\xec\x01\xfe\x00X\xff\xec\x01\xfe\x00\x82\xff\xae\x01\xfe\x00\ +\x83\xff\xae\x01\xfe\x00\x84\xff\xae\x01\xfe\x00\x85\xff\xae\x01\ +\xfe\x00\x86\xff\xae\x01\xfe\x00\x87\xff\xae\x01\xfe\x00\x89\xff\ +\xec\x01\xfe\x00\x94\xff\xec\x01\xfe\x00\x95\xff\xec\x01\xfe\x00\ +\x96\xff\xec\x01\xfe\x00\x97\xff\xec\x01\xfe\x00\x98\xff\xec\x01\ +\xfe\x00\x9a\xff\xec\x01\xfe\x00\xa2\xff\xd7\x01\xfe\x00\xa3\xff\ +\xd7\x01\xfe\x00\xa4\xff\xd7\x01\xfe\x00\xa5\xff\xd7\x01\xfe\x00\ +\xa6\xff\xd7\x01\xfe\x00\xa7\xff\xd7\x01\xfe\x00\xa8\xff\xd7\x01\ +\xfe\x00\xa9\xff\xd7\x01\xfe\x00\xaa\xff\xd7\x01\xfe\x00\xab\xff\ +\xd7\x01\xfe\x00\xac\xff\xd7\x01\xfe\x00\xad\xff\xd7\x01\xfe\x00\ +\xb4\xff\xd7\x01\xfe\x00\xb5\xff\xd7\x01\xfe\x00\xb6\xff\xd7\x01\ +\xfe\x00\xb7\xff\xd7\x01\xfe\x00\xb8\xff\xd7\x01\xfe\x00\xba\xff\ +\xd7\x01\xfe\x00\xbb\xff\xec\x01\xfe\x00\xbc\xff\xec\x01\xfe\x00\ +\xbd\xff\xec\x01\xfe\x00\xbe\xff\xec\x01\xfe\x00\xc2\xff\xae\x01\ +\xfe\x00\xc3\xff\xd7\x01\xfe\x00\xc4\xff\xae\x01\xfe\x00\xc5\xff\ +\xd7\x01\xfe\x00\xc6\xff\xae\x01\xfe\x00\xc7\xff\xd7\x01\xfe\x00\ +\xc8\xff\xec\x01\xfe\x00\xc9\xff\xd7\x01\xfe\x00\xca\xff\xec\x01\ +\xfe\x00\xcb\xff\xd7\x01\xfe\x00\xcc\xff\xec\x01\xfe\x00\xcd\xff\ +\xd7\x01\xfe\x00\xce\xff\xec\x01\xfe\x00\xcf\xff\xd7\x01\xfe\x00\ +\xd1\xff\xd7\x01\xfe\x00\xd3\xff\xd7\x01\xfe\x00\xd5\xff\xd7\x01\ +\xfe\x00\xd7\xff\xd7\x01\xfe\x00\xd9\xff\xd7\x01\xfe\x00\xdb\xff\ +\xd7\x01\xfe\x00\xdd\xff\xd7\x01\xfe\x00\xde\xff\xec\x01\xfe\x00\ +\xdf\xff\xec\x01\xfe\x00\xe0\xff\xec\x01\xfe\x00\xe1\xff\xec\x01\ +\xfe\x00\xe2\xff\xec\x01\xfe\x00\xe3\xff\xec\x01\xfe\x00\xe4\xff\ +\xec\x01\xfe\x00\xe5\xff\xec\x01\xfe\x00\xfa\xff\xec\x01\xfe\x01\ +\x06\xff\xec\x01\xfe\x01\x08\xff\xec\x01\xfe\x01\x0d\xff\xec\x01\ +\xfe\x01\x0e\xff\xec\x01\xfe\x01\x0f\xff\xd7\x01\xfe\x01\x10\xff\ +\xec\x01\xfe\x01\x11\xff\xd7\x01\xfe\x01\x12\xff\xec\x01\xfe\x01\ +\x13\xff\xd7\x01\xfe\x01\x14\xff\xec\x01\xfe\x01\x15\xff\xd7\x01\ +\xfe\x01\x17\xff\xec\x01\xfe\x01\x19\xff\xec\x01\xfe\x01\x1d\xff\ +\xec\x01\xfe\x01!\xff\xec\x01\xfe\x01+\xff\xec\x01\xfe\x01\ +-\xff\xec\x01\xfe\x01/\xff\xec\x01\xfe\x011\xff\xec\x01\ +\xfe\x013\xff\xec\x01\xfe\x015\xff\xec\x01\xfe\x01C\xff\ +\xae\x01\xfe\x01D\xff\xd7\x01\xfe\x01F\xff\xd7\x01\xfe\x01\ +G\xff\xec\x01\xfe\x01H\xff\xd7\x01\xfe\x01J\xff\xec\x01\ +\xfe\x02\x08\xff\x9a\x01\xfe\x02\x0c\xff\x9a\x01\xfe\x02W\xff\ +\xec\x01\xfe\x02X\xff\xae\x01\xfe\x02Y\xff\xd7\x01\xfe\x02\ +_\xff\xec\x01\xfe\x02`\xff\xd7\x01\xfe\x02b\xff\xec\x01\ +\xfe\x03\x1d\xff\xae\x01\xfe\x03\x1e\xff\xd7\x01\xfe\x03\x1f\xff\ +\xae\x01\xfe\x03 \xff\xd7\x01\xfe\x03!\xff\xae\x01\xfe\x03\ +\x22\xff\xd7\x01\xfe\x03#\xff\xae\x01\xfe\x03%\xff\xae\x01\ +\xfe\x03&\xff\xd7\x01\xfe\x03'\xff\xae\x01\xfe\x03(\xff\ +\xd7\x01\xfe\x03)\xff\xae\x01\xfe\x03*\xff\xd7\x01\xfe\x03\ ++\xff\xae\x01\xfe\x03,\xff\xd7\x01\xfe\x03-\xff\xae\x01\ +\xfe\x03.\xff\xd7\x01\xfe\x03/\xff\xae\x01\xfe\x030\xff\ +\xd7\x01\xfe\x031\xff\xae\x01\xfe\x032\xff\xd7\x01\xfe\x03\ +3\xff\xae\x01\xfe\x034\xff\xd7\x01\xfe\x036\xff\xd7\x01\ +\xfe\x038\xff\xd7\x01\xfe\x03:\xff\xd7\x01\xfe\x03<\xff\ +\xd7\x01\xfe\x03@\xff\xd7\x01\xfe\x03B\xff\xd7\x01\xfe\x03\ +D\xff\xd7\x01\xfe\x03I\xff\xec\x01\xfe\x03J\xff\xd7\x01\ +\xfe\x03K\xff\xec\x01\xfe\x03L\xff\xd7\x01\xfe\x03M\xff\ +\xec\x01\xfe\x03N\xff\xd7\x01\xfe\x03O\xff\xec\x01\xfe\x03\ +Q\xff\xec\x01\xfe\x03R\xff\xd7\x01\xfe\x03S\xff\xec\x01\ +\xfe\x03T\xff\xd7\x01\xfe\x03U\xff\xec\x01\xfe\x03V\xff\ +\xd7\x01\xfe\x03W\xff\xec\x01\xfe\x03X\xff\xd7\x01\xfe\x03\ +Y\xff\xec\x01\xfe\x03Z\xff\xd7\x01\xfe\x03[\xff\xec\x01\ +\xfe\x03\x5c\xff\xd7\x01\xfe\x03]\xff\xec\x01\xfe\x03^\xff\ +\xd7\x01\xfe\x03_\xff\xec\x01\xfe\x03`\xff\xd7\x01\xfe\x03\ +b\xff\xec\x01\xfe\x03d\xff\xec\x01\xfe\x03f\xff\xec\x01\ +\xfe\x03h\xff\xec\x01\xfe\x03j\xff\xec\x01\xfe\x03l\xff\ +\xec\x01\xfe\x03n\xff\xec\x01\xff\x00\x05\x00R\x01\xff\x00\ +\x0a\x00R\x01\xff\x00\x0f\xff\xae\x01\xff\x00\x11\xff\xae\x01\ +\xff\x00\x22\x00)\x01\xff\x02\x07\x00R\x01\xff\x02\x08\xff\ +\xae\x01\xff\x02\x0b\x00R\x01\xff\x02\x0c\xff\xae\x02\x00\x00\ +\x0f\xff\x85\x02\x00\x00\x11\xff\x85\x02\x00\x00\x22\x00)\x02\ +\x00\x00$\xff\x85\x02\x00\x00&\xff\xd7\x02\x00\x00*\xff\ +\xd7\x02\x00\x002\xff\xd7\x02\x00\x004\xff\xd7\x02\x00\x00\ +D\xff\x9a\x02\x00\x00F\xff\x9a\x02\x00\x00G\xff\x9a\x02\ +\x00\x00H\xff\x9a\x02\x00\x00J\xff\xd7\x02\x00\x00P\xff\ +\xc3\x02\x00\x00Q\xff\xc3\x02\x00\x00R\xff\x9a\x02\x00\x00\ +S\xff\xc3\x02\x00\x00T\xff\x9a\x02\x00\x00U\xff\xc3\x02\ +\x00\x00V\xff\xae\x02\x00\x00X\xff\xc3\x02\x00\x00]\xff\ +\xd7\x02\x00\x00\x82\xff\x85\x02\x00\x00\x83\xff\x85\x02\x00\x00\ +\x84\xff\x85\x02\x00\x00\x85\xff\x85\x02\x00\x00\x86\xff\x85\x02\ +\x00\x00\x87\xff\x85\x02\x00\x00\x89\xff\xd7\x02\x00\x00\x94\xff\ +\xd7\x02\x00\x00\x95\xff\xd7\x02\x00\x00\x96\xff\xd7\x02\x00\x00\ +\x97\xff\xd7\x02\x00\x00\x98\xff\xd7\x02\x00\x00\x9a\xff\xd7\x02\ +\x00\x00\xa2\xff\x9a\x02\x00\x00\xa3\xff\x9a\x02\x00\x00\xa4\xff\ +\x9a\x02\x00\x00\xa5\xff\x9a\x02\x00\x00\xa6\xff\x9a\x02\x00\x00\ +\xa7\xff\x9a\x02\x00\x00\xa8\xff\x9a\x02\x00\x00\xa9\xff\x9a\x02\ +\x00\x00\xaa\xff\x9a\x02\x00\x00\xab\xff\x9a\x02\x00\x00\xac\xff\ +\x9a\x02\x00\x00\xad\xff\x9a\x02\x00\x00\xb4\xff\x9a\x02\x00\x00\ +\xb5\xff\x9a\x02\x00\x00\xb6\xff\x9a\x02\x00\x00\xb7\xff\x9a\x02\ +\x00\x00\xb8\xff\x9a\x02\x00\x00\xba\xff\x9a\x02\x00\x00\xbb\xff\ +\xc3\x02\x00\x00\xbc\xff\xc3\x02\x00\x00\xbd\xff\xc3\x02\x00\x00\ +\xbe\xff\xc3\x02\x00\x00\xc2\xff\x85\x02\x00\x00\xc3\xff\x9a\x02\ +\x00\x00\xc4\xff\x85\x02\x00\x00\xc5\xff\x9a\x02\x00\x00\xc6\xff\ +\x85\x02\x00\x00\xc7\xff\x9a\x02\x00\x00\xc8\xff\xd7\x02\x00\x00\ +\xc9\xff\x9a\x02\x00\x00\xca\xff\xd7\x02\x00\x00\xcb\xff\x9a\x02\ +\x00\x00\xcc\xff\xd7\x02\x00\x00\xcd\xff\x9a\x02\x00\x00\xce\xff\ +\xd7\x02\x00\x00\xcf\xff\x9a\x02\x00\x00\xd1\xff\x9a\x02\x00\x00\ +\xd3\xff\x9a\x02\x00\x00\xd5\xff\x9a\x02\x00\x00\xd7\xff\x9a\x02\ +\x00\x00\xd9\xff\x9a\x02\x00\x00\xdb\xff\x9a\x02\x00\x00\xdd\xff\ +\x9a\x02\x00\x00\xde\xff\xd7\x02\x00\x00\xdf\xff\xd7\x02\x00\x00\ +\xe0\xff\xd7\x02\x00\x00\xe1\xff\xd7\x02\x00\x00\xe2\xff\xd7\x02\ +\x00\x00\xe3\xff\xd7\x02\x00\x00\xe4\xff\xd7\x02\x00\x00\xe5\xff\ +\xd7\x02\x00\x00\xfa\xff\xc3\x02\x00\x01\x06\xff\xc3\x02\x00\x01\ +\x08\xff\xc3\x02\x00\x01\x0d\xff\xc3\x02\x00\x01\x0e\xff\xd7\x02\ +\x00\x01\x0f\xff\x9a\x02\x00\x01\x10\xff\xd7\x02\x00\x01\x11\xff\ +\x9a\x02\x00\x01\x12\xff\xd7\x02\x00\x01\x13\xff\x9a\x02\x00\x01\ +\x14\xff\xd7\x02\x00\x01\x15\xff\x9a\x02\x00\x01\x17\xff\xc3\x02\ +\x00\x01\x19\xff\xc3\x02\x00\x01\x1d\xff\xae\x02\x00\x01!\xff\ +\xae\x02\x00\x01+\xff\xc3\x02\x00\x01-\xff\xc3\x02\x00\x01\ +/\xff\xc3\x02\x00\x011\xff\xc3\x02\x00\x013\xff\xc3\x02\ +\x00\x015\xff\xc3\x02\x00\x01<\xff\xd7\x02\x00\x01>\xff\ +\xd7\x02\x00\x01@\xff\xd7\x02\x00\x01C\xff\x85\x02\x00\x01\ +D\xff\x9a\x02\x00\x01F\xff\x9a\x02\x00\x01G\xff\xd7\x02\ +\x00\x01H\xff\x9a\x02\x00\x01J\xff\xae\x02\x00\x02\x08\xff\ +\x85\x02\x00\x02\x0c\xff\x85\x02\x00\x02W\xff\xc3\x02\x00\x02\ +X\xff\x85\x02\x00\x02Y\xff\x9a\x02\x00\x02_\xff\xd7\x02\ +\x00\x02`\xff\x9a\x02\x00\x02b\xff\xc3\x02\x00\x03\x1d\xff\ +\x85\x02\x00\x03\x1e\xff\x9a\x02\x00\x03\x1f\xff\x85\x02\x00\x03\ + \xff\x9a\x02\x00\x03!\xff\x85\x02\x00\x03\x22\xff\x9a\x02\ +\x00\x03#\xff\x85\x02\x00\x03%\xff\x85\x02\x00\x03&\xff\ +\x9a\x02\x00\x03'\xff\x85\x02\x00\x03(\xff\x9a\x02\x00\x03\ +)\xff\x85\x02\x00\x03*\xff\x9a\x02\x00\x03+\xff\x85\x02\ +\x00\x03,\xff\x9a\x02\x00\x03-\xff\x85\x02\x00\x03.\xff\ +\x9a\x02\x00\x03/\xff\x85\x02\x00\x030\xff\x9a\x02\x00\x03\ +1\xff\x85\x02\x00\x032\xff\x9a\x02\x00\x033\xff\x85\x02\ +\x00\x034\xff\x9a\x02\x00\x036\xff\x9a\x02\x00\x038\xff\ +\x9a\x02\x00\x03:\xff\x9a\x02\x00\x03<\xff\x9a\x02\x00\x03\ +@\xff\x9a\x02\x00\x03B\xff\x9a\x02\x00\x03D\xff\x9a\x02\ +\x00\x03I\xff\xd7\x02\x00\x03J\xff\x9a\x02\x00\x03K\xff\ +\xd7\x02\x00\x03L\xff\x9a\x02\x00\x03M\xff\xd7\x02\x00\x03\ +N\xff\x9a\x02\x00\x03O\xff\xd7\x02\x00\x03Q\xff\xd7\x02\ +\x00\x03R\xff\x9a\x02\x00\x03S\xff\xd7\x02\x00\x03T\xff\ +\x9a\x02\x00\x03U\xff\xd7\x02\x00\x03V\xff\x9a\x02\x00\x03\ +W\xff\xd7\x02\x00\x03X\xff\x9a\x02\x00\x03Y\xff\xd7\x02\ +\x00\x03Z\xff\x9a\x02\x00\x03[\xff\xd7\x02\x00\x03\x5c\xff\ +\x9a\x02\x00\x03]\xff\xd7\x02\x00\x03^\xff\x9a\x02\x00\x03\ +_\xff\xd7\x02\x00\x03`\xff\x9a\x02\x00\x03b\xff\xc3\x02\ +\x00\x03d\xff\xc3\x02\x00\x03f\xff\xc3\x02\x00\x03h\xff\ +\xc3\x02\x00\x03j\xff\xc3\x02\x00\x03l\xff\xc3\x02\x00\x03\ +n\xff\xc3\x02\x01\x00\x05\x00R\x02\x01\x00\x0a\x00R\x02\ +\x01\x00\x0f\xff\xae\x02\x01\x00\x11\xff\xae\x02\x01\x00\x22\x00\ +)\x02\x01\x02\x07\x00R\x02\x01\x02\x08\xff\xae\x02\x01\x02\ +\x0b\x00R\x02\x01\x02\x0c\xff\xae\x02\x02\x007\xff\xae\x02\ +\x02\x01$\xff\xae\x02\x02\x01&\xff\xae\x02\x02\x01q\xff\ +\xae\x02\x02\x01\x9d\xff\xae\x02\x02\x01\xa6\xff\xae\x02\x02\x01\ +\xbc\xff\xae\x02\x02\x01\xc4\xff\xae\x02\x02\x01\xdc\xff\xd7\x02\ +\x02\x01\xe4\xff\xd7\x02\x02\x02\xa9\xff\xae\x02\x02\x02\xaa\xff\ +\xd7\x02\x02\x02\xb5\xff\xae\x02\x02\x02\xb6\xff\xd7\x02\x02\x02\ +\xbd\xff\xae\x02\x02\x02\xbe\xff\xd7\x02\x02\x03\x17\xff\xae\x02\ +\x02\x03\x18\xff\xd7\x02\x02\x03\x8f\xff\xae\x02\x03\x007\xff\ +\xae\x02\x03\x01$\xff\xae\x02\x03\x01&\xff\xae\x02\x03\x01\ +q\xff\xae\x02\x03\x01\x9d\xff\xae\x02\x03\x01\xa6\xff\xae\x02\ +\x03\x01\xbc\xff\xae\x02\x03\x01\xc4\xff\xae\x02\x03\x01\xdc\xff\ +\xd7\x02\x03\x01\xe4\xff\xd7\x02\x03\x02\xa9\xff\xae\x02\x03\x02\ +\xaa\xff\xd7\x02\x03\x02\xb5\xff\xae\x02\x03\x02\xb6\xff\xd7\x02\ +\x03\x02\xbd\xff\xae\x02\x03\x02\xbe\xff\xd7\x02\x03\x03\x17\xff\ +\xae\x02\x03\x03\x18\xff\xd7\x02\x03\x03\x8f\xff\xae\x02\x04\x00\ +7\xff\xae\x02\x04\x01$\xff\xae\x02\x04\x01&\xff\xae\x02\ +\x04\x01q\xff\xae\x02\x04\x01\x9d\xff\xae\x02\x04\x01\xa6\xff\ +\xae\x02\x04\x01\xbc\xff\xae\x02\x04\x01\xc4\xff\xae\x02\x04\x01\ +\xdc\xff\xd7\x02\x04\x01\xe4\xff\xd7\x02\x04\x02\xa9\xff\xae\x02\ +\x04\x02\xaa\xff\xd7\x02\x04\x02\xb5\xff\xae\x02\x04\x02\xb6\xff\ +\xd7\x02\x04\x02\xbd\xff\xae\x02\x04\x02\xbe\xff\xd7\x02\x04\x03\ +\x17\xff\xae\x02\x04\x03\x18\xff\xd7\x02\x04\x03\x8f\xff\xae\x02\ +\x06\x00$\xffq\x02\x06\x007\x00)\x02\x06\x009\x00\ +)\x02\x06\x00:\x00)\x02\x06\x00<\x00\x14\x02\x06\x00\ +D\xff\xae\x02\x06\x00F\xff\x85\x02\x06\x00G\xff\x85\x02\ +\x06\x00H\xff\x85\x02\x06\x00J\xff\xc3\x02\x06\x00P\xff\ +\xc3\x02\x06\x00Q\xff\xc3\x02\x06\x00R\xff\x85\x02\x06\x00\ +S\xff\xc3\x02\x06\x00T\xff\x85\x02\x06\x00U\xff\xc3\x02\ +\x06\x00V\xff\xc3\x02\x06\x00X\xff\xc3\x02\x06\x00\x82\xff\ +q\x02\x06\x00\x83\xffq\x02\x06\x00\x84\xffq\x02\x06\x00\ +\x85\xffq\x02\x06\x00\x86\xffq\x02\x06\x00\x87\xffq\x02\ +\x06\x00\x9f\x00\x14\x02\x06\x00\xa2\xff\x85\x02\x06\x00\xa3\xff\ +\xae\x02\x06\x00\xa4\xff\xae\x02\x06\x00\xa5\xff\xae\x02\x06\x00\ +\xa6\xff\xae\x02\x06\x00\xa7\xff\xae\x02\x06\x00\xa8\xff\xae\x02\ +\x06\x00\xa9\xff\x85\x02\x06\x00\xaa\xff\x85\x02\x06\x00\xab\xff\ +\x85\x02\x06\x00\xac\xff\x85\x02\x06\x00\xad\xff\x85\x02\x06\x00\ +\xb4\xff\x85\x02\x06\x00\xb5\xff\x85\x02\x06\x00\xb6\xff\x85\x02\ +\x06\x00\xb7\xff\x85\x02\x06\x00\xb8\xff\x85\x02\x06\x00\xba\xff\ +\x85\x02\x06\x00\xbb\xff\xc3\x02\x06\x00\xbc\xff\xc3\x02\x06\x00\ +\xbd\xff\xc3\x02\x06\x00\xbe\xff\xc3\x02\x06\x00\xc2\xffq\x02\ +\x06\x00\xc3\xff\xae\x02\x06\x00\xc4\xffq\x02\x06\x00\xc5\xff\ +\xae\x02\x06\x00\xc6\xffq\x02\x06\x00\xc7\xff\xae\x02\x06\x00\ +\xc9\xff\x85\x02\x06\x00\xcb\xff\x85\x02\x06\x00\xcd\xff\x85\x02\ +\x06\x00\xcf\xff\x85\x02\x06\x00\xd1\xff\x85\x02\x06\x00\xd3\xff\ +\x85\x02\x06\x00\xd5\xff\x85\x02\x06\x00\xd7\xff\x85\x02\x06\x00\ +\xd9\xff\x85\x02\x06\x00\xdb\xff\x85\x02\x06\x00\xdd\xff\x85\x02\ +\x06\x00\xdf\xff\xc3\x02\x06\x00\xe1\xff\xc3\x02\x06\x00\xe3\xff\ +\xc3\x02\x06\x00\xe5\xff\xc3\x02\x06\x00\xfa\xff\xc3\x02\x06\x01\ +\x06\xff\xc3\x02\x06\x01\x08\xff\xc3\x02\x06\x01\x0d\xff\xc3\x02\ +\x06\x01\x0f\xff\x85\x02\x06\x01\x11\xff\x85\x02\x06\x01\x13\xff\ +\x85\x02\x06\x01\x15\xff\x85\x02\x06\x01\x17\xff\xc3\x02\x06\x01\ +\x19\xff\xc3\x02\x06\x01\x1d\xff\xc3\x02\x06\x01!\xff\xc3\x02\ +\x06\x01$\x00)\x02\x06\x01&\x00)\x02\x06\x01+\xff\ +\xc3\x02\x06\x01-\xff\xc3\x02\x06\x01/\xff\xc3\x02\x06\x01\ +1\xff\xc3\x02\x06\x013\xff\xc3\x02\x06\x015\xff\xc3\x02\ +\x06\x016\x00)\x02\x06\x018\x00\x14\x02\x06\x01:\x00\ +\x14\x02\x06\x01C\xffq\x02\x06\x01D\xff\xae\x02\x06\x01\ +F\xff\xae\x02\x06\x01H\xff\x85\x02\x06\x01J\xff\xc3\x02\ +\x06\x01V\xffq\x02\x06\x01_\xffq\x02\x06\x01b\xff\ +q\x02\x06\x01i\xffq\x02\x06\x01y\xff\xae\x02\x06\x01\ +z\xff\xd7\x02\x06\x01{\xff\xd7\x02\x06\x01~\xff\xae\x02\ +\x06\x01\x81\xff\xc3\x02\x06\x01\x82\xff\xd7\x02\x06\x01\x83\xff\ +\xd7\x02\x06\x01\x84\xff\xd7\x02\x06\x01\x87\xff\xd7\x02\x06\x01\ +\x89\xff\xd7\x02\x06\x01\x8c\xff\xae\x02\x06\x01\x8e\xff\xc3\x02\ +\x06\x01\x8f\xff\xae\x02\x06\x01\x90\xff\xae\x02\x06\x01\x93\xff\ +\xae\x02\x06\x01\x99\xff\xae\x02\x06\x01\xa4\xff\x85\x02\x06\x01\ +\xaa\xffq\x02\x06\x01\xae\xff\x85\x02\x06\x01\xb5\xff\x85\x02\ +\x06\x01\xca\xff\xd7\x02\x06\x01\xce\xffq\x02\x06\x01\xcf\xff\ +\x85\x02\x06\x01\xd5\xffq\x02\x06\x01\xd8\xff\x85\x02\x06\x01\ +\xdb\xff\x85\x02\x06\x01\xde\xff\x85\x02\x06\x01\xea\xff\x85\x02\ +\x06\x01\xed\xff\x85\x02\x06\x01\xee\xff\xc3\x02\x06\x01\xf2\xff\ +q\x02\x06\x01\xfa\x00)\x02\x06\x01\xfc\x00)\x02\x06\x01\ +\xfe\x00)\x02\x06\x02\x00\x00\x14\x02\x06\x02W\xff\xc3\x02\ +\x06\x02X\xffq\x02\x06\x02Y\xff\xae\x02\x06\x02`\xff\ +\x85\x02\x06\x02b\xff\xc3\x02\x06\x02j\xff\x85\x02\x06\x02\ +r\xffq\x02\x06\x02s\xffq\x02\x06\x02}\xff\xec\x02\ +\x06\x02\x7f\xff\x85\x02\x06\x02\x85\xff\x85\x02\x06\x02\x87\xff\ +\x85\x02\x06\x02\x89\xff\x85\x02\x06\x02\x8d\xff\x85\x02\x06\x02\ +\xb2\xff\x85\x02\x06\x02\xb4\xff\x85\x02\x06\x02\xce\xff\x85\x02\ +\x06\x02\xcf\xffq\x02\x06\x02\xd9\xffq\x02\x06\x02\xda\xff\ +\xd7\x02\x06\x02\xdb\xffq\x02\x06\x02\xdc\xff\xd7\x02\x06\x02\ +\xdd\xffq\x02\x06\x02\xde\xff\xd7\x02\x06\x02\xe0\xff\x85\x02\ +\x06\x02\xe2\xff\xd7\x02\x06\x02\xe4\xff\xd7\x02\x06\x02\xf0\xff\ +\x85\x02\x06\x02\xf2\xff\x85\x02\x06\x02\xf4\xff\x85\x02\x06\x03\ +\x09\xffq\x02\x06\x03\x0a\xff\x85\x02\x06\x03\x0b\xffq\x02\ +\x06\x03\x0c\xff\x85\x02\x06\x03\x11\xff\x85\x02\x06\x03\x12\xff\ +q\x02\x06\x03\x16\xff\x85\x02\x06\x03\x1a\xff\x85\x02\x06\x03\ +\x1b\xff\x85\x02\x06\x03\x1c\xffq\x02\x06\x03\x1d\xffq\x02\ +\x06\x03\x1e\xff\xae\x02\x06\x03\x1f\xffq\x02\x06\x03 \xff\ +\xae\x02\x06\x03!\xffq\x02\x06\x03\x22\xff\xae\x02\x06\x03\ +#\xffq\x02\x06\x03%\xffq\x02\x06\x03&\xff\xae\x02\ +\x06\x03'\xffq\x02\x06\x03(\xff\xae\x02\x06\x03)\xff\ +q\x02\x06\x03*\xff\xae\x02\x06\x03+\xffq\x02\x06\x03\ +,\xff\xae\x02\x06\x03-\xffq\x02\x06\x03.\xff\xae\x02\ +\x06\x03/\xffq\x02\x06\x030\xff\xae\x02\x06\x031\xff\ +q\x02\x06\x032\xff\xae\x02\x06\x033\xffq\x02\x06\x03\ +4\xff\xae\x02\x06\x036\xff\x85\x02\x06\x038\xff\x85\x02\ +\x06\x03:\xff\x85\x02\x06\x03<\xff\x85\x02\x06\x03@\xff\ +\x85\x02\x06\x03B\xff\x85\x02\x06\x03D\xff\x85\x02\x06\x03\ +J\xff\x85\x02\x06\x03L\xff\x85\x02\x06\x03N\xff\x85\x02\ +\x06\x03R\xff\x85\x02\x06\x03T\xff\x85\x02\x06\x03V\xff\ +\x85\x02\x06\x03X\xff\x85\x02\x06\x03Z\xff\x85\x02\x06\x03\ +\x5c\xff\x85\x02\x06\x03^\xff\x85\x02\x06\x03`\xff\x85\x02\ +\x06\x03b\xff\xc3\x02\x06\x03d\xff\xc3\x02\x06\x03f\xff\ +\xc3\x02\x06\x03h\xff\xc3\x02\x06\x03j\xff\xc3\x02\x06\x03\ +l\xff\xc3\x02\x06\x03n\xff\xc3\x02\x06\x03o\x00\x14\x02\ +\x06\x03q\x00\x14\x02\x06\x03s\x00\x14\x02\x06\x03\x8f\x00\ +)\x02\x07\x00$\xffq\x02\x07\x007\x00)\x02\x07\x00\ +9\x00)\x02\x07\x00:\x00)\x02\x07\x00<\x00\x14\x02\ +\x07\x00D\xff\xae\x02\x07\x00F\xff\x85\x02\x07\x00G\xff\ +\x85\x02\x07\x00H\xff\x85\x02\x07\x00J\xff\xc3\x02\x07\x00\ +P\xff\xc3\x02\x07\x00Q\xff\xc3\x02\x07\x00R\xff\x85\x02\ +\x07\x00S\xff\xc3\x02\x07\x00T\xff\x85\x02\x07\x00U\xff\ +\xc3\x02\x07\x00V\xff\xc3\x02\x07\x00X\xff\xc3\x02\x07\x00\ +\x82\xffq\x02\x07\x00\x83\xffq\x02\x07\x00\x84\xffq\x02\ +\x07\x00\x85\xffq\x02\x07\x00\x86\xffq\x02\x07\x00\x87\xff\ +q\x02\x07\x00\x9f\x00\x14\x02\x07\x00\xa2\xff\x85\x02\x07\x00\ +\xa3\xff\xae\x02\x07\x00\xa4\xff\xae\x02\x07\x00\xa5\xff\xae\x02\ +\x07\x00\xa6\xff\xae\x02\x07\x00\xa7\xff\xae\x02\x07\x00\xa8\xff\ +\xae\x02\x07\x00\xa9\xff\x85\x02\x07\x00\xaa\xff\x85\x02\x07\x00\ +\xab\xff\x85\x02\x07\x00\xac\xff\x85\x02\x07\x00\xad\xff\x85\x02\ +\x07\x00\xb4\xff\x85\x02\x07\x00\xb5\xff\x85\x02\x07\x00\xb6\xff\ +\x85\x02\x07\x00\xb7\xff\x85\x02\x07\x00\xb8\xff\x85\x02\x07\x00\ +\xba\xff\x85\x02\x07\x00\xbb\xff\xc3\x02\x07\x00\xbc\xff\xc3\x02\ +\x07\x00\xbd\xff\xc3\x02\x07\x00\xbe\xff\xc3\x02\x07\x00\xc2\xff\ +q\x02\x07\x00\xc3\xff\xae\x02\x07\x00\xc4\xffq\x02\x07\x00\ +\xc5\xff\xae\x02\x07\x00\xc6\xffq\x02\x07\x00\xc7\xff\xae\x02\ +\x07\x00\xc9\xff\x85\x02\x07\x00\xcb\xff\x85\x02\x07\x00\xcd\xff\ +\x85\x02\x07\x00\xcf\xff\x85\x02\x07\x00\xd1\xff\x85\x02\x07\x00\ +\xd3\xff\x85\x02\x07\x00\xd5\xff\x85\x02\x07\x00\xd7\xff\x85\x02\ +\x07\x00\xd9\xff\x85\x02\x07\x00\xdb\xff\x85\x02\x07\x00\xdd\xff\ +\x85\x02\x07\x00\xdf\xff\xc3\x02\x07\x00\xe1\xff\xc3\x02\x07\x00\ +\xe3\xff\xc3\x02\x07\x00\xe5\xff\xc3\x02\x07\x00\xfa\xff\xc3\x02\ +\x07\x01\x06\xff\xc3\x02\x07\x01\x08\xff\xc3\x02\x07\x01\x0d\xff\ +\xc3\x02\x07\x01\x0f\xff\x85\x02\x07\x01\x11\xff\x85\x02\x07\x01\ +\x13\xff\x85\x02\x07\x01\x15\xff\x85\x02\x07\x01\x17\xff\xc3\x02\ +\x07\x01\x19\xff\xc3\x02\x07\x01\x1d\xff\xc3\x02\x07\x01!\xff\ +\xc3\x02\x07\x01$\x00)\x02\x07\x01&\x00)\x02\x07\x01\ ++\xff\xc3\x02\x07\x01-\xff\xc3\x02\x07\x01/\xff\xc3\x02\ +\x07\x011\xff\xc3\x02\x07\x013\xff\xc3\x02\x07\x015\xff\ +\xc3\x02\x07\x016\x00)\x02\x07\x018\x00\x14\x02\x07\x01\ +:\x00\x14\x02\x07\x01C\xffq\x02\x07\x01D\xff\xae\x02\ +\x07\x01F\xff\xae\x02\x07\x01H\xff\x85\x02\x07\x01J\xff\ +\xc3\x02\x07\x01V\xffq\x02\x07\x01_\xffq\x02\x07\x01\ +b\xffq\x02\x07\x01i\xffq\x02\x07\x01y\xff\xae\x02\ +\x07\x01z\xff\xd7\x02\x07\x01{\xff\xd7\x02\x07\x01~\xff\ +\xae\x02\x07\x01\x81\xff\xc3\x02\x07\x01\x82\xff\xd7\x02\x07\x01\ +\x83\xff\xd7\x02\x07\x01\x84\xff\xd7\x02\x07\x01\x87\xff\xd7\x02\ +\x07\x01\x89\xff\xd7\x02\x07\x01\x8c\xff\xae\x02\x07\x01\x8e\xff\ +\xc3\x02\x07\x01\x8f\xff\xae\x02\x07\x01\x90\xff\xae\x02\x07\x01\ +\x93\xff\xae\x02\x07\x01\x99\xff\xae\x02\x07\x01\xa4\xff\x85\x02\ +\x07\x01\xaa\xffq\x02\x07\x01\xae\xff\x85\x02\x07\x01\xb5\xff\ +\x85\x02\x07\x01\xca\xff\xd7\x02\x07\x01\xce\xffq\x02\x07\x01\ +\xcf\xff\x85\x02\x07\x01\xd5\xffq\x02\x07\x01\xd8\xff\x85\x02\ +\x07\x01\xdb\xff\x85\x02\x07\x01\xde\xff\x85\x02\x07\x01\xea\xff\ +\x85\x02\x07\x01\xed\xff\x85\x02\x07\x01\xee\xff\xc3\x02\x07\x01\ +\xf2\xffq\x02\x07\x01\xfa\x00)\x02\x07\x01\xfc\x00)\x02\ +\x07\x01\xfe\x00)\x02\x07\x02\x00\x00\x14\x02\x07\x02W\xff\ +\xc3\x02\x07\x02X\xffq\x02\x07\x02Y\xff\xae\x02\x07\x02\ +`\xff\x85\x02\x07\x02b\xff\xc3\x02\x07\x02j\xff\x85\x02\ +\x07\x02r\xffq\x02\x07\x02s\xffq\x02\x07\x02}\xff\ +\xec\x02\x07\x02\x7f\xff\x85\x02\x07\x02\x85\xff\x85\x02\x07\x02\ +\x87\xff\x85\x02\x07\x02\x89\xff\x85\x02\x07\x02\x8d\xff\x85\x02\ +\x07\x02\xb2\xff\x85\x02\x07\x02\xb4\xff\x85\x02\x07\x02\xce\xff\ +\x85\x02\x07\x02\xcf\xffq\x02\x07\x02\xd9\xffq\x02\x07\x02\ +\xda\xff\xd7\x02\x07\x02\xdb\xffq\x02\x07\x02\xdc\xff\xd7\x02\ +\x07\x02\xdd\xffq\x02\x07\x02\xde\xff\xd7\x02\x07\x02\xe0\xff\ +\x85\x02\x07\x02\xe2\xff\xd7\x02\x07\x02\xe4\xff\xd7\x02\x07\x02\ +\xf0\xff\x85\x02\x07\x02\xf2\xff\x85\x02\x07\x02\xf4\xff\x85\x02\ +\x07\x03\x09\xffq\x02\x07\x03\x0a\xff\x85\x02\x07\x03\x0b\xff\ +q\x02\x07\x03\x0c\xff\x85\x02\x07\x03\x11\xff\x85\x02\x07\x03\ +\x12\xffq\x02\x07\x03\x16\xff\x85\x02\x07\x03\x1a\xff\x85\x02\ +\x07\x03\x1b\xff\x85\x02\x07\x03\x1c\xffq\x02\x07\x03\x1d\xff\ +q\x02\x07\x03\x1e\xff\xae\x02\x07\x03\x1f\xffq\x02\x07\x03\ + \xff\xae\x02\x07\x03!\xffq\x02\x07\x03\x22\xff\xae\x02\ +\x07\x03#\xffq\x02\x07\x03%\xffq\x02\x07\x03&\xff\ +\xae\x02\x07\x03'\xffq\x02\x07\x03(\xff\xae\x02\x07\x03\ +)\xffq\x02\x07\x03*\xff\xae\x02\x07\x03+\xffq\x02\ +\x07\x03,\xff\xae\x02\x07\x03-\xffq\x02\x07\x03.\xff\ +\xae\x02\x07\x03/\xffq\x02\x07\x030\xff\xae\x02\x07\x03\ +1\xffq\x02\x07\x032\xff\xae\x02\x07\x033\xffq\x02\ +\x07\x034\xff\xae\x02\x07\x036\xff\x85\x02\x07\x038\xff\ +\x85\x02\x07\x03:\xff\x85\x02\x07\x03<\xff\x85\x02\x07\x03\ +@\xff\x85\x02\x07\x03B\xff\x85\x02\x07\x03D\xff\x85\x02\ +\x07\x03J\xff\x85\x02\x07\x03L\xff\x85\x02\x07\x03N\xff\ +\x85\x02\x07\x03R\xff\x85\x02\x07\x03T\xff\x85\x02\x07\x03\ +V\xff\x85\x02\x07\x03X\xff\x85\x02\x07\x03Z\xff\x85\x02\ +\x07\x03\x5c\xff\x85\x02\x07\x03^\xff\x85\x02\x07\x03`\xff\ +\x85\x02\x07\x03b\xff\xc3\x02\x07\x03d\xff\xc3\x02\x07\x03\ +f\xff\xc3\x02\x07\x03h\xff\xc3\x02\x07\x03j\xff\xc3\x02\ +\x07\x03l\xff\xc3\x02\x07\x03n\xff\xc3\x02\x07\x03o\x00\ +\x14\x02\x07\x03q\x00\x14\x02\x07\x03s\x00\x14\x02\x07\x03\ +\x8f\x00)\x02\x08\x00&\xff\x9a\x02\x08\x00*\xff\x9a\x02\ +\x08\x002\xff\x9a\x02\x08\x004\xff\x9a\x02\x08\x007\xff\ +q\x02\x08\x008\xff\xd7\x02\x08\x009\xff\x85\x02\x08\x00\ +:\xff\x85\x02\x08\x00<\xff\x85\x02\x08\x00\x89\xff\x9a\x02\ +\x08\x00\x94\xff\x9a\x02\x08\x00\x95\xff\x9a\x02\x08\x00\x96\xff\ +\x9a\x02\x08\x00\x97\xff\x9a\x02\x08\x00\x98\xff\x9a\x02\x08\x00\ +\x9a\xff\x9a\x02\x08\x00\x9b\xff\xd7\x02\x08\x00\x9c\xff\xd7\x02\ +\x08\x00\x9d\xff\xd7\x02\x08\x00\x9e\xff\xd7\x02\x08\x00\x9f\xff\ +\x85\x02\x08\x00\xc8\xff\x9a\x02\x08\x00\xca\xff\x9a\x02\x08\x00\ +\xcc\xff\x9a\x02\x08\x00\xce\xff\x9a\x02\x08\x00\xde\xff\x9a\x02\ +\x08\x00\xe0\xff\x9a\x02\x08\x00\xe2\xff\x9a\x02\x08\x00\xe4\xff\ +\x9a\x02\x08\x01\x0e\xff\x9a\x02\x08\x01\x10\xff\x9a\x02\x08\x01\ +\x12\xff\x9a\x02\x08\x01\x14\xff\x9a\x02\x08\x01$\xffq\x02\ +\x08\x01&\xffq\x02\x08\x01*\xff\xd7\x02\x08\x01,\xff\ +\xd7\x02\x08\x01.\xff\xd7\x02\x08\x010\xff\xd7\x02\x08\x01\ +2\xff\xd7\x02\x08\x014\xff\xd7\x02\x08\x016\xff\x85\x02\ +\x08\x018\xff\x85\x02\x08\x01:\xff\x85\x02\x08\x01G\xff\ +\x9a\x02\x08\x01f\xff\xae\x02\x08\x01m\xff\xae\x02\x08\x01\ +q\xffq\x02\x08\x01r\xff\x85\x02\x08\x01s\xff\x9a\x02\ +\x08\x01u\xff\x85\x02\x08\x01x\xff\x85\x02\x08\x01\x85\xff\ +\xd7\x02\x08\x01\x9d\xffq\x02\x08\x01\x9f\xff\x9a\x02\x08\x01\ +\xa6\xffq\x02\x08\x01\xb8\xff\x9a\x02\x08\x01\xbb\xff\x9a\x02\ +\x08\x01\xbc\xffq\x02\x08\x01\xbe\xff\xae\x02\x08\x01\xc1\xff\ +\x5c\x02\x08\x01\xc4\xffq\x02\x08\x01\xdc\xff\x9a\x02\x08\x01\ +\xe1\xff\x85\x02\x08\x01\xe4\xff\x9a\x02\x08\x01\xfa\xff\x85\x02\ +\x08\x01\xfc\xff\x85\x02\x08\x01\xfe\xff\x85\x02\x08\x02\x00\xff\ +\x85\x02\x08\x02T\xff\x85\x02\x08\x02_\xff\x9a\x02\x08\x02\ +a\xff\xd7\x02\x08\x02l\xff\x9a\x02\x08\x02|\xff\x5c\x02\ +\x08\x02~\xff\x9a\x02\x08\x02\x80\xff\x85\x02\x08\x02\x82\xff\ +\x85\x02\x08\x02\x84\xff\x9a\x02\x08\x02\x86\xff\x9a\x02\x08\x02\ +\x88\xff\x9a\x02\x08\x02\x8a\xff\x9a\x02\x08\x02\x8c\xff\x9a\x02\ +\x08\x02\xa9\xffq\x02\x08\x02\xaa\xff\x9a\x02\x08\x02\xb1\xff\ +\x9a\x02\x08\x02\xb3\xff\x9a\x02\x08\x02\xb5\xffq\x02\x08\x02\ +\xb6\xff\x9a\x02\x08\x02\xb7\xff\x85\x02\x08\x02\xb9\xff\x85\x02\ +\x08\x02\xbd\xffq\x02\x08\x02\xbe\xff\x9a\x02\x08\x02\xbf\xff\ +\x5c\x02\x08\x02\xc0\xff\x85\x02\x08\x02\xc1\xff\x5c\x02\x08\x02\ +\xc2\xff\x85\x02\x08\x02\xc5\xff\x85\x02\x08\x02\xc7\xff\x85\x02\ +\x08\x02\xd4\xff\x5c\x02\x08\x02\xd5\xff\x85\x02\x08\x02\xef\xff\ +\x9a\x02\x08\x02\xf1\xff\x9a\x02\x08\x02\xf3\xff\x9a\x02\x08\x02\ +\xfd\xff\x5c\x02\x08\x02\xfe\xff\x85\x02\x08\x03\x0d\xff\x85\x02\ +\x08\x03\x0e\xff\x9a\x02\x08\x03\x0f\xff\x85\x02\x08\x03\x10\xff\ +\x9a\x02\x08\x03\x15\xff\x9a\x02\x08\x03\x17\xffq\x02\x08\x03\ +\x18\xff\x9a\x02\x08\x03I\xff\x9a\x02\x08\x03K\xff\x9a\x02\ +\x08\x03M\xff\x9a\x02\x08\x03O\xff\x9a\x02\x08\x03Q\xff\ +\x9a\x02\x08\x03S\xff\x9a\x02\x08\x03U\xff\x9a\x02\x08\x03\ +W\xff\x9a\x02\x08\x03Y\xff\x9a\x02\x08\x03[\xff\x9a\x02\ +\x08\x03]\xff\x9a\x02\x08\x03_\xff\x9a\x02\x08\x03a\xff\ +\xd7\x02\x08\x03c\xff\xd7\x02\x08\x03e\xff\xd7\x02\x08\x03\ +g\xff\xd7\x02\x08\x03i\xff\xd7\x02\x08\x03k\xff\xd7\x02\ +\x08\x03m\xff\xd7\x02\x08\x03o\xff\x85\x02\x08\x03q\xff\ +\x85\x02\x08\x03s\xff\x85\x02\x08\x03\x8f\xffq\x02\x0a\x00\ +$\xffq\x02\x0a\x007\x00)\x02\x0a\x009\x00)\x02\ +\x0a\x00:\x00)\x02\x0a\x00<\x00\x14\x02\x0a\x00D\xff\ +\xae\x02\x0a\x00F\xff\x85\x02\x0a\x00G\xff\x85\x02\x0a\x00\ +H\xff\x85\x02\x0a\x00J\xff\xc3\x02\x0a\x00P\xff\xc3\x02\ +\x0a\x00Q\xff\xc3\x02\x0a\x00R\xff\x85\x02\x0a\x00S\xff\ +\xc3\x02\x0a\x00T\xff\x85\x02\x0a\x00U\xff\xc3\x02\x0a\x00\ +V\xff\xc3\x02\x0a\x00X\xff\xc3\x02\x0a\x00\x82\xffq\x02\ +\x0a\x00\x83\xffq\x02\x0a\x00\x84\xffq\x02\x0a\x00\x85\xff\ +q\x02\x0a\x00\x86\xffq\x02\x0a\x00\x87\xffq\x02\x0a\x00\ +\x9f\x00\x14\x02\x0a\x00\xa2\xff\x85\x02\x0a\x00\xa3\xff\xae\x02\ +\x0a\x00\xa4\xff\xae\x02\x0a\x00\xa5\xff\xae\x02\x0a\x00\xa6\xff\ +\xae\x02\x0a\x00\xa7\xff\xae\x02\x0a\x00\xa8\xff\xae\x02\x0a\x00\ +\xa9\xff\x85\x02\x0a\x00\xaa\xff\x85\x02\x0a\x00\xab\xff\x85\x02\ +\x0a\x00\xac\xff\x85\x02\x0a\x00\xad\xff\x85\x02\x0a\x00\xb4\xff\ +\x85\x02\x0a\x00\xb5\xff\x85\x02\x0a\x00\xb6\xff\x85\x02\x0a\x00\ +\xb7\xff\x85\x02\x0a\x00\xb8\xff\x85\x02\x0a\x00\xba\xff\x85\x02\ +\x0a\x00\xbb\xff\xc3\x02\x0a\x00\xbc\xff\xc3\x02\x0a\x00\xbd\xff\ +\xc3\x02\x0a\x00\xbe\xff\xc3\x02\x0a\x00\xc2\xffq\x02\x0a\x00\ +\xc3\xff\xae\x02\x0a\x00\xc4\xffq\x02\x0a\x00\xc5\xff\xae\x02\ +\x0a\x00\xc6\xffq\x02\x0a\x00\xc7\xff\xae\x02\x0a\x00\xc9\xff\ +\x85\x02\x0a\x00\xcb\xff\x85\x02\x0a\x00\xcd\xff\x85\x02\x0a\x00\ +\xcf\xff\x85\x02\x0a\x00\xd1\xff\x85\x02\x0a\x00\xd3\xff\x85\x02\ +\x0a\x00\xd5\xff\x85\x02\x0a\x00\xd7\xff\x85\x02\x0a\x00\xd9\xff\ +\x85\x02\x0a\x00\xdb\xff\x85\x02\x0a\x00\xdd\xff\x85\x02\x0a\x00\ +\xdf\xff\xc3\x02\x0a\x00\xe1\xff\xc3\x02\x0a\x00\xe3\xff\xc3\x02\ +\x0a\x00\xe5\xff\xc3\x02\x0a\x00\xfa\xff\xc3\x02\x0a\x01\x06\xff\ +\xc3\x02\x0a\x01\x08\xff\xc3\x02\x0a\x01\x0d\xff\xc3\x02\x0a\x01\ +\x0f\xff\x85\x02\x0a\x01\x11\xff\x85\x02\x0a\x01\x13\xff\x85\x02\ +\x0a\x01\x15\xff\x85\x02\x0a\x01\x17\xff\xc3\x02\x0a\x01\x19\xff\ +\xc3\x02\x0a\x01\x1d\xff\xc3\x02\x0a\x01!\xff\xc3\x02\x0a\x01\ +$\x00)\x02\x0a\x01&\x00)\x02\x0a\x01+\xff\xc3\x02\ +\x0a\x01-\xff\xc3\x02\x0a\x01/\xff\xc3\x02\x0a\x011\xff\ +\xc3\x02\x0a\x013\xff\xc3\x02\x0a\x015\xff\xc3\x02\x0a\x01\ +6\x00)\x02\x0a\x018\x00\x14\x02\x0a\x01:\x00\x14\x02\ +\x0a\x01C\xffq\x02\x0a\x01D\xff\xae\x02\x0a\x01F\xff\ +\xae\x02\x0a\x01H\xff\x85\x02\x0a\x01J\xff\xc3\x02\x0a\x01\ +V\xffq\x02\x0a\x01_\xffq\x02\x0a\x01b\xffq\x02\ +\x0a\x01i\xffq\x02\x0a\x01y\xff\xae\x02\x0a\x01z\xff\ +\xd7\x02\x0a\x01{\xff\xd7\x02\x0a\x01~\xff\xae\x02\x0a\x01\ +\x81\xff\xc3\x02\x0a\x01\x82\xff\xd7\x02\x0a\x01\x83\xff\xd7\x02\ +\x0a\x01\x84\xff\xd7\x02\x0a\x01\x87\xff\xd7\x02\x0a\x01\x89\xff\ +\xd7\x02\x0a\x01\x8c\xff\xae\x02\x0a\x01\x8e\xff\xc3\x02\x0a\x01\ +\x8f\xff\xae\x02\x0a\x01\x90\xff\xae\x02\x0a\x01\x93\xff\xae\x02\ +\x0a\x01\x99\xff\xae\x02\x0a\x01\xa4\xff\x85\x02\x0a\x01\xaa\xff\ +q\x02\x0a\x01\xae\xff\x85\x02\x0a\x01\xb5\xff\x85\x02\x0a\x01\ +\xca\xff\xd7\x02\x0a\x01\xce\xffq\x02\x0a\x01\xcf\xff\x85\x02\ +\x0a\x01\xd5\xffq\x02\x0a\x01\xd8\xff\x85\x02\x0a\x01\xdb\xff\ +\x85\x02\x0a\x01\xde\xff\x85\x02\x0a\x01\xea\xff\x85\x02\x0a\x01\ +\xed\xff\x85\x02\x0a\x01\xee\xff\xc3\x02\x0a\x01\xf2\xffq\x02\ +\x0a\x01\xfa\x00)\x02\x0a\x01\xfc\x00)\x02\x0a\x01\xfe\x00\ +)\x02\x0a\x02\x00\x00\x14\x02\x0a\x02W\xff\xc3\x02\x0a\x02\ +X\xffq\x02\x0a\x02Y\xff\xae\x02\x0a\x02`\xff\x85\x02\ +\x0a\x02b\xff\xc3\x02\x0a\x02j\xff\x85\x02\x0a\x02r\xff\ +q\x02\x0a\x02s\xffq\x02\x0a\x02}\xff\xec\x02\x0a\x02\ +\x7f\xff\x85\x02\x0a\x02\x85\xff\x85\x02\x0a\x02\x87\xff\x85\x02\ +\x0a\x02\x89\xff\x85\x02\x0a\x02\x8d\xff\x85\x02\x0a\x02\xb2\xff\ +\x85\x02\x0a\x02\xb4\xff\x85\x02\x0a\x02\xce\xff\x85\x02\x0a\x02\ +\xcf\xffq\x02\x0a\x02\xd9\xffq\x02\x0a\x02\xda\xff\xd7\x02\ +\x0a\x02\xdb\xffq\x02\x0a\x02\xdc\xff\xd7\x02\x0a\x02\xdd\xff\ +q\x02\x0a\x02\xde\xff\xd7\x02\x0a\x02\xe0\xff\x85\x02\x0a\x02\ +\xe2\xff\xd7\x02\x0a\x02\xe4\xff\xd7\x02\x0a\x02\xf0\xff\x85\x02\ +\x0a\x02\xf2\xff\x85\x02\x0a\x02\xf4\xff\x85\x02\x0a\x03\x09\xff\ +q\x02\x0a\x03\x0a\xff\x85\x02\x0a\x03\x0b\xffq\x02\x0a\x03\ +\x0c\xff\x85\x02\x0a\x03\x11\xff\x85\x02\x0a\x03\x12\xffq\x02\ +\x0a\x03\x16\xff\x85\x02\x0a\x03\x1a\xff\x85\x02\x0a\x03\x1b\xff\ +\x85\x02\x0a\x03\x1c\xffq\x02\x0a\x03\x1d\xffq\x02\x0a\x03\ +\x1e\xff\xae\x02\x0a\x03\x1f\xffq\x02\x0a\x03 \xff\xae\x02\ +\x0a\x03!\xffq\x02\x0a\x03\x22\xff\xae\x02\x0a\x03#\xff\ +q\x02\x0a\x03%\xffq\x02\x0a\x03&\xff\xae\x02\x0a\x03\ +'\xffq\x02\x0a\x03(\xff\xae\x02\x0a\x03)\xffq\x02\ +\x0a\x03*\xff\xae\x02\x0a\x03+\xffq\x02\x0a\x03,\xff\ +\xae\x02\x0a\x03-\xffq\x02\x0a\x03.\xff\xae\x02\x0a\x03\ +/\xffq\x02\x0a\x030\xff\xae\x02\x0a\x031\xffq\x02\ +\x0a\x032\xff\xae\x02\x0a\x033\xffq\x02\x0a\x034\xff\ +\xae\x02\x0a\x036\xff\x85\x02\x0a\x038\xff\x85\x02\x0a\x03\ +:\xff\x85\x02\x0a\x03<\xff\x85\x02\x0a\x03@\xff\x85\x02\ +\x0a\x03B\xff\x85\x02\x0a\x03D\xff\x85\x02\x0a\x03J\xff\ +\x85\x02\x0a\x03L\xff\x85\x02\x0a\x03N\xff\x85\x02\x0a\x03\ +R\xff\x85\x02\x0a\x03T\xff\x85\x02\x0a\x03V\xff\x85\x02\ +\x0a\x03X\xff\x85\x02\x0a\x03Z\xff\x85\x02\x0a\x03\x5c\xff\ +\x85\x02\x0a\x03^\xff\x85\x02\x0a\x03`\xff\x85\x02\x0a\x03\ +b\xff\xc3\x02\x0a\x03d\xff\xc3\x02\x0a\x03f\xff\xc3\x02\ +\x0a\x03h\xff\xc3\x02\x0a\x03j\xff\xc3\x02\x0a\x03l\xff\ +\xc3\x02\x0a\x03n\xff\xc3\x02\x0a\x03o\x00\x14\x02\x0a\x03\ +q\x00\x14\x02\x0a\x03s\x00\x14\x02\x0a\x03\x8f\x00)\x02\ +\x0c\x00&\xff\x9a\x02\x0c\x00*\xff\x9a\x02\x0c\x002\xff\ +\x9a\x02\x0c\x004\xff\x9a\x02\x0c\x007\xffq\x02\x0c\x00\ +8\xff\xd7\x02\x0c\x009\xff\x85\x02\x0c\x00:\xff\x85\x02\ +\x0c\x00<\xff\x85\x02\x0c\x00\x89\xff\x9a\x02\x0c\x00\x94\xff\ +\x9a\x02\x0c\x00\x95\xff\x9a\x02\x0c\x00\x96\xff\x9a\x02\x0c\x00\ +\x97\xff\x9a\x02\x0c\x00\x98\xff\x9a\x02\x0c\x00\x9a\xff\x9a\x02\ +\x0c\x00\x9b\xff\xd7\x02\x0c\x00\x9c\xff\xd7\x02\x0c\x00\x9d\xff\ +\xd7\x02\x0c\x00\x9e\xff\xd7\x02\x0c\x00\x9f\xff\x85\x02\x0c\x00\ +\xc8\xff\x9a\x02\x0c\x00\xca\xff\x9a\x02\x0c\x00\xcc\xff\x9a\x02\ +\x0c\x00\xce\xff\x9a\x02\x0c\x00\xde\xff\x9a\x02\x0c\x00\xe0\xff\ +\x9a\x02\x0c\x00\xe2\xff\x9a\x02\x0c\x00\xe4\xff\x9a\x02\x0c\x01\ +\x0e\xff\x9a\x02\x0c\x01\x10\xff\x9a\x02\x0c\x01\x12\xff\x9a\x02\ +\x0c\x01\x14\xff\x9a\x02\x0c\x01$\xffq\x02\x0c\x01&\xff\ +q\x02\x0c\x01*\xff\xd7\x02\x0c\x01,\xff\xd7\x02\x0c\x01\ +.\xff\xd7\x02\x0c\x010\xff\xd7\x02\x0c\x012\xff\xd7\x02\ +\x0c\x014\xff\xd7\x02\x0c\x016\xff\x85\x02\x0c\x018\xff\ +\x85\x02\x0c\x01:\xff\x85\x02\x0c\x01G\xff\x9a\x02\x0c\x01\ +f\xff\xae\x02\x0c\x01m\xff\xae\x02\x0c\x01q\xffq\x02\ +\x0c\x01r\xff\x85\x02\x0c\x01s\xff\x9a\x02\x0c\x01u\xff\ +\x85\x02\x0c\x01x\xff\x85\x02\x0c\x01\x85\xff\xd7\x02\x0c\x01\ +\x9d\xffq\x02\x0c\x01\x9f\xff\x9a\x02\x0c\x01\xa6\xffq\x02\ +\x0c\x01\xb8\xff\x9a\x02\x0c\x01\xbb\xff\x9a\x02\x0c\x01\xbc\xff\ +q\x02\x0c\x01\xbe\xff\xae\x02\x0c\x01\xc1\xff\x5c\x02\x0c\x01\ +\xc4\xffq\x02\x0c\x01\xdc\xff\x9a\x02\x0c\x01\xe1\xff\x85\x02\ +\x0c\x01\xe4\xff\x9a\x02\x0c\x01\xfa\xff\x85\x02\x0c\x01\xfc\xff\ +\x85\x02\x0c\x01\xfe\xff\x85\x02\x0c\x02\x00\xff\x85\x02\x0c\x02\ +T\xff\x85\x02\x0c\x02_\xff\x9a\x02\x0c\x02a\xff\xd7\x02\ +\x0c\x02l\xff\x9a\x02\x0c\x02|\xff\x5c\x02\x0c\x02~\xff\ +\x9a\x02\x0c\x02\x80\xff\x85\x02\x0c\x02\x82\xff\x85\x02\x0c\x02\ +\x84\xff\x9a\x02\x0c\x02\x86\xff\x9a\x02\x0c\x02\x88\xff\x9a\x02\ +\x0c\x02\x8a\xff\x9a\x02\x0c\x02\x8c\xff\x9a\x02\x0c\x02\xa9\xff\ +q\x02\x0c\x02\xaa\xff\x9a\x02\x0c\x02\xb1\xff\x9a\x02\x0c\x02\ +\xb3\xff\x9a\x02\x0c\x02\xb5\xffq\x02\x0c\x02\xb6\xff\x9a\x02\ +\x0c\x02\xb7\xff\x85\x02\x0c\x02\xb9\xff\x85\x02\x0c\x02\xbd\xff\ +q\x02\x0c\x02\xbe\xff\x9a\x02\x0c\x02\xbf\xff\x5c\x02\x0c\x02\ +\xc0\xff\x85\x02\x0c\x02\xc1\xff\x5c\x02\x0c\x02\xc2\xff\x85\x02\ +\x0c\x02\xc5\xff\x85\x02\x0c\x02\xc7\xff\x85\x02\x0c\x02\xd4\xff\ +\x5c\x02\x0c\x02\xd5\xff\x85\x02\x0c\x02\xef\xff\x9a\x02\x0c\x02\ +\xf1\xff\x9a\x02\x0c\x02\xf3\xff\x9a\x02\x0c\x02\xfd\xff\x5c\x02\ +\x0c\x02\xfe\xff\x85\x02\x0c\x03\x0d\xff\x85\x02\x0c\x03\x0e\xff\ +\x9a\x02\x0c\x03\x0f\xff\x85\x02\x0c\x03\x10\xff\x9a\x02\x0c\x03\ +\x15\xff\x9a\x02\x0c\x03\x17\xffq\x02\x0c\x03\x18\xff\x9a\x02\ +\x0c\x03I\xff\x9a\x02\x0c\x03K\xff\x9a\x02\x0c\x03M\xff\ +\x9a\x02\x0c\x03O\xff\x9a\x02\x0c\x03Q\xff\x9a\x02\x0c\x03\ +S\xff\x9a\x02\x0c\x03U\xff\x9a\x02\x0c\x03W\xff\x9a\x02\ +\x0c\x03Y\xff\x9a\x02\x0c\x03[\xff\x9a\x02\x0c\x03]\xff\ +\x9a\x02\x0c\x03_\xff\x9a\x02\x0c\x03a\xff\xd7\x02\x0c\x03\ +c\xff\xd7\x02\x0c\x03e\xff\xd7\x02\x0c\x03g\xff\xd7\x02\ +\x0c\x03i\xff\xd7\x02\x0c\x03k\xff\xd7\x02\x0c\x03m\xff\ +\xd7\x02\x0c\x03o\xff\x85\x02\x0c\x03q\xff\x85\x02\x0c\x03\ +s\xff\x85\x02\x0c\x03\x8f\xffq\x02!\x01q\xff\xd7\x02\ +!\x01r\xff\xec\x02!\x01x\xff\xec\x02!\x02T\xff\ +\xec\x02S\x00\x0f\xff\xc3\x02S\x00\x11\xff\xc3\x02S\x02\ +\x08\xff\xc3\x02S\x02\x0c\xff\xc3\x02T\x00\x0f\xff\x85\x02\ +T\x00\x11\xff\x85\x02T\x01V\xff\x85\x02T\x01_\xff\ +\x85\x02T\x01b\xff\x85\x02T\x01f\xff\xd7\x02T\x01\ +i\xff\x85\x02T\x01m\xff\xd7\x02T\x01s\xff\xc3\x02\ +T\x01v\xff\xec\x02T\x01y\xff\x9a\x02T\x01z\xff\ +\xae\x02T\x01{\xff\xc3\x02T\x01|\xff\xc3\x02T\x01\ +}\xff\xc3\x02T\x01~\xff\x9a\x02T\x01\x81\xff\xc3\x02\ +T\x01\x82\xff\xae\x02T\x01\x84\xff\xc3\x02T\x01\x86\xff\ +\xc3\x02T\x01\x87\xff\xc3\x02T\x01\x89\xff\xc3\x02T\x01\ +\x8c\xff\x9a\x02T\x01\x8e\xff\x9a\x02T\x01\x8f\xff\x9a\x02\ +T\x01\x90\xff\x9a\x02T\x01\x92\xff\xc3\x02T\x01\x93\xff\ +\x9a\x02T\x01\x95\xff\xc3\x02T\x01\x96\xff\xc3\x02T\x01\ +\x98\xff\xc3\x02T\x01\x99\xff\x9a\x02T\x01\x9a\xff\xc3\x02\ +T\x01\x9b\xff\xc3\x02T\x02\x08\xff\x85\x02T\x02\x0c\xff\ +\x85\x02T\x02!\xff\xec\x02X\x00\x05\xffq\x02X\x00\ +\x0a\xffq\x02X\x00&\xff\xd7\x02X\x00*\xff\xd7\x02\ +X\x00-\x01\x0a\x02X\x002\xff\xd7\x02X\x004\xff\ +\xd7\x02X\x007\xffq\x02X\x009\xff\xae\x02X\x00\ +:\xff\xae\x02X\x00<\xff\x85\x02X\x00\x89\xff\xd7\x02\ +X\x00\x94\xff\xd7\x02X\x00\x95\xff\xd7\x02X\x00\x96\xff\ +\xd7\x02X\x00\x97\xff\xd7\x02X\x00\x98\xff\xd7\x02X\x00\ +\x9a\xff\xd7\x02X\x00\x9f\xff\x85\x02X\x00\xc8\xff\xd7\x02\ +X\x00\xca\xff\xd7\x02X\x00\xcc\xff\xd7\x02X\x00\xce\xff\ +\xd7\x02X\x00\xde\xff\xd7\x02X\x00\xe0\xff\xd7\x02X\x00\ +\xe2\xff\xd7\x02X\x00\xe4\xff\xd7\x02X\x01\x0e\xff\xd7\x02\ +X\x01\x10\xff\xd7\x02X\x01\x12\xff\xd7\x02X\x01\x14\xff\ +\xd7\x02X\x01$\xffq\x02X\x01&\xffq\x02X\x01\ +6\xff\xae\x02X\x018\xff\x85\x02X\x01:\xff\x85\x02\ +X\x01G\xff\xd7\x02X\x01\xfa\xff\xae\x02X\x01\xfc\xff\ +\xae\x02X\x01\xfe\xff\xae\x02X\x02\x00\xff\x85\x02X\x02\ +\x07\xffq\x02X\x02\x0b\xffq\x02X\x02_\xff\xd7\x02\ +X\x03I\xff\xd7\x02X\x03K\xff\xd7\x02X\x03M\xff\ +\xd7\x02X\x03O\xff\xd7\x02X\x03Q\xff\xd7\x02X\x03\ +S\xff\xd7\x02X\x03U\xff\xd7\x02X\x03W\xff\xd7\x02\ +X\x03Y\xff\xd7\x02X\x03[\xff\xd7\x02X\x03]\xff\ +\xd7\x02X\x03_\xff\xd7\x02X\x03o\xff\x85\x02X\x03\ +q\xff\x85\x02X\x03s\xff\x85\x02X\x03\x8f\xffq\x02\ +Y\x00\x05\xff\xec\x02Y\x00\x0a\xff\xec\x02Y\x02\x07\xff\ +\xec\x02Y\x02\x0b\xff\xec\x02Z\x00\x0f\xff\xae\x02Z\x00\ +\x11\xff\xae\x02Z\x01V\xff\xd7\x02Z\x01_\xff\xd7\x02\ +Z\x01b\xff\xd7\x02Z\x01d\xff\xec\x02Z\x01i\xff\ +\xd7\x02Z\x01p\xff\xec\x02Z\x01q\xff\xc3\x02Z\x01\ +r\xff\xec\x02Z\x01t\xff\xd7\x02Z\x01u\xff\xec\x02\ +Z\x01x\xff\xec\x02Z\x01\x88\xff\xec\x02Z\x02\x08\xff\ +\xae\x02Z\x02\x0c\xff\xae\x02Z\x02T\xff\xec\x02`\x00\ +I\x00R\x02`\x00W\x00R\x02`\x00Y\x00f\x02\ +`\x00Z\x00f\x02`\x00[\x00f\x02`\x00\x5c\x00\ +f\x02`\x00\xbf\x00f\x02`\x01%\x00R\x02`\x01\ +'\x00R\x02`\x017\x00f\x02`\x01\xfb\x00f\x02\ +`\x01\xfd\x00f\x02`\x024\x00R\x02`\x025\x00\ +R\x02`\x02]\x00R\x02`\x02^\x00R\x02`\x03\ +p\x00f\x02`\x03\x8d\x00R\x02`\x03\x90\x00R\x02\ +b\x00I\x00f\x02b\x00W\x00f\x02b\x00Y\x00\ +f\x02b\x00Z\x00f\x02b\x00[\x00f\x02b\x00\ +\x5c\x00f\x02b\x00\xbf\x00f\x02b\x01%\x00f\x02\ +b\x01'\x00f\x02b\x017\x00f\x02b\x01\xfb\x00\ +f\x02b\x01\xfd\x00f\x02b\x024\x00f\x02b\x02\ +5\x00f\x02b\x02]\x00f\x02b\x02^\x00f\x02\ +b\x03p\x00f\x02b\x03\x8d\x00f\x02b\x03\x90\x00\ +f\x02j\x00\x05\xff\xec\x02j\x00\x0a\xff\xec\x02j\x02\ +\x07\xff\xec\x02j\x02\x0b\xff\xec\x02l\x00\x0f\xff\xae\x02\ +l\x00\x11\xff\xae\x02l\x01\x9d\xff\xec\x02l\x01\xa4\xff\ +\xd7\x02l\x01\xa6\xff\xec\x02l\x01\xa8\xff\xd7\x02l\x01\ +\xaa\xff\xd7\x02l\x01\xae\xff\xd7\x02l\x01\xb0\xff\xd7\x02\ +l\x01\xb1\xff\xec\x02l\x01\xb5\xff\xd7\x02l\x01\xbc\xff\ +\xc3\x02l\x01\xbd\xff\xd7\x02l\x01\xbf\xff\xd7\x02l\x01\ +\xc1\xff\xd7\x02l\x01\xc4\xff\xec\x02l\x01\xc7\xff\xec\x02\ +l\x01\xce\xff\xec\x02l\x01\xd5\xff\xec\x02l\x01\xf2\xff\ +\xec\x02l\x02\x08\xff\xae\x02l\x02\x0c\xff\xae\x02l\x02\ +r\xff\xd7\x02l\x02s\xff\xec\x02l\x02z\xff\xec\x02\ +l\x02|\xff\xd7\x02l\x02\x80\xff\xec\x02l\x02\x82\xff\ +\xec\x02l\x02\x9f\xff\xd7\x02l\x02\xa1\xff\xec\x02l\x02\ +\xa9\xff\xec\x02l\x02\xb5\xff\xc3\x02l\x02\xb7\xff\xec\x02\ +l\x02\xb9\xff\xec\x02l\x02\xbb\xff\xd7\x02l\x02\xbd\xff\ +\xec\x02l\x02\xbf\xff\xd7\x02l\x02\xc1\xff\xd7\x02l\x02\ +\xca\xff\xd7\x02l\x02\xce\xff\xd7\x02l\x02\xcf\xff\xec\x02\ +l\x02\xd4\xff\xd7\x02l\x02\xd9\xff\xd7\x02l\x02\xdb\xff\ +\xd7\x02l\x02\xdd\xff\xd7\x02l\x02\xe5\xff\xd7\x02l\x02\ +\xe7\xff\xec\x02l\x02\xf5\xff\xec\x02l\x02\xf7\xff\xd7\x02\ +l\x02\xf9\xff\xd7\x02l\x02\xfb\xff\xd7\x02l\x02\xfd\xff\ +\xd7\x02l\x03\x05\xff\xd7\x02l\x03\x07\xff\xd7\x02l\x03\ +\x0d\xff\xd7\x02l\x03\x0f\xff\xd7\x02l\x03\x11\xff\xd7\x02\ +l\x03\x12\xff\xec\x02l\x03\x17\xff\xec\x02l\x03\x1b\xff\ +\xd7\x02l\x03\x1c\xff\xec\x02m\x00\x0f\xff\xae\x02m\x00\ +\x11\xff\xae\x02m\x01\xce\xff\xd7\x02m\x01\xd5\xff\xd7\x02\ +m\x01\xf2\xff\xd7\x02m\x02\x08\xff\xae\x02m\x02\x0c\xff\ +\xae\x02m\x02s\xff\xd7\x02m\x02\xcf\xff\xd7\x02m\x03\ +\x12\xff\xd7\x02m\x03\x1c\xff\xd7\x02n\x00\x05\xff\xae\x02\ +n\x00\x0a\xff\xae\x02n\x01\x9d\xff\xd7\x02n\x01\xa6\xff\ +\xd7\x02n\x01\xbc\xff\xae\x02n\x01\xc1\xff\xae\x02n\x01\ +\xc4\xff\xd7\x02n\x01\xdc\xff\xd7\x02n\x01\xe4\xff\xd7\x02\ +n\x02\x07\xff\xae\x02n\x02\x0b\xff\xae\x02n\x02|\xff\ +\xae\x02n\x02\x80\xff\xc3\x02n\x02\x82\xff\xc3\x02n\x02\ +\xa9\xff\xd7\x02n\x02\xaa\xff\xd7\x02n\x02\xb5\xff\xae\x02\ +n\x02\xb6\xff\xd7\x02n\x02\xb7\xff\xc3\x02n\x02\xb9\xff\ +\xc3\x02n\x02\xbd\xff\xd7\x02n\x02\xbe\xff\xd7\x02n\x02\ +\xbf\xff\xae\x02n\x02\xc1\xff\xae\x02n\x02\xd4\xff\xae\x02\ +n\x02\xfd\xff\xae\x02n\x03\x0d\xff\x9a\x02n\x03\x0f\xff\ +\x9a\x02n\x03\x17\xff\xd7\x02n\x03\x18\xff\xd7\x02o\x00\ +\x05\xff\x85\x02o\x00\x0a\xff\x85\x02o\x01\xd0\xff\xd7\x02\ +o\x01\xdc\xff\x9a\x02o\x01\xdd\xff\xc3\x02o\x01\xdf\xff\ +\xd7\x02o\x01\xe1\xff\xae\x02o\x01\xe4\xff\x9a\x02o\x01\ +\xf6\xff\xc3\x02o\x02\x07\xff\x85\x02o\x02\x0b\xff\x85\x02\ +o\x02m\xff\xd7\x02o\x02\x81\xff\xd7\x02o\x02\x83\xff\ +\xd7\x02o\x02\x8b\xff\xd7\x02o\x02\xa0\xff\xd7\x02o\x02\ +\xaa\xff\x9a\x02o\x02\xb6\xff\x9a\x02o\x02\xb8\xff\xc3\x02\ +o\x02\xba\xff\xc3\x02o\x02\xbc\xff\xd7\x02o\x02\xbe\xff\ +\x9a\x02o\x02\xc0\xff\xae\x02o\x02\xc2\xff\xae\x02o\x02\ +\xc6\xff\xd7\x02o\x02\xc8\xff\xd7\x02o\x02\xcb\xff\xd7\x02\ +o\x02\xd5\xff\xae\x02o\x02\xe6\xff\xd7\x02o\x02\xea\xff\ +\xd7\x02o\x02\xf8\xff\xc3\x02o\x02\xfa\xff\xc3\x02o\x02\ +\xfc\xff\xc3\x02o\x02\xfe\xff\xae\x02o\x03\x06\xff\xd7\x02\ +o\x03\x08\xff\xd7\x02o\x03\x0e\xff\x9a\x02o\x03\x10\xff\ +\x9a\x02o\x03\x18\xff\x9a\x02p\x01\x9f\xff\xd7\x02p\x01\ +\xb8\xff\xd7\x02p\x01\xbb\xff\xd7\x02p\x01\xbe\xff\xd7\x02\ +p\x01\xe1\xff\xd7\x02p\x02l\xff\xd7\x02p\x02~\xff\ +\xd7\x02p\x02\x84\xff\xd7\x02p\x02\x86\xff\xd7\x02p\x02\ +\x88\xff\xd7\x02p\x02\x8a\xff\xd7\x02p\x02\x8c\xff\xd7\x02\ +p\x02\xb1\xff\xd7\x02p\x02\xb3\xff\xd7\x02p\x02\xc0\xff\ +\xd7\x02p\x02\xc2\xff\xd7\x02p\x02\xc5\xff\xd7\x02p\x02\ +\xc7\xff\xd7\x02p\x02\xd5\xff\xd7\x02p\x02\xef\xff\xd7\x02\ +p\x02\xf1\xff\xd7\x02p\x02\xf3\xff\xd7\x02p\x02\xfe\xff\ +\xd7\x02p\x03\x09\xff\xd7\x02p\x03\x0b\xff\xd7\x02p\x03\ +\x0e\xff\xd7\x02p\x03\x10\xff\xd7\x02p\x03\x15\xff\xd7\x02\ +r\x00\x05\xffq\x02r\x00\x0a\xffq\x02r\x01\x9d\xff\ +\x9a\x02r\x01\xa6\xff\x9a\x02r\x01\xbc\xffq\x02r\x01\ +\xbe\xff\xd7\x02r\x01\xc1\xff\x9a\x02r\x01\xc4\xff\x9a\x02\ +r\x01\xdc\xff\xd7\x02r\x01\xe1\xff\xd7\x02r\x01\xe4\xff\ +\xd7\x02r\x02\x07\xffq\x02r\x02\x0b\xffq\x02r\x02\ +n\xff\xd7\x02r\x02|\xff\x9a\x02r\x02\x80\xff\xae\x02\ +r\x02\x82\xff\xae\x02r\x02\x97\xff\xd7\x02r\x02\x9b\xff\ +\xd7\x02r\x02\xa7\xff\xd7\x02r\x02\xa9\xff\x9a\x02r\x02\ +\xaa\xff\xd7\x02r\x02\xb5\xffq\x02r\x02\xb6\xff\xd7\x02\ +r\x02\xb7\xff\x85\x02r\x02\xb9\xff\x85\x02r\x02\xbd\xff\ +\x9a\x02r\x02\xbe\xff\xd7\x02r\x02\xbf\xff\x9a\x02r\x02\ +\xc0\xff\xd7\x02r\x02\xc1\xff\x9a\x02r\x02\xc2\xff\xd7\x02\ +r\x02\xc5\xff\x9a\x02r\x02\xc7\xff\x9a\x02r\x02\xd4\xff\ +\x9a\x02r\x02\xd5\xff\xd7\x02r\x02\xe1\xff\xd7\x02r\x02\ +\xe3\xff\xd7\x02r\x02\xfd\xff\x9a\x02r\x02\xfe\xff\xd7\x02\ +r\x03\x03\xff\xd7\x02r\x03\x0d\xffq\x02r\x03\x0e\xff\ +\xd7\x02r\x03\x0f\xffq\x02r\x03\x10\xff\xd7\x02r\x03\ +\x17\xff\x9a\x02r\x03\x18\xff\xd7\x02s\x00\x05\xffq\x02\ +s\x00\x0a\xffq\x02s\x01\xcf\xff\xd7\x02s\x01\xd8\xff\ +\xd7\x02s\x01\xdb\xff\xd7\x02s\x01\xdc\xff\x9a\x02s\x01\ +\xdd\xff\xc3\x02s\x01\xde\xff\xd7\x02s\x01\xe1\xff\xc3\x02\ +s\x01\xe4\xff\x9a\x02s\x01\xea\xff\xd7\x02s\x01\xed\xff\ +\xd7\x02s\x01\xf6\xff\xc3\x02s\x02\x07\xffq\x02s\x02\ +\x0b\xffq\x02s\x02j\xff\xd7\x02s\x02m\xff\xd7\x02\ +s\x02}\xff\xec\x02s\x02\x7f\xff\xd7\x02s\x02\x81\xff\ +\xd7\x02s\x02\x83\xff\xd7\x02s\x02\x85\xff\xd7\x02s\x02\ +\x87\xff\xd7\x02s\x02\x89\xff\xd7\x02s\x02\x8b\xff\xd7\x02\ +s\x02\x8d\xff\xd7\x02s\x02\xaa\xff\x9a\x02s\x02\xb2\xff\ +\xd7\x02s\x02\xb4\xff\xd7\x02s\x02\xb6\xff\x9a\x02s\x02\ +\xb8\xff\xd7\x02s\x02\xba\xff\xd7\x02s\x02\xbe\xff\x9a\x02\ +s\x02\xc0\xff\xc3\x02s\x02\xc2\xff\xc3\x02s\x02\xc6\xff\ +\xd7\x02s\x02\xc8\xff\xd7\x02s\x02\xd5\xff\xc3\x02s\x02\ +\xe0\xff\xd7\x02s\x02\xf0\xff\xd7\x02s\x02\xf2\xff\xd7\x02\ +s\x02\xf4\xff\xd7\x02s\x02\xf8\xff\xc3\x02s\x02\xfa\xff\ +\xc3\x02s\x02\xfc\xff\xc3\x02s\x02\xfe\xff\xc3\x02s\x03\ +\x0a\xff\xd7\x02s\x03\x0c\xff\xd7\x02s\x03\x0e\xff\x85\x02\ +s\x03\x10\xff\x85\x02s\x03\x16\xff\xd7\x02s\x03\x18\xff\ +\x9a\x02s\x03\x1a\xff\xd7\x02t\x00\x05\xffq\x02t\x00\ +\x0a\xffq\x02t\x01\x9d\xff\x9a\x02t\x01\xa6\xff\x9a\x02\ +t\x01\xbc\xffq\x02t\x01\xbe\xff\xd7\x02t\x01\xc1\xff\ +\x9a\x02t\x01\xc4\xff\x9a\x02t\x01\xdc\xff\xd7\x02t\x01\ +\xe1\xff\xd7\x02t\x01\xe4\xff\xd7\x02t\x02\x07\xffq\x02\ +t\x02\x0b\xffq\x02t\x02n\xff\xd7\x02t\x02|\xff\ +\x9a\x02t\x02\x80\xff\xae\x02t\x02\x82\xff\xae\x02t\x02\ +\x97\xff\xd7\x02t\x02\x9b\xff\xd7\x02t\x02\xa7\xff\xd7\x02\ +t\x02\xa9\xff\x9a\x02t\x02\xaa\xff\xd7\x02t\x02\xb5\xff\ +q\x02t\x02\xb6\xff\xd7\x02t\x02\xb7\xff\x85\x02t\x02\ +\xb9\xff\x85\x02t\x02\xbd\xff\x9a\x02t\x02\xbe\xff\xd7\x02\ +t\x02\xbf\xff\x9a\x02t\x02\xc0\xff\xd7\x02t\x02\xc1\xff\ +\x9a\x02t\x02\xc2\xff\xd7\x02t\x02\xc5\xff\x9a\x02t\x02\ +\xc7\xff\x9a\x02t\x02\xd4\xff\x9a\x02t\x02\xd5\xff\xd7\x02\ +t\x02\xe1\xff\xd7\x02t\x02\xe3\xff\xd7\x02t\x02\xfd\xff\ +\x9a\x02t\x02\xfe\xff\xd7\x02t\x03\x03\xff\xd7\x02t\x03\ +\x0d\xffq\x02t\x03\x0e\xff\xd7\x02t\x03\x0f\xffq\x02\ +t\x03\x10\xff\xd7\x02t\x03\x17\xff\x9a\x02t\x03\x18\xff\ +\xd7\x02u\x00\x05\xffq\x02u\x00\x0a\xffq\x02u\x01\ +\xcf\xff\xd7\x02u\x01\xd8\xff\xd7\x02u\x01\xdb\xff\xd7\x02\ +u\x01\xdc\xff\x9a\x02u\x01\xdd\xff\xc3\x02u\x01\xde\xff\ +\xd7\x02u\x01\xe1\xff\xc3\x02u\x01\xe4\xff\x9a\x02u\x01\ +\xea\xff\xd7\x02u\x01\xed\xff\xd7\x02u\x01\xf6\xff\xc3\x02\ +u\x02\x07\xffq\x02u\x02\x0b\xffq\x02u\x02j\xff\ +\xd7\x02u\x02m\xff\xd7\x02u\x02}\xff\xec\x02u\x02\ +\x7f\xff\xd7\x02u\x02\x81\xff\xd7\x02u\x02\x83\xff\xd7\x02\ +u\x02\x85\xff\xd7\x02u\x02\x87\xff\xd7\x02u\x02\x89\xff\ +\xd7\x02u\x02\x8b\xff\xd7\x02u\x02\x8d\xff\xd7\x02u\x02\ +\xaa\xff\x9a\x02u\x02\xb2\xff\xd7\x02u\x02\xb4\xff\xd7\x02\ +u\x02\xb6\xff\x9a\x02u\x02\xb8\xff\xd7\x02u\x02\xba\xff\ +\xd7\x02u\x02\xbe\xff\x9a\x02u\x02\xc0\xff\xc3\x02u\x02\ +\xc2\xff\xc3\x02u\x02\xc6\xff\xd7\x02u\x02\xc8\xff\xd7\x02\ +u\x02\xd5\xff\xc3\x02u\x02\xe0\xff\xd7\x02u\x02\xf0\xff\ +\xd7\x02u\x02\xf2\xff\xd7\x02u\x02\xf4\xff\xd7\x02u\x02\ +\xf8\xff\xc3\x02u\x02\xfa\xff\xc3\x02u\x02\xfc\xff\xc3\x02\ +u\x02\xfe\xff\xc3\x02u\x03\x0a\xff\xd7\x02u\x03\x0c\xff\ +\xd7\x02u\x03\x0e\xff\x85\x02u\x03\x10\xff\x85\x02u\x03\ +\x16\xff\xd7\x02u\x03\x18\xff\x9a\x02u\x03\x1a\xff\xd7\x02\ +v\x03\x0d\xff\xec\x02v\x03\x0f\xff\xec\x02x\x03\x0d\xff\ +\xec\x02x\x03\x0f\xff\xec\x02z\x00\x0f\xff\xae\x02z\x00\ +\x11\xff\xae\x02z\x02\x08\xff\xae\x02z\x02\x0c\xff\xae\x02\ +z\x02\x80\xff\xec\x02z\x02\x82\xff\xec\x02z\x02\xb7\xff\ +\xec\x02z\x02\xb9\xff\xec\x02z\x03\x0d\xff\xd7\x02z\x03\ +\x0f\xff\xd7\x02|\x00\x0f\xffq\x02|\x00\x11\xffq\x02\ +|\x01\xa4\xff\xc3\x02|\x01\xaa\xff\xae\x02|\x01\xae\xff\ +\xc3\x02|\x01\xb5\xff\xc3\x02|\x01\xce\xff\xd7\x02|\x01\ +\xd5\xff\xd7\x02|\x01\xf2\xff\xd7\x02|\x02\x08\xffq\x02\ +|\x02\x0c\xffq\x02|\x02r\xff\xae\x02|\x02s\xff\ +\xd7\x02|\x02\xce\xff\xc3\x02|\x02\xcf\xff\xd7\x02|\x02\ +\xd9\xff\xae\x02|\x02\xdb\xff\xae\x02|\x02\xdd\xff\xae\x02\ +|\x03\x09\xff\xae\x02|\x03\x0b\xff\xae\x02|\x03\x11\xff\ +\xc3\x02|\x03\x12\xff\xd7\x02|\x03\x1b\xff\xc3\x02|\x03\ +\x1c\xff\xd7\x02}\x00\x05\xff\xec\x02}\x00\x0a\xff\xec\x02\ +}\x01\xd0\xff\xd7\x02}\x01\xdc\xff\xec\x02}\x01\xdd\xff\ +\xec\x02}\x01\xdf\xff\xd7\x02}\x01\xe1\xff\xec\x02}\x01\ +\xe4\xff\xec\x02}\x01\xf6\xff\xec\x02}\x02\x07\xff\xec\x02\ +}\x02\x0b\xff\xec\x02}\x02\xa0\xff\xd7\x02}\x02\xaa\xff\ +\xec\x02}\x02\xb6\xff\xec\x02}\x02\xbc\xff\xd7\x02}\x02\ +\xbe\xff\xec\x02}\x02\xc0\xff\xec\x02}\x02\xc2\xff\xec\x02\ +}\x02\xcb\xff\xd7\x02}\x02\xd5\xff\xec\x02}\x02\xe6\xff\ +\xd7\x02}\x02\xf8\xff\xec\x02}\x02\xfa\xff\xec\x02}\x02\ +\xfc\xff\xec\x02}\x02\xfe\xff\xec\x02}\x03\x06\xff\xd7\x02\ +}\x03\x08\xff\xd7\x02}\x03\x0e\xff\xec\x02}\x03\x10\xff\ +\xec\x02}\x03\x18\xff\xec\x02~\x00\x0f\xff\xae\x02~\x00\ +\x11\xff\xae\x02~\x01\x9d\xff\xec\x02~\x01\xa4\xff\xd7\x02\ +~\x01\xa6\xff\xec\x02~\x01\xa8\xff\xd7\x02~\x01\xaa\xff\ +\xd7\x02~\x01\xae\xff\xd7\x02~\x01\xb0\xff\xd7\x02~\x01\ +\xb1\xff\xec\x02~\x01\xb5\xff\xd7\x02~\x01\xbc\xff\xc3\x02\ +~\x01\xbd\xff\xd7\x02~\x01\xbf\xff\xd7\x02~\x01\xc1\xff\ +\xd7\x02~\x01\xc4\xff\xec\x02~\x01\xc7\xff\xec\x02~\x01\ +\xce\xff\xec\x02~\x01\xd5\xff\xec\x02~\x01\xf2\xff\xec\x02\ +~\x02\x08\xff\xae\x02~\x02\x0c\xff\xae\x02~\x02r\xff\ +\xd7\x02~\x02s\xff\xec\x02~\x02z\xff\xec\x02~\x02\ +|\xff\xd7\x02~\x02\x80\xff\xec\x02~\x02\x82\xff\xec\x02\ +~\x02\x9f\xff\xd7\x02~\x02\xa1\xff\xec\x02~\x02\xa9\xff\ +\xec\x02~\x02\xb5\xff\xc3\x02~\x02\xb7\xff\xec\x02~\x02\ +\xb9\xff\xec\x02~\x02\xbb\xff\xd7\x02~\x02\xbd\xff\xec\x02\ +~\x02\xbf\xff\xd7\x02~\x02\xc1\xff\xd7\x02~\x02\xca\xff\ +\xd7\x02~\x02\xce\xff\xd7\x02~\x02\xcf\xff\xec\x02~\x02\ +\xd4\xff\xd7\x02~\x02\xd9\xff\xd7\x02~\x02\xdb\xff\xd7\x02\ +~\x02\xdd\xff\xd7\x02~\x02\xe5\xff\xd7\x02~\x02\xe7\xff\ +\xec\x02~\x02\xf5\xff\xec\x02~\x02\xf7\xff\xd7\x02~\x02\ +\xf9\xff\xd7\x02~\x02\xfb\xff\xd7\x02~\x02\xfd\xff\xd7\x02\ +~\x03\x05\xff\xd7\x02~\x03\x07\xff\xd7\x02~\x03\x0d\xff\ +\xd7\x02~\x03\x0f\xff\xd7\x02~\x03\x11\xff\xd7\x02~\x03\ +\x12\xff\xec\x02~\x03\x17\xff\xec\x02~\x03\x1b\xff\xd7\x02\ +~\x03\x1c\xff\xec\x02\x7f\x00\x05\xff\xec\x02\x7f\x00\x0a\xff\ +\xec\x02\x7f\x01\xd0\xff\xd7\x02\x7f\x01\xdc\xff\xec\x02\x7f\x01\ +\xdd\xff\xec\x02\x7f\x01\xdf\xff\xd7\x02\x7f\x01\xe1\xff\xec\x02\ +\x7f\x01\xe4\xff\xec\x02\x7f\x01\xf6\xff\xec\x02\x7f\x02\x07\xff\ +\xec\x02\x7f\x02\x0b\xff\xec\x02\x7f\x02\xa0\xff\xd7\x02\x7f\x02\ +\xaa\xff\xec\x02\x7f\x02\xb6\xff\xec\x02\x7f\x02\xbc\xff\xd7\x02\ +\x7f\x02\xbe\xff\xec\x02\x7f\x02\xc0\xff\xec\x02\x7f\x02\xc2\xff\ +\xec\x02\x7f\x02\xcb\xff\xd7\x02\x7f\x02\xd5\xff\xec\x02\x7f\x02\ +\xe6\xff\xd7\x02\x7f\x02\xf8\xff\xec\x02\x7f\x02\xfa\xff\xec\x02\ +\x7f\x02\xfc\xff\xec\x02\x7f\x02\xfe\xff\xec\x02\x7f\x03\x06\xff\ +\xd7\x02\x7f\x03\x08\xff\xd7\x02\x7f\x03\x0e\xff\xec\x02\x7f\x03\ +\x10\xff\xec\x02\x7f\x03\x18\xff\xec\x02\x80\x00\x0f\xff\x85\x02\ +\x80\x00\x11\xff\x85\x02\x80\x01\x9f\xff\xec\x02\x80\x01\xa4\xff\ +\x9a\x02\x80\x01\xaa\xffq\x02\x80\x01\xae\xff\x9a\x02\x80\x01\ +\xb5\xff\x9a\x02\x80\x01\xb8\xff\xec\x02\x80\x01\xbb\xff\xec\x02\ +\x80\x01\xbe\xff\xc3\x02\x80\x01\xc9\xff\xec\x02\x80\x01\xce\xff\ +\xae\x02\x80\x01\xcf\xff\xd7\x02\x80\x01\xd5\xff\xae\x02\x80\x01\ +\xd8\xff\xd7\x02\x80\x01\xdb\xff\xd7\x02\x80\x01\xde\xff\xd7\x02\ +\x80\x01\xe1\xff\xd7\x02\x80\x01\xea\xff\xd7\x02\x80\x01\xeb\x00\ +f\x02\x80\x01\xed\xff\xd7\x02\x80\x01\xee\xff\xec\x02\x80\x01\ +\xf2\xff\xae\x02\x80\x01\xf4\x00f\x02\x80\x02\x08\xff\x85\x02\ +\x80\x02\x0c\xff\x85\x02\x80\x02j\xff\xd7\x02\x80\x02l\xff\ +\xec\x02\x80\x02r\xffq\x02\x80\x02s\xff\xae\x02\x80\x02\ +~\xff\xec\x02\x80\x02\x7f\xff\xd7\x02\x80\x02\x84\xff\xec\x02\ +\x80\x02\x85\xff\xd7\x02\x80\x02\x86\xff\xec\x02\x80\x02\x87\xff\ +\xd7\x02\x80\x02\x88\xff\xec\x02\x80\x02\x89\xff\xd7\x02\x80\x02\ +\x8a\xff\xec\x02\x80\x02\x8c\xff\xec\x02\x80\x02\x8d\xff\xd7\x02\ +\x80\x02\x98\x00f\x02\x80\x02\xa8\x00f\x02\x80\x02\xb1\xff\ +\xec\x02\x80\x02\xb2\xff\xd7\x02\x80\x02\xb3\xff\xec\x02\x80\x02\ +\xb4\xff\xd7\x02\x80\x02\xc0\xff\xd7\x02\x80\x02\xc2\xff\xd7\x02\ +\x80\x02\xc5\xff\xd7\x02\x80\x02\xc6\xff\xc3\x02\x80\x02\xc7\xff\ +\xd7\x02\x80\x02\xc8\xff\xc3\x02\x80\x02\xce\xff\x9a\x02\x80\x02\ +\xcf\xff\xae\x02\x80\x02\xd5\xff\xd7\x02\x80\x02\xd9\xffq\x02\ +\x80\x02\xdb\xffq\x02\x80\x02\xdd\xffq\x02\x80\x02\xe0\xff\ +\xd7\x02\x80\x02\xef\xff\xec\x02\x80\x02\xf0\xff\xd7\x02\x80\x02\ +\xf1\xff\xec\x02\x80\x02\xf2\xff\xd7\x02\x80\x02\xf3\xff\xec\x02\ +\x80\x02\xf4\xff\xd7\x02\x80\x02\xfe\xff\xd7\x02\x80\x03\x09\xff\ +q\x02\x80\x03\x0a\xff\xd7\x02\x80\x03\x0b\xffq\x02\x80\x03\ +\x0c\xff\xd7\x02\x80\x03\x11\xff\x9a\x02\x80\x03\x12\xff\xae\x02\ +\x80\x03\x15\xff\xec\x02\x80\x03\x16\xff\xd7\x02\x80\x03\x1a\xff\ +\xd7\x02\x80\x03\x1b\xff\x9a\x02\x80\x03\x1c\xff\xae\x02\x81\x00\ +\x0f\xff\xae\x02\x81\x00\x11\xff\xae\x02\x81\x01\xce\xff\xd7\x02\ +\x81\x01\xd5\xff\xd7\x02\x81\x01\xf2\xff\xd7\x02\x81\x02\x08\xff\ +\xae\x02\x81\x02\x0c\xff\xae\x02\x81\x02s\xff\xd7\x02\x81\x02\ +\xcf\xff\xd7\x02\x81\x03\x12\xff\xd7\x02\x81\x03\x1c\xff\xd7\x02\ +\x82\x00\x0f\xff\x85\x02\x82\x00\x11\xff\x85\x02\x82\x01\x9f\xff\ +\xec\x02\x82\x01\xa4\xff\x9a\x02\x82\x01\xaa\xffq\x02\x82\x01\ +\xae\xff\x9a\x02\x82\x01\xb5\xff\x9a\x02\x82\x01\xb8\xff\xec\x02\ +\x82\x01\xbb\xff\xec\x02\x82\x01\xbe\xff\xc3\x02\x82\x01\xc9\xff\ +\xec\x02\x82\x01\xce\xff\xae\x02\x82\x01\xcf\xff\xd7\x02\x82\x01\ +\xd5\xff\xae\x02\x82\x01\xd8\xff\xd7\x02\x82\x01\xdb\xff\xd7\x02\ +\x82\x01\xde\xff\xd7\x02\x82\x01\xe1\xff\xd7\x02\x82\x01\xea\xff\ +\xd7\x02\x82\x01\xeb\x00f\x02\x82\x01\xed\xff\xd7\x02\x82\x01\ +\xee\xff\xec\x02\x82\x01\xf2\xff\xae\x02\x82\x01\xf4\x00f\x02\ +\x82\x02\x08\xff\x85\x02\x82\x02\x0c\xff\x85\x02\x82\x02j\xff\ +\xd7\x02\x82\x02l\xff\xec\x02\x82\x02r\xffq\x02\x82\x02\ +s\xff\xae\x02\x82\x02~\xff\xec\x02\x82\x02\x7f\xff\xd7\x02\ +\x82\x02\x84\xff\xec\x02\x82\x02\x85\xff\xd7\x02\x82\x02\x86\xff\ +\xec\x02\x82\x02\x87\xff\xd7\x02\x82\x02\x88\xff\xec\x02\x82\x02\ +\x89\xff\xd7\x02\x82\x02\x8a\xff\xec\x02\x82\x02\x8c\xff\xec\x02\ +\x82\x02\x8d\xff\xd7\x02\x82\x02\x98\x00f\x02\x82\x02\xa8\x00\ +f\x02\x82\x02\xb1\xff\xec\x02\x82\x02\xb2\xff\xd7\x02\x82\x02\ +\xb3\xff\xec\x02\x82\x02\xb4\xff\xd7\x02\x82\x02\xc0\xff\xd7\x02\ +\x82\x02\xc2\xff\xd7\x02\x82\x02\xc5\xff\xd7\x02\x82\x02\xc6\xff\ +\xc3\x02\x82\x02\xc7\xff\xd7\x02\x82\x02\xc8\xff\xc3\x02\x82\x02\ +\xce\xff\x9a\x02\x82\x02\xcf\xff\xae\x02\x82\x02\xd5\xff\xd7\x02\ +\x82\x02\xd9\xffq\x02\x82\x02\xdb\xffq\x02\x82\x02\xdd\xff\ +q\x02\x82\x02\xe0\xff\xd7\x02\x82\x02\xef\xff\xec\x02\x82\x02\ +\xf0\xff\xd7\x02\x82\x02\xf1\xff\xec\x02\x82\x02\xf2\xff\xd7\x02\ +\x82\x02\xf3\xff\xec\x02\x82\x02\xf4\xff\xd7\x02\x82\x02\xfe\xff\ +\xd7\x02\x82\x03\x09\xffq\x02\x82\x03\x0a\xff\xd7\x02\x82\x03\ +\x0b\xffq\x02\x82\x03\x0c\xff\xd7\x02\x82\x03\x11\xff\x9a\x02\ +\x82\x03\x12\xff\xae\x02\x82\x03\x15\xff\xec\x02\x82\x03\x16\xff\ +\xd7\x02\x82\x03\x1a\xff\xd7\x02\x82\x03\x1b\xff\x9a\x02\x82\x03\ +\x1c\xff\xae\x02\x83\x00\x0f\xff\xae\x02\x83\x00\x11\xff\xae\x02\ +\x83\x01\xce\xff\xd7\x02\x83\x01\xd5\xff\xd7\x02\x83\x01\xf2\xff\ +\xd7\x02\x83\x02\x08\xff\xae\x02\x83\x02\x0c\xff\xae\x02\x83\x02\ +s\xff\xd7\x02\x83\x02\xcf\xff\xd7\x02\x83\x03\x12\xff\xd7\x02\ +\x83\x03\x1c\xff\xd7\x02\x84\x00\x0f\xff\xae\x02\x84\x00\x11\xff\ +\xae\x02\x84\x01\xce\xff\xd7\x02\x84\x01\xd5\xff\xd7\x02\x84\x01\ +\xf2\xff\xd7\x02\x84\x02\x08\xff\xae\x02\x84\x02\x0c\xff\xae\x02\ +\x84\x02s\xff\xd7\x02\x84\x02\xcf\xff\xd7\x02\x84\x03\x12\xff\ +\xd7\x02\x84\x03\x1c\xff\xd7\x02\x85\x00\x0f\xff\xae\x02\x85\x00\ +\x11\xff\xae\x02\x85\x01\xce\xff\xd7\x02\x85\x01\xd5\xff\xd7\x02\ +\x85\x01\xf2\xff\xd7\x02\x85\x02\x08\xff\xae\x02\x85\x02\x0c\xff\ +\xae\x02\x85\x02s\xff\xd7\x02\x85\x02\xcf\xff\xd7\x02\x85\x03\ +\x12\xff\xd7\x02\x85\x03\x1c\xff\xd7\x02\x86\x00\x0f\xff\xae\x02\ +\x86\x00\x11\xff\xae\x02\x86\x01\x9d\xff\xec\x02\x86\x01\xa4\xff\ +\xd7\x02\x86\x01\xa6\xff\xec\x02\x86\x01\xa8\xff\xd7\x02\x86\x01\ +\xaa\xff\xd7\x02\x86\x01\xae\xff\xd7\x02\x86\x01\xb0\xff\xd7\x02\ +\x86\x01\xb1\xff\xec\x02\x86\x01\xb5\xff\xd7\x02\x86\x01\xbc\xff\ +\xc3\x02\x86\x01\xbd\xff\xd7\x02\x86\x01\xbf\xff\xd7\x02\x86\x01\ +\xc1\xff\xd7\x02\x86\x01\xc4\xff\xec\x02\x86\x01\xc7\xff\xec\x02\ +\x86\x01\xce\xff\xec\x02\x86\x01\xd5\xff\xec\x02\x86\x01\xf2\xff\ +\xec\x02\x86\x02\x08\xff\xae\x02\x86\x02\x0c\xff\xae\x02\x86\x02\ +r\xff\xd7\x02\x86\x02s\xff\xec\x02\x86\x02z\xff\xec\x02\ +\x86\x02|\xff\xd7\x02\x86\x02\x80\xff\xec\x02\x86\x02\x82\xff\ +\xec\x02\x86\x02\x9f\xff\xd7\x02\x86\x02\xa1\xff\xec\x02\x86\x02\ +\xa9\xff\xec\x02\x86\x02\xb5\xff\xc3\x02\x86\x02\xb7\xff\xec\x02\ +\x86\x02\xb9\xff\xec\x02\x86\x02\xbb\xff\xd7\x02\x86\x02\xbd\xff\ +\xec\x02\x86\x02\xbf\xff\xd7\x02\x86\x02\xc1\xff\xd7\x02\x86\x02\ +\xca\xff\xd7\x02\x86\x02\xce\xff\xd7\x02\x86\x02\xcf\xff\xec\x02\ +\x86\x02\xd4\xff\xd7\x02\x86\x02\xd9\xff\xd7\x02\x86\x02\xdb\xff\ +\xd7\x02\x86\x02\xdd\xff\xd7\x02\x86\x02\xe5\xff\xd7\x02\x86\x02\ +\xe7\xff\xec\x02\x86\x02\xf5\xff\xec\x02\x86\x02\xf7\xff\xd7\x02\ +\x86\x02\xf9\xff\xd7\x02\x86\x02\xfb\xff\xd7\x02\x86\x02\xfd\xff\ +\xd7\x02\x86\x03\x05\xff\xd7\x02\x86\x03\x07\xff\xd7\x02\x86\x03\ +\x0d\xff\xd7\x02\x86\x03\x0f\xff\xd7\x02\x86\x03\x11\xff\xd7\x02\ +\x86\x03\x12\xff\xec\x02\x86\x03\x17\xff\xec\x02\x86\x03\x1b\xff\ +\xd7\x02\x86\x03\x1c\xff\xec\x02\x87\x00\x05\xff\xec\x02\x87\x00\ +\x0a\xff\xec\x02\x87\x01\xd0\xff\xd7\x02\x87\x01\xdc\xff\xec\x02\ +\x87\x01\xdd\xff\xec\x02\x87\x01\xdf\xff\xd7\x02\x87\x01\xe1\xff\ +\xec\x02\x87\x01\xe4\xff\xec\x02\x87\x01\xf6\xff\xec\x02\x87\x02\ +\x07\xff\xec\x02\x87\x02\x0b\xff\xec\x02\x87\x02\xa0\xff\xd7\x02\ +\x87\x02\xaa\xff\xec\x02\x87\x02\xb6\xff\xec\x02\x87\x02\xbc\xff\ +\xd7\x02\x87\x02\xbe\xff\xec\x02\x87\x02\xc0\xff\xec\x02\x87\x02\ +\xc2\xff\xec\x02\x87\x02\xcb\xff\xd7\x02\x87\x02\xd5\xff\xec\x02\ +\x87\x02\xe6\xff\xd7\x02\x87\x02\xf8\xff\xec\x02\x87\x02\xfa\xff\ +\xec\x02\x87\x02\xfc\xff\xec\x02\x87\x02\xfe\xff\xec\x02\x87\x03\ +\x06\xff\xd7\x02\x87\x03\x08\xff\xd7\x02\x87\x03\x0e\xff\xec\x02\ +\x87\x03\x10\xff\xec\x02\x87\x03\x18\xff\xec\x02\x88\x00\x0f\xff\ +\xae\x02\x88\x00\x11\xff\xae\x02\x88\x01\x9d\xff\xec\x02\x88\x01\ +\xa4\xff\xd7\x02\x88\x01\xa6\xff\xec\x02\x88\x01\xa8\xff\xd7\x02\ +\x88\x01\xaa\xff\xd7\x02\x88\x01\xae\xff\xd7\x02\x88\x01\xb0\xff\ +\xd7\x02\x88\x01\xb1\xff\xec\x02\x88\x01\xb5\xff\xd7\x02\x88\x01\ +\xbc\xff\xc3\x02\x88\x01\xbd\xff\xd7\x02\x88\x01\xbf\xff\xd7\x02\ +\x88\x01\xc1\xff\xd7\x02\x88\x01\xc4\xff\xec\x02\x88\x01\xc7\xff\ +\xec\x02\x88\x01\xce\xff\xec\x02\x88\x01\xd5\xff\xec\x02\x88\x01\ +\xf2\xff\xec\x02\x88\x02\x08\xff\xae\x02\x88\x02\x0c\xff\xae\x02\ +\x88\x02r\xff\xd7\x02\x88\x02s\xff\xec\x02\x88\x02z\xff\ +\xec\x02\x88\x02|\xff\xd7\x02\x88\x02\x80\xff\xec\x02\x88\x02\ +\x82\xff\xec\x02\x88\x02\x9f\xff\xd7\x02\x88\x02\xa1\xff\xec\x02\ +\x88\x02\xa9\xff\xec\x02\x88\x02\xb5\xff\xc3\x02\x88\x02\xb7\xff\ +\xec\x02\x88\x02\xb9\xff\xec\x02\x88\x02\xbb\xff\xd7\x02\x88\x02\ +\xbd\xff\xec\x02\x88\x02\xbf\xff\xd7\x02\x88\x02\xc1\xff\xd7\x02\ +\x88\x02\xca\xff\xd7\x02\x88\x02\xce\xff\xd7\x02\x88\x02\xcf\xff\ +\xec\x02\x88\x02\xd4\xff\xd7\x02\x88\x02\xd9\xff\xd7\x02\x88\x02\ +\xdb\xff\xd7\x02\x88\x02\xdd\xff\xd7\x02\x88\x02\xe5\xff\xd7\x02\ +\x88\x02\xe7\xff\xec\x02\x88\x02\xf5\xff\xec\x02\x88\x02\xf7\xff\ +\xd7\x02\x88\x02\xf9\xff\xd7\x02\x88\x02\xfb\xff\xd7\x02\x88\x02\ +\xfd\xff\xd7\x02\x88\x03\x05\xff\xd7\x02\x88\x03\x07\xff\xd7\x02\ +\x88\x03\x0d\xff\xd7\x02\x88\x03\x0f\xff\xd7\x02\x88\x03\x11\xff\ +\xd7\x02\x88\x03\x12\xff\xec\x02\x88\x03\x17\xff\xec\x02\x88\x03\ +\x1b\xff\xd7\x02\x88\x03\x1c\xff\xec\x02\x89\x00\x05\xff\xec\x02\ +\x89\x00\x0a\xff\xec\x02\x89\x01\xd0\xff\xd7\x02\x89\x01\xdc\xff\ +\xec\x02\x89\x01\xdd\xff\xec\x02\x89\x01\xdf\xff\xd7\x02\x89\x01\ +\xe1\xff\xec\x02\x89\x01\xe4\xff\xec\x02\x89\x01\xf6\xff\xec\x02\ +\x89\x02\x07\xff\xec\x02\x89\x02\x0b\xff\xec\x02\x89\x02\xa0\xff\ +\xd7\x02\x89\x02\xaa\xff\xec\x02\x89\x02\xb6\xff\xec\x02\x89\x02\ +\xbc\xff\xd7\x02\x89\x02\xbe\xff\xec\x02\x89\x02\xc0\xff\xec\x02\ +\x89\x02\xc2\xff\xec\x02\x89\x02\xcb\xff\xd7\x02\x89\x02\xd5\xff\ +\xec\x02\x89\x02\xe6\xff\xd7\x02\x89\x02\xf8\xff\xec\x02\x89\x02\ +\xfa\xff\xec\x02\x89\x02\xfc\xff\xec\x02\x89\x02\xfe\xff\xec\x02\ +\x89\x03\x06\xff\xd7\x02\x89\x03\x08\xff\xd7\x02\x89\x03\x0e\xff\ +\xec\x02\x89\x03\x10\xff\xec\x02\x89\x03\x18\xff\xec\x02\x8a\x00\ +\x0f\xff\xae\x02\x8a\x00\x11\xff\xae\x02\x8a\x01\x9d\xff\xec\x02\ +\x8a\x01\xa4\xff\xd7\x02\x8a\x01\xa6\xff\xec\x02\x8a\x01\xa8\xff\ +\xd7\x02\x8a\x01\xaa\xff\xd7\x02\x8a\x01\xae\xff\xd7\x02\x8a\x01\ +\xb0\xff\xd7\x02\x8a\x01\xb1\xff\xec\x02\x8a\x01\xb5\xff\xd7\x02\ +\x8a\x01\xbc\xff\xc3\x02\x8a\x01\xbd\xff\xd7\x02\x8a\x01\xbf\xff\ +\xd7\x02\x8a\x01\xc1\xff\xd7\x02\x8a\x01\xc4\xff\xec\x02\x8a\x01\ +\xc7\xff\xec\x02\x8a\x01\xce\xff\xec\x02\x8a\x01\xd5\xff\xec\x02\ +\x8a\x01\xf2\xff\xec\x02\x8a\x02\x08\xff\xae\x02\x8a\x02\x0c\xff\ +\xae\x02\x8a\x02r\xff\xd7\x02\x8a\x02s\xff\xec\x02\x8a\x02\ +z\xff\xec\x02\x8a\x02|\xff\xd7\x02\x8a\x02\x80\xff\xec\x02\ +\x8a\x02\x82\xff\xec\x02\x8a\x02\x9f\xff\xd7\x02\x8a\x02\xa1\xff\ +\xec\x02\x8a\x02\xa9\xff\xec\x02\x8a\x02\xb5\xff\xc3\x02\x8a\x02\ +\xb7\xff\xec\x02\x8a\x02\xb9\xff\xec\x02\x8a\x02\xbb\xff\xd7\x02\ +\x8a\x02\xbd\xff\xec\x02\x8a\x02\xbf\xff\xd7\x02\x8a\x02\xc1\xff\ +\xd7\x02\x8a\x02\xca\xff\xd7\x02\x8a\x02\xce\xff\xd7\x02\x8a\x02\ +\xcf\xff\xec\x02\x8a\x02\xd4\xff\xd7\x02\x8a\x02\xd9\xff\xd7\x02\ +\x8a\x02\xdb\xff\xd7\x02\x8a\x02\xdd\xff\xd7\x02\x8a\x02\xe5\xff\ +\xd7\x02\x8a\x02\xe7\xff\xec\x02\x8a\x02\xf5\xff\xec\x02\x8a\x02\ +\xf7\xff\xd7\x02\x8a\x02\xf9\xff\xd7\x02\x8a\x02\xfb\xff\xd7\x02\ +\x8a\x02\xfd\xff\xd7\x02\x8a\x03\x05\xff\xd7\x02\x8a\x03\x07\xff\ +\xd7\x02\x8a\x03\x0d\xff\xd7\x02\x8a\x03\x0f\xff\xd7\x02\x8a\x03\ +\x11\xff\xd7\x02\x8a\x03\x12\xff\xec\x02\x8a\x03\x17\xff\xec\x02\ +\x8a\x03\x1b\xff\xd7\x02\x8a\x03\x1c\xff\xec\x02\x8b\x00\x0f\xff\ +\xae\x02\x8b\x00\x11\xff\xae\x02\x8b\x01\xce\xff\xd7\x02\x8b\x01\ +\xd5\xff\xd7\x02\x8b\x01\xf2\xff\xd7\x02\x8b\x02\x08\xff\xae\x02\ +\x8b\x02\x0c\xff\xae\x02\x8b\x02s\xff\xd7\x02\x8b\x02\xcf\xff\ +\xd7\x02\x8b\x03\x12\xff\xd7\x02\x8b\x03\x1c\xff\xd7\x02\x8c\x01\ +\x9f\xff\xd7\x02\x8c\x01\xb8\xff\xd7\x02\x8c\x01\xbb\xff\xd7\x02\ +\x8c\x01\xbe\xff\xd7\x02\x8c\x01\xe1\xff\xd7\x02\x8c\x02l\xff\ +\xd7\x02\x8c\x02~\xff\xd7\x02\x8c\x02\x84\xff\xd7\x02\x8c\x02\ +\x86\xff\xd7\x02\x8c\x02\x88\xff\xd7\x02\x8c\x02\x8a\xff\xd7\x02\ +\x8c\x02\x8c\xff\xd7\x02\x8c\x02\xb1\xff\xd7\x02\x8c\x02\xb3\xff\ +\xd7\x02\x8c\x02\xc0\xff\xd7\x02\x8c\x02\xc2\xff\xd7\x02\x8c\x02\ +\xc5\xff\xd7\x02\x8c\x02\xc7\xff\xd7\x02\x8c\x02\xd5\xff\xd7\x02\ +\x8c\x02\xef\xff\xd7\x02\x8c\x02\xf1\xff\xd7\x02\x8c\x02\xf3\xff\ +\xd7\x02\x8c\x02\xfe\xff\xd7\x02\x8c\x03\x09\xff\xd7\x02\x8c\x03\ +\x0b\xff\xd7\x02\x8c\x03\x0e\xff\xd7\x02\x8c\x03\x10\xff\xd7\x02\ +\x8c\x03\x15\xff\xd7\x02\x95\x01\xa3\x00\xe1\x02\x95\x02\xea\x00\ +)\x02\x95\x03\x0e\xff\xd7\x02\x95\x03\x10\xff\xd7\x02\x96\x00\ +\x05\xff\xec\x02\x96\x00\x0a\xff\xec\x02\x96\x02\x07\xff\xec\x02\ +\x96\x02\x0b\xff\xec\x02\x97\x00\x05\xff\xae\x02\x97\x00\x0a\xff\ +\xae\x02\x97\x01\x9d\xff\xd7\x02\x97\x01\xa6\xff\xd7\x02\x97\x01\ +\xbc\xff\xae\x02\x97\x01\xc1\xff\xae\x02\x97\x01\xc4\xff\xd7\x02\ +\x97\x01\xdc\xff\xd7\x02\x97\x01\xe4\xff\xd7\x02\x97\x02\x07\xff\ +\xae\x02\x97\x02\x0b\xff\xae\x02\x97\x02|\xff\xae\x02\x97\x02\ +\x80\xff\xc3\x02\x97\x02\x82\xff\xc3\x02\x97\x02\xa9\xff\xd7\x02\ +\x97\x02\xaa\xff\xd7\x02\x97\x02\xb5\xff\xae\x02\x97\x02\xb6\xff\ +\xd7\x02\x97\x02\xb7\xff\xc3\x02\x97\x02\xb9\xff\xc3\x02\x97\x02\ +\xbd\xff\xd7\x02\x97\x02\xbe\xff\xd7\x02\x97\x02\xbf\xff\xae\x02\ +\x97\x02\xc1\xff\xae\x02\x97\x02\xd4\xff\xae\x02\x97\x02\xfd\xff\ +\xae\x02\x97\x03\x0d\xff\x9a\x02\x97\x03\x0f\xff\x9a\x02\x97\x03\ +\x17\xff\xd7\x02\x97\x03\x18\xff\xd7\x02\x98\x00\x05\xff\x85\x02\ +\x98\x00\x0a\xff\x85\x02\x98\x01\xd0\xff\xd7\x02\x98\x01\xdc\xff\ +\x9a\x02\x98\x01\xdd\xff\xc3\x02\x98\x01\xdf\xff\xd7\x02\x98\x01\ +\xe1\xff\xae\x02\x98\x01\xe4\xff\x9a\x02\x98\x01\xf6\xff\xc3\x02\ +\x98\x02\x07\xff\x85\x02\x98\x02\x0b\xff\x85\x02\x98\x02m\xff\ +\xd7\x02\x98\x02\x81\xff\xd7\x02\x98\x02\x83\xff\xd7\x02\x98\x02\ +\x8b\xff\xd7\x02\x98\x02\xa0\xff\xd7\x02\x98\x02\xaa\xff\x9a\x02\ +\x98\x02\xb6\xff\x9a\x02\x98\x02\xb8\xff\xc3\x02\x98\x02\xba\xff\ +\xc3\x02\x98\x02\xbc\xff\xd7\x02\x98\x02\xbe\xff\x9a\x02\x98\x02\ +\xc0\xff\xae\x02\x98\x02\xc2\xff\xae\x02\x98\x02\xc6\xff\xd7\x02\ +\x98\x02\xc8\xff\xd7\x02\x98\x02\xcb\xff\xd7\x02\x98\x02\xd5\xff\ +\xae\x02\x98\x02\xe6\xff\xd7\x02\x98\x02\xea\xff\xd7\x02\x98\x02\ +\xf8\xff\xc3\x02\x98\x02\xfa\xff\xc3\x02\x98\x02\xfc\xff\xc3\x02\ +\x98\x02\xfe\xff\xae\x02\x98\x03\x06\xff\xd7\x02\x98\x03\x08\xff\ +\xd7\x02\x98\x03\x0e\xff\x9a\x02\x98\x03\x10\xff\x9a\x02\x98\x03\ +\x18\xff\x9a\x02\x99\x00\x0f\xfe\xf6\x02\x99\x00\x11\xfe\xf6\x02\ +\x99\x01\xa4\xff\x85\x02\x99\x01\xaa\xff\x9a\x02\x99\x01\xae\xff\ +\x85\x02\x99\x01\xb0\xff\xd7\x02\x99\x01\xb5\xff\x85\x02\x99\x01\ +\xbf\xff\xd7\x02\x99\x01\xce\xff\x9a\x02\x99\x01\xd5\xff\x9a\x02\ +\x99\x01\xf2\xff\x9a\x02\x99\x02\x08\xfe\xf6\x02\x99\x02\x0c\xfe\ +\xf6\x02\x99\x02r\xff\x9a\x02\x99\x02s\xff\x9a\x02\x99\x02\ +v\xff\xec\x02\x99\x02\x9f\xff\xd7\x02\x99\x02\xbb\xff\xd7\x02\ +\x99\x02\xca\xff\xd7\x02\x99\x02\xce\xff\x85\x02\x99\x02\xcf\xff\ +\x9a\x02\x99\x02\xd9\xff\x9a\x02\x99\x02\xdb\xff\x9a\x02\x99\x02\ +\xdd\xff\x9a\x02\x99\x02\xe5\xff\xd7\x02\x99\x03\x05\xff\xd7\x02\ +\x99\x03\x07\xff\xd7\x02\x99\x03\x09\xff\xae\x02\x99\x03\x0b\xff\ +\xae\x02\x99\x03\x11\xff\x85\x02\x99\x03\x12\xff\x9a\x02\x99\x03\ +\x1b\xff\x85\x02\x99\x03\x1c\xff\x9a\x02\x9a\x00\x05\xff\xec\x02\ +\x9a\x00\x0a\xff\xec\x02\x9a\x01\xd0\xff\xd7\x02\x9a\x01\xdc\xff\ +\xec\x02\x9a\x01\xdd\xff\xec\x02\x9a\x01\xdf\xff\xd7\x02\x9a\x01\ +\xe1\xff\xec\x02\x9a\x01\xe4\xff\xec\x02\x9a\x01\xf6\xff\xec\x02\ +\x9a\x02\x07\xff\xec\x02\x9a\x02\x0b\xff\xec\x02\x9a\x02\xa0\xff\ +\xd7\x02\x9a\x02\xaa\xff\xec\x02\x9a\x02\xb6\xff\xec\x02\x9a\x02\ +\xbc\xff\xd7\x02\x9a\x02\xbe\xff\xec\x02\x9a\x02\xc0\xff\xec\x02\ +\x9a\x02\xc2\xff\xec\x02\x9a\x02\xcb\xff\xd7\x02\x9a\x02\xd5\xff\ +\xec\x02\x9a\x02\xe6\xff\xd7\x02\x9a\x02\xf8\xff\xec\x02\x9a\x02\ +\xfa\xff\xec\x02\x9a\x02\xfc\xff\xec\x02\x9a\x02\xfe\xff\xec\x02\ +\x9a\x03\x06\xff\xd7\x02\x9a\x03\x08\xff\xd7\x02\x9a\x03\x0e\xff\ +\xec\x02\x9a\x03\x10\xff\xec\x02\x9a\x03\x18\xff\xec\x02\x9b\x00\ +\x0f\xff\x9a\x02\x9b\x00\x10\xff\xd7\x02\x9b\x00\x11\xff\x9a\x02\ +\x9b\x01\x9d\x00)\x02\x9b\x01\x9f\xff\xd7\x02\x9b\x01\xa4\xff\ +\xae\x02\x9b\x01\xa6\x00)\x02\x9b\x01\xaa\xff\x85\x02\x9b\x01\ +\xae\xff\xae\x02\x9b\x01\xb5\xff\xae\x02\x9b\x01\xb8\xff\xd7\x02\ +\x9b\x01\xbb\xff\xd7\x02\x9b\x01\xbc\x00)\x02\x9b\x01\xbe\xff\ +\xc3\x02\x9b\x01\xc4\x00)\x02\x9b\x01\xcc\xff\xc3\x02\x9b\x01\ +\xcd\xff\xc3\x02\x9b\x01\xce\xff\x9a\x02\x9b\x01\xcf\xff\xae\x02\ +\x9b\x01\xd0\xff\xd7\x02\x9b\x01\xd1\xff\xd7\x02\x9b\x01\xd2\xff\ +\xc3\x02\x9b\x01\xd3\xff\xc3\x02\x9b\x01\xd4\xff\xc3\x02\x9b\x01\ +\xd5\xff\x9a\x02\x9b\x01\xd6\xff\xc3\x02\x9b\x01\xd7\xff\xc3\x02\ +\x9b\x01\xd8\xff\xae\x02\x9b\x01\xd9\xff\xc3\x02\x9b\x01\xda\xff\ +\xc3\x02\x9b\x01\xdb\xff\xae\x02\x9b\x01\xde\xff\xae\x02\x9b\x01\ +\xdf\xff\xd7\x02\x9b\x01\xe0\xff\xc3\x02\x9b\x01\xe1\xff\x9a\x02\ +\x9b\x01\xe2\xff\xc3\x02\x9b\x01\xe3\xff\xc3\x02\x9b\x01\xe5\xff\ +\xc3\x02\x9b\x01\xe6\xff\xc3\x02\x9b\x01\xe7\xff\xd7\x02\x9b\x01\ +\xe8\xff\xc3\x02\x9b\x01\xea\xff\xae\x02\x9b\x01\xeb\x00)\x02\ +\x9b\x01\xec\xff\xc3\x02\x9b\x01\xed\xff\xae\x02\x9b\x01\xee\xff\ +\xc3\x02\x9b\x01\xf2\xff\x9a\x02\x9b\x01\xf3\xff\xc3\x02\x9b\x01\ +\xf4\x00)\x02\x9b\x01\xf5\xff\xc3\x02\x9b\x01\xf7\xff\xc3\x02\ +\x9b\x01\xf9\xff\xc3\x02\x9b\x02\x02\xff\xd7\x02\x9b\x02\x03\xff\ +\xd7\x02\x9b\x02\x04\xff\xd7\x02\x9b\x02\x08\xff\x9a\x02\x9b\x02\ +\x0c\xff\x9a\x02\x9b\x02j\xff\xae\x02\x9b\x02k\xff\xc3\x02\ +\x9b\x02l\xff\xd7\x02\x9b\x02q\xff\xc3\x02\x9b\x02r\xff\ +\x85\x02\x9b\x02s\xff\x9a\x02\x9b\x02u\xff\xc3\x02\x9b\x02\ +w\xff\xd7\x02\x9b\x02y\xff\xc3\x02\x9b\x02}\xff\xc3\x02\ +\x9b\x02~\xff\xd7\x02\x9b\x02\x7f\xff\xae\x02\x9b\x02\x84\xff\ +\xd7\x02\x9b\x02\x85\xff\xae\x02\x9b\x02\x86\xff\xd7\x02\x9b\x02\ +\x87\xff\xae\x02\x9b\x02\x88\xff\xd7\x02\x9b\x02\x89\xff\xae\x02\ +\x9b\x02\x8a\xff\xd7\x02\x9b\x02\x8c\xff\xd7\x02\x9b\x02\x8d\xff\ +\xae\x02\x9b\x02\x96\xff\xc3\x02\x9b\x02\x98\x00)\x02\x9b\x02\ +\x9a\xff\xc3\x02\x9b\x02\x9e\xff\xc3\x02\x9b\x02\xa0\xff\xd7\x02\ +\x9b\x02\xa2\xff\xd7\x02\x9b\x02\xa4\xff\xc3\x02\x9b\x02\xa6\xff\ +\xc3\x02\x9b\x02\xa8\x00)\x02\x9b\x02\xa9\x00)\x02\x9b\x02\ +\xac\xff\xc3\x02\x9b\x02\xae\xff\xc3\x02\x9b\x02\xb0\xff\xc3\x02\ +\x9b\x02\xb1\xff\xd7\x02\x9b\x02\xb2\xff\xae\x02\x9b\x02\xb3\xff\ +\xd7\x02\x9b\x02\xb4\xff\xae\x02\x9b\x02\xb5\x00)\x02\x9b\x02\ +\xbc\xff\xd7\x02\x9b\x02\xbd\x00)\x02\x9b\x02\xc0\xff\x9a\x02\ +\x9b\x02\xc2\xff\x9a\x02\x9b\x02\xc4\xff\xc3\x02\x9b\x02\xc5\xff\ +\xd7\x02\x9b\x02\xc6\xff\xc3\x02\x9b\x02\xc7\xff\xd7\x02\x9b\x02\ +\xc8\xff\xc3\x02\x9b\x02\xcb\xff\xd7\x02\x9b\x02\xcd\xff\xc3\x02\ +\x9b\x02\xce\xff\xae\x02\x9b\x02\xcf\xff\x9a\x02\x9b\x02\xd1\xff\ +\xc3\x02\x9b\x02\xd3\xff\xc3\x02\x9b\x02\xd5\xff\x9a\x02\x9b\x02\ +\xd7\xff\xc3\x02\x9b\x02\xd9\xff\x85\x02\x9b\x02\xdb\xff\x85\x02\ +\x9b\x02\xdd\xff\x85\x02\x9b\x02\xe0\xff\xae\x02\x9b\x02\xe6\xff\ +\xd7\x02\x9b\x02\xe8\xff\xd7\x02\x9b\x02\xec\xff\xc3\x02\x9b\x02\ +\xee\xff\xc3\x02\x9b\x02\xef\xff\xd7\x02\x9b\x02\xf0\xff\xae\x02\ +\x9b\x02\xf1\xff\xd7\x02\x9b\x02\xf2\xff\xae\x02\x9b\x02\xf3\xff\ +\xd7\x02\x9b\x02\xf4\xff\xae\x02\x9b\x02\xf6\xff\xd7\x02\x9b\x02\ +\xfe\xff\x9a\x02\x9b\x03\x00\xff\xc3\x02\x9b\x03\x02\xff\xc3\x02\ +\x9b\x03\x06\xff\xd7\x02\x9b\x03\x08\xff\xd7\x02\x9b\x03\x09\xff\ +\x9a\x02\x9b\x03\x0a\xff\xae\x02\x9b\x03\x0b\xff\x9a\x02\x9b\x03\ +\x0c\xff\xae\x02\x9b\x03\x0e\xff\xd7\x02\x9b\x03\x10\xff\xd7\x02\ +\x9b\x03\x11\xff\xae\x02\x9b\x03\x12\xff\x9a\x02\x9b\x03\x14\xff\ +\xc3\x02\x9b\x03\x15\xff\xd7\x02\x9b\x03\x16\xff\xae\x02\x9b\x03\ +\x17\x00)\x02\x9b\x03\x1a\xff\xae\x02\x9b\x03\x1b\xff\xae\x02\ +\x9b\x03\x1c\xff\x9a\x02\x9c\x00\x0f\xff\xc3\x02\x9c\x00\x11\xff\ +\xc3\x02\x9c\x01\xce\xff\xc3\x02\x9c\x01\xcf\xff\xd7\x02\x9c\x01\ +\xd5\xff\xc3\x02\x9c\x01\xd8\xff\xd7\x02\x9c\x01\xdb\xff\xd7\x02\ +\x9c\x01\xde\xff\xd7\x02\x9c\x01\xea\xff\xd7\x02\x9c\x01\xed\xff\ +\xd7\x02\x9c\x01\xf2\xff\xc3\x02\x9c\x02\x08\xff\xc3\x02\x9c\x02\ +\x0c\xff\xc3\x02\x9c\x02j\xff\xd7\x02\x9c\x02s\xff\xc3\x02\ +\x9c\x02\x7f\xff\xd7\x02\x9c\x02\x85\xff\xd7\x02\x9c\x02\x87\xff\ +\xd7\x02\x9c\x02\x89\xff\xd7\x02\x9c\x02\x8d\xff\xd7\x02\x9c\x02\ +\xb2\xff\xd7\x02\x9c\x02\xb4\xff\xd7\x02\x9c\x02\xcf\xff\xc3\x02\ +\x9c\x02\xe0\xff\xd7\x02\x9c\x02\xf0\xff\xd7\x02\x9c\x02\xf2\xff\ +\xd7\x02\x9c\x02\xf4\xff\xd7\x02\x9c\x03\x0a\xff\xd7\x02\x9c\x03\ +\x0c\xff\xd7\x02\x9c\x03\x12\xff\xc3\x02\x9c\x03\x16\xff\xd7\x02\ +\x9c\x03\x1a\xff\xd7\x02\x9c\x03\x1c\xff\xc3\x02\x9d\x00\x05\xff\ +\xc3\x02\x9d\x00\x0a\xff\xc3\x02\x9d\x01\x9d\xff\xc3\x02\x9d\x01\ +\xa3\x00f\x02\x9d\x01\xa6\xff\xc3\x02\x9d\x01\xbc\xff\xc3\x02\ +\x9d\x01\xc1\xff\xae\x02\x9d\x01\xc4\xff\xc3\x02\x9d\x01\xdc\xff\ +\xd7\x02\x9d\x01\xe1\xff\xd7\x02\x9d\x01\xe4\xff\xd7\x02\x9d\x02\ +\x07\xff\xc3\x02\x9d\x02\x0b\xff\xc3\x02\x9d\x02|\xff\xae\x02\ +\x9d\x02\x80\xff\xc3\x02\x9d\x02\x82\xff\xc3\x02\x9d\x02\xa9\xff\ +\xc3\x02\x9d\x02\xaa\xff\xd7\x02\x9d\x02\xb5\xff\xc3\x02\x9d\x02\ +\xb6\xff\xd7\x02\x9d\x02\xb7\xff\xd7\x02\x9d\x02\xb9\xff\xd7\x02\ +\x9d\x02\xbd\xff\xc3\x02\x9d\x02\xbe\xff\xd7\x02\x9d\x02\xbf\xff\ +\xae\x02\x9d\x02\xc0\xff\xd7\x02\x9d\x02\xc1\xff\xae\x02\x9d\x02\ +\xc2\xff\xd7\x02\x9d\x02\xd4\xff\xae\x02\x9d\x02\xd5\xff\xd7\x02\ +\x9d\x02\xfd\xff\xae\x02\x9d\x02\xfe\xff\xd7\x02\x9d\x03\x0d\xff\ +\xd7\x02\x9d\x03\x0e\xff\xc3\x02\x9d\x03\x0f\xff\xd7\x02\x9d\x03\ +\x10\xff\xc3\x02\x9d\x03\x17\xff\xc3\x02\x9d\x03\x18\xff\xd7\x02\ +\x9e\x00\x05\xff\xc3\x02\x9e\x00\x0a\xff\xc3\x02\x9e\x02\x07\xff\ +\xc3\x02\x9e\x02\x0b\xff\xc3\x02\x9e\x03\x0e\xff\xd7\x02\x9e\x03\ +\x10\xff\xd7\x02\x9f\x01\x9f\xff\xd7\x02\x9f\x01\xa3\x00\xe1\x02\ +\x9f\x01\xb8\xff\xd7\x02\x9f\x01\xbb\xff\xd7\x02\x9f\x01\xbe\xff\ +\xc3\x02\x9f\x01\xdc\xff\xd7\x02\x9f\x01\xe1\xff\xae\x02\x9f\x01\ +\xe4\xff\xd7\x02\x9f\x02l\xff\xd7\x02\x9f\x02{\x00=\x02\ +\x9f\x02}\xff\xec\x02\x9f\x02~\xff\xd7\x02\x9f\x02\x84\xff\ +\xd7\x02\x9f\x02\x86\xff\xd7\x02\x9f\x02\x88\xff\xd7\x02\x9f\x02\ +\x8a\xff\xd7\x02\x9f\x02\x8c\xff\xd7\x02\x9f\x02\xaa\xff\xd7\x02\ +\x9f\x02\xb1\xff\xd7\x02\x9f\x02\xb3\xff\xd7\x02\x9f\x02\xb6\xff\ +\xd7\x02\x9f\x02\xbe\xff\xd7\x02\x9f\x02\xc0\xff\xae\x02\x9f\x02\ +\xc2\xff\xae\x02\x9f\x02\xc5\xff\xc3\x02\x9f\x02\xc6\xff\xd7\x02\ +\x9f\x02\xc7\xff\xc3\x02\x9f\x02\xc8\xff\xd7\x02\x9f\x02\xd5\xff\ +\xae\x02\x9f\x02\xef\xff\xd7\x02\x9f\x02\xf1\xff\xd7\x02\x9f\x02\ +\xf3\xff\xd7\x02\x9f\x02\xfe\xff\xae\x02\x9f\x03\x0e\xff\xd7\x02\ +\x9f\x03\x10\xff\xd7\x02\x9f\x03\x15\xff\xd7\x02\x9f\x03\x18\xff\ +\xd7\x02\xa0\x01\xcf\xff\xec\x02\xa0\x01\xd8\xff\xec\x02\xa0\x01\ +\xdb\xff\xec\x02\xa0\x01\xde\xff\xec\x02\xa0\x01\xe1\xff\xec\x02\ +\xa0\x01\xea\xff\xec\x02\xa0\x01\xed\xff\xec\x02\xa0\x02j\xff\ +\xec\x02\xa0\x02\x7f\xff\xec\x02\xa0\x02\x85\xff\xec\x02\xa0\x02\ +\x87\xff\xec\x02\xa0\x02\x89\xff\xec\x02\xa0\x02\x8d\xff\xec\x02\ +\xa0\x02\xb2\xff\xec\x02\xa0\x02\xb4\xff\xec\x02\xa0\x02\xc0\xff\ +\xec\x02\xa0\x02\xc2\xff\xec\x02\xa0\x02\xd5\xff\xec\x02\xa0\x02\ +\xe0\xff\xec\x02\xa0\x02\xf0\xff\xec\x02\xa0\x02\xf2\xff\xec\x02\ +\xa0\x02\xf4\xff\xec\x02\xa0\x02\xfe\xff\xec\x02\xa0\x03\x0a\xff\ +\xec\x02\xa0\x03\x0c\xff\xec\x02\xa0\x03\x0e\xff\xd7\x02\xa0\x03\ +\x10\xff\xd7\x02\xa0\x03\x16\xff\xec\x02\xa0\x03\x1a\xff\xec\x02\ +\xa1\x00\x0f\xff\xae\x02\xa1\x00\x11\xff\xae\x02\xa1\x02\x08\xff\ +\xae\x02\xa1\x02\x0c\xff\xae\x02\xa1\x02\x80\xff\xec\x02\xa1\x02\ +\x82\xff\xec\x02\xa1\x02\xb7\xff\xec\x02\xa1\x02\xb9\xff\xec\x02\ +\xa1\x03\x0d\xff\xd7\x02\xa1\x03\x0f\xff\xd7\x02\xa2\x01\xe9\x00\ +)\x02\xa3\x01\x9f\xff\xd7\x02\xa3\x01\xa3\x00\xe1\x02\xa3\x01\ +\xb8\xff\xd7\x02\xa3\x01\xbb\xff\xd7\x02\xa3\x01\xbe\xff\xc3\x02\ +\xa3\x01\xdc\xff\xd7\x02\xa3\x01\xe1\xff\xae\x02\xa3\x01\xe4\xff\ +\xd7\x02\xa3\x02l\xff\xd7\x02\xa3\x02{\x00=\x02\xa3\x02\ +}\xff\xec\x02\xa3\x02~\xff\xd7\x02\xa3\x02\x84\xff\xd7\x02\ +\xa3\x02\x86\xff\xd7\x02\xa3\x02\x88\xff\xd7\x02\xa3\x02\x8a\xff\ +\xd7\x02\xa3\x02\x8c\xff\xd7\x02\xa3\x02\xaa\xff\xd7\x02\xa3\x02\ +\xb1\xff\xd7\x02\xa3\x02\xb3\xff\xd7\x02\xa3\x02\xb6\xff\xd7\x02\ +\xa3\x02\xbe\xff\xd7\x02\xa3\x02\xc0\xff\xae\x02\xa3\x02\xc2\xff\ +\xae\x02\xa3\x02\xc5\xff\xc3\x02\xa3\x02\xc6\xff\xd7\x02\xa3\x02\ +\xc7\xff\xc3\x02\xa3\x02\xc8\xff\xd7\x02\xa3\x02\xd5\xff\xae\x02\ +\xa3\x02\xef\xff\xd7\x02\xa3\x02\xf1\xff\xd7\x02\xa3\x02\xf3\xff\ +\xd7\x02\xa3\x02\xfe\xff\xae\x02\xa3\x03\x0e\xff\xd7\x02\xa3\x03\ +\x10\xff\xd7\x02\xa3\x03\x15\xff\xd7\x02\xa3\x03\x18\xff\xd7\x02\ +\xa4\x01\xcf\xff\xec\x02\xa4\x01\xd8\xff\xec\x02\xa4\x01\xdb\xff\ +\xec\x02\xa4\x01\xde\xff\xec\x02\xa4\x01\xe1\xff\xec\x02\xa4\x01\ +\xea\xff\xec\x02\xa4\x01\xed\xff\xec\x02\xa4\x02j\xff\xec\x02\ +\xa4\x02\x7f\xff\xec\x02\xa4\x02\x85\xff\xec\x02\xa4\x02\x87\xff\ +\xec\x02\xa4\x02\x89\xff\xec\x02\xa4\x02\x8d\xff\xec\x02\xa4\x02\ +\xb2\xff\xec\x02\xa4\x02\xb4\xff\xec\x02\xa4\x02\xc0\xff\xec\x02\ +\xa4\x02\xc2\xff\xec\x02\xa4\x02\xd5\xff\xec\x02\xa4\x02\xe0\xff\ +\xec\x02\xa4\x02\xf0\xff\xec\x02\xa4\x02\xf2\xff\xec\x02\xa4\x02\ +\xf4\xff\xec\x02\xa4\x02\xfe\xff\xec\x02\xa4\x03\x0a\xff\xec\x02\ +\xa4\x03\x0c\xff\xec\x02\xa4\x03\x0e\xff\xd7\x02\xa4\x03\x10\xff\ +\xd7\x02\xa4\x03\x16\xff\xec\x02\xa4\x03\x1a\xff\xec\x02\xa5\x01\ +\x9f\xff\xd7\x02\xa5\x01\xb8\xff\xd7\x02\xa5\x01\xbb\xff\xd7\x02\ +\xa5\x01\xbe\xff\xd7\x02\xa5\x01\xc1\xff\xd7\x02\xa5\x01\xe1\xff\ +\xd7\x02\xa5\x02l\xff\xd7\x02\xa5\x02|\xff\xd7\x02\xa5\x02\ +~\xff\xd7\x02\xa5\x02\x84\xff\xd7\x02\xa5\x02\x86\xff\xd7\x02\ +\xa5\x02\x88\xff\xd7\x02\xa5\x02\x8a\xff\xd7\x02\xa5\x02\x8c\xff\ +\xd7\x02\xa5\x02\xb1\xff\xd7\x02\xa5\x02\xb3\xff\xd7\x02\xa5\x02\ +\xbf\xff\xd7\x02\xa5\x02\xc0\xff\xd7\x02\xa5\x02\xc1\xff\xd7\x02\ +\xa5\x02\xc2\xff\xd7\x02\xa5\x02\xc5\xff\x9a\x02\xa5\x02\xc7\xff\ +\x9a\x02\xa5\x02\xd4\xff\xd7\x02\xa5\x02\xd5\xff\xd7\x02\xa5\x02\ +\xef\xff\xd7\x02\xa5\x02\xf1\xff\xd7\x02\xa5\x02\xf3\xff\xd7\x02\ +\xa5\x02\xfd\xff\xd7\x02\xa5\x02\xfe\xff\xd7\x02\xa5\x03\x09\xff\ +\xd7\x02\xa5\x03\x0b\xff\xd7\x02\xa5\x03\x0e\xff\xd7\x02\xa5\x03\ +\x10\xff\xd7\x02\xa5\x03\x15\xff\xd7\x02\xa5\x03\x19\xff\xec\x02\ +\xa6\x01\xcf\xff\xd7\x02\xa6\x01\xd8\xff\xd7\x02\xa6\x01\xdb\xff\ +\xd7\x02\xa6\x01\xde\xff\xd7\x02\xa6\x01\xe1\xff\xd7\x02\xa6\x01\ +\xea\xff\xd7\x02\xa6\x01\xed\xff\xd7\x02\xa6\x02j\xff\xd7\x02\ +\xa6\x02\x7f\xff\xd7\x02\xa6\x02\x85\xff\xd7\x02\xa6\x02\x87\xff\ +\xd7\x02\xa6\x02\x89\xff\xd7\x02\xa6\x02\x8d\xff\xd7\x02\xa6\x02\ +\xb2\xff\xd7\x02\xa6\x02\xb4\xff\xd7\x02\xa6\x02\xc0\xff\xd7\x02\ +\xa6\x02\xc2\xff\xd7\x02\xa6\x02\xc6\xff\xd7\x02\xa6\x02\xc8\xff\ +\xd7\x02\xa6\x02\xd5\xff\xd7\x02\xa6\x02\xe0\xff\xd7\x02\xa6\x02\ +\xf0\xff\xd7\x02\xa6\x02\xf2\xff\xd7\x02\xa6\x02\xf4\xff\xd7\x02\ +\xa6\x02\xfe\xff\xd7\x02\xa6\x03\x0a\xff\xd7\x02\xa6\x03\x0c\xff\ +\xd7\x02\xa6\x03\x16\xff\xd7\x02\xa6\x03\x1a\xff\xd7\x02\xa7\x01\ +\x9f\xff\xd7\x02\xa7\x01\xb8\xff\xd7\x02\xa7\x01\xbb\xff\xd7\x02\ +\xa7\x01\xbe\xff\xd7\x02\xa7\x01\xc1\xff\xd7\x02\xa7\x01\xe1\xff\ +\xd7\x02\xa7\x02l\xff\xd7\x02\xa7\x02|\xff\xd7\x02\xa7\x02\ +~\xff\xd7\x02\xa7\x02\x84\xff\xd7\x02\xa7\x02\x86\xff\xd7\x02\ +\xa7\x02\x88\xff\xd7\x02\xa7\x02\x8a\xff\xd7\x02\xa7\x02\x8c\xff\ +\xd7\x02\xa7\x02\xb1\xff\xd7\x02\xa7\x02\xb3\xff\xd7\x02\xa7\x02\ +\xbf\xff\xd7\x02\xa7\x02\xc0\xff\xd7\x02\xa7\x02\xc1\xff\xd7\x02\ +\xa7\x02\xc2\xff\xd7\x02\xa7\x02\xc5\xff\x9a\x02\xa7\x02\xc7\xff\ +\x9a\x02\xa7\x02\xd4\xff\xd7\x02\xa7\x02\xd5\xff\xd7\x02\xa7\x02\ +\xef\xff\xd7\x02\xa7\x02\xf1\xff\xd7\x02\xa7\x02\xf3\xff\xd7\x02\ +\xa7\x02\xfd\xff\xd7\x02\xa7\x02\xfe\xff\xd7\x02\xa7\x03\x09\xff\ +\xd7\x02\xa7\x03\x0b\xff\xd7\x02\xa7\x03\x0e\xff\xd7\x02\xa7\x03\ +\x10\xff\xd7\x02\xa7\x03\x15\xff\xd7\x02\xa7\x03\x19\xff\xec\x02\ +\xa8\x01\xcf\xff\xd7\x02\xa8\x01\xd8\xff\xd7\x02\xa8\x01\xdb\xff\ +\xd7\x02\xa8\x01\xde\xff\xd7\x02\xa8\x01\xe1\xff\xd7\x02\xa8\x01\ +\xea\xff\xd7\x02\xa8\x01\xed\xff\xd7\x02\xa8\x02j\xff\xd7\x02\ +\xa8\x02\x7f\xff\xd7\x02\xa8\x02\x85\xff\xd7\x02\xa8\x02\x87\xff\ +\xd7\x02\xa8\x02\x89\xff\xd7\x02\xa8\x02\x8d\xff\xd7\x02\xa8\x02\ +\xb2\xff\xd7\x02\xa8\x02\xb4\xff\xd7\x02\xa8\x02\xc0\xff\xd7\x02\ +\xa8\x02\xc2\xff\xd7\x02\xa8\x02\xc6\xff\xd7\x02\xa8\x02\xc8\xff\ +\xd7\x02\xa8\x02\xd5\xff\xd7\x02\xa8\x02\xe0\xff\xd7\x02\xa8\x02\ +\xf0\xff\xd7\x02\xa8\x02\xf2\xff\xd7\x02\xa8\x02\xf4\xff\xd7\x02\ +\xa8\x02\xfe\xff\xd7\x02\xa8\x03\x0a\xff\xd7\x02\xa8\x03\x0c\xff\ +\xd7\x02\xa8\x03\x16\xff\xd7\x02\xa8\x03\x1a\xff\xd7\x02\xa9\x01\ +\x9f\xff\xd7\x02\xa9\x01\xb8\xff\xd7\x02\xa9\x01\xbb\xff\xd7\x02\ +\xa9\x01\xbe\xff\xd7\x02\xa9\x01\xc1\xff\xd7\x02\xa9\x01\xe1\xff\ +\xd7\x02\xa9\x02l\xff\xd7\x02\xa9\x02|\xff\xd7\x02\xa9\x02\ +~\xff\xd7\x02\xa9\x02\x84\xff\xd7\x02\xa9\x02\x86\xff\xd7\x02\ +\xa9\x02\x88\xff\xd7\x02\xa9\x02\x8a\xff\xd7\x02\xa9\x02\x8c\xff\ +\xd7\x02\xa9\x02\xb1\xff\xd7\x02\xa9\x02\xb3\xff\xd7\x02\xa9\x02\ +\xbf\xff\xd7\x02\xa9\x02\xc0\xff\xd7\x02\xa9\x02\xc1\xff\xd7\x02\ +\xa9\x02\xc2\xff\xd7\x02\xa9\x02\xc5\xff\x9a\x02\xa9\x02\xc7\xff\ +\x9a\x02\xa9\x02\xd4\xff\xd7\x02\xa9\x02\xd5\xff\xd7\x02\xa9\x02\ +\xef\xff\xd7\x02\xa9\x02\xf1\xff\xd7\x02\xa9\x02\xf3\xff\xd7\x02\ +\xa9\x02\xfd\xff\xd7\x02\xa9\x02\xfe\xff\xd7\x02\xa9\x03\x09\xff\ +\xd7\x02\xa9\x03\x0b\xff\xd7\x02\xa9\x03\x0e\xff\xd7\x02\xa9\x03\ +\x10\xff\xd7\x02\xa9\x03\x15\xff\xd7\x02\xa9\x03\x19\xff\xec\x02\ +\xaa\x01\xcf\xff\xd7\x02\xaa\x01\xd8\xff\xd7\x02\xaa\x01\xdb\xff\ +\xd7\x02\xaa\x01\xde\xff\xd7\x02\xaa\x01\xe1\xff\xd7\x02\xaa\x01\ +\xea\xff\xd7\x02\xaa\x01\xed\xff\xd7\x02\xaa\x02j\xff\xd7\x02\ +\xaa\x02\x7f\xff\xd7\x02\xaa\x02\x85\xff\xd7\x02\xaa\x02\x87\xff\ +\xd7\x02\xaa\x02\x89\xff\xd7\x02\xaa\x02\x8d\xff\xd7\x02\xaa\x02\ +\xb2\xff\xd7\x02\xaa\x02\xb4\xff\xd7\x02\xaa\x02\xc0\xff\xd7\x02\ +\xaa\x02\xc2\xff\xd7\x02\xaa\x02\xc6\xff\xd7\x02\xaa\x02\xc8\xff\ +\xd7\x02\xaa\x02\xd5\xff\xd7\x02\xaa\x02\xe0\xff\xd7\x02\xaa\x02\ +\xf0\xff\xd7\x02\xaa\x02\xf2\xff\xd7\x02\xaa\x02\xf4\xff\xd7\x02\ +\xaa\x02\xfe\xff\xd7\x02\xaa\x03\x0a\xff\xd7\x02\xaa\x03\x0c\xff\ +\xd7\x02\xaa\x03\x16\xff\xd7\x02\xaa\x03\x1a\xff\xd7\x02\xab\x01\ +\xa3\x00\xe1\x02\xab\x02\xea\x00)\x02\xab\x03\x0e\xff\xd7\x02\ +\xab\x03\x10\xff\xd7\x02\xac\x00\x05\xff\xec\x02\xac\x00\x0a\xff\ +\xec\x02\xac\x02\x07\xff\xec\x02\xac\x02\x0b\xff\xec\x02\xad\x00\ +\x0f\xff\x9a\x02\xad\x00\x10\xff\xd7\x02\xad\x00\x11\xff\x9a\x02\ +\xad\x01\x9d\x00)\x02\xad\x01\x9f\xff\xd7\x02\xad\x01\xa4\xff\ +\xae\x02\xad\x01\xa6\x00)\x02\xad\x01\xaa\xff\x85\x02\xad\x01\ +\xae\xff\xae\x02\xad\x01\xb5\xff\xae\x02\xad\x01\xb8\xff\xd7\x02\ +\xad\x01\xbb\xff\xd7\x02\xad\x01\xbc\x00)\x02\xad\x01\xbe\xff\ +\xc3\x02\xad\x01\xc4\x00)\x02\xad\x01\xcc\xff\xc3\x02\xad\x01\ +\xcd\xff\xc3\x02\xad\x01\xce\xff\x9a\x02\xad\x01\xcf\xff\xae\x02\ +\xad\x01\xd0\xff\xd7\x02\xad\x01\xd1\xff\xd7\x02\xad\x01\xd2\xff\ +\xc3\x02\xad\x01\xd3\xff\xc3\x02\xad\x01\xd4\xff\xc3\x02\xad\x01\ +\xd5\xff\x9a\x02\xad\x01\xd6\xff\xc3\x02\xad\x01\xd7\xff\xc3\x02\ +\xad\x01\xd8\xff\xae\x02\xad\x01\xd9\xff\xc3\x02\xad\x01\xda\xff\ +\xc3\x02\xad\x01\xdb\xff\xae\x02\xad\x01\xde\xff\xae\x02\xad\x01\ +\xdf\xff\xd7\x02\xad\x01\xe0\xff\xc3\x02\xad\x01\xe1\xff\x9a\x02\ +\xad\x01\xe2\xff\xc3\x02\xad\x01\xe3\xff\xc3\x02\xad\x01\xe5\xff\ +\xc3\x02\xad\x01\xe6\xff\xc3\x02\xad\x01\xe7\xff\xd7\x02\xad\x01\ +\xe8\xff\xc3\x02\xad\x01\xea\xff\xae\x02\xad\x01\xeb\x00)\x02\ +\xad\x01\xec\xff\xc3\x02\xad\x01\xed\xff\xae\x02\xad\x01\xee\xff\ +\xc3\x02\xad\x01\xf2\xff\x9a\x02\xad\x01\xf3\xff\xc3\x02\xad\x01\ +\xf4\x00)\x02\xad\x01\xf5\xff\xc3\x02\xad\x01\xf7\xff\xc3\x02\ +\xad\x01\xf9\xff\xc3\x02\xad\x02\x02\xff\xd7\x02\xad\x02\x03\xff\ +\xd7\x02\xad\x02\x04\xff\xd7\x02\xad\x02\x08\xff\x9a\x02\xad\x02\ +\x0c\xff\x9a\x02\xad\x02j\xff\xae\x02\xad\x02k\xff\xc3\x02\ +\xad\x02l\xff\xd7\x02\xad\x02q\xff\xc3\x02\xad\x02r\xff\ +\x85\x02\xad\x02s\xff\x9a\x02\xad\x02u\xff\xc3\x02\xad\x02\ +w\xff\xd7\x02\xad\x02y\xff\xc3\x02\xad\x02}\xff\xc3\x02\ +\xad\x02~\xff\xd7\x02\xad\x02\x7f\xff\xae\x02\xad\x02\x84\xff\ +\xd7\x02\xad\x02\x85\xff\xae\x02\xad\x02\x86\xff\xd7\x02\xad\x02\ +\x87\xff\xae\x02\xad\x02\x88\xff\xd7\x02\xad\x02\x89\xff\xae\x02\ +\xad\x02\x8a\xff\xd7\x02\xad\x02\x8c\xff\xd7\x02\xad\x02\x8d\xff\ +\xae\x02\xad\x02\x96\xff\xc3\x02\xad\x02\x98\x00)\x02\xad\x02\ +\x9a\xff\xc3\x02\xad\x02\x9e\xff\xc3\x02\xad\x02\xa0\xff\xd7\x02\ +\xad\x02\xa2\xff\xd7\x02\xad\x02\xa4\xff\xc3\x02\xad\x02\xa6\xff\ +\xc3\x02\xad\x02\xa8\x00)\x02\xad\x02\xa9\x00)\x02\xad\x02\ +\xac\xff\xc3\x02\xad\x02\xae\xff\xc3\x02\xad\x02\xb0\xff\xc3\x02\ +\xad\x02\xb1\xff\xd7\x02\xad\x02\xb2\xff\xae\x02\xad\x02\xb3\xff\ +\xd7\x02\xad\x02\xb4\xff\xae\x02\xad\x02\xb5\x00)\x02\xad\x02\ +\xbc\xff\xd7\x02\xad\x02\xbd\x00)\x02\xad\x02\xc0\xff\x9a\x02\ +\xad\x02\xc2\xff\x9a\x02\xad\x02\xc4\xff\xc3\x02\xad\x02\xc5\xff\ +\xd7\x02\xad\x02\xc6\xff\xc3\x02\xad\x02\xc7\xff\xd7\x02\xad\x02\ +\xc8\xff\xc3\x02\xad\x02\xcb\xff\xd7\x02\xad\x02\xcd\xff\xc3\x02\ +\xad\x02\xce\xff\xae\x02\xad\x02\xcf\xff\x9a\x02\xad\x02\xd1\xff\ +\xc3\x02\xad\x02\xd3\xff\xc3\x02\xad\x02\xd5\xff\x9a\x02\xad\x02\ +\xd7\xff\xc3\x02\xad\x02\xd9\xff\x85\x02\xad\x02\xdb\xff\x85\x02\ +\xad\x02\xdd\xff\x85\x02\xad\x02\xe0\xff\xae\x02\xad\x02\xe6\xff\ +\xd7\x02\xad\x02\xe8\xff\xd7\x02\xad\x02\xec\xff\xc3\x02\xad\x02\ +\xee\xff\xc3\x02\xad\x02\xef\xff\xd7\x02\xad\x02\xf0\xff\xae\x02\ +\xad\x02\xf1\xff\xd7\x02\xad\x02\xf2\xff\xae\x02\xad\x02\xf3\xff\ +\xd7\x02\xad\x02\xf4\xff\xae\x02\xad\x02\xf6\xff\xd7\x02\xad\x02\ +\xfe\xff\x9a\x02\xad\x03\x00\xff\xc3\x02\xad\x03\x02\xff\xc3\x02\ +\xad\x03\x06\xff\xd7\x02\xad\x03\x08\xff\xd7\x02\xad\x03\x09\xff\ +\x9a\x02\xad\x03\x0a\xff\xae\x02\xad\x03\x0b\xff\x9a\x02\xad\x03\ +\x0c\xff\xae\x02\xad\x03\x0e\xff\xd7\x02\xad\x03\x10\xff\xd7\x02\ +\xad\x03\x11\xff\xae\x02\xad\x03\x12\xff\x9a\x02\xad\x03\x14\xff\ +\xc3\x02\xad\x03\x15\xff\xd7\x02\xad\x03\x16\xff\xae\x02\xad\x03\ +\x17\x00)\x02\xad\x03\x1a\xff\xae\x02\xad\x03\x1b\xff\xae\x02\ +\xad\x03\x1c\xff\x9a\x02\xae\x00\x0f\xff\x9a\x02\xae\x00\x10\xff\ +\xd7\x02\xae\x00\x11\xff\x9a\x02\xae\x01\xce\xff\xc3\x02\xae\x01\ +\xcf\xff\xec\x02\xae\x01\xd5\xff\xc3\x02\xae\x01\xd8\xff\xec\x02\ +\xae\x01\xdb\xff\xec\x02\xae\x01\xde\xff\xec\x02\xae\x01\xea\xff\ +\xec\x02\xae\x01\xed\xff\xec\x02\xae\x01\xf2\xff\xc3\x02\xae\x02\ +\x02\xff\xd7\x02\xae\x02\x03\xff\xd7\x02\xae\x02\x04\xff\xd7\x02\ +\xae\x02\x08\xff\x9a\x02\xae\x02\x0c\xff\x9a\x02\xae\x02j\xff\ +\xec\x02\xae\x02s\xff\xc3\x02\xae\x02\x7f\xff\xec\x02\xae\x02\ +\x85\xff\xec\x02\xae\x02\x87\xff\xec\x02\xae\x02\x89\xff\xec\x02\ +\xae\x02\x8d\xff\xec\x02\xae\x02\xb2\xff\xec\x02\xae\x02\xb4\xff\ +\xec\x02\xae\x02\xcf\xff\xc3\x02\xae\x02\xe0\xff\xec\x02\xae\x02\ +\xf0\xff\xec\x02\xae\x02\xf2\xff\xec\x02\xae\x02\xf4\xff\xec\x02\ +\xae\x03\x0a\xff\xec\x02\xae\x03\x0c\xff\xec\x02\xae\x03\x12\xff\ +\xc3\x02\xae\x03\x16\xff\xec\x02\xae\x03\x1a\xff\xec\x02\xae\x03\ +\x1c\xff\xc3\x02\xaf\x00\x05\xff\x5c\x02\xaf\x00\x0a\xff\x5c\x02\ +\xaf\x01\x9d\xff\x9a\x02\xaf\x01\xa3\x00f\x02\xaf\x01\xa6\xff\ +\x9a\x02\xaf\x01\xbc\xffH\x02\xaf\x01\xc1\xff\x85\x02\xaf\x01\ +\xc4\xff\x9a\x02\xaf\x01\xdc\xff\xae\x02\xaf\x01\xe1\xff\xd7\x02\ +\xaf\x01\xe4\xff\xae\x02\xaf\x02\x07\xff\x5c\x02\xaf\x02\x0b\xff\ +\x5c\x02\xaf\x02|\xff\x85\x02\xaf\x02\x80\xffq\x02\xaf\x02\ +\x82\xffq\x02\xaf\x02\xa9\xff\x9a\x02\xaf\x02\xaa\xff\xae\x02\ +\xaf\x02\xb5\xffH\x02\xaf\x02\xb6\xff\xae\x02\xaf\x02\xb7\xff\ +\x9a\x02\xaf\x02\xb9\xff\x9a\x02\xaf\x02\xbd\xff\x9a\x02\xaf\x02\ +\xbe\xff\xae\x02\xaf\x02\xbf\xff\x85\x02\xaf\x02\xc0\xff\xd7\x02\ +\xaf\x02\xc1\xff\x85\x02\xaf\x02\xc2\xff\xd7\x02\xaf\x02\xc5\xff\ +\xc3\x02\xaf\x02\xc6\xff\xd7\x02\xaf\x02\xc7\xff\xc3\x02\xaf\x02\ +\xc8\xff\xd7\x02\xaf\x02\xd4\xff\x85\x02\xaf\x02\xd5\xff\xd7\x02\ +\xaf\x02\xfd\xff\x85\x02\xaf\x02\xfe\xff\xd7\x02\xaf\x03\x0d\xff\ +H\x02\xaf\x03\x0e\xff\xae\x02\xaf\x03\x0f\xffH\x02\xaf\x03\ +\x10\xff\xae\x02\xaf\x03\x17\xff\x9a\x02\xaf\x03\x18\xff\xae\x02\ +\xb0\x00\x05\xffq\x02\xb0\x00\x0a\xffq\x02\xb0\x01\xdc\xff\ +\x9a\x02\xb0\x01\xe1\xff\xd7\x02\xb0\x01\xe4\xff\x9a\x02\xb0\x02\ +\x07\xffq\x02\xb0\x02\x0b\xffq\x02\xb0\x02m\xff\xd7\x02\ +\xb0\x02\x81\xff\xd7\x02\xb0\x02\x83\xff\xd7\x02\xb0\x02\x8b\xff\ +\xd7\x02\xb0\x02\xaa\xff\x9a\x02\xb0\x02\xb6\xff\x9a\x02\xb0\x02\ +\xb8\xff\xd7\x02\xb0\x02\xba\xff\xd7\x02\xb0\x02\xbe\xff\x9a\x02\ +\xb0\x02\xc0\xff\xd7\x02\xb0\x02\xc2\xff\xd7\x02\xb0\x02\xc6\xff\ +\xd7\x02\xb0\x02\xc8\xff\xd7\x02\xb0\x02\xd5\xff\xd7\x02\xb0\x02\ +\xfe\xff\xd7\x02\xb0\x03\x0e\xffq\x02\xb0\x03\x10\xffq\x02\ +\xb0\x03\x18\xff\x9a\x02\xb1\x01\x9d\xff\xd7\x02\xb1\x01\xa6\xff\ +\xd7\x02\xb1\x01\xbc\xff\xc3\x02\xb1\x01\xc4\xff\xd7\x02\xb1\x02\ +\x80\xff\xec\x02\xb1\x02\x82\xff\xec\x02\xb1\x02\xa9\xff\xd7\x02\ +\xb1\x02\xb5\xff\xc3\x02\xb1\x02\xb7\xff\xec\x02\xb1\x02\xb9\xff\ +\xec\x02\xb1\x02\xbd\xff\xd7\x02\xb1\x03\x0d\xff\xd7\x02\xb1\x03\ +\x0f\xff\xd7\x02\xb1\x03\x17\xff\xd7\x02\xb2\x00\x05\xff\xec\x02\ +\xb2\x00\x0a\xff\xec\x02\xb2\x01\xd0\xff\xd7\x02\xb2\x01\xdc\xff\ +\xec\x02\xb2\x01\xdd\xff\xec\x02\xb2\x01\xdf\xff\xd7\x02\xb2\x01\ +\xe1\xff\xec\x02\xb2\x01\xe4\xff\xec\x02\xb2\x01\xf6\xff\xec\x02\ +\xb2\x02\x07\xff\xec\x02\xb2\x02\x0b\xff\xec\x02\xb2\x02\xa0\xff\ +\xd7\x02\xb2\x02\xaa\xff\xec\x02\xb2\x02\xb6\xff\xec\x02\xb2\x02\ +\xbc\xff\xd7\x02\xb2\x02\xbe\xff\xec\x02\xb2\x02\xc0\xff\xec\x02\ +\xb2\x02\xc2\xff\xec\x02\xb2\x02\xcb\xff\xd7\x02\xb2\x02\xd5\xff\ +\xec\x02\xb2\x02\xe6\xff\xd7\x02\xb2\x02\xf8\xff\xec\x02\xb2\x02\ +\xfa\xff\xec\x02\xb2\x02\xfc\xff\xec\x02\xb2\x02\xfe\xff\xec\x02\ +\xb2\x03\x06\xff\xd7\x02\xb2\x03\x08\xff\xd7\x02\xb2\x03\x0e\xff\ +\xec\x02\xb2\x03\x10\xff\xec\x02\xb2\x03\x18\xff\xec\x02\xb3\x01\ +\x9f\xff\xd7\x02\xb3\x01\xb8\xff\xd7\x02\xb3\x01\xbb\xff\xd7\x02\ +\xb3\x01\xbe\xff\xd7\x02\xb3\x01\xe1\xff\xd7\x02\xb3\x02l\xff\ +\xd7\x02\xb3\x02~\xff\xd7\x02\xb3\x02\x84\xff\xd7\x02\xb3\x02\ +\x86\xff\xd7\x02\xb3\x02\x88\xff\xd7\x02\xb3\x02\x8a\xff\xd7\x02\ +\xb3\x02\x8c\xff\xd7\x02\xb3\x02\xb1\xff\xd7\x02\xb3\x02\xb3\xff\ +\xd7\x02\xb3\x02\xc0\xff\xd7\x02\xb3\x02\xc2\xff\xd7\x02\xb3\x02\ +\xc5\xff\xd7\x02\xb3\x02\xc7\xff\xd7\x02\xb3\x02\xd5\xff\xd7\x02\ +\xb3\x02\xef\xff\xd7\x02\xb3\x02\xf1\xff\xd7\x02\xb3\x02\xf3\xff\ +\xd7\x02\xb3\x02\xfe\xff\xd7\x02\xb3\x03\x09\xff\xd7\x02\xb3\x03\ +\x0b\xff\xd7\x02\xb3\x03\x0e\xff\xd7\x02\xb3\x03\x10\xff\xd7\x02\ +\xb3\x03\x15\xff\xd7\x02\xb5\x00\x0f\xff\x85\x02\xb5\x00\x10\xff\ +\xae\x02\xb5\x00\x11\xff\x85\x02\xb5\x01\x9f\xff\xd7\x02\xb5\x01\ +\xa4\xff\x9a\x02\xb5\x01\xaa\xffq\x02\xb5\x01\xae\xff\x9a\x02\ +\xb5\x01\xb5\xff\x9a\x02\xb5\x01\xb8\xff\xd7\x02\xb5\x01\xbb\xff\ +\xd7\x02\xb5\x01\xbc\x00)\x02\xb5\x01\xbe\xff\xae\x02\xb5\x01\ +\xcc\xff\x9a\x02\xb5\x01\xcd\xff\x9a\x02\xb5\x01\xce\xff\x85\x02\ +\xb5\x01\xcf\xffq\x02\xb5\x01\xd0\xff\xd7\x02\xb5\x01\xd1\xff\ +\xd7\x02\xb5\x01\xd2\xff\x9a\x02\xb5\x01\xd3\xff\x9a\x02\xb5\x01\ +\xd4\xff\x9a\x02\xb5\x01\xd5\xff\x85\x02\xb5\x01\xd6\xff\x9a\x02\ +\xb5\x01\xd7\xff\x9a\x02\xb5\x01\xd8\xffq\x02\xb5\x01\xd9\xff\ +\x9a\x02\xb5\x01\xda\xff\x9a\x02\xb5\x01\xdb\xffq\x02\xb5\x01\ +\xdc\xff\xae\x02\xb5\x01\xdd\xff\xae\x02\xb5\x01\xde\xffq\x02\ +\xb5\x01\xdf\xff\xd7\x02\xb5\x01\xe0\xff\x9a\x02\xb5\x01\xe1\xff\ +\x9a\x02\xb5\x01\xe2\xff\x9a\x02\xb5\x01\xe3\xff\x9a\x02\xb5\x01\ +\xe4\xff\xae\x02\xb5\x01\xe5\xff\x9a\x02\xb5\x01\xe6\xff\x9a\x02\ +\xb5\x01\xe7\xff\xd7\x02\xb5\x01\xe8\xff\x9a\x02\xb5\x01\xe9\xff\ +\xc3\x02\xb5\x01\xea\xffq\x02\xb5\x01\xec\xff\x9a\x02\xb5\x01\ +\xed\xffq\x02\xb5\x01\xee\xff\x85\x02\xb5\x01\xf2\xff\x85\x02\ +\xb5\x01\xf3\xff\x9a\x02\xb5\x01\xf5\xff\x9a\x02\xb5\x01\xf6\xff\ +\xae\x02\xb5\x01\xf7\xff\x9a\x02\xb5\x01\xf9\xff\x9a\x02\xb5\x02\ +\x02\xff\xae\x02\xb5\x02\x03\xff\xae\x02\xb5\x02\x04\xff\xae\x02\ +\xb5\x02\x08\xff\x85\x02\xb5\x02\x0c\xff\x85\x02\xb5\x02j\xff\ +q\x02\xb5\x02k\xff\x9a\x02\xb5\x02l\xff\xd7\x02\xb5\x02\ +m\xff\xd7\x02\xb5\x02q\xff\x9a\x02\xb5\x02r\xffq\x02\ +\xb5\x02s\xff\x85\x02\xb5\x02u\xff\x9a\x02\xb5\x02w\xff\ +\x9a\x02\xb5\x02y\xff\x9a\x02\xb5\x02}\xff\x9a\x02\xb5\x02\ +~\xff\xd7\x02\xb5\x02\x7f\xffq\x02\xb5\x02\x81\xff\xd7\x02\ +\xb5\x02\x83\xff\xd7\x02\xb5\x02\x84\xff\xd7\x02\xb5\x02\x85\xff\ +q\x02\xb5\x02\x86\xff\xd7\x02\xb5\x02\x87\xffq\x02\xb5\x02\ +\x88\xff\xd7\x02\xb5\x02\x89\xffq\x02\xb5\x02\x8a\xff\xd7\x02\ +\xb5\x02\x8b\xff\xd7\x02\xb5\x02\x8c\xff\xd7\x02\xb5\x02\x8d\xff\ +q\x02\xb5\x02\x96\xff\x9a\x02\xb5\x02\x9a\xff\x9a\x02\xb5\x02\ +\x9e\xff\x9a\x02\xb5\x02\xa0\xff\xd7\x02\xb5\x02\xa2\xff\xd7\x02\ +\xb5\x02\xa4\xff\x9a\x02\xb5\x02\xa6\xff\x9a\x02\xb5\x02\xaa\xff\ +\xae\x02\xb5\x02\xac\xff\x9a\x02\xb5\x02\xae\xff\x9a\x02\xb5\x02\ +\xb0\xff\x9a\x02\xb5\x02\xb1\xff\xd7\x02\xb5\x02\xb2\xffq\x02\ +\xb5\x02\xb3\xff\xd7\x02\xb5\x02\xb4\xffq\x02\xb5\x02\xb5\x00\ +)\x02\xb5\x02\xb6\xff\xae\x02\xb5\x02\xb8\xff\xae\x02\xb5\x02\ +\xba\xff\xae\x02\xb5\x02\xbc\xff\xd7\x02\xb5\x02\xbe\xff\xae\x02\ +\xb5\x02\xc0\xff\x9a\x02\xb5\x02\xc2\xff\x9a\x02\xb5\x02\xc4\xff\ +\x9a\x02\xb5\x02\xc5\xff\x9a\x02\xb5\x02\xc6\xffq\x02\xb5\x02\ +\xc7\xff\x9a\x02\xb5\x02\xc8\xffq\x02\xb5\x02\xcb\xff\xd7\x02\ +\xb5\x02\xcd\xff\x9a\x02\xb5\x02\xce\xff\x9a\x02\xb5\x02\xcf\xff\ +\x85\x02\xb5\x02\xd1\xff\x9a\x02\xb5\x02\xd3\xff\x9a\x02\xb5\x02\ +\xd5\xff\x9a\x02\xb5\x02\xd7\xff\x9a\x02\xb5\x02\xd9\xffq\x02\ +\xb5\x02\xdb\xffq\x02\xb5\x02\xdd\xffq\x02\xb5\x02\xe0\xff\ +q\x02\xb5\x02\xe6\xff\xd7\x02\xb5\x02\xe8\xff\xd7\x02\xb5\x02\ +\xea\xff\xc3\x02\xb5\x02\xec\xff\x9a\x02\xb5\x02\xee\xff\x9a\x02\ +\xb5\x02\xef\xff\xd7\x02\xb5\x02\xf0\xffq\x02\xb5\x02\xf1\xff\ +\xd7\x02\xb5\x02\xf2\xffq\x02\xb5\x02\xf3\xff\xd7\x02\xb5\x02\ +\xf4\xffq\x02\xb5\x02\xf6\xff\xd7\x02\xb5\x02\xf8\xff\xae\x02\ +\xb5\x02\xfa\xff\xae\x02\xb5\x02\xfc\xff\xae\x02\xb5\x02\xfe\xff\ +\x9a\x02\xb5\x03\x00\xff\x9a\x02\xb5\x03\x02\xff\x9a\x02\xb5\x03\ +\x06\xff\xd7\x02\xb5\x03\x08\xff\xd7\x02\xb5\x03\x09\xffq\x02\ +\xb5\x03\x0a\xffq\x02\xb5\x03\x0b\xffq\x02\xb5\x03\x0c\xff\ +q\x02\xb5\x03\x0e\xff\x9a\x02\xb5\x03\x10\xff\x9a\x02\xb5\x03\ +\x11\xff\x9a\x02\xb5\x03\x12\xff\x85\x02\xb5\x03\x14\xff\x9a\x02\ +\xb5\x03\x15\xff\xd7\x02\xb5\x03\x16\xffq\x02\xb5\x03\x18\xff\ +\xae\x02\xb5\x03\x1a\xffq\x02\xb5\x03\x1b\xff\x9a\x02\xb5\x03\ +\x1c\xff\x85\x02\xb6\x00\x0f\xff\x9a\x02\xb6\x00\x10\xff\xd7\x02\ +\xb6\x00\x11\xff\x9a\x02\xb6\x01\xce\xff\xc3\x02\xb6\x01\xcf\xff\ +\xec\x02\xb6\x01\xd5\xff\xc3\x02\xb6\x01\xd8\xff\xec\x02\xb6\x01\ +\xdb\xff\xec\x02\xb6\x01\xde\xff\xec\x02\xb6\x01\xea\xff\xec\x02\ +\xb6\x01\xed\xff\xec\x02\xb6\x01\xf2\xff\xc3\x02\xb6\x02\x02\xff\ +\xd7\x02\xb6\x02\x03\xff\xd7\x02\xb6\x02\x04\xff\xd7\x02\xb6\x02\ +\x08\xff\x9a\x02\xb6\x02\x0c\xff\x9a\x02\xb6\x02j\xff\xec\x02\ +\xb6\x02s\xff\xc3\x02\xb6\x02\x7f\xff\xec\x02\xb6\x02\x85\xff\ +\xec\x02\xb6\x02\x87\xff\xec\x02\xb6\x02\x89\xff\xec\x02\xb6\x02\ +\x8d\xff\xec\x02\xb6\x02\xb2\xff\xec\x02\xb6\x02\xb4\xff\xec\x02\ +\xb6\x02\xcf\xff\xc3\x02\xb6\x02\xe0\xff\xec\x02\xb6\x02\xf0\xff\ +\xec\x02\xb6\x02\xf2\xff\xec\x02\xb6\x02\xf4\xff\xec\x02\xb6\x03\ +\x0a\xff\xec\x02\xb6\x03\x0c\xff\xec\x02\xb6\x03\x12\xff\xc3\x02\ +\xb6\x03\x16\xff\xec\x02\xb6\x03\x1a\xff\xec\x02\xb6\x03\x1c\xff\ +\xc3\x02\xb7\x00\x0f\xff\x85\x02\xb7\x00\x11\xff\x85\x02\xb7\x01\ +\x9f\xff\xd7\x02\xb7\x01\xa4\xff\xae\x02\xb7\x01\xaa\xff\x85\x02\ +\xb7\x01\xae\xff\xae\x02\xb7\x01\xb5\xff\xae\x02\xb7\x01\xb8\xff\ +\xd7\x02\xb7\x01\xbb\xff\xd7\x02\xb7\x01\xbe\xff\xc3\x02\xb7\x01\ +\xca\xff\xae\x02\xb7\x01\xcc\xff\xc3\x02\xb7\x01\xcd\xff\xc3\x02\ +\xb7\x01\xce\xff\x9a\x02\xb7\x01\xcf\xff\x9a\x02\xb7\x01\xd2\xff\ +\xc3\x02\xb7\x01\xd3\xff\xc3\x02\xb7\x01\xd4\xff\xc3\x02\xb7\x01\ +\xd5\xff\x9a\x02\xb7\x01\xd6\xff\xc3\x02\xb7\x01\xd7\xff\xc3\x02\ +\xb7\x01\xd8\xff\x9a\x02\xb7\x01\xd9\xff\xc3\x02\xb7\x01\xda\xff\ +\xc3\x02\xb7\x01\xdb\xff\x9a\x02\xb7\x01\xde\xff\x9a\x02\xb7\x01\ +\xe0\xff\xc3\x02\xb7\x01\xe1\xff\xae\x02\xb7\x01\xe2\xff\xc3\x02\ +\xb7\x01\xe3\xff\xc3\x02\xb7\x01\xe5\xff\xc3\x02\xb7\x01\xe6\xff\ +\xc3\x02\xb7\x01\xe8\xff\xc3\x02\xb7\x01\xe9\xff\xd7\x02\xb7\x01\ +\xea\xff\x9a\x02\xb7\x01\xeb\x00)\x02\xb7\x01\xec\xff\xc3\x02\ +\xb7\x01\xed\xff\x9a\x02\xb7\x01\xee\xff\xae\x02\xb7\x01\xf2\xff\ +\x9a\x02\xb7\x01\xf3\xff\xc3\x02\xb7\x01\xf4\x00)\x02\xb7\x01\ +\xf5\xff\xc3\x02\xb7\x01\xf7\xff\xc3\x02\xb7\x01\xf9\xff\xc3\x02\ +\xb7\x02\x08\xff\x85\x02\xb7\x02\x0c\xff\x85\x02\xb7\x02j\xff\ +\x9a\x02\xb7\x02k\xff\xc3\x02\xb7\x02l\xff\xd7\x02\xb7\x02\ +q\xff\xc3\x02\xb7\x02r\xff\x85\x02\xb7\x02s\xff\x9a\x02\ +\xb7\x02u\xff\xc3\x02\xb7\x02w\xff\xd7\x02\xb7\x02y\xff\ +\xc3\x02\xb7\x02}\xff\xd7\x02\xb7\x02~\xff\xd7\x02\xb7\x02\ +\x7f\xff\x9a\x02\xb7\x02\x84\xff\xd7\x02\xb7\x02\x85\xff\x9a\x02\ +\xb7\x02\x86\xff\xd7\x02\xb7\x02\x87\xff\x9a\x02\xb7\x02\x88\xff\ +\xd7\x02\xb7\x02\x89\xff\x9a\x02\xb7\x02\x8a\xff\xd7\x02\xb7\x02\ +\x8c\xff\xd7\x02\xb7\x02\x8d\xff\x9a\x02\xb7\x02\x96\xff\xc3\x02\ +\xb7\x02\x98\x00)\x02\xb7\x02\x9a\xff\xc3\x02\xb7\x02\x9e\xff\ +\xc3\x02\xb7\x02\xa4\xff\xc3\x02\xb7\x02\xa6\xff\xc3\x02\xb7\x02\ +\xa8\x00)\x02\xb7\x02\xac\xff\xc3\x02\xb7\x02\xae\xff\xc3\x02\ +\xb7\x02\xb0\xff\xc3\x02\xb7\x02\xb1\xff\xd7\x02\xb7\x02\xb2\xff\ +\x9a\x02\xb7\x02\xb3\xff\xd7\x02\xb7\x02\xb4\xff\x9a\x02\xb7\x02\ +\xc0\xff\xae\x02\xb7\x02\xc2\xff\xae\x02\xb7\x02\xc4\xff\xc3\x02\ +\xb7\x02\xc6\xff\xae\x02\xb7\x02\xc8\xff\xae\x02\xb7\x02\xcd\xff\ +\xc3\x02\xb7\x02\xce\xff\xae\x02\xb7\x02\xcf\xff\x9a\x02\xb7\x02\ +\xd1\xff\xc3\x02\xb7\x02\xd3\xff\xc3\x02\xb7\x02\xd5\xff\xae\x02\ +\xb7\x02\xd7\xff\xc3\x02\xb7\x02\xd9\xff\x85\x02\xb7\x02\xda\xff\ +\xae\x02\xb7\x02\xdb\xff\x85\x02\xb7\x02\xdc\xff\xae\x02\xb7\x02\ +\xdd\xff\x85\x02\xb7\x02\xde\xff\xae\x02\xb7\x02\xe0\xff\x9a\x02\ +\xb7\x02\xe1\xff\xec\x02\xb7\x02\xe2\xff\xae\x02\xb7\x02\xe3\xff\ +\xec\x02\xb7\x02\xe4\xff\xae\x02\xb7\x02\xec\xff\xc3\x02\xb7\x02\ +\xee\xff\xc3\x02\xb7\x02\xef\xff\xd7\x02\xb7\x02\xf0\xff\x9a\x02\ +\xb7\x02\xf1\xff\xd7\x02\xb7\x02\xf2\xff\x9a\x02\xb7\x02\xf3\xff\ +\xd7\x02\xb7\x02\xf4\xff\x9a\x02\xb7\x02\xfe\xff\xae\x02\xb7\x03\ +\x00\xff\xc3\x02\xb7\x03\x02\xff\xc3\x02\xb7\x03\x09\xff\xae\x02\ +\xb7\x03\x0a\xff\x9a\x02\xb7\x03\x0b\xff\xae\x02\xb7\x03\x0c\xff\ +\x9a\x02\xb7\x03\x0e\xff\xd7\x02\xb7\x03\x10\xff\xd7\x02\xb7\x03\ +\x11\xff\xae\x02\xb7\x03\x12\xff\x9a\x02\xb7\x03\x14\xff\xc3\x02\ +\xb7\x03\x15\xff\xd7\x02\xb7\x03\x16\xff\x9a\x02\xb7\x03\x19\xff\ +\xec\x02\xb7\x03\x1a\xff\x9a\x02\xb7\x03\x1b\xff\xae\x02\xb7\x03\ +\x1c\xff\x9a\x02\xb8\x00\x0f\xff\xae\x02\xb8\x00\x11\xff\xae\x02\ +\xb8\x01\xce\xff\xec\x02\xb8\x01\xd5\xff\xec\x02\xb8\x01\xf2\xff\ +\xec\x02\xb8\x02\x08\xff\xae\x02\xb8\x02\x0c\xff\xae\x02\xb8\x02\ +s\xff\xec\x02\xb8\x02\xcf\xff\xec\x02\xb8\x03\x12\xff\xec\x02\ +\xb8\x03\x1c\xff\xec\x02\xb9\x00\x0f\xff\x85\x02\xb9\x00\x11\xff\ +\x85\x02\xb9\x01\x9f\xff\xd7\x02\xb9\x01\xa4\xff\xae\x02\xb9\x01\ +\xaa\xff\x85\x02\xb9\x01\xae\xff\xae\x02\xb9\x01\xb5\xff\xae\x02\ +\xb9\x01\xb8\xff\xd7\x02\xb9\x01\xbb\xff\xd7\x02\xb9\x01\xbe\xff\ +\xc3\x02\xb9\x01\xca\xff\xae\x02\xb9\x01\xcc\xff\xc3\x02\xb9\x01\ +\xcd\xff\xc3\x02\xb9\x01\xce\xff\x9a\x02\xb9\x01\xcf\xff\x9a\x02\ +\xb9\x01\xd2\xff\xc3\x02\xb9\x01\xd3\xff\xc3\x02\xb9\x01\xd4\xff\ +\xc3\x02\xb9\x01\xd5\xff\x9a\x02\xb9\x01\xd6\xff\xc3\x02\xb9\x01\ +\xd7\xff\xc3\x02\xb9\x01\xd8\xff\x9a\x02\xb9\x01\xd9\xff\xc3\x02\ +\xb9\x01\xda\xff\xc3\x02\xb9\x01\xdb\xff\x9a\x02\xb9\x01\xde\xff\ +\x9a\x02\xb9\x01\xe0\xff\xc3\x02\xb9\x01\xe1\xff\xae\x02\xb9\x01\ +\xe2\xff\xc3\x02\xb9\x01\xe3\xff\xc3\x02\xb9\x01\xe5\xff\xc3\x02\ +\xb9\x01\xe6\xff\xc3\x02\xb9\x01\xe8\xff\xc3\x02\xb9\x01\xe9\xff\ +\xd7\x02\xb9\x01\xea\xff\x9a\x02\xb9\x01\xeb\x00)\x02\xb9\x01\ +\xec\xff\xc3\x02\xb9\x01\xed\xff\x9a\x02\xb9\x01\xee\xff\xae\x02\ +\xb9\x01\xf2\xff\x9a\x02\xb9\x01\xf3\xff\xc3\x02\xb9\x01\xf4\x00\ +)\x02\xb9\x01\xf5\xff\xc3\x02\xb9\x01\xf7\xff\xc3\x02\xb9\x01\ +\xf9\xff\xc3\x02\xb9\x02\x08\xff\x85\x02\xb9\x02\x0c\xff\x85\x02\ +\xb9\x02j\xff\x9a\x02\xb9\x02k\xff\xc3\x02\xb9\x02l\xff\ +\xd7\x02\xb9\x02q\xff\xc3\x02\xb9\x02r\xff\x85\x02\xb9\x02\ +s\xff\x9a\x02\xb9\x02u\xff\xc3\x02\xb9\x02w\xff\xd7\x02\ +\xb9\x02y\xff\xc3\x02\xb9\x02}\xff\xd7\x02\xb9\x02~\xff\ +\xd7\x02\xb9\x02\x7f\xff\x9a\x02\xb9\x02\x84\xff\xd7\x02\xb9\x02\ +\x85\xff\x9a\x02\xb9\x02\x86\xff\xd7\x02\xb9\x02\x87\xff\x9a\x02\ +\xb9\x02\x88\xff\xd7\x02\xb9\x02\x89\xff\x9a\x02\xb9\x02\x8a\xff\ +\xd7\x02\xb9\x02\x8c\xff\xd7\x02\xb9\x02\x8d\xff\x9a\x02\xb9\x02\ +\x96\xff\xc3\x02\xb9\x02\x98\x00)\x02\xb9\x02\x9a\xff\xc3\x02\ +\xb9\x02\x9e\xff\xc3\x02\xb9\x02\xa4\xff\xc3\x02\xb9\x02\xa6\xff\ +\xc3\x02\xb9\x02\xa8\x00)\x02\xb9\x02\xac\xff\xc3\x02\xb9\x02\ +\xae\xff\xc3\x02\xb9\x02\xb0\xff\xc3\x02\xb9\x02\xb1\xff\xd7\x02\ +\xb9\x02\xb2\xff\x9a\x02\xb9\x02\xb3\xff\xd7\x02\xb9\x02\xb4\xff\ +\x9a\x02\xb9\x02\xc0\xff\xae\x02\xb9\x02\xc2\xff\xae\x02\xb9\x02\ +\xc4\xff\xc3\x02\xb9\x02\xc6\xff\xae\x02\xb9\x02\xc8\xff\xae\x02\ +\xb9\x02\xcd\xff\xc3\x02\xb9\x02\xce\xff\xae\x02\xb9\x02\xcf\xff\ +\x9a\x02\xb9\x02\xd1\xff\xc3\x02\xb9\x02\xd3\xff\xc3\x02\xb9\x02\ +\xd5\xff\xae\x02\xb9\x02\xd7\xff\xc3\x02\xb9\x02\xd9\xff\x85\x02\ +\xb9\x02\xda\xff\xae\x02\xb9\x02\xdb\xff\x85\x02\xb9\x02\xdc\xff\ +\xae\x02\xb9\x02\xdd\xff\x85\x02\xb9\x02\xde\xff\xae\x02\xb9\x02\ +\xe0\xff\x9a\x02\xb9\x02\xe1\xff\xec\x02\xb9\x02\xe2\xff\xae\x02\ +\xb9\x02\xe3\xff\xec\x02\xb9\x02\xe4\xff\xae\x02\xb9\x02\xec\xff\ +\xc3\x02\xb9\x02\xee\xff\xc3\x02\xb9\x02\xef\xff\xd7\x02\xb9\x02\ +\xf0\xff\x9a\x02\xb9\x02\xf1\xff\xd7\x02\xb9\x02\xf2\xff\x9a\x02\ +\xb9\x02\xf3\xff\xd7\x02\xb9\x02\xf4\xff\x9a\x02\xb9\x02\xfe\xff\ +\xae\x02\xb9\x03\x00\xff\xc3\x02\xb9\x03\x02\xff\xc3\x02\xb9\x03\ +\x09\xff\xae\x02\xb9\x03\x0a\xff\x9a\x02\xb9\x03\x0b\xff\xae\x02\ +\xb9\x03\x0c\xff\x9a\x02\xb9\x03\x0e\xff\xd7\x02\xb9\x03\x10\xff\ +\xd7\x02\xb9\x03\x11\xff\xae\x02\xb9\x03\x12\xff\x9a\x02\xb9\x03\ +\x14\xff\xc3\x02\xb9\x03\x15\xff\xd7\x02\xb9\x03\x16\xff\x9a\x02\ +\xb9\x03\x19\xff\xec\x02\xb9\x03\x1a\xff\x9a\x02\xb9\x03\x1b\xff\ +\xae\x02\xb9\x03\x1c\xff\x9a\x02\xba\x00\x0f\xff\xae\x02\xba\x00\ +\x11\xff\xae\x02\xba\x01\xce\xff\xec\x02\xba\x01\xd5\xff\xec\x02\ +\xba\x01\xf2\xff\xec\x02\xba\x02\x08\xff\xae\x02\xba\x02\x0c\xff\ +\xae\x02\xba\x02s\xff\xec\x02\xba\x02\xcf\xff\xec\x02\xba\x03\ +\x12\xff\xec\x02\xba\x03\x1c\xff\xec\x02\xbb\x01\x9f\xff\xd7\x02\ +\xbb\x01\xa3\x00\xe1\x02\xbb\x01\xb8\xff\xd7\x02\xbb\x01\xbb\xff\ +\xd7\x02\xbb\x01\xbe\xff\xc3\x02\xbb\x01\xdc\xff\xd7\x02\xbb\x01\ +\xe1\xff\xae\x02\xbb\x01\xe4\xff\xd7\x02\xbb\x02l\xff\xd7\x02\ +\xbb\x02{\x00=\x02\xbb\x02}\xff\xec\x02\xbb\x02~\xff\ +\xd7\x02\xbb\x02\x84\xff\xd7\x02\xbb\x02\x86\xff\xd7\x02\xbb\x02\ +\x88\xff\xd7\x02\xbb\x02\x8a\xff\xd7\x02\xbb\x02\x8c\xff\xd7\x02\ +\xbb\x02\xaa\xff\xd7\x02\xbb\x02\xb1\xff\xd7\x02\xbb\x02\xb3\xff\ +\xd7\x02\xbb\x02\xb6\xff\xd7\x02\xbb\x02\xbe\xff\xd7\x02\xbb\x02\ +\xc0\xff\xae\x02\xbb\x02\xc2\xff\xae\x02\xbb\x02\xc5\xff\xc3\x02\ +\xbb\x02\xc6\xff\xd7\x02\xbb\x02\xc7\xff\xc3\x02\xbb\x02\xc8\xff\ +\xd7\x02\xbb\x02\xd5\xff\xae\x02\xbb\x02\xef\xff\xd7\x02\xbb\x02\ +\xf1\xff\xd7\x02\xbb\x02\xf3\xff\xd7\x02\xbb\x02\xfe\xff\xae\x02\ +\xbb\x03\x0e\xff\xd7\x02\xbb\x03\x10\xff\xd7\x02\xbb\x03\x15\xff\ +\xd7\x02\xbb\x03\x18\xff\xd7\x02\xbc\x01\xcf\xff\xec\x02\xbc\x01\ +\xd8\xff\xec\x02\xbc\x01\xdb\xff\xec\x02\xbc\x01\xde\xff\xec\x02\ +\xbc\x01\xe1\xff\xec\x02\xbc\x01\xea\xff\xec\x02\xbc\x01\xed\xff\ +\xec\x02\xbc\x02j\xff\xec\x02\xbc\x02\x7f\xff\xec\x02\xbc\x02\ +\x85\xff\xec\x02\xbc\x02\x87\xff\xec\x02\xbc\x02\x89\xff\xec\x02\ +\xbc\x02\x8d\xff\xec\x02\xbc\x02\xb2\xff\xec\x02\xbc\x02\xb4\xff\ +\xec\x02\xbc\x02\xc0\xff\xec\x02\xbc\x02\xc2\xff\xec\x02\xbc\x02\ +\xd5\xff\xec\x02\xbc\x02\xe0\xff\xec\x02\xbc\x02\xf0\xff\xec\x02\ +\xbc\x02\xf2\xff\xec\x02\xbc\x02\xf4\xff\xec\x02\xbc\x02\xfe\xff\ +\xec\x02\xbc\x03\x0a\xff\xec\x02\xbc\x03\x0c\xff\xec\x02\xbc\x03\ +\x0e\xff\xd7\x02\xbc\x03\x10\xff\xd7\x02\xbc\x03\x16\xff\xec\x02\ +\xbc\x03\x1a\xff\xec\x02\xbd\x01\xa3\x00\xe1\x02\xbd\x02\xea\x00\ +)\x02\xbd\x03\x0e\xff\xd7\x02\xbd\x03\x10\xff\xd7\x02\xbe\x00\ +\x05\xff\xec\x02\xbe\x00\x0a\xff\xec\x02\xbe\x02\x07\xff\xec\x02\ +\xbe\x02\x0b\xff\xec\x02\xbf\x01\xa3\x00\xe1\x02\xbf\x02\xea\x00\ +)\x02\xbf\x03\x0e\xff\xd7\x02\xbf\x03\x10\xff\xd7\x02\xc0\x00\ +\x05\xff\xec\x02\xc0\x00\x0a\xff\xec\x02\xc0\x02\x07\xff\xec\x02\ +\xc0\x02\x0b\xff\xec\x02\xc3\x00\x05\xff\xc3\x02\xc3\x00\x0a\xff\ +\xc3\x02\xc3\x01\x9d\xff\xd7\x02\xc3\x01\xa6\xff\xd7\x02\xc3\x01\ +\xbc\xff\x85\x02\xc3\x01\xc1\xff\xae\x02\xc3\x01\xc4\xff\xd7\x02\ +\xc3\x01\xdc\xff\xd7\x02\xc3\x01\xdd\xff\xec\x02\xc3\x01\xe1\xff\ +\xec\x02\xc3\x01\xe4\xff\xd7\x02\xc3\x01\xf6\xff\xec\x02\xc3\x02\ +\x07\xff\xc3\x02\xc3\x02\x0b\xff\xc3\x02\xc3\x02|\xff\xae\x02\ +\xc3\x02\x80\xff\xc3\x02\xc3\x02\x82\xff\xc3\x02\xc3\x02\xa9\xff\ +\xd7\x02\xc3\x02\xaa\xff\xd7\x02\xc3\x02\xb5\xff\x85\x02\xc3\x02\ +\xb6\xff\xd7\x02\xc3\x02\xb7\xff\x9a\x02\xc3\x02\xb9\xff\x9a\x02\ +\xc3\x02\xbd\xff\xd7\x02\xc3\x02\xbe\xff\xd7\x02\xc3\x02\xbf\xff\ +\xae\x02\xc3\x02\xc0\xff\xec\x02\xc3\x02\xc1\xff\xae\x02\xc3\x02\ +\xc2\xff\xec\x02\xc3\x02\xd4\xff\xae\x02\xc3\x02\xd5\xff\xec\x02\ +\xc3\x02\xf8\xff\xec\x02\xc3\x02\xfa\xff\xec\x02\xc3\x02\xfc\xff\ +\xec\x02\xc3\x02\xfd\xff\xae\x02\xc3\x02\xfe\xff\xec\x02\xc3\x03\ +\x0d\xff\xae\x02\xc3\x03\x0e\xff\xd7\x02\xc3\x03\x0f\xff\xae\x02\ +\xc3\x03\x10\xff\xd7\x02\xc3\x03\x17\xff\xd7\x02\xc3\x03\x18\xff\ +\xd7\x02\xc4\x00\x05\xff\x9a\x02\xc4\x00\x0a\xff\x9a\x02\xc4\x01\ +\xdc\xff\xd7\x02\xc4\x01\xdd\xff\xd7\x02\xc4\x01\xe4\xff\xd7\x02\ +\xc4\x01\xf6\xff\xd7\x02\xc4\x02\x07\xff\x9a\x02\xc4\x02\x0b\xff\ +\x9a\x02\xc4\x02\xaa\xff\xd7\x02\xc4\x02\xb6\xff\xd7\x02\xc4\x02\ +\xb8\xff\xd7\x02\xc4\x02\xba\xff\xd7\x02\xc4\x02\xbe\xff\xd7\x02\ +\xc4\x02\xf8\xff\xd7\x02\xc4\x02\xfa\xff\xd7\x02\xc4\x02\xfc\xff\ +\xd7\x02\xc4\x03\x0e\xff\xae\x02\xc4\x03\x10\xff\xae\x02\xc4\x03\ +\x18\xff\xd7\x02\xc5\x01\xbc\xff\xd7\x02\xc5\x02\x80\xff\xec\x02\ +\xc5\x02\x82\xff\xec\x02\xc5\x02\xb5\xff\xd7\x02\xc5\x02\xb7\xff\ +\xec\x02\xc5\x02\xb9\xff\xec\x02\xc5\x03\x0d\xff\xec\x02\xc5\x03\ +\x0f\xff\xec\x02\xc6\x00\x05\xff\xec\x02\xc6\x00\x0a\xff\xec\x02\ +\xc6\x02\x07\xff\xec\x02\xc6\x02\x0b\xff\xec\x02\xc7\x01\xbc\xff\ +\xd7\x02\xc7\x02\x80\xff\xec\x02\xc7\x02\x82\xff\xec\x02\xc7\x02\ +\xb5\xff\xd7\x02\xc7\x02\xb7\xff\xec\x02\xc7\x02\xb9\xff\xec\x02\ +\xc7\x03\x0d\xff\xec\x02\xc7\x03\x0f\xff\xec\x02\xc8\x00\x05\xff\ +\xec\x02\xc8\x00\x0a\xff\xec\x02\xc8\x02\x07\xff\xec\x02\xc8\x02\ +\x0b\xff\xec\x02\xca\x01\x9f\xff\xd7\x02\xca\x01\xb8\xff\xd7\x02\ +\xca\x01\xbb\xff\xd7\x02\xca\x01\xbe\xff\xd7\x02\xca\x01\xc1\xff\ +\xd7\x02\xca\x01\xe1\xff\xd7\x02\xca\x02l\xff\xd7\x02\xca\x02\ +|\xff\xd7\x02\xca\x02~\xff\xd7\x02\xca\x02\x84\xff\xd7\x02\ +\xca\x02\x86\xff\xd7\x02\xca\x02\x88\xff\xd7\x02\xca\x02\x8a\xff\ +\xd7\x02\xca\x02\x8c\xff\xd7\x02\xca\x02\xb1\xff\xd7\x02\xca\x02\ +\xb3\xff\xd7\x02\xca\x02\xbf\xff\xd7\x02\xca\x02\xc0\xff\xd7\x02\ +\xca\x02\xc1\xff\xd7\x02\xca\x02\xc2\xff\xd7\x02\xca\x02\xc5\xff\ +\x9a\x02\xca\x02\xc7\xff\x9a\x02\xca\x02\xd4\xff\xd7\x02\xca\x02\ +\xd5\xff\xd7\x02\xca\x02\xef\xff\xd7\x02\xca\x02\xf1\xff\xd7\x02\ +\xca\x02\xf3\xff\xd7\x02\xca\x02\xfd\xff\xd7\x02\xca\x02\xfe\xff\ +\xd7\x02\xca\x03\x09\xff\xd7\x02\xca\x03\x0b\xff\xd7\x02\xca\x03\ +\x0e\xff\xd7\x02\xca\x03\x10\xff\xd7\x02\xca\x03\x15\xff\xd7\x02\ +\xca\x03\x19\xff\xec\x02\xcb\x01\xcf\xff\xd7\x02\xcb\x01\xd8\xff\ +\xd7\x02\xcb\x01\xdb\xff\xd7\x02\xcb\x01\xde\xff\xd7\x02\xcb\x01\ +\xe1\xff\xd7\x02\xcb\x01\xea\xff\xd7\x02\xcb\x01\xed\xff\xd7\x02\ +\xcb\x02j\xff\xd7\x02\xcb\x02\x7f\xff\xd7\x02\xcb\x02\x85\xff\ +\xd7\x02\xcb\x02\x87\xff\xd7\x02\xcb\x02\x89\xff\xd7\x02\xcb\x02\ +\x8d\xff\xd7\x02\xcb\x02\xb2\xff\xd7\x02\xcb\x02\xb4\xff\xd7\x02\ +\xcb\x02\xc0\xff\xd7\x02\xcb\x02\xc2\xff\xd7\x02\xcb\x02\xc6\xff\ +\xd7\x02\xcb\x02\xc8\xff\xd7\x02\xcb\x02\xd5\xff\xd7\x02\xcb\x02\ +\xe0\xff\xd7\x02\xcb\x02\xf0\xff\xd7\x02\xcb\x02\xf2\xff\xd7\x02\ +\xcb\x02\xf4\xff\xd7\x02\xcb\x02\xfe\xff\xd7\x02\xcb\x03\x0a\xff\ +\xd7\x02\xcb\x03\x0c\xff\xd7\x02\xcb\x03\x16\xff\xd7\x02\xcb\x03\ +\x1a\xff\xd7\x02\xcc\x00\x05\xff\xc3\x02\xcc\x00\x0a\xff\xc3\x02\ +\xcc\x01\xa3\x00f\x02\xcc\x01\xbc\xff\xd7\x02\xcc\x01\xbe\xff\ +\xd7\x02\xcc\x01\xc1\xff\xae\x02\xcc\x01\xdc\xff\xc3\x02\xcc\x01\ +\xe1\xff\xd7\x02\xcc\x01\xe4\xff\xc3\x02\xcc\x02\x07\xff\xc3\x02\ +\xcc\x02\x0b\xff\xc3\x02\xcc\x02m\xff\xec\x02\xcc\x02|\xff\ +\xae\x02\xcc\x02\x80\xff\xd7\x02\xcc\x02\x81\xff\xec\x02\xcc\x02\ +\x82\xff\xd7\x02\xcc\x02\x83\xff\xec\x02\xcc\x02\x8b\xff\xec\x02\ +\xcc\x02\xaa\xff\xc3\x02\xcc\x02\xb5\xff\xd7\x02\xcc\x02\xb6\xff\ +\xc3\x02\xcc\x02\xb7\xff\xd7\x02\xcc\x02\xb8\xff\xec\x02\xcc\x02\ +\xb9\xff\xd7\x02\xcc\x02\xba\xff\xec\x02\xcc\x02\xbe\xff\xc3\x02\ +\xcc\x02\xbf\xff\xae\x02\xcc\x02\xc0\xff\xd7\x02\xcc\x02\xc1\xff\ +\xae\x02\xcc\x02\xc2\xff\xd7\x02\xcc\x02\xc5\xff\xc3\x02\xcc\x02\ +\xc6\xff\xd7\x02\xcc\x02\xc7\xff\xc3\x02\xcc\x02\xc8\xff\xd7\x02\ +\xcc\x02\xd4\xff\xae\x02\xcc\x02\xd5\xff\xd7\x02\xcc\x02\xfd\xff\ +\xae\x02\xcc\x02\xfe\xff\xd7\x02\xcc\x03\x0d\xff\xd7\x02\xcc\x03\ +\x0e\xff\xc3\x02\xcc\x03\x0f\xff\xd7\x02\xcc\x03\x10\xff\xc3\x02\ +\xcc\x03\x18\xff\xc3\x02\xcd\x01\xe1\xff\xd7\x02\xcd\x02\xc0\xff\ +\xd7\x02\xcd\x02\xc2\xff\xd7\x02\xcd\x02\xd5\xff\xd7\x02\xcd\x02\ +\xfe\xff\xd7\x02\xce\x01\xa3\x00\xe1\x02\xce\x02\xea\x00)\x02\ +\xce\x03\x0e\xff\xd7\x02\xce\x03\x10\xff\xd7\x02\xcf\x00\x05\xff\ +\xec\x02\xcf\x00\x0a\xff\xec\x02\xcf\x02\x07\xff\xec\x02\xcf\x02\ +\x0b\xff\xec\x02\xd2\x01\xa3\x00\xe1\x02\xd2\x02\xea\x00)\x02\ +\xd2\x03\x0e\xff\xd7\x02\xd2\x03\x10\xff\xd7\x02\xd3\x00\x05\xff\ +\xec\x02\xd3\x00\x0a\xff\xec\x02\xd3\x02\x07\xff\xec\x02\xd3\x02\ +\x0b\xff\xec\x02\xd6\x01\xa3\x00\xe1\x02\xd6\x02\xea\x00)\x02\ +\xd6\x03\x0e\xff\xd7\x02\xd6\x03\x10\xff\xd7\x02\xd7\x00\x05\xff\ +\xec\x02\xd7\x00\x0a\xff\xec\x02\xd7\x02\x07\xff\xec\x02\xd7\x02\ +\x0b\xff\xec\x02\xd9\x00\x05\xffq\x02\xd9\x00\x0a\xffq\x02\ +\xd9\x01\x9d\xff\x9a\x02\xd9\x01\xa6\xff\x9a\x02\xd9\x01\xbc\xff\ +q\x02\xd9\x01\xbe\xff\xd7\x02\xd9\x01\xc1\xff\x9a\x02\xd9\x01\ +\xc4\xff\x9a\x02\xd9\x01\xdc\xff\xd7\x02\xd9\x01\xe1\xff\xd7\x02\ +\xd9\x01\xe4\xff\xd7\x02\xd9\x02\x07\xffq\x02\xd9\x02\x0b\xff\ +q\x02\xd9\x02n\xff\xd7\x02\xd9\x02|\xff\x9a\x02\xd9\x02\ +\x80\xff\xae\x02\xd9\x02\x82\xff\xae\x02\xd9\x02\x97\xff\xd7\x02\ +\xd9\x02\x9b\xff\xd7\x02\xd9\x02\xa7\xff\xd7\x02\xd9\x02\xa9\xff\ +\x9a\x02\xd9\x02\xaa\xff\xd7\x02\xd9\x02\xb5\xffq\x02\xd9\x02\ +\xb6\xff\xd7\x02\xd9\x02\xb7\xff\x85\x02\xd9\x02\xb9\xff\x85\x02\ +\xd9\x02\xbd\xff\x9a\x02\xd9\x02\xbe\xff\xd7\x02\xd9\x02\xbf\xff\ +\x9a\x02\xd9\x02\xc0\xff\xd7\x02\xd9\x02\xc1\xff\x9a\x02\xd9\x02\ +\xc2\xff\xd7\x02\xd9\x02\xc5\xff\x9a\x02\xd9\x02\xc7\xff\x9a\x02\ +\xd9\x02\xd4\xff\x9a\x02\xd9\x02\xd5\xff\xd7\x02\xd9\x02\xe1\xff\ +\xd7\x02\xd9\x02\xe3\xff\xd7\x02\xd9\x02\xfd\xff\x9a\x02\xd9\x02\ +\xfe\xff\xd7\x02\xd9\x03\x03\xff\xd7\x02\xd9\x03\x0d\xffq\x02\ +\xd9\x03\x0e\xff\xd7\x02\xd9\x03\x0f\xffq\x02\xd9\x03\x10\xff\ +\xd7\x02\xd9\x03\x17\xff\x9a\x02\xd9\x03\x18\xff\xd7\x02\xda\x00\ +\x05\xff\xec\x02\xda\x00\x0a\xff\xec\x02\xda\x02\x07\xff\xec\x02\ +\xda\x02\x0b\xff\xec\x02\xdb\x00\x05\xffq\x02\xdb\x00\x0a\xff\ +q\x02\xdb\x01\x9d\xff\x9a\x02\xdb\x01\xa6\xff\x9a\x02\xdb\x01\ +\xbc\xffq\x02\xdb\x01\xbe\xff\xd7\x02\xdb\x01\xc1\xff\x9a\x02\ +\xdb\x01\xc4\xff\x9a\x02\xdb\x01\xdc\xff\xd7\x02\xdb\x01\xe1\xff\ +\xd7\x02\xdb\x01\xe4\xff\xd7\x02\xdb\x02\x07\xffq\x02\xdb\x02\ +\x0b\xffq\x02\xdb\x02n\xff\xd7\x02\xdb\x02|\xff\x9a\x02\ +\xdb\x02\x80\xff\xae\x02\xdb\x02\x82\xff\xae\x02\xdb\x02\x97\xff\ +\xd7\x02\xdb\x02\x9b\xff\xd7\x02\xdb\x02\xa7\xff\xd7\x02\xdb\x02\ +\xa9\xff\x9a\x02\xdb\x02\xaa\xff\xd7\x02\xdb\x02\xb5\xffq\x02\ +\xdb\x02\xb6\xff\xd7\x02\xdb\x02\xb7\xff\x85\x02\xdb\x02\xb9\xff\ +\x85\x02\xdb\x02\xbd\xff\x9a\x02\xdb\x02\xbe\xff\xd7\x02\xdb\x02\ +\xbf\xff\x9a\x02\xdb\x02\xc0\xff\xd7\x02\xdb\x02\xc1\xff\x9a\x02\ +\xdb\x02\xc2\xff\xd7\x02\xdb\x02\xc5\xff\x9a\x02\xdb\x02\xc7\xff\ +\x9a\x02\xdb\x02\xd4\xff\x9a\x02\xdb\x02\xd5\xff\xd7\x02\xdb\x02\ +\xe1\xff\xd7\x02\xdb\x02\xe3\xff\xd7\x02\xdb\x02\xfd\xff\x9a\x02\ +\xdb\x02\xfe\xff\xd7\x02\xdb\x03\x03\xff\xd7\x02\xdb\x03\x0d\xff\ +q\x02\xdb\x03\x0e\xff\xd7\x02\xdb\x03\x0f\xffq\x02\xdb\x03\ +\x10\xff\xd7\x02\xdb\x03\x17\xff\x9a\x02\xdb\x03\x18\xff\xd7\x02\ +\xdc\x00\x05\xff\xec\x02\xdc\x00\x0a\xff\xec\x02\xdc\x02\x07\xff\ +\xec\x02\xdc\x02\x0b\xff\xec\x02\xde\x00\x05\xff\xec\x02\xde\x00\ +\x0a\xff\xec\x02\xde\x02\x07\xff\xec\x02\xde\x02\x0b\xff\xec\x02\ +\xe0\x00\x05\xff\xec\x02\xe0\x00\x0a\xff\xec\x02\xe0\x02\x07\xff\ +\xec\x02\xe0\x02\x0b\xff\xec\x02\xe1\x00\x0f\xff\xae\x02\xe1\x00\ +\x11\xff\xae\x02\xe1\x01\x9d\xff\xec\x02\xe1\x01\xa4\xff\xd7\x02\ +\xe1\x01\xa6\xff\xec\x02\xe1\x01\xa8\xff\xd7\x02\xe1\x01\xaa\xff\ +\xd7\x02\xe1\x01\xae\xff\xd7\x02\xe1\x01\xb0\xff\xd7\x02\xe1\x01\ +\xb1\xff\xec\x02\xe1\x01\xb5\xff\xd7\x02\xe1\x01\xbc\xff\xc3\x02\ +\xe1\x01\xbd\xff\xd7\x02\xe1\x01\xbf\xff\xd7\x02\xe1\x01\xc1\xff\ +\xd7\x02\xe1\x01\xc4\xff\xec\x02\xe1\x01\xc7\xff\xec\x02\xe1\x01\ +\xce\xff\xec\x02\xe1\x01\xd5\xff\xec\x02\xe1\x01\xf2\xff\xec\x02\ +\xe1\x02\x08\xff\xae\x02\xe1\x02\x0c\xff\xae\x02\xe1\x02r\xff\ +\xd7\x02\xe1\x02s\xff\xec\x02\xe1\x02z\xff\xec\x02\xe1\x02\ +|\xff\xd7\x02\xe1\x02\x80\xff\xec\x02\xe1\x02\x82\xff\xec\x02\ +\xe1\x02\x9f\xff\xd7\x02\xe1\x02\xa1\xff\xec\x02\xe1\x02\xa9\xff\ +\xec\x02\xe1\x02\xb5\xff\xc3\x02\xe1\x02\xb7\xff\xec\x02\xe1\x02\ +\xb9\xff\xec\x02\xe1\x02\xbb\xff\xd7\x02\xe1\x02\xbd\xff\xec\x02\ +\xe1\x02\xbf\xff\xd7\x02\xe1\x02\xc1\xff\xd7\x02\xe1\x02\xca\xff\ +\xd7\x02\xe1\x02\xce\xff\xd7\x02\xe1\x02\xcf\xff\xec\x02\xe1\x02\ +\xd4\xff\xd7\x02\xe1\x02\xd9\xff\xd7\x02\xe1\x02\xdb\xff\xd7\x02\ +\xe1\x02\xdd\xff\xd7\x02\xe1\x02\xe5\xff\xd7\x02\xe1\x02\xe7\xff\ +\xec\x02\xe1\x02\xf5\xff\xec\x02\xe1\x02\xf7\xff\xd7\x02\xe1\x02\ +\xf9\xff\xd7\x02\xe1\x02\xfb\xff\xd7\x02\xe1\x02\xfd\xff\xd7\x02\ +\xe1\x03\x05\xff\xd7\x02\xe1\x03\x07\xff\xd7\x02\xe1\x03\x0d\xff\ +\xd7\x02\xe1\x03\x0f\xff\xd7\x02\xe1\x03\x11\xff\xd7\x02\xe1\x03\ +\x12\xff\xec\x02\xe1\x03\x17\xff\xec\x02\xe1\x03\x1b\xff\xd7\x02\ +\xe1\x03\x1c\xff\xec\x02\xe2\x00\x05\xff\xec\x02\xe2\x00\x0a\xff\ +\xec\x02\xe2\x01\xd0\xff\xd7\x02\xe2\x01\xdc\xff\xec\x02\xe2\x01\ +\xdd\xff\xec\x02\xe2\x01\xdf\xff\xd7\x02\xe2\x01\xe1\xff\xec\x02\ +\xe2\x01\xe4\xff\xec\x02\xe2\x01\xf6\xff\xec\x02\xe2\x02\x07\xff\ +\xec\x02\xe2\x02\x0b\xff\xec\x02\xe2\x02\xa0\xff\xd7\x02\xe2\x02\ +\xaa\xff\xec\x02\xe2\x02\xb6\xff\xec\x02\xe2\x02\xbc\xff\xd7\x02\ +\xe2\x02\xbe\xff\xec\x02\xe2\x02\xc0\xff\xec\x02\xe2\x02\xc2\xff\ +\xec\x02\xe2\x02\xcb\xff\xd7\x02\xe2\x02\xd5\xff\xec\x02\xe2\x02\ +\xe6\xff\xd7\x02\xe2\x02\xf8\xff\xec\x02\xe2\x02\xfa\xff\xec\x02\ +\xe2\x02\xfc\xff\xec\x02\xe2\x02\xfe\xff\xec\x02\xe2\x03\x06\xff\ +\xd7\x02\xe2\x03\x08\xff\xd7\x02\xe2\x03\x0e\xff\xec\x02\xe2\x03\ +\x10\xff\xec\x02\xe2\x03\x18\xff\xec\x02\xe3\x00\x0f\xff\xae\x02\ +\xe3\x00\x11\xff\xae\x02\xe3\x01\x9d\xff\xec\x02\xe3\x01\xa4\xff\ +\xd7\x02\xe3\x01\xa6\xff\xec\x02\xe3\x01\xa8\xff\xd7\x02\xe3\x01\ +\xaa\xff\xd7\x02\xe3\x01\xae\xff\xd7\x02\xe3\x01\xb0\xff\xd7\x02\ +\xe3\x01\xb1\xff\xec\x02\xe3\x01\xb5\xff\xd7\x02\xe3\x01\xbc\xff\ +\xc3\x02\xe3\x01\xbd\xff\xd7\x02\xe3\x01\xbf\xff\xd7\x02\xe3\x01\ +\xc1\xff\xd7\x02\xe3\x01\xc4\xff\xec\x02\xe3\x01\xc7\xff\xec\x02\ +\xe3\x01\xce\xff\xec\x02\xe3\x01\xd5\xff\xec\x02\xe3\x01\xf2\xff\ +\xec\x02\xe3\x02\x08\xff\xae\x02\xe3\x02\x0c\xff\xae\x02\xe3\x02\ +r\xff\xd7\x02\xe3\x02s\xff\xec\x02\xe3\x02z\xff\xec\x02\ +\xe3\x02|\xff\xd7\x02\xe3\x02\x80\xff\xec\x02\xe3\x02\x82\xff\ +\xec\x02\xe3\x02\x9f\xff\xd7\x02\xe3\x02\xa1\xff\xec\x02\xe3\x02\ +\xa9\xff\xec\x02\xe3\x02\xb5\xff\xc3\x02\xe3\x02\xb7\xff\xec\x02\ +\xe3\x02\xb9\xff\xec\x02\xe3\x02\xbb\xff\xd7\x02\xe3\x02\xbd\xff\ +\xec\x02\xe3\x02\xbf\xff\xd7\x02\xe3\x02\xc1\xff\xd7\x02\xe3\x02\ +\xca\xff\xd7\x02\xe3\x02\xce\xff\xd7\x02\xe3\x02\xcf\xff\xec\x02\ +\xe3\x02\xd4\xff\xd7\x02\xe3\x02\xd9\xff\xd7\x02\xe3\x02\xdb\xff\ +\xd7\x02\xe3\x02\xdd\xff\xd7\x02\xe3\x02\xe5\xff\xd7\x02\xe3\x02\ +\xe7\xff\xec\x02\xe3\x02\xf5\xff\xec\x02\xe3\x02\xf7\xff\xd7\x02\ +\xe3\x02\xf9\xff\xd7\x02\xe3\x02\xfb\xff\xd7\x02\xe3\x02\xfd\xff\ +\xd7\x02\xe3\x03\x05\xff\xd7\x02\xe3\x03\x07\xff\xd7\x02\xe3\x03\ +\x0d\xff\xd7\x02\xe3\x03\x0f\xff\xd7\x02\xe3\x03\x11\xff\xd7\x02\ +\xe3\x03\x12\xff\xec\x02\xe3\x03\x17\xff\xec\x02\xe3\x03\x1b\xff\ +\xd7\x02\xe3\x03\x1c\xff\xec\x02\xe4\x00\x05\xff\xec\x02\xe4\x00\ +\x0a\xff\xec\x02\xe4\x01\xd0\xff\xd7\x02\xe4\x01\xdc\xff\xec\x02\ +\xe4\x01\xdd\xff\xec\x02\xe4\x01\xdf\xff\xd7\x02\xe4\x01\xe1\xff\ +\xec\x02\xe4\x01\xe4\xff\xec\x02\xe4\x01\xf6\xff\xec\x02\xe4\x02\ +\x07\xff\xec\x02\xe4\x02\x0b\xff\xec\x02\xe4\x02\xa0\xff\xd7\x02\ +\xe4\x02\xaa\xff\xec\x02\xe4\x02\xb6\xff\xec\x02\xe4\x02\xbc\xff\ +\xd7\x02\xe4\x02\xbe\xff\xec\x02\xe4\x02\xc0\xff\xec\x02\xe4\x02\ +\xc2\xff\xec\x02\xe4\x02\xcb\xff\xd7\x02\xe4\x02\xd5\xff\xec\x02\ +\xe4\x02\xe6\xff\xd7\x02\xe4\x02\xf8\xff\xec\x02\xe4\x02\xfa\xff\ +\xec\x02\xe4\x02\xfc\xff\xec\x02\xe4\x02\xfe\xff\xec\x02\xe4\x03\ +\x06\xff\xd7\x02\xe4\x03\x08\xff\xd7\x02\xe4\x03\x0e\xff\xec\x02\ +\xe4\x03\x10\xff\xec\x02\xe4\x03\x18\xff\xec\x02\xe5\x01\x9f\xff\ +\xd7\x02\xe5\x01\xb8\xff\xd7\x02\xe5\x01\xbb\xff\xd7\x02\xe5\x01\ +\xbe\xff\xd7\x02\xe5\x01\xc1\xff\xd7\x02\xe5\x01\xe1\xff\xd7\x02\ +\xe5\x02l\xff\xd7\x02\xe5\x02|\xff\xd7\x02\xe5\x02~\xff\ +\xd7\x02\xe5\x02\x84\xff\xd7\x02\xe5\x02\x86\xff\xd7\x02\xe5\x02\ +\x88\xff\xd7\x02\xe5\x02\x8a\xff\xd7\x02\xe5\x02\x8c\xff\xd7\x02\ +\xe5\x02\xb1\xff\xd7\x02\xe5\x02\xb3\xff\xd7\x02\xe5\x02\xbf\xff\ +\xd7\x02\xe5\x02\xc0\xff\xd7\x02\xe5\x02\xc1\xff\xd7\x02\xe5\x02\ +\xc2\xff\xd7\x02\xe5\x02\xc5\xff\x9a\x02\xe5\x02\xc7\xff\x9a\x02\ +\xe5\x02\xd4\xff\xd7\x02\xe5\x02\xd5\xff\xd7\x02\xe5\x02\xef\xff\ +\xd7\x02\xe5\x02\xf1\xff\xd7\x02\xe5\x02\xf3\xff\xd7\x02\xe5\x02\ +\xfd\xff\xd7\x02\xe5\x02\xfe\xff\xd7\x02\xe5\x03\x09\xff\xd7\x02\ +\xe5\x03\x0b\xff\xd7\x02\xe5\x03\x0e\xff\xd7\x02\xe5\x03\x10\xff\ +\xd7\x02\xe5\x03\x15\xff\xd7\x02\xe5\x03\x19\xff\xec\x02\xe6\x01\ +\xcf\xff\xd7\x02\xe6\x01\xd8\xff\xd7\x02\xe6\x01\xdb\xff\xd7\x02\ +\xe6\x01\xde\xff\xd7\x02\xe6\x01\xe1\xff\xd7\x02\xe6\x01\xea\xff\ +\xd7\x02\xe6\x01\xed\xff\xd7\x02\xe6\x02j\xff\xd7\x02\xe6\x02\ +\x7f\xff\xd7\x02\xe6\x02\x85\xff\xd7\x02\xe6\x02\x87\xff\xd7\x02\ +\xe6\x02\x89\xff\xd7\x02\xe6\x02\x8d\xff\xd7\x02\xe6\x02\xb2\xff\ +\xd7\x02\xe6\x02\xb4\xff\xd7\x02\xe6\x02\xc0\xff\xd7\x02\xe6\x02\ +\xc2\xff\xd7\x02\xe6\x02\xc6\xff\xd7\x02\xe6\x02\xc8\xff\xd7\x02\ +\xe6\x02\xd5\xff\xd7\x02\xe6\x02\xe0\xff\xd7\x02\xe6\x02\xf0\xff\ +\xd7\x02\xe6\x02\xf2\xff\xd7\x02\xe6\x02\xf4\xff\xd7\x02\xe6\x02\ +\xfe\xff\xd7\x02\xe6\x03\x0a\xff\xd7\x02\xe6\x03\x0c\xff\xd7\x02\ +\xe6\x03\x16\xff\xd7\x02\xe6\x03\x1a\xff\xd7\x02\xe7\x00\x0f\xff\ +\xae\x02\xe7\x00\x11\xff\xae\x02\xe7\x02\x08\xff\xae\x02\xe7\x02\ +\x0c\xff\xae\x02\xe7\x02\x80\xff\xec\x02\xe7\x02\x82\xff\xec\x02\ +\xe7\x02\xb7\xff\xec\x02\xe7\x02\xb9\xff\xec\x02\xe7\x03\x0d\xff\ +\xd7\x02\xe7\x03\x0f\xff\xd7\x02\xe8\x01\xe9\x00)\x02\xe9\x00\ +\x05\xff\xec\x02\xe9\x00\x0a\xff\xec\x02\xe9\x02\x07\xff\xec\x02\ +\xe9\x02\x0b\xff\xec\x02\xe9\x03\x0e\xff\xd7\x02\xe9\x03\x10\xff\ +\xd7\x02\xef\x00\x0f\xff\xae\x02\xef\x00\x11\xff\xae\x02\xef\x01\ +\x9d\xff\xec\x02\xef\x01\xa4\xff\xd7\x02\xef\x01\xa6\xff\xec\x02\ +\xef\x01\xa8\xff\xd7\x02\xef\x01\xaa\xff\xd7\x02\xef\x01\xae\xff\ +\xd7\x02\xef\x01\xb0\xff\xd7\x02\xef\x01\xb1\xff\xec\x02\xef\x01\ +\xb5\xff\xd7\x02\xef\x01\xbc\xff\xc3\x02\xef\x01\xbd\xff\xd7\x02\ +\xef\x01\xbf\xff\xd7\x02\xef\x01\xc1\xff\xd7\x02\xef\x01\xc4\xff\ +\xec\x02\xef\x01\xc7\xff\xec\x02\xef\x01\xce\xff\xec\x02\xef\x01\ +\xd5\xff\xec\x02\xef\x01\xf2\xff\xec\x02\xef\x02\x08\xff\xae\x02\ +\xef\x02\x0c\xff\xae\x02\xef\x02r\xff\xd7\x02\xef\x02s\xff\ +\xec\x02\xef\x02z\xff\xec\x02\xef\x02|\xff\xd7\x02\xef\x02\ +\x80\xff\xec\x02\xef\x02\x82\xff\xec\x02\xef\x02\x9f\xff\xd7\x02\ +\xef\x02\xa1\xff\xec\x02\xef\x02\xa9\xff\xec\x02\xef\x02\xb5\xff\ +\xc3\x02\xef\x02\xb7\xff\xec\x02\xef\x02\xb9\xff\xec\x02\xef\x02\ +\xbb\xff\xd7\x02\xef\x02\xbd\xff\xec\x02\xef\x02\xbf\xff\xd7\x02\ +\xef\x02\xc1\xff\xd7\x02\xef\x02\xca\xff\xd7\x02\xef\x02\xce\xff\ +\xd7\x02\xef\x02\xcf\xff\xec\x02\xef\x02\xd4\xff\xd7\x02\xef\x02\ +\xd9\xff\xd7\x02\xef\x02\xdb\xff\xd7\x02\xef\x02\xdd\xff\xd7\x02\ +\xef\x02\xe5\xff\xd7\x02\xef\x02\xe7\xff\xec\x02\xef\x02\xf5\xff\ +\xec\x02\xef\x02\xf7\xff\xd7\x02\xef\x02\xf9\xff\xd7\x02\xef\x02\ +\xfb\xff\xd7\x02\xef\x02\xfd\xff\xd7\x02\xef\x03\x05\xff\xd7\x02\ +\xef\x03\x07\xff\xd7\x02\xef\x03\x0d\xff\xd7\x02\xef\x03\x0f\xff\ +\xd7\x02\xef\x03\x11\xff\xd7\x02\xef\x03\x12\xff\xec\x02\xef\x03\ +\x17\xff\xec\x02\xef\x03\x1b\xff\xd7\x02\xef\x03\x1c\xff\xec\x02\ +\xf0\x00\x05\xff\xec\x02\xf0\x00\x0a\xff\xec\x02\xf0\x01\xd0\xff\ +\xd7\x02\xf0\x01\xdc\xff\xec\x02\xf0\x01\xdd\xff\xec\x02\xf0\x01\ +\xdf\xff\xd7\x02\xf0\x01\xe1\xff\xec\x02\xf0\x01\xe4\xff\xec\x02\ +\xf0\x01\xf6\xff\xec\x02\xf0\x02\x07\xff\xec\x02\xf0\x02\x0b\xff\ +\xec\x02\xf0\x02\xa0\xff\xd7\x02\xf0\x02\xaa\xff\xec\x02\xf0\x02\ +\xb6\xff\xec\x02\xf0\x02\xbc\xff\xd7\x02\xf0\x02\xbe\xff\xec\x02\ +\xf0\x02\xc0\xff\xec\x02\xf0\x02\xc2\xff\xec\x02\xf0\x02\xcb\xff\ +\xd7\x02\xf0\x02\xd5\xff\xec\x02\xf0\x02\xe6\xff\xd7\x02\xf0\x02\ +\xf8\xff\xec\x02\xf0\x02\xfa\xff\xec\x02\xf0\x02\xfc\xff\xec\x02\ +\xf0\x02\xfe\xff\xec\x02\xf0\x03\x06\xff\xd7\x02\xf0\x03\x08\xff\ +\xd7\x02\xf0\x03\x0e\xff\xec\x02\xf0\x03\x10\xff\xec\x02\xf0\x03\ +\x18\xff\xec\x02\xf1\x00\x0f\xff\xae\x02\xf1\x00\x11\xff\xae\x02\ +\xf1\x01\x9d\xff\xec\x02\xf1\x01\xa4\xff\xd7\x02\xf1\x01\xa6\xff\ +\xec\x02\xf1\x01\xa8\xff\xd7\x02\xf1\x01\xaa\xff\xd7\x02\xf1\x01\ +\xae\xff\xd7\x02\xf1\x01\xb0\xff\xd7\x02\xf1\x01\xb1\xff\xec\x02\ +\xf1\x01\xb5\xff\xd7\x02\xf1\x01\xbc\xff\xc3\x02\xf1\x01\xbd\xff\ +\xd7\x02\xf1\x01\xbf\xff\xd7\x02\xf1\x01\xc1\xff\xd7\x02\xf1\x01\ +\xc4\xff\xec\x02\xf1\x01\xc7\xff\xec\x02\xf1\x01\xce\xff\xec\x02\ +\xf1\x01\xd5\xff\xec\x02\xf1\x01\xf2\xff\xec\x02\xf1\x02\x08\xff\ +\xae\x02\xf1\x02\x0c\xff\xae\x02\xf1\x02r\xff\xd7\x02\xf1\x02\ +s\xff\xec\x02\xf1\x02z\xff\xec\x02\xf1\x02|\xff\xd7\x02\ +\xf1\x02\x80\xff\xec\x02\xf1\x02\x82\xff\xec\x02\xf1\x02\x9f\xff\ +\xd7\x02\xf1\x02\xa1\xff\xec\x02\xf1\x02\xa9\xff\xec\x02\xf1\x02\ +\xb5\xff\xc3\x02\xf1\x02\xb7\xff\xec\x02\xf1\x02\xb9\xff\xec\x02\ +\xf1\x02\xbb\xff\xd7\x02\xf1\x02\xbd\xff\xec\x02\xf1\x02\xbf\xff\ +\xd7\x02\xf1\x02\xc1\xff\xd7\x02\xf1\x02\xca\xff\xd7\x02\xf1\x02\ +\xce\xff\xd7\x02\xf1\x02\xcf\xff\xec\x02\xf1\x02\xd4\xff\xd7\x02\ +\xf1\x02\xd9\xff\xd7\x02\xf1\x02\xdb\xff\xd7\x02\xf1\x02\xdd\xff\ +\xd7\x02\xf1\x02\xe5\xff\xd7\x02\xf1\x02\xe7\xff\xec\x02\xf1\x02\ +\xf5\xff\xec\x02\xf1\x02\xf7\xff\xd7\x02\xf1\x02\xf9\xff\xd7\x02\ +\xf1\x02\xfb\xff\xd7\x02\xf1\x02\xfd\xff\xd7\x02\xf1\x03\x05\xff\ +\xd7\x02\xf1\x03\x07\xff\xd7\x02\xf1\x03\x0d\xff\xd7\x02\xf1\x03\ +\x0f\xff\xd7\x02\xf1\x03\x11\xff\xd7\x02\xf1\x03\x12\xff\xec\x02\ +\xf1\x03\x17\xff\xec\x02\xf1\x03\x1b\xff\xd7\x02\xf1\x03\x1c\xff\ +\xec\x02\xf2\x00\x05\xff\xec\x02\xf2\x00\x0a\xff\xec\x02\xf2\x01\ +\xd0\xff\xd7\x02\xf2\x01\xdc\xff\xec\x02\xf2\x01\xdd\xff\xec\x02\ +\xf2\x01\xdf\xff\xd7\x02\xf2\x01\xe1\xff\xec\x02\xf2\x01\xe4\xff\ +\xec\x02\xf2\x01\xf6\xff\xec\x02\xf2\x02\x07\xff\xec\x02\xf2\x02\ +\x0b\xff\xec\x02\xf2\x02\xa0\xff\xd7\x02\xf2\x02\xaa\xff\xec\x02\ +\xf2\x02\xb6\xff\xec\x02\xf2\x02\xbc\xff\xd7\x02\xf2\x02\xbe\xff\ +\xec\x02\xf2\x02\xc0\xff\xec\x02\xf2\x02\xc2\xff\xec\x02\xf2\x02\ +\xcb\xff\xd7\x02\xf2\x02\xd5\xff\xec\x02\xf2\x02\xe6\xff\xd7\x02\ +\xf2\x02\xf8\xff\xec\x02\xf2\x02\xfa\xff\xec\x02\xf2\x02\xfc\xff\ +\xec\x02\xf2\x02\xfe\xff\xec\x02\xf2\x03\x06\xff\xd7\x02\xf2\x03\ +\x08\xff\xd7\x02\xf2\x03\x0e\xff\xec\x02\xf2\x03\x10\xff\xec\x02\ +\xf2\x03\x18\xff\xec\x02\xf3\x00\x0f\xff\xae\x02\xf3\x00\x11\xff\ +\xae\x02\xf3\x01\x9d\xff\xec\x02\xf3\x01\xa4\xff\xd7\x02\xf3\x01\ +\xa6\xff\xec\x02\xf3\x01\xa8\xff\xd7\x02\xf3\x01\xaa\xff\xd7\x02\ +\xf3\x01\xae\xff\xd7\x02\xf3\x01\xb0\xff\xd7\x02\xf3\x01\xb1\xff\ +\xec\x02\xf3\x01\xb5\xff\xd7\x02\xf3\x01\xbc\xff\xc3\x02\xf3\x01\ +\xbd\xff\xd7\x02\xf3\x01\xbf\xff\xd7\x02\xf3\x01\xc1\xff\xd7\x02\ +\xf3\x01\xc4\xff\xec\x02\xf3\x01\xc7\xff\xec\x02\xf3\x01\xce\xff\ +\xec\x02\xf3\x01\xd5\xff\xec\x02\xf3\x01\xf2\xff\xec\x02\xf3\x02\ +\x08\xff\xae\x02\xf3\x02\x0c\xff\xae\x02\xf3\x02r\xff\xd7\x02\ +\xf3\x02s\xff\xec\x02\xf3\x02z\xff\xec\x02\xf3\x02|\xff\ +\xd7\x02\xf3\x02\x80\xff\xec\x02\xf3\x02\x82\xff\xec\x02\xf3\x02\ +\x9f\xff\xd7\x02\xf3\x02\xa1\xff\xec\x02\xf3\x02\xa9\xff\xec\x02\ +\xf3\x02\xb5\xff\xc3\x02\xf3\x02\xb7\xff\xec\x02\xf3\x02\xb9\xff\ +\xec\x02\xf3\x02\xbb\xff\xd7\x02\xf3\x02\xbd\xff\xec\x02\xf3\x02\ +\xbf\xff\xd7\x02\xf3\x02\xc1\xff\xd7\x02\xf3\x02\xca\xff\xd7\x02\ +\xf3\x02\xce\xff\xd7\x02\xf3\x02\xcf\xff\xec\x02\xf3\x02\xd4\xff\ +\xd7\x02\xf3\x02\xd9\xff\xd7\x02\xf3\x02\xdb\xff\xd7\x02\xf3\x02\ +\xdd\xff\xd7\x02\xf3\x02\xe5\xff\xd7\x02\xf3\x02\xe7\xff\xec\x02\ +\xf3\x02\xf5\xff\xec\x02\xf3\x02\xf7\xff\xd7\x02\xf3\x02\xf9\xff\ +\xd7\x02\xf3\x02\xfb\xff\xd7\x02\xf3\x02\xfd\xff\xd7\x02\xf3\x03\ +\x05\xff\xd7\x02\xf3\x03\x07\xff\xd7\x02\xf3\x03\x0d\xff\xd7\x02\ +\xf3\x03\x0f\xff\xd7\x02\xf3\x03\x11\xff\xd7\x02\xf3\x03\x12\xff\ +\xec\x02\xf3\x03\x17\xff\xec\x02\xf3\x03\x1b\xff\xd7\x02\xf3\x03\ +\x1c\xff\xec\x02\xf4\x00\x05\xff\xec\x02\xf4\x00\x0a\xff\xec\x02\ +\xf4\x01\xd0\xff\xd7\x02\xf4\x01\xdc\xff\xec\x02\xf4\x01\xdd\xff\ +\xec\x02\xf4\x01\xdf\xff\xd7\x02\xf4\x01\xe1\xff\xec\x02\xf4\x01\ +\xe4\xff\xec\x02\xf4\x01\xf6\xff\xec\x02\xf4\x02\x07\xff\xec\x02\ +\xf4\x02\x0b\xff\xec\x02\xf4\x02\xa0\xff\xd7\x02\xf4\x02\xaa\xff\ +\xec\x02\xf4\x02\xb6\xff\xec\x02\xf4\x02\xbc\xff\xd7\x02\xf4\x02\ +\xbe\xff\xec\x02\xf4\x02\xc0\xff\xec\x02\xf4\x02\xc2\xff\xec\x02\ +\xf4\x02\xcb\xff\xd7\x02\xf4\x02\xd5\xff\xec\x02\xf4\x02\xe6\xff\ +\xd7\x02\xf4\x02\xf8\xff\xec\x02\xf4\x02\xfa\xff\xec\x02\xf4\x02\ +\xfc\xff\xec\x02\xf4\x02\xfe\xff\xec\x02\xf4\x03\x06\xff\xd7\x02\ +\xf4\x03\x08\xff\xd7\x02\xf4\x03\x0e\xff\xec\x02\xf4\x03\x10\xff\ +\xec\x02\xf4\x03\x18\xff\xec\x02\xf5\x00\x0f\xff\xae\x02\xf5\x00\ +\x11\xff\xae\x02\xf5\x01\x9d\xff\xec\x02\xf5\x01\xa4\xff\xd7\x02\ +\xf5\x01\xa6\xff\xec\x02\xf5\x01\xa8\xff\xd7\x02\xf5\x01\xaa\xff\ +\xd7\x02\xf5\x01\xae\xff\xd7\x02\xf5\x01\xb0\xff\xd7\x02\xf5\x01\ +\xb1\xff\xec\x02\xf5\x01\xb5\xff\xd7\x02\xf5\x01\xbc\xff\xc3\x02\ +\xf5\x01\xbd\xff\xd7\x02\xf5\x01\xbf\xff\xd7\x02\xf5\x01\xc1\xff\ +\xd7\x02\xf5\x01\xc4\xff\xec\x02\xf5\x01\xc7\xff\xec\x02\xf5\x01\ +\xce\xff\xec\x02\xf5\x01\xd5\xff\xec\x02\xf5\x01\xf2\xff\xec\x02\ +\xf5\x02\x08\xff\xae\x02\xf5\x02\x0c\xff\xae\x02\xf5\x02r\xff\ +\xd7\x02\xf5\x02s\xff\xec\x02\xf5\x02z\xff\xec\x02\xf5\x02\ +|\xff\xd7\x02\xf5\x02\x80\xff\xec\x02\xf5\x02\x82\xff\xec\x02\ +\xf5\x02\x9f\xff\xd7\x02\xf5\x02\xa1\xff\xec\x02\xf5\x02\xa9\xff\ +\xec\x02\xf5\x02\xb5\xff\xc3\x02\xf5\x02\xb7\xff\xec\x02\xf5\x02\ +\xb9\xff\xec\x02\xf5\x02\xbb\xff\xd7\x02\xf5\x02\xbd\xff\xec\x02\ +\xf5\x02\xbf\xff\xd7\x02\xf5\x02\xc1\xff\xd7\x02\xf5\x02\xca\xff\ +\xd7\x02\xf5\x02\xce\xff\xd7\x02\xf5\x02\xcf\xff\xec\x02\xf5\x02\ +\xd4\xff\xd7\x02\xf5\x02\xd9\xff\xd7\x02\xf5\x02\xdb\xff\xd7\x02\ +\xf5\x02\xdd\xff\xd7\x02\xf5\x02\xe5\xff\xd7\x02\xf5\x02\xe7\xff\ +\xec\x02\xf5\x02\xf5\xff\xec\x02\xf5\x02\xf7\xff\xd7\x02\xf5\x02\ +\xf9\xff\xd7\x02\xf5\x02\xfb\xff\xd7\x02\xf5\x02\xfd\xff\xd7\x02\ +\xf5\x03\x05\xff\xd7\x02\xf5\x03\x07\xff\xd7\x02\xf5\x03\x0d\xff\ +\xd7\x02\xf5\x03\x0f\xff\xd7\x02\xf5\x03\x11\xff\xd7\x02\xf5\x03\ +\x12\xff\xec\x02\xf5\x03\x17\xff\xec\x02\xf5\x03\x1b\xff\xd7\x02\ +\xf5\x03\x1c\xff\xec\x02\xf6\x00\x05\xff\xec\x02\xf6\x00\x0a\xff\ +\xec\x02\xf6\x01\xd0\xff\xd7\x02\xf6\x01\xdc\xff\xec\x02\xf6\x01\ +\xdd\xff\xec\x02\xf6\x01\xdf\xff\xd7\x02\xf6\x01\xe1\xff\xec\x02\ +\xf6\x01\xe4\xff\xec\x02\xf6\x01\xf6\xff\xec\x02\xf6\x02\x07\xff\ +\xec\x02\xf6\x02\x0b\xff\xec\x02\xf6\x02\xa0\xff\xd7\x02\xf6\x02\ +\xaa\xff\xec\x02\xf6\x02\xb6\xff\xec\x02\xf6\x02\xbc\xff\xd7\x02\ +\xf6\x02\xbe\xff\xec\x02\xf6\x02\xc0\xff\xec\x02\xf6\x02\xc2\xff\ +\xec\x02\xf6\x02\xcb\xff\xd7\x02\xf6\x02\xd5\xff\xec\x02\xf6\x02\ +\xe6\xff\xd7\x02\xf6\x02\xf8\xff\xec\x02\xf6\x02\xfa\xff\xec\x02\ +\xf6\x02\xfc\xff\xec\x02\xf6\x02\xfe\xff\xec\x02\xf6\x03\x06\xff\ +\xd7\x02\xf6\x03\x08\xff\xd7\x02\xf6\x03\x0e\xff\xec\x02\xf6\x03\ +\x10\xff\xec\x02\xf6\x03\x18\xff\xec\x02\xf7\x00\x0f\xff\x85\x02\ +\xf7\x00\x11\xff\x85\x02\xf7\x01\x9f\xff\xec\x02\xf7\x01\xa4\xff\ +\x9a\x02\xf7\x01\xaa\xffq\x02\xf7\x01\xae\xff\x9a\x02\xf7\x01\ +\xb5\xff\x9a\x02\xf7\x01\xb8\xff\xec\x02\xf7\x01\xbb\xff\xec\x02\ +\xf7\x01\xbe\xff\xc3\x02\xf7\x01\xc9\xff\xec\x02\xf7\x01\xce\xff\ +\xae\x02\xf7\x01\xcf\xff\xd7\x02\xf7\x01\xd5\xff\xae\x02\xf7\x01\ +\xd8\xff\xd7\x02\xf7\x01\xdb\xff\xd7\x02\xf7\x01\xde\xff\xd7\x02\ +\xf7\x01\xe1\xff\xd7\x02\xf7\x01\xea\xff\xd7\x02\xf7\x01\xeb\x00\ +f\x02\xf7\x01\xed\xff\xd7\x02\xf7\x01\xee\xff\xec\x02\xf7\x01\ +\xf2\xff\xae\x02\xf7\x01\xf4\x00f\x02\xf7\x02\x08\xff\x85\x02\ +\xf7\x02\x0c\xff\x85\x02\xf7\x02j\xff\xd7\x02\xf7\x02l\xff\ +\xec\x02\xf7\x02r\xffq\x02\xf7\x02s\xff\xae\x02\xf7\x02\ +~\xff\xec\x02\xf7\x02\x7f\xff\xd7\x02\xf7\x02\x84\xff\xec\x02\ +\xf7\x02\x85\xff\xd7\x02\xf7\x02\x86\xff\xec\x02\xf7\x02\x87\xff\ +\xd7\x02\xf7\x02\x88\xff\xec\x02\xf7\x02\x89\xff\xd7\x02\xf7\x02\ +\x8a\xff\xec\x02\xf7\x02\x8c\xff\xec\x02\xf7\x02\x8d\xff\xd7\x02\ +\xf7\x02\x98\x00f\x02\xf7\x02\xa8\x00f\x02\xf7\x02\xb1\xff\ +\xec\x02\xf7\x02\xb2\xff\xd7\x02\xf7\x02\xb3\xff\xec\x02\xf7\x02\ +\xb4\xff\xd7\x02\xf7\x02\xc0\xff\xd7\x02\xf7\x02\xc2\xff\xd7\x02\ +\xf7\x02\xc5\xff\xd7\x02\xf7\x02\xc6\xff\xc3\x02\xf7\x02\xc7\xff\ +\xd7\x02\xf7\x02\xc8\xff\xc3\x02\xf7\x02\xce\xff\x9a\x02\xf7\x02\ +\xcf\xff\xae\x02\xf7\x02\xd5\xff\xd7\x02\xf7\x02\xd9\xffq\x02\ +\xf7\x02\xdb\xffq\x02\xf7\x02\xdd\xffq\x02\xf7\x02\xe0\xff\ +\xd7\x02\xf7\x02\xef\xff\xec\x02\xf7\x02\xf0\xff\xd7\x02\xf7\x02\ +\xf1\xff\xec\x02\xf7\x02\xf2\xff\xd7\x02\xf7\x02\xf3\xff\xec\x02\ +\xf7\x02\xf4\xff\xd7\x02\xf7\x02\xfe\xff\xd7\x02\xf7\x03\x09\xff\ +q\x02\xf7\x03\x0a\xff\xd7\x02\xf7\x03\x0b\xffq\x02\xf7\x03\ +\x0c\xff\xd7\x02\xf7\x03\x11\xff\x9a\x02\xf7\x03\x12\xff\xae\x02\ +\xf7\x03\x15\xff\xec\x02\xf7\x03\x16\xff\xd7\x02\xf7\x03\x1a\xff\ +\xd7\x02\xf7\x03\x1b\xff\x9a\x02\xf7\x03\x1c\xff\xae\x02\xf8\x00\ +\x0f\xff\xae\x02\xf8\x00\x11\xff\xae\x02\xf8\x01\xce\xff\xd7\x02\ +\xf8\x01\xd5\xff\xd7\x02\xf8\x01\xf2\xff\xd7\x02\xf8\x02\x08\xff\ +\xae\x02\xf8\x02\x0c\xff\xae\x02\xf8\x02s\xff\xd7\x02\xf8\x02\ +\xcf\xff\xd7\x02\xf8\x03\x12\xff\xd7\x02\xf8\x03\x1c\xff\xd7\x02\ +\xf9\x00\x0f\xff\x85\x02\xf9\x00\x11\xff\x85\x02\xf9\x01\x9f\xff\ +\xec\x02\xf9\x01\xa4\xff\x9a\x02\xf9\x01\xaa\xffq\x02\xf9\x01\ +\xae\xff\x9a\x02\xf9\x01\xb5\xff\x9a\x02\xf9\x01\xb8\xff\xec\x02\ +\xf9\x01\xbb\xff\xec\x02\xf9\x01\xbe\xff\xc3\x02\xf9\x01\xc9\xff\ +\xec\x02\xf9\x01\xce\xff\xae\x02\xf9\x01\xcf\xff\xd7\x02\xf9\x01\ +\xd5\xff\xae\x02\xf9\x01\xd8\xff\xd7\x02\xf9\x01\xdb\xff\xd7\x02\ +\xf9\x01\xde\xff\xd7\x02\xf9\x01\xe1\xff\xd7\x02\xf9\x01\xea\xff\ +\xd7\x02\xf9\x01\xeb\x00f\x02\xf9\x01\xed\xff\xd7\x02\xf9\x01\ +\xee\xff\xec\x02\xf9\x01\xf2\xff\xae\x02\xf9\x01\xf4\x00f\x02\ +\xf9\x02\x08\xff\x85\x02\xf9\x02\x0c\xff\x85\x02\xf9\x02j\xff\ +\xd7\x02\xf9\x02l\xff\xec\x02\xf9\x02r\xffq\x02\xf9\x02\ +s\xff\xae\x02\xf9\x02~\xff\xec\x02\xf9\x02\x7f\xff\xd7\x02\ +\xf9\x02\x84\xff\xec\x02\xf9\x02\x85\xff\xd7\x02\xf9\x02\x86\xff\ +\xec\x02\xf9\x02\x87\xff\xd7\x02\xf9\x02\x88\xff\xec\x02\xf9\x02\ +\x89\xff\xd7\x02\xf9\x02\x8a\xff\xec\x02\xf9\x02\x8c\xff\xec\x02\ +\xf9\x02\x8d\xff\xd7\x02\xf9\x02\x98\x00f\x02\xf9\x02\xa8\x00\ +f\x02\xf9\x02\xb1\xff\xec\x02\xf9\x02\xb2\xff\xd7\x02\xf9\x02\ +\xb3\xff\xec\x02\xf9\x02\xb4\xff\xd7\x02\xf9\x02\xc0\xff\xd7\x02\ +\xf9\x02\xc2\xff\xd7\x02\xf9\x02\xc5\xff\xd7\x02\xf9\x02\xc6\xff\ +\xc3\x02\xf9\x02\xc7\xff\xd7\x02\xf9\x02\xc8\xff\xc3\x02\xf9\x02\ +\xce\xff\x9a\x02\xf9\x02\xcf\xff\xae\x02\xf9\x02\xd5\xff\xd7\x02\ +\xf9\x02\xd9\xffq\x02\xf9\x02\xdb\xffq\x02\xf9\x02\xdd\xff\ +q\x02\xf9\x02\xe0\xff\xd7\x02\xf9\x02\xef\xff\xec\x02\xf9\x02\ +\xf0\xff\xd7\x02\xf9\x02\xf1\xff\xec\x02\xf9\x02\xf2\xff\xd7\x02\ +\xf9\x02\xf3\xff\xec\x02\xf9\x02\xf4\xff\xd7\x02\xf9\x02\xfe\xff\ +\xd7\x02\xf9\x03\x09\xffq\x02\xf9\x03\x0a\xff\xd7\x02\xf9\x03\ +\x0b\xffq\x02\xf9\x03\x0c\xff\xd7\x02\xf9\x03\x11\xff\x9a\x02\ +\xf9\x03\x12\xff\xae\x02\xf9\x03\x15\xff\xec\x02\xf9\x03\x16\xff\ +\xd7\x02\xf9\x03\x1a\xff\xd7\x02\xf9\x03\x1b\xff\x9a\x02\xf9\x03\ +\x1c\xff\xae\x02\xfa\x00\x0f\xff\xae\x02\xfa\x00\x11\xff\xae\x02\ +\xfa\x01\xce\xff\xd7\x02\xfa\x01\xd5\xff\xd7\x02\xfa\x01\xf2\xff\ +\xd7\x02\xfa\x02\x08\xff\xae\x02\xfa\x02\x0c\xff\xae\x02\xfa\x02\ +s\xff\xd7\x02\xfa\x02\xcf\xff\xd7\x02\xfa\x03\x12\xff\xd7\x02\ +\xfa\x03\x1c\xff\xd7\x02\xfb\x00\x0f\xff\x85\x02\xfb\x00\x11\xff\ +\x85\x02\xfb\x01\x9f\xff\xec\x02\xfb\x01\xa4\xff\x9a\x02\xfb\x01\ +\xaa\xffq\x02\xfb\x01\xae\xff\x9a\x02\xfb\x01\xb5\xff\x9a\x02\ +\xfb\x01\xb8\xff\xec\x02\xfb\x01\xbb\xff\xec\x02\xfb\x01\xbe\xff\ +\xc3\x02\xfb\x01\xc9\xff\xec\x02\xfb\x01\xce\xff\xae\x02\xfb\x01\ +\xcf\xff\xd7\x02\xfb\x01\xd5\xff\xae\x02\xfb\x01\xd8\xff\xd7\x02\ +\xfb\x01\xdb\xff\xd7\x02\xfb\x01\xde\xff\xd7\x02\xfb\x01\xe1\xff\ +\xd7\x02\xfb\x01\xea\xff\xd7\x02\xfb\x01\xeb\x00f\x02\xfb\x01\ +\xed\xff\xd7\x02\xfb\x01\xee\xff\xec\x02\xfb\x01\xf2\xff\xae\x02\ +\xfb\x01\xf4\x00f\x02\xfb\x02\x08\xff\x85\x02\xfb\x02\x0c\xff\ +\x85\x02\xfb\x02j\xff\xd7\x02\xfb\x02l\xff\xec\x02\xfb\x02\ +r\xffq\x02\xfb\x02s\xff\xae\x02\xfb\x02~\xff\xec\x02\ +\xfb\x02\x7f\xff\xd7\x02\xfb\x02\x84\xff\xec\x02\xfb\x02\x85\xff\ +\xd7\x02\xfb\x02\x86\xff\xec\x02\xfb\x02\x87\xff\xd7\x02\xfb\x02\ +\x88\xff\xec\x02\xfb\x02\x89\xff\xd7\x02\xfb\x02\x8a\xff\xec\x02\ +\xfb\x02\x8c\xff\xec\x02\xfb\x02\x8d\xff\xd7\x02\xfb\x02\x98\x00\ +f\x02\xfb\x02\xa8\x00f\x02\xfb\x02\xb1\xff\xec\x02\xfb\x02\ +\xb2\xff\xd7\x02\xfb\x02\xb3\xff\xec\x02\xfb\x02\xb4\xff\xd7\x02\ +\xfb\x02\xc0\xff\xd7\x02\xfb\x02\xc2\xff\xd7\x02\xfb\x02\xc5\xff\ +\xd7\x02\xfb\x02\xc6\xff\xc3\x02\xfb\x02\xc7\xff\xd7\x02\xfb\x02\ +\xc8\xff\xc3\x02\xfb\x02\xce\xff\x9a\x02\xfb\x02\xcf\xff\xae\x02\ +\xfb\x02\xd5\xff\xd7\x02\xfb\x02\xd9\xffq\x02\xfb\x02\xdb\xff\ +q\x02\xfb\x02\xdd\xffq\x02\xfb\x02\xe0\xff\xd7\x02\xfb\x02\ +\xef\xff\xec\x02\xfb\x02\xf0\xff\xd7\x02\xfb\x02\xf1\xff\xec\x02\ +\xfb\x02\xf2\xff\xd7\x02\xfb\x02\xf3\xff\xec\x02\xfb\x02\xf4\xff\ +\xd7\x02\xfb\x02\xfe\xff\xd7\x02\xfb\x03\x09\xffq\x02\xfb\x03\ +\x0a\xff\xd7\x02\xfb\x03\x0b\xffq\x02\xfb\x03\x0c\xff\xd7\x02\ +\xfb\x03\x11\xff\x9a\x02\xfb\x03\x12\xff\xae\x02\xfb\x03\x15\xff\ +\xec\x02\xfb\x03\x16\xff\xd7\x02\xfb\x03\x1a\xff\xd7\x02\xfb\x03\ +\x1b\xff\x9a\x02\xfb\x03\x1c\xff\xae\x02\xfc\x00\x0f\xff\xae\x02\ +\xfc\x00\x11\xff\xae\x02\xfc\x01\xce\xff\xd7\x02\xfc\x01\xd5\xff\ +\xd7\x02\xfc\x01\xf2\xff\xd7\x02\xfc\x02\x08\xff\xae\x02\xfc\x02\ +\x0c\xff\xae\x02\xfc\x02s\xff\xd7\x02\xfc\x02\xcf\xff\xd7\x02\ +\xfc\x03\x12\xff\xd7\x02\xfc\x03\x1c\xff\xd7\x02\xff\x00\x0f\xff\ +\x85\x02\xff\x00\x10\xff\xae\x02\xff\x00\x11\xff\x85\x02\xff\x01\ +\x9f\xff\xd7\x02\xff\x01\xa4\xff\x9a\x02\xff\x01\xaa\xffq\x02\ +\xff\x01\xae\xff\x9a\x02\xff\x01\xb5\xff\x9a\x02\xff\x01\xb8\xff\ +\xd7\x02\xff\x01\xbb\xff\xd7\x02\xff\x01\xbc\x00)\x02\xff\x01\ +\xbe\xff\xae\x02\xff\x01\xcc\xff\x9a\x02\xff\x01\xcd\xff\x9a\x02\ +\xff\x01\xce\xff\x85\x02\xff\x01\xcf\xffq\x02\xff\x01\xd0\xff\ +\xd7\x02\xff\x01\xd1\xff\xd7\x02\xff\x01\xd2\xff\x9a\x02\xff\x01\ +\xd3\xff\x9a\x02\xff\x01\xd4\xff\x9a\x02\xff\x01\xd5\xff\x85\x02\ +\xff\x01\xd6\xff\x9a\x02\xff\x01\xd7\xff\x9a\x02\xff\x01\xd8\xff\ +q\x02\xff\x01\xd9\xff\x9a\x02\xff\x01\xda\xff\x9a\x02\xff\x01\ +\xdb\xffq\x02\xff\x01\xdc\xff\xae\x02\xff\x01\xdd\xff\xae\x02\ +\xff\x01\xde\xffq\x02\xff\x01\xdf\xff\xd7\x02\xff\x01\xe0\xff\ +\x9a\x02\xff\x01\xe1\xff\x9a\x02\xff\x01\xe2\xff\x9a\x02\xff\x01\ +\xe3\xff\x9a\x02\xff\x01\xe4\xff\xae\x02\xff\x01\xe5\xff\x9a\x02\ +\xff\x01\xe6\xff\x9a\x02\xff\x01\xe7\xff\xd7\x02\xff\x01\xe8\xff\ +\x9a\x02\xff\x01\xe9\xff\xc3\x02\xff\x01\xea\xffq\x02\xff\x01\ +\xec\xff\x9a\x02\xff\x01\xed\xffq\x02\xff\x01\xee\xff\x85\x02\ +\xff\x01\xf2\xff\x85\x02\xff\x01\xf3\xff\x9a\x02\xff\x01\xf5\xff\ +\x9a\x02\xff\x01\xf6\xff\xae\x02\xff\x01\xf7\xff\x9a\x02\xff\x01\ +\xf9\xff\x9a\x02\xff\x02\x02\xff\xae\x02\xff\x02\x03\xff\xae\x02\ +\xff\x02\x04\xff\xae\x02\xff\x02\x08\xff\x85\x02\xff\x02\x0c\xff\ +\x85\x02\xff\x02j\xffq\x02\xff\x02k\xff\x9a\x02\xff\x02\ +l\xff\xd7\x02\xff\x02m\xff\xd7\x02\xff\x02q\xff\x9a\x02\ +\xff\x02r\xffq\x02\xff\x02s\xff\x85\x02\xff\x02u\xff\ +\x9a\x02\xff\x02w\xff\x9a\x02\xff\x02y\xff\x9a\x02\xff\x02\ +}\xff\x9a\x02\xff\x02~\xff\xd7\x02\xff\x02\x7f\xffq\x02\ +\xff\x02\x81\xff\xd7\x02\xff\x02\x83\xff\xd7\x02\xff\x02\x84\xff\ +\xd7\x02\xff\x02\x85\xffq\x02\xff\x02\x86\xff\xd7\x02\xff\x02\ +\x87\xffq\x02\xff\x02\x88\xff\xd7\x02\xff\x02\x89\xffq\x02\ +\xff\x02\x8a\xff\xd7\x02\xff\x02\x8b\xff\xd7\x02\xff\x02\x8c\xff\ +\xd7\x02\xff\x02\x8d\xffq\x02\xff\x02\x96\xff\x9a\x02\xff\x02\ +\x9a\xff\x9a\x02\xff\x02\x9e\xff\x9a\x02\xff\x02\xa0\xff\xd7\x02\ +\xff\x02\xa2\xff\xd7\x02\xff\x02\xa4\xff\x9a\x02\xff\x02\xa6\xff\ +\x9a\x02\xff\x02\xaa\xff\xae\x02\xff\x02\xac\xff\x9a\x02\xff\x02\ +\xae\xff\x9a\x02\xff\x02\xb0\xff\x9a\x02\xff\x02\xb1\xff\xd7\x02\ +\xff\x02\xb2\xffq\x02\xff\x02\xb3\xff\xd7\x02\xff\x02\xb4\xff\ +q\x02\xff\x02\xb5\x00)\x02\xff\x02\xb6\xff\xae\x02\xff\x02\ +\xb8\xff\xae\x02\xff\x02\xba\xff\xae\x02\xff\x02\xbc\xff\xd7\x02\ +\xff\x02\xbe\xff\xae\x02\xff\x02\xc0\xff\x9a\x02\xff\x02\xc2\xff\ +\x9a\x02\xff\x02\xc4\xff\x9a\x02\xff\x02\xc5\xff\x9a\x02\xff\x02\ +\xc6\xffq\x02\xff\x02\xc7\xff\x9a\x02\xff\x02\xc8\xffq\x02\ +\xff\x02\xcb\xff\xd7\x02\xff\x02\xcd\xff\x9a\x02\xff\x02\xce\xff\ +\x9a\x02\xff\x02\xcf\xff\x85\x02\xff\x02\xd1\xff\x9a\x02\xff\x02\ +\xd3\xff\x9a\x02\xff\x02\xd5\xff\x9a\x02\xff\x02\xd7\xff\x9a\x02\ +\xff\x02\xd9\xffq\x02\xff\x02\xdb\xffq\x02\xff\x02\xdd\xff\ +q\x02\xff\x02\xe0\xffq\x02\xff\x02\xe6\xff\xd7\x02\xff\x02\ +\xe8\xff\xd7\x02\xff\x02\xea\xff\xc3\x02\xff\x02\xec\xff\x9a\x02\ +\xff\x02\xee\xff\x9a\x02\xff\x02\xef\xff\xd7\x02\xff\x02\xf0\xff\ +q\x02\xff\x02\xf1\xff\xd7\x02\xff\x02\xf2\xffq\x02\xff\x02\ +\xf3\xff\xd7\x02\xff\x02\xf4\xffq\x02\xff\x02\xf6\xff\xd7\x02\ +\xff\x02\xf8\xff\xae\x02\xff\x02\xfa\xff\xae\x02\xff\x02\xfc\xff\ +\xae\x02\xff\x02\xfe\xff\x9a\x02\xff\x03\x00\xff\x9a\x02\xff\x03\ +\x02\xff\x9a\x02\xff\x03\x06\xff\xd7\x02\xff\x03\x08\xff\xd7\x02\ +\xff\x03\x09\xffq\x02\xff\x03\x0a\xffq\x02\xff\x03\x0b\xff\ +q\x02\xff\x03\x0c\xffq\x02\xff\x03\x0e\xff\x9a\x02\xff\x03\ +\x10\xff\x9a\x02\xff\x03\x11\xff\x9a\x02\xff\x03\x12\xff\x85\x02\ +\xff\x03\x14\xff\x9a\x02\xff\x03\x15\xff\xd7\x02\xff\x03\x16\xff\ +q\x02\xff\x03\x18\xff\xae\x02\xff\x03\x1a\xffq\x02\xff\x03\ +\x1b\xff\x9a\x02\xff\x03\x1c\xff\x85\x03\x00\x00\x0f\xff\x9a\x03\ +\x00\x00\x10\xff\xd7\x03\x00\x00\x11\xff\x9a\x03\x00\x01\xce\xff\ +\xc3\x03\x00\x01\xcf\xff\xec\x03\x00\x01\xd5\xff\xc3\x03\x00\x01\ +\xd8\xff\xec\x03\x00\x01\xdb\xff\xec\x03\x00\x01\xde\xff\xec\x03\ +\x00\x01\xea\xff\xec\x03\x00\x01\xed\xff\xec\x03\x00\x01\xf2\xff\ +\xc3\x03\x00\x02\x02\xff\xd7\x03\x00\x02\x03\xff\xd7\x03\x00\x02\ +\x04\xff\xd7\x03\x00\x02\x08\xff\x9a\x03\x00\x02\x0c\xff\x9a\x03\ +\x00\x02j\xff\xec\x03\x00\x02s\xff\xc3\x03\x00\x02\x7f\xff\ +\xec\x03\x00\x02\x85\xff\xec\x03\x00\x02\x87\xff\xec\x03\x00\x02\ +\x89\xff\xec\x03\x00\x02\x8d\xff\xec\x03\x00\x02\xb2\xff\xec\x03\ +\x00\x02\xb4\xff\xec\x03\x00\x02\xcf\xff\xc3\x03\x00\x02\xe0\xff\ +\xec\x03\x00\x02\xf0\xff\xec\x03\x00\x02\xf2\xff\xec\x03\x00\x02\ +\xf4\xff\xec\x03\x00\x03\x0a\xff\xec\x03\x00\x03\x0c\xff\xec\x03\ +\x00\x03\x12\xff\xc3\x03\x00\x03\x16\xff\xec\x03\x00\x03\x1a\xff\ +\xec\x03\x00\x03\x1c\xff\xc3\x03\x03\x00\x0f\xff\x9a\x03\x03\x00\ +\x10\xff\xd7\x03\x03\x00\x11\xff\x9a\x03\x03\x01\x9d\x00)\x03\ +\x03\x01\x9f\xff\xd7\x03\x03\x01\xa4\xff\xae\x03\x03\x01\xa6\x00\ +)\x03\x03\x01\xaa\xff\x85\x03\x03\x01\xae\xff\xae\x03\x03\x01\ +\xb5\xff\xae\x03\x03\x01\xb8\xff\xd7\x03\x03\x01\xbb\xff\xd7\x03\ +\x03\x01\xbc\x00)\x03\x03\x01\xbe\xff\xc3\x03\x03\x01\xc4\x00\ +)\x03\x03\x01\xcc\xff\xc3\x03\x03\x01\xcd\xff\xc3\x03\x03\x01\ +\xce\xff\x9a\x03\x03\x01\xcf\xff\xae\x03\x03\x01\xd0\xff\xd7\x03\ +\x03\x01\xd1\xff\xd7\x03\x03\x01\xd2\xff\xc3\x03\x03\x01\xd3\xff\ +\xc3\x03\x03\x01\xd4\xff\xc3\x03\x03\x01\xd5\xff\x9a\x03\x03\x01\ +\xd6\xff\xc3\x03\x03\x01\xd7\xff\xc3\x03\x03\x01\xd8\xff\xae\x03\ +\x03\x01\xd9\xff\xc3\x03\x03\x01\xda\xff\xc3\x03\x03\x01\xdb\xff\ +\xae\x03\x03\x01\xde\xff\xae\x03\x03\x01\xdf\xff\xd7\x03\x03\x01\ +\xe0\xff\xc3\x03\x03\x01\xe1\xff\x9a\x03\x03\x01\xe2\xff\xc3\x03\ +\x03\x01\xe3\xff\xc3\x03\x03\x01\xe5\xff\xc3\x03\x03\x01\xe6\xff\ +\xc3\x03\x03\x01\xe7\xff\xd7\x03\x03\x01\xe8\xff\xc3\x03\x03\x01\ +\xea\xff\xae\x03\x03\x01\xeb\x00)\x03\x03\x01\xec\xff\xc3\x03\ +\x03\x01\xed\xff\xae\x03\x03\x01\xee\xff\xc3\x03\x03\x01\xf2\xff\ +\x9a\x03\x03\x01\xf3\xff\xc3\x03\x03\x01\xf4\x00)\x03\x03\x01\ +\xf5\xff\xc3\x03\x03\x01\xf7\xff\xc3\x03\x03\x01\xf9\xff\xc3\x03\ +\x03\x02\x02\xff\xd7\x03\x03\x02\x03\xff\xd7\x03\x03\x02\x04\xff\ +\xd7\x03\x03\x02\x08\xff\x9a\x03\x03\x02\x0c\xff\x9a\x03\x03\x02\ +j\xff\xae\x03\x03\x02k\xff\xc3\x03\x03\x02l\xff\xd7\x03\ +\x03\x02q\xff\xc3\x03\x03\x02r\xff\x85\x03\x03\x02s\xff\ +\x9a\x03\x03\x02u\xff\xc3\x03\x03\x02w\xff\xd7\x03\x03\x02\ +y\xff\xc3\x03\x03\x02}\xff\xc3\x03\x03\x02~\xff\xd7\x03\ +\x03\x02\x7f\xff\xae\x03\x03\x02\x84\xff\xd7\x03\x03\x02\x85\xff\ +\xae\x03\x03\x02\x86\xff\xd7\x03\x03\x02\x87\xff\xae\x03\x03\x02\ +\x88\xff\xd7\x03\x03\x02\x89\xff\xae\x03\x03\x02\x8a\xff\xd7\x03\ +\x03\x02\x8c\xff\xd7\x03\x03\x02\x8d\xff\xae\x03\x03\x02\x96\xff\ +\xc3\x03\x03\x02\x98\x00)\x03\x03\x02\x9a\xff\xc3\x03\x03\x02\ +\x9e\xff\xc3\x03\x03\x02\xa0\xff\xd7\x03\x03\x02\xa2\xff\xd7\x03\ +\x03\x02\xa4\xff\xc3\x03\x03\x02\xa6\xff\xc3\x03\x03\x02\xa8\x00\ +)\x03\x03\x02\xa9\x00)\x03\x03\x02\xac\xff\xc3\x03\x03\x02\ +\xae\xff\xc3\x03\x03\x02\xb0\xff\xc3\x03\x03\x02\xb1\xff\xd7\x03\ +\x03\x02\xb2\xff\xae\x03\x03\x02\xb3\xff\xd7\x03\x03\x02\xb4\xff\ +\xae\x03\x03\x02\xb5\x00)\x03\x03\x02\xbc\xff\xd7\x03\x03\x02\ +\xbd\x00)\x03\x03\x02\xc0\xff\x9a\x03\x03\x02\xc2\xff\x9a\x03\ +\x03\x02\xc4\xff\xc3\x03\x03\x02\xc5\xff\xd7\x03\x03\x02\xc6\xff\ +\xc3\x03\x03\x02\xc7\xff\xd7\x03\x03\x02\xc8\xff\xc3\x03\x03\x02\ +\xcb\xff\xd7\x03\x03\x02\xcd\xff\xc3\x03\x03\x02\xce\xff\xae\x03\ +\x03\x02\xcf\xff\x9a\x03\x03\x02\xd1\xff\xc3\x03\x03\x02\xd3\xff\ +\xc3\x03\x03\x02\xd5\xff\x9a\x03\x03\x02\xd7\xff\xc3\x03\x03\x02\ +\xd9\xff\x85\x03\x03\x02\xdb\xff\x85\x03\x03\x02\xdd\xff\x85\x03\ +\x03\x02\xe0\xff\xae\x03\x03\x02\xe6\xff\xd7\x03\x03\x02\xe8\xff\ +\xd7\x03\x03\x02\xec\xff\xc3\x03\x03\x02\xee\xff\xc3\x03\x03\x02\ +\xef\xff\xd7\x03\x03\x02\xf0\xff\xae\x03\x03\x02\xf1\xff\xd7\x03\ +\x03\x02\xf2\xff\xae\x03\x03\x02\xf3\xff\xd7\x03\x03\x02\xf4\xff\ +\xae\x03\x03\x02\xf6\xff\xd7\x03\x03\x02\xfe\xff\x9a\x03\x03\x03\ +\x00\xff\xc3\x03\x03\x03\x02\xff\xc3\x03\x03\x03\x06\xff\xd7\x03\ +\x03\x03\x08\xff\xd7\x03\x03\x03\x09\xff\x9a\x03\x03\x03\x0a\xff\ +\xae\x03\x03\x03\x0b\xff\x9a\x03\x03\x03\x0c\xff\xae\x03\x03\x03\ +\x0e\xff\xd7\x03\x03\x03\x10\xff\xd7\x03\x03\x03\x11\xff\xae\x03\ +\x03\x03\x12\xff\x9a\x03\x03\x03\x14\xff\xc3\x03\x03\x03\x15\xff\ +\xd7\x03\x03\x03\x16\xff\xae\x03\x03\x03\x17\x00)\x03\x03\x03\ +\x1a\xff\xae\x03\x03\x03\x1b\xff\xae\x03\x03\x03\x1c\xff\x9a\x03\ +\x04\x00\x0f\xff\xc3\x03\x04\x00\x11\xff\xc3\x03\x04\x01\xce\xff\ +\xc3\x03\x04\x01\xcf\xff\xd7\x03\x04\x01\xd5\xff\xc3\x03\x04\x01\ +\xd8\xff\xd7\x03\x04\x01\xdb\xff\xd7\x03\x04\x01\xde\xff\xd7\x03\ +\x04\x01\xea\xff\xd7\x03\x04\x01\xed\xff\xd7\x03\x04\x01\xf2\xff\ +\xc3\x03\x04\x02\x08\xff\xc3\x03\x04\x02\x0c\xff\xc3\x03\x04\x02\ +j\xff\xd7\x03\x04\x02s\xff\xc3\x03\x04\x02\x7f\xff\xd7\x03\ +\x04\x02\x85\xff\xd7\x03\x04\x02\x87\xff\xd7\x03\x04\x02\x89\xff\ +\xd7\x03\x04\x02\x8d\xff\xd7\x03\x04\x02\xb2\xff\xd7\x03\x04\x02\ +\xb4\xff\xd7\x03\x04\x02\xcf\xff\xc3\x03\x04\x02\xe0\xff\xd7\x03\ +\x04\x02\xf0\xff\xd7\x03\x04\x02\xf2\xff\xd7\x03\x04\x02\xf4\xff\ +\xd7\x03\x04\x03\x0a\xff\xd7\x03\x04\x03\x0c\xff\xd7\x03\x04\x03\ +\x12\xff\xc3\x03\x04\x03\x16\xff\xd7\x03\x04\x03\x1a\xff\xd7\x03\ +\x04\x03\x1c\xff\xc3\x03\x05\x01\x9f\xff\xd7\x03\x05\x01\xa3\x00\ +\xe1\x03\x05\x01\xb8\xff\xd7\x03\x05\x01\xbb\xff\xd7\x03\x05\x01\ +\xbe\xff\xc3\x03\x05\x01\xdc\xff\xd7\x03\x05\x01\xe1\xff\xae\x03\ +\x05\x01\xe4\xff\xd7\x03\x05\x02l\xff\xd7\x03\x05\x02{\x00\ +=\x03\x05\x02}\xff\xec\x03\x05\x02~\xff\xd7\x03\x05\x02\ +\x84\xff\xd7\x03\x05\x02\x86\xff\xd7\x03\x05\x02\x88\xff\xd7\x03\ +\x05\x02\x8a\xff\xd7\x03\x05\x02\x8c\xff\xd7\x03\x05\x02\xaa\xff\ +\xd7\x03\x05\x02\xb1\xff\xd7\x03\x05\x02\xb3\xff\xd7\x03\x05\x02\ +\xb6\xff\xd7\x03\x05\x02\xbe\xff\xd7\x03\x05\x02\xc0\xff\xae\x03\ +\x05\x02\xc2\xff\xae\x03\x05\x02\xc5\xff\xc3\x03\x05\x02\xc6\xff\ +\xd7\x03\x05\x02\xc7\xff\xc3\x03\x05\x02\xc8\xff\xd7\x03\x05\x02\ +\xd5\xff\xae\x03\x05\x02\xef\xff\xd7\x03\x05\x02\xf1\xff\xd7\x03\ +\x05\x02\xf3\xff\xd7\x03\x05\x02\xfe\xff\xae\x03\x05\x03\x0e\xff\ +\xd7\x03\x05\x03\x10\xff\xd7\x03\x05\x03\x15\xff\xd7\x03\x05\x03\ +\x18\xff\xd7\x03\x06\x01\xcf\xff\xec\x03\x06\x01\xd8\xff\xec\x03\ +\x06\x01\xdb\xff\xec\x03\x06\x01\xde\xff\xec\x03\x06\x01\xe1\xff\ +\xec\x03\x06\x01\xea\xff\xec\x03\x06\x01\xed\xff\xec\x03\x06\x02\ +j\xff\xec\x03\x06\x02\x7f\xff\xec\x03\x06\x02\x85\xff\xec\x03\ +\x06\x02\x87\xff\xec\x03\x06\x02\x89\xff\xec\x03\x06\x02\x8d\xff\ +\xec\x03\x06\x02\xb2\xff\xec\x03\x06\x02\xb4\xff\xec\x03\x06\x02\ +\xc0\xff\xec\x03\x06\x02\xc2\xff\xec\x03\x06\x02\xd5\xff\xec\x03\ +\x06\x02\xe0\xff\xec\x03\x06\x02\xf0\xff\xec\x03\x06\x02\xf2\xff\ +\xec\x03\x06\x02\xf4\xff\xec\x03\x06\x02\xfe\xff\xec\x03\x06\x03\ +\x0a\xff\xec\x03\x06\x03\x0c\xff\xec\x03\x06\x03\x0e\xff\xd7\x03\ +\x06\x03\x10\xff\xd7\x03\x06\x03\x16\xff\xec\x03\x06\x03\x1a\xff\ +\xec\x03\x07\x01\x9f\xff\xd7\x03\x07\x01\xb8\xff\xd7\x03\x07\x01\ +\xbb\xff\xd7\x03\x07\x01\xbe\xff\xd7\x03\x07\x01\xc1\xff\xd7\x03\ +\x07\x01\xe1\xff\xd7\x03\x07\x02l\xff\xd7\x03\x07\x02|\xff\ +\xd7\x03\x07\x02~\xff\xd7\x03\x07\x02\x84\xff\xd7\x03\x07\x02\ +\x86\xff\xd7\x03\x07\x02\x88\xff\xd7\x03\x07\x02\x8a\xff\xd7\x03\ +\x07\x02\x8c\xff\xd7\x03\x07\x02\xb1\xff\xd7\x03\x07\x02\xb3\xff\ +\xd7\x03\x07\x02\xbf\xff\xd7\x03\x07\x02\xc0\xff\xd7\x03\x07\x02\ +\xc1\xff\xd7\x03\x07\x02\xc2\xff\xd7\x03\x07\x02\xc5\xff\x9a\x03\ +\x07\x02\xc7\xff\x9a\x03\x07\x02\xd4\xff\xd7\x03\x07\x02\xd5\xff\ +\xd7\x03\x07\x02\xef\xff\xd7\x03\x07\x02\xf1\xff\xd7\x03\x07\x02\ +\xf3\xff\xd7\x03\x07\x02\xfd\xff\xd7\x03\x07\x02\xfe\xff\xd7\x03\ +\x07\x03\x09\xff\xd7\x03\x07\x03\x0b\xff\xd7\x03\x07\x03\x0e\xff\ +\xd7\x03\x07\x03\x10\xff\xd7\x03\x07\x03\x15\xff\xd7\x03\x07\x03\ +\x19\xff\xec\x03\x08\x01\xcf\xff\xec\x03\x08\x01\xd8\xff\xec\x03\ +\x08\x01\xdb\xff\xec\x03\x08\x01\xde\xff\xec\x03\x08\x01\xe1\xff\ +\xec\x03\x08\x01\xea\xff\xec\x03\x08\x01\xed\xff\xec\x03\x08\x02\ +j\xff\xec\x03\x08\x02\x7f\xff\xec\x03\x08\x02\x85\xff\xec\x03\ +\x08\x02\x87\xff\xec\x03\x08\x02\x89\xff\xec\x03\x08\x02\x8d\xff\ +\xec\x03\x08\x02\xb2\xff\xec\x03\x08\x02\xb4\xff\xec\x03\x08\x02\ +\xc0\xff\xec\x03\x08\x02\xc2\xff\xec\x03\x08\x02\xd5\xff\xec\x03\ +\x08\x02\xe0\xff\xec\x03\x08\x02\xf0\xff\xec\x03\x08\x02\xf2\xff\ +\xec\x03\x08\x02\xf4\xff\xec\x03\x08\x02\xfe\xff\xec\x03\x08\x03\ +\x0a\xff\xec\x03\x08\x03\x0c\xff\xec\x03\x08\x03\x0e\xff\xd7\x03\ +\x08\x03\x10\xff\xd7\x03\x08\x03\x16\xff\xec\x03\x08\x03\x1a\xff\ +\xec\x03\x0b\x00\x05\xff\x9a\x03\x0b\x00\x0a\xff\x9a\x03\x0b\x01\ +\x9d\xff\xae\x03\x0b\x01\xa6\xff\xae\x03\x0b\x01\xa8\xff\xc3\x03\ +\x0b\x01\xaa\xff\xc3\x03\x0b\x01\xb0\xff\xc3\x03\x0b\x01\xbc\xff\ +q\x03\x0b\x01\xbd\xff\xc3\x03\x0b\x01\xbf\xff\xc3\x03\x0b\x01\ +\xc1\xff\xc3\x03\x0b\x01\xc4\xff\xae\x03\x0b\x01\xd0\xff\xd7\x03\ +\x0b\x01\xdc\xff\xc3\x03\x0b\x01\xdf\xff\xd7\x03\x0b\x01\xe1\xff\ +\xd7\x03\x0b\x01\xe4\xff\xc3\x03\x0b\x02\x07\xff\x9a\x03\x0b\x02\ +\x0b\xff\x9a\x03\x0b\x02r\xff\xc3\x03\x0b\x02v\xff\xd7\x03\ +\x0b\x02|\xff\xc3\x03\x0b\x02\x80\xff\xc3\x03\x0b\x02\x82\xff\ +\xc3\x03\x0b\x02\x9f\xff\xc3\x03\x0b\x02\xa0\xff\xd7\x03\x0b\x02\ +\xa9\xff\xae\x03\x0b\x02\xaa\xff\xc3\x03\x0b\x02\xb5\xffq\x03\ +\x0b\x02\xb6\xff\xc3\x03\x0b\x02\xb7\xff\xc3\x03\x0b\x02\xb9\xff\ +\xc3\x03\x0b\x02\xbb\xff\xc3\x03\x0b\x02\xbc\xff\xd7\x03\x0b\x02\ +\xbd\xff\xae\x03\x0b\x02\xbe\xff\xc3\x03\x0b\x02\xbf\xff\xc3\x03\ +\x0b\x02\xc0\xff\xd7\x03\x0b\x02\xc1\xff\xc3\x03\x0b\x02\xc2\xff\ +\xd7\x03\x0b\x02\xca\xff\xc3\x03\x0b\x02\xcb\xff\xd7\x03\x0b\x02\ +\xd4\xff\xc3\x03\x0b\x02\xd5\xff\xd7\x03\x0b\x02\xd9\xff\xc3\x03\ +\x0b\x02\xdb\xff\xc3\x03\x0b\x02\xdd\xff\xc3\x03\x0b\x02\xe5\xff\ +\xc3\x03\x0b\x02\xe6\xff\xd7\x03\x0b\x02\xf7\xff\xc3\x03\x0b\x02\ +\xf9\xff\xc3\x03\x0b\x02\xfb\xff\xc3\x03\x0b\x02\xfd\xff\xc3\x03\ +\x0b\x02\xfe\xff\xd7\x03\x0b\x03\x05\xff\xc3\x03\x0b\x03\x06\xff\ +\xd7\x03\x0b\x03\x07\xff\xc3\x03\x0b\x03\x08\xff\xd7\x03\x0b\x03\ +\x0d\xff\xd7\x03\x0b\x03\x0e\xff\xd7\x03\x0b\x03\x0f\xff\xd7\x03\ +\x0b\x03\x10\xff\xd7\x03\x0b\x03\x17\xff\xae\x03\x0b\x03\x18\xff\ +\xc3\x03\x0c\x00\x05\xff\x9a\x03\x0c\x00\x0a\xff\x9a\x03\x0c\x01\ +\xd0\xff\xd7\x03\x0c\x01\xdc\xff\xc3\x03\x0c\x01\xdd\xff\xd7\x03\ +\x0c\x01\xdf\xff\xd7\x03\x0c\x01\xe1\xff\xd7\x03\x0c\x01\xe4\xff\ +\xc3\x03\x0c\x01\xf6\xff\xd7\x03\x0c\x02\x07\xff\x9a\x03\x0c\x02\ +\x0b\xff\x9a\x03\x0c\x02\xa0\xff\xd7\x03\x0c\x02\xaa\xff\xc3\x03\ +\x0c\x02\xb6\xff\xc3\x03\x0c\x02\xbc\xff\xd7\x03\x0c\x02\xbe\xff\ +\xc3\x03\x0c\x02\xc0\xff\xd7\x03\x0c\x02\xc2\xff\xd7\x03\x0c\x02\ +\xcb\xff\xd7\x03\x0c\x02\xd5\xff\xd7\x03\x0c\x02\xe6\xff\xd7\x03\ +\x0c\x02\xf8\xff\xd7\x03\x0c\x02\xfa\xff\xd7\x03\x0c\x02\xfc\xff\ +\xd7\x03\x0c\x02\xfe\xff\xd7\x03\x0c\x03\x06\xff\xd7\x03\x0c\x03\ +\x08\xff\xd7\x03\x0c\x03\x0e\xff\x9a\x03\x0c\x03\x10\xff\x9a\x03\ +\x0c\x03\x18\xff\xc3\x03\x0d\x00\x05\xff\x9a\x03\x0d\x00\x0a\xff\ +\x9a\x03\x0d\x01\x9d\xff\xae\x03\x0d\x01\xa6\xff\xae\x03\x0d\x01\ +\xa8\xff\xc3\x03\x0d\x01\xaa\xff\xc3\x03\x0d\x01\xb0\xff\xc3\x03\ +\x0d\x01\xbc\xffq\x03\x0d\x01\xbd\xff\xc3\x03\x0d\x01\xbf\xff\ +\xc3\x03\x0d\x01\xc1\xff\xc3\x03\x0d\x01\xc4\xff\xae\x03\x0d\x01\ +\xd0\xff\xd7\x03\x0d\x01\xdc\xff\xc3\x03\x0d\x01\xdf\xff\xd7\x03\ +\x0d\x01\xe1\xff\xd7\x03\x0d\x01\xe4\xff\xc3\x03\x0d\x02\x07\xff\ +\x9a\x03\x0d\x02\x0b\xff\x9a\x03\x0d\x02r\xff\xc3\x03\x0d\x02\ +v\xff\xd7\x03\x0d\x02|\xff\xc3\x03\x0d\x02\x80\xff\xc3\x03\ +\x0d\x02\x82\xff\xc3\x03\x0d\x02\x9f\xff\xc3\x03\x0d\x02\xa0\xff\ +\xd7\x03\x0d\x02\xa9\xff\xae\x03\x0d\x02\xaa\xff\xc3\x03\x0d\x02\ +\xb5\xffq\x03\x0d\x02\xb6\xff\xc3\x03\x0d\x02\xb7\xff\xc3\x03\ +\x0d\x02\xb9\xff\xc3\x03\x0d\x02\xbb\xff\xc3\x03\x0d\x02\xbc\xff\ +\xd7\x03\x0d\x02\xbd\xff\xae\x03\x0d\x02\xbe\xff\xc3\x03\x0d\x02\ +\xbf\xff\xc3\x03\x0d\x02\xc0\xff\xd7\x03\x0d\x02\xc1\xff\xc3\x03\ +\x0d\x02\xc2\xff\xd7\x03\x0d\x02\xca\xff\xc3\x03\x0d\x02\xcb\xff\ +\xd7\x03\x0d\x02\xd4\xff\xc3\x03\x0d\x02\xd5\xff\xd7\x03\x0d\x02\ +\xd9\xff\xc3\x03\x0d\x02\xdb\xff\xc3\x03\x0d\x02\xdd\xff\xc3\x03\ +\x0d\x02\xe5\xff\xc3\x03\x0d\x02\xe6\xff\xd7\x03\x0d\x02\xf7\xff\ +\xc3\x03\x0d\x02\xf9\xff\xc3\x03\x0d\x02\xfb\xff\xc3\x03\x0d\x02\ +\xfd\xff\xc3\x03\x0d\x02\xfe\xff\xd7\x03\x0d\x03\x05\xff\xc3\x03\ +\x0d\x03\x06\xff\xd7\x03\x0d\x03\x07\xff\xc3\x03\x0d\x03\x08\xff\ +\xd7\x03\x0d\x03\x0d\xff\xd7\x03\x0d\x03\x0e\xff\xd7\x03\x0d\x03\ +\x0f\xff\xd7\x03\x0d\x03\x10\xff\xd7\x03\x0d\x03\x17\xff\xae\x03\ +\x0d\x03\x18\xff\xc3\x03\x0e\x00\x05\xff\x9a\x03\x0e\x00\x0a\xff\ +\x9a\x03\x0e\x01\xd0\xff\xd7\x03\x0e\x01\xdc\xff\xc3\x03\x0e\x01\ +\xdd\xff\xd7\x03\x0e\x01\xdf\xff\xd7\x03\x0e\x01\xe1\xff\xd7\x03\ +\x0e\x01\xe4\xff\xc3\x03\x0e\x01\xf6\xff\xd7\x03\x0e\x02\x07\xff\ +\x9a\x03\x0e\x02\x0b\xff\x9a\x03\x0e\x02\xa0\xff\xd7\x03\x0e\x02\ +\xaa\xff\xc3\x03\x0e\x02\xb6\xff\xc3\x03\x0e\x02\xbc\xff\xd7\x03\ +\x0e\x02\xbe\xff\xc3\x03\x0e\x02\xc0\xff\xd7\x03\x0e\x02\xc2\xff\ +\xd7\x03\x0e\x02\xcb\xff\xd7\x03\x0e\x02\xd5\xff\xd7\x03\x0e\x02\ +\xe6\xff\xd7\x03\x0e\x02\xf8\xff\xd7\x03\x0e\x02\xfa\xff\xd7\x03\ +\x0e\x02\xfc\xff\xd7\x03\x0e\x02\xfe\xff\xd7\x03\x0e\x03\x06\xff\ +\xd7\x03\x0e\x03\x08\xff\xd7\x03\x0e\x03\x0e\xff\x9a\x03\x0e\x03\ +\x10\xff\x9a\x03\x0e\x03\x18\xff\xc3\x03\x0f\x01\xa3\x00\xe1\x03\ +\x0f\x02\xea\x00)\x03\x0f\x03\x0e\xff\xd7\x03\x0f\x03\x10\xff\ +\xd7\x03\x10\x00\x05\xff\xec\x03\x10\x00\x0a\xff\xec\x03\x10\x02\ +\x07\xff\xec\x03\x10\x02\x0b\xff\xec\x03\x11\x00\x05\xff\x9a\x03\ +\x11\x00\x0a\xff\x9a\x03\x11\x01\x9d\xff\xae\x03\x11\x01\xa6\xff\ +\xae\x03\x11\x01\xa8\xff\xc3\x03\x11\x01\xaa\xff\xc3\x03\x11\x01\ +\xb0\xff\xc3\x03\x11\x01\xbc\xffq\x03\x11\x01\xbd\xff\xc3\x03\ +\x11\x01\xbf\xff\xc3\x03\x11\x01\xc1\xff\xc3\x03\x11\x01\xc4\xff\ +\xae\x03\x11\x01\xd0\xff\xd7\x03\x11\x01\xdc\xff\xc3\x03\x11\x01\ +\xdf\xff\xd7\x03\x11\x01\xe1\xff\xd7\x03\x11\x01\xe4\xff\xc3\x03\ +\x11\x02\x07\xff\x9a\x03\x11\x02\x0b\xff\x9a\x03\x11\x02r\xff\ +\xc3\x03\x11\x02v\xff\xd7\x03\x11\x02|\xff\xc3\x03\x11\x02\ +\x80\xff\xc3\x03\x11\x02\x82\xff\xc3\x03\x11\x02\x9f\xff\xc3\x03\ +\x11\x02\xa0\xff\xd7\x03\x11\x02\xa9\xff\xae\x03\x11\x02\xaa\xff\ +\xc3\x03\x11\x02\xb5\xffq\x03\x11\x02\xb6\xff\xc3\x03\x11\x02\ +\xb7\xff\xc3\x03\x11\x02\xb9\xff\xc3\x03\x11\x02\xbb\xff\xc3\x03\ +\x11\x02\xbc\xff\xd7\x03\x11\x02\xbd\xff\xae\x03\x11\x02\xbe\xff\ +\xc3\x03\x11\x02\xbf\xff\xc3\x03\x11\x02\xc0\xff\xd7\x03\x11\x02\ +\xc1\xff\xc3\x03\x11\x02\xc2\xff\xd7\x03\x11\x02\xca\xff\xc3\x03\ +\x11\x02\xcb\xff\xd7\x03\x11\x02\xd4\xff\xc3\x03\x11\x02\xd5\xff\ +\xd7\x03\x11\x02\xd9\xff\xc3\x03\x11\x02\xdb\xff\xc3\x03\x11\x02\ +\xdd\xff\xc3\x03\x11\x02\xe5\xff\xc3\x03\x11\x02\xe6\xff\xd7\x03\ +\x11\x02\xf7\xff\xc3\x03\x11\x02\xf9\xff\xc3\x03\x11\x02\xfb\xff\ +\xc3\x03\x11\x02\xfd\xff\xc3\x03\x11\x02\xfe\xff\xd7\x03\x11\x03\ +\x05\xff\xc3\x03\x11\x03\x06\xff\xd7\x03\x11\x03\x07\xff\xc3\x03\ +\x11\x03\x08\xff\xd7\x03\x11\x03\x0d\xff\xd7\x03\x11\x03\x0e\xff\ +\xd7\x03\x11\x03\x0f\xff\xd7\x03\x11\x03\x10\xff\xd7\x03\x11\x03\ +\x17\xff\xae\x03\x11\x03\x18\xff\xc3\x03\x12\x00\x05\xff\x9a\x03\ +\x12\x00\x0a\xff\x9a\x03\x12\x01\xd0\xff\xd7\x03\x12\x01\xdc\xff\ +\xc3\x03\x12\x01\xdd\xff\xd7\x03\x12\x01\xdf\xff\xd7\x03\x12\x01\ +\xe1\xff\xd7\x03\x12\x01\xe4\xff\xc3\x03\x12\x01\xf6\xff\xd7\x03\ +\x12\x02\x07\xff\x9a\x03\x12\x02\x0b\xff\x9a\x03\x12\x02\xa0\xff\ +\xd7\x03\x12\x02\xaa\xff\xc3\x03\x12\x02\xb6\xff\xc3\x03\x12\x02\ +\xbc\xff\xd7\x03\x12\x02\xbe\xff\xc3\x03\x12\x02\xc0\xff\xd7\x03\ +\x12\x02\xc2\xff\xd7\x03\x12\x02\xcb\xff\xd7\x03\x12\x02\xd5\xff\ +\xd7\x03\x12\x02\xe6\xff\xd7\x03\x12\x02\xf8\xff\xd7\x03\x12\x02\ +\xfa\xff\xd7\x03\x12\x02\xfc\xff\xd7\x03\x12\x02\xfe\xff\xd7\x03\ +\x12\x03\x06\xff\xd7\x03\x12\x03\x08\xff\xd7\x03\x12\x03\x0e\xff\ +\x9a\x03\x12\x03\x10\xff\x9a\x03\x12\x03\x18\xff\xc3\x03\x13\x00\ +\x05\xff\x9a\x03\x13\x00\x0a\xff\x9a\x03\x13\x01\x9d\xff\xae\x03\ +\x13\x01\xa6\xff\xae\x03\x13\x01\xa8\xff\xc3\x03\x13\x01\xaa\xff\ +\xc3\x03\x13\x01\xb0\xff\xc3\x03\x13\x01\xbc\xffq\x03\x13\x01\ +\xbd\xff\xc3\x03\x13\x01\xbf\xff\xc3\x03\x13\x01\xc1\xff\xc3\x03\ +\x13\x01\xc4\xff\xae\x03\x13\x01\xd0\xff\xd7\x03\x13\x01\xdc\xff\ +\xc3\x03\x13\x01\xdf\xff\xd7\x03\x13\x01\xe1\xff\xd7\x03\x13\x01\ +\xe4\xff\xc3\x03\x13\x02\x07\xff\x9a\x03\x13\x02\x0b\xff\x9a\x03\ +\x13\x02r\xff\xc3\x03\x13\x02v\xff\xd7\x03\x13\x02|\xff\ +\xc3\x03\x13\x02\x80\xff\xc3\x03\x13\x02\x82\xff\xc3\x03\x13\x02\ +\x9f\xff\xc3\x03\x13\x02\xa0\xff\xd7\x03\x13\x02\xa9\xff\xae\x03\ +\x13\x02\xaa\xff\xc3\x03\x13\x02\xb5\xffq\x03\x13\x02\xb6\xff\ +\xc3\x03\x13\x02\xb7\xff\xc3\x03\x13\x02\xb9\xff\xc3\x03\x13\x02\ +\xbb\xff\xc3\x03\x13\x02\xbc\xff\xd7\x03\x13\x02\xbd\xff\xae\x03\ +\x13\x02\xbe\xff\xc3\x03\x13\x02\xbf\xff\xc3\x03\x13\x02\xc0\xff\ +\xd7\x03\x13\x02\xc1\xff\xc3\x03\x13\x02\xc2\xff\xd7\x03\x13\x02\ +\xca\xff\xc3\x03\x13\x02\xcb\xff\xd7\x03\x13\x02\xd4\xff\xc3\x03\ +\x13\x02\xd5\xff\xd7\x03\x13\x02\xd9\xff\xc3\x03\x13\x02\xdb\xff\ +\xc3\x03\x13\x02\xdd\xff\xc3\x03\x13\x02\xe5\xff\xc3\x03\x13\x02\ +\xe6\xff\xd7\x03\x13\x02\xf7\xff\xc3\x03\x13\x02\xf9\xff\xc3\x03\ +\x13\x02\xfb\xff\xc3\x03\x13\x02\xfd\xff\xc3\x03\x13\x02\xfe\xff\ +\xd7\x03\x13\x03\x05\xff\xc3\x03\x13\x03\x06\xff\xd7\x03\x13\x03\ +\x07\xff\xc3\x03\x13\x03\x08\xff\xd7\x03\x13\x03\x0d\xff\xd7\x03\ +\x13\x03\x0e\xff\xd7\x03\x13\x03\x0f\xff\xd7\x03\x13\x03\x10\xff\ +\xd7\x03\x13\x03\x17\xff\xae\x03\x13\x03\x18\xff\xc3\x03\x14\x00\ +\x05\xff\x9a\x03\x14\x00\x0a\xff\x9a\x03\x14\x01\xd0\xff\xd7\x03\ +\x14\x01\xdc\xff\xc3\x03\x14\x01\xdd\xff\xd7\x03\x14\x01\xdf\xff\ +\xd7\x03\x14\x01\xe1\xff\xd7\x03\x14\x01\xe4\xff\xc3\x03\x14\x01\ +\xf6\xff\xd7\x03\x14\x02\x07\xff\x9a\x03\x14\x02\x0b\xff\x9a\x03\ +\x14\x02\xa0\xff\xd7\x03\x14\x02\xaa\xff\xc3\x03\x14\x02\xb6\xff\ +\xc3\x03\x14\x02\xbc\xff\xd7\x03\x14\x02\xbe\xff\xc3\x03\x14\x02\ +\xc0\xff\xd7\x03\x14\x02\xc2\xff\xd7\x03\x14\x02\xcb\xff\xd7\x03\ +\x14\x02\xd5\xff\xd7\x03\x14\x02\xe6\xff\xd7\x03\x14\x02\xf8\xff\ +\xd7\x03\x14\x02\xfa\xff\xd7\x03\x14\x02\xfc\xff\xd7\x03\x14\x02\ +\xfe\xff\xd7\x03\x14\x03\x06\xff\xd7\x03\x14\x03\x08\xff\xd7\x03\ +\x14\x03\x0e\xff\x9a\x03\x14\x03\x10\xff\x9a\x03\x14\x03\x18\xff\ +\xc3\x03\x15\x00\x0f\xff\xae\x03\x15\x00\x11\xff\xae\x03\x15\x01\ +\xaa\xff\xec\x03\x15\x01\xb0\xff\xd7\x03\x15\x01\xbc\xff\xd7\x03\ +\x15\x01\xbf\xff\xd7\x03\x15\x02\x08\xff\xae\x03\x15\x02\x0c\xff\ +\xae\x03\x15\x02r\xff\xec\x03\x15\x02\x80\xff\xec\x03\x15\x02\ +\x82\xff\xec\x03\x15\x02\x9f\xff\xd7\x03\x15\x02\xb5\xff\xd7\x03\ +\x15\x02\xb7\xff\xec\x03\x15\x02\xb9\xff\xec\x03\x15\x02\xbb\xff\ +\xd7\x03\x15\x02\xca\xff\xd7\x03\x15\x02\xd9\xff\xec\x03\x15\x02\ +\xdb\xff\xec\x03\x15\x02\xdd\xff\xec\x03\x15\x02\xe5\xff\xd7\x03\ +\x15\x03\x05\xff\xd7\x03\x15\x03\x07\xff\xd7\x03\x16\x00\x05\xff\ +\xd7\x03\x16\x00\x0a\xff\xd7\x03\x16\x01\xd0\xff\xec\x03\x16\x01\ +\xdd\xff\xec\x03\x16\x01\xdf\xff\xec\x03\x16\x01\xf6\xff\xec\x03\ +\x16\x02\x07\xff\xd7\x03\x16\x02\x0b\xff\xd7\x03\x16\x02\xa0\xff\ +\xec\x03\x16\x02\xbc\xff\xec\x03\x16\x02\xcb\xff\xec\x03\x16\x02\ +\xe6\xff\xec\x03\x16\x02\xf8\xff\xec\x03\x16\x02\xfa\xff\xec\x03\ +\x16\x02\xfc\xff\xec\x03\x16\x03\x06\xff\xec\x03\x16\x03\x08\xff\ +\xec\x03\x16\x03\x0e\xff\xd7\x03\x16\x03\x10\xff\xd7\x03\x17\x00\ +\x05\xff\xae\x03\x17\x00\x0a\xff\xae\x03\x17\x01\x9d\xff\xc3\x03\ +\x17\x01\xa6\xff\xc3\x03\x17\x01\xaa\xff\xd7\x03\x17\x01\xb0\xff\ +\xd7\x03\x17\x01\xbc\xff\xc3\x03\x17\x01\xbf\xff\xd7\x03\x17\x01\ +\xc1\xff\xd7\x03\x17\x01\xc4\xff\xc3\x03\x17\x01\xdc\xff\xd7\x03\ +\x17\x01\xe4\xff\xd7\x03\x17\x02\x07\xff\xae\x03\x17\x02\x0b\xff\ +\xae\x03\x17\x02r\xff\xd7\x03\x17\x02|\xff\xd7\x03\x17\x02\ +\x80\xff\xd7\x03\x17\x02\x82\xff\xd7\x03\x17\x02\x9f\xff\xd7\x03\ +\x17\x02\xa9\xff\xc3\x03\x17\x02\xaa\xff\xd7\x03\x17\x02\xb5\xff\ +\xc3\x03\x17\x02\xb6\xff\xd7\x03\x17\x02\xb7\xff\xd7\x03\x17\x02\ +\xb9\xff\xd7\x03\x17\x02\xbb\xff\xd7\x03\x17\x02\xbd\xff\xc3\x03\ +\x17\x02\xbe\xff\xd7\x03\x17\x02\xbf\xff\xd7\x03\x17\x02\xc1\xff\ +\xd7\x03\x17\x02\xca\xff\xd7\x03\x17\x02\xd4\xff\xd7\x03\x17\x02\ +\xd9\xff\xd7\x03\x17\x02\xdb\xff\xd7\x03\x17\x02\xdd\xff\xd7\x03\ +\x17\x02\xe5\xff\xd7\x03\x17\x02\xfd\xff\xd7\x03\x17\x03\x05\xff\ +\xd7\x03\x17\x03\x07\xff\xd7\x03\x17\x03\x0d\xff\xd7\x03\x17\x03\ +\x0f\xff\xd7\x03\x17\x03\x17\xff\xc3\x03\x17\x03\x18\xff\xd7\x03\ +\x18\x00\x05\xff\x9a\x03\x18\x00\x0a\xff\x9a\x03\x18\x01\xd0\xff\ +\xd7\x03\x18\x01\xdc\xff\xc3\x03\x18\x01\xdd\xff\xd7\x03\x18\x01\ +\xdf\xff\xd7\x03\x18\x01\xe1\xff\xd7\x03\x18\x01\xe4\xff\xc3\x03\ +\x18\x01\xf6\xff\xd7\x03\x18\x02\x07\xff\x9a\x03\x18\x02\x0b\xff\ +\x9a\x03\x18\x02\xa0\xff\xd7\x03\x18\x02\xaa\xff\xc3\x03\x18\x02\ +\xb6\xff\xc3\x03\x18\x02\xbc\xff\xd7\x03\x18\x02\xbe\xff\xc3\x03\ +\x18\x02\xc0\xff\xd7\x03\x18\x02\xc2\xff\xd7\x03\x18\x02\xcb\xff\ +\xd7\x03\x18\x02\xd5\xff\xd7\x03\x18\x02\xe6\xff\xd7\x03\x18\x02\ +\xf8\xff\xd7\x03\x18\x02\xfa\xff\xd7\x03\x18\x02\xfc\xff\xd7\x03\ +\x18\x02\xfe\xff\xd7\x03\x18\x03\x06\xff\xd7\x03\x18\x03\x08\xff\ +\xd7\x03\x18\x03\x0e\xff\x9a\x03\x18\x03\x10\xff\x9a\x03\x18\x03\ +\x18\xff\xc3\x03\x19\x01\xe1\xff\xd7\x03\x19\x02\xc0\xff\xd7\x03\ +\x19\x02\xc2\xff\xd7\x03\x19\x02\xd5\xff\xd7\x03\x19\x02\xfe\xff\ +\xd7\x03\x1b\x01\xa3\x00\xe1\x03\x1b\x02\xea\x00)\x03\x1b\x03\ +\x0e\xff\xd7\x03\x1b\x03\x10\xff\xd7\x03\x1c\x00\x05\xff\xec\x03\ +\x1c\x00\x0a\xff\xec\x03\x1c\x02\x07\xff\xec\x03\x1c\x02\x0b\xff\ +\xec\x03\x1d\x00\x05\xffq\x03\x1d\x00\x0a\xffq\x03\x1d\x00\ +&\xff\xd7\x03\x1d\x00*\xff\xd7\x03\x1d\x00-\x01\x0a\x03\ +\x1d\x002\xff\xd7\x03\x1d\x004\xff\xd7\x03\x1d\x007\xff\ +q\x03\x1d\x009\xff\xae\x03\x1d\x00:\xff\xae\x03\x1d\x00\ +<\xff\x85\x03\x1d\x00\x89\xff\xd7\x03\x1d\x00\x94\xff\xd7\x03\ +\x1d\x00\x95\xff\xd7\x03\x1d\x00\x96\xff\xd7\x03\x1d\x00\x97\xff\ +\xd7\x03\x1d\x00\x98\xff\xd7\x03\x1d\x00\x9a\xff\xd7\x03\x1d\x00\ +\x9f\xff\x85\x03\x1d\x00\xc8\xff\xd7\x03\x1d\x00\xca\xff\xd7\x03\ +\x1d\x00\xcc\xff\xd7\x03\x1d\x00\xce\xff\xd7\x03\x1d\x00\xde\xff\ +\xd7\x03\x1d\x00\xe0\xff\xd7\x03\x1d\x00\xe2\xff\xd7\x03\x1d\x00\ +\xe4\xff\xd7\x03\x1d\x01\x0e\xff\xd7\x03\x1d\x01\x10\xff\xd7\x03\ +\x1d\x01\x12\xff\xd7\x03\x1d\x01\x14\xff\xd7\x03\x1d\x01$\xff\ +q\x03\x1d\x01&\xffq\x03\x1d\x016\xff\xae\x03\x1d\x01\ +8\xff\x85\x03\x1d\x01:\xff\x85\x03\x1d\x01G\xff\xd7\x03\ +\x1d\x01\xfa\xff\xae\x03\x1d\x01\xfc\xff\xae\x03\x1d\x01\xfe\xff\ +\xae\x03\x1d\x02\x00\xff\x85\x03\x1d\x02\x07\xffq\x03\x1d\x02\ +\x0b\xffq\x03\x1d\x02_\xff\xd7\x03\x1d\x03I\xff\xd7\x03\ +\x1d\x03K\xff\xd7\x03\x1d\x03M\xff\xd7\x03\x1d\x03O\xff\ +\xd7\x03\x1d\x03Q\xff\xd7\x03\x1d\x03S\xff\xd7\x03\x1d\x03\ +U\xff\xd7\x03\x1d\x03W\xff\xd7\x03\x1d\x03Y\xff\xd7\x03\ +\x1d\x03[\xff\xd7\x03\x1d\x03]\xff\xd7\x03\x1d\x03_\xff\ +\xd7\x03\x1d\x03o\xff\x85\x03\x1d\x03q\xff\x85\x03\x1d\x03\ +s\xff\x85\x03\x1d\x03\x8f\xffq\x03\x1e\x00\x05\xff\xec\x03\ +\x1e\x00\x0a\xff\xec\x03\x1e\x02\x07\xff\xec\x03\x1e\x02\x0b\xff\ +\xec\x03\x1f\x00\x05\xffq\x03\x1f\x00\x0a\xffq\x03\x1f\x00\ +&\xff\xd7\x03\x1f\x00*\xff\xd7\x03\x1f\x00-\x01\x0a\x03\ +\x1f\x002\xff\xd7\x03\x1f\x004\xff\xd7\x03\x1f\x007\xff\ +q\x03\x1f\x009\xff\xae\x03\x1f\x00:\xff\xae\x03\x1f\x00\ +<\xff\x85\x03\x1f\x00\x89\xff\xd7\x03\x1f\x00\x94\xff\xd7\x03\ +\x1f\x00\x95\xff\xd7\x03\x1f\x00\x96\xff\xd7\x03\x1f\x00\x97\xff\ +\xd7\x03\x1f\x00\x98\xff\xd7\x03\x1f\x00\x9a\xff\xd7\x03\x1f\x00\ +\x9f\xff\x85\x03\x1f\x00\xc8\xff\xd7\x03\x1f\x00\xca\xff\xd7\x03\ +\x1f\x00\xcc\xff\xd7\x03\x1f\x00\xce\xff\xd7\x03\x1f\x00\xde\xff\ +\xd7\x03\x1f\x00\xe0\xff\xd7\x03\x1f\x00\xe2\xff\xd7\x03\x1f\x00\ +\xe4\xff\xd7\x03\x1f\x01\x0e\xff\xd7\x03\x1f\x01\x10\xff\xd7\x03\ +\x1f\x01\x12\xff\xd7\x03\x1f\x01\x14\xff\xd7\x03\x1f\x01$\xff\ +q\x03\x1f\x01&\xffq\x03\x1f\x016\xff\xae\x03\x1f\x01\ +8\xff\x85\x03\x1f\x01:\xff\x85\x03\x1f\x01G\xff\xd7\x03\ +\x1f\x01\xfa\xff\xae\x03\x1f\x01\xfc\xff\xae\x03\x1f\x01\xfe\xff\ +\xae\x03\x1f\x02\x00\xff\x85\x03\x1f\x02\x07\xffq\x03\x1f\x02\ +\x0b\xffq\x03\x1f\x02_\xff\xd7\x03\x1f\x03I\xff\xd7\x03\ +\x1f\x03K\xff\xd7\x03\x1f\x03M\xff\xd7\x03\x1f\x03O\xff\ +\xd7\x03\x1f\x03Q\xff\xd7\x03\x1f\x03S\xff\xd7\x03\x1f\x03\ +U\xff\xd7\x03\x1f\x03W\xff\xd7\x03\x1f\x03Y\xff\xd7\x03\ +\x1f\x03[\xff\xd7\x03\x1f\x03]\xff\xd7\x03\x1f\x03_\xff\ +\xd7\x03\x1f\x03o\xff\x85\x03\x1f\x03q\xff\x85\x03\x1f\x03\ +s\xff\x85\x03\x1f\x03\x8f\xffq\x03 \x00\x05\xff\xec\x03\ + \x00\x0a\xff\xec\x03 \x02\x07\xff\xec\x03 \x02\x0b\xff\ +\xec\x03!\x00\x05\xffq\x03!\x00\x0a\xffq\x03!\x00\ +&\xff\xd7\x03!\x00*\xff\xd7\x03!\x00-\x01\x0a\x03\ +!\x002\xff\xd7\x03!\x004\xff\xd7\x03!\x007\xff\ +q\x03!\x009\xff\xae\x03!\x00:\xff\xae\x03!\x00\ +<\xff\x85\x03!\x00\x89\xff\xd7\x03!\x00\x94\xff\xd7\x03\ +!\x00\x95\xff\xd7\x03!\x00\x96\xff\xd7\x03!\x00\x97\xff\ +\xd7\x03!\x00\x98\xff\xd7\x03!\x00\x9a\xff\xd7\x03!\x00\ +\x9f\xff\x85\x03!\x00\xc8\xff\xd7\x03!\x00\xca\xff\xd7\x03\ +!\x00\xcc\xff\xd7\x03!\x00\xce\xff\xd7\x03!\x00\xde\xff\ +\xd7\x03!\x00\xe0\xff\xd7\x03!\x00\xe2\xff\xd7\x03!\x00\ +\xe4\xff\xd7\x03!\x01\x0e\xff\xd7\x03!\x01\x10\xff\xd7\x03\ +!\x01\x12\xff\xd7\x03!\x01\x14\xff\xd7\x03!\x01$\xff\ +q\x03!\x01&\xffq\x03!\x016\xff\xae\x03!\x01\ +8\xff\x85\x03!\x01:\xff\x85\x03!\x01G\xff\xd7\x03\ +!\x01\xfa\xff\xae\x03!\x01\xfc\xff\xae\x03!\x01\xfe\xff\ +\xae\x03!\x02\x00\xff\x85\x03!\x02\x07\xffq\x03!\x02\ +\x0b\xffq\x03!\x02_\xff\xd7\x03!\x03I\xff\xd7\x03\ +!\x03K\xff\xd7\x03!\x03M\xff\xd7\x03!\x03O\xff\ +\xd7\x03!\x03Q\xff\xd7\x03!\x03S\xff\xd7\x03!\x03\ +U\xff\xd7\x03!\x03W\xff\xd7\x03!\x03Y\xff\xd7\x03\ +!\x03[\xff\xd7\x03!\x03]\xff\xd7\x03!\x03_\xff\ +\xd7\x03!\x03o\xff\x85\x03!\x03q\xff\x85\x03!\x03\ +s\xff\x85\x03!\x03\x8f\xffq\x03\x22\x00\x05\xff\xec\x03\ +\x22\x00\x0a\xff\xec\x03\x22\x02\x07\xff\xec\x03\x22\x02\x0b\xff\ +\xec\x03#\x00\x05\xffq\x03#\x00\x0a\xffq\x03#\x00\ +&\xff\xd7\x03#\x00*\xff\xd7\x03#\x00-\x01\x0a\x03\ +#\x002\xff\xd7\x03#\x004\xff\xd7\x03#\x007\xff\ +q\x03#\x009\xff\xae\x03#\x00:\xff\xae\x03#\x00\ +<\xff\x85\x03#\x00\x89\xff\xd7\x03#\x00\x94\xff\xd7\x03\ +#\x00\x95\xff\xd7\x03#\x00\x96\xff\xd7\x03#\x00\x97\xff\ +\xd7\x03#\x00\x98\xff\xd7\x03#\x00\x9a\xff\xd7\x03#\x00\ +\x9f\xff\x85\x03#\x00\xc8\xff\xd7\x03#\x00\xca\xff\xd7\x03\ +#\x00\xcc\xff\xd7\x03#\x00\xce\xff\xd7\x03#\x00\xde\xff\ +\xd7\x03#\x00\xe0\xff\xd7\x03#\x00\xe2\xff\xd7\x03#\x00\ +\xe4\xff\xd7\x03#\x01\x0e\xff\xd7\x03#\x01\x10\xff\xd7\x03\ +#\x01\x12\xff\xd7\x03#\x01\x14\xff\xd7\x03#\x01$\xff\ +q\x03#\x01&\xffq\x03#\x016\xff\xae\x03#\x01\ +8\xff\x85\x03#\x01:\xff\x85\x03#\x01G\xff\xd7\x03\ +#\x01\xfa\xff\xae\x03#\x01\xfc\xff\xae\x03#\x01\xfe\xff\ +\xae\x03#\x02\x00\xff\x85\x03#\x02\x07\xffq\x03#\x02\ +\x0b\xffq\x03#\x02_\xff\xd7\x03#\x03I\xff\xd7\x03\ +#\x03K\xff\xd7\x03#\x03M\xff\xd7\x03#\x03O\xff\ +\xd7\x03#\x03Q\xff\xd7\x03#\x03S\xff\xd7\x03#\x03\ +U\xff\xd7\x03#\x03W\xff\xd7\x03#\x03Y\xff\xd7\x03\ +#\x03[\xff\xd7\x03#\x03]\xff\xd7\x03#\x03_\xff\ +\xd7\x03#\x03o\xff\x85\x03#\x03q\xff\x85\x03#\x03\ +s\xff\x85\x03#\x03\x8f\xffq\x03$\x00\x05\xff\xec\x03\ +$\x00\x0a\xff\xec\x03$\x02\x07\xff\xec\x03$\x02\x0b\xff\ +\xec\x03%\x00\x05\xffq\x03%\x00\x0a\xffq\x03%\x00\ +&\xff\xd7\x03%\x00*\xff\xd7\x03%\x00-\x01\x0a\x03\ +%\x002\xff\xd7\x03%\x004\xff\xd7\x03%\x007\xff\ +q\x03%\x009\xff\xae\x03%\x00:\xff\xae\x03%\x00\ +<\xff\x85\x03%\x00\x89\xff\xd7\x03%\x00\x94\xff\xd7\x03\ +%\x00\x95\xff\xd7\x03%\x00\x96\xff\xd7\x03%\x00\x97\xff\ +\xd7\x03%\x00\x98\xff\xd7\x03%\x00\x9a\xff\xd7\x03%\x00\ +\x9f\xff\x85\x03%\x00\xc8\xff\xd7\x03%\x00\xca\xff\xd7\x03\ +%\x00\xcc\xff\xd7\x03%\x00\xce\xff\xd7\x03%\x00\xde\xff\ +\xd7\x03%\x00\xe0\xff\xd7\x03%\x00\xe2\xff\xd7\x03%\x00\ +\xe4\xff\xd7\x03%\x01\x0e\xff\xd7\x03%\x01\x10\xff\xd7\x03\ +%\x01\x12\xff\xd7\x03%\x01\x14\xff\xd7\x03%\x01$\xff\ +q\x03%\x01&\xffq\x03%\x016\xff\xae\x03%\x01\ +8\xff\x85\x03%\x01:\xff\x85\x03%\x01G\xff\xd7\x03\ +%\x01\xfa\xff\xae\x03%\x01\xfc\xff\xae\x03%\x01\xfe\xff\ +\xae\x03%\x02\x00\xff\x85\x03%\x02\x07\xffq\x03%\x02\ +\x0b\xffq\x03%\x02_\xff\xd7\x03%\x03I\xff\xd7\x03\ +%\x03K\xff\xd7\x03%\x03M\xff\xd7\x03%\x03O\xff\ +\xd7\x03%\x03Q\xff\xd7\x03%\x03S\xff\xd7\x03%\x03\ +U\xff\xd7\x03%\x03W\xff\xd7\x03%\x03Y\xff\xd7\x03\ +%\x03[\xff\xd7\x03%\x03]\xff\xd7\x03%\x03_\xff\ +\xd7\x03%\x03o\xff\x85\x03%\x03q\xff\x85\x03%\x03\ +s\xff\x85\x03%\x03\x8f\xffq\x03&\x00\x05\xff\xec\x03\ +&\x00\x0a\xff\xec\x03&\x02\x07\xff\xec\x03&\x02\x0b\xff\ +\xec\x03'\x00\x05\xffq\x03'\x00\x0a\xffq\x03'\x00\ +&\xff\xd7\x03'\x00*\xff\xd7\x03'\x00-\x01\x0a\x03\ +'\x002\xff\xd7\x03'\x004\xff\xd7\x03'\x007\xff\ +q\x03'\x009\xff\xae\x03'\x00:\xff\xae\x03'\x00\ +<\xff\x85\x03'\x00\x89\xff\xd7\x03'\x00\x94\xff\xd7\x03\ +'\x00\x95\xff\xd7\x03'\x00\x96\xff\xd7\x03'\x00\x97\xff\ +\xd7\x03'\x00\x98\xff\xd7\x03'\x00\x9a\xff\xd7\x03'\x00\ +\x9f\xff\x85\x03'\x00\xc8\xff\xd7\x03'\x00\xca\xff\xd7\x03\ +'\x00\xcc\xff\xd7\x03'\x00\xce\xff\xd7\x03'\x00\xde\xff\ +\xd7\x03'\x00\xe0\xff\xd7\x03'\x00\xe2\xff\xd7\x03'\x00\ +\xe4\xff\xd7\x03'\x01\x0e\xff\xd7\x03'\x01\x10\xff\xd7\x03\ +'\x01\x12\xff\xd7\x03'\x01\x14\xff\xd7\x03'\x01$\xff\ +q\x03'\x01&\xffq\x03'\x016\xff\xae\x03'\x01\ +8\xff\x85\x03'\x01:\xff\x85\x03'\x01G\xff\xd7\x03\ +'\x01\xfa\xff\xae\x03'\x01\xfc\xff\xae\x03'\x01\xfe\xff\ +\xae\x03'\x02\x00\xff\x85\x03'\x02\x07\xffq\x03'\x02\ +\x0b\xffq\x03'\x02_\xff\xd7\x03'\x03I\xff\xd7\x03\ +'\x03K\xff\xd7\x03'\x03M\xff\xd7\x03'\x03O\xff\ +\xd7\x03'\x03Q\xff\xd7\x03'\x03S\xff\xd7\x03'\x03\ +U\xff\xd7\x03'\x03W\xff\xd7\x03'\x03Y\xff\xd7\x03\ +'\x03[\xff\xd7\x03'\x03]\xff\xd7\x03'\x03_\xff\ +\xd7\x03'\x03o\xff\x85\x03'\x03q\xff\x85\x03'\x03\ +s\xff\x85\x03'\x03\x8f\xffq\x03(\x00\x05\xff\xec\x03\ +(\x00\x0a\xff\xec\x03(\x02\x07\xff\xec\x03(\x02\x0b\xff\ +\xec\x03)\x00\x05\xffq\x03)\x00\x0a\xffq\x03)\x00\ +&\xff\xd7\x03)\x00*\xff\xd7\x03)\x00-\x01\x0a\x03\ +)\x002\xff\xd7\x03)\x004\xff\xd7\x03)\x007\xff\ +q\x03)\x009\xff\xae\x03)\x00:\xff\xae\x03)\x00\ +<\xff\x85\x03)\x00\x89\xff\xd7\x03)\x00\x94\xff\xd7\x03\ +)\x00\x95\xff\xd7\x03)\x00\x96\xff\xd7\x03)\x00\x97\xff\ +\xd7\x03)\x00\x98\xff\xd7\x03)\x00\x9a\xff\xd7\x03)\x00\ +\x9f\xff\x85\x03)\x00\xc8\xff\xd7\x03)\x00\xca\xff\xd7\x03\ +)\x00\xcc\xff\xd7\x03)\x00\xce\xff\xd7\x03)\x00\xde\xff\ +\xd7\x03)\x00\xe0\xff\xd7\x03)\x00\xe2\xff\xd7\x03)\x00\ +\xe4\xff\xd7\x03)\x01\x0e\xff\xd7\x03)\x01\x10\xff\xd7\x03\ +)\x01\x12\xff\xd7\x03)\x01\x14\xff\xd7\x03)\x01$\xff\ +q\x03)\x01&\xffq\x03)\x016\xff\xae\x03)\x01\ +8\xff\x85\x03)\x01:\xff\x85\x03)\x01G\xff\xd7\x03\ +)\x01\xfa\xff\xae\x03)\x01\xfc\xff\xae\x03)\x01\xfe\xff\ +\xae\x03)\x02\x00\xff\x85\x03)\x02\x07\xffq\x03)\x02\ +\x0b\xffq\x03)\x02_\xff\xd7\x03)\x03I\xff\xd7\x03\ +)\x03K\xff\xd7\x03)\x03M\xff\xd7\x03)\x03O\xff\ +\xd7\x03)\x03Q\xff\xd7\x03)\x03S\xff\xd7\x03)\x03\ +U\xff\xd7\x03)\x03W\xff\xd7\x03)\x03Y\xff\xd7\x03\ +)\x03[\xff\xd7\x03)\x03]\xff\xd7\x03)\x03_\xff\ +\xd7\x03)\x03o\xff\x85\x03)\x03q\xff\x85\x03)\x03\ +s\xff\x85\x03)\x03\x8f\xffq\x03*\x00\x05\xff\xec\x03\ +*\x00\x0a\xff\xec\x03*\x02\x07\xff\xec\x03*\x02\x0b\xff\ +\xec\x03+\x00\x05\xffq\x03+\x00\x0a\xffq\x03+\x00\ +&\xff\xd7\x03+\x00*\xff\xd7\x03+\x00-\x01\x0a\x03\ ++\x002\xff\xd7\x03+\x004\xff\xd7\x03+\x007\xff\ +q\x03+\x009\xff\xae\x03+\x00:\xff\xae\x03+\x00\ +<\xff\x85\x03+\x00\x89\xff\xd7\x03+\x00\x94\xff\xd7\x03\ ++\x00\x95\xff\xd7\x03+\x00\x96\xff\xd7\x03+\x00\x97\xff\ +\xd7\x03+\x00\x98\xff\xd7\x03+\x00\x9a\xff\xd7\x03+\x00\ +\x9f\xff\x85\x03+\x00\xc8\xff\xd7\x03+\x00\xca\xff\xd7\x03\ ++\x00\xcc\xff\xd7\x03+\x00\xce\xff\xd7\x03+\x00\xde\xff\ +\xd7\x03+\x00\xe0\xff\xd7\x03+\x00\xe2\xff\xd7\x03+\x00\ +\xe4\xff\xd7\x03+\x01\x0e\xff\xd7\x03+\x01\x10\xff\xd7\x03\ ++\x01\x12\xff\xd7\x03+\x01\x14\xff\xd7\x03+\x01$\xff\ +q\x03+\x01&\xffq\x03+\x016\xff\xae\x03+\x01\ +8\xff\x85\x03+\x01:\xff\x85\x03+\x01G\xff\xd7\x03\ ++\x01\xfa\xff\xae\x03+\x01\xfc\xff\xae\x03+\x01\xfe\xff\ +\xae\x03+\x02\x00\xff\x85\x03+\x02\x07\xffq\x03+\x02\ +\x0b\xffq\x03+\x02_\xff\xd7\x03+\x03I\xff\xd7\x03\ ++\x03K\xff\xd7\x03+\x03M\xff\xd7\x03+\x03O\xff\ +\xd7\x03+\x03Q\xff\xd7\x03+\x03S\xff\xd7\x03+\x03\ +U\xff\xd7\x03+\x03W\xff\xd7\x03+\x03Y\xff\xd7\x03\ ++\x03[\xff\xd7\x03+\x03]\xff\xd7\x03+\x03_\xff\ +\xd7\x03+\x03o\xff\x85\x03+\x03q\xff\x85\x03+\x03\ +s\xff\x85\x03+\x03\x8f\xffq\x03,\x00\x05\xff\xec\x03\ +,\x00\x0a\xff\xec\x03,\x02\x07\xff\xec\x03,\x02\x0b\xff\ +\xec\x03-\x00\x05\xffq\x03-\x00\x0a\xffq\x03-\x00\ +&\xff\xd7\x03-\x00*\xff\xd7\x03-\x00-\x01\x0a\x03\ +-\x002\xff\xd7\x03-\x004\xff\xd7\x03-\x007\xff\ +q\x03-\x009\xff\xae\x03-\x00:\xff\xae\x03-\x00\ +<\xff\x85\x03-\x00\x89\xff\xd7\x03-\x00\x94\xff\xd7\x03\ +-\x00\x95\xff\xd7\x03-\x00\x96\xff\xd7\x03-\x00\x97\xff\ +\xd7\x03-\x00\x98\xff\xd7\x03-\x00\x9a\xff\xd7\x03-\x00\ +\x9f\xff\x85\x03-\x00\xc8\xff\xd7\x03-\x00\xca\xff\xd7\x03\ +-\x00\xcc\xff\xd7\x03-\x00\xce\xff\xd7\x03-\x00\xde\xff\ +\xd7\x03-\x00\xe0\xff\xd7\x03-\x00\xe2\xff\xd7\x03-\x00\ +\xe4\xff\xd7\x03-\x01\x0e\xff\xd7\x03-\x01\x10\xff\xd7\x03\ +-\x01\x12\xff\xd7\x03-\x01\x14\xff\xd7\x03-\x01$\xff\ +q\x03-\x01&\xffq\x03-\x016\xff\xae\x03-\x01\ +8\xff\x85\x03-\x01:\xff\x85\x03-\x01G\xff\xd7\x03\ +-\x01\xfa\xff\xae\x03-\x01\xfc\xff\xae\x03-\x01\xfe\xff\ +\xae\x03-\x02\x00\xff\x85\x03-\x02\x07\xffq\x03-\x02\ +\x0b\xffq\x03-\x02_\xff\xd7\x03-\x03I\xff\xd7\x03\ +-\x03K\xff\xd7\x03-\x03M\xff\xd7\x03-\x03O\xff\ +\xd7\x03-\x03Q\xff\xd7\x03-\x03S\xff\xd7\x03-\x03\ +U\xff\xd7\x03-\x03W\xff\xd7\x03-\x03Y\xff\xd7\x03\ +-\x03[\xff\xd7\x03-\x03]\xff\xd7\x03-\x03_\xff\ +\xd7\x03-\x03o\xff\x85\x03-\x03q\xff\x85\x03-\x03\ +s\xff\x85\x03-\x03\x8f\xffq\x03.\x00\x05\xff\xec\x03\ +.\x00\x0a\xff\xec\x03.\x02\x07\xff\xec\x03.\x02\x0b\xff\ +\xec\x03/\x00\x05\xffq\x03/\x00\x0a\xffq\x03/\x00\ +&\xff\xd7\x03/\x00*\xff\xd7\x03/\x00-\x01\x0a\x03\ +/\x002\xff\xd7\x03/\x004\xff\xd7\x03/\x007\xff\ +q\x03/\x009\xff\xae\x03/\x00:\xff\xae\x03/\x00\ +<\xff\x85\x03/\x00\x89\xff\xd7\x03/\x00\x94\xff\xd7\x03\ +/\x00\x95\xff\xd7\x03/\x00\x96\xff\xd7\x03/\x00\x97\xff\ +\xd7\x03/\x00\x98\xff\xd7\x03/\x00\x9a\xff\xd7\x03/\x00\ +\x9f\xff\x85\x03/\x00\xc8\xff\xd7\x03/\x00\xca\xff\xd7\x03\ +/\x00\xcc\xff\xd7\x03/\x00\xce\xff\xd7\x03/\x00\xde\xff\ +\xd7\x03/\x00\xe0\xff\xd7\x03/\x00\xe2\xff\xd7\x03/\x00\ +\xe4\xff\xd7\x03/\x01\x0e\xff\xd7\x03/\x01\x10\xff\xd7\x03\ +/\x01\x12\xff\xd7\x03/\x01\x14\xff\xd7\x03/\x01$\xff\ +q\x03/\x01&\xffq\x03/\x016\xff\xae\x03/\x01\ +8\xff\x85\x03/\x01:\xff\x85\x03/\x01G\xff\xd7\x03\ +/\x01\xfa\xff\xae\x03/\x01\xfc\xff\xae\x03/\x01\xfe\xff\ +\xae\x03/\x02\x00\xff\x85\x03/\x02\x07\xffq\x03/\x02\ +\x0b\xffq\x03/\x02_\xff\xd7\x03/\x03I\xff\xd7\x03\ +/\x03K\xff\xd7\x03/\x03M\xff\xd7\x03/\x03O\xff\ +\xd7\x03/\x03Q\xff\xd7\x03/\x03S\xff\xd7\x03/\x03\ +U\xff\xd7\x03/\x03W\xff\xd7\x03/\x03Y\xff\xd7\x03\ +/\x03[\xff\xd7\x03/\x03]\xff\xd7\x03/\x03_\xff\ +\xd7\x03/\x03o\xff\x85\x03/\x03q\xff\x85\x03/\x03\ +s\xff\x85\x03/\x03\x8f\xffq\x030\x00\x05\xff\xec\x03\ +0\x00\x0a\xff\xec\x030\x02\x07\xff\xec\x030\x02\x0b\xff\ +\xec\x031\x00\x05\xffq\x031\x00\x0a\xffq\x031\x00\ +&\xff\xd7\x031\x00*\xff\xd7\x031\x00-\x01\x0a\x03\ +1\x002\xff\xd7\x031\x004\xff\xd7\x031\x007\xff\ +q\x031\x009\xff\xae\x031\x00:\xff\xae\x031\x00\ +<\xff\x85\x031\x00\x89\xff\xd7\x031\x00\x94\xff\xd7\x03\ +1\x00\x95\xff\xd7\x031\x00\x96\xff\xd7\x031\x00\x97\xff\ +\xd7\x031\x00\x98\xff\xd7\x031\x00\x9a\xff\xd7\x031\x00\ +\x9f\xff\x85\x031\x00\xc8\xff\xd7\x031\x00\xca\xff\xd7\x03\ +1\x00\xcc\xff\xd7\x031\x00\xce\xff\xd7\x031\x00\xde\xff\ +\xd7\x031\x00\xe0\xff\xd7\x031\x00\xe2\xff\xd7\x031\x00\ +\xe4\xff\xd7\x031\x01\x0e\xff\xd7\x031\x01\x10\xff\xd7\x03\ +1\x01\x12\xff\xd7\x031\x01\x14\xff\xd7\x031\x01$\xff\ +q\x031\x01&\xffq\x031\x016\xff\xae\x031\x01\ +8\xff\x85\x031\x01:\xff\x85\x031\x01G\xff\xd7\x03\ +1\x01\xfa\xff\xae\x031\x01\xfc\xff\xae\x031\x01\xfe\xff\ +\xae\x031\x02\x00\xff\x85\x031\x02\x07\xffq\x031\x02\ +\x0b\xffq\x031\x02_\xff\xd7\x031\x03I\xff\xd7\x03\ +1\x03K\xff\xd7\x031\x03M\xff\xd7\x031\x03O\xff\ +\xd7\x031\x03Q\xff\xd7\x031\x03S\xff\xd7\x031\x03\ +U\xff\xd7\x031\x03W\xff\xd7\x031\x03Y\xff\xd7\x03\ +1\x03[\xff\xd7\x031\x03]\xff\xd7\x031\x03_\xff\ +\xd7\x031\x03o\xff\x85\x031\x03q\xff\x85\x031\x03\ +s\xff\x85\x031\x03\x8f\xffq\x032\x00\x05\xff\xec\x03\ +2\x00\x0a\xff\xec\x032\x02\x07\xff\xec\x032\x02\x0b\xff\ +\xec\x033\x00\x05\xffq\x033\x00\x0a\xffq\x033\x00\ +&\xff\xd7\x033\x00*\xff\xd7\x033\x00-\x01\x0a\x03\ +3\x002\xff\xd7\x033\x004\xff\xd7\x033\x007\xff\ +q\x033\x009\xff\xae\x033\x00:\xff\xae\x033\x00\ +<\xff\x85\x033\x00\x89\xff\xd7\x033\x00\x94\xff\xd7\x03\ +3\x00\x95\xff\xd7\x033\x00\x96\xff\xd7\x033\x00\x97\xff\ +\xd7\x033\x00\x98\xff\xd7\x033\x00\x9a\xff\xd7\x033\x00\ +\x9f\xff\x85\x033\x00\xc8\xff\xd7\x033\x00\xca\xff\xd7\x03\ +3\x00\xcc\xff\xd7\x033\x00\xce\xff\xd7\x033\x00\xde\xff\ +\xd7\x033\x00\xe0\xff\xd7\x033\x00\xe2\xff\xd7\x033\x00\ +\xe4\xff\xd7\x033\x01\x0e\xff\xd7\x033\x01\x10\xff\xd7\x03\ +3\x01\x12\xff\xd7\x033\x01\x14\xff\xd7\x033\x01$\xff\ +q\x033\x01&\xffq\x033\x016\xff\xae\x033\x01\ +8\xff\x85\x033\x01:\xff\x85\x033\x01G\xff\xd7\x03\ +3\x01\xfa\xff\xae\x033\x01\xfc\xff\xae\x033\x01\xfe\xff\ +\xae\x033\x02\x00\xff\x85\x033\x02\x07\xffq\x033\x02\ +\x0b\xffq\x033\x02_\xff\xd7\x033\x03I\xff\xd7\x03\ +3\x03K\xff\xd7\x033\x03M\xff\xd7\x033\x03O\xff\ +\xd7\x033\x03Q\xff\xd7\x033\x03S\xff\xd7\x033\x03\ +U\xff\xd7\x033\x03W\xff\xd7\x033\x03Y\xff\xd7\x03\ +3\x03[\xff\xd7\x033\x03]\xff\xd7\x033\x03_\xff\ +\xd7\x033\x03o\xff\x85\x033\x03q\xff\x85\x033\x03\ +s\xff\x85\x033\x03\x8f\xffq\x034\x00\x05\xff\xec\x03\ +4\x00\x0a\xff\xec\x034\x02\x07\xff\xec\x034\x02\x0b\xff\ +\xec\x035\x00-\x00{\x036\x00\x05\xff\xec\x036\x00\ +\x0a\xff\xec\x036\x00Y\xff\xd7\x036\x00Z\xff\xd7\x03\ +6\x00[\xff\xd7\x036\x00\x5c\xff\xd7\x036\x00]\xff\ +\xec\x036\x00\xbf\xff\xd7\x036\x017\xff\xd7\x036\x01\ +<\xff\xec\x036\x01>\xff\xec\x036\x01@\xff\xec\x03\ +6\x01\xfb\xff\xd7\x036\x01\xfd\xff\xd7\x036\x02\x07\xff\ +\xec\x036\x02\x0b\xff\xec\x036\x03p\xff\xd7\x037\x00\ +-\x00{\x038\x00\x05\xff\xec\x038\x00\x0a\xff\xec\x03\ +8\x00Y\xff\xd7\x038\x00Z\xff\xd7\x038\x00[\xff\ +\xd7\x038\x00\x5c\xff\xd7\x038\x00]\xff\xec\x038\x00\ +\xbf\xff\xd7\x038\x017\xff\xd7\x038\x01<\xff\xec\x03\ +8\x01>\xff\xec\x038\x01@\xff\xec\x038\x01\xfb\xff\ +\xd7\x038\x01\xfd\xff\xd7\x038\x02\x07\xff\xec\x038\x02\ +\x0b\xff\xec\x038\x03p\xff\xd7\x039\x00-\x00{\x03\ +:\x00\x05\xff\xec\x03:\x00\x0a\xff\xec\x03:\x00Y\xff\ +\xd7\x03:\x00Z\xff\xd7\x03:\x00[\xff\xd7\x03:\x00\ +\x5c\xff\xd7\x03:\x00]\xff\xec\x03:\x00\xbf\xff\xd7\x03\ +:\x017\xff\xd7\x03:\x01<\xff\xec\x03:\x01>\xff\ +\xec\x03:\x01@\xff\xec\x03:\x01\xfb\xff\xd7\x03:\x01\ +\xfd\xff\xd7\x03:\x02\x07\xff\xec\x03:\x02\x0b\xff\xec\x03\ +:\x03p\xff\xd7\x03;\x00-\x00{\x03<\x00\x05\xff\ +\xec\x03<\x00\x0a\xff\xec\x03<\x00Y\xff\xd7\x03<\x00\ +Z\xff\xd7\x03<\x00[\xff\xd7\x03<\x00\x5c\xff\xd7\x03\ +<\x00]\xff\xec\x03<\x00\xbf\xff\xd7\x03<\x017\xff\ +\xd7\x03<\x01<\xff\xec\x03<\x01>\xff\xec\x03<\x01\ +@\xff\xec\x03<\x01\xfb\xff\xd7\x03<\x01\xfd\xff\xd7\x03\ +<\x02\x07\xff\xec\x03<\x02\x0b\xff\xec\x03<\x03p\xff\ +\xd7\x03=\x00-\x00{\x03>\x00\x05\xff\xec\x03>\x00\ +\x0a\xff\xec\x03>\x00Y\xff\xd7\x03>\x00Z\xff\xd7\x03\ +>\x00[\xff\xd7\x03>\x00\x5c\xff\xd7\x03>\x00]\xff\ +\xec\x03>\x00\xbf\xff\xd7\x03>\x017\xff\xd7\x03>\x01\ +<\xff\xec\x03>\x01>\xff\xec\x03>\x01@\xff\xec\x03\ +>\x01\xfb\xff\xd7\x03>\x01\xfd\xff\xd7\x03>\x02\x07\xff\ +\xec\x03>\x02\x0b\xff\xec\x03>\x03p\xff\xd7\x03?\x00\ +-\x00{\x03@\x00\x05\xff\xec\x03@\x00\x0a\xff\xec\x03\ +@\x00Y\xff\xd7\x03@\x00Z\xff\xd7\x03@\x00[\xff\ +\xd7\x03@\x00\x5c\xff\xd7\x03@\x00]\xff\xec\x03@\x00\ +\xbf\xff\xd7\x03@\x017\xff\xd7\x03@\x01<\xff\xec\x03\ +@\x01>\xff\xec\x03@\x01@\xff\xec\x03@\x01\xfb\xff\ +\xd7\x03@\x01\xfd\xff\xd7\x03@\x02\x07\xff\xec\x03@\x02\ +\x0b\xff\xec\x03@\x03p\xff\xd7\x03A\x00-\x00{\x03\ +B\x00\x05\xff\xec\x03B\x00\x0a\xff\xec\x03B\x00Y\xff\ +\xd7\x03B\x00Z\xff\xd7\x03B\x00[\xff\xd7\x03B\x00\ +\x5c\xff\xd7\x03B\x00]\xff\xec\x03B\x00\xbf\xff\xd7\x03\ +B\x017\xff\xd7\x03B\x01<\xff\xec\x03B\x01>\xff\ +\xec\x03B\x01@\xff\xec\x03B\x01\xfb\xff\xd7\x03B\x01\ +\xfd\xff\xd7\x03B\x02\x07\xff\xec\x03B\x02\x0b\xff\xec\x03\ +B\x03p\xff\xd7\x03C\x00-\x00{\x03D\x00\x05\xff\ +\xec\x03D\x00\x0a\xff\xec\x03D\x00Y\xff\xd7\x03D\x00\ +Z\xff\xd7\x03D\x00[\xff\xd7\x03D\x00\x5c\xff\xd7\x03\ +D\x00]\xff\xec\x03D\x00\xbf\xff\xd7\x03D\x017\xff\ +\xd7\x03D\x01<\xff\xec\x03D\x01>\xff\xec\x03D\x01\ +@\xff\xec\x03D\x01\xfb\xff\xd7\x03D\x01\xfd\xff\xd7\x03\ +D\x02\x07\xff\xec\x03D\x02\x0b\xff\xec\x03D\x03p\xff\ +\xd7\x03I\x00\x0f\xff\xae\x03I\x00\x11\xff\xae\x03I\x00\ +$\xff\xd7\x03I\x007\xff\xc3\x03I\x009\xff\xec\x03\ +I\x00:\xff\xec\x03I\x00;\xff\xd7\x03I\x00<\xff\ +\xec\x03I\x00=\xff\xec\x03I\x00\x82\xff\xd7\x03I\x00\ +\x83\xff\xd7\x03I\x00\x84\xff\xd7\x03I\x00\x85\xff\xd7\x03\ +I\x00\x86\xff\xd7\x03I\x00\x87\xff\xd7\x03I\x00\x9f\xff\ +\xec\x03I\x00\xc2\xff\xd7\x03I\x00\xc4\xff\xd7\x03I\x00\ +\xc6\xff\xd7\x03I\x01$\xff\xc3\x03I\x01&\xff\xc3\x03\ +I\x016\xff\xec\x03I\x018\xff\xec\x03I\x01:\xff\ +\xec\x03I\x01;\xff\xec\x03I\x01=\xff\xec\x03I\x01\ +?\xff\xec\x03I\x01C\xff\xd7\x03I\x01\xa0\xff\xec\x03\ +I\x01\xfa\xff\xec\x03I\x01\xfc\xff\xec\x03I\x01\xfe\xff\ +\xec\x03I\x02\x00\xff\xec\x03I\x02\x08\xff\xae\x03I\x02\ +\x0c\xff\xae\x03I\x02X\xff\xd7\x03I\x03\x1d\xff\xd7\x03\ +I\x03\x1f\xff\xd7\x03I\x03!\xff\xd7\x03I\x03#\xff\ +\xd7\x03I\x03%\xff\xd7\x03I\x03'\xff\xd7\x03I\x03\ +)\xff\xd7\x03I\x03+\xff\xd7\x03I\x03-\xff\xd7\x03\ +I\x03/\xff\xd7\x03I\x031\xff\xd7\x03I\x033\xff\ +\xd7\x03I\x03o\xff\xec\x03I\x03q\xff\xec\x03I\x03\ +s\xff\xec\x03I\x03\x8f\xff\xc3\x03J\x00\x05\xff\xec\x03\ +J\x00\x0a\xff\xec\x03J\x00Y\xff\xd7\x03J\x00Z\xff\ +\xd7\x03J\x00[\xff\xd7\x03J\x00\x5c\xff\xd7\x03J\x00\ +]\xff\xec\x03J\x00\xbf\xff\xd7\x03J\x017\xff\xd7\x03\ +J\x01<\xff\xec\x03J\x01>\xff\xec\x03J\x01@\xff\ +\xec\x03J\x01\xfb\xff\xd7\x03J\x01\xfd\xff\xd7\x03J\x02\ +\x07\xff\xec\x03J\x02\x0b\xff\xec\x03J\x03p\xff\xd7\x03\ +K\x00\x0f\xff\xae\x03K\x00\x11\xff\xae\x03K\x00$\xff\ +\xd7\x03K\x007\xff\xc3\x03K\x009\xff\xec\x03K\x00\ +:\xff\xec\x03K\x00;\xff\xd7\x03K\x00<\xff\xec\x03\ +K\x00=\xff\xec\x03K\x00\x82\xff\xd7\x03K\x00\x83\xff\ +\xd7\x03K\x00\x84\xff\xd7\x03K\x00\x85\xff\xd7\x03K\x00\ +\x86\xff\xd7\x03K\x00\x87\xff\xd7\x03K\x00\x9f\xff\xec\x03\ +K\x00\xc2\xff\xd7\x03K\x00\xc4\xff\xd7\x03K\x00\xc6\xff\ +\xd7\x03K\x01$\xff\xc3\x03K\x01&\xff\xc3\x03K\x01\ +6\xff\xec\x03K\x018\xff\xec\x03K\x01:\xff\xec\x03\ +K\x01;\xff\xec\x03K\x01=\xff\xec\x03K\x01?\xff\ +\xec\x03K\x01C\xff\xd7\x03K\x01\xa0\xff\xec\x03K\x01\ +\xfa\xff\xec\x03K\x01\xfc\xff\xec\x03K\x01\xfe\xff\xec\x03\ +K\x02\x00\xff\xec\x03K\x02\x08\xff\xae\x03K\x02\x0c\xff\ +\xae\x03K\x02X\xff\xd7\x03K\x03\x1d\xff\xd7\x03K\x03\ +\x1f\xff\xd7\x03K\x03!\xff\xd7\x03K\x03#\xff\xd7\x03\ +K\x03%\xff\xd7\x03K\x03'\xff\xd7\x03K\x03)\xff\ +\xd7\x03K\x03+\xff\xd7\x03K\x03-\xff\xd7\x03K\x03\ +/\xff\xd7\x03K\x031\xff\xd7\x03K\x033\xff\xd7\x03\ +K\x03o\xff\xec\x03K\x03q\xff\xec\x03K\x03s\xff\ +\xec\x03K\x03\x8f\xff\xc3\x03L\x00\x05\xff\xec\x03L\x00\ +\x0a\xff\xec\x03L\x00Y\xff\xd7\x03L\x00Z\xff\xd7\x03\ +L\x00[\xff\xd7\x03L\x00\x5c\xff\xd7\x03L\x00]\xff\ +\xec\x03L\x00\xbf\xff\xd7\x03L\x017\xff\xd7\x03L\x01\ +<\xff\xec\x03L\x01>\xff\xec\x03L\x01@\xff\xec\x03\ +L\x01\xfb\xff\xd7\x03L\x01\xfd\xff\xd7\x03L\x02\x07\xff\ +\xec\x03L\x02\x0b\xff\xec\x03L\x03p\xff\xd7\x03M\x00\ +\x0f\xff\xae\x03M\x00\x11\xff\xae\x03M\x00$\xff\xd7\x03\ +M\x007\xff\xc3\x03M\x009\xff\xec\x03M\x00:\xff\ +\xec\x03M\x00;\xff\xd7\x03M\x00<\xff\xec\x03M\x00\ +=\xff\xec\x03M\x00\x82\xff\xd7\x03M\x00\x83\xff\xd7\x03\ +M\x00\x84\xff\xd7\x03M\x00\x85\xff\xd7\x03M\x00\x86\xff\ +\xd7\x03M\x00\x87\xff\xd7\x03M\x00\x9f\xff\xec\x03M\x00\ +\xc2\xff\xd7\x03M\x00\xc4\xff\xd7\x03M\x00\xc6\xff\xd7\x03\ +M\x01$\xff\xc3\x03M\x01&\xff\xc3\x03M\x016\xff\ +\xec\x03M\x018\xff\xec\x03M\x01:\xff\xec\x03M\x01\ +;\xff\xec\x03M\x01=\xff\xec\x03M\x01?\xff\xec\x03\ +M\x01C\xff\xd7\x03M\x01\xa0\xff\xec\x03M\x01\xfa\xff\ +\xec\x03M\x01\xfc\xff\xec\x03M\x01\xfe\xff\xec\x03M\x02\ +\x00\xff\xec\x03M\x02\x08\xff\xae\x03M\x02\x0c\xff\xae\x03\ +M\x02X\xff\xd7\x03M\x03\x1d\xff\xd7\x03M\x03\x1f\xff\ +\xd7\x03M\x03!\xff\xd7\x03M\x03#\xff\xd7\x03M\x03\ +%\xff\xd7\x03M\x03'\xff\xd7\x03M\x03)\xff\xd7\x03\ +M\x03+\xff\xd7\x03M\x03-\xff\xd7\x03M\x03/\xff\ +\xd7\x03M\x031\xff\xd7\x03M\x033\xff\xd7\x03M\x03\ +o\xff\xec\x03M\x03q\xff\xec\x03M\x03s\xff\xec\x03\ +M\x03\x8f\xff\xc3\x03O\x00\x0f\xff\xae\x03O\x00\x11\xff\ +\xae\x03O\x00$\xff\xd7\x03O\x007\xff\xc3\x03O\x00\ +9\xff\xec\x03O\x00:\xff\xec\x03O\x00;\xff\xd7\x03\ +O\x00<\xff\xec\x03O\x00=\xff\xec\x03O\x00\x82\xff\ +\xd7\x03O\x00\x83\xff\xd7\x03O\x00\x84\xff\xd7\x03O\x00\ +\x85\xff\xd7\x03O\x00\x86\xff\xd7\x03O\x00\x87\xff\xd7\x03\ +O\x00\x9f\xff\xec\x03O\x00\xc2\xff\xd7\x03O\x00\xc4\xff\ +\xd7\x03O\x00\xc6\xff\xd7\x03O\x01$\xff\xc3\x03O\x01\ +&\xff\xc3\x03O\x016\xff\xec\x03O\x018\xff\xec\x03\ +O\x01:\xff\xec\x03O\x01;\xff\xec\x03O\x01=\xff\ +\xec\x03O\x01?\xff\xec\x03O\x01C\xff\xd7\x03O\x01\ +\xa0\xff\xec\x03O\x01\xfa\xff\xec\x03O\x01\xfc\xff\xec\x03\ +O\x01\xfe\xff\xec\x03O\x02\x00\xff\xec\x03O\x02\x08\xff\ +\xae\x03O\x02\x0c\xff\xae\x03O\x02X\xff\xd7\x03O\x03\ +\x1d\xff\xd7\x03O\x03\x1f\xff\xd7\x03O\x03!\xff\xd7\x03\ +O\x03#\xff\xd7\x03O\x03%\xff\xd7\x03O\x03'\xff\ +\xd7\x03O\x03)\xff\xd7\x03O\x03+\xff\xd7\x03O\x03\ +-\xff\xd7\x03O\x03/\xff\xd7\x03O\x031\xff\xd7\x03\ +O\x033\xff\xd7\x03O\x03o\xff\xec\x03O\x03q\xff\ +\xec\x03O\x03s\xff\xec\x03O\x03\x8f\xff\xc3\x03Q\x00\ +\x0f\xff\xae\x03Q\x00\x11\xff\xae\x03Q\x00$\xff\xd7\x03\ +Q\x007\xff\xc3\x03Q\x009\xff\xec\x03Q\x00:\xff\ +\xec\x03Q\x00;\xff\xd7\x03Q\x00<\xff\xec\x03Q\x00\ +=\xff\xec\x03Q\x00\x82\xff\xd7\x03Q\x00\x83\xff\xd7\x03\ +Q\x00\x84\xff\xd7\x03Q\x00\x85\xff\xd7\x03Q\x00\x86\xff\ +\xd7\x03Q\x00\x87\xff\xd7\x03Q\x00\x9f\xff\xec\x03Q\x00\ +\xc2\xff\xd7\x03Q\x00\xc4\xff\xd7\x03Q\x00\xc6\xff\xd7\x03\ +Q\x01$\xff\xc3\x03Q\x01&\xff\xc3\x03Q\x016\xff\ +\xec\x03Q\x018\xff\xec\x03Q\x01:\xff\xec\x03Q\x01\ +;\xff\xec\x03Q\x01=\xff\xec\x03Q\x01?\xff\xec\x03\ +Q\x01C\xff\xd7\x03Q\x01\xa0\xff\xec\x03Q\x01\xfa\xff\ +\xec\x03Q\x01\xfc\xff\xec\x03Q\x01\xfe\xff\xec\x03Q\x02\ +\x00\xff\xec\x03Q\x02\x08\xff\xae\x03Q\x02\x0c\xff\xae\x03\ +Q\x02X\xff\xd7\x03Q\x03\x1d\xff\xd7\x03Q\x03\x1f\xff\ +\xd7\x03Q\x03!\xff\xd7\x03Q\x03#\xff\xd7\x03Q\x03\ +%\xff\xd7\x03Q\x03'\xff\xd7\x03Q\x03)\xff\xd7\x03\ +Q\x03+\xff\xd7\x03Q\x03-\xff\xd7\x03Q\x03/\xff\ +\xd7\x03Q\x031\xff\xd7\x03Q\x033\xff\xd7\x03Q\x03\ +o\xff\xec\x03Q\x03q\xff\xec\x03Q\x03s\xff\xec\x03\ +Q\x03\x8f\xff\xc3\x03S\x00\x0f\xff\xae\x03S\x00\x11\xff\ +\xae\x03S\x00$\xff\xd7\x03S\x007\xff\xc3\x03S\x00\ +9\xff\xec\x03S\x00:\xff\xec\x03S\x00;\xff\xd7\x03\ +S\x00<\xff\xec\x03S\x00=\xff\xec\x03S\x00\x82\xff\ +\xd7\x03S\x00\x83\xff\xd7\x03S\x00\x84\xff\xd7\x03S\x00\ +\x85\xff\xd7\x03S\x00\x86\xff\xd7\x03S\x00\x87\xff\xd7\x03\ +S\x00\x9f\xff\xec\x03S\x00\xc2\xff\xd7\x03S\x00\xc4\xff\ +\xd7\x03S\x00\xc6\xff\xd7\x03S\x01$\xff\xc3\x03S\x01\ +&\xff\xc3\x03S\x016\xff\xec\x03S\x018\xff\xec\x03\ +S\x01:\xff\xec\x03S\x01;\xff\xec\x03S\x01=\xff\ +\xec\x03S\x01?\xff\xec\x03S\x01C\xff\xd7\x03S\x01\ +\xa0\xff\xec\x03S\x01\xfa\xff\xec\x03S\x01\xfc\xff\xec\x03\ +S\x01\xfe\xff\xec\x03S\x02\x00\xff\xec\x03S\x02\x08\xff\ +\xae\x03S\x02\x0c\xff\xae\x03S\x02X\xff\xd7\x03S\x03\ +\x1d\xff\xd7\x03S\x03\x1f\xff\xd7\x03S\x03!\xff\xd7\x03\ +S\x03#\xff\xd7\x03S\x03%\xff\xd7\x03S\x03'\xff\ +\xd7\x03S\x03)\xff\xd7\x03S\x03+\xff\xd7\x03S\x03\ +-\xff\xd7\x03S\x03/\xff\xd7\x03S\x031\xff\xd7\x03\ +S\x033\xff\xd7\x03S\x03o\xff\xec\x03S\x03q\xff\ +\xec\x03S\x03s\xff\xec\x03S\x03\x8f\xff\xc3\x03U\x00\ +\x0f\xff\xae\x03U\x00\x11\xff\xae\x03U\x00$\xff\xd7\x03\ +U\x007\xff\xc3\x03U\x009\xff\xec\x03U\x00:\xff\ +\xec\x03U\x00;\xff\xd7\x03U\x00<\xff\xec\x03U\x00\ +=\xff\xec\x03U\x00\x82\xff\xd7\x03U\x00\x83\xff\xd7\x03\ +U\x00\x84\xff\xd7\x03U\x00\x85\xff\xd7\x03U\x00\x86\xff\ +\xd7\x03U\x00\x87\xff\xd7\x03U\x00\x9f\xff\xec\x03U\x00\ +\xc2\xff\xd7\x03U\x00\xc4\xff\xd7\x03U\x00\xc6\xff\xd7\x03\ +U\x01$\xff\xc3\x03U\x01&\xff\xc3\x03U\x016\xff\ +\xec\x03U\x018\xff\xec\x03U\x01:\xff\xec\x03U\x01\ +;\xff\xec\x03U\x01=\xff\xec\x03U\x01?\xff\xec\x03\ +U\x01C\xff\xd7\x03U\x01\xa0\xff\xec\x03U\x01\xfa\xff\ +\xec\x03U\x01\xfc\xff\xec\x03U\x01\xfe\xff\xec\x03U\x02\ +\x00\xff\xec\x03U\x02\x08\xff\xae\x03U\x02\x0c\xff\xae\x03\ +U\x02X\xff\xd7\x03U\x03\x1d\xff\xd7\x03U\x03\x1f\xff\ +\xd7\x03U\x03!\xff\xd7\x03U\x03#\xff\xd7\x03U\x03\ +%\xff\xd7\x03U\x03'\xff\xd7\x03U\x03)\xff\xd7\x03\ +U\x03+\xff\xd7\x03U\x03-\xff\xd7\x03U\x03/\xff\ +\xd7\x03U\x031\xff\xd7\x03U\x033\xff\xd7\x03U\x03\ +o\xff\xec\x03U\x03q\xff\xec\x03U\x03s\xff\xec\x03\ +U\x03\x8f\xff\xc3\x03X\x00I\x00R\x03X\x00W\x00\ +R\x03X\x00Y\x00f\x03X\x00Z\x00f\x03X\x00\ +[\x00f\x03X\x00\x5c\x00f\x03X\x00\xbf\x00f\x03\ +X\x01%\x00R\x03X\x01'\x00R\x03X\x017\x00\ +f\x03X\x01\xfb\x00f\x03X\x01\xfd\x00f\x03X\x02\ +4\x00R\x03X\x025\x00R\x03X\x02]\x00R\x03\ +X\x02^\x00R\x03X\x03p\x00f\x03X\x03\x8d\x00\ +R\x03X\x03\x90\x00R\x03Z\x00I\x00R\x03Z\x00\ +W\x00R\x03Z\x00Y\x00f\x03Z\x00Z\x00f\x03\ +Z\x00[\x00f\x03Z\x00\x5c\x00f\x03Z\x00\xbf\x00\ +f\x03Z\x01%\x00R\x03Z\x01'\x00R\x03Z\x01\ +7\x00f\x03Z\x01\xfb\x00f\x03Z\x01\xfd\x00f\x03\ +Z\x024\x00R\x03Z\x025\x00R\x03Z\x02]\x00\ +R\x03Z\x02^\x00R\x03Z\x03p\x00f\x03Z\x03\ +\x8d\x00R\x03Z\x03\x90\x00R\x03\x5c\x00I\x00R\x03\ +\x5c\x00W\x00R\x03\x5c\x00Y\x00f\x03\x5c\x00Z\x00\ +f\x03\x5c\x00[\x00f\x03\x5c\x00\x5c\x00f\x03\x5c\x00\ +\xbf\x00f\x03\x5c\x01%\x00R\x03\x5c\x01'\x00R\x03\ +\x5c\x017\x00f\x03\x5c\x01\xfb\x00f\x03\x5c\x01\xfd\x00\ +f\x03\x5c\x024\x00R\x03\x5c\x025\x00R\x03\x5c\x02\ +]\x00R\x03\x5c\x02^\x00R\x03\x5c\x03p\x00f\x03\ +\x5c\x03\x8d\x00R\x03\x5c\x03\x90\x00R\x03^\x00I\x00\ +R\x03^\x00W\x00R\x03^\x00Y\x00f\x03^\x00\ +Z\x00f\x03^\x00[\x00f\x03^\x00\x5c\x00f\x03\ +^\x00\xbf\x00f\x03^\x01%\x00R\x03^\x01'\x00\ +R\x03^\x017\x00f\x03^\x01\xfb\x00f\x03^\x01\ +\xfd\x00f\x03^\x024\x00R\x03^\x025\x00R\x03\ +^\x02]\x00R\x03^\x02^\x00R\x03^\x03p\x00\ +f\x03^\x03\x8d\x00R\x03^\x03\x90\x00R\x03`\x00\ +I\x00R\x03`\x00W\x00R\x03`\x00Y\x00f\x03\ +`\x00Z\x00f\x03`\x00[\x00f\x03`\x00\x5c\x00\ +f\x03`\x00\xbf\x00f\x03`\x01%\x00R\x03`\x01\ +'\x00R\x03`\x017\x00f\x03`\x01\xfb\x00f\x03\ +`\x01\xfd\x00f\x03`\x024\x00R\x03`\x025\x00\ +R\x03`\x02]\x00R\x03`\x02^\x00R\x03`\x03\ +p\x00f\x03`\x03\x8d\x00R\x03`\x03\x90\x00R\x03\ +a\x00\x0f\xff\xd7\x03a\x00\x11\xff\xd7\x03a\x00$\xff\ +\xec\x03a\x00\x82\xff\xec\x03a\x00\x83\xff\xec\x03a\x00\ +\x84\xff\xec\x03a\x00\x85\xff\xec\x03a\x00\x86\xff\xec\x03\ +a\x00\x87\xff\xec\x03a\x00\xc2\xff\xec\x03a\x00\xc4\xff\ +\xec\x03a\x00\xc6\xff\xec\x03a\x01C\xff\xec\x03a\x02\ +\x08\xff\xd7\x03a\x02\x0c\xff\xd7\x03a\x02X\xff\xec\x03\ +a\x03\x1d\xff\xec\x03a\x03\x1f\xff\xec\x03a\x03!\xff\ +\xec\x03a\x03#\xff\xec\x03a\x03%\xff\xec\x03a\x03\ +'\xff\xec\x03a\x03)\xff\xec\x03a\x03+\xff\xec\x03\ +a\x03-\xff\xec\x03a\x03/\xff\xec\x03a\x031\xff\ +\xec\x03a\x033\xff\xec\x03f\x00I\x00f\x03f\x00\ +W\x00f\x03f\x00Y\x00f\x03f\x00Z\x00f\x03\ +f\x00[\x00f\x03f\x00\x5c\x00f\x03f\x00\xbf\x00\ +f\x03f\x01%\x00f\x03f\x01'\x00f\x03f\x01\ +7\x00f\x03f\x01\xfb\x00f\x03f\x01\xfd\x00f\x03\ +f\x024\x00f\x03f\x025\x00f\x03f\x02]\x00\ +f\x03f\x02^\x00f\x03f\x03p\x00f\x03f\x03\ +\x8d\x00f\x03f\x03\x90\x00f\x03h\x00I\x00f\x03\ +h\x00W\x00f\x03h\x00Y\x00f\x03h\x00Z\x00\ +f\x03h\x00[\x00f\x03h\x00\x5c\x00f\x03h\x00\ +\xbf\x00f\x03h\x01%\x00f\x03h\x01'\x00f\x03\ +h\x017\x00f\x03h\x01\xfb\x00f\x03h\x01\xfd\x00\ +f\x03h\x024\x00f\x03h\x025\x00f\x03h\x02\ +]\x00f\x03h\x02^\x00f\x03h\x03p\x00f\x03\ +h\x03\x8d\x00f\x03h\x03\x90\x00f\x03j\x00I\x00\ +f\x03j\x00W\x00f\x03j\x00Y\x00f\x03j\x00\ +Z\x00f\x03j\x00[\x00f\x03j\x00\x5c\x00f\x03\ +j\x00\xbf\x00f\x03j\x01%\x00f\x03j\x01'\x00\ +f\x03j\x017\x00f\x03j\x01\xfb\x00f\x03j\x01\ +\xfd\x00f\x03j\x024\x00f\x03j\x025\x00f\x03\ +j\x02]\x00f\x03j\x02^\x00f\x03j\x03p\x00\ +f\x03j\x03\x8d\x00f\x03j\x03\x90\x00f\x03l\x00\ +I\x00f\x03l\x00W\x00f\x03l\x00Y\x00f\x03\ +l\x00Z\x00f\x03l\x00[\x00f\x03l\x00\x5c\x00\ +f\x03l\x00\xbf\x00f\x03l\x01%\x00f\x03l\x01\ +'\x00f\x03l\x017\x00f\x03l\x01\xfb\x00f\x03\ +l\x01\xfd\x00f\x03l\x024\x00f\x03l\x025\x00\ +f\x03l\x02]\x00f\x03l\x02^\x00f\x03l\x03\ +p\x00f\x03l\x03\x8d\x00f\x03l\x03\x90\x00f\x03\ +n\x00I\x00f\x03n\x00W\x00f\x03n\x00Y\x00\ +f\x03n\x00Z\x00f\x03n\x00[\x00f\x03n\x00\ +\x5c\x00f\x03n\x00\xbf\x00f\x03n\x01%\x00f\x03\ +n\x01'\x00f\x03n\x017\x00f\x03n\x01\xfb\x00\ +f\x03n\x01\xfd\x00f\x03n\x024\x00f\x03n\x02\ +5\x00f\x03n\x02]\x00f\x03n\x02^\x00f\x03\ +n\x03p\x00f\x03n\x03\x8d\x00f\x03n\x03\x90\x00\ +f\x03o\x00\x0f\xff\x85\x03o\x00\x11\xff\x85\x03o\x00\ +\x22\x00)\x03o\x00$\xff\x85\x03o\x00&\xff\xd7\x03\ +o\x00*\xff\xd7\x03o\x002\xff\xd7\x03o\x004\xff\ +\xd7\x03o\x00D\xff\x9a\x03o\x00F\xff\x9a\x03o\x00\ +G\xff\x9a\x03o\x00H\xff\x9a\x03o\x00J\xff\xd7\x03\ +o\x00P\xff\xc3\x03o\x00Q\xff\xc3\x03o\x00R\xff\ +\x9a\x03o\x00S\xff\xc3\x03o\x00T\xff\x9a\x03o\x00\ +U\xff\xc3\x03o\x00V\xff\xae\x03o\x00X\xff\xc3\x03\ +o\x00]\xff\xd7\x03o\x00\x82\xff\x85\x03o\x00\x83\xff\ +\x85\x03o\x00\x84\xff\x85\x03o\x00\x85\xff\x85\x03o\x00\ +\x86\xff\x85\x03o\x00\x87\xff\x85\x03o\x00\x89\xff\xd7\x03\ +o\x00\x94\xff\xd7\x03o\x00\x95\xff\xd7\x03o\x00\x96\xff\ +\xd7\x03o\x00\x97\xff\xd7\x03o\x00\x98\xff\xd7\x03o\x00\ +\x9a\xff\xd7\x03o\x00\xa2\xff\x9a\x03o\x00\xa3\xff\x9a\x03\ +o\x00\xa4\xff\x9a\x03o\x00\xa5\xff\x9a\x03o\x00\xa6\xff\ +\x9a\x03o\x00\xa7\xff\x9a\x03o\x00\xa8\xff\x9a\x03o\x00\ +\xa9\xff\x9a\x03o\x00\xaa\xff\x9a\x03o\x00\xab\xff\x9a\x03\ +o\x00\xac\xff\x9a\x03o\x00\xad\xff\x9a\x03o\x00\xb4\xff\ +\x9a\x03o\x00\xb5\xff\x9a\x03o\x00\xb6\xff\x9a\x03o\x00\ +\xb7\xff\x9a\x03o\x00\xb8\xff\x9a\x03o\x00\xba\xff\x9a\x03\ +o\x00\xbb\xff\xc3\x03o\x00\xbc\xff\xc3\x03o\x00\xbd\xff\ +\xc3\x03o\x00\xbe\xff\xc3\x03o\x00\xc2\xff\x85\x03o\x00\ +\xc3\xff\x9a\x03o\x00\xc4\xff\x85\x03o\x00\xc5\xff\x9a\x03\ +o\x00\xc6\xff\x85\x03o\x00\xc7\xff\x9a\x03o\x00\xc8\xff\ +\xd7\x03o\x00\xc9\xff\x9a\x03o\x00\xca\xff\xd7\x03o\x00\ +\xcb\xff\x9a\x03o\x00\xcc\xff\xd7\x03o\x00\xcd\xff\x9a\x03\ +o\x00\xce\xff\xd7\x03o\x00\xcf\xff\x9a\x03o\x00\xd1\xff\ +\x9a\x03o\x00\xd3\xff\x9a\x03o\x00\xd5\xff\x9a\x03o\x00\ +\xd7\xff\x9a\x03o\x00\xd9\xff\x9a\x03o\x00\xdb\xff\x9a\x03\ +o\x00\xdd\xff\x9a\x03o\x00\xde\xff\xd7\x03o\x00\xdf\xff\ +\xd7\x03o\x00\xe0\xff\xd7\x03o\x00\xe1\xff\xd7\x03o\x00\ +\xe2\xff\xd7\x03o\x00\xe3\xff\xd7\x03o\x00\xe4\xff\xd7\x03\ +o\x00\xe5\xff\xd7\x03o\x00\xfa\xff\xc3\x03o\x01\x06\xff\ +\xc3\x03o\x01\x08\xff\xc3\x03o\x01\x0d\xff\xc3\x03o\x01\ +\x0e\xff\xd7\x03o\x01\x0f\xff\x9a\x03o\x01\x10\xff\xd7\x03\ +o\x01\x11\xff\x9a\x03o\x01\x12\xff\xd7\x03o\x01\x13\xff\ +\x9a\x03o\x01\x14\xff\xd7\x03o\x01\x15\xff\x9a\x03o\x01\ +\x17\xff\xc3\x03o\x01\x19\xff\xc3\x03o\x01\x1d\xff\xae\x03\ +o\x01!\xff\xae\x03o\x01+\xff\xc3\x03o\x01-\xff\ +\xc3\x03o\x01/\xff\xc3\x03o\x011\xff\xc3\x03o\x01\ +3\xff\xc3\x03o\x015\xff\xc3\x03o\x01<\xff\xd7\x03\ +o\x01>\xff\xd7\x03o\x01@\xff\xd7\x03o\x01C\xff\ +\x85\x03o\x01D\xff\x9a\x03o\x01F\xff\x9a\x03o\x01\ +G\xff\xd7\x03o\x01H\xff\x9a\x03o\x01J\xff\xae\x03\ +o\x02\x08\xff\x85\x03o\x02\x0c\xff\x85\x03o\x02W\xff\ +\xc3\x03o\x02X\xff\x85\x03o\x02Y\xff\x9a\x03o\x02\ +_\xff\xd7\x03o\x02`\xff\x9a\x03o\x02b\xff\xc3\x03\ +o\x03\x1d\xff\x85\x03o\x03\x1e\xff\x9a\x03o\x03\x1f\xff\ +\x85\x03o\x03 \xff\x9a\x03o\x03!\xff\x85\x03o\x03\ +\x22\xff\x9a\x03o\x03#\xff\x85\x03o\x03%\xff\x85\x03\ +o\x03&\xff\x9a\x03o\x03'\xff\x85\x03o\x03(\xff\ +\x9a\x03o\x03)\xff\x85\x03o\x03*\xff\x9a\x03o\x03\ ++\xff\x85\x03o\x03,\xff\x9a\x03o\x03-\xff\x85\x03\ +o\x03.\xff\x9a\x03o\x03/\xff\x85\x03o\x030\xff\ +\x9a\x03o\x031\xff\x85\x03o\x032\xff\x9a\x03o\x03\ +3\xff\x85\x03o\x034\xff\x9a\x03o\x036\xff\x9a\x03\ +o\x038\xff\x9a\x03o\x03:\xff\x9a\x03o\x03<\xff\ +\x9a\x03o\x03@\xff\x9a\x03o\x03B\xff\x9a\x03o\x03\ +D\xff\x9a\x03o\x03I\xff\xd7\x03o\x03J\xff\x9a\x03\ +o\x03K\xff\xd7\x03o\x03L\xff\x9a\x03o\x03M\xff\ +\xd7\x03o\x03N\xff\x9a\x03o\x03O\xff\xd7\x03o\x03\ +Q\xff\xd7\x03o\x03R\xff\x9a\x03o\x03S\xff\xd7\x03\ +o\x03T\xff\x9a\x03o\x03U\xff\xd7\x03o\x03V\xff\ +\x9a\x03o\x03W\xff\xd7\x03o\x03X\xff\x9a\x03o\x03\ +Y\xff\xd7\x03o\x03Z\xff\x9a\x03o\x03[\xff\xd7\x03\ +o\x03\x5c\xff\x9a\x03o\x03]\xff\xd7\x03o\x03^\xff\ +\x9a\x03o\x03_\xff\xd7\x03o\x03`\xff\x9a\x03o\x03\ +b\xff\xc3\x03o\x03d\xff\xc3\x03o\x03f\xff\xc3\x03\ +o\x03h\xff\xc3\x03o\x03j\xff\xc3\x03o\x03l\xff\ +\xc3\x03o\x03n\xff\xc3\x03p\x00\x05\x00R\x03p\x00\ +\x0a\x00R\x03p\x00\x0f\xff\xae\x03p\x00\x11\xff\xae\x03\ +p\x00\x22\x00)\x03p\x02\x07\x00R\x03p\x02\x08\xff\ +\xae\x03p\x02\x0b\x00R\x03p\x02\x0c\xff\xae\x03q\x00\ +\x0f\xff\x85\x03q\x00\x11\xff\x85\x03q\x00\x22\x00)\x03\ +q\x00$\xff\x85\x03q\x00&\xff\xd7\x03q\x00*\xff\ +\xd7\x03q\x002\xff\xd7\x03q\x004\xff\xd7\x03q\x00\ +D\xff\x9a\x03q\x00F\xff\x9a\x03q\x00G\xff\x9a\x03\ +q\x00H\xff\x9a\x03q\x00J\xff\xd7\x03q\x00P\xff\ +\xc3\x03q\x00Q\xff\xc3\x03q\x00R\xff\x9a\x03q\x00\ +S\xff\xc3\x03q\x00T\xff\x9a\x03q\x00U\xff\xc3\x03\ +q\x00V\xff\xae\x03q\x00X\xff\xc3\x03q\x00]\xff\ +\xd7\x03q\x00\x82\xff\x85\x03q\x00\x83\xff\x85\x03q\x00\ +\x84\xff\x85\x03q\x00\x85\xff\x85\x03q\x00\x86\xff\x85\x03\ +q\x00\x87\xff\x85\x03q\x00\x89\xff\xd7\x03q\x00\x94\xff\ +\xd7\x03q\x00\x95\xff\xd7\x03q\x00\x96\xff\xd7\x03q\x00\ +\x97\xff\xd7\x03q\x00\x98\xff\xd7\x03q\x00\x9a\xff\xd7\x03\ +q\x00\xa2\xff\x9a\x03q\x00\xa3\xff\x9a\x03q\x00\xa4\xff\ +\x9a\x03q\x00\xa5\xff\x9a\x03q\x00\xa6\xff\x9a\x03q\x00\ +\xa7\xff\x9a\x03q\x00\xa8\xff\x9a\x03q\x00\xa9\xff\x9a\x03\ +q\x00\xaa\xff\x9a\x03q\x00\xab\xff\x9a\x03q\x00\xac\xff\ +\x9a\x03q\x00\xad\xff\x9a\x03q\x00\xb4\xff\x9a\x03q\x00\ +\xb5\xff\x9a\x03q\x00\xb6\xff\x9a\x03q\x00\xb7\xff\x9a\x03\ +q\x00\xb8\xff\x9a\x03q\x00\xba\xff\x9a\x03q\x00\xbb\xff\ +\xc3\x03q\x00\xbc\xff\xc3\x03q\x00\xbd\xff\xc3\x03q\x00\ +\xbe\xff\xc3\x03q\x00\xc2\xff\x85\x03q\x00\xc3\xff\x9a\x03\ +q\x00\xc4\xff\x85\x03q\x00\xc5\xff\x9a\x03q\x00\xc6\xff\ +\x85\x03q\x00\xc7\xff\x9a\x03q\x00\xc8\xff\xd7\x03q\x00\ +\xc9\xff\x9a\x03q\x00\xca\xff\xd7\x03q\x00\xcb\xff\x9a\x03\ +q\x00\xcc\xff\xd7\x03q\x00\xcd\xff\x9a\x03q\x00\xce\xff\ +\xd7\x03q\x00\xcf\xff\x9a\x03q\x00\xd1\xff\x9a\x03q\x00\ +\xd3\xff\x9a\x03q\x00\xd5\xff\x9a\x03q\x00\xd7\xff\x9a\x03\ +q\x00\xd9\xff\x9a\x03q\x00\xdb\xff\x9a\x03q\x00\xdd\xff\ +\x9a\x03q\x00\xde\xff\xd7\x03q\x00\xdf\xff\xd7\x03q\x00\ +\xe0\xff\xd7\x03q\x00\xe1\xff\xd7\x03q\x00\xe2\xff\xd7\x03\ +q\x00\xe3\xff\xd7\x03q\x00\xe4\xff\xd7\x03q\x00\xe5\xff\ +\xd7\x03q\x00\xfa\xff\xc3\x03q\x01\x06\xff\xc3\x03q\x01\ +\x08\xff\xc3\x03q\x01\x0d\xff\xc3\x03q\x01\x0e\xff\xd7\x03\ +q\x01\x0f\xff\x9a\x03q\x01\x10\xff\xd7\x03q\x01\x11\xff\ +\x9a\x03q\x01\x12\xff\xd7\x03q\x01\x13\xff\x9a\x03q\x01\ +\x14\xff\xd7\x03q\x01\x15\xff\x9a\x03q\x01\x17\xff\xc3\x03\ +q\x01\x19\xff\xc3\x03q\x01\x1d\xff\xae\x03q\x01!\xff\ +\xae\x03q\x01+\xff\xc3\x03q\x01-\xff\xc3\x03q\x01\ +/\xff\xc3\x03q\x011\xff\xc3\x03q\x013\xff\xc3\x03\ +q\x015\xff\xc3\x03q\x01<\xff\xd7\x03q\x01>\xff\ +\xd7\x03q\x01@\xff\xd7\x03q\x01C\xff\x85\x03q\x01\ +D\xff\x9a\x03q\x01F\xff\x9a\x03q\x01G\xff\xd7\x03\ +q\x01H\xff\x9a\x03q\x01J\xff\xae\x03q\x02\x08\xff\ +\x85\x03q\x02\x0c\xff\x85\x03q\x02W\xff\xc3\x03q\x02\ +X\xff\x85\x03q\x02Y\xff\x9a\x03q\x02_\xff\xd7\x03\ +q\x02`\xff\x9a\x03q\x02b\xff\xc3\x03q\x03\x1d\xff\ +\x85\x03q\x03\x1e\xff\x9a\x03q\x03\x1f\xff\x85\x03q\x03\ + \xff\x9a\x03q\x03!\xff\x85\x03q\x03\x22\xff\x9a\x03\ +q\x03#\xff\x85\x03q\x03%\xff\x85\x03q\x03&\xff\ +\x9a\x03q\x03'\xff\x85\x03q\x03(\xff\x9a\x03q\x03\ +)\xff\x85\x03q\x03*\xff\x9a\x03q\x03+\xff\x85\x03\ +q\x03,\xff\x9a\x03q\x03-\xff\x85\x03q\x03.\xff\ +\x9a\x03q\x03/\xff\x85\x03q\x030\xff\x9a\x03q\x03\ +1\xff\x85\x03q\x032\xff\x9a\x03q\x033\xff\x85\x03\ +q\x034\xff\x9a\x03q\x036\xff\x9a\x03q\x038\xff\ +\x9a\x03q\x03:\xff\x9a\x03q\x03<\xff\x9a\x03q\x03\ +@\xff\x9a\x03q\x03B\xff\x9a\x03q\x03D\xff\x9a\x03\ +q\x03I\xff\xd7\x03q\x03J\xff\x9a\x03q\x03K\xff\ +\xd7\x03q\x03L\xff\x9a\x03q\x03M\xff\xd7\x03q\x03\ +N\xff\x9a\x03q\x03O\xff\xd7\x03q\x03Q\xff\xd7\x03\ +q\x03R\xff\x9a\x03q\x03S\xff\xd7\x03q\x03T\xff\ +\x9a\x03q\x03U\xff\xd7\x03q\x03V\xff\x9a\x03q\x03\ +W\xff\xd7\x03q\x03X\xff\x9a\x03q\x03Y\xff\xd7\x03\ +q\x03Z\xff\x9a\x03q\x03[\xff\xd7\x03q\x03\x5c\xff\ +\x9a\x03q\x03]\xff\xd7\x03q\x03^\xff\x9a\x03q\x03\ +_\xff\xd7\x03q\x03`\xff\x9a\x03q\x03b\xff\xc3\x03\ +q\x03d\xff\xc3\x03q\x03f\xff\xc3\x03q\x03h\xff\ +\xc3\x03q\x03j\xff\xc3\x03q\x03l\xff\xc3\x03q\x03\ +n\xff\xc3\x03r\x00\x05\x00R\x03r\x00\x0a\x00R\x03\ +r\x00\x0f\xff\xae\x03r\x00\x11\xff\xae\x03r\x00\x22\x00\ +)\x03r\x02\x07\x00R\x03r\x02\x08\xff\xae\x03r\x02\ +\x0b\x00R\x03r\x02\x0c\xff\xae\x03s\x00\x0f\xff\x85\x03\ +s\x00\x11\xff\x85\x03s\x00\x22\x00)\x03s\x00$\xff\ +\x85\x03s\x00&\xff\xd7\x03s\x00*\xff\xd7\x03s\x00\ +2\xff\xd7\x03s\x004\xff\xd7\x03s\x00D\xff\x9a\x03\ +s\x00F\xff\x9a\x03s\x00G\xff\x9a\x03s\x00H\xff\ +\x9a\x03s\x00J\xff\xd7\x03s\x00P\xff\xc3\x03s\x00\ +Q\xff\xc3\x03s\x00R\xff\x9a\x03s\x00S\xff\xc3\x03\ +s\x00T\xff\x9a\x03s\x00U\xff\xc3\x03s\x00V\xff\ +\xae\x03s\x00X\xff\xc3\x03s\x00]\xff\xd7\x03s\x00\ +\x82\xff\x85\x03s\x00\x83\xff\x85\x03s\x00\x84\xff\x85\x03\ +s\x00\x85\xff\x85\x03s\x00\x86\xff\x85\x03s\x00\x87\xff\ +\x85\x03s\x00\x89\xff\xd7\x03s\x00\x94\xff\xd7\x03s\x00\ +\x95\xff\xd7\x03s\x00\x96\xff\xd7\x03s\x00\x97\xff\xd7\x03\ +s\x00\x98\xff\xd7\x03s\x00\x9a\xff\xd7\x03s\x00\xa2\xff\ +\x9a\x03s\x00\xa3\xff\x9a\x03s\x00\xa4\xff\x9a\x03s\x00\ +\xa5\xff\x9a\x03s\x00\xa6\xff\x9a\x03s\x00\xa7\xff\x9a\x03\ +s\x00\xa8\xff\x9a\x03s\x00\xa9\xff\x9a\x03s\x00\xaa\xff\ +\x9a\x03s\x00\xab\xff\x9a\x03s\x00\xac\xff\x9a\x03s\x00\ +\xad\xff\x9a\x03s\x00\xb4\xff\x9a\x03s\x00\xb5\xff\x9a\x03\ +s\x00\xb6\xff\x9a\x03s\x00\xb7\xff\x9a\x03s\x00\xb8\xff\ +\x9a\x03s\x00\xba\xff\x9a\x03s\x00\xbb\xff\xc3\x03s\x00\ +\xbc\xff\xc3\x03s\x00\xbd\xff\xc3\x03s\x00\xbe\xff\xc3\x03\ +s\x00\xc2\xff\x85\x03s\x00\xc3\xff\x9a\x03s\x00\xc4\xff\ +\x85\x03s\x00\xc5\xff\x9a\x03s\x00\xc6\xff\x85\x03s\x00\ +\xc7\xff\x9a\x03s\x00\xc8\xff\xd7\x03s\x00\xc9\xff\x9a\x03\ +s\x00\xca\xff\xd7\x03s\x00\xcb\xff\x9a\x03s\x00\xcc\xff\ +\xd7\x03s\x00\xcd\xff\x9a\x03s\x00\xce\xff\xd7\x03s\x00\ +\xcf\xff\x9a\x03s\x00\xd1\xff\x9a\x03s\x00\xd3\xff\x9a\x03\ +s\x00\xd5\xff\x9a\x03s\x00\xd7\xff\x9a\x03s\x00\xd9\xff\ +\x9a\x03s\x00\xdb\xff\x9a\x03s\x00\xdd\xff\x9a\x03s\x00\ +\xde\xff\xd7\x03s\x00\xdf\xff\xd7\x03s\x00\xe0\xff\xd7\x03\ +s\x00\xe1\xff\xd7\x03s\x00\xe2\xff\xd7\x03s\x00\xe3\xff\ +\xd7\x03s\x00\xe4\xff\xd7\x03s\x00\xe5\xff\xd7\x03s\x00\ +\xfa\xff\xc3\x03s\x01\x06\xff\xc3\x03s\x01\x08\xff\xc3\x03\ +s\x01\x0d\xff\xc3\x03s\x01\x0e\xff\xd7\x03s\x01\x0f\xff\ +\x9a\x03s\x01\x10\xff\xd7\x03s\x01\x11\xff\x9a\x03s\x01\ +\x12\xff\xd7\x03s\x01\x13\xff\x9a\x03s\x01\x14\xff\xd7\x03\ +s\x01\x15\xff\x9a\x03s\x01\x17\xff\xc3\x03s\x01\x19\xff\ +\xc3\x03s\x01\x1d\xff\xae\x03s\x01!\xff\xae\x03s\x01\ ++\xff\xc3\x03s\x01-\xff\xc3\x03s\x01/\xff\xc3\x03\ +s\x011\xff\xc3\x03s\x013\xff\xc3\x03s\x015\xff\ +\xc3\x03s\x01<\xff\xd7\x03s\x01>\xff\xd7\x03s\x01\ +@\xff\xd7\x03s\x01C\xff\x85\x03s\x01D\xff\x9a\x03\ +s\x01F\xff\x9a\x03s\x01G\xff\xd7\x03s\x01H\xff\ +\x9a\x03s\x01J\xff\xae\x03s\x02\x08\xff\x85\x03s\x02\ +\x0c\xff\x85\x03s\x02W\xff\xc3\x03s\x02X\xff\x85\x03\ +s\x02Y\xff\x9a\x03s\x02_\xff\xd7\x03s\x02`\xff\ +\x9a\x03s\x02b\xff\xc3\x03s\x03\x1d\xff\x85\x03s\x03\ +\x1e\xff\x9a\x03s\x03\x1f\xff\x85\x03s\x03 \xff\x9a\x03\ +s\x03!\xff\x85\x03s\x03\x22\xff\x9a\x03s\x03#\xff\ +\x85\x03s\x03%\xff\x85\x03s\x03&\xff\x9a\x03s\x03\ +'\xff\x85\x03s\x03(\xff\x9a\x03s\x03)\xff\x85\x03\ +s\x03*\xff\x9a\x03s\x03+\xff\x85\x03s\x03,\xff\ +\x9a\x03s\x03-\xff\x85\x03s\x03.\xff\x9a\x03s\x03\ +/\xff\x85\x03s\x030\xff\x9a\x03s\x031\xff\x85\x03\ +s\x032\xff\x9a\x03s\x033\xff\x85\x03s\x034\xff\ +\x9a\x03s\x036\xff\x9a\x03s\x038\xff\x9a\x03s\x03\ +:\xff\x9a\x03s\x03<\xff\x9a\x03s\x03@\xff\x9a\x03\ +s\x03B\xff\x9a\x03s\x03D\xff\x9a\x03s\x03I\xff\ +\xd7\x03s\x03J\xff\x9a\x03s\x03K\xff\xd7\x03s\x03\ +L\xff\x9a\x03s\x03M\xff\xd7\x03s\x03N\xff\x9a\x03\ +s\x03O\xff\xd7\x03s\x03Q\xff\xd7\x03s\x03R\xff\ +\x9a\x03s\x03S\xff\xd7\x03s\x03T\xff\x9a\x03s\x03\ +U\xff\xd7\x03s\x03V\xff\x9a\x03s\x03W\xff\xd7\x03\ +s\x03X\xff\x9a\x03s\x03Y\xff\xd7\x03s\x03Z\xff\ +\x9a\x03s\x03[\xff\xd7\x03s\x03\x5c\xff\x9a\x03s\x03\ +]\xff\xd7\x03s\x03^\xff\x9a\x03s\x03_\xff\xd7\x03\ +s\x03`\xff\x9a\x03s\x03b\xff\xc3\x03s\x03d\xff\ +\xc3\x03s\x03f\xff\xc3\x03s\x03h\xff\xc3\x03s\x03\ +j\xff\xc3\x03s\x03l\xff\xc3\x03s\x03n\xff\xc3\x03\ +t\x00\x05\x00R\x03t\x00\x0a\x00R\x03t\x00\x0f\xff\ +\xae\x03t\x00\x11\xff\xae\x03t\x00\x22\x00)\x03t\x02\ +\x07\x00R\x03t\x02\x08\xff\xae\x03t\x02\x0b\x00R\x03\ +t\x02\x0c\xff\xae\x03\x8d\x00\x05\x00{\x03\x8d\x00\x0a\x00\ +{\x03\x8d\x02\x07\x00{\x03\x8d\x02\x0b\x00{\x03\x8f\x00\ +\x0f\xff\x85\x03\x8f\x00\x10\xff\xae\x03\x8f\x00\x11\xff\x85\x03\ +\x8f\x00\x22\x00)\x03\x8f\x00$\xffq\x03\x8f\x00&\xff\ +\xd7\x03\x8f\x00*\xff\xd7\x03\x8f\x002\xff\xd7\x03\x8f\x00\ +4\xff\xd7\x03\x8f\x007\x00)\x03\x8f\x00D\xff\x5c\x03\ +\x8f\x00F\xffq\x03\x8f\x00G\xffq\x03\x8f\x00H\xff\ +q\x03\x8f\x00J\xffq\x03\x8f\x00P\xff\x9a\x03\x8f\x00\ +Q\xff\x9a\x03\x8f\x00R\xffq\x03\x8f\x00S\xff\x9a\x03\ +\x8f\x00T\xffq\x03\x8f\x00U\xff\x9a\x03\x8f\x00V\xff\ +\x85\x03\x8f\x00X\xff\x9a\x03\x8f\x00Y\xff\xd7\x03\x8f\x00\ +Z\xff\xd7\x03\x8f\x00[\xff\xd7\x03\x8f\x00\x5c\xff\xd7\x03\ +\x8f\x00]\xff\xae\x03\x8f\x00\x82\xffq\x03\x8f\x00\x83\xff\ +q\x03\x8f\x00\x84\xffq\x03\x8f\x00\x85\xffq\x03\x8f\x00\ +\x86\xffq\x03\x8f\x00\x87\xffq\x03\x8f\x00\x89\xff\xd7\x03\ +\x8f\x00\x94\xff\xd7\x03\x8f\x00\x95\xff\xd7\x03\x8f\x00\x96\xff\ +\xd7\x03\x8f\x00\x97\xff\xd7\x03\x8f\x00\x98\xff\xd7\x03\x8f\x00\ +\x9a\xff\xd7\x03\x8f\x00\xa2\xffq\x03\x8f\x00\xa3\xff\x5c\x03\ +\x8f\x00\xa4\xff\x5c\x03\x8f\x00\xa5\xff\x5c\x03\x8f\x00\xa6\xff\ +\x5c\x03\x8f\x00\xa7\xff\x5c\x03\x8f\x00\xa8\xff\x5c\x03\x8f\x00\ +\xa9\xffq\x03\x8f\x00\xaa\xffq\x03\x8f\x00\xab\xffq\x03\ +\x8f\x00\xac\xffq\x03\x8f\x00\xad\xffq\x03\x8f\x00\xb4\xff\ +q\x03\x8f\x00\xb5\xffq\x03\x8f\x00\xb6\xffq\x03\x8f\x00\ +\xb7\xffq\x03\x8f\x00\xb8\xffq\x03\x8f\x00\xba\xffq\x03\ +\x8f\x00\xbb\xff\x9a\x03\x8f\x00\xbc\xff\x9a\x03\x8f\x00\xbd\xff\ +\x9a\x03\x8f\x00\xbe\xff\x9a\x03\x8f\x00\xbf\xff\xd7\x03\x8f\x00\ +\xc2\xffq\x03\x8f\x00\xc3\xff\x5c\x03\x8f\x00\xc4\xffq\x03\ +\x8f\x00\xc5\xff\x5c\x03\x8f\x00\xc6\xffq\x03\x8f\x00\xc7\xff\ +\x5c\x03\x8f\x00\xc8\xff\xd7\x03\x8f\x00\xc9\xffq\x03\x8f\x00\ +\xca\xff\xd7\x03\x8f\x00\xcb\xffq\x03\x8f\x00\xcc\xff\xd7\x03\ +\x8f\x00\xcd\xffq\x03\x8f\x00\xce\xff\xd7\x03\x8f\x00\xcf\xff\ +q\x03\x8f\x00\xd1\xffq\x03\x8f\x00\xd3\xffq\x03\x8f\x00\ +\xd5\xffq\x03\x8f\x00\xd7\xffq\x03\x8f\x00\xd9\xffq\x03\ +\x8f\x00\xdb\xffq\x03\x8f\x00\xdd\xffq\x03\x8f\x00\xde\xff\ +\xd7\x03\x8f\x00\xdf\xffq\x03\x8f\x00\xe0\xff\xd7\x03\x8f\x00\ +\xe1\xffq\x03\x8f\x00\xe2\xff\xd7\x03\x8f\x00\xe3\xffq\x03\ +\x8f\x00\xe4\xff\xd7\x03\x8f\x00\xe5\xffq\x03\x8f\x00\xfa\xff\ +\x9a\x03\x8f\x01\x06\xff\x9a\x03\x8f\x01\x08\xff\x9a\x03\x8f\x01\ +\x0d\xff\x9a\x03\x8f\x01\x0e\xff\xd7\x03\x8f\x01\x0f\xffq\x03\ +\x8f\x01\x10\xff\xd7\x03\x8f\x01\x11\xffq\x03\x8f\x01\x12\xff\ +\xd7\x03\x8f\x01\x13\xffq\x03\x8f\x01\x14\xff\xd7\x03\x8f\x01\ +\x15\xffq\x03\x8f\x01\x17\xff\x9a\x03\x8f\x01\x19\xff\x9a\x03\ +\x8f\x01\x1d\xff\x85\x03\x8f\x01!\xff\x85\x03\x8f\x01$\x00\ +)\x03\x8f\x01&\x00)\x03\x8f\x01+\xff\x9a\x03\x8f\x01\ +-\xff\x9a\x03\x8f\x01/\xff\x9a\x03\x8f\x011\xff\x9a\x03\ +\x8f\x013\xff\x9a\x03\x8f\x015\xff\x9a\x03\x8f\x017\xff\ +\xd7\x03\x8f\x01<\xff\xae\x03\x8f\x01>\xff\xae\x03\x8f\x01\ +@\xff\xae\x03\x8f\x01C\xffq\x03\x8f\x01D\xff\x5c\x03\ +\x8f\x01F\xff\x5c\x03\x8f\x01G\xff\xd7\x03\x8f\x01H\xff\ +q\x03\x8f\x01J\xff\x85\x03\x8f\x01\xfb\xff\xd7\x03\x8f\x01\ +\xfd\xff\xd7\x03\x8f\x02\x02\xff\xae\x03\x8f\x02\x03\xff\xae\x03\ +\x8f\x02\x04\xff\xae\x03\x8f\x02\x08\xff\x85\x03\x8f\x02\x0c\xff\ +\x85\x03\x8f\x02W\xff\x9a\x03\x8f\x02X\xffq\x03\x8f\x02\ +Y\xff\x5c\x03\x8f\x02_\xff\xd7\x03\x8f\x02`\xffq\x03\ +\x8f\x02b\xff\x9a\x03\x8f\x03\x1d\xffq\x03\x8f\x03\x1e\xff\ +\x5c\x03\x8f\x03\x1f\xffq\x03\x8f\x03 \xff\x5c\x03\x8f\x03\ +!\xffq\x03\x8f\x03\x22\xff\x5c\x03\x8f\x03#\xffq\x03\ +\x8f\x03%\xffq\x03\x8f\x03&\xff\x5c\x03\x8f\x03'\xff\ +q\x03\x8f\x03(\xff\x5c\x03\x8f\x03)\xffq\x03\x8f\x03\ +*\xff\x5c\x03\x8f\x03+\xffq\x03\x8f\x03,\xff\x5c\x03\ +\x8f\x03-\xffq\x03\x8f\x03.\xff\x5c\x03\x8f\x03/\xff\ +q\x03\x8f\x030\xff\x5c\x03\x8f\x031\xffq\x03\x8f\x03\ +2\xff\x5c\x03\x8f\x033\xffq\x03\x8f\x034\xff\x5c\x03\ +\x8f\x036\xffq\x03\x8f\x038\xffq\x03\x8f\x03:\xff\ +q\x03\x8f\x03<\xffq\x03\x8f\x03@\xffq\x03\x8f\x03\ +B\xffq\x03\x8f\x03D\xffq\x03\x8f\x03I\xff\xd7\x03\ +\x8f\x03J\xffq\x03\x8f\x03K\xff\xd7\x03\x8f\x03L\xff\ +q\x03\x8f\x03M\xff\xd7\x03\x8f\x03N\xffq\x03\x8f\x03\ +O\xff\xd7\x03\x8f\x03Q\xff\xd7\x03\x8f\x03R\xffq\x03\ +\x8f\x03S\xff\xd7\x03\x8f\x03T\xffq\x03\x8f\x03U\xff\ +\xd7\x03\x8f\x03V\xffq\x03\x8f\x03W\xff\xd7\x03\x8f\x03\ +X\xffq\x03\x8f\x03Y\xff\xd7\x03\x8f\x03Z\xffq\x03\ +\x8f\x03[\xff\xd7\x03\x8f\x03\x5c\xffq\x03\x8f\x03]\xff\ +\xd7\x03\x8f\x03^\xffq\x03\x8f\x03_\xff\xd7\x03\x8f\x03\ +`\xffq\x03\x8f\x03b\xff\x9a\x03\x8f\x03d\xff\x9a\x03\ +\x8f\x03f\xff\x9a\x03\x8f\x03h\xff\x9a\x03\x8f\x03j\xff\ +\x9a\x03\x8f\x03l\xff\x9a\x03\x8f\x03n\xff\x9a\x03\x8f\x03\ +p\xff\xd7\x03\x8f\x03\x8f\x00)\x03\x90\x00\x05\x00)\x03\ +\x90\x00\x0a\x00)\x03\x90\x02\x07\x00)\x03\x90\x02\x0b\x00\ +)\x00\x00\x00\x00\x00\x1e\x01n\x00\x01\x00\x00\x00\x00\x00\ +\x00\x004\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x13\x00\ +4\x00\x01\x00\x00\x00\x00\x00\x02\x00\x07\x00G\x00\x01\x00\ +\x00\x00\x00\x00\x03\x00(\x00N\x00\x01\x00\x00\x00\x00\x00\ +\x04\x00\x13\x004\x00\x01\x00\x00\x00\x00\x00\x05\x00\x0c\x00\ +v\x00\x01\x00\x00\x00\x00\x00\x06\x00\x12\x00\x82\x00\x01\x00\ +\x00\x00\x00\x00\x07\x00R\x00\x94\x00\x01\x00\x00\x00\x00\x00\ +\x08\x00\x14\x00\xe6\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x1c\x00\ +\xfa\x00\x01\x00\x00\x00\x00\x00\x0c\x00.\x01\x16\x00\x01\x00\ +\x00\x00\x00\x00\x0d\x00.\x01D\x00\x01\x00\x00\x00\x00\x00\ +\x0e\x00*\x01r\x00\x01\x00\x00\x00\x00\x00\x10\x00\x09\x00\ +4\x00\x01\x00\x00\x00\x00\x00\x11\x00\x09\x00>\x00\x03\x00\ +\x01\x04\x09\x00\x00\x00h\x01\x9c\x00\x03\x00\x01\x04\x09\x00\ +\x01\x00&\x02\x04\x00\x03\x00\x01\x04\x09\x00\x02\x00\x0e\x02\ +*\x00\x03\x00\x01\x04\x09\x00\x03\x00P\x028\x00\x03\x00\ +\x01\x04\x09\x00\x04\x00&\x02\x04\x00\x03\x00\x01\x04\x09\x00\ +\x05\x00\x18\x02\x88\x00\x03\x00\x01\x04\x09\x00\x06\x00$\x02\ +\xa0\x00\x03\x00\x01\x04\x09\x00\x07\x00\xa4\x02\xc4\x00\x03\x00\ +\x01\x04\x09\x00\x08\x00(\x03h\x00\x03\x00\x01\x04\x09\x00\ +\x0b\x008\x03\x90\x00\x03\x00\x01\x04\x09\x00\x0c\x00\x5c\x03\ +\xc8\x00\x03\x00\x01\x04\x09\x00\x0d\x00\x5c\x04$\x00\x03\x00\ +\x01\x04\x09\x00\x0e\x00T\x04\x80\x00\x03\x00\x01\x04\x09\x00\ +\x10\x00\x12\x02\x04\x00\x03\x00\x01\x04\x09\x00\x11\x00\x12\x02\ +\x18Digitized data \ +copyright \xa9 2011\ +, Google Corpora\ +tion.Open Sans E\ +xtraboldRegularA\ +scender - Open S\ +ans Extrabold Bu\ +ild 100Version 1\ +.10OpenSans-Extr\ +aboldOpen Sans i\ +s a trademark of\ + Google and may \ +be registered in\ + certain jurisdi\ +ctions.Ascender \ +Corporationhttp:\ +//www.ascenderco\ +rp.com/http://ww\ +w.ascendercorp.c\ +om/typedesigners\ +.htmlLicensed un\ +der the Apache L\ +icense, Version \ +2.0http://www.ap\ +ache.org/license\ +s/LICENSE-2.0\x00D\x00\ +i\x00g\x00i\x00t\x00i\x00z\x00e\x00d\x00\ + \x00d\x00a\x00t\x00a\x00 \x00c\x00o\x00\ +p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00\ +\xa9\x00 \x002\x000\x001\x001\x00,\x00 \x00\ +G\x00o\x00o\x00g\x00l\x00e\x00 \x00C\x00\ +o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\x00\ +o\x00n\x00.\x00O\x00p\x00e\x00n\x00 \x00\ +S\x00a\x00n\x00s\x00 \x00E\x00x\x00t\x00\ +r\x00a\x00b\x00o\x00l\x00d\x00R\x00e\x00\ +g\x00u\x00l\x00a\x00r\x00A\x00s\x00c\x00\ +e\x00n\x00d\x00e\x00r\x00 \x00-\x00 \x00\ +O\x00p\x00e\x00n\x00 \x00S\x00a\x00n\x00\ +s\x00 \x00E\x00x\x00t\x00r\x00a\x00b\x00\ +o\x00l\x00d\x00 \x00B\x00u\x00i\x00l\x00\ +d\x00 \x001\x000\x000\x00V\x00e\x00r\x00\ +s\x00i\x00o\x00n\x00 \x001\x00.\x001\x00\ +0\x00O\x00p\x00e\x00n\x00S\x00a\x00n\x00\ +s\x00-\x00E\x00x\x00t\x00r\x00a\x00b\x00\ +o\x00l\x00d\x00O\x00p\x00e\x00n\x00 \x00\ +S\x00a\x00n\x00s\x00 \x00i\x00s\x00 \x00\ +a\x00 \x00t\x00r\x00a\x00d\x00e\x00m\x00\ +a\x00r\x00k\x00 \x00o\x00f\x00 \x00G\x00\ +o\x00o\x00g\x00l\x00e\x00 \x00a\x00n\x00\ +d\x00 \x00m\x00a\x00y\x00 \x00b\x00e\x00\ + \x00r\x00e\x00g\x00i\x00s\x00t\x00e\x00\ +r\x00e\x00d\x00 \x00i\x00n\x00 \x00c\x00\ +e\x00r\x00t\x00a\x00i\x00n\x00 \x00j\x00\ +u\x00r\x00i\x00s\x00d\x00i\x00c\x00t\x00\ +i\x00o\x00n\x00s\x00.\x00A\x00s\x00c\x00\ +e\x00n\x00d\x00e\x00r\x00 \x00C\x00o\x00\ +r\x00p\x00o\x00r\x00a\x00t\x00i\x00o\x00\ +n\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00\ +w\x00w\x00w\x00.\x00a\x00s\x00c\x00e\x00\ +n\x00d\x00e\x00r\x00c\x00o\x00r\x00p\x00\ +.\x00c\x00o\x00m\x00/\x00h\x00t\x00t\x00\ +p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00\ +a\x00s\x00c\x00e\x00n\x00d\x00e\x00r\x00\ +c\x00o\x00r\x00p\x00.\x00c\x00o\x00m\x00\ +/\x00t\x00y\x00p\x00e\x00d\x00e\x00s\x00\ +i\x00g\x00n\x00e\x00r\x00s\x00.\x00h\x00\ +t\x00m\x00l\x00L\x00i\x00c\x00e\x00n\x00\ +s\x00e\x00d\x00 \x00u\x00n\x00d\x00e\x00\ +r\x00 \x00t\x00h\x00e\x00 \x00A\x00p\x00\ +a\x00c\x00h\x00e\x00 \x00L\x00i\x00c\x00\ +e\x00n\x00s\x00e\x00,\x00 \x00V\x00e\x00\ +r\x00s\x00i\x00o\x00n\x00 \x002\x00.\x00\ +0\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00\ +w\x00w\x00w\x00.\x00a\x00p\x00a\x00c\x00\ +h\x00e\x00.\x00o\x00r\x00g\x00/\x00l\x00\ +i\x00c\x00e\x00n\x00s\x00e\x00s\x00/\x00\ +L\x00I\x00C\x00E\x00N\x00S\x00E\x00-\x00\ +2\x00.\x000\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\xff\ +f\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x03\xaa\x01\x02\x01\x03\x01\x04\x01\ +\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\ +\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\ +\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\ +\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\x22\x01#\x01$\x01\ +%\x01&\x01'\x01(\x01)\x01*\x01+\x01,\x01\ +-\x01.\x01/\x010\x011\x012\x013\x014\x01\ +5\x016\x017\x018\x019\x01:\x01;\x01<\x01\ +=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01\ +E\x01F\x01G\x01H\x01I\x01J\x01K\x01L\x01\ +M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01\ +U\x01V\x01W\x01X\x01Y\x01Z\x01[\x01\x5c\x01\ +]\x01^\x01_\x01`\x01a\x01b\x01c\x01d\x01\ +e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01\ +m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01\ +u\x01v\x01w\x01x\x01y\x01z\x01{\x01|\x01\ +}\x01~\x01\x7f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\ +\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\ +\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\ +\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\ +\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\ +\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\ +\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\ +\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\ +\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\ +\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\ +\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\ +\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\ +\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\ +\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\ +\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\ +\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\ +\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\ +\x05\x02\x06\x02\x07\x02\x08\x02\x09\x02\x0a\x02\x0b\x02\x0c\x02\ +\x0d\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\ +\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\ +\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\x22\x02#\x02$\x02\ +%\x02&\x02'\x02(\x02)\x02*\x02+\x02,\x02\ +-\x02.\x02/\x020\x021\x022\x023\x024\x02\ +5\x026\x027\x028\x029\x02:\x02;\x02<\x02\ +=\x02>\x02?\x02@\x02A\x02B\x02C\x02D\x02\ +E\x02F\x02G\x02H\x02I\x02J\x02K\x02L\x02\ +M\x02N\x02O\x02P\x02Q\x02R\x02S\x02T\x02\ +U\x02V\x02W\x02X\x02Y\x02Z\x02[\x02\x5c\x02\ +]\x02^\x02_\x02`\x02a\x02b\x02c\x02d\x02\ +e\x02f\x02g\x02h\x02i\x02j\x02k\x02l\x02\ +m\x02n\x02o\x02p\x02q\x02r\x02s\x02t\x02\ +u\x02v\x02w\x02x\x02y\x02z\x02{\x02|\x02\ +}\x02~\x02\x7f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\ +\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\ +\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\ +\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\ +\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\ +\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\ +\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\ +\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\ +\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\ +\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\ +\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\ +\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\ +\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\ +\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\ +\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\ +\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\ +\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\ +\x05\x03\x06\x03\x07\x03\x08\x03\x09\x03\x0a\x03\x0b\x03\x0c\x03\ +\x0d\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\ +\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\ +\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\x22\x03#\x03$\x03\ +%\x03&\x03'\x03(\x03)\x03*\x03+\x03,\x03\ +-\x03.\x03/\x030\x031\x032\x033\x034\x03\ +5\x036\x037\x038\x039\x03:\x03;\x03<\x03\ +=\x03>\x03?\x03@\x03A\x03B\x03C\x03D\x03\ +E\x03F\x03G\x03H\x03I\x03J\x03K\x03L\x03\ +M\x03N\x03O\x03P\x03Q\x03R\x03S\x03T\x03\ +U\x03V\x03W\x03X\x03Y\x03Z\x03[\x03\x5c\x03\ +]\x03^\x03_\x03`\x03a\x03b\x03c\x03d\x03\ +e\x03f\x03g\x03h\x03i\x03j\x03k\x03l\x03\ +m\x03n\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x03v\x03w\x03x\x03y\x03z\x03{\x03|\x03\ +}\x03~\x03\x7f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\ +\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\ +\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\ +\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\ +\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\ +\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\ +\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\ +\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\ +\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc2\x03\xc3\x03\xc4\x03\ +\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x03\xca\x03\xcb\x03\xcc\x03\ +\xcd\x03\xce\x03\xcf\x03\xd0\x03\xd1\x03\xd2\x03\xd3\x03\xd4\x03\ +\xd5\x03\xd6\x03\xd7\x03\xd8\x03\xd9\x03\xda\x03\xdb\x03\xdc\x03\ +\xdd\x03\xde\x03\xdf\x03\xe0\x03\xe1\x03\xe2\x03\xe3\x03\xe4\x03\ +\xe5\x03\xe6\x03\xe7\x03\xe8\x03\xe9\x03\xea\x03\xeb\x03\xec\x03\ +\xed\x03\xee\x03\xef\x03\xf0\x03\xf1\x03\xf2\x03\xf3\x03\xf4\x03\ +\xf5\x03\xf6\x03\xf7\x03\xf8\x03\xf9\x03\xfa\x03\xfb\x03\xfc\x03\ +\xfd\x03\xfe\x03\xff\x04\x00\x04\x01\x04\x02\x04\x03\x04\x04\x04\ +\x05\x04\x06\x04\x07\x04\x08\x04\x09\x04\x0a\x04\x0b\x04\x0c\x04\ +\x0d\x04\x0e\x04\x0f\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\ +\x15\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\ +\x1d\x04\x1e\x04\x1f\x04 \x04!\x04\x22\x04#\x04$\x04\ +%\x04&\x04'\x04(\x04)\x04*\x04+\x04,\x04\ +-\x04.\x04/\x040\x041\x042\x043\x044\x04\ +5\x046\x047\x048\x049\x04:\x04;\x04<\x04\ +=\x04>\x04?\x04@\x04A\x04B\x04C\x04D\x04\ +E\x04F\x04G\x04H\x04I\x04J\x04K\x04L\x04\ +M\x04N\x04O\x04P\x04Q\x04R\x04S\x04T\x04\ +U\x04V\x04W\x04X\x04Y\x04Z\x04[\x04\x5c\x04\ +]\x04^\x04_\x04`\x04a\x04b\x04c\x04d\x04\ +e\x04f\x04g\x04h\x04i\x04j\x04k\x04l\x04\ +m\x04n\x04o\x04p\x04q\x04r\x04s\x04t\x04\ +u\x04v\x04w\x04x\x04y\x04z\x04{\x04|\x04\ +}\x04~\x04\x7f\x04\x80\x04\x81\x04\x82\x04\x83\x04\x84\x04\ +\x85\x04\x86\x04\x87\x04\x88\x04\x89\x04\x8a\x04\x8b\x04\x8c\x04\ +\x8d\x04\x8e\x04\x8f\x04\x90\x04\x91\x04\x92\x04\x93\x04\x94\x04\ +\x95\x04\x96\x04\x97\x04\x98\x04\x99\x04\x9a\x04\x9b\x04\x9c\x04\ +\x9d\x04\x9e\x04\x9f\x04\xa0\x04\xa1\x04\xa2\x04\xa3\x04\xa4\x04\ +\xa5\x04\xa6\x04\xa7\x04\xa8\x04\xa9\x04\xaa\x04\xab\x07.n\ +otdef\x04null\x10nonma\ +rkingreturn\x05spac\ +e\x06exclam\x08quotedb\ +l\x0anumbersign\x06dol\ +lar\x07percent\x09ampe\ +rsand\x0bquotesingl\ +e\x09parenleft\x0apare\ +nright\x08asterisk\x04\ +plus\x05comma\x06hyphe\ +n\x06period\x05slash\x04z\ +ero\x03one\x03two\x05thre\ +e\x04four\x04five\x03six\x05\ +seven\x05eight\x04nine\ +\x05colon\x09semicolon\ +\x04less\x05equal\x07grea\ +ter\x08question\x02at\x01\ +A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x05\ +I.alt\x01J\x01K\x01L\x01M\x01N\x01\ +O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01\ +W\x01X\x01Y\x01Z\x0bbracketl\ +eft\x09backslash\x0cbr\ +acketright\x0bascii\ +circum\x0aunderscor\ +e\x05grave\x01a\x01b\x01c\x01d\x01\ +e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01\ +m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01\ +u\x01v\x01w\x01x\x01y\x01z\x09brac\ +eleft\x03bar\x0abracer\ +ight\x0aasciitilde\x10\ +nonbreakingspace\ +\x0aexclamdown\x04cent\ +\x08sterling\x08curren\ +cy\x03yen\x09brokenbar\ +\x07section\x08dieresi\ +s\x09copyright\x0bordf\ +eminine\x0dguillemo\ +tleft\x0alogicalnot\ +\x07uni00AD\x0aregiste\ +red\x09overscore\x06de\ +gree\x09plusminus\x0bt\ +wosuperior\x0dthree\ +superior\x05acute\x02m\ +u\x09paragraph\x0eperi\ +odcentered\x07cedil\ +la\x0bonesuperior\x0co\ +rdmasculine\x0eguil\ +lemotright\x0aonequ\ +arter\x07onehalf\x0dth\ +reequarters\x0cques\ +tiondown\x06Agrave\x06\ +Aacute\x0bAcircumfl\ +ex\x06Atilde\x09Adiere\ +sis\x05Aring\x02AE\x08Cce\ +dilla\x06Egrave\x06Eac\ +ute\x0bEcircumflex\x09\ +Edieresis\x0aIgrave\ +.alt\x0aIacute.alt\x0f\ +Icircumflex.alt\x0d\ +Idieresis.alt\x03Et\ +h\x06Ntilde\x06Ograve\x06\ +Oacute\x0bOcircumfl\ +ex\x06Otilde\x09Odiere\ +sis\x08multiply\x06Osl\ +ash\x06Ugrave\x06Uacut\ +e\x0bUcircumflex\x09Ud\ +ieresis\x06Yacute\x05T\ +horn\x0agermandbls\x06\ +agrave\x06aacute\x0bac\ +ircumflex\x06atilde\ +\x09adieresis\x05aring\ +\x02ae\x08ccedilla\x06egr\ +ave\x06eacute\x0becirc\ +umflex\x09edieresis\ +\x06igrave\x06iacute\x0bi\ +circumflex\x09idier\ +esis\x03eth\x06ntilde\x06\ +ograve\x06oacute\x0boc\ +ircumflex\x06otilde\ +\x09odieresis\x06divid\ +e\x06oslash\x06ugrave\x06\ +uacute\x0bucircumfl\ +ex\x09udieresis\x06yac\ +ute\x05thorn\x09ydiere\ +sis\x07Amacron\x07amac\ +ron\x06Abreve\x06abrev\ +e\x07Aogonek\x07aogone\ +k\x06Cacute\x06cacute\x0b\ +Ccircumflex\x0bccir\ +cumflex\x04Cdot\x04cdo\ +t\x06Ccaron\x06ccaron\x06\ +Dcaron\x06dcaron\x06Dc\ +roat\x06dcroat\x07Emac\ +ron\x07emacron\x06Ebre\ +ve\x06ebreve\x0aEdotac\ +cent\x0aedotaccent\x07\ +Eogonek\x07eogonek\x06\ +Ecaron\x06ecaron\x0bGc\ +ircumflex\x0bgcircu\ +mflex\x06Gbreve\x06gbr\ +eve\x04Gdot\x04gdot\x0cGc\ +ommaaccent\x0cgcomm\ +aaccent\x0bHcircumf\ +lex\x0bhcircumflex\x04\ +Hbar\x04hbar\x0aItilde\ +.alt\x06itilde\x0bImac\ +ron.alt\x07imacron\x0a\ +Ibreve.alt\x06ibrev\ +e\x0bIogonek.alt\x07io\ +gonek\x0eIdotaccent\ +.alt\x08dotlessi\x06IJ\ +.alt\x02ij\x0bJcircumf\ +lex\x0bjcircumflex\x0c\ +Kcommaaccent\x0ckco\ +mmaaccent\x0ckgreen\ +landic\x06Lacute\x06la\ +cute\x0cLcommaaccen\ +t\x0clcommaaccent\x06L\ +caron\x06lcaron\x04Ldo\ +t\x04ldot\x06Lslash\x06ls\ +lash\x06Nacute\x06nacu\ +te\x0cNcommaaccent\x0c\ +ncommaaccent\x06Nca\ +ron\x06ncaron\x0bnapos\ +trophe\x03Eng\x03eng\x07O\ +macron\x07omacron\x06O\ +breve\x06obreve\x0dOhu\ +ngarumlaut\x0dohung\ +arumlaut\x02OE\x02oe\x06R\ +acute\x06racute\x0cRco\ +mmaaccent\x0crcomma\ +accent\x06Rcaron\x06rc\ +aron\x06Sacute\x06sacu\ +te\x0bScircumflex\x0bs\ +circumflex\x08Scedi\ +lla\x08scedilla\x06Sca\ +ron\x06scaron\x0cTcomm\ +aaccent\x0ctcommaac\ +cent\x06Tcaron\x06tcar\ +on\x04Tbar\x04tbar\x06Uti\ +lde\x06utilde\x07Umacr\ +on\x07umacron\x06Ubrev\ +e\x06ubreve\x05Uring\x05u\ +ring\x0dUhungarumla\ +ut\x0duhungarumlaut\ +\x07Uogonek\x07uogonek\ +\x0bWcircumflex\x0bwci\ +rcumflex\x0bYcircum\ +flex\x0bycircumflex\ +\x09Ydieresis\x06Zacut\ +e\x06zacute\x0aZdotacc\ +ent\x0azdotaccent\x06Z\ +caron\x06zcaron\x05lon\ +gs\x06florin\x0aAringa\ +cute\x0aaringacute\x07\ +AEacute\x07aeacute\x0b\ +Oslashacute\x0bosla\ +shacute\x0cScommaac\ +cent\x0cscommaaccen\ +t\x0acircumflex\x05car\ +on\x06macron\x05breve\x09\ +dotaccent\x04ring\x06o\ +gonek\x05tilde\x0chung\ +arumlaut\x05tonos\x0dd\ +ieresistonos\x0aAlp\ +hatonos\x09anotelei\ +a\x0cEpsilontonos\x08E\ +tatonos\x0dIotatono\ +s.alt\x0cOmicronton\ +os\x0cUpsilontonos\x0a\ +Omegatonos\x11iotad\ +ieresistonos\x05Alp\ +ha\x04Beta\x05Gamma\x07un\ +i0394\x07Epsilon\x04Ze\ +ta\x03Eta\x05Theta\x08Iot\ +a.alt\x05Kappa\x06Lamb\ +da\x02Mu\x02Nu\x02Xi\x07Omic\ +ron\x02Pi\x03Rho\x05Sigma\ +\x03Tau\x07Upsilon\x03Phi\ +\x03Chi\x03Psi\x07uni03A9\ +\x10Iotadieresis.al\ +t\x0fUpsilondieresi\ +s\x0aalphatonos\x0ceps\ +ilontonos\x08etaton\ +os\x09iotatonos\x14ups\ +ilondieresistono\ +s\x05alpha\x04beta\x05gam\ +ma\x05delta\x07epsilon\ +\x04zeta\x03eta\x05theta\x04\ +iota\x05kappa\x06lambd\ +a\x07uni03BC\x02nu\x02xi\x07\ +omicron\x02pi\x03rho\x06s\ +igma1\x05sigma\x03tau\x07\ +upsilon\x03phi\x03chi\x03\ +psi\x05omega\x0ciotadi\ +eresis\x0fupsilondi\ +eresis\x0comicronto\ +nos\x0cupsilontonos\ +\x0aomegatonos\x09afii\ +10023\x09afii10051\x09\ +afii10052\x09afii10\ +053\x09afii10054\x0daf\ +ii10055.alt\x0dafii\ +10056.alt\x09afii10\ +057\x09afii10058\x09af\ +ii10059\x09afii1006\ +0\x09afii10061\x09afii\ +10062\x09afii10145\x09\ +afii10017\x09afii10\ +018\x09afii10019\x09af\ +ii10020\x09afii1002\ +1\x09afii10022\x09afii\ +10024\x09afii10025\x09\ +afii10026\x09afii10\ +027\x09afii10028\x09af\ +ii10029\x09afii1003\ +0\x09afii10031\x09afii\ +10032\x09afii10033\x09\ +afii10034\x09afii10\ +035\x09afii10036\x09af\ +ii10037\x09afii1003\ +8\x09afii10039\x09afii\ +10040\x09afii10041\x09\ +afii10042\x09afii10\ +043\x09afii10044\x09af\ +ii10045\x09afii1004\ +6\x09afii10047\x09afii\ +10048\x09afii10049\x09\ +afii10065\x09afii10\ +066\x09afii10067\x09af\ +ii10068\x09afii1006\ +9\x09afii10070\x09afii\ +10072\x09afii10073\x09\ +afii10074\x09afii10\ +075\x09afii10076\x09af\ +ii10077\x09afii1007\ +8\x09afii10079\x09afii\ +10080\x09afii10081\x09\ +afii10082\x09afii10\ +083\x09afii10084\x09af\ +ii10085\x09afii1008\ +6\x09afii10087\x09afii\ +10088\x09afii10089\x09\ +afii10090\x09afii10\ +091\x09afii10092\x09af\ +ii10093\x09afii1009\ +4\x09afii10095\x09afii\ +10096\x09afii10097\x09\ +afii10071\x09afii10\ +099\x09afii10100\x09af\ +ii10101\x09afii1010\ +2\x09afii10103\x09afii\ +10104\x09afii10105\x09\ +afii10106\x09afii10\ +107\x09afii10108\x09af\ +ii10109\x09afii1011\ +0\x09afii10193\x09afii\ +10050\x09afii10098\x06\ +Wgrave\x06wgrave\x06Wa\ +cute\x06wacute\x09Wdie\ +resis\x09wdieresis\x06\ +Ygrave\x06ygrave\x06en\ +dash\x06emdash\x09afii\ +00208\x0dunderscore\ +dbl\x09quoteleft\x0aqu\ +oteright\x0equotesi\ +nglbase\x0dquoterev\ +ersed\x0cquotedblle\ +ft\x0dquotedblright\ +\x0cquotedblbase\x06da\ +gger\x09daggerdbl\x06b\ +ullet\x08ellipsis\x0bp\ +erthousand\x06minut\ +e\x06second\x0dguilsin\ +glleft\x0eguilsingl\ +right\x09exclamdbl\x08\ +fraction\x09nsuperi\ +or\x05franc\x09afii089\ +41\x06peseta\x04Euro\x09a\ +fii61248\x09afii612\ +89\x09afii61352\x09tra\ +demark\x05Omega\x09est\ +imated\x09oneeighth\ +\x0cthreeeighths\x0bfi\ +veeighths\x0csevene\ +ighths\x0bpartialdi\ +ff\x05Delta\x07product\ +\x09summation\x05minus\ +\x07radical\x08infinit\ +y\x08integral\x0bappro\ +xequal\x08notequal\x09\ +lessequal\x0cgreate\ +requal\x07lozenge\x07u\ +niFB01\x07uniFB02\x0dc\ +yrillicbreve\x08dot\ +lessj\x10caroncomma\ +accent\x0bcommaacce\ +nt\x11commaaccentro\ +tate\x0czerosuperio\ +r\x0cfoursuperior\x0cf\ +ivesuperior\x0bsixs\ +uperior\x0dsevensup\ +erior\x0deightsuper\ +ior\x0cninesuperior\ +\x07uni2000\x07uni2001\ +\x07uni2002\x07uni2003\ +\x07uni2004\x07uni2005\ +\x07uni2006\x07uni2007\ +\x07uni2008\x07uni2009\ +\x07uni200A\x07uni200B\ +\x07uniFEFF\x07uniFFFC\ +\x07uniFFFD\x07uni01F0\ +\x07uni02BC\x07uni03D1\ +\x07uni03D2\x07uni03D6\ +\x07uni1E3E\x07uni1E3F\ +\x07uni1E00\x07uni1E01\ +\x07uni1F4D\x07uni02F3\ +\x09dasiaoxia\x07uniFB\ +03\x07uniFB04\x05Ohorn\ +\x05ohorn\x05Uhorn\x05uho\ +rn\x07uni0300\x07uni03\ +01\x07uni0303\x04hook\x08\ +dotbelow\x07uni0400\ +\x07uni040D\x07uni0450\ +\x07uni045D\x07uni0460\ +\x07uni0461\x07uni0462\ +\x07uni0463\x07uni0464\ +\x07uni0465\x07uni0466\ +\x07uni0467\x07uni0468\ +\x07uni0469\x07uni046A\ +\x07uni046B\x07uni046C\ +\x07uni046D\x07uni046E\ +\x07uni046F\x07uni0470\ +\x07uni0471\x07uni0472\ +\x07uni0473\x07uni0474\ +\x07uni0475\x07uni0476\ +\x07uni0477\x07uni0478\ +\x07uni0479\x07uni047A\ +\x07uni047B\x07uni047C\ +\x07uni047D\x07uni047E\ +\x07uni047F\x07uni0480\ +\x07uni0481\x07uni0482\ +\x07uni0483\x07uni0484\ +\x07uni0485\x07uni0486\ +\x07uni0488\x07uni0489\ +\x07uni048A\x07uni048B\ +\x07uni048C\x07uni048D\ +\x07uni048E\x07uni048F\ +\x07uni0492\x07uni0493\ +\x07uni0494\x07uni0495\ +\x07uni0496\x07uni0497\ +\x07uni0498\x07uni0499\ +\x07uni049A\x07uni049B\ +\x07uni049C\x07uni049D\ +\x07uni049E\x07uni049F\ +\x07uni04A0\x07uni04A1\ +\x07uni04A2\x07uni04A3\ +\x07uni04A4\x07uni04A5\ +\x07uni04A6\x07uni04A7\ +\x07uni04A8\x07uni04A9\ +\x07uni04AA\x07uni04AB\ +\x07uni04AC\x07uni04AD\ +\x07uni04AE\x07uni04AF\ +\x07uni04B0\x07uni04B1\ +\x07uni04B2\x07uni04B3\ +\x07uni04B4\x07uni04B5\ +\x07uni04B6\x07uni04B7\ +\x07uni04B8\x07uni04B9\ +\x07uni04BA\x07uni04BB\ +\x07uni04BC\x07uni04BD\ +\x07uni04BE\x07uni04BF\ +\x0buni04C0.alt\x07uni\ +04C1\x07uni04C2\x07uni\ +04C3\x07uni04C4\x07uni\ +04C5\x07uni04C6\x07uni\ +04C7\x07uni04C8\x07uni\ +04C9\x07uni04CA\x07uni\ +04CB\x07uni04CC\x07uni\ +04CD\x07uni04CE\x0buni\ +04CF.alt\x07uni04D0\ +\x07uni04D1\x07uni04D2\ +\x07uni04D3\x07uni04D4\ +\x07uni04D5\x07uni04D6\ +\x07uni04D7\x07uni04D8\ +\x07uni04D9\x07uni04DA\ +\x07uni04DB\x07uni04DC\ +\x07uni04DD\x07uni04DE\ +\x07uni04DF\x07uni04E0\ +\x07uni04E1\x07uni04E2\ +\x07uni04E3\x07uni04E4\ +\x07uni04E5\x07uni04E6\ +\x07uni04E7\x07uni04E8\ +\x07uni04E9\x07uni04EA\ +\x07uni04EB\x07uni04EC\ +\x07uni04ED\x07uni04EE\ +\x07uni04EF\x07uni04F0\ +\x07uni04F1\x07uni04F2\ +\x07uni04F3\x07uni04F4\ +\x07uni04F5\x07uni04F6\ +\x07uni04F7\x07uni04F8\ +\x07uni04F9\x07uni04FA\ +\x07uni04FB\x07uni04FC\ +\x07uni04FD\x07uni04FE\ +\x07uni04FF\x07uni0500\ +\x07uni0501\x07uni0502\ +\x07uni0503\x07uni0504\ +\x07uni0505\x07uni0506\ +\x07uni0507\x07uni0508\ +\x07uni0509\x07uni050A\ +\x07uni050B\x07uni050C\ +\x07uni050D\x07uni050E\ +\x07uni050F\x07uni0510\ +\x07uni0511\x07uni0512\ +\x07uni0513\x07uni1EA0\ +\x07uni1EA1\x07uni1EA2\ +\x07uni1EA3\x07uni1EA4\ +\x07uni1EA5\x07uni1EA6\ +\x07uni1EA7\x07uni1EA8\ +\x07uni1EA9\x07uni1EAA\ +\x07uni1EAB\x07uni1EAC\ +\x07uni1EAD\x07uni1EAE\ +\x07uni1EAF\x07uni1EB0\ +\x07uni1EB1\x07uni1EB2\ +\x07uni1EB3\x07uni1EB4\ +\x07uni1EB5\x07uni1EB6\ +\x07uni1EB7\x07uni1EB8\ +\x07uni1EB9\x07uni1EBA\ +\x07uni1EBB\x07uni1EBC\ +\x07uni1EBD\x07uni1EBE\ +\x07uni1EBF\x07uni1EC0\ +\x07uni1EC1\x07uni1EC2\ +\x07uni1EC3\x07uni1EC4\ +\x07uni1EC5\x07uni1EC6\ +\x07uni1EC7\x0buni1EC8\ +.alt\x07uni1EC9\x0buni\ +1ECA.alt\x07uni1ECB\ +\x07uni1ECC\x07uni1ECD\ +\x07uni1ECE\x07uni1ECF\ +\x07uni1ED0\x07uni1ED1\ +\x07uni1ED2\x07uni1ED3\ +\x07uni1ED4\x07uni1ED5\ +\x07uni1ED6\x07uni1ED7\ +\x07uni1ED8\x07uni1ED9\ +\x07uni1EDA\x07uni1EDB\ +\x07uni1EDC\x07uni1EDD\ +\x07uni1EDE\x07uni1EDF\ +\x07uni1EE0\x07uni1EE1\ +\x07uni1EE2\x07uni1EE3\ +\x07uni1EE4\x07uni1EE5\ +\x07uni1EE6\x07uni1EE7\ +\x07uni1EE8\x07uni1EE9\ +\x07uni1EEA\x07uni1EEB\ +\x07uni1EEC\x07uni1EED\ +\x07uni1EEE\x07uni1EEF\ +\x07uni1EF0\x07uni1EF1\ +\x07uni1EF4\x07uni1EF5\ +\x07uni1EF6\x07uni1EF7\ +\x07uni1EF8\x07uni1EF9\ +\x07uni20AB\x07uni030F\ +\x13circumflexacute\ +comb\x13circumflexg\ +ravecomb\x12circumf\ +lexhookcomb\x13circ\ +umflextildecomb\x0e\ +breveacutecomb\x0eb\ +revegravecomb\x0dbr\ +evehookcomb\x0ebrev\ +etildecomb\x10cyril\ +lichookleft\x11cyri\ +llicbighookUC\x11cy\ +rillicbighookLC\x08\ +one.pnum\x07zero.os\ +\x06one.os\x06two.os\x08t\ +hree.os\x07four.os\x07\ +five.os\x06six.os\x08s\ +even.os\x08eight.os\ +\x07nine.os\x02ff\x07uni2\ +120\x08Tcedilla\x08tce\ +dilla\x05g.alt\x0fgcir\ +cumflex.alt\x0agbre\ +ve.alt\x08gdot.alt\x10\ +gcommaaccent.alt\ +\x01I\x06Igrave\x06Iacute\ +\x0bIcircumflex\x09Idi\ +eresis\x06Itilde\x07Im\ +acron\x06Ibreve\x07Iog\ +onek\x0aIdotaccent\x02\ +IJ\x09Iotatonos\x04Iot\ +a\x0cIotadieresis\x09a\ +fii10055\x09afii100\ +56\x07uni04C0\x07uni04\ +CF\x07uni1EC8\x07uni1E\ +CA\x00\x00\x01\x00\x03\x00\x08\x00\x0a\x00\x0b\x00\x07\xff\ +\xff\x00\x0f\x00\x01\x00\x00\x00\x0c\x00\x00\x00\x16\x00\x00\x00\ +\x02\x00\x01\x00\x00\x03\xa9\x00\x01\x00\x04\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x004\x006\x00\x01l\ +atn\x00\x08\x00\x10\x00\x02MOL \x00\x16R\ +OM \x00\x1c\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\ +\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x0a\x00n\x01\xe4\x00\x01latn\x00\x08\x00\x10\x00\ +\x02MOL \x00(ROM \x00B\x00\x00\xff\ +\xff\x00\x09\x00\x03\x00\x08\x00\x0b\x00\x00\x00\x0e\x00\x11\x00\ +\x14\x00\x17\x00\x1a\x00\x00\xff\xff\x00\x0a\x00\x04\x00\x06\x00\ +\x09\x00\x0c\x00\x01\x00\x0f\x00\x12\x00\x15\x00\x18\x00\x1b\x00\ +\x00\xff\xff\x00\x0a\x00\x05\x00\x07\x00\x0a\x00\x0d\x00\x02\x00\ +\x10\x00\x13\x00\x16\x00\x19\x00\x1c\x00\x1dliga\x00\ +\xb0liga\x00\xb6liga\x00\xbclnu\ +m\x00\xc2lnum\x00\xc8lnum\x00\xcel\ +ocl\x00\xd4locl\x00\xdaonum\x00\ +\xe0onum\x00\xe8onum\x00\xf0pnu\ +m\x00\xf8pnum\x00\xfepnum\x01\x04s\ +alt\x01\x0asalt\x01\x12salt\x01\ +\x1ass01\x01\x22ss01\x01*ss0\ +1\x012ss02\x01:ss02\x01@s\ +s02\x01Fss03\x01Lss03\x01\ +Rss03\x01Xtnum\x01^tnu\ +m\x01ftnum\x01n\x00\x00\x00\x01\x00\x09\x00\ +\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\ +\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\ +\x01\x00\x08\x00\x00\x00\x01\x00\x08\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\ +\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\ +\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x0a\x00\x16\x00\x1e\x00&\x00.\x006\x00>\x00F\x00\ +N\x00V\x00^\x00\x01\x00\x00\x00\x01\x00P\x00\x01\x00\ +\x00\x00\x01\x00z\x00\x01\x00\x00\x00\x01\x00\xaa\x00\x01\x00\ +\x00\x00\x01\x00\xc6\x00\x01\x00\x00\x00\x01\x00\xee\x00\x01\x00\ +\x00\x00\x01\x00\xf4\x00\x01\x00\x00\x00\x01\x01\x10\x00\x01\x00\ +\x00\x00\x01\x01\x16\x00\x01\x00\x00\x00\x01\x012\x00\x04\x00\ +\x00\x00\x01\x01H\x00\x02\x00\x10\x00\x05\x03\x91\x03\x92\x03\ +\x93\x03\x94\x03\x95\x00\x02\x00\x05\x00J\x00J\x00\x00\x00\ +\xdf\x00\xdf\x00\x01\x00\xe1\x00\xe1\x00\x02\x00\xe3\x00\xe3\x00\ +\x03\x00\xe5\x00\xe5\x00\x04\x00\x02\x00.\x00\x14\x00,\x00\ +\x8e\x00\x8f\x00\x90\x00\x91\x00\xea\x00\xec\x00\xee\x00\xf0\x00\ +\xf2\x00\xf4\x01Z\x01g\x01w\x01\xa1\x01\xa2\x02\xc9\x02\ +\xd8\x03E\x03G\x00\x02\x00\x01\x03\x96\x03\xa9\x00\x00\x00\ +\x02\x00\x1a\x00\x0a\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\ +\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x00\x02\x00\x01\x00\x13\x00\ +\x1c\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\x85\x03\x86\x03\ +\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x84\x00\x02\x00\ +\x03\x00\x13\x00\x13\x00\x00\x00\x15\x00\x1c\x00\x01\x03\x82\x03\ +\x82\x00\x09\x00\x02\x00\x08\x00\x01\x03\x82\x00\x01\x00\x01\x00\ +\x14\x00\x02\x00\x1a\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\ +\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\ +\x83\x03\x8c\x00\x00\x00\x02\x00\x08\x00\x01\x00\x14\x00\x01\x00\ +\x01\x03\x82\x00\x02\x00\x1a\x00\x0a\x00\x13\x03\x82\x00\x15\x00\ +\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x02\x00\ +\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x0e\x00\x04\x03\x8f\x03\ +\x90\x01 \x01!\x00\x02\x00\x02\x01$\x01%\x00\x00\x01\ +I\x01J\x00\x02\x00\x01\x006\x00\x01\x00\x08\x00\x05\x00\ +\x0c\x00\x14\x00\x1c\x00\x22\x00(\x02^\x00\x03\x00I\x00\ +O\x02]\x00\x03\x00I\x00L\x03\x8d\x00\x02\x00I\x02\ +5\x00\x02\x00O\x024\x00\x02\x00L\x00\x01\x00\x01\x00\ +I\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x00\x00\x01\x00\ +\x00\x15^\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x15V0\ +\x82\x15R\x06\x09*\x86H\x86\xf7\x0d\x01\x07\x02\xa0\x82\ +\x15C0\x82\x15?\x02\x01\x011\x0b0\x09\x06\x05+\ +\x0e\x03\x02\x1a\x05\x000a\x06\x0a+\x06\x01\x04\x01\x82\ +7\x02\x01\x04\xa0S0Q0,\x06\x0a+\x06\x01\x04\ +\x01\x827\x02\x01\x1c\xa2\x1e\x80\x1c\x00<\x00<\x00<\ +\x00O\x00b\x00s\x00o\x00l\x00e\x00t\x00e\ +\x00>\x00>\x00>0!0\x09\x06\x05+\x0e\x03\x02\ +\x1a\x05\x00\x04\x14\x04\x01\x8e\xa2\x0b\x9cr\xa5\xac\x0a\xb0\ +V\xba\xcdZ\xc5\xbdZ,`\xa0\x82\x11]0\x82\x03\ +z0\x82\x02b\xa0\x03\x02\x01\x02\x02\x108%\xd7\xfa\ +\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd50\x0d\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000S1\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1+0)\x06\x03U\x04\x03\x13\x22Ve\ +riSign Time Stam\ +ping Services CA\ +0\x1e\x17\x0d070615000000\ +Z\x17\x0d120614235959Z\ +0\x5c1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\ +\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriSi\ +gn, Inc.1402\x06\x03U\x04\ +\x03\x13+VeriSign Time\ + Stamping Servic\ +es Signer - G20\x81\ +\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\ +\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xc4\xb5\xf2R\x15\ +\xbc\x88\x86`)\x16J[/K\x91k\x87\x91\xf35\ +TX5\xea\xd16^bMRQ4q\xc2{f\ +\x1d\x89\xc8\xdd*\xc4j\x0a\xf67\xd9\x98t\x91\xf6\x92\ +\xae\xb0\xb5v\x96\xf1\xa9JcEG.k\x0b\x92N\ +K+\x8c\xeeXJ\x8b\xd4\x07\xe4\x1a,\xf8\x82\xaaX\ +\xd9\xcdB\xf3-\xc0u\xde\x8d\xab\xc7\x8e\x1d\x9alL\ +\x08\x95\x1e\xde\xdb\xefg\xe1r\xc2I\xc2\x9e`<\xe1\ +\xe2\xbe\x16\xa3cxi\x14{\xad-\x02\x03\x01\x00\x01\ +\xa3\x81\xc40\x81\xc104\x06\x08+\x06\x01\x05\x05\x07\ +\x01\x01\x04(0&0$\x06\x08+\x06\x01\x05\x05\x07\ +0\x01\x86\x18http://ocsp.\ +verisign.com0\x0c\x06\x03\ +U\x1d\x13\x01\x01\xff\x04\x020\x0003\x06\x03U\x1d\ +\x1f\x04,0*0(\xa0&\xa0$\x86\x22htt\ +p://crl.verisign\ +.com/tss-ca.crl0\ +\x16\x06\x03U\x1d%\x01\x01\xff\x04\x0c0\x0a\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\ +\xff\x04\x04\x03\x02\x06\xc00\x1e\x06\x03U\x1d\x11\x04\x17\ +0\x15\xa4\x130\x111\x0f0\x0d\x06\x03U\x04\x03\x13\ +\x06TSA1-20\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00P\xc5K\xc8$\ +\x80\xdf\xe4\x0d$\xc2\xde\x1a\xb1\xa1\x02\xa1\xa6\x82-\x0c\ +\x83\x15\x817\x0a\x82\x0e,\xb0Z\x17a\xb5\xd8\x05\xfe\ +\x88\xdb\xf1\x91\x91\xb3V\x1a@\xa6\xeb\x92\xbe89\xb0\ +u6t:\x98O\xe47\xba\x99\x89\xca\x95B\x1d\xb0\ +\xb9\xc7\xa0\x8dW\xe0\xfa\xd5d\x04B5N\x01\xd13\ +\xa2\x17\xc8M\xaa'\xc7\xf2\xe1\x86L\x028M\x83x\ +\xc6\xfcS\xe0\xeb\xe0\x06\x87\xdd\xa4\x96\x9e^\x0c\x98\xe2\ +\xa5\xbe\xbf\x82\x85\xc3`\xe1\xdf\xad(\xd8\xc7\xa5Kd\ +\xda\xc7\x1b[\xbd\xac9\x08\xd58\x22\xa13\x8b/\x8a\ +\x9a\xeb\xbc\x07!?DA\x09\x07\xb5e\x1c$\xbcH\ +\xd3D\x80\xeb\xa1\xcf\xc9\x02\xb4\x14\xcfT\xc7\x16\xa3\x80\ +\x5c\xf9y>]r}\x88\x17\x9e,C\xa2\xcaS\xce\ +}=\xf6*:\xb8O\x94\x00\xa5m\x0a\x83]\xf9^\ +S\xf4\x18\xb3W\x0fp\xc3\xfb\xf5\xad\x95\xa0\x0e\x17\xde\ +\xc4\x16\x80`\xc9\x0f+n\x86\x04\xf1\xeb\xf4x'\xd1\ +\x05\xc5\xee4[^\xb9I2\xf230\x82\x03\xc40\ +\x82\x03-\xa0\x03\x02\x01\x02\x02\x10G\xbf\x19\x95\xdf\x8d\ +RFC\xf7\xdbmH\x0d1\xa40\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\x8b1\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02ZA1\x150\x13\x06\x03U\ +\x04\x08\x13\x0cWestern Cape\ +1\x140\x12\x06\x03U\x04\x07\x13\x0bDurba\ +nville1\x0f0\x0d\x06\x03U\x04\x0a\x13\ +\x06Thawte1\x1d0\x1b\x06\x03U\x04\x0b\ +\x13\x14Thawte Certifi\ +cation1\x1f0\x1d\x06\x03U\x04\x03\x13\ +\x16Thawte Timestam\ +ping CA0\x1e\x17\x0d03120\ +4000000Z\x17\x0d131203\ +235959Z0S1\x0b0\x09\x06\x03U\ +\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\ +\x0eVeriSign, Inc.1\ ++0)\x06\x03U\x04\x03\x13\x22VeriSi\ +gn Time Stamping\ + Services CA0\x82\x01\x22\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\ +\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\x00\xa9\xca\xb2\ +\xa4\xcc\xcd \xaf\x0a}\x89\xac\x87u\xf0\xb4N\xf1\xdf\ +\xc1\x0f\xbfga\xbd\xa3d\x1c\xda\xbb\xf9\xca3\xab\x84\ +0\x89X~\x8c\xdbk\xdd6\x9e\x0f\xbf\xd1\xecx\xf2\ +w\xa6~o<\xbf\x93\xaf\x0d\xbah\xf4l\x94\xca\xbd\ +R-\xabH=\xf5\xb6\xd5]_\x1b\x02\x9f\xfa/k\ +\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\x02\xe1\x7fLR\xe3\x0e`\ +\xec@\x1c~\xb9\x0d\xde?\xc7\xb4\xdf\x87\xbd_zj\ +1.\x03\x99\x81\x13\xa8G \xce1s\x0dW-\xcd\ +x43\x95\x12\x99\x12\xb9\xdeh/\xaa\xe6\xe3\xc2\x8a\ +\x8c*\xc3\x8b!\x87f\xbd\x83XWou\xbf<\xaa\ +&\x87]\xca\x10\x15<\x9f\x84\xeaT\xc1\x0an\xc4\xfe\ +\xc5J\xdd\xb9\x07\x11\x97\x22|\xdb>'\xd1\x1ex\xec\ +\x9f1\xc9\xf1\xe6\x22\x19\xdb\xc4\xb3GC\x9a\x1a_\xa0\ +\x1e\x90\xe4^\xf5\xee|\xf1}\xabb\x01\x8f\xf5M\x0b\ +\xde\xd0\x22V\xa8\x95\xcd\xae\x88v\xae\xee\xba\x0d\xf3\xe4\ +M\xd9\xa0\xfbh\xa0\xae\x14;\xb3\x87\xc1\xbb\x02\x03\x01\ +\x00\x01\xa3\x81\xdb0\x81\xd804\x06\x08+\x06\x01\x05\ +\x05\x07\x01\x01\x04(0&0$\x06\x08+\x06\x01\x05\ +\x05\x070\x01\x86\x18http://ocs\ +p.verisign.com0\x12\ +\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\ +\x01\x000A\x06\x03U\x1d\x1f\x04:0806\xa0\ +4\xa02\x860http://crl.\ +verisign.com/Tha\ +wteTimestampingC\ +A.crl0\x13\x06\x03U\x1d%\x04\x0c0\x0a\ +\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\x1d\ +\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060$\x06\x03U\x1d\ +\x11\x04\x1d0\x1b\xa4\x190\x171\x150\x13\x06\x03U\ +\x04\x03\x13\x0cTSA2048-1-53\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\ +\x81\x81\x00Jk\xf9\xeaX\xc2D\x1c1\x89y\x99+\ +\x96\xbf\x82\xac\x01\xd6\x1cL\xcd\xb0\x8aXn\xdf\x08)\ +\xa3^\xc8\xca\x93\x13\xe7\x04R\x0d\xefG'/\x008\ +\xb0\xe4\xc9\x93N\x9a\xd4\x22b\x15\xf7?7!Op\ +1\x80\xf1\x8b8\x87\xb3\xe8\xe8\x97\x00\xfe\xcfU\x96N\ +$\xd2\xa9'Nz\xae\xb7aA\xf3*\xce\xe7\xc9\xd9\ +^\xdd\xbb+\x85>\xb5\x9d\xb5\xd9\xe1W\xff\xbe\xb4\xc5\ +~\xf5\xcf\x0c\x9e\xf0\x97\xfe+\xd3;R\x1b\x1b8'\ +\xf7?J0\x82\x04\xfc0\x82\x04e\xa0\x03\x02\x01\x02\ +\x02\x10eR&\xe1\xb2.\x18\xe1Y\x0f)\x85\xac\x22\ +\xe7\x5c0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000_1\x0b0\x09\x06\x03U\x04\x06\x13\x02US\ +1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriS\ +ign, Inc.1705\x06\x03U\ +\x04\x0b\x13.Class 3 Publ\ +ic Primary Certi\ +fication Authori\ +ty0\x1e\x17\x0d0905210000\ +00Z\x17\x0d19052023595\ +9Z0\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVer\ +iSign, Inc.1\x1f0\x1d\x06\ +\x03U\x04\x0b\x13\x16VeriSign T\ +rust Network1;09\ +\x06\x03U\x04\x0b\x132Terms of \ +use at https://w\ +ww.verisign.com/\ +rpa (c)09100.\x06\x03U\ +\x04\x03\x13'VeriSign Cla\ +ss 3 Code Signin\ +g 2009-2 CA0\x82\x01\x220\ +\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\ +\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\x00\xbeg\x1d\xb4\ +`\xaa\x10IoV\x17|f\xc9^\x86\x0d\xd5\xf1\xac\ +\xa7q\x83\x8e\x8b\x89\xf8\x88\x04\x89\x15\x06\xba-\x84!\ +\x95\xe4\xd1\x9cPL\xfb\xd2\x22\xbd\xda\xf2\xb25;\x1e\ +\x8f\xc3\x09\xfb\xfc\x13.Z\xbf\x89|=;%\x1e\xf6\ +\xf3X{\x9c\xf4\x01\xb5\xc6\x0a\xb8\x80\xce\xbe'ta\ +g'Mj\xe5\xec\x81aXy\xa3\xe0\x17\x10\x12\x15\ +'\xb0\xe1M4\x7f+G D\xb9\xdef$f\x8a\ +\xcdO\xba\x1f\xc58\xc8T\x90\xe1r\xf6\x19fuj\ +\xb9Ih\xcf8y\x0d\xaa0\xa8\xdb,`H\x9e\xd7\ +\xaa\x14\x01\xa9\x83\xd78\x9109\x13\x96\x03:|@\ +T\xb6\xad\xe0/\x1b\x83\xdc\xa8\x11R>\x02\xb3\xd7+\ +\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\xa9\xa6\x10P\x0e4.M\ +\xa7\xce\xc9^%\xd4\x8c\xbc\xf3n|)\xbc\x01]\xfc\ +1\x87Z\xd5\x8c\x85gX\x88\x19\xa0\xbf5\xf0\xea+\ +\xa3!\xe7\x90\xf6\x83\xe5\xa8\xed`x^{`\x83\xfd\ +W\x0b]A\x0dcT`\xd6C!\xef\x02\x03\x01\x00\ +\x01\xa3\x82\x01\xdb0\x82\x01\xd70\x12\x06\x03U\x1d\x13\ +\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x000p\x06\ +\x03U\x1d \x04i0g0e\x06\x0b`\x86H\x01\ +\x86\xf8E\x01\x07\x17\x030V0(\x06\x08+\x06\x01\ +\x05\x05\x07\x02\x01\x16\x1chttps://w\ +ww.verisign.com/\ +cps0*\x06\x08+\x06\x01\x05\x05\x07\x02\x020\ +\x1e\x1a\x1chttps://www.v\ +erisign.com/rpa0\ +\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060\ +m\x06\x08+\x06\x01\x05\x05\x07\x01\x0c\x04a0_\xa1\ +]\xa0[0Y0W0U\x16\x09image\ +/gif0!0\x1f0\x07\x06\x05+\x0e\x03\x02\ +\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\xac\x8d\x8ek\xc3\xcf\x80j\ +\xd4H\x18,{\x19.0%\x16#http:\ +//logo.verisign.\ +com/vslogo.gif0\x1d\ +\x06\x03U\x1d%\x04\x160\x14\x06\x08+\x06\x01\x05\x05\ +\x07\x03\x02\x06\x08+\x06\x01\x05\x05\x07\x03\x0304\x06\ +\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\ +\x08+\x06\x01\x05\x05\x070\x01\x86\x18http:\ +//ocsp.verisign.\ +com01\x06\x03U\x1d\x1f\x04*0(0&\ +\xa0$\xa0\x22\x86 http://crl\ +.verisign.com/pc\ +a3.crl0)\x06\x03U\x1d\x11\x04\x220\ + \xa4\x1e0\x1c1\x1a0\x18\x06\x03U\x04\x03\x13\x11\ +Class3CA2048-1-5\ +50\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\x97\xd0k\xa8\ +&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf2\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\ +\x81\x81\x00\x8b\x03\xc0\xdd\x94\xd8A\xa2ai\xb0\x15\xa8\ +x\xc70\xc6\x90<~B\xf7$\xb6\xe4\x83s\x17\x04\ +\x7f\x04\x10\x9c\xa1\xe2\xfa\x81/\xeb\xc0\xcaD\xe7r\xe0\ +P\xb6U\x10 \x83n\x96\x92\xe4\x9aQj\xb471\ +\xdc\xa5-\xeb\x8c\x00\xc7\x1dO\xe7M2\xba\x85\xf8N\ +\xbe\xfagUe\xf0j\xbez\xcad8\x1a\x10\x10x\ +Ev1\xf3\x86z\x03\x0f`\xc2\xb3]\x9d\xf6\x8bf\ +v\x82\x1bY\xe1\x83\xe5\xbdI\xa58V\xe5\xdeAw\ +\x0eX\x0f0\x82\x05\x130\x82\x03\xfb\xa0\x03\x02\x01\x02\ +\x02\x10f\xe3\xf0gy\xca\x15\x16mPSo\x88\x19\ +\x1a\x830\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02U\ +S1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeri\ +Sign, Inc.1\x1f0\x1d\x06\x03\ +U\x04\x0b\x13\x16VeriSign Tr\ +ust Network1;09\x06\ +\x03U\x04\x0b\x132Terms of u\ +se at https://ww\ +w.verisign.com/r\ +pa (c)09100.\x06\x03U\x04\ +\x03\x13'VeriSign Clas\ +s 3 Code Signing\ + 2009-2 CA0\x1e\x17\x0d10\ +0729000000Z\x17\x0d120\ +808235959Z0\x81\xd01\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x160\x14\x06\x03\ +U\x04\x08\x13\x0dMassachuset\ +ts1\x0f0\x0d\x06\x03U\x04\x07\x13\x06Wob\ +urn1\x1e0\x1c\x06\x03U\x04\x0a\x14\x15Mo\ +notype Imaging I\ +nc.1>0<\x06\x03U\x04\x0b\x135Di\ +gital ID Class 3\ + - Microsoft Sof\ +tware Validation\ + v21\x180\x16\x06\x03U\x04\x0b\x14\x0fTy\ +pe Operations1\x1e0\ +\x1c\x06\x03U\x04\x03\x14\x15Monotype\ + Imaging Inc.0\x81\x9f\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\ +\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x94D\xa0\x95i|\ +U\x0d\xd0\xdb\x16\x8d25\x8aL3\xab^ \xa1L\ +\xd7*\x878\xd7\x98\xa5@\xf0\x19I\x0b\x22\x1eSO\ +\xc2C\xa6\xca\x8b\xa9V\xefnH\x06\xa8\x05\x159\x1e\ +c;$\x12\x90\xb9\x98\xcf\xca\x085}r\xe3GW\ +\xfdy\xcb\x8aJ\xe7@p-5c\x7f\xae\x80\xcf\xc4\ +\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\xd7\xa4\xa0\xdb\x09\xf2\xa2\xf2\ +{\xef\xcdu\xc1\xf7ePd\x22\x9d\xbd}\xbc\xad\xb8\ +K\xccXE\x0eM\xd1YLM\x02\x03\x01\x00\x01\xa3\ +\x82\x01\x830\x82\x01\x7f0\x09\x06\x03U\x1d\x13\x04\x02\ +0\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\ +\x07\x800D\x06\x03U\x1d\x1f\x04=0;09\xa0\ +7\xa05\x863http://csc3\ +-2009-2-crl.veri\ +sign.com/CSC3-20\ +09-2.crl0D\x06\x03U\x1d \x04\ +=0;09\x06\x0b`\x86H\x01\x86\xf8E\x01\x07\ +\x17\x030*0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\ +\x16\x1chttps://www.ve\ +risign.com/rpa0\x13\ +\x06\x03U\x1d%\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\ +\x07\x03\x030u\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04\ +i0g0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\ +\x18http://ocsp.ver\ +isign.com0?\x06\x08+\x06\x01\ +\x05\x05\x070\x02\x863http://cs\ +c3-2009-2-aia.ve\ +risign.com/CSC3-\ +2009-2.cer0\x1f\x06\x03U\x1d\ +#\x04\x180\x16\x80\x14\x97\xd0k\xa8&p\xc8\xa1?\ +\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf20\x11\x06\x09`\ +\x86H\x01\x86\xf8B\x01\x01\x04\x04\x03\x02\x04\x100\x16\ +\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1b\x04\x080\x06\ +\x01\x01\x00\x01\x01\xff0\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00N\xe6\x22\x87\xdfg\ +A\x15\x17\xe2\xd2\xee~\x0e\xce\xc2\x99\xd6c\xbd\xf0\xb5\ +\x93\xe5jrb\xe1\xf5\xd2<8\xee\xa8=\x08_\xba\ +G\x81\x82_[KI\xf4\x1d \xfa\x0f\x93\x09\xd0\x1d\ +\x19VD\x17\xa2\x88\xf3\xfb\x8d\x9d\xae\xf7\x0d5\xde<\ +\x0c\xacD\x94`E*\x9b\xfe\x9boL;\xb14g\ +p\x10\x86\xffZ9\x5cZ\xe3l\x82\xab5|eK\ +\xfd\x98m\xb5\x15\x94I\x9c\x88p\x10\xbe=\xb1b\x95\ +\xb4\xdb\xb4\xd4\xda\xe8\x9dA\x90~\xfe}\xb9\xa4\x92\xeb\ +n\xf2\x22\x8a\xc6w6M\x8aZ\x0bS\x051\xd3+\ +(\xafR\xe1\x8dzk\xb5wD\xbd\x0c\xad\xf4]%\ +,\xe3\xcd\x8a0>K\x03\x9cy\xca\xa6N\xae\x0b\xc2\ +\xcc$\x07\x0b\xc1\x94\x82\xf6\x10\xf1\xba\x90\xb6\x9b\x9a\xd8\ +\x5c<\x13\xf1\xea\x02\x06\x18'M<\x89o3\x8a\xd3\ +\x86\xde\xe9X3u=\xeb\x93i\xe2DoN\x00l\ +\xcf\xd5\x85\xdaV\xa6\x9a\xa6?\xcbL!h\x90\xf2`\ +\xba\xe1\xe8\x06]9!\x132\xed1\x82\x03g0\x82\ +\x03c\x02\x01\x010\x81\xcb0\x81\xb61\x0b0\x09\x06\ +\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\ +\x0a\x13\x0eVeriSign, Inc\ +.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Veri\ +Sign Trust Netwo\ +rk1;09\x06\x03U\x04\x0b\x132Ter\ +ms of use at htt\ +ps://www.verisig\ +n.com/rpa (c)091\ +00.\x06\x03U\x04\x03\x13'VeriSi\ +gn Class 3 Code \ +Signing 2009-2 C\ +A\x02\x10f\xe3\xf0gy\xca\x15\x16mPSo\x88\ +\x19\x1a\x830\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\xa0p\ +0\x10\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x0c1\x02\ +0\x000\x19\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\ +\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x040\x1c\x06\ +\x0a+\x06\x01\x04\x01\x827\x02\x01\x0b1\x0e0\x0c\x06\ +\x0a+\x06\x01\x04\x01\x827\x02\x01\x150#\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14\x09~\x06{\ +\xe2^\xdb\xc3\xcb\x07h^TO\xbfy\xd3o\xa9\xd9\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\ +\x81\x80=\xab\xf0s\xc4\xba\x22\x09\x95\xd7^h\xec\xe8\ +\x8dl\x90\x00\x8d\xe2\x8f\x9f\x0e\xae\xd0<\x7f\xf8\xd1{\ +\xdb\xf2\xc8\xddpc\x02\x22\xfa\xf6\xf4\xbc+\x0d\xe2]\ +\xe8\xbc\xde\x888\x05\x84\x84~\xd1\x0e.w\xf1\xbc;\ +\xc9L\x92s\x84r!K\x22\x11\x10t/#\xcc\xf8\ +v\x82\xb4L{`q\xc1a\x1a\xbf\x9d\x15\xf5,O\ +\x82|\xfa\x95\xa3n\xd8\x85\x88\xf5\x19\x0a\xdeG+^\ +\xbd\xf1\xd0\xbd\xa9\xdb.\xf18\xbbe\xaf\x92\xd584\ +\xa4\xe4\xa1\x82\x01\x7f0\x82\x01{\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x09\x061\x82\x01l0\x82\x01h\x02\x01\x01\ +0g0S1\x0b0\x09\x06\x03U\x04\x06\x13\x02U\ +S1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeri\ +Sign, Inc.1+0)\x06\x03\ +U\x04\x03\x13\x22VeriSign Ti\ +me Stamping Serv\ +ices CA\x02\x108%\xd7\xfa\xf8a\xaf\ +\x9e\xf4\x90\xe7&\xb5\xd6Z\xd50\x09\x06\x05+\x0e\x03\ +\x02\x1a\x05\x00\xa0]0\x18\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x031\x0b\x06\x09*\x86H\x86\xf7\x0d\x01\x07\x01\ +0\x1c\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x051\x0f\x17\ +\x0d110505165509Z0#\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14\xc6\ +\xea\x11\x9f\xf4\xe5-u\x0a\x7f\xcb\xd4\xf7\xa3\xb2K\xfe\ +\x00Y\x1a0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\ +\x05\x00\x04\x81\x80T\xb8e\xfd\x8b\xb5\x9b\xfb\x1e>\x87\ +\xa85q\xae\xa6\x8d\xdcx\x19l[\x92\xb9\xaa\xf8P\ +\xd3\x0b\xda\x9f\x7fp!\xb2;p\x812\xf5\xa5\x83\xc9\ +\xbaj\x9e\xbf\xee\x9aMIX\xa5\x93f\x0ft\xd8G\ +\xcb\xe0\xdd\x1d\x09\xf2ca\x89\xf7z\x85O\xca,\xc5\ +l,3^\xed\x86\x16\x90\xf8\xe2\xb7\xe75\x04GT\ +X\xcaC\x16\xbc\xa0\xc4\x04J'd\xba\xbf\x0d\xd01\ +\x8e\xa5\x80\xc7\xf79\x10\xb4\x108X\x905\xea\xd7\x12\ +q\x10\x96J\xd5\x00\x00\ +\x00\x03A\xac\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIG\xa4\ +\x1d\xff\xb6\x00\x03,8\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03(\x18\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03(8\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03(p\x00\x00\x03\xc6OS/2\xa2\ +\xe3\xa1\xf8\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x1f\ +\xd7\x1e\xdb\x00\x00\x1d\xf0\x00\x00\x00\xb6fpgm\xbb\ +s\xa4u\x00\x00\x14\xd0\x00\x00\x07\xe0gasp\x00\ +\x13\x00#\x00\x03(\x08\x00\x00\x00\x10glyf\xc8\ +D/K\x00\x00&\x00\x00\x01\x1f*head\xf8\ +\xdbBf\x00\x00\x01<\x00\x00\x006hhea\x10\ +\xb1\x11\x9b\x00\x00\x01t\x00\x00\x00$hmtx\xe6\ +\xe9]\x0a\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01E,\x00\x01\xb66loca.\ +\xc9\xe6W\x00\x00\x1e\xa8\x00\x00\x07Vmaxp\x05\ +o\x01\xa5\x00\x00\x01\x98\x00\x00\x00 name\xc2\ +\x12\x95f\x00\x02\xfbd\x00\x00\x06upost\x02\ +7\xefl\x00\x03\x01\xdc\x00\x00&+prep\xbc\ +\xf6R\xc0\x00\x00\x1c\xb0\x00\x00\x01@\x00\x01\x00\x00\x00\ +\x01\x19\x9a.58\xe4_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9e\x91\xa4\x00\x00\x00\x00\xc9\xe8K\xa5\xfb\ +\xbc\xfd\x87\x0a\xb2\x08\xfe\x00\x02\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x0a\x89\xfb\ +\xbc\xfd\xc7\x0a\xb2\x08\x00\x01\xb3\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00[\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +:\x00\x8e\x00\x03\x00\x01\x00\x03\x04\xff\x03 \x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x02\x03\x08\x02\x02\x0b\x09\x06\x03\x08\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00\x01\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04m\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc3\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x02o\x00\x0c\x03\xa2\x00\xb6\x05\ ++\x00\x0e\x04\xa4\x00=\x07V\x00P\x05\xdd\x00\x08\x01\ +\xe7\x00\xb6\x02\xfe\x00D\x02\xfe\xff{\x04V\x00\x98\x04\ +\x87\x00f\x02s\xff\x98\x02\xa2\x00\x17\x02s\x00\x00\x03\ +\xbc\xff\xa6\x04\xa4\x00?\x04\xa4\x00\x96\x04\xa4\xff\xc7\x04\ +\xa4\x00\x0e\x04\xa4\xff\xf6\x04\xa4\x00\x14\x04\xa4\x00N\x04\ +\xa4\x00#\x04\xa4\x001\x04\xa4\x00j\x02s\x00\x00\x02\ +s\xff\x8b\x04\x87\x00X\x04\x87\x00f\x04\x87\x00m\x03\ +\xe7\x00\xa2\x07-\x00R\x05h\xff\x87\x05\x12\x00!\x05\ +\x0a\x00h\x05y\x00!\x04\x7f\x00!\x04\x8d\x00!\x05\ +\x96\x00h\x05\xb6\x00!\x03h\xff\xb6\x02\xfc\xfe\xb8\x05\ +Z\x00!\x047\x00!\x07F\x00!\x06R\x00!\x05\ +\xe5\x00h\x04\xfc\x00!\x05\xe5\x00h\x053\x00!\x04\ +b\x00+\x04j\x00\x9c\x05\x9c\x00}\x04\xf0\x00\x96\x07\ +{\x00\x98\x05N\xff\x83\x04\xd5\x00\xa4\x04P\xff\xa4\x02\ +\xe1\xff\xcb\x03\xbc\x00\xdd\x02\xe1\xff{\x04H\xff\xfa\x03\ +\x9a\xffH\x04o\x01\xe5\x04\xdb\x00T\x04\xdb\x00\x17\x04\ +\x08\x00T\x04\xd5\x00T\x04\xa2\x00T\x03H\xff/\x04\ +y\xff{\x04\xfa\x00\x17\x02\x9a\x00\x17\x02\x9a\xfe\xf8\x04\ +\xf0\x00\x17\x02\x9a\x00\x17\x07h\x00\x17\x04\xfa\x00\x17\x04\ +\xdb\x00T\x04\xdb\xff\xae\x04\xdb\x00T\x03\x7f\x00\x17\x04\ +\x04\x00\x1f\x03\xa8\x00?\x04\xfa\x00`\x04Z\x00X\x06\ +\x96\x00f\x04\x87\xff\x89\x04Z\xff\x7f\x03\xe1\xff\xd7\x02\ +\xdf\xff\xf0\x04\x87\x01\xba\x02\xdf\xff\x85\x04\x87\x00`\x02\ +\x14\x00\x00\x02o\xff\x93\x04\xa4\x00\x9a\x04\xa4\xff\xee\x04\ +\xa4\x00j\x04\xa4\x00L\x04\x87\x01\xbc\x04\x0c\x00%\x04\ +o\x01P\x06\x98\x00q\x03;\x00\x8b\x04\xfc\x00=\x04\ +\x87\x00R\x02\xa2\x00\x17\x06\x98\x00q\x03\x9a\x00\xb7\x03\ +`\x00\xa6\x04\x87\x00f\x03P\x00\x17\x03P\x00B\x04\ +o\x01\xc5\x05\x08\xff\xae\x05%\x00f\x02s\x00s\x01\ +\x7f\xff#\x03P\x00s\x031\x00\x8b\x04\xfc\xff\xf2\x07\ +\xc7\x00O\x07\xc7\x00h\x07\xc7\x00\xc3\x03\xe7\xff\xac\x05\ +h\xff\x87\x05h\xff\x87\x05h\xff\x87\x05h\xff\x87\x05\ +h\xff\x87\x05h\xff\x87\x07\x91\xff\x83\x05\x0a\x00h\x04\ +\x7f\x00!\x04\x7f\x00!\x04\x7f\x00!\x04\x7f\x00!\x03\ +h\xff\xb6\x03h\xff\xb6\x03h\xff\xb6\x03h\xff\xb6\x05\ +y\x00\x0a\x06R\x00!\x05\xe5\x00h\x05\xe5\x00h\x05\ +\xe5\x00h\x05\xe5\x00h\x05\xe5\x00h\x04\x87\x00f\x05\ +\xe5\x00^\x05\x9c\x00}\x05\x9c\x00}\x05\x9c\x00}\x05\ +\x9c\x00}\x04\xd5\x00\xa4\x04\xfc\x00!\x05\xb4\xfe\xfc\x04\ +\xdb\x00T\x04\xdb\x00T\x04\xdb\x00T\x04\xdb\x00T\x04\ +\xdb\x00T\x04\xdb\x00T\x06\xfc\x00T\x04\x08\x00T\x04\ +\xa2\x00T\x04\xa2\x00T\x04\xa2\x00T\x04\xa2\x00T\x02\ +\x9a\x00\x17\x02\x9a\x00\x17\x02\x9a\xff\xf9\x02\x9a\x00\x17\x04\ +\x83\x00T\x04\xfa\x00\x17\x04\xdb\x00T\x04\xdb\x00T\x04\ +\xdb\x00T\x04\xdb\x00T\x04\xdb\x00T\x04\x87\x00f\x05\ +\x06\x00B\x04\xfa\x00`\x04\xfa\x00`\x04\xfa\x00`\x04\ +\xfa\x00`\x04Z\xff\x7f\x04\xdb\xff\xae\x04Z\xff\x7f\x05\ +h\xff\x87\x04\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x05\ +h\xff\x87\x04\xdb\x00T\x05\x0a\x00h\x04\x08\x00T\x05\ +\x0a\x00h\x04\x08\x00T\x05\x0a\x00h\x04\x08\x00T\x05\ +\x0a\x00h\x04\x08\x00T\x05y\x00!\x05R\x00T\x05\ +y\x00\x0a\x04\xd5\x00T\x04\x7f\x00!\x04\xa2\x00T\x04\ +\x7f\x00!\x04\xa2\x00T\x04\x7f\x00!\x04\xa2\x00T\x04\ +\x7f\x00!\x04\xa2\x00T\x04\x7f\x00!\x04\xa2\x00T\x05\ +\x96\x00h\x04y\xff{\x05\x96\x00h\x04y\xff{\x05\ +\x96\x00h\x04y\xff{\x05\x96\x00h\x04y\xff{\x05\ +\xb6\x00!\x04\xfa\x00\x17\x05\xb6\x00!\x04\xfa\x00\x17\x03\ +h\xff\xb6\x02\x9a\x00\x17\x03h\xff\xb6\x02\x9a\x00\x17\x03\ +h\xff\xb6\x02\x9a\x00\x17\x03h\xff\xb6\x02\x9a\xff\xc5\x03\ +h\xff\xb6\x02\x9a\x00\x17\x06d\xff\xb6\x053\x00\x17\x02\ +\xfc\xfe\xb8\x02\x9a\xfe\xf8\x05Z\x00!\x04\xf0\x00\x17\x04\ +\xf0\x00\x17\x047\x00!\x02\x9a\x00\x17\x047\x00!\x02\ +\x9a\xff\xa9\x047\x00!\x03\x19\x00\x17\x047\x00!\x04\ +D\x00\x17\x04L\xff\xd1\x02\xd7\xff\xcf\x06R\x00!\x04\ +\xfa\x00\x17\x06R\x00!\x04\xfa\x00\x17\x06R\x00!\x04\ +\xfa\x00\x17\x05\xa4\xff\xc3\x06R\x00!\x04\xfa\x00\x17\x05\ +\xe5\x00h\x04\xdb\x00T\x05\xe5\x00h\x04\xdb\x00T\x05\ +\xe5\x00h\x04\xdb\x00T\x07u\x00h\x07\x0a\x00T\x05\ +3\x00!\x03\x7f\x00\x17\x053\x00!\x03\x7f\xff\xa6\x05\ +3\x00!\x03\x7f\x00\x17\x04b\x00+\x04\x04\x00\x1f\x04\ +b\x00+\x04\x04\x00\x1f\x04b\x00+\x04\x04\x00\x1f\x04\ +b\x00+\x04\x04\x00\x1f\x04j\x00t\x03\xa8\x008\x04\ +j\x00\x9c\x03\xba\x00?\x04j\x00\x8f\x03\xa8\x00\x17\x05\ +\x9c\x00}\x04\xfa\x00`\x05\x9c\x00}\x04\xfa\x00`\x05\ +\x9c\x00}\x04\xfa\x00`\x05\x9c\x00}\x04\xfa\x00`\x05\ +\x9c\x00}\x04\xfa\x00`\x05\x9c\x00}\x04\xfa\x00`\x07\ +{\x00\x98\x06\x96\x00f\x04\xd5\x00\xa4\x04Z\xff\x7f\x04\ +\xd5\x00\xa4\x04P\xff\xa4\x03\xe1\xff\xd7\x04P\xff\xa4\x03\ +\xe1\xff\xd7\x04P\xff\xa4\x03\xe1\xff\xd7\x02\xf0\xff\x0c\x04\ +\xa4\xff\xcb\x05h\xff\x87\x04\xdb\x00T\x07\x91\xff\x83\x06\ +\xfc\x00T\x05\xe5\x00^\x05\x06\x00B\x04b\x00+\x04\ +\x04\x00\x1f\x04o\x00\xfe\x04o\x01B\x04H\x01s\x04\ +o\x01\x8f\x02\xa8\x01?\x04\x9e\x02\x0a\x01\xc5\xffB\x04\ +o\x01-\x04o\x00\xd3\x04b\x02\x0e\x04b\x01\x08\x05\ +h\xff\x87\x02s\x00s\x05^\x00\x09\x06F\x00\x09\x03\ +h\xfe\xf2\x06w\x00,\x06\x1f\x00\x09\x06\xcb\x00\x1f\x03\ +1\x00\x1b\x05h\xff\x87\x05\x12\x00!\x047\x00!\x05\ +L\xff\xb8\x04\x7f\x00!\x04P\xff\xa4\x05\xb6\x00!\x06\ +#\x00h\x03h\xff\xb6\x05Z\x00!\x04\xf0\xff\x8b\x07\ +F\x00!\x06R\x00!\x04s\xff\xd7\x05\xe5\x00h\x05\ +\xb6\x00!\x04\xfc\x00!\x04j\xff\xc3\x04j\x00\x9c\x04\ +\xd5\x00\xa4\x06\xc5\x00\x5c\x05N\xff\x83\x07\x0e\x00\xa0\x06\ +/\xff\xac\x03h\xff\xb6\x04\xd5\x00\xa4\x05\x0a\x00T\x04\ +u\x00)\x04\xfa\x00\x17\x031\x00V\x04\xfe\x00`\x05\ +\x0a\x00T\x05+\xff\xb2\x04`\x00-\x04\xc9\x009\x04\ +u\x00)\x03\xd3\x00B\x04\xfa\x00\x17\x04\xe5\x00`\x03\ +1\x00V\x04\xf0\x00\x17\x04\xd5\xff\x91\x05\x08\xff\xae\x04\ +\xa0\x00`\x03\xee\x00B\x04\xdb\x00T\x06T\x00N\x04\ +\xe5\xff\xb4\x03\xfc\x00T\x05\x19\x00T\x04-\x00B\x04\ +\xfe\x00`\x06\xbc\x00T\x04\xa2\xfe\xd1\x06\xee\x00`\x06\ +\xe3\x00B\x031\x00V\x04\xfe\x00`\x04\xdb\x00T\x04\ +\xfe\x00`\x06\xe3\x00B\x04\x7f\x00!\x06;\x00\x9c\x04\ +7\x00!\x05\x0a\x00h\x04b\x00+\x03h\xff\xb6\x03\ +h\xff\xb6\x02\xfc\xfe\xb8\x07\xb4\xff\xa4\x07\xb4\x00!\x06\ +#\x00\x9c\x05)\x00!\x05\x00\x00D\x05\xb6\x00!\x05\ +h\xff\x87\x04\xdf\x00!\x05\x12\x00!\x047\x00!\x06\ +Z\xff)\x04\x7f\x00!\x07w\xff}\x04\xec\x00\x19\x06\ +\x5c\x00!\x06\x5c\x00!\x05)\x00!\x05\xac\xff\xa4\x07\ +F\x00!\x05\xb6\x00!\x05\xe5\x00h\x05\xb6\x00!\x04\ +\xfc\x00!\x05\x0a\x00h\x04j\x00\x9c\x05\x00\x00D\x06\ +\xc5\x00\x5c\x05N\xff\x83\x06\x1d\x00!\x05\x91\x00\x93\x08\ +\x0a\x00!\x08w\x00!\x05\xa6\x00\x9c\x07\x8b\x00!\x04\ +\xdf\x00!\x05\x0a\x00\x1f\x08\x9e\x00!\x053\xffu\x04\ +\xdb\x00T\x04\xcf\x00V\x04\xd7\x00T\x04\x0c\x00\x19\x05\ +\x08\x00T\x04\xa2\x00T\x08R\xff\xe7\x04\xa8\x00!\x04\ +\xfa\x00`\x04\xfa\x00`\x04\xfe\x00\x17\x05V\xff\xdb\x06\ +\xe7\x00!\x05\x04\x00\x17\x04\xdb\x00T\x04\xfa\x00\x17\x04\ +\xdb\xff\xae\x04\x08\x00T\x07h\x00\x17\x04Z\xff\x7f\x06\ +\xc3\x00T\x04\x87\xff\x89\x05-\x00`\x04\xdd\x00\x8b\x07\ +h\x00`\x07\x9c\x00`\x05}\x00N\x07\x1f\x00T\x04\ +\xae\x00T\x04\x08\x00-\x07%\x00\x17\x04\xf6\xff\xfa\x04\ +\xa2\x00T\x04\xfa\x00\x17\x04\x0c\x00\x19\x04\x08\x00T\x04\ +\x04\x00\x1f\x02\x9a\x00\x17\x02\x9a\x00\x17\x02\x9a\xfe\xf8\x07\ +h\xff\xdb\x07\x1f\x00\x17\x04\xfa\x00\x17\x04\xfe\x00\x17\x04\ +Z\xff\x7f\x04\xfa\x00`\x04;\x00!\x04\x0a\x00\x17\x07\ +{\x00\x98\x06\x96\x00f\x07{\x00\x98\x06\x96\x00f\x07\ +{\x00\x98\x06\x96\x00f\x04\xd5\x00\xa4\x04Z\xff\x7f\x03\ +\xd7\x00!\x07\xae\x00!\x07\xae\x00!\x03\x9a\xff3\x01\ +\xf4\x00m\x01\xf4\x00^\x02m\xff\x98\x01\xf4\x00\xbe\x03\ +\xe5\x00m\x03\xe5\x00^\x04b\xff\x98\x04V\x00\xb6\x04\ +V\x00/\x03#\x00V\x07\x08\x00\x0c\x0a\x89\x00P\x01\ +\xe7\x00\xb6\x03\xa2\x00\xb6\x02\xcf\x00=\x02\xcf\xff\xf2\x04\ +\xc9\x00\x0c\x00\xf8\xfd\xcd\x033\x00h\x04\xa4\x00\x00\x04\ +\xa4\xff\xee\x07\xfc\x00\x17\x04\xa4\x005\x06!\x00L\x04\ +\xb0\x007\x08\x8b\x00!\x06)\x00f\x06/\xff\xac\x04\ +\xf4\x00f\x07\xc7\x00h\x07\xc7\x00u\x07\xc7\x00\x85\x07\ +\xc7\x00\x91\x04\xc5\x00)\x05L\xff\xb8\x05\xd3\x00\x9e\x05\ +\x0a\x00-\x04\x87\x00f\x04\xa4\x00V\x05\x96\x00m\x03\ +o\xff\xe3\x04\x87\x00N\x04\x87\x00H\x04\x87\x00R\x04\ +\x87\x00q\x04\x9e\x00P\x05\xe1\xff/\x05\xe1\xff/\x04\ +b\x01H\x02\x9a\xfe\xf8\x04\x1f\x01\xdd\x04\x1f\x00f\x04\ +\x1f\x01\xbe\x03P\x00Z\x03P\x00\x10\x03P\x00^\x03\ +P\x00R\x03P\x00\x5c\x03P\x00F\x03R\x00m\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +b\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00Z\x08\x00\x00V\x02\x9a\xfe\xf8\x01\ +\xf4\x00^\x06\x06\x00\x08\x04\xfe\x00\xa4\x08\x1f\x00N\x07\ +F\x00!\x07h\x00\x17\x05h\xff\x87\x04\xdb\x00T\x07\ +\xd1\x00+\x02\xaa\xff\x85\x01\x1d\xff\xdf\x08s\xff/\x08\ +o\xff/\x06m\x00h\x05\xa8\x00T\x06{\x00}\x06\ +%\x00`\x00\x00\xfc\xda\x00\x00\xfd\x8f\x00\x00\xfc]\x00\ +\x00\xfd\x91\x00\x00\xfc1\x04\x7f\x00!\x06\x5c\x00!\x04\ +\xa2\x00T\x04\xfa\x00`\x08j\x00h\x06\xd9\x00X\x04\ +\xdf\x00!\x05\x12\x001\x07\xa6\x00!\x06P\x00\x17\x06\ +h\xffm\x05\xac\xffT\x08\xf8\x00!\x08'\x00\x17\x07\ +!\xffy\x05\xae\xffX\x09\xb0\x00!\x089\x00\x17\x05\ +\x14\xff\xaa\x04\xa8\xff\xb0\x07\x0e\x00\xa0\x06\xee\x00`\x05\ +\xe5\x00h\x04\xdb\x00T\x05h\x00\x96\x04\xb8\x00X\x05\ +h\x00\x96\x04\xb8\x00X\x0a?\x00h\x09'\x00T\x06\ +'\x00h\x05^\x00T\x08j\x00h\x07\x0c\x00T\x08\ +j\x00h\x06\xd9\x00X\x05\x0a\x00h\x04\x08\x00T\x04\ +\xb0\x003\x04'\x00\xfe\x04P\x01\x1b\x04L\x02;\x04\ +L\x02\x00\x07\xe1\x00\x14\x07\x9e\x00\x19\x07\x0a\x00!\x05\ +\xb6\x00`\x04\xdf\x00!\x04\xae\xff\xfe\x05b\x00!\x05\ +J\xff\xae\x047\x00\x0a\x03\xd3\xff\xf2\x05d\x00!\x04\ +\xc1\x00\x17\x07\xd1\xff}\x08R\xff\xe7\x04\xec\x00\x19\x04\ +\xa8\x00!\x05\x8d\x00!\x05Z\x00\x17\x05\x98\x00!\x05\ +m\x00\x17\x05Z\x00!\x04\xf0\x00\x17\x05\xf0\x00\x9c\x05\ +q\x00B\x06\x1d\x00!\x05\xae\x00\x17\x06\x87\x00!\x05\ +\xcf\x00\x17\x08H\x00!\x07%\x00\x17\x06f\x00h\x05\ +\x83\x00T\x05\x0a\x00h\x04\x08\x00T\x04j\x00\x9c\x07\ +\xa8\x00\x17\x04\xd5\x00\xa4\x04Z\x00X\x04\xd5\x00'\x04\ +Z\xff\xaa\x06\x00\xff\x83\x05'\xff\x89\x07\x0e\x00\x9c\x05\ +\xdd\x00B\x05\xfc\x00\x93\x05Z\x00\x85\x05\x91\x00\x93\x05\ +\x12\x00\x89\x05\x91\x00!\x04\xdd\x00\x17\x06\xb6\x00V\x05\ +\xac\x00\x19\x06\xb6\x00V\x05\xac\x00\x19\x03h\xff\xb6\x07\ +w\xff}\x08R\xff\xe7\x05\xb2\x00!\x05/\x00\x17\x06\ +b\xff\xa4\x06\x17\xff\xdb\x05\xb6\x00!\x05\x04\x00\x17\x06\ +f\x00!\x05\xc1\x00\x17\x05\x91\x00\x93\x04\xdd\x00\xa2\x07\ +\xf2\x00!\x07\xa4\x00!\x03h\xff\xb6\x05h\xff\x87\x04\ +\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x07\x91\xff\x83\x06\ +\xfc\x00T\x04\x7f\x00!\x04\xa2\x00T\x05\x1f\x00!\x04\ +\xa2\x00-\x05\x1f\x00!\x04\xa2\x00-\x07w\xff}\x08\ +R\xff\xe7\x04\xec\x00\x19\x04\xa8\x00!\x04\x98\x00\x00\x04\ +\xb0\xff\xb0\x06\x5c\x00!\x04\xfa\x00`\x06\x5c\x00!\x04\ +\xfa\x00`\x05\xe5\x00h\x04\xdb\x00T\x05\xe5\x00h\x04\ +\xdb\x00T\x05\xe5\x00h\x04\xdb\x00T\x05\x0a\x00\x1f\x04\ +\x08\x00-\x05\x00\x00D\x04Z\xff\x7f\x05\x00\x00D\x04\ +Z\xff\x7f\x05\x00\x00D\x04Z\xff\x7f\x05\x91\x00\x93\x04\ +\xdd\x00\x8b\x047\x00!\x03\xd3\x00\x17\x07\x8b\x00!\x07\ +\x1f\x00T\x047\x00\x0a\x03\xd3\xff\xf2\x06D\xff\x83\x05\ +`\xff\x89\x05N\xff\x83\x04\x87\xff\x89\x04\xfa\x00B\x04\ +\xd5\x00T\x07\x19\x00B\x06\xf8\x00T\x06\xd1\x00X\x06\ +?\x00J\x05D\x00Z\x04\xfc\x00J\x07\xcf\xff\xa4\x07\ +s\xff\xdb\x07\xd7\x00!\x07\x1f\x00\x17\x05\xf2\x00h\x05\ +\x10\x00T\x05\xba\x00\x9c\x05R\x00B\x04\xee\x005\x04\ +u\x00)\x06J\xff\xa4\x05\xe3\xff\xdb\x05h\xff\x87\x04\ +\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x05h\xff\x87\x04\ +\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x05h\xff\x87\x04\ +\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x05h\xff\x87\x04\ +\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x05h\xff\x87\x04\ +\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x05h\xff\x87\x04\ +\xdb\x00T\x05h\xff\x87\x04\xdb\x00T\x04\x7f\x00!\x04\ +\xa2\x00T\x04\x7f\x00!\x04\xa2\x00T\x04\x7f\x00!\x04\ +\xa2\x00T\x04\x7f\x00!\x04\xa2\x00T\x04\x7f\x00!\x04\ +\xa2\x00O\x04\x7f\x00!\x04\xa2\x00T\x04\x7f\x00!\x04\ +\xa2\x00T\x04\x7f\x00!\x04\xa2\x00T\x03h\xff\xb6\x02\ +\x9a\x00\x17\x03h\xff\xb6\x02\x9a\xff\xcd\x05\xe5\x00h\x04\ +\xdb\x00T\x05\xe5\x00h\x04\xdb\x00T\x05\xe5\x00h\x04\ +\xdb\x00T\x05\xe5\x00h\x04\xdb\x00T\x05\xe5\x00h\x04\ +\xdb\x00T\x05\xe5\x00h\x04\xdb\x00T\x05\xe5\x00h\x04\ +\xdb\x00T\x06m\x00h\x05\xa8\x00T\x06m\x00h\x05\ +\xa8\x00T\x06m\x00h\x05\xa8\x00T\x06m\x00h\x05\ +\xa8\x00T\x06m\x00h\x05\xa8\x00T\x05\x9c\x00}\x04\ +\xfa\x00`\x05\x9c\x00}\x04\xfa\x00`\x06{\x00}\x06\ +%\x00`\x06{\x00}\x06%\x00`\x06{\x00}\x06\ +%\x00`\x06{\x00}\x06%\x00`\x06{\x00}\x06\ +%\x00`\x04\xd5\x00\xa4\x04Z\xff\x7f\x04\xd5\x00\xa4\x04\ +Z\xff\x7f\x04\xd5\x00\xa4\x04Z\xff\x7f\x04\xd5\x00\x13\x00\ +\x00\xfc\x9c\x00\x00\xfc\xa2\x00\x00\xfb\xbc\x00\x00\xfc\x93\x00\ +\x00\xfc\x8d\x00\x00\xfc\xe7\x00\x00\xfc\xe7\x00\x00\xfc\xe7\x00\ +\x00\xfc\xe7\x01\xa8\xff!\x02\xd9\xff\x0c\x02\xd9\xff\x0a\x04\ +f\x00v\x04\xcb\x00T\x04\x10\x00#\x04\xbe\xff\xfe\x04\ +\xbc\xff\xd8\x04w\xff\xb8\x04{\xff\xda\x04\xb6\x00M\x04\ +\xc3\x00\x03\x04\xa2\x00,\x04\xd9\x00c\x06\x14\xff'\x05\ +\xd7\x00{\x04j\x00\x9c\x03\xa8\x00?\x04\xdd\x00\x0a\x04\ +\xdd\x00\x0a\x04\xdd\x00\x0a\x04\xdd\x00\x0a\x04\xdd\x00\x0a\x02\ +\xd7\x00\x1f\x02\xd7\x00\x1f\x02\xd7\x00\x1f\x02\xd7\x00\x1f\x02\ +\xd7\x00\x1f\x02\xd7\x00\x1f\x02\xd7\x00\x1f\x02\xd7\x00\x1f\x02\ +\xd7\xff\xa0\x02\xd7\x00\x1f\x05\xd1\x00\x1f\x03s\x00\x09\x02\ +\xd7\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\xff\ +\xe3\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,F#F`\x8a\x8aF# F\x8a`\ +\x8aa\xb8\xff\x80b# \x10#\x8a\xb1\x0c\x0c\x8ap\ +E` \xb0\x00PX\xb0\x01a\xb8\xff\x80\x8b\x1b\xb0\ +\x81\x8cYh:-,K#QX\xb9\x003\xff\xe0\ +\xb14 \x1b\xb33\x004\x00YDD-,\xb0\x16\ +CX\xb0\x03&E\x8aXdf\xb0\x1f`\x1bd\xb0\ + `f X\x1b!\xb0@Y\xb0\x01aY#X\ +eY\xb0)#D#\x10\xb0)\xe0\x1b!!!!\ +!Y-,\xb0\x02CTXKS#KQZX\ +8\x1b!!Y\x1b!!!!Y-,\xb0\x16C\ +X\xb0\x04%Ed\xb0 `f X\x1b!\xb0@\ +Y\xb0\x01a#X\x1beY\xb0)#D\xb0\x05%\ +\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04%\x10\xb0\x05\ +% F\xb0\x04%#B<\xb0\x04%\xb0\x07%\x08\ +\xb0\x07%\x10\xb0\x06% F\xb0\x04%\xb0\x01`#\ +B< X\x01\x1b\x00Y\xb0\x04%\x10\xb0\x05%\xb0\ +)\xe0\xb0) EeD\xb0\x07%\x10\xb0\x06%\xb0\ +)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\ +\x05%\xb0\x03%CH\xb0\x04%\xb0\x07%\x08\xb0\x06\ +%\xb0\x03%\xb0\x01`CH\x1b!Y!!!!\ +!!!-,\x02\xb0\x04% F\xb0\x04%#\ +B\xb0\x05%\x08\xb0\x03%EH!!!!-,\ +\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%CH!!\ +!-,E# E\x18 \xb0\x00P X#e\ +#Y#h \xb0@PX!\xb0@Y#Xe\ +Y\x8a`D-,KS#KQZX E\x8a\ +`D\x1b!!Y-,KTX E\x8a`D\ +\x1b!!Y-,KS#KQZX8\x1b!\ +!Y-,\xb0\x00!KTX8\x1b!!Y-\ +,\xb0\x02CTX\xb0F+\x1b!!!!Y-\ +,\xb0\x02CTX\xb0G+\x1b!!!Y-,\ +\xb0\x02CTX\xb0H+\x1b!!!!Y-,\ +\xb0\x02CTX\xb0I+\x1b!!!Y-, \ +\x8a\x08#KS\x8aKQZX#8\x1b!!Y\ +-,\x00\xb0\x02%I\xb0\x00SX \xb0@8\x11\ +\x1b!Y-,\x01F#F`#Fa# \x10\ + F\x8aa\xb8\xff\x80b\x8a\xb1@@\x8apE`\ +h:-, \x8a#Id\x8a#SX<\x1b!\ +Y-,KRX}\x1bzY-,\xb0\x12\x00K\ +\x01KTB-,\xb1\x02\x00B\xb1#\x01\x88Q\xb1\ +@\x01\x88SZX\xb9\x10\x00\x00 \x88TX\xb2\x02\ +\x01\x02C`BY\xb1$\x01\x88QX\xb9 \x00\x00\ +@\x88TX\xb2\x02\x02\x02C`B\xb1$\x01\x88T\ +X\xb2\x02 \x02C`B\x00K\x01KRX\xb2\x02\ +\x08\x02C`BY\x1b\xb9@\x00\x00\x80\x88TX\xb2\ +\x02\x04\x02C`BY\xb9@\x00\x00\x80c\xb8\x01\x00\ +\x88TX\xb2\x02\x08\x02C`BY\xb9@\x00\x01\x00\ +c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C`BY\xb1\ +&\x01\x88QX\xb9@\x00\x02\x00c\xb8\x04\x00\x88T\ +X\xb2\x02@\x02C`BY\xb9@\x00\x04\x00c\xb8\ +\x08\x00\x88TX\xb2\x02\x80\x02C`BYYYY\ +YY\xb1\x00\x02CTX@\x0a\x05@\x08@\x09@\ +\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\x05@\x08\xba\ +\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\xb1\x80\x02C\ +RX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\x1b\xb2\x05@\ +\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\x00\x80\x88U\ +\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZX\xb3\x0c\x00\ +\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYBBBBB\ +-,E\x18h#KQX# E d\xb0@\ +PX|Yh\x8a`YD-,\xb0\x00\x16\xb0\x02\ +%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02#>\xb1\x01\ +\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\x01\xb0\x01#\ +?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\x06#eB\ +\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\xb0\x02CP\ +\xb0\x01\xb0\x02CT[X!#\x10\xb0 \x1a\xc9\x1b\ +\x8a\x10\xedY-,\xb0Y+-,\x8a\x10\xe5-@\ +\xc7\x09YGH\x1f!H U \x01\x03U\x1fH\ +\x03U\x1e\x03\xff\x1f\x94X\xa4X\xb4X\x03WT\x0c\ +\x1fVT\x0c\x1fUT\x17\x1fDTTT\x02%3\ +$U\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\xff\x1fQN\ +\x0c\x1fPN\x0c\x1fON\x17\x1fDNTN\xa4N\ +\x03\x133\x12U\x05\x01\x03U\x043\x03U\x1f\x03\x01\ +\x0f\x03?\x03\xaf\x03\x03\x06dM\x01DL\x01KF\ +\x0d\x1fJF\x0d\x1fIF\x0d\x1f\x04H\x14H$H\ +\x03GF\x0d\x1f$F\x01#\x223\x1f\x1c3\x1bU\ +\x163\x15U\x11\x01\x0fU\x103\x0fU\x1f\x0f?\x0f\ +_\x0f\x03\x1f\x0f\xaf\x0f\xcf\x0f\x03\x10\x0f\x01\x02\x01\x00\ +U\x013\x00U?\x00o\x00\x7f\x00\xaf\x00\xef\x00\x05\ +\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\x90\xb1TS++\ +K\xb8\x07\xffRK\xb0\x09P[\xb0\x01\x88\xb0%S\ +\xb0\x01\x88\xb0@QZ\xb0\x06\x88\xb0\x00UZ[X\ +\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\x1dK\xb02SX\ +\xb0 \x1dYK\xb0dSX\xb0\x10\x1d\xb1\x16\x00B\ +Yss++stu+++++s+s\ ++++ss^st+++s++++\ ++++s+++s+++++\x18^\x06\ +\x14\x00\x17\x00N\x05\xb6\x00\x17\x00u\x05\xb6\x05\xcd\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04m\x00\ +\x14\x00l\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\ +\x00\xff\xec\x00\x00\xfe\x14\xff\xec\x00\x00\x05\xb6\x00\x15\xfc\ +\x94\xff\xeb\xfe`\xfe7\xfe\xcc\xff\xec\x04\x97\xfe\xbc\x02\ +\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x01#\x017\x01\ +Z\x01\x1b\x01\x06\x01\x00\x00\xf6\x00\xd7\x01D\x01=\x01\ +/\x01#\x01\x1b\x01\x08\x01<\x01F\x01/\x01\x1c\x00\ +\xcd\x015\x01\x7f\x00\x00\x00\x00\x00\x1b\x00\x1b\x00\x1b\x00\ +\x1b\x00G\x00e\x00\xb9\x01\x15\x01y\x01\xe0\x01\xf4\x02\ +\x1e\x02H\x02s\x02\x96\x02\xaf\x02\xc2\x02\xdd\x02\xf2\x03\ +0\x03R\x03\x89\x03\xe2\x04\x1c\x04c\x04\xb3\x04\xd2\x05\ +,\x05{\x05\xac\x05\xd8\x05\xf3\x06\x1b\x066\x06\x88\x07\ +\x08\x079\x07\x85\x07\xbf\x07\xf4\x08#\x08K\x08\x8f\x08\ +\xb8\x08\xd7\x08\xfe\x09-\x09G\x09~\x09\xab\x09\xea\x0a\ +!\x0al\x0a\xac\x0a\xfb\x0b\x1a\x0bM\x0bw\x0b\xbe\x0b\ +\xef\x0c\x15\x0c@\x0ce\x0cy\x0c\x9d\x0c\xbb\x0c\xcd\x0c\ +\xe8\x0d/\x0d{\x0d\xb1\x0d\xfd\x0eE\x0e\x91\x0f\x13\x0f\ +L\x0fr\x0f\xa9\x0f\xdb\x0f\xee\x10B\x10|\x10\xb2\x10\ +\xfa\x11F\x11q\x11\xbb\x11\xf6\x12/\x12V\x12\xa1\x12\ +\xd2\x13\x10\x13;\x13\x89\x13\x9c\x13\xe8\x14\x1d\x14\x1d\x14\ +L\x14\x93\x14\xe6\x152\x15z\x15\x98\x16\x10\x166\x16\ +\xa3\x16\xeb\x17\x19\x171\x179\x17\xb2\x17\xc0\x17\xf2\x18\ + \x18R\x18\x9e\x18\xba\x18\xf9\x19\x1f\x19;\x19_\x19\ +\x7f\x19\xb0\x19\xdf\x19\xf5\x1a\x0a\x1a!\x1ay\x1a\x8a\x1a\ +\x9b\x1a\xac\x1a\xbd\x1a\xcf\x1a\xe0\x1b&\x1b2\x1bC\x1b\ +T\x1be\x1bw\x1b\x88\x1b\x99\x1b\xaa\x1b\xbc\x1c\x04\x1c\ +\x15\x1c&\x1c7\x1cH\x1cY\x1ck\x1c\x93\x1c\xe5\x1c\ +\xf6\x1d\x07\x1d\x18\x1d*\x1d;\x1dp\x1d\xe6\x1d\xf6\x1e\ +\x06\x1e\x16\x1e&\x1e7\x1eH\x1e\xce\x1e\xda\x1e\xea\x1e\ +\xfa\x1f\x0a\x1f\x1b\x1f,\x1f=\x1fN\x1f`\x1f\xb5\x1f\ +\xc5\x1f\xd5\x1f\xe5\x1f\xf5 \x05 \x16 i \xb8 \ +\xc8 \xd9 \xe9 \xfa!\x0a!X!i!z!\ +\x8a!\x9b!\xab!\xb7!\xc3!\xd4!\xe4!\xf5\x22\ +\x05\x22\x16\x22'\x228\x22H\x22Y\x22e\x22m\x22\ +\xcc\x22\xdd\x22\xed\x22\xfe#\x0e#\x1f#0#<#\ +H#Y#i#z#\x8a#\x9b#\xab#\xbc#\ +\xcd#\xd9#\xe9#\xfa$\x0e$R$\xa1$\xb2$\ +\xc3$\xd4$\xe5$\xf6%\x07%\x13%\x1f%0%\ +C%O%[%l%}%\x89%\x95%\xc7%\ +\xd8%\xec%\xf7&\x03&\x0f&\x1b&/&D&\ +u&\x9e&\xaf&\xbf&\xcb&\xd7&\xe8&\xf8'\ +\x05'G'\x8f'\xa0'\xb0'\xc1'\xd1'\xe3'\ +\xf4(M(\xbe(\xcf(\xdf(\xeb(\xf7)\x08)\ +\x19)*):)K)\x5c)h)t)\x85)\ +\x95)\xa0)\xab)\xbc)\xd0*\x05*V*g*\ +w*\x88*\x98*\xa9*\xb9*\xcb*\xdc*\xee+\ +\x00+\x0c+\x18+)+:+K+[+m+\ +~+\x8e+\x9f+\xaf+\xc0+\xd0,\x06,N,\ +\xbb-<-M-^-o-\x7f-\x8a-\x95-\ +\xbb-\xe0-\xf2.\x14.,.X.|.\xb2.\ +\xdd.\xf9/7/K/S/h/}/\x91/\ +\xa6/\xbb/\xd0/\xe3/\xeb/\xf30\x0c0\x140\ +\x1c0$0,0|0\x840\x8c0\xb10\xb90\ +\xc10\xf30\xfb1\x191!1R1Z1b1\ +\xb71\xbf2\x092X2j2|2\x8c2\x9c2\ +\xac2\xbd2\xcf3/3\x893\xbc4\x124m4\ +\xb44\xef5:5b5j5\xb35\xbb5\xe06\ +?6G6\x846\xcc7\x127N7\x857\xb78\ +\x068X8\xa18\xf29\x049\x159%959\ +F9X9\xa59\xb69\xfd:\x05:\x0d:\x1f:\ +':\x80:\xcb;\x07;\x18;);S;[;\ +\x97;\x9f;\xa7;\xe2;\xea<$\x1b>\ +M>\x88>\xca>\xff?M?\xa5?\xe6?\xee@\ +J@\x9d@\xe9A@AHA\xb4B\x05B\x0dB\ +\x1dBCB~B\xb8B\xe1B\xe9B\xf1B\xf9C\ +\x01C\x09C\x11C_CgC\xafC\xe6DzOz_zqz\x82z\ +\x94z\xa5z\xb7z\xc8z\xee{\x15{'{9{\ +\x87{\xd3|\x17|Z|\x99|\xd4}\x0a}\x12}\ +f}\xcd~1~\x8b~\xe5\x7f:\x7f\x92\x7f\xef\x80\ +8\x80}\x80\xc3\x81\x05\x81E\x81\x85\x81\xde\x81\xe6\x82\ +8\x82\x8e\x82\x9a\x82\xa6\x82\xb7\x82\xc8\x82\xda\x82\xec\x82\ +\xfe\x83\x10\x83\x22\x834\x83F\x83X\x83m\x83\x81\x83\ +\x93\x83\xa5\x83\xb7\x83\xc9\x83\xdb\x83\xed\x83\xff\x84\x11\x84\ +&\x84:\x84F\x84R\x84c\x84t\x84\x85\x84\x95\x84\ +\xa7\x84\xb9\x84\xcb\x84\xdd\x84\xef\x85\x01\x85\x13\x85%\x85\ +:\x85N\x85_\x85p\x85|\x85\x88\x85\x94\x85\xa0\x85\ +\xb1\x85\xc2\x85\xd4\x85\xe6\x85\xf8\x86\x0a\x86\x1c\x86.\x86\ +@\x86R\x86g\x86{\x86\x8c\x86\x9c\x86\xad\x86\xbd\x86\ +\xce\x86\xdf\x86\xf0\x87\x00\x87\x0c\x87\x18\x87$\x870\x87\ +A\x87R\x87c\x87t\x87\x85\x87\x95\x87\xa6\x87\xb7\x87\ +\xc8\x87\xd8\x87\xe4\x87\xf0\x87\xfc\x88\x08\x88\x19\x88*\x88\ +;\x88K\x88W\x88\x82\x88\xb6\x88\xec\x89+\x89\x82\x89\ +\xb7\x89\xed\x8a*\x8ax\x8a\x9a\x8a\xbb\x8a\xdc\x8a\xe4\x8b\ +\x1a\x8b>\x8b|\x8b\xd0\x8c\x09\x8cP\x8cX\x8cx\x8c\ +\x80\x8c\xd1\x8dL\x8d\xb8\x8d\xc4\x8d\xd0\x8e)\x8e9\x8e\ +I\x8eZ\x8ek\x8e\x7f\x8e\x90\x8e\xa1\x8e\xb2\x8e\xc4\x8e\ +\xd5\x8e\xe6\x8e\xf7\x8f\x02\x8f\x13\x8f\x1f\x8f4\x8f<\x8f\ +N\x8fV\x8fh\x8fp\x8fx\x8f\x89\x8f\x95\x00\x00\x00\ +\x02\x00\xc3\x00\x00\x04\x0a\x05\xb6\x00\x03\x00\x07\x00\x0d\xb4\ +\x04\x03\x07\x00\x03\x00?2/310\x13!\x11!\ +7!\x11!\xc3\x03G\xfc\xb9h\x02w\xfd\x89\x05\xb6\ +\xfaJh\x04\xe6\x00\x02\x00\x0c\xff\xe7\x02\xc3\x05\xb6\x00\ +\x03\x00\x0f\x00\x1a@\x0c\x01\x01\x0d\x02\x0d\x07ZY\x0d\ +\x16\x02\x03\x00??+\x11\x12\x009\x18/10\x01\ +!\x13!\x014632\x16\x15\x14\x06#\x22&\x01\ +\xc5\xfe\xb8\x9c\x01\xaa\xfdI\x82rW]\x7fnXc\ +\x02\x04\x03\xb2\xfa\xc9k~QJnxM\x00\x02\x00\ +\xb6\x03\xa6\x04\x0e\x05\xb6\x00\x03\x00\x07\x00\x0d\xb4\x06\x02\ +\x07\x03\x03\x00?3\xcd210\x01\x03!\x13!\x03\ +!\x13\x02T\x9e\xff\x00H\x03\x10\x9d\xfe\xfeI\x05\xb6\ +\xfd\xf0\x02\x10\xfd\xf0\x02\x10\x00\x00\x02\x00\x0e\x00\x00\x05\ +N\x05\xb6\x00\x1b\x00\x1f\x005@\x19\x08\x04\x0c\x0c\x1c\ +\x01\x0d\x1f\x00\x10\x10\x19\x15\x11\x0d\x11\x0d\x11\x0a\x17\x13\ +\x03\x06\x0a\x12\x00?3?3\x1299//\x113\ +33\x1133\x11333\x113310\x01\x07\ +3\x07!\x03!\x13#\x03!\x13#7!7#7\ +!\x13!\x033\x13!\x033\x07\x0537#\x04+\ +9\xf3\x14\xfe\xdbo\xfe\xf2q\xa8q\xfe\xf2p\xdb\x15\ +\x01\x0a9\xeb\x14\x01\x1do\x01\x0eo\xa8o\x01\x0en\ +\xdd\x15\xfd\x02\xa8:\xa8\x03?\xc8\xee\xfew\x01\x89\xfe\ +w\x01\x89\xee\xc8\xf2\x01\x85\xfe{\x01\x85\xfe{\xf2\xc8\ +\xc8\x00\x01\x00=\xff\x87\x04\x98\x06\x14\x00'\x009@\ +\x1d\x14\x22\x00\x0e\x22\x0e\x1f\x0c\x03\x0cVY\x06\x03\x17\ +\x1fWY\x1a\x17\x03\x17\x03\x17\x05\x18\x00\x05\x19\x00?\ +?\x1299//\x113+\x11\x003+\x11\x12\x00\ +99\x113\x11310\x01\x14\x04\x07\x07#7&\ +'\x11\x16\x163254&'&&54$7\ +73\x07\x16\x17\x03&#\x22\x06\x15\x14\x16\x17\x16\x16\ +\x04+\xfe\xf6\xe4&\xa8)\xdd~~\xcce\xaeAk\ +\x8b\x96\x01\x0b\xe0\x1d\xa8\x1f\xa1\x99\x8c\x9e\x89BKN\ +w\x8c\x82\x01\xe1\xb2\xe0\x0d\xbb\xbf\x10L\x017;6\ +i(A3>\xc4\x81\xb0\xe0\x0f\x85\x89\x0fK\xfe\xf2\ +G8(5I:D\xaf\x00\x00\x05\x00P\xff\xec\x07\ +\x1b\x05\xcb\x00\x03\x00\x0e\x00\x1c\x00'\x005\x00\x1d@\ +\x0e\x1d3\x22,\x19\x09\x13\x04\x1a\x07\x03\x06\x02\x18\x00\ +???3\xcc2?3\xcc210\x01\x01!\x01\ +\x05\x22\x06\x15\x1432654&\x05\x14\x02\x06#\ +\x22&54\x12632\x16\x01\x22\x06\x15\x1432\ +654&\x05\x14\x02\x06#\x22&54\x1263\ +2\x16\x06^\xfb\xc7\xfe\xd7\x04A\xfc\xb52M54\ +K\x18\x01;q\xcb\x81\x9f\x9el\xc9\x89\x93\xa9\x02y\ +2M54K\x18\x01;p\xcc\x81\x9f\x9el\xc9\x89\ +\x93\xa9\x05\xb6\xfaJ\x05\xb6\xdd\xdc\x82T\xdd\x81+)\ +P\xa5\xfe\xec\x9b\xa7\x9b\xad\x01\x11\x96\xaa\xfdn\xdc\x82\ +T\xdd\x81,(P\xa4\xfe\xec\x9b\xa6\x9b\xad\x01\x11\x96\ +\xaa\x00\x03\x00\x08\xff\xec\x05\xd1\x05\xcd\x00\x1e\x00)\x00\ +1\x00.@\x1a\x1c*PY\x1c\x13\x0f\x03\x13\x03-\ +-$$\x10\x1a\x03\x09\x19\x12\x09\x1fSY\x09\x04\x00\ +?+\x00\x18?\x12\x179\x113\x12\x179?+1\ +0\x13467&&54632\x16\x15\x14\x06\ +\x07\x17667!\x06\x02\x07\x13!'\x06#\x22$\ +\x01\x22\x06\x15\x14\x176654&\x0327\x03\x06\ +\x15\x14\x16\x08\xaf\xb8%/\xfc\xe5\xbd\xe3\xa0\xb6\x81$\ +O\x18\x01\x7f.\xa5k\xbf\xfeF+\x9b\xc2\xf4\xfe\xec\ +\x02\xe11=3HE,\xd4M=\xc1u_\x01\x81\ +\x9f\xd3<.\x91;\xc5\xdf\xb0\x94\x82\xce^\xba$\x9d\ +S\xa1\xfe\xdfm\xfe\xfa=Q\xd5\x04\x04EK\x00\x00\ +\x01\x00\xb6\x03\xa6\x02T\x05\xb6\x00\x03\x00\x09\xb2\x02\x03\ +\x03\x00?\xcd10\x01\x03!\x13\x02T\x9e\xff\x00H\ +\x05\xb6\xfd\xf0\x02\x10\x00\x00\x02\x00D\xfe\xbc\x03\x87\x05\ +\xdf\x00\x0d\x00\x0e\x00\x0c\xb4\x03\x0e\x04\x0b'\x00??\ +\xc510\x13\x10\x12\x01!\x00\x02\x11\x14\x12\x17!&\ +\x02\x01D\xf9\x01\x07\x01C\xfe\xfc\xf8A4\xfe\xdbC\ +T\x02\x8c\x01F\x01J\x02B\x01\x0d\xfe\xe7\xfd\xb2\xfe\ +\xbd\x96\xfe\xa0\x83x\x01f\x053\x00\x00\x02\xff{\xfe\ +\xbc\x02\xb6\x05\xdf\x00\x0d\x00\x0e\x00\x0c\xb4\x0a\x0e\x04\x04\ +'\x00??\xc510\x01\x10\x02\x03!\x00\x12\x114\ +\x02'!\x16\x12\x01\x02\xb6\xf6\xff\xfe\xba\x01\x00\xf4A\ +6\x01'GP\xfe\xee\x03V\xfe\xab\xfd\xc2\xfe\xf9\x01\ +\x15\x02M\x01H\x96\x01Y\x8a|\xfe\xa4\x01\xc6\x00\x00\ +\x01\x00\x98\x02'\x04\x89\x06#\x00\x0e\x00\x0d\xb4\x06\x06\ +\x0f\x0e\x01\x00?\x129/10\x01\x03%\x03%\x13\ +\x05\x03\x07'7%\x13\x05\x13\x03\x8dt\x01p\x16\xfe\ +\xca\x94\xfe\xe3P\xa6\xf9\xfe\xfe\xd5d\x01?\x1f\x05\xe5\ +\xfe\xb5\x1e\xfe\xd3)\xfe\xc9V\x01/\xf4\xb9\xe5T\x01\ +\x16\xa5\x01^\x00\x00\x01\x00f\x00\xee\x045\x04\xba\x00\ +\x0b\x00\x12\xb6\x0b\x09\x01\x01\x06\x04\x02\x00/333\ +\x113310\x01!\x11!\x11!\x11!\x11!\x11\ +!\x01\xc7\xfe\x9f\x01a\x01\x0e\x01`\xfe\xa0\xfe\xf2\x02\ +J\x01\x10\x01`\xfe\xa0\xfe\xf0\xfe\xa4\x00\x01\xff\x98\xfe\ +\xf8\x01\xb8\x00\xee\x00\x07\x00\x08\xb1\x04\x00\x00/\xc51\ +0%\x17\x02\x07!6\x137\x01\xb0\x08t\x8c\xfe\xe0\ +5^)\xee\x17\xfe\xfa\xd9y\x01\x0as\x00\x00\x01\x00\ +\x17\x01\x89\x02\x7f\x02\xc1\x00\x03\x00\x08\xb1\x00\x01\x00/\ +310\x13\x13!\x03\x17?\x02)@\x01\x89\x018\ +\xfe\xc8\x00\x00\x01\x00\x00\xff\xe7\x01\xa8\x01h\x00\x0b\x00\ +\x0c\xb5\x09\x03ZY\x09\x16\x00?+10546\ +32\x16\x15\x14\x06#\x22&\x82rT`x\x82N\ +`\x7fm|PKvpJ\x00\x01\xff\xa6\xff\xec\x04\ +D\x05\xcb\x00\x03\x00\x0a\xb3\x03\x04\x02\x13\x00??1\ +0\x01\x01!\x01\x04D\xfc\xba\xfe\xa8\x03F\x05\xcb\xfa\ +!\x05\xdf\x00\x02\x00?\xff\xec\x04\x85\x05\xcd\x00\x0e\x00\ +\x1c\x00\x17@\x0c\x0b\x0fTY\x0b\x07\x04\x16TY\x04\ +\x19\x00?+\x00\x18?+10\x01\x10\x02\x04#\x22\ +&5\x10\x12$32\x16\x16%\x22\x06\x02\x15\x14\x16\ +326\x1254&\x04\x85\xaa\xfe\xd4\xc6\xd2\xd8\xaa\ +\x01,\xc6\x87\xbfd\xfe)7nD\x1e-:kK\ +%\x03\xd7\xfe\xd6\xfe1\xf2\xfc\xe9\x01'\x01\xdd\xf8}\ +\xe0!\xde\xfe\xaa\x94TN\xbd\x01V\xa5U]\x00\x00\ +\x01\x00\x96\x00\x00\x049\x05\xb6\x00\x0a\x00\x12\xb7\x08\x04\ +\x04\x01\x09\x06\x01\x18\x00??\x129\x11310!\ +!\x1367\x06\x07\x07'\x01!\x03\x06\xfe{\xae\x1c\ +0N5\xcb\x97\x02l\x017\x03\x1f\x84|D#}\ +\xfc\x01\x7f\x00\x01\xff\xc7\x00\x00\x04\x5c\x05\xcb\x00\x16\x00\ +\x1d@\x0f\x0d\x08UY\x0d\x07\x02\x15\x01\x01\x15UY\ +\x01\x18\x00?+\x11\x12\x009\x18?+10!!\ +\x13\x01654&#\x22\x07\x036!2\x16\x15\x14\ +\x02\x07\x07\x15!\x03\xb4\xfc\x135\x01\xe3\xf84(x\ +\xa1\xba\xea\x013\xb7\xe0\xae\xd3\xcd\x01\xea\x01\x00\x01\xb4\ +\xdd\x8c11\x93\x01\x02\xdd\xc7\xaa\x98\xfe\xf6\xb6\xb0\x0c\ +\x00\x00\x01\x00\x0e\xff\xec\x04f\x05\xcb\x00(\x007@\ +\x1e\x04\x19\x18\x19\x18WY\x0d\x19\x1d\x19\x02\x0c\x03\x19\ +\x19\x0a&& TY&\x07\x0a\x10TY\x0a\x19\x00\ +?+\x00\x18?+\x11\x12\x009\x18/_^]+\ +\x11\x12\x00910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04\ +!\x22&'\x11\x1632654&&##\x13\ +32654&#\x22\x07'6632\x16\x04\ +f\xb3\xa3\x81\x92\xfe\x9c\xfe\xd0t\xcbB\xa7\xd2\x8a\x89\ +6vkT5N\x93\xa4H?u\x99\x9e~\xeb\x8d\ +\xc9\xf1\x04q\x94\xc2!\x08\x19\xad~\xd8\xea)&\x01\ +Ld]W66\x19\x01#]Q.8T\xf8Q\ +C\xba\x00\x00\x02\xff\xf6\x00\x00\x04\x8b\x05\xb6\x00\x0a\x00\ +\x12\x00%@\x13\x01\x06\x09\x03\x12\x05\x12\x05VY\x0f\ +\x07\x12\x12\x03\x07\x06\x03\x18\x00??\x129/\x129\ ++\x11\x12\x00\x17910\x01#\x03!\x13!\x13\x01\ +!\x033!767#\x06\x07\x07\x04)\x96;\xfe\ +\x87<\xfd\xdb3\x02\xfa\x01h\xba\x95\xfd\xf21\x1d\x1f\ +\x093?\xc3\x01\x1b\xfe\xe5\x01\x1b\x01\x00\x03\x9b\xfc\x8c\ +\xc2khaK\xe9\x00\x00\x01\x00\x14\xff\xec\x04\x9a\x05\ +\xb6\x00\x1c\x00+@\x16\x16\x12\x00\x12VY\x00\x00\x06\ +\x17\x17\x1aUY\x17\x06\x06\x0dTY\x06\x19\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x00310\ +\x012\x16\x15\x10\x00!\x22&'\x11\x16\x163 5\ +4&#\x22\x06\x07'\x13!\x03!\x076\x02\x8f\xb5\ +\xe1\xfe\xbe\xfe\xcf\x81\xe76O\xccR\x01\x15eV5\ +t\x22z\xd7\x03-D\xfe);#\x03\xbe\xeb\xc7\xfe\ +\xfb\xfe\xe5,'\x01D-3\xc0L^\x14\x0c\x5c\x02\ +\xed\xfe\xbd\xb9\x04\x00\x02\x00N\xff\xec\x04\xb4\x05\xcb\x00\ +\x1a\x00%\x00(@\x15\x0c VY\x09\x0c\x0c\x13\x00\ +\x13\x1bVY\x13\x19\x00\x05VY\x00\x07\x00?+\x00\ +\x18?+\x11\x12\x009\x18/9+10\x012\x17\ +\x03&#\x22\x06\x06\x073632\x16\x15\x14\x02\x04\ +#\x22&547\x12\x00\x032654#\x22\x06\ +\x15\x14\x16\x03\xcbf\x83?_X\x91\xb8w/\x08j\ +\xc9\xa0\xa8\x89\xfe\xff\xa9\xe1\xf0\x1aU\x01\xab7BV\ +\x5cDZ5\x05\xcb\x1f\xfe\xd1\x19D\x95\x96\xaa\xce\xc4\ +\xaf\xfe\xef\x93\xf8\xf3i\x95\x01\x88\x01n\xfbT\x99i\ +\x81\x92lBC\x00\x01\x00#\x00\x00\x04\xfe\x05\xb6\x00\ +\x06\x00\x17@\x0b\x05\x02\x03\x03\x02UY\x03\x06\x00\x18\ +\x00??+\x11\x12\x009103\x01!\x13!\x07\ +\x01#\x02\xcd\xfd\xc2F\x04\x063\xfd\x18\x04o\x01G\ +\xe7\xfb1\x00\x03\x001\xff\xec\x04\x85\x05\xcd\x00\x16\x00\ + \x00,\x00(@\x14\x11\x06\x17\x17''\x0c\x00\x0c\ +\x1cWY\x0c\x19\x00!WY\x00\x07\x00?+\x00\x18\ +?+\x11\x12\x009\x113\x129910\x012\x16\ +\x15\x14\x06\x07\x16\x16\x15\x14\x04#\x22$5\x10%&\ +5466\x13\x06\x15\x14\x1632654\x13\x22\ +\x06\x15\x14\x16\x176654&\x02\xd5\xc8\xe8\x9b}\ +\x5c`\xfe\xe6\xf6\xe1\xfe\xf9\x01L\x9cy\xe3\x0b\xaaI\ +\x0276654#\x22\x07\ +\x03632\x16\x15\x14\x06\x06\x07\x06\x06\x07\x07\x014\ +632\x16\x15\x14\x06#\x22&\x01\x00\x0c\x0f6X\ +aYIZ~\xbbw\xe7\xe6\xc9\xed7gwdU\ +\x0d\x0f\xfeu\x82rW]\x7foWc\x02\x04@P\ +t\x5c@:J(Fm\x01\x1b\x87\xb4\x9eY\x86k\ +HA\x00\x01\x00+\xff\xec\x04w\x05\ +\xcb\x00%\x00(@\x14\x00\x0d\x14 \x0d \x0a\x1d\x18\ +\x1dOY\x18\x04\x03\x0aNY\x03\x13\x00?+\x00\x18\ +?+\x11\x12\x0099\x113\x11310\x01\x14\x04\ +!\x22&'\x11\x16\x1632654&&'&\ +&546632\x17\x03&#\x22\x06\x15\x14\x16\ +\x17\x16\x16\x03\xd1\xfe\xda\xfe\xf9n\xc4GT\xd9XJ\ +L\x18,`uj\x83\xef\x94\xef\xbf\x87\xabx@E\ +C^vr\x01\xc1\xde\xf71/\x01^5H>9\ +\x1b//P^\xc4u\x83\xd1sk\xfe\xd7X86\ +1UGW\xc0\x00\x01\x00\x9c\x00\x00\x04\xe5\x05\xb6\x00\ +\x07\x00\x15@\x0a\x07\x03\x04\x03NY\x04\x03\x01\x12\x00\ +??+\x11\x00310!!\x13!\x13!\x03!\ +\x02s\xfey\xed\xfe\xc3E\x04\x04G\xfe\xc2\x04s\x01\ +C\xfe\xbd\x00\x01\x00}\xff\xec\x05\xaa\x05\xb6\x00\x15\x00\ +\x14@\x09\x15\x0b\x03\x04\x11NY\x04\x13\x00?+\x00\ +\x18?310\x01\x03\x02\x00!\x22&&547\ +\x13!\x03\x06\x15\x143267\x13\x05\xaa\xc7;\xfe\ +\xb4\xfe\xe3\x86\xcdo\x0c\xc7\x01\x87\xc3\x0ey^k\x1c\ +\xbf\x05\xb6\xfc\x5c\xfe\xe7\xfe\xf3n\xc6z@A\x03\x9b\ +\xfcoD/\x7f\x81\x85\x03}\x00\x01\x00\x96\x00\x00\x05\ +\x87\x05\xb6\x00\x0d\x00\x19@\x0e\x04\x09\x14\x09$\x09\x03\ +\x09\x00\x03\x04\x03\x03\x12\x00??\x1299]10\ +\x01!\x01!\x03!\x13\x15\x14\x073667\x03\xe9\ +\x01\x9e\xfd+\xfeLh\x01~\x1b\x10\x08\x0e=\x19\x05\ +\xb6\xfaJ\x05\xb6\xfc\xdf3\x90p@\xbb4\x00\x01\x00\ +\x98\x00\x00\x08)\x05\xb6\x00\x18\x00)@\x1b\x07\x00\x04\ +\x00\x14\x00$\x00\x03\x0b\x10\x1b\x10+\x10\x03\x03\x0a\x10\ +\x00\x0d\x05\x14\x15\x03\x14\x12\x00??\x12\x179]]\ +\x11310\x0177\x01!\x11\x14\x076\x13\x01!\ +\x01!\x1147\x06\x07\x03!\x03!\x03\x02\x01\xe7(\ +^\x01O\x01P\x1a\x0a{\x01/\x01\x83\xfd\x85\xfe3\ +\x0d!U\xfd\xfeN1\x01r\x0a\x06\x01bh\xe8\x03\ +\x04\xfc\xe8\x9c\xa0\x1c\x01>\x02\xfa\xfaJ\x02l\x9b\xa9\ +\x85\xd8\xfd\xad\x05\xb6\xfd#\xfe\xf5\x00\x00\x01\xff\x83\x00\ +\x00\x05\xe7\x05\xb6\x00\x0b\x00$@\x18\x04\x08\x14\x08$\ +\x08\x03\x0b\x02\x1b\x02+\x02\x03\x09\x08\x02\x01\x04\x04\x06\ +\x03\x04\x12\x00??\x12\x179]]10!!\x03\ +\x01!\x01\x03!\x13\x01!\x01\x04\xd3\xfeP\x92\xfe\xae\ +\xfeD\x023\xdf\x01\xa0{\x015\x01\xc0\xfd\xe6\x01\xf2\ +\xfe\x0e\x03\x08\x02\xae\xfe+\x01\xd5\xfd+\x00\x00\x01\x00\ +\xa4\x00\x00\x05}\x05\xb6\x00\x08\x00\x19@\x0e\x04\x00\x14\ +\x00$\x00\x03\x00\x01\x05\x07\x03\x05\x12\x00??\x129\ +9]10\x01\x01!\x01\x03!\x13\x03!\x02\x91\x01\ +8\x01\xb4\xfd\x9cy\xfeyx\xed\x01\x93\x03\x98\x02\x1e\ +\xfc\x81\xfd\xc9\x027\x03\x7f\x00\x00\x01\xff\xa4\x00\x00\x04\ +\xc3\x05\xb6\x00\x09\x00$@\x12\x07\x05\x04\x05\x04OY\ +\x05\x03\x02\x01\x08\x01\x08OY\x01\x12\x00?+\x11\x12\ +\x009\x18?+\x11\x12\x00910!!7\x01!\ +\x13!\x07\x01!\x03\xae\xfb\xf6/\x02\xb2\xfe!C\x03\ +\xda4\xfdD\x02\x1f\xf2\x03\x85\x01?\xf5\xfc~\x00\x00\ +\x03\xff\xcb\xfe\xa8\x03f\x05\xdf\x00\x07\x00\x08\x00\x09\x00\ +\x12\xb7\x06\x01\x09'\x05\x02\x08\x04\x00?\xc52?\xc5\ +210\x01!\x01!\x07#\x013\x03\x01\x01\xdd\xfd\ +\xee\x01\x89\x02\x127\xd7\xfe\xe3\xd7'\xfe\xcb\xfe\xa8\x07\ +7\xfe\xfa\xc5\x06'\xf8\xef\x00\x00\x01\x00\xdd\xff\xec\x03\ +\x0a\x05\xcb\x00\x03\x00\x0a\xb3\x03\x03\x02\x13\x00??1\ +0\x01\x13!\x03\x02\x12\xf8\xfe\xc1\xee\x05\xcb\xfa!\x05\ +\xdf\x00\x03\xff{\xfe\xa8\x03\x12\x05\xdf\x00\x07\x00\x08\x00\ +\x09\x00\x12\xb7\x00\x07\x09'\x03\x04\x08\x04\x00?\xc52\ +?\xc5210\x073\x01#7!\x01!\x01\x01P\ +\xd5\x01\x1d\xd77\x02\x10\xfew\xfd\xf2\x02\x9a\xfe,Z\ +\x05;\xfe\xf8\xc9\x07%\xf8\xef\x00\x01\xff\xfa\x01\xf6\x04\ +9\x05\xb6\x00\x06\x00\x11\xb6\x00\x04\x04\x08\x05\x01\x03\x00\ +?3\x129/310\x03\x013\x01!\x03\x01\x06\ +\x02w\xac\x01\x1c\xfe\xee\x9c\xfe\x98\x01\xf6\x03\xc0\xfc@\ +\x029\xfd\xc7\x00\x00\x01\xffH\xfe\x85\x03#\xff{\x00\ +\x03\x00\x08\xb1\x01\x02\x00/310\x01!7!\x02\ +\xe9\xfc_9\x03\xa2\xfe\x85\xf6\x00\x01\x01\xe5\x04\xd9\x03\ +\xcf\x06!\x00\x08\x00\x0c\xb4\x0f\x05\x01\x05\x01\x00/\xc5\ +]10\x01#&&'5!\x16\x17\x03\xcf\xecR\ +\x8c \x01\x8c\x1dA\x04\xd9K\xa8@\x15\x9d\x92\x00\x00\ +\x02\x00T\xff\xec\x04\xc5\x04\x81\x00\x0b\x00\x1f\x00'@\ +\x14\x1e\x0f\x0f\x1d\x12\x19\x19\x07GY\x19\x10\x12\x00G\ +Y\x12\x16\x0d\x15\x00??+\x00\x18?+\x11\x12\x00\ +99\x18?10\x0126654&#\x22\x06\ +\x15\x14\x01!7#\x06\x06#\x22&54\x1263\ +2\x16\x1737!\x0252[6(*L{\x01\ +\xf6\xfe\xcb\x0a\x088\x82R\x9e\xa4\x92\xdf\x87T\x802\ +\x085\x016\x01#u\xc4^AO\xfd\x9b\x8f\xfe\xdd\ +{NA\xdf\xd1\xb3\x01t\xbeKU\x8c\x00\x00\x02\x00\ +\x17\xff\xec\x04\x87\x06\x14\x00\x16\x00#\x00&@\x14\x04\ +\x0b\x00\x10\x10\x17GY\x10\x10\x07\x00\x06\x15\x00\x1eG\ +Y\x00\x16\x00?+\x00\x18???+\x11\x12\x009\ +910\x05\x22&'#\x07!\x01!\x07\x06\x073\ +>\x0232\x16\x15\x14\x02\x06\x03\x22\x06\x06\x15\x14\x16\ +326654\x02\x91S|?\x081\xfe\xcd\x01\ +I\x01\x831&4\x080;J1\x9b\xa6\x8d\xe0t\ +2Z5&(1^:\x14@Q}\x06\x14\xe7\xaf\ +~;-\x19\xdf\xd1\xb2\xfe\x90\xc3\x03^r\xc2dA\ +Nv\xc2_\x90\x00\x01\x00T\xff\xec\x04!\x04\x81\x00\ +\x19\x00\x17@\x0c\x07\x0cGY\x07\x10\x00\x13GY\x00\ +\x16\x00?+\x00\x18?+10\x05\x22&54\x12\ +$32\x17\x03&#\x22\x06\x06\x15\x14\x16326\ +7\x11\x06\x06\x01\xfa\xc7\xdf\x99\x01\x15\xb0\xc3\xac{\x85\ +\x5c>jD\x01\x87\xfe\xb6\xfe\xcb\x0a\x089~U\x9e\ +\xa4\x8f\xe0r2[6P1^:\x04\x81=[%\ +\x8aO\x01-\xf9\xec{O@\xdf\xd1\xb2\x01r\xc1\xfc\ +\xa2u\xc4^\x90v\xc1a\x8f\x00\x02\x00T\xff\xec\x04\ +u\x04\x81\x00\x17\x00!\x00&@\x14\x1b\x0eLY\x1b\ +\x1b\x00\x07\x07\x18JY\x07\x10\x00\x11IY\x00\x16\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x05\ +\x22&54\x12$32\x16\x15\x14\x04!#\x15\x14\ +3267\x11\x06\x06\x13\x22\x06\x0732654\ +&\x02\x14\xd4\xec\xa7\x01#\xbf\xbe\xda\xfe\xc7\xfe\xd8;\ +\xa4O\x98ap\xc2\x1f=j\x0b\x1dm|(\x14\xed\ +\xd3\xd3\x01S\xaf\xac\x8f\xc9\xd7\x10\x94/3\xfe\xee9\ +-\x03\x8f\x8bXSD ,\x00\x01\xff/\xfe\x14\x04\ +\x19\x06\x1f\x00 \x00,@\x17\x0a\x1d\x1a\x1dFY\x14\ +\x16\x0c\x1a\x0f\x10\x16FY\x10\x01\x00\x05GY\x00\x1b\ +\x00?+\x00\x18?+\x00\x18?3\x129+\x11\x00\ +310\x03\x22'\x11\x163267\x13#?\x02\ +6632\x16\x17\x03&#\x22\x06\x07\x073\x03#\ +\x03\x06\x06\x02na?6JL\x0e\xbe\xa6+\xbd\x10\ ++\xcf\xacP\x965c@A#1\x08\x10\xd3B\xd1\ +\xcd+\xdd\xfe\x14\x1b\x01/\x12\x085\x016\xfe\xa8\xfexD\x19A\x087vK\ +Y\x8aL\x8f\xdfs2[6P1^:\x04\x81B\ +^\x8c\xf9\xa7\x01%t\xc2J9e\xc3\x84\xb5\x01s\ +\xc1\xfc\xa2u\xc4^\x90v\xc1a\x8f\x00\x01\x00\x17\x00\ +\x00\x03\xd5\x04\x81\x00\x10\x00\x14@\x09\x0b\x0f\x0a\x15\x0d\ +\x05\x05\x00\x10\x00?2\x119??10\x012\x17\ +\x03&#\x22\x06\x07\x03!\x13!\x07366\x03\x85\ +8\x18T6Eg{ j\xfe}\xef\x015\x12\x08\ +A\x98\x04\x81\x08\xfe\x81\x16\x8d\x91\xfe\x0e\x04m\xbdp\ +a\x00\x01\x00\x1f\xff\xec\x03\xdb\x04\x81\x00\x22\x00(@\ +\x14\x00\x0c\x12\x1e\x0c\x1e\x09\x1c\x15\x1cJY\x15\x10\x03\ +\x09IY\x03\x16\x00?+\x00\x18?+\x11\x12\x009\ +9\x113\x11310\x01\x14\x04#\x22'\x11\x16\x16\ +32654&'&&54632\x16\x17\ +\x07&&#\x22\x15\x14\x16\x17\x16\x03{\xfe\xfc\xf4\xde\ +\x86\x5c\x9eQDD4hja\xf2\xdfp\xb8Wy\ +B\x8d3L?G\xe1\x01\x89\xc7\xd6?\x0172(\ +%!#3;:\x96l\xac\xba46\xfc+3D\ +\x1d,#p\x00\x00\x01\x00?\xff\xec\x03\xbc\x05P\x00\ +\x18\x00 @\x10\x0c\x14\x11\x14FY\x0f\x0e\x11\x0f\x05\ +\x00GY\x05\x16\x00?+\x00\x18?33+\x11\x00\ +310\x0127\x11\x06#\x22&547\x13#\ +?\x02!\x07!\x03!\x03\x06\x15\x14\x027Bu\x88\ +\xcc\x94\x99\x18T\x9a)\xda\x89\x01\x021\x01 ?\xfe\ +\xdfT\x10\x01#/\xfe\xddC\x7f\x91Lp\x01\x92\xbe\ +X\xf0\xe3\xfe\xdd\xfe\x81M\x1c?\x00\x00\x01\x00`\xff\ +\xec\x04\xe3\x04m\x00\x18\x00\x1b@\x0d\x0c\x07\x0f\x15\x0f\ +\x0f\x03GY\x0f\x16\x0a\x15\x00??+\x00\x18?\x12\ +9910\x01\x14\x163267\x13!\x03!7\ +#\x06\x06#\x22&547\x13!\x03\x06\x01\xe7-\ +\x1f;a\x1dt\x01\x83\xef\xfe\xca\x0d\x086\x95m\x8d\ +\x9e\x19\x7f\x01\x83\x81\x13\x01w,*\x9d\x88\x02'\xfb\ +\x93\x9e]U\xab\x96j{\x02[\xfd\x97R\x00\x01\x00\ +X\x00\x00\x04\xd1\x04m\x00\x0c\x00\x17@\x0d\x05\x05\x15\ +\x05%\x05\x03\x05\x0a\x01\x0f\x00\x15\x00??99]\ +103\x03!\x13\x14\x073>\x02\x13!\x01\xe9\x91\ +\x01\x81\x1b\x08\x08\x01\x22&\xf6\x01\x9e\xfd\x9c\x04m\xfd\ +\xa5I-\x0ebR\x02\x0f\xfb\x93\x00\x00\x01\x00f\x00\ +\x00\x07\x08\x04m\x00\x1d\x00)@\x1b\x17\x0e\x05\x0e\x15\ +\x0e%\x0e\x03\x0a\x05\x1a\x05*\x05\x03\x12\x1b\x05\x0e\x00\ +\x05\x09\x0a\x0f\x09\x15\x00??\x12\x179]]\x113\ +10!\x136\x127#\x06\x07\x03!\x03!\x11\x14\ +\x07367\x13!\x03\x06\x073>\x02\x13!\x01\x03\ +H\x14\x02\x13\x0c\x08<=\xbd\xfeiB\x01m\x08\x08\ +.*\xac\x01\xac\x14\x09\x18\x08\x07\x11P\xc9\x01\x81\xfd\ +\xe6\x01\xc1I\x01\x10S\xe9\x9d\xfe\x19\x04m\xfe\x00\xb6\ +M\xb1v\x01\xdc\xfe$\x81\xa6\x163\xe5\x01\xd5\xfb\x93\ +\x00\x00\x01\xff\x89\x00\x00\x05\x0a\x04m\x00\x0b\x00$@\ +\x18\x05\x06\x15\x06%\x06\x03\x0a\x00\x1a\x00*\x00\x03\x07\ +\x06\x00\x0b\x04\x02\x04\x0f\x02\x15\x00??\x12\x179]\ +]10\x01\x03!\x01\x03!\x13\x13!\x01\x13!\x02\ +!\xd3\xfe;\x01\xd9\xcf\x01\xa6L\xba\x01\xcb\xfe/\xe4\ +\xfeT\x01H\xfe\xb8\x02B\x02+\xfe\xc6\x01:\xfd\xc0\ +\xfd\xd3\x00\x00\x01\xff\x7f\xfe\x14\x04\xcd\x04m\x00\x16\x00\ +)@\x17\x02\x04\x12\x04\x22\x04\x03\x09\x04\x04\x08\x16\x00\ +\x16\x17\x0d\x12GY\x0d\x1b\x00\x0f\x00??+\x11\x00\ +3\x11\x1299_^]10\x13!\x13\x17\x153\ +66\x13!\x01\x06\x06#\x22'\x11\x163267\ +7R\x01\x85+\x02\x08%\x1a\xe2\x01\xa0\xfdb`\xfe\ +\xb8\x5c>.?Wo+\x17\x04m\xfd\xce>W\x84\ +C\x02\x00\xfb\x04\xb9\xa4\x11\x013\x0cIN)\x00\x00\ +\x01\xff\xd7\x00\x00\x04\x0a\x04m\x00\x09\x00$@\x12\x07\ +\x04\x05\x05\x04FY\x05\x0f\x02\x08\x01\x01\x08FY\x01\ +\x15\x00?+\x11\x12\x009\x18?+\x11\x12\x0091\ +0!!7\x01!\x13!\x07\x01!\x03#\xfc\xb4+\ +\x01\xf6\xfe\xa4C\x03+5\xfe\x10\x01\x7f\xdd\x02e\x01\ ++\xf2\xfd\xb0\x00\x00\x01\xff\xf0\xfe\xbc\x03s\x05\xb6\x00\ +)\x00\x1b@\x0c\x10\x0f!!\x1a\x02\x1a\x18\x03\x02\x04\ +'\x00?3?3\x11\x129\x113310%\x14\ +3\x11#\x22&5477654&#\x132\ +677>\x0233\x03\x06\x06\x07\x03\x06\x06\x07\x15\ +\x16\x16\x15\x14\x07\x07\x06\x01\xb0qR\xb7\xb2\x0f%\x06\ +T\x5c5wp\x157\x1ca\xa3z\x81>QN\x11\ +5\x14\x83\x80ZP\x0a#\x06-X\xfe\xe7\x89\x8c?\ +@\xae\x18\x13K>\x01\x1fM_\xf6|\x84C\xfe\xe8\ +\x027H\xfe\xfe`o\x0f\x08\x1dtX\x119\xa4\x1e\ +\x00\x00\x01\x01\xba\xfe/\x02\xc9\x06\x0c\x00\x03\x00\x0a\xb3\ +\x03#\x00\x00\x00??10\x01!\x11!\x01\xba\x01\ +\x0f\xfe\xf1\x06\x0c\xf8#\x00\x01\xff\x85\xfe\xbc\x02\xec\x05\ +\xb6\x00(\x00\x1b@\x0c\x22!\x0b\x0b\x14\x02\x14\x15\x03\ +\x02\x01'\x00?3?3\x11\x129\x113310\ +\x03#\x11>\x027\x136675&5477\ +654#\x1332\x16\x15\x14\x07\x07\x06\x15\x14\x16\ +3\x03\x22\x06\x07\x07\x06\x061JIH$\x0c5\x15\ +\x86{\xaa\x0b\x22\x07\x886=\xa8\xb6\x0e%\x06Yh\ +:y{\x147%\xc9\xfe\xbc\x01\x19\x03\x15.;\x01\ +\x02cn\x0c\x087\xb3\x0c>\xa3\x1d\x15X\x01\x18\x8d\ +\x85E<\xae\x1a\x11BE\xfe\xe1Q]\xf6\xab\x99\x00\ +\x01\x00`\x02\x0c\x04/\x03\x98\x00\x17\x00\x19@\x0a\x00\ +\x06\x0c\x12\x06\x12\x06\x12\x03\x0f\x00/\xcc99//\ +\x113\x11310\x01\x22\x06\x07\x11632\x16\x17\ +\x16\x163267\x11\x06#\x22&'&&\x01P\ +4}?k\x9b=cgC^43\x819k\x9b\ +>gaKW\x02\x85<=\x01\x1dm\x17)\x1c\x1b\ +@9\xfe\xe3m\x19'\x1f\x18\x00\x03\xff\x93\xfe\xae\x02\ +J\x04\x81\x00\x03\x00\x0f\x00\x10\x00\x1a@\x0c\x00\x00\x0d\ +\x03\x10'\x0d\x07ZY\x0d\x10\x00?+\x00\x18?\xc5\ +\x119/10\x13!\x03!\x01\x14\x06#\x22&5\ +4632\x16\x01\x91\x01H\x9c\xfeV\x02\xb7\x82r\ +W]\x80mYb\xfe!\x02`\xfcN\x05;k~\ +QKmxO\xfa\x8a\x00\x01\x00\x9a\xff\xec\x04f\x05\ +\xcb\x00\x1d\x00(@\x15\x1d\x17TY\x02\x1d\x07\x10V\ +Y\x0a\x07\x1d\x07\x1d\x07\x01\x08\x07\x01\x19\x00??\x12\ +99//\x113+\x11\x003+10\x05#7\ +$\x11\x10\x00773\x07\x16\x17\x03&&#\x22\x06\ +\x06\x15\x14\x163267\x11\x06\x07\x02Z\xe53\xfe\ +\xf2\x01\x19\xe7 \xe6!zmzOb1?h@\ +>;H\x88J\x91\xa2\x14\xd0J\x01D\x012\x01\x98\ +#\x94\x96\x139\xfe\xe2%\x16c\xc2nOE2(\ +\xfe\xc9N\x0c\x00\x00\x01\xff\xee\x00\x00\x04\xc7\x05\xcb\x00\ +\x22\x001@\x19\x0e\x1c\x1d\x1cWY\x0b\x1d\x1d\x15\x00\ +\x16\x12\x15\x12UY\x15\x18\x00\x07UY\x00\x07\x00?\ ++\x00\x18?+\x11\x003\x11\x129\x18/3+\x11\ +\x00310\x012\x16\x17\x03&&#\x22\x06\x07\x07\ +3\x03#\x07\x06\x06\x07!\x03!\x13>\x0277#\ +\x1337>\x02\x03RY\xb0l\x90B`3#+\ +\x0e\x18\xfb9\xfc\x14\x10kP\x02\x5cH\xfc\x05?L\ +Y1\x11\x15\xbc9\xbc\x17\x1av\xb7\x05\xcb&0\xfe\ +\xd5\x1f 1Dr\xfe\xe9^Jw\x22\xfe\xb6\x019\ +\x158SR`\x01\x17\x81\x95\xbcW\x00\x02\x00j\x00\ +\xe7\x04J\x04\xc1\x00\x1b\x00'\x00\x1c@\x0f\x17\x13\x10\ +\x1a\x02\x0c\x09\x05\x08\x07\x15\x15\x1f\x07%\x00/3\xc6\ +2\x11\x12\x17910\x1347'7\x17632\ +\x177\x17\x07\x16\x15\x14\x07\x17\x07'\x06#\x22'\x07\ +'7&%\x14\x1632654&#\x22\x06\xbe\ +.\x82\xb9\x7f`V`X}\xbd\x81++{\xb7}\ +`XlN{\xb6\x7f.\x01\x05V?A[YC\ +@U\x02\xd3\x5c\x5c}\xb9}+0\x82\xb3\x81Rh\ +^\x5c{\xb7{)'w\xb7{Z^@XY?\ +=ZX\x00\x01\x00L\x00\x00\x05-\x05\xb6\x00\x16\x00\ +>@ \x06\x12\x13\x12XY\x01\x00\x15\x03\x0f\x13\x01\ +\x09\x03\x13\x0f@\x0a\x0e\x0f\x0eXY\x07\x0f\x0f\x0c\x15\ +\x06\x0c\x18\x00??\x129/3+\x11\x003\x1a\x18\ +\x10\xcc_^]2\x1199+\x11\x00310\x01\ +\x01!\x013\x07#\x073\x07#\x07!7#73\ +7#73\x03!\x02\x7f\x01%\x01\x89\xfe\x17\xb8-\ +\xdf\x1b\xdf+\xdf)\xfe\x85)\xe3+\xe3\x19\xe2-\xb3\ +\xbb\x01\x81\x03\xcf\x01\xe7\xfd#\xcd\x81\xcd\xbe\xbe\xcd\x81\ +\xcd\x02\xdd\x00\x02\x01\xbc\xfeD\x02\xcb\x06\x0a\x00\x03\x00\ +\x07\x00\x12\xb7\x04\x03\x04\x03\x07#\x00\x00\x00??9\ +9//10\x01!\x11!\x11!\x11!\x01\xbc\x01\ +\x0f\xfe\xf1\x01\x0f\xfe\xf1\x06\x0a\xfc\xb7\xfe\xca\xfc\xb9\x00\ +\x02\x00%\xff\xe7\x04/\x06)\x000\x00;\x00A@\ +\x22\x031\x069\x06\x12\x00\x1897\x1b4\x1e\x1e+\ ++94\x12\x04\x0f(!(MY!\x16\x09\x0fM\ +Y\x09\x01\x00?+\x00\x18?+\x11\x12\x00\x179\x11\ +3\x11\x1299\x1132\x113\x11\x129910\ +\x13467&&54632\x17\x07&&#\ +\x22\x06\x15\x14\x16\x16\x17\x16\x15\x14\x06\x07\x16\x16\x15\x14\ +\x06#\x22&'5\x16\x1632654&'&\ +&\x01\x06\x06\x15\x14\x16\x17654&\x9e\x5cV&\ +*\xe8\xdf\xb8\xb0d[\x89A<3\x1cA9\xf4L\ +\x5c %\xfe\xe7n\xae8U\xb0aEQ>I\x82\ +z\x01n%-JXJI\x03\x08T\x905&g\ +3\xa0\xa8f\xe0:+-\x1d!)-\x1aq\xc7c\ +\x904&i9\xaa\xb53,\xf94D9/&A\ +(G\xa2\x01\x05\x13F\x22+R13L6R\x00\ +\x02\x01P\x04\xe9\x04\xa8\x06#\x00\x08\x00\x12\x00\x0e\xb4\ +\x0b\x02\x02\x10\x06\x00/33\x11310\x0143\ +2\x15\x14#\x22&%432\x15\x14\x06#\x22&\ +\x01P\xc9\xaa\xc9XR\x01\xe7\xc9\xa8cdXR\x05\ +h\xbb}\xbd>A\xbb}a\x5c>\x00\x03\x00q\xff\ +\xec\x06P\x05\xcb\x00\x15\x00%\x005\x00-@\x19\x06\ +\x0b\x00\x11\x0f\x0b\x1f\x0b\x02\x00\x11\x10\x11\x02\x0b\x11\x0b\ +\x11\x1a*\x22\x132\x1a\x04\x00?3?3\x1299\ +//]]\x113\x11310\x01\x22\x06\x15\x14\x16\ +327\x15\x06#\x22&54632\x17\x07&\ +\x054\x12$32\x04\x12\x15\x14\x02\x04#\x22$\x02\ +7\x14\x12\x0432$\x1254\x02$#\x22\x04\x02\ +\x03\x91P\x5cX[\x8ax~\x93\xd5\xe7\xe3\xcf\xa6\xa6\ +\x5cr\xfct\xcb\x01\x5c\xc8\xc8\x01^\xca\xc2\xfe\xa2\xd0\ +\xce\xfe\xa4\xc5\xa3\x9d\x01\x11\x9e\x9d\x01\x10\x9f\x9d\xfe\xef\ +\x9e\x9e\xfe\xed\x9b\x03\xcbzv\x80rD\xe7@\xfa\xdf\ +\xdc\xf3R\xcd<\xf0\xca\x01`\xc6\xc8\xfe\xa2\xca\xc5\xfe\ +\xa6\xd0\xcd\x01\x5c\xc6\x9e\xfe\xf0\x9e\x9b\x01\x11\xa0\x9e\x01\ +\x11\x9d\x9f\xfe\xf0\x00\x02\x00\x8b\x02\xd9\x03\xac\x05\xc3\x00\ +\x13\x00!\x00%@\x11\x03\x0a\x08\x05\x08\x05\x08\x00\x14\ +\x0c\x00\x0c([\x1b\x00\x1f\x00?2+\x11\x003\x12\ +99\x18//\x129910\x012\x16\x1737\ +3\x03#7#\x06#\x22&&5466\x132\ +6654&#\x22\x06\x06\x15\x14\x16\x01\xe3@_\ +6\x09$\xc7\xaa\xc3\x09\x09Y\x86<`9Z\x9c`\ +.B$'!'C'&\x05\xc3(;V\xfd/\ +Vb?xYx\xe0\x82\xfd\xccM{C5=Q\ +\x86A05\x00\x00\x02\x00=\x00L\x05\x0c\x04?\x00\ +\x06\x00\x0d\x00\x10\xb5\x0c\x05\x05\x0e\x01\x08\x00/3\x12\ +9/310\x13\x01\x05\x01\x13\x05\x03%\x01\x05\x01\ +\x13\x05\x03=\x01\x98\x01\x08\xfe\xf6o\xfe\xb2\xb7\x02#\ +\x01\xa8\x01\x04\xfe\xea{\xfe\xb2\xc3\x023\x02\x06\xcc\xfe\ +\xb2\xfe\xb6\x89\x01\xdd'\x01\xef\xd2\xfe\xce\xfe\x9a\x89\x01\ +\xfa\x00\x01\x00R\x00\xee\x04!\x03Z\x00\x05\x00\x0e\xb4\ +\x02\x02\x06\x04\x05\x00/3\x129/10\x01\x11!\ +\x11!\x11\x04!\xfe\xf1\xfd@\x03Z\xfd\x94\x01\x5c\x01\ +\x10\xff\xff\x00\x17\x01\x89\x02\x7f\x02\xc1\x02\x06\x00\x10\x00\ +\x00\x00\x04\x00q\xff\xec\x06P\x05\xcb\x00\x0d\x00\x16\x00\ +&\x006\x009@\x1d\x03\x0a\x07\x07\x0f\x0e\x0e\x05\x0a\ +\x05\x09\x16\x0a\x00\x0a\x10\x0a\x02\x09\x0a\x09\x0a\x1b+#\ +\x133\x1b\x04\x00?3?3\x1299//]\x11\ +3\x113\x11\x129/33\x11\x12910\x01\x14\ +\x06\x07\x13!\x03#\x11!\x11!2\x16\x05326\ +54&##\x014\x12$32\x04\x12\x15\x14\x02\ +\x04#\x22$\x027\x14\x12\x0432$\x1254\x02\ +$#\x22\x04\x02\x04\xddY_\xd3\xfe\xe3\xa0\x0c\xfe\xe8\ +\x01\x22\xd6\xce\xfeR\x0aN?\x898\x97qx\ ++`GW, OjdS\x9cg\x89\xa6\x04\xf8\ +[n\x1d\x08\x17]B\x7f\x9c &\xe1+'PD\ +\xc2+-\x1c\x1eB\xb64+r\x00\x00\x01\x01\xc5\x04\ +\xd9\x04\x96\x06!\x00\x08\x00\x0c\xb4\x0f\x02\x01\x02\x08\x00\ +/\xcc]10\x0167!\x15\x06\x04\x07!\x01\xc5\ +{\x9f\x01\xb7-\xfe\xdbc\xfe\xe4\x04\xf0f\xcb\x0f6\ +\xce5\x00\x00\x01\xff\xae\xfe\x14\x04\xf2\x04m\x00\x1a\x00\ + @\x11\x17\x15\x02\x18\x14\x03\x00\x08\x0f\x07\x1b\x00\x0f\ +GY\x00\x16\x00?+\x00\x18??\x12\x179?1\ +0\x05\x22'#\x06\x07\x07!\x01!\x03\x06\x15\x14\x16\ +32667\x13!\x03!7#\x06\x02!f\x1d\ +\x08\x0a&5\xfe}\x01X\x01\x83\x81\x12-\x1f4=\ +.\x19u\x01\x83\xf0\xfe\xdf\x06\x08D\x14M\x86\xa9\xf6\ +\x06Y\xfd\x97N?,*4zw\x02'\xfb\x93{\ +\x8f\x00\x01\x00f\xfe\xfc\x04\xa2\x06\x14\x00\x0f\x00\x12\xb6\ +\x08\x08\x01\x03\x0e\x05\x01\x00/3/3\x129/1\ +0\x01#\x11#\x11#\x11\x06#\x22&5\x10\x123\ +!\x04\xa2\xbf\x9d\xbf6G\xd8\xcc\xd7\xec\x02y\xfe\xfc\ +\x063\xf9\xcd\x033\x12\xfa\xfb\x01\x00\x01\x02\x00\x01\x00\ +s\x02\x12\x02\x1b\x03\x93\x00\x0b\x00\x0b\xb4\x03\x09ZY\ +\x03\x00/+10\x134632\x16\x15\x14\x06#\ +\x22&s\x82qRc\x83qV^\x02\xacj}Q\ +JuqP\x00\x00\x01\xff#\xfe\x14\x01\x1f\x00\x00\x00\ +\x11\x00\x0b\xb3\x0e\x09\x03\x1b\x00?3/10\x05\x14\ +\x06#\x22'5\x16\x163254'73\x07\x16\ +\x01\x1f\xa5\x97sM\x1ea\x18D\x91K\xcd\x18\xb2\xec\ +y\x87\x1d\xcd\x09\x121I\x1c\x87)%\x00\x00\x01\x00\ +s\x02H\x03\x19\x05\xb6\x00\x09\x00\x10\xb6\x09\x06\x06\x03\ + \x00\x1e\x00??9\x11310\x013\x03!\x13\ +67\x07\x07'\x02\x1d\xfc\xbb\xfe\xc3R\x15\x22Jw\ +v\x05\xb6\xfc\x92\x01lfi;N\xb8\x00\x00\x02\x00\ +\x8b\x02\xd7\x03j\x05\xc7\x00\x0a\x00\x17\x00\x14@\x09\x08\ +\x0f\x15\x0f([\x03\x15\x1f\x00?3+\x11\x0031\ +0\x014&#\x22\x06\x15\x14326%\x14\x06\x06\ +#\x22&54\x1232\x16\x02Z\x17 8oK\x5cuC\ +(H,:=da\xfb`\xc0\xb7\xff\xff\x00T\xff\ +\xec\x04\xc5\x06!\x02&\x00D\x00\x00\x01\x06\x00C\xab\ +\x00\x00\x08\xb3\x02!\x11&\x00+5\xff\xff\x00T\xff\ +\xec\x04\xe4\x06!\x02&\x00D\x00\x00\x01\x06\x00vN\ +\x00\x00\x08\xb3\x02(\x11&\x00+5\xff\xff\x00T\xff\ +\xec\x04\xc5\x06\x1e\x02&\x00D\x00\x00\x01\x06\x01K\x08\ +\xfd\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\x00T\xff\ +\xec\x04\xc5\x06-\x02&\x00D\x00\x00\x01\x06\x01R\x00\ +\x00\x00\x08\xb3\x02*\x11&\x00+5\xff\xff\x00T\xff\ +\xec\x04\xc5\x06#\x02&\x00D\x00\x00\x01\x06\x00j\xfb\ +\x00\x00\x0a\xb4\x03\x020\x11&\x00+55\xff\xff\x00\ +T\xff\xec\x04\xc5\x06\xcf\x02&\x00D\x00\x00\x01\x06\x01\ +P\xde\x00\x00\x0a\xb4\x03\x02#\x11&\x00+55\x00\ +\x03\x00T\xff\xec\x06\xcf\x04\x81\x00*\x006\x00@\x00\ +Q@,\x15\x0f:!LY::\x00\x1a\x1a7J\ +Y\x1a\x1a\x17\x13\x05\x02\x04\x09\x10\x101GY\x10\x10\ +\x00$IY\x00\x00\x09\x09+GY\x09\x16\x04\x15\x00\ +??+\x11\x003\x18/+\x00\x18?+\x11\x12\x00\ +\x1793\x18/+\x11\x12\x009\x18/+\x00\x18?\ +10\x05\x22'\x07#7#\x06\x06#\x22&54\ +\x12632\x16\x17373\x156632\x16\x15\ +\x14\x04!#\x15\x143267\x11\x06\x06\x0126\ +54&#\x22\x06\x06\x15\x14\x01\x22\x06\x07326\ +54&\x04\xa8\xb3S\x1f\xe3\x0a\x088\x82R\x9e\xa4\ +\x92\xdf\x87\x5cx2\x085\xcf:\x95H\x9d\xbd\xfe\xc6\ +\xfe\xda<\xa4O\x98ac\xa7\xfd Lu.*1\ +X6\x03-=j\x0b\x1dm|(\x14p\x5c{N\ +A\xdf\xd1\xb3\x01t\xbeLT\x8c_8;\xad\x8e\xc9\ +\xd7\x10\x94/3\xfe\xee:,\x017\xf6\xa1AOs\ +\xc3b\x8f\x02X\x8bXSD ,\xff\xff\x00T\xfe\ +\x14\x04!\x04\x81\x02&\x00F\x00\x00\x00\x07\x00z\x01\ +\x8d\x00\x00\xff\xff\x00T\xff\xec\x04u\x06!\x02&\x00\ +H\x00\x00\x01\x06\x00C\xc8\x00\x00\x08\xb3\x02#\x11&\ +\x00+5\xff\xff\x00T\xff\xec\x04\xdc\x06!\x02&\x00\ +H\x00\x00\x01\x06\x00vF\x00\x00\x08\xb3\x02*\x11&\ +\x00+5\xff\xff\x00T\xff\xec\x04\xbd\x06!\x02&\x00\ +H\x00\x00\x01\x06\x01K\x17\x00\x00\x08\xb3\x02(\x11&\ +\x00+5\xff\xff\x00T\xff\xec\x04\xa8\x06#\x02&\x00\ +H\x00\x00\x01\x06\x00j\x00\x00\x00\x0a\xb4\x03\x022\x11\ +&\x00+55\xff\xff\x00\x17\x00\x00\x02\x91\x06!\x02\ +&\x00\xf3\x00\x00\x01\x07\x00C\xfe\xc2\x00\x00\x00\x08\xb3\ +\x01\x05\x11&\x00+5\xff\xff\x00\x17\x00\x00\x03\xf7\x06\ +!\x02&\x00\xf3\x00\x00\x01\x07\x00v\xffa\x00\x00\x00\ +\x08\xb3\x01\x0c\x11&\x00+5\xff\xff\xff\xf9\x00\x00\x03\ +\xa1\x06!\x02&\x00\xf3\x00\x00\x01\x07\x01K\xfe\xfb\x00\ +\x00\x00\x08\xb3\x01\x0a\x11&\x00+5\xff\xff\x00\x17\x00\ +\x00\x03\xb3\x06#\x02&\x00\xf3\x00\x00\x01\x07\x00j\xff\ +\x0b\x00\x00\x00\x0a\xb4\x02\x01\x14\x11&\x00+55\x00\ +\x02\x00T\xff\xec\x04\x7f\x06%\x00\x1c\x00(\x00#@\ +\x12\x15$IY\x06\x1b\x15\x15\x03\x0e\x0e\x1dIY\x0e\ +\x16\x03\x01\x00??+\x11\x12\x009\x18/99+\ +10\x01&'7\x16\x177\x17\x07\x16\x12\x15\x10\x00\ +!\x22&54\x12632\x177&'\x05'\x13\ +26654&#\x22\x06\x15\x14\x02D\x1dBs\ +\x88_\xeeR\xb8GV\xfe\xcb\xfe\xd9\xc9\xeb}\xe8\x97\ +\x82I\x0a\x13G\xfe\xefR\xc35P/%/Qc\ +\x05'\x191\xb4=Ln\xa6ZX\xfe\xbe\xa3\xfe\x98\ +\xfe\x87\xee\xd0\xaa\x01\x0e\x94X\x04\x8eh\x7f\xa8\xfcC\ +Y\x95ILV\xca{\x94\x00\xff\xff\x00\x17\x00\x00\x04\ +\xc8\x06-\x02&\x00Q\x00\x00\x01\x06\x01R\x12\x00\x00\ +\x08\xb3\x01#\x11&\x00+5\xff\xff\x00T\xff\xec\x04\ +\x87\x06!\x02&\x00R\x00\x00\x01\x06\x00C\xaf\x00\x00\ +\x08\xb3\x02\x1a\x11&\x00+5\xff\xff\x00T\xff\xec\x04\ +\xe6\x06!\x02&\x00R\x00\x00\x01\x06\x00vP\x00\x00\ +\x08\xb3\x02!\x11&\x00+5\xff\xff\x00T\xff\xec\x04\ +\x9f\x06!\x02&\x00R\x00\x00\x01\x06\x01K\xf9\x00\x00\ +\x08\xb3\x02\x1f\x11&\x00+5\xff\xff\x00T\xff\xec\x04\ +\x9e\x06-\x02&\x00R\x00\x00\x01\x06\x01R\xe8\x00\x00\ +\x08\xb3\x02#\x11&\x00+5\xff\xff\x00T\xff\xec\x04\ +\x95\x06#\x02&\x00R\x00\x00\x01\x06\x00j\xed\x00\x00\ +\x0a\xb4\x03\x02)\x11&\x00+55\x00\x03\x00f\x00\ +\xc9\x045\x04\xdb\x00\x03\x00\x0f\x00\x1b\x00K@4\x19\ +\x9f\x13\xef\x13\x02\x8b\x13\x01y\x13\x01/\x13?\x13O\ +\x13\x03\x1b\x13\x01\x13\x01\x07\xa0\x0d\xb0\x0d\xe0\x0d\x03\x84\ +\x0d\x01v\x0d\x010\x0d@\x0dP\x0d\x03\x14\x0d\x01\x0d\ +\x0d\x00\x01\x00/32/]]]]]3\x10\xc4\ +]]]]]210\x13\x11!\x11\x05463\ +2\x16\x15\x14\x06#\x22&\x114632\x16\x15\x14\ +\x06#\x22&f\x03\xcf\xfd{RLJQSHJ\ +TRLJQSHJT\x02J\x01\x10\xfe\xf0\xd5\ +SYYSQ[\x5c\x03\x0aSYYSQ[\x5c\ +\x00\x00\x03\x00B\xff\x91\x04\xc9\x04\xc1\x00\x15\x00\x1c\x00\ +\x22\x00 @\x10 \x1a\x16\x1d\x0b\x16IY\x0b\x10\x00\ +\x1dIY\x00\x16\x00?+\x00\x18?+\x11\x12\x009\ +910\x05\x22'\x07'7&54\x12$32\ +\x177\x17\x07\x16\x15\x14\x02\x04\x03\x22\x06\x06\x07\x01&\ +\x03267\x01\x16\x02%\x7fov\x7fp^\xa3\x01\ +*\xc6\x88ri\x7fiR\xa2\xfe\xd8*CtD\x02\ +\x01O#\x9fk\x82\x09\xfe\xc2\x1d\x141\x8cm\x83u\ +\xaa\xcf\x01U\xbd9ym{r\x9a\xd0\xfe\xad\xbe\x03\ +\x81n\xc4x\x01\x8d\x1d\xfd\x97\xcb\xba\xfe\x89\x0e\x00\xff\ +\xff\x00`\xff\xec\x04\xe3\x06!\x02&\x00X\x00\x00\x01\ +\x06\x00C\xb7\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\ +\xff\x00`\xff\xec\x05\x19\x06!\x02&\x00X\x00\x00\x01\ +\x07\x00v\x00\x83\x00\x00\x00\x08\xb3\x01!\x11&\x00+\ +5\xff\xff\x00`\xff\xec\x04\xe3\x06!\x02&\x00X\x00\ +\x00\x01\x06\x01K\x1f\x00\x00\x08\xb3\x01\x1f\x11&\x00+\ +5\xff\xff\x00`\xff\xec\x04\xe3\x06#\x02&\x00X\x00\ +\x00\x01\x06\x00j#\x00\x00\x0a\xb4\x02\x01)\x11&\x00\ ++55\xff\xff\xff\x7f\xfe\x14\x04\xcd\x06!\x02&\x00\ +\x5c\x00\x00\x01\x06\x00v'\x00\x00\x08\xb3\x01\x1f\x11&\ +\x00+5\x00\x02\xff\xae\xfe\x14\x04\x87\x06\x14\x00\x0c\x00\ +#\x00'@\x14\x1c\x00\x1b\x1b!\x17\x0d\x14\x14\x07G\ +Y\x14\x16\x0d\x00GY\x0d\x10\x00?+\x00\x18?+\ +\x11\x12\x0099\x18??10\x01\x22\x06\x06\x15\x14\ +\x16326654\x132\x16\x15\x14\x02\x06#\x22\ +'#\x06\x07\x07!\x01!\x07\x06\x07366\x02\xa6\ +2Z5.*0X7H\x97\xac\x8c\xe7\x89\x8fX\ +\x08\x0c,3\xfe}\x01\xb2\x01\x831&4\x08,i\ +\x03Jr\xc2dANr\xc0e\x90\x017\xe0\xc2\xcb\ +\xfe\x99\xc1\x91\xa6\xcd\xf6\x08\x00\xe7\xaf~;F\x00\xff\ +\xff\xff\x7f\xfe\x14\x04\xcd\x06#\x02&\x00\x5c\x00\x00\x01\ +\x06\x00j\xb3\x00\x00\x0a\xb4\x02\x01'\x11&\x00+5\ +5\xff\xff\xff\x87\x00\x00\x04\xf1\x07\x17\x02&\x00$\x00\ +\x00\x01\x07\x01M\x00\xb2\x01R\x00\x08\xb3\x02\x13\x05&\ +\x00+5\xff\xff\x00T\xff\xec\x04\xc5\x05\xc5\x02&\x00\ +D\x00\x00\x01\x06\x01M#\x00\x00\x08\xb3\x02#\x11&\ +\x00+5\xff\xff\xff\x87\x00\x00\x051\x07\x9e\x02&\x00\ +$\x00\x00\x01\x07\x01N\x00w\x01R\x00\x08\xb3\x02\x13\ +\x05&\x00+5\xff\xff\x00T\xff\xec\x04\xc5\x06L\x02\ +&\x00D\x00\x00\x01\x06\x01N\xe0\x00\x00\x08\xb3\x02#\ +\x11&\x00+5\xff\xff\xff\x87\xfd\xf4\x04\xe1\x05\xb6\x02\ +&\x00$\x00\x00\x00\x07\x01Q\x03\xc5\x00\x00\xff\xff\x00\ +T\xfd\xf4\x04\xc5\x04\x81\x02&\x00D\x00\x00\x00\x07\x01\ +Q\x02\xb2\x00\x00\xff\xff\x00h\xff\xec\x05i\x07s\x02\ +&\x00&\x00\x00\x01\x07\x00v\x00\xd3\x01R\x00\x08\xb3\ +\x01\x22\x05&\x00+5\xff\xff\x00T\xff\xec\x04\xc5\x06\ +!\x02&\x00F\x00\x00\x01\x06\x00v/\x00\x00\x08\xb3\ +\x01\x22\x11&\x00+5\xff\xff\x00h\xff\xec\x05V\x07\ +s\x02&\x00&\x00\x00\x01\x07\x01K\x00\xb0\x01R\x00\ +\x08\xb3\x01 \x05&\x00+5\xff\xff\x00T\xff\xec\x04\ +\x8e\x06!\x02&\x00F\x00\x00\x01\x06\x01K\xe8\x00\x00\ +\x08\xb3\x01 \x11&\x00+5\xff\xff\x00h\xff\xec\x05\ +R\x07\x89\x02&\x00&\x00\x00\x01\x07\x01O\x01\xa6\x01\ +R\x00\x08\xb3\x01!\x05&\x00+5\xff\xff\x00T\xff\ +\xec\x04!\x067\x02&\x00F\x00\x00\x01\x07\x01O\x00\ +\xa2\x00\x00\x00\x08\xb3\x01!\x11&\x00+5\xff\xff\x00\ +h\xff\xec\x05^\x07s\x02&\x00&\x00\x00\x01\x07\x01\ +L\x00u\x01R\x00\x08\xb3\x01$\x05&\x00+5\xff\ +\xff\x00T\xff\xec\x04\xa2\x06!\x02&\x00F\x00\x00\x01\ +\x06\x01L\xb9\x00\x00\x08\xb3\x01$\x11&\x00+5\xff\ +\xff\x00!\x00\x00\x05C\x07s\x02&\x00'\x00\x00\x01\ +\x07\x01L\x00Z\x01R\x00\x08\xb3\x02\x1e\x05&\x00+\ +5\xff\xff\x00T\xff\xec\x07\x12\x06\x14\x00'\x028\x03\ +\x5c\x00\x00\x00\x06\x00G\x00\x00\xff\xff\x00\x0a\x00\x00\x05\ +9\x05\xb6\x02\x06\x00\x92\x00\x00\x00\x02\x00T\xff\xec\x05\ +\x9c\x06\x14\x00\x1f\x00*\x00;@\x1f\x18\x09\x15\x0e\x0e\ + GY\x0e\x16\x15&GY\x06\x1e\x1f\x1eLY\x03\ +\x1f\x15\x1f\x15\x1f\x01\x08\x15\x01\x00\x00??\x1299\ +//\x113+\x11\x003+\x00\x18?+\x11\x12\x00\ +9910\x017!\x073\x07#\x03!7#\x0e\ +\x02#\x22&54\x12632\x16\x173767\ +7#7\x032654&#\x22\x06\x15\x14\x03y\ +\x1f\x01\x87!\x9e4\x9d\xf6\xfe\xcb\x0a\x080C[>\ +\x9e\xa4|\xd3\x82Mw:\x08\x02\x07\x12\x02\xf41P\ +M_.*Fd\x05\x81\x93\x93\xf2\xfbq{B2\ +\x1b\xdf\xd1\xa5\x01-\xadCU%\x8aO\x0e\xf2\xfb\xa2\ +\xaf\x82AN\xb8y\x8f\xff\xff\x00!\x00\x00\x04\xba\x07\ +\x17\x02&\x00(\x00\x00\x01\x07\x01M\x00T\x01R\x00\ +\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00T\xff\xec\x04\ +u\x05\xc5\x02&\x00H\x00\x00\x01\x06\x01M\x12\x00\x00\ +\x08\xb3\x02%\x11&\x00+5\xff\xff\x00!\x00\x00\x04\ +\xc4\x07\x9e\x02&\x00(\x00\x00\x01\x07\x01N\x00\x0a\x01\ +R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00T\xff\ +\xec\x04\xb1\x06L\x02&\x00H\x00\x00\x01\x06\x01N\xf7\ +\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\xff\x00!\x00\ +\x00\x04\xba\x07l\x02&\x00(\x00\x00\x01\x07\x01O\x01\ +\x0e\x015\x00\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x00\ +T\xff\xec\x04u\x067\x02&\x00H\x00\x00\x01\x07\x01\ +O\x00\xf2\x00\x00\x00\x08\xb3\x02)\x11&\x00+5\xff\ +\xff\x00!\xfd\xf4\x04\xba\x05\xb6\x02&\x00(\x00\x00\x00\ +\x07\x01Q\x01\xee\x00\x00\xff\xff\x00T\xfe\x00\x04u\x04\ +\x81\x02&\x00H\x00\x00\x00\x07\x01Q\x01\xbe\x00\x0c\xff\ +\xff\x00!\x00\x00\x05\x14\x07s\x02&\x00(\x00\x00\x01\ +\x07\x01L\x00+\x01R\x00\x08\xb3\x01\x16\x05&\x00+\ +5\xff\xff\x00T\xff\xec\x04\xfb\x06!\x02&\x00H\x00\ +\x00\x01\x06\x01L\x12\x00\x00\x08\xb3\x02,\x11&\x00+\ +5\xff\xff\x00h\xff\xec\x05\x85\x07s\x02&\x00*\x00\ +\x00\x01\x07\x01K\x00\xdf\x01R\x00\x08\xb3\x01!\x05&\ +\x00+5\xff\xff\xff{\xfe\x14\x04\xd3\x06!\x02&\x00\ +J\x00\x00\x01\x06\x01K\x1d\x00\x00\x08\xb3\x03G\x11&\ +\x00+5\xff\xff\x00h\xff\xec\x05\x81\x07\x9e\x02&\x00\ +*\x00\x00\x01\x07\x01N\x00\x87\x01R\x00\x08\xb3\x01\x1e\ +\x05&\x00+5\xff\xff\xff{\xfe\x14\x04\xd3\x06L\x02\ +&\x00J\x00\x00\x01\x06\x01N\xdc\x00\x00\x08\xb3\x03D\ +\x11&\x00+5\xff\xff\x00h\xff\xec\x05\x81\x07\x89\x02\ +&\x00*\x00\x00\x01\x07\x01O\x01\xa2\x01R\x00\x08\xb3\ +\x01\x22\x05&\x00+5\xff\xff\xff{\xfe\x14\x04\xd3\x06\ +7\x02&\x00J\x00\x00\x01\x07\x01O\x00\xf6\x00\x00\x00\ +\x08\xb3\x03H\x11&\x00+5\xff\xff\x00h\xfe;\x05\ +\x81\x05\xcd\x02&\x00*\x00\x00\x00\x07\x029\x01\x0a\x00\ +\x00\xff\xff\xff{\xfe\x14\x04\xd3\x06!\x02&\x00J\x00\ +\x00\x01\x06\x02:H\x00\x00\x08\xb3\x03E\x11&\x00+\ +5\xff\xff\x00!\x00\x00\x05\xc1\x07s\x02&\x00+\x00\ +\x00\x01\x07\x01K\x00\xb6\x01R\x00\x08\xb3\x01\x12\x05&\ +\x00+5\xff\xff\x00\x17\x00\x00\x04\xfe\x07\xaa\x02&\x00\ +K\x00\x00\x01\x07\x01K\x00X\x01\x89\x00\x0d\xb7\x01\x1e\ +p\x1e\x1e\x0c\x0c>\x00+\x115\x00\x00\x02\x00!\x00\ +\x00\x06L\x05\xb6\x00\x13\x00\x17\x00,@\x16\x17\x07N\ +Y\x16\x03\x0b\x0b\x10\x00\x0c\x17\x0c\x17\x0c\x09\x12\x0e\x03\ +\x05\x09\x12\x00?3?3\x1299//\x1133\ +3\x1133+10\x013\x07#\x03!\x13!\x03\ +!\x13#737!\x07!7!\x017!\x07\x05\ +\xa0\xac1\xae\xe2\xfey}\xfe\xa6\x7f\xfey\xe1\xaa/\ +\xac#\x01\x87\x1f\x01[ \x01\x88\xfe\x08\x1c\xfe\xa4\x1c\ +\x05\x19\xec\xfb\xd3\x02R\xfd\xae\x04-\xec\x9d\x9d\x9d\xfd\ +\xe2\x95\x95\x00\x01\x00\x17\x00\x00\x04\x85\x06\x14\x00 \x00\ +1@\x19\x02\x05\x0c\x05\x12GY\x00\x19\x1a\x19LY\ +\x1e\x1a\x05\x1a\x05\x1a\x17\x1c\x00\x0c\x17\x15\x00?3?\ +\x1299//\x113+\x11\x003+\x11\x12\x009\ +10\x01\x06\x073632\x16\x15\x14\x07\x03!\x13\ +654&#\x22\x06\x07\x03!\x13#737!\ +\x07!\x07\x02\x91\x1f0\x08c\xad\x8c\x9f\x18k\xfe}\ +m\x12-\x1fDW\x1d`\xfe}\xf5\xa84\xa7!\x01\ +\x83\x1e\x01\x0c3\x04\x8f\x7fv\x81\xab\x97ov\xfe\x0c\ +\x02\x04N?,*\x96\x8e\xfe=\x04\x8f\xf2\x93\x93\xf2\ +\x00\xff\xff\xff\xb6\x00\x00\x04[\x07\x7f\x02&\x00,\x00\ +\x00\x01\x07\x01R\xff\xa5\x01R\x00\x08\xb3\x01\x16\x05&\ +\x00+5\xff\xff\x00\x17\x00\x00\x03\xb9\x06-\x02&\x00\ +\xf3\x00\x00\x01\x07\x01R\xff\x03\x00\x00\x00\x08\xb3\x01\x0e\ +\x11&\x00+5\xff\xff\xff\xb6\x00\x00\x03\xf2\x07\x17\x02\ +&\x00,\x00\x00\x01\x07\x01M\xff\xb3\x01R\x00\x08\xb3\ +\x01\x0f\x05&\x00+5\xff\xff\x00\x17\x00\x00\x03L\x05\ +\xc5\x02&\x00\xf3\x00\x00\x01\x07\x01M\xff\x0d\x00\x00\x00\ +\x08\xb3\x01\x07\x11&\x00+5\xff\xff\xff\xb6\x00\x00\x04\ +(\x07\x9e\x02&\x00,\x00\x00\x01\x07\x01N\xffn\x01\ +R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00\x17\x00\ +\x00\x03\xa4\x06L\x02&\x00\xf3\x00\x00\x01\x07\x01N\xfe\ +\xea\x00\x00\x00\x08\xb3\x01\x07\x11&\x00+5\xff\xff\xff\ +\xb6\xfd\xf4\x03\xd9\x05\xb6\x02&\x00,\x00\x00\x00\x07\x01\ +Q\x00\xaa\x00\x00\xff\xff\xff\xc5\xfd\xf4\x02\xd5\x067\x02\ +&\x00L\x00\x00\x00\x07\x01Q\x00\x83\x00\x00\xff\xff\xff\ +\xb6\x00\x00\x03\xd9\x07\x89\x02&\x00,\x00\x00\x01\x07\x01\ +O\x00f\x01R\x00\x08\xb3\x01\x13\x05&\x00+5\x00\ +\x01\x00\x17\x00\x00\x02\x8b\x04m\x00\x03\x00\x0a\xb3\x02\x0f\ +\x01\x15\x00??10!!\x13!\x01\x9a\xfe}\xef\ +\x01\x85\x04m\x00\xff\xff\xff\xb6\xfe3\x06l\x05\xb6\x00\ +'\x00-\x03h\x00\x00\x00\x06\x00,\x00\x00\xff\xff\x00\ +\x17\xfe\x14\x05w\x067\x00'\x00M\x02\x9a\x00\x00\x00\ +\x06\x00L\x00\x00\xff\xff\xfe\xb8\xfe3\x04\x1a\x07s\x02\ +&\x00-\x00\x00\x01\x07\x01K\xfft\x01R\x00\x08\xb3\ +\x01\x15\x05&\x00+5\xff\xff\xfe\xf8\xfe\x14\x03\x9f\x06\ +!\x02&\x027\x00\x00\x01\x07\x01K\xfe\xf9\x00\x00\x00\ +\x08\xb3\x01\x13\x11&\x00+5\xff\xff\x00!\xfe;\x05\ +\xf2\x05\xb6\x02&\x00.\x00\x00\x00\x07\x029\x00\xcd\x00\ +\x00\xff\xff\x00\x17\xfe;\x05^\x06\x14\x02&\x00N\x00\ +\x00\x00\x07\x029\x00\x9e\x00\x00\x00\x01\x00\x17\x00\x00\x05\ +Z\x04m\x00\x11\x00\x17@\x0a\x0e\x0b\x05\x05\x0d\x11\x15\ +\x09\x00\x0f\x00?2?39\x113310\x01!\ +\x07\x06\x06\x07367\x13!\x01\x01!\x03\x07\x03!\ +\x01\x04\x01\x833\x0b-\x0e\x09OL\xee\x01\xba\xfe\x19\ +\x01\x12\xfeJ\x8beE\xfe}\x04m\xf02\x8d w\ +Q\x01\x07\xfe\x00\xfd\x93\x01\x875\xfe\xae\x00\xff\xff\x00\ +!\x00\x00\x04Q\x07s\x02&\x00/\x00\x00\x01\x07\x00\ +v\xff\xbb\x01R\x00\x08\xb3\x01\x0e\x05&\x00+5\xff\ +\xff\x00\x17\x00\x00\x04E\x07\xac\x02&\x00O\x00\x00\x01\ +\x07\x00v\xff\xaf\x01\x8b\x00\x0d\xb7\x01\x0cp\x0c\x0c\x02\ +\x02>\x00+\x115\x00\xff\xff\x00!\xfe;\x03\xc9\x05\ +\xb6\x02&\x00/\x00\x00\x00\x06\x029?\x00\xff\xff\xff\ +\xa9\xfe;\x02\xe3\x06\x14\x02&\x00O\x00\x00\x00\x07\x02\ +9\xffC\x00\x00\xff\xff\x00!\x00\x00\x04\xfc\x05\xb7\x02\ +&\x00/\x00\x00\x00\x07\x028\x01F\xff\xa3\xff\xff\x00\ +\x17\x00\x00\x04\xd7\x06\x14\x00&\x00O\x00\x00\x00\x07\x02\ +8\x01!\x00\x00\xff\xff\x00!\x00\x00\x04n\x05\xb6\x02\ +&\x00/\x00\x00\x01\x07\x01O\x01\x8d\xfdx\x00\x0d\xb7\ +\x01\x0d%\x0d\x08\x02\x05>\x00+\x115\x00\xff\xff\x00\ +\x17\x00\x00\x04`\x06\x14\x00&\x00O\x00\x00\x01\x07\x01\ +O\x01\x7f\xfd8\x00\x10\xb1\x01\x0b\xb8\xff\xb6\xb4\x0b\x06\ +\x00\x03>\x00+\x115\x00\x01\xff\xd1\x00\x00\x03\xdd\x05\ +\xb6\x00\x0d\x00!@\x10\x02\x05\x0d\x0a\x05\x0a\x00\x09\x09\ +\x06OY\x09\x12\x00\x03\x00??+\x11\x12\x0099\ +\x113\x11310\x01!\x037\x17\x05\x03!\x03!\ +\x13\x07'%\x01j\x01\x88Z\xac\x83\xfe\x87N\x01\xdd\ +C\xfc\x9bgN}\x01\x12\x05\xb6\xfe\x5c[\xf4\xc5\xfe\ +\x8b\xfe\xc1\x01\xe5'\xf2\x92\x00\x00\x01\xff\xcf\x00\x00\x03\ +H\x06\x14\x00\x0b\x00\x19@\x0b\x00\x03\x09\x06\x03\x06\x05\ +\x0a\x00\x05\x15\x00??\x1299\x113\x11310\ +\x017\x17\x05\x03!\x13\x07'%\x13!\x02}Vu\ +\xfe\xf1\x81\xfe}ZVj\x01\x02\xae\x01\x83\x03\xa2+\ +\xdf\x88\xfd\x9a\x01\xa4+\xdf\x85\x037\xff\xff\x00!\x00\ +\x00\x06\x5c\x07s\x02&\x001\x00\x00\x01\x07\x00v\x01\ +P\x01R\x00\x08\xb3\x01\x18\x05&\x00+5\xff\xff\x00\ +\x17\x00\x00\x04\xe2\x06!\x02&\x00Q\x00\x00\x01\x06\x00\ +vL\x00\x00\x08\xb3\x01!\x11&\x00+5\xff\xff\x00\ +!\xfe;\x06\x5c\x05\xb6\x02&\x001\x00\x00\x00\x07\x02\ +9\x01+\x00\x00\xff\xff\x00\x17\xfe;\x04\x9a\x04\x81\x02\ +&\x00Q\x00\x00\x00\x07\x029\x00\x85\x00\x00\xff\xff\x00\ +!\x00\x00\x06\x5c\x07s\x02&\x001\x00\x00\x01\x07\x01\ +L\x00\xfa\x01R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\ +\xff\x00\x17\x00\x00\x04\xeb\x06!\x02&\x00Q\x00\x00\x01\ +\x06\x01L\x02\x00\x00\x08\xb3\x01#\x11&\x00+5\xff\ +\xff\xff\xc3\x00\x00\x05D\x05\xb6\x00'\x00Q\x00\xaa\x00\ +\x00\x00\x07\x02\x07\xffe\x00\x00\x00\x01\x00!\xfe3\x06\ +\x5c\x05\xb6\x00\x19\x00\x1f@\x11\x15\x0a\x12\x08\x17\x05\x0e\ +\x0f\x03\x0e\x12\x00\x05OY\x00#\x00?+\x00\x18?\ +?\x12\x17910\x01\x22'\x11\x163267\x01\ +#\x02\x07\x03!\x01!\x01366\x13!\x01\x06\x04\ +\x02\xe9jk_``z\x14\xfe~\x08\x1d\x1c\x81\xfe\ +\xa4\x015\x01\xae\x01F\x08\x09)|\x01\x5c\xfe\xcb5\ +\xfe\xf0\xfe3\x1d\x013\x19UI\x03\xfc\xfe\xdd\x7f\xfd\ +\x9e\x05\xb6\xfc\x98N\xd7\x02C\xfaJ\xf9\xd4\x00\x01\x00\ +\x17\xfe\x14\x04\x9a\x04\x81\x00 \x00$@\x13\x15\x18\x11\ +\x18\x0dGY\x18\x10\x12\x0f\x11\x15\x00\x05GY\x00\x1b\ +\x00?+\x00\x18???+\x11\x12\x00910\x01\ +\x22'\x11\x16327\x13654&#\x22\x03\x03\ +!\x13!\x0736632\x16\x15\x14\x07\x03\x06\x06\ +\x02'na89\x8d!\x89\x12,\x1f|=t\xfe\ +}\xef\x015\x0c\x087\x95l\x8d\x9e\x19\x93(\xea\xfe\ +\x14\x1b\x01/\x12\x93\x02\x8bN@++\xfe\xdb\xfd\xd7\ +\x04m\x9e_S\xab\x97j{\xfdH\xc1\xcd\xff\xff\x00\ +h\xff\xec\x05\xa6\x07\x17\x02&\x002\x00\x00\x01\x07\x01\ +M\x00\xcd\x01R\x00\x08\xb3\x02\x1e\x05&\x00+5\xff\ +\xff\x00T\xff\xec\x04\x87\x05\xc5\x02&\x00R\x00\x00\x01\ +\x06\x01M\x08\x00\x00\x08\xb3\x02\x1c\x11&\x00+5\xff\ +\xff\x00h\xff\xec\x05\xa6\x07\x9e\x02&\x002\x00\x00\x01\ +\x07\x01N\x00\x91\x01R\x00\x08\xb3\x02\x1e\x05&\x00+\ +5\xff\xff\x00T\xff\xec\x04\x90\x06L\x02&\x00R\x00\ +\x00\x01\x06\x01N\xd6\x00\x00\x08\xb3\x02\x1c\x11&\x00+\ +5\xff\xff\x00h\xff\xec\x06\x1c\x07s\x02&\x002\x00\ +\x00\x01\x07\x01S\x017\x01R\x00\x0a\xb4\x03\x02,\x05\ +&\x00+55\xff\xff\x00T\xff\xec\x05T\x06!\x02\ +&\x00R\x00\x00\x01\x06\x01So\x00\x00\x0a\xb4\x03\x02\ +*\x11&\x00+55\x00\x02\x00h\xff\xec\x07\xb0\x05\ +\xcd\x00\x16\x00!\x00:@ \x11\x14NY\x11\x11\x01\ +\x0d\x0d\x10OY\x0d\x03\x0b\x1cNY\x0b\x04\x03\x17N\ +Y\x03\x12\x01\x15NY\x01\x12\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?+\x11\x12\x009\x18/+1\ +0!!\x06# \x0054\x12\x12$32\x17!\ +\x03!\x07!\x03!\x03!\x0527\x13&#\x22\x06\ +\x02\x15\x14\x06{\xfc\xd1h]\xff\x00\xfe\xe1u\xd4\x01\ +%\xb1^a\x03jC\xfe\x22/\x01\xbdH\xfeD:\ +\x01\xdd\xfb\xee`T\xa25e`\xade\x14\x01%\xff\ +\xc4\x01n\x01\x04\x87\x17\xfe\xc1\xe1\xfe\xbe\xfe\xf0\x0f)\ +\x02\xfa1\xb0\xfe\xda\xa5\xd9\x00\x00\x03\x00T\xff\xec\x06\ +\xdd\x04\x81\x00\x1f\x00*\x004\x00C@$.\x16L\ +Y..\x00\x0f\x0f+JY\x0f\x0f\x0d\x02\x0b\x04\x0b\ + FY\x0b\x10\x00\x19IY\x00\x04\x04%FY\x04\ +\x16\x00?+\x11\x003+\x00\x18?+\x11\x12\x009\ +92\x18/+\x11\x12\x009\x18/+10\x05\x22\ +'\x06#\x22&54\x12$32\x17632\x16\ +\x15\x14\x04!#\x15\x143267\x11\x06\x06\x01\x22\ +\x02\x15\x1432\x1254&%\x22\x06\x07326\ +54&\x04}\xcb\x5c|\xd2\xd1\xe3\x9e\x01\x15\xb5\xbb\ +Z\x90\xe5\xbc\xdb\xfe\xc6\xfe\xda;\xa3O\x98ar\xc1\ +\xfd\xacRuTQx.\x02M\x00+\x115\x00\x00\ +\x01\x00\x8f\x00\x00\x04\xe5\x05\xb6\x00\x0f\x00'@\x14\x0f\ +\x0b\x0c\x0bNY\x03\x07\x08\x07OY\x00\x08\x08\x05\x0c\ +\x03\x05\x12\x00??\x129/3+\x11\x003+\x11\ +\x00310\x013\x03#\x03!\x13#\x133\x13!\ +\x13!\x03!\x03'\xcfF\xcdp\xfeyp\xcdD\xcd\ +9\xfe\xc3E\x04\x04G\xfe\xc2\x03^\xfe\xc1\xfd\xe1\x02\ +\x1f\x01?\x01\x15\x01C\xfe\xbd\x00\x01\x00\x17\xff\xec\x03\ +\xbc\x05N\x00!\x008@\x1d\x10\x18\x15\x18FY\x03\ +\x00\x1c\x1c\x0c\x0d\x0cLY\x19\x0d\x0d\x06\x13\x12\x15\x0f\ +\x06\x00GY\x06\x16\x00?+\x00\x18?33\x129\ +/3+\x11\x003\x11\x129+\x11\x00310\x01\ +267\x11\x06#\x22&547#737#\ +?\x02!\x07!\x03!\x073\x07#\x07\x06\x15\x14\x16\ +\x023\x1ff1\x84\xc7\xa5\x93\x1dl3l#\x9a)\ +\xda\x87\x01\x02/\x01 ?\xfe\xdf#\xf83\xfa\x02\x0e\ +\x1a\x01!\x17\x14\xfe\xe1A~\x845\x97\xf2\x9c\xc0X\ +\xee\xe1\xfe\xdb\x9c\xf2\x0eD\x16\x1b\x16\xff\xff\x00}\xff\ +\xec\x05\xaa\x07\x7f\x02&\x008\x00\x00\x01\x07\x01R\x00\ +\xb0\x01R\x00\x08\xb3\x01 \x05&\x00+5\xff\xff\x00\ +`\xff\xec\x04\xe7\x06-\x02&\x00X\x00\x00\x01\x06\x01\ +R1\x00\x00\x08\xb3\x01#\x11&\x00+5\xff\xff\x00\ +}\xff\xec\x05\xaa\x07\x17\x02&\x008\x00\x00\x01\x07\x01\ +M\x00\xc3\x01R\x00\x08\xb3\x01\x19\x05&\x00+5\xff\ +\xff\x00`\xff\xec\x04\xe3\x05\xc5\x02&\x00X\x00\x00\x01\ +\x06\x01M)\x00\x00\x08\xb3\x01\x1c\x11&\x00+5\xff\ +\xff\x00}\xff\xec\x05\xaa\x07\x9e\x02&\x008\x00\x00\x01\ +\x07\x01N\x00\x8b\x01R\x00\x08\xb3\x01\x19\x05&\x00+\ +5\xff\xff\x00`\xff\xec\x04\xe3\x06L\x02&\x00X\x00\ +\x00\x01\x06\x01N\xf9\x00\x00\x08\xb3\x01\x1c\x11&\x00+\ +5\xff\xff\x00}\xff\xec\x05\xaa\x08!\x02&\x008\x00\ +\x00\x01\x07\x01P\x00u\x01R\x00\x0a\xb4\x02\x01\x19\x05\ +&\x00+55\xff\xff\x00`\xff\xec\x04\xe3\x06\xcf\x02\ +&\x00X\x00\x00\x01\x06\x01P\xef\x00\x00\x0a\xb4\x02\x01\ +\x1c\x11&\x00+55\xff\xff\x00}\xff\xec\x06\x1e\x07\ +s\x02&\x008\x00\x00\x01\x07\x01S\x019\x01R\x00\ +\x0a\xb4\x02\x01'\x05&\x00+55\xff\xff\x00`\xff\ +\xec\x05\x8f\x06!\x02&\x00X\x00\x00\x01\x07\x01S\x00\ +\xaa\x00\x00\x00\x0a\xb4\x02\x01*\x11&\x00+55\xff\ +\xff\x00}\xfd\xf4\x05\xaa\x05\xb6\x02&\x008\x00\x00\x00\ +\x07\x01Q\x01\xf2\x00\x00\xff\xff\x00`\xfd\xf4\x04\xe3\x04\ +m\x02&\x00X\x00\x00\x00\x07\x01Q\x02\xe1\x00\x00\xff\ +\xff\x00\x98\x00\x00\x08)\x07s\x02&\x00:\x00\x00\x01\ +\x07\x01K\x01\x91\x01R\x00\x08\xb3\x01\x1f\x05&\x00+\ +5\xff\xff\x00f\x00\x00\x07\x08\x06!\x02&\x00Z\x00\ +\x00\x01\x07\x01K\x00\xf0\x00\x00\x00\x08\xb3\x01$\x11&\ +\x00+5\xff\xff\x00\xa4\x00\x00\x05}\x07s\x02&\x00\ +<\x00\x00\x01\x07\x01K\x00D\x01R\x00\x08\xb3\x01\x0f\ +\x05&\x00+5\xff\xff\xff\x7f\xfe\x14\x04\xcd\x06!\x02\ +&\x00\x5c\x00\x00\x01\x06\x01K\xc4\x00\x00\x08\xb3\x01\x1d\ +\x11&\x00+5\xff\xff\x00\xa4\x00\x00\x05}\x07u\x02\ +&\x00<\x00\x00\x01\x07\x00j\x00=\x01R\x00\x0a\xb4\ +\x02\x01\x19\x05&\x00+55\xff\xff\xff\xa4\x00\x00\x04\ +\xd1\x07s\x02&\x00=\x00\x00\x01\x07\x00v\x00;\x01\ +R\x00\x08\xb3\x01\x12\x05&\x00+5\xff\xff\xff\xd7\x00\ +\x00\x04f\x06!\x02&\x00]\x00\x00\x01\x06\x00v\xd0\ +\x00\x00\x08\xb3\x01\x12\x11&\x00+5\xff\xff\xff\xa4\x00\ +\x00\x04\xc3\x07\x89\x02&\x00=\x00\x00\x01\x07\x01O\x00\ +\xe3\x01R\x00\x08\xb3\x01\x11\x05&\x00+5\xff\xff\xff\ +\xd7\x00\x00\x04\x0a\x067\x02&\x00]\x00\x00\x01\x06\x01\ +Oh\x00\x00\x08\xb3\x01\x11\x11&\x00+5\xff\xff\xff\ +\xa4\x00\x00\x04\xe4\x07s\x02&\x00=\x00\x00\x01\x07\x01\ +L\xff\xfb\x01R\x00\x08\xb3\x01\x14\x05&\x00+5\xff\ +\xff\xff\xd7\x00\x00\x04\xa8\x06!\x02&\x00]\x00\x00\x01\ +\x06\x01L\xbf\x00\x00\x08\xb3\x01\x14\x11&\x00+5\x00\ +\x01\xff\x0c\xfe\x14\x03\xf6\x06\x1f\x00\x17\x00\x17@\x0c\x0c\ +\x11GY\x0c\x00\x00\x05GY\x00\x1b\x00?+\x00\x18\ +?+10\x03\x22'\x11\x163267\x0166\ +32\x17\x03&#\x22\x06\x07\x01\x06\x06%na?\ +6JL\x0e\x01\x10*\xd0\xac\xa5vk>;&7\ +\x0b\xfe\xf0+\xde\xfe\x14\x1b\x01/\x12\ +/:3\x02@\x09\x0fH\x02\x07\x12\x18\x0c\x1e:@\ +:(GY:\x103!GY3\x16.\x15\x00?\ +?+\x00\x18?+\x00\x1a\x18\x10\xdc2\xde2\xdc\xcd\ ++\x11\x1299?10\x0167!\x15\x06\x06\x07\ +!\x01\x14\x06#\x22&54632\x16\x074&\ +#\x22\x06\x15\x14\x16326\x0126654&\ +#\x22\x06\x15\x14\x01!7#\x06\x06#\x22&54\ +\x12632\x16\x1737!\x02\xa4\x80Y\x01\xac<\ +\xcfd\xfe\xea\x01\x5c\x95wy\x94\x93zv\x96\xb45\ +##5.*'1\xfe\xe92[6(*L{\ +\x01\xf6\xfe\xcb\x0a\x088\x82R\x9e\xa4\x92\xdf\x87T\x80\ +2\x085\x016\x06\xf4]Y\x0c.f!\xfe\xc5q\ +\x8d\x89sr\x8c\x8dq&00&%/2\xfb\x99\ +u\xc4^AO\xfd\x9b\x8f\xfe\xdd{NA\xdf\xd1\xb3\ +\x01t\xbeKU\x8c\x00\xff\xff\xff\x83\x00\x00\x07\xcd\x07\ +s\x02&\x00\x88\x00\x00\x01\x07\x00v\x02\xa4\x01R\x00\ +\x08\xb3\x02\x1c\x05&\x00+5\xff\xff\x00T\xff\xec\x06\ +\xcf\x06!\x02&\x00\xa8\x00\x00\x01\x07\x00v\x01\x83\x00\ +\x00\x00\x08\xb3\x03I\x11&\x00+5\xff\xff\x00^\xff\ +\xaa\x05\xa6\x07s\x02&\x00\x9a\x00\x00\x01\x07\x00v\x01\ +\x08\x01R\x00\x08\xb3\x03-\x05&\x00+5\xff\xff\x00\ +B\xff\x91\x05\x05\x06!\x02&\x00\xba\x00\x00\x01\x06\x00\ +vo\x00\x00\x08\xb3\x03+\x11&\x00+5\xff\xff\x00\ ++\xfe;\x04w\x05\xcb\x02&\x006\x00\x00\x00\x06\x02\ +9\x1b\x00\xff\xff\x00\x1f\xfe;\x03\xdb\x04\x81\x02&\x00\ +V\x00\x00\x00\x06\x029\x0e\x00\x00\x01\x00\xfe\x04\xd9\x04\ +\xa6\x06!\x00\x0e\x00\x10\xb6\x03\x0f\x0b\x01\x0b\x06\x01\x00\ +/3\xcd]210\x01!&'\x06\x07!56\ +67!\x16\x16\x17\x04\xa6\xfe\xf6.n\x8cd\xfe\xee\ +O\xb60\x01\xbf\x1ah2\x04\xd9)\x85n@\x17H\ +\xb54;\xb5A\x00\x01\x01B\x04\xd9\x04\xe9\x06!\x00\ +\x0d\x00\x10\xb6\x05\x0f\x01\x01\x01\x03\x0a\x00/3\xcd]\ +210\x01!\x16\x1767!\x15\x06\x07!&&\ +'\x01B\x01\x0a+p\x8cd\x01\x12\x87\xae\xfeB\x1f\ +q$\x06!&\x88n@\x17r\xbfG\xbb/\x00\x00\ +\x01\x01s\x04\xd9\x04?\x05\xc5\x00\x03\x00\x08\xb1\x00\x03\ +\x00/310\x01!\x07!\x01\xa6\x02\x991\xfde\ +\x05\xc5\xec\x00\x01\x01\x8f\x04\xd9\x04\xba\x06L\x00\x0f\x00\ +\x0c\xb3\x09\x00\x0c\x03\x00/3\xcd210\x01\x06\x06\ +#\x22&5473\x14\x163267\x04\xba\x1f\ +\xe0\xc7\xa7\xbe\x09\xd9YJU_\x15\x06L\xbc\xb7\xa7\ +\x94&\x12A@A@\x00\x01\x01?\x04\xd9\x02\xe1\x06\ +7\x00\x09\x00\x08\xb1\x02\x07\x00/310\x0143\ +2\x16\x15\x14#\x22&\x01?\xe4__\xe3d[\x05\ +f\xd1ID\xd1G\x00\x00\x02\x02\x0a\x04\xd5\x04#\x06\ +\xcf\x00\x0b\x00\x17\x00\x0c\xb3\x09\x0f\x03\x15\x00/3\xce\ +210\x01\x14\x06#\x22&54632\x16\x07\ +4&#\x22\x06\x15\x14\x16326\x04#\x95wy\ +\x94\x93zv\x96\xb45#$5/*'1\x05\xd3\ +q\x8d\x89sr\x8c\x8dq&00&%/2\x00\ +\x01\xffB\xfd\xf4\x01\x17\x00\x00\x00\x12\x00\x0b\xb3\x07\x0c\ +\x1c\x00\x00/?310!\x0e\x02\x15\x14\x1632\ +7\x15\x06#\x22&5467\x01\x17a=!\x1b\ +\x1a/F^iq\x88duPCA\x22\x14\x1f\x19\ +\xde\x1ex_W\x92L\x00\x01\x01-\x04\xd5\x04\xb6\x06\ +-\x00\x18\x00\x19@\x0a\x13\x00\x06\x0d\x00\x0d\x00\x0d\x16\ +\x0a\x00/\xcc99//\x113\x11310\x01\x22\ +&&'&#\x22\x06\x07#6632\x16\x17\x16\ +\x163273\x06\x06\x03u!@:\x11I6\x1f\ +;\x07\xbc \x99\x80\x223E\x1fF N%\xbe\x22\ +\x9d\x04\xd7\x10\x1c\x09-6.\xac\xaa\x0d$\x11 d\ +\xac\xaa\x00\x00\x02\x00\xd3\x04\xd9\x04\xe5\x06!\x00\x08\x00\ +\x11\x00\x10\xb6\x0d\x0f\x04\x01\x04\x09\x00\x00/2\xcc]\ +210\x135667!\x15\x06\x05!576\ +7!\x15\x06\x05\xd3,\x8b\x22\x01s+\xfe\xaa\x01\x04\ +1t*\x01t1\xfe\xb9\x04\xd9\x1d5\xba<\x15F\ +\xed\x1dC\x9bM\x15Q\xe2\x00\x00\x01\x02\x0e\x04\xd9\x03\ +\xf4\x06^\x00\x0b\x00\x08\xb1\x04\x0b\x00/\xcd10\x01\ +667!\x15\x0e\x03\x07#\x02\x0e\x1aT\x1c\x01\x5c\ +\x1d8A\ +\xbb}\xbd<\x5c>\xafF\x14F\x8ac\x00\xff\xff\xff\ +\x87\x00\x00\x04\xe1\x05\xf5\x02&\x00$\x00\x00\x01\x07\x01\ +T\xfe\x13\xff\x97\x00\x0d\xb7\x02\x132\x13\x13\x05\x05>\ +\x00+\x115\x00\xff\xff\x00s\x02\x12\x02\x1b\x03\x93\x02\ +\x06\x00y\x00\x00\xff\xff\x00\x09\x00\x00\x05`\x05\xf5\x00\ +'\x01T\xfd\xfb\xff\x97\x01\x07\x00(\x00\xa6\x00\x00\x00\ +\x0d\xb7\x00\x032\x03\x03\x0e\x0e>\x00+\x115\x00\xff\ +\xff\x00\x09\x00\x00\x06Y\x05\xf5\x00'\x01T\xfd\xfb\xff\ +\x97\x01\x07\x00+\x00\x98\x00\x00\x00\x0d\xb7\x00\x032\x03\ +\x03\x12\x12>\x00+\x115\x00\xff\xff\xfe\xf2\x00\x00\x03\ +\xd9\x05\xf5\x02&\x00,\x00\x00\x01\x07\x01T\xfc\xe4\xff\ +\x97\x00\x0d\xb7\x01\x0f2\x0f\x0f\x06\x06>\x00+\x115\ +\x00\xff\xff\x00,\xff\xec\x067\x05\xf5\x00'\x01T\xfe\ +\x1e\xff\x97\x01\x07\x002\x00\x91\x00\x00\x00\x0d\xb7\x00\x03\ +2\x03\x03\x0c\x0c>\x00+\x115\x00\xff\xff\x00\x09\x00\ +\x00\x06\xdd\x05\xf5\x00'\x00<\x01`\x00\x00\x01\x07\x01\ +T\xfd\xfb\xff\x97\x00\x0d\xb7\x01\x0c2\x0c\x0c\x07\x07>\ +\x00+\x115\x00\xff\xff\x00\x1f\x00\x00\x06\x8c\x05\xf5\x00\ +'\x01v\x00\x9c\x00\x00\x01\x07\x01T\xfe\x11\xff\x97\x00\ +\x0d\xb7\x01%2%%\x12\x12>\x00+\x115\x00\xff\ +\xff\x00\x1b\xff\xec\x03\xf8\x06\xb4\x02&\x01\x86\x00\x00\x01\ +\x07\x01U\xff\x13\x00\x00\x00\x0c\xb5\x03\x02\x01!\x11&\ +\x00+555\xff\xff\xff\x87\x00\x00\x04\xe1\x05\xb6\x02\ +\x06\x00$\x00\x00\xff\xff\x00!\x00\x00\x04\xf6\x05\xb6\x02\ +\x06\x00%\x00\x00\x00\x01\x00!\x00\x00\x04\xb4\x05\xb6\x00\ +\x05\x00\x0f\xb7\x02\x05OY\x02\x03\x01\x12\x00??+\ +10!!\x01!\x03!\x01\xa8\xfey\x015\x03^\ +C\xfe)\x05\xb6\xfe\xc1\xff\xff\xff\xb8\x00\x00\x04\xbc\x05\ +\xb6\x02\x06\x02(\x00\x00\xff\xff\x00!\x00\x00\x04\xba\x05\ +\xb6\x02\x06\x00(\x00\x00\xff\xff\xff\xa4\x00\x00\x04\xc3\x05\ +\xb6\x02\x06\x00=\x00\x00\xff\xff\x00!\x00\x00\x05\xc1\x05\ +\xb6\x02\x06\x00+\x00\x00\x00\x03\x00h\xff\xec\x05\xe3\x05\ +\xcd\x00\x03\x00\x11\x00\x1f\x00&@\x14\x03\x02PY\x03\ +\x03\x0b\x04\x0b\x1cNY\x0b\x13\x04\x15NY\x04\x04\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +\x03!\x13\x01 \x00\x11\x14\x02\x04# \x00\x114\x12\ +$\x014&#\x22\x06\x02\x15\x14\x16326\x12\x04\ +\x10E\xfe}E\x01\x04\x01 \x012\xd2\xfe\x98\xe2\xfe\ +\xd6\xfe\xcb\xd6\x01k\x01\xaftik\xb4hopo\ +\xb3c\x03}\xfe\xcd\x013\x02P\xfe\xd1\xfe\xe9\xfb\xfe\ +J\xea\x012\x01!\xf7\x01\xb1\xe6\xfd\xb2y\x91\xa0\xfe\ +\xe7\x9b\x86\x80\x99\x01\x13\xff\xff\xff\xb6\x00\x00\x03\xd9\x05\ +\xb6\x02\x06\x00,\x00\x00\xff\xff\x00!\x00\x00\x05\xf2\x05\ +\xb6\x02\x06\x00.\x00\x00\x00\x01\xff\x8b\x00\x00\x04}\x05\ +\xb6\x00\x0e\x00\x0e\xb5\x0b\x02\x03\x05\x01\x12\x00?3?\ +310!!\x01!\x13!\x03'547#\x06\ +\x06\x07\x01)\xfeb\x02\xd3\x01\xb4k\xfe\x81\x1b\x02\x11\ +\x09\x0f8\x1d\x05\xb6\xfaJ\x02\xc7P=\x9dcB\xaa\ +C\xff\xff\x00!\x00\x00\x07P\x05\xb6\x02\x06\x000\x00\ +\x00\xff\xff\x00!\x00\x00\x06\x5c\x05\xb6\x02\x06\x001\x00\ +\x00\x00\x03\xff\xd7\x00\x00\x04\xae\x05\xb6\x00\x03\x00\x07\x00\ +\x0b\x00&@\x14\x00\x03OY\x00\x00\x0a\x04\x0a\x0bN\ +Y\x0a\x12\x04\x07OY\x04\x03\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+10\x13!\x03!\x13!\x03\ +!\x01\x03!\x13\xec\x03\x12H\xfc\xec}\x03\x8fD\xfc\ +q\x03\x06A\xfc7@\x03\x93\xfe\xc3\x03`\xfe\xc3\xfc\ +\xc9\xfe\xbe\x01B\xff\xff\x00h\xff\xec\x05\xa6\x05\xcd\x02\ +\x06\x002\x00\x00\x00\x01\x00!\x00\x00\x05\xc1\x05\xb6\x00\ +\x07\x00\x12@\x09\x06\x03NY\x06\x03\x01\x05\x12\x00?\ +3?+10!!\x13!\x03!\x01!\x04\x8b\xfe\ +y\xee\xfe\xa6\xf0\xfey\x015\x04k\x04s\xfb\x8d\x05\ +\xb6\xff\xff\x00!\x00\x00\x04\xe3\x05\xb6\x02\x06\x003\x00\ +\x00\x00\x01\xff\xc3\x00\x00\x04\xb2\x05\xb6\x00\x0b\x00$@\ +\x12\x03\x04\x07\x04\x07OY\x04\x03\x01\x00\x09\x00\x09O\ +Y\x00\x12\x00?+\x11\x12\x009\x18?+\x11\x12\x00\ +910#\x13\x01\x01\x13!\x03!\x01\x01!\x03=\ +9\x01\xfe\xfe\xcd;\x03\xb0C\xfe\x18\x01#\xfeJ\x02\ +\x04B\x01\x19\x01\xe1\x01\xa8\x01\x14\xfe\xc1\xfej\xfe^\ +\xfe\xc1\x00\xff\xff\x00\x9c\x00\x00\x04\xe5\x05\xb6\x02\x06\x00\ +7\x00\x00\xff\xff\x00\xa4\x00\x00\x05}\x05\xb6\x02\x06\x00\ +<\x00\x00\x00\x03\x00\x5c\xff\xec\x06\x8f\x05\xcb\x00\x11\x00\ +\x18\x00\x1e\x001@\x19\x1c\x15\x0f\x15QY\x0c\x0f\x1b\ +\x16\x03\x16PY\x06\x03\x0f\x03\x0f\x03\x04\x0e\x13\x04\x04\ +\x00??\x1299//\x113+\x11\x003\x113\ ++\x11\x00310\x13\x10\x00%7!\x07\x16\x04\x15\ +\x10\x00\x05\x07!7&$%\x14\x16\x17\x13\x06\x06\x05\ +4'\x0366\x5c\x01w\x01^%\x01q%\xe6\x01\ +\x07\xfe\x8e\xfe\x9b1\xfe\x901\xe7\xfe\xfb\x01\x81WU\ +i\x85\x90\x031\xach\x85\x8f\x02\xa6\x01\x1e\x01D\x0f\ +\xb4\xb4\x17\xfc\xc7\xfe\xd8\xfe\xc5\x0d\xe1\xe1\x17\xfa\xdcd\ +Z\x06\x01\xf6\x06\x9d\x22\xaf\x16\xfe\x0c\x02\x9d\xff\xff\xff\ +\x83\x00\x00\x05\xe7\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x00\ +\xa0\x00\x00\x07N\x05\xb6\x00 \x00!@\x10\x14\x11\x02\ +\x11OY \x02\x02\x01\x1a\x12\x08\x03\x01\x12\x00??\ +33\x129/3+\x11\x00310!!\x13&\ +$547\x13!\x03\x06\x15\x14\x16\x1633\x13!\ +\x0332667\x13!\x03\x06\x06\x04\x07\x03\xb8\xfe\ +\x90T\xf2\xfe\xf6\x10m\x01{k\x10\x1fER\x0c\x9e\ +\x01q\x9c\x18UY<\x12m\x01{{+\xa7\xfe\xe0\ +\xd3\x01\x8d\x04\xd3\xc1LK\x01\xfa\xfe\x02K%.5\ +\x18\x02\xe9\xfd\x17+dX\x02\x02\xfd\xcd\xc3\xcda\x05\ +\x00\x00\x01\xff\xac\x00\x00\x05\xf0\x05\xcd\x00!\x00(@\ +\x14\x1c\x07\x07\x0a\x00\x12\x00NY\x12\x04\x18\x0a\x09\x0a\ +NY\x1b\x09\x12\x00?3+\x11\x003\x18?+\x11\ +\x12\x009\x11310\x01\x22\x06\x06\x15\x14\x16\x17\x03\ +!\x13!&&54\x12$3 \x00\x15\x14\x02\x07\ +!\x03!\x136\x1254&\x03h]\x98c7H\ +R\xfdoD\x01\x83m\x81\xbd\x01[\xe0\x01!\x01R\ +\xd7\xcf\x01\x83F\xfdoR\x80\x9c\x88\x04\x89p\xddo\ +\x80\x9a@\xfe\x8d\x01DC\xe9\x84\xdc\x01L\xb1\xfe\xe6\ +\xf0\xf6\xfe\xc8Q\xfe\xbc\x01sF\x01!\xb5r\x88\xff\ +\xff\xff\xb6\x00\x00\x04:\x07u\x02&\x00,\x00\x00\x01\ +\x07\x00j\xff\x92\x01R\x00\x0a\xb4\x02\x01\x1c\x05&\x00\ ++55\xff\xff\x00\xa4\x00\x00\x05}\x07u\x02&\x00\ +<\x00\x00\x01\x07\x00j\x00)\x01R\x00\x0a\xb4\x02\x01\ +\x19\x05&\x00+55\xff\xff\x00T\xff\xec\x05\x0a\x06\ +^\x02&\x01~\x00\x00\x01\x06\x01T\x5c\x00\x00\x08\xb3\ +\x02=\x11&\x00+5\xff\xff\x00)\xff\xec\x04\x91\x06\ +^\x02&\x01\x82\x00\x00\x01\x06\x01T5\x00\x00\x08\xb3\ +\x013\x11&\x00+5\xff\xff\x00\x17\xfe\x14\x04\x9a\x06\ +^\x02&\x01\x84\x00\x00\x01\x06\x01Tf\x00\x00\x08\xb3\ +\x01$\x11&\x00+5\xff\xff\x00V\xff\xec\x03\x1e\x06\ +^\x02&\x01\x86\x00\x00\x01\x07\x01T\xff*\x00\x00\x00\ +\x08\xb3\x01\x1d\x11&\x00+5\xff\xff\x00`\xff\xec\x04\ +\xe9\x06\xb4\x02&\x01\x92\x00\x00\x01\x06\x01U\x04\x00\x00\ +\x0c\xb5\x03\x02\x01&\x11&\x00+555\x00\x02\x00\ +T\xff\xec\x05\x0a\x04\x81\x00#\x001\x00*@\x17\x15\ +\x10GY\x15\x18\x05\x1d\x00\x1d$GY\x1d\x16\x07\x0f\ +\x00+GY\x00\x10\x00?+\x00\x18??+\x11\x12\ +\x00992+10\x012\x16\x16\x17367!\ +\x06\x06\x07\x07\x06\x15\x14327\x11\x06#\x22&'\ +#\x0e\x02#\x22&54\x126\x1326654\ +&#\x22\x06\x06\x15\x14\x16\x02P8SD3\x08,\ +4\x01P4a\x1b5\x0e?\x1a(Q~j\x85\x22\ +\x0e/IY?\x9b\xab\x90\xe0o/Y5\x1e,1\ +]9.\x04\x81 =I^4Q\xf6z\xee8(\ +=\x0c\xfe\xdf FI<6\x1d\xe0\xd0\xb8\x01n\xbf\ +\xfc\xa2o\xbclCMw\xc2_GH\x00\x00\x02\xff\ +\xb2\xfe\x14\x05\x02\x06\x1f\x00\x13\x00)\x000@\x19\x0a\ +\x1d\x1f\x1f\x1dFY\x1f\x1f\x10\x04\x10\x17GY\x10\x16\ +\x04&GY\x04\x00\x00\x1b\x00??+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x00910\x03\x01\x12\ +\x0032\x16\x15\x14\x06\x07\x16\x16\x15\x14\x04#\x22'\ +\x03\x13\x16\x1632654&##\x13326\ +54&#\x22\x06\x07N\x01@8\x01\x15\xee\xe6\xef\ +\xc3\xa3{\x9b\xfe\xf2\xfc\xa8Zq\xb2\x1aQ+Mc\ +WK\x0e=\x1fJ`4,BJ\x18\xfe\x14\x05\xfa\ +\x01\x11\x01\x00\xbd\xb4\xa3\xd4\x0e\x12\xbc\x8a\xe7\xfe?\xfd\ +\xe9\x03@\x16\x1bkSZ[\x01\x22oT9\xf2\x01\ +\x9e\xfd\xf0k|\x1f\xfel8|\x83\x01y\x15\x04\x02\ +\x01\xa88\x8d\x02\x00\xfc5\xc4\xfe\xcd\x97\x01\x10\xec\x04\ +]\xfeZDX\x83\x00\x00\x02\x009\xff\xec\x05\x1b\x06\ +\x1f\x00\x1e\x00*\x00$@\x12%\x13\x00\x00\x19\x05\x19\ +\x1fFY\x19\x16\x05\x0cIY\x05\x00\x00?+\x00\x18\ +?+\x11\x12\x009\x113310\x01&54$\ +32\x16\x17\x03&&#\x22\x06\x15\x14\x16\x17\x16\x16\ +\x15\x14\x02\x04#\x22&54\x12\x012654&\ +'\x06\x06\x15\x14\x16\x01\xec\x82\x01\x0a\xe6\x89\xccl\x9a\ +U\x9e83:?arg\x90\xfe\xf1\xb9\xe3\xee\xdc\ +\x01\x0eLn4 \x5co3\x03\x9a}\xa3\xa7\xbe3\ +<\xfe\xec71)''PTb\xd2|\xb2\xfe\xf4\ +\x8f\xd0\xc1\xbf\x01\x12\xfd\xc0\xa5vBb\x1a-\xado\ +DL\x00\x00\x01\x00)\xff\xec\x04\x91\x04\x81\x00'\x00\ +?@\x22\x1d \x13&\x0a\x01\x07&\x01KY\x0d&\ +\x1d&\x02\x0c\x04&&\x0d\x19\x19 IY\x19\x10\x0d\ +\x07FY\x0d\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/_^]+\x11\x12\x009\x119\x12910\ +\x01#\x22\x06\x15\x14\x163267\x11\x06!\x22$\ +54675&54$32\x16\x17\x03&&\ +#\x22\x06\x15\x14\x1633\x03N\xacpxhWQ\ +\x95j\x9e\xfe\xe9\xe0\xfe\xf5\xa4\xb0\xb4\x01\x14\xf2~\xda\ +jrL\xac>VZZa\x8f\x01\xcd0./2\ +!3\xfe\xd7M\xb0\x97|\x8f\x1a\x08@\xa4\x96\xa7,\ +0\xfe\xed)+$+'%\x00\x01\x00B\xfe\x85\x04\ +\x9c\x06\x14\x00 \x00\x1f@\x0e\x11\x1c\x1c!\x17\x09\x06\ +\x07\x07\x06IY\x07\x00\x00?+\x11\x12\x009\x18/\ +\x113\x11310\x134\x00%\x06##\x13!\x07\ +\x06\x00\x06\x15\x14\x16\x17\x16\x16\x15\x14\x06\x07!65\ +4.\x02'&&B\x01&\x01\x170x\xd7?\x03\ +]/\xf1\xfe\xd6\x87Pd~\x8aYg\xfed\xc7\x15\ +.G3|w\x01\xd5\xcd\x01\xa3\xc1\x0c\x01\x1a\xd5\xb2\ +\xfe\xe9\xe3\x83;Z3A\xa3n]\xadg\xb4_\x1d\ +)%(\x1dD\xbe\x00\x00\x01\x00\x17\xfe\x14\x04\x9a\x04\ +\x81\x00\x18\x00\x1e@\x0f\x16\x1b\x0b\x0f\x08\x0f\x03GY\ +\x0f\x10\x09\x0f\x08\x15\x00???+\x11\x12\x009\x18\ +?10\x014&#\x22\x06\x07\x03!\x13!\x073\ +6632\x16\x15\x14\x07\x03!\x136\x03\x12,\x1f\ +GL&t\xfe}\xef\x015\x0c\x087\x95l\x8d\x9e\ +\x19\xe3\xfe}\xe5\x12\x02\xf8++r\xb3\xfd\xd7\x04m\ +\x9e_S\xab\x97j{\xfb\xba\x04VN\x00\x00\x03\x00\ +`\xff\xec\x04\xc1\x06+\x00\x0e\x00\x17\x00\x1f\x00&@\ +\x14\x1b\x0fIY\x1b\x1b\x04\x0c\x0c\x18IY\x0c\x01\x04\ +\x14IY\x04\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01\x10\x02\x00#\x22&54\x12\x12\ +632\x16\x01\x06\x15\x14\x163267\x03\x22\x06\ +\x07!654\x04\xc1\xb0\xfe\xd8\xd7\xd5\xddn\xb3\xfb\ +\xab\xc3\xd7\xfd&\x18+-=v*\x069j8\x01\ +\x1c\x13\x04P\xfe\xe8\xfd\xc1\xfe\xf3\xf1\xdf\xc4\x01\xe7\x01\ +-\x97\xf7\xfdQ\x9c`4&>/h\ +\x84\xb6\xc2\x1d\x5c\x15<<\x1a*Z\x8fUxM-\ +\x12\x03\x09!(\xbf\xfe^\x04\x1b5UY\x0e\x01\x16\ +\x1b\xc7\xc4\xfd\x9b\x96x\x0a\xfe\xe3$;v\xd0\xc6\x08\ +uQ\xfe\x8b\x00\xff\xff\xff\xae\xfe\x14\x04\xf2\x04m\x02\ +\x06\x00w\x00\x00\x00\x01\x00`\x00\x00\x04\xc1\x04m\x00\ +\x0d\x00\x0e\xb5\x04\x08\x0d\x15\x00\x0f\x00??991\ +0\x13!\x13\x16\x1536\x127!\x02\x00\x07!`\ +\x01{+\x04\x0au\x83%\x01\x906\xfe\xd3\xf8\xfe\x88\ +\x04m\xfd\x95(\x82\xb7\x01t\xea\xfe\xa8\xfd\xd0\xe5\x00\ +\x01\x00B\xfe\x85\x04P\x06\x14\x00.\x001@\x18\x1a\ +\x02..\x02FY..%/\x09\x13\x13/(!\ +%!JY%\x00\x0f\x00/?+\x11\x003\x113\ +\x113\x11\x129\x18/+\x11\x12\x00910\x01\x03\ +#\x22\x06\x15\x14\x16\x17\x16\x16\x15\x14\x06\x07!65\ +4&'&&54675&&5467\ +\x06##\x13!\x03#\x22\x06\x15\x14\x163\x03\x7f@\ +7\xa1\x9e=w\x97sXf\xfed\xc5[xuh\ +\x90\x8eKD\x81sdYJ@\x03R9.\xc0\xd7\ +Wk\x03\xb8\xfe\xdeGQ1E@R\x9bi\x5c\xac\ +e\xaei)M@@\xa8v\x8c\xc30\x08)hD\ +\x5c\x83\x1b\x0c\x01\x1a\xfe\xf2md@=\x00\xff\xff\x00\ +T\xff\xec\x04\x87\x04\x81\x02\x06\x00R\x00\x00\x00\x01\x00\ +N\xff\xec\x06X\x04m\x00\x19\x00!@\x11\x12\x09\x0d\ +\x0f\x0dFY\x0f\x0f\x0b\x15\x02\x17GY\x02\x16\x00?\ ++\x00\x18??+\x11\x003310%\x06#\x22\ +&547\x13#\x03!\x13#77!\x03!\x03\ +\x06\x15\x14327\x05\xa6\x84\xc8\x9e\x8f\x15V\xcd\xb4\ +\xfe|\xb5\xfa'\xc4\x05\x1f9\xfe\xfcV\x0d@Jd\ +-A\x85\x8bVX\x01\xa0\xfc\xb6\x03J\xd1R\xfe\xdd\ +\xfew<%=)\x00\x00\x02\xff\xb4\xfe\x14\x04\x91\x04\ +\x81\x00\x13\x00\x1f\x00%@\x13\x0e\x16\x16\x1a\x14\x11\x14\ +GY\x11\x10\x0c\x1b\x04\x1aGY\x04\x16\x00?+\x00\ +\x18??+\x11\x12\x009\x11310\x01\x14\x02\x06\ +#\x22&'#\x06\x06\x03!\x13>\x0232\x16\x05\ +\x22\x06\x07\x07\x16326654\x04\x91\x7f\xec\x9b\ +Vr\x19\x08\x06\x1dH\xfe}\xdf-\x8f\xe7\xab\xc7\xe9\ +\xfe-@K\x1f+\x1aG6V4\x02\xbe\xd4\xfe\xb5\ +\xb3D6P\xb2\xfe\xb0\x04:\xd8\xe8s\xf8?\x7f\x90\ +\xd1Gr\xe1M\x87\x00\x00\x01\x00T\xfe\x85\x04!\x04\ +\x81\x00#\x00\x18@\x0b\x04\x10\x10$\x19 GY\x19\ +\x10\x0b\x00/?+\x11\x003\x11310\x01\x14\x16\ +\x17\x1e\x02\x15\x14\x06\x07!6654&&'&\ +&54\x12$32\x16\x17\x03&&#\x22\x06\x06\ +\x01\xdb17\x83y6[d\xfee]g\x1eKE\ +uh\x98\x01\x14\xb2o\xabU{3lB\x1bCd\x7fY^\xadbR\x989#\ ++7%@\xa8v\xd0\x01L\xb5(,\xfe\xe5\x17%\ +X\xaf\x00\x00\x02\x00T\xff\xec\x05q\x04m\x00\x0e\x00\ +\x19\x00\x1c@\x0e\x0d\x0f\x0a\x0fFY\x0a\x0f\x04\x15F\ +Y\x04\x16\x00?+\x00\x18?+\x11\x00310\x01\ +\x14\x02\x04#\x22&5\x10\x00!!\x03!\x16%\x22\ +\x06\x15\x14\x1632654\x04\x81\x9e\xfe\xf0\xb0\xdb\ +\xf4\x01\x82\x01_\x02\x02\x02\x17\xda\xe9\x01N\xf1\xb8<;^.\ +\xf1\xcd\xda\xf2\xb3\xfe\xb2\xdc`\xfe\x8b\x03+-)K\ +\x1d\x5cV\x7fE\x10!\x01\x09\xd2\x01\x87\x01\x0c\xe3\xad\ +\xfbWx\x13\x01\xc5\xdd\xcd\xf5\xda\xcc\xfe\xc4\xb2\x08\xfe\ +$\x04\xb9FK\x8b\xfe?\x12}\xc0\x00\x01\xfe\xd1\xfe\ +\x14\x05-\x04\x81\x00 \x00-@\x17\x17\x14\x07\x04\x14\ +\x04\x10\x05\x10\x0bGY\x10\x16\x1b\x05\x0f\x00\x1bGY\ +\x00\x10\x00?+\x00\x18??3+\x11\x12\x0099\ +\x113\x11310\x012\x16\x17\x17\x13!\x01\x13\x16\ +\x16327\x11\x06#\x22&''\x01!\x01\x03&\ +&#\x22\x07\x0366\x01F\x8f\x94\x1e\x11\xdf\x01\xb6\ +\xfd\xc9I\x08+(1Cv\x81\x8e\x8b\x1b\x1c\xfe\xc0\ +\xfeJ\x02\x975\x0c/-\x1d/=.\x99\x04\x81\x8b\ +\xa2X\x01q\xfc\xf3\xfeF1)\x10\xfe\xdd%\x92\xac\ +\xc7\xfd\xfb\x03\xa0\x01\x1bA:\x0f\x01\x17\x15\x1a\x00\x00\ +\x01\x00`\xfe\x14\x06\xac\x06\x14\x00\x1e\x00 @\x10\x1d\ +\x00\x05\x15\x0f\x00\x1c\x0f\x1cGY\x0c\x0f\x16\x0e\x1b\x00\ +??3+\x11\x003\x18?3?10\x016\x12\ +\x114'!\x16\x15\x10\x02\x04\x05\x03!\x13&&5\ +47\x13!\x03\x06\x15\x14\x16\x17\x01!\x03\xf4\xa5\x92\ +\x08\x01\x81\x08\x9e\xfe\xb0\xfe\xf6`\xfe\x8b`\xeb\xf4\x13\ +\x85\x01\x81\x87\x0bTD\x01\x0a\x01u\x01#\x1c\x01J\ +\x01J*p]5\xfe\x89\xfec\xcc\x0f\xfe(\x01\xd8\ +\x14\xbc\x9cIQ\x02{\xfd\x7f12-6\x03\x04\xf1\ +\x00\x00\x01\x00B\xff\xec\x06\xa2\x04m\x00'\x00\x22@\ +\x10\x13\x13\x1f\x08\x0f\x00\x03\x1a\x0f\x03\x0fFY%\x03\ +\x16\x00?3+\x11\x003\x129\x18?39/1\ +0%\x06\x06#\x22&5\x10\x13!\x06\x02\x15\x14\x16\ +3267\x13!\x03\x06\x15\x14\x1632\x1254\ +'!\x16\x15\x10\x00!\x22&\x03+B\xb3\x84\xb1\xbf\ +\xf5\x01\x8ev\x8c+-0=\x1e=\x01y?\x17!\ +'`s\x1f\x01\x8d\x13\xfe\xd6\xfe\xe4\x89\x92\xb2j\x5c\ +\xd7\xd0\x01F\x01\x94\xa8\xfey\x9aO8\x0b\x0a\x0a\x02\x1f2\ +*\xfd\x85\x04s\x01C\xfe\xbd\xb5\xa8\x8d\xb2\xfe\xa7\x92\ +\x1c\x17\x01%!9>5,\xff\xff\x00!\x00\x00\x05\ +\x13\x07s\x02&\x01a\x00\x00\x01\x07\x00v\x00}\x01\ +R\x00\x08\xb3\x01\x0e\x05&\x00+5\x00\x01\x00h\xff\ +\xec\x05T\x05\xcd\x00\x1d\x00&@\x14\x03\x06OY\x03\ +\x03\x10\x17\x17\x00NY\x17\x04\x10\x0aNY\x10\x13\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +\x22\x06\x07!\x03!\x15\x14\x163267\x11\x06#\ + \x00\x11\x10\x12$32\x16\x17\x03&&\x03qd\ +\xa55\x01\xd9C\xfe+e]S\x9d\x97\xcb\xed\xfe\xfc\ +\xfe\xe7\xcb\x01]\xe1\x92\xeag\x96]\x9c\x04\x87\x86\x80\ +\xfe\xc9!w\x83$6\xfe\xbdZ\x01)\x01\x10\x01\x0a\ +\x01\xbc\xe2;>\xfe\xc577\xff\xff\x00+\xff\xec\x04\ +w\x05\xcb\x02\x06\x006\x00\x00\xff\xff\xff\xb6\x00\x00\x03\ +\xd9\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\xff\xb6\x00\x00\x04\ +:\x07u\x02&\x00,\x00\x00\x01\x07\x00j\xff\x92\x01\ +R\x00\x0a\xb4\x02\x01\x1c\x05&\x00+55\xff\xff\xfe\ +\xb8\xfe3\x03\x04\x05\xb6\x02\x06\x00-\x00\x00\x00\x02\xff\ +\xa4\xff\xec\x07N\x05\xb6\x00\x1d\x00&\x000@\x1a\x1a\ +&PY\x1a\x1a\x04\x18\x18\x06OY\x18\x03\x0c\x12O\ +Y\x0c\x13\x04\x1ePY\x04\x12\x00?+\x00\x18?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x01\x14\x00\ +!!\x13#\x02\x07\x0e\x02#\x22'\x11\x16\x1632\ +667\x12\x13!\x0332\x04\x0132654\ +&##\x07N\xfe\xc9\xfe\xe3\xfd\xfc\xf3\xc2\xa25H\ +\x8b\xb3\x8bQJ-&\x135>@\x22f\xb1\x03\xba\ +q\x1d\xec\x01\x06\xfdsMX_I:D\x01\xf8\xec\ +\xfe\xf4\x04\x7f\xfd\xac}\xb2\xbcT\x1a\x011\x0f\x05,\ +cV\x01\x01\x02\xad\xfd\xe2\xdf\xfex_S;H\x00\ +\x02\x00!\x00\x00\x07N\x05\xb6\x00\x12\x00\x1b\x00,@\ +\x18\x0f\x1bPY\x0f\x0b\x0b\x06NY\x0b\x0b\x04\x0d\x09\ +\x03\x08\x12\x04\x13PY\x04\x12\x00?+\x00\x18??\ +3\x129/+\x11\x003+10\x01\x14\x00!!\ +\x13!\x03!\x01!\x03!\x13!\x0332\x04\x013\ +2654&##\x07N\xfe\xc9\xfe\xe3\xfd\xfc}\ +\xfe\xb4\x7f\xfey\x015\x01\x87p\x01Ks\x01\x85q\ +\x1d\xec\x01\x06\xfdsMX_I:D\x01\xf8\xec\xfe\ +\xf4\x02T\xfd\xac\x05\xb6\xfd\xe2\x02\x1e\xfd\xe2\xdf\xfex\ +_S;H\x00\x00\x01\x00\x9c\x00\x00\x05\x8f\x05\xb6\x00\ +\x17\x00\x22@\x12\x17\x13\x14\x13NY\x00\x0fNY\x00\ +\x00\x11\x14\x03\x08\x11\x12\x00?3?\x129/++\ +\x11\x00310\x0132\x16\x15\x14\x07\x03!\x136\ +54&##\x03!\x13!\x13!\x03!\x039\xd3\ +\xba\xc9\x18N\xfey^\x0a40\xb0\x83\xfey\xed\xfe\ +\xc3E\x04\x04G\xfe\xc2\x03\xbe\xba\xaeA\x82\xfem\x01\ +\xcf,$2*\xfd\x85\x04s\x01C\xfe\xbd\xff\xff\x00\ +!\x00\x00\x05\xcb\x07s\x02&\x01\xb4\x00\x00\x01\x07\x00\ +v\x00\xee\x01R\x00\x08\xb3\x01\x13\x05&\x00+5\xff\ +\xff\x00D\xff\xec\x05\xb4\x07\xa8\x02&\x01\xbd\x00\x00\x01\ +\x07\x026\x00/\x01R\x00\x08\xb3\x01\x16\x05&\x00+\ +5\x00\x01\x00!\xfe7\x05\xc1\x05\xb6\x00\x0b\x00\x1a@\ +\x0d\x07\x0b\x0b\x02NY\x0b\x12\x09#\x04\x00\x03\x00?\ +2??+\x11\x00310\x01!\x03!\x13!\x01\ +!\x03!\x13!\x01V\x01\x87\xed\x01Z\xef\x01\x88\xfe\ +\xca\xfe\x87`\xfe\x83e\xfe\x87\x05\xb6\xfb\x8e\x04r\xfa\ +J\xfe7\x01\xc9\xff\xff\xff\x87\x00\x00\x04\xe1\x05\xb6\x02\ +\x06\x00$\x00\x00\x00\x02\x00!\x00\x00\x04\xb4\x05\xb6\x00\ +\x0c\x00\x15\x00&@\x14\x03\x15PY\x03\x03\x0b\x0c\x0c\ +\x02OY\x0c\x03\x0b\x0dPY\x0b\x12\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+10\x01\x03!\x073\ +2\x04\x15\x14\x00!!\x01\x1332654&#\ +#\x04\xb4C\xfe'.\x1d\xec\x01\x06\xfe\xc9\xfe\xe3\xfd\ +\xfc\x013\x98MX_I:D\x05\xb6\xfe\xc1\xdf\xdf\ +\xc1\xec\xfe\xf4\x05\xb6\xfb{_S;H\x00\xff\xff\x00\ +!\x00\x00\x04\xf6\x05\xb6\x02\x06\x00%\x00\x00\xff\xff\x00\ +!\x00\x00\x04\xb4\x05\xb6\x02\x06\x01a\x00\x00\x00\x02\xff\ +)\xfe7\x05\xfe\x05\xb6\x00\x0d\x00\x12\x00\x22@\x12\x09\ +\x0fNY\x09\x03\x00\x04#\x11\x0b\x05\x02\x05NY\x02\ +\x12\x00?+\x11\x0033\x18?3?+10\x01\ +\x13!\x03!\x1336\x00\x13!\x033\x03\x01#\x02\ +\x03!\x03\xdbb\xfc\xcbb\xfe\x83\xa2\xb2\x97\x01\x0fT\ +\x03\x83\xf2\xf6\xa6\xfe\xd9\xaa\x87\xd5\x01V\xfe7\x01\xc9\ +\xfe7\x03\x0d\xe9\x02`\x01)\xfb\x8e\xfc\xf3\x06<\xfe\ +N\xfe\x83\xff\xff\x00!\x00\x00\x04\xba\x05\xb6\x02\x06\x00\ +(\x00\x00\x00\x01\xff}\x00\x00\x08\x0e\x05\xb6\x00\x11\x00\ +\x1e@\x10\x0f\x00\x09\x06\x0a\x07\x06\x00\x0e\x11\x06\x02\x04\ +\x03\x02\x12\x00??\x12\x179\x113\x11310\x01\ +\x01!\x01\x03!\x13\x13!\x03\x01!\x01\x13!\x03\x03\ +!\x03\x04\xfe7\xfeB\x02\x10\xc8\x01\x99\xb2\x90\x01\x81\ +\x92\x01\xcb\x01\xb4\xfd\xf8\xdf\xfeR\xb4\x97\xfe~\x02\xcf\ +\xfd1\x02\xf8\x02\xbe\xfdT\x02\xac\xfdT\x02\xac\xfd+\ +\xfd\x1f\x02\xcf\xfd1\x00\x00\x01\x00\x19\xff\xec\x04\xcf\x05\ +\xcb\x00(\x00-@\x17\x03\x18\x19\x19\x18OY\x19\x19\ +\x0a&& OY&\x04\x0a\x11OY\x0a\x13\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04!\x22&'\ +\x11\x16\x1632654&##\x133265\ +4&#\x22\x07\x036$32\x16\x04\xcf\xcb\xae|\ +\x88\xfe\xc0\xfe\xcd\x9a\xf5?K\xdct\x9c\x7fx\x82y\ +D\x83\x8d\x87IR\x9b\xb1\x8d\x8c\x01\x13\x9c\xd2\xff\x04\ +m\x9a\xc1\x0e\x08\x1c\xa4{\xe7\xee*%\x01F*4\ +W[HC\x018DI.@|\x01\x14VJ\xbf\ +\x00\x00\x01\x00!\x00\x00\x06f\x05\xb6\x00\x0f\x00\x12@\ +\x09\x06\x0d\x04\x09\x04\x0f\x12\x00\x03\x00??\x1791\ +0\x01!\x03\x06\x073\x01!\x01!\x1367#\x01\ +!\x01V\x01d\x83\x1a@\x08\x02\x98\x01\xe9\xfe\xcb\xfe\ +\x9c\x7f <\x08\xfdj\xfe\x17\x05\xb6\xfd\x9c\x81\xe3\x03\ +\xc8\xfaJ\x02^\xa4\xdb\xfc#\xff\xff\x00!\x00\x00\x06\ +f\x07\xa8\x02&\x01\xb2\x00\x00\x01\x07\x026\x00\xcd\x01\ +R\x00\x08\xb3\x01\x10\x05&\x00+5\x00\x01\x00!\x00\ +\x00\x05\xcb\x05\xb6\x00\x0a\x00\x14@\x0a\x08\x07\x02\x01\x04\ +\x04\x05\x03\x04\x12\x00??\x12\x17910!!\x03\ +\x03!\x01!\x03\x01!\x01\x04\xa2\xfeR\xb5\x97\xfey\ +\x015\x01\x87\x91\x01\xcb\x01\xb4\xfd\xf8\x02\xcf\xfd1\x05\ +\xb6\xfdT\x02\xac\xfd+\x00\x01\xff\xa4\xff\xec\x05\xb6\x05\ +\xb6\x00\x16\x00\x1a@\x0e\x14\x02OY\x14\x03\x08\x0eO\ +Y\x08\x13\x00\x12\x00??+\x00\x18?+10!\ +\x13#\x02\x07\x0e\x02#\x22'\x11\x16\x163266\ +7\x12\x13!\x01\x02\xfe\xf0\xc7\xa25H\x8b\xb3\x8bQ\ +J-&\x135>@\x22f\xb1\x03\xc0\xfe\xcf\x04\x7f\ +\xfd\xac}\xb2\xbcT\x1a\x011\x0f\x05,cV\x01\x01\ +\x02\xad\xfaJ\x00\xff\xff\x00!\x00\x00\x07P\x05\xb6\x02\ +\x06\x000\x00\x00\xff\xff\x00!\x00\x00\x05\xc1\x05\xb6\x02\ +\x06\x00+\x00\x00\xff\xff\x00h\xff\xec\x05\xa6\x05\xcd\x02\ +\x06\x002\x00\x00\xff\xff\x00!\x00\x00\x05\xc1\x05\xb6\x02\ +\x06\x01n\x00\x00\xff\xff\x00!\x00\x00\x04\xe3\x05\xb6\x02\ +\x06\x003\x00\x00\xff\xff\x00h\xff\xec\x05R\x05\xcd\x02\ +\x06\x00&\x00\x00\xff\xff\x00\x9c\x00\x00\x04\xe5\x05\xb6\x02\ +\x06\x007\x00\x00\x00\x01\x00D\xff\xec\x05\xb4\x05\xb6\x00\ +\x15\x00\x1c@\x0d\x00\x11\x11\x04\x09\x12\x03\x09\x0eOY\ +\x09\x13\x00?+\x00\x18?\x1299\x11310\x01\ +367\x13!\x01\x06\x06#\x22'\x11\x16326\ +7\x01!\x13\x16\x02\xba\x09\x16-\xfe\x01\xb0\xfd\x83n\ +\xf2\xbeepcISS(\xfe\xe8\x01\x8fm\x0a\x02\ +\xf4=g\x02\x1e\xfb\x94\xc4\x9a\x1c\x013\x180Q\x04\ +\x12\xfd\xe80\x00\xff\xff\x00\x5c\xff\xec\x06\x8f\x05\xcb\x02\ +\x06\x01s\x00\x00\xff\xff\xff\x83\x00\x00\x05\xe7\x05\xb6\x02\ +\x06\x00;\x00\x00\x00\x01\x00!\xfe7\x05\xc1\x05\xb6\x00\ +\x0b\x00\x1b@\x0d\x0a\x06\x03\x00\x08\x05\x08NY\x05\x12\ +\x03#\x00??+\x11\x003\x18?310\x013\ +\x03!\x13!\x01!\x03!\x13!\x04\xcb\xf6\xa4\xfe\x83\ +d\xfc\x1d\x015\x01\x87\xf1\x01\x5c\xf1\x01\x88\x011\xfd\ +\x06\x01\xc9\x05\xb6\xfb\x8e\x04r\x00\x01\x00\x93\x00\x00\x05\ +\x9c\x05\xb6\x00\x16\x00\x16@\x0b\x03\x10NY\x03\x03\x14\ +\x09\x03\x00\x12\x00??39/+10!\x13\x06\ +#\x22&547\x13!\x03\x06\x15\x14\x16326\ +7\x13!\x01\x02\xe3s\x98\xc2\xad\xbc\x0dh\x01\x89b\ +\x0aK<6{6\x81\x01\x88\xfe\xce\x02\x17T\xb5\xa7\ +1J\x02\x1c\xfe\x17. ;>& \x02j\xfaJ\ +\x00\x00\x01\x00!\x00\x00\x08\x14\x05\xb6\x00\x0b\x00\x1a@\ +\x0c\x09\x05\x01\x03\x07\x03\x00\x03NY\x00\x12\x00?+\ +\x11\x003\x18?33103\x01!\x03!\x13!\ +\x03!\x13!\x01!\x01/\x01\x87\xeb\x01\x1a\xec\x01\x81\ +\xec\x01\x1b\xeb\x01\x87\xfe\xd1\x05\xb6\xfb\x8e\x04r\xfb\x8e\ +\x04r\xfaJ\x00\x00\x01\x00!\xfe7\x08\x1b\x05\xb6\x00\ +\x0f\x00\x1f@\x0f\x0f#\x0a\x06\x02\x03\x0c\x08\x04\x01\x04\ +NY\x01\x12\x00?+\x11\x0033\x18?33?\ +10!!\x01!\x03!\x13!\x03!\x13!\x033\ +\x03!\x06^\xf9\xc3\x01/\x01\x87\xeb\x01\x1a\xec\x01\x81\ +\xec\x01\x1b\xeb\x01\x87\xef\xf6\xa4\xfe\x83\x05\xb6\xfb\x8e\x04\ +r\xfb\x8e\x04r\xfb{\xfd\x06\x00\x02\x00\x9c\x00\x00\x05\ +?\x05\xb6\x00\x08\x00\x15\x00&@\x14\x09\x08PY\x09\ +\x09\x11\x14\x14\x13NY\x14\x03\x11\x00PY\x11\x12\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +32654&##\x1332\x04\x15\x14\x00!\ +!\x13!\x13!\x02\xb2NX^I:CA\x1d\xec\ +\x01\x05\xfe\xc8\xfe\xe5\xfd\xfb\xf2\xfe\xc3E\x02\xc1\x011\ +_S;H\x012\xde\xc2\xee\xfe\xf6\x04s\x01C\x00\ +\x03\x00!\x00\x00\x07\x96\x05\xb6\x00\x0a\x00\x13\x00\x17\x00\ +#@\x12\x07\x13PY\x07\x07\x04\x15\x05\x03\x14\x04\x04\ +\x0bPY\x04\x12\x00?+\x11\x003\x18?3\x129\ +/+10\x01\x14\x00!!\x01!\x0332\x04\x01\ +32654&##\x01\x01!\x01\x04y\xfe\xc9\ +\xfe\xe3\xfd\xfc\x013\x01\x87q\x1d\xec\x01\x06\xfdsM\ +X_I:D\x02\xb0\x015\x01\x88\xfe\xca\x01\xf8\xec\ +\xfe\xf4\x05\xb6\xfd\xe2\xdf\xfex_S;H\xfd\x9a\x05\ +\xb6\xfaJ\x00\x02\x00!\x00\x00\x04y\x05\xb6\x00\x0a\x00\ +\x13\x00\x1d@\x0f\x07\x13PY\x07\x07\x04\x05\x03\x04\x0b\ +PY\x04\x12\x00?+\x00\x18?\x129/+10\ +\x01\x14\x00!!\x01!\x0332\x04\x013265\ +4&##\x04y\xfe\xc9\xfe\xe3\xfd\xfc\x015\x01\x85\ +q\x1d\xec\x01\x06\xfdsMX_I:D\x01\xf8\xec\ +\xfe\xf4\x05\xb6\xfd\xe2\xdf\xfex_S;H\x00\x01\x00\ +\x1f\xff\xec\x04\xcb\x05\xcd\x00\x1d\x003@\x1a\x0c\x05\x0a\ +\x1b\x04\x00\x05\x04OY\x05\x05\x18\x10\x18\x00NY\x18\ +\x13\x10\x0aNY\x10\x04\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x009\x11\x12910\x012\ +67!\x13!54&#\x22\x07\x036$3 \ +\x00\x11\x14\x02\x06\x04#\x22'\x11\x16\x16\x01\x87\x8a\xc8\ +3\xfe\x1bC\x01\xdchv\x99\x9ahZ\x01\x0a}\x01\ +\x06\x01\x17}\xd0\xfe\xdb\xb1\xf5\x94L\xc6\x01/\x94\x87\ +\x017\x10\x84rX\x019,9\xfe\xda\xfe\xef\xb8\xfe\ +\x94\xfd\x89V\x01G*0\x00\x00\x02\x00!\xff\xec\x08\ +^\x05\xcd\x00\x14\x00!\x002@\x1b\x11\x0cNY\x11\ +\x11\x0e\x0f\x03\x0e\x12\x13\x09\x00\x07\x07\x1eNY\x07\x13\ +\x00\x18NY\x00\x04\x00?+\x00\x18?+\x11\x12\x00\ +99\x18??\x129/+10\x01 \x00\x11\x10\ +\x02\x04# \x00\x115#\x03!\x01!\x033\x12\x00\ +\x014&#\x22\x06\x02\x15\x14326\x12\x069\x01\ +\x06\x01\x1f\xc7\xfe\xa1\xe6\xfe\xf4\xfe\xdb\xfa\x7f\xfey\x01\ +5\x01\x87p\xefZ\x01\x80\x01\x9d_[d\xa7b\xc9\ +^\xa3]\x05\xcd\xfe\xd6\xfe\xf7\xfe\xf6\xfeG\xeb\x01(\ +\x01\x0b5\xfd\xac\x05\xb6\xfd\xe2\x01\x0e\x01'\xfd\xc9r\ +\x81\xa8\xfe\xd8\x98\xf2\xa6\x01\x1b\x00\x02\xffu\x00\x00\x05\ +=\x05\xb6\x00\x0d\x00\x16\x00(@\x14\x03\x09\x00\x15\x00\ +QY\x15\x15\x02\x09\x09\x0fPY\x09\x03\x0c\x02\x12\x00\ +?3?+\x11\x12\x009\x18/+\x11\x12\x0091\ +0\x01\x01!\x01&&54\x00!!\x01!\x13\x13\ +#\x22\x06\x15\x14\x1633\x02\xac\xfe\x9c\xfe-\x01\xf8\ +IA\x015\x01\x11\x02\x14\xfe\xc9\xfeys\x85\x5cM\ +dM;=\x02\x14\xfd\xec\x02\x8f=\x97f\xe2\x01\x0b\ +\xfaJ\x02\x14\x02wiSME\x00\xff\xff\x00T\xff\ +\xec\x04\xc5\x04\x81\x02\x06\x00D\x00\x00\x00\x02\x00V\xff\ +\xec\x05\x14\x06!\x00\x19\x00(\x001@\x19\x16\x04\x04\ +\x0a\x01\x0a!IY\x0a\x0a\x11\x00\x11\x1aGY\x11\x16\ +\x00\x01GY\x00\x01\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x009\x11310\x01\x13\x07\x04\ +\x06\x06\x0736632\x16\x15\x14\x02\x04#\x22\x02\ +54\x12\x0076\x0126654&#\x22\x06\ +\x07\x06\x06\x15\x14\x04\xee&f\xfe\xd7\xd9x\x1b\x083\ +\x94Z\x99\x9e\xa1\xfe\xec\xb2\xd4\xe8\xaf\x01O\xf8\x98\xfe\ +I/\x5c:\x1f+\x22b0\x07\x10\x06!\xfe\xb8\x0a\ +\x1eA}lGS\xcf\xbf\xbc\xfe\xbf\xaa\x01\x0c\xfa\xd7\ +\x01\xee\x01\x15&\x17\xfb\x1ah\xb0]4:J?\x19\ +_(\xba\x00\x03\x00T\xff\xec\x04\x8d\x04\x81\x00\x13\x00\ +\x1d\x00&\x00-@\x17\x06&\x14&\x14LY&&\ +\x0d\x00\x0d\x18JY\x0d\x16\x00#JY\x00\x10\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x012\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04!\ +\x22$54\x12$\x03\x06\x15\x1432654#\ +7254&#\x22\x06\x07\x02\xdd\xc6\xeau\x85X\ +c\xfe\xf9\xfe\xf0\xe3\xff\x00\xa7\x01&H\x04{3B\ +{9\x89' 9Y#\x04\x81\xab\x90c\x85#\x08\ +\x12zS\xac\xbc\xed\xd7\xd0\x01P\xb1\xfdZ$\x1f\xa6\ +59{\xfa^\x22&J\x5c\x00\x01\x00\x19\xff\xec\x03\ +\xdf\x04\x81\x00%\x00(@\x14\x06!\x1a\x0d!\x0d#\ +\x10\x17\x10IY\x17\x16\x03#JY\x03\x10\x00?+\ +\x00\x18?+\x11\x12\x0099\x113\x11310\x13\ +6632\x16\x15\x14\x06\x06\x07\x06\x06\x15\x14\x163\ +267\x11\x06\x06#\x22&5467>\x025\ +4#\x22\x07\xa8Q\xdbk\xc4\xdcQ\xbb\xb8T#+\ +;:\xbaZ\x5c\xcb\x81\xc5\xd2\xc1\xd6BJ\x1eXn\ +\x90\x04#-1\xa7\x96v\x97r:\x1a\x1e\x1a\x17\x1a\ +2*\xfe\xe4/-\xb3\xa5\x90\xb9>\x12\x22\x22!7\ +N\x00\x02\x00T\xff\xec\x04\xc7\x06)\x00\x1c\x00'\x00\ +-@\x17\x0e\x0b\x22\x0b\x22FY\x0b\x0b\x04\x1a\x1a\x14\ +GY\x1a\x01\x04\x1dGY\x04\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x00910\x01\x10\ +\x02\x04#\x22&54\x12632\x16\x17375\ +4&#\x22\x07\x03663 \x00\x01267&\ +#\x22\x06\x15\x14\x16\x04\xc7\xa5\xfe\xd6\xd3\xe0\xf1u\xd3\ +\x85V\x94*\x08\x02r\x8bYlLi\xa5a\x01\x0e\ +\x01\x19\xfd\x85Hj\x1d2ZMi>\x03\x9c\xfe\xd6\ +\xfeO\xd5\xe7\xd3\xb6\x01 \x9fbU$\x1e\xb4\x98+\ +\x01'!\x1a\xfe\xb7\xfcC\xba\xb2i\xbf\x95;F\xff\ +\xff\x00T\xff\xec\x04u\x04\x81\x02\x06\x00H\x00\x00\x00\ +\x01\xff\xe7\xff\xec\x08j\x04\x81\x003\x00=@ \x17\ +,',GY\x1c'\x16 $\x05$JY\x09\x05\ +\x05\x07\x22\x15\x07\x0f\x121\x021GY\x0d\x02\x10\x00\ +?3+\x11\x003\x18??\x129/3+\x11\x00\ +3\x18?3+\x11\x00310\x13632\x16\x17\ +3\x13!\x0336$32\x17\x03&#\x22\x06\x15\ +\x14327\x11\x06#\x22&5#\x03!\x13#\x06\ +\x04#\x22'\x13\x1632654#\x22\x07\x85K\ +t\xc9\xd1\x03\xa8^\x01u^\x959\x01,\xcfMV\ +E3\x19g\x84b2KLs\xcd\xd0\xac_\xfe\x8c\ +^\x8f:\xfe\xd5\xd1KYF3\x19f\x85b2K\ +\x04^#\xe7\xdc\x01\xaf\xfeQ\xd1\xf2\x0e\xfe\xd3\x08\xeb\ +\xad\x93\x1f\xfe\xcc\x22\xeb\xe1\xfeH\x01\xb8\xd6\xf6\x0e\x01\ +-\x08\xe8\xaf\x94\x1f\x00\x00\x01\x00!\xff\xec\x04^\x04\ +\x81\x00&\x00-@\x17\x12&%&%LY&&\ +\x19\x0c\x19\x1fFY\x19\x16\x0c\x06IY\x0c\x10\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x012654&#\x22\x06\x07\x03632\ +\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04!\x22&'\x11\ +\x163254&##7\x02\x06tc8CI\ +\xc3RT\xfb\xef\xe0\xe4y\x83^]\xfe\xca\xfe\xe4\x8d\ +\xd9D\xc5\xca\xe3ig\x8c6\x02\xc7**)\x22,\ +&\x01\x17V\x93\x8ef\x84(\x08\x19vQ\xb6\xc40\ +&\x01&Z_7-\xf6\x00\xff\xff\x00`\xff\xec\x04\ +\xe3\x04m\x02\x06\x00X\x00\x00\xff\xff\x00`\xff\xec\x05\ +\x1f\x06V\x02&\x00X\x00\x00\x01\x06\x026\xea\x00\x00\ +\x08\xb3\x01\x19\x11&\x00+5\x00\x01\x00\x17\x00\x00\x05\ +X\x04m\x00\x0a\x00\x14@\x0a\x00\x0a\x05\x04\x04\x07\x08\ +\x0f\x07\x15\x00??\x12\x17910\x01!\x01\x13!\ +\x03\x03!\x13!\x03\x03\xa0\x01\xb8\xfeD\xe3\xfeX\xcd\ +p\xfe}\xeb\x01\x83l\x04m\xfd\xc6\xfd\xcd\x02\x1f\xfd\ +\xe1\x04m\xfd\xf7\x00\x01\xff\xdb\xff\xec\x051\x04\x81\x00\ +\x1c\x00\x1a@\x0e\x19\x04FY\x19\x10\x0c\x11GY\x0c\ +\x16\x01\x15\x00??+\x00\x18?+10!!\x13\ +&#\x22\x06\x06\x07\x0e\x02#\x22'\x11\x16326\ +7>\x0332\x16\x17\x04T\xfe}\xb2\x1b\x1cIV\ +O1\xa1m\x8d\x9e\x19\x7f\x01\x83\x81\ +\x13-\x1f;a\x1dt\x01\x83\x91\x0eG\x1e,\xfe`\ +\x01\xbf(wjh\xab\x96j{\x02[\xfd\x97R;\ +,*\x9d\x88\x02'\xfdQC\x1d=\x0c\x00\x00\x01\x00\ +\x8b\x00\x00\x04\xc7\x04m\x00\x17\x00\x18@\x0c\x0d\x03G\ +Y\x0d\x0d\x09\x06\x14\x0f\x09\x15\x00??3\x129/\ ++10\x01\x14\x1632\x137!\x03!\x13#\x06\ +#\x22&&547\x13!\x03\x06\x02\x12-\x1fy\ +@-\x01\x83\xf0\xfe}V\x0ao\xa2Mw@\x197\ +\x01\x839\x13\x02\xc7,*\x01%\xd7\xfb\x93\x01\x9ca\ +N\x88O\x87{\x01\x0b\xfe\xe7R\x00\x00\x01\x00`\xff\ +\xec\x07R\x04m\x00)\x00'@\x14\x0d\x15\x09)\x15\ +\x03\x0c\x1e\x0f\x05%\x18%GY\x11\x18\x15\x0c\x15\x00\ +??3+\x11\x003\x18?\x12\x179\x11310\ +\x01\x03\x06\x15\x143267\x13!\x03!7#\x06\ +\x06#\x22&'#\x06\x06#\x22&547\x13!\ +\x03\x06\x15\x14\x163267\x13\x04\xe3\x83\x0eHC\ +Z!w\x01\x83\xf0\xfe\xcb\x10\x08;\x95wu\x80\x1a\ +\x08A\xa8o\x8c\x93\x17}\x01\x83\x81\x0f& J\x5c\ +\x1fn\x04m\xfd\x89T%^\x8f\x98\x02'\xfb\x93\xba\ +majdjd\xa8\xa5_n\x02g\xfd\x89\x0332\x16\x17\x03\x22\x07\x06\x15\x14\x16326\ +54&\x04\xd5G_\xb4\xd7\xfe\xe7\xfe\xe2\xd6\xeb\x1b\ +N+IVO1<\x01\xa0\ +\x01\x12\xfe\xee\x00\xff\xff\x00!\x01\xa0\x07\x98\x02\xb2\x02\ +\x06\x02\x03\x00\x00\x00\x02\xff3\xfe1\x033\xff\xd3\x00\ +\x03\x00\x07\x00\x11\xb6\x06\x05\x05\x08\x02\x01#\x00?3\ +\x129/310\x01!7!7!7!\x02\xd5\ +\xfc^'\x03\xa2\x10\xfc^'\x03\xa2\xfe1\xa4Z\xa4\ +\x00\x00\x01\x00m\x03\xc1\x02\x8f\x05\xb6\x00\x07\x00\x09\xb2\ +\x00\x03\x03\x00?\xcd10\x13'67!\x06\x06\x03\ +w\x0ah\x9a\x01 \x1a6l\x03\xc1\x16\xeb\xf4>\x8a\ +\xfe\xd3\x00\x00\x01\x00^\x03\xc1\x02\x7f\x05\xb6\x00\x07\x00\ +\x09\xb2\x04\x07\x03\x00?\xc610\x01\x17\x06\x03!6\ +67\x02w\x08\x5c\xa4\xfe\xdf\x22CX\x05\xb6\x16\xd4\ +\xfe\xf5Q\xad\xf7\x00\x01\xff\x98\xfe\xf8\x01\xb8\x00\xee\x00\ +\x07\x00\x08\xb1\x04\x00\x00/\xc510%\x17\x06\x03!\ +66\x13\x01\xb0\x08^\xa2\xfe\xe0\x192q\xee\x17\xdf\ +\xff\x00;\x80\x01;\x00\x00\x01\x00\xbe\x03\xc1\x02;\x05\ +\xb6\x00\x07\x00\x09\xb2\x03\x07\x03\x00?\xcd10\x01\x10\ +\x17!&\x02'7\x02#\x18\xfe\xe6\x1e:\x0b\x0f\x05\ +\xb6\xfe\xfb\xf0e\x01\x0ap\x16\x00\x02\x00m\x03\xc1\x04\ +\x7f\x05\xb6\x00\x07\x00\x0f\x00\x0d\xb4\x00\x08\x04\x0b\x03\x00\ +?3\xcd210\x01'67!\x06\x07\x07!'\ +67!\x06\x06\x03\x02f\x08m\x93\x01!13X\ +\xfc\xb4\x0ah\x9a\x01 \x1a6l\x03\xc1\x16\xf6\xe9s\ +\x8f\xf3\x16\xeb\xf4>\x8a\xfe\xd3\x00\x02\x00^\x03\xc1\x04\ +o\x05\xb6\x00\x07\x00\x10\x00\x0d\xb4\x0d\x04\x10\x07\x03\x00\ +?3\xc6210\x01\x17\x06\x03!677!\x17\ +\x06\x02\x07!677\x02w\x08\x5c\xa4\xfe\xdf13\ +Y\x03M\x07'\x8eI\xfe\xdf):Y\x05\xb6\x16\xd4\ +\xfe\xf5u\x8d\xf3\x16[\xfe\xf2vb\xa0\xf3\x00\x02\xff\ +\x98\xfe\xf8\x03\xae\x00\xee\x00\x07\x00\x10\x00\x0c\xb3\x0d\x04\ +\x10\x00\x00/2\xcd210%\x17\x06\x03!66\ +\x13!\x17\x06\x02\x07!677\x01\xb0\x08^\xa2\xfe\ +\xe0\x192q\x03R\x083\x93<\xfe\xe1=V*\xee\ +\x17\xdf\xff\x00;\x80\x01;\x17t\xfe\xf2]\x94\xefs\ +\x00\x00\x01\x00\xb6\x00\x00\x04B\x06\x14\x00\x0e\x00\x19@\ +\x0b\x01\x04\x04\x0b\x08\x08\x03\x09\x00\x03\x12\x00??\x12\ +9/33\x11310\x01%\x03!\x13\x07\x07\x13\ +\x05\x13!\x03767\x04\x02\xfe\xcb\x8e\xfe\xb3\xf5u\ +\xbc>\x01) \x01N\x8dJ\xb5E\x03s\x1e\xfco\ +\x03\x8d\x0a\x10\x01\x1e\x1a\x01\x9d\xfec\x06\x0c\x08\x00\x00\ +\x01\x00/\x00\x00\x04F\x06\x14\x00\x1c\x00)@\x13\x06\ +\x0a\x0a\x00\x0e\x1b\x10\x10\x17\x13\x0e\x13\x0e\x13\x09\x15\x00\ +\x09\x12\x00??\x1299//\x1133\x113\x11\ +33\x11310\x016767\x03%\x07\x07!\ +\x13\x07\x07\x13\x05'7\x05\x13\x0577!\x0377\ +\x03%\x17\x02\x87k74l<\xfe\xc9\x0c\x0f\xfe\xb3\ +\x85\xc9{>\x017\x06R\xfe\xbc;\x018\x0d\x0d\x01\ +N\x85\xa3\xa1>\xfe\xcb\x08\x02^\x0c\x02\x01\x0c\xfe\xe1\ +\x1b\xbc\xb9\x01u\x0f\x0c\x01\x1f\x1b\xb4\xa4\x1a\x01\x1e\x1a\ +\xbc\xb8\xfe\x8c\x0c\x0e\xfe\xe2\x1a\xa4\x00\x00\x02\x00V\x01\ +\x85\x02\xfa\x04m\x00\x0c\x00\x0d\x00\x0f\xb5\x0a\x04\x04\x0e\ +\x0d\x0f\x00?\x129/310\x1346632\ +\x16\x15\x14\x06#\x22&\x01V^\xadr\x94\x93\xcb\xb4\ +\x89\x9c\x01\xfc\x02\xb0v\xc0l\x9b\x92\xc2\xde\xa0\x02H\ +\x00\xff\xff\x00\x0c\xff\xe7\x06J\x01h\x00&\x00\x11\x0c\ +\x00\x00'\x00\x11\x02X\x00\x00\x00\x07\x00\x11\x04\xa2\x00\ +\x00\x00\x07\x00P\xff\xec\x0aN\x05\xcb\x00\x03\x00\x0e\x00\ +\x1c\x00'\x005\x00@\x00N\x00)@\x146\x1d\x1d\ +L3;\x22\x22E,\x19\x09\x13\x04\x1a\x07\x03\x06\x02\ +\x18\x00???3\xcc2?33\x113\xcc22\ +\x11310\x01\x01!\x01\x05\x22\x06\x15\x14326\ +54&\x05\x14\x02\x06#\x22&54\x12632\ +\x16\x01\x22\x06\x15\x1432654&\x05\x14\x02\x06\ +#\x22&54\x12632\x16\x05\x22\x06\x15\x143\ +2654&\x05\x14\x02\x06#\x22&54\x126\ +32\x16\x06^\xfb\xc7\xfe\xd7\x04A\xfc\xb52M5\ +4K\x18\x01;q\xcb\x81\x9f\x9el\xc9\x89\x93\xa9\x02\ +y2M54K\x18\x01;p\xcc\x81\x9f\x9el\xc9\ +\x89\x93\xa9\x01\xdb2M54K\x18\x01;p\xcc\x81\ +\x9f\x9el\xc9\x89\x93\xa9\x05\xb6\xfaJ\x05\xb6\xdd\xdc\x82\ +T\xdd\x81+)P\xa5\xfe\xec\x9b\xa7\x9b\xad\x01\x11\x96\ +\xaa\xfdn\xdc\x82T\xdd\x81,(P\xa4\xfe\xec\x9b\xa6\ +\x9b\xad\x01\x11\x96\xaaH\xdc\x82T\xdd\x81,(P\xa4\ +\xfe\xec\x9b\xa6\x9b\xad\x01\x11\x96\xaa\x00\xff\xff\x00\xb6\x03\ +\xa6\x02T\x05\xb6\x02\x06\x00\x0a\x00\x00\xff\xff\x00\xb6\x03\ +\xa6\x04\x0e\x05\xb6\x02\x06\x00\x05\x00\x00\x00\x01\x00=\x00\ +L\x02\xdd\x049\x00\x06\x00\x0c\xb3\x05\x05\x07\x01\x00/\ +\x129/10\x13\x01\x05\x01\x13\x05\x03=\x01\x98\x01\ +\x08\xfe\xf6o\xfe\xb2\xb7\x023\x02\x06\xcc\xfe\xb2\xfe\xb6\ +\x89\x01\xdd\x00\x01\xff\xf2\x00+\x02\x91\x04\x19\x00\x06\x00\ +\x0c\xb3\x01\x01\x07\x05\x00/\x129/10\x01\x01%\ +\x01\x03%\x13\x02\x91\xfei\xfe\xf8\x01\x0ao\x01L\xb8\ +\x021\xfd\xfa\xcd\x01N\x01I\x8a\xfe\x22\x00\xff\xff\x00\ +\x0c\xff\xe7\x05\x1d\x05\xb6\x00&\x00\x04\x00\x00\x00\x07\x00\ +\x04\x02Z\x00\x00\x00\x01\xfd\xcd\x00\x00\x031\x05\xb6\x00\ +\x03\x00\x0a\xb3\x03\x03\x02\x12\x00??10\x01\x01!\ +\x01\x031\xfb\xc5\xfe\xd7\x04A\x05\xb6\xfaJ\x05\xb6\x00\ +\x01\x00h\x02\xe5\x03\x83\x05\xc9\x00\x16\x00\x1d@\x0d\x00\ +\x0d\x0b\x0b\x0a\x10\x10\x0a([\x05\x10\x1f\x00?3+\ +\x11\x12\x009\x18/9910\x01\x13654#\ +\x22\x06\x07\x03!\x133\x076632\x16\x15\x14\x06\ +\x03\x02\x19M\x09:,7\x22=\xfe\xf5\x96\xdb\x0c4\ +lTSo\x07Y\x02\xe5\x01\x83(\x1aBZ\x98\xfe\ +\xeb\x02\xd1pM6qR):\xfeB\x00\x00\x01\x00\ +\x00\x00\x00\x04\xe5\x05\xb6\x00\x11\x002@\x1a\x03\x07\x08\ +\x07XY\x00\x08\x0e\x11TY\x08\x0e\x08\x0e\x05\x0a\x0a\ +\x0dTY\x0a\x06\x05\x18\x00??+\x11\x12\x0099\ +\x18//+\x11\x003+\x11\x00310\x013\x07\ +#\x03!\x13#73\x13!\x03!\x07!\x03!\x02\ ++\xfc+\xfc3\xfey7}+}\xd3\x03jC\xfe\ +\x1c+\x01\xc1F\xfe>\x01\xd3\xcd\xfe\xfa\x01\x06\xcd\x03\ +\xe3\xfe\xc1\xcd\xfe\xc0\x00\x00\x01\xff\xee\x00\x00\x04\xc7\x05\ +\xcb\x00$\x00K@'\x15\x1f \x1fXY\x12 \x11\ +#$#XY\x08\x0e\x0a\x0e$ $ $\x04\x1b\ +\x17\x1a\x1a\x17UY\x1a\x18\x04\x0aUY\x04\x07\x00?\ ++\x00\x18?+\x11\x12\x009\x1299\x18//\x11\ +3\x11\x129+\x11\x003\x113+\x11\x00310\ +\x01>\x0232\x16\x17\x03&#\x22\x06\x07\x073\x07\ +#\x073\x07#\x06\x07!\x03!\x13667#7\ +37#7\x01u\x1eu\xb9\x91Y\xb0l\x90w^\ +%)\x0e\x06\xfc-\xfa\x19\xf8+\xfc\x0e\xaa\x02\x5cH\ +\xfc\x05?jZ\x13\xc0+\xc0\x1b\xbd-\x04\x00\xae\xc2\ +[&0\xfe\xd5?/A\x19\xcd{\xccPR\xfe\xb6\ +\x019 OD\xcc{\xcd\x00\x00\x03\x00\x17\xff\xec\x07\ +\xc5\x05\xb6\x00\x0a\x00\x13\x00-\x006@\x1b\x14\x1a\x19\ +\x04\x0bTY ))%#&\x04&\x04&\x06\x07\ +\x07\x13TY\x07\x06\x06\x18\x00??+\x11\x12\x009\ +9\x18//\x11333\x113+\x00\x18?31\ +0\x01\x14\x00!#\x03!\x01! \x04\x01326\ +54&##\x01267\x11\x06#\x22&54\ +67#77\x133\x03!\x03!\x07\x06\x15\x14\x04\ +\xac\xfe\xa9\xfe\xd6?e\xfe\x90\x015\x01G\x01\x04\x01\ +\x15\xfd\x83@WuJ;;\x04\x0e\x1ff1\x84\xbd\ +\xa3\x8e\x0e+\x99&\xda\x8f\xf08\x01\x11B\xfe\xf4\x1f\ +\x0e\x04\x00\xfc\xfe\xe1\xfe\x1b\x05\xb6\xe3\xfeJz]8\ +S\xfc\x8f\x15\x14\xfe\xf6A~\x84\x1f[\xcb\xb6Y\x01\ +\x0e\xfe\xfe\xfe\xe5\x85D\x22:\x00\x01\x005\xff\xec\x05\ +\x00\x05\xcf\x00%\x00A@\x22\x0a\x17\x18\x17XY\x07\ +\x18\x05\x1b\x1c\x1bXY\x02\x1c\x18\x1c\x18\x1c\x13 \ +\x00VY \x07\x13\x0dUY\x13\x19\x00?+\x00\x18\ +?+\x11\x12\x0099\x18//\x113+\x11\x003\ +\x113+\x11\x00310\x01\x22\x07!\x07!\x06\x07\ +3\x07#\x14\x163267\x11\x06#\x22&'#\ +737#736\x0032\x16\x17\x03&\x03\x89\ +\x8eM\x01)-\xfe\xcb\x12\x07\xf6+\xe37NK\x8c\ +N~\xe5\xe7\xdd\x06\x8c+m\x16j/uT\x01>\ +\xdas\xaeV\x9ax\x04\x9a\xc3\xcd;@\xccR>%\ +\x1f\xfe\xb6A\xe4\xf3\xcc{\xcd\xf3\x01\x0527\xfe\xe6\ +N\x00\x04\x00L\xff\xec\x05\xdd\x05\xcb\x00\x03\x00\x0f\x00\ +\x1b\x005\x00\x1d@\x0e0\x1c)\x22\x07\x10\x0d\x16\x07\ +\x19\x03\x06\x02\x18\x00???3\xcc2?3\xcc2\ +10\x01\x01!\x01\x01\x14\x06#\x22&54\x123\ +2\x16\x05\x22\x06\x15\x14\x1632654&%\x22\ +&54\x1232\x16\x17\x07&&#\x22\x06\x06\x15\ +\x14\x163267\x15\x06\x05\xaa\xfb\xc9\xfe\xd9\x04;\ +\x01V\xda\xb5\x80\x9b\xd6\xba\x84\x96\xfe\xc9'J\x1b\x14\ +0G\x1c\xfc\xb6\x82\x9b\xc9\xa4I^J\x03\ +\x8bO\xedS\xfe\x04\x05\xb6\xfcc?\x01\x0eL\x02\x04\ +\xfd%\xcf\xf8\x94\x81\xd5\x01\x06\x9d\xfc\x99\xd9\xd9\x02\xdb\ +-/\x92pT\x92\x00\x00\x02\x00f\x02\xe5\x06\x19\x05\ +\xb6\x00\x07\x00\x1a\x00,@\x14\x18\x0a\x0a\x11\x0f\x08\x08\ +\x15\x0e\x01\x01\x1b\x0f\x04\x07\x03\x03\x12\x04\x03\x00?3\ +3\x113\x113\x129/333\x11\x1299\x11\ +310\x01#\x11#5!\x15#\x01\x03#\x16\x15\ +\x11#\x11!\x13\x13!\x11#\x1147#\x03\x01\xd5\ +\xc5\xaa\x02\x19\xaa\x02D\x90\x08\x06\xc0\x01\x1e\x8a\x95\x01\ +\x15\xc3\x06\x08\x98\x02\xe5\x02!\xb0\xb0\xfd\xdf\x01\xfe@\ +.\xfep\x02\xd1\xfe!\x01\xdf\xfd/\x01\x90J$\xfe\ +\x02\xff\xff\xff\xac\x00\x00\x05\xf0\x05\xcd\x02\x06\x01v\x00\ +\x00\x00\x02\x00f\xff\xdd\x04\x8b\x04H\x00\x17\x00\x1f\x00\ +%@\x11\x1e\x19\x0e\x03\x1c\x1c\x08\x15\x14\x14\x11\x1f\x0d\ +\x0d\x08\x11\x00\x00/2/9/3\x129\x113\x11\ +3\x11\x17910\x05\x22&\x02546632\ +\x16\x12\x15!\x11\x16\x163267\x17\x06\x06\x13\x11\ +&&#\x22\x07\x11\x02y\x9d\xf1\x85\x8a\xf4\x95\x98\xf3\ +\x87\xfc\xc51\xa6R\x83\xb7QHb\xd9\x932\xa3X\ +\xadz#\x93\x01\x05\x9d\xab\xff\x8c\x8e\xfe\xfd\xa5\xfe\x9c\ +5Fi\x81)\x9b|\x02\x8b\x01\x155Bu\xfe\xe9\ +\x00\xff\xff\x00h\xff\xe6\x07\x12\x05\xb6\x00'\x02@\x03\ +\xba\xfd\xb3\x00&\x00{\xf5\x00\x01\x07\x02\x17\x03\x0e\x00\ +\x00\x00\x0b\xb4\x02\x01\x00\x0c\x19\x00?555\x00\xff\ +\xff\x00u\xff\xe6\x07h\x05\xc9\x00'\x02@\x04\x10\xfd\ +\xb3\x00&\x00u3\x00\x01\x07\x02\x17\x03}\x00\x00\x00\ +\x0b\xb4\x02\x01\x00\x0c\x19\x00?555\x00\xff\xff\x00\ +\x85\xff\xe6\x07L\x05\xb6\x00'\x02@\x03\xf4\xfd\xb3\x00\ +&\x02='\x00\x01\x07\x02\x17\x03`\x00\x00\x00\x0b\xb4\ +\x02\x01\x00\x0c\x19\x00?555\x00\xff\xff\x00\x91\xff\ +\xe6\x07\x0a\x05\xb6\x00'\x02@\x03\xb2\xfd\xb3\x00'\x02\ +\x17\x03\x1f\x00\x00\x01\x06\x02?5\x00\x00\x0b\xb4\x02\x01\ +\x00\x0c\x19\x00?555\x00\x00\x02\x00)\xff\xec\x04\ +\x87\x05\xcb\x00\x19\x00%\x00&@\x14\x0b IY\x0b\ +\x0b\x17\x04\x17\x10FY\x17\x07\x04\x1aFY\x04\x19\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +\x10\x02\x04#\x22&54\x12632\x174&#\ +\x22\x06\x07\x116632\x00\x01267&&#\ +\x22\x06\x06\x15\x14\x04\x87\xb5\xfe\xd3\xc0\xd7\xe5\x8c\xf3\x9e\ +nXfVO\x9a<>\xc7h\xef\x01\x00\xfd{K\ +|%\x0dD\x221^:\x03\x8f\xfe\xfa\xfeE\xe2\xda\ +\xd4\xae\x01%\x9f%[f))\x01/!%\xfe\xd6\ +\xfcm\xe4\xd3\x12\x1be\xad[w\x00\x00\x02\xff\xb8\x00\ +\x00\x04\xbc\x05\xb6\x00\x05\x00\x0c\x00\x1e@\x0e\x0a\x02\x03\ +\x04\x01\x01\x00\x06\x00\x06OY\x00\x12\x00?+\x11\x12\ +\x009\x113\x18?310#7\x01!\x13\x07\x01\ +!\x0347\x06\x07H-\x02\x8c\x01\xe3h1\xfd\x0d\ +\x01\xae\x17\x04\x18%\xe1\x04\xd5\xfb+\xe1\x017\x02\xf8\ +K8VP\x00\x00\x01\x00\x9e\xfeP\x05R\x05\xb6\x00\ +\x07\x00\x10\xb7\x05\x02NY\x05\x03\x07\x04\x00/3?\ ++10\x01\x11!\x11!\x11!\x11\x03\xc5\xfef\xfe\ +s\x04\xb4\xfeP\x06#\xf9\xdd\x07f\xf8\x9a\x00\x01\x00\ +-\xfeP\x05\x0a\x05\xb6\x00\x0b\x00$@\x12\x03\x07\x04\ +\x04\x07NY\x04\x03\x01\x00\x09\x00\x09NY\x00\x22\x00\ +?+\x11\x12\x009\x18?+\x11\x12\x00910\x13\ +5\x01\x015!\x11!\x01\x01!\x11-\x02\x17\xfd\xf9\ +\x04\x96\xfd\x7f\x01\xac\xfe7\x02\xd5\xfeP\xd1\x03\x0a\x02\ +\xc3\xc8\xfe\xbd\xfd\xbc\xfdd\xfe\xbd\x00\x00\x01\x00f\x02\ +J\x045\x03Z\x00\x03\x00\x08\xb1\x00\x01\x00/31\ +0\x13\x11!\x11f\x03\xcf\x02J\x01\x10\xfe\xf0\x00\x00\ +\x01\x00V\xff\xf2\x05F\x06\xdd\x00\x08\x00\x12\xb6\x03\x04\ +\x04\x01\x08\x06\x01\x00/3/\x129/310\x05\ +#\x01#\x11!\x13\x01!\x02\xe1\xd7\xfe\xfa\xae\x01\x5c\ +\xbb\x01\xca\x01\x0f\x0e\x02\xc4\x01\x06\xfd\xfe\x05#\x00\x00\ +\x03\x00m\x01m\x05=\x041\x00\x16\x00 \x00+\x00\ ++@\x13\x06\x11\x09!\x14\x14&\x0f&\x04\x17\x09\x09\ +\x1b\x04\x04-\x1b\x0f\x00/3\x129/\x129/3\ +\x113\x11\x129\x113\x129910\x01\x14\x06\x06\ +#\x22'\x06\x06#\x22&54632\x1766\ +32\x16\x0527&#\x22\x06\x15\x14\x16%\x22\x07\ +\x16\x1632654&\x05=U\x9a\x5c\xa8{A\ +\x90B\x96\xb9\xbe\x91\xb0k;\x88X\x94\xb7\xfc\x8c@\ +=?@,36\x02E?D\x1fG\x1f*35\ +\x02\xcb^\xa2^\x93FG\xc2\x9e\x98\xc6\x91BK\xc2\ +\xfcdd;+-5\xc2b-<>+*8\x00\ +\x01\xff\xe3\xfe\x14\x03m\x06\x14\x00\x17\x00\x0e\xb5\x11\x0c\ +\x1b\x05\x00\x00\x00?2?310\x012\x17\x11&\ +#\x22\x06\x15\x11\x14\x06#\x22'\x11\x163265\ +\x1146\x02}\x82n\x801**\xd0\xcb\x80jn\ +40&\xd6\x06\x147\xfe\xc31/8\xfb0\xbe\xc8\ +8\x01=131\x04\xd3\xbf\xc6\x00\x00\x02\x00N\x01\ +%\x04D\x04y\x00\x14\x00)\x00/@\x15\x1f%\x15\ +\x1a%\x1a%\x1a\x17\x22\x02\x0a\x10\x00\x05\x10\x05\x10\x05\ +\x0d\x02\x00/\xcc99//\x113\x113\x10\xde\xcc\ +99//\x113\x11310\x01\x22\x07\x1163\ +2\x16\x17\x163267\x11\x06#\x22&'&\x03\ +\x22\x07\x11632\x16\x17\x163267\x11\x06#\ +\x22&'&\x017l}i\x9fN~M\x85h2\ +~8j\x9fE|W\x83ik~i\x9fN~M\ +\x8ac2~8j\x9fE|W\x85\x03jx\x01\x18\ +m 7A8\xfe\xe7l\x1c#7\xfe4y\x01\ +\x18m 7A8\xfe\xe7l\x1c#8\x00\x01\x00\ +H\x00\x81\x04?\x05'\x00\x13\x00\x19@\x0a\x10\x08\x08\ +\x0d\x09\x00\x04\x04\x11\x05\x00/33\x113\xce22\ +\x11310\x01\x07'7#\x11!7!\x11!7\ +\x17\x073\x11!\x07!\x11\x02-j\xf8;\xbe\x01;\ +V\xfeo\x02\x0em\xf7?\xc4\xfe\xc1V\x01\x95\x01f\ +\xe5f\x7f\x01\x0f\xba\x01\x0c\xeci\x83\xfe\xf4\xba\xfe\xf1\ +\x00\x00\x02\x00R\x00\x00\x04%\x05\x85\x00\x06\x00\x0a\x00\ +\x14\xb7\x06\x00\x00\x08\x08\x07\x04\x03\x00/3/3\x11\ +3/210\x01\x015\x01\x11\x01\x05\x01\x11!\x11\ +\x04%\xfc1\x03\xcf\xfd\xc0\x02@\xfc-\x03\xcf\x01\x1d\ +\x01\xc0\xac\x01\xfc\xfe\xd5\xfe\xe5\xf9\xfd\xba\x01\x0e\xfe\xf2\ +\x00\x00\x02\x00q\x00\x00\x04?\x05\x85\x00\x06\x00\x0a\x00\ +\x14\xb7\x00\x06\x06\x08\x08\x07\x02\x03\x00/3/3\x11\ +3/310\x13%\x01\x11\x01\x15\x01\x11\x11!\x11\ +q\x02?\xfd\xc1\x03\xce\xfc2\x03\xce\x02F\xf9\x01\x1d\ +\x01)\xfe\x04\xac\xfe@\xfe\xe3\x01\x0e\xfe\xf2\x00\x02\x00\ +P\x00\x00\x04b\x05\xbe\x00\x05\x00\x09\x00\x0f\xb5\x09\x07\ +\x02\x05\x02\x06\x00?/\x129910\x13\x013\x01\ +\x01#\x01\x03\x03\x13P\x01\xc2\x8e\x01\xc2\xfe>\x8e\x01\ +\x0d\xc7\xc5\xc5\x02\xdf\x02\xdf\xfd!\xfd!\x02\xdd\x01P\ +\xfe\xb0\xfe\xb4\x00\xff\xff\xff/\xfe\x14\x06\x1d\x067\x00\ +&\x00I\x00\x00\x00\x07\x00L\x03H\x00\x00\xff\xff\xff\ +/\xfe\x14\x06+\x06\x1f\x00&\x00I\x00\x00\x00\x07\x00\ +O\x03H\x00\x00\x00\x01\x01H\x04\xd9\x055\x06V\x00\ +\x0e\x00\x0c\xb3\x0c\x04\x08\x00\x00/2\xcc210\x01\ + \x117!\x07\x14\x163267!\x06\x04\x03\x00\ +\xfeH\x04\x01?\x04WESa\x12\x01L$\xfe\xe2\ +\x04\xd9\x01T)3H?Z`\xbe\xbf\x00\x00\x01\xfe\ +\xf8\xfe\x14\x02\x91\x04m\x00\x0c\x00\x11\xb7\x08\x0f\x00\x05\ +GY\x00\x1b\x00?+\x00\x18?10\x03\x22'\x11\ +\x16327\x13!\x01\x06\x069na88\x8e!\ +\xf7\x01\x83\xfe\xfc(\xea\xfe\x14\x1b\x01/\x12\x93\x04\x8e\ +\xfb5\xc1\xcd\x00\x00\x01\x01\xdd\x04\xcd\x03\xb6\x06\x14\x00\ +\x08\x00\x0d\xb5\x00\x07\x01\x07\x02\x00\x00?\xcd]10\ +\x0167!\x15\x06\x06\x07#\x01\xddE*\x01j2\ +tE\xee\x04\xe7\xb0}\x14R\x90Q\x00\x01\x00f\xfe\ +;\x02=\xff\x83\x00\x07\x00\x15@\x0b\x02\x02\x08\x00\x06\ +\x10\x06 \x06\x03\x06\x00/]\x129/10\x136\ +7!\x15\x06\x07#fM \x01jY\x90\xee\xfeV\ +\xc4i\x14\x96\x9e\x00\x01\x01\xbe\x04\xd9\x03\x98\x06!\x00\ +\x08\x00\x0c\xb4\x0f\x07\x01\x07\x04\x00/\xcd]10\x01\ +\x06\x06\x07!5673\x03\x98\x11J\x14\xfe\x95M\ +\x9f\xee\x06\x06(\xc1D\x15}\xb6\x00\x00\x02\x00Z\x02\ +3\x03Z\x05\xcb\x00\x0c\x00\x17\x00\x0e\xb5\x0d\x0a\x1f\x13\ +\x03!\x00?3?310\x01\x14\x02#\x22&5\ +4\x12632\x16\x05\x22\x06\x15\x14\x163265\ +4\x03Z\xf2\xcc\x98\xaal\xc6\x80\xa0\xae\xfe\xa07N\ +\x1e\x1f:S\x04^\xff\xfe\xd4\xba\xab\xa0\x01\x02\x91\xbc\ +0\xd3\x7f;3\xba\x89}\x00\x00\x02\x00\x10\x02H\x03\ +^\x05\xb6\x00\x0a\x00\x11\x00\x1d@\x0d\x09\x11\x11\x01\x0e\ +\x07\x05\x05\x03\x07\x1e\x03 \x00??\x129/\x129\ +33\x11310\x01#\x07!7!7\x01!\x03\ +3!667\x06\x06\x07\x03/q\x1a\xfe\xdf\x1b\xfe\ +r\x1f\x01\xea\x01Ewq\xfeo>\x16\x04\x0d,\xc1\ +\x02\xc3{{\xb2\x02A\xfd\xd3\xefF\x09\x12=\xef\x00\ +\x01\x00^\x029\x03j\x05\xb6\x00\x1a\x00\x1b@\x0c\x14\ +\x10\x10\x00\x00\x06\x18\x15\x1e\x0b\x06!\x00?3?3\ +\x129/3\x11310\x012\x16\x15\x14\x06#\x22\ +'5\x1632654#\x22\x06\x07'\x13!\x07\ +!\x076\x01\xee\x93\x9a\xda\xc4\xbdbl\x8aLX\x8b\ +\x10I\x18\x5cw\x02S3\xfe}\x16\x1e\x04\x85\x80v\ +\xa0\xb66\xd7<;2Z\x0d\x0aT\x01\xa8\xe5R\x06\ +\x00\x00\x02\x00R\x023\x03D\x05\xcb\x00\x17\x00#\x00\ +#@\x12\x16\x08\x08\x06\x1e\x00\x0c\x10\x0c\x02\x0c\x0c\x18\ +\x12!\x06\x00\x1f\x00?2?39/]3\x129\ +\x11310\x012\x17\x07&&#\x22\x06\x0736\ +32\x16\x15\x14\x06#\x22&5\x10\x00\x13265\ +4&#\x22\x06\x15\x14\x16\x02\x85{D:\x16[ \ +r\x7f\x22\x09T\x7fb}\xcf\xa8\xa7\xb1\x01.$/\ +;!\x1a/>!\x05\xcb\x15\xdf\x06\x0cPhN\x7f\ +h\x9e\xc7\xb3\xa1\x01\x0e\x016\xfdED1##D\ +1\x1c*\x00\x01\x00\x5c\x02H\x03\x9a\x05\xb6\x00\x06\x00\ +\x10\xb6\x05\x02\x02\x03\x1e\x00 \x00??3\x1291\ +0\x13\x01!7!\x07\x01\x5c\x01\xd1\xfe\x5c1\x02\xe0\ +)\xfe1\x02H\x02\x89\xe5\xba\xfdL\x00\x03\x00F\x02\ +3\x03X\x05\xcb\x00\x18\x00$\x00/\x00\x12\xb7\x19+\ +\x1f\x0c!%\x00\x1f\x00?2?39910\x01\ +2\x16\x15\x14\x07\x1e\x02\x15\x14\x06#\x22&546\ +7&&5466\x13\x06\x06\x15\x14\x16326\ +54&\x13\x22\x06\x15\x14\x16\x17654&\x02\x1b\ +\x9e\x9f\xa2;.\x1c\xd9\xba\xa2\xc0ol(8Y\x9f\ +\x0a'\xfd\xd9\x05:,\x1f*.\x1d \ +7\x01\x80 \x19\x151\x0e%1\x19\x1e\x00\x00\x02\x00\ +m\x023\x03D\x05\xcb\x00\x18\x00$\x00#@\x12\x17\ +\x07\x07\x05\x1f\x0f\x0b\x1f\x0b\x02\x0b\x0b\x19\x11\x1f\x05\x00\ +!\x00?2?39/]3\x129\x11310\ +\x01\x22'5\x163267#\x06#\x22&54\ +63 \x11\x14\x06\x07\x06\x04\x03\x22\x06\x15\x14\x163\ +2654&\x01\x0ch7=fs\x85'\x08T\ +\x7fb}\xce\xa9\x01X\x0b\x04%\xfe\xe1\x03-:\x22\ +\x1a.>!\x023\x11\xed\x1aQeN\x7fh\x9e\xc7\ +\xfe\x9b\x11g\x17\xca\xda\x02\xbbF/##@5\x1c\ +*\x00\x16\x00Z\xfe\x81\x07\xc7\x05\xee\x00\x05\x00\x0b\x00\ +\x11\x00\x17\x00\x1b\x00\x1f\x00#\x00'\x00+\x00/\x00\ +3\x007\x00;\x00?\x00C\x00G\x00S\x00[\x00\ +k\x00t\x00|\x00\x89\x00\x8e@O\x82}}vk\ +duullk\x85VKKkk\x5c\x0cZQ\ +Q\x85t\x5c\x5c\x07\x12\x13\x19-\x1d\x12\x18,\x1c\x08\ +\x0f\x0f\x0c\x16\x0d$1'2D=G>(A+\ +B\x09\x00\x00BA>=21\x0d\x08\x01\x0c\x068\ +4 \x0795!\x08\x04\x04\x01\x00/3\x12\x179\ +/\x12\x179\x113\x113\x113\x113\x113\x113\ +\x113\x113\x113\x12\x179\x11\x129/333\ +/3\x11\x129/3/3\x11\x129/3\x129\ +\x1133/310\x13\x11!\x15#\x15%5!\ +\x11#5\x01\x113\x153\x15!5353\x11!\ +5!\x15!5!\x15\x015!\x15\x01#\x113\x11\ +#\x113\x015!\x15\x01#\x113\x015!\x153\ +5!\x15\x01#\x1135#\x113\x01#\x113\x05\ +\x14\x06#\x22&54632\x16\x05\x14325\ +4#\x22%32\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\ +\x06##\x1332654&##\x15\x1532\ +654#\x01\x22'5\x16325\x113\x11\x14\ +\x06Z\x01/\xc0\x05\xcf\x01/m\xf9\x00o\xc0\x05\x0f\ +\xc2m\xfdI\x01\x11\xfb\xe1\x01\x0e\xfe\xf2\x01\x0e\x04\xb7\ +mmmm\xfb\xc2\x01\x11\xfc/oo\x02\xc0\x01\x11\ +v\x01\x11\xfa\xa8oooo\x06\xfemm\xfb\x9f\x87\ +\x7f\x7f\x87\x87\x7f~\x88\xfes\x87\x87\x87\x87\x01\xe1\xac\ +mq/,=.m^\xcf{B.$*.<\ +J2$Z\x01^4\x1c+\x19V}i\x04\xbe\x01\ +0o\xc1\xc1o\xfe\xd0\xc1\xf9\x02\x01/\xc2mm\xc2\ +\xfe\xd1mmmm\x06\xfeoo\xfa\xa8\x01\x0e\x02\x02\ +\x01\x0f\xfa;mm\x01\xa6\x01\x0e\x04Joooo\ +\xfc/\x01\x10y\x01\x0f\xfdh\x01\x10I\x91\x9c\x9c\x91\ +\x92\x9b\x9a\x93\xc5\xc5\xc4aCS1B\x08\x08\x0eD\ +5QY\x01b\x22 \x22\x1d\xe3\x9a+%J\xfe\xfa\ +\x0af\x08V\x01\x92\xfer_c\x00\x00\x03\x00V\xfe\ +\xc1\x07\xaa\x06\x14\x00\x03\x00\x1e\x00*\x00/@\x16\x1c\ +\x06\x0b\x17\x06\x17\x14\x1e\x1e((\x22\x12\x14\x14\x0e\x22\ +\x0e\x22\x0e\x02\x00\x00//99//\x113\x113\ +\x113\x113/\x1299\x113\x113\x09\x03\x055\ +4676654&#\x22\x06\x07\x17632\ +\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\x163265\ +4&#\x22\x06\x03\xfe\x03\xac\xfcT\xfcX\x03\xe9,\ +AgI\xbb\xa5X\xa8PR\x8el?>1HT\ +;\x1bGFBIHCHE\x06\x14\xfcV\xfcW\ +\x03\xa9\xfb/2A1R~X\x87\x9a11\xb2P\ +:/5K6DpJ;\xfe\xed?HI>@\ +IH\x00\xff\xff\xfe\xf8\xfe\x14\x03\xe8\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01L\xfe\xff\x00\x00\x00\x08\xb3\x01\x17\ +\x11&\x00+5\xff\xff\x00^\x03\xc1\x02\x7f\x05\xb6\x02\ +\x06\x02\x07\x00\x00\x00\x02\x00\x08\xff\xec\x06\x0a\x06'\x00\ +.\x008\x008@\x1e\x13\x0dGY\x00!2!F\ +Y,2\x132\x132\x04((7FY(\x01\x04\ +\x1dFY\x04\x16\x00?+\x00\x18?+\x11\x12\x009\ +9\x18//\x113+\x11\x003+10\x01\x02\x02\ +\x04#\x22&&54654#\x22\x06\x07'6\ +32\x16\x15\x14\x07\x06\x15\x14\x1632667.\ +\x0254$32\x12\x11\x073\x03\x01\x14\x16\x176\ +54&#\x22\x05F8\xb1\xfe\xe9\xcb\x85\xbfd\x12\ +)\x0f/\x11e\xe0\xa1^u\x0e\x0f099jY\ +\x1a\x9f\xed\x80\x01\x0e\xe6\xdf\xf0\x02\x97?\xfddfW\ +\x064-b\x02\xc1\xfe\xed\xfe\xd2\x94I\x85V*M\ ++)\x12\x0b\xe0tm]+OO\x1d\x222b\xc0\ +\x8a\x0fz\xc4r\xca\xe4\xfe\xf6\xfe\xfe8\xfe\xde\x01\xc4\ +DW\x07\x0232\x16\x17\ +\x03&&#\x22\x07\x06\x03\x02\xa0\xfeyx\xed\x01\x93\ +Xi\xbb\x9df3\xaa\xb8\ +\x027\x03\x7f\xfd\xec\xc6\xfaa\x0f\x14\xfe\xd7\x05\x0f;\ +\xd0\xfe\xb7\x00\x02\x00N\xff\xec\x08#\x04m\x00\x13\x00\ +'\x001@\x18!!\x03\x0b\x18\x0e\x09\x0b\x09FY\ +\x0b\x0f\x00\x03\x14\x1d\x03\x1dFY\x11\x03\x16\x00?3\ ++\x11\x003\x129\x18?+\x11\x0033\x11\x129\ +\x18/10%\x06\x06#\x22&547#77\ +!\x03#\x02\x00!\x22&%2\x127!\x06\x15\x14\ +\x1632667!\x07\x06\x15\x14\x16\x03\x9aB\xb3\ +\x84\xb2\xbfm\xcf'\xc4\x06\xea:\xd9\x03\xfe\xd7\xfe\xe7\ +\x8a\x96\x01\x11_q\x03\xfd\x11o+-$2&&\ +\x01y\x19\x16\x22\xb2j\x5c\xd7\xd0\xcf\xe8\xd1R\xfe\xdd\ +\xfeM\xfeU\x5c\xd1\x015\xfc\xe4\xc2O<3m\xb8\ +mn..!\xff\xff\x00!\x00\x00\x07P\x07u\x02\ +&\x000\x00\x00\x01\x07\x00v\x01\xba\x01T\x00\x08\xb3\ +\x01\x1d\x05&\x00+5\xff\xff\x00\x17\x00\x00\x07\x08\x06\ +!\x02&\x00P\x00\x00\x01\x07\x00v\x01\xf0\x00\x00\x00\ +\x08\xb3\x012\x11&\x00+5\xff\xff\xff\x87\xfd\x87\x04\ +\xe1\x05\xb6\x02&\x00$\x00\x00\x00\x07\x02[\x01\x8b\x00\ +\x00\xff\xff\x00T\xfd\x87\x04\xc5\x04\x81\x02&\x00D\x00\ +\x00\x00\x07\x02[\x01N\x00\x00\xff\xff\x00+\xff\xec\x07\ +\x92\x05\xcd\x00'\x002\x01\xec\x00\x00\x00\x06\x02\x5cL\ +\x00\x00\x02\xff\x85\xfd\x87\x01\x9e\xff\x83\x00\x0b\x00\x17\x00\ +\x0c\xb3\x0f\x09\x15\x03\x00/3\xcc210\x01\x14\x06\ +#\x22&54632\x16\x074&#\x22\x06\x15\ +\x14\x16326\x01\x9e\x97xz\x90\x92xx\x97\xbb\ +1#%1++#1\xfe\x87r\x8e\x89ut\x8a\ +\x8fo&..&&..\x00\x02\xff\xdf\x04^\x03\ +\x04\x05\xcb\x00\x07\x00\x18\x00\x13\xb7\x02\x07\x02\x07\x16\x0b\ +\x0a\x04\x00?3\xcc99//10\x0167!\ +\x15\x06\x07#%4%\x17\x06\x06\x15\x14\x17\x16\x16\x15\ +\x14\x06#\x22&\x01BAJ\x017\x8cd\xd2\xfe\x9d\ +\x01P\x0eJY+&!QNCK\x04\x87m\xc6\ +\x12\xcdhb\xc9-^\x09(\x17\x1a\x07\x08\x1e\x22&\ +8A\x00\x00\x03\xff/\xfe\x14\x08\xae\x067\x00=\x00\ +A\x00L\x00P@+EKHYE\x01?\x151\ +\x22\x22($:\x18\x0a(\x0aFY@7\x1a(\x0f\ +3$\x1e$FY-\x1e\x00\x05\x13\x0e\x13GY\x00\ +\x0e\x1b\x00?3+\x11\x003\x18?3+\x11\x003\ +\x18?333+\x11\x0033\x11\x129\x113\x18\ +??+10\x01\x22'\x11\x163267\x13!\ +\x03\x06\x06#\x22'\x11\x163267\x13#?\x02\ +6632\x16\x17\x03&#\x22\x06\x07\x07!76\ +632\x16\x17\x03&#\x22\x06\x07\x073\x03#\x03\ +\x06\x06\x01!\x13!%4632\x16\x15\x14\x06#\ +\x22\x02\xcbna?6JK\x0e\xbf\xfe\xb6\xcd+\xdd\ +\xb6na?6JL\x0e\xbe\xa6+\xbd\x10+\xcf\xac\ +P\x965c@A#1\x08\x10\x01K\x11)\xcb\xb2\ +P\x964b@A#1\x08\x10\xd2A\xd1\xcd+\xdd\ +\x03\xf2\xfe}\xef\x01\x85\xfe\xaawk[ctm\xbf\ +\xfe\x14\x1b\x01/\x12\x89\x1e\x01\x86\ +\x1f\x01\x08=\xfe\xfa,\x1d\xec\x01\x06\xfdsMX_\ +I:D\x01\xf8\xec\xfe\xf4\x04m\x01\x1a\x8d\x8d\xfe\xe6\ +\xd5\xdf\xfex_S;H\x00\x00\x02\x001\xff\xec\x04\ +\xb0\x05'\x00\x17\x00$\x00-@\x18\x03\x13\x14\x13I\ +Y\x06\x18JY\x06\x06\x0c\x16@\x00\x14\x0f\x0c\x1fJ\ +Y\x0c\x16\x00?+\x00\x18?3\x1a\xce\x129/+\ ++\x11\x00310\x01!\x03!\x07632\x16\x15\ +\x14\x04!\x22&547\x13#\x1337!\x03\x22\ +\x07\x06\x15\x14\x1632654&\x02\xdd\x01\x1b:\ +\xfe\xe2!G_\xb4\xd7\xfe\xe7\xfe\xe2\xd6\xeb\x1bL\xee\ +<\xef)\x01\x83GH1\x17A88G8\x04m\ +\xfe\xe5\x96\x15\xb0\x8e\xcf\xd8\xa3\x9cPy\x01^\x01\x1b\ +\xba\xfc\xa4\x11W(#&860;\x00\x00\x01\x00\ +!\xff\xec\x07\xf0\x05\xcd\x00$\x00=@ \x22\x03\x00\ +\x1e\x00NY\x1e\x04\x0d\x06\x0a\x06\x15\x1a\x15NY\x03\ +\x1a\x1a\x17\x18\x03\x17\x12\x10\x0aNY\x10\x13\x00?+\ +\x00\x18??\x129/3+\x11\x003\x11\x129\x18\ +?+\x11\x12\x00910\x01\x22\x06\x07!\x03!\x15\ +\x14\x163267\x11\x06# \x00\x115#\x03!\ +\x01!\x033\x12\x00!2\x16\x17\x03&&\x06\x0cm\ +\xa00\x01\xd9F\xfe-e^S\x9d\x97\xca\xee\xfe\xfb\ +\xfe\xe8\xdd\x7f\xfey\x015\x01\x87p\xceW\x01u\x01\ +\x05\x93\xe9h\x96r\x94\x04\x87|s\xfe\xbc+w\x83\ +$6\xfe\xbdZ\x01+\x01\x0e/\xfd\xac\x05\xb6\xfd\xe2\ +\x01\x0d\x01(;>\xfe\xc5A-\x00\x00\x01\x00\x17\xff\ +\xec\x06h\x04\x81\x00$\x00I@(\x13\x19\x16\x0f\x16\ +IY\x0f\x10\x19\x0b\x22\x1c\x1f\x1c\x06\x0b\x06IY\x0c\ +\x0b\x1c\x0b\x02\x0c\x03\x0b\x0b\x08\x09\x0f\x08\x15\x00\x1fI\ +Y\x00\x16\x00?+\x00\x18??\x129/_^]\ ++\x11\x003\x11\x129\x113\x18?+\x11\x12\x009\ +10\x05\x22&&55#\x03!\x13!\x0336\ +$32\x16\x17\x03&&#\x22\x06\x07!\x03!\x14\ +\x163267\x11\x06\x04B}\xbfj\xa4^\xfe}\ +\xf1\x01\x83V\x98E\x01&\xc2q\xacQl3lB\ +Ii\x17\x01!4\xfe\xe2B;H\x87K\xa4\x14k\ +\xcc\x8f\x06\xfeH\x04m\xfef\xcd\xe1**\xfe\xfe\x17\ +$NE\xfe\xe5Nb4(\xfe\xe2Z\x00\x00\x02\xff\ +m\x00\x00\x06\x06\x05\xb6\x00\x0b\x00\x0e\x00\x1f@\x0f\x06\ +\x0a\x0c\x0aRY\x0c\x0c\x0e\x01\x03\x08\x04\x00\x12\x00?\ +22?39/+\x11\x00310#\x01!\x01\ +!\x03#\x03!\x13#\x01\x01!\x03\x93\x03|\x02\x03\ +\x01\x1a\xfe\x87ZNx\xfe\xa3wL\xfe\xc3\x01\xdf\x01\ ++C\x05\xb6\xfaJ\x02+\xfd\xd5\x02+\xfd\xd5\x03F\ +\x01\x99\x00\x00\x02\xffT\x00\x00\x05w\x04m\x00\x0b\x00\ +\x0f\x00#@\x11\x04\x08\x0c\x08KY\x0f\x0b\x0c\x0c\x0a\ +\x0b\x0f\x06\x02\x0a\x15\x00?33?\x129/\x129\ ++\x11\x00310\x01\x01!\x03#\x03!\x13#\x03\ +!\x01\x13!\x03#\x04%\x01R\xfe\x89\x5c>K\xfe\ +\xa8K?\xe3\xfeh\x02\xfe\x14\x01\x00I\x09\x04m\xfb\ +\x93\x01u\xfe\x8b\x01u\xfe\x8b\x04m\xfe\x06\x01\x16\x00\ +\x02\x00!\x00\x00\x08\x96\x05\xb6\x00\x13\x00\x16\x00.@\ +\x18\x0e\x12\x14\x12RY\x07\x02RY\x07\x14\x14\x04\x16\ +\x09\x09\x05\x03\x10\x0c\x00\x04\x12\x00?333?3\ +\x113\x129/\xc5++\x11\x00310!\x01!\ +\x03!\x01!\x03!\x01!\x01!\x03#\x03!\x13#\ +\x01\x01!\x03\x01\xfc\x01j\xfe\xc1\x7f\xfey\x015\x01\ +\x87{\x01\xb2\x01e\x02\x02\x01\x1b\xfe\x87ZNy\xfe\ +\xa4wL\xfe\xc2\x01\xe0\x01+D\x02T\xfd\xac\x05\xb6\ +\xfd\xb9\x02G\xfaJ\x02+\xfd\xd5\x02+\xfd\xd5\x03F\ +\x01\x99\x00\x00\x02\x00\x17\x00\x00\x07\xf2\x04m\x00\x13\x00\ +\x17\x001@\x19\x11\x0cKY\x11\x14\x04\x08\x14\x08K\ +Y\x17\x13\x0f\x14\x14\x0e\x0f\x0f\x0a\x06\x02\x0e\x15\x00?\ +333?\x129/\x1299+\x11\x003\x18\x10\ +\xc5+10\x01\x01!\x03#\x03!\x13#\x03!\x01\ +#\x03!\x13!\x03!\x01\x13!\x03#\x06\xa0\x01R\ +\xfe\x89\x5c>K\xfe\xa7L?\xe4\xfei\x01\x14\xf1X\ +\xfe}\xf1\x01\x83b\x01f\x01>\x14\x01\x00I\x09\x04\ +m\xfb\x93\x01u\xfe\x8b\x01u\xfe\x8b\x01\x9a\xfef\x04\ +m\xfe+\x01\xd5\xfe\x06\x01\x16\x00\x02\xffy\x00\x00\x06\ +\xbe\x05\xb6\x00\x16\x00\x1a\x003@\x19\x17\x19\x12\x16\x13\ +\x13\x14\x19\x14\x19RY\x07\x0a\x0a\x00\x12\x12\x0f\x14\x03\ +\x09\x04\x0f\x12\x00?33?\x129/33\x113\ ++\x11\x12\x009\x113\x11\x12910\x01\x16\x13\x13\ +!\x03&'\x03!\x13\x06\x06\x07\x01!\x01\x127\x03\ +7!\x07\x01\x13!\x13\x05#\xa7]\x95\xfekk'\ +I{\xfe\xa0{4X=\xff\x00\xfeV\x01L\xc8\xf6\ +\xc7#\x04\xdf\x22\xfd/\xef\xfe\x8c}\x03\x5c=\xfe\xd3\ +\xfe\x0e\x01\xaa\x9b\x0d\xfd\xae\x02V\x04Oc\xfe`\x01\ +\xfe\x0117\x01\xa8\xa8\xa8\xfea\x01-\xfe\xd3\x00\x00\ +\x02\xffX\x00\x00\x05u\x04m\x00\x18\x00\x1c\x003@\ +\x19\x1c\x1b\x0c\x10\x0d\x0d\x0e\x1b\x0e\x1bLY\x00\x03\x03\ +\x11\x0c\x0c\x08\x0e\x0f\x15\x02\x08\x15\x00?33?\x12\ +9/33\x113+\x11\x12\x009\x113\x11\x129\ +10\x01\x03!\x13\x06\x06\x07\x03!\x13667\x03\ +7!\x07\x01\x16\x13\x13!\x03&&'7!\x17\x03\ +}^\xfe\xa8\x5c.G;\x98\xfe}\xdbS\xb7\x7f\x97\ +\x1d\x04\x22\x1c\xfe\xe3\xa2J^\xfe\x975\x0d3\x9f\xac\ +\xfe\xf6V\x01\xb8\xfeH\x01\xc1\x0cOd\xfe\xfe\x01^\ +\x84\x92\x13\x01T\x92\x92\xfe\xac*\xfe\xf9\xfe\xaa\x01\x0c\ +Da\xe7\xdf\xdf\x00\x02\x00!\x00\x00\x09N\x05\xb6\x00\ +\x1c\x00 \x00@@!\x07\x0a\x0a\x1d\x1d\x1f\x00\x1c\x19\ +\x19\x1a\x1f\x1a\x1fRY\x17\x12RY\x17\x00\x00\x14\x1a\ +\x1a\x15\x03\x0f\x09\x04\x14\x12\x00?333?3/\ +\x129/\xc5++\x11\x12\x009\x113\x11\x129\x11\ +3\x11310\x01\x16\x13\x13!\x03&'\x03!\x13\ +\x06\x06\x07\x01!\x017!\x03!\x01!\x03!\x037\ +!\x07\x01\x13!\x13\x07\xb2\xa7]\x96\xfejj)H\ +{\xfe\xa0{4X=\xff\x00\xfeV\x01L;\xfe\x98\ +\x7f\xfey\x015\x01\x87{\x02\xac\xc2#\x04\xdf#\xfd\ +/\xf0\xfe\x8b}\x03\x5c=\xfe\xd3\xfe\x0e\x01\xaa\x9c\x0c\ +\xfd\xae\x02V\x04Oc\xfe`\x01\xfeV\xfd\xac\x05\xb6\ +\xfd\xb9\x01\x9f\xa8\xa8\xfea\x01-\xfe\xd3\x00\x00\x02\x00\ +\x17\x00\x00\x08\x00\x04m\x00\x1e\x00\x22\x00>@ \x1f\ +!\x17\x16\x13\x13\x14!\x14!LY\x11\x0cKY\x11\ +\x03\x00\x00\x17\x17\x14\x0e\x14\x0f\x0f\x1b\x08\x02\x0e\x15\x00\ +?333?3\x11\x129/3\x113\xc5++\ +\x11\x12\x009\x113\x11\x12910\x01\x03!\x13\x06\ +\x06\x07\x03!\x1367!\x03!\x13!\x03!\x037\ +!\x07\x01\x16\x13\x13!\x03&&'7!\x17\x06\x08\ +^\xfe\xa8\x5c/I8\x98\xfe}\xcd\x1f+\xfe\xf8X\ +\xfe}\xf1\x01\x83b\x02\x16\x8f\x1d\x04#\x1d\xfe\xe3\xa4\ +H^\xfe\x986\x0d3\x9f\xac\xfe\xf6V\x01\xb8\xfeH\ +\x01\xc1\x0dT^\xfe\xfe\x01J1\x1f\xfef\x04m\xfe\ ++\x01C\x92\x92\xfe\xac*\xfe\xf9\xfe\xaa\x01\x0cDa\ +\xe7\xdf\xdf\x00\x01\xff\xaa\xfe\x17\x05\x0e\x07\x06\x00M\x00\ +S@+E7RYEE2?\x1b\x0e\x0c*\x05\ +\x04\x05\x04OY\x05\x05J2\x13\x19\x12\x16\x16!\x0f\ +\x1c\x01\x09\x03\x1c\x12@\x12\x0cQY$\x12\x03\x00?\ +3+\x00\x1a\x18\x10\xcd_^]29|/\x129\ +\x18?39/+\x11\x12\x009\x119\x18?\x129\ +/+10\x014&##\x1332654&\ +#\x22\x07\x03667&&'53\x16\x1766\ +32\x17\x15&#\x22\x06\x07\x16\x16\x15\x14\x06\x07\x15\ +\x16\x16\x15\x14\x04\x05\x06\x06\x15\x14\x1632772\ +\x16\x16\x17\x11&&#\x22\x07\x07\x22&54$%\ +66\x02\xf8\x81\x94\x87D\x8f\x9c\x95P\x5c\xa1\xc3\x85\ +}\xa8b&0@\xc3v&w\xab]M'$)\ +?{B\x90\xa3\xcb\xae|\x88\xfe\xdd\xfe\xb2{l3\ +\x0232\x17\x15&#\ +\x22\x06\x07\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04\x05\x06\ +\x06\x15\x14\x16372\x17\x11&&#\x22\x06#\x22\ +&546676654&##\x01m\x99\ +tc8CI\xc3RT\x90v\x22P\xc2v&[\ +nrDJ+&(,Z9\xd5y\x83^]\xfe\ +\xde\xfe\xd0VT8W\xfad\x19\x06@/X\xb3[\ +\xbd\xdfl\xe7\xad~eig\x8c\x02\xc7**)\x22\ +,&\x01\x17.\x16Fx\x17v2]N*\x13\xac\ +\x0a%5>\xc4f\x84(\x08\x19vQ\xb2\xb7\x11\x05\ +%,%!\x0a-\xfe\xe7\x11\x1a\x0a\xac\x94\x88\xa0^\ +\x13\x0e*'7-\x00\xff\xff\x00\xa0\x00\x00\x07N\x05\ +\xb6\x02\x06\x01u\x00\x00\xff\xff\x00`\xfe\x14\x06\xac\x06\ +\x14\x02\x06\x01\x95\x00\x00\x00\x03\x00h\xff\xec\x05\xa6\x05\ +\xcd\x00\x0d\x00\x15\x00\x1c\x00&@\x14\x1c\x12PY\x1c\ +\x1c\x07\x00\x07\x0ePY\x07\x13\x00\x19PY\x00\x04\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ + \x00\x11\x10\x02\x04# \x00\x11\x10\x12$\x1326\ +7!\x07\x15\x10\x014&#\x22\x06\x07\x03\x81\x01\x04\ +\x01!\xc7\xfe\xa2\xe7\xfe\xf3\xfe\xdb\xce\x01c#d\xac\ +2\xfd\xe3\x02\x02Pkd`\xa38\x05\xcd\xfe\xd7\xfe\ +\xf6\xfe\xf6\xfeG\xeb\x01*\x01\x09\x01\x09\x01\xbc\xe9\xfb\ +N\xa9\x96\x1d\x1c\xfe\xfa\x02n\x85\x90\x8d\x88\x00\x03\x00\ +T\xff\xec\x04\x87\x04\x81\x00\x0d\x00\x15\x00\x1c\x000@\ +\x1b\x11\x1aLY\x0c\x11\x1c\x11\x02\x0c\x03\x11\x11\x00\x07\ +\x07\x0eJY\x07\x10\x00\x16JY\x00\x16\x00?+\x00\ +\x18?+\x11\x12\x009\x18/_^]+10\x05\ +\x22&54\x12$32\x16\x15\x14\x02\x04\x03\x22\x06\ +\x07!54&\x03267!\x15\x14\x02\x08\xd1\xe3\ +\x9f\x01 \xc0\xd1\xe3\x9f\xfe\xe0\x229f\x1b\x01-=\ +\xa97f\x1c\xfe\xd7\x14\xe2\xd2\xd2\x01S\xbc\xe2\xd2\xd2\ +\xfe\xad\xbc\x03\x87oZ/MM\xfd\x87kW)\x99\ +\x00\x00\x01\x00\x96\x00\x00\x05\xcf\x05\xc3\x00\x19\x00\x17@\ +\x0c\x10\x16NY\x10\x04\x07\x01\x02\x03\x01\x12\x00??\ +\x129?+10!!\x03!\x13\x15\x14\x0736\ +67\x13>\x0232\x16\x17\x11&#\x22\x06\x07\x02\ +\xb2\xfeLh\x01~\x1b\x10\x08\x0f8\x1d\xb2L\x85\x96\ +l4m\x1e+B8S#\x05\xb6\xfc\xdf3\x90p\ +B\xaaC\x01\x88\xa7\xb4O\x18\x11\xfe\xc6\x1fCD\x00\ +\x01\x00X\x00\x00\x04\xe1\x04\x81\x00\x16\x00\x17@\x0c\x0e\ +\x13GY\x0e\x10\x06\x01\x02\x0f\x01\x15\x00??\x129\ +?+10!!\x03!\x13\x14\x0736677\ +6632\x17\x11&#\x22\x06\x07\x02m\xfe|\x91\ +\x01\x81\x1b\x08\x08\x01$\x12m\x5c\xb3\x94cC)5\ +-B \x04m\xfd\xa5I-\x0eg&\xec\xca\x94'\ +\xfe\xd7\x197>\xff\xff\x00\x96\x00\x00\x05\xcf\x07s\x02\ +&\x02\x80\x00\x00\x01\x07\x03v\x04\x81\x01R\x00\x0a\xb4\ +\x02\x01$\x05&\x00+55\xff\xff\x00X\x00\x00\x04\ +\xe1\x06!\x02&\x02\x81\x00\x00\x01\x07\x03v\x03\xe3\x00\ +\x00\x00\x0a\xb4\x02\x01!\x11&\x00+55\xff\xff\x00\ +h\xfe\x14\x0a\xb2\x05\xcd\x00&\x002\x00\x00\x00\x07\x00\ +\x5c\x05\xe5\x00\x00\xff\xff\x00T\xfe\x14\x09\x9a\x04\x81\x00\ +&\x00R\x00\x00\x00\x07\x00\x5c\x04\xcd\x00\x00\x00\x02\x00\ +h\xff\x83\x05\xe7\x061\x00\x18\x00,\x000@\x18*\ + \x1b'%\x16%NY\x13@\x10\x16\x13\x1d\x1b\x09\ +\x1bNY\x06\x04\x09\x04\x00?3\xc9+\x11\x003\x18\ +?3\x1a\xc9+\x11\x003\x129910\x134\x12\ +$7632\x16\x17\x16\x12\x15\x14\x02\x04\x07\x06\x06\ +#\x22&'&\x02\x014'\x06#\x22&'\x06\x02\ +\x15\x14\x17632\x16\x176\x12h\xb1\x013\xc4\x1c\ +x*H\x0d\xdc\xe8\xa9\xfe\xd5\xc1\x0cS;+F\x0a\ +\xe3\xf2\x03\xf4b\x22t%@\x0fo\x8dr\x1fk&\ +C\x11l\x86\x02B\xdf\x01\x8d\xf3 p:4\x22\xfe\ +\xd4\xfa\xde\xfev\xf7\x22<;<5\x1d\x010\x026\ +\xb7?e,(F\xfe\xcd\xa1\xca4h)%E\x01\ ++\x00\x02\x00T\xff\x83\x05\x0a\x04\xd9\x00\x17\x00-\x00\ +0@\x18+ %\x1d\x1a\x11\x1aFY\x15\x13@\x11\ +\x10(%\x04%FY\x0a\x07\x04\x16\x00?\xc93+\ +\x11\x003\x18?\x1a\xc93+\x11\x003\x12991\ +0\x01\x14\x02\x06\x07\x06\x06#\x22&'&&54\ +\x12$7632\x17\x16\x16\x054'\x06\x06#\x22\ +&'\x06\x06\x15\x14\x176632\x16\x1766\x05\ +\x0a\x92\xfe\xa5\x11?=64\x09\xbc\xc5\x8d\x01\x01\xa7\ +!\x5ce\x14\xbf\xcc\xfe\x94:\x0bN<*B\x01H\ +Y=\x09E;'@\x02Lb\x02\x91\xa8\xfe\xdb\xb6\ +\x18;89<\x1f\xf1\xbf\xac\x01-\xc1\x18`b\x1f\ +\xf8\xbau3EDM-9\xdctq,=BA\ +25\xd9\x00\x03\x00h\xff\xec\x08+\x08\xfe\x002\x00\ +C\x00W\x00_@5WFF@O\x01OR@\ +\x00A@APA`A\xb0A\x05\x09\x03A6A\ +6K\x0eKR\x09)\x22)NY\x0e\x22\x00\x00\x22\ +\x04\x18\x1b\x030\x1b0NY\x15\x1b\x13\x00?3+\ +\x11\x003\x129\x18?9/\x113+\x11\x003\x18\ +/3\x11\x1299//_^]\x1a\x10\xcd]9\ +/310\x01\x16\x16326\x1254#\x22\x07\ +\x03632\x12\x11\x10\x02\x04#\x22&'\x06\x06#\ +\x22\x00\x11\x10\x12$32\x16\x17\x03&&#\x22\x06\ +\x02\x15\x14\x16326\x01\x14\x06#5654'\ +&&54632\x16\x01\x07#\x22.\x02#\x22\ +\x06\x07#6632\x1e\x023\x047 \x83ha\ +\xa2[\xa0V^\x85\xb8\xd1\xe6\xf5\xb7\xfe\xba\xd0\x94\xac\ +(6\xe2\x84\xf0\xfe\xfe\xb4\x01B\xd7_\x9cM\xb0-\ +A\x22`\x96SSei\xdf\x01\xa6\xdd\xad\xa63#\ +#bSK]\x01\x0263GygU$15\ +\x0e\xdd\x0f\xb4\x82@zz|B\x02X\x9d\x8c\x9f\x01\ +\x18\xa7\xfaC\x01\x1am\xfe\xd9\xfe\xed\xfe\xee\xfeR\xe5\ +]iWo\x01+\x01\x0e\x01\x0e\x01\xb6\xe23:\xfe\ +\xe1*\x1e\x99\xfe\xee\x9f\x90~\xa7\x05<{\x97h\x10\ +B\x1f\x10\x0b%&-@U\x01.\xed & 4\ +;\xa3\xcc&-&\x00\x00\x03\x00T\xff\xec\x06\xb8\x07\ +\xc1\x002\x00C\x00W\x00M@&WFFOK\ +66#AAKKR@O#\x0a)#)G\ +Y\x00\x00\x0f#\x10\x19\x1c\x030\x1c0FY\x17\x1c\ +\x16\x00?3+\x11\x003\x129\x18?39/+\ +\x11\x003\x18\x10\xd6\x1a\xcd2\x113\x11\x129/\x11\ +\x129\x11310\x01\x16\x16326654&\ +#\x22\x07\x03632\x16\x16\x15\x14\x02\x04#\x22'\ +\x06\x06#\x22&54\x12$32\x16\x17\x03&#\ +\x22\x06\x06\x15\x14\x16326\x01\x14\x06#565\ +4'&&54632\x16\x01\x07#\x22.\x02\ +#\x22\x06\x07#6632\x1e\x023\x03q\x1f[\ +BKvI:696V~\x9b{\xbah\x96\xfe\ +\xf2\xa5\xdeMK\xa1f\xc7\xd7\x95\x01\x0b\xa4D\x8b*\ +r10Ak=DMK\x93\x01}\xdd\xad\xa63\ +##gNK]\x01\x0263GygU$1\ +5\x0e\xde\x0e\xb4\x84@zz|B\x01\xc7[Sa\ +\xc2`TZ\x1f\x01\x19=h\xc9\x92\xd1\xfe\xb6\xb7\x81\ +D=\xee\xdc\xc8\x01J\xb9\x22\x1b\xfe\xe7\x1f^\xa7p\ +eW_\x04]{\x97h\x10B\x1f\x10\x0b%&/\ +>V\x01/\xee ' 4;\xa1\xce&-&\x00\ +\x02\x00h\xff\xec\x08+\x07D\x00\x0d\x00C\x00A@\ + &&\x0e\x153\x1c\x15\x1cNY\x0d\x0d\x05\x09\x07\ +\x03\x0b@8\x15\x04A\x0e-\x22\x0e\x22NY?\x0e\ +\x13\x00?3+\x11\x003\x129\x18?3\x1a\xde2\ +2\xc922/+\x11\x003\x11\x129\x18/10\ +\x01\x07\x07#'#\x07#'#\x07#'7\x01\x22\ +\x02\x11\x10\x12$32\x16\x17\x03&&#\x22\x06\x02\ +\x15\x143267\x13!\x07\x06\x06\x15\x14326\ +\x1254#\x22\x07\x03632\x12\x11\x10\x02\x04#\ + '\x06\x06\x06\x8d\x1eo`\x1bZB`\x1a[A\ +^)\x1c\xfe\xd5\xdf\xf6\xb4\x01B\xd7_\x9cM\xb0 \ +B.a\x95S\x93[f\x1a:\x01\x81:\x09\x0du\ +a\xa2[\xa0V^\x85\xb8\xd1\xe6\xf5\xb7\xfe\xba\xd0\xfe\ +\xd2I9\xdd\x07D\x86\xacgggg\xac\x86\xf8\xa8\ +\x010\x01\x09\x01\x0e\x01\xb6\xe23:\xfe\xe1\x1c,\x99\ +\xfe\xe8\xad\xfauw\x01\x0a\xfe,<\x1fq\x9f\x01\x18\ +\xa7\xfaC\x01\x1am\xfe\xd9\xfe\xed\xfe\xee\xfeR\xe5\xc6\ +\x5cj\x00\x00\x02\x00X\x00\x00\x06\xf2\x05\xfa\x00\x15\x00\ +#\x00+@\x14##\x1b\x1f\x1d\x19!\x06\x14\x0b\x05\ +\x14\x05\x0e\x07\x01\x0f\x13\x00\x15\x00?2?339\ +9\x113\x113\xde22\xc922/103\x03\ +!\x13\x17\x17\x13\x03!\x12\x16\x156\x12\x13!\x02\x00\ +\x05!\x03\x03\x01\x07\x07#'#\x07#'#\x07#\ +'7\xe9\x91\x01}'\x06\x02\xec#\x01f\x18\x05a\ +\x91\x22\x01\x8e8\xfe\xd2\xfe\xfb\xfe\xc5)\xbb\x03\x0d\x1f\ +o`\x1a[A`\x1bZB^)\x1d\x04m\xfd\xce\ +xc\x01\x9e\x01o\xfe6\xe5^q\x01\x9b\x01\x01\xfe\ +\x9a\xfd\xe1\xe8\x01Z\xfe\xa6\x05\xfa\x85\xacffff\ +\xac\x85\x00\x00\x01\x00h\xfe\x14\x05T\x05\xcd\x00\x1a\x00\ +\x1a@\x0e\x14\x00NY\x14\x04\x0d\x07NY\x0d\x13\x0c\ +\x1b\x00??+\x00\x18?+10\x01\x22\x06\x02\x15\ +\x14\x163267\x03!\x13&\x00\x11\x10\x12$3\ +2\x16\x17\x03&&\x03qm\xaebz\x82<\xc7B\ +\xb8\xfeyh\xf2\xfe\xfc\xcb\x01]\xe1\x92\xeag\x96]\ +\x9c\x04\x87\x9f\xfe\xe6\xa5\x82x!\x16\xfc\xae\x01\xda\x0b\ +\x01(\x01\x04\x01\x0a\x01\xbc\xe2;>\xfe\xc577\x00\ +\x01\x00T\xfe\x14\x04!\x04\x81\x00\x16\x00\x1a@\x0e\x08\ +\x0dGY\x08\x10\x01\x13FY\x01\x15\x00\x1b\x00??\ ++\x00\x18?+10\x01\x13&&54\x12$3\ +2\x17\x03&#\x22\x06\x06\x15\x14327\x03\x01\x04\ +k\x82\x99\x98\x01\x15\xb1\xc6\xa9{\x85\x5c@iC\x85\ +op\xb6\xfe\x14\x01\xe8!\xe9\xa4\xd1\x01O\xb7P\xfe\ +\xe1<`\xc1h\xa23\xfc\xbe\x00\x01\x003\xff\xfa\x04\ +}\x05\x0a\x00\x13\x00\x09\xb2\x0b\x01\x12\x00?/10\ +%\x07'7'7\x177'7\x177\x17\x07\x17\x07\ +'\x07\x17\x07\x02\x0c\x8b\xe7\x89\xf0\x7f\xf4\x8d\xf1\x81\xef\ +\x89\xe6\x87\xe3\x83\xdd\x92\xe2\x81\xe5\xeb\x85\xeb\x8e\xdb\x8b\ +\xf7\x8e\xdd\x8b\xeb\x85\xeb\x83\xdc\x81\xf7\x86\xdb\x00\x01\x00\ +\xfe\x04{\x04D\x05\xf0\x00\x13\x00\x0e\xb4\x0d\x09\x09\x03\ +\x00\x00/22\x11310\x01\x06\x06#\x22&5\ +463!6632\x16\x15\x14\x06#\x02\x1b\x13\ +IB=BZP\x01\x7f\x12EG>A\x5cN\x04\ +\xd92,=8E\x5c0/>7G[\x00\x01\x01\ +\x1b\x04\xcf\x04D\x06;\x00\x17\x00\x19@\x0d\x17\x16\x16\ +\x0f?\x05O\x05_\x05\x03\x05\x0b\x00/\xcc]29\ +\x11310\x01267632\x16\x15\x14\x07#\ +75&#\x22\x06\x07\x06\x06##7\x01oJ\x7f\ +nZLw\x81\x0b\xdd\x02\x03@\x11\x16\x11c\xa5\x81\ +?3\x05\xbe'0&\x8a~8,\x14\x0dG\x06\x0c\ +1#\xed\x00\x01\x02;\x04\xb4\x03\xbe\x06o\x00\x12\x00\ +\x0a\xb2\x0f\x03\x10\x00/\xcc310\x014632\ +\x16\x15\x14\x06\x07\x06\x06\x15\x14\x16\x17\x07\x22&\x02;\ +\x8arA\x10\x97\xa7\x05\x89f\ +\x80<%0)\x0b\x0c\x1c\x22\x19'\x03ip\x00\x00\ +\x01\x02\x00\x04\xb4\x03\xa4\x06s\x00\x12\x00\x0a\xb2\x10\x05\ +\x04\x00/3\xcc10\x01\x14\x06\x06#5665\ +4'&&54632\x16\x03\xa4l\xc4th\ +Y4#\x22fNK]\x05\xd9Y\x84Hi\x0a.\ +&%\x10\x0b%&0=V\x00\x08\x00\x14\xfe\xc1\x07\ +\xac\x05\x91\x00\x0c\x00\x1a\x00(\x006\x00D\x00R\x00\ +`\x00n\x00_@-e^WkhSaah\ +IA;O7EE>LLZ\x07-%\x1f3\ +\x1b))\x2200\x14ZZhh\x07\x11\x17\x0d\x14\ +\x04\x0a\x00\x07\x00/3\xc82/3\xca2\x129/\ +3\x11\x129/33\x113\xca222\x11\x129\ +/33\x113\xca222\x113\x113\x10\xca2\ +2210\x012\x16\x17#&&#\x22\x07#6\ +6\x132\x16\x17#&&#\x22\x06\x07#66\x01\ +2\x16\x17#&&#\x22\x06\x07#66!2\x16\ +\x17#&&#\x22\x06\x07#66\x012\x16\x17#\ +&&#\x22\x06\x07#66!2\x16\x17#&&\ +#\x22\x06\x07#66\x012\x16\x17#&&#\x22\ +\x06\x07#66!2\x16\x17#&&#\x22\x06\x07\ +#66\x03\xd9g\x84\x05s\x033Gx\x03w\x06\ +\x8bag\x84\x05s\x033G<>\x01w\x06\x8b\x02\ +\xb1h\x82\x06s\x033G9@\x02w\x04\x8b\xfb\xd4\ +h\x83\x04r\x036D;?\x01w\x04\x88\x04\xf5h\ +\x82\x06s\x033G<>\x01w\x04\x8b\xfb\xd4h\x83\ +\x04r\x033G<>\x01w\x04\x88\x05\x88k\x81\x04\ +s\x033G<=\x01w\x04\x89\xfa\xaej\x83\x03s\ +\x033G<>\x01w\x06\x8b\x05\x91p^\x22\x1fA\ +]q\xf9\xfep^\x22\x1f! ]q\x01\x17p_\ +!!#\x1fZur]\x22 $\x1eYv\x03\xcf\ +p_\x22\x1f! Zur]\x22\x1f! Yv\ +\xfe\x1er\x5c\x22\x1f! Yuq]\x22\x1f! \ +]q\x00\x00\x08\x00\x19\xfe\x7f\x07m\x05\xd3\x00\x06\x00\ +\x0d\x00\x15\x00\x1c\x00$\x00,\x004\x00;\x000@\ +\x18\x03\x06\x0b\x0796*&\x1a\x16\x11\x15\x15\x16&\ +6\x07\x06\x06$14!$\x00/3/3\x12\x17\ +9\x113\x113\x113\x113\x113\x11310\x01\ +767\x17\x06\x07\x05'&'7\x16\x17\x13\x07\x06\ +\x07'667%\x17\x16\x17\x07&'\x01'66\ +73\x06\x07\x01\x07&&'5\x16\x17\x01\x17\x06\x06\ +\x07#67\x017\x16\x17\x15&'\x05\x00\x02\x86\xc0\ +}\xa8\x81\xfc\x22\x10QF\x7f[k+\x04\x8f\xb5|\ ++\xb5F\x03\xdc\x12UA}i^\xfe\x0e\x0a\x13I\ +\x1f\xb2*\x1c\xfdc\x0fF\xc4E\xd3\x8b\x02\xd9\x0a\x11\ +F$\xb2*\x1c\x02\x9b\x0f\xa7\xa9\xdb\x84\x04\x17\x12O\ +F|i^+\x04\x8a\xba|\x99\x8d\xfc\x22\x10TD\ +\x7f\x1ax5)\x02\x95\xb1}\xa8\x81\x04:\x0eG\xc8\ +A\xae\xb0\xfd'\x0b\x12I \xb22\x13\xfdd\x0eB\ +\xbfO\xae\xb0\x02\xd7\x0a,N\xb34\x12\x00\x00\x02\x00\ +!\xfe7\x06\xc5\x07\xa8\x00\x0c\x00 \x00+@\x15\x1c\ +#\x15\x0e\x1e\x11\x09\x02\x06\x00@\x17\x11\x03\x1e\x19N\ +Y\x1e\x10\x12\x00?3+\x00\x18?3\x1a\xde2\xcd\ +2\x11\x1299?10\x01 \x03!\x14\x1632\ +67!\x06\x04\x03#\x01!\x01!\x03\x06\x073\x01\ +!\x03!\x01!\x01#\x136\x03\xe9\xfe;\x10\x01F\ +LXKa\x0c\x01L#\xfe\xed$\x08\xfdj\xfe\x17\ +\x015\x01d\x83\x1a@\x08\x02\x98\x01\xe9\xf3\x01R\xfe\ +\xac\xfe?\x01\x17\xfa\x7f \x06+\x01}]]`Z\ +\xbc\xc1\xfd\xb2\xfc#\x05\xb6\xfd\x9c\x81\xe3\x03\xc8\xfb\x8e\ +\xfc\xf3\x01\xc9\x02^\xa4\x00\x02\x00`\xfe`\x05q\x06\ +V\x00\x1c\x00*\x00/@\x18\x1b\x22' $\x1d@\ +\x02\x00\x16\x0b\x0f\x05\x12GY\x05\x16\x00\x18GY\x00\ +\x15\x00?+\x00\x18?+\x00\x18?3\x129\x1a\xde\ +2\xcd2?10!7#\x06\x06#\x22&54\ +7\x13!\x03\x06\x15\x14\x163267\x13!\x03!\ +\x01!\x13\x03\x22&'!\x14\x163267!\x06\ +\x04\x02\xcb\x14\x08>\xa1m\x8d\x9e\x19\x7f\x01\x83\x81\x13\ +-\x1f;a\x1dt\x01\x83\xb0\x01>\xfe\xbc\xfe{\xdf\ +\x81\xe5\xe8\x08\x01FMWKa\x0c\x01L\x22\xfe\xeb\ +\xbejh\xab\x96j{\x02[\xfd\x97R;,*\x9d\ +\x88\x02'\xfc\xca\xfd)\x01\xa0\x04\xd9\xbc\xc1`Z`\ +Z\xba\xc3\x00\x02\x00!\x00\x00\x04y\x05\xb6\x00\x12\x00\ +\x1b\x00/@\x19\x0f\x1bPY\x0e\x06\x07\x06RY\x0b\ +\x07\x0f\x07\x0f\x07\x04\x09\x03\x04\x13PY\x04\x12\x00?\ ++\x00\x18?\x1299//\x113+\x11\x003+\ +10\x01\x14\x00!!\x13#\x1337!\x073\x03\ +#\x0732\x04\x0132654&##\x04y\ +\xfe\xc9\xfe\xe3\xfd\xfc\xdd\x8b=\x89\x1f\x01\x85\x1f\xea>\ +\xe7\x19\x1d\xec\x01\x06\xfdsMX_I:D\x01\xf8\ +\xec\xfe\xf4\x04\x0e\x01\x1b\x8d\x8d\xfe\xe5v\xdf\xfex_\ +S;H\x00\x02\xff\xfe\xff\xec\x04L\x06\x14\x00\x17\x00\ +$\x007@\x1e\x06\x18JY\x03\x13\x14\x13IY\x00\ +\x14\x0f\x06\x01\x0c\x03\x06\x14\x06\x14\x0c\x16\x00\x0c\x1fJ\ +Y\x0c\x16\x00?+\x00\x18?\x1299//_^\ +]\x113+\x11\x003+10\x01!\x03!\x036\ +32\x16\x15\x14\x04!\x22&547\x13#\x133\ +7!\x03\x22\x07\x06\x15\x14\x1632654&\x02\ +\xaa\x01\x1b:\xfe\xe2RG_\xb4\xd7\xfe\xe6\xfe\xe2\xd5\ +\xeb\x1b}\xee;\xf0)\x01\x83yH1\x16A87\ +H8\x05Z\xfe\xe5\xfe}\x15\xb0\x8e\xcf\xd8\xa4\x9bY\ +p\x02K\x01\x1b\xba\xfb\xb7\x11]\x22#&860\ +;\x00\x02\x00!\x00\x00\x05J\x05\xb6\x00\x0f\x00\x1a\x00\ +&@\x14\x10\x17\x16\x0c\x16OY\x09\x17OY\x03\x0c\ +\x09\x09\x0b\x0c\x03\x0b\x12\x00??\x129/\x129+\ ++\x11\x12\x00910\x01\x14\x06\x07\x17\x07'\x06#\ +#\x03!\x01! \x04\x01654&##\x033\ +'7\x05J\x9b\x8c5\xc0FJ`\x9cd\xfey\x01\ +5\x01\xc5\x01\x13\x01\x1c\xfeE4TJ\x8bHq+\ +\xc0\x04\x00\xa1\xf0@s^\x94\x0d\xfe\x1b\x05\xb6\xdd\xfe\ +\x8d:T:I\xfe\xae^^\x00\x02\xff\xae\xfe\x14\x04\ +\xf6\x04\x81\x00\x18\x00(\x00,@\x18\x1a\x1f'\x0f\x1f\ +GY\x0b\x04\x15\x03\x00\x0f\x10\x09\x0f\x08\x1b\x00'G\ +Y\x00\x16\x00?+\x00\x18???\x12\x179+\x11\ +\x12\x00910\x05\x22&'#\x06\x07\x07!\x01!\ +\x0736632\x16\x15\x14\x02\x07\x17\x07'\x03\x17\ +654&#\x22\x06\x07\x06\x15\x14\x16\x17'\x02\xd3\ +c\x948\x08\x0c,3\xfe}\x01X\x015\x0c\x087\ +\x97l\xb8\xcd\xaa\x8b1\xc79\x15@MIDWt\ +\x22\x0b\xedR\xfe}Qv;y`\x03\ +\x0a\x035\x8d\xfe\xdd\xfe{\x01\x85\x01#\x01\xc5\x00\x00\ +\x01\x00!\xfe\x00\x04\xf8\x05\xb6\x00\x1c\x00-@\x18\x02\ +\x14NY\x02\x02\x18\x19\x19\x1cOY\x19\x03\x0c\x0e\x18\ +\x12\x09\x0eNY\x09\x1c\x00?+\x00\x18?\x129?\ ++\x11\x12\x009\x18/+10\x01632\x00\x11\ +\x14\x02\x04#\x22'\x11\x1632654&#\x22\ +\x07\x03!\x01!\x03!\x02Jl8\xfa\x01\x10\xa5\xfe\ +\xd6\xd3\x9b\x84\x85\x81\x8f\xa1xnM4^\xfey\x01\ +5\x03^C\xfe)\x02\xfc\x12\xfe\xe9\xfe\xfb\xf1\xfe\xa7\ +\xa83\x01B1\xd3\xbes\x83\x0d\xfeB\x05\xb6\xfe\xc1\ +\x00\x00\x01\x00\x17\xfe\x14\x04Z\x04m\x00\x1c\x00-@\ +\x18\x02\x14FY\x02\x02\x18\x19\x19\x1cGY\x19\x0f\x0c\ +\x0e\x18\x15\x09\x0eFY\x09\x1b\x00?+\x00\x18?\x12\ +9?+\x11\x12\x009\x18/+10\x01632\ +\x16\x15\x14\x02\x04#\x22'\x11\x1632654&\ +#\x22\x07\x03!\x13!\x03!\x02\x1d(0\xea\xfb\xa5\ +\xfe\xc9\xcc\xa2vx\x8c\x92\xa3gZ\x1d\x14G\xfe}\ +\xef\x03\x0aC\xfe{\x02o\x08\xe7\xda\xcb\xfe\xce\xa50\ +\x01)6\xb3\xa9Yh\x04\xfe\xb0\x04m\xfe\xc8\x00\x00\ +\x01\xff}\xfe7\x08\x0e\x05\xb6\x00\x15\x00-@\x16\x10\ +#\x13\x00\x0c\x09\x06\x00\x06\x12\x0a\x07\x04\x03\x12\x0dP\ +Y\x12\x15\x02\x12\x00?33+\x00\x18?33\x12\ +99\x1133\x113?10\x01\x01!\x01\x03!\ +\x13\x13!\x03\x01!\x01\x13!\x03!\x13#\x03\x03!\ +\x03\x04\xfe7\xfeB\x02\x10\xc8\x01\x99\xb2\x90\x01\x81\x92\ +\x01\xcb\x01\xb4\xfd\xf8\x83\x01\x00\xa4\xfe\x83e\x96\xb4\x97\ +\xfe~\x02\xcf\xfd1\x02\xf8\x02\xbe\xfdT\x02\xac\xfdT\ +\x02\xac\xfd+\xfeP\xfd\x06\x01\xc9\x02\xcf\xfd1\x00\x00\ +\x01\xff\xe7\xfe`\x08j\x04\x81\x003\x00B@#\x18\ +,',GY\x1d\x02'\x16 $\x05$JY\x09\ +\x05\x05\x07\x22\x15\x1c\x22\x07\x0f\x121\x021GY\x0d\ +\x02\x10\x00?3+\x11\x003\x18???\x129/\ +3+\x11\x003\x18?\x129+\x11\x00310\x13\ +632\x16\x173\x13!\x0336$32\x17\x03\ +&#\x22\x06\x15\x14\x16327\x03!\x13&\x11#\ +\x03!\x13#\x06\x04#\x22'\x13\x1632654\ +#\x22\x07\x85Kt\xc9\xd1\x03\xa8^\x01u^\x959\ +\x01,\xcfMVE3\x19e\x86FG;@\x9a\xfe\ +\x90p\xeb\xac_\xfe\x8c^\x8f:\xfe\xd5\xd1KYF\ +3\x19f\x85b2K\x04^#\xe7\xdc\x01\xaf\xfeQ\ +\xd1\xf2\x0e\xfe\xd3\x08\xe2\x9d]O\x1f\xfd\x1e\x01\xa8\x5c\ +\x01T\xfeH\x01\xb8\xd6\xf6\x0e\x01-\x08\xe8\xaf\x94\x1f\ +\x00\xff\xff\x00\x19\xfd\xf4\x04\xcf\x05\xcb\x02&\x01\xb1\x00\ +\x00\x00\x07\x03\x7f\x01\xa0\x00\x00\xff\xff\x00!\xfd\xf4\x04\ +^\x04\x81\x02&\x01\xd1\x00\x00\x00\x07\x03\x7f\x01\xae\x00\ +\x00\x00\x01\x00!\xfe7\x05\xcb\x05\xb6\x00\x0e\x00#@\ +\x11\x0c#\x08\x05\x00\x05\x0e\x06\x03\x03\x0e\x09PY\x0e\ +\x02\x12\x00?3+\x00\x18?3\x1299\x113?\ +10\x01\x03!\x01!\x03\x01!\x01\x13!\x03!\x13\ +#\x02?\x97\xfey\x015\x01\x87\x91\x01\xcb\x01\xb4\xfd\ +\xf8\x83\x01\x00\xa4\xfe\x83d\x95\x02\xcf\xfd1\x05\xb6\xfd\ +T\x02\xac\xfd+\xfeP\xfd\x06\x01\xc9\x00\x01\x00\x17\xfe\ +`\x05X\x04m\x00\x0e\x00#@\x11\x02\x0e\x09\x0e\x08\ +\x00\x0c\x0f\x08\x03GY\x08\x0b\x15\x06\x22\x00??3\ ++\x00\x18?3\x1299\x11310\x01!\x01\x17\ +!\x03!\x13#\x03\x03!\x13!\x03\x03\xa0\x01\xb8\xfe\ +Dd\x01\x04\x95\xfe\x8fo\x96\xcdp\xfe}\xeb\x01\x83\ +l\x04m\xfd\xc6\xfc\xfd)\x01\xa0\x02\x1f\xfd\xe1\x04m\ +\xfd\xf7\x00\x00\x01\x00!\x00\x00\x06/\x05\xb6\x00\x13\x00\ ++@\x15\x0b\x08\x0c\x06\x0c\x04\x11\x00\x10\x00\x06\x09\x06\ +\x13\x03\x03\x04\x03\x10\x03\x12\x00?3?\x12\x179\x11\ +3\x11\x129\x113\x11\x129910\x01\x07\x03!\ +\x01!\x0337\x133\x07\x13!\x01\x01!\x03\x07#\ +\x02}dq\xfey\x015\x01\x87\x87J!n\x942\ +\xd3\x01\xcb\xfd\xd3\x01\x15\xfeIy3\x95\x027#\xfd\ +\xec\x05\xb6\xfd\x870\x02\x08\xe4\x01%\xfd@\xfd\x0a\x01\ +o\xfa\x00\x00\x01\x00\x17\x00\x00\x05\xc7\x04m\x00\x12\x00\ +\x1a@\x10\x01\x11\x00\x10\x0f\x0a\x09\x06\x08\x05\x0a\x0c\x0d\ +\x0f\x0c\x15\x00??\x12\x17910\x017!\x01\x01\ +!\x03\x07#\x13'\x03!\x13!\x037\x133\x03/\ +\xd5\x01\xc3\xfd\xe9\x01@\xfeM\x91%\x87N@t\xfe\ +}\xeb\x01\x83sqB\x83\x03\x81\xec\xfd\xc6\xfd\xcd\x01\ +\x0c\xb2\x01kn\xfd\xcd\x04m\xfd\xddw\x015\x00\x00\ +\x01\x00!\x00\x00\x06\x0a\x05\xb6\x00\x13\x00+@\x15\x02\ +\x10\x0f\x07\x08\x07OY\x0c\x01\x10\x05\x11\x0a\x08\x08\x05\ +\x0a\x03\x05\x12\x00??\x129/\x129\x12993\ ++\x11\x003\x11310!!\x03\x07\x03!\x13#\ +\x1337!\x073\x03#\x03\x01!\x01\x04\xd9\xfeJ\ +\xb0gd\xfey\xdb\x8dE\x8b\x17\x01\x87\x16`F`\ +=\x01\xfb\x01\xcb\xfd\xbf\x02\x06)\xfe#\x04\x0e\x01@\ +hh\xfe\xc0\xfe\xe8\x02\xc0\xfd#\x00\x00\x01\x00\x17\x00\ +\x00\x05^\x06\x14\x00\x18\x00+@\x15\x15\x0c\x0c\x10\x14\ +\x18\x15\x09\x01\x02\x01LY\x06\x02\x02\x04\x10\x0f\x04\x00\ +\x00??\x129/3+\x11\x003\x18?3\x129\ +\x11310\x01#737!\x073\x07#\x06\x06\ +\x07367\x13!\x01\x01!\x03\x07\x03!\x01\x0a\xa6\ +4\xa5\x1f\x01\x83\x1e\xf13\xf2$(1\x09TE\xf2\ +\x01\xba\xfe\x15\x01\x12\xfeJ\x8beE\xfe}\x04\x8f\xf2\ +\x93\x93\xf2\xae\xbf\x84\x7fI\x01\x07\xfe\x00\xfd\x93\x01\x87\ +5\xfe\xae\x00\x01\x00\x9c\x00\x00\x06\x91\x05\xb6\x00\x0c\x00\ +\x1c@\x0f\x01\x00\x06\x05\x04\x08\x0b\x0b\x0aNY\x0b\x03\ +\x08\x12\x00??+\x11\x12\x00\x17910\x01\x01!\ +\x01\x13!\x03\x03!\x13!\x13!\x03\x12\x01\xcb\x01\xb4\ +\xfd\xf8\xdf\xfeR\xb4\x97\xfex\xf2\xfe\xc3E\x02\xc3\x03\ +\x0a\x02\xac\xfd+\xfd\x1f\x02\xcf\xfd1\x04s\x01C\x00\ +\x01\x00B\x00\x00\x05\xcb\x04m\x00\x0c\x00\x1b@\x0e\x04\ +\x03\x09\x08\x04\x01\x0b\x15\x01\x00FY\x01\x0f\x00?+\ +\x00\x18?\x12\x17910\x13\x13!\x03\x01!\x01\x13\ +!\x03\x03!\x13B=\x02ym\x01\x87\x01\xb9\xfeC\ +\xe4\xfeX\xcdq\xfe}\xae\x03J\x01#\xfd\xf7\x02\x09\ +\xfd\xc6\xfd\xcd\x02\x1f\xfd\xe1\x03J\x00\x00\x01\x00!\xfe\ +7\x05\xc1\x05\xb6\x00\x0f\x00$@\x13\x0c\x07NY\x0c\ +\x0c\x05\x0e\x0a\x03\x05\x00PY\x05\x09\x12\x03#\x00?\ +?3+\x00\x18?3\x129/+10\x013\x03\ +!\x13!\x13!\x03!\x01!\x03!\x13!\x04\xcb\xf6\ +\xa4\xfe\x83d\xff\x00}\xfe\xa6\x7f\xfey\x015\x01\x87\ +p\x01\x5cp\x01\x88\x011\xfd\x06\x01\xc9\x02T\xfd\xac\ +\x05\xb6\xfd\xe2\x02\x1e\x00\x00\x01\x00\x17\xfe`\x05X\x04\ +m\x00\x0f\x00$@\x13\x01\x0cIY\x01\x01\x0a\x03\x0f\ +\x0f\x0a\x05GY\x0a\x0e\x15\x08\x22\x00??3+\x00\ +\x18?3\x129/+10\x01\x033\x13!\x03!\ +\x03!\x13!\x13#\x03!\x13\x02\x8bV\xddX\x01\x84\ +\xaf\x01\x19\x95\xfe\x8ff\xfe\xc3\x5c\xdf^\xfe}\xf1\x04\ +m\xfef\x01\x9a\xfc\xca\xfd)\x01\xa0\x01\xb8\xfeH\x04\ +m\x00\x01\x00!\x00\x00\x07\x02\x05\xb6\x00\x0d\x00#@\ +\x12\x0b\x06NY\x0b\x0b\x08\x0d\x0d\x02NY\x0d\x09\x03\ +\x04\x08\x12\x00?3?3+\x11\x12\x009\x18/+\ +10\x01\x03!\x03!\x13!\x03!\x01!\x03!\x13\ +\x07\x02H\xfe\xc3\xf2\xfey}\xfe\xa6\x7f\xfey\x015\ +\x01\x87p\x01\x5cp\x05\xb6\xfe\xbd\xfb\x8d\x02T\xfd\xac\ +\x05\xb6\xfd\xe2\x02\x1e\x00\x00\x01\x00\x17\x00\x00\x06\x0c\x04\ +m\x00\x0d\x00#@\x12\x0b\x06IY\x0b\x0b\x08\x0d\x0d\ +\x02FY\x0d\x09\x0f\x04\x08\x15\x00?3?3+\x11\ +\x12\x009\x18/+10\x01\x03!\x03!\x13#\x03\ +!\x13!\x033\x13\x06\x0c=\xfe\xe1\xb2\xfe}\x5c\xdf\ +^\xfe}\xf1\x01\x83V\xddX\x04m\xfe\xdd\xfc\xb6\x01\ +\xb8\xfeH\x04m\xfef\x01\x9a\x00\x01\x00!\xfe\x00\x07\ +\xd9\x05\xb6\x00\x1e\x00/@\x19\x02\x14NY\x02\x02\x1c\ +\x1d\x1d\x1aNY\x1d\x03\x0c\x18\x0e\x1c\x12\x09\x0eNY\ +\x09\x1c\x00?+\x00\x18?\x1299?+\x11\x12\x00\ +9\x18/+10\x01632\x00\x11\x14\x02\x04#\ +\x22'\x11\x1632654&#\x22\x07\x03!\x13\ +!\x03!\x01!\x05-h:\xfa\x01\x10\xa3\xfe\xd2\xd1\ +\x9c\x82\x85\x81\x8e\xa1xnK4^\xfey\xee\xfe\xa6\ +\xf0\xfey\x015\x04k\x02\xfc\x12\xfe\xe9\xfe\xfb\xf2\xfe\ +\xa9\xa93\x01B1\xd4\xbds\x83\x0d\xfeB\x04s\xfb\ +\x8d\x05\xb6\x00\x01\x00\x17\xfe\x14\x06\xbe\x04m\x00\x1e\x00\ +2@\x1a\x17\x04\x19\x08\x14\x19FY\x14\x1b\x0d\x00F\ +Y\x0d\x0d\x08\x09\x09\x06IY\x09\x0f\x08\x15\x00??\ ++\x11\x12\x009\x18/+\x00\x18?+\x11\x12\x009\ +910\x01\x22\x07\x03!\x13#\x03!\x13!\x036\ +32\x16\x15\x14\x02\x04#\x22'\x11\x163265\ +4&\x04w\x1f\x12H\xfe}\xb2\xdf\xb4\xfe}\xf1\x03\ +\xe6m(0\xec\xf9\xa5\xfe\xc9\xcb\xa3vx\x8c\x92\xa3\ +f\x01T\x04\xfe\xb0\x03R\xfc\xae\x04m\xfe\x02\x08\xe8\ +\xd9\xcb\xfe\xce\xa50\x01)6\xb3\xa9Zg\x00\x02\x00\ +h\xff\xac\x06\x12\x05\xcd\x00\x09\x008\x008@\x1d\x00\ +\x18\x05\x10\x05RY\x10\x10$++0NY+\x04\ +\x1e\x18QY\x1e$$7OY$\x13\x00?+\x00\ +\x18\x10\xc4+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x00910\x016654#\x22\x06\x15\x14\x05\ +&&54\x1232\x16\x15\x14\x02\x07\x16327\ +\x11\x06\x06#\x22&'\x06\x06# \x00\x11\x10\x12$\ +32\x17\x03&#\x22\x06\x02\x15\x14\x1632\x04'\ +K[T8?\xfe\xfe\x1e&\xfc\xd7\xb2\xd1\x9b\x83\x16\ +3AW\x16t;f\xb2>-\x9c?\xfe\xe4\xfe\xd2\ +\xd1\x01b\xe6\x8et`E]s\xb6d`V2\x01\ +\x984\xa3Iu\x80t\x5c\xae-\x9bM\xf0\x01\x14\xd1\ +\xb4\x8a\xfe\xfda\x06\x1a\xfe\xde\x09\x1271\x10\x18\x01\ +%\x01\x14\x01\x0a\x01\xbc\xe2!\xfe\xc5\x18\x9f\xfe\xe5\xa6\ +}\x89\x00\x00\x02\x00T\xff\xb0\x059\x04\x81\x00\x0b\x00\ +7\x008@\x1d\x06\x00\x19\x11\x00LY\x11\x11$+\ ++0IY+\x10\x1f\x19JY\x1f$$6IY\ +$\x16\x00?+\x00\x18\x10\xc4+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x00910\x01\x22\x06\x15\x14\ +\x16\x176654&\x01&54632\x16\x15\ +\x14\x06\x07\x163267\x11\x06#\x22&'\x06#\ +\x22&54\x12$32\x17\x03&#\x22\x06\x06\x15\ +\x1432\x03\xdb*6\x14\x17>E+\xfe\x8f#\xce\ +\xba\x96\xb1gW\x12\x15+O\x11YpX\xae3f\ +\xa8\xdd\xec\x9f\x01'\xbfaIR8?=e?q\ ++\x02XEH\x14I \x19a6.,\xfe\xb2P\ +`\xbd\xd7\xa8\x8dp\xbd.\x06\x0d\x08\xfe\xfe\x1b2,\ +\x22\xed\xe1\xcd\x01F\xb4\x17\xfe\xee\x12n\xcem\xbf\xff\ +\xff\x00h\xfd\xf4\x05R\x05\xcd\x02&\x00&\x00\x00\x00\ +\x07\x03\x7f\x02\x1f\x00\x00\xff\xff\x00T\xfd\xf4\x04!\x04\ +\x81\x02&\x00F\x00\x00\x00\x07\x03\x7f\x01\xb4\x00\x00\x00\ +\x01\x00\x9c\xfe7\x04\xe5\x05\xb6\x00\x0b\x00\x1f@\x10\x0b\ +\x07\x08\x07NY\x08\x03\x05\x00PY\x05\x12\x03#\x00\ +??+\x00\x18?+\x11\x00310\x013\x03!\ +\x13!\x13!\x13!\x03!\x02\xb2\xf6\xa4\xfe\x83e\xff\ +\x00\xed\xfe\xc3E\x04\x04G\xfe\xc2\x011\xfd\x06\x01\xc9\ +\x04s\x01C\xfe\xbd\x00\x00\x01\x00\x17\xfe`\x07P\x04\ +\x81\x005\x003@\x1a.\x22\x1c\x15\x15\x19\x12\x03\x0d\ +\x19\x0dGY \x19\x10\x13\x0f/*IY\x08/\x12\ +\x15\x00?33+\x00\x18??3+\x11\x003\x11\ +\x129\x113\x18?10\x014&#\x22\x06\x07\x03\ +!\x13654#\x22\x06\x07\x03!\x13!\x0736\ +632\x16\x1736632\x16\x15\x14\x07\x07\x06\ +\x15\x14327\x03!\x13&547\x136\x05\x81\ +& J[\x1fo\xfe}\x83\x0fHD[ v\xfe\ +}\xef\x015\x10\x08=\x98su\x7f\x1a\x08A\xa8o\ +\x8d\x92\x16%\x0fH\x1e,\x94\xfe\x90n\x8d\x124\x0e\ +\x02\xfc(*\x98\x97\xfd\xe1\x02wZ\x1f^\x95\x92\xfd\ +\xd9\x04m\xbbr]kdje\xa9\xa5di\xa8H\ +\x18=\x0c\xfd3\x01\xa2,\xbb7S\x01\x048\x00\xff\ +\xff\x00\xa4\x00\x00\x05}\x05\xb6\x02\x06\x00<\x00\x00\x00\ +\x01\x00X\xfe\x14\x04\xd1\x04m\x00\x0e\x00\x16@\x0a\x07\ +\x0c\x02\x03\x0f\x0e\x02\x15\x01\x1b\x00??3?\x129\ +910\x01!\x13\x03!\x13\x14\x073>\x02\x13!\ +\x01\x02\x06\xfe}f\x91\x01\x81\x1b\x08\x08\x01\x22&\xf6\ +\x01\x9e\xfd\x9c\xfe\x14\x01\xec\x04m\xfd\xa5I-\x0eb\ +R\x02\x0f\xfb\x93\x00\x01\x00'\x00\x00\x05}\x05\xb6\x00\ +\x10\x00%@\x12\x07\x0b\x0c\x0bOY\x00\x01\x04\x04\x0c\ +\x0c\x09\x01\x0f\x03\x09\x12\x00??3\x129/3\x11\ +\x129+\x11\x00310\x01\x01!\x01\x07!\x03!\ +\x07!7!\x13!7\x03!\x02\x91\x018\x01\xb4\xfd\ +\x9c\x09\x01!E\xfe\xe1-\xfey-\xfe\xe1C\x01\x1f\ +\x08\xed\x01\x93\x03\x98\x02\x1e\xfc\x81 \xfe\xc0\xd7\xd7\x01\ +@ \x03\x7f\x00\x00\x01\xff\xaa\xfe\x14\x04\xd1\x04m\x00\ +\x14\x00!@\x10\x0d\x12\x07\x09\x0f\x02\x06\x07\x06FY\ +\x14\x07\x15\x04\x1b\x00??3+\x11\x003\x18?\x12\ +9910!\x03!\x07!7!\x13!\x03!\x13\ +\x14\x073>\x02\x13!\x01\x03o>\xfe\xfe)\xfe}\ +)\xfe\xfe=\x01\x02\x91\x01\x81\x1b\x08\x08\x01\x22&\xf6\ +\x01\x9e\xfd\x9c\xfe\xdd\xc9\xc9\x01#\x04m\xfd\xa5I-\ +\x0ebR\x02\x0f\xfb\x93\x00\x01\xff\x83\xfe7\x05\xe7\x05\ +\xb6\x00\x0f\x00\x1d@\x11\x05\x00PY\x0d\x0c\x0f\x06\x05\ +\x05\x08\x0a\x03\x08\x12\x03#\x00???\x12\x179+\ +10\x01!\x03!\x13#\x03\x01!\x01\x03!\x13\x01\ +!\x01\x04f\x01>\xa4\xfe\x83d\xc4\x92\xfe\xae\xfeD\ +\x023\xdf\x01\xa0{\x015\x01\xc0\xfd\xe6\x011\xfd\x06\ +\x01\xc9\x01\xf2\xfe\x0e\x03\x08\x02\xae\xfe+\x01\xd5\xfd+\ +\x00\x00\x01\xff\x89\xfe`\x05\x0a\x04m\x00\x0f\x00\x1f@\ +\x11\x0d\x22\x0f\x0aGY\x07\x06\x09\x00\x0f\x05\x02\x04\x0f\ +\x02\x15\x00??\x12\x179+\x00\x18?10\x01\x03\ +!\x01\x03!\x13\x13!\x01\x17!\x03!\x13#\x02!\ +\xd3\xfe;\x01\xd9\xcf\x01\xa6L\xba\x01\xcb\xfe/e\x01\ +3\x96\xfe\x90n\xc8\x01H\xfe\xb8\x02B\x02+\xfe\xc6\ +\x01:\xfd\xc0\xf6\xfd)\x01\xa0\x00\x01\x00\x9c\xfe7\x06\ +\xb2\x05\xb6\x00\x0f\x00%@\x13\x0a\x06\x0f\x06NY\x0f\ +\x12\x0d#\x05\x01\x02\x01NY\x08\x02\x03\x00?3+\ +\x11\x003\x18??+\x11\x00310\x01!\x13!\ +\x03!\x03!\x13!\x033\x03!\x13!\x01\xd9\xfe\xc3\ +E\x03\xcbH\xfe\xfc\xac\x01\x85\xf2\x01\x87\xf6\xf6\xa4\xfe\ +\x83e\xfb\xf3\x04s\x01C\xfe\xbd\xfc\xd1\x04r\xfb{\ +\xfd\x06\x01\xc9\x00\x00\x01\x00B\xfe`\x05\x93\x04m\x00\ +%\x00+@\x17#\x1f \x1fFY\x07\x15\x12\x03\x18\ + \x0f\x0d\x03\x18\x03GY\x18\x16\x11\x22\x00??+\ +\x11\x003\x18?\x12\x179+\x11\x00310\x01\x14\ +\x163267\x13!\x03\x06\x15\x14327\x03!\ +\x13&'#\x06\x06#\x22&547\x13#\x13!\ +\x03#\x03\x06\x02f3%Hz\x1ct\x01\x83\x91\x0e\ +G\x1e,\x93\xfe\x8fwY\x10\x08D\xafs\x99\xa9\x19\ +?\xf5=\x03;=\xc3A\x13\x01w,*\x9e\x87\x02\ +'\xfdQC\x1d=\x0c\xfd3\x01\xbf(wjh\xab\ +\x96ov\x018\x01#\xfe\xdd\xfe\xbaR\x00\x00\x01\x00\ +\x93\xfe7\x05\xa0\x05\xb6\x00\x1a\x00\x22@\x12\x07\x14N\ +Y\x07\x07\x04\x18\x0d\x03\x04\x1aPY\x04\x12\x02#\x00\ +??+\x00\x18?3\x129/+10\x01\x03!\ +\x13!\x13\x06#\x22&547\x13!\x03\x06\x15\x14\ +\x163267\x13!\x03\x05\xa0\xa4\xfe\x83d\xff\x00\ +s\x98\xc2\xad\xbc\x0dh\x01\x89b\x0aK<6{6\ +\x81\x01\x88\xf2\x011\xfd\x06\x01\xc9\x02\x17T\xb5\xa71\ +J\x02\x1c\xfe\x17. ;>& \x02j\xfb{\x00\ +\x01\x00\x85\xfe`\x05\x04\x04m\x00\x1d\x00\x22@\x12\x13\ +\x03GY\x13\x13\x0e\x07\x1a\x0f\x0e\x09GY\x0e\x15\x0c\ +\x22\x00??+\x00\x18?3\x129/+10\x01\ +\x14\x1632677!\x033\x03!\x13!\x13#\ +\x06\x06#\x22&5466\x13!\x03\x06\x02\x12-\ +\x1fHT\x1d-\x01\x83\xae\xeb\x95\xfe\x8fd\xfe\xf2V\ +\x0a=xG\x83\x9c\x08\x0cB\x01\x839\x13\x02\xc7,\ +*\x99\x8c\xd7\xfc\xca\xfd)\x01\xa0\x01\x9c5,\x9c\x81\ +\x1fXU\x01I\xfe\xe7R\x00\x00\x01\x00\x93\x00\x00\x05\ +\x9c\x05\xb6\x00\x1b\x00'@\x14\x14\x0f\x11\x03\x0e\x08\x02\ +\x0eNY\x1a\x00\x17\x02\x02\x08\x17\x12\x08\x03\x00??\ +\x129/\x1293+\x11\x12\x00\x17910%\x13\ +#\x22&547\x13!\x03\x06\x15\x14\x17\x133\x03\ +67\x13!\x01!\x13\x06\x07\x03\x01\xe7B-\xad\xbc\ +\x0dh\x01\x89b\x0aLC\x98BQ8\x81\x01\x88\xfe\ +\xce\xfeys7XH\x8d\x016\xb5\xa71J\x02\x1c\ +\xfe\x17. U\x1c\x018\xfe\xcc\x17#\x02j\xfaJ\ +\x02\x17 \x1a\xfe\xb0\x00\x00\x01\x00\x89\x00\x00\x04\xfc\x04\ +m\x00\x1e\x00'@\x14\x12\x10\x16\x03\x09\x0f\x03\x0fG\ +Y\x1d\x00\x19\x03\x03\x09\x19\x15\x09\x0f\x00??\x129\ +/\x1293+\x11\x12\x00\x17910%7\x06#\ +\x22&547\x13!\x03\x06\x15\x14\x1773\x076\ +67\x13!\x03!\x13#\x06\x07\x07\x01\xcb) &\ +\x85\xa0\x1b7\x01\x839\x13'6\x915'5\x14>\ +\x01\x83\xf0\xfe}V\x0a\x1c*3\x7f\xc0\x04\xa6\x85w\ +\x85\x01\x0b\xfe\xe7R;6\x14\xf0\xee\x13h`\x01\x13\ +\xfb\x93\x01\x9c\x1b\x17\xeb\x00\x01\x00!\x00\x00\x05)\x05\ +\xb6\x00\x16\x00\x18@\x0c\x03\x10NY\x03\x03\x15\x16\x03\ +\x0a\x15\x12\x00?3?\x129/+10\x01\x036\ +32\x16\x15\x14\x07\x03!\x13654&#\x22\x06\ +\x07\x03!\x01\x02\xd9s\x9e\xbd\xb1\xb7\x0ci\xfewb\ +\x0bL<6{6\x81\xfey\x011\x05\xb6\xfd\xeaT\ +\xb7\xa58C\xfd\xe3\x01\xe93\x1b;>%!\xfd\x96\ +\x05\xb6\x00\x00\x01\x00\x17\x00\x00\x04X\x04m\x00\x17\x00\ +\x18@\x0c\x0e\x03GY\x0e\x0e\x08\x09\x0f\x15\x08\x15\x00\ +?3?\x129/+10\x014&#\x22\x06\x07\ +\x07!\x13!\x033632\x16\x15\x14\x07\x03!\x13\ +6\x02\xcb-\x1f@U#-\xfe}\xef\x01\x83V\x0a\ +n\x8e\x85\x9a\x1b;\xfe}9\x13\x01\xa6++\x83\xa2\ +\xd7\x04m\xfed`\x9d\x80sz\xfe\xd9\x01\x19R\x00\ +\x02\x00V\xff\xec\x06\x9e\x05\xcd\x00!\x00*\x001@\ +\x19\x0d!%!QY\x11\x17\x17%%\x09\x1a\x1a\x22\ +NY\x1a\x04\x09\x03NY\x09\x13\x00?+\x00\x18?\ ++\x11\x12\x009\x18/3\x113+\x11\x00310\ +\x01\x14\x16327\x11\x06\x06# \x00\x115$\x11\ +47!\x06\x06\x15\x14\x17\x12\x00!2\x16\x15\x14\x00\ +!#\x01\x22\x06\x0732654\x03je^\xba\ +\xc3P\xbd\xa1\xfe\xfb\xfe\xe8\xfewJ\x011\x10\x1dn\ +P\x01\x86\x01\x06\xcb\xe5\xfez\xfe\x96D\x01JT\xa1\ +\x1f`\x86\x97\x02)w\x83F\xfe\xbc$!\x01+\x01\ +\x0e/4\x01\x16ho\x19Q&S\x15\x01\x14\x01<\ +\xcd\xb2\xf7\xfe\xf7\x02;\x9fu]Ub\x00\x00\x02\x00\ +\x19\xff\xec\x05\x7f\x04\x81\x00#\x00-\x005@\x1b \ +\x1d\x03\x1a'\x1aLY\x09\x10\x10''\x00\x13\x13$\ +JY\x13\x10\x00\x1dIY\x00\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/3\x113+\x11\x003\x129\ +10\x05\x22&5&&54673\x06\x06\x15\ +\x14\x16\x176\x0032\x16\x15\x14\x04!#\x15\x143\ +267\x11\x06\x06\x13\x22\x06\x0732654&\ +\x03\x1f\xd6\xeb\x9d\xa8\x1f\x22\xfc\x0f\x1e'->\x01E\ +\xe7\xbe\xda\xfe\xc6\xfe\xda<\xa4O\x98ap\xc2\x1f;\ +h\x0f\x1dm|(\x14\xf0\xd4\x0f\x8fw6Y3\x19\ +=%.6\x0e\xe7\x01\x00\xac\x8f\xcb\xd5\x10\x94/3\ +\xfe\xee9-\x03\x8f\x84_SD ,\x00\x00\x02\x00\ +V\xfe7\x06\x9e\x05\xcd\x00%\x00.\x00:@\x1e\x16\ +\x1c\x1c)\x12\x00)\x00QY))\x09\x1f\x1f&N\ +Y\x1f\x04\x0b#\x0c\x09\x09\x04OY\x09\x13\x00?+\ +\x11\x003\x18??+\x11\x12\x009\x18/+\x11\x00\ +3\x113\x11310\x01\x15\x14\x16327\x11\x06\ +\x07\x03!\x13&\x025577$\x1147!\x06\ +\x06\x15\x14\x17\x12\x00!2\x16\x15\x14\x00!\x01\x22\x06\ +\x0732654\x03je^\xba\xc3r\xa5\x5c\xfe\ +\x83k\x9f\xa7\x01\x01\xfeuJ\x011\x10\x1dnP\x01\ +\x86\x01\x06\xcb\xe5\xfez\xfe\x96\x01\x06T\xa1\x1f`\x86\ +\x97\x02N%w\x83F\xfe\xbc3\x0e\xfeG\x01\xd97\ +\x01\x14\xca\x0d\x10\x125\x01\x15ho\x19Q&S\x15\ +\x01\x14\x01<\xcd\xb2\xf7\xfe\xf7\x02;\x9fu]Ub\ +\x00\x00\x02\x00\x19\xfe`\x05\x7f\x04\x81\x00%\x00/\x00\ +8@\x1d \x1d\x03\x1a)\x1aLY\x09\x10\x10))\ +\x13%\x22#\x1dJY\x00#\x16\x13&JY\x13\x10\ +\x00?+\x00\x18?3+\x00\x18?\x129/3\x11\ +3+\x11\x003\x12910%&&5&&5\ +4673\x06\x06\x15\x14\x16\x176\x0032\x16\x15\ +\x14\x04!#\x15\x143267\x11\x06\x07\x03!\x01\ +\x22\x06\x0732654&\x02u\x88\x8f\x9d\xa8\x1f\ +\x22\xfc\x0f\x1e'->\x01E\xe7\xbe\xda\xfe\xc6\xfe\xda\ +<\xa4O\x98a\x84zN\xfe\x8f\x01\xaa;h\x0f\x1d\ +m|(\x02*\xdd\xa7\x0f\x8fw6Y3\x19=%\ +.6\x0e\xe7\x01\x00\xac\x8f\xcb\xd5\x10\x94/3\xfe\xee\ +D\x14\xfef\x05\x1b\x84_SD ,\x00\xff\xff\xff\ +\xb6\x00\x00\x03\xd9\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\xff\ +}\x00\x00\x08\x0e\x07\xa8\x02&\x01\xb0\x00\x00\x01\x07\x02\ +6\x01\x5c\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\xff\ +\xff\xff\xe7\xff\xec\x08j\x06V\x02&\x01\xd0\x00\x00\x01\ +\x07\x026\x01\xa0\x00\x00\x00\x08\xb3\x014\x11&\x00+\ +5\x00\x01\x00!\xfe\x00\x05\xcb\x05\xb6\x00\x1b\x00(@\ +\x15\x19\x12PY\x00\x19\x19\x16\x1a\x17\x03\x0a\x0c\x16\x12\ +\x07\x0cNY\x07\x1c\x00?+\x00\x18?\x129?3\ +\x129/3+10\x01\x16\x12\x15\x14\x02\x04#\x22\ +'\x11\x1632654&#\x22\x07\x03!\x01!\ +\x03\x01!\x03\xd3\xa9\xb3\xa3\xfe\xd2\xd1\x9c\x82\x85\x81\x8e\ +\xa1\x8d{QE^\xfey\x015\x01\x87\x91\x01\xcb\x01\ +\xb4\x02\xf81\xfe\xf6\xcb\xf2\xfe\xa9\xa93\x01B1\xd4\ +\xbdz\x88\x12\xfe;\x05\xb6\xfdT\x02\xac\x00\x00\x01\x00\ +\x17\xfe\x14\x05X\x04m\x00\x1a\x00-@\x17\x13\x04\x15\ +\x10\x15FY\x10\x1b\x0a\x07\x07\x00FY\x07\x07\x04\x08\ +\x05\x0f\x04\x15\x00??3\x129/+\x11\x003\x18\ +?+\x11\x12\x00910\x01\x22\x07\x03!\x13!\x03\ +\x01!\x01\x16\x16\x15\x10\x00!\x22'\x11\x16326\ +54&\x02wYG=\xfe}\xeb\x01\x83l\x01\x87\ +\x01\xb8\xfe7\x84\x99\xfe\xbc\xfe\xd5\x96liw\x83\x87\ +]\x019\x1e\xfe\xe5\x04m\xfd\xf7\x02\x09\xfd\xd01\xe1\ +\x9a\xfe\xcd\xfe\xb60\x01)6\xa4\x9c[g\x00\x01\xff\ +\xa4\xfe7\x06\x1d\x05\xb6\x00\x1a\x00$@\x14\x18\x06O\ +Y\x18\x03\x0c\x12OY\x0c\x12\x04\x1aNY\x04\x12\x02\ +#\x00??+\x00\x18?+\x00\x18?+10\x01\ +\x01!\x01!\x13#\x02\x07\x0e\x02#\x22'\x11\x16\x16\ +32667\x12\x13!\x03\x06\x1d\xfe\xac\xfe?\x01\ +\x17\xfe\xdf\xf0\xc7\xa25H\x8b\xb3\x8bQJ-&\x13\ +5>@\x22f\xb1\x03\xc0\xeb\x01D\xfc\xf3\x01\xc9\x04\ +\x7f\xfd\xac}\xb2\xbcT\x1a\x011\x0f\x05,cV\x01\ +\x01\x02\xad\xfb\x8e\x00\x01\xff\xdb\xfe`\x05\xd1\x04\x81\x00\ + \x00$@\x14\x1c\x07FY\x1c\x10\x0f\x14GY\x0f\ +\x16\x04 GY\x04\x15\x02\x22\x00??+\x00\x18?\ ++\x00\x18?+10\x01\x01!\x13!\x13&#\x22\ +\x06\x06\x07\x0e\x02#\x22'\x11\x163267>\x03\ +32\x16\x17\x03\x05\xd1\xfe\xbc\xfe{\xdf\xfe\xea\xb2\x1b\ +\x1cIVO1\xfe\xbc\xfe{\xdf\xfe\xea\x01\ +\xb8\xfeH\x04m\xfef\x01\x9a\xfc\xca\xfd)\x01\xa0\x00\ +\x01\x00\x93\xfe7\x05\x9c\x05\xb6\x00\x1a\x00&@\x13\x19\ +#\x03\x10NY\x03\x03\x09\x17\x17\x1aPY\x17\x12\x14\ +\x09\x03\x00?3?+\x11\x12\x009\x18/+\x00\x18\ +?10\x017\x06#\x22&547\x13!\x03\x06\ +\x15\x14\x163267\x13!\x01!\x03!\x13\x03%\ +1\x98\xc2\xad\xbc\x0dh\x01\x89b\x0aK<6{6\ +\x81\x01\x88\xfe\xce\xfe\xe0c\xfe\x83\xa4\x011\xe6T\xb5\ +\xa71J\x02\x1c\xfe\x17. ;>& \x02j\xfa\ +J\xfe7\x02\xfa\x00\x01\x00\xa2\xfe`\x04\xc7\x04m\x00\ +\x1b\x00&@\x13\x1a\x22\x05\x12GY\x05\x05\x0b\x18\x18\ +\x1bGY\x18\x15\x15\x0b\x0f\x00?3?+\x11\x12\x00\ +9\x18/+\x00\x18?10\x017#\x06\x06#\x22\ +&5477!\x06\x06\x15\x14\x1632\x137!\ +\x03!\x03!\x13\x02\x96+\x0b.\x8bWu\x8f\x18!\ +\x01\x830\x05-\x1fwA\x17\x01\x83\xf0\xfe\xc3T\xfe\ +\x8f\xb2\x017\xcb(8\xa7~\x8cv\xa4\xf67\x13+\ ++\x01%q\xfb\x93\xfe`\x02\xd7\x00\x00\x01\x00!\xfe\ +7\x07\xac\x05\xb6\x00\x18\x00!@\x13\x04\x18NY\x08\ +\x0d\x16\x0d\x14\x04\x0b\x05\x11\x12\x03\x11\x12\x02#\x00?\ +??\x12\x179\x113+10\x01\x01!\x01#\x13\ +677#\x01!\x11#\x02\x07\x03!\x01!\x113\ +\x01!\x03\x07\xac\xfe\xac\xfe@\x01\x16\xf6u2:\x0f\ +\x08\xfe\x1e\xfe\x8e\x08C\x13q\xfe\xa4\x015\x02\x06\x08\ +\x01\xde\x02\x0e\xf6\x01D\xfc\xf3\x01\xc9\x02%\xe4\xd0@\ +\xfb\xe7\x04\x19\xfe__\xfd\xe7\x05\xb6\xfb\xf2\x04\x0e\xfb\ +\x8e\x00\x01\x00!\xfe`\x07^\x04m\x00\x19\x00#@\ +\x13\x13\x22\x15\x10GY\x00\x05\x0e\x05\x0c\x15\x03\x05\x09\ +\x0a\x0f\x09\x15\x00??\x12\x179\x113+\x00\x18?\ +10\x01#\x01!\x03#\x02\x07\x03!\x13!\x133\ +\x01!\x03!\x01!\x13!\x13676\x05\x14\x08\xfe\ +\xa6\xfe\x96/\x09\x22\x1bH\xfe\x96\xef\x02\x00/\x09\x01\ +l\x02\x1d\xb0\x01=\xfe\xbd\xfe{\xdf\xfe\xfeG\x1c\x22\ +\x17\x02\xcf\xfd1\x02\xcf\xfe\xeau\xfe\xbc\x04m\xfd\x1c\ +\x02\xe4\xfc\xca\xfd)\x01\xa0\x01L\x82\x86^\xff\xff\xff\ +\xb6\x00\x00\x03\xd9\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\xff\ +\x87\x00\x00\x05\xa2\x07\xa8\x02&\x00$\x00\x00\x01\x07\x02\ +6\x00m\x01R\x00\x08\xb3\x02\x10\x05&\x00+5\xff\ +\xff\x00T\xff\xec\x04\xfb\x06V\x02&\x00D\x00\x00\x01\ +\x06\x026\xc6\x00\x00\x08\xb3\x02 \x11&\x00+5\xff\ +\xff\xff\x87\x00\x00\x05/\x07u\x02&\x00$\x00\x00\x01\ +\x07\x00j\x00\x87\x01R\x00\x0a\xb4\x03\x02 \x05&\x00\ ++55\xff\xff\x00T\xff\xec\x04\xc5\x06#\x02&\x00\ +D\x00\x00\x01\x06\x00j\xe6\x00\x00\x0a\xb4\x03\x020\x11\ +&\x00+55\xff\xff\xff\x83\x00\x00\x07\xcd\x05\xb6\x02\ +\x06\x00\x88\x00\x00\xff\xff\x00T\xff\xec\x06\xcf\x04\x81\x02\ +\x06\x00\xa8\x00\x00\xff\xff\x00!\x00\x00\x05,\x07\xa8\x02\ +&\x00(\x00\x00\x01\x07\x026\xff\xf7\x01R\x00\x08\xb3\ +\x01\x0c\x05&\x00+5\xff\xff\x00T\xff\xec\x05,\x06\ +V\x02&\x00H\x00\x00\x01\x06\x026\xf7\x00\x00\x08\xb3\ +\x02\x22\x11&\x00+5\x00\x02\x00!\xff\xec\x04\xdf\x05\ +\xcd\x00\x17\x00 \x00&@\x14\x16\x1cQY\x16\x16\x10\ +\x09\x10\x18NY\x10\x13\x09\x03NY\x09\x04\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x014&\ +#\x22\x06\x07\x1163 \x00\x11\x10\x02\x04#\x22&\ +54\x00!3\x01267#\x22\x06\x15\x14\x03T\ +rgM\xa5u\xc0\xef\x01\x01\x01\x1b\xcb\xfe\xa0\xe3\xca\ +\xe6\x01\x87\x01hD\xfe\xb6U\xa2\x1ea\x87\x95\x03\x8f\ +{\x7f\x1c)\x01CF\xfe\xd7\xfe\xef\xff\x00\xfeG\xee\ +\xca\xb4\xf9\x01\x07\xfd\xc5\xa1t`Sb\x00\x00\x02\x00\ +-\xff\xec\x04N\x04\x81\x00\x17\x00!\x00&@\x14\x0d\ +\x1cLY\x0d\x0d\x07\x00\x07\x18JY\x07\x16\x00\x11I\ +Y\x00\x10\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++10\x012\x16\x15\x14\x02\x04#\x22&54$\ +!354#\x22\x06\x07\x1166\x03267#\ +\x22\x06\x15\x14\x16\x02\x8d\xd5\xec\xa7\xfe\xdd\xbf\xbc\xdc\x01\ +:\x01&<\xa4K\x91lj\xc7\x1e;h\x0f\x1dk\ +~(\x04\x81\xee\xd2\xd3\xfe\xad\xaf\xaa\x91\xcb\xd5\x10\x93\ +)9\x01\x1360\xfcq\x84_TD +\x00\xff\ +\xff\x00!\xff\xec\x04\xdf\x07u\x02&\x02\xe1\x00\x00\x01\ +\x07\x00j\x00\x19\x01R\x00\x0a\xb4\x03\x021\x05&\x00\ ++55\xff\xff\x00-\xff\xec\x04c\x06#\x02&\x02\ +\xe2\x00\x00\x01\x06\x00j\xbb\x00\x00\x0a\xb4\x03\x022\x11\ +&\x00+55\xff\xff\xff}\x00\x00\x08\x0e\x07u\x02\ +&\x01\xb0\x00\x00\x01\x07\x00j\x01\xa4\x01R\x00\x0a\xb4\ +\x02\x01\x22\x05&\x00+55\xff\xff\xff\xe7\xff\xec\x08\ +j\x06#\x02&\x01\xd0\x00\x00\x01\x07\x00j\x01\xe1\x00\ +\x00\x00\x0a\xb4\x02\x01D\x11&\x00+55\xff\xff\x00\ +\x19\xff\xec\x04\xdf\x07u\x02&\x01\xb1\x00\x00\x01\x07\x00\ +j\x007\x01R\x00\x0a\xb4\x02\x019\x05&\x00+5\ +5\xff\xff\x00!\xff\xec\x04p\x06#\x02&\x01\xd1\x00\ +\x00\x01\x06\x00j\xc8\x00\x00\x0a\xb4\x02\x017\x11&\x00\ ++55\x00\x01\x00\x00\xff\xec\x04\xb2\x05\xb6\x00\x1b\x00\ +0@\x19\x1a\x17\x18\x18\x17OY\x15\x14\x00\x14\x00S\ +Y\x14\x14\x06\x18\x03\x06\x0dOY\x06\x13\x00?+\x00\ +\x18?\x129/+\x11\x12\x009+\x11\x12\x0091\ +0\x01\x16\x16\x15\x14\x04!\x22&'\x11\x16\x1632\ +654&##7\x01!\x13!\x07\x01\x02\xfc\x97\ +\x94\xfe\xb1\xfe\xc4\x89\xdb8F\xc7d\xa4\x87|\x99\x87\ +5\x01V\xfe\x5cD\x03\x873\xfe}\x03\x5c\x22\xcb\x9a\ +\xea\xff*%\x01F+3W[K@\xe8\x01/\x01\ +?\xf5\xfe\xa3\x00\x00\x01\xff\xb0\xfe\x14\x04\x8b\x04m\x00\ +\x19\x00.@\x18\x19\x16\x17\x17\x16FY\x00\x14\x13\x14\ +IY\x13\x13\x06\x17\x0f\x06\x0cGY\x06\x1b\x00?+\ +\x00\x18?\x129/+\x11\x003+\x11\x12\x0091\ +0\x01\x16\x16\x15\x10\x00!\x22'\x11\x16\x16326\ +54&##\x13\x01!\x13!\x07\x02\xa2\xaa\xa0\xfe\ +\x9c\xfe\xc8\xf6\xaaR\xe8f\x84\x8c\x9a\x8bh9\x01^\ +\xfeH@\x03\x991\x02\x082\xd8\xba\xfe\xf6\xfe\xda[\ +\x01K3;~s`a\x01\x1b\x011\x01#\xf2\xff\ +\xff\x00!\x00\x00\x06f\x07\x17\x02&\x01\xb2\x00\x00\x01\ +\x07\x01M\x01\x1f\x01R\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\x00`\xff\xec\x04\xe3\x05\xc5\x02&\x00X\x00\ +\x00\x01\x06\x01M)\x00\x00\x08\xb3\x01\x1c\x11&\x00+\ +5\xff\xff\x00!\x00\x00\x06f\x07u\x02&\x01\xb2\x00\ +\x00\x01\x07\x00j\x01\x08\x01R\x00\x0a\xb4\x02\x01 \x05\ +&\x00+55\xff\xff\x00`\xff\xec\x04\xe3\x06#\x02\ +&\x00X\x00\x00\x01\x06\x00j\x17\x00\x00\x0a\xb4\x02\x01\ +)\x11&\x00+55\xff\xff\x00h\xff\xec\x05\xa6\x07\ +u\x02&\x002\x00\x00\x01\x07\x00j\x00\xb0\x01R\x00\ +\x0a\xb4\x03\x02+\x05&\x00+55\xff\xff\x00T\xff\ +\xec\x04\x95\x06#\x02&\x00R\x00\x00\x01\x06\x00j\xed\ +\x00\x00\x0a\xb4\x03\x02)\x11&\x00+55\xff\xff\x00\ +h\xff\xec\x05\xa6\x05\xcd\x02\x06\x02~\x00\x00\xff\xff\x00\ +T\xff\xec\x04\x87\x04\x81\x02\x06\x02\x7f\x00\x00\xff\xff\x00\ +h\xff\xec\x05\xa6\x07u\x02&\x02~\x00\x00\x01\x07\x00\ +j\x00\xb0\x01R\x00\x0a\xb4\x04\x03-\x05&\x00+5\ +5\xff\xff\x00T\xff\xec\x04\x95\x06#\x02&\x02\x7f\x00\ +\x00\x01\x06\x00j\xed\x00\x00\x0a\xb4\x04\x03-\x11&\x00\ ++55\xff\xff\x00\x1f\xff\xec\x04\xcb\x07u\x02&\x01\ +\xc7\x00\x00\x01\x07\x00j\x00\x08\x01R\x00\x0a\xb4\x02\x01\ +.\x05&\x00+55\xff\xff\x00-\xff\xec\x03\xfb\x06\ +#\x02&\x01\xe7\x00\x00\x01\x07\x00j\xffS\x00\x00\x00\ +\x0a\xb4\x02\x01+\x11&\x00+55\xff\xff\x00D\xff\ +\xec\x05\xb4\x07\x17\x02&\x01\xbd\x00\x00\x01\x07\x01M\x00\ +d\x01R\x00\x08\xb3\x01\x19\x05&\x00+5\xff\xff\xff\ +\x7f\xfe\x14\x04\xcd\x05\xc5\x02&\x00\x5c\x00\x00\x01\x06\x01\ +M\xd0\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\xff\x00\ +D\xff\xec\x05\xb4\x07u\x02&\x01\xbd\x00\x00\x01\x07\x00\ +j\x00J\x01R\x00\x0a\xb4\x02\x01&\x05&\x00+5\ +5\xff\xff\xff\x7f\xfe\x14\x04\xcd\x06#\x02&\x00\x5c\x00\ +\x00\x01\x06\x00j\xa5\x00\x00\x0a\xb4\x02\x01'\x11&\x00\ ++55\xff\xff\x00D\xff\xec\x05\xca\x07s\x02&\x01\ +\xbd\x00\x00\x01\x07\x01S\x00\xe5\x01R\x00\x0a\xb4\x02\x01\ +'\x05&\x00+55\xff\xff\xff\x7f\xfe\x14\x05\x14\x06\ +!\x02&\x00\x5c\x00\x00\x01\x06\x01S/\x00\x00\x0a\xb4\ +\x02\x01(\x11&\x00+55\xff\xff\x00\x93\x00\x00\x05\ +\x9c\x07u\x02&\x01\xc1\x00\x00\x01\x07\x00j\x00y\x01\ +R\x00\x0a\xb4\x02\x01'\x05&\x00+55\xff\xff\x00\ +\x8b\x00\x00\x04\xc7\x06#\x02&\x01\xe1\x00\x00\x01\x06\x00\ +j\xfb\x00\x00\x0a\xb4\x02\x01(\x11&\x00+55\x00\ +\x01\x00!\xfe7\x04\xb4\x05\xb6\x00\x09\x00\x1a@\x0e\x06\ +\x09OY\x06\x03\x05\x00PY\x05\x12\x03#\x00??\ ++\x00\x18?+10\x013\x03!\x13#\x01!\x03\ +!\x01\xe7\xf4\xa4\xfe\x83e\xfe\x015\x03^C\xfe)\ +\x011\xfd\x06\x01\xc9\x05\xb6\xfe\xc1\x00\x00\x01\x00\x17\xfe\ +`\x04\x10\x04m\x00\x09\x00\x1a@\x0e\x05\x08GY\x05\ +\x0f\x04\x09GY\x04\x15\x02\x22\x00??+\x00\x18?\ ++10\x01\x03!\x13!\x13!\x03!\x03\x02\xdd\x95\ +\xfe\x8fo\xfe\xd1\xef\x03\x0aC\xfe{k\x017\xfd)\ +\x01\xa0\x04m\xfe\xc8\xfe\x02\x00\xff\xff\x00!\x00\x00\x07\ +\x96\x07u\x02&\x01\xc5\x00\x00\x01\x07\x00j\x01\xa0\x01\ +R\x00\x0a\xb4\x04\x03(\x05&\x00+55\xff\xff\x00\ +T\xff\xec\x07\x08\x06#\x02&\x01\xe5\x00\x00\x01\x07\x00\ +j\x01\x1f\x00\x00\x00\x0a\xb4\x04\x031\x11&\x00+5\ +5\x00\x01\x00\x0a\xfd\xcd\x04\xb4\x05\xb6\x00\x1b\x006@\ +\x1c\x03\x15\x16\x15OY\x00\x16\x16\x13\x18\x18\x1bOY\ +\x18\x03\x13\x04PY\x13\x12\x09\x0eOY\x09\x00/+\ +\x00\x18?+\x00\x18?+\x11\x12\x009\x18/3+\ +\x11\x00310\x01!\x03!\x03!\x03\x06\x06#\x22\ +'\x11\x1632667!\x13#\x133\x13!\x03\ +!\x02b\x01#F\xfe\xe08\x01\x8cT.\xec\xd2\x89\ +V\xed\x17\x01\x87L/\xed\xcf\x89V>?\ +>J3\x15\xfe\x84Qv;y`\x03\x0a\x035\x8d\ +\xfe\xddj\xfex\xea\xdc\x1c\x012\x17-cl\x01\x85\ +\x01#\x01\xc5\x00\x00\x01\xff\x83\xfd\xcd\x05\xe7\x05\xb6\x00\ +\x19\x00#@\x14\x0f\x00PY\x17\x16\x19\x10\x0f\x05\x12\ +\x14\x03\x12\x12\x05\x0aOY\x05\x00/+\x00\x18??\ +\x12\x179+10\x01!\x03\x06\x06#\x22'\x11\x16\ +32667#\x03\x01!\x01\x03!\x13\x01!\x01\ +\x04f\x01TT/\xed\xcf\x89VK2\x13\ +\xc4\x92\xfe\xae\xfeD\x023\xdf\x01\xa0{\x015\x01\xc0\ +\xfd\xe6\x011\xfeb\xea\xdc\x1c\x012\x17/eh\x01\ +\xf2\xfe\x0e\x03\x08\x02\xae\xfe+\x01\xd5\xfd+\x00\x01\xff\ +\x89\xfd\xcd\x05\x0a\x04m\x00\x19\x00#@\x14\x0f\x14G\ +Y\x0f\x19\x0aIY\x07\x06\x09\x00\x19\x05\x02\x04\x0f\x02\ +\x15\x00??\x12\x179+\x00\x18/+10\x01\x03\ +!\x01\x03!\x13\x13!\x01\x13!\x03\x06\x06#\x22'\ +\x11\x1632667#\x02!\xd3\xfe;\x01\xd9\xcf\ +\x01\xa6L\xba\x01\xcb\xfe/o\x01`L/\xed\xcf\x89\ +V@=>J3\x15\xce\x01H\xfe\xb8\x02B\x02+\ +\xfe\xc6\x01:\xfd\xc0\xfe\xee\xfex\xea\xdc\x1c\x012\x17\ +-cl\x00\x01\xff\x83\x00\x00\x05\xe7\x05\xb6\x00\x11\x00\ +-@\x19\x03\x05\x00\x07\x08\x07OY\x0f?\x08O\x08\ +\x02\x08\x08\x02\x0c\x0d\x03\x05\x0a\x03\x05\x12\x00??\x12\ +\x1799/]3+\x11\x003\x12910\x01\x13\ +!\x03\x01!\x01#\x133\x03!\x13\x01!\x013\x03\ +\x04\x0a\xc9\xfeP\x8d\xfe\xa9\xfeD\x01\x9a\xbbD\xed\xbc\ +\x01\xa0r\x01>\x01\xc0\xfeR\xecF\x025\xfd\xcb\x02\ +\x10\xfd\xf0\x025\x01@\x02A\xfd\xfe\x02\x02\xfd\xbf\xfe\ +\xc0\x00\x01\xff\x89\x00\x00\x05\x0a\x04m\x00\x11\x00)@\ +\x14\x0f\x04\x05\x04FY\x0c\x11\x00\x02\x09\x0a\x07\x05\x05\ +\x02\x07\x0f\x02\x15\x00??\x129/\x1299\x129\ +93+\x11\x00310\x01\x03!\x01#\x133\x03\ +!\x13\x13!\x013\x03#\x13!\x02)\xdb\xfe;\x01\ +V\xb4?\xc7\x9e\x01\xa6D\xc2\x01\xcb\xfe\xaa\xc1@\xc4\ +\xac\xfeT\x01m\xfe\x93\x01\xa2\x01#\x01\xa8\xfe\x9f\x01\ +a\xfeX\xfe\xdd\xfe^\x00\x02\x00B\x00\x00\x05\x04\x05\ +\xb6\x00\x0a\x00\x13\x00\x1f@\x10\x03\x0cOY\x03\x03\x08\ +\x05\x08\x12OY\x08\x12\x05\x03\x00??+\x11\x12\x00\ +9\x18/+10\x134\x00!3\x13!\x01! \ +$\x01#\x22\x06\x15\x14\x1633B\x01X\x01$R\ +m\x01\x87\xfe\xcb\xfe\x8b\xfe\xfa\xfe\xee\x02\x898Vt\ +I>;\x01\xb4\xeb\x01\x11\x02\x06\xfaJ\xe0\x01\x91b\ +N9I\xff\xff\x00T\xff\xec\x05\x1f\x06\x14\x02\x06\x00\ +G\x00\x00\x00\x02\x00B\xff\xec\x06\xcb\x05\xb6\x00\x1b\x00\ +&\x00)@\x15\x0a\x1dOY\x17\x0a\x17\x0a\x0c\x03\x02\ +\x04\x13#\x04#OY\x00\x04\x13\x00?3+\x11\x00\ +3\x129\x18?99//+10\x05\x22'\x06\ +#\x22&54\x00!3\x13!\x03\x06\x15\x14\x163\ +267\x13!\x03\x06\x06\x01#\x22\x06\x15\x14\x163\ +267\x04m\xf3v\x88\x9b\xc3\xdc\x01R\x01*R\ +m\x01\x87\xc5\x18(\x221=\x11T\x01\x87^-\xf8\ +\xfd\x83+ct7-.6\x07\x14nn\xe6\xc4\xfc\ +\x01\x1e\x02\x06\xfc^f5\x1f+>Q\x01\x92\xfe9\ +\xd2\xcb\x02\x85n_:?/#\x00\x00\x02\x00T\xff\ +\xec\x06\xb2\x06\x14\x00#\x000\x004@\x1b\x14\x00\x1f\ +\x1f\x00\x03\x10\x06\x0c\x0c+GY\x0c\x10\x06$GY\ +\x06\x16\x00\x1bHY\x00\x16\x00?+\x00\x18?+\x00\ +\x18?+\x11\x12\x0099\x129\x18/?10\x05\ +\x22&'\x06\x06# \x114\x12632\x16\x173\ +767\x13!\x03\x06\x15\x14\x1632677!\ +\x03\x06\x06\x0126654&#\x22\x06\x06\x15\x14\ +\x04u\x80\xab34\xafW\xfew\x89\xd6\x86Qv7\ +\x08\x02\x07\x12>\x01\x87\xe6\x0a,\x1a::\x19-\x01\ +\x83?/\xfd\xfc\xee;V0.*1X6\x142\ +B4@\x01\xb0\xba\x01q\xbaES%\x8aO\x01-\ +\xfb\xc15\x1f%#Cr\xce\xfe\xcf\xd7\xc8\x017`\ +\xc2uAOs\xc3b\x8f\x00\x00\x01\x00X\xff\xec\x06\ +\x83\x05\xcb\x001\x005@\x1b\x0f\x0c\x19\x05\x04\x05\x04\ +OY'\x05'\x05,\x12,#NY,\x13\x12\x0c\ +OY\x12\x04\x00?+\x00\x18?+\x11\x12\x0099\ +\x18//+\x11\x12\x009\x11910\x014&#\ +#\x1332654&#\x22\x06\x07\x036!2\ +\x16\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06\x15\x14\x163\ +267\x13!\x03\x06\x06#\x22&546\x02b\ +\x84\x94sD{\x99\x98UME\xb3N\x87\xe9\x01F\ +\x95\xd3o\xc8\xb1\x85\x7f\x0a(\x221=\x11T\x01\x87\ +^-\xf7\xdc\xe1\xec\x0a\x01\xd5FE\x018HK1\ +7:.\x01\x0a\x96X\x9fg\x99\xc1\x0f\x08\x1f\x85q\ +\x1d:\x17\x1f+>Q\x01\x92\xfe9\xd2\xcb\xbf\xad \ +4\x00\x01\x00J\xff\xec\x05\xf2\x04\x81\x00*\x004@\ +\x1b\x1a\x11\x18\x1e\x18IY$\x10\x11\x11\x10LY\x04\ +\x11\x04\x11\x09\x1e\x10\x09\x00HY\x09\x16\x00?+\x00\ +\x18?\x1299//+\x11\x12\x009+\x11\x12\x00\ +910\x012677!\x03\x06\x06#\x22&5\ +4&##732654&#\x22\x07\x036\ +632\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x16\x03\xb4\ +:;\x19-\x01\x83@.\xfd\xd3\xda\xf3_qe5\ +stc8C\xa3uTg\xc6w\xe0\xe4y\x83c\ +V+\x019Dq\xce\xfe\xcf\xd7\xc8\xbf\xa9D9\xf6\ +**)\x22?\x01\x16$ \x93\x8ef\x84(\x08\x13\ +aQ%#\x00\x00\x01\x00Z\xfe7\x04\xe7\x05\xcb\x00\ +(\x003@\x1b\x1a\x10\x17\x1e\x17OY%\x0f\x10\x10\ +\x0fOY\x10\x10\x08\x1e\x04\x08\x03PY\x08\x12\x06#\ +\x00??+\x00\x18?\x129/+\x11\x12\x009+\ +\x11\x12\x00910\x01\x14\x06\x073\x03!\x13!\x13\ +654&##\x1332654&#\x22\x06\ +\x07\x036$32\x16\x16\x15\x14\x06\x07\x15\x16\x16\x04\ +\x14\x0a\x16\xf3\xa3\xfe\x83d\xff\x00H\x16\x81\x93\x87C\ +\x90\x9c\x95[U[\xd26\x85h\x015\xa7\x8e\xe3z\ +\xc8\xb1\x93q\x01\xf6\x1cAh\xfd\x06\x01\xc9\x01Dg\ +*FE\x018DI.@@(\x01\x02JT]\ +\xa2_\x99\xc1\x0f\x08!x\x00\x00\x01\x00J\xfe`\x04\ +\xa6\x04\x81\x00%\x004@\x1b\x0f\x0c\x18\x05\x04\x05\x04\ +LY\x05\x05#\x12#\x1eGY#\x15!\x22\x12\x0c\ +IY\x12\x10\x00?+\x00\x18??+\x11\x12\x009\ +\x18/+\x11\x12\x009\x11910\x014&##\ +732654&#\x22\x06\x07\x03632\x16\ +\x15\x14\x06\x07\x15\x16\x16\x15\x14\x073\x03!\x13!\x12\ +6\x02-ih\x8b5\x9asd9BK\xc7LT\ +\xfb\xee\xe1\xe4y\x83aY\x06\xf6\x96\xfe\x90n\xfe\xd5\ +=\x0d\x01m7-\xf6**)\x22.$\x01\x17V\ +\x92\x8ff\x84(\x08\x1aVG4$\xfd)\x01\xa0\x01\ +\x01I\x00\x00\x01\xff\xa4\xff\xec\x07\x81\x05\xb6\x00(\x00\ ++@\x16\x1d\x1d\x06\x12\x12\x00OY\x12\x03\x22\x19N\ +Y\x22\x06\x06\x0cOY\x06\x13\x00?+\x11\x003+\ +\x00\x18?+\x11\x12\x009\x18/10\x01\x02\x07\x0e\ +\x02#\x22'\x11\x16\x1632667\x12\x13!\x03\ +\x06\x15\x14\x163267\x13!\x03\x06\x06#\x22&\ +546\x13\x03'\xa25H\x8b\xb3\x8bQJ-&\ +\x135>@\x22f\xb1\x03\xc0\xc0\x19(\x221=\x11\ +T\x01\x87^-\xf7\xdc\xe1\xec\x0d\x8b\x04\x7f\xfd\xac}\ +\xb2\xbcT\x1a\x011\x0f\x05,cV\x01\x01\x02\xad\xfc\ +^j1\x1f+>Q\x01\x92\xfe9\xd2\xcb\xbf\xad)\ +[\x02\xa3\x00\x01\xff\xdb\xff\xec\x07-\x04\x81\x00.\x00\ ++@\x16\x07\x07\x1c))\x14FY)\x10\x0c\x03H\ +Y\x0c\x1c\x1c!GY\x1c\x16\x00?+\x11\x003+\ +\x00\x18?+\x11\x12\x009\x18/10\x01\x14\x163\ +2677!\x03\x06\x06#\x22&547\x13&\ +#\x22\x06\x06\x07\x0e\x02#\x22'\x11\x163267\ +>\x0332\x16\x17\x03\x06\x04\xaa,\x1a::\x19-\ +\x01\x83?/\xfd\xd2\xda\xf3\x0aV\x1b\x1cIVO1\ +Q\x01\x92\xfe9\xd2\xcb\xbf\xad\ +Ew>\xfd\xae\x05\xb6\xfd\xe2\x02\x1e\xfc^j\x00\x00\ +\x01\x00\x17\xff\xec\x06\xd9\x04m\x00\x1c\x00&@\x14\x17\ +\x0eHY\x17\x16\x05\x00IY\x12\x05\x12\x05\x02\x07\x03\ +\x0f\x02\x15\x00??3\x1299//+\x00\x18?\ ++10\x01\x03!\x13!\x033\x13!\x03\x06\x15\x14\ +\x1632677!\x03\x06\x06#\x22&547\ +\x01\xf8^\xfe}\xf1\x01\x83V\xddX\x01\x84\x8e\x0a,\ +\x1a::\x19-\x01\x83?/\xfd\xd2\xda\xf3\x08\x01\xb8\ +\xfeH\x04m\xfef\x01\x9a\xfdh5\x1f%#Cr\ +\xce\xfe\xcf\xd7\xc8\xbd\xab\x17M\x00\x01\x00h\xff\xec\x05\ +\xc1\x05\xcd\x00\x1b\x00&@\x14\x00\x1bPY\x00\x00\x05\ +\x0c\x0c\x11NY\x0c\x04\x05\x18NY\x05\x13\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x01!\x07\ +\x02\x00! \x00\x11\x10\x12$3 \x17\x03&#\x22\ +\x06\x02\x15\x14\x16327!\x02\xdb\x02\xe6'@\xfe\ +\x7f\xfe\xd3\xfe\xe8\xfe\xd4\xdc\x01\x7f\xfe\x01\x0a\xb6\x93\x99\ +\x99\x84\xcbymn\xe9@\xfe\xa0\x03X\xd1\xfe\xb6\xfe\ +\xaf\x01,\x01\x1b\x01\x0b\x01\xae\xe1k\xfe\xcbZ\x91\xfe\ +\xe4\xa1\x8a~\xf6\x00\x01\x00T\xff\xec\x04\xcd\x04\x81\x00\ +\x1b\x00&@\x14\x1b\x1aIY\x1b\x1b\x04\x0b\x0b\x10G\ +Y\x0b\x10\x04\x16FY\x04\x16\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+10\x01\x07\x02\x04#\x22&\ +54\x12$32\x17\x03&#\x22\x06\x15\x14\x163\ +267#\x13\x04\xcd-<\xfe\xcc\xfd\xe5\xfa\xaa\x01\ +;\xcd\xbc\xab{zz\x7f\xa6GDD`\x13\xa8=\ +\x02\xba\xca\xfe\xf6\xfa\xf2\xdc\xcc\x01F\xb5P\xfe\xe1<\ +\xe0\xa9Y^KG\x01\x1a\x00\x00\x01\x00\x9c\xff\xec\x05\ +m\x05\xb6\x00\x19\x00\x22@\x11\x17\x13\x14\x13NY\x07\ +\x07\x0c\x14\x03\x0c\x03NY\x0c\x13\x00?+\x00\x18?\ +\x129/+\x11\x00310\x01\x14\x163267\ +\x13!\x03\x06\x06#\x22&547\x13!\x13!\x03\ +!\x03\x06\x02\xc9'\x222<\x11T\x01\x88_,\xf8\ +\xdc\xe0\xec\x18\x7f\xfe\xc3E\x04\x04G\xfe\xc2\x7f\x18\x01\ +y\x1f+>Q\x01\x92\xfe9\xd2\xcb\xbe\xaeRj\x02\ +_\x01C\xfe\xbd\xfd\xa1f\x00\x00\x01\x00B\xff\xec\x05\ +\x0c\x04m\x00\x19\x00%@\x12\x0f\x0f\x14\x02\x14\x0bH\ +Y\x14\x16\x05\x01\x02\x01FY\x02\x0f\x00?+\x11\x00\ +3\x18?+\x11\x12\x009\x18/10\x01!\x13!\ +\x03!\x03\x06\x15\x14\x1632677!\x03\x06\x06\ +#\x22&547\x01`\xfe\xe2=\x03\xc0=\xfe\xe1\ +P\x0a,\x1a::\x19-\x01\x83?/\xfd\xd2\xda\xf3\ +\x0e\x03J\x01#\xfe\xdd\xfe\x8b5\x1f%#Cr\xce\ +\xfe\xcf\xd7\xc8\xbd\xab3D\x00\x00\x01\x005\xff\xec\x05\ +?\x05\xcb\x00)\x004@\x1b\x1c\x19\x13 \x19OY\ +&\x13\x10\x10\x13OY\x07\x0a\x10\x10\x03 \x13\x03\x0a\ +OY\x03\x04\x00?+\x00\x18?\x129/\x129+\ +\x11\x12\x009+\x11\x12\x00910\x134$!2\ +\x16\x17\x03&&#\x22\x06\x15\x14\x1633\x03#\x22\ +\x06\x15\x14\x163267\x11\x06\x06#\x22$54\ +675&&\xfa\x01:\x01\x12\x8b\xf4z\xb0H\xbe\ +ZQa\x91\x98hAV\xed\xbburl\xb3ju\ +\xd3\xa7\xfb\xfe\xe0\xd5\xe8\x86r\x04'\xc1\xe3AM\xfe\ +\xee08?1L?\xfe\xc8TXGJ,4\xfe\ +\xc11'\xce\xb5\xa9\xcf2\x08)~\xff\xff\x00)\xff\ +\xec\x04\x91\x04\x81\x02\x06\x01\x82\x00\x00\x00\x01\xff\xa4\xfd\ +\xcd\x05\xee\x05\xb6\x00$\x00*@\x17#\x11OY#\ +\x03\x17\x1dOY\x17\x13\x0f\x00PY\x0f\x12\x05\x0aO\ +Y\x05\x00/+\x00\x18?+\x00\x18?+\x00\x18?\ ++10\x01!\x03\x06\x06#\x22'\x11\x16326\ +77!\x13#\x02\x07\x0e\x02#\x22'\x11\x16\x163\ +2667\x12\x13!\x04\xc5\x01)T.\xef\xcf\x89\ +V@\x22f\xb1\x03\xc0\x011\ +\xfeb\xe8\xde\x1c\x012\x17dm+\x04\x7f\xfd\xac}\ +\xb2\xbcT\x1a\x011\x0f\x05,cV\x01\x01\x02\xad\x00\ +\x01\xff\xdb\xfd\xcd\x05\x8d\x04\x81\x00*\x00*@\x17'\ +\x12FY'\x10\x1a\x1fGY\x1a\x16\x0f\x00IY\x0f\ +\x15\x05\x0aGY\x05\x00/+\x00\x18?+\x00\x18?\ ++\x00\x18?+10\x013\x03\x06\x06#\x22'\x11\ +\x1632677#\x13&#\x22\x06\x06\x07\x0e\x02\ +#\x22'\x11\x163267>\x0332\x16\x17\x04\ +\x8f\xfeK.\xef\xcf\x89V@=X[\x15\x09\xf4\xb2\ +\x1b\x1cIVO1\x01\x93\xb8T\x8f\x1b\x01\ +Z!;\x04\xd9N\xab:\x15\xa5\x8a\x19L\xad:\x15\ +\xa8\x87\x00\x00\x02\xfc\xa2\x04\xd9\x01j\x06\x7f\x00\x0c\x00\ +\x15\x00\x17@\x0a\x15\x07\x10\x09\x0f\x02\x01\x02\x0c\x07\x00\ +/3\xdc]9\xcc\x11910\x0167!\x16\x17\ +\x15#''\x06\x07#%67!\x15\x06\x06\x07#\ +\xfc\xa2V\xb8\x01\x87HT\xea;FG\x8b\xf4\x03\x04\ +?Z\x01+\x1f\xa89\xc4\x04\xeeS\xda\xad~\x17O\ +W@f\xd1?\x96\x0c(\x8e!\x00\x00\x02\xfb\xbc\x04\ +\xd9\xff\xd3\x06\x83\x00\x08\x00\x15\x00\x1b@\x0c\x00\x05\x15\ +\x15\x12\x10\x05\x0f\x0b\x01\x0b\x10\x00/\xdc]\xce\x129\ +2\x11\x12910\x01&&'7!\x16\x17\x15\x07\ +67!\x16\x17\x15#''\x06\x07#\xfcq?f\ +\x10\x02\x01%\x0b1}V\xb8\x01\x87HT\xea;F\ +G\x8b\xf4\x05\xa07x*\x0amj\x0c\xb2S\xda\xad\ +~\x17OW@f\x00\x00\x02\xfc\x93\x04\xd9\x00\xdd\x07\ +\x08\x00\x11\x00\x1d\x00\x1f@\x0e\x1a\x14\x1d\x1d\x19\x05\x0a\ +\x00\x00\x0f\x14\x01\x14\x19\x00/\xcc]9/\xcc2\x11\ +3\x11\x12910\x037254#\x22\x0756\ +32\x16\x15\x14\x06\x07\x07\x0567!\x16\x17\x15#\ +'\x06\x07#X\x0ay-\x1d72WM]FQ\ +\x1d\xfcj[\xb4\x01\x87HT\xea\x81T\x7f\xf4\x05\x8b\ +\x83:'\x13\x96\x16WI4W\x12@\x9dX\xd5\xad\ +~\x17\xa6K[\x00\x02\xfc\x8d\x04\xd9\xff\xdb\x07\x10\x00\ +\x0d\x00$\x007@ \x0a\x03\x0d\x0d\x08\x13\x1a\x22@\ +\x09\x0cH\x22\x22\x1f\x1f\x0e\x00\x17\x10\x17\x02\x17\x0f\x03\ +\x1f\x03/\x03\x03\x03\x08\x00/\xdc]\xde]\xc42\x11\ +3/+\xc42\x113\x11\x12910\x01667\ +!\x16\x17\x15#&'\x06\x07#\x01\x22&'&#\ +\x22\x06\x07#6632\x16\x17\x163273\x06\ +\x06\xfc\x8dG\x9a.\x01\x872i\xe9L5`s\xf4\ +\x02J)<&A(\x1a/\x04\x9a\x1a}i\x1d0\ +0H\x22? \x99\x1c~\x04\xee9\x8f6w\x85\x17\ +=:?8\x019\x15\x12#-\x1f\x7f\x7f\x0d\x18$\ +K\x81}\x00\x02\xfc\xe7\x04\xd9\x00\x12\x06\xc3\x00\x0d\x00\ +\x16\x00\x1b@\x0d\x16\x0b\x0b\x02\x11@\x0d\x14H\x11\x0d\ +\x07\x02\x00/\xdd2\xcc+\x113\x11310\x13\x02\ +!\x22&5473\x14\x16327\x0567!\ +\x15\x06\x06\x07#\x12?\xfe\x81\xad\xc0\x09\xb4]i\xcc\ +(\xfe\x94?Z\x01\x02 \x9d8\xa6\x06-\xfe\xac\x96\ +\x83\x22\x19PG\x97??\x96\x0d)\x8e \x00\x02\xfc\ +\xe7\x04\xd9\x00\x12\x06\xc1\x00\x0d\x00\x16\x00\x1b@\x0d\x0e\ +\x0b\x0b\x02\x13@\x0d\x14H\x13\x0d\x07\x02\x00/\xdd2\ +\xcc+\x113\x11310\x13\x02!\x22&547\ +3\x14\x16327\x05&&'7!\x16\x17\x15\x12\ +?\xfe\x81\xad\xc0\x09\xb4]i\xcc(\xfe\xf0@c\x11\ +\x02\x01\x10\x0b0\x06-\xfe\xac\x96\x83\x22\x19PG\x97\ +P7x*\x0bmk\x0c\x00\x00\x02\xfc\xe7\x04\xd9\x00\ +\x12\x07\x06\x00\x0d\x00\x1d\x00\x1d@\x0e\x1d\x0b\x0b\x02\x13\ +O\x18_\x18\x02\x18\x0d\x07\x02\x00/\xdd2\xcc]2\ +\x113\x11310\x13\x02!\x22&5473\x14\ +\x16327\x057254#\x22\x075632\ +\x15\x14\x07\x07\x12?\xfe\x81\xad\xc0\x09\xb4]i\xcc(\ +\xfe\xb4\x09^%)!-N\x8f~\x19\x06-\xfe\xac\ +\x96\x83\x22\x19PG\x97Zj-\x1f\x0ey\x12\x81a\ +\x1e3\x00\x00\x02\xfc\xe7\x04\xd9\x00\x12\x07\x19\x00\x10\x00\ +&\x00'@\x14#\x1a#\x1a\x16\x1d@\x09\x0cH\x1d\ +!\x11\x10\x0f\x08\x01\x08\x0c\x03\x00/3\xdd]2\xde\ +2\xcd+299//10\x13\x06\x06#\x22&\ +5473\x14\x1632667'\x22&'&\ +#\x22\x06\x07#6632\x17\x163273\x06\ +\x06\x12\x1f\xdb\xc4\xa8\xc5\x09\xb4SsTW<\x0d^\ +)<&A(\x181\x05\x99\x19un1LJ \ +C\x1b\x9a\x1at\x06\x19\xa6\x9a\x8f{\x1d\x19I:\x1a\ +81\x14\x14\x13#$\x22{m%%Ewp\x00\ +\x01\xff!\xfd\xf4\x01\x1f\x00\x00\x00\x10\x00\x0a\xb2\x00\x0c\ +\x07\x00//310\x032654&'3\x16\ +\x15\x14\x06#\x22'5\x16X8;#B\xd9\x90\xa0\ +\xa2wEH\xfe\xd7+3(PSs\x99z\x86\x1e\ +\xe4\x1f\x00\x00\x01\xff\x0c\xfd\xcd\x02+\x011\x00\x0d\x00\ +\x0a\xb2\x0d\x09\x04\x00/3/10\x01\x03\x06\x06#\ +\x22'\x11\x163267\x13\x02+T/\xed\xcf\x88\ +X\x0254&#\x22\x07\x03>\x02\ +32\x16\x15\x14\x06\x07\x07!\x04\x17\xfb\xe71\x01H\ +\x8c\x91;$*x\xbb\xb6|\x9a\xa8`\xca\xd8~\xb3\ +^\x01\x93\xf8\xcf_qI,\x16&\x9a\x01\x04bT\ +.\xbb\xac\x85\xb6u5\x00\x01\xff\xd8\xfe\xb8\x040\x04\ +\x97\x00(\x00-@\x17\x03\x18\x19\x19\x18WY\x19\x19\ +\x0a&& TY&&\x0a\x10TY\x0a%\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +10\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04!\x22&'\ +\x11\x1632654&&##\x133265\ +4&#\x22\x07'6632\x16\x040\xb3\xa3\x81\ +\x92\xfe\x9c\xfe\xd0t\xcbB\xa7\xd2\x8a\x896vkT\ +5N\x93\xa4H?u\x99\x9e~\xeb\x8d\xc9\xf1\x03=\ +\x94\xc2!\x08\x19\xad~\xd8\xea)&\x01Ld]W\ +66\x19\x01#]Q.8T\xf8QC\xba\x00\x00\ +\x02\xff\xb8\xfe\xcb\x04L\x04\x81\x00\x0a\x00\x12\x00%@\ +\x12\x0e\x07\x06\x05\x09\x12\x05\x12VY\x01\x05\x05\x13\x07\ +\x10\x03$\x00??\x129/3+\x11\x003\x129\ +\x12910%#\x03!\x13!\x13\x01!\x033!\ +667#\x06\x07\x07\x03\xe9\x8fH\xfe\x84I\xfd\xd9\ +8\x02\xfc\x01`\xb0\x91\xfd\xf68&\x08\x04#V\xbe\ +\x1b\xfe\xb0\x01P\x01\x12\x03T\xfc\xcf\xda\x81\x16Df\ +\xc7\x00\x01\xff\xda\xfe\xb8\x04`\x04\x82\x00\x1c\x00+@\ +\x16\x16\x12\x00\x12VY\x00\x00\x06\x17\x17\x1aUY\x17\ +\x10\x06\x0dTY\x06%\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x00310\x012\x16\x15\x10\x00\ +!\x22&'\x11\x16\x163 54&#\x22\x06\x07\ +'\x13!\x03!\x076\x02U\xb5\xe1\xfe\xbe\xfe\xcf\x81\ +\xe76O\xccR\x01\x15eV5t\x22z\xd7\x03-\ +D\xfe);#\x02\x8a\xeb\xc7\xfe\xfb\xfe\xe5,'\x01\ +D-3\xc0L^\x14\x0c\x5c\x02\xed\xfe\xbd\xb9\x04\xff\ +\xff\x00M\xff\xec\x04\xb3\x05\xcb\x00\x06\x00\x19\xff\x00\x00\ +\x01\x00\x03\xfe\xcc\x04\xde\x04\x82\x00\x06\x00\x17@\x0b\x05\ +\x03\x02\x03\x02UY\x03\x10\x00$\x00??+\x11\x12\ +\x00910\x13\x01!\x13!\x07\x01\x03\x02\xcd\xfd\xc2\ +F\x04\x063\xfd\x18\xfe\xcc\x04o\x01G\xe7\xfb1\xff\ +\xff\x00,\xff\xec\x04\x80\x05\xcd\x00\x06\x00\x1b\xfb\x00\x00\ +\x02\x00c\xfe\xb8\x04j\x04\x97\x00\x19\x00$\x00-@\ +\x17\x0c\x10\x1f\x10\x1fVY\x10\x10\x17\x04\x17\x1aVY\ +\x17&\x04\x09VY\x04%\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x00910\x01\x10\x02\x04\ +#\x22'\x11\x163267#\x06\x06#\x22&5\ +4\x12632\x12\x05\x22\x06\x15\x1432654\ +&\x04j\xce\xfe\x93\xf9s`\x5co\xbb\xd1(\x08;\ +\x92`\x97\xb0\x83\xf9\xad\xe6\xf5\xfe/Ia\x5cJf\ +7\x02\x84\xfe\xdb\xfe;\xe2\x1e\x01:%\xae\xc2_O\ +\xdc\xba\xb0\x01\x0d\x97\xfe\xed \x8ef\x90\x8deBP\ +\x00\x00\x01\xff'\xfe\x14\x06\xdd\x06\x1f\x00=\x008@\ +\x1d:\x18\x0a(\x0aFY7\x1a(\x0f3$\x1e$\ +FY-\x1e\x01\x05\x13\x0e\x13GY\x00\x0e\x1b\x00?\ +3+\x11\x003\x18?3+\x11\x003\x18?33\ ++\x11\x003310\x01\x22'\x11\x163267\ +\x13!\x03\x06\x06#\x22'\x11\x163267\x13#\ +?\x026632\x16\x17\x03&#\x22\x06\x07\x07!\ +76632\x16\x17\x03&#\x22\x06\x07\x073\x03\ +#\x03\x06\x06\x02\xc3na?5KK\x0e\xbf\xfe\xb6\ +\xcd+\xdd\xb6na?6JK\x0e\xbf\xa6+\xbc\x11\ +)\xcb\xb2P\x964b@A#1\x08\x10\x01K\x11\ +)\xcb\xb2P\x964b@A#1\x08\x11\xd3A\xd1\ +\xcd+\xdd\xfe\x14\x1b\x01/\x12)3QI\ +\x01\x9c\x90\x08\x06\xc0\x01\x1e\x8a\x95\x01\x15\xc3\x06\x08\x98\ +\x03\xb6et1\xa6=\x1d\x1c*\x1e0uJiq\ +<\x8d/7\x1c0\x19'c\xfe\xe4\x01\xfe@.\xfe\ +p\x02\xd1\xfe!\x01\xdf\xfd/\x01\x90J$\xfe\x02\xff\ +\xff\x00\x9c\xfe\x14\x04\xe5\x05\xb6\x02&\x007\x00\x00\x00\ +\x07\x00z\x01\x8f\x00\x00\xff\xff\x00?\xfe\x14\x03\xbc\x05\ +P\x02&\x00W\x00\x00\x00\x07\x00z\x01R\x00\x00\x00\ +\x02\x00\x0a\xfe\x14\x04\xc7\x04\x81\x00\x1e\x00*\x00,@\ +\x18\x11\x17GY\x11\x1b\x0c\x0f\x1b\x0b\x00\x07\x07&G\ +Y\x07\x10\x00\x1fGY\x00\x16\x00?+\x00\x18?+\ +\x11\x12\x0099\x18??+10\x05\x22&54\ +\x12632\x16\x1737!\x03\x06\x04!\x22'\x11\ +\x16\x1632677#\x06\x06\x1326654\ +&#\x22\x06\x15\x14\x01\x96\x9e\xa4\x92\xdf\x87T\x802\ +\x087\x016\xf06\xfe\xe6\xfe\xfe\xf2\x89[\xb1cV\ +\x80\x11%\x082oY2[6(*L{\x14\xdf\ +\xd1\xb3\x01t\xbeKU\x8c\xfb\x8d\xfc\xea@\x01T3\ +)TA\x8eD?\x017u\xc4^AO\xfd\x9b\x8f\ +\x00\xff\xff\x00\x0a\xfe\x14\x04\xd9\x06!\x02&\x03\x91\x00\ +\x00\x01\x06\x01K3\x00\x00\x08\xb3\x021\x11&\x00+\ +5\xff\xff\x00\x0a\xfe\x14\x04\xed\x06L\x02&\x03\x91\x00\ +\x00\x01\x06\x01N3\x00\x00\x08\xb3\x02.\x11&\x00+\ +5\xff\xff\x00\x0a\xfe\x14\x04\xc7\x067\x02&\x03\x91\x00\ +\x00\x01\x07\x01O\x01\x06\x00\x00\x00\x08\xb3\x022\x11&\ +\x00+5\xff\xff\x00\x0a\xfe\x14\x04\xc7\x06!\x02&\x03\ +\x91\x00\x00\x01\x07\x02:\x00\x8b\x00\x00\x00\x08\xb3\x02/\ +\x11&\x00+5\x00\x01\x00\x1f\x00\x00\x02\xe1\x05\xb6\x00\ +\x03\x00\x0a\xb3\x01\x03\x00\x12\x00??103\x01!\ +\x01\x1f\x015\x01\x8d\xfe\xcb\x05\xb6\xfaJ\x00\xff\xff\x00\ +\x1f\x00\x00\x02\xed\x07s\x02&\x03\x96\x00\x00\x01\x07\x00\ +C\xff\x1e\x01R\x00\x08\xb3\x01\x05\x05&\x00+5\xff\ +\xff\x00\x1f\x00\x00\x04*\x07s\x02&\x03\x96\x00\x00\x01\ +\x07\x00v\xff\x94\x01R\x00\x08\xb3\x01\x0c\x05&\x00+\ +5\xff\xff\x00\x1f\x00\x00\x03\xf7\x07s\x02&\x03\x96\x00\ +\x00\x01\x07\x01K\xffQ\x01R\x00\x08\xb3\x01\x0a\x05&\ +\x00+5\xff\xff\x00\x1f\x00\x00\x03\xf7\x07u\x02&\x03\ +\x96\x00\x00\x01\x07\x00j\xffO\x01R\x00\x0a\xb4\x02\x01\ +\x14\x05&\x00+55\xff\xff\x00\x1f\x00\x00\x03\xfb\x07\ +\x7f\x02&\x03\x96\x00\x00\x01\x07\x01R\xffE\x01R\x00\ +\x08\xb3\x01\x0e\x05&\x00+5\xff\xff\x00\x1f\x00\x00\x03\ +\xa0\x07\x17\x02&\x03\x96\x00\x00\x01\x07\x01M\xffa\x01\ +R\x00\x08\xb3\x01\x07\x05&\x00+5\xff\xff\x00\x1f\x00\ +\x00\x03\xe2\x07\x9e\x02&\x03\x96\x00\x00\x01\x07\x01N\xff\ +(\x01R\x00\x08\xb3\x01\x07\x05&\x00+5\xff\xff\xff\ +\xa0\xfd\xf4\x02\xe1\x05\xb6\x02&\x03\x96\x00\x00\x00\x06\x01\ +Q^\x00\xff\xff\x00\x1f\x00\x00\x03\x12\x07\x89\x02&\x03\ +\x96\x00\x00\x01\x07\x01O\x001\x01R\x00\x08\xb3\x01\x0b\ +\x05&\x00+5\xff\xff\x00\x1f\xfe3\x05\xdb\x05\xb6\x00\ +&\x03\x96\x00\x00\x00\x07\x00-\x02\xd7\x00\x00\xff\xff\x00\ +\x09\x00\x00\x03}\x05\xf5\x00'\x03\x96\x00\x9c\x00\x00\x01\ +\x07\x01T\xfd\xfb\xff\x97\x00\x0d\xb7\x01\x072\x07\x07\x01\ +\x01>\x00+\x115\x00\xff\xff\x00\x1f\x00\x00\x02\xe1\x05\ +\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00\x1f\x00\x00\x03\xf7\x07\ +u\x02&\x03\x96\x00\x00\x01\x07\x00j\xffO\x01R\x00\ +\x0a\xb4\x02\x01\x14\x05&\x00+55\xff\xff\x00\x1f\x00\ +\x00\x02\xe1\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00\x1f\x00\ +\x00\x03\xf7\x07u\x02&\x03\x96\x00\x00\x01\x07\x00j\xff\ +O\x01R\x00\x0a\xb4\x02\x01\x14\x05&\x00+55\xff\ +\xff\x00\x1f\x00\x00\x02\xe1\x05\xb6\x02\x06\x03\x96\x00\x00\xff\ +\xff\x00\x1f\x00\x00\x02\xe1\x05\xb6\x02\x06\x03\x96\x00\x00\xff\ +\xff\x00\x1f\x00\x00\x03b\x08\x04\x02&\x03\x96\x00\x00\x01\ +\x07\x02f\x03\xe9\x01R\x00\x08\xb3\x01\x09\x05&\x00+\ +5\xff\xff\xff\xe3\xfe\x1f\x02\xe1\x05\xb6\x02&\x03\x96\x00\ +\x00\x00\x07\x02g\x03\xb2\x00\x00\x00\x00\x00\x00\x00\x01\x00\ +\x00\xb62\x00\x01I\x06\x80\x00\x00\x0e6$\x00\x05\x00\ +$\xffq\x00\x05\x007\x00)\x00\x05\x009\x00)\x00\ +\x05\x00:\x00)\x00\x05\x00<\x00\x14\x00\x05\x00D\xff\ +\xae\x00\x05\x00F\xff\x85\x00\x05\x00G\xff\x85\x00\x05\x00\ +H\xff\x85\x00\x05\x00J\xff\xc3\x00\x05\x00P\xff\xc3\x00\ +\x05\x00Q\xff\xc3\x00\x05\x00R\xff\x85\x00\x05\x00S\xff\ +\xc3\x00\x05\x00T\xff\x85\x00\x05\x00U\xff\xc3\x00\x05\x00\ +V\xff\xc3\x00\x05\x00X\xff\xc3\x00\x05\x00\x82\xffq\x00\ +\x05\x00\x83\xffq\x00\x05\x00\x84\xffq\x00\x05\x00\x85\xff\ +q\x00\x05\x00\x86\xffq\x00\x05\x00\x87\xffq\x00\x05\x00\ +\x9f\x00\x14\x00\x05\x00\xa2\xff\x85\x00\x05\x00\xa3\xff\xae\x00\ +\x05\x00\xa4\xff\xae\x00\x05\x00\xa5\xff\xae\x00\x05\x00\xa6\xff\ +\xae\x00\x05\x00\xa7\xff\xae\x00\x05\x00\xa8\xff\xae\x00\x05\x00\ +\xa9\xff\x85\x00\x05\x00\xaa\xff\x85\x00\x05\x00\xab\xff\x85\x00\ +\x05\x00\xac\xff\x85\x00\x05\x00\xad\xff\x85\x00\x05\x00\xb4\xff\ +\x85\x00\x05\x00\xb5\xff\x85\x00\x05\x00\xb6\xff\x85\x00\x05\x00\ +\xb7\xff\x85\x00\x05\x00\xb8\xff\x85\x00\x05\x00\xba\xff\x85\x00\ +\x05\x00\xbb\xff\xc3\x00\x05\x00\xbc\xff\xc3\x00\x05\x00\xbd\xff\ +\xc3\x00\x05\x00\xbe\xff\xc3\x00\x05\x00\xc2\xffq\x00\x05\x00\ +\xc3\xff\xae\x00\x05\x00\xc4\xffq\x00\x05\x00\xc5\xff\xae\x00\ +\x05\x00\xc6\xffq\x00\x05\x00\xc7\xff\xae\x00\x05\x00\xc9\xff\ +\x85\x00\x05\x00\xcb\xff\x85\x00\x05\x00\xcd\xff\x85\x00\x05\x00\ +\xcf\xff\x85\x00\x05\x00\xd1\xff\x85\x00\x05\x00\xd3\xff\x85\x00\ +\x05\x00\xd5\xff\x85\x00\x05\x00\xd7\xff\x85\x00\x05\x00\xd9\xff\ +\x85\x00\x05\x00\xdb\xff\x85\x00\x05\x00\xdd\xff\x85\x00\x05\x00\ +\xdf\xff\xc3\x00\x05\x00\xe1\xff\xc3\x00\x05\x00\xe3\xff\xc3\x00\ +\x05\x00\xe5\xff\xc3\x00\x05\x00\xfa\xff\xc3\x00\x05\x01\x06\xff\ +\xc3\x00\x05\x01\x08\xff\xc3\x00\x05\x01\x0d\xff\xc3\x00\x05\x01\ +\x0f\xff\x85\x00\x05\x01\x11\xff\x85\x00\x05\x01\x13\xff\x85\x00\ +\x05\x01\x15\xff\x85\x00\x05\x01\x17\xff\xc3\x00\x05\x01\x19\xff\ +\xc3\x00\x05\x01\x1d\xff\xc3\x00\x05\x01!\xff\xc3\x00\x05\x01\ +$\x00)\x00\x05\x01&\x00)\x00\x05\x01+\xff\xc3\x00\ +\x05\x01-\xff\xc3\x00\x05\x01/\xff\xc3\x00\x05\x011\xff\ +\xc3\x00\x05\x013\xff\xc3\x00\x05\x015\xff\xc3\x00\x05\x01\ +6\x00)\x00\x05\x018\x00\x14\x00\x05\x01:\x00\x14\x00\ +\x05\x01C\xffq\x00\x05\x01D\xff\xae\x00\x05\x01F\xff\ +\xae\x00\x05\x01H\xff\x85\x00\x05\x01J\xff\xc3\x00\x05\x01\ +V\xffq\x00\x05\x01_\xffq\x00\x05\x01b\xffq\x00\ +\x05\x01i\xffq\x00\x05\x01y\xff\xae\x00\x05\x01z\xff\ +\xd7\x00\x05\x01{\xff\xd7\x00\x05\x01~\xff\xae\x00\x05\x01\ +\x81\xff\xc3\x00\x05\x01\x82\xff\xd7\x00\x05\x01\x83\xff\xd7\x00\ +\x05\x01\x84\xff\xd7\x00\x05\x01\x87\xff\xd7\x00\x05\x01\x89\xff\ +\xd7\x00\x05\x01\x8c\xff\xae\x00\x05\x01\x8e\xff\xc3\x00\x05\x01\ +\x8f\xff\xae\x00\x05\x01\x90\xff\xae\x00\x05\x01\x93\xff\xae\x00\ +\x05\x01\x99\xff\xae\x00\x05\x01\xa4\xff\x85\x00\x05\x01\xaa\xff\ +q\x00\x05\x01\xae\xff\x85\x00\x05\x01\xb5\xff\x85\x00\x05\x01\ +\xca\xff\xd7\x00\x05\x01\xce\xffq\x00\x05\x01\xcf\xff\x85\x00\ +\x05\x01\xd5\xffq\x00\x05\x01\xd8\xff\x85\x00\x05\x01\xdb\xff\ +\x85\x00\x05\x01\xde\xff\x85\x00\x05\x01\xea\xff\x85\x00\x05\x01\ +\xed\xff\x85\x00\x05\x01\xee\xff\xc3\x00\x05\x01\xf2\xffq\x00\ +\x05\x01\xfa\x00)\x00\x05\x01\xfc\x00)\x00\x05\x01\xfe\x00\ +)\x00\x05\x02\x00\x00\x14\x00\x05\x02W\xff\xc3\x00\x05\x02\ +X\xffq\x00\x05\x02Y\xff\xae\x00\x05\x02`\xff\x85\x00\ +\x05\x02b\xff\xc3\x00\x05\x02j\xff\x85\x00\x05\x02r\xff\ +q\x00\x05\x02s\xffq\x00\x05\x02}\xff\xec\x00\x05\x02\ +\x7f\xff\x85\x00\x05\x02\x85\xff\x85\x00\x05\x02\x87\xff\x85\x00\ +\x05\x02\x89\xff\x85\x00\x05\x02\x8d\xff\x85\x00\x05\x02\xb2\xff\ +\x85\x00\x05\x02\xb4\xff\x85\x00\x05\x02\xce\xff\x85\x00\x05\x02\ +\xcf\xffq\x00\x05\x02\xd9\xffq\x00\x05\x02\xda\xff\xd7\x00\ +\x05\x02\xdb\xffq\x00\x05\x02\xdc\xff\xd7\x00\x05\x02\xdd\xff\ +q\x00\x05\x02\xde\xff\xd7\x00\x05\x02\xe0\xff\x85\x00\x05\x02\ +\xe2\xff\xd7\x00\x05\x02\xe4\xff\xd7\x00\x05\x02\xf0\xff\x85\x00\ +\x05\x02\xf2\xff\x85\x00\x05\x02\xf4\xff\x85\x00\x05\x03\x09\xff\ +q\x00\x05\x03\x0a\xff\x85\x00\x05\x03\x0b\xffq\x00\x05\x03\ +\x0c\xff\x85\x00\x05\x03\x11\xff\x85\x00\x05\x03\x12\xffq\x00\ +\x05\x03\x16\xff\x85\x00\x05\x03\x1a\xff\x85\x00\x05\x03\x1b\xff\ +\x85\x00\x05\x03\x1c\xffq\x00\x05\x03\x1d\xffq\x00\x05\x03\ +\x1e\xff\xae\x00\x05\x03\x1f\xffq\x00\x05\x03 \xff\xae\x00\ +\x05\x03!\xffq\x00\x05\x03\x22\xff\xae\x00\x05\x03#\xff\ +q\x00\x05\x03%\xffq\x00\x05\x03&\xff\xae\x00\x05\x03\ +'\xffq\x00\x05\x03(\xff\xae\x00\x05\x03)\xffq\x00\ +\x05\x03*\xff\xae\x00\x05\x03+\xffq\x00\x05\x03,\xff\ +\xae\x00\x05\x03-\xffq\x00\x05\x03.\xff\xae\x00\x05\x03\ +/\xffq\x00\x05\x030\xff\xae\x00\x05\x031\xffq\x00\ +\x05\x032\xff\xae\x00\x05\x033\xffq\x00\x05\x034\xff\ +\xae\x00\x05\x036\xff\x85\x00\x05\x038\xff\x85\x00\x05\x03\ +:\xff\x85\x00\x05\x03<\xff\x85\x00\x05\x03@\xff\x85\x00\ +\x05\x03B\xff\x85\x00\x05\x03D\xff\x85\x00\x05\x03J\xff\ +\x85\x00\x05\x03L\xff\x85\x00\x05\x03N\xff\x85\x00\x05\x03\ +R\xff\x85\x00\x05\x03T\xff\x85\x00\x05\x03V\xff\x85\x00\ +\x05\x03X\xff\x85\x00\x05\x03Z\xff\x85\x00\x05\x03\x5c\xff\ +\x85\x00\x05\x03^\xff\x85\x00\x05\x03`\xff\x85\x00\x05\x03\ +b\xff\xc3\x00\x05\x03d\xff\xc3\x00\x05\x03f\xff\xc3\x00\ +\x05\x03h\xff\xc3\x00\x05\x03j\xff\xc3\x00\x05\x03l\xff\ +\xc3\x00\x05\x03n\xff\xc3\x00\x05\x03o\x00\x14\x00\x05\x03\ +q\x00\x14\x00\x05\x03s\x00\x14\x00\x05\x03\x8f\x00)\x00\ +\x0a\x00$\xffq\x00\x0a\x007\x00)\x00\x0a\x009\x00\ +)\x00\x0a\x00:\x00)\x00\x0a\x00<\x00\x14\x00\x0a\x00\ +D\xff\xae\x00\x0a\x00F\xff\x85\x00\x0a\x00G\xff\x85\x00\ +\x0a\x00H\xff\x85\x00\x0a\x00J\xff\xc3\x00\x0a\x00P\xff\ +\xc3\x00\x0a\x00Q\xff\xc3\x00\x0a\x00R\xff\x85\x00\x0a\x00\ +S\xff\xc3\x00\x0a\x00T\xff\x85\x00\x0a\x00U\xff\xc3\x00\ +\x0a\x00V\xff\xc3\x00\x0a\x00X\xff\xc3\x00\x0a\x00\x82\xff\ +q\x00\x0a\x00\x83\xffq\x00\x0a\x00\x84\xffq\x00\x0a\x00\ +\x85\xffq\x00\x0a\x00\x86\xffq\x00\x0a\x00\x87\xffq\x00\ +\x0a\x00\x9f\x00\x14\x00\x0a\x00\xa2\xff\x85\x00\x0a\x00\xa3\xff\ +\xae\x00\x0a\x00\xa4\xff\xae\x00\x0a\x00\xa5\xff\xae\x00\x0a\x00\ +\xa6\xff\xae\x00\x0a\x00\xa7\xff\xae\x00\x0a\x00\xa8\xff\xae\x00\ +\x0a\x00\xa9\xff\x85\x00\x0a\x00\xaa\xff\x85\x00\x0a\x00\xab\xff\ +\x85\x00\x0a\x00\xac\xff\x85\x00\x0a\x00\xad\xff\x85\x00\x0a\x00\ +\xb4\xff\x85\x00\x0a\x00\xb5\xff\x85\x00\x0a\x00\xb6\xff\x85\x00\ +\x0a\x00\xb7\xff\x85\x00\x0a\x00\xb8\xff\x85\x00\x0a\x00\xba\xff\ +\x85\x00\x0a\x00\xbb\xff\xc3\x00\x0a\x00\xbc\xff\xc3\x00\x0a\x00\ +\xbd\xff\xc3\x00\x0a\x00\xbe\xff\xc3\x00\x0a\x00\xc2\xffq\x00\ +\x0a\x00\xc3\xff\xae\x00\x0a\x00\xc4\xffq\x00\x0a\x00\xc5\xff\ +\xae\x00\x0a\x00\xc6\xffq\x00\x0a\x00\xc7\xff\xae\x00\x0a\x00\ +\xc9\xff\x85\x00\x0a\x00\xcb\xff\x85\x00\x0a\x00\xcd\xff\x85\x00\ +\x0a\x00\xcf\xff\x85\x00\x0a\x00\xd1\xff\x85\x00\x0a\x00\xd3\xff\ +\x85\x00\x0a\x00\xd5\xff\x85\x00\x0a\x00\xd7\xff\x85\x00\x0a\x00\ +\xd9\xff\x85\x00\x0a\x00\xdb\xff\x85\x00\x0a\x00\xdd\xff\x85\x00\ +\x0a\x00\xdf\xff\xc3\x00\x0a\x00\xe1\xff\xc3\x00\x0a\x00\xe3\xff\ +\xc3\x00\x0a\x00\xe5\xff\xc3\x00\x0a\x00\xfa\xff\xc3\x00\x0a\x01\ +\x06\xff\xc3\x00\x0a\x01\x08\xff\xc3\x00\x0a\x01\x0d\xff\xc3\x00\ +\x0a\x01\x0f\xff\x85\x00\x0a\x01\x11\xff\x85\x00\x0a\x01\x13\xff\ +\x85\x00\x0a\x01\x15\xff\x85\x00\x0a\x01\x17\xff\xc3\x00\x0a\x01\ +\x19\xff\xc3\x00\x0a\x01\x1d\xff\xc3\x00\x0a\x01!\xff\xc3\x00\ +\x0a\x01$\x00)\x00\x0a\x01&\x00)\x00\x0a\x01+\xff\ +\xc3\x00\x0a\x01-\xff\xc3\x00\x0a\x01/\xff\xc3\x00\x0a\x01\ +1\xff\xc3\x00\x0a\x013\xff\xc3\x00\x0a\x015\xff\xc3\x00\ +\x0a\x016\x00)\x00\x0a\x018\x00\x14\x00\x0a\x01:\x00\ +\x14\x00\x0a\x01C\xffq\x00\x0a\x01D\xff\xae\x00\x0a\x01\ +F\xff\xae\x00\x0a\x01H\xff\x85\x00\x0a\x01J\xff\xc3\x00\ +\x0a\x01V\xffq\x00\x0a\x01_\xffq\x00\x0a\x01b\xff\ +q\x00\x0a\x01i\xffq\x00\x0a\x01y\xff\xae\x00\x0a\x01\ +z\xff\xd7\x00\x0a\x01{\xff\xd7\x00\x0a\x01~\xff\xae\x00\ +\x0a\x01\x81\xff\xc3\x00\x0a\x01\x82\xff\xd7\x00\x0a\x01\x83\xff\ +\xd7\x00\x0a\x01\x84\xff\xd7\x00\x0a\x01\x87\xff\xd7\x00\x0a\x01\ +\x89\xff\xd7\x00\x0a\x01\x8c\xff\xae\x00\x0a\x01\x8e\xff\xc3\x00\ +\x0a\x01\x8f\xff\xae\x00\x0a\x01\x90\xff\xae\x00\x0a\x01\x93\xff\ +\xae\x00\x0a\x01\x99\xff\xae\x00\x0a\x01\xa4\xff\x85\x00\x0a\x01\ +\xaa\xffq\x00\x0a\x01\xae\xff\x85\x00\x0a\x01\xb5\xff\x85\x00\ +\x0a\x01\xca\xff\xd7\x00\x0a\x01\xce\xffq\x00\x0a\x01\xcf\xff\ +\x85\x00\x0a\x01\xd5\xffq\x00\x0a\x01\xd8\xff\x85\x00\x0a\x01\ +\xdb\xff\x85\x00\x0a\x01\xde\xff\x85\x00\x0a\x01\xea\xff\x85\x00\ +\x0a\x01\xed\xff\x85\x00\x0a\x01\xee\xff\xc3\x00\x0a\x01\xf2\xff\ +q\x00\x0a\x01\xfa\x00)\x00\x0a\x01\xfc\x00)\x00\x0a\x01\ +\xfe\x00)\x00\x0a\x02\x00\x00\x14\x00\x0a\x02W\xff\xc3\x00\ +\x0a\x02X\xffq\x00\x0a\x02Y\xff\xae\x00\x0a\x02`\xff\ +\x85\x00\x0a\x02b\xff\xc3\x00\x0a\x02j\xff\x85\x00\x0a\x02\ +r\xffq\x00\x0a\x02s\xffq\x00\x0a\x02}\xff\xec\x00\ +\x0a\x02\x7f\xff\x85\x00\x0a\x02\x85\xff\x85\x00\x0a\x02\x87\xff\ +\x85\x00\x0a\x02\x89\xff\x85\x00\x0a\x02\x8d\xff\x85\x00\x0a\x02\ +\xb2\xff\x85\x00\x0a\x02\xb4\xff\x85\x00\x0a\x02\xce\xff\x85\x00\ +\x0a\x02\xcf\xffq\x00\x0a\x02\xd9\xffq\x00\x0a\x02\xda\xff\ +\xd7\x00\x0a\x02\xdb\xffq\x00\x0a\x02\xdc\xff\xd7\x00\x0a\x02\ +\xdd\xffq\x00\x0a\x02\xde\xff\xd7\x00\x0a\x02\xe0\xff\x85\x00\ +\x0a\x02\xe2\xff\xd7\x00\x0a\x02\xe4\xff\xd7\x00\x0a\x02\xf0\xff\ +\x85\x00\x0a\x02\xf2\xff\x85\x00\x0a\x02\xf4\xff\x85\x00\x0a\x03\ +\x09\xffq\x00\x0a\x03\x0a\xff\x85\x00\x0a\x03\x0b\xffq\x00\ +\x0a\x03\x0c\xff\x85\x00\x0a\x03\x11\xff\x85\x00\x0a\x03\x12\xff\ +q\x00\x0a\x03\x16\xff\x85\x00\x0a\x03\x1a\xff\x85\x00\x0a\x03\ +\x1b\xff\x85\x00\x0a\x03\x1c\xffq\x00\x0a\x03\x1d\xffq\x00\ +\x0a\x03\x1e\xff\xae\x00\x0a\x03\x1f\xffq\x00\x0a\x03 \xff\ +\xae\x00\x0a\x03!\xffq\x00\x0a\x03\x22\xff\xae\x00\x0a\x03\ +#\xffq\x00\x0a\x03%\xffq\x00\x0a\x03&\xff\xae\x00\ +\x0a\x03'\xffq\x00\x0a\x03(\xff\xae\x00\x0a\x03)\xff\ +q\x00\x0a\x03*\xff\xae\x00\x0a\x03+\xffq\x00\x0a\x03\ +,\xff\xae\x00\x0a\x03-\xffq\x00\x0a\x03.\xff\xae\x00\ +\x0a\x03/\xffq\x00\x0a\x030\xff\xae\x00\x0a\x031\xff\ +q\x00\x0a\x032\xff\xae\x00\x0a\x033\xffq\x00\x0a\x03\ +4\xff\xae\x00\x0a\x036\xff\x85\x00\x0a\x038\xff\x85\x00\ +\x0a\x03:\xff\x85\x00\x0a\x03<\xff\x85\x00\x0a\x03@\xff\ +\x85\x00\x0a\x03B\xff\x85\x00\x0a\x03D\xff\x85\x00\x0a\x03\ +J\xff\x85\x00\x0a\x03L\xff\x85\x00\x0a\x03N\xff\x85\x00\ +\x0a\x03R\xff\x85\x00\x0a\x03T\xff\x85\x00\x0a\x03V\xff\ +\x85\x00\x0a\x03X\xff\x85\x00\x0a\x03Z\xff\x85\x00\x0a\x03\ +\x5c\xff\x85\x00\x0a\x03^\xff\x85\x00\x0a\x03`\xff\x85\x00\ +\x0a\x03b\xff\xc3\x00\x0a\x03d\xff\xc3\x00\x0a\x03f\xff\ +\xc3\x00\x0a\x03h\xff\xc3\x00\x0a\x03j\xff\xc3\x00\x0a\x03\ +l\xff\xc3\x00\x0a\x03n\xff\xc3\x00\x0a\x03o\x00\x14\x00\ +\x0a\x03q\x00\x14\x00\x0a\x03s\x00\x14\x00\x0a\x03\x8f\x00\ +)\x00\x0b\x00-\x00\xb8\x00\x0f\x00&\xff\x9a\x00\x0f\x00\ +*\xff\x9a\x00\x0f\x002\xff\x9a\x00\x0f\x004\xff\x9a\x00\ +\x0f\x007\xffq\x00\x0f\x008\xff\xd7\x00\x0f\x009\xff\ +\x85\x00\x0f\x00:\xff\x85\x00\x0f\x00<\xff\x85\x00\x0f\x00\ +\x89\xff\x9a\x00\x0f\x00\x94\xff\x9a\x00\x0f\x00\x95\xff\x9a\x00\ +\x0f\x00\x96\xff\x9a\x00\x0f\x00\x97\xff\x9a\x00\x0f\x00\x98\xff\ +\x9a\x00\x0f\x00\x9a\xff\x9a\x00\x0f\x00\x9b\xff\xd7\x00\x0f\x00\ +\x9c\xff\xd7\x00\x0f\x00\x9d\xff\xd7\x00\x0f\x00\x9e\xff\xd7\x00\ +\x0f\x00\x9f\xff\x85\x00\x0f\x00\xc8\xff\x9a\x00\x0f\x00\xca\xff\ +\x9a\x00\x0f\x00\xcc\xff\x9a\x00\x0f\x00\xce\xff\x9a\x00\x0f\x00\ +\xde\xff\x9a\x00\x0f\x00\xe0\xff\x9a\x00\x0f\x00\xe2\xff\x9a\x00\ +\x0f\x00\xe4\xff\x9a\x00\x0f\x01\x0e\xff\x9a\x00\x0f\x01\x10\xff\ +\x9a\x00\x0f\x01\x12\xff\x9a\x00\x0f\x01\x14\xff\x9a\x00\x0f\x01\ +$\xffq\x00\x0f\x01&\xffq\x00\x0f\x01*\xff\xd7\x00\ +\x0f\x01,\xff\xd7\x00\x0f\x01.\xff\xd7\x00\x0f\x010\xff\ +\xd7\x00\x0f\x012\xff\xd7\x00\x0f\x014\xff\xd7\x00\x0f\x01\ +6\xff\x85\x00\x0f\x018\xff\x85\x00\x0f\x01:\xff\x85\x00\ +\x0f\x01G\xff\x9a\x00\x0f\x01f\xff\xae\x00\x0f\x01m\xff\ +\xae\x00\x0f\x01q\xffq\x00\x0f\x01r\xff\x85\x00\x0f\x01\ +s\xff\x9a\x00\x0f\x01u\xff\x85\x00\x0f\x01x\xff\x85\x00\ +\x0f\x01\x85\xff\xd7\x00\x0f\x01\x9d\xffq\x00\x0f\x01\x9f\xff\ +\x9a\x00\x0f\x01\xa6\xffq\x00\x0f\x01\xb8\xff\x9a\x00\x0f\x01\ +\xbb\xff\x9a\x00\x0f\x01\xbc\xffq\x00\x0f\x01\xbe\xff\xae\x00\ +\x0f\x01\xc1\xff\x5c\x00\x0f\x01\xc4\xffq\x00\x0f\x01\xdc\xff\ +\x9a\x00\x0f\x01\xe1\xff\x85\x00\x0f\x01\xe4\xff\x9a\x00\x0f\x01\ +\xfa\xff\x85\x00\x0f\x01\xfc\xff\x85\x00\x0f\x01\xfe\xff\x85\x00\ +\x0f\x02\x00\xff\x85\x00\x0f\x02T\xff\x85\x00\x0f\x02_\xff\ +\x9a\x00\x0f\x02a\xff\xd7\x00\x0f\x02l\xff\x9a\x00\x0f\x02\ +|\xff\x5c\x00\x0f\x02~\xff\x9a\x00\x0f\x02\x80\xff\x85\x00\ +\x0f\x02\x82\xff\x85\x00\x0f\x02\x84\xff\x9a\x00\x0f\x02\x86\xff\ +\x9a\x00\x0f\x02\x88\xff\x9a\x00\x0f\x02\x8a\xff\x9a\x00\x0f\x02\ +\x8c\xff\x9a\x00\x0f\x02\xa9\xffq\x00\x0f\x02\xaa\xff\x9a\x00\ +\x0f\x02\xb1\xff\x9a\x00\x0f\x02\xb3\xff\x9a\x00\x0f\x02\xb5\xff\ +q\x00\x0f\x02\xb6\xff\x9a\x00\x0f\x02\xb7\xff\x85\x00\x0f\x02\ +\xb9\xff\x85\x00\x0f\x02\xbd\xffq\x00\x0f\x02\xbe\xff\x9a\x00\ +\x0f\x02\xbf\xff\x5c\x00\x0f\x02\xc0\xff\x85\x00\x0f\x02\xc1\xff\ +\x5c\x00\x0f\x02\xc2\xff\x85\x00\x0f\x02\xc5\xff\x85\x00\x0f\x02\ +\xc7\xff\x85\x00\x0f\x02\xd4\xff\x5c\x00\x0f\x02\xd5\xff\x85\x00\ +\x0f\x02\xef\xff\x9a\x00\x0f\x02\xf1\xff\x9a\x00\x0f\x02\xf3\xff\ +\x9a\x00\x0f\x02\xfd\xff\x5c\x00\x0f\x02\xfe\xff\x85\x00\x0f\x03\ +\x0d\xff\x85\x00\x0f\x03\x0e\xff\x9a\x00\x0f\x03\x0f\xff\x85\x00\ +\x0f\x03\x10\xff\x9a\x00\x0f\x03\x15\xff\x9a\x00\x0f\x03\x17\xff\ +q\x00\x0f\x03\x18\xff\x9a\x00\x0f\x03I\xff\x9a\x00\x0f\x03\ +K\xff\x9a\x00\x0f\x03M\xff\x9a\x00\x0f\x03O\xff\x9a\x00\ +\x0f\x03Q\xff\x9a\x00\x0f\x03S\xff\x9a\x00\x0f\x03U\xff\ +\x9a\x00\x0f\x03W\xff\x9a\x00\x0f\x03Y\xff\x9a\x00\x0f\x03\ +[\xff\x9a\x00\x0f\x03]\xff\x9a\x00\x0f\x03_\xff\x9a\x00\ +\x0f\x03a\xff\xd7\x00\x0f\x03c\xff\xd7\x00\x0f\x03e\xff\ +\xd7\x00\x0f\x03g\xff\xd7\x00\x0f\x03i\xff\xd7\x00\x0f\x03\ +k\xff\xd7\x00\x0f\x03m\xff\xd7\x00\x0f\x03o\xff\x85\x00\ +\x0f\x03q\xff\x85\x00\x0f\x03s\xff\x85\x00\x0f\x03\x8f\xff\ +q\x00\x10\x007\xff\xae\x00\x10\x01$\xff\xae\x00\x10\x01\ +&\xff\xae\x00\x10\x01q\xff\xae\x00\x10\x01\x9d\xff\xae\x00\ +\x10\x01\xa6\xff\xae\x00\x10\x01\xbc\xff\xae\x00\x10\x01\xc4\xff\ +\xae\x00\x10\x01\xdc\xff\xd7\x00\x10\x01\xe4\xff\xd7\x00\x10\x02\ +\xa9\xff\xae\x00\x10\x02\xaa\xff\xd7\x00\x10\x02\xb5\xff\xae\x00\ +\x10\x02\xb6\xff\xd7\x00\x10\x02\xbd\xff\xae\x00\x10\x02\xbe\xff\ +\xd7\x00\x10\x03\x17\xff\xae\x00\x10\x03\x18\xff\xd7\x00\x10\x03\ +\x8f\xff\xae\x00\x11\x00&\xff\x9a\x00\x11\x00*\xff\x9a\x00\ +\x11\x002\xff\x9a\x00\x11\x004\xff\x9a\x00\x11\x007\xff\ +q\x00\x11\x008\xff\xd7\x00\x11\x009\xff\x85\x00\x11\x00\ +:\xff\x85\x00\x11\x00<\xff\x85\x00\x11\x00\x89\xff\x9a\x00\ +\x11\x00\x94\xff\x9a\x00\x11\x00\x95\xff\x9a\x00\x11\x00\x96\xff\ +\x9a\x00\x11\x00\x97\xff\x9a\x00\x11\x00\x98\xff\x9a\x00\x11\x00\ +\x9a\xff\x9a\x00\x11\x00\x9b\xff\xd7\x00\x11\x00\x9c\xff\xd7\x00\ +\x11\x00\x9d\xff\xd7\x00\x11\x00\x9e\xff\xd7\x00\x11\x00\x9f\xff\ +\x85\x00\x11\x00\xc8\xff\x9a\x00\x11\x00\xca\xff\x9a\x00\x11\x00\ +\xcc\xff\x9a\x00\x11\x00\xce\xff\x9a\x00\x11\x00\xde\xff\x9a\x00\ +\x11\x00\xe0\xff\x9a\x00\x11\x00\xe2\xff\x9a\x00\x11\x00\xe4\xff\ +\x9a\x00\x11\x01\x0e\xff\x9a\x00\x11\x01\x10\xff\x9a\x00\x11\x01\ +\x12\xff\x9a\x00\x11\x01\x14\xff\x9a\x00\x11\x01$\xffq\x00\ +\x11\x01&\xffq\x00\x11\x01*\xff\xd7\x00\x11\x01,\xff\ +\xd7\x00\x11\x01.\xff\xd7\x00\x11\x010\xff\xd7\x00\x11\x01\ +2\xff\xd7\x00\x11\x014\xff\xd7\x00\x11\x016\xff\x85\x00\ +\x11\x018\xff\x85\x00\x11\x01:\xff\x85\x00\x11\x01G\xff\ +\x9a\x00\x11\x01f\xff\xae\x00\x11\x01m\xff\xae\x00\x11\x01\ +q\xffq\x00\x11\x01r\xff\x85\x00\x11\x01s\xff\x9a\x00\ +\x11\x01u\xff\x85\x00\x11\x01x\xff\x85\x00\x11\x01\x85\xff\ +\xd7\x00\x11\x01\x9d\xffq\x00\x11\x01\x9f\xff\x9a\x00\x11\x01\ +\xa6\xffq\x00\x11\x01\xb8\xff\x9a\x00\x11\x01\xbb\xff\x9a\x00\ +\x11\x01\xbc\xffq\x00\x11\x01\xbe\xff\xae\x00\x11\x01\xc1\xff\ +\x5c\x00\x11\x01\xc4\xffq\x00\x11\x01\xdc\xff\x9a\x00\x11\x01\ +\xe1\xff\x85\x00\x11\x01\xe4\xff\x9a\x00\x11\x01\xfa\xff\x85\x00\ +\x11\x01\xfc\xff\x85\x00\x11\x01\xfe\xff\x85\x00\x11\x02\x00\xff\ +\x85\x00\x11\x02T\xff\x85\x00\x11\x02_\xff\x9a\x00\x11\x02\ +a\xff\xd7\x00\x11\x02l\xff\x9a\x00\x11\x02|\xff\x5c\x00\ +\x11\x02~\xff\x9a\x00\x11\x02\x80\xff\x85\x00\x11\x02\x82\xff\ +\x85\x00\x11\x02\x84\xff\x9a\x00\x11\x02\x86\xff\x9a\x00\x11\x02\ +\x88\xff\x9a\x00\x11\x02\x8a\xff\x9a\x00\x11\x02\x8c\xff\x9a\x00\ +\x11\x02\xa9\xffq\x00\x11\x02\xaa\xff\x9a\x00\x11\x02\xb1\xff\ +\x9a\x00\x11\x02\xb3\xff\x9a\x00\x11\x02\xb5\xffq\x00\x11\x02\ +\xb6\xff\x9a\x00\x11\x02\xb7\xff\x85\x00\x11\x02\xb9\xff\x85\x00\ +\x11\x02\xbd\xffq\x00\x11\x02\xbe\xff\x9a\x00\x11\x02\xbf\xff\ +\x5c\x00\x11\x02\xc0\xff\x85\x00\x11\x02\xc1\xff\x5c\x00\x11\x02\ +\xc2\xff\x85\x00\x11\x02\xc5\xff\x85\x00\x11\x02\xc7\xff\x85\x00\ +\x11\x02\xd4\xff\x5c\x00\x11\x02\xd5\xff\x85\x00\x11\x02\xef\xff\ +\x9a\x00\x11\x02\xf1\xff\x9a\x00\x11\x02\xf3\xff\x9a\x00\x11\x02\ +\xfd\xff\x5c\x00\x11\x02\xfe\xff\x85\x00\x11\x03\x0d\xff\x85\x00\ +\x11\x03\x0e\xff\x9a\x00\x11\x03\x0f\xff\x85\x00\x11\x03\x10\xff\ +\x9a\x00\x11\x03\x15\xff\x9a\x00\x11\x03\x17\xffq\x00\x11\x03\ +\x18\xff\x9a\x00\x11\x03I\xff\x9a\x00\x11\x03K\xff\x9a\x00\ +\x11\x03M\xff\x9a\x00\x11\x03O\xff\x9a\x00\x11\x03Q\xff\ +\x9a\x00\x11\x03S\xff\x9a\x00\x11\x03U\xff\x9a\x00\x11\x03\ +W\xff\x9a\x00\x11\x03Y\xff\x9a\x00\x11\x03[\xff\x9a\x00\ +\x11\x03]\xff\x9a\x00\x11\x03_\xff\x9a\x00\x11\x03a\xff\ +\xd7\x00\x11\x03c\xff\xd7\x00\x11\x03e\xff\xd7\x00\x11\x03\ +g\xff\xd7\x00\x11\x03i\xff\xd7\x00\x11\x03k\xff\xd7\x00\ +\x11\x03m\xff\xd7\x00\x11\x03o\xff\x85\x00\x11\x03q\xff\ +\x85\x00\x11\x03s\xff\x85\x00\x11\x03\x8f\xffq\x00$\x00\ +\x05\xffq\x00$\x00\x0a\xffq\x00$\x00&\xff\xd7\x00\ +$\x00*\xff\xd7\x00$\x00-\x01\x0a\x00$\x002\xff\ +\xd7\x00$\x004\xff\xd7\x00$\x007\xffq\x00$\x00\ +9\xff\xae\x00$\x00:\xff\xae\x00$\x00<\xff\x85\x00\ +$\x00\x89\xff\xd7\x00$\x00\x94\xff\xd7\x00$\x00\x95\xff\ +\xd7\x00$\x00\x96\xff\xd7\x00$\x00\x97\xff\xd7\x00$\x00\ +\x98\xff\xd7\x00$\x00\x9a\xff\xd7\x00$\x00\x9f\xff\x85\x00\ +$\x00\xc8\xff\xd7\x00$\x00\xca\xff\xd7\x00$\x00\xcc\xff\ +\xd7\x00$\x00\xce\xff\xd7\x00$\x00\xde\xff\xd7\x00$\x00\ +\xe0\xff\xd7\x00$\x00\xe2\xff\xd7\x00$\x00\xe4\xff\xd7\x00\ +$\x01\x0e\xff\xd7\x00$\x01\x10\xff\xd7\x00$\x01\x12\xff\ +\xd7\x00$\x01\x14\xff\xd7\x00$\x01$\xffq\x00$\x01\ +&\xffq\x00$\x016\xff\xae\x00$\x018\xff\x85\x00\ +$\x01:\xff\x85\x00$\x01G\xff\xd7\x00$\x01\xfa\xff\ +\xae\x00$\x01\xfc\xff\xae\x00$\x01\xfe\xff\xae\x00$\x02\ +\x00\xff\x85\x00$\x02\x07\xffq\x00$\x02\x0b\xffq\x00\ +$\x02_\xff\xd7\x00$\x03I\xff\xd7\x00$\x03K\xff\ +\xd7\x00$\x03M\xff\xd7\x00$\x03O\xff\xd7\x00$\x03\ +Q\xff\xd7\x00$\x03S\xff\xd7\x00$\x03U\xff\xd7\x00\ +$\x03W\xff\xd7\x00$\x03Y\xff\xd7\x00$\x03[\xff\ +\xd7\x00$\x03]\xff\xd7\x00$\x03_\xff\xd7\x00$\x03\ +o\xff\x85\x00$\x03q\xff\x85\x00$\x03s\xff\x85\x00\ +$\x03\x8f\xffq\x00%\x00\x0f\xff\xae\x00%\x00\x11\xff\ +\xae\x00%\x00$\xff\xd7\x00%\x007\xff\xc3\x00%\x00\ +9\xff\xec\x00%\x00:\xff\xec\x00%\x00;\xff\xd7\x00\ +%\x00<\xff\xec\x00%\x00=\xff\xec\x00%\x00\x82\xff\ +\xd7\x00%\x00\x83\xff\xd7\x00%\x00\x84\xff\xd7\x00%\x00\ +\x85\xff\xd7\x00%\x00\x86\xff\xd7\x00%\x00\x87\xff\xd7\x00\ +%\x00\x9f\xff\xec\x00%\x00\xc2\xff\xd7\x00%\x00\xc4\xff\ +\xd7\x00%\x00\xc6\xff\xd7\x00%\x01$\xff\xc3\x00%\x01\ +&\xff\xc3\x00%\x016\xff\xec\x00%\x018\xff\xec\x00\ +%\x01:\xff\xec\x00%\x01;\xff\xec\x00%\x01=\xff\ +\xec\x00%\x01?\xff\xec\x00%\x01C\xff\xd7\x00%\x01\ +\xa0\xff\xec\x00%\x01\xfa\xff\xec\x00%\x01\xfc\xff\xec\x00\ +%\x01\xfe\xff\xec\x00%\x02\x00\xff\xec\x00%\x02\x08\xff\ +\xae\x00%\x02\x0c\xff\xae\x00%\x02X\xff\xd7\x00%\x03\ +\x1d\xff\xd7\x00%\x03\x1f\xff\xd7\x00%\x03!\xff\xd7\x00\ +%\x03#\xff\xd7\x00%\x03%\xff\xd7\x00%\x03'\xff\ +\xd7\x00%\x03)\xff\xd7\x00%\x03+\xff\xd7\x00%\x03\ +-\xff\xd7\x00%\x03/\xff\xd7\x00%\x031\xff\xd7\x00\ +%\x033\xff\xd7\x00%\x03o\xff\xec\x00%\x03q\xff\ +\xec\x00%\x03s\xff\xec\x00%\x03\x8f\xff\xc3\x00&\x00\ +&\xff\xd7\x00&\x00*\xff\xd7\x00&\x002\xff\xd7\x00\ +&\x004\xff\xd7\x00&\x00\x89\xff\xd7\x00&\x00\x94\xff\ +\xd7\x00&\x00\x95\xff\xd7\x00&\x00\x96\xff\xd7\x00&\x00\ +\x97\xff\xd7\x00&\x00\x98\xff\xd7\x00&\x00\x9a\xff\xd7\x00\ +&\x00\xc8\xff\xd7\x00&\x00\xca\xff\xd7\x00&\x00\xcc\xff\ +\xd7\x00&\x00\xce\xff\xd7\x00&\x00\xde\xff\xd7\x00&\x00\ +\xe0\xff\xd7\x00&\x00\xe2\xff\xd7\x00&\x00\xe4\xff\xd7\x00\ +&\x01\x0e\xff\xd7\x00&\x01\x10\xff\xd7\x00&\x01\x12\xff\ +\xd7\x00&\x01\x14\xff\xd7\x00&\x01G\xff\xd7\x00&\x02\ +_\xff\xd7\x00&\x03I\xff\xd7\x00&\x03K\xff\xd7\x00\ +&\x03M\xff\xd7\x00&\x03O\xff\xd7\x00&\x03Q\xff\ +\xd7\x00&\x03S\xff\xd7\x00&\x03U\xff\xd7\x00&\x03\ +W\xff\xd7\x00&\x03Y\xff\xd7\x00&\x03[\xff\xd7\x00\ +&\x03]\xff\xd7\x00&\x03_\xff\xd7\x00'\x00\x0f\xff\ +\xae\x00'\x00\x11\xff\xae\x00'\x00$\xff\xd7\x00'\x00\ +7\xff\xc3\x00'\x009\xff\xec\x00'\x00:\xff\xec\x00\ +'\x00;\xff\xd7\x00'\x00<\xff\xec\x00'\x00=\xff\ +\xec\x00'\x00\x82\xff\xd7\x00'\x00\x83\xff\xd7\x00'\x00\ +\x84\xff\xd7\x00'\x00\x85\xff\xd7\x00'\x00\x86\xff\xd7\x00\ +'\x00\x87\xff\xd7\x00'\x00\x9f\xff\xec\x00'\x00\xc2\xff\ +\xd7\x00'\x00\xc4\xff\xd7\x00'\x00\xc6\xff\xd7\x00'\x01\ +$\xff\xc3\x00'\x01&\xff\xc3\x00'\x016\xff\xec\x00\ +'\x018\xff\xec\x00'\x01:\xff\xec\x00'\x01;\xff\ +\xec\x00'\x01=\xff\xec\x00'\x01?\xff\xec\x00'\x01\ +C\xff\xd7\x00'\x01\xa0\xff\xec\x00'\x01\xfa\xff\xec\x00\ +'\x01\xfc\xff\xec\x00'\x01\xfe\xff\xec\x00'\x02\x00\xff\ +\xec\x00'\x02\x08\xff\xae\x00'\x02\x0c\xff\xae\x00'\x02\ +X\xff\xd7\x00'\x03\x1d\xff\xd7\x00'\x03\x1f\xff\xd7\x00\ +'\x03!\xff\xd7\x00'\x03#\xff\xd7\x00'\x03%\xff\ +\xd7\x00'\x03'\xff\xd7\x00'\x03)\xff\xd7\x00'\x03\ ++\xff\xd7\x00'\x03-\xff\xd7\x00'\x03/\xff\xd7\x00\ +'\x031\xff\xd7\x00'\x033\xff\xd7\x00'\x03o\xff\ +\xec\x00'\x03q\xff\xec\x00'\x03s\xff\xec\x00'\x03\ +\x8f\xff\xc3\x00(\x00-\x00{\x00)\x00\x0f\xff\x85\x00\ +)\x00\x11\xff\x85\x00)\x00\x22\x00)\x00)\x00$\xff\ +\xd7\x00)\x00\x82\xff\xd7\x00)\x00\x83\xff\xd7\x00)\x00\ +\x84\xff\xd7\x00)\x00\x85\xff\xd7\x00)\x00\x86\xff\xd7\x00\ +)\x00\x87\xff\xd7\x00)\x00\xc2\xff\xd7\x00)\x00\xc4\xff\ +\xd7\x00)\x00\xc6\xff\xd7\x00)\x01C\xff\xd7\x00)\x02\ +\x08\xff\x85\x00)\x02\x0c\xff\x85\x00)\x02X\xff\xd7\x00\ +)\x03\x1d\xff\xd7\x00)\x03\x1f\xff\xd7\x00)\x03!\xff\ +\xd7\x00)\x03#\xff\xd7\x00)\x03%\xff\xd7\x00)\x03\ +'\xff\xd7\x00)\x03)\xff\xd7\x00)\x03+\xff\xd7\x00\ +)\x03-\xff\xd7\x00)\x03/\xff\xd7\x00)\x031\xff\ +\xd7\x00)\x033\xff\xd7\x00.\x00&\xff\xd7\x00.\x00\ +*\xff\xd7\x00.\x002\xff\xd7\x00.\x004\xff\xd7\x00\ +.\x00\x89\xff\xd7\x00.\x00\x94\xff\xd7\x00.\x00\x95\xff\ +\xd7\x00.\x00\x96\xff\xd7\x00.\x00\x97\xff\xd7\x00.\x00\ +\x98\xff\xd7\x00.\x00\x9a\xff\xd7\x00.\x00\xc8\xff\xd7\x00\ +.\x00\xca\xff\xd7\x00.\x00\xcc\xff\xd7\x00.\x00\xce\xff\ +\xd7\x00.\x00\xde\xff\xd7\x00.\x00\xe0\xff\xd7\x00.\x00\ +\xe2\xff\xd7\x00.\x00\xe4\xff\xd7\x00.\x01\x0e\xff\xd7\x00\ +.\x01\x10\xff\xd7\x00.\x01\x12\xff\xd7\x00.\x01\x14\xff\ +\xd7\x00.\x01G\xff\xd7\x00.\x02_\xff\xd7\x00.\x03\ +I\xff\xd7\x00.\x03K\xff\xd7\x00.\x03M\xff\xd7\x00\ +.\x03O\xff\xd7\x00.\x03Q\xff\xd7\x00.\x03S\xff\ +\xd7\x00.\x03U\xff\xd7\x00.\x03W\xff\xd7\x00.\x03\ +Y\xff\xd7\x00.\x03[\xff\xd7\x00.\x03]\xff\xd7\x00\ +.\x03_\xff\xd7\x00/\x00\x05\xff\x5c\x00/\x00\x0a\xff\ +\x5c\x00/\x00&\xff\xd7\x00/\x00*\xff\xd7\x00/\x00\ +2\xff\xd7\x00/\x004\xff\xd7\x00/\x007\xff\xd7\x00\ +/\x008\xff\xec\x00/\x009\xff\xd7\x00/\x00:\xff\ +\xd7\x00/\x00<\xff\xc3\x00/\x00\x89\xff\xd7\x00/\x00\ +\x94\xff\xd7\x00/\x00\x95\xff\xd7\x00/\x00\x96\xff\xd7\x00\ +/\x00\x97\xff\xd7\x00/\x00\x98\xff\xd7\x00/\x00\x9a\xff\ +\xd7\x00/\x00\x9b\xff\xec\x00/\x00\x9c\xff\xec\x00/\x00\ +\x9d\xff\xec\x00/\x00\x9e\xff\xec\x00/\x00\x9f\xff\xc3\x00\ +/\x00\xc8\xff\xd7\x00/\x00\xca\xff\xd7\x00/\x00\xcc\xff\ +\xd7\x00/\x00\xce\xff\xd7\x00/\x00\xde\xff\xd7\x00/\x00\ +\xe0\xff\xd7\x00/\x00\xe2\xff\xd7\x00/\x00\xe4\xff\xd7\x00\ +/\x01\x0e\xff\xd7\x00/\x01\x10\xff\xd7\x00/\x01\x12\xff\ +\xd7\x00/\x01\x14\xff\xd7\x00/\x01$\xff\xd7\x00/\x01\ +&\xff\xd7\x00/\x01*\xff\xec\x00/\x01,\xff\xec\x00\ +/\x01.\xff\xec\x00/\x010\xff\xec\x00/\x012\xff\ +\xec\x00/\x014\xff\xec\x00/\x016\xff\xd7\x00/\x01\ +8\xff\xc3\x00/\x01:\xff\xc3\x00/\x01G\xff\xd7\x00\ +/\x01\xfa\xff\xd7\x00/\x01\xfc\xff\xd7\x00/\x01\xfe\xff\ +\xd7\x00/\x02\x00\xff\xc3\x00/\x02\x07\xff\x5c\x00/\x02\ +\x0b\xff\x5c\x00/\x02_\xff\xd7\x00/\x02a\xff\xec\x00\ +/\x03I\xff\xd7\x00/\x03K\xff\xd7\x00/\x03M\xff\ +\xd7\x00/\x03O\xff\xd7\x00/\x03Q\xff\xd7\x00/\x03\ +S\xff\xd7\x00/\x03U\xff\xd7\x00/\x03W\xff\xd7\x00\ +/\x03Y\xff\xd7\x00/\x03[\xff\xd7\x00/\x03]\xff\ +\xd7\x00/\x03_\xff\xd7\x00/\x03a\xff\xec\x00/\x03\ +c\xff\xec\x00/\x03e\xff\xec\x00/\x03g\xff\xec\x00\ +/\x03i\xff\xec\x00/\x03k\xff\xec\x00/\x03m\xff\ +\xec\x00/\x03o\xff\xc3\x00/\x03q\xff\xc3\x00/\x03\ +s\xff\xc3\x00/\x03\x8f\xff\xd7\x002\x00\x0f\xff\xae\x00\ +2\x00\x11\xff\xae\x002\x00$\xff\xd7\x002\x007\xff\ +\xc3\x002\x009\xff\xec\x002\x00:\xff\xec\x002\x00\ +;\xff\xd7\x002\x00<\xff\xec\x002\x00=\xff\xec\x00\ +2\x00\x82\xff\xd7\x002\x00\x83\xff\xd7\x002\x00\x84\xff\ +\xd7\x002\x00\x85\xff\xd7\x002\x00\x86\xff\xd7\x002\x00\ +\x87\xff\xd7\x002\x00\x9f\xff\xec\x002\x00\xc2\xff\xd7\x00\ +2\x00\xc4\xff\xd7\x002\x00\xc6\xff\xd7\x002\x01$\xff\ +\xc3\x002\x01&\xff\xc3\x002\x016\xff\xec\x002\x01\ +8\xff\xec\x002\x01:\xff\xec\x002\x01;\xff\xec\x00\ +2\x01=\xff\xec\x002\x01?\xff\xec\x002\x01C\xff\ +\xd7\x002\x01\xa0\xff\xec\x002\x01\xfa\xff\xec\x002\x01\ +\xfc\xff\xec\x002\x01\xfe\xff\xec\x002\x02\x00\xff\xec\x00\ +2\x02\x08\xff\xae\x002\x02\x0c\xff\xae\x002\x02X\xff\ +\xd7\x002\x03\x1d\xff\xd7\x002\x03\x1f\xff\xd7\x002\x03\ +!\xff\xd7\x002\x03#\xff\xd7\x002\x03%\xff\xd7\x00\ +2\x03'\xff\xd7\x002\x03)\xff\xd7\x002\x03+\xff\ +\xd7\x002\x03-\xff\xd7\x002\x03/\xff\xd7\x002\x03\ +1\xff\xd7\x002\x033\xff\xd7\x002\x03o\xff\xec\x00\ +2\x03q\xff\xec\x002\x03s\xff\xec\x002\x03\x8f\xff\ +\xc3\x003\x00\x0f\xfe\xf6\x003\x00\x11\xfe\xf6\x003\x00\ +$\xff\x9a\x003\x00;\xff\xd7\x003\x00=\xff\xec\x00\ +3\x00\x82\xff\x9a\x003\x00\x83\xff\x9a\x003\x00\x84\xff\ +\x9a\x003\x00\x85\xff\x9a\x003\x00\x86\xff\x9a\x003\x00\ +\x87\xff\x9a\x003\x00\xc2\xff\x9a\x003\x00\xc4\xff\x9a\x00\ +3\x00\xc6\xff\x9a\x003\x01;\xff\xec\x003\x01=\xff\ +\xec\x003\x01?\xff\xec\x003\x01C\xff\x9a\x003\x02\ +\x08\xfe\xf6\x003\x02\x0c\xfe\xf6\x003\x02X\xff\x9a\x00\ +3\x03\x1d\xff\x9a\x003\x03\x1f\xff\x9a\x003\x03!\xff\ +\x9a\x003\x03#\xff\x9a\x003\x03%\xff\x9a\x003\x03\ +'\xff\x9a\x003\x03)\xff\x9a\x003\x03+\xff\x9a\x00\ +3\x03-\xff\x9a\x003\x03/\xff\x9a\x003\x031\xff\ +\x9a\x003\x033\xff\x9a\x004\x00\x0f\xff\xae\x004\x00\ +\x11\xff\xae\x004\x00$\xff\xd7\x004\x007\xff\xc3\x00\ +4\x009\xff\xec\x004\x00:\xff\xec\x004\x00;\xff\ +\xd7\x004\x00<\xff\xec\x004\x00=\xff\xec\x004\x00\ +\x82\xff\xd7\x004\x00\x83\xff\xd7\x004\x00\x84\xff\xd7\x00\ +4\x00\x85\xff\xd7\x004\x00\x86\xff\xd7\x004\x00\x87\xff\ +\xd7\x004\x00\x9f\xff\xec\x004\x00\xc2\xff\xd7\x004\x00\ +\xc4\xff\xd7\x004\x00\xc6\xff\xd7\x004\x01$\xff\xc3\x00\ +4\x01&\xff\xc3\x004\x016\xff\xec\x004\x018\xff\ +\xec\x004\x01:\xff\xec\x004\x01;\xff\xec\x004\x01\ +=\xff\xec\x004\x01?\xff\xec\x004\x01C\xff\xd7\x00\ +4\x01\xa0\xff\xec\x004\x01\xfa\xff\xec\x004\x01\xfc\xff\ +\xec\x004\x01\xfe\xff\xec\x004\x02\x00\xff\xec\x004\x02\ +\x08\xff\xae\x004\x02\x0c\xff\xae\x004\x02X\xff\xd7\x00\ +4\x03\x1d\xff\xd7\x004\x03\x1f\xff\xd7\x004\x03!\xff\ +\xd7\x004\x03#\xff\xd7\x004\x03%\xff\xd7\x004\x03\ +'\xff\xd7\x004\x03)\xff\xd7\x004\x03+\xff\xd7\x00\ +4\x03-\xff\xd7\x004\x03/\xff\xd7\x004\x031\xff\ +\xd7\x004\x033\xff\xd7\x004\x03o\xff\xec\x004\x03\ +q\xff\xec\x004\x03s\xff\xec\x004\x03\x8f\xff\xc3\x00\ +7\x00\x0f\xff\x85\x007\x00\x10\xff\xae\x007\x00\x11\xff\ +\x85\x007\x00\x22\x00)\x007\x00$\xffq\x007\x00\ +&\xff\xd7\x007\x00*\xff\xd7\x007\x002\xff\xd7\x00\ +7\x004\xff\xd7\x007\x007\x00)\x007\x00D\xff\ +\x5c\x007\x00F\xffq\x007\x00G\xffq\x007\x00\ +H\xffq\x007\x00J\xffq\x007\x00P\xff\x9a\x00\ +7\x00Q\xff\x9a\x007\x00R\xffq\x007\x00S\xff\ +\x9a\x007\x00T\xffq\x007\x00U\xff\x9a\x007\x00\ +V\xff\x85\x007\x00X\xff\x9a\x007\x00Y\xff\xd7\x00\ +7\x00Z\xff\xd7\x007\x00[\xff\xd7\x007\x00\x5c\xff\ +\xd7\x007\x00]\xff\xae\x007\x00\x82\xffq\x007\x00\ +\x83\xffq\x007\x00\x84\xffq\x007\x00\x85\xffq\x00\ +7\x00\x86\xffq\x007\x00\x87\xffq\x007\x00\x89\xff\ +\xd7\x007\x00\x94\xff\xd7\x007\x00\x95\xff\xd7\x007\x00\ +\x96\xff\xd7\x007\x00\x97\xff\xd7\x007\x00\x98\xff\xd7\x00\ +7\x00\x9a\xff\xd7\x007\x00\xa2\xffq\x007\x00\xa3\xff\ +\x5c\x007\x00\xa4\xff\x5c\x007\x00\xa5\xff\x5c\x007\x00\ +\xa6\xff\x5c\x007\x00\xa7\xff\x5c\x007\x00\xa8\xff\x5c\x00\ +7\x00\xa9\xffq\x007\x00\xaa\xffq\x007\x00\xab\xff\ +q\x007\x00\xac\xffq\x007\x00\xad\xffq\x007\x00\ +\xb4\xffq\x007\x00\xb5\xffq\x007\x00\xb6\xffq\x00\ +7\x00\xb7\xffq\x007\x00\xb8\xffq\x007\x00\xba\xff\ +q\x007\x00\xbb\xff\x9a\x007\x00\xbc\xff\x9a\x007\x00\ +\xbd\xff\x9a\x007\x00\xbe\xff\x9a\x007\x00\xbf\xff\xd7\x00\ +7\x00\xc2\xffq\x007\x00\xc3\xff\x5c\x007\x00\xc4\xff\ +q\x007\x00\xc5\xff\x5c\x007\x00\xc6\xffq\x007\x00\ +\xc7\xff\x5c\x007\x00\xc8\xff\xd7\x007\x00\xc9\xffq\x00\ +7\x00\xca\xff\xd7\x007\x00\xcb\xffq\x007\x00\xcc\xff\ +\xd7\x007\x00\xcd\xffq\x007\x00\xce\xff\xd7\x007\x00\ +\xcf\xffq\x007\x00\xd1\xffq\x007\x00\xd3\xffq\x00\ +7\x00\xd5\xffq\x007\x00\xd7\xffq\x007\x00\xd9\xff\ +q\x007\x00\xdb\xffq\x007\x00\xdd\xffq\x007\x00\ +\xde\xff\xd7\x007\x00\xdf\xffq\x007\x00\xe0\xff\xd7\x00\ +7\x00\xe1\xffq\x007\x00\xe2\xff\xd7\x007\x00\xe3\xff\ +q\x007\x00\xe4\xff\xd7\x007\x00\xe5\xffq\x007\x00\ +\xfa\xff\x9a\x007\x01\x06\xff\x9a\x007\x01\x08\xff\x9a\x00\ +7\x01\x0d\xff\x9a\x007\x01\x0e\xff\xd7\x007\x01\x0f\xff\ +q\x007\x01\x10\xff\xd7\x007\x01\x11\xffq\x007\x01\ +\x12\xff\xd7\x007\x01\x13\xffq\x007\x01\x14\xff\xd7\x00\ +7\x01\x15\xffq\x007\x01\x17\xff\x9a\x007\x01\x19\xff\ +\x9a\x007\x01\x1d\xff\x85\x007\x01!\xff\x85\x007\x01\ +$\x00)\x007\x01&\x00)\x007\x01+\xff\x9a\x00\ +7\x01-\xff\x9a\x007\x01/\xff\x9a\x007\x011\xff\ +\x9a\x007\x013\xff\x9a\x007\x015\xff\x9a\x007\x01\ +7\xff\xd7\x007\x01<\xff\xae\x007\x01>\xff\xae\x00\ +7\x01@\xff\xae\x007\x01C\xffq\x007\x01D\xff\ +\x5c\x007\x01F\xff\x5c\x007\x01G\xff\xd7\x007\x01\ +H\xffq\x007\x01J\xff\x85\x007\x01\xfb\xff\xd7\x00\ +7\x01\xfd\xff\xd7\x007\x02\x02\xff\xae\x007\x02\x03\xff\ +\xae\x007\x02\x04\xff\xae\x007\x02\x08\xff\x85\x007\x02\ +\x0c\xff\x85\x007\x02W\xff\x9a\x007\x02X\xffq\x00\ +7\x02Y\xff\x5c\x007\x02_\xff\xd7\x007\x02`\xff\ +q\x007\x02b\xff\x9a\x007\x03\x1d\xffq\x007\x03\ +\x1e\xff\x5c\x007\x03\x1f\xffq\x007\x03 \xff\x5c\x00\ +7\x03!\xffq\x007\x03\x22\xff\x5c\x007\x03#\xff\ +q\x007\x03%\xffq\x007\x03&\xff\x5c\x007\x03\ +'\xffq\x007\x03(\xff\x5c\x007\x03)\xffq\x00\ +7\x03*\xff\x5c\x007\x03+\xffq\x007\x03,\xff\ +\x5c\x007\x03-\xffq\x007\x03.\xff\x5c\x007\x03\ +/\xffq\x007\x030\xff\x5c\x007\x031\xffq\x00\ +7\x032\xff\x5c\x007\x033\xffq\x007\x034\xff\ +\x5c\x007\x036\xffq\x007\x038\xffq\x007\x03\ +:\xffq\x007\x03<\xffq\x007\x03@\xffq\x00\ +7\x03B\xffq\x007\x03D\xffq\x007\x03I\xff\ +\xd7\x007\x03J\xffq\x007\x03K\xff\xd7\x007\x03\ +L\xffq\x007\x03M\xff\xd7\x007\x03N\xffq\x00\ +7\x03O\xff\xd7\x007\x03Q\xff\xd7\x007\x03R\xff\ +q\x007\x03S\xff\xd7\x007\x03T\xffq\x007\x03\ +U\xff\xd7\x007\x03V\xffq\x007\x03W\xff\xd7\x00\ +7\x03X\xffq\x007\x03Y\xff\xd7\x007\x03Z\xff\ +q\x007\x03[\xff\xd7\x007\x03\x5c\xffq\x007\x03\ +]\xff\xd7\x007\x03^\xffq\x007\x03_\xff\xd7\x00\ +7\x03`\xffq\x007\x03b\xff\x9a\x007\x03d\xff\ +\x9a\x007\x03f\xff\x9a\x007\x03h\xff\x9a\x007\x03\ +j\xff\x9a\x007\x03l\xff\x9a\x007\x03n\xff\x9a\x00\ +7\x03p\xff\xd7\x007\x03\x8f\x00)\x008\x00\x0f\xff\ +\xd7\x008\x00\x11\xff\xd7\x008\x00$\xff\xec\x008\x00\ +\x82\xff\xec\x008\x00\x83\xff\xec\x008\x00\x84\xff\xec\x00\ +8\x00\x85\xff\xec\x008\x00\x86\xff\xec\x008\x00\x87\xff\ +\xec\x008\x00\xc2\xff\xec\x008\x00\xc4\xff\xec\x008\x00\ +\xc6\xff\xec\x008\x01C\xff\xec\x008\x02\x08\xff\xd7\x00\ +8\x02\x0c\xff\xd7\x008\x02X\xff\xec\x008\x03\x1d\xff\ +\xec\x008\x03\x1f\xff\xec\x008\x03!\xff\xec\x008\x03\ +#\xff\xec\x008\x03%\xff\xec\x008\x03'\xff\xec\x00\ +8\x03)\xff\xec\x008\x03+\xff\xec\x008\x03-\xff\ +\xec\x008\x03/\xff\xec\x008\x031\xff\xec\x008\x03\ +3\xff\xec\x009\x00\x0f\xff\x9a\x009\x00\x11\xff\x9a\x00\ +9\x00\x22\x00)\x009\x00$\xff\xae\x009\x00&\xff\ +\xec\x009\x00*\xff\xec\x009\x002\xff\xec\x009\x00\ +4\xff\xec\x009\x00D\xff\xd7\x009\x00F\xff\xd7\x00\ +9\x00G\xff\xd7\x009\x00H\xff\xd7\x009\x00J\xff\ +\xec\x009\x00P\xff\xec\x009\x00Q\xff\xec\x009\x00\ +R\xff\xd7\x009\x00S\xff\xec\x009\x00T\xff\xd7\x00\ +9\x00U\xff\xec\x009\x00V\xff\xec\x009\x00X\xff\ +\xec\x009\x00\x82\xff\xae\x009\x00\x83\xff\xae\x009\x00\ +\x84\xff\xae\x009\x00\x85\xff\xae\x009\x00\x86\xff\xae\x00\ +9\x00\x87\xff\xae\x009\x00\x89\xff\xec\x009\x00\x94\xff\ +\xec\x009\x00\x95\xff\xec\x009\x00\x96\xff\xec\x009\x00\ +\x97\xff\xec\x009\x00\x98\xff\xec\x009\x00\x9a\xff\xec\x00\ +9\x00\xa2\xff\xd7\x009\x00\xa3\xff\xd7\x009\x00\xa4\xff\ +\xd7\x009\x00\xa5\xff\xd7\x009\x00\xa6\xff\xd7\x009\x00\ +\xa7\xff\xd7\x009\x00\xa8\xff\xd7\x009\x00\xa9\xff\xd7\x00\ +9\x00\xaa\xff\xd7\x009\x00\xab\xff\xd7\x009\x00\xac\xff\ +\xd7\x009\x00\xad\xff\xd7\x009\x00\xb4\xff\xd7\x009\x00\ +\xb5\xff\xd7\x009\x00\xb6\xff\xd7\x009\x00\xb7\xff\xd7\x00\ +9\x00\xb8\xff\xd7\x009\x00\xba\xff\xd7\x009\x00\xbb\xff\ +\xec\x009\x00\xbc\xff\xec\x009\x00\xbd\xff\xec\x009\x00\ +\xbe\xff\xec\x009\x00\xc2\xff\xae\x009\x00\xc3\xff\xd7\x00\ +9\x00\xc4\xff\xae\x009\x00\xc5\xff\xd7\x009\x00\xc6\xff\ +\xae\x009\x00\xc7\xff\xd7\x009\x00\xc8\xff\xec\x009\x00\ +\xc9\xff\xd7\x009\x00\xca\xff\xec\x009\x00\xcb\xff\xd7\x00\ +9\x00\xcc\xff\xec\x009\x00\xcd\xff\xd7\x009\x00\xce\xff\ +\xec\x009\x00\xcf\xff\xd7\x009\x00\xd1\xff\xd7\x009\x00\ +\xd3\xff\xd7\x009\x00\xd5\xff\xd7\x009\x00\xd7\xff\xd7\x00\ +9\x00\xd9\xff\xd7\x009\x00\xdb\xff\xd7\x009\x00\xdd\xff\ +\xd7\x009\x00\xde\xff\xec\x009\x00\xdf\xff\xec\x009\x00\ +\xe0\xff\xec\x009\x00\xe1\xff\xec\x009\x00\xe2\xff\xec\x00\ +9\x00\xe3\xff\xec\x009\x00\xe4\xff\xec\x009\x00\xe5\xff\ +\xec\x009\x00\xfa\xff\xec\x009\x01\x06\xff\xec\x009\x01\ +\x08\xff\xec\x009\x01\x0d\xff\xec\x009\x01\x0e\xff\xec\x00\ +9\x01\x0f\xff\xd7\x009\x01\x10\xff\xec\x009\x01\x11\xff\ +\xd7\x009\x01\x12\xff\xec\x009\x01\x13\xff\xd7\x009\x01\ +\x14\xff\xec\x009\x01\x15\xff\xd7\x009\x01\x17\xff\xec\x00\ +9\x01\x19\xff\xec\x009\x01\x1d\xff\xec\x009\x01!\xff\ +\xec\x009\x01+\xff\xec\x009\x01-\xff\xec\x009\x01\ +/\xff\xec\x009\x011\xff\xec\x009\x013\xff\xec\x00\ +9\x015\xff\xec\x009\x01C\xff\xae\x009\x01D\xff\ +\xd7\x009\x01F\xff\xd7\x009\x01G\xff\xec\x009\x01\ +H\xff\xd7\x009\x01J\xff\xec\x009\x02\x08\xff\x9a\x00\ +9\x02\x0c\xff\x9a\x009\x02W\xff\xec\x009\x02X\xff\ +\xae\x009\x02Y\xff\xd7\x009\x02_\xff\xec\x009\x02\ +`\xff\xd7\x009\x02b\xff\xec\x009\x03\x1d\xff\xae\x00\ +9\x03\x1e\xff\xd7\x009\x03\x1f\xff\xae\x009\x03 \xff\ +\xd7\x009\x03!\xff\xae\x009\x03\x22\xff\xd7\x009\x03\ +#\xff\xae\x009\x03%\xff\xae\x009\x03&\xff\xd7\x00\ +9\x03'\xff\xae\x009\x03(\xff\xd7\x009\x03)\xff\ +\xae\x009\x03*\xff\xd7\x009\x03+\xff\xae\x009\x03\ +,\xff\xd7\x009\x03-\xff\xae\x009\x03.\xff\xd7\x00\ +9\x03/\xff\xae\x009\x030\xff\xd7\x009\x031\xff\ +\xae\x009\x032\xff\xd7\x009\x033\xff\xae\x009\x03\ +4\xff\xd7\x009\x036\xff\xd7\x009\x038\xff\xd7\x00\ +9\x03:\xff\xd7\x009\x03<\xff\xd7\x009\x03@\xff\ +\xd7\x009\x03B\xff\xd7\x009\x03D\xff\xd7\x009\x03\ +I\xff\xec\x009\x03J\xff\xd7\x009\x03K\xff\xec\x00\ +9\x03L\xff\xd7\x009\x03M\xff\xec\x009\x03N\xff\ +\xd7\x009\x03O\xff\xec\x009\x03Q\xff\xec\x009\x03\ +R\xff\xd7\x009\x03S\xff\xec\x009\x03T\xff\xd7\x00\ +9\x03U\xff\xec\x009\x03V\xff\xd7\x009\x03W\xff\ +\xec\x009\x03X\xff\xd7\x009\x03Y\xff\xec\x009\x03\ +Z\xff\xd7\x009\x03[\xff\xec\x009\x03\x5c\xff\xd7\x00\ +9\x03]\xff\xec\x009\x03^\xff\xd7\x009\x03_\xff\ +\xec\x009\x03`\xff\xd7\x009\x03b\xff\xec\x009\x03\ +d\xff\xec\x009\x03f\xff\xec\x009\x03h\xff\xec\x00\ +9\x03j\xff\xec\x009\x03l\xff\xec\x009\x03n\xff\ +\xec\x00:\x00\x0f\xff\x9a\x00:\x00\x11\xff\x9a\x00:\x00\ +\x22\x00)\x00:\x00$\xff\xae\x00:\x00&\xff\xec\x00\ +:\x00*\xff\xec\x00:\x002\xff\xec\x00:\x004\xff\ +\xec\x00:\x00D\xff\xd7\x00:\x00F\xff\xd7\x00:\x00\ +G\xff\xd7\x00:\x00H\xff\xd7\x00:\x00J\xff\xec\x00\ +:\x00P\xff\xec\x00:\x00Q\xff\xec\x00:\x00R\xff\ +\xd7\x00:\x00S\xff\xec\x00:\x00T\xff\xd7\x00:\x00\ +U\xff\xec\x00:\x00V\xff\xec\x00:\x00X\xff\xec\x00\ +:\x00\x82\xff\xae\x00:\x00\x83\xff\xae\x00:\x00\x84\xff\ +\xae\x00:\x00\x85\xff\xae\x00:\x00\x86\xff\xae\x00:\x00\ +\x87\xff\xae\x00:\x00\x89\xff\xec\x00:\x00\x94\xff\xec\x00\ +:\x00\x95\xff\xec\x00:\x00\x96\xff\xec\x00:\x00\x97\xff\ +\xec\x00:\x00\x98\xff\xec\x00:\x00\x9a\xff\xec\x00:\x00\ +\xa2\xff\xd7\x00:\x00\xa3\xff\xd7\x00:\x00\xa4\xff\xd7\x00\ +:\x00\xa5\xff\xd7\x00:\x00\xa6\xff\xd7\x00:\x00\xa7\xff\ +\xd7\x00:\x00\xa8\xff\xd7\x00:\x00\xa9\xff\xd7\x00:\x00\ +\xaa\xff\xd7\x00:\x00\xab\xff\xd7\x00:\x00\xac\xff\xd7\x00\ +:\x00\xad\xff\xd7\x00:\x00\xb4\xff\xd7\x00:\x00\xb5\xff\ +\xd7\x00:\x00\xb6\xff\xd7\x00:\x00\xb7\xff\xd7\x00:\x00\ +\xb8\xff\xd7\x00:\x00\xba\xff\xd7\x00:\x00\xbb\xff\xec\x00\ +:\x00\xbc\xff\xec\x00:\x00\xbd\xff\xec\x00:\x00\xbe\xff\ +\xec\x00:\x00\xc2\xff\xae\x00:\x00\xc3\xff\xd7\x00:\x00\ +\xc4\xff\xae\x00:\x00\xc5\xff\xd7\x00:\x00\xc6\xff\xae\x00\ +:\x00\xc7\xff\xd7\x00:\x00\xc8\xff\xec\x00:\x00\xc9\xff\ +\xd7\x00:\x00\xca\xff\xec\x00:\x00\xcb\xff\xd7\x00:\x00\ +\xcc\xff\xec\x00:\x00\xcd\xff\xd7\x00:\x00\xce\xff\xec\x00\ +:\x00\xcf\xff\xd7\x00:\x00\xd1\xff\xd7\x00:\x00\xd3\xff\ +\xd7\x00:\x00\xd5\xff\xd7\x00:\x00\xd7\xff\xd7\x00:\x00\ +\xd9\xff\xd7\x00:\x00\xdb\xff\xd7\x00:\x00\xdd\xff\xd7\x00\ +:\x00\xde\xff\xec\x00:\x00\xdf\xff\xec\x00:\x00\xe0\xff\ +\xec\x00:\x00\xe1\xff\xec\x00:\x00\xe2\xff\xec\x00:\x00\ +\xe3\xff\xec\x00:\x00\xe4\xff\xec\x00:\x00\xe5\xff\xec\x00\ +:\x00\xfa\xff\xec\x00:\x01\x06\xff\xec\x00:\x01\x08\xff\ +\xec\x00:\x01\x0d\xff\xec\x00:\x01\x0e\xff\xec\x00:\x01\ +\x0f\xff\xd7\x00:\x01\x10\xff\xec\x00:\x01\x11\xff\xd7\x00\ +:\x01\x12\xff\xec\x00:\x01\x13\xff\xd7\x00:\x01\x14\xff\ +\xec\x00:\x01\x15\xff\xd7\x00:\x01\x17\xff\xec\x00:\x01\ +\x19\xff\xec\x00:\x01\x1d\xff\xec\x00:\x01!\xff\xec\x00\ +:\x01+\xff\xec\x00:\x01-\xff\xec\x00:\x01/\xff\ +\xec\x00:\x011\xff\xec\x00:\x013\xff\xec\x00:\x01\ +5\xff\xec\x00:\x01C\xff\xae\x00:\x01D\xff\xd7\x00\ +:\x01F\xff\xd7\x00:\x01G\xff\xec\x00:\x01H\xff\ +\xd7\x00:\x01J\xff\xec\x00:\x02\x08\xff\x9a\x00:\x02\ +\x0c\xff\x9a\x00:\x02W\xff\xec\x00:\x02X\xff\xae\x00\ +:\x02Y\xff\xd7\x00:\x02_\xff\xec\x00:\x02`\xff\ +\xd7\x00:\x02b\xff\xec\x00:\x03\x1d\xff\xae\x00:\x03\ +\x1e\xff\xd7\x00:\x03\x1f\xff\xae\x00:\x03 \xff\xd7\x00\ +:\x03!\xff\xae\x00:\x03\x22\xff\xd7\x00:\x03#\xff\ +\xae\x00:\x03%\xff\xae\x00:\x03&\xff\xd7\x00:\x03\ +'\xff\xae\x00:\x03(\xff\xd7\x00:\x03)\xff\xae\x00\ +:\x03*\xff\xd7\x00:\x03+\xff\xae\x00:\x03,\xff\ +\xd7\x00:\x03-\xff\xae\x00:\x03.\xff\xd7\x00:\x03\ +/\xff\xae\x00:\x030\xff\xd7\x00:\x031\xff\xae\x00\ +:\x032\xff\xd7\x00:\x033\xff\xae\x00:\x034\xff\ +\xd7\x00:\x036\xff\xd7\x00:\x038\xff\xd7\x00:\x03\ +:\xff\xd7\x00:\x03<\xff\xd7\x00:\x03@\xff\xd7\x00\ +:\x03B\xff\xd7\x00:\x03D\xff\xd7\x00:\x03I\xff\ +\xec\x00:\x03J\xff\xd7\x00:\x03K\xff\xec\x00:\x03\ +L\xff\xd7\x00:\x03M\xff\xec\x00:\x03N\xff\xd7\x00\ +:\x03O\xff\xec\x00:\x03Q\xff\xec\x00:\x03R\xff\ +\xd7\x00:\x03S\xff\xec\x00:\x03T\xff\xd7\x00:\x03\ +U\xff\xec\x00:\x03V\xff\xd7\x00:\x03W\xff\xec\x00\ +:\x03X\xff\xd7\x00:\x03Y\xff\xec\x00:\x03Z\xff\ +\xd7\x00:\x03[\xff\xec\x00:\x03\x5c\xff\xd7\x00:\x03\ +]\xff\xec\x00:\x03^\xff\xd7\x00:\x03_\xff\xec\x00\ +:\x03`\xff\xd7\x00:\x03b\xff\xec\x00:\x03d\xff\ +\xec\x00:\x03f\xff\xec\x00:\x03h\xff\xec\x00:\x03\ +j\xff\xec\x00:\x03l\xff\xec\x00:\x03n\xff\xec\x00\ +;\x00&\xff\xd7\x00;\x00*\xff\xd7\x00;\x002\xff\ +\xd7\x00;\x004\xff\xd7\x00;\x00\x89\xff\xd7\x00;\x00\ +\x94\xff\xd7\x00;\x00\x95\xff\xd7\x00;\x00\x96\xff\xd7\x00\ +;\x00\x97\xff\xd7\x00;\x00\x98\xff\xd7\x00;\x00\x9a\xff\ +\xd7\x00;\x00\xc8\xff\xd7\x00;\x00\xca\xff\xd7\x00;\x00\ +\xcc\xff\xd7\x00;\x00\xce\xff\xd7\x00;\x00\xde\xff\xd7\x00\ +;\x00\xe0\xff\xd7\x00;\x00\xe2\xff\xd7\x00;\x00\xe4\xff\ +\xd7\x00;\x01\x0e\xff\xd7\x00;\x01\x10\xff\xd7\x00;\x01\ +\x12\xff\xd7\x00;\x01\x14\xff\xd7\x00;\x01G\xff\xd7\x00\ +;\x02_\xff\xd7\x00;\x03I\xff\xd7\x00;\x03K\xff\ +\xd7\x00;\x03M\xff\xd7\x00;\x03O\xff\xd7\x00;\x03\ +Q\xff\xd7\x00;\x03S\xff\xd7\x00;\x03U\xff\xd7\x00\ +;\x03W\xff\xd7\x00;\x03Y\xff\xd7\x00;\x03[\xff\ +\xd7\x00;\x03]\xff\xd7\x00;\x03_\xff\xd7\x00<\x00\ +\x0f\xff\x85\x00<\x00\x11\xff\x85\x00<\x00\x22\x00)\x00\ +<\x00$\xff\x85\x00<\x00&\xff\xd7\x00<\x00*\xff\ +\xd7\x00<\x002\xff\xd7\x00<\x004\xff\xd7\x00<\x00\ +D\xff\x9a\x00<\x00F\xff\x9a\x00<\x00G\xff\x9a\x00\ +<\x00H\xff\x9a\x00<\x00J\xff\xd7\x00<\x00P\xff\ +\xc3\x00<\x00Q\xff\xc3\x00<\x00R\xff\x9a\x00<\x00\ +S\xff\xc3\x00<\x00T\xff\x9a\x00<\x00U\xff\xc3\x00\ +<\x00V\xff\xae\x00<\x00X\xff\xc3\x00<\x00]\xff\ +\xd7\x00<\x00\x82\xff\x85\x00<\x00\x83\xff\x85\x00<\x00\ +\x84\xff\x85\x00<\x00\x85\xff\x85\x00<\x00\x86\xff\x85\x00\ +<\x00\x87\xff\x85\x00<\x00\x89\xff\xd7\x00<\x00\x94\xff\ +\xd7\x00<\x00\x95\xff\xd7\x00<\x00\x96\xff\xd7\x00<\x00\ +\x97\xff\xd7\x00<\x00\x98\xff\xd7\x00<\x00\x9a\xff\xd7\x00\ +<\x00\xa2\xff\x9a\x00<\x00\xa3\xff\x9a\x00<\x00\xa4\xff\ +\x9a\x00<\x00\xa5\xff\x9a\x00<\x00\xa6\xff\x9a\x00<\x00\ +\xa7\xff\x9a\x00<\x00\xa8\xff\x9a\x00<\x00\xa9\xff\x9a\x00\ +<\x00\xaa\xff\x9a\x00<\x00\xab\xff\x9a\x00<\x00\xac\xff\ +\x9a\x00<\x00\xad\xff\x9a\x00<\x00\xb4\xff\x9a\x00<\x00\ +\xb5\xff\x9a\x00<\x00\xb6\xff\x9a\x00<\x00\xb7\xff\x9a\x00\ +<\x00\xb8\xff\x9a\x00<\x00\xba\xff\x9a\x00<\x00\xbb\xff\ +\xc3\x00<\x00\xbc\xff\xc3\x00<\x00\xbd\xff\xc3\x00<\x00\ +\xbe\xff\xc3\x00<\x00\xc2\xff\x85\x00<\x00\xc3\xff\x9a\x00\ +<\x00\xc4\xff\x85\x00<\x00\xc5\xff\x9a\x00<\x00\xc6\xff\ +\x85\x00<\x00\xc7\xff\x9a\x00<\x00\xc8\xff\xd7\x00<\x00\ +\xc9\xff\x9a\x00<\x00\xca\xff\xd7\x00<\x00\xcb\xff\x9a\x00\ +<\x00\xcc\xff\xd7\x00<\x00\xcd\xff\x9a\x00<\x00\xce\xff\ +\xd7\x00<\x00\xcf\xff\x9a\x00<\x00\xd1\xff\x9a\x00<\x00\ +\xd3\xff\x9a\x00<\x00\xd5\xff\x9a\x00<\x00\xd7\xff\x9a\x00\ +<\x00\xd9\xff\x9a\x00<\x00\xdb\xff\x9a\x00<\x00\xdd\xff\ +\x9a\x00<\x00\xde\xff\xd7\x00<\x00\xdf\xff\xd7\x00<\x00\ +\xe0\xff\xd7\x00<\x00\xe1\xff\xd7\x00<\x00\xe2\xff\xd7\x00\ +<\x00\xe3\xff\xd7\x00<\x00\xe4\xff\xd7\x00<\x00\xe5\xff\ +\xd7\x00<\x00\xfa\xff\xc3\x00<\x01\x06\xff\xc3\x00<\x01\ +\x08\xff\xc3\x00<\x01\x0d\xff\xc3\x00<\x01\x0e\xff\xd7\x00\ +<\x01\x0f\xff\x9a\x00<\x01\x10\xff\xd7\x00<\x01\x11\xff\ +\x9a\x00<\x01\x12\xff\xd7\x00<\x01\x13\xff\x9a\x00<\x01\ +\x14\xff\xd7\x00<\x01\x15\xff\x9a\x00<\x01\x17\xff\xc3\x00\ +<\x01\x19\xff\xc3\x00<\x01\x1d\xff\xae\x00<\x01!\xff\ +\xae\x00<\x01+\xff\xc3\x00<\x01-\xff\xc3\x00<\x01\ +/\xff\xc3\x00<\x011\xff\xc3\x00<\x013\xff\xc3\x00\ +<\x015\xff\xc3\x00<\x01<\xff\xd7\x00<\x01>\xff\ +\xd7\x00<\x01@\xff\xd7\x00<\x01C\xff\x85\x00<\x01\ +D\xff\x9a\x00<\x01F\xff\x9a\x00<\x01G\xff\xd7\x00\ +<\x01H\xff\x9a\x00<\x01J\xff\xae\x00<\x02\x08\xff\ +\x85\x00<\x02\x0c\xff\x85\x00<\x02W\xff\xc3\x00<\x02\ +X\xff\x85\x00<\x02Y\xff\x9a\x00<\x02_\xff\xd7\x00\ +<\x02`\xff\x9a\x00<\x02b\xff\xc3\x00<\x03\x1d\xff\ +\x85\x00<\x03\x1e\xff\x9a\x00<\x03\x1f\xff\x85\x00<\x03\ + \xff\x9a\x00<\x03!\xff\x85\x00<\x03\x22\xff\x9a\x00\ +<\x03#\xff\x85\x00<\x03%\xff\x85\x00<\x03&\xff\ +\x9a\x00<\x03'\xff\x85\x00<\x03(\xff\x9a\x00<\x03\ +)\xff\x85\x00<\x03*\xff\x9a\x00<\x03+\xff\x85\x00\ +<\x03,\xff\x9a\x00<\x03-\xff\x85\x00<\x03.\xff\ +\x9a\x00<\x03/\xff\x85\x00<\x030\xff\x9a\x00<\x03\ +1\xff\x85\x00<\x032\xff\x9a\x00<\x033\xff\x85\x00\ +<\x034\xff\x9a\x00<\x036\xff\x9a\x00<\x038\xff\ +\x9a\x00<\x03:\xff\x9a\x00<\x03<\xff\x9a\x00<\x03\ +@\xff\x9a\x00<\x03B\xff\x9a\x00<\x03D\xff\x9a\x00\ +<\x03I\xff\xd7\x00<\x03J\xff\x9a\x00<\x03K\xff\ +\xd7\x00<\x03L\xff\x9a\x00<\x03M\xff\xd7\x00<\x03\ +N\xff\x9a\x00<\x03O\xff\xd7\x00<\x03Q\xff\xd7\x00\ +<\x03R\xff\x9a\x00<\x03S\xff\xd7\x00<\x03T\xff\ +\x9a\x00<\x03U\xff\xd7\x00<\x03V\xff\x9a\x00<\x03\ +W\xff\xd7\x00<\x03X\xff\x9a\x00<\x03Y\xff\xd7\x00\ +<\x03Z\xff\x9a\x00<\x03[\xff\xd7\x00<\x03\x5c\xff\ +\x9a\x00<\x03]\xff\xd7\x00<\x03^\xff\x9a\x00<\x03\ +_\xff\xd7\x00<\x03`\xff\x9a\x00<\x03b\xff\xc3\x00\ +<\x03d\xff\xc3\x00<\x03f\xff\xc3\x00<\x03h\xff\ +\xc3\x00<\x03j\xff\xc3\x00<\x03l\xff\xc3\x00<\x03\ +n\xff\xc3\x00=\x00&\xff\xec\x00=\x00*\xff\xec\x00\ +=\x002\xff\xec\x00=\x004\xff\xec\x00=\x00\x89\xff\ +\xec\x00=\x00\x94\xff\xec\x00=\x00\x95\xff\xec\x00=\x00\ +\x96\xff\xec\x00=\x00\x97\xff\xec\x00=\x00\x98\xff\xec\x00\ +=\x00\x9a\xff\xec\x00=\x00\xc8\xff\xec\x00=\x00\xca\xff\ +\xec\x00=\x00\xcc\xff\xec\x00=\x00\xce\xff\xec\x00=\x00\ +\xde\xff\xec\x00=\x00\xe0\xff\xec\x00=\x00\xe2\xff\xec\x00\ +=\x00\xe4\xff\xec\x00=\x01\x0e\xff\xec\x00=\x01\x10\xff\ +\xec\x00=\x01\x12\xff\xec\x00=\x01\x14\xff\xec\x00=\x01\ +G\xff\xec\x00=\x02_\xff\xec\x00=\x03I\xff\xec\x00\ +=\x03K\xff\xec\x00=\x03M\xff\xec\x00=\x03O\xff\ +\xec\x00=\x03Q\xff\xec\x00=\x03S\xff\xec\x00=\x03\ +U\xff\xec\x00=\x03W\xff\xec\x00=\x03Y\xff\xec\x00\ +=\x03[\xff\xec\x00=\x03]\xff\xec\x00=\x03_\xff\ +\xec\x00>\x00-\x00\xb8\x00D\x00\x05\xff\xec\x00D\x00\ +\x0a\xff\xec\x00D\x02\x07\xff\xec\x00D\x02\x0b\xff\xec\x00\ +E\x00\x05\xff\xec\x00E\x00\x0a\xff\xec\x00E\x00Y\xff\ +\xd7\x00E\x00Z\xff\xd7\x00E\x00[\xff\xd7\x00E\x00\ +\x5c\xff\xd7\x00E\x00]\xff\xec\x00E\x00\xbf\xff\xd7\x00\ +E\x017\xff\xd7\x00E\x01<\xff\xec\x00E\x01>\xff\ +\xec\x00E\x01@\xff\xec\x00E\x01\xfb\xff\xd7\x00E\x01\ +\xfd\xff\xd7\x00E\x02\x07\xff\xec\x00E\x02\x0b\xff\xec\x00\ +E\x03p\xff\xd7\x00F\x00\x05\x00)\x00F\x00\x0a\x00\ +)\x00F\x02\x07\x00)\x00F\x02\x0b\x00)\x00H\x00\ +\x05\xff\xec\x00H\x00\x0a\xff\xec\x00H\x00Y\xff\xd7\x00\ +H\x00Z\xff\xd7\x00H\x00[\xff\xd7\x00H\x00\x5c\xff\ +\xd7\x00H\x00]\xff\xec\x00H\x00\xbf\xff\xd7\x00H\x01\ +7\xff\xd7\x00H\x01<\xff\xec\x00H\x01>\xff\xec\x00\ +H\x01@\xff\xec\x00H\x01\xfb\xff\xd7\x00H\x01\xfd\xff\ +\xd7\x00H\x02\x07\xff\xec\x00H\x02\x0b\xff\xec\x00H\x03\ +p\xff\xd7\x00I\x00\x05\x00{\x00I\x00\x0a\x00{\x00\ +I\x02\x07\x00{\x00I\x02\x0b\x00{\x00K\x00\x05\xff\ +\xec\x00K\x00\x0a\xff\xec\x00K\x02\x07\xff\xec\x00K\x02\ +\x0b\xff\xec\x00N\x00F\xff\xd7\x00N\x00G\xff\xd7\x00\ +N\x00H\xff\xd7\x00N\x00R\xff\xd7\x00N\x00T\xff\ +\xd7\x00N\x00\xa2\xff\xd7\x00N\x00\xa9\xff\xd7\x00N\x00\ +\xaa\xff\xd7\x00N\x00\xab\xff\xd7\x00N\x00\xac\xff\xd7\x00\ +N\x00\xad\xff\xd7\x00N\x00\xb4\xff\xd7\x00N\x00\xb5\xff\ +\xd7\x00N\x00\xb6\xff\xd7\x00N\x00\xb7\xff\xd7\x00N\x00\ +\xb8\xff\xd7\x00N\x00\xba\xff\xd7\x00N\x00\xc9\xff\xd7\x00\ +N\x00\xcb\xff\xd7\x00N\x00\xcd\xff\xd7\x00N\x00\xcf\xff\ +\xd7\x00N\x00\xd1\xff\xd7\x00N\x00\xd3\xff\xd7\x00N\x00\ +\xd5\xff\xd7\x00N\x00\xd7\xff\xd7\x00N\x00\xd9\xff\xd7\x00\ +N\x00\xdb\xff\xd7\x00N\x00\xdd\xff\xd7\x00N\x01\x0f\xff\ +\xd7\x00N\x01\x11\xff\xd7\x00N\x01\x13\xff\xd7\x00N\x01\ +\x15\xff\xd7\x00N\x01H\xff\xd7\x00N\x02`\xff\xd7\x00\ +N\x036\xff\xd7\x00N\x038\xff\xd7\x00N\x03:\xff\ +\xd7\x00N\x03<\xff\xd7\x00N\x03@\xff\xd7\x00N\x03\ +B\xff\xd7\x00N\x03D\xff\xd7\x00N\x03J\xff\xd7\x00\ +N\x03L\xff\xd7\x00N\x03N\xff\xd7\x00N\x03R\xff\ +\xd7\x00N\x03T\xff\xd7\x00N\x03V\xff\xd7\x00N\x03\ +X\xff\xd7\x00N\x03Z\xff\xd7\x00N\x03\x5c\xff\xd7\x00\ +N\x03^\xff\xd7\x00N\x03`\xff\xd7\x00P\x00\x05\xff\ +\xec\x00P\x00\x0a\xff\xec\x00P\x02\x07\xff\xec\x00P\x02\ +\x0b\xff\xec\x00Q\x00\x05\xff\xec\x00Q\x00\x0a\xff\xec\x00\ +Q\x02\x07\xff\xec\x00Q\x02\x0b\xff\xec\x00R\x00\x05\xff\ +\xec\x00R\x00\x0a\xff\xec\x00R\x00Y\xff\xd7\x00R\x00\ +Z\xff\xd7\x00R\x00[\xff\xd7\x00R\x00\x5c\xff\xd7\x00\ +R\x00]\xff\xec\x00R\x00\xbf\xff\xd7\x00R\x017\xff\ +\xd7\x00R\x01<\xff\xec\x00R\x01>\xff\xec\x00R\x01\ +@\xff\xec\x00R\x01\xfb\xff\xd7\x00R\x01\xfd\xff\xd7\x00\ +R\x02\x07\xff\xec\x00R\x02\x0b\xff\xec\x00R\x03p\xff\ +\xd7\x00S\x00\x05\xff\xec\x00S\x00\x0a\xff\xec\x00S\x00\ +Y\xff\xd7\x00S\x00Z\xff\xd7\x00S\x00[\xff\xd7\x00\ +S\x00\x5c\xff\xd7\x00S\x00]\xff\xec\x00S\x00\xbf\xff\ +\xd7\x00S\x017\xff\xd7\x00S\x01<\xff\xec\x00S\x01\ +>\xff\xec\x00S\x01@\xff\xec\x00S\x01\xfb\xff\xd7\x00\ +S\x01\xfd\xff\xd7\x00S\x02\x07\xff\xec\x00S\x02\x0b\xff\ +\xec\x00S\x03p\xff\xd7\x00U\x00\x05\x00R\x00U\x00\ +\x0a\x00R\x00U\x00D\xff\xd7\x00U\x00F\xff\xd7\x00\ +U\x00G\xff\xd7\x00U\x00H\xff\xd7\x00U\x00J\xff\ +\xec\x00U\x00R\xff\xd7\x00U\x00T\xff\xd7\x00U\x00\ +\xa2\xff\xd7\x00U\x00\xa3\xff\xd7\x00U\x00\xa4\xff\xd7\x00\ +U\x00\xa5\xff\xd7\x00U\x00\xa6\xff\xd7\x00U\x00\xa7\xff\ +\xd7\x00U\x00\xa8\xff\xd7\x00U\x00\xa9\xff\xd7\x00U\x00\ +\xaa\xff\xd7\x00U\x00\xab\xff\xd7\x00U\x00\xac\xff\xd7\x00\ +U\x00\xad\xff\xd7\x00U\x00\xb4\xff\xd7\x00U\x00\xb5\xff\ +\xd7\x00U\x00\xb6\xff\xd7\x00U\x00\xb7\xff\xd7\x00U\x00\ +\xb8\xff\xd7\x00U\x00\xba\xff\xd7\x00U\x00\xc3\xff\xd7\x00\ +U\x00\xc5\xff\xd7\x00U\x00\xc7\xff\xd7\x00U\x00\xc9\xff\ +\xd7\x00U\x00\xcb\xff\xd7\x00U\x00\xcd\xff\xd7\x00U\x00\ +\xcf\xff\xd7\x00U\x00\xd1\xff\xd7\x00U\x00\xd3\xff\xd7\x00\ +U\x00\xd5\xff\xd7\x00U\x00\xd7\xff\xd7\x00U\x00\xd9\xff\ +\xd7\x00U\x00\xdb\xff\xd7\x00U\x00\xdd\xff\xd7\x00U\x00\ +\xdf\xff\xec\x00U\x00\xe1\xff\xec\x00U\x00\xe3\xff\xec\x00\ +U\x00\xe5\xff\xec\x00U\x01\x0f\xff\xd7\x00U\x01\x11\xff\ +\xd7\x00U\x01\x13\xff\xd7\x00U\x01\x15\xff\xd7\x00U\x01\ +D\xff\xd7\x00U\x01F\xff\xd7\x00U\x01H\xff\xd7\x00\ +U\x02\x07\x00R\x00U\x02\x0b\x00R\x00U\x02Y\xff\ +\xd7\x00U\x02`\xff\xd7\x00U\x03\x1e\xff\xd7\x00U\x03\ + \xff\xd7\x00U\x03\x22\xff\xd7\x00U\x03&\xff\xd7\x00\ +U\x03(\xff\xd7\x00U\x03*\xff\xd7\x00U\x03,\xff\ +\xd7\x00U\x03.\xff\xd7\x00U\x030\xff\xd7\x00U\x03\ +2\xff\xd7\x00U\x034\xff\xd7\x00U\x036\xff\xd7\x00\ +U\x038\xff\xd7\x00U\x03:\xff\xd7\x00U\x03<\xff\ +\xd7\x00U\x03@\xff\xd7\x00U\x03B\xff\xd7\x00U\x03\ +D\xff\xd7\x00U\x03J\xff\xd7\x00U\x03L\xff\xd7\x00\ +U\x03N\xff\xd7\x00U\x03R\xff\xd7\x00U\x03T\xff\ +\xd7\x00U\x03V\xff\xd7\x00U\x03X\xff\xd7\x00U\x03\ +Z\xff\xd7\x00U\x03\x5c\xff\xd7\x00U\x03^\xff\xd7\x00\ +U\x03`\xff\xd7\x00W\x00\x05\x00)\x00W\x00\x0a\x00\ +)\x00W\x02\x07\x00)\x00W\x02\x0b\x00)\x00Y\x00\ +\x05\x00R\x00Y\x00\x0a\x00R\x00Y\x00\x0f\xff\xae\x00\ +Y\x00\x11\xff\xae\x00Y\x00\x22\x00)\x00Y\x02\x07\x00\ +R\x00Y\x02\x08\xff\xae\x00Y\x02\x0b\x00R\x00Y\x02\ +\x0c\xff\xae\x00Z\x00\x05\x00R\x00Z\x00\x0a\x00R\x00\ +Z\x00\x0f\xff\xae\x00Z\x00\x11\xff\xae\x00Z\x00\x22\x00\ +)\x00Z\x02\x07\x00R\x00Z\x02\x08\xff\xae\x00Z\x02\ +\x0b\x00R\x00Z\x02\x0c\xff\xae\x00[\x00F\xff\xd7\x00\ +[\x00G\xff\xd7\x00[\x00H\xff\xd7\x00[\x00R\xff\ +\xd7\x00[\x00T\xff\xd7\x00[\x00\xa2\xff\xd7\x00[\x00\ +\xa9\xff\xd7\x00[\x00\xaa\xff\xd7\x00[\x00\xab\xff\xd7\x00\ +[\x00\xac\xff\xd7\x00[\x00\xad\xff\xd7\x00[\x00\xb4\xff\ +\xd7\x00[\x00\xb5\xff\xd7\x00[\x00\xb6\xff\xd7\x00[\x00\ +\xb7\xff\xd7\x00[\x00\xb8\xff\xd7\x00[\x00\xba\xff\xd7\x00\ +[\x00\xc9\xff\xd7\x00[\x00\xcb\xff\xd7\x00[\x00\xcd\xff\ +\xd7\x00[\x00\xcf\xff\xd7\x00[\x00\xd1\xff\xd7\x00[\x00\ +\xd3\xff\xd7\x00[\x00\xd5\xff\xd7\x00[\x00\xd7\xff\xd7\x00\ +[\x00\xd9\xff\xd7\x00[\x00\xdb\xff\xd7\x00[\x00\xdd\xff\ +\xd7\x00[\x01\x0f\xff\xd7\x00[\x01\x11\xff\xd7\x00[\x01\ +\x13\xff\xd7\x00[\x01\x15\xff\xd7\x00[\x01H\xff\xd7\x00\ +[\x02`\xff\xd7\x00[\x036\xff\xd7\x00[\x038\xff\ +\xd7\x00[\x03:\xff\xd7\x00[\x03<\xff\xd7\x00[\x03\ +@\xff\xd7\x00[\x03B\xff\xd7\x00[\x03D\xff\xd7\x00\ +[\x03J\xff\xd7\x00[\x03L\xff\xd7\x00[\x03N\xff\ +\xd7\x00[\x03R\xff\xd7\x00[\x03T\xff\xd7\x00[\x03\ +V\xff\xd7\x00[\x03X\xff\xd7\x00[\x03Z\xff\xd7\x00\ +[\x03\x5c\xff\xd7\x00[\x03^\xff\xd7\x00[\x03`\xff\ +\xd7\x00\x5c\x00\x05\x00R\x00\x5c\x00\x0a\x00R\x00\x5c\x00\ +\x0f\xff\xae\x00\x5c\x00\x11\xff\xae\x00\x5c\x00\x22\x00)\x00\ +\x5c\x02\x07\x00R\x00\x5c\x02\x08\xff\xae\x00\x5c\x02\x0b\x00\ +R\x00\x5c\x02\x0c\xff\xae\x00^\x00-\x00\xb8\x00\x82\x00\ +\x05\xffq\x00\x82\x00\x0a\xffq\x00\x82\x00&\xff\xd7\x00\ +\x82\x00*\xff\xd7\x00\x82\x00-\x01\x0a\x00\x82\x002\xff\ +\xd7\x00\x82\x004\xff\xd7\x00\x82\x007\xffq\x00\x82\x00\ +9\xff\xae\x00\x82\x00:\xff\xae\x00\x82\x00<\xff\x85\x00\ +\x82\x00\x89\xff\xd7\x00\x82\x00\x94\xff\xd7\x00\x82\x00\x95\xff\ +\xd7\x00\x82\x00\x96\xff\xd7\x00\x82\x00\x97\xff\xd7\x00\x82\x00\ +\x98\xff\xd7\x00\x82\x00\x9a\xff\xd7\x00\x82\x00\x9f\xff\x85\x00\ +\x82\x00\xc8\xff\xd7\x00\x82\x00\xca\xff\xd7\x00\x82\x00\xcc\xff\ +\xd7\x00\x82\x00\xce\xff\xd7\x00\x82\x00\xde\xff\xd7\x00\x82\x00\ +\xe0\xff\xd7\x00\x82\x00\xe2\xff\xd7\x00\x82\x00\xe4\xff\xd7\x00\ +\x82\x01\x0e\xff\xd7\x00\x82\x01\x10\xff\xd7\x00\x82\x01\x12\xff\ +\xd7\x00\x82\x01\x14\xff\xd7\x00\x82\x01$\xffq\x00\x82\x01\ +&\xffq\x00\x82\x016\xff\xae\x00\x82\x018\xff\x85\x00\ +\x82\x01:\xff\x85\x00\x82\x01G\xff\xd7\x00\x82\x01\xfa\xff\ +\xae\x00\x82\x01\xfc\xff\xae\x00\x82\x01\xfe\xff\xae\x00\x82\x02\ +\x00\xff\x85\x00\x82\x02\x07\xffq\x00\x82\x02\x0b\xffq\x00\ +\x82\x02_\xff\xd7\x00\x82\x03I\xff\xd7\x00\x82\x03K\xff\ +\xd7\x00\x82\x03M\xff\xd7\x00\x82\x03O\xff\xd7\x00\x82\x03\ +Q\xff\xd7\x00\x82\x03S\xff\xd7\x00\x82\x03U\xff\xd7\x00\ +\x82\x03W\xff\xd7\x00\x82\x03Y\xff\xd7\x00\x82\x03[\xff\ +\xd7\x00\x82\x03]\xff\xd7\x00\x82\x03_\xff\xd7\x00\x82\x03\ +o\xff\x85\x00\x82\x03q\xff\x85\x00\x82\x03s\xff\x85\x00\ +\x82\x03\x8f\xffq\x00\x83\x00\x05\xffq\x00\x83\x00\x0a\xff\ +q\x00\x83\x00&\xff\xd7\x00\x83\x00*\xff\xd7\x00\x83\x00\ +-\x01\x0a\x00\x83\x002\xff\xd7\x00\x83\x004\xff\xd7\x00\ +\x83\x007\xffq\x00\x83\x009\xff\xae\x00\x83\x00:\xff\ +\xae\x00\x83\x00<\xff\x85\x00\x83\x00\x89\xff\xd7\x00\x83\x00\ +\x94\xff\xd7\x00\x83\x00\x95\xff\xd7\x00\x83\x00\x96\xff\xd7\x00\ +\x83\x00\x97\xff\xd7\x00\x83\x00\x98\xff\xd7\x00\x83\x00\x9a\xff\ +\xd7\x00\x83\x00\x9f\xff\x85\x00\x83\x00\xc8\xff\xd7\x00\x83\x00\ +\xca\xff\xd7\x00\x83\x00\xcc\xff\xd7\x00\x83\x00\xce\xff\xd7\x00\ +\x83\x00\xde\xff\xd7\x00\x83\x00\xe0\xff\xd7\x00\x83\x00\xe2\xff\ +\xd7\x00\x83\x00\xe4\xff\xd7\x00\x83\x01\x0e\xff\xd7\x00\x83\x01\ +\x10\xff\xd7\x00\x83\x01\x12\xff\xd7\x00\x83\x01\x14\xff\xd7\x00\ +\x83\x01$\xffq\x00\x83\x01&\xffq\x00\x83\x016\xff\ +\xae\x00\x83\x018\xff\x85\x00\x83\x01:\xff\x85\x00\x83\x01\ +G\xff\xd7\x00\x83\x01\xfa\xff\xae\x00\x83\x01\xfc\xff\xae\x00\ +\x83\x01\xfe\xff\xae\x00\x83\x02\x00\xff\x85\x00\x83\x02\x07\xff\ +q\x00\x83\x02\x0b\xffq\x00\x83\x02_\xff\xd7\x00\x83\x03\ +I\xff\xd7\x00\x83\x03K\xff\xd7\x00\x83\x03M\xff\xd7\x00\ +\x83\x03O\xff\xd7\x00\x83\x03Q\xff\xd7\x00\x83\x03S\xff\ +\xd7\x00\x83\x03U\xff\xd7\x00\x83\x03W\xff\xd7\x00\x83\x03\ +Y\xff\xd7\x00\x83\x03[\xff\xd7\x00\x83\x03]\xff\xd7\x00\ +\x83\x03_\xff\xd7\x00\x83\x03o\xff\x85\x00\x83\x03q\xff\ +\x85\x00\x83\x03s\xff\x85\x00\x83\x03\x8f\xffq\x00\x84\x00\ +\x05\xffq\x00\x84\x00\x0a\xffq\x00\x84\x00&\xff\xd7\x00\ +\x84\x00*\xff\xd7\x00\x84\x00-\x01\x0a\x00\x84\x002\xff\ +\xd7\x00\x84\x004\xff\xd7\x00\x84\x007\xffq\x00\x84\x00\ +9\xff\xae\x00\x84\x00:\xff\xae\x00\x84\x00<\xff\x85\x00\ +\x84\x00\x89\xff\xd7\x00\x84\x00\x94\xff\xd7\x00\x84\x00\x95\xff\ +\xd7\x00\x84\x00\x96\xff\xd7\x00\x84\x00\x97\xff\xd7\x00\x84\x00\ +\x98\xff\xd7\x00\x84\x00\x9a\xff\xd7\x00\x84\x00\x9f\xff\x85\x00\ +\x84\x00\xc8\xff\xd7\x00\x84\x00\xca\xff\xd7\x00\x84\x00\xcc\xff\ +\xd7\x00\x84\x00\xce\xff\xd7\x00\x84\x00\xde\xff\xd7\x00\x84\x00\ +\xe0\xff\xd7\x00\x84\x00\xe2\xff\xd7\x00\x84\x00\xe4\xff\xd7\x00\ +\x84\x01\x0e\xff\xd7\x00\x84\x01\x10\xff\xd7\x00\x84\x01\x12\xff\ +\xd7\x00\x84\x01\x14\xff\xd7\x00\x84\x01$\xffq\x00\x84\x01\ +&\xffq\x00\x84\x016\xff\xae\x00\x84\x018\xff\x85\x00\ +\x84\x01:\xff\x85\x00\x84\x01G\xff\xd7\x00\x84\x01\xfa\xff\ +\xae\x00\x84\x01\xfc\xff\xae\x00\x84\x01\xfe\xff\xae\x00\x84\x02\ +\x00\xff\x85\x00\x84\x02\x07\xffq\x00\x84\x02\x0b\xffq\x00\ +\x84\x02_\xff\xd7\x00\x84\x03I\xff\xd7\x00\x84\x03K\xff\ +\xd7\x00\x84\x03M\xff\xd7\x00\x84\x03O\xff\xd7\x00\x84\x03\ +Q\xff\xd7\x00\x84\x03S\xff\xd7\x00\x84\x03U\xff\xd7\x00\ +\x84\x03W\xff\xd7\x00\x84\x03Y\xff\xd7\x00\x84\x03[\xff\ +\xd7\x00\x84\x03]\xff\xd7\x00\x84\x03_\xff\xd7\x00\x84\x03\ +o\xff\x85\x00\x84\x03q\xff\x85\x00\x84\x03s\xff\x85\x00\ +\x84\x03\x8f\xffq\x00\x85\x00\x05\xffq\x00\x85\x00\x0a\xff\ +q\x00\x85\x00&\xff\xd7\x00\x85\x00*\xff\xd7\x00\x85\x00\ +-\x01\x0a\x00\x85\x002\xff\xd7\x00\x85\x004\xff\xd7\x00\ +\x85\x007\xffq\x00\x85\x009\xff\xae\x00\x85\x00:\xff\ +\xae\x00\x85\x00<\xff\x85\x00\x85\x00\x89\xff\xd7\x00\x85\x00\ +\x94\xff\xd7\x00\x85\x00\x95\xff\xd7\x00\x85\x00\x96\xff\xd7\x00\ +\x85\x00\x97\xff\xd7\x00\x85\x00\x98\xff\xd7\x00\x85\x00\x9a\xff\ +\xd7\x00\x85\x00\x9f\xff\x85\x00\x85\x00\xc8\xff\xd7\x00\x85\x00\ +\xca\xff\xd7\x00\x85\x00\xcc\xff\xd7\x00\x85\x00\xce\xff\xd7\x00\ +\x85\x00\xde\xff\xd7\x00\x85\x00\xe0\xff\xd7\x00\x85\x00\xe2\xff\ +\xd7\x00\x85\x00\xe4\xff\xd7\x00\x85\x01\x0e\xff\xd7\x00\x85\x01\ +\x10\xff\xd7\x00\x85\x01\x12\xff\xd7\x00\x85\x01\x14\xff\xd7\x00\ +\x85\x01$\xffq\x00\x85\x01&\xffq\x00\x85\x016\xff\ +\xae\x00\x85\x018\xff\x85\x00\x85\x01:\xff\x85\x00\x85\x01\ +G\xff\xd7\x00\x85\x01\xfa\xff\xae\x00\x85\x01\xfc\xff\xae\x00\ +\x85\x01\xfe\xff\xae\x00\x85\x02\x00\xff\x85\x00\x85\x02\x07\xff\ +q\x00\x85\x02\x0b\xffq\x00\x85\x02_\xff\xd7\x00\x85\x03\ +I\xff\xd7\x00\x85\x03K\xff\xd7\x00\x85\x03M\xff\xd7\x00\ +\x85\x03O\xff\xd7\x00\x85\x03Q\xff\xd7\x00\x85\x03S\xff\ +\xd7\x00\x85\x03U\xff\xd7\x00\x85\x03W\xff\xd7\x00\x85\x03\ +Y\xff\xd7\x00\x85\x03[\xff\xd7\x00\x85\x03]\xff\xd7\x00\ +\x85\x03_\xff\xd7\x00\x85\x03o\xff\x85\x00\x85\x03q\xff\ +\x85\x00\x85\x03s\xff\x85\x00\x85\x03\x8f\xffq\x00\x86\x00\ +\x05\xffq\x00\x86\x00\x0a\xffq\x00\x86\x00&\xff\xd7\x00\ +\x86\x00*\xff\xd7\x00\x86\x00-\x01\x0a\x00\x86\x002\xff\ +\xd7\x00\x86\x004\xff\xd7\x00\x86\x007\xffq\x00\x86\x00\ +9\xff\xae\x00\x86\x00:\xff\xae\x00\x86\x00<\xff\x85\x00\ +\x86\x00\x89\xff\xd7\x00\x86\x00\x94\xff\xd7\x00\x86\x00\x95\xff\ +\xd7\x00\x86\x00\x96\xff\xd7\x00\x86\x00\x97\xff\xd7\x00\x86\x00\ +\x98\xff\xd7\x00\x86\x00\x9a\xff\xd7\x00\x86\x00\x9f\xff\x85\x00\ +\x86\x00\xc8\xff\xd7\x00\x86\x00\xca\xff\xd7\x00\x86\x00\xcc\xff\ +\xd7\x00\x86\x00\xce\xff\xd7\x00\x86\x00\xde\xff\xd7\x00\x86\x00\ +\xe0\xff\xd7\x00\x86\x00\xe2\xff\xd7\x00\x86\x00\xe4\xff\xd7\x00\ +\x86\x01\x0e\xff\xd7\x00\x86\x01\x10\xff\xd7\x00\x86\x01\x12\xff\ +\xd7\x00\x86\x01\x14\xff\xd7\x00\x86\x01$\xffq\x00\x86\x01\ +&\xffq\x00\x86\x016\xff\xae\x00\x86\x018\xff\x85\x00\ +\x86\x01:\xff\x85\x00\x86\x01G\xff\xd7\x00\x86\x01\xfa\xff\ +\xae\x00\x86\x01\xfc\xff\xae\x00\x86\x01\xfe\xff\xae\x00\x86\x02\ +\x00\xff\x85\x00\x86\x02\x07\xffq\x00\x86\x02\x0b\xffq\x00\ +\x86\x02_\xff\xd7\x00\x86\x03I\xff\xd7\x00\x86\x03K\xff\ +\xd7\x00\x86\x03M\xff\xd7\x00\x86\x03O\xff\xd7\x00\x86\x03\ +Q\xff\xd7\x00\x86\x03S\xff\xd7\x00\x86\x03U\xff\xd7\x00\ +\x86\x03W\xff\xd7\x00\x86\x03Y\xff\xd7\x00\x86\x03[\xff\ +\xd7\x00\x86\x03]\xff\xd7\x00\x86\x03_\xff\xd7\x00\x86\x03\ +o\xff\x85\x00\x86\x03q\xff\x85\x00\x86\x03s\xff\x85\x00\ +\x86\x03\x8f\xffq\x00\x87\x00\x05\xffq\x00\x87\x00\x0a\xff\ +q\x00\x87\x00&\xff\xd7\x00\x87\x00*\xff\xd7\x00\x87\x00\ +-\x01\x0a\x00\x87\x002\xff\xd7\x00\x87\x004\xff\xd7\x00\ +\x87\x007\xffq\x00\x87\x009\xff\xae\x00\x87\x00:\xff\ +\xae\x00\x87\x00<\xff\x85\x00\x87\x00\x89\xff\xd7\x00\x87\x00\ +\x94\xff\xd7\x00\x87\x00\x95\xff\xd7\x00\x87\x00\x96\xff\xd7\x00\ +\x87\x00\x97\xff\xd7\x00\x87\x00\x98\xff\xd7\x00\x87\x00\x9a\xff\ +\xd7\x00\x87\x00\x9f\xff\x85\x00\x87\x00\xc8\xff\xd7\x00\x87\x00\ +\xca\xff\xd7\x00\x87\x00\xcc\xff\xd7\x00\x87\x00\xce\xff\xd7\x00\ +\x87\x00\xde\xff\xd7\x00\x87\x00\xe0\xff\xd7\x00\x87\x00\xe2\xff\ +\xd7\x00\x87\x00\xe4\xff\xd7\x00\x87\x01\x0e\xff\xd7\x00\x87\x01\ +\x10\xff\xd7\x00\x87\x01\x12\xff\xd7\x00\x87\x01\x14\xff\xd7\x00\ +\x87\x01$\xffq\x00\x87\x01&\xffq\x00\x87\x016\xff\ +\xae\x00\x87\x018\xff\x85\x00\x87\x01:\xff\x85\x00\x87\x01\ +G\xff\xd7\x00\x87\x01\xfa\xff\xae\x00\x87\x01\xfc\xff\xae\x00\ +\x87\x01\xfe\xff\xae\x00\x87\x02\x00\xff\x85\x00\x87\x02\x07\xff\ +q\x00\x87\x02\x0b\xffq\x00\x87\x02_\xff\xd7\x00\x87\x03\ +I\xff\xd7\x00\x87\x03K\xff\xd7\x00\x87\x03M\xff\xd7\x00\ +\x87\x03O\xff\xd7\x00\x87\x03Q\xff\xd7\x00\x87\x03S\xff\ +\xd7\x00\x87\x03U\xff\xd7\x00\x87\x03W\xff\xd7\x00\x87\x03\ +Y\xff\xd7\x00\x87\x03[\xff\xd7\x00\x87\x03]\xff\xd7\x00\ +\x87\x03_\xff\xd7\x00\x87\x03o\xff\x85\x00\x87\x03q\xff\ +\x85\x00\x87\x03s\xff\x85\x00\x87\x03\x8f\xffq\x00\x88\x00\ +-\x00{\x00\x89\x00&\xff\xd7\x00\x89\x00*\xff\xd7\x00\ +\x89\x002\xff\xd7\x00\x89\x004\xff\xd7\x00\x89\x00\x89\xff\ +\xd7\x00\x89\x00\x94\xff\xd7\x00\x89\x00\x95\xff\xd7\x00\x89\x00\ +\x96\xff\xd7\x00\x89\x00\x97\xff\xd7\x00\x89\x00\x98\xff\xd7\x00\ +\x89\x00\x9a\xff\xd7\x00\x89\x00\xc8\xff\xd7\x00\x89\x00\xca\xff\ +\xd7\x00\x89\x00\xcc\xff\xd7\x00\x89\x00\xce\xff\xd7\x00\x89\x00\ +\xde\xff\xd7\x00\x89\x00\xe0\xff\xd7\x00\x89\x00\xe2\xff\xd7\x00\ +\x89\x00\xe4\xff\xd7\x00\x89\x01\x0e\xff\xd7\x00\x89\x01\x10\xff\ +\xd7\x00\x89\x01\x12\xff\xd7\x00\x89\x01\x14\xff\xd7\x00\x89\x01\ +G\xff\xd7\x00\x89\x02_\xff\xd7\x00\x89\x03I\xff\xd7\x00\ +\x89\x03K\xff\xd7\x00\x89\x03M\xff\xd7\x00\x89\x03O\xff\ +\xd7\x00\x89\x03Q\xff\xd7\x00\x89\x03S\xff\xd7\x00\x89\x03\ +U\xff\xd7\x00\x89\x03W\xff\xd7\x00\x89\x03Y\xff\xd7\x00\ +\x89\x03[\xff\xd7\x00\x89\x03]\xff\xd7\x00\x89\x03_\xff\ +\xd7\x00\x8a\x00-\x00{\x00\x8b\x00-\x00{\x00\x8c\x00\ +-\x00{\x00\x8d\x00-\x00{\x00\x92\x00\x0f\xff\xae\x00\ +\x92\x00\x11\xff\xae\x00\x92\x00$\xff\xd7\x00\x92\x007\xff\ +\xc3\x00\x92\x009\xff\xec\x00\x92\x00:\xff\xec\x00\x92\x00\ +;\xff\xd7\x00\x92\x00<\xff\xec\x00\x92\x00=\xff\xec\x00\ +\x92\x00\x82\xff\xd7\x00\x92\x00\x83\xff\xd7\x00\x92\x00\x84\xff\ +\xd7\x00\x92\x00\x85\xff\xd7\x00\x92\x00\x86\xff\xd7\x00\x92\x00\ +\x87\xff\xd7\x00\x92\x00\x9f\xff\xec\x00\x92\x00\xc2\xff\xd7\x00\ +\x92\x00\xc4\xff\xd7\x00\x92\x00\xc6\xff\xd7\x00\x92\x01$\xff\ +\xc3\x00\x92\x01&\xff\xc3\x00\x92\x016\xff\xec\x00\x92\x01\ +8\xff\xec\x00\x92\x01:\xff\xec\x00\x92\x01;\xff\xec\x00\ +\x92\x01=\xff\xec\x00\x92\x01?\xff\xec\x00\x92\x01C\xff\ +\xd7\x00\x92\x01\xa0\xff\xec\x00\x92\x01\xfa\xff\xec\x00\x92\x01\ +\xfc\xff\xec\x00\x92\x01\xfe\xff\xec\x00\x92\x02\x00\xff\xec\x00\ +\x92\x02\x08\xff\xae\x00\x92\x02\x0c\xff\xae\x00\x92\x02X\xff\ +\xd7\x00\x92\x03\x1d\xff\xd7\x00\x92\x03\x1f\xff\xd7\x00\x92\x03\ +!\xff\xd7\x00\x92\x03#\xff\xd7\x00\x92\x03%\xff\xd7\x00\ +\x92\x03'\xff\xd7\x00\x92\x03)\xff\xd7\x00\x92\x03+\xff\ +\xd7\x00\x92\x03-\xff\xd7\x00\x92\x03/\xff\xd7\x00\x92\x03\ +1\xff\xd7\x00\x92\x033\xff\xd7\x00\x92\x03o\xff\xec\x00\ +\x92\x03q\xff\xec\x00\x92\x03s\xff\xec\x00\x92\x03\x8f\xff\ +\xc3\x00\x94\x00\x0f\xff\xae\x00\x94\x00\x11\xff\xae\x00\x94\x00\ +$\xff\xd7\x00\x94\x007\xff\xc3\x00\x94\x009\xff\xec\x00\ +\x94\x00:\xff\xec\x00\x94\x00;\xff\xd7\x00\x94\x00<\xff\ +\xec\x00\x94\x00=\xff\xec\x00\x94\x00\x82\xff\xd7\x00\x94\x00\ +\x83\xff\xd7\x00\x94\x00\x84\xff\xd7\x00\x94\x00\x85\xff\xd7\x00\ +\x94\x00\x86\xff\xd7\x00\x94\x00\x87\xff\xd7\x00\x94\x00\x9f\xff\ +\xec\x00\x94\x00\xc2\xff\xd7\x00\x94\x00\xc4\xff\xd7\x00\x94\x00\ +\xc6\xff\xd7\x00\x94\x01$\xff\xc3\x00\x94\x01&\xff\xc3\x00\ +\x94\x016\xff\xec\x00\x94\x018\xff\xec\x00\x94\x01:\xff\ +\xec\x00\x94\x01;\xff\xec\x00\x94\x01=\xff\xec\x00\x94\x01\ +?\xff\xec\x00\x94\x01C\xff\xd7\x00\x94\x01\xa0\xff\xec\x00\ +\x94\x01\xfa\xff\xec\x00\x94\x01\xfc\xff\xec\x00\x94\x01\xfe\xff\ +\xec\x00\x94\x02\x00\xff\xec\x00\x94\x02\x08\xff\xae\x00\x94\x02\ +\x0c\xff\xae\x00\x94\x02X\xff\xd7\x00\x94\x03\x1d\xff\xd7\x00\ +\x94\x03\x1f\xff\xd7\x00\x94\x03!\xff\xd7\x00\x94\x03#\xff\ +\xd7\x00\x94\x03%\xff\xd7\x00\x94\x03'\xff\xd7\x00\x94\x03\ +)\xff\xd7\x00\x94\x03+\xff\xd7\x00\x94\x03-\xff\xd7\x00\ +\x94\x03/\xff\xd7\x00\x94\x031\xff\xd7\x00\x94\x033\xff\ +\xd7\x00\x94\x03o\xff\xec\x00\x94\x03q\xff\xec\x00\x94\x03\ +s\xff\xec\x00\x94\x03\x8f\xff\xc3\x00\x95\x00\x0f\xff\xae\x00\ +\x95\x00\x11\xff\xae\x00\x95\x00$\xff\xd7\x00\x95\x007\xff\ +\xc3\x00\x95\x009\xff\xec\x00\x95\x00:\xff\xec\x00\x95\x00\ +;\xff\xd7\x00\x95\x00<\xff\xec\x00\x95\x00=\xff\xec\x00\ +\x95\x00\x82\xff\xd7\x00\x95\x00\x83\xff\xd7\x00\x95\x00\x84\xff\ +\xd7\x00\x95\x00\x85\xff\xd7\x00\x95\x00\x86\xff\xd7\x00\x95\x00\ +\x87\xff\xd7\x00\x95\x00\x9f\xff\xec\x00\x95\x00\xc2\xff\xd7\x00\ +\x95\x00\xc4\xff\xd7\x00\x95\x00\xc6\xff\xd7\x00\x95\x01$\xff\ +\xc3\x00\x95\x01&\xff\xc3\x00\x95\x016\xff\xec\x00\x95\x01\ +8\xff\xec\x00\x95\x01:\xff\xec\x00\x95\x01;\xff\xec\x00\ +\x95\x01=\xff\xec\x00\x95\x01?\xff\xec\x00\x95\x01C\xff\ +\xd7\x00\x95\x01\xa0\xff\xec\x00\x95\x01\xfa\xff\xec\x00\x95\x01\ +\xfc\xff\xec\x00\x95\x01\xfe\xff\xec\x00\x95\x02\x00\xff\xec\x00\ +\x95\x02\x08\xff\xae\x00\x95\x02\x0c\xff\xae\x00\x95\x02X\xff\ +\xd7\x00\x95\x03\x1d\xff\xd7\x00\x95\x03\x1f\xff\xd7\x00\x95\x03\ +!\xff\xd7\x00\x95\x03#\xff\xd7\x00\x95\x03%\xff\xd7\x00\ +\x95\x03'\xff\xd7\x00\x95\x03)\xff\xd7\x00\x95\x03+\xff\ +\xd7\x00\x95\x03-\xff\xd7\x00\x95\x03/\xff\xd7\x00\x95\x03\ +1\xff\xd7\x00\x95\x033\xff\xd7\x00\x95\x03o\xff\xec\x00\ +\x95\x03q\xff\xec\x00\x95\x03s\xff\xec\x00\x95\x03\x8f\xff\ +\xc3\x00\x96\x00\x0f\xff\xae\x00\x96\x00\x11\xff\xae\x00\x96\x00\ +$\xff\xd7\x00\x96\x007\xff\xc3\x00\x96\x009\xff\xec\x00\ +\x96\x00:\xff\xec\x00\x96\x00;\xff\xd7\x00\x96\x00<\xff\ +\xec\x00\x96\x00=\xff\xec\x00\x96\x00\x82\xff\xd7\x00\x96\x00\ +\x83\xff\xd7\x00\x96\x00\x84\xff\xd7\x00\x96\x00\x85\xff\xd7\x00\ +\x96\x00\x86\xff\xd7\x00\x96\x00\x87\xff\xd7\x00\x96\x00\x9f\xff\ +\xec\x00\x96\x00\xc2\xff\xd7\x00\x96\x00\xc4\xff\xd7\x00\x96\x00\ +\xc6\xff\xd7\x00\x96\x01$\xff\xc3\x00\x96\x01&\xff\xc3\x00\ +\x96\x016\xff\xec\x00\x96\x018\xff\xec\x00\x96\x01:\xff\ +\xec\x00\x96\x01;\xff\xec\x00\x96\x01=\xff\xec\x00\x96\x01\ +?\xff\xec\x00\x96\x01C\xff\xd7\x00\x96\x01\xa0\xff\xec\x00\ +\x96\x01\xfa\xff\xec\x00\x96\x01\xfc\xff\xec\x00\x96\x01\xfe\xff\ +\xec\x00\x96\x02\x00\xff\xec\x00\x96\x02\x08\xff\xae\x00\x96\x02\ +\x0c\xff\xae\x00\x96\x02X\xff\xd7\x00\x96\x03\x1d\xff\xd7\x00\ +\x96\x03\x1f\xff\xd7\x00\x96\x03!\xff\xd7\x00\x96\x03#\xff\ +\xd7\x00\x96\x03%\xff\xd7\x00\x96\x03'\xff\xd7\x00\x96\x03\ +)\xff\xd7\x00\x96\x03+\xff\xd7\x00\x96\x03-\xff\xd7\x00\ +\x96\x03/\xff\xd7\x00\x96\x031\xff\xd7\x00\x96\x033\xff\ +\xd7\x00\x96\x03o\xff\xec\x00\x96\x03q\xff\xec\x00\x96\x03\ +s\xff\xec\x00\x96\x03\x8f\xff\xc3\x00\x97\x00\x0f\xff\xae\x00\ +\x97\x00\x11\xff\xae\x00\x97\x00$\xff\xd7\x00\x97\x007\xff\ +\xc3\x00\x97\x009\xff\xec\x00\x97\x00:\xff\xec\x00\x97\x00\ +;\xff\xd7\x00\x97\x00<\xff\xec\x00\x97\x00=\xff\xec\x00\ +\x97\x00\x82\xff\xd7\x00\x97\x00\x83\xff\xd7\x00\x97\x00\x84\xff\ +\xd7\x00\x97\x00\x85\xff\xd7\x00\x97\x00\x86\xff\xd7\x00\x97\x00\ +\x87\xff\xd7\x00\x97\x00\x9f\xff\xec\x00\x97\x00\xc2\xff\xd7\x00\ +\x97\x00\xc4\xff\xd7\x00\x97\x00\xc6\xff\xd7\x00\x97\x01$\xff\ +\xc3\x00\x97\x01&\xff\xc3\x00\x97\x016\xff\xec\x00\x97\x01\ +8\xff\xec\x00\x97\x01:\xff\xec\x00\x97\x01;\xff\xec\x00\ +\x97\x01=\xff\xec\x00\x97\x01?\xff\xec\x00\x97\x01C\xff\ +\xd7\x00\x97\x01\xa0\xff\xec\x00\x97\x01\xfa\xff\xec\x00\x97\x01\ +\xfc\xff\xec\x00\x97\x01\xfe\xff\xec\x00\x97\x02\x00\xff\xec\x00\ +\x97\x02\x08\xff\xae\x00\x97\x02\x0c\xff\xae\x00\x97\x02X\xff\ +\xd7\x00\x97\x03\x1d\xff\xd7\x00\x97\x03\x1f\xff\xd7\x00\x97\x03\ +!\xff\xd7\x00\x97\x03#\xff\xd7\x00\x97\x03%\xff\xd7\x00\ +\x97\x03'\xff\xd7\x00\x97\x03)\xff\xd7\x00\x97\x03+\xff\ +\xd7\x00\x97\x03-\xff\xd7\x00\x97\x03/\xff\xd7\x00\x97\x03\ +1\xff\xd7\x00\x97\x033\xff\xd7\x00\x97\x03o\xff\xec\x00\ +\x97\x03q\xff\xec\x00\x97\x03s\xff\xec\x00\x97\x03\x8f\xff\ +\xc3\x00\x98\x00\x0f\xff\xae\x00\x98\x00\x11\xff\xae\x00\x98\x00\ +$\xff\xd7\x00\x98\x007\xff\xc3\x00\x98\x009\xff\xec\x00\ +\x98\x00:\xff\xec\x00\x98\x00;\xff\xd7\x00\x98\x00<\xff\ +\xec\x00\x98\x00=\xff\xec\x00\x98\x00\x82\xff\xd7\x00\x98\x00\ +\x83\xff\xd7\x00\x98\x00\x84\xff\xd7\x00\x98\x00\x85\xff\xd7\x00\ +\x98\x00\x86\xff\xd7\x00\x98\x00\x87\xff\xd7\x00\x98\x00\x9f\xff\ +\xec\x00\x98\x00\xc2\xff\xd7\x00\x98\x00\xc4\xff\xd7\x00\x98\x00\ +\xc6\xff\xd7\x00\x98\x01$\xff\xc3\x00\x98\x01&\xff\xc3\x00\ +\x98\x016\xff\xec\x00\x98\x018\xff\xec\x00\x98\x01:\xff\ +\xec\x00\x98\x01;\xff\xec\x00\x98\x01=\xff\xec\x00\x98\x01\ +?\xff\xec\x00\x98\x01C\xff\xd7\x00\x98\x01\xa0\xff\xec\x00\ +\x98\x01\xfa\xff\xec\x00\x98\x01\xfc\xff\xec\x00\x98\x01\xfe\xff\ +\xec\x00\x98\x02\x00\xff\xec\x00\x98\x02\x08\xff\xae\x00\x98\x02\ +\x0c\xff\xae\x00\x98\x02X\xff\xd7\x00\x98\x03\x1d\xff\xd7\x00\ +\x98\x03\x1f\xff\xd7\x00\x98\x03!\xff\xd7\x00\x98\x03#\xff\ +\xd7\x00\x98\x03%\xff\xd7\x00\x98\x03'\xff\xd7\x00\x98\x03\ +)\xff\xd7\x00\x98\x03+\xff\xd7\x00\x98\x03-\xff\xd7\x00\ +\x98\x03/\xff\xd7\x00\x98\x031\xff\xd7\x00\x98\x033\xff\ +\xd7\x00\x98\x03o\xff\xec\x00\x98\x03q\xff\xec\x00\x98\x03\ +s\xff\xec\x00\x98\x03\x8f\xff\xc3\x00\x9a\x00\x0f\xff\xae\x00\ +\x9a\x00\x11\xff\xae\x00\x9a\x00$\xff\xd7\x00\x9a\x007\xff\ +\xc3\x00\x9a\x009\xff\xec\x00\x9a\x00:\xff\xec\x00\x9a\x00\ +;\xff\xd7\x00\x9a\x00<\xff\xec\x00\x9a\x00=\xff\xec\x00\ +\x9a\x00\x82\xff\xd7\x00\x9a\x00\x83\xff\xd7\x00\x9a\x00\x84\xff\ +\xd7\x00\x9a\x00\x85\xff\xd7\x00\x9a\x00\x86\xff\xd7\x00\x9a\x00\ +\x87\xff\xd7\x00\x9a\x00\x9f\xff\xec\x00\x9a\x00\xc2\xff\xd7\x00\ +\x9a\x00\xc4\xff\xd7\x00\x9a\x00\xc6\xff\xd7\x00\x9a\x01$\xff\ +\xc3\x00\x9a\x01&\xff\xc3\x00\x9a\x016\xff\xec\x00\x9a\x01\ +8\xff\xec\x00\x9a\x01:\xff\xec\x00\x9a\x01;\xff\xec\x00\ +\x9a\x01=\xff\xec\x00\x9a\x01?\xff\xec\x00\x9a\x01C\xff\ +\xd7\x00\x9a\x01\xa0\xff\xec\x00\x9a\x01\xfa\xff\xec\x00\x9a\x01\ +\xfc\xff\xec\x00\x9a\x01\xfe\xff\xec\x00\x9a\x02\x00\xff\xec\x00\ +\x9a\x02\x08\xff\xae\x00\x9a\x02\x0c\xff\xae\x00\x9a\x02X\xff\ +\xd7\x00\x9a\x03\x1d\xff\xd7\x00\x9a\x03\x1f\xff\xd7\x00\x9a\x03\ +!\xff\xd7\x00\x9a\x03#\xff\xd7\x00\x9a\x03%\xff\xd7\x00\ +\x9a\x03'\xff\xd7\x00\x9a\x03)\xff\xd7\x00\x9a\x03+\xff\ +\xd7\x00\x9a\x03-\xff\xd7\x00\x9a\x03/\xff\xd7\x00\x9a\x03\ +1\xff\xd7\x00\x9a\x033\xff\xd7\x00\x9a\x03o\xff\xec\x00\ +\x9a\x03q\xff\xec\x00\x9a\x03s\xff\xec\x00\x9a\x03\x8f\xff\ +\xc3\x00\x9b\x00\x0f\xff\xd7\x00\x9b\x00\x11\xff\xd7\x00\x9b\x00\ +$\xff\xec\x00\x9b\x00\x82\xff\xec\x00\x9b\x00\x83\xff\xec\x00\ +\x9b\x00\x84\xff\xec\x00\x9b\x00\x85\xff\xec\x00\x9b\x00\x86\xff\ +\xec\x00\x9b\x00\x87\xff\xec\x00\x9b\x00\xc2\xff\xec\x00\x9b\x00\ +\xc4\xff\xec\x00\x9b\x00\xc6\xff\xec\x00\x9b\x01C\xff\xec\x00\ +\x9b\x02\x08\xff\xd7\x00\x9b\x02\x0c\xff\xd7\x00\x9b\x02X\xff\ +\xec\x00\x9b\x03\x1d\xff\xec\x00\x9b\x03\x1f\xff\xec\x00\x9b\x03\ +!\xff\xec\x00\x9b\x03#\xff\xec\x00\x9b\x03%\xff\xec\x00\ +\x9b\x03'\xff\xec\x00\x9b\x03)\xff\xec\x00\x9b\x03+\xff\ +\xec\x00\x9b\x03-\xff\xec\x00\x9b\x03/\xff\xec\x00\x9b\x03\ +1\xff\xec\x00\x9b\x033\xff\xec\x00\x9c\x00\x0f\xff\xd7\x00\ +\x9c\x00\x11\xff\xd7\x00\x9c\x00$\xff\xec\x00\x9c\x00\x82\xff\ +\xec\x00\x9c\x00\x83\xff\xec\x00\x9c\x00\x84\xff\xec\x00\x9c\x00\ +\x85\xff\xec\x00\x9c\x00\x86\xff\xec\x00\x9c\x00\x87\xff\xec\x00\ +\x9c\x00\xc2\xff\xec\x00\x9c\x00\xc4\xff\xec\x00\x9c\x00\xc6\xff\ +\xec\x00\x9c\x01C\xff\xec\x00\x9c\x02\x08\xff\xd7\x00\x9c\x02\ +\x0c\xff\xd7\x00\x9c\x02X\xff\xec\x00\x9c\x03\x1d\xff\xec\x00\ +\x9c\x03\x1f\xff\xec\x00\x9c\x03!\xff\xec\x00\x9c\x03#\xff\ +\xec\x00\x9c\x03%\xff\xec\x00\x9c\x03'\xff\xec\x00\x9c\x03\ +)\xff\xec\x00\x9c\x03+\xff\xec\x00\x9c\x03-\xff\xec\x00\ +\x9c\x03/\xff\xec\x00\x9c\x031\xff\xec\x00\x9c\x033\xff\ +\xec\x00\x9d\x00\x0f\xff\xd7\x00\x9d\x00\x11\xff\xd7\x00\x9d\x00\ +$\xff\xec\x00\x9d\x00\x82\xff\xec\x00\x9d\x00\x83\xff\xec\x00\ +\x9d\x00\x84\xff\xec\x00\x9d\x00\x85\xff\xec\x00\x9d\x00\x86\xff\ +\xec\x00\x9d\x00\x87\xff\xec\x00\x9d\x00\xc2\xff\xec\x00\x9d\x00\ +\xc4\xff\xec\x00\x9d\x00\xc6\xff\xec\x00\x9d\x01C\xff\xec\x00\ +\x9d\x02\x08\xff\xd7\x00\x9d\x02\x0c\xff\xd7\x00\x9d\x02X\xff\ +\xec\x00\x9d\x03\x1d\xff\xec\x00\x9d\x03\x1f\xff\xec\x00\x9d\x03\ +!\xff\xec\x00\x9d\x03#\xff\xec\x00\x9d\x03%\xff\xec\x00\ +\x9d\x03'\xff\xec\x00\x9d\x03)\xff\xec\x00\x9d\x03+\xff\ +\xec\x00\x9d\x03-\xff\xec\x00\x9d\x03/\xff\xec\x00\x9d\x03\ +1\xff\xec\x00\x9d\x033\xff\xec\x00\x9e\x00\x0f\xff\xd7\x00\ +\x9e\x00\x11\xff\xd7\x00\x9e\x00$\xff\xec\x00\x9e\x00\x82\xff\ +\xec\x00\x9e\x00\x83\xff\xec\x00\x9e\x00\x84\xff\xec\x00\x9e\x00\ +\x85\xff\xec\x00\x9e\x00\x86\xff\xec\x00\x9e\x00\x87\xff\xec\x00\ +\x9e\x00\xc2\xff\xec\x00\x9e\x00\xc4\xff\xec\x00\x9e\x00\xc6\xff\ +\xec\x00\x9e\x01C\xff\xec\x00\x9e\x02\x08\xff\xd7\x00\x9e\x02\ +\x0c\xff\xd7\x00\x9e\x02X\xff\xec\x00\x9e\x03\x1d\xff\xec\x00\ +\x9e\x03\x1f\xff\xec\x00\x9e\x03!\xff\xec\x00\x9e\x03#\xff\ +\xec\x00\x9e\x03%\xff\xec\x00\x9e\x03'\xff\xec\x00\x9e\x03\ +)\xff\xec\x00\x9e\x03+\xff\xec\x00\x9e\x03-\xff\xec\x00\ +\x9e\x03/\xff\xec\x00\x9e\x031\xff\xec\x00\x9e\x033\xff\ +\xec\x00\x9f\x00\x0f\xff\x85\x00\x9f\x00\x11\xff\x85\x00\x9f\x00\ +\x22\x00)\x00\x9f\x00$\xff\x85\x00\x9f\x00&\xff\xd7\x00\ +\x9f\x00*\xff\xd7\x00\x9f\x002\xff\xd7\x00\x9f\x004\xff\ +\xd7\x00\x9f\x00D\xff\x9a\x00\x9f\x00F\xff\x9a\x00\x9f\x00\ +G\xff\x9a\x00\x9f\x00H\xff\x9a\x00\x9f\x00J\xff\xd7\x00\ +\x9f\x00P\xff\xc3\x00\x9f\x00Q\xff\xc3\x00\x9f\x00R\xff\ +\x9a\x00\x9f\x00S\xff\xc3\x00\x9f\x00T\xff\x9a\x00\x9f\x00\ +U\xff\xc3\x00\x9f\x00V\xff\xae\x00\x9f\x00X\xff\xc3\x00\ +\x9f\x00]\xff\xd7\x00\x9f\x00\x82\xff\x85\x00\x9f\x00\x83\xff\ +\x85\x00\x9f\x00\x84\xff\x85\x00\x9f\x00\x85\xff\x85\x00\x9f\x00\ +\x86\xff\x85\x00\x9f\x00\x87\xff\x85\x00\x9f\x00\x89\xff\xd7\x00\ +\x9f\x00\x94\xff\xd7\x00\x9f\x00\x95\xff\xd7\x00\x9f\x00\x96\xff\ +\xd7\x00\x9f\x00\x97\xff\xd7\x00\x9f\x00\x98\xff\xd7\x00\x9f\x00\ +\x9a\xff\xd7\x00\x9f\x00\xa2\xff\x9a\x00\x9f\x00\xa3\xff\x9a\x00\ +\x9f\x00\xa4\xff\x9a\x00\x9f\x00\xa5\xff\x9a\x00\x9f\x00\xa6\xff\ +\x9a\x00\x9f\x00\xa7\xff\x9a\x00\x9f\x00\xa8\xff\x9a\x00\x9f\x00\ +\xa9\xff\x9a\x00\x9f\x00\xaa\xff\x9a\x00\x9f\x00\xab\xff\x9a\x00\ +\x9f\x00\xac\xff\x9a\x00\x9f\x00\xad\xff\x9a\x00\x9f\x00\xb4\xff\ +\x9a\x00\x9f\x00\xb5\xff\x9a\x00\x9f\x00\xb6\xff\x9a\x00\x9f\x00\ +\xb7\xff\x9a\x00\x9f\x00\xb8\xff\x9a\x00\x9f\x00\xba\xff\x9a\x00\ +\x9f\x00\xbb\xff\xc3\x00\x9f\x00\xbc\xff\xc3\x00\x9f\x00\xbd\xff\ +\xc3\x00\x9f\x00\xbe\xff\xc3\x00\x9f\x00\xc2\xff\x85\x00\x9f\x00\ +\xc3\xff\x9a\x00\x9f\x00\xc4\xff\x85\x00\x9f\x00\xc5\xff\x9a\x00\ +\x9f\x00\xc6\xff\x85\x00\x9f\x00\xc7\xff\x9a\x00\x9f\x00\xc8\xff\ +\xd7\x00\x9f\x00\xc9\xff\x9a\x00\x9f\x00\xca\xff\xd7\x00\x9f\x00\ +\xcb\xff\x9a\x00\x9f\x00\xcc\xff\xd7\x00\x9f\x00\xcd\xff\x9a\x00\ +\x9f\x00\xce\xff\xd7\x00\x9f\x00\xcf\xff\x9a\x00\x9f\x00\xd1\xff\ +\x9a\x00\x9f\x00\xd3\xff\x9a\x00\x9f\x00\xd5\xff\x9a\x00\x9f\x00\ +\xd7\xff\x9a\x00\x9f\x00\xd9\xff\x9a\x00\x9f\x00\xdb\xff\x9a\x00\ +\x9f\x00\xdd\xff\x9a\x00\x9f\x00\xde\xff\xd7\x00\x9f\x00\xdf\xff\ +\xd7\x00\x9f\x00\xe0\xff\xd7\x00\x9f\x00\xe1\xff\xd7\x00\x9f\x00\ +\xe2\xff\xd7\x00\x9f\x00\xe3\xff\xd7\x00\x9f\x00\xe4\xff\xd7\x00\ +\x9f\x00\xe5\xff\xd7\x00\x9f\x00\xfa\xff\xc3\x00\x9f\x01\x06\xff\ +\xc3\x00\x9f\x01\x08\xff\xc3\x00\x9f\x01\x0d\xff\xc3\x00\x9f\x01\ +\x0e\xff\xd7\x00\x9f\x01\x0f\xff\x9a\x00\x9f\x01\x10\xff\xd7\x00\ +\x9f\x01\x11\xff\x9a\x00\x9f\x01\x12\xff\xd7\x00\x9f\x01\x13\xff\ +\x9a\x00\x9f\x01\x14\xff\xd7\x00\x9f\x01\x15\xff\x9a\x00\x9f\x01\ +\x17\xff\xc3\x00\x9f\x01\x19\xff\xc3\x00\x9f\x01\x1d\xff\xae\x00\ +\x9f\x01!\xff\xae\x00\x9f\x01+\xff\xc3\x00\x9f\x01-\xff\ +\xc3\x00\x9f\x01/\xff\xc3\x00\x9f\x011\xff\xc3\x00\x9f\x01\ +3\xff\xc3\x00\x9f\x015\xff\xc3\x00\x9f\x01<\xff\xd7\x00\ +\x9f\x01>\xff\xd7\x00\x9f\x01@\xff\xd7\x00\x9f\x01C\xff\ +\x85\x00\x9f\x01D\xff\x9a\x00\x9f\x01F\xff\x9a\x00\x9f\x01\ +G\xff\xd7\x00\x9f\x01H\xff\x9a\x00\x9f\x01J\xff\xae\x00\ +\x9f\x02\x08\xff\x85\x00\x9f\x02\x0c\xff\x85\x00\x9f\x02W\xff\ +\xc3\x00\x9f\x02X\xff\x85\x00\x9f\x02Y\xff\x9a\x00\x9f\x02\ +_\xff\xd7\x00\x9f\x02`\xff\x9a\x00\x9f\x02b\xff\xc3\x00\ +\x9f\x03\x1d\xff\x85\x00\x9f\x03\x1e\xff\x9a\x00\x9f\x03\x1f\xff\ +\x85\x00\x9f\x03 \xff\x9a\x00\x9f\x03!\xff\x85\x00\x9f\x03\ +\x22\xff\x9a\x00\x9f\x03#\xff\x85\x00\x9f\x03%\xff\x85\x00\ +\x9f\x03&\xff\x9a\x00\x9f\x03'\xff\x85\x00\x9f\x03(\xff\ +\x9a\x00\x9f\x03)\xff\x85\x00\x9f\x03*\xff\x9a\x00\x9f\x03\ ++\xff\x85\x00\x9f\x03,\xff\x9a\x00\x9f\x03-\xff\x85\x00\ +\x9f\x03.\xff\x9a\x00\x9f\x03/\xff\x85\x00\x9f\x030\xff\ +\x9a\x00\x9f\x031\xff\x85\x00\x9f\x032\xff\x9a\x00\x9f\x03\ +3\xff\x85\x00\x9f\x034\xff\x9a\x00\x9f\x036\xff\x9a\x00\ +\x9f\x038\xff\x9a\x00\x9f\x03:\xff\x9a\x00\x9f\x03<\xff\ +\x9a\x00\x9f\x03@\xff\x9a\x00\x9f\x03B\xff\x9a\x00\x9f\x03\ +D\xff\x9a\x00\x9f\x03I\xff\xd7\x00\x9f\x03J\xff\x9a\x00\ +\x9f\x03K\xff\xd7\x00\x9f\x03L\xff\x9a\x00\x9f\x03M\xff\ +\xd7\x00\x9f\x03N\xff\x9a\x00\x9f\x03O\xff\xd7\x00\x9f\x03\ +Q\xff\xd7\x00\x9f\x03R\xff\x9a\x00\x9f\x03S\xff\xd7\x00\ +\x9f\x03T\xff\x9a\x00\x9f\x03U\xff\xd7\x00\x9f\x03V\xff\ +\x9a\x00\x9f\x03W\xff\xd7\x00\x9f\x03X\xff\x9a\x00\x9f\x03\ +Y\xff\xd7\x00\x9f\x03Z\xff\x9a\x00\x9f\x03[\xff\xd7\x00\ +\x9f\x03\x5c\xff\x9a\x00\x9f\x03]\xff\xd7\x00\x9f\x03^\xff\ +\x9a\x00\x9f\x03_\xff\xd7\x00\x9f\x03`\xff\x9a\x00\x9f\x03\ +b\xff\xc3\x00\x9f\x03d\xff\xc3\x00\x9f\x03f\xff\xc3\x00\ +\x9f\x03h\xff\xc3\x00\x9f\x03j\xff\xc3\x00\x9f\x03l\xff\ +\xc3\x00\x9f\x03n\xff\xc3\x00\xa0\x00\x0f\xfe\xf6\x00\xa0\x00\ +\x11\xfe\xf6\x00\xa0\x00$\xff\x9a\x00\xa0\x00;\xff\xd7\x00\ +\xa0\x00=\xff\xec\x00\xa0\x00\x82\xff\x9a\x00\xa0\x00\x83\xff\ +\x9a\x00\xa0\x00\x84\xff\x9a\x00\xa0\x00\x85\xff\x9a\x00\xa0\x00\ +\x86\xff\x9a\x00\xa0\x00\x87\xff\x9a\x00\xa0\x00\xc2\xff\x9a\x00\ +\xa0\x00\xc4\xff\x9a\x00\xa0\x00\xc6\xff\x9a\x00\xa0\x01;\xff\ +\xec\x00\xa0\x01=\xff\xec\x00\xa0\x01?\xff\xec\x00\xa0\x01\ +C\xff\x9a\x00\xa0\x02\x08\xfe\xf6\x00\xa0\x02\x0c\xfe\xf6\x00\ +\xa0\x02X\xff\x9a\x00\xa0\x03\x1d\xff\x9a\x00\xa0\x03\x1f\xff\ +\x9a\x00\xa0\x03!\xff\x9a\x00\xa0\x03#\xff\x9a\x00\xa0\x03\ +%\xff\x9a\x00\xa0\x03'\xff\x9a\x00\xa0\x03)\xff\x9a\x00\ +\xa0\x03+\xff\x9a\x00\xa0\x03-\xff\x9a\x00\xa0\x03/\xff\ +\x9a\x00\xa0\x031\xff\x9a\x00\xa0\x033\xff\x9a\x00\xa2\x00\ +\x05\xff\xec\x00\xa2\x00\x0a\xff\xec\x00\xa2\x02\x07\xff\xec\x00\ +\xa2\x02\x0b\xff\xec\x00\xa3\x00\x05\xff\xec\x00\xa3\x00\x0a\xff\ +\xec\x00\xa3\x02\x07\xff\xec\x00\xa3\x02\x0b\xff\xec\x00\xa4\x00\ +\x05\xff\xec\x00\xa4\x00\x0a\xff\xec\x00\xa4\x02\x07\xff\xec\x00\ +\xa4\x02\x0b\xff\xec\x00\xa5\x00\x05\xff\xec\x00\xa5\x00\x0a\xff\ +\xec\x00\xa5\x02\x07\xff\xec\x00\xa5\x02\x0b\xff\xec\x00\xa6\x00\ +\x05\xff\xec\x00\xa6\x00\x0a\xff\xec\x00\xa6\x02\x07\xff\xec\x00\ +\xa6\x02\x0b\xff\xec\x00\xa7\x00\x05\xff\xec\x00\xa7\x00\x0a\xff\ +\xec\x00\xa7\x02\x07\xff\xec\x00\xa7\x02\x0b\xff\xec\x00\xaa\x00\ +\x05\xff\xec\x00\xaa\x00\x0a\xff\xec\x00\xaa\x00Y\xff\xd7\x00\ +\xaa\x00Z\xff\xd7\x00\xaa\x00[\xff\xd7\x00\xaa\x00\x5c\xff\ +\xd7\x00\xaa\x00]\xff\xec\x00\xaa\x00\xbf\xff\xd7\x00\xaa\x01\ +7\xff\xd7\x00\xaa\x01<\xff\xec\x00\xaa\x01>\xff\xec\x00\ +\xaa\x01@\xff\xec\x00\xaa\x01\xfb\xff\xd7\x00\xaa\x01\xfd\xff\ +\xd7\x00\xaa\x02\x07\xff\xec\x00\xaa\x02\x0b\xff\xec\x00\xaa\x03\ +p\xff\xd7\x00\xab\x00\x05\xff\xec\x00\xab\x00\x0a\xff\xec\x00\ +\xab\x00Y\xff\xd7\x00\xab\x00Z\xff\xd7\x00\xab\x00[\xff\ +\xd7\x00\xab\x00\x5c\xff\xd7\x00\xab\x00]\xff\xec\x00\xab\x00\ +\xbf\xff\xd7\x00\xab\x017\xff\xd7\x00\xab\x01<\xff\xec\x00\ +\xab\x01>\xff\xec\x00\xab\x01@\xff\xec\x00\xab\x01\xfb\xff\ +\xd7\x00\xab\x01\xfd\xff\xd7\x00\xab\x02\x07\xff\xec\x00\xab\x02\ +\x0b\xff\xec\x00\xab\x03p\xff\xd7\x00\xac\x00\x05\xff\xec\x00\ +\xac\x00\x0a\xff\xec\x00\xac\x00Y\xff\xd7\x00\xac\x00Z\xff\ +\xd7\x00\xac\x00[\xff\xd7\x00\xac\x00\x5c\xff\xd7\x00\xac\x00\ +]\xff\xec\x00\xac\x00\xbf\xff\xd7\x00\xac\x017\xff\xd7\x00\ +\xac\x01<\xff\xec\x00\xac\x01>\xff\xec\x00\xac\x01@\xff\ +\xec\x00\xac\x01\xfb\xff\xd7\x00\xac\x01\xfd\xff\xd7\x00\xac\x02\ +\x07\xff\xec\x00\xac\x02\x0b\xff\xec\x00\xac\x03p\xff\xd7\x00\ +\xad\x00\x05\xff\xec\x00\xad\x00\x0a\xff\xec\x00\xad\x00Y\xff\ +\xd7\x00\xad\x00Z\xff\xd7\x00\xad\x00[\xff\xd7\x00\xad\x00\ +\x5c\xff\xd7\x00\xad\x00]\xff\xec\x00\xad\x00\xbf\xff\xd7\x00\ +\xad\x017\xff\xd7\x00\xad\x01<\xff\xec\x00\xad\x01>\xff\ +\xec\x00\xad\x01@\xff\xec\x00\xad\x01\xfb\xff\xd7\x00\xad\x01\ +\xfd\xff\xd7\x00\xad\x02\x07\xff\xec\x00\xad\x02\x0b\xff\xec\x00\ +\xad\x03p\xff\xd7\x00\xb2\x00\x05\xff\xec\x00\xb2\x00\x0a\xff\ +\xec\x00\xb2\x00Y\xff\xd7\x00\xb2\x00Z\xff\xd7\x00\xb2\x00\ +[\xff\xd7\x00\xb2\x00\x5c\xff\xd7\x00\xb2\x00]\xff\xec\x00\ +\xb2\x00\xbf\xff\xd7\x00\xb2\x017\xff\xd7\x00\xb2\x01<\xff\ +\xec\x00\xb2\x01>\xff\xec\x00\xb2\x01@\xff\xec\x00\xb2\x01\ +\xfb\xff\xd7\x00\xb2\x01\xfd\xff\xd7\x00\xb2\x02\x07\xff\xec\x00\ +\xb2\x02\x0b\xff\xec\x00\xb2\x03p\xff\xd7\x00\xb4\x00\x05\xff\ +\xec\x00\xb4\x00\x0a\xff\xec\x00\xb4\x00Y\xff\xd7\x00\xb4\x00\ +Z\xff\xd7\x00\xb4\x00[\xff\xd7\x00\xb4\x00\x5c\xff\xd7\x00\ +\xb4\x00]\xff\xec\x00\xb4\x00\xbf\xff\xd7\x00\xb4\x017\xff\ +\xd7\x00\xb4\x01<\xff\xec\x00\xb4\x01>\xff\xec\x00\xb4\x01\ +@\xff\xec\x00\xb4\x01\xfb\xff\xd7\x00\xb4\x01\xfd\xff\xd7\x00\ +\xb4\x02\x07\xff\xec\x00\xb4\x02\x0b\xff\xec\x00\xb4\x03p\xff\ +\xd7\x00\xb5\x00\x05\xff\xec\x00\xb5\x00\x0a\xff\xec\x00\xb5\x00\ +Y\xff\xd7\x00\xb5\x00Z\xff\xd7\x00\xb5\x00[\xff\xd7\x00\ +\xb5\x00\x5c\xff\xd7\x00\xb5\x00]\xff\xec\x00\xb5\x00\xbf\xff\ +\xd7\x00\xb5\x017\xff\xd7\x00\xb5\x01<\xff\xec\x00\xb5\x01\ +>\xff\xec\x00\xb5\x01@\xff\xec\x00\xb5\x01\xfb\xff\xd7\x00\ +\xb5\x01\xfd\xff\xd7\x00\xb5\x02\x07\xff\xec\x00\xb5\x02\x0b\xff\ +\xec\x00\xb5\x03p\xff\xd7\x00\xb6\x00\x05\xff\xec\x00\xb6\x00\ +\x0a\xff\xec\x00\xb6\x00Y\xff\xd7\x00\xb6\x00Z\xff\xd7\x00\ +\xb6\x00[\xff\xd7\x00\xb6\x00\x5c\xff\xd7\x00\xb6\x00]\xff\ +\xec\x00\xb6\x00\xbf\xff\xd7\x00\xb6\x017\xff\xd7\x00\xb6\x01\ +<\xff\xec\x00\xb6\x01>\xff\xec\x00\xb6\x01@\xff\xec\x00\ +\xb6\x01\xfb\xff\xd7\x00\xb6\x01\xfd\xff\xd7\x00\xb6\x02\x07\xff\ +\xec\x00\xb6\x02\x0b\xff\xec\x00\xb6\x03p\xff\xd7\x00\xb8\x00\ +\x05\xff\xd7\x00\xb8\x00\x0a\xff\xd7\x00\xb8\x02\x07\xff\xd7\x00\ +\xb8\x02\x0b\xff\xd7\x00\xba\x00\x05\xff\xec\x00\xba\x00\x0a\xff\ +\xec\x00\xba\x00Y\xff\xd7\x00\xba\x00Z\xff\xd7\x00\xba\x00\ +[\xff\xd7\x00\xba\x00\x5c\xff\xd7\x00\xba\x00]\xff\xec\x00\ +\xba\x00\xbf\xff\xd7\x00\xba\x017\xff\xd7\x00\xba\x01<\xff\ +\xec\x00\xba\x01>\xff\xec\x00\xba\x01@\xff\xec\x00\xba\x01\ +\xfb\xff\xd7\x00\xba\x01\xfd\xff\xd7\x00\xba\x02\x07\xff\xec\x00\ +\xba\x02\x0b\xff\xec\x00\xba\x03p\xff\xd7\x00\xbf\x00\x05\x00\ +R\x00\xbf\x00\x0a\x00R\x00\xbf\x00\x0f\xff\xae\x00\xbf\x00\ +\x11\xff\xae\x00\xbf\x00\x22\x00)\x00\xbf\x02\x07\x00R\x00\ +\xbf\x02\x08\xff\xae\x00\xbf\x02\x0b\x00R\x00\xbf\x02\x0c\xff\ +\xae\x00\xc0\x00\x05\xff\xec\x00\xc0\x00\x0a\xff\xec\x00\xc0\x00\ +Y\xff\xd7\x00\xc0\x00Z\xff\xd7\x00\xc0\x00[\xff\xd7\x00\ +\xc0\x00\x5c\xff\xd7\x00\xc0\x00]\xff\xec\x00\xc0\x00\xbf\xff\ +\xd7\x00\xc0\x017\xff\xd7\x00\xc0\x01<\xff\xec\x00\xc0\x01\ +>\xff\xec\x00\xc0\x01@\xff\xec\x00\xc0\x01\xfb\xff\xd7\x00\ +\xc0\x01\xfd\xff\xd7\x00\xc0\x02\x07\xff\xec\x00\xc0\x02\x0b\xff\ +\xec\x00\xc0\x03p\xff\xd7\x00\xc1\x00\x05\x00R\x00\xc1\x00\ +\x0a\x00R\x00\xc1\x00\x0f\xff\xae\x00\xc1\x00\x11\xff\xae\x00\ +\xc1\x00\x22\x00)\x00\xc1\x02\x07\x00R\x00\xc1\x02\x08\xff\ +\xae\x00\xc1\x02\x0b\x00R\x00\xc1\x02\x0c\xff\xae\x00\xc2\x00\ +\x05\xffq\x00\xc2\x00\x0a\xffq\x00\xc2\x00&\xff\xd7\x00\ +\xc2\x00*\xff\xd7\x00\xc2\x00-\x01\x0a\x00\xc2\x002\xff\ +\xd7\x00\xc2\x004\xff\xd7\x00\xc2\x007\xffq\x00\xc2\x00\ +9\xff\xae\x00\xc2\x00:\xff\xae\x00\xc2\x00<\xff\x85\x00\ +\xc2\x00\x89\xff\xd7\x00\xc2\x00\x94\xff\xd7\x00\xc2\x00\x95\xff\ +\xd7\x00\xc2\x00\x96\xff\xd7\x00\xc2\x00\x97\xff\xd7\x00\xc2\x00\ +\x98\xff\xd7\x00\xc2\x00\x9a\xff\xd7\x00\xc2\x00\x9f\xff\x85\x00\ +\xc2\x00\xc8\xff\xd7\x00\xc2\x00\xca\xff\xd7\x00\xc2\x00\xcc\xff\ +\xd7\x00\xc2\x00\xce\xff\xd7\x00\xc2\x00\xde\xff\xd7\x00\xc2\x00\ +\xe0\xff\xd7\x00\xc2\x00\xe2\xff\xd7\x00\xc2\x00\xe4\xff\xd7\x00\ +\xc2\x01\x0e\xff\xd7\x00\xc2\x01\x10\xff\xd7\x00\xc2\x01\x12\xff\ +\xd7\x00\xc2\x01\x14\xff\xd7\x00\xc2\x01$\xffq\x00\xc2\x01\ +&\xffq\x00\xc2\x016\xff\xae\x00\xc2\x018\xff\x85\x00\ +\xc2\x01:\xff\x85\x00\xc2\x01G\xff\xd7\x00\xc2\x01\xfa\xff\ +\xae\x00\xc2\x01\xfc\xff\xae\x00\xc2\x01\xfe\xff\xae\x00\xc2\x02\ +\x00\xff\x85\x00\xc2\x02\x07\xffq\x00\xc2\x02\x0b\xffq\x00\ +\xc2\x02_\xff\xd7\x00\xc2\x03I\xff\xd7\x00\xc2\x03K\xff\ +\xd7\x00\xc2\x03M\xff\xd7\x00\xc2\x03O\xff\xd7\x00\xc2\x03\ +Q\xff\xd7\x00\xc2\x03S\xff\xd7\x00\xc2\x03U\xff\xd7\x00\ +\xc2\x03W\xff\xd7\x00\xc2\x03Y\xff\xd7\x00\xc2\x03[\xff\ +\xd7\x00\xc2\x03]\xff\xd7\x00\xc2\x03_\xff\xd7\x00\xc2\x03\ +o\xff\x85\x00\xc2\x03q\xff\x85\x00\xc2\x03s\xff\x85\x00\ +\xc2\x03\x8f\xffq\x00\xc3\x00\x05\xff\xec\x00\xc3\x00\x0a\xff\ +\xec\x00\xc3\x02\x07\xff\xec\x00\xc3\x02\x0b\xff\xec\x00\xc4\x00\ +\x05\xffq\x00\xc4\x00\x0a\xffq\x00\xc4\x00&\xff\xd7\x00\ +\xc4\x00*\xff\xd7\x00\xc4\x00-\x01\x0a\x00\xc4\x002\xff\ +\xd7\x00\xc4\x004\xff\xd7\x00\xc4\x007\xffq\x00\xc4\x00\ +9\xff\xae\x00\xc4\x00:\xff\xae\x00\xc4\x00<\xff\x85\x00\ +\xc4\x00\x89\xff\xd7\x00\xc4\x00\x94\xff\xd7\x00\xc4\x00\x95\xff\ +\xd7\x00\xc4\x00\x96\xff\xd7\x00\xc4\x00\x97\xff\xd7\x00\xc4\x00\ +\x98\xff\xd7\x00\xc4\x00\x9a\xff\xd7\x00\xc4\x00\x9f\xff\x85\x00\ +\xc4\x00\xc8\xff\xd7\x00\xc4\x00\xca\xff\xd7\x00\xc4\x00\xcc\xff\ +\xd7\x00\xc4\x00\xce\xff\xd7\x00\xc4\x00\xde\xff\xd7\x00\xc4\x00\ +\xe0\xff\xd7\x00\xc4\x00\xe2\xff\xd7\x00\xc4\x00\xe4\xff\xd7\x00\ +\xc4\x01\x0e\xff\xd7\x00\xc4\x01\x10\xff\xd7\x00\xc4\x01\x12\xff\ +\xd7\x00\xc4\x01\x14\xff\xd7\x00\xc4\x01$\xffq\x00\xc4\x01\ +&\xffq\x00\xc4\x016\xff\xae\x00\xc4\x018\xff\x85\x00\ +\xc4\x01:\xff\x85\x00\xc4\x01G\xff\xd7\x00\xc4\x01\xfa\xff\ +\xae\x00\xc4\x01\xfc\xff\xae\x00\xc4\x01\xfe\xff\xae\x00\xc4\x02\ +\x00\xff\x85\x00\xc4\x02\x07\xffq\x00\xc4\x02\x0b\xffq\x00\ +\xc4\x02_\xff\xd7\x00\xc4\x03I\xff\xd7\x00\xc4\x03K\xff\ +\xd7\x00\xc4\x03M\xff\xd7\x00\xc4\x03O\xff\xd7\x00\xc4\x03\ +Q\xff\xd7\x00\xc4\x03S\xff\xd7\x00\xc4\x03U\xff\xd7\x00\ +\xc4\x03W\xff\xd7\x00\xc4\x03Y\xff\xd7\x00\xc4\x03[\xff\ +\xd7\x00\xc4\x03]\xff\xd7\x00\xc4\x03_\xff\xd7\x00\xc4\x03\ +o\xff\x85\x00\xc4\x03q\xff\x85\x00\xc4\x03s\xff\x85\x00\ +\xc4\x03\x8f\xffq\x00\xc5\x00\x05\xff\xec\x00\xc5\x00\x0a\xff\ +\xec\x00\xc5\x02\x07\xff\xec\x00\xc5\x02\x0b\xff\xec\x00\xc6\x00\ +\x05\xffq\x00\xc6\x00\x0a\xffq\x00\xc6\x00&\xff\xd7\x00\ +\xc6\x00*\xff\xd7\x00\xc6\x00-\x01\x0a\x00\xc6\x002\xff\ +\xd7\x00\xc6\x004\xff\xd7\x00\xc6\x007\xffq\x00\xc6\x00\ +9\xff\xae\x00\xc6\x00:\xff\xae\x00\xc6\x00<\xff\x85\x00\ +\xc6\x00\x89\xff\xd7\x00\xc6\x00\x94\xff\xd7\x00\xc6\x00\x95\xff\ +\xd7\x00\xc6\x00\x96\xff\xd7\x00\xc6\x00\x97\xff\xd7\x00\xc6\x00\ +\x98\xff\xd7\x00\xc6\x00\x9a\xff\xd7\x00\xc6\x00\x9f\xff\x85\x00\ +\xc6\x00\xc8\xff\xd7\x00\xc6\x00\xca\xff\xd7\x00\xc6\x00\xcc\xff\ +\xd7\x00\xc6\x00\xce\xff\xd7\x00\xc6\x00\xde\xff\xd7\x00\xc6\x00\ +\xe0\xff\xd7\x00\xc6\x00\xe2\xff\xd7\x00\xc6\x00\xe4\xff\xd7\x00\ +\xc6\x01\x0e\xff\xd7\x00\xc6\x01\x10\xff\xd7\x00\xc6\x01\x12\xff\ +\xd7\x00\xc6\x01\x14\xff\xd7\x00\xc6\x01$\xffq\x00\xc6\x01\ +&\xffq\x00\xc6\x016\xff\xae\x00\xc6\x018\xff\x85\x00\ +\xc6\x01:\xff\x85\x00\xc6\x01G\xff\xd7\x00\xc6\x01\xfa\xff\ +\xae\x00\xc6\x01\xfc\xff\xae\x00\xc6\x01\xfe\xff\xae\x00\xc6\x02\ +\x00\xff\x85\x00\xc6\x02\x07\xffq\x00\xc6\x02\x0b\xffq\x00\ +\xc6\x02_\xff\xd7\x00\xc6\x03I\xff\xd7\x00\xc6\x03K\xff\ +\xd7\x00\xc6\x03M\xff\xd7\x00\xc6\x03O\xff\xd7\x00\xc6\x03\ +Q\xff\xd7\x00\xc6\x03S\xff\xd7\x00\xc6\x03U\xff\xd7\x00\ +\xc6\x03W\xff\xd7\x00\xc6\x03Y\xff\xd7\x00\xc6\x03[\xff\ +\xd7\x00\xc6\x03]\xff\xd7\x00\xc6\x03_\xff\xd7\x00\xc6\x03\ +o\xff\x85\x00\xc6\x03q\xff\x85\x00\xc6\x03s\xff\x85\x00\ +\xc6\x03\x8f\xffq\x00\xc7\x00\x05\xff\xec\x00\xc7\x00\x0a\xff\ +\xec\x00\xc7\x02\x07\xff\xec\x00\xc7\x02\x0b\xff\xec\x00\xc8\x00\ +&\xff\xd7\x00\xc8\x00*\xff\xd7\x00\xc8\x002\xff\xd7\x00\ +\xc8\x004\xff\xd7\x00\xc8\x00\x89\xff\xd7\x00\xc8\x00\x94\xff\ +\xd7\x00\xc8\x00\x95\xff\xd7\x00\xc8\x00\x96\xff\xd7\x00\xc8\x00\ +\x97\xff\xd7\x00\xc8\x00\x98\xff\xd7\x00\xc8\x00\x9a\xff\xd7\x00\ +\xc8\x00\xc8\xff\xd7\x00\xc8\x00\xca\xff\xd7\x00\xc8\x00\xcc\xff\ +\xd7\x00\xc8\x00\xce\xff\xd7\x00\xc8\x00\xde\xff\xd7\x00\xc8\x00\ +\xe0\xff\xd7\x00\xc8\x00\xe2\xff\xd7\x00\xc8\x00\xe4\xff\xd7\x00\ +\xc8\x01\x0e\xff\xd7\x00\xc8\x01\x10\xff\xd7\x00\xc8\x01\x12\xff\ +\xd7\x00\xc8\x01\x14\xff\xd7\x00\xc8\x01G\xff\xd7\x00\xc8\x02\ +_\xff\xd7\x00\xc8\x03I\xff\xd7\x00\xc8\x03K\xff\xd7\x00\ +\xc8\x03M\xff\xd7\x00\xc8\x03O\xff\xd7\x00\xc8\x03Q\xff\ +\xd7\x00\xc8\x03S\xff\xd7\x00\xc8\x03U\xff\xd7\x00\xc8\x03\ +W\xff\xd7\x00\xc8\x03Y\xff\xd7\x00\xc8\x03[\xff\xd7\x00\ +\xc8\x03]\xff\xd7\x00\xc8\x03_\xff\xd7\x00\xca\x00&\xff\ +\xd7\x00\xca\x00*\xff\xd7\x00\xca\x002\xff\xd7\x00\xca\x00\ +4\xff\xd7\x00\xca\x00\x89\xff\xd7\x00\xca\x00\x94\xff\xd7\x00\ +\xca\x00\x95\xff\xd7\x00\xca\x00\x96\xff\xd7\x00\xca\x00\x97\xff\ +\xd7\x00\xca\x00\x98\xff\xd7\x00\xca\x00\x9a\xff\xd7\x00\xca\x00\ +\xc8\xff\xd7\x00\xca\x00\xca\xff\xd7\x00\xca\x00\xcc\xff\xd7\x00\ +\xca\x00\xce\xff\xd7\x00\xca\x00\xde\xff\xd7\x00\xca\x00\xe0\xff\ +\xd7\x00\xca\x00\xe2\xff\xd7\x00\xca\x00\xe4\xff\xd7\x00\xca\x01\ +\x0e\xff\xd7\x00\xca\x01\x10\xff\xd7\x00\xca\x01\x12\xff\xd7\x00\ +\xca\x01\x14\xff\xd7\x00\xca\x01G\xff\xd7\x00\xca\x02_\xff\ +\xd7\x00\xca\x03I\xff\xd7\x00\xca\x03K\xff\xd7\x00\xca\x03\ +M\xff\xd7\x00\xca\x03O\xff\xd7\x00\xca\x03Q\xff\xd7\x00\ +\xca\x03S\xff\xd7\x00\xca\x03U\xff\xd7\x00\xca\x03W\xff\ +\xd7\x00\xca\x03Y\xff\xd7\x00\xca\x03[\xff\xd7\x00\xca\x03\ +]\xff\xd7\x00\xca\x03_\xff\xd7\x00\xcc\x00&\xff\xd7\x00\ +\xcc\x00*\xff\xd7\x00\xcc\x002\xff\xd7\x00\xcc\x004\xff\ +\xd7\x00\xcc\x00\x89\xff\xd7\x00\xcc\x00\x94\xff\xd7\x00\xcc\x00\ +\x95\xff\xd7\x00\xcc\x00\x96\xff\xd7\x00\xcc\x00\x97\xff\xd7\x00\ +\xcc\x00\x98\xff\xd7\x00\xcc\x00\x9a\xff\xd7\x00\xcc\x00\xc8\xff\ +\xd7\x00\xcc\x00\xca\xff\xd7\x00\xcc\x00\xcc\xff\xd7\x00\xcc\x00\ +\xce\xff\xd7\x00\xcc\x00\xde\xff\xd7\x00\xcc\x00\xe0\xff\xd7\x00\ +\xcc\x00\xe2\xff\xd7\x00\xcc\x00\xe4\xff\xd7\x00\xcc\x01\x0e\xff\ +\xd7\x00\xcc\x01\x10\xff\xd7\x00\xcc\x01\x12\xff\xd7\x00\xcc\x01\ +\x14\xff\xd7\x00\xcc\x01G\xff\xd7\x00\xcc\x02_\xff\xd7\x00\ +\xcc\x03I\xff\xd7\x00\xcc\x03K\xff\xd7\x00\xcc\x03M\xff\ +\xd7\x00\xcc\x03O\xff\xd7\x00\xcc\x03Q\xff\xd7\x00\xcc\x03\ +S\xff\xd7\x00\xcc\x03U\xff\xd7\x00\xcc\x03W\xff\xd7\x00\ +\xcc\x03Y\xff\xd7\x00\xcc\x03[\xff\xd7\x00\xcc\x03]\xff\ +\xd7\x00\xcc\x03_\xff\xd7\x00\xce\x00&\xff\xd7\x00\xce\x00\ +*\xff\xd7\x00\xce\x002\xff\xd7\x00\xce\x004\xff\xd7\x00\ +\xce\x00\x89\xff\xd7\x00\xce\x00\x94\xff\xd7\x00\xce\x00\x95\xff\ +\xd7\x00\xce\x00\x96\xff\xd7\x00\xce\x00\x97\xff\xd7\x00\xce\x00\ +\x98\xff\xd7\x00\xce\x00\x9a\xff\xd7\x00\xce\x00\xc8\xff\xd7\x00\ +\xce\x00\xca\xff\xd7\x00\xce\x00\xcc\xff\xd7\x00\xce\x00\xce\xff\ +\xd7\x00\xce\x00\xde\xff\xd7\x00\xce\x00\xe0\xff\xd7\x00\xce\x00\ +\xe2\xff\xd7\x00\xce\x00\xe4\xff\xd7\x00\xce\x01\x0e\xff\xd7\x00\ +\xce\x01\x10\xff\xd7\x00\xce\x01\x12\xff\xd7\x00\xce\x01\x14\xff\ +\xd7\x00\xce\x01G\xff\xd7\x00\xce\x02_\xff\xd7\x00\xce\x03\ +I\xff\xd7\x00\xce\x03K\xff\xd7\x00\xce\x03M\xff\xd7\x00\ +\xce\x03O\xff\xd7\x00\xce\x03Q\xff\xd7\x00\xce\x03S\xff\ +\xd7\x00\xce\x03U\xff\xd7\x00\xce\x03W\xff\xd7\x00\xce\x03\ +Y\xff\xd7\x00\xce\x03[\xff\xd7\x00\xce\x03]\xff\xd7\x00\ +\xce\x03_\xff\xd7\x00\xd0\x00\x0f\xff\xae\x00\xd0\x00\x11\xff\ +\xae\x00\xd0\x00$\xff\xd7\x00\xd0\x007\xff\xc3\x00\xd0\x00\ +9\xff\xec\x00\xd0\x00:\xff\xec\x00\xd0\x00;\xff\xd7\x00\ +\xd0\x00<\xff\xec\x00\xd0\x00=\xff\xec\x00\xd0\x00\x82\xff\ +\xd7\x00\xd0\x00\x83\xff\xd7\x00\xd0\x00\x84\xff\xd7\x00\xd0\x00\ +\x85\xff\xd7\x00\xd0\x00\x86\xff\xd7\x00\xd0\x00\x87\xff\xd7\x00\ +\xd0\x00\x9f\xff\xec\x00\xd0\x00\xc2\xff\xd7\x00\xd0\x00\xc4\xff\ +\xd7\x00\xd0\x00\xc6\xff\xd7\x00\xd0\x01$\xff\xc3\x00\xd0\x01\ +&\xff\xc3\x00\xd0\x016\xff\xec\x00\xd0\x018\xff\xec\x00\ +\xd0\x01:\xff\xec\x00\xd0\x01;\xff\xec\x00\xd0\x01=\xff\ +\xec\x00\xd0\x01?\xff\xec\x00\xd0\x01C\xff\xd7\x00\xd0\x01\ +\xa0\xff\xec\x00\xd0\x01\xfa\xff\xec\x00\xd0\x01\xfc\xff\xec\x00\ +\xd0\x01\xfe\xff\xec\x00\xd0\x02\x00\xff\xec\x00\xd0\x02\x08\xff\ +\xae\x00\xd0\x02\x0c\xff\xae\x00\xd0\x02X\xff\xd7\x00\xd0\x03\ +\x1d\xff\xd7\x00\xd0\x03\x1f\xff\xd7\x00\xd0\x03!\xff\xd7\x00\ +\xd0\x03#\xff\xd7\x00\xd0\x03%\xff\xd7\x00\xd0\x03'\xff\ +\xd7\x00\xd0\x03)\xff\xd7\x00\xd0\x03+\xff\xd7\x00\xd0\x03\ +-\xff\xd7\x00\xd0\x03/\xff\xd7\x00\xd0\x031\xff\xd7\x00\ +\xd0\x033\xff\xd7\x00\xd0\x03o\xff\xec\x00\xd0\x03q\xff\ +\xec\x00\xd0\x03s\xff\xec\x00\xd0\x03\x8f\xff\xc3\x00\xd1\x00\ +\x05\x00R\x00\xd1\x00\x0a\x00R\x00\xd1\x00\x0c\x00\x8f\x00\ +\xd1\x00\x22\x00\xa4\x00\xd1\x00@\x00\x8f\x00\xd1\x00E\x00\ +=\x00\xd1\x00K\x00=\x00\xd1\x00N\x00=\x00\xd1\x00\ +O\x00=\x00\xd1\x00`\x00\x8f\x00\xd1\x00\xe7\x00=\x00\ +\xd1\x00\xe9\x00{\x00\xd1\x02\x07\x00R\x00\xd1\x02\x0b\x00\ +R\x00\xd2\x00\x0f\xff\xae\x00\xd2\x00\x11\xff\xae\x00\xd2\x00\ +$\xff\xd7\x00\xd2\x007\xff\xc3\x00\xd2\x009\xff\xec\x00\ +\xd2\x00:\xff\xec\x00\xd2\x00;\xff\xd7\x00\xd2\x00<\xff\ +\xec\x00\xd2\x00=\xff\xec\x00\xd2\x00\x82\xff\xd7\x00\xd2\x00\ +\x83\xff\xd7\x00\xd2\x00\x84\xff\xd7\x00\xd2\x00\x85\xff\xd7\x00\ +\xd2\x00\x86\xff\xd7\x00\xd2\x00\x87\xff\xd7\x00\xd2\x00\x9f\xff\ +\xec\x00\xd2\x00\xc2\xff\xd7\x00\xd2\x00\xc4\xff\xd7\x00\xd2\x00\ +\xc6\xff\xd7\x00\xd2\x01$\xff\xc3\x00\xd2\x01&\xff\xc3\x00\ +\xd2\x016\xff\xec\x00\xd2\x018\xff\xec\x00\xd2\x01:\xff\ +\xec\x00\xd2\x01;\xff\xec\x00\xd2\x01=\xff\xec\x00\xd2\x01\ +?\xff\xec\x00\xd2\x01C\xff\xd7\x00\xd2\x01\xa0\xff\xec\x00\ +\xd2\x01\xfa\xff\xec\x00\xd2\x01\xfc\xff\xec\x00\xd2\x01\xfe\xff\ +\xec\x00\xd2\x02\x00\xff\xec\x00\xd2\x02\x08\xff\xae\x00\xd2\x02\ +\x0c\xff\xae\x00\xd2\x02X\xff\xd7\x00\xd2\x03\x1d\xff\xd7\x00\ +\xd2\x03\x1f\xff\xd7\x00\xd2\x03!\xff\xd7\x00\xd2\x03#\xff\ +\xd7\x00\xd2\x03%\xff\xd7\x00\xd2\x03'\xff\xd7\x00\xd2\x03\ +)\xff\xd7\x00\xd2\x03+\xff\xd7\x00\xd2\x03-\xff\xd7\x00\ +\xd2\x03/\xff\xd7\x00\xd2\x031\xff\xd7\x00\xd2\x033\xff\ +\xd7\x00\xd2\x03o\xff\xec\x00\xd2\x03q\xff\xec\x00\xd2\x03\ +s\xff\xec\x00\xd2\x03\x8f\xff\xc3\x00\xd4\x00-\x00{\x00\ +\xd5\x00\x05\xff\xec\x00\xd5\x00\x0a\xff\xec\x00\xd5\x00Y\xff\ +\xd7\x00\xd5\x00Z\xff\xd7\x00\xd5\x00[\xff\xd7\x00\xd5\x00\ +\x5c\xff\xd7\x00\xd5\x00]\xff\xec\x00\xd5\x00\xbf\xff\xd7\x00\ +\xd5\x017\xff\xd7\x00\xd5\x01<\xff\xec\x00\xd5\x01>\xff\ +\xec\x00\xd5\x01@\xff\xec\x00\xd5\x01\xfb\xff\xd7\x00\xd5\x01\ +\xfd\xff\xd7\x00\xd5\x02\x07\xff\xec\x00\xd5\x02\x0b\xff\xec\x00\ +\xd5\x03p\xff\xd7\x00\xd6\x00-\x00{\x00\xd7\x00\x05\xff\ +\xec\x00\xd7\x00\x0a\xff\xec\x00\xd7\x00Y\xff\xd7\x00\xd7\x00\ +Z\xff\xd7\x00\xd7\x00[\xff\xd7\x00\xd7\x00\x5c\xff\xd7\x00\ +\xd7\x00]\xff\xec\x00\xd7\x00\xbf\xff\xd7\x00\xd7\x017\xff\ +\xd7\x00\xd7\x01<\xff\xec\x00\xd7\x01>\xff\xec\x00\xd7\x01\ +@\xff\xec\x00\xd7\x01\xfb\xff\xd7\x00\xd7\x01\xfd\xff\xd7\x00\ +\xd7\x02\x07\xff\xec\x00\xd7\x02\x0b\xff\xec\x00\xd7\x03p\xff\ +\xd7\x00\xd8\x00-\x00{\x00\xd9\x00\x05\xff\xec\x00\xd9\x00\ +\x0a\xff\xec\x00\xd9\x00Y\xff\xd7\x00\xd9\x00Z\xff\xd7\x00\ +\xd9\x00[\xff\xd7\x00\xd9\x00\x5c\xff\xd7\x00\xd9\x00]\xff\ +\xec\x00\xd9\x00\xbf\xff\xd7\x00\xd9\x017\xff\xd7\x00\xd9\x01\ +<\xff\xec\x00\xd9\x01>\xff\xec\x00\xd9\x01@\xff\xec\x00\ +\xd9\x01\xfb\xff\xd7\x00\xd9\x01\xfd\xff\xd7\x00\xd9\x02\x07\xff\ +\xec\x00\xd9\x02\x0b\xff\xec\x00\xd9\x03p\xff\xd7\x00\xda\x00\ +-\x00{\x00\xdb\x00\x05\xff\xec\x00\xdb\x00\x0a\xff\xec\x00\ +\xdb\x00Y\xff\xd7\x00\xdb\x00Z\xff\xd7\x00\xdb\x00[\xff\ +\xd7\x00\xdb\x00\x5c\xff\xd7\x00\xdb\x00]\xff\xec\x00\xdb\x00\ +\xbf\xff\xd7\x00\xdb\x017\xff\xd7\x00\xdb\x01<\xff\xec\x00\ +\xdb\x01>\xff\xec\x00\xdb\x01@\xff\xec\x00\xdb\x01\xfb\xff\ +\xd7\x00\xdb\x01\xfd\xff\xd7\x00\xdb\x02\x07\xff\xec\x00\xdb\x02\ +\x0b\xff\xec\x00\xdb\x03p\xff\xd7\x00\xdc\x00-\x00{\x00\ +\xdd\x00\x05\xff\xec\x00\xdd\x00\x0a\xff\xec\x00\xdd\x00Y\xff\ +\xd7\x00\xdd\x00Z\xff\xd7\x00\xdd\x00[\xff\xd7\x00\xdd\x00\ +\x5c\xff\xd7\x00\xdd\x00]\xff\xec\x00\xdd\x00\xbf\xff\xd7\x00\ +\xdd\x017\xff\xd7\x00\xdd\x01<\xff\xec\x00\xdd\x01>\xff\ +\xec\x00\xdd\x01@\xff\xec\x00\xdd\x01\xfb\xff\xd7\x00\xdd\x01\ +\xfd\xff\xd7\x00\xdd\x02\x07\xff\xec\x00\xdd\x02\x0b\xff\xec\x00\ +\xdd\x03p\xff\xd7\x00\xe7\x00\x05\xff\xec\x00\xe7\x00\x0a\xff\ +\xec\x00\xe7\x02\x07\xff\xec\x00\xe7\x02\x0b\xff\xec\x00\xf8\x00\ +&\xff\xd7\x00\xf8\x00*\xff\xd7\x00\xf8\x002\xff\xd7\x00\ +\xf8\x004\xff\xd7\x00\xf8\x00\x89\xff\xd7\x00\xf8\x00\x94\xff\ +\xd7\x00\xf8\x00\x95\xff\xd7\x00\xf8\x00\x96\xff\xd7\x00\xf8\x00\ +\x97\xff\xd7\x00\xf8\x00\x98\xff\xd7\x00\xf8\x00\x9a\xff\xd7\x00\ +\xf8\x00\xc8\xff\xd7\x00\xf8\x00\xca\xff\xd7\x00\xf8\x00\xcc\xff\ +\xd7\x00\xf8\x00\xce\xff\xd7\x00\xf8\x00\xde\xff\xd7\x00\xf8\x00\ +\xe0\xff\xd7\x00\xf8\x00\xe2\xff\xd7\x00\xf8\x00\xe4\xff\xd7\x00\ +\xf8\x01\x0e\xff\xd7\x00\xf8\x01\x10\xff\xd7\x00\xf8\x01\x12\xff\ +\xd7\x00\xf8\x01\x14\xff\xd7\x00\xf8\x01G\xff\xd7\x00\xf8\x02\ +_\xff\xd7\x00\xf8\x03I\xff\xd7\x00\xf8\x03K\xff\xd7\x00\ +\xf8\x03M\xff\xd7\x00\xf8\x03O\xff\xd7\x00\xf8\x03Q\xff\ +\xd7\x00\xf8\x03S\xff\xd7\x00\xf8\x03U\xff\xd7\x00\xf8\x03\ +W\xff\xd7\x00\xf8\x03Y\xff\xd7\x00\xf8\x03[\xff\xd7\x00\ +\xf8\x03]\xff\xd7\x00\xf8\x03_\xff\xd7\x00\xf9\x00F\xff\ +\xd7\x00\xf9\x00G\xff\xd7\x00\xf9\x00H\xff\xd7\x00\xf9\x00\ +R\xff\xd7\x00\xf9\x00T\xff\xd7\x00\xf9\x00\xa2\xff\xd7\x00\ +\xf9\x00\xa9\xff\xd7\x00\xf9\x00\xaa\xff\xd7\x00\xf9\x00\xab\xff\ +\xd7\x00\xf9\x00\xac\xff\xd7\x00\xf9\x00\xad\xff\xd7\x00\xf9\x00\ +\xb4\xff\xd7\x00\xf9\x00\xb5\xff\xd7\x00\xf9\x00\xb6\xff\xd7\x00\ +\xf9\x00\xb7\xff\xd7\x00\xf9\x00\xb8\xff\xd7\x00\xf9\x00\xba\xff\ +\xd7\x00\xf9\x00\xc9\xff\xd7\x00\xf9\x00\xcb\xff\xd7\x00\xf9\x00\ +\xcd\xff\xd7\x00\xf9\x00\xcf\xff\xd7\x00\xf9\x00\xd1\xff\xd7\x00\ +\xf9\x00\xd3\xff\xd7\x00\xf9\x00\xd5\xff\xd7\x00\xf9\x00\xd7\xff\ +\xd7\x00\xf9\x00\xd9\xff\xd7\x00\xf9\x00\xdb\xff\xd7\x00\xf9\x00\ +\xdd\xff\xd7\x00\xf9\x01\x0f\xff\xd7\x00\xf9\x01\x11\xff\xd7\x00\ +\xf9\x01\x13\xff\xd7\x00\xf9\x01\x15\xff\xd7\x00\xf9\x01H\xff\ +\xd7\x00\xf9\x02`\xff\xd7\x00\xf9\x036\xff\xd7\x00\xf9\x03\ +8\xff\xd7\x00\xf9\x03:\xff\xd7\x00\xf9\x03<\xff\xd7\x00\ +\xf9\x03@\xff\xd7\x00\xf9\x03B\xff\xd7\x00\xf9\x03D\xff\ +\xd7\x00\xf9\x03J\xff\xd7\x00\xf9\x03L\xff\xd7\x00\xf9\x03\ +N\xff\xd7\x00\xf9\x03R\xff\xd7\x00\xf9\x03T\xff\xd7\x00\ +\xf9\x03V\xff\xd7\x00\xf9\x03X\xff\xd7\x00\xf9\x03Z\xff\ +\xd7\x00\xf9\x03\x5c\xff\xd7\x00\xf9\x03^\xff\xd7\x00\xf9\x03\ +`\xff\xd7\x00\xfa\x00F\xff\xd7\x00\xfa\x00G\xff\xd7\x00\ +\xfa\x00H\xff\xd7\x00\xfa\x00R\xff\xd7\x00\xfa\x00T\xff\ +\xd7\x00\xfa\x00\xa2\xff\xd7\x00\xfa\x00\xa9\xff\xd7\x00\xfa\x00\ +\xaa\xff\xd7\x00\xfa\x00\xab\xff\xd7\x00\xfa\x00\xac\xff\xd7\x00\ +\xfa\x00\xad\xff\xd7\x00\xfa\x00\xb4\xff\xd7\x00\xfa\x00\xb5\xff\ +\xd7\x00\xfa\x00\xb6\xff\xd7\x00\xfa\x00\xb7\xff\xd7\x00\xfa\x00\ +\xb8\xff\xd7\x00\xfa\x00\xba\xff\xd7\x00\xfa\x00\xc9\xff\xd7\x00\ +\xfa\x00\xcb\xff\xd7\x00\xfa\x00\xcd\xff\xd7\x00\xfa\x00\xcf\xff\ +\xd7\x00\xfa\x00\xd1\xff\xd7\x00\xfa\x00\xd3\xff\xd7\x00\xfa\x00\ +\xd5\xff\xd7\x00\xfa\x00\xd7\xff\xd7\x00\xfa\x00\xd9\xff\xd7\x00\ +\xfa\x00\xdb\xff\xd7\x00\xfa\x00\xdd\xff\xd7\x00\xfa\x01\x0f\xff\ +\xd7\x00\xfa\x01\x11\xff\xd7\x00\xfa\x01\x13\xff\xd7\x00\xfa\x01\ +\x15\xff\xd7\x00\xfa\x01H\xff\xd7\x00\xfa\x02`\xff\xd7\x00\ +\xfa\x036\xff\xd7\x00\xfa\x038\xff\xd7\x00\xfa\x03:\xff\ +\xd7\x00\xfa\x03<\xff\xd7\x00\xfa\x03@\xff\xd7\x00\xfa\x03\ +B\xff\xd7\x00\xfa\x03D\xff\xd7\x00\xfa\x03J\xff\xd7\x00\ +\xfa\x03L\xff\xd7\x00\xfa\x03N\xff\xd7\x00\xfa\x03R\xff\ +\xd7\x00\xfa\x03T\xff\xd7\x00\xfa\x03V\xff\xd7\x00\xfa\x03\ +X\xff\xd7\x00\xfa\x03Z\xff\xd7\x00\xfa\x03\x5c\xff\xd7\x00\ +\xfa\x03^\xff\xd7\x00\xfa\x03`\xff\xd7\x00\xfb\x00\x05\xff\ +\x5c\x00\xfb\x00\x0a\xff\x5c\x00\xfb\x00&\xff\xd7\x00\xfb\x00\ +*\xff\xd7\x00\xfb\x002\xff\xd7\x00\xfb\x004\xff\xd7\x00\ +\xfb\x007\xff\xd7\x00\xfb\x008\xff\xec\x00\xfb\x009\xff\ +\xd7\x00\xfb\x00:\xff\xd7\x00\xfb\x00<\xff\xc3\x00\xfb\x00\ +\x89\xff\xd7\x00\xfb\x00\x94\xff\xd7\x00\xfb\x00\x95\xff\xd7\x00\ +\xfb\x00\x96\xff\xd7\x00\xfb\x00\x97\xff\xd7\x00\xfb\x00\x98\xff\ +\xd7\x00\xfb\x00\x9a\xff\xd7\x00\xfb\x00\x9b\xff\xec\x00\xfb\x00\ +\x9c\xff\xec\x00\xfb\x00\x9d\xff\xec\x00\xfb\x00\x9e\xff\xec\x00\ +\xfb\x00\x9f\xff\xc3\x00\xfb\x00\xc8\xff\xd7\x00\xfb\x00\xca\xff\ +\xd7\x00\xfb\x00\xcc\xff\xd7\x00\xfb\x00\xce\xff\xd7\x00\xfb\x00\ +\xde\xff\xd7\x00\xfb\x00\xe0\xff\xd7\x00\xfb\x00\xe2\xff\xd7\x00\ +\xfb\x00\xe4\xff\xd7\x00\xfb\x01\x0e\xff\xd7\x00\xfb\x01\x10\xff\ +\xd7\x00\xfb\x01\x12\xff\xd7\x00\xfb\x01\x14\xff\xd7\x00\xfb\x01\ +$\xff\xd7\x00\xfb\x01&\xff\xd7\x00\xfb\x01*\xff\xec\x00\ +\xfb\x01,\xff\xec\x00\xfb\x01.\xff\xec\x00\xfb\x010\xff\ +\xec\x00\xfb\x012\xff\xec\x00\xfb\x014\xff\xec\x00\xfb\x01\ +6\xff\xd7\x00\xfb\x018\xff\xc3\x00\xfb\x01:\xff\xc3\x00\ +\xfb\x01G\xff\xd7\x00\xfb\x01\xfa\xff\xd7\x00\xfb\x01\xfc\xff\ +\xd7\x00\xfb\x01\xfe\xff\xd7\x00\xfb\x02\x00\xff\xc3\x00\xfb\x02\ +\x07\xff\x5c\x00\xfb\x02\x0b\xff\x5c\x00\xfb\x02_\xff\xd7\x00\ +\xfb\x02a\xff\xec\x00\xfb\x03I\xff\xd7\x00\xfb\x03K\xff\ +\xd7\x00\xfb\x03M\xff\xd7\x00\xfb\x03O\xff\xd7\x00\xfb\x03\ +Q\xff\xd7\x00\xfb\x03S\xff\xd7\x00\xfb\x03U\xff\xd7\x00\ +\xfb\x03W\xff\xd7\x00\xfb\x03Y\xff\xd7\x00\xfb\x03[\xff\ +\xd7\x00\xfb\x03]\xff\xd7\x00\xfb\x03_\xff\xd7\x00\xfb\x03\ +a\xff\xec\x00\xfb\x03c\xff\xec\x00\xfb\x03e\xff\xec\x00\ +\xfb\x03g\xff\xec\x00\xfb\x03i\xff\xec\x00\xfb\x03k\xff\ +\xec\x00\xfb\x03m\xff\xec\x00\xfb\x03o\xff\xc3\x00\xfb\x03\ +q\xff\xc3\x00\xfb\x03s\xff\xc3\x00\xfb\x03\x8f\xff\xd7\x00\ +\xfd\x00\x05\xff\x5c\x00\xfd\x00\x0a\xff\x5c\x00\xfd\x00&\xff\ +\xd7\x00\xfd\x00*\xff\xd7\x00\xfd\x002\xff\xd7\x00\xfd\x00\ +4\xff\xd7\x00\xfd\x007\xff\xd7\x00\xfd\x008\xff\xec\x00\ +\xfd\x009\xff\xd7\x00\xfd\x00:\xff\xd7\x00\xfd\x00<\xff\ +\xc3\x00\xfd\x00\x89\xff\xd7\x00\xfd\x00\x94\xff\xd7\x00\xfd\x00\ +\x95\xff\xd7\x00\xfd\x00\x96\xff\xd7\x00\xfd\x00\x97\xff\xd7\x00\ +\xfd\x00\x98\xff\xd7\x00\xfd\x00\x9a\xff\xd7\x00\xfd\x00\x9b\xff\ +\xec\x00\xfd\x00\x9c\xff\xec\x00\xfd\x00\x9d\xff\xec\x00\xfd\x00\ +\x9e\xff\xec\x00\xfd\x00\x9f\xff\xc3\x00\xfd\x00\xc8\xff\xd7\x00\ +\xfd\x00\xca\xff\xd7\x00\xfd\x00\xcc\xff\xd7\x00\xfd\x00\xce\xff\ +\xd7\x00\xfd\x00\xde\xff\xd7\x00\xfd\x00\xe0\xff\xd7\x00\xfd\x00\ +\xe2\xff\xd7\x00\xfd\x00\xe4\xff\xd7\x00\xfd\x01\x0e\xff\xd7\x00\ +\xfd\x01\x10\xff\xd7\x00\xfd\x01\x12\xff\xd7\x00\xfd\x01\x14\xff\ +\xd7\x00\xfd\x01$\xff\xd7\x00\xfd\x01&\xff\xd7\x00\xfd\x01\ +*\xff\xec\x00\xfd\x01,\xff\xec\x00\xfd\x01.\xff\xec\x00\ +\xfd\x010\xff\xec\x00\xfd\x012\xff\xec\x00\xfd\x014\xff\ +\xec\x00\xfd\x016\xff\xd7\x00\xfd\x018\xff\xc3\x00\xfd\x01\ +:\xff\xc3\x00\xfd\x01G\xff\xd7\x00\xfd\x01\xfa\xff\xd7\x00\ +\xfd\x01\xfc\xff\xd7\x00\xfd\x01\xfe\xff\xd7\x00\xfd\x02\x00\xff\ +\xc3\x00\xfd\x02\x07\xff\x5c\x00\xfd\x02\x0b\xff\x5c\x00\xfd\x02\ +_\xff\xd7\x00\xfd\x02a\xff\xec\x00\xfd\x03I\xff\xd7\x00\ +\xfd\x03K\xff\xd7\x00\xfd\x03M\xff\xd7\x00\xfd\x03O\xff\ +\xd7\x00\xfd\x03Q\xff\xd7\x00\xfd\x03S\xff\xd7\x00\xfd\x03\ +U\xff\xd7\x00\xfd\x03W\xff\xd7\x00\xfd\x03Y\xff\xd7\x00\ +\xfd\x03[\xff\xd7\x00\xfd\x03]\xff\xd7\x00\xfd\x03_\xff\ +\xd7\x00\xfd\x03a\xff\xec\x00\xfd\x03c\xff\xec\x00\xfd\x03\ +e\xff\xec\x00\xfd\x03g\xff\xec\x00\xfd\x03i\xff\xec\x00\ +\xfd\x03k\xff\xec\x00\xfd\x03m\xff\xec\x00\xfd\x03o\xff\ +\xc3\x00\xfd\x03q\xff\xc3\x00\xfd\x03s\xff\xc3\x00\xfd\x03\ +\x8f\xff\xd7\x00\xff\x00\x05\xff\x5c\x00\xff\x00\x0a\xff\x5c\x00\ +\xff\x00&\xff\xd7\x00\xff\x00*\xff\xd7\x00\xff\x002\xff\ +\xd7\x00\xff\x004\xff\xd7\x00\xff\x007\xff\xd7\x00\xff\x00\ +8\xff\xec\x00\xff\x009\xff\xd7\x00\xff\x00:\xff\xd7\x00\ +\xff\x00<\xff\xc3\x00\xff\x00\x89\xff\xd7\x00\xff\x00\x94\xff\ +\xd7\x00\xff\x00\x95\xff\xd7\x00\xff\x00\x96\xff\xd7\x00\xff\x00\ +\x97\xff\xd7\x00\xff\x00\x98\xff\xd7\x00\xff\x00\x9a\xff\xd7\x00\ +\xff\x00\x9b\xff\xec\x00\xff\x00\x9c\xff\xec\x00\xff\x00\x9d\xff\ +\xec\x00\xff\x00\x9e\xff\xec\x00\xff\x00\x9f\xff\xc3\x00\xff\x00\ +\xc8\xff\xd7\x00\xff\x00\xca\xff\xd7\x00\xff\x00\xcc\xff\xd7\x00\ +\xff\x00\xce\xff\xd7\x00\xff\x00\xde\xff\xd7\x00\xff\x00\xe0\xff\ +\xd7\x00\xff\x00\xe2\xff\xd7\x00\xff\x00\xe4\xff\xd7\x00\xff\x01\ +\x0e\xff\xd7\x00\xff\x01\x10\xff\xd7\x00\xff\x01\x12\xff\xd7\x00\ +\xff\x01\x14\xff\xd7\x00\xff\x01$\xff\xd7\x00\xff\x01&\xff\ +\xd7\x00\xff\x01*\xff\xec\x00\xff\x01,\xff\xec\x00\xff\x01\ +.\xff\xec\x00\xff\x010\xff\xec\x00\xff\x012\xff\xec\x00\ +\xff\x014\xff\xec\x00\xff\x016\xff\xd7\x00\xff\x018\xff\ +\xc3\x00\xff\x01:\xff\xc3\x00\xff\x01G\xff\xd7\x00\xff\x01\ +\xfa\xff\xd7\x00\xff\x01\xfc\xff\xd7\x00\xff\x01\xfe\xff\xd7\x00\ +\xff\x02\x00\xff\xc3\x00\xff\x02\x07\xff\x5c\x00\xff\x02\x0b\xff\ +\x5c\x00\xff\x02_\xff\xd7\x00\xff\x02a\xff\xec\x00\xff\x03\ +I\xff\xd7\x00\xff\x03K\xff\xd7\x00\xff\x03M\xff\xd7\x00\ +\xff\x03O\xff\xd7\x00\xff\x03Q\xff\xd7\x00\xff\x03S\xff\ +\xd7\x00\xff\x03U\xff\xd7\x00\xff\x03W\xff\xd7\x00\xff\x03\ +Y\xff\xd7\x00\xff\x03[\xff\xd7\x00\xff\x03]\xff\xd7\x00\ +\xff\x03_\xff\xd7\x00\xff\x03a\xff\xec\x00\xff\x03c\xff\ +\xec\x00\xff\x03e\xff\xec\x00\xff\x03g\xff\xec\x00\xff\x03\ +i\xff\xec\x00\xff\x03k\xff\xec\x00\xff\x03m\xff\xec\x00\ +\xff\x03o\xff\xc3\x00\xff\x03q\xff\xc3\x00\xff\x03s\xff\ +\xc3\x00\xff\x03\x8f\xff\xd7\x01\x00\x00\x05\x00R\x01\x00\x00\ +\x0a\x00R\x01\x00\x00\x0c\x00\x8f\x01\x00\x00\x22\x00\x8f\x01\ +\x00\x00@\x00\x8f\x01\x00\x00E\x00=\x01\x00\x00K\x00\ +=\x01\x00\x00N\x00=\x01\x00\x00O\x00=\x01\x00\x00\ +`\x00\x8f\x01\x00\x00\xe7\x00=\x01\x00\x00\xe9\x00\x8f\x01\ +\x00\x02\x07\x00R\x01\x00\x02\x0b\x00R\x01\x01\x00\x05\xff\ +\x5c\x01\x01\x00\x0a\xff\x5c\x01\x01\x00&\xff\xd7\x01\x01\x00\ +*\xff\xd7\x01\x01\x002\xff\xd7\x01\x01\x004\xff\xd7\x01\ +\x01\x007\xff\xd7\x01\x01\x008\xff\xec\x01\x01\x009\xff\ +\xd7\x01\x01\x00:\xff\xd7\x01\x01\x00<\xff\xc3\x01\x01\x00\ +\x89\xff\xd7\x01\x01\x00\x94\xff\xd7\x01\x01\x00\x95\xff\xd7\x01\ +\x01\x00\x96\xff\xd7\x01\x01\x00\x97\xff\xd7\x01\x01\x00\x98\xff\ +\xd7\x01\x01\x00\x9a\xff\xd7\x01\x01\x00\x9b\xff\xec\x01\x01\x00\ +\x9c\xff\xec\x01\x01\x00\x9d\xff\xec\x01\x01\x00\x9e\xff\xec\x01\ +\x01\x00\x9f\xff\xc3\x01\x01\x00\xc8\xff\xd7\x01\x01\x00\xca\xff\ +\xd7\x01\x01\x00\xcc\xff\xd7\x01\x01\x00\xce\xff\xd7\x01\x01\x00\ +\xde\xff\xd7\x01\x01\x00\xe0\xff\xd7\x01\x01\x00\xe2\xff\xd7\x01\ +\x01\x00\xe4\xff\xd7\x01\x01\x01\x0e\xff\xd7\x01\x01\x01\x10\xff\ +\xd7\x01\x01\x01\x12\xff\xd7\x01\x01\x01\x14\xff\xd7\x01\x01\x01\ +$\xff\xd7\x01\x01\x01&\xff\xd7\x01\x01\x01*\xff\xec\x01\ +\x01\x01,\xff\xec\x01\x01\x01.\xff\xec\x01\x01\x010\xff\ +\xec\x01\x01\x012\xff\xec\x01\x01\x014\xff\xec\x01\x01\x01\ +6\xff\xd7\x01\x01\x018\xff\xc3\x01\x01\x01:\xff\xc3\x01\ +\x01\x01G\xff\xd7\x01\x01\x01\xfa\xff\xd7\x01\x01\x01\xfc\xff\ +\xd7\x01\x01\x01\xfe\xff\xd7\x01\x01\x02\x00\xff\xc3\x01\x01\x02\ +\x07\xff\x5c\x01\x01\x02\x0b\xff\x5c\x01\x01\x02_\xff\xd7\x01\ +\x01\x02a\xff\xec\x01\x01\x03I\xff\xd7\x01\x01\x03K\xff\ +\xd7\x01\x01\x03M\xff\xd7\x01\x01\x03O\xff\xd7\x01\x01\x03\ +Q\xff\xd7\x01\x01\x03S\xff\xd7\x01\x01\x03U\xff\xd7\x01\ +\x01\x03W\xff\xd7\x01\x01\x03Y\xff\xd7\x01\x01\x03[\xff\ +\xd7\x01\x01\x03]\xff\xd7\x01\x01\x03_\xff\xd7\x01\x01\x03\ +a\xff\xec\x01\x01\x03c\xff\xec\x01\x01\x03e\xff\xec\x01\ +\x01\x03g\xff\xec\x01\x01\x03i\xff\xec\x01\x01\x03k\xff\ +\xec\x01\x01\x03m\xff\xec\x01\x01\x03o\xff\xc3\x01\x01\x03\ +q\xff\xc3\x01\x01\x03s\xff\xc3\x01\x01\x03\x8f\xff\xd7\x01\ +\x03\x00\x05\xff\x5c\x01\x03\x00\x0a\xff\x5c\x01\x03\x00&\xff\ +\xd7\x01\x03\x00*\xff\xd7\x01\x03\x002\xff\xd7\x01\x03\x00\ +4\xff\xd7\x01\x03\x007\xff\xd7\x01\x03\x008\xff\xec\x01\ +\x03\x009\xff\xd7\x01\x03\x00:\xff\xd7\x01\x03\x00<\xff\ +\xc3\x01\x03\x00\x89\xff\xd7\x01\x03\x00\x94\xff\xd7\x01\x03\x00\ +\x95\xff\xd7\x01\x03\x00\x96\xff\xd7\x01\x03\x00\x97\xff\xd7\x01\ +\x03\x00\x98\xff\xd7\x01\x03\x00\x9a\xff\xd7\x01\x03\x00\x9b\xff\ +\xec\x01\x03\x00\x9c\xff\xec\x01\x03\x00\x9d\xff\xec\x01\x03\x00\ +\x9e\xff\xec\x01\x03\x00\x9f\xff\xc3\x01\x03\x00\xc8\xff\xd7\x01\ +\x03\x00\xca\xff\xd7\x01\x03\x00\xcc\xff\xd7\x01\x03\x00\xce\xff\ +\xd7\x01\x03\x00\xde\xff\xd7\x01\x03\x00\xe0\xff\xd7\x01\x03\x00\ +\xe2\xff\xd7\x01\x03\x00\xe4\xff\xd7\x01\x03\x01\x0e\xff\xd7\x01\ +\x03\x01\x10\xff\xd7\x01\x03\x01\x12\xff\xd7\x01\x03\x01\x14\xff\ +\xd7\x01\x03\x01$\xff\xd7\x01\x03\x01&\xff\xd7\x01\x03\x01\ +*\xff\xec\x01\x03\x01,\xff\xec\x01\x03\x01.\xff\xec\x01\ +\x03\x010\xff\xec\x01\x03\x012\xff\xec\x01\x03\x014\xff\ +\xec\x01\x03\x016\xff\xd7\x01\x03\x018\xff\xc3\x01\x03\x01\ +:\xff\xc3\x01\x03\x01G\xff\xd7\x01\x03\x01\xfa\xff\xd7\x01\ +\x03\x01\xfc\xff\xd7\x01\x03\x01\xfe\xff\xd7\x01\x03\x02\x00\xff\ +\xc3\x01\x03\x02\x07\xff\x5c\x01\x03\x02\x0b\xff\x5c\x01\x03\x02\ +_\xff\xd7\x01\x03\x02a\xff\xec\x01\x03\x03I\xff\xd7\x01\ +\x03\x03K\xff\xd7\x01\x03\x03M\xff\xd7\x01\x03\x03O\xff\ +\xd7\x01\x03\x03Q\xff\xd7\x01\x03\x03S\xff\xd7\x01\x03\x03\ +U\xff\xd7\x01\x03\x03W\xff\xd7\x01\x03\x03Y\xff\xd7\x01\ +\x03\x03[\xff\xd7\x01\x03\x03]\xff\xd7\x01\x03\x03_\xff\ +\xd7\x01\x03\x03a\xff\xec\x01\x03\x03c\xff\xec\x01\x03\x03\ +e\xff\xec\x01\x03\x03g\xff\xec\x01\x03\x03i\xff\xec\x01\ +\x03\x03k\xff\xec\x01\x03\x03m\xff\xec\x01\x03\x03o\xff\ +\xc3\x01\x03\x03q\xff\xc3\x01\x03\x03s\xff\xc3\x01\x03\x03\ +\x8f\xff\xd7\x01\x08\x00\x05\xff\xec\x01\x08\x00\x0a\xff\xec\x01\ +\x08\x02\x07\xff\xec\x01\x08\x02\x0b\xff\xec\x01\x0e\x00\x0f\xff\ +\xae\x01\x0e\x00\x11\xff\xae\x01\x0e\x00$\xff\xd7\x01\x0e\x00\ +7\xff\xc3\x01\x0e\x009\xff\xec\x01\x0e\x00:\xff\xec\x01\ +\x0e\x00;\xff\xd7\x01\x0e\x00<\xff\xec\x01\x0e\x00=\xff\ +\xec\x01\x0e\x00\x82\xff\xd7\x01\x0e\x00\x83\xff\xd7\x01\x0e\x00\ +\x84\xff\xd7\x01\x0e\x00\x85\xff\xd7\x01\x0e\x00\x86\xff\xd7\x01\ +\x0e\x00\x87\xff\xd7\x01\x0e\x00\x9f\xff\xec\x01\x0e\x00\xc2\xff\ +\xd7\x01\x0e\x00\xc4\xff\xd7\x01\x0e\x00\xc6\xff\xd7\x01\x0e\x01\ +$\xff\xc3\x01\x0e\x01&\xff\xc3\x01\x0e\x016\xff\xec\x01\ +\x0e\x018\xff\xec\x01\x0e\x01:\xff\xec\x01\x0e\x01;\xff\ +\xec\x01\x0e\x01=\xff\xec\x01\x0e\x01?\xff\xec\x01\x0e\x01\ +C\xff\xd7\x01\x0e\x01\xa0\xff\xec\x01\x0e\x01\xfa\xff\xec\x01\ +\x0e\x01\xfc\xff\xec\x01\x0e\x01\xfe\xff\xec\x01\x0e\x02\x00\xff\ +\xec\x01\x0e\x02\x08\xff\xae\x01\x0e\x02\x0c\xff\xae\x01\x0e\x02\ +X\xff\xd7\x01\x0e\x03\x1d\xff\xd7\x01\x0e\x03\x1f\xff\xd7\x01\ +\x0e\x03!\xff\xd7\x01\x0e\x03#\xff\xd7\x01\x0e\x03%\xff\ +\xd7\x01\x0e\x03'\xff\xd7\x01\x0e\x03)\xff\xd7\x01\x0e\x03\ ++\xff\xd7\x01\x0e\x03-\xff\xd7\x01\x0e\x03/\xff\xd7\x01\ +\x0e\x031\xff\xd7\x01\x0e\x033\xff\xd7\x01\x0e\x03o\xff\ +\xec\x01\x0e\x03q\xff\xec\x01\x0e\x03s\xff\xec\x01\x0e\x03\ +\x8f\xff\xc3\x01\x10\x00\x0f\xff\xae\x01\x10\x00\x11\xff\xae\x01\ +\x10\x00$\xff\xd7\x01\x10\x007\xff\xc3\x01\x10\x009\xff\ +\xec\x01\x10\x00:\xff\xec\x01\x10\x00;\xff\xd7\x01\x10\x00\ +<\xff\xec\x01\x10\x00=\xff\xec\x01\x10\x00\x82\xff\xd7\x01\ +\x10\x00\x83\xff\xd7\x01\x10\x00\x84\xff\xd7\x01\x10\x00\x85\xff\ +\xd7\x01\x10\x00\x86\xff\xd7\x01\x10\x00\x87\xff\xd7\x01\x10\x00\ +\x9f\xff\xec\x01\x10\x00\xc2\xff\xd7\x01\x10\x00\xc4\xff\xd7\x01\ +\x10\x00\xc6\xff\xd7\x01\x10\x01$\xff\xc3\x01\x10\x01&\xff\ +\xc3\x01\x10\x016\xff\xec\x01\x10\x018\xff\xec\x01\x10\x01\ +:\xff\xec\x01\x10\x01;\xff\xec\x01\x10\x01=\xff\xec\x01\ +\x10\x01?\xff\xec\x01\x10\x01C\xff\xd7\x01\x10\x01\xa0\xff\ +\xec\x01\x10\x01\xfa\xff\xec\x01\x10\x01\xfc\xff\xec\x01\x10\x01\ +\xfe\xff\xec\x01\x10\x02\x00\xff\xec\x01\x10\x02\x08\xff\xae\x01\ +\x10\x02\x0c\xff\xae\x01\x10\x02X\xff\xd7\x01\x10\x03\x1d\xff\ +\xd7\x01\x10\x03\x1f\xff\xd7\x01\x10\x03!\xff\xd7\x01\x10\x03\ +#\xff\xd7\x01\x10\x03%\xff\xd7\x01\x10\x03'\xff\xd7\x01\ +\x10\x03)\xff\xd7\x01\x10\x03+\xff\xd7\x01\x10\x03-\xff\ +\xd7\x01\x10\x03/\xff\xd7\x01\x10\x031\xff\xd7\x01\x10\x03\ +3\xff\xd7\x01\x10\x03o\xff\xec\x01\x10\x03q\xff\xec\x01\ +\x10\x03s\xff\xec\x01\x10\x03\x8f\xff\xc3\x01\x12\x00\x0f\xff\ +\xae\x01\x12\x00\x11\xff\xae\x01\x12\x00$\xff\xd7\x01\x12\x00\ +7\xff\xc3\x01\x12\x009\xff\xec\x01\x12\x00:\xff\xec\x01\ +\x12\x00;\xff\xd7\x01\x12\x00<\xff\xec\x01\x12\x00=\xff\ +\xec\x01\x12\x00\x82\xff\xd7\x01\x12\x00\x83\xff\xd7\x01\x12\x00\ +\x84\xff\xd7\x01\x12\x00\x85\xff\xd7\x01\x12\x00\x86\xff\xd7\x01\ +\x12\x00\x87\xff\xd7\x01\x12\x00\x9f\xff\xec\x01\x12\x00\xc2\xff\ +\xd7\x01\x12\x00\xc4\xff\xd7\x01\x12\x00\xc6\xff\xd7\x01\x12\x01\ +$\xff\xc3\x01\x12\x01&\xff\xc3\x01\x12\x016\xff\xec\x01\ +\x12\x018\xff\xec\x01\x12\x01:\xff\xec\x01\x12\x01;\xff\ +\xec\x01\x12\x01=\xff\xec\x01\x12\x01?\xff\xec\x01\x12\x01\ +C\xff\xd7\x01\x12\x01\xa0\xff\xec\x01\x12\x01\xfa\xff\xec\x01\ +\x12\x01\xfc\xff\xec\x01\x12\x01\xfe\xff\xec\x01\x12\x02\x00\xff\ +\xec\x01\x12\x02\x08\xff\xae\x01\x12\x02\x0c\xff\xae\x01\x12\x02\ +X\xff\xd7\x01\x12\x03\x1d\xff\xd7\x01\x12\x03\x1f\xff\xd7\x01\ +\x12\x03!\xff\xd7\x01\x12\x03#\xff\xd7\x01\x12\x03%\xff\ +\xd7\x01\x12\x03'\xff\xd7\x01\x12\x03)\xff\xd7\x01\x12\x03\ ++\xff\xd7\x01\x12\x03-\xff\xd7\x01\x12\x03/\xff\xd7\x01\ +\x12\x031\xff\xd7\x01\x12\x033\xff\xd7\x01\x12\x03o\xff\ +\xec\x01\x12\x03q\xff\xec\x01\x12\x03s\xff\xec\x01\x12\x03\ +\x8f\xff\xc3\x01\x14\x00-\x00{\x01\x17\x00\x05\x00R\x01\ +\x17\x00\x0a\x00R\x01\x17\x00D\xff\xd7\x01\x17\x00F\xff\ +\xd7\x01\x17\x00G\xff\xd7\x01\x17\x00H\xff\xd7\x01\x17\x00\ +J\xff\xec\x01\x17\x00R\xff\xd7\x01\x17\x00T\xff\xd7\x01\ +\x17\x00\xa2\xff\xd7\x01\x17\x00\xa3\xff\xd7\x01\x17\x00\xa4\xff\ +\xd7\x01\x17\x00\xa5\xff\xd7\x01\x17\x00\xa6\xff\xd7\x01\x17\x00\ +\xa7\xff\xd7\x01\x17\x00\xa8\xff\xd7\x01\x17\x00\xa9\xff\xd7\x01\ +\x17\x00\xaa\xff\xd7\x01\x17\x00\xab\xff\xd7\x01\x17\x00\xac\xff\ +\xd7\x01\x17\x00\xad\xff\xd7\x01\x17\x00\xb4\xff\xd7\x01\x17\x00\ +\xb5\xff\xd7\x01\x17\x00\xb6\xff\xd7\x01\x17\x00\xb7\xff\xd7\x01\ +\x17\x00\xb8\xff\xd7\x01\x17\x00\xba\xff\xd7\x01\x17\x00\xc3\xff\ +\xd7\x01\x17\x00\xc5\xff\xd7\x01\x17\x00\xc7\xff\xd7\x01\x17\x00\ +\xc9\xff\xd7\x01\x17\x00\xcb\xff\xd7\x01\x17\x00\xcd\xff\xd7\x01\ +\x17\x00\xcf\xff\xd7\x01\x17\x00\xd1\xff\xd7\x01\x17\x00\xd3\xff\ +\xd7\x01\x17\x00\xd5\xff\xd7\x01\x17\x00\xd7\xff\xd7\x01\x17\x00\ +\xd9\xff\xd7\x01\x17\x00\xdb\xff\xd7\x01\x17\x00\xdd\xff\xd7\x01\ +\x17\x00\xdf\xff\xec\x01\x17\x00\xe1\xff\xec\x01\x17\x00\xe3\xff\ +\xec\x01\x17\x00\xe5\xff\xec\x01\x17\x01\x0f\xff\xd7\x01\x17\x01\ +\x11\xff\xd7\x01\x17\x01\x13\xff\xd7\x01\x17\x01\x15\xff\xd7\x01\ +\x17\x01D\xff\xd7\x01\x17\x01F\xff\xd7\x01\x17\x01H\xff\ +\xd7\x01\x17\x02\x07\x00R\x01\x17\x02\x0b\x00R\x01\x17\x02\ +Y\xff\xd7\x01\x17\x02`\xff\xd7\x01\x17\x03\x1e\xff\xd7\x01\ +\x17\x03 \xff\xd7\x01\x17\x03\x22\xff\xd7\x01\x17\x03&\xff\ +\xd7\x01\x17\x03(\xff\xd7\x01\x17\x03*\xff\xd7\x01\x17\x03\ +,\xff\xd7\x01\x17\x03.\xff\xd7\x01\x17\x030\xff\xd7\x01\ +\x17\x032\xff\xd7\x01\x17\x034\xff\xd7\x01\x17\x036\xff\ +\xd7\x01\x17\x038\xff\xd7\x01\x17\x03:\xff\xd7\x01\x17\x03\ +<\xff\xd7\x01\x17\x03@\xff\xd7\x01\x17\x03B\xff\xd7\x01\ +\x17\x03D\xff\xd7\x01\x17\x03J\xff\xd7\x01\x17\x03L\xff\ +\xd7\x01\x17\x03N\xff\xd7\x01\x17\x03R\xff\xd7\x01\x17\x03\ +T\xff\xd7\x01\x17\x03V\xff\xd7\x01\x17\x03X\xff\xd7\x01\ +\x17\x03Z\xff\xd7\x01\x17\x03\x5c\xff\xd7\x01\x17\x03^\xff\ +\xd7\x01\x17\x03`\xff\xd7\x01\x19\x00\x05\x00R\x01\x19\x00\ +\x0a\x00R\x01\x19\x00D\xff\xd7\x01\x19\x00F\xff\xd7\x01\ +\x19\x00G\xff\xd7\x01\x19\x00H\xff\xd7\x01\x19\x00J\xff\ +\xec\x01\x19\x00R\xff\xd7\x01\x19\x00T\xff\xd7\x01\x19\x00\ +\xa2\xff\xd7\x01\x19\x00\xa3\xff\xd7\x01\x19\x00\xa4\xff\xd7\x01\ +\x19\x00\xa5\xff\xd7\x01\x19\x00\xa6\xff\xd7\x01\x19\x00\xa7\xff\ +\xd7\x01\x19\x00\xa8\xff\xd7\x01\x19\x00\xa9\xff\xd7\x01\x19\x00\ +\xaa\xff\xd7\x01\x19\x00\xab\xff\xd7\x01\x19\x00\xac\xff\xd7\x01\ +\x19\x00\xad\xff\xd7\x01\x19\x00\xb4\xff\xd7\x01\x19\x00\xb5\xff\ +\xd7\x01\x19\x00\xb6\xff\xd7\x01\x19\x00\xb7\xff\xd7\x01\x19\x00\ +\xb8\xff\xd7\x01\x19\x00\xba\xff\xd7\x01\x19\x00\xc3\xff\xd7\x01\ +\x19\x00\xc5\xff\xd7\x01\x19\x00\xc7\xff\xd7\x01\x19\x00\xc9\xff\ +\xd7\x01\x19\x00\xcb\xff\xd7\x01\x19\x00\xcd\xff\xd7\x01\x19\x00\ +\xcf\xff\xd7\x01\x19\x00\xd1\xff\xd7\x01\x19\x00\xd3\xff\xd7\x01\ +\x19\x00\xd5\xff\xd7\x01\x19\x00\xd7\xff\xd7\x01\x19\x00\xd9\xff\ +\xd7\x01\x19\x00\xdb\xff\xd7\x01\x19\x00\xdd\xff\xd7\x01\x19\x00\ +\xdf\xff\xec\x01\x19\x00\xe1\xff\xec\x01\x19\x00\xe3\xff\xec\x01\ +\x19\x00\xe5\xff\xec\x01\x19\x01\x0f\xff\xd7\x01\x19\x01\x11\xff\ +\xd7\x01\x19\x01\x13\xff\xd7\x01\x19\x01\x15\xff\xd7\x01\x19\x01\ +D\xff\xd7\x01\x19\x01F\xff\xd7\x01\x19\x01H\xff\xd7\x01\ +\x19\x02\x07\x00R\x01\x19\x02\x0b\x00R\x01\x19\x02Y\xff\ +\xd7\x01\x19\x02`\xff\xd7\x01\x19\x03\x1e\xff\xd7\x01\x19\x03\ + \xff\xd7\x01\x19\x03\x22\xff\xd7\x01\x19\x03&\xff\xd7\x01\ +\x19\x03(\xff\xd7\x01\x19\x03*\xff\xd7\x01\x19\x03,\xff\ +\xd7\x01\x19\x03.\xff\xd7\x01\x19\x030\xff\xd7\x01\x19\x03\ +2\xff\xd7\x01\x19\x034\xff\xd7\x01\x19\x036\xff\xd7\x01\ +\x19\x038\xff\xd7\x01\x19\x03:\xff\xd7\x01\x19\x03<\xff\ +\xd7\x01\x19\x03@\xff\xd7\x01\x19\x03B\xff\xd7\x01\x19\x03\ +D\xff\xd7\x01\x19\x03J\xff\xd7\x01\x19\x03L\xff\xd7\x01\ +\x19\x03N\xff\xd7\x01\x19\x03R\xff\xd7\x01\x19\x03T\xff\ +\xd7\x01\x19\x03V\xff\xd7\x01\x19\x03X\xff\xd7\x01\x19\x03\ +Z\xff\xd7\x01\x19\x03\x5c\xff\xd7\x01\x19\x03^\xff\xd7\x01\ +\x19\x03`\xff\xd7\x01\x1b\x00\x05\x00R\x01\x1b\x00\x0a\x00\ +R\x01\x1b\x00D\xff\xd7\x01\x1b\x00F\xff\xd7\x01\x1b\x00\ +G\xff\xd7\x01\x1b\x00H\xff\xd7\x01\x1b\x00J\xff\xec\x01\ +\x1b\x00R\xff\xd7\x01\x1b\x00T\xff\xd7\x01\x1b\x00\xa2\xff\ +\xd7\x01\x1b\x00\xa3\xff\xd7\x01\x1b\x00\xa4\xff\xd7\x01\x1b\x00\ +\xa5\xff\xd7\x01\x1b\x00\xa6\xff\xd7\x01\x1b\x00\xa7\xff\xd7\x01\ +\x1b\x00\xa8\xff\xd7\x01\x1b\x00\xa9\xff\xd7\x01\x1b\x00\xaa\xff\ +\xd7\x01\x1b\x00\xab\xff\xd7\x01\x1b\x00\xac\xff\xd7\x01\x1b\x00\ +\xad\xff\xd7\x01\x1b\x00\xb4\xff\xd7\x01\x1b\x00\xb5\xff\xd7\x01\ +\x1b\x00\xb6\xff\xd7\x01\x1b\x00\xb7\xff\xd7\x01\x1b\x00\xb8\xff\ +\xd7\x01\x1b\x00\xba\xff\xd7\x01\x1b\x00\xc3\xff\xd7\x01\x1b\x00\ +\xc5\xff\xd7\x01\x1b\x00\xc7\xff\xd7\x01\x1b\x00\xc9\xff\xd7\x01\ +\x1b\x00\xcb\xff\xd7\x01\x1b\x00\xcd\xff\xd7\x01\x1b\x00\xcf\xff\ +\xd7\x01\x1b\x00\xd1\xff\xd7\x01\x1b\x00\xd3\xff\xd7\x01\x1b\x00\ +\xd5\xff\xd7\x01\x1b\x00\xd7\xff\xd7\x01\x1b\x00\xd9\xff\xd7\x01\ +\x1b\x00\xdb\xff\xd7\x01\x1b\x00\xdd\xff\xd7\x01\x1b\x00\xdf\xff\ +\xec\x01\x1b\x00\xe1\xff\xec\x01\x1b\x00\xe3\xff\xec\x01\x1b\x00\ +\xe5\xff\xec\x01\x1b\x01\x0f\xff\xd7\x01\x1b\x01\x11\xff\xd7\x01\ +\x1b\x01\x13\xff\xd7\x01\x1b\x01\x15\xff\xd7\x01\x1b\x01D\xff\ +\xd7\x01\x1b\x01F\xff\xd7\x01\x1b\x01H\xff\xd7\x01\x1b\x02\ +\x07\x00R\x01\x1b\x02\x0b\x00R\x01\x1b\x02Y\xff\xd7\x01\ +\x1b\x02`\xff\xd7\x01\x1b\x03\x1e\xff\xd7\x01\x1b\x03 \xff\ +\xd7\x01\x1b\x03\x22\xff\xd7\x01\x1b\x03&\xff\xd7\x01\x1b\x03\ +(\xff\xd7\x01\x1b\x03*\xff\xd7\x01\x1b\x03,\xff\xd7\x01\ +\x1b\x03.\xff\xd7\x01\x1b\x030\xff\xd7\x01\x1b\x032\xff\ +\xd7\x01\x1b\x034\xff\xd7\x01\x1b\x036\xff\xd7\x01\x1b\x03\ +8\xff\xd7\x01\x1b\x03:\xff\xd7\x01\x1b\x03<\xff\xd7\x01\ +\x1b\x03@\xff\xd7\x01\x1b\x03B\xff\xd7\x01\x1b\x03D\xff\ +\xd7\x01\x1b\x03J\xff\xd7\x01\x1b\x03L\xff\xd7\x01\x1b\x03\ +N\xff\xd7\x01\x1b\x03R\xff\xd7\x01\x1b\x03T\xff\xd7\x01\ +\x1b\x03V\xff\xd7\x01\x1b\x03X\xff\xd7\x01\x1b\x03Z\xff\ +\xd7\x01\x1b\x03\x5c\xff\xd7\x01\x1b\x03^\xff\xd7\x01\x1b\x03\ +`\xff\xd7\x01$\x00\x0f\xff\x85\x01$\x00\x10\xff\xae\x01\ +$\x00\x11\xff\x85\x01$\x00\x22\x00)\x01$\x00$\xff\ +q\x01$\x00&\xff\xd7\x01$\x00*\xff\xd7\x01$\x00\ +2\xff\xd7\x01$\x004\xff\xd7\x01$\x007\x00)\x01\ +$\x00D\xff\x5c\x01$\x00F\xffq\x01$\x00G\xff\ +q\x01$\x00H\xffq\x01$\x00J\xffq\x01$\x00\ +P\xff\x9a\x01$\x00Q\xff\x9a\x01$\x00R\xffq\x01\ +$\x00S\xff\x9a\x01$\x00T\xffq\x01$\x00U\xff\ +\x9a\x01$\x00V\xff\x85\x01$\x00X\xff\x9a\x01$\x00\ +Y\xff\xd7\x01$\x00Z\xff\xd7\x01$\x00[\xff\xd7\x01\ +$\x00\x5c\xff\xd7\x01$\x00]\xff\xae\x01$\x00\x82\xff\ +q\x01$\x00\x83\xffq\x01$\x00\x84\xffq\x01$\x00\ +\x85\xffq\x01$\x00\x86\xffq\x01$\x00\x87\xffq\x01\ +$\x00\x89\xff\xd7\x01$\x00\x94\xff\xd7\x01$\x00\x95\xff\ +\xd7\x01$\x00\x96\xff\xd7\x01$\x00\x97\xff\xd7\x01$\x00\ +\x98\xff\xd7\x01$\x00\x9a\xff\xd7\x01$\x00\xa2\xffq\x01\ +$\x00\xa3\xff\x5c\x01$\x00\xa4\xff\x5c\x01$\x00\xa5\xff\ +\x5c\x01$\x00\xa6\xff\x5c\x01$\x00\xa7\xff\x5c\x01$\x00\ +\xa8\xff\x5c\x01$\x00\xa9\xffq\x01$\x00\xaa\xffq\x01\ +$\x00\xab\xffq\x01$\x00\xac\xffq\x01$\x00\xad\xff\ +q\x01$\x00\xb4\xffq\x01$\x00\xb5\xffq\x01$\x00\ +\xb6\xffq\x01$\x00\xb7\xffq\x01$\x00\xb8\xffq\x01\ +$\x00\xba\xffq\x01$\x00\xbb\xff\x9a\x01$\x00\xbc\xff\ +\x9a\x01$\x00\xbd\xff\x9a\x01$\x00\xbe\xff\x9a\x01$\x00\ +\xbf\xff\xd7\x01$\x00\xc2\xffq\x01$\x00\xc3\xff\x5c\x01\ +$\x00\xc4\xffq\x01$\x00\xc5\xff\x5c\x01$\x00\xc6\xff\ +q\x01$\x00\xc7\xff\x5c\x01$\x00\xc8\xff\xd7\x01$\x00\ +\xc9\xffq\x01$\x00\xca\xff\xd7\x01$\x00\xcb\xffq\x01\ +$\x00\xcc\xff\xd7\x01$\x00\xcd\xffq\x01$\x00\xce\xff\ +\xd7\x01$\x00\xcf\xffq\x01$\x00\xd1\xffq\x01$\x00\ +\xd3\xffq\x01$\x00\xd5\xffq\x01$\x00\xd7\xffq\x01\ +$\x00\xd9\xffq\x01$\x00\xdb\xffq\x01$\x00\xdd\xff\ +q\x01$\x00\xde\xff\xd7\x01$\x00\xdf\xffq\x01$\x00\ +\xe0\xff\xd7\x01$\x00\xe1\xffq\x01$\x00\xe2\xff\xd7\x01\ +$\x00\xe3\xffq\x01$\x00\xe4\xff\xd7\x01$\x00\xe5\xff\ +q\x01$\x00\xfa\xff\x9a\x01$\x01\x06\xff\x9a\x01$\x01\ +\x08\xff\x9a\x01$\x01\x0d\xff\x9a\x01$\x01\x0e\xff\xd7\x01\ +$\x01\x0f\xffq\x01$\x01\x10\xff\xd7\x01$\x01\x11\xff\ +q\x01$\x01\x12\xff\xd7\x01$\x01\x13\xffq\x01$\x01\ +\x14\xff\xd7\x01$\x01\x15\xffq\x01$\x01\x17\xff\x9a\x01\ +$\x01\x19\xff\x9a\x01$\x01\x1d\xff\x85\x01$\x01!\xff\ +\x85\x01$\x01$\x00)\x01$\x01&\x00)\x01$\x01\ ++\xff\x9a\x01$\x01-\xff\x9a\x01$\x01/\xff\x9a\x01\ +$\x011\xff\x9a\x01$\x013\xff\x9a\x01$\x015\xff\ +\x9a\x01$\x017\xff\xd7\x01$\x01<\xff\xae\x01$\x01\ +>\xff\xae\x01$\x01@\xff\xae\x01$\x01C\xffq\x01\ +$\x01D\xff\x5c\x01$\x01F\xff\x5c\x01$\x01G\xff\ +\xd7\x01$\x01H\xffq\x01$\x01J\xff\x85\x01$\x01\ +\xfb\xff\xd7\x01$\x01\xfd\xff\xd7\x01$\x02\x02\xff\xae\x01\ +$\x02\x03\xff\xae\x01$\x02\x04\xff\xae\x01$\x02\x08\xff\ +\x85\x01$\x02\x0c\xff\x85\x01$\x02W\xff\x9a\x01$\x02\ +X\xffq\x01$\x02Y\xff\x5c\x01$\x02_\xff\xd7\x01\ +$\x02`\xffq\x01$\x02b\xff\x9a\x01$\x03\x1d\xff\ +q\x01$\x03\x1e\xff\x5c\x01$\x03\x1f\xffq\x01$\x03\ + \xff\x5c\x01$\x03!\xffq\x01$\x03\x22\xff\x5c\x01\ +$\x03#\xffq\x01$\x03%\xffq\x01$\x03&\xff\ +\x5c\x01$\x03'\xffq\x01$\x03(\xff\x5c\x01$\x03\ +)\xffq\x01$\x03*\xff\x5c\x01$\x03+\xffq\x01\ +$\x03,\xff\x5c\x01$\x03-\xffq\x01$\x03.\xff\ +\x5c\x01$\x03/\xffq\x01$\x030\xff\x5c\x01$\x03\ +1\xffq\x01$\x032\xff\x5c\x01$\x033\xffq\x01\ +$\x034\xff\x5c\x01$\x036\xffq\x01$\x038\xff\ +q\x01$\x03:\xffq\x01$\x03<\xffq\x01$\x03\ +@\xffq\x01$\x03B\xffq\x01$\x03D\xffq\x01\ +$\x03I\xff\xd7\x01$\x03J\xffq\x01$\x03K\xff\ +\xd7\x01$\x03L\xffq\x01$\x03M\xff\xd7\x01$\x03\ +N\xffq\x01$\x03O\xff\xd7\x01$\x03Q\xff\xd7\x01\ +$\x03R\xffq\x01$\x03S\xff\xd7\x01$\x03T\xff\ +q\x01$\x03U\xff\xd7\x01$\x03V\xffq\x01$\x03\ +W\xff\xd7\x01$\x03X\xffq\x01$\x03Y\xff\xd7\x01\ +$\x03Z\xffq\x01$\x03[\xff\xd7\x01$\x03\x5c\xff\ +q\x01$\x03]\xff\xd7\x01$\x03^\xffq\x01$\x03\ +_\xff\xd7\x01$\x03`\xffq\x01$\x03b\xff\x9a\x01\ +$\x03d\xff\x9a\x01$\x03f\xff\x9a\x01$\x03h\xff\ +\x9a\x01$\x03j\xff\x9a\x01$\x03l\xff\x9a\x01$\x03\ +n\xff\x9a\x01$\x03p\xff\xd7\x01$\x03\x8f\x00)\x01\ +%\x00\x05\x00)\x01%\x00\x0a\x00)\x01%\x02\x07\x00\ +)\x01%\x02\x0b\x00)\x01&\x00\x0f\xff\x85\x01&\x00\ +\x10\xff\xae\x01&\x00\x11\xff\x85\x01&\x00\x22\x00)\x01\ +&\x00$\xffq\x01&\x00&\xff\xd7\x01&\x00*\xff\ +\xd7\x01&\x002\xff\xd7\x01&\x004\xff\xd7\x01&\x00\ +7\x00)\x01&\x00D\xff\x5c\x01&\x00F\xffq\x01\ +&\x00G\xffq\x01&\x00H\xffq\x01&\x00J\xff\ +q\x01&\x00P\xff\x9a\x01&\x00Q\xff\x9a\x01&\x00\ +R\xffq\x01&\x00S\xff\x9a\x01&\x00T\xffq\x01\ +&\x00U\xff\x9a\x01&\x00V\xff\x85\x01&\x00X\xff\ +\x9a\x01&\x00Y\xff\xd7\x01&\x00Z\xff\xd7\x01&\x00\ +[\xff\xd7\x01&\x00\x5c\xff\xd7\x01&\x00]\xff\xae\x01\ +&\x00\x82\xffq\x01&\x00\x83\xffq\x01&\x00\x84\xff\ +q\x01&\x00\x85\xffq\x01&\x00\x86\xffq\x01&\x00\ +\x87\xffq\x01&\x00\x89\xff\xd7\x01&\x00\x94\xff\xd7\x01\ +&\x00\x95\xff\xd7\x01&\x00\x96\xff\xd7\x01&\x00\x97\xff\ +\xd7\x01&\x00\x98\xff\xd7\x01&\x00\x9a\xff\xd7\x01&\x00\ +\xa2\xffq\x01&\x00\xa3\xff\x5c\x01&\x00\xa4\xff\x5c\x01\ +&\x00\xa5\xff\x5c\x01&\x00\xa6\xff\x5c\x01&\x00\xa7\xff\ +\x5c\x01&\x00\xa8\xff\x5c\x01&\x00\xa9\xffq\x01&\x00\ +\xaa\xffq\x01&\x00\xab\xffq\x01&\x00\xac\xffq\x01\ +&\x00\xad\xffq\x01&\x00\xb4\xffq\x01&\x00\xb5\xff\ +q\x01&\x00\xb6\xffq\x01&\x00\xb7\xffq\x01&\x00\ +\xb8\xffq\x01&\x00\xba\xffq\x01&\x00\xbb\xff\x9a\x01\ +&\x00\xbc\xff\x9a\x01&\x00\xbd\xff\x9a\x01&\x00\xbe\xff\ +\x9a\x01&\x00\xbf\xff\xd7\x01&\x00\xc2\xffq\x01&\x00\ +\xc3\xff\x5c\x01&\x00\xc4\xffq\x01&\x00\xc5\xff\x5c\x01\ +&\x00\xc6\xffq\x01&\x00\xc7\xff\x5c\x01&\x00\xc8\xff\ +\xd7\x01&\x00\xc9\xffq\x01&\x00\xca\xff\xd7\x01&\x00\ +\xcb\xffq\x01&\x00\xcc\xff\xd7\x01&\x00\xcd\xffq\x01\ +&\x00\xce\xff\xd7\x01&\x00\xcf\xffq\x01&\x00\xd1\xff\ +q\x01&\x00\xd3\xffq\x01&\x00\xd5\xffq\x01&\x00\ +\xd7\xffq\x01&\x00\xd9\xffq\x01&\x00\xdb\xffq\x01\ +&\x00\xdd\xffq\x01&\x00\xde\xff\xd7\x01&\x00\xdf\xff\ +q\x01&\x00\xe0\xff\xd7\x01&\x00\xe1\xffq\x01&\x00\ +\xe2\xff\xd7\x01&\x00\xe3\xffq\x01&\x00\xe4\xff\xd7\x01\ +&\x00\xe5\xffq\x01&\x00\xfa\xff\x9a\x01&\x01\x06\xff\ +\x9a\x01&\x01\x08\xff\x9a\x01&\x01\x0d\xff\x9a\x01&\x01\ +\x0e\xff\xd7\x01&\x01\x0f\xffq\x01&\x01\x10\xff\xd7\x01\ +&\x01\x11\xffq\x01&\x01\x12\xff\xd7\x01&\x01\x13\xff\ +q\x01&\x01\x14\xff\xd7\x01&\x01\x15\xffq\x01&\x01\ +\x17\xff\x9a\x01&\x01\x19\xff\x9a\x01&\x01\x1d\xff\x85\x01\ +&\x01!\xff\x85\x01&\x01$\x00)\x01&\x01&\x00\ +)\x01&\x01+\xff\x9a\x01&\x01-\xff\x9a\x01&\x01\ +/\xff\x9a\x01&\x011\xff\x9a\x01&\x013\xff\x9a\x01\ +&\x015\xff\x9a\x01&\x017\xff\xd7\x01&\x01<\xff\ +\xae\x01&\x01>\xff\xae\x01&\x01@\xff\xae\x01&\x01\ +C\xffq\x01&\x01D\xff\x5c\x01&\x01F\xff\x5c\x01\ +&\x01G\xff\xd7\x01&\x01H\xffq\x01&\x01J\xff\ +\x85\x01&\x01\xfb\xff\xd7\x01&\x01\xfd\xff\xd7\x01&\x02\ +\x02\xff\xae\x01&\x02\x03\xff\xae\x01&\x02\x04\xff\xae\x01\ +&\x02\x08\xff\x85\x01&\x02\x0c\xff\x85\x01&\x02W\xff\ +\x9a\x01&\x02X\xffq\x01&\x02Y\xff\x5c\x01&\x02\ +_\xff\xd7\x01&\x02`\xffq\x01&\x02b\xff\x9a\x01\ +&\x03\x1d\xffq\x01&\x03\x1e\xff\x5c\x01&\x03\x1f\xff\ +q\x01&\x03 \xff\x5c\x01&\x03!\xffq\x01&\x03\ +\x22\xff\x5c\x01&\x03#\xffq\x01&\x03%\xffq\x01\ +&\x03&\xff\x5c\x01&\x03'\xffq\x01&\x03(\xff\ +\x5c\x01&\x03)\xffq\x01&\x03*\xff\x5c\x01&\x03\ ++\xffq\x01&\x03,\xff\x5c\x01&\x03-\xffq\x01\ +&\x03.\xff\x5c\x01&\x03/\xffq\x01&\x030\xff\ +\x5c\x01&\x031\xffq\x01&\x032\xff\x5c\x01&\x03\ +3\xffq\x01&\x034\xff\x5c\x01&\x036\xffq\x01\ +&\x038\xffq\x01&\x03:\xffq\x01&\x03<\xff\ +q\x01&\x03@\xffq\x01&\x03B\xffq\x01&\x03\ +D\xffq\x01&\x03I\xff\xd7\x01&\x03J\xffq\x01\ +&\x03K\xff\xd7\x01&\x03L\xffq\x01&\x03M\xff\ +\xd7\x01&\x03N\xffq\x01&\x03O\xff\xd7\x01&\x03\ +Q\xff\xd7\x01&\x03R\xffq\x01&\x03S\xff\xd7\x01\ +&\x03T\xffq\x01&\x03U\xff\xd7\x01&\x03V\xff\ +q\x01&\x03W\xff\xd7\x01&\x03X\xffq\x01&\x03\ +Y\xff\xd7\x01&\x03Z\xffq\x01&\x03[\xff\xd7\x01\ +&\x03\x5c\xffq\x01&\x03]\xff\xd7\x01&\x03^\xff\ +q\x01&\x03_\xff\xd7\x01&\x03`\xffq\x01&\x03\ +b\xff\x9a\x01&\x03d\xff\x9a\x01&\x03f\xff\x9a\x01\ +&\x03h\xff\x9a\x01&\x03j\xff\x9a\x01&\x03l\xff\ +\x9a\x01&\x03n\xff\x9a\x01&\x03p\xff\xd7\x01&\x03\ +\x8f\x00)\x01'\x00\x05\x00)\x01'\x00\x0a\x00)\x01\ +'\x02\x07\x00)\x01'\x02\x0b\x00)\x01(\x00\x0f\xff\ +\x85\x01(\x00\x10\xff\xae\x01(\x00\x11\xff\x85\x01(\x00\ +\x22\x00)\x01(\x00$\xffq\x01(\x00&\xff\xd7\x01\ +(\x00*\xff\xd7\x01(\x002\xff\xd7\x01(\x004\xff\ +\xd7\x01(\x007\x00)\x01(\x00D\xff\x5c\x01(\x00\ +F\xffq\x01(\x00G\xffq\x01(\x00H\xffq\x01\ +(\x00J\xffq\x01(\x00P\xff\x9a\x01(\x00Q\xff\ +\x9a\x01(\x00R\xffq\x01(\x00S\xff\x9a\x01(\x00\ +T\xffq\x01(\x00U\xff\x9a\x01(\x00V\xff\x85\x01\ +(\x00X\xff\x9a\x01(\x00Y\xff\xd7\x01(\x00Z\xff\ +\xd7\x01(\x00[\xff\xd7\x01(\x00\x5c\xff\xd7\x01(\x00\ +]\xff\xae\x01(\x00\x82\xffq\x01(\x00\x83\xffq\x01\ +(\x00\x84\xffq\x01(\x00\x85\xffq\x01(\x00\x86\xff\ +q\x01(\x00\x87\xffq\x01(\x00\x89\xff\xd7\x01(\x00\ +\x94\xff\xd7\x01(\x00\x95\xff\xd7\x01(\x00\x96\xff\xd7\x01\ +(\x00\x97\xff\xd7\x01(\x00\x98\xff\xd7\x01(\x00\x9a\xff\ +\xd7\x01(\x00\xa2\xffq\x01(\x00\xa3\xff\x5c\x01(\x00\ +\xa4\xff\x5c\x01(\x00\xa5\xff\x5c\x01(\x00\xa6\xff\x5c\x01\ +(\x00\xa7\xff\x5c\x01(\x00\xa8\xff\x5c\x01(\x00\xa9\xff\ +q\x01(\x00\xaa\xffq\x01(\x00\xab\xffq\x01(\x00\ +\xac\xffq\x01(\x00\xad\xffq\x01(\x00\xb4\xffq\x01\ +(\x00\xb5\xffq\x01(\x00\xb6\xffq\x01(\x00\xb7\xff\ +q\x01(\x00\xb8\xffq\x01(\x00\xba\xffq\x01(\x00\ +\xbb\xff\x9a\x01(\x00\xbc\xff\x9a\x01(\x00\xbd\xff\x9a\x01\ +(\x00\xbe\xff\x9a\x01(\x00\xbf\xff\xd7\x01(\x00\xc2\xff\ +q\x01(\x00\xc3\xff\x5c\x01(\x00\xc4\xffq\x01(\x00\ +\xc5\xff\x5c\x01(\x00\xc6\xffq\x01(\x00\xc7\xff\x5c\x01\ +(\x00\xc8\xff\xd7\x01(\x00\xc9\xffq\x01(\x00\xca\xff\ +\xd7\x01(\x00\xcb\xffq\x01(\x00\xcc\xff\xd7\x01(\x00\ +\xcd\xffq\x01(\x00\xce\xff\xd7\x01(\x00\xcf\xffq\x01\ +(\x00\xd1\xffq\x01(\x00\xd3\xffq\x01(\x00\xd5\xff\ +q\x01(\x00\xd7\xffq\x01(\x00\xd9\xffq\x01(\x00\ +\xdb\xffq\x01(\x00\xdd\xffq\x01(\x00\xde\xff\xd7\x01\ +(\x00\xdf\xffq\x01(\x00\xe0\xff\xd7\x01(\x00\xe1\xff\ +q\x01(\x00\xe2\xff\xd7\x01(\x00\xe3\xffq\x01(\x00\ +\xe4\xff\xd7\x01(\x00\xe5\xffq\x01(\x00\xfa\xff\x9a\x01\ +(\x01\x06\xff\x9a\x01(\x01\x08\xff\x9a\x01(\x01\x0d\xff\ +\x9a\x01(\x01\x0e\xff\xd7\x01(\x01\x0f\xffq\x01(\x01\ +\x10\xff\xd7\x01(\x01\x11\xffq\x01(\x01\x12\xff\xd7\x01\ +(\x01\x13\xffq\x01(\x01\x14\xff\xd7\x01(\x01\x15\xff\ +q\x01(\x01\x17\xff\x9a\x01(\x01\x19\xff\x9a\x01(\x01\ +\x1d\xff\x85\x01(\x01!\xff\x85\x01(\x01$\x00)\x01\ +(\x01&\x00)\x01(\x01+\xff\x9a\x01(\x01-\xff\ +\x9a\x01(\x01/\xff\x9a\x01(\x011\xff\x9a\x01(\x01\ +3\xff\x9a\x01(\x015\xff\x9a\x01(\x017\xff\xd7\x01\ +(\x01<\xff\xae\x01(\x01>\xff\xae\x01(\x01@\xff\ +\xae\x01(\x01C\xffq\x01(\x01D\xff\x5c\x01(\x01\ +F\xff\x5c\x01(\x01G\xff\xd7\x01(\x01H\xffq\x01\ +(\x01J\xff\x85\x01(\x01\xfb\xff\xd7\x01(\x01\xfd\xff\ +\xd7\x01(\x02\x02\xff\xae\x01(\x02\x03\xff\xae\x01(\x02\ +\x04\xff\xae\x01(\x02\x08\xff\x85\x01(\x02\x0c\xff\x85\x01\ +(\x02W\xff\x9a\x01(\x02X\xffq\x01(\x02Y\xff\ +\x5c\x01(\x02_\xff\xd7\x01(\x02`\xffq\x01(\x02\ +b\xff\x9a\x01(\x03\x1d\xffq\x01(\x03\x1e\xff\x5c\x01\ +(\x03\x1f\xffq\x01(\x03 \xff\x5c\x01(\x03!\xff\ +q\x01(\x03\x22\xff\x5c\x01(\x03#\xffq\x01(\x03\ +%\xffq\x01(\x03&\xff\x5c\x01(\x03'\xffq\x01\ +(\x03(\xff\x5c\x01(\x03)\xffq\x01(\x03*\xff\ +\x5c\x01(\x03+\xffq\x01(\x03,\xff\x5c\x01(\x03\ +-\xffq\x01(\x03.\xff\x5c\x01(\x03/\xffq\x01\ +(\x030\xff\x5c\x01(\x031\xffq\x01(\x032\xff\ +\x5c\x01(\x033\xffq\x01(\x034\xff\x5c\x01(\x03\ +6\xffq\x01(\x038\xffq\x01(\x03:\xffq\x01\ +(\x03<\xffq\x01(\x03@\xffq\x01(\x03B\xff\ +q\x01(\x03D\xffq\x01(\x03I\xff\xd7\x01(\x03\ +J\xffq\x01(\x03K\xff\xd7\x01(\x03L\xffq\x01\ +(\x03M\xff\xd7\x01(\x03N\xffq\x01(\x03O\xff\ +\xd7\x01(\x03Q\xff\xd7\x01(\x03R\xffq\x01(\x03\ +S\xff\xd7\x01(\x03T\xffq\x01(\x03U\xff\xd7\x01\ +(\x03V\xffq\x01(\x03W\xff\xd7\x01(\x03X\xff\ +q\x01(\x03Y\xff\xd7\x01(\x03Z\xffq\x01(\x03\ +[\xff\xd7\x01(\x03\x5c\xffq\x01(\x03]\xff\xd7\x01\ +(\x03^\xffq\x01(\x03_\xff\xd7\x01(\x03`\xff\ +q\x01(\x03b\xff\x9a\x01(\x03d\xff\x9a\x01(\x03\ +f\xff\x9a\x01(\x03h\xff\x9a\x01(\x03j\xff\x9a\x01\ +(\x03l\xff\x9a\x01(\x03n\xff\x9a\x01(\x03p\xff\ +\xd7\x01(\x03\x8f\x00)\x01*\x00\x0f\xff\xd7\x01*\x00\ +\x11\xff\xd7\x01*\x00$\xff\xec\x01*\x00\x82\xff\xec\x01\ +*\x00\x83\xff\xec\x01*\x00\x84\xff\xec\x01*\x00\x85\xff\ +\xec\x01*\x00\x86\xff\xec\x01*\x00\x87\xff\xec\x01*\x00\ +\xc2\xff\xec\x01*\x00\xc4\xff\xec\x01*\x00\xc6\xff\xec\x01\ +*\x01C\xff\xec\x01*\x02\x08\xff\xd7\x01*\x02\x0c\xff\ +\xd7\x01*\x02X\xff\xec\x01*\x03\x1d\xff\xec\x01*\x03\ +\x1f\xff\xec\x01*\x03!\xff\xec\x01*\x03#\xff\xec\x01\ +*\x03%\xff\xec\x01*\x03'\xff\xec\x01*\x03)\xff\ +\xec\x01*\x03+\xff\xec\x01*\x03-\xff\xec\x01*\x03\ +/\xff\xec\x01*\x031\xff\xec\x01*\x033\xff\xec\x01\ +,\x00\x0f\xff\xd7\x01,\x00\x11\xff\xd7\x01,\x00$\xff\ +\xec\x01,\x00\x82\xff\xec\x01,\x00\x83\xff\xec\x01,\x00\ +\x84\xff\xec\x01,\x00\x85\xff\xec\x01,\x00\x86\xff\xec\x01\ +,\x00\x87\xff\xec\x01,\x00\xc2\xff\xec\x01,\x00\xc4\xff\ +\xec\x01,\x00\xc6\xff\xec\x01,\x01C\xff\xec\x01,\x02\ +\x08\xff\xd7\x01,\x02\x0c\xff\xd7\x01,\x02X\xff\xec\x01\ +,\x03\x1d\xff\xec\x01,\x03\x1f\xff\xec\x01,\x03!\xff\ +\xec\x01,\x03#\xff\xec\x01,\x03%\xff\xec\x01,\x03\ +'\xff\xec\x01,\x03)\xff\xec\x01,\x03+\xff\xec\x01\ +,\x03-\xff\xec\x01,\x03/\xff\xec\x01,\x031\xff\ +\xec\x01,\x033\xff\xec\x01.\x00\x0f\xff\xd7\x01.\x00\ +\x11\xff\xd7\x01.\x00$\xff\xec\x01.\x00\x82\xff\xec\x01\ +.\x00\x83\xff\xec\x01.\x00\x84\xff\xec\x01.\x00\x85\xff\ +\xec\x01.\x00\x86\xff\xec\x01.\x00\x87\xff\xec\x01.\x00\ +\xc2\xff\xec\x01.\x00\xc4\xff\xec\x01.\x00\xc6\xff\xec\x01\ +.\x01C\xff\xec\x01.\x02\x08\xff\xd7\x01.\x02\x0c\xff\ +\xd7\x01.\x02X\xff\xec\x01.\x03\x1d\xff\xec\x01.\x03\ +\x1f\xff\xec\x01.\x03!\xff\xec\x01.\x03#\xff\xec\x01\ +.\x03%\xff\xec\x01.\x03'\xff\xec\x01.\x03)\xff\ +\xec\x01.\x03+\xff\xec\x01.\x03-\xff\xec\x01.\x03\ +/\xff\xec\x01.\x031\xff\xec\x01.\x033\xff\xec\x01\ +0\x00\x0f\xff\xd7\x010\x00\x11\xff\xd7\x010\x00$\xff\ +\xec\x010\x00\x82\xff\xec\x010\x00\x83\xff\xec\x010\x00\ +\x84\xff\xec\x010\x00\x85\xff\xec\x010\x00\x86\xff\xec\x01\ +0\x00\x87\xff\xec\x010\x00\xc2\xff\xec\x010\x00\xc4\xff\ +\xec\x010\x00\xc6\xff\xec\x010\x01C\xff\xec\x010\x02\ +\x08\xff\xd7\x010\x02\x0c\xff\xd7\x010\x02X\xff\xec\x01\ +0\x03\x1d\xff\xec\x010\x03\x1f\xff\xec\x010\x03!\xff\ +\xec\x010\x03#\xff\xec\x010\x03%\xff\xec\x010\x03\ +'\xff\xec\x010\x03)\xff\xec\x010\x03+\xff\xec\x01\ +0\x03-\xff\xec\x010\x03/\xff\xec\x010\x031\xff\ +\xec\x010\x033\xff\xec\x012\x00\x0f\xff\xd7\x012\x00\ +\x11\xff\xd7\x012\x00$\xff\xec\x012\x00\x82\xff\xec\x01\ +2\x00\x83\xff\xec\x012\x00\x84\xff\xec\x012\x00\x85\xff\ +\xec\x012\x00\x86\xff\xec\x012\x00\x87\xff\xec\x012\x00\ +\xc2\xff\xec\x012\x00\xc4\xff\xec\x012\x00\xc6\xff\xec\x01\ +2\x01C\xff\xec\x012\x02\x08\xff\xd7\x012\x02\x0c\xff\ +\xd7\x012\x02X\xff\xec\x012\x03\x1d\xff\xec\x012\x03\ +\x1f\xff\xec\x012\x03!\xff\xec\x012\x03#\xff\xec\x01\ +2\x03%\xff\xec\x012\x03'\xff\xec\x012\x03)\xff\ +\xec\x012\x03+\xff\xec\x012\x03-\xff\xec\x012\x03\ +/\xff\xec\x012\x031\xff\xec\x012\x033\xff\xec\x01\ +4\x00\x0f\xff\xd7\x014\x00\x11\xff\xd7\x014\x00$\xff\ +\xec\x014\x00\x82\xff\xec\x014\x00\x83\xff\xec\x014\x00\ +\x84\xff\xec\x014\x00\x85\xff\xec\x014\x00\x86\xff\xec\x01\ +4\x00\x87\xff\xec\x014\x00\xc2\xff\xec\x014\x00\xc4\xff\ +\xec\x014\x00\xc6\xff\xec\x014\x01C\xff\xec\x014\x02\ +\x08\xff\xd7\x014\x02\x0c\xff\xd7\x014\x02X\xff\xec\x01\ +4\x03\x1d\xff\xec\x014\x03\x1f\xff\xec\x014\x03!\xff\ +\xec\x014\x03#\xff\xec\x014\x03%\xff\xec\x014\x03\ +'\xff\xec\x014\x03)\xff\xec\x014\x03+\xff\xec\x01\ +4\x03-\xff\xec\x014\x03/\xff\xec\x014\x031\xff\ +\xec\x014\x033\xff\xec\x016\x00\x0f\xff\x9a\x016\x00\ +\x11\xff\x9a\x016\x00\x22\x00)\x016\x00$\xff\xae\x01\ +6\x00&\xff\xec\x016\x00*\xff\xec\x016\x002\xff\ +\xec\x016\x004\xff\xec\x016\x00D\xff\xd7\x016\x00\ +F\xff\xd7\x016\x00G\xff\xd7\x016\x00H\xff\xd7\x01\ +6\x00J\xff\xec\x016\x00P\xff\xec\x016\x00Q\xff\ +\xec\x016\x00R\xff\xd7\x016\x00S\xff\xec\x016\x00\ +T\xff\xd7\x016\x00U\xff\xec\x016\x00V\xff\xec\x01\ +6\x00X\xff\xec\x016\x00\x82\xff\xae\x016\x00\x83\xff\ +\xae\x016\x00\x84\xff\xae\x016\x00\x85\xff\xae\x016\x00\ +\x86\xff\xae\x016\x00\x87\xff\xae\x016\x00\x89\xff\xec\x01\ +6\x00\x94\xff\xec\x016\x00\x95\xff\xec\x016\x00\x96\xff\ +\xec\x016\x00\x97\xff\xec\x016\x00\x98\xff\xec\x016\x00\ +\x9a\xff\xec\x016\x00\xa2\xff\xd7\x016\x00\xa3\xff\xd7\x01\ +6\x00\xa4\xff\xd7\x016\x00\xa5\xff\xd7\x016\x00\xa6\xff\ +\xd7\x016\x00\xa7\xff\xd7\x016\x00\xa8\xff\xd7\x016\x00\ +\xa9\xff\xd7\x016\x00\xaa\xff\xd7\x016\x00\xab\xff\xd7\x01\ +6\x00\xac\xff\xd7\x016\x00\xad\xff\xd7\x016\x00\xb4\xff\ +\xd7\x016\x00\xb5\xff\xd7\x016\x00\xb6\xff\xd7\x016\x00\ +\xb7\xff\xd7\x016\x00\xb8\xff\xd7\x016\x00\xba\xff\xd7\x01\ +6\x00\xbb\xff\xec\x016\x00\xbc\xff\xec\x016\x00\xbd\xff\ +\xec\x016\x00\xbe\xff\xec\x016\x00\xc2\xff\xae\x016\x00\ +\xc3\xff\xd7\x016\x00\xc4\xff\xae\x016\x00\xc5\xff\xd7\x01\ +6\x00\xc6\xff\xae\x016\x00\xc7\xff\xd7\x016\x00\xc8\xff\ +\xec\x016\x00\xc9\xff\xd7\x016\x00\xca\xff\xec\x016\x00\ +\xcb\xff\xd7\x016\x00\xcc\xff\xec\x016\x00\xcd\xff\xd7\x01\ +6\x00\xce\xff\xec\x016\x00\xcf\xff\xd7\x016\x00\xd1\xff\ +\xd7\x016\x00\xd3\xff\xd7\x016\x00\xd5\xff\xd7\x016\x00\ +\xd7\xff\xd7\x016\x00\xd9\xff\xd7\x016\x00\xdb\xff\xd7\x01\ +6\x00\xdd\xff\xd7\x016\x00\xde\xff\xec\x016\x00\xdf\xff\ +\xec\x016\x00\xe0\xff\xec\x016\x00\xe1\xff\xec\x016\x00\ +\xe2\xff\xec\x016\x00\xe3\xff\xec\x016\x00\xe4\xff\xec\x01\ +6\x00\xe5\xff\xec\x016\x00\xfa\xff\xec\x016\x01\x06\xff\ +\xec\x016\x01\x08\xff\xec\x016\x01\x0d\xff\xec\x016\x01\ +\x0e\xff\xec\x016\x01\x0f\xff\xd7\x016\x01\x10\xff\xec\x01\ +6\x01\x11\xff\xd7\x016\x01\x12\xff\xec\x016\x01\x13\xff\ +\xd7\x016\x01\x14\xff\xec\x016\x01\x15\xff\xd7\x016\x01\ +\x17\xff\xec\x016\x01\x19\xff\xec\x016\x01\x1d\xff\xec\x01\ +6\x01!\xff\xec\x016\x01+\xff\xec\x016\x01-\xff\ +\xec\x016\x01/\xff\xec\x016\x011\xff\xec\x016\x01\ +3\xff\xec\x016\x015\xff\xec\x016\x01C\xff\xae\x01\ +6\x01D\xff\xd7\x016\x01F\xff\xd7\x016\x01G\xff\ +\xec\x016\x01H\xff\xd7\x016\x01J\xff\xec\x016\x02\ +\x08\xff\x9a\x016\x02\x0c\xff\x9a\x016\x02W\xff\xec\x01\ +6\x02X\xff\xae\x016\x02Y\xff\xd7\x016\x02_\xff\ +\xec\x016\x02`\xff\xd7\x016\x02b\xff\xec\x016\x03\ +\x1d\xff\xae\x016\x03\x1e\xff\xd7\x016\x03\x1f\xff\xae\x01\ +6\x03 \xff\xd7\x016\x03!\xff\xae\x016\x03\x22\xff\ +\xd7\x016\x03#\xff\xae\x016\x03%\xff\xae\x016\x03\ +&\xff\xd7\x016\x03'\xff\xae\x016\x03(\xff\xd7\x01\ +6\x03)\xff\xae\x016\x03*\xff\xd7\x016\x03+\xff\ +\xae\x016\x03,\xff\xd7\x016\x03-\xff\xae\x016\x03\ +.\xff\xd7\x016\x03/\xff\xae\x016\x030\xff\xd7\x01\ +6\x031\xff\xae\x016\x032\xff\xd7\x016\x033\xff\ +\xae\x016\x034\xff\xd7\x016\x036\xff\xd7\x016\x03\ +8\xff\xd7\x016\x03:\xff\xd7\x016\x03<\xff\xd7\x01\ +6\x03@\xff\xd7\x016\x03B\xff\xd7\x016\x03D\xff\ +\xd7\x016\x03I\xff\xec\x016\x03J\xff\xd7\x016\x03\ +K\xff\xec\x016\x03L\xff\xd7\x016\x03M\xff\xec\x01\ +6\x03N\xff\xd7\x016\x03O\xff\xec\x016\x03Q\xff\ +\xec\x016\x03R\xff\xd7\x016\x03S\xff\xec\x016\x03\ +T\xff\xd7\x016\x03U\xff\xec\x016\x03V\xff\xd7\x01\ +6\x03W\xff\xec\x016\x03X\xff\xd7\x016\x03Y\xff\ +\xec\x016\x03Z\xff\xd7\x016\x03[\xff\xec\x016\x03\ +\x5c\xff\xd7\x016\x03]\xff\xec\x016\x03^\xff\xd7\x01\ +6\x03_\xff\xec\x016\x03`\xff\xd7\x016\x03b\xff\ +\xec\x016\x03d\xff\xec\x016\x03f\xff\xec\x016\x03\ +h\xff\xec\x016\x03j\xff\xec\x016\x03l\xff\xec\x01\ +6\x03n\xff\xec\x017\x00\x05\x00R\x017\x00\x0a\x00\ +R\x017\x00\x0f\xff\xae\x017\x00\x11\xff\xae\x017\x00\ +\x22\x00)\x017\x02\x07\x00R\x017\x02\x08\xff\xae\x01\ +7\x02\x0b\x00R\x017\x02\x0c\xff\xae\x018\x00\x0f\xff\ +\x85\x018\x00\x11\xff\x85\x018\x00\x22\x00)\x018\x00\ +$\xff\x85\x018\x00&\xff\xd7\x018\x00*\xff\xd7\x01\ +8\x002\xff\xd7\x018\x004\xff\xd7\x018\x00D\xff\ +\x9a\x018\x00F\xff\x9a\x018\x00G\xff\x9a\x018\x00\ +H\xff\x9a\x018\x00J\xff\xd7\x018\x00P\xff\xc3\x01\ +8\x00Q\xff\xc3\x018\x00R\xff\x9a\x018\x00S\xff\ +\xc3\x018\x00T\xff\x9a\x018\x00U\xff\xc3\x018\x00\ +V\xff\xae\x018\x00X\xff\xc3\x018\x00]\xff\xd7\x01\ +8\x00\x82\xff\x85\x018\x00\x83\xff\x85\x018\x00\x84\xff\ +\x85\x018\x00\x85\xff\x85\x018\x00\x86\xff\x85\x018\x00\ +\x87\xff\x85\x018\x00\x89\xff\xd7\x018\x00\x94\xff\xd7\x01\ +8\x00\x95\xff\xd7\x018\x00\x96\xff\xd7\x018\x00\x97\xff\ +\xd7\x018\x00\x98\xff\xd7\x018\x00\x9a\xff\xd7\x018\x00\ +\xa2\xff\x9a\x018\x00\xa3\xff\x9a\x018\x00\xa4\xff\x9a\x01\ +8\x00\xa5\xff\x9a\x018\x00\xa6\xff\x9a\x018\x00\xa7\xff\ +\x9a\x018\x00\xa8\xff\x9a\x018\x00\xa9\xff\x9a\x018\x00\ +\xaa\xff\x9a\x018\x00\xab\xff\x9a\x018\x00\xac\xff\x9a\x01\ +8\x00\xad\xff\x9a\x018\x00\xb4\xff\x9a\x018\x00\xb5\xff\ +\x9a\x018\x00\xb6\xff\x9a\x018\x00\xb7\xff\x9a\x018\x00\ +\xb8\xff\x9a\x018\x00\xba\xff\x9a\x018\x00\xbb\xff\xc3\x01\ +8\x00\xbc\xff\xc3\x018\x00\xbd\xff\xc3\x018\x00\xbe\xff\ +\xc3\x018\x00\xc2\xff\x85\x018\x00\xc3\xff\x9a\x018\x00\ +\xc4\xff\x85\x018\x00\xc5\xff\x9a\x018\x00\xc6\xff\x85\x01\ +8\x00\xc7\xff\x9a\x018\x00\xc8\xff\xd7\x018\x00\xc9\xff\ +\x9a\x018\x00\xca\xff\xd7\x018\x00\xcb\xff\x9a\x018\x00\ +\xcc\xff\xd7\x018\x00\xcd\xff\x9a\x018\x00\xce\xff\xd7\x01\ +8\x00\xcf\xff\x9a\x018\x00\xd1\xff\x9a\x018\x00\xd3\xff\ +\x9a\x018\x00\xd5\xff\x9a\x018\x00\xd7\xff\x9a\x018\x00\ +\xd9\xff\x9a\x018\x00\xdb\xff\x9a\x018\x00\xdd\xff\x9a\x01\ +8\x00\xde\xff\xd7\x018\x00\xdf\xff\xd7\x018\x00\xe0\xff\ +\xd7\x018\x00\xe1\xff\xd7\x018\x00\xe2\xff\xd7\x018\x00\ +\xe3\xff\xd7\x018\x00\xe4\xff\xd7\x018\x00\xe5\xff\xd7\x01\ +8\x00\xfa\xff\xc3\x018\x01\x06\xff\xc3\x018\x01\x08\xff\ +\xc3\x018\x01\x0d\xff\xc3\x018\x01\x0e\xff\xd7\x018\x01\ +\x0f\xff\x9a\x018\x01\x10\xff\xd7\x018\x01\x11\xff\x9a\x01\ +8\x01\x12\xff\xd7\x018\x01\x13\xff\x9a\x018\x01\x14\xff\ +\xd7\x018\x01\x15\xff\x9a\x018\x01\x17\xff\xc3\x018\x01\ +\x19\xff\xc3\x018\x01\x1d\xff\xae\x018\x01!\xff\xae\x01\ +8\x01+\xff\xc3\x018\x01-\xff\xc3\x018\x01/\xff\ +\xc3\x018\x011\xff\xc3\x018\x013\xff\xc3\x018\x01\ +5\xff\xc3\x018\x01<\xff\xd7\x018\x01>\xff\xd7\x01\ +8\x01@\xff\xd7\x018\x01C\xff\x85\x018\x01D\xff\ +\x9a\x018\x01F\xff\x9a\x018\x01G\xff\xd7\x018\x01\ +H\xff\x9a\x018\x01J\xff\xae\x018\x02\x08\xff\x85\x01\ +8\x02\x0c\xff\x85\x018\x02W\xff\xc3\x018\x02X\xff\ +\x85\x018\x02Y\xff\x9a\x018\x02_\xff\xd7\x018\x02\ +`\xff\x9a\x018\x02b\xff\xc3\x018\x03\x1d\xff\x85\x01\ +8\x03\x1e\xff\x9a\x018\x03\x1f\xff\x85\x018\x03 \xff\ +\x9a\x018\x03!\xff\x85\x018\x03\x22\xff\x9a\x018\x03\ +#\xff\x85\x018\x03%\xff\x85\x018\x03&\xff\x9a\x01\ +8\x03'\xff\x85\x018\x03(\xff\x9a\x018\x03)\xff\ +\x85\x018\x03*\xff\x9a\x018\x03+\xff\x85\x018\x03\ +,\xff\x9a\x018\x03-\xff\x85\x018\x03.\xff\x9a\x01\ +8\x03/\xff\x85\x018\x030\xff\x9a\x018\x031\xff\ +\x85\x018\x032\xff\x9a\x018\x033\xff\x85\x018\x03\ +4\xff\x9a\x018\x036\xff\x9a\x018\x038\xff\x9a\x01\ +8\x03:\xff\x9a\x018\x03<\xff\x9a\x018\x03@\xff\ +\x9a\x018\x03B\xff\x9a\x018\x03D\xff\x9a\x018\x03\ +I\xff\xd7\x018\x03J\xff\x9a\x018\x03K\xff\xd7\x01\ +8\x03L\xff\x9a\x018\x03M\xff\xd7\x018\x03N\xff\ +\x9a\x018\x03O\xff\xd7\x018\x03Q\xff\xd7\x018\x03\ +R\xff\x9a\x018\x03S\xff\xd7\x018\x03T\xff\x9a\x01\ +8\x03U\xff\xd7\x018\x03V\xff\x9a\x018\x03W\xff\ +\xd7\x018\x03X\xff\x9a\x018\x03Y\xff\xd7\x018\x03\ +Z\xff\x9a\x018\x03[\xff\xd7\x018\x03\x5c\xff\x9a\x01\ +8\x03]\xff\xd7\x018\x03^\xff\x9a\x018\x03_\xff\ +\xd7\x018\x03`\xff\x9a\x018\x03b\xff\xc3\x018\x03\ +d\xff\xc3\x018\x03f\xff\xc3\x018\x03h\xff\xc3\x01\ +8\x03j\xff\xc3\x018\x03l\xff\xc3\x018\x03n\xff\ +\xc3\x019\x00\x05\x00R\x019\x00\x0a\x00R\x019\x00\ +\x0f\xff\xae\x019\x00\x11\xff\xae\x019\x00\x22\x00)\x01\ +9\x02\x07\x00R\x019\x02\x08\xff\xae\x019\x02\x0b\x00\ +R\x019\x02\x0c\xff\xae\x01:\x00\x0f\xff\x85\x01:\x00\ +\x11\xff\x85\x01:\x00\x22\x00)\x01:\x00$\xff\x85\x01\ +:\x00&\xff\xd7\x01:\x00*\xff\xd7\x01:\x002\xff\ +\xd7\x01:\x004\xff\xd7\x01:\x00D\xff\x9a\x01:\x00\ +F\xff\x9a\x01:\x00G\xff\x9a\x01:\x00H\xff\x9a\x01\ +:\x00J\xff\xd7\x01:\x00P\xff\xc3\x01:\x00Q\xff\ +\xc3\x01:\x00R\xff\x9a\x01:\x00S\xff\xc3\x01:\x00\ +T\xff\x9a\x01:\x00U\xff\xc3\x01:\x00V\xff\xae\x01\ +:\x00X\xff\xc3\x01:\x00]\xff\xd7\x01:\x00\x82\xff\ +\x85\x01:\x00\x83\xff\x85\x01:\x00\x84\xff\x85\x01:\x00\ +\x85\xff\x85\x01:\x00\x86\xff\x85\x01:\x00\x87\xff\x85\x01\ +:\x00\x89\xff\xd7\x01:\x00\x94\xff\xd7\x01:\x00\x95\xff\ +\xd7\x01:\x00\x96\xff\xd7\x01:\x00\x97\xff\xd7\x01:\x00\ +\x98\xff\xd7\x01:\x00\x9a\xff\xd7\x01:\x00\xa2\xff\x9a\x01\ +:\x00\xa3\xff\x9a\x01:\x00\xa4\xff\x9a\x01:\x00\xa5\xff\ +\x9a\x01:\x00\xa6\xff\x9a\x01:\x00\xa7\xff\x9a\x01:\x00\ +\xa8\xff\x9a\x01:\x00\xa9\xff\x9a\x01:\x00\xaa\xff\x9a\x01\ +:\x00\xab\xff\x9a\x01:\x00\xac\xff\x9a\x01:\x00\xad\xff\ +\x9a\x01:\x00\xb4\xff\x9a\x01:\x00\xb5\xff\x9a\x01:\x00\ +\xb6\xff\x9a\x01:\x00\xb7\xff\x9a\x01:\x00\xb8\xff\x9a\x01\ +:\x00\xba\xff\x9a\x01:\x00\xbb\xff\xc3\x01:\x00\xbc\xff\ +\xc3\x01:\x00\xbd\xff\xc3\x01:\x00\xbe\xff\xc3\x01:\x00\ +\xc2\xff\x85\x01:\x00\xc3\xff\x9a\x01:\x00\xc4\xff\x85\x01\ +:\x00\xc5\xff\x9a\x01:\x00\xc6\xff\x85\x01:\x00\xc7\xff\ +\x9a\x01:\x00\xc8\xff\xd7\x01:\x00\xc9\xff\x9a\x01:\x00\ +\xca\xff\xd7\x01:\x00\xcb\xff\x9a\x01:\x00\xcc\xff\xd7\x01\ +:\x00\xcd\xff\x9a\x01:\x00\xce\xff\xd7\x01:\x00\xcf\xff\ +\x9a\x01:\x00\xd1\xff\x9a\x01:\x00\xd3\xff\x9a\x01:\x00\ +\xd5\xff\x9a\x01:\x00\xd7\xff\x9a\x01:\x00\xd9\xff\x9a\x01\ +:\x00\xdb\xff\x9a\x01:\x00\xdd\xff\x9a\x01:\x00\xde\xff\ +\xd7\x01:\x00\xdf\xff\xd7\x01:\x00\xe0\xff\xd7\x01:\x00\ +\xe1\xff\xd7\x01:\x00\xe2\xff\xd7\x01:\x00\xe3\xff\xd7\x01\ +:\x00\xe4\xff\xd7\x01:\x00\xe5\xff\xd7\x01:\x00\xfa\xff\ +\xc3\x01:\x01\x06\xff\xc3\x01:\x01\x08\xff\xc3\x01:\x01\ +\x0d\xff\xc3\x01:\x01\x0e\xff\xd7\x01:\x01\x0f\xff\x9a\x01\ +:\x01\x10\xff\xd7\x01:\x01\x11\xff\x9a\x01:\x01\x12\xff\ +\xd7\x01:\x01\x13\xff\x9a\x01:\x01\x14\xff\xd7\x01:\x01\ +\x15\xff\x9a\x01:\x01\x17\xff\xc3\x01:\x01\x19\xff\xc3\x01\ +:\x01\x1d\xff\xae\x01:\x01!\xff\xae\x01:\x01+\xff\ +\xc3\x01:\x01-\xff\xc3\x01:\x01/\xff\xc3\x01:\x01\ +1\xff\xc3\x01:\x013\xff\xc3\x01:\x015\xff\xc3\x01\ +:\x01<\xff\xd7\x01:\x01>\xff\xd7\x01:\x01@\xff\ +\xd7\x01:\x01C\xff\x85\x01:\x01D\xff\x9a\x01:\x01\ +F\xff\x9a\x01:\x01G\xff\xd7\x01:\x01H\xff\x9a\x01\ +:\x01J\xff\xae\x01:\x02\x08\xff\x85\x01:\x02\x0c\xff\ +\x85\x01:\x02W\xff\xc3\x01:\x02X\xff\x85\x01:\x02\ +Y\xff\x9a\x01:\x02_\xff\xd7\x01:\x02`\xff\x9a\x01\ +:\x02b\xff\xc3\x01:\x03\x1d\xff\x85\x01:\x03\x1e\xff\ +\x9a\x01:\x03\x1f\xff\x85\x01:\x03 \xff\x9a\x01:\x03\ +!\xff\x85\x01:\x03\x22\xff\x9a\x01:\x03#\xff\x85\x01\ +:\x03%\xff\x85\x01:\x03&\xff\x9a\x01:\x03'\xff\ +\x85\x01:\x03(\xff\x9a\x01:\x03)\xff\x85\x01:\x03\ +*\xff\x9a\x01:\x03+\xff\x85\x01:\x03,\xff\x9a\x01\ +:\x03-\xff\x85\x01:\x03.\xff\x9a\x01:\x03/\xff\ +\x85\x01:\x030\xff\x9a\x01:\x031\xff\x85\x01:\x03\ +2\xff\x9a\x01:\x033\xff\x85\x01:\x034\xff\x9a\x01\ +:\x036\xff\x9a\x01:\x038\xff\x9a\x01:\x03:\xff\ +\x9a\x01:\x03<\xff\x9a\x01:\x03@\xff\x9a\x01:\x03\ +B\xff\x9a\x01:\x03D\xff\x9a\x01:\x03I\xff\xd7\x01\ +:\x03J\xff\x9a\x01:\x03K\xff\xd7\x01:\x03L\xff\ +\x9a\x01:\x03M\xff\xd7\x01:\x03N\xff\x9a\x01:\x03\ +O\xff\xd7\x01:\x03Q\xff\xd7\x01:\x03R\xff\x9a\x01\ +:\x03S\xff\xd7\x01:\x03T\xff\x9a\x01:\x03U\xff\ +\xd7\x01:\x03V\xff\x9a\x01:\x03W\xff\xd7\x01:\x03\ +X\xff\x9a\x01:\x03Y\xff\xd7\x01:\x03Z\xff\x9a\x01\ +:\x03[\xff\xd7\x01:\x03\x5c\xff\x9a\x01:\x03]\xff\ +\xd7\x01:\x03^\xff\x9a\x01:\x03_\xff\xd7\x01:\x03\ +`\xff\x9a\x01:\x03b\xff\xc3\x01:\x03d\xff\xc3\x01\ +:\x03f\xff\xc3\x01:\x03h\xff\xc3\x01:\x03j\xff\ +\xc3\x01:\x03l\xff\xc3\x01:\x03n\xff\xc3\x01;\x00\ +&\xff\xec\x01;\x00*\xff\xec\x01;\x002\xff\xec\x01\ +;\x004\xff\xec\x01;\x00\x89\xff\xec\x01;\x00\x94\xff\ +\xec\x01;\x00\x95\xff\xec\x01;\x00\x96\xff\xec\x01;\x00\ +\x97\xff\xec\x01;\x00\x98\xff\xec\x01;\x00\x9a\xff\xec\x01\ +;\x00\xc8\xff\xec\x01;\x00\xca\xff\xec\x01;\x00\xcc\xff\ +\xec\x01;\x00\xce\xff\xec\x01;\x00\xde\xff\xec\x01;\x00\ +\xe0\xff\xec\x01;\x00\xe2\xff\xec\x01;\x00\xe4\xff\xec\x01\ +;\x01\x0e\xff\xec\x01;\x01\x10\xff\xec\x01;\x01\x12\xff\ +\xec\x01;\x01\x14\xff\xec\x01;\x01G\xff\xec\x01;\x02\ +_\xff\xec\x01;\x03I\xff\xec\x01;\x03K\xff\xec\x01\ +;\x03M\xff\xec\x01;\x03O\xff\xec\x01;\x03Q\xff\ +\xec\x01;\x03S\xff\xec\x01;\x03U\xff\xec\x01;\x03\ +W\xff\xec\x01;\x03Y\xff\xec\x01;\x03[\xff\xec\x01\ +;\x03]\xff\xec\x01;\x03_\xff\xec\x01=\x00&\xff\ +\xec\x01=\x00*\xff\xec\x01=\x002\xff\xec\x01=\x00\ +4\xff\xec\x01=\x00\x89\xff\xec\x01=\x00\x94\xff\xec\x01\ +=\x00\x95\xff\xec\x01=\x00\x96\xff\xec\x01=\x00\x97\xff\ +\xec\x01=\x00\x98\xff\xec\x01=\x00\x9a\xff\xec\x01=\x00\ +\xc8\xff\xec\x01=\x00\xca\xff\xec\x01=\x00\xcc\xff\xec\x01\ +=\x00\xce\xff\xec\x01=\x00\xde\xff\xec\x01=\x00\xe0\xff\ +\xec\x01=\x00\xe2\xff\xec\x01=\x00\xe4\xff\xec\x01=\x01\ +\x0e\xff\xec\x01=\x01\x10\xff\xec\x01=\x01\x12\xff\xec\x01\ +=\x01\x14\xff\xec\x01=\x01G\xff\xec\x01=\x02_\xff\ +\xec\x01=\x03I\xff\xec\x01=\x03K\xff\xec\x01=\x03\ +M\xff\xec\x01=\x03O\xff\xec\x01=\x03Q\xff\xec\x01\ +=\x03S\xff\xec\x01=\x03U\xff\xec\x01=\x03W\xff\ +\xec\x01=\x03Y\xff\xec\x01=\x03[\xff\xec\x01=\x03\ +]\xff\xec\x01=\x03_\xff\xec\x01?\x00&\xff\xec\x01\ +?\x00*\xff\xec\x01?\x002\xff\xec\x01?\x004\xff\ +\xec\x01?\x00\x89\xff\xec\x01?\x00\x94\xff\xec\x01?\x00\ +\x95\xff\xec\x01?\x00\x96\xff\xec\x01?\x00\x97\xff\xec\x01\ +?\x00\x98\xff\xec\x01?\x00\x9a\xff\xec\x01?\x00\xc8\xff\ +\xec\x01?\x00\xca\xff\xec\x01?\x00\xcc\xff\xec\x01?\x00\ +\xce\xff\xec\x01?\x00\xde\xff\xec\x01?\x00\xe0\xff\xec\x01\ +?\x00\xe2\xff\xec\x01?\x00\xe4\xff\xec\x01?\x01\x0e\xff\ +\xec\x01?\x01\x10\xff\xec\x01?\x01\x12\xff\xec\x01?\x01\ +\x14\xff\xec\x01?\x01G\xff\xec\x01?\x02_\xff\xec\x01\ +?\x03I\xff\xec\x01?\x03K\xff\xec\x01?\x03M\xff\ +\xec\x01?\x03O\xff\xec\x01?\x03Q\xff\xec\x01?\x03\ +S\xff\xec\x01?\x03U\xff\xec\x01?\x03W\xff\xec\x01\ +?\x03Y\xff\xec\x01?\x03[\xff\xec\x01?\x03]\xff\ +\xec\x01?\x03_\xff\xec\x01C\x00\x05\xffq\x01C\x00\ +\x0a\xffq\x01C\x00&\xff\xd7\x01C\x00*\xff\xd7\x01\ +C\x00-\x01\x0a\x01C\x002\xff\xd7\x01C\x004\xff\ +\xd7\x01C\x007\xffq\x01C\x009\xff\xae\x01C\x00\ +:\xff\xae\x01C\x00<\xff\x85\x01C\x00\x89\xff\xd7\x01\ +C\x00\x94\xff\xd7\x01C\x00\x95\xff\xd7\x01C\x00\x96\xff\ +\xd7\x01C\x00\x97\xff\xd7\x01C\x00\x98\xff\xd7\x01C\x00\ +\x9a\xff\xd7\x01C\x00\x9f\xff\x85\x01C\x00\xc8\xff\xd7\x01\ +C\x00\xca\xff\xd7\x01C\x00\xcc\xff\xd7\x01C\x00\xce\xff\ +\xd7\x01C\x00\xde\xff\xd7\x01C\x00\xe0\xff\xd7\x01C\x00\ +\xe2\xff\xd7\x01C\x00\xe4\xff\xd7\x01C\x01\x0e\xff\xd7\x01\ +C\x01\x10\xff\xd7\x01C\x01\x12\xff\xd7\x01C\x01\x14\xff\ +\xd7\x01C\x01$\xffq\x01C\x01&\xffq\x01C\x01\ +6\xff\xae\x01C\x018\xff\x85\x01C\x01:\xff\x85\x01\ +C\x01G\xff\xd7\x01C\x01\xfa\xff\xae\x01C\x01\xfc\xff\ +\xae\x01C\x01\xfe\xff\xae\x01C\x02\x00\xff\x85\x01C\x02\ +\x07\xffq\x01C\x02\x0b\xffq\x01C\x02_\xff\xd7\x01\ +C\x03I\xff\xd7\x01C\x03K\xff\xd7\x01C\x03M\xff\ +\xd7\x01C\x03O\xff\xd7\x01C\x03Q\xff\xd7\x01C\x03\ +S\xff\xd7\x01C\x03U\xff\xd7\x01C\x03W\xff\xd7\x01\ +C\x03Y\xff\xd7\x01C\x03[\xff\xd7\x01C\x03]\xff\ +\xd7\x01C\x03_\xff\xd7\x01C\x03o\xff\x85\x01C\x03\ +q\xff\x85\x01C\x03s\xff\x85\x01C\x03\x8f\xffq\x01\ +D\x00\x05\xff\xec\x01D\x00\x0a\xff\xec\x01D\x02\x07\xff\ +\xec\x01D\x02\x0b\xff\xec\x01E\x00-\x00{\x01G\x00\ +\x0f\xff\xae\x01G\x00\x11\xff\xae\x01G\x00$\xff\xd7\x01\ +G\x007\xff\xc3\x01G\x009\xff\xec\x01G\x00:\xff\ +\xec\x01G\x00;\xff\xd7\x01G\x00<\xff\xec\x01G\x00\ +=\xff\xec\x01G\x00\x82\xff\xd7\x01G\x00\x83\xff\xd7\x01\ +G\x00\x84\xff\xd7\x01G\x00\x85\xff\xd7\x01G\x00\x86\xff\ +\xd7\x01G\x00\x87\xff\xd7\x01G\x00\x9f\xff\xec\x01G\x00\ +\xc2\xff\xd7\x01G\x00\xc4\xff\xd7\x01G\x00\xc6\xff\xd7\x01\ +G\x01$\xff\xc3\x01G\x01&\xff\xc3\x01G\x016\xff\ +\xec\x01G\x018\xff\xec\x01G\x01:\xff\xec\x01G\x01\ +;\xff\xec\x01G\x01=\xff\xec\x01G\x01?\xff\xec\x01\ +G\x01C\xff\xd7\x01G\x01\xa0\xff\xec\x01G\x01\xfa\xff\ +\xec\x01G\x01\xfc\xff\xec\x01G\x01\xfe\xff\xec\x01G\x02\ +\x00\xff\xec\x01G\x02\x08\xff\xae\x01G\x02\x0c\xff\xae\x01\ +G\x02X\xff\xd7\x01G\x03\x1d\xff\xd7\x01G\x03\x1f\xff\ +\xd7\x01G\x03!\xff\xd7\x01G\x03#\xff\xd7\x01G\x03\ +%\xff\xd7\x01G\x03'\xff\xd7\x01G\x03)\xff\xd7\x01\ +G\x03+\xff\xd7\x01G\x03-\xff\xd7\x01G\x03/\xff\ +\xd7\x01G\x031\xff\xd7\x01G\x033\xff\xd7\x01G\x03\ +o\xff\xec\x01G\x03q\xff\xec\x01G\x03s\xff\xec\x01\ +G\x03\x8f\xff\xc3\x01V\x00\x05\xffq\x01V\x00\x0a\xff\ +q\x01V\x01f\xff\xd7\x01V\x01m\xff\xd7\x01V\x01\ +q\xffq\x01V\x01r\xff\x85\x01V\x01s\xff\xd7\x01\ +V\x01u\xff\xae\x01V\x01x\xff\x85\x01V\x02\x07\xff\ +q\x01V\x02\x0b\xffq\x01V\x02T\xff\x85\x01[\x00\ +\x0f\xff\xae\x01[\x00\x11\xff\xae\x01[\x01V\xff\xd7\x01\ +[\x01_\xff\xd7\x01[\x01b\xff\xd7\x01[\x01d\xff\ +\xec\x01[\x01i\xff\xd7\x01[\x01p\xff\xec\x01[\x01\ +q\xff\xc3\x01[\x01r\xff\xec\x01[\x01t\xff\xd7\x01\ +[\x01u\xff\xec\x01[\x01x\xff\xec\x01[\x01\x88\xff\ +\xec\x01[\x02\x08\xff\xae\x01[\x02\x0c\xff\xae\x01[\x02\ +T\xff\xec\x01\x5c\x00\x0f\xff\x85\x01\x5c\x00\x11\xff\x85\x01\ +\x5c\x01V\xff\x85\x01\x5c\x01_\xff\x85\x01\x5c\x01b\xff\ +\x85\x01\x5c\x01f\xff\xd7\x01\x5c\x01i\xff\x85\x01\x5c\x01\ +m\xff\xd7\x01\x5c\x01s\xff\xc3\x01\x5c\x01v\xff\xec\x01\ +\x5c\x01y\xff\x9a\x01\x5c\x01z\xff\xae\x01\x5c\x01{\xff\ +\xc3\x01\x5c\x01|\xff\xc3\x01\x5c\x01}\xff\xc3\x01\x5c\x01\ +~\xff\x9a\x01\x5c\x01\x81\xff\xc3\x01\x5c\x01\x82\xff\xae\x01\ +\x5c\x01\x84\xff\xc3\x01\x5c\x01\x86\xff\xc3\x01\x5c\x01\x87\xff\ +\xc3\x01\x5c\x01\x89\xff\xc3\x01\x5c\x01\x8c\xff\x9a\x01\x5c\x01\ +\x8e\xff\x9a\x01\x5c\x01\x8f\xff\x9a\x01\x5c\x01\x90\xff\x9a\x01\ +\x5c\x01\x92\xff\xc3\x01\x5c\x01\x93\xff\x9a\x01\x5c\x01\x95\xff\ +\xc3\x01\x5c\x01\x96\xff\xc3\x01\x5c\x01\x98\xff\xc3\x01\x5c\x01\ +\x99\xff\x9a\x01\x5c\x01\x9a\xff\xc3\x01\x5c\x01\x9b\xff\xc3\x01\ +\x5c\x02\x08\xff\x85\x01\x5c\x02\x0c\xff\x85\x01\x5c\x02!\xff\ +\xec\x01]\x01q\xff\xd7\x01]\x01r\xff\xec\x01]\x01\ +x\xff\xec\x01]\x02T\xff\xec\x01^\x00\x05\xff\xd7\x01\ +^\x00\x0a\xff\xd7\x01^\x02\x07\xff\xd7\x01^\x02\x0b\xff\ +\xd7\x01_\x00\x05\xffq\x01_\x00\x0a\xffq\x01_\x01\ +f\xff\xd7\x01_\x01m\xff\xd7\x01_\x01q\xffq\x01\ +_\x01r\xff\x85\x01_\x01s\xff\xd7\x01_\x01u\xff\ +\xae\x01_\x01x\xff\x85\x01_\x02\x07\xffq\x01_\x02\ +\x0b\xffq\x01_\x02T\xff\x85\x01`\x00\x0f\xff\xae\x01\ +`\x00\x11\xff\xae\x01`\x01V\xff\xd7\x01`\x01_\xff\ +\xd7\x01`\x01b\xff\xd7\x01`\x01i\xff\xd7\x01`\x01\ +t\xff\xd7\x01`\x02\x08\xff\xae\x01`\x02\x0c\xff\xae\x01\ +a\x00\x0f\xff\x85\x01a\x00\x10\xff\xae\x01a\x00\x11\xff\ +\x85\x01a\x01V\xff\x5c\x01a\x01_\xff\x5c\x01a\x01\ +b\xff\x5c\x01a\x01f\xff\xc3\x01a\x01i\xff\x5c\x01\ +a\x01m\xff\xc3\x01a\x01s\xff\x9a\x01a\x01v\xff\ +\xc3\x01a\x01y\xffq\x01a\x01z\xff\x9a\x01a\x01\ +{\xff\x9a\x01a\x01|\xff\xae\x01a\x01}\xff\x9a\x01\ +a\x01~\xffq\x01a\x01\x80\xff\xd7\x01a\x01\x81\xff\ +\xc3\x01a\x01\x82\xff\x9a\x01a\x01\x84\xff\x9a\x01a\x01\ +\x86\xff\xae\x01a\x01\x87\xff\x9a\x01a\x01\x89\xff\x9a\x01\ +a\x01\x8a\xff\xd7\x01a\x01\x8c\xffq\x01a\x01\x8e\xff\ +\x9a\x01a\x01\x8f\xffq\x01a\x01\x90\xffq\x01a\x01\ +\x92\xff\x9a\x01a\x01\x93\xffq\x01a\x01\x94\xff\xd7\x01\ +a\x01\x95\xff\x9a\x01a\x01\x96\xff\x9a\x01a\x01\x98\xff\ +\x9a\x01a\x01\x99\xffq\x01a\x01\x9a\xff\x9a\x01a\x01\ +\x9b\xff\x9a\x01a\x02\x02\xff\xae\x01a\x02\x03\xff\xae\x01\ +a\x02\x04\xff\xae\x01a\x02\x08\xff\x85\x01a\x02\x0c\xff\ +\x85\x01a\x02!\xff\xc3\x01a\x02S\xff\xd7\x01b\x00\ +\x05\xffq\x01b\x00\x0a\xffq\x01b\x01f\xff\xd7\x01\ +b\x01m\xff\xd7\x01b\x01q\xffq\x01b\x01r\xff\ +\x85\x01b\x01s\xff\xd7\x01b\x01u\xff\xae\x01b\x01\ +x\xff\x85\x01b\x02\x07\xffq\x01b\x02\x0b\xffq\x01\ +b\x02T\xff\x85\x01d\x01f\xff\xec\x01d\x01m\xff\ +\xec\x01d\x01s\xff\xc3\x01f\x00\x0f\xff\xae\x01f\x00\ +\x11\xff\xae\x01f\x01V\xff\xd7\x01f\x01_\xff\xd7\x01\ +f\x01b\xff\xd7\x01f\x01d\xff\xec\x01f\x01i\xff\ +\xd7\x01f\x01p\xff\xec\x01f\x01q\xff\xc3\x01f\x01\ +r\xff\xec\x01f\x01t\xff\xd7\x01f\x01u\xff\xec\x01\ +f\x01x\xff\xec\x01f\x01\x88\xff\xec\x01f\x02\x08\xff\ +\xae\x01f\x02\x0c\xff\xae\x01f\x02T\xff\xec\x01h\x01\ +f\xff\xd7\x01h\x01m\xff\xd7\x01h\x01s\xff\xc3\x01\ +h\x01\x8d\xff\xec\x01h\x01\x91\xff\xec\x01i\x00\x05\xff\ +q\x01i\x00\x0a\xffq\x01i\x01f\xff\xd7\x01i\x01\ +m\xff\xd7\x01i\x01q\xffq\x01i\x01r\xff\x85\x01\ +i\x01s\xff\xd7\x01i\x01u\xff\xae\x01i\x01x\xff\ +\x85\x01i\x02\x07\xffq\x01i\x02\x0b\xffq\x01i\x02\ +T\xff\x85\x01m\x00\x0f\xff\xae\x01m\x00\x11\xff\xae\x01\ +m\x01V\xff\xd7\x01m\x01_\xff\xd7\x01m\x01b\xff\ +\xd7\x01m\x01d\xff\xec\x01m\x01i\xff\xd7\x01m\x01\ +p\xff\xec\x01m\x01q\xff\xc3\x01m\x01r\xff\xec\x01\ +m\x01t\xff\xd7\x01m\x01u\xff\xec\x01m\x01x\xff\ +\xec\x01m\x01\x88\xff\xec\x01m\x02\x08\xff\xae\x01m\x02\ +\x0c\xff\xae\x01m\x02T\xff\xec\x01o\x00\x0f\xfe\xf6\x01\ +o\x00\x11\xfe\xf6\x01o\x01V\xff\x9a\x01o\x01_\xff\ +\x9a\x01o\x01b\xff\x9a\x01o\x01d\xff\xec\x01o\x01\ +i\xff\x9a\x01o\x01t\xff\xd7\x01o\x01\x88\xff\xd7\x01\ +o\x02\x08\xfe\xf6\x01o\x02\x0c\xfe\xf6\x01q\x00\x0f\xff\ +\x85\x01q\x00\x10\xff\xae\x01q\x00\x11\xff\x85\x01q\x01\ +V\xff\x5c\x01q\x01_\xff\x5c\x01q\x01b\xff\x5c\x01\ +q\x01f\xff\xc3\x01q\x01i\xff\x5c\x01q\x01m\xff\ +\xc3\x01q\x01s\xff\x9a\x01q\x01v\xff\xc3\x01q\x01\ +y\xffq\x01q\x01z\xff\x9a\x01q\x01{\xff\x9a\x01\ +q\x01|\xff\xae\x01q\x01}\xff\x9a\x01q\x01~\xff\ +q\x01q\x01\x80\xff\xd7\x01q\x01\x81\xff\xc3\x01q\x01\ +\x82\xff\x9a\x01q\x01\x84\xff\x9a\x01q\x01\x86\xff\xae\x01\ +q\x01\x87\xff\x9a\x01q\x01\x89\xff\x9a\x01q\x01\x8a\xff\ +\xd7\x01q\x01\x8c\xffq\x01q\x01\x8e\xff\x9a\x01q\x01\ +\x8f\xffq\x01q\x01\x90\xffq\x01q\x01\x92\xff\x9a\x01\ +q\x01\x93\xffq\x01q\x01\x94\xff\xd7\x01q\x01\x95\xff\ +\x9a\x01q\x01\x96\xff\x9a\x01q\x01\x98\xff\x9a\x01q\x01\ +\x99\xffq\x01q\x01\x9a\xff\x9a\x01q\x01\x9b\xff\x9a\x01\ +q\x02\x02\xff\xae\x01q\x02\x03\xff\xae\x01q\x02\x04\xff\ +\xae\x01q\x02\x08\xff\x85\x01q\x02\x0c\xff\x85\x01q\x02\ +!\xff\xc3\x01q\x02S\xff\xd7\x01r\x00\x0f\xff\x85\x01\ +r\x00\x11\xff\x85\x01r\x01V\xff\x85\x01r\x01_\xff\ +\x85\x01r\x01b\xff\x85\x01r\x01f\xff\xd7\x01r\x01\ +i\xff\x85\x01r\x01m\xff\xd7\x01r\x01s\xff\xc3\x01\ +r\x01v\xff\xec\x01r\x01y\xff\x9a\x01r\x01z\xff\ +\xae\x01r\x01{\xff\xc3\x01r\x01|\xff\xc3\x01r\x01\ +}\xff\xc3\x01r\x01~\xff\x9a\x01r\x01\x81\xff\xc3\x01\ +r\x01\x82\xff\xae\x01r\x01\x84\xff\xc3\x01r\x01\x86\xff\ +\xc3\x01r\x01\x87\xff\xc3\x01r\x01\x89\xff\xc3\x01r\x01\ +\x8c\xff\x9a\x01r\x01\x8e\xff\x9a\x01r\x01\x8f\xff\x9a\x01\ +r\x01\x90\xff\x9a\x01r\x01\x92\xff\xc3\x01r\x01\x93\xff\ +\x9a\x01r\x01\x95\xff\xc3\x01r\x01\x96\xff\xc3\x01r\x01\ +\x98\xff\xc3\x01r\x01\x99\xff\x9a\x01r\x01\x9a\xff\xc3\x01\ +r\x01\x9b\xff\xc3\x01r\x02\x08\xff\x85\x01r\x02\x0c\xff\ +\x85\x01r\x02!\xff\xec\x01s\x00\x0f\xff\x9a\x01s\x00\ +\x11\xff\x9a\x01s\x01V\xff\xd7\x01s\x01_\xff\xd7\x01\ +s\x01b\xff\xd7\x01s\x01d\xff\xc3\x01s\x01i\xff\ +\xd7\x01s\x01p\xff\xec\x01s\x01q\xff\xae\x01s\x01\ +r\xff\xc3\x01s\x01t\xff\xec\x01s\x01x\xff\xc3\x01\ +s\x01\x88\xff\xec\x01s\x02\x08\xff\x9a\x01s\x02\x0c\xff\ +\x9a\x01s\x02T\xff\xc3\x01t\x01f\xff\xd7\x01t\x01\ +m\xff\xd7\x01t\x01s\xff\xc3\x01t\x01\x8d\xff\xec\x01\ +t\x01\x91\xff\xec\x01u\x00\x0f\xff\x85\x01u\x00\x11\xff\ +\x85\x01u\x01V\xff\xae\x01u\x01_\xff\xae\x01u\x01\ +b\xff\xae\x01u\x01f\xff\xec\x01u\x01i\xff\xae\x01\ +u\x01m\xff\xec\x01u\x02\x08\xff\x85\x01u\x02\x0c\xff\ +\x85\x01v\x01q\xff\xd7\x01v\x01r\xff\xec\x01v\x01\ +x\xff\xec\x01v\x02T\xff\xec\x01x\x00\x0f\xff\x85\x01\ +x\x00\x11\xff\x85\x01x\x01V\xff\x85\x01x\x01_\xff\ +\x85\x01x\x01b\xff\x85\x01x\x01f\xff\xd7\x01x\x01\ +i\xff\x85\x01x\x01m\xff\xd7\x01x\x01s\xff\xc3\x01\ +x\x01v\xff\xec\x01x\x01y\xff\x9a\x01x\x01z\xff\ +\xae\x01x\x01{\xff\xc3\x01x\x01|\xff\xc3\x01x\x01\ +}\xff\xc3\x01x\x01~\xff\x9a\x01x\x01\x81\xff\xc3\x01\ +x\x01\x82\xff\xae\x01x\x01\x84\xff\xc3\x01x\x01\x86\xff\ +\xc3\x01x\x01\x87\xff\xc3\x01x\x01\x89\xff\xc3\x01x\x01\ +\x8c\xff\x9a\x01x\x01\x8e\xff\x9a\x01x\x01\x8f\xff\x9a\x01\ +x\x01\x90\xff\x9a\x01x\x01\x92\xff\xc3\x01x\x01\x93\xff\ +\x9a\x01x\x01\x95\xff\xc3\x01x\x01\x96\xff\xc3\x01x\x01\ +\x98\xff\xc3\x01x\x01\x99\xff\x9a\x01x\x01\x9a\xff\xc3\x01\ +x\x01\x9b\xff\xc3\x01x\x02\x08\xff\x85\x01x\x02\x0c\xff\ +\x85\x01x\x02!\xff\xec\x01y\x01\x88\x00)\x01{\x00\ +\x05\xff\xec\x01{\x00\x0a\xff\xec\x01{\x02\x07\xff\xec\x01\ +{\x02\x0b\xff\xec\x01|\x00\x05\xff\xae\x01|\x00\x0a\xff\ +\xae\x01|\x01\x8d\xff\xec\x01|\x01\x91\xff\xec\x01|\x02\ +\x07\xff\xae\x01|\x02\x0b\xff\xae\x01~\x01\x88\x00)\x01\ +\x80\x00\x0f\xff\xae\x01\x80\x00\x11\xff\xae\x01\x80\x01\x88\xff\ +\xec\x01\x80\x02\x08\xff\xae\x01\x80\x02\x0c\xff\xae\x01\x83\x00\ +\x10\xff\x9a\x01\x83\x01y\xff\xd7\x01\x83\x01~\xff\xd7\x01\ +\x83\x01\x81\xff\xd7\x01\x83\x01\x8c\xff\xd7\x01\x83\x01\x8d\xff\ +\xd7\x01\x83\x01\x8f\xff\xd7\x01\x83\x01\x90\xff\xd7\x01\x83\x01\ +\x91\xff\xd7\x01\x83\x01\x93\xff\xd7\x01\x83\x01\x99\xff\xd7\x01\ +\x83\x02\x02\xff\x9a\x01\x83\x02\x03\xff\x9a\x01\x83\x02\x04\xff\ +\x9a\x01\x84\x00\x05\xff\xec\x01\x84\x00\x0a\xff\xec\x01\x84\x02\ +\x07\xff\xec\x01\x84\x02\x0b\xff\xec\x01\x85\x00\x0f\xff\xd7\x01\ +\x85\x00\x11\xff\xd7\x01\x85\x02\x08\xff\xd7\x01\x85\x02\x0c\xff\ +\xd7\x01\x86\x00\x05\xff\xae\x01\x86\x00\x0a\xff\xae\x01\x86\x01\ +\x8d\xff\xec\x01\x86\x01\x91\xff\xec\x01\x86\x02\x07\xff\xae\x01\ +\x86\x02\x0b\xff\xae\x01\x87\x01y\xff\xd7\x01\x87\x01~\xff\ +\xd7\x01\x87\x01\x8c\xff\xd7\x01\x87\x01\x8f\xff\xd7\x01\x87\x01\ +\x90\xff\xd7\x01\x87\x01\x93\xff\xd7\x01\x87\x01\x99\xff\xd7\x01\ +\x88\x00\x05\xff\x85\x01\x88\x00\x0a\xff\x85\x01\x88\x01y\xff\ +\xec\x01\x88\x01~\xff\xec\x01\x88\x01\x80\xff\xd7\x01\x88\x01\ +\x8a\xff\xd7\x01\x88\x01\x8c\xff\xec\x01\x88\x01\x8d\xff\xd7\x01\ +\x88\x01\x8f\xff\xec\x01\x88\x01\x90\xff\xec\x01\x88\x01\x91\xff\ +\xd7\x01\x88\x01\x93\xff\xec\x01\x88\x01\x99\xff\xec\x01\x88\x02\ +\x07\xff\x85\x01\x88\x02\x0b\xff\x85\x01\x8a\x00\x0f\xff\xae\x01\ +\x8a\x00\x11\xff\xae\x01\x8a\x01\x88\xff\xec\x01\x8a\x02\x08\xff\ +\xae\x01\x8a\x02\x0c\xff\xae\x01\x8c\x00\x05\xff\xec\x01\x8c\x00\ +\x0a\xff\xec\x01\x8c\x01\x80\xff\xd7\x01\x8c\x01\x8a\xff\xd7\x01\ +\x8c\x02\x07\xff\xec\x01\x8c\x02\x0b\xff\xec\x01\x8e\x00\x05\xff\ +\xec\x01\x8e\x00\x0a\xff\xec\x01\x8e\x01\x80\xff\xd7\x01\x8e\x01\ +\x8a\xff\xd7\x01\x8e\x02\x07\xff\xec\x01\x8e\x02\x0b\xff\xec\x01\ +\x90\x00\x0f\xff\xec\x01\x90\x00\x11\xff\xec\x01\x90\x02\x08\xff\ +\xec\x01\x90\x02\x0c\xff\xec\x01\x93\x00\x05\xff\xec\x01\x93\x00\ +\x0a\xff\xec\x01\x93\x01\x80\xff\xd7\x01\x93\x01\x8a\xff\xd7\x01\ +\x93\x02\x07\xff\xec\x01\x93\x02\x0b\xff\xec\x01\x94\x00\x0f\xff\ +\xc3\x01\x94\x00\x10\xff\xd7\x01\x94\x00\x11\xff\xc3\x01\x94\x01\ +y\xff\xd7\x01\x94\x01~\xff\xd7\x01\x94\x01\x81\xff\xd7\x01\ +\x94\x01\x8c\xff\xd7\x01\x94\x01\x8f\xff\xd7\x01\x94\x01\x90\xff\ +\xd7\x01\x94\x01\x93\xff\xd7\x01\x94\x01\x99\xff\xd7\x01\x94\x02\ +\x02\xff\xd7\x01\x94\x02\x03\xff\xd7\x01\x94\x02\x04\xff\xd7\x01\ +\x94\x02\x08\xff\xc3\x01\x94\x02\x0c\xff\xc3\x01\x97\x00\x05\xff\ +\xd7\x01\x97\x00\x0a\xff\xd7\x01\x97\x02\x07\xff\xd7\x01\x97\x02\ +\x0b\xff\xd7\x01\x99\x00\x05\xff\xec\x01\x99\x00\x0a\xff\xec\x01\ +\x99\x01\x80\xff\xd7\x01\x99\x01\x8a\xff\xd7\x01\x99\x02\x07\xff\ +\xec\x01\x99\x02\x0b\xff\xec\x01\x9d\x00\x05\xff\xae\x01\x9d\x00\ +\x0a\xff\xae\x01\x9d\x01\x9d\xff\x85\x01\x9d\x01\xa6\xff\x85\x01\ +\x9d\x01\xa8\xff\xd7\x01\x9d\x01\xbc\xff\x9a\x01\x9d\x01\xbd\xff\ +\xd7\x01\x9d\x01\xc1\xff\x9a\x01\x9d\x01\xc4\xff\x85\x01\x9d\x01\ +\xdc\xff\xd7\x01\x9d\x01\xdd\xff\xd7\x01\x9d\x01\xe1\xff\xd7\x01\ +\x9d\x01\xe4\xff\xd7\x01\x9d\x01\xf6\xff\xd7\x01\x9d\x02\x07\xff\ +\xae\x01\x9d\x02\x0b\xff\xae\x01\x9d\x02n\xff\xae\x01\x9d\x02\ +|\xff\x9a\x01\x9d\x02\x80\xff\xae\x01\x9d\x02\x82\xff\xae\x01\ +\x9d\x02\x97\xff\xae\x01\x9d\x02\x9b\xff\xae\x01\x9d\x02\xa7\xff\ +\xae\x01\x9d\x02\xa9\xff\x85\x01\x9d\x02\xaa\xff\xd7\x01\x9d\x02\ +\xb5\xff\x9a\x01\x9d\x02\xb6\xff\xd7\x01\x9d\x02\xb7\xff\x9a\x01\ +\x9d\x02\xb8\xff\xd7\x01\x9d\x02\xb9\xff\x9a\x01\x9d\x02\xba\xff\ +\xd7\x01\x9d\x02\xbd\xff\x85\x01\x9d\x02\xbe\xff\xd7\x01\x9d\x02\ +\xbf\xff\x9a\x01\x9d\x02\xc0\xff\xd7\x01\x9d\x02\xc1\xff\x9a\x01\ +\x9d\x02\xc2\xff\xd7\x01\x9d\x02\xd4\xff\x9a\x01\x9d\x02\xd5\xff\ +\xd7\x01\x9d\x02\xf7\xff\xd7\x01\x9d\x02\xf8\xff\xd7\x01\x9d\x02\ +\xf9\xff\xd7\x01\x9d\x02\xfa\xff\xd7\x01\x9d\x02\xfb\xff\xd7\x01\ +\x9d\x02\xfc\xff\xd7\x01\x9d\x02\xfd\xff\x9a\x01\x9d\x02\xfe\xff\ +\xd7\x01\x9d\x03\x03\xff\xae\x01\x9d\x03\x0d\xff\x9a\x01\x9d\x03\ +\x0e\xff\xc3\x01\x9d\x03\x0f\xff\x9a\x01\x9d\x03\x10\xff\xc3\x01\ +\x9d\x03\x17\xff\x85\x01\x9d\x03\x18\xff\xd7\x01\x9e\x00\x0f\xff\ +\x85\x01\x9e\x00\x10\xff\xae\x01\x9e\x00\x11\xff\x85\x01\x9e\x01\ +\x9f\xff\xd7\x01\x9e\x01\xa4\xff\x9a\x01\x9e\x01\xaa\xffq\x01\ +\x9e\x01\xae\xff\x9a\x01\x9e\x01\xb5\xff\x9a\x01\x9e\x01\xb8\xff\ +\xd7\x01\x9e\x01\xbb\xff\xd7\x01\x9e\x01\xbc\x00)\x01\x9e\x01\ +\xbe\xff\xae\x01\x9e\x01\xcc\xff\x9a\x01\x9e\x01\xcd\xff\x9a\x01\ +\x9e\x01\xce\xff\x85\x01\x9e\x01\xcf\xffq\x01\x9e\x01\xd0\xff\ +\xd7\x01\x9e\x01\xd1\xff\xd7\x01\x9e\x01\xd2\xff\x9a\x01\x9e\x01\ +\xd3\xff\x9a\x01\x9e\x01\xd4\xff\x9a\x01\x9e\x01\xd5\xff\x85\x01\ +\x9e\x01\xd6\xff\x9a\x01\x9e\x01\xd7\xff\x9a\x01\x9e\x01\xd8\xff\ +q\x01\x9e\x01\xd9\xff\x9a\x01\x9e\x01\xda\xff\x9a\x01\x9e\x01\ +\xdb\xffq\x01\x9e\x01\xdc\xff\xae\x01\x9e\x01\xdd\xff\xae\x01\ +\x9e\x01\xde\xffq\x01\x9e\x01\xdf\xff\xd7\x01\x9e\x01\xe0\xff\ +\x9a\x01\x9e\x01\xe1\xff\x9a\x01\x9e\x01\xe2\xff\x9a\x01\x9e\x01\ +\xe3\xff\x9a\x01\x9e\x01\xe4\xff\xae\x01\x9e\x01\xe5\xff\x9a\x01\ +\x9e\x01\xe6\xff\x9a\x01\x9e\x01\xe7\xff\xd7\x01\x9e\x01\xe8\xff\ +\x9a\x01\x9e\x01\xe9\xff\xc3\x01\x9e\x01\xea\xffq\x01\x9e\x01\ +\xec\xff\x9a\x01\x9e\x01\xed\xffq\x01\x9e\x01\xee\xff\x85\x01\ +\x9e\x01\xf2\xff\x85\x01\x9e\x01\xf3\xff\x9a\x01\x9e\x01\xf5\xff\ +\x9a\x01\x9e\x01\xf6\xff\xae\x01\x9e\x01\xf7\xff\x9a\x01\x9e\x01\ +\xf9\xff\x9a\x01\x9e\x02\x02\xff\xae\x01\x9e\x02\x03\xff\xae\x01\ +\x9e\x02\x04\xff\xae\x01\x9e\x02\x08\xff\x85\x01\x9e\x02\x0c\xff\ +\x85\x01\x9e\x02j\xffq\x01\x9e\x02k\xff\x9a\x01\x9e\x02\ +l\xff\xd7\x01\x9e\x02m\xff\xd7\x01\x9e\x02q\xff\x9a\x01\ +\x9e\x02r\xffq\x01\x9e\x02s\xff\x85\x01\x9e\x02u\xff\ +\x9a\x01\x9e\x02w\xff\x9a\x01\x9e\x02y\xff\x9a\x01\x9e\x02\ +}\xff\x9a\x01\x9e\x02~\xff\xd7\x01\x9e\x02\x7f\xffq\x01\ +\x9e\x02\x81\xff\xd7\x01\x9e\x02\x83\xff\xd7\x01\x9e\x02\x84\xff\ +\xd7\x01\x9e\x02\x85\xffq\x01\x9e\x02\x86\xff\xd7\x01\x9e\x02\ +\x87\xffq\x01\x9e\x02\x88\xff\xd7\x01\x9e\x02\x89\xffq\x01\ +\x9e\x02\x8a\xff\xd7\x01\x9e\x02\x8b\xff\xd7\x01\x9e\x02\x8c\xff\ +\xd7\x01\x9e\x02\x8d\xffq\x01\x9e\x02\x96\xff\x9a\x01\x9e\x02\ +\x9a\xff\x9a\x01\x9e\x02\x9e\xff\x9a\x01\x9e\x02\xa0\xff\xd7\x01\ +\x9e\x02\xa2\xff\xd7\x01\x9e\x02\xa4\xff\x9a\x01\x9e\x02\xa6\xff\ +\x9a\x01\x9e\x02\xaa\xff\xae\x01\x9e\x02\xac\xff\x9a\x01\x9e\x02\ +\xae\xff\x9a\x01\x9e\x02\xb0\xff\x9a\x01\x9e\x02\xb1\xff\xd7\x01\ +\x9e\x02\xb2\xffq\x01\x9e\x02\xb3\xff\xd7\x01\x9e\x02\xb4\xff\ +q\x01\x9e\x02\xb5\x00)\x01\x9e\x02\xb6\xff\xae\x01\x9e\x02\ +\xb8\xff\xae\x01\x9e\x02\xba\xff\xae\x01\x9e\x02\xbc\xff\xd7\x01\ +\x9e\x02\xbe\xff\xae\x01\x9e\x02\xc0\xff\x9a\x01\x9e\x02\xc2\xff\ +\x9a\x01\x9e\x02\xc4\xff\x9a\x01\x9e\x02\xc5\xff\x9a\x01\x9e\x02\ +\xc6\xffq\x01\x9e\x02\xc7\xff\x9a\x01\x9e\x02\xc8\xffq\x01\ +\x9e\x02\xcb\xff\xd7\x01\x9e\x02\xcd\xff\x9a\x01\x9e\x02\xce\xff\ +\x9a\x01\x9e\x02\xcf\xff\x85\x01\x9e\x02\xd1\xff\x9a\x01\x9e\x02\ +\xd3\xff\x9a\x01\x9e\x02\xd5\xff\x9a\x01\x9e\x02\xd7\xff\x9a\x01\ +\x9e\x02\xd9\xffq\x01\x9e\x02\xdb\xffq\x01\x9e\x02\xdd\xff\ +q\x01\x9e\x02\xe0\xffq\x01\x9e\x02\xe6\xff\xd7\x01\x9e\x02\ +\xe8\xff\xd7\x01\x9e\x02\xea\xff\xc3\x01\x9e\x02\xec\xff\x9a\x01\ +\x9e\x02\xee\xff\x9a\x01\x9e\x02\xef\xff\xd7\x01\x9e\x02\xf0\xff\ +q\x01\x9e\x02\xf1\xff\xd7\x01\x9e\x02\xf2\xffq\x01\x9e\x02\ +\xf3\xff\xd7\x01\x9e\x02\xf4\xffq\x01\x9e\x02\xf6\xff\xd7\x01\ +\x9e\x02\xf8\xff\xae\x01\x9e\x02\xfa\xff\xae\x01\x9e\x02\xfc\xff\ +\xae\x01\x9e\x02\xfe\xff\x9a\x01\x9e\x03\x00\xff\x9a\x01\x9e\x03\ +\x02\xff\x9a\x01\x9e\x03\x06\xff\xd7\x01\x9e\x03\x08\xff\xd7\x01\ +\x9e\x03\x09\xffq\x01\x9e\x03\x0a\xffq\x01\x9e\x03\x0b\xff\ +q\x01\x9e\x03\x0c\xffq\x01\x9e\x03\x0e\xff\x9a\x01\x9e\x03\ +\x10\xff\x9a\x01\x9e\x03\x11\xff\x9a\x01\x9e\x03\x12\xff\x85\x01\ +\x9e\x03\x14\xff\x9a\x01\x9e\x03\x15\xff\xd7\x01\x9e\x03\x16\xff\ +q\x01\x9e\x03\x18\xff\xae\x01\x9e\x03\x1a\xffq\x01\x9e\x03\ +\x1b\xff\x9a\x01\x9e\x03\x1c\xff\x85\x01\x9f\x01\x9f\xff\xd7\x01\ +\x9f\x01\xb8\xff\xd7\x01\x9f\x01\xbb\xff\xd7\x01\x9f\x01\xbe\xff\ +\xd7\x01\x9f\x01\xe1\xff\xd7\x01\x9f\x02l\xff\xd7\x01\x9f\x02\ +~\xff\xd7\x01\x9f\x02\x84\xff\xd7\x01\x9f\x02\x86\xff\xd7\x01\ +\x9f\x02\x88\xff\xd7\x01\x9f\x02\x8a\xff\xd7\x01\x9f\x02\x8c\xff\ +\xd7\x01\x9f\x02\xb1\xff\xd7\x01\x9f\x02\xb3\xff\xd7\x01\x9f\x02\ +\xc0\xff\xd7\x01\x9f\x02\xc2\xff\xd7\x01\x9f\x02\xc5\xff\xd7\x01\ +\x9f\x02\xc7\xff\xd7\x01\x9f\x02\xd5\xff\xd7\x01\x9f\x02\xef\xff\ +\xd7\x01\x9f\x02\xf1\xff\xd7\x01\x9f\x02\xf3\xff\xd7\x01\x9f\x02\ +\xfe\xff\xd7\x01\x9f\x03\x09\xff\xd7\x01\x9f\x03\x0b\xff\xd7\x01\ +\x9f\x03\x0e\xff\xd7\x01\x9f\x03\x10\xff\xd7\x01\x9f\x03\x15\xff\ +\xd7\x01\xa0\x03\x0e\xff\xd7\x01\xa0\x03\x10\xff\xd7\x01\xa4\x00\ +\x05\xff\xae\x01\xa4\x00\x0a\xff\xae\x01\xa4\x01\x9d\xff\x85\x01\ +\xa4\x01\xa6\xff\x85\x01\xa4\x01\xa8\xff\xd7\x01\xa4\x01\xbc\xff\ +\x9a\x01\xa4\x01\xbd\xff\xd7\x01\xa4\x01\xc1\xff\x9a\x01\xa4\x01\ +\xc4\xff\x85\x01\xa4\x01\xdc\xff\xd7\x01\xa4\x01\xdd\xff\xd7\x01\ +\xa4\x01\xe1\xff\xd7\x01\xa4\x01\xe4\xff\xd7\x01\xa4\x01\xf6\xff\ +\xd7\x01\xa4\x02\x07\xff\xae\x01\xa4\x02\x0b\xff\xae\x01\xa4\x02\ +n\xff\xae\x01\xa4\x02|\xff\x9a\x01\xa4\x02\x80\xff\xae\x01\ +\xa4\x02\x82\xff\xae\x01\xa4\x02\x97\xff\xae\x01\xa4\x02\x9b\xff\ +\xae\x01\xa4\x02\xa7\xff\xae\x01\xa4\x02\xa9\xff\x85\x01\xa4\x02\ +\xaa\xff\xd7\x01\xa4\x02\xb5\xff\x9a\x01\xa4\x02\xb6\xff\xd7\x01\ +\xa4\x02\xb7\xff\x9a\x01\xa4\x02\xb8\xff\xd7\x01\xa4\x02\xb9\xff\ +\x9a\x01\xa4\x02\xba\xff\xd7\x01\xa4\x02\xbd\xff\x85\x01\xa4\x02\ +\xbe\xff\xd7\x01\xa4\x02\xbf\xff\x9a\x01\xa4\x02\xc0\xff\xd7\x01\ +\xa4\x02\xc1\xff\x9a\x01\xa4\x02\xc2\xff\xd7\x01\xa4\x02\xd4\xff\ +\x9a\x01\xa4\x02\xd5\xff\xd7\x01\xa4\x02\xf7\xff\xd7\x01\xa4\x02\ +\xf8\xff\xd7\x01\xa4\x02\xf9\xff\xd7\x01\xa4\x02\xfa\xff\xd7\x01\ +\xa4\x02\xfb\xff\xd7\x01\xa4\x02\xfc\xff\xd7\x01\xa4\x02\xfd\xff\ +\x9a\x01\xa4\x02\xfe\xff\xd7\x01\xa4\x03\x03\xff\xae\x01\xa4\x03\ +\x0d\xff\x9a\x01\xa4\x03\x0e\xff\xc3\x01\xa4\x03\x0f\xff\x9a\x01\ +\xa4\x03\x10\xff\xc3\x01\xa4\x03\x17\xff\x85\x01\xa4\x03\x18\xff\ +\xd7\x01\xa5\x00\x05\xff\xae\x01\xa5\x00\x0a\xff\xae\x01\xa5\x01\ +\x9d\xff\x85\x01\xa5\x01\xa6\xff\x85\x01\xa5\x01\xa8\xff\xd7\x01\ +\xa5\x01\xbc\xff\x9a\x01\xa5\x01\xbd\xff\xd7\x01\xa5\x01\xc1\xff\ +\x9a\x01\xa5\x01\xc4\xff\x85\x01\xa5\x01\xdc\xff\xd7\x01\xa5\x01\ +\xdd\xff\xd7\x01\xa5\x01\xe1\xff\xd7\x01\xa5\x01\xe4\xff\xd7\x01\ +\xa5\x01\xf6\xff\xd7\x01\xa5\x02\x07\xff\xae\x01\xa5\x02\x0b\xff\ +\xae\x01\xa5\x02n\xff\xae\x01\xa5\x02|\xff\x9a\x01\xa5\x02\ +\x80\xff\xae\x01\xa5\x02\x82\xff\xae\x01\xa5\x02\x97\xff\xae\x01\ +\xa5\x02\x9b\xff\xae\x01\xa5\x02\xa7\xff\xae\x01\xa5\x02\xa9\xff\ +\x85\x01\xa5\x02\xaa\xff\xd7\x01\xa5\x02\xb5\xff\x9a\x01\xa5\x02\ +\xb6\xff\xd7\x01\xa5\x02\xb7\xff\x9a\x01\xa5\x02\xb8\xff\xd7\x01\ +\xa5\x02\xb9\xff\x9a\x01\xa5\x02\xba\xff\xd7\x01\xa5\x02\xbd\xff\ +\x85\x01\xa5\x02\xbe\xff\xd7\x01\xa5\x02\xbf\xff\x9a\x01\xa5\x02\ +\xc0\xff\xd7\x01\xa5\x02\xc1\xff\x9a\x01\xa5\x02\xc2\xff\xd7\x01\ +\xa5\x02\xd4\xff\x9a\x01\xa5\x02\xd5\xff\xd7\x01\xa5\x02\xf7\xff\ +\xd7\x01\xa5\x02\xf8\xff\xd7\x01\xa5\x02\xf9\xff\xd7\x01\xa5\x02\ +\xfa\xff\xd7\x01\xa5\x02\xfb\xff\xd7\x01\xa5\x02\xfc\xff\xd7\x01\ +\xa5\x02\xfd\xff\x9a\x01\xa5\x02\xfe\xff\xd7\x01\xa5\x03\x03\xff\ +\xae\x01\xa5\x03\x0d\xff\x9a\x01\xa5\x03\x0e\xff\xc3\x01\xa5\x03\ +\x0f\xff\x9a\x01\xa5\x03\x10\xff\xc3\x01\xa5\x03\x17\xff\x85\x01\ +\xa5\x03\x18\xff\xd7\x01\xa6\x00\x05\xff\xae\x01\xa6\x00\x0a\xff\ +\xae\x01\xa6\x01\x9d\xff\x85\x01\xa6\x01\xa6\xff\x85\x01\xa6\x01\ +\xa8\xff\xd7\x01\xa6\x01\xbc\xff\x9a\x01\xa6\x01\xbd\xff\xd7\x01\ +\xa6\x01\xc1\xff\x9a\x01\xa6\x01\xc4\xff\x85\x01\xa6\x01\xdc\xff\ +\xd7\x01\xa6\x01\xdd\xff\xd7\x01\xa6\x01\xe1\xff\xd7\x01\xa6\x01\ +\xe4\xff\xd7\x01\xa6\x01\xf6\xff\xd7\x01\xa6\x02\x07\xff\xae\x01\ +\xa6\x02\x0b\xff\xae\x01\xa6\x02n\xff\xae\x01\xa6\x02|\xff\ +\x9a\x01\xa6\x02\x80\xff\xae\x01\xa6\x02\x82\xff\xae\x01\xa6\x02\ +\x97\xff\xae\x01\xa6\x02\x9b\xff\xae\x01\xa6\x02\xa7\xff\xae\x01\ +\xa6\x02\xa9\xff\x85\x01\xa6\x02\xaa\xff\xd7\x01\xa6\x02\xb5\xff\ +\x9a\x01\xa6\x02\xb6\xff\xd7\x01\xa6\x02\xb7\xff\x9a\x01\xa6\x02\ +\xb8\xff\xd7\x01\xa6\x02\xb9\xff\x9a\x01\xa6\x02\xba\xff\xd7\x01\ +\xa6\x02\xbd\xff\x85\x01\xa6\x02\xbe\xff\xd7\x01\xa6\x02\xbf\xff\ +\x9a\x01\xa6\x02\xc0\xff\xd7\x01\xa6\x02\xc1\xff\x9a\x01\xa6\x02\ +\xc2\xff\xd7\x01\xa6\x02\xd4\xff\x9a\x01\xa6\x02\xd5\xff\xd7\x01\ +\xa6\x02\xf7\xff\xd7\x01\xa6\x02\xf8\xff\xd7\x01\xa6\x02\xf9\xff\ +\xd7\x01\xa6\x02\xfa\xff\xd7\x01\xa6\x02\xfb\xff\xd7\x01\xa6\x02\ +\xfc\xff\xd7\x01\xa6\x02\xfd\xff\x9a\x01\xa6\x02\xfe\xff\xd7\x01\ +\xa6\x03\x03\xff\xae\x01\xa6\x03\x0d\xff\x9a\x01\xa6\x03\x0e\xff\ +\xc3\x01\xa6\x03\x0f\xff\x9a\x01\xa6\x03\x10\xff\xc3\x01\xa6\x03\ +\x17\xff\x85\x01\xa6\x03\x18\xff\xd7\x01\xa7\x01\x9f\xff\xd7\x01\ +\xa7\x01\xb8\xff\xd7\x01\xa7\x01\xbb\xff\xd7\x01\xa7\x01\xbe\xff\ +\xd7\x01\xa7\x01\xc1\xff\xd7\x01\xa7\x01\xe1\xff\xd7\x01\xa7\x02\ +l\xff\xd7\x01\xa7\x02|\xff\xd7\x01\xa7\x02~\xff\xd7\x01\ +\xa7\x02\x84\xff\xd7\x01\xa7\x02\x86\xff\xd7\x01\xa7\x02\x88\xff\ +\xd7\x01\xa7\x02\x8a\xff\xd7\x01\xa7\x02\x8c\xff\xd7\x01\xa7\x02\ +\xb1\xff\xd7\x01\xa7\x02\xb3\xff\xd7\x01\xa7\x02\xbf\xff\xd7\x01\ +\xa7\x02\xc0\xff\xd7\x01\xa7\x02\xc1\xff\xd7\x01\xa7\x02\xc2\xff\ +\xd7\x01\xa7\x02\xc5\xff\x9a\x01\xa7\x02\xc7\xff\x9a\x01\xa7\x02\ +\xd4\xff\xd7\x01\xa7\x02\xd5\xff\xd7\x01\xa7\x02\xef\xff\xd7\x01\ +\xa7\x02\xf1\xff\xd7\x01\xa7\x02\xf3\xff\xd7\x01\xa7\x02\xfd\xff\ +\xd7\x01\xa7\x02\xfe\xff\xd7\x01\xa7\x03\x09\xff\xd7\x01\xa7\x03\ +\x0b\xff\xd7\x01\xa7\x03\x0e\xff\xd7\x01\xa7\x03\x10\xff\xd7\x01\ +\xa7\x03\x15\xff\xd7\x01\xa7\x03\x19\xff\xec\x01\xa8\x00\x0f\xff\ +\x85\x01\xa8\x00\x11\xff\x85\x01\xa8\x01\x9f\xff\xec\x01\xa8\x01\ +\xa4\xff\x9a\x01\xa8\x01\xaa\xffq\x01\xa8\x01\xae\xff\x9a\x01\ +\xa8\x01\xb5\xff\x9a\x01\xa8\x01\xb8\xff\xec\x01\xa8\x01\xbb\xff\ +\xec\x01\xa8\x01\xbe\xff\xc3\x01\xa8\x01\xc9\xff\xec\x01\xa8\x01\ +\xce\xff\xae\x01\xa8\x01\xcf\xff\xd7\x01\xa8\x01\xd5\xff\xae\x01\ +\xa8\x01\xd8\xff\xd7\x01\xa8\x01\xdb\xff\xd7\x01\xa8\x01\xde\xff\ +\xd7\x01\xa8\x01\xe1\xff\xd7\x01\xa8\x01\xea\xff\xd7\x01\xa8\x01\ +\xeb\x00f\x01\xa8\x01\xed\xff\xd7\x01\xa8\x01\xee\xff\xec\x01\ +\xa8\x01\xf2\xff\xae\x01\xa8\x01\xf4\x00f\x01\xa8\x02\x08\xff\ +\x85\x01\xa8\x02\x0c\xff\x85\x01\xa8\x02j\xff\xd7\x01\xa8\x02\ +l\xff\xec\x01\xa8\x02r\xffq\x01\xa8\x02s\xff\xae\x01\ +\xa8\x02~\xff\xec\x01\xa8\x02\x7f\xff\xd7\x01\xa8\x02\x84\xff\ +\xec\x01\xa8\x02\x85\xff\xd7\x01\xa8\x02\x86\xff\xec\x01\xa8\x02\ +\x87\xff\xd7\x01\xa8\x02\x88\xff\xec\x01\xa8\x02\x89\xff\xd7\x01\ +\xa8\x02\x8a\xff\xec\x01\xa8\x02\x8c\xff\xec\x01\xa8\x02\x8d\xff\ +\xd7\x01\xa8\x02\x98\x00f\x01\xa8\x02\xa8\x00f\x01\xa8\x02\ +\xb1\xff\xec\x01\xa8\x02\xb2\xff\xd7\x01\xa8\x02\xb3\xff\xec\x01\ +\xa8\x02\xb4\xff\xd7\x01\xa8\x02\xc0\xff\xd7\x01\xa8\x02\xc2\xff\ +\xd7\x01\xa8\x02\xc5\xff\xd7\x01\xa8\x02\xc6\xff\xc3\x01\xa8\x02\ +\xc7\xff\xd7\x01\xa8\x02\xc8\xff\xc3\x01\xa8\x02\xce\xff\x9a\x01\ +\xa8\x02\xcf\xff\xae\x01\xa8\x02\xd5\xff\xd7\x01\xa8\x02\xd9\xff\ +q\x01\xa8\x02\xdb\xffq\x01\xa8\x02\xdd\xffq\x01\xa8\x02\ +\xe0\xff\xd7\x01\xa8\x02\xef\xff\xec\x01\xa8\x02\xf0\xff\xd7\x01\ +\xa8\x02\xf1\xff\xec\x01\xa8\x02\xf2\xff\xd7\x01\xa8\x02\xf3\xff\ +\xec\x01\xa8\x02\xf4\xff\xd7\x01\xa8\x02\xfe\xff\xd7\x01\xa8\x03\ +\x09\xffq\x01\xa8\x03\x0a\xff\xd7\x01\xa8\x03\x0b\xffq\x01\ +\xa8\x03\x0c\xff\xd7\x01\xa8\x03\x11\xff\x9a\x01\xa8\x03\x12\xff\ +\xae\x01\xa8\x03\x15\xff\xec\x01\xa8\x03\x16\xff\xd7\x01\xa8\x03\ +\x1a\xff\xd7\x01\xa8\x03\x1b\xff\x9a\x01\xa8\x03\x1c\xff\xae\x01\ +\xaa\x00\x05\xffq\x01\xaa\x00\x0a\xffq\x01\xaa\x01\x9d\xff\ +\x9a\x01\xaa\x01\xa6\xff\x9a\x01\xaa\x01\xbc\xffq\x01\xaa\x01\ +\xbe\xff\xd7\x01\xaa\x01\xc1\xff\x9a\x01\xaa\x01\xc4\xff\x9a\x01\ +\xaa\x01\xdc\xff\xd7\x01\xaa\x01\xe1\xff\xd7\x01\xaa\x01\xe4\xff\ +\xd7\x01\xaa\x02\x07\xffq\x01\xaa\x02\x0b\xffq\x01\xaa\x02\ +n\xff\xd7\x01\xaa\x02|\xff\x9a\x01\xaa\x02\x80\xff\xae\x01\ +\xaa\x02\x82\xff\xae\x01\xaa\x02\x97\xff\xd7\x01\xaa\x02\x9b\xff\ +\xd7\x01\xaa\x02\xa7\xff\xd7\x01\xaa\x02\xa9\xff\x9a\x01\xaa\x02\ +\xaa\xff\xd7\x01\xaa\x02\xb5\xffq\x01\xaa\x02\xb6\xff\xd7\x01\ +\xaa\x02\xb7\xff\x85\x01\xaa\x02\xb9\xff\x85\x01\xaa\x02\xbd\xff\ +\x9a\x01\xaa\x02\xbe\xff\xd7\x01\xaa\x02\xbf\xff\x9a\x01\xaa\x02\ +\xc0\xff\xd7\x01\xaa\x02\xc1\xff\x9a\x01\xaa\x02\xc2\xff\xd7\x01\ +\xaa\x02\xc5\xff\x9a\x01\xaa\x02\xc7\xff\x9a\x01\xaa\x02\xd4\xff\ +\x9a\x01\xaa\x02\xd5\xff\xd7\x01\xaa\x02\xe1\xff\xd7\x01\xaa\x02\ +\xe3\xff\xd7\x01\xaa\x02\xfd\xff\x9a\x01\xaa\x02\xfe\xff\xd7\x01\ +\xaa\x03\x03\xff\xd7\x01\xaa\x03\x0d\xffq\x01\xaa\x03\x0e\xff\ +\xd7\x01\xaa\x03\x0f\xffq\x01\xaa\x03\x10\xff\xd7\x01\xaa\x03\ +\x17\xff\x9a\x01\xaa\x03\x18\xff\xd7\x01\xab\x00\x05\xff\xd7\x01\ +\xab\x00\x0a\xff\xd7\x01\xab\x01\xaa\xff\xec\x01\xab\x01\xc1\xff\ +\xd7\x01\xab\x02\x07\xff\xd7\x01\xab\x02\x0b\xff\xd7\x01\xab\x02\ +r\xff\xec\x01\xab\x02|\xff\xd7\x01\xab\x02\xbf\xff\xd7\x01\ +\xab\x02\xc1\xff\xd7\x01\xab\x02\xc5\xff\xd7\x01\xab\x02\xc7\xff\ +\xd7\x01\xab\x02\xd4\xff\xd7\x01\xab\x02\xd9\xff\xec\x01\xab\x02\ +\xdb\xff\xec\x01\xab\x02\xdd\xff\xec\x01\xab\x02\xfd\xff\xd7\x01\ +\xac\x00\x0f\xff\xae\x01\xac\x00\x11\xff\xae\x01\xac\x02\x08\xff\ +\xae\x01\xac\x02\x0c\xff\xae\x01\xac\x02\x80\xff\xec\x01\xac\x02\ +\x82\xff\xec\x01\xac\x02\xb7\xff\xec\x01\xac\x02\xb9\xff\xec\x01\ +\xac\x03\x0d\xff\xd7\x01\xac\x03\x0f\xff\xd7\x01\xad\x00\x0f\xff\ +\x85\x01\xad\x00\x10\xff\xae\x01\xad\x00\x11\xff\x85\x01\xad\x01\ +\x9f\xff\xd7\x01\xad\x01\xa4\xff\x9a\x01\xad\x01\xaa\xffq\x01\ +\xad\x01\xae\xff\x9a\x01\xad\x01\xb5\xff\x9a\x01\xad\x01\xb8\xff\ +\xd7\x01\xad\x01\xbb\xff\xd7\x01\xad\x01\xbc\x00)\x01\xad\x01\ +\xbe\xff\xae\x01\xad\x01\xcc\xff\x9a\x01\xad\x01\xcd\xff\x9a\x01\ +\xad\x01\xce\xff\x85\x01\xad\x01\xcf\xffq\x01\xad\x01\xd0\xff\ +\xd7\x01\xad\x01\xd1\xff\xd7\x01\xad\x01\xd2\xff\x9a\x01\xad\x01\ +\xd3\xff\x9a\x01\xad\x01\xd4\xff\x9a\x01\xad\x01\xd5\xff\x85\x01\ +\xad\x01\xd6\xff\x9a\x01\xad\x01\xd7\xff\x9a\x01\xad\x01\xd8\xff\ +q\x01\xad\x01\xd9\xff\x9a\x01\xad\x01\xda\xff\x9a\x01\xad\x01\ +\xdb\xffq\x01\xad\x01\xdc\xff\xae\x01\xad\x01\xdd\xff\xae\x01\ +\xad\x01\xde\xffq\x01\xad\x01\xdf\xff\xd7\x01\xad\x01\xe0\xff\ +\x9a\x01\xad\x01\xe1\xff\x9a\x01\xad\x01\xe2\xff\x9a\x01\xad\x01\ +\xe3\xff\x9a\x01\xad\x01\xe4\xff\xae\x01\xad\x01\xe5\xff\x9a\x01\ +\xad\x01\xe6\xff\x9a\x01\xad\x01\xe7\xff\xd7\x01\xad\x01\xe8\xff\ +\x9a\x01\xad\x01\xe9\xff\xc3\x01\xad\x01\xea\xffq\x01\xad\x01\ +\xec\xff\x9a\x01\xad\x01\xed\xffq\x01\xad\x01\xee\xff\x85\x01\ +\xad\x01\xf2\xff\x85\x01\xad\x01\xf3\xff\x9a\x01\xad\x01\xf5\xff\ +\x9a\x01\xad\x01\xf6\xff\xae\x01\xad\x01\xf7\xff\x9a\x01\xad\x01\ +\xf9\xff\x9a\x01\xad\x02\x02\xff\xae\x01\xad\x02\x03\xff\xae\x01\ +\xad\x02\x04\xff\xae\x01\xad\x02\x08\xff\x85\x01\xad\x02\x0c\xff\ +\x85\x01\xad\x02j\xffq\x01\xad\x02k\xff\x9a\x01\xad\x02\ +l\xff\xd7\x01\xad\x02m\xff\xd7\x01\xad\x02q\xff\x9a\x01\ +\xad\x02r\xffq\x01\xad\x02s\xff\x85\x01\xad\x02u\xff\ +\x9a\x01\xad\x02w\xff\x9a\x01\xad\x02y\xff\x9a\x01\xad\x02\ +}\xff\x9a\x01\xad\x02~\xff\xd7\x01\xad\x02\x7f\xffq\x01\ +\xad\x02\x81\xff\xd7\x01\xad\x02\x83\xff\xd7\x01\xad\x02\x84\xff\ +\xd7\x01\xad\x02\x85\xffq\x01\xad\x02\x86\xff\xd7\x01\xad\x02\ +\x87\xffq\x01\xad\x02\x88\xff\xd7\x01\xad\x02\x89\xffq\x01\ +\xad\x02\x8a\xff\xd7\x01\xad\x02\x8b\xff\xd7\x01\xad\x02\x8c\xff\ +\xd7\x01\xad\x02\x8d\xffq\x01\xad\x02\x96\xff\x9a\x01\xad\x02\ +\x9a\xff\x9a\x01\xad\x02\x9e\xff\x9a\x01\xad\x02\xa0\xff\xd7\x01\ +\xad\x02\xa2\xff\xd7\x01\xad\x02\xa4\xff\x9a\x01\xad\x02\xa6\xff\ +\x9a\x01\xad\x02\xaa\xff\xae\x01\xad\x02\xac\xff\x9a\x01\xad\x02\ +\xae\xff\x9a\x01\xad\x02\xb0\xff\x9a\x01\xad\x02\xb1\xff\xd7\x01\ +\xad\x02\xb2\xffq\x01\xad\x02\xb3\xff\xd7\x01\xad\x02\xb4\xff\ +q\x01\xad\x02\xb5\x00)\x01\xad\x02\xb6\xff\xae\x01\xad\x02\ +\xb8\xff\xae\x01\xad\x02\xba\xff\xae\x01\xad\x02\xbc\xff\xd7\x01\ +\xad\x02\xbe\xff\xae\x01\xad\x02\xc0\xff\x9a\x01\xad\x02\xc2\xff\ +\x9a\x01\xad\x02\xc4\xff\x9a\x01\xad\x02\xc5\xff\x9a\x01\xad\x02\ +\xc6\xffq\x01\xad\x02\xc7\xff\x9a\x01\xad\x02\xc8\xffq\x01\ +\xad\x02\xcb\xff\xd7\x01\xad\x02\xcd\xff\x9a\x01\xad\x02\xce\xff\ +\x9a\x01\xad\x02\xcf\xff\x85\x01\xad\x02\xd1\xff\x9a\x01\xad\x02\ +\xd3\xff\x9a\x01\xad\x02\xd5\xff\x9a\x01\xad\x02\xd7\xff\x9a\x01\ +\xad\x02\xd9\xffq\x01\xad\x02\xdb\xffq\x01\xad\x02\xdd\xff\ +q\x01\xad\x02\xe0\xffq\x01\xad\x02\xe6\xff\xd7\x01\xad\x02\ +\xe8\xff\xd7\x01\xad\x02\xea\xff\xc3\x01\xad\x02\xec\xff\x9a\x01\ +\xad\x02\xee\xff\x9a\x01\xad\x02\xef\xff\xd7\x01\xad\x02\xf0\xff\ +q\x01\xad\x02\xf1\xff\xd7\x01\xad\x02\xf2\xffq\x01\xad\x02\ +\xf3\xff\xd7\x01\xad\x02\xf4\xffq\x01\xad\x02\xf6\xff\xd7\x01\ +\xad\x02\xf8\xff\xae\x01\xad\x02\xfa\xff\xae\x01\xad\x02\xfc\xff\ +\xae\x01\xad\x02\xfe\xff\x9a\x01\xad\x03\x00\xff\x9a\x01\xad\x03\ +\x02\xff\x9a\x01\xad\x03\x06\xff\xd7\x01\xad\x03\x08\xff\xd7\x01\ +\xad\x03\x09\xffq\x01\xad\x03\x0a\xffq\x01\xad\x03\x0b\xff\ +q\x01\xad\x03\x0c\xffq\x01\xad\x03\x0e\xff\x9a\x01\xad\x03\ +\x10\xff\x9a\x01\xad\x03\x11\xff\x9a\x01\xad\x03\x12\xff\x85\x01\ +\xad\x03\x14\xff\x9a\x01\xad\x03\x15\xff\xd7\x01\xad\x03\x16\xff\ +q\x01\xad\x03\x18\xff\xae\x01\xad\x03\x1a\xffq\x01\xad\x03\ +\x1b\xff\x9a\x01\xad\x03\x1c\xff\x85\x01\xae\x01\xa3\x00\xe1\x01\ +\xae\x02\xea\x00)\x01\xae\x03\x0e\xff\xd7\x01\xae\x03\x10\xff\ +\xd7\x01\xb0\x01\x9f\xff\xd7\x01\xb0\x01\xb8\xff\xd7\x01\xb0\x01\ +\xbb\xff\xd7\x01\xb0\x01\xbe\xff\xd7\x01\xb0\x01\xc1\xff\xd7\x01\ +\xb0\x01\xe1\xff\xd7\x01\xb0\x02l\xff\xd7\x01\xb0\x02|\xff\ +\xd7\x01\xb0\x02~\xff\xd7\x01\xb0\x02\x84\xff\xd7\x01\xb0\x02\ +\x86\xff\xd7\x01\xb0\x02\x88\xff\xd7\x01\xb0\x02\x8a\xff\xd7\x01\ +\xb0\x02\x8c\xff\xd7\x01\xb0\x02\xb1\xff\xd7\x01\xb0\x02\xb3\xff\ +\xd7\x01\xb0\x02\xbf\xff\xd7\x01\xb0\x02\xc0\xff\xd7\x01\xb0\x02\ +\xc1\xff\xd7\x01\xb0\x02\xc2\xff\xd7\x01\xb0\x02\xc5\xff\x9a\x01\ +\xb0\x02\xc7\xff\x9a\x01\xb0\x02\xd4\xff\xd7\x01\xb0\x02\xd5\xff\ +\xd7\x01\xb0\x02\xef\xff\xd7\x01\xb0\x02\xf1\xff\xd7\x01\xb0\x02\ +\xf3\xff\xd7\x01\xb0\x02\xfd\xff\xd7\x01\xb0\x02\xfe\xff\xd7\x01\ +\xb0\x03\x09\xff\xd7\x01\xb0\x03\x0b\xff\xd7\x01\xb0\x03\x0e\xff\ +\xd7\x01\xb0\x03\x10\xff\xd7\x01\xb0\x03\x15\xff\xd7\x01\xb0\x03\ +\x19\xff\xec\x01\xb1\x00\x0f\xff\xae\x01\xb1\x00\x11\xff\xae\x01\ +\xb1\x02\x08\xff\xae\x01\xb1\x02\x0c\xff\xae\x01\xb1\x02\x80\xff\ +\xec\x01\xb1\x02\x82\xff\xec\x01\xb1\x02\xb7\xff\xec\x01\xb1\x02\ +\xb9\xff\xec\x01\xb1\x03\x0d\xff\xd7\x01\xb1\x03\x0f\xff\xd7\x01\ +\xb4\x01\x9f\xff\xd7\x01\xb4\x01\xb8\xff\xd7\x01\xb4\x01\xbb\xff\ +\xd7\x01\xb4\x01\xbe\xff\xd7\x01\xb4\x01\xc1\xff\xd7\x01\xb4\x01\ +\xe1\xff\xd7\x01\xb4\x02l\xff\xd7\x01\xb4\x02|\xff\xd7\x01\ +\xb4\x02~\xff\xd7\x01\xb4\x02\x84\xff\xd7\x01\xb4\x02\x86\xff\ +\xd7\x01\xb4\x02\x88\xff\xd7\x01\xb4\x02\x8a\xff\xd7\x01\xb4\x02\ +\x8c\xff\xd7\x01\xb4\x02\xb1\xff\xd7\x01\xb4\x02\xb3\xff\xd7\x01\ +\xb4\x02\xbf\xff\xd7\x01\xb4\x02\xc0\xff\xd7\x01\xb4\x02\xc1\xff\ +\xd7\x01\xb4\x02\xc2\xff\xd7\x01\xb4\x02\xc5\xff\x9a\x01\xb4\x02\ +\xc7\xff\x9a\x01\xb4\x02\xd4\xff\xd7\x01\xb4\x02\xd5\xff\xd7\x01\ +\xb4\x02\xef\xff\xd7\x01\xb4\x02\xf1\xff\xd7\x01\xb4\x02\xf3\xff\ +\xd7\x01\xb4\x02\xfd\xff\xd7\x01\xb4\x02\xfe\xff\xd7\x01\xb4\x03\ +\x09\xff\xd7\x01\xb4\x03\x0b\xff\xd7\x01\xb4\x03\x0e\xff\xd7\x01\ +\xb4\x03\x10\xff\xd7\x01\xb4\x03\x15\xff\xd7\x01\xb4\x03\x19\xff\ +\xec\x01\xb8\x00\x0f\xff\xae\x01\xb8\x00\x11\xff\xae\x01\xb8\x01\ +\x9d\xff\xec\x01\xb8\x01\xa4\xff\xd7\x01\xb8\x01\xa6\xff\xec\x01\ +\xb8\x01\xa8\xff\xd7\x01\xb8\x01\xaa\xff\xd7\x01\xb8\x01\xae\xff\ +\xd7\x01\xb8\x01\xb0\xff\xd7\x01\xb8\x01\xb1\xff\xec\x01\xb8\x01\ +\xb5\xff\xd7\x01\xb8\x01\xbc\xff\xc3\x01\xb8\x01\xbd\xff\xd7\x01\ +\xb8\x01\xbf\xff\xd7\x01\xb8\x01\xc1\xff\xd7\x01\xb8\x01\xc4\xff\ +\xec\x01\xb8\x01\xc7\xff\xec\x01\xb8\x01\xce\xff\xec\x01\xb8\x01\ +\xd5\xff\xec\x01\xb8\x01\xf2\xff\xec\x01\xb8\x02\x08\xff\xae\x01\ +\xb8\x02\x0c\xff\xae\x01\xb8\x02r\xff\xd7\x01\xb8\x02s\xff\ +\xec\x01\xb8\x02z\xff\xec\x01\xb8\x02|\xff\xd7\x01\xb8\x02\ +\x80\xff\xec\x01\xb8\x02\x82\xff\xec\x01\xb8\x02\x9f\xff\xd7\x01\ +\xb8\x02\xa1\xff\xec\x01\xb8\x02\xa9\xff\xec\x01\xb8\x02\xb5\xff\ +\xc3\x01\xb8\x02\xb7\xff\xec\x01\xb8\x02\xb9\xff\xec\x01\xb8\x02\ +\xbb\xff\xd7\x01\xb8\x02\xbd\xff\xec\x01\xb8\x02\xbf\xff\xd7\x01\ +\xb8\x02\xc1\xff\xd7\x01\xb8\x02\xca\xff\xd7\x01\xb8\x02\xce\xff\ +\xd7\x01\xb8\x02\xcf\xff\xec\x01\xb8\x02\xd4\xff\xd7\x01\xb8\x02\ +\xd9\xff\xd7\x01\xb8\x02\xdb\xff\xd7\x01\xb8\x02\xdd\xff\xd7\x01\ +\xb8\x02\xe5\xff\xd7\x01\xb8\x02\xe7\xff\xec\x01\xb8\x02\xf5\xff\ +\xec\x01\xb8\x02\xf7\xff\xd7\x01\xb8\x02\xf9\xff\xd7\x01\xb8\x02\ +\xfb\xff\xd7\x01\xb8\x02\xfd\xff\xd7\x01\xb8\x03\x05\xff\xd7\x01\ +\xb8\x03\x07\xff\xd7\x01\xb8\x03\x0d\xff\xd7\x01\xb8\x03\x0f\xff\ +\xd7\x01\xb8\x03\x11\xff\xd7\x01\xb8\x03\x12\xff\xec\x01\xb8\x03\ +\x17\xff\xec\x01\xb8\x03\x1b\xff\xd7\x01\xb8\x03\x1c\xff\xec\x01\ +\xba\x00\x0f\xfe\xf6\x01\xba\x00\x11\xfe\xf6\x01\xba\x01\xa4\xff\ +\x85\x01\xba\x01\xaa\xff\x9a\x01\xba\x01\xae\xff\x85\x01\xba\x01\ +\xb0\xff\xd7\x01\xba\x01\xb5\xff\x85\x01\xba\x01\xbf\xff\xd7\x01\ +\xba\x01\xce\xff\x9a\x01\xba\x01\xd5\xff\x9a\x01\xba\x01\xf2\xff\ +\x9a\x01\xba\x02\x08\xfe\xf6\x01\xba\x02\x0c\xfe\xf6\x01\xba\x02\ +r\xff\x9a\x01\xba\x02s\xff\x9a\x01\xba\x02v\xff\xec\x01\ +\xba\x02\x9f\xff\xd7\x01\xba\x02\xbb\xff\xd7\x01\xba\x02\xca\xff\ +\xd7\x01\xba\x02\xce\xff\x85\x01\xba\x02\xcf\xff\x9a\x01\xba\x02\ +\xd9\xff\x9a\x01\xba\x02\xdb\xff\x9a\x01\xba\x02\xdd\xff\x9a\x01\ +\xba\x02\xe5\xff\xd7\x01\xba\x03\x05\xff\xd7\x01\xba\x03\x07\xff\ +\xd7\x01\xba\x03\x09\xff\xae\x01\xba\x03\x0b\xff\xae\x01\xba\x03\ +\x11\xff\x85\x01\xba\x03\x12\xff\x9a\x01\xba\x03\x1b\xff\x85\x01\ +\xba\x03\x1c\xff\x9a\x01\xbb\x01\x9f\xff\xd7\x01\xbb\x01\xb8\xff\ +\xd7\x01\xbb\x01\xbb\xff\xd7\x01\xbb\x01\xbe\xff\xd7\x01\xbb\x01\ +\xe1\xff\xd7\x01\xbb\x02l\xff\xd7\x01\xbb\x02~\xff\xd7\x01\ +\xbb\x02\x84\xff\xd7\x01\xbb\x02\x86\xff\xd7\x01\xbb\x02\x88\xff\ +\xd7\x01\xbb\x02\x8a\xff\xd7\x01\xbb\x02\x8c\xff\xd7\x01\xbb\x02\ +\xb1\xff\xd7\x01\xbb\x02\xb3\xff\xd7\x01\xbb\x02\xc0\xff\xd7\x01\ +\xbb\x02\xc2\xff\xd7\x01\xbb\x02\xc5\xff\xd7\x01\xbb\x02\xc7\xff\ +\xd7\x01\xbb\x02\xd5\xff\xd7\x01\xbb\x02\xef\xff\xd7\x01\xbb\x02\ +\xf1\xff\xd7\x01\xbb\x02\xf3\xff\xd7\x01\xbb\x02\xfe\xff\xd7\x01\ +\xbb\x03\x09\xff\xd7\x01\xbb\x03\x0b\xff\xd7\x01\xbb\x03\x0e\xff\ +\xd7\x01\xbb\x03\x10\xff\xd7\x01\xbb\x03\x15\xff\xd7\x01\xbc\x00\ +\x0f\xff\x85\x01\xbc\x00\x10\xff\xae\x01\xbc\x00\x11\xff\x85\x01\ +\xbc\x01\x9f\xff\xd7\x01\xbc\x01\xa4\xff\x9a\x01\xbc\x01\xaa\xff\ +q\x01\xbc\x01\xae\xff\x9a\x01\xbc\x01\xb5\xff\x9a\x01\xbc\x01\ +\xb8\xff\xd7\x01\xbc\x01\xbb\xff\xd7\x01\xbc\x01\xbc\x00)\x01\ +\xbc\x01\xbe\xff\xae\x01\xbc\x01\xcc\xff\x9a\x01\xbc\x01\xcd\xff\ +\x9a\x01\xbc\x01\xce\xff\x85\x01\xbc\x01\xcf\xffq\x01\xbc\x01\ +\xd0\xff\xd7\x01\xbc\x01\xd1\xff\xd7\x01\xbc\x01\xd2\xff\x9a\x01\ +\xbc\x01\xd3\xff\x9a\x01\xbc\x01\xd4\xff\x9a\x01\xbc\x01\xd5\xff\ +\x85\x01\xbc\x01\xd6\xff\x9a\x01\xbc\x01\xd7\xff\x9a\x01\xbc\x01\ +\xd8\xffq\x01\xbc\x01\xd9\xff\x9a\x01\xbc\x01\xda\xff\x9a\x01\ +\xbc\x01\xdb\xffq\x01\xbc\x01\xdc\xff\xae\x01\xbc\x01\xdd\xff\ +\xae\x01\xbc\x01\xde\xffq\x01\xbc\x01\xdf\xff\xd7\x01\xbc\x01\ +\xe0\xff\x9a\x01\xbc\x01\xe1\xff\x9a\x01\xbc\x01\xe2\xff\x9a\x01\ +\xbc\x01\xe3\xff\x9a\x01\xbc\x01\xe4\xff\xae\x01\xbc\x01\xe5\xff\ +\x9a\x01\xbc\x01\xe6\xff\x9a\x01\xbc\x01\xe7\xff\xd7\x01\xbc\x01\ +\xe8\xff\x9a\x01\xbc\x01\xe9\xff\xc3\x01\xbc\x01\xea\xffq\x01\ +\xbc\x01\xec\xff\x9a\x01\xbc\x01\xed\xffq\x01\xbc\x01\xee\xff\ +\x85\x01\xbc\x01\xf2\xff\x85\x01\xbc\x01\xf3\xff\x9a\x01\xbc\x01\ +\xf5\xff\x9a\x01\xbc\x01\xf6\xff\xae\x01\xbc\x01\xf7\xff\x9a\x01\ +\xbc\x01\xf9\xff\x9a\x01\xbc\x02\x02\xff\xae\x01\xbc\x02\x03\xff\ +\xae\x01\xbc\x02\x04\xff\xae\x01\xbc\x02\x08\xff\x85\x01\xbc\x02\ +\x0c\xff\x85\x01\xbc\x02j\xffq\x01\xbc\x02k\xff\x9a\x01\ +\xbc\x02l\xff\xd7\x01\xbc\x02m\xff\xd7\x01\xbc\x02q\xff\ +\x9a\x01\xbc\x02r\xffq\x01\xbc\x02s\xff\x85\x01\xbc\x02\ +u\xff\x9a\x01\xbc\x02w\xff\x9a\x01\xbc\x02y\xff\x9a\x01\ +\xbc\x02}\xff\x9a\x01\xbc\x02~\xff\xd7\x01\xbc\x02\x7f\xff\ +q\x01\xbc\x02\x81\xff\xd7\x01\xbc\x02\x83\xff\xd7\x01\xbc\x02\ +\x84\xff\xd7\x01\xbc\x02\x85\xffq\x01\xbc\x02\x86\xff\xd7\x01\ +\xbc\x02\x87\xffq\x01\xbc\x02\x88\xff\xd7\x01\xbc\x02\x89\xff\ +q\x01\xbc\x02\x8a\xff\xd7\x01\xbc\x02\x8b\xff\xd7\x01\xbc\x02\ +\x8c\xff\xd7\x01\xbc\x02\x8d\xffq\x01\xbc\x02\x96\xff\x9a\x01\ +\xbc\x02\x9a\xff\x9a\x01\xbc\x02\x9e\xff\x9a\x01\xbc\x02\xa0\xff\ +\xd7\x01\xbc\x02\xa2\xff\xd7\x01\xbc\x02\xa4\xff\x9a\x01\xbc\x02\ +\xa6\xff\x9a\x01\xbc\x02\xaa\xff\xae\x01\xbc\x02\xac\xff\x9a\x01\ +\xbc\x02\xae\xff\x9a\x01\xbc\x02\xb0\xff\x9a\x01\xbc\x02\xb1\xff\ +\xd7\x01\xbc\x02\xb2\xffq\x01\xbc\x02\xb3\xff\xd7\x01\xbc\x02\ +\xb4\xffq\x01\xbc\x02\xb5\x00)\x01\xbc\x02\xb6\xff\xae\x01\ +\xbc\x02\xb8\xff\xae\x01\xbc\x02\xba\xff\xae\x01\xbc\x02\xbc\xff\ +\xd7\x01\xbc\x02\xbe\xff\xae\x01\xbc\x02\xc0\xff\x9a\x01\xbc\x02\ +\xc2\xff\x9a\x01\xbc\x02\xc4\xff\x9a\x01\xbc\x02\xc5\xff\x9a\x01\ +\xbc\x02\xc6\xffq\x01\xbc\x02\xc7\xff\x9a\x01\xbc\x02\xc8\xff\ +q\x01\xbc\x02\xcb\xff\xd7\x01\xbc\x02\xcd\xff\x9a\x01\xbc\x02\ +\xce\xff\x9a\x01\xbc\x02\xcf\xff\x85\x01\xbc\x02\xd1\xff\x9a\x01\ +\xbc\x02\xd3\xff\x9a\x01\xbc\x02\xd5\xff\x9a\x01\xbc\x02\xd7\xff\ +\x9a\x01\xbc\x02\xd9\xffq\x01\xbc\x02\xdb\xffq\x01\xbc\x02\ +\xdd\xffq\x01\xbc\x02\xe0\xffq\x01\xbc\x02\xe6\xff\xd7\x01\ +\xbc\x02\xe8\xff\xd7\x01\xbc\x02\xea\xff\xc3\x01\xbc\x02\xec\xff\ +\x9a\x01\xbc\x02\xee\xff\x9a\x01\xbc\x02\xef\xff\xd7\x01\xbc\x02\ +\xf0\xffq\x01\xbc\x02\xf1\xff\xd7\x01\xbc\x02\xf2\xffq\x01\ +\xbc\x02\xf3\xff\xd7\x01\xbc\x02\xf4\xffq\x01\xbc\x02\xf6\xff\ +\xd7\x01\xbc\x02\xf8\xff\xae\x01\xbc\x02\xfa\xff\xae\x01\xbc\x02\ +\xfc\xff\xae\x01\xbc\x02\xfe\xff\x9a\x01\xbc\x03\x00\xff\x9a\x01\ +\xbc\x03\x02\xff\x9a\x01\xbc\x03\x06\xff\xd7\x01\xbc\x03\x08\xff\ +\xd7\x01\xbc\x03\x09\xffq\x01\xbc\x03\x0a\xffq\x01\xbc\x03\ +\x0b\xffq\x01\xbc\x03\x0c\xffq\x01\xbc\x03\x0e\xff\x9a\x01\ +\xbc\x03\x10\xff\x9a\x01\xbc\x03\x11\xff\x9a\x01\xbc\x03\x12\xff\ +\x85\x01\xbc\x03\x14\xff\x9a\x01\xbc\x03\x15\xff\xd7\x01\xbc\x03\ +\x16\xffq\x01\xbc\x03\x18\xff\xae\x01\xbc\x03\x1a\xffq\x01\ +\xbc\x03\x1b\xff\x9a\x01\xbc\x03\x1c\xff\x85\x01\xbd\x00\x0f\xff\ +\x85\x01\xbd\x00\x11\xff\x85\x01\xbd\x01\x9f\xff\xec\x01\xbd\x01\ +\xa4\xff\x9a\x01\xbd\x01\xaa\xffq\x01\xbd\x01\xae\xff\x9a\x01\ +\xbd\x01\xb5\xff\x9a\x01\xbd\x01\xb8\xff\xec\x01\xbd\x01\xbb\xff\ +\xec\x01\xbd\x01\xbe\xff\xc3\x01\xbd\x01\xc9\xff\xec\x01\xbd\x01\ +\xce\xff\xae\x01\xbd\x01\xcf\xff\xd7\x01\xbd\x01\xd5\xff\xae\x01\ +\xbd\x01\xd8\xff\xd7\x01\xbd\x01\xdb\xff\xd7\x01\xbd\x01\xde\xff\ +\xd7\x01\xbd\x01\xe1\xff\xd7\x01\xbd\x01\xea\xff\xd7\x01\xbd\x01\ +\xeb\x00f\x01\xbd\x01\xed\xff\xd7\x01\xbd\x01\xee\xff\xec\x01\ +\xbd\x01\xf2\xff\xae\x01\xbd\x01\xf4\x00f\x01\xbd\x02\x08\xff\ +\x85\x01\xbd\x02\x0c\xff\x85\x01\xbd\x02j\xff\xd7\x01\xbd\x02\ +l\xff\xec\x01\xbd\x02r\xffq\x01\xbd\x02s\xff\xae\x01\ +\xbd\x02~\xff\xec\x01\xbd\x02\x7f\xff\xd7\x01\xbd\x02\x84\xff\ +\xec\x01\xbd\x02\x85\xff\xd7\x01\xbd\x02\x86\xff\xec\x01\xbd\x02\ +\x87\xff\xd7\x01\xbd\x02\x88\xff\xec\x01\xbd\x02\x89\xff\xd7\x01\ +\xbd\x02\x8a\xff\xec\x01\xbd\x02\x8c\xff\xec\x01\xbd\x02\x8d\xff\ +\xd7\x01\xbd\x02\x98\x00f\x01\xbd\x02\xa8\x00f\x01\xbd\x02\ +\xb1\xff\xec\x01\xbd\x02\xb2\xff\xd7\x01\xbd\x02\xb3\xff\xec\x01\ +\xbd\x02\xb4\xff\xd7\x01\xbd\x02\xc0\xff\xd7\x01\xbd\x02\xc2\xff\ +\xd7\x01\xbd\x02\xc5\xff\xd7\x01\xbd\x02\xc6\xff\xc3\x01\xbd\x02\ +\xc7\xff\xd7\x01\xbd\x02\xc8\xff\xc3\x01\xbd\x02\xce\xff\x9a\x01\ +\xbd\x02\xcf\xff\xae\x01\xbd\x02\xd5\xff\xd7\x01\xbd\x02\xd9\xff\ +q\x01\xbd\x02\xdb\xffq\x01\xbd\x02\xdd\xffq\x01\xbd\x02\ +\xe0\xff\xd7\x01\xbd\x02\xef\xff\xec\x01\xbd\x02\xf0\xff\xd7\x01\ +\xbd\x02\xf1\xff\xec\x01\xbd\x02\xf2\xff\xd7\x01\xbd\x02\xf3\xff\ +\xec\x01\xbd\x02\xf4\xff\xd7\x01\xbd\x02\xfe\xff\xd7\x01\xbd\x03\ +\x09\xffq\x01\xbd\x03\x0a\xff\xd7\x01\xbd\x03\x0b\xffq\x01\ +\xbd\x03\x0c\xff\xd7\x01\xbd\x03\x11\xff\x9a\x01\xbd\x03\x12\xff\ +\xae\x01\xbd\x03\x15\xff\xec\x01\xbd\x03\x16\xff\xd7\x01\xbd\x03\ +\x1a\xff\xd7\x01\xbd\x03\x1b\xff\x9a\x01\xbd\x03\x1c\xff\xae\x01\ +\xbe\x00\x0f\xff\xae\x01\xbe\x00\x11\xff\xae\x01\xbe\x01\x9d\xff\ +\xd7\x01\xbe\x01\xa4\xff\xd7\x01\xbe\x01\xa6\xff\xd7\x01\xbe\x01\ +\xa8\xff\xc3\x01\xbe\x01\xaa\xff\xd7\x01\xbe\x01\xae\xff\xd7\x01\ +\xbe\x01\xb0\xff\xd7\x01\xbe\x01\xb1\xff\xd7\x01\xbe\x01\xb5\xff\ +\xd7\x01\xbe\x01\xbc\xff\xc3\x01\xbe\x01\xbd\xff\xc3\x01\xbe\x01\ +\xbf\xff\xd7\x01\xbe\x01\xc4\xff\xd7\x01\xbe\x01\xc7\xff\xd7\x01\ +\xbe\x01\xce\xff\xec\x01\xbe\x01\xd5\xff\xec\x01\xbe\x01\xf2\xff\ +\xec\x01\xbe\x02\x08\xff\xae\x01\xbe\x02\x0c\xff\xae\x01\xbe\x02\ +r\xff\xd7\x01\xbe\x02s\xff\xec\x01\xbe\x02z\xff\xd7\x01\ +\xbe\x02\x80\xff\xec\x01\xbe\x02\x82\xff\xec\x01\xbe\x02\x9f\xff\ +\xd7\x01\xbe\x02\xa1\xff\xd7\x01\xbe\x02\xa9\xff\xd7\x01\xbe\x02\ +\xb5\xff\xc3\x01\xbe\x02\xb7\xff\xc3\x01\xbe\x02\xb9\xff\xc3\x01\ +\xbe\x02\xbb\xff\xd7\x01\xbe\x02\xbd\xff\xd7\x01\xbe\x02\xca\xff\ +\xd7\x01\xbe\x02\xce\xff\xd7\x01\xbe\x02\xcf\xff\xec\x01\xbe\x02\ +\xd9\xff\xd7\x01\xbe\x02\xdb\xff\xd7\x01\xbe\x02\xdd\xff\xd7\x01\ +\xbe\x02\xe5\xff\xd7\x01\xbe\x02\xe7\xff\xd7\x01\xbe\x02\xf5\xff\ +\xd7\x01\xbe\x02\xf7\xff\xc3\x01\xbe\x02\xf9\xff\xc3\x01\xbe\x02\ +\xfb\xff\xc3\x01\xbe\x03\x05\xff\xd7\x01\xbe\x03\x07\xff\xd7\x01\ +\xbe\x03\x0d\xff\xd7\x01\xbe\x03\x0f\xff\xd7\x01\xbe\x03\x11\xff\ +\xd7\x01\xbe\x03\x12\xff\xec\x01\xbe\x03\x17\xff\xd7\x01\xbe\x03\ +\x1b\xff\xd7\x01\xbe\x03\x1c\xff\xec\x01\xbf\x01\x9f\xff\xd7\x01\ +\xbf\x01\xb8\xff\xd7\x01\xbf\x01\xbb\xff\xd7\x01\xbf\x01\xbe\xff\ +\xd7\x01\xbf\x01\xc1\xff\xd7\x01\xbf\x01\xe1\xff\xd7\x01\xbf\x02\ +l\xff\xd7\x01\xbf\x02|\xff\xd7\x01\xbf\x02~\xff\xd7\x01\ +\xbf\x02\x84\xff\xd7\x01\xbf\x02\x86\xff\xd7\x01\xbf\x02\x88\xff\ +\xd7\x01\xbf\x02\x8a\xff\xd7\x01\xbf\x02\x8c\xff\xd7\x01\xbf\x02\ +\xb1\xff\xd7\x01\xbf\x02\xb3\xff\xd7\x01\xbf\x02\xbf\xff\xd7\x01\ +\xbf\x02\xc0\xff\xd7\x01\xbf\x02\xc1\xff\xd7\x01\xbf\x02\xc2\xff\ +\xd7\x01\xbf\x02\xc5\xff\x9a\x01\xbf\x02\xc7\xff\x9a\x01\xbf\x02\ +\xd4\xff\xd7\x01\xbf\x02\xd5\xff\xd7\x01\xbf\x02\xef\xff\xd7\x01\ +\xbf\x02\xf1\xff\xd7\x01\xbf\x02\xf3\xff\xd7\x01\xbf\x02\xfd\xff\ +\xd7\x01\xbf\x02\xfe\xff\xd7\x01\xbf\x03\x09\xff\xd7\x01\xbf\x03\ +\x0b\xff\xd7\x01\xbf\x03\x0e\xff\xd7\x01\xbf\x03\x10\xff\xd7\x01\ +\xbf\x03\x15\xff\xd7\x01\xbf\x03\x19\xff\xec\x01\xc0\x01\xa3\x00\ +\xe1\x01\xc0\x02\xea\x00)\x01\xc0\x03\x0e\xff\xd7\x01\xc0\x03\ +\x10\xff\xd7\x01\xc3\x01\xa3\x00\xe1\x01\xc3\x02\xea\x00)\x01\ +\xc3\x03\x0e\xff\xd7\x01\xc3\x03\x10\xff\xd7\x01\xc4\x00\x05\xff\ +\xae\x01\xc4\x00\x0a\xff\xae\x01\xc4\x01\x9d\xff\x85\x01\xc4\x01\ +\xa6\xff\x85\x01\xc4\x01\xa8\xff\xd7\x01\xc4\x01\xbc\xff\x9a\x01\ +\xc4\x01\xbd\xff\xd7\x01\xc4\x01\xc1\xff\x9a\x01\xc4\x01\xc4\xff\ +\x85\x01\xc4\x01\xdc\xff\xd7\x01\xc4\x01\xdd\xff\xd7\x01\xc4\x01\ +\xe1\xff\xd7\x01\xc4\x01\xe4\xff\xd7\x01\xc4\x01\xf6\xff\xd7\x01\ +\xc4\x02\x07\xff\xae\x01\xc4\x02\x0b\xff\xae\x01\xc4\x02n\xff\ +\xae\x01\xc4\x02|\xff\x9a\x01\xc4\x02\x80\xff\xae\x01\xc4\x02\ +\x82\xff\xae\x01\xc4\x02\x97\xff\xae\x01\xc4\x02\x9b\xff\xae\x01\ +\xc4\x02\xa7\xff\xae\x01\xc4\x02\xa9\xff\x85\x01\xc4\x02\xaa\xff\ +\xd7\x01\xc4\x02\xb5\xff\x9a\x01\xc4\x02\xb6\xff\xd7\x01\xc4\x02\ +\xb7\xff\x9a\x01\xc4\x02\xb8\xff\xd7\x01\xc4\x02\xb9\xff\x9a\x01\ +\xc4\x02\xba\xff\xd7\x01\xc4\x02\xbd\xff\x85\x01\xc4\x02\xbe\xff\ +\xd7\x01\xc4\x02\xbf\xff\x9a\x01\xc4\x02\xc0\xff\xd7\x01\xc4\x02\ +\xc1\xff\x9a\x01\xc4\x02\xc2\xff\xd7\x01\xc4\x02\xd4\xff\x9a\x01\ +\xc4\x02\xd5\xff\xd7\x01\xc4\x02\xf7\xff\xd7\x01\xc4\x02\xf8\xff\ +\xd7\x01\xc4\x02\xf9\xff\xd7\x01\xc4\x02\xfa\xff\xd7\x01\xc4\x02\ +\xfb\xff\xd7\x01\xc4\x02\xfc\xff\xd7\x01\xc4\x02\xfd\xff\x9a\x01\ +\xc4\x02\xfe\xff\xd7\x01\xc4\x03\x03\xff\xae\x01\xc4\x03\x0d\xff\ +\x9a\x01\xc4\x03\x0e\xff\xc3\x01\xc4\x03\x0f\xff\x9a\x01\xc4\x03\ +\x10\xff\xc3\x01\xc4\x03\x17\xff\x85\x01\xc4\x03\x18\xff\xd7\x01\ +\xc6\x00\x05\xff\xae\x01\xc6\x00\x0a\xff\xae\x01\xc6\x01\x9d\xff\ +\x85\x01\xc6\x01\xa6\xff\x85\x01\xc6\x01\xa8\xff\xd7\x01\xc6\x01\ +\xbc\xff\x9a\x01\xc6\x01\xbd\xff\xd7\x01\xc6\x01\xc1\xff\x9a\x01\ +\xc6\x01\xc4\xff\x85\x01\xc6\x01\xdc\xff\xd7\x01\xc6\x01\xdd\xff\ +\xd7\x01\xc6\x01\xe1\xff\xd7\x01\xc6\x01\xe4\xff\xd7\x01\xc6\x01\ +\xf6\xff\xd7\x01\xc6\x02\x07\xff\xae\x01\xc6\x02\x0b\xff\xae\x01\ +\xc6\x02n\xff\xae\x01\xc6\x02|\xff\x9a\x01\xc6\x02\x80\xff\ +\xae\x01\xc6\x02\x82\xff\xae\x01\xc6\x02\x97\xff\xae\x01\xc6\x02\ +\x9b\xff\xae\x01\xc6\x02\xa7\xff\xae\x01\xc6\x02\xa9\xff\x85\x01\ +\xc6\x02\xaa\xff\xd7\x01\xc6\x02\xb5\xff\x9a\x01\xc6\x02\xb6\xff\ +\xd7\x01\xc6\x02\xb7\xff\x9a\x01\xc6\x02\xb8\xff\xd7\x01\xc6\x02\ +\xb9\xff\x9a\x01\xc6\x02\xba\xff\xd7\x01\xc6\x02\xbd\xff\x85\x01\ +\xc6\x02\xbe\xff\xd7\x01\xc6\x02\xbf\xff\x9a\x01\xc6\x02\xc0\xff\ +\xd7\x01\xc6\x02\xc1\xff\x9a\x01\xc6\x02\xc2\xff\xd7\x01\xc6\x02\ +\xd4\xff\x9a\x01\xc6\x02\xd5\xff\xd7\x01\xc6\x02\xf7\xff\xd7\x01\ +\xc6\x02\xf8\xff\xd7\x01\xc6\x02\xf9\xff\xd7\x01\xc6\x02\xfa\xff\ +\xd7\x01\xc6\x02\xfb\xff\xd7\x01\xc6\x02\xfc\xff\xd7\x01\xc6\x02\ +\xfd\xff\x9a\x01\xc6\x02\xfe\xff\xd7\x01\xc6\x03\x03\xff\xae\x01\ +\xc6\x03\x0d\xff\x9a\x01\xc6\x03\x0e\xff\xc3\x01\xc6\x03\x0f\xff\ +\x9a\x01\xc6\x03\x10\xff\xc3\x01\xc6\x03\x17\xff\x85\x01\xc6\x03\ +\x18\xff\xd7\x01\xc7\x00\x0f\xff\xae\x01\xc7\x00\x11\xff\xae\x01\ +\xc7\x01\x9d\xff\xec\x01\xc7\x01\xa4\xff\xd7\x01\xc7\x01\xa6\xff\ +\xec\x01\xc7\x01\xa8\xff\xd7\x01\xc7\x01\xaa\xff\xd7\x01\xc7\x01\ +\xae\xff\xd7\x01\xc7\x01\xb0\xff\xd7\x01\xc7\x01\xb1\xff\xec\x01\ +\xc7\x01\xb5\xff\xd7\x01\xc7\x01\xbc\xff\xc3\x01\xc7\x01\xbd\xff\ +\xd7\x01\xc7\x01\xbf\xff\xd7\x01\xc7\x01\xc1\xff\xd7\x01\xc7\x01\ +\xc4\xff\xec\x01\xc7\x01\xc7\xff\xec\x01\xc7\x01\xce\xff\xec\x01\ +\xc7\x01\xd5\xff\xec\x01\xc7\x01\xf2\xff\xec\x01\xc7\x02\x08\xff\ +\xae\x01\xc7\x02\x0c\xff\xae\x01\xc7\x02r\xff\xd7\x01\xc7\x02\ +s\xff\xec\x01\xc7\x02z\xff\xec\x01\xc7\x02|\xff\xd7\x01\ +\xc7\x02\x80\xff\xec\x01\xc7\x02\x82\xff\xec\x01\xc7\x02\x9f\xff\ +\xd7\x01\xc7\x02\xa1\xff\xec\x01\xc7\x02\xa9\xff\xec\x01\xc7\x02\ +\xb5\xff\xc3\x01\xc7\x02\xb7\xff\xec\x01\xc7\x02\xb9\xff\xec\x01\ +\xc7\x02\xbb\xff\xd7\x01\xc7\x02\xbd\xff\xec\x01\xc7\x02\xbf\xff\ +\xd7\x01\xc7\x02\xc1\xff\xd7\x01\xc7\x02\xca\xff\xd7\x01\xc7\x02\ +\xce\xff\xd7\x01\xc7\x02\xcf\xff\xec\x01\xc7\x02\xd4\xff\xd7\x01\ +\xc7\x02\xd9\xff\xd7\x01\xc7\x02\xdb\xff\xd7\x01\xc7\x02\xdd\xff\ +\xd7\x01\xc7\x02\xe5\xff\xd7\x01\xc7\x02\xe7\xff\xec\x01\xc7\x02\ +\xf5\xff\xec\x01\xc7\x02\xf7\xff\xd7\x01\xc7\x02\xf9\xff\xd7\x01\ +\xc7\x02\xfb\xff\xd7\x01\xc7\x02\xfd\xff\xd7\x01\xc7\x03\x05\xff\ +\xd7\x01\xc7\x03\x07\xff\xd7\x01\xc7\x03\x0d\xff\xd7\x01\xc7\x03\ +\x0f\xff\xd7\x01\xc7\x03\x11\xff\xd7\x01\xc7\x03\x12\xff\xec\x01\ +\xc7\x03\x17\xff\xec\x01\xc7\x03\x1b\xff\xd7\x01\xc7\x03\x1c\xff\ +\xec\x01\xc8\x00\x0f\xff\xae\x01\xc8\x00\x11\xff\xae\x01\xc8\x01\ +\x9d\xff\xec\x01\xc8\x01\xa4\xff\xd7\x01\xc8\x01\xa6\xff\xec\x01\ +\xc8\x01\xa8\xff\xd7\x01\xc8\x01\xaa\xff\xd7\x01\xc8\x01\xae\xff\ +\xd7\x01\xc8\x01\xb0\xff\xd7\x01\xc8\x01\xb1\xff\xec\x01\xc8\x01\ +\xb5\xff\xd7\x01\xc8\x01\xbc\xff\xc3\x01\xc8\x01\xbd\xff\xd7\x01\ +\xc8\x01\xbf\xff\xd7\x01\xc8\x01\xc1\xff\xd7\x01\xc8\x01\xc4\xff\ +\xec\x01\xc8\x01\xc7\xff\xec\x01\xc8\x01\xce\xff\xec\x01\xc8\x01\ +\xd5\xff\xec\x01\xc8\x01\xf2\xff\xec\x01\xc8\x02\x08\xff\xae\x01\ +\xc8\x02\x0c\xff\xae\x01\xc8\x02r\xff\xd7\x01\xc8\x02s\xff\ +\xec\x01\xc8\x02z\xff\xec\x01\xc8\x02|\xff\xd7\x01\xc8\x02\ +\x80\xff\xec\x01\xc8\x02\x82\xff\xec\x01\xc8\x02\x9f\xff\xd7\x01\ +\xc8\x02\xa1\xff\xec\x01\xc8\x02\xa9\xff\xec\x01\xc8\x02\xb5\xff\ +\xc3\x01\xc8\x02\xb7\xff\xec\x01\xc8\x02\xb9\xff\xec\x01\xc8\x02\ +\xbb\xff\xd7\x01\xc8\x02\xbd\xff\xec\x01\xc8\x02\xbf\xff\xd7\x01\ +\xc8\x02\xc1\xff\xd7\x01\xc8\x02\xca\xff\xd7\x01\xc8\x02\xce\xff\ +\xd7\x01\xc8\x02\xcf\xff\xec\x01\xc8\x02\xd4\xff\xd7\x01\xc8\x02\ +\xd9\xff\xd7\x01\xc8\x02\xdb\xff\xd7\x01\xc8\x02\xdd\xff\xd7\x01\ +\xc8\x02\xe5\xff\xd7\x01\xc8\x02\xe7\xff\xec\x01\xc8\x02\xf5\xff\ +\xec\x01\xc8\x02\xf7\xff\xd7\x01\xc8\x02\xf9\xff\xd7\x01\xc8\x02\ +\xfb\xff\xd7\x01\xc8\x02\xfd\xff\xd7\x01\xc8\x03\x05\xff\xd7\x01\ +\xc8\x03\x07\xff\xd7\x01\xc8\x03\x0d\xff\xd7\x01\xc8\x03\x0f\xff\ +\xd7\x01\xc8\x03\x11\xff\xd7\x01\xc8\x03\x12\xff\xec\x01\xc8\x03\ +\x17\xff\xec\x01\xc8\x03\x1b\xff\xd7\x01\xc8\x03\x1c\xff\xec\x01\ +\xca\x00\x05\xff\xec\x01\xca\x00\x0a\xff\xec\x01\xca\x02\x07\xff\ +\xec\x01\xca\x02\x0b\xff\xec\x01\xcc\x01\xe9\x00)\x01\xcd\x00\ +\x0f\xff\x9a\x01\xcd\x00\x10\xff\xd7\x01\xcd\x00\x11\xff\x9a\x01\ +\xcd\x01\xce\xff\xc3\x01\xcd\x01\xcf\xff\xec\x01\xcd\x01\xd5\xff\ +\xc3\x01\xcd\x01\xd8\xff\xec\x01\xcd\x01\xdb\xff\xec\x01\xcd\x01\ +\xde\xff\xec\x01\xcd\x01\xea\xff\xec\x01\xcd\x01\xed\xff\xec\x01\ +\xcd\x01\xf2\xff\xc3\x01\xcd\x02\x02\xff\xd7\x01\xcd\x02\x03\xff\ +\xd7\x01\xcd\x02\x04\xff\xd7\x01\xcd\x02\x08\xff\x9a\x01\xcd\x02\ +\x0c\xff\x9a\x01\xcd\x02j\xff\xec\x01\xcd\x02s\xff\xc3\x01\ +\xcd\x02\x7f\xff\xec\x01\xcd\x02\x85\xff\xec\x01\xcd\x02\x87\xff\ +\xec\x01\xcd\x02\x89\xff\xec\x01\xcd\x02\x8d\xff\xec\x01\xcd\x02\ +\xb2\xff\xec\x01\xcd\x02\xb4\xff\xec\x01\xcd\x02\xcf\xff\xc3\x01\ +\xcd\x02\xe0\xff\xec\x01\xcd\x02\xf0\xff\xec\x01\xcd\x02\xf2\xff\ +\xec\x01\xcd\x02\xf4\xff\xec\x01\xcd\x03\x0a\xff\xec\x01\xcd\x03\ +\x0c\xff\xec\x01\xcd\x03\x12\xff\xc3\x01\xcd\x03\x16\xff\xec\x01\ +\xcd\x03\x1a\xff\xec\x01\xcd\x03\x1c\xff\xc3\x01\xce\x00\x05\xff\ +\xec\x01\xce\x00\x0a\xff\xec\x01\xce\x02\x07\xff\xec\x01\xce\x02\ +\x0b\xff\xec\x01\xcf\x00\x05\xff\xec\x01\xcf\x00\x0a\xff\xec\x01\ +\xcf\x02\x07\xff\xec\x01\xcf\x02\x0b\xff\xec\x01\xd0\x01\xcf\xff\ +\xd7\x01\xd0\x01\xd8\xff\xd7\x01\xd0\x01\xdb\xff\xd7\x01\xd0\x01\ +\xde\xff\xd7\x01\xd0\x01\xe1\xff\xd7\x01\xd0\x01\xea\xff\xd7\x01\ +\xd0\x01\xed\xff\xd7\x01\xd0\x02j\xff\xd7\x01\xd0\x02\x7f\xff\ +\xd7\x01\xd0\x02\x85\xff\xd7\x01\xd0\x02\x87\xff\xd7\x01\xd0\x02\ +\x89\xff\xd7\x01\xd0\x02\x8d\xff\xd7\x01\xd0\x02\xb2\xff\xd7\x01\ +\xd0\x02\xb4\xff\xd7\x01\xd0\x02\xc0\xff\xd7\x01\xd0\x02\xc2\xff\ +\xd7\x01\xd0\x02\xc6\xff\xd7\x01\xd0\x02\xc8\xff\xd7\x01\xd0\x02\ +\xd5\xff\xd7\x01\xd0\x02\xe0\xff\xd7\x01\xd0\x02\xf0\xff\xd7\x01\ +\xd0\x02\xf2\xff\xd7\x01\xd0\x02\xf4\xff\xd7\x01\xd0\x02\xfe\xff\ +\xd7\x01\xd0\x03\x0a\xff\xd7\x01\xd0\x03\x0c\xff\xd7\x01\xd0\x03\ +\x16\xff\xd7\x01\xd0\x03\x1a\xff\xd7\x01\xd1\x01\xe9\x00)\x01\ +\xd4\x01\xcf\xff\xd7\x01\xd4\x01\xd8\xff\xd7\x01\xd4\x01\xdb\xff\ +\xd7\x01\xd4\x01\xde\xff\xd7\x01\xd4\x01\xe1\xff\xd7\x01\xd4\x01\ +\xea\xff\xd7\x01\xd4\x01\xed\xff\xd7\x01\xd4\x02j\xff\xd7\x01\ +\xd4\x02\x7f\xff\xd7\x01\xd4\x02\x85\xff\xd7\x01\xd4\x02\x87\xff\ +\xd7\x01\xd4\x02\x89\xff\xd7\x01\xd4\x02\x8d\xff\xd7\x01\xd4\x02\ +\xb2\xff\xd7\x01\xd4\x02\xb4\xff\xd7\x01\xd4\x02\xc0\xff\xd7\x01\ +\xd4\x02\xc2\xff\xd7\x01\xd4\x02\xc6\xff\xd7\x01\xd4\x02\xc8\xff\ +\xd7\x01\xd4\x02\xd5\xff\xd7\x01\xd4\x02\xe0\xff\xd7\x01\xd4\x02\ +\xf0\xff\xd7\x01\xd4\x02\xf2\xff\xd7\x01\xd4\x02\xf4\xff\xd7\x01\ +\xd4\x02\xfe\xff\xd7\x01\xd4\x03\x0a\xff\xd7\x01\xd4\x03\x0c\xff\ +\xd7\x01\xd4\x03\x16\xff\xd7\x01\xd4\x03\x1a\xff\xd7\x01\xd8\x00\ +\x05\xff\xec\x01\xd8\x00\x0a\xff\xec\x01\xd8\x01\xd0\xff\xd7\x01\ +\xd8\x01\xdc\xff\xec\x01\xd8\x01\xdd\xff\xec\x01\xd8\x01\xdf\xff\ +\xd7\x01\xd8\x01\xe1\xff\xec\x01\xd8\x01\xe4\xff\xec\x01\xd8\x01\ +\xf6\xff\xec\x01\xd8\x02\x07\xff\xec\x01\xd8\x02\x0b\xff\xec\x01\ +\xd8\x02\xa0\xff\xd7\x01\xd8\x02\xaa\xff\xec\x01\xd8\x02\xb6\xff\ +\xec\x01\xd8\x02\xbc\xff\xd7\x01\xd8\x02\xbe\xff\xec\x01\xd8\x02\ +\xc0\xff\xec\x01\xd8\x02\xc2\xff\xec\x01\xd8\x02\xcb\xff\xd7\x01\ +\xd8\x02\xd5\xff\xec\x01\xd8\x02\xe6\xff\xd7\x01\xd8\x02\xf8\xff\ +\xec\x01\xd8\x02\xfa\xff\xec\x01\xd8\x02\xfc\xff\xec\x01\xd8\x02\ +\xfe\xff\xec\x01\xd8\x03\x06\xff\xd7\x01\xd8\x03\x08\xff\xd7\x01\ +\xd8\x03\x0e\xff\xec\x01\xd8\x03\x10\xff\xec\x01\xd8\x03\x18\xff\ +\xec\x01\xda\x00\x05\xff\xec\x01\xda\x00\x0a\xff\xec\x01\xda\x01\ +\xd0\xff\xd7\x01\xda\x01\xdc\xff\xec\x01\xda\x01\xdd\xff\xec\x01\ +\xda\x01\xdf\xff\xd7\x01\xda\x01\xe1\xff\xec\x01\xda\x01\xe4\xff\ +\xec\x01\xda\x01\xf6\xff\xec\x01\xda\x02\x07\xff\xec\x01\xda\x02\ +\x0b\xff\xec\x01\xda\x02\xa0\xff\xd7\x01\xda\x02\xaa\xff\xec\x01\ +\xda\x02\xb6\xff\xec\x01\xda\x02\xbc\xff\xd7\x01\xda\x02\xbe\xff\ +\xec\x01\xda\x02\xc0\xff\xec\x01\xda\x02\xc2\xff\xec\x01\xda\x02\ +\xcb\xff\xd7\x01\xda\x02\xd5\xff\xec\x01\xda\x02\xe6\xff\xd7\x01\ +\xda\x02\xf8\xff\xec\x01\xda\x02\xfa\xff\xec\x01\xda\x02\xfc\xff\ +\xec\x01\xda\x02\xfe\xff\xec\x01\xda\x03\x06\xff\xd7\x01\xda\x03\ +\x08\xff\xd7\x01\xda\x03\x0e\xff\xec\x01\xda\x03\x10\xff\xec\x01\ +\xda\x03\x18\xff\xec\x01\xdc\x00\x0f\xff\x9a\x01\xdc\x00\x10\xff\ +\xd7\x01\xdc\x00\x11\xff\x9a\x01\xdc\x01\xce\xff\xc3\x01\xdc\x01\ +\xcf\xff\xec\x01\xdc\x01\xd5\xff\xc3\x01\xdc\x01\xd8\xff\xec\x01\ +\xdc\x01\xdb\xff\xec\x01\xdc\x01\xde\xff\xec\x01\xdc\x01\xea\xff\ +\xec\x01\xdc\x01\xed\xff\xec\x01\xdc\x01\xf2\xff\xc3\x01\xdc\x02\ +\x02\xff\xd7\x01\xdc\x02\x03\xff\xd7\x01\xdc\x02\x04\xff\xd7\x01\ +\xdc\x02\x08\xff\x9a\x01\xdc\x02\x0c\xff\x9a\x01\xdc\x02j\xff\ +\xec\x01\xdc\x02s\xff\xc3\x01\xdc\x02\x7f\xff\xec\x01\xdc\x02\ +\x85\xff\xec\x01\xdc\x02\x87\xff\xec\x01\xdc\x02\x89\xff\xec\x01\ +\xdc\x02\x8d\xff\xec\x01\xdc\x02\xb2\xff\xec\x01\xdc\x02\xb4\xff\ +\xec\x01\xdc\x02\xcf\xff\xc3\x01\xdc\x02\xe0\xff\xec\x01\xdc\x02\ +\xf0\xff\xec\x01\xdc\x02\xf2\xff\xec\x01\xdc\x02\xf4\xff\xec\x01\ +\xdc\x03\x0a\xff\xec\x01\xdc\x03\x0c\xff\xec\x01\xdc\x03\x12\xff\ +\xc3\x01\xdc\x03\x16\xff\xec\x01\xdc\x03\x1a\xff\xec\x01\xdc\x03\ +\x1c\xff\xc3\x01\xdd\x00\x0f\xff\xae\x01\xdd\x00\x11\xff\xae\x01\ +\xdd\x01\xce\xff\xd7\x01\xdd\x01\xd5\xff\xd7\x01\xdd\x01\xf2\xff\ +\xd7\x01\xdd\x02\x08\xff\xae\x01\xdd\x02\x0c\xff\xae\x01\xdd\x02\ +s\xff\xd7\x01\xdd\x02\xcf\xff\xd7\x01\xdd\x03\x12\xff\xd7\x01\ +\xdd\x03\x1c\xff\xd7\x01\xde\x00\x05\xff\xec\x01\xde\x00\x0a\xff\ +\xec\x01\xde\x01\xd0\xff\xd7\x01\xde\x01\xdc\xff\xec\x01\xde\x01\ +\xdd\xff\xec\x01\xde\x01\xdf\xff\xd7\x01\xde\x01\xe1\xff\xec\x01\ +\xde\x01\xe4\xff\xec\x01\xde\x01\xf6\xff\xec\x01\xde\x02\x07\xff\ +\xec\x01\xde\x02\x0b\xff\xec\x01\xde\x02\xa0\xff\xd7\x01\xde\x02\ +\xaa\xff\xec\x01\xde\x02\xb6\xff\xec\x01\xde\x02\xbc\xff\xd7\x01\ +\xde\x02\xbe\xff\xec\x01\xde\x02\xc0\xff\xec\x01\xde\x02\xc2\xff\ +\xec\x01\xde\x02\xcb\xff\xd7\x01\xde\x02\xd5\xff\xec\x01\xde\x02\ +\xe6\xff\xd7\x01\xde\x02\xf8\xff\xec\x01\xde\x02\xfa\xff\xec\x01\ +\xde\x02\xfc\xff\xec\x01\xde\x02\xfe\xff\xec\x01\xde\x03\x06\xff\ +\xd7\x01\xde\x03\x08\xff\xd7\x01\xde\x03\x0e\xff\xec\x01\xde\x03\ +\x10\xff\xec\x01\xde\x03\x18\xff\xec\x01\xdf\x01\xcf\xff\xd7\x01\ +\xdf\x01\xd8\xff\xd7\x01\xdf\x01\xdb\xff\xd7\x01\xdf\x01\xde\xff\ +\xd7\x01\xdf\x01\xe1\xff\xd7\x01\xdf\x01\xea\xff\xd7\x01\xdf\x01\ +\xed\xff\xd7\x01\xdf\x02j\xff\xd7\x01\xdf\x02\x7f\xff\xd7\x01\ +\xdf\x02\x85\xff\xd7\x01\xdf\x02\x87\xff\xd7\x01\xdf\x02\x89\xff\ +\xd7\x01\xdf\x02\x8d\xff\xd7\x01\xdf\x02\xb2\xff\xd7\x01\xdf\x02\ +\xb4\xff\xd7\x01\xdf\x02\xc0\xff\xd7\x01\xdf\x02\xc2\xff\xd7\x01\ +\xdf\x02\xc6\xff\xd7\x01\xdf\x02\xc8\xff\xd7\x01\xdf\x02\xd5\xff\ +\xd7\x01\xdf\x02\xe0\xff\xd7\x01\xdf\x02\xf0\xff\xd7\x01\xdf\x02\ +\xf2\xff\xd7\x01\xdf\x02\xf4\xff\xd7\x01\xdf\x02\xfe\xff\xd7\x01\ +\xdf\x03\x0a\xff\xd7\x01\xdf\x03\x0c\xff\xd7\x01\xdf\x03\x16\xff\ +\xd7\x01\xdf\x03\x1a\xff\xd7\x01\xe0\x00\x05\xff\xec\x01\xe0\x00\ +\x0a\xff\xec\x01\xe0\x02\x07\xff\xec\x01\xe0\x02\x0b\xff\xec\x01\ +\xe3\x00\x05\xff\xec\x01\xe3\x00\x0a\xff\xec\x01\xe3\x02\x07\xff\ +\xec\x01\xe3\x02\x0b\xff\xec\x01\xe4\x00\x05\xff\x85\x01\xe4\x00\ +\x0a\xff\x85\x01\xe4\x01\xd0\xff\xd7\x01\xe4\x01\xdc\xff\x9a\x01\ +\xe4\x01\xdd\xff\xc3\x01\xe4\x01\xdf\xff\xd7\x01\xe4\x01\xe1\xff\ +\xae\x01\xe4\x01\xe4\xff\x9a\x01\xe4\x01\xf6\xff\xc3\x01\xe4\x02\ +\x07\xff\x85\x01\xe4\x02\x0b\xff\x85\x01\xe4\x02m\xff\xd7\x01\ +\xe4\x02\x81\xff\xd7\x01\xe4\x02\x83\xff\xd7\x01\xe4\x02\x8b\xff\ +\xd7\x01\xe4\x02\xa0\xff\xd7\x01\xe4\x02\xaa\xff\x9a\x01\xe4\x02\ +\xb6\xff\x9a\x01\xe4\x02\xb8\xff\xc3\x01\xe4\x02\xba\xff\xc3\x01\ +\xe4\x02\xbc\xff\xd7\x01\xe4\x02\xbe\xff\x9a\x01\xe4\x02\xc0\xff\ +\xae\x01\xe4\x02\xc2\xff\xae\x01\xe4\x02\xc6\xff\xd7\x01\xe4\x02\ +\xc8\xff\xd7\x01\xe4\x02\xcb\xff\xd7\x01\xe4\x02\xd5\xff\xae\x01\ +\xe4\x02\xe6\xff\xd7\x01\xe4\x02\xea\xff\xd7\x01\xe4\x02\xf8\xff\ +\xc3\x01\xe4\x02\xfa\xff\xc3\x01\xe4\x02\xfc\xff\xc3\x01\xe4\x02\ +\xfe\xff\xae\x01\xe4\x03\x06\xff\xd7\x01\xe4\x03\x08\xff\xd7\x01\ +\xe4\x03\x0e\xff\x9a\x01\xe4\x03\x10\xff\x9a\x01\xe4\x03\x18\xff\ +\x9a\x01\xe6\x00\x05\xff\x85\x01\xe6\x00\x0a\xff\x85\x01\xe6\x01\ +\xd0\xff\xd7\x01\xe6\x01\xdc\xff\x9a\x01\xe6\x01\xdd\xff\xc3\x01\ +\xe6\x01\xdf\xff\xd7\x01\xe6\x01\xe1\xff\xae\x01\xe6\x01\xe4\xff\ +\x9a\x01\xe6\x01\xf6\xff\xc3\x01\xe6\x02\x07\xff\x85\x01\xe6\x02\ +\x0b\xff\x85\x01\xe6\x02m\xff\xd7\x01\xe6\x02\x81\xff\xd7\x01\ +\xe6\x02\x83\xff\xd7\x01\xe6\x02\x8b\xff\xd7\x01\xe6\x02\xa0\xff\ +\xd7\x01\xe6\x02\xaa\xff\x9a\x01\xe6\x02\xb6\xff\x9a\x01\xe6\x02\ +\xb8\xff\xc3\x01\xe6\x02\xba\xff\xc3\x01\xe6\x02\xbc\xff\xd7\x01\ +\xe6\x02\xbe\xff\x9a\x01\xe6\x02\xc0\xff\xae\x01\xe6\x02\xc2\xff\ +\xae\x01\xe6\x02\xc6\xff\xd7\x01\xe6\x02\xc8\xff\xd7\x01\xe6\x02\ +\xcb\xff\xd7\x01\xe6\x02\xd5\xff\xae\x01\xe6\x02\xe6\xff\xd7\x01\ +\xe6\x02\xea\xff\xd7\x01\xe6\x02\xf8\xff\xc3\x01\xe6\x02\xfa\xff\ +\xc3\x01\xe6\x02\xfc\xff\xc3\x01\xe6\x02\xfe\xff\xae\x01\xe6\x03\ +\x06\xff\xd7\x01\xe6\x03\x08\xff\xd7\x01\xe6\x03\x0e\xff\x9a\x01\ +\xe6\x03\x10\xff\x9a\x01\xe6\x03\x18\xff\x9a\x01\xe7\x00\x05\xff\ +\xec\x01\xe7\x00\x0a\xff\xec\x01\xe7\x01\xd0\xff\xd7\x01\xe7\x01\ +\xdc\xff\xec\x01\xe7\x01\xdd\xff\xec\x01\xe7\x01\xdf\xff\xd7\x01\ +\xe7\x01\xe1\xff\xec\x01\xe7\x01\xe4\xff\xec\x01\xe7\x01\xf6\xff\ +\xec\x01\xe7\x02\x07\xff\xec\x01\xe7\x02\x0b\xff\xec\x01\xe7\x02\ +\xa0\xff\xd7\x01\xe7\x02\xaa\xff\xec\x01\xe7\x02\xb6\xff\xec\x01\ +\xe7\x02\xbc\xff\xd7\x01\xe7\x02\xbe\xff\xec\x01\xe7\x02\xc0\xff\ +\xec\x01\xe7\x02\xc2\xff\xec\x01\xe7\x02\xcb\xff\xd7\x01\xe7\x02\ +\xd5\xff\xec\x01\xe7\x02\xe6\xff\xd7\x01\xe7\x02\xf8\xff\xec\x01\ +\xe7\x02\xfa\xff\xec\x01\xe7\x02\xfc\xff\xec\x01\xe7\x02\xfe\xff\ +\xec\x01\xe7\x03\x06\xff\xd7\x01\xe7\x03\x08\xff\xd7\x01\xe7\x03\ +\x0e\xff\xec\x01\xe7\x03\x10\xff\xec\x01\xe7\x03\x18\xff\xec\x01\ +\xe8\x00\x05\xff\xec\x01\xe8\x00\x0a\xff\xec\x01\xe8\x01\xd0\xff\ +\xd7\x01\xe8\x01\xdc\xff\xec\x01\xe8\x01\xdd\xff\xec\x01\xe8\x01\ +\xdf\xff\xd7\x01\xe8\x01\xe1\xff\xec\x01\xe8\x01\xe4\xff\xec\x01\ +\xe8\x01\xf6\xff\xec\x01\xe8\x02\x07\xff\xec\x01\xe8\x02\x0b\xff\ +\xec\x01\xe8\x02\xa0\xff\xd7\x01\xe8\x02\xaa\xff\xec\x01\xe8\x02\ +\xb6\xff\xec\x01\xe8\x02\xbc\xff\xd7\x01\xe8\x02\xbe\xff\xec\x01\ +\xe8\x02\xc0\xff\xec\x01\xe8\x02\xc2\xff\xec\x01\xe8\x02\xcb\xff\ +\xd7\x01\xe8\x02\xd5\xff\xec\x01\xe8\x02\xe6\xff\xd7\x01\xe8\x02\ +\xf8\xff\xec\x01\xe8\x02\xfa\xff\xec\x01\xe8\x02\xfc\xff\xec\x01\ +\xe8\x02\xfe\xff\xec\x01\xe8\x03\x06\xff\xd7\x01\xe8\x03\x08\xff\ +\xd7\x01\xe8\x03\x0e\xff\xec\x01\xe8\x03\x10\xff\xec\x01\xe8\x03\ +\x18\xff\xec\x01\xea\x00\x05\xff\xec\x01\xea\x00\x0a\xff\xec\x01\ +\xea\x02\x07\xff\xec\x01\xea\x02\x0b\xff\xec\x01\xeb\x00\x05\xff\ +\xec\x01\xeb\x00\x0a\xff\xec\x01\xeb\x02\x07\xff\xec\x01\xeb\x02\ +\x0b\xff\xec\x01\xeb\x03\x0e\xff\xd7\x01\xeb\x03\x10\xff\xd7\x01\ +\xec\x00\x0f\xff\x9a\x01\xec\x00\x10\xff\xd7\x01\xec\x00\x11\xff\ +\x9a\x01\xec\x01\xce\xff\xc3\x01\xec\x01\xcf\xff\xec\x01\xec\x01\ +\xd5\xff\xc3\x01\xec\x01\xd8\xff\xec\x01\xec\x01\xdb\xff\xec\x01\ +\xec\x01\xde\xff\xec\x01\xec\x01\xea\xff\xec\x01\xec\x01\xed\xff\ +\xec\x01\xec\x01\xf2\xff\xc3\x01\xec\x02\x02\xff\xd7\x01\xec\x02\ +\x03\xff\xd7\x01\xec\x02\x04\xff\xd7\x01\xec\x02\x08\xff\x9a\x01\ +\xec\x02\x0c\xff\x9a\x01\xec\x02j\xff\xec\x01\xec\x02s\xff\ +\xc3\x01\xec\x02\x7f\xff\xec\x01\xec\x02\x85\xff\xec\x01\xec\x02\ +\x87\xff\xec\x01\xec\x02\x89\xff\xec\x01\xec\x02\x8d\xff\xec\x01\ +\xec\x02\xb2\xff\xec\x01\xec\x02\xb4\xff\xec\x01\xec\x02\xcf\xff\ +\xc3\x01\xec\x02\xe0\xff\xec\x01\xec\x02\xf0\xff\xec\x01\xec\x02\ +\xf2\xff\xec\x01\xec\x02\xf4\xff\xec\x01\xec\x03\x0a\xff\xec\x01\ +\xec\x03\x0c\xff\xec\x01\xec\x03\x12\xff\xc3\x01\xec\x03\x16\xff\ +\xec\x01\xec\x03\x1a\xff\xec\x01\xec\x03\x1c\xff\xc3\x01\xf2\x00\ +\x05\xff\x85\x01\xf2\x00\x0a\xff\x85\x01\xf2\x01\xd0\xff\xd7\x01\ +\xf2\x01\xdc\xff\x9a\x01\xf2\x01\xdd\xff\xc3\x01\xf2\x01\xdf\xff\ +\xd7\x01\xf2\x01\xe1\xff\xae\x01\xf2\x01\xe4\xff\x9a\x01\xf2\x01\ +\xf6\xff\xc3\x01\xf2\x02\x07\xff\x85\x01\xf2\x02\x0b\xff\x85\x01\ +\xf2\x02m\xff\xd7\x01\xf2\x02\x81\xff\xd7\x01\xf2\x02\x83\xff\ +\xd7\x01\xf2\x02\x8b\xff\xd7\x01\xf2\x02\xa0\xff\xd7\x01\xf2\x02\ +\xaa\xff\x9a\x01\xf2\x02\xb6\xff\x9a\x01\xf2\x02\xb8\xff\xc3\x01\ +\xf2\x02\xba\xff\xc3\x01\xf2\x02\xbc\xff\xd7\x01\xf2\x02\xbe\xff\ +\x9a\x01\xf2\x02\xc0\xff\xae\x01\xf2\x02\xc2\xff\xae\x01\xf2\x02\ +\xc6\xff\xd7\x01\xf2\x02\xc8\xff\xd7\x01\xf2\x02\xcb\xff\xd7\x01\ +\xf2\x02\xd5\xff\xae\x01\xf2\x02\xe6\xff\xd7\x01\xf2\x02\xea\xff\ +\xd7\x01\xf2\x02\xf8\xff\xc3\x01\xf2\x02\xfa\xff\xc3\x01\xf2\x02\ +\xfc\xff\xc3\x01\xf2\x02\xfe\xff\xae\x01\xf2\x03\x06\xff\xd7\x01\ +\xf2\x03\x08\xff\xd7\x01\xf2\x03\x0e\xff\x9a\x01\xf2\x03\x10\xff\ +\x9a\x01\xf2\x03\x18\xff\x9a\x01\xf3\x00\x05\xff\x85\x01\xf3\x00\ +\x0a\xff\x85\x01\xf3\x01\xd0\xff\xd7\x01\xf3\x01\xdc\xff\x9a\x01\ +\xf3\x01\xdd\xff\xc3\x01\xf3\x01\xdf\xff\xd7\x01\xf3\x01\xe1\xff\ +\xae\x01\xf3\x01\xe4\xff\x9a\x01\xf3\x01\xf6\xff\xc3\x01\xf3\x02\ +\x07\xff\x85\x01\xf3\x02\x0b\xff\x85\x01\xf3\x02m\xff\xd7\x01\ +\xf3\x02\x81\xff\xd7\x01\xf3\x02\x83\xff\xd7\x01\xf3\x02\x8b\xff\ +\xd7\x01\xf3\x02\xa0\xff\xd7\x01\xf3\x02\xaa\xff\x9a\x01\xf3\x02\ +\xb6\xff\x9a\x01\xf3\x02\xb8\xff\xc3\x01\xf3\x02\xba\xff\xc3\x01\ +\xf3\x02\xbc\xff\xd7\x01\xf3\x02\xbe\xff\x9a\x01\xf3\x02\xc0\xff\ +\xae\x01\xf3\x02\xc2\xff\xae\x01\xf3\x02\xc6\xff\xd7\x01\xf3\x02\ +\xc8\xff\xd7\x01\xf3\x02\xcb\xff\xd7\x01\xf3\x02\xd5\xff\xae\x01\ +\xf3\x02\xe6\xff\xd7\x01\xf3\x02\xea\xff\xd7\x01\xf3\x02\xf8\xff\ +\xc3\x01\xf3\x02\xfa\xff\xc3\x01\xf3\x02\xfc\xff\xc3\x01\xf3\x02\ +\xfe\xff\xae\x01\xf3\x03\x06\xff\xd7\x01\xf3\x03\x08\xff\xd7\x01\ +\xf3\x03\x0e\xff\x9a\x01\xf3\x03\x10\xff\x9a\x01\xf3\x03\x18\xff\ +\x9a\x01\xf4\x00\x05\xff\xec\x01\xf4\x00\x0a\xff\xec\x01\xf4\x02\ +\x07\xff\xec\x01\xf4\x02\x0b\xff\xec\x01\xf4\x03\x0e\xff\xd7\x01\ +\xf4\x03\x10\xff\xd7\x01\xf5\x01\xcf\xff\xd7\x01\xf5\x01\xd8\xff\ +\xd7\x01\xf5\x01\xdb\xff\xd7\x01\xf5\x01\xde\xff\xd7\x01\xf5\x01\ +\xe1\xff\xd7\x01\xf5\x01\xea\xff\xd7\x01\xf5\x01\xed\xff\xd7\x01\ +\xf5\x02j\xff\xd7\x01\xf5\x02\x7f\xff\xd7\x01\xf5\x02\x85\xff\ +\xd7\x01\xf5\x02\x87\xff\xd7\x01\xf5\x02\x89\xff\xd7\x01\xf5\x02\ +\x8d\xff\xd7\x01\xf5\x02\xb2\xff\xd7\x01\xf5\x02\xb4\xff\xd7\x01\ +\xf5\x02\xc0\xff\xd7\x01\xf5\x02\xc2\xff\xd7\x01\xf5\x02\xc6\xff\ +\xd7\x01\xf5\x02\xc8\xff\xd7\x01\xf5\x02\xd5\xff\xd7\x01\xf5\x02\ +\xe0\xff\xd7\x01\xf5\x02\xf0\xff\xd7\x01\xf5\x02\xf2\xff\xd7\x01\ +\xf5\x02\xf4\xff\xd7\x01\xf5\x02\xfe\xff\xd7\x01\xf5\x03\x0a\xff\ +\xd7\x01\xf5\x03\x0c\xff\xd7\x01\xf5\x03\x16\xff\xd7\x01\xf5\x03\ +\x1a\xff\xd7\x01\xf6\x00\x0f\xff\xae\x01\xf6\x00\x11\xff\xae\x01\ +\xf6\x01\xce\xff\xd7\x01\xf6\x01\xd5\xff\xd7\x01\xf6\x01\xf2\xff\ +\xd7\x01\xf6\x02\x08\xff\xae\x01\xf6\x02\x0c\xff\xae\x01\xf6\x02\ +s\xff\xd7\x01\xf6\x02\xcf\xff\xd7\x01\xf6\x03\x12\xff\xd7\x01\ +\xf6\x03\x1c\xff\xd7\x01\xf8\x00\x0f\xff\x85\x01\xf8\x00\x10\xff\ +\xae\x01\xf8\x00\x11\xff\x85\x01\xf8\x01\x9f\xff\xd7\x01\xf8\x01\ +\xa4\xff\x9a\x01\xf8\x01\xaa\xffq\x01\xf8\x01\xae\xff\x9a\x01\ +\xf8\x01\xb5\xff\x9a\x01\xf8\x01\xb8\xff\xd7\x01\xf8\x01\xbb\xff\ +\xd7\x01\xf8\x01\xbc\x00)\x01\xf8\x01\xbe\xff\xae\x01\xf8\x01\ +\xcc\xff\x9a\x01\xf8\x01\xcd\xff\x9a\x01\xf8\x01\xce\xff\x85\x01\ +\xf8\x01\xcf\xffq\x01\xf8\x01\xd0\xff\xd7\x01\xf8\x01\xd1\xff\ +\xd7\x01\xf8\x01\xd2\xff\x9a\x01\xf8\x01\xd3\xff\x9a\x01\xf8\x01\ +\xd4\xff\x9a\x01\xf8\x01\xd5\xff\x85\x01\xf8\x01\xd6\xff\x9a\x01\ +\xf8\x01\xd7\xff\x9a\x01\xf8\x01\xd8\xffq\x01\xf8\x01\xd9\xff\ +\x9a\x01\xf8\x01\xda\xff\x9a\x01\xf8\x01\xdb\xffq\x01\xf8\x01\ +\xdc\xff\xae\x01\xf8\x01\xdd\xff\xae\x01\xf8\x01\xde\xffq\x01\ +\xf8\x01\xdf\xff\xd7\x01\xf8\x01\xe0\xff\x9a\x01\xf8\x01\xe1\xff\ +\x9a\x01\xf8\x01\xe2\xff\x9a\x01\xf8\x01\xe3\xff\x9a\x01\xf8\x01\ +\xe4\xff\xae\x01\xf8\x01\xe5\xff\x9a\x01\xf8\x01\xe6\xff\x9a\x01\ +\xf8\x01\xe7\xff\xd7\x01\xf8\x01\xe8\xff\x9a\x01\xf8\x01\xe9\xff\ +\xc3\x01\xf8\x01\xea\xffq\x01\xf8\x01\xec\xff\x9a\x01\xf8\x01\ +\xed\xffq\x01\xf8\x01\xee\xff\x85\x01\xf8\x01\xf2\xff\x85\x01\ +\xf8\x01\xf3\xff\x9a\x01\xf8\x01\xf5\xff\x9a\x01\xf8\x01\xf6\xff\ +\xae\x01\xf8\x01\xf7\xff\x9a\x01\xf8\x01\xf9\xff\x9a\x01\xf8\x02\ +\x02\xff\xae\x01\xf8\x02\x03\xff\xae\x01\xf8\x02\x04\xff\xae\x01\ +\xf8\x02\x08\xff\x85\x01\xf8\x02\x0c\xff\x85\x01\xf8\x02j\xff\ +q\x01\xf8\x02k\xff\x9a\x01\xf8\x02l\xff\xd7\x01\xf8\x02\ +m\xff\xd7\x01\xf8\x02q\xff\x9a\x01\xf8\x02r\xffq\x01\ +\xf8\x02s\xff\x85\x01\xf8\x02u\xff\x9a\x01\xf8\x02w\xff\ +\x9a\x01\xf8\x02y\xff\x9a\x01\xf8\x02}\xff\x9a\x01\xf8\x02\ +~\xff\xd7\x01\xf8\x02\x7f\xffq\x01\xf8\x02\x81\xff\xd7\x01\ +\xf8\x02\x83\xff\xd7\x01\xf8\x02\x84\xff\xd7\x01\xf8\x02\x85\xff\ +q\x01\xf8\x02\x86\xff\xd7\x01\xf8\x02\x87\xffq\x01\xf8\x02\ +\x88\xff\xd7\x01\xf8\x02\x89\xffq\x01\xf8\x02\x8a\xff\xd7\x01\ +\xf8\x02\x8b\xff\xd7\x01\xf8\x02\x8c\xff\xd7\x01\xf8\x02\x8d\xff\ +q\x01\xf8\x02\x96\xff\x9a\x01\xf8\x02\x9a\xff\x9a\x01\xf8\x02\ +\x9e\xff\x9a\x01\xf8\x02\xa0\xff\xd7\x01\xf8\x02\xa2\xff\xd7\x01\ +\xf8\x02\xa4\xff\x9a\x01\xf8\x02\xa6\xff\x9a\x01\xf8\x02\xaa\xff\ +\xae\x01\xf8\x02\xac\xff\x9a\x01\xf8\x02\xae\xff\x9a\x01\xf8\x02\ +\xb0\xff\x9a\x01\xf8\x02\xb1\xff\xd7\x01\xf8\x02\xb2\xffq\x01\ +\xf8\x02\xb3\xff\xd7\x01\xf8\x02\xb4\xffq\x01\xf8\x02\xb5\x00\ +)\x01\xf8\x02\xb6\xff\xae\x01\xf8\x02\xb8\xff\xae\x01\xf8\x02\ +\xba\xff\xae\x01\xf8\x02\xbc\xff\xd7\x01\xf8\x02\xbe\xff\xae\x01\ +\xf8\x02\xc0\xff\x9a\x01\xf8\x02\xc2\xff\x9a\x01\xf8\x02\xc4\xff\ +\x9a\x01\xf8\x02\xc5\xff\x9a\x01\xf8\x02\xc6\xffq\x01\xf8\x02\ +\xc7\xff\x9a\x01\xf8\x02\xc8\xffq\x01\xf8\x02\xcb\xff\xd7\x01\ +\xf8\x02\xcd\xff\x9a\x01\xf8\x02\xce\xff\x9a\x01\xf8\x02\xcf\xff\ +\x85\x01\xf8\x02\xd1\xff\x9a\x01\xf8\x02\xd3\xff\x9a\x01\xf8\x02\ +\xd5\xff\x9a\x01\xf8\x02\xd7\xff\x9a\x01\xf8\x02\xd9\xffq\x01\ +\xf8\x02\xdb\xffq\x01\xf8\x02\xdd\xffq\x01\xf8\x02\xe0\xff\ +q\x01\xf8\x02\xe6\xff\xd7\x01\xf8\x02\xe8\xff\xd7\x01\xf8\x02\ +\xea\xff\xc3\x01\xf8\x02\xec\xff\x9a\x01\xf8\x02\xee\xff\x9a\x01\ +\xf8\x02\xef\xff\xd7\x01\xf8\x02\xf0\xffq\x01\xf8\x02\xf1\xff\ +\xd7\x01\xf8\x02\xf2\xffq\x01\xf8\x02\xf3\xff\xd7\x01\xf8\x02\ +\xf4\xffq\x01\xf8\x02\xf6\xff\xd7\x01\xf8\x02\xf8\xff\xae\x01\ +\xf8\x02\xfa\xff\xae\x01\xf8\x02\xfc\xff\xae\x01\xf8\x02\xfe\xff\ +\x9a\x01\xf8\x03\x00\xff\x9a\x01\xf8\x03\x02\xff\x9a\x01\xf8\x03\ +\x06\xff\xd7\x01\xf8\x03\x08\xff\xd7\x01\xf8\x03\x09\xffq\x01\ +\xf8\x03\x0a\xffq\x01\xf8\x03\x0b\xffq\x01\xf8\x03\x0c\xff\ +q\x01\xf8\x03\x0e\xff\x9a\x01\xf8\x03\x10\xff\x9a\x01\xf8\x03\ +\x11\xff\x9a\x01\xf8\x03\x12\xff\x85\x01\xf8\x03\x14\xff\x9a\x01\ +\xf8\x03\x15\xff\xd7\x01\xf8\x03\x16\xffq\x01\xf8\x03\x18\xff\ +\xae\x01\xf8\x03\x1a\xffq\x01\xf8\x03\x1b\xff\x9a\x01\xf8\x03\ +\x1c\xff\x85\x01\xf9\x00\x0f\xff\x9a\x01\xf9\x00\x10\xff\xd7\x01\ +\xf9\x00\x11\xff\x9a\x01\xf9\x01\xce\xff\xc3\x01\xf9\x01\xcf\xff\ +\xec\x01\xf9\x01\xd5\xff\xc3\x01\xf9\x01\xd8\xff\xec\x01\xf9\x01\ +\xdb\xff\xec\x01\xf9\x01\xde\xff\xec\x01\xf9\x01\xea\xff\xec\x01\ +\xf9\x01\xed\xff\xec\x01\xf9\x01\xf2\xff\xc3\x01\xf9\x02\x02\xff\ +\xd7\x01\xf9\x02\x03\xff\xd7\x01\xf9\x02\x04\xff\xd7\x01\xf9\x02\ +\x08\xff\x9a\x01\xf9\x02\x0c\xff\x9a\x01\xf9\x02j\xff\xec\x01\ +\xf9\x02s\xff\xc3\x01\xf9\x02\x7f\xff\xec\x01\xf9\x02\x85\xff\ +\xec\x01\xf9\x02\x87\xff\xec\x01\xf9\x02\x89\xff\xec\x01\xf9\x02\ +\x8d\xff\xec\x01\xf9\x02\xb2\xff\xec\x01\xf9\x02\xb4\xff\xec\x01\ +\xf9\x02\xcf\xff\xc3\x01\xf9\x02\xe0\xff\xec\x01\xf9\x02\xf0\xff\ +\xec\x01\xf9\x02\xf2\xff\xec\x01\xf9\x02\xf4\xff\xec\x01\xf9\x03\ +\x0a\xff\xec\x01\xf9\x03\x0c\xff\xec\x01\xf9\x03\x12\xff\xc3\x01\ +\xf9\x03\x16\xff\xec\x01\xf9\x03\x1a\xff\xec\x01\xf9\x03\x1c\xff\ +\xc3\x01\xfa\x00\x0f\xff\x9a\x01\xfa\x00\x11\xff\x9a\x01\xfa\x00\ +\x22\x00)\x01\xfa\x00$\xff\xae\x01\xfa\x00&\xff\xec\x01\ +\xfa\x00*\xff\xec\x01\xfa\x002\xff\xec\x01\xfa\x004\xff\ +\xec\x01\xfa\x00D\xff\xd7\x01\xfa\x00F\xff\xd7\x01\xfa\x00\ +G\xff\xd7\x01\xfa\x00H\xff\xd7\x01\xfa\x00J\xff\xec\x01\ +\xfa\x00P\xff\xec\x01\xfa\x00Q\xff\xec\x01\xfa\x00R\xff\ +\xd7\x01\xfa\x00S\xff\xec\x01\xfa\x00T\xff\xd7\x01\xfa\x00\ +U\xff\xec\x01\xfa\x00V\xff\xec\x01\xfa\x00X\xff\xec\x01\ +\xfa\x00\x82\xff\xae\x01\xfa\x00\x83\xff\xae\x01\xfa\x00\x84\xff\ +\xae\x01\xfa\x00\x85\xff\xae\x01\xfa\x00\x86\xff\xae\x01\xfa\x00\ +\x87\xff\xae\x01\xfa\x00\x89\xff\xec\x01\xfa\x00\x94\xff\xec\x01\ +\xfa\x00\x95\xff\xec\x01\xfa\x00\x96\xff\xec\x01\xfa\x00\x97\xff\ +\xec\x01\xfa\x00\x98\xff\xec\x01\xfa\x00\x9a\xff\xec\x01\xfa\x00\ +\xa2\xff\xd7\x01\xfa\x00\xa3\xff\xd7\x01\xfa\x00\xa4\xff\xd7\x01\ +\xfa\x00\xa5\xff\xd7\x01\xfa\x00\xa6\xff\xd7\x01\xfa\x00\xa7\xff\ +\xd7\x01\xfa\x00\xa8\xff\xd7\x01\xfa\x00\xa9\xff\xd7\x01\xfa\x00\ +\xaa\xff\xd7\x01\xfa\x00\xab\xff\xd7\x01\xfa\x00\xac\xff\xd7\x01\ +\xfa\x00\xad\xff\xd7\x01\xfa\x00\xb4\xff\xd7\x01\xfa\x00\xb5\xff\ +\xd7\x01\xfa\x00\xb6\xff\xd7\x01\xfa\x00\xb7\xff\xd7\x01\xfa\x00\ +\xb8\xff\xd7\x01\xfa\x00\xba\xff\xd7\x01\xfa\x00\xbb\xff\xec\x01\ +\xfa\x00\xbc\xff\xec\x01\xfa\x00\xbd\xff\xec\x01\xfa\x00\xbe\xff\ +\xec\x01\xfa\x00\xc2\xff\xae\x01\xfa\x00\xc3\xff\xd7\x01\xfa\x00\ +\xc4\xff\xae\x01\xfa\x00\xc5\xff\xd7\x01\xfa\x00\xc6\xff\xae\x01\ +\xfa\x00\xc7\xff\xd7\x01\xfa\x00\xc8\xff\xec\x01\xfa\x00\xc9\xff\ +\xd7\x01\xfa\x00\xca\xff\xec\x01\xfa\x00\xcb\xff\xd7\x01\xfa\x00\ +\xcc\xff\xec\x01\xfa\x00\xcd\xff\xd7\x01\xfa\x00\xce\xff\xec\x01\ +\xfa\x00\xcf\xff\xd7\x01\xfa\x00\xd1\xff\xd7\x01\xfa\x00\xd3\xff\ +\xd7\x01\xfa\x00\xd5\xff\xd7\x01\xfa\x00\xd7\xff\xd7\x01\xfa\x00\ +\xd9\xff\xd7\x01\xfa\x00\xdb\xff\xd7\x01\xfa\x00\xdd\xff\xd7\x01\ +\xfa\x00\xde\xff\xec\x01\xfa\x00\xdf\xff\xec\x01\xfa\x00\xe0\xff\ +\xec\x01\xfa\x00\xe1\xff\xec\x01\xfa\x00\xe2\xff\xec\x01\xfa\x00\ +\xe3\xff\xec\x01\xfa\x00\xe4\xff\xec\x01\xfa\x00\xe5\xff\xec\x01\ +\xfa\x00\xfa\xff\xec\x01\xfa\x01\x06\xff\xec\x01\xfa\x01\x08\xff\ +\xec\x01\xfa\x01\x0d\xff\xec\x01\xfa\x01\x0e\xff\xec\x01\xfa\x01\ +\x0f\xff\xd7\x01\xfa\x01\x10\xff\xec\x01\xfa\x01\x11\xff\xd7\x01\ +\xfa\x01\x12\xff\xec\x01\xfa\x01\x13\xff\xd7\x01\xfa\x01\x14\xff\ +\xec\x01\xfa\x01\x15\xff\xd7\x01\xfa\x01\x17\xff\xec\x01\xfa\x01\ +\x19\xff\xec\x01\xfa\x01\x1d\xff\xec\x01\xfa\x01!\xff\xec\x01\ +\xfa\x01+\xff\xec\x01\xfa\x01-\xff\xec\x01\xfa\x01/\xff\ +\xec\x01\xfa\x011\xff\xec\x01\xfa\x013\xff\xec\x01\xfa\x01\ +5\xff\xec\x01\xfa\x01C\xff\xae\x01\xfa\x01D\xff\xd7\x01\ +\xfa\x01F\xff\xd7\x01\xfa\x01G\xff\xec\x01\xfa\x01H\xff\ +\xd7\x01\xfa\x01J\xff\xec\x01\xfa\x02\x08\xff\x9a\x01\xfa\x02\ +\x0c\xff\x9a\x01\xfa\x02W\xff\xec\x01\xfa\x02X\xff\xae\x01\ +\xfa\x02Y\xff\xd7\x01\xfa\x02_\xff\xec\x01\xfa\x02`\xff\ +\xd7\x01\xfa\x02b\xff\xec\x01\xfa\x03\x1d\xff\xae\x01\xfa\x03\ +\x1e\xff\xd7\x01\xfa\x03\x1f\xff\xae\x01\xfa\x03 \xff\xd7\x01\ +\xfa\x03!\xff\xae\x01\xfa\x03\x22\xff\xd7\x01\xfa\x03#\xff\ +\xae\x01\xfa\x03%\xff\xae\x01\xfa\x03&\xff\xd7\x01\xfa\x03\ +'\xff\xae\x01\xfa\x03(\xff\xd7\x01\xfa\x03)\xff\xae\x01\ +\xfa\x03*\xff\xd7\x01\xfa\x03+\xff\xae\x01\xfa\x03,\xff\ +\xd7\x01\xfa\x03-\xff\xae\x01\xfa\x03.\xff\xd7\x01\xfa\x03\ +/\xff\xae\x01\xfa\x030\xff\xd7\x01\xfa\x031\xff\xae\x01\ +\xfa\x032\xff\xd7\x01\xfa\x033\xff\xae\x01\xfa\x034\xff\ +\xd7\x01\xfa\x036\xff\xd7\x01\xfa\x038\xff\xd7\x01\xfa\x03\ +:\xff\xd7\x01\xfa\x03<\xff\xd7\x01\xfa\x03@\xff\xd7\x01\ +\xfa\x03B\xff\xd7\x01\xfa\x03D\xff\xd7\x01\xfa\x03I\xff\ +\xec\x01\xfa\x03J\xff\xd7\x01\xfa\x03K\xff\xec\x01\xfa\x03\ +L\xff\xd7\x01\xfa\x03M\xff\xec\x01\xfa\x03N\xff\xd7\x01\ +\xfa\x03O\xff\xec\x01\xfa\x03Q\xff\xec\x01\xfa\x03R\xff\ +\xd7\x01\xfa\x03S\xff\xec\x01\xfa\x03T\xff\xd7\x01\xfa\x03\ +U\xff\xec\x01\xfa\x03V\xff\xd7\x01\xfa\x03W\xff\xec\x01\ +\xfa\x03X\xff\xd7\x01\xfa\x03Y\xff\xec\x01\xfa\x03Z\xff\ +\xd7\x01\xfa\x03[\xff\xec\x01\xfa\x03\x5c\xff\xd7\x01\xfa\x03\ +]\xff\xec\x01\xfa\x03^\xff\xd7\x01\xfa\x03_\xff\xec\x01\ +\xfa\x03`\xff\xd7\x01\xfa\x03b\xff\xec\x01\xfa\x03d\xff\ +\xec\x01\xfa\x03f\xff\xec\x01\xfa\x03h\xff\xec\x01\xfa\x03\ +j\xff\xec\x01\xfa\x03l\xff\xec\x01\xfa\x03n\xff\xec\x01\ +\xfb\x00\x05\x00R\x01\xfb\x00\x0a\x00R\x01\xfb\x00\x0f\xff\ +\xae\x01\xfb\x00\x11\xff\xae\x01\xfb\x00\x22\x00)\x01\xfb\x02\ +\x07\x00R\x01\xfb\x02\x08\xff\xae\x01\xfb\x02\x0b\x00R\x01\ +\xfb\x02\x0c\xff\xae\x01\xfc\x00\x0f\xff\x9a\x01\xfc\x00\x11\xff\ +\x9a\x01\xfc\x00\x22\x00)\x01\xfc\x00$\xff\xae\x01\xfc\x00\ +&\xff\xec\x01\xfc\x00*\xff\xec\x01\xfc\x002\xff\xec\x01\ +\xfc\x004\xff\xec\x01\xfc\x00D\xff\xd7\x01\xfc\x00F\xff\ +\xd7\x01\xfc\x00G\xff\xd7\x01\xfc\x00H\xff\xd7\x01\xfc\x00\ +J\xff\xec\x01\xfc\x00P\xff\xec\x01\xfc\x00Q\xff\xec\x01\ +\xfc\x00R\xff\xd7\x01\xfc\x00S\xff\xec\x01\xfc\x00T\xff\ +\xd7\x01\xfc\x00U\xff\xec\x01\xfc\x00V\xff\xec\x01\xfc\x00\ +X\xff\xec\x01\xfc\x00\x82\xff\xae\x01\xfc\x00\x83\xff\xae\x01\ +\xfc\x00\x84\xff\xae\x01\xfc\x00\x85\xff\xae\x01\xfc\x00\x86\xff\ +\xae\x01\xfc\x00\x87\xff\xae\x01\xfc\x00\x89\xff\xec\x01\xfc\x00\ +\x94\xff\xec\x01\xfc\x00\x95\xff\xec\x01\xfc\x00\x96\xff\xec\x01\ +\xfc\x00\x97\xff\xec\x01\xfc\x00\x98\xff\xec\x01\xfc\x00\x9a\xff\ +\xec\x01\xfc\x00\xa2\xff\xd7\x01\xfc\x00\xa3\xff\xd7\x01\xfc\x00\ +\xa4\xff\xd7\x01\xfc\x00\xa5\xff\xd7\x01\xfc\x00\xa6\xff\xd7\x01\ +\xfc\x00\xa7\xff\xd7\x01\xfc\x00\xa8\xff\xd7\x01\xfc\x00\xa9\xff\ +\xd7\x01\xfc\x00\xaa\xff\xd7\x01\xfc\x00\xab\xff\xd7\x01\xfc\x00\ +\xac\xff\xd7\x01\xfc\x00\xad\xff\xd7\x01\xfc\x00\xb4\xff\xd7\x01\ +\xfc\x00\xb5\xff\xd7\x01\xfc\x00\xb6\xff\xd7\x01\xfc\x00\xb7\xff\ +\xd7\x01\xfc\x00\xb8\xff\xd7\x01\xfc\x00\xba\xff\xd7\x01\xfc\x00\ +\xbb\xff\xec\x01\xfc\x00\xbc\xff\xec\x01\xfc\x00\xbd\xff\xec\x01\ +\xfc\x00\xbe\xff\xec\x01\xfc\x00\xc2\xff\xae\x01\xfc\x00\xc3\xff\ +\xd7\x01\xfc\x00\xc4\xff\xae\x01\xfc\x00\xc5\xff\xd7\x01\xfc\x00\ +\xc6\xff\xae\x01\xfc\x00\xc7\xff\xd7\x01\xfc\x00\xc8\xff\xec\x01\ +\xfc\x00\xc9\xff\xd7\x01\xfc\x00\xca\xff\xec\x01\xfc\x00\xcb\xff\ +\xd7\x01\xfc\x00\xcc\xff\xec\x01\xfc\x00\xcd\xff\xd7\x01\xfc\x00\ +\xce\xff\xec\x01\xfc\x00\xcf\xff\xd7\x01\xfc\x00\xd1\xff\xd7\x01\ +\xfc\x00\xd3\xff\xd7\x01\xfc\x00\xd5\xff\xd7\x01\xfc\x00\xd7\xff\ +\xd7\x01\xfc\x00\xd9\xff\xd7\x01\xfc\x00\xdb\xff\xd7\x01\xfc\x00\ +\xdd\xff\xd7\x01\xfc\x00\xde\xff\xec\x01\xfc\x00\xdf\xff\xec\x01\ +\xfc\x00\xe0\xff\xec\x01\xfc\x00\xe1\xff\xec\x01\xfc\x00\xe2\xff\ +\xec\x01\xfc\x00\xe3\xff\xec\x01\xfc\x00\xe4\xff\xec\x01\xfc\x00\ +\xe5\xff\xec\x01\xfc\x00\xfa\xff\xec\x01\xfc\x01\x06\xff\xec\x01\ +\xfc\x01\x08\xff\xec\x01\xfc\x01\x0d\xff\xec\x01\xfc\x01\x0e\xff\ +\xec\x01\xfc\x01\x0f\xff\xd7\x01\xfc\x01\x10\xff\xec\x01\xfc\x01\ +\x11\xff\xd7\x01\xfc\x01\x12\xff\xec\x01\xfc\x01\x13\xff\xd7\x01\ +\xfc\x01\x14\xff\xec\x01\xfc\x01\x15\xff\xd7\x01\xfc\x01\x17\xff\ +\xec\x01\xfc\x01\x19\xff\xec\x01\xfc\x01\x1d\xff\xec\x01\xfc\x01\ +!\xff\xec\x01\xfc\x01+\xff\xec\x01\xfc\x01-\xff\xec\x01\ +\xfc\x01/\xff\xec\x01\xfc\x011\xff\xec\x01\xfc\x013\xff\ +\xec\x01\xfc\x015\xff\xec\x01\xfc\x01C\xff\xae\x01\xfc\x01\ +D\xff\xd7\x01\xfc\x01F\xff\xd7\x01\xfc\x01G\xff\xec\x01\ +\xfc\x01H\xff\xd7\x01\xfc\x01J\xff\xec\x01\xfc\x02\x08\xff\ +\x9a\x01\xfc\x02\x0c\xff\x9a\x01\xfc\x02W\xff\xec\x01\xfc\x02\ +X\xff\xae\x01\xfc\x02Y\xff\xd7\x01\xfc\x02_\xff\xec\x01\ +\xfc\x02`\xff\xd7\x01\xfc\x02b\xff\xec\x01\xfc\x03\x1d\xff\ +\xae\x01\xfc\x03\x1e\xff\xd7\x01\xfc\x03\x1f\xff\xae\x01\xfc\x03\ + \xff\xd7\x01\xfc\x03!\xff\xae\x01\xfc\x03\x22\xff\xd7\x01\ +\xfc\x03#\xff\xae\x01\xfc\x03%\xff\xae\x01\xfc\x03&\xff\ +\xd7\x01\xfc\x03'\xff\xae\x01\xfc\x03(\xff\xd7\x01\xfc\x03\ +)\xff\xae\x01\xfc\x03*\xff\xd7\x01\xfc\x03+\xff\xae\x01\ +\xfc\x03,\xff\xd7\x01\xfc\x03-\xff\xae\x01\xfc\x03.\xff\ +\xd7\x01\xfc\x03/\xff\xae\x01\xfc\x030\xff\xd7\x01\xfc\x03\ +1\xff\xae\x01\xfc\x032\xff\xd7\x01\xfc\x033\xff\xae\x01\ +\xfc\x034\xff\xd7\x01\xfc\x036\xff\xd7\x01\xfc\x038\xff\ +\xd7\x01\xfc\x03:\xff\xd7\x01\xfc\x03<\xff\xd7\x01\xfc\x03\ +@\xff\xd7\x01\xfc\x03B\xff\xd7\x01\xfc\x03D\xff\xd7\x01\ +\xfc\x03I\xff\xec\x01\xfc\x03J\xff\xd7\x01\xfc\x03K\xff\ +\xec\x01\xfc\x03L\xff\xd7\x01\xfc\x03M\xff\xec\x01\xfc\x03\ +N\xff\xd7\x01\xfc\x03O\xff\xec\x01\xfc\x03Q\xff\xec\x01\ +\xfc\x03R\xff\xd7\x01\xfc\x03S\xff\xec\x01\xfc\x03T\xff\ +\xd7\x01\xfc\x03U\xff\xec\x01\xfc\x03V\xff\xd7\x01\xfc\x03\ +W\xff\xec\x01\xfc\x03X\xff\xd7\x01\xfc\x03Y\xff\xec\x01\ +\xfc\x03Z\xff\xd7\x01\xfc\x03[\xff\xec\x01\xfc\x03\x5c\xff\ +\xd7\x01\xfc\x03]\xff\xec\x01\xfc\x03^\xff\xd7\x01\xfc\x03\ +_\xff\xec\x01\xfc\x03`\xff\xd7\x01\xfc\x03b\xff\xec\x01\ +\xfc\x03d\xff\xec\x01\xfc\x03f\xff\xec\x01\xfc\x03h\xff\ +\xec\x01\xfc\x03j\xff\xec\x01\xfc\x03l\xff\xec\x01\xfc\x03\ +n\xff\xec\x01\xfd\x00\x05\x00R\x01\xfd\x00\x0a\x00R\x01\ +\xfd\x00\x0f\xff\xae\x01\xfd\x00\x11\xff\xae\x01\xfd\x00\x22\x00\ +)\x01\xfd\x02\x07\x00R\x01\xfd\x02\x08\xff\xae\x01\xfd\x02\ +\x0b\x00R\x01\xfd\x02\x0c\xff\xae\x01\xfe\x00\x0f\xff\x9a\x01\ +\xfe\x00\x11\xff\x9a\x01\xfe\x00\x22\x00)\x01\xfe\x00$\xff\ +\xae\x01\xfe\x00&\xff\xec\x01\xfe\x00*\xff\xec\x01\xfe\x00\ +2\xff\xec\x01\xfe\x004\xff\xec\x01\xfe\x00D\xff\xd7\x01\ +\xfe\x00F\xff\xd7\x01\xfe\x00G\xff\xd7\x01\xfe\x00H\xff\ +\xd7\x01\xfe\x00J\xff\xec\x01\xfe\x00P\xff\xec\x01\xfe\x00\ +Q\xff\xec\x01\xfe\x00R\xff\xd7\x01\xfe\x00S\xff\xec\x01\ +\xfe\x00T\xff\xd7\x01\xfe\x00U\xff\xec\x01\xfe\x00V\xff\ +\xec\x01\xfe\x00X\xff\xec\x01\xfe\x00\x82\xff\xae\x01\xfe\x00\ +\x83\xff\xae\x01\xfe\x00\x84\xff\xae\x01\xfe\x00\x85\xff\xae\x01\ +\xfe\x00\x86\xff\xae\x01\xfe\x00\x87\xff\xae\x01\xfe\x00\x89\xff\ +\xec\x01\xfe\x00\x94\xff\xec\x01\xfe\x00\x95\xff\xec\x01\xfe\x00\ +\x96\xff\xec\x01\xfe\x00\x97\xff\xec\x01\xfe\x00\x98\xff\xec\x01\ +\xfe\x00\x9a\xff\xec\x01\xfe\x00\xa2\xff\xd7\x01\xfe\x00\xa3\xff\ +\xd7\x01\xfe\x00\xa4\xff\xd7\x01\xfe\x00\xa5\xff\xd7\x01\xfe\x00\ +\xa6\xff\xd7\x01\xfe\x00\xa7\xff\xd7\x01\xfe\x00\xa8\xff\xd7\x01\ +\xfe\x00\xa9\xff\xd7\x01\xfe\x00\xaa\xff\xd7\x01\xfe\x00\xab\xff\ +\xd7\x01\xfe\x00\xac\xff\xd7\x01\xfe\x00\xad\xff\xd7\x01\xfe\x00\ +\xb4\xff\xd7\x01\xfe\x00\xb5\xff\xd7\x01\xfe\x00\xb6\xff\xd7\x01\ +\xfe\x00\xb7\xff\xd7\x01\xfe\x00\xb8\xff\xd7\x01\xfe\x00\xba\xff\ +\xd7\x01\xfe\x00\xbb\xff\xec\x01\xfe\x00\xbc\xff\xec\x01\xfe\x00\ +\xbd\xff\xec\x01\xfe\x00\xbe\xff\xec\x01\xfe\x00\xc2\xff\xae\x01\ +\xfe\x00\xc3\xff\xd7\x01\xfe\x00\xc4\xff\xae\x01\xfe\x00\xc5\xff\ +\xd7\x01\xfe\x00\xc6\xff\xae\x01\xfe\x00\xc7\xff\xd7\x01\xfe\x00\ +\xc8\xff\xec\x01\xfe\x00\xc9\xff\xd7\x01\xfe\x00\xca\xff\xec\x01\ +\xfe\x00\xcb\xff\xd7\x01\xfe\x00\xcc\xff\xec\x01\xfe\x00\xcd\xff\ +\xd7\x01\xfe\x00\xce\xff\xec\x01\xfe\x00\xcf\xff\xd7\x01\xfe\x00\ +\xd1\xff\xd7\x01\xfe\x00\xd3\xff\xd7\x01\xfe\x00\xd5\xff\xd7\x01\ +\xfe\x00\xd7\xff\xd7\x01\xfe\x00\xd9\xff\xd7\x01\xfe\x00\xdb\xff\ +\xd7\x01\xfe\x00\xdd\xff\xd7\x01\xfe\x00\xde\xff\xec\x01\xfe\x00\ +\xdf\xff\xec\x01\xfe\x00\xe0\xff\xec\x01\xfe\x00\xe1\xff\xec\x01\ +\xfe\x00\xe2\xff\xec\x01\xfe\x00\xe3\xff\xec\x01\xfe\x00\xe4\xff\ +\xec\x01\xfe\x00\xe5\xff\xec\x01\xfe\x00\xfa\xff\xec\x01\xfe\x01\ +\x06\xff\xec\x01\xfe\x01\x08\xff\xec\x01\xfe\x01\x0d\xff\xec\x01\ +\xfe\x01\x0e\xff\xec\x01\xfe\x01\x0f\xff\xd7\x01\xfe\x01\x10\xff\ +\xec\x01\xfe\x01\x11\xff\xd7\x01\xfe\x01\x12\xff\xec\x01\xfe\x01\ +\x13\xff\xd7\x01\xfe\x01\x14\xff\xec\x01\xfe\x01\x15\xff\xd7\x01\ +\xfe\x01\x17\xff\xec\x01\xfe\x01\x19\xff\xec\x01\xfe\x01\x1d\xff\ +\xec\x01\xfe\x01!\xff\xec\x01\xfe\x01+\xff\xec\x01\xfe\x01\ +-\xff\xec\x01\xfe\x01/\xff\xec\x01\xfe\x011\xff\xec\x01\ +\xfe\x013\xff\xec\x01\xfe\x015\xff\xec\x01\xfe\x01C\xff\ +\xae\x01\xfe\x01D\xff\xd7\x01\xfe\x01F\xff\xd7\x01\xfe\x01\ +G\xff\xec\x01\xfe\x01H\xff\xd7\x01\xfe\x01J\xff\xec\x01\ +\xfe\x02\x08\xff\x9a\x01\xfe\x02\x0c\xff\x9a\x01\xfe\x02W\xff\ +\xec\x01\xfe\x02X\xff\xae\x01\xfe\x02Y\xff\xd7\x01\xfe\x02\ +_\xff\xec\x01\xfe\x02`\xff\xd7\x01\xfe\x02b\xff\xec\x01\ +\xfe\x03\x1d\xff\xae\x01\xfe\x03\x1e\xff\xd7\x01\xfe\x03\x1f\xff\ +\xae\x01\xfe\x03 \xff\xd7\x01\xfe\x03!\xff\xae\x01\xfe\x03\ +\x22\xff\xd7\x01\xfe\x03#\xff\xae\x01\xfe\x03%\xff\xae\x01\ +\xfe\x03&\xff\xd7\x01\xfe\x03'\xff\xae\x01\xfe\x03(\xff\ +\xd7\x01\xfe\x03)\xff\xae\x01\xfe\x03*\xff\xd7\x01\xfe\x03\ ++\xff\xae\x01\xfe\x03,\xff\xd7\x01\xfe\x03-\xff\xae\x01\ +\xfe\x03.\xff\xd7\x01\xfe\x03/\xff\xae\x01\xfe\x030\xff\ +\xd7\x01\xfe\x031\xff\xae\x01\xfe\x032\xff\xd7\x01\xfe\x03\ +3\xff\xae\x01\xfe\x034\xff\xd7\x01\xfe\x036\xff\xd7\x01\ +\xfe\x038\xff\xd7\x01\xfe\x03:\xff\xd7\x01\xfe\x03<\xff\ +\xd7\x01\xfe\x03@\xff\xd7\x01\xfe\x03B\xff\xd7\x01\xfe\x03\ +D\xff\xd7\x01\xfe\x03I\xff\xec\x01\xfe\x03J\xff\xd7\x01\ +\xfe\x03K\xff\xec\x01\xfe\x03L\xff\xd7\x01\xfe\x03M\xff\ +\xec\x01\xfe\x03N\xff\xd7\x01\xfe\x03O\xff\xec\x01\xfe\x03\ +Q\xff\xec\x01\xfe\x03R\xff\xd7\x01\xfe\x03S\xff\xec\x01\ +\xfe\x03T\xff\xd7\x01\xfe\x03U\xff\xec\x01\xfe\x03V\xff\ +\xd7\x01\xfe\x03W\xff\xec\x01\xfe\x03X\xff\xd7\x01\xfe\x03\ +Y\xff\xec\x01\xfe\x03Z\xff\xd7\x01\xfe\x03[\xff\xec\x01\ +\xfe\x03\x5c\xff\xd7\x01\xfe\x03]\xff\xec\x01\xfe\x03^\xff\ +\xd7\x01\xfe\x03_\xff\xec\x01\xfe\x03`\xff\xd7\x01\xfe\x03\ +b\xff\xec\x01\xfe\x03d\xff\xec\x01\xfe\x03f\xff\xec\x01\ +\xfe\x03h\xff\xec\x01\xfe\x03j\xff\xec\x01\xfe\x03l\xff\ +\xec\x01\xfe\x03n\xff\xec\x01\xff\x00\x05\x00R\x01\xff\x00\ +\x0a\x00R\x01\xff\x00\x0f\xff\xae\x01\xff\x00\x11\xff\xae\x01\ +\xff\x00\x22\x00)\x01\xff\x02\x07\x00R\x01\xff\x02\x08\xff\ +\xae\x01\xff\x02\x0b\x00R\x01\xff\x02\x0c\xff\xae\x02\x00\x00\ +\x0f\xff\x85\x02\x00\x00\x11\xff\x85\x02\x00\x00\x22\x00)\x02\ +\x00\x00$\xff\x85\x02\x00\x00&\xff\xd7\x02\x00\x00*\xff\ +\xd7\x02\x00\x002\xff\xd7\x02\x00\x004\xff\xd7\x02\x00\x00\ +D\xff\x9a\x02\x00\x00F\xff\x9a\x02\x00\x00G\xff\x9a\x02\ +\x00\x00H\xff\x9a\x02\x00\x00J\xff\xd7\x02\x00\x00P\xff\ +\xc3\x02\x00\x00Q\xff\xc3\x02\x00\x00R\xff\x9a\x02\x00\x00\ +S\xff\xc3\x02\x00\x00T\xff\x9a\x02\x00\x00U\xff\xc3\x02\ +\x00\x00V\xff\xae\x02\x00\x00X\xff\xc3\x02\x00\x00]\xff\ +\xd7\x02\x00\x00\x82\xff\x85\x02\x00\x00\x83\xff\x85\x02\x00\x00\ +\x84\xff\x85\x02\x00\x00\x85\xff\x85\x02\x00\x00\x86\xff\x85\x02\ +\x00\x00\x87\xff\x85\x02\x00\x00\x89\xff\xd7\x02\x00\x00\x94\xff\ +\xd7\x02\x00\x00\x95\xff\xd7\x02\x00\x00\x96\xff\xd7\x02\x00\x00\ +\x97\xff\xd7\x02\x00\x00\x98\xff\xd7\x02\x00\x00\x9a\xff\xd7\x02\ +\x00\x00\xa2\xff\x9a\x02\x00\x00\xa3\xff\x9a\x02\x00\x00\xa4\xff\ +\x9a\x02\x00\x00\xa5\xff\x9a\x02\x00\x00\xa6\xff\x9a\x02\x00\x00\ +\xa7\xff\x9a\x02\x00\x00\xa8\xff\x9a\x02\x00\x00\xa9\xff\x9a\x02\ +\x00\x00\xaa\xff\x9a\x02\x00\x00\xab\xff\x9a\x02\x00\x00\xac\xff\ +\x9a\x02\x00\x00\xad\xff\x9a\x02\x00\x00\xb4\xff\x9a\x02\x00\x00\ +\xb5\xff\x9a\x02\x00\x00\xb6\xff\x9a\x02\x00\x00\xb7\xff\x9a\x02\ +\x00\x00\xb8\xff\x9a\x02\x00\x00\xba\xff\x9a\x02\x00\x00\xbb\xff\ +\xc3\x02\x00\x00\xbc\xff\xc3\x02\x00\x00\xbd\xff\xc3\x02\x00\x00\ +\xbe\xff\xc3\x02\x00\x00\xc2\xff\x85\x02\x00\x00\xc3\xff\x9a\x02\ +\x00\x00\xc4\xff\x85\x02\x00\x00\xc5\xff\x9a\x02\x00\x00\xc6\xff\ +\x85\x02\x00\x00\xc7\xff\x9a\x02\x00\x00\xc8\xff\xd7\x02\x00\x00\ +\xc9\xff\x9a\x02\x00\x00\xca\xff\xd7\x02\x00\x00\xcb\xff\x9a\x02\ +\x00\x00\xcc\xff\xd7\x02\x00\x00\xcd\xff\x9a\x02\x00\x00\xce\xff\ +\xd7\x02\x00\x00\xcf\xff\x9a\x02\x00\x00\xd1\xff\x9a\x02\x00\x00\ +\xd3\xff\x9a\x02\x00\x00\xd5\xff\x9a\x02\x00\x00\xd7\xff\x9a\x02\ +\x00\x00\xd9\xff\x9a\x02\x00\x00\xdb\xff\x9a\x02\x00\x00\xdd\xff\ +\x9a\x02\x00\x00\xde\xff\xd7\x02\x00\x00\xdf\xff\xd7\x02\x00\x00\ +\xe0\xff\xd7\x02\x00\x00\xe1\xff\xd7\x02\x00\x00\xe2\xff\xd7\x02\ +\x00\x00\xe3\xff\xd7\x02\x00\x00\xe4\xff\xd7\x02\x00\x00\xe5\xff\ +\xd7\x02\x00\x00\xfa\xff\xc3\x02\x00\x01\x06\xff\xc3\x02\x00\x01\ +\x08\xff\xc3\x02\x00\x01\x0d\xff\xc3\x02\x00\x01\x0e\xff\xd7\x02\ +\x00\x01\x0f\xff\x9a\x02\x00\x01\x10\xff\xd7\x02\x00\x01\x11\xff\ +\x9a\x02\x00\x01\x12\xff\xd7\x02\x00\x01\x13\xff\x9a\x02\x00\x01\ +\x14\xff\xd7\x02\x00\x01\x15\xff\x9a\x02\x00\x01\x17\xff\xc3\x02\ +\x00\x01\x19\xff\xc3\x02\x00\x01\x1d\xff\xae\x02\x00\x01!\xff\ +\xae\x02\x00\x01+\xff\xc3\x02\x00\x01-\xff\xc3\x02\x00\x01\ +/\xff\xc3\x02\x00\x011\xff\xc3\x02\x00\x013\xff\xc3\x02\ +\x00\x015\xff\xc3\x02\x00\x01<\xff\xd7\x02\x00\x01>\xff\ +\xd7\x02\x00\x01@\xff\xd7\x02\x00\x01C\xff\x85\x02\x00\x01\ +D\xff\x9a\x02\x00\x01F\xff\x9a\x02\x00\x01G\xff\xd7\x02\ +\x00\x01H\xff\x9a\x02\x00\x01J\xff\xae\x02\x00\x02\x08\xff\ +\x85\x02\x00\x02\x0c\xff\x85\x02\x00\x02W\xff\xc3\x02\x00\x02\ +X\xff\x85\x02\x00\x02Y\xff\x9a\x02\x00\x02_\xff\xd7\x02\ +\x00\x02`\xff\x9a\x02\x00\x02b\xff\xc3\x02\x00\x03\x1d\xff\ +\x85\x02\x00\x03\x1e\xff\x9a\x02\x00\x03\x1f\xff\x85\x02\x00\x03\ + \xff\x9a\x02\x00\x03!\xff\x85\x02\x00\x03\x22\xff\x9a\x02\ +\x00\x03#\xff\x85\x02\x00\x03%\xff\x85\x02\x00\x03&\xff\ +\x9a\x02\x00\x03'\xff\x85\x02\x00\x03(\xff\x9a\x02\x00\x03\ +)\xff\x85\x02\x00\x03*\xff\x9a\x02\x00\x03+\xff\x85\x02\ +\x00\x03,\xff\x9a\x02\x00\x03-\xff\x85\x02\x00\x03.\xff\ +\x9a\x02\x00\x03/\xff\x85\x02\x00\x030\xff\x9a\x02\x00\x03\ +1\xff\x85\x02\x00\x032\xff\x9a\x02\x00\x033\xff\x85\x02\ +\x00\x034\xff\x9a\x02\x00\x036\xff\x9a\x02\x00\x038\xff\ +\x9a\x02\x00\x03:\xff\x9a\x02\x00\x03<\xff\x9a\x02\x00\x03\ +@\xff\x9a\x02\x00\x03B\xff\x9a\x02\x00\x03D\xff\x9a\x02\ +\x00\x03I\xff\xd7\x02\x00\x03J\xff\x9a\x02\x00\x03K\xff\ +\xd7\x02\x00\x03L\xff\x9a\x02\x00\x03M\xff\xd7\x02\x00\x03\ +N\xff\x9a\x02\x00\x03O\xff\xd7\x02\x00\x03Q\xff\xd7\x02\ +\x00\x03R\xff\x9a\x02\x00\x03S\xff\xd7\x02\x00\x03T\xff\ +\x9a\x02\x00\x03U\xff\xd7\x02\x00\x03V\xff\x9a\x02\x00\x03\ +W\xff\xd7\x02\x00\x03X\xff\x9a\x02\x00\x03Y\xff\xd7\x02\ +\x00\x03Z\xff\x9a\x02\x00\x03[\xff\xd7\x02\x00\x03\x5c\xff\ +\x9a\x02\x00\x03]\xff\xd7\x02\x00\x03^\xff\x9a\x02\x00\x03\ +_\xff\xd7\x02\x00\x03`\xff\x9a\x02\x00\x03b\xff\xc3\x02\ +\x00\x03d\xff\xc3\x02\x00\x03f\xff\xc3\x02\x00\x03h\xff\ +\xc3\x02\x00\x03j\xff\xc3\x02\x00\x03l\xff\xc3\x02\x00\x03\ +n\xff\xc3\x02\x01\x00\x05\x00R\x02\x01\x00\x0a\x00R\x02\ +\x01\x00\x0f\xff\xae\x02\x01\x00\x11\xff\xae\x02\x01\x00\x22\x00\ +)\x02\x01\x02\x07\x00R\x02\x01\x02\x08\xff\xae\x02\x01\x02\ +\x0b\x00R\x02\x01\x02\x0c\xff\xae\x02\x02\x007\xff\xae\x02\ +\x02\x01$\xff\xae\x02\x02\x01&\xff\xae\x02\x02\x01q\xff\ +\xae\x02\x02\x01\x9d\xff\xae\x02\x02\x01\xa6\xff\xae\x02\x02\x01\ +\xbc\xff\xae\x02\x02\x01\xc4\xff\xae\x02\x02\x01\xdc\xff\xd7\x02\ +\x02\x01\xe4\xff\xd7\x02\x02\x02\xa9\xff\xae\x02\x02\x02\xaa\xff\ +\xd7\x02\x02\x02\xb5\xff\xae\x02\x02\x02\xb6\xff\xd7\x02\x02\x02\ +\xbd\xff\xae\x02\x02\x02\xbe\xff\xd7\x02\x02\x03\x17\xff\xae\x02\ +\x02\x03\x18\xff\xd7\x02\x02\x03\x8f\xff\xae\x02\x03\x007\xff\ +\xae\x02\x03\x01$\xff\xae\x02\x03\x01&\xff\xae\x02\x03\x01\ +q\xff\xae\x02\x03\x01\x9d\xff\xae\x02\x03\x01\xa6\xff\xae\x02\ +\x03\x01\xbc\xff\xae\x02\x03\x01\xc4\xff\xae\x02\x03\x01\xdc\xff\ +\xd7\x02\x03\x01\xe4\xff\xd7\x02\x03\x02\xa9\xff\xae\x02\x03\x02\ +\xaa\xff\xd7\x02\x03\x02\xb5\xff\xae\x02\x03\x02\xb6\xff\xd7\x02\ +\x03\x02\xbd\xff\xae\x02\x03\x02\xbe\xff\xd7\x02\x03\x03\x17\xff\ +\xae\x02\x03\x03\x18\xff\xd7\x02\x03\x03\x8f\xff\xae\x02\x04\x00\ +7\xff\xae\x02\x04\x01$\xff\xae\x02\x04\x01&\xff\xae\x02\ +\x04\x01q\xff\xae\x02\x04\x01\x9d\xff\xae\x02\x04\x01\xa6\xff\ +\xae\x02\x04\x01\xbc\xff\xae\x02\x04\x01\xc4\xff\xae\x02\x04\x01\ +\xdc\xff\xd7\x02\x04\x01\xe4\xff\xd7\x02\x04\x02\xa9\xff\xae\x02\ +\x04\x02\xaa\xff\xd7\x02\x04\x02\xb5\xff\xae\x02\x04\x02\xb6\xff\ +\xd7\x02\x04\x02\xbd\xff\xae\x02\x04\x02\xbe\xff\xd7\x02\x04\x03\ +\x17\xff\xae\x02\x04\x03\x18\xff\xd7\x02\x04\x03\x8f\xff\xae\x02\ +\x06\x00$\xffq\x02\x06\x007\x00)\x02\x06\x009\x00\ +)\x02\x06\x00:\x00)\x02\x06\x00<\x00\x14\x02\x06\x00\ +D\xff\xae\x02\x06\x00F\xff\x85\x02\x06\x00G\xff\x85\x02\ +\x06\x00H\xff\x85\x02\x06\x00J\xff\xc3\x02\x06\x00P\xff\ +\xc3\x02\x06\x00Q\xff\xc3\x02\x06\x00R\xff\x85\x02\x06\x00\ +S\xff\xc3\x02\x06\x00T\xff\x85\x02\x06\x00U\xff\xc3\x02\ +\x06\x00V\xff\xc3\x02\x06\x00X\xff\xc3\x02\x06\x00\x82\xff\ +q\x02\x06\x00\x83\xffq\x02\x06\x00\x84\xffq\x02\x06\x00\ +\x85\xffq\x02\x06\x00\x86\xffq\x02\x06\x00\x87\xffq\x02\ +\x06\x00\x9f\x00\x14\x02\x06\x00\xa2\xff\x85\x02\x06\x00\xa3\xff\ +\xae\x02\x06\x00\xa4\xff\xae\x02\x06\x00\xa5\xff\xae\x02\x06\x00\ +\xa6\xff\xae\x02\x06\x00\xa7\xff\xae\x02\x06\x00\xa8\xff\xae\x02\ +\x06\x00\xa9\xff\x85\x02\x06\x00\xaa\xff\x85\x02\x06\x00\xab\xff\ +\x85\x02\x06\x00\xac\xff\x85\x02\x06\x00\xad\xff\x85\x02\x06\x00\ +\xb4\xff\x85\x02\x06\x00\xb5\xff\x85\x02\x06\x00\xb6\xff\x85\x02\ +\x06\x00\xb7\xff\x85\x02\x06\x00\xb8\xff\x85\x02\x06\x00\xba\xff\ +\x85\x02\x06\x00\xbb\xff\xc3\x02\x06\x00\xbc\xff\xc3\x02\x06\x00\ +\xbd\xff\xc3\x02\x06\x00\xbe\xff\xc3\x02\x06\x00\xc2\xffq\x02\ +\x06\x00\xc3\xff\xae\x02\x06\x00\xc4\xffq\x02\x06\x00\xc5\xff\ +\xae\x02\x06\x00\xc6\xffq\x02\x06\x00\xc7\xff\xae\x02\x06\x00\ +\xc9\xff\x85\x02\x06\x00\xcb\xff\x85\x02\x06\x00\xcd\xff\x85\x02\ +\x06\x00\xcf\xff\x85\x02\x06\x00\xd1\xff\x85\x02\x06\x00\xd3\xff\ +\x85\x02\x06\x00\xd5\xff\x85\x02\x06\x00\xd7\xff\x85\x02\x06\x00\ +\xd9\xff\x85\x02\x06\x00\xdb\xff\x85\x02\x06\x00\xdd\xff\x85\x02\ +\x06\x00\xdf\xff\xc3\x02\x06\x00\xe1\xff\xc3\x02\x06\x00\xe3\xff\ +\xc3\x02\x06\x00\xe5\xff\xc3\x02\x06\x00\xfa\xff\xc3\x02\x06\x01\ +\x06\xff\xc3\x02\x06\x01\x08\xff\xc3\x02\x06\x01\x0d\xff\xc3\x02\ +\x06\x01\x0f\xff\x85\x02\x06\x01\x11\xff\x85\x02\x06\x01\x13\xff\ +\x85\x02\x06\x01\x15\xff\x85\x02\x06\x01\x17\xff\xc3\x02\x06\x01\ +\x19\xff\xc3\x02\x06\x01\x1d\xff\xc3\x02\x06\x01!\xff\xc3\x02\ +\x06\x01$\x00)\x02\x06\x01&\x00)\x02\x06\x01+\xff\ +\xc3\x02\x06\x01-\xff\xc3\x02\x06\x01/\xff\xc3\x02\x06\x01\ +1\xff\xc3\x02\x06\x013\xff\xc3\x02\x06\x015\xff\xc3\x02\ +\x06\x016\x00)\x02\x06\x018\x00\x14\x02\x06\x01:\x00\ +\x14\x02\x06\x01C\xffq\x02\x06\x01D\xff\xae\x02\x06\x01\ +F\xff\xae\x02\x06\x01H\xff\x85\x02\x06\x01J\xff\xc3\x02\ +\x06\x01V\xffq\x02\x06\x01_\xffq\x02\x06\x01b\xff\ +q\x02\x06\x01i\xffq\x02\x06\x01y\xff\xae\x02\x06\x01\ +z\xff\xd7\x02\x06\x01{\xff\xd7\x02\x06\x01~\xff\xae\x02\ +\x06\x01\x81\xff\xc3\x02\x06\x01\x82\xff\xd7\x02\x06\x01\x83\xff\ +\xd7\x02\x06\x01\x84\xff\xd7\x02\x06\x01\x87\xff\xd7\x02\x06\x01\ +\x89\xff\xd7\x02\x06\x01\x8c\xff\xae\x02\x06\x01\x8e\xff\xc3\x02\ +\x06\x01\x8f\xff\xae\x02\x06\x01\x90\xff\xae\x02\x06\x01\x93\xff\ +\xae\x02\x06\x01\x99\xff\xae\x02\x06\x01\xa4\xff\x85\x02\x06\x01\ +\xaa\xffq\x02\x06\x01\xae\xff\x85\x02\x06\x01\xb5\xff\x85\x02\ +\x06\x01\xca\xff\xd7\x02\x06\x01\xce\xffq\x02\x06\x01\xcf\xff\ +\x85\x02\x06\x01\xd5\xffq\x02\x06\x01\xd8\xff\x85\x02\x06\x01\ +\xdb\xff\x85\x02\x06\x01\xde\xff\x85\x02\x06\x01\xea\xff\x85\x02\ +\x06\x01\xed\xff\x85\x02\x06\x01\xee\xff\xc3\x02\x06\x01\xf2\xff\ +q\x02\x06\x01\xfa\x00)\x02\x06\x01\xfc\x00)\x02\x06\x01\ +\xfe\x00)\x02\x06\x02\x00\x00\x14\x02\x06\x02W\xff\xc3\x02\ +\x06\x02X\xffq\x02\x06\x02Y\xff\xae\x02\x06\x02`\xff\ +\x85\x02\x06\x02b\xff\xc3\x02\x06\x02j\xff\x85\x02\x06\x02\ +r\xffq\x02\x06\x02s\xffq\x02\x06\x02}\xff\xec\x02\ +\x06\x02\x7f\xff\x85\x02\x06\x02\x85\xff\x85\x02\x06\x02\x87\xff\ +\x85\x02\x06\x02\x89\xff\x85\x02\x06\x02\x8d\xff\x85\x02\x06\x02\ +\xb2\xff\x85\x02\x06\x02\xb4\xff\x85\x02\x06\x02\xce\xff\x85\x02\ +\x06\x02\xcf\xffq\x02\x06\x02\xd9\xffq\x02\x06\x02\xda\xff\ +\xd7\x02\x06\x02\xdb\xffq\x02\x06\x02\xdc\xff\xd7\x02\x06\x02\ +\xdd\xffq\x02\x06\x02\xde\xff\xd7\x02\x06\x02\xe0\xff\x85\x02\ +\x06\x02\xe2\xff\xd7\x02\x06\x02\xe4\xff\xd7\x02\x06\x02\xf0\xff\ +\x85\x02\x06\x02\xf2\xff\x85\x02\x06\x02\xf4\xff\x85\x02\x06\x03\ +\x09\xffq\x02\x06\x03\x0a\xff\x85\x02\x06\x03\x0b\xffq\x02\ +\x06\x03\x0c\xff\x85\x02\x06\x03\x11\xff\x85\x02\x06\x03\x12\xff\ +q\x02\x06\x03\x16\xff\x85\x02\x06\x03\x1a\xff\x85\x02\x06\x03\ +\x1b\xff\x85\x02\x06\x03\x1c\xffq\x02\x06\x03\x1d\xffq\x02\ +\x06\x03\x1e\xff\xae\x02\x06\x03\x1f\xffq\x02\x06\x03 \xff\ +\xae\x02\x06\x03!\xffq\x02\x06\x03\x22\xff\xae\x02\x06\x03\ +#\xffq\x02\x06\x03%\xffq\x02\x06\x03&\xff\xae\x02\ +\x06\x03'\xffq\x02\x06\x03(\xff\xae\x02\x06\x03)\xff\ +q\x02\x06\x03*\xff\xae\x02\x06\x03+\xffq\x02\x06\x03\ +,\xff\xae\x02\x06\x03-\xffq\x02\x06\x03.\xff\xae\x02\ +\x06\x03/\xffq\x02\x06\x030\xff\xae\x02\x06\x031\xff\ +q\x02\x06\x032\xff\xae\x02\x06\x033\xffq\x02\x06\x03\ +4\xff\xae\x02\x06\x036\xff\x85\x02\x06\x038\xff\x85\x02\ +\x06\x03:\xff\x85\x02\x06\x03<\xff\x85\x02\x06\x03@\xff\ +\x85\x02\x06\x03B\xff\x85\x02\x06\x03D\xff\x85\x02\x06\x03\ +J\xff\x85\x02\x06\x03L\xff\x85\x02\x06\x03N\xff\x85\x02\ +\x06\x03R\xff\x85\x02\x06\x03T\xff\x85\x02\x06\x03V\xff\ +\x85\x02\x06\x03X\xff\x85\x02\x06\x03Z\xff\x85\x02\x06\x03\ +\x5c\xff\x85\x02\x06\x03^\xff\x85\x02\x06\x03`\xff\x85\x02\ +\x06\x03b\xff\xc3\x02\x06\x03d\xff\xc3\x02\x06\x03f\xff\ +\xc3\x02\x06\x03h\xff\xc3\x02\x06\x03j\xff\xc3\x02\x06\x03\ +l\xff\xc3\x02\x06\x03n\xff\xc3\x02\x06\x03o\x00\x14\x02\ +\x06\x03q\x00\x14\x02\x06\x03s\x00\x14\x02\x06\x03\x8f\x00\ +)\x02\x07\x00$\xffq\x02\x07\x007\x00)\x02\x07\x00\ +9\x00)\x02\x07\x00:\x00)\x02\x07\x00<\x00\x14\x02\ +\x07\x00D\xff\xae\x02\x07\x00F\xff\x85\x02\x07\x00G\xff\ +\x85\x02\x07\x00H\xff\x85\x02\x07\x00J\xff\xc3\x02\x07\x00\ +P\xff\xc3\x02\x07\x00Q\xff\xc3\x02\x07\x00R\xff\x85\x02\ +\x07\x00S\xff\xc3\x02\x07\x00T\xff\x85\x02\x07\x00U\xff\ +\xc3\x02\x07\x00V\xff\xc3\x02\x07\x00X\xff\xc3\x02\x07\x00\ +\x82\xffq\x02\x07\x00\x83\xffq\x02\x07\x00\x84\xffq\x02\ +\x07\x00\x85\xffq\x02\x07\x00\x86\xffq\x02\x07\x00\x87\xff\ +q\x02\x07\x00\x9f\x00\x14\x02\x07\x00\xa2\xff\x85\x02\x07\x00\ +\xa3\xff\xae\x02\x07\x00\xa4\xff\xae\x02\x07\x00\xa5\xff\xae\x02\ +\x07\x00\xa6\xff\xae\x02\x07\x00\xa7\xff\xae\x02\x07\x00\xa8\xff\ +\xae\x02\x07\x00\xa9\xff\x85\x02\x07\x00\xaa\xff\x85\x02\x07\x00\ +\xab\xff\x85\x02\x07\x00\xac\xff\x85\x02\x07\x00\xad\xff\x85\x02\ +\x07\x00\xb4\xff\x85\x02\x07\x00\xb5\xff\x85\x02\x07\x00\xb6\xff\ +\x85\x02\x07\x00\xb7\xff\x85\x02\x07\x00\xb8\xff\x85\x02\x07\x00\ +\xba\xff\x85\x02\x07\x00\xbb\xff\xc3\x02\x07\x00\xbc\xff\xc3\x02\ +\x07\x00\xbd\xff\xc3\x02\x07\x00\xbe\xff\xc3\x02\x07\x00\xc2\xff\ +q\x02\x07\x00\xc3\xff\xae\x02\x07\x00\xc4\xffq\x02\x07\x00\ +\xc5\xff\xae\x02\x07\x00\xc6\xffq\x02\x07\x00\xc7\xff\xae\x02\ +\x07\x00\xc9\xff\x85\x02\x07\x00\xcb\xff\x85\x02\x07\x00\xcd\xff\ +\x85\x02\x07\x00\xcf\xff\x85\x02\x07\x00\xd1\xff\x85\x02\x07\x00\ +\xd3\xff\x85\x02\x07\x00\xd5\xff\x85\x02\x07\x00\xd7\xff\x85\x02\ +\x07\x00\xd9\xff\x85\x02\x07\x00\xdb\xff\x85\x02\x07\x00\xdd\xff\ +\x85\x02\x07\x00\xdf\xff\xc3\x02\x07\x00\xe1\xff\xc3\x02\x07\x00\ +\xe3\xff\xc3\x02\x07\x00\xe5\xff\xc3\x02\x07\x00\xfa\xff\xc3\x02\ +\x07\x01\x06\xff\xc3\x02\x07\x01\x08\xff\xc3\x02\x07\x01\x0d\xff\ +\xc3\x02\x07\x01\x0f\xff\x85\x02\x07\x01\x11\xff\x85\x02\x07\x01\ +\x13\xff\x85\x02\x07\x01\x15\xff\x85\x02\x07\x01\x17\xff\xc3\x02\ +\x07\x01\x19\xff\xc3\x02\x07\x01\x1d\xff\xc3\x02\x07\x01!\xff\ +\xc3\x02\x07\x01$\x00)\x02\x07\x01&\x00)\x02\x07\x01\ ++\xff\xc3\x02\x07\x01-\xff\xc3\x02\x07\x01/\xff\xc3\x02\ +\x07\x011\xff\xc3\x02\x07\x013\xff\xc3\x02\x07\x015\xff\ +\xc3\x02\x07\x016\x00)\x02\x07\x018\x00\x14\x02\x07\x01\ +:\x00\x14\x02\x07\x01C\xffq\x02\x07\x01D\xff\xae\x02\ +\x07\x01F\xff\xae\x02\x07\x01H\xff\x85\x02\x07\x01J\xff\ +\xc3\x02\x07\x01V\xffq\x02\x07\x01_\xffq\x02\x07\x01\ +b\xffq\x02\x07\x01i\xffq\x02\x07\x01y\xff\xae\x02\ +\x07\x01z\xff\xd7\x02\x07\x01{\xff\xd7\x02\x07\x01~\xff\ +\xae\x02\x07\x01\x81\xff\xc3\x02\x07\x01\x82\xff\xd7\x02\x07\x01\ +\x83\xff\xd7\x02\x07\x01\x84\xff\xd7\x02\x07\x01\x87\xff\xd7\x02\ +\x07\x01\x89\xff\xd7\x02\x07\x01\x8c\xff\xae\x02\x07\x01\x8e\xff\ +\xc3\x02\x07\x01\x8f\xff\xae\x02\x07\x01\x90\xff\xae\x02\x07\x01\ +\x93\xff\xae\x02\x07\x01\x99\xff\xae\x02\x07\x01\xa4\xff\x85\x02\ +\x07\x01\xaa\xffq\x02\x07\x01\xae\xff\x85\x02\x07\x01\xb5\xff\ +\x85\x02\x07\x01\xca\xff\xd7\x02\x07\x01\xce\xffq\x02\x07\x01\ +\xcf\xff\x85\x02\x07\x01\xd5\xffq\x02\x07\x01\xd8\xff\x85\x02\ +\x07\x01\xdb\xff\x85\x02\x07\x01\xde\xff\x85\x02\x07\x01\xea\xff\ +\x85\x02\x07\x01\xed\xff\x85\x02\x07\x01\xee\xff\xc3\x02\x07\x01\ +\xf2\xffq\x02\x07\x01\xfa\x00)\x02\x07\x01\xfc\x00)\x02\ +\x07\x01\xfe\x00)\x02\x07\x02\x00\x00\x14\x02\x07\x02W\xff\ +\xc3\x02\x07\x02X\xffq\x02\x07\x02Y\xff\xae\x02\x07\x02\ +`\xff\x85\x02\x07\x02b\xff\xc3\x02\x07\x02j\xff\x85\x02\ +\x07\x02r\xffq\x02\x07\x02s\xffq\x02\x07\x02}\xff\ +\xec\x02\x07\x02\x7f\xff\x85\x02\x07\x02\x85\xff\x85\x02\x07\x02\ +\x87\xff\x85\x02\x07\x02\x89\xff\x85\x02\x07\x02\x8d\xff\x85\x02\ +\x07\x02\xb2\xff\x85\x02\x07\x02\xb4\xff\x85\x02\x07\x02\xce\xff\ +\x85\x02\x07\x02\xcf\xffq\x02\x07\x02\xd9\xffq\x02\x07\x02\ +\xda\xff\xd7\x02\x07\x02\xdb\xffq\x02\x07\x02\xdc\xff\xd7\x02\ +\x07\x02\xdd\xffq\x02\x07\x02\xde\xff\xd7\x02\x07\x02\xe0\xff\ +\x85\x02\x07\x02\xe2\xff\xd7\x02\x07\x02\xe4\xff\xd7\x02\x07\x02\ +\xf0\xff\x85\x02\x07\x02\xf2\xff\x85\x02\x07\x02\xf4\xff\x85\x02\ +\x07\x03\x09\xffq\x02\x07\x03\x0a\xff\x85\x02\x07\x03\x0b\xff\ +q\x02\x07\x03\x0c\xff\x85\x02\x07\x03\x11\xff\x85\x02\x07\x03\ +\x12\xffq\x02\x07\x03\x16\xff\x85\x02\x07\x03\x1a\xff\x85\x02\ +\x07\x03\x1b\xff\x85\x02\x07\x03\x1c\xffq\x02\x07\x03\x1d\xff\ +q\x02\x07\x03\x1e\xff\xae\x02\x07\x03\x1f\xffq\x02\x07\x03\ + \xff\xae\x02\x07\x03!\xffq\x02\x07\x03\x22\xff\xae\x02\ +\x07\x03#\xffq\x02\x07\x03%\xffq\x02\x07\x03&\xff\ +\xae\x02\x07\x03'\xffq\x02\x07\x03(\xff\xae\x02\x07\x03\ +)\xffq\x02\x07\x03*\xff\xae\x02\x07\x03+\xffq\x02\ +\x07\x03,\xff\xae\x02\x07\x03-\xffq\x02\x07\x03.\xff\ +\xae\x02\x07\x03/\xffq\x02\x07\x030\xff\xae\x02\x07\x03\ +1\xffq\x02\x07\x032\xff\xae\x02\x07\x033\xffq\x02\ +\x07\x034\xff\xae\x02\x07\x036\xff\x85\x02\x07\x038\xff\ +\x85\x02\x07\x03:\xff\x85\x02\x07\x03<\xff\x85\x02\x07\x03\ +@\xff\x85\x02\x07\x03B\xff\x85\x02\x07\x03D\xff\x85\x02\ +\x07\x03J\xff\x85\x02\x07\x03L\xff\x85\x02\x07\x03N\xff\ +\x85\x02\x07\x03R\xff\x85\x02\x07\x03T\xff\x85\x02\x07\x03\ +V\xff\x85\x02\x07\x03X\xff\x85\x02\x07\x03Z\xff\x85\x02\ +\x07\x03\x5c\xff\x85\x02\x07\x03^\xff\x85\x02\x07\x03`\xff\ +\x85\x02\x07\x03b\xff\xc3\x02\x07\x03d\xff\xc3\x02\x07\x03\ +f\xff\xc3\x02\x07\x03h\xff\xc3\x02\x07\x03j\xff\xc3\x02\ +\x07\x03l\xff\xc3\x02\x07\x03n\xff\xc3\x02\x07\x03o\x00\ +\x14\x02\x07\x03q\x00\x14\x02\x07\x03s\x00\x14\x02\x07\x03\ +\x8f\x00)\x02\x08\x00&\xff\x9a\x02\x08\x00*\xff\x9a\x02\ +\x08\x002\xff\x9a\x02\x08\x004\xff\x9a\x02\x08\x007\xff\ +q\x02\x08\x008\xff\xd7\x02\x08\x009\xff\x85\x02\x08\x00\ +:\xff\x85\x02\x08\x00<\xff\x85\x02\x08\x00\x89\xff\x9a\x02\ +\x08\x00\x94\xff\x9a\x02\x08\x00\x95\xff\x9a\x02\x08\x00\x96\xff\ +\x9a\x02\x08\x00\x97\xff\x9a\x02\x08\x00\x98\xff\x9a\x02\x08\x00\ +\x9a\xff\x9a\x02\x08\x00\x9b\xff\xd7\x02\x08\x00\x9c\xff\xd7\x02\ +\x08\x00\x9d\xff\xd7\x02\x08\x00\x9e\xff\xd7\x02\x08\x00\x9f\xff\ +\x85\x02\x08\x00\xc8\xff\x9a\x02\x08\x00\xca\xff\x9a\x02\x08\x00\ +\xcc\xff\x9a\x02\x08\x00\xce\xff\x9a\x02\x08\x00\xde\xff\x9a\x02\ +\x08\x00\xe0\xff\x9a\x02\x08\x00\xe2\xff\x9a\x02\x08\x00\xe4\xff\ +\x9a\x02\x08\x01\x0e\xff\x9a\x02\x08\x01\x10\xff\x9a\x02\x08\x01\ +\x12\xff\x9a\x02\x08\x01\x14\xff\x9a\x02\x08\x01$\xffq\x02\ +\x08\x01&\xffq\x02\x08\x01*\xff\xd7\x02\x08\x01,\xff\ +\xd7\x02\x08\x01.\xff\xd7\x02\x08\x010\xff\xd7\x02\x08\x01\ +2\xff\xd7\x02\x08\x014\xff\xd7\x02\x08\x016\xff\x85\x02\ +\x08\x018\xff\x85\x02\x08\x01:\xff\x85\x02\x08\x01G\xff\ +\x9a\x02\x08\x01f\xff\xae\x02\x08\x01m\xff\xae\x02\x08\x01\ +q\xffq\x02\x08\x01r\xff\x85\x02\x08\x01s\xff\x9a\x02\ +\x08\x01u\xff\x85\x02\x08\x01x\xff\x85\x02\x08\x01\x85\xff\ +\xd7\x02\x08\x01\x9d\xffq\x02\x08\x01\x9f\xff\x9a\x02\x08\x01\ +\xa6\xffq\x02\x08\x01\xb8\xff\x9a\x02\x08\x01\xbb\xff\x9a\x02\ +\x08\x01\xbc\xffq\x02\x08\x01\xbe\xff\xae\x02\x08\x01\xc1\xff\ +\x5c\x02\x08\x01\xc4\xffq\x02\x08\x01\xdc\xff\x9a\x02\x08\x01\ +\xe1\xff\x85\x02\x08\x01\xe4\xff\x9a\x02\x08\x01\xfa\xff\x85\x02\ +\x08\x01\xfc\xff\x85\x02\x08\x01\xfe\xff\x85\x02\x08\x02\x00\xff\ +\x85\x02\x08\x02T\xff\x85\x02\x08\x02_\xff\x9a\x02\x08\x02\ +a\xff\xd7\x02\x08\x02l\xff\x9a\x02\x08\x02|\xff\x5c\x02\ +\x08\x02~\xff\x9a\x02\x08\x02\x80\xff\x85\x02\x08\x02\x82\xff\ +\x85\x02\x08\x02\x84\xff\x9a\x02\x08\x02\x86\xff\x9a\x02\x08\x02\ +\x88\xff\x9a\x02\x08\x02\x8a\xff\x9a\x02\x08\x02\x8c\xff\x9a\x02\ +\x08\x02\xa9\xffq\x02\x08\x02\xaa\xff\x9a\x02\x08\x02\xb1\xff\ +\x9a\x02\x08\x02\xb3\xff\x9a\x02\x08\x02\xb5\xffq\x02\x08\x02\ +\xb6\xff\x9a\x02\x08\x02\xb7\xff\x85\x02\x08\x02\xb9\xff\x85\x02\ +\x08\x02\xbd\xffq\x02\x08\x02\xbe\xff\x9a\x02\x08\x02\xbf\xff\ +\x5c\x02\x08\x02\xc0\xff\x85\x02\x08\x02\xc1\xff\x5c\x02\x08\x02\ +\xc2\xff\x85\x02\x08\x02\xc5\xff\x85\x02\x08\x02\xc7\xff\x85\x02\ +\x08\x02\xd4\xff\x5c\x02\x08\x02\xd5\xff\x85\x02\x08\x02\xef\xff\ +\x9a\x02\x08\x02\xf1\xff\x9a\x02\x08\x02\xf3\xff\x9a\x02\x08\x02\ +\xfd\xff\x5c\x02\x08\x02\xfe\xff\x85\x02\x08\x03\x0d\xff\x85\x02\ +\x08\x03\x0e\xff\x9a\x02\x08\x03\x0f\xff\x85\x02\x08\x03\x10\xff\ +\x9a\x02\x08\x03\x15\xff\x9a\x02\x08\x03\x17\xffq\x02\x08\x03\ +\x18\xff\x9a\x02\x08\x03I\xff\x9a\x02\x08\x03K\xff\x9a\x02\ +\x08\x03M\xff\x9a\x02\x08\x03O\xff\x9a\x02\x08\x03Q\xff\ +\x9a\x02\x08\x03S\xff\x9a\x02\x08\x03U\xff\x9a\x02\x08\x03\ +W\xff\x9a\x02\x08\x03Y\xff\x9a\x02\x08\x03[\xff\x9a\x02\ +\x08\x03]\xff\x9a\x02\x08\x03_\xff\x9a\x02\x08\x03a\xff\ +\xd7\x02\x08\x03c\xff\xd7\x02\x08\x03e\xff\xd7\x02\x08\x03\ +g\xff\xd7\x02\x08\x03i\xff\xd7\x02\x08\x03k\xff\xd7\x02\ +\x08\x03m\xff\xd7\x02\x08\x03o\xff\x85\x02\x08\x03q\xff\ +\x85\x02\x08\x03s\xff\x85\x02\x08\x03\x8f\xffq\x02\x0a\x00\ +$\xffq\x02\x0a\x007\x00)\x02\x0a\x009\x00)\x02\ +\x0a\x00:\x00)\x02\x0a\x00<\x00\x14\x02\x0a\x00D\xff\ +\xae\x02\x0a\x00F\xff\x85\x02\x0a\x00G\xff\x85\x02\x0a\x00\ +H\xff\x85\x02\x0a\x00J\xff\xc3\x02\x0a\x00P\xff\xc3\x02\ +\x0a\x00Q\xff\xc3\x02\x0a\x00R\xff\x85\x02\x0a\x00S\xff\ +\xc3\x02\x0a\x00T\xff\x85\x02\x0a\x00U\xff\xc3\x02\x0a\x00\ +V\xff\xc3\x02\x0a\x00X\xff\xc3\x02\x0a\x00\x82\xffq\x02\ +\x0a\x00\x83\xffq\x02\x0a\x00\x84\xffq\x02\x0a\x00\x85\xff\ +q\x02\x0a\x00\x86\xffq\x02\x0a\x00\x87\xffq\x02\x0a\x00\ +\x9f\x00\x14\x02\x0a\x00\xa2\xff\x85\x02\x0a\x00\xa3\xff\xae\x02\ +\x0a\x00\xa4\xff\xae\x02\x0a\x00\xa5\xff\xae\x02\x0a\x00\xa6\xff\ +\xae\x02\x0a\x00\xa7\xff\xae\x02\x0a\x00\xa8\xff\xae\x02\x0a\x00\ +\xa9\xff\x85\x02\x0a\x00\xaa\xff\x85\x02\x0a\x00\xab\xff\x85\x02\ +\x0a\x00\xac\xff\x85\x02\x0a\x00\xad\xff\x85\x02\x0a\x00\xb4\xff\ +\x85\x02\x0a\x00\xb5\xff\x85\x02\x0a\x00\xb6\xff\x85\x02\x0a\x00\ +\xb7\xff\x85\x02\x0a\x00\xb8\xff\x85\x02\x0a\x00\xba\xff\x85\x02\ +\x0a\x00\xbb\xff\xc3\x02\x0a\x00\xbc\xff\xc3\x02\x0a\x00\xbd\xff\ +\xc3\x02\x0a\x00\xbe\xff\xc3\x02\x0a\x00\xc2\xffq\x02\x0a\x00\ +\xc3\xff\xae\x02\x0a\x00\xc4\xffq\x02\x0a\x00\xc5\xff\xae\x02\ +\x0a\x00\xc6\xffq\x02\x0a\x00\xc7\xff\xae\x02\x0a\x00\xc9\xff\ +\x85\x02\x0a\x00\xcb\xff\x85\x02\x0a\x00\xcd\xff\x85\x02\x0a\x00\ +\xcf\xff\x85\x02\x0a\x00\xd1\xff\x85\x02\x0a\x00\xd3\xff\x85\x02\ +\x0a\x00\xd5\xff\x85\x02\x0a\x00\xd7\xff\x85\x02\x0a\x00\xd9\xff\ +\x85\x02\x0a\x00\xdb\xff\x85\x02\x0a\x00\xdd\xff\x85\x02\x0a\x00\ +\xdf\xff\xc3\x02\x0a\x00\xe1\xff\xc3\x02\x0a\x00\xe3\xff\xc3\x02\ +\x0a\x00\xe5\xff\xc3\x02\x0a\x00\xfa\xff\xc3\x02\x0a\x01\x06\xff\ +\xc3\x02\x0a\x01\x08\xff\xc3\x02\x0a\x01\x0d\xff\xc3\x02\x0a\x01\ +\x0f\xff\x85\x02\x0a\x01\x11\xff\x85\x02\x0a\x01\x13\xff\x85\x02\ +\x0a\x01\x15\xff\x85\x02\x0a\x01\x17\xff\xc3\x02\x0a\x01\x19\xff\ +\xc3\x02\x0a\x01\x1d\xff\xc3\x02\x0a\x01!\xff\xc3\x02\x0a\x01\ +$\x00)\x02\x0a\x01&\x00)\x02\x0a\x01+\xff\xc3\x02\ +\x0a\x01-\xff\xc3\x02\x0a\x01/\xff\xc3\x02\x0a\x011\xff\ +\xc3\x02\x0a\x013\xff\xc3\x02\x0a\x015\xff\xc3\x02\x0a\x01\ +6\x00)\x02\x0a\x018\x00\x14\x02\x0a\x01:\x00\x14\x02\ +\x0a\x01C\xffq\x02\x0a\x01D\xff\xae\x02\x0a\x01F\xff\ +\xae\x02\x0a\x01H\xff\x85\x02\x0a\x01J\xff\xc3\x02\x0a\x01\ +V\xffq\x02\x0a\x01_\xffq\x02\x0a\x01b\xffq\x02\ +\x0a\x01i\xffq\x02\x0a\x01y\xff\xae\x02\x0a\x01z\xff\ +\xd7\x02\x0a\x01{\xff\xd7\x02\x0a\x01~\xff\xae\x02\x0a\x01\ +\x81\xff\xc3\x02\x0a\x01\x82\xff\xd7\x02\x0a\x01\x83\xff\xd7\x02\ +\x0a\x01\x84\xff\xd7\x02\x0a\x01\x87\xff\xd7\x02\x0a\x01\x89\xff\ +\xd7\x02\x0a\x01\x8c\xff\xae\x02\x0a\x01\x8e\xff\xc3\x02\x0a\x01\ +\x8f\xff\xae\x02\x0a\x01\x90\xff\xae\x02\x0a\x01\x93\xff\xae\x02\ +\x0a\x01\x99\xff\xae\x02\x0a\x01\xa4\xff\x85\x02\x0a\x01\xaa\xff\ +q\x02\x0a\x01\xae\xff\x85\x02\x0a\x01\xb5\xff\x85\x02\x0a\x01\ +\xca\xff\xd7\x02\x0a\x01\xce\xffq\x02\x0a\x01\xcf\xff\x85\x02\ +\x0a\x01\xd5\xffq\x02\x0a\x01\xd8\xff\x85\x02\x0a\x01\xdb\xff\ +\x85\x02\x0a\x01\xde\xff\x85\x02\x0a\x01\xea\xff\x85\x02\x0a\x01\ +\xed\xff\x85\x02\x0a\x01\xee\xff\xc3\x02\x0a\x01\xf2\xffq\x02\ +\x0a\x01\xfa\x00)\x02\x0a\x01\xfc\x00)\x02\x0a\x01\xfe\x00\ +)\x02\x0a\x02\x00\x00\x14\x02\x0a\x02W\xff\xc3\x02\x0a\x02\ +X\xffq\x02\x0a\x02Y\xff\xae\x02\x0a\x02`\xff\x85\x02\ +\x0a\x02b\xff\xc3\x02\x0a\x02j\xff\x85\x02\x0a\x02r\xff\ +q\x02\x0a\x02s\xffq\x02\x0a\x02}\xff\xec\x02\x0a\x02\ +\x7f\xff\x85\x02\x0a\x02\x85\xff\x85\x02\x0a\x02\x87\xff\x85\x02\ +\x0a\x02\x89\xff\x85\x02\x0a\x02\x8d\xff\x85\x02\x0a\x02\xb2\xff\ +\x85\x02\x0a\x02\xb4\xff\x85\x02\x0a\x02\xce\xff\x85\x02\x0a\x02\ +\xcf\xffq\x02\x0a\x02\xd9\xffq\x02\x0a\x02\xda\xff\xd7\x02\ +\x0a\x02\xdb\xffq\x02\x0a\x02\xdc\xff\xd7\x02\x0a\x02\xdd\xff\ +q\x02\x0a\x02\xde\xff\xd7\x02\x0a\x02\xe0\xff\x85\x02\x0a\x02\ +\xe2\xff\xd7\x02\x0a\x02\xe4\xff\xd7\x02\x0a\x02\xf0\xff\x85\x02\ +\x0a\x02\xf2\xff\x85\x02\x0a\x02\xf4\xff\x85\x02\x0a\x03\x09\xff\ +q\x02\x0a\x03\x0a\xff\x85\x02\x0a\x03\x0b\xffq\x02\x0a\x03\ +\x0c\xff\x85\x02\x0a\x03\x11\xff\x85\x02\x0a\x03\x12\xffq\x02\ +\x0a\x03\x16\xff\x85\x02\x0a\x03\x1a\xff\x85\x02\x0a\x03\x1b\xff\ +\x85\x02\x0a\x03\x1c\xffq\x02\x0a\x03\x1d\xffq\x02\x0a\x03\ +\x1e\xff\xae\x02\x0a\x03\x1f\xffq\x02\x0a\x03 \xff\xae\x02\ +\x0a\x03!\xffq\x02\x0a\x03\x22\xff\xae\x02\x0a\x03#\xff\ +q\x02\x0a\x03%\xffq\x02\x0a\x03&\xff\xae\x02\x0a\x03\ +'\xffq\x02\x0a\x03(\xff\xae\x02\x0a\x03)\xffq\x02\ +\x0a\x03*\xff\xae\x02\x0a\x03+\xffq\x02\x0a\x03,\xff\ +\xae\x02\x0a\x03-\xffq\x02\x0a\x03.\xff\xae\x02\x0a\x03\ +/\xffq\x02\x0a\x030\xff\xae\x02\x0a\x031\xffq\x02\ +\x0a\x032\xff\xae\x02\x0a\x033\xffq\x02\x0a\x034\xff\ +\xae\x02\x0a\x036\xff\x85\x02\x0a\x038\xff\x85\x02\x0a\x03\ +:\xff\x85\x02\x0a\x03<\xff\x85\x02\x0a\x03@\xff\x85\x02\ +\x0a\x03B\xff\x85\x02\x0a\x03D\xff\x85\x02\x0a\x03J\xff\ +\x85\x02\x0a\x03L\xff\x85\x02\x0a\x03N\xff\x85\x02\x0a\x03\ +R\xff\x85\x02\x0a\x03T\xff\x85\x02\x0a\x03V\xff\x85\x02\ +\x0a\x03X\xff\x85\x02\x0a\x03Z\xff\x85\x02\x0a\x03\x5c\xff\ +\x85\x02\x0a\x03^\xff\x85\x02\x0a\x03`\xff\x85\x02\x0a\x03\ +b\xff\xc3\x02\x0a\x03d\xff\xc3\x02\x0a\x03f\xff\xc3\x02\ +\x0a\x03h\xff\xc3\x02\x0a\x03j\xff\xc3\x02\x0a\x03l\xff\ +\xc3\x02\x0a\x03n\xff\xc3\x02\x0a\x03o\x00\x14\x02\x0a\x03\ +q\x00\x14\x02\x0a\x03s\x00\x14\x02\x0a\x03\x8f\x00)\x02\ +\x0c\x00&\xff\x9a\x02\x0c\x00*\xff\x9a\x02\x0c\x002\xff\ +\x9a\x02\x0c\x004\xff\x9a\x02\x0c\x007\xffq\x02\x0c\x00\ +8\xff\xd7\x02\x0c\x009\xff\x85\x02\x0c\x00:\xff\x85\x02\ +\x0c\x00<\xff\x85\x02\x0c\x00\x89\xff\x9a\x02\x0c\x00\x94\xff\ +\x9a\x02\x0c\x00\x95\xff\x9a\x02\x0c\x00\x96\xff\x9a\x02\x0c\x00\ +\x97\xff\x9a\x02\x0c\x00\x98\xff\x9a\x02\x0c\x00\x9a\xff\x9a\x02\ +\x0c\x00\x9b\xff\xd7\x02\x0c\x00\x9c\xff\xd7\x02\x0c\x00\x9d\xff\ +\xd7\x02\x0c\x00\x9e\xff\xd7\x02\x0c\x00\x9f\xff\x85\x02\x0c\x00\ +\xc8\xff\x9a\x02\x0c\x00\xca\xff\x9a\x02\x0c\x00\xcc\xff\x9a\x02\ +\x0c\x00\xce\xff\x9a\x02\x0c\x00\xde\xff\x9a\x02\x0c\x00\xe0\xff\ +\x9a\x02\x0c\x00\xe2\xff\x9a\x02\x0c\x00\xe4\xff\x9a\x02\x0c\x01\ +\x0e\xff\x9a\x02\x0c\x01\x10\xff\x9a\x02\x0c\x01\x12\xff\x9a\x02\ +\x0c\x01\x14\xff\x9a\x02\x0c\x01$\xffq\x02\x0c\x01&\xff\ +q\x02\x0c\x01*\xff\xd7\x02\x0c\x01,\xff\xd7\x02\x0c\x01\ +.\xff\xd7\x02\x0c\x010\xff\xd7\x02\x0c\x012\xff\xd7\x02\ +\x0c\x014\xff\xd7\x02\x0c\x016\xff\x85\x02\x0c\x018\xff\ +\x85\x02\x0c\x01:\xff\x85\x02\x0c\x01G\xff\x9a\x02\x0c\x01\ +f\xff\xae\x02\x0c\x01m\xff\xae\x02\x0c\x01q\xffq\x02\ +\x0c\x01r\xff\x85\x02\x0c\x01s\xff\x9a\x02\x0c\x01u\xff\ +\x85\x02\x0c\x01x\xff\x85\x02\x0c\x01\x85\xff\xd7\x02\x0c\x01\ +\x9d\xffq\x02\x0c\x01\x9f\xff\x9a\x02\x0c\x01\xa6\xffq\x02\ +\x0c\x01\xb8\xff\x9a\x02\x0c\x01\xbb\xff\x9a\x02\x0c\x01\xbc\xff\ +q\x02\x0c\x01\xbe\xff\xae\x02\x0c\x01\xc1\xff\x5c\x02\x0c\x01\ +\xc4\xffq\x02\x0c\x01\xdc\xff\x9a\x02\x0c\x01\xe1\xff\x85\x02\ +\x0c\x01\xe4\xff\x9a\x02\x0c\x01\xfa\xff\x85\x02\x0c\x01\xfc\xff\ +\x85\x02\x0c\x01\xfe\xff\x85\x02\x0c\x02\x00\xff\x85\x02\x0c\x02\ +T\xff\x85\x02\x0c\x02_\xff\x9a\x02\x0c\x02a\xff\xd7\x02\ +\x0c\x02l\xff\x9a\x02\x0c\x02|\xff\x5c\x02\x0c\x02~\xff\ +\x9a\x02\x0c\x02\x80\xff\x85\x02\x0c\x02\x82\xff\x85\x02\x0c\x02\ +\x84\xff\x9a\x02\x0c\x02\x86\xff\x9a\x02\x0c\x02\x88\xff\x9a\x02\ +\x0c\x02\x8a\xff\x9a\x02\x0c\x02\x8c\xff\x9a\x02\x0c\x02\xa9\xff\ +q\x02\x0c\x02\xaa\xff\x9a\x02\x0c\x02\xb1\xff\x9a\x02\x0c\x02\ +\xb3\xff\x9a\x02\x0c\x02\xb5\xffq\x02\x0c\x02\xb6\xff\x9a\x02\ +\x0c\x02\xb7\xff\x85\x02\x0c\x02\xb9\xff\x85\x02\x0c\x02\xbd\xff\ +q\x02\x0c\x02\xbe\xff\x9a\x02\x0c\x02\xbf\xff\x5c\x02\x0c\x02\ +\xc0\xff\x85\x02\x0c\x02\xc1\xff\x5c\x02\x0c\x02\xc2\xff\x85\x02\ +\x0c\x02\xc5\xff\x85\x02\x0c\x02\xc7\xff\x85\x02\x0c\x02\xd4\xff\ +\x5c\x02\x0c\x02\xd5\xff\x85\x02\x0c\x02\xef\xff\x9a\x02\x0c\x02\ +\xf1\xff\x9a\x02\x0c\x02\xf3\xff\x9a\x02\x0c\x02\xfd\xff\x5c\x02\ +\x0c\x02\xfe\xff\x85\x02\x0c\x03\x0d\xff\x85\x02\x0c\x03\x0e\xff\ +\x9a\x02\x0c\x03\x0f\xff\x85\x02\x0c\x03\x10\xff\x9a\x02\x0c\x03\ +\x15\xff\x9a\x02\x0c\x03\x17\xffq\x02\x0c\x03\x18\xff\x9a\x02\ +\x0c\x03I\xff\x9a\x02\x0c\x03K\xff\x9a\x02\x0c\x03M\xff\ +\x9a\x02\x0c\x03O\xff\x9a\x02\x0c\x03Q\xff\x9a\x02\x0c\x03\ +S\xff\x9a\x02\x0c\x03U\xff\x9a\x02\x0c\x03W\xff\x9a\x02\ +\x0c\x03Y\xff\x9a\x02\x0c\x03[\xff\x9a\x02\x0c\x03]\xff\ +\x9a\x02\x0c\x03_\xff\x9a\x02\x0c\x03a\xff\xd7\x02\x0c\x03\ +c\xff\xd7\x02\x0c\x03e\xff\xd7\x02\x0c\x03g\xff\xd7\x02\ +\x0c\x03i\xff\xd7\x02\x0c\x03k\xff\xd7\x02\x0c\x03m\xff\ +\xd7\x02\x0c\x03o\xff\x85\x02\x0c\x03q\xff\x85\x02\x0c\x03\ +s\xff\x85\x02\x0c\x03\x8f\xffq\x02!\x01q\xff\xd7\x02\ +!\x01r\xff\xec\x02!\x01x\xff\xec\x02!\x02T\xff\ +\xec\x02S\x00\x0f\xff\xc3\x02S\x00\x11\xff\xc3\x02S\x02\ +\x08\xff\xc3\x02S\x02\x0c\xff\xc3\x02T\x00\x0f\xff\x85\x02\ +T\x00\x11\xff\x85\x02T\x01V\xff\x85\x02T\x01_\xff\ +\x85\x02T\x01b\xff\x85\x02T\x01f\xff\xd7\x02T\x01\ +i\xff\x85\x02T\x01m\xff\xd7\x02T\x01s\xff\xc3\x02\ +T\x01v\xff\xec\x02T\x01y\xff\x9a\x02T\x01z\xff\ +\xae\x02T\x01{\xff\xc3\x02T\x01|\xff\xc3\x02T\x01\ +}\xff\xc3\x02T\x01~\xff\x9a\x02T\x01\x81\xff\xc3\x02\ +T\x01\x82\xff\xae\x02T\x01\x84\xff\xc3\x02T\x01\x86\xff\ +\xc3\x02T\x01\x87\xff\xc3\x02T\x01\x89\xff\xc3\x02T\x01\ +\x8c\xff\x9a\x02T\x01\x8e\xff\x9a\x02T\x01\x8f\xff\x9a\x02\ +T\x01\x90\xff\x9a\x02T\x01\x92\xff\xc3\x02T\x01\x93\xff\ +\x9a\x02T\x01\x95\xff\xc3\x02T\x01\x96\xff\xc3\x02T\x01\ +\x98\xff\xc3\x02T\x01\x99\xff\x9a\x02T\x01\x9a\xff\xc3\x02\ +T\x01\x9b\xff\xc3\x02T\x02\x08\xff\x85\x02T\x02\x0c\xff\ +\x85\x02T\x02!\xff\xec\x02X\x00\x05\xffq\x02X\x00\ +\x0a\xffq\x02X\x00&\xff\xd7\x02X\x00*\xff\xd7\x02\ +X\x00-\x01\x0a\x02X\x002\xff\xd7\x02X\x004\xff\ +\xd7\x02X\x007\xffq\x02X\x009\xff\xae\x02X\x00\ +:\xff\xae\x02X\x00<\xff\x85\x02X\x00\x89\xff\xd7\x02\ +X\x00\x94\xff\xd7\x02X\x00\x95\xff\xd7\x02X\x00\x96\xff\ +\xd7\x02X\x00\x97\xff\xd7\x02X\x00\x98\xff\xd7\x02X\x00\ +\x9a\xff\xd7\x02X\x00\x9f\xff\x85\x02X\x00\xc8\xff\xd7\x02\ +X\x00\xca\xff\xd7\x02X\x00\xcc\xff\xd7\x02X\x00\xce\xff\ +\xd7\x02X\x00\xde\xff\xd7\x02X\x00\xe0\xff\xd7\x02X\x00\ +\xe2\xff\xd7\x02X\x00\xe4\xff\xd7\x02X\x01\x0e\xff\xd7\x02\ +X\x01\x10\xff\xd7\x02X\x01\x12\xff\xd7\x02X\x01\x14\xff\ +\xd7\x02X\x01$\xffq\x02X\x01&\xffq\x02X\x01\ +6\xff\xae\x02X\x018\xff\x85\x02X\x01:\xff\x85\x02\ +X\x01G\xff\xd7\x02X\x01\xfa\xff\xae\x02X\x01\xfc\xff\ +\xae\x02X\x01\xfe\xff\xae\x02X\x02\x00\xff\x85\x02X\x02\ +\x07\xffq\x02X\x02\x0b\xffq\x02X\x02_\xff\xd7\x02\ +X\x03I\xff\xd7\x02X\x03K\xff\xd7\x02X\x03M\xff\ +\xd7\x02X\x03O\xff\xd7\x02X\x03Q\xff\xd7\x02X\x03\ +S\xff\xd7\x02X\x03U\xff\xd7\x02X\x03W\xff\xd7\x02\ +X\x03Y\xff\xd7\x02X\x03[\xff\xd7\x02X\x03]\xff\ +\xd7\x02X\x03_\xff\xd7\x02X\x03o\xff\x85\x02X\x03\ +q\xff\x85\x02X\x03s\xff\x85\x02X\x03\x8f\xffq\x02\ +Y\x00\x05\xff\xec\x02Y\x00\x0a\xff\xec\x02Y\x02\x07\xff\ +\xec\x02Y\x02\x0b\xff\xec\x02Z\x00\x0f\xff\xae\x02Z\x00\ +\x11\xff\xae\x02Z\x01V\xff\xd7\x02Z\x01_\xff\xd7\x02\ +Z\x01b\xff\xd7\x02Z\x01d\xff\xec\x02Z\x01i\xff\ +\xd7\x02Z\x01p\xff\xec\x02Z\x01q\xff\xc3\x02Z\x01\ +r\xff\xec\x02Z\x01t\xff\xd7\x02Z\x01u\xff\xec\x02\ +Z\x01x\xff\xec\x02Z\x01\x88\xff\xec\x02Z\x02\x08\xff\ +\xae\x02Z\x02\x0c\xff\xae\x02Z\x02T\xff\xec\x02`\x00\ +I\x00R\x02`\x00W\x00R\x02`\x00Y\x00f\x02\ +`\x00Z\x00f\x02`\x00[\x00f\x02`\x00\x5c\x00\ +f\x02`\x00\xbf\x00f\x02`\x01%\x00R\x02`\x01\ +'\x00R\x02`\x017\x00f\x02`\x01\xfb\x00f\x02\ +`\x01\xfd\x00f\x02`\x024\x00R\x02`\x025\x00\ +R\x02`\x02]\x00R\x02`\x02^\x00R\x02`\x03\ +p\x00f\x02`\x03\x8d\x00R\x02`\x03\x90\x00R\x02\ +b\x00I\x00f\x02b\x00W\x00f\x02b\x00Y\x00\ +f\x02b\x00Z\x00f\x02b\x00[\x00f\x02b\x00\ +\x5c\x00f\x02b\x00\xbf\x00f\x02b\x01%\x00f\x02\ +b\x01'\x00f\x02b\x017\x00f\x02b\x01\xfb\x00\ +f\x02b\x01\xfd\x00f\x02b\x024\x00f\x02b\x02\ +5\x00f\x02b\x02]\x00f\x02b\x02^\x00f\x02\ +b\x03p\x00f\x02b\x03\x8d\x00f\x02b\x03\x90\x00\ +f\x02j\x00\x05\xff\xec\x02j\x00\x0a\xff\xec\x02j\x02\ +\x07\xff\xec\x02j\x02\x0b\xff\xec\x02l\x00\x0f\xff\xae\x02\ +l\x00\x11\xff\xae\x02l\x01\x9d\xff\xec\x02l\x01\xa4\xff\ +\xd7\x02l\x01\xa6\xff\xec\x02l\x01\xa8\xff\xd7\x02l\x01\ +\xaa\xff\xd7\x02l\x01\xae\xff\xd7\x02l\x01\xb0\xff\xd7\x02\ +l\x01\xb1\xff\xec\x02l\x01\xb5\xff\xd7\x02l\x01\xbc\xff\ +\xc3\x02l\x01\xbd\xff\xd7\x02l\x01\xbf\xff\xd7\x02l\x01\ +\xc1\xff\xd7\x02l\x01\xc4\xff\xec\x02l\x01\xc7\xff\xec\x02\ +l\x01\xce\xff\xec\x02l\x01\xd5\xff\xec\x02l\x01\xf2\xff\ +\xec\x02l\x02\x08\xff\xae\x02l\x02\x0c\xff\xae\x02l\x02\ +r\xff\xd7\x02l\x02s\xff\xec\x02l\x02z\xff\xec\x02\ +l\x02|\xff\xd7\x02l\x02\x80\xff\xec\x02l\x02\x82\xff\ +\xec\x02l\x02\x9f\xff\xd7\x02l\x02\xa1\xff\xec\x02l\x02\ +\xa9\xff\xec\x02l\x02\xb5\xff\xc3\x02l\x02\xb7\xff\xec\x02\ +l\x02\xb9\xff\xec\x02l\x02\xbb\xff\xd7\x02l\x02\xbd\xff\ +\xec\x02l\x02\xbf\xff\xd7\x02l\x02\xc1\xff\xd7\x02l\x02\ +\xca\xff\xd7\x02l\x02\xce\xff\xd7\x02l\x02\xcf\xff\xec\x02\ +l\x02\xd4\xff\xd7\x02l\x02\xd9\xff\xd7\x02l\x02\xdb\xff\ +\xd7\x02l\x02\xdd\xff\xd7\x02l\x02\xe5\xff\xd7\x02l\x02\ +\xe7\xff\xec\x02l\x02\xf5\xff\xec\x02l\x02\xf7\xff\xd7\x02\ +l\x02\xf9\xff\xd7\x02l\x02\xfb\xff\xd7\x02l\x02\xfd\xff\ +\xd7\x02l\x03\x05\xff\xd7\x02l\x03\x07\xff\xd7\x02l\x03\ +\x0d\xff\xd7\x02l\x03\x0f\xff\xd7\x02l\x03\x11\xff\xd7\x02\ +l\x03\x12\xff\xec\x02l\x03\x17\xff\xec\x02l\x03\x1b\xff\ +\xd7\x02l\x03\x1c\xff\xec\x02m\x00\x0f\xff\xae\x02m\x00\ +\x11\xff\xae\x02m\x01\xce\xff\xd7\x02m\x01\xd5\xff\xd7\x02\ +m\x01\xf2\xff\xd7\x02m\x02\x08\xff\xae\x02m\x02\x0c\xff\ +\xae\x02m\x02s\xff\xd7\x02m\x02\xcf\xff\xd7\x02m\x03\ +\x12\xff\xd7\x02m\x03\x1c\xff\xd7\x02n\x00\x05\xff\xae\x02\ +n\x00\x0a\xff\xae\x02n\x01\x9d\xff\xd7\x02n\x01\xa6\xff\ +\xd7\x02n\x01\xbc\xff\xae\x02n\x01\xc1\xff\xae\x02n\x01\ +\xc4\xff\xd7\x02n\x01\xdc\xff\xd7\x02n\x01\xe4\xff\xd7\x02\ +n\x02\x07\xff\xae\x02n\x02\x0b\xff\xae\x02n\x02|\xff\ +\xae\x02n\x02\x80\xff\xc3\x02n\x02\x82\xff\xc3\x02n\x02\ +\xa9\xff\xd7\x02n\x02\xaa\xff\xd7\x02n\x02\xb5\xff\xae\x02\ +n\x02\xb6\xff\xd7\x02n\x02\xb7\xff\xc3\x02n\x02\xb9\xff\ +\xc3\x02n\x02\xbd\xff\xd7\x02n\x02\xbe\xff\xd7\x02n\x02\ +\xbf\xff\xae\x02n\x02\xc1\xff\xae\x02n\x02\xd4\xff\xae\x02\ +n\x02\xfd\xff\xae\x02n\x03\x0d\xff\x9a\x02n\x03\x0f\xff\ +\x9a\x02n\x03\x17\xff\xd7\x02n\x03\x18\xff\xd7\x02o\x00\ +\x05\xff\x85\x02o\x00\x0a\xff\x85\x02o\x01\xd0\xff\xd7\x02\ +o\x01\xdc\xff\x9a\x02o\x01\xdd\xff\xc3\x02o\x01\xdf\xff\ +\xd7\x02o\x01\xe1\xff\xae\x02o\x01\xe4\xff\x9a\x02o\x01\ +\xf6\xff\xc3\x02o\x02\x07\xff\x85\x02o\x02\x0b\xff\x85\x02\ +o\x02m\xff\xd7\x02o\x02\x81\xff\xd7\x02o\x02\x83\xff\ +\xd7\x02o\x02\x8b\xff\xd7\x02o\x02\xa0\xff\xd7\x02o\x02\ +\xaa\xff\x9a\x02o\x02\xb6\xff\x9a\x02o\x02\xb8\xff\xc3\x02\ +o\x02\xba\xff\xc3\x02o\x02\xbc\xff\xd7\x02o\x02\xbe\xff\ +\x9a\x02o\x02\xc0\xff\xae\x02o\x02\xc2\xff\xae\x02o\x02\ +\xc6\xff\xd7\x02o\x02\xc8\xff\xd7\x02o\x02\xcb\xff\xd7\x02\ +o\x02\xd5\xff\xae\x02o\x02\xe6\xff\xd7\x02o\x02\xea\xff\ +\xd7\x02o\x02\xf8\xff\xc3\x02o\x02\xfa\xff\xc3\x02o\x02\ +\xfc\xff\xc3\x02o\x02\xfe\xff\xae\x02o\x03\x06\xff\xd7\x02\ +o\x03\x08\xff\xd7\x02o\x03\x0e\xff\x9a\x02o\x03\x10\xff\ +\x9a\x02o\x03\x18\xff\x9a\x02p\x01\x9f\xff\xd7\x02p\x01\ +\xb8\xff\xd7\x02p\x01\xbb\xff\xd7\x02p\x01\xbe\xff\xd7\x02\ +p\x01\xe1\xff\xd7\x02p\x02l\xff\xd7\x02p\x02~\xff\ +\xd7\x02p\x02\x84\xff\xd7\x02p\x02\x86\xff\xd7\x02p\x02\ +\x88\xff\xd7\x02p\x02\x8a\xff\xd7\x02p\x02\x8c\xff\xd7\x02\ +p\x02\xb1\xff\xd7\x02p\x02\xb3\xff\xd7\x02p\x02\xc0\xff\ +\xd7\x02p\x02\xc2\xff\xd7\x02p\x02\xc5\xff\xd7\x02p\x02\ +\xc7\xff\xd7\x02p\x02\xd5\xff\xd7\x02p\x02\xef\xff\xd7\x02\ +p\x02\xf1\xff\xd7\x02p\x02\xf3\xff\xd7\x02p\x02\xfe\xff\ +\xd7\x02p\x03\x09\xff\xd7\x02p\x03\x0b\xff\xd7\x02p\x03\ +\x0e\xff\xd7\x02p\x03\x10\xff\xd7\x02p\x03\x15\xff\xd7\x02\ +r\x00\x05\xffq\x02r\x00\x0a\xffq\x02r\x01\x9d\xff\ +\x9a\x02r\x01\xa6\xff\x9a\x02r\x01\xbc\xffq\x02r\x01\ +\xbe\xff\xd7\x02r\x01\xc1\xff\x9a\x02r\x01\xc4\xff\x9a\x02\ +r\x01\xdc\xff\xd7\x02r\x01\xe1\xff\xd7\x02r\x01\xe4\xff\ +\xd7\x02r\x02\x07\xffq\x02r\x02\x0b\xffq\x02r\x02\ +n\xff\xd7\x02r\x02|\xff\x9a\x02r\x02\x80\xff\xae\x02\ +r\x02\x82\xff\xae\x02r\x02\x97\xff\xd7\x02r\x02\x9b\xff\ +\xd7\x02r\x02\xa7\xff\xd7\x02r\x02\xa9\xff\x9a\x02r\x02\ +\xaa\xff\xd7\x02r\x02\xb5\xffq\x02r\x02\xb6\xff\xd7\x02\ +r\x02\xb7\xff\x85\x02r\x02\xb9\xff\x85\x02r\x02\xbd\xff\ +\x9a\x02r\x02\xbe\xff\xd7\x02r\x02\xbf\xff\x9a\x02r\x02\ +\xc0\xff\xd7\x02r\x02\xc1\xff\x9a\x02r\x02\xc2\xff\xd7\x02\ +r\x02\xc5\xff\x9a\x02r\x02\xc7\xff\x9a\x02r\x02\xd4\xff\ +\x9a\x02r\x02\xd5\xff\xd7\x02r\x02\xe1\xff\xd7\x02r\x02\ +\xe3\xff\xd7\x02r\x02\xfd\xff\x9a\x02r\x02\xfe\xff\xd7\x02\ +r\x03\x03\xff\xd7\x02r\x03\x0d\xffq\x02r\x03\x0e\xff\ +\xd7\x02r\x03\x0f\xffq\x02r\x03\x10\xff\xd7\x02r\x03\ +\x17\xff\x9a\x02r\x03\x18\xff\xd7\x02s\x00\x05\xffq\x02\ +s\x00\x0a\xffq\x02s\x01\xcf\xff\xd7\x02s\x01\xd8\xff\ +\xd7\x02s\x01\xdb\xff\xd7\x02s\x01\xdc\xff\x9a\x02s\x01\ +\xdd\xff\xc3\x02s\x01\xde\xff\xd7\x02s\x01\xe1\xff\xc3\x02\ +s\x01\xe4\xff\x9a\x02s\x01\xea\xff\xd7\x02s\x01\xed\xff\ +\xd7\x02s\x01\xf6\xff\xc3\x02s\x02\x07\xffq\x02s\x02\ +\x0b\xffq\x02s\x02j\xff\xd7\x02s\x02m\xff\xd7\x02\ +s\x02}\xff\xec\x02s\x02\x7f\xff\xd7\x02s\x02\x81\xff\ +\xd7\x02s\x02\x83\xff\xd7\x02s\x02\x85\xff\xd7\x02s\x02\ +\x87\xff\xd7\x02s\x02\x89\xff\xd7\x02s\x02\x8b\xff\xd7\x02\ +s\x02\x8d\xff\xd7\x02s\x02\xaa\xff\x9a\x02s\x02\xb2\xff\ +\xd7\x02s\x02\xb4\xff\xd7\x02s\x02\xb6\xff\x9a\x02s\x02\ +\xb8\xff\xd7\x02s\x02\xba\xff\xd7\x02s\x02\xbe\xff\x9a\x02\ +s\x02\xc0\xff\xc3\x02s\x02\xc2\xff\xc3\x02s\x02\xc6\xff\ +\xd7\x02s\x02\xc8\xff\xd7\x02s\x02\xd5\xff\xc3\x02s\x02\ +\xe0\xff\xd7\x02s\x02\xf0\xff\xd7\x02s\x02\xf2\xff\xd7\x02\ +s\x02\xf4\xff\xd7\x02s\x02\xf8\xff\xc3\x02s\x02\xfa\xff\ +\xc3\x02s\x02\xfc\xff\xc3\x02s\x02\xfe\xff\xc3\x02s\x03\ +\x0a\xff\xd7\x02s\x03\x0c\xff\xd7\x02s\x03\x0e\xff\x85\x02\ +s\x03\x10\xff\x85\x02s\x03\x16\xff\xd7\x02s\x03\x18\xff\ +\x9a\x02s\x03\x1a\xff\xd7\x02t\x00\x05\xffq\x02t\x00\ +\x0a\xffq\x02t\x01\x9d\xff\x9a\x02t\x01\xa6\xff\x9a\x02\ +t\x01\xbc\xffq\x02t\x01\xbe\xff\xd7\x02t\x01\xc1\xff\ +\x9a\x02t\x01\xc4\xff\x9a\x02t\x01\xdc\xff\xd7\x02t\x01\ +\xe1\xff\xd7\x02t\x01\xe4\xff\xd7\x02t\x02\x07\xffq\x02\ +t\x02\x0b\xffq\x02t\x02n\xff\xd7\x02t\x02|\xff\ +\x9a\x02t\x02\x80\xff\xae\x02t\x02\x82\xff\xae\x02t\x02\ +\x97\xff\xd7\x02t\x02\x9b\xff\xd7\x02t\x02\xa7\xff\xd7\x02\ +t\x02\xa9\xff\x9a\x02t\x02\xaa\xff\xd7\x02t\x02\xb5\xff\ +q\x02t\x02\xb6\xff\xd7\x02t\x02\xb7\xff\x85\x02t\x02\ +\xb9\xff\x85\x02t\x02\xbd\xff\x9a\x02t\x02\xbe\xff\xd7\x02\ +t\x02\xbf\xff\x9a\x02t\x02\xc0\xff\xd7\x02t\x02\xc1\xff\ +\x9a\x02t\x02\xc2\xff\xd7\x02t\x02\xc5\xff\x9a\x02t\x02\ +\xc7\xff\x9a\x02t\x02\xd4\xff\x9a\x02t\x02\xd5\xff\xd7\x02\ +t\x02\xe1\xff\xd7\x02t\x02\xe3\xff\xd7\x02t\x02\xfd\xff\ +\x9a\x02t\x02\xfe\xff\xd7\x02t\x03\x03\xff\xd7\x02t\x03\ +\x0d\xffq\x02t\x03\x0e\xff\xd7\x02t\x03\x0f\xffq\x02\ +t\x03\x10\xff\xd7\x02t\x03\x17\xff\x9a\x02t\x03\x18\xff\ +\xd7\x02u\x00\x05\xffq\x02u\x00\x0a\xffq\x02u\x01\ +\xcf\xff\xd7\x02u\x01\xd8\xff\xd7\x02u\x01\xdb\xff\xd7\x02\ +u\x01\xdc\xff\x9a\x02u\x01\xdd\xff\xc3\x02u\x01\xde\xff\ +\xd7\x02u\x01\xe1\xff\xc3\x02u\x01\xe4\xff\x9a\x02u\x01\ +\xea\xff\xd7\x02u\x01\xed\xff\xd7\x02u\x01\xf6\xff\xc3\x02\ +u\x02\x07\xffq\x02u\x02\x0b\xffq\x02u\x02j\xff\ +\xd7\x02u\x02m\xff\xd7\x02u\x02}\xff\xec\x02u\x02\ +\x7f\xff\xd7\x02u\x02\x81\xff\xd7\x02u\x02\x83\xff\xd7\x02\ +u\x02\x85\xff\xd7\x02u\x02\x87\xff\xd7\x02u\x02\x89\xff\ +\xd7\x02u\x02\x8b\xff\xd7\x02u\x02\x8d\xff\xd7\x02u\x02\ +\xaa\xff\x9a\x02u\x02\xb2\xff\xd7\x02u\x02\xb4\xff\xd7\x02\ +u\x02\xb6\xff\x9a\x02u\x02\xb8\xff\xd7\x02u\x02\xba\xff\ +\xd7\x02u\x02\xbe\xff\x9a\x02u\x02\xc0\xff\xc3\x02u\x02\ +\xc2\xff\xc3\x02u\x02\xc6\xff\xd7\x02u\x02\xc8\xff\xd7\x02\ +u\x02\xd5\xff\xc3\x02u\x02\xe0\xff\xd7\x02u\x02\xf0\xff\ +\xd7\x02u\x02\xf2\xff\xd7\x02u\x02\xf4\xff\xd7\x02u\x02\ +\xf8\xff\xc3\x02u\x02\xfa\xff\xc3\x02u\x02\xfc\xff\xc3\x02\ +u\x02\xfe\xff\xc3\x02u\x03\x0a\xff\xd7\x02u\x03\x0c\xff\ +\xd7\x02u\x03\x0e\xff\x85\x02u\x03\x10\xff\x85\x02u\x03\ +\x16\xff\xd7\x02u\x03\x18\xff\x9a\x02u\x03\x1a\xff\xd7\x02\ +v\x03\x0d\xff\xec\x02v\x03\x0f\xff\xec\x02x\x03\x0d\xff\ +\xec\x02x\x03\x0f\xff\xec\x02z\x00\x0f\xff\xae\x02z\x00\ +\x11\xff\xae\x02z\x02\x08\xff\xae\x02z\x02\x0c\xff\xae\x02\ +z\x02\x80\xff\xec\x02z\x02\x82\xff\xec\x02z\x02\xb7\xff\ +\xec\x02z\x02\xb9\xff\xec\x02z\x03\x0d\xff\xd7\x02z\x03\ +\x0f\xff\xd7\x02|\x00\x0f\xffq\x02|\x00\x11\xffq\x02\ +|\x01\xa4\xff\xc3\x02|\x01\xaa\xff\xae\x02|\x01\xae\xff\ +\xc3\x02|\x01\xb5\xff\xc3\x02|\x01\xce\xff\xd7\x02|\x01\ +\xd5\xff\xd7\x02|\x01\xf2\xff\xd7\x02|\x02\x08\xffq\x02\ +|\x02\x0c\xffq\x02|\x02r\xff\xae\x02|\x02s\xff\ +\xd7\x02|\x02\xce\xff\xc3\x02|\x02\xcf\xff\xd7\x02|\x02\ +\xd9\xff\xae\x02|\x02\xdb\xff\xae\x02|\x02\xdd\xff\xae\x02\ +|\x03\x09\xff\xae\x02|\x03\x0b\xff\xae\x02|\x03\x11\xff\ +\xc3\x02|\x03\x12\xff\xd7\x02|\x03\x1b\xff\xc3\x02|\x03\ +\x1c\xff\xd7\x02}\x00\x05\xff\xec\x02}\x00\x0a\xff\xec\x02\ +}\x01\xd0\xff\xd7\x02}\x01\xdc\xff\xec\x02}\x01\xdd\xff\ +\xec\x02}\x01\xdf\xff\xd7\x02}\x01\xe1\xff\xec\x02}\x01\ +\xe4\xff\xec\x02}\x01\xf6\xff\xec\x02}\x02\x07\xff\xec\x02\ +}\x02\x0b\xff\xec\x02}\x02\xa0\xff\xd7\x02}\x02\xaa\xff\ +\xec\x02}\x02\xb6\xff\xec\x02}\x02\xbc\xff\xd7\x02}\x02\ +\xbe\xff\xec\x02}\x02\xc0\xff\xec\x02}\x02\xc2\xff\xec\x02\ +}\x02\xcb\xff\xd7\x02}\x02\xd5\xff\xec\x02}\x02\xe6\xff\ +\xd7\x02}\x02\xf8\xff\xec\x02}\x02\xfa\xff\xec\x02}\x02\ +\xfc\xff\xec\x02}\x02\xfe\xff\xec\x02}\x03\x06\xff\xd7\x02\ +}\x03\x08\xff\xd7\x02}\x03\x0e\xff\xec\x02}\x03\x10\xff\ +\xec\x02}\x03\x18\xff\xec\x02~\x00\x0f\xff\xae\x02~\x00\ +\x11\xff\xae\x02~\x01\x9d\xff\xec\x02~\x01\xa4\xff\xd7\x02\ +~\x01\xa6\xff\xec\x02~\x01\xa8\xff\xd7\x02~\x01\xaa\xff\ +\xd7\x02~\x01\xae\xff\xd7\x02~\x01\xb0\xff\xd7\x02~\x01\ +\xb1\xff\xec\x02~\x01\xb5\xff\xd7\x02~\x01\xbc\xff\xc3\x02\ +~\x01\xbd\xff\xd7\x02~\x01\xbf\xff\xd7\x02~\x01\xc1\xff\ +\xd7\x02~\x01\xc4\xff\xec\x02~\x01\xc7\xff\xec\x02~\x01\ +\xce\xff\xec\x02~\x01\xd5\xff\xec\x02~\x01\xf2\xff\xec\x02\ +~\x02\x08\xff\xae\x02~\x02\x0c\xff\xae\x02~\x02r\xff\ +\xd7\x02~\x02s\xff\xec\x02~\x02z\xff\xec\x02~\x02\ +|\xff\xd7\x02~\x02\x80\xff\xec\x02~\x02\x82\xff\xec\x02\ +~\x02\x9f\xff\xd7\x02~\x02\xa1\xff\xec\x02~\x02\xa9\xff\ +\xec\x02~\x02\xb5\xff\xc3\x02~\x02\xb7\xff\xec\x02~\x02\ +\xb9\xff\xec\x02~\x02\xbb\xff\xd7\x02~\x02\xbd\xff\xec\x02\ +~\x02\xbf\xff\xd7\x02~\x02\xc1\xff\xd7\x02~\x02\xca\xff\ +\xd7\x02~\x02\xce\xff\xd7\x02~\x02\xcf\xff\xec\x02~\x02\ +\xd4\xff\xd7\x02~\x02\xd9\xff\xd7\x02~\x02\xdb\xff\xd7\x02\ +~\x02\xdd\xff\xd7\x02~\x02\xe5\xff\xd7\x02~\x02\xe7\xff\ +\xec\x02~\x02\xf5\xff\xec\x02~\x02\xf7\xff\xd7\x02~\x02\ +\xf9\xff\xd7\x02~\x02\xfb\xff\xd7\x02~\x02\xfd\xff\xd7\x02\ +~\x03\x05\xff\xd7\x02~\x03\x07\xff\xd7\x02~\x03\x0d\xff\ +\xd7\x02~\x03\x0f\xff\xd7\x02~\x03\x11\xff\xd7\x02~\x03\ +\x12\xff\xec\x02~\x03\x17\xff\xec\x02~\x03\x1b\xff\xd7\x02\ +~\x03\x1c\xff\xec\x02\x7f\x00\x05\xff\xec\x02\x7f\x00\x0a\xff\ +\xec\x02\x7f\x01\xd0\xff\xd7\x02\x7f\x01\xdc\xff\xec\x02\x7f\x01\ +\xdd\xff\xec\x02\x7f\x01\xdf\xff\xd7\x02\x7f\x01\xe1\xff\xec\x02\ +\x7f\x01\xe4\xff\xec\x02\x7f\x01\xf6\xff\xec\x02\x7f\x02\x07\xff\ +\xec\x02\x7f\x02\x0b\xff\xec\x02\x7f\x02\xa0\xff\xd7\x02\x7f\x02\ +\xaa\xff\xec\x02\x7f\x02\xb6\xff\xec\x02\x7f\x02\xbc\xff\xd7\x02\ +\x7f\x02\xbe\xff\xec\x02\x7f\x02\xc0\xff\xec\x02\x7f\x02\xc2\xff\ +\xec\x02\x7f\x02\xcb\xff\xd7\x02\x7f\x02\xd5\xff\xec\x02\x7f\x02\ +\xe6\xff\xd7\x02\x7f\x02\xf8\xff\xec\x02\x7f\x02\xfa\xff\xec\x02\ +\x7f\x02\xfc\xff\xec\x02\x7f\x02\xfe\xff\xec\x02\x7f\x03\x06\xff\ +\xd7\x02\x7f\x03\x08\xff\xd7\x02\x7f\x03\x0e\xff\xec\x02\x7f\x03\ +\x10\xff\xec\x02\x7f\x03\x18\xff\xec\x02\x80\x00\x0f\xff\x85\x02\ +\x80\x00\x11\xff\x85\x02\x80\x01\x9f\xff\xec\x02\x80\x01\xa4\xff\ +\x9a\x02\x80\x01\xaa\xffq\x02\x80\x01\xae\xff\x9a\x02\x80\x01\ +\xb5\xff\x9a\x02\x80\x01\xb8\xff\xec\x02\x80\x01\xbb\xff\xec\x02\ +\x80\x01\xbe\xff\xc3\x02\x80\x01\xc9\xff\xec\x02\x80\x01\xce\xff\ +\xae\x02\x80\x01\xcf\xff\xd7\x02\x80\x01\xd5\xff\xae\x02\x80\x01\ +\xd8\xff\xd7\x02\x80\x01\xdb\xff\xd7\x02\x80\x01\xde\xff\xd7\x02\ +\x80\x01\xe1\xff\xd7\x02\x80\x01\xea\xff\xd7\x02\x80\x01\xeb\x00\ +f\x02\x80\x01\xed\xff\xd7\x02\x80\x01\xee\xff\xec\x02\x80\x01\ +\xf2\xff\xae\x02\x80\x01\xf4\x00f\x02\x80\x02\x08\xff\x85\x02\ +\x80\x02\x0c\xff\x85\x02\x80\x02j\xff\xd7\x02\x80\x02l\xff\ +\xec\x02\x80\x02r\xffq\x02\x80\x02s\xff\xae\x02\x80\x02\ +~\xff\xec\x02\x80\x02\x7f\xff\xd7\x02\x80\x02\x84\xff\xec\x02\ +\x80\x02\x85\xff\xd7\x02\x80\x02\x86\xff\xec\x02\x80\x02\x87\xff\ +\xd7\x02\x80\x02\x88\xff\xec\x02\x80\x02\x89\xff\xd7\x02\x80\x02\ +\x8a\xff\xec\x02\x80\x02\x8c\xff\xec\x02\x80\x02\x8d\xff\xd7\x02\ +\x80\x02\x98\x00f\x02\x80\x02\xa8\x00f\x02\x80\x02\xb1\xff\ +\xec\x02\x80\x02\xb2\xff\xd7\x02\x80\x02\xb3\xff\xec\x02\x80\x02\ +\xb4\xff\xd7\x02\x80\x02\xc0\xff\xd7\x02\x80\x02\xc2\xff\xd7\x02\ +\x80\x02\xc5\xff\xd7\x02\x80\x02\xc6\xff\xc3\x02\x80\x02\xc7\xff\ +\xd7\x02\x80\x02\xc8\xff\xc3\x02\x80\x02\xce\xff\x9a\x02\x80\x02\ +\xcf\xff\xae\x02\x80\x02\xd5\xff\xd7\x02\x80\x02\xd9\xffq\x02\ +\x80\x02\xdb\xffq\x02\x80\x02\xdd\xffq\x02\x80\x02\xe0\xff\ +\xd7\x02\x80\x02\xef\xff\xec\x02\x80\x02\xf0\xff\xd7\x02\x80\x02\ +\xf1\xff\xec\x02\x80\x02\xf2\xff\xd7\x02\x80\x02\xf3\xff\xec\x02\ +\x80\x02\xf4\xff\xd7\x02\x80\x02\xfe\xff\xd7\x02\x80\x03\x09\xff\ +q\x02\x80\x03\x0a\xff\xd7\x02\x80\x03\x0b\xffq\x02\x80\x03\ +\x0c\xff\xd7\x02\x80\x03\x11\xff\x9a\x02\x80\x03\x12\xff\xae\x02\ +\x80\x03\x15\xff\xec\x02\x80\x03\x16\xff\xd7\x02\x80\x03\x1a\xff\ +\xd7\x02\x80\x03\x1b\xff\x9a\x02\x80\x03\x1c\xff\xae\x02\x81\x00\ +\x0f\xff\xae\x02\x81\x00\x11\xff\xae\x02\x81\x01\xce\xff\xd7\x02\ +\x81\x01\xd5\xff\xd7\x02\x81\x01\xf2\xff\xd7\x02\x81\x02\x08\xff\ +\xae\x02\x81\x02\x0c\xff\xae\x02\x81\x02s\xff\xd7\x02\x81\x02\ +\xcf\xff\xd7\x02\x81\x03\x12\xff\xd7\x02\x81\x03\x1c\xff\xd7\x02\ +\x82\x00\x0f\xff\x85\x02\x82\x00\x11\xff\x85\x02\x82\x01\x9f\xff\ +\xec\x02\x82\x01\xa4\xff\x9a\x02\x82\x01\xaa\xffq\x02\x82\x01\ +\xae\xff\x9a\x02\x82\x01\xb5\xff\x9a\x02\x82\x01\xb8\xff\xec\x02\ +\x82\x01\xbb\xff\xec\x02\x82\x01\xbe\xff\xc3\x02\x82\x01\xc9\xff\ +\xec\x02\x82\x01\xce\xff\xae\x02\x82\x01\xcf\xff\xd7\x02\x82\x01\ +\xd5\xff\xae\x02\x82\x01\xd8\xff\xd7\x02\x82\x01\xdb\xff\xd7\x02\ +\x82\x01\xde\xff\xd7\x02\x82\x01\xe1\xff\xd7\x02\x82\x01\xea\xff\ +\xd7\x02\x82\x01\xeb\x00f\x02\x82\x01\xed\xff\xd7\x02\x82\x01\ +\xee\xff\xec\x02\x82\x01\xf2\xff\xae\x02\x82\x01\xf4\x00f\x02\ +\x82\x02\x08\xff\x85\x02\x82\x02\x0c\xff\x85\x02\x82\x02j\xff\ +\xd7\x02\x82\x02l\xff\xec\x02\x82\x02r\xffq\x02\x82\x02\ +s\xff\xae\x02\x82\x02~\xff\xec\x02\x82\x02\x7f\xff\xd7\x02\ +\x82\x02\x84\xff\xec\x02\x82\x02\x85\xff\xd7\x02\x82\x02\x86\xff\ +\xec\x02\x82\x02\x87\xff\xd7\x02\x82\x02\x88\xff\xec\x02\x82\x02\ +\x89\xff\xd7\x02\x82\x02\x8a\xff\xec\x02\x82\x02\x8c\xff\xec\x02\ +\x82\x02\x8d\xff\xd7\x02\x82\x02\x98\x00f\x02\x82\x02\xa8\x00\ +f\x02\x82\x02\xb1\xff\xec\x02\x82\x02\xb2\xff\xd7\x02\x82\x02\ +\xb3\xff\xec\x02\x82\x02\xb4\xff\xd7\x02\x82\x02\xc0\xff\xd7\x02\ +\x82\x02\xc2\xff\xd7\x02\x82\x02\xc5\xff\xd7\x02\x82\x02\xc6\xff\ +\xc3\x02\x82\x02\xc7\xff\xd7\x02\x82\x02\xc8\xff\xc3\x02\x82\x02\ +\xce\xff\x9a\x02\x82\x02\xcf\xff\xae\x02\x82\x02\xd5\xff\xd7\x02\ +\x82\x02\xd9\xffq\x02\x82\x02\xdb\xffq\x02\x82\x02\xdd\xff\ +q\x02\x82\x02\xe0\xff\xd7\x02\x82\x02\xef\xff\xec\x02\x82\x02\ +\xf0\xff\xd7\x02\x82\x02\xf1\xff\xec\x02\x82\x02\xf2\xff\xd7\x02\ +\x82\x02\xf3\xff\xec\x02\x82\x02\xf4\xff\xd7\x02\x82\x02\xfe\xff\ +\xd7\x02\x82\x03\x09\xffq\x02\x82\x03\x0a\xff\xd7\x02\x82\x03\ +\x0b\xffq\x02\x82\x03\x0c\xff\xd7\x02\x82\x03\x11\xff\x9a\x02\ +\x82\x03\x12\xff\xae\x02\x82\x03\x15\xff\xec\x02\x82\x03\x16\xff\ +\xd7\x02\x82\x03\x1a\xff\xd7\x02\x82\x03\x1b\xff\x9a\x02\x82\x03\ +\x1c\xff\xae\x02\x83\x00\x0f\xff\xae\x02\x83\x00\x11\xff\xae\x02\ +\x83\x01\xce\xff\xd7\x02\x83\x01\xd5\xff\xd7\x02\x83\x01\xf2\xff\ +\xd7\x02\x83\x02\x08\xff\xae\x02\x83\x02\x0c\xff\xae\x02\x83\x02\ +s\xff\xd7\x02\x83\x02\xcf\xff\xd7\x02\x83\x03\x12\xff\xd7\x02\ +\x83\x03\x1c\xff\xd7\x02\x84\x00\x0f\xff\xae\x02\x84\x00\x11\xff\ +\xae\x02\x84\x01\xce\xff\xd7\x02\x84\x01\xd5\xff\xd7\x02\x84\x01\ +\xf2\xff\xd7\x02\x84\x02\x08\xff\xae\x02\x84\x02\x0c\xff\xae\x02\ +\x84\x02s\xff\xd7\x02\x84\x02\xcf\xff\xd7\x02\x84\x03\x12\xff\ +\xd7\x02\x84\x03\x1c\xff\xd7\x02\x85\x00\x0f\xff\xae\x02\x85\x00\ +\x11\xff\xae\x02\x85\x01\xce\xff\xd7\x02\x85\x01\xd5\xff\xd7\x02\ +\x85\x01\xf2\xff\xd7\x02\x85\x02\x08\xff\xae\x02\x85\x02\x0c\xff\ +\xae\x02\x85\x02s\xff\xd7\x02\x85\x02\xcf\xff\xd7\x02\x85\x03\ +\x12\xff\xd7\x02\x85\x03\x1c\xff\xd7\x02\x86\x00\x0f\xff\xae\x02\ +\x86\x00\x11\xff\xae\x02\x86\x01\x9d\xff\xec\x02\x86\x01\xa4\xff\ +\xd7\x02\x86\x01\xa6\xff\xec\x02\x86\x01\xa8\xff\xd7\x02\x86\x01\ +\xaa\xff\xd7\x02\x86\x01\xae\xff\xd7\x02\x86\x01\xb0\xff\xd7\x02\ +\x86\x01\xb1\xff\xec\x02\x86\x01\xb5\xff\xd7\x02\x86\x01\xbc\xff\ +\xc3\x02\x86\x01\xbd\xff\xd7\x02\x86\x01\xbf\xff\xd7\x02\x86\x01\ +\xc1\xff\xd7\x02\x86\x01\xc4\xff\xec\x02\x86\x01\xc7\xff\xec\x02\ +\x86\x01\xce\xff\xec\x02\x86\x01\xd5\xff\xec\x02\x86\x01\xf2\xff\ +\xec\x02\x86\x02\x08\xff\xae\x02\x86\x02\x0c\xff\xae\x02\x86\x02\ +r\xff\xd7\x02\x86\x02s\xff\xec\x02\x86\x02z\xff\xec\x02\ +\x86\x02|\xff\xd7\x02\x86\x02\x80\xff\xec\x02\x86\x02\x82\xff\ +\xec\x02\x86\x02\x9f\xff\xd7\x02\x86\x02\xa1\xff\xec\x02\x86\x02\ +\xa9\xff\xec\x02\x86\x02\xb5\xff\xc3\x02\x86\x02\xb7\xff\xec\x02\ +\x86\x02\xb9\xff\xec\x02\x86\x02\xbb\xff\xd7\x02\x86\x02\xbd\xff\ +\xec\x02\x86\x02\xbf\xff\xd7\x02\x86\x02\xc1\xff\xd7\x02\x86\x02\ +\xca\xff\xd7\x02\x86\x02\xce\xff\xd7\x02\x86\x02\xcf\xff\xec\x02\ +\x86\x02\xd4\xff\xd7\x02\x86\x02\xd9\xff\xd7\x02\x86\x02\xdb\xff\ +\xd7\x02\x86\x02\xdd\xff\xd7\x02\x86\x02\xe5\xff\xd7\x02\x86\x02\ +\xe7\xff\xec\x02\x86\x02\xf5\xff\xec\x02\x86\x02\xf7\xff\xd7\x02\ +\x86\x02\xf9\xff\xd7\x02\x86\x02\xfb\xff\xd7\x02\x86\x02\xfd\xff\ +\xd7\x02\x86\x03\x05\xff\xd7\x02\x86\x03\x07\xff\xd7\x02\x86\x03\ +\x0d\xff\xd7\x02\x86\x03\x0f\xff\xd7\x02\x86\x03\x11\xff\xd7\x02\ +\x86\x03\x12\xff\xec\x02\x86\x03\x17\xff\xec\x02\x86\x03\x1b\xff\ +\xd7\x02\x86\x03\x1c\xff\xec\x02\x87\x00\x05\xff\xec\x02\x87\x00\ +\x0a\xff\xec\x02\x87\x01\xd0\xff\xd7\x02\x87\x01\xdc\xff\xec\x02\ +\x87\x01\xdd\xff\xec\x02\x87\x01\xdf\xff\xd7\x02\x87\x01\xe1\xff\ +\xec\x02\x87\x01\xe4\xff\xec\x02\x87\x01\xf6\xff\xec\x02\x87\x02\ +\x07\xff\xec\x02\x87\x02\x0b\xff\xec\x02\x87\x02\xa0\xff\xd7\x02\ +\x87\x02\xaa\xff\xec\x02\x87\x02\xb6\xff\xec\x02\x87\x02\xbc\xff\ +\xd7\x02\x87\x02\xbe\xff\xec\x02\x87\x02\xc0\xff\xec\x02\x87\x02\ +\xc2\xff\xec\x02\x87\x02\xcb\xff\xd7\x02\x87\x02\xd5\xff\xec\x02\ +\x87\x02\xe6\xff\xd7\x02\x87\x02\xf8\xff\xec\x02\x87\x02\xfa\xff\ +\xec\x02\x87\x02\xfc\xff\xec\x02\x87\x02\xfe\xff\xec\x02\x87\x03\ +\x06\xff\xd7\x02\x87\x03\x08\xff\xd7\x02\x87\x03\x0e\xff\xec\x02\ +\x87\x03\x10\xff\xec\x02\x87\x03\x18\xff\xec\x02\x88\x00\x0f\xff\ +\xae\x02\x88\x00\x11\xff\xae\x02\x88\x01\x9d\xff\xec\x02\x88\x01\ +\xa4\xff\xd7\x02\x88\x01\xa6\xff\xec\x02\x88\x01\xa8\xff\xd7\x02\ +\x88\x01\xaa\xff\xd7\x02\x88\x01\xae\xff\xd7\x02\x88\x01\xb0\xff\ +\xd7\x02\x88\x01\xb1\xff\xec\x02\x88\x01\xb5\xff\xd7\x02\x88\x01\ +\xbc\xff\xc3\x02\x88\x01\xbd\xff\xd7\x02\x88\x01\xbf\xff\xd7\x02\ +\x88\x01\xc1\xff\xd7\x02\x88\x01\xc4\xff\xec\x02\x88\x01\xc7\xff\ +\xec\x02\x88\x01\xce\xff\xec\x02\x88\x01\xd5\xff\xec\x02\x88\x01\ +\xf2\xff\xec\x02\x88\x02\x08\xff\xae\x02\x88\x02\x0c\xff\xae\x02\ +\x88\x02r\xff\xd7\x02\x88\x02s\xff\xec\x02\x88\x02z\xff\ +\xec\x02\x88\x02|\xff\xd7\x02\x88\x02\x80\xff\xec\x02\x88\x02\ +\x82\xff\xec\x02\x88\x02\x9f\xff\xd7\x02\x88\x02\xa1\xff\xec\x02\ +\x88\x02\xa9\xff\xec\x02\x88\x02\xb5\xff\xc3\x02\x88\x02\xb7\xff\ +\xec\x02\x88\x02\xb9\xff\xec\x02\x88\x02\xbb\xff\xd7\x02\x88\x02\ +\xbd\xff\xec\x02\x88\x02\xbf\xff\xd7\x02\x88\x02\xc1\xff\xd7\x02\ +\x88\x02\xca\xff\xd7\x02\x88\x02\xce\xff\xd7\x02\x88\x02\xcf\xff\ +\xec\x02\x88\x02\xd4\xff\xd7\x02\x88\x02\xd9\xff\xd7\x02\x88\x02\ +\xdb\xff\xd7\x02\x88\x02\xdd\xff\xd7\x02\x88\x02\xe5\xff\xd7\x02\ +\x88\x02\xe7\xff\xec\x02\x88\x02\xf5\xff\xec\x02\x88\x02\xf7\xff\ +\xd7\x02\x88\x02\xf9\xff\xd7\x02\x88\x02\xfb\xff\xd7\x02\x88\x02\ +\xfd\xff\xd7\x02\x88\x03\x05\xff\xd7\x02\x88\x03\x07\xff\xd7\x02\ +\x88\x03\x0d\xff\xd7\x02\x88\x03\x0f\xff\xd7\x02\x88\x03\x11\xff\ +\xd7\x02\x88\x03\x12\xff\xec\x02\x88\x03\x17\xff\xec\x02\x88\x03\ +\x1b\xff\xd7\x02\x88\x03\x1c\xff\xec\x02\x89\x00\x05\xff\xec\x02\ +\x89\x00\x0a\xff\xec\x02\x89\x01\xd0\xff\xd7\x02\x89\x01\xdc\xff\ +\xec\x02\x89\x01\xdd\xff\xec\x02\x89\x01\xdf\xff\xd7\x02\x89\x01\ +\xe1\xff\xec\x02\x89\x01\xe4\xff\xec\x02\x89\x01\xf6\xff\xec\x02\ +\x89\x02\x07\xff\xec\x02\x89\x02\x0b\xff\xec\x02\x89\x02\xa0\xff\ +\xd7\x02\x89\x02\xaa\xff\xec\x02\x89\x02\xb6\xff\xec\x02\x89\x02\ +\xbc\xff\xd7\x02\x89\x02\xbe\xff\xec\x02\x89\x02\xc0\xff\xec\x02\ +\x89\x02\xc2\xff\xec\x02\x89\x02\xcb\xff\xd7\x02\x89\x02\xd5\xff\ +\xec\x02\x89\x02\xe6\xff\xd7\x02\x89\x02\xf8\xff\xec\x02\x89\x02\ +\xfa\xff\xec\x02\x89\x02\xfc\xff\xec\x02\x89\x02\xfe\xff\xec\x02\ +\x89\x03\x06\xff\xd7\x02\x89\x03\x08\xff\xd7\x02\x89\x03\x0e\xff\ +\xec\x02\x89\x03\x10\xff\xec\x02\x89\x03\x18\xff\xec\x02\x8a\x00\ +\x0f\xff\xae\x02\x8a\x00\x11\xff\xae\x02\x8a\x01\x9d\xff\xec\x02\ +\x8a\x01\xa4\xff\xd7\x02\x8a\x01\xa6\xff\xec\x02\x8a\x01\xa8\xff\ +\xd7\x02\x8a\x01\xaa\xff\xd7\x02\x8a\x01\xae\xff\xd7\x02\x8a\x01\ +\xb0\xff\xd7\x02\x8a\x01\xb1\xff\xec\x02\x8a\x01\xb5\xff\xd7\x02\ +\x8a\x01\xbc\xff\xc3\x02\x8a\x01\xbd\xff\xd7\x02\x8a\x01\xbf\xff\ +\xd7\x02\x8a\x01\xc1\xff\xd7\x02\x8a\x01\xc4\xff\xec\x02\x8a\x01\ +\xc7\xff\xec\x02\x8a\x01\xce\xff\xec\x02\x8a\x01\xd5\xff\xec\x02\ +\x8a\x01\xf2\xff\xec\x02\x8a\x02\x08\xff\xae\x02\x8a\x02\x0c\xff\ +\xae\x02\x8a\x02r\xff\xd7\x02\x8a\x02s\xff\xec\x02\x8a\x02\ +z\xff\xec\x02\x8a\x02|\xff\xd7\x02\x8a\x02\x80\xff\xec\x02\ +\x8a\x02\x82\xff\xec\x02\x8a\x02\x9f\xff\xd7\x02\x8a\x02\xa1\xff\ +\xec\x02\x8a\x02\xa9\xff\xec\x02\x8a\x02\xb5\xff\xc3\x02\x8a\x02\ +\xb7\xff\xec\x02\x8a\x02\xb9\xff\xec\x02\x8a\x02\xbb\xff\xd7\x02\ +\x8a\x02\xbd\xff\xec\x02\x8a\x02\xbf\xff\xd7\x02\x8a\x02\xc1\xff\ +\xd7\x02\x8a\x02\xca\xff\xd7\x02\x8a\x02\xce\xff\xd7\x02\x8a\x02\ +\xcf\xff\xec\x02\x8a\x02\xd4\xff\xd7\x02\x8a\x02\xd9\xff\xd7\x02\ +\x8a\x02\xdb\xff\xd7\x02\x8a\x02\xdd\xff\xd7\x02\x8a\x02\xe5\xff\ +\xd7\x02\x8a\x02\xe7\xff\xec\x02\x8a\x02\xf5\xff\xec\x02\x8a\x02\ +\xf7\xff\xd7\x02\x8a\x02\xf9\xff\xd7\x02\x8a\x02\xfb\xff\xd7\x02\ +\x8a\x02\xfd\xff\xd7\x02\x8a\x03\x05\xff\xd7\x02\x8a\x03\x07\xff\ +\xd7\x02\x8a\x03\x0d\xff\xd7\x02\x8a\x03\x0f\xff\xd7\x02\x8a\x03\ +\x11\xff\xd7\x02\x8a\x03\x12\xff\xec\x02\x8a\x03\x17\xff\xec\x02\ +\x8a\x03\x1b\xff\xd7\x02\x8a\x03\x1c\xff\xec\x02\x8b\x00\x0f\xff\ +\xae\x02\x8b\x00\x11\xff\xae\x02\x8b\x01\xce\xff\xd7\x02\x8b\x01\ +\xd5\xff\xd7\x02\x8b\x01\xf2\xff\xd7\x02\x8b\x02\x08\xff\xae\x02\ +\x8b\x02\x0c\xff\xae\x02\x8b\x02s\xff\xd7\x02\x8b\x02\xcf\xff\ +\xd7\x02\x8b\x03\x12\xff\xd7\x02\x8b\x03\x1c\xff\xd7\x02\x8c\x01\ +\x9f\xff\xd7\x02\x8c\x01\xb8\xff\xd7\x02\x8c\x01\xbb\xff\xd7\x02\ +\x8c\x01\xbe\xff\xd7\x02\x8c\x01\xe1\xff\xd7\x02\x8c\x02l\xff\ +\xd7\x02\x8c\x02~\xff\xd7\x02\x8c\x02\x84\xff\xd7\x02\x8c\x02\ +\x86\xff\xd7\x02\x8c\x02\x88\xff\xd7\x02\x8c\x02\x8a\xff\xd7\x02\ +\x8c\x02\x8c\xff\xd7\x02\x8c\x02\xb1\xff\xd7\x02\x8c\x02\xb3\xff\ +\xd7\x02\x8c\x02\xc0\xff\xd7\x02\x8c\x02\xc2\xff\xd7\x02\x8c\x02\ +\xc5\xff\xd7\x02\x8c\x02\xc7\xff\xd7\x02\x8c\x02\xd5\xff\xd7\x02\ +\x8c\x02\xef\xff\xd7\x02\x8c\x02\xf1\xff\xd7\x02\x8c\x02\xf3\xff\ +\xd7\x02\x8c\x02\xfe\xff\xd7\x02\x8c\x03\x09\xff\xd7\x02\x8c\x03\ +\x0b\xff\xd7\x02\x8c\x03\x0e\xff\xd7\x02\x8c\x03\x10\xff\xd7\x02\ +\x8c\x03\x15\xff\xd7\x02\x95\x01\xa3\x00\xe1\x02\x95\x02\xea\x00\ +)\x02\x95\x03\x0e\xff\xd7\x02\x95\x03\x10\xff\xd7\x02\x96\x00\ +\x05\xff\xec\x02\x96\x00\x0a\xff\xec\x02\x96\x02\x07\xff\xec\x02\ +\x96\x02\x0b\xff\xec\x02\x97\x00\x05\xff\xae\x02\x97\x00\x0a\xff\ +\xae\x02\x97\x01\x9d\xff\xd7\x02\x97\x01\xa6\xff\xd7\x02\x97\x01\ +\xbc\xff\xae\x02\x97\x01\xc1\xff\xae\x02\x97\x01\xc4\xff\xd7\x02\ +\x97\x01\xdc\xff\xd7\x02\x97\x01\xe4\xff\xd7\x02\x97\x02\x07\xff\ +\xae\x02\x97\x02\x0b\xff\xae\x02\x97\x02|\xff\xae\x02\x97\x02\ +\x80\xff\xc3\x02\x97\x02\x82\xff\xc3\x02\x97\x02\xa9\xff\xd7\x02\ +\x97\x02\xaa\xff\xd7\x02\x97\x02\xb5\xff\xae\x02\x97\x02\xb6\xff\ +\xd7\x02\x97\x02\xb7\xff\xc3\x02\x97\x02\xb9\xff\xc3\x02\x97\x02\ +\xbd\xff\xd7\x02\x97\x02\xbe\xff\xd7\x02\x97\x02\xbf\xff\xae\x02\ +\x97\x02\xc1\xff\xae\x02\x97\x02\xd4\xff\xae\x02\x97\x02\xfd\xff\ +\xae\x02\x97\x03\x0d\xff\x9a\x02\x97\x03\x0f\xff\x9a\x02\x97\x03\ +\x17\xff\xd7\x02\x97\x03\x18\xff\xd7\x02\x98\x00\x05\xff\x85\x02\ +\x98\x00\x0a\xff\x85\x02\x98\x01\xd0\xff\xd7\x02\x98\x01\xdc\xff\ +\x9a\x02\x98\x01\xdd\xff\xc3\x02\x98\x01\xdf\xff\xd7\x02\x98\x01\ +\xe1\xff\xae\x02\x98\x01\xe4\xff\x9a\x02\x98\x01\xf6\xff\xc3\x02\ +\x98\x02\x07\xff\x85\x02\x98\x02\x0b\xff\x85\x02\x98\x02m\xff\ +\xd7\x02\x98\x02\x81\xff\xd7\x02\x98\x02\x83\xff\xd7\x02\x98\x02\ +\x8b\xff\xd7\x02\x98\x02\xa0\xff\xd7\x02\x98\x02\xaa\xff\x9a\x02\ +\x98\x02\xb6\xff\x9a\x02\x98\x02\xb8\xff\xc3\x02\x98\x02\xba\xff\ +\xc3\x02\x98\x02\xbc\xff\xd7\x02\x98\x02\xbe\xff\x9a\x02\x98\x02\ +\xc0\xff\xae\x02\x98\x02\xc2\xff\xae\x02\x98\x02\xc6\xff\xd7\x02\ +\x98\x02\xc8\xff\xd7\x02\x98\x02\xcb\xff\xd7\x02\x98\x02\xd5\xff\ +\xae\x02\x98\x02\xe6\xff\xd7\x02\x98\x02\xea\xff\xd7\x02\x98\x02\ +\xf8\xff\xc3\x02\x98\x02\xfa\xff\xc3\x02\x98\x02\xfc\xff\xc3\x02\ +\x98\x02\xfe\xff\xae\x02\x98\x03\x06\xff\xd7\x02\x98\x03\x08\xff\ +\xd7\x02\x98\x03\x0e\xff\x9a\x02\x98\x03\x10\xff\x9a\x02\x98\x03\ +\x18\xff\x9a\x02\x99\x00\x0f\xfe\xf6\x02\x99\x00\x11\xfe\xf6\x02\ +\x99\x01\xa4\xff\x85\x02\x99\x01\xaa\xff\x9a\x02\x99\x01\xae\xff\ +\x85\x02\x99\x01\xb0\xff\xd7\x02\x99\x01\xb5\xff\x85\x02\x99\x01\ +\xbf\xff\xd7\x02\x99\x01\xce\xff\x9a\x02\x99\x01\xd5\xff\x9a\x02\ +\x99\x01\xf2\xff\x9a\x02\x99\x02\x08\xfe\xf6\x02\x99\x02\x0c\xfe\ +\xf6\x02\x99\x02r\xff\x9a\x02\x99\x02s\xff\x9a\x02\x99\x02\ +v\xff\xec\x02\x99\x02\x9f\xff\xd7\x02\x99\x02\xbb\xff\xd7\x02\ +\x99\x02\xca\xff\xd7\x02\x99\x02\xce\xff\x85\x02\x99\x02\xcf\xff\ +\x9a\x02\x99\x02\xd9\xff\x9a\x02\x99\x02\xdb\xff\x9a\x02\x99\x02\ +\xdd\xff\x9a\x02\x99\x02\xe5\xff\xd7\x02\x99\x03\x05\xff\xd7\x02\ +\x99\x03\x07\xff\xd7\x02\x99\x03\x09\xff\xae\x02\x99\x03\x0b\xff\ +\xae\x02\x99\x03\x11\xff\x85\x02\x99\x03\x12\xff\x9a\x02\x99\x03\ +\x1b\xff\x85\x02\x99\x03\x1c\xff\x9a\x02\x9a\x00\x05\xff\xec\x02\ +\x9a\x00\x0a\xff\xec\x02\x9a\x01\xd0\xff\xd7\x02\x9a\x01\xdc\xff\ +\xec\x02\x9a\x01\xdd\xff\xec\x02\x9a\x01\xdf\xff\xd7\x02\x9a\x01\ +\xe1\xff\xec\x02\x9a\x01\xe4\xff\xec\x02\x9a\x01\xf6\xff\xec\x02\ +\x9a\x02\x07\xff\xec\x02\x9a\x02\x0b\xff\xec\x02\x9a\x02\xa0\xff\ +\xd7\x02\x9a\x02\xaa\xff\xec\x02\x9a\x02\xb6\xff\xec\x02\x9a\x02\ +\xbc\xff\xd7\x02\x9a\x02\xbe\xff\xec\x02\x9a\x02\xc0\xff\xec\x02\ +\x9a\x02\xc2\xff\xec\x02\x9a\x02\xcb\xff\xd7\x02\x9a\x02\xd5\xff\ +\xec\x02\x9a\x02\xe6\xff\xd7\x02\x9a\x02\xf8\xff\xec\x02\x9a\x02\ +\xfa\xff\xec\x02\x9a\x02\xfc\xff\xec\x02\x9a\x02\xfe\xff\xec\x02\ +\x9a\x03\x06\xff\xd7\x02\x9a\x03\x08\xff\xd7\x02\x9a\x03\x0e\xff\ +\xec\x02\x9a\x03\x10\xff\xec\x02\x9a\x03\x18\xff\xec\x02\x9b\x00\ +\x0f\xff\x9a\x02\x9b\x00\x10\xff\xd7\x02\x9b\x00\x11\xff\x9a\x02\ +\x9b\x01\x9d\x00)\x02\x9b\x01\x9f\xff\xd7\x02\x9b\x01\xa4\xff\ +\xae\x02\x9b\x01\xa6\x00)\x02\x9b\x01\xaa\xff\x85\x02\x9b\x01\ +\xae\xff\xae\x02\x9b\x01\xb5\xff\xae\x02\x9b\x01\xb8\xff\xd7\x02\ +\x9b\x01\xbb\xff\xd7\x02\x9b\x01\xbc\x00)\x02\x9b\x01\xbe\xff\ +\xc3\x02\x9b\x01\xc4\x00)\x02\x9b\x01\xcc\xff\xc3\x02\x9b\x01\ +\xcd\xff\xc3\x02\x9b\x01\xce\xff\x9a\x02\x9b\x01\xcf\xff\xae\x02\ +\x9b\x01\xd0\xff\xd7\x02\x9b\x01\xd1\xff\xd7\x02\x9b\x01\xd2\xff\ +\xc3\x02\x9b\x01\xd3\xff\xc3\x02\x9b\x01\xd4\xff\xc3\x02\x9b\x01\ +\xd5\xff\x9a\x02\x9b\x01\xd6\xff\xc3\x02\x9b\x01\xd7\xff\xc3\x02\ +\x9b\x01\xd8\xff\xae\x02\x9b\x01\xd9\xff\xc3\x02\x9b\x01\xda\xff\ +\xc3\x02\x9b\x01\xdb\xff\xae\x02\x9b\x01\xde\xff\xae\x02\x9b\x01\ +\xdf\xff\xd7\x02\x9b\x01\xe0\xff\xc3\x02\x9b\x01\xe1\xff\x9a\x02\ +\x9b\x01\xe2\xff\xc3\x02\x9b\x01\xe3\xff\xc3\x02\x9b\x01\xe5\xff\ +\xc3\x02\x9b\x01\xe6\xff\xc3\x02\x9b\x01\xe7\xff\xd7\x02\x9b\x01\ +\xe8\xff\xc3\x02\x9b\x01\xea\xff\xae\x02\x9b\x01\xeb\x00)\x02\ +\x9b\x01\xec\xff\xc3\x02\x9b\x01\xed\xff\xae\x02\x9b\x01\xee\xff\ +\xc3\x02\x9b\x01\xf2\xff\x9a\x02\x9b\x01\xf3\xff\xc3\x02\x9b\x01\ +\xf4\x00)\x02\x9b\x01\xf5\xff\xc3\x02\x9b\x01\xf7\xff\xc3\x02\ +\x9b\x01\xf9\xff\xc3\x02\x9b\x02\x02\xff\xd7\x02\x9b\x02\x03\xff\ +\xd7\x02\x9b\x02\x04\xff\xd7\x02\x9b\x02\x08\xff\x9a\x02\x9b\x02\ +\x0c\xff\x9a\x02\x9b\x02j\xff\xae\x02\x9b\x02k\xff\xc3\x02\ +\x9b\x02l\xff\xd7\x02\x9b\x02q\xff\xc3\x02\x9b\x02r\xff\ +\x85\x02\x9b\x02s\xff\x9a\x02\x9b\x02u\xff\xc3\x02\x9b\x02\ +w\xff\xd7\x02\x9b\x02y\xff\xc3\x02\x9b\x02}\xff\xc3\x02\ +\x9b\x02~\xff\xd7\x02\x9b\x02\x7f\xff\xae\x02\x9b\x02\x84\xff\ +\xd7\x02\x9b\x02\x85\xff\xae\x02\x9b\x02\x86\xff\xd7\x02\x9b\x02\ +\x87\xff\xae\x02\x9b\x02\x88\xff\xd7\x02\x9b\x02\x89\xff\xae\x02\ +\x9b\x02\x8a\xff\xd7\x02\x9b\x02\x8c\xff\xd7\x02\x9b\x02\x8d\xff\ +\xae\x02\x9b\x02\x96\xff\xc3\x02\x9b\x02\x98\x00)\x02\x9b\x02\ +\x9a\xff\xc3\x02\x9b\x02\x9e\xff\xc3\x02\x9b\x02\xa0\xff\xd7\x02\ +\x9b\x02\xa2\xff\xd7\x02\x9b\x02\xa4\xff\xc3\x02\x9b\x02\xa6\xff\ +\xc3\x02\x9b\x02\xa8\x00)\x02\x9b\x02\xa9\x00)\x02\x9b\x02\ +\xac\xff\xc3\x02\x9b\x02\xae\xff\xc3\x02\x9b\x02\xb0\xff\xc3\x02\ +\x9b\x02\xb1\xff\xd7\x02\x9b\x02\xb2\xff\xae\x02\x9b\x02\xb3\xff\ +\xd7\x02\x9b\x02\xb4\xff\xae\x02\x9b\x02\xb5\x00)\x02\x9b\x02\ +\xbc\xff\xd7\x02\x9b\x02\xbd\x00)\x02\x9b\x02\xc0\xff\x9a\x02\ +\x9b\x02\xc2\xff\x9a\x02\x9b\x02\xc4\xff\xc3\x02\x9b\x02\xc5\xff\ +\xd7\x02\x9b\x02\xc6\xff\xc3\x02\x9b\x02\xc7\xff\xd7\x02\x9b\x02\ +\xc8\xff\xc3\x02\x9b\x02\xcb\xff\xd7\x02\x9b\x02\xcd\xff\xc3\x02\ +\x9b\x02\xce\xff\xae\x02\x9b\x02\xcf\xff\x9a\x02\x9b\x02\xd1\xff\ +\xc3\x02\x9b\x02\xd3\xff\xc3\x02\x9b\x02\xd5\xff\x9a\x02\x9b\x02\ +\xd7\xff\xc3\x02\x9b\x02\xd9\xff\x85\x02\x9b\x02\xdb\xff\x85\x02\ +\x9b\x02\xdd\xff\x85\x02\x9b\x02\xe0\xff\xae\x02\x9b\x02\xe6\xff\ +\xd7\x02\x9b\x02\xe8\xff\xd7\x02\x9b\x02\xec\xff\xc3\x02\x9b\x02\ +\xee\xff\xc3\x02\x9b\x02\xef\xff\xd7\x02\x9b\x02\xf0\xff\xae\x02\ +\x9b\x02\xf1\xff\xd7\x02\x9b\x02\xf2\xff\xae\x02\x9b\x02\xf3\xff\ +\xd7\x02\x9b\x02\xf4\xff\xae\x02\x9b\x02\xf6\xff\xd7\x02\x9b\x02\ +\xfe\xff\x9a\x02\x9b\x03\x00\xff\xc3\x02\x9b\x03\x02\xff\xc3\x02\ +\x9b\x03\x06\xff\xd7\x02\x9b\x03\x08\xff\xd7\x02\x9b\x03\x09\xff\ +\x9a\x02\x9b\x03\x0a\xff\xae\x02\x9b\x03\x0b\xff\x9a\x02\x9b\x03\ +\x0c\xff\xae\x02\x9b\x03\x0e\xff\xd7\x02\x9b\x03\x10\xff\xd7\x02\ +\x9b\x03\x11\xff\xae\x02\x9b\x03\x12\xff\x9a\x02\x9b\x03\x14\xff\ +\xc3\x02\x9b\x03\x15\xff\xd7\x02\x9b\x03\x16\xff\xae\x02\x9b\x03\ +\x17\x00)\x02\x9b\x03\x1a\xff\xae\x02\x9b\x03\x1b\xff\xae\x02\ +\x9b\x03\x1c\xff\x9a\x02\x9c\x00\x0f\xff\xc3\x02\x9c\x00\x11\xff\ +\xc3\x02\x9c\x01\xce\xff\xc3\x02\x9c\x01\xcf\xff\xd7\x02\x9c\x01\ +\xd5\xff\xc3\x02\x9c\x01\xd8\xff\xd7\x02\x9c\x01\xdb\xff\xd7\x02\ +\x9c\x01\xde\xff\xd7\x02\x9c\x01\xea\xff\xd7\x02\x9c\x01\xed\xff\ +\xd7\x02\x9c\x01\xf2\xff\xc3\x02\x9c\x02\x08\xff\xc3\x02\x9c\x02\ +\x0c\xff\xc3\x02\x9c\x02j\xff\xd7\x02\x9c\x02s\xff\xc3\x02\ +\x9c\x02\x7f\xff\xd7\x02\x9c\x02\x85\xff\xd7\x02\x9c\x02\x87\xff\ +\xd7\x02\x9c\x02\x89\xff\xd7\x02\x9c\x02\x8d\xff\xd7\x02\x9c\x02\ +\xb2\xff\xd7\x02\x9c\x02\xb4\xff\xd7\x02\x9c\x02\xcf\xff\xc3\x02\ +\x9c\x02\xe0\xff\xd7\x02\x9c\x02\xf0\xff\xd7\x02\x9c\x02\xf2\xff\ +\xd7\x02\x9c\x02\xf4\xff\xd7\x02\x9c\x03\x0a\xff\xd7\x02\x9c\x03\ +\x0c\xff\xd7\x02\x9c\x03\x12\xff\xc3\x02\x9c\x03\x16\xff\xd7\x02\ +\x9c\x03\x1a\xff\xd7\x02\x9c\x03\x1c\xff\xc3\x02\x9d\x00\x05\xff\ +\xc3\x02\x9d\x00\x0a\xff\xc3\x02\x9d\x01\x9d\xff\xc3\x02\x9d\x01\ +\xa3\x00f\x02\x9d\x01\xa6\xff\xc3\x02\x9d\x01\xbc\xff\xc3\x02\ +\x9d\x01\xc1\xff\xae\x02\x9d\x01\xc4\xff\xc3\x02\x9d\x01\xdc\xff\ +\xd7\x02\x9d\x01\xe1\xff\xd7\x02\x9d\x01\xe4\xff\xd7\x02\x9d\x02\ +\x07\xff\xc3\x02\x9d\x02\x0b\xff\xc3\x02\x9d\x02|\xff\xae\x02\ +\x9d\x02\x80\xff\xc3\x02\x9d\x02\x82\xff\xc3\x02\x9d\x02\xa9\xff\ +\xc3\x02\x9d\x02\xaa\xff\xd7\x02\x9d\x02\xb5\xff\xc3\x02\x9d\x02\ +\xb6\xff\xd7\x02\x9d\x02\xb7\xff\xd7\x02\x9d\x02\xb9\xff\xd7\x02\ +\x9d\x02\xbd\xff\xc3\x02\x9d\x02\xbe\xff\xd7\x02\x9d\x02\xbf\xff\ +\xae\x02\x9d\x02\xc0\xff\xd7\x02\x9d\x02\xc1\xff\xae\x02\x9d\x02\ +\xc2\xff\xd7\x02\x9d\x02\xd4\xff\xae\x02\x9d\x02\xd5\xff\xd7\x02\ +\x9d\x02\xfd\xff\xae\x02\x9d\x02\xfe\xff\xd7\x02\x9d\x03\x0d\xff\ +\xd7\x02\x9d\x03\x0e\xff\xc3\x02\x9d\x03\x0f\xff\xd7\x02\x9d\x03\ +\x10\xff\xc3\x02\x9d\x03\x17\xff\xc3\x02\x9d\x03\x18\xff\xd7\x02\ +\x9e\x00\x05\xff\xc3\x02\x9e\x00\x0a\xff\xc3\x02\x9e\x02\x07\xff\ +\xc3\x02\x9e\x02\x0b\xff\xc3\x02\x9e\x03\x0e\xff\xd7\x02\x9e\x03\ +\x10\xff\xd7\x02\x9f\x01\x9f\xff\xd7\x02\x9f\x01\xa3\x00\xe1\x02\ +\x9f\x01\xb8\xff\xd7\x02\x9f\x01\xbb\xff\xd7\x02\x9f\x01\xbe\xff\ +\xc3\x02\x9f\x01\xdc\xff\xd7\x02\x9f\x01\xe1\xff\xae\x02\x9f\x01\ +\xe4\xff\xd7\x02\x9f\x02l\xff\xd7\x02\x9f\x02{\x00=\x02\ +\x9f\x02}\xff\xec\x02\x9f\x02~\xff\xd7\x02\x9f\x02\x84\xff\ +\xd7\x02\x9f\x02\x86\xff\xd7\x02\x9f\x02\x88\xff\xd7\x02\x9f\x02\ +\x8a\xff\xd7\x02\x9f\x02\x8c\xff\xd7\x02\x9f\x02\xaa\xff\xd7\x02\ +\x9f\x02\xb1\xff\xd7\x02\x9f\x02\xb3\xff\xd7\x02\x9f\x02\xb6\xff\ +\xd7\x02\x9f\x02\xbe\xff\xd7\x02\x9f\x02\xc0\xff\xae\x02\x9f\x02\ +\xc2\xff\xae\x02\x9f\x02\xc5\xff\xc3\x02\x9f\x02\xc6\xff\xd7\x02\ +\x9f\x02\xc7\xff\xc3\x02\x9f\x02\xc8\xff\xd7\x02\x9f\x02\xd5\xff\ +\xae\x02\x9f\x02\xef\xff\xd7\x02\x9f\x02\xf1\xff\xd7\x02\x9f\x02\ +\xf3\xff\xd7\x02\x9f\x02\xfe\xff\xae\x02\x9f\x03\x0e\xff\xd7\x02\ +\x9f\x03\x10\xff\xd7\x02\x9f\x03\x15\xff\xd7\x02\x9f\x03\x18\xff\ +\xd7\x02\xa0\x01\xcf\xff\xec\x02\xa0\x01\xd8\xff\xec\x02\xa0\x01\ +\xdb\xff\xec\x02\xa0\x01\xde\xff\xec\x02\xa0\x01\xe1\xff\xec\x02\ +\xa0\x01\xea\xff\xec\x02\xa0\x01\xed\xff\xec\x02\xa0\x02j\xff\ +\xec\x02\xa0\x02\x7f\xff\xec\x02\xa0\x02\x85\xff\xec\x02\xa0\x02\ +\x87\xff\xec\x02\xa0\x02\x89\xff\xec\x02\xa0\x02\x8d\xff\xec\x02\ +\xa0\x02\xb2\xff\xec\x02\xa0\x02\xb4\xff\xec\x02\xa0\x02\xc0\xff\ +\xec\x02\xa0\x02\xc2\xff\xec\x02\xa0\x02\xd5\xff\xec\x02\xa0\x02\ +\xe0\xff\xec\x02\xa0\x02\xf0\xff\xec\x02\xa0\x02\xf2\xff\xec\x02\ +\xa0\x02\xf4\xff\xec\x02\xa0\x02\xfe\xff\xec\x02\xa0\x03\x0a\xff\ +\xec\x02\xa0\x03\x0c\xff\xec\x02\xa0\x03\x0e\xff\xd7\x02\xa0\x03\ +\x10\xff\xd7\x02\xa0\x03\x16\xff\xec\x02\xa0\x03\x1a\xff\xec\x02\ +\xa1\x00\x0f\xff\xae\x02\xa1\x00\x11\xff\xae\x02\xa1\x02\x08\xff\ +\xae\x02\xa1\x02\x0c\xff\xae\x02\xa1\x02\x80\xff\xec\x02\xa1\x02\ +\x82\xff\xec\x02\xa1\x02\xb7\xff\xec\x02\xa1\x02\xb9\xff\xec\x02\ +\xa1\x03\x0d\xff\xd7\x02\xa1\x03\x0f\xff\xd7\x02\xa2\x01\xe9\x00\ +)\x02\xa3\x01\x9f\xff\xd7\x02\xa3\x01\xa3\x00\xe1\x02\xa3\x01\ +\xb8\xff\xd7\x02\xa3\x01\xbb\xff\xd7\x02\xa3\x01\xbe\xff\xc3\x02\ +\xa3\x01\xdc\xff\xd7\x02\xa3\x01\xe1\xff\xae\x02\xa3\x01\xe4\xff\ +\xd7\x02\xa3\x02l\xff\xd7\x02\xa3\x02{\x00=\x02\xa3\x02\ +}\xff\xec\x02\xa3\x02~\xff\xd7\x02\xa3\x02\x84\xff\xd7\x02\ +\xa3\x02\x86\xff\xd7\x02\xa3\x02\x88\xff\xd7\x02\xa3\x02\x8a\xff\ +\xd7\x02\xa3\x02\x8c\xff\xd7\x02\xa3\x02\xaa\xff\xd7\x02\xa3\x02\ +\xb1\xff\xd7\x02\xa3\x02\xb3\xff\xd7\x02\xa3\x02\xb6\xff\xd7\x02\ +\xa3\x02\xbe\xff\xd7\x02\xa3\x02\xc0\xff\xae\x02\xa3\x02\xc2\xff\ +\xae\x02\xa3\x02\xc5\xff\xc3\x02\xa3\x02\xc6\xff\xd7\x02\xa3\x02\ +\xc7\xff\xc3\x02\xa3\x02\xc8\xff\xd7\x02\xa3\x02\xd5\xff\xae\x02\ +\xa3\x02\xef\xff\xd7\x02\xa3\x02\xf1\xff\xd7\x02\xa3\x02\xf3\xff\ +\xd7\x02\xa3\x02\xfe\xff\xae\x02\xa3\x03\x0e\xff\xd7\x02\xa3\x03\ +\x10\xff\xd7\x02\xa3\x03\x15\xff\xd7\x02\xa3\x03\x18\xff\xd7\x02\ +\xa4\x01\xcf\xff\xec\x02\xa4\x01\xd8\xff\xec\x02\xa4\x01\xdb\xff\ +\xec\x02\xa4\x01\xde\xff\xec\x02\xa4\x01\xe1\xff\xec\x02\xa4\x01\ +\xea\xff\xec\x02\xa4\x01\xed\xff\xec\x02\xa4\x02j\xff\xec\x02\ +\xa4\x02\x7f\xff\xec\x02\xa4\x02\x85\xff\xec\x02\xa4\x02\x87\xff\ +\xec\x02\xa4\x02\x89\xff\xec\x02\xa4\x02\x8d\xff\xec\x02\xa4\x02\ +\xb2\xff\xec\x02\xa4\x02\xb4\xff\xec\x02\xa4\x02\xc0\xff\xec\x02\ +\xa4\x02\xc2\xff\xec\x02\xa4\x02\xd5\xff\xec\x02\xa4\x02\xe0\xff\ +\xec\x02\xa4\x02\xf0\xff\xec\x02\xa4\x02\xf2\xff\xec\x02\xa4\x02\ +\xf4\xff\xec\x02\xa4\x02\xfe\xff\xec\x02\xa4\x03\x0a\xff\xec\x02\ +\xa4\x03\x0c\xff\xec\x02\xa4\x03\x0e\xff\xd7\x02\xa4\x03\x10\xff\ +\xd7\x02\xa4\x03\x16\xff\xec\x02\xa4\x03\x1a\xff\xec\x02\xa5\x01\ +\x9f\xff\xd7\x02\xa5\x01\xb8\xff\xd7\x02\xa5\x01\xbb\xff\xd7\x02\ +\xa5\x01\xbe\xff\xd7\x02\xa5\x01\xc1\xff\xd7\x02\xa5\x01\xe1\xff\ +\xd7\x02\xa5\x02l\xff\xd7\x02\xa5\x02|\xff\xd7\x02\xa5\x02\ +~\xff\xd7\x02\xa5\x02\x84\xff\xd7\x02\xa5\x02\x86\xff\xd7\x02\ +\xa5\x02\x88\xff\xd7\x02\xa5\x02\x8a\xff\xd7\x02\xa5\x02\x8c\xff\ +\xd7\x02\xa5\x02\xb1\xff\xd7\x02\xa5\x02\xb3\xff\xd7\x02\xa5\x02\ +\xbf\xff\xd7\x02\xa5\x02\xc0\xff\xd7\x02\xa5\x02\xc1\xff\xd7\x02\ +\xa5\x02\xc2\xff\xd7\x02\xa5\x02\xc5\xff\x9a\x02\xa5\x02\xc7\xff\ +\x9a\x02\xa5\x02\xd4\xff\xd7\x02\xa5\x02\xd5\xff\xd7\x02\xa5\x02\ +\xef\xff\xd7\x02\xa5\x02\xf1\xff\xd7\x02\xa5\x02\xf3\xff\xd7\x02\ +\xa5\x02\xfd\xff\xd7\x02\xa5\x02\xfe\xff\xd7\x02\xa5\x03\x09\xff\ +\xd7\x02\xa5\x03\x0b\xff\xd7\x02\xa5\x03\x0e\xff\xd7\x02\xa5\x03\ +\x10\xff\xd7\x02\xa5\x03\x15\xff\xd7\x02\xa5\x03\x19\xff\xec\x02\ +\xa6\x01\xcf\xff\xd7\x02\xa6\x01\xd8\xff\xd7\x02\xa6\x01\xdb\xff\ +\xd7\x02\xa6\x01\xde\xff\xd7\x02\xa6\x01\xe1\xff\xd7\x02\xa6\x01\ +\xea\xff\xd7\x02\xa6\x01\xed\xff\xd7\x02\xa6\x02j\xff\xd7\x02\ +\xa6\x02\x7f\xff\xd7\x02\xa6\x02\x85\xff\xd7\x02\xa6\x02\x87\xff\ +\xd7\x02\xa6\x02\x89\xff\xd7\x02\xa6\x02\x8d\xff\xd7\x02\xa6\x02\ +\xb2\xff\xd7\x02\xa6\x02\xb4\xff\xd7\x02\xa6\x02\xc0\xff\xd7\x02\ +\xa6\x02\xc2\xff\xd7\x02\xa6\x02\xc6\xff\xd7\x02\xa6\x02\xc8\xff\ +\xd7\x02\xa6\x02\xd5\xff\xd7\x02\xa6\x02\xe0\xff\xd7\x02\xa6\x02\ +\xf0\xff\xd7\x02\xa6\x02\xf2\xff\xd7\x02\xa6\x02\xf4\xff\xd7\x02\ +\xa6\x02\xfe\xff\xd7\x02\xa6\x03\x0a\xff\xd7\x02\xa6\x03\x0c\xff\ +\xd7\x02\xa6\x03\x16\xff\xd7\x02\xa6\x03\x1a\xff\xd7\x02\xa7\x01\ +\x9f\xff\xd7\x02\xa7\x01\xb8\xff\xd7\x02\xa7\x01\xbb\xff\xd7\x02\ +\xa7\x01\xbe\xff\xd7\x02\xa7\x01\xc1\xff\xd7\x02\xa7\x01\xe1\xff\ +\xd7\x02\xa7\x02l\xff\xd7\x02\xa7\x02|\xff\xd7\x02\xa7\x02\ +~\xff\xd7\x02\xa7\x02\x84\xff\xd7\x02\xa7\x02\x86\xff\xd7\x02\ +\xa7\x02\x88\xff\xd7\x02\xa7\x02\x8a\xff\xd7\x02\xa7\x02\x8c\xff\ +\xd7\x02\xa7\x02\xb1\xff\xd7\x02\xa7\x02\xb3\xff\xd7\x02\xa7\x02\ +\xbf\xff\xd7\x02\xa7\x02\xc0\xff\xd7\x02\xa7\x02\xc1\xff\xd7\x02\ +\xa7\x02\xc2\xff\xd7\x02\xa7\x02\xc5\xff\x9a\x02\xa7\x02\xc7\xff\ +\x9a\x02\xa7\x02\xd4\xff\xd7\x02\xa7\x02\xd5\xff\xd7\x02\xa7\x02\ +\xef\xff\xd7\x02\xa7\x02\xf1\xff\xd7\x02\xa7\x02\xf3\xff\xd7\x02\ +\xa7\x02\xfd\xff\xd7\x02\xa7\x02\xfe\xff\xd7\x02\xa7\x03\x09\xff\ +\xd7\x02\xa7\x03\x0b\xff\xd7\x02\xa7\x03\x0e\xff\xd7\x02\xa7\x03\ +\x10\xff\xd7\x02\xa7\x03\x15\xff\xd7\x02\xa7\x03\x19\xff\xec\x02\ +\xa8\x01\xcf\xff\xd7\x02\xa8\x01\xd8\xff\xd7\x02\xa8\x01\xdb\xff\ +\xd7\x02\xa8\x01\xde\xff\xd7\x02\xa8\x01\xe1\xff\xd7\x02\xa8\x01\ +\xea\xff\xd7\x02\xa8\x01\xed\xff\xd7\x02\xa8\x02j\xff\xd7\x02\ +\xa8\x02\x7f\xff\xd7\x02\xa8\x02\x85\xff\xd7\x02\xa8\x02\x87\xff\ +\xd7\x02\xa8\x02\x89\xff\xd7\x02\xa8\x02\x8d\xff\xd7\x02\xa8\x02\ +\xb2\xff\xd7\x02\xa8\x02\xb4\xff\xd7\x02\xa8\x02\xc0\xff\xd7\x02\ +\xa8\x02\xc2\xff\xd7\x02\xa8\x02\xc6\xff\xd7\x02\xa8\x02\xc8\xff\ +\xd7\x02\xa8\x02\xd5\xff\xd7\x02\xa8\x02\xe0\xff\xd7\x02\xa8\x02\ +\xf0\xff\xd7\x02\xa8\x02\xf2\xff\xd7\x02\xa8\x02\xf4\xff\xd7\x02\ +\xa8\x02\xfe\xff\xd7\x02\xa8\x03\x0a\xff\xd7\x02\xa8\x03\x0c\xff\ +\xd7\x02\xa8\x03\x16\xff\xd7\x02\xa8\x03\x1a\xff\xd7\x02\xa9\x01\ +\x9f\xff\xd7\x02\xa9\x01\xb8\xff\xd7\x02\xa9\x01\xbb\xff\xd7\x02\ +\xa9\x01\xbe\xff\xd7\x02\xa9\x01\xc1\xff\xd7\x02\xa9\x01\xe1\xff\ +\xd7\x02\xa9\x02l\xff\xd7\x02\xa9\x02|\xff\xd7\x02\xa9\x02\ +~\xff\xd7\x02\xa9\x02\x84\xff\xd7\x02\xa9\x02\x86\xff\xd7\x02\ +\xa9\x02\x88\xff\xd7\x02\xa9\x02\x8a\xff\xd7\x02\xa9\x02\x8c\xff\ +\xd7\x02\xa9\x02\xb1\xff\xd7\x02\xa9\x02\xb3\xff\xd7\x02\xa9\x02\ +\xbf\xff\xd7\x02\xa9\x02\xc0\xff\xd7\x02\xa9\x02\xc1\xff\xd7\x02\ +\xa9\x02\xc2\xff\xd7\x02\xa9\x02\xc5\xff\x9a\x02\xa9\x02\xc7\xff\ +\x9a\x02\xa9\x02\xd4\xff\xd7\x02\xa9\x02\xd5\xff\xd7\x02\xa9\x02\ +\xef\xff\xd7\x02\xa9\x02\xf1\xff\xd7\x02\xa9\x02\xf3\xff\xd7\x02\ +\xa9\x02\xfd\xff\xd7\x02\xa9\x02\xfe\xff\xd7\x02\xa9\x03\x09\xff\ +\xd7\x02\xa9\x03\x0b\xff\xd7\x02\xa9\x03\x0e\xff\xd7\x02\xa9\x03\ +\x10\xff\xd7\x02\xa9\x03\x15\xff\xd7\x02\xa9\x03\x19\xff\xec\x02\ +\xaa\x01\xcf\xff\xd7\x02\xaa\x01\xd8\xff\xd7\x02\xaa\x01\xdb\xff\ +\xd7\x02\xaa\x01\xde\xff\xd7\x02\xaa\x01\xe1\xff\xd7\x02\xaa\x01\ +\xea\xff\xd7\x02\xaa\x01\xed\xff\xd7\x02\xaa\x02j\xff\xd7\x02\ +\xaa\x02\x7f\xff\xd7\x02\xaa\x02\x85\xff\xd7\x02\xaa\x02\x87\xff\ +\xd7\x02\xaa\x02\x89\xff\xd7\x02\xaa\x02\x8d\xff\xd7\x02\xaa\x02\ +\xb2\xff\xd7\x02\xaa\x02\xb4\xff\xd7\x02\xaa\x02\xc0\xff\xd7\x02\ +\xaa\x02\xc2\xff\xd7\x02\xaa\x02\xc6\xff\xd7\x02\xaa\x02\xc8\xff\ +\xd7\x02\xaa\x02\xd5\xff\xd7\x02\xaa\x02\xe0\xff\xd7\x02\xaa\x02\ +\xf0\xff\xd7\x02\xaa\x02\xf2\xff\xd7\x02\xaa\x02\xf4\xff\xd7\x02\ +\xaa\x02\xfe\xff\xd7\x02\xaa\x03\x0a\xff\xd7\x02\xaa\x03\x0c\xff\ +\xd7\x02\xaa\x03\x16\xff\xd7\x02\xaa\x03\x1a\xff\xd7\x02\xab\x01\ +\xa3\x00\xe1\x02\xab\x02\xea\x00)\x02\xab\x03\x0e\xff\xd7\x02\ +\xab\x03\x10\xff\xd7\x02\xac\x00\x05\xff\xec\x02\xac\x00\x0a\xff\ +\xec\x02\xac\x02\x07\xff\xec\x02\xac\x02\x0b\xff\xec\x02\xad\x00\ +\x0f\xff\x9a\x02\xad\x00\x10\xff\xd7\x02\xad\x00\x11\xff\x9a\x02\ +\xad\x01\x9d\x00)\x02\xad\x01\x9f\xff\xd7\x02\xad\x01\xa4\xff\ +\xae\x02\xad\x01\xa6\x00)\x02\xad\x01\xaa\xff\x85\x02\xad\x01\ +\xae\xff\xae\x02\xad\x01\xb5\xff\xae\x02\xad\x01\xb8\xff\xd7\x02\ +\xad\x01\xbb\xff\xd7\x02\xad\x01\xbc\x00)\x02\xad\x01\xbe\xff\ +\xc3\x02\xad\x01\xc4\x00)\x02\xad\x01\xcc\xff\xc3\x02\xad\x01\ +\xcd\xff\xc3\x02\xad\x01\xce\xff\x9a\x02\xad\x01\xcf\xff\xae\x02\ +\xad\x01\xd0\xff\xd7\x02\xad\x01\xd1\xff\xd7\x02\xad\x01\xd2\xff\ +\xc3\x02\xad\x01\xd3\xff\xc3\x02\xad\x01\xd4\xff\xc3\x02\xad\x01\ +\xd5\xff\x9a\x02\xad\x01\xd6\xff\xc3\x02\xad\x01\xd7\xff\xc3\x02\ +\xad\x01\xd8\xff\xae\x02\xad\x01\xd9\xff\xc3\x02\xad\x01\xda\xff\ +\xc3\x02\xad\x01\xdb\xff\xae\x02\xad\x01\xde\xff\xae\x02\xad\x01\ +\xdf\xff\xd7\x02\xad\x01\xe0\xff\xc3\x02\xad\x01\xe1\xff\x9a\x02\ +\xad\x01\xe2\xff\xc3\x02\xad\x01\xe3\xff\xc3\x02\xad\x01\xe5\xff\ +\xc3\x02\xad\x01\xe6\xff\xc3\x02\xad\x01\xe7\xff\xd7\x02\xad\x01\ +\xe8\xff\xc3\x02\xad\x01\xea\xff\xae\x02\xad\x01\xeb\x00)\x02\ +\xad\x01\xec\xff\xc3\x02\xad\x01\xed\xff\xae\x02\xad\x01\xee\xff\ +\xc3\x02\xad\x01\xf2\xff\x9a\x02\xad\x01\xf3\xff\xc3\x02\xad\x01\ +\xf4\x00)\x02\xad\x01\xf5\xff\xc3\x02\xad\x01\xf7\xff\xc3\x02\ +\xad\x01\xf9\xff\xc3\x02\xad\x02\x02\xff\xd7\x02\xad\x02\x03\xff\ +\xd7\x02\xad\x02\x04\xff\xd7\x02\xad\x02\x08\xff\x9a\x02\xad\x02\ +\x0c\xff\x9a\x02\xad\x02j\xff\xae\x02\xad\x02k\xff\xc3\x02\ +\xad\x02l\xff\xd7\x02\xad\x02q\xff\xc3\x02\xad\x02r\xff\ +\x85\x02\xad\x02s\xff\x9a\x02\xad\x02u\xff\xc3\x02\xad\x02\ +w\xff\xd7\x02\xad\x02y\xff\xc3\x02\xad\x02}\xff\xc3\x02\ +\xad\x02~\xff\xd7\x02\xad\x02\x7f\xff\xae\x02\xad\x02\x84\xff\ +\xd7\x02\xad\x02\x85\xff\xae\x02\xad\x02\x86\xff\xd7\x02\xad\x02\ +\x87\xff\xae\x02\xad\x02\x88\xff\xd7\x02\xad\x02\x89\xff\xae\x02\ +\xad\x02\x8a\xff\xd7\x02\xad\x02\x8c\xff\xd7\x02\xad\x02\x8d\xff\ +\xae\x02\xad\x02\x96\xff\xc3\x02\xad\x02\x98\x00)\x02\xad\x02\ +\x9a\xff\xc3\x02\xad\x02\x9e\xff\xc3\x02\xad\x02\xa0\xff\xd7\x02\ +\xad\x02\xa2\xff\xd7\x02\xad\x02\xa4\xff\xc3\x02\xad\x02\xa6\xff\ +\xc3\x02\xad\x02\xa8\x00)\x02\xad\x02\xa9\x00)\x02\xad\x02\ +\xac\xff\xc3\x02\xad\x02\xae\xff\xc3\x02\xad\x02\xb0\xff\xc3\x02\ +\xad\x02\xb1\xff\xd7\x02\xad\x02\xb2\xff\xae\x02\xad\x02\xb3\xff\ +\xd7\x02\xad\x02\xb4\xff\xae\x02\xad\x02\xb5\x00)\x02\xad\x02\ +\xbc\xff\xd7\x02\xad\x02\xbd\x00)\x02\xad\x02\xc0\xff\x9a\x02\ +\xad\x02\xc2\xff\x9a\x02\xad\x02\xc4\xff\xc3\x02\xad\x02\xc5\xff\ +\xd7\x02\xad\x02\xc6\xff\xc3\x02\xad\x02\xc7\xff\xd7\x02\xad\x02\ +\xc8\xff\xc3\x02\xad\x02\xcb\xff\xd7\x02\xad\x02\xcd\xff\xc3\x02\ +\xad\x02\xce\xff\xae\x02\xad\x02\xcf\xff\x9a\x02\xad\x02\xd1\xff\ +\xc3\x02\xad\x02\xd3\xff\xc3\x02\xad\x02\xd5\xff\x9a\x02\xad\x02\ +\xd7\xff\xc3\x02\xad\x02\xd9\xff\x85\x02\xad\x02\xdb\xff\x85\x02\ +\xad\x02\xdd\xff\x85\x02\xad\x02\xe0\xff\xae\x02\xad\x02\xe6\xff\ +\xd7\x02\xad\x02\xe8\xff\xd7\x02\xad\x02\xec\xff\xc3\x02\xad\x02\ +\xee\xff\xc3\x02\xad\x02\xef\xff\xd7\x02\xad\x02\xf0\xff\xae\x02\ +\xad\x02\xf1\xff\xd7\x02\xad\x02\xf2\xff\xae\x02\xad\x02\xf3\xff\ +\xd7\x02\xad\x02\xf4\xff\xae\x02\xad\x02\xf6\xff\xd7\x02\xad\x02\ +\xfe\xff\x9a\x02\xad\x03\x00\xff\xc3\x02\xad\x03\x02\xff\xc3\x02\ +\xad\x03\x06\xff\xd7\x02\xad\x03\x08\xff\xd7\x02\xad\x03\x09\xff\ +\x9a\x02\xad\x03\x0a\xff\xae\x02\xad\x03\x0b\xff\x9a\x02\xad\x03\ +\x0c\xff\xae\x02\xad\x03\x0e\xff\xd7\x02\xad\x03\x10\xff\xd7\x02\ +\xad\x03\x11\xff\xae\x02\xad\x03\x12\xff\x9a\x02\xad\x03\x14\xff\ +\xc3\x02\xad\x03\x15\xff\xd7\x02\xad\x03\x16\xff\xae\x02\xad\x03\ +\x17\x00)\x02\xad\x03\x1a\xff\xae\x02\xad\x03\x1b\xff\xae\x02\ +\xad\x03\x1c\xff\x9a\x02\xae\x00\x0f\xff\x9a\x02\xae\x00\x10\xff\ +\xd7\x02\xae\x00\x11\xff\x9a\x02\xae\x01\xce\xff\xc3\x02\xae\x01\ +\xcf\xff\xec\x02\xae\x01\xd5\xff\xc3\x02\xae\x01\xd8\xff\xec\x02\ +\xae\x01\xdb\xff\xec\x02\xae\x01\xde\xff\xec\x02\xae\x01\xea\xff\ +\xec\x02\xae\x01\xed\xff\xec\x02\xae\x01\xf2\xff\xc3\x02\xae\x02\ +\x02\xff\xd7\x02\xae\x02\x03\xff\xd7\x02\xae\x02\x04\xff\xd7\x02\ +\xae\x02\x08\xff\x9a\x02\xae\x02\x0c\xff\x9a\x02\xae\x02j\xff\ +\xec\x02\xae\x02s\xff\xc3\x02\xae\x02\x7f\xff\xec\x02\xae\x02\ +\x85\xff\xec\x02\xae\x02\x87\xff\xec\x02\xae\x02\x89\xff\xec\x02\ +\xae\x02\x8d\xff\xec\x02\xae\x02\xb2\xff\xec\x02\xae\x02\xb4\xff\ +\xec\x02\xae\x02\xcf\xff\xc3\x02\xae\x02\xe0\xff\xec\x02\xae\x02\ +\xf0\xff\xec\x02\xae\x02\xf2\xff\xec\x02\xae\x02\xf4\xff\xec\x02\ +\xae\x03\x0a\xff\xec\x02\xae\x03\x0c\xff\xec\x02\xae\x03\x12\xff\ +\xc3\x02\xae\x03\x16\xff\xec\x02\xae\x03\x1a\xff\xec\x02\xae\x03\ +\x1c\xff\xc3\x02\xaf\x00\x05\xff\x5c\x02\xaf\x00\x0a\xff\x5c\x02\ +\xaf\x01\x9d\xff\x9a\x02\xaf\x01\xa3\x00f\x02\xaf\x01\xa6\xff\ +\x9a\x02\xaf\x01\xbc\xffH\x02\xaf\x01\xc1\xff\x85\x02\xaf\x01\ +\xc4\xff\x9a\x02\xaf\x01\xdc\xff\xae\x02\xaf\x01\xe1\xff\xd7\x02\ +\xaf\x01\xe4\xff\xae\x02\xaf\x02\x07\xff\x5c\x02\xaf\x02\x0b\xff\ +\x5c\x02\xaf\x02|\xff\x85\x02\xaf\x02\x80\xffq\x02\xaf\x02\ +\x82\xffq\x02\xaf\x02\xa9\xff\x9a\x02\xaf\x02\xaa\xff\xae\x02\ +\xaf\x02\xb5\xffH\x02\xaf\x02\xb6\xff\xae\x02\xaf\x02\xb7\xff\ +\x9a\x02\xaf\x02\xb9\xff\x9a\x02\xaf\x02\xbd\xff\x9a\x02\xaf\x02\ +\xbe\xff\xae\x02\xaf\x02\xbf\xff\x85\x02\xaf\x02\xc0\xff\xd7\x02\ +\xaf\x02\xc1\xff\x85\x02\xaf\x02\xc2\xff\xd7\x02\xaf\x02\xc5\xff\ +\xc3\x02\xaf\x02\xc6\xff\xd7\x02\xaf\x02\xc7\xff\xc3\x02\xaf\x02\ +\xc8\xff\xd7\x02\xaf\x02\xd4\xff\x85\x02\xaf\x02\xd5\xff\xd7\x02\ +\xaf\x02\xfd\xff\x85\x02\xaf\x02\xfe\xff\xd7\x02\xaf\x03\x0d\xff\ +H\x02\xaf\x03\x0e\xff\xae\x02\xaf\x03\x0f\xffH\x02\xaf\x03\ +\x10\xff\xae\x02\xaf\x03\x17\xff\x9a\x02\xaf\x03\x18\xff\xae\x02\ +\xb0\x00\x05\xffq\x02\xb0\x00\x0a\xffq\x02\xb0\x01\xdc\xff\ +\x9a\x02\xb0\x01\xe1\xff\xd7\x02\xb0\x01\xe4\xff\x9a\x02\xb0\x02\ +\x07\xffq\x02\xb0\x02\x0b\xffq\x02\xb0\x02m\xff\xd7\x02\ +\xb0\x02\x81\xff\xd7\x02\xb0\x02\x83\xff\xd7\x02\xb0\x02\x8b\xff\ +\xd7\x02\xb0\x02\xaa\xff\x9a\x02\xb0\x02\xb6\xff\x9a\x02\xb0\x02\ +\xb8\xff\xd7\x02\xb0\x02\xba\xff\xd7\x02\xb0\x02\xbe\xff\x9a\x02\ +\xb0\x02\xc0\xff\xd7\x02\xb0\x02\xc2\xff\xd7\x02\xb0\x02\xc6\xff\ +\xd7\x02\xb0\x02\xc8\xff\xd7\x02\xb0\x02\xd5\xff\xd7\x02\xb0\x02\ +\xfe\xff\xd7\x02\xb0\x03\x0e\xffq\x02\xb0\x03\x10\xffq\x02\ +\xb0\x03\x18\xff\x9a\x02\xb1\x01\x9d\xff\xd7\x02\xb1\x01\xa6\xff\ +\xd7\x02\xb1\x01\xbc\xff\xc3\x02\xb1\x01\xc4\xff\xd7\x02\xb1\x02\ +\x80\xff\xec\x02\xb1\x02\x82\xff\xec\x02\xb1\x02\xa9\xff\xd7\x02\ +\xb1\x02\xb5\xff\xc3\x02\xb1\x02\xb7\xff\xec\x02\xb1\x02\xb9\xff\ +\xec\x02\xb1\x02\xbd\xff\xd7\x02\xb1\x03\x0d\xff\xd7\x02\xb1\x03\ +\x0f\xff\xd7\x02\xb1\x03\x17\xff\xd7\x02\xb2\x00\x05\xff\xec\x02\ +\xb2\x00\x0a\xff\xec\x02\xb2\x01\xd0\xff\xd7\x02\xb2\x01\xdc\xff\ +\xec\x02\xb2\x01\xdd\xff\xec\x02\xb2\x01\xdf\xff\xd7\x02\xb2\x01\ +\xe1\xff\xec\x02\xb2\x01\xe4\xff\xec\x02\xb2\x01\xf6\xff\xec\x02\ +\xb2\x02\x07\xff\xec\x02\xb2\x02\x0b\xff\xec\x02\xb2\x02\xa0\xff\ +\xd7\x02\xb2\x02\xaa\xff\xec\x02\xb2\x02\xb6\xff\xec\x02\xb2\x02\ +\xbc\xff\xd7\x02\xb2\x02\xbe\xff\xec\x02\xb2\x02\xc0\xff\xec\x02\ +\xb2\x02\xc2\xff\xec\x02\xb2\x02\xcb\xff\xd7\x02\xb2\x02\xd5\xff\ +\xec\x02\xb2\x02\xe6\xff\xd7\x02\xb2\x02\xf8\xff\xec\x02\xb2\x02\ +\xfa\xff\xec\x02\xb2\x02\xfc\xff\xec\x02\xb2\x02\xfe\xff\xec\x02\ +\xb2\x03\x06\xff\xd7\x02\xb2\x03\x08\xff\xd7\x02\xb2\x03\x0e\xff\ +\xec\x02\xb2\x03\x10\xff\xec\x02\xb2\x03\x18\xff\xec\x02\xb3\x01\ +\x9f\xff\xd7\x02\xb3\x01\xb8\xff\xd7\x02\xb3\x01\xbb\xff\xd7\x02\ +\xb3\x01\xbe\xff\xd7\x02\xb3\x01\xe1\xff\xd7\x02\xb3\x02l\xff\ +\xd7\x02\xb3\x02~\xff\xd7\x02\xb3\x02\x84\xff\xd7\x02\xb3\x02\ +\x86\xff\xd7\x02\xb3\x02\x88\xff\xd7\x02\xb3\x02\x8a\xff\xd7\x02\ +\xb3\x02\x8c\xff\xd7\x02\xb3\x02\xb1\xff\xd7\x02\xb3\x02\xb3\xff\ +\xd7\x02\xb3\x02\xc0\xff\xd7\x02\xb3\x02\xc2\xff\xd7\x02\xb3\x02\ +\xc5\xff\xd7\x02\xb3\x02\xc7\xff\xd7\x02\xb3\x02\xd5\xff\xd7\x02\ +\xb3\x02\xef\xff\xd7\x02\xb3\x02\xf1\xff\xd7\x02\xb3\x02\xf3\xff\ +\xd7\x02\xb3\x02\xfe\xff\xd7\x02\xb3\x03\x09\xff\xd7\x02\xb3\x03\ +\x0b\xff\xd7\x02\xb3\x03\x0e\xff\xd7\x02\xb3\x03\x10\xff\xd7\x02\ +\xb3\x03\x15\xff\xd7\x02\xb5\x00\x0f\xff\x85\x02\xb5\x00\x10\xff\ +\xae\x02\xb5\x00\x11\xff\x85\x02\xb5\x01\x9f\xff\xd7\x02\xb5\x01\ +\xa4\xff\x9a\x02\xb5\x01\xaa\xffq\x02\xb5\x01\xae\xff\x9a\x02\ +\xb5\x01\xb5\xff\x9a\x02\xb5\x01\xb8\xff\xd7\x02\xb5\x01\xbb\xff\ +\xd7\x02\xb5\x01\xbc\x00)\x02\xb5\x01\xbe\xff\xae\x02\xb5\x01\ +\xcc\xff\x9a\x02\xb5\x01\xcd\xff\x9a\x02\xb5\x01\xce\xff\x85\x02\ +\xb5\x01\xcf\xffq\x02\xb5\x01\xd0\xff\xd7\x02\xb5\x01\xd1\xff\ +\xd7\x02\xb5\x01\xd2\xff\x9a\x02\xb5\x01\xd3\xff\x9a\x02\xb5\x01\ +\xd4\xff\x9a\x02\xb5\x01\xd5\xff\x85\x02\xb5\x01\xd6\xff\x9a\x02\ +\xb5\x01\xd7\xff\x9a\x02\xb5\x01\xd8\xffq\x02\xb5\x01\xd9\xff\ +\x9a\x02\xb5\x01\xda\xff\x9a\x02\xb5\x01\xdb\xffq\x02\xb5\x01\ +\xdc\xff\xae\x02\xb5\x01\xdd\xff\xae\x02\xb5\x01\xde\xffq\x02\ +\xb5\x01\xdf\xff\xd7\x02\xb5\x01\xe0\xff\x9a\x02\xb5\x01\xe1\xff\ +\x9a\x02\xb5\x01\xe2\xff\x9a\x02\xb5\x01\xe3\xff\x9a\x02\xb5\x01\ +\xe4\xff\xae\x02\xb5\x01\xe5\xff\x9a\x02\xb5\x01\xe6\xff\x9a\x02\ +\xb5\x01\xe7\xff\xd7\x02\xb5\x01\xe8\xff\x9a\x02\xb5\x01\xe9\xff\ +\xc3\x02\xb5\x01\xea\xffq\x02\xb5\x01\xec\xff\x9a\x02\xb5\x01\ +\xed\xffq\x02\xb5\x01\xee\xff\x85\x02\xb5\x01\xf2\xff\x85\x02\ +\xb5\x01\xf3\xff\x9a\x02\xb5\x01\xf5\xff\x9a\x02\xb5\x01\xf6\xff\ +\xae\x02\xb5\x01\xf7\xff\x9a\x02\xb5\x01\xf9\xff\x9a\x02\xb5\x02\ +\x02\xff\xae\x02\xb5\x02\x03\xff\xae\x02\xb5\x02\x04\xff\xae\x02\ +\xb5\x02\x08\xff\x85\x02\xb5\x02\x0c\xff\x85\x02\xb5\x02j\xff\ +q\x02\xb5\x02k\xff\x9a\x02\xb5\x02l\xff\xd7\x02\xb5\x02\ +m\xff\xd7\x02\xb5\x02q\xff\x9a\x02\xb5\x02r\xffq\x02\ +\xb5\x02s\xff\x85\x02\xb5\x02u\xff\x9a\x02\xb5\x02w\xff\ +\x9a\x02\xb5\x02y\xff\x9a\x02\xb5\x02}\xff\x9a\x02\xb5\x02\ +~\xff\xd7\x02\xb5\x02\x7f\xffq\x02\xb5\x02\x81\xff\xd7\x02\ +\xb5\x02\x83\xff\xd7\x02\xb5\x02\x84\xff\xd7\x02\xb5\x02\x85\xff\ +q\x02\xb5\x02\x86\xff\xd7\x02\xb5\x02\x87\xffq\x02\xb5\x02\ +\x88\xff\xd7\x02\xb5\x02\x89\xffq\x02\xb5\x02\x8a\xff\xd7\x02\ +\xb5\x02\x8b\xff\xd7\x02\xb5\x02\x8c\xff\xd7\x02\xb5\x02\x8d\xff\ +q\x02\xb5\x02\x96\xff\x9a\x02\xb5\x02\x9a\xff\x9a\x02\xb5\x02\ +\x9e\xff\x9a\x02\xb5\x02\xa0\xff\xd7\x02\xb5\x02\xa2\xff\xd7\x02\ +\xb5\x02\xa4\xff\x9a\x02\xb5\x02\xa6\xff\x9a\x02\xb5\x02\xaa\xff\ +\xae\x02\xb5\x02\xac\xff\x9a\x02\xb5\x02\xae\xff\x9a\x02\xb5\x02\ +\xb0\xff\x9a\x02\xb5\x02\xb1\xff\xd7\x02\xb5\x02\xb2\xffq\x02\ +\xb5\x02\xb3\xff\xd7\x02\xb5\x02\xb4\xffq\x02\xb5\x02\xb5\x00\ +)\x02\xb5\x02\xb6\xff\xae\x02\xb5\x02\xb8\xff\xae\x02\xb5\x02\ +\xba\xff\xae\x02\xb5\x02\xbc\xff\xd7\x02\xb5\x02\xbe\xff\xae\x02\ +\xb5\x02\xc0\xff\x9a\x02\xb5\x02\xc2\xff\x9a\x02\xb5\x02\xc4\xff\ +\x9a\x02\xb5\x02\xc5\xff\x9a\x02\xb5\x02\xc6\xffq\x02\xb5\x02\ +\xc7\xff\x9a\x02\xb5\x02\xc8\xffq\x02\xb5\x02\xcb\xff\xd7\x02\ +\xb5\x02\xcd\xff\x9a\x02\xb5\x02\xce\xff\x9a\x02\xb5\x02\xcf\xff\ +\x85\x02\xb5\x02\xd1\xff\x9a\x02\xb5\x02\xd3\xff\x9a\x02\xb5\x02\ +\xd5\xff\x9a\x02\xb5\x02\xd7\xff\x9a\x02\xb5\x02\xd9\xffq\x02\ +\xb5\x02\xdb\xffq\x02\xb5\x02\xdd\xffq\x02\xb5\x02\xe0\xff\ +q\x02\xb5\x02\xe6\xff\xd7\x02\xb5\x02\xe8\xff\xd7\x02\xb5\x02\ +\xea\xff\xc3\x02\xb5\x02\xec\xff\x9a\x02\xb5\x02\xee\xff\x9a\x02\ +\xb5\x02\xef\xff\xd7\x02\xb5\x02\xf0\xffq\x02\xb5\x02\xf1\xff\ +\xd7\x02\xb5\x02\xf2\xffq\x02\xb5\x02\xf3\xff\xd7\x02\xb5\x02\ +\xf4\xffq\x02\xb5\x02\xf6\xff\xd7\x02\xb5\x02\xf8\xff\xae\x02\ +\xb5\x02\xfa\xff\xae\x02\xb5\x02\xfc\xff\xae\x02\xb5\x02\xfe\xff\ +\x9a\x02\xb5\x03\x00\xff\x9a\x02\xb5\x03\x02\xff\x9a\x02\xb5\x03\ +\x06\xff\xd7\x02\xb5\x03\x08\xff\xd7\x02\xb5\x03\x09\xffq\x02\ +\xb5\x03\x0a\xffq\x02\xb5\x03\x0b\xffq\x02\xb5\x03\x0c\xff\ +q\x02\xb5\x03\x0e\xff\x9a\x02\xb5\x03\x10\xff\x9a\x02\xb5\x03\ +\x11\xff\x9a\x02\xb5\x03\x12\xff\x85\x02\xb5\x03\x14\xff\x9a\x02\ +\xb5\x03\x15\xff\xd7\x02\xb5\x03\x16\xffq\x02\xb5\x03\x18\xff\ +\xae\x02\xb5\x03\x1a\xffq\x02\xb5\x03\x1b\xff\x9a\x02\xb5\x03\ +\x1c\xff\x85\x02\xb6\x00\x0f\xff\x9a\x02\xb6\x00\x10\xff\xd7\x02\ +\xb6\x00\x11\xff\x9a\x02\xb6\x01\xce\xff\xc3\x02\xb6\x01\xcf\xff\ +\xec\x02\xb6\x01\xd5\xff\xc3\x02\xb6\x01\xd8\xff\xec\x02\xb6\x01\ +\xdb\xff\xec\x02\xb6\x01\xde\xff\xec\x02\xb6\x01\xea\xff\xec\x02\ +\xb6\x01\xed\xff\xec\x02\xb6\x01\xf2\xff\xc3\x02\xb6\x02\x02\xff\ +\xd7\x02\xb6\x02\x03\xff\xd7\x02\xb6\x02\x04\xff\xd7\x02\xb6\x02\ +\x08\xff\x9a\x02\xb6\x02\x0c\xff\x9a\x02\xb6\x02j\xff\xec\x02\ +\xb6\x02s\xff\xc3\x02\xb6\x02\x7f\xff\xec\x02\xb6\x02\x85\xff\ +\xec\x02\xb6\x02\x87\xff\xec\x02\xb6\x02\x89\xff\xec\x02\xb6\x02\ +\x8d\xff\xec\x02\xb6\x02\xb2\xff\xec\x02\xb6\x02\xb4\xff\xec\x02\ +\xb6\x02\xcf\xff\xc3\x02\xb6\x02\xe0\xff\xec\x02\xb6\x02\xf0\xff\ +\xec\x02\xb6\x02\xf2\xff\xec\x02\xb6\x02\xf4\xff\xec\x02\xb6\x03\ +\x0a\xff\xec\x02\xb6\x03\x0c\xff\xec\x02\xb6\x03\x12\xff\xc3\x02\ +\xb6\x03\x16\xff\xec\x02\xb6\x03\x1a\xff\xec\x02\xb6\x03\x1c\xff\ +\xc3\x02\xb7\x00\x0f\xff\x85\x02\xb7\x00\x11\xff\x85\x02\xb7\x01\ +\x9f\xff\xd7\x02\xb7\x01\xa4\xff\xae\x02\xb7\x01\xaa\xff\x85\x02\ +\xb7\x01\xae\xff\xae\x02\xb7\x01\xb5\xff\xae\x02\xb7\x01\xb8\xff\ +\xd7\x02\xb7\x01\xbb\xff\xd7\x02\xb7\x01\xbe\xff\xc3\x02\xb7\x01\ +\xca\xff\xae\x02\xb7\x01\xcc\xff\xc3\x02\xb7\x01\xcd\xff\xc3\x02\ +\xb7\x01\xce\xff\x9a\x02\xb7\x01\xcf\xff\x9a\x02\xb7\x01\xd2\xff\ +\xc3\x02\xb7\x01\xd3\xff\xc3\x02\xb7\x01\xd4\xff\xc3\x02\xb7\x01\ +\xd5\xff\x9a\x02\xb7\x01\xd6\xff\xc3\x02\xb7\x01\xd7\xff\xc3\x02\ +\xb7\x01\xd8\xff\x9a\x02\xb7\x01\xd9\xff\xc3\x02\xb7\x01\xda\xff\ +\xc3\x02\xb7\x01\xdb\xff\x9a\x02\xb7\x01\xde\xff\x9a\x02\xb7\x01\ +\xe0\xff\xc3\x02\xb7\x01\xe1\xff\xae\x02\xb7\x01\xe2\xff\xc3\x02\ +\xb7\x01\xe3\xff\xc3\x02\xb7\x01\xe5\xff\xc3\x02\xb7\x01\xe6\xff\ +\xc3\x02\xb7\x01\xe8\xff\xc3\x02\xb7\x01\xe9\xff\xd7\x02\xb7\x01\ +\xea\xff\x9a\x02\xb7\x01\xeb\x00)\x02\xb7\x01\xec\xff\xc3\x02\ +\xb7\x01\xed\xff\x9a\x02\xb7\x01\xee\xff\xae\x02\xb7\x01\xf2\xff\ +\x9a\x02\xb7\x01\xf3\xff\xc3\x02\xb7\x01\xf4\x00)\x02\xb7\x01\ +\xf5\xff\xc3\x02\xb7\x01\xf7\xff\xc3\x02\xb7\x01\xf9\xff\xc3\x02\ +\xb7\x02\x08\xff\x85\x02\xb7\x02\x0c\xff\x85\x02\xb7\x02j\xff\ +\x9a\x02\xb7\x02k\xff\xc3\x02\xb7\x02l\xff\xd7\x02\xb7\x02\ +q\xff\xc3\x02\xb7\x02r\xff\x85\x02\xb7\x02s\xff\x9a\x02\ +\xb7\x02u\xff\xc3\x02\xb7\x02w\xff\xd7\x02\xb7\x02y\xff\ +\xc3\x02\xb7\x02}\xff\xd7\x02\xb7\x02~\xff\xd7\x02\xb7\x02\ +\x7f\xff\x9a\x02\xb7\x02\x84\xff\xd7\x02\xb7\x02\x85\xff\x9a\x02\ +\xb7\x02\x86\xff\xd7\x02\xb7\x02\x87\xff\x9a\x02\xb7\x02\x88\xff\ +\xd7\x02\xb7\x02\x89\xff\x9a\x02\xb7\x02\x8a\xff\xd7\x02\xb7\x02\ +\x8c\xff\xd7\x02\xb7\x02\x8d\xff\x9a\x02\xb7\x02\x96\xff\xc3\x02\ +\xb7\x02\x98\x00)\x02\xb7\x02\x9a\xff\xc3\x02\xb7\x02\x9e\xff\ +\xc3\x02\xb7\x02\xa4\xff\xc3\x02\xb7\x02\xa6\xff\xc3\x02\xb7\x02\ +\xa8\x00)\x02\xb7\x02\xac\xff\xc3\x02\xb7\x02\xae\xff\xc3\x02\ +\xb7\x02\xb0\xff\xc3\x02\xb7\x02\xb1\xff\xd7\x02\xb7\x02\xb2\xff\ +\x9a\x02\xb7\x02\xb3\xff\xd7\x02\xb7\x02\xb4\xff\x9a\x02\xb7\x02\ +\xc0\xff\xae\x02\xb7\x02\xc2\xff\xae\x02\xb7\x02\xc4\xff\xc3\x02\ +\xb7\x02\xc6\xff\xae\x02\xb7\x02\xc8\xff\xae\x02\xb7\x02\xcd\xff\ +\xc3\x02\xb7\x02\xce\xff\xae\x02\xb7\x02\xcf\xff\x9a\x02\xb7\x02\ +\xd1\xff\xc3\x02\xb7\x02\xd3\xff\xc3\x02\xb7\x02\xd5\xff\xae\x02\ +\xb7\x02\xd7\xff\xc3\x02\xb7\x02\xd9\xff\x85\x02\xb7\x02\xda\xff\ +\xae\x02\xb7\x02\xdb\xff\x85\x02\xb7\x02\xdc\xff\xae\x02\xb7\x02\ +\xdd\xff\x85\x02\xb7\x02\xde\xff\xae\x02\xb7\x02\xe0\xff\x9a\x02\ +\xb7\x02\xe1\xff\xec\x02\xb7\x02\xe2\xff\xae\x02\xb7\x02\xe3\xff\ +\xec\x02\xb7\x02\xe4\xff\xae\x02\xb7\x02\xec\xff\xc3\x02\xb7\x02\ +\xee\xff\xc3\x02\xb7\x02\xef\xff\xd7\x02\xb7\x02\xf0\xff\x9a\x02\ +\xb7\x02\xf1\xff\xd7\x02\xb7\x02\xf2\xff\x9a\x02\xb7\x02\xf3\xff\ +\xd7\x02\xb7\x02\xf4\xff\x9a\x02\xb7\x02\xfe\xff\xae\x02\xb7\x03\ +\x00\xff\xc3\x02\xb7\x03\x02\xff\xc3\x02\xb7\x03\x09\xff\xae\x02\ +\xb7\x03\x0a\xff\x9a\x02\xb7\x03\x0b\xff\xae\x02\xb7\x03\x0c\xff\ +\x9a\x02\xb7\x03\x0e\xff\xd7\x02\xb7\x03\x10\xff\xd7\x02\xb7\x03\ +\x11\xff\xae\x02\xb7\x03\x12\xff\x9a\x02\xb7\x03\x14\xff\xc3\x02\ +\xb7\x03\x15\xff\xd7\x02\xb7\x03\x16\xff\x9a\x02\xb7\x03\x19\xff\ +\xec\x02\xb7\x03\x1a\xff\x9a\x02\xb7\x03\x1b\xff\xae\x02\xb7\x03\ +\x1c\xff\x9a\x02\xb8\x00\x0f\xff\xae\x02\xb8\x00\x11\xff\xae\x02\ +\xb8\x01\xce\xff\xec\x02\xb8\x01\xd5\xff\xec\x02\xb8\x01\xf2\xff\ +\xec\x02\xb8\x02\x08\xff\xae\x02\xb8\x02\x0c\xff\xae\x02\xb8\x02\ +s\xff\xec\x02\xb8\x02\xcf\xff\xec\x02\xb8\x03\x12\xff\xec\x02\ +\xb8\x03\x1c\xff\xec\x02\xb9\x00\x0f\xff\x85\x02\xb9\x00\x11\xff\ +\x85\x02\xb9\x01\x9f\xff\xd7\x02\xb9\x01\xa4\xff\xae\x02\xb9\x01\ +\xaa\xff\x85\x02\xb9\x01\xae\xff\xae\x02\xb9\x01\xb5\xff\xae\x02\ +\xb9\x01\xb8\xff\xd7\x02\xb9\x01\xbb\xff\xd7\x02\xb9\x01\xbe\xff\ +\xc3\x02\xb9\x01\xca\xff\xae\x02\xb9\x01\xcc\xff\xc3\x02\xb9\x01\ +\xcd\xff\xc3\x02\xb9\x01\xce\xff\x9a\x02\xb9\x01\xcf\xff\x9a\x02\ +\xb9\x01\xd2\xff\xc3\x02\xb9\x01\xd3\xff\xc3\x02\xb9\x01\xd4\xff\ +\xc3\x02\xb9\x01\xd5\xff\x9a\x02\xb9\x01\xd6\xff\xc3\x02\xb9\x01\ +\xd7\xff\xc3\x02\xb9\x01\xd8\xff\x9a\x02\xb9\x01\xd9\xff\xc3\x02\ +\xb9\x01\xda\xff\xc3\x02\xb9\x01\xdb\xff\x9a\x02\xb9\x01\xde\xff\ +\x9a\x02\xb9\x01\xe0\xff\xc3\x02\xb9\x01\xe1\xff\xae\x02\xb9\x01\ +\xe2\xff\xc3\x02\xb9\x01\xe3\xff\xc3\x02\xb9\x01\xe5\xff\xc3\x02\ +\xb9\x01\xe6\xff\xc3\x02\xb9\x01\xe8\xff\xc3\x02\xb9\x01\xe9\xff\ +\xd7\x02\xb9\x01\xea\xff\x9a\x02\xb9\x01\xeb\x00)\x02\xb9\x01\ +\xec\xff\xc3\x02\xb9\x01\xed\xff\x9a\x02\xb9\x01\xee\xff\xae\x02\ +\xb9\x01\xf2\xff\x9a\x02\xb9\x01\xf3\xff\xc3\x02\xb9\x01\xf4\x00\ +)\x02\xb9\x01\xf5\xff\xc3\x02\xb9\x01\xf7\xff\xc3\x02\xb9\x01\ +\xf9\xff\xc3\x02\xb9\x02\x08\xff\x85\x02\xb9\x02\x0c\xff\x85\x02\ +\xb9\x02j\xff\x9a\x02\xb9\x02k\xff\xc3\x02\xb9\x02l\xff\ +\xd7\x02\xb9\x02q\xff\xc3\x02\xb9\x02r\xff\x85\x02\xb9\x02\ +s\xff\x9a\x02\xb9\x02u\xff\xc3\x02\xb9\x02w\xff\xd7\x02\ +\xb9\x02y\xff\xc3\x02\xb9\x02}\xff\xd7\x02\xb9\x02~\xff\ +\xd7\x02\xb9\x02\x7f\xff\x9a\x02\xb9\x02\x84\xff\xd7\x02\xb9\x02\ +\x85\xff\x9a\x02\xb9\x02\x86\xff\xd7\x02\xb9\x02\x87\xff\x9a\x02\ +\xb9\x02\x88\xff\xd7\x02\xb9\x02\x89\xff\x9a\x02\xb9\x02\x8a\xff\ +\xd7\x02\xb9\x02\x8c\xff\xd7\x02\xb9\x02\x8d\xff\x9a\x02\xb9\x02\ +\x96\xff\xc3\x02\xb9\x02\x98\x00)\x02\xb9\x02\x9a\xff\xc3\x02\ +\xb9\x02\x9e\xff\xc3\x02\xb9\x02\xa4\xff\xc3\x02\xb9\x02\xa6\xff\ +\xc3\x02\xb9\x02\xa8\x00)\x02\xb9\x02\xac\xff\xc3\x02\xb9\x02\ +\xae\xff\xc3\x02\xb9\x02\xb0\xff\xc3\x02\xb9\x02\xb1\xff\xd7\x02\ +\xb9\x02\xb2\xff\x9a\x02\xb9\x02\xb3\xff\xd7\x02\xb9\x02\xb4\xff\ +\x9a\x02\xb9\x02\xc0\xff\xae\x02\xb9\x02\xc2\xff\xae\x02\xb9\x02\ +\xc4\xff\xc3\x02\xb9\x02\xc6\xff\xae\x02\xb9\x02\xc8\xff\xae\x02\ +\xb9\x02\xcd\xff\xc3\x02\xb9\x02\xce\xff\xae\x02\xb9\x02\xcf\xff\ +\x9a\x02\xb9\x02\xd1\xff\xc3\x02\xb9\x02\xd3\xff\xc3\x02\xb9\x02\ +\xd5\xff\xae\x02\xb9\x02\xd7\xff\xc3\x02\xb9\x02\xd9\xff\x85\x02\ +\xb9\x02\xda\xff\xae\x02\xb9\x02\xdb\xff\x85\x02\xb9\x02\xdc\xff\ +\xae\x02\xb9\x02\xdd\xff\x85\x02\xb9\x02\xde\xff\xae\x02\xb9\x02\ +\xe0\xff\x9a\x02\xb9\x02\xe1\xff\xec\x02\xb9\x02\xe2\xff\xae\x02\ +\xb9\x02\xe3\xff\xec\x02\xb9\x02\xe4\xff\xae\x02\xb9\x02\xec\xff\ +\xc3\x02\xb9\x02\xee\xff\xc3\x02\xb9\x02\xef\xff\xd7\x02\xb9\x02\ +\xf0\xff\x9a\x02\xb9\x02\xf1\xff\xd7\x02\xb9\x02\xf2\xff\x9a\x02\ +\xb9\x02\xf3\xff\xd7\x02\xb9\x02\xf4\xff\x9a\x02\xb9\x02\xfe\xff\ +\xae\x02\xb9\x03\x00\xff\xc3\x02\xb9\x03\x02\xff\xc3\x02\xb9\x03\ +\x09\xff\xae\x02\xb9\x03\x0a\xff\x9a\x02\xb9\x03\x0b\xff\xae\x02\ +\xb9\x03\x0c\xff\x9a\x02\xb9\x03\x0e\xff\xd7\x02\xb9\x03\x10\xff\ +\xd7\x02\xb9\x03\x11\xff\xae\x02\xb9\x03\x12\xff\x9a\x02\xb9\x03\ +\x14\xff\xc3\x02\xb9\x03\x15\xff\xd7\x02\xb9\x03\x16\xff\x9a\x02\ +\xb9\x03\x19\xff\xec\x02\xb9\x03\x1a\xff\x9a\x02\xb9\x03\x1b\xff\ +\xae\x02\xb9\x03\x1c\xff\x9a\x02\xba\x00\x0f\xff\xae\x02\xba\x00\ +\x11\xff\xae\x02\xba\x01\xce\xff\xec\x02\xba\x01\xd5\xff\xec\x02\ +\xba\x01\xf2\xff\xec\x02\xba\x02\x08\xff\xae\x02\xba\x02\x0c\xff\ +\xae\x02\xba\x02s\xff\xec\x02\xba\x02\xcf\xff\xec\x02\xba\x03\ +\x12\xff\xec\x02\xba\x03\x1c\xff\xec\x02\xbb\x01\x9f\xff\xd7\x02\ +\xbb\x01\xa3\x00\xe1\x02\xbb\x01\xb8\xff\xd7\x02\xbb\x01\xbb\xff\ +\xd7\x02\xbb\x01\xbe\xff\xc3\x02\xbb\x01\xdc\xff\xd7\x02\xbb\x01\ +\xe1\xff\xae\x02\xbb\x01\xe4\xff\xd7\x02\xbb\x02l\xff\xd7\x02\ +\xbb\x02{\x00=\x02\xbb\x02}\xff\xec\x02\xbb\x02~\xff\ +\xd7\x02\xbb\x02\x84\xff\xd7\x02\xbb\x02\x86\xff\xd7\x02\xbb\x02\ +\x88\xff\xd7\x02\xbb\x02\x8a\xff\xd7\x02\xbb\x02\x8c\xff\xd7\x02\ +\xbb\x02\xaa\xff\xd7\x02\xbb\x02\xb1\xff\xd7\x02\xbb\x02\xb3\xff\ +\xd7\x02\xbb\x02\xb6\xff\xd7\x02\xbb\x02\xbe\xff\xd7\x02\xbb\x02\ +\xc0\xff\xae\x02\xbb\x02\xc2\xff\xae\x02\xbb\x02\xc5\xff\xc3\x02\ +\xbb\x02\xc6\xff\xd7\x02\xbb\x02\xc7\xff\xc3\x02\xbb\x02\xc8\xff\ +\xd7\x02\xbb\x02\xd5\xff\xae\x02\xbb\x02\xef\xff\xd7\x02\xbb\x02\ +\xf1\xff\xd7\x02\xbb\x02\xf3\xff\xd7\x02\xbb\x02\xfe\xff\xae\x02\ +\xbb\x03\x0e\xff\xd7\x02\xbb\x03\x10\xff\xd7\x02\xbb\x03\x15\xff\ +\xd7\x02\xbb\x03\x18\xff\xd7\x02\xbc\x01\xcf\xff\xec\x02\xbc\x01\ +\xd8\xff\xec\x02\xbc\x01\xdb\xff\xec\x02\xbc\x01\xde\xff\xec\x02\ +\xbc\x01\xe1\xff\xec\x02\xbc\x01\xea\xff\xec\x02\xbc\x01\xed\xff\ +\xec\x02\xbc\x02j\xff\xec\x02\xbc\x02\x7f\xff\xec\x02\xbc\x02\ +\x85\xff\xec\x02\xbc\x02\x87\xff\xec\x02\xbc\x02\x89\xff\xec\x02\ +\xbc\x02\x8d\xff\xec\x02\xbc\x02\xb2\xff\xec\x02\xbc\x02\xb4\xff\ +\xec\x02\xbc\x02\xc0\xff\xec\x02\xbc\x02\xc2\xff\xec\x02\xbc\x02\ +\xd5\xff\xec\x02\xbc\x02\xe0\xff\xec\x02\xbc\x02\xf0\xff\xec\x02\ +\xbc\x02\xf2\xff\xec\x02\xbc\x02\xf4\xff\xec\x02\xbc\x02\xfe\xff\ +\xec\x02\xbc\x03\x0a\xff\xec\x02\xbc\x03\x0c\xff\xec\x02\xbc\x03\ +\x0e\xff\xd7\x02\xbc\x03\x10\xff\xd7\x02\xbc\x03\x16\xff\xec\x02\ +\xbc\x03\x1a\xff\xec\x02\xbd\x01\xa3\x00\xe1\x02\xbd\x02\xea\x00\ +)\x02\xbd\x03\x0e\xff\xd7\x02\xbd\x03\x10\xff\xd7\x02\xbe\x00\ +\x05\xff\xec\x02\xbe\x00\x0a\xff\xec\x02\xbe\x02\x07\xff\xec\x02\ +\xbe\x02\x0b\xff\xec\x02\xbf\x01\xa3\x00\xe1\x02\xbf\x02\xea\x00\ +)\x02\xbf\x03\x0e\xff\xd7\x02\xbf\x03\x10\xff\xd7\x02\xc0\x00\ +\x05\xff\xec\x02\xc0\x00\x0a\xff\xec\x02\xc0\x02\x07\xff\xec\x02\ +\xc0\x02\x0b\xff\xec\x02\xc3\x00\x05\xff\xc3\x02\xc3\x00\x0a\xff\ +\xc3\x02\xc3\x01\x9d\xff\xd7\x02\xc3\x01\xa6\xff\xd7\x02\xc3\x01\ +\xbc\xff\x85\x02\xc3\x01\xc1\xff\xae\x02\xc3\x01\xc4\xff\xd7\x02\ +\xc3\x01\xdc\xff\xd7\x02\xc3\x01\xdd\xff\xec\x02\xc3\x01\xe1\xff\ +\xec\x02\xc3\x01\xe4\xff\xd7\x02\xc3\x01\xf6\xff\xec\x02\xc3\x02\ +\x07\xff\xc3\x02\xc3\x02\x0b\xff\xc3\x02\xc3\x02|\xff\xae\x02\ +\xc3\x02\x80\xff\xc3\x02\xc3\x02\x82\xff\xc3\x02\xc3\x02\xa9\xff\ +\xd7\x02\xc3\x02\xaa\xff\xd7\x02\xc3\x02\xb5\xff\x85\x02\xc3\x02\ +\xb6\xff\xd7\x02\xc3\x02\xb7\xff\x9a\x02\xc3\x02\xb9\xff\x9a\x02\ +\xc3\x02\xbd\xff\xd7\x02\xc3\x02\xbe\xff\xd7\x02\xc3\x02\xbf\xff\ +\xae\x02\xc3\x02\xc0\xff\xec\x02\xc3\x02\xc1\xff\xae\x02\xc3\x02\ +\xc2\xff\xec\x02\xc3\x02\xd4\xff\xae\x02\xc3\x02\xd5\xff\xec\x02\ +\xc3\x02\xf8\xff\xec\x02\xc3\x02\xfa\xff\xec\x02\xc3\x02\xfc\xff\ +\xec\x02\xc3\x02\xfd\xff\xae\x02\xc3\x02\xfe\xff\xec\x02\xc3\x03\ +\x0d\xff\xae\x02\xc3\x03\x0e\xff\xd7\x02\xc3\x03\x0f\xff\xae\x02\ +\xc3\x03\x10\xff\xd7\x02\xc3\x03\x17\xff\xd7\x02\xc3\x03\x18\xff\ +\xd7\x02\xc4\x00\x05\xff\x9a\x02\xc4\x00\x0a\xff\x9a\x02\xc4\x01\ +\xdc\xff\xd7\x02\xc4\x01\xdd\xff\xd7\x02\xc4\x01\xe4\xff\xd7\x02\ +\xc4\x01\xf6\xff\xd7\x02\xc4\x02\x07\xff\x9a\x02\xc4\x02\x0b\xff\ +\x9a\x02\xc4\x02\xaa\xff\xd7\x02\xc4\x02\xb6\xff\xd7\x02\xc4\x02\ +\xb8\xff\xd7\x02\xc4\x02\xba\xff\xd7\x02\xc4\x02\xbe\xff\xd7\x02\ +\xc4\x02\xf8\xff\xd7\x02\xc4\x02\xfa\xff\xd7\x02\xc4\x02\xfc\xff\ +\xd7\x02\xc4\x03\x0e\xff\xae\x02\xc4\x03\x10\xff\xae\x02\xc4\x03\ +\x18\xff\xd7\x02\xc5\x01\xbc\xff\xd7\x02\xc5\x02\x80\xff\xec\x02\ +\xc5\x02\x82\xff\xec\x02\xc5\x02\xb5\xff\xd7\x02\xc5\x02\xb7\xff\ +\xec\x02\xc5\x02\xb9\xff\xec\x02\xc5\x03\x0d\xff\xec\x02\xc5\x03\ +\x0f\xff\xec\x02\xc6\x00\x05\xff\xec\x02\xc6\x00\x0a\xff\xec\x02\ +\xc6\x02\x07\xff\xec\x02\xc6\x02\x0b\xff\xec\x02\xc7\x01\xbc\xff\ +\xd7\x02\xc7\x02\x80\xff\xec\x02\xc7\x02\x82\xff\xec\x02\xc7\x02\ +\xb5\xff\xd7\x02\xc7\x02\xb7\xff\xec\x02\xc7\x02\xb9\xff\xec\x02\ +\xc7\x03\x0d\xff\xec\x02\xc7\x03\x0f\xff\xec\x02\xc8\x00\x05\xff\ +\xec\x02\xc8\x00\x0a\xff\xec\x02\xc8\x02\x07\xff\xec\x02\xc8\x02\ +\x0b\xff\xec\x02\xca\x01\x9f\xff\xd7\x02\xca\x01\xb8\xff\xd7\x02\ +\xca\x01\xbb\xff\xd7\x02\xca\x01\xbe\xff\xd7\x02\xca\x01\xc1\xff\ +\xd7\x02\xca\x01\xe1\xff\xd7\x02\xca\x02l\xff\xd7\x02\xca\x02\ +|\xff\xd7\x02\xca\x02~\xff\xd7\x02\xca\x02\x84\xff\xd7\x02\ +\xca\x02\x86\xff\xd7\x02\xca\x02\x88\xff\xd7\x02\xca\x02\x8a\xff\ +\xd7\x02\xca\x02\x8c\xff\xd7\x02\xca\x02\xb1\xff\xd7\x02\xca\x02\ +\xb3\xff\xd7\x02\xca\x02\xbf\xff\xd7\x02\xca\x02\xc0\xff\xd7\x02\ +\xca\x02\xc1\xff\xd7\x02\xca\x02\xc2\xff\xd7\x02\xca\x02\xc5\xff\ +\x9a\x02\xca\x02\xc7\xff\x9a\x02\xca\x02\xd4\xff\xd7\x02\xca\x02\ +\xd5\xff\xd7\x02\xca\x02\xef\xff\xd7\x02\xca\x02\xf1\xff\xd7\x02\ +\xca\x02\xf3\xff\xd7\x02\xca\x02\xfd\xff\xd7\x02\xca\x02\xfe\xff\ +\xd7\x02\xca\x03\x09\xff\xd7\x02\xca\x03\x0b\xff\xd7\x02\xca\x03\ +\x0e\xff\xd7\x02\xca\x03\x10\xff\xd7\x02\xca\x03\x15\xff\xd7\x02\ +\xca\x03\x19\xff\xec\x02\xcb\x01\xcf\xff\xd7\x02\xcb\x01\xd8\xff\ +\xd7\x02\xcb\x01\xdb\xff\xd7\x02\xcb\x01\xde\xff\xd7\x02\xcb\x01\ +\xe1\xff\xd7\x02\xcb\x01\xea\xff\xd7\x02\xcb\x01\xed\xff\xd7\x02\ +\xcb\x02j\xff\xd7\x02\xcb\x02\x7f\xff\xd7\x02\xcb\x02\x85\xff\ +\xd7\x02\xcb\x02\x87\xff\xd7\x02\xcb\x02\x89\xff\xd7\x02\xcb\x02\ +\x8d\xff\xd7\x02\xcb\x02\xb2\xff\xd7\x02\xcb\x02\xb4\xff\xd7\x02\ +\xcb\x02\xc0\xff\xd7\x02\xcb\x02\xc2\xff\xd7\x02\xcb\x02\xc6\xff\ +\xd7\x02\xcb\x02\xc8\xff\xd7\x02\xcb\x02\xd5\xff\xd7\x02\xcb\x02\ +\xe0\xff\xd7\x02\xcb\x02\xf0\xff\xd7\x02\xcb\x02\xf2\xff\xd7\x02\ +\xcb\x02\xf4\xff\xd7\x02\xcb\x02\xfe\xff\xd7\x02\xcb\x03\x0a\xff\ +\xd7\x02\xcb\x03\x0c\xff\xd7\x02\xcb\x03\x16\xff\xd7\x02\xcb\x03\ +\x1a\xff\xd7\x02\xcc\x00\x05\xff\xc3\x02\xcc\x00\x0a\xff\xc3\x02\ +\xcc\x01\xa3\x00f\x02\xcc\x01\xbc\xff\xd7\x02\xcc\x01\xbe\xff\ +\xd7\x02\xcc\x01\xc1\xff\xae\x02\xcc\x01\xdc\xff\xc3\x02\xcc\x01\ +\xe1\xff\xd7\x02\xcc\x01\xe4\xff\xc3\x02\xcc\x02\x07\xff\xc3\x02\ +\xcc\x02\x0b\xff\xc3\x02\xcc\x02m\xff\xec\x02\xcc\x02|\xff\ +\xae\x02\xcc\x02\x80\xff\xd7\x02\xcc\x02\x81\xff\xec\x02\xcc\x02\ +\x82\xff\xd7\x02\xcc\x02\x83\xff\xec\x02\xcc\x02\x8b\xff\xec\x02\ +\xcc\x02\xaa\xff\xc3\x02\xcc\x02\xb5\xff\xd7\x02\xcc\x02\xb6\xff\ +\xc3\x02\xcc\x02\xb7\xff\xd7\x02\xcc\x02\xb8\xff\xec\x02\xcc\x02\ +\xb9\xff\xd7\x02\xcc\x02\xba\xff\xec\x02\xcc\x02\xbe\xff\xc3\x02\ +\xcc\x02\xbf\xff\xae\x02\xcc\x02\xc0\xff\xd7\x02\xcc\x02\xc1\xff\ +\xae\x02\xcc\x02\xc2\xff\xd7\x02\xcc\x02\xc5\xff\xc3\x02\xcc\x02\ +\xc6\xff\xd7\x02\xcc\x02\xc7\xff\xc3\x02\xcc\x02\xc8\xff\xd7\x02\ +\xcc\x02\xd4\xff\xae\x02\xcc\x02\xd5\xff\xd7\x02\xcc\x02\xfd\xff\ +\xae\x02\xcc\x02\xfe\xff\xd7\x02\xcc\x03\x0d\xff\xd7\x02\xcc\x03\ +\x0e\xff\xc3\x02\xcc\x03\x0f\xff\xd7\x02\xcc\x03\x10\xff\xc3\x02\ +\xcc\x03\x18\xff\xc3\x02\xcd\x01\xe1\xff\xd7\x02\xcd\x02\xc0\xff\ +\xd7\x02\xcd\x02\xc2\xff\xd7\x02\xcd\x02\xd5\xff\xd7\x02\xcd\x02\ +\xfe\xff\xd7\x02\xce\x01\xa3\x00\xe1\x02\xce\x02\xea\x00)\x02\ +\xce\x03\x0e\xff\xd7\x02\xce\x03\x10\xff\xd7\x02\xcf\x00\x05\xff\ +\xec\x02\xcf\x00\x0a\xff\xec\x02\xcf\x02\x07\xff\xec\x02\xcf\x02\ +\x0b\xff\xec\x02\xd2\x01\xa3\x00\xe1\x02\xd2\x02\xea\x00)\x02\ +\xd2\x03\x0e\xff\xd7\x02\xd2\x03\x10\xff\xd7\x02\xd3\x00\x05\xff\ +\xec\x02\xd3\x00\x0a\xff\xec\x02\xd3\x02\x07\xff\xec\x02\xd3\x02\ +\x0b\xff\xec\x02\xd6\x01\xa3\x00\xe1\x02\xd6\x02\xea\x00)\x02\ +\xd6\x03\x0e\xff\xd7\x02\xd6\x03\x10\xff\xd7\x02\xd7\x00\x05\xff\ +\xec\x02\xd7\x00\x0a\xff\xec\x02\xd7\x02\x07\xff\xec\x02\xd7\x02\ +\x0b\xff\xec\x02\xd9\x00\x05\xffq\x02\xd9\x00\x0a\xffq\x02\ +\xd9\x01\x9d\xff\x9a\x02\xd9\x01\xa6\xff\x9a\x02\xd9\x01\xbc\xff\ +q\x02\xd9\x01\xbe\xff\xd7\x02\xd9\x01\xc1\xff\x9a\x02\xd9\x01\ +\xc4\xff\x9a\x02\xd9\x01\xdc\xff\xd7\x02\xd9\x01\xe1\xff\xd7\x02\ +\xd9\x01\xe4\xff\xd7\x02\xd9\x02\x07\xffq\x02\xd9\x02\x0b\xff\ +q\x02\xd9\x02n\xff\xd7\x02\xd9\x02|\xff\x9a\x02\xd9\x02\ +\x80\xff\xae\x02\xd9\x02\x82\xff\xae\x02\xd9\x02\x97\xff\xd7\x02\ +\xd9\x02\x9b\xff\xd7\x02\xd9\x02\xa7\xff\xd7\x02\xd9\x02\xa9\xff\ +\x9a\x02\xd9\x02\xaa\xff\xd7\x02\xd9\x02\xb5\xffq\x02\xd9\x02\ +\xb6\xff\xd7\x02\xd9\x02\xb7\xff\x85\x02\xd9\x02\xb9\xff\x85\x02\ +\xd9\x02\xbd\xff\x9a\x02\xd9\x02\xbe\xff\xd7\x02\xd9\x02\xbf\xff\ +\x9a\x02\xd9\x02\xc0\xff\xd7\x02\xd9\x02\xc1\xff\x9a\x02\xd9\x02\ +\xc2\xff\xd7\x02\xd9\x02\xc5\xff\x9a\x02\xd9\x02\xc7\xff\x9a\x02\ +\xd9\x02\xd4\xff\x9a\x02\xd9\x02\xd5\xff\xd7\x02\xd9\x02\xe1\xff\ +\xd7\x02\xd9\x02\xe3\xff\xd7\x02\xd9\x02\xfd\xff\x9a\x02\xd9\x02\ +\xfe\xff\xd7\x02\xd9\x03\x03\xff\xd7\x02\xd9\x03\x0d\xffq\x02\ +\xd9\x03\x0e\xff\xd7\x02\xd9\x03\x0f\xffq\x02\xd9\x03\x10\xff\ +\xd7\x02\xd9\x03\x17\xff\x9a\x02\xd9\x03\x18\xff\xd7\x02\xda\x00\ +\x05\xff\xec\x02\xda\x00\x0a\xff\xec\x02\xda\x02\x07\xff\xec\x02\ +\xda\x02\x0b\xff\xec\x02\xdb\x00\x05\xffq\x02\xdb\x00\x0a\xff\ +q\x02\xdb\x01\x9d\xff\x9a\x02\xdb\x01\xa6\xff\x9a\x02\xdb\x01\ +\xbc\xffq\x02\xdb\x01\xbe\xff\xd7\x02\xdb\x01\xc1\xff\x9a\x02\ +\xdb\x01\xc4\xff\x9a\x02\xdb\x01\xdc\xff\xd7\x02\xdb\x01\xe1\xff\ +\xd7\x02\xdb\x01\xe4\xff\xd7\x02\xdb\x02\x07\xffq\x02\xdb\x02\ +\x0b\xffq\x02\xdb\x02n\xff\xd7\x02\xdb\x02|\xff\x9a\x02\ +\xdb\x02\x80\xff\xae\x02\xdb\x02\x82\xff\xae\x02\xdb\x02\x97\xff\ +\xd7\x02\xdb\x02\x9b\xff\xd7\x02\xdb\x02\xa7\xff\xd7\x02\xdb\x02\ +\xa9\xff\x9a\x02\xdb\x02\xaa\xff\xd7\x02\xdb\x02\xb5\xffq\x02\ +\xdb\x02\xb6\xff\xd7\x02\xdb\x02\xb7\xff\x85\x02\xdb\x02\xb9\xff\ +\x85\x02\xdb\x02\xbd\xff\x9a\x02\xdb\x02\xbe\xff\xd7\x02\xdb\x02\ +\xbf\xff\x9a\x02\xdb\x02\xc0\xff\xd7\x02\xdb\x02\xc1\xff\x9a\x02\ +\xdb\x02\xc2\xff\xd7\x02\xdb\x02\xc5\xff\x9a\x02\xdb\x02\xc7\xff\ +\x9a\x02\xdb\x02\xd4\xff\x9a\x02\xdb\x02\xd5\xff\xd7\x02\xdb\x02\ +\xe1\xff\xd7\x02\xdb\x02\xe3\xff\xd7\x02\xdb\x02\xfd\xff\x9a\x02\ +\xdb\x02\xfe\xff\xd7\x02\xdb\x03\x03\xff\xd7\x02\xdb\x03\x0d\xff\ +q\x02\xdb\x03\x0e\xff\xd7\x02\xdb\x03\x0f\xffq\x02\xdb\x03\ +\x10\xff\xd7\x02\xdb\x03\x17\xff\x9a\x02\xdb\x03\x18\xff\xd7\x02\ +\xdc\x00\x05\xff\xec\x02\xdc\x00\x0a\xff\xec\x02\xdc\x02\x07\xff\ +\xec\x02\xdc\x02\x0b\xff\xec\x02\xde\x00\x05\xff\xec\x02\xde\x00\ +\x0a\xff\xec\x02\xde\x02\x07\xff\xec\x02\xde\x02\x0b\xff\xec\x02\ +\xe0\x00\x05\xff\xec\x02\xe0\x00\x0a\xff\xec\x02\xe0\x02\x07\xff\ +\xec\x02\xe0\x02\x0b\xff\xec\x02\xe1\x00\x0f\xff\xae\x02\xe1\x00\ +\x11\xff\xae\x02\xe1\x01\x9d\xff\xec\x02\xe1\x01\xa4\xff\xd7\x02\ +\xe1\x01\xa6\xff\xec\x02\xe1\x01\xa8\xff\xd7\x02\xe1\x01\xaa\xff\ +\xd7\x02\xe1\x01\xae\xff\xd7\x02\xe1\x01\xb0\xff\xd7\x02\xe1\x01\ +\xb1\xff\xec\x02\xe1\x01\xb5\xff\xd7\x02\xe1\x01\xbc\xff\xc3\x02\ +\xe1\x01\xbd\xff\xd7\x02\xe1\x01\xbf\xff\xd7\x02\xe1\x01\xc1\xff\ +\xd7\x02\xe1\x01\xc4\xff\xec\x02\xe1\x01\xc7\xff\xec\x02\xe1\x01\ +\xce\xff\xec\x02\xe1\x01\xd5\xff\xec\x02\xe1\x01\xf2\xff\xec\x02\ +\xe1\x02\x08\xff\xae\x02\xe1\x02\x0c\xff\xae\x02\xe1\x02r\xff\ +\xd7\x02\xe1\x02s\xff\xec\x02\xe1\x02z\xff\xec\x02\xe1\x02\ +|\xff\xd7\x02\xe1\x02\x80\xff\xec\x02\xe1\x02\x82\xff\xec\x02\ +\xe1\x02\x9f\xff\xd7\x02\xe1\x02\xa1\xff\xec\x02\xe1\x02\xa9\xff\ +\xec\x02\xe1\x02\xb5\xff\xc3\x02\xe1\x02\xb7\xff\xec\x02\xe1\x02\ +\xb9\xff\xec\x02\xe1\x02\xbb\xff\xd7\x02\xe1\x02\xbd\xff\xec\x02\ +\xe1\x02\xbf\xff\xd7\x02\xe1\x02\xc1\xff\xd7\x02\xe1\x02\xca\xff\ +\xd7\x02\xe1\x02\xce\xff\xd7\x02\xe1\x02\xcf\xff\xec\x02\xe1\x02\ +\xd4\xff\xd7\x02\xe1\x02\xd9\xff\xd7\x02\xe1\x02\xdb\xff\xd7\x02\ +\xe1\x02\xdd\xff\xd7\x02\xe1\x02\xe5\xff\xd7\x02\xe1\x02\xe7\xff\ +\xec\x02\xe1\x02\xf5\xff\xec\x02\xe1\x02\xf7\xff\xd7\x02\xe1\x02\ +\xf9\xff\xd7\x02\xe1\x02\xfb\xff\xd7\x02\xe1\x02\xfd\xff\xd7\x02\ +\xe1\x03\x05\xff\xd7\x02\xe1\x03\x07\xff\xd7\x02\xe1\x03\x0d\xff\ +\xd7\x02\xe1\x03\x0f\xff\xd7\x02\xe1\x03\x11\xff\xd7\x02\xe1\x03\ +\x12\xff\xec\x02\xe1\x03\x17\xff\xec\x02\xe1\x03\x1b\xff\xd7\x02\ +\xe1\x03\x1c\xff\xec\x02\xe2\x00\x05\xff\xec\x02\xe2\x00\x0a\xff\ +\xec\x02\xe2\x01\xd0\xff\xd7\x02\xe2\x01\xdc\xff\xec\x02\xe2\x01\ +\xdd\xff\xec\x02\xe2\x01\xdf\xff\xd7\x02\xe2\x01\xe1\xff\xec\x02\ +\xe2\x01\xe4\xff\xec\x02\xe2\x01\xf6\xff\xec\x02\xe2\x02\x07\xff\ +\xec\x02\xe2\x02\x0b\xff\xec\x02\xe2\x02\xa0\xff\xd7\x02\xe2\x02\ +\xaa\xff\xec\x02\xe2\x02\xb6\xff\xec\x02\xe2\x02\xbc\xff\xd7\x02\ +\xe2\x02\xbe\xff\xec\x02\xe2\x02\xc0\xff\xec\x02\xe2\x02\xc2\xff\ +\xec\x02\xe2\x02\xcb\xff\xd7\x02\xe2\x02\xd5\xff\xec\x02\xe2\x02\ +\xe6\xff\xd7\x02\xe2\x02\xf8\xff\xec\x02\xe2\x02\xfa\xff\xec\x02\ +\xe2\x02\xfc\xff\xec\x02\xe2\x02\xfe\xff\xec\x02\xe2\x03\x06\xff\ +\xd7\x02\xe2\x03\x08\xff\xd7\x02\xe2\x03\x0e\xff\xec\x02\xe2\x03\ +\x10\xff\xec\x02\xe2\x03\x18\xff\xec\x02\xe3\x00\x0f\xff\xae\x02\ +\xe3\x00\x11\xff\xae\x02\xe3\x01\x9d\xff\xec\x02\xe3\x01\xa4\xff\ +\xd7\x02\xe3\x01\xa6\xff\xec\x02\xe3\x01\xa8\xff\xd7\x02\xe3\x01\ +\xaa\xff\xd7\x02\xe3\x01\xae\xff\xd7\x02\xe3\x01\xb0\xff\xd7\x02\ +\xe3\x01\xb1\xff\xec\x02\xe3\x01\xb5\xff\xd7\x02\xe3\x01\xbc\xff\ +\xc3\x02\xe3\x01\xbd\xff\xd7\x02\xe3\x01\xbf\xff\xd7\x02\xe3\x01\ +\xc1\xff\xd7\x02\xe3\x01\xc4\xff\xec\x02\xe3\x01\xc7\xff\xec\x02\ +\xe3\x01\xce\xff\xec\x02\xe3\x01\xd5\xff\xec\x02\xe3\x01\xf2\xff\ +\xec\x02\xe3\x02\x08\xff\xae\x02\xe3\x02\x0c\xff\xae\x02\xe3\x02\ +r\xff\xd7\x02\xe3\x02s\xff\xec\x02\xe3\x02z\xff\xec\x02\ +\xe3\x02|\xff\xd7\x02\xe3\x02\x80\xff\xec\x02\xe3\x02\x82\xff\ +\xec\x02\xe3\x02\x9f\xff\xd7\x02\xe3\x02\xa1\xff\xec\x02\xe3\x02\ +\xa9\xff\xec\x02\xe3\x02\xb5\xff\xc3\x02\xe3\x02\xb7\xff\xec\x02\ +\xe3\x02\xb9\xff\xec\x02\xe3\x02\xbb\xff\xd7\x02\xe3\x02\xbd\xff\ +\xec\x02\xe3\x02\xbf\xff\xd7\x02\xe3\x02\xc1\xff\xd7\x02\xe3\x02\ +\xca\xff\xd7\x02\xe3\x02\xce\xff\xd7\x02\xe3\x02\xcf\xff\xec\x02\ +\xe3\x02\xd4\xff\xd7\x02\xe3\x02\xd9\xff\xd7\x02\xe3\x02\xdb\xff\ +\xd7\x02\xe3\x02\xdd\xff\xd7\x02\xe3\x02\xe5\xff\xd7\x02\xe3\x02\ +\xe7\xff\xec\x02\xe3\x02\xf5\xff\xec\x02\xe3\x02\xf7\xff\xd7\x02\ +\xe3\x02\xf9\xff\xd7\x02\xe3\x02\xfb\xff\xd7\x02\xe3\x02\xfd\xff\ +\xd7\x02\xe3\x03\x05\xff\xd7\x02\xe3\x03\x07\xff\xd7\x02\xe3\x03\ +\x0d\xff\xd7\x02\xe3\x03\x0f\xff\xd7\x02\xe3\x03\x11\xff\xd7\x02\ +\xe3\x03\x12\xff\xec\x02\xe3\x03\x17\xff\xec\x02\xe3\x03\x1b\xff\ +\xd7\x02\xe3\x03\x1c\xff\xec\x02\xe4\x00\x05\xff\xec\x02\xe4\x00\ +\x0a\xff\xec\x02\xe4\x01\xd0\xff\xd7\x02\xe4\x01\xdc\xff\xec\x02\ +\xe4\x01\xdd\xff\xec\x02\xe4\x01\xdf\xff\xd7\x02\xe4\x01\xe1\xff\ +\xec\x02\xe4\x01\xe4\xff\xec\x02\xe4\x01\xf6\xff\xec\x02\xe4\x02\ +\x07\xff\xec\x02\xe4\x02\x0b\xff\xec\x02\xe4\x02\xa0\xff\xd7\x02\ +\xe4\x02\xaa\xff\xec\x02\xe4\x02\xb6\xff\xec\x02\xe4\x02\xbc\xff\ +\xd7\x02\xe4\x02\xbe\xff\xec\x02\xe4\x02\xc0\xff\xec\x02\xe4\x02\ +\xc2\xff\xec\x02\xe4\x02\xcb\xff\xd7\x02\xe4\x02\xd5\xff\xec\x02\ +\xe4\x02\xe6\xff\xd7\x02\xe4\x02\xf8\xff\xec\x02\xe4\x02\xfa\xff\ +\xec\x02\xe4\x02\xfc\xff\xec\x02\xe4\x02\xfe\xff\xec\x02\xe4\x03\ +\x06\xff\xd7\x02\xe4\x03\x08\xff\xd7\x02\xe4\x03\x0e\xff\xec\x02\ +\xe4\x03\x10\xff\xec\x02\xe4\x03\x18\xff\xec\x02\xe5\x01\x9f\xff\ +\xd7\x02\xe5\x01\xb8\xff\xd7\x02\xe5\x01\xbb\xff\xd7\x02\xe5\x01\ +\xbe\xff\xd7\x02\xe5\x01\xc1\xff\xd7\x02\xe5\x01\xe1\xff\xd7\x02\ +\xe5\x02l\xff\xd7\x02\xe5\x02|\xff\xd7\x02\xe5\x02~\xff\ +\xd7\x02\xe5\x02\x84\xff\xd7\x02\xe5\x02\x86\xff\xd7\x02\xe5\x02\ +\x88\xff\xd7\x02\xe5\x02\x8a\xff\xd7\x02\xe5\x02\x8c\xff\xd7\x02\ +\xe5\x02\xb1\xff\xd7\x02\xe5\x02\xb3\xff\xd7\x02\xe5\x02\xbf\xff\ +\xd7\x02\xe5\x02\xc0\xff\xd7\x02\xe5\x02\xc1\xff\xd7\x02\xe5\x02\ +\xc2\xff\xd7\x02\xe5\x02\xc5\xff\x9a\x02\xe5\x02\xc7\xff\x9a\x02\ +\xe5\x02\xd4\xff\xd7\x02\xe5\x02\xd5\xff\xd7\x02\xe5\x02\xef\xff\ +\xd7\x02\xe5\x02\xf1\xff\xd7\x02\xe5\x02\xf3\xff\xd7\x02\xe5\x02\ +\xfd\xff\xd7\x02\xe5\x02\xfe\xff\xd7\x02\xe5\x03\x09\xff\xd7\x02\ +\xe5\x03\x0b\xff\xd7\x02\xe5\x03\x0e\xff\xd7\x02\xe5\x03\x10\xff\ +\xd7\x02\xe5\x03\x15\xff\xd7\x02\xe5\x03\x19\xff\xec\x02\xe6\x01\ +\xcf\xff\xd7\x02\xe6\x01\xd8\xff\xd7\x02\xe6\x01\xdb\xff\xd7\x02\ +\xe6\x01\xde\xff\xd7\x02\xe6\x01\xe1\xff\xd7\x02\xe6\x01\xea\xff\ +\xd7\x02\xe6\x01\xed\xff\xd7\x02\xe6\x02j\xff\xd7\x02\xe6\x02\ +\x7f\xff\xd7\x02\xe6\x02\x85\xff\xd7\x02\xe6\x02\x87\xff\xd7\x02\ +\xe6\x02\x89\xff\xd7\x02\xe6\x02\x8d\xff\xd7\x02\xe6\x02\xb2\xff\ +\xd7\x02\xe6\x02\xb4\xff\xd7\x02\xe6\x02\xc0\xff\xd7\x02\xe6\x02\ +\xc2\xff\xd7\x02\xe6\x02\xc6\xff\xd7\x02\xe6\x02\xc8\xff\xd7\x02\ +\xe6\x02\xd5\xff\xd7\x02\xe6\x02\xe0\xff\xd7\x02\xe6\x02\xf0\xff\ +\xd7\x02\xe6\x02\xf2\xff\xd7\x02\xe6\x02\xf4\xff\xd7\x02\xe6\x02\ +\xfe\xff\xd7\x02\xe6\x03\x0a\xff\xd7\x02\xe6\x03\x0c\xff\xd7\x02\ +\xe6\x03\x16\xff\xd7\x02\xe6\x03\x1a\xff\xd7\x02\xe7\x00\x0f\xff\ +\xae\x02\xe7\x00\x11\xff\xae\x02\xe7\x02\x08\xff\xae\x02\xe7\x02\ +\x0c\xff\xae\x02\xe7\x02\x80\xff\xec\x02\xe7\x02\x82\xff\xec\x02\ +\xe7\x02\xb7\xff\xec\x02\xe7\x02\xb9\xff\xec\x02\xe7\x03\x0d\xff\ +\xd7\x02\xe7\x03\x0f\xff\xd7\x02\xe8\x01\xe9\x00)\x02\xe9\x00\ +\x05\xff\xec\x02\xe9\x00\x0a\xff\xec\x02\xe9\x02\x07\xff\xec\x02\ +\xe9\x02\x0b\xff\xec\x02\xe9\x03\x0e\xff\xd7\x02\xe9\x03\x10\xff\ +\xd7\x02\xef\x00\x0f\xff\xae\x02\xef\x00\x11\xff\xae\x02\xef\x01\ +\x9d\xff\xec\x02\xef\x01\xa4\xff\xd7\x02\xef\x01\xa6\xff\xec\x02\ +\xef\x01\xa8\xff\xd7\x02\xef\x01\xaa\xff\xd7\x02\xef\x01\xae\xff\ +\xd7\x02\xef\x01\xb0\xff\xd7\x02\xef\x01\xb1\xff\xec\x02\xef\x01\ +\xb5\xff\xd7\x02\xef\x01\xbc\xff\xc3\x02\xef\x01\xbd\xff\xd7\x02\ +\xef\x01\xbf\xff\xd7\x02\xef\x01\xc1\xff\xd7\x02\xef\x01\xc4\xff\ +\xec\x02\xef\x01\xc7\xff\xec\x02\xef\x01\xce\xff\xec\x02\xef\x01\ +\xd5\xff\xec\x02\xef\x01\xf2\xff\xec\x02\xef\x02\x08\xff\xae\x02\ +\xef\x02\x0c\xff\xae\x02\xef\x02r\xff\xd7\x02\xef\x02s\xff\ +\xec\x02\xef\x02z\xff\xec\x02\xef\x02|\xff\xd7\x02\xef\x02\ +\x80\xff\xec\x02\xef\x02\x82\xff\xec\x02\xef\x02\x9f\xff\xd7\x02\ +\xef\x02\xa1\xff\xec\x02\xef\x02\xa9\xff\xec\x02\xef\x02\xb5\xff\ +\xc3\x02\xef\x02\xb7\xff\xec\x02\xef\x02\xb9\xff\xec\x02\xef\x02\ +\xbb\xff\xd7\x02\xef\x02\xbd\xff\xec\x02\xef\x02\xbf\xff\xd7\x02\ +\xef\x02\xc1\xff\xd7\x02\xef\x02\xca\xff\xd7\x02\xef\x02\xce\xff\ +\xd7\x02\xef\x02\xcf\xff\xec\x02\xef\x02\xd4\xff\xd7\x02\xef\x02\ +\xd9\xff\xd7\x02\xef\x02\xdb\xff\xd7\x02\xef\x02\xdd\xff\xd7\x02\ +\xef\x02\xe5\xff\xd7\x02\xef\x02\xe7\xff\xec\x02\xef\x02\xf5\xff\ +\xec\x02\xef\x02\xf7\xff\xd7\x02\xef\x02\xf9\xff\xd7\x02\xef\x02\ +\xfb\xff\xd7\x02\xef\x02\xfd\xff\xd7\x02\xef\x03\x05\xff\xd7\x02\ +\xef\x03\x07\xff\xd7\x02\xef\x03\x0d\xff\xd7\x02\xef\x03\x0f\xff\ +\xd7\x02\xef\x03\x11\xff\xd7\x02\xef\x03\x12\xff\xec\x02\xef\x03\ +\x17\xff\xec\x02\xef\x03\x1b\xff\xd7\x02\xef\x03\x1c\xff\xec\x02\ +\xf0\x00\x05\xff\xec\x02\xf0\x00\x0a\xff\xec\x02\xf0\x01\xd0\xff\ +\xd7\x02\xf0\x01\xdc\xff\xec\x02\xf0\x01\xdd\xff\xec\x02\xf0\x01\ +\xdf\xff\xd7\x02\xf0\x01\xe1\xff\xec\x02\xf0\x01\xe4\xff\xec\x02\ +\xf0\x01\xf6\xff\xec\x02\xf0\x02\x07\xff\xec\x02\xf0\x02\x0b\xff\ +\xec\x02\xf0\x02\xa0\xff\xd7\x02\xf0\x02\xaa\xff\xec\x02\xf0\x02\ +\xb6\xff\xec\x02\xf0\x02\xbc\xff\xd7\x02\xf0\x02\xbe\xff\xec\x02\ +\xf0\x02\xc0\xff\xec\x02\xf0\x02\xc2\xff\xec\x02\xf0\x02\xcb\xff\ +\xd7\x02\xf0\x02\xd5\xff\xec\x02\xf0\x02\xe6\xff\xd7\x02\xf0\x02\ +\xf8\xff\xec\x02\xf0\x02\xfa\xff\xec\x02\xf0\x02\xfc\xff\xec\x02\ +\xf0\x02\xfe\xff\xec\x02\xf0\x03\x06\xff\xd7\x02\xf0\x03\x08\xff\ +\xd7\x02\xf0\x03\x0e\xff\xec\x02\xf0\x03\x10\xff\xec\x02\xf0\x03\ +\x18\xff\xec\x02\xf1\x00\x0f\xff\xae\x02\xf1\x00\x11\xff\xae\x02\ +\xf1\x01\x9d\xff\xec\x02\xf1\x01\xa4\xff\xd7\x02\xf1\x01\xa6\xff\ +\xec\x02\xf1\x01\xa8\xff\xd7\x02\xf1\x01\xaa\xff\xd7\x02\xf1\x01\ +\xae\xff\xd7\x02\xf1\x01\xb0\xff\xd7\x02\xf1\x01\xb1\xff\xec\x02\ +\xf1\x01\xb5\xff\xd7\x02\xf1\x01\xbc\xff\xc3\x02\xf1\x01\xbd\xff\ +\xd7\x02\xf1\x01\xbf\xff\xd7\x02\xf1\x01\xc1\xff\xd7\x02\xf1\x01\ +\xc4\xff\xec\x02\xf1\x01\xc7\xff\xec\x02\xf1\x01\xce\xff\xec\x02\ +\xf1\x01\xd5\xff\xec\x02\xf1\x01\xf2\xff\xec\x02\xf1\x02\x08\xff\ +\xae\x02\xf1\x02\x0c\xff\xae\x02\xf1\x02r\xff\xd7\x02\xf1\x02\ +s\xff\xec\x02\xf1\x02z\xff\xec\x02\xf1\x02|\xff\xd7\x02\ +\xf1\x02\x80\xff\xec\x02\xf1\x02\x82\xff\xec\x02\xf1\x02\x9f\xff\ +\xd7\x02\xf1\x02\xa1\xff\xec\x02\xf1\x02\xa9\xff\xec\x02\xf1\x02\ +\xb5\xff\xc3\x02\xf1\x02\xb7\xff\xec\x02\xf1\x02\xb9\xff\xec\x02\ +\xf1\x02\xbb\xff\xd7\x02\xf1\x02\xbd\xff\xec\x02\xf1\x02\xbf\xff\ +\xd7\x02\xf1\x02\xc1\xff\xd7\x02\xf1\x02\xca\xff\xd7\x02\xf1\x02\ +\xce\xff\xd7\x02\xf1\x02\xcf\xff\xec\x02\xf1\x02\xd4\xff\xd7\x02\ +\xf1\x02\xd9\xff\xd7\x02\xf1\x02\xdb\xff\xd7\x02\xf1\x02\xdd\xff\ +\xd7\x02\xf1\x02\xe5\xff\xd7\x02\xf1\x02\xe7\xff\xec\x02\xf1\x02\ +\xf5\xff\xec\x02\xf1\x02\xf7\xff\xd7\x02\xf1\x02\xf9\xff\xd7\x02\ +\xf1\x02\xfb\xff\xd7\x02\xf1\x02\xfd\xff\xd7\x02\xf1\x03\x05\xff\ +\xd7\x02\xf1\x03\x07\xff\xd7\x02\xf1\x03\x0d\xff\xd7\x02\xf1\x03\ +\x0f\xff\xd7\x02\xf1\x03\x11\xff\xd7\x02\xf1\x03\x12\xff\xec\x02\ +\xf1\x03\x17\xff\xec\x02\xf1\x03\x1b\xff\xd7\x02\xf1\x03\x1c\xff\ +\xec\x02\xf2\x00\x05\xff\xec\x02\xf2\x00\x0a\xff\xec\x02\xf2\x01\ +\xd0\xff\xd7\x02\xf2\x01\xdc\xff\xec\x02\xf2\x01\xdd\xff\xec\x02\ +\xf2\x01\xdf\xff\xd7\x02\xf2\x01\xe1\xff\xec\x02\xf2\x01\xe4\xff\ +\xec\x02\xf2\x01\xf6\xff\xec\x02\xf2\x02\x07\xff\xec\x02\xf2\x02\ +\x0b\xff\xec\x02\xf2\x02\xa0\xff\xd7\x02\xf2\x02\xaa\xff\xec\x02\ +\xf2\x02\xb6\xff\xec\x02\xf2\x02\xbc\xff\xd7\x02\xf2\x02\xbe\xff\ +\xec\x02\xf2\x02\xc0\xff\xec\x02\xf2\x02\xc2\xff\xec\x02\xf2\x02\ +\xcb\xff\xd7\x02\xf2\x02\xd5\xff\xec\x02\xf2\x02\xe6\xff\xd7\x02\ +\xf2\x02\xf8\xff\xec\x02\xf2\x02\xfa\xff\xec\x02\xf2\x02\xfc\xff\ +\xec\x02\xf2\x02\xfe\xff\xec\x02\xf2\x03\x06\xff\xd7\x02\xf2\x03\ +\x08\xff\xd7\x02\xf2\x03\x0e\xff\xec\x02\xf2\x03\x10\xff\xec\x02\ +\xf2\x03\x18\xff\xec\x02\xf3\x00\x0f\xff\xae\x02\xf3\x00\x11\xff\ +\xae\x02\xf3\x01\x9d\xff\xec\x02\xf3\x01\xa4\xff\xd7\x02\xf3\x01\ +\xa6\xff\xec\x02\xf3\x01\xa8\xff\xd7\x02\xf3\x01\xaa\xff\xd7\x02\ +\xf3\x01\xae\xff\xd7\x02\xf3\x01\xb0\xff\xd7\x02\xf3\x01\xb1\xff\ +\xec\x02\xf3\x01\xb5\xff\xd7\x02\xf3\x01\xbc\xff\xc3\x02\xf3\x01\ +\xbd\xff\xd7\x02\xf3\x01\xbf\xff\xd7\x02\xf3\x01\xc1\xff\xd7\x02\ +\xf3\x01\xc4\xff\xec\x02\xf3\x01\xc7\xff\xec\x02\xf3\x01\xce\xff\ +\xec\x02\xf3\x01\xd5\xff\xec\x02\xf3\x01\xf2\xff\xec\x02\xf3\x02\ +\x08\xff\xae\x02\xf3\x02\x0c\xff\xae\x02\xf3\x02r\xff\xd7\x02\ +\xf3\x02s\xff\xec\x02\xf3\x02z\xff\xec\x02\xf3\x02|\xff\ +\xd7\x02\xf3\x02\x80\xff\xec\x02\xf3\x02\x82\xff\xec\x02\xf3\x02\ +\x9f\xff\xd7\x02\xf3\x02\xa1\xff\xec\x02\xf3\x02\xa9\xff\xec\x02\ +\xf3\x02\xb5\xff\xc3\x02\xf3\x02\xb7\xff\xec\x02\xf3\x02\xb9\xff\ +\xec\x02\xf3\x02\xbb\xff\xd7\x02\xf3\x02\xbd\xff\xec\x02\xf3\x02\ +\xbf\xff\xd7\x02\xf3\x02\xc1\xff\xd7\x02\xf3\x02\xca\xff\xd7\x02\ +\xf3\x02\xce\xff\xd7\x02\xf3\x02\xcf\xff\xec\x02\xf3\x02\xd4\xff\ +\xd7\x02\xf3\x02\xd9\xff\xd7\x02\xf3\x02\xdb\xff\xd7\x02\xf3\x02\ +\xdd\xff\xd7\x02\xf3\x02\xe5\xff\xd7\x02\xf3\x02\xe7\xff\xec\x02\ +\xf3\x02\xf5\xff\xec\x02\xf3\x02\xf7\xff\xd7\x02\xf3\x02\xf9\xff\ +\xd7\x02\xf3\x02\xfb\xff\xd7\x02\xf3\x02\xfd\xff\xd7\x02\xf3\x03\ +\x05\xff\xd7\x02\xf3\x03\x07\xff\xd7\x02\xf3\x03\x0d\xff\xd7\x02\ +\xf3\x03\x0f\xff\xd7\x02\xf3\x03\x11\xff\xd7\x02\xf3\x03\x12\xff\ +\xec\x02\xf3\x03\x17\xff\xec\x02\xf3\x03\x1b\xff\xd7\x02\xf3\x03\ +\x1c\xff\xec\x02\xf4\x00\x05\xff\xec\x02\xf4\x00\x0a\xff\xec\x02\ +\xf4\x01\xd0\xff\xd7\x02\xf4\x01\xdc\xff\xec\x02\xf4\x01\xdd\xff\ +\xec\x02\xf4\x01\xdf\xff\xd7\x02\xf4\x01\xe1\xff\xec\x02\xf4\x01\ +\xe4\xff\xec\x02\xf4\x01\xf6\xff\xec\x02\xf4\x02\x07\xff\xec\x02\ +\xf4\x02\x0b\xff\xec\x02\xf4\x02\xa0\xff\xd7\x02\xf4\x02\xaa\xff\ +\xec\x02\xf4\x02\xb6\xff\xec\x02\xf4\x02\xbc\xff\xd7\x02\xf4\x02\ +\xbe\xff\xec\x02\xf4\x02\xc0\xff\xec\x02\xf4\x02\xc2\xff\xec\x02\ +\xf4\x02\xcb\xff\xd7\x02\xf4\x02\xd5\xff\xec\x02\xf4\x02\xe6\xff\ +\xd7\x02\xf4\x02\xf8\xff\xec\x02\xf4\x02\xfa\xff\xec\x02\xf4\x02\ +\xfc\xff\xec\x02\xf4\x02\xfe\xff\xec\x02\xf4\x03\x06\xff\xd7\x02\ +\xf4\x03\x08\xff\xd7\x02\xf4\x03\x0e\xff\xec\x02\xf4\x03\x10\xff\ +\xec\x02\xf4\x03\x18\xff\xec\x02\xf5\x00\x0f\xff\xae\x02\xf5\x00\ +\x11\xff\xae\x02\xf5\x01\x9d\xff\xec\x02\xf5\x01\xa4\xff\xd7\x02\ +\xf5\x01\xa6\xff\xec\x02\xf5\x01\xa8\xff\xd7\x02\xf5\x01\xaa\xff\ +\xd7\x02\xf5\x01\xae\xff\xd7\x02\xf5\x01\xb0\xff\xd7\x02\xf5\x01\ +\xb1\xff\xec\x02\xf5\x01\xb5\xff\xd7\x02\xf5\x01\xbc\xff\xc3\x02\ +\xf5\x01\xbd\xff\xd7\x02\xf5\x01\xbf\xff\xd7\x02\xf5\x01\xc1\xff\ +\xd7\x02\xf5\x01\xc4\xff\xec\x02\xf5\x01\xc7\xff\xec\x02\xf5\x01\ +\xce\xff\xec\x02\xf5\x01\xd5\xff\xec\x02\xf5\x01\xf2\xff\xec\x02\ +\xf5\x02\x08\xff\xae\x02\xf5\x02\x0c\xff\xae\x02\xf5\x02r\xff\ +\xd7\x02\xf5\x02s\xff\xec\x02\xf5\x02z\xff\xec\x02\xf5\x02\ +|\xff\xd7\x02\xf5\x02\x80\xff\xec\x02\xf5\x02\x82\xff\xec\x02\ +\xf5\x02\x9f\xff\xd7\x02\xf5\x02\xa1\xff\xec\x02\xf5\x02\xa9\xff\ +\xec\x02\xf5\x02\xb5\xff\xc3\x02\xf5\x02\xb7\xff\xec\x02\xf5\x02\ +\xb9\xff\xec\x02\xf5\x02\xbb\xff\xd7\x02\xf5\x02\xbd\xff\xec\x02\ +\xf5\x02\xbf\xff\xd7\x02\xf5\x02\xc1\xff\xd7\x02\xf5\x02\xca\xff\ +\xd7\x02\xf5\x02\xce\xff\xd7\x02\xf5\x02\xcf\xff\xec\x02\xf5\x02\ +\xd4\xff\xd7\x02\xf5\x02\xd9\xff\xd7\x02\xf5\x02\xdb\xff\xd7\x02\ +\xf5\x02\xdd\xff\xd7\x02\xf5\x02\xe5\xff\xd7\x02\xf5\x02\xe7\xff\ +\xec\x02\xf5\x02\xf5\xff\xec\x02\xf5\x02\xf7\xff\xd7\x02\xf5\x02\ +\xf9\xff\xd7\x02\xf5\x02\xfb\xff\xd7\x02\xf5\x02\xfd\xff\xd7\x02\ +\xf5\x03\x05\xff\xd7\x02\xf5\x03\x07\xff\xd7\x02\xf5\x03\x0d\xff\ +\xd7\x02\xf5\x03\x0f\xff\xd7\x02\xf5\x03\x11\xff\xd7\x02\xf5\x03\ +\x12\xff\xec\x02\xf5\x03\x17\xff\xec\x02\xf5\x03\x1b\xff\xd7\x02\ +\xf5\x03\x1c\xff\xec\x02\xf6\x00\x05\xff\xec\x02\xf6\x00\x0a\xff\ +\xec\x02\xf6\x01\xd0\xff\xd7\x02\xf6\x01\xdc\xff\xec\x02\xf6\x01\ +\xdd\xff\xec\x02\xf6\x01\xdf\xff\xd7\x02\xf6\x01\xe1\xff\xec\x02\ +\xf6\x01\xe4\xff\xec\x02\xf6\x01\xf6\xff\xec\x02\xf6\x02\x07\xff\ +\xec\x02\xf6\x02\x0b\xff\xec\x02\xf6\x02\xa0\xff\xd7\x02\xf6\x02\ +\xaa\xff\xec\x02\xf6\x02\xb6\xff\xec\x02\xf6\x02\xbc\xff\xd7\x02\ +\xf6\x02\xbe\xff\xec\x02\xf6\x02\xc0\xff\xec\x02\xf6\x02\xc2\xff\ +\xec\x02\xf6\x02\xcb\xff\xd7\x02\xf6\x02\xd5\xff\xec\x02\xf6\x02\ +\xe6\xff\xd7\x02\xf6\x02\xf8\xff\xec\x02\xf6\x02\xfa\xff\xec\x02\ +\xf6\x02\xfc\xff\xec\x02\xf6\x02\xfe\xff\xec\x02\xf6\x03\x06\xff\ +\xd7\x02\xf6\x03\x08\xff\xd7\x02\xf6\x03\x0e\xff\xec\x02\xf6\x03\ +\x10\xff\xec\x02\xf6\x03\x18\xff\xec\x02\xf7\x00\x0f\xff\x85\x02\ +\xf7\x00\x11\xff\x85\x02\xf7\x01\x9f\xff\xec\x02\xf7\x01\xa4\xff\ +\x9a\x02\xf7\x01\xaa\xffq\x02\xf7\x01\xae\xff\x9a\x02\xf7\x01\ +\xb5\xff\x9a\x02\xf7\x01\xb8\xff\xec\x02\xf7\x01\xbb\xff\xec\x02\ +\xf7\x01\xbe\xff\xc3\x02\xf7\x01\xc9\xff\xec\x02\xf7\x01\xce\xff\ +\xae\x02\xf7\x01\xcf\xff\xd7\x02\xf7\x01\xd5\xff\xae\x02\xf7\x01\ +\xd8\xff\xd7\x02\xf7\x01\xdb\xff\xd7\x02\xf7\x01\xde\xff\xd7\x02\ +\xf7\x01\xe1\xff\xd7\x02\xf7\x01\xea\xff\xd7\x02\xf7\x01\xeb\x00\ +f\x02\xf7\x01\xed\xff\xd7\x02\xf7\x01\xee\xff\xec\x02\xf7\x01\ +\xf2\xff\xae\x02\xf7\x01\xf4\x00f\x02\xf7\x02\x08\xff\x85\x02\ +\xf7\x02\x0c\xff\x85\x02\xf7\x02j\xff\xd7\x02\xf7\x02l\xff\ +\xec\x02\xf7\x02r\xffq\x02\xf7\x02s\xff\xae\x02\xf7\x02\ +~\xff\xec\x02\xf7\x02\x7f\xff\xd7\x02\xf7\x02\x84\xff\xec\x02\ +\xf7\x02\x85\xff\xd7\x02\xf7\x02\x86\xff\xec\x02\xf7\x02\x87\xff\ +\xd7\x02\xf7\x02\x88\xff\xec\x02\xf7\x02\x89\xff\xd7\x02\xf7\x02\ +\x8a\xff\xec\x02\xf7\x02\x8c\xff\xec\x02\xf7\x02\x8d\xff\xd7\x02\ +\xf7\x02\x98\x00f\x02\xf7\x02\xa8\x00f\x02\xf7\x02\xb1\xff\ +\xec\x02\xf7\x02\xb2\xff\xd7\x02\xf7\x02\xb3\xff\xec\x02\xf7\x02\ +\xb4\xff\xd7\x02\xf7\x02\xc0\xff\xd7\x02\xf7\x02\xc2\xff\xd7\x02\ +\xf7\x02\xc5\xff\xd7\x02\xf7\x02\xc6\xff\xc3\x02\xf7\x02\xc7\xff\ +\xd7\x02\xf7\x02\xc8\xff\xc3\x02\xf7\x02\xce\xff\x9a\x02\xf7\x02\ +\xcf\xff\xae\x02\xf7\x02\xd5\xff\xd7\x02\xf7\x02\xd9\xffq\x02\ +\xf7\x02\xdb\xffq\x02\xf7\x02\xdd\xffq\x02\xf7\x02\xe0\xff\ +\xd7\x02\xf7\x02\xef\xff\xec\x02\xf7\x02\xf0\xff\xd7\x02\xf7\x02\ +\xf1\xff\xec\x02\xf7\x02\xf2\xff\xd7\x02\xf7\x02\xf3\xff\xec\x02\ +\xf7\x02\xf4\xff\xd7\x02\xf7\x02\xfe\xff\xd7\x02\xf7\x03\x09\xff\ +q\x02\xf7\x03\x0a\xff\xd7\x02\xf7\x03\x0b\xffq\x02\xf7\x03\ +\x0c\xff\xd7\x02\xf7\x03\x11\xff\x9a\x02\xf7\x03\x12\xff\xae\x02\ +\xf7\x03\x15\xff\xec\x02\xf7\x03\x16\xff\xd7\x02\xf7\x03\x1a\xff\ +\xd7\x02\xf7\x03\x1b\xff\x9a\x02\xf7\x03\x1c\xff\xae\x02\xf8\x00\ +\x0f\xff\xae\x02\xf8\x00\x11\xff\xae\x02\xf8\x01\xce\xff\xd7\x02\ +\xf8\x01\xd5\xff\xd7\x02\xf8\x01\xf2\xff\xd7\x02\xf8\x02\x08\xff\ +\xae\x02\xf8\x02\x0c\xff\xae\x02\xf8\x02s\xff\xd7\x02\xf8\x02\ +\xcf\xff\xd7\x02\xf8\x03\x12\xff\xd7\x02\xf8\x03\x1c\xff\xd7\x02\ +\xf9\x00\x0f\xff\x85\x02\xf9\x00\x11\xff\x85\x02\xf9\x01\x9f\xff\ +\xec\x02\xf9\x01\xa4\xff\x9a\x02\xf9\x01\xaa\xffq\x02\xf9\x01\ +\xae\xff\x9a\x02\xf9\x01\xb5\xff\x9a\x02\xf9\x01\xb8\xff\xec\x02\ +\xf9\x01\xbb\xff\xec\x02\xf9\x01\xbe\xff\xc3\x02\xf9\x01\xc9\xff\ +\xec\x02\xf9\x01\xce\xff\xae\x02\xf9\x01\xcf\xff\xd7\x02\xf9\x01\ +\xd5\xff\xae\x02\xf9\x01\xd8\xff\xd7\x02\xf9\x01\xdb\xff\xd7\x02\ +\xf9\x01\xde\xff\xd7\x02\xf9\x01\xe1\xff\xd7\x02\xf9\x01\xea\xff\ +\xd7\x02\xf9\x01\xeb\x00f\x02\xf9\x01\xed\xff\xd7\x02\xf9\x01\ +\xee\xff\xec\x02\xf9\x01\xf2\xff\xae\x02\xf9\x01\xf4\x00f\x02\ +\xf9\x02\x08\xff\x85\x02\xf9\x02\x0c\xff\x85\x02\xf9\x02j\xff\ +\xd7\x02\xf9\x02l\xff\xec\x02\xf9\x02r\xffq\x02\xf9\x02\ +s\xff\xae\x02\xf9\x02~\xff\xec\x02\xf9\x02\x7f\xff\xd7\x02\ +\xf9\x02\x84\xff\xec\x02\xf9\x02\x85\xff\xd7\x02\xf9\x02\x86\xff\ +\xec\x02\xf9\x02\x87\xff\xd7\x02\xf9\x02\x88\xff\xec\x02\xf9\x02\ +\x89\xff\xd7\x02\xf9\x02\x8a\xff\xec\x02\xf9\x02\x8c\xff\xec\x02\ +\xf9\x02\x8d\xff\xd7\x02\xf9\x02\x98\x00f\x02\xf9\x02\xa8\x00\ +f\x02\xf9\x02\xb1\xff\xec\x02\xf9\x02\xb2\xff\xd7\x02\xf9\x02\ +\xb3\xff\xec\x02\xf9\x02\xb4\xff\xd7\x02\xf9\x02\xc0\xff\xd7\x02\ +\xf9\x02\xc2\xff\xd7\x02\xf9\x02\xc5\xff\xd7\x02\xf9\x02\xc6\xff\ +\xc3\x02\xf9\x02\xc7\xff\xd7\x02\xf9\x02\xc8\xff\xc3\x02\xf9\x02\ +\xce\xff\x9a\x02\xf9\x02\xcf\xff\xae\x02\xf9\x02\xd5\xff\xd7\x02\ +\xf9\x02\xd9\xffq\x02\xf9\x02\xdb\xffq\x02\xf9\x02\xdd\xff\ +q\x02\xf9\x02\xe0\xff\xd7\x02\xf9\x02\xef\xff\xec\x02\xf9\x02\ +\xf0\xff\xd7\x02\xf9\x02\xf1\xff\xec\x02\xf9\x02\xf2\xff\xd7\x02\ +\xf9\x02\xf3\xff\xec\x02\xf9\x02\xf4\xff\xd7\x02\xf9\x02\xfe\xff\ +\xd7\x02\xf9\x03\x09\xffq\x02\xf9\x03\x0a\xff\xd7\x02\xf9\x03\ +\x0b\xffq\x02\xf9\x03\x0c\xff\xd7\x02\xf9\x03\x11\xff\x9a\x02\ +\xf9\x03\x12\xff\xae\x02\xf9\x03\x15\xff\xec\x02\xf9\x03\x16\xff\ +\xd7\x02\xf9\x03\x1a\xff\xd7\x02\xf9\x03\x1b\xff\x9a\x02\xf9\x03\ +\x1c\xff\xae\x02\xfa\x00\x0f\xff\xae\x02\xfa\x00\x11\xff\xae\x02\ +\xfa\x01\xce\xff\xd7\x02\xfa\x01\xd5\xff\xd7\x02\xfa\x01\xf2\xff\ +\xd7\x02\xfa\x02\x08\xff\xae\x02\xfa\x02\x0c\xff\xae\x02\xfa\x02\ +s\xff\xd7\x02\xfa\x02\xcf\xff\xd7\x02\xfa\x03\x12\xff\xd7\x02\ +\xfa\x03\x1c\xff\xd7\x02\xfb\x00\x0f\xff\x85\x02\xfb\x00\x11\xff\ +\x85\x02\xfb\x01\x9f\xff\xec\x02\xfb\x01\xa4\xff\x9a\x02\xfb\x01\ +\xaa\xffq\x02\xfb\x01\xae\xff\x9a\x02\xfb\x01\xb5\xff\x9a\x02\ +\xfb\x01\xb8\xff\xec\x02\xfb\x01\xbb\xff\xec\x02\xfb\x01\xbe\xff\ +\xc3\x02\xfb\x01\xc9\xff\xec\x02\xfb\x01\xce\xff\xae\x02\xfb\x01\ +\xcf\xff\xd7\x02\xfb\x01\xd5\xff\xae\x02\xfb\x01\xd8\xff\xd7\x02\ +\xfb\x01\xdb\xff\xd7\x02\xfb\x01\xde\xff\xd7\x02\xfb\x01\xe1\xff\ +\xd7\x02\xfb\x01\xea\xff\xd7\x02\xfb\x01\xeb\x00f\x02\xfb\x01\ +\xed\xff\xd7\x02\xfb\x01\xee\xff\xec\x02\xfb\x01\xf2\xff\xae\x02\ +\xfb\x01\xf4\x00f\x02\xfb\x02\x08\xff\x85\x02\xfb\x02\x0c\xff\ +\x85\x02\xfb\x02j\xff\xd7\x02\xfb\x02l\xff\xec\x02\xfb\x02\ +r\xffq\x02\xfb\x02s\xff\xae\x02\xfb\x02~\xff\xec\x02\ +\xfb\x02\x7f\xff\xd7\x02\xfb\x02\x84\xff\xec\x02\xfb\x02\x85\xff\ +\xd7\x02\xfb\x02\x86\xff\xec\x02\xfb\x02\x87\xff\xd7\x02\xfb\x02\ +\x88\xff\xec\x02\xfb\x02\x89\xff\xd7\x02\xfb\x02\x8a\xff\xec\x02\ +\xfb\x02\x8c\xff\xec\x02\xfb\x02\x8d\xff\xd7\x02\xfb\x02\x98\x00\ +f\x02\xfb\x02\xa8\x00f\x02\xfb\x02\xb1\xff\xec\x02\xfb\x02\ +\xb2\xff\xd7\x02\xfb\x02\xb3\xff\xec\x02\xfb\x02\xb4\xff\xd7\x02\ +\xfb\x02\xc0\xff\xd7\x02\xfb\x02\xc2\xff\xd7\x02\xfb\x02\xc5\xff\ +\xd7\x02\xfb\x02\xc6\xff\xc3\x02\xfb\x02\xc7\xff\xd7\x02\xfb\x02\ +\xc8\xff\xc3\x02\xfb\x02\xce\xff\x9a\x02\xfb\x02\xcf\xff\xae\x02\ +\xfb\x02\xd5\xff\xd7\x02\xfb\x02\xd9\xffq\x02\xfb\x02\xdb\xff\ +q\x02\xfb\x02\xdd\xffq\x02\xfb\x02\xe0\xff\xd7\x02\xfb\x02\ +\xef\xff\xec\x02\xfb\x02\xf0\xff\xd7\x02\xfb\x02\xf1\xff\xec\x02\ +\xfb\x02\xf2\xff\xd7\x02\xfb\x02\xf3\xff\xec\x02\xfb\x02\xf4\xff\ +\xd7\x02\xfb\x02\xfe\xff\xd7\x02\xfb\x03\x09\xffq\x02\xfb\x03\ +\x0a\xff\xd7\x02\xfb\x03\x0b\xffq\x02\xfb\x03\x0c\xff\xd7\x02\ +\xfb\x03\x11\xff\x9a\x02\xfb\x03\x12\xff\xae\x02\xfb\x03\x15\xff\ +\xec\x02\xfb\x03\x16\xff\xd7\x02\xfb\x03\x1a\xff\xd7\x02\xfb\x03\ +\x1b\xff\x9a\x02\xfb\x03\x1c\xff\xae\x02\xfc\x00\x0f\xff\xae\x02\ +\xfc\x00\x11\xff\xae\x02\xfc\x01\xce\xff\xd7\x02\xfc\x01\xd5\xff\ +\xd7\x02\xfc\x01\xf2\xff\xd7\x02\xfc\x02\x08\xff\xae\x02\xfc\x02\ +\x0c\xff\xae\x02\xfc\x02s\xff\xd7\x02\xfc\x02\xcf\xff\xd7\x02\ +\xfc\x03\x12\xff\xd7\x02\xfc\x03\x1c\xff\xd7\x02\xff\x00\x0f\xff\ +\x85\x02\xff\x00\x10\xff\xae\x02\xff\x00\x11\xff\x85\x02\xff\x01\ +\x9f\xff\xd7\x02\xff\x01\xa4\xff\x9a\x02\xff\x01\xaa\xffq\x02\ +\xff\x01\xae\xff\x9a\x02\xff\x01\xb5\xff\x9a\x02\xff\x01\xb8\xff\ +\xd7\x02\xff\x01\xbb\xff\xd7\x02\xff\x01\xbc\x00)\x02\xff\x01\ +\xbe\xff\xae\x02\xff\x01\xcc\xff\x9a\x02\xff\x01\xcd\xff\x9a\x02\ +\xff\x01\xce\xff\x85\x02\xff\x01\xcf\xffq\x02\xff\x01\xd0\xff\ +\xd7\x02\xff\x01\xd1\xff\xd7\x02\xff\x01\xd2\xff\x9a\x02\xff\x01\ +\xd3\xff\x9a\x02\xff\x01\xd4\xff\x9a\x02\xff\x01\xd5\xff\x85\x02\ +\xff\x01\xd6\xff\x9a\x02\xff\x01\xd7\xff\x9a\x02\xff\x01\xd8\xff\ +q\x02\xff\x01\xd9\xff\x9a\x02\xff\x01\xda\xff\x9a\x02\xff\x01\ +\xdb\xffq\x02\xff\x01\xdc\xff\xae\x02\xff\x01\xdd\xff\xae\x02\ +\xff\x01\xde\xffq\x02\xff\x01\xdf\xff\xd7\x02\xff\x01\xe0\xff\ +\x9a\x02\xff\x01\xe1\xff\x9a\x02\xff\x01\xe2\xff\x9a\x02\xff\x01\ +\xe3\xff\x9a\x02\xff\x01\xe4\xff\xae\x02\xff\x01\xe5\xff\x9a\x02\ +\xff\x01\xe6\xff\x9a\x02\xff\x01\xe7\xff\xd7\x02\xff\x01\xe8\xff\ +\x9a\x02\xff\x01\xe9\xff\xc3\x02\xff\x01\xea\xffq\x02\xff\x01\ +\xec\xff\x9a\x02\xff\x01\xed\xffq\x02\xff\x01\xee\xff\x85\x02\ +\xff\x01\xf2\xff\x85\x02\xff\x01\xf3\xff\x9a\x02\xff\x01\xf5\xff\ +\x9a\x02\xff\x01\xf6\xff\xae\x02\xff\x01\xf7\xff\x9a\x02\xff\x01\ +\xf9\xff\x9a\x02\xff\x02\x02\xff\xae\x02\xff\x02\x03\xff\xae\x02\ +\xff\x02\x04\xff\xae\x02\xff\x02\x08\xff\x85\x02\xff\x02\x0c\xff\ +\x85\x02\xff\x02j\xffq\x02\xff\x02k\xff\x9a\x02\xff\x02\ +l\xff\xd7\x02\xff\x02m\xff\xd7\x02\xff\x02q\xff\x9a\x02\ +\xff\x02r\xffq\x02\xff\x02s\xff\x85\x02\xff\x02u\xff\ +\x9a\x02\xff\x02w\xff\x9a\x02\xff\x02y\xff\x9a\x02\xff\x02\ +}\xff\x9a\x02\xff\x02~\xff\xd7\x02\xff\x02\x7f\xffq\x02\ +\xff\x02\x81\xff\xd7\x02\xff\x02\x83\xff\xd7\x02\xff\x02\x84\xff\ +\xd7\x02\xff\x02\x85\xffq\x02\xff\x02\x86\xff\xd7\x02\xff\x02\ +\x87\xffq\x02\xff\x02\x88\xff\xd7\x02\xff\x02\x89\xffq\x02\ +\xff\x02\x8a\xff\xd7\x02\xff\x02\x8b\xff\xd7\x02\xff\x02\x8c\xff\ +\xd7\x02\xff\x02\x8d\xffq\x02\xff\x02\x96\xff\x9a\x02\xff\x02\ +\x9a\xff\x9a\x02\xff\x02\x9e\xff\x9a\x02\xff\x02\xa0\xff\xd7\x02\ +\xff\x02\xa2\xff\xd7\x02\xff\x02\xa4\xff\x9a\x02\xff\x02\xa6\xff\ +\x9a\x02\xff\x02\xaa\xff\xae\x02\xff\x02\xac\xff\x9a\x02\xff\x02\ +\xae\xff\x9a\x02\xff\x02\xb0\xff\x9a\x02\xff\x02\xb1\xff\xd7\x02\ +\xff\x02\xb2\xffq\x02\xff\x02\xb3\xff\xd7\x02\xff\x02\xb4\xff\ +q\x02\xff\x02\xb5\x00)\x02\xff\x02\xb6\xff\xae\x02\xff\x02\ +\xb8\xff\xae\x02\xff\x02\xba\xff\xae\x02\xff\x02\xbc\xff\xd7\x02\ +\xff\x02\xbe\xff\xae\x02\xff\x02\xc0\xff\x9a\x02\xff\x02\xc2\xff\ +\x9a\x02\xff\x02\xc4\xff\x9a\x02\xff\x02\xc5\xff\x9a\x02\xff\x02\ +\xc6\xffq\x02\xff\x02\xc7\xff\x9a\x02\xff\x02\xc8\xffq\x02\ +\xff\x02\xcb\xff\xd7\x02\xff\x02\xcd\xff\x9a\x02\xff\x02\xce\xff\ +\x9a\x02\xff\x02\xcf\xff\x85\x02\xff\x02\xd1\xff\x9a\x02\xff\x02\ +\xd3\xff\x9a\x02\xff\x02\xd5\xff\x9a\x02\xff\x02\xd7\xff\x9a\x02\ +\xff\x02\xd9\xffq\x02\xff\x02\xdb\xffq\x02\xff\x02\xdd\xff\ +q\x02\xff\x02\xe0\xffq\x02\xff\x02\xe6\xff\xd7\x02\xff\x02\ +\xe8\xff\xd7\x02\xff\x02\xea\xff\xc3\x02\xff\x02\xec\xff\x9a\x02\ +\xff\x02\xee\xff\x9a\x02\xff\x02\xef\xff\xd7\x02\xff\x02\xf0\xff\ +q\x02\xff\x02\xf1\xff\xd7\x02\xff\x02\xf2\xffq\x02\xff\x02\ +\xf3\xff\xd7\x02\xff\x02\xf4\xffq\x02\xff\x02\xf6\xff\xd7\x02\ +\xff\x02\xf8\xff\xae\x02\xff\x02\xfa\xff\xae\x02\xff\x02\xfc\xff\ +\xae\x02\xff\x02\xfe\xff\x9a\x02\xff\x03\x00\xff\x9a\x02\xff\x03\ +\x02\xff\x9a\x02\xff\x03\x06\xff\xd7\x02\xff\x03\x08\xff\xd7\x02\ +\xff\x03\x09\xffq\x02\xff\x03\x0a\xffq\x02\xff\x03\x0b\xff\ +q\x02\xff\x03\x0c\xffq\x02\xff\x03\x0e\xff\x9a\x02\xff\x03\ +\x10\xff\x9a\x02\xff\x03\x11\xff\x9a\x02\xff\x03\x12\xff\x85\x02\ +\xff\x03\x14\xff\x9a\x02\xff\x03\x15\xff\xd7\x02\xff\x03\x16\xff\ +q\x02\xff\x03\x18\xff\xae\x02\xff\x03\x1a\xffq\x02\xff\x03\ +\x1b\xff\x9a\x02\xff\x03\x1c\xff\x85\x03\x00\x00\x0f\xff\x9a\x03\ +\x00\x00\x10\xff\xd7\x03\x00\x00\x11\xff\x9a\x03\x00\x01\xce\xff\ +\xc3\x03\x00\x01\xcf\xff\xec\x03\x00\x01\xd5\xff\xc3\x03\x00\x01\ +\xd8\xff\xec\x03\x00\x01\xdb\xff\xec\x03\x00\x01\xde\xff\xec\x03\ +\x00\x01\xea\xff\xec\x03\x00\x01\xed\xff\xec\x03\x00\x01\xf2\xff\ +\xc3\x03\x00\x02\x02\xff\xd7\x03\x00\x02\x03\xff\xd7\x03\x00\x02\ +\x04\xff\xd7\x03\x00\x02\x08\xff\x9a\x03\x00\x02\x0c\xff\x9a\x03\ +\x00\x02j\xff\xec\x03\x00\x02s\xff\xc3\x03\x00\x02\x7f\xff\ +\xec\x03\x00\x02\x85\xff\xec\x03\x00\x02\x87\xff\xec\x03\x00\x02\ +\x89\xff\xec\x03\x00\x02\x8d\xff\xec\x03\x00\x02\xb2\xff\xec\x03\ +\x00\x02\xb4\xff\xec\x03\x00\x02\xcf\xff\xc3\x03\x00\x02\xe0\xff\ +\xec\x03\x00\x02\xf0\xff\xec\x03\x00\x02\xf2\xff\xec\x03\x00\x02\ +\xf4\xff\xec\x03\x00\x03\x0a\xff\xec\x03\x00\x03\x0c\xff\xec\x03\ +\x00\x03\x12\xff\xc3\x03\x00\x03\x16\xff\xec\x03\x00\x03\x1a\xff\ +\xec\x03\x00\x03\x1c\xff\xc3\x03\x03\x00\x0f\xff\x9a\x03\x03\x00\ +\x10\xff\xd7\x03\x03\x00\x11\xff\x9a\x03\x03\x01\x9d\x00)\x03\ +\x03\x01\x9f\xff\xd7\x03\x03\x01\xa4\xff\xae\x03\x03\x01\xa6\x00\ +)\x03\x03\x01\xaa\xff\x85\x03\x03\x01\xae\xff\xae\x03\x03\x01\ +\xb5\xff\xae\x03\x03\x01\xb8\xff\xd7\x03\x03\x01\xbb\xff\xd7\x03\ +\x03\x01\xbc\x00)\x03\x03\x01\xbe\xff\xc3\x03\x03\x01\xc4\x00\ +)\x03\x03\x01\xcc\xff\xc3\x03\x03\x01\xcd\xff\xc3\x03\x03\x01\ +\xce\xff\x9a\x03\x03\x01\xcf\xff\xae\x03\x03\x01\xd0\xff\xd7\x03\ +\x03\x01\xd1\xff\xd7\x03\x03\x01\xd2\xff\xc3\x03\x03\x01\xd3\xff\ +\xc3\x03\x03\x01\xd4\xff\xc3\x03\x03\x01\xd5\xff\x9a\x03\x03\x01\ +\xd6\xff\xc3\x03\x03\x01\xd7\xff\xc3\x03\x03\x01\xd8\xff\xae\x03\ +\x03\x01\xd9\xff\xc3\x03\x03\x01\xda\xff\xc3\x03\x03\x01\xdb\xff\ +\xae\x03\x03\x01\xde\xff\xae\x03\x03\x01\xdf\xff\xd7\x03\x03\x01\ +\xe0\xff\xc3\x03\x03\x01\xe1\xff\x9a\x03\x03\x01\xe2\xff\xc3\x03\ +\x03\x01\xe3\xff\xc3\x03\x03\x01\xe5\xff\xc3\x03\x03\x01\xe6\xff\ +\xc3\x03\x03\x01\xe7\xff\xd7\x03\x03\x01\xe8\xff\xc3\x03\x03\x01\ +\xea\xff\xae\x03\x03\x01\xeb\x00)\x03\x03\x01\xec\xff\xc3\x03\ +\x03\x01\xed\xff\xae\x03\x03\x01\xee\xff\xc3\x03\x03\x01\xf2\xff\ +\x9a\x03\x03\x01\xf3\xff\xc3\x03\x03\x01\xf4\x00)\x03\x03\x01\ +\xf5\xff\xc3\x03\x03\x01\xf7\xff\xc3\x03\x03\x01\xf9\xff\xc3\x03\ +\x03\x02\x02\xff\xd7\x03\x03\x02\x03\xff\xd7\x03\x03\x02\x04\xff\ +\xd7\x03\x03\x02\x08\xff\x9a\x03\x03\x02\x0c\xff\x9a\x03\x03\x02\ +j\xff\xae\x03\x03\x02k\xff\xc3\x03\x03\x02l\xff\xd7\x03\ +\x03\x02q\xff\xc3\x03\x03\x02r\xff\x85\x03\x03\x02s\xff\ +\x9a\x03\x03\x02u\xff\xc3\x03\x03\x02w\xff\xd7\x03\x03\x02\ +y\xff\xc3\x03\x03\x02}\xff\xc3\x03\x03\x02~\xff\xd7\x03\ +\x03\x02\x7f\xff\xae\x03\x03\x02\x84\xff\xd7\x03\x03\x02\x85\xff\ +\xae\x03\x03\x02\x86\xff\xd7\x03\x03\x02\x87\xff\xae\x03\x03\x02\ +\x88\xff\xd7\x03\x03\x02\x89\xff\xae\x03\x03\x02\x8a\xff\xd7\x03\ +\x03\x02\x8c\xff\xd7\x03\x03\x02\x8d\xff\xae\x03\x03\x02\x96\xff\ +\xc3\x03\x03\x02\x98\x00)\x03\x03\x02\x9a\xff\xc3\x03\x03\x02\ +\x9e\xff\xc3\x03\x03\x02\xa0\xff\xd7\x03\x03\x02\xa2\xff\xd7\x03\ +\x03\x02\xa4\xff\xc3\x03\x03\x02\xa6\xff\xc3\x03\x03\x02\xa8\x00\ +)\x03\x03\x02\xa9\x00)\x03\x03\x02\xac\xff\xc3\x03\x03\x02\ +\xae\xff\xc3\x03\x03\x02\xb0\xff\xc3\x03\x03\x02\xb1\xff\xd7\x03\ +\x03\x02\xb2\xff\xae\x03\x03\x02\xb3\xff\xd7\x03\x03\x02\xb4\xff\ +\xae\x03\x03\x02\xb5\x00)\x03\x03\x02\xbc\xff\xd7\x03\x03\x02\ +\xbd\x00)\x03\x03\x02\xc0\xff\x9a\x03\x03\x02\xc2\xff\x9a\x03\ +\x03\x02\xc4\xff\xc3\x03\x03\x02\xc5\xff\xd7\x03\x03\x02\xc6\xff\ +\xc3\x03\x03\x02\xc7\xff\xd7\x03\x03\x02\xc8\xff\xc3\x03\x03\x02\ +\xcb\xff\xd7\x03\x03\x02\xcd\xff\xc3\x03\x03\x02\xce\xff\xae\x03\ +\x03\x02\xcf\xff\x9a\x03\x03\x02\xd1\xff\xc3\x03\x03\x02\xd3\xff\ +\xc3\x03\x03\x02\xd5\xff\x9a\x03\x03\x02\xd7\xff\xc3\x03\x03\x02\ +\xd9\xff\x85\x03\x03\x02\xdb\xff\x85\x03\x03\x02\xdd\xff\x85\x03\ +\x03\x02\xe0\xff\xae\x03\x03\x02\xe6\xff\xd7\x03\x03\x02\xe8\xff\ +\xd7\x03\x03\x02\xec\xff\xc3\x03\x03\x02\xee\xff\xc3\x03\x03\x02\ +\xef\xff\xd7\x03\x03\x02\xf0\xff\xae\x03\x03\x02\xf1\xff\xd7\x03\ +\x03\x02\xf2\xff\xae\x03\x03\x02\xf3\xff\xd7\x03\x03\x02\xf4\xff\ +\xae\x03\x03\x02\xf6\xff\xd7\x03\x03\x02\xfe\xff\x9a\x03\x03\x03\ +\x00\xff\xc3\x03\x03\x03\x02\xff\xc3\x03\x03\x03\x06\xff\xd7\x03\ +\x03\x03\x08\xff\xd7\x03\x03\x03\x09\xff\x9a\x03\x03\x03\x0a\xff\ +\xae\x03\x03\x03\x0b\xff\x9a\x03\x03\x03\x0c\xff\xae\x03\x03\x03\ +\x0e\xff\xd7\x03\x03\x03\x10\xff\xd7\x03\x03\x03\x11\xff\xae\x03\ +\x03\x03\x12\xff\x9a\x03\x03\x03\x14\xff\xc3\x03\x03\x03\x15\xff\ +\xd7\x03\x03\x03\x16\xff\xae\x03\x03\x03\x17\x00)\x03\x03\x03\ +\x1a\xff\xae\x03\x03\x03\x1b\xff\xae\x03\x03\x03\x1c\xff\x9a\x03\ +\x04\x00\x0f\xff\xc3\x03\x04\x00\x11\xff\xc3\x03\x04\x01\xce\xff\ +\xc3\x03\x04\x01\xcf\xff\xd7\x03\x04\x01\xd5\xff\xc3\x03\x04\x01\ +\xd8\xff\xd7\x03\x04\x01\xdb\xff\xd7\x03\x04\x01\xde\xff\xd7\x03\ +\x04\x01\xea\xff\xd7\x03\x04\x01\xed\xff\xd7\x03\x04\x01\xf2\xff\ +\xc3\x03\x04\x02\x08\xff\xc3\x03\x04\x02\x0c\xff\xc3\x03\x04\x02\ +j\xff\xd7\x03\x04\x02s\xff\xc3\x03\x04\x02\x7f\xff\xd7\x03\ +\x04\x02\x85\xff\xd7\x03\x04\x02\x87\xff\xd7\x03\x04\x02\x89\xff\ +\xd7\x03\x04\x02\x8d\xff\xd7\x03\x04\x02\xb2\xff\xd7\x03\x04\x02\ +\xb4\xff\xd7\x03\x04\x02\xcf\xff\xc3\x03\x04\x02\xe0\xff\xd7\x03\ +\x04\x02\xf0\xff\xd7\x03\x04\x02\xf2\xff\xd7\x03\x04\x02\xf4\xff\ +\xd7\x03\x04\x03\x0a\xff\xd7\x03\x04\x03\x0c\xff\xd7\x03\x04\x03\ +\x12\xff\xc3\x03\x04\x03\x16\xff\xd7\x03\x04\x03\x1a\xff\xd7\x03\ +\x04\x03\x1c\xff\xc3\x03\x05\x01\x9f\xff\xd7\x03\x05\x01\xa3\x00\ +\xe1\x03\x05\x01\xb8\xff\xd7\x03\x05\x01\xbb\xff\xd7\x03\x05\x01\ +\xbe\xff\xc3\x03\x05\x01\xdc\xff\xd7\x03\x05\x01\xe1\xff\xae\x03\ +\x05\x01\xe4\xff\xd7\x03\x05\x02l\xff\xd7\x03\x05\x02{\x00\ +=\x03\x05\x02}\xff\xec\x03\x05\x02~\xff\xd7\x03\x05\x02\ +\x84\xff\xd7\x03\x05\x02\x86\xff\xd7\x03\x05\x02\x88\xff\xd7\x03\ +\x05\x02\x8a\xff\xd7\x03\x05\x02\x8c\xff\xd7\x03\x05\x02\xaa\xff\ +\xd7\x03\x05\x02\xb1\xff\xd7\x03\x05\x02\xb3\xff\xd7\x03\x05\x02\ +\xb6\xff\xd7\x03\x05\x02\xbe\xff\xd7\x03\x05\x02\xc0\xff\xae\x03\ +\x05\x02\xc2\xff\xae\x03\x05\x02\xc5\xff\xc3\x03\x05\x02\xc6\xff\ +\xd7\x03\x05\x02\xc7\xff\xc3\x03\x05\x02\xc8\xff\xd7\x03\x05\x02\ +\xd5\xff\xae\x03\x05\x02\xef\xff\xd7\x03\x05\x02\xf1\xff\xd7\x03\ +\x05\x02\xf3\xff\xd7\x03\x05\x02\xfe\xff\xae\x03\x05\x03\x0e\xff\ +\xd7\x03\x05\x03\x10\xff\xd7\x03\x05\x03\x15\xff\xd7\x03\x05\x03\ +\x18\xff\xd7\x03\x06\x01\xcf\xff\xec\x03\x06\x01\xd8\xff\xec\x03\ +\x06\x01\xdb\xff\xec\x03\x06\x01\xde\xff\xec\x03\x06\x01\xe1\xff\ +\xec\x03\x06\x01\xea\xff\xec\x03\x06\x01\xed\xff\xec\x03\x06\x02\ +j\xff\xec\x03\x06\x02\x7f\xff\xec\x03\x06\x02\x85\xff\xec\x03\ +\x06\x02\x87\xff\xec\x03\x06\x02\x89\xff\xec\x03\x06\x02\x8d\xff\ +\xec\x03\x06\x02\xb2\xff\xec\x03\x06\x02\xb4\xff\xec\x03\x06\x02\ +\xc0\xff\xec\x03\x06\x02\xc2\xff\xec\x03\x06\x02\xd5\xff\xec\x03\ +\x06\x02\xe0\xff\xec\x03\x06\x02\xf0\xff\xec\x03\x06\x02\xf2\xff\ +\xec\x03\x06\x02\xf4\xff\xec\x03\x06\x02\xfe\xff\xec\x03\x06\x03\ +\x0a\xff\xec\x03\x06\x03\x0c\xff\xec\x03\x06\x03\x0e\xff\xd7\x03\ +\x06\x03\x10\xff\xd7\x03\x06\x03\x16\xff\xec\x03\x06\x03\x1a\xff\ +\xec\x03\x07\x01\x9f\xff\xd7\x03\x07\x01\xb8\xff\xd7\x03\x07\x01\ +\xbb\xff\xd7\x03\x07\x01\xbe\xff\xd7\x03\x07\x01\xc1\xff\xd7\x03\ +\x07\x01\xe1\xff\xd7\x03\x07\x02l\xff\xd7\x03\x07\x02|\xff\ +\xd7\x03\x07\x02~\xff\xd7\x03\x07\x02\x84\xff\xd7\x03\x07\x02\ +\x86\xff\xd7\x03\x07\x02\x88\xff\xd7\x03\x07\x02\x8a\xff\xd7\x03\ +\x07\x02\x8c\xff\xd7\x03\x07\x02\xb1\xff\xd7\x03\x07\x02\xb3\xff\ +\xd7\x03\x07\x02\xbf\xff\xd7\x03\x07\x02\xc0\xff\xd7\x03\x07\x02\ +\xc1\xff\xd7\x03\x07\x02\xc2\xff\xd7\x03\x07\x02\xc5\xff\x9a\x03\ +\x07\x02\xc7\xff\x9a\x03\x07\x02\xd4\xff\xd7\x03\x07\x02\xd5\xff\ +\xd7\x03\x07\x02\xef\xff\xd7\x03\x07\x02\xf1\xff\xd7\x03\x07\x02\ +\xf3\xff\xd7\x03\x07\x02\xfd\xff\xd7\x03\x07\x02\xfe\xff\xd7\x03\ +\x07\x03\x09\xff\xd7\x03\x07\x03\x0b\xff\xd7\x03\x07\x03\x0e\xff\ +\xd7\x03\x07\x03\x10\xff\xd7\x03\x07\x03\x15\xff\xd7\x03\x07\x03\ +\x19\xff\xec\x03\x08\x01\xcf\xff\xec\x03\x08\x01\xd8\xff\xec\x03\ +\x08\x01\xdb\xff\xec\x03\x08\x01\xde\xff\xec\x03\x08\x01\xe1\xff\ +\xec\x03\x08\x01\xea\xff\xec\x03\x08\x01\xed\xff\xec\x03\x08\x02\ +j\xff\xec\x03\x08\x02\x7f\xff\xec\x03\x08\x02\x85\xff\xec\x03\ +\x08\x02\x87\xff\xec\x03\x08\x02\x89\xff\xec\x03\x08\x02\x8d\xff\ +\xec\x03\x08\x02\xb2\xff\xec\x03\x08\x02\xb4\xff\xec\x03\x08\x02\ +\xc0\xff\xec\x03\x08\x02\xc2\xff\xec\x03\x08\x02\xd5\xff\xec\x03\ +\x08\x02\xe0\xff\xec\x03\x08\x02\xf0\xff\xec\x03\x08\x02\xf2\xff\ +\xec\x03\x08\x02\xf4\xff\xec\x03\x08\x02\xfe\xff\xec\x03\x08\x03\ +\x0a\xff\xec\x03\x08\x03\x0c\xff\xec\x03\x08\x03\x0e\xff\xd7\x03\ +\x08\x03\x10\xff\xd7\x03\x08\x03\x16\xff\xec\x03\x08\x03\x1a\xff\ +\xec\x03\x0b\x00\x05\xff\x9a\x03\x0b\x00\x0a\xff\x9a\x03\x0b\x01\ +\x9d\xff\xae\x03\x0b\x01\xa6\xff\xae\x03\x0b\x01\xa8\xff\xc3\x03\ +\x0b\x01\xaa\xff\xc3\x03\x0b\x01\xb0\xff\xc3\x03\x0b\x01\xbc\xff\ +q\x03\x0b\x01\xbd\xff\xc3\x03\x0b\x01\xbf\xff\xc3\x03\x0b\x01\ +\xc1\xff\xc3\x03\x0b\x01\xc4\xff\xae\x03\x0b\x01\xd0\xff\xd7\x03\ +\x0b\x01\xdc\xff\xc3\x03\x0b\x01\xdf\xff\xd7\x03\x0b\x01\xe1\xff\ +\xd7\x03\x0b\x01\xe4\xff\xc3\x03\x0b\x02\x07\xff\x9a\x03\x0b\x02\ +\x0b\xff\x9a\x03\x0b\x02r\xff\xc3\x03\x0b\x02v\xff\xd7\x03\ +\x0b\x02|\xff\xc3\x03\x0b\x02\x80\xff\xc3\x03\x0b\x02\x82\xff\ +\xc3\x03\x0b\x02\x9f\xff\xc3\x03\x0b\x02\xa0\xff\xd7\x03\x0b\x02\ +\xa9\xff\xae\x03\x0b\x02\xaa\xff\xc3\x03\x0b\x02\xb5\xffq\x03\ +\x0b\x02\xb6\xff\xc3\x03\x0b\x02\xb7\xff\xc3\x03\x0b\x02\xb9\xff\ +\xc3\x03\x0b\x02\xbb\xff\xc3\x03\x0b\x02\xbc\xff\xd7\x03\x0b\x02\ +\xbd\xff\xae\x03\x0b\x02\xbe\xff\xc3\x03\x0b\x02\xbf\xff\xc3\x03\ +\x0b\x02\xc0\xff\xd7\x03\x0b\x02\xc1\xff\xc3\x03\x0b\x02\xc2\xff\ +\xd7\x03\x0b\x02\xca\xff\xc3\x03\x0b\x02\xcb\xff\xd7\x03\x0b\x02\ +\xd4\xff\xc3\x03\x0b\x02\xd5\xff\xd7\x03\x0b\x02\xd9\xff\xc3\x03\ +\x0b\x02\xdb\xff\xc3\x03\x0b\x02\xdd\xff\xc3\x03\x0b\x02\xe5\xff\ +\xc3\x03\x0b\x02\xe6\xff\xd7\x03\x0b\x02\xf7\xff\xc3\x03\x0b\x02\ +\xf9\xff\xc3\x03\x0b\x02\xfb\xff\xc3\x03\x0b\x02\xfd\xff\xc3\x03\ +\x0b\x02\xfe\xff\xd7\x03\x0b\x03\x05\xff\xc3\x03\x0b\x03\x06\xff\ +\xd7\x03\x0b\x03\x07\xff\xc3\x03\x0b\x03\x08\xff\xd7\x03\x0b\x03\ +\x0d\xff\xd7\x03\x0b\x03\x0e\xff\xd7\x03\x0b\x03\x0f\xff\xd7\x03\ +\x0b\x03\x10\xff\xd7\x03\x0b\x03\x17\xff\xae\x03\x0b\x03\x18\xff\ +\xc3\x03\x0c\x00\x05\xff\x9a\x03\x0c\x00\x0a\xff\x9a\x03\x0c\x01\ +\xd0\xff\xd7\x03\x0c\x01\xdc\xff\xc3\x03\x0c\x01\xdd\xff\xd7\x03\ +\x0c\x01\xdf\xff\xd7\x03\x0c\x01\xe1\xff\xd7\x03\x0c\x01\xe4\xff\ +\xc3\x03\x0c\x01\xf6\xff\xd7\x03\x0c\x02\x07\xff\x9a\x03\x0c\x02\ +\x0b\xff\x9a\x03\x0c\x02\xa0\xff\xd7\x03\x0c\x02\xaa\xff\xc3\x03\ +\x0c\x02\xb6\xff\xc3\x03\x0c\x02\xbc\xff\xd7\x03\x0c\x02\xbe\xff\ +\xc3\x03\x0c\x02\xc0\xff\xd7\x03\x0c\x02\xc2\xff\xd7\x03\x0c\x02\ +\xcb\xff\xd7\x03\x0c\x02\xd5\xff\xd7\x03\x0c\x02\xe6\xff\xd7\x03\ +\x0c\x02\xf8\xff\xd7\x03\x0c\x02\xfa\xff\xd7\x03\x0c\x02\xfc\xff\ +\xd7\x03\x0c\x02\xfe\xff\xd7\x03\x0c\x03\x06\xff\xd7\x03\x0c\x03\ +\x08\xff\xd7\x03\x0c\x03\x0e\xff\x9a\x03\x0c\x03\x10\xff\x9a\x03\ +\x0c\x03\x18\xff\xc3\x03\x0d\x00\x05\xff\x9a\x03\x0d\x00\x0a\xff\ +\x9a\x03\x0d\x01\x9d\xff\xae\x03\x0d\x01\xa6\xff\xae\x03\x0d\x01\ +\xa8\xff\xc3\x03\x0d\x01\xaa\xff\xc3\x03\x0d\x01\xb0\xff\xc3\x03\ +\x0d\x01\xbc\xffq\x03\x0d\x01\xbd\xff\xc3\x03\x0d\x01\xbf\xff\ +\xc3\x03\x0d\x01\xc1\xff\xc3\x03\x0d\x01\xc4\xff\xae\x03\x0d\x01\ +\xd0\xff\xd7\x03\x0d\x01\xdc\xff\xc3\x03\x0d\x01\xdf\xff\xd7\x03\ +\x0d\x01\xe1\xff\xd7\x03\x0d\x01\xe4\xff\xc3\x03\x0d\x02\x07\xff\ +\x9a\x03\x0d\x02\x0b\xff\x9a\x03\x0d\x02r\xff\xc3\x03\x0d\x02\ +v\xff\xd7\x03\x0d\x02|\xff\xc3\x03\x0d\x02\x80\xff\xc3\x03\ +\x0d\x02\x82\xff\xc3\x03\x0d\x02\x9f\xff\xc3\x03\x0d\x02\xa0\xff\ +\xd7\x03\x0d\x02\xa9\xff\xae\x03\x0d\x02\xaa\xff\xc3\x03\x0d\x02\ +\xb5\xffq\x03\x0d\x02\xb6\xff\xc3\x03\x0d\x02\xb7\xff\xc3\x03\ +\x0d\x02\xb9\xff\xc3\x03\x0d\x02\xbb\xff\xc3\x03\x0d\x02\xbc\xff\ +\xd7\x03\x0d\x02\xbd\xff\xae\x03\x0d\x02\xbe\xff\xc3\x03\x0d\x02\ +\xbf\xff\xc3\x03\x0d\x02\xc0\xff\xd7\x03\x0d\x02\xc1\xff\xc3\x03\ +\x0d\x02\xc2\xff\xd7\x03\x0d\x02\xca\xff\xc3\x03\x0d\x02\xcb\xff\ +\xd7\x03\x0d\x02\xd4\xff\xc3\x03\x0d\x02\xd5\xff\xd7\x03\x0d\x02\ +\xd9\xff\xc3\x03\x0d\x02\xdb\xff\xc3\x03\x0d\x02\xdd\xff\xc3\x03\ +\x0d\x02\xe5\xff\xc3\x03\x0d\x02\xe6\xff\xd7\x03\x0d\x02\xf7\xff\ +\xc3\x03\x0d\x02\xf9\xff\xc3\x03\x0d\x02\xfb\xff\xc3\x03\x0d\x02\ +\xfd\xff\xc3\x03\x0d\x02\xfe\xff\xd7\x03\x0d\x03\x05\xff\xc3\x03\ +\x0d\x03\x06\xff\xd7\x03\x0d\x03\x07\xff\xc3\x03\x0d\x03\x08\xff\ +\xd7\x03\x0d\x03\x0d\xff\xd7\x03\x0d\x03\x0e\xff\xd7\x03\x0d\x03\ +\x0f\xff\xd7\x03\x0d\x03\x10\xff\xd7\x03\x0d\x03\x17\xff\xae\x03\ +\x0d\x03\x18\xff\xc3\x03\x0e\x00\x05\xff\x9a\x03\x0e\x00\x0a\xff\ +\x9a\x03\x0e\x01\xd0\xff\xd7\x03\x0e\x01\xdc\xff\xc3\x03\x0e\x01\ +\xdd\xff\xd7\x03\x0e\x01\xdf\xff\xd7\x03\x0e\x01\xe1\xff\xd7\x03\ +\x0e\x01\xe4\xff\xc3\x03\x0e\x01\xf6\xff\xd7\x03\x0e\x02\x07\xff\ +\x9a\x03\x0e\x02\x0b\xff\x9a\x03\x0e\x02\xa0\xff\xd7\x03\x0e\x02\ +\xaa\xff\xc3\x03\x0e\x02\xb6\xff\xc3\x03\x0e\x02\xbc\xff\xd7\x03\ +\x0e\x02\xbe\xff\xc3\x03\x0e\x02\xc0\xff\xd7\x03\x0e\x02\xc2\xff\ +\xd7\x03\x0e\x02\xcb\xff\xd7\x03\x0e\x02\xd5\xff\xd7\x03\x0e\x02\ +\xe6\xff\xd7\x03\x0e\x02\xf8\xff\xd7\x03\x0e\x02\xfa\xff\xd7\x03\ +\x0e\x02\xfc\xff\xd7\x03\x0e\x02\xfe\xff\xd7\x03\x0e\x03\x06\xff\ +\xd7\x03\x0e\x03\x08\xff\xd7\x03\x0e\x03\x0e\xff\x9a\x03\x0e\x03\ +\x10\xff\x9a\x03\x0e\x03\x18\xff\xc3\x03\x0f\x01\xa3\x00\xe1\x03\ +\x0f\x02\xea\x00)\x03\x0f\x03\x0e\xff\xd7\x03\x0f\x03\x10\xff\ +\xd7\x03\x10\x00\x05\xff\xec\x03\x10\x00\x0a\xff\xec\x03\x10\x02\ +\x07\xff\xec\x03\x10\x02\x0b\xff\xec\x03\x11\x00\x05\xff\x9a\x03\ +\x11\x00\x0a\xff\x9a\x03\x11\x01\x9d\xff\xae\x03\x11\x01\xa6\xff\ +\xae\x03\x11\x01\xa8\xff\xc3\x03\x11\x01\xaa\xff\xc3\x03\x11\x01\ +\xb0\xff\xc3\x03\x11\x01\xbc\xffq\x03\x11\x01\xbd\xff\xc3\x03\ +\x11\x01\xbf\xff\xc3\x03\x11\x01\xc1\xff\xc3\x03\x11\x01\xc4\xff\ +\xae\x03\x11\x01\xd0\xff\xd7\x03\x11\x01\xdc\xff\xc3\x03\x11\x01\ +\xdf\xff\xd7\x03\x11\x01\xe1\xff\xd7\x03\x11\x01\xe4\xff\xc3\x03\ +\x11\x02\x07\xff\x9a\x03\x11\x02\x0b\xff\x9a\x03\x11\x02r\xff\ +\xc3\x03\x11\x02v\xff\xd7\x03\x11\x02|\xff\xc3\x03\x11\x02\ +\x80\xff\xc3\x03\x11\x02\x82\xff\xc3\x03\x11\x02\x9f\xff\xc3\x03\ +\x11\x02\xa0\xff\xd7\x03\x11\x02\xa9\xff\xae\x03\x11\x02\xaa\xff\ +\xc3\x03\x11\x02\xb5\xffq\x03\x11\x02\xb6\xff\xc3\x03\x11\x02\ +\xb7\xff\xc3\x03\x11\x02\xb9\xff\xc3\x03\x11\x02\xbb\xff\xc3\x03\ +\x11\x02\xbc\xff\xd7\x03\x11\x02\xbd\xff\xae\x03\x11\x02\xbe\xff\ +\xc3\x03\x11\x02\xbf\xff\xc3\x03\x11\x02\xc0\xff\xd7\x03\x11\x02\ +\xc1\xff\xc3\x03\x11\x02\xc2\xff\xd7\x03\x11\x02\xca\xff\xc3\x03\ +\x11\x02\xcb\xff\xd7\x03\x11\x02\xd4\xff\xc3\x03\x11\x02\xd5\xff\ +\xd7\x03\x11\x02\xd9\xff\xc3\x03\x11\x02\xdb\xff\xc3\x03\x11\x02\ +\xdd\xff\xc3\x03\x11\x02\xe5\xff\xc3\x03\x11\x02\xe6\xff\xd7\x03\ +\x11\x02\xf7\xff\xc3\x03\x11\x02\xf9\xff\xc3\x03\x11\x02\xfb\xff\ +\xc3\x03\x11\x02\xfd\xff\xc3\x03\x11\x02\xfe\xff\xd7\x03\x11\x03\ +\x05\xff\xc3\x03\x11\x03\x06\xff\xd7\x03\x11\x03\x07\xff\xc3\x03\ +\x11\x03\x08\xff\xd7\x03\x11\x03\x0d\xff\xd7\x03\x11\x03\x0e\xff\ +\xd7\x03\x11\x03\x0f\xff\xd7\x03\x11\x03\x10\xff\xd7\x03\x11\x03\ +\x17\xff\xae\x03\x11\x03\x18\xff\xc3\x03\x12\x00\x05\xff\x9a\x03\ +\x12\x00\x0a\xff\x9a\x03\x12\x01\xd0\xff\xd7\x03\x12\x01\xdc\xff\ +\xc3\x03\x12\x01\xdd\xff\xd7\x03\x12\x01\xdf\xff\xd7\x03\x12\x01\ +\xe1\xff\xd7\x03\x12\x01\xe4\xff\xc3\x03\x12\x01\xf6\xff\xd7\x03\ +\x12\x02\x07\xff\x9a\x03\x12\x02\x0b\xff\x9a\x03\x12\x02\xa0\xff\ +\xd7\x03\x12\x02\xaa\xff\xc3\x03\x12\x02\xb6\xff\xc3\x03\x12\x02\ +\xbc\xff\xd7\x03\x12\x02\xbe\xff\xc3\x03\x12\x02\xc0\xff\xd7\x03\ +\x12\x02\xc2\xff\xd7\x03\x12\x02\xcb\xff\xd7\x03\x12\x02\xd5\xff\ +\xd7\x03\x12\x02\xe6\xff\xd7\x03\x12\x02\xf8\xff\xd7\x03\x12\x02\ +\xfa\xff\xd7\x03\x12\x02\xfc\xff\xd7\x03\x12\x02\xfe\xff\xd7\x03\ +\x12\x03\x06\xff\xd7\x03\x12\x03\x08\xff\xd7\x03\x12\x03\x0e\xff\ +\x9a\x03\x12\x03\x10\xff\x9a\x03\x12\x03\x18\xff\xc3\x03\x13\x00\ +\x05\xff\x9a\x03\x13\x00\x0a\xff\x9a\x03\x13\x01\x9d\xff\xae\x03\ +\x13\x01\xa6\xff\xae\x03\x13\x01\xa8\xff\xc3\x03\x13\x01\xaa\xff\ +\xc3\x03\x13\x01\xb0\xff\xc3\x03\x13\x01\xbc\xffq\x03\x13\x01\ +\xbd\xff\xc3\x03\x13\x01\xbf\xff\xc3\x03\x13\x01\xc1\xff\xc3\x03\ +\x13\x01\xc4\xff\xae\x03\x13\x01\xd0\xff\xd7\x03\x13\x01\xdc\xff\ +\xc3\x03\x13\x01\xdf\xff\xd7\x03\x13\x01\xe1\xff\xd7\x03\x13\x01\ +\xe4\xff\xc3\x03\x13\x02\x07\xff\x9a\x03\x13\x02\x0b\xff\x9a\x03\ +\x13\x02r\xff\xc3\x03\x13\x02v\xff\xd7\x03\x13\x02|\xff\ +\xc3\x03\x13\x02\x80\xff\xc3\x03\x13\x02\x82\xff\xc3\x03\x13\x02\ +\x9f\xff\xc3\x03\x13\x02\xa0\xff\xd7\x03\x13\x02\xa9\xff\xae\x03\ +\x13\x02\xaa\xff\xc3\x03\x13\x02\xb5\xffq\x03\x13\x02\xb6\xff\ +\xc3\x03\x13\x02\xb7\xff\xc3\x03\x13\x02\xb9\xff\xc3\x03\x13\x02\ +\xbb\xff\xc3\x03\x13\x02\xbc\xff\xd7\x03\x13\x02\xbd\xff\xae\x03\ +\x13\x02\xbe\xff\xc3\x03\x13\x02\xbf\xff\xc3\x03\x13\x02\xc0\xff\ +\xd7\x03\x13\x02\xc1\xff\xc3\x03\x13\x02\xc2\xff\xd7\x03\x13\x02\ +\xca\xff\xc3\x03\x13\x02\xcb\xff\xd7\x03\x13\x02\xd4\xff\xc3\x03\ +\x13\x02\xd5\xff\xd7\x03\x13\x02\xd9\xff\xc3\x03\x13\x02\xdb\xff\ +\xc3\x03\x13\x02\xdd\xff\xc3\x03\x13\x02\xe5\xff\xc3\x03\x13\x02\ +\xe6\xff\xd7\x03\x13\x02\xf7\xff\xc3\x03\x13\x02\xf9\xff\xc3\x03\ +\x13\x02\xfb\xff\xc3\x03\x13\x02\xfd\xff\xc3\x03\x13\x02\xfe\xff\ +\xd7\x03\x13\x03\x05\xff\xc3\x03\x13\x03\x06\xff\xd7\x03\x13\x03\ +\x07\xff\xc3\x03\x13\x03\x08\xff\xd7\x03\x13\x03\x0d\xff\xd7\x03\ +\x13\x03\x0e\xff\xd7\x03\x13\x03\x0f\xff\xd7\x03\x13\x03\x10\xff\ +\xd7\x03\x13\x03\x17\xff\xae\x03\x13\x03\x18\xff\xc3\x03\x14\x00\ +\x05\xff\x9a\x03\x14\x00\x0a\xff\x9a\x03\x14\x01\xd0\xff\xd7\x03\ +\x14\x01\xdc\xff\xc3\x03\x14\x01\xdd\xff\xd7\x03\x14\x01\xdf\xff\ +\xd7\x03\x14\x01\xe1\xff\xd7\x03\x14\x01\xe4\xff\xc3\x03\x14\x01\ +\xf6\xff\xd7\x03\x14\x02\x07\xff\x9a\x03\x14\x02\x0b\xff\x9a\x03\ +\x14\x02\xa0\xff\xd7\x03\x14\x02\xaa\xff\xc3\x03\x14\x02\xb6\xff\ +\xc3\x03\x14\x02\xbc\xff\xd7\x03\x14\x02\xbe\xff\xc3\x03\x14\x02\ +\xc0\xff\xd7\x03\x14\x02\xc2\xff\xd7\x03\x14\x02\xcb\xff\xd7\x03\ +\x14\x02\xd5\xff\xd7\x03\x14\x02\xe6\xff\xd7\x03\x14\x02\xf8\xff\ +\xd7\x03\x14\x02\xfa\xff\xd7\x03\x14\x02\xfc\xff\xd7\x03\x14\x02\ +\xfe\xff\xd7\x03\x14\x03\x06\xff\xd7\x03\x14\x03\x08\xff\xd7\x03\ +\x14\x03\x0e\xff\x9a\x03\x14\x03\x10\xff\x9a\x03\x14\x03\x18\xff\ +\xc3\x03\x15\x00\x0f\xff\xae\x03\x15\x00\x11\xff\xae\x03\x15\x01\ +\xaa\xff\xec\x03\x15\x01\xb0\xff\xd7\x03\x15\x01\xbc\xff\xd7\x03\ +\x15\x01\xbf\xff\xd7\x03\x15\x02\x08\xff\xae\x03\x15\x02\x0c\xff\ +\xae\x03\x15\x02r\xff\xec\x03\x15\x02\x80\xff\xec\x03\x15\x02\ +\x82\xff\xec\x03\x15\x02\x9f\xff\xd7\x03\x15\x02\xb5\xff\xd7\x03\ +\x15\x02\xb7\xff\xec\x03\x15\x02\xb9\xff\xec\x03\x15\x02\xbb\xff\ +\xd7\x03\x15\x02\xca\xff\xd7\x03\x15\x02\xd9\xff\xec\x03\x15\x02\ +\xdb\xff\xec\x03\x15\x02\xdd\xff\xec\x03\x15\x02\xe5\xff\xd7\x03\ +\x15\x03\x05\xff\xd7\x03\x15\x03\x07\xff\xd7\x03\x16\x00\x05\xff\ +\xd7\x03\x16\x00\x0a\xff\xd7\x03\x16\x01\xd0\xff\xec\x03\x16\x01\ +\xdd\xff\xec\x03\x16\x01\xdf\xff\xec\x03\x16\x01\xf6\xff\xec\x03\ +\x16\x02\x07\xff\xd7\x03\x16\x02\x0b\xff\xd7\x03\x16\x02\xa0\xff\ +\xec\x03\x16\x02\xbc\xff\xec\x03\x16\x02\xcb\xff\xec\x03\x16\x02\ +\xe6\xff\xec\x03\x16\x02\xf8\xff\xec\x03\x16\x02\xfa\xff\xec\x03\ +\x16\x02\xfc\xff\xec\x03\x16\x03\x06\xff\xec\x03\x16\x03\x08\xff\ +\xec\x03\x16\x03\x0e\xff\xd7\x03\x16\x03\x10\xff\xd7\x03\x17\x00\ +\x05\xff\xae\x03\x17\x00\x0a\xff\xae\x03\x17\x01\x9d\xff\xc3\x03\ +\x17\x01\xa6\xff\xc3\x03\x17\x01\xaa\xff\xd7\x03\x17\x01\xb0\xff\ +\xd7\x03\x17\x01\xbc\xff\xc3\x03\x17\x01\xbf\xff\xd7\x03\x17\x01\ +\xc1\xff\xd7\x03\x17\x01\xc4\xff\xc3\x03\x17\x01\xdc\xff\xd7\x03\ +\x17\x01\xe4\xff\xd7\x03\x17\x02\x07\xff\xae\x03\x17\x02\x0b\xff\ +\xae\x03\x17\x02r\xff\xd7\x03\x17\x02|\xff\xd7\x03\x17\x02\ +\x80\xff\xd7\x03\x17\x02\x82\xff\xd7\x03\x17\x02\x9f\xff\xd7\x03\ +\x17\x02\xa9\xff\xc3\x03\x17\x02\xaa\xff\xd7\x03\x17\x02\xb5\xff\ +\xc3\x03\x17\x02\xb6\xff\xd7\x03\x17\x02\xb7\xff\xd7\x03\x17\x02\ +\xb9\xff\xd7\x03\x17\x02\xbb\xff\xd7\x03\x17\x02\xbd\xff\xc3\x03\ +\x17\x02\xbe\xff\xd7\x03\x17\x02\xbf\xff\xd7\x03\x17\x02\xc1\xff\ +\xd7\x03\x17\x02\xca\xff\xd7\x03\x17\x02\xd4\xff\xd7\x03\x17\x02\ +\xd9\xff\xd7\x03\x17\x02\xdb\xff\xd7\x03\x17\x02\xdd\xff\xd7\x03\ +\x17\x02\xe5\xff\xd7\x03\x17\x02\xfd\xff\xd7\x03\x17\x03\x05\xff\ +\xd7\x03\x17\x03\x07\xff\xd7\x03\x17\x03\x0d\xff\xd7\x03\x17\x03\ +\x0f\xff\xd7\x03\x17\x03\x17\xff\xc3\x03\x17\x03\x18\xff\xd7\x03\ +\x18\x00\x05\xff\x9a\x03\x18\x00\x0a\xff\x9a\x03\x18\x01\xd0\xff\ +\xd7\x03\x18\x01\xdc\xff\xc3\x03\x18\x01\xdd\xff\xd7\x03\x18\x01\ +\xdf\xff\xd7\x03\x18\x01\xe1\xff\xd7\x03\x18\x01\xe4\xff\xc3\x03\ +\x18\x01\xf6\xff\xd7\x03\x18\x02\x07\xff\x9a\x03\x18\x02\x0b\xff\ +\x9a\x03\x18\x02\xa0\xff\xd7\x03\x18\x02\xaa\xff\xc3\x03\x18\x02\ +\xb6\xff\xc3\x03\x18\x02\xbc\xff\xd7\x03\x18\x02\xbe\xff\xc3\x03\ +\x18\x02\xc0\xff\xd7\x03\x18\x02\xc2\xff\xd7\x03\x18\x02\xcb\xff\ +\xd7\x03\x18\x02\xd5\xff\xd7\x03\x18\x02\xe6\xff\xd7\x03\x18\x02\ +\xf8\xff\xd7\x03\x18\x02\xfa\xff\xd7\x03\x18\x02\xfc\xff\xd7\x03\ +\x18\x02\xfe\xff\xd7\x03\x18\x03\x06\xff\xd7\x03\x18\x03\x08\xff\ +\xd7\x03\x18\x03\x0e\xff\x9a\x03\x18\x03\x10\xff\x9a\x03\x18\x03\ +\x18\xff\xc3\x03\x19\x01\xe1\xff\xd7\x03\x19\x02\xc0\xff\xd7\x03\ +\x19\x02\xc2\xff\xd7\x03\x19\x02\xd5\xff\xd7\x03\x19\x02\xfe\xff\ +\xd7\x03\x1b\x01\xa3\x00\xe1\x03\x1b\x02\xea\x00)\x03\x1b\x03\ +\x0e\xff\xd7\x03\x1b\x03\x10\xff\xd7\x03\x1c\x00\x05\xff\xec\x03\ +\x1c\x00\x0a\xff\xec\x03\x1c\x02\x07\xff\xec\x03\x1c\x02\x0b\xff\ +\xec\x03\x1d\x00\x05\xffq\x03\x1d\x00\x0a\xffq\x03\x1d\x00\ +&\xff\xd7\x03\x1d\x00*\xff\xd7\x03\x1d\x00-\x01\x0a\x03\ +\x1d\x002\xff\xd7\x03\x1d\x004\xff\xd7\x03\x1d\x007\xff\ +q\x03\x1d\x009\xff\xae\x03\x1d\x00:\xff\xae\x03\x1d\x00\ +<\xff\x85\x03\x1d\x00\x89\xff\xd7\x03\x1d\x00\x94\xff\xd7\x03\ +\x1d\x00\x95\xff\xd7\x03\x1d\x00\x96\xff\xd7\x03\x1d\x00\x97\xff\ +\xd7\x03\x1d\x00\x98\xff\xd7\x03\x1d\x00\x9a\xff\xd7\x03\x1d\x00\ +\x9f\xff\x85\x03\x1d\x00\xc8\xff\xd7\x03\x1d\x00\xca\xff\xd7\x03\ +\x1d\x00\xcc\xff\xd7\x03\x1d\x00\xce\xff\xd7\x03\x1d\x00\xde\xff\ +\xd7\x03\x1d\x00\xe0\xff\xd7\x03\x1d\x00\xe2\xff\xd7\x03\x1d\x00\ +\xe4\xff\xd7\x03\x1d\x01\x0e\xff\xd7\x03\x1d\x01\x10\xff\xd7\x03\ +\x1d\x01\x12\xff\xd7\x03\x1d\x01\x14\xff\xd7\x03\x1d\x01$\xff\ +q\x03\x1d\x01&\xffq\x03\x1d\x016\xff\xae\x03\x1d\x01\ +8\xff\x85\x03\x1d\x01:\xff\x85\x03\x1d\x01G\xff\xd7\x03\ +\x1d\x01\xfa\xff\xae\x03\x1d\x01\xfc\xff\xae\x03\x1d\x01\xfe\xff\ +\xae\x03\x1d\x02\x00\xff\x85\x03\x1d\x02\x07\xffq\x03\x1d\x02\ +\x0b\xffq\x03\x1d\x02_\xff\xd7\x03\x1d\x03I\xff\xd7\x03\ +\x1d\x03K\xff\xd7\x03\x1d\x03M\xff\xd7\x03\x1d\x03O\xff\ +\xd7\x03\x1d\x03Q\xff\xd7\x03\x1d\x03S\xff\xd7\x03\x1d\x03\ +U\xff\xd7\x03\x1d\x03W\xff\xd7\x03\x1d\x03Y\xff\xd7\x03\ +\x1d\x03[\xff\xd7\x03\x1d\x03]\xff\xd7\x03\x1d\x03_\xff\ +\xd7\x03\x1d\x03o\xff\x85\x03\x1d\x03q\xff\x85\x03\x1d\x03\ +s\xff\x85\x03\x1d\x03\x8f\xffq\x03\x1e\x00\x05\xff\xec\x03\ +\x1e\x00\x0a\xff\xec\x03\x1e\x02\x07\xff\xec\x03\x1e\x02\x0b\xff\ +\xec\x03\x1f\x00\x05\xffq\x03\x1f\x00\x0a\xffq\x03\x1f\x00\ +&\xff\xd7\x03\x1f\x00*\xff\xd7\x03\x1f\x00-\x01\x0a\x03\ +\x1f\x002\xff\xd7\x03\x1f\x004\xff\xd7\x03\x1f\x007\xff\ +q\x03\x1f\x009\xff\xae\x03\x1f\x00:\xff\xae\x03\x1f\x00\ +<\xff\x85\x03\x1f\x00\x89\xff\xd7\x03\x1f\x00\x94\xff\xd7\x03\ +\x1f\x00\x95\xff\xd7\x03\x1f\x00\x96\xff\xd7\x03\x1f\x00\x97\xff\ +\xd7\x03\x1f\x00\x98\xff\xd7\x03\x1f\x00\x9a\xff\xd7\x03\x1f\x00\ +\x9f\xff\x85\x03\x1f\x00\xc8\xff\xd7\x03\x1f\x00\xca\xff\xd7\x03\ +\x1f\x00\xcc\xff\xd7\x03\x1f\x00\xce\xff\xd7\x03\x1f\x00\xde\xff\ +\xd7\x03\x1f\x00\xe0\xff\xd7\x03\x1f\x00\xe2\xff\xd7\x03\x1f\x00\ +\xe4\xff\xd7\x03\x1f\x01\x0e\xff\xd7\x03\x1f\x01\x10\xff\xd7\x03\ +\x1f\x01\x12\xff\xd7\x03\x1f\x01\x14\xff\xd7\x03\x1f\x01$\xff\ +q\x03\x1f\x01&\xffq\x03\x1f\x016\xff\xae\x03\x1f\x01\ +8\xff\x85\x03\x1f\x01:\xff\x85\x03\x1f\x01G\xff\xd7\x03\ +\x1f\x01\xfa\xff\xae\x03\x1f\x01\xfc\xff\xae\x03\x1f\x01\xfe\xff\ +\xae\x03\x1f\x02\x00\xff\x85\x03\x1f\x02\x07\xffq\x03\x1f\x02\ +\x0b\xffq\x03\x1f\x02_\xff\xd7\x03\x1f\x03I\xff\xd7\x03\ +\x1f\x03K\xff\xd7\x03\x1f\x03M\xff\xd7\x03\x1f\x03O\xff\ +\xd7\x03\x1f\x03Q\xff\xd7\x03\x1f\x03S\xff\xd7\x03\x1f\x03\ +U\xff\xd7\x03\x1f\x03W\xff\xd7\x03\x1f\x03Y\xff\xd7\x03\ +\x1f\x03[\xff\xd7\x03\x1f\x03]\xff\xd7\x03\x1f\x03_\xff\ +\xd7\x03\x1f\x03o\xff\x85\x03\x1f\x03q\xff\x85\x03\x1f\x03\ +s\xff\x85\x03\x1f\x03\x8f\xffq\x03 \x00\x05\xff\xec\x03\ + \x00\x0a\xff\xec\x03 \x02\x07\xff\xec\x03 \x02\x0b\xff\ +\xec\x03!\x00\x05\xffq\x03!\x00\x0a\xffq\x03!\x00\ +&\xff\xd7\x03!\x00*\xff\xd7\x03!\x00-\x01\x0a\x03\ +!\x002\xff\xd7\x03!\x004\xff\xd7\x03!\x007\xff\ +q\x03!\x009\xff\xae\x03!\x00:\xff\xae\x03!\x00\ +<\xff\x85\x03!\x00\x89\xff\xd7\x03!\x00\x94\xff\xd7\x03\ +!\x00\x95\xff\xd7\x03!\x00\x96\xff\xd7\x03!\x00\x97\xff\ +\xd7\x03!\x00\x98\xff\xd7\x03!\x00\x9a\xff\xd7\x03!\x00\ +\x9f\xff\x85\x03!\x00\xc8\xff\xd7\x03!\x00\xca\xff\xd7\x03\ +!\x00\xcc\xff\xd7\x03!\x00\xce\xff\xd7\x03!\x00\xde\xff\ +\xd7\x03!\x00\xe0\xff\xd7\x03!\x00\xe2\xff\xd7\x03!\x00\ +\xe4\xff\xd7\x03!\x01\x0e\xff\xd7\x03!\x01\x10\xff\xd7\x03\ +!\x01\x12\xff\xd7\x03!\x01\x14\xff\xd7\x03!\x01$\xff\ +q\x03!\x01&\xffq\x03!\x016\xff\xae\x03!\x01\ +8\xff\x85\x03!\x01:\xff\x85\x03!\x01G\xff\xd7\x03\ +!\x01\xfa\xff\xae\x03!\x01\xfc\xff\xae\x03!\x01\xfe\xff\ +\xae\x03!\x02\x00\xff\x85\x03!\x02\x07\xffq\x03!\x02\ +\x0b\xffq\x03!\x02_\xff\xd7\x03!\x03I\xff\xd7\x03\ +!\x03K\xff\xd7\x03!\x03M\xff\xd7\x03!\x03O\xff\ +\xd7\x03!\x03Q\xff\xd7\x03!\x03S\xff\xd7\x03!\x03\ +U\xff\xd7\x03!\x03W\xff\xd7\x03!\x03Y\xff\xd7\x03\ +!\x03[\xff\xd7\x03!\x03]\xff\xd7\x03!\x03_\xff\ +\xd7\x03!\x03o\xff\x85\x03!\x03q\xff\x85\x03!\x03\ +s\xff\x85\x03!\x03\x8f\xffq\x03\x22\x00\x05\xff\xec\x03\ +\x22\x00\x0a\xff\xec\x03\x22\x02\x07\xff\xec\x03\x22\x02\x0b\xff\ +\xec\x03#\x00\x05\xffq\x03#\x00\x0a\xffq\x03#\x00\ +&\xff\xd7\x03#\x00*\xff\xd7\x03#\x00-\x01\x0a\x03\ +#\x002\xff\xd7\x03#\x004\xff\xd7\x03#\x007\xff\ +q\x03#\x009\xff\xae\x03#\x00:\xff\xae\x03#\x00\ +<\xff\x85\x03#\x00\x89\xff\xd7\x03#\x00\x94\xff\xd7\x03\ +#\x00\x95\xff\xd7\x03#\x00\x96\xff\xd7\x03#\x00\x97\xff\ +\xd7\x03#\x00\x98\xff\xd7\x03#\x00\x9a\xff\xd7\x03#\x00\ +\x9f\xff\x85\x03#\x00\xc8\xff\xd7\x03#\x00\xca\xff\xd7\x03\ +#\x00\xcc\xff\xd7\x03#\x00\xce\xff\xd7\x03#\x00\xde\xff\ +\xd7\x03#\x00\xe0\xff\xd7\x03#\x00\xe2\xff\xd7\x03#\x00\ +\xe4\xff\xd7\x03#\x01\x0e\xff\xd7\x03#\x01\x10\xff\xd7\x03\ +#\x01\x12\xff\xd7\x03#\x01\x14\xff\xd7\x03#\x01$\xff\ +q\x03#\x01&\xffq\x03#\x016\xff\xae\x03#\x01\ +8\xff\x85\x03#\x01:\xff\x85\x03#\x01G\xff\xd7\x03\ +#\x01\xfa\xff\xae\x03#\x01\xfc\xff\xae\x03#\x01\xfe\xff\ +\xae\x03#\x02\x00\xff\x85\x03#\x02\x07\xffq\x03#\x02\ +\x0b\xffq\x03#\x02_\xff\xd7\x03#\x03I\xff\xd7\x03\ +#\x03K\xff\xd7\x03#\x03M\xff\xd7\x03#\x03O\xff\ +\xd7\x03#\x03Q\xff\xd7\x03#\x03S\xff\xd7\x03#\x03\ +U\xff\xd7\x03#\x03W\xff\xd7\x03#\x03Y\xff\xd7\x03\ +#\x03[\xff\xd7\x03#\x03]\xff\xd7\x03#\x03_\xff\ +\xd7\x03#\x03o\xff\x85\x03#\x03q\xff\x85\x03#\x03\ +s\xff\x85\x03#\x03\x8f\xffq\x03$\x00\x05\xff\xec\x03\ +$\x00\x0a\xff\xec\x03$\x02\x07\xff\xec\x03$\x02\x0b\xff\ +\xec\x03%\x00\x05\xffq\x03%\x00\x0a\xffq\x03%\x00\ +&\xff\xd7\x03%\x00*\xff\xd7\x03%\x00-\x01\x0a\x03\ +%\x002\xff\xd7\x03%\x004\xff\xd7\x03%\x007\xff\ +q\x03%\x009\xff\xae\x03%\x00:\xff\xae\x03%\x00\ +<\xff\x85\x03%\x00\x89\xff\xd7\x03%\x00\x94\xff\xd7\x03\ +%\x00\x95\xff\xd7\x03%\x00\x96\xff\xd7\x03%\x00\x97\xff\ +\xd7\x03%\x00\x98\xff\xd7\x03%\x00\x9a\xff\xd7\x03%\x00\ +\x9f\xff\x85\x03%\x00\xc8\xff\xd7\x03%\x00\xca\xff\xd7\x03\ +%\x00\xcc\xff\xd7\x03%\x00\xce\xff\xd7\x03%\x00\xde\xff\ +\xd7\x03%\x00\xe0\xff\xd7\x03%\x00\xe2\xff\xd7\x03%\x00\ +\xe4\xff\xd7\x03%\x01\x0e\xff\xd7\x03%\x01\x10\xff\xd7\x03\ +%\x01\x12\xff\xd7\x03%\x01\x14\xff\xd7\x03%\x01$\xff\ +q\x03%\x01&\xffq\x03%\x016\xff\xae\x03%\x01\ +8\xff\x85\x03%\x01:\xff\x85\x03%\x01G\xff\xd7\x03\ +%\x01\xfa\xff\xae\x03%\x01\xfc\xff\xae\x03%\x01\xfe\xff\ +\xae\x03%\x02\x00\xff\x85\x03%\x02\x07\xffq\x03%\x02\ +\x0b\xffq\x03%\x02_\xff\xd7\x03%\x03I\xff\xd7\x03\ +%\x03K\xff\xd7\x03%\x03M\xff\xd7\x03%\x03O\xff\ +\xd7\x03%\x03Q\xff\xd7\x03%\x03S\xff\xd7\x03%\x03\ +U\xff\xd7\x03%\x03W\xff\xd7\x03%\x03Y\xff\xd7\x03\ +%\x03[\xff\xd7\x03%\x03]\xff\xd7\x03%\x03_\xff\ +\xd7\x03%\x03o\xff\x85\x03%\x03q\xff\x85\x03%\x03\ +s\xff\x85\x03%\x03\x8f\xffq\x03&\x00\x05\xff\xec\x03\ +&\x00\x0a\xff\xec\x03&\x02\x07\xff\xec\x03&\x02\x0b\xff\ +\xec\x03'\x00\x05\xffq\x03'\x00\x0a\xffq\x03'\x00\ +&\xff\xd7\x03'\x00*\xff\xd7\x03'\x00-\x01\x0a\x03\ +'\x002\xff\xd7\x03'\x004\xff\xd7\x03'\x007\xff\ +q\x03'\x009\xff\xae\x03'\x00:\xff\xae\x03'\x00\ +<\xff\x85\x03'\x00\x89\xff\xd7\x03'\x00\x94\xff\xd7\x03\ +'\x00\x95\xff\xd7\x03'\x00\x96\xff\xd7\x03'\x00\x97\xff\ +\xd7\x03'\x00\x98\xff\xd7\x03'\x00\x9a\xff\xd7\x03'\x00\ +\x9f\xff\x85\x03'\x00\xc8\xff\xd7\x03'\x00\xca\xff\xd7\x03\ +'\x00\xcc\xff\xd7\x03'\x00\xce\xff\xd7\x03'\x00\xde\xff\ +\xd7\x03'\x00\xe0\xff\xd7\x03'\x00\xe2\xff\xd7\x03'\x00\ +\xe4\xff\xd7\x03'\x01\x0e\xff\xd7\x03'\x01\x10\xff\xd7\x03\ +'\x01\x12\xff\xd7\x03'\x01\x14\xff\xd7\x03'\x01$\xff\ +q\x03'\x01&\xffq\x03'\x016\xff\xae\x03'\x01\ +8\xff\x85\x03'\x01:\xff\x85\x03'\x01G\xff\xd7\x03\ +'\x01\xfa\xff\xae\x03'\x01\xfc\xff\xae\x03'\x01\xfe\xff\ +\xae\x03'\x02\x00\xff\x85\x03'\x02\x07\xffq\x03'\x02\ +\x0b\xffq\x03'\x02_\xff\xd7\x03'\x03I\xff\xd7\x03\ +'\x03K\xff\xd7\x03'\x03M\xff\xd7\x03'\x03O\xff\ +\xd7\x03'\x03Q\xff\xd7\x03'\x03S\xff\xd7\x03'\x03\ +U\xff\xd7\x03'\x03W\xff\xd7\x03'\x03Y\xff\xd7\x03\ +'\x03[\xff\xd7\x03'\x03]\xff\xd7\x03'\x03_\xff\ +\xd7\x03'\x03o\xff\x85\x03'\x03q\xff\x85\x03'\x03\ +s\xff\x85\x03'\x03\x8f\xffq\x03(\x00\x05\xff\xec\x03\ +(\x00\x0a\xff\xec\x03(\x02\x07\xff\xec\x03(\x02\x0b\xff\ +\xec\x03)\x00\x05\xffq\x03)\x00\x0a\xffq\x03)\x00\ +&\xff\xd7\x03)\x00*\xff\xd7\x03)\x00-\x01\x0a\x03\ +)\x002\xff\xd7\x03)\x004\xff\xd7\x03)\x007\xff\ +q\x03)\x009\xff\xae\x03)\x00:\xff\xae\x03)\x00\ +<\xff\x85\x03)\x00\x89\xff\xd7\x03)\x00\x94\xff\xd7\x03\ +)\x00\x95\xff\xd7\x03)\x00\x96\xff\xd7\x03)\x00\x97\xff\ +\xd7\x03)\x00\x98\xff\xd7\x03)\x00\x9a\xff\xd7\x03)\x00\ +\x9f\xff\x85\x03)\x00\xc8\xff\xd7\x03)\x00\xca\xff\xd7\x03\ +)\x00\xcc\xff\xd7\x03)\x00\xce\xff\xd7\x03)\x00\xde\xff\ +\xd7\x03)\x00\xe0\xff\xd7\x03)\x00\xe2\xff\xd7\x03)\x00\ +\xe4\xff\xd7\x03)\x01\x0e\xff\xd7\x03)\x01\x10\xff\xd7\x03\ +)\x01\x12\xff\xd7\x03)\x01\x14\xff\xd7\x03)\x01$\xff\ +q\x03)\x01&\xffq\x03)\x016\xff\xae\x03)\x01\ +8\xff\x85\x03)\x01:\xff\x85\x03)\x01G\xff\xd7\x03\ +)\x01\xfa\xff\xae\x03)\x01\xfc\xff\xae\x03)\x01\xfe\xff\ +\xae\x03)\x02\x00\xff\x85\x03)\x02\x07\xffq\x03)\x02\ +\x0b\xffq\x03)\x02_\xff\xd7\x03)\x03I\xff\xd7\x03\ +)\x03K\xff\xd7\x03)\x03M\xff\xd7\x03)\x03O\xff\ +\xd7\x03)\x03Q\xff\xd7\x03)\x03S\xff\xd7\x03)\x03\ +U\xff\xd7\x03)\x03W\xff\xd7\x03)\x03Y\xff\xd7\x03\ +)\x03[\xff\xd7\x03)\x03]\xff\xd7\x03)\x03_\xff\ +\xd7\x03)\x03o\xff\x85\x03)\x03q\xff\x85\x03)\x03\ +s\xff\x85\x03)\x03\x8f\xffq\x03*\x00\x05\xff\xec\x03\ +*\x00\x0a\xff\xec\x03*\x02\x07\xff\xec\x03*\x02\x0b\xff\ +\xec\x03+\x00\x05\xffq\x03+\x00\x0a\xffq\x03+\x00\ +&\xff\xd7\x03+\x00*\xff\xd7\x03+\x00-\x01\x0a\x03\ ++\x002\xff\xd7\x03+\x004\xff\xd7\x03+\x007\xff\ +q\x03+\x009\xff\xae\x03+\x00:\xff\xae\x03+\x00\ +<\xff\x85\x03+\x00\x89\xff\xd7\x03+\x00\x94\xff\xd7\x03\ ++\x00\x95\xff\xd7\x03+\x00\x96\xff\xd7\x03+\x00\x97\xff\ +\xd7\x03+\x00\x98\xff\xd7\x03+\x00\x9a\xff\xd7\x03+\x00\ +\x9f\xff\x85\x03+\x00\xc8\xff\xd7\x03+\x00\xca\xff\xd7\x03\ ++\x00\xcc\xff\xd7\x03+\x00\xce\xff\xd7\x03+\x00\xde\xff\ +\xd7\x03+\x00\xe0\xff\xd7\x03+\x00\xe2\xff\xd7\x03+\x00\ +\xe4\xff\xd7\x03+\x01\x0e\xff\xd7\x03+\x01\x10\xff\xd7\x03\ ++\x01\x12\xff\xd7\x03+\x01\x14\xff\xd7\x03+\x01$\xff\ +q\x03+\x01&\xffq\x03+\x016\xff\xae\x03+\x01\ +8\xff\x85\x03+\x01:\xff\x85\x03+\x01G\xff\xd7\x03\ ++\x01\xfa\xff\xae\x03+\x01\xfc\xff\xae\x03+\x01\xfe\xff\ +\xae\x03+\x02\x00\xff\x85\x03+\x02\x07\xffq\x03+\x02\ +\x0b\xffq\x03+\x02_\xff\xd7\x03+\x03I\xff\xd7\x03\ ++\x03K\xff\xd7\x03+\x03M\xff\xd7\x03+\x03O\xff\ +\xd7\x03+\x03Q\xff\xd7\x03+\x03S\xff\xd7\x03+\x03\ +U\xff\xd7\x03+\x03W\xff\xd7\x03+\x03Y\xff\xd7\x03\ ++\x03[\xff\xd7\x03+\x03]\xff\xd7\x03+\x03_\xff\ +\xd7\x03+\x03o\xff\x85\x03+\x03q\xff\x85\x03+\x03\ +s\xff\x85\x03+\x03\x8f\xffq\x03,\x00\x05\xff\xec\x03\ +,\x00\x0a\xff\xec\x03,\x02\x07\xff\xec\x03,\x02\x0b\xff\ +\xec\x03-\x00\x05\xffq\x03-\x00\x0a\xffq\x03-\x00\ +&\xff\xd7\x03-\x00*\xff\xd7\x03-\x00-\x01\x0a\x03\ +-\x002\xff\xd7\x03-\x004\xff\xd7\x03-\x007\xff\ +q\x03-\x009\xff\xae\x03-\x00:\xff\xae\x03-\x00\ +<\xff\x85\x03-\x00\x89\xff\xd7\x03-\x00\x94\xff\xd7\x03\ +-\x00\x95\xff\xd7\x03-\x00\x96\xff\xd7\x03-\x00\x97\xff\ +\xd7\x03-\x00\x98\xff\xd7\x03-\x00\x9a\xff\xd7\x03-\x00\ +\x9f\xff\x85\x03-\x00\xc8\xff\xd7\x03-\x00\xca\xff\xd7\x03\ +-\x00\xcc\xff\xd7\x03-\x00\xce\xff\xd7\x03-\x00\xde\xff\ +\xd7\x03-\x00\xe0\xff\xd7\x03-\x00\xe2\xff\xd7\x03-\x00\ +\xe4\xff\xd7\x03-\x01\x0e\xff\xd7\x03-\x01\x10\xff\xd7\x03\ +-\x01\x12\xff\xd7\x03-\x01\x14\xff\xd7\x03-\x01$\xff\ +q\x03-\x01&\xffq\x03-\x016\xff\xae\x03-\x01\ +8\xff\x85\x03-\x01:\xff\x85\x03-\x01G\xff\xd7\x03\ +-\x01\xfa\xff\xae\x03-\x01\xfc\xff\xae\x03-\x01\xfe\xff\ +\xae\x03-\x02\x00\xff\x85\x03-\x02\x07\xffq\x03-\x02\ +\x0b\xffq\x03-\x02_\xff\xd7\x03-\x03I\xff\xd7\x03\ +-\x03K\xff\xd7\x03-\x03M\xff\xd7\x03-\x03O\xff\ +\xd7\x03-\x03Q\xff\xd7\x03-\x03S\xff\xd7\x03-\x03\ +U\xff\xd7\x03-\x03W\xff\xd7\x03-\x03Y\xff\xd7\x03\ +-\x03[\xff\xd7\x03-\x03]\xff\xd7\x03-\x03_\xff\ +\xd7\x03-\x03o\xff\x85\x03-\x03q\xff\x85\x03-\x03\ +s\xff\x85\x03-\x03\x8f\xffq\x03.\x00\x05\xff\xec\x03\ +.\x00\x0a\xff\xec\x03.\x02\x07\xff\xec\x03.\x02\x0b\xff\ +\xec\x03/\x00\x05\xffq\x03/\x00\x0a\xffq\x03/\x00\ +&\xff\xd7\x03/\x00*\xff\xd7\x03/\x00-\x01\x0a\x03\ +/\x002\xff\xd7\x03/\x004\xff\xd7\x03/\x007\xff\ +q\x03/\x009\xff\xae\x03/\x00:\xff\xae\x03/\x00\ +<\xff\x85\x03/\x00\x89\xff\xd7\x03/\x00\x94\xff\xd7\x03\ +/\x00\x95\xff\xd7\x03/\x00\x96\xff\xd7\x03/\x00\x97\xff\ +\xd7\x03/\x00\x98\xff\xd7\x03/\x00\x9a\xff\xd7\x03/\x00\ +\x9f\xff\x85\x03/\x00\xc8\xff\xd7\x03/\x00\xca\xff\xd7\x03\ +/\x00\xcc\xff\xd7\x03/\x00\xce\xff\xd7\x03/\x00\xde\xff\ +\xd7\x03/\x00\xe0\xff\xd7\x03/\x00\xe2\xff\xd7\x03/\x00\ +\xe4\xff\xd7\x03/\x01\x0e\xff\xd7\x03/\x01\x10\xff\xd7\x03\ +/\x01\x12\xff\xd7\x03/\x01\x14\xff\xd7\x03/\x01$\xff\ +q\x03/\x01&\xffq\x03/\x016\xff\xae\x03/\x01\ +8\xff\x85\x03/\x01:\xff\x85\x03/\x01G\xff\xd7\x03\ +/\x01\xfa\xff\xae\x03/\x01\xfc\xff\xae\x03/\x01\xfe\xff\ +\xae\x03/\x02\x00\xff\x85\x03/\x02\x07\xffq\x03/\x02\ +\x0b\xffq\x03/\x02_\xff\xd7\x03/\x03I\xff\xd7\x03\ +/\x03K\xff\xd7\x03/\x03M\xff\xd7\x03/\x03O\xff\ +\xd7\x03/\x03Q\xff\xd7\x03/\x03S\xff\xd7\x03/\x03\ +U\xff\xd7\x03/\x03W\xff\xd7\x03/\x03Y\xff\xd7\x03\ +/\x03[\xff\xd7\x03/\x03]\xff\xd7\x03/\x03_\xff\ +\xd7\x03/\x03o\xff\x85\x03/\x03q\xff\x85\x03/\x03\ +s\xff\x85\x03/\x03\x8f\xffq\x030\x00\x05\xff\xec\x03\ +0\x00\x0a\xff\xec\x030\x02\x07\xff\xec\x030\x02\x0b\xff\ +\xec\x031\x00\x05\xffq\x031\x00\x0a\xffq\x031\x00\ +&\xff\xd7\x031\x00*\xff\xd7\x031\x00-\x01\x0a\x03\ +1\x002\xff\xd7\x031\x004\xff\xd7\x031\x007\xff\ +q\x031\x009\xff\xae\x031\x00:\xff\xae\x031\x00\ +<\xff\x85\x031\x00\x89\xff\xd7\x031\x00\x94\xff\xd7\x03\ +1\x00\x95\xff\xd7\x031\x00\x96\xff\xd7\x031\x00\x97\xff\ +\xd7\x031\x00\x98\xff\xd7\x031\x00\x9a\xff\xd7\x031\x00\ +\x9f\xff\x85\x031\x00\xc8\xff\xd7\x031\x00\xca\xff\xd7\x03\ +1\x00\xcc\xff\xd7\x031\x00\xce\xff\xd7\x031\x00\xde\xff\ +\xd7\x031\x00\xe0\xff\xd7\x031\x00\xe2\xff\xd7\x031\x00\ +\xe4\xff\xd7\x031\x01\x0e\xff\xd7\x031\x01\x10\xff\xd7\x03\ +1\x01\x12\xff\xd7\x031\x01\x14\xff\xd7\x031\x01$\xff\ +q\x031\x01&\xffq\x031\x016\xff\xae\x031\x01\ +8\xff\x85\x031\x01:\xff\x85\x031\x01G\xff\xd7\x03\ +1\x01\xfa\xff\xae\x031\x01\xfc\xff\xae\x031\x01\xfe\xff\ +\xae\x031\x02\x00\xff\x85\x031\x02\x07\xffq\x031\x02\ +\x0b\xffq\x031\x02_\xff\xd7\x031\x03I\xff\xd7\x03\ +1\x03K\xff\xd7\x031\x03M\xff\xd7\x031\x03O\xff\ +\xd7\x031\x03Q\xff\xd7\x031\x03S\xff\xd7\x031\x03\ +U\xff\xd7\x031\x03W\xff\xd7\x031\x03Y\xff\xd7\x03\ +1\x03[\xff\xd7\x031\x03]\xff\xd7\x031\x03_\xff\ +\xd7\x031\x03o\xff\x85\x031\x03q\xff\x85\x031\x03\ +s\xff\x85\x031\x03\x8f\xffq\x032\x00\x05\xff\xec\x03\ +2\x00\x0a\xff\xec\x032\x02\x07\xff\xec\x032\x02\x0b\xff\ +\xec\x033\x00\x05\xffq\x033\x00\x0a\xffq\x033\x00\ +&\xff\xd7\x033\x00*\xff\xd7\x033\x00-\x01\x0a\x03\ +3\x002\xff\xd7\x033\x004\xff\xd7\x033\x007\xff\ +q\x033\x009\xff\xae\x033\x00:\xff\xae\x033\x00\ +<\xff\x85\x033\x00\x89\xff\xd7\x033\x00\x94\xff\xd7\x03\ +3\x00\x95\xff\xd7\x033\x00\x96\xff\xd7\x033\x00\x97\xff\ +\xd7\x033\x00\x98\xff\xd7\x033\x00\x9a\xff\xd7\x033\x00\ +\x9f\xff\x85\x033\x00\xc8\xff\xd7\x033\x00\xca\xff\xd7\x03\ +3\x00\xcc\xff\xd7\x033\x00\xce\xff\xd7\x033\x00\xde\xff\ +\xd7\x033\x00\xe0\xff\xd7\x033\x00\xe2\xff\xd7\x033\x00\ +\xe4\xff\xd7\x033\x01\x0e\xff\xd7\x033\x01\x10\xff\xd7\x03\ +3\x01\x12\xff\xd7\x033\x01\x14\xff\xd7\x033\x01$\xff\ +q\x033\x01&\xffq\x033\x016\xff\xae\x033\x01\ +8\xff\x85\x033\x01:\xff\x85\x033\x01G\xff\xd7\x03\ +3\x01\xfa\xff\xae\x033\x01\xfc\xff\xae\x033\x01\xfe\xff\ +\xae\x033\x02\x00\xff\x85\x033\x02\x07\xffq\x033\x02\ +\x0b\xffq\x033\x02_\xff\xd7\x033\x03I\xff\xd7\x03\ +3\x03K\xff\xd7\x033\x03M\xff\xd7\x033\x03O\xff\ +\xd7\x033\x03Q\xff\xd7\x033\x03S\xff\xd7\x033\x03\ +U\xff\xd7\x033\x03W\xff\xd7\x033\x03Y\xff\xd7\x03\ +3\x03[\xff\xd7\x033\x03]\xff\xd7\x033\x03_\xff\ +\xd7\x033\x03o\xff\x85\x033\x03q\xff\x85\x033\x03\ +s\xff\x85\x033\x03\x8f\xffq\x034\x00\x05\xff\xec\x03\ +4\x00\x0a\xff\xec\x034\x02\x07\xff\xec\x034\x02\x0b\xff\ +\xec\x035\x00-\x00{\x036\x00\x05\xff\xec\x036\x00\ +\x0a\xff\xec\x036\x00Y\xff\xd7\x036\x00Z\xff\xd7\x03\ +6\x00[\xff\xd7\x036\x00\x5c\xff\xd7\x036\x00]\xff\ +\xec\x036\x00\xbf\xff\xd7\x036\x017\xff\xd7\x036\x01\ +<\xff\xec\x036\x01>\xff\xec\x036\x01@\xff\xec\x03\ +6\x01\xfb\xff\xd7\x036\x01\xfd\xff\xd7\x036\x02\x07\xff\ +\xec\x036\x02\x0b\xff\xec\x036\x03p\xff\xd7\x037\x00\ +-\x00{\x038\x00\x05\xff\xec\x038\x00\x0a\xff\xec\x03\ +8\x00Y\xff\xd7\x038\x00Z\xff\xd7\x038\x00[\xff\ +\xd7\x038\x00\x5c\xff\xd7\x038\x00]\xff\xec\x038\x00\ +\xbf\xff\xd7\x038\x017\xff\xd7\x038\x01<\xff\xec\x03\ +8\x01>\xff\xec\x038\x01@\xff\xec\x038\x01\xfb\xff\ +\xd7\x038\x01\xfd\xff\xd7\x038\x02\x07\xff\xec\x038\x02\ +\x0b\xff\xec\x038\x03p\xff\xd7\x039\x00-\x00{\x03\ +:\x00\x05\xff\xec\x03:\x00\x0a\xff\xec\x03:\x00Y\xff\ +\xd7\x03:\x00Z\xff\xd7\x03:\x00[\xff\xd7\x03:\x00\ +\x5c\xff\xd7\x03:\x00]\xff\xec\x03:\x00\xbf\xff\xd7\x03\ +:\x017\xff\xd7\x03:\x01<\xff\xec\x03:\x01>\xff\ +\xec\x03:\x01@\xff\xec\x03:\x01\xfb\xff\xd7\x03:\x01\ +\xfd\xff\xd7\x03:\x02\x07\xff\xec\x03:\x02\x0b\xff\xec\x03\ +:\x03p\xff\xd7\x03;\x00-\x00{\x03<\x00\x05\xff\ +\xec\x03<\x00\x0a\xff\xec\x03<\x00Y\xff\xd7\x03<\x00\ +Z\xff\xd7\x03<\x00[\xff\xd7\x03<\x00\x5c\xff\xd7\x03\ +<\x00]\xff\xec\x03<\x00\xbf\xff\xd7\x03<\x017\xff\ +\xd7\x03<\x01<\xff\xec\x03<\x01>\xff\xec\x03<\x01\ +@\xff\xec\x03<\x01\xfb\xff\xd7\x03<\x01\xfd\xff\xd7\x03\ +<\x02\x07\xff\xec\x03<\x02\x0b\xff\xec\x03<\x03p\xff\ +\xd7\x03=\x00-\x00{\x03>\x00\x05\xff\xec\x03>\x00\ +\x0a\xff\xec\x03>\x00Y\xff\xd7\x03>\x00Z\xff\xd7\x03\ +>\x00[\xff\xd7\x03>\x00\x5c\xff\xd7\x03>\x00]\xff\ +\xec\x03>\x00\xbf\xff\xd7\x03>\x017\xff\xd7\x03>\x01\ +<\xff\xec\x03>\x01>\xff\xec\x03>\x01@\xff\xec\x03\ +>\x01\xfb\xff\xd7\x03>\x01\xfd\xff\xd7\x03>\x02\x07\xff\ +\xec\x03>\x02\x0b\xff\xec\x03>\x03p\xff\xd7\x03?\x00\ +-\x00{\x03@\x00\x05\xff\xec\x03@\x00\x0a\xff\xec\x03\ +@\x00Y\xff\xd7\x03@\x00Z\xff\xd7\x03@\x00[\xff\ +\xd7\x03@\x00\x5c\xff\xd7\x03@\x00]\xff\xec\x03@\x00\ +\xbf\xff\xd7\x03@\x017\xff\xd7\x03@\x01<\xff\xec\x03\ +@\x01>\xff\xec\x03@\x01@\xff\xec\x03@\x01\xfb\xff\ +\xd7\x03@\x01\xfd\xff\xd7\x03@\x02\x07\xff\xec\x03@\x02\ +\x0b\xff\xec\x03@\x03p\xff\xd7\x03A\x00-\x00{\x03\ +B\x00\x05\xff\xec\x03B\x00\x0a\xff\xec\x03B\x00Y\xff\ +\xd7\x03B\x00Z\xff\xd7\x03B\x00[\xff\xd7\x03B\x00\ +\x5c\xff\xd7\x03B\x00]\xff\xec\x03B\x00\xbf\xff\xd7\x03\ +B\x017\xff\xd7\x03B\x01<\xff\xec\x03B\x01>\xff\ +\xec\x03B\x01@\xff\xec\x03B\x01\xfb\xff\xd7\x03B\x01\ +\xfd\xff\xd7\x03B\x02\x07\xff\xec\x03B\x02\x0b\xff\xec\x03\ +B\x03p\xff\xd7\x03C\x00-\x00{\x03D\x00\x05\xff\ +\xec\x03D\x00\x0a\xff\xec\x03D\x00Y\xff\xd7\x03D\x00\ +Z\xff\xd7\x03D\x00[\xff\xd7\x03D\x00\x5c\xff\xd7\x03\ +D\x00]\xff\xec\x03D\x00\xbf\xff\xd7\x03D\x017\xff\ +\xd7\x03D\x01<\xff\xec\x03D\x01>\xff\xec\x03D\x01\ +@\xff\xec\x03D\x01\xfb\xff\xd7\x03D\x01\xfd\xff\xd7\x03\ +D\x02\x07\xff\xec\x03D\x02\x0b\xff\xec\x03D\x03p\xff\ +\xd7\x03I\x00\x0f\xff\xae\x03I\x00\x11\xff\xae\x03I\x00\ +$\xff\xd7\x03I\x007\xff\xc3\x03I\x009\xff\xec\x03\ +I\x00:\xff\xec\x03I\x00;\xff\xd7\x03I\x00<\xff\ +\xec\x03I\x00=\xff\xec\x03I\x00\x82\xff\xd7\x03I\x00\ +\x83\xff\xd7\x03I\x00\x84\xff\xd7\x03I\x00\x85\xff\xd7\x03\ +I\x00\x86\xff\xd7\x03I\x00\x87\xff\xd7\x03I\x00\x9f\xff\ +\xec\x03I\x00\xc2\xff\xd7\x03I\x00\xc4\xff\xd7\x03I\x00\ +\xc6\xff\xd7\x03I\x01$\xff\xc3\x03I\x01&\xff\xc3\x03\ +I\x016\xff\xec\x03I\x018\xff\xec\x03I\x01:\xff\ +\xec\x03I\x01;\xff\xec\x03I\x01=\xff\xec\x03I\x01\ +?\xff\xec\x03I\x01C\xff\xd7\x03I\x01\xa0\xff\xec\x03\ +I\x01\xfa\xff\xec\x03I\x01\xfc\xff\xec\x03I\x01\xfe\xff\ +\xec\x03I\x02\x00\xff\xec\x03I\x02\x08\xff\xae\x03I\x02\ +\x0c\xff\xae\x03I\x02X\xff\xd7\x03I\x03\x1d\xff\xd7\x03\ +I\x03\x1f\xff\xd7\x03I\x03!\xff\xd7\x03I\x03#\xff\ +\xd7\x03I\x03%\xff\xd7\x03I\x03'\xff\xd7\x03I\x03\ +)\xff\xd7\x03I\x03+\xff\xd7\x03I\x03-\xff\xd7\x03\ +I\x03/\xff\xd7\x03I\x031\xff\xd7\x03I\x033\xff\ +\xd7\x03I\x03o\xff\xec\x03I\x03q\xff\xec\x03I\x03\ +s\xff\xec\x03I\x03\x8f\xff\xc3\x03J\x00\x05\xff\xec\x03\ +J\x00\x0a\xff\xec\x03J\x00Y\xff\xd7\x03J\x00Z\xff\ +\xd7\x03J\x00[\xff\xd7\x03J\x00\x5c\xff\xd7\x03J\x00\ +]\xff\xec\x03J\x00\xbf\xff\xd7\x03J\x017\xff\xd7\x03\ +J\x01<\xff\xec\x03J\x01>\xff\xec\x03J\x01@\xff\ +\xec\x03J\x01\xfb\xff\xd7\x03J\x01\xfd\xff\xd7\x03J\x02\ +\x07\xff\xec\x03J\x02\x0b\xff\xec\x03J\x03p\xff\xd7\x03\ +K\x00\x0f\xff\xae\x03K\x00\x11\xff\xae\x03K\x00$\xff\ +\xd7\x03K\x007\xff\xc3\x03K\x009\xff\xec\x03K\x00\ +:\xff\xec\x03K\x00;\xff\xd7\x03K\x00<\xff\xec\x03\ +K\x00=\xff\xec\x03K\x00\x82\xff\xd7\x03K\x00\x83\xff\ +\xd7\x03K\x00\x84\xff\xd7\x03K\x00\x85\xff\xd7\x03K\x00\ +\x86\xff\xd7\x03K\x00\x87\xff\xd7\x03K\x00\x9f\xff\xec\x03\ +K\x00\xc2\xff\xd7\x03K\x00\xc4\xff\xd7\x03K\x00\xc6\xff\ +\xd7\x03K\x01$\xff\xc3\x03K\x01&\xff\xc3\x03K\x01\ +6\xff\xec\x03K\x018\xff\xec\x03K\x01:\xff\xec\x03\ +K\x01;\xff\xec\x03K\x01=\xff\xec\x03K\x01?\xff\ +\xec\x03K\x01C\xff\xd7\x03K\x01\xa0\xff\xec\x03K\x01\ +\xfa\xff\xec\x03K\x01\xfc\xff\xec\x03K\x01\xfe\xff\xec\x03\ +K\x02\x00\xff\xec\x03K\x02\x08\xff\xae\x03K\x02\x0c\xff\ +\xae\x03K\x02X\xff\xd7\x03K\x03\x1d\xff\xd7\x03K\x03\ +\x1f\xff\xd7\x03K\x03!\xff\xd7\x03K\x03#\xff\xd7\x03\ +K\x03%\xff\xd7\x03K\x03'\xff\xd7\x03K\x03)\xff\ +\xd7\x03K\x03+\xff\xd7\x03K\x03-\xff\xd7\x03K\x03\ +/\xff\xd7\x03K\x031\xff\xd7\x03K\x033\xff\xd7\x03\ +K\x03o\xff\xec\x03K\x03q\xff\xec\x03K\x03s\xff\ +\xec\x03K\x03\x8f\xff\xc3\x03L\x00\x05\xff\xec\x03L\x00\ +\x0a\xff\xec\x03L\x00Y\xff\xd7\x03L\x00Z\xff\xd7\x03\ +L\x00[\xff\xd7\x03L\x00\x5c\xff\xd7\x03L\x00]\xff\ +\xec\x03L\x00\xbf\xff\xd7\x03L\x017\xff\xd7\x03L\x01\ +<\xff\xec\x03L\x01>\xff\xec\x03L\x01@\xff\xec\x03\ +L\x01\xfb\xff\xd7\x03L\x01\xfd\xff\xd7\x03L\x02\x07\xff\ +\xec\x03L\x02\x0b\xff\xec\x03L\x03p\xff\xd7\x03M\x00\ +\x0f\xff\xae\x03M\x00\x11\xff\xae\x03M\x00$\xff\xd7\x03\ +M\x007\xff\xc3\x03M\x009\xff\xec\x03M\x00:\xff\ +\xec\x03M\x00;\xff\xd7\x03M\x00<\xff\xec\x03M\x00\ +=\xff\xec\x03M\x00\x82\xff\xd7\x03M\x00\x83\xff\xd7\x03\ +M\x00\x84\xff\xd7\x03M\x00\x85\xff\xd7\x03M\x00\x86\xff\ +\xd7\x03M\x00\x87\xff\xd7\x03M\x00\x9f\xff\xec\x03M\x00\ +\xc2\xff\xd7\x03M\x00\xc4\xff\xd7\x03M\x00\xc6\xff\xd7\x03\ +M\x01$\xff\xc3\x03M\x01&\xff\xc3\x03M\x016\xff\ +\xec\x03M\x018\xff\xec\x03M\x01:\xff\xec\x03M\x01\ +;\xff\xec\x03M\x01=\xff\xec\x03M\x01?\xff\xec\x03\ +M\x01C\xff\xd7\x03M\x01\xa0\xff\xec\x03M\x01\xfa\xff\ +\xec\x03M\x01\xfc\xff\xec\x03M\x01\xfe\xff\xec\x03M\x02\ +\x00\xff\xec\x03M\x02\x08\xff\xae\x03M\x02\x0c\xff\xae\x03\ +M\x02X\xff\xd7\x03M\x03\x1d\xff\xd7\x03M\x03\x1f\xff\ +\xd7\x03M\x03!\xff\xd7\x03M\x03#\xff\xd7\x03M\x03\ +%\xff\xd7\x03M\x03'\xff\xd7\x03M\x03)\xff\xd7\x03\ +M\x03+\xff\xd7\x03M\x03-\xff\xd7\x03M\x03/\xff\ +\xd7\x03M\x031\xff\xd7\x03M\x033\xff\xd7\x03M\x03\ +o\xff\xec\x03M\x03q\xff\xec\x03M\x03s\xff\xec\x03\ +M\x03\x8f\xff\xc3\x03O\x00\x0f\xff\xae\x03O\x00\x11\xff\ +\xae\x03O\x00$\xff\xd7\x03O\x007\xff\xc3\x03O\x00\ +9\xff\xec\x03O\x00:\xff\xec\x03O\x00;\xff\xd7\x03\ +O\x00<\xff\xec\x03O\x00=\xff\xec\x03O\x00\x82\xff\ +\xd7\x03O\x00\x83\xff\xd7\x03O\x00\x84\xff\xd7\x03O\x00\ +\x85\xff\xd7\x03O\x00\x86\xff\xd7\x03O\x00\x87\xff\xd7\x03\ +O\x00\x9f\xff\xec\x03O\x00\xc2\xff\xd7\x03O\x00\xc4\xff\ +\xd7\x03O\x00\xc6\xff\xd7\x03O\x01$\xff\xc3\x03O\x01\ +&\xff\xc3\x03O\x016\xff\xec\x03O\x018\xff\xec\x03\ +O\x01:\xff\xec\x03O\x01;\xff\xec\x03O\x01=\xff\ +\xec\x03O\x01?\xff\xec\x03O\x01C\xff\xd7\x03O\x01\ +\xa0\xff\xec\x03O\x01\xfa\xff\xec\x03O\x01\xfc\xff\xec\x03\ +O\x01\xfe\xff\xec\x03O\x02\x00\xff\xec\x03O\x02\x08\xff\ +\xae\x03O\x02\x0c\xff\xae\x03O\x02X\xff\xd7\x03O\x03\ +\x1d\xff\xd7\x03O\x03\x1f\xff\xd7\x03O\x03!\xff\xd7\x03\ +O\x03#\xff\xd7\x03O\x03%\xff\xd7\x03O\x03'\xff\ +\xd7\x03O\x03)\xff\xd7\x03O\x03+\xff\xd7\x03O\x03\ +-\xff\xd7\x03O\x03/\xff\xd7\x03O\x031\xff\xd7\x03\ +O\x033\xff\xd7\x03O\x03o\xff\xec\x03O\x03q\xff\ +\xec\x03O\x03s\xff\xec\x03O\x03\x8f\xff\xc3\x03Q\x00\ +\x0f\xff\xae\x03Q\x00\x11\xff\xae\x03Q\x00$\xff\xd7\x03\ +Q\x007\xff\xc3\x03Q\x009\xff\xec\x03Q\x00:\xff\ +\xec\x03Q\x00;\xff\xd7\x03Q\x00<\xff\xec\x03Q\x00\ +=\xff\xec\x03Q\x00\x82\xff\xd7\x03Q\x00\x83\xff\xd7\x03\ +Q\x00\x84\xff\xd7\x03Q\x00\x85\xff\xd7\x03Q\x00\x86\xff\ +\xd7\x03Q\x00\x87\xff\xd7\x03Q\x00\x9f\xff\xec\x03Q\x00\ +\xc2\xff\xd7\x03Q\x00\xc4\xff\xd7\x03Q\x00\xc6\xff\xd7\x03\ +Q\x01$\xff\xc3\x03Q\x01&\xff\xc3\x03Q\x016\xff\ +\xec\x03Q\x018\xff\xec\x03Q\x01:\xff\xec\x03Q\x01\ +;\xff\xec\x03Q\x01=\xff\xec\x03Q\x01?\xff\xec\x03\ +Q\x01C\xff\xd7\x03Q\x01\xa0\xff\xec\x03Q\x01\xfa\xff\ +\xec\x03Q\x01\xfc\xff\xec\x03Q\x01\xfe\xff\xec\x03Q\x02\ +\x00\xff\xec\x03Q\x02\x08\xff\xae\x03Q\x02\x0c\xff\xae\x03\ +Q\x02X\xff\xd7\x03Q\x03\x1d\xff\xd7\x03Q\x03\x1f\xff\ +\xd7\x03Q\x03!\xff\xd7\x03Q\x03#\xff\xd7\x03Q\x03\ +%\xff\xd7\x03Q\x03'\xff\xd7\x03Q\x03)\xff\xd7\x03\ +Q\x03+\xff\xd7\x03Q\x03-\xff\xd7\x03Q\x03/\xff\ +\xd7\x03Q\x031\xff\xd7\x03Q\x033\xff\xd7\x03Q\x03\ +o\xff\xec\x03Q\x03q\xff\xec\x03Q\x03s\xff\xec\x03\ +Q\x03\x8f\xff\xc3\x03S\x00\x0f\xff\xae\x03S\x00\x11\xff\ +\xae\x03S\x00$\xff\xd7\x03S\x007\xff\xc3\x03S\x00\ +9\xff\xec\x03S\x00:\xff\xec\x03S\x00;\xff\xd7\x03\ +S\x00<\xff\xec\x03S\x00=\xff\xec\x03S\x00\x82\xff\ +\xd7\x03S\x00\x83\xff\xd7\x03S\x00\x84\xff\xd7\x03S\x00\ +\x85\xff\xd7\x03S\x00\x86\xff\xd7\x03S\x00\x87\xff\xd7\x03\ +S\x00\x9f\xff\xec\x03S\x00\xc2\xff\xd7\x03S\x00\xc4\xff\ +\xd7\x03S\x00\xc6\xff\xd7\x03S\x01$\xff\xc3\x03S\x01\ +&\xff\xc3\x03S\x016\xff\xec\x03S\x018\xff\xec\x03\ +S\x01:\xff\xec\x03S\x01;\xff\xec\x03S\x01=\xff\ +\xec\x03S\x01?\xff\xec\x03S\x01C\xff\xd7\x03S\x01\ +\xa0\xff\xec\x03S\x01\xfa\xff\xec\x03S\x01\xfc\xff\xec\x03\ +S\x01\xfe\xff\xec\x03S\x02\x00\xff\xec\x03S\x02\x08\xff\ +\xae\x03S\x02\x0c\xff\xae\x03S\x02X\xff\xd7\x03S\x03\ +\x1d\xff\xd7\x03S\x03\x1f\xff\xd7\x03S\x03!\xff\xd7\x03\ +S\x03#\xff\xd7\x03S\x03%\xff\xd7\x03S\x03'\xff\ +\xd7\x03S\x03)\xff\xd7\x03S\x03+\xff\xd7\x03S\x03\ +-\xff\xd7\x03S\x03/\xff\xd7\x03S\x031\xff\xd7\x03\ +S\x033\xff\xd7\x03S\x03o\xff\xec\x03S\x03q\xff\ +\xec\x03S\x03s\xff\xec\x03S\x03\x8f\xff\xc3\x03U\x00\ +\x0f\xff\xae\x03U\x00\x11\xff\xae\x03U\x00$\xff\xd7\x03\ +U\x007\xff\xc3\x03U\x009\xff\xec\x03U\x00:\xff\ +\xec\x03U\x00;\xff\xd7\x03U\x00<\xff\xec\x03U\x00\ +=\xff\xec\x03U\x00\x82\xff\xd7\x03U\x00\x83\xff\xd7\x03\ +U\x00\x84\xff\xd7\x03U\x00\x85\xff\xd7\x03U\x00\x86\xff\ +\xd7\x03U\x00\x87\xff\xd7\x03U\x00\x9f\xff\xec\x03U\x00\ +\xc2\xff\xd7\x03U\x00\xc4\xff\xd7\x03U\x00\xc6\xff\xd7\x03\ +U\x01$\xff\xc3\x03U\x01&\xff\xc3\x03U\x016\xff\ +\xec\x03U\x018\xff\xec\x03U\x01:\xff\xec\x03U\x01\ +;\xff\xec\x03U\x01=\xff\xec\x03U\x01?\xff\xec\x03\ +U\x01C\xff\xd7\x03U\x01\xa0\xff\xec\x03U\x01\xfa\xff\ +\xec\x03U\x01\xfc\xff\xec\x03U\x01\xfe\xff\xec\x03U\x02\ +\x00\xff\xec\x03U\x02\x08\xff\xae\x03U\x02\x0c\xff\xae\x03\ +U\x02X\xff\xd7\x03U\x03\x1d\xff\xd7\x03U\x03\x1f\xff\ +\xd7\x03U\x03!\xff\xd7\x03U\x03#\xff\xd7\x03U\x03\ +%\xff\xd7\x03U\x03'\xff\xd7\x03U\x03)\xff\xd7\x03\ +U\x03+\xff\xd7\x03U\x03-\xff\xd7\x03U\x03/\xff\ +\xd7\x03U\x031\xff\xd7\x03U\x033\xff\xd7\x03U\x03\ +o\xff\xec\x03U\x03q\xff\xec\x03U\x03s\xff\xec\x03\ +U\x03\x8f\xff\xc3\x03X\x00I\x00R\x03X\x00W\x00\ +R\x03X\x00Y\x00f\x03X\x00Z\x00f\x03X\x00\ +[\x00f\x03X\x00\x5c\x00f\x03X\x00\xbf\x00f\x03\ +X\x01%\x00R\x03X\x01'\x00R\x03X\x017\x00\ +f\x03X\x01\xfb\x00f\x03X\x01\xfd\x00f\x03X\x02\ +4\x00R\x03X\x025\x00R\x03X\x02]\x00R\x03\ +X\x02^\x00R\x03X\x03p\x00f\x03X\x03\x8d\x00\ +R\x03X\x03\x90\x00R\x03Z\x00I\x00R\x03Z\x00\ +W\x00R\x03Z\x00Y\x00f\x03Z\x00Z\x00f\x03\ +Z\x00[\x00f\x03Z\x00\x5c\x00f\x03Z\x00\xbf\x00\ +f\x03Z\x01%\x00R\x03Z\x01'\x00R\x03Z\x01\ +7\x00f\x03Z\x01\xfb\x00f\x03Z\x01\xfd\x00f\x03\ +Z\x024\x00R\x03Z\x025\x00R\x03Z\x02]\x00\ +R\x03Z\x02^\x00R\x03Z\x03p\x00f\x03Z\x03\ +\x8d\x00R\x03Z\x03\x90\x00R\x03\x5c\x00I\x00R\x03\ +\x5c\x00W\x00R\x03\x5c\x00Y\x00f\x03\x5c\x00Z\x00\ +f\x03\x5c\x00[\x00f\x03\x5c\x00\x5c\x00f\x03\x5c\x00\ +\xbf\x00f\x03\x5c\x01%\x00R\x03\x5c\x01'\x00R\x03\ +\x5c\x017\x00f\x03\x5c\x01\xfb\x00f\x03\x5c\x01\xfd\x00\ +f\x03\x5c\x024\x00R\x03\x5c\x025\x00R\x03\x5c\x02\ +]\x00R\x03\x5c\x02^\x00R\x03\x5c\x03p\x00f\x03\ +\x5c\x03\x8d\x00R\x03\x5c\x03\x90\x00R\x03^\x00I\x00\ +R\x03^\x00W\x00R\x03^\x00Y\x00f\x03^\x00\ +Z\x00f\x03^\x00[\x00f\x03^\x00\x5c\x00f\x03\ +^\x00\xbf\x00f\x03^\x01%\x00R\x03^\x01'\x00\ +R\x03^\x017\x00f\x03^\x01\xfb\x00f\x03^\x01\ +\xfd\x00f\x03^\x024\x00R\x03^\x025\x00R\x03\ +^\x02]\x00R\x03^\x02^\x00R\x03^\x03p\x00\ +f\x03^\x03\x8d\x00R\x03^\x03\x90\x00R\x03`\x00\ +I\x00R\x03`\x00W\x00R\x03`\x00Y\x00f\x03\ +`\x00Z\x00f\x03`\x00[\x00f\x03`\x00\x5c\x00\ +f\x03`\x00\xbf\x00f\x03`\x01%\x00R\x03`\x01\ +'\x00R\x03`\x017\x00f\x03`\x01\xfb\x00f\x03\ +`\x01\xfd\x00f\x03`\x024\x00R\x03`\x025\x00\ +R\x03`\x02]\x00R\x03`\x02^\x00R\x03`\x03\ +p\x00f\x03`\x03\x8d\x00R\x03`\x03\x90\x00R\x03\ +a\x00\x0f\xff\xd7\x03a\x00\x11\xff\xd7\x03a\x00$\xff\ +\xec\x03a\x00\x82\xff\xec\x03a\x00\x83\xff\xec\x03a\x00\ +\x84\xff\xec\x03a\x00\x85\xff\xec\x03a\x00\x86\xff\xec\x03\ +a\x00\x87\xff\xec\x03a\x00\xc2\xff\xec\x03a\x00\xc4\xff\ +\xec\x03a\x00\xc6\xff\xec\x03a\x01C\xff\xec\x03a\x02\ +\x08\xff\xd7\x03a\x02\x0c\xff\xd7\x03a\x02X\xff\xec\x03\ +a\x03\x1d\xff\xec\x03a\x03\x1f\xff\xec\x03a\x03!\xff\ +\xec\x03a\x03#\xff\xec\x03a\x03%\xff\xec\x03a\x03\ +'\xff\xec\x03a\x03)\xff\xec\x03a\x03+\xff\xec\x03\ +a\x03-\xff\xec\x03a\x03/\xff\xec\x03a\x031\xff\ +\xec\x03a\x033\xff\xec\x03f\x00I\x00f\x03f\x00\ +W\x00f\x03f\x00Y\x00f\x03f\x00Z\x00f\x03\ +f\x00[\x00f\x03f\x00\x5c\x00f\x03f\x00\xbf\x00\ +f\x03f\x01%\x00f\x03f\x01'\x00f\x03f\x01\ +7\x00f\x03f\x01\xfb\x00f\x03f\x01\xfd\x00f\x03\ +f\x024\x00f\x03f\x025\x00f\x03f\x02]\x00\ +f\x03f\x02^\x00f\x03f\x03p\x00f\x03f\x03\ +\x8d\x00f\x03f\x03\x90\x00f\x03h\x00I\x00f\x03\ +h\x00W\x00f\x03h\x00Y\x00f\x03h\x00Z\x00\ +f\x03h\x00[\x00f\x03h\x00\x5c\x00f\x03h\x00\ +\xbf\x00f\x03h\x01%\x00f\x03h\x01'\x00f\x03\ +h\x017\x00f\x03h\x01\xfb\x00f\x03h\x01\xfd\x00\ +f\x03h\x024\x00f\x03h\x025\x00f\x03h\x02\ +]\x00f\x03h\x02^\x00f\x03h\x03p\x00f\x03\ +h\x03\x8d\x00f\x03h\x03\x90\x00f\x03j\x00I\x00\ +f\x03j\x00W\x00f\x03j\x00Y\x00f\x03j\x00\ +Z\x00f\x03j\x00[\x00f\x03j\x00\x5c\x00f\x03\ +j\x00\xbf\x00f\x03j\x01%\x00f\x03j\x01'\x00\ +f\x03j\x017\x00f\x03j\x01\xfb\x00f\x03j\x01\ +\xfd\x00f\x03j\x024\x00f\x03j\x025\x00f\x03\ +j\x02]\x00f\x03j\x02^\x00f\x03j\x03p\x00\ +f\x03j\x03\x8d\x00f\x03j\x03\x90\x00f\x03l\x00\ +I\x00f\x03l\x00W\x00f\x03l\x00Y\x00f\x03\ +l\x00Z\x00f\x03l\x00[\x00f\x03l\x00\x5c\x00\ +f\x03l\x00\xbf\x00f\x03l\x01%\x00f\x03l\x01\ +'\x00f\x03l\x017\x00f\x03l\x01\xfb\x00f\x03\ +l\x01\xfd\x00f\x03l\x024\x00f\x03l\x025\x00\ +f\x03l\x02]\x00f\x03l\x02^\x00f\x03l\x03\ +p\x00f\x03l\x03\x8d\x00f\x03l\x03\x90\x00f\x03\ +n\x00I\x00f\x03n\x00W\x00f\x03n\x00Y\x00\ +f\x03n\x00Z\x00f\x03n\x00[\x00f\x03n\x00\ +\x5c\x00f\x03n\x00\xbf\x00f\x03n\x01%\x00f\x03\ +n\x01'\x00f\x03n\x017\x00f\x03n\x01\xfb\x00\ +f\x03n\x01\xfd\x00f\x03n\x024\x00f\x03n\x02\ +5\x00f\x03n\x02]\x00f\x03n\x02^\x00f\x03\ +n\x03p\x00f\x03n\x03\x8d\x00f\x03n\x03\x90\x00\ +f\x03o\x00\x0f\xff\x85\x03o\x00\x11\xff\x85\x03o\x00\ +\x22\x00)\x03o\x00$\xff\x85\x03o\x00&\xff\xd7\x03\ +o\x00*\xff\xd7\x03o\x002\xff\xd7\x03o\x004\xff\ +\xd7\x03o\x00D\xff\x9a\x03o\x00F\xff\x9a\x03o\x00\ +G\xff\x9a\x03o\x00H\xff\x9a\x03o\x00J\xff\xd7\x03\ +o\x00P\xff\xc3\x03o\x00Q\xff\xc3\x03o\x00R\xff\ +\x9a\x03o\x00S\xff\xc3\x03o\x00T\xff\x9a\x03o\x00\ +U\xff\xc3\x03o\x00V\xff\xae\x03o\x00X\xff\xc3\x03\ +o\x00]\xff\xd7\x03o\x00\x82\xff\x85\x03o\x00\x83\xff\ +\x85\x03o\x00\x84\xff\x85\x03o\x00\x85\xff\x85\x03o\x00\ +\x86\xff\x85\x03o\x00\x87\xff\x85\x03o\x00\x89\xff\xd7\x03\ +o\x00\x94\xff\xd7\x03o\x00\x95\xff\xd7\x03o\x00\x96\xff\ +\xd7\x03o\x00\x97\xff\xd7\x03o\x00\x98\xff\xd7\x03o\x00\ +\x9a\xff\xd7\x03o\x00\xa2\xff\x9a\x03o\x00\xa3\xff\x9a\x03\ +o\x00\xa4\xff\x9a\x03o\x00\xa5\xff\x9a\x03o\x00\xa6\xff\ +\x9a\x03o\x00\xa7\xff\x9a\x03o\x00\xa8\xff\x9a\x03o\x00\ +\xa9\xff\x9a\x03o\x00\xaa\xff\x9a\x03o\x00\xab\xff\x9a\x03\ +o\x00\xac\xff\x9a\x03o\x00\xad\xff\x9a\x03o\x00\xb4\xff\ +\x9a\x03o\x00\xb5\xff\x9a\x03o\x00\xb6\xff\x9a\x03o\x00\ +\xb7\xff\x9a\x03o\x00\xb8\xff\x9a\x03o\x00\xba\xff\x9a\x03\ +o\x00\xbb\xff\xc3\x03o\x00\xbc\xff\xc3\x03o\x00\xbd\xff\ +\xc3\x03o\x00\xbe\xff\xc3\x03o\x00\xc2\xff\x85\x03o\x00\ +\xc3\xff\x9a\x03o\x00\xc4\xff\x85\x03o\x00\xc5\xff\x9a\x03\ +o\x00\xc6\xff\x85\x03o\x00\xc7\xff\x9a\x03o\x00\xc8\xff\ +\xd7\x03o\x00\xc9\xff\x9a\x03o\x00\xca\xff\xd7\x03o\x00\ +\xcb\xff\x9a\x03o\x00\xcc\xff\xd7\x03o\x00\xcd\xff\x9a\x03\ +o\x00\xce\xff\xd7\x03o\x00\xcf\xff\x9a\x03o\x00\xd1\xff\ +\x9a\x03o\x00\xd3\xff\x9a\x03o\x00\xd5\xff\x9a\x03o\x00\ +\xd7\xff\x9a\x03o\x00\xd9\xff\x9a\x03o\x00\xdb\xff\x9a\x03\ +o\x00\xdd\xff\x9a\x03o\x00\xde\xff\xd7\x03o\x00\xdf\xff\ +\xd7\x03o\x00\xe0\xff\xd7\x03o\x00\xe1\xff\xd7\x03o\x00\ +\xe2\xff\xd7\x03o\x00\xe3\xff\xd7\x03o\x00\xe4\xff\xd7\x03\ +o\x00\xe5\xff\xd7\x03o\x00\xfa\xff\xc3\x03o\x01\x06\xff\ +\xc3\x03o\x01\x08\xff\xc3\x03o\x01\x0d\xff\xc3\x03o\x01\ +\x0e\xff\xd7\x03o\x01\x0f\xff\x9a\x03o\x01\x10\xff\xd7\x03\ +o\x01\x11\xff\x9a\x03o\x01\x12\xff\xd7\x03o\x01\x13\xff\ +\x9a\x03o\x01\x14\xff\xd7\x03o\x01\x15\xff\x9a\x03o\x01\ +\x17\xff\xc3\x03o\x01\x19\xff\xc3\x03o\x01\x1d\xff\xae\x03\ +o\x01!\xff\xae\x03o\x01+\xff\xc3\x03o\x01-\xff\ +\xc3\x03o\x01/\xff\xc3\x03o\x011\xff\xc3\x03o\x01\ +3\xff\xc3\x03o\x015\xff\xc3\x03o\x01<\xff\xd7\x03\ +o\x01>\xff\xd7\x03o\x01@\xff\xd7\x03o\x01C\xff\ +\x85\x03o\x01D\xff\x9a\x03o\x01F\xff\x9a\x03o\x01\ +G\xff\xd7\x03o\x01H\xff\x9a\x03o\x01J\xff\xae\x03\ +o\x02\x08\xff\x85\x03o\x02\x0c\xff\x85\x03o\x02W\xff\ +\xc3\x03o\x02X\xff\x85\x03o\x02Y\xff\x9a\x03o\x02\ +_\xff\xd7\x03o\x02`\xff\x9a\x03o\x02b\xff\xc3\x03\ +o\x03\x1d\xff\x85\x03o\x03\x1e\xff\x9a\x03o\x03\x1f\xff\ +\x85\x03o\x03 \xff\x9a\x03o\x03!\xff\x85\x03o\x03\ +\x22\xff\x9a\x03o\x03#\xff\x85\x03o\x03%\xff\x85\x03\ +o\x03&\xff\x9a\x03o\x03'\xff\x85\x03o\x03(\xff\ +\x9a\x03o\x03)\xff\x85\x03o\x03*\xff\x9a\x03o\x03\ ++\xff\x85\x03o\x03,\xff\x9a\x03o\x03-\xff\x85\x03\ +o\x03.\xff\x9a\x03o\x03/\xff\x85\x03o\x030\xff\ +\x9a\x03o\x031\xff\x85\x03o\x032\xff\x9a\x03o\x03\ +3\xff\x85\x03o\x034\xff\x9a\x03o\x036\xff\x9a\x03\ +o\x038\xff\x9a\x03o\x03:\xff\x9a\x03o\x03<\xff\ +\x9a\x03o\x03@\xff\x9a\x03o\x03B\xff\x9a\x03o\x03\ +D\xff\x9a\x03o\x03I\xff\xd7\x03o\x03J\xff\x9a\x03\ +o\x03K\xff\xd7\x03o\x03L\xff\x9a\x03o\x03M\xff\ +\xd7\x03o\x03N\xff\x9a\x03o\x03O\xff\xd7\x03o\x03\ +Q\xff\xd7\x03o\x03R\xff\x9a\x03o\x03S\xff\xd7\x03\ +o\x03T\xff\x9a\x03o\x03U\xff\xd7\x03o\x03V\xff\ +\x9a\x03o\x03W\xff\xd7\x03o\x03X\xff\x9a\x03o\x03\ +Y\xff\xd7\x03o\x03Z\xff\x9a\x03o\x03[\xff\xd7\x03\ +o\x03\x5c\xff\x9a\x03o\x03]\xff\xd7\x03o\x03^\xff\ +\x9a\x03o\x03_\xff\xd7\x03o\x03`\xff\x9a\x03o\x03\ +b\xff\xc3\x03o\x03d\xff\xc3\x03o\x03f\xff\xc3\x03\ +o\x03h\xff\xc3\x03o\x03j\xff\xc3\x03o\x03l\xff\ +\xc3\x03o\x03n\xff\xc3\x03p\x00\x05\x00R\x03p\x00\ +\x0a\x00R\x03p\x00\x0f\xff\xae\x03p\x00\x11\xff\xae\x03\ +p\x00\x22\x00)\x03p\x02\x07\x00R\x03p\x02\x08\xff\ +\xae\x03p\x02\x0b\x00R\x03p\x02\x0c\xff\xae\x03q\x00\ +\x0f\xff\x85\x03q\x00\x11\xff\x85\x03q\x00\x22\x00)\x03\ +q\x00$\xff\x85\x03q\x00&\xff\xd7\x03q\x00*\xff\ +\xd7\x03q\x002\xff\xd7\x03q\x004\xff\xd7\x03q\x00\ +D\xff\x9a\x03q\x00F\xff\x9a\x03q\x00G\xff\x9a\x03\ +q\x00H\xff\x9a\x03q\x00J\xff\xd7\x03q\x00P\xff\ +\xc3\x03q\x00Q\xff\xc3\x03q\x00R\xff\x9a\x03q\x00\ +S\xff\xc3\x03q\x00T\xff\x9a\x03q\x00U\xff\xc3\x03\ +q\x00V\xff\xae\x03q\x00X\xff\xc3\x03q\x00]\xff\ +\xd7\x03q\x00\x82\xff\x85\x03q\x00\x83\xff\x85\x03q\x00\ +\x84\xff\x85\x03q\x00\x85\xff\x85\x03q\x00\x86\xff\x85\x03\ +q\x00\x87\xff\x85\x03q\x00\x89\xff\xd7\x03q\x00\x94\xff\ +\xd7\x03q\x00\x95\xff\xd7\x03q\x00\x96\xff\xd7\x03q\x00\ +\x97\xff\xd7\x03q\x00\x98\xff\xd7\x03q\x00\x9a\xff\xd7\x03\ +q\x00\xa2\xff\x9a\x03q\x00\xa3\xff\x9a\x03q\x00\xa4\xff\ +\x9a\x03q\x00\xa5\xff\x9a\x03q\x00\xa6\xff\x9a\x03q\x00\ +\xa7\xff\x9a\x03q\x00\xa8\xff\x9a\x03q\x00\xa9\xff\x9a\x03\ +q\x00\xaa\xff\x9a\x03q\x00\xab\xff\x9a\x03q\x00\xac\xff\ +\x9a\x03q\x00\xad\xff\x9a\x03q\x00\xb4\xff\x9a\x03q\x00\ +\xb5\xff\x9a\x03q\x00\xb6\xff\x9a\x03q\x00\xb7\xff\x9a\x03\ +q\x00\xb8\xff\x9a\x03q\x00\xba\xff\x9a\x03q\x00\xbb\xff\ +\xc3\x03q\x00\xbc\xff\xc3\x03q\x00\xbd\xff\xc3\x03q\x00\ +\xbe\xff\xc3\x03q\x00\xc2\xff\x85\x03q\x00\xc3\xff\x9a\x03\ +q\x00\xc4\xff\x85\x03q\x00\xc5\xff\x9a\x03q\x00\xc6\xff\ +\x85\x03q\x00\xc7\xff\x9a\x03q\x00\xc8\xff\xd7\x03q\x00\ +\xc9\xff\x9a\x03q\x00\xca\xff\xd7\x03q\x00\xcb\xff\x9a\x03\ +q\x00\xcc\xff\xd7\x03q\x00\xcd\xff\x9a\x03q\x00\xce\xff\ +\xd7\x03q\x00\xcf\xff\x9a\x03q\x00\xd1\xff\x9a\x03q\x00\ +\xd3\xff\x9a\x03q\x00\xd5\xff\x9a\x03q\x00\xd7\xff\x9a\x03\ +q\x00\xd9\xff\x9a\x03q\x00\xdb\xff\x9a\x03q\x00\xdd\xff\ +\x9a\x03q\x00\xde\xff\xd7\x03q\x00\xdf\xff\xd7\x03q\x00\ +\xe0\xff\xd7\x03q\x00\xe1\xff\xd7\x03q\x00\xe2\xff\xd7\x03\ +q\x00\xe3\xff\xd7\x03q\x00\xe4\xff\xd7\x03q\x00\xe5\xff\ +\xd7\x03q\x00\xfa\xff\xc3\x03q\x01\x06\xff\xc3\x03q\x01\ +\x08\xff\xc3\x03q\x01\x0d\xff\xc3\x03q\x01\x0e\xff\xd7\x03\ +q\x01\x0f\xff\x9a\x03q\x01\x10\xff\xd7\x03q\x01\x11\xff\ +\x9a\x03q\x01\x12\xff\xd7\x03q\x01\x13\xff\x9a\x03q\x01\ +\x14\xff\xd7\x03q\x01\x15\xff\x9a\x03q\x01\x17\xff\xc3\x03\ +q\x01\x19\xff\xc3\x03q\x01\x1d\xff\xae\x03q\x01!\xff\ +\xae\x03q\x01+\xff\xc3\x03q\x01-\xff\xc3\x03q\x01\ +/\xff\xc3\x03q\x011\xff\xc3\x03q\x013\xff\xc3\x03\ +q\x015\xff\xc3\x03q\x01<\xff\xd7\x03q\x01>\xff\ +\xd7\x03q\x01@\xff\xd7\x03q\x01C\xff\x85\x03q\x01\ +D\xff\x9a\x03q\x01F\xff\x9a\x03q\x01G\xff\xd7\x03\ +q\x01H\xff\x9a\x03q\x01J\xff\xae\x03q\x02\x08\xff\ +\x85\x03q\x02\x0c\xff\x85\x03q\x02W\xff\xc3\x03q\x02\ +X\xff\x85\x03q\x02Y\xff\x9a\x03q\x02_\xff\xd7\x03\ +q\x02`\xff\x9a\x03q\x02b\xff\xc3\x03q\x03\x1d\xff\ +\x85\x03q\x03\x1e\xff\x9a\x03q\x03\x1f\xff\x85\x03q\x03\ + \xff\x9a\x03q\x03!\xff\x85\x03q\x03\x22\xff\x9a\x03\ +q\x03#\xff\x85\x03q\x03%\xff\x85\x03q\x03&\xff\ +\x9a\x03q\x03'\xff\x85\x03q\x03(\xff\x9a\x03q\x03\ +)\xff\x85\x03q\x03*\xff\x9a\x03q\x03+\xff\x85\x03\ +q\x03,\xff\x9a\x03q\x03-\xff\x85\x03q\x03.\xff\ +\x9a\x03q\x03/\xff\x85\x03q\x030\xff\x9a\x03q\x03\ +1\xff\x85\x03q\x032\xff\x9a\x03q\x033\xff\x85\x03\ +q\x034\xff\x9a\x03q\x036\xff\x9a\x03q\x038\xff\ +\x9a\x03q\x03:\xff\x9a\x03q\x03<\xff\x9a\x03q\x03\ +@\xff\x9a\x03q\x03B\xff\x9a\x03q\x03D\xff\x9a\x03\ +q\x03I\xff\xd7\x03q\x03J\xff\x9a\x03q\x03K\xff\ +\xd7\x03q\x03L\xff\x9a\x03q\x03M\xff\xd7\x03q\x03\ +N\xff\x9a\x03q\x03O\xff\xd7\x03q\x03Q\xff\xd7\x03\ +q\x03R\xff\x9a\x03q\x03S\xff\xd7\x03q\x03T\xff\ +\x9a\x03q\x03U\xff\xd7\x03q\x03V\xff\x9a\x03q\x03\ +W\xff\xd7\x03q\x03X\xff\x9a\x03q\x03Y\xff\xd7\x03\ +q\x03Z\xff\x9a\x03q\x03[\xff\xd7\x03q\x03\x5c\xff\ +\x9a\x03q\x03]\xff\xd7\x03q\x03^\xff\x9a\x03q\x03\ +_\xff\xd7\x03q\x03`\xff\x9a\x03q\x03b\xff\xc3\x03\ +q\x03d\xff\xc3\x03q\x03f\xff\xc3\x03q\x03h\xff\ +\xc3\x03q\x03j\xff\xc3\x03q\x03l\xff\xc3\x03q\x03\ +n\xff\xc3\x03r\x00\x05\x00R\x03r\x00\x0a\x00R\x03\ +r\x00\x0f\xff\xae\x03r\x00\x11\xff\xae\x03r\x00\x22\x00\ +)\x03r\x02\x07\x00R\x03r\x02\x08\xff\xae\x03r\x02\ +\x0b\x00R\x03r\x02\x0c\xff\xae\x03s\x00\x0f\xff\x85\x03\ +s\x00\x11\xff\x85\x03s\x00\x22\x00)\x03s\x00$\xff\ +\x85\x03s\x00&\xff\xd7\x03s\x00*\xff\xd7\x03s\x00\ +2\xff\xd7\x03s\x004\xff\xd7\x03s\x00D\xff\x9a\x03\ +s\x00F\xff\x9a\x03s\x00G\xff\x9a\x03s\x00H\xff\ +\x9a\x03s\x00J\xff\xd7\x03s\x00P\xff\xc3\x03s\x00\ +Q\xff\xc3\x03s\x00R\xff\x9a\x03s\x00S\xff\xc3\x03\ +s\x00T\xff\x9a\x03s\x00U\xff\xc3\x03s\x00V\xff\ +\xae\x03s\x00X\xff\xc3\x03s\x00]\xff\xd7\x03s\x00\ +\x82\xff\x85\x03s\x00\x83\xff\x85\x03s\x00\x84\xff\x85\x03\ +s\x00\x85\xff\x85\x03s\x00\x86\xff\x85\x03s\x00\x87\xff\ +\x85\x03s\x00\x89\xff\xd7\x03s\x00\x94\xff\xd7\x03s\x00\ +\x95\xff\xd7\x03s\x00\x96\xff\xd7\x03s\x00\x97\xff\xd7\x03\ +s\x00\x98\xff\xd7\x03s\x00\x9a\xff\xd7\x03s\x00\xa2\xff\ +\x9a\x03s\x00\xa3\xff\x9a\x03s\x00\xa4\xff\x9a\x03s\x00\ +\xa5\xff\x9a\x03s\x00\xa6\xff\x9a\x03s\x00\xa7\xff\x9a\x03\ +s\x00\xa8\xff\x9a\x03s\x00\xa9\xff\x9a\x03s\x00\xaa\xff\ +\x9a\x03s\x00\xab\xff\x9a\x03s\x00\xac\xff\x9a\x03s\x00\ +\xad\xff\x9a\x03s\x00\xb4\xff\x9a\x03s\x00\xb5\xff\x9a\x03\ +s\x00\xb6\xff\x9a\x03s\x00\xb7\xff\x9a\x03s\x00\xb8\xff\ +\x9a\x03s\x00\xba\xff\x9a\x03s\x00\xbb\xff\xc3\x03s\x00\ +\xbc\xff\xc3\x03s\x00\xbd\xff\xc3\x03s\x00\xbe\xff\xc3\x03\ +s\x00\xc2\xff\x85\x03s\x00\xc3\xff\x9a\x03s\x00\xc4\xff\ +\x85\x03s\x00\xc5\xff\x9a\x03s\x00\xc6\xff\x85\x03s\x00\ +\xc7\xff\x9a\x03s\x00\xc8\xff\xd7\x03s\x00\xc9\xff\x9a\x03\ +s\x00\xca\xff\xd7\x03s\x00\xcb\xff\x9a\x03s\x00\xcc\xff\ +\xd7\x03s\x00\xcd\xff\x9a\x03s\x00\xce\xff\xd7\x03s\x00\ +\xcf\xff\x9a\x03s\x00\xd1\xff\x9a\x03s\x00\xd3\xff\x9a\x03\ +s\x00\xd5\xff\x9a\x03s\x00\xd7\xff\x9a\x03s\x00\xd9\xff\ +\x9a\x03s\x00\xdb\xff\x9a\x03s\x00\xdd\xff\x9a\x03s\x00\ +\xde\xff\xd7\x03s\x00\xdf\xff\xd7\x03s\x00\xe0\xff\xd7\x03\ +s\x00\xe1\xff\xd7\x03s\x00\xe2\xff\xd7\x03s\x00\xe3\xff\ +\xd7\x03s\x00\xe4\xff\xd7\x03s\x00\xe5\xff\xd7\x03s\x00\ +\xfa\xff\xc3\x03s\x01\x06\xff\xc3\x03s\x01\x08\xff\xc3\x03\ +s\x01\x0d\xff\xc3\x03s\x01\x0e\xff\xd7\x03s\x01\x0f\xff\ +\x9a\x03s\x01\x10\xff\xd7\x03s\x01\x11\xff\x9a\x03s\x01\ +\x12\xff\xd7\x03s\x01\x13\xff\x9a\x03s\x01\x14\xff\xd7\x03\ +s\x01\x15\xff\x9a\x03s\x01\x17\xff\xc3\x03s\x01\x19\xff\ +\xc3\x03s\x01\x1d\xff\xae\x03s\x01!\xff\xae\x03s\x01\ ++\xff\xc3\x03s\x01-\xff\xc3\x03s\x01/\xff\xc3\x03\ +s\x011\xff\xc3\x03s\x013\xff\xc3\x03s\x015\xff\ +\xc3\x03s\x01<\xff\xd7\x03s\x01>\xff\xd7\x03s\x01\ +@\xff\xd7\x03s\x01C\xff\x85\x03s\x01D\xff\x9a\x03\ +s\x01F\xff\x9a\x03s\x01G\xff\xd7\x03s\x01H\xff\ +\x9a\x03s\x01J\xff\xae\x03s\x02\x08\xff\x85\x03s\x02\ +\x0c\xff\x85\x03s\x02W\xff\xc3\x03s\x02X\xff\x85\x03\ +s\x02Y\xff\x9a\x03s\x02_\xff\xd7\x03s\x02`\xff\ +\x9a\x03s\x02b\xff\xc3\x03s\x03\x1d\xff\x85\x03s\x03\ +\x1e\xff\x9a\x03s\x03\x1f\xff\x85\x03s\x03 \xff\x9a\x03\ +s\x03!\xff\x85\x03s\x03\x22\xff\x9a\x03s\x03#\xff\ +\x85\x03s\x03%\xff\x85\x03s\x03&\xff\x9a\x03s\x03\ +'\xff\x85\x03s\x03(\xff\x9a\x03s\x03)\xff\x85\x03\ +s\x03*\xff\x9a\x03s\x03+\xff\x85\x03s\x03,\xff\ +\x9a\x03s\x03-\xff\x85\x03s\x03.\xff\x9a\x03s\x03\ +/\xff\x85\x03s\x030\xff\x9a\x03s\x031\xff\x85\x03\ +s\x032\xff\x9a\x03s\x033\xff\x85\x03s\x034\xff\ +\x9a\x03s\x036\xff\x9a\x03s\x038\xff\x9a\x03s\x03\ +:\xff\x9a\x03s\x03<\xff\x9a\x03s\x03@\xff\x9a\x03\ +s\x03B\xff\x9a\x03s\x03D\xff\x9a\x03s\x03I\xff\ +\xd7\x03s\x03J\xff\x9a\x03s\x03K\xff\xd7\x03s\x03\ +L\xff\x9a\x03s\x03M\xff\xd7\x03s\x03N\xff\x9a\x03\ +s\x03O\xff\xd7\x03s\x03Q\xff\xd7\x03s\x03R\xff\ +\x9a\x03s\x03S\xff\xd7\x03s\x03T\xff\x9a\x03s\x03\ +U\xff\xd7\x03s\x03V\xff\x9a\x03s\x03W\xff\xd7\x03\ +s\x03X\xff\x9a\x03s\x03Y\xff\xd7\x03s\x03Z\xff\ +\x9a\x03s\x03[\xff\xd7\x03s\x03\x5c\xff\x9a\x03s\x03\ +]\xff\xd7\x03s\x03^\xff\x9a\x03s\x03_\xff\xd7\x03\ +s\x03`\xff\x9a\x03s\x03b\xff\xc3\x03s\x03d\xff\ +\xc3\x03s\x03f\xff\xc3\x03s\x03h\xff\xc3\x03s\x03\ +j\xff\xc3\x03s\x03l\xff\xc3\x03s\x03n\xff\xc3\x03\ +t\x00\x05\x00R\x03t\x00\x0a\x00R\x03t\x00\x0f\xff\ +\xae\x03t\x00\x11\xff\xae\x03t\x00\x22\x00)\x03t\x02\ +\x07\x00R\x03t\x02\x08\xff\xae\x03t\x02\x0b\x00R\x03\ +t\x02\x0c\xff\xae\x03\x8d\x00\x05\x00{\x03\x8d\x00\x0a\x00\ +{\x03\x8d\x02\x07\x00{\x03\x8d\x02\x0b\x00{\x03\x8f\x00\ +\x0f\xff\x85\x03\x8f\x00\x10\xff\xae\x03\x8f\x00\x11\xff\x85\x03\ +\x8f\x00\x22\x00)\x03\x8f\x00$\xffq\x03\x8f\x00&\xff\ +\xd7\x03\x8f\x00*\xff\xd7\x03\x8f\x002\xff\xd7\x03\x8f\x00\ +4\xff\xd7\x03\x8f\x007\x00)\x03\x8f\x00D\xff\x5c\x03\ +\x8f\x00F\xffq\x03\x8f\x00G\xffq\x03\x8f\x00H\xff\ +q\x03\x8f\x00J\xffq\x03\x8f\x00P\xff\x9a\x03\x8f\x00\ +Q\xff\x9a\x03\x8f\x00R\xffq\x03\x8f\x00S\xff\x9a\x03\ +\x8f\x00T\xffq\x03\x8f\x00U\xff\x9a\x03\x8f\x00V\xff\ +\x85\x03\x8f\x00X\xff\x9a\x03\x8f\x00Y\xff\xd7\x03\x8f\x00\ +Z\xff\xd7\x03\x8f\x00[\xff\xd7\x03\x8f\x00\x5c\xff\xd7\x03\ +\x8f\x00]\xff\xae\x03\x8f\x00\x82\xffq\x03\x8f\x00\x83\xff\ +q\x03\x8f\x00\x84\xffq\x03\x8f\x00\x85\xffq\x03\x8f\x00\ +\x86\xffq\x03\x8f\x00\x87\xffq\x03\x8f\x00\x89\xff\xd7\x03\ +\x8f\x00\x94\xff\xd7\x03\x8f\x00\x95\xff\xd7\x03\x8f\x00\x96\xff\ +\xd7\x03\x8f\x00\x97\xff\xd7\x03\x8f\x00\x98\xff\xd7\x03\x8f\x00\ +\x9a\xff\xd7\x03\x8f\x00\xa2\xffq\x03\x8f\x00\xa3\xff\x5c\x03\ +\x8f\x00\xa4\xff\x5c\x03\x8f\x00\xa5\xff\x5c\x03\x8f\x00\xa6\xff\ +\x5c\x03\x8f\x00\xa7\xff\x5c\x03\x8f\x00\xa8\xff\x5c\x03\x8f\x00\ +\xa9\xffq\x03\x8f\x00\xaa\xffq\x03\x8f\x00\xab\xffq\x03\ +\x8f\x00\xac\xffq\x03\x8f\x00\xad\xffq\x03\x8f\x00\xb4\xff\ +q\x03\x8f\x00\xb5\xffq\x03\x8f\x00\xb6\xffq\x03\x8f\x00\ +\xb7\xffq\x03\x8f\x00\xb8\xffq\x03\x8f\x00\xba\xffq\x03\ +\x8f\x00\xbb\xff\x9a\x03\x8f\x00\xbc\xff\x9a\x03\x8f\x00\xbd\xff\ +\x9a\x03\x8f\x00\xbe\xff\x9a\x03\x8f\x00\xbf\xff\xd7\x03\x8f\x00\ +\xc2\xffq\x03\x8f\x00\xc3\xff\x5c\x03\x8f\x00\xc4\xffq\x03\ +\x8f\x00\xc5\xff\x5c\x03\x8f\x00\xc6\xffq\x03\x8f\x00\xc7\xff\ +\x5c\x03\x8f\x00\xc8\xff\xd7\x03\x8f\x00\xc9\xffq\x03\x8f\x00\ +\xca\xff\xd7\x03\x8f\x00\xcb\xffq\x03\x8f\x00\xcc\xff\xd7\x03\ +\x8f\x00\xcd\xffq\x03\x8f\x00\xce\xff\xd7\x03\x8f\x00\xcf\xff\ +q\x03\x8f\x00\xd1\xffq\x03\x8f\x00\xd3\xffq\x03\x8f\x00\ +\xd5\xffq\x03\x8f\x00\xd7\xffq\x03\x8f\x00\xd9\xffq\x03\ +\x8f\x00\xdb\xffq\x03\x8f\x00\xdd\xffq\x03\x8f\x00\xde\xff\ +\xd7\x03\x8f\x00\xdf\xffq\x03\x8f\x00\xe0\xff\xd7\x03\x8f\x00\ +\xe1\xffq\x03\x8f\x00\xe2\xff\xd7\x03\x8f\x00\xe3\xffq\x03\ +\x8f\x00\xe4\xff\xd7\x03\x8f\x00\xe5\xffq\x03\x8f\x00\xfa\xff\ +\x9a\x03\x8f\x01\x06\xff\x9a\x03\x8f\x01\x08\xff\x9a\x03\x8f\x01\ +\x0d\xff\x9a\x03\x8f\x01\x0e\xff\xd7\x03\x8f\x01\x0f\xffq\x03\ +\x8f\x01\x10\xff\xd7\x03\x8f\x01\x11\xffq\x03\x8f\x01\x12\xff\ +\xd7\x03\x8f\x01\x13\xffq\x03\x8f\x01\x14\xff\xd7\x03\x8f\x01\ +\x15\xffq\x03\x8f\x01\x17\xff\x9a\x03\x8f\x01\x19\xff\x9a\x03\ +\x8f\x01\x1d\xff\x85\x03\x8f\x01!\xff\x85\x03\x8f\x01$\x00\ +)\x03\x8f\x01&\x00)\x03\x8f\x01+\xff\x9a\x03\x8f\x01\ +-\xff\x9a\x03\x8f\x01/\xff\x9a\x03\x8f\x011\xff\x9a\x03\ +\x8f\x013\xff\x9a\x03\x8f\x015\xff\x9a\x03\x8f\x017\xff\ +\xd7\x03\x8f\x01<\xff\xae\x03\x8f\x01>\xff\xae\x03\x8f\x01\ +@\xff\xae\x03\x8f\x01C\xffq\x03\x8f\x01D\xff\x5c\x03\ +\x8f\x01F\xff\x5c\x03\x8f\x01G\xff\xd7\x03\x8f\x01H\xff\ +q\x03\x8f\x01J\xff\x85\x03\x8f\x01\xfb\xff\xd7\x03\x8f\x01\ +\xfd\xff\xd7\x03\x8f\x02\x02\xff\xae\x03\x8f\x02\x03\xff\xae\x03\ +\x8f\x02\x04\xff\xae\x03\x8f\x02\x08\xff\x85\x03\x8f\x02\x0c\xff\ +\x85\x03\x8f\x02W\xff\x9a\x03\x8f\x02X\xffq\x03\x8f\x02\ +Y\xff\x5c\x03\x8f\x02_\xff\xd7\x03\x8f\x02`\xffq\x03\ +\x8f\x02b\xff\x9a\x03\x8f\x03\x1d\xffq\x03\x8f\x03\x1e\xff\ +\x5c\x03\x8f\x03\x1f\xffq\x03\x8f\x03 \xff\x5c\x03\x8f\x03\ +!\xffq\x03\x8f\x03\x22\xff\x5c\x03\x8f\x03#\xffq\x03\ +\x8f\x03%\xffq\x03\x8f\x03&\xff\x5c\x03\x8f\x03'\xff\ +q\x03\x8f\x03(\xff\x5c\x03\x8f\x03)\xffq\x03\x8f\x03\ +*\xff\x5c\x03\x8f\x03+\xffq\x03\x8f\x03,\xff\x5c\x03\ +\x8f\x03-\xffq\x03\x8f\x03.\xff\x5c\x03\x8f\x03/\xff\ +q\x03\x8f\x030\xff\x5c\x03\x8f\x031\xffq\x03\x8f\x03\ +2\xff\x5c\x03\x8f\x033\xffq\x03\x8f\x034\xff\x5c\x03\ +\x8f\x036\xffq\x03\x8f\x038\xffq\x03\x8f\x03:\xff\ +q\x03\x8f\x03<\xffq\x03\x8f\x03@\xffq\x03\x8f\x03\ +B\xffq\x03\x8f\x03D\xffq\x03\x8f\x03I\xff\xd7\x03\ +\x8f\x03J\xffq\x03\x8f\x03K\xff\xd7\x03\x8f\x03L\xff\ +q\x03\x8f\x03M\xff\xd7\x03\x8f\x03N\xffq\x03\x8f\x03\ +O\xff\xd7\x03\x8f\x03Q\xff\xd7\x03\x8f\x03R\xffq\x03\ +\x8f\x03S\xff\xd7\x03\x8f\x03T\xffq\x03\x8f\x03U\xff\ +\xd7\x03\x8f\x03V\xffq\x03\x8f\x03W\xff\xd7\x03\x8f\x03\ +X\xffq\x03\x8f\x03Y\xff\xd7\x03\x8f\x03Z\xffq\x03\ +\x8f\x03[\xff\xd7\x03\x8f\x03\x5c\xffq\x03\x8f\x03]\xff\ +\xd7\x03\x8f\x03^\xffq\x03\x8f\x03_\xff\xd7\x03\x8f\x03\ +`\xffq\x03\x8f\x03b\xff\x9a\x03\x8f\x03d\xff\x9a\x03\ +\x8f\x03f\xff\x9a\x03\x8f\x03h\xff\x9a\x03\x8f\x03j\xff\ +\x9a\x03\x8f\x03l\xff\x9a\x03\x8f\x03n\xff\x9a\x03\x8f\x03\ +p\xff\xd7\x03\x8f\x03\x8f\x00)\x03\x90\x00\x05\x00)\x03\ +\x90\x00\x0a\x00)\x03\x90\x02\x07\x00)\x03\x90\x02\x0b\x00\ +)\x00\x00\x00\x00\x00\x1e\x01n\x00\x01\x00\x00\x00\x00\x00\ +\x00\x009\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x13\x00\ +9\x00\x01\x00\x00\x00\x00\x00\x02\x00\x06\x00L\x00\x01\x00\ +\x00\x00\x00\x00\x03\x00/\x00R\x00\x01\x00\x00\x00\x00\x00\ +\x04\x00\x1a\x00]\x00\x01\x00\x00\x00\x00\x00\x05\x00\x0c\x00\ +\x81\x00\x01\x00\x00\x00\x00\x00\x06\x00\x18\x00\x8d\x00\x01\x00\ +\x00\x00\x00\x00\x07\x00R\x00\xa5\x00\x01\x00\x00\x00\x00\x00\ +\x08\x00\x14\x00\xf7\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x1c\x01\ +\x0b\x00\x01\x00\x00\x00\x00\x00\x0c\x00.\x01'\x00\x01\x00\ +\x00\x00\x00\x00\x0d\x00.\x01U\x00\x01\x00\x00\x00\x00\x00\ +\x0e\x00*\x01\x83\x00\x01\x00\x00\x00\x00\x00\x10\x00\x09\x00\ +9\x00\x01\x00\x00\x00\x00\x00\x11\x00\x10\x00g\x00\x03\x00\ +\x01\x04\x09\x00\x00\x00r\x01\xad\x00\x03\x00\x01\x04\x09\x00\ +\x01\x00&\x02\x1f\x00\x03\x00\x01\x04\x09\x00\x02\x00\x0c\x02\ +E\x00\x03\x00\x01\x04\x09\x00\x03\x00^\x02Q\x00\x03\x00\ +\x01\x04\x09\x00\x04\x004\x02g\x00\x03\x00\x01\x04\x09\x00\ +\x05\x00\x18\x02\xaf\x00\x03\x00\x01\x04\x09\x00\x06\x000\x02\ +\xc7\x00\x03\x00\x01\x04\x09\x00\x07\x00\xa4\x02\xf7\x00\x03\x00\ +\x01\x04\x09\x00\x08\x00(\x03\x9b\x00\x03\x00\x01\x04\x09\x00\ +\x0b\x008\x03\xc3\x00\x03\x00\x01\x04\x09\x00\x0c\x00\x5c\x03\ +\xfb\x00\x03\x00\x01\x04\x09\x00\x0d\x00\x5c\x04W\x00\x03\x00\ +\x01\x04\x09\x00\x0e\x00T\x04\xb3\x00\x03\x00\x01\x04\x09\x00\ +\x10\x00\x12\x02\x1f\x00\x03\x00\x01\x04\x09\x00\x11\x00 \x02\ +{Digitized data \ +copyright \xa9 2010\ +-2011, Google Co\ +rporation.Open S\ +ans ExtraboldIta\ +licAscender - Op\ +en Sans Extrabol\ +d Italic Build 1\ +00Version 1.10Op\ +enSans-Extrabold\ +ItalicOpen Sans \ +is a trademark o\ +f Google and may\ + be registered i\ +n certain jurisd\ +ictions.Ascender\ + Corporationhttp\ +://www.ascenderc\ +orp.com/http://w\ +ww.ascendercorp.\ +com/typedesigner\ +s.htmlLicensed u\ +nder the Apache \ +License, Version\ + 2.0http://www.a\ +pache.org/licens\ +es/LICENSE-2.0\x00D\ +\x00i\x00g\x00i\x00t\x00i\x00z\x00e\x00d\ +\x00 \x00d\x00a\x00t\x00a\x00 \x00c\x00o\ +\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \ +\x00\xa9\x00 \x002\x000\x001\x000\x00-\x002\ +\x000\x001\x001\x00,\x00 \x00G\x00o\x00o\ +\x00g\x00l\x00e\x00 \x00C\x00o\x00r\x00p\ +\x00o\x00r\x00a\x00t\x00i\x00o\x00n\x00.\ +\x00O\x00p\x00e\x00n\x00 \x00S\x00a\x00n\ +\x00s\x00 \x00E\x00x\x00t\x00r\x00a\x00b\ +\x00o\x00l\x00d\x00I\x00t\x00a\x00l\x00i\ +\x00c\x00A\x00s\x00c\x00e\x00n\x00d\x00e\ +\x00r\x00 \x00-\x00 \x00O\x00p\x00e\x00n\ +\x00 \x00S\x00a\x00n\x00s\x00 \x00E\x00x\ +\x00t\x00r\x00a\x00b\x00o\x00l\x00d\x00 \ +\x00I\x00t\x00a\x00l\x00i\x00c\x00 \x00B\ +\x00u\x00i\x00l\x00d\x00 \x001\x000\x000\ +\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \ +\x001\x00.\x001\x000\x00O\x00p\x00e\x00n\ +\x00S\x00a\x00n\x00s\x00-\x00E\x00x\x00t\ +\x00r\x00a\x00b\x00o\x00l\x00d\x00I\x00t\ +\x00a\x00l\x00i\x00c\x00O\x00p\x00e\x00n\ +\x00 \x00S\x00a\x00n\x00s\x00 \x00i\x00s\ +\x00 \x00a\x00 \x00t\x00r\x00a\x00d\x00e\ +\x00m\x00a\x00r\x00k\x00 \x00o\x00f\x00 \ +\x00G\x00o\x00o\x00g\x00l\x00e\x00 \x00a\ +\x00n\x00d\x00 \x00m\x00a\x00y\x00 \x00b\ +\x00e\x00 \x00r\x00e\x00g\x00i\x00s\x00t\ +\x00e\x00r\x00e\x00d\x00 \x00i\x00n\x00 \ +\x00c\x00e\x00r\x00t\x00a\x00i\x00n\x00 \ +\x00j\x00u\x00r\x00i\x00s\x00d\x00i\x00c\ +\x00t\x00i\x00o\x00n\x00s\x00.\x00A\x00s\ +\x00c\x00e\x00n\x00d\x00e\x00r\x00 \x00C\ +\x00o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\ +\x00o\x00n\x00h\x00t\x00t\x00p\x00:\x00/\ +\x00/\x00w\x00w\x00w\x00.\x00a\x00s\x00c\ +\x00e\x00n\x00d\x00e\x00r\x00c\x00o\x00r\ +\x00p\x00.\x00c\x00o\x00m\x00/\x00h\x00t\ +\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\ +\x00.\x00a\x00s\x00c\x00e\x00n\x00d\x00e\ +\x00r\x00c\x00o\x00r\x00p\x00.\x00c\x00o\ +\x00m\x00/\x00t\x00y\x00p\x00e\x00d\x00e\ +\x00s\x00i\x00g\x00n\x00e\x00r\x00s\x00.\ +\x00h\x00t\x00m\x00l\x00L\x00i\x00c\x00e\ +\x00n\x00s\x00e\x00d\x00 \x00u\x00n\x00d\ +\x00e\x00r\x00 \x00t\x00h\x00e\x00 \x00A\ +\x00p\x00a\x00c\x00h\x00e\x00 \x00L\x00i\ +\x00c\x00e\x00n\x00s\x00e\x00,\x00 \x00V\ +\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x002\ +\x00.\x000\x00h\x00t\x00t\x00p\x00:\x00/\ +\x00/\x00w\x00w\x00w\x00.\x00a\x00p\x00a\ +\x00c\x00h\x00e\x00.\x00o\x00r\x00g\x00/\ +\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00s\ +\x00/\x00L\x00I\x00C\x00E\x00N\x00S\x00E\ +\x00-\x002\x00.\x000\x00\x00\x00\x00\x02\x00\x00\xff\ +\xf4\x00\x00\xfff\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xaa\x01\x02\x01\ +\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\ +\x0b\x01\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\ +\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\ +\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\x22\x01\ +#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\ ++\x01,\x01-\x01.\x01/\x010\x011\x012\x01\ +3\x014\x015\x016\x017\x018\x019\x01:\x01\ +;\x01<\x01=\x01>\x01?\x01@\x01A\x01B\x01\ +C\x01D\x01E\x01F\x01G\x01H\x01I\x01J\x01\ +K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01\ +S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x01\ +[\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x01\ +{\x01|\x01}\x01~\x01\x7f\x01\x80\x01\x81\x01\x82\x01\ +\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\ +\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\ +\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\ +\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\ +\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\ +\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\ +\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\ +\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\ +\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\ +\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\ +\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\ +\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\ +\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\ +\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\ +\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\ +\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\ +\x03\x02\x04\x02\x05\x02\x06\x02\x07\x02\x08\x02\x09\x02\x0a\x02\ +\x0b\x02\x0c\x02\x0d\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\ +\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\ +\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\x22\x02\ +#\x02$\x02%\x02&\x02'\x02(\x02)\x02*\x02\ ++\x02,\x02-\x02.\x02/\x020\x021\x022\x02\ +3\x024\x025\x026\x027\x028\x029\x02:\x02\ +;\x02<\x02=\x02>\x02?\x02@\x02A\x02B\x02\ +C\x02D\x02E\x02F\x02G\x02H\x02I\x02J\x02\ +K\x02L\x02M\x02N\x02O\x02P\x02Q\x02R\x02\ +S\x02T\x02U\x02V\x02W\x02X\x02Y\x02Z\x02\ +[\x02\x5c\x02]\x02^\x02_\x02`\x02a\x02b\x02\ +c\x02d\x02e\x02f\x02g\x02h\x02i\x02j\x02\ +k\x02l\x02m\x02n\x02o\x02p\x02q\x02r\x02\ +s\x02t\x02u\x02v\x02w\x02x\x02y\x02z\x02\ +{\x02|\x02}\x02~\x02\x7f\x02\x80\x02\x81\x02\x82\x02\ +\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\ +\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\ +\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\ +\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\ +\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\ +\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\ +\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\ +\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\ +\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\ +\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\ +\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\ +\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\ +\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\ +\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\ +\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\ +\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\ +\x03\x03\x04\x03\x05\x03\x06\x03\x07\x03\x08\x03\x09\x03\x0a\x03\ +\x0b\x03\x0c\x03\x0d\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\ +\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\ +\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\x22\x03\ +#\x03$\x03%\x03&\x03'\x03(\x03)\x03*\x03\ ++\x03,\x03-\x03.\x03/\x030\x031\x032\x03\ +3\x034\x035\x036\x037\x038\x039\x03:\x03\ +;\x03<\x03=\x03>\x03?\x03@\x03A\x03B\x03\ +C\x03D\x03E\x03F\x03G\x03H\x03I\x03J\x03\ +K\x03L\x03M\x03N\x03O\x03P\x03Q\x03R\x03\ +S\x03T\x03U\x03V\x03W\x03X\x03Y\x03Z\x03\ +[\x03\x5c\x03]\x03^\x03_\x03`\x03a\x03b\x03\ +c\x03d\x03e\x03f\x03g\x03h\x03i\x03j\x03\ +k\x03l\x03m\x03n\x03o\x03p\x03q\x03r\x03\ +s\x03t\x03u\x03v\x03w\x03x\x03y\x03z\x03\ +{\x03|\x03}\x03~\x03\x7f\x03\x80\x03\x81\x03\x82\x03\ +\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\ +\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\ +\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\ +\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\ +\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\ +\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x03\xb2\x03\ +\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\ +\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc2\x03\ +\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x03\xca\x03\ +\xcb\x03\xcc\x03\xcd\x03\xce\x03\xcf\x03\xd0\x03\xd1\x03\xd2\x03\ +\xd3\x03\xd4\x03\xd5\x03\xd6\x03\xd7\x03\xd8\x03\xd9\x03\xda\x03\ +\xdb\x03\xdc\x03\xdd\x03\xde\x03\xdf\x03\xe0\x03\xe1\x03\xe2\x03\ +\xe3\x03\xe4\x03\xe5\x03\xe6\x03\xe7\x03\xe8\x03\xe9\x03\xea\x03\ +\xeb\x03\xec\x03\xed\x03\xee\x03\xef\x03\xf0\x03\xf1\x03\xf2\x03\ +\xf3\x03\xf4\x03\xf5\x03\xf6\x03\xf7\x03\xf8\x03\xf9\x03\xfa\x03\ +\xfb\x03\xfc\x03\xfd\x03\xfe\x03\xff\x04\x00\x04\x01\x04\x02\x04\ +\x03\x04\x04\x04\x05\x04\x06\x04\x07\x04\x08\x04\x09\x04\x0a\x04\ +\x0b\x04\x0c\x04\x0d\x04\x0e\x04\x0f\x04\x10\x04\x11\x04\x12\x04\ +\x13\x04\x14\x04\x15\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\ +\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04 \x04!\x04\x22\x04\ +#\x04$\x04%\x04&\x04'\x04(\x04)\x04*\x04\ ++\x04,\x04-\x04.\x04/\x040\x041\x042\x04\ +3\x044\x045\x046\x047\x048\x049\x04:\x04\ +;\x04<\x04=\x04>\x04?\x04@\x04A\x04B\x04\ +C\x04D\x04E\x04F\x04G\x04H\x04I\x04J\x04\ +K\x04L\x04M\x04N\x04O\x04P\x04Q\x04R\x04\ +S\x04T\x04U\x04V\x04W\x04X\x04Y\x04Z\x04\ +[\x04\x5c\x04]\x04^\x04_\x04`\x04a\x04b\x04\ +c\x04d\x04e\x04f\x04g\x04h\x04i\x04j\x04\ +k\x04l\x04m\x04n\x04o\x04p\x04q\x04r\x04\ +s\x04t\x04u\x04v\x04w\x04x\x04y\x04z\x04\ +{\x04|\x04}\x04~\x04\x7f\x04\x80\x04\x81\x04\x82\x04\ +\x83\x04\x84\x04\x85\x04\x86\x04\x87\x04\x88\x04\x89\x04\x8a\x04\ +\x8b\x04\x8c\x04\x8d\x04\x8e\x04\x8f\x04\x90\x04\x91\x04\x92\x04\ +\x93\x04\x94\x04\x95\x04\x96\x04\x97\x04\x98\x04\x99\x04\x9a\x04\ +\x9b\x04\x9c\x04\x9d\x04\x9e\x04\x9f\x04\xa0\x04\xa1\x04\xa2\x04\ +\xa3\x04\xa4\x04\xa5\x04\xa6\x04\xa7\x04\xa8\x04\xa9\x04\xaa\x04\ +\xab\x07.notdef\x04null\x10n\ +onmarkingreturn\x05\ +space\x06exclam\x08quo\ +tedbl\x0anumbersign\ +\x06dollar\x07percent\x09\ +ampersand\x0bquotes\ +ingle\x09parenleft\x0a\ +parenright\x08aster\ +isk\x04plus\x05comma\x06h\ +yphen\x06period\x05sla\ +sh\x04zero\x03one\x03two\x05\ +three\x04four\x04five\x03\ +six\x05seven\x05eight\x04\ +nine\x05colon\x09semic\ +olon\x04less\x05equal\x07\ +greater\x08question\ +\x02at\x01A\x01B\x01C\x01D\x01E\x01F\x01\ +G\x01H\x05I.alt\x01J\x01K\x01L\x01\ +M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01\ +U\x01V\x01W\x01X\x01Y\x01Z\x0bbrac\ +ketleft\x09backslas\ +h\x0cbracketright\x0ba\ +sciicircum\x0aunder\ +score\x05grave\x01a\x01b\x01\ +c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x09\ +braceleft\x03bar\x0abr\ +aceright\x0aasciiti\ +lde\x10nonbreakings\ +pace\x0aexclamdown\x04\ +cent\x08sterling\x08cu\ +rrency\x03yen\x09broke\ +nbar\x07section\x08die\ +resis\x09copyright\x0b\ +ordfeminine\x0dguil\ +lemotleft\x0alogica\ +lnot\x07uni00AD\x0areg\ +istered\x09overscor\ +e\x06degree\x09plusmin\ +us\x0btwosuperior\x0dt\ +hreesuperior\x05acu\ +te\x02mu\x09paragraph\x0e\ +periodcentered\x07c\ +edilla\x0bonesuperi\ +or\x0cordmasculine\x0e\ +guillemotright\x0ao\ +nequarter\x07onehal\ +f\x0dthreequarters\x0c\ +questiondown\x06Agr\ +ave\x06Aacute\x0bAcirc\ +umflex\x06Atilde\x09Ad\ +ieresis\x05Aring\x02AE\ +\x08Ccedilla\x06Egrave\ +\x06Eacute\x0bEcircumf\ +lex\x09Edieresis\x0aIg\ +rave.alt\x0aIacute.\ +alt\x0fIcircumflex.\ +alt\x0dIdieresis.al\ +t\x03Eth\x06Ntilde\x06Ogr\ +ave\x06Oacute\x0bOcirc\ +umflex\x06Otilde\x09Od\ +ieresis\x08multiply\ +\x06Oslash\x06Ugrave\x06U\ +acute\x0bUcircumfle\ +x\x09Udieresis\x06Yacu\ +te\x05Thorn\x0agermand\ +bls\x06agrave\x06aacut\ +e\x0bacircumflex\x06at\ +ilde\x09adieresis\x05a\ +ring\x02ae\x08ccedilla\ +\x06egrave\x06eacute\x0be\ +circumflex\x09edier\ +esis\x06igrave\x06iacu\ +te\x0bicircumflex\x09i\ +dieresis\x03eth\x06nti\ +lde\x06ograve\x06oacut\ +e\x0bocircumflex\x06ot\ +ilde\x09odieresis\x06d\ +ivide\x06oslash\x06ugr\ +ave\x06uacute\x0bucirc\ +umflex\x09udieresis\ +\x06yacute\x05thorn\x09yd\ +ieresis\x07Amacron\x07\ +amacron\x06Abreve\x06a\ +breve\x07Aogonek\x07ao\ +gonek\x06Cacute\x06cac\ +ute\x0bCcircumflex\x0b\ +ccircumflex\x04Cdot\ +\x04cdot\x06Ccaron\x06cca\ +ron\x06Dcaron\x06dcaro\ +n\x06Dcroat\x06dcroat\x07\ +Emacron\x07emacron\x06\ +Ebreve\x06ebreve\x0aEd\ +otaccent\x0aedotacc\ +ent\x07Eogonek\x07eogo\ +nek\x06Ecaron\x06ecaro\ +n\x0bGcircumflex\x0bgc\ +ircumflex\x06Gbreve\ +\x06gbreve\x04Gdot\x04gdo\ +t\x0cGcommaaccent\x0cg\ +commaaccent\x0bHcir\ +cumflex\x0bhcircumf\ +lex\x04Hbar\x04hbar\x0aIt\ +ilde.alt\x06itilde\x0b\ +Imacron.alt\x07imac\ +ron\x0aIbreve.alt\x06i\ +breve\x0bIogonek.al\ +t\x07iogonek\x0eIdotac\ +cent.alt\x08dotless\ +i\x06IJ.alt\x02ij\x0bJcir\ +cumflex\x0bjcircumf\ +lex\x0cKcommaaccent\ +\x0ckcommaaccent\x0ckg\ +reenlandic\x06Lacut\ +e\x06lacute\x0cLcommaa\ +ccent\x0clcommaacce\ +nt\x06Lcaron\x06lcaron\ +\x04Ldot\x04ldot\x06Lslas\ +h\x06lslash\x06Nacute\x06\ +nacute\x0cNcommaacc\ +ent\x0cncommaaccent\ +\x06Ncaron\x06ncaron\x0bn\ +apostrophe\x03Eng\x03e\ +ng\x07Omacron\x07omacr\ +on\x06Obreve\x06obreve\ +\x0dOhungarumlaut\x0do\ +hungarumlaut\x02OE\x02\ +oe\x06Racute\x06racute\ +\x0cRcommaaccent\x0crc\ +ommaaccent\x06Rcaro\ +n\x06rcaron\x06Sacute\x06\ +sacute\x0bScircumfl\ +ex\x0bscircumflex\x08S\ +cedilla\x08scedilla\ +\x06Scaron\x06scaron\x0cT\ +commaaccent\x0ctcom\ +maaccent\x06Tcaron\x06\ +tcaron\x04Tbar\x04tbar\ +\x06Utilde\x06utilde\x07U\ +macron\x07umacron\x06U\ +breve\x06ubreve\x05Uri\ +ng\x05uring\x0dUhungar\ +umlaut\x0duhungarum\ +laut\x07Uogonek\x07uog\ +onek\x0bWcircumflex\ +\x0bwcircumflex\x0bYci\ +rcumflex\x0bycircum\ +flex\x09Ydieresis\x06Z\ +acute\x06zacute\x0aZdo\ +taccent\x0azdotacce\ +nt\x06Zcaron\x06zcaron\ +\x05longs\x06florin\x0aAr\ +ingacute\x0aaringac\ +ute\x07AEacute\x07aeac\ +ute\x0bOslashacute\x0b\ +oslashacute\x0cScom\ +maaccent\x0cscommaa\ +ccent\x0acircumflex\ +\x05caron\x06macron\x05br\ +eve\x09dotaccent\x04ri\ +ng\x06ogonek\x05tilde\x0c\ +hungarumlaut\x05ton\ +os\x0ddieresistonos\ +\x0aAlphatonos\x09anot\ +eleia\x0cEpsilonton\ +os\x08Etatonos\x0dIota\ +tonos.alt\x0cOmicro\ +ntonos\x0cUpsilonto\ +nos\x0aOmegatonos\x11i\ +otadieresistonos\ +\x05Alpha\x04Beta\x05Gamm\ +a\x07uni0394\x07Epsilo\ +n\x04Zeta\x03Eta\x05Theta\ +\x08Iota.alt\x05Kappa\x06\ +Lambda\x02Mu\x02Nu\x02Xi\x07\ +Omicron\x02Pi\x03Rho\x05S\ +igma\x03Tau\x07Upsilon\ +\x03Phi\x03Chi\x03Psi\x07uni\ +03A9\x10Iotadieresi\ +s.alt\x0fUpsilondie\ +resis\x0aalphatonos\ +\x0cepsilontonos\x08et\ +atonos\x09iotatonos\ +\x14upsilondieresis\ +tonos\x05alpha\x04beta\ +\x05gamma\x05delta\x07eps\ +ilon\x04zeta\x03eta\x05th\ +eta\x04iota\x05kappa\x06l\ +ambda\x07uni03BC\x02nu\ +\x02xi\x07omicron\x02pi\x03r\ +ho\x06sigma1\x05sigma\x03\ +tau\x07upsilon\x03phi\x03\ +chi\x03psi\x05omega\x0cio\ +tadieresis\x0fupsil\ +ondieresis\x0comicr\ +ontonos\x0cupsilont\ +onos\x0aomegatonos\x09\ +afii10023\x09afii10\ +051\x09afii10052\x09af\ +ii10053\x09afii1005\ +4\x0dafii10055.alt\x0d\ +afii10056.alt\x09af\ +ii10057\x09afii1005\ +8\x09afii10059\x09afii\ +10060\x09afii10061\x09\ +afii10062\x09afii10\ +145\x09afii10017\x09af\ +ii10018\x09afii1001\ +9\x09afii10020\x09afii\ +10021\x09afii10022\x09\ +afii10024\x09afii10\ +025\x09afii10026\x09af\ +ii10027\x09afii1002\ +8\x09afii10029\x09afii\ +10030\x09afii10031\x09\ +afii10032\x09afii10\ +033\x09afii10034\x09af\ +ii10035\x09afii1003\ +6\x09afii10037\x09afii\ +10038\x09afii10039\x09\ +afii10040\x09afii10\ +041\x09afii10042\x09af\ +ii10043\x09afii1004\ +4\x09afii10045\x09afii\ +10046\x09afii10047\x09\ +afii10048\x09afii10\ +049\x09afii10065\x09af\ +ii10066\x09afii1006\ +7\x09afii10068\x09afii\ +10069\x09afii10070\x09\ +afii10072\x09afii10\ +073\x09afii10074\x09af\ +ii10075\x09afii1007\ +6\x09afii10077\x09afii\ +10078\x09afii10079\x09\ +afii10080\x09afii10\ +081\x09afii10082\x09af\ +ii10083\x09afii1008\ +4\x09afii10085\x09afii\ +10086\x09afii10087\x09\ +afii10088\x09afii10\ +089\x09afii10090\x09af\ +ii10091\x09afii1009\ +2\x09afii10093\x09afii\ +10094\x09afii10095\x09\ +afii10096\x09afii10\ +097\x09afii10071\x09af\ +ii10099\x09afii1010\ +0\x09afii10101\x09afii\ +10102\x09afii10103\x09\ +afii10104\x09afii10\ +105\x09afii10106\x09af\ +ii10107\x09afii1010\ +8\x09afii10109\x09afii\ +10110\x09afii10193\x09\ +afii10050\x09afii10\ +098\x06Wgrave\x06wgrav\ +e\x06Wacute\x06wacute\x09\ +Wdieresis\x09wdiere\ +sis\x06Ygrave\x06ygrav\ +e\x06endash\x06emdash\x09\ +afii00208\x0dunders\ +coredbl\x09quotelef\ +t\x0aquoteright\x0equo\ +tesinglbase\x0dquot\ +ereversed\x0cquoted\ +blleft\x0dquotedblr\ +ight\x0cquotedblbas\ +e\x06dagger\x09daggerd\ +bl\x06bullet\x08ellips\ +is\x0bperthousand\x06m\ +inute\x06second\x0dgui\ +lsinglleft\x0eguils\ +inglright\x09exclam\ +dbl\x08fraction\x09nsu\ +perior\x05franc\x09afi\ +i08941\x06peseta\x04Eu\ +ro\x09afii61248\x09afi\ +i61289\x09afii61352\ +\x09trademark\x05Omega\ +\x09estimated\x09oneei\ +ghth\x0cthreeeighth\ +s\x0bfiveeighths\x0cse\ +veneighths\x0bparti\ +aldiff\x05Delta\x07pro\ +duct\x09summation\x05m\ +inus\x07radical\x08inf\ +inity\x08integral\x0ba\ +pproxequal\x08noteq\ +ual\x09lessequal\x0cgr\ +eaterequal\x07lozen\ +ge\x07uniFB01\x07uniFB\ +02\x0dcyrillicbreve\ +\x08dotlessj\x10caronc\ +ommaaccent\x0bcomma\ +accent\x11commaacce\ +ntrotate\x0czerosup\ +erior\x0cfoursuperi\ +or\x0cfivesuperior\x0b\ +sixsuperior\x0dseve\ +nsuperior\x0deights\ +uperior\x0cninesupe\ +rior\x07uni2000\x07uni\ +2001\x07uni2002\x07uni\ +2003\x07uni2004\x07uni\ +2005\x07uni2006\x07uni\ +2007\x07uni2008\x07uni\ +2009\x07uni200A\x07uni\ +200B\x07uniFEFF\x07uni\ +FFFC\x07uniFFFD\x07uni\ +01F0\x07uni02BC\x07uni\ +03D1\x07uni03D2\x07uni\ +03D6\x07uni1E3E\x07uni\ +1E3F\x07uni1E00\x07uni\ +1E01\x07uni1F4D\x07uni\ +02F3\x09dasiaoxia\x07u\ +niFB03\x07uniFB04\x05O\ +horn\x05ohorn\x05Uhorn\ +\x05uhorn\x07uni0300\x07u\ +ni0301\x07uni0303\x04h\ +ook\x08dotbelow\x07uni\ +0400\x07uni040D\x07uni\ +0450\x07uni045D\x07uni\ +0460\x07uni0461\x07uni\ +0462\x07uni0463\x07uni\ +0464\x07uni0465\x07uni\ +0466\x07uni0467\x07uni\ +0468\x07uni0469\x07uni\ +046A\x07uni046B\x07uni\ +046C\x07uni046D\x07uni\ +046E\x07uni046F\x07uni\ +0470\x07uni0471\x07uni\ +0472\x07uni0473\x07uni\ +0474\x07uni0475\x07uni\ +0476\x07uni0477\x07uni\ +0478\x07uni0479\x07uni\ +047A\x07uni047B\x07uni\ +047C\x07uni047D\x07uni\ +047E\x07uni047F\x07uni\ +0480\x07uni0481\x07uni\ +0482\x07uni0483\x07uni\ +0484\x07uni0485\x07uni\ +0486\x07uni0488\x07uni\ +0489\x07uni048A\x07uni\ +048B\x07uni048C\x07uni\ +048D\x07uni048E\x07uni\ +048F\x07uni0492\x07uni\ +0493\x07uni0494\x07uni\ +0495\x07uni0496\x07uni\ +0497\x07uni0498\x07uni\ +0499\x07uni049A\x07uni\ +049B\x07uni049C\x07uni\ +049D\x07uni049E\x07uni\ +049F\x07uni04A0\x07uni\ +04A1\x07uni04A2\x07uni\ +04A3\x07uni04A4\x07uni\ +04A5\x07uni04A6\x07uni\ +04A7\x07uni04A8\x07uni\ +04A9\x07uni04AA\x07uni\ +04AB\x07uni04AC\x07uni\ +04AD\x07uni04AE\x07uni\ +04AF\x07uni04B0\x07uni\ +04B1\x07uni04B2\x07uni\ +04B3\x07uni04B4\x07uni\ +04B5\x07uni04B6\x07uni\ +04B7\x07uni04B8\x07uni\ +04B9\x07uni04BA\x07uni\ +04BB\x07uni04BC\x07uni\ +04BD\x07uni04BE\x07uni\ +04BF\x0buni04C0.alt\ +\x07uni04C1\x07uni04C2\ +\x07uni04C3\x07uni04C4\ +\x07uni04C5\x07uni04C6\ +\x07uni04C7\x07uni04C8\ +\x07uni04C9\x07uni04CA\ +\x07uni04CB\x07uni04CC\ +\x07uni04CD\x07uni04CE\ +\x0buni04CF.alt\x07uni\ +04D0\x07uni04D1\x07uni\ +04D2\x07uni04D3\x07uni\ +04D4\x07uni04D5\x07uni\ +04D6\x07uni04D7\x07uni\ +04D8\x07uni04D9\x07uni\ +04DA\x07uni04DB\x07uni\ +04DC\x07uni04DD\x07uni\ +04DE\x07uni04DF\x07uni\ +04E0\x07uni04E1\x07uni\ +04E2\x07uni04E3\x07uni\ +04E4\x07uni04E5\x07uni\ +04E6\x07uni04E7\x07uni\ +04E8\x07uni04E9\x07uni\ +04EA\x07uni04EB\x07uni\ +04EC\x07uni04ED\x07uni\ +04EE\x07uni04EF\x07uni\ +04F0\x07uni04F1\x07uni\ +04F2\x07uni04F3\x07uni\ +04F4\x07uni04F5\x07uni\ +04F6\x07uni04F7\x07uni\ +04F8\x07uni04F9\x07uni\ +04FA\x07uni04FB\x07uni\ +04FC\x07uni04FD\x07uni\ +04FE\x07uni04FF\x07uni\ +0500\x07uni0501\x07uni\ +0502\x07uni0503\x07uni\ +0504\x07uni0505\x07uni\ +0506\x07uni0507\x07uni\ +0508\x07uni0509\x07uni\ +050A\x07uni050B\x07uni\ +050C\x07uni050D\x07uni\ +050E\x07uni050F\x07uni\ +0510\x07uni0511\x07uni\ +0512\x07uni0513\x07uni\ +1EA0\x07uni1EA1\x07uni\ +1EA2\x07uni1EA3\x07uni\ +1EA4\x07uni1EA5\x07uni\ +1EA6\x07uni1EA7\x07uni\ +1EA8\x07uni1EA9\x07uni\ +1EAA\x07uni1EAB\x07uni\ +1EAC\x07uni1EAD\x07uni\ +1EAE\x07uni1EAF\x07uni\ +1EB0\x07uni1EB1\x07uni\ +1EB2\x07uni1EB3\x07uni\ +1EB4\x07uni1EB5\x07uni\ +1EB6\x07uni1EB7\x07uni\ +1EB8\x07uni1EB9\x07uni\ +1EBA\x07uni1EBB\x07uni\ +1EBC\x07uni1EBD\x07uni\ +1EBE\x07uni1EBF\x07uni\ +1EC0\x07uni1EC1\x07uni\ +1EC2\x07uni1EC3\x07uni\ +1EC4\x07uni1EC5\x07uni\ +1EC6\x07uni1EC7\x0buni\ +1EC8.alt\x07uni1EC9\ +\x0buni1ECA.alt\x07uni\ +1ECB\x07uni1ECC\x07uni\ +1ECD\x07uni1ECE\x07uni\ +1ECF\x07uni1ED0\x07uni\ +1ED1\x07uni1ED2\x07uni\ +1ED3\x07uni1ED4\x07uni\ +1ED5\x07uni1ED6\x07uni\ +1ED7\x07uni1ED8\x07uni\ +1ED9\x07uni1EDA\x07uni\ +1EDB\x07uni1EDC\x07uni\ +1EDD\x07uni1EDE\x07uni\ +1EDF\x07uni1EE0\x07uni\ +1EE1\x07uni1EE2\x07uni\ +1EE3\x07uni1EE4\x07uni\ +1EE5\x07uni1EE6\x07uni\ +1EE7\x07uni1EE8\x07uni\ +1EE9\x07uni1EEA\x07uni\ +1EEB\x07uni1EEC\x07uni\ +1EED\x07uni1EEE\x07uni\ +1EEF\x07uni1EF0\x07uni\ +1EF1\x07uni1EF4\x07uni\ +1EF5\x07uni1EF6\x07uni\ +1EF7\x07uni1EF8\x07uni\ +1EF9\x07uni20AB\x07uni\ +030F\x13circumflexa\ +cutecomb\x13circumf\ +lexgravecomb\x12cir\ +cumflexhookcomb\x13\ +circumflextildec\ +omb\x0ebreveacuteco\ +mb\x0ebrevegravecom\ +b\x0dbrevehookcomb\x0e\ +brevetildecomb\x10c\ +yrillichookleft\x11\ +cyrillicbighookU\ +C\x11cyrillicbighoo\ +kLC\x08one.pnum\x07zer\ +o.os\x06one.os\x06two.\ +os\x08three.os\x07four\ +.os\x07five.os\x06six.\ +os\x08seven.os\x08eigh\ +t.os\x07nine.os\x02ff\x07\ +uni2120\x08Tcedilla\ +\x08tcedilla\x05g.alt\x0f\ +gcircumflex.alt\x0a\ +gbreve.alt\x08gdot.\ +alt\x10gcommaaccent\ +.alt\x01I\x06Igrave\x06Ia\ +cute\x0bIcircumflex\ +\x09Idieresis\x06Itild\ +e\x07Imacron\x06Ibreve\ +\x07Iogonek\x0aIdotacc\ +ent\x02IJ\x09Iotatonos\ +\x04Iota\x0cIotadieres\ +is\x09afii10055\x09afi\ +i10056\x07uni04C0\x07u\ +ni04CF\x07uni1EC8\x07u\ +ni1ECA\x00\x00\x01\x00\x03\x00\x08\x00\x0a\x00\ +\x0b\x00\x07\xff\xff\x00\x0f\x00\x01\x00\x00\x00\x0c\x00\x00\x00\ +\x16\x00\x00\x00\x02\x00\x01\x00\x00\x03\xa9\x00\x01\x00\x04\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x004\x00\ +6\x00\x01latn\x00\x08\x00\x10\x00\x02MOL\ + \x00\x16ROM \x00\x1c\x00\x00\xff\xff\x00\x00\x00\ +\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\ +\x01\x00\x00\x00\x0a\x00n\x01\xe4\x00\x01latn\x00\ +\x08\x00\x10\x00\x02MOL \x00(ROM \x00\ +B\x00\x00\xff\xff\x00\x09\x00\x03\x00\x08\x00\x0b\x00\x00\x00\ +\x0e\x00\x11\x00\x14\x00\x17\x00\x1a\x00\x00\xff\xff\x00\x0a\x00\ +\x04\x00\x06\x00\x09\x00\x0c\x00\x01\x00\x0f\x00\x12\x00\x15\x00\ +\x18\x00\x1b\x00\x00\xff\xff\x00\x0a\x00\x05\x00\x07\x00\x0a\x00\ +\x0d\x00\x02\x00\x10\x00\x13\x00\x16\x00\x19\x00\x1c\x00\x1dl\ +iga\x00\xb0liga\x00\xb6liga\x00\ +\xbclnum\x00\xc2lnum\x00\xc8lnu\ +m\x00\xcelocl\x00\xd4locl\x00\xdao\ +num\x00\xe0onum\x00\xe8onum\x00\ +\xf0pnum\x00\xf8pnum\x00\xfepnu\ +m\x01\x04salt\x01\x0asalt\x01\x12s\ +alt\x01\x1ass01\x01\x22ss01\x01\ +*ss01\x012ss02\x01:ss0\ +2\x01@ss02\x01Fss03\x01Ls\ +s03\x01Rss03\x01Xtnum\x01\ +^tnum\x01ftnum\x01n\x00\x00\x00\ +\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\ +\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\ +\x07\x00\x00\x00\x01\x00\x08\x00\x00\x00\x01\x00\x08\x00\x00\x00\ +\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\ +\x02\x00\x02\x00\x03\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\ +\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\ +\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\ +\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\ +\x05\x00\x06\x00\x0a\x00\x16\x00\x1e\x00&\x00.\x006\x00\ +>\x00F\x00N\x00V\x00^\x00\x01\x00\x00\x00\x01\x00\ +P\x00\x01\x00\x00\x00\x01\x00z\x00\x01\x00\x00\x00\x01\x00\ +\xaa\x00\x01\x00\x00\x00\x01\x00\xc6\x00\x01\x00\x00\x00\x01\x00\ +\xee\x00\x01\x00\x00\x00\x01\x00\xf4\x00\x01\x00\x00\x00\x01\x01\ +\x10\x00\x01\x00\x00\x00\x01\x01\x16\x00\x01\x00\x00\x00\x01\x01\ +2\x00\x04\x00\x00\x00\x01\x01H\x00\x02\x00\x10\x00\x05\x03\ +\x91\x03\x92\x03\x93\x03\x94\x03\x95\x00\x02\x00\x05\x00J\x00\ +J\x00\x00\x00\xdf\x00\xdf\x00\x01\x00\xe1\x00\xe1\x00\x02\x00\ +\xe3\x00\xe3\x00\x03\x00\xe5\x00\xe5\x00\x04\x00\x02\x00.\x00\ +\x14\x00,\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\xea\x00\xec\x00\ +\xee\x00\xf0\x00\xf2\x00\xf4\x01Z\x01g\x01w\x01\xa1\x01\ +\xa2\x02\xc9\x02\xd8\x03E\x03G\x00\x02\x00\x01\x03\x96\x03\ +\xa9\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\x84\x03\x85\x03\ +\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x00\x02\x00\ +\x01\x00\x13\x00\x1c\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\ +\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\ +\x84\x00\x02\x00\x03\x00\x13\x00\x13\x00\x00\x00\x15\x00\x1c\x00\ +\x01\x03\x82\x03\x82\x00\x09\x00\x02\x00\x08\x00\x01\x03\x82\x00\ +\x01\x00\x01\x00\x14\x00\x02\x00\x1a\x00\x0a\x00\x13\x00\x14\x00\ +\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\ +\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x08\x00\x01\x00\ +\x14\x00\x01\x00\x01\x03\x82\x00\x02\x00\x1a\x00\x0a\x00\x13\x03\ +\x82\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\ +\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x0e\x00\ +\x04\x03\x8f\x03\x90\x01 \x01!\x00\x02\x00\x02\x01$\x01\ +%\x00\x00\x01I\x01J\x00\x02\x00\x01\x006\x00\x01\x00\ +\x08\x00\x05\x00\x0c\x00\x14\x00\x1c\x00\x22\x00(\x02^\x00\ +\x03\x00I\x00O\x02]\x00\x03\x00I\x00L\x03\x8d\x00\ +\x02\x00I\x025\x00\x02\x00O\x024\x00\x02\x00L\x00\ +\x01\x00\x01\x00I\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\ +\x00\x00\x01\x00\x00\x15^\x00\x00\x00\x14\x00\x00\x00\x00\x00\ +\x00\x15V0\x82\x15R\x06\x09*\x86H\x86\xf7\x0d\x01\ +\x07\x02\xa0\x82\x15C0\x82\x15?\x02\x01\x011\x0b0\ +\x09\x06\x05+\x0e\x03\x02\x1a\x05\x000a\x06\x0a+\x06\ +\x01\x04\x01\x827\x02\x01\x04\xa0S0Q0,\x06\x0a\ ++\x06\x01\x04\x01\x827\x02\x01\x1c\xa2\x1e\x80\x1c\x00<\ +\x00<\x00<\x00O\x00b\x00s\x00o\x00l\x00e\ +\x00t\x00e\x00>\x00>\x00>0!0\x09\x06\x05\ ++\x0e\x03\x02\x1a\x05\x00\x04\x14-?\xf9\xb27\xbd,\ +\x053\xdaIL\xe6\xaff\xb8.C\x01\x07\xa0\x82\x11\ +]0\x82\x03z0\x82\x02b\xa0\x03\x02\x01\x02\x02\x10\ +8%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd5\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000\ +S1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1+0)\x06\x03U\x04\x03\ +\x13\x22VeriSign Time \ +Stamping Service\ +s CA0\x1e\x17\x0d07061500\ +0000Z\x17\x0d120614235\ +959Z0\x5c1\x0b0\x09\x06\x03U\x04\x06\x13\ +\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVe\ +riSign, Inc.1402\ +\x06\x03U\x04\x03\x13+VeriSign \ +Time Stamping Se\ +rvices Signer - \ +G20\x81\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\ +\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xc4\ +\xb5\xf2R\x15\xbc\x88\x86`)\x16J[/K\x91k\ +\x87\x91\xf35TX5\xea\xd16^bMRQ4\ +q\xc2{f\x1d\x89\xc8\xdd*\xc4j\x0a\xf67\xd9\x98\ +t\x91\xf6\x92\xae\xb0\xb5v\x96\xf1\xa9JcEG.\ +k\x0b\x92NK+\x8c\xeeXJ\x8b\xd4\x07\xe4\x1a,\ +\xf8\x82\xaaX\xd9\xcdB\xf3-\xc0u\xde\x8d\xab\xc7\x8e\ +\x1d\x9alL\x08\x95\x1e\xde\xdb\xefg\xe1r\xc2I\xc2\ +\x9e`<\xe1\xe2\xbe\x16\xa3cxi\x14{\xad-\x02\ +\x03\x01\x00\x01\xa3\x81\xc40\x81\xc104\x06\x08+\x06\ +\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\x08+\x06\ +\x01\x05\x05\x070\x01\x86\x18http://o\ +csp.verisign.com\ +0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x020\x0003\ +\x06\x03U\x1d\x1f\x04,0*0(\xa0&\xa0$\x86\ +\x22http://crl.veri\ +sign.com/tss-ca.\ +crl0\x16\x06\x03U\x1d%\x01\x01\xff\x04\x0c0\ +\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\ +\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x06\xc00\x1e\x06\x03U\ +\x1d\x11\x04\x170\x15\xa4\x130\x111\x0f0\x0d\x06\x03\ +U\x04\x03\x13\x06TSA1-20\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00P\ +\xc5K\xc8$\x80\xdf\xe4\x0d$\xc2\xde\x1a\xb1\xa1\x02\xa1\ +\xa6\x82-\x0c\x83\x15\x817\x0a\x82\x0e,\xb0Z\x17a\ +\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\x91\xb3V\x1a@\xa6\xeb\x92\ +\xbe89\xb0u6t:\x98O\xe47\xba\x99\x89\xca\ +\x95B\x1d\xb0\xb9\xc7\xa0\x8dW\xe0\xfa\xd5d\x04B5\ +N\x01\xd13\xa2\x17\xc8M\xaa'\xc7\xf2\xe1\x86L\x02\ +8M\x83x\xc6\xfcS\xe0\xeb\xe0\x06\x87\xdd\xa4\x96\x9e\ +^\x0c\x98\xe2\xa5\xbe\xbf\x82\x85\xc3`\xe1\xdf\xad(\xd8\ +\xc7\xa5Kd\xda\xc7\x1b[\xbd\xac9\x08\xd58\x22\xa1\ +3\x8b/\x8a\x9a\xeb\xbc\x07!?DA\x09\x07\xb5e\ +\x1c$\xbcH\xd3D\x80\xeb\xa1\xcf\xc9\x02\xb4\x14\xcfT\ +\xc7\x16\xa3\x80\x5c\xf9y>]r}\x88\x17\x9e,C\ +\xa2\xcaS\xce}=\xf6*:\xb8O\x94\x00\xa5m\x0a\ +\x83]\xf9^S\xf4\x18\xb3W\x0fp\xc3\xfb\xf5\xad\x95\ +\xa0\x0e\x17\xde\xc4\x16\x80`\xc9\x0f+n\x86\x04\xf1\xeb\ +\xf4x'\xd1\x05\xc5\xee4[^\xb9I2\xf230\ +\x82\x03\xc40\x82\x03-\xa0\x03\x02\x01\x02\x02\x10G\xbf\ +\x19\x95\xdf\x8dRFC\xf7\xdbmH\x0d1\xa40\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\x8b\ +1\x0b0\x09\x06\x03U\x04\x06\x13\x02ZA1\x150\ +\x13\x06\x03U\x04\x08\x13\x0cWestern \ +Cape1\x140\x12\x06\x03U\x04\x07\x13\x0bD\ +urbanville1\x0f0\x0d\x06\x03\ +U\x04\x0a\x13\x06Thawte1\x1d0\x1b\x06\ +\x03U\x04\x0b\x13\x14Thawte Cer\ +tification1\x1f0\x1d\x06\x03\ +U\x04\x03\x13\x16Thawte Time\ +stamping CA0\x1e\x17\x0d0\ +31204000000Z\x17\x0d13\ +1203235959Z0S1\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1+0)\x06\x03U\x04\x03\x13\x22Ve\ +riSign Time Stam\ +ping Services CA\ +0\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\ +\x00\xa9\xca\xb2\xa4\xcc\xcd \xaf\x0a}\x89\xac\x87u\xf0\ +\xb4N\xf1\xdf\xc1\x0f\xbfga\xbd\xa3d\x1c\xda\xbb\xf9\ +\xca3\xab\x840\x89X~\x8c\xdbk\xdd6\x9e\x0f\xbf\ +\xd1\xecx\xf2w\xa6~o<\xbf\x93\xaf\x0d\xbah\xf4\ +l\x94\xca\xbdR-\xabH=\xf5\xb6\xd5]_\x1b\x02\ +\x9f\xfa/k\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\x02\xe1\x7fL\ +R\xe3\x0e`\xec@\x1c~\xb9\x0d\xde?\xc7\xb4\xdf\x87\ +\xbd_zj1.\x03\x99\x81\x13\xa8G \xce1s\ +\x0dW-\xcdx43\x95\x12\x99\x12\xb9\xdeh/\xaa\ +\xe6\xe3\xc2\x8a\x8c*\xc3\x8b!\x87f\xbd\x83XWo\ +u\xbf<\xaa&\x87]\xca\x10\x15<\x9f\x84\xeaT\xc1\ +\x0an\xc4\xfe\xc5J\xdd\xb9\x07\x11\x97\x22|\xdb>'\ +\xd1\x1ex\xec\x9f1\xc9\xf1\xe6\x22\x19\xdb\xc4\xb3GC\ +\x9a\x1a_\xa0\x1e\x90\xe4^\xf5\xee|\xf1}\xabb\x01\ +\x8f\xf5M\x0b\xde\xd0\x22V\xa8\x95\xcd\xae\x88v\xae\xee\ +\xba\x0d\xf3\xe4M\xd9\xa0\xfbh\xa0\xae\x14;\xb3\x87\xc1\ +\xbb\x02\x03\x01\x00\x01\xa3\x81\xdb0\x81\xd804\x06\x08\ ++\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\x08\ ++\x06\x01\x05\x05\x070\x01\x86\x18http:/\ +/ocsp.verisign.c\ +om0\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\ +\x01\x01\xff\x02\x01\x000A\x06\x03U\x1d\x1f\x04:0\ +806\xa04\xa02\x860http://\ +crl.verisign.com\ +/ThawteTimestamp\ +ingCA.crl0\x13\x06\x03U\x1d%\ +\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\ +\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060$\ +\x06\x03U\x1d\x11\x04\x1d0\x1b\xa4\x190\x171\x150\ +\x13\x06\x03U\x04\x03\x13\x0cTSA2048-\ +1-530\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x00\x03\x81\x81\x00Jk\xf9\xeaX\xc2D\x1c1\ +\x89y\x99+\x96\xbf\x82\xac\x01\xd6\x1cL\xcd\xb0\x8aX\ +n\xdf\x08)\xa3^\xc8\xca\x93\x13\xe7\x04R\x0d\xefG\ +'/\x008\xb0\xe4\xc9\x93N\x9a\xd4\x22b\x15\xf7?\ +7!Op1\x80\xf1\x8b8\x87\xb3\xe8\xe8\x97\x00\xfe\ +\xcfU\x96N$\xd2\xa9'Nz\xae\xb7aA\xf3*\ +\xce\xe7\xc9\xd9^\xdd\xbb+\x85>\xb5\x9d\xb5\xd9\xe1W\ +\xff\xbe\xb4\xc5~\xf5\xcf\x0c\x9e\xf0\x97\xfe+\xd3;R\ +\x1b\x1b8'\xf7?J0\x82\x04\xfc0\x82\x04e\xa0\ +\x03\x02\x01\x02\x02\x10eR&\xe1\xb2.\x18\xe1Y\x0f\ +)\x85\xac\x22\xe7\x5c0\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x000_1\x0b0\x09\x06\x03U\x04\x06\ +\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0eV\ +eriSign, Inc.170\ +5\x06\x03U\x04\x0b\x13.Class 3 \ +Public Primary C\ +ertification Aut\ +hority0\x1e\x17\x0d090521\ +000000Z\x17\x0d1905202\ +35959Z0\x81\xb61\x0b0\x09\x06\x03U\ +\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\ +\x0eVeriSign, Inc.1\ +\x1f0\x1d\x06\x03U\x04\x0b\x13\x16VeriSi\ +gn Trust Network\ +1;09\x06\x03U\x04\x0b\x132Terms\ + of use at https\ +://www.verisign.\ +com/rpa (c)09100\ +.\x06\x03U\x04\x03\x13'VeriSign\ + Class 3 Code Si\ +gning 2009-2 CA0\ +\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\ +\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\x00\ +\xbeg\x1d\xb4`\xaa\x10IoV\x17|f\xc9^\x86\ +\x0d\xd5\xf1\xac\xa7q\x83\x8e\x8b\x89\xf8\x88\x04\x89\x15\x06\ +\xba-\x84!\x95\xe4\xd1\x9cPL\xfb\xd2\x22\xbd\xda\xf2\ +\xb25;\x1e\x8f\xc3\x09\xfb\xfc\x13.Z\xbf\x89|=\ +;%\x1e\xf6\xf3X{\x9c\xf4\x01\xb5\xc6\x0a\xb8\x80\xce\ +\xbe'tag'Mj\xe5\xec\x81aXy\xa3\xe0\ +\x17\x10\x12\x15'\xb0\xe1M4\x7f+G D\xb9\xde\ +f$f\x8a\xcdO\xba\x1f\xc58\xc8T\x90\xe1r\xf6\ +\x19fuj\xb9Ih\xcf8y\x0d\xaa0\xa8\xdb,\ +`H\x9e\xd7\xaa\x14\x01\xa9\x83\xd78\x9109\x13\x96\ +\x03:|@T\xb6\xad\xe0/\x1b\x83\xdc\xa8\x11R>\ +\x02\xb3\xd7+\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\xa9\xa6\x10P\ +\x0e4.M\xa7\xce\xc9^%\xd4\x8c\xbc\xf3n|)\ +\xbc\x01]\xfc1\x87Z\xd5\x8c\x85gX\x88\x19\xa0\xbf\ +5\xf0\xea+\xa3!\xe7\x90\xf6\x83\xe5\xa8\xed`x^\ +{`\x83\xfdW\x0b]A\x0dcT`\xd6C!\xef\ +\x02\x03\x01\x00\x01\xa3\x82\x01\xdb0\x82\x01\xd70\x12\x06\ +\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\ +\x000p\x06\x03U\x1d \x04i0g0e\x06\x0b\ +`\x86H\x01\x86\xf8E\x01\x07\x17\x030V0(\x06\ +\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps\ +://www.verisign.\ +com/cps0*\x06\x08+\x06\x01\x05\x05\ +\x07\x02\x020\x1e\x1a\x1chttps://w\ +ww.verisign.com/\ +rpa0\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\ +\x02\x01\x060m\x06\x08+\x06\x01\x05\x05\x07\x01\x0c\x04\ +a0_\xa1]\xa0[0Y0W0U\x16\x09i\ +mage/gif0!0\x1f0\x07\x06\x05\ ++\x0e\x03\x02\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\xac\x8d\x8ek\ +\xc3\xcf\x80j\xd4H\x18,{\x19.0%\x16#h\ +ttp://logo.veris\ +ign.com/vslogo.g\ +if0\x1d\x06\x03U\x1d%\x04\x160\x14\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\x05\x05\x07\x03\ +\x0304\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0\ +&0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18h\ +ttp://ocsp.veris\ +ign.com01\x06\x03U\x1d\x1f\x04*\ +0(0&\xa0$\xa0\x22\x86 http:/\ +/crl.verisign.co\ +m/pca3.crl0)\x06\x03U\x1d\ +\x11\x04\x220 \xa4\x1e0\x1c1\x1a0\x18\x06\x03U\ +\x04\x03\x13\x11Class3CA2048\ +-1-550\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\ +\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\ +\xa4\xa1\x1e\xf20\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x00\x03\x81\x81\x00\x8b\x03\xc0\xdd\x94\xd8A\xa2a\ +i\xb0\x15\xa8x\xc70\xc6\x90<~B\xf7$\xb6\xe4\ +\x83s\x17\x04\x7f\x04\x10\x9c\xa1\xe2\xfa\x81/\xeb\xc0\xca\ +D\xe7r\xe0P\xb6U\x10 \x83n\x96\x92\xe4\x9aQ\ +j\xb471\xdc\xa5-\xeb\x8c\x00\xc7\x1dO\xe7M2\ +\xba\x85\xf8N\xbe\xfagUe\xf0j\xbez\xcad8\ +\x1a\x10\x10xEv1\xf3\x86z\x03\x0f`\xc2\xb3]\ +\x9d\xf6\x8bfv\x82\x1bY\xe1\x83\xe5\xbdI\xa58V\ +\xe5\xdeAw\x0eX\x0f0\x82\x05\x130\x82\x03\xfb\xa0\ +\x03\x02\x01\x02\x02\x10f\xe3\xf0gy\xca\x15\x16mP\ +So\x88\x19\x1a\x830\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x000\x81\xb61\x0b0\x09\x06\x03U\x04\ +\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0e\ +VeriSign, Inc.1\x1f\ +0\x1d\x06\x03U\x04\x0b\x13\x16VeriSig\ +n Trust Network1\ +;09\x06\x03U\x04\x0b\x132Terms \ +of use at https:\ +//www.verisign.c\ +om/rpa (c)09100.\ +\x06\x03U\x04\x03\x13'VeriSign \ +Class 3 Code Sig\ +ning 2009-2 CA0\x1e\ +\x17\x0d100729000000Z\x17\ +\x0d120808235959Z0\x81\ +\xd01\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x16\ +0\x14\x06\x03U\x04\x08\x13\x0dMassach\ +usetts1\x0f0\x0d\x06\x03U\x04\x07\x13\ +\x06Woburn1\x1e0\x1c\x06\x03U\x04\x0a\ +\x14\x15Monotype Imagi\ +ng Inc.1>0<\x06\x03U\x04\x0b\ +\x135Digital ID Cla\ +ss 3 - Microsoft\ + Software Valida\ +tion v21\x180\x16\x06\x03U\x04\x0b\ +\x14\x0fType Operation\ +s1\x1e0\x1c\x06\x03U\x04\x03\x14\x15Mono\ +type Imaging Inc\ +.0\x81\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x94D\ +\xa0\x95i|U\x0d\xd0\xdb\x16\x8d25\x8aL3\xab\ +^ \xa1L\xd7*\x878\xd7\x98\xa5@\xf0\x19I\x0b\ +\x22\x1eSO\xc2C\xa6\xca\x8b\xa9V\xefnH\x06\xa8\ +\x05\x159\x1ec;$\x12\x90\xb9\x98\xcf\xca\x085}\ +r\xe3GW\xfdy\xcb\x8aJ\xe7@p-5c\x7f\ +\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\xd7\xa4\xa0\xdb\ +\x09\xf2\xa2\xf2{\xef\xcdu\xc1\xf7ePd\x22\x9d\xbd\ +}\xbc\xad\xb8K\xccXE\x0eM\xd1YLM\x02\x03\ +\x01\x00\x01\xa3\x82\x01\x830\x82\x01\x7f0\x09\x06\x03U\ +\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\ +\x04\x04\x03\x02\x07\x800D\x06\x03U\x1d\x1f\x04=0\ +;09\xa07\xa05\x863http://\ +csc3-2009-2-crl.\ +verisign.com/CSC\ +3-2009-2.crl0D\x06\x03\ +U\x1d \x04=0;09\x06\x0b`\x86H\x01\x86\ +\xf8E\x01\x07\x17\x030*0(\x06\x08+\x06\x01\x05\ +\x05\x07\x02\x01\x16\x1chttps://ww\ +w.verisign.com/r\ +pa0\x13\x06\x03U\x1d%\x04\x0c0\x0a\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x030u\x06\x08+\x06\x01\x05\x05\ +\x07\x01\x01\x04i0g0$\x06\x08+\x06\x01\x05\x05\ +\x070\x01\x86\x18http://ocsp\ +.verisign.com0?\x06\ +\x08+\x06\x01\x05\x05\x070\x02\x863http:\ +//csc3-2009-2-ai\ +a.verisign.com/C\ +SC3-2009-2.cer0\x1f\ +\x06\x03U\x1d#\x04\x180\x16\x80\x14\x97\xd0k\xa8&\ +p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf20\ +\x11\x06\x09`\x86H\x01\x86\xf8B\x01\x01\x04\x04\x03\x02\ +\x04\x100\x16\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1b\ +\x04\x080\x06\x01\x01\x00\x01\x01\xff0\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00N\xe6\ +\x22\x87\xdfgA\x15\x17\xe2\xd2\xee~\x0e\xce\xc2\x99\xd6\ +c\xbd\xf0\xb5\x93\xe5jrb\xe1\xf5\xd2<8\xee\xa8\ +=\x08_\xbaG\x81\x82_[KI\xf4\x1d \xfa\x0f\ +\x93\x09\xd0\x1d\x19VD\x17\xa2\x88\xf3\xfb\x8d\x9d\xae\xf7\ +\x0d5\xde<\x0c\xacD\x94`E*\x9b\xfe\x9boL\ +;\xb14gp\x10\x86\xffZ9\x5cZ\xe3l\x82\xab\ +5|eK\xfd\x98m\xb5\x15\x94I\x9c\x88p\x10\xbe\ +=\xb1b\x95\xb4\xdb\xb4\xd4\xda\xe8\x9dA\x90~\xfe}\ +\xb9\xa4\x92\xebn\xf2\x22\x8a\xc6w6M\x8aZ\x0bS\ +\x051\xd3+(\xafR\xe1\x8dzk\xb5wD\xbd\x0c\ +\xad\xf4]%,\xe3\xcd\x8a0>K\x03\x9cy\xca\xa6\ +N\xae\x0b\xc2\xcc$\x07\x0b\xc1\x94\x82\xf6\x10\xf1\xba\x90\ +\xb6\x9b\x9a\xd8\x5c<\x13\xf1\xea\x02\x06\x18'M<\x89\ +o3\x8a\xd3\x86\xde\xe9X3u=\xeb\x93i\xe2D\ +oN\x00l\xcf\xd5\x85\xdaV\xa6\x9a\xa6?\xcbL!\ +h\x90\xf2`\xba\xe1\xe8\x06]9!\x132\xed1\x82\ +\x03g0\x82\x03c\x02\x01\x010\x81\xcb0\x81\xb61\ +\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\ +\x06\x03U\x04\x0a\x13\x0eVeriSign,\ + Inc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16\ +VeriSign Trust N\ +etwork1;09\x06\x03U\x04\x0b\x13\ +2Terms of use at\ + https://www.ver\ +isign.com/rpa (c\ +)09100.\x06\x03U\x04\x03\x13'Ve\ +riSign Class 3 C\ +ode Signing 2009\ +-2 CA\x02\x10f\xe3\xf0gy\xca\x15\x16m\ +PSo\x88\x19\x1a\x830\x09\x06\x05+\x0e\x03\x02\x1a\ +\x05\x00\xa0p0\x10\x06\x0a+\x06\x01\x04\x01\x827\x02\ +\x01\x0c1\x020\x000\x19\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x031\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\ +\x040\x1c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x0b1\ +\x0e0\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x150\ +#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14\ +\x0b\xafwr,\xde\x0a\xc7P\xae\x94l\xc8\xfd\x82y\ +\xe4:\xc9\x160\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x04\x81\x80B\x02T\x0a\x05\x0f\xf7\xed\xf4O\ +?\x97\xd2\x86/\x02\x80\xf8U\xe5`P,\x0bzr\ +\xf0 \xfe\xd4L\xc3\x95Jq\x01C5\x8b,\xbe0\ +tt\xceH\xab\x92\xfc\xc6\xf8\xb5\x06\xbcvp~\xb8\ +_\xd1_\xcb\xb2\x17\xe6\xb0\x03\x84\x86\x7f\x16^\xcf>\ +\xa9\x1dPvW\xa4\xd9P\x8b\x1c\x14\xe6f\xe2\x9c\xb4\ +\x8a\x961d\xb0\xd9\xdb8s.\xd5 \xddn\xce\xfe\ +\xa3\x99&\xc3\xd5\xbc\x19=\x0b\xbf\xa7\xcbM\x85\xec\x11\ +`\xec\xd6\x18z\x8c\xa1\x82\x01\x7f0\x82\x01{\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x09\x061\x82\x01l0\x82\x01\ +h\x02\x01\x010g0S1\x0b0\x09\x06\x03U\x04\ +\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0e\ +VeriSign, Inc.1+\ +0)\x06\x03U\x04\x03\x13\x22VeriSig\ +n Time Stamping \ +Services CA\x02\x108%\xd7\ +\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd50\x09\x06\ +\x05+\x0e\x03\x02\x1a\x05\x00\xa0]0\x18\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x031\x0b\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x07\x010\x1c\x06\x09*\x86H\x86\xf7\x0d\x01\x09\ +\x051\x0f\x17\x0d11050516550\ +9Z0#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\ +\x16\x04\x14\xc9\x5c\xe6\x1c\x1e\xcc\xbbmZ\xe66T\x5c\ +\x05\xa7S\x9b\x8b\xd7f0\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x01\x05\x00\x04\x81\x80w\x82cm=\xaa\xdc\ +\x0d\xce+\xc3d{\x04\xe9\xc7\xb1L\xf7\x17\xa1)\xac\ +\xba\x87\xc5q\x99Jr\xff\x9c\x93np\x1c\xd05\xb9\ +BLo\x07:kK\xda\xbd\x22\xb2\xb3\xff^\xaa\xae\ +\xb5\xef\x1a\x8e\xbd\xd2\xc9\xa2[yI\xeaQ\xd4\xdb\xe5\ +\xfa\xf9\x9e\x13\x14\x80\xb4\xe9\xde\xe1\x164\xf4@\xb2w\ +\xd9yh\x81l;\xbb#Or\xdfi\xc2\xb0\xab1\ +\xea\xa49}\xcf\xf7v\x83\xda\xea\x97\x22=\x1a\xfa\x1f\ +\xab\xd9#\x0d\xcbcBY\x80\x00\x00\ +\x00\x03`\x90\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIG=\ +\x9c\xc4>\x00\x03K\x1c\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03F\xfc\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03G\x1c\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03GT\x00\x00\x03\xc6OS/2\xa2\ +\x0e\x97\xbd\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x10\ +\x91\x1a4\x00\x00\x1d\x9c\x00\x00\x00\xa6fpgm~\ +a\xb6\x11\x00\x00\x14\xd0\x00\x00\x07\xb4gasp\x00\ +\x08\x00\x1b\x00\x03F\xf0\x00\x00\x00\x0cglyfw\ +\xef\xf2\xd9\x00\x00%\x9c\x00\x01>\xb4head\xf7\ +\xbd\x9b\xaf\x00\x00\x01<\x00\x00\x006hhea\x0d\ +\xfb\x09\xe4\x00\x00\x01t\x00\x00\x00$hmtx\x84\ +\x99 e\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01dP\x00\x01\xb66loca\x97\ +\x97HV\x00\x00\x1eD\x00\x00\x07Vmaxp\x05\ +8\x01\xf7\x00\x00\x01\x98\x00\x00\x00 name$\ +\x14Ot\x00\x03\x1a\x88\x00\x00\x069post\x02\ +C\xefl\x00\x03 \xc4\x00\x00&+prepx\ +\xac\x9bn\x00\x00\x1c\x84\x00\x00\x01\x18\x00\x01\x00\x00\x00\ +\x01\x19\x9a\xf5\xe2\x1a\x1a_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9L\xea}\x00\x00\x00\x00\xc9\xe8Lx\xfb\ +T\xfd\xbe\x0a\x17\x08d\x00\x00\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x0a\x1d\xfb\ +T\xfe{\x0a\x17\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00W\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +\x03\x00\xe4\x00\x03\x00\x01\x00\x03\x04\xe2\x02X\x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x01\xf6\x00\x00\x02\x0b\x07\x06\x03\x08\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00\x00\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04R\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc1\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x025\x00\x85\x03}\x00\x85\x05\ ++\x00/\x04\x91\x00o\x06\xe5\x00T\x05\xec\x00`\x01\ +\xf2\x00\x85\x02\x89\x00R\x02\x89\x00=\x04b\x00J\x04\ +\x91\x00`\x02#\x00?\x02\x93\x00H\x023\x00\x85\x03\ +\x1f\x00\x10\x04\x91\x00X\x04\x91\x00\x9a\x04\x91\x00Z\x04\ +\x91\x00V\x04\x91\x00'\x04\x91\x00u\x04\x91\x00^\x04\ +\x91\x00J\x04\x91\x00X\x04\x91\x00V\x023\x00\x85\x02\ +9\x00?\x04\x91\x00`\x04\x91\x00f\x04\x91\x00`\x03\ +\xa0\x00\x10\x07/\x00o\x05J\x00\x00\x05H\x00\xc1\x05\ +\x12\x00y\x05\xdf\x00\xc1\x04w\x00\xc1\x04B\x00\xc1\x05\ +\xcf\x00y\x06\x02\x00\xc1\x02\xe3\x00J\x02d\xffd\x05\ +\x1d\x00\xc1\x04V\x00\xc1\x07b\x00\xc1\x06D\x00\xc1\x06\ +L\x00y\x04\xec\x00\xc1\x06L\x00y\x05\x1d\x00\xc1\x04\ +f\x00d\x04\x87\x00\x1d\x05\xf0\x00\xb4\x04\xfa\x00\x00\x07\ +\x91\x00\x0c\x04\xfa\x00\x04\x04\xbc\x00\x00\x04\x9a\x00B\x02\ +\xa4\x00\x9a\x03\x1f\x00\x10\x02\xa4\x003\x04L\x00\x1d\x03\ +o\xff\xfc\x04\xbc\x01j\x04\xa4\x00Z\x04\xfc\x00\xa8\x03\ +\xf6\x00f\x04\xfc\x00f\x04\x9c\x00f\x02\xe7\x00#\x04\ +s\x00\x17\x05\x14\x00\xa8\x02;\x00\x9a\x02;\xff\x87\x04\ +\x93\x00\xa8\x02;\x00\xa8\x07\xa6\x00\xa8\x05\x14\x00\xa8\x04\ +\xe3\x00f\x04\xfc\x00\xa8\x04\xfc\x00f\x03s\x00\xa8\x03\ +\xe5\x00b\x03%\x00'\x05\x14\x00\x9e\x04H\x00\x00\x06\ +\x89\x00\x14\x04h\x00\x19\x04J\x00\x00\x03\xd3\x00D\x03\ +\x17\x00-\x04h\x01\xd9\x02\xf8\x00-\x04\x91\x00`\x02\ +\x14\x00\x00\x025\x00\x85\x04\x91\x00\xa6\x04\x91\x00H\x04\ +\x91\x00u\x04\x91\x00\x12\x04h\x01\xd9\x04\x02\x00s\x04\ +\xbc\x01%\x06\xa8\x00d\x02\xf2\x009\x04s\x00R\x04\ +\x91\x00`\x02\x93\x00H\x06\xa8\x00d\x04\x00\xff\xfa\x03\ +m\x00m\x04\x91\x00`\x02\xe7\x003\x02\xe7\x00-\x04\ +\xbc\x01j\x05\x1d\x00\xa8\x05=\x00q\x023\x00\x85\x01\ +\xba\x00\x00\x02\xe7\x00T\x03\x0c\x00=\x04s\x00P\x06\ +\xa4\x00<\x06\xa4\x00.\x06\xa4\x007\x03\xa0\x007\x05\ +J\x00\x00\x05J\x00\x00\x05J\x00\x00\x05J\x00\x00\x05\ +J\x00\x00\x05J\x00\x00\x07L\xff\xfe\x05\x12\x00y\x04\ +w\x00\xc1\x04w\x00\xc1\x04w\x00\xc1\x04w\x00\xc1\x02\ +\xe3\x004\x02\xe3\x00J\x02\xe3\xff\xee\x02\xe3\x00:\x05\ +\xd9\x00/\x06D\x00\xc1\x06L\x00y\x06L\x00y\x06\ +L\x00y\x06L\x00y\x06L\x00y\x04\x91\x00\x83\x06\ +L\x00y\x05\xf0\x00\xb4\x05\xf0\x00\xb4\x05\xf0\x00\xb4\x05\ +\xf0\x00\xb4\x04\xbc\x00\x00\x04\xf4\x00\xc1\x05T\x00\xa8\x04\ +\xa4\x00Z\x04\xa4\x00Z\x04\xa4\x00Z\x04\xa4\x00Z\x04\ +\xa4\x00Z\x04\xa4\x00Z\x07\x19\x00Z\x03\xf6\x00f\x04\ +\x9c\x00f\x04\x9c\x00f\x04\x9c\x00f\x04\x9c\x00f\x02\ +;\xff\xbb\x02;\x00\x9c\x02;\xff\x9c\x02;\xff\xe7\x04\ +\xdb\x00f\x05\x14\x00\xa8\x04\xe3\x00f\x04\xe3\x00f\x04\ +\xe3\x00f\x04\xe3\x00f\x04\xe3\x00f\x04\x91\x00`\x04\ +\xe3\x00f\x05\x14\x00\x9e\x05\x14\x00\x9e\x05\x14\x00\x9e\x05\ +\x14\x00\x9e\x04J\x00\x00\x04\xfc\x00\xa8\x04J\x00\x00\x05\ +J\x00\x00\x04\xa4\x00Z\x05J\x00\x00\x04\xa4\x00Z\x05\ +J\x00\x00\x04\xa4\x00Z\x05\x12\x00y\x03\xf6\x00f\x05\ +\x12\x00y\x03\xf6\x00f\x05\x12\x00y\x03\xf6\x00f\x05\ +\x12\x00y\x03\xf6\x00f\x05\xdf\x00\xc1\x04\xfc\x00f\x05\ +\xd9\x00/\x05\x0c\x00f\x04w\x00\xc1\x04\x9c\x00f\x04\ +w\x00\xc1\x04\x9c\x00f\x04w\x00\xc1\x04\x9c\x00f\x04\ +w\x00\xc1\x04\x9c\x00f\x04w\x00\xc1\x04\x9c\x00f\x05\ +\xcf\x00y\x04s\x00\x17\x05\xcf\x00y\x04s\x00\x17\x05\ +\xcf\x00y\x04s\x00\x17\x05\xcf\x00y\x04s\x00\x17\x06\ +\x02\x00\xc1\x05\x14\x00\xa8\x06\x02\x00\x00\x05\x14\x00\x0c\x02\ +\xe3\xff\xeb\x02;\xff\x97\x02\xe3\x004\x02;\xff\xe0\x02\ +\xe3\x00\x13\x02;\xff\xbd\x02\xe3\x00J\x02;\x000\x02\ +\xe3\x00J\x02;\x00\xa8\x05H\x00J\x04b\x00\x9a\x02\ +d\xffd\x02;\xff\x87\x05\x1d\x00\xc1\x04\x93\x00\xa8\x04\ +\x8d\x00\xa8\x04V\x00\xc1\x02;\x00\xa8\x04V\x00\xc1\x02\ +;\x00]\x04V\x00\xc1\x02;\x00\xa8\x04V\x00\xc1\x02\ +\xf8\x00\xa8\x04Z\x00\x0e\x02\x5c\xff\xfe\x06D\x00\xc1\x05\ +\x14\x00\xa8\x06D\x00\xc1\x05\x14\x00\xa8\x06D\x00\xc1\x05\ +\x14\x00\xa8\x05\xd7\x00\x03\x06D\x00\xc1\x05\x14\x00\xa8\x06\ +L\x00y\x04\xe3\x00f\x06L\x00y\x04\xe3\x00f\x06\ +L\x00y\x04\xe3\x00f\x07\x96\x00y\x07\xae\x00f\x05\ +\x1d\x00\xc1\x03s\x00\xa8\x05\x1d\x00\xc1\x03s\x00a\x05\ +\x1d\x00\xc1\x03s\x00k\x04f\x00d\x03\xe5\x00b\x04\ +f\x00d\x03\xe5\x00b\x04f\x00d\x03\xe5\x00b\x04\ +f\x00d\x03\xe5\x00b\x04\x87\x00\x1d\x03%\x00'\x04\ +\x87\x00\x1d\x03%\x00'\x04\x87\x00\x1d\x03%\x00'\x05\ +\xf0\x00\xb4\x05\x14\x00\x9e\x05\xf0\x00\xb4\x05\x14\x00\x9e\x05\ +\xf0\x00\xb4\x05\x14\x00\x9e\x05\xf0\x00\xb4\x05\x14\x00\x9e\x05\ +\xf0\x00\xb4\x05\x14\x00\x9e\x05\xf0\x00\xb4\x05\x14\x00\x9e\x07\ +\x91\x00\x0c\x06\x89\x00\x14\x04\xbc\x00\x00\x04J\x00\x00\x04\ +\xbc\x00\x00\x04\x9a\x00B\x03\xd3\x00D\x04\x9a\x00B\x03\ +\xd3\x00D\x04\x9a\x00B\x03\xd3\x00D\x02\xcf\x00\xa8\x04\ +\x98\x00\xc3\x05L\x00\x00\x04\xa4\x00Z\x07L\xff\xfe\x07\ +\x19\x00Z\x06L\x00y\x04\xe3\x00f\x04f\x00d\x03\ +\xe5\x00b\x04\xcb\x00\xe3\x04\xcb\x00\xe3\x04\xc7\x01#\x04\ +\xcb\x01\x04\x02;\x00\x9a\x04\x9e\x01`\x01\x9c\x00\x17\x04\ +\xcb\x00\xec\x04\xa8\x00\xc1\x04\x9e\x01\xe9\x04\x9e\x00\xe9\x05\ +J\xff\xf2\x023\x00\x85\x04\xfe\xff\xb9\x06\x96\xff\xb9\x03\ +\xd7\xff\xc1\x06\x98\xff\xd6\x05\xd1\xff\xaf\x06d\xff\xd6\x02\ +\xfc\xff\xd8\x05J\x00\x00\x05H\x00\xc1\x04R\x00\xc1\x04\ +\xec\x00/\x04w\x00\xc1\x04\x9a\x00B\x06\x02\x00\xc1\x06\ +L\x00y\x02\xe3\x00J\x05\x1d\x00\xc1\x05\x02\x00\x00\x07\ +b\x00\xc1\x06D\x00\xc1\x04\x7f\x00L\x06L\x00y\x05\ +\xe5\x00\xc1\x04\xec\x00\xc1\x04\xa4\x00L\x04\x87\x00\x1d\x04\ +\xbc\x00\x00\x06\xa2\x00b\x04\xfa\x00\x04\x06\xb0\x00m\x06\ +F\x00D\x02\xe3\x00:\x04\xbc\x00\x00\x05\x08\x00f\x04\ +\x1f\x00T\x05\x14\x00\xa8\x02\xfc\x00\xa4\x05\x04\x00\x9a\x05\ +\x08\x00f\x05'\x00\xa8\x04R\x00\x06\x04\xcb\x00f\x04\ +\x1f\x00T\x03\xec\x00f\x05\x14\x00\xa8\x04\xd7\x00f\x02\ +\xfc\x00\xa4\x04\x8d\x00\xa8\x04\x98\xff\xfc\x05\x1d\x00\xa8\x04\ +\x8b\x00\x02\x03\xe3\x00f\x04\xe3\x00f\x05\x8d\x00\x19\x04\ +\xe3\x00\x8f\x03\xec\x00f\x05\x10\x00f\x04\x0a\x00\x1d\x05\ +\x04\x00\x9a\x06\x0a\x00f\x04\x8d\xff\xdd\x06\x5c\x00\x9a\x06\ +\x8b\x00o\x02\xfc\x00\x09\x05\x04\x00\x9a\x04\xe3\x00f\x05\ +\x04\x00\x9a\x06\x8b\x00o\x04w\x00\xc1\x06'\x00\x1d\x04\ +R\x00\xc1\x05D\x00y\x04f\x00d\x02\xe3\x00J\x02\ +\xe3\x00:\x02d\xffd\x07\xb6\x00\x08\x07\xd1\x00\xc1\x06\ +'\x00\x1d\x05#\x00\xc1\x05\x19\x00\x0c\x05\xe5\x00\xc1\x05\ +J\x00\x00\x05\x00\x00\xc1\x05H\x00\xc1\x04R\x00\xc1\x05\ +\xc9\x00\x0c\x04w\x00\xc1\x07%\x00\x00\x04\xe9\x00X\x06\ +V\x00\xc1\x06V\x00\xc1\x05#\x00\xc1\x05\xcb\x00\x08\x07\ +b\x00\xc1\x06\x02\x00\xc1\x06L\x00y\x05\xe5\x00\xc1\x04\ +\xec\x00\xc1\x05\x12\x00y\x04\x87\x00\x1d\x05\x19\x00\x0c\x06\ +\xa2\x00b\x04\xfa\x00\x04\x06\x12\x00\xc1\x05\xb0\x00\x8b\x08\ +q\x00\xc1\x08\x96\x00\xc1\x05\xa8\x00\x08\x07\x08\x00\xc1\x05\ +\x1f\x00\xc1\x05+\x00B\x08{\x00\xc1\x053\x00\x14\x04\ +\xa4\x00Z\x04\xdf\x00h\x04\xd5\x00\xa8\x03\xa0\x00\xa8\x04\ +\xf2\x00#\x04\x9c\x00f\x06o\x00\x02\x04'\x00H\x05\ +j\x00\xa8\x05j\x00\xa8\x04\x8d\x00\xa8\x04\xdd\x00\x08\x06\ +P\x00\xa8\x05/\x00\xa8\x04\xe3\x00f\x05\x17\x00\xa8\x04\ +\xfc\x00\xa8\x03\xf6\x00f\x04\x14\x00+\x04J\x00\x00\x06\ +\x1d\x00f\x04h\x00\x19\x05B\x00\xa8\x05\x0e\x00\x8b\x07\ +o\x00\xa8\x07\x87\x00\xa8\x05\x9e\x00\x14\x06{\x00\xa8\x04\ +\xd3\x00\xa8\x04\x04\x00B\x06\xd5\x00\xa8\x04\x98\x00\x12\x04\ +\x9c\x00f\x05\x14\x00\x0c\x03\xa0\x00\xa8\x04\x10\x00f\x03\ +\xe5\x00b\x02;\x00\x9a\x02;\xff\xe9\x02;\xff\x87\x06\ +\xe5\x00\x08\x07\x19\x00\xa8\x05\x14\x00\x0c\x04\x8d\x00\xa8\x04\ +J\x00\x00\x05+\x00\xa8\x04o\x00\xc1\x03\xc3\x00\xa8\x07\ +\x91\x00\x0c\x06\x89\x00\x14\x07\x91\x00\x0c\x06\x89\x00\x14\x07\ +\x91\x00\x0c\x06\x89\x00\x14\x04\xbc\x00\x00\x04J\x00\x00\x04\ +\x00\x00R\x08\x00\x00R\x08\x00\x00R\x03J\xff\xfc\x01\ +\x8b\x00\x19\x01\x8b\x00\x19\x02%\x00?\x01\x8b\x00\x19\x03\ +-\x00\x19\x03-\x00\x19\x03\xb0\x00+\x04\x12\x00{\x04\ +%\x00{\x03\x02\x00\x83\x06\x8d\x00\x85\x09\xee\x00R\x01\ +\xf2\x00\x85\x03}\x00\x85\x02\xb0\x00R\x02\xb0\x00P\x04\ +h\x00\x85\x01\x0a\xfew\x03D\x00h\x04\x91\x00B\x04\ +\x91\x00J\x06\x9e\x00\xa8\x04\xa4\x00?\x06y\x00f\x04\ +)\x00P\x08/\x00\xa8\x06\x19\x00\x1b\x06F\x00D\x04\ +\xf4\x00f\x06\xa4\x00A\x06\xa4\x00-\x06\xa4\x00P\x06\ +\xa4\x00V\x04\xa6\x00P\x04\xec\x00/\x05\xec\x00\xb6\x05\ +\x0c\x009\x04\x91\x00`\x04d\x00%\x05\xa6\x00s\x03\ +/\x00\x06\x04\x91\x00\x5c\x04\x91\x00`\x04\x91\x00^\x04\ +\x91\x00`\x04\xaa\x00b\x05#\x00#\x05#\x00#\x04\ +\x9e\x00\xa2\x02;\xff\x87\x04\x00\x01s\x04\x00\x01f\x04\ +\x00\x01f\x02\xe7\x00'\x02\xe7\x00\x10\x02\xe7\x00H\x02\ +\xe7\x00+\x02\xe7\x009\x02\xe7\x00/\x02\xe7\x00'\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +3\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00T\x08\x00\x00T\x02;\xff\x87\x01\ +\x89\x00\x10\x05j\x00\x19\x04\xc9\x00\x00\x07Z\x00#\x07\ +b\x00\xc1\x07\xa6\x00\xa8\x05J\x00\x00\x04\xa4\x00Z\x06\ +\x81\xfe\xa7\x02\xaa\x00f\x02\x9a\x00\x87\x08\x0a\x00#\x08\ +\x0a\x00#\x06j\x00y\x05'\x00f\x06\x9c\x00\xb4\x05\ +\xb2\x00\x9e\x00\x00\xfc4\x00\x00\xfc\xee\x00\x00\xfb\xfd\x00\ +\x00\xfc\xf0\x00\x00\xfd\x0a\x04w\x00\xc1\x06V\x00\xc1\x04\ +\x9c\x00f\x05j\x00\xa8\x08d\x00}\x06\xd1\x00\x02\x05\ +d\x00\x0a\x05-\x00\x0a\x07y\x00\xc1\x06%\x00\xa8\x05\ +\xa2\x00\x00\x04\xd1\x00\x04\x07\xb4\x00\xc1\x06\xac\x00\xa8\x06\ +\x19\x00\x1f\x05\x0e\x00\x10\x08/\x00\xc1\x06\xe7\x00\xa8\x04\ +\xdb\x003\x04'\x00\x1b\x06\xb0\x00m\x06\x5c\x00\x9a\x06\ +N\x00y\x04\xe3\x00f\x05^\x00\x00\x04q\x00\x00\x05\ +^\x00\x00\x04q\x00\x00\x0a\x1d\x00y\x08\xd3\x00f\x06\ +\x9e\x00y\x05X\x00f\x08X\x00y\x06\xcb\x00f\x08\ +J\x00j\x06\xd1\x00\x02\x05D\x00y\x04\x0c\x00f\x04\ +\xdf\x00h\x04u\x00\xbe\x04\x9e\x00\xf6\x04\x9e\x01\xd5\x04\ +\x9e\x01\xd7\x07\xe9\x00)\x07\xa6\x00)\x06\xbe\x00\xc1\x05\ +\xc7\x00\xa8\x04\xe9\x00/\x04\xd3\x00\x0c\x04\xf4\x00\xc1\x04\ +\xfc\x00\xa8\x04X\x00/\x03\xac\x00\x0a\x05\x81\x00\xc1\x04\ +\x81\x00\xa8\x07\xac\x00\x00\x06\xe3\x00\x02\x04\xe9\x00X\x04\ +'\x00H\x05\xaa\x00\xc1\x04\xd7\x00\xa8\x05\x1d\x00\xc1\x04\ +\x87\x00\xa8\x05\x1d\x00/\x04\x8b\x00\x0c\x05\xb0\x00\x08\x05\ +=\x00\x14\x06X\x00\xc1\x05\x8f\x00\xa8\x06\x96\x00\xc1\x05\ +\xfa\x00\xa8\x08\xc5\x00\xc1\x07\x04\x00\xa8\x069\x00y\x05\ +/\x00f\x05\x12\x00y\x03\xf6\x00f\x04\x87\x00\x1d\x04\ +\x10\x00+\x04\xbc\x00\x00\x04L\x00\x00\x04\xbc\x00\x00\x04\ +L\x00\x00\x05s\x00\x04\x04\xba\x00\x19\x07#\x00\x1d\x06\ +\x08\x00+\x05\xfc\x00\x8b\x05V\x00\x8b\x05\xb0\x00\x8b\x05\ +\x06\x00\x8b\x05\xb0\x00\xc1\x05\x00\x00\xa8\x07%\x00\x1f\x05\ +\x7f\x00\x19\x07%\x00\x1f\x05\x7f\x00\x19\x02\xe3\x00J\x07\ +%\x00\x00\x06o\x00\x02\x05\xcb\x00\xc1\x04\xd7\x00\xa8\x06\ +-\x00\x08\x051\x00\x08\x05\xf8\x00\xc1\x05\x1d\x00\xa8\x06\ +h\x00\xc1\x05\x96\x00\xa8\x05\xb0\x00\x8b\x05\x0e\x00\x8b\x07\ +\xc3\x00\xc1\x06\xa6\x00\xa8\x02\xe3\x00J\x05J\x00\x00\x04\ +\xa4\x00Z\x05J\x00\x00\x04\xa4\x00Z\x07L\xff\xfe\x07\ +\x19\x00Z\x04w\x00\xb0\x04\x9c\x00f\x06/\x00\x8b\x04\ +\xa4\x00`\x06/\x00\x8b\x04\xa4\x00`\x07%\x00\x00\x06\ +o\x00\x02\x04\xe9\x00X\x04'\x00H\x04\xb2\x00B\x04\ +H\x00)\x06V\x00\xc1\x05j\x00\xa8\x06V\x00\xc1\x05\ +j\x00\xa8\x06L\x00y\x04\xe3\x00f\x06N\x00y\x04\ +\xe3\x00f\x06N\x00y\x04\xe3\x00f\x05+\x00B\x04\ +\x04\x00B\x05\x19\x00\x0c\x04J\x00\x00\x05\x19\x00\x0c\x04\ +J\x00\x00\x05\x19\x00\x0c\x04J\x00\x00\x05\xb0\x00\x8b\x05\ +\x0e\x00\x8b\x04Z\x00\xc1\x03\xa0\x00\xa8\x07\x08\x00\xc1\x06\ +{\x00\xa8\x04X\x00/\x03\xac\x00\x0a\x05h\x00\x04\x04\ +\xbc\x00\x19\x04\xfa\x00\x02\x04h\x00\x19\x05\x00\x00o\x04\ +\xfc\x00f\x07L\x00o\x07F\x00f\x07D\x003\x06\ +\xb0\x00D\x05N\x003\x04\xbc\x00N\x08\x0e\x00\x08\x07\ +%\x00\x08\x087\x00\xc1\x07u\x00\xa8\x069\x00y\x05\ +5\x00f\x05\xdf\x00\x1d\x05\x85\x00+\x04\xec\x00b\x04\ +\x1f\x00T\x06\x12\x00\x08\x05-\x00\x08\x05J\x00\x00\x04\ +\xa4\x00Z\x05J\x00\x00\x04\xa4\x00Z\x05J\x00\x00\x04\ +\xa4\x00Z\x05J\x00\x00\x04\xa4\x00\x00\x05J\x00\x00\x04\ +\xa4\x00Z\x05J\x00\x00\x04\xa4\x00Z\x05J\x00\x00\x04\ +\xa4\x00Z\x05J\x00\x00\x04\xa4\x00Z\x05J\x00\x00\x04\ +\xa4\x00Z\x05J\x00\x00\x04\xa4\x00Z\x05J\x00\x00\x04\ +\xa4\x00Z\x05J\x00\x00\x04\xa4\x00Z\x04w\x00\xc1\x04\ +\x9c\x00f\x04w\x00\xc1\x04\x9c\x00f\x04w\x00\xc1\x04\ +\x9c\x00f\x04w\x00\xc1\x04\x9c\x00f\x04w\x00\x15\x04\ +\x9c\x00\x15\x04w\x00\xc1\x04\x9c\x00f\x04w\x00\xc1\x04\ +\x9c\x00f\x04w\x00\xc1\x04\x9c\x00f\x02\xe3\x00J\x02\ +;\x00w\x02\xe3\x00J\x02;\x00\x97\x06L\x00y\x04\ +\xe3\x00f\x06L\x00y\x04\xe3\x00f\x06L\x00y\x04\ +\xe3\x00f\x06L\x00y\x04\xe3\x00!\x06L\x00y\x04\ +\xe3\x00f\x06L\x00y\x04\xe3\x00f\x06L\x00y\x04\ +\xe3\x00f\x06j\x00y\x05'\x00f\x06j\x00y\x05\ +'\x00f\x06j\x00y\x05'\x00f\x06j\x00y\x05\ +'\x00f\x06j\x00y\x05'\x00f\x05\xf0\x00\xb4\x05\ +\x14\x00\x9e\x05\xf0\x00\xb4\x05\x14\x00\x9e\x06\x9c\x00\xb4\x05\ +\xb2\x00\x9e\x06\x9c\x00\xb4\x05\xb2\x00\x9e\x06\x9c\x00\xb4\x05\ +\xb2\x00\x9e\x06\x9c\x00\xb4\x05\xb2\x00\x9e\x06\x9c\x00\xb4\x05\ +\xb2\x00\x9e\x04\xbc\x00\x00\x04J\x00\x00\x04\xbc\x00\x00\x04\ +J\x00\x00\x04\xbc\x00\x00\x04J\x00\x00\x05\x0c\x00f\x00\ +\x00\xfb\xb2\x00\x00\xfcN\x00\x00\xfbT\x00\x00\xfcN\x00\ +\x00\xfcR\x00\x00\xfcT\x00\x00\xfcT\x00\x00\xfcT\x00\ +\x00\xfcT\x01\xa4\x00\x1d\x01\xfc\x00\x14\x01\xfc\x00\x14\x03\ +\x83\x00/\x04\xb4\x00m\x03q\x005\x04R\x005\x04\ +\x91\x00V\x04\x8f\x00\x17\x04\x91\x00u\x04\x91\x00^\x04\ +\x91\x00J\x04\x91\x00X\x04\x91\x00V\x05\xcf\x00#\x06\ +\x1d\x00V\x04\x87\x00\x1d\x03%\x00'\x04\xfc\x00f\x04\ +\xfc\x00f\x04\xfc\x00f\x04\xfc\x00f\x04\xfc\x00f\x02\ +q\x00\xc1\x02q\xff\xfa\x02q\x00\xb3\x02q\xff\xb5\x02\ +q\x00\x01\x02q\xff\xb2\x02q\xff\xfb\x02q\xff\xda\x02\ +q\x00L\x02q\x00\xb3\x04\xd5\x00\xc1\x03\x10\xff\xc1\x02\ +q\x00\xc1\x00\x01\x00\xc1\x00\x01\x00\xc1\x00\xc1\x00\x92\x00\ +\xb2\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,E#E`D-,K#QX\xb9\ +\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD\ +-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f\ +`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01\ +aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b\ +!!!!!Y-,\xb0\x02CTXKS#\ +KQZX8\x1b!!Y\x1b!!!!Y-\ +,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\ +\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#\ +D\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04\ +%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\ +\xb0\x07%\x08\xb0\x07%\x10\xb0\x06% F\xb0\x04%\ +\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\ +\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\x07%\x10\ +\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\ +\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\x07\ +%\x08\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y\ +!!!!!!!-,\x02\xb0\x04% F\ +\xb0\x04%#B\xb0\x05%\x08\xb0\x03%EH!!\ +!!-,\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%\ +CH!!!-,E# E\x18 \xb0\x00P\ + X#e#Y#h \xb0@PX!\xb0@\ +Y#XeY\x8a`D-,KS#KQZ\ +X E\x8a`D\x1b!!Y-,KTX \ +E\x8a`D\x1b!!Y-,KS#KQZ\ +X8\x1b!!Y-,\xb0\x00!KTX8\x1b\ +!!Y-,\xb0\x02CTX\xb0F+\x1b!!\ +!!Y-,\xb0\x02CTX\xb0G+\x1b!!\ +!Y-,\xb0\x02CTX\xb0H+\x1b!!!\ +!Y-,\xb0\x02CTX\xb0I+\x1b!!!\ +Y-, \x8a\x08#KS\x8aKQZX#8\ +\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \ +\xb0@8\x11\x1b!Y-,\x01F#F`#F\ +a# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\ +\x8apE`h:-, \x8a#Id\x8a#S\ +X<\x1b!Y-,KRX}\x1bzY-,\ +\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\ +\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88\ +TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\ +\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1\ +$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01K\ +RX\xb2\x02\x08\x02C`BY\x1b\xb9@\x00\x00\x80\ +\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80\ +c\xb8\x01\x00\x88TX\xb2\x02\x08\x02C`BY\xb9\ +@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C\ +`BY\xb1&\x01\x88QX\xb9@\x00\x02\x00c\xb8\ +\x04\x00\x88TX\xb2\x02@\x02C`BY\xb9@\x00\ +\x04\x00c\xb8\x08\x00\x88TX\xb2\x02\x80\x02C`B\ +YYYYYY\xb1\x00\x02CTX@\x0a\x05@\ +\x08@\x09@\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\ +\x05@\x08\xba\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\ +\xb1\x80\x02CRX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\ +\x1b\xb2\x05@\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\ +\x00\x80\x88U\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZ\ +X\xb3\x0c\x00\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYB\ +BBBB-,E\x18h#KQX# E\ + d\xb0@PX|Yh\x8a`YD-,\xb0\ +\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02\ +#>\xb1\x01\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\ +\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\ +\x06#eB\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\ +\xb0\x02CP\xb0\x01\xb0\x02CT[X!#\x10\xb0\ + \x1a\xc9\x1b\x8a\x10\xedY-,\xb0Y+-,\x8a\ +\x10\xe5-@\xa5\x09!H U \x01\x1eU\x1fH\ +\x1eU\x1f\x1e\x01\x0f\x1e?\x1e\xaf\x1e\x03OF\x1c\x1f\ +NM\x1b\x1fMF\x1a\x1f&4\x10U%$H\x1f\ +\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\xff\x1fLK\x1c\x1f\ +KF\x1b\x1f\x133\x12U\x05\x01\x03U\x043\x03U\ +\x1f\x03\x01\x0f\x03?\x03\xaf\x03\x03\xcbJ\xdbJ\xebJ\ +\x03\xcbI\x01HF\x12\x1fGF\x12\x1fIF\x01#\ +H\x22U\x1c3\x1bU\x163\x15U\x11\x01\x0fU\x10\ +3\x0fU\xcf\x0f\x01\x1f\x0f\x01\x0f\x0f\xdf\x0f\xff\x0f\x03\ +\x06\x02\x01\x00U\x013\x00Uo\x00\x7f\x00\xaf\x00\xef\ +\x00\x04\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\x90\xb1TS\ +++K\xb8\x07\xffRK\xb0\x09P[\xb0\x01\x88\xb0\ +%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\xb0\x00UZ\ +[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\x1dK\xb02\ +SX\xb0 \x1dYK\xb0dSX\xb0\x10\x1d\xb1\x16\ +\x00BYss++^stt+++++\ +t++ssst+++++++++\ +++++st+++\x18^\x06\x14\x00\x17\x00\ +N\x05\xb6\x00\x17\x00u\x05\xb6\x05\xcd\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04R\x00\x14\x00\x86\x00\ +\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\ +\x00\xfe\x14\xff\xec\x00\x00\x05\xb6\x00\x19\xfc\x94\xff\xed\xfe\ +{\xff\xf2\xfe\xa8\xfe\x9e\x00\x17\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x08\x00\x00\x00\x00\x00\x00\xc0\x00\xb8\x00\xb0\x00\xa3\x00\ +\x94\x00\xc0\x00\xcd\x00\xc5\x00\xcf\x00\xba\x00\x9a\x011\x00\ +\xb2\x00\x00\x00\x00\x00$\x00$\x00$\x00$\x00W\x00\ +}\x00\xfb\x01y\x01\xf0\x02m\x02\x86\x02\xb2\x02\xdf\x03\ +\x10\x03>\x03_\x03v\x03\x98\x03\xb6\x03\xf8\x04 \x04\ +e\x04\xc0\x05\x08\x05V\x05\xb2\x05\xd7\x06?\x06\x9e\x06\ +\xd6\x07\x10\x078\x07b\x07\x8a\x07\xe5\x08n\x08\xae\x09\ +\x08\x09H\x09\x7f\x09\xb6\x09\xe7\x0a5\x0af\x0a\x99\x0a\ +\xc0\x0a\xfa\x0b\x18\x0b_\x0b\x9a\x0b\xe0\x0c\x1e\x0cu\x0c\ +\xc0\x0d\x12\x0d6\x0dj\x0d\x9c\x0d\xf1\x0e,\x0eZ\x0e\ +\x8d\x0e\xb0\x0e\xcd\x0e\xef\x0f\x18\x0f.\x0fN\x0f\xae\x10\ +\x01\x10;\x10\x8d\x10\xe2\x11#\x11\xbc\x11\xf9\x120\x12\ +y\x12\xb8\x12\xcf\x13&\x13_\x13\x9f\x13\xf3\x14G\x14\ +w\x14\xc4\x15\x07\x15A\x15p\x15\xc7\x16\x01\x16A\x16\ +t\x16\xc3\x16\xda\x17+\x17p\x17p\x17\xa2\x17\xf4\x18\ +L\x18\xa7\x18\xfc\x19!\x19\x9b\x19\xd1\x1aM\x1a\x9f\x1a\ +\xda\x1a\xfc\x1b\x04\x1b\x8d\x1b\xa3\x1b\xda\x1c\x15\x1cO\x1c\ +\x9f\x1c\xbf\x1d\x04\x1d7\x1dY\x1d\x8f\x1d\xb8\x1d\xf1\x1e\ +*\x1e@\x1eU\x1ek\x1e\xcb\x1e\xdc\x1e\xed\x1e\xfe\x1f\ +\x0f\x1f!\x1f2\x1f\x8b\x1f\x97\x1f\xa8\x1f\xb9\x1f\xca\x1f\ +\xdc\x1f\xed\x1f\xfe \x0f ! s \x84 \x95 \ +\xa6 \xb7 \xc8 \xda!\x09!s!\x84!\x95!\ +\xa6!\xb8!\xc9\x22\x12\x22~\x22\x8e\x22\x9e\x22\xae\x22\ +\xbe\x22\xcf\x22\xe0#m#y#\x89#\x99#\xa9#\ +\xba#\xcb#\xdc#\xed#\xff$j$z$\x8a$\ +\x9a$\xaa$\xba$\xcb%\x12%y%\x89%\x9a%\ +\xaa%\xbb%\xcb&\x22&3&D&T&e&\ +u&\x81&\x8d&\x9e&\xae&\xbf&\xcf&\xe0&\ +\xf1'\x02'\x12'#'/'7'\xaa'\xbb'\ +\xcb'\xdc'\xec'\xfd(\x0e(\x1a(&(7(\ +G(X(h(y(\x89(\x9a(\xab(\xb7(\ +\xc7(\xd8(\xe9);)\x9d)\xae)\xbf)\xd0)\ +\xe1)\xf2*\x03*\x0e*\x19***A*M*\ +Y*j*{*\x87*\x92*\xcd*\xde*\xef*\ +\xfa+\x06+\x17+\x22+.+:+w+\xaf+\ +\xc0+\xd1+\xdd+\xe8+\xf9,\x09,\x15,a,\ +\xac,\xbd,\xcd,\xde,\xee-\x00-\x11-u-\ +\xfb.\x0c.\x1c.(.4.E.U.f.\ +v.\x87.\x97.\xa3.\xaf.\xc0.\xd0.\xdb.\ +\xe6.\xf7/\x03/?/\x96/\xa7/\xb7/\xc8/\ +\xd8/\xe9/\xf90\x0b0\x1c0.0@0L0\ +X0i0z0\x8b0\x9b0\xad0\xbe0\xce0\ +\xdf0\xf01\x011\x111:1\x8b2\x142\xc52\ +\xd62\xe72\xf83\x083\x133\x1e3L3|3\ +\x923\xc03\xe04\x1a4G4\x844\xb34\xd55\ +%565X5j5|5\x8e5\x9f5\xb15\ +\xc25\xd55\xdd5\xe56\x036\x0b6\x136\x1b6\ +#6y6\x816\x896\xba6\xc26\xca7\x027\ +\x0a7/777w7\x7f7\x877\xf98\x018\ +O8\xa58\xb78\xc98\xd98\xe98\xf99\x0a9\ +\x1c9\x849\xe7:):\x8b:\xe6;>;y;\ +\xd0;\xf9<\x01/>d>\x9f>\xfe?\x5c?\ +\xaf@\x10@\x22@3@C@S@d@v@\ +\xc5@\xd6A!A)A1ACAKA\xaeB\ +\x05BDBUBfB\x96B\x9eB\xe1B\xe9B\ +\xf1C;CCC\x92C\xedD&D7DlD\ +\xa5D\xadD\xb5D\xbdD\xc5D\xcdD\xd5D\xddE\ +!E)E1EbE\x9fE\xd0F\x0bFOF\ +\x99F\xd7G\x22G\x82G\xcdG\xd5H1H\x90H\ +\xb0H\xf9I\x01IOI\xaaI\xe2I\xf2J(J\ +_J\xa7J\xd9J\xe1K\x07K\x0fK\x17K\x0c\xfe\x94\x1dI\xa2\x84:K#\ +\xfe\xc1\x1b\x02\xe39L%\x017\x0cJ\x00\x00\x05\x00\ +T\xff\xec\x06\x91\x05\xcb\x00\x09\x00\x14\x00\x1e\x00)\x00\ +-\x00W@0-*+,\x1a\x1f\x15%\x05\x0a\x00\ +\x10\x0a\x10\x1f%*,\x06/.\x1c\xa0'\x01''\ +-\x03`\x0d\x01\xaf\x0d\x01\x0d\x0d,-\x03,\x12\x07\ +\x12\x04\x18\x22\x13\x00?3?3??\x129/]\ +q3\x119/]3\x11\x12\x01\x179\x113\x113\ +\x113\x113\x113\x11310\x01\x14\x1632\x11\ +\x10#\x22\x06\x05\x14\x06#\x22&5\x10!2\x16\x01\ +\x14\x1632\x11\x10#\x22\x06\x05\x14\x06#\x22&5\ +\x10!2\x16\x01\x01#\x01\x01\x17:B\x84\x84B:\ +\x01\xc2\xa5\xa1\x98\xa7\x01?\x9d\xa9\x01\xf6;B\x83\x83\ +B;\x01\xc2\xa6\x9f\x98\xa8\x01@\x9a\xab\xfe\xd7\xfc\xd5\ +\xc2\x03+\x04\x00\x95\x92\x01'\x01'\x92\x93\xe6\xe7\xef\ +\xde\x01\xc9\xed\xfc\xda\x95\x94\x01)\x01%\x90\x95\xe6\xe6\ +\xed\xdf\x01\xc9\xec\x03!\xfaJ\x05\xb6\x00\x03\x00`\xff\ +\xec\x05\xe9\x05\xcb\x00\x0b\x00\x14\x002\x00T@.,\ ++\x12\x15'(\x06!\x00\x1b+\x15\x1b!(\x054\ +3%\x0e-*\x04,'\x03$\x18\x03\x0f'\x1e,\ +\x12\x1e\x09KY\x1e\x040\x0cLY0\x13\x00?+\ +\x00\x18?+\x00\x18?\x129\x11\x179\x11\x12\x179\ +\x11\x12\x01\x179\x113\x113\x113\x113\x1131\ +0\x01\x14\x16\x176654&#\x22\x06\x1327\ +\x01\x06\x06\x15\x14\x16%467&&5463\ +2\x16\x15\x14\x06\x07\x01673\x02\x07\x01!'\x06\ +\x06#\x22$\x01\xc3C\x02\ +54&#\x22\x06\x07'6632\x16\x15\x14\x06\ +\x06\x07\x07\x15!\x049\xfc!\x01y\xa7m2wi\ +T\x9dg\x7fz\xe6\x82\xcc\xf6G\x93\xab\xfe\x02\xb6\xb2\ +\x01{\xab\x8f~Hcr>Q\x9bgV\xd5\xb4c\ +\xb2\xbd\xa1\xf6\x0a\x00\x01\x00V\xff\xec\x04-\x05\xcb\x00\ +&\x00C@$\x13\x07\x1b\x00\x00\x04\x07\x0d\x17\x22\x06\ +('\x03\x17\x18\x18\x17OY\x18\x18\x0a$$\x1eM\ +Y$\x07\x0a\x10MY\x0a\x19\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x009\x11\x12\x01\x179\ +\x113\x11310\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04\ +!\x22'5\x16\x1632654&##53\ + 54&#\x22\x06\x07'6!2\x16\x04\x02\xa2\ +\x93\xb0\xb0\xfe\xd6\xfe\xed\xf3\xa7]\xd0`\xaa\xa8\xba\xc7\ +\x7f\x81\x01^zwS\x9ais\xc9\x01\x0a\xdd\xf8\x04\ +f\x8b\xb9 \x08\x16\xaf\x91\xd3\xe5O\xd1.2~\x84\ +un\xbf\xf2^f/D\xa4\x94\xbe\x00\x02\x00'\x00\ +\x00\x04m\x05\xba\x00\x0a\x00\x12\x00H@'\x09\x01\x01\ +\x0e\x0b\x07\x04\x12\x05\x05\x04\x00\x03\x14\x13\x01\x05\x12\x05\ +MY\x09\x06P\x12\x01\x0f\x12\x1f\x12\x02\x12\x12\x03\x0f\ +\x07\x06\x03\x18\x00??3\x129/]]33+\ +\x11\x003\x11\x12\x01\x179\x113\x113333\x11\ +310\x01#\x11#\x11!5\x013\x113!\x11\ +47#\x06\x07\x01\x04m\xc5\xe5\xfdd\x02\x9c\xe5\xc5\ +\xfeV\x0a\x08\x1c<\xfe\x95\x01?\xfe\xc1\x01?\xb5\x03\ +\xc6\xfcH\x01o\xc4}B^\xfd\xf0\x00\x01\x00u\xff\ +\xec\x04)\x05\xb6\x00\x1c\x00:@\x1f\x0f\x03\x1a\x15\x03\ +\x08\x15\x18\x04\x1e\x1d\x00\x11MY\x00\x00\x06\x16\x16\x19\ +NY\x16\x06\x06\x0cMY\x06\x19\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\x11\ +310\x012\x04\x15\x14\x00!\x22'5\x16\x163\ +265\x10!\x22\x06\x07'\x13!\x15!\x0366\ +\x02J\xdd\x01\x02\xfe\xdb\xfe\xf2\xf5\x8cQ\xd2Z\x9f\xa6\ +\xfe\xb2/\x8a4i8\x02\xf8\xfd\xd7!#e\x03\x91\ +\xea\xca\xea\xfe\xf9O\xd5.2\x8e\x89\x01\x06\x13\x0c>\ +\x02\xca\xd1\xfe\x96\x06\x10\x00\x02\x00^\xff\xec\x04?\x05\ +\xc9\x00\x17\x00$\x00D@#\x1b\x11\x22\x0a\x0a\x00\x00\ +\x05\x11\x03&%\x0a\x14\x0e\x0e\x1eOY\x0e\x0e\x14\x02\ +\x02\x07OY\x02\x07\x14\x18MY\x14\x19\x00?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x009\x11\x12\ +\x01\x179\x113\x113\x11310\x13\x10!2\x17\ +\x15&#\x22\x06\x0336632\x16\x15\x14\x00#\ +\x22&\x02\x052654&#\x22\x06\x06\x15\x14\x16\ +^\x02\xbbnLLd\xeb\xec\x0a\x0c/\xaas\xc7\xde\ +\xfe\xff\xde\x9d\xe8}\x01\xfey\x83{{L\x80J\x99\ +\x02o\x03Z\x11\xc4\x16\xfc\xfe\xeaQY\xf4\xd1\xe6\xfe\ +\xf5\x97\x01!\xf6\x9c\x91~\x90Aq;\x8d\xc1\x00\x00\ +\x01\x00J\x00\x00\x04=\x05\xb4\x00\x06\x00%@\x12\x06\ +\x00\x01\x05\x00\x02\x05\x03\x08\x07\x00\x18\x03\x02NY\x03\ +\x06\x00?+\x00\x18?\x11\x12\x01\x179\x113\x113\ +10!\x01!5!\x15\x01\x01\x00\x02B\xfd\x08\x03\ +\xf3\xfd\xc1\x04\xe5\xcf\xa4\xfa\xf0\x00\x03\x00X\xff\xec\x04\ +9\x05\xc9\x00\x16\x00#\x000\x007@\x1d\x03\x08\x0e\ +\x14+!\x0621\x05\x11!!++\x0b\x00\x00$\ +OY\x00\x07\x0b\x1aOY\x0b\x19\x00?+\x00\x18?\ ++\x11\x12\x009\x18/3\x1299\x11\x12\x01\x179\ +10\x012\x16\x15\x14\x05\x16\x16\x15\x14\x04#\x22$\ +5467&&546\x03\x14\x163265\ +4&''\x06\x06\x01\x22\x06\x15\x14\x16\x16\x1766\ +54&\x02H\xd0\xf2\xfe\xf2\xac\x91\xfe\xf6\xe3\xee\xfe\ +\xfa\x89\x9c\x86r\xfaF\x92}\x81\x8f\x84\x86\x1d\x84t\ +\x01\x0ddz,Tdxc{\x05\xc9\xbf\xa0\xe1\x85\ +V\xbeu\xb5\xda\xcc\xbbz\xc3LP\xb2o\x9f\xbd\xfb\ +\xb2hswfQ\x869\x0d:\x8b\x03?cU4\ +RC/5uNUc\x00\x00\x02\x00V\xff\xec\x04\ +7\x05\xc9\x00\x18\x00%\x00D@#\x22\x0c\x0c\x00\x1c\ +\x12\x00\x06\x12\x03'&\x0c\x0f\x15\x0f\x1fOY\x0f\x0f\ +\x03\x15\x15\x19MY\x15\x07\x03\x08OY\x03\x19\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\ +\x11\x12\x01\x179\x113\x113\x11310\x01\x10\x00\ +!\x22'5\x1632\x12\x13#\x06\x06#\x22&5\ +4\x0032\x16\x12%\x22\x06\x15\x14\x163265\ +4&&\x047\xfe\xa4\xfe\xa2\x85:YZ\xee\xea\x0b\ +\x0c;\xa7p\xc2\xde\x01\x01\xde\x9c\xe8~\xfe\x02z\x82\ +y{w\xa2E|\x03F\xfeP\xfeV\x10\xc5\x19\x01\ +\x00\x01\x12ZP\xf2\xd3\xe5\x01\x0f\x98\xfe\xdf\xf6\x9f\x90\ +}\x8f\x8e_Y\x9bZ\x00\x02\x00\x85\xff\xe3\x01\xae\x04\ +j\x00\x0b\x00\x16\x00(@\x14\x11\x0c\x06\x06\x00\x00\x18\ +\x17\x0e\x14QY\x0e\x10\x09\x03QY\x09\x13\x00?+\ +\x00\x18?+\x11\x12\x019\x113\x1299107\ +4632\x16\x15\x14\x06#\x22&\x11432\x16\ +\x15\x14\x06#\x22&\x85LHILMHHL\x94\ +KJMHHL}INQFGSR\x03\x9e\ +\x97PGGSR\x00\x00\x02\x00?\xfe\xf8\x01\xac\x04\ +j\x00\x06\x00\x11\x002@\x1b\x0c\x07\x01\x06\x06\x04\x07\ +\x03\x13\x12\x04\x00\x06\x10\x06\x90\x06\x03\x0d\x03\x06\x09\x0f\ +QY\x09\x10\x00?+\x00\x18/_^]\xc6\x11\x12\ +\x01\x179\x113\x11310%\x17\x06\x03#\x127\ +\x03432\x16\x15\x14\x06#\x22&\x01\x8d\x0f0\x80\ +\xadE\x22#\x94KJMHHL\xee\x17\xba\xfe\xdb\ +\x01\x0e\xe8\x02\xe5\x97PGGSR\x00\x01\x00`\x00\ +\xdd\x041\x04\xec\x00\x06\x00&@\x16\x05\x01\x00\x01\x04\ +\x03\x08\x07\x00\x0f\x03\x01?\x03o\x03\x8f\x03\xef\x03\x04\ +\x03\x00/]q\xc6\x11\x12\x01\x179\x11310%\ +\x015\x01\x15\x01\x01\x041\xfc/\x03\xd1\xfd#\x02\xdd\ +\xdd\x01\xaey\x01\xe8\xc3\xfe\xa8\xfe\xd1\x00\x02\x00f\x01\ +\xb0\x04)\x03\xf2\x00\x03\x00\x07\x00-@\x1b\x04\x07\x00\ +\x03\x04\x09\x08\x04\x05RY\x04\x01\x01\x00RY\x0f\x01\ +/\x01O\x01o\x01\x04\x01\x00/]+\x00\x18\x10\xc6\ ++\x11\x12\x01\x17910\x135!\x15\x015!\x15\ +f\x03\xc3\xfc=\x03\xc3\x03?\xb3\xb3\xfeq\xb2\xb2\x00\ +\x01\x00`\x00\xdd\x041\x04\xec\x00\x06\x00&@\x16\x01\ +\x05\x02\x05\x06\x03\x08\x07\x06\x0f\x03\x01?\x03o\x03\x8f\ +\x03\xef\x03\x04\x03\x00/]q\xc6\x11\x12\x01\x179\x11\ +310\x13\x01\x015\x01\x15\x01`\x02\xdd\xfd#\x03\ +\xd1\xfc/\x01\xa2\x01/\x01X\xc3\xfe\x18y\xfeR\x00\ +\x02\x00\x10\xff\xe3\x03m\x05\xcb\x00\x1b\x00&\x00A@\ +!!\x1c\x1b\x00\x07\x13\x00\x0e\x13\x1c\x04('\x04\x17\ +\x17\x10\x00\x00$\x10\x10\x0aKY\x10\x04$\x1eQY\ +$\x13\x00?+\x00\x18?+\x11\x12\x009\x18/\x12\ +9\x113\x11\x12\x01\x179\x113\x113\x11310\ +\x0154676654&#\x22\x06\x07'6\ +32\x16\x15\x14\x06\x06\x07\x06\x06\x15\x15\x03432\ +\x16\x15\x14\x06#\x22&\x01\x1bPdwEpi_\ +\xa2MT\xcb\xe8\xc4\xe6,Ym]?\xed\x93HL\ +MGGL\x01\xbc@n\x92N^hHTZ6\ +&\xb0q\xc0\xa9KujUI`Q-\xfe\xc1\x97\ +OHGSQ\x00\x02\x00o\xffV\x06\xbe\x05\xbe\x00\ +5\x00?\x00L@&\x1b\x00;\x14:\x07\x166\x0e\ +#.\x00\x0e\x14\x16(.\x06A@\x08\x0b=\x11\x11\ +2\x1888\x04\x0b\x0b+\x1f2\x03&+\x00/3\ +?3\x129/33\x113\x119/3\x129\x11\ +\x12\x01\x179\x113\x113\x1133\x113\x1131\ +0\x01\x14\x06\x06#\x22&'#\x06\x06#\x22&5\ +4\x1232\x16\x17\x03\x15\x1432654\x02$\ +#\x22\x04\x02\x15\x10\x00!27\x15\x06# \x00\x11\ +\x10\x12$32\x04\x12\x01\x1432\x137&#\x22\ +\x06\x06\xbeZ\xa3kOt\x14\x0c1\x90Z\xa3\xbb\xf8\ +\xd1L\xb9H\x16hO]\x8c\xfe\xfe\xa7\xd5\xfe\xc5\xa6\ +\x016\x01\x22\xdd\xf0\xd2\xf7\xfe\x8e\xfeb\xe0\x01\x8d\xfb\ +\xd9\x01S\xbb\xfb\xfc\xb7\xc1\x12\x0c?H\x80\x8f\x02\xe3\ +\x8f\xed\x84THNN\xd2\xb3\xce\x01\x01\x1b\x18\xfe/\ +\x18\xa0\xcc\x9e\xab\x01\x03\x8c\xb0\xfe\xb9\xd8\xfe\xde\xfe\xc8\ +Z\xa4V\x01\x8f\x01e\x01\x05\x01\x97\xd8\xb4\xfe\xb3\xfe\ +\xa7\xe9\x01%\xef\x11\xaa\x00\x02\x00\x00\x00\x00\x05J\x05\ +\xbc\x00\x07\x00\x0f\x007@\x1e\x06\x05\x0c\x00\x07\x03\x04\ +\x01\x02\x04\x07\x08\x0c\x0f\x07\x11\x10\x0f\x02LY\x0f\x0f\ +\x05\x00\x04\x12\x0c\x05\x03\x00?3?3\x129/+\ +\x11\x12\x01\x179\x113\x113\x113310!\x03\ +!\x03#\x01!\x01\x01\x03&&'\x06\x07\x03\x04L\ +\x92\xfd\xd1\x8f\xfc\x02#\x01\x04\x02#\xfe1\x89\x0f5\ +\x0a\x1b4\x84\x01\x96\xfej\x05\xbc\xfaD\x02d\x01\x8e\ +(\xac({\x92\xfe\x83\x00\x03\x00\xc1\x00\x00\x04\xd9\x05\ +\xb6\x00\x0f\x00\x18\x00!\x00I@&\x14\x04\x1e\x0b\x10\ +\x1a\x1a\x0f\x04\x08\x0b\x0f\x04#\x22\x08\x19\x10\x10\x19K\ +Y\x10\x10\x0f\x00\x00\x18LY\x00\x03\x0f\x1aLY\x0f\ +\x12\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x009\x11\x12\x01\x179\x113\x113\x113\x113\ +10\x13! \x04\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04\ +#!\x1332654&##\x11\x11326\ +54&#\xc1\x01\xb2\x01.\x01\x0d\x84|\x9a\x91\xfe\ +\xed\xf5\xfd\xf0\xef\xe6\x96\x8a\x95\xa2\xcf\xfe\x96\x99\x9c\x9f\ +\x05\xb6\xb0\xbe\x80\xaa\x16\x0a\x1d\xab\x92\xc5\xdf\x03Z_\ +rg\x5c\xfd\xaa\xfe1s|rn\x00\x01\x00y\xff\ +\xec\x04\xcf\x05\xcb\x00\x18\x00&@\x14\x03\x0f\x09\x0f\x15\ +\x03\x1a\x19\x13\x00LY\x13\x04\x0c\x06LY\x0c\x13\x00\ +?+\x00\x18?+\x11\x12\x01\x179\x11310\x01\ +\x22\x02\x11\x10\x123267\x15\x06# \x00\x114\ +\x12$32\x17\x07&&\x03/\xce\xec\xe3\xd7]\xae\ +^\xac\xda\xfe\xbf\xfe\xa8\xa7\x01<\xd5\xe0\xbeVJ\xa5\ +\x04\xfe\xfe\xdc\xfe\xff\xfe\xf3\xfe\xec%\x1d\xcdA\x01\x85\ +\x01j\xe4\x01V\xb6^\xc7#5\x00\x00\x02\x00\xc1\x00\ +\x00\x05f\x05\xb6\x00\x08\x00\x0f\x00(@\x14\x0d\x04\x09\ +\x00\x04\x00\x10\x11\x05\x0cLY\x05\x03\x04\x0dLY\x04\ +\x12\x00?+\x00\x18?+\x11\x12\x0199\x113\x11\ +310\x01\x10\x00!!\x11! \x00\x03\x10!#\ +\x113 \x05f\xfen\xfe\x86\xfeg\x01\xc4\x01]\x01\ +\x84\xfc\xfe\x15\xcf\xaa\x02\x10\x02\xe9\xfe\x96\xfe\x81\x05\xb6\ +\xfe\x88\xfe\xa3\x02\x0d\xfb\xdb\x00\x00\x01\x00\xc1\x00\x00\x03\ +\xfc\x05\xb6\x00\x0b\x00=@ \x04\x00\x06\x0a\x0a\x01\x00\ +\x01\x08\x03\x0d\x0c\x06\x09LY\x06\x06\x01\x02\x02\x05L\ +Y\x02\x03\x01\x0aLY\x01\x12\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\x113\ +\x11310!!\x11!\x15!\x11!\x15!\x11!\ +\x03\xfc\xfc\xc5\x03;\xfd\xb4\x02'\xfd\xd9\x02L\x05\xb6\ +\xca\xfer\xc8\xfe5\x00\x00\x01\x00\xc1\x00\x00\x03\xfa\x05\ +\xb6\x00\x09\x008@\x1e\x06\x00\x00\x01\x04\x07\x01\x03\x0a\ +\x0b\x06\x09LY\x0f\x06\x01\x0b\x03\x06\x06\x02\x01\x12\x02\ +\x05LY\x02\x03\x00?+\x00\x18?\x129/_^\ +]+\x11\x12\x01\x179\x113\x11310!#\x11\ +!\x15!\x11!\x15!\x01\xae\xed\x039\xfd\xb4\x02'\ +\xfd\xd9\x05\xb6\xca\xfe7\xcb\x00\x00\x01\x00y\xff\xec\x05\ +1\x05\xcb\x00\x1a\x00:@\x1f\x18\x02\x13\x08\x02\x08\x1a\ +\x0d\x04\x1c\x1b\x00\x1aLY\x00\x00\x05\x0b\x0b\x10LY\ +\x0b\x04\x05\x16LY\x05\x13\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x01\x179\x113\x1131\ +0\x01!\x11\x06\x06# \x00\x11\x10\x00!2\x17\x07\ +&#\x22\x00\x15\x10\x12327\x11!\x03\x17\x02\x1a\ +\x84\xf3\x8d\xfe\xb4\xfe\x98\x01\x96\x01d\xe5\xcdT\xb2\xb2\ +\xea\xfe\xf0\xf5\xe6t\x84\xfe\xd1\x03\x19\xfd\x22+$\x01\ +\x89\x01f\x01a\x01\x8fX\xc7R\xfe\xda\xff\xfe\xf4\xfe\ +\xe9\x1d\x01y\x00\x00\x01\x00\xc1\x00\x00\x05B\x05\xb6\x00\ +\x0b\x003@\x19\x08\x04\x04\x05\x09\x01\x01\x00\x05\x00\x0c\ +\x0d\x08\x03LY\x08\x08\x05\x0a\x06\x03\x01\x05\x12\x00?\ +3?3\x129/+\x11\x12\x0199\x113\x113\ +\x113\x11310!#\x11!\x11#\x113\x11!\ +\x113\x05B\xf0\xfd^\xef\xef\x02\xa2\xf0\x02\x93\xfdm\ +\x05\xb6\xfd\xaa\x02V\x00\x00\x01\x00J\x00\x00\x02\x98\x05\ +\xb6\x00\x0b\x007@\x1c\x05\x02\x0a\x03\x08\x0b\x0b\x03\x02\ +\x03\x0c\x0d\x09\x04\x06\x04KY\x06\x03\x0a\x03\x01\x03K\ +Y\x01\x12\x00?+\x11\x003\x18?+\x11\x003\x11\ +\x12\x01\x179\x113\x113\x11310!!57\ +\x11'5!\x15\x07\x11\x17\x02\x98\xfd\xb2\xb0\xb0\x02N\ +\xaf\xaf\x89:\x04/;\x89\x89;\xfb\xd1:\x00\x01\xff\ +d\xfeh\x01\xaa\x05\xb6\x00\x0c\x00\x1f@\x0e\x0a\x03\x07\ +\x07\x0e\x0d\x08\x03\x00\x05LY\x00#\x00?+\x00\x18\ +?\x11\x12\x019\x113310\x13\x22'5\x163\ +25\x113\x11\x14\x06\x08bBT>\xc4\xf0\xd5\xfe\ +h\x19\xc9\x15\xf8\x05\x89\xfa\x7f\xe0\xed\x00\x01\x00\xc1\x00\ +\x00\x05\x1d\x05\xb6\x00\x0e\x005@\x1c\x0b\x0c\x01\x00\x08\ +\x04\x04\x05\x00\x02\x05\x0c\x0e\x05\x10\x0f\x02\x0e\x03\x08\x04\ +\x05\x0b\x06\x03\x01\x05\x12\x00?3?3\x12\x179\x11\ +\x12\x01\x179\x113\x113\x113\x11310!!\ +\x01\x07\x11#\x113\x1167\x01!\x00\x07\x05\x1d\xfe\ +\xeb\xfe5\x8d\xef\xefba\x01\x8b\x01\x10\xfe\x81\xa6\x02\ +\x96s\xfd\xdd\x05\xb6\xfdFxo\x01\xd3\xfe>\xbf\x00\ +\x01\x00\xc1\x00\x00\x04\x1b\x05\xb6\x00\x05\x00\x1f@\x0e\x03\ +\x00\x05\x00\x07\x06\x01\x03\x00\x03LY\x00\x12\x00?+\ +\x00\x18?\x11\x12\x0199\x113103\x113\x11\ +!\x15\xc1\xef\x02k\x05\xb6\xfb\x17\xcd\x00\x01\x00\xc1\x00\ +\x00\x06\xa2\x05\xb6\x00\x14\x00>@\x1f\x12\x0b\x0e\x0e\x0d\ +\x14\x00\x09\x02\x08\x05\x05\x06\x06\x09\x0d\x03\x16\x15\x02\x12\ +\x09\x03\x06\x0b\x07\x03\x00\x0e\x06\x12\x00?33?3\ +\x12\x179\x11\x12\x01\x179\x113\x1133\x1133\ +\x113\x113310!\x01#\x12\x15\x11#\x11!\ +\x013\x01!\x11#\x114\x127#\x01\x039\xfeX\ +\x08\x11\xd9\x01Q\x01\x96\x06\x01\xa2\x01R\xe6\x0b\x04\x08\ +\xfeI\x04\xc5\xfe\xf0\xee\xfd9\x05\xb6\xfbu\x04\x8b\xfa\ +J\x02\xd3m\x01^%\xfb=\x00\x01\x00\xc1\x00\x00\x05\ +\x83\x05\xb6\x00\x11\x002@\x17\x0c\x01\x10\x10\x00\x03\x0a\ +\x07\x07\x08\x08\x00\x13\x12\x03\x0c\x08\x10\x09\x03\x01\x08\x12\ +\x00?3?3\x1299\x11\x12\x0199\x113\x11\ +33\x113\x113310!!\x01#\x17\x16\x15\ +\x11#\x11!\x013&\x025\x113\x05\x83\xfe\xdb\xfd\ +1\x08\x05\x0e\xd9\x01\x22\x02\xcd\x06\x02\x0c\xdb\x04\x8dA\ +\xba\x9a\xfd\x08\x05\xb6\xfby\x17\x01!Q\x02\xfe\x00\x00\ +\x02\x00y\xff\xec\x05\xd3\x05\xcd\x00\x0b\x00\x17\x00(@\ +\x14\x0c\x06\x12\x00\x06\x00\x18\x19\x09\x15LY\x09\x04\x03\ +\x0fLY\x03\x13\x00?+\x00\x18?+\x11\x12\x019\ +9\x113\x11310\x01\x10\x00! \x00\x11\x10\x00\ +! \x00\x01\x10\x1232\x12\x11\x10\x02#\x22\x02\x05\ +\xd3\xfe\x9b\xfe\xb9\xfe\xb5\xfe\x9d\x01e\x01K\x01F\x01\ +d\xfb\xa4\xda\xd6\xd5\xd9\xd7\xd5\xd7\xdb\x02\xdd\xfe\x9b\xfe\ +t\x01\x89\x01j\x01j\x01\x84\xfev\xfe\x9a\xfe\xf2\xfe\ +\xe9\x01\x14\x01\x11\x01\x0d\x01\x16\xfe\xea\x00\x02\x00\xc1\x00\ +\x00\x04\x89\x05\xb6\x00\x0a\x00\x13\x002@\x19\x0f\x00\x0b\ +\x05\x05\x06\x06\x00\x15\x14\x0b\x04LY\x0b\x0b\x07\x06\x12\ +\x07\x13LY\x07\x03\x00?+\x00\x18?\x129/+\ +\x11\x12\x0199\x113\x113\x11310\x01\x14\x04\ +!#\x11#\x11! \x04\x0132654&#\ +#\x04\x89\xfe\xd4\xfe\xeb\x98\xef\x01\xa5\x01\x12\x01\x11\xfd\ +'\x7f\xb8\xac\x9a\xa3\xa6\x03\xfc\xe5\xf4\xfd\xdd\x05\xb6\xe0\ +\xfe\x16\x80\x88~|\x00\x00\x02\x00y\xfe\xa4\x05\xd3\x05\ +\xcd\x00\x0f\x00\x1b\x00;@\x1f\x05\x04\x03\x06\x16\x00\x10\ +\x0a\x00\x04\x06\x0a\x04\x1d\x1c\x0d\x19LY\x0d\x04\x05\x07\ +\x03\x07\x07\x13LY\x07\x13\x00?+\x11\x003\x18\x10\ +\xc6?+\x11\x12\x01\x179\x113\x113\x113\x113\ +10\x01\x10\x02\x07\x01!\x01# \x00\x11\x10\x00!\ + \x00\x01\x10\x1232\x12\x11\x10\x02#\x22\x02\x05\xd3\ +\xcb\xc2\x01^\xfe\xbe\xfe\xec'\xfe\xb5\xfe\x9d\x01e\x01\ +K\x01F\x01d\xfb\xa4\xda\xd6\xd5\xd9\xd7\xd5\xd7\xdb\x02\ +\xdd\xfe\xf6\xfe\x94J\xfe\x87\x01H\x01\x89\x01j\x01j\ +\x01\x84\xfev\xfe\x9a\xfe\xf2\xfe\xe9\x01\x14\x01\x11\x01\x0d\ +\x01\x16\xfe\xea\x00\x00\x02\x00\xc1\x00\x00\x05\x0a\x05\xb6\x00\ +\x08\x00\x15\x00D@#\x12\x15\x04\x10\x14\x13\x00\x0a\x0a\ +\x0b\x0b\x10\x13\x15\x04\x17\x16\x12\x09\x00\x09KY\x00\x00\ +\x0c\x14\x0b\x12\x0c\x08LY\x0c\x03\x00?+\x00\x18?\ +3\x129/+\x11\x003\x11\x12\x01\x179\x113\x11\ +3\x113\x113\x11310\x0132654&\ +##\x11\x11#\x11! \x04\x15\x10\x05\x01!\x01\x01\ +\xb0\xa6\xa7\x96\xa2\xa3\x9e\xef\x01\x9d\x01\x1b\x01\x10\xfe\xe4\ +\x01\x9d\xfe\xf0\xfe\xa2\x03\x0e|z|l\xfd\x5c\xfd\xb8\ +\x05\xb6\xd4\xd6\xfe\xeft\xfdy\x02H\x00\x01\x00d\xff\ +\xec\x04\x0c\x05\xcb\x00$\x004@\x1b\x0c\x00\x1d\x12\x05\ +\x12\x17\x00\x04&%\x0c\x1d\x03\x15\x15\x1aLY\x15\x04\ +\x03\x09LY\x03\x13\x00?+\x00\x18?+\x11\x12\x00\ +99\x11\x12\x01\x179\x113\x11310\x01\x14\x04\ +#\x22'5\x16\x1632654&'&&5\ +4$32\x17\x07&#\x22\x06\x15\x14\x16\x16\x17\x1e\ +\x02\x04\x0c\xfe\xe6\xf8\xf8\x9ed\xe1a\x8e\x87|\xc2\xc8\ +\xa4\x01\x04\xdb\xd2\xd0L\xc3\x99tx0n\x8f\xa1\x96\ +F\x01\x8d\xc3\xdeM\xe2/6l[RrNQ\xd0\ +\x92\xb7\xd2\x5c\xc3ReS9QH;Ct\x92\x00\ +\x01\x00\x1d\x00\x00\x04h\x05\xb6\x00\x07\x00%@\x12\x00\ +\x01\x01\x03\x06\x03\x09\x08\x01\x12\x07\x03\x04\x03LY\x04\ +\x03\x00?+\x11\x003\x18?\x11\x12\x01\x179\x113\ +10!#\x11!5!\x15!\x02\xba\xef\xfeR\x04\ +K\xfeR\x04\xe9\xcd\xcd\x00\x01\x00\xb4\xff\xec\x05;\x05\ +\xb6\x00\x11\x00%@\x11\x10\x01\x0b\x08\x08\x01\x13\x12\x11\ +\x09\x03\x05\x0eLY\x05\x13\x00?+\x00\x18?3\x11\ +\x12\x0199\x113\x11310\x01\x11\x14\x06\x04#\ + \x005\x113\x11\x14\x163 \x11\x11\x05;\x8b\xfe\ +\xf9\xb7\xfe\xf0\xfe\xd2\xf0\xa8\xae\x01R\x05\xb6\xfcN\xa2\ +\xf3\x83\x01 \xfc\x03\xae\xfcc\xb5\xac\x01c\x03\x9b\x00\ +\x01\x00\x00\x00\x00\x04\xfa\x05\xb6\x00\x0c\x00*@\x14\x03\ +\x02\x09\x00\x01\x05\x04\x01\x04\x09\x03\x0e\x0d\x09\x03\x00\x04\ +\x03\x03\x12\x00??3\x129\x11\x12\x01\x179\x113\ +\x113\x113310\x013\x01#\x013\x01\x16\x16\ +\x17667\x04\x02\xf8\xfe\x00\xfc\xfe\x02\xf6\x011\x18\ +6\x08\x0d6\x11\x05\xb6\xfaJ\x05\xb6\xfcsA\xcd2\ +L\xc80\x00\x01\x00\x0c\x00\x00\x07\x83\x05\xb6\x00\x1c\x00\ +@@!\x01\x00\x18\x0a\x09\x10\x15\x14\x05\x1b\x1c\x0d\x0c\ +\x05\x0c\x10\x18\x1c\x05\x1e\x1d\x10\x05\x18\x03\x0a\x1b\x14\x0c\ +\x03\x01\x0a\x12\x00?3?33\x12\x179\x11\x12\x01\ +\x179\x113\x113\x1133\x1133\x11331\ +0!!\x03&&'\x06\x06\x07\x03!\x03\x033\x13\ +\x16\x17667\x133\x13\x16\x1767\x133\x06\x06\ +\xfe\xfc\xf8\x100\x05\x0a-\x0f\xf2\xfe\xfc\xbd\xc0\xf4\xd1\ +1\x15\x0b,\x12\xee\xed\xf4#'\x0f9\xd0\xf2\x03h\ +9\xd7*@\xcc2\xfc\x9c\x02\xdc\x02\xda\xfc\xac\xcd\x9d\ +U\xd2A\x03V\xfc\xa6w\xed\x8f\xdd\x03R\x00\x01\x00\ +\x04\x00\x00\x04\xf6\x05\xb6\x00\x0b\x005@\x1c\x01\x00\x09\ +\x0a\x07\x06\x03\x04\x04\x00\x02\x05\x06\x08\x0a\x0b\x08\x0d\x0c\ +\x02\x08\x04\x09\x06\x03\x01\x04\x12\x00?3?3\x129\ +9\x11\x12\x01\x179\x113\x113\x113\x11310\ +!!\x01\x01!\x01\x01!\x01\x01!\x01\x04\xf6\xfe\xed\ +\xfe\x92\xfe\x8f\xff\x00\x01\xe5\xfe:\x01\x0a\x01R\x01R\ +\x01\x02\xfe7\x02V\xfd\xaa\x02\xf6\x02\xc0\xfd\xd7\x02)\ +\xfd<\x00\x00\x01\x00\x00\x00\x00\x04\xbc\x05\xb6\x00\x08\x00\ +,@\x15\x01\x02\x08\x07\x00\x04\x04\x05\x02\x05\x07\x03\x0a\ +\x09\x00\x05\x01\x07\x03\x05\x12\x00??3\x129\x11\x12\ +\x01\x179\x113\x129\x113\x11310\x01\x01!\ +\x01\x11#\x11\x01!\x02^\x01Z\x01\x04\xfe\x19\xf0\xfe\ +\x1b\x01\x04\x03\x1b\x02\x9b\xfc\x81\xfd\xc9\x02/\x03\x87\x00\ +\x01\x00B\x00\x00\x04X\x05\xb6\x00\x09\x008@\x1d\x03\ +\x07\x08\x02\x00\x02\x04\x07\x04\x0b\x0a\x07\x04\x05\x05\x04L\ +Y\x05\x03\x02\x08\x01\x01\x08LY\x01\x12\x00?+\x11\ +\x12\x009\x18?+\x11\x12\x009\x11\x12\x01\x179\x11\ +3\x11310!!5\x01!5!\x15\x01!\x04\ +X\xfb\xea\x02\xe1\xfd3\x03\xee\xfd\x1c\x02\xf8\xa6\x04C\ +\xcd\xa8\xfb\xbf\x00\x00\x01\x00\x9a\xfe\xbc\x02q\x05\xb6\x00\ +\x07\x00\x1f@\x0d\x04\x00\x06\x01\x01\x00\x09\x08\x06\x01\x05\ +\x02\x03\x00?3/3\x11\x12\x0199\x113\x113\ +10\x01!\x11!\x15!\x11!\x02q\xfe)\x01\xd7\ +\xff\x00\x01\x00\xfe\xbc\x06\xfa\xb0\xfag\x00\x01\x00\x10\x00\ +\x00\x03\x0e\x05\xb6\x00\x03\x00\x1c@\x0c\x02\x01\x00\x03\x03\ +\x01\x05\x04\x03\x03\x02\x12\x00??\x11\x12\x0199\x11\ +3\x11310\x13\x01#\x01\xee\x02 \xdd\xfd\xdf\x05\ +\xb6\xfaJ\x05\xb6\x00\x01\x003\xfe\xbc\x02\x08\x05\xb6\x00\ +\x07\x00\x1f@\x0d\x03\x00\x01\x06\x06\x00\x09\x08\x00\x07\x03\ +\x04\x03\x00?3/3\x11\x12\x0199\x113\x113\ +10\x17!\x11!5!\x11!3\x01\x00\xff\x00\x01\ +\xd5\xfe+\x93\x05\x99\xb0\xf9\x06\x00\x01\x00\x1d\x02\x17\x04\ +/\x05\xbe\x00\x06\x00'@\x12\x02\x01\x05\x04\x03\x06\x00\ +\x00\x03\x05\x03\x08\x07\x05\x00\x04\x02\x03\x00?\xcd29\ +\x11\x12\x01\x179\x113\x113\x113310\x13\x01\ +3\x01#\x01\x01\x1d\x01\xb4y\x01\xe5\xc2\xfe\xa3\xfe\xcd\ +\x02\x17\x03\xa7\xfcY\x02\xb6\xfdJ\x00\x00\x01\xff\xfc\xfe\ +\xc1\x03s\xffH\x00\x03\x00\x11\xb5\x03\x05\x02\x04\x01\x02\ +\x00/3\x11\x013\x11310\x01!5!\x03s\ +\xfc\x89\x03w\xfe\xc1\x87\x00\x01\x01j\x04\xd9\x03P\x06\ +!\x00\x09\x00\x13\xb6\x08\x03\x0b\x0a\x05\x80\x00\x00/\x1a\ +\xcd\x11\x12\x019910\x01&&'5!\x16\x16\ +\x17\x15\x02\xb2E\xd30\x01\x11&\x83,\x04\xd94\xc5\ +:\x15F\xb63\x19\x00\x00\x02\x00Z\xff\xec\x04\x04\x04\ +f\x00\x1b\x00&\x00I@&\x0c\x01\x1f\x1f\x1b$\x08\ +\x08\x14\x1b\x03('\x02\x05\x17\x0c JY\x0c\x0c\x05\ +\x17\x00\x15\x17\x10HY\x17\x10\x05\x1cHY\x05\x16\x00\ +?+\x00\x18?+\x00\x18?\x11\x129/+\x11\x12\ +\x009\x11\x12\x01\x179\x113\x113\x113310\ +!'#\x06\x06#\x22&546%754&\ +#\x22\x06\x07'6632\x16\x15\x11%265\ +5\x07\x06\x06\x15\x14\x16\x03\x5c/\x08P\xa2\x7f\xa3\xb7\ +\xfe\x01\x04\xbfchU\x9cHLZ\xd6_\xd3\xd7\xfd\ +\xfa\x80\x9b\x8e\xa6\x97X\x9aeI\xb0\xa1\xab\xae\x08\x06\ +;ji2\x22\xa8/1\xb8\xc5\xfd\x17\xa0\x8f\x81`\ +\x06\x06cfJQ\x00\x00\x02\x00\xa8\xff\xec\x04\x93\x06\ +\x14\x00\x13\x00\x1f\x00@@!\x09\x18\x11\x03\x0d\x1e\x03\ +\x0d\x0b\x0b\x03! \x08\x11\x06\x00\x0c\x00\x0b\x15\x00\x14\ +FY\x00\x10\x06\x1bFY\x06\x16\x00?+\x00\x18?\ ++\x00\x18??\x11\x1299\x11\x12\x0199\x113\ +\x113\x11\x17310\x012\x12\x11\x10\x02#\x22'\ +#\x07#\x113\x11\x14\x06\x0736\x17\x22\x06\x07\x15\ +\x14\x163265\x10\x02\xdd\xcf\xe7\xea\xd0\xd2t\x10\ ++\xb0\xeb\x08\x02\x0ap\x9d\x8e}\x02\x80\x91}\x81\x04\ +f\xfe\xd4\xfe\xf1\xfe\xf0\xfe\xd1\x97\x83\x06\x14\xfe\x8e)\ +\xa2\x16\xa5\xc0\xa7\xc4\x10\xca\xb5\xc6\xbb\x01y\x00\x01\x00\ +f\xff\xec\x03\xb4\x04f\x00\x15\x00&@\x14\x0d\x03\x03\ +\x08\x12\x03\x17\x16\x06\x0bFY\x06\x10\x00\x10FY\x00\ +\x16\x00?+\x00\x18?+\x11\x12\x01\x179\x1131\ +0\x05\x22\x00\x11\x10\x00!2\x17\x07&# \x11\x14\ +\x16327\x15\x06\x06\x02f\xfb\xfe\xfb\x01\x11\x01\x02\ +\xaf\x8cG\x95a\xfe\xe1\x8f\x8a\x9d\x8c?\x8f\x14\x01%\ +\x01\x12\x01\x17\x01,A\xbd:\xfe\x83\xba\xbbN\xcd%\ + \x00\x02\x00f\xff\xec\x04T\x06\x14\x00\x12\x00\x1f\x00\ +@@!\x10\x17\x09\x03\x0c\x0c\x0e\x1d\x03\x0e\x03! \ +\x09\x11\x00\x06\x0c\x00\x0f\x15\x06\x1aFY\x06\x10\x00\x13\ +FY\x00\x16\x00?+\x00\x18?+\x00\x18??\x11\ +\x1299\x11\x12\x0199\x113\x113\x11\x1731\ +0\x05\x22\x02\x11\x10\x1232\x173&5\x113\x11\ +#'#\x06'26754&#\x22\x06\x15\x14\ +\x16\x02\x1d\xcf\xe8\xeb\xd0\xdar\x0c\x11\xec\xb8)\x0bq\ +\x9b\x91\x84\x02\x88\x91|\x86\x82\x14\x01,\x01\x0f\x01\x10\ +\x01/\xa1wE\x01\x93\xf9\xec\x91\xa5\xbe\xa3\xb7!\xd1\ +\xb0\xc9\xba\xb8\xc1\x00\x02\x00f\xff\xec\x049\x04f\x00\ +\x14\x00\x1b\x00G@'\x19\x0a\x18\x0b\x0b\x03\x03\x0a\x11\ +\x03\x1d\x1c\x18\x0bHY\x0c\x18\x1c\x18\x02\x10\x03\x18\x18\ +\x00\x06\x06\x15HY\x06\x10\x00\x0eGY\x00\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/_^]+\x11\ +\x12\x01\x179\x113\x113\x11310\x05 \x00\x11\ +\x10\x0032\x12\x15\x15!\x16\x163267\x15\x06\ +\x06\x03\x22\x06\x07!&&\x02\x8b\xfe\xfe\xfe\xdd\x01\x0e\ +\xec\xdb\xfe\xfd\x1f\x05\xa4\x95b\xa9aV\xb0\x9cp\x87\ +\x0d\x01\xf6\x02\x80\x14\x01-\x01\x08\x01\x0f\x016\xfe\xf6\ +\xe9\x7f\xa1\xad%+\xbf)\x22\x03\xc8\x8e\x88\x89\x8d\x00\ +\x01\x00#\x00\x00\x03B\x06\x1f\x00\x15\x00;@\x1e\x0d\ +\x14\x14\x07\x02\x02\x03\x00\x03\x05\x03\x17\x16\x03\x15\x0b\x10\ +FY\x0b\x00\x05\x01\x14\x01HY\x07\x14\x0f\x00?3\ ++\x11\x003\x18?+\x00\x18?\x11\x12\x01\x179\x11\ +3\x1299\x11310\x01!\x11#\x11#57\ +54632\x17\x07&#\x22\x06\x15\x15!\x02\xd3\ +\xfe\xf2\xec\xb6\xb6\xb8\xbd|x>WOPI\x01\x0e\ +\x03\xa0\xfc`\x03\xa0nHH\xc4\xbd)\xb2\x1ccc\ +H\x00\x03\x00\x17\xfe\x14\x04N\x04f\x00+\x008\x00\ +C\x00r@=+\x02%>\x059%\x0c\x1f2\x13\ +,\x19\x00\x05\x13\x19\x1f%\x06ED\x22\x08\x08V*%\xa7p\xb4\xc6\ +\x0d\x07\xfb\x02LRn[H=_\x03Ghp\xda\ +lut\x00\x01\x00\xa8\x00\x00\x04u\x06\x14\x00\x15\x00\ +3@\x19\x01\x00\x0f\x0d\x09\x09\x0a\x00\x0a\x17\x16\x0f\x0a\ +\x13\x13\x05FY\x13\x10\x0b\x00\x01\x0a\x15\x00?3?\ +?+\x11\x12\x009\x11\x12\x0199\x113\x1133\ +\x11310!#\x114&#\x22\x06\x15\x11#\x11\ +3\x11\x14\x073663 \x11\x04u\xecgp\x94\ +\x8b\xeb\xeb\x0c\x0f0\xabr\x01\x92\x02\xa8\x80~\xb1\xd0\ +\xfd\xdb\x06\x14\xfeu_lPX\xfek\x00\x00\x02\x00\ +\x9a\x00\x00\x01\xa2\x05\xfa\x00\x03\x00\x0f\x006@\x22\x0a\ +\x00\x04\x00\x01\x01\x11\x10\x0d\x1f\x07/\x07\x02_\x07o\ +\x07\x7f\x07\x9f\x07\xaf\x07\xdf\x07\xef\x07\x07\x07\x02\x0f\x01\ +\x15\x00??/]q\xcd\x11\x12\x019\x1133\x11\ +310!#\x113\x034632\x16\x15\x14\x06\ +#\x22&\x01\x93\xeb\xeb\xf9E@>EE>@E\ +\x04R\x01%?DD?EE>@E\xfe\x14\x19\xba\x12\xaa\x04\xd3\ +\xfb\x1d\xab\xb0\x07c?DD?\x1fu\xa8\xfe\xd4\xfe\ +\xf1\xfe\xf1\xfe\xd0\x03\xba\xa4\xb4#\xca\xb5\xc8\xb9\xba\xbf\ +\x00\x00\x02\x00f\xfe\x14\x04T\x04f\x00\x0b\x00 \x00\ +@@ \x1e\x16\x03\x1a\x1a\x19\x0a\x0f\x19\x0f\x22!\x1a\ +\x1b\x17\x0f\x1f\x16\x0c\x12\x12\x07FY\x12\x10\x0c\x00F\ +Y\x0c\x16\x00?+\x00\x18?+\x11\x12\x0099\x18\ +??\x11\x12\x0199\x113\x113\x113331\ +0%26554&#\x22\x06\x15\x10\x17\x22\x02\ +\x11\x10\x1232\x16\x17373\x11#\x11467\ +#\x06\x02^\x94\x81\x85\x94~\x84\xc3\xcd\xe8\xec\xcfh\ +\xa5A\x08\x1a\xc3\xec\x08\x03\x0dh\xa8\xab\xad%\xcd\xb4\ +\xc8\xbb\xfe\x85\xbc\x01-\x01\x0e\x01\x0e\x011MX\x91\ +\xf9\xc2\x01\xd5,b\x1a\xa5\x00\x00\x01\x00\xa8\x00\x00\x03\ +N\x04f\x00\x10\x00#@\x10\x0d\x09\x09\x0a\x02\x0a\x12\ +\x11\x0b\x0f\x0d\x0a\x15\x05\x00\x10\x00?2?9?\x11\ +\x12\x0199\x113\x11310\x012\x17\x07&#\ +\x22\x06\x15\x11#\x113\x17366\x02\xd9G.\x17\ +26\x8d\xaf\xeb\xb8\x1f\x0c7\xb1\x04f\x0a\xdb\x0c\xb8\ +\x93\xfd\xbe\x04R\xc3ct\x00\x00\x01\x00b\xff\xec\x03\ +\x8f\x04f\x00!\x004@\x1b\x0a\x00\x1b\x11\x00\x06\x11\ +\x16\x04#\x22\x0a\x1b\x03\x14\x14\x19GY\x14\x10\x03\x08\ +HY\x03\x16\x00?+\x00\x18?+\x11\x12\x0099\ +\x11\x12\x01\x179\x113\x11310\x01\x14\x06#\x22\ +'5\x163254&&'&&5463\ +2\x17\x07&#\x22\x15\x14\x16\x17\x1e\x02\x03\x8f\xec\xdc\ +\xdd\x86\xc3\xa8\xd90nb\xbf\x87\xe5\xc5\xc3\xaeL\xb3\ +z\xbaa\xa3\x89|<\x01;\xa2\xadC\xcbZ\x83*\ +8<&J\x94v\x8e\x9dO\xb1Jj4H?5\ +Xs\x00\x00\x01\x00'\xff\xec\x02\xf0\x05H\x00\x15\x00\ +=@\x1f\x0f\x0c\x13\x13\x08\x02\x08\x0a\x11\x04\x17\x16\x0d\ +\x0f@\x09\x12\x0c\x0f\x0f\x12HY\x0f\x0f\x06\x00FY\ +\x06\x16\x00?+\x00\x18?+\x11\x003\x113\x1a\x18\ +\x10\xcd\x11\x12\x01\x179\x113\x129910%2\ +7\x15\x06\x06# \x11\x11#5773\x15!\x15\ +!\x11\x14\x16\x02DVV'{B\xfe\xb2\x97\xa2P\ +\x91\x01;\xfe\xc5U\xaa\x1b\xb1\x11\x17\x01`\x02Th\ +V\xea\xf6\xb2\xfd\xb0UQ\x00\x00\x01\x00\x9e\xff\xec\x04\ +m\x04R\x00\x14\x000@\x17\x01\x11\x11\x14\x0b\x08\x14\ +\x08\x16\x15\x02\x05\x12\x09\x0f\x00\x15\x05\x0eFY\x05\x16\ +\x00?+\x00\x18??3\x129\x11\x12\x0199\x11\ +3\x113\x11310!'#\x06\x06#\x22&5\ +\x113\x11\x14\x163265\x113\x11\x03\xb4!\x0c\ +1\xb5t\xc9\xc6\xedho\x94\x8b\xec\x91MX\xc8\xcb\ +\x02\xd3\xfdV\x7f\x7f\xb1\xd0\x02'\xfb\xae\x00\x00\x01\x00\ +\x00\x00\x00\x04H\x04R\x00\x0b\x00(@\x13\x09\x0a\x02\ +\x01\x0b\x00\x05\x01\x0a\x05\x03\x0d\x0c\x09\x01\x0f\x05\x00\x15\ +\x00?2?3\x11\x12\x01\x179\x1133\x113\x11\ +310!\x013\x13\x16\x17367\x133\x01\x01\ +\xa4\xfe\x5c\xf8\xe1:\x0c\x08\x09=\xe1\xfa\xfeZ\x04R\ +\xfd}\xa2dH\xbe\x02\x83\xfb\xae\x00\x00\x01\x00\x14\x00\ +\x00\x06s\x04R\x00\x1d\x00>@!\x1d\x00\x17\x13\x12\ +\x04\x08\x07\x0e\x1b\x1c\x0a\x09\x04\x09\x0e\x17\x1c\x05\x1f\x1e\ +\x00\x0d\x17\x03\x08\x15\x09\x1b\x04\x03\x12\x0f\x00?\x173\ +?\x173\x11\x12\x01\x179\x113\x113\x1133\x11\ +33\x113310!\x03&\x03#\x02\x07\x03!\ +\x013\x13\x16\x173667\x13!\x13\x16\x16\x173\ +67\x133\x01\x043\x8f\x1aD\x09:\x22\x93\xfe\xfc\ +\xfe\xca\xf0\x8d0\x14\x06\x0a)\x0f\xa8\x01\x02\xa3\x0f-\ +\x04\x08\x0f7\x8f\xec\xfe\xc8\x02\x04R\x01+\xfe\xf2q\ +\xfd\xfe\x04R\xfd\xdf\xca\x90I\xbd/\x02F\xfd\xba1\ +\xca8{\xdd\x02!\xfb\xae\x00\x00\x01\x00\x19\x00\x00\x04\ +N\x04R\x00\x0b\x003@\x1a\x08\x07\x04\x05\x02\x01\x0a\ +\x0b\x00\x01\x05\x06\x07\x0b\x06\x0d\x0c\x09\x03\x0b\x04\x01\x0f\ +\x08\x0b\x15\x00?3?3\x1299\x11\x12\x01\x179\ +\x113\x113\x113\x11310\x01\x01!\x13\x13!\ +\x01\x01!\x01\x01!\x01\x9e\xfe\x8d\x01\x0c\xfc\xfe\x01\x0a\ +\xfe\x8c\x01\x87\xfe\xf6\xfe\xef\xfe\xf0\xfe\xf6\x025\x02\x1d\ +\xfe}\x01\x83\xfd\xe3\xfd\xcb\x01\x9e\xfeb\x00\x00\x01\x00\ +\x00\xfe\x14\x04J\x04R\x00\x14\x003@\x1a\x14\x0a\x04\ +\x08\x09\x01\x00\x00\x04\x09\x0f\x04\x16\x15\x04\x14\x15\x08\x00\ +\x0f\x0c\x11FY\x0c\x1b\x00?+\x00\x18?3?3\ +\x11\x12\x01\x179\x113\x113\x113310\x11!\ +\x13\x16\x17366\x133\x01\x02!\x22'5\x163\ +277\x01\x00\xe13\x11\x08\x090\xe6\xfe\xfe'\x81\ +\xfe\xd3NJ5D\xaaE)\x04R\xfd\x8d\x86v7\ +\x9d\x02\x9b\xfb\x1b\xfe\xa7\x11\xba\x0c\xc5h\x00\x00\x01\x00\ +D\x00\x00\x03\x8b\x04R\x00\x09\x008@\x1d\x03\x07\x08\ +\x02\x02\x04\x07\x09\x04\x0b\x0a\x07\x04\x05\x05\x04HY\x05\ +\x0f\x02\x08\x01\x01\x08HY\x01\x15\x00?+\x11\x12\x00\ +9\x18?+\x11\x12\x009\x11\x12\x01\x179\x113\x11\ +310!!5\x01!5!\x15\x01!\x03\x8b\xfc\ +\xb9\x02/\xfd\xf3\x03\x15\xfd\xdd\x023\x91\x03\x0d\xb4\xa4\ +\xfd\x06\x00\x00\x01\x00-\xfe\xbc\x02\xe9\x05\xb6\x00\x1c\x00\ +E@'\x0b\x18\x12\x02\x0e\x07\x15\x15\x1c\x02\x18\x1c\x03\ +\x1e\x1d\x11\x02\x02\x0f\x03\x7f\x03\x8f\x03\xaf\x03\xbf\x03\xcf\ +\x03\x06\x03\x03\x0a\x18\x19\x0b\x0a\x03\x00?3/3\x12\ +9/]3\x129\x11\x12\x01\x179\x113\x1299\ +\x119\x11310\x014!5265\x1146\ +3\x15\x06\x06\x15\x11\x14\x07\x15\x16\x15\x11\x14\x16\x17\x15\ +&&5\x017\xfe\xf6\x87\x83\xd9\xd9rg\xe5\xe5f\ +s\xe7\xcb\x01\x1f\xba\xbf[]\x017\x9c\x93\xb6\x05S\ +R\xfe\xd7\xc7'\x0c$\xc9\xfe\xd5RT\x02\xb7\x02\x99\ +\xab\x00\x01\x01\xd9\xfe\x1f\x02\x8d\x06\x10\x00\x03\x00\x14\xb7\ +\x02\x03\x03\x05\x04\x03\x00\x00\x00?/\x11\x12\x019\x11\ +310\x013\x11#\x01\xd9\xb4\xb4\x06\x10\xf8\x0f\x00\ +\x01\x00-\xfe\xbc\x02\xcb\x05\xb6\x00\x1e\x00E@'\x0b\ +\x1b\x12\x04\x17\x0e\x07\x07\x00\x00\x04\x1b\x03 \x1f\x0c\x1b\ +\x1b\x0f\x1a\x7f\x1a\x8f\x1a\xaf\x1a\xbf\x1a\xcf\x1a\x06\x1a\x1a\ +\x13\x04\x03\x12\x13\x03\x00?3/3\x129/]3\ +\x129\x11\x12\x01\x179\x113\x1299\x113\x119\ +10\x05\x14\x06\x075665\x114675&\ +5\x114&'52\x16\x15\x11\x14\x163\x15\x22\x06\ +\x15\x01\xcf\xc7\xdb_jj{\xe5[n\xdf\xc3\x7f}\ +{\x81\x14\x9c\x92\x02\xb7\x01K\x5c\x01\x06y\x84\x15\x0c\ +'\xc7\x01)RS\x05\xb6\x99\xae\xfe\xe1dT\xbfU\ +e\x00\x01\x00`\x02;\x041\x03h\x00\x15\x00@@\ +$\x0f\x03\x17\x16\x0e\x06\x03\x11\x11\x0bRY\x00\x11\x10\ +\x11\x02\x09\x03\x11\x06@\x06\x00RY\x0f\x06\x1f\x06?\ +\x06o\x06\x04\x06\x00/]+\x00\x1a\x18\x10\xcd_^\ +]+\x00\x10\x18\xc4\x10\xc6\x11\x12\x019910\x01\ +\x22\x06\x075632\x16\x17\x163267\x15\x06\ +#\x22&'&\x01J2{=c\x97BvX\x83\ +Y4}:i\x91A}T\x7f\x02\xb4<=\xbfl\ +\x1a%7>:\xbeo\x1f#7\x00\x00\x02\x00\x85\xfe\ +\x8d\x01\xae\x04^\x00\x03\x00\x0f\x00(@\x12\x04\x02\x0a\ +\x02\x03\x03\x11\x10\x00\x00\x0d\x03\x0d\x07QY\x0d\x10\x00\ +?+\x00\x18/\x129/\x11\x12\x019\x1133\x11\ +310\x133\x13!\x01\x14\x06#\x22&546\ +32\x16\xc1\xae3\xfe\xeb\x01!KJHLLH\ +HM\x02\x85\xfc\x08\x058JNOIETQ\x00\ +\x01\x00\xa6\xff\xec\x03\xf6\x05\xcb\x00\x1c\x00J@)\x0e\ +\x02\x0b\x02\x05\x16\x08\x05\x08\x10\x1c\x04\x1e\x1d\x05\x02\x02\ +\x19MY\x00\x02\x10\x02\x02\x10\x03\x02\x04\x19\x0e\x13M\ +Y\x0b\x90\x0e\x01\x0e\x0c\x07\x00?\xcd]2+\x00\x18\ +?\xc5_^]+\x11\x003\x11\x12\x01\x179\x113\ +\x1133\x11310%\x06\x07\x15#5&\x025\ +4\x12753\x15\x16\x17\x07&#\x22\x06\x15\x14\x16\ +3267\x03\xdbw\x8b\x9c\xcf\xc8\xc9\xce\x9e\x98\x83\ +F\x92h\x92\x8c\x90\x8aK\x87W\xee;\x05\xc2\xc8\x1f\ +\x01\x18\xfa\xfe\x01\x1e \xaa\xa2\x05=\xbc;\xbe\xc1\xc2\ +\xb2\x1e%\x00\x01\x00H\x00\x00\x04V\x05\xc9\x00\x1d\x00\ +U@.\x1a\x08\x0b\x0b\x17\x0f\x13\x02\x09\x10\x13\x17\x18\ +\x06\x1f\x1e\x0b\x18\x19\x18OY\x08\x0f\x19\x01\x0b\x03\x19\ +\x19\x12\x00\x00\x05MY\x00\x07\x13\x0f\x12\x0fNY\x12\ +\x18\x00?+\x11\x003\x18?+\x11\x12\x009\x18/\ +_^]3+\x11\x003\x11\x12\x01\x179\x113\x11\ +3\x129910\x012\x17\x07&#\x22\x15\x15!\ +\x15!\x15\x14\x06\x07!\x15!56655#5\ +3\x1146\x02\xb2\xc2\xb5L\xa2z\xcd\x01\x8d\xfes\ +BP\x02\xf4\xfb\xf2b^\xbc\xbc\xe3\x05\xc9R\xb6G\ +\xdb\xf4\xac\xb6[\x80-\xcf\xc3\x1e\x84p\xb8\xac\x01\x00\ +\xbc\xd4\x00\x00\x02\x00u\x01\x02\x04\x1b\x04\xa4\x00\x1b\x00\ +'\x00:@%\x22\x0e\x1c\x00\x00\x02\x05\x09\x0c\x0e\x10\ +\x13\x17\x1a\x0a)(\x09\x0c\x10\x13\x17\x1a\x02\x05\x08\x1f\ +\x15%\x0f\x07\x1f\x07o\x07\x03\x07\x00/]3\xc42\ +\x179\x11\x12\x01\x179\x113\x11310\x1347\ +'7\x17632\x177\x17\x07\x16\x15\x14\x07\x17\x07\ +'\x06#\x22'\x07'7&7\x14\x163265\ +4&#\x22\x06\xba@\x85y\x83dssb\x85y\ +\x83??\x81w\x85cr~Y\x83w\x83@\xa8\x88\ +^a\x88\x88a]\x89\x02\xd3mh\x85w\x81?A\ +\x83u\x85dswb\x81w\x81==\x7fw\x81c\ +tb\x85\x85ba\x88\x88\x00\x00\x01\x00\x12\x00\x00\x04\ +}\x05\xb6\x00\x16\x00[@3\x00\x07\x10\x03\x0b\x0b\x0c\ +\x02\x05\x09\x0c\x0e\x12\x15\x07\x18\x17\x06\x12\x13\x12PY\ +\x00\x03\x0f\x13\x1f\x13\x02\x09\x03\x13\x13\x0c\x15\x0a\x0e\x0f\ +\x0ePY\x07\x0f\x0f\x0c\x01\x15\x06\x0c\x18\x00??3\ +\x129/3+\x11\x003\x11\x129\x18/_^]\ +33+\x11\x003\x11\x12\x01\x179\x113\x12\x179\ +10\x01\x013\x013\x15!\x15!\x15!\x15#5\ +!5!5!53\x013\x02H\x01A\xf4\xfeq\ +\xe3\xfe\xe7\x01\x19\xfe\xe7\xe1\xfe\xe5\x01\x1b\xfe\xe5\xe0\xfe\ +v\xf6\x03\x1d\x02\x99\xfd\x08\x97\x9a\x99\xf4\xf4\x99\x9a\x97\ +\x02\xf8\x00\x00\x02\x01\xd9\xfe\x1f\x02\x8d\x06\x10\x00\x03\x00\ +\x07\x00$@\x10\x03\x02\x05\x05\x04\x04\x09\x08\x03\x04\x03\ +\x04\x07\x1b\x00\x00\x00??99//\x11\x12\x019\ +\x113\x129910\x013\x11#\x113\x11#\x01\ +\xd9\xb4\xb4\xb4\xb4\x06\x10\xfc\xe6\xfeE\xfc\xe4\x00\x02\x00\ +s\xff\xf2\x03\x89\x06#\x00-\x009\x00M@,4\ +\x17&\x1b.\x00\x11\x052\x197\x03\x00\x03\x05\x0b\x17\ +\x19\x1b!\x08;:\x03\x197\x142*\x06\x1e\x08\x08\ +\x0fIY\x08\x01\x1e$IY\x1e\x16\x00?+\x00\x18\ +?+\x11\x12\x00\x179\x11\x12\x01\x179\x113\x113\ +\x113\x113\x113\x11310\x13467&5\ +4632\x16\x17\x07&&#\x22\x15\x14\x16\x17\x16\ +\x16\x15\x14\x07\x16\x15\x14\x06#\x22'5\x16\x1632\ +54&&'.\x027\x14\x16\x16\x17654&\ +'\x06\x06\x81MI\x92\xdb\xb9[\xa6cDtx=\ +\xc2n\x88\xaf\x96\x8b\x8b\xec\xd0\xd4\x86M\xc0Q\xeb*\ +da\x8d\x82=\xb80m\x8cm|\x9f6E\x03'\ +P\x83+S\x98\x81\x92\x22*\xa22\x1am6O3\ +D\x9dm\xb1YP\x8f\x8e\xa5G\xb3(3\x83+6\ +6&7]ua-FD8AgKg5\x10\ +[\x00\x02\x01%\x05\x02\x03\x96\x05\xec\x00\x0b\x00\x17\x00\ +\x1e@\x0c\x0c\x12\x06\x00\x12\x00\x19\x18\x0f\x03\x15\x09\x00\ +/3\xcd2\x11\x12\x0199\x113\x11310\x01\ +4632\x16\x15\x14\x06#\x22&%4632\ +\x16\x15\x14\x06#\x22&\x01%C05?@40\ +C\x01\x89C05@B30C\x05w>7>\ +75@:;>7>76?:\x00\x00\x03\x00\ +d\xff\xec\x06D\x05\xcb\x00\x16\x00&\x006\x00F@\ +(\x03\x0f/\x1f'\x17\x09\x0f\x14\x17\x1f\x0587\x00\ +\x00\x12\x10\x12\x02\x12\x12\x1b\x06\x0f\x0c\x1f\x0c\x9f\x0c\x03\ +\x0c\x0c#3\x1b\x04+#\x13\x00?3?3\x129\ +/]3\x119/]3\x11\x12\x01\x179\x113\x11\ +3\x11310\x01\x22\x06\x15\x14\x163267\x15\ +\x06#\x22&54632\x17\x07&\x014\x12$\ +32\x04\x12\x15\x14\x02\x04#\x22$\x027\x14\x12\x04\ +32$\x1254\x02$#\x22\x04\x02\x03}ox\ +l{7~.sx\xc5\xd9\xdc\xc4\x8a\x88Aj\xfc\ +\x86\xc8\x01^\xca\xc8\x01^\xca\xc2\xfe\xa2\xd0\xcf\xfe\xa2\ +\xc3{\xa9\x01$\xa8\xaa\x01$\xa7\xa9\xfe\xdb\xa7\xa8\xfe\ +\xdf\xac\x04\x0a\xa1\x8e\x93\x9e\x1e\x15\x9e3\xf1\xde\xd6\xf7\ +F\x8f7\xfe\xd1\xc8\x01^\xca\xc8\xfe\xa2\xca\xc5\xfe\xa6\ +\xd0\xcf\x01Z\xc6\xaa\xfe\xdd\xa8\xab\x01!\xa9\xa8\x01%\ +\xa8\xa6\xfe\xdc\x00\x00\x02\x009\x03\x02\x02\x93\x05\xc7\x00\ +\x17\x00!\x009@\x1d\x0b\x01!!\x17\x1b\x07\x07\x11\ +\x17\x03#\x22!\x0b\x0b\x13\x1d\x01\x00\x00\x04\x10\x04\x02\ +\x04\x0e\x13\x04\x00?3\xd4]\xc433\x129/3\ +\x11\x12\x01\x179\x113\x113\x113310\x01'\ +\x06\x06#\x22&546774&#\x22\x07'\ +632\x16\x15\x11\x01\x06\x06\x15\x1432655\ +\x02#\x1d.vGqq\xa8\xa8kEEZx6\ +\x90\x8d\x8a\x8a\xfe\xfeGm`[\x5c\x03\x0ea76\ +ijho\x06\x04HH8sF}}\xfeA\x01\ +<\x02@1XRR+\x00\x00\x02\x00R\x00h\x04\ +!\x03\xe1\x00\x06\x00\x0d\x00)@\x13\x03\x06\x0a\x0d\x02\ +\x04\x0b\x09\x09\x04\x0d\x06\x04\x0e\x0f\x0c\x05\x08\x01\x00/\ +3\xc42\x11\x12\x01\x179\x113\x113\x113\x113\ +10\x13\x01\x17\x01\x01\x07\x01%\x01\x17\x01\x01\x07\x01\ +R\x01d\xa8\xfe\xe6\x01\x1a\xa8\xfe\x9c\x01\xc2\x01e\xa8\ +\xfe\xe5\x01\x1b\xa8\xfe\x9b\x021\x01\xb0^\xfe\xa2\xfe\xa4\ +a\x01\xaf\x1a\x01\xb0^\xfe\xa2\xfe\xa4a\x01\xaf\x00\x00\ +\x01\x00`\x01\x00\x041\x03+\x00\x05\x00#@\x10\x01\ +\x00\x03\x00\x07\x06\x01\x04\x04\x03RY/\x04\x01\x04\x00\ +/]+\x00\x18\x10\xc4\x11\x12\x0199\x11310\ +\x01#\x11!5!\x041\xb2\xfc\xe1\x03\xd1\x01\x00\x01\ +y\xb2\x00\xff\xff\x00H\x01\xc1\x02J\x02\x89\x02\x06\x00\ +\x10\x00\x00\x00\x04\x00d\xff\xec\x06D\x05\xcb\x00\x08\x00\ +\x15\x00%\x005\x00]@3\x04\x09\x0b\x0e\x0d\x0c\x00\ +\x10\x10\x11.\x1e&\x16\x09\x0c\x0e\x11\x16\x1e\x0676\ +\x0f\x00\x00\x12\x0d\x0f\x11\x1f\x11\x02\x11\x11\x1a\x08\x00\x12\ +\x10\x12\x02\x12\x12\x222\x1a\x04*\x22\x13\x00?3?\ +3\x129/]3\x119/]3\x129/3\x11\ +\x12\x01\x179\x113\x113\x113\x113\x113\x113\ +\x11310\x0132654&##\x05\x14\x07\ +\x13#\x03#\x11#\x11!2\x16\x014\x12$32\ +\x04\x12\x15\x14\x02\x04#\x22$\x027\x14\x12\x0432\ +$\x1254\x02$#\x22\x04\x02\x02\xecEJLI\ +OC\x01\x99\x99\xed\xd3\xc0Z\xbd\x01\x06\xae\xa2\xfb\xdf\ +\xc8\x01^\xca\xc8\x01^\xca\xc2\xfe\xa2\xd0\xcf\xfe\xa2\xc3\ +{\xa9\x01$\xa8\xaa\x01$\xa7\xa9\xfe\xdb\xa7\xa8\xfe\xdf\ +\xac\x03\x02FAH9}\xab>\xfes\x01Z\xfe\xa6\ +\x03\x87\x88\xfe\xc5\xc8\x01^\xca\xc8\xfe\xa2\xca\xc5\xfe\xa6\ +\xd0\xcf\x01Z\xc6\xaa\xfe\xdd\xa8\xab\x01!\xa9\xa8\x01%\ +\xa8\xa6\xfe\xdc\x00\x00\x01\xff\xfa\x06\x14\x04\x06\x06\xb8\x00\ +\x03\x00\x11\xb5\x00\x05\x01\x04\x01\x02\x00/3\x11\x013\ +\x11310\x01!5!\x04\x06\xfb\xf4\x04\x0c\x06\x14\ +\xa4\x00\x02\x00m\x039\x02\xfe\x05\xcb\x00\x0c\x00\x18\x00\ +\x1f@\x0d\x13\x06\x0d\x00\x06\x00\x1a\x19\x10\x09\x16\x03\x04\ +\x00?3\xc42\x11\x12\x0199\x113\x11310\ +\x134632\x16\x15\x14\x06#\x22&&7\x14\x16\ +32654&#\x22\x06m\xbe\x8b\x8a\xbe\xc0\x88\ +X\x99X\x99fJJfhHHh\x04\x81\x87\xc3\ +\xc0\x8a\x8b\xbdW\x98YFhgGLfh\x00\x00\ +\x02\x00`\x00\x00\x041\x04\xe1\x00\x0b\x00\x0f\x007@\ +\x1e\x06\x03\x0a\x0a\x0b\x0c\x0f\x01\x08\x0b\x05\x11\x10\x0c\x0d\ +RY\x0c\x12\x09\x01\x02\x01RY\x06\x9f\x02\x01\x02\x00\ +/]3+\x11\x003\x18?+\x11\x12\x01\x179\x11\ +3\x129910\x01!5!\x113\x11!\x15!\ +\x11#\x015!\x15\x01\xee\xfer\x01\x8e\xb4\x01\x8f\xfe\ +q\xb4\xfer\x03\xd1\x02\x98\xb2\x01\x97\xfei\xb2\xfej\ +\xfe\xfe\xb2\xb2\x00\x00\x01\x003\x02J\x02\xa6\x05\xc9\x00\ +\x16\x00'@\x13\x06\x11\x15\x02\x02\x0c\x11\x16\x04\x18\x17\ +\x09\x0e\x1f\x02\x15\x15\x01 \x00?3\x129?3\x11\ +\x12\x01\x179\x113\x11310\x01!5766\ +54&#\x22\x07'632\x16\x15\x14\x06\x07\x07\ +!\x02\xa6\xfd\x8d\xe6uA@3]l^\x8b\xaa\x88\ +\x97\x5c\x89\x8b\x01\x8d\x02J\x87\xe1pj;46X\ +yw\x84rS\x97\x7f\x81\x00\x00\x01\x00-\x029\x02\ +\xa2\x05\xc9\x00#\x009@\x1f\x17\x00\x10\x06\x00\x06\x0b\ +\x13\x1e\x03\x06%$\x03\x13\x13\x1f\x14\x01\x1f\x14\x01\x14\ +\x14\x09\x1a!\x1f\x0e\x09!\x00?3?3\x129/\ +]q3\x129\x11\x12\x01\x179\x113\x11310\ +\x01\x14\x06\x07\x16\x16\x15\x14\x06#\x22'5\x1632\ +54##53254&#\x22\x06\x07'6\ +632\x16\x02\x85QO^_\xba\xad\x94z\x91}\ +\xb3\xc7si\xb8E89a9T=\x92b\x86\x9d\ +\x04\xe3K_'\x15nM\x7f\x8a>\x9dO\x87}\x85\ +\x8148(%r.;{\x00\x01\x01j\x04\xd9\x03\ +P\x06!\x00\x09\x00\x13\xb6\x05\x00\x0b\x0a\x05\x80\x00\x00\ +/\x1a\xcd\x11\x12\x019910\x015667!\ +\x15\x06\x06\x07\x01j9y#\x01\x114\xcfG\x04\xd9\ +\x19F\xac=\x15=\xc15\x00\x00\x01\x00\xa8\xfe\x14\x04\ +u\x04R\x00\x18\x00;@\x1d\x0a\x05\x05\x08\x11\x00\x15\ +\x15\x16\x16\x08\x1a\x19\x11\x0b\x0e\x06\x17\x0f\x09\x15\x16\x1b\ +\x0e\x02FY\x0e\x16\x00?+\x00\x18???3\x12\ +99\x11\x12\x0199\x113\x1133\x113\x113\ +10\x01\x143265\x113\x11#'#\x06\x06\ +#\x22'#\x16\x16\x15\x11#\x113\x01\x93\xda\x92\x8a\ +\xec\xb7\x22\x0d0\x8fh\x8cO\x04\x03\x07\xeb\xeb\x01\xa6\ +\xfc\xb1\xd0\x02'\xfb\xae\x93STZ\x1c\xb2$\xfe\xc0\ +\x06>\x00\x00\x01\x00q\xfe\xfc\x04w\x06\x14\x00\x0f\x00\ +-@\x15\x01\x00\x04\x05\x00\x05\x0b\x03\x11\x10\x01\x05\x08\ +\x08\x0e\x05\x0e\x03KY\x0e\x00/+\x00\x18/\x129\ +/\x113\x11\x12\x01\x179\x113\x11310\x01#\ +\x11#\x11#\x11\x06#\x22&5\x1063!\x04w\ +\x89\xbf\x89>T\xd8\xcb\xda\xe8\x02D\xfe\xfc\x06\x7f\xf9\ +\x81\x033\x12\xfa\xfb\x01\x04\xfe\x00\x01\x00\x85\x029\x01\ +\xae\x03j\x00\x0b\x00\x17@\x0a\x06\x00\x00\x0d\x0c\x03\x09\ +QY\x03\x00/+\x11\x12\x019\x11310\x134\ +632\x16\x15\x14\x06#\x22&\x85LHILM\ +HHL\x02\xd3INQFGSR\x00\x00\x01\x00\ +\x00\xfe\x14\x01\xaa\x00\x00\x00\x11\x00-@\x17\x0f\x0c\x0a\ +\x00\x00\x05\x0c\x03\x13\x12\x0c\x0f@\x0b\x0eH\x0f\x0f\x0e\ +\x07\x02\x1b\x0e\x00/?3\x129/+3\x11\x12\x01\ +\x179\x113\x11310\x01\x14!\x22'5\x163\ +2654'73\x07\x16\x16\x01\xaa\xfe\xcfB7\ +6E6?\xb3T\x98)PZ\xfe\xf2\xde\x0f\x89\x0e\ +!-U\x19\xa6X\x15_\x00\x00\x01\x00T\x02J\x02\ +\x14\x05\xb6\x00\x0a\x00\x22@\x10\x00\x04\x09\x03\x01\x08\x01\ +\x0c\x0b\x07\x09\x01 \x04\x09\x1e\x00?3?\x129\x11\ +\x12\x0199\x11\x17310\x01#\x1177\x06\x06\ +\x07'%3\x02\x14\xba\x03\x05\x11/vX\x01\x19\xa7\ +\x02J\x02\x00g[\x12,Yp\xd1\x00\x02\x00=\x03\ +\x02\x02\xcf\x05\xc7\x00\x0b\x00\x17\x00%@\x12\x12\x00\x0c\ +\x06\x00\x06\x19\x18\x0f\x00\x03\x10\x03\x02\x03\x15\x09\x04\x00\ +?3\xc4]2\x11\x12\x0199\x113\x11310\ +\x01\x14\x06#\x22&54632\x16\x05\x14\x163\ +2654&#\x22\x06\x02\xcf\xaf\x9d\x96\xb0\xb1\x99\ +\x98\xb0\xfe\x10NXXNNXXN\x04d\xa4\xbe\ +\xbf\xa3\xa9\xba\xbd\xa6onnoqmm\x00\x02\x00\ +P\x00h\x04!\x03\xe1\x00\x06\x00\x0d\x00%@\x12\x0b\ +\x09\x04\x02\x00\x03\x07\x02\x0a\x09\x06\x0e\x0f\x08\x01\x01\x0c\ +\x05\x00/3\xc4/2\x11\x12\x01\x179\x113\x113\ +10\x01\x01'\x01\x017\x01\x05\x01'\x01\x017\x01\ +\x04!\xfe\x99\xa8\x01\x1b\xfe\xe5\xa8\x01g\xfe=\xfe\x9a\ +\xa8\x01\x1a\xfe\xe6\xa8\x01f\x02\x17\xfeQa\x01\x5c\x01\ +^^\xfeP\x1a\xfeQa\x01\x5c\x01^^\xfeP\xff\ +\xff\x00<\x00\x00\x061\x05\xb6\x00'\x02\x17\x02\xa6\x00\ +\x00\x00&\x00{\xe8\x00\x01\x07\x02<\x03\x5c\xfd\xb7\x00\ +\x09\xb3\x03\x02\x11\x18\x00?55\x00\xff\xff\x00.\x00\ +\x00\x06H\x05\xb6\x00'\x02\x17\x02\x83\x00\x00\x00&\x00\ +{\xda\x00\x01\x07\x00t\x03\xa2\xfd\xb7\x00\x07\xb2\x02\x10\ +\x18\x00?5\x00\xff\xff\x007\x00\x00\x06h\x05\xc9\x00\ +'\x02\x17\x02\xf8\x00\x00\x00'\x02<\x03\x93\xfd\xb7\x01\ +\x06\x00u\x0a\x00\x00\x09\xb3\x02\x01\x07\x18\x00?55\ +\x00\x00\x02\x007\xfew\x03\x96\x04^\x00\x1b\x00'\x00\ +H@&\x1c\x22\x00\x1b\x07\x13\x13\x1b\x22\x03)(\x04\ +\x17\x17\x00\x1b\x10\x1b\x02\x0b\x03\x1b\x1b\x10%%\x1fQ\ +Y%\x10\x10\x0aKY\x10\x22\x00?+\x00\x18?+\ +\x11\x12\x009\x18/_^]9\x113\x11\x12\x01\x17\ +9\x113\x113\x11310\x01\x15\x14\x06\x07\x06\x06\ +\x15\x14\x163267\x17\x06#\x22&5466\ +76655\x13\x14\x06#\x22&54632\ +\x16\x02\x8bRf|>lkZ\xa8RR\xdc\xcc\xcf\ +\xe8*Vr^>\xefKJHLLHHM\x02\ +\x85?j\x96PbbKN^7&\xb3n\xbf\xa9\ +IrhZLaO-\x01@JNOIET\ +Q\xff\xff\x00\x00\x00\x00\x05J\x07s\x02&\x00$\x00\ +\x00\x01\x07\x00C\xff\xe4\x01R\x00\x08\xb3\x02\x19\x05&\ +\x00+5\xff\xff\x00\x00\x00\x00\x05J\x07s\x02&\x00\ +$\x00\x00\x01\x07\x00v\x00\xaa\x01R\x00\x08\xb3\x02\x19\ +\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05J\x07s\x02\ +&\x00$\x00\x00\x01\x07\x01K\x00;\x01R\x00\x08\xb3\ +\x02\x1c\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05J\x07\ +H\x02&\x00$\x00\x00\x01\x07\x01R\x00-\x01R\x00\ +\x08\xb3\x02\x18\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05\ +J\x07>\x02&\x00$\x00\x00\x01\x07\x00j\x00F\x01\ +R\x00\x0a\xb4\x03\x02%\x05&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05J\x07\x09\x02&\x00$\x00\x00\x01\x06\x01\ +PVm\x00\x09\xb3\x03\x02$\x03\x00?55\x00\x00\ +\x02\xff\xfe\x00\x00\x06\xd3\x05\xb6\x00\x0f\x00\x13\x00e@\ +6\x06\x13\x13\x11\x11\x0a\x0e\x0e\x01\x08\x00\x04\x05\x05\x00\ +\x01\x0c\x10\x12\x05\x15\x14\x0a\x0dLY\x0a\x0a\x01\x06\x10\ +\x03LY\x10\x10\x01\x06\x05\x12\x09\x13\x06\x13LY\x06\ +\x03\x01\x0eLY\x01\x12\x00?+\x00\x18?+\x11\x00\ +3\x18?\x11\x129/+\x11\x12\x009\x18/+\x11\ +\x12\x01\x1793\x113\x113\x113\x1299\x113\ +\x11310!!\x11!\x03#\x01!\x15!\x11!\ +\x15!\x11!\x01!\x11#\x06\xd3\xfc\xd5\xfe\x08\xbc\xf6\ +\x02\xa6\x04/\xfd\xc5\x02\x14\xfd\xec\x02;\xfb7\x01\x9e\ +{\x01\x96\xfej\x05\xb6\xca\xfer\xc8\xfe5\x01\x99\x02\ +\x81\xff\xff\x00y\xfe\x14\x04\xcf\x05\xcb\x02&\x00&\x00\ +\x00\x00\x07\x00z\x02\x0e\x00\x00\xff\xff\x00\xc1\x00\x00\x03\ +\xfc\x07s\x02&\x00(\x00\x00\x01\x07\x00C\xff\xb7\x01\ +R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\xc1\x00\ +\x00\x03\xfc\x07s\x02&\x00(\x00\x00\x01\x07\x00v\x00\ +N\x01R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\ +\xc1\x00\x00\x03\xfc\x07s\x02&\x00(\x00\x00\x01\x07\x01\ +K\xff\xf9\x01R\x00\x08\xb3\x01\x18\x05&\x00+5\xff\ +\xff\x00\xc1\x00\x00\x03\xfc\x07>\x02&\x00(\x00\x00\x01\ +\x07\x00j\x00\x04\x01R\x00\x0a\xb4\x02\x01!\x05&\x00\ ++55\xff\xff\x004\x00\x00\x02\x98\x07s\x02&\x00\ +,\x00\x00\x01\x07\x00C\xfe\xca\x01R\x00\x08\xb3\x01\x15\ +\x05&\x00+5\xff\xff\x00J\x00\x00\x02\xd2\x07s\x02\ +&\x00,\x00\x00\x01\x07\x00v\xff\x82\x01R\x00\x08\xb3\ +\x01\x15\x05&\x00+5\xff\xff\xff\xee\x00\x00\x02\xf0\x07\ +s\x02&\x00,\x00\x00\x01\x07\x01K\xff\x0b\x01R\x00\ +\x08\xb3\x01\x18\x05&\x00+5\xff\xff\x00:\x00\x00\x02\ +\xab\x07>\x02&\x00,\x00\x00\x01\x07\x00j\xff\x15\x01\ +R\x00\x0a\xb4\x02\x01!\x05&\x00+55\x00\x02\x00\ +/\x00\x00\x05^\x05\xb6\x00\x0c\x00\x18\x00G@%\x0d\ +\x00\x12\x08\x16\x16\x04\x00\x04\x06\x14\x04\x1a\x19\x15\x06\x07\ +\x06LY\x12\x07\x07\x04\x09\x09\x11LY\x09\x03\x04\x16\ +LY\x04\x12\x00?+\x00\x18?+\x11\x12\x009\x18\ +/3+\x11\x003\x11\x12\x01\x179\x113\x1299\ +\x11310\x01\x10\x00!!\x11#53\x11! \ +\x00\x03\x10\x02##\x11!\x15!\x113 \x05^\xfe\ +n\xfe\x86\xfeo\x92\x92\x01\xbe\x01[\x01\x84\xfc\xf9\xf4\ +\xc5\x013\xfe\xcd\xa0\x02\x12\x02\xe9\xfe\x98\xfe\x7f\x02o\ +\xc8\x02\x7f\xfe\x87\xfe\xa4\x01\x04\x01\x09\xfeI\xc8\xfeZ\ +\x00\xff\xff\x00\xc1\x00\x00\x05\x83\x07H\x02&\x001\x00\ +\x00\x01\x07\x01R\x00\xb2\x01R\x00\x08\xb3\x01\x1a\x05&\ +\x00+5\xff\xff\x00y\xff\xec\x05\xd3\x07s\x02&\x00\ +2\x00\x00\x01\x07\x00C\x00w\x01R\x00\x08\xb3\x02!\ +\x05&\x00+5\xff\xff\x00y\xff\xec\x05\xd3\x07s\x02\ +&\x002\x00\x00\x01\x07\x00v\x01'\x01R\x00\x08\xb3\ +\x02!\x05&\x00+5\xff\xff\x00y\xff\xec\x05\xd3\x07\ +s\x02&\x002\x00\x00\x01\x07\x01K\x00\xba\x01R\x00\ +\x08\xb3\x02$\x05&\x00+5\xff\xff\x00y\xff\xec\x05\ +\xd3\x07H\x02&\x002\x00\x00\x01\x07\x01R\x00\xae\x01\ +R\x00\x08\xb3\x02 \x05&\x00+5\xff\xff\x00y\xff\ +\xec\x05\xd3\x07>\x02&\x002\x00\x00\x01\x07\x00j\x00\ +\xcb\x01R\x00\x0a\xb4\x03\x02-\x05&\x00+55\x00\ +\x01\x00\x83\x01\x0e\x04\x0e\x04\x98\x00\x0b\x00\x1c@\x0f\x01\ +\x03\x05\x07\x09\x0b\x06\x0d\x0c/\x00_\x00\x02\x00\x00\x19\ +/]\x11\x12\x01\x17910\x01\x017\x01\x01\x17\x01\ +\x01\x07\x01\x01'\x01\xc9\xfe\xba}\x01H\x01I}\xfe\ +\xb7\x01E{\xfe\xb7\xfe\xbc}\x02\xd3\x01F\x7f\xfe\xba\ +\x01F{\xfe\xb6\xfe\xb8}\x01F\xfe\xba}\x00\x03\x00\ +y\xff\xb4\x05\xd3\x05\xfc\x00\x13\x00\x1b\x00#\x00N@\ +-\x16\x17\x1e\x1f\x04\x14\x1c\x14\x00\x1c\x0a\x00\x05\x08\x0a\ +\x0f\x05%$\x17\x1e\x16\x1f\x04!\x19\x0f\x12\x08\x05\x04\ +\x03\x0d\x0d!LY\x0d\x04\x03\x19LY\x03\x13\x00?\ ++\x00\x18?+\x11\x12\x00\x179\x11\x12\x179\x11\x12\ +\x01\x179\x113\x113\x11\x12\x17910\x01\x10\x00\ +!\x22'\x07'7&\x11\x10\x00!2\x177\x17\x07\ +\x16\x034'\x01\x1632\x12\x01\x14\x17\x01&#\x22\ +\x02\x05\xd3\xfe\x9b\xfe\xb9\xd5\x94^\x8db\xbc\x01e\x01\ +K\xc7\x9bZ\x8ec\xc3\xfeP\xfd\xb6a\x8b\xd5\xd9\xfc\ +\xa2N\x02K\x5c\x8b\xd7\xdb\x02\xdd\xfe\x9b\xfetQ\x89\ +^\x90\xc4\x01y\x01j\x01\x84R\x81\x5c\x8c\xc7\xfe\x90\ +\xe1\x88\xfc\xae<\x01\x14\x01\x11\xe7\x83\x03R;\xfe\xea\ +\x00\xff\xff\x00\xb4\xff\xec\x05;\x07s\x02&\x008\x00\ +\x00\x01\x07\x00C\x007\x01R\x00\x08\xb3\x01\x1b\x05&\ +\x00+5\xff\xff\x00\xb4\xff\xec\x05;\x07s\x02&\x00\ +8\x00\x00\x01\x07\x00v\x00\xee\x01R\x00\x08\xb3\x01\x1b\ +\x05&\x00+5\xff\xff\x00\xb4\xff\xec\x05;\x07s\x02\ +&\x008\x00\x00\x01\x07\x01K\x00\x8b\x01R\x00\x08\xb3\ +\x01\x1e\x05&\x00+5\xff\xff\x00\xb4\xff\xec\x05;\x07\ +>\x02&\x008\x00\x00\x01\x07\x00j\x00\x98\x01R\x00\ +\x0a\xb4\x02\x01'\x05&\x00+55\xff\xff\x00\x00\x00\ +\x00\x04\xbc\x07s\x02&\x00<\x00\x00\x01\x07\x00v\x00\ +X\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\x00\x02\x00\ +\xc1\x00\x00\x04\x91\x05\xb6\x00\x0c\x00\x15\x00F@%\x11\ +\x00\x0d\x09\x05\x05\x06\x06\x00\x17\x16\x09\x15LY\x00\x09\ +\x10\x09\x02\x0c\x03\x09\x09\x06\x07\x0d\x04LY\x0d\x0d\x06\ +\x07\x03\x06\x12\x00??\x129/+\x11\x12\x009\x18\ +/_^]+\x11\x12\x0199\x113\x1133\x11\ +310\x01\x14\x04!#\x11#\x113\x153 \x04\ +\x0132654&##\x04\x91\xfe\xdc\xfe\xeb\xa8\ +\xef\xef\xc5\x01\x0c\x01\x10\xfd\x1f\x85\xbb\xac\x9c\xac\xa4\x03\ +\x08\xe3\xf4\xfe\xcf\x05\xb6\xf3\xe0\xfe\x15~\x8c\x7f{\x00\ +\x01\x00\xa8\xff\xec\x05\x02\x06\x1f\x003\x00A@\x22%\ +\x00\x06\x1f\x19\x0e,-\x00\x0e\x14\x1f-\x0554\x19\ +%\x111-\x151(FY1\x00\x11\x17HY\x11\ +\x16\x00?+\x00\x18?+\x00\x18?\x11\x1299\x11\ +\x12\x01\x179\x113\x113\x113\x11310\x01\x14\ +\x06\x07\x06\x06\x15\x14\x16\x17\x17\x1e\x02\x15\x14\x06#\x22\ +'5\x16\x163254&'&&5467\ +6654&#\x22\x06\x15\x11#\x114$32\ +\x04\x04}MBZ6-9_\x5cW,\xd6\xcc\xbe\ +m:\xa2C\xc0EywhDGK@\x86o\x7f\ +\x86\xeb\x01\x01\xef\xe1\x01\x04\x04\xe5J\x853E:\x1c\ +\x1e3&@>_pG\xa5\xacA\xc7%1\x97=\ +XJI|T?i57U3HQli\xfb\ +s\x04\x91\xc1\xcd\xa8\x00\xff\xff\x00Z\xff\xec\x04\x04\x06\ +!\x02&\x00D\x00\x00\x01\x06\x00C\x99\x00\x00\x08\xb3\ +\x020\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\x04\x06\ +!\x02&\x00D\x00\x00\x01\x06\x00vL\x00\x00\x08\xb3\ +\x020\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\x04\x06\ +!\x02&\x00D\x00\x00\x01\x06\x01K\xe8\x00\x00\x08\xb3\ +\x023\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\x04\x05\ +\xf6\x02&\x00D\x00\x00\x01\x06\x01R\xe4\x00\x00\x08\xb3\ +\x02/\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\x04\x05\ +\xec\x02&\x00D\x00\x00\x01\x06\x00j\xf5\x00\x00\x0a\xb4\ +\x03\x02<\x11&\x00+55\xff\xff\x00Z\xff\xec\x04\ +\x04\x06\x9c\x02&\x00D\x00\x00\x01\x06\x01P\x0e\x00\x00\ +\x0a\xb4\x03\x02*\x11&\x00+55\x00\x03\x00Z\xff\ +\xec\x06\xb8\x04f\x00&\x000\x007\x00s@?!\ +\x0f\x16\x04-4\x16\x16-5\x15'\x00\x00\x0a\x15\x1a\ +-\x0598\x0f!$\x0d\x04-JY\x04\x04$\x0d\ +4\x16IY44$\x0d\x111HY\x0d\x07HY\ +\x11\x0d\x10\x1e\x18GY$)HY\x1e$\x16\x00?\ +3++\x00\x18?3++\x11\x12\x009\x18/+\ +\x11\x12\x009\x18/+\x11\x12\x0099\x11\x12\x01\x17\ +9\x113\x113\x113\x113\x113\x129910\ +\x13467754#\x22\x07'6632\x17\ +632\x12\x15\x15!\x12!27\x15\x06\x06#\x22\ +&'\x06\x06#\x22&7\x1432655\x07\x06\ +\x06\x01\x22\x06\x07!4&Z\xf3\xf9\xbc\xc9\x8d\xa6J\ +X\xd1c\xf1cx\xe2\xce\xf4\xfd8\x0a\x01#\xb8\xac\ +V\xabn\x8c\xd9C^\xc1\x91\xa5\xbb\xf4\xa6|\x90\x87\ +\x9b\x90\x03\xa4p\x83\x09\x01\xd9u\x01=\xac\xad\x08\x06\ +L\xc2R\xa6/1\x9b\x9b\xfe\xf3\xe4\x7f\xfe\xb0P\xbf\ +)\x22mn}^\xb4\x9b\x9b\x91\x7f`\x06\x06a\x02\ +\x11\x8b\x8b\x82\x94\xff\xff\x00f\xfe\x14\x03\xb4\x04f\x02\ +&\x00F\x00\x00\x00\x07\x00z\x01d\x00\x00\xff\xff\x00\ +f\xff\xec\x049\x06!\x02&\x00H\x00\x00\x01\x06\x00\ +C\xaf\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\xff\x00\ +f\xff\xec\x049\x06!\x02&\x00H\x00\x00\x01\x06\x00\ +v`\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\xff\x00\ +f\xff\xec\x049\x06!\x02&\x00H\x00\x00\x01\x06\x01\ +K\x00\x00\x00\x08\xb3\x02(\x11&\x00+5\xff\xff\x00\ +f\xff\xec\x049\x05\xec\x02&\x00H\x00\x00\x01\x06\x00\ +j\x0e\x00\x00\x0a\xb4\x03\x021\x11&\x00+55\xff\ +\xff\xff\xbb\x00\x00\x01\xa1\x06!\x02&\x00\xf3\x00\x00\x01\ +\x07\x00C\xfeQ\x00\x00\x00\x08\xb3\x01\x0d\x11&\x00+\ +5\xff\xff\x00\x9c\x00\x00\x02\x82\x06!\x02&\x00\xf3\x00\ +\x00\x01\x07\x00v\xff2\x00\x00\x00\x08\xb3\x01\x0d\x11&\ +\x00+5\xff\xff\xff\x9c\x00\x00\x02\x9e\x06!\x02&\x00\ +\xf3\x00\x00\x01\x07\x01K\xfe\xb9\x00\x00\x00\x08\xb3\x01\x10\ +\x11&\x00+5\xff\xff\xff\xe7\x00\x00\x02X\x05\xec\x02\ +&\x00\xf3\x00\x00\x01\x07\x00j\xfe\xc2\x00\x00\x00\x0a\xb4\ +\x02\x01\x19\x11&\x00+55\x00\x02\x00f\xff\xec\x04\ +}\x06!\x00\x1b\x00'\x00P@+\x0c\x1c\x1c\x00\x22\ +\x06\x00\x06\x10\x13\x18\x05)(\x16\x19\x11\x0e\x10\x05\x17\ +\x0f\x0f\x14\x0c\x03\x09\x09\x1fGY\x09\x09\x03\x17\x14\x01\ +\x03%GY\x03\x16\x00?+\x00\x18?\xc6\x129/\ ++\x11\x12\x009\x129\x18/\x12\x179\x11\x12\x01\x17\ +9\x113\x113\x11310\x01\x10\x00#\x22\x005\ +4\x0032\x177&'\x07'7&'7\x16\x17\ +7\x17\x07\x16\x12\x034&#\x22\x06\x15\x14\x1632\ +6\x04}\xfe\xed\xfb\xeb\xfe\xe2\x01\x06\xdc\xd6W\x08>\ +\xa5\xfaX\xccVQT\x8cv\xe7X\xbc\x98\x9f\xf0\x97\ +\x83\x97\x86\x94\x89\x94\x86\x027\xfe\xe9\xfe\xcc\x01\x10\xe5\ +\xe7\x01\x0do\x04\xbd\x9c\x96\x85w;+\x92?Q\x8a\ +\x81q\x8c\xfe\x84\xfe\xe9\x7f\x96\xa4\x9e\x99\xa2\xb6\x00\xff\ +\xff\x00\xa8\x00\x00\x04u\x05\xf6\x02&\x00Q\x00\x00\x01\ +\x06\x01R!\x00\x00\x08\xb3\x01\x1c\x11&\x00+5\xff\ +\xff\x00f\xff\xec\x04}\x06!\x02&\x00R\x00\x00\x01\ +\x06\x00C\xbb\x00\x00\x08\xb3\x02\x1f\x11&\x00+5\xff\ +\xff\x00f\xff\xec\x04}\x06!\x02&\x00R\x00\x00\x01\ +\x06\x00vo\x00\x00\x08\xb3\x02\x1f\x11&\x00+5\xff\ +\xff\x00f\xff\xec\x04}\x06!\x02&\x00R\x00\x00\x01\ +\x06\x01K\x0c\x00\x00\x08\xb3\x02\x22\x11&\x00+5\xff\ +\xff\x00f\xff\xec\x04}\x05\xf6\x02&\x00R\x00\x00\x01\ +\x06\x01R\xff\x00\x00\x08\xb3\x02\x1e\x11&\x00+5\xff\ +\xff\x00f\xff\xec\x04}\x05\xec\x02&\x00R\x00\x00\x01\ +\x06\x00j\x12\x00\x00\x0a\xb4\x03\x02+\x11&\x00+5\ +5\x00\x03\x00`\x00\xec\x041\x04\xb6\x00\x03\x00\x0f\x00\ +\x1b\x004@\x1a\x16\x10\x0a\x04\x00\x03\x04\x10\x04\x1d\x1c\ +\x07\x0d\x19\x13\x0d\x13\x01\x01\x00RY/\x01\x01\x01\x00\ +/]+\x11\x0033\x18/3/3\x11\x12\x01\x17\ +9\x113\x11310\x135!\x15\x014632\ +\x16\x15\x14\x06#\x22&\x114632\x16\x15\x14\x06\ +#\x22&`\x03\xd1\xfd\x98?@=@D9\xc1\xa5\xfd\x17\x05\ +\xb6\xfb\xea{\x01\xae\x01\xed\xfaP\xc9\xd5\x00\x00\x01\x00\ +\xa8\xfe\x14\x04u\x04f\x00\x1d\x00<@\x1f\x07\x1b\x13\ +\x0f\x0f\x10\x03\x10\x1b\x03\x1f\x1e\x13\x10\x17\x11\x0f\x10\x15\ +\x17\x0bFY\x17\x10\x00\x05FY\x00\x1b\x00?+\x00\ +\x18?+\x00\x18??\x11\x129\x11\x12\x01\x179\x11\ +3\x113\x11310\x01\x22'5\x16325\x11\ +4&#\x22\x06\x15\x11#\x113\x1736632\ +\x16\x15\x11\x14\x06\x031bB:?\x83in\x95\x8a\ +\xeb\xb8!\x0e1\xb3r\xcb\xc5\xa6\xfe\x14\x19\xba\x12\xaa\ +\x035zx\xb0\xcf\xfd\xd9\x04R\x91OV\xca\xcb\xfc\ +\x9e\xa9\xb2\xff\xff\x00y\xff\xec\x05\xd3\x06\xd9\x02&\x00\ +2\x00\x00\x01\x07\x01M\x00\xc5\x01R\x00\x08\xb3\x02\x1b\ +\x05&\x00+5\xff\xff\x00f\xff\xec\x04}\x05\x87\x02\ +&\x00R\x00\x00\x01\x06\x01M\x0e\x00\x00\x08\xb3\x02\x19\ +\x11&\x00+5\xff\xff\x00y\xff\xec\x05\xd3\x07Z\x02\ +&\x002\x00\x00\x01\x07\x01N\x00\xc3\x01R\x00\x08\xb3\ +\x02\x18\x05&\x00+5\xff\xff\x00f\xff\xec\x04}\x06\ +\x08\x02&\x00R\x00\x00\x01\x06\x01N\x0c\x00\x00\x08\xb3\ +\x02\x16\x11&\x00+5\xff\xff\x00y\xff\xec\x05\xd3\x07\ +s\x02&\x002\x00\x00\x01\x07\x01S\x01+\x01R\x00\ +\x0a\xb4\x03\x02*\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x04}\x06!\x02&\x00R\x00\x00\x01\x06\x01Sj\ +\x00\x00\x0a\xb4\x03\x02(\x11&\x00+55\x00\x02\x00\ +y\xff\xec\x07\x1b\x05\xcd\x00\x14\x00\x1f\x00V@/\x0d\ +\x00\x0f\x13\x13\x1d\x18\x06\x00\x06\x11\x1d\x04! \x0f\x12\ +LY\x0f\x0f\x01\x0b\x0b\x0eLY\x0b\x03\x09\x15LY\ +\x09\x04\x01\x13LY\x01\x13\x03\x1bLY\x03\x12\x00?\ ++\x00\x18?+\x00\x18?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x01\x179\x113\x113\x113\x11\ +310!!\x06# \x00\x11\x10\x00!2\x17!\ +\x15!\x11!\x15!\x11!\x01\x22\x02\x11\x10\x1232\ +7\x11&\x07\x1b\xfc\xccfm\xfe\xc0\xfe\xa5\x01X\x01\ +?s^\x03:\xfd\xc0\x02\x1b\xfd\xe5\x02@\xfb\xfe\xd0\ +\xd6\xd4\xd0\x81TP\x14\x01\x89\x01j\x01h\x01\x86\x17\ +\xca\xfer\xc8\xfe5\x045\xfe\xea\xfe\xf3\xfe\xf3\xfe\xe8\ +#\x04\x00%\x00\x00\x03\x00f\xff\xec\x07L\x04f\x00\ +\x1d\x00)\x000\x00o@=\x0d\x02$-\x14\x14$\ +.\x13\x1e\x07\x07\x13\x1a$\x0421\x0d\x02\x04\x0a-\ +\x14HY\x0c-\x1c-\x02\x10\x03--\x04\x0a\x0f*\ +HY\x0f\x0a\x0a'FY\x0a\x10\x00\x17GY\x00\x04\ +\x04!FY\x04\x16\x00?+\x11\x003+\x00\x18?\ ++\x11\x003+\x11\x12\x009\x18/_^]+\x11\ +\x12\x0099\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x129910\x05 '\x06!\x22\x00\x11\x10\x00\ +32\x16\x17632\x00\x15\x15!\x16\x16326\ +7\x15\x06\x06\x01\x14\x1632654&#\x22\x06\ +%\x22\x06\x07!4&\x05\x9e\xfe\xe7\x8b\x84\xfe\xf4\xec\ +\xfe\xe8\x01\x12\xf5y\xccB\x83\xf8\xdd\x01\x00\xfd\x1e\x0b\ +\x95\x9af\xaa`T\xaf\xfbG\x83\x92\x8d\x83\x84\x91\x8f\ +\x81\x04\x19n\x87\x0b\x01\xf1~\x14\xc2\xc2\x016\x01\x09\ +\x01\x10\x01+b`\xc2\xfe\xf5\xe8\x7f\xa4\xaa%+\xbf\ +(#\x02?\xbd\xc2\xbf\xbc\xc0\xbf\xbe\xcc\x8b\x8b\x86\x90\ +\x00\xff\xff\x00\xc1\x00\x00\x05\x0a\x07s\x02&\x005\x00\ +\x00\x01\x07\x00v\x00\x85\x01R\x00\x08\xb3\x02\x1f\x05&\ +\x00+5\xff\xff\x00\xa8\x00\x00\x03N\x06!\x02&\x00\ +U\x00\x00\x01\x06\x00v\xf3\x00\x00\x08\xb3\x01\x1a\x11&\ +\x00+5\xff\xff\x00\xc1\xfe;\x05\x0a\x05\xb6\x02&\x00\ +5\x00\x00\x00\x07\x029\x00\x98\x00\x00\xff\xff\x00a\xfe\ +;\x03N\x04f\x02&\x00U\x00\x00\x00\x07\x029\xfe\ +\xfb\x00\x00\xff\xff\x00\xc1\x00\x00\x05\x0a\x07s\x02&\x00\ +5\x00\x00\x01\x07\x01L\x00'\x01R\x00\x08\xb3\x02\x1b\ +\x05&\x00+5\xff\xff\x00k\x00\x00\x03m\x06!\x02\ +&\x00U\x00\x00\x01\x06\x01L\x88\x00\x00\x08\xb3\x01\x16\ +\x11&\x00+5\xff\xff\x00d\xff\xec\x04\x0c\x07s\x02\ +&\x006\x00\x00\x01\x07\x00v\x00N\x01R\x00\x08\xb3\ +\x01.\x05&\x00+5\xff\xff\x00b\xff\xec\x03\x8f\x06\ +!\x02&\x00V\x00\x00\x01\x06\x00v\xfb\x00\x00\x08\xb3\ +\x01+\x11&\x00+5\xff\xff\x00d\xff\xec\x04\x0c\x07\ +s\x02&\x006\x00\x00\x01\x07\x01K\xff\xea\x01R\x00\ +\x08\xb3\x011\x05&\x00+5\xff\xff\x00b\xff\xec\x03\ +\x8f\x06!\x02&\x00V\x00\x00\x01\x06\x01K\x9d\x00\x00\ +\x08\xb3\x01.\x11&\x00+5\xff\xff\x00d\xfe\x14\x04\ +\x0c\x05\xcb\x02&\x006\x00\x00\x00\x07\x00z\x01D\x00\ +\x00\xff\xff\x00b\xfe\x14\x03\x8f\x04f\x02&\x00V\x00\ +\x00\x00\x07\x00z\x01\x00\x00\x00\xff\xff\x00d\xff\xec\x04\ +\x0c\x07s\x02&\x006\x00\x00\x01\x07\x01L\xff\xe8\x01\ +R\x00\x08\xb3\x01*\x05&\x00+5\xff\xff\x00b\xff\ +\xec\x03\x8f\x06!\x02&\x00V\x00\x00\x01\x06\x01L\xa3\ +\x00\x00\x08\xb3\x01'\x11&\x00+5\xff\xff\x00\x1d\xfe\ +;\x04h\x05\xb6\x02&\x007\x00\x00\x00\x06\x029!\ +\x00\xff\xff\x00'\xfe;\x02\xf0\x05H\x02&\x00W\x00\ +\x00\x00\x06\x029\xa9\x00\xff\xff\x00\x1d\x00\x00\x04h\x07\ +s\x02&\x007\x00\x00\x01\x07\x01L\xff\xe2\x01R\x00\ +\x08\xb3\x01\x0d\x05&\x00+5\xff\xff\x00'\xff\xec\x03\ +N\x06\x1e\x02&\x00W\x00\x00\x00\x07\x028\x00\xb8\x00\ +\x0a\x00\x01\x00\x1d\x00\x00\x04h\x05\xb6\x00\x0f\x00?@\ +!\x0c\x05\x00\x00\x01\x01\x03\x07\x0a\x0e\x05\x11\x10\x0f\x03\ +\x04\x03KY\x0c\x04\x04\x08\x01\x12\x0b\x07\x08\x07LY\ +\x08\x03\x00?+\x11\x003\x18?\x129/3+\x11\ +\x003\x11\x12\x01\x179\x113\x129910!#\ +\x11!5!\x11!5!\x15!\x11!\x15!\x02\xba\ +\xef\xfe\xe7\x01\x19\xfeR\x04K\xfeR\x01\x17\xfe\xe9\x02\ +{\xc4\x01\xaa\xcd\xcd\xfeV\xc4\x00\x01\x00'\xff\xec\x02\ +\xf0\x05H\x00\x1d\x00W@/\x0e\x11\x17\x14\x04\x1b\x1b\ +\x0a\x02\x0a\x0b\x0f\x16\x19\x06\x1f\x1e\x12\x14@\x1b\x18\x0b\ +\x0c\x0c\x0bIY\x0c\x0c\x06\x14\x0e\x17\x14\x17HY\x11\ +\x14\x0f\x06\x00FY\x06\x16\x00?+\x00\x18?3+\ +\x11\x003\x11\x129\x18/+\x11\x12\x0099\x1a\x18\ +\x10\xcd\x11\x12\x01\x179\x113\x12\x17910%2\ +7\x15\x06\x06#\x22&55#535#57\ +73\x15!\x15!\x15!\x15!\x15\x14\x02FM]\ +&}A\xab\xa3\x87\x87\x97\xa2P\x91\x01;\xfe\xc5\x01\ +!\xfe\xdf\xaa\x1b\xb1\x11\x17\xb2\xb4\xc9\xa3\xe2hV\xea\ +\xf6\xb2\xe2\xa3\xc3\xae\x00\xff\xff\x00\xb4\xff\xec\x05;\x07\ +H\x02&\x008\x00\x00\x01\x07\x01R\x00\x85\x01R\x00\ +\x08\xb3\x01\x1a\x05&\x00+5\xff\xff\x00\x9e\xff\xec\x04\ +m\x05\xf6\x02&\x00X\x00\x00\x01\x06\x01R\x12\x00\x00\ +\x08\xb3\x01\x1d\x11&\x00+5\xff\xff\x00\xb4\xff\xec\x05\ +;\x06\xd9\x02&\x008\x00\x00\x01\x07\x01M\x00\x96\x01\ +R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\x9e\xff\ +\xec\x04m\x05\x87\x02&\x00X\x00\x00\x01\x06\x01M#\ +\x00\x00\x08\xb3\x01\x18\x11&\x00+5\xff\xff\x00\xb4\xff\ +\xec\x05;\x07Z\x02&\x008\x00\x00\x01\x07\x01N\x00\ +\x91\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\xff\xff\x00\ +\x9e\xff\xec\x04m\x06\x08\x02&\x00X\x00\x00\x01\x06\x01\ +N!\x00\x00\x08\xb3\x01\x15\x11&\x00+5\xff\xff\x00\ +\xb4\xff\xec\x05;\x07\xee\x02&\x008\x00\x00\x01\x07\x01\ +P\x00\xaa\x01R\x00\x0a\xb4\x02\x01\x15\x05&\x00+5\ +5\xff\xff\x00\x9e\xff\xec\x04m\x06\x9c\x02&\x00X\x00\ +\x00\x01\x06\x01P7\x00\x00\x0a\xb4\x02\x01\x18\x11&\x00\ ++55\xff\xff\x00\xb4\xff\xec\x05;\x07s\x02&\x00\ +8\x00\x00\x01\x07\x01S\x00\xfe\x01R\x00\x0a\xb4\x02\x01\ +$\x05&\x00+55\xff\xff\x00\x9e\xff\xec\x04x\x06\ +!\x02&\x00X\x00\x00\x01\x07\x01S\x00\x91\x00\x00\x00\ +\x0a\xb4\x02\x01'\x11&\x00+55\xff\xff\x00\xb4\xfe\ ++\x05;\x05\xb6\x02&\x008\x00\x00\x00\x07\x01Q\x02\ +3\x00\x00\xff\xff\x00\x9e\xfe+\x04}\x04R\x02&\x00\ +X\x00\x00\x00\x07\x01Q\x02\xf6\x00\x00\xff\xff\x00\x0c\x00\ +\x00\x07\x83\x07s\x02&\x00:\x00\x00\x01\x07\x01K\x01\ +b\x01R\x00\x08\xb3\x01)\x05&\x00+5\xff\xff\x00\ +\x14\x00\x00\x06s\x06!\x02&\x00Z\x00\x00\x01\x07\x01\ +K\x00\xdf\x00\x00\x00\x08\xb3\x01*\x11&\x00+5\xff\ +\xff\x00\x00\x00\x00\x04\xbc\x07s\x02&\x00<\x00\x00\x01\ +\x07\x01K\xff\xfb\x01R\x00\x08\xb3\x01\x15\x05&\x00+\ +5\xff\xff\x00\x00\xfe\x14\x04J\x06!\x02&\x00\x5c\x00\ +\x00\x01\x06\x01K\xc6\x00\x00\x08\xb3\x01!\x11&\x00+\ +5\xff\xff\x00\x00\x00\x00\x04\xbc\x07>\x02&\x00<\x00\ +\x00\x01\x07\x00j\x00\x00\x01R\x00\x0a\xb4\x02\x01\x1e\x05\ +&\x00+55\xff\xff\x00B\x00\x00\x04X\x07s\x02\ +&\x00=\x00\x00\x01\x07\x00v\x00H\x01R\x00\x08\xb3\ +\x01\x13\x05&\x00+5\xff\xff\x00D\x00\x00\x03\x8b\x06\ +!\x02&\x00]\x00\x00\x01\x06\x00v\xff\x00\x00\x08\xb3\ +\x01\x13\x11&\x00+5\xff\xff\x00B\x00\x00\x04X\x07\ +L\x02&\x00=\x00\x00\x01\x07\x01O\x01-\x01R\x00\ +\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x00D\x00\x00\x03\ +\x8b\x05\xfa\x02&\x00]\x00\x00\x01\x07\x01O\x00\xcb\x00\ +\x00\x00\x08\xb3\x01\x13\x11&\x00+5\xff\xff\x00B\x00\ +\x00\x04X\x07s\x02&\x00=\x00\x00\x01\x07\x01L\xff\ +\xef\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00\ +D\x00\x00\x03\x8b\x06!\x02&\x00]\x00\x00\x01\x06\x01\ +L\x90\x00\x00\x08\xb3\x01\x0f\x11&\x00+5\x00\x01\x00\ +\xa8\x00\x00\x03\x0c\x06\x1f\x00\x0c\x00!@\x0f\x0a\x03\x03\ +\x04\x04\x0e\x0d\x04\x15\x08\x00FY\x08\x00\x00?+\x00\ +\x18?\x11\x12\x019\x113\x11310\x01\x22\x15\x11\ +#\x114632\x17\x07&\x02/\x9c\xeb\xb5\xc2\x83\ +j9]\x05`\xc0\xfb`\x04\xa6\xbe\xbb+\xb2\x1e\x00\ +\x01\x00\xc3\xfe\x14\x04#\x05\xcb\x00\x1f\x00D@$\x1a\ +\x0c\x1e\x1e\x08\x03\x08\x0a\x13\x1c\x05! \x09\x1d\x1a\x1d\ +HY\x0c\x1a\x1a\x10\x00\x10\x16FY\x10\x07\x00\x05F\ +Y\x00\x1b\x00?+\x00\x18?+\x11\x12\x009\x18/\ +3+\x11\x003\x11\x12\x01\x179\x113\x12991\ +0\x01\x22'5\x163265\x11#5754\ +632\x16\x17\x07&#\x22\x06\x15\x153\x15#\x11\ +\x10\x01bWH>>PF\xc3\xc3\xa6\xbeNr*\ +:WBNA\xfd\xfb\xfe\x14\x15\xbe\x12Zg\x03\x9d\ +qEo\xbf\xb4\x1e\x0f\xb0\x1eWam\xb4\xfcN\xfe\ +\x93\x00\x04\x00\x00\x00\x00\x05L\x07\xaa\x00\x10\x00\x17\x00\ +!\x00.\x00t@3\x09\x02\x14\x04\x03\x07\x08\x00\x03\ +\x05\x06\x08\x0b\x11\x14\x17\x18\x1d\x0b0/\x18@\x0d\x13\ +H\x18\x0e\x0e%KY\x14\x09\x02\x03,\x17\x06LY\ +\x17,\x17,\x00\x0e\x10\x0e\x02\x0e\xb8\xff\xc0@\x12\x0d\ +\x10H\x0e\x0e\x08\x0f\x1c\x01\x1c@\x0d\x13H\x1c\x04\x08\ +\x12\x00?3/+]\x129/+]99//\ ++\x11\x00\x173+\x00\x18\x10\xc6+\x11\x12\x01\x179\ +\x113\x113\x113310\x01\x14\x07\x01#\x03!\ +\x03#\x01&54632\x16\x03\x03&'\x06\x06\ +\x03\x135667!\x15\x06\x06\x07\x134&#\x22\ +\x06\x15\x14\x163326\x03\x93K\x02\x04\xfc\x8d\xfd\ +\xc2\x89\xfc\x02\x04L\x81kg\x88\x0cuQ\x1b\x0c\x1b\ +\xb8p\x1ep \x01\x11\x1f\xbfC9<./<3\ +2\x0a-9\x05\xa6j>\xfb\x02\x01m\xfe\x93\x04\xfc\ +:nf{y\xfc/\x014\xc6k&P\xfe\x11\x04\ +\x7f\x13\x1d\x8b5\x0e'\x91*\xfe\xea37732\ +99\x00\x00\x05\x00Z\xff\xec\x04\x04\x07\xaa\x00\x1b\x00\ +&\x00.\x00:\x00F\x00\x92@\x16D8>2\x0c\ +\x01\x1f\x1f\x1b$\x08\x08\x14\x1b28'*\x07HG\ +.\xb8\xff\xc0@>\x0a\x0eH..5o*\x01\x0f\ +*?*_*\x03\x0c*;\x005P5`5\x90\ +5\xa05\x05\x10\x035A/\x17@\x02\x05\x17\x0c \ +JY\x0c\x0c\x05\x17\x00\x15\x17\x10HY\x17\x10\x05\x1c\ +HY\x05\x16\x00?+\x00\x18?+\x00\x18?\x11\x12\ +9/+\x11\x12\x009\x1a\x18\x10\xde2\xc4_^]\ +2\xc4^]q\x119/+\x11\x12\x01\x179\x113\ +\x113\x1133\x113\x11310!'#\x06\x06\ +#\x22&54$%754&#\x22\x06\x07'\ +6632\x16\x15\x11%2655\x07\x06\x06\x15\ +\x14\x16\x13567!\x15\x06\x07\x03\x22&546\ +32\x16\x15\x14\x06\x03\x22\x06\x15\x14\x163265\ +4&\x03\x5c/\x08C\xb8v\xa0\xba\x01\x01\x01\x01\xbf\ +feG\x9cVL`\xc7h\xd5\xd5\xfd\xfa\x7f\x9c\x8e\ +\x9f\x9eX1bL\x01-;\xfe\x1fh\x83\x83hd\ +\x8c\x89g5555566\x9aWW\xb0\xa1\xa9\ +\xb0\x08\x06;ij**\xa800\xbf\xbe\xfd\x17\xa0\ +\x8f\x81`\x06\x07h`NM\x069\x10[f\x0c@\ +\x85\xfd\xeaxkhywhmx\x01M556\ +55655\xff\xff\xff\xfe\x00\x00\x06\xd3\x07s\x02\ +&\x00\x88\x00\x00\x01\x07\x00v\x02u\x01R\x00\x08\xb3\ +\x02\x1d\x05&\x00+5\xff\xff\x00Z\xff\xec\x06\xb8\x06\ +!\x02&\x00\xa8\x00\x00\x01\x07\x00v\x01\xaa\x00\x00\x00\ +\x08\xb3\x03A\x11&\x00+5\xff\xff\x00y\xff\xb4\x05\ +\xd3\x07s\x02&\x00\x9a\x00\x00\x01\x07\x00v\x01%\x01\ +R\x00\x08\xb3\x03-\x05&\x00+5\xff\xff\x00f\xff\ +\xb8\x04}\x06!\x02&\x00\xba\x00\x00\x01\x06\x00vh\ +\x00\x00\x08\xb3\x03,\x11&\x00+5\xff\xff\x00d\xfe\ +;\x04\x0c\x05\xcb\x02&\x006\x00\x00\x00\x06\x029\x00\ +\x00\xff\xff\x00b\xfe;\x03\x8f\x04f\x02&\x00V\x00\ +\x00\x00\x06\x029\xc2\x00\x00\x01\x00\xe3\x04\xd9\x03\xe5\x06\ +!\x00\x0c\x00(@\x12\x09\x08\x02\x00\x0c\x04\x05\x02\x05\ +\x0c\x03\x0e\x0d\x02\x09\x80\x05\x00\x00/2\x1a\xcd2\x11\ +\x12\x01\x179\x113\x113\x113310\x01&'\ +\x06\x07#567!\x16\x17\x15\x03F{igz\ +\x9e\xbf?\x01\x04?\xc1\x04\xd9IkgM\x19\xc6i\ +n\xc1\x19\x00\x01\x00\xe3\x04\xd9\x03\xe5\x06!\x00\x0d\x00\ +(@\x12\x05\x04\x0b\x0d\x01\x09\x07\x01\x07\x0b\x03\x0f\x0e\ +\x08\x00\x80\x0b\x05\x00/3\x1a\xcd2\x11\x12\x01\x179\ +\x113\x113\x113310\x01\x15\x06\x06\x07!&\ +'53\x16\x1767\x03\xe5~g\x1b\xfe\xfcA\xbd\ +\x9e\x8aWa\x83\x06!\x1b\x83|.i\xc4\x1bZ]\ +dS\x00\x00\x01\x01#\x04\xd9\x03\xa2\x05\x87\x00\x03\x00\ +\x11\xb5\x03\x02\x05\x04\x00\x03\x00/3\x11\x12\x0199\ +10\x01!\x15!\x01#\x02\x7f\xfd\x81\x05\x87\xae\x00\ +\x01\x01\x04\x04\xd9\x03\xc3\x06\x08\x00\x0e\x00$@\x10\x0b\ +\x0c\x04\x03\x0c\x03\x10\x0f\x0b\x7f\x04\x01\x04\x80\x08\x00\x00\ +/2\x1a\xcc]2\x11\x12\x0199\x113\x1131\ +0\x01\x22&'3\x1e\x0232673\x06\x06\x02\ +^\x9d\xb5\x08\x89\x05,QSie\x07\x8c\x0c\xc0\x04\ +\xd9\x9f\x9009\x18B?\x8d\xa2\x00\x00\x01\x00\x9a\x04\ +\xf6\x01\xa2\x05\xfa\x00\x0b\x00\x13\xb6\x06\x00\x00\x0d\x0c\x03\ +\x09\x00/\xcd\x11\x12\x019\x11310\x13463\ +2\x16\x15\x14\x06#\x22&\x9aE@>EE>@\ +E\x05w?DD?l\xfe\xf5>13<@\ +/1>\x01\xeco.@@.2=\x05\x85I\xb5\ +1\x14=\xa6P\x0a>7<9;::;u8\ +=;::\x00\xff\xff\xff\xf2\x00\x00\x05J\x05\xff\x02\ +&\x00$\x00\x00\x01\x07\x01T\xfe\x09\xff\x97\x00\x07\xb2\ +\x02\x13\x00\x00?5\x00\x00\x01\x00\x85\x029\x01\xae\x03\ +j\x00\x0b\x00\x17@\x0a\x06\x00\x00\x0d\x0c\x03\x09QY\ +\x03\x00/+\x11\x12\x019\x11310\x13463\ +2\x16\x15\x14\x06#\x22&\x85KIILNGG\ +M\x02\xd1KNPIHPN\x00\xff\xff\xff\xb9\x00\ +\x00\x04\x81\x05\xff\x00'\x00(\x00\x85\x00\x00\x01\x07\x01\ +T\xfd\xd0\xff\x97\x00\x07\xb2\x01\x0f\x00\x00?5\x00\xff\ +\xff\xff\xb9\x00\x00\x05\xd3\x05\xff\x00'\x00+\x00\x91\x00\ +\x00\x01\x07\x01T\xfd\xd0\xff\x97\x00\x07\xb2\x01\x0f\x00\x00\ +?5\x00\xff\xff\xff\xc1\x00\x00\x03\x8c\x05\xff\x00'\x00\ +,\x00\xf4\x00\x00\x01\x07\x01T\xfd\xd8\xff\x97\x00\x07\xb2\ +\x01\x0f\x00\x00?5\x00\xff\xff\xff\xd6\xff\xec\x06\x1d\x05\ +\xff\x00&\x002J\x00\x01\x07\x01T\xfd\xed\xff\x97\x00\ +\x07\xb2\x02\x1b\x00\x00?5\x00\xff\xff\xff\xaf\x00\x00\x05\ +\xd0\x05\xff\x00'\x00<\x01\x14\x00\x00\x01\x07\x01T\xfd\ +\xc6\xff\x97\x00\x07\xb2\x01\x0c\x00\x00?5\x00\xff\xff\xff\ +\xd6\x00\x00\x06N\x05\xff\x00&\x01vL\x00\x01\x07\x01\ +T\xfd\xed\xff\x97\x00\x07\xb2\x01#\x00\x00?5\x00\xff\ +\xff\xff\xd8\xff\xec\x02\xd5\x06\xb4\x02&\x01\x86\x00\x00\x01\ +\x07\x01U\xfe\xef\x00\x00\x00\x0c\xb5\x03\x02\x01,\x11&\ +\x00+555\xff\xff\x00\x00\x00\x00\x05J\x05\xbc\x02\ +\x06\x00$\x00\x00\xff\xff\x00\xc1\x00\x00\x04\xd9\x05\xb6\x02\ +\x06\x00%\x00\x00\x00\x01\x00\xc1\x00\x00\x04%\x05\xb6\x00\ +\x05\x00\x1b@\x0c\x04\x01\x07\x06\x04\x12\x05\x02LY\x05\ +\x03\x00?+\x00\x18?\x11\x12\x019910\x01\x15\ +!\x11#\x11\x04%\xfd\x8b\xef\x05\xb6\xcd\xfb\x17\x05\xb6\ +\x00\xff\xff\x00/\x00\x00\x04\xba\x05\xb8\x02\x06\x02(\x00\ +\x00\xff\xff\x00\xc1\x00\x00\x03\xfc\x05\xb6\x02\x06\x00(\x00\ +\x00\xff\xff\x00B\x00\x00\x04X\x05\xb6\x02\x06\x00=\x00\ +\x00\xff\xff\x00\xc1\x00\x00\x05B\x05\xb6\x02\x06\x00+\x00\ +\x00\x00\x03\x00y\xff\xec\x05\xd3\x05\xcd\x00\x03\x00\x0f\x00\ +\x1b\x00:@\x1f\x16\x04\x10\x0a\x01\x02\x04\x0a\x04\x1d\x1c\ +\x03\x02LY\x03\x03\x07\x0d\x0d\x19LY\x0d\x04\x07\x13\ +LY\x07\x13\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x01\x179\x113\x11310\x01\x15!\ +5\x05\x10\x00! \x00\x11\x10\x00! \x00\x01\x10\x12\ +32\x12\x11\x10\x02#\x22\x02\x04F\xfd\xc0\x03\xcd\xfe\ +\x9b\xfe\xb9\xfe\xb5\xfe\x9d\x01e\x01K\x01F\x01d\xfb\ +\xa0\xdc\xd8\xd7\xdb\xdb\xd5\xd9\xdd\x03L\xc9\xc9o\xfe\x9b\ +\xfet\x01\x89\x01j\x01j\x01\x84\xfev\xfe\x9a\xfe\xf3\ +\xfe\xe8\x01\x13\x01\x12\x01\x0f\x01\x14\xfe\xe9\x00\xff\xff\x00\ +J\x00\x00\x02\x98\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00\ +\xc1\x00\x00\x05\x1d\x05\xb6\x02\x06\x00.\x00\x00\x00\x01\x00\ +\x00\x00\x00\x05\x02\x05\xb6\x00\x0b\x00(@\x13\x07\x06\x00\ +\x09\x08\x04\x05\x00\x05\x08\x03\x0d\x0c\x00\x06\x03\x09\x05\x12\ +\x00?3?3\x11\x12\x01\x179\x113\x113\x113\ +310\x01\x0e\x02\x01#\x01!\x01#\x01&\x02\x7f\ +\x09\x22\x1f\xfe\xc3\xf8\x02\x00\x01\x00\x02\x02\xf8\xfe\xd3A\ +\x04\xd3,\x87j\xfcJ\x05\xb6\xfaJ\x03\x87\xc2\x00\xff\ +\xff\x00\xc1\x00\x00\x06\xa2\x05\xb6\x02\x06\x000\x00\x00\xff\ +\xff\x00\xc1\x00\x00\x05\x83\x05\xb6\x02\x06\x001\x00\x00\x00\ +\x03\x00L\x00\x00\x041\x05\xb6\x00\x03\x00\x07\x00\x0b\x00\ +:@\x1f\x06\x08\x07\x0b\x02\x03\x08\x0b\x04\x0d\x0c\x00\x03\ +LY\x00\x00\x0a\x04\x04\x07LY\x04\x03\x0a\x0bLY\ +\x0a\x12\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x01\x179\x113\x11310\x13!\x15!\x03\ +!\x15!\x01\x15!5\xc7\x02\xef\xfd\x11R\x03\x93\xfc\ +m\x03\xbc\xfc\x1b\x03^\xc8\x03 \xca\xfb\xdf\xcb\xcb\xff\ +\xff\x00y\xff\xec\x05\xd3\x05\xcd\x02\x06\x002\x00\x00\x00\ +\x01\x00\xc1\x00\x00\x05%\x05\xb6\x00\x07\x00%@\x11\x01\ +\x00\x04\x05\x05\x00\x09\x08\x01\x05\x12\x06\x03LY\x06\x03\ +\x00?+\x00\x18?3\x11\x12\x0199\x113\x113\ +10!#\x11!\x11#\x11!\x05%\xf0\xfd{\xef\ +\x04d\x04\xe9\xfb\x17\x05\xb6\x00\xff\xff\x00\xc1\x00\x00\x04\ +\x89\x05\xb6\x02\x06\x003\x00\x00\x00\x01\x00L\x00\x00\x04\ +j\x05\xb6\x00\x0d\x00C@#\x02\x09\x08\x03\x0a\x00\x00\ +\x03\x06\x09\x0d\x05\x0f\x0e\x02\x09\x09\x00\x04\x03\x07\x04\x07\ +LY\x04\x03\x01\x0b\x00\x0bLY\x00\x12\x00?+\x11\ +\x003\x18?+\x11\x003\x11\x129\x113\x11\x12\x01\ +\x179\x113\x113\x1131035\x01\x015!\ +\x15!'\x01\x01%!\x15L\x01\xdb\xfe1\x03\xd7\xfe\ +\x08\xd7\x01\xc9\xfe!\x019\x01\xe7\xc1\x02;\x01\xfc\xbe\ +\xcd\x07\xfe\x0e\xfd\xc7\x06\xcb\x00\xff\xff\x00\x1d\x00\x00\x04\ +h\x05\xb6\x02\x06\x007\x00\x00\xff\xff\x00\x00\x00\x00\x04\ +\xbc\x05\xb6\x02\x06\x00<\x00\x00\x00\x03\x00b\xff\xec\x06\ +=\x05\xcb\x00\x08\x00\x22\x00+\x00a@7\x00\x14\x17\ ++\x04\x22\x22\x09\x04\x1c'\x0f\x09\x0f\x1c\x03-,\x08\ +$\x13$KY\x17\x13\x00\x13\x10\x13\x02\x10\x03\x00+\ +\x0a+KY!\x0aP\x0a`\x0a\x02\x13\x0a\x13\x0a\x09\ +\x15\x04\x09\x13\x00??\x1299//]\x113+\ +\x11\x003_^]\x113+\x11\x003\x11\x12\x01\x17\ +9\x113\x113\x113\x12\x17910\x01326\ +54&##\x035#\x22$\x02546$3\ +353\x1532\x04\x16\x15\x14\x02\x04##\x15\x03\ +#\x22\x06\x15\x14\x1633\x03\xc1\x14\xb4\xcb\xbd\xa51\ +\xe2!\xb3\xfe\xf1\x9a\x8c\x01\x06\xb0;\xe2=\xb1\x01\x05\ +\x89\x9a\xfe\xf3\xb5 \xe21\xa6\xbc\xca\xb7\x12\x01\x8b\xc1\ +\xac\xa0\xbc\xfb\x98\xe1\x83\x01\x06\xa0\x9b\xf9\x8d\xb4\xb4\x8c\ +\xf7\x9e\xa3\xfe\xfc\x82\xe1\x04h\xbd\x9f\xaa\xc3\xff\xff\x00\ +\x04\x00\x00\x04\xf6\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x00\ +m\x00\x00\x06D\x05\xb6\x00\x1b\x00@@ \x14\x13\x05\ +\x06\x1a\x1b\x05\x06\x0d\x0c\x06\x0c\x1b\x03\x1d\x1c\x15\x11\x08\ +\x11LY\x04\x08\x08\x06\x1a\x13\x0c\x03\x06\x12\x00??\ +33\x129/3+\x11\x003\x11\x12\x01\x179\x11\ +3\x113\x113\x11\x129910\x01\x10\x00!#\ +\x11#\x11# \x00\x11\x113\x11\x14\x1633\x113\ +\x113265\x113\x06D\xfe\xd3\xfe\xe11\xe01\ +\xfe\xe5\xfe\xd2\xe7\xb7\xc0\x1c\xe0\x1e\xb6\xbf\xea\x03\xd5\xfe\ +\xf9\xfe\xea\xfeH\x01\xb8\x01\x11\x01\x0a\x01\xe3\xfe!\xb0\ +\xa8\x037\xfc\xc9\xab\xa9\x01\xe3\x00\x01\x00D\x00\x00\x06\ +\x02\x05\xcd\x00\x1f\x00?@#\x16\x1a\x0a\x06\x1d\x13\x03\ +\x0d\x06\x08\x0d\x13\x18\x1a\x06! \x10\x00LY\x10\x04\ +\x16\x06\x1a\x03\x09\x08\x09LY\x19\x08\x12\x00?3+\ +\x11\x00\x173\x18?+\x11\x12\x01\x179\x113\x113\ +\x113\x11310\x01\x22\x06\x15\x14\x12\x17\x15!5\ +!&\x025\x10\x00! \x00\x11\x14\x02\x07!\x15!\ +56\x1254&\x03#\xd4\xdc\x93\xa2\xfd\x9c\x01n\ +\x98\xa1\x01l\x01>\x01>\x01l\xa4\x98\x01q\xfd\x9a\ +\x9e\x99\xdd\x05\x00\xef\xe2\xd1\xfe\xd9j\xcd\xcdk\x01P\ +\xc8\x01$\x01Y\xfe\xaa\xfe\xd9\xcb\xfe\xb2j\xcd\xcdd\ +\x01)\xd5\xe3\xee\xff\xff\x00:\x00\x00\x02\xab\x07>\x02\ +&\x00,\x00\x00\x01\x07\x00j\xff\x15\x01R\x00\x0a\xb4\ +\x02\x01!\x05&\x00+55\xff\xff\x00\x00\x00\x00\x04\ +\xbc\x07>\x02&\x00<\x00\x00\x01\x07\x00j\x00\x00\x01\ +R\x00\x0a\xb4\x02\x01\x1e\x05&\x00+55\xff\xff\x00\ +f\xff\xec\x04\xe3\x06h\x02&\x01~\x00\x00\x01\x06\x01\ +T'\x00\x00\x08\xb3\x025\x11&\x00+5\xff\xff\x00\ +T\xff\xec\x03\xd5\x06h\x02&\x01\x82\x00\x00\x01\x06\x01\ +T\xf7\x00\x00\x08\xb3\x01-\x11&\x00+5\xff\xff\x00\ +\xa8\xfe\x14\x04u\x06h\x02&\x01\x84\x00\x00\x01\x06\x01\ +TX\x00\x00\x08\xb3\x01\x1d\x11&\x00+5\xff\xff\x00\ +\xa4\xff\xec\x02\xd5\x06h\x02&\x01\x86\x00\x00\x01\x07\x01\ +T\xfe\xe8\x00\x00\x00\x08\xb3\x01\x17\x11&\x00+5\xff\ +\xff\x00\x9a\xff\xec\x04\x96\x06\xb4\x02&\x01\x92\x00\x00\x01\ +\x06\x01U?\x00\x00\x0c\xb5\x03\x02\x014\x11&\x00+\ +555\x00\x02\x00f\xff\xec\x04\xe3\x04f\x00\x0b\x00\ ++\x00J@'\x18\x19\x19)\x16\x03\x03\x1d\x09\x0f\x0f\ +\x1d\x22\x03-,\x16*\x0c\x12\x18\x0f\x12\x07FY\x12\ +\x10& FY\x0c\x00FY&\x0c\x16\x00?3+\ ++\x00\x18?+\x00\x18?\x11\x1299\x11\x12\x01\x17\ +9\x113\x113\x12993\x11310%26\ +754&# \x11\x14\x16\x17\x22\x02\x11\x10\x123\ +2\x16\x173673\x06\x02\x15\x11\x14\x16327\ +\x15\x06\x06#\x22&'#\x06\x02^\x92\x7f\x02\x86\x8f\ +\xfe\xfc~O\xd2\xed\xf5\xdcx\x9d5\x0c\x1b)\xbe\x1b\ +\x22,(\x1f\x1e\x10O\x1e_h\x1a\x10s\xaa\xa9\xc8\ +\x0c\xce\xb1\xfe}\xbd\xbc\xbe\x01,\x01\x0d\x01\x15\x01,\ +USa3R\xfe\xffe\xfe\x899<\x0a\xb2\x0a\x10\ +NY\xa7\x00\x02\x00\xa8\xfe\x14\x04\xd3\x06\x1f\x00\x12\x00\ +%\x00M@)#\x03\x1a\x08\x16\x0e\x0e\x0f\x03\x06\x08\ +\x0f\x1e\x05'&\x05\x1e\x1f\x1f\x1eFY\x1f\x1f\x0b\x00\ +\x0f\x1b\x00\x13FY\x00\x00\x0b\x18FY\x0b\x16\x00?\ ++\x00\x18?+\x00\x18?\x11\x129/+\x11\x12\x00\ +9\x11\x12\x01\x179\x113\x113\x113\x11310\ +\x012\x04\x15\x10\x05\x15\x04\x11\x14\x04#\x22'\x11#\ +\x114$\x17 \x11\x11\x163 \x114&##5\ +32654&\x02\xa4\xe2\x01\x05\xfe\xd1\x01w\xfe\ +\xf8\xe8\xcc\x84\xeb\x01\x0b\xed\xfe\xf3\x8a\x9b\x01+\xa1\x98\ +\x5cH\x80\x88\x87\x06\x1f\xd0\xb9\xfe\xdb4\x06,\xfe\x9b\ +\xd4\xe6A\xfd\xe7\x064\xe1\xf6\xbd\xfe\xd3\xfc\xc3N\x01\ +\x0e\x84\x8f\xbe\x81wmt\x00\x00\x01\x00\x06\xfe\x14\x04\ +L\x04R\x00\x13\x006@\x1a\x04\x0b\x01\x0b\x10\x05\x00\ +\x01\x0f\x10\x06\x05\x01\x05\x10\x03\x15\x0a\x04\x01\x14\x0f\x05\ +\x0f\x01\x1b\x00??3\x11\x1299\x12\x01\x179\x11\ +3\x113\x113\x11\x129\x11\x12910\x01#4\ +\x127\x013\x13\x16\x16\x173>\x02\x133\x01\x06\x02\ +\x02P\xfc8.\xfeL\xf4\xcb\x1cD\x0a\x06\x06#)\ +\xd1\xf4\xfef*8\xfe\x14V\x01\x1e\x84\x04F\xfd\xe5\ +J\xe19\x22\x8a\x85\x02N\xfb\xc5m\xfe\xdb\x00\x02\x00\ +f\xff\xec\x04{\x06\x19\x00\x1d\x00)\x00B@\x22!\ +\x00\x1e\x0f\x02\x1e\x15$\x1b\x02\x08\x15\x1b\x04+*\x12\ +\x00!!\x18\x05\x05\x0cGY\x05\x00\x18'FY\x18\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x1133\x11\ +\x12\x01\x179\x113\x113\x113\x129910\x01\ +&54632\x16\x17\x07&&#\x22\x06\x15\x14\ +\x16\x17\x16\x16\x15\x14\x00#\x22$546\x014&\ +'\x06\x06\x15\x14\x16326\x02\x02\xf6\xda\xbci\xc2\ +\x8d`U\xaaaOWt\xa0\xc7\xac\xfe\xed\xfb\xec\xfe\ +\xe5\xce\x02Upw\xa3\xa5\x93\x80\x89\x93\x03\x9e\x90\xc4\ +\x89\x9e-B\xae+;C8:lSl\xf1\xa1\xf7\ +\xfe\xf3\xf7\xd3\xb2\xf9\xfe\x84r\xa6>*\xc8\x8fy\x95\ +\xa1\x00\x01\x00T\xff\xec\x03\xd5\x04f\x00#\x00M@\ ++ \x15\x05\x0f\x00\x0a\x0f\x12\x15\x1a\x06%$\x13\x01\ +##\x02HY\x0c#\x1c#\x02\x10\x03##\x0c\x18\ +\x18\x1eGY\x18\x10\x0c\x07GY\x0c\x16\x00?+\x00\ +\x18?+\x11\x12\x009\x18/_^]+\x11\x12\x00\ +9\x11\x12\x01\x179\x113\x11310\x01\x15#\x22\ +\x06\x15\x14!27\x15\x06#\x22$54675\ +&54632\x17\x07&&#\x22\x15\x14\x163\ +\x03\x08\x9e\x9c\x91\x01\x19\xc1\xbc\x98\xf5\xf2\xff\x00{\x85\ +\xd1\xf3\xd0\xdc\xb3No\x89G\xec\x91\x98\x02\x98\xb1S\ +R\x9cV\xc5K\xa9\x9ai\x83 \x0b6\xc8\x88\x9aO\ +\xb30\x1c\x85LG\x00\x00\x01\x00f\xfe{\x03\xc9\x06\ +\x14\x00!\x00@@ \x11\x17\x02\x03\x03\x06\x06\x00\x1b\ +\x0d\x00\x0d\x14\x17\x04#\x22\x1f\x0a\x0a\x15\x03\x22\x17\x11\ +\x14\x15\x14GY\x15\x00\x00?+\x11\x0033\x18?\ +\x129\x113\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x11310\x05\x14\x07#6654&&'\ +&&54\x12\x127\x06#!5!\x15\x06\x00\x02\ +\x15\x14\x16\x16\x17\x16\x16\x03\xc9\x85\xec;L(`Q\ +\xd5\xcbt\xdd\xff,\xde\xfe\xf6\x03#\xd4\xfe\xee\x857\ +u\x92\x9e\x93=\x91\xb7M\x9a1!%!\x0e&\xe0\ +\xc1\x99\x01\x14\x01\x0f\xdf\x0c\xb6\x9b\xb2\xfe\xc9\xfe\xe6\x9b\ +ZmA\x1d t\x00\x00\x01\x00\xa8\xfe\x14\x04u\x04\ +f\x00\x13\x002@\x19\x0d\x09\x09\x0a\x01\x00\x0a\x00\x14\ +\x15\x0d\x0a\x11\x11\x05FY\x11\x10\x0b\x0f\x01\x1b\x0a\x15\ +\x00????+\x11\x12\x009\x11\x12\x0199\x11\ +3\x113\x11310\x01#\x114&#\x22\x06\x15\ +\x11#\x113\x173663 \x11\x04u\xeclq\ +\x93\x86\xeb\xb8!\x0c2\xb8p\x01\x8e\xfe\x14\x04\x94\x84\ +z\xb5\xca\xfd\xd9\x04R\x91OV\xfek\x00\x00\x03\x00\ +f\xff\xec\x04o\x06+\x00\x0b\x00\x12\x00\x19\x00?@\ + \x17\x0f\x0f\x00\x16\x10\x10\x06\x06\x00\x1b\x1a\x16\x10G\ +Y\x16\x16\x03\x09\x09\x13HY\x09\x01\x03\x0cHY\x03\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x0199\x113\x113\x113\x11310\x01\x10\ +\x00!\x22\x00\x11\x10\x00!2\x00\x012\x12\x13!\x12\ +\x12\x13\x22\x02\x07!&\x02\x04o\xff\x00\xfe\xf9\xfc\xfe\ +\xfa\x01\x01\x01\x01\xff\x01\x08\xfd\xf9\x8e\x83\x06\xfd\xd7\x04\ +\x85\x8b\x8a\x7f\x09\x02%\x09\x81\x03\x0c\xfek\xfeu\x01\ +\x96\x01\x8a\x01\x96\x01\x89\xfej\xfc\x0b\x01\x0c\x01\x10\xfe\ +\xe9\xfe\xfb\x04\xd7\xfe\xfd\xff\xff\x01\x03\x00\x01\x00\xa4\xff\ +\xec\x02\xd5\x04R\x00\x0d\x00\x1f@\x0e\x00\x0d\x0d\x06\x0f\ +\x0e\x0d\x0f\x09\x03FY\x09\x16\x00?+\x00\x18?\x11\ +\x12\x0199\x11310\x01\x11\x14327\x15\x06\ +\x06#\x22&5\x11\x01\x8f\x92Y[%zB\xad\xa3\ +\x04R\xfc\xfe\xa6\x1b\xb1\x11\x17\xb0\xb2\x03\x04\xff\xff\x00\ +\xa8\x00\x00\x04\x87\x04R\x02\x06\x00\xfa\x00\x00\x00\x01\xff\ +\xfc\xff\xec\x04\x93\x06!\x00\x22\x00>@ \x1b\x0f\x01\ +\x1e\x22\x00\x00\x07\x0f\x15\x1e\x04$#\x1e\x1f\x1f\x0a\x00\ +\x15\x0a\x05FY\x0a\x01\x18\x12FY\x18\x16\x00?+\ +\x00\x18?+\x00\x18?\x129\x113\x11\x12\x01\x179\ +3\x113\x113\x11310#\x01'&&#\x22\ +\x075632\x16\x16\x17\x01\x16\x16327\x15\x06\ +\x06#\x22&'\x02&'#\x06\x07\x03\x04\x01\xd9-\ +%]Q85DRg\x8de6\x01B\x1d<*\ +\x12/\x1aR#Zn%\x8fB\x09\x06#=\xe7\x04\ ++\x7fcO\x0c\xc0\x11A\x8a\x93\xfc\x83NJ\x0a\xb2\ +\x0c\x0eWi\x01\x8e\xc8+\x87\x8f\xfd\xe9\x00\xff\xff\x00\ +\xa8\xfe\x14\x04u\x04R\x02\x06\x00w\x00\x00\x00\x01\x00\ +\x02\x00\x00\x049\x04R\x00\x0d\x00(@\x13\x0d\x0c\x04\ +\x08\x09\x01\x00\x00\x04\x09\x03\x0f\x0e\x08\x00\x0f\x04\x0d\x15\ +\x00?3?2\x11\x12\x01\x179\x113\x113\x113\ +310\x133\x13\x16\x1736\x12\x113\x10\x02\x07\ +#\x02\xf4\xd9 B\x08\x95\x80\xeb\xcc\xe6\xe7\x04R\xfd\ +\xa4S\xd6\xa7\x01\xa2\x01<\xfe\x92\xfe\x05\xe9\x00\x01\x00\ +f\xfe{\x03\xc9\x06\x14\x00-\x00b@3\x09\x0f\x06\ +\x03\x18\x00%&&))#\x13\x06\x1c\x00\x00\x06\x0c\ +\x0f\x18#\x06/. ,,\x0d&\x04\x19\x16\x16\x19\ +HY\x16\x16\x0d&\x22\x10\x09\x0c\x0d\x0cGY\x0d\x00\ +\x00?+\x11\x0033\x18?\x129/+\x11\x12\x00\ +9\x11\x129\x113\x11\x12\x01\x179\x113\x113\x11\ +3\x113\x113\x11\x129\x11\x12910\x1346\ +75&5467\x06##5!\x15#\x22\x06\ +\x15\x14\x1633\x15#\x22\x06\x15\x14\x16\x16\x17\x16\x16\ +\x15\x14\x07#6654&'$f\x96\x87\xdb\x8e\ +\x9b\xc0B-\x02\xef?\xc5\xfe\x96\xa0\xa8\xac\xab\xbc6\ +k\xa1\xa1\x8c\x81\xe8:Khs\xfe\x5c\x01\xac\x85\xc8\ +0\x0a<\xd0p\x90+\x0c\xb6\xac\x9e\x80h_\xaa\x93\ +\x88N_:!#vZ\x8f\xb9N\x9a3,3\x13\ +H\xff\xff\x00f\xff\xec\x04}\x04f\x02\x06\x00R\x00\ +\x00\x00\x01\x00\x19\xff\xec\x05J\x04R\x00\x15\x007@\ +\x1d\x08\x14\x0b\x0c\x02\x0c\x0e\x12\x14\x05\x17\x16\x0c\x15\x13\ +\x0a\x0e\x10\x0eGY\x10\x0f\x06\x00GY\x06\x16\x00?\ ++\x00\x18?+\x11\x0033\x18?\x11\x12\x01\x179\ +\x113\x11310%27\x15\x06\x06# \x11\x11\ +!\x11#\x11#57!\x15#\x11\x14\x04\xc964\ +\x19]8\xfe\xfa\xfeh\xeb\xe3\x9f\x04\x92\xe0\xa8\x1b\xb1\ +\x0f\x17\x01\x22\x02\x8a\xfch\x03\x98fT\xba\xfd\x83s\ +\x00\x00\x02\x00\x8f\xfe\x14\x04{\x04f\x00\x10\x00\x1c\x00\ +=@\x1e\x1a\x00\x15\x06\x09\x09\x0a\x0a\x00\x1e\x1d\x15\x17\ +\x06\x03\x0e\x0a\x1b\x0e\x11FY\x0e\x10\x03\x17FY\x03\ +\x16\x00?+\x00\x18?+\x00\x18?\x11\x129\x129\ +\x11\x12\x0199\x113\x1133\x11310\x01\x10\ +\x02#\x22'#\x16\x15\x11#\x11\x10\x0032\x00%\ +\x22\x06\x15\x11\x1632654&\x04{\xfa\xe1\xa7\ +|\x0c\x0c\xee\x01\x09\xf3\xe4\x01\x0c\xfe\x0a\x86\x82h\x9e\ +\x8b{z\x02)\xfe\xef\xfe\xd4Vx\x97\xfe\xe1\x04\x1d\ +\x01\x0e\x01'\xfe\xcbu\xb4\xbb\xfe\xd3^\xba\xc3\xc4\xb9\ +\x00\x00\x01\x00f\xfey\x03\xc9\x04f\x00\x1d\x005@\ +\x1a\x09\x0a\x0a\x0d\x0d\x07\x00\x13\x07\x13\x18\x03\x1f\x1e\x04\ +\x10\x10\x16\x0a\x22\x16\x1bFY\x16\x10\x00?+\x00\x18\ +?\x129\x113\x11\x12\x01\x179\x113\x113\x113\ +\x11310\x01\x14\x16\x16\x17\x16\x16\x15\x14\x07#6\ +654&'&&5\x10\x00!2\x17\x07&#\ +\x22\x06\x01X6~\x90\xa2\x8b\x81\xe8?F`{\xd6\ +\xce\x01\x13\x01\x0c\xb1\x93H\x92r\x9b\x8a\x02\x00du\ +G\x1d%w^\x91\xbfZ\x9a/-3\x18*\xf3\xc9\ +\x014\x018C\xbb:\xd5\x00\x00\x02\x00f\xff\xec\x04\ +\xe3\x04R\x00\x0d\x00\x19\x007@\x1c\x16\x0c\x0c\x07\x14\ +\x00\x0e\x07\x00\x07\x0b\x03\x1b\x1a\x0c\x17\x09\x17GY\x09\ +\x0f\x04\x11FY\x04\x16\x00?+\x00\x18?+\x11\x00\ +3\x11\x12\x01\x179\x113\x113\x129\x11310\ +\x01\x14\x06\x06#\x22\x00\x11\x10!!\x15!\x16\x05\x14\ +\x1632654'#\x22\x06\x04\x83\x80\xee\xa2\xf6\ +\xfe\xe9\x02e\x02\x18\xfe\xee\xb2\xfc\xd7\x93\x8a\x87\x93\x97\ +9\xc2\xa5\x01\xec\x98\xea~\x01#\x01\x05\x02>\xb6\xb7\ +\xd1\xae\xba\xad\xa5\xf3\xab\xba\x00\x00\x01\x00\x1d\xff\xe9\x03\ +\xc9\x04R\x00\x11\x00,@\x17\x01\x0b\x0b\x0d\x11\x05\x04\ +\x13\x12\x00\x0d\x0f\x0dGY\x0f\x0f\x08\x03FY\x08\x16\ +\x00?+\x00\x18?+\x11\x003\x11\x12\x01\x179\x11\ +310\x01\x11\x14327\x15\x06#\x22&5\x11\ +!57!\x15\x02+\xa8Y]e~\xba\xaf\xfe\xe0\ +\xa1\x03\x0b\x03\x9a\xfd\xbc\xae\x1b\xb1)\xb2\xb1\x02Nd\ +T\xb8\x00\x00\x01\x00\x9a\xff\xec\x04\x96\x04R\x00\x15\x00\ ++@\x14\x0f\x10\x10\x0c\x13\x06\x03\x13\x03\x17\x16\x0f\x04\ +\x0f\x00\x09FY\x00\x16\x00?+\x00\x18?3\x11\x12\ +\x0199\x113\x1133\x11310\x05\x22&\x11\ +\x113\x11\x14\x1632654&'3\x16\x16\x15\ +\x10\x00\x02\x81\xf3\xf4\xeb~\x8a\x94\x89\x1c(\xee'\x1b\ +\xfe\xf9\x14\xfe\x01\x0c\x02\x5c\xfd\xa4\xa3\xa9\xd5\xe3m\xdb\ +\xa8\x98\xe7y\xfe\xc7\xfe\xcb\x00\x00\x02\x00f\xfe\x14\x05\ +\xa2\x04d\x00\x18\x00!\x00F@$\x1f\x0c\x18\x18\x07\ +\x00\x0a\x19\x13\x0a\x04\x00\x04\x13\x03#\x22\x06\x10\x00\x1b\ +\x10\x1cHY\x10\x10\x1f\x0c\x01\x0cGY\x17\x01\x16\x00\ +?3+\x11\x003\x18?+\x00\x18??\x11\x12\x01\ +\x179\x113\x113\x11\x1292\x119910\x01\ +\x11$\x00\x11\x10\x13\x17\x06\x06\x15\x10\x05\x11463\ +2\x12\x15\x14\x02\x04\x07\x11\x014&#\x22\x15\x116\ +6\x02\x85\xfe\xf3\xfe\xee\xdc\xb0\x5cL\x01;\xc1\xa6\xc7\ +\xef\x8d\xfe\xfc\xad\x01Vm_\x8a\x9e\xb8\xfe\x14\x01\xdc\ +\x15\x01%\x01\x01\x01-\x01\x0atz\xd8w\xfe\xaf,\ +\x029\xba\xc9\xfe\xdd\xfb\xae\xfe\xfc\x98\x0c\xfe$\x040\ +\xaa\xc2\xcd\xfd\xc5\x0f\xdb\x00\x01\xff\xdd\xfe\x14\x04\x8b\x04\ +\x5c\x00 \x00H@)\x04\x05\x09\x14\x15\x19\x06\x0e\x1e\ +\x06\x07\x07\x0e\x1e\x03\x22\x16\x17!\x15\x05\x18\x08\x04\x17\ +\x06\x0f\x17\x1b\x00\x1cFY\x00\x10\x11\x0cFY\x11\x1b\ +\x00?+\x00\x18?+\x00\x18??\x12\x179\x11\x01\ +32\x11\x179\x113\x11\x12\x17910\x132\x16\ +\x16\x17\x13\x013\x01\x13\x16\x16327\x15\x06#\x22\ +&'\x03\x01#\x01\x03&&#\x22\x0756\xd1G\ +_F,o\x01)\xf4\xfeG\xc1#M@,2A\ +Zz\x957\x7f\xfe\xae\xfc\x01\xe4\x9a\x1dH3-+\ +L\x04\x5c.a{\xfe\xd9\x02'\xfd\x02\xfe!XF\ +\x0a\xb6\x17~\x9f\x01e\xfd~\x03]\x01\x8dPL\x0f\ +\xbb\x16\x00\x00\x01\x00\x9a\xfe\x14\x05\xe5\x06\x14\x00\x1a\x00\ +C@\x22\x19\x01\x0e\x0e\x0f\x07\x08\x08\x04\x0a\x16\x13\x0a\ +\x0f\x13\x03\x1c\x1b\x1a\x00\x07\x14\x0f\x0f\x1b\x01\x19\x10\x19\ +GY\x0d\x10\x16\x00?3+\x11\x003\x18??3\ +?\x11\x12\x01\x179\x113\x1133\x113\x113\x12\ +9910\x01\x116654&'3\x12\x11\x10\ +\x00\x05\x11#\x11$\x00\x11\x113\x11\x14\x16\x17\x11\x03\ +\xa4\xb4\xae\x1e*\xe2E\xfe\xdd\xfe\xe2\xdf\xfe\xed\xfe\xe8\ +\xe3\x9d\xab\x06\x14\xfa\x96\x0f\xc5\xc1q\xf1\xb1\xfe\xf0\xff\ +\x00\xfe\xef\xfe\xcd\x10\xfe&\x01\xda\x09\x01\x1f\x01\x13\x02\ +)\xfd\xd1\xba\xb6\x0b\x05l\x00\x00\x01\x00o\xff\xec\x06\ +\x1b\x04R\x00%\x00K@%\x1a\x1b\x1b\x17\x1e$\x11\ +\x11\x10\x07\x06\x06\x0a\x03\x03\x10\x1e\x03'&$\x06\x10\ +\x10\x00\x1a\x06\x0f\x14\x0d\x00\x0dGY!\x00\x16\x00?\ +2+\x11\x003\x18?3\x129/\x119\x11\x12\x01\ +\x179\x1133\x113\x113\x129\x1133\x113\ +10\x05\x22\x02\x114\x1273\x06\x02\x15\x14\x163\ +2\x11\x113\x11\x1032654\x02'3\x16\x12\ +\x15\x10\x02#\x22'#\x06\x02\x10\xc4\xdd8>\xe8B\ +;ne\xb4\xdd\xb2fm=@\xea?6\xdd\xc5\xe6\ +I\x0bI\x14\x01*\x01\x03\x9d\x01\x0b\x91\x91\xfe\xf6\x9a\ +\xb1\xc4\x01\x02\x01/\xfe\xd1\xfe\xfe\xc0\xb3\x9c\x01\x0f\x8c\ +\x92\xfe\xf0\x97\xfe\xfe\xfe\xd5\xc4\xc4\x00\xff\xff\x00\x09\xff\ +\xec\x02\xd5\x05\xec\x02&\x01\x86\x00\x00\x01\x07\x00j\xfe\ +\xe4\x00\x00\x00\x0a\xb4\x02\x01#\x11&\x00+55\xff\ +\xff\x00\x9a\xff\xec\x04\x96\x05\xec\x02&\x01\x92\x00\x00\x01\ +\x06\x00j/\x00\x00\x0a\xb4\x02\x01+\x11&\x00+5\ +5\xff\xff\x00f\xff\xec\x04}\x06h\x02&\x00R\x00\ +\x00\x01\x06\x01T1\x00\x00\x08\xb3\x02\x1f\x11&\x00+\ +5\xff\xff\x00\x9a\xff\xec\x04\x96\x06h\x02&\x01\x92\x00\ +\x00\x01\x06\x01T9\x00\x00\x08\xb3\x01\x1f\x11&\x00+\ +5\xff\xff\x00o\xff\xec\x06\x1b\x06h\x02&\x01\x96\x00\ +\x00\x01\x07\x01T\x00\xfe\x00\x00\x00\x08\xb3\x01/\x11&\ +\x00+5\xff\xff\x00\xc1\x00\x00\x03\xfc\x07>\x02&\x00\ +(\x00\x00\x01\x07\x00j\x00\x0a\x01R\x00\x0a\xb4\x02\x01\ +!\x05&\x00+55\x00\x01\x00\x1d\xff\xec\x05\xa2\x05\ +\xb6\x00\x1d\x00D@%\x08\x1b\x16\x0e\x0e\x0f\x03\x0f\x11\ +\x14\x1b\x05\x1f\x1e\x16\x0dLY\x16\x16\x12\x0f\x12\x15\x11\ +\x12\x11LY\x12\x03\x00\x05LY\x00\x13\x00?+\x00\ +\x18?+\x11\x003\x18?\x129/+\x11\x12\x01\x17\ +9\x113\x113\x11310\x05\x22'5\x1632\ +6554&#!\x11#\x11!5!\x15!\x11\ +!2\x16\x15\x15\x14\x06\x04\x1dgITKWOh\ +w\xfe\x9a\xf0\xfe\xa0\x04\x08\xfeH\x01r\xda\xe9\xc8\x14\ +\x1e\xcb\x1fba\x81l]\xfd=\x04\xe9\xcd\xcd\xfe\xa6\ +\xc8\xb5\x89\xc6\xd7\xff\xff\x00\xc1\x00\x00\x04%\x07s\x02\ +&\x01a\x00\x00\x01\x07\x00v\x00o\x01R\x00\x08\xb3\ +\x01\x0f\x05&\x00+5\x00\x01\x00y\xff\xec\x05\x02\x05\ +\xcb\x00\x1a\x00:@\x1f\x03\x06\x06\x11\x04\x0c\x11\x17\x04\ +\x1c\x1b\x03\x06LY\x03\x03\x0e\x15\x15\x00LY\x15\x04\ +\x0e\x09LY\x0e\x13\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x01\x179\x113\x11310\x01\ +\x22\x06\x07!\x15!\x16\x16327\x15\x06# \x00\ +\x114\x12$32\x17\x07&&\x03F\xc8\xf1\x14\x02\ +\xa6\xfdX\x0a\xe8\xdd\xa1\xe4\xb4\xe6\xfe\xb0\xfe\x98\xad\x01\ +G\xe1\xe7\xcdZ}\x96\x04\xfe\xde\xcc\xcb\xdf\xf2B\xcd\ +A\x01\x80\x01o\xe4\x01U\xb7^\xc97#\xff\xff\x00\ +d\xff\xec\x04\x0c\x05\xcb\x02\x06\x006\x00\x00\xff\xff\x00\ +J\x00\x00\x02\x98\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00\ +:\x00\x00\x02\xab\x07>\x02&\x00,\x00\x00\x01\x07\x00\ +j\xff\x15\x01R\x00\x0a\xb4\x02\x01!\x05&\x00+5\ +5\xff\xff\xffd\xfeh\x01\xaa\x05\xb6\x02\x06\x00-\x00\ +\x00\x00\x02\x00\x08\xff\xe9\x07b\x05\xb6\x00\x1a\x00#\x00\ +L@)\x1f\x00\x17\x1b\x1b\x04\x06\x15\x00\x04\x0f\x15\x04\ +%$\x17#LY\x17\x17\x04\x15\x04\x1bLY\x04\x12\ +\x15\x06LY\x15\x03\x0c\x11LY\x0c\x13\x00?+\x00\ +\x18?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x01\x179\x113\x113\x113\x11310\x01\x14\x04\ +!!\x11!\x07\x02\x02\x06\x06#\x22'5\x1632\ +6\x12\x13!\x113 \x04\x0132654&#\ +#\x07b\xfe\xe3\xfe\xee\xfe\x92\xfe\xb8\x1d2EZ\x8f\ +mIB96HSf<\x03\x00w\x01\x14\x01#\ +\xfdRq\xa3\xa5\xa2\xc1V\x01\xb8\xd9\xdf\x04\xe9\xdf\xfe\ +\x88\xfe}\xc7_\x19\xc7\x19\xb3\x02w\x01\xdc\xfd\xae\xdb\ +\xfe@q~xl\x00\x00\x02\x00\xc1\x00\x00\x07}\x05\ +\xb6\x00\x12\x00\x1b\x00N@)\x17\x00\x0f\x0c\x13\x13\x04\ +\x0b\x07\x07\x08\x00\x04\x08\x03\x1d\x1c\x0f\x1bLY\x0f\x0b\ +\x0b\x06LY\x0b\x0b\x04\x0d\x09\x03\x08\x12\x04\x13LY\ +\x04\x12\x00?+\x00\x18??3\x129/+\x00\x18\ +\x10\xc4+\x11\x12\x01\x179\x113\x113\x113\x129\ +9\x11310\x01\x14\x04!!\x11!\x11#\x113\ +\x11!\x113\x113 \x04\x0132654&#\ +#\x07}\xfe\xe5\xfe\xee\xfe\x8f\xfd\xd1\xef\xef\x02/\xf2\ +u\x01\x16\x01!\xfdTq\xa1\xa6\xa1\xc1V\x01\xb8\xd9\ +\xdf\x02\x93\xfdm\x05\xb6\xfd\xaa\x02V\xfd\xae\xdd\xfeB\ +q~vn\x00\x00\x01\x00\x1d\x00\x00\x05\xa2\x05\xb6\x00\ +\x13\x00;@\x1f\x00\x13\x0e\x06\x06\x07\x07\x09\x0c\x13\x04\ +\x15\x14\x0e\x05LY\x0e\x0e\x0a\x00\x07\x12\x0d\x09\x0a\x09\ +LY\x0a\x03\x00?+\x11\x003\x18?3\x129/\ ++\x11\x12\x01\x179\x113\x113\x11310!\x11\ +4&#!\x11#\x11!5!\x15!\x11!2\x16\ +\x15\x11\x04\xb2_p\xfe\x8a\xf0\xfe\xa0\x04)\xfe'\x01\ +\x87\xcf\xdf\x01\xfch_\xfd=\x04\xe9\xcd\xcd\xfe\xa6\xc7\ +\xb6\xfd\xee\xff\xff\x00\xc1\x00\x00\x05#\x07s\x02&\x01\ +\xb4\x00\x00\x01\x07\x00v\x00\xcd\x01R\x00\x08\xb3\x01\x14\ +\x05&\x00+5\xff\xff\x00\x0c\xff\xec\x05\x19\x07w\x02\ +&\x01\xbd\x00\x00\x01\x07\x026\x00P\x01R\x00\x08\xb3\ +\x01\x17\x05&\x00+5\x00\x01\x00\xc1\xfem\x05%\x05\ +\xb6\x00\x0b\x000@\x18\x09\x00\x08\x05\x02\x03\x00\x03\x05\ +\x03\x0d\x0c\x0a\x06\x03\x03#\x05\x08LY\x01\x05\x12\x00\ +?3+\x00\x18??3\x11\x12\x01\x179\x113\x11\ +3\x11310!!\x11#\x11!\x113\x11!\x11\ +3\x05%\xfeA\xed\xfeH\xef\x02\x85\xf0\xfem\x01\x93\ +\x05\xb6\xfb\x17\x04\xe9\x00\xff\xff\x00\x00\x00\x00\x05J\x05\ +\xbc\x02\x06\x00$\x00\x00\x00\x02\x00\xc1\x00\x00\x04\x9e\x05\ +\xb6\x00\x0a\x00\x13\x00=@ \x0f\x00\x08\x0b\x0b\x03\x00\ +\x03\x06\x03\x15\x14\x08\x13LY\x08\x08\x03\x04\x04\x07L\ +Y\x04\x03\x03\x0bLY\x03\x12\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\x113\ +\x11310\x01\x10!!\x11!\x15!\x113 \x01\ +32654&##\x04\x9e\xfd\xcc\xfeW\x03|\ +\xfds\xae\x02@\xfd\x12\xac\xac\xa0\xa1\xc8\x8f\x01\xb8\xfe\ +H\x05\xb6\xcd\xfe{\xfdeq~yk\x00\xff\xff\x00\ +\xc1\x00\x00\x04\xd9\x05\xb6\x02\x06\x00%\x00\x00\xff\xff\x00\ +\xc1\x00\x00\x04%\x05\xb6\x02\x06\x01a\x00\x00\x00\x02\x00\ +\x0c\xfem\x05\x9e\x05\xb6\x00\x0d\x00\x13\x00E@$\x09\ +\x08\x12\x06\x0e\x04\x11\x01\x0c\x0d\x01\x04\x06\x08\x0d\x05\x15\ +\x14\x09\x0d#\x04\x0eLY\x04\x03\x06\x11\x00\x0b\x00L\ +Y\x0b\x12\x00?+\x11\x0033\x18?+\x00\x18?\ +3\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +1073\x12\x12\x13!\x113\x11#\x11!\x11#\ +\x01\x06\x02\x07!\x11\x0cq\x91\xc4\x1c\x02\xf3\xbd\xe6\xfc\ +:\xe6\x02\xaa\x16\xb4s\x02y\xcd\x01\x09\x02\x94\x01L\ +\xfb\x17\xfd\xa0\x01\x93\xfem\x06z\xe3\xfd\xa9\xe0\x04\x1a\ +\x00\xff\xff\x00\xc1\x00\x00\x03\xfc\x05\xb6\x02\x06\x00(\x00\ +\x00\x00\x01\x00\x00\x00\x00\x07#\x05\xb6\x00\x11\x00L@\ +)\x09\x06\x0d\x00\x03\x0d\x03\x0e\x07\x08\x02\x01\x0b\x0a\x10\ +\x11\x01\x08\x0a\x0e\x11\x05\x13\x12\x09\x0c\x03\x06\x0f\x05\x00\ +\x00\x11\x07\x04\x01\x03\x0e\x0b\x11\x12\x00?33?3\ +3\x129\x11\x173\x11\x12\x01\x179\x113\x113\x11\ +3\x113\x11\x173\x113310\x01\x01!\x01\x11\ +3\x11\x01!\x01\x01!\x01\x11#\x11\x01!\x02/\xfd\ +\xea\x01\x00\x02\x08\xe3\x02\x08\x01\x00\xfd\xea\x02-\xfe\xf8\ +\xfd\xe9\xe3\xfd\xe9\xfe\xf6\x02\xf4\x02\xc2\xfd<\x02\xc4\xfd\ +<\x02\xc4\xfd>\xfd\x0c\x02\xe5\xfd\x1b\x02\xe5\xfd\x1b\x00\ +\x01\x00X\xff\xec\x04\x85\x05\xcb\x00%\x00C@$\x1a\ +\x00\x12\x07\x00\x04\x07\x0c\x16!\x06'&\x03\x16\x17\x17\ +\x16KY\x17\x17\x0a##\x1dKY#\x04\x0a\x10K\ +Y\x0a\x13\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++\x11\x12\x009\x11\x12\x01\x179\x113\x11310\ +\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04! '5\x16\x16\ +3 54&##53 54&#\x22\x06\ +\x07'6!2\x04\x04`\xbd\xa7\xc0\xc9\xfe\xc1\xfe\xe7\ +\xfe\xdc\xafa\xf1d\x01\x81\xe7\xe3\xb0\xa5\x01\xb5\x95\x86\ +j\xc0gm\xe1\x011\xe8\x01\x0e\x04`\x8f\xb6\x19\x06\ +\x17\xb5\x92\xcc\xe6O\xd1.2\xfctz\xc0\xe9]l\ +8C\xa2\x9c\xc6\x00\x01\x00\xc1\x00\x00\x05\x98\x05\xb6\x00\ +\x10\x002@\x17\x0d\x07\x0a\x0a\x09\x0f\x05\x01\x01\x00\x09\ +\x00\x12\x11\x0e\x05\x10\x07\x00\x03\x0a\x10\x12\x00?3?\ +2\x1199\x11\x12\x0199\x113\x1133\x113\ +\x113310\x133\x11\x14\x06\x073\x01!\x11#\ +\x1147#\x01!\xc1\xdb\x0c\x03\x09\x02\xeb\x01\x17\xdc\ +\x13\x08\xfd\x12\xfe\xe8\x05\xb6\xfd\x08w\xf3+\x04\x8d\xfa\ +J\x02\xf2\xad\xf7\xfbj\xff\xff\x00\xc1\x00\x00\x05\x98\x07\ +w\x02&\x01\xb2\x00\x00\x01\x07\x026\x00\xee\x01R\x00\ +\x08\xb3\x01\x11\x05&\x00+5\x00\x01\x00\xc1\x00\x00\x05\ +#\x05\xb6\x00\x0a\x006@\x1a\x08\x09\x01\x00\x0a\x07\x03\ +\x03\x04\x00\x04\x09\x03\x0c\x0b\x02\x07\x0a\x0a\x04\x08\x05\x03\ +\x01\x04\x12\x00?3?3\x129\x1133\x11\x12\x01\ +\x179\x113\x1133\x113\x11310!!\x01\ +\x11#\x113\x11\x01!\x01\x05#\xfe\xe7\xfd\xa6\xef\xef\ +\x02P\x01\x06\xfd\xb2\x02\xe5\xfd\x1b\x05\xb6\xfd<\x02\xc4\ +\xfd>\x00\x00\x01\x00\x08\xff\xe6\x05\x0a\x05\xb6\x00\x11\x00\ +/@\x18\x01\x00\x03\x10\x00\x09\x10\x03\x13\x12\x01\x12\x10\ +\x03LY\x10\x03\x07\x0cLY\x07\x13\x00?+\x00\x18\ +?+\x00\x18?\x11\x12\x01\x179\x113\x11310\ +!#\x11!\x02\x02\x06'\x22'5\x16326\x12\ +\x13!\x05\x0a\xef\xfe`O_\xac\x8eIB96H\ +QaC\x03V\x04\xe9\xfd\x80\xfe2\xb5\x03\x19\xc7\x19\ +\xad\x02P\x02\x09\xff\xff\x00\xc1\x00\x00\x06\xa2\x05\xb6\x02\ +\x06\x000\x00\x00\xff\xff\x00\xc1\x00\x00\x05B\x05\xb6\x02\ +\x06\x00+\x00\x00\xff\xff\x00y\xff\xec\x05\xd3\x05\xcd\x02\ +\x06\x002\x00\x00\xff\xff\x00\xc1\x00\x00\x05%\x05\xb6\x02\ +\x06\x01n\x00\x00\xff\xff\x00\xc1\x00\x00\x04\x89\x05\xb6\x02\ +\x06\x003\x00\x00\xff\xff\x00y\xff\xec\x04\xcf\x05\xcb\x02\ +\x06\x00&\x00\x00\xff\xff\x00\x1d\x00\x00\x04h\x05\xb6\x02\ +\x06\x007\x00\x00\x00\x01\x00\x0c\xff\xec\x05\x19\x05\xb6\x00\ +\x16\x001@\x19\x16\x00\x0f\x0e\x00\x08\x0d\x0e\x13\x05\x18\ +\x17\x0d\x12\x12\x05\x16\x0e\x03\x05\x0aLY\x05\x13\x00?\ ++\x00\x18?3\x129\x113\x11\x12\x01\x179\x113\ +\x11310\x01\x01\x0e\x02#\x22'5\x16326\ +7\x01!\x01\x16\x17367\x01\x05\x19\xfe3U\x8e\ +\xbb\x85tcbk[{2\xfd\xe5\x01\x02\x01e0\ +\x0b\x0a\x06\x18\x01I\x05\xb6\xfb\xf0\xbf\xabP\x1e\xd7'\ +Yt\x04/\xfd#h#\x1a9\x03\x15\x00\xff\xff\x00\ +b\xff\xec\x06=\x05\xcb\x02\x06\x01s\x00\x00\xff\xff\x00\ +\x04\x00\x00\x04\xf6\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x00\ +\xc1\xfem\x05\xe7\x05\xb6\x00\x0b\x002@\x19\x04\x01\x09\ +\x00\x08\x05\x00\x01\x05\x03\x0d\x0c\x0a\x06\x03\x03#\x00\x08\ +\x05\x08LY\x05\x12\x00?+\x11\x003\x18??3\ +\x11\x12\x01\x179\x113\x113\x11310%3\x11\ +#\x11!\x113\x11!\x113\x05%\xc2\xe7\xfb\xc1\xef\ +\x02\x85\xf0\xc7\xfd\xa6\x01\x93\x05\xb6\xfb\x17\x04\xe9\x00\x00\ +\x01\x00\x8b\x00\x00\x04\xf0\x05\xb6\x00\x13\x008@\x1b\x11\ +\x01\x01\x00\x0a\x09\x09\x00\x15\x14\x02\x05\x11\x0e\x09\x05\x0e\ +LY\x05\x05\x01\x12\x09\x03\x01\x12\x00??3\x129\ +/+\x11\x12\x009\x129\x11\x12\x0199\x113\x11\ +3\x11310!#\x11\x06\x06#\x22&5\x113\ +\x11\x14\x163267\x113\x04\xf0\xf0\x87\xd3k\xcf\ +\xe1\xf0q\x81_\xb4\x80\xf0\x02H0*\xc3\xb3\x02R\ +\xfd\xe6rp#+\x02\xae\x00\x00\x01\x00\xc1\x00\x00\x07\ +\xb0\x05\xb6\x00\x0b\x001@\x18\x01\x04\x00\x09\x08\x05\x04\ +\x05\x09\x03\x0d\x0c\x0a\x02\x06\x03\x00\x08\x05\x08LY\x05\ +\x12\x00?+\x11\x003\x18?33\x11\x12\x01\x179\ +\x113\x113\x11310%!\x113\x11!\x113\ +\x11!\x113\x04\xb0\x02\x0e\xf2\xf9\x11\xef\x02\x0e\xf2\xcd\ +\x04\xe9\xfaJ\x05\xb6\xfb\x17\x04\xe9\x00\x00\x01\x00\xc1\xfe\ +m\x08b\x05\xb6\x00\x0f\x00;@\x1e\x01\x04\x07\x06\x00\ +\x0d\x0c\x09\x04\x06\x09\x0d\x04\x11\x10\x0e\x02\x0a\x03\x07#\ +\x04\x00\x0c\x09\x0cLY\x09\x12\x00?+\x11\x0033\ +\x18??33\x11\x12\x01\x179\x113\x113\x113\ +\x11310%!\x113\x113\x11#\x11!\x113\ +\x11!\x113\x04\xa8\x02\x08\xf0\xc2\xe7\xf9F\xef\x02\x06\ +\xf2\xcd\x04\xe9\xfb\x11\xfd\xa6\x01\x93\x05\xb6\xfb\x17\x04\xe9\ +\x00\x00\x02\x00\x08\x00\x00\x05F\x05\xb6\x00\x0c\x00\x15\x00\ +9@\x1e\x11\x00\x0d\x04\x00\x04\x06\x03\x17\x16\x09\x15L\ +Y\x09\x09\x04\x07\x07\x06LY\x07\x03\x04\x0dLY\x04\ +\x12\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x01\x179\x113\x11310\x01\x14\x04!!\x11\ +!5!\x113 \x04\x0132654&##\ +\x05F\xfe\xe5\xfe\xee\xfeO\xfe\xa0\x02P\xb6\x01\x14\x01\ +$\xfd\x12\xb2\xa1\xa5\xa1\xbf\x98\x01\xb8\xd9\xdf\x04\xe9\xcd\ +\xfd\xae\xdb\xfe@q~vn\x00\x03\x00\xc1\x00\x00\x06\ +H\x05\xb6\x00\x0a\x00\x13\x00\x17\x00=@ \x15\x14\x0f\ +\x00\x07\x0b\x0b\x04\x00\x04\x14\x03\x19\x18\x07\x13LY\x07\ +\x07\x04\x16\x05\x03\x15\x12\x04\x0bLY\x04\x12\x00?+\ +\x00\x18??3\x129/+\x11\x12\x01\x179\x113\ +\x113\x113\x11310\x01\x14\x04!!\x113\x11\ +3 \x04\x0132654&##\x01#\x113\ +\x04\x8b\xfe\xe7\xfe\xf0\xfe_\xef\xaa\x01\x12\x01\x1f\xfd%\ +\xa4\xa0\xa4\x9d\xbc\x8f\x04\x98\xf0\xf0\x01\xb8\xd9\xdf\x05\xb6\ +\xfd\xae\xdc\xfe?s~wk\xfdf\x05\xb6\x00\x02\x00\ +\xc1\x00\x00\x04\xbc\x05\xb6\x00\x0a\x00\x13\x002@\x19\x0f\ +\x00\x07\x0b\x0b\x04\x04\x00\x15\x14\x07\x13LY\x07\x07\x04\ +\x05\x03\x04\x0bLY\x04\x12\x00?+\x00\x18?\x129\ +/+\x11\x12\x0199\x113\x113\x11310\x01\ +\x14\x04!!\x113\x113 \x04\x0132654\ +&##\x04\xbc\xfe\xdf\xfe\xee\xfe8\xef\xcf\x01\x16\x01\ +'\xfc\xf4\xc9\xa1\xad\xa6\xc3\xae\x01\xb8\xd7\xe1\x05\xb6\xfd\ +\xae\xdd\xfeBq~vn\x00\x00\x01\x00B\xff\xec\x04\ +\xb0\x05\xcb\x00\x19\x00:@\x1f\x17\x14\x14\x08\x03\x08\x0d\ +\x15\x04\x1b\x1a\x16\x15LY\x16\x16\x0b\x05\x05\x00LY\ +\x05\x04\x0b\x11LY\x0b\x13\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x01\x179\x113\x1131\ +0\x01\x22\x07'63 \x00\x11\x10\x00!\x22'5\ +\x16\x163267!5!&&\x01\xfe\xa6\xc0V\ +\xc9\xf7\x01F\x01h\xfe\x93\xfe\xa9\xe4\xb4d\xbac\xe6\ +\xef\x08\xfd\x5c\x02\xa2\x0e\xe8\x04\xfeV\xc5^\xfew\xfe\ +\xa5\xfe\x90\xfeuA\xcd\x1d%\xed\xe6\xcb\xc8\xe0\x00\x00\ +\x02\x00\xc1\xff\xec\x08\x00\x05\xcd\x00\x12\x00\x1e\x00G@\ +&\x19\x00\x13\x0d\x06\x0c\x08\x08\x09\x00\x09\x06\x03 \x1f\ +\x0c\x07LY\x0c\x0c\x09\x0a\x03\x09\x12\x10\x1cLY\x10\ +\x04\x03\x16LY\x03\x13\x00?+\x00\x18?+\x00\x18\ +??\x129/+\x11\x12\x01\x179\x113\x113\x11\ +33\x11310\x01\x10\x00! \x00\x03!\x11#\ +\x113\x11!\x12\x00! \x00\x01\x10\x1232\x12\x11\ +\x10\x02#\x22\x02\x08\x00\xfe\xad\xfe\xca\xfe\xd7\xfe\xb1\x11\ +\xfe\xc2\xef\xef\x01B\x1c\x01L\x01\x1d\x015\x01T\xfb\ +\xe5\xca\xc6\xc9\xc8\xca\xc3\xc8\xcc\x02\xdd\xfe\x9a\xfeu\x01\ +c\x01D\xfdm\x05\xb6\xfd\xaa\x01-\x01@\xfet\xfe\ +\x9c\xfe\xf1\xfe\xea\x01\x18\x01\x0d\x01\x0f\x01\x14\xfe\xea\x00\ +\x02\x00\x14\x00\x00\x04s\x05\xb6\x00\x0c\x00\x15\x00D@\ +#\x15\x0b\x0b\x0a\x03\x00\x11\x05\x01\x02\x00\x02\x05\x0a\x04\ +\x17\x16\x03\x00\x14\x00KY\x14\x14\x08\x0b\x02\x12\x08\x0e\ +LY\x08\x03\x00?+\x00\x18?3\x129/+\x11\ +\x003\x11\x12\x01\x179\x113\x113\x113\x113\x11\ +310\x01\x01!\x01$\x114$!!\x11#\x11\ +\x11#\x22\x06\x15\x14\x1633\x02\x8f\xfe\x96\xfe\xef\x01\ +\x9c\xfe\xe8\x01\x16\x01\x0e\x01\xb7\xf0\xbe\x97\xa1\x9c\xa4\xb6\ +\x02J\xfd\xb6\x02\x81a\x017\xc9\xd4\xfaJ\x02J\x02\ +\xa4kyv\x84\xff\xff\x00Z\xff\xec\x04\x04\x04f\x02\ +\x06\x00D\x00\x00\x00\x02\x00h\xff\xec\x04y\x06#\x00\ +\x17\x00\x22\x00=@\x1f\x1a\x12\x0b \x00\x00\x06\x12\ +\x03$#\x0b\x15\x0f\x0f\x1cGY\x0f\x0f\x15\x06\x05\x01\ +\x15\x18FY\x15\x16\x00?+\x00\x18?3\x129/\ ++\x11\x12\x009\x11\x12\x01\x179\x113\x113\x113\ +10\x13\x10\x12%6%\x17\x04\x07\x06\x06\x0736\ +632\x12\x15\x10\x00#\x22\x00\x05 \x11\x10#\x22\ +\x06\x06\x07\x14\x16h\xfb\x01\x12\xcf\x01\x0e!\xfe\xb8\x98\ +\x9d\x8b\x0b\x0f9\xb8i\xcc\xe4\xfe\xeb\xf5\xf3\xfe\xec\x02\ +\x17\x01\x06\xedAzg\x1c\x96\x02\x98\x01r\x01\x8e9\ +*(\xcf2\x1c\x1d\xc8\xc9S[\xfe\xfe\xe9\xfe\xf5\xfe\ +\xdc\x01h\xa8\x01X\x01L8\x5c1\xec\xf3\x00\x03\x00\ +\xa8\x00\x00\x04\x8b\x04R\x00\x0d\x00\x15\x00\x1e\x00V@\ +.\x03\x13\x16\x00\x0e\x06\x1b\x13\x13\x0a\x00\x06\x0a\x03 \ +\x1f\x02\x12\x1b\x1b\x12HY\x0c\x1b\x1c\x1b\x02\x10\x03\x1b\ +\x1b\x0a\x0b\x0b\x1aHY\x0b\x0f\x0a\x13HY\x0a\x15\x00\ +?+\x00\x18?+\x11\x12\x009\x18/_^]+\ +\x11\x12\x009\x11\x12\x01\x179\x113\x113\x113\x11\ +3\x12910\x01\x14\x07\x15\x16\x16\x15\x14\x06#!\ +\x11! \x034&#!\x11!2\x034&#!\ +\x11326\x04h\xe5\x80\x88\xef\xe4\xfd\xf0\x02\x0e\x01\ +\xb2\xce||\xfe\xf1\x01\x15\xf2\x1dgf\xfe\xe3\xfav\ +z\x037\xc4)\x08\x0f\x84i\x9d\xa9\x04R\xfd\x02P\ +C\xfe\xc7\x02uB;\xfe\xf6=\x00\x00\x01\x00\xa8\x00\ +\x00\x03s\x04R\x00\x05\x00\x1f@\x0e\x03\x04\x04\x01\x07\ +\x06\x04\x15\x05\x02GY\x05\x0f\x00?+\x00\x18?\x11\ +\x12\x0199\x11310\x01\x15!\x11#\x11\x03s\ +\xfe \xeb\x04R\xb8\xfcf\x04R\x00\x00\x02\x00#\xfe\ +y\x04\xcd\x04R\x00\x0d\x00\x13\x00E@$\x02\x0d\x0e\ +\x0c\x10\x0a\x13\x07\x03\x06\x06\x07\x0a\x0c\x0d\x05\x15\x14\x01\ +\x05\x22\x0a\x10HY\x0a\x0f\x0c\x13\x06\x03\x06GY\x03\ +\x15\x00?+\x11\x0033\x18?+\x00\x18?3\x11\ +\x12\x01\x179\x113\x113\x113\x113\x11310\ +\x01#\x11!\x11#\x1136\x12\x13!\x113!\x11\ +#\x06\x02\x07\x04\xcd\xdb\xfd\x0a\xd9Zv\x8b\x0d\x02\xa0\ +\xa2\xfew\xee\x13yW\xfey\x01\x87\xfey\x02=\xa9\ +\x01\xdf\x01\x14\xfcd\x02\xe8\xce\xfep\x8a\x00\xff\xff\x00\ +f\xff\xec\x049\x04f\x02\x06\x00H\x00\x00\x00\x01\x00\ +\x02\x00\x00\x06m\x04R\x00\x11\x00L@(\x04\x05\x08\ +\x07\x06\x03\x0a\x0a\x0f\x00\x0b\x11\x10\x0d\x0e\x05\x07\x0b\x0e\ +\x10\x05\x13\x12\x03\x00\x0c\x09\x06\x05\x0f\x0f\x0e\x04\x01\x10\ +\x0f\x0b\x08\x0e\x15\x00?33?33\x129\x11\x17\ +3\x11\x12\x01\x179\x113\x113\x11333\x113\ +3\x113\x11310\x01\x113\x11\x013\x01\x01!\ +\x01\x11#\x11\x01!\x01\x013\x02\xc9\xdb\x01\xaa\xf8\xfe\ +M\x01\xda\xfe\xfd\xfe:\xdb\xfe;\xfe\xfe\x01\xd9\xfeN\ +\xf8\x029\x02\x19\xfd\xe7\x02\x19\xfd\xe9\xfd\xc5\x021\xfd\ +\xcf\x021\xfd\xcf\x02;\x02\x17\x00\x01\x00H\xff\xec\x03\ +\xd1\x04f\x00#\x00M@+\x03\x0d\x1e\x13\x08\x0d\x10\ +\x13\x19#\x06%$\x0f\x22##\x22HY\x0c#\x1c\ +#\x02\x10\x03##\x16\x0a\x0a\x05GY\x0a\x10\x16\x1b\ +GY\x16\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/_^]+\x11\x12\x009\x11\x12\x01\x179\x113\ +\x11310\x012654#\x22\x07'632\ +\x16\x15\x14\x07\x15\x16\x16\x15\x14\x04# '5\x163\ +2654&##5\x01\x9c\xa1\x98\xf0\xa0\xa7L\ +\xc1\xe9\xce\xe4\xd5\x85s\xfe\xf5\xef\xfe\xfb\x8a\xb7\xc4\x8d\ +\x99\x9a\xa1\x87\x02\x98GJ\x87H\xafO\x97\x8d\xba:\ +\x08$\x86c\x98\xb5E\xcbVOQSN\xb1\x00\x00\ +\x01\x00\xa8\x00\x00\x04\xc3\x04R\x00\x0e\x002@\x17\x0b\ +\x04\x07\x0c\x03\x00\x07\x06\x00\x0d\x0d\x06\x10\x0f\x0b\x03\x0d\ +\x04\x0e\x0f\x07\x0d\x15\x00?3?3\x1299\x11\x12\ +\x0199\x113\x113\x1133\x113310\x01\ +\x11\x14\x07\x01!\x11#\x11467\x01!\x11\x01\x89\ +\x10\x02+\x01\x1f\xe2\x0b\x04\xfd\xd7\xfe\xe1\x04R\xfd\xc9\ +c\xc0\x03Z\xfb\xae\x02-.\xce/\xfc\xa8\x04R\xff\ +\xff\x00\xa8\x00\x00\x04\xc3\x06%\x02&\x01\xd2\x00\x00\x01\ +\x06\x026h\x00\x00\x08\xb3\x01\x0f\x11&\x00+5\x00\ +\x01\x00\xa8\x00\x00\x04\x7f\x04R\x00\x0a\x006@\x1a\x00\ +\x01\x04\x03\x0a\x02\x06\x06\x07\x01\x03\x07\x03\x0c\x0b\x05\x0a\ +\x02\x02\x07\x00\x08\x0f\x04\x07\x15\x00?3?3\x129\ +\x1133\x11\x12\x01\x179\x113\x1133\x113\x11\ +310\x01!\x01\x01!\x01\x11#\x113\x11\x03V\ +\x01\x02\xfe7\x01\xf0\xfe\xf2\xfe\x22\xeb\xeb\x04R\xfd\xeb\ +\xfd\xc3\x021\xfd\xcf\x04R\xfd\xe7\x00\x00\x01\x00\x08\xff\ +\xee\x045\x04R\x00\x10\x00/@\x18\x01\x00\x03\x0f\x00\ +\x09\x0f\x03\x12\x11\x01\x15\x0f\x03GY\x0f\x0f\x07\x0cF\ +Y\x07\x16\x00?+\x00\x18?+\x00\x18?\x11\x12\x01\ +\x179\x113\x11310!#\x11!\x02\x02\x06#\ +\x22'5\x1632\x12\x13!\x045\xed\xfe\xcf\x1c_\ +\x99zM4%%fu!\x02\xe7\x03\x9a\xfe\x9c\xfe\ +p\xb8\x16\xb8\x0e\x01\xcb\x01\xd9\x00\x01\x00\xa8\x00\x00\x05\ +\xa8\x04R\x00\x16\x00:@\x1d\x0d\x0c\x00\x04\x07\x07\x06\ +\x14\x11\x11\x12\x00\x06\x12\x03\x18\x17\x10\x08\x00\x03\x12\x04\ +\x13\x0f\x0d\x07\x12\x15\x00?33?3\x12\x179\x11\ +\x12\x01\x179\x113\x113\x113\x113\x11331\ +0%767\x13!\x11#\x11\x07\x06\x07\x03#\x03\ +&'\x11#\x11!\x13\x16\x03#\x0d)\x1e\xf8\x019\ +\xd9\x12-\x1f\xf2\xb2\xf22*\xd7\x017\xf0 \xe10\ +\x95P\x02\x5c\xfb\xae\x03}<\xa1L\xfd\xac\x02X\x82\ +\xa3\xfc\x83\x04R\xfd\xb6Q\x00\x00\x01\x00\xa8\x00\x00\x04\ +\x87\x04R\x00\x0b\x003@\x19\x02\x06\x06\x05\x01\x09\x09\ +\x0a\x0a\x05\x0d\x0c\x01\x08GY\x01\x01\x0a\x03\x0b\x0f\x06\ +\x0a\x15\x00?3?3\x129/+\x11\x12\x0199\ +\x113\x113\x113\x11310\x01\x11!\x113\x11\ +#\x11!\x11#\x11\x01\x93\x02\x09\xeb\xeb\xfd\xf7\xeb\x04\ +R\xfeD\x01\xbc\xfb\xae\x01\xdd\xfe#\x04R\xff\xff\x00\ +f\xff\xec\x04}\x04f\x02\x06\x00R\x00\x00\x00\x01\x00\ +\xa8\x00\x00\x04o\x04R\x00\x07\x00%@\x11\x02\x01\x05\ +\x06\x06\x01\x09\x08\x02\x06\x15\x07\x04GY\x07\x0f\x00?\ ++\x00\x18?3\x11\x12\x0199\x113\x11310\ +\x01\x11#\x11!\x11#\x11\x04o\xec\xfe\x10\xeb\x04R\ +\xfb\xae\x03\x98\xfch\x04R\x00\xff\xff\x00\xa8\xfe\x14\x04\ +\x93\x04f\x02\x06\x00S\x00\x00\xff\xff\x00f\xff\xec\x03\ +\xb4\x04f\x02\x06\x00F\x00\x00\x00\x01\x00+\x00\x00\x03\ +\xe7\x04R\x00\x07\x00%@\x12\x03\x04\x01\x04\x06\x03\x09\ +\x08\x04\x15\x02\x06\x07\x06GY\x07\x0f\x00?+\x11\x00\ +3\x18?\x11\x12\x01\x179\x11310\x01\x15!\x11\ +#\x11!5\x03\xe7\xfe\x98\xec\xfe\x98\x04R\xb8\xfcf\ +\x03\x9a\xb8\xff\xff\x00\x00\xfe\x14\x04J\x04R\x02\x06\x00\ +\x5c\x00\x00\x00\x03\x00f\xfe\x14\x05\xb6\x06\x14\x00\x11\x00\ +\x18\x00\x1f\x00K@(\x0c\x0f\x15\x1d\x04\x04\x04\x05\x19\ +\x00\x12\x09\x00\x05\x09\x03! \x0d\x00\x05\x1b\x1c\x16\x0c\ +\x16GY\x0f\x0c\x10\x1d\x15\x06\x15GY\x03\x06\x16\x00\ +?3+\x11\x003\x18?3+\x11\x003\x18??\ +\x11\x12\x01\x179\x113\x113\x113\x12\x17910\ +\x01\x14\x00\x05\x11#\x11$\x0054\x00%\x113\x11\ +\x04\x00\x05\x14\x16\x17\x11\x06\x06\x054&'\x1166\ +\x05\xb6\xfe\xd3\xfe\xf6\xdf\xfe\xf9\xfe\xcd\x01*\x01\x12\xdd\ +\x01\x0a\x01-\xfb\xa4\xa4\xa4\xa5\xa3\x03i\xa3\xa1\xa3\xa1\ +\x02)\xf9\xfe\xd8\x14\xfe \x01\xe0\x14\x01-\xf4\xfd\x01\ +%\x13\x01\xb6\xfeJ\x18\xfe\xd6\xf3\xa4\xc8\x11\x02\xfa\x13\ +\xc6\xa4\xa2\xc4\x13\xfd\x0a\x13\xc7\xff\xff\x00\x19\x00\x00\x04\ +N\x04R\x02\x06\x00[\x00\x00\x00\x01\x00\xa8\xfe{\x05\ +!\x04R\x00\x0b\x002@\x19\x03\x02\x09\x00\x08\x05\x00\ +\x02\x05\x03\x0d\x0c\x0a\x06\x0f\x03\x22\x00\x08\x05\x08GY\ +\x05\x15\x00?+\x11\x003\x18??3\x11\x12\x01\x17\ +9\x113\x113\x11310%3\x11#\x11!\x11\ +3\x11!\x113\x04\x81\xa0\xdd\xfcd\xeb\x02\x03\xeb\xb6\ +\xfd\xc5\x01\x85\x04R\xfch\x03\x98\x00\x00\x01\x00\x8b\x00\ +\x00\x04f\x04R\x00\x12\x008@\x1b\x06\x0a\x0a\x09\x01\ +\x11\x11\x09\x14\x13\x06\x03\x0b\x12\x0e\x0e\x03HY\x0e\x0e\ +\x0a\x07\x12\x0f\x0a\x15\x00??3\x129/+\x11\x12\ +\x009\x119\x11\x12\x0199\x113\x113\x1131\ +0\x01\x11\x143267\x113\x11#\x11\x06\x06#\ +\x22&5\x11\x01w\xb0U\xa2]\xeb\xeba\xb5k\xad\ +\xc2\x04R\xfel\xaa/4\x01\xdb\xfb\xae\x01\xd5<9\ +\xb3\xa1\x01\x9e\x00\x00\x01\x00\xa8\x00\x00\x06\xc7\x04R\x00\ +\x0b\x001@\x18\x09\x00\x08\x05\x04\x01\x00\x01\x05\x03\x0d\ +\x0c\x0a\x06\x02\x0f\x08\x04\x01\x04GY\x01\x15\x00?+\ +\x11\x003\x18?33\x11\x12\x01\x179\x113\x113\ +\x11310!!\x113\x11!\x113\x11!\x113\ +\x06\xc7\xf9\xe1\xeb\x01\xaf\xeb\x01\xae\xec\x04R\xfch\x03\ +\x98\xfch\x03\x98\x00\x01\x00\xa8\xfe{\x07f\x04R\x00\ +\x0f\x00;@\x1e\x03\x02\x0d\x00\x0c\x09\x08\x05\x00\x02\x05\ +\x09\x04\x11\x10\x0e\x0a\x06\x0f\x03\x22\x00\x0c\x08\x05\x08G\ +Y\x05\x15\x00?+\x11\x0033\x18??33\x11\ +\x12\x01\x179\x113\x113\x113\x11310%3\ +\x11#\x11!\x113\x11!\x113\x11!\x113\x06\xc7\ +\x9f\xdd\xfa\x1f\xeb\x01\xaf\xeb\x01\xae\xec\xb6\xfd\xc5\x01\x85\ +\x04R\xfch\x03\x98\xfch\x03\x98\x00\x00\x02\x00\x14\x00\ +\x00\x05B\x04R\x00\x0c\x00\x14\x00=@ \x0d\x05\x01\ +\x12\x12\x09\x05\x09\x0b\x03\x16\x15\x01\x11HY\x01\x01\x09\ +\x0c\x0c\x0bGY\x0c\x0f\x09\x12HY\x09\x15\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x01\x179\ +\x113\x113\x11310\x01\x11!2\x16\x15\x14\x06\ +#!\x11!5\x014&#!\x11!2\x02`\x01\ +\x08\xf1\xe9\xec\xe9\xfe\x08\xfe\x9f\x04By{\xfe\xfe\x01\ +\x08\xee\x04R\xfeF\xa0\xa0\xa9\xaf\x03\x9a\xb8\xfd\x00S\ +B\xfe\xc7\x00\x03\x00\xa8\x00\x00\x05\xd3\x04R\x00\x0a\x00\ +\x13\x00\x17\x007@\x1c\x15\x14\x00\x10\x10\x08\x14\x08\x19\ +\x18\x00\x0fHY\x00\x00\x08\x16\x09\x0f\x15\x15\x08\x10H\ +Y\x08\x15\x00?+\x00\x18??3\x129/+\x11\ +\x12\x0199\x113\x113\x11310\x0132\x16\ +\x15\x14\x06#!\x113\x014&##\x11326\ +\x05#\x113\x01\x93\xe0\xe8\xde\xe7\xdf\xfe5\xeb\x01\xbd\ +{s\xcf\xb1\x8e~\x02\x83\xec\xec\x02\x98\xa0\xa0\xab\xad\ +\x04R\xfd\x00SB\xfe\xc7P\xfe\x04R\x00\x00\x02\x00\ +\xa8\x00\x00\x04w\x04R\x00\x09\x00\x12\x002@\x19\x0a\ +\x03\x00\x0f\x0f\x07\x07\x03\x14\x13\x00\x0eHY\x00\x00\x07\ +\x08\x0f\x07\x0fHY\x07\x15\x00?+\x00\x18?\x129\ +/+\x11\x12\x0199\x113\x113\x11310\x01\ +! \x11\x14\x06#!\x113\x014&#!\x11!\ +26\x01\x93\x01\x15\x01\xcf\xec\xe3\xfe\x00\xeb\x01\xf8~\ +s\xfe\xf9\x01\x0bty\x02\x98\xfe\xc0\xa9\xaf\x04R\xfd\ +\x00SB\xfe\xc7T\x00\x00\x01\x00B\xff\xec\x03\x9c\x04\ +f\x00\x18\x00D@&\x0a\x07\x07\x16\x02\x08\x10\x16\x04\ +\x1a\x19\x09\x08HY\x0c\x09\x1c\x09\x02\x10\x03\x09\x09\x00\ +\x13\x13\x0dGY\x13\x10\x00\x05GY\x00\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/_^]+\x11\x12\ +\x01\x179\x113\x11310\x05\x22'5\x163 \ +\x13!5!&&#\x22\x07'663 \x00\x11\ +\x10\x00\x01{\xb9\x80\x9f\x96\x01\x1e\x13\xfe\x19\x01\xe7\x0c\ +\x8a\x83b\xa0AC\xafU\x01\x05\x01\x04\xfe\xe9\x14?\ +\xc1F\x019\xac\x95\x8c9\xae\x1f&\xfe\xe0\xfe\xe9\xfe\ +\xe9\xfe\xd4\x00\x02\x00\xa8\xff\xec\x06m\x04f\x00\x12\x00\ +\x1e\x00Q@-\x19\x00\x13\x0d\x06\x0c\x08\x08\x09\x00\x06\ +\x09\x03 \x1f\x0c\x07GY\x0c\x0c\x1c\x0c\x02\x10\x03\x0c\ +\x0c\x09\x0a\x0f\x09\x15\x10\x1cFY\x10\x10\x03\x16FY\ +\x03\x16\x00?+\x00\x18?+\x00\x18??\x129/\ +_^]+\x11\x12\x01\x179\x113\x113\x1133\ +\x11310\x01\x10\x00#\x22\x00'#\x11#\x113\ +\x1136$32\x00\x01\x14\x1632654&\ +#\x22\x06\x06m\xfe\xf7\xed\xda\xfe\xff\x15\xf4\xeb\xeb\xf6\ +\x19\x01\x03\xd6\xe6\x01\x0c\xfd\x0ay\x89\x88zz\x88\x89\ +y\x02+\xfe\xf0\xfe\xd1\x01\x01\xf0\xfe#\x04R\xfeD\ +\xdc\xf4\xfe\xcb\xfe\xfa\xbd\xc2\xc2\xbd\xbb\xc0\xc0\x00\x02\x00\ +\x12\x00\x00\x03\xf0\x04R\x00\x0d\x00\x16\x00D@#\x02\ +\x0d\x12\x0b\x0b\x0a\x0e\x05\x00\x01\x01\x05\x0a\x0d\x04\x18\x17\ +\x02\x0d\x11\x0dHY\x11\x11\x08\x0b\x01\x15\x08\x14HY\ +\x08\x0f\x00?+\x00\x18?3\x129/+\x11\x003\ +\x11\x12\x01\x179\x113\x113\x113\x113\x1131\ +0!!\x01&&5463!\x11#\x11#\x03\ +\x14\x1633\x11!\x22\x06\x01\x19\xfe\xf9\x014p\x80\ +\xe0\xc2\x01\xf8\xec\xdf\xea\x81m\xdb\xff\x00`i\x01\xc5\ + \xa5z\x9d\xb1\xfb\xae\x01\xaa\x01XUU\x01HR\ +\x00\xff\xff\x00f\xff\xec\x049\x05\xec\x02&\x00H\x00\ +\x00\x01\x06\x00j\x04\x00\x00\x0a\xb4\x03\x021\x11&\x00\ ++55\x00\x01\x00\x0c\xfe\x14\x04u\x06\x14\x00&\x00\ +w@H\x07$\x16\x19\x1d\x03\x0e\x13\x0e\x0f\x03\x0f\x11\ +\x18$\x05('\x1d\x0f!\x19\x11\x12\x11IY\x16\x12\ +\x12!\x14!\x0aFY\x0f!\x01\xaf!\xbf!\xcf!\ +\xef!\xff!\x05\x00!\x10! !\x03\x09\x03!!\ +\x0f\x14\x00\x0f\x15\x00\x05FY\x00\x1b\x00?+\x00\x18\ +??\x129/_^]]q+\x11\x12\x009\x18\ +/3+\x11\x003\x11\x129\x11\x12\x01\x179\x113\ +3\x11\x173\x11310\x01\x22'5\x16325\ +\x114#\x22\x06\x15\x11#\x11#5353\x15!\ +\x15!\x15\x14\x06\x073663 \x11\x11\x14\x06\x03\ +5[B::}\xd7\x94\x8b\xeb\x9c\x9c\xeb\x01g\xfe\ +\x99\x04\x08\x0f6\xafj\x01\x90\xa5\xfe\x14\x19\xbc\x12\xaa\ +\x03\x00\xf4\xb4\xcd\xfe\x0c\x04\xc3\xa3\xae\xae\xa3k\x1dQ\ +]WQ\xfek\xfc\xd1\xa8\xb5\xff\xff\x00\xa8\x00\x00\x03\ +s\x06!\x02&\x01\xcd\x00\x00\x01\x06\x00v\x06\x00\x00\ +\x08\xb3\x01\x0f\x11&\x00+5\x00\x01\x00f\xff\xec\x03\ +\xcd\x04f\x00\x18\x00D@&\x0e\x11\x11\x03\x03\x08\x0f\ +\x16\x04\x1a\x19\x0e\x11HY\x0c\x0e\x1c\x0e\x02\x10\x03\x0e\ +\x0e\x00\x06\x06\x0bGY\x06\x10\x00\x14GY\x00\x16\x00\ +?+\x00\x18?+\x11\x12\x009\x18/_^]+\ +\x11\x12\x01\x179\x113\x11310\x05 \x00\x11\x10\ +\x00!2\x17\x07&#\x22\x06\x07!\x15!\x16\x163\ +27\x15\x06\x02\x83\xfe\xf8\xfe\xeb\x01\x0f\x01\x10\xb7\x91\ +F\x9an\x86\x8e\x11\x01\xe8\xfe\x18\x0b\x8c\x88\x98\xa3\x84\ +\x14\x01\x22\x01\x15\x01\x1d\x01&A\xb29\x8e\x93\xac\xa1\ +\x98F\xbfA\x00\xff\xff\x00b\xff\xec\x03\x8f\x04f\x02\ +\x06\x00V\x00\x00\xff\xff\x00\x9a\x00\x00\x01\xa2\x05\xfa\x02\ +\x06\x00L\x00\x00\xff\xff\xff\xe9\x00\x00\x02Z\x05\xec\x02\ +&\x00\xf3\x00\x00\x01\x07\x00j\xfe\xc4\x00\x00\x00\x0a\xb4\ +\x02\x01\x19\x11&\x00+55\xff\xff\xff\x87\xfe\x14\x01\ +\xa2\x05\xfa\x02\x06\x00M\x00\x00\x00\x02\x00\x08\xff\xf0\x06\ +\x89\x04R\x00\x17\x00 \x00L@)\x18\x14\x10\x1d\x1d\ +\x00\x02\x0e\x00\x08\x0e\x14\x04\x22!\x10\x1cHY\x10\x10\ +\x00\x0e\x0e\x02GY\x0e\x0f\x00\x1dHY\x00\x15\x06\x0b\ +FY\x06\x16\x00?+\x00\x18?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x01\x179\x113\x113\x11\ +3\x11310!\x11#\x02\x02\x06#\x22'5\x16\ +32\x12\x13!\x1132\x16\x15\x14\x06#\x134&\ +##\x11326\x03\x0e\xf7\x1c^\x99yT/%\ +%fu!\x02\xb8\xc1\xe6\xdc\xe9\xe2\xe0yu\xb4\xb8\ +sw\x03\x9a\xfe\x97\xfeu\xb6\x14\xb8\x0e\x01\xcb\x01\xd9\ +\xfeF\xa0\xa0\xab\xad\x01RSB\xfe\xc7T\x00\x02\x00\ +\xa8\x00\x00\x06\xba\x04R\x00\x12\x00\x1a\x00N@)\x13\ +\x04\x10\x00\x18\x18\x08\x0f\x0b\x0b\x0c\x04\x08\x0c\x03\x1c\x1b\ +\x00\x17HY\x00\x0f\x0f\x0aGY\x0f\x0f\x08\x11\x0d\x0f\ +\x0c\x15\x08\x18HY\x08\x15\x00?+\x00\x18??3\ +\x129/+\x00\x18\x10\xc4+\x11\x12\x01\x179\x113\ +\x113\x113\x1299\x11310\x0132\x16\x15\ +\x14\x06#!\x11!\x11#\x113\x11!\x113\x014\ +&##\x1132\x04/\xc7\xe8\xdc\xe5\xe3\xfeM\xfe\ +W\xee\xee\x01\xac\xed\x01\xa2yu\xb6\xba\xea\x02\x98\xa0\ +\xa0\xaa\xae\x01\xdd\xfe#\x04R\xfeD\x01\xbc\xfd\x00S\ +B\xfe\xc7\x00\x01\x00\x0c\x00\x00\x04u\x06\x14\x00\x1e\x00\ +i@@\x01\x00\x0e\x11\x14\x18\x04\x09\x09\x0a\x00\x0a\x0c\ +\x13\x04 \x1f\x18\x0a\x1c\x14\x0c\x0d\x0cIY\x11\x0d\x0d\ +\x1c\x0f\x1c\x05FY\x0f\x1c\x01\xaf\x1c\xbf\x1c\xcf\x1c\xef\ +\x1c\xff\x1c\x05\x00\x1c\x10\x1c \x1c\x03\x1c\x1c\x0a\x0f\x00\ +\x01\x0a\x15\x00?3?\x129/]]q+\x11\x12\ +\x009\x18/3+\x11\x003\x11\x129\x11\x12\x01\x17\ +9\x113\x12\x179\x11310!#\x114&#\ +\x22\x06\x15\x11#\x11#5353\x15!\x15!\x15\ +\x14\x06\x073663 \x11\x04u\xecgp\x94\x8b\ +\xeb\x9c\x9c\xeb\x01}\xfe\x83\x04\x08\x0f6\xafj\x01\x90\ +\x02w\x7f\x7f\xb1\xd0\xfe\x0c\x04\xc3\xa3\xae\xae\xa3k\x1d\ +Q]WQ\xfek\x00\xff\xff\x00\xa8\x00\x00\x04\x7f\x06\ +!\x02&\x01\xd4\x00\x00\x01\x06\x00vq\x00\x00\x08\xb3\ +\x01\x14\x11&\x00+5\xff\xff\x00\x00\xfe\x14\x04J\x06\ +%\x02&\x00\x5c\x00\x00\x01\x06\x026\xda\x00\x00\x08\xb3\ +\x01\x15\x11&\x00+5\x00\x01\x00\xa8\xfe{\x04\x83\x04\ +R\x00\x0b\x000@\x18\x08\x0b\x04\x07\x03\x00\x00\x07\x0b\ +\x03\x0d\x0c\x05\x01\x0f\x0a\x22\x00\x03GY\x08\x00\x15\x00\ +?2+\x00\x18??3\x11\x12\x01\x179\x113\x11\ +3\x113103\x113\x11!\x113\x11!\x11#\ +\x11\xa8\xeb\x02\x05\xeb\xfe\x83\xdb\x04R\xfch\x03\x98\xfb\ +\xae\xfe{\x01\x85\x00\x01\x00\xc1\x00\x00\x04B\x06\xe7\x00\ +\x07\x00/@\x17\x03\x06\x00\x01\x06\x01\x09\x08\x01\x12\x0f\ +\x04\x01\x0a\x03\x04\x02\x02\x07LY\x02\x03\x00?+\x00\ +\x18\x10\xc6_^]?\x11\x12\x0199\x113\x113\ +10!#\x11!\x113\x11!\x01\xb0\xef\x02\xa9\xd8\ +\xfdn\x05\xb6\x011\xfe\x02\x00\x00\x01\x00\xa8\x00\x00\x03\ +\x89\x05\x8b\x00\x07\x00'@\x12\x03\x06\x00\x01\x06\x01\x09\ +\x08\x04\x02\x01\x15\x02\x07HY\x02\x0f\x00?+\x00\x18\ +?\x10\xc6\x11\x12\x0199\x113\x11310!#\ +\x11!\x113\x11!\x01\x93\xeb\x02\x04\xdd\xfe\x0a\x04R\ +\x019\xfe\x15\x00\xff\xff\x00\x0c\x00\x00\x07\x83\x07s\x02\ +&\x00:\x00\x00\x01\x07\x00C\x01\x08\x01R\x00\x08\xb3\ +\x01&\x05&\x00+5\xff\xff\x00\x14\x00\x00\x06s\x06\ +!\x02&\x00Z\x00\x00\x01\x06\x00C}\x00\x00\x08\xb3\ +\x01'\x11&\x00+5\xff\xff\x00\x0c\x00\x00\x07\x83\x07\ +s\x02&\x00:\x00\x00\x01\x07\x00v\x01\xb4\x01R\x00\ +\x08\xb3\x01&\x05&\x00+5\xff\xff\x00\x14\x00\x00\x06\ +s\x06!\x02&\x00Z\x00\x00\x01\x07\x00v\x01?\x00\ +\x00\x00\x08\xb3\x01'\x11&\x00+5\xff\xff\x00\x0c\x00\ +\x00\x07\x83\x07>\x02&\x00:\x00\x00\x01\x07\x00j\x01\ +h\x01R\x00\x0a\xb4\x02\x012\x05&\x00+55\xff\ +\xff\x00\x14\x00\x00\x06s\x05\xec\x02&\x00Z\x00\x00\x01\ +\x07\x00j\x00\xe5\x00\x00\x00\x0a\xb4\x02\x013\x11&\x00\ ++55\xff\xff\x00\x00\x00\x00\x04\xbc\x07s\x02&\x00\ +<\x00\x00\x01\x07\x00C\xff\x88\x01R\x00\x08\xb3\x01\x12\ +\x05&\x00+5\xff\xff\x00\x00\xfe\x14\x04J\x06!\x02\ +&\x00\x5c\x00\x00\x01\x07\x00C\xff]\x00\x00\x00\x08\xb3\ +\x01\x1e\x11&\x00+5\x00\x01\x00R\x01\xc7\x03\xae\x02\ +\x85\x00\x03\x00\x11\xb5\x03\x00\x05\x04\x00\x01\x00/3\x11\ +\x12\x019910\x135!\x15R\x03\x5c\x01\xc7\xbe\ +\xbe\x00\x01\x00R\x01\xc7\x07\xae\x02\x85\x00\x03\x00\x11\xb5\ +\x03\x00\x05\x04\x00\x01\x00/3\x11\x12\x019910\ +\x135!\x15R\x07\x5c\x01\xc7\xbe\xbe\x00\x01\x00R\x01\ +\xc7\x07\xae\x02\x85\x00\x03\x00\x11\xb5\x03\x00\x05\x04\x00\x01\ +\x00/3\x11\x12\x019910\x135!\x15R\x07\ +\x5c\x01\xc7\xbe\xbe\x00\x02\xff\xfc\xfe1\x03N\xff\xd3\x00\ +\x03\x00\x07\x000@\x0b\x07\x03\x09\x06\x02\x08\x02\x80\x01\ +\x01\x01\xb8\xff\xc0\xb5\x09\x0cH\x01\x05\x06\xb8\xff\xc0\xb3\ +\x0d\x16H\x06\x00/+3\xc6+]2\x11\x0133\ +\x113310\x01!5!5!5!\x03N\xfc\ +\xae\x03R\xfc\xae\x03R\xfe1\x8b\x8c\x8b\x00\x00\x01\x00\ +\x19\x03\xc1\x01s\x05\xb6\x00\x07\x00\x17@\x09\x01\x07\x07\ +\x05\x09\x08\x00\x04\x03\x00?\xcd\x11\x12\x0199\x113\ +10\x13'6\x1273\x02\x07%\x0c\x14f6\xaa\ +@%\x03\xc1\x16S\x01\x1ar\xff\x00\xf5\x00\x00\x01\x00\ +\x19\x03\xc1\x01s\x05\xb6\x00\x06\x00\x17@\x09\x01\x06\x06\ +\x04\x08\x07\x04\x06\x03\x00?\xc6\x11\x12\x0199\x113\ +10\x01\x17\x06\x03#\x127\x01d\x0f5{\xaaE\ +\x1f\x05\xb6\x16\xd1\xfe\xf2\x01!\xd4\x00\x00\x01\x00?\xfe\ +\xf8\x01\x9c\x00\xee\x00\x06\x00\x1e@\x0f\x00\x05\x05\x03\x08\ +\x07\x03@\x06P\x06\xd0\x06\x03\x06\x00/]\xcd\x11\x12\ +\x0199\x11310%\x06\x03#\x1273\x01\x9c\ +0\x80\xadE\x22\xe7\xd7\xba\xfe\xdb\x01\x0e\xe8\x00\x01\x00\ +\x19\x03\xc1\x01u\x05\xb6\x00\x07\x00\x17@\x09\x06\x00\x02\ +\x00\x09\x08\x03\x07\x03\x00?\xcd\x11\x12\x0199\x113\ +10\x01\x16\x13#&\x02'7\x01\x0e\x22E\xac5\ +e\x16\x0e\x05\xb6\xe6\xfe\xf1p\x01\x13\x5c\x16\x00\x02\x00\ +\x19\x03\xc1\x03\x14\x05\xb6\x00\x06\x00\x0e\x00\x22@\x10\x07\ +\x0d\x00\x05\x03\x05\x0b\x0d\x04\x10\x0f\x06\x0e\x02\x0a\x03\x00\ +?3\xcd2\x11\x12\x01\x179\x113\x11310\x01\ +6\x133\x02\x07#%6\x1273\x02\x07#\x01\xb8\ +5}\xaaE\x1f\xe9\xfeR\x14f6\xaa@%\xe9\x03\ +\xd7\xcb\x01\x14\xfe\xd8\xcd\x16S\x01\x1ar\xff\x00\xf5\x00\ +\x02\x00\x19\x03\xc1\x03\x14\x05\xb6\x00\x06\x00\x0d\x00\x22@\ +\x10\x07\x0c\x00\x05\x03\x05\x0a\x0c\x04\x0f\x0e\x0a\x03\x0c\x05\ +\x03\x00?3\xc62\x11\x12\x01\x179\x113\x1131\ +0\x01\x06\x03#\x1273\x05\x06\x03#\x1273\x01\ +s5{\xaaE\x1f\xe7\x01\xb05{\xacE\x22\xe7\x05\ +\xa0\xd1\xfe\xf2\x01!\xd4\x16\xd1\xfe\xf2\x01\x0f\xe6\x00\x00\ +\x02\x00+\xfe\xf8\x03)\x00\xee\x00\x06\x00\x0d\x00)@\ +\x16\x07\x0c\x00\x05\x03\x05\x0a\x0c\x04\x0f\x0e\x0a\x03\x0c@\ +\x06P\x06\xd0\x06\x03\x06\x00/]3\xcd2\x11\x12\x01\ +\x179\x113\x11310%\x06\x03#\x1273\x05\ +\x06\x03#\x1273\x01\x877y\xacB$\xe8\x01\xb0\ +0\x80\xacB$\xe8\xd7\xd6\xfe\xf7\x01\x04\xf2\x17\xba\xfe\ +\xdb\x01\x04\xf2\x00\x00\x01\x00{\x00\x00\x03\x98\x06\x14\x00\ +\x0b\x00>@$\x01\x04\x07\x08\x09\x0a\x06\x02\x02\x03\x00\ +\x03\x05\x03\x0d\x0c\x07\x0a\x0b\x00\x01\x04\x06\x05\x06\x06\x05\ +LY\x06\x06\x03\x08\x00\x03\x12\x00??\x129/+\ +\x11\x12\x00\x179\x11\x12\x01\x179\x113\x12\x1791\ +0\x01%\x13#\x13\x055\x05\x033\x03%\x03\x98\xfe\ +\xaa3\xee5\xfe\xbf\x01A5\xee3\x01V\x03\xc3\x1e\ +\xfc\x1f\x03\xe1\x1e\xce\x1e\x01\xa1\xfe_\x1e\x00\x00\x01\x00\ +{\x00\x00\x03\xaa\x06\x14\x00\x15\x00i@C\x00\x03\x06\ +\x09\x0a\x0b\x0e\x0f\x10\x11\x14\x15\x0c\x04\x04\x05\x02\x05\x07\ +\x0c\x13\x05\x17\x16\x06\x03\x02\x01\x00\x09\x06\x08\x07\x07\x08\ +LY\x0f\x07\x01\x0e\x03\x0e\x11\x12\x13\x14\x0b\x06\x0c\x0d\ +\x0d\x0cLYP\x0d\x01\x07\x0d\x07\x0d\x05\x0f\x00\x05\x12\ +\x00??\x1299//]+\x11\x12\x00\x179_\ +^]+\x11\x12\x00\x179\x11\x12\x01\x179\x113\x12\ +\x17910\x01%\x15%\x13#\x13\x055\x05\x037\ +\x055\x05\x033\x03%\x15%\x17\x02T\x01V\xfe\xaa\ +3\xed3\xfe\xae\x01R--\xfe\xae\x01R3\xed3\ +\x01V\xfe\xaa-\x02\x0a\x1f\xcd\x1d\xfe\x87\x01y\x1d\xcd\ +\x1f\x01\x08\xf8\x1e\xcc\x1e\x01z\xfe\x86\x1e\xcc\x1e\xf8\x00\ +\x01\x00\x83\x01\xd1\x02\x7f\x04\x06\x00\x0b\x00\x13\xb6\x06\x00\ +\x00\x0d\x0c\x09\x03\x00/\xcd\x11\x12\x019\x11310\ +\x134632\x16\x15\x14\x06#\x22&\x83\x84zy\ +\x85\x86xx\x86\x02\xec\x8a\x90\x91\x89\x87\x94\x91\x00\x00\ +\x03\x00\x85\xff\xe3\x06\x08\x01\x14\x00\x0b\x00\x17\x00#\x00\ +/@\x17\x1e\x18\x12\x0c\x06\x00\x00\x0c\x18\x03%$\x1b\ +\x0f\x03\x09\x03QY!\x15\x09\x13\x00?33+\x11\ +\x0033\x11\x12\x01\x179\x113\x113\x11310\ +74632\x16\x15\x14\x06#\x22&%463\ +2\x16\x15\x14\x06#\x22&%4632\x16\x15\x14\ +\x06#\x22&\x85LHILMHHL\x02-L\ +HILMHHL\x02-LHILMHH\ +L}INQFGSRHINQFGS\ +RHINQFGSR\x00\x07\x00R\xff\xec\x09\ +\x9e\x05\xcb\x00\x0a\x00\x15\x00\x19\x00$\x00/\x00:\x00\ +E\x00m@<\x19\x16\x17\x18 %\x1a+6;0\ +A\x06\x0b\x00\x11\x0b\x11\x16\x18%+;A\x08GF\ +\x2288-\xa0C\x01CC\x19\x03`\x0e\x01\xaf\x0e\ +\x01\x0e\x0e\x18\x19\x03\x18\x12\x08\x13\x04\x1d33(>\ +\x13\x00?33\x113?3??\x129/]q\ +3\x119/]33\x113\x11\x12\x01\x179\x113\ +\x113\x113\x113\x113\x113\x113\x11310\ +\x01\x14\x163265\x10#\x22\x06\x05\x14\x06#\x22\ +&5\x10!2\x16%\x01#\x01\x01\x14\x16326\ +5\x10#\x22\x06\x05\x14\x06#\x22&5\x10!2\x16\ +\x05\x14\x163265\x10#\x22\x06\x05\x14\x06#\x22\ +&5\x10!2\x16\x01\x12@HGD\x8bH@\x01\ +\xd5\xaa\xa3\x9c\xac\x01H\xa0\xad\x02\x8c\xfc\xd5\xc1\x03+\ +\x03\x17@GGD\x8bG@\x01\xd5\xaa\xa4\x9c\xac\x01\ +H\x9f\xaf\xfb9>GGD\x8bG>\x01\xd3\xaa\xa4\ +\x9c\xac\x01H\x9f\xaf\x04\x00\x95\x92\x91\x96\x01'\x92\x93\ +\xe6\xe7\xed\xe0\x01\xc9\xed\xd8\xfaJ\x05\xb6\xfc\x02\x95\x94\ +\x92\x97\x01%\x90\x95\xe6\xe6\xed\xdf\x01\xc9\xec\xdd\x95\x94\ +\x92\x97\x01%\x90\x95\xe6\xe6\xed\xdf\x01\xc9\xec\xff\xff\x00\ +\x85\x03\xa6\x01m\x05\xb6\x02\x06\x00\x0a\x00\x00\xff\xff\x00\ +\x85\x03\xa6\x02\xf8\x05\xb6\x02\x06\x00\x05\x00\x00\x00\x01\x00\ +R\x00h\x02^\x03\xe1\x00\x06\x00\x18@\x0a\x03\x06\x02\ +\x04\x06\x03\x08\x07\x05\x01\x00/\xc4\x11\x12\x01\x179\x11\ +310\x13\x01\x17\x01\x01\x07\x01R\x01d\xa8\xfe\xe6\ +\x01\x1a\xa8\xfe\x9c\x021\x01\xb0^\xfe\xa2\xfe\xa4a\x01\ +\xaf\x00\x01\x00P\x00h\x02^\x03\xe1\x00\x06\x00\x18@\ +\x0a\x03\x00\x00\x02\x04\x03\x08\x07\x01\x05\x00/\xc4\x11\x12\ +\x01\x179\x11310\x01\x01'\x01\x017\x01\x02^\ +\xfe\x9a\xa8\x01\x1a\xfe\xe6\xa8\x01f\x02\x17\xfeQa\x01\ +\x5c\x01^^\xfeP\x00\xff\xff\x00\x85\xff\xe3\x03\xe4\x05\ +\xb6\x00&\x00\x04\x00\x00\x00\x07\x00\x04\x026\x00\x00\x00\ +\x01\xfew\x00\x00\x02\x8f\x05\xb6\x00\x03\x00\x1a@\x0b\x03\ +\x00\x05\x01\x02\x02\x04\x03\x03\x02\x12\x00??\x11\x013\ +\x113\x113210\x01\x01#\x01\x02\x8f\xfc\xa8\xc0\ +\x03Z\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\x00h\x03\x0e\x02\ +\xe5\x05\xc7\x00\x12\x00*@\x13\x0c\x08\x00\x12\x08\x09\x12\ +\x09\x14\x13\x0c\x0f\x00\x09\x0a\x03\x04\x0f\x04\x00?3?\ +\xcd2\x113\x11\x12\x0199\x113\x113\x1131\ +0\x01\x114&#\x22\x06\x15\x11#\x113\x1736\ +3 \x15\x11\x02HEEfR\x9e\x81\x15\x0cI\x90\ +\x01\x02\x03\x0e\x01\x9aPCfs\xfe\xac\x02\xaaVe\ +\xfa\xfeA\x00\x01\x00B\x00\x00\x04%\x05\xb6\x00\x11\x00\ +L@)\x00\x09\x0e\x03\x04\x04\x05\x02\x05\x07\x0c\x10\x05\ +\x13\x12\x03\x07\x08\x07PY\x00\x08\x08\x05\x0e\x0e\x11M\ +Y\x0e\x0e\x0a\x05\x18\x0a\x0dMY\x0a\x06\x00?+\x00\ +\x18?\x129/+\x11\x12\x009\x18/3+\x11\x00\ +3\x11\x12\x01\x179\x113\x12\x17910\x01!\x15\ +!\x11#\x11#53\x11!\x15!\x11!\x15!\x01\ +\xd1\x017\xfe\xc9\xec\xa3\xa3\x03@\xfd\xac\x02-\xfd\xd3\ +\x01\xa2\x9a\xfe\xf8\x01\x08\x9a\x04\x14\xca\xfeK\xca\x00\x00\ +\x01\x00J\x00\x00\x04X\x05\xc9\x00\x22\x00z@D\x11\ +\x15\x0f\x08\x0c\x0c\x1f\x18\x1b\x0a\x0d\x1d\x1a\x02\x0d\x13\x15\ +\x1a\x1b\x06$#\x0b\x1d\x1e\x1dPY\x08\x0f\x1e\x1f\x1e\ +/\x1e\xbf\x1e\x04\x09\x03\x1e\x19\x0c\x1a\x19\x1aPY\x0f\ +\x19\x19\x14\x00\x00\x05MY\x00\x07\x15\x14\x11\x14\x11N\ +Y\x14\x18\x00?+\x11\x12\x009\x18?+\x11\x12\x00\ +9\x18/3+\x11\x003\x18\x10\xc6_^]2+\ +\x11\x003\x11\x12\x01\x179\x113\x113\x11333\ +\x1133\x11310\x012\x17\x07&#\x22\x15\x15\ +!\x15!\x15!\x15!\x14\x07!\x15!5667\ +#535#53546\x02\xb8\xc5\xaeL\x9f\ +\x82\xc8\x01\x85\xfe{\x01\x85\xfey\x90\x02\xf4\xfb\xf2a\ +V\x0b\xbe\xbe\xbe\xbe\xdc\x05\xc9P\xb4C\xdb\x95\x98\x8d\ +\x9a\xb6T\xcf\xc3\x1c\x80z\x9a\x8d\x98\x7f\xd9\xd9\x00\x00\ +\x03\x00\xa8\xff\xec\x06\x5c\x05\xb6\x00\x14\x00\x1e\x00'\x00\ +c@5\x0b\x07\x0e\x12\x12\x07#\x15\x1f\x1a\x1a\x1b\x03\ +\x07\x09\x10\x15\x1b\x06)(\x08\x11\x0e\x11PY\x0b\x0e\ +\x0e\x1b\x1c\x1f\x19MY\x1f\x1f\x1c\x1b\x18\x1c'MY\ +\x1c\x06\x05\x00OY\x05\x19\x00?+\x00\x18?+\x00\ +\x18?\x129/+\x11\x12\x009\x18/3+\x11\x00\ +3\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +\x11310%27\x15\x06# \x11\x11#57\ +73\x153\x15#\x11\x14\x16\x01\x14\x04!#\x11#\ +\x11! \x0132654&##\x05\xcbOB\ +I\x82\xfe\xee\x98\xa2L}\xf8\xf8>\xfej\xfe\xe0\xfe\ +\xed<\xe3\x01=\x02\x15\xfd\x91<\xa6\xa5\x94\x9fT\xa0\ +\x1a\xa6(\x013\x01\x85^V\xd5\xdf\xaa\xfe\x8bEJ\ +\x03\x5c\xe6\xf3\xfd\xdd\x05\xb6\xfd6z\x8e\x7f{\x00\x00\ +\x01\x00?\xff\xec\x04\x85\x05\xc5\x00&\x00q@B\x0c\ +\x03\x08\x08\x16\x1f\x03\x1b\x05\x0a\x11\x18\x1b\x1d$\x07(\ +'\x06\x1d\x1e\x1dPY\x03\x0f\x1e\x1f\x1e/\x1e\xbf\x1e\ +\x04\x09\x03\x1e\x17\x09\x18\x17\x18PY\x0c\x03\x17\x01\x14\ +\x03\x17\x17\x13\x22\x22\x00MY\x22\x07\x13\x0eMY\x13\ +\x19\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]3+\x11\x003\x18\x10\xc6_^]2+\x11\x00\ +3\x11\x12\x01\x179\x11\x173\x113310\x01\x22\ +\x06\x07!\x15!\x07\x15\x17!\x15!\x12!27\x15\ +\x06#\x22\x00'#53'57#536\x00\ +32\x17\x07&\x03\x1f\x8d\xb3\x1e\x01\xc8\xfe)\x02\x02\ +\x01\x98\xfey@\x01,\x8f\x96\x83\xae\xf1\xfe\xd3.\x98\ +\x88\x02\x02\x88\x96&\x012\xf2\xc8\x9eT\x9a\x04\xfe\xa8\ +\xaa\x9a-7'\x99\xfe\xc8>\xcb=\x01\x08\xfa\x99%\ +%A\x9a\xfb\x01\x1eX\xbbL\x00\x04\x00f\xff\xf2\x06\ +\x12\x05\xc1\x00\x03\x00\x0f\x00\x18\x00,\x00L@)\x03\ +\x00\x01\x02\x14\x04\x10\x0a&\x1c\x00\x02\x04\x0a\x1c!*\ +\x07.-(\x00\x19\x01\x19\x19\x03\x16\x0d\x0d\x02\x03\x03\ +\x02\x12$\x1f\x03\x12\x07\x13\x00?3?3??\x12\ +9/3\x119/q3\x11\x12\x01\x179\x113\x11\ +3\x113\x113\x11310\x01\x01#\x01\x01\x14\x06\ +#\x22&54632\x16\x05\x143254#\ +\x22\x06\x01\x22&54632\x17\x07&#\x22\x15\ +\x14327\x15\x06\x05\x1f\xfc\xd5\xc3\x03+\x01\xb6\xae\ +\x99\x92\xae\xac\x9a\x92\xaf\xfe!\x9c\x99\x99UG\xfd\x94\ +\xa8\xb9\xb8\xadn_.XK\xb9\xb5mWL\x05\xb6\ +\xfaJ\x05\xb6\xfb\x9c\xa3\xbd\xbf\xa1\xa5\xbb\xc0\xa0\xdb\xdb\ +\xd9r\x01K\xb6\xa4\xad\xb6+\x82%\xd9\xd5%\x83)\ +\x00\x00\x02\x00P\xff\xec\x03\xbc\x05\xc9\x00\x1b\x00$\x00\ +I@$\x1c\x17\x03\x04\x22\x10\x19\x19\x0b\x04\x0b\x0d\x17\ +\x04&%\x03\x03\x14\x07\x22\x10\x1e\x0e\x19\x0b\x0e\x0d\x0d\ +\x14\x00\x07\x19\x1e\x14\x07\x00?3?3\x129/3\ +99\x11\x1299\x11\x129/\x11\x12\x01\x179\x11\ +3\x1299\x113\x11310%2673\x06\ +\x06#\x22&55\x06\x07567\x114632\ +\x16\x15\x10\x05\x11\x14\x134#\x22\x06\x15\x1166\x02\ +\x7fJW\x07\x95\x09\xab\xa2\xa7\xb5DvjP\xa4\xac\ +\x8b\xa2\xfee\xdbm:4ol\x96hf\xc1\xb7\xc4\ +\xb4\xbb\x17\x1f\x9a\x1d\x1c\x01\xc7\x9a\xac\xa4\x94\xfe\x8f\xba\ +\xfe\xfe\xce\x03\xf5\xa8K]\xfe\x836\xc5\x00\x00\x04\x00\ +\xa8\x00\x00\x07\xd7\x05\xb6\x00\x0f\x00\x1b\x00'\x00+\x00\ +Y@/\x22\x10\x1c\x16\x0b\x01\x0e\x0e\x00\x09\x03\x06\x06\ +\x07\x00\x07\x10\x16)*\x06-,\x03\x0b(\x08%\x19\ +\x1f\x0f\x13\x1f\x13\x02\x13\x13(\x0e\x08\x03)((\x01\ +\x07\x12\x00?33\x113?3\x129/]3\xc4\ +2\x11\x1299\x11\x12\x01\x179\x113\x1133\x11\ +3\x1133\x113\x11310!!\x01#\x16\x15\ +\x11#\x11!\x013&5\x113\x01\x14\x06#\x22&\ +54632\x16\x05\x14\x1632654&#\ +\x22\x06\x035!\x15\x04\xcb\xfe\xfe\xfd\xa8\x0d\x15\xd1\x01\ +\x06\x02R\x0c\x12\xd1\x03\x0c\xab\x99\x91\xae\xab\x99\x92\xad\ +\xfe#HTQHHQRJ\x85\x02?\x04q\xff\ +\x99\xfd'\x05\xb6\xfb\x94\xf8\x91\x02\xe3\xfc\xbf\xa8\xbb\xbc\ +\xa7\xa7\xbb\xc2\xa0kllklii\xfd\x1f\xa2\xa2\ +\x00\x00\x02\x00\x1b\x02\xe5\x05\x93\x05\xb6\x00\x07\x00\x18\x00\ +L@'\x11\x14\x14\x13\x18\x08\x10\x0f\x0c\x0c\x0d\x00\x01\ +\x03\x01\x06\x0d\x10\x13\x06\x1a\x19\x07\x03\x03\x14\x10\x0d\x08\ +\x00\x01\x01\x01\x16\x11\x0e\x09\x04\x03\x00?3333\ +\xc4]22223\x113\x11\x12\x01\x179\x113\ +\x113\x113\x1133\x113\x11310\x01#\x11\ +#5!\x15#\x01\x03#\x17\x11#\x113\x13\x133\ +\x11#\x117#\x03\x01w\x92\xca\x02)\xcd\x02L\xb9\ +\x06\x04\x8d\xd9\xb2\xbb\xd2\x93\x04\x06\xc1\x02\xe5\x02P\x81\ +\x81\xfd\xb0\x02\x1fw\xfeX\x02\xd1\xfd\xea\x02\x16\xfd/\ +\x01\x9e\x81\xfd\xe1\xff\xff\x00D\x00\x00\x06\x02\x05\xcd\x02\ +\x06\x01v\x00\x00\x00\x02\x00f\xff\xdd\x04\x8b\x04H\x00\ +\x17\x00\x1f\x005@\x1b\x18\x0c\x0d\x1f\x1f\x04\x04\x0c\x15\ +\x03! \x0d/\x1f?\x1f\x02\x1f\x14\x1f\x08\x11\x00\x1c\ +\x08\x0f\x00?3/2\x1299/]3\x11\x12\x01\ +\x179\x113\x113\x11310\x05\x22&\x0254\ +6632\x16\x12\x15!\x11\x16\x163267\x17\ +\x06\x06\x13\x11&&#\x22\x07\x11\x02y\x9d\xf1\x85\x8a\ +\xf4\x95\x98\xf3\x87\xfc\xc51\xa6R\x83\xb7QHb\xd9\ +\x932\xa3X\xadz#\x93\x01\x05\x9d\xab\xff\x8c\x8e\xfe\ +\xfd\xa5\xfe\x9c5Fi\x81)\x9b|\x02\x8b\x01\x155\ +Bu\xfe\xe9\x00\xff\xff\x00A\xff\xea\x06P\x05\xb6\x00\ +'\x02\x17\x02\x87\x00\x00\x00&\x00{\xed\x00\x01\x07\x02\ +@\x03\x9a\xfd\xb3\x00\x0b\xb4\x04\x03\x02\x1a\x19\x00?5\ +55\x00\xff\xff\x00-\xff\xea\x06j\x05\xc9\x00'\x02\ +\x17\x02\xcd\x00\x00\x00'\x02@\x03\xb4\xfd\xb3\x01\x06\x00\ +u\x00\x00\x00\x0b\xb4\x03\x02\x01\x0f\x19\x00?555\ +\x00\xff\xff\x00P\xff\xea\x06h\x05\xb6\x00'\x02\x17\x02\ +\xc9\x00\x00\x00&\x02=\x08\x00\x01\x07\x02@\x03\xb2\xfd\ +\xb3\x00\x0b\xb4\x04\x03\x02,\x19\x00?555\x00\xff\ +\xff\x00V\xff\xea\x06L\x05\xb6\x00'\x02\x17\x02q\x00\ +\x00\x00'\x02@\x03\x96\xfd\xb3\x01\x06\x02?\x1d\x00\x00\ +\x0b\xb4\x03\x02\x01\x0f\x19\x00?555\x00\x00\x02\x00\ +P\xff\xec\x04L\x05\xc9\x00\x16\x00!\x00D@#\x17\ +\x01\x01\x0c\x1c\x12\x06\x0c\x12\x03#\x22\x00\x0f\x15\x15\x19\ +HY\x15\x15\x0f\x09\x09\x04FY\x09\x07\x0f\x1fFY\ +\x0f\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x009\x11\x12\x01\x179\x113\x113\x1131\ +0\x0174&#\x22\x075632\x12\x11\x10\x00\ +!\x22&54\x00!2\x13&#\x22\x02\x15\x14\x16\ +32\x12\x03X\x02yy\x81\x91\x91\xa2\xe1\xe2\xfe\xaa\ +\xfe\xdb\xc1\xc0\x01\x1a\x01\x00\x8cG\x22\x9c\x8b\xaaGJ\ +y\xc0\x03\xac\x0c\xa6\xa6^\xd7L\xfe\xe9\xfe\xec\xfe\x85\ +\xfd\xc9\xca\xcb\xf8\x01\x87\xfe\xb2\x9a\xfe\xe1\xa8lm\x01\ +\x17\x00\x02\x00/\x00\x00\x04\xba\x05\xb8\x00\x05\x00\x0d\x00\ +7@\x1b\x02\x01\x06\x0a\x03\x09\x00\x00\x03\x06\x03\x0f\x0e\ +\x06\x05\x01\x03\x03\x00\x09\x05\x05\x09LY\x05\x12\x00?\ ++\x11\x12\x0099\x18?\x129\x11\x12\x01\x179\x11\ +3\x113\x1133107\x01!\x01\x15!\x01\x06\ +\x07\x01!\x03&&/\x01\xc5\x01\x02\x01\xc4\xfbu\x02\ +F+!\xff\x00\x02\x95\xfd\x17.\x8d\x05+\xfa\xd3\x8b\ +\x04\xd9\xad_\xfd\x00\x02\xfc@\xa8\x00\x00\x01\x00\xb6\xfe\ +#\x053\x05\xb6\x00\x07\x00$@\x10\x00\x07\x03\x04\x07\ +\x04\x09\x08\x00\x04\x05\x02LY\x05\x03\x00?+\x00\x18\ +/3\x11\x12\x0199\x113\x11310\x01\x11!\ +\x11#\x11!\x11\x04?\xfdk\xf4\x04}\xfe#\x06\xc4\ +\xf9<\x07\x93\xf8m\x00\x00\x01\x009\xfe#\x04\xf0\x05\ +\xb6\x00\x0b\x00D@#\x02\x08\x07\x03\x09\x01\x01\x03\x06\ +\x08\x0a\x05\x0d\x0c\x02\x08\x08\x00\x03\x07\x04\x04\x07LY\ +\x04\x03\x01\x09\x00\x00\x09LY\x00\x00/+\x11\x12\x00\ +9\x18?+\x11\x12\x009\x129\x113\x11\x12\x01\x17\ +9\x113\x113\x11310\x135\x01\x015!\x15\ +!\x01\x01!\x159\x02]\xfd\xb4\x04f\xfc\xdf\x02\x19\ +\xfd\xcf\x03y\xfe#\x8b\x03o\x03\x10\x89\xca\xfd5\xfc\ +\xcd\xcb\x00\x00\x01\x00`\x02y\x041\x03+\x00\x03\x00\ +\x19@\x0c\x03\x00\x05\x04\x01\x00RY/\x01\x01\x01\x00\ +/]+\x11\x12\x019910\x135!\x15`\x03\ +\xd1\x02y\xb2\xb2\x00\x01\x00%\xff\xf2\x04\xdb\x06\xba\x00\ +\x08\x00.@\x14\x01\x00\x06\x05\x02\x02\x03\x06\x03\x09\x07\ +\x08\x0a\x03\x04\x04\x08\x06\x01\x08\x00//3\x129/\ +3\x11\x0132\x11\x179\x113\x1133101\ +0\x05#\x01#5!\x13\x013\x02\x83\x9c\xfe\xf0\xb2\ +\x013\xdb\x01\xf6\xb2\x0e\x02\xf7\xaf\xfd\x8d\x05\x95\x00\x00\ +\x03\x00s\x01\x87\x051\x04\x17\x00\x13\x00\x1f\x00+\x00\ +@@$)\x00\x1d\x0a\x00\x05\x0a\x0f\x17#\x06-,\ +\x0f\x17#\x05\x04\x0d&\x14\x14\x03\x07 \x1a\x1a\x11?\ +\x0d\x7f\x0d\x9f\x0d\x03\x0d\x00/]33\x113\xc42\ +2\x113\x11\x179\x11\x12\x01\x179\x113\x1131\ +0\x01\x14\x06#\x22'\x06#\x22&54632\ +\x17632\x16\x01267&&#\x22\x06\x15\x14\ +\x16\x01\x22\x06\x07\x16\x1632654&\x051\xae\ +\x83\xb7z\x81\xa4\x8b\xac\xb1\x86\xb1x|\xb1\x8a\xa7\xfc\ +\x818_0-^>EPR\x02\x856_2-\ +a;CTV\x02\xcd\x88\xbe\xc7\xc3\xb6\x92\x8e\xb6\xc5\ +\xc0\xb5\xfe\xd2OUQQ^FHZ\x01BOS\ +RR\x5cHHZ\x00\x00\x01\x00\x06\xfe\x14\x03!\x06\ +\x14\x00\x16\x00\x1e@\x0e\x09\x13\x03\x0f\x13\x03\x18\x17\x11\ +\x0c\x1c\x05\x00\x00\x00?2?3\x11\x12\x01\x179\x11\ +310\x012\x17\x15&#\x22\x06\x15\x11\x14\x06#\ +\x22'5\x16325\x1146\x02\x83`>CB\ +LD\xb4\xaebBO:\x94\xb2\x06\x14\x1c\xc5\x1fi\ +V\xfa\xf4\xb6\xbd\x1d\xc3\x1f\xc1\x05\x0c\xb5\xbd\x00\x02\x00\ +\x5c\x01q\x043\x04/\x00\x16\x00.\x00q@B\x03\ +\x0f\x1a'\x040/&\x1d\x03\x11\x1a)\x0e\x06\x11\x0b\ +RY\x11\x00\x11\x10\x11\x02\x09\x03\x11\x06@\x06\x00R\ +Y\x06\x1d)#RY\x00)\x10)\x02\x09\x03)\x1d\ +@\x1d\x17RY\x0f\x1d\x1f\x1d?\x1d_\x1d\x7f\x1d\x05\ +\x1d\x00/]+\x00\x1a\x18\x10\xcd_^]+\x00\x18\ +\x10\xc4+\x00\x1a\x18\x10\xcd_^]/+\x00\x10\x18\ +\xc4\x10\xc4\x10\xc6\x10\xc4\x11\x12\x01\x17910\x01\x22\ +\x06\x075632\x16\x17\x163267\x15\x06#\ +\x22&'&&\x03\x22\x06\x075632\x16\x17\x16\ +\x163267\x15\x06#\x22&'&&\x01H5\ +\x807m\x93H\x81H\x7f\x5c5~8f\x9aCs\ +XGc34\x7f9j\x96FyRIb05\ +|:e\x9bEvSU_\x01\xe9A7\xbeo#\ +\x1f7?:\xbfl\x1a%\x1d\x1a\x01\x94@9\xbfl\ +\x1f\x22\x1f\x19?:\xbem\x1d##\x16\x00\x00\x01\x00\ +`\x00\x9a\x041\x05\x0c\x00\x13\x00U@4\x03\x01\x00\ +\x06\x11\x07\x10\x0a\x0d\x0b\x0a\x0c\x02\x08\x04\x0f\x13\x02\x0c\ +\x06\x15\x14\x01\x00\x11\x04\x05\x04\x05RY\x04\x09\x0b\x10\ +\x0d\x08\x09\x09\x08RY\x0f\x09/\x09O\x09o\x09\x04\ +\x09\x00/]+\x11\x12\x00993\x18\x10\xc6+\x11\ +\x12\x00993\x11\x12\x01\x179\x11\x12\x17910\ +\x01\x03'7#5!7!5!\x13\x17\x07!\x15\ +!\x07!\x15\x02!\x81\xa2`\xfe\x01Rg\xfeG\x02\ +\x0a\x86\xa3d\x01\x02\xfe\xach\x01\xbc\x01\xb0\xfe\xeaE\ +\xd1\xb2\xdd\xb3\x01\x1aG\xd3\xb3\xdd\xb2\x00\x02\x00^\x00\ +\x00\x041\x05\x0a\x00\x06\x00\x0a\x00%@\x14\x05\x01\x00\ +\x01\x04\x07\x0a\x05\x0c\x0b\x07\x08RY\x07\x03?\x00\x01\ +\x00\x00/]\xc6/+\x11\x12\x01\x179\x11310\ +%\x015\x01\x15\x09\x025!\x15\x041\xfc/\x03\xd1\ +\xfd#\x02\xdd\xfc-\x03\xd1\xfc\x01\xaey\x01\xe7\xc2\xfe\ +\xa8\xfe\xd1\xfe?\xb2\xb2\x00\x02\x00`\x00\x00\x041\x05\ +\x0a\x00\x06\x00\x0a\x00'@\x15\x01\x05\x02\x05\x06\x07\x0a\ +\x05\x0c\x0b\x07\x08RY\x07\x03\x00?\x06\x01\x06\x00/\ +]\x10\xc6/+\x11\x12\x01\x179\x11310\x13\x01\ +\x015\x01\x15\x01\x155!\x15`\x02\xdd\xfd#\x03\xd1\ +\xfc/\x03\xd1\x01\xc1\x01/\x01X\xc2\xfe\x19y\xfeR\ +\xfc\xb2\xb2\x00\x02\x00b\x00\x00\x04F\x05\xc1\x00\x05\x00\ +\x09\x005@\x1c\x02\x01\x07\x05\x04\x09\x06\x03\x08\x00\x00\ +\x03\x07\x09\x04\x0b\x0a\x07\x00\x08\x06\x03\x09\x06\x02\x05\x02\ +\x03\x00?/\x12\x179\x11\x12\x01\x179\x113\x113\ +\x1133\x113310\x13\x013\x01\x01#\x09\x03\ +b\x01\xc3^\x01\xc3\xfe=^\x01H\xfe\xe7\xfe\xe7\x01\ +\x19\x02\xdf\x02\xe2\xfd\x1e\xfd!\x02\xdf\x01\xd7\xfe)\xfe\ +)\xff\xff\x00#\x00\x00\x04\x89\x06\x1f\x00&\x00I\x00\ +\x00\x00\x07\x00L\x02\xe7\x00\x00\xff\xff\x00#\x00\x00\x04\ +z\x06\x1f\x00&\x00I\x00\x00\x00\x07\x00O\x02\xe7\x00\ +\x00\x00\x01\x00\xa2\x04\xd9\x03\xf8\x06%\x00\x0e\x00 @\ +\x0d\x0b\x0c\x04\x03\x0c\x03\x10\x0f\x0b\x04\x80\x08\x00\x00/\ +2\x1a\xcc2\x11\x12\x0199\x113\x11310\x01\ +\x22&'3\x1e\x0232673\x06\x06\x02F\xd4\ +\xc5\x0b\xd5\x06+QSbf\x0b\xd9\x0f\xd4\x04\xd9\x99\ +\xb3HP#Wd\xac\xa0\x00\x00\x01\xff\x87\xfe\x14\x01\ +\x93\x04R\x00\x0c\x00\x1f@\x0e\x0a\x03\x07\x07\x0e\x0d\x08\ +\x0f\x00\x05FY\x00\x1b\x00?+\x00\x18?\x11\x12\x01\ +9\x113310\x13\x22'5\x16325\x113\ +\x11\x14\x067jFDG\x96\xeb\xb3\xfe\x14\x19\xba\x12\ +\xaa\x04\xd3\xfb\x1d\xab\xb0\x00\x01\x01s\x04\xcd\x02\x96\x06\ +\x14\x00\x08\x00\x19@\x0a\x03\x02\x08\x02\x0a\x09\x08\x80\x03\ +\x00\x00?\x1a\xcd\x11\x12\x0199\x11310\x016\ +73\x15\x06\x06\x07#\x01s/\x12\xe2\x17Z+\x87\ +\x04\xe5\x9e\x91\x14>\xb3B\x00\x00\x01\x01f\xfe;\x02\ +\x91\xff\x83\x00\x09\x00\x18@\x09\x04\x03\x03\x00\x0b\x0a\x09\ +\x80\x04\x00/\x1a\xcd\x11\x12\x0199\x11310\x01\ +6673\x15\x06\x06\x07#\x01f\x17+\x08\xe1\x1d\ +\x5c*\x88\xfeT@\xadB\x14P\xac8\x00\x00\x01\x01\ +f\x04\xd9\x02\x91\x06!\x00\x09\x00\x18@\x09\x04\x03\x09\ +\x03\x0b\x0a\x09\x80\x04\x00/\x1a\xcd\x11\x12\x0199\x11\ +310\x01\x06\x06\x07#56673\x02\x91\x13\ +-\x09\xe2\x1c]+\x87\x06\x065\xb1G\x13M\xad;\ +\x00\x00\x02\x00'\x027\x02\xbe\x05\xc9\x00\x0b\x00\x15\x00\ + @\x0e\x06\x0c\x00\x11\x11\x0c\x17\x16\x09\x13\x1f\x03\x0e\ +!\x00?3?3\x11\x12\x0199\x113\x1131\ +0\x13\x14\x1632654&#\x22\x06\x05\x10!\ +\x22&5\x10!2\x16\xe9@HHCCHH@\ +\x01\xd5\xfe\xb3\xa3\xa7\x01J\xa4\xa9\x04\x00\x95\x90\x8f\x96\ +\x95\x90\x90\x93\xfe5\xef\xdc\x01\xc7\xed\x00\x02\x00\x10\x02\ +J\x02\xd5\x05\xbc\x00\x0a\x00\x11\x00>@ \x09\x01\x01\ +\x0b\x07\x04\x11\x06\x00\x04\x06\x03\x13\x12\x01\x05\x05\x06\x09\ +\x0f\x11\x1f\x11\x02\x11\x11\x07\x03 \x0e\x07\x1e\x00?3\ +?\x129/]333\x113\x11\x12\x01\x179\x11\ +3\x11333\x11310\x01#\x15#5!5\ +\x013\x113!547\x06\x07\x07\x02\xd5}\xc0\xfe\ +x\x01\x8c\xbc}\xfe\xc3\x064$\x94\x02\xfa\xb0\xb0\x7f\ +\x02C\xfd\xcd\xb2adh6\xd9\x00\x00\x01\x00H\x02\ +7\x02\xaa\x05\xb0\x00\x1c\x00-@\x16\x0f\x03\x1b\x14\x15\ +\x03\x09\x15\x18\x04\x1e\x1d\x12\x00\x00\x06\x19\x16\x1e\x0d\x06\ +!\x00?3?3\x129/3\x11\x12\x01\x179\x11\ +33\x11310\x012\x16\x15\x14\x06#\x22&'\ +5\x16\x163254&#\x22\x07'\x13!\x15!\ +\x07\x076\x01j\x92\xae\xb4\xaeK\x8b*1\x87;\xbd\ +gX=PT#\x01\xfc\xfe\x8f\x03\x0f2\x04s\x94\ +{\x8f\x9e\x1e\x18\xa1 )\x97GM\x17+\x01\xac\x91\ +'\x90\x0b\x00\x02\x00+\x029\x02\xbc\x05\xc9\x00\x17\x00\ +#\x006@\x1c\x1b\x12!\x0b\x0b\x00\x00\x06\x12\x03%\ +$\x0b\x1e\x00\x0f\x10\x0f\x02\x0f\x0f\x15\x08\x03\x1f\x18\x15\ +!\x00?3?3\x129/]39\x11\x12\x01\x17\ +9\x113\x113\x11310\x13\x10\x1232\x17\x15\ +&#\x22\x06\x0736632\x16\x15\x14\x06#\x22\ +&\x052654&#\x22\x06\x15\x14\x16+\xe3\xe4\ +K63F\x8b\x90\x0a\x0a!l@\x81\x8f\xaf\x8e\x9e\ +\xb6\x01NARGHC_T\x03\xc7\x01\x00\x01\x02\ +\x0f\x97\x14\x88\x9404\x93\x82\x8a\xa7\xd1?PME\ +QJ5Qc\x00\x01\x009\x02J\x02\xb2\x05\xb6\x00\ +\x06\x00 @\x0f\x01\x05\x06\x00\x00\x02\x05\x03\x08\x07\x00\ + \x02\x03\x1e\x00?3?\x11\x12\x01\x179\x113\x11\ +310\x13\x01!5!\x15\x01\x9e\x01X\xfeC\x02\ +y\xfe\xb0\x02J\x02\xd5\x97{\xfd\x0f\x00\x03\x00/\x02\ +7\x02\xb6\x05\xc9\x00\x16\x00\x22\x00.\x00?@\x22\x05\ +\x11 )\x04\x08\x0e,\x03&\x14\x1d\x08\x17\x0e\x03\x08\ +\x0e\x14\x040/) \x11\x05\x04\x0b#\x00\x1f\x1a\x0b\ +!\x00?3?2\x11\x179\x11\x12\x01\x179\x113\ +\x113\x113\x113\x11\x12\x17910\x012\x16\x15\ +\x14\x07\x16\x16\x15\x14\x06#\x22&5467&&\ +546\x03\x14\x1632654&'\x06\x06\x13\ +\x22\x06\x15\x14\x16\x176654&\x01u\x83\xa0\x92\ +]S\xb4\x8d\x99\xadJTG:\xa6\x11GIJG\ +`H;>\x928=8A1?;\x05\xc9yg\ +\x83K-nGs\x8f\x87uFm,1^Dg\ +}\xfdj4CC49K\x14\x1cG\x01\xdc5,\ +)>\x1e\x17<2,5\x00\x00\x02\x00'\x029\x02\ +\xb8\x05\xc9\x00\x17\x00#\x008@\x1d!\x0b\x0b\x00\x1b\ +\x12\x00\x05\x12\x03%$\x0b\x15\x1e\x0f\x0f\x1f\x0f\x02\x0f\ +\x0f\x03\x18\x15\x1f\x08\x03!\x00?3?3\x129/\ +]3\x129\x11\x12\x01\x179\x113\x113\x1131\ +0\x01\x14\x02#\x22'5\x163267#\x06\x06\ +#\x22&54632\x16%\x22\x06\x15\x14\x163\ +2654&\x02\xb8\xe2\xe4N33E\x8a\x90\x0b\ +\x0a!l@\x81\x8f\xaf\x8e\x9e\xb6\xfe\xb2ARGH\ +C_T\x04;\xff\xfe\xfd\x0f\x97\x14\x85\x9704\x93\ +\x82\x8a\xa7\xd1?PMEQJ5Qc\x00\x16\x00\ +T\xfe\x81\x07\xc1\x05\xee\x00\x05\x00\x0b\x00\x11\x00\x17\x00\ +\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00\ +;\x00?\x00C\x00G\x00S\x00[\x00k\x00t\x00\ +|\x00\x89\x00\xde@[p`zglvvkX\ +HTN\x09\x0a$%()DE\x08\x15\x15\x16\x00\ +\x0501<=@A\x08\x0e\x0e\x0d\x03\x06\x0d\x10\x13\ +\x16\x19\x1a\x1d\x1e #-.478;HN`\ +gk\x7f\x84\x19\x8b\x8a\x82}ZQVKuOl\ +\x01ll\x5cvkt\x85\x5c}KkQ\x5cpk\ +\x01k\xb8\xff\xc0@5\x0b\x0eHkO\x5c\x01\x5c\x00\ +\x0a\x15%&)*12=>ABEF\x5ck\ +\x11\x01\x12\x13\x18\x19\x1c\x1d,-\x08\x0f\x0f\x0c\x06\x07\ + !4589\x08\x04\x04\x01\x0c\x01\x00//\x11\ +3\x12\x179\x113\x12\x179\x12\x179/]/+\ +]\x10\xc4\x10\xc4\xc4\x1133\x113\x129/q3\ +\x113\x113\x113\x11\x12\x01\x179\x113\x12\x179\ +\x113\x12\x179\x113\x113\x113\x113\x113\x11\ +310\x13\x11!\x15#\x15%5!\x11#5\x01\ +\x113\x153\x15!5353\x11!5!\x15!\ +5!\x15\x015!\x15\x01#\x113\x11#\x113\x01\ +5!\x15\x01#\x113\x015!\x1535!\x15\x01\ +#\x1135#\x113\x01#\x113\x05\x14\x06#\x22\ +&54632\x16\x05\x143254#\x22%\ +32\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06##\x13\ +32654&##\x15\x1532654#\ +\x01\x22'5\x16325\x113\x11\x14\x06T\x01/\ +\xc0\x05\xce\x010m\xf9\x00o\xc0\x05\x0e\xc3m\xfdI\ +\x01\x11\xfb\xe1\x01\x0e\xfe\xf2\x01\x0e\x04\xb7mmmm\ +\xfb\xc2\x01\x10\xfc0oo\x02\xc0\x01\x10w\x01\x11\xfa\ +\xa8oooo\x06\xfemm\xfb\x9f\x87\x7f\x7f\x87\x87\ +\x7f~\x88\xfes\x87\x87\x87\x87\x01\xe1\xacmp.,\ +=.m^\xcf{B.$*/;J1%Z\ +\x01^4\x1c+\x19V}i\x04\xbe\x010o\xc1\xc1\ +o\xfe\xd0\xc1\xf9\x02\x01/\xc2mm\xc2\xfe\xd1mm\ +mm\x06\xfeoo\xfa\xa8\x01\x0e\x02\x02\x01\x0f\xfa;\ +mm\x01\xa6\x01\x0e\x04Joooo\xfc/\x01\x10\ +y\x01\x0f\xfdh\x01\x10I\x91\x9c\x9c\x91\x92\x9b\x9a\x93\ +\xc5\xc5\xc4aCS1D\x08\x06\x0eD5QY\x01\ +b\x22 \x22\x1d\xe3\x9a+%J\xfe\xfa\x0af\x08V\ +\x01\x92\xfer_c\x00\x00\x03\x00T\xfe\xc1\x07\xaa\x06\ +\x14\x00\x03\x00\x1e\x00*\x008@\x1c\x17\x0b%\x04\x1f\ +\x04\x1e\x01\x03\x0b\x11\x1e\x05,+(\x1e\x14\x0e\x22\x1e\ +\x0e\x0e\x1e\x22\x03\x02\x00\x00//\x179///\x11\ +3\x113\x11\x12\x01\x179\x1133\x113\x1131\ +0\x09\x03\x0554676654&#\x22\x06\ +\x07\x17632\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\ +\x1632654&#\x22\x06\x03\xfe\x03\xac\xfcT\ +\xfcV\x03\xeb,AgI\xbb\xa5O\xbaGR\xa0Z\ +?>1HT;\x1bGFBIHCHE\x06\ +\x14\xfcV\xfcW\x03\xa9\xfb/2A1R~X\x87\ +\x9a8*\xb2P:/5K6DpJ;\xfe\xed\ +?HI>@IH\xff\xff\xff\x87\xfe\x14\x02\x9e\x06\ +!\x02&\x027\x00\x00\x01\x07\x01L\xfe\xb9\x00\x00\x00\ +\x08\xb3\x01\x12\x11&\x00+5\xff\xff\x00\x10\x03\xc1\x01\ +j\x05\xb6\x00\x06\x02\x07\xf7\x00\x00\x02\x00\x19\xff\xec\x05\ +=\x06)\x00+\x004\x00i@8,\x1e)\x1e\x02\ +2$\x15\x0a\x0a\x19\x07\x02\x07\x10$+\x0565,\ +*+*HY ++\x05'\x12\x0dGY\x00\x12\ +\x01\x12\x03\x12\x12\x05''/GY'\x01\x05\x1cG\ +Y\x05\x16\x00?+\x00\x18?+\x11\x12\x009\x18/\ +_^]+\x11\x12\x009\x18/3+\x11\x003\x11\ +\x12\x01\x179\x1133\x113\x113\x1133\x113\ +10\x01\x16\x15\x10\x00! \x114774&#\ +\x22\x07'632\x16\x15\x14\x07\x06\x15\x14\x163 \ +\x115'&$&5463 \x133\x15%&\ +&#\x22\x06\x15\x14\x16\x04\xb8\x04\xfe\xd0\xfe\xe7\xfe`\ +\x13\x03 \x1d1+7r}_\x5c\x0b\x0cmf\x01\ +N\x02\xe0\xfe\xc8\xa1\xcc\xb5\x01\xc2Y\x8f\xfe\x86\x19\xa3\ +oLT\xf4\x03#&<\xfe\xa2\xfe\x89\x01Q,\xa4\ +7-\x1e\x1a\x97>fS/de?Y[\x02'\ +**\x02o\xc7\x86\x9c\xae\xfd\xae\xb4\xb4\xbd\xdfLB\ +~\x8f\x00\x00\x01\x00\x00\x00\x00\x04\xc1\x05\xc3\x00\x15\x00\ +6@\x1b\x00\x11\x11\x12\x15\x14\x08\x12\x14\x03\x17\x16\x10\ +\x13\x00\x00\x12\x14\x03\x12\x12\x05\x0aKY\x05\x04\x00?\ ++\x00\x18??\x129\x1133\x11\x12\x01\x179\x11\ +3\x113\x12910\x01\x12>\x0232\x17\x15&\ +#\x22\x0e\x03\x07\x11#\x11\x01!\x02Z\x97qJ]\ +??:#\x1d):XyV&\xf0\xfe\x1f\x01\x04\ +\x03\x10\x01T\xe0W(\x15\xb6\x084\x98\xed\xc1c\xfd\ +\xdd\x02/\x03\x87\x00\x02\x00#\xff\xec\x07!\x04R\x00\ +\x14\x00'\x00X@.'\x0b%\x0d\x13\x1e\x1e\x1d\x15\ +\x05\x17\x03\x03\x05\x06\x0a\x0b\x0d\x1d\x07)(\x13\x08\x1d\ +\x1d\x00\x08\x0b\x15\x06\x08\x06GY\x08\x0f\x22\x1a\x00\x1a\ +GY\x10\x00\x16\x00?2+\x11\x003\x18?+\x11\ +\x0033\x11\x129\x18/\x119\x11\x12\x01\x179\x11\ +3\x113\x113\x129\x113\x11310\x05\x22&\ +547!57!\x15#\x16\x15\x14\x06#\x22'\ +#\x06\x01\x06\x15\x14\x1632\x1153\x15\x14\x163\ +2654'\x02s\xce\xd4b\xfe\xf0\x9e\x06`\xfe\ +Z\xd4\xce\xe4M\x08M\xfe\xbb^cn\xb4\xddZ[\ +khX\x14\xfd\xf2\xd2\xeddT\xb8\xea\xd5\xf4\xfb\xc4\ +\xc4\x03\xae\xf2\xc3\xa1\x9c\x01\x02\xa4\xa4|\x86\x98\xa3\xd9\ +\xde\xff\xff\x00\xc1\x00\x00\x06\xa2\x07u\x02&\x000\x00\ +\x00\x01\x07\x00v\x01\xae\x01T\x00\x08\xb3\x01\x1e\x05&\ +\x00+5\xff\xff\x00\xa8\x00\x00\x07\x06\x06!\x02&\x00\ +P\x00\x00\x01\x07\x00v\x01\xdd\x00\x00\x00\x08\xb3\x01-\ +\x11&\x00+5\xff\xff\x00\x00\xfd\xbe\x05J\x05\xbc\x02\ +&\x00$\x00\x00\x00\x07\x02[\x01T\x00\x00\xff\xff\x00\ +Z\xfd\xbe\x04\x04\x04f\x02&\x00D\x00\x00\x00\x07\x02\ +[\x00\xe3\x00\x00\xff\xff\xfe\xa7\xff\xec\x06\x06\x05\xcd\x00\ +&\x0023\x00\x00\x07\x02\x5c\xfe \x00\x00\x00\x02\x00\ +f\xfd\xbe\x02B\xff\x83\x00\x0b\x00\x17\x002@\x1c\x0c\ +\x00\x12\x06\x06\x00\x19\x18\x15\xb0\x03\x01_\x03\x9f\x03\x02\ +\x7f\x03\x01\x03\x0f\x0f\x09\x1f\x09\x02\x09\x00/q3\xcc\ +]q]2\x11\x12\x0199\x113\x11310\x01\ +\x14\x06#\x22&54632\x16\x074&#\x22\ +\x06\x15\x14\x16326\x02B\x87kj\x80\x80jl\ +\x86\x88<./<650:\xfe\xa2h|zh\ +h{\x7fd3773299\x00\x02\x00\x87\x04\ +h\x02\xfc\x05\xc5\x00\x07\x00\x19\x00'@\x13\x03\x02\x0f\ +\x08\x00\x02\x08\x0c\x14\x05\x1b\x1a\x17\x07\x0b\x07\xc0\x02\x03\ +\x00?\x1a\xcc\xc6\x10\xc4\x11\x12\x01\x179\x113\x113\ +10\x01673\x15\x06\x07#%467\x15\x06\ +\x06\x15\x14\x1e\x02\x15\x14\x06#\x22&\x01\xc1C\x17\xe1\ +=\x92l\xfe\xc6\x8c~BA\x22)\x2296\xfc\xdb\x86\x95\x93\x85\x86\x94\x94\x85\x02+\ +\xfe\xf1\xfe\xd0\x8c\x01\x06\xad\x01\x0d\x01.GD\x15\x83\ +\x87\x17\xb3\xb3%\x87\xa6\xbd\xc2\xc2\xbd\xbb\xc0\xc0\x00\x00\ +\x01\x00\xb4\xff\xec\x06\xd1\x06\x14\x00\x19\x00@@\x1f\x04\ +\x06\x06\x01\x18\x0b\x14\x11\x11\x0b\x1b\x1a\x04\x12@\x01\x0a\ +KY\x01\x01\x0e\x19\x12\x03\x0e\x16LY\x0e\x13\x00?\ ++\x00\x18?3\x129/+\x00\x1a\x18\x10\xce\x11\x12\ +\x0199\x113\x11332\x11310\x01\x156\ +653\x17\x0e\x02\x07\x11\x14\x00! \x005\x113\ +\x11\x10! \x11\x11\x05;NJ\xf0\x0e\x1ba\xa3w\ +\xfe\xd0\xfe\xed\xfe\xec\xfe\xd0\xf0\x01Z\x01N\x05\xb6\xc2\ +\x12\x8b\x83\x16\x8e\x9ed\x12\xfd\xa8\xfb\xfe\xe3\x01 \xfc\ +\x03\xae\xfcV\xfe\xac\x01V\x03\xa8\x00\x00\x01\x00\x9e\xff\ +\xec\x06\x04\x04\xfc\x00\x1e\x00M@&\x17\x19\x19\x01\x11\ +\x14\x11\x1e\x0b\x08\x1e\x08 \x1f\x17\x09@\x02\x05\x09\x14\ +\x1dJY\x14\x14\x00\x12\x09\x0f\x00\x15\x05\x0eFY\x05\ +\x16\x00?+\x00\x18??3\x129/+\x11\x12\x00\ +9\x1a\x18\x10\xce\x11\x12\x0199\x113\x1133\x11\ +32\x11310!'#\x06\x06#\x22&5\x11\ +3\x11\x14\x163265\x113\x156653\x17\ +\x0e\x02\x07\x11\x03\xb4!\x0e1\xb1t\xca\xc7\xedho\ +\x94\x8b\xecOJ\xf0\x0e\x1cb\xa3v\x91MX\xc8\xcb\ +\x02\xd3\xfdV\x7f\x7f\xb1\xd0\x02'w\x12\x8d\x82\x17\x91\ +\xa1c\x0e\xfc\xbe\xff\xff\xfc4\x04\xd9\xfe\x1a\x06!\x00\ +\x07\x00C\xfa\xca\x00\x00\xff\xff\xfc\xee\x04\xd9\xfe\xd4\x06\ +!\x00\x07\x00v\xfb\x84\x00\x00\xff\xff\xfb\xfd\x04\xd7\xff\ +\x0f\x05\xf6\x00\x07\x01R\xfb\x11\x00\x00\x00\x01\xfc\xf0\x04\ +\xbc\xfe\x89\x06\x9a\x00\x11\x00\x0a\xb2\x0a\x0f\x04\x00/\xcc\ +210\x01\x14\x07\x07#'6654#\x22\x07\ +5632\x16\xfe\x89\xa4\x0a\x8b\x13KIm<8\ +DI\x83\x89\x05\xd3\x93']\xa2\x0d0,I\x0e\x87\ +\x11d\x00\x00\x01\xfd\x0a\xfey\xfe\x12\xff}\x00\x0b\x00\ +\x06\xb0\x03\x00/10\x014632\x16\x15\x14\x06\ +#\x22&\xfd\x0aE@@CD?@E\xfe\xfa?\ +DE>;FE\x00\xff\xff\x00\xc1\x00\x00\x03\xfc\x07\ +s\x02&\x00(\x00\x00\x01\x07\x00C\xff\xa9\x01R\x00\ +\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\xc1\x00\x00\x05\ +\x98\x07s\x02&\x01\xb2\x00\x00\x01\x07\x00C\x00^\x01\ +R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\xff\x00f\xff\ +\xec\x049\x06!\x02&\x00H\x00\x00\x01\x06\x00C\xb1\ +\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\xff\x00\xa8\x00\ +\x00\x04\xc3\x06!\x02&\x01\xd2\x00\x00\x01\x06\x00C\xf5\ +\x00\x00\x08\xb3\x01\x18\x11&\x00+5\x00\x01\x00}\xff\ +\xec\x07\xe7\x05\xc9\x002\x00N@(\x10++(0\ +\x0a#\x16\x04\x0a\x16\x1c(\x0543\x10\x19))\x13\ +\x19\x00 \x19 LY\x07\x19\x04-&\x13&LY\ +\x0d\x13\x13\x00?3+\x11\x003\x18?3+\x11\x00\ +3\x11\x129\x18/\x119\x11\x12\x01\x179\x113\x11\ +3\x113\x12910\x01\x22\x06\x07'6632\ +\x00\x11\x10\x00!\x22&'\x06\x06# \x00\x11\x10\x00\ +32\x16\x17\x07&&#\x22\x02\x15\x10\x12327\ +\x113\x11\x1632\x12\x114\x02\x05\xd1+XDX\ +<\x9bP\xf8\x01\x16\xfe\xce\xfe\xebt\xaeMW\xabj\ +\xfe\xea\xfe\xce\x01\x15\xf7Q\x9c\x027\x015!\x15\x01\x16\x16\x17\x13#\ +\x03&&##\x11#\x11#\x22\x06\x07\x03\x01\x01!\ +\x1f\x1fp/b\x8cd\xfew\x04\xd1\xfel\x9a\xb0=\ +\x90\xf4\x81)jJ#\xef!Mf*\x81\x01\xf5\x01\ +<\xfd\x89i\x01\x5c\x92\x94S\x0e\x01\xe1\x89\x89\xfe\x1f\ +\x16\xab\xc6\xfe;\x01\xa4\x85o\xfdh\x02\x98l\x88\xfe\ +\x5c\x03h\x01\x7f\x00\x02\x00\x10\x00\x00\x04\xfe\x04R\x00\ +\x1c\x00\x1f\x00e@6\x09\x04\x1d\x15\x15\x16\x1e\x08\x1f\ +\x05\x0f\x0e\x1c\x00\x00\x05\x08\x0e\x16\x05! \x14\x18\x04\ +\x18IY\x1d\x09\x0f\x04\x1f\x04\x02\x0b\x03\x04\x04\x06\x16\ +\x0f\x00\x15\x08\x05\x1f\x06\x06\x1fHY\x06\x0f\x00?+\ +\x11\x12\x0099\x18?33\x129/_^]3\ +3+\x11\x003\x11\x12\x01\x179\x113\x113\x113\ +\x113\x113\x12932103\x13667\x01\ +5!\x15\x01\x1e\x02\x17\x13#\x03&&##\x11#\ +\x11#\x22\x06\x07\x03\x01\x13!\x10{6\x86o\xfe\xc9\ +\x04\x14\xfe\xc5KhL*}\xd7s\x22N6\x1c\xd1\ +!;J#s\x01\xa2\xee\xfe'\x01T\x98\x82\x15\x01\ +fii\xfe\x98\x0e@mr\xfe\xac\x01;`J\xfe\ +\x1b\x01\xe5Gc\xfe\xc5\x02\x96\x01\x10\x00\x02\x00\xc1\x00\ +\x00\x08\x19\x05\xb6\x00\x22\x00%\x00r@<\x0f\x1b\x03\ +\x0a\x00\x0a#\x1b\x1b\x1c$\x0e%\x0b\x15\x14\x22\x00\x09\ +\x05\x05\x06\x00\x06\x0b\x0e\x14\x1c\x06'&\x1d\x1a\x04\x09\ +\x04LY\x0f#\x09\x09\x0c\x15\x1c\x00\x03\x06\x12\x0e\x0b\ +%\x0c\x0c%LY\x07\x0c\x03\x00?3+\x11\x12\x00\ +99\x18?\x173\x129/33+\x11\x0033\ +\x11\x12\x01\x179\x113\x113\x113\x113\x113\x11\ +3\x113\x1293\x11\x129\x11310!\x136\ +7!\x11#\x113\x11!\x015!\x15\x01\x1e\x02\x17\ +\x13#\x03&&##\x11#\x11#\x22\x06\x07\x03\x01\ +\x01!\x02=\x9024\xfe}\xef\xef\x02\x8d\xfe\x88\x04\ +\xce\xfeoh\x8fc-\x90\xf0\x83-i`\x0c\xf0\x0c\ +`h.\x81\x01\xfa\x01;\xfd\x8a\x01\xc1\x9c6\xfdm\ +\x05\xb6\xfd\xaa\x01\xcd\x89\x89\xfe\x1d\x0dU\x95\x8e\xfe;\ +\x01\xa4\x90b\xfdj\x02\x96a\x91\xfe\x5c\x03f\x01\x81\ +\x00\x00\x02\x00\xa8\x00\x00\x06\xd7\x04R\x00\x02\x00%\x00\ +r@=\x0f\x1b\x03\x0a#\x0a\x00\x1b\x1b\x1c\x01\x0e\x02\ +\x0b\x15\x14\x22#\x09\x05\x05\x06\x06\x0b\x0e\x14\x1c#\x06\ +'&\x1e\x1a\x04\x09\x04GY\x0f\x00\x09\x09\x0c\x15\x1c\ +#\x03\x06\x15\x07\x0b\x0e\x03\x02\x0c\x0c\x02HY\x0c\x0f\ +\x00?+\x11\x12\x00\x179\x18?\x173\x129/3\ +3+\x11\x0033\x11\x12\x01\x179\x113\x113\x11\ +3\x113\x113\x113\x113\x1293\x11\x129\x11\ +310\x01\x13!\x03!\x11#\x113\x11!\x015\ +!\x15\x01\x1e\x02\x17\x13#\x03&&##\x11#\x11\ +#\x22\x06\x07\x03#\x136\x04`\xee\xfe'\xc7\xfe\xd1\ +\xd7\xd7\x02\x02\xfe\xd7\x04\x15\xfe\xc4KhL*}\xd7\ +s\x22N6\x1c\xd1!;J#s\xd5})\x02\x98\ +\x01\x0e\xfe7\xfe#\x04R\xfeD\x01Sii\xfe\x98\ +\x0e@mr\xfe\xac\x01;`J\xfe\x1b\x01\xe5Gc\ +\xfe\xc5\x01Tk\x00\x01\x003\xfe=\x04u\x06\xdf\x00\ +M\x00\x82@I=*1\x22@\x1aG\x00\x14\x09\x14\ +\x1e(-18@DG\x0aONJ\x17\x17\x03\x1e\ +1*.55:KY\x0f5\x1f5\x02\x09\x035\ +*@C\x1e\x1f\x1f\x1eKY\x1f\x1f\x11**%K\ +Y=*\x03\x11\x03KYO\x11\x9f\x11\x02\x11\x00/\ +]+\x00\x18?3+\x11\x12\x009\x18/+\x11\x12\ +\x009\x1a\x18\x10\xcc_^]+\x00\x18\x10\xc4\x119\ +\x11\x129\x113\x11\x12\x01\x179\x113\x113\x113\ +\x113310\x05\x14\x16327632\x17\x15\ +&&#\x22\x07\x06#\x22&5467665\ +4&##53 54&#\x22\x07'67\ +&&'53\x16\x17>\x0232\x17\x15&#\x22\ +\x06\x07\x16\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04\x05\x0e\ +\x02\x01#SM_nn=\x925\x16eNFj\ +kv\xb5\xc0\xe2\xf5\xc7\xb0\xea\xe1\xb0\xa6\x01\xb4\x95\x85\ +\xd0\xc0n\xb0\xc2\x1bD\x82\xa6K\x8eKT\x5c6B\ +-\x1a4+e3\xa9\xc0\xb7\xa7\xbb\xc8\xfe\xcd\xfe\xdd\ +am.\x7f3-\x05\x05'\xc7\x13\x1d\x05\x06\x98\x89\ +\x93\x90\x0a\x06v~uw\xc0\xe9`i{\xa2u\x1a\ +!M\x88\x1b5\x8e]I-\x0e\x85\x0cLN\x1b\xbc\ +\x87\x8a\xb9\x1b\x08\x16\xb5\x8f\xcb\xe1\x06\x02\x16*\x00\x00\ +\x01\x00\x1b\xfeT\x03\xd1\x05X\x00G\x00k@<.\ +\x117\x0b>\x08D\x18**<@2D\x0e \x03\ +\x0b\x11\x0aIH\x14,\x0d2332HY,3\ +3'D>A\x05\x00@\x09\x0cH\x00>@>9\ +HY\x08>\x10'\x1bGY'\x22\x00?+\x00\x18\ +?3+\x00\x1a\x18\x10\xdc+2\xc4\x119\x129/\ +9+\x11\x12\x009\x113\x11\x12\x01\x179\x113\x11\ +33\x113\x11310\x012\x17\x15&#\x22\x06\ +\x07\x16\x16\x15\x14\x07\x15\x16\x16\x15\x14\x04\x07\x0e\x02\x15\ +\x14\x1632772\x17\x15&&#\x22\x06#\x22\ +&5\x10%$54&##532654\ +#\x22\x07'67&'53\x16\x17>\x02\x039\ +@-\x1d/-]&|\x88\xd1\x83q\xfe\xf2\xf6T\ +c-H\x5cUf\x97\x84 \x13T7E\xc5w\xa1\ +\xa8\x01\xa3\x01+\x9c\xa1\x85u\xa1\x98\xf0\xa0\xa7L\x86\ +vFu\xa0N\x85HW_\x05X\x0e\x85\x0cF9\ +\x1e\x8ed\xbb9\x08%\x82d\xa0\xac\x01\x01\x15'(\ +/-\x05\x05)\xba\x13\x18\x0a\x8a\x84\x01\x1f\x04\x02\xa0\ +SL\xb1GJ\x87H\xaf6\x0fU|\x1b7\x8aY\ +M+\x00\xff\xff\x00m\x00\x00\x06D\x05\xb6\x02\x06\x01\ +u\x00\x00\xff\xff\x00\x9a\xfe\x14\x05\xe5\x06\x14\x02\x06\x01\ +\x95\x00\x00\x00\x03\x00y\xff\xec\x05\xd3\x05\xcd\x00\x0b\x00\ +\x12\x00\x19\x00?@ \x17\x0f\x0f\x00\x16\x10\x10\x06\x06\ +\x00\x1b\x1a\x16\x10LY\x16\x16\x03\x09\x09\x13LY\x09\ +\x04\x03\x0cLY\x03\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x0199\x113\x113\x113\ +\x11310\x01\x10\x00! \x00\x11\x10\x00! \x00\ +\x01267!\x16\x16\x13\x22\x06\x07!&&\x05\xd3\ +\xfe\x9b\xfe\xb9\xfe\xb5\xfe\x9d\x01e\x01K\x01F\x01d\ +\xfdT\xc3\xda\x11\xfc\xa2\x0f\xdd\xc6\xbd\xdc\x17\x03X\x15\ +\xd6\x02\xdd\xfe\x9b\xfet\x01\x89\x01j\x01j\x01\x84\xfe\ +v\xfcu\xe7\xe6\xe3\xea\x04H\xd8\xd8\xd5\xdb\x00\x03\x00\ +f\xff\xec\x04}\x04f\x00\x0c\x00\x13\x00\x1a\x00?@\ + \x18\x10\x10\x00\x17\x11\x11\x07\x07\x00\x1c\x1b\x17\x11H\ +Y\x17\x17\x03\x0a\x0a\x14FY\x0a\x10\x03\x0dFY\x03\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x0199\x113\x113\x113\x11310\x01\x10\ +\x00#\x22&\x025\x10\x0032\x00\x01267!\ +\x16\x16\x13\x22\x06\x07!&&\x04}\xfe\xea\xf8\x9b\xee\ +\x80\x01\x14\xfb\xf0\x01\x18\xfd\xf6\x83\x85\x0c\xfd\xd3\x0c\x88\ +\x83\x81\x86\x0e\x02+\x0f\x87\x02+\xfe\xf1\xfe\xd0\x8c\x01\ +\x06\xad\x01\x0d\x01.\xfe\xcb\xfd{\x97\x98\x98\x97\x02\xfa\ +\x8f\x8c\x8d\x8e\x00\x00\x01\x00\x00\x00\x00\x05w\x05\xc3\x00\ +\x15\x004@\x1a\x14\x0d\x03\x05\x04\x0a\x07\x06\x03\x06\x0a\ +\x03\x17\x16\x0a\x05\x06\x03\x05\x12\x11\x00LY\x11\x04\x00\ +?+\x00\x18??\x129\x11\x12\x01\x179\x113\x11\ +33\x113210\x01\x22\x06\x07\x01!\x013\x01\ +\x16\x1767\x13>\x0232\x17\x15&\x05\x106H\ +.\xfe\xa8\xfe\xf4\xfe\x00\xf6\x019:\x1c\x18>\xa6<\ +XsUIQ5\x04\xfc^\x90\xfb\xf2\x05\xb6\xfce\ +\xba\x88\x87\xc7\x02\x06\xbe\x95C\x1d\xc1\x17\x00\x00\x01\x00\ +\x00\x00\x00\x04\x87\x04\x5c\x00\x17\x002@\x19\x10\x17\x16\ +\x05\x09\x15\x01\x00\x00\x05\x15\x03\x19\x18\x00\x0f\x0d\x12G\ +Y\x0d\x10\x04\x17\x15\x00?3?+\x00\x18?\x11\x12\ +\x01\x179\x113\x113\x1133210\x113\x13\ +\x16\x173667\x13>\x0232\x17\x15&#\x22\ +\x06\x07\x01!\xf6\xd7O\x09\x06\x082\x18l,Je\ +SA/!+.3\x15\xfe\xeb\xfe\xf0\x04R\xfd\x95\ +\xe7J5\xb8I\x01G\x84r3\x14\xb5\x0dHA\xfc\ +\xe9\xff\xff\x00\x00\x00\x00\x05w\x07s\x02&\x02\x80\x00\ +\x00\x01\x07\x03v\x04\xfe\x01R\x00\x0a\xb4\x02\x01)\x05\ +&\x00+55\xff\xff\x00\x00\x00\x00\x04\x87\x06!\x02\ +&\x02\x81\x00\x00\x01\x07\x03v\x04\x98\x00\x00\x00\x0a\xb4\ +\x02\x01+\x11&\x00+55\x00\x03\x00y\xfe\x14\x0a\ +\x17\x05\xcd\x00\x0b\x00\x17\x00,\x00R@,,\x1d\x1d\ +\x18 !\x19\x18\x12\x00\x0c\x06\x00\x06\x18!'\x05.\ +-\x1c,\x15 \x18\x0f\x09\x15LY\x09\x04\x03\x0fL\ +Y\x03\x13$)KY$\x1b\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?3?3\x11\x12\x01\x179\x11\ +3\x113\x113\x113\x129\x11310\x01\x10\x00\ +! \x00\x11\x10\x00! \x00\x01\x10\x1232\x12\x11\ +\x10\x02#\x22\x02%!\x13\x16\x17367\x133\x01\ +\x02!\x22'5\x163277\x05u\xfe\xb6\xfe\xcd\ +\xfe\xc8\xfe\xb9\x01H\x019\x014\x01G\xfb\xfe\xc3\xc2\ +\xc5\xbe\xbc\xc5\xc5\xc2\x04\x5c\x01\x00\xe31\x13\x08\x0e:\ +\xd5\xfc\xfe(\x80\xfe\xd2MJ5D\xaaE)\x02\xdd\ +\xfe\x95\xfez\x01\x82\x01q\x01p\x01~\xfe{\xfe\x95\ +\xfe\xea\xfe\xf1\x01\x0e\x01\x17\x01\x13\x01\x10\xfe\xf0b\xfd\ +\x8b\x7f}S\xab\x02s\xfb\x1b\xfe\xa7\x11\xba\x0c\xc5h\ +\x00\x00\x03\x00f\xfe\x14\x08\xd1\x04f\x00\x0c\x00\x15\x00\ +*\x00T@-* \x1b\x1b\x16\x1e\x1f\x17\x16\x11\x00\ +\x0d\x07\x00\x07\x16\x1f%\x05,+\x1a*\x15\x1e\x16\x0f\ +\x0a\x13FY\x0a\x10\x03\x0fFY\x03\x16\x22'FY\ +\x22\x1b\x00?+\x00\x18?+\x00\x18?+\x00\x18?\ +3?3\x11\x12\x01\x179\x113\x113\x113\x113\ +\x129\x113310\x01\x10\x00#\x22&\x025\x10\ +\x0032\x00\x01\x10! \x11\x10!\x22\x06\x01!\x13\ +\x16\x17367\x133\x01\x02!\x22'5\x1632\ +77\x04}\xfe\xea\xf8\x9b\xee\x80\x01\x14\xfb\xf0\x01\x18\ +\xfc\xdb\x01\x1b\x01\x18\xfe\xe6\x94\x85\x031\x01\x00\xe16\ +\x0e\x06\x126\xd9\xfc\xfe)\x81\xfe\xd3KO7D\xab\ +E'\x02+\xfe\xf1\xfe\xd0\x8c\x01\x06\xad\x01\x0d\x01.\ +\xfe\xcb\xfe\xfa\xfe\x81\x01\x7f\x01{\xc4\x01p\xfd\x8d\x9b\ +a]\xa1\x02q\xfb\x1b\xfe\xa7\x11\xba\x0c\xc5h\x00\x00\ +\x02\x00y\xff\x85\x06%\x06/\x00\x15\x00*\x00O@\ +*\x03\x1e$\x03\x13\x07\x19(\x03\x0d!\x00\x16\x0a\x00\ +\x0a\x0d\x13\x04,+\x1c\x1e\x19\x07\x19LY\x03\x05\x07\ +$&(\x0d(LY\x13\x10\x0d\x04\x00?33+\ +\x11\x0033\x18/33+\x11\x0033\x11\x12\x01\ +\x179\x113\x113\x11\x173\x11\x17310\x01\x10\ +\x00\x05\x06#\x22'$\x00\x11\x10\x00%6632\ +\x16\x17\x04\x00\x01\x14\x12\x176632\x176\x125\ +4\x02'\x06#\x22'\x06\x02\x06%\xfe\xcf\xfe\xef\x1d\ +vx\x1a\xfe\xe9\xfe\xd2\x01/\x01\x19\x0dJ86J\ +\x0f\x01\x15\x011\xfbN\xa8\xa8\x14F3g$\xa9\xa7\ +\xa7\xa7\x22ki&\xa8\xa6\x02\xdd\xfe\xc9\xfey)q\ +q&\x01\x86\x01=\x01<\x01\x7f'>00>'\ +\xfe{\xfe\xc8\xd9\xfe\xeb(-#P(\x01\x15\xd9\xd6\ +\x01\x14)RP)\xfe\xee\x00\x00\x02\x00f\xff\x91\x04\ +\xf0\x04\xb4\x00\x15\x00)\x00P@+\x03\x1e\x22\x03\x13\ +\x07\x18(\x03\x0d \x00\x16\x0a\x00\x0a\x0d\x13\x04+*\ +\x1e\x1b\x18\x07\x18GY\x03\x05\x07\x15\x22%(\x0d(\ +FY\x10\x13\x0d\x0f\x00?33+\x11\x0033\x18\ +?33+\x11\x0033\x11\x12\x01\x179\x113\x11\ +3\x11\x173\x11\x17310\x01\x14\x02\x07\x06#\x22\ +'&\x0254\x1276632\x16\x17\x16\x12\x05\ +\x10\x176632\x16\x176\x11\x10'\x06\x06#\x22\ +&'\x06\x04\xf0\xe9\xd8\x12qt\x11\xd3\xee\xee\xd7\x09\ +B62B\x0b\xd5\xf0\xfch\xd3\x0f:85;\x11\ +\xd1\xcf\x0e=8;<\x0e\xcf\x02+\xeb\xfe\xdf%i\ +k$\x01%\xe6\xed\x01 \x223''5$\xfe\xda\ +\xe3\xfe\xc4;(&(&<\x01;\x013>-+\ ++->\x00\x03\x00y\xff\xec\x07\xdd\x08d\x00.\x00\ +B\x00S\x00p@?9:JC,\x09 \x15\x04\ +\x09\x0f\x15\x1a&0:CGO\x0bUTB1Q\ +1\x00:\x10:\x02\x09::F6=G\x00F\x01\ +\x1a\x03F\x18\x00\x1d\x18\x1dLY\x06\x18\x04)#\x12\ +#LY\x0c\x12\x13\x00?3+\x11\x003\x18?3\ ++\x11\x003\x18\x10\xc6_^]2\xc42\x119/\ +^]33/3\x11\x12\x01\x179\x113\x113\x11\ +3\x11310\x01\x22\x06\x07'632\x00\x11\x10\ +\x00!\x22&'\x06\x06# \x00\x11\x10\x0032\x17\ +\x07&#\x22\x02\x15\x10\x123267\x16\x1632\ +\x12\x114\x02\x03\x15#\x22.\x02#\x22\x06\x07#5\ +432\x1e\x023\x01\x14\x06\x0756654.\ +\x025432\x16\x05\xc9\x00P\x00l@\ +=\x18#\x0d\x03F?45\x03\x08\x12\x1e#(+\ +5?CK\x0bRQ*+N+551\x0f9\ +\x01\x11\x039@\x09\x0cH9CB\x06\x1a\x0b\x06\x0b\ +GY \x06\x10\x15\x10\x00\x10FY&\x00\x16\x00?\ +2+\x11\x003\x18?3+\x11\x003\x18\x10\xd62\ +\xc4+_^]29/33/3\x11\x12\x01\x17\ +9\x113\x113\x113\x11310\x05\x22\x00\x11\x10\ +\x1232\x17\x07&#\x22\x11\x14\x16327\x16\x16\ +3265\x10#\x22\x06\x07'632\x12\x11\x10\ +\x02#\x22'\x06\x01\x15#\x22.\x02#\x22\x06\x07#\ +54632\x1e\x023\x01\x14\x06\x075665\ +4.\x0254632\x16\x02Z\xf1\xfe\xfd\xde\xd9\ +\x8akGXJ\xcf\x84\x84\x8du3~Q\x83\x86\xcd\ +3O\x22Hp\x88\xd8\xdc\xff\xf2\xa1ll\x02\x04\x10\ +c\x93s[*3+\x08\x9ay\x83:qw\x84N\ +\xfe\xf5\x97y;:!)!A8BK\x14\x01'\ +\x01\x18\x01\x18\x01#9\xae/\xfe\x7f\xbd\xc6f+?\ +\xc8\xbf\x01\x81\x1e\x11\xae9\xfe\xdd\xfe\xe8\xfe\xe8\xfe\xd9\ +XX\x06\xc8\x9d#*#7<'vz%-%\ +\xfe\xee[}\x12N\x137\x1a\x13\x12\x10\x1a\x1c-/\ +N\x00\x02\x00j\xff\xec\x07\xdd\x07#\x000\x00>\x00\ +g@9\x0f(('.\x09!\x15\x04\x09\x15\x1a'\ +147;>\x0a@?6::>@\x09\x0dH\ +>84<\x18@''\x12\x18\x00\x1e\x18\x1eLY\ +\x06\x18\x04+$\x12$LY\x0c\x12\x13\x00?3+\ +\x11\x003\x18?3+\x11\x003\x11\x129\x18/\x1a\ +\x10\xde22\xcd+2\x113\x11\x12\x01\x179\x113\ +\x113\x113\x12910\x01\x22\x06\x07'632\ +\x00\x11\x10\x00!\x22&'\x06\x06# \x00\x11\x10\x00\ +32\x17\x07&&#\x22\x02\x15\x10\x12327\x11\ +3\x11\x1632\x12\x114\x02\x03\x15\x07#'#\x07\ +#'#\x07#'5\x05\xc9+XDN\x85\x98\xf8\ +\x01\x14\xfe\xcd\xfe\xe9s\xaeMX\xb0i\xfe\xe9\xfe\xcd\ +\x01\x13\xfa\x97\x88PEU+\x88\x9b\xc6\xb7mb\xf0\ +]x\xb7\xc6\x9a\x91P-2\xaa1+1\xac/-\ +P\x05\x00\x1e,\xb4_\xfe\x8a\xfe\xab\xfe\x8b\xfec?\ +=B:\x01\x9c\x01v\x01S\x01x_\xb4-\x1d\xfe\ +\xf5\xf9\xfe\xee\xfe\xd2L\x01\xa8\xfe\x5cP\x01-\x01\x13\ +\xf6\x01\x0e\x02#<\xaagggg\xaa<\x00\x02\x00\ +\x02\x00\x00\x06q\x05\xa4\x00\x1c\x00*\x00^@5\x09\ +\x1a\x18\x17\x0e\x1c\x00\x06\x12\x13\x0b\x0a\x02\x01\x01\x06\x0a\ +\x0e\x13\x1a\x1d #'*\x0b,+\x22&&*@\ +\x09\x0dH*$ (\x09\x1a\x1a\x12\x0a\x01\x0f\x05\x0e\ +\x18\x03\x00\x15\x00?\x172?339\x113\xde2\ +2\xcd+2\x113\x11\x12\x01\x179\x113\x113\x11\ +3\x1133\x1133\x11310!\x013\x13\x16\ +\x173667\x033\x13\x16\x1736\x12\x113\x14\ +\x02\x02\x07#\x03'\x07\x03\x01\x15\x07#'#\x07#\ +'#\x07#'5\x01\x8f\xfes\xf6\xdd*\x15\x09\x16\ +]`\x9c\xf8\xcbQ\x0b\x08\x8d{\xeeT\xb8\x96\xeap\ +#-\x87\x02CR+1\xac1+1\xaa1+P\ +\x04R\xfdf}\x83L\xdd\xcd\x01\xa4\xfd\xa4\xfb.\xa7\ +\x01\x9a\x01D\xfd\xfe\x90\xfe\xb6\x9b\x017mo\xfe\xcb\ +\x05\xa4:\xacgggg\xac:\x00\x00\x01\x00y\xfe\ +\x14\x05\x02\x05\xcb\x00\x16\x00/@\x18\x16\x15\x0f\x03\x03\ +\x09\x15\x03\x18\x17\x16\x1b\x07\x0cLY\x07\x04\x00\x12L\ +Y\x00\x13\x00?+\x00\x18?+\x00\x18?\x11\x12\x01\ +\x179\x113\x11310\x05 \x00\x114\x12$3\ +2\x17\x07&#\x22\x02\x11\x10\x12327\x11#\x03\ +L\xfe\xa0\xfe\x8d\xb0\x01J\xdf\xec\xc4V\xc4\x9c\xdd\xfa\ +\xed\xe8\x7fr\xef\x14\x01\x81\x01n\xe1\x01W\xb8^\xc7\ +X\xfe\xdb\xff\x00\xfe\xf2\xfe\xef\x1f\xfd;\x00\x00\x01\x00\ +f\xfe\x14\x03\xc9\x04f\x00\x17\x00/@\x18\x15\x16\x0e\ +\x03\x03\x08\x16\x03\x19\x18\x16\x1b\x06\x0bFY\x06\x10\x17\ +\x11FY\x17\x16\x00?+\x00\x18?+\x00\x18?\x11\ +\x12\x01\x179\x113\x11310\x05&\x00\x11\x10\x00\ +!2\x17\x07&#\x22\x06\x15\x14\x163267\x11\ +#\x11\x02f\xf8\xfe\xf8\x01\x0f\x01\x10\xb1\x93F\x9ch\ +\x99\x8e\x9a\x8dKf.\xeb\x12\x08\x01\x1d\x01\x10\x01\x1d\ +\x01&C\xbb:\xb9\xc4\xc0\xb7\x18\x11\xfd=\x01\xda\x00\ +\x01\x00h\xff\xfc\x04w\x05\x08\x00\x13\x00D@*\x00\ +\x0d\x10\x11\x04\x0c\x01\x03\x06\x07\x0a\x04\x0b\x02\x0b\x0c\x01\ +\x02\x02\x04\x08\x0c\x0e\x12\x06\x15\x14\x13\x00\x03\x11\x06\x0f\ +\x05\x10\x07\x0d\x0a\x09\x0c\x0b\x01\x00/\xcd\x179\x11\x12\ +\x01\x179\x113\x113\x11\x12\x179\x11\x12\x1791\ +0\x01\x03'\x13%7\x05\x13%7\x05\x13\x17\x03\x05\ +\x07%\x03\x05\x07\x02\x02\xb4}\xb4\xfe\xe3D\x01!\xc9\ +\xfe\xe1E\x01\x1f\xb8{\xb8\x01!H\xfe\xe3\xca\x01\x1e\ +E\x015\xfe\xc7F\x01=\xa6w\xa6\x01^\xa6y\xa6\ +\x01;G\xfe\xc2\xa4w\xa4\xfe\xa2\xa6w\x00\x00\x01\x00\ +\xbe\x04\x85\x03\xb8\x05\xc1\x00\x0f\x00\x1e@\x0c\x08\x0c\x00\ +\x04\x0c\x04\x11\x10\x02\x0a\x00\x07\x00/332\x11\x12\ +\x0199\x113\x11310\x01\x06#\x22546\ +3!632\x15\x14\x06#\x01\x89\x0dYe/8\ +\x01\xc7\x0b[f08\x04\xe3^s82_m8\ +9\x00\x01\x00\xf6\x04\xdd\x03\xf4\x05\xf6\x00\x14\x00&@\ +\x12\x0a\x09\x13\x09\x16\x15\x14\x13\x13\x0d\x8f\x05\x9f\x05\x02\ +\x05\x80\x0a\x00/\x1a\xcc]23/3\x11\x12\x019\ +9\x11310\x012>\x0232\x16\x15\x15#5\ +4#\x22\x0e\x02##5\x01\x02N\x84wp;\x82\ +|\x9ah*\x5cr\x93a\x10\x05\x7f%-%xx\ +)\x1bX#)#\x9e\x00\x01\x01\xd5\x04\xcd\x02\xe7\x06\ +F\x00\x11\x00\x1a@\x0b\x0b\x00\x00\x06\x0e\x03\x13\x12\x03\ +\xc0\x0f\x00/\x1a\xcc\x11\x12\x01\x179\x11310\x01\ +4632\x16\x15\x14\x07\x06\x06\x15\x14\x16\x17\x15&\ +&\x01\xd5MB9@6\x1b\x1b:<|\x96\x05\xb6\ +AO0-*\x13\x0a\x14\x0f\x1a7\x11P\x13}\x00\ +\x01\x01\xd7\x04\xcd\x02\xe7\x06F\x00\x11\x00\x1a@\x0b\x07\ +\x00\x00\x04\x0c\x03\x13\x12\x0f\xc0\x03\x00/\x1a\xcc\x11\x12\ +\x01\x179\x11310\x01\x14\x06\x0756654\ +.\x0254632\x16\x02\xe7\x94|;:!)\ +!@9BK\x05\xb2V|\x13P\x117\x1a\x13\x11\ +\x11\x1a\x1b-0O\x00\x00\x08\x00)\xfe\xc1\x07\xc1\x05\ +\x91\x00\x0c\x00\x1a\x00(\x006\x00D\x00R\x00_\x00\ +m\x00\xe4@8\x00\x0c\x06\x077D=>S_Y\ +Z\x1b(!\x22\x0d\x1a\x13\x14)6/0`mf\ +gERKL\x07\x0c\x14\x1a\x22(06>DL\ +RZ_gm\x10on)\x22\x1b\x030\xb8\xff\xc0\ +@\x0f\x09\x0fH03\x1e,,%3mZS\x03\ +f\xb8\xff\xc0@\x0f\x09\x0fHfjVcc\x5cj\ +E>7\x03L\xb8\xff\xc0@\x1d\x09\x0fHLO:\ +HHAO3jOOj3\x03\x09\x10\x17@\x09\ +\x0fH\x17\x0d\x14\x00\x07\xb8\xff\xc0\xb5\x09\x0fH\x07\x03\ +\x09\x00/3\xcd+2/3\xcd+2\x11\x179/\ +//\x1133\x113\x10\xcd+\x172\x1133\x11\ +3\x10\xcc+\x172\x1133\x113\x10\xcd+\x172\ +\x11\x12\x01\x179\x113\x113\x113\x113\x113\x11\ +3\x113\x113\x113\x113\x113\x113\x113\x11\ +3\x113\x11310\x01&&#\x22\x06\x07#6\ +32\x16\x17\x03&&#\x22\x06\x07#6632\ +\x16\x17\x01&&#\x22\x06\x07#6632\x16\x17\ +!&&#\x22\x06\x07#6632\x16\x17\x01&\ +&#\x22\x06\x07#6632\x16\x17!&&#\ +\x22\x06\x07#6632\x16\x17\x01&&#\x22\x06\ +\x07#632\x16\x17!&&#\x22\x06\x07#6\ +632\x16\x17\x04o\x05(+/2\x80\xbf\x10\x01\x10\x16\xb0\x18\ +\x01\x18\x1e@# / \x01:7\x80+2\x16\x1e\ + 77 \x1e\x162+\x06\x0c\x04\x0c\x00//\x12\ +\x179//////\x1a\x10\xcd]\x10\xcd\x1a\x10\ +\xcd]\x10\xcd]\x1a\x10\xcd\x10\xcd\x11\x12\x01\x1791\ +0\x05\x06\x06\x07#673\x036673\x06\x07\ +#\x01\x16\x16\x17\x15&'5\x05&&'5\x16\x17\ +\x15\x01\x17\x06\x07'76\x13\x07&'7\x17\x16\x16\ +\x05'67\x17\x07\x06\x037\x16\x17\x07'&&\x04\ +B\x11F$a5\x11\x8b\xd1\x13I\x1fa4\x12\x8b\ +\x02\xbcG\xc8A\xdd\x81\xfbZB\xbfO\xdd\x81\x04\xee\ +C\xea?b\x04~\xb1C\x907`\x13#W\xfa\xec\ +C\xe1Ga\x04\x83\xaaC\x9e)`\x13\x1fZ1B\ +\xbfO\xdd\x81\x04\xa6G\xc8A\xdc\x82\xfe!\x13I\x1f\ +a5\x11\x8b\xd1\x11F$a5\x11\x8b\x02\xddD\x98\ +.`\x12N\xfb\x19D\xdeKb\x04:\xbc;D\x92\ +4`\x12N\x04\xe7D\xf36b\x042\xc1\x00\x02\x00\ +\xc1\xfem\x06\x9a\x07w\x00\x19\x00'\x00e@6'\ +\x1a! \x0c\x0b\x0d\x0b\x0a\x07\x0e\x16\x03\x09\x18\x04\x01\ +\x01\x19\x09\x0a\x19\x1a \x05)(\x17\x04\x0e\x00'\x0f\ + \x01\x09\x03 @$\x1d\x07\x00\x03\x19\x12\x0c#\x0e\ +\x09LY\x0e\x12\x00?+\x00\x18???3\xd62\ +\x1a\xcd_^]2\x11\x1299\x11\x12\x01\x179\x11\ +3\x1133\x11\x173\x1133\x113\x113\x113\ +10\x133\x11\x14\x033\x12\x01!\x11!\x03!\x13\ +#\x114>\x047#\x01!\x01\x06\x06#\x22&'\ +3\x16\x163267\xc1\xdb\x0f\x09\xc7\x02$\x01\x15\ +\x01\x04\xa2\xfe\xf1\xad\xda\x03\x03\x05\x04\x03\x01\x08\xfd\x10\ +\xfe\xea\x04\x18\x12\xd3\xcd\xd3\xc6\x0d\xd7\x07Xtge\ +\x09\x05\xb6\xfd\x06Z\xfe\xc5\x01;\x03T\xfb\x1b\xfd\x9c\ +\x01\x93\x02\xf2\x1dU]\x5cJ.\x01\xfbj\x07w\xb0\ +\x9c\x97\xb5fU\x5c_\x00\x02\x00\xa8\xfe{\x05\xb0\x06\ +%\x00\x12\x00 \x00g@6\x0a\x09\x09\x0b\x08\x1d\x1e\ +\x17\x16\x0f\x05\x0c\x0c\x07\x10\x04\x00\x00\x11\x07\x08\x11\x16\ +\x1e\x05\x22!\x0f\x04\x0c\x12\x1d\x0f\x16\x01\x09\x03\x16\x1a\ +\x13@\x05\x12\x0f\x11\x15\x0a\x22\x0c\x07GY\x0c\x15\x00\ +?+\x00\x18???3\x1a\xde2\xcd_^]2\ +\x11\x1299\x11\x12\x01\x179\x113\x1133\x113\ +\x1133\x113\x113\x1133\x11310\x01\x11\ +\x14\x06\x07\x01!\x113\x03#\x13#\x1147\x01!\ +\x11%\x22&'3\x16\x1632673\x06\x06\x01\ +\x89\x01\x0f\x02+\x01\x1f\xed\x89\xe8\x84\xe2\x0f\xfd\xd5\xfe\ +\xe3\x02\x12\xd4\xc4\x0b\xd5\x07Xvcf\x09\xda\x10\xd4\ +\x04R\xfd\xd9\x11*\xf8\x03Z\xfcd\xfd\xc5\x01\x85\x02\ +/h\xc3\xfc\xa6\x04R\x87\x99\xb3fU[`\xad\x9f\ +\x00\x00\x02\x00/\x00\x00\x04\x9e\x05\xb6\x00\x12\x00\x1b\x00\ +O@*\x17\x08\x00\x03\x10\x03\x13\x13\x0c\x02\x08\x0c\x0e\ +\x04\x1d\x1c\x03\x0e\x0f\x0eLY\x00\x0f\x0f\x04\x11\x04\x1b\ +LY\x04\x04\x0c\x11\x03\x0c\x13LY\x0c\x12\x00?+\ +\x00\x18?\x129/+\x11\x12\x009\x18/3+\x11\ +\x003\x11\x12\x01\x179\x113\x12\x179\x11310\ +\x01!\x15!\x153 \x04\x15\x14\x04!!\x11#5\ +353\x1132654&##\x01\xb0\x01@\ +\xfe\xc0\x9e\x01\x22\x01.\xfe\xdc\xfe\xe4\xfec\x92\x92\xef\ +\xa2\xa7\xaf\xa6\xbe\x94\x05\x0c\xc8\xe0\xda\xd2\xda\xde\x04D\ +\xc8\xaa\xfb\x11s~um\x00\x00\x02\x00\x0c\x00\x00\x04\ +w\x06\x14\x00\x12\x00\x1a\x00W@/\x13\x0c\x01\x04\x08\ +\x03\x18\x18\x10\x0c\x10\x00\x05\x04\x1c\x1b\x07\x12\x00\x12I\ +Y\x04\x00\x00\x08\x02\x08\x17HY\x0f\x08\x01\x0b\x03\x08\ +\x08\x10\x02\x00\x10\x18HY\x10\x15\x00?+\x00\x18?\ +\x129/_^]+\x11\x12\x009\x18/3+\x11\ +\x003\x11\x12\x01\x179\x113\x12\x179\x11310\ +\x13353\x15!\x15!\x11!2\x16\x15\x14\x06#\ +!\x11#\x014&##\x11!2\x0c\x9c\xeb\x01P\ +\xfe\xb0\x01\x0b\xf1\xe8\xf0\xe5\xfe\x06\x9c\x03\x7f\x7f{\xfe\ +\x01\x03\xf5\x05)\xeb\xeb\xa4\xfe\x13\xa0\xa0\xab\xad\x04\x85\ +\xfc\xcdSB\xfe\xc7\x00\x00\x02\x00\xc1\x00\x00\x04\x91\x05\ +\xb6\x00\x0f\x00\x1c\x00]@2\x03\x05\x06\x13\x15\x16\x06\ +\x04\x14\x18\x00\x10\x0a\x0a\x0b\x00\x04\x0b\x14\x04\x1e\x1d\x15\ +\x10\x0c\x05\x0b\x03\x06\x0c\x09\x16\x13\x1c\x10\x10\x09LY\ +\x10\x10\x0c\x0b\x12\x0c\x1cLY\x0c\x03\x00?+\x00\x18\ +?\x129/+\x11\x12\x0099\x11\x1299\x129\ +\x11\x129\x11\x12\x01\x179\x113\x113\x113\x11\x12\ +\x17910\x01\x14\x06\x07\x17\x07'\x06##\x11#\ +\x11! \x04\x01327'7\x17654&#\ +#\x04\x91jdh}\x85`{\x9e\xef\x01\xae\x01\x0f\ +\x01\x13\xfd\x1f\x8f72R\x83oT\x9d\xa5\xaa\x03\xfc\ +\x82\xc6;\x8dc\xb2\x18\xfd\xdd\x05\xb6\xe1\xfe\x17\x06n\ +a\x92A\x84\x7f{\x00\x00\x02\x00\xa8\xfe\x14\x04\x93\x04\ +f\x00\x16\x00'\x00a@8%\x10\x12\x14\x15 \x22\ +#\x06\x13!\x03\x0b\x1b\x03\x06\x06\x07\x07\x10\x13!\x04\ +)( #\x22\x03\x1e\x17\x14\x07\x0b\x03\x12\x15\x04\x00\ +\x0d\x08\x0f\x07\x1b\x0d\x17FY\x0d\x10\x00\x1eFY\x00\ +\x16\x00?+\x00\x18?+\x00\x18??\x11\x12\x179\ +\x119\x11\x12\x179\x11\x12\x01\x179\x113\x11\x173\ +\x11\x12\x179\x11310\x05\x22'#\x17\x17\x11#\ +\x113\x173632\x12\x11\x10\x07\x17\x07'\x06\x03\ +\x22\x06\x07\x15\x14\x16327'7\x17654&\ +\x02\xd9\xd2t\x0e\x07\x07\xeb\xbe#\x0dn\xd9\xcf\xe7\xa3\ +h\x81w;\x85\x8a\x7f\x04\x80\x91'\x16n\x89h>\ +}\x14\x97Dh\xfe=\x06>\x94\xa8\xfe\xd4\xfe\xf1\xfe\ +\xbd\x96\x8be\x9e\x14\x03\xba\xa0\xb8#\xca\xb5\x08\x8ef\ +\x87Y\xb3\xbe\xbb\x00\x01\x00/\x00\x00\x04+\x05\xb6\x00\ +\x0d\x00:@\x1e\x09\x00\x04\x04\x05\x02\x05\x07\x0c\x04\x0f\ +\x0e\x03\x07\x08\x07LY\x00\x08\x08\x0a\x05\x12\x0a\x0dL\ +Y\x0a\x03\x00?+\x00\x18?\x129/3+\x11\x00\ +3\x11\x12\x01\x179\x113\x129910\x01!\x15\ +!\x11#\x11#53\x11!\x15!\x01\xb0\x01\x9c\xfe\ +d\xef\x92\x92\x03j\xfd\x85\x037\xc8\xfd\x91\x02o\xc8\ +\x02\x7f\xcd\x00\x01\x00\x0a\x00\x00\x03\x7f\x04R\x00\x0d\x00\ +:@\x1e\x0b\x02\x06\x06\x07\x00\x04\x07\x09\x04\x0f\x0e\x05\ +\x09\x0a\x09GY\x02\x0a\x0a\x0c\x07\x15\x0c\x01FY\x0c\ +\x0f\x00?+\x00\x18?\x129/3+\x11\x003\x11\ +\x12\x01\x179\x113\x129910\x01!\x11!\x15\ +!\x11#\x11#53\x11!\x03\x7f\xfe\x0a\x01T\xfe\ +\xac\xeb\x94\x94\x02\xe1\x03\x91\xfe\xe8\xb6\xfe=\x01\xc3\xb6\ +\x01\xd9\x00\x00\x01\x00\xc1\xfe\x00\x05)\x05\xb6\x00\x1e\x00\ +I@(\x1c\x0f\x09\x03\x03\x04\x04\x07\x0f\x17\x04 \x1f\ +\x0b\x00LY\x0f\x0b\x01\x0b\x03\x0b\x0b\x04\x05\x13\x19L\ +Y\x13\x1c\x04\x12\x05\x08LY\x05\x03\x00?+\x00\x18\ +??+\x11\x12\x009\x18/_^]+\x11\x12\x01\ +\x179\x113\x113\x11310\x01\x22\x07\x11#\x11\ +!\x15!\x11632\x04\x12\x15\x14\x02\x06#\x22&\ +'5\x1632654&\x02N>`\xef\x03p\ +\xfd\x7fj\x80\xc8\x01(\x9f\x84\xf8\xa3f\x82E{\x89\ +\xa4\xb2\xf9\x02T\x0c\xfd\xb8\x05\xb6\xcd\xfe6\x0c\x9d\xfe\ +\xd2\xcf\xca\xfe\xd8\x9f\x15\x1a\xd51\xe5\xd9\xd9\xea\x00\x00\ +\x01\x00\xa8\xfe\x0a\x04B\x04R\x00\x1b\x00?@\x22\x08\ +\x19\x14\x0e\x0e\x0f\x03\x0f\x12\x19\x04\x1d\x1c\x16\x0bFY\ +\x16\x16\x10\x0f\x15\x10\x13FY\x10\x0f\x00\x05FY\x00\ +\x1b\x00?+\x00\x18?+\x00\x18?\x129/+\x11\ +\x12\x01\x179\x113\x113\x11310\x01\x22'5\ +\x1632654&#\x22\x07\x11#\x11!\x15!\ +\x1163 \x00\x11\x10\x02\x02q\x8enmv|\x84\ +\xa1\xb19:\xeb\x02\xe5\xfe\x06V<\x01\x03\x01\x1a\xf7\ +\xfe\x0a8\xcc9\xb8\xb5\xb3\xbd\x0c\xfeZ\x04R\xc3\xfe\ +\xe4\x0c\xfe\xd3\xfe\xed\xfe\xf3\xfe\xd8\x00\x00\x01\x00\x00\xfe\ +m\x07\x85\x05\xb6\x00\x15\x00\x5c@2\x07\x08\x0f\x0a\x0e\ +\x0b\x09\x05\x11\x11\x04\x00\x12\x02\x01\x14\x15\x01\x08\x0a\x0b\ +\x12\x15\x06\x17\x16\x09\x10\x13\x03\x06\x05\x00\x00\x0f\x07\x04\ +\x01\x03\x12\x15\x12\x0d#\x0f\x0aLY\x0f\x12\x00?+\ +\x00\x18??3?33\x129\x11\x173\x11\x12\x01\ +\x179\x113\x113\x11333\x1133\x113\x11\ +3\x11310\x01\x01!\x01\x113\x11\x01!\x01\x01\ +3\x11#\x11#\x01\x11#\x11\x01!\x02/\xfd\xea\x01\ +\x00\x02\x08\xe3\x02\x08\x01\x00\xfd\xea\x01\x95\xfa\xe7\x83\xfd\ +\xe9\xe3\xfd\xe9\xfe\xf6\x02\xf4\x02\xc2\xfd<\x02\xc4\xfd<\ +\x02\xc4\xfd>\xfd\xdd\xfd\x9c\x01\x93\x02\xe5\xfd\x1b\x02\xe5\ +\xfd\x1b\x00\x00\x01\x00\x02\xfe{\x06\xba\x04R\x00\x15\x00\ +\x5c@2\x03\x04\x0b\x06\x0a\x07\x05\x01\x0d\x12\x00\x0d\x0e\ +\x14\x13\x10\x11\x04\x06\x07\x0e\x11\x13\x06\x17\x16\x05\x0c\x0f\ +\x15\x02\x05\x12\x12\x0b\x03\x00\x13\x0f\x0e\x11\x15\x09\x22\x0b\ +\x06GY\x0b\x15\x00?+\x00\x18??3?33\ +\x129\x11\x173\x11\x12\x01\x179\x113\x113\x113\ +33\x1133\x113\x113\x11310\x013\x11\ +\x013\x01\x013\x11#\x11#\x01\x11#\x11\x01!\x01\ +\x013\x01\x02\xc9\xdb\x01\xaa\xf8\xfeM\x01B\xe5\xd9w\ +\xfe:\xdb\xfe;\xfe\xfe\x01\xd9\xfeN\xf8\x01\xa8\x04R\ +\xfd\xe7\x02\x19\xfd\xeb\xfey\xfd\xc5\x01\x85\x021\xfd\xcf\ +\x021\xfd\xcf\x02=\x02\x15\xfd\xe7\x00\xff\xff\x00X\xfe\ ++\x04\x85\x05\xcb\x02&\x01\xb1\x00\x00\x00\x07\x03\x7f\x01\ +{\x00\x00\xff\xff\x00H\xfe+\x03\xd1\x04f\x02&\x01\ +\xd1\x00\x00\x00\x07\x03\x7f\x01\x1d\x00\x00\x00\x01\x00\xc1\xfe\ +m\x05\x87\x05\xb6\x00\x12\x00A@$\x05\x00\x04\x01\x0c\ +\x08\x08\x09\x01\x09\x10\x00\x12\x06\x06\x14\x13\x0c\x06\x07\x12\ +\x04\x05\x0f\x0a\x03\x09\x12\x03#\x05\x00LY\x05\x12\x00\ +?+\x00\x18???3\x12\x179\x11\x12\x01\x179\ +\x113\x113\x113\x11310%3\x11#\x11#\ +\x01\x07\x11#\x113\x1167\x01!\x00\x07\x04\x8d\xfa\ +\xe7\x98\xfe5\x8d\xef\xefba\x01\x8b\x01\x10\xfe\x81\xa6\ +\xd1\xfd\x9c\x01\x93\x02\x96s\xfd\xdd\x05\xb6\xfdFxo\ +\x01\xd3\xfe>\xbf\x00\x01\x00\xa8\xfey\x04\xb8\x04R\x00\ +\x0e\x00F@$\x00\x01\x08\x03\x07\x04\x0d\x02\x0a\x0a\x0b\ +\x01\x03\x04\x0b\x04\x10\x0f\x09\x0e\x02\x02\x08\x00\x0c\x0f\x0b\ +\x15\x06\x22\x08\x03GY\x08\x15\x00?+\x00\x18??\ +?3\x129\x1133\x11\x12\x01\x179\x113\x113\ +3\x113\x113\x11310\x01!\x01\x013\x11#\ +\x11#\x01\x11#\x113\x11\x03V\x01\x02\xfe7\x01T\ +\xd5\xd9n\xfe\x22\xeb\xeb\x04R\xfd\xeb\xfey\xfd\xc3\x01\ +\x87\x021\xfd\xcf\x04R\xfd\xe7\x00\x01\x00\xc1\x00\x00\x05\ +\x1d\x05\xb6\x00\x12\x00C@$\x12\x0f\x03\x0c\x03\x04\x10\ +\x11\x01\x00\x0b\x07\x07\x08\x00\x04\x08\x11\x04\x14\x13\x04\x0d\ +\x0f\x0c\x05\x12\x02\x07\x08\x10\x09\x03\x01\x08\x12\x00?3\ +?3\x12\x179\x11\x12\x01\x179\x113\x113\x113\ +\x113\x1133\x113310!!\x01\x11#\x11\ +\x07\x11#\x113\x117\x113\x15\x01!\x01\x05\x1d\xfe\ +\xeb\xfe\xa6\x81}\xef\xef}\x81\x01P\x01\x10\xfd\xdb\x01\ +\xf4\xff\x00\x01\x95f\xfd\xdd\x05\xb6\xfdF\x95\x01e\xcd\ +\x01\x8d\xfd\x7f\x00\x00\x01\x00\xa8\x00\x00\x04\x7f\x04R\x00\ +\x12\x00Q@*\x04\x05\x08\x07\x06\x03\x0a\x00\x0a\x0b\x12\ +\x0e\x0e\x0f\x05\x07\x0b\x0f\x04\x14\x13\x0c\x09\x0b\x03\x0f\x0d\ +\x01\x00\x03\x03\x12\x0d\x12\x06\x0f\x04\x10\x0f\x08\x0f\x15\x00\ +?3?3\x12933\x12\x179\x11\x12\x179\x11\ +\x12\x01\x179\x113\x113\x1133\x1133\x113\ +\x11310\x01\x113\x15\x13!\x01\x01!\x03\x15#\ +\x11'\x11#\x113\x11\x01\xf6\x89\xd7\x01\x02\xfe7\x01\ +\xf0\xfe\xf2\xf2\x89c\xeb\xeb\x02\xae\x01H\xa4\x01\x00\xfd\ +\xeb\xfd\xc3\x01\x1b\xbf\x01`u\xfd\xcf\x04R\xfd\xe7\x00\ +\x01\x00/\x00\x00\x05\x1d\x05\xb6\x00\x16\x00K@*\x01\ +\x00\x13\x14\x09\x0c\x10\x03\x04\x04\x05\x00\x05\x07\x0e\x14\x02\ +\x16\x07\x18\x17\x0f\x07\x08\x07LY\x0c\x08\x08\x10\x03\x02\ +\x16\x04\x05\x13\x0a\x03\x01\x05\x12\x00?3?3\x12\x17\ +99/3+\x11\x003\x11\x12\x01\x179\x113\x12\ +\x179\x113\x11310!!\x01\x07\x11#\x11#\ +5353\x153\x15#\x1167\x01!\x00\x07\x05\ +\x1d\xfe\xeb\xfe5\x8d\xef\x92\x92\xef\xb4\xb4ba\x01\x8b\ +\x01\x10\xfe\x81\xa6\x02\x96s\xfd\xdd\x04N\xcb\x9d\x9d\xcb\ +\xfe\xaexo\x01\xd3\xfe>\xbf\x00\x01\x00\x0c\x00\x00\x04\ +\x87\x06\x14\x00\x16\x00Q@.\x0c\x0d\x10\x0f\x01\x04\x07\ +\x09\x04\x13\x13\x14\x06\x0d\x0f\x14\x0e\x11\x16\x07\x18\x17\x0e\ +\x11\x12\x09\x04\x14\x0c\x07\x16\x00\x16IY\x04\x00\x00\x0c\ +\x02\x00\x0c\x0f\x10\x14\x15\x00?3??\x129/3\ ++\x11\x003\x11\x12\x179\x11\x12\x01\x179\x113\x12\ +\x179\x113\x11310\x13353\x15!\x15!\ +\x11\x0737\x01!\x01\x01!\x01\x07\x11#\x11#\x0c\ +\x9c\xe9\x01]\xfe\xa3\x0a\x06\x81\x01N\x01\x11\xfeC\x01\ +\xd7\xfe\xee\xfe\x9d\x81\xe9\x9c\x05f\xae\xae\xa3\xfeM\xc8\ +\xa6\x01d\xfe%\xfd\x89\x01\xe3h\xfe\x85\x04\xc3\x00\x00\ +\x01\x00\x08\x00\x00\x05\xb0\x05\xb6\x00\x0d\x00@@#\x03\ +\x04\x07\x06\x02\x0a\x0a\x0b\x04\x05\x06\x08\x0b\x0d\x06\x0f\x0e\ +\x08\x05\x09\x02\x04\x0b\x00\x03\x03\x07\x0b\x12\x00\x0dLY\ +\x00\x03\x00?+\x00\x18?3?\x11\x12\x179\x11\x12\ +\x01\x179\x113\x113\x113\x11310\x13!\x11\ +\x01!\x01\x01!\x01\x07\x11#\x11!\x08\x02<\x02M\ +\x01\x11\xfd\xdb\x023\xfe\xec\xfe5\x8d\xf0\xfe\xb4\x05\xb6\ +\xfdD\x02\xbc\xfd\x7f\xfc\xcb\x02\x96s\xfd\xdd\x04\xe7\x00\ +\x01\x00\x14\x00\x00\x059\x04R\x00\x0c\x00A@!\x04\ +\x03\x00\x01\x0b\x02\x06\x06\x07\x01\x03\x07\x09\x04\x0e\x0d\x05\ +\x0c\x02\x02\x07\x0a\x00\x0f\x04\x07\x15\x0a\x09GY\x0a\x0f\ +\x00?+\x00\x18?3?\x11\x129\x1133\x11\x12\ +\x01\x179\x113\x1133\x113\x11310\x013\ +\x01\x01!\x01\x11#\x11!5!\x11\x04\x19\xf9\xfe6\ +\x01\xf1\xfe\xfc\xfe!\xe1\xfe\x9f\x02B\x04R\xfd\xeb\xfd\ +\xc3\x021\xfd\xcf\x03\x9a\xb8\xfd\xe7\x00\x00\x01\x00\xc1\xfe\ +m\x06)\x05\xb6\x00\x0f\x00D@$\x04\x01\x0d\x05\x05\ +\x00\x0c\x08\x08\x09\x00\x01\x09\x03\x11\x10\x0c\x07LY\x0c\ +\x0c\x05\x0e\x0a\x03\x09\x12\x03#\x05\x00LY\x05\x12\x00\ +?+\x00\x18???3\x129/+\x11\x12\x01\x17\ +9\x113\x113\x113\x113\x11310%3\x11\ +#\x11#\x11!\x11#\x113\x11!\x113\x05B\xe7\ +\xe7\xf0\xfd^\xef\xef\x02\xa2\xf0\xd1\xfd\x9c\x01\x93\x02\x93\ +\xfdm\x05\xb6\xfd\xaa\x02V\x00\x00\x01\x00\xa8\xfe{\x05\ +\x5c\x04R\x00\x0f\x00D@$\x09\x06\x02\x0a\x0a\x05\x01\ +\x0d\x0d\x0e\x05\x06\x0e\x03\x11\x10\x01\x0cGY\x01\x01\x0a\ +\x03\x0f\x0f\x0e\x15\x08\x22\x0a\x05GY\x0a\x15\x00?+\ +\x00\x18???3\x129/+\x11\x12\x01\x179\x11\ +3\x113\x113\x113\x11310\x01\x11!\x113\ +\x113\x11#\x11#\x11!\x11#\x11\x01\x93\x02\x09\xeb\ +\xd5\xdd\xe3\xfd\xf7\xeb\x04R\xfeD\x01\xbc\xfcd\xfd\xc5\ +\x01\x85\x01\xdd\xfe#\x04R\x00\x00\x01\x00\xc1\x00\x00\x06\ +\x8d\x05\xb6\x00\x0d\x00?@!\x0b\x03\x03\x02\x0a\x06\x06\ +\x07\x00\x02\x07\x03\x0f\x0e\x0a\x05LY\x0a\x0a\x07\x0c\x08\ +\x03\x03\x07\x12\x0c\x01LY\x0c\x03\x00?+\x00\x18?\ +3?\x11\x129/+\x11\x12\x01\x179\x113\x113\ +\x113\x11310\x01!\x11#\x11!\x11#\x113\ +\x11!\x11!\x06\x8d\xfe\xb5\xf0\xfd^\xef\xef\x02\xa2\x02\ +;\x04\xe7\xfb\x19\x02\x93\xfdm\x05\xb6\xfd\xaa\x02V\x00\ +\x01\x00\xa8\x00\x00\x05\xe7\x04R\x00\x0d\x00?@!\x02\ +\x08\x08\x07\x01\x0b\x0b\x0c\x05\x07\x0c\x03\x0f\x0e\x01\x0aG\ +Y\x01\x01\x0c\x03\x0d\x0f\x08\x0c\x15\x03\x06GY\x03\x0f\ +\x00?+\x00\x18?3?\x11\x129/+\x11\x12\x01\ +\x179\x113\x113\x113\x11310\x01\x11!\x11\ +!\x15!\x11#\x11!\x11#\x11\x01\x93\x02\x09\x02K\ +\xfe\xa0\xeb\xfd\xf7\xeb\x04R\xfeD\x01\xbc\xb8\xfcf\x01\ +\xdd\xfe#\x04R\x00\x01\x00\xc1\xfe\x00\x08Z\x05\xb6\x00\ + \x00M@*\x13\x06\x1a\x00\x19\x1d\x1e\x06\x0e\x19\x1e\ +\x04\x22!\x02\x16LY\x0f\x02\x01\x0b\x03\x02\x02\x1e\x1f\ +\x0a\x10LY\x0a\x1c\x1a\x1e\x12\x1f\x1cLY\x1f\x03\x00\ +?+\x00\x18?3?+\x11\x12\x009\x18/_^\ +]+\x11\x12\x01\x179\x113\x1133\x11310\ +\x01632\x04\x12\x15\x14\x02\x06#\x22&'5\x16\ +32654&#\x22\x07\x11#\x11!\x11#\x11\ +!\x04\xf6d\x89\xbf\x01\x1e\x9a\x87\xf6\xa0Z\x86M\x81\ +\x83\x9e\xb6\xe5\xdffH\xf0\xfd\xaa\xef\x045\x03\x1d\x0e\ +\x9d\xfe\xd4\xd3\xca\xfe\xd6\x9b\x14\x1d\xd3/\xea\xd2\xda\xe7\ +\x10\xfd\xbe\x04\xe7\xfb\x19\x05\xb6\x00\x01\x00\xa8\xfe\x0a\x06\ +\xbe\x04R\x00\x1f\x00C@$\x0c\x00\x1a\x13\x12\x16\x17\ +\x00\x07\x12\x17\x04! \x1c\x0fFY\x1c\x1c\x18\x13\x17\ +\x15\x18\x15GY\x18\x0f\x04\x09FY\x04\x1b\x00?+\ +\x00\x18?+\x00\x18?3\x129/+\x11\x12\x01\x17\ +9\x113\x1133\x11310%\x14\x06\x06#\x22\ +'5\x1632654&#\x22\x07\x11#\x11!\ +\x11#\x11!\x11632\x16\x12\x06\xbek\xcb\x8a\x86\ +lfst|\x9a\xa8)\x1e\xee\xfe5\xeb\x03\xa44\ +:\x9d\xe9~?\xb3\xfe\x848\xce;\xba\xb3\xb3\xbd\x0a\ +\xfeX\x03\x98\xfch\x04R\xfe#\x0a\x87\xfe\xfc\x00\x00\ +\x02\x00y\xff\xac\x05\xee\x05\xcd\x00*\x006\x00m@\ +;4\x0c%+\x001%\x1d\x12\x00\x07\x12\x18%\x05\ +874\x22. \x03\x0c(\x0e(.KY\x00(\ +\x10(\x02\x09\x03((\x0e\x15\x0a\x05LY\x0a\x0e@\ +\x15\x1bLY\x15\x04\x0e LY\x0e\x13\x00?+\x00\ +\x18?+\x00\x1a\x18\x10\xcc+\x11\x12\x009\x18/_\ +^]+\x11\x12\x0099\x11\x1299\x11\x12\x01\x17\ +9\x113\x113\x113\x129910\x01\x14\x02\x07\ +\x16327\x15\x06#\x22'\x06#\x22$\x025\x10\ +\x00!2\x16\x17\x07&# \x11\x10\x12327&\ +\x0254632\x16\x074&#\x22\x06\x15\x14\x16\ +\x1766\x05\xc3{o=JN@\x1d\x00$\x14#\x15\x15\x0d\x03\x0a\x05\ +\x00\x03\x05\x14\x04('\x0f\x08\x1f\x08\x02\x0e\x03\x08#\ +@\x03\x0d\x15##\x15HY\x0c#\x1c#\x02\x10\x03\ +##\x1d\x10\x1f\x22\x10 HY\x10\x10\x1d\x17GY\ +\x00\x1d\x16\x00?3+\x00\x18?+\x00\x18?\x11\x12\ +9/_^]+\x11\x12\x0099\x1a\x18\x10\xcc_\ +^]\x11\x12\x01\x179\x113\x1133\x113\x113\ +\x11310\x05&\x02'$5473\x06\x15\x14\ +336$32\x00\x15\x15!\x12!267\x15\ +\x06\x07\x11#\x13\x22\x06\x07!4&\x02\xd9\xbd\xd0\x0a\ +\xfe\xd7 \xae\x16d\x13+\x01\x00\xca\xe1\x01\x01\xfd\x12\ +\x0a\x016g\xa8g\x82\xb1\xdbdr\x89\x0d\x02\x00\x81\ +\x06$\x01\x05\xd1\x02\xdfR;*@Z\xe0\xe8\xfe\xf4\ +\xe7\x7f\xfe\xb2#-\xbf?\x08\xfe\x8b\x059\x8b\x8b\x84\ +\x92\xff\xff\x00J\x00\x00\x02\x98\x05\xb6\x02\x06\x00,\x00\ +\x00\xff\xff\x00\x00\x00\x00\x07#\x07w\x02&\x01\xb0\x00\ +\x00\x01\x07\x026\x01B\x01R\x00\x08\xb3\x01\x12\x05&\ +\x00+5\xff\xff\x00\x02\x00\x00\x06m\x06%\x02&\x01\ +\xd0\x00\x00\x01\x07\x026\x00\xe9\x00\x00\x00\x08\xb3\x01\x12\ +\x11&\x00+5\x00\x01\x00\xc1\xfe\x00\x05b\x05\xb6\x00\ +\x1f\x00E@%\x09\x0a\x1d\x10\x03\x07\x0b\x03\x04\x04\x0a\ +\x10\x18\x04! \x07\x0c\x0c\x00KY\x0c\x0c\x04\x05\x14\ +\x1aLY\x14\x1c\x09\x05\x03\x04\x12\x00??3?+\ +\x11\x12\x009\x18/+\x11\x003\x11\x12\x01\x179\x11\ +\x173\x113\x11310\x01\x22\x07\x11#\x113\x11\ +7\x01!\x0132\x04\x12\x15\x14\x02\x06#\x22&'\ +5\x1632654$\x02\x83ar\xef\xef\xb4\x01\ +\x9e\x01\x12\xfd\xa2\x0f\xd0\x01*\xa3\x89\xfa\xa4X\x84Q\ +\x81\x8c\xa3\xb5\xff\x00\x02J\x1d\xfd\xd3\x05\xb6\xfd>\xdd\ +\x01\xe5\xfdR\x8f\xfe\xe4\xcc\xcb\xfe\xd6\x9c\x13\x1e\xd3/\ +\xea\xd2\xd4\xe5\x00\x00\x01\x00\xa8\xfe\x0a\x04\x8b\x04R\x00\ +\x1a\x00B@#\x16\x17\x0c\x00\x18\x15\x11\x11\x12\x00\x07\ +\x12\x17\x04\x1c\x1b\x18\x0eFY\x15\x18\x18\x12\x16\x13\x0f\ +\x12\x15\x04\x09FY\x04\x1b\x00?+\x00\x18??3\ +\x129/3+\x11\x12\x01\x179\x113\x1133\x11\ +3\x11310%\x14\x02\x06#\x22'5\x1632\ +65\x10!\x22\x07\x11#\x113\x11\x01!\x01\x16\x00\ +\x04\x8bt\xd4\x8d\x89jol|\x8c\xfe\xa8Xe\xe9\ +\xe9\x01\xcb\x01\x08\xfe/\xf3\x01\x05?\xb1\xff\x00\x848\ +\xcc;\xbc\xb0\x01k\x1d\xfes\x04R\xfe\x06\x01\xfa\xfe\ +\x16\x02\xfe\xdf\x00\x00\x01\x00\x08\xfem\x06\x0e\x05\xb6\x00\ +\x15\x00D@$\x03\x02\x04\x02\x01\x05\x00\x07\x14\x00\x01\ +\x0d\x14\x04\x17\x16\x03#\x05\x00LY\x05\x12\x14\x07L\ +Y\x14\x03\x0b\x10LY\x0b\x13\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?\x11\x12\x01\x179\x113\x113\ +\x1133\x11310%!\x03!\x13#\x11!\x02\ +\x02\x06'\x22'5\x16326\x12\x13!\x05\x0a\x01\ +\x04\xa1\xfe\xf1\xac\xef\xfe`O_\xac\x8eIB96\ +HQaC\x03V\xd1\xfd\x9c\x01\x93\x04\xe9\xfd\x80\xfe\ +2\xb5\x03\x19\xc7\x19\xad\x02P\x02\x09\x00\x01\x00\x08\xfe\ +{\x05!\x04R\x00\x14\x00D@$\x03\x02\x04\x02\x01\ +\x06\x14\x07\x13\x01\x0d\x13\x14\x04\x16\x15\x03\x22\x05\x00G\ +Y\x05\x15\x13\x07GY\x13\x0f\x0b\x10FY\x0b\x16\x00\ +?+\x00\x18?+\x00\x18?+\x00\x18?\x11\x12\x01\ +\x179\x113\x113\x1133\x11310%3\x03\ +#\x13#\x11!\x02\x02\x06#\x22'5\x1632\x12\ +\x13!\x043\xee\x89\xe8\x83\xeb\xfe\xcf\x1c_\x98{R\ +/%%av#\x02\xe7\xb6\xfd\xc5\x01\x85\x03\x98\xfe\ +\x9c\xfeq\xb5\x14\xba\x0e\x01\xaa\x01\xf8\x00\x01\x00\xc1\xfe\ +\x00\x05B\x05\xb6\x00\x16\x00=@ \x14\x0c\x0c\x00\x13\ +\x0f\x0f\x10\x00\x07\x10\x03\x18\x17\x13\x0eLY\x13\x13\x10\ +\x15\x11\x03\x10\x12\x03\x09LY\x03\x1c\x00?+\x00\x18\ +??3\x129/+\x11\x12\x01\x179\x113\x113\ +\x113\x11310%\x10\x00#\x22&'5\x163\ +265\x11!\x11#\x113\x11!\x113\x05B\xfe\ +\xdf\xfec\x83G\x81\x8f\xa4\xa8\xfd^\xef\xef\x02\xa2\xf0\ +w\xfe\xd9\xfe\xb0\x15\x1a\xd3/\xdc\xd6\x02\x0e\xfdm\x05\ +\xb6\xfd\xaa\x02V\x00\x01\x00\xa8\xfe\x0a\x04\x87\x04R\x00\ +\x16\x00=@ \x11\x09\x09\x14\x10\x0c\x0c\x0d\x04\x0d\x14\ +\x03\x18\x17\x10\x0bGY\x10\x10\x0d\x12\x0e\x0f\x0d\x15\x00\ +\x06FY\x00\x1b\x00?+\x00\x18??3\x129/\ ++\x11\x12\x01\x179\x113\x113\x113\x11310\ +\x01\x22&'5\x163267\x11!\x11#\x113\ +\x11!\x113\x11\x14\x02\x02\xc7Lp6mnvr\ +\x02\xfd\xf9\xeb\xeb\x02\x07\xed\xe9\xfe\x0a\x1b\x1d\xce;\xac\ +\xae\x01\xae\xfe#\x04R\xfeD\x01\xbc\xfb\xd3\xff\xfe\xe4\ +\x00\x00\x01\x00\xc1\xfem\x06F\x05\xb6\x00\x0f\x00I@\ +'\x0d\x05\x03\x02\x04\x01\x05\x00\x0c\x08\x08\x09\x00\x01\x02\ +\x09\x04\x11\x10\x0c\x07LY\x0c\x0c\x05\x0e\x0a\x03\x09\x12\ +\x03#\x05\x00LY\x05\x12\x00?+\x00\x18???\ +3\x129/+\x11\x12\x01\x179\x113\x113\x113\ +\x113\x113\x11310%!\x03!\x13#\x11!\ +\x11#\x113\x11!\x113\x05B\x01\x04\xa2\xfe\xf2\xac\ +\xf0\xfd^\xef\xef\x02\xa2\xf0\xd1\xfd\x9c\x01\x93\x02\x93\xfd\ +m\x05\xb6\xfd\xaa\x02V\x00\x01\x00\xa8\xfe{\x05u\x04\ +R\x00\x0f\x00I@'\x08\x07\x02\x0a\x0a\x05\x09\x06\x01\ +\x0d\x0d\x0e\x05\x06\x07\x0e\x04\x11\x10\x01\x0cGY\x01\x01\ +\x0a\x03\x0f\x0f\x0e\x15\x08\x22\x0a\x05GY\x0a\x15\x00?\ ++\x00\x18???3\x129/+\x11\x12\x01\x179\ +\x113\x113\x113\x113\x113\x11310\x01\x11\ +!\x113\x113\x03#\x13#\x11!\x11#\x11\x01\x93\ +\x02\x09\xeb\xee\x89\xe8\x83\xeb\xfd\xf7\xeb\x04R\xfeD\x01\ +\xbc\xfcd\xfd\xc5\x01\x85\x01\xdd\xfe#\x04R\x00\x01\x00\ +\x8b\xfem\x04\xf0\x05\xb6\x00\x17\x00H@%\x03\x02\x15\ +\x05\x05\x00\x0f\x0c\x00\x02\x0c\x03\x19\x18\x06\x09\x15\x0d\x12\ +\x09\x12LY\x09\x09\x01\x16\x0d\x03\x03#\x01\x04LY\ +\x01\x12\x00?+\x00\x18??3\x129/+\x11\x12\ +\x009\x119\x11\x12\x01\x179\x113\x113\x113\x11\ +310!#\x11#\x113\x11\x06\x06#\x22&5\ +\x113\x11\x14\x163267\x113\x04\xf0\xd5\xe8\xcd\ +\x87\xd3k\xcf\xe1\xf0q\x81_\xb4\x80\xf0\xfem\x02d\ +\x01w0*\xc3\xb3\x02R\xfd\xe6rp#+\x02\xae\ +\x00\x00\x01\x00\x8b\xfey\x04f\x04R\x00\x16\x00H@\ +%\x06\x0e\x0e\x09\x0c\x0b\x01\x15\x09\x0b\x15\x03\x18\x17\x06\ +\x03\x0f\x16\x12\x12\x03HY\x12\x12\x0a\x07\x16\x0f\x0c\x22\ +\x0a\x0dGY\x0a\x15\x00?+\x00\x18??3\x129\ +/+\x11\x12\x009\x119\x11\x12\x01\x179\x113\x11\ +3\x113\x11310\x01\x11\x143267\x113\ +\x11#\x11#\x113\x11\x06\x06#\x22&5\x11\x01w\ +\xb0U\xa2]\xeb\xcc\xde\xbfa\xb5k\xad\xc2\x04R\xfe\ +l\xaa/4\x01\xdb\xfb\xae\xfey\x02=\x01\x1f<9\ +\xb3\xa1\x01\x9e\x00\x00\x01\x00\xc1\xfem\x07\xa4\x05\xb6\x00\ +\x18\x00U@.\x10\x0f\x11\x0f\x0e\x00\x09\x18\x03\x0a\x0b\ +\x12\x16\x03\x0d\x08\x02\x05\x05\x06\x06\x0a\x0d\x0e\x04\x1a\x19\ +\x02\x16\x09\x03\x12\x0b\x07\x03\x10#\x00\x06\x12\x12\x0dL\ +Y\x12\x12\x00?+\x11\x0033\x18??3\x12\x17\ +9\x11\x12\x01\x179\x113\x1133\x11\x173\x11\x17\ +3\x1133\x11310!\x01#\x12\x15\x11#\x11\ +!\x013\x01!\x11!\x03!\x13#\x11467#\ +\x01\x039\xfeX\x08\x11\xd9\x01Q\x01\x96\x08\x01\xa0\x01\ +R\x01\x02\xa0\xfe\xf0\xae\xe6\x03\x0c\x08\xfeI\x04\xc5\xfe\ +\xb9Y\xfc\xdb\x05\xb6\xfbu\x04\x8b\xfb\x1b\xfd\x9c\x01\x93\ +\x0312x\xe8\xfb=\x00\x01\x00\xa8\xfe{\x06\x96\x04\ +R\x00\x1b\x00Q@*\x09\x08\x08\x0a\x07\x11\x10\x00\x04\ +\x0b\x0b\x06\x18\x15\x15\x16\x00\x06\x07\x16\x04\x1d\x1c\x14\x0c\ +\x00\x03\x16\x04\x17\x0f\x09\x22\x11\x16\x0b\x0b\x06GY\x0b\ +\x15\x00?+\x11\x0033\x18??3\x12\x179\x11\ +\x12\x01\x179\x113\x113\x113\x113\x1133\x11\ +33\x11310%767\x13!\x113\x03#\ +\x13#\x11\x07\x06\x07\x03#\x03&'\x11#\x11!\x13\ +\x16\x16\x03#\x0d)\x1e\xf8\x019\xee\x8a\xe7\x83\xd9\x12\ +-\x1f\xf2\xb2\xf22*\xd7\x017\xf4\x17%\xe10\x95\ +P\x02\x5c\xfcd\xfd\xc5\x01\x85\x03}<\xa1L\xfd\xac\ +\x02X\x82\xa3\xfc\x83\x04R\xfd\xa8:|\x00\xff\xff\x00\ +J\x00\x00\x02\x98\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00\ +\x00\x00\x00\x05J\x07w\x02&\x00$\x00\x00\x01\x07\x02\ +6\x00V\x01R\x00\x08\xb3\x02\x10\x05&\x00+5\xff\ +\xff\x00Z\xff\xec\x04\x04\x06%\x02&\x00D\x00\x00\x01\ +\x06\x026\x08\x00\x00\x08\xb3\x02'\x11&\x00+5\xff\ +\xff\x00\x00\x00\x00\x05J\x07>\x02&\x00$\x00\x00\x01\ +\x07\x00j\x00J\x01R\x00\x0a\xb4\x03\x02%\x05&\x00\ ++55\xff\xff\x00Z\xff\xec\x04\x04\x05\xec\x02&\x00\ +D\x00\x00\x01\x06\x00j\xf7\x00\x00\x0a\xb4\x03\x02<\x11\ +&\x00+55\xff\xff\xff\xfe\x00\x00\x06\xd3\x05\xb6\x02\ +\x06\x00\x88\x00\x00\xff\xff\x00Z\xff\xec\x06\xb8\x04f\x02\ +\x06\x00\xa8\x00\x00\xff\xff\x00\xb0\x00\x00\x04\x06\x07w\x02\ +&\x00(\x00\x00\x01\x07\x026\x00\x0e\x01R\x00\x08\xb3\ +\x01\x0c\x05&\x00+5\xff\xff\x00f\xff\xec\x049\x06\ +%\x02&\x00H\x00\x00\x01\x06\x026\x14\x00\x00\x08\xb3\ +\x02\x1c\x11&\x00+5\x00\x02\x00\x8b\xff\xec\x05\xb4\x05\ +\xcd\x00\x12\x00\x19\x00=@ \x16\x10\x10\x09\x17\x0f\x02\ +\x09\x0f\x03\x1b\x1a\x0f\x17LY\x0f\x0f\x0c\x06\x06\x00L\ +Y\x06\x04\x0c\x13LY\x0c\x13\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\x113\ +\x11310\x01\x22\x055663 \x00\x11\x10\x00\ +! \x115!&&\x03267!\x14\x16\x02\xe5\ +\xf7\xfe\xf3\x82\xf5\x91\x01Q\x01z\xfe\x9c\xfe\xc0\xfd{\ +\x04-\x0f\xee\xab\xb8\xe1\x0d\xfc\xd1\xc0\x05\x00w\xd5=\ +2\xfeo\xfe\x9d\xfe\x9f\xfet\x02\xfbH\xe8\xe9\xfb\xb8\ +\xdf\xcb\xdc\xce\x00\x00\x02\x00`\xff\xec\x04=\x04f\x00\ +\x13\x00\x1a\x00=@ \x17\x0b\x0b\x03\x18\x0a\x03\x0a\x10\ +\x03\x1c\x1b\x0a\x18HY\x0a\x0a\x06\x00\x00\x0eGY\x00\ +\x10\x06\x14HY\x06\x16\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x01\x179\x113\x113\x113\ +10\x01 \x00\x11\x10\x00#\x22\x0055!&&\ +#\x22\x07566\x13267!\x14\x16\x02\x12\x01\ +\x04\x01'\xfe\xf0\xeb\xe1\xfe\xff\x02\xee\x05\xa3\x98\xbd\xb9\ +U\xaf\xa6q\x8c\x0b\xfe\x00\x80\x04f\xfe\xd6\xfe\xf5\xfe\ +\xf0\xfe\xcb\x01\x0b\xe8\x7f\xa7\xa7R\xc1'$\xfc8\x8c\ +\x8a\x85\x91\xff\xff\x00\x8b\xff\xec\x05\xb4\x07>\x02&\x02\ +\xe1\x00\x00\x01\x07\x00j\x00\xc1\x01R\x00\x0a\xb4\x03\x02\ +/\x05&\x00+55\xff\xff\x00`\xff\xec\x04=\x05\ +\xec\x02&\x02\xe2\x00\x00\x01\x06\x00j\xf5\x00\x00\x0a\xb4\ +\x03\x020\x11&\x00+55\xff\xff\x00\x00\x00\x00\x07\ +#\x07>\x02&\x01\xb0\x00\x00\x01\x07\x00j\x013\x01\ +R\x00\x0a\xb4\x02\x01'\x05&\x00+55\xff\xff\x00\ +\x02\x00\x00\x06m\x05\xec\x02&\x01\xd0\x00\x00\x01\x07\x00\ +j\x00\xd9\x00\x00\x00\x0a\xb4\x02\x01'\x11&\x00+5\ +5\xff\xff\x00X\xff\xec\x04\x85\x07>\x02&\x01\xb1\x00\ +\x00\x01\x07\x00j\x00\x0e\x01R\x00\x0a\xb4\x02\x01;\x05\ +&\x00+55\xff\xff\x00H\xff\xec\x03\xd1\x05\xec\x02\ +&\x01\xd1\x00\x00\x01\x06\x00j\xb1\x00\x00\x0a\xb4\x02\x01\ +9\x11&\x00+55\x00\x01\x00B\xff\xec\x04P\x05\ +\xb6\x00\x17\x00H@&\x01\x05\x14\x09\x06\x00\x00\x02\x05\ +\x09\x0e\x05\x19\x18\x00\x06\x06\x17KY\x06\x06\x0c\x05\x02\ +\x03\x03\x02LY\x03\x03\x0c\x12KY\x0c\x13\x00?+\ +\x00\x18?+\x11\x12\x009\x129\x18/+\x11\x003\ +\x11\x12\x01\x179\x113\x113\x11310\x01\x01!\ +5!\x15\x01\x04\x04\x15\x14\x04! '5\x16\x163\ + \x114!#\x01)\x01\xaa\xfd\x9c\x03\xa1\xfe)\x01\ +\x07\x01\x10\xfe\xc3\xfe\xe1\xfe\xfb\xadc\xe2g\x01n\xfe\ +P\x83\x03L\x01\x9d\xcd\xaa\xfe>\x0a\xda\xc0\xd0\xeaO\ +\xd1.2\x01\x02\xec\x00\x00\x01\x00)\xfe\x14\x03\xfe\x04\ +R\x00\x19\x00H@&\x16\x09\x01\x05\x06\x00\x00\x02\x05\ +\x09\x10\x05\x1b\x1a\x00\x06\x06\x19HY\x06\x06\x0d\x05\x02\ +\x03\x03\x02GY\x03\x0f\x0d\x13FY\x0d\x1b\x00?+\ +\x00\x18?+\x11\x12\x009\x129\x18/+\x11\x003\ +\x11\x12\x01\x179\x113\x113\x11310\x01\x01!\ +5!\x15\x01\x16\x04\x15\x14\x06\x04#\x22'5\x16\x16\ +3265\x10!#\x01\x00\x01\xae\xfd\x9e\x03\x7f\xfe\ +A\xef\x01\x03\x8c\xfe\xfb\xac\xf4\xa4^\xd5^\xa3\xb3\xfe\ +iy\x01\xd9\x01\xbf\xba\xa0\xfe1\x14\xfd\xd0\x94\xe1y\ +L\xcf,.\xa4\x8d\x01-\x00\xff\xff\x00\xc1\x00\x00\x05\ +\x98\x06\xd9\x02&\x01\xb2\x00\x00\x01\x07\x01M\x00\xc7\x01\ +R\x00\x08\xb3\x01\x14\x05&\x00+5\xff\xff\x00\xa8\x00\ +\x00\x04\xc3\x05\x87\x02&\x01\xd2\x00\x00\x01\x06\x01MR\ +\x00\x00\x08\xb3\x01\x12\x11&\x00+5\xff\xff\x00\xc1\x00\ +\x00\x05\x98\x07>\x02&\x01\xb2\x00\x00\x01\x07\x00j\x00\ +\xcd\x01R\x00\x0a\xb4\x02\x01&\x05&\x00+55\xff\ +\xff\x00\xa8\x00\x00\x04\xc3\x05\xec\x02&\x01\xd2\x00\x00\x01\ +\x06\x00jX\x00\x00\x0a\xb4\x02\x01$\x11&\x00+5\ +5\xff\xff\x00y\xff\xec\x05\xd3\x07>\x02&\x002\x00\ +\x00\x01\x07\x00j\x00\xc9\x01R\x00\x0a\xb4\x03\x02-\x05\ +&\x00+55\xff\xff\x00f\xff\xec\x04}\x05\xec\x02\ +&\x00R\x00\x00\x01\x06\x00j\x14\x00\x00\x0a\xb4\x03\x02\ ++\x11&\x00+55\x00\x03\x00y\xff\xec\x05\xd3\x05\ +\xcd\x00\x0b\x00\x12\x00\x19\x00?@ \x17\x0f\x0f\x00\x16\ +\x10\x10\x06\x06\x00\x1b\x1a\x16\x10LY\x16\x16\x03\x09\x09\ +\x13LY\x09\x04\x03\x0cLY\x03\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x0199\x113\ +\x113\x113\x11310\x01\x10\x00! \x00\x11\x10\ +\x00! \x00\x01267!\x16\x16\x13\x22\x06\x07!\ +&&\x05\xd3\xfe\x9b\xfe\xb9\xfe\xb5\xfe\x9d\x01e\x01K\ +\x01F\x01d\xfdT\xc3\xda\x11\xfc\xa2\x0f\xdd\xc6\xbd\xdc\ +\x17\x03X\x15\xd6\x02\xdd\xfe\x9b\xfet\x01\x89\x01j\x01\ +j\x01\x84\xfev\xfcu\xe7\xe6\xe3\xea\x04H\xd8\xd8\xd5\ +\xdb\x00\x03\x00f\xff\xec\x04}\x04f\x00\x0c\x00\x13\x00\ +\x1a\x00?@ \x18\x10\x10\x00\x17\x11\x11\x07\x07\x00\x1c\ +\x1b\x17\x11HY\x17\x17\x03\x0a\x0a\x14FY\x0a\x10\x03\ +\x0dFY\x03\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x12\x0199\x113\x113\x113\x113\ +10\x01\x10\x00#\x22&\x025\x10\x0032\x00\x01\ +267!\x16\x16\x13\x22\x06\x07!&&\x04}\xfe\ +\xea\xf8\x9b\xee\x80\x01\x14\xfb\xf0\x01\x18\xfd\xf6\x83\x85\x0c\ +\xfd\xd3\x0c\x88\x83\x81\x86\x0e\x02+\x0f\x87\x02+\xfe\xf1\ +\xfe\xd0\x8c\x01\x06\xad\x01\x0d\x01.\xfe\xcb\xfd{\x97\x98\ +\x98\x97\x02\xfa\x8f\x8c\x8d\x8e\x00\xff\xff\x00y\xff\xec\x05\ +\xd3\x07>\x02&\x02~\x00\x00\x01\x07\x00j\x00\xcb\x01\ +R\x00\x0a\xb4\x04\x03/\x05&\x00+55\xff\xff\x00\ +f\xff\xec\x04}\x05\xec\x02&\x02\x7f\x00\x00\x01\x06\x00\ +j\x12\x00\x00\x0a\xb4\x04\x030\x11&\x00+55\xff\ +\xff\x00B\xff\xec\x04\xb0\x07>\x02&\x01\xc7\x00\x00\x01\ +\x07\x00j\x00\x06\x01R\x00\x0a\xb4\x02\x01/\x05&\x00\ ++55\xff\xff\x00B\xff\xec\x03\x9c\x05\xec\x02&\x01\ +\xe7\x00\x00\x01\x06\x00j\x92\x00\x00\x0a\xb4\x02\x01.\x11\ +&\x00+55\xff\xff\x00\x0c\xff\xec\x05\x19\x06\xd9\x02\ +&\x01\xbd\x00\x00\x01\x07\x01M\x00/\x01R\x00\x08\xb3\ +\x01\x1a\x05&\x00+5\xff\xff\x00\x00\xfe\x14\x04J\x05\ +\x87\x02&\x00\x5c\x00\x00\x01\x06\x01M\xc6\x00\x00\x08\xb3\ +\x01\x18\x11&\x00+5\xff\xff\x00\x0c\xff\xec\x05\x19\x07\ +>\x02&\x01\xbd\x00\x00\x01\x07\x00j\x005\x01R\x00\ +\x0a\xb4\x02\x01,\x05&\x00+55\xff\xff\x00\x00\xfe\ +\x14\x04J\x05\xec\x02&\x00\x5c\x00\x00\x01\x06\x00j\xca\ +\x00\x00\x0a\xb4\x02\x01*\x11&\x00+55\xff\xff\x00\ +\x0c\xff\xec\x05\x19\x07s\x02&\x01\xbd\x00\x00\x01\x07\x01\ +S\x00\xa2\x01R\x00\x0a\xb4\x02\x01)\x05&\x00+5\ +5\xff\xff\x00\x00\xfe\x14\x04J\x06!\x02&\x00\x5c\x00\ +\x00\x01\x06\x01S+\x00\x00\x0a\xb4\x02\x01'\x11&\x00\ ++55\xff\xff\x00\x8b\x00\x00\x04\xf0\x07>\x02&\x01\ +\xc1\x00\x00\x01\x07\x00j\x00`\x01R\x00\x0a\xb4\x02\x01\ +)\x05&\x00+55\xff\xff\x00\x8b\x00\x00\x04f\x05\ +\xec\x02&\x01\xe1\x00\x00\x01\x06\x00j\x1d\x00\x00\x0a\xb4\ +\x02\x01(\x11&\x00+55\x00\x01\x00\xc1\xfem\x04\ +-\x05\xb6\x00\x09\x00/@\x18\x04\x09\x06\x07\x01\x07\x09\ +\x03\x0a\x0b\x07#\x00\x03LY\x00\x03\x09\x04LY\x09\ +\x12\x00?+\x00\x18?+\x00\x18?\x11\x12\x01\x179\ +\x113\x11310\x13!\x15!\x113\x11#\x11#\ +\xc1\x03l\xfd\x83\xe6\xe6\xef\x05\xb6\xcd\xfb\xe8\xfd\x9c\x01\ +\x93\x00\x01\x00\xa8\xfe{\x03s\x04R\x00\x09\x00/@\ +\x18\x04\x09\x06\x07\x01\x07\x09\x03\x0a\x0b\x07\x22\x00\x03G\ +Y\x00\x0f\x09\x04GY\x09\x15\x00?+\x00\x18?+\ +\x00\x18?\x11\x12\x01\x179\x113\x11310\x13!\ +\x15!\x113\x11#\x11#\xa8\x02\xcb\xfe \xd3\xdb\xe3\ +\x04R\xb8\xfd\x1c\xfd\xc5\x01\x85\xff\xff\x00\xc1\x00\x00\x06\ +H\x07>\x02&\x01\xc5\x00\x00\x01\x07\x00j\x01'\x01\ +R\x00\x0a\xb4\x04\x03-\x05&\x00+55\xff\xff\x00\ +\xa8\x00\x00\x05\xd3\x05\xec\x02&\x01\xe5\x00\x00\x01\x07\x00\ +j\x00\xdf\x00\x00\x00\x0a\xb4\x04\x03-\x11&\x00+5\ +5\xff\xff\x00/\xfeD\x04+\x05\xb6\x02&\x02\x9b\x00\ +\x00\x00\x07\x03\x80\x00\xbe\x00\x00\xff\xff\x00\x0a\xfeD\x03\ +\x7f\x04R\x02&\x02\x9c\x00\x00\x00\x07\x03\x81\x00\x98\x00\ +\x00\xff\xff\x00\x04\xfeD\x05>\x05\xb6\x00&\x00;\x00\ +\x00\x00\x07\x03\x80\x03q\x00\x00\xff\xff\x00\x19\xfeD\x04\ +\xa0\x04R\x00&\x00[\x00\x00\x00\x07\x03\x81\x02\xd3\x00\ +\x00\x00\x01\x00\x02\x00\x00\x04\xf6\x05\xb6\x00\x11\x00I@\ +)\x0c\x0b\x05\x06\x03\x02\x0e\x0f\x02\x06\x09\x0b\x0d\x04\x0f\ +\x11\x01\x07\x10\x0a\x0c\x13\x12\x0d\x0a\x11\x00\x11LY\x04\ +\x07\x00\x00\x0f\x05\x02\x03\x0c\x0f\x12\x00?3?3\x12\ +9/33+\x11\x0033\x11\x12\x01\x179\x113\ +\x113\x113\x11310\x13!\x01!\x01\x01!\x01\ +!\x15!\x01!\x01\x01!\x01!w\x01/\xfe}\x01\ +\x0a\x01R\x01R\x01\x02\xfe}\x011\xfe\xc7\x01\xae\xfe\ +\xed\xfe\x92\xfe\x8f\xfe\xfe\x01\xa6\xfe\xcf\x03^\x02X\xfd\ +\xd5\x02+\xfd\xa8\xcb\xfdm\x02V\xfd\xaa\x02\x93\x00\x00\ +\x01\x00\x19\x00\x00\x04N\x04R\x00\x11\x00E@%\x0c\ +\x0b\x05\x06\x03\x02\x0e\x0f\x02\x04\x06\x09\x0b\x0d\x0f\x11\x08\ +\x13\x12\x0d\x0a\x11\x00\x11HY\x04\x07\x00\x00\x0f\x05\x02\ +\x0f\x0c\x0f\x15\x00?3?3\x129/33+\x11\ +\x0033\x11\x12\x01\x179\x113\x113\x113\x113\ +10\x133\x01!\x13\x13!\x013\x15#\x01!\x01\ +\x01!\x01#m\xf5\xfe\xc9\x01\x0c\xfc\xfe\x01\x0a\xfe\xc7\ +\xfa\xf8\x01J\xfe\xf6\xfe\xef\xfe\xf0\xfe\xf6\x01G\xf3\x02\ +\x8f\x01\xc3\xfe}\x01\x83\xfe=\xb4\xfe%\x01\x9e\xfeb\ +\x01\xdb\x00\x00\x02\x00o\x00\x00\x04L\x05\xb6\x00\x0a\x00\ +\x13\x002@\x19\x0a\x13\x13\x02\x0f\x06\x06\x02\x15\x14\x09\ +\x0cLY\x09\x09\x03\x00\x03\x03\x12LY\x03\x12\x00?\ ++\x00\x18?\x129/+\x11\x12\x0199\x113\x11\ +3\x11310\x013\x11! $54$!3\ +\x15#\x22\x06\x15\x14\x1633\x03\x5c\xf0\xfe\x5c\xfe\xe6\ +\xfe\xe1\x01,\x01!\xa0\x85\xc8\xab\xa9\xaf\xa0\x05\xb6\xfa\ +J\xdd\xd9\xd3\xdb\xc8nx}p\x00\xff\xff\x00f\xff\ +\xec\x04T\x06\x14\x02\x06\x00G\x00\x00\x00\x02\x00o\xff\ +\xec\x06\x98\x05\xb6\x00\x18\x00\x22\x00R@)\x0f\x10\x17\ +\x0a\x07\x22\x22\x0a\x1d\x03\x03\x10\x0a\x03$#\x17\x00\x08\ +\x10\x10#\x08\x06\x1aLY\x06\x06#\x08\x03\x0c\x1f\x00\ +\x1fLY\x14\x00\x13\x00?2+\x11\x003\x18?\x12\ +9/+\x11\x12\x009\x18/\x11\x129\x11\x12\x01\x17\ +9\x113\x113\x113\x129\x11310\x05\x22&\ +54$!3\x113\x11\x16325\x113\x11\x14\ +\x06#\x22&'\x06\x11#\x22\x06\x15\x143265\ +\x02?\xe6\xea\x01+\x01\x16\x81\xf0\x04\xc2\xc3\xee\xe2\xd1\ +s\xaf+gn\xba\xa5\xecjw\x12\xe0\xd4\xd9\xe9\x02\ +R\xfb\xb7\xb7\xe0\x01\xba\xfe#\xb9\xceSH\x99\x02\xac\ +z\x80\xea_S\x00\x02\x00f\xff\xec\x06\xa8\x06\x14\x00\ +\x1f\x00+\x00R@+\x15\x16\x1d\x0e#\x09\x0c\x0c\x0e\ +)\x03\x03\x0e\x16\x03-,\x09\x1d\x06\x15\x15\x00\x06\x0c\ +\x00\x06'FY\x06\x10\x1a\x11FY\x00 FY\x1a\ +\x00\x16\x00?2++\x00\x18?+\x00\x18?\x11\x12\ +9/\x1199\x11\x12\x01\x179\x113\x113\x113\ +3\x129\x11310\x05\x22\x02\x11\x10\x1232\x17\ +3&5\x113\x11\x14\x163265\x113\x11\x14\ +\x06#\x22&'\x06\x06'26754&#\x22\ +\x11\x14\x16\x02D\xe6\xf8\xe1\xc9\xd1m\x0c\x10\xeb^i\ +fZ\xec\xd5\xd3y\x9b@:\xbch\x86~\x02\x7f\x89\ +\xf4v\x14\x01)\x01\x12\x01\x0e\x011\xa1pL\x01\x93\ +\xfbywfv|\x01\x1a\xfe\xbf\xc4\xc9GaPZ\ +\xbe\xa1\xb9!\xd2\xaf\xfe}\xbd\xbc\x00\x00\x01\x003\xff\ +\xec\x06\x8f\x05\xcb\x00)\x00P@*\x06\x12 !(\ +\x19\x01\x0d\x12\x16\x19!\x06+* %\x0f\x15\x01\ +\x02\x02\x01KY\x02\x02*\x0f\x0f\x09KY\x0f\x04%\ +\x1cLY%\x13\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x12\x009\x11\x129\x18/\x11\x12\x01\x17\ +9\x113\x113\x11310\x01#53265\ +4&#\x22\x06\x07'6!2\x04\x15\x14\x06\x07\x15\ +\x16\x16\x17\x16\x163265\x113\x11\x14\x06#\x22\ +&'4\x01\x8d\xba\xb6\xb7\xc0\x85wY\xa5\x5cw\xc9\ +\x01\x14\xdc\x01\x04\xab\x99\xae\xb6\x02\x02`gi`\xeb\ +\xdf\xd5\xd8\xe2\x02\x02\x96\xb4\x7ftah3=\xa1\x94\ +\xbf\xa6\x8b\xba\x1f\x08\x17\xae\x95~lp|\x01\xae\xfe\ ++\xc4\xcb\xdb\xd1\xfe\x00\x00\x01\x00D\xff\xec\x06\x10\x04\ +f\x00&\x00P@*\x14\x1f\x04\x05\x0b%\x05\x0f\x19\ +\x1f\x22%\x06('\x04\x04\x08\x1c!\x0f\x10\x10\x0fH\ +Y\x10\x10'\x1c\x1c\x16GY\x1c\x10\x08\x00FY\x08\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x009\x11\x129\x18/\x11\x12\x01\x179\x113\x11\ +3\x11310%265\x113\x11\x10!\x22&\ +'&&##532654#\x22\x07'6\ +632\x16\x15\x14\x07\x15\x16\x16\x17\x16\x04fe\x5c\ +\xe9\xfeX\xcd\xe1\x02\x03\x94\x89\x94\x81\x96\x8d\xd1\xa7\xa3\ +I_\xc0z\xc0\xe4\xc9j}\x03\x04\xb0v|\x01\x1a\ +\xfe\xbf\xfeq\xa2\x97g[\xb1GJ\x87H\xaf*%\ +\x9c\x88\xbb9\x08\x14ue\xa8\x00\x01\x003\xfem\x05\ +!\x05\xcb\x00\x22\x00J@(\x17\x00\x0d\x08\x0c\x09\x00\ +\x04\x08\x09\x13\x1d\x06$#\x03\x12\x13\x13\x12KY\x13\ +\x13\x0d \x0b# \x1aKY \x04\x0d\x08LY\x0d\ +\x12\x00?+\x00\x18?+\x00\x18?\x11\x129/+\ +\x11\x12\x009\x11\x12\x01\x179\x113\x113\x1131\ +0\x01\x14\x06\x07\x15\x16\x16\x15\x153\x11#\x11#\x11\ +4&##532654&#\x22\x07'6\ +632\x04\x04\x12\xab\xa2\xb4\xbc\xec\xe6\xf1\xf5\xf1\x91\ +\xc3\xc2\xcf\x8d\x7f\xbc\xb5wc\xfe\x8f\xe5\x01\x0a\x04f\ +\x89\xb9\x22\x06\x17\xb1\x92\xd1\xfd\x9c\x01\x93\x01\xa2\x82r\ +\xb4}v`ip\xa1HL\xc1\x00\x00\x01\x00N\xfe\ +{\x04\x9e\x04f\x00\x1f\x00J@(\x18\x15\x19\x14\x03\ +\x0d\x08\x0d\x10\x14\x15\x1e\x06! \x0f\x1e\x1f\x1f\x1eH\ +Y\x1f\x1f\x19\x0a\x17\x22\x0a\x05GY\x0a\x10\x19\x14G\ +Y\x19\x15\x00?+\x00\x18?+\x00\x18?\x11\x129\ +/+\x11\x12\x009\x11\x12\x01\x179\x113\x113\x11\ +310\x012654#\x22\x07'632\x16\ +\x15\x14\x07\x15\x16\x16\x15\x153\x11#\x11#\x114&\ +##5\x01\x98\xa1\x98\xe1\xb6\xa0L\xbd\xeb\xc5\xeb\xcf\ +~r\xd7\xdb\xe0\x98\x9f\x9e\x02\x98GJ\x87H\xafO\ +\x9d\x87\xbb9\x0a!\x83i\x81\xfd\xc5\x01\x85\x019X\ +V\xb1\x00\x00\x01\x00\x08\xff\xe9\x07Z\x05\xb6\x00!\x00\ +C@#\x08\x09\x11\x00\x12!\x00\x09\x1a!\x04#\x22\ +\x08\x08\x18!!\x12LY!\x03\x0d\x04LY\x0d\x13\ +\x18\x1dLY\x18\x13\x00?+\x00\x18?+\x00\x18?\ ++\x11\x12\x009\x18/\x11\x12\x01\x179\x113\x113\ +\x11310\x01\x11\x14\x163265\x113\x11\x14\ +\x06#\x22&5\x11!\x07\x02\x02\x06\x06#\x22'5\ +\x16326\x12\x13\x04\xe5_ff_\xeb\xde\xd2\xd7\ +\xdd\xfe\x85\x1d/FZ\x8fmIB96HSf\ +<\x05\xb6\xfb\xc7i^rz\x01\xae\xfe+\xc2\xcd\xc7\ +\xc6\x03p\xdf\xfe\x8c\xfez\xc8_\x19\xc7\x19\xb3\x02w\ +\x01\xdc\x00\x00\x01\x00\x08\xff\xec\x06\x85\x04R\x00\x1d\x00\ +C@#\x07\x08\x0e\x00\x10\x1c\x00\x08\x17\x1c\x04\x1f\x1e\ +\x07\x07\x14\x1c\x1c\x10GY\x1c\x0f\x0b\x03FY\x0b\x16\ +\x14\x19FY\x14\x16\x00?+\x00\x18?+\x00\x18?\ ++\x11\x12\x009\x18/\x11\x12\x01\x179\x113\x113\ +\x11310\x01\x14\x163265\x113\x11\x10!\ +\x22&5\x11!\x02\x02\x06#\x22'5\x1632\x12\ +\x13!\x04\x1d[g`]\xe9\xfe\x5c\xd5\xdb\xfe\xe6\x1c\ +_\x98{R/%%av#\x02\xd1\x01}id\ +v|\x01\x1a\xfe\xbf\xfeq\xc7\xc6\x02\x1f\xfe\x9c\xfeq\ +\xb5\x14\xba\x0e\x01\xaa\x01\xf8\x00\x00\x01\x00\xc1\xff\xec\x07\ +\x83\x05\xb6\x00\x18\x00K@&\x14\x15\x0a\x02\x02\x0d\x09\ +\x05\x05\x06\x06\x0d\x15\x03\x1a\x19\x14\x14\x06\x07\x09\x04L\ +Y\x09\x09\x06\x0b\x07\x03\x06\x12\x00\x10LY\x00\x13\x00\ +?+\x00\x18??3\x129/+\x11\x12\x009\x18\ +/\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +10\x05 \x03\x11!\x11#\x113\x11!\x113\x11\ +\x14\x163265\x113\x11\x14\x06\x05\xd7\xfeV\x04\ +\xfd\x87\xef\xef\x02y\xf0Zdf[\xeb\xdc\x14\x01\x8d\ +\x01\x1a\xfdm\x05\xb6\xfd\xaa\x02V\xfb\xcbjarz\ +\x01\xae\xfe+\xc3\xcc\x00\x00\x01\x00\xa8\xff\xec\x06\xd5\x04\ +R\x00\x18\x00K@&\x02\x13\x13\x05\x0c\x0d\x01\x16\x16\ +\x17\x05\x0d\x17\x03\x1a\x19\x0c\x0c\x17\x18\x01\x15GY\x01\ +\x01\x17\x03\x18\x0f\x17\x15\x10\x08FY\x10\x16\x00?+\ +\x00\x18??3\x129/+\x11\x12\x009\x18/\x11\ +\x12\x01\x179\x113\x113\x113\x113\x11310\ +\x01\x11!\x113\x11\x14\x163265\x113\x11\x10\ +!\x22&'5!\x11#\x11\x01\x93\x01\xf2\xec^d\ +^[\xe9\xfe^\xd3\xd9\x02\xfe\x0e\xeb\x04R\xfeD\x01\ +\xbc\xfd+idv|\x01\x1a\xfe\xbf\xfeq\xca\xc3d\ +\xfe#\x04R\x00\x00\x01\x00y\xff\xec\x05\xc5\x05\xcb\x00\ +\x1b\x00:@\x1f\x1a\x01\x13\x07\x00\x01\x07\x0d\x04\x1d\x1c\ +\x00\x1bLY\x00\x00\x04\x0b\x0b\x10LY\x0b\x04\x04\x16\ +LY\x04\x13\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x01\x179\x113\x11310\x01!\x15\ +\x10! \x00\x114\x12$3 \x17\x07&#\x22\x02\ +\x11\x10\x1232655!\x03N\x02w\xfd\x7f\xfe\ +\xab\xfe\x8a\xb1\x01Q\xe7\x01\x08\xcfV\xc8\xc7\xe4\xfd\xf6\ +\xe1\xb9\xc6\xfe\x85\x03\x12h\xfdB\x01\x8e\x01c\xe5\x01\ +S\xb6c\xc6\x5c\xfe\xdf\xfe\xfc\xfe\xf8\xfe\xe5\xc8\xc0\x08\ +\x00\x00\x01\x00f\xff\xec\x04\xd1\x04f\x00\x1b\x00:@\ +\x1f\x1a\x01\x14\x08\x00\x01\x08\x0d\x04\x1d\x1c\x00\x1bGY\ +\x00\x00\x05\x0b\x0b\x11FY\x0b\x10\x05\x17GY\x05\x16\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x01\x179\x113\x11310\x01!\x15\x10\x00! \ +\x00\x11\x10\x00!2\x17\x07&&#\x22\x06\x15\x14\x16\ +3265!\x02\xa4\x02-\xfe\xec\xfe\xf1\xfe\xe9\xfe\ +\xcf\x01G\x01$\xe2\xb3KJ\xb5M\xb9\xbe\xaa\xa8\x96\ +\xa1\xfe\xc3\x02jO\xfe\xe9\xfe\xe8\x01)\x01\x10\x01\x15\ +\x01,R\xb6\x22(\xc4\xc1\xb9\xc2\x8a\x80\x00\x00\x01\x00\ +\x1d\xff\xec\x05+\x05\xb6\x00\x15\x009@\x1d\x07\x08\x00\ +\x0f\x08\x0f\x11\x14\x04\x17\x16\x07\x07\x0c\x12\x15\x11\x12\x11\ +LY\x12\x03\x0c\x03LY\x0c\x13\x00?+\x00\x18?\ ++\x11\x003\x11\x129\x18/\x11\x12\x01\x179\x113\ +\x11310\x01\x14\x163265\x113\x11\x14\x06\ +#\x22&5\x11!5!\x15!\x02\xb2cdd`\ +\xee\xe3\xcf\xd7\xdf\xfeZ\x04E\xfeP\x01\x81jas\ +y\x01\xae\xfe+\xc4\xcb\xc8\xc5\x03n\xcf\xcf\x00\x01\x00\ ++\xff\xec\x04\xe5\x04R\x00\x14\x009@\x1d\x10\x11\x0a\ +\x03\x03\x05\x08\x11\x04\x16\x15\x10\x10\x00\x06\x09\x05\x06\x05\ +GY\x06\x0f\x00\x0dFY\x00\x16\x00?+\x00\x18?\ ++\x11\x003\x11\x129\x18/\x11\x12\x01\x179\x113\ +\x11310\x05\x22&5\x11!5!\x15!\x11\x14\ +\x16325\x113\x11\x14\x06\x03?\xd3\xdd\xfe\x9c\x03\ +\xb4\xfe\x9c^f\xbd\xe9\xd3\x14\xc8\xc5\x02!\xb8\xb8\xfd\ +\xe5je\xf2\x01\x1a\xfe\xbf\xc5\xca\x00\x00\x01\x00b\xff\ +\xec\x04\x93\x05\xcb\x00&\x00C@$\x0e\x00\x16 \x00\ +\x07\x11\x1b #\x06('$\x13\x10\x10\x13KY\x10\ +\x10\x1d\x04\x04\x0bLY\x04\x04\x1d\x18LY\x1d\x13\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x00\ +9\x11\x12\x01\x179\x113\x11310\x13466\ +32\x16\x17\x07&&#\x22\x06\x15\x14!3\x15#\ +\x22\x06\x15\x14! 7\x15\x06! $5467\ +5&&\x8f~\xed\x9c\x9a\xf2qrb\xbff\x89\x92\ +\x01\xaa\xaa\xae\xe5\xea\x01h\x01\x09\xc4\xb8\xfe\xdd\xfe\xe9\ +\xfe\xc9\xcc\xbb\xa5\xb5\x04^j\xa6]FL\xae?8\ +e`\xe7\xc0zv\xf2^\xd9M\xe4\xc6\x93\xbd\x14\x08\ +\x1a\xb5\x00\x00\x01\x00T\xff\xec\x03\xd5\x04f\x00!\x00\ +C@$\x1e\x14\x04\x0e\x01\x08\x0e\x11\x14\x19\x06#\x22\ +\x12\x02!!\x02HY!!\x0b\x17\x17\x1cGY\x17\ +\x10\x0b\x06GY\x0b\x16\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x009\x11\x12\x01\x179\x113\ +\x11310\x01\x15# \x15\x14!27\x15\x06#\ +\x22$54675&54632\x17\x07&\ +#\x22\x15\x14\x163\x03\x08\x9e\xfe\xd3\x01\x13\xc7\xbc\x98\ +\xf5\xf2\xff\x00{\x85\xd1\xf3\xd2\xda\xb3H\xa5\x9e\xee\x91\ +\x98\x02\x98\xb1\xa8\x99V\xc5K\xa9\x9ai\x83 \x0b6\ +\xc8\x87\x9bO\xafH\x85LG\xff\xff\x00\x08\xfeD\x05\ +\xe6\x05\xb6\x00&\x01\xb5\x00\x00\x00\x07\x03\x80\x04\x19\x00\ +\x00\xff\xff\x00\x08\xfeD\x05\x11\x04R\x00&\x01\xd5\x00\ +\x00\x00\x07\x03\x81\x03D\x00\x00\xff\xff\x00\x00\xfey\x05\ +J\x05\xbc\x02&\x00$\x00\x00\x00\x07\x02g\x05\x17\x00\ +\x00\xff\xff\x00Z\xfey\x04\x04\x04f\x02&\x00D\x00\ +\x00\x00\x07\x02g\x04\xa0\x00\x00\xff\xff\x00\x00\x00\x00\x05\ +J\x07\xec\x02&\x00$\x00\x00\x01\x07\x02f\x05\x0e\x01\ +R\x00\x08\xb3\x02\x14\x05&\x00+5\xff\xff\x00Z\xff\ +\xec\x04\x04\x06\x9a\x02&\x00D\x00\x00\x01\x07\x02f\x04\ +\xb8\x00\x00\x00\x08\xb3\x02+\x11&\x00+5\xff\xff\x00\ +\x00\x00\x00\x05J\x07\xd1\x02&\x00$\x00\x00\x01\x07\x03\ +w\x05\x02\x01R\x00\x0a\xb4\x03\x02\x16\x05&\x00+5\ +5\xff\xff\x00Z\xff\xec\x04\xa0\x06\x7f\x02&\x00D\x00\ +\x00\x01\x07\x03w\x04\xac\x00\x00\x00\x0a\xb4\x03\x02-\x11\ +&\x00+55\xff\xff\x00\x00\x00\x00\x05J\x07\xd1\x02\ +&\x00$\x00\x00\x01\x07\x03x\x04\xfe\x01R\x00\x0a\xb4\ +\x03\x02\x1d\x05&\x00+55\xff\xff\x00\x00\xff\xec\x04\ +\x04\x06\x7f\x02&\x00D\x00\x00\x01\x07\x03x\x04\xac\x00\ +\x00\x00\x0a\xb4\x03\x024\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05J\x08J\x02&\x00$\x00\x00\x01\x07\x03\ +y\x04\xfc\x01R\x00\x0a\xb4\x03\x02\x16\x05&\x00+5\ +5\xff\xff\x00Z\xff\xec\x04^\x06\xf8\x02&\x00D\x00\ +\x00\x01\x07\x03y\x04\xb2\x00\x00\x00\x0a\xb4\x03\x02-\x11\ +&\x00+55\xff\xff\x00\x00\x00\x00\x05J\x08b\x02\ +&\x00$\x00\x00\x01\x07\x03z\x05\x00\x01R\x00\x0a\xb4\ +\x03\x02.\x05&\x00+55\xff\xff\x00Z\xff\xec\x04\ +\x04\x07\x10\x02&\x00D\x00\x00\x01\x07\x03z\x04\xaa\x00\ +\x00\x00\x0a\xb4\x03\x02E\x11&\x00+55\xff\xff\x00\ +\x00\xfey\x05J\x07s\x02&\x00$\x00\x00\x00'\x02\ +g\x05\x17\x00\x00\x01\x07\x01K\x00B\x01R\x00\x08\xb3\ +\x03 \x05&\x00+5\xff\xff\x00Z\xfey\x04\x04\x06\ +!\x02&\x00D\x00\x00\x00'\x02g\x04\xa6\x00\x00\x01\ +\x06\x01K\xe8\x00\x00\x08\xb3\x037\x11&\x00+5\xff\ +\xff\x00\x00\x00\x00\x05J\x08\x13\x02&\x00$\x00\x00\x01\ +\x07\x03{\x05\x0a\x01R\x00\x0a\xb4\x03\x02\x18\x05&\x00\ ++55\xff\xff\x00Z\xff\xec\x04\x04\x06\xc1\x02&\x00\ +D\x00\x00\x01\x07\x03{\x04\xb2\x00\x00\x00\x0a\xb4\x03\x02\ +/\x11&\x00+55\xff\xff\x00\x00\x00\x00\x05J\x08\ +\x13\x02&\x00$\x00\x00\x01\x07\x03|\x05\x08\x01R\x00\ +\x0a\xb4\x03\x02\x18\x05&\x00+55\xff\xff\x00Z\xff\ +\xec\x04\x04\x06\xc1\x02&\x00D\x00\x00\x01\x07\x03|\x04\ +\xb0\x00\x00\x00\x0a\xb4\x03\x02/\x11&\x00+55\xff\ +\xff\x00\x00\x00\x00\x05J\x08X\x02&\x00$\x00\x00\x01\ +\x07\x03}\x05\x08\x01R\x00\x0a\xb4\x03\x02\x22\x05&\x00\ ++55\xff\xff\x00Z\xff\xec\x04\x04\x07\x06\x02&\x00\ +D\x00\x00\x01\x07\x03}\x04\xb6\x00\x00\x00\x0a\xb4\x03\x02\ +9\x11&\x00+55\xff\xff\x00\x00\x00\x00\x05J\x08\ +`\x02&\x00$\x00\x00\x01\x07\x03~\x05\x04\x01R\x00\ +\x0a\xb4\x03\x02(\x05&\x00+55\xff\xff\x00Z\xff\ +\xec\x04\x04\x07\x0e\x02&\x00D\x00\x00\x01\x07\x03~\x04\ +\xb2\x00\x00\x00\x0a\xb4\x03\x02?\x11&\x00+55\xff\ +\xff\x00\x00\xfey\x05J\x07b\x02&\x00$\x00\x00\x00\ +'\x01N\x00B\x01Z\x01\x07\x02g\x05\x17\x00\x00\x00\ +\x08\xb3\x02\x10\x05&\x00+5\xff\xff\x00Z\xfey\x04\ +\x04\x06\x08\x02&\x00D\x00\x00\x00&\x01N\xea\x00\x01\ +\x07\x02g\x04\xa0\x00\x00\x00\x08\xb3\x02'\x11&\x00+\ +5\xff\xff\x00\xc1\xfey\x03\xfc\x05\xb6\x02&\x00(\x00\ +\x00\x00\x07\x02g\x04\xcd\x00\x00\xff\xff\x00f\xfey\x04\ +9\x04f\x02&\x00H\x00\x00\x00\x07\x02g\x04\xcb\x00\ +\x00\xff\xff\x00\xc1\x00\x00\x03\xfc\x07\xec\x02&\x00(\x00\ +\x00\x01\x07\x02f\x04\xcb\x01R\x00\x08\xb3\x01\x10\x05&\ +\x00+5\xff\xff\x00f\xff\xec\x049\x06\x9a\x02&\x00\ +H\x00\x00\x01\x07\x02f\x04\xd1\x00\x00\x00\x08\xb3\x02 \ +\x11&\x00+5\xff\xff\x00\xc1\x00\x00\x03\xfc\x07H\x02\ +&\x00(\x00\x00\x01\x07\x01R\xff\xea\x01R\x00\x08\xb3\ +\x01\x14\x05&\x00+5\xff\xff\x00f\xff\xec\x049\x05\ +\xf6\x02&\x00H\x00\x00\x01\x06\x01R\xe6\x00\x00\x08\xb3\ +\x02$\x11&\x00+5\xff\xff\x00\xc1\x00\x00\x04\xb2\x07\ +\xd1\x02&\x00(\x00\x00\x01\x07\x03w\x04\xbe\x01R\x00\ +\x0a\xb4\x02\x01\x12\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x04\xb0\x06\x7f\x02&\x00H\x00\x00\x01\x07\x03w\x04\ +\xbc\x00\x00\x00\x0a\xb4\x03\x02\x22\x11&\x00+55\xff\ +\xff\x00\x15\x00\x00\x03\xfc\x07\xd1\x02&\x00(\x00\x00\x01\ +\x07\x03x\x04\xc1\x01R\x00\x0a\xb4\x02\x01\x19\x05&\x00\ ++55\xff\xff\x00\x15\xff\xec\x049\x06\x7f\x02&\x00\ +H\x00\x00\x01\x07\x03x\x04\xc1\x00\x00\x00\x0a\xb4\x03\x02\ +)\x11&\x00+55\xff\xff\x00\xc1\x00\x00\x04h\x08\ +J\x02&\x00(\x00\x00\x01\x07\x03y\x04\xbc\x01R\x00\ +\x0a\xb4\x02\x01\x12\x05&\x00+55\xff\xff\x00f\xff\ +\xec\x04b\x06\xf8\x02&\x00H\x00\x00\x01\x07\x03y\x04\ +\xb6\x00\x00\x00\x0a\xb4\x03\x02\x22\x11&\x00+55\xff\ +\xff\x00\xc1\x00\x00\x03\xfc\x08b\x02&\x00(\x00\x00\x01\ +\x07\x03z\x04\xba\x01R\x00\x0a\xb4\x02\x01*\x05&\x00\ ++55\xff\xff\x00f\xff\xec\x049\x07\x10\x02&\x00\ +H\x00\x00\x01\x07\x03z\x04\xb6\x00\x00\x00\x0a\xb4\x03\x02\ +:\x11&\x00+55\xff\xff\x00\xc1\xfey\x03\xfc\x07\ +s\x02&\x00(\x00\x00\x00'\x02g\x04\xcd\x00\x00\x01\ +\x07\x01K\xff\xfb\x01R\x00\x08\xb3\x02\x1c\x05&\x00+\ +5\xff\xff\x00f\xfey\x049\x06!\x02&\x00H\x00\ +\x00\x00'\x02g\x04\xc7\x00\x00\x01\x06\x01K\xf3\x00\x00\ +\x08\xb3\x03,\x11&\x00+5\xff\xff\x00J\x00\x00\x02\ +\x98\x07\xec\x02&\x00,\x00\x00\x01\x07\x02f\x03\xdb\x01\ +R\x00\x08\xb3\x01\x10\x05&\x00+5\xff\xff\x00w\x00\ +\x00\x02\x10\x06\x9a\x02&\x00\xf3\x00\x00\x01\x07\x02f\x03\ +\x87\x00\x00\x00\x08\xb3\x01\x08\x11&\x00+5\xff\xff\x00\ +J\xfey\x02\x98\x05\xb6\x02&\x00,\x00\x00\x00\x07\x02\ +g\x03\xe1\x00\x00\xff\xff\x00\x97\xfey\x01\xa2\x05\xfa\x02\ +&\x00L\x00\x00\x00\x07\x02g\x03\x8d\x00\x00\xff\xff\x00\ +y\xfey\x05\xd3\x05\xcd\x02&\x002\x00\x00\x00\x07\x02\ +g\x05\x98\x00\x00\xff\xff\x00f\xfey\x04}\x04f\x02\ +&\x00R\x00\x00\x00\x07\x02g\x04\xdf\x00\x00\xff\xff\x00\ +y\xff\xec\x05\xd3\x07\xec\x02&\x002\x00\x00\x01\x07\x02\ +f\x05\x8f\x01R\x00\x08\xb3\x02\x1c\x05&\x00+5\xff\ +\xff\x00f\xff\xec\x04}\x06\x9a\x02&\x00R\x00\x00\x01\ +\x07\x02f\x04\xd9\x00\x00\x00\x08\xb3\x02\x1a\x11&\x00+\ +5\xff\xff\x00y\xff\xec\x05\xd3\x07\xd1\x02&\x002\x00\ +\x00\x01\x07\x03w\x05\x81\x01R\x00\x0a\xb4\x03\x02\x1e\x05\ +&\x00+55\xff\xff\x00f\xff\xec\x04\xbf\x06\x7f\x02\ +&\x00R\x00\x00\x01\x07\x03w\x04\xcb\x00\x00\x00\x0a\xb4\ +\x03\x02\x1c\x11&\x00+55\xff\xff\x00y\xff\xec\x05\ +\xd3\x07\xd1\x02&\x002\x00\x00\x01\x07\x03x\x05\x81\x01\ +R\x00\x0a\xb4\x03\x02%\x05&\x00+55\xff\xff\x00\ +!\xff\xec\x04}\x06\x7f\x02&\x00R\x00\x00\x01\x07\x03\ +x\x04\xcd\x00\x00\x00\x0a\xb4\x03\x02#\x11&\x00+5\ +5\xff\xff\x00y\xff\xec\x05\xd3\x08J\x02&\x002\x00\ +\x00\x01\x07\x03y\x05\x7f\x01R\x00\x0a\xb4\x03\x02\x1e\x05\ +&\x00+55\xff\xff\x00f\xff\xec\x04}\x06\xf8\x02\ +&\x00R\x00\x00\x01\x07\x03y\x04\xcb\x00\x00\x00\x0a\xb4\ +\x03\x02\x1c\x11&\x00+55\xff\xff\x00y\xff\xec\x05\ +\xd3\x08b\x02&\x002\x00\x00\x01\x07\x03z\x05\x7f\x01\ +R\x00\x0a\xb4\x03\x026\x05&\x00+55\xff\xff\x00\ +f\xff\xec\x04}\x07\x10\x02&\x00R\x00\x00\x01\x07\x03\ +z\x04\xcd\x00\x00\x00\x0a\xb4\x03\x024\x11&\x00+5\ +5\xff\xff\x00y\xfey\x05\xd3\x07s\x02&\x002\x00\ +\x00\x00'\x02g\x05\x98\x00\x00\x01\x07\x01K\x00\xc1\x01\ +R\x00\x08\xb3\x03(\x05&\x00+5\xff\xff\x00f\xfe\ +y\x04}\x06!\x02&\x00R\x00\x00\x00'\x02g\x04\ +\xe3\x00\x00\x01\x06\x01K\x0c\x00\x00\x08\xb3\x03&\x11&\ +\x00+5\xff\xff\x00y\xff\xec\x06\x9e\x07s\x02&\x02\ +_\x00\x00\x01\x07\x00v\x01!\x01R\x00\x08\xb3\x02(\ +\x05&\x00+5\xff\xff\x00f\xff\xec\x05s\x06!\x02\ +&\x02`\x00\x00\x01\x06\x00vu\x00\x00\x08\xb3\x02,\ +\x11&\x00+5\xff\xff\x00y\xff\xec\x06\x9e\x07s\x02\ +&\x02_\x00\x00\x01\x07\x00C\x00u\x01R\x00\x08\xb3\ +\x02(\x05&\x00+5\xff\xff\x00f\xff\xec\x05s\x06\ +!\x02&\x02`\x00\x00\x01\x06\x00C\xbd\x00\x00\x08\xb3\ +\x02#\x11&\x00+5\xff\xff\x00y\xff\xec\x06\x9e\x07\ +\xec\x02&\x02_\x00\x00\x01\x07\x02f\x05\x9a\x01R\x00\ +\x08\xb3\x02#\x05&\x00+5\xff\xff\x00f\xff\xec\x05\ +s\x06\x9a\x02&\x02`\x00\x00\x01\x07\x02f\x04\xdf\x00\ +\x00\x00\x08\xb3\x02'\x11&\x00+5\xff\xff\x00y\xff\ +\xec\x06\x9e\x07H\x02&\x02_\x00\x00\x01\x07\x01R\x00\ +\xb4\x01R\x00\x08\xb3\x02'\x05&\x00+5\xff\xff\x00\ +f\xff\xec\x05s\x05\xf6\x02&\x02`\x00\x00\x01\x06\x01\ +R\x04\x00\x00\x08\xb3\x02#\x11&\x00+5\xff\xff\x00\ +y\xfey\x06\x9e\x06\x14\x02&\x02_\x00\x00\x00\x07\x02\ +g\x05\x96\x00\x00\xff\xff\x00f\xfey\x05s\x04\xfa\x02\ +&\x02`\x00\x00\x00\x07\x02g\x04\xe3\x00\x00\xff\xff\x00\ +\xb4\xfey\x05;\x05\xb6\x02&\x008\x00\x00\x00\x07\x02\ +g\x05h\x00\x00\xff\xff\x00\x9e\xfey\x04m\x04R\x02\ +&\x00X\x00\x00\x00\x07\x02g\x04\xec\x00\x00\xff\xff\x00\ +\xb4\xff\xec\x05;\x07\xec\x02&\x008\x00\x00\x01\x07\x02\ +f\x05X\x01R\x00\x08\xb3\x01\x16\x05&\x00+5\xff\ +\xff\x00\x9e\xff\xec\x04m\x06\x9a\x02&\x00X\x00\x00\x01\ +\x07\x02f\x04\xe5\x00\x00\x00\x08\xb3\x01\x19\x11&\x00+\ +5\xff\xff\x00\xb4\xff\xec\x06\xd1\x07s\x02&\x02a\x00\ +\x00\x01\x07\x00v\x01\x02\x01R\x00\x08\xb3\x01#\x05&\ +\x00+5\xff\xff\x00\x9e\xff\xec\x06\x04\x06!\x02&\x02\ +b\x00\x00\x01\x07\x00v\x00\x91\x00\x00\x00\x08\xb3\x01(\ +\x11&\x00+5\xff\xff\x00\xb4\xff\xec\x06\xd1\x07s\x02\ +&\x02a\x00\x00\x01\x07\x00C\x007\x01R\x00\x08\xb3\ +\x01#\x05&\x00+5\xff\xff\x00\x9e\xff\xec\x06\x04\x06\ +!\x02&\x02b\x00\x00\x01\x06\x00C\xaf\x00\x00\x08\xb3\ +\x01\x1f\x11&\x00+5\xff\xff\x00\xb4\xff\xec\x06\xd1\x07\ +\xec\x02&\x02a\x00\x00\x01\x07\x02f\x05b\x01R\x00\ +\x08\xb3\x01\x1e\x05&\x00+5\xff\xff\x00\x9e\xff\xec\x06\ +\x04\x06\x9a\x02&\x02b\x00\x00\x01\x07\x02f\x04\xec\x00\ +\x00\x00\x08\xb3\x01#\x11&\x00+5\xff\xff\x00\xb4\xff\ +\xec\x06\xd1\x07H\x02&\x02a\x00\x00\x01\x07\x01R\x00\ +\x8b\x01R\x00\x08\xb3\x01\x22\x05&\x00+5\xff\xff\x00\ +\x9e\xff\xec\x06\x04\x05\xf6\x02&\x02b\x00\x00\x01\x06\x01\ +R\x19\x00\x00\x08\xb3\x01\x1f\x11&\x00+5\xff\xff\x00\ +\xb4\xfey\x06\xd1\x06\x14\x02&\x02a\x00\x00\x00\x07\x02\ +g\x05d\x00\x00\xff\xff\x00\x9e\xfey\x06\x04\x04\xfc\x02\ +&\x02b\x00\x00\x00\x07\x02g\x04\xe3\x00\x00\xff\xff\x00\ +\x00\xfey\x04\xbc\x05\xb6\x02&\x00<\x00\x00\x00\x07\x02\ +g\x04\xcd\x00\x00\xff\xff\x00\x00\xfe\x14\x04J\x04R\x02\ +&\x00\x5c\x00\x00\x00\x07\x02g\x05\xfa\xff\xff\xff\xff\x00\ +\x00\x00\x00\x04\xbc\x07\xec\x02&\x00<\x00\x00\x01\x07\x02\ +f\x04\xc1\x01R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\ +\xff\x00\x00\xfe\x14\x04J\x06\x9a\x02&\x00\x5c\x00\x00\x01\ +\x07\x02f\x04\x85\x00\x00\x00\x08\xb3\x01\x19\x11&\x00+\ +5\xff\xff\x00\x00\x00\x00\x04\xbc\x07H\x02&\x00<\x00\ +\x00\x01\x07\x01R\xff\xea\x01R\x00\x08\xb3\x01\x11\x05&\ +\x00+5\xff\xff\x00\x00\xfe\x14\x04J\x05\xf6\x02&\x00\ +\x5c\x00\x00\x01\x06\x01R\xb5\x00\x00\x08\xb3\x01\x1d\x11&\ +\x00+5\xff\xff\x00f\xfe\xc1\x04\xf0\x06\x14\x02&\x00\ +\xd3\x00\x00\x00\x07\x00B\x00\xc7\x00\x00\x00\x02\xfb\xb2\x04\ +\xd9\xfe\xcf\x06!\x00\x09\x00\x13\x00\x0e\xb4\x0e\x05\x80\x0a\ +\x00\x00/2\x1a\xcd210\x01&&'53\x16\ +\x16\x17\x15!&&'53\x16\x16\x17\x15\xfeND\ +\xc1\x1e\xf4\x1cc1\xfe\x06D\xc1\x1e\xf4\x1cc1\x04\ +\xd96\xca3\x15=\xaeD\x196\xca3\x15=\xaeD\ +\x19\x00\x02\xfcN\x04\xd9\xff\xf4\x06\x7f\x00\x0c\x00\x14\x00\ +\x19@\x0a\x03\x09\x14\x09\x14\x09\x10\xc0\x06\x01\x00/3\ +\x1a\xcc99//\x11310\x01#&'\x06\x07\ +#5673\x16\x17'673\x15\x06\x07#\xfe\ +\xf4\x7fpcra\x81\x9c=\xf6X\x7fTS2\xcf\ +E\x92}\x04\xd9K[eA\x19\xb5Y\x80\x8e\xc2c\ +h\x15\x5cr\x00\x00\x02\xfbT\x04\xd9\xfe\xf8\x06\x7f\x00\ +\x0d\x00\x15\x00\x19@\x0a\x0a\x03\x0f\x03\x0f\x03\x13\xc0\x0d\ +\x08\x00/3\x1a\xcc99//\x11310\x016\ +673\x16\x17\x15#&'\x06\x07#7#&'\ +53\x16\x17\xfcRpM\x1c\xf6X\x7f\x7farj\ +i\x81T{\x8bL\xcf5N\x04\xf2\x82c)\x80\x8e\ +\x19Ae`F\xc3ie\x15n]\x00\x02\xfcN\x04\ +\xd9\xff\xac\x06\xf8\x00\x0c\x00\x1d\x00!@\x10\x03\x09\x11\ +\x09\x11\x09\x17\x1c@\x0a\x0dH\x1c\xc0\x06\x01\x00/3\ +\x1a\xcc+299//\x11310\x01#&'\ +\x06\x07#5673\x16\x17\x13\x14\x07\x07#'6\ +654#\x22\x075632\xfe\xf4\x7fpcr\ +a\x81\x9c=\xf6X\x7f\xb8}\x06h\x0bA8Z%\ +#\x19=\xc9\x04\xd9K[eA\x19\xb5Y\x80\x8e\x01\ +tl\x1bGz\x07\x22\x1f7\x08i\x06\x00\x00\x02\xfc\ +R\x04\xd9\xfe\xf8\x07\x10\x00\x17\x00$\x00I\xb4\x09\x00\ +\x1b!!\xb8\xff\xc0\xb3\x1f\x22H!\xb8\xff\xc0@\x1e\ +\x11\x1bH\x11\x00\x05\x0c!\x00\x0c\x0c\x00!\x03\x1f\x15\ +/\x15?\x15\x03\x15@\x14\x17H\x15\xc0\x1e\x19\x00/\ +3\x1a\xcc+]\x179///\x113\x113++\ +\x113\x10\xc410\x01\x22.\x02#\x22\x06\x07#6\ +632\x1e\x0232673\x06\x06\x13#&'\ +\x06\x07#5673\x16\x17\xfe1$IEB\x1c\ +(*\x0ee\x08gR%KF@\x1a(*\x0ee\ +\x0bgxuzc[\x82w\xa9:\xe2C\x9e\x06)\ +\x1b!\x1c)1g\x80\x1c\x22\x1c+1l{\xfe\xb0\ +EYQM\x19\xafU`\xa4\x00\x02\xfcT\x04\xd9\xfe\ +\xe5\x06\xc1\x00\x07\x00\x15\x00\x1d@\x0e\x12\x0b\x07\x0b\x07\ +\x03@\x0a\x0eH\x03\xc0\x0f\x08\x00/3\x1a\xcc+9\ +9//310\x01673\x15\x06\x07#\x13\x22\ +&'3\x16\x1632673\x06\x06\xfdJJ1\ +\xc4ZsrP\x97\xa7\x08\x7f\x07]eWh\x09\x81\ +\x0a\xaf\x05\xf6ef\x15t[\xfe\xfc\x98\x93LIK\ +J\x8e\x9d\x00\x02\xfcT\x04\xd9\xfe\xe5\x06\xc1\x00\x07\x00\ +\x13\x00\x1d@\x0e\x10\x0b\x01\x0b\x01\x05@\x0a\x0eH\x05\ +\xc0\x0e\x08\x00/3\x1a\xcc+99//310\ +\x01#&'53\x16\x17\x03\x22&'3\x1632\ +73\x06\x06\xfd\xe7psZ\xc51GI\x97\xaa\x09\ +\x81\x0f\xba\xb6\x12\x7f\x0b\xa7\x05\xdd[t\x15k`\xfe\ +\xe3\x9d\x8e\x95\x95\x94\x97\x00\x02\xfcT\x04\xd9\xfe\xe5\x07\ +\x06\x00\x11\x00\x1d\x00.\xb1\x1a\x15\xb8\xff\xc0@\x17\x0f\ +\x12H\x15\x04\x15\x04\x0a\x1f\x0f/\x0f?\x0fo\x0f\x7f\ +\x0f\x05\x0f\xc0\x18\x12\x00/3\x1a\xcc]299/\ +/+310\x01\x14\x07\x07#'6654#\ +\x22\x075632\x16\x03\x22&'3\x16327\ +3\x06\x06\xfe1u\x06^\x0a91P)$\x13E\ +Ye\x93\x97\xaa\x09\x81\x0f\xba\xb6\x12\x7f\x0b\xa7\x06{\ +f\x1d)d\x09\x1e\x1d3\x06Z\x08D\xfe\x17\x9d\x8e\ +\x95\x95\x94\x97\x00\x00\x02\xfcT\x04\xd9\xfe\xf2\x07\x0e\x00\ +\x17\x00%\x00E@\x0a\x09\x00\x22\x1b\x0f\x1b\x01\x11\x00\ +\x00\xb8\xff\xc0@\x1c\x1f\x22H\x05\x0c\x1b\x00\x0c\x0c\x00\ +\x1b\x03\x1f\x15/\x15?\x15\x03\x15@\x13\x17H\x15\xc0\ +\x1f\x18\x00/3\x1a\xcc+]\x179///\x113\ ++\x113]\x113\x10\xc410\x01\x22.\x02#\x22\ +\x06\x07#6632\x1e\x0232673\x06\x06\ +\x03\x22&'3\x16\x1632673\x06\x06\xfe1\ +$IEB\x1c(*\x0ee\x08eT%KF@\ +\x1a(*\x0ee\x0be\xe4\x99\xa9\x08\x81\x07\x5cfc\ +\x5c\x09\x7f\x0b\xa8\x063\x1b!\x1c(2by\x1c\x22\ +\x1c+1hs\xfe\xa6\x94\x83C>>C\x8a\x8d\x00\ +\x01\x00\x1d\xfe+\x01\x85\x00\x00\x00\x12\x00\x1e@\x0e\x00\ +\x08\x03\x08\x0e\x03\x14\x13\x10`\x0b\x01\x0b\x04\x00//\ +]3\x11\x12\x01\x179\x11310\x174&'3\ +\x1e\x02\x15\x14\x06#\x22'5\x16326\xd5JE\ +\x97H>\x22yhFA6.%/\xe96qB\ +8IT-ar\x12\x90\x0f-\x00\x00\x01\x00\x14\xfe\ +D\x01\xcd\x00\xe3\x00\x0c\x00\x1e@\x0c\x08\x09\x09\x03\x0e\ +\x0d\x03\x05\x05\x00\x09\x0d\x11\x003/2\x10\xc6\x11\x12\ +\x0199\x11310\x13\x22'5\x16325\x11\ +3\x11\x14\x06\xaaQE78m\xdd\x96\xfeD\x18\xbd\ +\x13\x87\x01V\xfe\x9c\x9a\xa1\x00\x00\x01\x00\x14\xfeD\x01\ +\xcd\x00\xcb\x00\x0c\x00\x1e@\x0c\x08\x09\x09\x03\x0e\x0d\x03\ +\x05\x05\x00\x09\x0d\x11\x003/2\x10\xc6\x11\x12\x019\ +9\x11310\x13\x22'5\x16325\x113\x11\ +\x14\x06\xaaQE78m\xdd\x96\xfeD\x18\xbd\x13\x87\ +\x01>\xfe\xb4\x9a\xa1\x00\x00\x01\x00/\x00\x00\x02\xa2\x05\ +\xb6\x00\x0a\x00!@\x10\x00\x04\x08\x09\x04\x01\x01\x0c\x0b\ +\x04\x07\x01\x09\x06\x01\x18\x00??\x1299\x11\x12\x01\ +9\x11\x17310!#\x1147\x06\x06\x07'\x01\ +3\x02\xa2\xec\x08\x19N\xb1w\x01\xae\xc5\x03\xb0\xa9c\ +\x1aD\x8f\x95\x01R\x00\x00\x02\x00m\xff\xec\x04H\x04\ +}\x00\x0b\x00\x17\x00(@\x14\x12\x00\x0c\x06\x06\x00\x19\ +\x18\x09\x15MY\x09&\x03\x0fMY\x03\x19\x00?+\ +\x00\x18?+\x11\x12\x0199\x113\x11310\x01\ +\x10\x00#\x22\x00\x11\x10\x0032\x00\x01\x14\x1632\ +654&#\x22\x06\x04H\xfe\xfb\xed\xe8\xfe\xff\x01\ +\x06\xe9\xe9\x01\x03\xfd\x10\x83\x7f\x81\x7f\x80\x82\x81\x7f\x02\ +5\xfe\xed\xfe\xca\x013\x01\x16\x01\x13\x015\xfe\xcc\xfe\ +\xec\xbf\xca\xcf\xba\xba\xcd\xcd\x00\x00\x01\x005\x00\x00\x02\ +\xb6\x04h\x00\x0a\x00!@\x10\x00\x04\x08\x09\x04\x01\x01\ +\x0c\x0b\x04\x07\x01\x09\x10\x01\x18\x00??\x1299\x11\ +\x12\x019\x11\x17310!#\x1147\x06\x07\x07\ +'\x013\x02\xb6\xe9\x089D\xacw\x01\xb9\xc8\x02\x1d\ +\xc4\x8c<1{\x96\x01M\x00\x00\x01\x005\x00\x00\x04\ +\x0a\x04}\x00\x1a\x00+@\x17\x07\x14\x19\x02\x02\x0e\x14\ +\x1a\x04\x1c\x1b\x11\x0aMY\x11&\x01\x19NY\x01\x18\ +\x00?+\x00\x18?+\x11\x12\x01\x179\x113\x113\ +10!!5\x01>\x0254&#\x22\x06\x07'\ +6632\x16\x15\x14\x06\x07\x05\x17!\x04\x0a\xfc+\ +\x01\x81\xa9[)ne^\x9fP}x\xe3|\xcf\xe5\ +\x81\xb4\xfe\xfe\x02\x02n\xaa\x01\x19{YQ5GP\ +LA\x9ahT\xad\x9bv\xb8|\xb2\x0a\x00\x00\x01\x00\ +V\xfe\x9e\x04-\x04}\x00&\x00C@$\x1b\x00\x13\ +\x07\x00\x04\x07\x0d\x17\x22\x06('\x03\x17\x18\x18\x17O\ +Y\x18\x18\x0a$$\x1eMY$&\x0a\x10MY\x0a\ +%\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x009\x11\x12\x01\x179\x113\x11310\x01\x14\ +\x06\x07\x15\x16\x16\x15\x14\x04!\x22'5\x16\x1632\ +654&##53 54&#\x22\x06\x07\ +'6!2\x16\x04\x02\xa0\x95\xb0\xb0\xfe\xd6\xfe\xed\xf5\ +\xa5]\xd0`\xaa\xa8\xba\xc7\x7f\x81\x01^zwU\x9e\ +cs\xc9\x01\x0a\xdc\xf9\x03\x19\x8c\xb8!\x08\x16\xae\x92\ +\xd3\xe5P\xd0.2~\x84uo\xbe\xf2^f2@\ +\xa3\x94\xbd\x00\x02\x00\x17\xfe\xa8\x04o\x04h\x00\x0a\x00\ +\x13\x00A@\x22\x09\x02\x02\x07\x0b\x0f\x04\x03\x13\x06\x03\ +\x06\x0a\x03\x15\x14\x0f\x03\x07\x01\x05\x13\x05OY\x06\x09\ +\x13\x13\x03\x07\x10\x03$\x00??\x129/33+\ +\x11\x003\x11\x129\x11\x12\x01\x179\x113\x11\x173\ +\x11310%#\x11#\x11!5\x013\x113!\ +\x114\x127#\x06\x07\x01\x04o\xc5\xf2\xfd_\x02\xaa\ +\xe9\xc5\xfeT\x08\x04\x08-P\xfe\xa8\x1b\xfe\x8d\x01s\ +\xa3\x03\xaa\xfcm\x01\x1d:\x01\x008Vp\xfe7\x00\ +\x01\x00u\xfe\x9e\x04)\x04h\x00\x1c\x00<@ \x0f\ +\x03\x1a\x14\x15\x03\x09\x15\x18\x04\x1e\x1d\x00\x11MY\x00\ +\x00\x06\x16\x16\x19NY\x16\x10\x06\x0cMY\x06%\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x01\ +\x179\x1133\x11310\x012\x04\x15\x14\x00!\ +\x22'5\x16\x163265\x10!\x22\x06\x07'\x13\ +!\x15!\x0366\x02J\xde\x01\x01\xfe\xdb\xfe\xf2\xf6\ +\x8bL\xd7Z\x9f\xa6\xfe\xb2:\x8b(i8\x02\xf8\xfd\ +\xd7!#e\x02D\xec\xc9\xea\xfe\xf9P\xd5-4\x8e\ +\x89\x01\x06\x14\x0b>\x02\xca\xd0\xfe\x95\x06\x11\xff\xff\x00\ +^\xff\xec\x04?\x05\xc9\x02\x06\x00\x19\x00\x00\x00\x01\x00\ +J\xfe\xa8\x04=\x04h\x00\x06\x00+@\x15\x01\x05\x06\ +\x00\x00\x02\x05\x03\x08\x07\x00$\x05\x02\x03\x03\x02NY\ +\x03\x10\x00?+\x11\x12\x009\x18?\x11\x12\x01\x179\ +\x113\x11310\x01\x01!5!\x15\x01\x01\x00\x02\ +B\xfd\x08\x03\xf3\xfd\xc1\xfe\xa8\x04\xf2\xce\xa3\xfa\xe3\xff\ +\xff\x00X\xff\xec\x049\x05\xc9\x02\x06\x00\x1b\x00\x00\x00\ +\x02\x00V\xfe\xa0\x047\x04}\x00\x18\x00%\x00D@\ +#\x1c\x12\x22\x0b\x0b\x00\x00\x06\x12\x03'&\x0c\x0f\x15\ +\x0f\x1fOY\x0f\x0f\x03\x15\x15\x19MY\x15&\x03\x08\ +OY\x03%\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x009\x11\x12\x01\x179\x113\x113\x11\ +310\x01\x10\x00!\x22'5\x1632\x12\x13#\ +\x06\x06#\x22&54\x0032\x16\x12%\x22\x06\x15\ +\x14\x1632654&&\x047\xfe\xa4\xfe\xa2\x85\ +:YZ\xee\xea\x0b\x0c9\xa6s\xc1\xdf\x01\x01\xde\x9c\ +\xe8~\xfe\x02z\x82y{w\xa2D}\x01\xfa\xfeP\ +\xfeV\x10\xc5\x19\x01\x00\x01\x13YQ\xf0\xd4\xe5\x01\x0f\ +\x98\xfe\xdf\xf6\x9f\x90}\x8f\x8e`Y\x99[\xff\xff\x00\ +#\x00\x00\x06)\x06\x1f\x00&\x00I\x00\x00\x00\x07\x00\ +I\x02\xe7\x00\x00\x00\x02\x00V\x02\xdd\x05\x98\x05\xc1\x00\ +#\x004\x00_@12-00/4$,+\ +&(()\x0a\x00\x1e\x12\x05\x12\x17\x00),/\x07\ +65\x0a\x1e\x15\x08\x03\x030,$\x00)\x01)*\ +\x1b\x15\x152-&*\x03\x00?3333/3\ +\x10\xcd]2222/\xc5\x1299\x11\x12\x01\x17\ +9\x113\x113\x113\x1133\x1133\x113\x11\ +3310\x01\x14\x06#\x22'5\x163254\ +&&'.\x0254632\x17\x07&&#\x22\ +\x06\x15\x14\x16\x17\x16\x16\x01\x03#\x17\x11#\x113\x13\ +\x133\x11#\x117#\x03\x02/\x8ez\x83Nqf\ +w\x12'TQF\x22\x87ogn+*N20\ +=5UuI\x01\x98\xb9\x06\x04\x8d\xdb\xb0\xbb\xd3\x94\ +\x04\x06\xc0\x03\xae`q%\x7f/V\x19!\x1c%$\ +7H4Yn.p\x12\x17)%&/\x223\x5c\ +\xfe\xed\x02\x1fw\xfeX\x02\xd1\xfd\xea\x02\x16\xfd/\x01\ +\x9e\x81\xfd\xe1\x00\xff\xff\x00\x1d\xfe\x14\x04h\x05\xb6\x02\ +&\x007\x00\x00\x00\x07\x00z\x01d\x00\x00\xff\xff\x00\ +'\xfe\x14\x02\xf0\x05H\x02&\x00W\x00\x00\x00\x07\x00\ +z\x00\xf6\x00\x00\x00\x02\x00f\xfe\x14\x04T\x04f\x00\ +\x0b\x00&\x00J@'\x0a\x13\x18\x0d\x04\x1c\x1c!\x13\ +\x03'(!\x10\x1e\x1e#GY\x1e\x1b\x1a\x0f\x0d\x18\ +\x10\x16\x16\x07FY\x16\x10\x10\x00GY\x10\x16\x00?\ ++\x00\x18?+\x11\x12\x0099\x18??+\x11\x12\ +\x009\x11\x12\x01\x179\x11333\x11310%\ +26754&#\x22\x06\x15\x10\x057#\x06#\ +\x22\x02\x11\x10\x1232\x17373\x11\x10!\x22'\ +5\x163265\x02\x5c\x90\x81\x06\x84\x97}\x83\x02\ +\x10\x07\x09m\xdc\xcf\xe8\xeb\xd0\xd8v\x0a\x18\xc3\xfd\xf6\ +\xed\xa9\xb8\xe4\x83\x95\xa8\x9f\xb7)\xc8\xb7\xc4\xbd\xfe\x83\ +\xa0\x89\xa5\x01-\x01\x0e\x01\x0b\x014\xa3\x8f\xfb\xa4\xfe\ +\x1eD\xc9V\x93\x89\x00\xff\xff\x00f\xfe\x14\x04T\x06\ +!\x02&\x03\x91\x00\x00\x01\x06\x01K\x06\x00\x00\x08\xb3\ +\x023\x11&\x00+5\xff\xff\x00f\xfe\x14\x04T\x06\ +\x08\x02&\x03\x91\x00\x00\x01\x06\x01N\x00\x00\x00\x08\xb3\ +\x02'\x11&\x00+5\xff\xff\x00f\xfe\x14\x04T\x05\ +\xfa\x02&\x03\x91\x00\x00\x01\x07\x01O\x01F\x00\x00\x00\ +\x08\xb3\x020\x11&\x00+5\xff\xff\x00f\xfe\x14\x04\ +T\x06!\x02&\x03\x91\x00\x00\x01\x06\x02:w\x00\x00\ +\x08\xb3\x02+\x11&\x00+5\x00\x01\x00\xc1\x00\x00\x01\ +\xb0\x05\xb6\x00\x03\x00\x11\xb6\x00\x05\x04\x01\x03\x00\x12\x00\ +??\x11\x12\x019103\x113\x11\xc1\xef\x05\xb6\ +\xfaJ\x00\xff\xff\xff\xfa\x00\x00\x01\xe0\x07s\x02&\x03\ +\x96\x00\x00\x01\x07\x00C\xfe\x90\x01R\x00\x08\xb3\x01\x0d\ +\x05&\x00+5\xff\xff\x00\xb3\x00\x00\x02\x99\x07s\x02\ +&\x03\x96\x00\x00\x01\x07\x00v\xffI\x01R\x00\x08\xb3\ +\x01\x0d\x05&\x00+5\xff\xff\xff\xb5\x00\x00\x02\xb7\x07\ +s\x02&\x03\x96\x00\x00\x01\x07\x01K\xfe\xd2\x01R\x00\ +\x08\xb3\x01\x10\x05&\x00+5\xff\xff\x00\x01\x00\x00\x02\ +r\x07>\x02&\x03\x96\x00\x00\x01\x07\x00j\xfe\xdc\x01\ +R\x00\x0a\xb4\x02\x01\x19\x05&\x00+55\xff\xff\xff\ +\xb2\x00\x00\x02\xc4\x07H\x02&\x03\x96\x00\x00\x01\x07\x01\ +R\xfe\xc6\x01R\x00\x08\xb3\x01\x0c\x05&\x00+5\xff\ +\xff\xff\xfb\x00\x00\x02z\x06\xd9\x02&\x03\x96\x00\x00\x01\ +\x07\x01M\xfe\xd8\x01R\x00\x08\xb3\x01\x06\x05&\x00+\ +5\xff\xff\xff\xda\x00\x00\x02\x99\x07Z\x02&\x03\x96\x00\ +\x00\x01\x07\x01N\xfe\xd6\x01R\x00\x08\xb3\x01\x04\x05&\ +\x00+5\xff\xff\x00L\xfe+\x01\xbc\x05\xb6\x02&\x03\ +\x96\x00\x00\x00\x06\x01Q5\x00\xff\xff\x00\xb3\x00\x00\x01\ +\xbb\x07L\x02&\x03\x96\x00\x00\x01\x07\x01O\x00\x19\x01\ +R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\xff\x00\xc1\xfe\ +h\x04\x1b\x05\xb6\x00&\x03\x96\x00\x00\x00\x07\x00-\x02\ +q\x00\x00\xff\xff\xff\xc1\x00\x00\x02N\x05\xff\x00'\x03\ +\x96\x00\x9e\x00\x00\x00\x07\x01T\xfd\xd8\xff\x97\xff\xff\x00\ +\xc1\x00\x00\x01\xb0\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00\ +\x01\x00\x00\x02r\x07>\x02&\x03\x96\x00\x00\x01\x07\x00\ +j\xfe\xdc\x01R\x00\x0a\xb4\x02\x01\x19\x05&\x00+5\ +5\xff\xff\x00\xc1\x00\x00\x01\xb0\x05\xb6\x02\x06\x03\x96\x00\ +\x00\xff\xff\x00\x01\x00\x00\x02r\x07>\x02&\x03\x96\x00\ +\x00\x01\x07\x00j\xfe\xdc\x01R\x00\x0a\xb4\x02\x01\x19\x05\ +&\x00+55\xff\xff\x00\xc1\x00\x00\x01\xb0\x05\xb6\x02\ +\x06\x03\x96\x00\x00\xff\xff\x00\xc1\x00\x00\x01\xb0\x05\xb6\x02\ +\x06\x03\x96\x00\x00\xff\xff\x00\x92\x00\x00\x02+\x07\xec\x02\ +&\x03\x96\x00\x00\x01\x07\x02f\x03\xa2\x01R\x00\x08\xb3\ +\x01\x08\x05&\x00+5\xff\xff\x00\xb2\xfey\x01\xba\x05\ +\xb6\x02&\x03\x96\x00\x00\x00\x07\x02g\x03\xa8\x00\x00\x00\ +\x00\x00\x01\x00\x00\xb62\x00\x01I\x06\x80\x00\x00\x0e6\ +$\x00\x05\x00$\xffq\x00\x05\x007\x00)\x00\x05\x00\ +9\x00)\x00\x05\x00:\x00)\x00\x05\x00<\x00\x14\x00\ +\x05\x00D\xff\xae\x00\x05\x00F\xff\x85\x00\x05\x00G\xff\ +\x85\x00\x05\x00H\xff\x85\x00\x05\x00J\xff\xc3\x00\x05\x00\ +P\xff\xc3\x00\x05\x00Q\xff\xc3\x00\x05\x00R\xff\x85\x00\ +\x05\x00S\xff\xc3\x00\x05\x00T\xff\x85\x00\x05\x00U\xff\ +\xc3\x00\x05\x00V\xff\xc3\x00\x05\x00X\xff\xc3\x00\x05\x00\ +\x82\xffq\x00\x05\x00\x83\xffq\x00\x05\x00\x84\xffq\x00\ +\x05\x00\x85\xffq\x00\x05\x00\x86\xffq\x00\x05\x00\x87\xff\ +q\x00\x05\x00\x9f\x00\x14\x00\x05\x00\xa2\xff\x85\x00\x05\x00\ +\xa3\xff\xae\x00\x05\x00\xa4\xff\xae\x00\x05\x00\xa5\xff\xae\x00\ +\x05\x00\xa6\xff\xae\x00\x05\x00\xa7\xff\xae\x00\x05\x00\xa8\xff\ +\xae\x00\x05\x00\xa9\xff\x85\x00\x05\x00\xaa\xff\x85\x00\x05\x00\ +\xab\xff\x85\x00\x05\x00\xac\xff\x85\x00\x05\x00\xad\xff\x85\x00\ +\x05\x00\xb4\xff\x85\x00\x05\x00\xb5\xff\x85\x00\x05\x00\xb6\xff\ +\x85\x00\x05\x00\xb7\xff\x85\x00\x05\x00\xb8\xff\x85\x00\x05\x00\ +\xba\xff\x85\x00\x05\x00\xbb\xff\xc3\x00\x05\x00\xbc\xff\xc3\x00\ +\x05\x00\xbd\xff\xc3\x00\x05\x00\xbe\xff\xc3\x00\x05\x00\xc2\xff\ +q\x00\x05\x00\xc3\xff\xae\x00\x05\x00\xc4\xffq\x00\x05\x00\ +\xc5\xff\xae\x00\x05\x00\xc6\xffq\x00\x05\x00\xc7\xff\xae\x00\ +\x05\x00\xc9\xff\x85\x00\x05\x00\xcb\xff\x85\x00\x05\x00\xcd\xff\ +\x85\x00\x05\x00\xcf\xff\x85\x00\x05\x00\xd1\xff\x85\x00\x05\x00\ +\xd3\xff\x85\x00\x05\x00\xd5\xff\x85\x00\x05\x00\xd7\xff\x85\x00\ +\x05\x00\xd9\xff\x85\x00\x05\x00\xdb\xff\x85\x00\x05\x00\xdd\xff\ +\x85\x00\x05\x00\xdf\xff\xc3\x00\x05\x00\xe1\xff\xc3\x00\x05\x00\ +\xe3\xff\xc3\x00\x05\x00\xe5\xff\xc3\x00\x05\x00\xfa\xff\xc3\x00\ +\x05\x01\x06\xff\xc3\x00\x05\x01\x08\xff\xc3\x00\x05\x01\x0d\xff\ +\xc3\x00\x05\x01\x0f\xff\x85\x00\x05\x01\x11\xff\x85\x00\x05\x01\ +\x13\xff\x85\x00\x05\x01\x15\xff\x85\x00\x05\x01\x17\xff\xc3\x00\ +\x05\x01\x19\xff\xc3\x00\x05\x01\x1d\xff\xc3\x00\x05\x01!\xff\ +\xc3\x00\x05\x01$\x00)\x00\x05\x01&\x00)\x00\x05\x01\ ++\xff\xc3\x00\x05\x01-\xff\xc3\x00\x05\x01/\xff\xc3\x00\ +\x05\x011\xff\xc3\x00\x05\x013\xff\xc3\x00\x05\x015\xff\ +\xc3\x00\x05\x016\x00)\x00\x05\x018\x00\x14\x00\x05\x01\ +:\x00\x14\x00\x05\x01C\xffq\x00\x05\x01D\xff\xae\x00\ +\x05\x01F\xff\xae\x00\x05\x01H\xff\x85\x00\x05\x01J\xff\ +\xc3\x00\x05\x01V\xffq\x00\x05\x01_\xffq\x00\x05\x01\ +b\xffq\x00\x05\x01i\xffq\x00\x05\x01y\xff\xae\x00\ +\x05\x01z\xff\xd7\x00\x05\x01{\xff\xd7\x00\x05\x01~\xff\ +\xae\x00\x05\x01\x81\xff\xc3\x00\x05\x01\x82\xff\xd7\x00\x05\x01\ +\x83\xff\xd7\x00\x05\x01\x84\xff\xd7\x00\x05\x01\x87\xff\xd7\x00\ +\x05\x01\x89\xff\xd7\x00\x05\x01\x8c\xff\xae\x00\x05\x01\x8e\xff\ +\xc3\x00\x05\x01\x8f\xff\xae\x00\x05\x01\x90\xff\xae\x00\x05\x01\ +\x93\xff\xae\x00\x05\x01\x99\xff\xae\x00\x05\x01\xa4\xff\x85\x00\ +\x05\x01\xaa\xffq\x00\x05\x01\xae\xff\x85\x00\x05\x01\xb5\xff\ +\x85\x00\x05\x01\xca\xff\xd7\x00\x05\x01\xce\xffq\x00\x05\x01\ +\xcf\xff\x85\x00\x05\x01\xd5\xffq\x00\x05\x01\xd8\xff\x85\x00\ +\x05\x01\xdb\xff\x85\x00\x05\x01\xde\xff\x85\x00\x05\x01\xea\xff\ +\x85\x00\x05\x01\xed\xff\x85\x00\x05\x01\xee\xff\xc3\x00\x05\x01\ +\xf2\xffq\x00\x05\x01\xfa\x00)\x00\x05\x01\xfc\x00)\x00\ +\x05\x01\xfe\x00)\x00\x05\x02\x00\x00\x14\x00\x05\x02W\xff\ +\xc3\x00\x05\x02X\xffq\x00\x05\x02Y\xff\xae\x00\x05\x02\ +`\xff\x85\x00\x05\x02b\xff\xc3\x00\x05\x02j\xff\x85\x00\ +\x05\x02r\xffq\x00\x05\x02s\xffq\x00\x05\x02}\xff\ +\xec\x00\x05\x02\x7f\xff\x85\x00\x05\x02\x85\xff\x85\x00\x05\x02\ +\x87\xff\x85\x00\x05\x02\x89\xff\x85\x00\x05\x02\x8d\xff\x85\x00\ +\x05\x02\xb2\xff\x85\x00\x05\x02\xb4\xff\x85\x00\x05\x02\xce\xff\ +\x85\x00\x05\x02\xcf\xffq\x00\x05\x02\xd9\xffq\x00\x05\x02\ +\xda\xff\xd7\x00\x05\x02\xdb\xffq\x00\x05\x02\xdc\xff\xd7\x00\ +\x05\x02\xdd\xffq\x00\x05\x02\xde\xff\xd7\x00\x05\x02\xe0\xff\ +\x85\x00\x05\x02\xe2\xff\xd7\x00\x05\x02\xe4\xff\xd7\x00\x05\x02\ +\xf0\xff\x85\x00\x05\x02\xf2\xff\x85\x00\x05\x02\xf4\xff\x85\x00\ +\x05\x03\x09\xffq\x00\x05\x03\x0a\xff\x85\x00\x05\x03\x0b\xff\ +q\x00\x05\x03\x0c\xff\x85\x00\x05\x03\x11\xff\x85\x00\x05\x03\ +\x12\xffq\x00\x05\x03\x16\xff\x85\x00\x05\x03\x1a\xff\x85\x00\ +\x05\x03\x1b\xff\x85\x00\x05\x03\x1c\xffq\x00\x05\x03\x1d\xff\ +q\x00\x05\x03\x1e\xff\xae\x00\x05\x03\x1f\xffq\x00\x05\x03\ + \xff\xae\x00\x05\x03!\xffq\x00\x05\x03\x22\xff\xae\x00\ +\x05\x03#\xffq\x00\x05\x03%\xffq\x00\x05\x03&\xff\ +\xae\x00\x05\x03'\xffq\x00\x05\x03(\xff\xae\x00\x05\x03\ +)\xffq\x00\x05\x03*\xff\xae\x00\x05\x03+\xffq\x00\ +\x05\x03,\xff\xae\x00\x05\x03-\xffq\x00\x05\x03.\xff\ +\xae\x00\x05\x03/\xffq\x00\x05\x030\xff\xae\x00\x05\x03\ +1\xffq\x00\x05\x032\xff\xae\x00\x05\x033\xffq\x00\ +\x05\x034\xff\xae\x00\x05\x036\xff\x85\x00\x05\x038\xff\ +\x85\x00\x05\x03:\xff\x85\x00\x05\x03<\xff\x85\x00\x05\x03\ +@\xff\x85\x00\x05\x03B\xff\x85\x00\x05\x03D\xff\x85\x00\ +\x05\x03J\xff\x85\x00\x05\x03L\xff\x85\x00\x05\x03N\xff\ +\x85\x00\x05\x03R\xff\x85\x00\x05\x03T\xff\x85\x00\x05\x03\ +V\xff\x85\x00\x05\x03X\xff\x85\x00\x05\x03Z\xff\x85\x00\ +\x05\x03\x5c\xff\x85\x00\x05\x03^\xff\x85\x00\x05\x03`\xff\ +\x85\x00\x05\x03b\xff\xc3\x00\x05\x03d\xff\xc3\x00\x05\x03\ +f\xff\xc3\x00\x05\x03h\xff\xc3\x00\x05\x03j\xff\xc3\x00\ +\x05\x03l\xff\xc3\x00\x05\x03n\xff\xc3\x00\x05\x03o\x00\ +\x14\x00\x05\x03q\x00\x14\x00\x05\x03s\x00\x14\x00\x05\x03\ +\x8f\x00)\x00\x0a\x00$\xffq\x00\x0a\x007\x00)\x00\ +\x0a\x009\x00)\x00\x0a\x00:\x00)\x00\x0a\x00<\x00\ +\x14\x00\x0a\x00D\xff\xae\x00\x0a\x00F\xff\x85\x00\x0a\x00\ +G\xff\x85\x00\x0a\x00H\xff\x85\x00\x0a\x00J\xff\xc3\x00\ +\x0a\x00P\xff\xc3\x00\x0a\x00Q\xff\xc3\x00\x0a\x00R\xff\ +\x85\x00\x0a\x00S\xff\xc3\x00\x0a\x00T\xff\x85\x00\x0a\x00\ +U\xff\xc3\x00\x0a\x00V\xff\xc3\x00\x0a\x00X\xff\xc3\x00\ +\x0a\x00\x82\xffq\x00\x0a\x00\x83\xffq\x00\x0a\x00\x84\xff\ +q\x00\x0a\x00\x85\xffq\x00\x0a\x00\x86\xffq\x00\x0a\x00\ +\x87\xffq\x00\x0a\x00\x9f\x00\x14\x00\x0a\x00\xa2\xff\x85\x00\ +\x0a\x00\xa3\xff\xae\x00\x0a\x00\xa4\xff\xae\x00\x0a\x00\xa5\xff\ +\xae\x00\x0a\x00\xa6\xff\xae\x00\x0a\x00\xa7\xff\xae\x00\x0a\x00\ +\xa8\xff\xae\x00\x0a\x00\xa9\xff\x85\x00\x0a\x00\xaa\xff\x85\x00\ +\x0a\x00\xab\xff\x85\x00\x0a\x00\xac\xff\x85\x00\x0a\x00\xad\xff\ +\x85\x00\x0a\x00\xb4\xff\x85\x00\x0a\x00\xb5\xff\x85\x00\x0a\x00\ +\xb6\xff\x85\x00\x0a\x00\xb7\xff\x85\x00\x0a\x00\xb8\xff\x85\x00\ +\x0a\x00\xba\xff\x85\x00\x0a\x00\xbb\xff\xc3\x00\x0a\x00\xbc\xff\ +\xc3\x00\x0a\x00\xbd\xff\xc3\x00\x0a\x00\xbe\xff\xc3\x00\x0a\x00\ +\xc2\xffq\x00\x0a\x00\xc3\xff\xae\x00\x0a\x00\xc4\xffq\x00\ +\x0a\x00\xc5\xff\xae\x00\x0a\x00\xc6\xffq\x00\x0a\x00\xc7\xff\ +\xae\x00\x0a\x00\xc9\xff\x85\x00\x0a\x00\xcb\xff\x85\x00\x0a\x00\ +\xcd\xff\x85\x00\x0a\x00\xcf\xff\x85\x00\x0a\x00\xd1\xff\x85\x00\ +\x0a\x00\xd3\xff\x85\x00\x0a\x00\xd5\xff\x85\x00\x0a\x00\xd7\xff\ +\x85\x00\x0a\x00\xd9\xff\x85\x00\x0a\x00\xdb\xff\x85\x00\x0a\x00\ +\xdd\xff\x85\x00\x0a\x00\xdf\xff\xc3\x00\x0a\x00\xe1\xff\xc3\x00\ +\x0a\x00\xe3\xff\xc3\x00\x0a\x00\xe5\xff\xc3\x00\x0a\x00\xfa\xff\ +\xc3\x00\x0a\x01\x06\xff\xc3\x00\x0a\x01\x08\xff\xc3\x00\x0a\x01\ +\x0d\xff\xc3\x00\x0a\x01\x0f\xff\x85\x00\x0a\x01\x11\xff\x85\x00\ +\x0a\x01\x13\xff\x85\x00\x0a\x01\x15\xff\x85\x00\x0a\x01\x17\xff\ +\xc3\x00\x0a\x01\x19\xff\xc3\x00\x0a\x01\x1d\xff\xc3\x00\x0a\x01\ +!\xff\xc3\x00\x0a\x01$\x00)\x00\x0a\x01&\x00)\x00\ +\x0a\x01+\xff\xc3\x00\x0a\x01-\xff\xc3\x00\x0a\x01/\xff\ +\xc3\x00\x0a\x011\xff\xc3\x00\x0a\x013\xff\xc3\x00\x0a\x01\ +5\xff\xc3\x00\x0a\x016\x00)\x00\x0a\x018\x00\x14\x00\ +\x0a\x01:\x00\x14\x00\x0a\x01C\xffq\x00\x0a\x01D\xff\ +\xae\x00\x0a\x01F\xff\xae\x00\x0a\x01H\xff\x85\x00\x0a\x01\ +J\xff\xc3\x00\x0a\x01V\xffq\x00\x0a\x01_\xffq\x00\ +\x0a\x01b\xffq\x00\x0a\x01i\xffq\x00\x0a\x01y\xff\ +\xae\x00\x0a\x01z\xff\xd7\x00\x0a\x01{\xff\xd7\x00\x0a\x01\ +~\xff\xae\x00\x0a\x01\x81\xff\xc3\x00\x0a\x01\x82\xff\xd7\x00\ +\x0a\x01\x83\xff\xd7\x00\x0a\x01\x84\xff\xd7\x00\x0a\x01\x87\xff\ +\xd7\x00\x0a\x01\x89\xff\xd7\x00\x0a\x01\x8c\xff\xae\x00\x0a\x01\ +\x8e\xff\xc3\x00\x0a\x01\x8f\xff\xae\x00\x0a\x01\x90\xff\xae\x00\ +\x0a\x01\x93\xff\xae\x00\x0a\x01\x99\xff\xae\x00\x0a\x01\xa4\xff\ +\x85\x00\x0a\x01\xaa\xffq\x00\x0a\x01\xae\xff\x85\x00\x0a\x01\ +\xb5\xff\x85\x00\x0a\x01\xca\xff\xd7\x00\x0a\x01\xce\xffq\x00\ +\x0a\x01\xcf\xff\x85\x00\x0a\x01\xd5\xffq\x00\x0a\x01\xd8\xff\ +\x85\x00\x0a\x01\xdb\xff\x85\x00\x0a\x01\xde\xff\x85\x00\x0a\x01\ +\xea\xff\x85\x00\x0a\x01\xed\xff\x85\x00\x0a\x01\xee\xff\xc3\x00\ +\x0a\x01\xf2\xffq\x00\x0a\x01\xfa\x00)\x00\x0a\x01\xfc\x00\ +)\x00\x0a\x01\xfe\x00)\x00\x0a\x02\x00\x00\x14\x00\x0a\x02\ +W\xff\xc3\x00\x0a\x02X\xffq\x00\x0a\x02Y\xff\xae\x00\ +\x0a\x02`\xff\x85\x00\x0a\x02b\xff\xc3\x00\x0a\x02j\xff\ +\x85\x00\x0a\x02r\xffq\x00\x0a\x02s\xffq\x00\x0a\x02\ +}\xff\xec\x00\x0a\x02\x7f\xff\x85\x00\x0a\x02\x85\xff\x85\x00\ +\x0a\x02\x87\xff\x85\x00\x0a\x02\x89\xff\x85\x00\x0a\x02\x8d\xff\ +\x85\x00\x0a\x02\xb2\xff\x85\x00\x0a\x02\xb4\xff\x85\x00\x0a\x02\ +\xce\xff\x85\x00\x0a\x02\xcf\xffq\x00\x0a\x02\xd9\xffq\x00\ +\x0a\x02\xda\xff\xd7\x00\x0a\x02\xdb\xffq\x00\x0a\x02\xdc\xff\ +\xd7\x00\x0a\x02\xdd\xffq\x00\x0a\x02\xde\xff\xd7\x00\x0a\x02\ +\xe0\xff\x85\x00\x0a\x02\xe2\xff\xd7\x00\x0a\x02\xe4\xff\xd7\x00\ +\x0a\x02\xf0\xff\x85\x00\x0a\x02\xf2\xff\x85\x00\x0a\x02\xf4\xff\ +\x85\x00\x0a\x03\x09\xffq\x00\x0a\x03\x0a\xff\x85\x00\x0a\x03\ +\x0b\xffq\x00\x0a\x03\x0c\xff\x85\x00\x0a\x03\x11\xff\x85\x00\ +\x0a\x03\x12\xffq\x00\x0a\x03\x16\xff\x85\x00\x0a\x03\x1a\xff\ +\x85\x00\x0a\x03\x1b\xff\x85\x00\x0a\x03\x1c\xffq\x00\x0a\x03\ +\x1d\xffq\x00\x0a\x03\x1e\xff\xae\x00\x0a\x03\x1f\xffq\x00\ +\x0a\x03 \xff\xae\x00\x0a\x03!\xffq\x00\x0a\x03\x22\xff\ +\xae\x00\x0a\x03#\xffq\x00\x0a\x03%\xffq\x00\x0a\x03\ +&\xff\xae\x00\x0a\x03'\xffq\x00\x0a\x03(\xff\xae\x00\ +\x0a\x03)\xffq\x00\x0a\x03*\xff\xae\x00\x0a\x03+\xff\ +q\x00\x0a\x03,\xff\xae\x00\x0a\x03-\xffq\x00\x0a\x03\ +.\xff\xae\x00\x0a\x03/\xffq\x00\x0a\x030\xff\xae\x00\ +\x0a\x031\xffq\x00\x0a\x032\xff\xae\x00\x0a\x033\xff\ +q\x00\x0a\x034\xff\xae\x00\x0a\x036\xff\x85\x00\x0a\x03\ +8\xff\x85\x00\x0a\x03:\xff\x85\x00\x0a\x03<\xff\x85\x00\ +\x0a\x03@\xff\x85\x00\x0a\x03B\xff\x85\x00\x0a\x03D\xff\ +\x85\x00\x0a\x03J\xff\x85\x00\x0a\x03L\xff\x85\x00\x0a\x03\ +N\xff\x85\x00\x0a\x03R\xff\x85\x00\x0a\x03T\xff\x85\x00\ +\x0a\x03V\xff\x85\x00\x0a\x03X\xff\x85\x00\x0a\x03Z\xff\ +\x85\x00\x0a\x03\x5c\xff\x85\x00\x0a\x03^\xff\x85\x00\x0a\x03\ +`\xff\x85\x00\x0a\x03b\xff\xc3\x00\x0a\x03d\xff\xc3\x00\ +\x0a\x03f\xff\xc3\x00\x0a\x03h\xff\xc3\x00\x0a\x03j\xff\ +\xc3\x00\x0a\x03l\xff\xc3\x00\x0a\x03n\xff\xc3\x00\x0a\x03\ +o\x00\x14\x00\x0a\x03q\x00\x14\x00\x0a\x03s\x00\x14\x00\ +\x0a\x03\x8f\x00)\x00\x0b\x00-\x00\xb8\x00\x0f\x00&\xff\ +\x9a\x00\x0f\x00*\xff\x9a\x00\x0f\x002\xff\x9a\x00\x0f\x00\ +4\xff\x9a\x00\x0f\x007\xffq\x00\x0f\x008\xff\xd7\x00\ +\x0f\x009\xff\x85\x00\x0f\x00:\xff\x85\x00\x0f\x00<\xff\ +\x85\x00\x0f\x00\x89\xff\x9a\x00\x0f\x00\x94\xff\x9a\x00\x0f\x00\ +\x95\xff\x9a\x00\x0f\x00\x96\xff\x9a\x00\x0f\x00\x97\xff\x9a\x00\ +\x0f\x00\x98\xff\x9a\x00\x0f\x00\x9a\xff\x9a\x00\x0f\x00\x9b\xff\ +\xd7\x00\x0f\x00\x9c\xff\xd7\x00\x0f\x00\x9d\xff\xd7\x00\x0f\x00\ +\x9e\xff\xd7\x00\x0f\x00\x9f\xff\x85\x00\x0f\x00\xc8\xff\x9a\x00\ +\x0f\x00\xca\xff\x9a\x00\x0f\x00\xcc\xff\x9a\x00\x0f\x00\xce\xff\ +\x9a\x00\x0f\x00\xde\xff\x9a\x00\x0f\x00\xe0\xff\x9a\x00\x0f\x00\ +\xe2\xff\x9a\x00\x0f\x00\xe4\xff\x9a\x00\x0f\x01\x0e\xff\x9a\x00\ +\x0f\x01\x10\xff\x9a\x00\x0f\x01\x12\xff\x9a\x00\x0f\x01\x14\xff\ +\x9a\x00\x0f\x01$\xffq\x00\x0f\x01&\xffq\x00\x0f\x01\ +*\xff\xd7\x00\x0f\x01,\xff\xd7\x00\x0f\x01.\xff\xd7\x00\ +\x0f\x010\xff\xd7\x00\x0f\x012\xff\xd7\x00\x0f\x014\xff\ +\xd7\x00\x0f\x016\xff\x85\x00\x0f\x018\xff\x85\x00\x0f\x01\ +:\xff\x85\x00\x0f\x01G\xff\x9a\x00\x0f\x01f\xff\xae\x00\ +\x0f\x01m\xff\xae\x00\x0f\x01q\xffq\x00\x0f\x01r\xff\ +\x85\x00\x0f\x01s\xff\x9a\x00\x0f\x01u\xff\x85\x00\x0f\x01\ +x\xff\x85\x00\x0f\x01\x85\xff\xd7\x00\x0f\x01\x9d\xffq\x00\ +\x0f\x01\x9f\xff\x9a\x00\x0f\x01\xa6\xffq\x00\x0f\x01\xb8\xff\ +\x9a\x00\x0f\x01\xbb\xff\x9a\x00\x0f\x01\xbc\xffq\x00\x0f\x01\ +\xbe\xff\xae\x00\x0f\x01\xc1\xff\x5c\x00\x0f\x01\xc4\xffq\x00\ +\x0f\x01\xdc\xff\x9a\x00\x0f\x01\xe1\xff\x85\x00\x0f\x01\xe4\xff\ +\x9a\x00\x0f\x01\xfa\xff\x85\x00\x0f\x01\xfc\xff\x85\x00\x0f\x01\ +\xfe\xff\x85\x00\x0f\x02\x00\xff\x85\x00\x0f\x02T\xff\x85\x00\ +\x0f\x02_\xff\x9a\x00\x0f\x02a\xff\xd7\x00\x0f\x02l\xff\ +\x9a\x00\x0f\x02|\xff\x5c\x00\x0f\x02~\xff\x9a\x00\x0f\x02\ +\x80\xff\x85\x00\x0f\x02\x82\xff\x85\x00\x0f\x02\x84\xff\x9a\x00\ +\x0f\x02\x86\xff\x9a\x00\x0f\x02\x88\xff\x9a\x00\x0f\x02\x8a\xff\ +\x9a\x00\x0f\x02\x8c\xff\x9a\x00\x0f\x02\xa9\xffq\x00\x0f\x02\ +\xaa\xff\x9a\x00\x0f\x02\xb1\xff\x9a\x00\x0f\x02\xb3\xff\x9a\x00\ +\x0f\x02\xb5\xffq\x00\x0f\x02\xb6\xff\x9a\x00\x0f\x02\xb7\xff\ +\x85\x00\x0f\x02\xb9\xff\x85\x00\x0f\x02\xbd\xffq\x00\x0f\x02\ +\xbe\xff\x9a\x00\x0f\x02\xbf\xff\x5c\x00\x0f\x02\xc0\xff\x85\x00\ +\x0f\x02\xc1\xff\x5c\x00\x0f\x02\xc2\xff\x85\x00\x0f\x02\xc5\xff\ +\x85\x00\x0f\x02\xc7\xff\x85\x00\x0f\x02\xd4\xff\x5c\x00\x0f\x02\ +\xd5\xff\x85\x00\x0f\x02\xef\xff\x9a\x00\x0f\x02\xf1\xff\x9a\x00\ +\x0f\x02\xf3\xff\x9a\x00\x0f\x02\xfd\xff\x5c\x00\x0f\x02\xfe\xff\ +\x85\x00\x0f\x03\x0d\xff\x85\x00\x0f\x03\x0e\xff\x9a\x00\x0f\x03\ +\x0f\xff\x85\x00\x0f\x03\x10\xff\x9a\x00\x0f\x03\x15\xff\x9a\x00\ +\x0f\x03\x17\xffq\x00\x0f\x03\x18\xff\x9a\x00\x0f\x03I\xff\ +\x9a\x00\x0f\x03K\xff\x9a\x00\x0f\x03M\xff\x9a\x00\x0f\x03\ +O\xff\x9a\x00\x0f\x03Q\xff\x9a\x00\x0f\x03S\xff\x9a\x00\ +\x0f\x03U\xff\x9a\x00\x0f\x03W\xff\x9a\x00\x0f\x03Y\xff\ +\x9a\x00\x0f\x03[\xff\x9a\x00\x0f\x03]\xff\x9a\x00\x0f\x03\ +_\xff\x9a\x00\x0f\x03a\xff\xd7\x00\x0f\x03c\xff\xd7\x00\ +\x0f\x03e\xff\xd7\x00\x0f\x03g\xff\xd7\x00\x0f\x03i\xff\ +\xd7\x00\x0f\x03k\xff\xd7\x00\x0f\x03m\xff\xd7\x00\x0f\x03\ +o\xff\x85\x00\x0f\x03q\xff\x85\x00\x0f\x03s\xff\x85\x00\ +\x0f\x03\x8f\xffq\x00\x10\x007\xff\xae\x00\x10\x01$\xff\ +\xae\x00\x10\x01&\xff\xae\x00\x10\x01q\xff\xae\x00\x10\x01\ +\x9d\xff\xae\x00\x10\x01\xa6\xff\xae\x00\x10\x01\xbc\xff\xae\x00\ +\x10\x01\xc4\xff\xae\x00\x10\x01\xdc\xff\xd7\x00\x10\x01\xe4\xff\ +\xd7\x00\x10\x02\xa9\xff\xae\x00\x10\x02\xaa\xff\xd7\x00\x10\x02\ +\xb5\xff\xae\x00\x10\x02\xb6\xff\xd7\x00\x10\x02\xbd\xff\xae\x00\ +\x10\x02\xbe\xff\xd7\x00\x10\x03\x17\xff\xae\x00\x10\x03\x18\xff\ +\xd7\x00\x10\x03\x8f\xff\xae\x00\x11\x00&\xff\x9a\x00\x11\x00\ +*\xff\x9a\x00\x11\x002\xff\x9a\x00\x11\x004\xff\x9a\x00\ +\x11\x007\xffq\x00\x11\x008\xff\xd7\x00\x11\x009\xff\ +\x85\x00\x11\x00:\xff\x85\x00\x11\x00<\xff\x85\x00\x11\x00\ +\x89\xff\x9a\x00\x11\x00\x94\xff\x9a\x00\x11\x00\x95\xff\x9a\x00\ +\x11\x00\x96\xff\x9a\x00\x11\x00\x97\xff\x9a\x00\x11\x00\x98\xff\ +\x9a\x00\x11\x00\x9a\xff\x9a\x00\x11\x00\x9b\xff\xd7\x00\x11\x00\ +\x9c\xff\xd7\x00\x11\x00\x9d\xff\xd7\x00\x11\x00\x9e\xff\xd7\x00\ +\x11\x00\x9f\xff\x85\x00\x11\x00\xc8\xff\x9a\x00\x11\x00\xca\xff\ +\x9a\x00\x11\x00\xcc\xff\x9a\x00\x11\x00\xce\xff\x9a\x00\x11\x00\ +\xde\xff\x9a\x00\x11\x00\xe0\xff\x9a\x00\x11\x00\xe2\xff\x9a\x00\ +\x11\x00\xe4\xff\x9a\x00\x11\x01\x0e\xff\x9a\x00\x11\x01\x10\xff\ +\x9a\x00\x11\x01\x12\xff\x9a\x00\x11\x01\x14\xff\x9a\x00\x11\x01\ +$\xffq\x00\x11\x01&\xffq\x00\x11\x01*\xff\xd7\x00\ +\x11\x01,\xff\xd7\x00\x11\x01.\xff\xd7\x00\x11\x010\xff\ +\xd7\x00\x11\x012\xff\xd7\x00\x11\x014\xff\xd7\x00\x11\x01\ +6\xff\x85\x00\x11\x018\xff\x85\x00\x11\x01:\xff\x85\x00\ +\x11\x01G\xff\x9a\x00\x11\x01f\xff\xae\x00\x11\x01m\xff\ +\xae\x00\x11\x01q\xffq\x00\x11\x01r\xff\x85\x00\x11\x01\ +s\xff\x9a\x00\x11\x01u\xff\x85\x00\x11\x01x\xff\x85\x00\ +\x11\x01\x85\xff\xd7\x00\x11\x01\x9d\xffq\x00\x11\x01\x9f\xff\ +\x9a\x00\x11\x01\xa6\xffq\x00\x11\x01\xb8\xff\x9a\x00\x11\x01\ +\xbb\xff\x9a\x00\x11\x01\xbc\xffq\x00\x11\x01\xbe\xff\xae\x00\ +\x11\x01\xc1\xff\x5c\x00\x11\x01\xc4\xffq\x00\x11\x01\xdc\xff\ +\x9a\x00\x11\x01\xe1\xff\x85\x00\x11\x01\xe4\xff\x9a\x00\x11\x01\ +\xfa\xff\x85\x00\x11\x01\xfc\xff\x85\x00\x11\x01\xfe\xff\x85\x00\ +\x11\x02\x00\xff\x85\x00\x11\x02T\xff\x85\x00\x11\x02_\xff\ +\x9a\x00\x11\x02a\xff\xd7\x00\x11\x02l\xff\x9a\x00\x11\x02\ +|\xff\x5c\x00\x11\x02~\xff\x9a\x00\x11\x02\x80\xff\x85\x00\ +\x11\x02\x82\xff\x85\x00\x11\x02\x84\xff\x9a\x00\x11\x02\x86\xff\ +\x9a\x00\x11\x02\x88\xff\x9a\x00\x11\x02\x8a\xff\x9a\x00\x11\x02\ +\x8c\xff\x9a\x00\x11\x02\xa9\xffq\x00\x11\x02\xaa\xff\x9a\x00\ +\x11\x02\xb1\xff\x9a\x00\x11\x02\xb3\xff\x9a\x00\x11\x02\xb5\xff\ +q\x00\x11\x02\xb6\xff\x9a\x00\x11\x02\xb7\xff\x85\x00\x11\x02\ +\xb9\xff\x85\x00\x11\x02\xbd\xffq\x00\x11\x02\xbe\xff\x9a\x00\ +\x11\x02\xbf\xff\x5c\x00\x11\x02\xc0\xff\x85\x00\x11\x02\xc1\xff\ +\x5c\x00\x11\x02\xc2\xff\x85\x00\x11\x02\xc5\xff\x85\x00\x11\x02\ +\xc7\xff\x85\x00\x11\x02\xd4\xff\x5c\x00\x11\x02\xd5\xff\x85\x00\ +\x11\x02\xef\xff\x9a\x00\x11\x02\xf1\xff\x9a\x00\x11\x02\xf3\xff\ +\x9a\x00\x11\x02\xfd\xff\x5c\x00\x11\x02\xfe\xff\x85\x00\x11\x03\ +\x0d\xff\x85\x00\x11\x03\x0e\xff\x9a\x00\x11\x03\x0f\xff\x85\x00\ +\x11\x03\x10\xff\x9a\x00\x11\x03\x15\xff\x9a\x00\x11\x03\x17\xff\ +q\x00\x11\x03\x18\xff\x9a\x00\x11\x03I\xff\x9a\x00\x11\x03\ +K\xff\x9a\x00\x11\x03M\xff\x9a\x00\x11\x03O\xff\x9a\x00\ +\x11\x03Q\xff\x9a\x00\x11\x03S\xff\x9a\x00\x11\x03U\xff\ +\x9a\x00\x11\x03W\xff\x9a\x00\x11\x03Y\xff\x9a\x00\x11\x03\ +[\xff\x9a\x00\x11\x03]\xff\x9a\x00\x11\x03_\xff\x9a\x00\ +\x11\x03a\xff\xd7\x00\x11\x03c\xff\xd7\x00\x11\x03e\xff\ +\xd7\x00\x11\x03g\xff\xd7\x00\x11\x03i\xff\xd7\x00\x11\x03\ +k\xff\xd7\x00\x11\x03m\xff\xd7\x00\x11\x03o\xff\x85\x00\ +\x11\x03q\xff\x85\x00\x11\x03s\xff\x85\x00\x11\x03\x8f\xff\ +q\x00$\x00\x05\xffq\x00$\x00\x0a\xffq\x00$\x00\ +&\xff\xd7\x00$\x00*\xff\xd7\x00$\x00-\x01\x0a\x00\ +$\x002\xff\xd7\x00$\x004\xff\xd7\x00$\x007\xff\ +q\x00$\x009\xff\xae\x00$\x00:\xff\xae\x00$\x00\ +<\xff\x85\x00$\x00\x89\xff\xd7\x00$\x00\x94\xff\xd7\x00\ +$\x00\x95\xff\xd7\x00$\x00\x96\xff\xd7\x00$\x00\x97\xff\ +\xd7\x00$\x00\x98\xff\xd7\x00$\x00\x9a\xff\xd7\x00$\x00\ +\x9f\xff\x85\x00$\x00\xc8\xff\xd7\x00$\x00\xca\xff\xd7\x00\ +$\x00\xcc\xff\xd7\x00$\x00\xce\xff\xd7\x00$\x00\xde\xff\ +\xd7\x00$\x00\xe0\xff\xd7\x00$\x00\xe2\xff\xd7\x00$\x00\ +\xe4\xff\xd7\x00$\x01\x0e\xff\xd7\x00$\x01\x10\xff\xd7\x00\ +$\x01\x12\xff\xd7\x00$\x01\x14\xff\xd7\x00$\x01$\xff\ +q\x00$\x01&\xffq\x00$\x016\xff\xae\x00$\x01\ +8\xff\x85\x00$\x01:\xff\x85\x00$\x01G\xff\xd7\x00\ +$\x01\xfa\xff\xae\x00$\x01\xfc\xff\xae\x00$\x01\xfe\xff\ +\xae\x00$\x02\x00\xff\x85\x00$\x02\x07\xffq\x00$\x02\ +\x0b\xffq\x00$\x02_\xff\xd7\x00$\x03I\xff\xd7\x00\ +$\x03K\xff\xd7\x00$\x03M\xff\xd7\x00$\x03O\xff\ +\xd7\x00$\x03Q\xff\xd7\x00$\x03S\xff\xd7\x00$\x03\ +U\xff\xd7\x00$\x03W\xff\xd7\x00$\x03Y\xff\xd7\x00\ +$\x03[\xff\xd7\x00$\x03]\xff\xd7\x00$\x03_\xff\ +\xd7\x00$\x03o\xff\x85\x00$\x03q\xff\x85\x00$\x03\ +s\xff\x85\x00$\x03\x8f\xffq\x00%\x00\x0f\xff\xae\x00\ +%\x00\x11\xff\xae\x00%\x00$\xff\xd7\x00%\x007\xff\ +\xc3\x00%\x009\xff\xec\x00%\x00:\xff\xec\x00%\x00\ +;\xff\xd7\x00%\x00<\xff\xec\x00%\x00=\xff\xec\x00\ +%\x00\x82\xff\xd7\x00%\x00\x83\xff\xd7\x00%\x00\x84\xff\ +\xd7\x00%\x00\x85\xff\xd7\x00%\x00\x86\xff\xd7\x00%\x00\ +\x87\xff\xd7\x00%\x00\x9f\xff\xec\x00%\x00\xc2\xff\xd7\x00\ +%\x00\xc4\xff\xd7\x00%\x00\xc6\xff\xd7\x00%\x01$\xff\ +\xc3\x00%\x01&\xff\xc3\x00%\x016\xff\xec\x00%\x01\ +8\xff\xec\x00%\x01:\xff\xec\x00%\x01;\xff\xec\x00\ +%\x01=\xff\xec\x00%\x01?\xff\xec\x00%\x01C\xff\ +\xd7\x00%\x01\xa0\xff\xec\x00%\x01\xfa\xff\xec\x00%\x01\ +\xfc\xff\xec\x00%\x01\xfe\xff\xec\x00%\x02\x00\xff\xec\x00\ +%\x02\x08\xff\xae\x00%\x02\x0c\xff\xae\x00%\x02X\xff\ +\xd7\x00%\x03\x1d\xff\xd7\x00%\x03\x1f\xff\xd7\x00%\x03\ +!\xff\xd7\x00%\x03#\xff\xd7\x00%\x03%\xff\xd7\x00\ +%\x03'\xff\xd7\x00%\x03)\xff\xd7\x00%\x03+\xff\ +\xd7\x00%\x03-\xff\xd7\x00%\x03/\xff\xd7\x00%\x03\ +1\xff\xd7\x00%\x033\xff\xd7\x00%\x03o\xff\xec\x00\ +%\x03q\xff\xec\x00%\x03s\xff\xec\x00%\x03\x8f\xff\ +\xc3\x00&\x00&\xff\xd7\x00&\x00*\xff\xd7\x00&\x00\ +2\xff\xd7\x00&\x004\xff\xd7\x00&\x00\x89\xff\xd7\x00\ +&\x00\x94\xff\xd7\x00&\x00\x95\xff\xd7\x00&\x00\x96\xff\ +\xd7\x00&\x00\x97\xff\xd7\x00&\x00\x98\xff\xd7\x00&\x00\ +\x9a\xff\xd7\x00&\x00\xc8\xff\xd7\x00&\x00\xca\xff\xd7\x00\ +&\x00\xcc\xff\xd7\x00&\x00\xce\xff\xd7\x00&\x00\xde\xff\ +\xd7\x00&\x00\xe0\xff\xd7\x00&\x00\xe2\xff\xd7\x00&\x00\ +\xe4\xff\xd7\x00&\x01\x0e\xff\xd7\x00&\x01\x10\xff\xd7\x00\ +&\x01\x12\xff\xd7\x00&\x01\x14\xff\xd7\x00&\x01G\xff\ +\xd7\x00&\x02_\xff\xd7\x00&\x03I\xff\xd7\x00&\x03\ +K\xff\xd7\x00&\x03M\xff\xd7\x00&\x03O\xff\xd7\x00\ +&\x03Q\xff\xd7\x00&\x03S\xff\xd7\x00&\x03U\xff\ +\xd7\x00&\x03W\xff\xd7\x00&\x03Y\xff\xd7\x00&\x03\ +[\xff\xd7\x00&\x03]\xff\xd7\x00&\x03_\xff\xd7\x00\ +'\x00\x0f\xff\xae\x00'\x00\x11\xff\xae\x00'\x00$\xff\ +\xd7\x00'\x007\xff\xc3\x00'\x009\xff\xec\x00'\x00\ +:\xff\xec\x00'\x00;\xff\xd7\x00'\x00<\xff\xec\x00\ +'\x00=\xff\xec\x00'\x00\x82\xff\xd7\x00'\x00\x83\xff\ +\xd7\x00'\x00\x84\xff\xd7\x00'\x00\x85\xff\xd7\x00'\x00\ +\x86\xff\xd7\x00'\x00\x87\xff\xd7\x00'\x00\x9f\xff\xec\x00\ +'\x00\xc2\xff\xd7\x00'\x00\xc4\xff\xd7\x00'\x00\xc6\xff\ +\xd7\x00'\x01$\xff\xc3\x00'\x01&\xff\xc3\x00'\x01\ +6\xff\xec\x00'\x018\xff\xec\x00'\x01:\xff\xec\x00\ +'\x01;\xff\xec\x00'\x01=\xff\xec\x00'\x01?\xff\ +\xec\x00'\x01C\xff\xd7\x00'\x01\xa0\xff\xec\x00'\x01\ +\xfa\xff\xec\x00'\x01\xfc\xff\xec\x00'\x01\xfe\xff\xec\x00\ +'\x02\x00\xff\xec\x00'\x02\x08\xff\xae\x00'\x02\x0c\xff\ +\xae\x00'\x02X\xff\xd7\x00'\x03\x1d\xff\xd7\x00'\x03\ +\x1f\xff\xd7\x00'\x03!\xff\xd7\x00'\x03#\xff\xd7\x00\ +'\x03%\xff\xd7\x00'\x03'\xff\xd7\x00'\x03)\xff\ +\xd7\x00'\x03+\xff\xd7\x00'\x03-\xff\xd7\x00'\x03\ +/\xff\xd7\x00'\x031\xff\xd7\x00'\x033\xff\xd7\x00\ +'\x03o\xff\xec\x00'\x03q\xff\xec\x00'\x03s\xff\ +\xec\x00'\x03\x8f\xff\xc3\x00(\x00-\x00{\x00)\x00\ +\x0f\xff\x85\x00)\x00\x11\xff\x85\x00)\x00\x22\x00)\x00\ +)\x00$\xff\xd7\x00)\x00\x82\xff\xd7\x00)\x00\x83\xff\ +\xd7\x00)\x00\x84\xff\xd7\x00)\x00\x85\xff\xd7\x00)\x00\ +\x86\xff\xd7\x00)\x00\x87\xff\xd7\x00)\x00\xc2\xff\xd7\x00\ +)\x00\xc4\xff\xd7\x00)\x00\xc6\xff\xd7\x00)\x01C\xff\ +\xd7\x00)\x02\x08\xff\x85\x00)\x02\x0c\xff\x85\x00)\x02\ +X\xff\xd7\x00)\x03\x1d\xff\xd7\x00)\x03\x1f\xff\xd7\x00\ +)\x03!\xff\xd7\x00)\x03#\xff\xd7\x00)\x03%\xff\ +\xd7\x00)\x03'\xff\xd7\x00)\x03)\xff\xd7\x00)\x03\ ++\xff\xd7\x00)\x03-\xff\xd7\x00)\x03/\xff\xd7\x00\ +)\x031\xff\xd7\x00)\x033\xff\xd7\x00.\x00&\xff\ +\xd7\x00.\x00*\xff\xd7\x00.\x002\xff\xd7\x00.\x00\ +4\xff\xd7\x00.\x00\x89\xff\xd7\x00.\x00\x94\xff\xd7\x00\ +.\x00\x95\xff\xd7\x00.\x00\x96\xff\xd7\x00.\x00\x97\xff\ +\xd7\x00.\x00\x98\xff\xd7\x00.\x00\x9a\xff\xd7\x00.\x00\ +\xc8\xff\xd7\x00.\x00\xca\xff\xd7\x00.\x00\xcc\xff\xd7\x00\ +.\x00\xce\xff\xd7\x00.\x00\xde\xff\xd7\x00.\x00\xe0\xff\ +\xd7\x00.\x00\xe2\xff\xd7\x00.\x00\xe4\xff\xd7\x00.\x01\ +\x0e\xff\xd7\x00.\x01\x10\xff\xd7\x00.\x01\x12\xff\xd7\x00\ +.\x01\x14\xff\xd7\x00.\x01G\xff\xd7\x00.\x02_\xff\ +\xd7\x00.\x03I\xff\xd7\x00.\x03K\xff\xd7\x00.\x03\ +M\xff\xd7\x00.\x03O\xff\xd7\x00.\x03Q\xff\xd7\x00\ +.\x03S\xff\xd7\x00.\x03U\xff\xd7\x00.\x03W\xff\ +\xd7\x00.\x03Y\xff\xd7\x00.\x03[\xff\xd7\x00.\x03\ +]\xff\xd7\x00.\x03_\xff\xd7\x00/\x00\x05\xff\x5c\x00\ +/\x00\x0a\xff\x5c\x00/\x00&\xff\xd7\x00/\x00*\xff\ +\xd7\x00/\x002\xff\xd7\x00/\x004\xff\xd7\x00/\x00\ +7\xff\xd7\x00/\x008\xff\xec\x00/\x009\xff\xd7\x00\ +/\x00:\xff\xd7\x00/\x00<\xff\xc3\x00/\x00\x89\xff\ +\xd7\x00/\x00\x94\xff\xd7\x00/\x00\x95\xff\xd7\x00/\x00\ +\x96\xff\xd7\x00/\x00\x97\xff\xd7\x00/\x00\x98\xff\xd7\x00\ +/\x00\x9a\xff\xd7\x00/\x00\x9b\xff\xec\x00/\x00\x9c\xff\ +\xec\x00/\x00\x9d\xff\xec\x00/\x00\x9e\xff\xec\x00/\x00\ +\x9f\xff\xc3\x00/\x00\xc8\xff\xd7\x00/\x00\xca\xff\xd7\x00\ +/\x00\xcc\xff\xd7\x00/\x00\xce\xff\xd7\x00/\x00\xde\xff\ +\xd7\x00/\x00\xe0\xff\xd7\x00/\x00\xe2\xff\xd7\x00/\x00\ +\xe4\xff\xd7\x00/\x01\x0e\xff\xd7\x00/\x01\x10\xff\xd7\x00\ +/\x01\x12\xff\xd7\x00/\x01\x14\xff\xd7\x00/\x01$\xff\ +\xd7\x00/\x01&\xff\xd7\x00/\x01*\xff\xec\x00/\x01\ +,\xff\xec\x00/\x01.\xff\xec\x00/\x010\xff\xec\x00\ +/\x012\xff\xec\x00/\x014\xff\xec\x00/\x016\xff\ +\xd7\x00/\x018\xff\xc3\x00/\x01:\xff\xc3\x00/\x01\ +G\xff\xd7\x00/\x01\xfa\xff\xd7\x00/\x01\xfc\xff\xd7\x00\ +/\x01\xfe\xff\xd7\x00/\x02\x00\xff\xc3\x00/\x02\x07\xff\ +\x5c\x00/\x02\x0b\xff\x5c\x00/\x02_\xff\xd7\x00/\x02\ +a\xff\xec\x00/\x03I\xff\xd7\x00/\x03K\xff\xd7\x00\ +/\x03M\xff\xd7\x00/\x03O\xff\xd7\x00/\x03Q\xff\ +\xd7\x00/\x03S\xff\xd7\x00/\x03U\xff\xd7\x00/\x03\ +W\xff\xd7\x00/\x03Y\xff\xd7\x00/\x03[\xff\xd7\x00\ +/\x03]\xff\xd7\x00/\x03_\xff\xd7\x00/\x03a\xff\ +\xec\x00/\x03c\xff\xec\x00/\x03e\xff\xec\x00/\x03\ +g\xff\xec\x00/\x03i\xff\xec\x00/\x03k\xff\xec\x00\ +/\x03m\xff\xec\x00/\x03o\xff\xc3\x00/\x03q\xff\ +\xc3\x00/\x03s\xff\xc3\x00/\x03\x8f\xff\xd7\x002\x00\ +\x0f\xff\xae\x002\x00\x11\xff\xae\x002\x00$\xff\xd7\x00\ +2\x007\xff\xc3\x002\x009\xff\xec\x002\x00:\xff\ +\xec\x002\x00;\xff\xd7\x002\x00<\xff\xec\x002\x00\ +=\xff\xec\x002\x00\x82\xff\xd7\x002\x00\x83\xff\xd7\x00\ +2\x00\x84\xff\xd7\x002\x00\x85\xff\xd7\x002\x00\x86\xff\ +\xd7\x002\x00\x87\xff\xd7\x002\x00\x9f\xff\xec\x002\x00\ +\xc2\xff\xd7\x002\x00\xc4\xff\xd7\x002\x00\xc6\xff\xd7\x00\ +2\x01$\xff\xc3\x002\x01&\xff\xc3\x002\x016\xff\ +\xec\x002\x018\xff\xec\x002\x01:\xff\xec\x002\x01\ +;\xff\xec\x002\x01=\xff\xec\x002\x01?\xff\xec\x00\ +2\x01C\xff\xd7\x002\x01\xa0\xff\xec\x002\x01\xfa\xff\ +\xec\x002\x01\xfc\xff\xec\x002\x01\xfe\xff\xec\x002\x02\ +\x00\xff\xec\x002\x02\x08\xff\xae\x002\x02\x0c\xff\xae\x00\ +2\x02X\xff\xd7\x002\x03\x1d\xff\xd7\x002\x03\x1f\xff\ +\xd7\x002\x03!\xff\xd7\x002\x03#\xff\xd7\x002\x03\ +%\xff\xd7\x002\x03'\xff\xd7\x002\x03)\xff\xd7\x00\ +2\x03+\xff\xd7\x002\x03-\xff\xd7\x002\x03/\xff\ +\xd7\x002\x031\xff\xd7\x002\x033\xff\xd7\x002\x03\ +o\xff\xec\x002\x03q\xff\xec\x002\x03s\xff\xec\x00\ +2\x03\x8f\xff\xc3\x003\x00\x0f\xfe\xf6\x003\x00\x11\xfe\ +\xf6\x003\x00$\xff\x9a\x003\x00;\xff\xd7\x003\x00\ +=\xff\xec\x003\x00\x82\xff\x9a\x003\x00\x83\xff\x9a\x00\ +3\x00\x84\xff\x9a\x003\x00\x85\xff\x9a\x003\x00\x86\xff\ +\x9a\x003\x00\x87\xff\x9a\x003\x00\xc2\xff\x9a\x003\x00\ +\xc4\xff\x9a\x003\x00\xc6\xff\x9a\x003\x01;\xff\xec\x00\ +3\x01=\xff\xec\x003\x01?\xff\xec\x003\x01C\xff\ +\x9a\x003\x02\x08\xfe\xf6\x003\x02\x0c\xfe\xf6\x003\x02\ +X\xff\x9a\x003\x03\x1d\xff\x9a\x003\x03\x1f\xff\x9a\x00\ +3\x03!\xff\x9a\x003\x03#\xff\x9a\x003\x03%\xff\ +\x9a\x003\x03'\xff\x9a\x003\x03)\xff\x9a\x003\x03\ ++\xff\x9a\x003\x03-\xff\x9a\x003\x03/\xff\x9a\x00\ +3\x031\xff\x9a\x003\x033\xff\x9a\x004\x00\x0f\xff\ +\xae\x004\x00\x11\xff\xae\x004\x00$\xff\xd7\x004\x00\ +7\xff\xc3\x004\x009\xff\xec\x004\x00:\xff\xec\x00\ +4\x00;\xff\xd7\x004\x00<\xff\xec\x004\x00=\xff\ +\xec\x004\x00\x82\xff\xd7\x004\x00\x83\xff\xd7\x004\x00\ +\x84\xff\xd7\x004\x00\x85\xff\xd7\x004\x00\x86\xff\xd7\x00\ +4\x00\x87\xff\xd7\x004\x00\x9f\xff\xec\x004\x00\xc2\xff\ +\xd7\x004\x00\xc4\xff\xd7\x004\x00\xc6\xff\xd7\x004\x01\ +$\xff\xc3\x004\x01&\xff\xc3\x004\x016\xff\xec\x00\ +4\x018\xff\xec\x004\x01:\xff\xec\x004\x01;\xff\ +\xec\x004\x01=\xff\xec\x004\x01?\xff\xec\x004\x01\ +C\xff\xd7\x004\x01\xa0\xff\xec\x004\x01\xfa\xff\xec\x00\ +4\x01\xfc\xff\xec\x004\x01\xfe\xff\xec\x004\x02\x00\xff\ +\xec\x004\x02\x08\xff\xae\x004\x02\x0c\xff\xae\x004\x02\ +X\xff\xd7\x004\x03\x1d\xff\xd7\x004\x03\x1f\xff\xd7\x00\ +4\x03!\xff\xd7\x004\x03#\xff\xd7\x004\x03%\xff\ +\xd7\x004\x03'\xff\xd7\x004\x03)\xff\xd7\x004\x03\ ++\xff\xd7\x004\x03-\xff\xd7\x004\x03/\xff\xd7\x00\ +4\x031\xff\xd7\x004\x033\xff\xd7\x004\x03o\xff\ +\xec\x004\x03q\xff\xec\x004\x03s\xff\xec\x004\x03\ +\x8f\xff\xc3\x007\x00\x0f\xff\x85\x007\x00\x10\xff\xae\x00\ +7\x00\x11\xff\x85\x007\x00\x22\x00)\x007\x00$\xff\ +q\x007\x00&\xff\xd7\x007\x00*\xff\xd7\x007\x00\ +2\xff\xd7\x007\x004\xff\xd7\x007\x007\x00)\x00\ +7\x00D\xff\x5c\x007\x00F\xffq\x007\x00G\xff\ +q\x007\x00H\xffq\x007\x00J\xffq\x007\x00\ +P\xff\x9a\x007\x00Q\xff\x9a\x007\x00R\xffq\x00\ +7\x00S\xff\x9a\x007\x00T\xffq\x007\x00U\xff\ +\x9a\x007\x00V\xff\x85\x007\x00X\xff\x9a\x007\x00\ +Y\xff\xd7\x007\x00Z\xff\xd7\x007\x00[\xff\xd7\x00\ +7\x00\x5c\xff\xd7\x007\x00]\xff\xae\x007\x00\x82\xff\ +q\x007\x00\x83\xffq\x007\x00\x84\xffq\x007\x00\ +\x85\xffq\x007\x00\x86\xffq\x007\x00\x87\xffq\x00\ +7\x00\x89\xff\xd7\x007\x00\x94\xff\xd7\x007\x00\x95\xff\ +\xd7\x007\x00\x96\xff\xd7\x007\x00\x97\xff\xd7\x007\x00\ +\x98\xff\xd7\x007\x00\x9a\xff\xd7\x007\x00\xa2\xffq\x00\ +7\x00\xa3\xff\x5c\x007\x00\xa4\xff\x5c\x007\x00\xa5\xff\ +\x5c\x007\x00\xa6\xff\x5c\x007\x00\xa7\xff\x5c\x007\x00\ +\xa8\xff\x5c\x007\x00\xa9\xffq\x007\x00\xaa\xffq\x00\ +7\x00\xab\xffq\x007\x00\xac\xffq\x007\x00\xad\xff\ +q\x007\x00\xb4\xffq\x007\x00\xb5\xffq\x007\x00\ +\xb6\xffq\x007\x00\xb7\xffq\x007\x00\xb8\xffq\x00\ +7\x00\xba\xffq\x007\x00\xbb\xff\x9a\x007\x00\xbc\xff\ +\x9a\x007\x00\xbd\xff\x9a\x007\x00\xbe\xff\x9a\x007\x00\ +\xbf\xff\xd7\x007\x00\xc2\xffq\x007\x00\xc3\xff\x5c\x00\ +7\x00\xc4\xffq\x007\x00\xc5\xff\x5c\x007\x00\xc6\xff\ +q\x007\x00\xc7\xff\x5c\x007\x00\xc8\xff\xd7\x007\x00\ +\xc9\xffq\x007\x00\xca\xff\xd7\x007\x00\xcb\xffq\x00\ +7\x00\xcc\xff\xd7\x007\x00\xcd\xffq\x007\x00\xce\xff\ +\xd7\x007\x00\xcf\xffq\x007\x00\xd1\xffq\x007\x00\ +\xd3\xffq\x007\x00\xd5\xffq\x007\x00\xd7\xffq\x00\ +7\x00\xd9\xffq\x007\x00\xdb\xffq\x007\x00\xdd\xff\ +q\x007\x00\xde\xff\xd7\x007\x00\xdf\xffq\x007\x00\ +\xe0\xff\xd7\x007\x00\xe1\xffq\x007\x00\xe2\xff\xd7\x00\ +7\x00\xe3\xffq\x007\x00\xe4\xff\xd7\x007\x00\xe5\xff\ +q\x007\x00\xfa\xff\x9a\x007\x01\x06\xff\x9a\x007\x01\ +\x08\xff\x9a\x007\x01\x0d\xff\x9a\x007\x01\x0e\xff\xd7\x00\ +7\x01\x0f\xffq\x007\x01\x10\xff\xd7\x007\x01\x11\xff\ +q\x007\x01\x12\xff\xd7\x007\x01\x13\xffq\x007\x01\ +\x14\xff\xd7\x007\x01\x15\xffq\x007\x01\x17\xff\x9a\x00\ +7\x01\x19\xff\x9a\x007\x01\x1d\xff\x85\x007\x01!\xff\ +\x85\x007\x01$\x00)\x007\x01&\x00)\x007\x01\ ++\xff\x9a\x007\x01-\xff\x9a\x007\x01/\xff\x9a\x00\ +7\x011\xff\x9a\x007\x013\xff\x9a\x007\x015\xff\ +\x9a\x007\x017\xff\xd7\x007\x01<\xff\xae\x007\x01\ +>\xff\xae\x007\x01@\xff\xae\x007\x01C\xffq\x00\ +7\x01D\xff\x5c\x007\x01F\xff\x5c\x007\x01G\xff\ +\xd7\x007\x01H\xffq\x007\x01J\xff\x85\x007\x01\ +\xfb\xff\xd7\x007\x01\xfd\xff\xd7\x007\x02\x02\xff\xae\x00\ +7\x02\x03\xff\xae\x007\x02\x04\xff\xae\x007\x02\x08\xff\ +\x85\x007\x02\x0c\xff\x85\x007\x02W\xff\x9a\x007\x02\ +X\xffq\x007\x02Y\xff\x5c\x007\x02_\xff\xd7\x00\ +7\x02`\xffq\x007\x02b\xff\x9a\x007\x03\x1d\xff\ +q\x007\x03\x1e\xff\x5c\x007\x03\x1f\xffq\x007\x03\ + \xff\x5c\x007\x03!\xffq\x007\x03\x22\xff\x5c\x00\ +7\x03#\xffq\x007\x03%\xffq\x007\x03&\xff\ +\x5c\x007\x03'\xffq\x007\x03(\xff\x5c\x007\x03\ +)\xffq\x007\x03*\xff\x5c\x007\x03+\xffq\x00\ +7\x03,\xff\x5c\x007\x03-\xffq\x007\x03.\xff\ +\x5c\x007\x03/\xffq\x007\x030\xff\x5c\x007\x03\ +1\xffq\x007\x032\xff\x5c\x007\x033\xffq\x00\ +7\x034\xff\x5c\x007\x036\xffq\x007\x038\xff\ +q\x007\x03:\xffq\x007\x03<\xffq\x007\x03\ +@\xffq\x007\x03B\xffq\x007\x03D\xffq\x00\ +7\x03I\xff\xd7\x007\x03J\xffq\x007\x03K\xff\ +\xd7\x007\x03L\xffq\x007\x03M\xff\xd7\x007\x03\ +N\xffq\x007\x03O\xff\xd7\x007\x03Q\xff\xd7\x00\ +7\x03R\xffq\x007\x03S\xff\xd7\x007\x03T\xff\ +q\x007\x03U\xff\xd7\x007\x03V\xffq\x007\x03\ +W\xff\xd7\x007\x03X\xffq\x007\x03Y\xff\xd7\x00\ +7\x03Z\xffq\x007\x03[\xff\xd7\x007\x03\x5c\xff\ +q\x007\x03]\xff\xd7\x007\x03^\xffq\x007\x03\ +_\xff\xd7\x007\x03`\xffq\x007\x03b\xff\x9a\x00\ +7\x03d\xff\x9a\x007\x03f\xff\x9a\x007\x03h\xff\ +\x9a\x007\x03j\xff\x9a\x007\x03l\xff\x9a\x007\x03\ +n\xff\x9a\x007\x03p\xff\xd7\x007\x03\x8f\x00)\x00\ +8\x00\x0f\xff\xd7\x008\x00\x11\xff\xd7\x008\x00$\xff\ +\xec\x008\x00\x82\xff\xec\x008\x00\x83\xff\xec\x008\x00\ +\x84\xff\xec\x008\x00\x85\xff\xec\x008\x00\x86\xff\xec\x00\ +8\x00\x87\xff\xec\x008\x00\xc2\xff\xec\x008\x00\xc4\xff\ +\xec\x008\x00\xc6\xff\xec\x008\x01C\xff\xec\x008\x02\ +\x08\xff\xd7\x008\x02\x0c\xff\xd7\x008\x02X\xff\xec\x00\ +8\x03\x1d\xff\xec\x008\x03\x1f\xff\xec\x008\x03!\xff\ +\xec\x008\x03#\xff\xec\x008\x03%\xff\xec\x008\x03\ +'\xff\xec\x008\x03)\xff\xec\x008\x03+\xff\xec\x00\ +8\x03-\xff\xec\x008\x03/\xff\xec\x008\x031\xff\ +\xec\x008\x033\xff\xec\x009\x00\x0f\xff\x9a\x009\x00\ +\x11\xff\x9a\x009\x00\x22\x00)\x009\x00$\xff\xae\x00\ +9\x00&\xff\xec\x009\x00*\xff\xec\x009\x002\xff\ +\xec\x009\x004\xff\xec\x009\x00D\xff\xd7\x009\x00\ +F\xff\xd7\x009\x00G\xff\xd7\x009\x00H\xff\xd7\x00\ +9\x00J\xff\xec\x009\x00P\xff\xec\x009\x00Q\xff\ +\xec\x009\x00R\xff\xd7\x009\x00S\xff\xec\x009\x00\ +T\xff\xd7\x009\x00U\xff\xec\x009\x00V\xff\xec\x00\ +9\x00X\xff\xec\x009\x00\x82\xff\xae\x009\x00\x83\xff\ +\xae\x009\x00\x84\xff\xae\x009\x00\x85\xff\xae\x009\x00\ +\x86\xff\xae\x009\x00\x87\xff\xae\x009\x00\x89\xff\xec\x00\ +9\x00\x94\xff\xec\x009\x00\x95\xff\xec\x009\x00\x96\xff\ +\xec\x009\x00\x97\xff\xec\x009\x00\x98\xff\xec\x009\x00\ +\x9a\xff\xec\x009\x00\xa2\xff\xd7\x009\x00\xa3\xff\xd7\x00\ +9\x00\xa4\xff\xd7\x009\x00\xa5\xff\xd7\x009\x00\xa6\xff\ +\xd7\x009\x00\xa7\xff\xd7\x009\x00\xa8\xff\xd7\x009\x00\ +\xa9\xff\xd7\x009\x00\xaa\xff\xd7\x009\x00\xab\xff\xd7\x00\ +9\x00\xac\xff\xd7\x009\x00\xad\xff\xd7\x009\x00\xb4\xff\ +\xd7\x009\x00\xb5\xff\xd7\x009\x00\xb6\xff\xd7\x009\x00\ +\xb7\xff\xd7\x009\x00\xb8\xff\xd7\x009\x00\xba\xff\xd7\x00\ +9\x00\xbb\xff\xec\x009\x00\xbc\xff\xec\x009\x00\xbd\xff\ +\xec\x009\x00\xbe\xff\xec\x009\x00\xc2\xff\xae\x009\x00\ +\xc3\xff\xd7\x009\x00\xc4\xff\xae\x009\x00\xc5\xff\xd7\x00\ +9\x00\xc6\xff\xae\x009\x00\xc7\xff\xd7\x009\x00\xc8\xff\ +\xec\x009\x00\xc9\xff\xd7\x009\x00\xca\xff\xec\x009\x00\ +\xcb\xff\xd7\x009\x00\xcc\xff\xec\x009\x00\xcd\xff\xd7\x00\ +9\x00\xce\xff\xec\x009\x00\xcf\xff\xd7\x009\x00\xd1\xff\ +\xd7\x009\x00\xd3\xff\xd7\x009\x00\xd5\xff\xd7\x009\x00\ +\xd7\xff\xd7\x009\x00\xd9\xff\xd7\x009\x00\xdb\xff\xd7\x00\ +9\x00\xdd\xff\xd7\x009\x00\xde\xff\xec\x009\x00\xdf\xff\ +\xec\x009\x00\xe0\xff\xec\x009\x00\xe1\xff\xec\x009\x00\ +\xe2\xff\xec\x009\x00\xe3\xff\xec\x009\x00\xe4\xff\xec\x00\ +9\x00\xe5\xff\xec\x009\x00\xfa\xff\xec\x009\x01\x06\xff\ +\xec\x009\x01\x08\xff\xec\x009\x01\x0d\xff\xec\x009\x01\ +\x0e\xff\xec\x009\x01\x0f\xff\xd7\x009\x01\x10\xff\xec\x00\ +9\x01\x11\xff\xd7\x009\x01\x12\xff\xec\x009\x01\x13\xff\ +\xd7\x009\x01\x14\xff\xec\x009\x01\x15\xff\xd7\x009\x01\ +\x17\xff\xec\x009\x01\x19\xff\xec\x009\x01\x1d\xff\xec\x00\ +9\x01!\xff\xec\x009\x01+\xff\xec\x009\x01-\xff\ +\xec\x009\x01/\xff\xec\x009\x011\xff\xec\x009\x01\ +3\xff\xec\x009\x015\xff\xec\x009\x01C\xff\xae\x00\ +9\x01D\xff\xd7\x009\x01F\xff\xd7\x009\x01G\xff\ +\xec\x009\x01H\xff\xd7\x009\x01J\xff\xec\x009\x02\ +\x08\xff\x9a\x009\x02\x0c\xff\x9a\x009\x02W\xff\xec\x00\ +9\x02X\xff\xae\x009\x02Y\xff\xd7\x009\x02_\xff\ +\xec\x009\x02`\xff\xd7\x009\x02b\xff\xec\x009\x03\ +\x1d\xff\xae\x009\x03\x1e\xff\xd7\x009\x03\x1f\xff\xae\x00\ +9\x03 \xff\xd7\x009\x03!\xff\xae\x009\x03\x22\xff\ +\xd7\x009\x03#\xff\xae\x009\x03%\xff\xae\x009\x03\ +&\xff\xd7\x009\x03'\xff\xae\x009\x03(\xff\xd7\x00\ +9\x03)\xff\xae\x009\x03*\xff\xd7\x009\x03+\xff\ +\xae\x009\x03,\xff\xd7\x009\x03-\xff\xae\x009\x03\ +.\xff\xd7\x009\x03/\xff\xae\x009\x030\xff\xd7\x00\ +9\x031\xff\xae\x009\x032\xff\xd7\x009\x033\xff\ +\xae\x009\x034\xff\xd7\x009\x036\xff\xd7\x009\x03\ +8\xff\xd7\x009\x03:\xff\xd7\x009\x03<\xff\xd7\x00\ +9\x03@\xff\xd7\x009\x03B\xff\xd7\x009\x03D\xff\ +\xd7\x009\x03I\xff\xec\x009\x03J\xff\xd7\x009\x03\ +K\xff\xec\x009\x03L\xff\xd7\x009\x03M\xff\xec\x00\ +9\x03N\xff\xd7\x009\x03O\xff\xec\x009\x03Q\xff\ +\xec\x009\x03R\xff\xd7\x009\x03S\xff\xec\x009\x03\ +T\xff\xd7\x009\x03U\xff\xec\x009\x03V\xff\xd7\x00\ +9\x03W\xff\xec\x009\x03X\xff\xd7\x009\x03Y\xff\ +\xec\x009\x03Z\xff\xd7\x009\x03[\xff\xec\x009\x03\ +\x5c\xff\xd7\x009\x03]\xff\xec\x009\x03^\xff\xd7\x00\ +9\x03_\xff\xec\x009\x03`\xff\xd7\x009\x03b\xff\ +\xec\x009\x03d\xff\xec\x009\x03f\xff\xec\x009\x03\ +h\xff\xec\x009\x03j\xff\xec\x009\x03l\xff\xec\x00\ +9\x03n\xff\xec\x00:\x00\x0f\xff\x9a\x00:\x00\x11\xff\ +\x9a\x00:\x00\x22\x00)\x00:\x00$\xff\xae\x00:\x00\ +&\xff\xec\x00:\x00*\xff\xec\x00:\x002\xff\xec\x00\ +:\x004\xff\xec\x00:\x00D\xff\xd7\x00:\x00F\xff\ +\xd7\x00:\x00G\xff\xd7\x00:\x00H\xff\xd7\x00:\x00\ +J\xff\xec\x00:\x00P\xff\xec\x00:\x00Q\xff\xec\x00\ +:\x00R\xff\xd7\x00:\x00S\xff\xec\x00:\x00T\xff\ +\xd7\x00:\x00U\xff\xec\x00:\x00V\xff\xec\x00:\x00\ +X\xff\xec\x00:\x00\x82\xff\xae\x00:\x00\x83\xff\xae\x00\ +:\x00\x84\xff\xae\x00:\x00\x85\xff\xae\x00:\x00\x86\xff\ +\xae\x00:\x00\x87\xff\xae\x00:\x00\x89\xff\xec\x00:\x00\ +\x94\xff\xec\x00:\x00\x95\xff\xec\x00:\x00\x96\xff\xec\x00\ +:\x00\x97\xff\xec\x00:\x00\x98\xff\xec\x00:\x00\x9a\xff\ +\xec\x00:\x00\xa2\xff\xd7\x00:\x00\xa3\xff\xd7\x00:\x00\ +\xa4\xff\xd7\x00:\x00\xa5\xff\xd7\x00:\x00\xa6\xff\xd7\x00\ +:\x00\xa7\xff\xd7\x00:\x00\xa8\xff\xd7\x00:\x00\xa9\xff\ +\xd7\x00:\x00\xaa\xff\xd7\x00:\x00\xab\xff\xd7\x00:\x00\ +\xac\xff\xd7\x00:\x00\xad\xff\xd7\x00:\x00\xb4\xff\xd7\x00\ +:\x00\xb5\xff\xd7\x00:\x00\xb6\xff\xd7\x00:\x00\xb7\xff\ +\xd7\x00:\x00\xb8\xff\xd7\x00:\x00\xba\xff\xd7\x00:\x00\ +\xbb\xff\xec\x00:\x00\xbc\xff\xec\x00:\x00\xbd\xff\xec\x00\ +:\x00\xbe\xff\xec\x00:\x00\xc2\xff\xae\x00:\x00\xc3\xff\ +\xd7\x00:\x00\xc4\xff\xae\x00:\x00\xc5\xff\xd7\x00:\x00\ +\xc6\xff\xae\x00:\x00\xc7\xff\xd7\x00:\x00\xc8\xff\xec\x00\ +:\x00\xc9\xff\xd7\x00:\x00\xca\xff\xec\x00:\x00\xcb\xff\ +\xd7\x00:\x00\xcc\xff\xec\x00:\x00\xcd\xff\xd7\x00:\x00\ +\xce\xff\xec\x00:\x00\xcf\xff\xd7\x00:\x00\xd1\xff\xd7\x00\ +:\x00\xd3\xff\xd7\x00:\x00\xd5\xff\xd7\x00:\x00\xd7\xff\ +\xd7\x00:\x00\xd9\xff\xd7\x00:\x00\xdb\xff\xd7\x00:\x00\ +\xdd\xff\xd7\x00:\x00\xde\xff\xec\x00:\x00\xdf\xff\xec\x00\ +:\x00\xe0\xff\xec\x00:\x00\xe1\xff\xec\x00:\x00\xe2\xff\ +\xec\x00:\x00\xe3\xff\xec\x00:\x00\xe4\xff\xec\x00:\x00\ +\xe5\xff\xec\x00:\x00\xfa\xff\xec\x00:\x01\x06\xff\xec\x00\ +:\x01\x08\xff\xec\x00:\x01\x0d\xff\xec\x00:\x01\x0e\xff\ +\xec\x00:\x01\x0f\xff\xd7\x00:\x01\x10\xff\xec\x00:\x01\ +\x11\xff\xd7\x00:\x01\x12\xff\xec\x00:\x01\x13\xff\xd7\x00\ +:\x01\x14\xff\xec\x00:\x01\x15\xff\xd7\x00:\x01\x17\xff\ +\xec\x00:\x01\x19\xff\xec\x00:\x01\x1d\xff\xec\x00:\x01\ +!\xff\xec\x00:\x01+\xff\xec\x00:\x01-\xff\xec\x00\ +:\x01/\xff\xec\x00:\x011\xff\xec\x00:\x013\xff\ +\xec\x00:\x015\xff\xec\x00:\x01C\xff\xae\x00:\x01\ +D\xff\xd7\x00:\x01F\xff\xd7\x00:\x01G\xff\xec\x00\ +:\x01H\xff\xd7\x00:\x01J\xff\xec\x00:\x02\x08\xff\ +\x9a\x00:\x02\x0c\xff\x9a\x00:\x02W\xff\xec\x00:\x02\ +X\xff\xae\x00:\x02Y\xff\xd7\x00:\x02_\xff\xec\x00\ +:\x02`\xff\xd7\x00:\x02b\xff\xec\x00:\x03\x1d\xff\ +\xae\x00:\x03\x1e\xff\xd7\x00:\x03\x1f\xff\xae\x00:\x03\ + \xff\xd7\x00:\x03!\xff\xae\x00:\x03\x22\xff\xd7\x00\ +:\x03#\xff\xae\x00:\x03%\xff\xae\x00:\x03&\xff\ +\xd7\x00:\x03'\xff\xae\x00:\x03(\xff\xd7\x00:\x03\ +)\xff\xae\x00:\x03*\xff\xd7\x00:\x03+\xff\xae\x00\ +:\x03,\xff\xd7\x00:\x03-\xff\xae\x00:\x03.\xff\ +\xd7\x00:\x03/\xff\xae\x00:\x030\xff\xd7\x00:\x03\ +1\xff\xae\x00:\x032\xff\xd7\x00:\x033\xff\xae\x00\ +:\x034\xff\xd7\x00:\x036\xff\xd7\x00:\x038\xff\ +\xd7\x00:\x03:\xff\xd7\x00:\x03<\xff\xd7\x00:\x03\ +@\xff\xd7\x00:\x03B\xff\xd7\x00:\x03D\xff\xd7\x00\ +:\x03I\xff\xec\x00:\x03J\xff\xd7\x00:\x03K\xff\ +\xec\x00:\x03L\xff\xd7\x00:\x03M\xff\xec\x00:\x03\ +N\xff\xd7\x00:\x03O\xff\xec\x00:\x03Q\xff\xec\x00\ +:\x03R\xff\xd7\x00:\x03S\xff\xec\x00:\x03T\xff\ +\xd7\x00:\x03U\xff\xec\x00:\x03V\xff\xd7\x00:\x03\ +W\xff\xec\x00:\x03X\xff\xd7\x00:\x03Y\xff\xec\x00\ +:\x03Z\xff\xd7\x00:\x03[\xff\xec\x00:\x03\x5c\xff\ +\xd7\x00:\x03]\xff\xec\x00:\x03^\xff\xd7\x00:\x03\ +_\xff\xec\x00:\x03`\xff\xd7\x00:\x03b\xff\xec\x00\ +:\x03d\xff\xec\x00:\x03f\xff\xec\x00:\x03h\xff\ +\xec\x00:\x03j\xff\xec\x00:\x03l\xff\xec\x00:\x03\ +n\xff\xec\x00;\x00&\xff\xd7\x00;\x00*\xff\xd7\x00\ +;\x002\xff\xd7\x00;\x004\xff\xd7\x00;\x00\x89\xff\ +\xd7\x00;\x00\x94\xff\xd7\x00;\x00\x95\xff\xd7\x00;\x00\ +\x96\xff\xd7\x00;\x00\x97\xff\xd7\x00;\x00\x98\xff\xd7\x00\ +;\x00\x9a\xff\xd7\x00;\x00\xc8\xff\xd7\x00;\x00\xca\xff\ +\xd7\x00;\x00\xcc\xff\xd7\x00;\x00\xce\xff\xd7\x00;\x00\ +\xde\xff\xd7\x00;\x00\xe0\xff\xd7\x00;\x00\xe2\xff\xd7\x00\ +;\x00\xe4\xff\xd7\x00;\x01\x0e\xff\xd7\x00;\x01\x10\xff\ +\xd7\x00;\x01\x12\xff\xd7\x00;\x01\x14\xff\xd7\x00;\x01\ +G\xff\xd7\x00;\x02_\xff\xd7\x00;\x03I\xff\xd7\x00\ +;\x03K\xff\xd7\x00;\x03M\xff\xd7\x00;\x03O\xff\ +\xd7\x00;\x03Q\xff\xd7\x00;\x03S\xff\xd7\x00;\x03\ +U\xff\xd7\x00;\x03W\xff\xd7\x00;\x03Y\xff\xd7\x00\ +;\x03[\xff\xd7\x00;\x03]\xff\xd7\x00;\x03_\xff\ +\xd7\x00<\x00\x0f\xff\x85\x00<\x00\x11\xff\x85\x00<\x00\ +\x22\x00)\x00<\x00$\xff\x85\x00<\x00&\xff\xd7\x00\ +<\x00*\xff\xd7\x00<\x002\xff\xd7\x00<\x004\xff\ +\xd7\x00<\x00D\xff\x9a\x00<\x00F\xff\x9a\x00<\x00\ +G\xff\x9a\x00<\x00H\xff\x9a\x00<\x00J\xff\xd7\x00\ +<\x00P\xff\xc3\x00<\x00Q\xff\xc3\x00<\x00R\xff\ +\x9a\x00<\x00S\xff\xc3\x00<\x00T\xff\x9a\x00<\x00\ +U\xff\xc3\x00<\x00V\xff\xae\x00<\x00X\xff\xc3\x00\ +<\x00]\xff\xd7\x00<\x00\x82\xff\x85\x00<\x00\x83\xff\ +\x85\x00<\x00\x84\xff\x85\x00<\x00\x85\xff\x85\x00<\x00\ +\x86\xff\x85\x00<\x00\x87\xff\x85\x00<\x00\x89\xff\xd7\x00\ +<\x00\x94\xff\xd7\x00<\x00\x95\xff\xd7\x00<\x00\x96\xff\ +\xd7\x00<\x00\x97\xff\xd7\x00<\x00\x98\xff\xd7\x00<\x00\ +\x9a\xff\xd7\x00<\x00\xa2\xff\x9a\x00<\x00\xa3\xff\x9a\x00\ +<\x00\xa4\xff\x9a\x00<\x00\xa5\xff\x9a\x00<\x00\xa6\xff\ +\x9a\x00<\x00\xa7\xff\x9a\x00<\x00\xa8\xff\x9a\x00<\x00\ +\xa9\xff\x9a\x00<\x00\xaa\xff\x9a\x00<\x00\xab\xff\x9a\x00\ +<\x00\xac\xff\x9a\x00<\x00\xad\xff\x9a\x00<\x00\xb4\xff\ +\x9a\x00<\x00\xb5\xff\x9a\x00<\x00\xb6\xff\x9a\x00<\x00\ +\xb7\xff\x9a\x00<\x00\xb8\xff\x9a\x00<\x00\xba\xff\x9a\x00\ +<\x00\xbb\xff\xc3\x00<\x00\xbc\xff\xc3\x00<\x00\xbd\xff\ +\xc3\x00<\x00\xbe\xff\xc3\x00<\x00\xc2\xff\x85\x00<\x00\ +\xc3\xff\x9a\x00<\x00\xc4\xff\x85\x00<\x00\xc5\xff\x9a\x00\ +<\x00\xc6\xff\x85\x00<\x00\xc7\xff\x9a\x00<\x00\xc8\xff\ +\xd7\x00<\x00\xc9\xff\x9a\x00<\x00\xca\xff\xd7\x00<\x00\ +\xcb\xff\x9a\x00<\x00\xcc\xff\xd7\x00<\x00\xcd\xff\x9a\x00\ +<\x00\xce\xff\xd7\x00<\x00\xcf\xff\x9a\x00<\x00\xd1\xff\ +\x9a\x00<\x00\xd3\xff\x9a\x00<\x00\xd5\xff\x9a\x00<\x00\ +\xd7\xff\x9a\x00<\x00\xd9\xff\x9a\x00<\x00\xdb\xff\x9a\x00\ +<\x00\xdd\xff\x9a\x00<\x00\xde\xff\xd7\x00<\x00\xdf\xff\ +\xd7\x00<\x00\xe0\xff\xd7\x00<\x00\xe1\xff\xd7\x00<\x00\ +\xe2\xff\xd7\x00<\x00\xe3\xff\xd7\x00<\x00\xe4\xff\xd7\x00\ +<\x00\xe5\xff\xd7\x00<\x00\xfa\xff\xc3\x00<\x01\x06\xff\ +\xc3\x00<\x01\x08\xff\xc3\x00<\x01\x0d\xff\xc3\x00<\x01\ +\x0e\xff\xd7\x00<\x01\x0f\xff\x9a\x00<\x01\x10\xff\xd7\x00\ +<\x01\x11\xff\x9a\x00<\x01\x12\xff\xd7\x00<\x01\x13\xff\ +\x9a\x00<\x01\x14\xff\xd7\x00<\x01\x15\xff\x9a\x00<\x01\ +\x17\xff\xc3\x00<\x01\x19\xff\xc3\x00<\x01\x1d\xff\xae\x00\ +<\x01!\xff\xae\x00<\x01+\xff\xc3\x00<\x01-\xff\ +\xc3\x00<\x01/\xff\xc3\x00<\x011\xff\xc3\x00<\x01\ +3\xff\xc3\x00<\x015\xff\xc3\x00<\x01<\xff\xd7\x00\ +<\x01>\xff\xd7\x00<\x01@\xff\xd7\x00<\x01C\xff\ +\x85\x00<\x01D\xff\x9a\x00<\x01F\xff\x9a\x00<\x01\ +G\xff\xd7\x00<\x01H\xff\x9a\x00<\x01J\xff\xae\x00\ +<\x02\x08\xff\x85\x00<\x02\x0c\xff\x85\x00<\x02W\xff\ +\xc3\x00<\x02X\xff\x85\x00<\x02Y\xff\x9a\x00<\x02\ +_\xff\xd7\x00<\x02`\xff\x9a\x00<\x02b\xff\xc3\x00\ +<\x03\x1d\xff\x85\x00<\x03\x1e\xff\x9a\x00<\x03\x1f\xff\ +\x85\x00<\x03 \xff\x9a\x00<\x03!\xff\x85\x00<\x03\ +\x22\xff\x9a\x00<\x03#\xff\x85\x00<\x03%\xff\x85\x00\ +<\x03&\xff\x9a\x00<\x03'\xff\x85\x00<\x03(\xff\ +\x9a\x00<\x03)\xff\x85\x00<\x03*\xff\x9a\x00<\x03\ ++\xff\x85\x00<\x03,\xff\x9a\x00<\x03-\xff\x85\x00\ +<\x03.\xff\x9a\x00<\x03/\xff\x85\x00<\x030\xff\ +\x9a\x00<\x031\xff\x85\x00<\x032\xff\x9a\x00<\x03\ +3\xff\x85\x00<\x034\xff\x9a\x00<\x036\xff\x9a\x00\ +<\x038\xff\x9a\x00<\x03:\xff\x9a\x00<\x03<\xff\ +\x9a\x00<\x03@\xff\x9a\x00<\x03B\xff\x9a\x00<\x03\ +D\xff\x9a\x00<\x03I\xff\xd7\x00<\x03J\xff\x9a\x00\ +<\x03K\xff\xd7\x00<\x03L\xff\x9a\x00<\x03M\xff\ +\xd7\x00<\x03N\xff\x9a\x00<\x03O\xff\xd7\x00<\x03\ +Q\xff\xd7\x00<\x03R\xff\x9a\x00<\x03S\xff\xd7\x00\ +<\x03T\xff\x9a\x00<\x03U\xff\xd7\x00<\x03V\xff\ +\x9a\x00<\x03W\xff\xd7\x00<\x03X\xff\x9a\x00<\x03\ +Y\xff\xd7\x00<\x03Z\xff\x9a\x00<\x03[\xff\xd7\x00\ +<\x03\x5c\xff\x9a\x00<\x03]\xff\xd7\x00<\x03^\xff\ +\x9a\x00<\x03_\xff\xd7\x00<\x03`\xff\x9a\x00<\x03\ +b\xff\xc3\x00<\x03d\xff\xc3\x00<\x03f\xff\xc3\x00\ +<\x03h\xff\xc3\x00<\x03j\xff\xc3\x00<\x03l\xff\ +\xc3\x00<\x03n\xff\xc3\x00=\x00&\xff\xec\x00=\x00\ +*\xff\xec\x00=\x002\xff\xec\x00=\x004\xff\xec\x00\ +=\x00\x89\xff\xec\x00=\x00\x94\xff\xec\x00=\x00\x95\xff\ +\xec\x00=\x00\x96\xff\xec\x00=\x00\x97\xff\xec\x00=\x00\ +\x98\xff\xec\x00=\x00\x9a\xff\xec\x00=\x00\xc8\xff\xec\x00\ +=\x00\xca\xff\xec\x00=\x00\xcc\xff\xec\x00=\x00\xce\xff\ +\xec\x00=\x00\xde\xff\xec\x00=\x00\xe0\xff\xec\x00=\x00\ +\xe2\xff\xec\x00=\x00\xe4\xff\xec\x00=\x01\x0e\xff\xec\x00\ +=\x01\x10\xff\xec\x00=\x01\x12\xff\xec\x00=\x01\x14\xff\ +\xec\x00=\x01G\xff\xec\x00=\x02_\xff\xec\x00=\x03\ +I\xff\xec\x00=\x03K\xff\xec\x00=\x03M\xff\xec\x00\ +=\x03O\xff\xec\x00=\x03Q\xff\xec\x00=\x03S\xff\ +\xec\x00=\x03U\xff\xec\x00=\x03W\xff\xec\x00=\x03\ +Y\xff\xec\x00=\x03[\xff\xec\x00=\x03]\xff\xec\x00\ +=\x03_\xff\xec\x00>\x00-\x00\xb8\x00D\x00\x05\xff\ +\xec\x00D\x00\x0a\xff\xec\x00D\x02\x07\xff\xec\x00D\x02\ +\x0b\xff\xec\x00E\x00\x05\xff\xec\x00E\x00\x0a\xff\xec\x00\ +E\x00Y\xff\xd7\x00E\x00Z\xff\xd7\x00E\x00[\xff\ +\xd7\x00E\x00\x5c\xff\xd7\x00E\x00]\xff\xec\x00E\x00\ +\xbf\xff\xd7\x00E\x017\xff\xd7\x00E\x01<\xff\xec\x00\ +E\x01>\xff\xec\x00E\x01@\xff\xec\x00E\x01\xfb\xff\ +\xd7\x00E\x01\xfd\xff\xd7\x00E\x02\x07\xff\xec\x00E\x02\ +\x0b\xff\xec\x00E\x03p\xff\xd7\x00F\x00\x05\x00)\x00\ +F\x00\x0a\x00)\x00F\x02\x07\x00)\x00F\x02\x0b\x00\ +)\x00H\x00\x05\xff\xec\x00H\x00\x0a\xff\xec\x00H\x00\ +Y\xff\xd7\x00H\x00Z\xff\xd7\x00H\x00[\xff\xd7\x00\ +H\x00\x5c\xff\xd7\x00H\x00]\xff\xec\x00H\x00\xbf\xff\ +\xd7\x00H\x017\xff\xd7\x00H\x01<\xff\xec\x00H\x01\ +>\xff\xec\x00H\x01@\xff\xec\x00H\x01\xfb\xff\xd7\x00\ +H\x01\xfd\xff\xd7\x00H\x02\x07\xff\xec\x00H\x02\x0b\xff\ +\xec\x00H\x03p\xff\xd7\x00I\x00\x05\x00{\x00I\x00\ +\x0a\x00{\x00I\x02\x07\x00{\x00I\x02\x0b\x00{\x00\ +K\x00\x05\xff\xec\x00K\x00\x0a\xff\xec\x00K\x02\x07\xff\ +\xec\x00K\x02\x0b\xff\xec\x00N\x00F\xff\xd7\x00N\x00\ +G\xff\xd7\x00N\x00H\xff\xd7\x00N\x00R\xff\xd7\x00\ +N\x00T\xff\xd7\x00N\x00\xa2\xff\xd7\x00N\x00\xa9\xff\ +\xd7\x00N\x00\xaa\xff\xd7\x00N\x00\xab\xff\xd7\x00N\x00\ +\xac\xff\xd7\x00N\x00\xad\xff\xd7\x00N\x00\xb4\xff\xd7\x00\ +N\x00\xb5\xff\xd7\x00N\x00\xb6\xff\xd7\x00N\x00\xb7\xff\ +\xd7\x00N\x00\xb8\xff\xd7\x00N\x00\xba\xff\xd7\x00N\x00\ +\xc9\xff\xd7\x00N\x00\xcb\xff\xd7\x00N\x00\xcd\xff\xd7\x00\ +N\x00\xcf\xff\xd7\x00N\x00\xd1\xff\xd7\x00N\x00\xd3\xff\ +\xd7\x00N\x00\xd5\xff\xd7\x00N\x00\xd7\xff\xd7\x00N\x00\ +\xd9\xff\xd7\x00N\x00\xdb\xff\xd7\x00N\x00\xdd\xff\xd7\x00\ +N\x01\x0f\xff\xd7\x00N\x01\x11\xff\xd7\x00N\x01\x13\xff\ +\xd7\x00N\x01\x15\xff\xd7\x00N\x01H\xff\xd7\x00N\x02\ +`\xff\xd7\x00N\x036\xff\xd7\x00N\x038\xff\xd7\x00\ +N\x03:\xff\xd7\x00N\x03<\xff\xd7\x00N\x03@\xff\ +\xd7\x00N\x03B\xff\xd7\x00N\x03D\xff\xd7\x00N\x03\ +J\xff\xd7\x00N\x03L\xff\xd7\x00N\x03N\xff\xd7\x00\ +N\x03R\xff\xd7\x00N\x03T\xff\xd7\x00N\x03V\xff\ +\xd7\x00N\x03X\xff\xd7\x00N\x03Z\xff\xd7\x00N\x03\ +\x5c\xff\xd7\x00N\x03^\xff\xd7\x00N\x03`\xff\xd7\x00\ +P\x00\x05\xff\xec\x00P\x00\x0a\xff\xec\x00P\x02\x07\xff\ +\xec\x00P\x02\x0b\xff\xec\x00Q\x00\x05\xff\xec\x00Q\x00\ +\x0a\xff\xec\x00Q\x02\x07\xff\xec\x00Q\x02\x0b\xff\xec\x00\ +R\x00\x05\xff\xec\x00R\x00\x0a\xff\xec\x00R\x00Y\xff\ +\xd7\x00R\x00Z\xff\xd7\x00R\x00[\xff\xd7\x00R\x00\ +\x5c\xff\xd7\x00R\x00]\xff\xec\x00R\x00\xbf\xff\xd7\x00\ +R\x017\xff\xd7\x00R\x01<\xff\xec\x00R\x01>\xff\ +\xec\x00R\x01@\xff\xec\x00R\x01\xfb\xff\xd7\x00R\x01\ +\xfd\xff\xd7\x00R\x02\x07\xff\xec\x00R\x02\x0b\xff\xec\x00\ +R\x03p\xff\xd7\x00S\x00\x05\xff\xec\x00S\x00\x0a\xff\ +\xec\x00S\x00Y\xff\xd7\x00S\x00Z\xff\xd7\x00S\x00\ +[\xff\xd7\x00S\x00\x5c\xff\xd7\x00S\x00]\xff\xec\x00\ +S\x00\xbf\xff\xd7\x00S\x017\xff\xd7\x00S\x01<\xff\ +\xec\x00S\x01>\xff\xec\x00S\x01@\xff\xec\x00S\x01\ +\xfb\xff\xd7\x00S\x01\xfd\xff\xd7\x00S\x02\x07\xff\xec\x00\ +S\x02\x0b\xff\xec\x00S\x03p\xff\xd7\x00U\x00\x05\x00\ +R\x00U\x00\x0a\x00R\x00U\x00D\xff\xd7\x00U\x00\ +F\xff\xd7\x00U\x00G\xff\xd7\x00U\x00H\xff\xd7\x00\ +U\x00J\xff\xec\x00U\x00R\xff\xd7\x00U\x00T\xff\ +\xd7\x00U\x00\xa2\xff\xd7\x00U\x00\xa3\xff\xd7\x00U\x00\ +\xa4\xff\xd7\x00U\x00\xa5\xff\xd7\x00U\x00\xa6\xff\xd7\x00\ +U\x00\xa7\xff\xd7\x00U\x00\xa8\xff\xd7\x00U\x00\xa9\xff\ +\xd7\x00U\x00\xaa\xff\xd7\x00U\x00\xab\xff\xd7\x00U\x00\ +\xac\xff\xd7\x00U\x00\xad\xff\xd7\x00U\x00\xb4\xff\xd7\x00\ +U\x00\xb5\xff\xd7\x00U\x00\xb6\xff\xd7\x00U\x00\xb7\xff\ +\xd7\x00U\x00\xb8\xff\xd7\x00U\x00\xba\xff\xd7\x00U\x00\ +\xc3\xff\xd7\x00U\x00\xc5\xff\xd7\x00U\x00\xc7\xff\xd7\x00\ +U\x00\xc9\xff\xd7\x00U\x00\xcb\xff\xd7\x00U\x00\xcd\xff\ +\xd7\x00U\x00\xcf\xff\xd7\x00U\x00\xd1\xff\xd7\x00U\x00\ +\xd3\xff\xd7\x00U\x00\xd5\xff\xd7\x00U\x00\xd7\xff\xd7\x00\ +U\x00\xd9\xff\xd7\x00U\x00\xdb\xff\xd7\x00U\x00\xdd\xff\ +\xd7\x00U\x00\xdf\xff\xec\x00U\x00\xe1\xff\xec\x00U\x00\ +\xe3\xff\xec\x00U\x00\xe5\xff\xec\x00U\x01\x0f\xff\xd7\x00\ +U\x01\x11\xff\xd7\x00U\x01\x13\xff\xd7\x00U\x01\x15\xff\ +\xd7\x00U\x01D\xff\xd7\x00U\x01F\xff\xd7\x00U\x01\ +H\xff\xd7\x00U\x02\x07\x00R\x00U\x02\x0b\x00R\x00\ +U\x02Y\xff\xd7\x00U\x02`\xff\xd7\x00U\x03\x1e\xff\ +\xd7\x00U\x03 \xff\xd7\x00U\x03\x22\xff\xd7\x00U\x03\ +&\xff\xd7\x00U\x03(\xff\xd7\x00U\x03*\xff\xd7\x00\ +U\x03,\xff\xd7\x00U\x03.\xff\xd7\x00U\x030\xff\ +\xd7\x00U\x032\xff\xd7\x00U\x034\xff\xd7\x00U\x03\ +6\xff\xd7\x00U\x038\xff\xd7\x00U\x03:\xff\xd7\x00\ +U\x03<\xff\xd7\x00U\x03@\xff\xd7\x00U\x03B\xff\ +\xd7\x00U\x03D\xff\xd7\x00U\x03J\xff\xd7\x00U\x03\ +L\xff\xd7\x00U\x03N\xff\xd7\x00U\x03R\xff\xd7\x00\ +U\x03T\xff\xd7\x00U\x03V\xff\xd7\x00U\x03X\xff\ +\xd7\x00U\x03Z\xff\xd7\x00U\x03\x5c\xff\xd7\x00U\x03\ +^\xff\xd7\x00U\x03`\xff\xd7\x00W\x00\x05\x00)\x00\ +W\x00\x0a\x00)\x00W\x02\x07\x00)\x00W\x02\x0b\x00\ +)\x00Y\x00\x05\x00R\x00Y\x00\x0a\x00R\x00Y\x00\ +\x0f\xff\xae\x00Y\x00\x11\xff\xae\x00Y\x00\x22\x00)\x00\ +Y\x02\x07\x00R\x00Y\x02\x08\xff\xae\x00Y\x02\x0b\x00\ +R\x00Y\x02\x0c\xff\xae\x00Z\x00\x05\x00R\x00Z\x00\ +\x0a\x00R\x00Z\x00\x0f\xff\xae\x00Z\x00\x11\xff\xae\x00\ +Z\x00\x22\x00)\x00Z\x02\x07\x00R\x00Z\x02\x08\xff\ +\xae\x00Z\x02\x0b\x00R\x00Z\x02\x0c\xff\xae\x00[\x00\ +F\xff\xd7\x00[\x00G\xff\xd7\x00[\x00H\xff\xd7\x00\ +[\x00R\xff\xd7\x00[\x00T\xff\xd7\x00[\x00\xa2\xff\ +\xd7\x00[\x00\xa9\xff\xd7\x00[\x00\xaa\xff\xd7\x00[\x00\ +\xab\xff\xd7\x00[\x00\xac\xff\xd7\x00[\x00\xad\xff\xd7\x00\ +[\x00\xb4\xff\xd7\x00[\x00\xb5\xff\xd7\x00[\x00\xb6\xff\ +\xd7\x00[\x00\xb7\xff\xd7\x00[\x00\xb8\xff\xd7\x00[\x00\ +\xba\xff\xd7\x00[\x00\xc9\xff\xd7\x00[\x00\xcb\xff\xd7\x00\ +[\x00\xcd\xff\xd7\x00[\x00\xcf\xff\xd7\x00[\x00\xd1\xff\ +\xd7\x00[\x00\xd3\xff\xd7\x00[\x00\xd5\xff\xd7\x00[\x00\ +\xd7\xff\xd7\x00[\x00\xd9\xff\xd7\x00[\x00\xdb\xff\xd7\x00\ +[\x00\xdd\xff\xd7\x00[\x01\x0f\xff\xd7\x00[\x01\x11\xff\ +\xd7\x00[\x01\x13\xff\xd7\x00[\x01\x15\xff\xd7\x00[\x01\ +H\xff\xd7\x00[\x02`\xff\xd7\x00[\x036\xff\xd7\x00\ +[\x038\xff\xd7\x00[\x03:\xff\xd7\x00[\x03<\xff\ +\xd7\x00[\x03@\xff\xd7\x00[\x03B\xff\xd7\x00[\x03\ +D\xff\xd7\x00[\x03J\xff\xd7\x00[\x03L\xff\xd7\x00\ +[\x03N\xff\xd7\x00[\x03R\xff\xd7\x00[\x03T\xff\ +\xd7\x00[\x03V\xff\xd7\x00[\x03X\xff\xd7\x00[\x03\ +Z\xff\xd7\x00[\x03\x5c\xff\xd7\x00[\x03^\xff\xd7\x00\ +[\x03`\xff\xd7\x00\x5c\x00\x05\x00R\x00\x5c\x00\x0a\x00\ +R\x00\x5c\x00\x0f\xff\xae\x00\x5c\x00\x11\xff\xae\x00\x5c\x00\ +\x22\x00)\x00\x5c\x02\x07\x00R\x00\x5c\x02\x08\xff\xae\x00\ +\x5c\x02\x0b\x00R\x00\x5c\x02\x0c\xff\xae\x00^\x00-\x00\ +\xb8\x00\x82\x00\x05\xffq\x00\x82\x00\x0a\xffq\x00\x82\x00\ +&\xff\xd7\x00\x82\x00*\xff\xd7\x00\x82\x00-\x01\x0a\x00\ +\x82\x002\xff\xd7\x00\x82\x004\xff\xd7\x00\x82\x007\xff\ +q\x00\x82\x009\xff\xae\x00\x82\x00:\xff\xae\x00\x82\x00\ +<\xff\x85\x00\x82\x00\x89\xff\xd7\x00\x82\x00\x94\xff\xd7\x00\ +\x82\x00\x95\xff\xd7\x00\x82\x00\x96\xff\xd7\x00\x82\x00\x97\xff\ +\xd7\x00\x82\x00\x98\xff\xd7\x00\x82\x00\x9a\xff\xd7\x00\x82\x00\ +\x9f\xff\x85\x00\x82\x00\xc8\xff\xd7\x00\x82\x00\xca\xff\xd7\x00\ +\x82\x00\xcc\xff\xd7\x00\x82\x00\xce\xff\xd7\x00\x82\x00\xde\xff\ +\xd7\x00\x82\x00\xe0\xff\xd7\x00\x82\x00\xe2\xff\xd7\x00\x82\x00\ +\xe4\xff\xd7\x00\x82\x01\x0e\xff\xd7\x00\x82\x01\x10\xff\xd7\x00\ +\x82\x01\x12\xff\xd7\x00\x82\x01\x14\xff\xd7\x00\x82\x01$\xff\ +q\x00\x82\x01&\xffq\x00\x82\x016\xff\xae\x00\x82\x01\ +8\xff\x85\x00\x82\x01:\xff\x85\x00\x82\x01G\xff\xd7\x00\ +\x82\x01\xfa\xff\xae\x00\x82\x01\xfc\xff\xae\x00\x82\x01\xfe\xff\ +\xae\x00\x82\x02\x00\xff\x85\x00\x82\x02\x07\xffq\x00\x82\x02\ +\x0b\xffq\x00\x82\x02_\xff\xd7\x00\x82\x03I\xff\xd7\x00\ +\x82\x03K\xff\xd7\x00\x82\x03M\xff\xd7\x00\x82\x03O\xff\ +\xd7\x00\x82\x03Q\xff\xd7\x00\x82\x03S\xff\xd7\x00\x82\x03\ +U\xff\xd7\x00\x82\x03W\xff\xd7\x00\x82\x03Y\xff\xd7\x00\ +\x82\x03[\xff\xd7\x00\x82\x03]\xff\xd7\x00\x82\x03_\xff\ +\xd7\x00\x82\x03o\xff\x85\x00\x82\x03q\xff\x85\x00\x82\x03\ +s\xff\x85\x00\x82\x03\x8f\xffq\x00\x83\x00\x05\xffq\x00\ +\x83\x00\x0a\xffq\x00\x83\x00&\xff\xd7\x00\x83\x00*\xff\ +\xd7\x00\x83\x00-\x01\x0a\x00\x83\x002\xff\xd7\x00\x83\x00\ +4\xff\xd7\x00\x83\x007\xffq\x00\x83\x009\xff\xae\x00\ +\x83\x00:\xff\xae\x00\x83\x00<\xff\x85\x00\x83\x00\x89\xff\ +\xd7\x00\x83\x00\x94\xff\xd7\x00\x83\x00\x95\xff\xd7\x00\x83\x00\ +\x96\xff\xd7\x00\x83\x00\x97\xff\xd7\x00\x83\x00\x98\xff\xd7\x00\ +\x83\x00\x9a\xff\xd7\x00\x83\x00\x9f\xff\x85\x00\x83\x00\xc8\xff\ +\xd7\x00\x83\x00\xca\xff\xd7\x00\x83\x00\xcc\xff\xd7\x00\x83\x00\ +\xce\xff\xd7\x00\x83\x00\xde\xff\xd7\x00\x83\x00\xe0\xff\xd7\x00\ +\x83\x00\xe2\xff\xd7\x00\x83\x00\xe4\xff\xd7\x00\x83\x01\x0e\xff\ +\xd7\x00\x83\x01\x10\xff\xd7\x00\x83\x01\x12\xff\xd7\x00\x83\x01\ +\x14\xff\xd7\x00\x83\x01$\xffq\x00\x83\x01&\xffq\x00\ +\x83\x016\xff\xae\x00\x83\x018\xff\x85\x00\x83\x01:\xff\ +\x85\x00\x83\x01G\xff\xd7\x00\x83\x01\xfa\xff\xae\x00\x83\x01\ +\xfc\xff\xae\x00\x83\x01\xfe\xff\xae\x00\x83\x02\x00\xff\x85\x00\ +\x83\x02\x07\xffq\x00\x83\x02\x0b\xffq\x00\x83\x02_\xff\ +\xd7\x00\x83\x03I\xff\xd7\x00\x83\x03K\xff\xd7\x00\x83\x03\ +M\xff\xd7\x00\x83\x03O\xff\xd7\x00\x83\x03Q\xff\xd7\x00\ +\x83\x03S\xff\xd7\x00\x83\x03U\xff\xd7\x00\x83\x03W\xff\ +\xd7\x00\x83\x03Y\xff\xd7\x00\x83\x03[\xff\xd7\x00\x83\x03\ +]\xff\xd7\x00\x83\x03_\xff\xd7\x00\x83\x03o\xff\x85\x00\ +\x83\x03q\xff\x85\x00\x83\x03s\xff\x85\x00\x83\x03\x8f\xff\ +q\x00\x84\x00\x05\xffq\x00\x84\x00\x0a\xffq\x00\x84\x00\ +&\xff\xd7\x00\x84\x00*\xff\xd7\x00\x84\x00-\x01\x0a\x00\ +\x84\x002\xff\xd7\x00\x84\x004\xff\xd7\x00\x84\x007\xff\ +q\x00\x84\x009\xff\xae\x00\x84\x00:\xff\xae\x00\x84\x00\ +<\xff\x85\x00\x84\x00\x89\xff\xd7\x00\x84\x00\x94\xff\xd7\x00\ +\x84\x00\x95\xff\xd7\x00\x84\x00\x96\xff\xd7\x00\x84\x00\x97\xff\ +\xd7\x00\x84\x00\x98\xff\xd7\x00\x84\x00\x9a\xff\xd7\x00\x84\x00\ +\x9f\xff\x85\x00\x84\x00\xc8\xff\xd7\x00\x84\x00\xca\xff\xd7\x00\ +\x84\x00\xcc\xff\xd7\x00\x84\x00\xce\xff\xd7\x00\x84\x00\xde\xff\ +\xd7\x00\x84\x00\xe0\xff\xd7\x00\x84\x00\xe2\xff\xd7\x00\x84\x00\ +\xe4\xff\xd7\x00\x84\x01\x0e\xff\xd7\x00\x84\x01\x10\xff\xd7\x00\ +\x84\x01\x12\xff\xd7\x00\x84\x01\x14\xff\xd7\x00\x84\x01$\xff\ +q\x00\x84\x01&\xffq\x00\x84\x016\xff\xae\x00\x84\x01\ +8\xff\x85\x00\x84\x01:\xff\x85\x00\x84\x01G\xff\xd7\x00\ +\x84\x01\xfa\xff\xae\x00\x84\x01\xfc\xff\xae\x00\x84\x01\xfe\xff\ +\xae\x00\x84\x02\x00\xff\x85\x00\x84\x02\x07\xffq\x00\x84\x02\ +\x0b\xffq\x00\x84\x02_\xff\xd7\x00\x84\x03I\xff\xd7\x00\ +\x84\x03K\xff\xd7\x00\x84\x03M\xff\xd7\x00\x84\x03O\xff\ +\xd7\x00\x84\x03Q\xff\xd7\x00\x84\x03S\xff\xd7\x00\x84\x03\ +U\xff\xd7\x00\x84\x03W\xff\xd7\x00\x84\x03Y\xff\xd7\x00\ +\x84\x03[\xff\xd7\x00\x84\x03]\xff\xd7\x00\x84\x03_\xff\ +\xd7\x00\x84\x03o\xff\x85\x00\x84\x03q\xff\x85\x00\x84\x03\ +s\xff\x85\x00\x84\x03\x8f\xffq\x00\x85\x00\x05\xffq\x00\ +\x85\x00\x0a\xffq\x00\x85\x00&\xff\xd7\x00\x85\x00*\xff\ +\xd7\x00\x85\x00-\x01\x0a\x00\x85\x002\xff\xd7\x00\x85\x00\ +4\xff\xd7\x00\x85\x007\xffq\x00\x85\x009\xff\xae\x00\ +\x85\x00:\xff\xae\x00\x85\x00<\xff\x85\x00\x85\x00\x89\xff\ +\xd7\x00\x85\x00\x94\xff\xd7\x00\x85\x00\x95\xff\xd7\x00\x85\x00\ +\x96\xff\xd7\x00\x85\x00\x97\xff\xd7\x00\x85\x00\x98\xff\xd7\x00\ +\x85\x00\x9a\xff\xd7\x00\x85\x00\x9f\xff\x85\x00\x85\x00\xc8\xff\ +\xd7\x00\x85\x00\xca\xff\xd7\x00\x85\x00\xcc\xff\xd7\x00\x85\x00\ +\xce\xff\xd7\x00\x85\x00\xde\xff\xd7\x00\x85\x00\xe0\xff\xd7\x00\ +\x85\x00\xe2\xff\xd7\x00\x85\x00\xe4\xff\xd7\x00\x85\x01\x0e\xff\ +\xd7\x00\x85\x01\x10\xff\xd7\x00\x85\x01\x12\xff\xd7\x00\x85\x01\ +\x14\xff\xd7\x00\x85\x01$\xffq\x00\x85\x01&\xffq\x00\ +\x85\x016\xff\xae\x00\x85\x018\xff\x85\x00\x85\x01:\xff\ +\x85\x00\x85\x01G\xff\xd7\x00\x85\x01\xfa\xff\xae\x00\x85\x01\ +\xfc\xff\xae\x00\x85\x01\xfe\xff\xae\x00\x85\x02\x00\xff\x85\x00\ +\x85\x02\x07\xffq\x00\x85\x02\x0b\xffq\x00\x85\x02_\xff\ +\xd7\x00\x85\x03I\xff\xd7\x00\x85\x03K\xff\xd7\x00\x85\x03\ +M\xff\xd7\x00\x85\x03O\xff\xd7\x00\x85\x03Q\xff\xd7\x00\ +\x85\x03S\xff\xd7\x00\x85\x03U\xff\xd7\x00\x85\x03W\xff\ +\xd7\x00\x85\x03Y\xff\xd7\x00\x85\x03[\xff\xd7\x00\x85\x03\ +]\xff\xd7\x00\x85\x03_\xff\xd7\x00\x85\x03o\xff\x85\x00\ +\x85\x03q\xff\x85\x00\x85\x03s\xff\x85\x00\x85\x03\x8f\xff\ +q\x00\x86\x00\x05\xffq\x00\x86\x00\x0a\xffq\x00\x86\x00\ +&\xff\xd7\x00\x86\x00*\xff\xd7\x00\x86\x00-\x01\x0a\x00\ +\x86\x002\xff\xd7\x00\x86\x004\xff\xd7\x00\x86\x007\xff\ +q\x00\x86\x009\xff\xae\x00\x86\x00:\xff\xae\x00\x86\x00\ +<\xff\x85\x00\x86\x00\x89\xff\xd7\x00\x86\x00\x94\xff\xd7\x00\ +\x86\x00\x95\xff\xd7\x00\x86\x00\x96\xff\xd7\x00\x86\x00\x97\xff\ +\xd7\x00\x86\x00\x98\xff\xd7\x00\x86\x00\x9a\xff\xd7\x00\x86\x00\ +\x9f\xff\x85\x00\x86\x00\xc8\xff\xd7\x00\x86\x00\xca\xff\xd7\x00\ +\x86\x00\xcc\xff\xd7\x00\x86\x00\xce\xff\xd7\x00\x86\x00\xde\xff\ +\xd7\x00\x86\x00\xe0\xff\xd7\x00\x86\x00\xe2\xff\xd7\x00\x86\x00\ +\xe4\xff\xd7\x00\x86\x01\x0e\xff\xd7\x00\x86\x01\x10\xff\xd7\x00\ +\x86\x01\x12\xff\xd7\x00\x86\x01\x14\xff\xd7\x00\x86\x01$\xff\ +q\x00\x86\x01&\xffq\x00\x86\x016\xff\xae\x00\x86\x01\ +8\xff\x85\x00\x86\x01:\xff\x85\x00\x86\x01G\xff\xd7\x00\ +\x86\x01\xfa\xff\xae\x00\x86\x01\xfc\xff\xae\x00\x86\x01\xfe\xff\ +\xae\x00\x86\x02\x00\xff\x85\x00\x86\x02\x07\xffq\x00\x86\x02\ +\x0b\xffq\x00\x86\x02_\xff\xd7\x00\x86\x03I\xff\xd7\x00\ +\x86\x03K\xff\xd7\x00\x86\x03M\xff\xd7\x00\x86\x03O\xff\ +\xd7\x00\x86\x03Q\xff\xd7\x00\x86\x03S\xff\xd7\x00\x86\x03\ +U\xff\xd7\x00\x86\x03W\xff\xd7\x00\x86\x03Y\xff\xd7\x00\ +\x86\x03[\xff\xd7\x00\x86\x03]\xff\xd7\x00\x86\x03_\xff\ +\xd7\x00\x86\x03o\xff\x85\x00\x86\x03q\xff\x85\x00\x86\x03\ +s\xff\x85\x00\x86\x03\x8f\xffq\x00\x87\x00\x05\xffq\x00\ +\x87\x00\x0a\xffq\x00\x87\x00&\xff\xd7\x00\x87\x00*\xff\ +\xd7\x00\x87\x00-\x01\x0a\x00\x87\x002\xff\xd7\x00\x87\x00\ +4\xff\xd7\x00\x87\x007\xffq\x00\x87\x009\xff\xae\x00\ +\x87\x00:\xff\xae\x00\x87\x00<\xff\x85\x00\x87\x00\x89\xff\ +\xd7\x00\x87\x00\x94\xff\xd7\x00\x87\x00\x95\xff\xd7\x00\x87\x00\ +\x96\xff\xd7\x00\x87\x00\x97\xff\xd7\x00\x87\x00\x98\xff\xd7\x00\ +\x87\x00\x9a\xff\xd7\x00\x87\x00\x9f\xff\x85\x00\x87\x00\xc8\xff\ +\xd7\x00\x87\x00\xca\xff\xd7\x00\x87\x00\xcc\xff\xd7\x00\x87\x00\ +\xce\xff\xd7\x00\x87\x00\xde\xff\xd7\x00\x87\x00\xe0\xff\xd7\x00\ +\x87\x00\xe2\xff\xd7\x00\x87\x00\xe4\xff\xd7\x00\x87\x01\x0e\xff\ +\xd7\x00\x87\x01\x10\xff\xd7\x00\x87\x01\x12\xff\xd7\x00\x87\x01\ +\x14\xff\xd7\x00\x87\x01$\xffq\x00\x87\x01&\xffq\x00\ +\x87\x016\xff\xae\x00\x87\x018\xff\x85\x00\x87\x01:\xff\ +\x85\x00\x87\x01G\xff\xd7\x00\x87\x01\xfa\xff\xae\x00\x87\x01\ +\xfc\xff\xae\x00\x87\x01\xfe\xff\xae\x00\x87\x02\x00\xff\x85\x00\ +\x87\x02\x07\xffq\x00\x87\x02\x0b\xffq\x00\x87\x02_\xff\ +\xd7\x00\x87\x03I\xff\xd7\x00\x87\x03K\xff\xd7\x00\x87\x03\ +M\xff\xd7\x00\x87\x03O\xff\xd7\x00\x87\x03Q\xff\xd7\x00\ +\x87\x03S\xff\xd7\x00\x87\x03U\xff\xd7\x00\x87\x03W\xff\ +\xd7\x00\x87\x03Y\xff\xd7\x00\x87\x03[\xff\xd7\x00\x87\x03\ +]\xff\xd7\x00\x87\x03_\xff\xd7\x00\x87\x03o\xff\x85\x00\ +\x87\x03q\xff\x85\x00\x87\x03s\xff\x85\x00\x87\x03\x8f\xff\ +q\x00\x88\x00-\x00{\x00\x89\x00&\xff\xd7\x00\x89\x00\ +*\xff\xd7\x00\x89\x002\xff\xd7\x00\x89\x004\xff\xd7\x00\ +\x89\x00\x89\xff\xd7\x00\x89\x00\x94\xff\xd7\x00\x89\x00\x95\xff\ +\xd7\x00\x89\x00\x96\xff\xd7\x00\x89\x00\x97\xff\xd7\x00\x89\x00\ +\x98\xff\xd7\x00\x89\x00\x9a\xff\xd7\x00\x89\x00\xc8\xff\xd7\x00\ +\x89\x00\xca\xff\xd7\x00\x89\x00\xcc\xff\xd7\x00\x89\x00\xce\xff\ +\xd7\x00\x89\x00\xde\xff\xd7\x00\x89\x00\xe0\xff\xd7\x00\x89\x00\ +\xe2\xff\xd7\x00\x89\x00\xe4\xff\xd7\x00\x89\x01\x0e\xff\xd7\x00\ +\x89\x01\x10\xff\xd7\x00\x89\x01\x12\xff\xd7\x00\x89\x01\x14\xff\ +\xd7\x00\x89\x01G\xff\xd7\x00\x89\x02_\xff\xd7\x00\x89\x03\ +I\xff\xd7\x00\x89\x03K\xff\xd7\x00\x89\x03M\xff\xd7\x00\ +\x89\x03O\xff\xd7\x00\x89\x03Q\xff\xd7\x00\x89\x03S\xff\ +\xd7\x00\x89\x03U\xff\xd7\x00\x89\x03W\xff\xd7\x00\x89\x03\ +Y\xff\xd7\x00\x89\x03[\xff\xd7\x00\x89\x03]\xff\xd7\x00\ +\x89\x03_\xff\xd7\x00\x8a\x00-\x00{\x00\x8b\x00-\x00\ +{\x00\x8c\x00-\x00{\x00\x8d\x00-\x00{\x00\x92\x00\ +\x0f\xff\xae\x00\x92\x00\x11\xff\xae\x00\x92\x00$\xff\xd7\x00\ +\x92\x007\xff\xc3\x00\x92\x009\xff\xec\x00\x92\x00:\xff\ +\xec\x00\x92\x00;\xff\xd7\x00\x92\x00<\xff\xec\x00\x92\x00\ +=\xff\xec\x00\x92\x00\x82\xff\xd7\x00\x92\x00\x83\xff\xd7\x00\ +\x92\x00\x84\xff\xd7\x00\x92\x00\x85\xff\xd7\x00\x92\x00\x86\xff\ +\xd7\x00\x92\x00\x87\xff\xd7\x00\x92\x00\x9f\xff\xec\x00\x92\x00\ +\xc2\xff\xd7\x00\x92\x00\xc4\xff\xd7\x00\x92\x00\xc6\xff\xd7\x00\ +\x92\x01$\xff\xc3\x00\x92\x01&\xff\xc3\x00\x92\x016\xff\ +\xec\x00\x92\x018\xff\xec\x00\x92\x01:\xff\xec\x00\x92\x01\ +;\xff\xec\x00\x92\x01=\xff\xec\x00\x92\x01?\xff\xec\x00\ +\x92\x01C\xff\xd7\x00\x92\x01\xa0\xff\xec\x00\x92\x01\xfa\xff\ +\xec\x00\x92\x01\xfc\xff\xec\x00\x92\x01\xfe\xff\xec\x00\x92\x02\ +\x00\xff\xec\x00\x92\x02\x08\xff\xae\x00\x92\x02\x0c\xff\xae\x00\ +\x92\x02X\xff\xd7\x00\x92\x03\x1d\xff\xd7\x00\x92\x03\x1f\xff\ +\xd7\x00\x92\x03!\xff\xd7\x00\x92\x03#\xff\xd7\x00\x92\x03\ +%\xff\xd7\x00\x92\x03'\xff\xd7\x00\x92\x03)\xff\xd7\x00\ +\x92\x03+\xff\xd7\x00\x92\x03-\xff\xd7\x00\x92\x03/\xff\ +\xd7\x00\x92\x031\xff\xd7\x00\x92\x033\xff\xd7\x00\x92\x03\ +o\xff\xec\x00\x92\x03q\xff\xec\x00\x92\x03s\xff\xec\x00\ +\x92\x03\x8f\xff\xc3\x00\x94\x00\x0f\xff\xae\x00\x94\x00\x11\xff\ +\xae\x00\x94\x00$\xff\xd7\x00\x94\x007\xff\xc3\x00\x94\x00\ +9\xff\xec\x00\x94\x00:\xff\xec\x00\x94\x00;\xff\xd7\x00\ +\x94\x00<\xff\xec\x00\x94\x00=\xff\xec\x00\x94\x00\x82\xff\ +\xd7\x00\x94\x00\x83\xff\xd7\x00\x94\x00\x84\xff\xd7\x00\x94\x00\ +\x85\xff\xd7\x00\x94\x00\x86\xff\xd7\x00\x94\x00\x87\xff\xd7\x00\ +\x94\x00\x9f\xff\xec\x00\x94\x00\xc2\xff\xd7\x00\x94\x00\xc4\xff\ +\xd7\x00\x94\x00\xc6\xff\xd7\x00\x94\x01$\xff\xc3\x00\x94\x01\ +&\xff\xc3\x00\x94\x016\xff\xec\x00\x94\x018\xff\xec\x00\ +\x94\x01:\xff\xec\x00\x94\x01;\xff\xec\x00\x94\x01=\xff\ +\xec\x00\x94\x01?\xff\xec\x00\x94\x01C\xff\xd7\x00\x94\x01\ +\xa0\xff\xec\x00\x94\x01\xfa\xff\xec\x00\x94\x01\xfc\xff\xec\x00\ +\x94\x01\xfe\xff\xec\x00\x94\x02\x00\xff\xec\x00\x94\x02\x08\xff\ +\xae\x00\x94\x02\x0c\xff\xae\x00\x94\x02X\xff\xd7\x00\x94\x03\ +\x1d\xff\xd7\x00\x94\x03\x1f\xff\xd7\x00\x94\x03!\xff\xd7\x00\ +\x94\x03#\xff\xd7\x00\x94\x03%\xff\xd7\x00\x94\x03'\xff\ +\xd7\x00\x94\x03)\xff\xd7\x00\x94\x03+\xff\xd7\x00\x94\x03\ +-\xff\xd7\x00\x94\x03/\xff\xd7\x00\x94\x031\xff\xd7\x00\ +\x94\x033\xff\xd7\x00\x94\x03o\xff\xec\x00\x94\x03q\xff\ +\xec\x00\x94\x03s\xff\xec\x00\x94\x03\x8f\xff\xc3\x00\x95\x00\ +\x0f\xff\xae\x00\x95\x00\x11\xff\xae\x00\x95\x00$\xff\xd7\x00\ +\x95\x007\xff\xc3\x00\x95\x009\xff\xec\x00\x95\x00:\xff\ +\xec\x00\x95\x00;\xff\xd7\x00\x95\x00<\xff\xec\x00\x95\x00\ +=\xff\xec\x00\x95\x00\x82\xff\xd7\x00\x95\x00\x83\xff\xd7\x00\ +\x95\x00\x84\xff\xd7\x00\x95\x00\x85\xff\xd7\x00\x95\x00\x86\xff\ +\xd7\x00\x95\x00\x87\xff\xd7\x00\x95\x00\x9f\xff\xec\x00\x95\x00\ +\xc2\xff\xd7\x00\x95\x00\xc4\xff\xd7\x00\x95\x00\xc6\xff\xd7\x00\ +\x95\x01$\xff\xc3\x00\x95\x01&\xff\xc3\x00\x95\x016\xff\ +\xec\x00\x95\x018\xff\xec\x00\x95\x01:\xff\xec\x00\x95\x01\ +;\xff\xec\x00\x95\x01=\xff\xec\x00\x95\x01?\xff\xec\x00\ +\x95\x01C\xff\xd7\x00\x95\x01\xa0\xff\xec\x00\x95\x01\xfa\xff\ +\xec\x00\x95\x01\xfc\xff\xec\x00\x95\x01\xfe\xff\xec\x00\x95\x02\ +\x00\xff\xec\x00\x95\x02\x08\xff\xae\x00\x95\x02\x0c\xff\xae\x00\ +\x95\x02X\xff\xd7\x00\x95\x03\x1d\xff\xd7\x00\x95\x03\x1f\xff\ +\xd7\x00\x95\x03!\xff\xd7\x00\x95\x03#\xff\xd7\x00\x95\x03\ +%\xff\xd7\x00\x95\x03'\xff\xd7\x00\x95\x03)\xff\xd7\x00\ +\x95\x03+\xff\xd7\x00\x95\x03-\xff\xd7\x00\x95\x03/\xff\ +\xd7\x00\x95\x031\xff\xd7\x00\x95\x033\xff\xd7\x00\x95\x03\ +o\xff\xec\x00\x95\x03q\xff\xec\x00\x95\x03s\xff\xec\x00\ +\x95\x03\x8f\xff\xc3\x00\x96\x00\x0f\xff\xae\x00\x96\x00\x11\xff\ +\xae\x00\x96\x00$\xff\xd7\x00\x96\x007\xff\xc3\x00\x96\x00\ +9\xff\xec\x00\x96\x00:\xff\xec\x00\x96\x00;\xff\xd7\x00\ +\x96\x00<\xff\xec\x00\x96\x00=\xff\xec\x00\x96\x00\x82\xff\ +\xd7\x00\x96\x00\x83\xff\xd7\x00\x96\x00\x84\xff\xd7\x00\x96\x00\ +\x85\xff\xd7\x00\x96\x00\x86\xff\xd7\x00\x96\x00\x87\xff\xd7\x00\ +\x96\x00\x9f\xff\xec\x00\x96\x00\xc2\xff\xd7\x00\x96\x00\xc4\xff\ +\xd7\x00\x96\x00\xc6\xff\xd7\x00\x96\x01$\xff\xc3\x00\x96\x01\ +&\xff\xc3\x00\x96\x016\xff\xec\x00\x96\x018\xff\xec\x00\ +\x96\x01:\xff\xec\x00\x96\x01;\xff\xec\x00\x96\x01=\xff\ +\xec\x00\x96\x01?\xff\xec\x00\x96\x01C\xff\xd7\x00\x96\x01\ +\xa0\xff\xec\x00\x96\x01\xfa\xff\xec\x00\x96\x01\xfc\xff\xec\x00\ +\x96\x01\xfe\xff\xec\x00\x96\x02\x00\xff\xec\x00\x96\x02\x08\xff\ +\xae\x00\x96\x02\x0c\xff\xae\x00\x96\x02X\xff\xd7\x00\x96\x03\ +\x1d\xff\xd7\x00\x96\x03\x1f\xff\xd7\x00\x96\x03!\xff\xd7\x00\ +\x96\x03#\xff\xd7\x00\x96\x03%\xff\xd7\x00\x96\x03'\xff\ +\xd7\x00\x96\x03)\xff\xd7\x00\x96\x03+\xff\xd7\x00\x96\x03\ +-\xff\xd7\x00\x96\x03/\xff\xd7\x00\x96\x031\xff\xd7\x00\ +\x96\x033\xff\xd7\x00\x96\x03o\xff\xec\x00\x96\x03q\xff\ +\xec\x00\x96\x03s\xff\xec\x00\x96\x03\x8f\xff\xc3\x00\x97\x00\ +\x0f\xff\xae\x00\x97\x00\x11\xff\xae\x00\x97\x00$\xff\xd7\x00\ +\x97\x007\xff\xc3\x00\x97\x009\xff\xec\x00\x97\x00:\xff\ +\xec\x00\x97\x00;\xff\xd7\x00\x97\x00<\xff\xec\x00\x97\x00\ +=\xff\xec\x00\x97\x00\x82\xff\xd7\x00\x97\x00\x83\xff\xd7\x00\ +\x97\x00\x84\xff\xd7\x00\x97\x00\x85\xff\xd7\x00\x97\x00\x86\xff\ +\xd7\x00\x97\x00\x87\xff\xd7\x00\x97\x00\x9f\xff\xec\x00\x97\x00\ +\xc2\xff\xd7\x00\x97\x00\xc4\xff\xd7\x00\x97\x00\xc6\xff\xd7\x00\ +\x97\x01$\xff\xc3\x00\x97\x01&\xff\xc3\x00\x97\x016\xff\ +\xec\x00\x97\x018\xff\xec\x00\x97\x01:\xff\xec\x00\x97\x01\ +;\xff\xec\x00\x97\x01=\xff\xec\x00\x97\x01?\xff\xec\x00\ +\x97\x01C\xff\xd7\x00\x97\x01\xa0\xff\xec\x00\x97\x01\xfa\xff\ +\xec\x00\x97\x01\xfc\xff\xec\x00\x97\x01\xfe\xff\xec\x00\x97\x02\ +\x00\xff\xec\x00\x97\x02\x08\xff\xae\x00\x97\x02\x0c\xff\xae\x00\ +\x97\x02X\xff\xd7\x00\x97\x03\x1d\xff\xd7\x00\x97\x03\x1f\xff\ +\xd7\x00\x97\x03!\xff\xd7\x00\x97\x03#\xff\xd7\x00\x97\x03\ +%\xff\xd7\x00\x97\x03'\xff\xd7\x00\x97\x03)\xff\xd7\x00\ +\x97\x03+\xff\xd7\x00\x97\x03-\xff\xd7\x00\x97\x03/\xff\ +\xd7\x00\x97\x031\xff\xd7\x00\x97\x033\xff\xd7\x00\x97\x03\ +o\xff\xec\x00\x97\x03q\xff\xec\x00\x97\x03s\xff\xec\x00\ +\x97\x03\x8f\xff\xc3\x00\x98\x00\x0f\xff\xae\x00\x98\x00\x11\xff\ +\xae\x00\x98\x00$\xff\xd7\x00\x98\x007\xff\xc3\x00\x98\x00\ +9\xff\xec\x00\x98\x00:\xff\xec\x00\x98\x00;\xff\xd7\x00\ +\x98\x00<\xff\xec\x00\x98\x00=\xff\xec\x00\x98\x00\x82\xff\ +\xd7\x00\x98\x00\x83\xff\xd7\x00\x98\x00\x84\xff\xd7\x00\x98\x00\ +\x85\xff\xd7\x00\x98\x00\x86\xff\xd7\x00\x98\x00\x87\xff\xd7\x00\ +\x98\x00\x9f\xff\xec\x00\x98\x00\xc2\xff\xd7\x00\x98\x00\xc4\xff\ +\xd7\x00\x98\x00\xc6\xff\xd7\x00\x98\x01$\xff\xc3\x00\x98\x01\ +&\xff\xc3\x00\x98\x016\xff\xec\x00\x98\x018\xff\xec\x00\ +\x98\x01:\xff\xec\x00\x98\x01;\xff\xec\x00\x98\x01=\xff\ +\xec\x00\x98\x01?\xff\xec\x00\x98\x01C\xff\xd7\x00\x98\x01\ +\xa0\xff\xec\x00\x98\x01\xfa\xff\xec\x00\x98\x01\xfc\xff\xec\x00\ +\x98\x01\xfe\xff\xec\x00\x98\x02\x00\xff\xec\x00\x98\x02\x08\xff\ +\xae\x00\x98\x02\x0c\xff\xae\x00\x98\x02X\xff\xd7\x00\x98\x03\ +\x1d\xff\xd7\x00\x98\x03\x1f\xff\xd7\x00\x98\x03!\xff\xd7\x00\ +\x98\x03#\xff\xd7\x00\x98\x03%\xff\xd7\x00\x98\x03'\xff\ +\xd7\x00\x98\x03)\xff\xd7\x00\x98\x03+\xff\xd7\x00\x98\x03\ +-\xff\xd7\x00\x98\x03/\xff\xd7\x00\x98\x031\xff\xd7\x00\ +\x98\x033\xff\xd7\x00\x98\x03o\xff\xec\x00\x98\x03q\xff\ +\xec\x00\x98\x03s\xff\xec\x00\x98\x03\x8f\xff\xc3\x00\x9a\x00\ +\x0f\xff\xae\x00\x9a\x00\x11\xff\xae\x00\x9a\x00$\xff\xd7\x00\ +\x9a\x007\xff\xc3\x00\x9a\x009\xff\xec\x00\x9a\x00:\xff\ +\xec\x00\x9a\x00;\xff\xd7\x00\x9a\x00<\xff\xec\x00\x9a\x00\ +=\xff\xec\x00\x9a\x00\x82\xff\xd7\x00\x9a\x00\x83\xff\xd7\x00\ +\x9a\x00\x84\xff\xd7\x00\x9a\x00\x85\xff\xd7\x00\x9a\x00\x86\xff\ +\xd7\x00\x9a\x00\x87\xff\xd7\x00\x9a\x00\x9f\xff\xec\x00\x9a\x00\ +\xc2\xff\xd7\x00\x9a\x00\xc4\xff\xd7\x00\x9a\x00\xc6\xff\xd7\x00\ +\x9a\x01$\xff\xc3\x00\x9a\x01&\xff\xc3\x00\x9a\x016\xff\ +\xec\x00\x9a\x018\xff\xec\x00\x9a\x01:\xff\xec\x00\x9a\x01\ +;\xff\xec\x00\x9a\x01=\xff\xec\x00\x9a\x01?\xff\xec\x00\ +\x9a\x01C\xff\xd7\x00\x9a\x01\xa0\xff\xec\x00\x9a\x01\xfa\xff\ +\xec\x00\x9a\x01\xfc\xff\xec\x00\x9a\x01\xfe\xff\xec\x00\x9a\x02\ +\x00\xff\xec\x00\x9a\x02\x08\xff\xae\x00\x9a\x02\x0c\xff\xae\x00\ +\x9a\x02X\xff\xd7\x00\x9a\x03\x1d\xff\xd7\x00\x9a\x03\x1f\xff\ +\xd7\x00\x9a\x03!\xff\xd7\x00\x9a\x03#\xff\xd7\x00\x9a\x03\ +%\xff\xd7\x00\x9a\x03'\xff\xd7\x00\x9a\x03)\xff\xd7\x00\ +\x9a\x03+\xff\xd7\x00\x9a\x03-\xff\xd7\x00\x9a\x03/\xff\ +\xd7\x00\x9a\x031\xff\xd7\x00\x9a\x033\xff\xd7\x00\x9a\x03\ +o\xff\xec\x00\x9a\x03q\xff\xec\x00\x9a\x03s\xff\xec\x00\ +\x9a\x03\x8f\xff\xc3\x00\x9b\x00\x0f\xff\xd7\x00\x9b\x00\x11\xff\ +\xd7\x00\x9b\x00$\xff\xec\x00\x9b\x00\x82\xff\xec\x00\x9b\x00\ +\x83\xff\xec\x00\x9b\x00\x84\xff\xec\x00\x9b\x00\x85\xff\xec\x00\ +\x9b\x00\x86\xff\xec\x00\x9b\x00\x87\xff\xec\x00\x9b\x00\xc2\xff\ +\xec\x00\x9b\x00\xc4\xff\xec\x00\x9b\x00\xc6\xff\xec\x00\x9b\x01\ +C\xff\xec\x00\x9b\x02\x08\xff\xd7\x00\x9b\x02\x0c\xff\xd7\x00\ +\x9b\x02X\xff\xec\x00\x9b\x03\x1d\xff\xec\x00\x9b\x03\x1f\xff\ +\xec\x00\x9b\x03!\xff\xec\x00\x9b\x03#\xff\xec\x00\x9b\x03\ +%\xff\xec\x00\x9b\x03'\xff\xec\x00\x9b\x03)\xff\xec\x00\ +\x9b\x03+\xff\xec\x00\x9b\x03-\xff\xec\x00\x9b\x03/\xff\ +\xec\x00\x9b\x031\xff\xec\x00\x9b\x033\xff\xec\x00\x9c\x00\ +\x0f\xff\xd7\x00\x9c\x00\x11\xff\xd7\x00\x9c\x00$\xff\xec\x00\ +\x9c\x00\x82\xff\xec\x00\x9c\x00\x83\xff\xec\x00\x9c\x00\x84\xff\ +\xec\x00\x9c\x00\x85\xff\xec\x00\x9c\x00\x86\xff\xec\x00\x9c\x00\ +\x87\xff\xec\x00\x9c\x00\xc2\xff\xec\x00\x9c\x00\xc4\xff\xec\x00\ +\x9c\x00\xc6\xff\xec\x00\x9c\x01C\xff\xec\x00\x9c\x02\x08\xff\ +\xd7\x00\x9c\x02\x0c\xff\xd7\x00\x9c\x02X\xff\xec\x00\x9c\x03\ +\x1d\xff\xec\x00\x9c\x03\x1f\xff\xec\x00\x9c\x03!\xff\xec\x00\ +\x9c\x03#\xff\xec\x00\x9c\x03%\xff\xec\x00\x9c\x03'\xff\ +\xec\x00\x9c\x03)\xff\xec\x00\x9c\x03+\xff\xec\x00\x9c\x03\ +-\xff\xec\x00\x9c\x03/\xff\xec\x00\x9c\x031\xff\xec\x00\ +\x9c\x033\xff\xec\x00\x9d\x00\x0f\xff\xd7\x00\x9d\x00\x11\xff\ +\xd7\x00\x9d\x00$\xff\xec\x00\x9d\x00\x82\xff\xec\x00\x9d\x00\ +\x83\xff\xec\x00\x9d\x00\x84\xff\xec\x00\x9d\x00\x85\xff\xec\x00\ +\x9d\x00\x86\xff\xec\x00\x9d\x00\x87\xff\xec\x00\x9d\x00\xc2\xff\ +\xec\x00\x9d\x00\xc4\xff\xec\x00\x9d\x00\xc6\xff\xec\x00\x9d\x01\ +C\xff\xec\x00\x9d\x02\x08\xff\xd7\x00\x9d\x02\x0c\xff\xd7\x00\ +\x9d\x02X\xff\xec\x00\x9d\x03\x1d\xff\xec\x00\x9d\x03\x1f\xff\ +\xec\x00\x9d\x03!\xff\xec\x00\x9d\x03#\xff\xec\x00\x9d\x03\ +%\xff\xec\x00\x9d\x03'\xff\xec\x00\x9d\x03)\xff\xec\x00\ +\x9d\x03+\xff\xec\x00\x9d\x03-\xff\xec\x00\x9d\x03/\xff\ +\xec\x00\x9d\x031\xff\xec\x00\x9d\x033\xff\xec\x00\x9e\x00\ +\x0f\xff\xd7\x00\x9e\x00\x11\xff\xd7\x00\x9e\x00$\xff\xec\x00\ +\x9e\x00\x82\xff\xec\x00\x9e\x00\x83\xff\xec\x00\x9e\x00\x84\xff\ +\xec\x00\x9e\x00\x85\xff\xec\x00\x9e\x00\x86\xff\xec\x00\x9e\x00\ +\x87\xff\xec\x00\x9e\x00\xc2\xff\xec\x00\x9e\x00\xc4\xff\xec\x00\ +\x9e\x00\xc6\xff\xec\x00\x9e\x01C\xff\xec\x00\x9e\x02\x08\xff\ +\xd7\x00\x9e\x02\x0c\xff\xd7\x00\x9e\x02X\xff\xec\x00\x9e\x03\ +\x1d\xff\xec\x00\x9e\x03\x1f\xff\xec\x00\x9e\x03!\xff\xec\x00\ +\x9e\x03#\xff\xec\x00\x9e\x03%\xff\xec\x00\x9e\x03'\xff\ +\xec\x00\x9e\x03)\xff\xec\x00\x9e\x03+\xff\xec\x00\x9e\x03\ +-\xff\xec\x00\x9e\x03/\xff\xec\x00\x9e\x031\xff\xec\x00\ +\x9e\x033\xff\xec\x00\x9f\x00\x0f\xff\x85\x00\x9f\x00\x11\xff\ +\x85\x00\x9f\x00\x22\x00)\x00\x9f\x00$\xff\x85\x00\x9f\x00\ +&\xff\xd7\x00\x9f\x00*\xff\xd7\x00\x9f\x002\xff\xd7\x00\ +\x9f\x004\xff\xd7\x00\x9f\x00D\xff\x9a\x00\x9f\x00F\xff\ +\x9a\x00\x9f\x00G\xff\x9a\x00\x9f\x00H\xff\x9a\x00\x9f\x00\ +J\xff\xd7\x00\x9f\x00P\xff\xc3\x00\x9f\x00Q\xff\xc3\x00\ +\x9f\x00R\xff\x9a\x00\x9f\x00S\xff\xc3\x00\x9f\x00T\xff\ +\x9a\x00\x9f\x00U\xff\xc3\x00\x9f\x00V\xff\xae\x00\x9f\x00\ +X\xff\xc3\x00\x9f\x00]\xff\xd7\x00\x9f\x00\x82\xff\x85\x00\ +\x9f\x00\x83\xff\x85\x00\x9f\x00\x84\xff\x85\x00\x9f\x00\x85\xff\ +\x85\x00\x9f\x00\x86\xff\x85\x00\x9f\x00\x87\xff\x85\x00\x9f\x00\ +\x89\xff\xd7\x00\x9f\x00\x94\xff\xd7\x00\x9f\x00\x95\xff\xd7\x00\ +\x9f\x00\x96\xff\xd7\x00\x9f\x00\x97\xff\xd7\x00\x9f\x00\x98\xff\ +\xd7\x00\x9f\x00\x9a\xff\xd7\x00\x9f\x00\xa2\xff\x9a\x00\x9f\x00\ +\xa3\xff\x9a\x00\x9f\x00\xa4\xff\x9a\x00\x9f\x00\xa5\xff\x9a\x00\ +\x9f\x00\xa6\xff\x9a\x00\x9f\x00\xa7\xff\x9a\x00\x9f\x00\xa8\xff\ +\x9a\x00\x9f\x00\xa9\xff\x9a\x00\x9f\x00\xaa\xff\x9a\x00\x9f\x00\ +\xab\xff\x9a\x00\x9f\x00\xac\xff\x9a\x00\x9f\x00\xad\xff\x9a\x00\ +\x9f\x00\xb4\xff\x9a\x00\x9f\x00\xb5\xff\x9a\x00\x9f\x00\xb6\xff\ +\x9a\x00\x9f\x00\xb7\xff\x9a\x00\x9f\x00\xb8\xff\x9a\x00\x9f\x00\ +\xba\xff\x9a\x00\x9f\x00\xbb\xff\xc3\x00\x9f\x00\xbc\xff\xc3\x00\ +\x9f\x00\xbd\xff\xc3\x00\x9f\x00\xbe\xff\xc3\x00\x9f\x00\xc2\xff\ +\x85\x00\x9f\x00\xc3\xff\x9a\x00\x9f\x00\xc4\xff\x85\x00\x9f\x00\ +\xc5\xff\x9a\x00\x9f\x00\xc6\xff\x85\x00\x9f\x00\xc7\xff\x9a\x00\ +\x9f\x00\xc8\xff\xd7\x00\x9f\x00\xc9\xff\x9a\x00\x9f\x00\xca\xff\ +\xd7\x00\x9f\x00\xcb\xff\x9a\x00\x9f\x00\xcc\xff\xd7\x00\x9f\x00\ +\xcd\xff\x9a\x00\x9f\x00\xce\xff\xd7\x00\x9f\x00\xcf\xff\x9a\x00\ +\x9f\x00\xd1\xff\x9a\x00\x9f\x00\xd3\xff\x9a\x00\x9f\x00\xd5\xff\ +\x9a\x00\x9f\x00\xd7\xff\x9a\x00\x9f\x00\xd9\xff\x9a\x00\x9f\x00\ +\xdb\xff\x9a\x00\x9f\x00\xdd\xff\x9a\x00\x9f\x00\xde\xff\xd7\x00\ +\x9f\x00\xdf\xff\xd7\x00\x9f\x00\xe0\xff\xd7\x00\x9f\x00\xe1\xff\ +\xd7\x00\x9f\x00\xe2\xff\xd7\x00\x9f\x00\xe3\xff\xd7\x00\x9f\x00\ +\xe4\xff\xd7\x00\x9f\x00\xe5\xff\xd7\x00\x9f\x00\xfa\xff\xc3\x00\ +\x9f\x01\x06\xff\xc3\x00\x9f\x01\x08\xff\xc3\x00\x9f\x01\x0d\xff\ +\xc3\x00\x9f\x01\x0e\xff\xd7\x00\x9f\x01\x0f\xff\x9a\x00\x9f\x01\ +\x10\xff\xd7\x00\x9f\x01\x11\xff\x9a\x00\x9f\x01\x12\xff\xd7\x00\ +\x9f\x01\x13\xff\x9a\x00\x9f\x01\x14\xff\xd7\x00\x9f\x01\x15\xff\ +\x9a\x00\x9f\x01\x17\xff\xc3\x00\x9f\x01\x19\xff\xc3\x00\x9f\x01\ +\x1d\xff\xae\x00\x9f\x01!\xff\xae\x00\x9f\x01+\xff\xc3\x00\ +\x9f\x01-\xff\xc3\x00\x9f\x01/\xff\xc3\x00\x9f\x011\xff\ +\xc3\x00\x9f\x013\xff\xc3\x00\x9f\x015\xff\xc3\x00\x9f\x01\ +<\xff\xd7\x00\x9f\x01>\xff\xd7\x00\x9f\x01@\xff\xd7\x00\ +\x9f\x01C\xff\x85\x00\x9f\x01D\xff\x9a\x00\x9f\x01F\xff\ +\x9a\x00\x9f\x01G\xff\xd7\x00\x9f\x01H\xff\x9a\x00\x9f\x01\ +J\xff\xae\x00\x9f\x02\x08\xff\x85\x00\x9f\x02\x0c\xff\x85\x00\ +\x9f\x02W\xff\xc3\x00\x9f\x02X\xff\x85\x00\x9f\x02Y\xff\ +\x9a\x00\x9f\x02_\xff\xd7\x00\x9f\x02`\xff\x9a\x00\x9f\x02\ +b\xff\xc3\x00\x9f\x03\x1d\xff\x85\x00\x9f\x03\x1e\xff\x9a\x00\ +\x9f\x03\x1f\xff\x85\x00\x9f\x03 \xff\x9a\x00\x9f\x03!\xff\ +\x85\x00\x9f\x03\x22\xff\x9a\x00\x9f\x03#\xff\x85\x00\x9f\x03\ +%\xff\x85\x00\x9f\x03&\xff\x9a\x00\x9f\x03'\xff\x85\x00\ +\x9f\x03(\xff\x9a\x00\x9f\x03)\xff\x85\x00\x9f\x03*\xff\ +\x9a\x00\x9f\x03+\xff\x85\x00\x9f\x03,\xff\x9a\x00\x9f\x03\ +-\xff\x85\x00\x9f\x03.\xff\x9a\x00\x9f\x03/\xff\x85\x00\ +\x9f\x030\xff\x9a\x00\x9f\x031\xff\x85\x00\x9f\x032\xff\ +\x9a\x00\x9f\x033\xff\x85\x00\x9f\x034\xff\x9a\x00\x9f\x03\ +6\xff\x9a\x00\x9f\x038\xff\x9a\x00\x9f\x03:\xff\x9a\x00\ +\x9f\x03<\xff\x9a\x00\x9f\x03@\xff\x9a\x00\x9f\x03B\xff\ +\x9a\x00\x9f\x03D\xff\x9a\x00\x9f\x03I\xff\xd7\x00\x9f\x03\ +J\xff\x9a\x00\x9f\x03K\xff\xd7\x00\x9f\x03L\xff\x9a\x00\ +\x9f\x03M\xff\xd7\x00\x9f\x03N\xff\x9a\x00\x9f\x03O\xff\ +\xd7\x00\x9f\x03Q\xff\xd7\x00\x9f\x03R\xff\x9a\x00\x9f\x03\ +S\xff\xd7\x00\x9f\x03T\xff\x9a\x00\x9f\x03U\xff\xd7\x00\ +\x9f\x03V\xff\x9a\x00\x9f\x03W\xff\xd7\x00\x9f\x03X\xff\ +\x9a\x00\x9f\x03Y\xff\xd7\x00\x9f\x03Z\xff\x9a\x00\x9f\x03\ +[\xff\xd7\x00\x9f\x03\x5c\xff\x9a\x00\x9f\x03]\xff\xd7\x00\ +\x9f\x03^\xff\x9a\x00\x9f\x03_\xff\xd7\x00\x9f\x03`\xff\ +\x9a\x00\x9f\x03b\xff\xc3\x00\x9f\x03d\xff\xc3\x00\x9f\x03\ +f\xff\xc3\x00\x9f\x03h\xff\xc3\x00\x9f\x03j\xff\xc3\x00\ +\x9f\x03l\xff\xc3\x00\x9f\x03n\xff\xc3\x00\xa0\x00\x0f\xfe\ +\xf6\x00\xa0\x00\x11\xfe\xf6\x00\xa0\x00$\xff\x9a\x00\xa0\x00\ +;\xff\xd7\x00\xa0\x00=\xff\xec\x00\xa0\x00\x82\xff\x9a\x00\ +\xa0\x00\x83\xff\x9a\x00\xa0\x00\x84\xff\x9a\x00\xa0\x00\x85\xff\ +\x9a\x00\xa0\x00\x86\xff\x9a\x00\xa0\x00\x87\xff\x9a\x00\xa0\x00\ +\xc2\xff\x9a\x00\xa0\x00\xc4\xff\x9a\x00\xa0\x00\xc6\xff\x9a\x00\ +\xa0\x01;\xff\xec\x00\xa0\x01=\xff\xec\x00\xa0\x01?\xff\ +\xec\x00\xa0\x01C\xff\x9a\x00\xa0\x02\x08\xfe\xf6\x00\xa0\x02\ +\x0c\xfe\xf6\x00\xa0\x02X\xff\x9a\x00\xa0\x03\x1d\xff\x9a\x00\ +\xa0\x03\x1f\xff\x9a\x00\xa0\x03!\xff\x9a\x00\xa0\x03#\xff\ +\x9a\x00\xa0\x03%\xff\x9a\x00\xa0\x03'\xff\x9a\x00\xa0\x03\ +)\xff\x9a\x00\xa0\x03+\xff\x9a\x00\xa0\x03-\xff\x9a\x00\ +\xa0\x03/\xff\x9a\x00\xa0\x031\xff\x9a\x00\xa0\x033\xff\ +\x9a\x00\xa2\x00\x05\xff\xec\x00\xa2\x00\x0a\xff\xec\x00\xa2\x02\ +\x07\xff\xec\x00\xa2\x02\x0b\xff\xec\x00\xa3\x00\x05\xff\xec\x00\ +\xa3\x00\x0a\xff\xec\x00\xa3\x02\x07\xff\xec\x00\xa3\x02\x0b\xff\ +\xec\x00\xa4\x00\x05\xff\xec\x00\xa4\x00\x0a\xff\xec\x00\xa4\x02\ +\x07\xff\xec\x00\xa4\x02\x0b\xff\xec\x00\xa5\x00\x05\xff\xec\x00\ +\xa5\x00\x0a\xff\xec\x00\xa5\x02\x07\xff\xec\x00\xa5\x02\x0b\xff\ +\xec\x00\xa6\x00\x05\xff\xec\x00\xa6\x00\x0a\xff\xec\x00\xa6\x02\ +\x07\xff\xec\x00\xa6\x02\x0b\xff\xec\x00\xa7\x00\x05\xff\xec\x00\ +\xa7\x00\x0a\xff\xec\x00\xa7\x02\x07\xff\xec\x00\xa7\x02\x0b\xff\ +\xec\x00\xaa\x00\x05\xff\xec\x00\xaa\x00\x0a\xff\xec\x00\xaa\x00\ +Y\xff\xd7\x00\xaa\x00Z\xff\xd7\x00\xaa\x00[\xff\xd7\x00\ +\xaa\x00\x5c\xff\xd7\x00\xaa\x00]\xff\xec\x00\xaa\x00\xbf\xff\ +\xd7\x00\xaa\x017\xff\xd7\x00\xaa\x01<\xff\xec\x00\xaa\x01\ +>\xff\xec\x00\xaa\x01@\xff\xec\x00\xaa\x01\xfb\xff\xd7\x00\ +\xaa\x01\xfd\xff\xd7\x00\xaa\x02\x07\xff\xec\x00\xaa\x02\x0b\xff\ +\xec\x00\xaa\x03p\xff\xd7\x00\xab\x00\x05\xff\xec\x00\xab\x00\ +\x0a\xff\xec\x00\xab\x00Y\xff\xd7\x00\xab\x00Z\xff\xd7\x00\ +\xab\x00[\xff\xd7\x00\xab\x00\x5c\xff\xd7\x00\xab\x00]\xff\ +\xec\x00\xab\x00\xbf\xff\xd7\x00\xab\x017\xff\xd7\x00\xab\x01\ +<\xff\xec\x00\xab\x01>\xff\xec\x00\xab\x01@\xff\xec\x00\ +\xab\x01\xfb\xff\xd7\x00\xab\x01\xfd\xff\xd7\x00\xab\x02\x07\xff\ +\xec\x00\xab\x02\x0b\xff\xec\x00\xab\x03p\xff\xd7\x00\xac\x00\ +\x05\xff\xec\x00\xac\x00\x0a\xff\xec\x00\xac\x00Y\xff\xd7\x00\ +\xac\x00Z\xff\xd7\x00\xac\x00[\xff\xd7\x00\xac\x00\x5c\xff\ +\xd7\x00\xac\x00]\xff\xec\x00\xac\x00\xbf\xff\xd7\x00\xac\x01\ +7\xff\xd7\x00\xac\x01<\xff\xec\x00\xac\x01>\xff\xec\x00\ +\xac\x01@\xff\xec\x00\xac\x01\xfb\xff\xd7\x00\xac\x01\xfd\xff\ +\xd7\x00\xac\x02\x07\xff\xec\x00\xac\x02\x0b\xff\xec\x00\xac\x03\ +p\xff\xd7\x00\xad\x00\x05\xff\xec\x00\xad\x00\x0a\xff\xec\x00\ +\xad\x00Y\xff\xd7\x00\xad\x00Z\xff\xd7\x00\xad\x00[\xff\ +\xd7\x00\xad\x00\x5c\xff\xd7\x00\xad\x00]\xff\xec\x00\xad\x00\ +\xbf\xff\xd7\x00\xad\x017\xff\xd7\x00\xad\x01<\xff\xec\x00\ +\xad\x01>\xff\xec\x00\xad\x01@\xff\xec\x00\xad\x01\xfb\xff\ +\xd7\x00\xad\x01\xfd\xff\xd7\x00\xad\x02\x07\xff\xec\x00\xad\x02\ +\x0b\xff\xec\x00\xad\x03p\xff\xd7\x00\xb2\x00\x05\xff\xec\x00\ +\xb2\x00\x0a\xff\xec\x00\xb2\x00Y\xff\xd7\x00\xb2\x00Z\xff\ +\xd7\x00\xb2\x00[\xff\xd7\x00\xb2\x00\x5c\xff\xd7\x00\xb2\x00\ +]\xff\xec\x00\xb2\x00\xbf\xff\xd7\x00\xb2\x017\xff\xd7\x00\ +\xb2\x01<\xff\xec\x00\xb2\x01>\xff\xec\x00\xb2\x01@\xff\ +\xec\x00\xb2\x01\xfb\xff\xd7\x00\xb2\x01\xfd\xff\xd7\x00\xb2\x02\ +\x07\xff\xec\x00\xb2\x02\x0b\xff\xec\x00\xb2\x03p\xff\xd7\x00\ +\xb4\x00\x05\xff\xec\x00\xb4\x00\x0a\xff\xec\x00\xb4\x00Y\xff\ +\xd7\x00\xb4\x00Z\xff\xd7\x00\xb4\x00[\xff\xd7\x00\xb4\x00\ +\x5c\xff\xd7\x00\xb4\x00]\xff\xec\x00\xb4\x00\xbf\xff\xd7\x00\ +\xb4\x017\xff\xd7\x00\xb4\x01<\xff\xec\x00\xb4\x01>\xff\ +\xec\x00\xb4\x01@\xff\xec\x00\xb4\x01\xfb\xff\xd7\x00\xb4\x01\ +\xfd\xff\xd7\x00\xb4\x02\x07\xff\xec\x00\xb4\x02\x0b\xff\xec\x00\ +\xb4\x03p\xff\xd7\x00\xb5\x00\x05\xff\xec\x00\xb5\x00\x0a\xff\ +\xec\x00\xb5\x00Y\xff\xd7\x00\xb5\x00Z\xff\xd7\x00\xb5\x00\ +[\xff\xd7\x00\xb5\x00\x5c\xff\xd7\x00\xb5\x00]\xff\xec\x00\ +\xb5\x00\xbf\xff\xd7\x00\xb5\x017\xff\xd7\x00\xb5\x01<\xff\ +\xec\x00\xb5\x01>\xff\xec\x00\xb5\x01@\xff\xec\x00\xb5\x01\ +\xfb\xff\xd7\x00\xb5\x01\xfd\xff\xd7\x00\xb5\x02\x07\xff\xec\x00\ +\xb5\x02\x0b\xff\xec\x00\xb5\x03p\xff\xd7\x00\xb6\x00\x05\xff\ +\xec\x00\xb6\x00\x0a\xff\xec\x00\xb6\x00Y\xff\xd7\x00\xb6\x00\ +Z\xff\xd7\x00\xb6\x00[\xff\xd7\x00\xb6\x00\x5c\xff\xd7\x00\ +\xb6\x00]\xff\xec\x00\xb6\x00\xbf\xff\xd7\x00\xb6\x017\xff\ +\xd7\x00\xb6\x01<\xff\xec\x00\xb6\x01>\xff\xec\x00\xb6\x01\ +@\xff\xec\x00\xb6\x01\xfb\xff\xd7\x00\xb6\x01\xfd\xff\xd7\x00\ +\xb6\x02\x07\xff\xec\x00\xb6\x02\x0b\xff\xec\x00\xb6\x03p\xff\ +\xd7\x00\xb8\x00\x05\xff\xd7\x00\xb8\x00\x0a\xff\xd7\x00\xb8\x02\ +\x07\xff\xd7\x00\xb8\x02\x0b\xff\xd7\x00\xba\x00\x05\xff\xec\x00\ +\xba\x00\x0a\xff\xec\x00\xba\x00Y\xff\xd7\x00\xba\x00Z\xff\ +\xd7\x00\xba\x00[\xff\xd7\x00\xba\x00\x5c\xff\xd7\x00\xba\x00\ +]\xff\xec\x00\xba\x00\xbf\xff\xd7\x00\xba\x017\xff\xd7\x00\ +\xba\x01<\xff\xec\x00\xba\x01>\xff\xec\x00\xba\x01@\xff\ +\xec\x00\xba\x01\xfb\xff\xd7\x00\xba\x01\xfd\xff\xd7\x00\xba\x02\ +\x07\xff\xec\x00\xba\x02\x0b\xff\xec\x00\xba\x03p\xff\xd7\x00\ +\xbf\x00\x05\x00R\x00\xbf\x00\x0a\x00R\x00\xbf\x00\x0f\xff\ +\xae\x00\xbf\x00\x11\xff\xae\x00\xbf\x00\x22\x00)\x00\xbf\x02\ +\x07\x00R\x00\xbf\x02\x08\xff\xae\x00\xbf\x02\x0b\x00R\x00\ +\xbf\x02\x0c\xff\xae\x00\xc0\x00\x05\xff\xec\x00\xc0\x00\x0a\xff\ +\xec\x00\xc0\x00Y\xff\xd7\x00\xc0\x00Z\xff\xd7\x00\xc0\x00\ +[\xff\xd7\x00\xc0\x00\x5c\xff\xd7\x00\xc0\x00]\xff\xec\x00\ +\xc0\x00\xbf\xff\xd7\x00\xc0\x017\xff\xd7\x00\xc0\x01<\xff\ +\xec\x00\xc0\x01>\xff\xec\x00\xc0\x01@\xff\xec\x00\xc0\x01\ +\xfb\xff\xd7\x00\xc0\x01\xfd\xff\xd7\x00\xc0\x02\x07\xff\xec\x00\ +\xc0\x02\x0b\xff\xec\x00\xc0\x03p\xff\xd7\x00\xc1\x00\x05\x00\ +R\x00\xc1\x00\x0a\x00R\x00\xc1\x00\x0f\xff\xae\x00\xc1\x00\ +\x11\xff\xae\x00\xc1\x00\x22\x00)\x00\xc1\x02\x07\x00R\x00\ +\xc1\x02\x08\xff\xae\x00\xc1\x02\x0b\x00R\x00\xc1\x02\x0c\xff\ +\xae\x00\xc2\x00\x05\xffq\x00\xc2\x00\x0a\xffq\x00\xc2\x00\ +&\xff\xd7\x00\xc2\x00*\xff\xd7\x00\xc2\x00-\x01\x0a\x00\ +\xc2\x002\xff\xd7\x00\xc2\x004\xff\xd7\x00\xc2\x007\xff\ +q\x00\xc2\x009\xff\xae\x00\xc2\x00:\xff\xae\x00\xc2\x00\ +<\xff\x85\x00\xc2\x00\x89\xff\xd7\x00\xc2\x00\x94\xff\xd7\x00\ +\xc2\x00\x95\xff\xd7\x00\xc2\x00\x96\xff\xd7\x00\xc2\x00\x97\xff\ +\xd7\x00\xc2\x00\x98\xff\xd7\x00\xc2\x00\x9a\xff\xd7\x00\xc2\x00\ +\x9f\xff\x85\x00\xc2\x00\xc8\xff\xd7\x00\xc2\x00\xca\xff\xd7\x00\ +\xc2\x00\xcc\xff\xd7\x00\xc2\x00\xce\xff\xd7\x00\xc2\x00\xde\xff\ +\xd7\x00\xc2\x00\xe0\xff\xd7\x00\xc2\x00\xe2\xff\xd7\x00\xc2\x00\ +\xe4\xff\xd7\x00\xc2\x01\x0e\xff\xd7\x00\xc2\x01\x10\xff\xd7\x00\ +\xc2\x01\x12\xff\xd7\x00\xc2\x01\x14\xff\xd7\x00\xc2\x01$\xff\ +q\x00\xc2\x01&\xffq\x00\xc2\x016\xff\xae\x00\xc2\x01\ +8\xff\x85\x00\xc2\x01:\xff\x85\x00\xc2\x01G\xff\xd7\x00\ +\xc2\x01\xfa\xff\xae\x00\xc2\x01\xfc\xff\xae\x00\xc2\x01\xfe\xff\ +\xae\x00\xc2\x02\x00\xff\x85\x00\xc2\x02\x07\xffq\x00\xc2\x02\ +\x0b\xffq\x00\xc2\x02_\xff\xd7\x00\xc2\x03I\xff\xd7\x00\ +\xc2\x03K\xff\xd7\x00\xc2\x03M\xff\xd7\x00\xc2\x03O\xff\ +\xd7\x00\xc2\x03Q\xff\xd7\x00\xc2\x03S\xff\xd7\x00\xc2\x03\ +U\xff\xd7\x00\xc2\x03W\xff\xd7\x00\xc2\x03Y\xff\xd7\x00\ +\xc2\x03[\xff\xd7\x00\xc2\x03]\xff\xd7\x00\xc2\x03_\xff\ +\xd7\x00\xc2\x03o\xff\x85\x00\xc2\x03q\xff\x85\x00\xc2\x03\ +s\xff\x85\x00\xc2\x03\x8f\xffq\x00\xc3\x00\x05\xff\xec\x00\ +\xc3\x00\x0a\xff\xec\x00\xc3\x02\x07\xff\xec\x00\xc3\x02\x0b\xff\ +\xec\x00\xc4\x00\x05\xffq\x00\xc4\x00\x0a\xffq\x00\xc4\x00\ +&\xff\xd7\x00\xc4\x00*\xff\xd7\x00\xc4\x00-\x01\x0a\x00\ +\xc4\x002\xff\xd7\x00\xc4\x004\xff\xd7\x00\xc4\x007\xff\ +q\x00\xc4\x009\xff\xae\x00\xc4\x00:\xff\xae\x00\xc4\x00\ +<\xff\x85\x00\xc4\x00\x89\xff\xd7\x00\xc4\x00\x94\xff\xd7\x00\ +\xc4\x00\x95\xff\xd7\x00\xc4\x00\x96\xff\xd7\x00\xc4\x00\x97\xff\ +\xd7\x00\xc4\x00\x98\xff\xd7\x00\xc4\x00\x9a\xff\xd7\x00\xc4\x00\ +\x9f\xff\x85\x00\xc4\x00\xc8\xff\xd7\x00\xc4\x00\xca\xff\xd7\x00\ +\xc4\x00\xcc\xff\xd7\x00\xc4\x00\xce\xff\xd7\x00\xc4\x00\xde\xff\ +\xd7\x00\xc4\x00\xe0\xff\xd7\x00\xc4\x00\xe2\xff\xd7\x00\xc4\x00\ +\xe4\xff\xd7\x00\xc4\x01\x0e\xff\xd7\x00\xc4\x01\x10\xff\xd7\x00\ +\xc4\x01\x12\xff\xd7\x00\xc4\x01\x14\xff\xd7\x00\xc4\x01$\xff\ +q\x00\xc4\x01&\xffq\x00\xc4\x016\xff\xae\x00\xc4\x01\ +8\xff\x85\x00\xc4\x01:\xff\x85\x00\xc4\x01G\xff\xd7\x00\ +\xc4\x01\xfa\xff\xae\x00\xc4\x01\xfc\xff\xae\x00\xc4\x01\xfe\xff\ +\xae\x00\xc4\x02\x00\xff\x85\x00\xc4\x02\x07\xffq\x00\xc4\x02\ +\x0b\xffq\x00\xc4\x02_\xff\xd7\x00\xc4\x03I\xff\xd7\x00\ +\xc4\x03K\xff\xd7\x00\xc4\x03M\xff\xd7\x00\xc4\x03O\xff\ +\xd7\x00\xc4\x03Q\xff\xd7\x00\xc4\x03S\xff\xd7\x00\xc4\x03\ +U\xff\xd7\x00\xc4\x03W\xff\xd7\x00\xc4\x03Y\xff\xd7\x00\ +\xc4\x03[\xff\xd7\x00\xc4\x03]\xff\xd7\x00\xc4\x03_\xff\ +\xd7\x00\xc4\x03o\xff\x85\x00\xc4\x03q\xff\x85\x00\xc4\x03\ +s\xff\x85\x00\xc4\x03\x8f\xffq\x00\xc5\x00\x05\xff\xec\x00\ +\xc5\x00\x0a\xff\xec\x00\xc5\x02\x07\xff\xec\x00\xc5\x02\x0b\xff\ +\xec\x00\xc6\x00\x05\xffq\x00\xc6\x00\x0a\xffq\x00\xc6\x00\ +&\xff\xd7\x00\xc6\x00*\xff\xd7\x00\xc6\x00-\x01\x0a\x00\ +\xc6\x002\xff\xd7\x00\xc6\x004\xff\xd7\x00\xc6\x007\xff\ +q\x00\xc6\x009\xff\xae\x00\xc6\x00:\xff\xae\x00\xc6\x00\ +<\xff\x85\x00\xc6\x00\x89\xff\xd7\x00\xc6\x00\x94\xff\xd7\x00\ +\xc6\x00\x95\xff\xd7\x00\xc6\x00\x96\xff\xd7\x00\xc6\x00\x97\xff\ +\xd7\x00\xc6\x00\x98\xff\xd7\x00\xc6\x00\x9a\xff\xd7\x00\xc6\x00\ +\x9f\xff\x85\x00\xc6\x00\xc8\xff\xd7\x00\xc6\x00\xca\xff\xd7\x00\ +\xc6\x00\xcc\xff\xd7\x00\xc6\x00\xce\xff\xd7\x00\xc6\x00\xde\xff\ +\xd7\x00\xc6\x00\xe0\xff\xd7\x00\xc6\x00\xe2\xff\xd7\x00\xc6\x00\ +\xe4\xff\xd7\x00\xc6\x01\x0e\xff\xd7\x00\xc6\x01\x10\xff\xd7\x00\ +\xc6\x01\x12\xff\xd7\x00\xc6\x01\x14\xff\xd7\x00\xc6\x01$\xff\ +q\x00\xc6\x01&\xffq\x00\xc6\x016\xff\xae\x00\xc6\x01\ +8\xff\x85\x00\xc6\x01:\xff\x85\x00\xc6\x01G\xff\xd7\x00\ +\xc6\x01\xfa\xff\xae\x00\xc6\x01\xfc\xff\xae\x00\xc6\x01\xfe\xff\ +\xae\x00\xc6\x02\x00\xff\x85\x00\xc6\x02\x07\xffq\x00\xc6\x02\ +\x0b\xffq\x00\xc6\x02_\xff\xd7\x00\xc6\x03I\xff\xd7\x00\ +\xc6\x03K\xff\xd7\x00\xc6\x03M\xff\xd7\x00\xc6\x03O\xff\ +\xd7\x00\xc6\x03Q\xff\xd7\x00\xc6\x03S\xff\xd7\x00\xc6\x03\ +U\xff\xd7\x00\xc6\x03W\xff\xd7\x00\xc6\x03Y\xff\xd7\x00\ +\xc6\x03[\xff\xd7\x00\xc6\x03]\xff\xd7\x00\xc6\x03_\xff\ +\xd7\x00\xc6\x03o\xff\x85\x00\xc6\x03q\xff\x85\x00\xc6\x03\ +s\xff\x85\x00\xc6\x03\x8f\xffq\x00\xc7\x00\x05\xff\xec\x00\ +\xc7\x00\x0a\xff\xec\x00\xc7\x02\x07\xff\xec\x00\xc7\x02\x0b\xff\ +\xec\x00\xc8\x00&\xff\xd7\x00\xc8\x00*\xff\xd7\x00\xc8\x00\ +2\xff\xd7\x00\xc8\x004\xff\xd7\x00\xc8\x00\x89\xff\xd7\x00\ +\xc8\x00\x94\xff\xd7\x00\xc8\x00\x95\xff\xd7\x00\xc8\x00\x96\xff\ +\xd7\x00\xc8\x00\x97\xff\xd7\x00\xc8\x00\x98\xff\xd7\x00\xc8\x00\ +\x9a\xff\xd7\x00\xc8\x00\xc8\xff\xd7\x00\xc8\x00\xca\xff\xd7\x00\ +\xc8\x00\xcc\xff\xd7\x00\xc8\x00\xce\xff\xd7\x00\xc8\x00\xde\xff\ +\xd7\x00\xc8\x00\xe0\xff\xd7\x00\xc8\x00\xe2\xff\xd7\x00\xc8\x00\ +\xe4\xff\xd7\x00\xc8\x01\x0e\xff\xd7\x00\xc8\x01\x10\xff\xd7\x00\ +\xc8\x01\x12\xff\xd7\x00\xc8\x01\x14\xff\xd7\x00\xc8\x01G\xff\ +\xd7\x00\xc8\x02_\xff\xd7\x00\xc8\x03I\xff\xd7\x00\xc8\x03\ +K\xff\xd7\x00\xc8\x03M\xff\xd7\x00\xc8\x03O\xff\xd7\x00\ +\xc8\x03Q\xff\xd7\x00\xc8\x03S\xff\xd7\x00\xc8\x03U\xff\ +\xd7\x00\xc8\x03W\xff\xd7\x00\xc8\x03Y\xff\xd7\x00\xc8\x03\ +[\xff\xd7\x00\xc8\x03]\xff\xd7\x00\xc8\x03_\xff\xd7\x00\ +\xca\x00&\xff\xd7\x00\xca\x00*\xff\xd7\x00\xca\x002\xff\ +\xd7\x00\xca\x004\xff\xd7\x00\xca\x00\x89\xff\xd7\x00\xca\x00\ +\x94\xff\xd7\x00\xca\x00\x95\xff\xd7\x00\xca\x00\x96\xff\xd7\x00\ +\xca\x00\x97\xff\xd7\x00\xca\x00\x98\xff\xd7\x00\xca\x00\x9a\xff\ +\xd7\x00\xca\x00\xc8\xff\xd7\x00\xca\x00\xca\xff\xd7\x00\xca\x00\ +\xcc\xff\xd7\x00\xca\x00\xce\xff\xd7\x00\xca\x00\xde\xff\xd7\x00\ +\xca\x00\xe0\xff\xd7\x00\xca\x00\xe2\xff\xd7\x00\xca\x00\xe4\xff\ +\xd7\x00\xca\x01\x0e\xff\xd7\x00\xca\x01\x10\xff\xd7\x00\xca\x01\ +\x12\xff\xd7\x00\xca\x01\x14\xff\xd7\x00\xca\x01G\xff\xd7\x00\ +\xca\x02_\xff\xd7\x00\xca\x03I\xff\xd7\x00\xca\x03K\xff\ +\xd7\x00\xca\x03M\xff\xd7\x00\xca\x03O\xff\xd7\x00\xca\x03\ +Q\xff\xd7\x00\xca\x03S\xff\xd7\x00\xca\x03U\xff\xd7\x00\ +\xca\x03W\xff\xd7\x00\xca\x03Y\xff\xd7\x00\xca\x03[\xff\ +\xd7\x00\xca\x03]\xff\xd7\x00\xca\x03_\xff\xd7\x00\xcc\x00\ +&\xff\xd7\x00\xcc\x00*\xff\xd7\x00\xcc\x002\xff\xd7\x00\ +\xcc\x004\xff\xd7\x00\xcc\x00\x89\xff\xd7\x00\xcc\x00\x94\xff\ +\xd7\x00\xcc\x00\x95\xff\xd7\x00\xcc\x00\x96\xff\xd7\x00\xcc\x00\ +\x97\xff\xd7\x00\xcc\x00\x98\xff\xd7\x00\xcc\x00\x9a\xff\xd7\x00\ +\xcc\x00\xc8\xff\xd7\x00\xcc\x00\xca\xff\xd7\x00\xcc\x00\xcc\xff\ +\xd7\x00\xcc\x00\xce\xff\xd7\x00\xcc\x00\xde\xff\xd7\x00\xcc\x00\ +\xe0\xff\xd7\x00\xcc\x00\xe2\xff\xd7\x00\xcc\x00\xe4\xff\xd7\x00\ +\xcc\x01\x0e\xff\xd7\x00\xcc\x01\x10\xff\xd7\x00\xcc\x01\x12\xff\ +\xd7\x00\xcc\x01\x14\xff\xd7\x00\xcc\x01G\xff\xd7\x00\xcc\x02\ +_\xff\xd7\x00\xcc\x03I\xff\xd7\x00\xcc\x03K\xff\xd7\x00\ +\xcc\x03M\xff\xd7\x00\xcc\x03O\xff\xd7\x00\xcc\x03Q\xff\ +\xd7\x00\xcc\x03S\xff\xd7\x00\xcc\x03U\xff\xd7\x00\xcc\x03\ +W\xff\xd7\x00\xcc\x03Y\xff\xd7\x00\xcc\x03[\xff\xd7\x00\ +\xcc\x03]\xff\xd7\x00\xcc\x03_\xff\xd7\x00\xce\x00&\xff\ +\xd7\x00\xce\x00*\xff\xd7\x00\xce\x002\xff\xd7\x00\xce\x00\ +4\xff\xd7\x00\xce\x00\x89\xff\xd7\x00\xce\x00\x94\xff\xd7\x00\ +\xce\x00\x95\xff\xd7\x00\xce\x00\x96\xff\xd7\x00\xce\x00\x97\xff\ +\xd7\x00\xce\x00\x98\xff\xd7\x00\xce\x00\x9a\xff\xd7\x00\xce\x00\ +\xc8\xff\xd7\x00\xce\x00\xca\xff\xd7\x00\xce\x00\xcc\xff\xd7\x00\ +\xce\x00\xce\xff\xd7\x00\xce\x00\xde\xff\xd7\x00\xce\x00\xe0\xff\ +\xd7\x00\xce\x00\xe2\xff\xd7\x00\xce\x00\xe4\xff\xd7\x00\xce\x01\ +\x0e\xff\xd7\x00\xce\x01\x10\xff\xd7\x00\xce\x01\x12\xff\xd7\x00\ +\xce\x01\x14\xff\xd7\x00\xce\x01G\xff\xd7\x00\xce\x02_\xff\ +\xd7\x00\xce\x03I\xff\xd7\x00\xce\x03K\xff\xd7\x00\xce\x03\ +M\xff\xd7\x00\xce\x03O\xff\xd7\x00\xce\x03Q\xff\xd7\x00\ +\xce\x03S\xff\xd7\x00\xce\x03U\xff\xd7\x00\xce\x03W\xff\ +\xd7\x00\xce\x03Y\xff\xd7\x00\xce\x03[\xff\xd7\x00\xce\x03\ +]\xff\xd7\x00\xce\x03_\xff\xd7\x00\xd0\x00\x0f\xff\xae\x00\ +\xd0\x00\x11\xff\xae\x00\xd0\x00$\xff\xd7\x00\xd0\x007\xff\ +\xc3\x00\xd0\x009\xff\xec\x00\xd0\x00:\xff\xec\x00\xd0\x00\ +;\xff\xd7\x00\xd0\x00<\xff\xec\x00\xd0\x00=\xff\xec\x00\ +\xd0\x00\x82\xff\xd7\x00\xd0\x00\x83\xff\xd7\x00\xd0\x00\x84\xff\ +\xd7\x00\xd0\x00\x85\xff\xd7\x00\xd0\x00\x86\xff\xd7\x00\xd0\x00\ +\x87\xff\xd7\x00\xd0\x00\x9f\xff\xec\x00\xd0\x00\xc2\xff\xd7\x00\ +\xd0\x00\xc4\xff\xd7\x00\xd0\x00\xc6\xff\xd7\x00\xd0\x01$\xff\ +\xc3\x00\xd0\x01&\xff\xc3\x00\xd0\x016\xff\xec\x00\xd0\x01\ +8\xff\xec\x00\xd0\x01:\xff\xec\x00\xd0\x01;\xff\xec\x00\ +\xd0\x01=\xff\xec\x00\xd0\x01?\xff\xec\x00\xd0\x01C\xff\ +\xd7\x00\xd0\x01\xa0\xff\xec\x00\xd0\x01\xfa\xff\xec\x00\xd0\x01\ +\xfc\xff\xec\x00\xd0\x01\xfe\xff\xec\x00\xd0\x02\x00\xff\xec\x00\ +\xd0\x02\x08\xff\xae\x00\xd0\x02\x0c\xff\xae\x00\xd0\x02X\xff\ +\xd7\x00\xd0\x03\x1d\xff\xd7\x00\xd0\x03\x1f\xff\xd7\x00\xd0\x03\ +!\xff\xd7\x00\xd0\x03#\xff\xd7\x00\xd0\x03%\xff\xd7\x00\ +\xd0\x03'\xff\xd7\x00\xd0\x03)\xff\xd7\x00\xd0\x03+\xff\ +\xd7\x00\xd0\x03-\xff\xd7\x00\xd0\x03/\xff\xd7\x00\xd0\x03\ +1\xff\xd7\x00\xd0\x033\xff\xd7\x00\xd0\x03o\xff\xec\x00\ +\xd0\x03q\xff\xec\x00\xd0\x03s\xff\xec\x00\xd0\x03\x8f\xff\ +\xc3\x00\xd1\x00\x05\x00R\x00\xd1\x00\x0a\x00R\x00\xd1\x00\ +\x0c\x00\x8f\x00\xd1\x00\x22\x00\xa4\x00\xd1\x00@\x00\x8f\x00\ +\xd1\x00E\x00=\x00\xd1\x00K\x00=\x00\xd1\x00N\x00\ +=\x00\xd1\x00O\x00=\x00\xd1\x00`\x00\x8f\x00\xd1\x00\ +\xe7\x00=\x00\xd1\x00\xe9\x00{\x00\xd1\x02\x07\x00R\x00\ +\xd1\x02\x0b\x00R\x00\xd2\x00\x0f\xff\xae\x00\xd2\x00\x11\xff\ +\xae\x00\xd2\x00$\xff\xd7\x00\xd2\x007\xff\xc3\x00\xd2\x00\ +9\xff\xec\x00\xd2\x00:\xff\xec\x00\xd2\x00;\xff\xd7\x00\ +\xd2\x00<\xff\xec\x00\xd2\x00=\xff\xec\x00\xd2\x00\x82\xff\ +\xd7\x00\xd2\x00\x83\xff\xd7\x00\xd2\x00\x84\xff\xd7\x00\xd2\x00\ +\x85\xff\xd7\x00\xd2\x00\x86\xff\xd7\x00\xd2\x00\x87\xff\xd7\x00\ +\xd2\x00\x9f\xff\xec\x00\xd2\x00\xc2\xff\xd7\x00\xd2\x00\xc4\xff\ +\xd7\x00\xd2\x00\xc6\xff\xd7\x00\xd2\x01$\xff\xc3\x00\xd2\x01\ +&\xff\xc3\x00\xd2\x016\xff\xec\x00\xd2\x018\xff\xec\x00\ +\xd2\x01:\xff\xec\x00\xd2\x01;\xff\xec\x00\xd2\x01=\xff\ +\xec\x00\xd2\x01?\xff\xec\x00\xd2\x01C\xff\xd7\x00\xd2\x01\ +\xa0\xff\xec\x00\xd2\x01\xfa\xff\xec\x00\xd2\x01\xfc\xff\xec\x00\ +\xd2\x01\xfe\xff\xec\x00\xd2\x02\x00\xff\xec\x00\xd2\x02\x08\xff\ +\xae\x00\xd2\x02\x0c\xff\xae\x00\xd2\x02X\xff\xd7\x00\xd2\x03\ +\x1d\xff\xd7\x00\xd2\x03\x1f\xff\xd7\x00\xd2\x03!\xff\xd7\x00\ +\xd2\x03#\xff\xd7\x00\xd2\x03%\xff\xd7\x00\xd2\x03'\xff\ +\xd7\x00\xd2\x03)\xff\xd7\x00\xd2\x03+\xff\xd7\x00\xd2\x03\ +-\xff\xd7\x00\xd2\x03/\xff\xd7\x00\xd2\x031\xff\xd7\x00\ +\xd2\x033\xff\xd7\x00\xd2\x03o\xff\xec\x00\xd2\x03q\xff\ +\xec\x00\xd2\x03s\xff\xec\x00\xd2\x03\x8f\xff\xc3\x00\xd4\x00\ +-\x00{\x00\xd5\x00\x05\xff\xec\x00\xd5\x00\x0a\xff\xec\x00\ +\xd5\x00Y\xff\xd7\x00\xd5\x00Z\xff\xd7\x00\xd5\x00[\xff\ +\xd7\x00\xd5\x00\x5c\xff\xd7\x00\xd5\x00]\xff\xec\x00\xd5\x00\ +\xbf\xff\xd7\x00\xd5\x017\xff\xd7\x00\xd5\x01<\xff\xec\x00\ +\xd5\x01>\xff\xec\x00\xd5\x01@\xff\xec\x00\xd5\x01\xfb\xff\ +\xd7\x00\xd5\x01\xfd\xff\xd7\x00\xd5\x02\x07\xff\xec\x00\xd5\x02\ +\x0b\xff\xec\x00\xd5\x03p\xff\xd7\x00\xd6\x00-\x00{\x00\ +\xd7\x00\x05\xff\xec\x00\xd7\x00\x0a\xff\xec\x00\xd7\x00Y\xff\ +\xd7\x00\xd7\x00Z\xff\xd7\x00\xd7\x00[\xff\xd7\x00\xd7\x00\ +\x5c\xff\xd7\x00\xd7\x00]\xff\xec\x00\xd7\x00\xbf\xff\xd7\x00\ +\xd7\x017\xff\xd7\x00\xd7\x01<\xff\xec\x00\xd7\x01>\xff\ +\xec\x00\xd7\x01@\xff\xec\x00\xd7\x01\xfb\xff\xd7\x00\xd7\x01\ +\xfd\xff\xd7\x00\xd7\x02\x07\xff\xec\x00\xd7\x02\x0b\xff\xec\x00\ +\xd7\x03p\xff\xd7\x00\xd8\x00-\x00{\x00\xd9\x00\x05\xff\ +\xec\x00\xd9\x00\x0a\xff\xec\x00\xd9\x00Y\xff\xd7\x00\xd9\x00\ +Z\xff\xd7\x00\xd9\x00[\xff\xd7\x00\xd9\x00\x5c\xff\xd7\x00\ +\xd9\x00]\xff\xec\x00\xd9\x00\xbf\xff\xd7\x00\xd9\x017\xff\ +\xd7\x00\xd9\x01<\xff\xec\x00\xd9\x01>\xff\xec\x00\xd9\x01\ +@\xff\xec\x00\xd9\x01\xfb\xff\xd7\x00\xd9\x01\xfd\xff\xd7\x00\ +\xd9\x02\x07\xff\xec\x00\xd9\x02\x0b\xff\xec\x00\xd9\x03p\xff\ +\xd7\x00\xda\x00-\x00{\x00\xdb\x00\x05\xff\xec\x00\xdb\x00\ +\x0a\xff\xec\x00\xdb\x00Y\xff\xd7\x00\xdb\x00Z\xff\xd7\x00\ +\xdb\x00[\xff\xd7\x00\xdb\x00\x5c\xff\xd7\x00\xdb\x00]\xff\ +\xec\x00\xdb\x00\xbf\xff\xd7\x00\xdb\x017\xff\xd7\x00\xdb\x01\ +<\xff\xec\x00\xdb\x01>\xff\xec\x00\xdb\x01@\xff\xec\x00\ +\xdb\x01\xfb\xff\xd7\x00\xdb\x01\xfd\xff\xd7\x00\xdb\x02\x07\xff\ +\xec\x00\xdb\x02\x0b\xff\xec\x00\xdb\x03p\xff\xd7\x00\xdc\x00\ +-\x00{\x00\xdd\x00\x05\xff\xec\x00\xdd\x00\x0a\xff\xec\x00\ +\xdd\x00Y\xff\xd7\x00\xdd\x00Z\xff\xd7\x00\xdd\x00[\xff\ +\xd7\x00\xdd\x00\x5c\xff\xd7\x00\xdd\x00]\xff\xec\x00\xdd\x00\ +\xbf\xff\xd7\x00\xdd\x017\xff\xd7\x00\xdd\x01<\xff\xec\x00\ +\xdd\x01>\xff\xec\x00\xdd\x01@\xff\xec\x00\xdd\x01\xfb\xff\ +\xd7\x00\xdd\x01\xfd\xff\xd7\x00\xdd\x02\x07\xff\xec\x00\xdd\x02\ +\x0b\xff\xec\x00\xdd\x03p\xff\xd7\x00\xe7\x00\x05\xff\xec\x00\ +\xe7\x00\x0a\xff\xec\x00\xe7\x02\x07\xff\xec\x00\xe7\x02\x0b\xff\ +\xec\x00\xf8\x00&\xff\xd7\x00\xf8\x00*\xff\xd7\x00\xf8\x00\ +2\xff\xd7\x00\xf8\x004\xff\xd7\x00\xf8\x00\x89\xff\xd7\x00\ +\xf8\x00\x94\xff\xd7\x00\xf8\x00\x95\xff\xd7\x00\xf8\x00\x96\xff\ +\xd7\x00\xf8\x00\x97\xff\xd7\x00\xf8\x00\x98\xff\xd7\x00\xf8\x00\ +\x9a\xff\xd7\x00\xf8\x00\xc8\xff\xd7\x00\xf8\x00\xca\xff\xd7\x00\ +\xf8\x00\xcc\xff\xd7\x00\xf8\x00\xce\xff\xd7\x00\xf8\x00\xde\xff\ +\xd7\x00\xf8\x00\xe0\xff\xd7\x00\xf8\x00\xe2\xff\xd7\x00\xf8\x00\ +\xe4\xff\xd7\x00\xf8\x01\x0e\xff\xd7\x00\xf8\x01\x10\xff\xd7\x00\ +\xf8\x01\x12\xff\xd7\x00\xf8\x01\x14\xff\xd7\x00\xf8\x01G\xff\ +\xd7\x00\xf8\x02_\xff\xd7\x00\xf8\x03I\xff\xd7\x00\xf8\x03\ +K\xff\xd7\x00\xf8\x03M\xff\xd7\x00\xf8\x03O\xff\xd7\x00\ +\xf8\x03Q\xff\xd7\x00\xf8\x03S\xff\xd7\x00\xf8\x03U\xff\ +\xd7\x00\xf8\x03W\xff\xd7\x00\xf8\x03Y\xff\xd7\x00\xf8\x03\ +[\xff\xd7\x00\xf8\x03]\xff\xd7\x00\xf8\x03_\xff\xd7\x00\ +\xf9\x00F\xff\xd7\x00\xf9\x00G\xff\xd7\x00\xf9\x00H\xff\ +\xd7\x00\xf9\x00R\xff\xd7\x00\xf9\x00T\xff\xd7\x00\xf9\x00\ +\xa2\xff\xd7\x00\xf9\x00\xa9\xff\xd7\x00\xf9\x00\xaa\xff\xd7\x00\ +\xf9\x00\xab\xff\xd7\x00\xf9\x00\xac\xff\xd7\x00\xf9\x00\xad\xff\ +\xd7\x00\xf9\x00\xb4\xff\xd7\x00\xf9\x00\xb5\xff\xd7\x00\xf9\x00\ +\xb6\xff\xd7\x00\xf9\x00\xb7\xff\xd7\x00\xf9\x00\xb8\xff\xd7\x00\ +\xf9\x00\xba\xff\xd7\x00\xf9\x00\xc9\xff\xd7\x00\xf9\x00\xcb\xff\ +\xd7\x00\xf9\x00\xcd\xff\xd7\x00\xf9\x00\xcf\xff\xd7\x00\xf9\x00\ +\xd1\xff\xd7\x00\xf9\x00\xd3\xff\xd7\x00\xf9\x00\xd5\xff\xd7\x00\ +\xf9\x00\xd7\xff\xd7\x00\xf9\x00\xd9\xff\xd7\x00\xf9\x00\xdb\xff\ +\xd7\x00\xf9\x00\xdd\xff\xd7\x00\xf9\x01\x0f\xff\xd7\x00\xf9\x01\ +\x11\xff\xd7\x00\xf9\x01\x13\xff\xd7\x00\xf9\x01\x15\xff\xd7\x00\ +\xf9\x01H\xff\xd7\x00\xf9\x02`\xff\xd7\x00\xf9\x036\xff\ +\xd7\x00\xf9\x038\xff\xd7\x00\xf9\x03:\xff\xd7\x00\xf9\x03\ +<\xff\xd7\x00\xf9\x03@\xff\xd7\x00\xf9\x03B\xff\xd7\x00\ +\xf9\x03D\xff\xd7\x00\xf9\x03J\xff\xd7\x00\xf9\x03L\xff\ +\xd7\x00\xf9\x03N\xff\xd7\x00\xf9\x03R\xff\xd7\x00\xf9\x03\ +T\xff\xd7\x00\xf9\x03V\xff\xd7\x00\xf9\x03X\xff\xd7\x00\ +\xf9\x03Z\xff\xd7\x00\xf9\x03\x5c\xff\xd7\x00\xf9\x03^\xff\ +\xd7\x00\xf9\x03`\xff\xd7\x00\xfa\x00F\xff\xd7\x00\xfa\x00\ +G\xff\xd7\x00\xfa\x00H\xff\xd7\x00\xfa\x00R\xff\xd7\x00\ +\xfa\x00T\xff\xd7\x00\xfa\x00\xa2\xff\xd7\x00\xfa\x00\xa9\xff\ +\xd7\x00\xfa\x00\xaa\xff\xd7\x00\xfa\x00\xab\xff\xd7\x00\xfa\x00\ +\xac\xff\xd7\x00\xfa\x00\xad\xff\xd7\x00\xfa\x00\xb4\xff\xd7\x00\ +\xfa\x00\xb5\xff\xd7\x00\xfa\x00\xb6\xff\xd7\x00\xfa\x00\xb7\xff\ +\xd7\x00\xfa\x00\xb8\xff\xd7\x00\xfa\x00\xba\xff\xd7\x00\xfa\x00\ +\xc9\xff\xd7\x00\xfa\x00\xcb\xff\xd7\x00\xfa\x00\xcd\xff\xd7\x00\ +\xfa\x00\xcf\xff\xd7\x00\xfa\x00\xd1\xff\xd7\x00\xfa\x00\xd3\xff\ +\xd7\x00\xfa\x00\xd5\xff\xd7\x00\xfa\x00\xd7\xff\xd7\x00\xfa\x00\ +\xd9\xff\xd7\x00\xfa\x00\xdb\xff\xd7\x00\xfa\x00\xdd\xff\xd7\x00\ +\xfa\x01\x0f\xff\xd7\x00\xfa\x01\x11\xff\xd7\x00\xfa\x01\x13\xff\ +\xd7\x00\xfa\x01\x15\xff\xd7\x00\xfa\x01H\xff\xd7\x00\xfa\x02\ +`\xff\xd7\x00\xfa\x036\xff\xd7\x00\xfa\x038\xff\xd7\x00\ +\xfa\x03:\xff\xd7\x00\xfa\x03<\xff\xd7\x00\xfa\x03@\xff\ +\xd7\x00\xfa\x03B\xff\xd7\x00\xfa\x03D\xff\xd7\x00\xfa\x03\ +J\xff\xd7\x00\xfa\x03L\xff\xd7\x00\xfa\x03N\xff\xd7\x00\ +\xfa\x03R\xff\xd7\x00\xfa\x03T\xff\xd7\x00\xfa\x03V\xff\ +\xd7\x00\xfa\x03X\xff\xd7\x00\xfa\x03Z\xff\xd7\x00\xfa\x03\ +\x5c\xff\xd7\x00\xfa\x03^\xff\xd7\x00\xfa\x03`\xff\xd7\x00\ +\xfb\x00\x05\xff\x5c\x00\xfb\x00\x0a\xff\x5c\x00\xfb\x00&\xff\ +\xd7\x00\xfb\x00*\xff\xd7\x00\xfb\x002\xff\xd7\x00\xfb\x00\ +4\xff\xd7\x00\xfb\x007\xff\xd7\x00\xfb\x008\xff\xec\x00\ +\xfb\x009\xff\xd7\x00\xfb\x00:\xff\xd7\x00\xfb\x00<\xff\ +\xc3\x00\xfb\x00\x89\xff\xd7\x00\xfb\x00\x94\xff\xd7\x00\xfb\x00\ +\x95\xff\xd7\x00\xfb\x00\x96\xff\xd7\x00\xfb\x00\x97\xff\xd7\x00\ +\xfb\x00\x98\xff\xd7\x00\xfb\x00\x9a\xff\xd7\x00\xfb\x00\x9b\xff\ +\xec\x00\xfb\x00\x9c\xff\xec\x00\xfb\x00\x9d\xff\xec\x00\xfb\x00\ +\x9e\xff\xec\x00\xfb\x00\x9f\xff\xc3\x00\xfb\x00\xc8\xff\xd7\x00\ +\xfb\x00\xca\xff\xd7\x00\xfb\x00\xcc\xff\xd7\x00\xfb\x00\xce\xff\ +\xd7\x00\xfb\x00\xde\xff\xd7\x00\xfb\x00\xe0\xff\xd7\x00\xfb\x00\ +\xe2\xff\xd7\x00\xfb\x00\xe4\xff\xd7\x00\xfb\x01\x0e\xff\xd7\x00\ +\xfb\x01\x10\xff\xd7\x00\xfb\x01\x12\xff\xd7\x00\xfb\x01\x14\xff\ +\xd7\x00\xfb\x01$\xff\xd7\x00\xfb\x01&\xff\xd7\x00\xfb\x01\ +*\xff\xec\x00\xfb\x01,\xff\xec\x00\xfb\x01.\xff\xec\x00\ +\xfb\x010\xff\xec\x00\xfb\x012\xff\xec\x00\xfb\x014\xff\ +\xec\x00\xfb\x016\xff\xd7\x00\xfb\x018\xff\xc3\x00\xfb\x01\ +:\xff\xc3\x00\xfb\x01G\xff\xd7\x00\xfb\x01\xfa\xff\xd7\x00\ +\xfb\x01\xfc\xff\xd7\x00\xfb\x01\xfe\xff\xd7\x00\xfb\x02\x00\xff\ +\xc3\x00\xfb\x02\x07\xff\x5c\x00\xfb\x02\x0b\xff\x5c\x00\xfb\x02\ +_\xff\xd7\x00\xfb\x02a\xff\xec\x00\xfb\x03I\xff\xd7\x00\ +\xfb\x03K\xff\xd7\x00\xfb\x03M\xff\xd7\x00\xfb\x03O\xff\ +\xd7\x00\xfb\x03Q\xff\xd7\x00\xfb\x03S\xff\xd7\x00\xfb\x03\ +U\xff\xd7\x00\xfb\x03W\xff\xd7\x00\xfb\x03Y\xff\xd7\x00\ +\xfb\x03[\xff\xd7\x00\xfb\x03]\xff\xd7\x00\xfb\x03_\xff\ +\xd7\x00\xfb\x03a\xff\xec\x00\xfb\x03c\xff\xec\x00\xfb\x03\ +e\xff\xec\x00\xfb\x03g\xff\xec\x00\xfb\x03i\xff\xec\x00\ +\xfb\x03k\xff\xec\x00\xfb\x03m\xff\xec\x00\xfb\x03o\xff\ +\xc3\x00\xfb\x03q\xff\xc3\x00\xfb\x03s\xff\xc3\x00\xfb\x03\ +\x8f\xff\xd7\x00\xfd\x00\x05\xff\x5c\x00\xfd\x00\x0a\xff\x5c\x00\ +\xfd\x00&\xff\xd7\x00\xfd\x00*\xff\xd7\x00\xfd\x002\xff\ +\xd7\x00\xfd\x004\xff\xd7\x00\xfd\x007\xff\xd7\x00\xfd\x00\ +8\xff\xec\x00\xfd\x009\xff\xd7\x00\xfd\x00:\xff\xd7\x00\ +\xfd\x00<\xff\xc3\x00\xfd\x00\x89\xff\xd7\x00\xfd\x00\x94\xff\ +\xd7\x00\xfd\x00\x95\xff\xd7\x00\xfd\x00\x96\xff\xd7\x00\xfd\x00\ +\x97\xff\xd7\x00\xfd\x00\x98\xff\xd7\x00\xfd\x00\x9a\xff\xd7\x00\ +\xfd\x00\x9b\xff\xec\x00\xfd\x00\x9c\xff\xec\x00\xfd\x00\x9d\xff\ +\xec\x00\xfd\x00\x9e\xff\xec\x00\xfd\x00\x9f\xff\xc3\x00\xfd\x00\ +\xc8\xff\xd7\x00\xfd\x00\xca\xff\xd7\x00\xfd\x00\xcc\xff\xd7\x00\ +\xfd\x00\xce\xff\xd7\x00\xfd\x00\xde\xff\xd7\x00\xfd\x00\xe0\xff\ +\xd7\x00\xfd\x00\xe2\xff\xd7\x00\xfd\x00\xe4\xff\xd7\x00\xfd\x01\ +\x0e\xff\xd7\x00\xfd\x01\x10\xff\xd7\x00\xfd\x01\x12\xff\xd7\x00\ +\xfd\x01\x14\xff\xd7\x00\xfd\x01$\xff\xd7\x00\xfd\x01&\xff\ +\xd7\x00\xfd\x01*\xff\xec\x00\xfd\x01,\xff\xec\x00\xfd\x01\ +.\xff\xec\x00\xfd\x010\xff\xec\x00\xfd\x012\xff\xec\x00\ +\xfd\x014\xff\xec\x00\xfd\x016\xff\xd7\x00\xfd\x018\xff\ +\xc3\x00\xfd\x01:\xff\xc3\x00\xfd\x01G\xff\xd7\x00\xfd\x01\ +\xfa\xff\xd7\x00\xfd\x01\xfc\xff\xd7\x00\xfd\x01\xfe\xff\xd7\x00\ +\xfd\x02\x00\xff\xc3\x00\xfd\x02\x07\xff\x5c\x00\xfd\x02\x0b\xff\ +\x5c\x00\xfd\x02_\xff\xd7\x00\xfd\x02a\xff\xec\x00\xfd\x03\ +I\xff\xd7\x00\xfd\x03K\xff\xd7\x00\xfd\x03M\xff\xd7\x00\ +\xfd\x03O\xff\xd7\x00\xfd\x03Q\xff\xd7\x00\xfd\x03S\xff\ +\xd7\x00\xfd\x03U\xff\xd7\x00\xfd\x03W\xff\xd7\x00\xfd\x03\ +Y\xff\xd7\x00\xfd\x03[\xff\xd7\x00\xfd\x03]\xff\xd7\x00\ +\xfd\x03_\xff\xd7\x00\xfd\x03a\xff\xec\x00\xfd\x03c\xff\ +\xec\x00\xfd\x03e\xff\xec\x00\xfd\x03g\xff\xec\x00\xfd\x03\ +i\xff\xec\x00\xfd\x03k\xff\xec\x00\xfd\x03m\xff\xec\x00\ +\xfd\x03o\xff\xc3\x00\xfd\x03q\xff\xc3\x00\xfd\x03s\xff\ +\xc3\x00\xfd\x03\x8f\xff\xd7\x00\xff\x00\x05\xff\x5c\x00\xff\x00\ +\x0a\xff\x5c\x00\xff\x00&\xff\xd7\x00\xff\x00*\xff\xd7\x00\ +\xff\x002\xff\xd7\x00\xff\x004\xff\xd7\x00\xff\x007\xff\ +\xd7\x00\xff\x008\xff\xec\x00\xff\x009\xff\xd7\x00\xff\x00\ +:\xff\xd7\x00\xff\x00<\xff\xc3\x00\xff\x00\x89\xff\xd7\x00\ +\xff\x00\x94\xff\xd7\x00\xff\x00\x95\xff\xd7\x00\xff\x00\x96\xff\ +\xd7\x00\xff\x00\x97\xff\xd7\x00\xff\x00\x98\xff\xd7\x00\xff\x00\ +\x9a\xff\xd7\x00\xff\x00\x9b\xff\xec\x00\xff\x00\x9c\xff\xec\x00\ +\xff\x00\x9d\xff\xec\x00\xff\x00\x9e\xff\xec\x00\xff\x00\x9f\xff\ +\xc3\x00\xff\x00\xc8\xff\xd7\x00\xff\x00\xca\xff\xd7\x00\xff\x00\ +\xcc\xff\xd7\x00\xff\x00\xce\xff\xd7\x00\xff\x00\xde\xff\xd7\x00\ +\xff\x00\xe0\xff\xd7\x00\xff\x00\xe2\xff\xd7\x00\xff\x00\xe4\xff\ +\xd7\x00\xff\x01\x0e\xff\xd7\x00\xff\x01\x10\xff\xd7\x00\xff\x01\ +\x12\xff\xd7\x00\xff\x01\x14\xff\xd7\x00\xff\x01$\xff\xd7\x00\ +\xff\x01&\xff\xd7\x00\xff\x01*\xff\xec\x00\xff\x01,\xff\ +\xec\x00\xff\x01.\xff\xec\x00\xff\x010\xff\xec\x00\xff\x01\ +2\xff\xec\x00\xff\x014\xff\xec\x00\xff\x016\xff\xd7\x00\ +\xff\x018\xff\xc3\x00\xff\x01:\xff\xc3\x00\xff\x01G\xff\ +\xd7\x00\xff\x01\xfa\xff\xd7\x00\xff\x01\xfc\xff\xd7\x00\xff\x01\ +\xfe\xff\xd7\x00\xff\x02\x00\xff\xc3\x00\xff\x02\x07\xff\x5c\x00\ +\xff\x02\x0b\xff\x5c\x00\xff\x02_\xff\xd7\x00\xff\x02a\xff\ +\xec\x00\xff\x03I\xff\xd7\x00\xff\x03K\xff\xd7\x00\xff\x03\ +M\xff\xd7\x00\xff\x03O\xff\xd7\x00\xff\x03Q\xff\xd7\x00\ +\xff\x03S\xff\xd7\x00\xff\x03U\xff\xd7\x00\xff\x03W\xff\ +\xd7\x00\xff\x03Y\xff\xd7\x00\xff\x03[\xff\xd7\x00\xff\x03\ +]\xff\xd7\x00\xff\x03_\xff\xd7\x00\xff\x03a\xff\xec\x00\ +\xff\x03c\xff\xec\x00\xff\x03e\xff\xec\x00\xff\x03g\xff\ +\xec\x00\xff\x03i\xff\xec\x00\xff\x03k\xff\xec\x00\xff\x03\ +m\xff\xec\x00\xff\x03o\xff\xc3\x00\xff\x03q\xff\xc3\x00\ +\xff\x03s\xff\xc3\x00\xff\x03\x8f\xff\xd7\x01\x00\x00\x05\x00\ +R\x01\x00\x00\x0a\x00R\x01\x00\x00\x0c\x00\x8f\x01\x00\x00\ +\x22\x00\x8f\x01\x00\x00@\x00\x8f\x01\x00\x00E\x00=\x01\ +\x00\x00K\x00=\x01\x00\x00N\x00=\x01\x00\x00O\x00\ +=\x01\x00\x00`\x00\x8f\x01\x00\x00\xe7\x00=\x01\x00\x00\ +\xe9\x00\x8f\x01\x00\x02\x07\x00R\x01\x00\x02\x0b\x00R\x01\ +\x01\x00\x05\xff\x5c\x01\x01\x00\x0a\xff\x5c\x01\x01\x00&\xff\ +\xd7\x01\x01\x00*\xff\xd7\x01\x01\x002\xff\xd7\x01\x01\x00\ +4\xff\xd7\x01\x01\x007\xff\xd7\x01\x01\x008\xff\xec\x01\ +\x01\x009\xff\xd7\x01\x01\x00:\xff\xd7\x01\x01\x00<\xff\ +\xc3\x01\x01\x00\x89\xff\xd7\x01\x01\x00\x94\xff\xd7\x01\x01\x00\ +\x95\xff\xd7\x01\x01\x00\x96\xff\xd7\x01\x01\x00\x97\xff\xd7\x01\ +\x01\x00\x98\xff\xd7\x01\x01\x00\x9a\xff\xd7\x01\x01\x00\x9b\xff\ +\xec\x01\x01\x00\x9c\xff\xec\x01\x01\x00\x9d\xff\xec\x01\x01\x00\ +\x9e\xff\xec\x01\x01\x00\x9f\xff\xc3\x01\x01\x00\xc8\xff\xd7\x01\ +\x01\x00\xca\xff\xd7\x01\x01\x00\xcc\xff\xd7\x01\x01\x00\xce\xff\ +\xd7\x01\x01\x00\xde\xff\xd7\x01\x01\x00\xe0\xff\xd7\x01\x01\x00\ +\xe2\xff\xd7\x01\x01\x00\xe4\xff\xd7\x01\x01\x01\x0e\xff\xd7\x01\ +\x01\x01\x10\xff\xd7\x01\x01\x01\x12\xff\xd7\x01\x01\x01\x14\xff\ +\xd7\x01\x01\x01$\xff\xd7\x01\x01\x01&\xff\xd7\x01\x01\x01\ +*\xff\xec\x01\x01\x01,\xff\xec\x01\x01\x01.\xff\xec\x01\ +\x01\x010\xff\xec\x01\x01\x012\xff\xec\x01\x01\x014\xff\ +\xec\x01\x01\x016\xff\xd7\x01\x01\x018\xff\xc3\x01\x01\x01\ +:\xff\xc3\x01\x01\x01G\xff\xd7\x01\x01\x01\xfa\xff\xd7\x01\ +\x01\x01\xfc\xff\xd7\x01\x01\x01\xfe\xff\xd7\x01\x01\x02\x00\xff\ +\xc3\x01\x01\x02\x07\xff\x5c\x01\x01\x02\x0b\xff\x5c\x01\x01\x02\ +_\xff\xd7\x01\x01\x02a\xff\xec\x01\x01\x03I\xff\xd7\x01\ +\x01\x03K\xff\xd7\x01\x01\x03M\xff\xd7\x01\x01\x03O\xff\ +\xd7\x01\x01\x03Q\xff\xd7\x01\x01\x03S\xff\xd7\x01\x01\x03\ +U\xff\xd7\x01\x01\x03W\xff\xd7\x01\x01\x03Y\xff\xd7\x01\ +\x01\x03[\xff\xd7\x01\x01\x03]\xff\xd7\x01\x01\x03_\xff\ +\xd7\x01\x01\x03a\xff\xec\x01\x01\x03c\xff\xec\x01\x01\x03\ +e\xff\xec\x01\x01\x03g\xff\xec\x01\x01\x03i\xff\xec\x01\ +\x01\x03k\xff\xec\x01\x01\x03m\xff\xec\x01\x01\x03o\xff\ +\xc3\x01\x01\x03q\xff\xc3\x01\x01\x03s\xff\xc3\x01\x01\x03\ +\x8f\xff\xd7\x01\x03\x00\x05\xff\x5c\x01\x03\x00\x0a\xff\x5c\x01\ +\x03\x00&\xff\xd7\x01\x03\x00*\xff\xd7\x01\x03\x002\xff\ +\xd7\x01\x03\x004\xff\xd7\x01\x03\x007\xff\xd7\x01\x03\x00\ +8\xff\xec\x01\x03\x009\xff\xd7\x01\x03\x00:\xff\xd7\x01\ +\x03\x00<\xff\xc3\x01\x03\x00\x89\xff\xd7\x01\x03\x00\x94\xff\ +\xd7\x01\x03\x00\x95\xff\xd7\x01\x03\x00\x96\xff\xd7\x01\x03\x00\ +\x97\xff\xd7\x01\x03\x00\x98\xff\xd7\x01\x03\x00\x9a\xff\xd7\x01\ +\x03\x00\x9b\xff\xec\x01\x03\x00\x9c\xff\xec\x01\x03\x00\x9d\xff\ +\xec\x01\x03\x00\x9e\xff\xec\x01\x03\x00\x9f\xff\xc3\x01\x03\x00\ +\xc8\xff\xd7\x01\x03\x00\xca\xff\xd7\x01\x03\x00\xcc\xff\xd7\x01\ +\x03\x00\xce\xff\xd7\x01\x03\x00\xde\xff\xd7\x01\x03\x00\xe0\xff\ +\xd7\x01\x03\x00\xe2\xff\xd7\x01\x03\x00\xe4\xff\xd7\x01\x03\x01\ +\x0e\xff\xd7\x01\x03\x01\x10\xff\xd7\x01\x03\x01\x12\xff\xd7\x01\ +\x03\x01\x14\xff\xd7\x01\x03\x01$\xff\xd7\x01\x03\x01&\xff\ +\xd7\x01\x03\x01*\xff\xec\x01\x03\x01,\xff\xec\x01\x03\x01\ +.\xff\xec\x01\x03\x010\xff\xec\x01\x03\x012\xff\xec\x01\ +\x03\x014\xff\xec\x01\x03\x016\xff\xd7\x01\x03\x018\xff\ +\xc3\x01\x03\x01:\xff\xc3\x01\x03\x01G\xff\xd7\x01\x03\x01\ +\xfa\xff\xd7\x01\x03\x01\xfc\xff\xd7\x01\x03\x01\xfe\xff\xd7\x01\ +\x03\x02\x00\xff\xc3\x01\x03\x02\x07\xff\x5c\x01\x03\x02\x0b\xff\ +\x5c\x01\x03\x02_\xff\xd7\x01\x03\x02a\xff\xec\x01\x03\x03\ +I\xff\xd7\x01\x03\x03K\xff\xd7\x01\x03\x03M\xff\xd7\x01\ +\x03\x03O\xff\xd7\x01\x03\x03Q\xff\xd7\x01\x03\x03S\xff\ +\xd7\x01\x03\x03U\xff\xd7\x01\x03\x03W\xff\xd7\x01\x03\x03\ +Y\xff\xd7\x01\x03\x03[\xff\xd7\x01\x03\x03]\xff\xd7\x01\ +\x03\x03_\xff\xd7\x01\x03\x03a\xff\xec\x01\x03\x03c\xff\ +\xec\x01\x03\x03e\xff\xec\x01\x03\x03g\xff\xec\x01\x03\x03\ +i\xff\xec\x01\x03\x03k\xff\xec\x01\x03\x03m\xff\xec\x01\ +\x03\x03o\xff\xc3\x01\x03\x03q\xff\xc3\x01\x03\x03s\xff\ +\xc3\x01\x03\x03\x8f\xff\xd7\x01\x08\x00\x05\xff\xec\x01\x08\x00\ +\x0a\xff\xec\x01\x08\x02\x07\xff\xec\x01\x08\x02\x0b\xff\xec\x01\ +\x0e\x00\x0f\xff\xae\x01\x0e\x00\x11\xff\xae\x01\x0e\x00$\xff\ +\xd7\x01\x0e\x007\xff\xc3\x01\x0e\x009\xff\xec\x01\x0e\x00\ +:\xff\xec\x01\x0e\x00;\xff\xd7\x01\x0e\x00<\xff\xec\x01\ +\x0e\x00=\xff\xec\x01\x0e\x00\x82\xff\xd7\x01\x0e\x00\x83\xff\ +\xd7\x01\x0e\x00\x84\xff\xd7\x01\x0e\x00\x85\xff\xd7\x01\x0e\x00\ +\x86\xff\xd7\x01\x0e\x00\x87\xff\xd7\x01\x0e\x00\x9f\xff\xec\x01\ +\x0e\x00\xc2\xff\xd7\x01\x0e\x00\xc4\xff\xd7\x01\x0e\x00\xc6\xff\ +\xd7\x01\x0e\x01$\xff\xc3\x01\x0e\x01&\xff\xc3\x01\x0e\x01\ +6\xff\xec\x01\x0e\x018\xff\xec\x01\x0e\x01:\xff\xec\x01\ +\x0e\x01;\xff\xec\x01\x0e\x01=\xff\xec\x01\x0e\x01?\xff\ +\xec\x01\x0e\x01C\xff\xd7\x01\x0e\x01\xa0\xff\xec\x01\x0e\x01\ +\xfa\xff\xec\x01\x0e\x01\xfc\xff\xec\x01\x0e\x01\xfe\xff\xec\x01\ +\x0e\x02\x00\xff\xec\x01\x0e\x02\x08\xff\xae\x01\x0e\x02\x0c\xff\ +\xae\x01\x0e\x02X\xff\xd7\x01\x0e\x03\x1d\xff\xd7\x01\x0e\x03\ +\x1f\xff\xd7\x01\x0e\x03!\xff\xd7\x01\x0e\x03#\xff\xd7\x01\ +\x0e\x03%\xff\xd7\x01\x0e\x03'\xff\xd7\x01\x0e\x03)\xff\ +\xd7\x01\x0e\x03+\xff\xd7\x01\x0e\x03-\xff\xd7\x01\x0e\x03\ +/\xff\xd7\x01\x0e\x031\xff\xd7\x01\x0e\x033\xff\xd7\x01\ +\x0e\x03o\xff\xec\x01\x0e\x03q\xff\xec\x01\x0e\x03s\xff\ +\xec\x01\x0e\x03\x8f\xff\xc3\x01\x10\x00\x0f\xff\xae\x01\x10\x00\ +\x11\xff\xae\x01\x10\x00$\xff\xd7\x01\x10\x007\xff\xc3\x01\ +\x10\x009\xff\xec\x01\x10\x00:\xff\xec\x01\x10\x00;\xff\ +\xd7\x01\x10\x00<\xff\xec\x01\x10\x00=\xff\xec\x01\x10\x00\ +\x82\xff\xd7\x01\x10\x00\x83\xff\xd7\x01\x10\x00\x84\xff\xd7\x01\ +\x10\x00\x85\xff\xd7\x01\x10\x00\x86\xff\xd7\x01\x10\x00\x87\xff\ +\xd7\x01\x10\x00\x9f\xff\xec\x01\x10\x00\xc2\xff\xd7\x01\x10\x00\ +\xc4\xff\xd7\x01\x10\x00\xc6\xff\xd7\x01\x10\x01$\xff\xc3\x01\ +\x10\x01&\xff\xc3\x01\x10\x016\xff\xec\x01\x10\x018\xff\ +\xec\x01\x10\x01:\xff\xec\x01\x10\x01;\xff\xec\x01\x10\x01\ +=\xff\xec\x01\x10\x01?\xff\xec\x01\x10\x01C\xff\xd7\x01\ +\x10\x01\xa0\xff\xec\x01\x10\x01\xfa\xff\xec\x01\x10\x01\xfc\xff\ +\xec\x01\x10\x01\xfe\xff\xec\x01\x10\x02\x00\xff\xec\x01\x10\x02\ +\x08\xff\xae\x01\x10\x02\x0c\xff\xae\x01\x10\x02X\xff\xd7\x01\ +\x10\x03\x1d\xff\xd7\x01\x10\x03\x1f\xff\xd7\x01\x10\x03!\xff\ +\xd7\x01\x10\x03#\xff\xd7\x01\x10\x03%\xff\xd7\x01\x10\x03\ +'\xff\xd7\x01\x10\x03)\xff\xd7\x01\x10\x03+\xff\xd7\x01\ +\x10\x03-\xff\xd7\x01\x10\x03/\xff\xd7\x01\x10\x031\xff\ +\xd7\x01\x10\x033\xff\xd7\x01\x10\x03o\xff\xec\x01\x10\x03\ +q\xff\xec\x01\x10\x03s\xff\xec\x01\x10\x03\x8f\xff\xc3\x01\ +\x12\x00\x0f\xff\xae\x01\x12\x00\x11\xff\xae\x01\x12\x00$\xff\ +\xd7\x01\x12\x007\xff\xc3\x01\x12\x009\xff\xec\x01\x12\x00\ +:\xff\xec\x01\x12\x00;\xff\xd7\x01\x12\x00<\xff\xec\x01\ +\x12\x00=\xff\xec\x01\x12\x00\x82\xff\xd7\x01\x12\x00\x83\xff\ +\xd7\x01\x12\x00\x84\xff\xd7\x01\x12\x00\x85\xff\xd7\x01\x12\x00\ +\x86\xff\xd7\x01\x12\x00\x87\xff\xd7\x01\x12\x00\x9f\xff\xec\x01\ +\x12\x00\xc2\xff\xd7\x01\x12\x00\xc4\xff\xd7\x01\x12\x00\xc6\xff\ +\xd7\x01\x12\x01$\xff\xc3\x01\x12\x01&\xff\xc3\x01\x12\x01\ +6\xff\xec\x01\x12\x018\xff\xec\x01\x12\x01:\xff\xec\x01\ +\x12\x01;\xff\xec\x01\x12\x01=\xff\xec\x01\x12\x01?\xff\ +\xec\x01\x12\x01C\xff\xd7\x01\x12\x01\xa0\xff\xec\x01\x12\x01\ +\xfa\xff\xec\x01\x12\x01\xfc\xff\xec\x01\x12\x01\xfe\xff\xec\x01\ +\x12\x02\x00\xff\xec\x01\x12\x02\x08\xff\xae\x01\x12\x02\x0c\xff\ +\xae\x01\x12\x02X\xff\xd7\x01\x12\x03\x1d\xff\xd7\x01\x12\x03\ +\x1f\xff\xd7\x01\x12\x03!\xff\xd7\x01\x12\x03#\xff\xd7\x01\ +\x12\x03%\xff\xd7\x01\x12\x03'\xff\xd7\x01\x12\x03)\xff\ +\xd7\x01\x12\x03+\xff\xd7\x01\x12\x03-\xff\xd7\x01\x12\x03\ +/\xff\xd7\x01\x12\x031\xff\xd7\x01\x12\x033\xff\xd7\x01\ +\x12\x03o\xff\xec\x01\x12\x03q\xff\xec\x01\x12\x03s\xff\ +\xec\x01\x12\x03\x8f\xff\xc3\x01\x14\x00-\x00{\x01\x17\x00\ +\x05\x00R\x01\x17\x00\x0a\x00R\x01\x17\x00D\xff\xd7\x01\ +\x17\x00F\xff\xd7\x01\x17\x00G\xff\xd7\x01\x17\x00H\xff\ +\xd7\x01\x17\x00J\xff\xec\x01\x17\x00R\xff\xd7\x01\x17\x00\ +T\xff\xd7\x01\x17\x00\xa2\xff\xd7\x01\x17\x00\xa3\xff\xd7\x01\ +\x17\x00\xa4\xff\xd7\x01\x17\x00\xa5\xff\xd7\x01\x17\x00\xa6\xff\ +\xd7\x01\x17\x00\xa7\xff\xd7\x01\x17\x00\xa8\xff\xd7\x01\x17\x00\ +\xa9\xff\xd7\x01\x17\x00\xaa\xff\xd7\x01\x17\x00\xab\xff\xd7\x01\ +\x17\x00\xac\xff\xd7\x01\x17\x00\xad\xff\xd7\x01\x17\x00\xb4\xff\ +\xd7\x01\x17\x00\xb5\xff\xd7\x01\x17\x00\xb6\xff\xd7\x01\x17\x00\ +\xb7\xff\xd7\x01\x17\x00\xb8\xff\xd7\x01\x17\x00\xba\xff\xd7\x01\ +\x17\x00\xc3\xff\xd7\x01\x17\x00\xc5\xff\xd7\x01\x17\x00\xc7\xff\ +\xd7\x01\x17\x00\xc9\xff\xd7\x01\x17\x00\xcb\xff\xd7\x01\x17\x00\ +\xcd\xff\xd7\x01\x17\x00\xcf\xff\xd7\x01\x17\x00\xd1\xff\xd7\x01\ +\x17\x00\xd3\xff\xd7\x01\x17\x00\xd5\xff\xd7\x01\x17\x00\xd7\xff\ +\xd7\x01\x17\x00\xd9\xff\xd7\x01\x17\x00\xdb\xff\xd7\x01\x17\x00\ +\xdd\xff\xd7\x01\x17\x00\xdf\xff\xec\x01\x17\x00\xe1\xff\xec\x01\ +\x17\x00\xe3\xff\xec\x01\x17\x00\xe5\xff\xec\x01\x17\x01\x0f\xff\ +\xd7\x01\x17\x01\x11\xff\xd7\x01\x17\x01\x13\xff\xd7\x01\x17\x01\ +\x15\xff\xd7\x01\x17\x01D\xff\xd7\x01\x17\x01F\xff\xd7\x01\ +\x17\x01H\xff\xd7\x01\x17\x02\x07\x00R\x01\x17\x02\x0b\x00\ +R\x01\x17\x02Y\xff\xd7\x01\x17\x02`\xff\xd7\x01\x17\x03\ +\x1e\xff\xd7\x01\x17\x03 \xff\xd7\x01\x17\x03\x22\xff\xd7\x01\ +\x17\x03&\xff\xd7\x01\x17\x03(\xff\xd7\x01\x17\x03*\xff\ +\xd7\x01\x17\x03,\xff\xd7\x01\x17\x03.\xff\xd7\x01\x17\x03\ +0\xff\xd7\x01\x17\x032\xff\xd7\x01\x17\x034\xff\xd7\x01\ +\x17\x036\xff\xd7\x01\x17\x038\xff\xd7\x01\x17\x03:\xff\ +\xd7\x01\x17\x03<\xff\xd7\x01\x17\x03@\xff\xd7\x01\x17\x03\ +B\xff\xd7\x01\x17\x03D\xff\xd7\x01\x17\x03J\xff\xd7\x01\ +\x17\x03L\xff\xd7\x01\x17\x03N\xff\xd7\x01\x17\x03R\xff\ +\xd7\x01\x17\x03T\xff\xd7\x01\x17\x03V\xff\xd7\x01\x17\x03\ +X\xff\xd7\x01\x17\x03Z\xff\xd7\x01\x17\x03\x5c\xff\xd7\x01\ +\x17\x03^\xff\xd7\x01\x17\x03`\xff\xd7\x01\x19\x00\x05\x00\ +R\x01\x19\x00\x0a\x00R\x01\x19\x00D\xff\xd7\x01\x19\x00\ +F\xff\xd7\x01\x19\x00G\xff\xd7\x01\x19\x00H\xff\xd7\x01\ +\x19\x00J\xff\xec\x01\x19\x00R\xff\xd7\x01\x19\x00T\xff\ +\xd7\x01\x19\x00\xa2\xff\xd7\x01\x19\x00\xa3\xff\xd7\x01\x19\x00\ +\xa4\xff\xd7\x01\x19\x00\xa5\xff\xd7\x01\x19\x00\xa6\xff\xd7\x01\ +\x19\x00\xa7\xff\xd7\x01\x19\x00\xa8\xff\xd7\x01\x19\x00\xa9\xff\ +\xd7\x01\x19\x00\xaa\xff\xd7\x01\x19\x00\xab\xff\xd7\x01\x19\x00\ +\xac\xff\xd7\x01\x19\x00\xad\xff\xd7\x01\x19\x00\xb4\xff\xd7\x01\ +\x19\x00\xb5\xff\xd7\x01\x19\x00\xb6\xff\xd7\x01\x19\x00\xb7\xff\ +\xd7\x01\x19\x00\xb8\xff\xd7\x01\x19\x00\xba\xff\xd7\x01\x19\x00\ +\xc3\xff\xd7\x01\x19\x00\xc5\xff\xd7\x01\x19\x00\xc7\xff\xd7\x01\ +\x19\x00\xc9\xff\xd7\x01\x19\x00\xcb\xff\xd7\x01\x19\x00\xcd\xff\ +\xd7\x01\x19\x00\xcf\xff\xd7\x01\x19\x00\xd1\xff\xd7\x01\x19\x00\ +\xd3\xff\xd7\x01\x19\x00\xd5\xff\xd7\x01\x19\x00\xd7\xff\xd7\x01\ +\x19\x00\xd9\xff\xd7\x01\x19\x00\xdb\xff\xd7\x01\x19\x00\xdd\xff\ +\xd7\x01\x19\x00\xdf\xff\xec\x01\x19\x00\xe1\xff\xec\x01\x19\x00\ +\xe3\xff\xec\x01\x19\x00\xe5\xff\xec\x01\x19\x01\x0f\xff\xd7\x01\ +\x19\x01\x11\xff\xd7\x01\x19\x01\x13\xff\xd7\x01\x19\x01\x15\xff\ +\xd7\x01\x19\x01D\xff\xd7\x01\x19\x01F\xff\xd7\x01\x19\x01\ +H\xff\xd7\x01\x19\x02\x07\x00R\x01\x19\x02\x0b\x00R\x01\ +\x19\x02Y\xff\xd7\x01\x19\x02`\xff\xd7\x01\x19\x03\x1e\xff\ +\xd7\x01\x19\x03 \xff\xd7\x01\x19\x03\x22\xff\xd7\x01\x19\x03\ +&\xff\xd7\x01\x19\x03(\xff\xd7\x01\x19\x03*\xff\xd7\x01\ +\x19\x03,\xff\xd7\x01\x19\x03.\xff\xd7\x01\x19\x030\xff\ +\xd7\x01\x19\x032\xff\xd7\x01\x19\x034\xff\xd7\x01\x19\x03\ +6\xff\xd7\x01\x19\x038\xff\xd7\x01\x19\x03:\xff\xd7\x01\ +\x19\x03<\xff\xd7\x01\x19\x03@\xff\xd7\x01\x19\x03B\xff\ +\xd7\x01\x19\x03D\xff\xd7\x01\x19\x03J\xff\xd7\x01\x19\x03\ +L\xff\xd7\x01\x19\x03N\xff\xd7\x01\x19\x03R\xff\xd7\x01\ +\x19\x03T\xff\xd7\x01\x19\x03V\xff\xd7\x01\x19\x03X\xff\ +\xd7\x01\x19\x03Z\xff\xd7\x01\x19\x03\x5c\xff\xd7\x01\x19\x03\ +^\xff\xd7\x01\x19\x03`\xff\xd7\x01\x1b\x00\x05\x00R\x01\ +\x1b\x00\x0a\x00R\x01\x1b\x00D\xff\xd7\x01\x1b\x00F\xff\ +\xd7\x01\x1b\x00G\xff\xd7\x01\x1b\x00H\xff\xd7\x01\x1b\x00\ +J\xff\xec\x01\x1b\x00R\xff\xd7\x01\x1b\x00T\xff\xd7\x01\ +\x1b\x00\xa2\xff\xd7\x01\x1b\x00\xa3\xff\xd7\x01\x1b\x00\xa4\xff\ +\xd7\x01\x1b\x00\xa5\xff\xd7\x01\x1b\x00\xa6\xff\xd7\x01\x1b\x00\ +\xa7\xff\xd7\x01\x1b\x00\xa8\xff\xd7\x01\x1b\x00\xa9\xff\xd7\x01\ +\x1b\x00\xaa\xff\xd7\x01\x1b\x00\xab\xff\xd7\x01\x1b\x00\xac\xff\ +\xd7\x01\x1b\x00\xad\xff\xd7\x01\x1b\x00\xb4\xff\xd7\x01\x1b\x00\ +\xb5\xff\xd7\x01\x1b\x00\xb6\xff\xd7\x01\x1b\x00\xb7\xff\xd7\x01\ +\x1b\x00\xb8\xff\xd7\x01\x1b\x00\xba\xff\xd7\x01\x1b\x00\xc3\xff\ +\xd7\x01\x1b\x00\xc5\xff\xd7\x01\x1b\x00\xc7\xff\xd7\x01\x1b\x00\ +\xc9\xff\xd7\x01\x1b\x00\xcb\xff\xd7\x01\x1b\x00\xcd\xff\xd7\x01\ +\x1b\x00\xcf\xff\xd7\x01\x1b\x00\xd1\xff\xd7\x01\x1b\x00\xd3\xff\ +\xd7\x01\x1b\x00\xd5\xff\xd7\x01\x1b\x00\xd7\xff\xd7\x01\x1b\x00\ +\xd9\xff\xd7\x01\x1b\x00\xdb\xff\xd7\x01\x1b\x00\xdd\xff\xd7\x01\ +\x1b\x00\xdf\xff\xec\x01\x1b\x00\xe1\xff\xec\x01\x1b\x00\xe3\xff\ +\xec\x01\x1b\x00\xe5\xff\xec\x01\x1b\x01\x0f\xff\xd7\x01\x1b\x01\ +\x11\xff\xd7\x01\x1b\x01\x13\xff\xd7\x01\x1b\x01\x15\xff\xd7\x01\ +\x1b\x01D\xff\xd7\x01\x1b\x01F\xff\xd7\x01\x1b\x01H\xff\ +\xd7\x01\x1b\x02\x07\x00R\x01\x1b\x02\x0b\x00R\x01\x1b\x02\ +Y\xff\xd7\x01\x1b\x02`\xff\xd7\x01\x1b\x03\x1e\xff\xd7\x01\ +\x1b\x03 \xff\xd7\x01\x1b\x03\x22\xff\xd7\x01\x1b\x03&\xff\ +\xd7\x01\x1b\x03(\xff\xd7\x01\x1b\x03*\xff\xd7\x01\x1b\x03\ +,\xff\xd7\x01\x1b\x03.\xff\xd7\x01\x1b\x030\xff\xd7\x01\ +\x1b\x032\xff\xd7\x01\x1b\x034\xff\xd7\x01\x1b\x036\xff\ +\xd7\x01\x1b\x038\xff\xd7\x01\x1b\x03:\xff\xd7\x01\x1b\x03\ +<\xff\xd7\x01\x1b\x03@\xff\xd7\x01\x1b\x03B\xff\xd7\x01\ +\x1b\x03D\xff\xd7\x01\x1b\x03J\xff\xd7\x01\x1b\x03L\xff\ +\xd7\x01\x1b\x03N\xff\xd7\x01\x1b\x03R\xff\xd7\x01\x1b\x03\ +T\xff\xd7\x01\x1b\x03V\xff\xd7\x01\x1b\x03X\xff\xd7\x01\ +\x1b\x03Z\xff\xd7\x01\x1b\x03\x5c\xff\xd7\x01\x1b\x03^\xff\ +\xd7\x01\x1b\x03`\xff\xd7\x01$\x00\x0f\xff\x85\x01$\x00\ +\x10\xff\xae\x01$\x00\x11\xff\x85\x01$\x00\x22\x00)\x01\ +$\x00$\xffq\x01$\x00&\xff\xd7\x01$\x00*\xff\ +\xd7\x01$\x002\xff\xd7\x01$\x004\xff\xd7\x01$\x00\ +7\x00)\x01$\x00D\xff\x5c\x01$\x00F\xffq\x01\ +$\x00G\xffq\x01$\x00H\xffq\x01$\x00J\xff\ +q\x01$\x00P\xff\x9a\x01$\x00Q\xff\x9a\x01$\x00\ +R\xffq\x01$\x00S\xff\x9a\x01$\x00T\xffq\x01\ +$\x00U\xff\x9a\x01$\x00V\xff\x85\x01$\x00X\xff\ +\x9a\x01$\x00Y\xff\xd7\x01$\x00Z\xff\xd7\x01$\x00\ +[\xff\xd7\x01$\x00\x5c\xff\xd7\x01$\x00]\xff\xae\x01\ +$\x00\x82\xffq\x01$\x00\x83\xffq\x01$\x00\x84\xff\ +q\x01$\x00\x85\xffq\x01$\x00\x86\xffq\x01$\x00\ +\x87\xffq\x01$\x00\x89\xff\xd7\x01$\x00\x94\xff\xd7\x01\ +$\x00\x95\xff\xd7\x01$\x00\x96\xff\xd7\x01$\x00\x97\xff\ +\xd7\x01$\x00\x98\xff\xd7\x01$\x00\x9a\xff\xd7\x01$\x00\ +\xa2\xffq\x01$\x00\xa3\xff\x5c\x01$\x00\xa4\xff\x5c\x01\ +$\x00\xa5\xff\x5c\x01$\x00\xa6\xff\x5c\x01$\x00\xa7\xff\ +\x5c\x01$\x00\xa8\xff\x5c\x01$\x00\xa9\xffq\x01$\x00\ +\xaa\xffq\x01$\x00\xab\xffq\x01$\x00\xac\xffq\x01\ +$\x00\xad\xffq\x01$\x00\xb4\xffq\x01$\x00\xb5\xff\ +q\x01$\x00\xb6\xffq\x01$\x00\xb7\xffq\x01$\x00\ +\xb8\xffq\x01$\x00\xba\xffq\x01$\x00\xbb\xff\x9a\x01\ +$\x00\xbc\xff\x9a\x01$\x00\xbd\xff\x9a\x01$\x00\xbe\xff\ +\x9a\x01$\x00\xbf\xff\xd7\x01$\x00\xc2\xffq\x01$\x00\ +\xc3\xff\x5c\x01$\x00\xc4\xffq\x01$\x00\xc5\xff\x5c\x01\ +$\x00\xc6\xffq\x01$\x00\xc7\xff\x5c\x01$\x00\xc8\xff\ +\xd7\x01$\x00\xc9\xffq\x01$\x00\xca\xff\xd7\x01$\x00\ +\xcb\xffq\x01$\x00\xcc\xff\xd7\x01$\x00\xcd\xffq\x01\ +$\x00\xce\xff\xd7\x01$\x00\xcf\xffq\x01$\x00\xd1\xff\ +q\x01$\x00\xd3\xffq\x01$\x00\xd5\xffq\x01$\x00\ +\xd7\xffq\x01$\x00\xd9\xffq\x01$\x00\xdb\xffq\x01\ +$\x00\xdd\xffq\x01$\x00\xde\xff\xd7\x01$\x00\xdf\xff\ +q\x01$\x00\xe0\xff\xd7\x01$\x00\xe1\xffq\x01$\x00\ +\xe2\xff\xd7\x01$\x00\xe3\xffq\x01$\x00\xe4\xff\xd7\x01\ +$\x00\xe5\xffq\x01$\x00\xfa\xff\x9a\x01$\x01\x06\xff\ +\x9a\x01$\x01\x08\xff\x9a\x01$\x01\x0d\xff\x9a\x01$\x01\ +\x0e\xff\xd7\x01$\x01\x0f\xffq\x01$\x01\x10\xff\xd7\x01\ +$\x01\x11\xffq\x01$\x01\x12\xff\xd7\x01$\x01\x13\xff\ +q\x01$\x01\x14\xff\xd7\x01$\x01\x15\xffq\x01$\x01\ +\x17\xff\x9a\x01$\x01\x19\xff\x9a\x01$\x01\x1d\xff\x85\x01\ +$\x01!\xff\x85\x01$\x01$\x00)\x01$\x01&\x00\ +)\x01$\x01+\xff\x9a\x01$\x01-\xff\x9a\x01$\x01\ +/\xff\x9a\x01$\x011\xff\x9a\x01$\x013\xff\x9a\x01\ +$\x015\xff\x9a\x01$\x017\xff\xd7\x01$\x01<\xff\ +\xae\x01$\x01>\xff\xae\x01$\x01@\xff\xae\x01$\x01\ +C\xffq\x01$\x01D\xff\x5c\x01$\x01F\xff\x5c\x01\ +$\x01G\xff\xd7\x01$\x01H\xffq\x01$\x01J\xff\ +\x85\x01$\x01\xfb\xff\xd7\x01$\x01\xfd\xff\xd7\x01$\x02\ +\x02\xff\xae\x01$\x02\x03\xff\xae\x01$\x02\x04\xff\xae\x01\ +$\x02\x08\xff\x85\x01$\x02\x0c\xff\x85\x01$\x02W\xff\ +\x9a\x01$\x02X\xffq\x01$\x02Y\xff\x5c\x01$\x02\ +_\xff\xd7\x01$\x02`\xffq\x01$\x02b\xff\x9a\x01\ +$\x03\x1d\xffq\x01$\x03\x1e\xff\x5c\x01$\x03\x1f\xff\ +q\x01$\x03 \xff\x5c\x01$\x03!\xffq\x01$\x03\ +\x22\xff\x5c\x01$\x03#\xffq\x01$\x03%\xffq\x01\ +$\x03&\xff\x5c\x01$\x03'\xffq\x01$\x03(\xff\ +\x5c\x01$\x03)\xffq\x01$\x03*\xff\x5c\x01$\x03\ ++\xffq\x01$\x03,\xff\x5c\x01$\x03-\xffq\x01\ +$\x03.\xff\x5c\x01$\x03/\xffq\x01$\x030\xff\ +\x5c\x01$\x031\xffq\x01$\x032\xff\x5c\x01$\x03\ +3\xffq\x01$\x034\xff\x5c\x01$\x036\xffq\x01\ +$\x038\xffq\x01$\x03:\xffq\x01$\x03<\xff\ +q\x01$\x03@\xffq\x01$\x03B\xffq\x01$\x03\ +D\xffq\x01$\x03I\xff\xd7\x01$\x03J\xffq\x01\ +$\x03K\xff\xd7\x01$\x03L\xffq\x01$\x03M\xff\ +\xd7\x01$\x03N\xffq\x01$\x03O\xff\xd7\x01$\x03\ +Q\xff\xd7\x01$\x03R\xffq\x01$\x03S\xff\xd7\x01\ +$\x03T\xffq\x01$\x03U\xff\xd7\x01$\x03V\xff\ +q\x01$\x03W\xff\xd7\x01$\x03X\xffq\x01$\x03\ +Y\xff\xd7\x01$\x03Z\xffq\x01$\x03[\xff\xd7\x01\ +$\x03\x5c\xffq\x01$\x03]\xff\xd7\x01$\x03^\xff\ +q\x01$\x03_\xff\xd7\x01$\x03`\xffq\x01$\x03\ +b\xff\x9a\x01$\x03d\xff\x9a\x01$\x03f\xff\x9a\x01\ +$\x03h\xff\x9a\x01$\x03j\xff\x9a\x01$\x03l\xff\ +\x9a\x01$\x03n\xff\x9a\x01$\x03p\xff\xd7\x01$\x03\ +\x8f\x00)\x01%\x00\x05\x00)\x01%\x00\x0a\x00)\x01\ +%\x02\x07\x00)\x01%\x02\x0b\x00)\x01&\x00\x0f\xff\ +\x85\x01&\x00\x10\xff\xae\x01&\x00\x11\xff\x85\x01&\x00\ +\x22\x00)\x01&\x00$\xffq\x01&\x00&\xff\xd7\x01\ +&\x00*\xff\xd7\x01&\x002\xff\xd7\x01&\x004\xff\ +\xd7\x01&\x007\x00)\x01&\x00D\xff\x5c\x01&\x00\ +F\xffq\x01&\x00G\xffq\x01&\x00H\xffq\x01\ +&\x00J\xffq\x01&\x00P\xff\x9a\x01&\x00Q\xff\ +\x9a\x01&\x00R\xffq\x01&\x00S\xff\x9a\x01&\x00\ +T\xffq\x01&\x00U\xff\x9a\x01&\x00V\xff\x85\x01\ +&\x00X\xff\x9a\x01&\x00Y\xff\xd7\x01&\x00Z\xff\ +\xd7\x01&\x00[\xff\xd7\x01&\x00\x5c\xff\xd7\x01&\x00\ +]\xff\xae\x01&\x00\x82\xffq\x01&\x00\x83\xffq\x01\ +&\x00\x84\xffq\x01&\x00\x85\xffq\x01&\x00\x86\xff\ +q\x01&\x00\x87\xffq\x01&\x00\x89\xff\xd7\x01&\x00\ +\x94\xff\xd7\x01&\x00\x95\xff\xd7\x01&\x00\x96\xff\xd7\x01\ +&\x00\x97\xff\xd7\x01&\x00\x98\xff\xd7\x01&\x00\x9a\xff\ +\xd7\x01&\x00\xa2\xffq\x01&\x00\xa3\xff\x5c\x01&\x00\ +\xa4\xff\x5c\x01&\x00\xa5\xff\x5c\x01&\x00\xa6\xff\x5c\x01\ +&\x00\xa7\xff\x5c\x01&\x00\xa8\xff\x5c\x01&\x00\xa9\xff\ +q\x01&\x00\xaa\xffq\x01&\x00\xab\xffq\x01&\x00\ +\xac\xffq\x01&\x00\xad\xffq\x01&\x00\xb4\xffq\x01\ +&\x00\xb5\xffq\x01&\x00\xb6\xffq\x01&\x00\xb7\xff\ +q\x01&\x00\xb8\xffq\x01&\x00\xba\xffq\x01&\x00\ +\xbb\xff\x9a\x01&\x00\xbc\xff\x9a\x01&\x00\xbd\xff\x9a\x01\ +&\x00\xbe\xff\x9a\x01&\x00\xbf\xff\xd7\x01&\x00\xc2\xff\ +q\x01&\x00\xc3\xff\x5c\x01&\x00\xc4\xffq\x01&\x00\ +\xc5\xff\x5c\x01&\x00\xc6\xffq\x01&\x00\xc7\xff\x5c\x01\ +&\x00\xc8\xff\xd7\x01&\x00\xc9\xffq\x01&\x00\xca\xff\ +\xd7\x01&\x00\xcb\xffq\x01&\x00\xcc\xff\xd7\x01&\x00\ +\xcd\xffq\x01&\x00\xce\xff\xd7\x01&\x00\xcf\xffq\x01\ +&\x00\xd1\xffq\x01&\x00\xd3\xffq\x01&\x00\xd5\xff\ +q\x01&\x00\xd7\xffq\x01&\x00\xd9\xffq\x01&\x00\ +\xdb\xffq\x01&\x00\xdd\xffq\x01&\x00\xde\xff\xd7\x01\ +&\x00\xdf\xffq\x01&\x00\xe0\xff\xd7\x01&\x00\xe1\xff\ +q\x01&\x00\xe2\xff\xd7\x01&\x00\xe3\xffq\x01&\x00\ +\xe4\xff\xd7\x01&\x00\xe5\xffq\x01&\x00\xfa\xff\x9a\x01\ +&\x01\x06\xff\x9a\x01&\x01\x08\xff\x9a\x01&\x01\x0d\xff\ +\x9a\x01&\x01\x0e\xff\xd7\x01&\x01\x0f\xffq\x01&\x01\ +\x10\xff\xd7\x01&\x01\x11\xffq\x01&\x01\x12\xff\xd7\x01\ +&\x01\x13\xffq\x01&\x01\x14\xff\xd7\x01&\x01\x15\xff\ +q\x01&\x01\x17\xff\x9a\x01&\x01\x19\xff\x9a\x01&\x01\ +\x1d\xff\x85\x01&\x01!\xff\x85\x01&\x01$\x00)\x01\ +&\x01&\x00)\x01&\x01+\xff\x9a\x01&\x01-\xff\ +\x9a\x01&\x01/\xff\x9a\x01&\x011\xff\x9a\x01&\x01\ +3\xff\x9a\x01&\x015\xff\x9a\x01&\x017\xff\xd7\x01\ +&\x01<\xff\xae\x01&\x01>\xff\xae\x01&\x01@\xff\ +\xae\x01&\x01C\xffq\x01&\x01D\xff\x5c\x01&\x01\ +F\xff\x5c\x01&\x01G\xff\xd7\x01&\x01H\xffq\x01\ +&\x01J\xff\x85\x01&\x01\xfb\xff\xd7\x01&\x01\xfd\xff\ +\xd7\x01&\x02\x02\xff\xae\x01&\x02\x03\xff\xae\x01&\x02\ +\x04\xff\xae\x01&\x02\x08\xff\x85\x01&\x02\x0c\xff\x85\x01\ +&\x02W\xff\x9a\x01&\x02X\xffq\x01&\x02Y\xff\ +\x5c\x01&\x02_\xff\xd7\x01&\x02`\xffq\x01&\x02\ +b\xff\x9a\x01&\x03\x1d\xffq\x01&\x03\x1e\xff\x5c\x01\ +&\x03\x1f\xffq\x01&\x03 \xff\x5c\x01&\x03!\xff\ +q\x01&\x03\x22\xff\x5c\x01&\x03#\xffq\x01&\x03\ +%\xffq\x01&\x03&\xff\x5c\x01&\x03'\xffq\x01\ +&\x03(\xff\x5c\x01&\x03)\xffq\x01&\x03*\xff\ +\x5c\x01&\x03+\xffq\x01&\x03,\xff\x5c\x01&\x03\ +-\xffq\x01&\x03.\xff\x5c\x01&\x03/\xffq\x01\ +&\x030\xff\x5c\x01&\x031\xffq\x01&\x032\xff\ +\x5c\x01&\x033\xffq\x01&\x034\xff\x5c\x01&\x03\ +6\xffq\x01&\x038\xffq\x01&\x03:\xffq\x01\ +&\x03<\xffq\x01&\x03@\xffq\x01&\x03B\xff\ +q\x01&\x03D\xffq\x01&\x03I\xff\xd7\x01&\x03\ +J\xffq\x01&\x03K\xff\xd7\x01&\x03L\xffq\x01\ +&\x03M\xff\xd7\x01&\x03N\xffq\x01&\x03O\xff\ +\xd7\x01&\x03Q\xff\xd7\x01&\x03R\xffq\x01&\x03\ +S\xff\xd7\x01&\x03T\xffq\x01&\x03U\xff\xd7\x01\ +&\x03V\xffq\x01&\x03W\xff\xd7\x01&\x03X\xff\ +q\x01&\x03Y\xff\xd7\x01&\x03Z\xffq\x01&\x03\ +[\xff\xd7\x01&\x03\x5c\xffq\x01&\x03]\xff\xd7\x01\ +&\x03^\xffq\x01&\x03_\xff\xd7\x01&\x03`\xff\ +q\x01&\x03b\xff\x9a\x01&\x03d\xff\x9a\x01&\x03\ +f\xff\x9a\x01&\x03h\xff\x9a\x01&\x03j\xff\x9a\x01\ +&\x03l\xff\x9a\x01&\x03n\xff\x9a\x01&\x03p\xff\ +\xd7\x01&\x03\x8f\x00)\x01'\x00\x05\x00)\x01'\x00\ +\x0a\x00)\x01'\x02\x07\x00)\x01'\x02\x0b\x00)\x01\ +(\x00\x0f\xff\x85\x01(\x00\x10\xff\xae\x01(\x00\x11\xff\ +\x85\x01(\x00\x22\x00)\x01(\x00$\xffq\x01(\x00\ +&\xff\xd7\x01(\x00*\xff\xd7\x01(\x002\xff\xd7\x01\ +(\x004\xff\xd7\x01(\x007\x00)\x01(\x00D\xff\ +\x5c\x01(\x00F\xffq\x01(\x00G\xffq\x01(\x00\ +H\xffq\x01(\x00J\xffq\x01(\x00P\xff\x9a\x01\ +(\x00Q\xff\x9a\x01(\x00R\xffq\x01(\x00S\xff\ +\x9a\x01(\x00T\xffq\x01(\x00U\xff\x9a\x01(\x00\ +V\xff\x85\x01(\x00X\xff\x9a\x01(\x00Y\xff\xd7\x01\ +(\x00Z\xff\xd7\x01(\x00[\xff\xd7\x01(\x00\x5c\xff\ +\xd7\x01(\x00]\xff\xae\x01(\x00\x82\xffq\x01(\x00\ +\x83\xffq\x01(\x00\x84\xffq\x01(\x00\x85\xffq\x01\ +(\x00\x86\xffq\x01(\x00\x87\xffq\x01(\x00\x89\xff\ +\xd7\x01(\x00\x94\xff\xd7\x01(\x00\x95\xff\xd7\x01(\x00\ +\x96\xff\xd7\x01(\x00\x97\xff\xd7\x01(\x00\x98\xff\xd7\x01\ +(\x00\x9a\xff\xd7\x01(\x00\xa2\xffq\x01(\x00\xa3\xff\ +\x5c\x01(\x00\xa4\xff\x5c\x01(\x00\xa5\xff\x5c\x01(\x00\ +\xa6\xff\x5c\x01(\x00\xa7\xff\x5c\x01(\x00\xa8\xff\x5c\x01\ +(\x00\xa9\xffq\x01(\x00\xaa\xffq\x01(\x00\xab\xff\ +q\x01(\x00\xac\xffq\x01(\x00\xad\xffq\x01(\x00\ +\xb4\xffq\x01(\x00\xb5\xffq\x01(\x00\xb6\xffq\x01\ +(\x00\xb7\xffq\x01(\x00\xb8\xffq\x01(\x00\xba\xff\ +q\x01(\x00\xbb\xff\x9a\x01(\x00\xbc\xff\x9a\x01(\x00\ +\xbd\xff\x9a\x01(\x00\xbe\xff\x9a\x01(\x00\xbf\xff\xd7\x01\ +(\x00\xc2\xffq\x01(\x00\xc3\xff\x5c\x01(\x00\xc4\xff\ +q\x01(\x00\xc5\xff\x5c\x01(\x00\xc6\xffq\x01(\x00\ +\xc7\xff\x5c\x01(\x00\xc8\xff\xd7\x01(\x00\xc9\xffq\x01\ +(\x00\xca\xff\xd7\x01(\x00\xcb\xffq\x01(\x00\xcc\xff\ +\xd7\x01(\x00\xcd\xffq\x01(\x00\xce\xff\xd7\x01(\x00\ +\xcf\xffq\x01(\x00\xd1\xffq\x01(\x00\xd3\xffq\x01\ +(\x00\xd5\xffq\x01(\x00\xd7\xffq\x01(\x00\xd9\xff\ +q\x01(\x00\xdb\xffq\x01(\x00\xdd\xffq\x01(\x00\ +\xde\xff\xd7\x01(\x00\xdf\xffq\x01(\x00\xe0\xff\xd7\x01\ +(\x00\xe1\xffq\x01(\x00\xe2\xff\xd7\x01(\x00\xe3\xff\ +q\x01(\x00\xe4\xff\xd7\x01(\x00\xe5\xffq\x01(\x00\ +\xfa\xff\x9a\x01(\x01\x06\xff\x9a\x01(\x01\x08\xff\x9a\x01\ +(\x01\x0d\xff\x9a\x01(\x01\x0e\xff\xd7\x01(\x01\x0f\xff\ +q\x01(\x01\x10\xff\xd7\x01(\x01\x11\xffq\x01(\x01\ +\x12\xff\xd7\x01(\x01\x13\xffq\x01(\x01\x14\xff\xd7\x01\ +(\x01\x15\xffq\x01(\x01\x17\xff\x9a\x01(\x01\x19\xff\ +\x9a\x01(\x01\x1d\xff\x85\x01(\x01!\xff\x85\x01(\x01\ +$\x00)\x01(\x01&\x00)\x01(\x01+\xff\x9a\x01\ +(\x01-\xff\x9a\x01(\x01/\xff\x9a\x01(\x011\xff\ +\x9a\x01(\x013\xff\x9a\x01(\x015\xff\x9a\x01(\x01\ +7\xff\xd7\x01(\x01<\xff\xae\x01(\x01>\xff\xae\x01\ +(\x01@\xff\xae\x01(\x01C\xffq\x01(\x01D\xff\ +\x5c\x01(\x01F\xff\x5c\x01(\x01G\xff\xd7\x01(\x01\ +H\xffq\x01(\x01J\xff\x85\x01(\x01\xfb\xff\xd7\x01\ +(\x01\xfd\xff\xd7\x01(\x02\x02\xff\xae\x01(\x02\x03\xff\ +\xae\x01(\x02\x04\xff\xae\x01(\x02\x08\xff\x85\x01(\x02\ +\x0c\xff\x85\x01(\x02W\xff\x9a\x01(\x02X\xffq\x01\ +(\x02Y\xff\x5c\x01(\x02_\xff\xd7\x01(\x02`\xff\ +q\x01(\x02b\xff\x9a\x01(\x03\x1d\xffq\x01(\x03\ +\x1e\xff\x5c\x01(\x03\x1f\xffq\x01(\x03 \xff\x5c\x01\ +(\x03!\xffq\x01(\x03\x22\xff\x5c\x01(\x03#\xff\ +q\x01(\x03%\xffq\x01(\x03&\xff\x5c\x01(\x03\ +'\xffq\x01(\x03(\xff\x5c\x01(\x03)\xffq\x01\ +(\x03*\xff\x5c\x01(\x03+\xffq\x01(\x03,\xff\ +\x5c\x01(\x03-\xffq\x01(\x03.\xff\x5c\x01(\x03\ +/\xffq\x01(\x030\xff\x5c\x01(\x031\xffq\x01\ +(\x032\xff\x5c\x01(\x033\xffq\x01(\x034\xff\ +\x5c\x01(\x036\xffq\x01(\x038\xffq\x01(\x03\ +:\xffq\x01(\x03<\xffq\x01(\x03@\xffq\x01\ +(\x03B\xffq\x01(\x03D\xffq\x01(\x03I\xff\ +\xd7\x01(\x03J\xffq\x01(\x03K\xff\xd7\x01(\x03\ +L\xffq\x01(\x03M\xff\xd7\x01(\x03N\xffq\x01\ +(\x03O\xff\xd7\x01(\x03Q\xff\xd7\x01(\x03R\xff\ +q\x01(\x03S\xff\xd7\x01(\x03T\xffq\x01(\x03\ +U\xff\xd7\x01(\x03V\xffq\x01(\x03W\xff\xd7\x01\ +(\x03X\xffq\x01(\x03Y\xff\xd7\x01(\x03Z\xff\ +q\x01(\x03[\xff\xd7\x01(\x03\x5c\xffq\x01(\x03\ +]\xff\xd7\x01(\x03^\xffq\x01(\x03_\xff\xd7\x01\ +(\x03`\xffq\x01(\x03b\xff\x9a\x01(\x03d\xff\ +\x9a\x01(\x03f\xff\x9a\x01(\x03h\xff\x9a\x01(\x03\ +j\xff\x9a\x01(\x03l\xff\x9a\x01(\x03n\xff\x9a\x01\ +(\x03p\xff\xd7\x01(\x03\x8f\x00)\x01*\x00\x0f\xff\ +\xd7\x01*\x00\x11\xff\xd7\x01*\x00$\xff\xec\x01*\x00\ +\x82\xff\xec\x01*\x00\x83\xff\xec\x01*\x00\x84\xff\xec\x01\ +*\x00\x85\xff\xec\x01*\x00\x86\xff\xec\x01*\x00\x87\xff\ +\xec\x01*\x00\xc2\xff\xec\x01*\x00\xc4\xff\xec\x01*\x00\ +\xc6\xff\xec\x01*\x01C\xff\xec\x01*\x02\x08\xff\xd7\x01\ +*\x02\x0c\xff\xd7\x01*\x02X\xff\xec\x01*\x03\x1d\xff\ +\xec\x01*\x03\x1f\xff\xec\x01*\x03!\xff\xec\x01*\x03\ +#\xff\xec\x01*\x03%\xff\xec\x01*\x03'\xff\xec\x01\ +*\x03)\xff\xec\x01*\x03+\xff\xec\x01*\x03-\xff\ +\xec\x01*\x03/\xff\xec\x01*\x031\xff\xec\x01*\x03\ +3\xff\xec\x01,\x00\x0f\xff\xd7\x01,\x00\x11\xff\xd7\x01\ +,\x00$\xff\xec\x01,\x00\x82\xff\xec\x01,\x00\x83\xff\ +\xec\x01,\x00\x84\xff\xec\x01,\x00\x85\xff\xec\x01,\x00\ +\x86\xff\xec\x01,\x00\x87\xff\xec\x01,\x00\xc2\xff\xec\x01\ +,\x00\xc4\xff\xec\x01,\x00\xc6\xff\xec\x01,\x01C\xff\ +\xec\x01,\x02\x08\xff\xd7\x01,\x02\x0c\xff\xd7\x01,\x02\ +X\xff\xec\x01,\x03\x1d\xff\xec\x01,\x03\x1f\xff\xec\x01\ +,\x03!\xff\xec\x01,\x03#\xff\xec\x01,\x03%\xff\ +\xec\x01,\x03'\xff\xec\x01,\x03)\xff\xec\x01,\x03\ ++\xff\xec\x01,\x03-\xff\xec\x01,\x03/\xff\xec\x01\ +,\x031\xff\xec\x01,\x033\xff\xec\x01.\x00\x0f\xff\ +\xd7\x01.\x00\x11\xff\xd7\x01.\x00$\xff\xec\x01.\x00\ +\x82\xff\xec\x01.\x00\x83\xff\xec\x01.\x00\x84\xff\xec\x01\ +.\x00\x85\xff\xec\x01.\x00\x86\xff\xec\x01.\x00\x87\xff\ +\xec\x01.\x00\xc2\xff\xec\x01.\x00\xc4\xff\xec\x01.\x00\ +\xc6\xff\xec\x01.\x01C\xff\xec\x01.\x02\x08\xff\xd7\x01\ +.\x02\x0c\xff\xd7\x01.\x02X\xff\xec\x01.\x03\x1d\xff\ +\xec\x01.\x03\x1f\xff\xec\x01.\x03!\xff\xec\x01.\x03\ +#\xff\xec\x01.\x03%\xff\xec\x01.\x03'\xff\xec\x01\ +.\x03)\xff\xec\x01.\x03+\xff\xec\x01.\x03-\xff\ +\xec\x01.\x03/\xff\xec\x01.\x031\xff\xec\x01.\x03\ +3\xff\xec\x010\x00\x0f\xff\xd7\x010\x00\x11\xff\xd7\x01\ +0\x00$\xff\xec\x010\x00\x82\xff\xec\x010\x00\x83\xff\ +\xec\x010\x00\x84\xff\xec\x010\x00\x85\xff\xec\x010\x00\ +\x86\xff\xec\x010\x00\x87\xff\xec\x010\x00\xc2\xff\xec\x01\ +0\x00\xc4\xff\xec\x010\x00\xc6\xff\xec\x010\x01C\xff\ +\xec\x010\x02\x08\xff\xd7\x010\x02\x0c\xff\xd7\x010\x02\ +X\xff\xec\x010\x03\x1d\xff\xec\x010\x03\x1f\xff\xec\x01\ +0\x03!\xff\xec\x010\x03#\xff\xec\x010\x03%\xff\ +\xec\x010\x03'\xff\xec\x010\x03)\xff\xec\x010\x03\ ++\xff\xec\x010\x03-\xff\xec\x010\x03/\xff\xec\x01\ +0\x031\xff\xec\x010\x033\xff\xec\x012\x00\x0f\xff\ +\xd7\x012\x00\x11\xff\xd7\x012\x00$\xff\xec\x012\x00\ +\x82\xff\xec\x012\x00\x83\xff\xec\x012\x00\x84\xff\xec\x01\ +2\x00\x85\xff\xec\x012\x00\x86\xff\xec\x012\x00\x87\xff\ +\xec\x012\x00\xc2\xff\xec\x012\x00\xc4\xff\xec\x012\x00\ +\xc6\xff\xec\x012\x01C\xff\xec\x012\x02\x08\xff\xd7\x01\ +2\x02\x0c\xff\xd7\x012\x02X\xff\xec\x012\x03\x1d\xff\ +\xec\x012\x03\x1f\xff\xec\x012\x03!\xff\xec\x012\x03\ +#\xff\xec\x012\x03%\xff\xec\x012\x03'\xff\xec\x01\ +2\x03)\xff\xec\x012\x03+\xff\xec\x012\x03-\xff\ +\xec\x012\x03/\xff\xec\x012\x031\xff\xec\x012\x03\ +3\xff\xec\x014\x00\x0f\xff\xd7\x014\x00\x11\xff\xd7\x01\ +4\x00$\xff\xec\x014\x00\x82\xff\xec\x014\x00\x83\xff\ +\xec\x014\x00\x84\xff\xec\x014\x00\x85\xff\xec\x014\x00\ +\x86\xff\xec\x014\x00\x87\xff\xec\x014\x00\xc2\xff\xec\x01\ +4\x00\xc4\xff\xec\x014\x00\xc6\xff\xec\x014\x01C\xff\ +\xec\x014\x02\x08\xff\xd7\x014\x02\x0c\xff\xd7\x014\x02\ +X\xff\xec\x014\x03\x1d\xff\xec\x014\x03\x1f\xff\xec\x01\ +4\x03!\xff\xec\x014\x03#\xff\xec\x014\x03%\xff\ +\xec\x014\x03'\xff\xec\x014\x03)\xff\xec\x014\x03\ ++\xff\xec\x014\x03-\xff\xec\x014\x03/\xff\xec\x01\ +4\x031\xff\xec\x014\x033\xff\xec\x016\x00\x0f\xff\ +\x9a\x016\x00\x11\xff\x9a\x016\x00\x22\x00)\x016\x00\ +$\xff\xae\x016\x00&\xff\xec\x016\x00*\xff\xec\x01\ +6\x002\xff\xec\x016\x004\xff\xec\x016\x00D\xff\ +\xd7\x016\x00F\xff\xd7\x016\x00G\xff\xd7\x016\x00\ +H\xff\xd7\x016\x00J\xff\xec\x016\x00P\xff\xec\x01\ +6\x00Q\xff\xec\x016\x00R\xff\xd7\x016\x00S\xff\ +\xec\x016\x00T\xff\xd7\x016\x00U\xff\xec\x016\x00\ +V\xff\xec\x016\x00X\xff\xec\x016\x00\x82\xff\xae\x01\ +6\x00\x83\xff\xae\x016\x00\x84\xff\xae\x016\x00\x85\xff\ +\xae\x016\x00\x86\xff\xae\x016\x00\x87\xff\xae\x016\x00\ +\x89\xff\xec\x016\x00\x94\xff\xec\x016\x00\x95\xff\xec\x01\ +6\x00\x96\xff\xec\x016\x00\x97\xff\xec\x016\x00\x98\xff\ +\xec\x016\x00\x9a\xff\xec\x016\x00\xa2\xff\xd7\x016\x00\ +\xa3\xff\xd7\x016\x00\xa4\xff\xd7\x016\x00\xa5\xff\xd7\x01\ +6\x00\xa6\xff\xd7\x016\x00\xa7\xff\xd7\x016\x00\xa8\xff\ +\xd7\x016\x00\xa9\xff\xd7\x016\x00\xaa\xff\xd7\x016\x00\ +\xab\xff\xd7\x016\x00\xac\xff\xd7\x016\x00\xad\xff\xd7\x01\ +6\x00\xb4\xff\xd7\x016\x00\xb5\xff\xd7\x016\x00\xb6\xff\ +\xd7\x016\x00\xb7\xff\xd7\x016\x00\xb8\xff\xd7\x016\x00\ +\xba\xff\xd7\x016\x00\xbb\xff\xec\x016\x00\xbc\xff\xec\x01\ +6\x00\xbd\xff\xec\x016\x00\xbe\xff\xec\x016\x00\xc2\xff\ +\xae\x016\x00\xc3\xff\xd7\x016\x00\xc4\xff\xae\x016\x00\ +\xc5\xff\xd7\x016\x00\xc6\xff\xae\x016\x00\xc7\xff\xd7\x01\ +6\x00\xc8\xff\xec\x016\x00\xc9\xff\xd7\x016\x00\xca\xff\ +\xec\x016\x00\xcb\xff\xd7\x016\x00\xcc\xff\xec\x016\x00\ +\xcd\xff\xd7\x016\x00\xce\xff\xec\x016\x00\xcf\xff\xd7\x01\ +6\x00\xd1\xff\xd7\x016\x00\xd3\xff\xd7\x016\x00\xd5\xff\ +\xd7\x016\x00\xd7\xff\xd7\x016\x00\xd9\xff\xd7\x016\x00\ +\xdb\xff\xd7\x016\x00\xdd\xff\xd7\x016\x00\xde\xff\xec\x01\ +6\x00\xdf\xff\xec\x016\x00\xe0\xff\xec\x016\x00\xe1\xff\ +\xec\x016\x00\xe2\xff\xec\x016\x00\xe3\xff\xec\x016\x00\ +\xe4\xff\xec\x016\x00\xe5\xff\xec\x016\x00\xfa\xff\xec\x01\ +6\x01\x06\xff\xec\x016\x01\x08\xff\xec\x016\x01\x0d\xff\ +\xec\x016\x01\x0e\xff\xec\x016\x01\x0f\xff\xd7\x016\x01\ +\x10\xff\xec\x016\x01\x11\xff\xd7\x016\x01\x12\xff\xec\x01\ +6\x01\x13\xff\xd7\x016\x01\x14\xff\xec\x016\x01\x15\xff\ +\xd7\x016\x01\x17\xff\xec\x016\x01\x19\xff\xec\x016\x01\ +\x1d\xff\xec\x016\x01!\xff\xec\x016\x01+\xff\xec\x01\ +6\x01-\xff\xec\x016\x01/\xff\xec\x016\x011\xff\ +\xec\x016\x013\xff\xec\x016\x015\xff\xec\x016\x01\ +C\xff\xae\x016\x01D\xff\xd7\x016\x01F\xff\xd7\x01\ +6\x01G\xff\xec\x016\x01H\xff\xd7\x016\x01J\xff\ +\xec\x016\x02\x08\xff\x9a\x016\x02\x0c\xff\x9a\x016\x02\ +W\xff\xec\x016\x02X\xff\xae\x016\x02Y\xff\xd7\x01\ +6\x02_\xff\xec\x016\x02`\xff\xd7\x016\x02b\xff\ +\xec\x016\x03\x1d\xff\xae\x016\x03\x1e\xff\xd7\x016\x03\ +\x1f\xff\xae\x016\x03 \xff\xd7\x016\x03!\xff\xae\x01\ +6\x03\x22\xff\xd7\x016\x03#\xff\xae\x016\x03%\xff\ +\xae\x016\x03&\xff\xd7\x016\x03'\xff\xae\x016\x03\ +(\xff\xd7\x016\x03)\xff\xae\x016\x03*\xff\xd7\x01\ +6\x03+\xff\xae\x016\x03,\xff\xd7\x016\x03-\xff\ +\xae\x016\x03.\xff\xd7\x016\x03/\xff\xae\x016\x03\ +0\xff\xd7\x016\x031\xff\xae\x016\x032\xff\xd7\x01\ +6\x033\xff\xae\x016\x034\xff\xd7\x016\x036\xff\ +\xd7\x016\x038\xff\xd7\x016\x03:\xff\xd7\x016\x03\ +<\xff\xd7\x016\x03@\xff\xd7\x016\x03B\xff\xd7\x01\ +6\x03D\xff\xd7\x016\x03I\xff\xec\x016\x03J\xff\ +\xd7\x016\x03K\xff\xec\x016\x03L\xff\xd7\x016\x03\ +M\xff\xec\x016\x03N\xff\xd7\x016\x03O\xff\xec\x01\ +6\x03Q\xff\xec\x016\x03R\xff\xd7\x016\x03S\xff\ +\xec\x016\x03T\xff\xd7\x016\x03U\xff\xec\x016\x03\ +V\xff\xd7\x016\x03W\xff\xec\x016\x03X\xff\xd7\x01\ +6\x03Y\xff\xec\x016\x03Z\xff\xd7\x016\x03[\xff\ +\xec\x016\x03\x5c\xff\xd7\x016\x03]\xff\xec\x016\x03\ +^\xff\xd7\x016\x03_\xff\xec\x016\x03`\xff\xd7\x01\ +6\x03b\xff\xec\x016\x03d\xff\xec\x016\x03f\xff\ +\xec\x016\x03h\xff\xec\x016\x03j\xff\xec\x016\x03\ +l\xff\xec\x016\x03n\xff\xec\x017\x00\x05\x00R\x01\ +7\x00\x0a\x00R\x017\x00\x0f\xff\xae\x017\x00\x11\xff\ +\xae\x017\x00\x22\x00)\x017\x02\x07\x00R\x017\x02\ +\x08\xff\xae\x017\x02\x0b\x00R\x017\x02\x0c\xff\xae\x01\ +8\x00\x0f\xff\x85\x018\x00\x11\xff\x85\x018\x00\x22\x00\ +)\x018\x00$\xff\x85\x018\x00&\xff\xd7\x018\x00\ +*\xff\xd7\x018\x002\xff\xd7\x018\x004\xff\xd7\x01\ +8\x00D\xff\x9a\x018\x00F\xff\x9a\x018\x00G\xff\ +\x9a\x018\x00H\xff\x9a\x018\x00J\xff\xd7\x018\x00\ +P\xff\xc3\x018\x00Q\xff\xc3\x018\x00R\xff\x9a\x01\ +8\x00S\xff\xc3\x018\x00T\xff\x9a\x018\x00U\xff\ +\xc3\x018\x00V\xff\xae\x018\x00X\xff\xc3\x018\x00\ +]\xff\xd7\x018\x00\x82\xff\x85\x018\x00\x83\xff\x85\x01\ +8\x00\x84\xff\x85\x018\x00\x85\xff\x85\x018\x00\x86\xff\ +\x85\x018\x00\x87\xff\x85\x018\x00\x89\xff\xd7\x018\x00\ +\x94\xff\xd7\x018\x00\x95\xff\xd7\x018\x00\x96\xff\xd7\x01\ +8\x00\x97\xff\xd7\x018\x00\x98\xff\xd7\x018\x00\x9a\xff\ +\xd7\x018\x00\xa2\xff\x9a\x018\x00\xa3\xff\x9a\x018\x00\ +\xa4\xff\x9a\x018\x00\xa5\xff\x9a\x018\x00\xa6\xff\x9a\x01\ +8\x00\xa7\xff\x9a\x018\x00\xa8\xff\x9a\x018\x00\xa9\xff\ +\x9a\x018\x00\xaa\xff\x9a\x018\x00\xab\xff\x9a\x018\x00\ +\xac\xff\x9a\x018\x00\xad\xff\x9a\x018\x00\xb4\xff\x9a\x01\ +8\x00\xb5\xff\x9a\x018\x00\xb6\xff\x9a\x018\x00\xb7\xff\ +\x9a\x018\x00\xb8\xff\x9a\x018\x00\xba\xff\x9a\x018\x00\ +\xbb\xff\xc3\x018\x00\xbc\xff\xc3\x018\x00\xbd\xff\xc3\x01\ +8\x00\xbe\xff\xc3\x018\x00\xc2\xff\x85\x018\x00\xc3\xff\ +\x9a\x018\x00\xc4\xff\x85\x018\x00\xc5\xff\x9a\x018\x00\ +\xc6\xff\x85\x018\x00\xc7\xff\x9a\x018\x00\xc8\xff\xd7\x01\ +8\x00\xc9\xff\x9a\x018\x00\xca\xff\xd7\x018\x00\xcb\xff\ +\x9a\x018\x00\xcc\xff\xd7\x018\x00\xcd\xff\x9a\x018\x00\ +\xce\xff\xd7\x018\x00\xcf\xff\x9a\x018\x00\xd1\xff\x9a\x01\ +8\x00\xd3\xff\x9a\x018\x00\xd5\xff\x9a\x018\x00\xd7\xff\ +\x9a\x018\x00\xd9\xff\x9a\x018\x00\xdb\xff\x9a\x018\x00\ +\xdd\xff\x9a\x018\x00\xde\xff\xd7\x018\x00\xdf\xff\xd7\x01\ +8\x00\xe0\xff\xd7\x018\x00\xe1\xff\xd7\x018\x00\xe2\xff\ +\xd7\x018\x00\xe3\xff\xd7\x018\x00\xe4\xff\xd7\x018\x00\ +\xe5\xff\xd7\x018\x00\xfa\xff\xc3\x018\x01\x06\xff\xc3\x01\ +8\x01\x08\xff\xc3\x018\x01\x0d\xff\xc3\x018\x01\x0e\xff\ +\xd7\x018\x01\x0f\xff\x9a\x018\x01\x10\xff\xd7\x018\x01\ +\x11\xff\x9a\x018\x01\x12\xff\xd7\x018\x01\x13\xff\x9a\x01\ +8\x01\x14\xff\xd7\x018\x01\x15\xff\x9a\x018\x01\x17\xff\ +\xc3\x018\x01\x19\xff\xc3\x018\x01\x1d\xff\xae\x018\x01\ +!\xff\xae\x018\x01+\xff\xc3\x018\x01-\xff\xc3\x01\ +8\x01/\xff\xc3\x018\x011\xff\xc3\x018\x013\xff\ +\xc3\x018\x015\xff\xc3\x018\x01<\xff\xd7\x018\x01\ +>\xff\xd7\x018\x01@\xff\xd7\x018\x01C\xff\x85\x01\ +8\x01D\xff\x9a\x018\x01F\xff\x9a\x018\x01G\xff\ +\xd7\x018\x01H\xff\x9a\x018\x01J\xff\xae\x018\x02\ +\x08\xff\x85\x018\x02\x0c\xff\x85\x018\x02W\xff\xc3\x01\ +8\x02X\xff\x85\x018\x02Y\xff\x9a\x018\x02_\xff\ +\xd7\x018\x02`\xff\x9a\x018\x02b\xff\xc3\x018\x03\ +\x1d\xff\x85\x018\x03\x1e\xff\x9a\x018\x03\x1f\xff\x85\x01\ +8\x03 \xff\x9a\x018\x03!\xff\x85\x018\x03\x22\xff\ +\x9a\x018\x03#\xff\x85\x018\x03%\xff\x85\x018\x03\ +&\xff\x9a\x018\x03'\xff\x85\x018\x03(\xff\x9a\x01\ +8\x03)\xff\x85\x018\x03*\xff\x9a\x018\x03+\xff\ +\x85\x018\x03,\xff\x9a\x018\x03-\xff\x85\x018\x03\ +.\xff\x9a\x018\x03/\xff\x85\x018\x030\xff\x9a\x01\ +8\x031\xff\x85\x018\x032\xff\x9a\x018\x033\xff\ +\x85\x018\x034\xff\x9a\x018\x036\xff\x9a\x018\x03\ +8\xff\x9a\x018\x03:\xff\x9a\x018\x03<\xff\x9a\x01\ +8\x03@\xff\x9a\x018\x03B\xff\x9a\x018\x03D\xff\ +\x9a\x018\x03I\xff\xd7\x018\x03J\xff\x9a\x018\x03\ +K\xff\xd7\x018\x03L\xff\x9a\x018\x03M\xff\xd7\x01\ +8\x03N\xff\x9a\x018\x03O\xff\xd7\x018\x03Q\xff\ +\xd7\x018\x03R\xff\x9a\x018\x03S\xff\xd7\x018\x03\ +T\xff\x9a\x018\x03U\xff\xd7\x018\x03V\xff\x9a\x01\ +8\x03W\xff\xd7\x018\x03X\xff\x9a\x018\x03Y\xff\ +\xd7\x018\x03Z\xff\x9a\x018\x03[\xff\xd7\x018\x03\ +\x5c\xff\x9a\x018\x03]\xff\xd7\x018\x03^\xff\x9a\x01\ +8\x03_\xff\xd7\x018\x03`\xff\x9a\x018\x03b\xff\ +\xc3\x018\x03d\xff\xc3\x018\x03f\xff\xc3\x018\x03\ +h\xff\xc3\x018\x03j\xff\xc3\x018\x03l\xff\xc3\x01\ +8\x03n\xff\xc3\x019\x00\x05\x00R\x019\x00\x0a\x00\ +R\x019\x00\x0f\xff\xae\x019\x00\x11\xff\xae\x019\x00\ +\x22\x00)\x019\x02\x07\x00R\x019\x02\x08\xff\xae\x01\ +9\x02\x0b\x00R\x019\x02\x0c\xff\xae\x01:\x00\x0f\xff\ +\x85\x01:\x00\x11\xff\x85\x01:\x00\x22\x00)\x01:\x00\ +$\xff\x85\x01:\x00&\xff\xd7\x01:\x00*\xff\xd7\x01\ +:\x002\xff\xd7\x01:\x004\xff\xd7\x01:\x00D\xff\ +\x9a\x01:\x00F\xff\x9a\x01:\x00G\xff\x9a\x01:\x00\ +H\xff\x9a\x01:\x00J\xff\xd7\x01:\x00P\xff\xc3\x01\ +:\x00Q\xff\xc3\x01:\x00R\xff\x9a\x01:\x00S\xff\ +\xc3\x01:\x00T\xff\x9a\x01:\x00U\xff\xc3\x01:\x00\ +V\xff\xae\x01:\x00X\xff\xc3\x01:\x00]\xff\xd7\x01\ +:\x00\x82\xff\x85\x01:\x00\x83\xff\x85\x01:\x00\x84\xff\ +\x85\x01:\x00\x85\xff\x85\x01:\x00\x86\xff\x85\x01:\x00\ +\x87\xff\x85\x01:\x00\x89\xff\xd7\x01:\x00\x94\xff\xd7\x01\ +:\x00\x95\xff\xd7\x01:\x00\x96\xff\xd7\x01:\x00\x97\xff\ +\xd7\x01:\x00\x98\xff\xd7\x01:\x00\x9a\xff\xd7\x01:\x00\ +\xa2\xff\x9a\x01:\x00\xa3\xff\x9a\x01:\x00\xa4\xff\x9a\x01\ +:\x00\xa5\xff\x9a\x01:\x00\xa6\xff\x9a\x01:\x00\xa7\xff\ +\x9a\x01:\x00\xa8\xff\x9a\x01:\x00\xa9\xff\x9a\x01:\x00\ +\xaa\xff\x9a\x01:\x00\xab\xff\x9a\x01:\x00\xac\xff\x9a\x01\ +:\x00\xad\xff\x9a\x01:\x00\xb4\xff\x9a\x01:\x00\xb5\xff\ +\x9a\x01:\x00\xb6\xff\x9a\x01:\x00\xb7\xff\x9a\x01:\x00\ +\xb8\xff\x9a\x01:\x00\xba\xff\x9a\x01:\x00\xbb\xff\xc3\x01\ +:\x00\xbc\xff\xc3\x01:\x00\xbd\xff\xc3\x01:\x00\xbe\xff\ +\xc3\x01:\x00\xc2\xff\x85\x01:\x00\xc3\xff\x9a\x01:\x00\ +\xc4\xff\x85\x01:\x00\xc5\xff\x9a\x01:\x00\xc6\xff\x85\x01\ +:\x00\xc7\xff\x9a\x01:\x00\xc8\xff\xd7\x01:\x00\xc9\xff\ +\x9a\x01:\x00\xca\xff\xd7\x01:\x00\xcb\xff\x9a\x01:\x00\ +\xcc\xff\xd7\x01:\x00\xcd\xff\x9a\x01:\x00\xce\xff\xd7\x01\ +:\x00\xcf\xff\x9a\x01:\x00\xd1\xff\x9a\x01:\x00\xd3\xff\ +\x9a\x01:\x00\xd5\xff\x9a\x01:\x00\xd7\xff\x9a\x01:\x00\ +\xd9\xff\x9a\x01:\x00\xdb\xff\x9a\x01:\x00\xdd\xff\x9a\x01\ +:\x00\xde\xff\xd7\x01:\x00\xdf\xff\xd7\x01:\x00\xe0\xff\ +\xd7\x01:\x00\xe1\xff\xd7\x01:\x00\xe2\xff\xd7\x01:\x00\ +\xe3\xff\xd7\x01:\x00\xe4\xff\xd7\x01:\x00\xe5\xff\xd7\x01\ +:\x00\xfa\xff\xc3\x01:\x01\x06\xff\xc3\x01:\x01\x08\xff\ +\xc3\x01:\x01\x0d\xff\xc3\x01:\x01\x0e\xff\xd7\x01:\x01\ +\x0f\xff\x9a\x01:\x01\x10\xff\xd7\x01:\x01\x11\xff\x9a\x01\ +:\x01\x12\xff\xd7\x01:\x01\x13\xff\x9a\x01:\x01\x14\xff\ +\xd7\x01:\x01\x15\xff\x9a\x01:\x01\x17\xff\xc3\x01:\x01\ +\x19\xff\xc3\x01:\x01\x1d\xff\xae\x01:\x01!\xff\xae\x01\ +:\x01+\xff\xc3\x01:\x01-\xff\xc3\x01:\x01/\xff\ +\xc3\x01:\x011\xff\xc3\x01:\x013\xff\xc3\x01:\x01\ +5\xff\xc3\x01:\x01<\xff\xd7\x01:\x01>\xff\xd7\x01\ +:\x01@\xff\xd7\x01:\x01C\xff\x85\x01:\x01D\xff\ +\x9a\x01:\x01F\xff\x9a\x01:\x01G\xff\xd7\x01:\x01\ +H\xff\x9a\x01:\x01J\xff\xae\x01:\x02\x08\xff\x85\x01\ +:\x02\x0c\xff\x85\x01:\x02W\xff\xc3\x01:\x02X\xff\ +\x85\x01:\x02Y\xff\x9a\x01:\x02_\xff\xd7\x01:\x02\ +`\xff\x9a\x01:\x02b\xff\xc3\x01:\x03\x1d\xff\x85\x01\ +:\x03\x1e\xff\x9a\x01:\x03\x1f\xff\x85\x01:\x03 \xff\ +\x9a\x01:\x03!\xff\x85\x01:\x03\x22\xff\x9a\x01:\x03\ +#\xff\x85\x01:\x03%\xff\x85\x01:\x03&\xff\x9a\x01\ +:\x03'\xff\x85\x01:\x03(\xff\x9a\x01:\x03)\xff\ +\x85\x01:\x03*\xff\x9a\x01:\x03+\xff\x85\x01:\x03\ +,\xff\x9a\x01:\x03-\xff\x85\x01:\x03.\xff\x9a\x01\ +:\x03/\xff\x85\x01:\x030\xff\x9a\x01:\x031\xff\ +\x85\x01:\x032\xff\x9a\x01:\x033\xff\x85\x01:\x03\ +4\xff\x9a\x01:\x036\xff\x9a\x01:\x038\xff\x9a\x01\ +:\x03:\xff\x9a\x01:\x03<\xff\x9a\x01:\x03@\xff\ +\x9a\x01:\x03B\xff\x9a\x01:\x03D\xff\x9a\x01:\x03\ +I\xff\xd7\x01:\x03J\xff\x9a\x01:\x03K\xff\xd7\x01\ +:\x03L\xff\x9a\x01:\x03M\xff\xd7\x01:\x03N\xff\ +\x9a\x01:\x03O\xff\xd7\x01:\x03Q\xff\xd7\x01:\x03\ +R\xff\x9a\x01:\x03S\xff\xd7\x01:\x03T\xff\x9a\x01\ +:\x03U\xff\xd7\x01:\x03V\xff\x9a\x01:\x03W\xff\ +\xd7\x01:\x03X\xff\x9a\x01:\x03Y\xff\xd7\x01:\x03\ +Z\xff\x9a\x01:\x03[\xff\xd7\x01:\x03\x5c\xff\x9a\x01\ +:\x03]\xff\xd7\x01:\x03^\xff\x9a\x01:\x03_\xff\ +\xd7\x01:\x03`\xff\x9a\x01:\x03b\xff\xc3\x01:\x03\ +d\xff\xc3\x01:\x03f\xff\xc3\x01:\x03h\xff\xc3\x01\ +:\x03j\xff\xc3\x01:\x03l\xff\xc3\x01:\x03n\xff\ +\xc3\x01;\x00&\xff\xec\x01;\x00*\xff\xec\x01;\x00\ +2\xff\xec\x01;\x004\xff\xec\x01;\x00\x89\xff\xec\x01\ +;\x00\x94\xff\xec\x01;\x00\x95\xff\xec\x01;\x00\x96\xff\ +\xec\x01;\x00\x97\xff\xec\x01;\x00\x98\xff\xec\x01;\x00\ +\x9a\xff\xec\x01;\x00\xc8\xff\xec\x01;\x00\xca\xff\xec\x01\ +;\x00\xcc\xff\xec\x01;\x00\xce\xff\xec\x01;\x00\xde\xff\ +\xec\x01;\x00\xe0\xff\xec\x01;\x00\xe2\xff\xec\x01;\x00\ +\xe4\xff\xec\x01;\x01\x0e\xff\xec\x01;\x01\x10\xff\xec\x01\ +;\x01\x12\xff\xec\x01;\x01\x14\xff\xec\x01;\x01G\xff\ +\xec\x01;\x02_\xff\xec\x01;\x03I\xff\xec\x01;\x03\ +K\xff\xec\x01;\x03M\xff\xec\x01;\x03O\xff\xec\x01\ +;\x03Q\xff\xec\x01;\x03S\xff\xec\x01;\x03U\xff\ +\xec\x01;\x03W\xff\xec\x01;\x03Y\xff\xec\x01;\x03\ +[\xff\xec\x01;\x03]\xff\xec\x01;\x03_\xff\xec\x01\ +=\x00&\xff\xec\x01=\x00*\xff\xec\x01=\x002\xff\ +\xec\x01=\x004\xff\xec\x01=\x00\x89\xff\xec\x01=\x00\ +\x94\xff\xec\x01=\x00\x95\xff\xec\x01=\x00\x96\xff\xec\x01\ +=\x00\x97\xff\xec\x01=\x00\x98\xff\xec\x01=\x00\x9a\xff\ +\xec\x01=\x00\xc8\xff\xec\x01=\x00\xca\xff\xec\x01=\x00\ +\xcc\xff\xec\x01=\x00\xce\xff\xec\x01=\x00\xde\xff\xec\x01\ +=\x00\xe0\xff\xec\x01=\x00\xe2\xff\xec\x01=\x00\xe4\xff\ +\xec\x01=\x01\x0e\xff\xec\x01=\x01\x10\xff\xec\x01=\x01\ +\x12\xff\xec\x01=\x01\x14\xff\xec\x01=\x01G\xff\xec\x01\ +=\x02_\xff\xec\x01=\x03I\xff\xec\x01=\x03K\xff\ +\xec\x01=\x03M\xff\xec\x01=\x03O\xff\xec\x01=\x03\ +Q\xff\xec\x01=\x03S\xff\xec\x01=\x03U\xff\xec\x01\ +=\x03W\xff\xec\x01=\x03Y\xff\xec\x01=\x03[\xff\ +\xec\x01=\x03]\xff\xec\x01=\x03_\xff\xec\x01?\x00\ +&\xff\xec\x01?\x00*\xff\xec\x01?\x002\xff\xec\x01\ +?\x004\xff\xec\x01?\x00\x89\xff\xec\x01?\x00\x94\xff\ +\xec\x01?\x00\x95\xff\xec\x01?\x00\x96\xff\xec\x01?\x00\ +\x97\xff\xec\x01?\x00\x98\xff\xec\x01?\x00\x9a\xff\xec\x01\ +?\x00\xc8\xff\xec\x01?\x00\xca\xff\xec\x01?\x00\xcc\xff\ +\xec\x01?\x00\xce\xff\xec\x01?\x00\xde\xff\xec\x01?\x00\ +\xe0\xff\xec\x01?\x00\xe2\xff\xec\x01?\x00\xe4\xff\xec\x01\ +?\x01\x0e\xff\xec\x01?\x01\x10\xff\xec\x01?\x01\x12\xff\ +\xec\x01?\x01\x14\xff\xec\x01?\x01G\xff\xec\x01?\x02\ +_\xff\xec\x01?\x03I\xff\xec\x01?\x03K\xff\xec\x01\ +?\x03M\xff\xec\x01?\x03O\xff\xec\x01?\x03Q\xff\ +\xec\x01?\x03S\xff\xec\x01?\x03U\xff\xec\x01?\x03\ +W\xff\xec\x01?\x03Y\xff\xec\x01?\x03[\xff\xec\x01\ +?\x03]\xff\xec\x01?\x03_\xff\xec\x01C\x00\x05\xff\ +q\x01C\x00\x0a\xffq\x01C\x00&\xff\xd7\x01C\x00\ +*\xff\xd7\x01C\x00-\x01\x0a\x01C\x002\xff\xd7\x01\ +C\x004\xff\xd7\x01C\x007\xffq\x01C\x009\xff\ +\xae\x01C\x00:\xff\xae\x01C\x00<\xff\x85\x01C\x00\ +\x89\xff\xd7\x01C\x00\x94\xff\xd7\x01C\x00\x95\xff\xd7\x01\ +C\x00\x96\xff\xd7\x01C\x00\x97\xff\xd7\x01C\x00\x98\xff\ +\xd7\x01C\x00\x9a\xff\xd7\x01C\x00\x9f\xff\x85\x01C\x00\ +\xc8\xff\xd7\x01C\x00\xca\xff\xd7\x01C\x00\xcc\xff\xd7\x01\ +C\x00\xce\xff\xd7\x01C\x00\xde\xff\xd7\x01C\x00\xe0\xff\ +\xd7\x01C\x00\xe2\xff\xd7\x01C\x00\xe4\xff\xd7\x01C\x01\ +\x0e\xff\xd7\x01C\x01\x10\xff\xd7\x01C\x01\x12\xff\xd7\x01\ +C\x01\x14\xff\xd7\x01C\x01$\xffq\x01C\x01&\xff\ +q\x01C\x016\xff\xae\x01C\x018\xff\x85\x01C\x01\ +:\xff\x85\x01C\x01G\xff\xd7\x01C\x01\xfa\xff\xae\x01\ +C\x01\xfc\xff\xae\x01C\x01\xfe\xff\xae\x01C\x02\x00\xff\ +\x85\x01C\x02\x07\xffq\x01C\x02\x0b\xffq\x01C\x02\ +_\xff\xd7\x01C\x03I\xff\xd7\x01C\x03K\xff\xd7\x01\ +C\x03M\xff\xd7\x01C\x03O\xff\xd7\x01C\x03Q\xff\ +\xd7\x01C\x03S\xff\xd7\x01C\x03U\xff\xd7\x01C\x03\ +W\xff\xd7\x01C\x03Y\xff\xd7\x01C\x03[\xff\xd7\x01\ +C\x03]\xff\xd7\x01C\x03_\xff\xd7\x01C\x03o\xff\ +\x85\x01C\x03q\xff\x85\x01C\x03s\xff\x85\x01C\x03\ +\x8f\xffq\x01D\x00\x05\xff\xec\x01D\x00\x0a\xff\xec\x01\ +D\x02\x07\xff\xec\x01D\x02\x0b\xff\xec\x01E\x00-\x00\ +{\x01G\x00\x0f\xff\xae\x01G\x00\x11\xff\xae\x01G\x00\ +$\xff\xd7\x01G\x007\xff\xc3\x01G\x009\xff\xec\x01\ +G\x00:\xff\xec\x01G\x00;\xff\xd7\x01G\x00<\xff\ +\xec\x01G\x00=\xff\xec\x01G\x00\x82\xff\xd7\x01G\x00\ +\x83\xff\xd7\x01G\x00\x84\xff\xd7\x01G\x00\x85\xff\xd7\x01\ +G\x00\x86\xff\xd7\x01G\x00\x87\xff\xd7\x01G\x00\x9f\xff\ +\xec\x01G\x00\xc2\xff\xd7\x01G\x00\xc4\xff\xd7\x01G\x00\ +\xc6\xff\xd7\x01G\x01$\xff\xc3\x01G\x01&\xff\xc3\x01\ +G\x016\xff\xec\x01G\x018\xff\xec\x01G\x01:\xff\ +\xec\x01G\x01;\xff\xec\x01G\x01=\xff\xec\x01G\x01\ +?\xff\xec\x01G\x01C\xff\xd7\x01G\x01\xa0\xff\xec\x01\ +G\x01\xfa\xff\xec\x01G\x01\xfc\xff\xec\x01G\x01\xfe\xff\ +\xec\x01G\x02\x00\xff\xec\x01G\x02\x08\xff\xae\x01G\x02\ +\x0c\xff\xae\x01G\x02X\xff\xd7\x01G\x03\x1d\xff\xd7\x01\ +G\x03\x1f\xff\xd7\x01G\x03!\xff\xd7\x01G\x03#\xff\ +\xd7\x01G\x03%\xff\xd7\x01G\x03'\xff\xd7\x01G\x03\ +)\xff\xd7\x01G\x03+\xff\xd7\x01G\x03-\xff\xd7\x01\ +G\x03/\xff\xd7\x01G\x031\xff\xd7\x01G\x033\xff\ +\xd7\x01G\x03o\xff\xec\x01G\x03q\xff\xec\x01G\x03\ +s\xff\xec\x01G\x03\x8f\xff\xc3\x01V\x00\x05\xffq\x01\ +V\x00\x0a\xffq\x01V\x01f\xff\xd7\x01V\x01m\xff\ +\xd7\x01V\x01q\xffq\x01V\x01r\xff\x85\x01V\x01\ +s\xff\xd7\x01V\x01u\xff\xae\x01V\x01x\xff\x85\x01\ +V\x02\x07\xffq\x01V\x02\x0b\xffq\x01V\x02T\xff\ +\x85\x01[\x00\x0f\xff\xae\x01[\x00\x11\xff\xae\x01[\x01\ +V\xff\xd7\x01[\x01_\xff\xd7\x01[\x01b\xff\xd7\x01\ +[\x01d\xff\xec\x01[\x01i\xff\xd7\x01[\x01p\xff\ +\xec\x01[\x01q\xff\xc3\x01[\x01r\xff\xec\x01[\x01\ +t\xff\xd7\x01[\x01u\xff\xec\x01[\x01x\xff\xec\x01\ +[\x01\x88\xff\xec\x01[\x02\x08\xff\xae\x01[\x02\x0c\xff\ +\xae\x01[\x02T\xff\xec\x01\x5c\x00\x0f\xff\x85\x01\x5c\x00\ +\x11\xff\x85\x01\x5c\x01V\xff\x85\x01\x5c\x01_\xff\x85\x01\ +\x5c\x01b\xff\x85\x01\x5c\x01f\xff\xd7\x01\x5c\x01i\xff\ +\x85\x01\x5c\x01m\xff\xd7\x01\x5c\x01s\xff\xc3\x01\x5c\x01\ +v\xff\xec\x01\x5c\x01y\xff\x9a\x01\x5c\x01z\xff\xae\x01\ +\x5c\x01{\xff\xc3\x01\x5c\x01|\xff\xc3\x01\x5c\x01}\xff\ +\xc3\x01\x5c\x01~\xff\x9a\x01\x5c\x01\x81\xff\xc3\x01\x5c\x01\ +\x82\xff\xae\x01\x5c\x01\x84\xff\xc3\x01\x5c\x01\x86\xff\xc3\x01\ +\x5c\x01\x87\xff\xc3\x01\x5c\x01\x89\xff\xc3\x01\x5c\x01\x8c\xff\ +\x9a\x01\x5c\x01\x8e\xff\x9a\x01\x5c\x01\x8f\xff\x9a\x01\x5c\x01\ +\x90\xff\x9a\x01\x5c\x01\x92\xff\xc3\x01\x5c\x01\x93\xff\x9a\x01\ +\x5c\x01\x95\xff\xc3\x01\x5c\x01\x96\xff\xc3\x01\x5c\x01\x98\xff\ +\xc3\x01\x5c\x01\x99\xff\x9a\x01\x5c\x01\x9a\xff\xc3\x01\x5c\x01\ +\x9b\xff\xc3\x01\x5c\x02\x08\xff\x85\x01\x5c\x02\x0c\xff\x85\x01\ +\x5c\x02!\xff\xec\x01]\x01q\xff\xd7\x01]\x01r\xff\ +\xec\x01]\x01x\xff\xec\x01]\x02T\xff\xec\x01^\x00\ +\x05\xff\xd7\x01^\x00\x0a\xff\xd7\x01^\x02\x07\xff\xd7\x01\ +^\x02\x0b\xff\xd7\x01_\x00\x05\xffq\x01_\x00\x0a\xff\ +q\x01_\x01f\xff\xd7\x01_\x01m\xff\xd7\x01_\x01\ +q\xffq\x01_\x01r\xff\x85\x01_\x01s\xff\xd7\x01\ +_\x01u\xff\xae\x01_\x01x\xff\x85\x01_\x02\x07\xff\ +q\x01_\x02\x0b\xffq\x01_\x02T\xff\x85\x01`\x00\ +\x0f\xff\xae\x01`\x00\x11\xff\xae\x01`\x01V\xff\xd7\x01\ +`\x01_\xff\xd7\x01`\x01b\xff\xd7\x01`\x01i\xff\ +\xd7\x01`\x01t\xff\xd7\x01`\x02\x08\xff\xae\x01`\x02\ +\x0c\xff\xae\x01a\x00\x0f\xff\x85\x01a\x00\x10\xff\xae\x01\ +a\x00\x11\xff\x85\x01a\x01V\xff\x5c\x01a\x01_\xff\ +\x5c\x01a\x01b\xff\x5c\x01a\x01f\xff\xc3\x01a\x01\ +i\xff\x5c\x01a\x01m\xff\xc3\x01a\x01s\xff\x9a\x01\ +a\x01v\xff\xc3\x01a\x01y\xffq\x01a\x01z\xff\ +\x9a\x01a\x01{\xff\x9a\x01a\x01|\xff\xae\x01a\x01\ +}\xff\x9a\x01a\x01~\xffq\x01a\x01\x80\xff\xd7\x01\ +a\x01\x81\xff\xc3\x01a\x01\x82\xff\x9a\x01a\x01\x84\xff\ +\x9a\x01a\x01\x86\xff\xae\x01a\x01\x87\xff\x9a\x01a\x01\ +\x89\xff\x9a\x01a\x01\x8a\xff\xd7\x01a\x01\x8c\xffq\x01\ +a\x01\x8e\xff\x9a\x01a\x01\x8f\xffq\x01a\x01\x90\xff\ +q\x01a\x01\x92\xff\x9a\x01a\x01\x93\xffq\x01a\x01\ +\x94\xff\xd7\x01a\x01\x95\xff\x9a\x01a\x01\x96\xff\x9a\x01\ +a\x01\x98\xff\x9a\x01a\x01\x99\xffq\x01a\x01\x9a\xff\ +\x9a\x01a\x01\x9b\xff\x9a\x01a\x02\x02\xff\xae\x01a\x02\ +\x03\xff\xae\x01a\x02\x04\xff\xae\x01a\x02\x08\xff\x85\x01\ +a\x02\x0c\xff\x85\x01a\x02!\xff\xc3\x01a\x02S\xff\ +\xd7\x01b\x00\x05\xffq\x01b\x00\x0a\xffq\x01b\x01\ +f\xff\xd7\x01b\x01m\xff\xd7\x01b\x01q\xffq\x01\ +b\x01r\xff\x85\x01b\x01s\xff\xd7\x01b\x01u\xff\ +\xae\x01b\x01x\xff\x85\x01b\x02\x07\xffq\x01b\x02\ +\x0b\xffq\x01b\x02T\xff\x85\x01d\x01f\xff\xec\x01\ +d\x01m\xff\xec\x01d\x01s\xff\xc3\x01f\x00\x0f\xff\ +\xae\x01f\x00\x11\xff\xae\x01f\x01V\xff\xd7\x01f\x01\ +_\xff\xd7\x01f\x01b\xff\xd7\x01f\x01d\xff\xec\x01\ +f\x01i\xff\xd7\x01f\x01p\xff\xec\x01f\x01q\xff\ +\xc3\x01f\x01r\xff\xec\x01f\x01t\xff\xd7\x01f\x01\ +u\xff\xec\x01f\x01x\xff\xec\x01f\x01\x88\xff\xec\x01\ +f\x02\x08\xff\xae\x01f\x02\x0c\xff\xae\x01f\x02T\xff\ +\xec\x01h\x01f\xff\xd7\x01h\x01m\xff\xd7\x01h\x01\ +s\xff\xc3\x01h\x01\x8d\xff\xec\x01h\x01\x91\xff\xec\x01\ +i\x00\x05\xffq\x01i\x00\x0a\xffq\x01i\x01f\xff\ +\xd7\x01i\x01m\xff\xd7\x01i\x01q\xffq\x01i\x01\ +r\xff\x85\x01i\x01s\xff\xd7\x01i\x01u\xff\xae\x01\ +i\x01x\xff\x85\x01i\x02\x07\xffq\x01i\x02\x0b\xff\ +q\x01i\x02T\xff\x85\x01m\x00\x0f\xff\xae\x01m\x00\ +\x11\xff\xae\x01m\x01V\xff\xd7\x01m\x01_\xff\xd7\x01\ +m\x01b\xff\xd7\x01m\x01d\xff\xec\x01m\x01i\xff\ +\xd7\x01m\x01p\xff\xec\x01m\x01q\xff\xc3\x01m\x01\ +r\xff\xec\x01m\x01t\xff\xd7\x01m\x01u\xff\xec\x01\ +m\x01x\xff\xec\x01m\x01\x88\xff\xec\x01m\x02\x08\xff\ +\xae\x01m\x02\x0c\xff\xae\x01m\x02T\xff\xec\x01o\x00\ +\x0f\xfe\xf6\x01o\x00\x11\xfe\xf6\x01o\x01V\xff\x9a\x01\ +o\x01_\xff\x9a\x01o\x01b\xff\x9a\x01o\x01d\xff\ +\xec\x01o\x01i\xff\x9a\x01o\x01t\xff\xd7\x01o\x01\ +\x88\xff\xd7\x01o\x02\x08\xfe\xf6\x01o\x02\x0c\xfe\xf6\x01\ +q\x00\x0f\xff\x85\x01q\x00\x10\xff\xae\x01q\x00\x11\xff\ +\x85\x01q\x01V\xff\x5c\x01q\x01_\xff\x5c\x01q\x01\ +b\xff\x5c\x01q\x01f\xff\xc3\x01q\x01i\xff\x5c\x01\ +q\x01m\xff\xc3\x01q\x01s\xff\x9a\x01q\x01v\xff\ +\xc3\x01q\x01y\xffq\x01q\x01z\xff\x9a\x01q\x01\ +{\xff\x9a\x01q\x01|\xff\xae\x01q\x01}\xff\x9a\x01\ +q\x01~\xffq\x01q\x01\x80\xff\xd7\x01q\x01\x81\xff\ +\xc3\x01q\x01\x82\xff\x9a\x01q\x01\x84\xff\x9a\x01q\x01\ +\x86\xff\xae\x01q\x01\x87\xff\x9a\x01q\x01\x89\xff\x9a\x01\ +q\x01\x8a\xff\xd7\x01q\x01\x8c\xffq\x01q\x01\x8e\xff\ +\x9a\x01q\x01\x8f\xffq\x01q\x01\x90\xffq\x01q\x01\ +\x92\xff\x9a\x01q\x01\x93\xffq\x01q\x01\x94\xff\xd7\x01\ +q\x01\x95\xff\x9a\x01q\x01\x96\xff\x9a\x01q\x01\x98\xff\ +\x9a\x01q\x01\x99\xffq\x01q\x01\x9a\xff\x9a\x01q\x01\ +\x9b\xff\x9a\x01q\x02\x02\xff\xae\x01q\x02\x03\xff\xae\x01\ +q\x02\x04\xff\xae\x01q\x02\x08\xff\x85\x01q\x02\x0c\xff\ +\x85\x01q\x02!\xff\xc3\x01q\x02S\xff\xd7\x01r\x00\ +\x0f\xff\x85\x01r\x00\x11\xff\x85\x01r\x01V\xff\x85\x01\ +r\x01_\xff\x85\x01r\x01b\xff\x85\x01r\x01f\xff\ +\xd7\x01r\x01i\xff\x85\x01r\x01m\xff\xd7\x01r\x01\ +s\xff\xc3\x01r\x01v\xff\xec\x01r\x01y\xff\x9a\x01\ +r\x01z\xff\xae\x01r\x01{\xff\xc3\x01r\x01|\xff\ +\xc3\x01r\x01}\xff\xc3\x01r\x01~\xff\x9a\x01r\x01\ +\x81\xff\xc3\x01r\x01\x82\xff\xae\x01r\x01\x84\xff\xc3\x01\ +r\x01\x86\xff\xc3\x01r\x01\x87\xff\xc3\x01r\x01\x89\xff\ +\xc3\x01r\x01\x8c\xff\x9a\x01r\x01\x8e\xff\x9a\x01r\x01\ +\x8f\xff\x9a\x01r\x01\x90\xff\x9a\x01r\x01\x92\xff\xc3\x01\ +r\x01\x93\xff\x9a\x01r\x01\x95\xff\xc3\x01r\x01\x96\xff\ +\xc3\x01r\x01\x98\xff\xc3\x01r\x01\x99\xff\x9a\x01r\x01\ +\x9a\xff\xc3\x01r\x01\x9b\xff\xc3\x01r\x02\x08\xff\x85\x01\ +r\x02\x0c\xff\x85\x01r\x02!\xff\xec\x01s\x00\x0f\xff\ +\x9a\x01s\x00\x11\xff\x9a\x01s\x01V\xff\xd7\x01s\x01\ +_\xff\xd7\x01s\x01b\xff\xd7\x01s\x01d\xff\xc3\x01\ +s\x01i\xff\xd7\x01s\x01p\xff\xec\x01s\x01q\xff\ +\xae\x01s\x01r\xff\xc3\x01s\x01t\xff\xec\x01s\x01\ +x\xff\xc3\x01s\x01\x88\xff\xec\x01s\x02\x08\xff\x9a\x01\ +s\x02\x0c\xff\x9a\x01s\x02T\xff\xc3\x01t\x01f\xff\ +\xd7\x01t\x01m\xff\xd7\x01t\x01s\xff\xc3\x01t\x01\ +\x8d\xff\xec\x01t\x01\x91\xff\xec\x01u\x00\x0f\xff\x85\x01\ +u\x00\x11\xff\x85\x01u\x01V\xff\xae\x01u\x01_\xff\ +\xae\x01u\x01b\xff\xae\x01u\x01f\xff\xec\x01u\x01\ +i\xff\xae\x01u\x01m\xff\xec\x01u\x02\x08\xff\x85\x01\ +u\x02\x0c\xff\x85\x01v\x01q\xff\xd7\x01v\x01r\xff\ +\xec\x01v\x01x\xff\xec\x01v\x02T\xff\xec\x01x\x00\ +\x0f\xff\x85\x01x\x00\x11\xff\x85\x01x\x01V\xff\x85\x01\ +x\x01_\xff\x85\x01x\x01b\xff\x85\x01x\x01f\xff\ +\xd7\x01x\x01i\xff\x85\x01x\x01m\xff\xd7\x01x\x01\ +s\xff\xc3\x01x\x01v\xff\xec\x01x\x01y\xff\x9a\x01\ +x\x01z\xff\xae\x01x\x01{\xff\xc3\x01x\x01|\xff\ +\xc3\x01x\x01}\xff\xc3\x01x\x01~\xff\x9a\x01x\x01\ +\x81\xff\xc3\x01x\x01\x82\xff\xae\x01x\x01\x84\xff\xc3\x01\ +x\x01\x86\xff\xc3\x01x\x01\x87\xff\xc3\x01x\x01\x89\xff\ +\xc3\x01x\x01\x8c\xff\x9a\x01x\x01\x8e\xff\x9a\x01x\x01\ +\x8f\xff\x9a\x01x\x01\x90\xff\x9a\x01x\x01\x92\xff\xc3\x01\ +x\x01\x93\xff\x9a\x01x\x01\x95\xff\xc3\x01x\x01\x96\xff\ +\xc3\x01x\x01\x98\xff\xc3\x01x\x01\x99\xff\x9a\x01x\x01\ +\x9a\xff\xc3\x01x\x01\x9b\xff\xc3\x01x\x02\x08\xff\x85\x01\ +x\x02\x0c\xff\x85\x01x\x02!\xff\xec\x01y\x01\x88\x00\ +)\x01{\x00\x05\xff\xec\x01{\x00\x0a\xff\xec\x01{\x02\ +\x07\xff\xec\x01{\x02\x0b\xff\xec\x01|\x00\x05\xff\xae\x01\ +|\x00\x0a\xff\xae\x01|\x01\x8d\xff\xec\x01|\x01\x91\xff\ +\xec\x01|\x02\x07\xff\xae\x01|\x02\x0b\xff\xae\x01~\x01\ +\x88\x00)\x01\x80\x00\x0f\xff\xae\x01\x80\x00\x11\xff\xae\x01\ +\x80\x01\x88\xff\xec\x01\x80\x02\x08\xff\xae\x01\x80\x02\x0c\xff\ +\xae\x01\x83\x00\x10\xff\x9a\x01\x83\x01y\xff\xd7\x01\x83\x01\ +~\xff\xd7\x01\x83\x01\x81\xff\xd7\x01\x83\x01\x8c\xff\xd7\x01\ +\x83\x01\x8d\xff\xd7\x01\x83\x01\x8f\xff\xd7\x01\x83\x01\x90\xff\ +\xd7\x01\x83\x01\x91\xff\xd7\x01\x83\x01\x93\xff\xd7\x01\x83\x01\ +\x99\xff\xd7\x01\x83\x02\x02\xff\x9a\x01\x83\x02\x03\xff\x9a\x01\ +\x83\x02\x04\xff\x9a\x01\x84\x00\x05\xff\xec\x01\x84\x00\x0a\xff\ +\xec\x01\x84\x02\x07\xff\xec\x01\x84\x02\x0b\xff\xec\x01\x85\x00\ +\x0f\xff\xd7\x01\x85\x00\x11\xff\xd7\x01\x85\x02\x08\xff\xd7\x01\ +\x85\x02\x0c\xff\xd7\x01\x86\x00\x05\xff\xae\x01\x86\x00\x0a\xff\ +\xae\x01\x86\x01\x8d\xff\xec\x01\x86\x01\x91\xff\xec\x01\x86\x02\ +\x07\xff\xae\x01\x86\x02\x0b\xff\xae\x01\x87\x01y\xff\xd7\x01\ +\x87\x01~\xff\xd7\x01\x87\x01\x8c\xff\xd7\x01\x87\x01\x8f\xff\ +\xd7\x01\x87\x01\x90\xff\xd7\x01\x87\x01\x93\xff\xd7\x01\x87\x01\ +\x99\xff\xd7\x01\x88\x00\x05\xff\x85\x01\x88\x00\x0a\xff\x85\x01\ +\x88\x01y\xff\xec\x01\x88\x01~\xff\xec\x01\x88\x01\x80\xff\ +\xd7\x01\x88\x01\x8a\xff\xd7\x01\x88\x01\x8c\xff\xec\x01\x88\x01\ +\x8d\xff\xd7\x01\x88\x01\x8f\xff\xec\x01\x88\x01\x90\xff\xec\x01\ +\x88\x01\x91\xff\xd7\x01\x88\x01\x93\xff\xec\x01\x88\x01\x99\xff\ +\xec\x01\x88\x02\x07\xff\x85\x01\x88\x02\x0b\xff\x85\x01\x8a\x00\ +\x0f\xff\xae\x01\x8a\x00\x11\xff\xae\x01\x8a\x01\x88\xff\xec\x01\ +\x8a\x02\x08\xff\xae\x01\x8a\x02\x0c\xff\xae\x01\x8c\x00\x05\xff\ +\xec\x01\x8c\x00\x0a\xff\xec\x01\x8c\x01\x80\xff\xd7\x01\x8c\x01\ +\x8a\xff\xd7\x01\x8c\x02\x07\xff\xec\x01\x8c\x02\x0b\xff\xec\x01\ +\x8e\x00\x05\xff\xec\x01\x8e\x00\x0a\xff\xec\x01\x8e\x01\x80\xff\ +\xd7\x01\x8e\x01\x8a\xff\xd7\x01\x8e\x02\x07\xff\xec\x01\x8e\x02\ +\x0b\xff\xec\x01\x90\x00\x0f\xff\xec\x01\x90\x00\x11\xff\xec\x01\ +\x90\x02\x08\xff\xec\x01\x90\x02\x0c\xff\xec\x01\x93\x00\x05\xff\ +\xec\x01\x93\x00\x0a\xff\xec\x01\x93\x01\x80\xff\xd7\x01\x93\x01\ +\x8a\xff\xd7\x01\x93\x02\x07\xff\xec\x01\x93\x02\x0b\xff\xec\x01\ +\x94\x00\x0f\xff\xc3\x01\x94\x00\x10\xff\xd7\x01\x94\x00\x11\xff\ +\xc3\x01\x94\x01y\xff\xd7\x01\x94\x01~\xff\xd7\x01\x94\x01\ +\x81\xff\xd7\x01\x94\x01\x8c\xff\xd7\x01\x94\x01\x8f\xff\xd7\x01\ +\x94\x01\x90\xff\xd7\x01\x94\x01\x93\xff\xd7\x01\x94\x01\x99\xff\ +\xd7\x01\x94\x02\x02\xff\xd7\x01\x94\x02\x03\xff\xd7\x01\x94\x02\ +\x04\xff\xd7\x01\x94\x02\x08\xff\xc3\x01\x94\x02\x0c\xff\xc3\x01\ +\x97\x00\x05\xff\xd7\x01\x97\x00\x0a\xff\xd7\x01\x97\x02\x07\xff\ +\xd7\x01\x97\x02\x0b\xff\xd7\x01\x99\x00\x05\xff\xec\x01\x99\x00\ +\x0a\xff\xec\x01\x99\x01\x80\xff\xd7\x01\x99\x01\x8a\xff\xd7\x01\ +\x99\x02\x07\xff\xec\x01\x99\x02\x0b\xff\xec\x01\x9d\x00\x05\xff\ +\xae\x01\x9d\x00\x0a\xff\xae\x01\x9d\x01\x9d\xff\x85\x01\x9d\x01\ +\xa6\xff\x85\x01\x9d\x01\xa8\xff\xd7\x01\x9d\x01\xbc\xff\x9a\x01\ +\x9d\x01\xbd\xff\xd7\x01\x9d\x01\xc1\xff\x9a\x01\x9d\x01\xc4\xff\ +\x85\x01\x9d\x01\xdc\xff\xd7\x01\x9d\x01\xdd\xff\xd7\x01\x9d\x01\ +\xe1\xff\xd7\x01\x9d\x01\xe4\xff\xd7\x01\x9d\x01\xf6\xff\xd7\x01\ +\x9d\x02\x07\xff\xae\x01\x9d\x02\x0b\xff\xae\x01\x9d\x02n\xff\ +\xae\x01\x9d\x02|\xff\x9a\x01\x9d\x02\x80\xff\xae\x01\x9d\x02\ +\x82\xff\xae\x01\x9d\x02\x97\xff\xae\x01\x9d\x02\x9b\xff\xae\x01\ +\x9d\x02\xa7\xff\xae\x01\x9d\x02\xa9\xff\x85\x01\x9d\x02\xaa\xff\ +\xd7\x01\x9d\x02\xb5\xff\x9a\x01\x9d\x02\xb6\xff\xd7\x01\x9d\x02\ +\xb7\xff\x9a\x01\x9d\x02\xb8\xff\xd7\x01\x9d\x02\xb9\xff\x9a\x01\ +\x9d\x02\xba\xff\xd7\x01\x9d\x02\xbd\xff\x85\x01\x9d\x02\xbe\xff\ +\xd7\x01\x9d\x02\xbf\xff\x9a\x01\x9d\x02\xc0\xff\xd7\x01\x9d\x02\ +\xc1\xff\x9a\x01\x9d\x02\xc2\xff\xd7\x01\x9d\x02\xd4\xff\x9a\x01\ +\x9d\x02\xd5\xff\xd7\x01\x9d\x02\xf7\xff\xd7\x01\x9d\x02\xf8\xff\ +\xd7\x01\x9d\x02\xf9\xff\xd7\x01\x9d\x02\xfa\xff\xd7\x01\x9d\x02\ +\xfb\xff\xd7\x01\x9d\x02\xfc\xff\xd7\x01\x9d\x02\xfd\xff\x9a\x01\ +\x9d\x02\xfe\xff\xd7\x01\x9d\x03\x03\xff\xae\x01\x9d\x03\x0d\xff\ +\x9a\x01\x9d\x03\x0e\xff\xc3\x01\x9d\x03\x0f\xff\x9a\x01\x9d\x03\ +\x10\xff\xc3\x01\x9d\x03\x17\xff\x85\x01\x9d\x03\x18\xff\xd7\x01\ +\x9e\x00\x0f\xff\x85\x01\x9e\x00\x10\xff\xae\x01\x9e\x00\x11\xff\ +\x85\x01\x9e\x01\x9f\xff\xd7\x01\x9e\x01\xa4\xff\x9a\x01\x9e\x01\ +\xaa\xffq\x01\x9e\x01\xae\xff\x9a\x01\x9e\x01\xb5\xff\x9a\x01\ +\x9e\x01\xb8\xff\xd7\x01\x9e\x01\xbb\xff\xd7\x01\x9e\x01\xbc\x00\ +)\x01\x9e\x01\xbe\xff\xae\x01\x9e\x01\xcc\xff\x9a\x01\x9e\x01\ +\xcd\xff\x9a\x01\x9e\x01\xce\xff\x85\x01\x9e\x01\xcf\xffq\x01\ +\x9e\x01\xd0\xff\xd7\x01\x9e\x01\xd1\xff\xd7\x01\x9e\x01\xd2\xff\ +\x9a\x01\x9e\x01\xd3\xff\x9a\x01\x9e\x01\xd4\xff\x9a\x01\x9e\x01\ +\xd5\xff\x85\x01\x9e\x01\xd6\xff\x9a\x01\x9e\x01\xd7\xff\x9a\x01\ +\x9e\x01\xd8\xffq\x01\x9e\x01\xd9\xff\x9a\x01\x9e\x01\xda\xff\ +\x9a\x01\x9e\x01\xdb\xffq\x01\x9e\x01\xdc\xff\xae\x01\x9e\x01\ +\xdd\xff\xae\x01\x9e\x01\xde\xffq\x01\x9e\x01\xdf\xff\xd7\x01\ +\x9e\x01\xe0\xff\x9a\x01\x9e\x01\xe1\xff\x9a\x01\x9e\x01\xe2\xff\ +\x9a\x01\x9e\x01\xe3\xff\x9a\x01\x9e\x01\xe4\xff\xae\x01\x9e\x01\ +\xe5\xff\x9a\x01\x9e\x01\xe6\xff\x9a\x01\x9e\x01\xe7\xff\xd7\x01\ +\x9e\x01\xe8\xff\x9a\x01\x9e\x01\xe9\xff\xc3\x01\x9e\x01\xea\xff\ +q\x01\x9e\x01\xec\xff\x9a\x01\x9e\x01\xed\xffq\x01\x9e\x01\ +\xee\xff\x85\x01\x9e\x01\xf2\xff\x85\x01\x9e\x01\xf3\xff\x9a\x01\ +\x9e\x01\xf5\xff\x9a\x01\x9e\x01\xf6\xff\xae\x01\x9e\x01\xf7\xff\ +\x9a\x01\x9e\x01\xf9\xff\x9a\x01\x9e\x02\x02\xff\xae\x01\x9e\x02\ +\x03\xff\xae\x01\x9e\x02\x04\xff\xae\x01\x9e\x02\x08\xff\x85\x01\ +\x9e\x02\x0c\xff\x85\x01\x9e\x02j\xffq\x01\x9e\x02k\xff\ +\x9a\x01\x9e\x02l\xff\xd7\x01\x9e\x02m\xff\xd7\x01\x9e\x02\ +q\xff\x9a\x01\x9e\x02r\xffq\x01\x9e\x02s\xff\x85\x01\ +\x9e\x02u\xff\x9a\x01\x9e\x02w\xff\x9a\x01\x9e\x02y\xff\ +\x9a\x01\x9e\x02}\xff\x9a\x01\x9e\x02~\xff\xd7\x01\x9e\x02\ +\x7f\xffq\x01\x9e\x02\x81\xff\xd7\x01\x9e\x02\x83\xff\xd7\x01\ +\x9e\x02\x84\xff\xd7\x01\x9e\x02\x85\xffq\x01\x9e\x02\x86\xff\ +\xd7\x01\x9e\x02\x87\xffq\x01\x9e\x02\x88\xff\xd7\x01\x9e\x02\ +\x89\xffq\x01\x9e\x02\x8a\xff\xd7\x01\x9e\x02\x8b\xff\xd7\x01\ +\x9e\x02\x8c\xff\xd7\x01\x9e\x02\x8d\xffq\x01\x9e\x02\x96\xff\ +\x9a\x01\x9e\x02\x9a\xff\x9a\x01\x9e\x02\x9e\xff\x9a\x01\x9e\x02\ +\xa0\xff\xd7\x01\x9e\x02\xa2\xff\xd7\x01\x9e\x02\xa4\xff\x9a\x01\ +\x9e\x02\xa6\xff\x9a\x01\x9e\x02\xaa\xff\xae\x01\x9e\x02\xac\xff\ +\x9a\x01\x9e\x02\xae\xff\x9a\x01\x9e\x02\xb0\xff\x9a\x01\x9e\x02\ +\xb1\xff\xd7\x01\x9e\x02\xb2\xffq\x01\x9e\x02\xb3\xff\xd7\x01\ +\x9e\x02\xb4\xffq\x01\x9e\x02\xb5\x00)\x01\x9e\x02\xb6\xff\ +\xae\x01\x9e\x02\xb8\xff\xae\x01\x9e\x02\xba\xff\xae\x01\x9e\x02\ +\xbc\xff\xd7\x01\x9e\x02\xbe\xff\xae\x01\x9e\x02\xc0\xff\x9a\x01\ +\x9e\x02\xc2\xff\x9a\x01\x9e\x02\xc4\xff\x9a\x01\x9e\x02\xc5\xff\ +\x9a\x01\x9e\x02\xc6\xffq\x01\x9e\x02\xc7\xff\x9a\x01\x9e\x02\ +\xc8\xffq\x01\x9e\x02\xcb\xff\xd7\x01\x9e\x02\xcd\xff\x9a\x01\ +\x9e\x02\xce\xff\x9a\x01\x9e\x02\xcf\xff\x85\x01\x9e\x02\xd1\xff\ +\x9a\x01\x9e\x02\xd3\xff\x9a\x01\x9e\x02\xd5\xff\x9a\x01\x9e\x02\ +\xd7\xff\x9a\x01\x9e\x02\xd9\xffq\x01\x9e\x02\xdb\xffq\x01\ +\x9e\x02\xdd\xffq\x01\x9e\x02\xe0\xffq\x01\x9e\x02\xe6\xff\ +\xd7\x01\x9e\x02\xe8\xff\xd7\x01\x9e\x02\xea\xff\xc3\x01\x9e\x02\ +\xec\xff\x9a\x01\x9e\x02\xee\xff\x9a\x01\x9e\x02\xef\xff\xd7\x01\ +\x9e\x02\xf0\xffq\x01\x9e\x02\xf1\xff\xd7\x01\x9e\x02\xf2\xff\ +q\x01\x9e\x02\xf3\xff\xd7\x01\x9e\x02\xf4\xffq\x01\x9e\x02\ +\xf6\xff\xd7\x01\x9e\x02\xf8\xff\xae\x01\x9e\x02\xfa\xff\xae\x01\ +\x9e\x02\xfc\xff\xae\x01\x9e\x02\xfe\xff\x9a\x01\x9e\x03\x00\xff\ +\x9a\x01\x9e\x03\x02\xff\x9a\x01\x9e\x03\x06\xff\xd7\x01\x9e\x03\ +\x08\xff\xd7\x01\x9e\x03\x09\xffq\x01\x9e\x03\x0a\xffq\x01\ +\x9e\x03\x0b\xffq\x01\x9e\x03\x0c\xffq\x01\x9e\x03\x0e\xff\ +\x9a\x01\x9e\x03\x10\xff\x9a\x01\x9e\x03\x11\xff\x9a\x01\x9e\x03\ +\x12\xff\x85\x01\x9e\x03\x14\xff\x9a\x01\x9e\x03\x15\xff\xd7\x01\ +\x9e\x03\x16\xffq\x01\x9e\x03\x18\xff\xae\x01\x9e\x03\x1a\xff\ +q\x01\x9e\x03\x1b\xff\x9a\x01\x9e\x03\x1c\xff\x85\x01\x9f\x01\ +\x9f\xff\xd7\x01\x9f\x01\xb8\xff\xd7\x01\x9f\x01\xbb\xff\xd7\x01\ +\x9f\x01\xbe\xff\xd7\x01\x9f\x01\xe1\xff\xd7\x01\x9f\x02l\xff\ +\xd7\x01\x9f\x02~\xff\xd7\x01\x9f\x02\x84\xff\xd7\x01\x9f\x02\ +\x86\xff\xd7\x01\x9f\x02\x88\xff\xd7\x01\x9f\x02\x8a\xff\xd7\x01\ +\x9f\x02\x8c\xff\xd7\x01\x9f\x02\xb1\xff\xd7\x01\x9f\x02\xb3\xff\ +\xd7\x01\x9f\x02\xc0\xff\xd7\x01\x9f\x02\xc2\xff\xd7\x01\x9f\x02\ +\xc5\xff\xd7\x01\x9f\x02\xc7\xff\xd7\x01\x9f\x02\xd5\xff\xd7\x01\ +\x9f\x02\xef\xff\xd7\x01\x9f\x02\xf1\xff\xd7\x01\x9f\x02\xf3\xff\ +\xd7\x01\x9f\x02\xfe\xff\xd7\x01\x9f\x03\x09\xff\xd7\x01\x9f\x03\ +\x0b\xff\xd7\x01\x9f\x03\x0e\xff\xd7\x01\x9f\x03\x10\xff\xd7\x01\ +\x9f\x03\x15\xff\xd7\x01\xa0\x03\x0e\xff\xd7\x01\xa0\x03\x10\xff\ +\xd7\x01\xa4\x00\x05\xff\xae\x01\xa4\x00\x0a\xff\xae\x01\xa4\x01\ +\x9d\xff\x85\x01\xa4\x01\xa6\xff\x85\x01\xa4\x01\xa8\xff\xd7\x01\ +\xa4\x01\xbc\xff\x9a\x01\xa4\x01\xbd\xff\xd7\x01\xa4\x01\xc1\xff\ +\x9a\x01\xa4\x01\xc4\xff\x85\x01\xa4\x01\xdc\xff\xd7\x01\xa4\x01\ +\xdd\xff\xd7\x01\xa4\x01\xe1\xff\xd7\x01\xa4\x01\xe4\xff\xd7\x01\ +\xa4\x01\xf6\xff\xd7\x01\xa4\x02\x07\xff\xae\x01\xa4\x02\x0b\xff\ +\xae\x01\xa4\x02n\xff\xae\x01\xa4\x02|\xff\x9a\x01\xa4\x02\ +\x80\xff\xae\x01\xa4\x02\x82\xff\xae\x01\xa4\x02\x97\xff\xae\x01\ +\xa4\x02\x9b\xff\xae\x01\xa4\x02\xa7\xff\xae\x01\xa4\x02\xa9\xff\ +\x85\x01\xa4\x02\xaa\xff\xd7\x01\xa4\x02\xb5\xff\x9a\x01\xa4\x02\ +\xb6\xff\xd7\x01\xa4\x02\xb7\xff\x9a\x01\xa4\x02\xb8\xff\xd7\x01\ +\xa4\x02\xb9\xff\x9a\x01\xa4\x02\xba\xff\xd7\x01\xa4\x02\xbd\xff\ +\x85\x01\xa4\x02\xbe\xff\xd7\x01\xa4\x02\xbf\xff\x9a\x01\xa4\x02\ +\xc0\xff\xd7\x01\xa4\x02\xc1\xff\x9a\x01\xa4\x02\xc2\xff\xd7\x01\ +\xa4\x02\xd4\xff\x9a\x01\xa4\x02\xd5\xff\xd7\x01\xa4\x02\xf7\xff\ +\xd7\x01\xa4\x02\xf8\xff\xd7\x01\xa4\x02\xf9\xff\xd7\x01\xa4\x02\ +\xfa\xff\xd7\x01\xa4\x02\xfb\xff\xd7\x01\xa4\x02\xfc\xff\xd7\x01\ +\xa4\x02\xfd\xff\x9a\x01\xa4\x02\xfe\xff\xd7\x01\xa4\x03\x03\xff\ +\xae\x01\xa4\x03\x0d\xff\x9a\x01\xa4\x03\x0e\xff\xc3\x01\xa4\x03\ +\x0f\xff\x9a\x01\xa4\x03\x10\xff\xc3\x01\xa4\x03\x17\xff\x85\x01\ +\xa4\x03\x18\xff\xd7\x01\xa5\x00\x05\xff\xae\x01\xa5\x00\x0a\xff\ +\xae\x01\xa5\x01\x9d\xff\x85\x01\xa5\x01\xa6\xff\x85\x01\xa5\x01\ +\xa8\xff\xd7\x01\xa5\x01\xbc\xff\x9a\x01\xa5\x01\xbd\xff\xd7\x01\ +\xa5\x01\xc1\xff\x9a\x01\xa5\x01\xc4\xff\x85\x01\xa5\x01\xdc\xff\ +\xd7\x01\xa5\x01\xdd\xff\xd7\x01\xa5\x01\xe1\xff\xd7\x01\xa5\x01\ +\xe4\xff\xd7\x01\xa5\x01\xf6\xff\xd7\x01\xa5\x02\x07\xff\xae\x01\ +\xa5\x02\x0b\xff\xae\x01\xa5\x02n\xff\xae\x01\xa5\x02|\xff\ +\x9a\x01\xa5\x02\x80\xff\xae\x01\xa5\x02\x82\xff\xae\x01\xa5\x02\ +\x97\xff\xae\x01\xa5\x02\x9b\xff\xae\x01\xa5\x02\xa7\xff\xae\x01\ +\xa5\x02\xa9\xff\x85\x01\xa5\x02\xaa\xff\xd7\x01\xa5\x02\xb5\xff\ +\x9a\x01\xa5\x02\xb6\xff\xd7\x01\xa5\x02\xb7\xff\x9a\x01\xa5\x02\ +\xb8\xff\xd7\x01\xa5\x02\xb9\xff\x9a\x01\xa5\x02\xba\xff\xd7\x01\ +\xa5\x02\xbd\xff\x85\x01\xa5\x02\xbe\xff\xd7\x01\xa5\x02\xbf\xff\ +\x9a\x01\xa5\x02\xc0\xff\xd7\x01\xa5\x02\xc1\xff\x9a\x01\xa5\x02\ +\xc2\xff\xd7\x01\xa5\x02\xd4\xff\x9a\x01\xa5\x02\xd5\xff\xd7\x01\ +\xa5\x02\xf7\xff\xd7\x01\xa5\x02\xf8\xff\xd7\x01\xa5\x02\xf9\xff\ +\xd7\x01\xa5\x02\xfa\xff\xd7\x01\xa5\x02\xfb\xff\xd7\x01\xa5\x02\ +\xfc\xff\xd7\x01\xa5\x02\xfd\xff\x9a\x01\xa5\x02\xfe\xff\xd7\x01\ +\xa5\x03\x03\xff\xae\x01\xa5\x03\x0d\xff\x9a\x01\xa5\x03\x0e\xff\ +\xc3\x01\xa5\x03\x0f\xff\x9a\x01\xa5\x03\x10\xff\xc3\x01\xa5\x03\ +\x17\xff\x85\x01\xa5\x03\x18\xff\xd7\x01\xa6\x00\x05\xff\xae\x01\ +\xa6\x00\x0a\xff\xae\x01\xa6\x01\x9d\xff\x85\x01\xa6\x01\xa6\xff\ +\x85\x01\xa6\x01\xa8\xff\xd7\x01\xa6\x01\xbc\xff\x9a\x01\xa6\x01\ +\xbd\xff\xd7\x01\xa6\x01\xc1\xff\x9a\x01\xa6\x01\xc4\xff\x85\x01\ +\xa6\x01\xdc\xff\xd7\x01\xa6\x01\xdd\xff\xd7\x01\xa6\x01\xe1\xff\ +\xd7\x01\xa6\x01\xe4\xff\xd7\x01\xa6\x01\xf6\xff\xd7\x01\xa6\x02\ +\x07\xff\xae\x01\xa6\x02\x0b\xff\xae\x01\xa6\x02n\xff\xae\x01\ +\xa6\x02|\xff\x9a\x01\xa6\x02\x80\xff\xae\x01\xa6\x02\x82\xff\ +\xae\x01\xa6\x02\x97\xff\xae\x01\xa6\x02\x9b\xff\xae\x01\xa6\x02\ +\xa7\xff\xae\x01\xa6\x02\xa9\xff\x85\x01\xa6\x02\xaa\xff\xd7\x01\ +\xa6\x02\xb5\xff\x9a\x01\xa6\x02\xb6\xff\xd7\x01\xa6\x02\xb7\xff\ +\x9a\x01\xa6\x02\xb8\xff\xd7\x01\xa6\x02\xb9\xff\x9a\x01\xa6\x02\ +\xba\xff\xd7\x01\xa6\x02\xbd\xff\x85\x01\xa6\x02\xbe\xff\xd7\x01\ +\xa6\x02\xbf\xff\x9a\x01\xa6\x02\xc0\xff\xd7\x01\xa6\x02\xc1\xff\ +\x9a\x01\xa6\x02\xc2\xff\xd7\x01\xa6\x02\xd4\xff\x9a\x01\xa6\x02\ +\xd5\xff\xd7\x01\xa6\x02\xf7\xff\xd7\x01\xa6\x02\xf8\xff\xd7\x01\ +\xa6\x02\xf9\xff\xd7\x01\xa6\x02\xfa\xff\xd7\x01\xa6\x02\xfb\xff\ +\xd7\x01\xa6\x02\xfc\xff\xd7\x01\xa6\x02\xfd\xff\x9a\x01\xa6\x02\ +\xfe\xff\xd7\x01\xa6\x03\x03\xff\xae\x01\xa6\x03\x0d\xff\x9a\x01\ +\xa6\x03\x0e\xff\xc3\x01\xa6\x03\x0f\xff\x9a\x01\xa6\x03\x10\xff\ +\xc3\x01\xa6\x03\x17\xff\x85\x01\xa6\x03\x18\xff\xd7\x01\xa7\x01\ +\x9f\xff\xd7\x01\xa7\x01\xb8\xff\xd7\x01\xa7\x01\xbb\xff\xd7\x01\ +\xa7\x01\xbe\xff\xd7\x01\xa7\x01\xc1\xff\xd7\x01\xa7\x01\xe1\xff\ +\xd7\x01\xa7\x02l\xff\xd7\x01\xa7\x02|\xff\xd7\x01\xa7\x02\ +~\xff\xd7\x01\xa7\x02\x84\xff\xd7\x01\xa7\x02\x86\xff\xd7\x01\ +\xa7\x02\x88\xff\xd7\x01\xa7\x02\x8a\xff\xd7\x01\xa7\x02\x8c\xff\ +\xd7\x01\xa7\x02\xb1\xff\xd7\x01\xa7\x02\xb3\xff\xd7\x01\xa7\x02\ +\xbf\xff\xd7\x01\xa7\x02\xc0\xff\xd7\x01\xa7\x02\xc1\xff\xd7\x01\ +\xa7\x02\xc2\xff\xd7\x01\xa7\x02\xc5\xff\x9a\x01\xa7\x02\xc7\xff\ +\x9a\x01\xa7\x02\xd4\xff\xd7\x01\xa7\x02\xd5\xff\xd7\x01\xa7\x02\ +\xef\xff\xd7\x01\xa7\x02\xf1\xff\xd7\x01\xa7\x02\xf3\xff\xd7\x01\ +\xa7\x02\xfd\xff\xd7\x01\xa7\x02\xfe\xff\xd7\x01\xa7\x03\x09\xff\ +\xd7\x01\xa7\x03\x0b\xff\xd7\x01\xa7\x03\x0e\xff\xd7\x01\xa7\x03\ +\x10\xff\xd7\x01\xa7\x03\x15\xff\xd7\x01\xa7\x03\x19\xff\xec\x01\ +\xa8\x00\x0f\xff\x85\x01\xa8\x00\x11\xff\x85\x01\xa8\x01\x9f\xff\ +\xec\x01\xa8\x01\xa4\xff\x9a\x01\xa8\x01\xaa\xffq\x01\xa8\x01\ +\xae\xff\x9a\x01\xa8\x01\xb5\xff\x9a\x01\xa8\x01\xb8\xff\xec\x01\ +\xa8\x01\xbb\xff\xec\x01\xa8\x01\xbe\xff\xc3\x01\xa8\x01\xc9\xff\ +\xec\x01\xa8\x01\xce\xff\xae\x01\xa8\x01\xcf\xff\xd7\x01\xa8\x01\ +\xd5\xff\xae\x01\xa8\x01\xd8\xff\xd7\x01\xa8\x01\xdb\xff\xd7\x01\ +\xa8\x01\xde\xff\xd7\x01\xa8\x01\xe1\xff\xd7\x01\xa8\x01\xea\xff\ +\xd7\x01\xa8\x01\xeb\x00f\x01\xa8\x01\xed\xff\xd7\x01\xa8\x01\ +\xee\xff\xec\x01\xa8\x01\xf2\xff\xae\x01\xa8\x01\xf4\x00f\x01\ +\xa8\x02\x08\xff\x85\x01\xa8\x02\x0c\xff\x85\x01\xa8\x02j\xff\ +\xd7\x01\xa8\x02l\xff\xec\x01\xa8\x02r\xffq\x01\xa8\x02\ +s\xff\xae\x01\xa8\x02~\xff\xec\x01\xa8\x02\x7f\xff\xd7\x01\ +\xa8\x02\x84\xff\xec\x01\xa8\x02\x85\xff\xd7\x01\xa8\x02\x86\xff\ +\xec\x01\xa8\x02\x87\xff\xd7\x01\xa8\x02\x88\xff\xec\x01\xa8\x02\ +\x89\xff\xd7\x01\xa8\x02\x8a\xff\xec\x01\xa8\x02\x8c\xff\xec\x01\ +\xa8\x02\x8d\xff\xd7\x01\xa8\x02\x98\x00f\x01\xa8\x02\xa8\x00\ +f\x01\xa8\x02\xb1\xff\xec\x01\xa8\x02\xb2\xff\xd7\x01\xa8\x02\ +\xb3\xff\xec\x01\xa8\x02\xb4\xff\xd7\x01\xa8\x02\xc0\xff\xd7\x01\ +\xa8\x02\xc2\xff\xd7\x01\xa8\x02\xc5\xff\xd7\x01\xa8\x02\xc6\xff\ +\xc3\x01\xa8\x02\xc7\xff\xd7\x01\xa8\x02\xc8\xff\xc3\x01\xa8\x02\ +\xce\xff\x9a\x01\xa8\x02\xcf\xff\xae\x01\xa8\x02\xd5\xff\xd7\x01\ +\xa8\x02\xd9\xffq\x01\xa8\x02\xdb\xffq\x01\xa8\x02\xdd\xff\ +q\x01\xa8\x02\xe0\xff\xd7\x01\xa8\x02\xef\xff\xec\x01\xa8\x02\ +\xf0\xff\xd7\x01\xa8\x02\xf1\xff\xec\x01\xa8\x02\xf2\xff\xd7\x01\ +\xa8\x02\xf3\xff\xec\x01\xa8\x02\xf4\xff\xd7\x01\xa8\x02\xfe\xff\ +\xd7\x01\xa8\x03\x09\xffq\x01\xa8\x03\x0a\xff\xd7\x01\xa8\x03\ +\x0b\xffq\x01\xa8\x03\x0c\xff\xd7\x01\xa8\x03\x11\xff\x9a\x01\ +\xa8\x03\x12\xff\xae\x01\xa8\x03\x15\xff\xec\x01\xa8\x03\x16\xff\ +\xd7\x01\xa8\x03\x1a\xff\xd7\x01\xa8\x03\x1b\xff\x9a\x01\xa8\x03\ +\x1c\xff\xae\x01\xaa\x00\x05\xffq\x01\xaa\x00\x0a\xffq\x01\ +\xaa\x01\x9d\xff\x9a\x01\xaa\x01\xa6\xff\x9a\x01\xaa\x01\xbc\xff\ +q\x01\xaa\x01\xbe\xff\xd7\x01\xaa\x01\xc1\xff\x9a\x01\xaa\x01\ +\xc4\xff\x9a\x01\xaa\x01\xdc\xff\xd7\x01\xaa\x01\xe1\xff\xd7\x01\ +\xaa\x01\xe4\xff\xd7\x01\xaa\x02\x07\xffq\x01\xaa\x02\x0b\xff\ +q\x01\xaa\x02n\xff\xd7\x01\xaa\x02|\xff\x9a\x01\xaa\x02\ +\x80\xff\xae\x01\xaa\x02\x82\xff\xae\x01\xaa\x02\x97\xff\xd7\x01\ +\xaa\x02\x9b\xff\xd7\x01\xaa\x02\xa7\xff\xd7\x01\xaa\x02\xa9\xff\ +\x9a\x01\xaa\x02\xaa\xff\xd7\x01\xaa\x02\xb5\xffq\x01\xaa\x02\ +\xb6\xff\xd7\x01\xaa\x02\xb7\xff\x85\x01\xaa\x02\xb9\xff\x85\x01\ +\xaa\x02\xbd\xff\x9a\x01\xaa\x02\xbe\xff\xd7\x01\xaa\x02\xbf\xff\ +\x9a\x01\xaa\x02\xc0\xff\xd7\x01\xaa\x02\xc1\xff\x9a\x01\xaa\x02\ +\xc2\xff\xd7\x01\xaa\x02\xc5\xff\x9a\x01\xaa\x02\xc7\xff\x9a\x01\ +\xaa\x02\xd4\xff\x9a\x01\xaa\x02\xd5\xff\xd7\x01\xaa\x02\xe1\xff\ +\xd7\x01\xaa\x02\xe3\xff\xd7\x01\xaa\x02\xfd\xff\x9a\x01\xaa\x02\ +\xfe\xff\xd7\x01\xaa\x03\x03\xff\xd7\x01\xaa\x03\x0d\xffq\x01\ +\xaa\x03\x0e\xff\xd7\x01\xaa\x03\x0f\xffq\x01\xaa\x03\x10\xff\ +\xd7\x01\xaa\x03\x17\xff\x9a\x01\xaa\x03\x18\xff\xd7\x01\xab\x00\ +\x05\xff\xd7\x01\xab\x00\x0a\xff\xd7\x01\xab\x01\xaa\xff\xec\x01\ +\xab\x01\xc1\xff\xd7\x01\xab\x02\x07\xff\xd7\x01\xab\x02\x0b\xff\ +\xd7\x01\xab\x02r\xff\xec\x01\xab\x02|\xff\xd7\x01\xab\x02\ +\xbf\xff\xd7\x01\xab\x02\xc1\xff\xd7\x01\xab\x02\xc5\xff\xd7\x01\ +\xab\x02\xc7\xff\xd7\x01\xab\x02\xd4\xff\xd7\x01\xab\x02\xd9\xff\ +\xec\x01\xab\x02\xdb\xff\xec\x01\xab\x02\xdd\xff\xec\x01\xab\x02\ +\xfd\xff\xd7\x01\xac\x00\x0f\xff\xae\x01\xac\x00\x11\xff\xae\x01\ +\xac\x02\x08\xff\xae\x01\xac\x02\x0c\xff\xae\x01\xac\x02\x80\xff\ +\xec\x01\xac\x02\x82\xff\xec\x01\xac\x02\xb7\xff\xec\x01\xac\x02\ +\xb9\xff\xec\x01\xac\x03\x0d\xff\xd7\x01\xac\x03\x0f\xff\xd7\x01\ +\xad\x00\x0f\xff\x85\x01\xad\x00\x10\xff\xae\x01\xad\x00\x11\xff\ +\x85\x01\xad\x01\x9f\xff\xd7\x01\xad\x01\xa4\xff\x9a\x01\xad\x01\ +\xaa\xffq\x01\xad\x01\xae\xff\x9a\x01\xad\x01\xb5\xff\x9a\x01\ +\xad\x01\xb8\xff\xd7\x01\xad\x01\xbb\xff\xd7\x01\xad\x01\xbc\x00\ +)\x01\xad\x01\xbe\xff\xae\x01\xad\x01\xcc\xff\x9a\x01\xad\x01\ +\xcd\xff\x9a\x01\xad\x01\xce\xff\x85\x01\xad\x01\xcf\xffq\x01\ +\xad\x01\xd0\xff\xd7\x01\xad\x01\xd1\xff\xd7\x01\xad\x01\xd2\xff\ +\x9a\x01\xad\x01\xd3\xff\x9a\x01\xad\x01\xd4\xff\x9a\x01\xad\x01\ +\xd5\xff\x85\x01\xad\x01\xd6\xff\x9a\x01\xad\x01\xd7\xff\x9a\x01\ +\xad\x01\xd8\xffq\x01\xad\x01\xd9\xff\x9a\x01\xad\x01\xda\xff\ +\x9a\x01\xad\x01\xdb\xffq\x01\xad\x01\xdc\xff\xae\x01\xad\x01\ +\xdd\xff\xae\x01\xad\x01\xde\xffq\x01\xad\x01\xdf\xff\xd7\x01\ +\xad\x01\xe0\xff\x9a\x01\xad\x01\xe1\xff\x9a\x01\xad\x01\xe2\xff\ +\x9a\x01\xad\x01\xe3\xff\x9a\x01\xad\x01\xe4\xff\xae\x01\xad\x01\ +\xe5\xff\x9a\x01\xad\x01\xe6\xff\x9a\x01\xad\x01\xe7\xff\xd7\x01\ +\xad\x01\xe8\xff\x9a\x01\xad\x01\xe9\xff\xc3\x01\xad\x01\xea\xff\ +q\x01\xad\x01\xec\xff\x9a\x01\xad\x01\xed\xffq\x01\xad\x01\ +\xee\xff\x85\x01\xad\x01\xf2\xff\x85\x01\xad\x01\xf3\xff\x9a\x01\ +\xad\x01\xf5\xff\x9a\x01\xad\x01\xf6\xff\xae\x01\xad\x01\xf7\xff\ +\x9a\x01\xad\x01\xf9\xff\x9a\x01\xad\x02\x02\xff\xae\x01\xad\x02\ +\x03\xff\xae\x01\xad\x02\x04\xff\xae\x01\xad\x02\x08\xff\x85\x01\ +\xad\x02\x0c\xff\x85\x01\xad\x02j\xffq\x01\xad\x02k\xff\ +\x9a\x01\xad\x02l\xff\xd7\x01\xad\x02m\xff\xd7\x01\xad\x02\ +q\xff\x9a\x01\xad\x02r\xffq\x01\xad\x02s\xff\x85\x01\ +\xad\x02u\xff\x9a\x01\xad\x02w\xff\x9a\x01\xad\x02y\xff\ +\x9a\x01\xad\x02}\xff\x9a\x01\xad\x02~\xff\xd7\x01\xad\x02\ +\x7f\xffq\x01\xad\x02\x81\xff\xd7\x01\xad\x02\x83\xff\xd7\x01\ +\xad\x02\x84\xff\xd7\x01\xad\x02\x85\xffq\x01\xad\x02\x86\xff\ +\xd7\x01\xad\x02\x87\xffq\x01\xad\x02\x88\xff\xd7\x01\xad\x02\ +\x89\xffq\x01\xad\x02\x8a\xff\xd7\x01\xad\x02\x8b\xff\xd7\x01\ +\xad\x02\x8c\xff\xd7\x01\xad\x02\x8d\xffq\x01\xad\x02\x96\xff\ +\x9a\x01\xad\x02\x9a\xff\x9a\x01\xad\x02\x9e\xff\x9a\x01\xad\x02\ +\xa0\xff\xd7\x01\xad\x02\xa2\xff\xd7\x01\xad\x02\xa4\xff\x9a\x01\ +\xad\x02\xa6\xff\x9a\x01\xad\x02\xaa\xff\xae\x01\xad\x02\xac\xff\ +\x9a\x01\xad\x02\xae\xff\x9a\x01\xad\x02\xb0\xff\x9a\x01\xad\x02\ +\xb1\xff\xd7\x01\xad\x02\xb2\xffq\x01\xad\x02\xb3\xff\xd7\x01\ +\xad\x02\xb4\xffq\x01\xad\x02\xb5\x00)\x01\xad\x02\xb6\xff\ +\xae\x01\xad\x02\xb8\xff\xae\x01\xad\x02\xba\xff\xae\x01\xad\x02\ +\xbc\xff\xd7\x01\xad\x02\xbe\xff\xae\x01\xad\x02\xc0\xff\x9a\x01\ +\xad\x02\xc2\xff\x9a\x01\xad\x02\xc4\xff\x9a\x01\xad\x02\xc5\xff\ +\x9a\x01\xad\x02\xc6\xffq\x01\xad\x02\xc7\xff\x9a\x01\xad\x02\ +\xc8\xffq\x01\xad\x02\xcb\xff\xd7\x01\xad\x02\xcd\xff\x9a\x01\ +\xad\x02\xce\xff\x9a\x01\xad\x02\xcf\xff\x85\x01\xad\x02\xd1\xff\ +\x9a\x01\xad\x02\xd3\xff\x9a\x01\xad\x02\xd5\xff\x9a\x01\xad\x02\ +\xd7\xff\x9a\x01\xad\x02\xd9\xffq\x01\xad\x02\xdb\xffq\x01\ +\xad\x02\xdd\xffq\x01\xad\x02\xe0\xffq\x01\xad\x02\xe6\xff\ +\xd7\x01\xad\x02\xe8\xff\xd7\x01\xad\x02\xea\xff\xc3\x01\xad\x02\ +\xec\xff\x9a\x01\xad\x02\xee\xff\x9a\x01\xad\x02\xef\xff\xd7\x01\ +\xad\x02\xf0\xffq\x01\xad\x02\xf1\xff\xd7\x01\xad\x02\xf2\xff\ +q\x01\xad\x02\xf3\xff\xd7\x01\xad\x02\xf4\xffq\x01\xad\x02\ +\xf6\xff\xd7\x01\xad\x02\xf8\xff\xae\x01\xad\x02\xfa\xff\xae\x01\ +\xad\x02\xfc\xff\xae\x01\xad\x02\xfe\xff\x9a\x01\xad\x03\x00\xff\ +\x9a\x01\xad\x03\x02\xff\x9a\x01\xad\x03\x06\xff\xd7\x01\xad\x03\ +\x08\xff\xd7\x01\xad\x03\x09\xffq\x01\xad\x03\x0a\xffq\x01\ +\xad\x03\x0b\xffq\x01\xad\x03\x0c\xffq\x01\xad\x03\x0e\xff\ +\x9a\x01\xad\x03\x10\xff\x9a\x01\xad\x03\x11\xff\x9a\x01\xad\x03\ +\x12\xff\x85\x01\xad\x03\x14\xff\x9a\x01\xad\x03\x15\xff\xd7\x01\ +\xad\x03\x16\xffq\x01\xad\x03\x18\xff\xae\x01\xad\x03\x1a\xff\ +q\x01\xad\x03\x1b\xff\x9a\x01\xad\x03\x1c\xff\x85\x01\xae\x01\ +\xa3\x00\xe1\x01\xae\x02\xea\x00)\x01\xae\x03\x0e\xff\xd7\x01\ +\xae\x03\x10\xff\xd7\x01\xb0\x01\x9f\xff\xd7\x01\xb0\x01\xb8\xff\ +\xd7\x01\xb0\x01\xbb\xff\xd7\x01\xb0\x01\xbe\xff\xd7\x01\xb0\x01\ +\xc1\xff\xd7\x01\xb0\x01\xe1\xff\xd7\x01\xb0\x02l\xff\xd7\x01\ +\xb0\x02|\xff\xd7\x01\xb0\x02~\xff\xd7\x01\xb0\x02\x84\xff\ +\xd7\x01\xb0\x02\x86\xff\xd7\x01\xb0\x02\x88\xff\xd7\x01\xb0\x02\ +\x8a\xff\xd7\x01\xb0\x02\x8c\xff\xd7\x01\xb0\x02\xb1\xff\xd7\x01\ +\xb0\x02\xb3\xff\xd7\x01\xb0\x02\xbf\xff\xd7\x01\xb0\x02\xc0\xff\ +\xd7\x01\xb0\x02\xc1\xff\xd7\x01\xb0\x02\xc2\xff\xd7\x01\xb0\x02\ +\xc5\xff\x9a\x01\xb0\x02\xc7\xff\x9a\x01\xb0\x02\xd4\xff\xd7\x01\ +\xb0\x02\xd5\xff\xd7\x01\xb0\x02\xef\xff\xd7\x01\xb0\x02\xf1\xff\ +\xd7\x01\xb0\x02\xf3\xff\xd7\x01\xb0\x02\xfd\xff\xd7\x01\xb0\x02\ +\xfe\xff\xd7\x01\xb0\x03\x09\xff\xd7\x01\xb0\x03\x0b\xff\xd7\x01\ +\xb0\x03\x0e\xff\xd7\x01\xb0\x03\x10\xff\xd7\x01\xb0\x03\x15\xff\ +\xd7\x01\xb0\x03\x19\xff\xec\x01\xb1\x00\x0f\xff\xae\x01\xb1\x00\ +\x11\xff\xae\x01\xb1\x02\x08\xff\xae\x01\xb1\x02\x0c\xff\xae\x01\ +\xb1\x02\x80\xff\xec\x01\xb1\x02\x82\xff\xec\x01\xb1\x02\xb7\xff\ +\xec\x01\xb1\x02\xb9\xff\xec\x01\xb1\x03\x0d\xff\xd7\x01\xb1\x03\ +\x0f\xff\xd7\x01\xb4\x01\x9f\xff\xd7\x01\xb4\x01\xb8\xff\xd7\x01\ +\xb4\x01\xbb\xff\xd7\x01\xb4\x01\xbe\xff\xd7\x01\xb4\x01\xc1\xff\ +\xd7\x01\xb4\x01\xe1\xff\xd7\x01\xb4\x02l\xff\xd7\x01\xb4\x02\ +|\xff\xd7\x01\xb4\x02~\xff\xd7\x01\xb4\x02\x84\xff\xd7\x01\ +\xb4\x02\x86\xff\xd7\x01\xb4\x02\x88\xff\xd7\x01\xb4\x02\x8a\xff\ +\xd7\x01\xb4\x02\x8c\xff\xd7\x01\xb4\x02\xb1\xff\xd7\x01\xb4\x02\ +\xb3\xff\xd7\x01\xb4\x02\xbf\xff\xd7\x01\xb4\x02\xc0\xff\xd7\x01\ +\xb4\x02\xc1\xff\xd7\x01\xb4\x02\xc2\xff\xd7\x01\xb4\x02\xc5\xff\ +\x9a\x01\xb4\x02\xc7\xff\x9a\x01\xb4\x02\xd4\xff\xd7\x01\xb4\x02\ +\xd5\xff\xd7\x01\xb4\x02\xef\xff\xd7\x01\xb4\x02\xf1\xff\xd7\x01\ +\xb4\x02\xf3\xff\xd7\x01\xb4\x02\xfd\xff\xd7\x01\xb4\x02\xfe\xff\ +\xd7\x01\xb4\x03\x09\xff\xd7\x01\xb4\x03\x0b\xff\xd7\x01\xb4\x03\ +\x0e\xff\xd7\x01\xb4\x03\x10\xff\xd7\x01\xb4\x03\x15\xff\xd7\x01\ +\xb4\x03\x19\xff\xec\x01\xb8\x00\x0f\xff\xae\x01\xb8\x00\x11\xff\ +\xae\x01\xb8\x01\x9d\xff\xec\x01\xb8\x01\xa4\xff\xd7\x01\xb8\x01\ +\xa6\xff\xec\x01\xb8\x01\xa8\xff\xd7\x01\xb8\x01\xaa\xff\xd7\x01\ +\xb8\x01\xae\xff\xd7\x01\xb8\x01\xb0\xff\xd7\x01\xb8\x01\xb1\xff\ +\xec\x01\xb8\x01\xb5\xff\xd7\x01\xb8\x01\xbc\xff\xc3\x01\xb8\x01\ +\xbd\xff\xd7\x01\xb8\x01\xbf\xff\xd7\x01\xb8\x01\xc1\xff\xd7\x01\ +\xb8\x01\xc4\xff\xec\x01\xb8\x01\xc7\xff\xec\x01\xb8\x01\xce\xff\ +\xec\x01\xb8\x01\xd5\xff\xec\x01\xb8\x01\xf2\xff\xec\x01\xb8\x02\ +\x08\xff\xae\x01\xb8\x02\x0c\xff\xae\x01\xb8\x02r\xff\xd7\x01\ +\xb8\x02s\xff\xec\x01\xb8\x02z\xff\xec\x01\xb8\x02|\xff\ +\xd7\x01\xb8\x02\x80\xff\xec\x01\xb8\x02\x82\xff\xec\x01\xb8\x02\ +\x9f\xff\xd7\x01\xb8\x02\xa1\xff\xec\x01\xb8\x02\xa9\xff\xec\x01\ +\xb8\x02\xb5\xff\xc3\x01\xb8\x02\xb7\xff\xec\x01\xb8\x02\xb9\xff\ +\xec\x01\xb8\x02\xbb\xff\xd7\x01\xb8\x02\xbd\xff\xec\x01\xb8\x02\ +\xbf\xff\xd7\x01\xb8\x02\xc1\xff\xd7\x01\xb8\x02\xca\xff\xd7\x01\ +\xb8\x02\xce\xff\xd7\x01\xb8\x02\xcf\xff\xec\x01\xb8\x02\xd4\xff\ +\xd7\x01\xb8\x02\xd9\xff\xd7\x01\xb8\x02\xdb\xff\xd7\x01\xb8\x02\ +\xdd\xff\xd7\x01\xb8\x02\xe5\xff\xd7\x01\xb8\x02\xe7\xff\xec\x01\ +\xb8\x02\xf5\xff\xec\x01\xb8\x02\xf7\xff\xd7\x01\xb8\x02\xf9\xff\ +\xd7\x01\xb8\x02\xfb\xff\xd7\x01\xb8\x02\xfd\xff\xd7\x01\xb8\x03\ +\x05\xff\xd7\x01\xb8\x03\x07\xff\xd7\x01\xb8\x03\x0d\xff\xd7\x01\ +\xb8\x03\x0f\xff\xd7\x01\xb8\x03\x11\xff\xd7\x01\xb8\x03\x12\xff\ +\xec\x01\xb8\x03\x17\xff\xec\x01\xb8\x03\x1b\xff\xd7\x01\xb8\x03\ +\x1c\xff\xec\x01\xba\x00\x0f\xfe\xf6\x01\xba\x00\x11\xfe\xf6\x01\ +\xba\x01\xa4\xff\x85\x01\xba\x01\xaa\xff\x9a\x01\xba\x01\xae\xff\ +\x85\x01\xba\x01\xb0\xff\xd7\x01\xba\x01\xb5\xff\x85\x01\xba\x01\ +\xbf\xff\xd7\x01\xba\x01\xce\xff\x9a\x01\xba\x01\xd5\xff\x9a\x01\ +\xba\x01\xf2\xff\x9a\x01\xba\x02\x08\xfe\xf6\x01\xba\x02\x0c\xfe\ +\xf6\x01\xba\x02r\xff\x9a\x01\xba\x02s\xff\x9a\x01\xba\x02\ +v\xff\xec\x01\xba\x02\x9f\xff\xd7\x01\xba\x02\xbb\xff\xd7\x01\ +\xba\x02\xca\xff\xd7\x01\xba\x02\xce\xff\x85\x01\xba\x02\xcf\xff\ +\x9a\x01\xba\x02\xd9\xff\x9a\x01\xba\x02\xdb\xff\x9a\x01\xba\x02\ +\xdd\xff\x9a\x01\xba\x02\xe5\xff\xd7\x01\xba\x03\x05\xff\xd7\x01\ +\xba\x03\x07\xff\xd7\x01\xba\x03\x09\xff\xae\x01\xba\x03\x0b\xff\ +\xae\x01\xba\x03\x11\xff\x85\x01\xba\x03\x12\xff\x9a\x01\xba\x03\ +\x1b\xff\x85\x01\xba\x03\x1c\xff\x9a\x01\xbb\x01\x9f\xff\xd7\x01\ +\xbb\x01\xb8\xff\xd7\x01\xbb\x01\xbb\xff\xd7\x01\xbb\x01\xbe\xff\ +\xd7\x01\xbb\x01\xe1\xff\xd7\x01\xbb\x02l\xff\xd7\x01\xbb\x02\ +~\xff\xd7\x01\xbb\x02\x84\xff\xd7\x01\xbb\x02\x86\xff\xd7\x01\ +\xbb\x02\x88\xff\xd7\x01\xbb\x02\x8a\xff\xd7\x01\xbb\x02\x8c\xff\ +\xd7\x01\xbb\x02\xb1\xff\xd7\x01\xbb\x02\xb3\xff\xd7\x01\xbb\x02\ +\xc0\xff\xd7\x01\xbb\x02\xc2\xff\xd7\x01\xbb\x02\xc5\xff\xd7\x01\ +\xbb\x02\xc7\xff\xd7\x01\xbb\x02\xd5\xff\xd7\x01\xbb\x02\xef\xff\ +\xd7\x01\xbb\x02\xf1\xff\xd7\x01\xbb\x02\xf3\xff\xd7\x01\xbb\x02\ +\xfe\xff\xd7\x01\xbb\x03\x09\xff\xd7\x01\xbb\x03\x0b\xff\xd7\x01\ +\xbb\x03\x0e\xff\xd7\x01\xbb\x03\x10\xff\xd7\x01\xbb\x03\x15\xff\ +\xd7\x01\xbc\x00\x0f\xff\x85\x01\xbc\x00\x10\xff\xae\x01\xbc\x00\ +\x11\xff\x85\x01\xbc\x01\x9f\xff\xd7\x01\xbc\x01\xa4\xff\x9a\x01\ +\xbc\x01\xaa\xffq\x01\xbc\x01\xae\xff\x9a\x01\xbc\x01\xb5\xff\ +\x9a\x01\xbc\x01\xb8\xff\xd7\x01\xbc\x01\xbb\xff\xd7\x01\xbc\x01\ +\xbc\x00)\x01\xbc\x01\xbe\xff\xae\x01\xbc\x01\xcc\xff\x9a\x01\ +\xbc\x01\xcd\xff\x9a\x01\xbc\x01\xce\xff\x85\x01\xbc\x01\xcf\xff\ +q\x01\xbc\x01\xd0\xff\xd7\x01\xbc\x01\xd1\xff\xd7\x01\xbc\x01\ +\xd2\xff\x9a\x01\xbc\x01\xd3\xff\x9a\x01\xbc\x01\xd4\xff\x9a\x01\ +\xbc\x01\xd5\xff\x85\x01\xbc\x01\xd6\xff\x9a\x01\xbc\x01\xd7\xff\ +\x9a\x01\xbc\x01\xd8\xffq\x01\xbc\x01\xd9\xff\x9a\x01\xbc\x01\ +\xda\xff\x9a\x01\xbc\x01\xdb\xffq\x01\xbc\x01\xdc\xff\xae\x01\ +\xbc\x01\xdd\xff\xae\x01\xbc\x01\xde\xffq\x01\xbc\x01\xdf\xff\ +\xd7\x01\xbc\x01\xe0\xff\x9a\x01\xbc\x01\xe1\xff\x9a\x01\xbc\x01\ +\xe2\xff\x9a\x01\xbc\x01\xe3\xff\x9a\x01\xbc\x01\xe4\xff\xae\x01\ +\xbc\x01\xe5\xff\x9a\x01\xbc\x01\xe6\xff\x9a\x01\xbc\x01\xe7\xff\ +\xd7\x01\xbc\x01\xe8\xff\x9a\x01\xbc\x01\xe9\xff\xc3\x01\xbc\x01\ +\xea\xffq\x01\xbc\x01\xec\xff\x9a\x01\xbc\x01\xed\xffq\x01\ +\xbc\x01\xee\xff\x85\x01\xbc\x01\xf2\xff\x85\x01\xbc\x01\xf3\xff\ +\x9a\x01\xbc\x01\xf5\xff\x9a\x01\xbc\x01\xf6\xff\xae\x01\xbc\x01\ +\xf7\xff\x9a\x01\xbc\x01\xf9\xff\x9a\x01\xbc\x02\x02\xff\xae\x01\ +\xbc\x02\x03\xff\xae\x01\xbc\x02\x04\xff\xae\x01\xbc\x02\x08\xff\ +\x85\x01\xbc\x02\x0c\xff\x85\x01\xbc\x02j\xffq\x01\xbc\x02\ +k\xff\x9a\x01\xbc\x02l\xff\xd7\x01\xbc\x02m\xff\xd7\x01\ +\xbc\x02q\xff\x9a\x01\xbc\x02r\xffq\x01\xbc\x02s\xff\ +\x85\x01\xbc\x02u\xff\x9a\x01\xbc\x02w\xff\x9a\x01\xbc\x02\ +y\xff\x9a\x01\xbc\x02}\xff\x9a\x01\xbc\x02~\xff\xd7\x01\ +\xbc\x02\x7f\xffq\x01\xbc\x02\x81\xff\xd7\x01\xbc\x02\x83\xff\ +\xd7\x01\xbc\x02\x84\xff\xd7\x01\xbc\x02\x85\xffq\x01\xbc\x02\ +\x86\xff\xd7\x01\xbc\x02\x87\xffq\x01\xbc\x02\x88\xff\xd7\x01\ +\xbc\x02\x89\xffq\x01\xbc\x02\x8a\xff\xd7\x01\xbc\x02\x8b\xff\ +\xd7\x01\xbc\x02\x8c\xff\xd7\x01\xbc\x02\x8d\xffq\x01\xbc\x02\ +\x96\xff\x9a\x01\xbc\x02\x9a\xff\x9a\x01\xbc\x02\x9e\xff\x9a\x01\ +\xbc\x02\xa0\xff\xd7\x01\xbc\x02\xa2\xff\xd7\x01\xbc\x02\xa4\xff\ +\x9a\x01\xbc\x02\xa6\xff\x9a\x01\xbc\x02\xaa\xff\xae\x01\xbc\x02\ +\xac\xff\x9a\x01\xbc\x02\xae\xff\x9a\x01\xbc\x02\xb0\xff\x9a\x01\ +\xbc\x02\xb1\xff\xd7\x01\xbc\x02\xb2\xffq\x01\xbc\x02\xb3\xff\ +\xd7\x01\xbc\x02\xb4\xffq\x01\xbc\x02\xb5\x00)\x01\xbc\x02\ +\xb6\xff\xae\x01\xbc\x02\xb8\xff\xae\x01\xbc\x02\xba\xff\xae\x01\ +\xbc\x02\xbc\xff\xd7\x01\xbc\x02\xbe\xff\xae\x01\xbc\x02\xc0\xff\ +\x9a\x01\xbc\x02\xc2\xff\x9a\x01\xbc\x02\xc4\xff\x9a\x01\xbc\x02\ +\xc5\xff\x9a\x01\xbc\x02\xc6\xffq\x01\xbc\x02\xc7\xff\x9a\x01\ +\xbc\x02\xc8\xffq\x01\xbc\x02\xcb\xff\xd7\x01\xbc\x02\xcd\xff\ +\x9a\x01\xbc\x02\xce\xff\x9a\x01\xbc\x02\xcf\xff\x85\x01\xbc\x02\ +\xd1\xff\x9a\x01\xbc\x02\xd3\xff\x9a\x01\xbc\x02\xd5\xff\x9a\x01\ +\xbc\x02\xd7\xff\x9a\x01\xbc\x02\xd9\xffq\x01\xbc\x02\xdb\xff\ +q\x01\xbc\x02\xdd\xffq\x01\xbc\x02\xe0\xffq\x01\xbc\x02\ +\xe6\xff\xd7\x01\xbc\x02\xe8\xff\xd7\x01\xbc\x02\xea\xff\xc3\x01\ +\xbc\x02\xec\xff\x9a\x01\xbc\x02\xee\xff\x9a\x01\xbc\x02\xef\xff\ +\xd7\x01\xbc\x02\xf0\xffq\x01\xbc\x02\xf1\xff\xd7\x01\xbc\x02\ +\xf2\xffq\x01\xbc\x02\xf3\xff\xd7\x01\xbc\x02\xf4\xffq\x01\ +\xbc\x02\xf6\xff\xd7\x01\xbc\x02\xf8\xff\xae\x01\xbc\x02\xfa\xff\ +\xae\x01\xbc\x02\xfc\xff\xae\x01\xbc\x02\xfe\xff\x9a\x01\xbc\x03\ +\x00\xff\x9a\x01\xbc\x03\x02\xff\x9a\x01\xbc\x03\x06\xff\xd7\x01\ +\xbc\x03\x08\xff\xd7\x01\xbc\x03\x09\xffq\x01\xbc\x03\x0a\xff\ +q\x01\xbc\x03\x0b\xffq\x01\xbc\x03\x0c\xffq\x01\xbc\x03\ +\x0e\xff\x9a\x01\xbc\x03\x10\xff\x9a\x01\xbc\x03\x11\xff\x9a\x01\ +\xbc\x03\x12\xff\x85\x01\xbc\x03\x14\xff\x9a\x01\xbc\x03\x15\xff\ +\xd7\x01\xbc\x03\x16\xffq\x01\xbc\x03\x18\xff\xae\x01\xbc\x03\ +\x1a\xffq\x01\xbc\x03\x1b\xff\x9a\x01\xbc\x03\x1c\xff\x85\x01\ +\xbd\x00\x0f\xff\x85\x01\xbd\x00\x11\xff\x85\x01\xbd\x01\x9f\xff\ +\xec\x01\xbd\x01\xa4\xff\x9a\x01\xbd\x01\xaa\xffq\x01\xbd\x01\ +\xae\xff\x9a\x01\xbd\x01\xb5\xff\x9a\x01\xbd\x01\xb8\xff\xec\x01\ +\xbd\x01\xbb\xff\xec\x01\xbd\x01\xbe\xff\xc3\x01\xbd\x01\xc9\xff\ +\xec\x01\xbd\x01\xce\xff\xae\x01\xbd\x01\xcf\xff\xd7\x01\xbd\x01\ +\xd5\xff\xae\x01\xbd\x01\xd8\xff\xd7\x01\xbd\x01\xdb\xff\xd7\x01\ +\xbd\x01\xde\xff\xd7\x01\xbd\x01\xe1\xff\xd7\x01\xbd\x01\xea\xff\ +\xd7\x01\xbd\x01\xeb\x00f\x01\xbd\x01\xed\xff\xd7\x01\xbd\x01\ +\xee\xff\xec\x01\xbd\x01\xf2\xff\xae\x01\xbd\x01\xf4\x00f\x01\ +\xbd\x02\x08\xff\x85\x01\xbd\x02\x0c\xff\x85\x01\xbd\x02j\xff\ +\xd7\x01\xbd\x02l\xff\xec\x01\xbd\x02r\xffq\x01\xbd\x02\ +s\xff\xae\x01\xbd\x02~\xff\xec\x01\xbd\x02\x7f\xff\xd7\x01\ +\xbd\x02\x84\xff\xec\x01\xbd\x02\x85\xff\xd7\x01\xbd\x02\x86\xff\ +\xec\x01\xbd\x02\x87\xff\xd7\x01\xbd\x02\x88\xff\xec\x01\xbd\x02\ +\x89\xff\xd7\x01\xbd\x02\x8a\xff\xec\x01\xbd\x02\x8c\xff\xec\x01\ +\xbd\x02\x8d\xff\xd7\x01\xbd\x02\x98\x00f\x01\xbd\x02\xa8\x00\ +f\x01\xbd\x02\xb1\xff\xec\x01\xbd\x02\xb2\xff\xd7\x01\xbd\x02\ +\xb3\xff\xec\x01\xbd\x02\xb4\xff\xd7\x01\xbd\x02\xc0\xff\xd7\x01\ +\xbd\x02\xc2\xff\xd7\x01\xbd\x02\xc5\xff\xd7\x01\xbd\x02\xc6\xff\ +\xc3\x01\xbd\x02\xc7\xff\xd7\x01\xbd\x02\xc8\xff\xc3\x01\xbd\x02\ +\xce\xff\x9a\x01\xbd\x02\xcf\xff\xae\x01\xbd\x02\xd5\xff\xd7\x01\ +\xbd\x02\xd9\xffq\x01\xbd\x02\xdb\xffq\x01\xbd\x02\xdd\xff\ +q\x01\xbd\x02\xe0\xff\xd7\x01\xbd\x02\xef\xff\xec\x01\xbd\x02\ +\xf0\xff\xd7\x01\xbd\x02\xf1\xff\xec\x01\xbd\x02\xf2\xff\xd7\x01\ +\xbd\x02\xf3\xff\xec\x01\xbd\x02\xf4\xff\xd7\x01\xbd\x02\xfe\xff\ +\xd7\x01\xbd\x03\x09\xffq\x01\xbd\x03\x0a\xff\xd7\x01\xbd\x03\ +\x0b\xffq\x01\xbd\x03\x0c\xff\xd7\x01\xbd\x03\x11\xff\x9a\x01\ +\xbd\x03\x12\xff\xae\x01\xbd\x03\x15\xff\xec\x01\xbd\x03\x16\xff\ +\xd7\x01\xbd\x03\x1a\xff\xd7\x01\xbd\x03\x1b\xff\x9a\x01\xbd\x03\ +\x1c\xff\xae\x01\xbe\x00\x0f\xff\xae\x01\xbe\x00\x11\xff\xae\x01\ +\xbe\x01\x9d\xff\xd7\x01\xbe\x01\xa4\xff\xd7\x01\xbe\x01\xa6\xff\ +\xd7\x01\xbe\x01\xa8\xff\xc3\x01\xbe\x01\xaa\xff\xd7\x01\xbe\x01\ +\xae\xff\xd7\x01\xbe\x01\xb0\xff\xd7\x01\xbe\x01\xb1\xff\xd7\x01\ +\xbe\x01\xb5\xff\xd7\x01\xbe\x01\xbc\xff\xc3\x01\xbe\x01\xbd\xff\ +\xc3\x01\xbe\x01\xbf\xff\xd7\x01\xbe\x01\xc4\xff\xd7\x01\xbe\x01\ +\xc7\xff\xd7\x01\xbe\x01\xce\xff\xec\x01\xbe\x01\xd5\xff\xec\x01\ +\xbe\x01\xf2\xff\xec\x01\xbe\x02\x08\xff\xae\x01\xbe\x02\x0c\xff\ +\xae\x01\xbe\x02r\xff\xd7\x01\xbe\x02s\xff\xec\x01\xbe\x02\ +z\xff\xd7\x01\xbe\x02\x80\xff\xec\x01\xbe\x02\x82\xff\xec\x01\ +\xbe\x02\x9f\xff\xd7\x01\xbe\x02\xa1\xff\xd7\x01\xbe\x02\xa9\xff\ +\xd7\x01\xbe\x02\xb5\xff\xc3\x01\xbe\x02\xb7\xff\xc3\x01\xbe\x02\ +\xb9\xff\xc3\x01\xbe\x02\xbb\xff\xd7\x01\xbe\x02\xbd\xff\xd7\x01\ +\xbe\x02\xca\xff\xd7\x01\xbe\x02\xce\xff\xd7\x01\xbe\x02\xcf\xff\ +\xec\x01\xbe\x02\xd9\xff\xd7\x01\xbe\x02\xdb\xff\xd7\x01\xbe\x02\ +\xdd\xff\xd7\x01\xbe\x02\xe5\xff\xd7\x01\xbe\x02\xe7\xff\xd7\x01\ +\xbe\x02\xf5\xff\xd7\x01\xbe\x02\xf7\xff\xc3\x01\xbe\x02\xf9\xff\ +\xc3\x01\xbe\x02\xfb\xff\xc3\x01\xbe\x03\x05\xff\xd7\x01\xbe\x03\ +\x07\xff\xd7\x01\xbe\x03\x0d\xff\xd7\x01\xbe\x03\x0f\xff\xd7\x01\ +\xbe\x03\x11\xff\xd7\x01\xbe\x03\x12\xff\xec\x01\xbe\x03\x17\xff\ +\xd7\x01\xbe\x03\x1b\xff\xd7\x01\xbe\x03\x1c\xff\xec\x01\xbf\x01\ +\x9f\xff\xd7\x01\xbf\x01\xb8\xff\xd7\x01\xbf\x01\xbb\xff\xd7\x01\ +\xbf\x01\xbe\xff\xd7\x01\xbf\x01\xc1\xff\xd7\x01\xbf\x01\xe1\xff\ +\xd7\x01\xbf\x02l\xff\xd7\x01\xbf\x02|\xff\xd7\x01\xbf\x02\ +~\xff\xd7\x01\xbf\x02\x84\xff\xd7\x01\xbf\x02\x86\xff\xd7\x01\ +\xbf\x02\x88\xff\xd7\x01\xbf\x02\x8a\xff\xd7\x01\xbf\x02\x8c\xff\ +\xd7\x01\xbf\x02\xb1\xff\xd7\x01\xbf\x02\xb3\xff\xd7\x01\xbf\x02\ +\xbf\xff\xd7\x01\xbf\x02\xc0\xff\xd7\x01\xbf\x02\xc1\xff\xd7\x01\ +\xbf\x02\xc2\xff\xd7\x01\xbf\x02\xc5\xff\x9a\x01\xbf\x02\xc7\xff\ +\x9a\x01\xbf\x02\xd4\xff\xd7\x01\xbf\x02\xd5\xff\xd7\x01\xbf\x02\ +\xef\xff\xd7\x01\xbf\x02\xf1\xff\xd7\x01\xbf\x02\xf3\xff\xd7\x01\ +\xbf\x02\xfd\xff\xd7\x01\xbf\x02\xfe\xff\xd7\x01\xbf\x03\x09\xff\ +\xd7\x01\xbf\x03\x0b\xff\xd7\x01\xbf\x03\x0e\xff\xd7\x01\xbf\x03\ +\x10\xff\xd7\x01\xbf\x03\x15\xff\xd7\x01\xbf\x03\x19\xff\xec\x01\ +\xc0\x01\xa3\x00\xe1\x01\xc0\x02\xea\x00)\x01\xc0\x03\x0e\xff\ +\xd7\x01\xc0\x03\x10\xff\xd7\x01\xc3\x01\xa3\x00\xe1\x01\xc3\x02\ +\xea\x00)\x01\xc3\x03\x0e\xff\xd7\x01\xc3\x03\x10\xff\xd7\x01\ +\xc4\x00\x05\xff\xae\x01\xc4\x00\x0a\xff\xae\x01\xc4\x01\x9d\xff\ +\x85\x01\xc4\x01\xa6\xff\x85\x01\xc4\x01\xa8\xff\xd7\x01\xc4\x01\ +\xbc\xff\x9a\x01\xc4\x01\xbd\xff\xd7\x01\xc4\x01\xc1\xff\x9a\x01\ +\xc4\x01\xc4\xff\x85\x01\xc4\x01\xdc\xff\xd7\x01\xc4\x01\xdd\xff\ +\xd7\x01\xc4\x01\xe1\xff\xd7\x01\xc4\x01\xe4\xff\xd7\x01\xc4\x01\ +\xf6\xff\xd7\x01\xc4\x02\x07\xff\xae\x01\xc4\x02\x0b\xff\xae\x01\ +\xc4\x02n\xff\xae\x01\xc4\x02|\xff\x9a\x01\xc4\x02\x80\xff\ +\xae\x01\xc4\x02\x82\xff\xae\x01\xc4\x02\x97\xff\xae\x01\xc4\x02\ +\x9b\xff\xae\x01\xc4\x02\xa7\xff\xae\x01\xc4\x02\xa9\xff\x85\x01\ +\xc4\x02\xaa\xff\xd7\x01\xc4\x02\xb5\xff\x9a\x01\xc4\x02\xb6\xff\ +\xd7\x01\xc4\x02\xb7\xff\x9a\x01\xc4\x02\xb8\xff\xd7\x01\xc4\x02\ +\xb9\xff\x9a\x01\xc4\x02\xba\xff\xd7\x01\xc4\x02\xbd\xff\x85\x01\ +\xc4\x02\xbe\xff\xd7\x01\xc4\x02\xbf\xff\x9a\x01\xc4\x02\xc0\xff\ +\xd7\x01\xc4\x02\xc1\xff\x9a\x01\xc4\x02\xc2\xff\xd7\x01\xc4\x02\ +\xd4\xff\x9a\x01\xc4\x02\xd5\xff\xd7\x01\xc4\x02\xf7\xff\xd7\x01\ +\xc4\x02\xf8\xff\xd7\x01\xc4\x02\xf9\xff\xd7\x01\xc4\x02\xfa\xff\ +\xd7\x01\xc4\x02\xfb\xff\xd7\x01\xc4\x02\xfc\xff\xd7\x01\xc4\x02\ +\xfd\xff\x9a\x01\xc4\x02\xfe\xff\xd7\x01\xc4\x03\x03\xff\xae\x01\ +\xc4\x03\x0d\xff\x9a\x01\xc4\x03\x0e\xff\xc3\x01\xc4\x03\x0f\xff\ +\x9a\x01\xc4\x03\x10\xff\xc3\x01\xc4\x03\x17\xff\x85\x01\xc4\x03\ +\x18\xff\xd7\x01\xc6\x00\x05\xff\xae\x01\xc6\x00\x0a\xff\xae\x01\ +\xc6\x01\x9d\xff\x85\x01\xc6\x01\xa6\xff\x85\x01\xc6\x01\xa8\xff\ +\xd7\x01\xc6\x01\xbc\xff\x9a\x01\xc6\x01\xbd\xff\xd7\x01\xc6\x01\ +\xc1\xff\x9a\x01\xc6\x01\xc4\xff\x85\x01\xc6\x01\xdc\xff\xd7\x01\ +\xc6\x01\xdd\xff\xd7\x01\xc6\x01\xe1\xff\xd7\x01\xc6\x01\xe4\xff\ +\xd7\x01\xc6\x01\xf6\xff\xd7\x01\xc6\x02\x07\xff\xae\x01\xc6\x02\ +\x0b\xff\xae\x01\xc6\x02n\xff\xae\x01\xc6\x02|\xff\x9a\x01\ +\xc6\x02\x80\xff\xae\x01\xc6\x02\x82\xff\xae\x01\xc6\x02\x97\xff\ +\xae\x01\xc6\x02\x9b\xff\xae\x01\xc6\x02\xa7\xff\xae\x01\xc6\x02\ +\xa9\xff\x85\x01\xc6\x02\xaa\xff\xd7\x01\xc6\x02\xb5\xff\x9a\x01\ +\xc6\x02\xb6\xff\xd7\x01\xc6\x02\xb7\xff\x9a\x01\xc6\x02\xb8\xff\ +\xd7\x01\xc6\x02\xb9\xff\x9a\x01\xc6\x02\xba\xff\xd7\x01\xc6\x02\ +\xbd\xff\x85\x01\xc6\x02\xbe\xff\xd7\x01\xc6\x02\xbf\xff\x9a\x01\ +\xc6\x02\xc0\xff\xd7\x01\xc6\x02\xc1\xff\x9a\x01\xc6\x02\xc2\xff\ +\xd7\x01\xc6\x02\xd4\xff\x9a\x01\xc6\x02\xd5\xff\xd7\x01\xc6\x02\ +\xf7\xff\xd7\x01\xc6\x02\xf8\xff\xd7\x01\xc6\x02\xf9\xff\xd7\x01\ +\xc6\x02\xfa\xff\xd7\x01\xc6\x02\xfb\xff\xd7\x01\xc6\x02\xfc\xff\ +\xd7\x01\xc6\x02\xfd\xff\x9a\x01\xc6\x02\xfe\xff\xd7\x01\xc6\x03\ +\x03\xff\xae\x01\xc6\x03\x0d\xff\x9a\x01\xc6\x03\x0e\xff\xc3\x01\ +\xc6\x03\x0f\xff\x9a\x01\xc6\x03\x10\xff\xc3\x01\xc6\x03\x17\xff\ +\x85\x01\xc6\x03\x18\xff\xd7\x01\xc7\x00\x0f\xff\xae\x01\xc7\x00\ +\x11\xff\xae\x01\xc7\x01\x9d\xff\xec\x01\xc7\x01\xa4\xff\xd7\x01\ +\xc7\x01\xa6\xff\xec\x01\xc7\x01\xa8\xff\xd7\x01\xc7\x01\xaa\xff\ +\xd7\x01\xc7\x01\xae\xff\xd7\x01\xc7\x01\xb0\xff\xd7\x01\xc7\x01\ +\xb1\xff\xec\x01\xc7\x01\xb5\xff\xd7\x01\xc7\x01\xbc\xff\xc3\x01\ +\xc7\x01\xbd\xff\xd7\x01\xc7\x01\xbf\xff\xd7\x01\xc7\x01\xc1\xff\ +\xd7\x01\xc7\x01\xc4\xff\xec\x01\xc7\x01\xc7\xff\xec\x01\xc7\x01\ +\xce\xff\xec\x01\xc7\x01\xd5\xff\xec\x01\xc7\x01\xf2\xff\xec\x01\ +\xc7\x02\x08\xff\xae\x01\xc7\x02\x0c\xff\xae\x01\xc7\x02r\xff\ +\xd7\x01\xc7\x02s\xff\xec\x01\xc7\x02z\xff\xec\x01\xc7\x02\ +|\xff\xd7\x01\xc7\x02\x80\xff\xec\x01\xc7\x02\x82\xff\xec\x01\ +\xc7\x02\x9f\xff\xd7\x01\xc7\x02\xa1\xff\xec\x01\xc7\x02\xa9\xff\ +\xec\x01\xc7\x02\xb5\xff\xc3\x01\xc7\x02\xb7\xff\xec\x01\xc7\x02\ +\xb9\xff\xec\x01\xc7\x02\xbb\xff\xd7\x01\xc7\x02\xbd\xff\xec\x01\ +\xc7\x02\xbf\xff\xd7\x01\xc7\x02\xc1\xff\xd7\x01\xc7\x02\xca\xff\ +\xd7\x01\xc7\x02\xce\xff\xd7\x01\xc7\x02\xcf\xff\xec\x01\xc7\x02\ +\xd4\xff\xd7\x01\xc7\x02\xd9\xff\xd7\x01\xc7\x02\xdb\xff\xd7\x01\ +\xc7\x02\xdd\xff\xd7\x01\xc7\x02\xe5\xff\xd7\x01\xc7\x02\xe7\xff\ +\xec\x01\xc7\x02\xf5\xff\xec\x01\xc7\x02\xf7\xff\xd7\x01\xc7\x02\ +\xf9\xff\xd7\x01\xc7\x02\xfb\xff\xd7\x01\xc7\x02\xfd\xff\xd7\x01\ +\xc7\x03\x05\xff\xd7\x01\xc7\x03\x07\xff\xd7\x01\xc7\x03\x0d\xff\ +\xd7\x01\xc7\x03\x0f\xff\xd7\x01\xc7\x03\x11\xff\xd7\x01\xc7\x03\ +\x12\xff\xec\x01\xc7\x03\x17\xff\xec\x01\xc7\x03\x1b\xff\xd7\x01\ +\xc7\x03\x1c\xff\xec\x01\xc8\x00\x0f\xff\xae\x01\xc8\x00\x11\xff\ +\xae\x01\xc8\x01\x9d\xff\xec\x01\xc8\x01\xa4\xff\xd7\x01\xc8\x01\ +\xa6\xff\xec\x01\xc8\x01\xa8\xff\xd7\x01\xc8\x01\xaa\xff\xd7\x01\ +\xc8\x01\xae\xff\xd7\x01\xc8\x01\xb0\xff\xd7\x01\xc8\x01\xb1\xff\ +\xec\x01\xc8\x01\xb5\xff\xd7\x01\xc8\x01\xbc\xff\xc3\x01\xc8\x01\ +\xbd\xff\xd7\x01\xc8\x01\xbf\xff\xd7\x01\xc8\x01\xc1\xff\xd7\x01\ +\xc8\x01\xc4\xff\xec\x01\xc8\x01\xc7\xff\xec\x01\xc8\x01\xce\xff\ +\xec\x01\xc8\x01\xd5\xff\xec\x01\xc8\x01\xf2\xff\xec\x01\xc8\x02\ +\x08\xff\xae\x01\xc8\x02\x0c\xff\xae\x01\xc8\x02r\xff\xd7\x01\ +\xc8\x02s\xff\xec\x01\xc8\x02z\xff\xec\x01\xc8\x02|\xff\ +\xd7\x01\xc8\x02\x80\xff\xec\x01\xc8\x02\x82\xff\xec\x01\xc8\x02\ +\x9f\xff\xd7\x01\xc8\x02\xa1\xff\xec\x01\xc8\x02\xa9\xff\xec\x01\ +\xc8\x02\xb5\xff\xc3\x01\xc8\x02\xb7\xff\xec\x01\xc8\x02\xb9\xff\ +\xec\x01\xc8\x02\xbb\xff\xd7\x01\xc8\x02\xbd\xff\xec\x01\xc8\x02\ +\xbf\xff\xd7\x01\xc8\x02\xc1\xff\xd7\x01\xc8\x02\xca\xff\xd7\x01\ +\xc8\x02\xce\xff\xd7\x01\xc8\x02\xcf\xff\xec\x01\xc8\x02\xd4\xff\ +\xd7\x01\xc8\x02\xd9\xff\xd7\x01\xc8\x02\xdb\xff\xd7\x01\xc8\x02\ +\xdd\xff\xd7\x01\xc8\x02\xe5\xff\xd7\x01\xc8\x02\xe7\xff\xec\x01\ +\xc8\x02\xf5\xff\xec\x01\xc8\x02\xf7\xff\xd7\x01\xc8\x02\xf9\xff\ +\xd7\x01\xc8\x02\xfb\xff\xd7\x01\xc8\x02\xfd\xff\xd7\x01\xc8\x03\ +\x05\xff\xd7\x01\xc8\x03\x07\xff\xd7\x01\xc8\x03\x0d\xff\xd7\x01\ +\xc8\x03\x0f\xff\xd7\x01\xc8\x03\x11\xff\xd7\x01\xc8\x03\x12\xff\ +\xec\x01\xc8\x03\x17\xff\xec\x01\xc8\x03\x1b\xff\xd7\x01\xc8\x03\ +\x1c\xff\xec\x01\xca\x00\x05\xff\xec\x01\xca\x00\x0a\xff\xec\x01\ +\xca\x02\x07\xff\xec\x01\xca\x02\x0b\xff\xec\x01\xcc\x01\xe9\x00\ +)\x01\xcd\x00\x0f\xff\x9a\x01\xcd\x00\x10\xff\xd7\x01\xcd\x00\ +\x11\xff\x9a\x01\xcd\x01\xce\xff\xc3\x01\xcd\x01\xcf\xff\xec\x01\ +\xcd\x01\xd5\xff\xc3\x01\xcd\x01\xd8\xff\xec\x01\xcd\x01\xdb\xff\ +\xec\x01\xcd\x01\xde\xff\xec\x01\xcd\x01\xea\xff\xec\x01\xcd\x01\ +\xed\xff\xec\x01\xcd\x01\xf2\xff\xc3\x01\xcd\x02\x02\xff\xd7\x01\ +\xcd\x02\x03\xff\xd7\x01\xcd\x02\x04\xff\xd7\x01\xcd\x02\x08\xff\ +\x9a\x01\xcd\x02\x0c\xff\x9a\x01\xcd\x02j\xff\xec\x01\xcd\x02\ +s\xff\xc3\x01\xcd\x02\x7f\xff\xec\x01\xcd\x02\x85\xff\xec\x01\ +\xcd\x02\x87\xff\xec\x01\xcd\x02\x89\xff\xec\x01\xcd\x02\x8d\xff\ +\xec\x01\xcd\x02\xb2\xff\xec\x01\xcd\x02\xb4\xff\xec\x01\xcd\x02\ +\xcf\xff\xc3\x01\xcd\x02\xe0\xff\xec\x01\xcd\x02\xf0\xff\xec\x01\ +\xcd\x02\xf2\xff\xec\x01\xcd\x02\xf4\xff\xec\x01\xcd\x03\x0a\xff\ +\xec\x01\xcd\x03\x0c\xff\xec\x01\xcd\x03\x12\xff\xc3\x01\xcd\x03\ +\x16\xff\xec\x01\xcd\x03\x1a\xff\xec\x01\xcd\x03\x1c\xff\xc3\x01\ +\xce\x00\x05\xff\xec\x01\xce\x00\x0a\xff\xec\x01\xce\x02\x07\xff\ +\xec\x01\xce\x02\x0b\xff\xec\x01\xcf\x00\x05\xff\xec\x01\xcf\x00\ +\x0a\xff\xec\x01\xcf\x02\x07\xff\xec\x01\xcf\x02\x0b\xff\xec\x01\ +\xd0\x01\xcf\xff\xd7\x01\xd0\x01\xd8\xff\xd7\x01\xd0\x01\xdb\xff\ +\xd7\x01\xd0\x01\xde\xff\xd7\x01\xd0\x01\xe1\xff\xd7\x01\xd0\x01\ +\xea\xff\xd7\x01\xd0\x01\xed\xff\xd7\x01\xd0\x02j\xff\xd7\x01\ +\xd0\x02\x7f\xff\xd7\x01\xd0\x02\x85\xff\xd7\x01\xd0\x02\x87\xff\ +\xd7\x01\xd0\x02\x89\xff\xd7\x01\xd0\x02\x8d\xff\xd7\x01\xd0\x02\ +\xb2\xff\xd7\x01\xd0\x02\xb4\xff\xd7\x01\xd0\x02\xc0\xff\xd7\x01\ +\xd0\x02\xc2\xff\xd7\x01\xd0\x02\xc6\xff\xd7\x01\xd0\x02\xc8\xff\ +\xd7\x01\xd0\x02\xd5\xff\xd7\x01\xd0\x02\xe0\xff\xd7\x01\xd0\x02\ +\xf0\xff\xd7\x01\xd0\x02\xf2\xff\xd7\x01\xd0\x02\xf4\xff\xd7\x01\ +\xd0\x02\xfe\xff\xd7\x01\xd0\x03\x0a\xff\xd7\x01\xd0\x03\x0c\xff\ +\xd7\x01\xd0\x03\x16\xff\xd7\x01\xd0\x03\x1a\xff\xd7\x01\xd1\x01\ +\xe9\x00)\x01\xd4\x01\xcf\xff\xd7\x01\xd4\x01\xd8\xff\xd7\x01\ +\xd4\x01\xdb\xff\xd7\x01\xd4\x01\xde\xff\xd7\x01\xd4\x01\xe1\xff\ +\xd7\x01\xd4\x01\xea\xff\xd7\x01\xd4\x01\xed\xff\xd7\x01\xd4\x02\ +j\xff\xd7\x01\xd4\x02\x7f\xff\xd7\x01\xd4\x02\x85\xff\xd7\x01\ +\xd4\x02\x87\xff\xd7\x01\xd4\x02\x89\xff\xd7\x01\xd4\x02\x8d\xff\ +\xd7\x01\xd4\x02\xb2\xff\xd7\x01\xd4\x02\xb4\xff\xd7\x01\xd4\x02\ +\xc0\xff\xd7\x01\xd4\x02\xc2\xff\xd7\x01\xd4\x02\xc6\xff\xd7\x01\ +\xd4\x02\xc8\xff\xd7\x01\xd4\x02\xd5\xff\xd7\x01\xd4\x02\xe0\xff\ +\xd7\x01\xd4\x02\xf0\xff\xd7\x01\xd4\x02\xf2\xff\xd7\x01\xd4\x02\ +\xf4\xff\xd7\x01\xd4\x02\xfe\xff\xd7\x01\xd4\x03\x0a\xff\xd7\x01\ +\xd4\x03\x0c\xff\xd7\x01\xd4\x03\x16\xff\xd7\x01\xd4\x03\x1a\xff\ +\xd7\x01\xd8\x00\x05\xff\xec\x01\xd8\x00\x0a\xff\xec\x01\xd8\x01\ +\xd0\xff\xd7\x01\xd8\x01\xdc\xff\xec\x01\xd8\x01\xdd\xff\xec\x01\ +\xd8\x01\xdf\xff\xd7\x01\xd8\x01\xe1\xff\xec\x01\xd8\x01\xe4\xff\ +\xec\x01\xd8\x01\xf6\xff\xec\x01\xd8\x02\x07\xff\xec\x01\xd8\x02\ +\x0b\xff\xec\x01\xd8\x02\xa0\xff\xd7\x01\xd8\x02\xaa\xff\xec\x01\ +\xd8\x02\xb6\xff\xec\x01\xd8\x02\xbc\xff\xd7\x01\xd8\x02\xbe\xff\ +\xec\x01\xd8\x02\xc0\xff\xec\x01\xd8\x02\xc2\xff\xec\x01\xd8\x02\ +\xcb\xff\xd7\x01\xd8\x02\xd5\xff\xec\x01\xd8\x02\xe6\xff\xd7\x01\ +\xd8\x02\xf8\xff\xec\x01\xd8\x02\xfa\xff\xec\x01\xd8\x02\xfc\xff\ +\xec\x01\xd8\x02\xfe\xff\xec\x01\xd8\x03\x06\xff\xd7\x01\xd8\x03\ +\x08\xff\xd7\x01\xd8\x03\x0e\xff\xec\x01\xd8\x03\x10\xff\xec\x01\ +\xd8\x03\x18\xff\xec\x01\xda\x00\x05\xff\xec\x01\xda\x00\x0a\xff\ +\xec\x01\xda\x01\xd0\xff\xd7\x01\xda\x01\xdc\xff\xec\x01\xda\x01\ +\xdd\xff\xec\x01\xda\x01\xdf\xff\xd7\x01\xda\x01\xe1\xff\xec\x01\ +\xda\x01\xe4\xff\xec\x01\xda\x01\xf6\xff\xec\x01\xda\x02\x07\xff\ +\xec\x01\xda\x02\x0b\xff\xec\x01\xda\x02\xa0\xff\xd7\x01\xda\x02\ +\xaa\xff\xec\x01\xda\x02\xb6\xff\xec\x01\xda\x02\xbc\xff\xd7\x01\ +\xda\x02\xbe\xff\xec\x01\xda\x02\xc0\xff\xec\x01\xda\x02\xc2\xff\ +\xec\x01\xda\x02\xcb\xff\xd7\x01\xda\x02\xd5\xff\xec\x01\xda\x02\ +\xe6\xff\xd7\x01\xda\x02\xf8\xff\xec\x01\xda\x02\xfa\xff\xec\x01\ +\xda\x02\xfc\xff\xec\x01\xda\x02\xfe\xff\xec\x01\xda\x03\x06\xff\ +\xd7\x01\xda\x03\x08\xff\xd7\x01\xda\x03\x0e\xff\xec\x01\xda\x03\ +\x10\xff\xec\x01\xda\x03\x18\xff\xec\x01\xdc\x00\x0f\xff\x9a\x01\ +\xdc\x00\x10\xff\xd7\x01\xdc\x00\x11\xff\x9a\x01\xdc\x01\xce\xff\ +\xc3\x01\xdc\x01\xcf\xff\xec\x01\xdc\x01\xd5\xff\xc3\x01\xdc\x01\ +\xd8\xff\xec\x01\xdc\x01\xdb\xff\xec\x01\xdc\x01\xde\xff\xec\x01\ +\xdc\x01\xea\xff\xec\x01\xdc\x01\xed\xff\xec\x01\xdc\x01\xf2\xff\ +\xc3\x01\xdc\x02\x02\xff\xd7\x01\xdc\x02\x03\xff\xd7\x01\xdc\x02\ +\x04\xff\xd7\x01\xdc\x02\x08\xff\x9a\x01\xdc\x02\x0c\xff\x9a\x01\ +\xdc\x02j\xff\xec\x01\xdc\x02s\xff\xc3\x01\xdc\x02\x7f\xff\ +\xec\x01\xdc\x02\x85\xff\xec\x01\xdc\x02\x87\xff\xec\x01\xdc\x02\ +\x89\xff\xec\x01\xdc\x02\x8d\xff\xec\x01\xdc\x02\xb2\xff\xec\x01\ +\xdc\x02\xb4\xff\xec\x01\xdc\x02\xcf\xff\xc3\x01\xdc\x02\xe0\xff\ +\xec\x01\xdc\x02\xf0\xff\xec\x01\xdc\x02\xf2\xff\xec\x01\xdc\x02\ +\xf4\xff\xec\x01\xdc\x03\x0a\xff\xec\x01\xdc\x03\x0c\xff\xec\x01\ +\xdc\x03\x12\xff\xc3\x01\xdc\x03\x16\xff\xec\x01\xdc\x03\x1a\xff\ +\xec\x01\xdc\x03\x1c\xff\xc3\x01\xdd\x00\x0f\xff\xae\x01\xdd\x00\ +\x11\xff\xae\x01\xdd\x01\xce\xff\xd7\x01\xdd\x01\xd5\xff\xd7\x01\ +\xdd\x01\xf2\xff\xd7\x01\xdd\x02\x08\xff\xae\x01\xdd\x02\x0c\xff\ +\xae\x01\xdd\x02s\xff\xd7\x01\xdd\x02\xcf\xff\xd7\x01\xdd\x03\ +\x12\xff\xd7\x01\xdd\x03\x1c\xff\xd7\x01\xde\x00\x05\xff\xec\x01\ +\xde\x00\x0a\xff\xec\x01\xde\x01\xd0\xff\xd7\x01\xde\x01\xdc\xff\ +\xec\x01\xde\x01\xdd\xff\xec\x01\xde\x01\xdf\xff\xd7\x01\xde\x01\ +\xe1\xff\xec\x01\xde\x01\xe4\xff\xec\x01\xde\x01\xf6\xff\xec\x01\ +\xde\x02\x07\xff\xec\x01\xde\x02\x0b\xff\xec\x01\xde\x02\xa0\xff\ +\xd7\x01\xde\x02\xaa\xff\xec\x01\xde\x02\xb6\xff\xec\x01\xde\x02\ +\xbc\xff\xd7\x01\xde\x02\xbe\xff\xec\x01\xde\x02\xc0\xff\xec\x01\ +\xde\x02\xc2\xff\xec\x01\xde\x02\xcb\xff\xd7\x01\xde\x02\xd5\xff\ +\xec\x01\xde\x02\xe6\xff\xd7\x01\xde\x02\xf8\xff\xec\x01\xde\x02\ +\xfa\xff\xec\x01\xde\x02\xfc\xff\xec\x01\xde\x02\xfe\xff\xec\x01\ +\xde\x03\x06\xff\xd7\x01\xde\x03\x08\xff\xd7\x01\xde\x03\x0e\xff\ +\xec\x01\xde\x03\x10\xff\xec\x01\xde\x03\x18\xff\xec\x01\xdf\x01\ +\xcf\xff\xd7\x01\xdf\x01\xd8\xff\xd7\x01\xdf\x01\xdb\xff\xd7\x01\ +\xdf\x01\xde\xff\xd7\x01\xdf\x01\xe1\xff\xd7\x01\xdf\x01\xea\xff\ +\xd7\x01\xdf\x01\xed\xff\xd7\x01\xdf\x02j\xff\xd7\x01\xdf\x02\ +\x7f\xff\xd7\x01\xdf\x02\x85\xff\xd7\x01\xdf\x02\x87\xff\xd7\x01\ +\xdf\x02\x89\xff\xd7\x01\xdf\x02\x8d\xff\xd7\x01\xdf\x02\xb2\xff\ +\xd7\x01\xdf\x02\xb4\xff\xd7\x01\xdf\x02\xc0\xff\xd7\x01\xdf\x02\ +\xc2\xff\xd7\x01\xdf\x02\xc6\xff\xd7\x01\xdf\x02\xc8\xff\xd7\x01\ +\xdf\x02\xd5\xff\xd7\x01\xdf\x02\xe0\xff\xd7\x01\xdf\x02\xf0\xff\ +\xd7\x01\xdf\x02\xf2\xff\xd7\x01\xdf\x02\xf4\xff\xd7\x01\xdf\x02\ +\xfe\xff\xd7\x01\xdf\x03\x0a\xff\xd7\x01\xdf\x03\x0c\xff\xd7\x01\ +\xdf\x03\x16\xff\xd7\x01\xdf\x03\x1a\xff\xd7\x01\xe0\x00\x05\xff\ +\xec\x01\xe0\x00\x0a\xff\xec\x01\xe0\x02\x07\xff\xec\x01\xe0\x02\ +\x0b\xff\xec\x01\xe3\x00\x05\xff\xec\x01\xe3\x00\x0a\xff\xec\x01\ +\xe3\x02\x07\xff\xec\x01\xe3\x02\x0b\xff\xec\x01\xe4\x00\x05\xff\ +\x85\x01\xe4\x00\x0a\xff\x85\x01\xe4\x01\xd0\xff\xd7\x01\xe4\x01\ +\xdc\xff\x9a\x01\xe4\x01\xdd\xff\xc3\x01\xe4\x01\xdf\xff\xd7\x01\ +\xe4\x01\xe1\xff\xae\x01\xe4\x01\xe4\xff\x9a\x01\xe4\x01\xf6\xff\ +\xc3\x01\xe4\x02\x07\xff\x85\x01\xe4\x02\x0b\xff\x85\x01\xe4\x02\ +m\xff\xd7\x01\xe4\x02\x81\xff\xd7\x01\xe4\x02\x83\xff\xd7\x01\ +\xe4\x02\x8b\xff\xd7\x01\xe4\x02\xa0\xff\xd7\x01\xe4\x02\xaa\xff\ +\x9a\x01\xe4\x02\xb6\xff\x9a\x01\xe4\x02\xb8\xff\xc3\x01\xe4\x02\ +\xba\xff\xc3\x01\xe4\x02\xbc\xff\xd7\x01\xe4\x02\xbe\xff\x9a\x01\ +\xe4\x02\xc0\xff\xae\x01\xe4\x02\xc2\xff\xae\x01\xe4\x02\xc6\xff\ +\xd7\x01\xe4\x02\xc8\xff\xd7\x01\xe4\x02\xcb\xff\xd7\x01\xe4\x02\ +\xd5\xff\xae\x01\xe4\x02\xe6\xff\xd7\x01\xe4\x02\xea\xff\xd7\x01\ +\xe4\x02\xf8\xff\xc3\x01\xe4\x02\xfa\xff\xc3\x01\xe4\x02\xfc\xff\ +\xc3\x01\xe4\x02\xfe\xff\xae\x01\xe4\x03\x06\xff\xd7\x01\xe4\x03\ +\x08\xff\xd7\x01\xe4\x03\x0e\xff\x9a\x01\xe4\x03\x10\xff\x9a\x01\ +\xe4\x03\x18\xff\x9a\x01\xe6\x00\x05\xff\x85\x01\xe6\x00\x0a\xff\ +\x85\x01\xe6\x01\xd0\xff\xd7\x01\xe6\x01\xdc\xff\x9a\x01\xe6\x01\ +\xdd\xff\xc3\x01\xe6\x01\xdf\xff\xd7\x01\xe6\x01\xe1\xff\xae\x01\ +\xe6\x01\xe4\xff\x9a\x01\xe6\x01\xf6\xff\xc3\x01\xe6\x02\x07\xff\ +\x85\x01\xe6\x02\x0b\xff\x85\x01\xe6\x02m\xff\xd7\x01\xe6\x02\ +\x81\xff\xd7\x01\xe6\x02\x83\xff\xd7\x01\xe6\x02\x8b\xff\xd7\x01\ +\xe6\x02\xa0\xff\xd7\x01\xe6\x02\xaa\xff\x9a\x01\xe6\x02\xb6\xff\ +\x9a\x01\xe6\x02\xb8\xff\xc3\x01\xe6\x02\xba\xff\xc3\x01\xe6\x02\ +\xbc\xff\xd7\x01\xe6\x02\xbe\xff\x9a\x01\xe6\x02\xc0\xff\xae\x01\ +\xe6\x02\xc2\xff\xae\x01\xe6\x02\xc6\xff\xd7\x01\xe6\x02\xc8\xff\ +\xd7\x01\xe6\x02\xcb\xff\xd7\x01\xe6\x02\xd5\xff\xae\x01\xe6\x02\ +\xe6\xff\xd7\x01\xe6\x02\xea\xff\xd7\x01\xe6\x02\xf8\xff\xc3\x01\ +\xe6\x02\xfa\xff\xc3\x01\xe6\x02\xfc\xff\xc3\x01\xe6\x02\xfe\xff\ +\xae\x01\xe6\x03\x06\xff\xd7\x01\xe6\x03\x08\xff\xd7\x01\xe6\x03\ +\x0e\xff\x9a\x01\xe6\x03\x10\xff\x9a\x01\xe6\x03\x18\xff\x9a\x01\ +\xe7\x00\x05\xff\xec\x01\xe7\x00\x0a\xff\xec\x01\xe7\x01\xd0\xff\ +\xd7\x01\xe7\x01\xdc\xff\xec\x01\xe7\x01\xdd\xff\xec\x01\xe7\x01\ +\xdf\xff\xd7\x01\xe7\x01\xe1\xff\xec\x01\xe7\x01\xe4\xff\xec\x01\ +\xe7\x01\xf6\xff\xec\x01\xe7\x02\x07\xff\xec\x01\xe7\x02\x0b\xff\ +\xec\x01\xe7\x02\xa0\xff\xd7\x01\xe7\x02\xaa\xff\xec\x01\xe7\x02\ +\xb6\xff\xec\x01\xe7\x02\xbc\xff\xd7\x01\xe7\x02\xbe\xff\xec\x01\ +\xe7\x02\xc0\xff\xec\x01\xe7\x02\xc2\xff\xec\x01\xe7\x02\xcb\xff\ +\xd7\x01\xe7\x02\xd5\xff\xec\x01\xe7\x02\xe6\xff\xd7\x01\xe7\x02\ +\xf8\xff\xec\x01\xe7\x02\xfa\xff\xec\x01\xe7\x02\xfc\xff\xec\x01\ +\xe7\x02\xfe\xff\xec\x01\xe7\x03\x06\xff\xd7\x01\xe7\x03\x08\xff\ +\xd7\x01\xe7\x03\x0e\xff\xec\x01\xe7\x03\x10\xff\xec\x01\xe7\x03\ +\x18\xff\xec\x01\xe8\x00\x05\xff\xec\x01\xe8\x00\x0a\xff\xec\x01\ +\xe8\x01\xd0\xff\xd7\x01\xe8\x01\xdc\xff\xec\x01\xe8\x01\xdd\xff\ +\xec\x01\xe8\x01\xdf\xff\xd7\x01\xe8\x01\xe1\xff\xec\x01\xe8\x01\ +\xe4\xff\xec\x01\xe8\x01\xf6\xff\xec\x01\xe8\x02\x07\xff\xec\x01\ +\xe8\x02\x0b\xff\xec\x01\xe8\x02\xa0\xff\xd7\x01\xe8\x02\xaa\xff\ +\xec\x01\xe8\x02\xb6\xff\xec\x01\xe8\x02\xbc\xff\xd7\x01\xe8\x02\ +\xbe\xff\xec\x01\xe8\x02\xc0\xff\xec\x01\xe8\x02\xc2\xff\xec\x01\ +\xe8\x02\xcb\xff\xd7\x01\xe8\x02\xd5\xff\xec\x01\xe8\x02\xe6\xff\ +\xd7\x01\xe8\x02\xf8\xff\xec\x01\xe8\x02\xfa\xff\xec\x01\xe8\x02\ +\xfc\xff\xec\x01\xe8\x02\xfe\xff\xec\x01\xe8\x03\x06\xff\xd7\x01\ +\xe8\x03\x08\xff\xd7\x01\xe8\x03\x0e\xff\xec\x01\xe8\x03\x10\xff\ +\xec\x01\xe8\x03\x18\xff\xec\x01\xea\x00\x05\xff\xec\x01\xea\x00\ +\x0a\xff\xec\x01\xea\x02\x07\xff\xec\x01\xea\x02\x0b\xff\xec\x01\ +\xeb\x00\x05\xff\xec\x01\xeb\x00\x0a\xff\xec\x01\xeb\x02\x07\xff\ +\xec\x01\xeb\x02\x0b\xff\xec\x01\xeb\x03\x0e\xff\xd7\x01\xeb\x03\ +\x10\xff\xd7\x01\xec\x00\x0f\xff\x9a\x01\xec\x00\x10\xff\xd7\x01\ +\xec\x00\x11\xff\x9a\x01\xec\x01\xce\xff\xc3\x01\xec\x01\xcf\xff\ +\xec\x01\xec\x01\xd5\xff\xc3\x01\xec\x01\xd8\xff\xec\x01\xec\x01\ +\xdb\xff\xec\x01\xec\x01\xde\xff\xec\x01\xec\x01\xea\xff\xec\x01\ +\xec\x01\xed\xff\xec\x01\xec\x01\xf2\xff\xc3\x01\xec\x02\x02\xff\ +\xd7\x01\xec\x02\x03\xff\xd7\x01\xec\x02\x04\xff\xd7\x01\xec\x02\ +\x08\xff\x9a\x01\xec\x02\x0c\xff\x9a\x01\xec\x02j\xff\xec\x01\ +\xec\x02s\xff\xc3\x01\xec\x02\x7f\xff\xec\x01\xec\x02\x85\xff\ +\xec\x01\xec\x02\x87\xff\xec\x01\xec\x02\x89\xff\xec\x01\xec\x02\ +\x8d\xff\xec\x01\xec\x02\xb2\xff\xec\x01\xec\x02\xb4\xff\xec\x01\ +\xec\x02\xcf\xff\xc3\x01\xec\x02\xe0\xff\xec\x01\xec\x02\xf0\xff\ +\xec\x01\xec\x02\xf2\xff\xec\x01\xec\x02\xf4\xff\xec\x01\xec\x03\ +\x0a\xff\xec\x01\xec\x03\x0c\xff\xec\x01\xec\x03\x12\xff\xc3\x01\ +\xec\x03\x16\xff\xec\x01\xec\x03\x1a\xff\xec\x01\xec\x03\x1c\xff\ +\xc3\x01\xf2\x00\x05\xff\x85\x01\xf2\x00\x0a\xff\x85\x01\xf2\x01\ +\xd0\xff\xd7\x01\xf2\x01\xdc\xff\x9a\x01\xf2\x01\xdd\xff\xc3\x01\ +\xf2\x01\xdf\xff\xd7\x01\xf2\x01\xe1\xff\xae\x01\xf2\x01\xe4\xff\ +\x9a\x01\xf2\x01\xf6\xff\xc3\x01\xf2\x02\x07\xff\x85\x01\xf2\x02\ +\x0b\xff\x85\x01\xf2\x02m\xff\xd7\x01\xf2\x02\x81\xff\xd7\x01\ +\xf2\x02\x83\xff\xd7\x01\xf2\x02\x8b\xff\xd7\x01\xf2\x02\xa0\xff\ +\xd7\x01\xf2\x02\xaa\xff\x9a\x01\xf2\x02\xb6\xff\x9a\x01\xf2\x02\ +\xb8\xff\xc3\x01\xf2\x02\xba\xff\xc3\x01\xf2\x02\xbc\xff\xd7\x01\ +\xf2\x02\xbe\xff\x9a\x01\xf2\x02\xc0\xff\xae\x01\xf2\x02\xc2\xff\ +\xae\x01\xf2\x02\xc6\xff\xd7\x01\xf2\x02\xc8\xff\xd7\x01\xf2\x02\ +\xcb\xff\xd7\x01\xf2\x02\xd5\xff\xae\x01\xf2\x02\xe6\xff\xd7\x01\ +\xf2\x02\xea\xff\xd7\x01\xf2\x02\xf8\xff\xc3\x01\xf2\x02\xfa\xff\ +\xc3\x01\xf2\x02\xfc\xff\xc3\x01\xf2\x02\xfe\xff\xae\x01\xf2\x03\ +\x06\xff\xd7\x01\xf2\x03\x08\xff\xd7\x01\xf2\x03\x0e\xff\x9a\x01\ +\xf2\x03\x10\xff\x9a\x01\xf2\x03\x18\xff\x9a\x01\xf3\x00\x05\xff\ +\x85\x01\xf3\x00\x0a\xff\x85\x01\xf3\x01\xd0\xff\xd7\x01\xf3\x01\ +\xdc\xff\x9a\x01\xf3\x01\xdd\xff\xc3\x01\xf3\x01\xdf\xff\xd7\x01\ +\xf3\x01\xe1\xff\xae\x01\xf3\x01\xe4\xff\x9a\x01\xf3\x01\xf6\xff\ +\xc3\x01\xf3\x02\x07\xff\x85\x01\xf3\x02\x0b\xff\x85\x01\xf3\x02\ +m\xff\xd7\x01\xf3\x02\x81\xff\xd7\x01\xf3\x02\x83\xff\xd7\x01\ +\xf3\x02\x8b\xff\xd7\x01\xf3\x02\xa0\xff\xd7\x01\xf3\x02\xaa\xff\ +\x9a\x01\xf3\x02\xb6\xff\x9a\x01\xf3\x02\xb8\xff\xc3\x01\xf3\x02\ +\xba\xff\xc3\x01\xf3\x02\xbc\xff\xd7\x01\xf3\x02\xbe\xff\x9a\x01\ +\xf3\x02\xc0\xff\xae\x01\xf3\x02\xc2\xff\xae\x01\xf3\x02\xc6\xff\ +\xd7\x01\xf3\x02\xc8\xff\xd7\x01\xf3\x02\xcb\xff\xd7\x01\xf3\x02\ +\xd5\xff\xae\x01\xf3\x02\xe6\xff\xd7\x01\xf3\x02\xea\xff\xd7\x01\ +\xf3\x02\xf8\xff\xc3\x01\xf3\x02\xfa\xff\xc3\x01\xf3\x02\xfc\xff\ +\xc3\x01\xf3\x02\xfe\xff\xae\x01\xf3\x03\x06\xff\xd7\x01\xf3\x03\ +\x08\xff\xd7\x01\xf3\x03\x0e\xff\x9a\x01\xf3\x03\x10\xff\x9a\x01\ +\xf3\x03\x18\xff\x9a\x01\xf4\x00\x05\xff\xec\x01\xf4\x00\x0a\xff\ +\xec\x01\xf4\x02\x07\xff\xec\x01\xf4\x02\x0b\xff\xec\x01\xf4\x03\ +\x0e\xff\xd7\x01\xf4\x03\x10\xff\xd7\x01\xf5\x01\xcf\xff\xd7\x01\ +\xf5\x01\xd8\xff\xd7\x01\xf5\x01\xdb\xff\xd7\x01\xf5\x01\xde\xff\ +\xd7\x01\xf5\x01\xe1\xff\xd7\x01\xf5\x01\xea\xff\xd7\x01\xf5\x01\ +\xed\xff\xd7\x01\xf5\x02j\xff\xd7\x01\xf5\x02\x7f\xff\xd7\x01\ +\xf5\x02\x85\xff\xd7\x01\xf5\x02\x87\xff\xd7\x01\xf5\x02\x89\xff\ +\xd7\x01\xf5\x02\x8d\xff\xd7\x01\xf5\x02\xb2\xff\xd7\x01\xf5\x02\ +\xb4\xff\xd7\x01\xf5\x02\xc0\xff\xd7\x01\xf5\x02\xc2\xff\xd7\x01\ +\xf5\x02\xc6\xff\xd7\x01\xf5\x02\xc8\xff\xd7\x01\xf5\x02\xd5\xff\ +\xd7\x01\xf5\x02\xe0\xff\xd7\x01\xf5\x02\xf0\xff\xd7\x01\xf5\x02\ +\xf2\xff\xd7\x01\xf5\x02\xf4\xff\xd7\x01\xf5\x02\xfe\xff\xd7\x01\ +\xf5\x03\x0a\xff\xd7\x01\xf5\x03\x0c\xff\xd7\x01\xf5\x03\x16\xff\ +\xd7\x01\xf5\x03\x1a\xff\xd7\x01\xf6\x00\x0f\xff\xae\x01\xf6\x00\ +\x11\xff\xae\x01\xf6\x01\xce\xff\xd7\x01\xf6\x01\xd5\xff\xd7\x01\ +\xf6\x01\xf2\xff\xd7\x01\xf6\x02\x08\xff\xae\x01\xf6\x02\x0c\xff\ +\xae\x01\xf6\x02s\xff\xd7\x01\xf6\x02\xcf\xff\xd7\x01\xf6\x03\ +\x12\xff\xd7\x01\xf6\x03\x1c\xff\xd7\x01\xf8\x00\x0f\xff\x85\x01\ +\xf8\x00\x10\xff\xae\x01\xf8\x00\x11\xff\x85\x01\xf8\x01\x9f\xff\ +\xd7\x01\xf8\x01\xa4\xff\x9a\x01\xf8\x01\xaa\xffq\x01\xf8\x01\ +\xae\xff\x9a\x01\xf8\x01\xb5\xff\x9a\x01\xf8\x01\xb8\xff\xd7\x01\ +\xf8\x01\xbb\xff\xd7\x01\xf8\x01\xbc\x00)\x01\xf8\x01\xbe\xff\ +\xae\x01\xf8\x01\xcc\xff\x9a\x01\xf8\x01\xcd\xff\x9a\x01\xf8\x01\ +\xce\xff\x85\x01\xf8\x01\xcf\xffq\x01\xf8\x01\xd0\xff\xd7\x01\ +\xf8\x01\xd1\xff\xd7\x01\xf8\x01\xd2\xff\x9a\x01\xf8\x01\xd3\xff\ +\x9a\x01\xf8\x01\xd4\xff\x9a\x01\xf8\x01\xd5\xff\x85\x01\xf8\x01\ +\xd6\xff\x9a\x01\xf8\x01\xd7\xff\x9a\x01\xf8\x01\xd8\xffq\x01\ +\xf8\x01\xd9\xff\x9a\x01\xf8\x01\xda\xff\x9a\x01\xf8\x01\xdb\xff\ +q\x01\xf8\x01\xdc\xff\xae\x01\xf8\x01\xdd\xff\xae\x01\xf8\x01\ +\xde\xffq\x01\xf8\x01\xdf\xff\xd7\x01\xf8\x01\xe0\xff\x9a\x01\ +\xf8\x01\xe1\xff\x9a\x01\xf8\x01\xe2\xff\x9a\x01\xf8\x01\xe3\xff\ +\x9a\x01\xf8\x01\xe4\xff\xae\x01\xf8\x01\xe5\xff\x9a\x01\xf8\x01\ +\xe6\xff\x9a\x01\xf8\x01\xe7\xff\xd7\x01\xf8\x01\xe8\xff\x9a\x01\ +\xf8\x01\xe9\xff\xc3\x01\xf8\x01\xea\xffq\x01\xf8\x01\xec\xff\ +\x9a\x01\xf8\x01\xed\xffq\x01\xf8\x01\xee\xff\x85\x01\xf8\x01\ +\xf2\xff\x85\x01\xf8\x01\xf3\xff\x9a\x01\xf8\x01\xf5\xff\x9a\x01\ +\xf8\x01\xf6\xff\xae\x01\xf8\x01\xf7\xff\x9a\x01\xf8\x01\xf9\xff\ +\x9a\x01\xf8\x02\x02\xff\xae\x01\xf8\x02\x03\xff\xae\x01\xf8\x02\ +\x04\xff\xae\x01\xf8\x02\x08\xff\x85\x01\xf8\x02\x0c\xff\x85\x01\ +\xf8\x02j\xffq\x01\xf8\x02k\xff\x9a\x01\xf8\x02l\xff\ +\xd7\x01\xf8\x02m\xff\xd7\x01\xf8\x02q\xff\x9a\x01\xf8\x02\ +r\xffq\x01\xf8\x02s\xff\x85\x01\xf8\x02u\xff\x9a\x01\ +\xf8\x02w\xff\x9a\x01\xf8\x02y\xff\x9a\x01\xf8\x02}\xff\ +\x9a\x01\xf8\x02~\xff\xd7\x01\xf8\x02\x7f\xffq\x01\xf8\x02\ +\x81\xff\xd7\x01\xf8\x02\x83\xff\xd7\x01\xf8\x02\x84\xff\xd7\x01\ +\xf8\x02\x85\xffq\x01\xf8\x02\x86\xff\xd7\x01\xf8\x02\x87\xff\ +q\x01\xf8\x02\x88\xff\xd7\x01\xf8\x02\x89\xffq\x01\xf8\x02\ +\x8a\xff\xd7\x01\xf8\x02\x8b\xff\xd7\x01\xf8\x02\x8c\xff\xd7\x01\ +\xf8\x02\x8d\xffq\x01\xf8\x02\x96\xff\x9a\x01\xf8\x02\x9a\xff\ +\x9a\x01\xf8\x02\x9e\xff\x9a\x01\xf8\x02\xa0\xff\xd7\x01\xf8\x02\ +\xa2\xff\xd7\x01\xf8\x02\xa4\xff\x9a\x01\xf8\x02\xa6\xff\x9a\x01\ +\xf8\x02\xaa\xff\xae\x01\xf8\x02\xac\xff\x9a\x01\xf8\x02\xae\xff\ +\x9a\x01\xf8\x02\xb0\xff\x9a\x01\xf8\x02\xb1\xff\xd7\x01\xf8\x02\ +\xb2\xffq\x01\xf8\x02\xb3\xff\xd7\x01\xf8\x02\xb4\xffq\x01\ +\xf8\x02\xb5\x00)\x01\xf8\x02\xb6\xff\xae\x01\xf8\x02\xb8\xff\ +\xae\x01\xf8\x02\xba\xff\xae\x01\xf8\x02\xbc\xff\xd7\x01\xf8\x02\ +\xbe\xff\xae\x01\xf8\x02\xc0\xff\x9a\x01\xf8\x02\xc2\xff\x9a\x01\ +\xf8\x02\xc4\xff\x9a\x01\xf8\x02\xc5\xff\x9a\x01\xf8\x02\xc6\xff\ +q\x01\xf8\x02\xc7\xff\x9a\x01\xf8\x02\xc8\xffq\x01\xf8\x02\ +\xcb\xff\xd7\x01\xf8\x02\xcd\xff\x9a\x01\xf8\x02\xce\xff\x9a\x01\ +\xf8\x02\xcf\xff\x85\x01\xf8\x02\xd1\xff\x9a\x01\xf8\x02\xd3\xff\ +\x9a\x01\xf8\x02\xd5\xff\x9a\x01\xf8\x02\xd7\xff\x9a\x01\xf8\x02\ +\xd9\xffq\x01\xf8\x02\xdb\xffq\x01\xf8\x02\xdd\xffq\x01\ +\xf8\x02\xe0\xffq\x01\xf8\x02\xe6\xff\xd7\x01\xf8\x02\xe8\xff\ +\xd7\x01\xf8\x02\xea\xff\xc3\x01\xf8\x02\xec\xff\x9a\x01\xf8\x02\ +\xee\xff\x9a\x01\xf8\x02\xef\xff\xd7\x01\xf8\x02\xf0\xffq\x01\ +\xf8\x02\xf1\xff\xd7\x01\xf8\x02\xf2\xffq\x01\xf8\x02\xf3\xff\ +\xd7\x01\xf8\x02\xf4\xffq\x01\xf8\x02\xf6\xff\xd7\x01\xf8\x02\ +\xf8\xff\xae\x01\xf8\x02\xfa\xff\xae\x01\xf8\x02\xfc\xff\xae\x01\ +\xf8\x02\xfe\xff\x9a\x01\xf8\x03\x00\xff\x9a\x01\xf8\x03\x02\xff\ +\x9a\x01\xf8\x03\x06\xff\xd7\x01\xf8\x03\x08\xff\xd7\x01\xf8\x03\ +\x09\xffq\x01\xf8\x03\x0a\xffq\x01\xf8\x03\x0b\xffq\x01\ +\xf8\x03\x0c\xffq\x01\xf8\x03\x0e\xff\x9a\x01\xf8\x03\x10\xff\ +\x9a\x01\xf8\x03\x11\xff\x9a\x01\xf8\x03\x12\xff\x85\x01\xf8\x03\ +\x14\xff\x9a\x01\xf8\x03\x15\xff\xd7\x01\xf8\x03\x16\xffq\x01\ +\xf8\x03\x18\xff\xae\x01\xf8\x03\x1a\xffq\x01\xf8\x03\x1b\xff\ +\x9a\x01\xf8\x03\x1c\xff\x85\x01\xf9\x00\x0f\xff\x9a\x01\xf9\x00\ +\x10\xff\xd7\x01\xf9\x00\x11\xff\x9a\x01\xf9\x01\xce\xff\xc3\x01\ +\xf9\x01\xcf\xff\xec\x01\xf9\x01\xd5\xff\xc3\x01\xf9\x01\xd8\xff\ +\xec\x01\xf9\x01\xdb\xff\xec\x01\xf9\x01\xde\xff\xec\x01\xf9\x01\ +\xea\xff\xec\x01\xf9\x01\xed\xff\xec\x01\xf9\x01\xf2\xff\xc3\x01\ +\xf9\x02\x02\xff\xd7\x01\xf9\x02\x03\xff\xd7\x01\xf9\x02\x04\xff\ +\xd7\x01\xf9\x02\x08\xff\x9a\x01\xf9\x02\x0c\xff\x9a\x01\xf9\x02\ +j\xff\xec\x01\xf9\x02s\xff\xc3\x01\xf9\x02\x7f\xff\xec\x01\ +\xf9\x02\x85\xff\xec\x01\xf9\x02\x87\xff\xec\x01\xf9\x02\x89\xff\ +\xec\x01\xf9\x02\x8d\xff\xec\x01\xf9\x02\xb2\xff\xec\x01\xf9\x02\ +\xb4\xff\xec\x01\xf9\x02\xcf\xff\xc3\x01\xf9\x02\xe0\xff\xec\x01\ +\xf9\x02\xf0\xff\xec\x01\xf9\x02\xf2\xff\xec\x01\xf9\x02\xf4\xff\ +\xec\x01\xf9\x03\x0a\xff\xec\x01\xf9\x03\x0c\xff\xec\x01\xf9\x03\ +\x12\xff\xc3\x01\xf9\x03\x16\xff\xec\x01\xf9\x03\x1a\xff\xec\x01\ +\xf9\x03\x1c\xff\xc3\x01\xfa\x00\x0f\xff\x9a\x01\xfa\x00\x11\xff\ +\x9a\x01\xfa\x00\x22\x00)\x01\xfa\x00$\xff\xae\x01\xfa\x00\ +&\xff\xec\x01\xfa\x00*\xff\xec\x01\xfa\x002\xff\xec\x01\ +\xfa\x004\xff\xec\x01\xfa\x00D\xff\xd7\x01\xfa\x00F\xff\ +\xd7\x01\xfa\x00G\xff\xd7\x01\xfa\x00H\xff\xd7\x01\xfa\x00\ +J\xff\xec\x01\xfa\x00P\xff\xec\x01\xfa\x00Q\xff\xec\x01\ +\xfa\x00R\xff\xd7\x01\xfa\x00S\xff\xec\x01\xfa\x00T\xff\ +\xd7\x01\xfa\x00U\xff\xec\x01\xfa\x00V\xff\xec\x01\xfa\x00\ +X\xff\xec\x01\xfa\x00\x82\xff\xae\x01\xfa\x00\x83\xff\xae\x01\ +\xfa\x00\x84\xff\xae\x01\xfa\x00\x85\xff\xae\x01\xfa\x00\x86\xff\ +\xae\x01\xfa\x00\x87\xff\xae\x01\xfa\x00\x89\xff\xec\x01\xfa\x00\ +\x94\xff\xec\x01\xfa\x00\x95\xff\xec\x01\xfa\x00\x96\xff\xec\x01\ +\xfa\x00\x97\xff\xec\x01\xfa\x00\x98\xff\xec\x01\xfa\x00\x9a\xff\ +\xec\x01\xfa\x00\xa2\xff\xd7\x01\xfa\x00\xa3\xff\xd7\x01\xfa\x00\ +\xa4\xff\xd7\x01\xfa\x00\xa5\xff\xd7\x01\xfa\x00\xa6\xff\xd7\x01\ +\xfa\x00\xa7\xff\xd7\x01\xfa\x00\xa8\xff\xd7\x01\xfa\x00\xa9\xff\ +\xd7\x01\xfa\x00\xaa\xff\xd7\x01\xfa\x00\xab\xff\xd7\x01\xfa\x00\ +\xac\xff\xd7\x01\xfa\x00\xad\xff\xd7\x01\xfa\x00\xb4\xff\xd7\x01\ +\xfa\x00\xb5\xff\xd7\x01\xfa\x00\xb6\xff\xd7\x01\xfa\x00\xb7\xff\ +\xd7\x01\xfa\x00\xb8\xff\xd7\x01\xfa\x00\xba\xff\xd7\x01\xfa\x00\ +\xbb\xff\xec\x01\xfa\x00\xbc\xff\xec\x01\xfa\x00\xbd\xff\xec\x01\ +\xfa\x00\xbe\xff\xec\x01\xfa\x00\xc2\xff\xae\x01\xfa\x00\xc3\xff\ +\xd7\x01\xfa\x00\xc4\xff\xae\x01\xfa\x00\xc5\xff\xd7\x01\xfa\x00\ +\xc6\xff\xae\x01\xfa\x00\xc7\xff\xd7\x01\xfa\x00\xc8\xff\xec\x01\ +\xfa\x00\xc9\xff\xd7\x01\xfa\x00\xca\xff\xec\x01\xfa\x00\xcb\xff\ +\xd7\x01\xfa\x00\xcc\xff\xec\x01\xfa\x00\xcd\xff\xd7\x01\xfa\x00\ +\xce\xff\xec\x01\xfa\x00\xcf\xff\xd7\x01\xfa\x00\xd1\xff\xd7\x01\ +\xfa\x00\xd3\xff\xd7\x01\xfa\x00\xd5\xff\xd7\x01\xfa\x00\xd7\xff\ +\xd7\x01\xfa\x00\xd9\xff\xd7\x01\xfa\x00\xdb\xff\xd7\x01\xfa\x00\ +\xdd\xff\xd7\x01\xfa\x00\xde\xff\xec\x01\xfa\x00\xdf\xff\xec\x01\ +\xfa\x00\xe0\xff\xec\x01\xfa\x00\xe1\xff\xec\x01\xfa\x00\xe2\xff\ +\xec\x01\xfa\x00\xe3\xff\xec\x01\xfa\x00\xe4\xff\xec\x01\xfa\x00\ +\xe5\xff\xec\x01\xfa\x00\xfa\xff\xec\x01\xfa\x01\x06\xff\xec\x01\ +\xfa\x01\x08\xff\xec\x01\xfa\x01\x0d\xff\xec\x01\xfa\x01\x0e\xff\ +\xec\x01\xfa\x01\x0f\xff\xd7\x01\xfa\x01\x10\xff\xec\x01\xfa\x01\ +\x11\xff\xd7\x01\xfa\x01\x12\xff\xec\x01\xfa\x01\x13\xff\xd7\x01\ +\xfa\x01\x14\xff\xec\x01\xfa\x01\x15\xff\xd7\x01\xfa\x01\x17\xff\ +\xec\x01\xfa\x01\x19\xff\xec\x01\xfa\x01\x1d\xff\xec\x01\xfa\x01\ +!\xff\xec\x01\xfa\x01+\xff\xec\x01\xfa\x01-\xff\xec\x01\ +\xfa\x01/\xff\xec\x01\xfa\x011\xff\xec\x01\xfa\x013\xff\ +\xec\x01\xfa\x015\xff\xec\x01\xfa\x01C\xff\xae\x01\xfa\x01\ +D\xff\xd7\x01\xfa\x01F\xff\xd7\x01\xfa\x01G\xff\xec\x01\ +\xfa\x01H\xff\xd7\x01\xfa\x01J\xff\xec\x01\xfa\x02\x08\xff\ +\x9a\x01\xfa\x02\x0c\xff\x9a\x01\xfa\x02W\xff\xec\x01\xfa\x02\ +X\xff\xae\x01\xfa\x02Y\xff\xd7\x01\xfa\x02_\xff\xec\x01\ +\xfa\x02`\xff\xd7\x01\xfa\x02b\xff\xec\x01\xfa\x03\x1d\xff\ +\xae\x01\xfa\x03\x1e\xff\xd7\x01\xfa\x03\x1f\xff\xae\x01\xfa\x03\ + \xff\xd7\x01\xfa\x03!\xff\xae\x01\xfa\x03\x22\xff\xd7\x01\ +\xfa\x03#\xff\xae\x01\xfa\x03%\xff\xae\x01\xfa\x03&\xff\ +\xd7\x01\xfa\x03'\xff\xae\x01\xfa\x03(\xff\xd7\x01\xfa\x03\ +)\xff\xae\x01\xfa\x03*\xff\xd7\x01\xfa\x03+\xff\xae\x01\ +\xfa\x03,\xff\xd7\x01\xfa\x03-\xff\xae\x01\xfa\x03.\xff\ +\xd7\x01\xfa\x03/\xff\xae\x01\xfa\x030\xff\xd7\x01\xfa\x03\ +1\xff\xae\x01\xfa\x032\xff\xd7\x01\xfa\x033\xff\xae\x01\ +\xfa\x034\xff\xd7\x01\xfa\x036\xff\xd7\x01\xfa\x038\xff\ +\xd7\x01\xfa\x03:\xff\xd7\x01\xfa\x03<\xff\xd7\x01\xfa\x03\ +@\xff\xd7\x01\xfa\x03B\xff\xd7\x01\xfa\x03D\xff\xd7\x01\ +\xfa\x03I\xff\xec\x01\xfa\x03J\xff\xd7\x01\xfa\x03K\xff\ +\xec\x01\xfa\x03L\xff\xd7\x01\xfa\x03M\xff\xec\x01\xfa\x03\ +N\xff\xd7\x01\xfa\x03O\xff\xec\x01\xfa\x03Q\xff\xec\x01\ +\xfa\x03R\xff\xd7\x01\xfa\x03S\xff\xec\x01\xfa\x03T\xff\ +\xd7\x01\xfa\x03U\xff\xec\x01\xfa\x03V\xff\xd7\x01\xfa\x03\ +W\xff\xec\x01\xfa\x03X\xff\xd7\x01\xfa\x03Y\xff\xec\x01\ +\xfa\x03Z\xff\xd7\x01\xfa\x03[\xff\xec\x01\xfa\x03\x5c\xff\ +\xd7\x01\xfa\x03]\xff\xec\x01\xfa\x03^\xff\xd7\x01\xfa\x03\ +_\xff\xec\x01\xfa\x03`\xff\xd7\x01\xfa\x03b\xff\xec\x01\ +\xfa\x03d\xff\xec\x01\xfa\x03f\xff\xec\x01\xfa\x03h\xff\ +\xec\x01\xfa\x03j\xff\xec\x01\xfa\x03l\xff\xec\x01\xfa\x03\ +n\xff\xec\x01\xfb\x00\x05\x00R\x01\xfb\x00\x0a\x00R\x01\ +\xfb\x00\x0f\xff\xae\x01\xfb\x00\x11\xff\xae\x01\xfb\x00\x22\x00\ +)\x01\xfb\x02\x07\x00R\x01\xfb\x02\x08\xff\xae\x01\xfb\x02\ +\x0b\x00R\x01\xfb\x02\x0c\xff\xae\x01\xfc\x00\x0f\xff\x9a\x01\ +\xfc\x00\x11\xff\x9a\x01\xfc\x00\x22\x00)\x01\xfc\x00$\xff\ +\xae\x01\xfc\x00&\xff\xec\x01\xfc\x00*\xff\xec\x01\xfc\x00\ +2\xff\xec\x01\xfc\x004\xff\xec\x01\xfc\x00D\xff\xd7\x01\ +\xfc\x00F\xff\xd7\x01\xfc\x00G\xff\xd7\x01\xfc\x00H\xff\ +\xd7\x01\xfc\x00J\xff\xec\x01\xfc\x00P\xff\xec\x01\xfc\x00\ +Q\xff\xec\x01\xfc\x00R\xff\xd7\x01\xfc\x00S\xff\xec\x01\ +\xfc\x00T\xff\xd7\x01\xfc\x00U\xff\xec\x01\xfc\x00V\xff\ +\xec\x01\xfc\x00X\xff\xec\x01\xfc\x00\x82\xff\xae\x01\xfc\x00\ +\x83\xff\xae\x01\xfc\x00\x84\xff\xae\x01\xfc\x00\x85\xff\xae\x01\ +\xfc\x00\x86\xff\xae\x01\xfc\x00\x87\xff\xae\x01\xfc\x00\x89\xff\ +\xec\x01\xfc\x00\x94\xff\xec\x01\xfc\x00\x95\xff\xec\x01\xfc\x00\ +\x96\xff\xec\x01\xfc\x00\x97\xff\xec\x01\xfc\x00\x98\xff\xec\x01\ +\xfc\x00\x9a\xff\xec\x01\xfc\x00\xa2\xff\xd7\x01\xfc\x00\xa3\xff\ +\xd7\x01\xfc\x00\xa4\xff\xd7\x01\xfc\x00\xa5\xff\xd7\x01\xfc\x00\ +\xa6\xff\xd7\x01\xfc\x00\xa7\xff\xd7\x01\xfc\x00\xa8\xff\xd7\x01\ +\xfc\x00\xa9\xff\xd7\x01\xfc\x00\xaa\xff\xd7\x01\xfc\x00\xab\xff\ +\xd7\x01\xfc\x00\xac\xff\xd7\x01\xfc\x00\xad\xff\xd7\x01\xfc\x00\ +\xb4\xff\xd7\x01\xfc\x00\xb5\xff\xd7\x01\xfc\x00\xb6\xff\xd7\x01\ +\xfc\x00\xb7\xff\xd7\x01\xfc\x00\xb8\xff\xd7\x01\xfc\x00\xba\xff\ +\xd7\x01\xfc\x00\xbb\xff\xec\x01\xfc\x00\xbc\xff\xec\x01\xfc\x00\ +\xbd\xff\xec\x01\xfc\x00\xbe\xff\xec\x01\xfc\x00\xc2\xff\xae\x01\ +\xfc\x00\xc3\xff\xd7\x01\xfc\x00\xc4\xff\xae\x01\xfc\x00\xc5\xff\ +\xd7\x01\xfc\x00\xc6\xff\xae\x01\xfc\x00\xc7\xff\xd7\x01\xfc\x00\ +\xc8\xff\xec\x01\xfc\x00\xc9\xff\xd7\x01\xfc\x00\xca\xff\xec\x01\ +\xfc\x00\xcb\xff\xd7\x01\xfc\x00\xcc\xff\xec\x01\xfc\x00\xcd\xff\ +\xd7\x01\xfc\x00\xce\xff\xec\x01\xfc\x00\xcf\xff\xd7\x01\xfc\x00\ +\xd1\xff\xd7\x01\xfc\x00\xd3\xff\xd7\x01\xfc\x00\xd5\xff\xd7\x01\ +\xfc\x00\xd7\xff\xd7\x01\xfc\x00\xd9\xff\xd7\x01\xfc\x00\xdb\xff\ +\xd7\x01\xfc\x00\xdd\xff\xd7\x01\xfc\x00\xde\xff\xec\x01\xfc\x00\ +\xdf\xff\xec\x01\xfc\x00\xe0\xff\xec\x01\xfc\x00\xe1\xff\xec\x01\ +\xfc\x00\xe2\xff\xec\x01\xfc\x00\xe3\xff\xec\x01\xfc\x00\xe4\xff\ +\xec\x01\xfc\x00\xe5\xff\xec\x01\xfc\x00\xfa\xff\xec\x01\xfc\x01\ +\x06\xff\xec\x01\xfc\x01\x08\xff\xec\x01\xfc\x01\x0d\xff\xec\x01\ +\xfc\x01\x0e\xff\xec\x01\xfc\x01\x0f\xff\xd7\x01\xfc\x01\x10\xff\ +\xec\x01\xfc\x01\x11\xff\xd7\x01\xfc\x01\x12\xff\xec\x01\xfc\x01\ +\x13\xff\xd7\x01\xfc\x01\x14\xff\xec\x01\xfc\x01\x15\xff\xd7\x01\ +\xfc\x01\x17\xff\xec\x01\xfc\x01\x19\xff\xec\x01\xfc\x01\x1d\xff\ +\xec\x01\xfc\x01!\xff\xec\x01\xfc\x01+\xff\xec\x01\xfc\x01\ +-\xff\xec\x01\xfc\x01/\xff\xec\x01\xfc\x011\xff\xec\x01\ +\xfc\x013\xff\xec\x01\xfc\x015\xff\xec\x01\xfc\x01C\xff\ +\xae\x01\xfc\x01D\xff\xd7\x01\xfc\x01F\xff\xd7\x01\xfc\x01\ +G\xff\xec\x01\xfc\x01H\xff\xd7\x01\xfc\x01J\xff\xec\x01\ +\xfc\x02\x08\xff\x9a\x01\xfc\x02\x0c\xff\x9a\x01\xfc\x02W\xff\ +\xec\x01\xfc\x02X\xff\xae\x01\xfc\x02Y\xff\xd7\x01\xfc\x02\ +_\xff\xec\x01\xfc\x02`\xff\xd7\x01\xfc\x02b\xff\xec\x01\ +\xfc\x03\x1d\xff\xae\x01\xfc\x03\x1e\xff\xd7\x01\xfc\x03\x1f\xff\ +\xae\x01\xfc\x03 \xff\xd7\x01\xfc\x03!\xff\xae\x01\xfc\x03\ +\x22\xff\xd7\x01\xfc\x03#\xff\xae\x01\xfc\x03%\xff\xae\x01\ +\xfc\x03&\xff\xd7\x01\xfc\x03'\xff\xae\x01\xfc\x03(\xff\ +\xd7\x01\xfc\x03)\xff\xae\x01\xfc\x03*\xff\xd7\x01\xfc\x03\ ++\xff\xae\x01\xfc\x03,\xff\xd7\x01\xfc\x03-\xff\xae\x01\ +\xfc\x03.\xff\xd7\x01\xfc\x03/\xff\xae\x01\xfc\x030\xff\ +\xd7\x01\xfc\x031\xff\xae\x01\xfc\x032\xff\xd7\x01\xfc\x03\ +3\xff\xae\x01\xfc\x034\xff\xd7\x01\xfc\x036\xff\xd7\x01\ +\xfc\x038\xff\xd7\x01\xfc\x03:\xff\xd7\x01\xfc\x03<\xff\ +\xd7\x01\xfc\x03@\xff\xd7\x01\xfc\x03B\xff\xd7\x01\xfc\x03\ +D\xff\xd7\x01\xfc\x03I\xff\xec\x01\xfc\x03J\xff\xd7\x01\ +\xfc\x03K\xff\xec\x01\xfc\x03L\xff\xd7\x01\xfc\x03M\xff\ +\xec\x01\xfc\x03N\xff\xd7\x01\xfc\x03O\xff\xec\x01\xfc\x03\ +Q\xff\xec\x01\xfc\x03R\xff\xd7\x01\xfc\x03S\xff\xec\x01\ +\xfc\x03T\xff\xd7\x01\xfc\x03U\xff\xec\x01\xfc\x03V\xff\ +\xd7\x01\xfc\x03W\xff\xec\x01\xfc\x03X\xff\xd7\x01\xfc\x03\ +Y\xff\xec\x01\xfc\x03Z\xff\xd7\x01\xfc\x03[\xff\xec\x01\ +\xfc\x03\x5c\xff\xd7\x01\xfc\x03]\xff\xec\x01\xfc\x03^\xff\ +\xd7\x01\xfc\x03_\xff\xec\x01\xfc\x03`\xff\xd7\x01\xfc\x03\ +b\xff\xec\x01\xfc\x03d\xff\xec\x01\xfc\x03f\xff\xec\x01\ +\xfc\x03h\xff\xec\x01\xfc\x03j\xff\xec\x01\xfc\x03l\xff\ +\xec\x01\xfc\x03n\xff\xec\x01\xfd\x00\x05\x00R\x01\xfd\x00\ +\x0a\x00R\x01\xfd\x00\x0f\xff\xae\x01\xfd\x00\x11\xff\xae\x01\ +\xfd\x00\x22\x00)\x01\xfd\x02\x07\x00R\x01\xfd\x02\x08\xff\ +\xae\x01\xfd\x02\x0b\x00R\x01\xfd\x02\x0c\xff\xae\x01\xfe\x00\ +\x0f\xff\x9a\x01\xfe\x00\x11\xff\x9a\x01\xfe\x00\x22\x00)\x01\ +\xfe\x00$\xff\xae\x01\xfe\x00&\xff\xec\x01\xfe\x00*\xff\ +\xec\x01\xfe\x002\xff\xec\x01\xfe\x004\xff\xec\x01\xfe\x00\ +D\xff\xd7\x01\xfe\x00F\xff\xd7\x01\xfe\x00G\xff\xd7\x01\ +\xfe\x00H\xff\xd7\x01\xfe\x00J\xff\xec\x01\xfe\x00P\xff\ +\xec\x01\xfe\x00Q\xff\xec\x01\xfe\x00R\xff\xd7\x01\xfe\x00\ +S\xff\xec\x01\xfe\x00T\xff\xd7\x01\xfe\x00U\xff\xec\x01\ +\xfe\x00V\xff\xec\x01\xfe\x00X\xff\xec\x01\xfe\x00\x82\xff\ +\xae\x01\xfe\x00\x83\xff\xae\x01\xfe\x00\x84\xff\xae\x01\xfe\x00\ +\x85\xff\xae\x01\xfe\x00\x86\xff\xae\x01\xfe\x00\x87\xff\xae\x01\ +\xfe\x00\x89\xff\xec\x01\xfe\x00\x94\xff\xec\x01\xfe\x00\x95\xff\ +\xec\x01\xfe\x00\x96\xff\xec\x01\xfe\x00\x97\xff\xec\x01\xfe\x00\ +\x98\xff\xec\x01\xfe\x00\x9a\xff\xec\x01\xfe\x00\xa2\xff\xd7\x01\ +\xfe\x00\xa3\xff\xd7\x01\xfe\x00\xa4\xff\xd7\x01\xfe\x00\xa5\xff\ +\xd7\x01\xfe\x00\xa6\xff\xd7\x01\xfe\x00\xa7\xff\xd7\x01\xfe\x00\ +\xa8\xff\xd7\x01\xfe\x00\xa9\xff\xd7\x01\xfe\x00\xaa\xff\xd7\x01\ +\xfe\x00\xab\xff\xd7\x01\xfe\x00\xac\xff\xd7\x01\xfe\x00\xad\xff\ +\xd7\x01\xfe\x00\xb4\xff\xd7\x01\xfe\x00\xb5\xff\xd7\x01\xfe\x00\ +\xb6\xff\xd7\x01\xfe\x00\xb7\xff\xd7\x01\xfe\x00\xb8\xff\xd7\x01\ +\xfe\x00\xba\xff\xd7\x01\xfe\x00\xbb\xff\xec\x01\xfe\x00\xbc\xff\ +\xec\x01\xfe\x00\xbd\xff\xec\x01\xfe\x00\xbe\xff\xec\x01\xfe\x00\ +\xc2\xff\xae\x01\xfe\x00\xc3\xff\xd7\x01\xfe\x00\xc4\xff\xae\x01\ +\xfe\x00\xc5\xff\xd7\x01\xfe\x00\xc6\xff\xae\x01\xfe\x00\xc7\xff\ +\xd7\x01\xfe\x00\xc8\xff\xec\x01\xfe\x00\xc9\xff\xd7\x01\xfe\x00\ +\xca\xff\xec\x01\xfe\x00\xcb\xff\xd7\x01\xfe\x00\xcc\xff\xec\x01\ +\xfe\x00\xcd\xff\xd7\x01\xfe\x00\xce\xff\xec\x01\xfe\x00\xcf\xff\ +\xd7\x01\xfe\x00\xd1\xff\xd7\x01\xfe\x00\xd3\xff\xd7\x01\xfe\x00\ +\xd5\xff\xd7\x01\xfe\x00\xd7\xff\xd7\x01\xfe\x00\xd9\xff\xd7\x01\ +\xfe\x00\xdb\xff\xd7\x01\xfe\x00\xdd\xff\xd7\x01\xfe\x00\xde\xff\ +\xec\x01\xfe\x00\xdf\xff\xec\x01\xfe\x00\xe0\xff\xec\x01\xfe\x00\ +\xe1\xff\xec\x01\xfe\x00\xe2\xff\xec\x01\xfe\x00\xe3\xff\xec\x01\ +\xfe\x00\xe4\xff\xec\x01\xfe\x00\xe5\xff\xec\x01\xfe\x00\xfa\xff\ +\xec\x01\xfe\x01\x06\xff\xec\x01\xfe\x01\x08\xff\xec\x01\xfe\x01\ +\x0d\xff\xec\x01\xfe\x01\x0e\xff\xec\x01\xfe\x01\x0f\xff\xd7\x01\ +\xfe\x01\x10\xff\xec\x01\xfe\x01\x11\xff\xd7\x01\xfe\x01\x12\xff\ +\xec\x01\xfe\x01\x13\xff\xd7\x01\xfe\x01\x14\xff\xec\x01\xfe\x01\ +\x15\xff\xd7\x01\xfe\x01\x17\xff\xec\x01\xfe\x01\x19\xff\xec\x01\ +\xfe\x01\x1d\xff\xec\x01\xfe\x01!\xff\xec\x01\xfe\x01+\xff\ +\xec\x01\xfe\x01-\xff\xec\x01\xfe\x01/\xff\xec\x01\xfe\x01\ +1\xff\xec\x01\xfe\x013\xff\xec\x01\xfe\x015\xff\xec\x01\ +\xfe\x01C\xff\xae\x01\xfe\x01D\xff\xd7\x01\xfe\x01F\xff\ +\xd7\x01\xfe\x01G\xff\xec\x01\xfe\x01H\xff\xd7\x01\xfe\x01\ +J\xff\xec\x01\xfe\x02\x08\xff\x9a\x01\xfe\x02\x0c\xff\x9a\x01\ +\xfe\x02W\xff\xec\x01\xfe\x02X\xff\xae\x01\xfe\x02Y\xff\ +\xd7\x01\xfe\x02_\xff\xec\x01\xfe\x02`\xff\xd7\x01\xfe\x02\ +b\xff\xec\x01\xfe\x03\x1d\xff\xae\x01\xfe\x03\x1e\xff\xd7\x01\ +\xfe\x03\x1f\xff\xae\x01\xfe\x03 \xff\xd7\x01\xfe\x03!\xff\ +\xae\x01\xfe\x03\x22\xff\xd7\x01\xfe\x03#\xff\xae\x01\xfe\x03\ +%\xff\xae\x01\xfe\x03&\xff\xd7\x01\xfe\x03'\xff\xae\x01\ +\xfe\x03(\xff\xd7\x01\xfe\x03)\xff\xae\x01\xfe\x03*\xff\ +\xd7\x01\xfe\x03+\xff\xae\x01\xfe\x03,\xff\xd7\x01\xfe\x03\ +-\xff\xae\x01\xfe\x03.\xff\xd7\x01\xfe\x03/\xff\xae\x01\ +\xfe\x030\xff\xd7\x01\xfe\x031\xff\xae\x01\xfe\x032\xff\ +\xd7\x01\xfe\x033\xff\xae\x01\xfe\x034\xff\xd7\x01\xfe\x03\ +6\xff\xd7\x01\xfe\x038\xff\xd7\x01\xfe\x03:\xff\xd7\x01\ +\xfe\x03<\xff\xd7\x01\xfe\x03@\xff\xd7\x01\xfe\x03B\xff\ +\xd7\x01\xfe\x03D\xff\xd7\x01\xfe\x03I\xff\xec\x01\xfe\x03\ +J\xff\xd7\x01\xfe\x03K\xff\xec\x01\xfe\x03L\xff\xd7\x01\ +\xfe\x03M\xff\xec\x01\xfe\x03N\xff\xd7\x01\xfe\x03O\xff\ +\xec\x01\xfe\x03Q\xff\xec\x01\xfe\x03R\xff\xd7\x01\xfe\x03\ +S\xff\xec\x01\xfe\x03T\xff\xd7\x01\xfe\x03U\xff\xec\x01\ +\xfe\x03V\xff\xd7\x01\xfe\x03W\xff\xec\x01\xfe\x03X\xff\ +\xd7\x01\xfe\x03Y\xff\xec\x01\xfe\x03Z\xff\xd7\x01\xfe\x03\ +[\xff\xec\x01\xfe\x03\x5c\xff\xd7\x01\xfe\x03]\xff\xec\x01\ +\xfe\x03^\xff\xd7\x01\xfe\x03_\xff\xec\x01\xfe\x03`\xff\ +\xd7\x01\xfe\x03b\xff\xec\x01\xfe\x03d\xff\xec\x01\xfe\x03\ +f\xff\xec\x01\xfe\x03h\xff\xec\x01\xfe\x03j\xff\xec\x01\ +\xfe\x03l\xff\xec\x01\xfe\x03n\xff\xec\x01\xff\x00\x05\x00\ +R\x01\xff\x00\x0a\x00R\x01\xff\x00\x0f\xff\xae\x01\xff\x00\ +\x11\xff\xae\x01\xff\x00\x22\x00)\x01\xff\x02\x07\x00R\x01\ +\xff\x02\x08\xff\xae\x01\xff\x02\x0b\x00R\x01\xff\x02\x0c\xff\ +\xae\x02\x00\x00\x0f\xff\x85\x02\x00\x00\x11\xff\x85\x02\x00\x00\ +\x22\x00)\x02\x00\x00$\xff\x85\x02\x00\x00&\xff\xd7\x02\ +\x00\x00*\xff\xd7\x02\x00\x002\xff\xd7\x02\x00\x004\xff\ +\xd7\x02\x00\x00D\xff\x9a\x02\x00\x00F\xff\x9a\x02\x00\x00\ +G\xff\x9a\x02\x00\x00H\xff\x9a\x02\x00\x00J\xff\xd7\x02\ +\x00\x00P\xff\xc3\x02\x00\x00Q\xff\xc3\x02\x00\x00R\xff\ +\x9a\x02\x00\x00S\xff\xc3\x02\x00\x00T\xff\x9a\x02\x00\x00\ +U\xff\xc3\x02\x00\x00V\xff\xae\x02\x00\x00X\xff\xc3\x02\ +\x00\x00]\xff\xd7\x02\x00\x00\x82\xff\x85\x02\x00\x00\x83\xff\ +\x85\x02\x00\x00\x84\xff\x85\x02\x00\x00\x85\xff\x85\x02\x00\x00\ +\x86\xff\x85\x02\x00\x00\x87\xff\x85\x02\x00\x00\x89\xff\xd7\x02\ +\x00\x00\x94\xff\xd7\x02\x00\x00\x95\xff\xd7\x02\x00\x00\x96\xff\ +\xd7\x02\x00\x00\x97\xff\xd7\x02\x00\x00\x98\xff\xd7\x02\x00\x00\ +\x9a\xff\xd7\x02\x00\x00\xa2\xff\x9a\x02\x00\x00\xa3\xff\x9a\x02\ +\x00\x00\xa4\xff\x9a\x02\x00\x00\xa5\xff\x9a\x02\x00\x00\xa6\xff\ +\x9a\x02\x00\x00\xa7\xff\x9a\x02\x00\x00\xa8\xff\x9a\x02\x00\x00\ +\xa9\xff\x9a\x02\x00\x00\xaa\xff\x9a\x02\x00\x00\xab\xff\x9a\x02\ +\x00\x00\xac\xff\x9a\x02\x00\x00\xad\xff\x9a\x02\x00\x00\xb4\xff\ +\x9a\x02\x00\x00\xb5\xff\x9a\x02\x00\x00\xb6\xff\x9a\x02\x00\x00\ +\xb7\xff\x9a\x02\x00\x00\xb8\xff\x9a\x02\x00\x00\xba\xff\x9a\x02\ +\x00\x00\xbb\xff\xc3\x02\x00\x00\xbc\xff\xc3\x02\x00\x00\xbd\xff\ +\xc3\x02\x00\x00\xbe\xff\xc3\x02\x00\x00\xc2\xff\x85\x02\x00\x00\ +\xc3\xff\x9a\x02\x00\x00\xc4\xff\x85\x02\x00\x00\xc5\xff\x9a\x02\ +\x00\x00\xc6\xff\x85\x02\x00\x00\xc7\xff\x9a\x02\x00\x00\xc8\xff\ +\xd7\x02\x00\x00\xc9\xff\x9a\x02\x00\x00\xca\xff\xd7\x02\x00\x00\ +\xcb\xff\x9a\x02\x00\x00\xcc\xff\xd7\x02\x00\x00\xcd\xff\x9a\x02\ +\x00\x00\xce\xff\xd7\x02\x00\x00\xcf\xff\x9a\x02\x00\x00\xd1\xff\ +\x9a\x02\x00\x00\xd3\xff\x9a\x02\x00\x00\xd5\xff\x9a\x02\x00\x00\ +\xd7\xff\x9a\x02\x00\x00\xd9\xff\x9a\x02\x00\x00\xdb\xff\x9a\x02\ +\x00\x00\xdd\xff\x9a\x02\x00\x00\xde\xff\xd7\x02\x00\x00\xdf\xff\ +\xd7\x02\x00\x00\xe0\xff\xd7\x02\x00\x00\xe1\xff\xd7\x02\x00\x00\ +\xe2\xff\xd7\x02\x00\x00\xe3\xff\xd7\x02\x00\x00\xe4\xff\xd7\x02\ +\x00\x00\xe5\xff\xd7\x02\x00\x00\xfa\xff\xc3\x02\x00\x01\x06\xff\ +\xc3\x02\x00\x01\x08\xff\xc3\x02\x00\x01\x0d\xff\xc3\x02\x00\x01\ +\x0e\xff\xd7\x02\x00\x01\x0f\xff\x9a\x02\x00\x01\x10\xff\xd7\x02\ +\x00\x01\x11\xff\x9a\x02\x00\x01\x12\xff\xd7\x02\x00\x01\x13\xff\ +\x9a\x02\x00\x01\x14\xff\xd7\x02\x00\x01\x15\xff\x9a\x02\x00\x01\ +\x17\xff\xc3\x02\x00\x01\x19\xff\xc3\x02\x00\x01\x1d\xff\xae\x02\ +\x00\x01!\xff\xae\x02\x00\x01+\xff\xc3\x02\x00\x01-\xff\ +\xc3\x02\x00\x01/\xff\xc3\x02\x00\x011\xff\xc3\x02\x00\x01\ +3\xff\xc3\x02\x00\x015\xff\xc3\x02\x00\x01<\xff\xd7\x02\ +\x00\x01>\xff\xd7\x02\x00\x01@\xff\xd7\x02\x00\x01C\xff\ +\x85\x02\x00\x01D\xff\x9a\x02\x00\x01F\xff\x9a\x02\x00\x01\ +G\xff\xd7\x02\x00\x01H\xff\x9a\x02\x00\x01J\xff\xae\x02\ +\x00\x02\x08\xff\x85\x02\x00\x02\x0c\xff\x85\x02\x00\x02W\xff\ +\xc3\x02\x00\x02X\xff\x85\x02\x00\x02Y\xff\x9a\x02\x00\x02\ +_\xff\xd7\x02\x00\x02`\xff\x9a\x02\x00\x02b\xff\xc3\x02\ +\x00\x03\x1d\xff\x85\x02\x00\x03\x1e\xff\x9a\x02\x00\x03\x1f\xff\ +\x85\x02\x00\x03 \xff\x9a\x02\x00\x03!\xff\x85\x02\x00\x03\ +\x22\xff\x9a\x02\x00\x03#\xff\x85\x02\x00\x03%\xff\x85\x02\ +\x00\x03&\xff\x9a\x02\x00\x03'\xff\x85\x02\x00\x03(\xff\ +\x9a\x02\x00\x03)\xff\x85\x02\x00\x03*\xff\x9a\x02\x00\x03\ ++\xff\x85\x02\x00\x03,\xff\x9a\x02\x00\x03-\xff\x85\x02\ +\x00\x03.\xff\x9a\x02\x00\x03/\xff\x85\x02\x00\x030\xff\ +\x9a\x02\x00\x031\xff\x85\x02\x00\x032\xff\x9a\x02\x00\x03\ +3\xff\x85\x02\x00\x034\xff\x9a\x02\x00\x036\xff\x9a\x02\ +\x00\x038\xff\x9a\x02\x00\x03:\xff\x9a\x02\x00\x03<\xff\ +\x9a\x02\x00\x03@\xff\x9a\x02\x00\x03B\xff\x9a\x02\x00\x03\ +D\xff\x9a\x02\x00\x03I\xff\xd7\x02\x00\x03J\xff\x9a\x02\ +\x00\x03K\xff\xd7\x02\x00\x03L\xff\x9a\x02\x00\x03M\xff\ +\xd7\x02\x00\x03N\xff\x9a\x02\x00\x03O\xff\xd7\x02\x00\x03\ +Q\xff\xd7\x02\x00\x03R\xff\x9a\x02\x00\x03S\xff\xd7\x02\ +\x00\x03T\xff\x9a\x02\x00\x03U\xff\xd7\x02\x00\x03V\xff\ +\x9a\x02\x00\x03W\xff\xd7\x02\x00\x03X\xff\x9a\x02\x00\x03\ +Y\xff\xd7\x02\x00\x03Z\xff\x9a\x02\x00\x03[\xff\xd7\x02\ +\x00\x03\x5c\xff\x9a\x02\x00\x03]\xff\xd7\x02\x00\x03^\xff\ +\x9a\x02\x00\x03_\xff\xd7\x02\x00\x03`\xff\x9a\x02\x00\x03\ +b\xff\xc3\x02\x00\x03d\xff\xc3\x02\x00\x03f\xff\xc3\x02\ +\x00\x03h\xff\xc3\x02\x00\x03j\xff\xc3\x02\x00\x03l\xff\ +\xc3\x02\x00\x03n\xff\xc3\x02\x01\x00\x05\x00R\x02\x01\x00\ +\x0a\x00R\x02\x01\x00\x0f\xff\xae\x02\x01\x00\x11\xff\xae\x02\ +\x01\x00\x22\x00)\x02\x01\x02\x07\x00R\x02\x01\x02\x08\xff\ +\xae\x02\x01\x02\x0b\x00R\x02\x01\x02\x0c\xff\xae\x02\x02\x00\ +7\xff\xae\x02\x02\x01$\xff\xae\x02\x02\x01&\xff\xae\x02\ +\x02\x01q\xff\xae\x02\x02\x01\x9d\xff\xae\x02\x02\x01\xa6\xff\ +\xae\x02\x02\x01\xbc\xff\xae\x02\x02\x01\xc4\xff\xae\x02\x02\x01\ +\xdc\xff\xd7\x02\x02\x01\xe4\xff\xd7\x02\x02\x02\xa9\xff\xae\x02\ +\x02\x02\xaa\xff\xd7\x02\x02\x02\xb5\xff\xae\x02\x02\x02\xb6\xff\ +\xd7\x02\x02\x02\xbd\xff\xae\x02\x02\x02\xbe\xff\xd7\x02\x02\x03\ +\x17\xff\xae\x02\x02\x03\x18\xff\xd7\x02\x02\x03\x8f\xff\xae\x02\ +\x03\x007\xff\xae\x02\x03\x01$\xff\xae\x02\x03\x01&\xff\ +\xae\x02\x03\x01q\xff\xae\x02\x03\x01\x9d\xff\xae\x02\x03\x01\ +\xa6\xff\xae\x02\x03\x01\xbc\xff\xae\x02\x03\x01\xc4\xff\xae\x02\ +\x03\x01\xdc\xff\xd7\x02\x03\x01\xe4\xff\xd7\x02\x03\x02\xa9\xff\ +\xae\x02\x03\x02\xaa\xff\xd7\x02\x03\x02\xb5\xff\xae\x02\x03\x02\ +\xb6\xff\xd7\x02\x03\x02\xbd\xff\xae\x02\x03\x02\xbe\xff\xd7\x02\ +\x03\x03\x17\xff\xae\x02\x03\x03\x18\xff\xd7\x02\x03\x03\x8f\xff\ +\xae\x02\x04\x007\xff\xae\x02\x04\x01$\xff\xae\x02\x04\x01\ +&\xff\xae\x02\x04\x01q\xff\xae\x02\x04\x01\x9d\xff\xae\x02\ +\x04\x01\xa6\xff\xae\x02\x04\x01\xbc\xff\xae\x02\x04\x01\xc4\xff\ +\xae\x02\x04\x01\xdc\xff\xd7\x02\x04\x01\xe4\xff\xd7\x02\x04\x02\ +\xa9\xff\xae\x02\x04\x02\xaa\xff\xd7\x02\x04\x02\xb5\xff\xae\x02\ +\x04\x02\xb6\xff\xd7\x02\x04\x02\xbd\xff\xae\x02\x04\x02\xbe\xff\ +\xd7\x02\x04\x03\x17\xff\xae\x02\x04\x03\x18\xff\xd7\x02\x04\x03\ +\x8f\xff\xae\x02\x06\x00$\xffq\x02\x06\x007\x00)\x02\ +\x06\x009\x00)\x02\x06\x00:\x00)\x02\x06\x00<\x00\ +\x14\x02\x06\x00D\xff\xae\x02\x06\x00F\xff\x85\x02\x06\x00\ +G\xff\x85\x02\x06\x00H\xff\x85\x02\x06\x00J\xff\xc3\x02\ +\x06\x00P\xff\xc3\x02\x06\x00Q\xff\xc3\x02\x06\x00R\xff\ +\x85\x02\x06\x00S\xff\xc3\x02\x06\x00T\xff\x85\x02\x06\x00\ +U\xff\xc3\x02\x06\x00V\xff\xc3\x02\x06\x00X\xff\xc3\x02\ +\x06\x00\x82\xffq\x02\x06\x00\x83\xffq\x02\x06\x00\x84\xff\ +q\x02\x06\x00\x85\xffq\x02\x06\x00\x86\xffq\x02\x06\x00\ +\x87\xffq\x02\x06\x00\x9f\x00\x14\x02\x06\x00\xa2\xff\x85\x02\ +\x06\x00\xa3\xff\xae\x02\x06\x00\xa4\xff\xae\x02\x06\x00\xa5\xff\ +\xae\x02\x06\x00\xa6\xff\xae\x02\x06\x00\xa7\xff\xae\x02\x06\x00\ +\xa8\xff\xae\x02\x06\x00\xa9\xff\x85\x02\x06\x00\xaa\xff\x85\x02\ +\x06\x00\xab\xff\x85\x02\x06\x00\xac\xff\x85\x02\x06\x00\xad\xff\ +\x85\x02\x06\x00\xb4\xff\x85\x02\x06\x00\xb5\xff\x85\x02\x06\x00\ +\xb6\xff\x85\x02\x06\x00\xb7\xff\x85\x02\x06\x00\xb8\xff\x85\x02\ +\x06\x00\xba\xff\x85\x02\x06\x00\xbb\xff\xc3\x02\x06\x00\xbc\xff\ +\xc3\x02\x06\x00\xbd\xff\xc3\x02\x06\x00\xbe\xff\xc3\x02\x06\x00\ +\xc2\xffq\x02\x06\x00\xc3\xff\xae\x02\x06\x00\xc4\xffq\x02\ +\x06\x00\xc5\xff\xae\x02\x06\x00\xc6\xffq\x02\x06\x00\xc7\xff\ +\xae\x02\x06\x00\xc9\xff\x85\x02\x06\x00\xcb\xff\x85\x02\x06\x00\ +\xcd\xff\x85\x02\x06\x00\xcf\xff\x85\x02\x06\x00\xd1\xff\x85\x02\ +\x06\x00\xd3\xff\x85\x02\x06\x00\xd5\xff\x85\x02\x06\x00\xd7\xff\ +\x85\x02\x06\x00\xd9\xff\x85\x02\x06\x00\xdb\xff\x85\x02\x06\x00\ +\xdd\xff\x85\x02\x06\x00\xdf\xff\xc3\x02\x06\x00\xe1\xff\xc3\x02\ +\x06\x00\xe3\xff\xc3\x02\x06\x00\xe5\xff\xc3\x02\x06\x00\xfa\xff\ +\xc3\x02\x06\x01\x06\xff\xc3\x02\x06\x01\x08\xff\xc3\x02\x06\x01\ +\x0d\xff\xc3\x02\x06\x01\x0f\xff\x85\x02\x06\x01\x11\xff\x85\x02\ +\x06\x01\x13\xff\x85\x02\x06\x01\x15\xff\x85\x02\x06\x01\x17\xff\ +\xc3\x02\x06\x01\x19\xff\xc3\x02\x06\x01\x1d\xff\xc3\x02\x06\x01\ +!\xff\xc3\x02\x06\x01$\x00)\x02\x06\x01&\x00)\x02\ +\x06\x01+\xff\xc3\x02\x06\x01-\xff\xc3\x02\x06\x01/\xff\ +\xc3\x02\x06\x011\xff\xc3\x02\x06\x013\xff\xc3\x02\x06\x01\ +5\xff\xc3\x02\x06\x016\x00)\x02\x06\x018\x00\x14\x02\ +\x06\x01:\x00\x14\x02\x06\x01C\xffq\x02\x06\x01D\xff\ +\xae\x02\x06\x01F\xff\xae\x02\x06\x01H\xff\x85\x02\x06\x01\ +J\xff\xc3\x02\x06\x01V\xffq\x02\x06\x01_\xffq\x02\ +\x06\x01b\xffq\x02\x06\x01i\xffq\x02\x06\x01y\xff\ +\xae\x02\x06\x01z\xff\xd7\x02\x06\x01{\xff\xd7\x02\x06\x01\ +~\xff\xae\x02\x06\x01\x81\xff\xc3\x02\x06\x01\x82\xff\xd7\x02\ +\x06\x01\x83\xff\xd7\x02\x06\x01\x84\xff\xd7\x02\x06\x01\x87\xff\ +\xd7\x02\x06\x01\x89\xff\xd7\x02\x06\x01\x8c\xff\xae\x02\x06\x01\ +\x8e\xff\xc3\x02\x06\x01\x8f\xff\xae\x02\x06\x01\x90\xff\xae\x02\ +\x06\x01\x93\xff\xae\x02\x06\x01\x99\xff\xae\x02\x06\x01\xa4\xff\ +\x85\x02\x06\x01\xaa\xffq\x02\x06\x01\xae\xff\x85\x02\x06\x01\ +\xb5\xff\x85\x02\x06\x01\xca\xff\xd7\x02\x06\x01\xce\xffq\x02\ +\x06\x01\xcf\xff\x85\x02\x06\x01\xd5\xffq\x02\x06\x01\xd8\xff\ +\x85\x02\x06\x01\xdb\xff\x85\x02\x06\x01\xde\xff\x85\x02\x06\x01\ +\xea\xff\x85\x02\x06\x01\xed\xff\x85\x02\x06\x01\xee\xff\xc3\x02\ +\x06\x01\xf2\xffq\x02\x06\x01\xfa\x00)\x02\x06\x01\xfc\x00\ +)\x02\x06\x01\xfe\x00)\x02\x06\x02\x00\x00\x14\x02\x06\x02\ +W\xff\xc3\x02\x06\x02X\xffq\x02\x06\x02Y\xff\xae\x02\ +\x06\x02`\xff\x85\x02\x06\x02b\xff\xc3\x02\x06\x02j\xff\ +\x85\x02\x06\x02r\xffq\x02\x06\x02s\xffq\x02\x06\x02\ +}\xff\xec\x02\x06\x02\x7f\xff\x85\x02\x06\x02\x85\xff\x85\x02\ +\x06\x02\x87\xff\x85\x02\x06\x02\x89\xff\x85\x02\x06\x02\x8d\xff\ +\x85\x02\x06\x02\xb2\xff\x85\x02\x06\x02\xb4\xff\x85\x02\x06\x02\ +\xce\xff\x85\x02\x06\x02\xcf\xffq\x02\x06\x02\xd9\xffq\x02\ +\x06\x02\xda\xff\xd7\x02\x06\x02\xdb\xffq\x02\x06\x02\xdc\xff\ +\xd7\x02\x06\x02\xdd\xffq\x02\x06\x02\xde\xff\xd7\x02\x06\x02\ +\xe0\xff\x85\x02\x06\x02\xe2\xff\xd7\x02\x06\x02\xe4\xff\xd7\x02\ +\x06\x02\xf0\xff\x85\x02\x06\x02\xf2\xff\x85\x02\x06\x02\xf4\xff\ +\x85\x02\x06\x03\x09\xffq\x02\x06\x03\x0a\xff\x85\x02\x06\x03\ +\x0b\xffq\x02\x06\x03\x0c\xff\x85\x02\x06\x03\x11\xff\x85\x02\ +\x06\x03\x12\xffq\x02\x06\x03\x16\xff\x85\x02\x06\x03\x1a\xff\ +\x85\x02\x06\x03\x1b\xff\x85\x02\x06\x03\x1c\xffq\x02\x06\x03\ +\x1d\xffq\x02\x06\x03\x1e\xff\xae\x02\x06\x03\x1f\xffq\x02\ +\x06\x03 \xff\xae\x02\x06\x03!\xffq\x02\x06\x03\x22\xff\ +\xae\x02\x06\x03#\xffq\x02\x06\x03%\xffq\x02\x06\x03\ +&\xff\xae\x02\x06\x03'\xffq\x02\x06\x03(\xff\xae\x02\ +\x06\x03)\xffq\x02\x06\x03*\xff\xae\x02\x06\x03+\xff\ +q\x02\x06\x03,\xff\xae\x02\x06\x03-\xffq\x02\x06\x03\ +.\xff\xae\x02\x06\x03/\xffq\x02\x06\x030\xff\xae\x02\ +\x06\x031\xffq\x02\x06\x032\xff\xae\x02\x06\x033\xff\ +q\x02\x06\x034\xff\xae\x02\x06\x036\xff\x85\x02\x06\x03\ +8\xff\x85\x02\x06\x03:\xff\x85\x02\x06\x03<\xff\x85\x02\ +\x06\x03@\xff\x85\x02\x06\x03B\xff\x85\x02\x06\x03D\xff\ +\x85\x02\x06\x03J\xff\x85\x02\x06\x03L\xff\x85\x02\x06\x03\ +N\xff\x85\x02\x06\x03R\xff\x85\x02\x06\x03T\xff\x85\x02\ +\x06\x03V\xff\x85\x02\x06\x03X\xff\x85\x02\x06\x03Z\xff\ +\x85\x02\x06\x03\x5c\xff\x85\x02\x06\x03^\xff\x85\x02\x06\x03\ +`\xff\x85\x02\x06\x03b\xff\xc3\x02\x06\x03d\xff\xc3\x02\ +\x06\x03f\xff\xc3\x02\x06\x03h\xff\xc3\x02\x06\x03j\xff\ +\xc3\x02\x06\x03l\xff\xc3\x02\x06\x03n\xff\xc3\x02\x06\x03\ +o\x00\x14\x02\x06\x03q\x00\x14\x02\x06\x03s\x00\x14\x02\ +\x06\x03\x8f\x00)\x02\x07\x00$\xffq\x02\x07\x007\x00\ +)\x02\x07\x009\x00)\x02\x07\x00:\x00)\x02\x07\x00\ +<\x00\x14\x02\x07\x00D\xff\xae\x02\x07\x00F\xff\x85\x02\ +\x07\x00G\xff\x85\x02\x07\x00H\xff\x85\x02\x07\x00J\xff\ +\xc3\x02\x07\x00P\xff\xc3\x02\x07\x00Q\xff\xc3\x02\x07\x00\ +R\xff\x85\x02\x07\x00S\xff\xc3\x02\x07\x00T\xff\x85\x02\ +\x07\x00U\xff\xc3\x02\x07\x00V\xff\xc3\x02\x07\x00X\xff\ +\xc3\x02\x07\x00\x82\xffq\x02\x07\x00\x83\xffq\x02\x07\x00\ +\x84\xffq\x02\x07\x00\x85\xffq\x02\x07\x00\x86\xffq\x02\ +\x07\x00\x87\xffq\x02\x07\x00\x9f\x00\x14\x02\x07\x00\xa2\xff\ +\x85\x02\x07\x00\xa3\xff\xae\x02\x07\x00\xa4\xff\xae\x02\x07\x00\ +\xa5\xff\xae\x02\x07\x00\xa6\xff\xae\x02\x07\x00\xa7\xff\xae\x02\ +\x07\x00\xa8\xff\xae\x02\x07\x00\xa9\xff\x85\x02\x07\x00\xaa\xff\ +\x85\x02\x07\x00\xab\xff\x85\x02\x07\x00\xac\xff\x85\x02\x07\x00\ +\xad\xff\x85\x02\x07\x00\xb4\xff\x85\x02\x07\x00\xb5\xff\x85\x02\ +\x07\x00\xb6\xff\x85\x02\x07\x00\xb7\xff\x85\x02\x07\x00\xb8\xff\ +\x85\x02\x07\x00\xba\xff\x85\x02\x07\x00\xbb\xff\xc3\x02\x07\x00\ +\xbc\xff\xc3\x02\x07\x00\xbd\xff\xc3\x02\x07\x00\xbe\xff\xc3\x02\ +\x07\x00\xc2\xffq\x02\x07\x00\xc3\xff\xae\x02\x07\x00\xc4\xff\ +q\x02\x07\x00\xc5\xff\xae\x02\x07\x00\xc6\xffq\x02\x07\x00\ +\xc7\xff\xae\x02\x07\x00\xc9\xff\x85\x02\x07\x00\xcb\xff\x85\x02\ +\x07\x00\xcd\xff\x85\x02\x07\x00\xcf\xff\x85\x02\x07\x00\xd1\xff\ +\x85\x02\x07\x00\xd3\xff\x85\x02\x07\x00\xd5\xff\x85\x02\x07\x00\ +\xd7\xff\x85\x02\x07\x00\xd9\xff\x85\x02\x07\x00\xdb\xff\x85\x02\ +\x07\x00\xdd\xff\x85\x02\x07\x00\xdf\xff\xc3\x02\x07\x00\xe1\xff\ +\xc3\x02\x07\x00\xe3\xff\xc3\x02\x07\x00\xe5\xff\xc3\x02\x07\x00\ +\xfa\xff\xc3\x02\x07\x01\x06\xff\xc3\x02\x07\x01\x08\xff\xc3\x02\ +\x07\x01\x0d\xff\xc3\x02\x07\x01\x0f\xff\x85\x02\x07\x01\x11\xff\ +\x85\x02\x07\x01\x13\xff\x85\x02\x07\x01\x15\xff\x85\x02\x07\x01\ +\x17\xff\xc3\x02\x07\x01\x19\xff\xc3\x02\x07\x01\x1d\xff\xc3\x02\ +\x07\x01!\xff\xc3\x02\x07\x01$\x00)\x02\x07\x01&\x00\ +)\x02\x07\x01+\xff\xc3\x02\x07\x01-\xff\xc3\x02\x07\x01\ +/\xff\xc3\x02\x07\x011\xff\xc3\x02\x07\x013\xff\xc3\x02\ +\x07\x015\xff\xc3\x02\x07\x016\x00)\x02\x07\x018\x00\ +\x14\x02\x07\x01:\x00\x14\x02\x07\x01C\xffq\x02\x07\x01\ +D\xff\xae\x02\x07\x01F\xff\xae\x02\x07\x01H\xff\x85\x02\ +\x07\x01J\xff\xc3\x02\x07\x01V\xffq\x02\x07\x01_\xff\ +q\x02\x07\x01b\xffq\x02\x07\x01i\xffq\x02\x07\x01\ +y\xff\xae\x02\x07\x01z\xff\xd7\x02\x07\x01{\xff\xd7\x02\ +\x07\x01~\xff\xae\x02\x07\x01\x81\xff\xc3\x02\x07\x01\x82\xff\ +\xd7\x02\x07\x01\x83\xff\xd7\x02\x07\x01\x84\xff\xd7\x02\x07\x01\ +\x87\xff\xd7\x02\x07\x01\x89\xff\xd7\x02\x07\x01\x8c\xff\xae\x02\ +\x07\x01\x8e\xff\xc3\x02\x07\x01\x8f\xff\xae\x02\x07\x01\x90\xff\ +\xae\x02\x07\x01\x93\xff\xae\x02\x07\x01\x99\xff\xae\x02\x07\x01\ +\xa4\xff\x85\x02\x07\x01\xaa\xffq\x02\x07\x01\xae\xff\x85\x02\ +\x07\x01\xb5\xff\x85\x02\x07\x01\xca\xff\xd7\x02\x07\x01\xce\xff\ +q\x02\x07\x01\xcf\xff\x85\x02\x07\x01\xd5\xffq\x02\x07\x01\ +\xd8\xff\x85\x02\x07\x01\xdb\xff\x85\x02\x07\x01\xde\xff\x85\x02\ +\x07\x01\xea\xff\x85\x02\x07\x01\xed\xff\x85\x02\x07\x01\xee\xff\ +\xc3\x02\x07\x01\xf2\xffq\x02\x07\x01\xfa\x00)\x02\x07\x01\ +\xfc\x00)\x02\x07\x01\xfe\x00)\x02\x07\x02\x00\x00\x14\x02\ +\x07\x02W\xff\xc3\x02\x07\x02X\xffq\x02\x07\x02Y\xff\ +\xae\x02\x07\x02`\xff\x85\x02\x07\x02b\xff\xc3\x02\x07\x02\ +j\xff\x85\x02\x07\x02r\xffq\x02\x07\x02s\xffq\x02\ +\x07\x02}\xff\xec\x02\x07\x02\x7f\xff\x85\x02\x07\x02\x85\xff\ +\x85\x02\x07\x02\x87\xff\x85\x02\x07\x02\x89\xff\x85\x02\x07\x02\ +\x8d\xff\x85\x02\x07\x02\xb2\xff\x85\x02\x07\x02\xb4\xff\x85\x02\ +\x07\x02\xce\xff\x85\x02\x07\x02\xcf\xffq\x02\x07\x02\xd9\xff\ +q\x02\x07\x02\xda\xff\xd7\x02\x07\x02\xdb\xffq\x02\x07\x02\ +\xdc\xff\xd7\x02\x07\x02\xdd\xffq\x02\x07\x02\xde\xff\xd7\x02\ +\x07\x02\xe0\xff\x85\x02\x07\x02\xe2\xff\xd7\x02\x07\x02\xe4\xff\ +\xd7\x02\x07\x02\xf0\xff\x85\x02\x07\x02\xf2\xff\x85\x02\x07\x02\ +\xf4\xff\x85\x02\x07\x03\x09\xffq\x02\x07\x03\x0a\xff\x85\x02\ +\x07\x03\x0b\xffq\x02\x07\x03\x0c\xff\x85\x02\x07\x03\x11\xff\ +\x85\x02\x07\x03\x12\xffq\x02\x07\x03\x16\xff\x85\x02\x07\x03\ +\x1a\xff\x85\x02\x07\x03\x1b\xff\x85\x02\x07\x03\x1c\xffq\x02\ +\x07\x03\x1d\xffq\x02\x07\x03\x1e\xff\xae\x02\x07\x03\x1f\xff\ +q\x02\x07\x03 \xff\xae\x02\x07\x03!\xffq\x02\x07\x03\ +\x22\xff\xae\x02\x07\x03#\xffq\x02\x07\x03%\xffq\x02\ +\x07\x03&\xff\xae\x02\x07\x03'\xffq\x02\x07\x03(\xff\ +\xae\x02\x07\x03)\xffq\x02\x07\x03*\xff\xae\x02\x07\x03\ ++\xffq\x02\x07\x03,\xff\xae\x02\x07\x03-\xffq\x02\ +\x07\x03.\xff\xae\x02\x07\x03/\xffq\x02\x07\x030\xff\ +\xae\x02\x07\x031\xffq\x02\x07\x032\xff\xae\x02\x07\x03\ +3\xffq\x02\x07\x034\xff\xae\x02\x07\x036\xff\x85\x02\ +\x07\x038\xff\x85\x02\x07\x03:\xff\x85\x02\x07\x03<\xff\ +\x85\x02\x07\x03@\xff\x85\x02\x07\x03B\xff\x85\x02\x07\x03\ +D\xff\x85\x02\x07\x03J\xff\x85\x02\x07\x03L\xff\x85\x02\ +\x07\x03N\xff\x85\x02\x07\x03R\xff\x85\x02\x07\x03T\xff\ +\x85\x02\x07\x03V\xff\x85\x02\x07\x03X\xff\x85\x02\x07\x03\ +Z\xff\x85\x02\x07\x03\x5c\xff\x85\x02\x07\x03^\xff\x85\x02\ +\x07\x03`\xff\x85\x02\x07\x03b\xff\xc3\x02\x07\x03d\xff\ +\xc3\x02\x07\x03f\xff\xc3\x02\x07\x03h\xff\xc3\x02\x07\x03\ +j\xff\xc3\x02\x07\x03l\xff\xc3\x02\x07\x03n\xff\xc3\x02\ +\x07\x03o\x00\x14\x02\x07\x03q\x00\x14\x02\x07\x03s\x00\ +\x14\x02\x07\x03\x8f\x00)\x02\x08\x00&\xff\x9a\x02\x08\x00\ +*\xff\x9a\x02\x08\x002\xff\x9a\x02\x08\x004\xff\x9a\x02\ +\x08\x007\xffq\x02\x08\x008\xff\xd7\x02\x08\x009\xff\ +\x85\x02\x08\x00:\xff\x85\x02\x08\x00<\xff\x85\x02\x08\x00\ +\x89\xff\x9a\x02\x08\x00\x94\xff\x9a\x02\x08\x00\x95\xff\x9a\x02\ +\x08\x00\x96\xff\x9a\x02\x08\x00\x97\xff\x9a\x02\x08\x00\x98\xff\ +\x9a\x02\x08\x00\x9a\xff\x9a\x02\x08\x00\x9b\xff\xd7\x02\x08\x00\ +\x9c\xff\xd7\x02\x08\x00\x9d\xff\xd7\x02\x08\x00\x9e\xff\xd7\x02\ +\x08\x00\x9f\xff\x85\x02\x08\x00\xc8\xff\x9a\x02\x08\x00\xca\xff\ +\x9a\x02\x08\x00\xcc\xff\x9a\x02\x08\x00\xce\xff\x9a\x02\x08\x00\ +\xde\xff\x9a\x02\x08\x00\xe0\xff\x9a\x02\x08\x00\xe2\xff\x9a\x02\ +\x08\x00\xe4\xff\x9a\x02\x08\x01\x0e\xff\x9a\x02\x08\x01\x10\xff\ +\x9a\x02\x08\x01\x12\xff\x9a\x02\x08\x01\x14\xff\x9a\x02\x08\x01\ +$\xffq\x02\x08\x01&\xffq\x02\x08\x01*\xff\xd7\x02\ +\x08\x01,\xff\xd7\x02\x08\x01.\xff\xd7\x02\x08\x010\xff\ +\xd7\x02\x08\x012\xff\xd7\x02\x08\x014\xff\xd7\x02\x08\x01\ +6\xff\x85\x02\x08\x018\xff\x85\x02\x08\x01:\xff\x85\x02\ +\x08\x01G\xff\x9a\x02\x08\x01f\xff\xae\x02\x08\x01m\xff\ +\xae\x02\x08\x01q\xffq\x02\x08\x01r\xff\x85\x02\x08\x01\ +s\xff\x9a\x02\x08\x01u\xff\x85\x02\x08\x01x\xff\x85\x02\ +\x08\x01\x85\xff\xd7\x02\x08\x01\x9d\xffq\x02\x08\x01\x9f\xff\ +\x9a\x02\x08\x01\xa6\xffq\x02\x08\x01\xb8\xff\x9a\x02\x08\x01\ +\xbb\xff\x9a\x02\x08\x01\xbc\xffq\x02\x08\x01\xbe\xff\xae\x02\ +\x08\x01\xc1\xff\x5c\x02\x08\x01\xc4\xffq\x02\x08\x01\xdc\xff\ +\x9a\x02\x08\x01\xe1\xff\x85\x02\x08\x01\xe4\xff\x9a\x02\x08\x01\ +\xfa\xff\x85\x02\x08\x01\xfc\xff\x85\x02\x08\x01\xfe\xff\x85\x02\ +\x08\x02\x00\xff\x85\x02\x08\x02T\xff\x85\x02\x08\x02_\xff\ +\x9a\x02\x08\x02a\xff\xd7\x02\x08\x02l\xff\x9a\x02\x08\x02\ +|\xff\x5c\x02\x08\x02~\xff\x9a\x02\x08\x02\x80\xff\x85\x02\ +\x08\x02\x82\xff\x85\x02\x08\x02\x84\xff\x9a\x02\x08\x02\x86\xff\ +\x9a\x02\x08\x02\x88\xff\x9a\x02\x08\x02\x8a\xff\x9a\x02\x08\x02\ +\x8c\xff\x9a\x02\x08\x02\xa9\xffq\x02\x08\x02\xaa\xff\x9a\x02\ +\x08\x02\xb1\xff\x9a\x02\x08\x02\xb3\xff\x9a\x02\x08\x02\xb5\xff\ +q\x02\x08\x02\xb6\xff\x9a\x02\x08\x02\xb7\xff\x85\x02\x08\x02\ +\xb9\xff\x85\x02\x08\x02\xbd\xffq\x02\x08\x02\xbe\xff\x9a\x02\ +\x08\x02\xbf\xff\x5c\x02\x08\x02\xc0\xff\x85\x02\x08\x02\xc1\xff\ +\x5c\x02\x08\x02\xc2\xff\x85\x02\x08\x02\xc5\xff\x85\x02\x08\x02\ +\xc7\xff\x85\x02\x08\x02\xd4\xff\x5c\x02\x08\x02\xd5\xff\x85\x02\ +\x08\x02\xef\xff\x9a\x02\x08\x02\xf1\xff\x9a\x02\x08\x02\xf3\xff\ +\x9a\x02\x08\x02\xfd\xff\x5c\x02\x08\x02\xfe\xff\x85\x02\x08\x03\ +\x0d\xff\x85\x02\x08\x03\x0e\xff\x9a\x02\x08\x03\x0f\xff\x85\x02\ +\x08\x03\x10\xff\x9a\x02\x08\x03\x15\xff\x9a\x02\x08\x03\x17\xff\ +q\x02\x08\x03\x18\xff\x9a\x02\x08\x03I\xff\x9a\x02\x08\x03\ +K\xff\x9a\x02\x08\x03M\xff\x9a\x02\x08\x03O\xff\x9a\x02\ +\x08\x03Q\xff\x9a\x02\x08\x03S\xff\x9a\x02\x08\x03U\xff\ +\x9a\x02\x08\x03W\xff\x9a\x02\x08\x03Y\xff\x9a\x02\x08\x03\ +[\xff\x9a\x02\x08\x03]\xff\x9a\x02\x08\x03_\xff\x9a\x02\ +\x08\x03a\xff\xd7\x02\x08\x03c\xff\xd7\x02\x08\x03e\xff\ +\xd7\x02\x08\x03g\xff\xd7\x02\x08\x03i\xff\xd7\x02\x08\x03\ +k\xff\xd7\x02\x08\x03m\xff\xd7\x02\x08\x03o\xff\x85\x02\ +\x08\x03q\xff\x85\x02\x08\x03s\xff\x85\x02\x08\x03\x8f\xff\ +q\x02\x0a\x00$\xffq\x02\x0a\x007\x00)\x02\x0a\x00\ +9\x00)\x02\x0a\x00:\x00)\x02\x0a\x00<\x00\x14\x02\ +\x0a\x00D\xff\xae\x02\x0a\x00F\xff\x85\x02\x0a\x00G\xff\ +\x85\x02\x0a\x00H\xff\x85\x02\x0a\x00J\xff\xc3\x02\x0a\x00\ +P\xff\xc3\x02\x0a\x00Q\xff\xc3\x02\x0a\x00R\xff\x85\x02\ +\x0a\x00S\xff\xc3\x02\x0a\x00T\xff\x85\x02\x0a\x00U\xff\ +\xc3\x02\x0a\x00V\xff\xc3\x02\x0a\x00X\xff\xc3\x02\x0a\x00\ +\x82\xffq\x02\x0a\x00\x83\xffq\x02\x0a\x00\x84\xffq\x02\ +\x0a\x00\x85\xffq\x02\x0a\x00\x86\xffq\x02\x0a\x00\x87\xff\ +q\x02\x0a\x00\x9f\x00\x14\x02\x0a\x00\xa2\xff\x85\x02\x0a\x00\ +\xa3\xff\xae\x02\x0a\x00\xa4\xff\xae\x02\x0a\x00\xa5\xff\xae\x02\ +\x0a\x00\xa6\xff\xae\x02\x0a\x00\xa7\xff\xae\x02\x0a\x00\xa8\xff\ +\xae\x02\x0a\x00\xa9\xff\x85\x02\x0a\x00\xaa\xff\x85\x02\x0a\x00\ +\xab\xff\x85\x02\x0a\x00\xac\xff\x85\x02\x0a\x00\xad\xff\x85\x02\ +\x0a\x00\xb4\xff\x85\x02\x0a\x00\xb5\xff\x85\x02\x0a\x00\xb6\xff\ +\x85\x02\x0a\x00\xb7\xff\x85\x02\x0a\x00\xb8\xff\x85\x02\x0a\x00\ +\xba\xff\x85\x02\x0a\x00\xbb\xff\xc3\x02\x0a\x00\xbc\xff\xc3\x02\ +\x0a\x00\xbd\xff\xc3\x02\x0a\x00\xbe\xff\xc3\x02\x0a\x00\xc2\xff\ +q\x02\x0a\x00\xc3\xff\xae\x02\x0a\x00\xc4\xffq\x02\x0a\x00\ +\xc5\xff\xae\x02\x0a\x00\xc6\xffq\x02\x0a\x00\xc7\xff\xae\x02\ +\x0a\x00\xc9\xff\x85\x02\x0a\x00\xcb\xff\x85\x02\x0a\x00\xcd\xff\ +\x85\x02\x0a\x00\xcf\xff\x85\x02\x0a\x00\xd1\xff\x85\x02\x0a\x00\ +\xd3\xff\x85\x02\x0a\x00\xd5\xff\x85\x02\x0a\x00\xd7\xff\x85\x02\ +\x0a\x00\xd9\xff\x85\x02\x0a\x00\xdb\xff\x85\x02\x0a\x00\xdd\xff\ +\x85\x02\x0a\x00\xdf\xff\xc3\x02\x0a\x00\xe1\xff\xc3\x02\x0a\x00\ +\xe3\xff\xc3\x02\x0a\x00\xe5\xff\xc3\x02\x0a\x00\xfa\xff\xc3\x02\ +\x0a\x01\x06\xff\xc3\x02\x0a\x01\x08\xff\xc3\x02\x0a\x01\x0d\xff\ +\xc3\x02\x0a\x01\x0f\xff\x85\x02\x0a\x01\x11\xff\x85\x02\x0a\x01\ +\x13\xff\x85\x02\x0a\x01\x15\xff\x85\x02\x0a\x01\x17\xff\xc3\x02\ +\x0a\x01\x19\xff\xc3\x02\x0a\x01\x1d\xff\xc3\x02\x0a\x01!\xff\ +\xc3\x02\x0a\x01$\x00)\x02\x0a\x01&\x00)\x02\x0a\x01\ ++\xff\xc3\x02\x0a\x01-\xff\xc3\x02\x0a\x01/\xff\xc3\x02\ +\x0a\x011\xff\xc3\x02\x0a\x013\xff\xc3\x02\x0a\x015\xff\ +\xc3\x02\x0a\x016\x00)\x02\x0a\x018\x00\x14\x02\x0a\x01\ +:\x00\x14\x02\x0a\x01C\xffq\x02\x0a\x01D\xff\xae\x02\ +\x0a\x01F\xff\xae\x02\x0a\x01H\xff\x85\x02\x0a\x01J\xff\ +\xc3\x02\x0a\x01V\xffq\x02\x0a\x01_\xffq\x02\x0a\x01\ +b\xffq\x02\x0a\x01i\xffq\x02\x0a\x01y\xff\xae\x02\ +\x0a\x01z\xff\xd7\x02\x0a\x01{\xff\xd7\x02\x0a\x01~\xff\ +\xae\x02\x0a\x01\x81\xff\xc3\x02\x0a\x01\x82\xff\xd7\x02\x0a\x01\ +\x83\xff\xd7\x02\x0a\x01\x84\xff\xd7\x02\x0a\x01\x87\xff\xd7\x02\ +\x0a\x01\x89\xff\xd7\x02\x0a\x01\x8c\xff\xae\x02\x0a\x01\x8e\xff\ +\xc3\x02\x0a\x01\x8f\xff\xae\x02\x0a\x01\x90\xff\xae\x02\x0a\x01\ +\x93\xff\xae\x02\x0a\x01\x99\xff\xae\x02\x0a\x01\xa4\xff\x85\x02\ +\x0a\x01\xaa\xffq\x02\x0a\x01\xae\xff\x85\x02\x0a\x01\xb5\xff\ +\x85\x02\x0a\x01\xca\xff\xd7\x02\x0a\x01\xce\xffq\x02\x0a\x01\ +\xcf\xff\x85\x02\x0a\x01\xd5\xffq\x02\x0a\x01\xd8\xff\x85\x02\ +\x0a\x01\xdb\xff\x85\x02\x0a\x01\xde\xff\x85\x02\x0a\x01\xea\xff\ +\x85\x02\x0a\x01\xed\xff\x85\x02\x0a\x01\xee\xff\xc3\x02\x0a\x01\ +\xf2\xffq\x02\x0a\x01\xfa\x00)\x02\x0a\x01\xfc\x00)\x02\ +\x0a\x01\xfe\x00)\x02\x0a\x02\x00\x00\x14\x02\x0a\x02W\xff\ +\xc3\x02\x0a\x02X\xffq\x02\x0a\x02Y\xff\xae\x02\x0a\x02\ +`\xff\x85\x02\x0a\x02b\xff\xc3\x02\x0a\x02j\xff\x85\x02\ +\x0a\x02r\xffq\x02\x0a\x02s\xffq\x02\x0a\x02}\xff\ +\xec\x02\x0a\x02\x7f\xff\x85\x02\x0a\x02\x85\xff\x85\x02\x0a\x02\ +\x87\xff\x85\x02\x0a\x02\x89\xff\x85\x02\x0a\x02\x8d\xff\x85\x02\ +\x0a\x02\xb2\xff\x85\x02\x0a\x02\xb4\xff\x85\x02\x0a\x02\xce\xff\ +\x85\x02\x0a\x02\xcf\xffq\x02\x0a\x02\xd9\xffq\x02\x0a\x02\ +\xda\xff\xd7\x02\x0a\x02\xdb\xffq\x02\x0a\x02\xdc\xff\xd7\x02\ +\x0a\x02\xdd\xffq\x02\x0a\x02\xde\xff\xd7\x02\x0a\x02\xe0\xff\ +\x85\x02\x0a\x02\xe2\xff\xd7\x02\x0a\x02\xe4\xff\xd7\x02\x0a\x02\ +\xf0\xff\x85\x02\x0a\x02\xf2\xff\x85\x02\x0a\x02\xf4\xff\x85\x02\ +\x0a\x03\x09\xffq\x02\x0a\x03\x0a\xff\x85\x02\x0a\x03\x0b\xff\ +q\x02\x0a\x03\x0c\xff\x85\x02\x0a\x03\x11\xff\x85\x02\x0a\x03\ +\x12\xffq\x02\x0a\x03\x16\xff\x85\x02\x0a\x03\x1a\xff\x85\x02\ +\x0a\x03\x1b\xff\x85\x02\x0a\x03\x1c\xffq\x02\x0a\x03\x1d\xff\ +q\x02\x0a\x03\x1e\xff\xae\x02\x0a\x03\x1f\xffq\x02\x0a\x03\ + \xff\xae\x02\x0a\x03!\xffq\x02\x0a\x03\x22\xff\xae\x02\ +\x0a\x03#\xffq\x02\x0a\x03%\xffq\x02\x0a\x03&\xff\ +\xae\x02\x0a\x03'\xffq\x02\x0a\x03(\xff\xae\x02\x0a\x03\ +)\xffq\x02\x0a\x03*\xff\xae\x02\x0a\x03+\xffq\x02\ +\x0a\x03,\xff\xae\x02\x0a\x03-\xffq\x02\x0a\x03.\xff\ +\xae\x02\x0a\x03/\xffq\x02\x0a\x030\xff\xae\x02\x0a\x03\ +1\xffq\x02\x0a\x032\xff\xae\x02\x0a\x033\xffq\x02\ +\x0a\x034\xff\xae\x02\x0a\x036\xff\x85\x02\x0a\x038\xff\ +\x85\x02\x0a\x03:\xff\x85\x02\x0a\x03<\xff\x85\x02\x0a\x03\ +@\xff\x85\x02\x0a\x03B\xff\x85\x02\x0a\x03D\xff\x85\x02\ +\x0a\x03J\xff\x85\x02\x0a\x03L\xff\x85\x02\x0a\x03N\xff\ +\x85\x02\x0a\x03R\xff\x85\x02\x0a\x03T\xff\x85\x02\x0a\x03\ +V\xff\x85\x02\x0a\x03X\xff\x85\x02\x0a\x03Z\xff\x85\x02\ +\x0a\x03\x5c\xff\x85\x02\x0a\x03^\xff\x85\x02\x0a\x03`\xff\ +\x85\x02\x0a\x03b\xff\xc3\x02\x0a\x03d\xff\xc3\x02\x0a\x03\ +f\xff\xc3\x02\x0a\x03h\xff\xc3\x02\x0a\x03j\xff\xc3\x02\ +\x0a\x03l\xff\xc3\x02\x0a\x03n\xff\xc3\x02\x0a\x03o\x00\ +\x14\x02\x0a\x03q\x00\x14\x02\x0a\x03s\x00\x14\x02\x0a\x03\ +\x8f\x00)\x02\x0c\x00&\xff\x9a\x02\x0c\x00*\xff\x9a\x02\ +\x0c\x002\xff\x9a\x02\x0c\x004\xff\x9a\x02\x0c\x007\xff\ +q\x02\x0c\x008\xff\xd7\x02\x0c\x009\xff\x85\x02\x0c\x00\ +:\xff\x85\x02\x0c\x00<\xff\x85\x02\x0c\x00\x89\xff\x9a\x02\ +\x0c\x00\x94\xff\x9a\x02\x0c\x00\x95\xff\x9a\x02\x0c\x00\x96\xff\ +\x9a\x02\x0c\x00\x97\xff\x9a\x02\x0c\x00\x98\xff\x9a\x02\x0c\x00\ +\x9a\xff\x9a\x02\x0c\x00\x9b\xff\xd7\x02\x0c\x00\x9c\xff\xd7\x02\ +\x0c\x00\x9d\xff\xd7\x02\x0c\x00\x9e\xff\xd7\x02\x0c\x00\x9f\xff\ +\x85\x02\x0c\x00\xc8\xff\x9a\x02\x0c\x00\xca\xff\x9a\x02\x0c\x00\ +\xcc\xff\x9a\x02\x0c\x00\xce\xff\x9a\x02\x0c\x00\xde\xff\x9a\x02\ +\x0c\x00\xe0\xff\x9a\x02\x0c\x00\xe2\xff\x9a\x02\x0c\x00\xe4\xff\ +\x9a\x02\x0c\x01\x0e\xff\x9a\x02\x0c\x01\x10\xff\x9a\x02\x0c\x01\ +\x12\xff\x9a\x02\x0c\x01\x14\xff\x9a\x02\x0c\x01$\xffq\x02\ +\x0c\x01&\xffq\x02\x0c\x01*\xff\xd7\x02\x0c\x01,\xff\ +\xd7\x02\x0c\x01.\xff\xd7\x02\x0c\x010\xff\xd7\x02\x0c\x01\ +2\xff\xd7\x02\x0c\x014\xff\xd7\x02\x0c\x016\xff\x85\x02\ +\x0c\x018\xff\x85\x02\x0c\x01:\xff\x85\x02\x0c\x01G\xff\ +\x9a\x02\x0c\x01f\xff\xae\x02\x0c\x01m\xff\xae\x02\x0c\x01\ +q\xffq\x02\x0c\x01r\xff\x85\x02\x0c\x01s\xff\x9a\x02\ +\x0c\x01u\xff\x85\x02\x0c\x01x\xff\x85\x02\x0c\x01\x85\xff\ +\xd7\x02\x0c\x01\x9d\xffq\x02\x0c\x01\x9f\xff\x9a\x02\x0c\x01\ +\xa6\xffq\x02\x0c\x01\xb8\xff\x9a\x02\x0c\x01\xbb\xff\x9a\x02\ +\x0c\x01\xbc\xffq\x02\x0c\x01\xbe\xff\xae\x02\x0c\x01\xc1\xff\ +\x5c\x02\x0c\x01\xc4\xffq\x02\x0c\x01\xdc\xff\x9a\x02\x0c\x01\ +\xe1\xff\x85\x02\x0c\x01\xe4\xff\x9a\x02\x0c\x01\xfa\xff\x85\x02\ +\x0c\x01\xfc\xff\x85\x02\x0c\x01\xfe\xff\x85\x02\x0c\x02\x00\xff\ +\x85\x02\x0c\x02T\xff\x85\x02\x0c\x02_\xff\x9a\x02\x0c\x02\ +a\xff\xd7\x02\x0c\x02l\xff\x9a\x02\x0c\x02|\xff\x5c\x02\ +\x0c\x02~\xff\x9a\x02\x0c\x02\x80\xff\x85\x02\x0c\x02\x82\xff\ +\x85\x02\x0c\x02\x84\xff\x9a\x02\x0c\x02\x86\xff\x9a\x02\x0c\x02\ +\x88\xff\x9a\x02\x0c\x02\x8a\xff\x9a\x02\x0c\x02\x8c\xff\x9a\x02\ +\x0c\x02\xa9\xffq\x02\x0c\x02\xaa\xff\x9a\x02\x0c\x02\xb1\xff\ +\x9a\x02\x0c\x02\xb3\xff\x9a\x02\x0c\x02\xb5\xffq\x02\x0c\x02\ +\xb6\xff\x9a\x02\x0c\x02\xb7\xff\x85\x02\x0c\x02\xb9\xff\x85\x02\ +\x0c\x02\xbd\xffq\x02\x0c\x02\xbe\xff\x9a\x02\x0c\x02\xbf\xff\ +\x5c\x02\x0c\x02\xc0\xff\x85\x02\x0c\x02\xc1\xff\x5c\x02\x0c\x02\ +\xc2\xff\x85\x02\x0c\x02\xc5\xff\x85\x02\x0c\x02\xc7\xff\x85\x02\ +\x0c\x02\xd4\xff\x5c\x02\x0c\x02\xd5\xff\x85\x02\x0c\x02\xef\xff\ +\x9a\x02\x0c\x02\xf1\xff\x9a\x02\x0c\x02\xf3\xff\x9a\x02\x0c\x02\ +\xfd\xff\x5c\x02\x0c\x02\xfe\xff\x85\x02\x0c\x03\x0d\xff\x85\x02\ +\x0c\x03\x0e\xff\x9a\x02\x0c\x03\x0f\xff\x85\x02\x0c\x03\x10\xff\ +\x9a\x02\x0c\x03\x15\xff\x9a\x02\x0c\x03\x17\xffq\x02\x0c\x03\ +\x18\xff\x9a\x02\x0c\x03I\xff\x9a\x02\x0c\x03K\xff\x9a\x02\ +\x0c\x03M\xff\x9a\x02\x0c\x03O\xff\x9a\x02\x0c\x03Q\xff\ +\x9a\x02\x0c\x03S\xff\x9a\x02\x0c\x03U\xff\x9a\x02\x0c\x03\ +W\xff\x9a\x02\x0c\x03Y\xff\x9a\x02\x0c\x03[\xff\x9a\x02\ +\x0c\x03]\xff\x9a\x02\x0c\x03_\xff\x9a\x02\x0c\x03a\xff\ +\xd7\x02\x0c\x03c\xff\xd7\x02\x0c\x03e\xff\xd7\x02\x0c\x03\ +g\xff\xd7\x02\x0c\x03i\xff\xd7\x02\x0c\x03k\xff\xd7\x02\ +\x0c\x03m\xff\xd7\x02\x0c\x03o\xff\x85\x02\x0c\x03q\xff\ +\x85\x02\x0c\x03s\xff\x85\x02\x0c\x03\x8f\xffq\x02!\x01\ +q\xff\xd7\x02!\x01r\xff\xec\x02!\x01x\xff\xec\x02\ +!\x02T\xff\xec\x02S\x00\x0f\xff\xc3\x02S\x00\x11\xff\ +\xc3\x02S\x02\x08\xff\xc3\x02S\x02\x0c\xff\xc3\x02T\x00\ +\x0f\xff\x85\x02T\x00\x11\xff\x85\x02T\x01V\xff\x85\x02\ +T\x01_\xff\x85\x02T\x01b\xff\x85\x02T\x01f\xff\ +\xd7\x02T\x01i\xff\x85\x02T\x01m\xff\xd7\x02T\x01\ +s\xff\xc3\x02T\x01v\xff\xec\x02T\x01y\xff\x9a\x02\ +T\x01z\xff\xae\x02T\x01{\xff\xc3\x02T\x01|\xff\ +\xc3\x02T\x01}\xff\xc3\x02T\x01~\xff\x9a\x02T\x01\ +\x81\xff\xc3\x02T\x01\x82\xff\xae\x02T\x01\x84\xff\xc3\x02\ +T\x01\x86\xff\xc3\x02T\x01\x87\xff\xc3\x02T\x01\x89\xff\ +\xc3\x02T\x01\x8c\xff\x9a\x02T\x01\x8e\xff\x9a\x02T\x01\ +\x8f\xff\x9a\x02T\x01\x90\xff\x9a\x02T\x01\x92\xff\xc3\x02\ +T\x01\x93\xff\x9a\x02T\x01\x95\xff\xc3\x02T\x01\x96\xff\ +\xc3\x02T\x01\x98\xff\xc3\x02T\x01\x99\xff\x9a\x02T\x01\ +\x9a\xff\xc3\x02T\x01\x9b\xff\xc3\x02T\x02\x08\xff\x85\x02\ +T\x02\x0c\xff\x85\x02T\x02!\xff\xec\x02X\x00\x05\xff\ +q\x02X\x00\x0a\xffq\x02X\x00&\xff\xd7\x02X\x00\ +*\xff\xd7\x02X\x00-\x01\x0a\x02X\x002\xff\xd7\x02\ +X\x004\xff\xd7\x02X\x007\xffq\x02X\x009\xff\ +\xae\x02X\x00:\xff\xae\x02X\x00<\xff\x85\x02X\x00\ +\x89\xff\xd7\x02X\x00\x94\xff\xd7\x02X\x00\x95\xff\xd7\x02\ +X\x00\x96\xff\xd7\x02X\x00\x97\xff\xd7\x02X\x00\x98\xff\ +\xd7\x02X\x00\x9a\xff\xd7\x02X\x00\x9f\xff\x85\x02X\x00\ +\xc8\xff\xd7\x02X\x00\xca\xff\xd7\x02X\x00\xcc\xff\xd7\x02\ +X\x00\xce\xff\xd7\x02X\x00\xde\xff\xd7\x02X\x00\xe0\xff\ +\xd7\x02X\x00\xe2\xff\xd7\x02X\x00\xe4\xff\xd7\x02X\x01\ +\x0e\xff\xd7\x02X\x01\x10\xff\xd7\x02X\x01\x12\xff\xd7\x02\ +X\x01\x14\xff\xd7\x02X\x01$\xffq\x02X\x01&\xff\ +q\x02X\x016\xff\xae\x02X\x018\xff\x85\x02X\x01\ +:\xff\x85\x02X\x01G\xff\xd7\x02X\x01\xfa\xff\xae\x02\ +X\x01\xfc\xff\xae\x02X\x01\xfe\xff\xae\x02X\x02\x00\xff\ +\x85\x02X\x02\x07\xffq\x02X\x02\x0b\xffq\x02X\x02\ +_\xff\xd7\x02X\x03I\xff\xd7\x02X\x03K\xff\xd7\x02\ +X\x03M\xff\xd7\x02X\x03O\xff\xd7\x02X\x03Q\xff\ +\xd7\x02X\x03S\xff\xd7\x02X\x03U\xff\xd7\x02X\x03\ +W\xff\xd7\x02X\x03Y\xff\xd7\x02X\x03[\xff\xd7\x02\ +X\x03]\xff\xd7\x02X\x03_\xff\xd7\x02X\x03o\xff\ +\x85\x02X\x03q\xff\x85\x02X\x03s\xff\x85\x02X\x03\ +\x8f\xffq\x02Y\x00\x05\xff\xec\x02Y\x00\x0a\xff\xec\x02\ +Y\x02\x07\xff\xec\x02Y\x02\x0b\xff\xec\x02Z\x00\x0f\xff\ +\xae\x02Z\x00\x11\xff\xae\x02Z\x01V\xff\xd7\x02Z\x01\ +_\xff\xd7\x02Z\x01b\xff\xd7\x02Z\x01d\xff\xec\x02\ +Z\x01i\xff\xd7\x02Z\x01p\xff\xec\x02Z\x01q\xff\ +\xc3\x02Z\x01r\xff\xec\x02Z\x01t\xff\xd7\x02Z\x01\ +u\xff\xec\x02Z\x01x\xff\xec\x02Z\x01\x88\xff\xec\x02\ +Z\x02\x08\xff\xae\x02Z\x02\x0c\xff\xae\x02Z\x02T\xff\ +\xec\x02`\x00I\x00R\x02`\x00W\x00R\x02`\x00\ +Y\x00f\x02`\x00Z\x00f\x02`\x00[\x00f\x02\ +`\x00\x5c\x00f\x02`\x00\xbf\x00f\x02`\x01%\x00\ +R\x02`\x01'\x00R\x02`\x017\x00f\x02`\x01\ +\xfb\x00f\x02`\x01\xfd\x00f\x02`\x024\x00R\x02\ +`\x025\x00R\x02`\x02]\x00R\x02`\x02^\x00\ +R\x02`\x03p\x00f\x02`\x03\x8d\x00R\x02`\x03\ +\x90\x00R\x02b\x00I\x00f\x02b\x00W\x00f\x02\ +b\x00Y\x00f\x02b\x00Z\x00f\x02b\x00[\x00\ +f\x02b\x00\x5c\x00f\x02b\x00\xbf\x00f\x02b\x01\ +%\x00f\x02b\x01'\x00f\x02b\x017\x00f\x02\ +b\x01\xfb\x00f\x02b\x01\xfd\x00f\x02b\x024\x00\ +f\x02b\x025\x00f\x02b\x02]\x00f\x02b\x02\ +^\x00f\x02b\x03p\x00f\x02b\x03\x8d\x00f\x02\ +b\x03\x90\x00f\x02j\x00\x05\xff\xec\x02j\x00\x0a\xff\ +\xec\x02j\x02\x07\xff\xec\x02j\x02\x0b\xff\xec\x02l\x00\ +\x0f\xff\xae\x02l\x00\x11\xff\xae\x02l\x01\x9d\xff\xec\x02\ +l\x01\xa4\xff\xd7\x02l\x01\xa6\xff\xec\x02l\x01\xa8\xff\ +\xd7\x02l\x01\xaa\xff\xd7\x02l\x01\xae\xff\xd7\x02l\x01\ +\xb0\xff\xd7\x02l\x01\xb1\xff\xec\x02l\x01\xb5\xff\xd7\x02\ +l\x01\xbc\xff\xc3\x02l\x01\xbd\xff\xd7\x02l\x01\xbf\xff\ +\xd7\x02l\x01\xc1\xff\xd7\x02l\x01\xc4\xff\xec\x02l\x01\ +\xc7\xff\xec\x02l\x01\xce\xff\xec\x02l\x01\xd5\xff\xec\x02\ +l\x01\xf2\xff\xec\x02l\x02\x08\xff\xae\x02l\x02\x0c\xff\ +\xae\x02l\x02r\xff\xd7\x02l\x02s\xff\xec\x02l\x02\ +z\xff\xec\x02l\x02|\xff\xd7\x02l\x02\x80\xff\xec\x02\ +l\x02\x82\xff\xec\x02l\x02\x9f\xff\xd7\x02l\x02\xa1\xff\ +\xec\x02l\x02\xa9\xff\xec\x02l\x02\xb5\xff\xc3\x02l\x02\ +\xb7\xff\xec\x02l\x02\xb9\xff\xec\x02l\x02\xbb\xff\xd7\x02\ +l\x02\xbd\xff\xec\x02l\x02\xbf\xff\xd7\x02l\x02\xc1\xff\ +\xd7\x02l\x02\xca\xff\xd7\x02l\x02\xce\xff\xd7\x02l\x02\ +\xcf\xff\xec\x02l\x02\xd4\xff\xd7\x02l\x02\xd9\xff\xd7\x02\ +l\x02\xdb\xff\xd7\x02l\x02\xdd\xff\xd7\x02l\x02\xe5\xff\ +\xd7\x02l\x02\xe7\xff\xec\x02l\x02\xf5\xff\xec\x02l\x02\ +\xf7\xff\xd7\x02l\x02\xf9\xff\xd7\x02l\x02\xfb\xff\xd7\x02\ +l\x02\xfd\xff\xd7\x02l\x03\x05\xff\xd7\x02l\x03\x07\xff\ +\xd7\x02l\x03\x0d\xff\xd7\x02l\x03\x0f\xff\xd7\x02l\x03\ +\x11\xff\xd7\x02l\x03\x12\xff\xec\x02l\x03\x17\xff\xec\x02\ +l\x03\x1b\xff\xd7\x02l\x03\x1c\xff\xec\x02m\x00\x0f\xff\ +\xae\x02m\x00\x11\xff\xae\x02m\x01\xce\xff\xd7\x02m\x01\ +\xd5\xff\xd7\x02m\x01\xf2\xff\xd7\x02m\x02\x08\xff\xae\x02\ +m\x02\x0c\xff\xae\x02m\x02s\xff\xd7\x02m\x02\xcf\xff\ +\xd7\x02m\x03\x12\xff\xd7\x02m\x03\x1c\xff\xd7\x02n\x00\ +\x05\xff\xae\x02n\x00\x0a\xff\xae\x02n\x01\x9d\xff\xd7\x02\ +n\x01\xa6\xff\xd7\x02n\x01\xbc\xff\xae\x02n\x01\xc1\xff\ +\xae\x02n\x01\xc4\xff\xd7\x02n\x01\xdc\xff\xd7\x02n\x01\ +\xe4\xff\xd7\x02n\x02\x07\xff\xae\x02n\x02\x0b\xff\xae\x02\ +n\x02|\xff\xae\x02n\x02\x80\xff\xc3\x02n\x02\x82\xff\ +\xc3\x02n\x02\xa9\xff\xd7\x02n\x02\xaa\xff\xd7\x02n\x02\ +\xb5\xff\xae\x02n\x02\xb6\xff\xd7\x02n\x02\xb7\xff\xc3\x02\ +n\x02\xb9\xff\xc3\x02n\x02\xbd\xff\xd7\x02n\x02\xbe\xff\ +\xd7\x02n\x02\xbf\xff\xae\x02n\x02\xc1\xff\xae\x02n\x02\ +\xd4\xff\xae\x02n\x02\xfd\xff\xae\x02n\x03\x0d\xff\x9a\x02\ +n\x03\x0f\xff\x9a\x02n\x03\x17\xff\xd7\x02n\x03\x18\xff\ +\xd7\x02o\x00\x05\xff\x85\x02o\x00\x0a\xff\x85\x02o\x01\ +\xd0\xff\xd7\x02o\x01\xdc\xff\x9a\x02o\x01\xdd\xff\xc3\x02\ +o\x01\xdf\xff\xd7\x02o\x01\xe1\xff\xae\x02o\x01\xe4\xff\ +\x9a\x02o\x01\xf6\xff\xc3\x02o\x02\x07\xff\x85\x02o\x02\ +\x0b\xff\x85\x02o\x02m\xff\xd7\x02o\x02\x81\xff\xd7\x02\ +o\x02\x83\xff\xd7\x02o\x02\x8b\xff\xd7\x02o\x02\xa0\xff\ +\xd7\x02o\x02\xaa\xff\x9a\x02o\x02\xb6\xff\x9a\x02o\x02\ +\xb8\xff\xc3\x02o\x02\xba\xff\xc3\x02o\x02\xbc\xff\xd7\x02\ +o\x02\xbe\xff\x9a\x02o\x02\xc0\xff\xae\x02o\x02\xc2\xff\ +\xae\x02o\x02\xc6\xff\xd7\x02o\x02\xc8\xff\xd7\x02o\x02\ +\xcb\xff\xd7\x02o\x02\xd5\xff\xae\x02o\x02\xe6\xff\xd7\x02\ +o\x02\xea\xff\xd7\x02o\x02\xf8\xff\xc3\x02o\x02\xfa\xff\ +\xc3\x02o\x02\xfc\xff\xc3\x02o\x02\xfe\xff\xae\x02o\x03\ +\x06\xff\xd7\x02o\x03\x08\xff\xd7\x02o\x03\x0e\xff\x9a\x02\ +o\x03\x10\xff\x9a\x02o\x03\x18\xff\x9a\x02p\x01\x9f\xff\ +\xd7\x02p\x01\xb8\xff\xd7\x02p\x01\xbb\xff\xd7\x02p\x01\ +\xbe\xff\xd7\x02p\x01\xe1\xff\xd7\x02p\x02l\xff\xd7\x02\ +p\x02~\xff\xd7\x02p\x02\x84\xff\xd7\x02p\x02\x86\xff\ +\xd7\x02p\x02\x88\xff\xd7\x02p\x02\x8a\xff\xd7\x02p\x02\ +\x8c\xff\xd7\x02p\x02\xb1\xff\xd7\x02p\x02\xb3\xff\xd7\x02\ +p\x02\xc0\xff\xd7\x02p\x02\xc2\xff\xd7\x02p\x02\xc5\xff\ +\xd7\x02p\x02\xc7\xff\xd7\x02p\x02\xd5\xff\xd7\x02p\x02\ +\xef\xff\xd7\x02p\x02\xf1\xff\xd7\x02p\x02\xf3\xff\xd7\x02\ +p\x02\xfe\xff\xd7\x02p\x03\x09\xff\xd7\x02p\x03\x0b\xff\ +\xd7\x02p\x03\x0e\xff\xd7\x02p\x03\x10\xff\xd7\x02p\x03\ +\x15\xff\xd7\x02r\x00\x05\xffq\x02r\x00\x0a\xffq\x02\ +r\x01\x9d\xff\x9a\x02r\x01\xa6\xff\x9a\x02r\x01\xbc\xff\ +q\x02r\x01\xbe\xff\xd7\x02r\x01\xc1\xff\x9a\x02r\x01\ +\xc4\xff\x9a\x02r\x01\xdc\xff\xd7\x02r\x01\xe1\xff\xd7\x02\ +r\x01\xe4\xff\xd7\x02r\x02\x07\xffq\x02r\x02\x0b\xff\ +q\x02r\x02n\xff\xd7\x02r\x02|\xff\x9a\x02r\x02\ +\x80\xff\xae\x02r\x02\x82\xff\xae\x02r\x02\x97\xff\xd7\x02\ +r\x02\x9b\xff\xd7\x02r\x02\xa7\xff\xd7\x02r\x02\xa9\xff\ +\x9a\x02r\x02\xaa\xff\xd7\x02r\x02\xb5\xffq\x02r\x02\ +\xb6\xff\xd7\x02r\x02\xb7\xff\x85\x02r\x02\xb9\xff\x85\x02\ +r\x02\xbd\xff\x9a\x02r\x02\xbe\xff\xd7\x02r\x02\xbf\xff\ +\x9a\x02r\x02\xc0\xff\xd7\x02r\x02\xc1\xff\x9a\x02r\x02\ +\xc2\xff\xd7\x02r\x02\xc5\xff\x9a\x02r\x02\xc7\xff\x9a\x02\ +r\x02\xd4\xff\x9a\x02r\x02\xd5\xff\xd7\x02r\x02\xe1\xff\ +\xd7\x02r\x02\xe3\xff\xd7\x02r\x02\xfd\xff\x9a\x02r\x02\ +\xfe\xff\xd7\x02r\x03\x03\xff\xd7\x02r\x03\x0d\xffq\x02\ +r\x03\x0e\xff\xd7\x02r\x03\x0f\xffq\x02r\x03\x10\xff\ +\xd7\x02r\x03\x17\xff\x9a\x02r\x03\x18\xff\xd7\x02s\x00\ +\x05\xffq\x02s\x00\x0a\xffq\x02s\x01\xcf\xff\xd7\x02\ +s\x01\xd8\xff\xd7\x02s\x01\xdb\xff\xd7\x02s\x01\xdc\xff\ +\x9a\x02s\x01\xdd\xff\xc3\x02s\x01\xde\xff\xd7\x02s\x01\ +\xe1\xff\xc3\x02s\x01\xe4\xff\x9a\x02s\x01\xea\xff\xd7\x02\ +s\x01\xed\xff\xd7\x02s\x01\xf6\xff\xc3\x02s\x02\x07\xff\ +q\x02s\x02\x0b\xffq\x02s\x02j\xff\xd7\x02s\x02\ +m\xff\xd7\x02s\x02}\xff\xec\x02s\x02\x7f\xff\xd7\x02\ +s\x02\x81\xff\xd7\x02s\x02\x83\xff\xd7\x02s\x02\x85\xff\ +\xd7\x02s\x02\x87\xff\xd7\x02s\x02\x89\xff\xd7\x02s\x02\ +\x8b\xff\xd7\x02s\x02\x8d\xff\xd7\x02s\x02\xaa\xff\x9a\x02\ +s\x02\xb2\xff\xd7\x02s\x02\xb4\xff\xd7\x02s\x02\xb6\xff\ +\x9a\x02s\x02\xb8\xff\xd7\x02s\x02\xba\xff\xd7\x02s\x02\ +\xbe\xff\x9a\x02s\x02\xc0\xff\xc3\x02s\x02\xc2\xff\xc3\x02\ +s\x02\xc6\xff\xd7\x02s\x02\xc8\xff\xd7\x02s\x02\xd5\xff\ +\xc3\x02s\x02\xe0\xff\xd7\x02s\x02\xf0\xff\xd7\x02s\x02\ +\xf2\xff\xd7\x02s\x02\xf4\xff\xd7\x02s\x02\xf8\xff\xc3\x02\ +s\x02\xfa\xff\xc3\x02s\x02\xfc\xff\xc3\x02s\x02\xfe\xff\ +\xc3\x02s\x03\x0a\xff\xd7\x02s\x03\x0c\xff\xd7\x02s\x03\ +\x0e\xff\x85\x02s\x03\x10\xff\x85\x02s\x03\x16\xff\xd7\x02\ +s\x03\x18\xff\x9a\x02s\x03\x1a\xff\xd7\x02t\x00\x05\xff\ +q\x02t\x00\x0a\xffq\x02t\x01\x9d\xff\x9a\x02t\x01\ +\xa6\xff\x9a\x02t\x01\xbc\xffq\x02t\x01\xbe\xff\xd7\x02\ +t\x01\xc1\xff\x9a\x02t\x01\xc4\xff\x9a\x02t\x01\xdc\xff\ +\xd7\x02t\x01\xe1\xff\xd7\x02t\x01\xe4\xff\xd7\x02t\x02\ +\x07\xffq\x02t\x02\x0b\xffq\x02t\x02n\xff\xd7\x02\ +t\x02|\xff\x9a\x02t\x02\x80\xff\xae\x02t\x02\x82\xff\ +\xae\x02t\x02\x97\xff\xd7\x02t\x02\x9b\xff\xd7\x02t\x02\ +\xa7\xff\xd7\x02t\x02\xa9\xff\x9a\x02t\x02\xaa\xff\xd7\x02\ +t\x02\xb5\xffq\x02t\x02\xb6\xff\xd7\x02t\x02\xb7\xff\ +\x85\x02t\x02\xb9\xff\x85\x02t\x02\xbd\xff\x9a\x02t\x02\ +\xbe\xff\xd7\x02t\x02\xbf\xff\x9a\x02t\x02\xc0\xff\xd7\x02\ +t\x02\xc1\xff\x9a\x02t\x02\xc2\xff\xd7\x02t\x02\xc5\xff\ +\x9a\x02t\x02\xc7\xff\x9a\x02t\x02\xd4\xff\x9a\x02t\x02\ +\xd5\xff\xd7\x02t\x02\xe1\xff\xd7\x02t\x02\xe3\xff\xd7\x02\ +t\x02\xfd\xff\x9a\x02t\x02\xfe\xff\xd7\x02t\x03\x03\xff\ +\xd7\x02t\x03\x0d\xffq\x02t\x03\x0e\xff\xd7\x02t\x03\ +\x0f\xffq\x02t\x03\x10\xff\xd7\x02t\x03\x17\xff\x9a\x02\ +t\x03\x18\xff\xd7\x02u\x00\x05\xffq\x02u\x00\x0a\xff\ +q\x02u\x01\xcf\xff\xd7\x02u\x01\xd8\xff\xd7\x02u\x01\ +\xdb\xff\xd7\x02u\x01\xdc\xff\x9a\x02u\x01\xdd\xff\xc3\x02\ +u\x01\xde\xff\xd7\x02u\x01\xe1\xff\xc3\x02u\x01\xe4\xff\ +\x9a\x02u\x01\xea\xff\xd7\x02u\x01\xed\xff\xd7\x02u\x01\ +\xf6\xff\xc3\x02u\x02\x07\xffq\x02u\x02\x0b\xffq\x02\ +u\x02j\xff\xd7\x02u\x02m\xff\xd7\x02u\x02}\xff\ +\xec\x02u\x02\x7f\xff\xd7\x02u\x02\x81\xff\xd7\x02u\x02\ +\x83\xff\xd7\x02u\x02\x85\xff\xd7\x02u\x02\x87\xff\xd7\x02\ +u\x02\x89\xff\xd7\x02u\x02\x8b\xff\xd7\x02u\x02\x8d\xff\ +\xd7\x02u\x02\xaa\xff\x9a\x02u\x02\xb2\xff\xd7\x02u\x02\ +\xb4\xff\xd7\x02u\x02\xb6\xff\x9a\x02u\x02\xb8\xff\xd7\x02\ +u\x02\xba\xff\xd7\x02u\x02\xbe\xff\x9a\x02u\x02\xc0\xff\ +\xc3\x02u\x02\xc2\xff\xc3\x02u\x02\xc6\xff\xd7\x02u\x02\ +\xc8\xff\xd7\x02u\x02\xd5\xff\xc3\x02u\x02\xe0\xff\xd7\x02\ +u\x02\xf0\xff\xd7\x02u\x02\xf2\xff\xd7\x02u\x02\xf4\xff\ +\xd7\x02u\x02\xf8\xff\xc3\x02u\x02\xfa\xff\xc3\x02u\x02\ +\xfc\xff\xc3\x02u\x02\xfe\xff\xc3\x02u\x03\x0a\xff\xd7\x02\ +u\x03\x0c\xff\xd7\x02u\x03\x0e\xff\x85\x02u\x03\x10\xff\ +\x85\x02u\x03\x16\xff\xd7\x02u\x03\x18\xff\x9a\x02u\x03\ +\x1a\xff\xd7\x02v\x03\x0d\xff\xec\x02v\x03\x0f\xff\xec\x02\ +x\x03\x0d\xff\xec\x02x\x03\x0f\xff\xec\x02z\x00\x0f\xff\ +\xae\x02z\x00\x11\xff\xae\x02z\x02\x08\xff\xae\x02z\x02\ +\x0c\xff\xae\x02z\x02\x80\xff\xec\x02z\x02\x82\xff\xec\x02\ +z\x02\xb7\xff\xec\x02z\x02\xb9\xff\xec\x02z\x03\x0d\xff\ +\xd7\x02z\x03\x0f\xff\xd7\x02|\x00\x0f\xffq\x02|\x00\ +\x11\xffq\x02|\x01\xa4\xff\xc3\x02|\x01\xaa\xff\xae\x02\ +|\x01\xae\xff\xc3\x02|\x01\xb5\xff\xc3\x02|\x01\xce\xff\ +\xd7\x02|\x01\xd5\xff\xd7\x02|\x01\xf2\xff\xd7\x02|\x02\ +\x08\xffq\x02|\x02\x0c\xffq\x02|\x02r\xff\xae\x02\ +|\x02s\xff\xd7\x02|\x02\xce\xff\xc3\x02|\x02\xcf\xff\ +\xd7\x02|\x02\xd9\xff\xae\x02|\x02\xdb\xff\xae\x02|\x02\ +\xdd\xff\xae\x02|\x03\x09\xff\xae\x02|\x03\x0b\xff\xae\x02\ +|\x03\x11\xff\xc3\x02|\x03\x12\xff\xd7\x02|\x03\x1b\xff\ +\xc3\x02|\x03\x1c\xff\xd7\x02}\x00\x05\xff\xec\x02}\x00\ +\x0a\xff\xec\x02}\x01\xd0\xff\xd7\x02}\x01\xdc\xff\xec\x02\ +}\x01\xdd\xff\xec\x02}\x01\xdf\xff\xd7\x02}\x01\xe1\xff\ +\xec\x02}\x01\xe4\xff\xec\x02}\x01\xf6\xff\xec\x02}\x02\ +\x07\xff\xec\x02}\x02\x0b\xff\xec\x02}\x02\xa0\xff\xd7\x02\ +}\x02\xaa\xff\xec\x02}\x02\xb6\xff\xec\x02}\x02\xbc\xff\ +\xd7\x02}\x02\xbe\xff\xec\x02}\x02\xc0\xff\xec\x02}\x02\ +\xc2\xff\xec\x02}\x02\xcb\xff\xd7\x02}\x02\xd5\xff\xec\x02\ +}\x02\xe6\xff\xd7\x02}\x02\xf8\xff\xec\x02}\x02\xfa\xff\ +\xec\x02}\x02\xfc\xff\xec\x02}\x02\xfe\xff\xec\x02}\x03\ +\x06\xff\xd7\x02}\x03\x08\xff\xd7\x02}\x03\x0e\xff\xec\x02\ +}\x03\x10\xff\xec\x02}\x03\x18\xff\xec\x02~\x00\x0f\xff\ +\xae\x02~\x00\x11\xff\xae\x02~\x01\x9d\xff\xec\x02~\x01\ +\xa4\xff\xd7\x02~\x01\xa6\xff\xec\x02~\x01\xa8\xff\xd7\x02\ +~\x01\xaa\xff\xd7\x02~\x01\xae\xff\xd7\x02~\x01\xb0\xff\ +\xd7\x02~\x01\xb1\xff\xec\x02~\x01\xb5\xff\xd7\x02~\x01\ +\xbc\xff\xc3\x02~\x01\xbd\xff\xd7\x02~\x01\xbf\xff\xd7\x02\ +~\x01\xc1\xff\xd7\x02~\x01\xc4\xff\xec\x02~\x01\xc7\xff\ +\xec\x02~\x01\xce\xff\xec\x02~\x01\xd5\xff\xec\x02~\x01\ +\xf2\xff\xec\x02~\x02\x08\xff\xae\x02~\x02\x0c\xff\xae\x02\ +~\x02r\xff\xd7\x02~\x02s\xff\xec\x02~\x02z\xff\ +\xec\x02~\x02|\xff\xd7\x02~\x02\x80\xff\xec\x02~\x02\ +\x82\xff\xec\x02~\x02\x9f\xff\xd7\x02~\x02\xa1\xff\xec\x02\ +~\x02\xa9\xff\xec\x02~\x02\xb5\xff\xc3\x02~\x02\xb7\xff\ +\xec\x02~\x02\xb9\xff\xec\x02~\x02\xbb\xff\xd7\x02~\x02\ +\xbd\xff\xec\x02~\x02\xbf\xff\xd7\x02~\x02\xc1\xff\xd7\x02\ +~\x02\xca\xff\xd7\x02~\x02\xce\xff\xd7\x02~\x02\xcf\xff\ +\xec\x02~\x02\xd4\xff\xd7\x02~\x02\xd9\xff\xd7\x02~\x02\ +\xdb\xff\xd7\x02~\x02\xdd\xff\xd7\x02~\x02\xe5\xff\xd7\x02\ +~\x02\xe7\xff\xec\x02~\x02\xf5\xff\xec\x02~\x02\xf7\xff\ +\xd7\x02~\x02\xf9\xff\xd7\x02~\x02\xfb\xff\xd7\x02~\x02\ +\xfd\xff\xd7\x02~\x03\x05\xff\xd7\x02~\x03\x07\xff\xd7\x02\ +~\x03\x0d\xff\xd7\x02~\x03\x0f\xff\xd7\x02~\x03\x11\xff\ +\xd7\x02~\x03\x12\xff\xec\x02~\x03\x17\xff\xec\x02~\x03\ +\x1b\xff\xd7\x02~\x03\x1c\xff\xec\x02\x7f\x00\x05\xff\xec\x02\ +\x7f\x00\x0a\xff\xec\x02\x7f\x01\xd0\xff\xd7\x02\x7f\x01\xdc\xff\ +\xec\x02\x7f\x01\xdd\xff\xec\x02\x7f\x01\xdf\xff\xd7\x02\x7f\x01\ +\xe1\xff\xec\x02\x7f\x01\xe4\xff\xec\x02\x7f\x01\xf6\xff\xec\x02\ +\x7f\x02\x07\xff\xec\x02\x7f\x02\x0b\xff\xec\x02\x7f\x02\xa0\xff\ +\xd7\x02\x7f\x02\xaa\xff\xec\x02\x7f\x02\xb6\xff\xec\x02\x7f\x02\ +\xbc\xff\xd7\x02\x7f\x02\xbe\xff\xec\x02\x7f\x02\xc0\xff\xec\x02\ +\x7f\x02\xc2\xff\xec\x02\x7f\x02\xcb\xff\xd7\x02\x7f\x02\xd5\xff\ +\xec\x02\x7f\x02\xe6\xff\xd7\x02\x7f\x02\xf8\xff\xec\x02\x7f\x02\ +\xfa\xff\xec\x02\x7f\x02\xfc\xff\xec\x02\x7f\x02\xfe\xff\xec\x02\ +\x7f\x03\x06\xff\xd7\x02\x7f\x03\x08\xff\xd7\x02\x7f\x03\x0e\xff\ +\xec\x02\x7f\x03\x10\xff\xec\x02\x7f\x03\x18\xff\xec\x02\x80\x00\ +\x0f\xff\x85\x02\x80\x00\x11\xff\x85\x02\x80\x01\x9f\xff\xec\x02\ +\x80\x01\xa4\xff\x9a\x02\x80\x01\xaa\xffq\x02\x80\x01\xae\xff\ +\x9a\x02\x80\x01\xb5\xff\x9a\x02\x80\x01\xb8\xff\xec\x02\x80\x01\ +\xbb\xff\xec\x02\x80\x01\xbe\xff\xc3\x02\x80\x01\xc9\xff\xec\x02\ +\x80\x01\xce\xff\xae\x02\x80\x01\xcf\xff\xd7\x02\x80\x01\xd5\xff\ +\xae\x02\x80\x01\xd8\xff\xd7\x02\x80\x01\xdb\xff\xd7\x02\x80\x01\ +\xde\xff\xd7\x02\x80\x01\xe1\xff\xd7\x02\x80\x01\xea\xff\xd7\x02\ +\x80\x01\xeb\x00f\x02\x80\x01\xed\xff\xd7\x02\x80\x01\xee\xff\ +\xec\x02\x80\x01\xf2\xff\xae\x02\x80\x01\xf4\x00f\x02\x80\x02\ +\x08\xff\x85\x02\x80\x02\x0c\xff\x85\x02\x80\x02j\xff\xd7\x02\ +\x80\x02l\xff\xec\x02\x80\x02r\xffq\x02\x80\x02s\xff\ +\xae\x02\x80\x02~\xff\xec\x02\x80\x02\x7f\xff\xd7\x02\x80\x02\ +\x84\xff\xec\x02\x80\x02\x85\xff\xd7\x02\x80\x02\x86\xff\xec\x02\ +\x80\x02\x87\xff\xd7\x02\x80\x02\x88\xff\xec\x02\x80\x02\x89\xff\ +\xd7\x02\x80\x02\x8a\xff\xec\x02\x80\x02\x8c\xff\xec\x02\x80\x02\ +\x8d\xff\xd7\x02\x80\x02\x98\x00f\x02\x80\x02\xa8\x00f\x02\ +\x80\x02\xb1\xff\xec\x02\x80\x02\xb2\xff\xd7\x02\x80\x02\xb3\xff\ +\xec\x02\x80\x02\xb4\xff\xd7\x02\x80\x02\xc0\xff\xd7\x02\x80\x02\ +\xc2\xff\xd7\x02\x80\x02\xc5\xff\xd7\x02\x80\x02\xc6\xff\xc3\x02\ +\x80\x02\xc7\xff\xd7\x02\x80\x02\xc8\xff\xc3\x02\x80\x02\xce\xff\ +\x9a\x02\x80\x02\xcf\xff\xae\x02\x80\x02\xd5\xff\xd7\x02\x80\x02\ +\xd9\xffq\x02\x80\x02\xdb\xffq\x02\x80\x02\xdd\xffq\x02\ +\x80\x02\xe0\xff\xd7\x02\x80\x02\xef\xff\xec\x02\x80\x02\xf0\xff\ +\xd7\x02\x80\x02\xf1\xff\xec\x02\x80\x02\xf2\xff\xd7\x02\x80\x02\ +\xf3\xff\xec\x02\x80\x02\xf4\xff\xd7\x02\x80\x02\xfe\xff\xd7\x02\ +\x80\x03\x09\xffq\x02\x80\x03\x0a\xff\xd7\x02\x80\x03\x0b\xff\ +q\x02\x80\x03\x0c\xff\xd7\x02\x80\x03\x11\xff\x9a\x02\x80\x03\ +\x12\xff\xae\x02\x80\x03\x15\xff\xec\x02\x80\x03\x16\xff\xd7\x02\ +\x80\x03\x1a\xff\xd7\x02\x80\x03\x1b\xff\x9a\x02\x80\x03\x1c\xff\ +\xae\x02\x81\x00\x0f\xff\xae\x02\x81\x00\x11\xff\xae\x02\x81\x01\ +\xce\xff\xd7\x02\x81\x01\xd5\xff\xd7\x02\x81\x01\xf2\xff\xd7\x02\ +\x81\x02\x08\xff\xae\x02\x81\x02\x0c\xff\xae\x02\x81\x02s\xff\ +\xd7\x02\x81\x02\xcf\xff\xd7\x02\x81\x03\x12\xff\xd7\x02\x81\x03\ +\x1c\xff\xd7\x02\x82\x00\x0f\xff\x85\x02\x82\x00\x11\xff\x85\x02\ +\x82\x01\x9f\xff\xec\x02\x82\x01\xa4\xff\x9a\x02\x82\x01\xaa\xff\ +q\x02\x82\x01\xae\xff\x9a\x02\x82\x01\xb5\xff\x9a\x02\x82\x01\ +\xb8\xff\xec\x02\x82\x01\xbb\xff\xec\x02\x82\x01\xbe\xff\xc3\x02\ +\x82\x01\xc9\xff\xec\x02\x82\x01\xce\xff\xae\x02\x82\x01\xcf\xff\ +\xd7\x02\x82\x01\xd5\xff\xae\x02\x82\x01\xd8\xff\xd7\x02\x82\x01\ +\xdb\xff\xd7\x02\x82\x01\xde\xff\xd7\x02\x82\x01\xe1\xff\xd7\x02\ +\x82\x01\xea\xff\xd7\x02\x82\x01\xeb\x00f\x02\x82\x01\xed\xff\ +\xd7\x02\x82\x01\xee\xff\xec\x02\x82\x01\xf2\xff\xae\x02\x82\x01\ +\xf4\x00f\x02\x82\x02\x08\xff\x85\x02\x82\x02\x0c\xff\x85\x02\ +\x82\x02j\xff\xd7\x02\x82\x02l\xff\xec\x02\x82\x02r\xff\ +q\x02\x82\x02s\xff\xae\x02\x82\x02~\xff\xec\x02\x82\x02\ +\x7f\xff\xd7\x02\x82\x02\x84\xff\xec\x02\x82\x02\x85\xff\xd7\x02\ +\x82\x02\x86\xff\xec\x02\x82\x02\x87\xff\xd7\x02\x82\x02\x88\xff\ +\xec\x02\x82\x02\x89\xff\xd7\x02\x82\x02\x8a\xff\xec\x02\x82\x02\ +\x8c\xff\xec\x02\x82\x02\x8d\xff\xd7\x02\x82\x02\x98\x00f\x02\ +\x82\x02\xa8\x00f\x02\x82\x02\xb1\xff\xec\x02\x82\x02\xb2\xff\ +\xd7\x02\x82\x02\xb3\xff\xec\x02\x82\x02\xb4\xff\xd7\x02\x82\x02\ +\xc0\xff\xd7\x02\x82\x02\xc2\xff\xd7\x02\x82\x02\xc5\xff\xd7\x02\ +\x82\x02\xc6\xff\xc3\x02\x82\x02\xc7\xff\xd7\x02\x82\x02\xc8\xff\ +\xc3\x02\x82\x02\xce\xff\x9a\x02\x82\x02\xcf\xff\xae\x02\x82\x02\ +\xd5\xff\xd7\x02\x82\x02\xd9\xffq\x02\x82\x02\xdb\xffq\x02\ +\x82\x02\xdd\xffq\x02\x82\x02\xe0\xff\xd7\x02\x82\x02\xef\xff\ +\xec\x02\x82\x02\xf0\xff\xd7\x02\x82\x02\xf1\xff\xec\x02\x82\x02\ +\xf2\xff\xd7\x02\x82\x02\xf3\xff\xec\x02\x82\x02\xf4\xff\xd7\x02\ +\x82\x02\xfe\xff\xd7\x02\x82\x03\x09\xffq\x02\x82\x03\x0a\xff\ +\xd7\x02\x82\x03\x0b\xffq\x02\x82\x03\x0c\xff\xd7\x02\x82\x03\ +\x11\xff\x9a\x02\x82\x03\x12\xff\xae\x02\x82\x03\x15\xff\xec\x02\ +\x82\x03\x16\xff\xd7\x02\x82\x03\x1a\xff\xd7\x02\x82\x03\x1b\xff\ +\x9a\x02\x82\x03\x1c\xff\xae\x02\x83\x00\x0f\xff\xae\x02\x83\x00\ +\x11\xff\xae\x02\x83\x01\xce\xff\xd7\x02\x83\x01\xd5\xff\xd7\x02\ +\x83\x01\xf2\xff\xd7\x02\x83\x02\x08\xff\xae\x02\x83\x02\x0c\xff\ +\xae\x02\x83\x02s\xff\xd7\x02\x83\x02\xcf\xff\xd7\x02\x83\x03\ +\x12\xff\xd7\x02\x83\x03\x1c\xff\xd7\x02\x84\x00\x0f\xff\xae\x02\ +\x84\x00\x11\xff\xae\x02\x84\x01\xce\xff\xd7\x02\x84\x01\xd5\xff\ +\xd7\x02\x84\x01\xf2\xff\xd7\x02\x84\x02\x08\xff\xae\x02\x84\x02\ +\x0c\xff\xae\x02\x84\x02s\xff\xd7\x02\x84\x02\xcf\xff\xd7\x02\ +\x84\x03\x12\xff\xd7\x02\x84\x03\x1c\xff\xd7\x02\x85\x00\x0f\xff\ +\xae\x02\x85\x00\x11\xff\xae\x02\x85\x01\xce\xff\xd7\x02\x85\x01\ +\xd5\xff\xd7\x02\x85\x01\xf2\xff\xd7\x02\x85\x02\x08\xff\xae\x02\ +\x85\x02\x0c\xff\xae\x02\x85\x02s\xff\xd7\x02\x85\x02\xcf\xff\ +\xd7\x02\x85\x03\x12\xff\xd7\x02\x85\x03\x1c\xff\xd7\x02\x86\x00\ +\x0f\xff\xae\x02\x86\x00\x11\xff\xae\x02\x86\x01\x9d\xff\xec\x02\ +\x86\x01\xa4\xff\xd7\x02\x86\x01\xa6\xff\xec\x02\x86\x01\xa8\xff\ +\xd7\x02\x86\x01\xaa\xff\xd7\x02\x86\x01\xae\xff\xd7\x02\x86\x01\ +\xb0\xff\xd7\x02\x86\x01\xb1\xff\xec\x02\x86\x01\xb5\xff\xd7\x02\ +\x86\x01\xbc\xff\xc3\x02\x86\x01\xbd\xff\xd7\x02\x86\x01\xbf\xff\ +\xd7\x02\x86\x01\xc1\xff\xd7\x02\x86\x01\xc4\xff\xec\x02\x86\x01\ +\xc7\xff\xec\x02\x86\x01\xce\xff\xec\x02\x86\x01\xd5\xff\xec\x02\ +\x86\x01\xf2\xff\xec\x02\x86\x02\x08\xff\xae\x02\x86\x02\x0c\xff\ +\xae\x02\x86\x02r\xff\xd7\x02\x86\x02s\xff\xec\x02\x86\x02\ +z\xff\xec\x02\x86\x02|\xff\xd7\x02\x86\x02\x80\xff\xec\x02\ +\x86\x02\x82\xff\xec\x02\x86\x02\x9f\xff\xd7\x02\x86\x02\xa1\xff\ +\xec\x02\x86\x02\xa9\xff\xec\x02\x86\x02\xb5\xff\xc3\x02\x86\x02\ +\xb7\xff\xec\x02\x86\x02\xb9\xff\xec\x02\x86\x02\xbb\xff\xd7\x02\ +\x86\x02\xbd\xff\xec\x02\x86\x02\xbf\xff\xd7\x02\x86\x02\xc1\xff\ +\xd7\x02\x86\x02\xca\xff\xd7\x02\x86\x02\xce\xff\xd7\x02\x86\x02\ +\xcf\xff\xec\x02\x86\x02\xd4\xff\xd7\x02\x86\x02\xd9\xff\xd7\x02\ +\x86\x02\xdb\xff\xd7\x02\x86\x02\xdd\xff\xd7\x02\x86\x02\xe5\xff\ +\xd7\x02\x86\x02\xe7\xff\xec\x02\x86\x02\xf5\xff\xec\x02\x86\x02\ +\xf7\xff\xd7\x02\x86\x02\xf9\xff\xd7\x02\x86\x02\xfb\xff\xd7\x02\ +\x86\x02\xfd\xff\xd7\x02\x86\x03\x05\xff\xd7\x02\x86\x03\x07\xff\ +\xd7\x02\x86\x03\x0d\xff\xd7\x02\x86\x03\x0f\xff\xd7\x02\x86\x03\ +\x11\xff\xd7\x02\x86\x03\x12\xff\xec\x02\x86\x03\x17\xff\xec\x02\ +\x86\x03\x1b\xff\xd7\x02\x86\x03\x1c\xff\xec\x02\x87\x00\x05\xff\ +\xec\x02\x87\x00\x0a\xff\xec\x02\x87\x01\xd0\xff\xd7\x02\x87\x01\ +\xdc\xff\xec\x02\x87\x01\xdd\xff\xec\x02\x87\x01\xdf\xff\xd7\x02\ +\x87\x01\xe1\xff\xec\x02\x87\x01\xe4\xff\xec\x02\x87\x01\xf6\xff\ +\xec\x02\x87\x02\x07\xff\xec\x02\x87\x02\x0b\xff\xec\x02\x87\x02\ +\xa0\xff\xd7\x02\x87\x02\xaa\xff\xec\x02\x87\x02\xb6\xff\xec\x02\ +\x87\x02\xbc\xff\xd7\x02\x87\x02\xbe\xff\xec\x02\x87\x02\xc0\xff\ +\xec\x02\x87\x02\xc2\xff\xec\x02\x87\x02\xcb\xff\xd7\x02\x87\x02\ +\xd5\xff\xec\x02\x87\x02\xe6\xff\xd7\x02\x87\x02\xf8\xff\xec\x02\ +\x87\x02\xfa\xff\xec\x02\x87\x02\xfc\xff\xec\x02\x87\x02\xfe\xff\ +\xec\x02\x87\x03\x06\xff\xd7\x02\x87\x03\x08\xff\xd7\x02\x87\x03\ +\x0e\xff\xec\x02\x87\x03\x10\xff\xec\x02\x87\x03\x18\xff\xec\x02\ +\x88\x00\x0f\xff\xae\x02\x88\x00\x11\xff\xae\x02\x88\x01\x9d\xff\ +\xec\x02\x88\x01\xa4\xff\xd7\x02\x88\x01\xa6\xff\xec\x02\x88\x01\ +\xa8\xff\xd7\x02\x88\x01\xaa\xff\xd7\x02\x88\x01\xae\xff\xd7\x02\ +\x88\x01\xb0\xff\xd7\x02\x88\x01\xb1\xff\xec\x02\x88\x01\xb5\xff\ +\xd7\x02\x88\x01\xbc\xff\xc3\x02\x88\x01\xbd\xff\xd7\x02\x88\x01\ +\xbf\xff\xd7\x02\x88\x01\xc1\xff\xd7\x02\x88\x01\xc4\xff\xec\x02\ +\x88\x01\xc7\xff\xec\x02\x88\x01\xce\xff\xec\x02\x88\x01\xd5\xff\ +\xec\x02\x88\x01\xf2\xff\xec\x02\x88\x02\x08\xff\xae\x02\x88\x02\ +\x0c\xff\xae\x02\x88\x02r\xff\xd7\x02\x88\x02s\xff\xec\x02\ +\x88\x02z\xff\xec\x02\x88\x02|\xff\xd7\x02\x88\x02\x80\xff\ +\xec\x02\x88\x02\x82\xff\xec\x02\x88\x02\x9f\xff\xd7\x02\x88\x02\ +\xa1\xff\xec\x02\x88\x02\xa9\xff\xec\x02\x88\x02\xb5\xff\xc3\x02\ +\x88\x02\xb7\xff\xec\x02\x88\x02\xb9\xff\xec\x02\x88\x02\xbb\xff\ +\xd7\x02\x88\x02\xbd\xff\xec\x02\x88\x02\xbf\xff\xd7\x02\x88\x02\ +\xc1\xff\xd7\x02\x88\x02\xca\xff\xd7\x02\x88\x02\xce\xff\xd7\x02\ +\x88\x02\xcf\xff\xec\x02\x88\x02\xd4\xff\xd7\x02\x88\x02\xd9\xff\ +\xd7\x02\x88\x02\xdb\xff\xd7\x02\x88\x02\xdd\xff\xd7\x02\x88\x02\ +\xe5\xff\xd7\x02\x88\x02\xe7\xff\xec\x02\x88\x02\xf5\xff\xec\x02\ +\x88\x02\xf7\xff\xd7\x02\x88\x02\xf9\xff\xd7\x02\x88\x02\xfb\xff\ +\xd7\x02\x88\x02\xfd\xff\xd7\x02\x88\x03\x05\xff\xd7\x02\x88\x03\ +\x07\xff\xd7\x02\x88\x03\x0d\xff\xd7\x02\x88\x03\x0f\xff\xd7\x02\ +\x88\x03\x11\xff\xd7\x02\x88\x03\x12\xff\xec\x02\x88\x03\x17\xff\ +\xec\x02\x88\x03\x1b\xff\xd7\x02\x88\x03\x1c\xff\xec\x02\x89\x00\ +\x05\xff\xec\x02\x89\x00\x0a\xff\xec\x02\x89\x01\xd0\xff\xd7\x02\ +\x89\x01\xdc\xff\xec\x02\x89\x01\xdd\xff\xec\x02\x89\x01\xdf\xff\ +\xd7\x02\x89\x01\xe1\xff\xec\x02\x89\x01\xe4\xff\xec\x02\x89\x01\ +\xf6\xff\xec\x02\x89\x02\x07\xff\xec\x02\x89\x02\x0b\xff\xec\x02\ +\x89\x02\xa0\xff\xd7\x02\x89\x02\xaa\xff\xec\x02\x89\x02\xb6\xff\ +\xec\x02\x89\x02\xbc\xff\xd7\x02\x89\x02\xbe\xff\xec\x02\x89\x02\ +\xc0\xff\xec\x02\x89\x02\xc2\xff\xec\x02\x89\x02\xcb\xff\xd7\x02\ +\x89\x02\xd5\xff\xec\x02\x89\x02\xe6\xff\xd7\x02\x89\x02\xf8\xff\ +\xec\x02\x89\x02\xfa\xff\xec\x02\x89\x02\xfc\xff\xec\x02\x89\x02\ +\xfe\xff\xec\x02\x89\x03\x06\xff\xd7\x02\x89\x03\x08\xff\xd7\x02\ +\x89\x03\x0e\xff\xec\x02\x89\x03\x10\xff\xec\x02\x89\x03\x18\xff\ +\xec\x02\x8a\x00\x0f\xff\xae\x02\x8a\x00\x11\xff\xae\x02\x8a\x01\ +\x9d\xff\xec\x02\x8a\x01\xa4\xff\xd7\x02\x8a\x01\xa6\xff\xec\x02\ +\x8a\x01\xa8\xff\xd7\x02\x8a\x01\xaa\xff\xd7\x02\x8a\x01\xae\xff\ +\xd7\x02\x8a\x01\xb0\xff\xd7\x02\x8a\x01\xb1\xff\xec\x02\x8a\x01\ +\xb5\xff\xd7\x02\x8a\x01\xbc\xff\xc3\x02\x8a\x01\xbd\xff\xd7\x02\ +\x8a\x01\xbf\xff\xd7\x02\x8a\x01\xc1\xff\xd7\x02\x8a\x01\xc4\xff\ +\xec\x02\x8a\x01\xc7\xff\xec\x02\x8a\x01\xce\xff\xec\x02\x8a\x01\ +\xd5\xff\xec\x02\x8a\x01\xf2\xff\xec\x02\x8a\x02\x08\xff\xae\x02\ +\x8a\x02\x0c\xff\xae\x02\x8a\x02r\xff\xd7\x02\x8a\x02s\xff\ +\xec\x02\x8a\x02z\xff\xec\x02\x8a\x02|\xff\xd7\x02\x8a\x02\ +\x80\xff\xec\x02\x8a\x02\x82\xff\xec\x02\x8a\x02\x9f\xff\xd7\x02\ +\x8a\x02\xa1\xff\xec\x02\x8a\x02\xa9\xff\xec\x02\x8a\x02\xb5\xff\ +\xc3\x02\x8a\x02\xb7\xff\xec\x02\x8a\x02\xb9\xff\xec\x02\x8a\x02\ +\xbb\xff\xd7\x02\x8a\x02\xbd\xff\xec\x02\x8a\x02\xbf\xff\xd7\x02\ +\x8a\x02\xc1\xff\xd7\x02\x8a\x02\xca\xff\xd7\x02\x8a\x02\xce\xff\ +\xd7\x02\x8a\x02\xcf\xff\xec\x02\x8a\x02\xd4\xff\xd7\x02\x8a\x02\ +\xd9\xff\xd7\x02\x8a\x02\xdb\xff\xd7\x02\x8a\x02\xdd\xff\xd7\x02\ +\x8a\x02\xe5\xff\xd7\x02\x8a\x02\xe7\xff\xec\x02\x8a\x02\xf5\xff\ +\xec\x02\x8a\x02\xf7\xff\xd7\x02\x8a\x02\xf9\xff\xd7\x02\x8a\x02\ +\xfb\xff\xd7\x02\x8a\x02\xfd\xff\xd7\x02\x8a\x03\x05\xff\xd7\x02\ +\x8a\x03\x07\xff\xd7\x02\x8a\x03\x0d\xff\xd7\x02\x8a\x03\x0f\xff\ +\xd7\x02\x8a\x03\x11\xff\xd7\x02\x8a\x03\x12\xff\xec\x02\x8a\x03\ +\x17\xff\xec\x02\x8a\x03\x1b\xff\xd7\x02\x8a\x03\x1c\xff\xec\x02\ +\x8b\x00\x0f\xff\xae\x02\x8b\x00\x11\xff\xae\x02\x8b\x01\xce\xff\ +\xd7\x02\x8b\x01\xd5\xff\xd7\x02\x8b\x01\xf2\xff\xd7\x02\x8b\x02\ +\x08\xff\xae\x02\x8b\x02\x0c\xff\xae\x02\x8b\x02s\xff\xd7\x02\ +\x8b\x02\xcf\xff\xd7\x02\x8b\x03\x12\xff\xd7\x02\x8b\x03\x1c\xff\ +\xd7\x02\x8c\x01\x9f\xff\xd7\x02\x8c\x01\xb8\xff\xd7\x02\x8c\x01\ +\xbb\xff\xd7\x02\x8c\x01\xbe\xff\xd7\x02\x8c\x01\xe1\xff\xd7\x02\ +\x8c\x02l\xff\xd7\x02\x8c\x02~\xff\xd7\x02\x8c\x02\x84\xff\ +\xd7\x02\x8c\x02\x86\xff\xd7\x02\x8c\x02\x88\xff\xd7\x02\x8c\x02\ +\x8a\xff\xd7\x02\x8c\x02\x8c\xff\xd7\x02\x8c\x02\xb1\xff\xd7\x02\ +\x8c\x02\xb3\xff\xd7\x02\x8c\x02\xc0\xff\xd7\x02\x8c\x02\xc2\xff\ +\xd7\x02\x8c\x02\xc5\xff\xd7\x02\x8c\x02\xc7\xff\xd7\x02\x8c\x02\ +\xd5\xff\xd7\x02\x8c\x02\xef\xff\xd7\x02\x8c\x02\xf1\xff\xd7\x02\ +\x8c\x02\xf3\xff\xd7\x02\x8c\x02\xfe\xff\xd7\x02\x8c\x03\x09\xff\ +\xd7\x02\x8c\x03\x0b\xff\xd7\x02\x8c\x03\x0e\xff\xd7\x02\x8c\x03\ +\x10\xff\xd7\x02\x8c\x03\x15\xff\xd7\x02\x95\x01\xa3\x00\xe1\x02\ +\x95\x02\xea\x00)\x02\x95\x03\x0e\xff\xd7\x02\x95\x03\x10\xff\ +\xd7\x02\x96\x00\x05\xff\xec\x02\x96\x00\x0a\xff\xec\x02\x96\x02\ +\x07\xff\xec\x02\x96\x02\x0b\xff\xec\x02\x97\x00\x05\xff\xae\x02\ +\x97\x00\x0a\xff\xae\x02\x97\x01\x9d\xff\xd7\x02\x97\x01\xa6\xff\ +\xd7\x02\x97\x01\xbc\xff\xae\x02\x97\x01\xc1\xff\xae\x02\x97\x01\ +\xc4\xff\xd7\x02\x97\x01\xdc\xff\xd7\x02\x97\x01\xe4\xff\xd7\x02\ +\x97\x02\x07\xff\xae\x02\x97\x02\x0b\xff\xae\x02\x97\x02|\xff\ +\xae\x02\x97\x02\x80\xff\xc3\x02\x97\x02\x82\xff\xc3\x02\x97\x02\ +\xa9\xff\xd7\x02\x97\x02\xaa\xff\xd7\x02\x97\x02\xb5\xff\xae\x02\ +\x97\x02\xb6\xff\xd7\x02\x97\x02\xb7\xff\xc3\x02\x97\x02\xb9\xff\ +\xc3\x02\x97\x02\xbd\xff\xd7\x02\x97\x02\xbe\xff\xd7\x02\x97\x02\ +\xbf\xff\xae\x02\x97\x02\xc1\xff\xae\x02\x97\x02\xd4\xff\xae\x02\ +\x97\x02\xfd\xff\xae\x02\x97\x03\x0d\xff\x9a\x02\x97\x03\x0f\xff\ +\x9a\x02\x97\x03\x17\xff\xd7\x02\x97\x03\x18\xff\xd7\x02\x98\x00\ +\x05\xff\x85\x02\x98\x00\x0a\xff\x85\x02\x98\x01\xd0\xff\xd7\x02\ +\x98\x01\xdc\xff\x9a\x02\x98\x01\xdd\xff\xc3\x02\x98\x01\xdf\xff\ +\xd7\x02\x98\x01\xe1\xff\xae\x02\x98\x01\xe4\xff\x9a\x02\x98\x01\ +\xf6\xff\xc3\x02\x98\x02\x07\xff\x85\x02\x98\x02\x0b\xff\x85\x02\ +\x98\x02m\xff\xd7\x02\x98\x02\x81\xff\xd7\x02\x98\x02\x83\xff\ +\xd7\x02\x98\x02\x8b\xff\xd7\x02\x98\x02\xa0\xff\xd7\x02\x98\x02\ +\xaa\xff\x9a\x02\x98\x02\xb6\xff\x9a\x02\x98\x02\xb8\xff\xc3\x02\ +\x98\x02\xba\xff\xc3\x02\x98\x02\xbc\xff\xd7\x02\x98\x02\xbe\xff\ +\x9a\x02\x98\x02\xc0\xff\xae\x02\x98\x02\xc2\xff\xae\x02\x98\x02\ +\xc6\xff\xd7\x02\x98\x02\xc8\xff\xd7\x02\x98\x02\xcb\xff\xd7\x02\ +\x98\x02\xd5\xff\xae\x02\x98\x02\xe6\xff\xd7\x02\x98\x02\xea\xff\ +\xd7\x02\x98\x02\xf8\xff\xc3\x02\x98\x02\xfa\xff\xc3\x02\x98\x02\ +\xfc\xff\xc3\x02\x98\x02\xfe\xff\xae\x02\x98\x03\x06\xff\xd7\x02\ +\x98\x03\x08\xff\xd7\x02\x98\x03\x0e\xff\x9a\x02\x98\x03\x10\xff\ +\x9a\x02\x98\x03\x18\xff\x9a\x02\x99\x00\x0f\xfe\xf6\x02\x99\x00\ +\x11\xfe\xf6\x02\x99\x01\xa4\xff\x85\x02\x99\x01\xaa\xff\x9a\x02\ +\x99\x01\xae\xff\x85\x02\x99\x01\xb0\xff\xd7\x02\x99\x01\xb5\xff\ +\x85\x02\x99\x01\xbf\xff\xd7\x02\x99\x01\xce\xff\x9a\x02\x99\x01\ +\xd5\xff\x9a\x02\x99\x01\xf2\xff\x9a\x02\x99\x02\x08\xfe\xf6\x02\ +\x99\x02\x0c\xfe\xf6\x02\x99\x02r\xff\x9a\x02\x99\x02s\xff\ +\x9a\x02\x99\x02v\xff\xec\x02\x99\x02\x9f\xff\xd7\x02\x99\x02\ +\xbb\xff\xd7\x02\x99\x02\xca\xff\xd7\x02\x99\x02\xce\xff\x85\x02\ +\x99\x02\xcf\xff\x9a\x02\x99\x02\xd9\xff\x9a\x02\x99\x02\xdb\xff\ +\x9a\x02\x99\x02\xdd\xff\x9a\x02\x99\x02\xe5\xff\xd7\x02\x99\x03\ +\x05\xff\xd7\x02\x99\x03\x07\xff\xd7\x02\x99\x03\x09\xff\xae\x02\ +\x99\x03\x0b\xff\xae\x02\x99\x03\x11\xff\x85\x02\x99\x03\x12\xff\ +\x9a\x02\x99\x03\x1b\xff\x85\x02\x99\x03\x1c\xff\x9a\x02\x9a\x00\ +\x05\xff\xec\x02\x9a\x00\x0a\xff\xec\x02\x9a\x01\xd0\xff\xd7\x02\ +\x9a\x01\xdc\xff\xec\x02\x9a\x01\xdd\xff\xec\x02\x9a\x01\xdf\xff\ +\xd7\x02\x9a\x01\xe1\xff\xec\x02\x9a\x01\xe4\xff\xec\x02\x9a\x01\ +\xf6\xff\xec\x02\x9a\x02\x07\xff\xec\x02\x9a\x02\x0b\xff\xec\x02\ +\x9a\x02\xa0\xff\xd7\x02\x9a\x02\xaa\xff\xec\x02\x9a\x02\xb6\xff\ +\xec\x02\x9a\x02\xbc\xff\xd7\x02\x9a\x02\xbe\xff\xec\x02\x9a\x02\ +\xc0\xff\xec\x02\x9a\x02\xc2\xff\xec\x02\x9a\x02\xcb\xff\xd7\x02\ +\x9a\x02\xd5\xff\xec\x02\x9a\x02\xe6\xff\xd7\x02\x9a\x02\xf8\xff\ +\xec\x02\x9a\x02\xfa\xff\xec\x02\x9a\x02\xfc\xff\xec\x02\x9a\x02\ +\xfe\xff\xec\x02\x9a\x03\x06\xff\xd7\x02\x9a\x03\x08\xff\xd7\x02\ +\x9a\x03\x0e\xff\xec\x02\x9a\x03\x10\xff\xec\x02\x9a\x03\x18\xff\ +\xec\x02\x9b\x00\x0f\xff\x9a\x02\x9b\x00\x10\xff\xd7\x02\x9b\x00\ +\x11\xff\x9a\x02\x9b\x01\x9d\x00)\x02\x9b\x01\x9f\xff\xd7\x02\ +\x9b\x01\xa4\xff\xae\x02\x9b\x01\xa6\x00)\x02\x9b\x01\xaa\xff\ +\x85\x02\x9b\x01\xae\xff\xae\x02\x9b\x01\xb5\xff\xae\x02\x9b\x01\ +\xb8\xff\xd7\x02\x9b\x01\xbb\xff\xd7\x02\x9b\x01\xbc\x00)\x02\ +\x9b\x01\xbe\xff\xc3\x02\x9b\x01\xc4\x00)\x02\x9b\x01\xcc\xff\ +\xc3\x02\x9b\x01\xcd\xff\xc3\x02\x9b\x01\xce\xff\x9a\x02\x9b\x01\ +\xcf\xff\xae\x02\x9b\x01\xd0\xff\xd7\x02\x9b\x01\xd1\xff\xd7\x02\ +\x9b\x01\xd2\xff\xc3\x02\x9b\x01\xd3\xff\xc3\x02\x9b\x01\xd4\xff\ +\xc3\x02\x9b\x01\xd5\xff\x9a\x02\x9b\x01\xd6\xff\xc3\x02\x9b\x01\ +\xd7\xff\xc3\x02\x9b\x01\xd8\xff\xae\x02\x9b\x01\xd9\xff\xc3\x02\ +\x9b\x01\xda\xff\xc3\x02\x9b\x01\xdb\xff\xae\x02\x9b\x01\xde\xff\ +\xae\x02\x9b\x01\xdf\xff\xd7\x02\x9b\x01\xe0\xff\xc3\x02\x9b\x01\ +\xe1\xff\x9a\x02\x9b\x01\xe2\xff\xc3\x02\x9b\x01\xe3\xff\xc3\x02\ +\x9b\x01\xe5\xff\xc3\x02\x9b\x01\xe6\xff\xc3\x02\x9b\x01\xe7\xff\ +\xd7\x02\x9b\x01\xe8\xff\xc3\x02\x9b\x01\xea\xff\xae\x02\x9b\x01\ +\xeb\x00)\x02\x9b\x01\xec\xff\xc3\x02\x9b\x01\xed\xff\xae\x02\ +\x9b\x01\xee\xff\xc3\x02\x9b\x01\xf2\xff\x9a\x02\x9b\x01\xf3\xff\ +\xc3\x02\x9b\x01\xf4\x00)\x02\x9b\x01\xf5\xff\xc3\x02\x9b\x01\ +\xf7\xff\xc3\x02\x9b\x01\xf9\xff\xc3\x02\x9b\x02\x02\xff\xd7\x02\ +\x9b\x02\x03\xff\xd7\x02\x9b\x02\x04\xff\xd7\x02\x9b\x02\x08\xff\ +\x9a\x02\x9b\x02\x0c\xff\x9a\x02\x9b\x02j\xff\xae\x02\x9b\x02\ +k\xff\xc3\x02\x9b\x02l\xff\xd7\x02\x9b\x02q\xff\xc3\x02\ +\x9b\x02r\xff\x85\x02\x9b\x02s\xff\x9a\x02\x9b\x02u\xff\ +\xc3\x02\x9b\x02w\xff\xd7\x02\x9b\x02y\xff\xc3\x02\x9b\x02\ +}\xff\xc3\x02\x9b\x02~\xff\xd7\x02\x9b\x02\x7f\xff\xae\x02\ +\x9b\x02\x84\xff\xd7\x02\x9b\x02\x85\xff\xae\x02\x9b\x02\x86\xff\ +\xd7\x02\x9b\x02\x87\xff\xae\x02\x9b\x02\x88\xff\xd7\x02\x9b\x02\ +\x89\xff\xae\x02\x9b\x02\x8a\xff\xd7\x02\x9b\x02\x8c\xff\xd7\x02\ +\x9b\x02\x8d\xff\xae\x02\x9b\x02\x96\xff\xc3\x02\x9b\x02\x98\x00\ +)\x02\x9b\x02\x9a\xff\xc3\x02\x9b\x02\x9e\xff\xc3\x02\x9b\x02\ +\xa0\xff\xd7\x02\x9b\x02\xa2\xff\xd7\x02\x9b\x02\xa4\xff\xc3\x02\ +\x9b\x02\xa6\xff\xc3\x02\x9b\x02\xa8\x00)\x02\x9b\x02\xa9\x00\ +)\x02\x9b\x02\xac\xff\xc3\x02\x9b\x02\xae\xff\xc3\x02\x9b\x02\ +\xb0\xff\xc3\x02\x9b\x02\xb1\xff\xd7\x02\x9b\x02\xb2\xff\xae\x02\ +\x9b\x02\xb3\xff\xd7\x02\x9b\x02\xb4\xff\xae\x02\x9b\x02\xb5\x00\ +)\x02\x9b\x02\xbc\xff\xd7\x02\x9b\x02\xbd\x00)\x02\x9b\x02\ +\xc0\xff\x9a\x02\x9b\x02\xc2\xff\x9a\x02\x9b\x02\xc4\xff\xc3\x02\ +\x9b\x02\xc5\xff\xd7\x02\x9b\x02\xc6\xff\xc3\x02\x9b\x02\xc7\xff\ +\xd7\x02\x9b\x02\xc8\xff\xc3\x02\x9b\x02\xcb\xff\xd7\x02\x9b\x02\ +\xcd\xff\xc3\x02\x9b\x02\xce\xff\xae\x02\x9b\x02\xcf\xff\x9a\x02\ +\x9b\x02\xd1\xff\xc3\x02\x9b\x02\xd3\xff\xc3\x02\x9b\x02\xd5\xff\ +\x9a\x02\x9b\x02\xd7\xff\xc3\x02\x9b\x02\xd9\xff\x85\x02\x9b\x02\ +\xdb\xff\x85\x02\x9b\x02\xdd\xff\x85\x02\x9b\x02\xe0\xff\xae\x02\ +\x9b\x02\xe6\xff\xd7\x02\x9b\x02\xe8\xff\xd7\x02\x9b\x02\xec\xff\ +\xc3\x02\x9b\x02\xee\xff\xc3\x02\x9b\x02\xef\xff\xd7\x02\x9b\x02\ +\xf0\xff\xae\x02\x9b\x02\xf1\xff\xd7\x02\x9b\x02\xf2\xff\xae\x02\ +\x9b\x02\xf3\xff\xd7\x02\x9b\x02\xf4\xff\xae\x02\x9b\x02\xf6\xff\ +\xd7\x02\x9b\x02\xfe\xff\x9a\x02\x9b\x03\x00\xff\xc3\x02\x9b\x03\ +\x02\xff\xc3\x02\x9b\x03\x06\xff\xd7\x02\x9b\x03\x08\xff\xd7\x02\ +\x9b\x03\x09\xff\x9a\x02\x9b\x03\x0a\xff\xae\x02\x9b\x03\x0b\xff\ +\x9a\x02\x9b\x03\x0c\xff\xae\x02\x9b\x03\x0e\xff\xd7\x02\x9b\x03\ +\x10\xff\xd7\x02\x9b\x03\x11\xff\xae\x02\x9b\x03\x12\xff\x9a\x02\ +\x9b\x03\x14\xff\xc3\x02\x9b\x03\x15\xff\xd7\x02\x9b\x03\x16\xff\ +\xae\x02\x9b\x03\x17\x00)\x02\x9b\x03\x1a\xff\xae\x02\x9b\x03\ +\x1b\xff\xae\x02\x9b\x03\x1c\xff\x9a\x02\x9c\x00\x0f\xff\xc3\x02\ +\x9c\x00\x11\xff\xc3\x02\x9c\x01\xce\xff\xc3\x02\x9c\x01\xcf\xff\ +\xd7\x02\x9c\x01\xd5\xff\xc3\x02\x9c\x01\xd8\xff\xd7\x02\x9c\x01\ +\xdb\xff\xd7\x02\x9c\x01\xde\xff\xd7\x02\x9c\x01\xea\xff\xd7\x02\ +\x9c\x01\xed\xff\xd7\x02\x9c\x01\xf2\xff\xc3\x02\x9c\x02\x08\xff\ +\xc3\x02\x9c\x02\x0c\xff\xc3\x02\x9c\x02j\xff\xd7\x02\x9c\x02\ +s\xff\xc3\x02\x9c\x02\x7f\xff\xd7\x02\x9c\x02\x85\xff\xd7\x02\ +\x9c\x02\x87\xff\xd7\x02\x9c\x02\x89\xff\xd7\x02\x9c\x02\x8d\xff\ +\xd7\x02\x9c\x02\xb2\xff\xd7\x02\x9c\x02\xb4\xff\xd7\x02\x9c\x02\ +\xcf\xff\xc3\x02\x9c\x02\xe0\xff\xd7\x02\x9c\x02\xf0\xff\xd7\x02\ +\x9c\x02\xf2\xff\xd7\x02\x9c\x02\xf4\xff\xd7\x02\x9c\x03\x0a\xff\ +\xd7\x02\x9c\x03\x0c\xff\xd7\x02\x9c\x03\x12\xff\xc3\x02\x9c\x03\ +\x16\xff\xd7\x02\x9c\x03\x1a\xff\xd7\x02\x9c\x03\x1c\xff\xc3\x02\ +\x9d\x00\x05\xff\xc3\x02\x9d\x00\x0a\xff\xc3\x02\x9d\x01\x9d\xff\ +\xc3\x02\x9d\x01\xa3\x00f\x02\x9d\x01\xa6\xff\xc3\x02\x9d\x01\ +\xbc\xff\xc3\x02\x9d\x01\xc1\xff\xae\x02\x9d\x01\xc4\xff\xc3\x02\ +\x9d\x01\xdc\xff\xd7\x02\x9d\x01\xe1\xff\xd7\x02\x9d\x01\xe4\xff\ +\xd7\x02\x9d\x02\x07\xff\xc3\x02\x9d\x02\x0b\xff\xc3\x02\x9d\x02\ +|\xff\xae\x02\x9d\x02\x80\xff\xc3\x02\x9d\x02\x82\xff\xc3\x02\ +\x9d\x02\xa9\xff\xc3\x02\x9d\x02\xaa\xff\xd7\x02\x9d\x02\xb5\xff\ +\xc3\x02\x9d\x02\xb6\xff\xd7\x02\x9d\x02\xb7\xff\xd7\x02\x9d\x02\ +\xb9\xff\xd7\x02\x9d\x02\xbd\xff\xc3\x02\x9d\x02\xbe\xff\xd7\x02\ +\x9d\x02\xbf\xff\xae\x02\x9d\x02\xc0\xff\xd7\x02\x9d\x02\xc1\xff\ +\xae\x02\x9d\x02\xc2\xff\xd7\x02\x9d\x02\xd4\xff\xae\x02\x9d\x02\ +\xd5\xff\xd7\x02\x9d\x02\xfd\xff\xae\x02\x9d\x02\xfe\xff\xd7\x02\ +\x9d\x03\x0d\xff\xd7\x02\x9d\x03\x0e\xff\xc3\x02\x9d\x03\x0f\xff\ +\xd7\x02\x9d\x03\x10\xff\xc3\x02\x9d\x03\x17\xff\xc3\x02\x9d\x03\ +\x18\xff\xd7\x02\x9e\x00\x05\xff\xc3\x02\x9e\x00\x0a\xff\xc3\x02\ +\x9e\x02\x07\xff\xc3\x02\x9e\x02\x0b\xff\xc3\x02\x9e\x03\x0e\xff\ +\xd7\x02\x9e\x03\x10\xff\xd7\x02\x9f\x01\x9f\xff\xd7\x02\x9f\x01\ +\xa3\x00\xe1\x02\x9f\x01\xb8\xff\xd7\x02\x9f\x01\xbb\xff\xd7\x02\ +\x9f\x01\xbe\xff\xc3\x02\x9f\x01\xdc\xff\xd7\x02\x9f\x01\xe1\xff\ +\xae\x02\x9f\x01\xe4\xff\xd7\x02\x9f\x02l\xff\xd7\x02\x9f\x02\ +{\x00=\x02\x9f\x02}\xff\xec\x02\x9f\x02~\xff\xd7\x02\ +\x9f\x02\x84\xff\xd7\x02\x9f\x02\x86\xff\xd7\x02\x9f\x02\x88\xff\ +\xd7\x02\x9f\x02\x8a\xff\xd7\x02\x9f\x02\x8c\xff\xd7\x02\x9f\x02\ +\xaa\xff\xd7\x02\x9f\x02\xb1\xff\xd7\x02\x9f\x02\xb3\xff\xd7\x02\ +\x9f\x02\xb6\xff\xd7\x02\x9f\x02\xbe\xff\xd7\x02\x9f\x02\xc0\xff\ +\xae\x02\x9f\x02\xc2\xff\xae\x02\x9f\x02\xc5\xff\xc3\x02\x9f\x02\ +\xc6\xff\xd7\x02\x9f\x02\xc7\xff\xc3\x02\x9f\x02\xc8\xff\xd7\x02\ +\x9f\x02\xd5\xff\xae\x02\x9f\x02\xef\xff\xd7\x02\x9f\x02\xf1\xff\ +\xd7\x02\x9f\x02\xf3\xff\xd7\x02\x9f\x02\xfe\xff\xae\x02\x9f\x03\ +\x0e\xff\xd7\x02\x9f\x03\x10\xff\xd7\x02\x9f\x03\x15\xff\xd7\x02\ +\x9f\x03\x18\xff\xd7\x02\xa0\x01\xcf\xff\xec\x02\xa0\x01\xd8\xff\ +\xec\x02\xa0\x01\xdb\xff\xec\x02\xa0\x01\xde\xff\xec\x02\xa0\x01\ +\xe1\xff\xec\x02\xa0\x01\xea\xff\xec\x02\xa0\x01\xed\xff\xec\x02\ +\xa0\x02j\xff\xec\x02\xa0\x02\x7f\xff\xec\x02\xa0\x02\x85\xff\ +\xec\x02\xa0\x02\x87\xff\xec\x02\xa0\x02\x89\xff\xec\x02\xa0\x02\ +\x8d\xff\xec\x02\xa0\x02\xb2\xff\xec\x02\xa0\x02\xb4\xff\xec\x02\ +\xa0\x02\xc0\xff\xec\x02\xa0\x02\xc2\xff\xec\x02\xa0\x02\xd5\xff\ +\xec\x02\xa0\x02\xe0\xff\xec\x02\xa0\x02\xf0\xff\xec\x02\xa0\x02\ +\xf2\xff\xec\x02\xa0\x02\xf4\xff\xec\x02\xa0\x02\xfe\xff\xec\x02\ +\xa0\x03\x0a\xff\xec\x02\xa0\x03\x0c\xff\xec\x02\xa0\x03\x0e\xff\ +\xd7\x02\xa0\x03\x10\xff\xd7\x02\xa0\x03\x16\xff\xec\x02\xa0\x03\ +\x1a\xff\xec\x02\xa1\x00\x0f\xff\xae\x02\xa1\x00\x11\xff\xae\x02\ +\xa1\x02\x08\xff\xae\x02\xa1\x02\x0c\xff\xae\x02\xa1\x02\x80\xff\ +\xec\x02\xa1\x02\x82\xff\xec\x02\xa1\x02\xb7\xff\xec\x02\xa1\x02\ +\xb9\xff\xec\x02\xa1\x03\x0d\xff\xd7\x02\xa1\x03\x0f\xff\xd7\x02\ +\xa2\x01\xe9\x00)\x02\xa3\x01\x9f\xff\xd7\x02\xa3\x01\xa3\x00\ +\xe1\x02\xa3\x01\xb8\xff\xd7\x02\xa3\x01\xbb\xff\xd7\x02\xa3\x01\ +\xbe\xff\xc3\x02\xa3\x01\xdc\xff\xd7\x02\xa3\x01\xe1\xff\xae\x02\ +\xa3\x01\xe4\xff\xd7\x02\xa3\x02l\xff\xd7\x02\xa3\x02{\x00\ +=\x02\xa3\x02}\xff\xec\x02\xa3\x02~\xff\xd7\x02\xa3\x02\ +\x84\xff\xd7\x02\xa3\x02\x86\xff\xd7\x02\xa3\x02\x88\xff\xd7\x02\ +\xa3\x02\x8a\xff\xd7\x02\xa3\x02\x8c\xff\xd7\x02\xa3\x02\xaa\xff\ +\xd7\x02\xa3\x02\xb1\xff\xd7\x02\xa3\x02\xb3\xff\xd7\x02\xa3\x02\ +\xb6\xff\xd7\x02\xa3\x02\xbe\xff\xd7\x02\xa3\x02\xc0\xff\xae\x02\ +\xa3\x02\xc2\xff\xae\x02\xa3\x02\xc5\xff\xc3\x02\xa3\x02\xc6\xff\ +\xd7\x02\xa3\x02\xc7\xff\xc3\x02\xa3\x02\xc8\xff\xd7\x02\xa3\x02\ +\xd5\xff\xae\x02\xa3\x02\xef\xff\xd7\x02\xa3\x02\xf1\xff\xd7\x02\ +\xa3\x02\xf3\xff\xd7\x02\xa3\x02\xfe\xff\xae\x02\xa3\x03\x0e\xff\ +\xd7\x02\xa3\x03\x10\xff\xd7\x02\xa3\x03\x15\xff\xd7\x02\xa3\x03\ +\x18\xff\xd7\x02\xa4\x01\xcf\xff\xec\x02\xa4\x01\xd8\xff\xec\x02\ +\xa4\x01\xdb\xff\xec\x02\xa4\x01\xde\xff\xec\x02\xa4\x01\xe1\xff\ +\xec\x02\xa4\x01\xea\xff\xec\x02\xa4\x01\xed\xff\xec\x02\xa4\x02\ +j\xff\xec\x02\xa4\x02\x7f\xff\xec\x02\xa4\x02\x85\xff\xec\x02\ +\xa4\x02\x87\xff\xec\x02\xa4\x02\x89\xff\xec\x02\xa4\x02\x8d\xff\ +\xec\x02\xa4\x02\xb2\xff\xec\x02\xa4\x02\xb4\xff\xec\x02\xa4\x02\ +\xc0\xff\xec\x02\xa4\x02\xc2\xff\xec\x02\xa4\x02\xd5\xff\xec\x02\ +\xa4\x02\xe0\xff\xec\x02\xa4\x02\xf0\xff\xec\x02\xa4\x02\xf2\xff\ +\xec\x02\xa4\x02\xf4\xff\xec\x02\xa4\x02\xfe\xff\xec\x02\xa4\x03\ +\x0a\xff\xec\x02\xa4\x03\x0c\xff\xec\x02\xa4\x03\x0e\xff\xd7\x02\ +\xa4\x03\x10\xff\xd7\x02\xa4\x03\x16\xff\xec\x02\xa4\x03\x1a\xff\ +\xec\x02\xa5\x01\x9f\xff\xd7\x02\xa5\x01\xb8\xff\xd7\x02\xa5\x01\ +\xbb\xff\xd7\x02\xa5\x01\xbe\xff\xd7\x02\xa5\x01\xc1\xff\xd7\x02\ +\xa5\x01\xe1\xff\xd7\x02\xa5\x02l\xff\xd7\x02\xa5\x02|\xff\ +\xd7\x02\xa5\x02~\xff\xd7\x02\xa5\x02\x84\xff\xd7\x02\xa5\x02\ +\x86\xff\xd7\x02\xa5\x02\x88\xff\xd7\x02\xa5\x02\x8a\xff\xd7\x02\ +\xa5\x02\x8c\xff\xd7\x02\xa5\x02\xb1\xff\xd7\x02\xa5\x02\xb3\xff\ +\xd7\x02\xa5\x02\xbf\xff\xd7\x02\xa5\x02\xc0\xff\xd7\x02\xa5\x02\ +\xc1\xff\xd7\x02\xa5\x02\xc2\xff\xd7\x02\xa5\x02\xc5\xff\x9a\x02\ +\xa5\x02\xc7\xff\x9a\x02\xa5\x02\xd4\xff\xd7\x02\xa5\x02\xd5\xff\ +\xd7\x02\xa5\x02\xef\xff\xd7\x02\xa5\x02\xf1\xff\xd7\x02\xa5\x02\ +\xf3\xff\xd7\x02\xa5\x02\xfd\xff\xd7\x02\xa5\x02\xfe\xff\xd7\x02\ +\xa5\x03\x09\xff\xd7\x02\xa5\x03\x0b\xff\xd7\x02\xa5\x03\x0e\xff\ +\xd7\x02\xa5\x03\x10\xff\xd7\x02\xa5\x03\x15\xff\xd7\x02\xa5\x03\ +\x19\xff\xec\x02\xa6\x01\xcf\xff\xd7\x02\xa6\x01\xd8\xff\xd7\x02\ +\xa6\x01\xdb\xff\xd7\x02\xa6\x01\xde\xff\xd7\x02\xa6\x01\xe1\xff\ +\xd7\x02\xa6\x01\xea\xff\xd7\x02\xa6\x01\xed\xff\xd7\x02\xa6\x02\ +j\xff\xd7\x02\xa6\x02\x7f\xff\xd7\x02\xa6\x02\x85\xff\xd7\x02\ +\xa6\x02\x87\xff\xd7\x02\xa6\x02\x89\xff\xd7\x02\xa6\x02\x8d\xff\ +\xd7\x02\xa6\x02\xb2\xff\xd7\x02\xa6\x02\xb4\xff\xd7\x02\xa6\x02\ +\xc0\xff\xd7\x02\xa6\x02\xc2\xff\xd7\x02\xa6\x02\xc6\xff\xd7\x02\ +\xa6\x02\xc8\xff\xd7\x02\xa6\x02\xd5\xff\xd7\x02\xa6\x02\xe0\xff\ +\xd7\x02\xa6\x02\xf0\xff\xd7\x02\xa6\x02\xf2\xff\xd7\x02\xa6\x02\ +\xf4\xff\xd7\x02\xa6\x02\xfe\xff\xd7\x02\xa6\x03\x0a\xff\xd7\x02\ +\xa6\x03\x0c\xff\xd7\x02\xa6\x03\x16\xff\xd7\x02\xa6\x03\x1a\xff\ +\xd7\x02\xa7\x01\x9f\xff\xd7\x02\xa7\x01\xb8\xff\xd7\x02\xa7\x01\ +\xbb\xff\xd7\x02\xa7\x01\xbe\xff\xd7\x02\xa7\x01\xc1\xff\xd7\x02\ +\xa7\x01\xe1\xff\xd7\x02\xa7\x02l\xff\xd7\x02\xa7\x02|\xff\ +\xd7\x02\xa7\x02~\xff\xd7\x02\xa7\x02\x84\xff\xd7\x02\xa7\x02\ +\x86\xff\xd7\x02\xa7\x02\x88\xff\xd7\x02\xa7\x02\x8a\xff\xd7\x02\ +\xa7\x02\x8c\xff\xd7\x02\xa7\x02\xb1\xff\xd7\x02\xa7\x02\xb3\xff\ +\xd7\x02\xa7\x02\xbf\xff\xd7\x02\xa7\x02\xc0\xff\xd7\x02\xa7\x02\ +\xc1\xff\xd7\x02\xa7\x02\xc2\xff\xd7\x02\xa7\x02\xc5\xff\x9a\x02\ +\xa7\x02\xc7\xff\x9a\x02\xa7\x02\xd4\xff\xd7\x02\xa7\x02\xd5\xff\ +\xd7\x02\xa7\x02\xef\xff\xd7\x02\xa7\x02\xf1\xff\xd7\x02\xa7\x02\ +\xf3\xff\xd7\x02\xa7\x02\xfd\xff\xd7\x02\xa7\x02\xfe\xff\xd7\x02\ +\xa7\x03\x09\xff\xd7\x02\xa7\x03\x0b\xff\xd7\x02\xa7\x03\x0e\xff\ +\xd7\x02\xa7\x03\x10\xff\xd7\x02\xa7\x03\x15\xff\xd7\x02\xa7\x03\ +\x19\xff\xec\x02\xa8\x01\xcf\xff\xd7\x02\xa8\x01\xd8\xff\xd7\x02\ +\xa8\x01\xdb\xff\xd7\x02\xa8\x01\xde\xff\xd7\x02\xa8\x01\xe1\xff\ +\xd7\x02\xa8\x01\xea\xff\xd7\x02\xa8\x01\xed\xff\xd7\x02\xa8\x02\ +j\xff\xd7\x02\xa8\x02\x7f\xff\xd7\x02\xa8\x02\x85\xff\xd7\x02\ +\xa8\x02\x87\xff\xd7\x02\xa8\x02\x89\xff\xd7\x02\xa8\x02\x8d\xff\ +\xd7\x02\xa8\x02\xb2\xff\xd7\x02\xa8\x02\xb4\xff\xd7\x02\xa8\x02\ +\xc0\xff\xd7\x02\xa8\x02\xc2\xff\xd7\x02\xa8\x02\xc6\xff\xd7\x02\ +\xa8\x02\xc8\xff\xd7\x02\xa8\x02\xd5\xff\xd7\x02\xa8\x02\xe0\xff\ +\xd7\x02\xa8\x02\xf0\xff\xd7\x02\xa8\x02\xf2\xff\xd7\x02\xa8\x02\ +\xf4\xff\xd7\x02\xa8\x02\xfe\xff\xd7\x02\xa8\x03\x0a\xff\xd7\x02\ +\xa8\x03\x0c\xff\xd7\x02\xa8\x03\x16\xff\xd7\x02\xa8\x03\x1a\xff\ +\xd7\x02\xa9\x01\x9f\xff\xd7\x02\xa9\x01\xb8\xff\xd7\x02\xa9\x01\ +\xbb\xff\xd7\x02\xa9\x01\xbe\xff\xd7\x02\xa9\x01\xc1\xff\xd7\x02\ +\xa9\x01\xe1\xff\xd7\x02\xa9\x02l\xff\xd7\x02\xa9\x02|\xff\ +\xd7\x02\xa9\x02~\xff\xd7\x02\xa9\x02\x84\xff\xd7\x02\xa9\x02\ +\x86\xff\xd7\x02\xa9\x02\x88\xff\xd7\x02\xa9\x02\x8a\xff\xd7\x02\ +\xa9\x02\x8c\xff\xd7\x02\xa9\x02\xb1\xff\xd7\x02\xa9\x02\xb3\xff\ +\xd7\x02\xa9\x02\xbf\xff\xd7\x02\xa9\x02\xc0\xff\xd7\x02\xa9\x02\ +\xc1\xff\xd7\x02\xa9\x02\xc2\xff\xd7\x02\xa9\x02\xc5\xff\x9a\x02\ +\xa9\x02\xc7\xff\x9a\x02\xa9\x02\xd4\xff\xd7\x02\xa9\x02\xd5\xff\ +\xd7\x02\xa9\x02\xef\xff\xd7\x02\xa9\x02\xf1\xff\xd7\x02\xa9\x02\ +\xf3\xff\xd7\x02\xa9\x02\xfd\xff\xd7\x02\xa9\x02\xfe\xff\xd7\x02\ +\xa9\x03\x09\xff\xd7\x02\xa9\x03\x0b\xff\xd7\x02\xa9\x03\x0e\xff\ +\xd7\x02\xa9\x03\x10\xff\xd7\x02\xa9\x03\x15\xff\xd7\x02\xa9\x03\ +\x19\xff\xec\x02\xaa\x01\xcf\xff\xd7\x02\xaa\x01\xd8\xff\xd7\x02\ +\xaa\x01\xdb\xff\xd7\x02\xaa\x01\xde\xff\xd7\x02\xaa\x01\xe1\xff\ +\xd7\x02\xaa\x01\xea\xff\xd7\x02\xaa\x01\xed\xff\xd7\x02\xaa\x02\ +j\xff\xd7\x02\xaa\x02\x7f\xff\xd7\x02\xaa\x02\x85\xff\xd7\x02\ +\xaa\x02\x87\xff\xd7\x02\xaa\x02\x89\xff\xd7\x02\xaa\x02\x8d\xff\ +\xd7\x02\xaa\x02\xb2\xff\xd7\x02\xaa\x02\xb4\xff\xd7\x02\xaa\x02\ +\xc0\xff\xd7\x02\xaa\x02\xc2\xff\xd7\x02\xaa\x02\xc6\xff\xd7\x02\ +\xaa\x02\xc8\xff\xd7\x02\xaa\x02\xd5\xff\xd7\x02\xaa\x02\xe0\xff\ +\xd7\x02\xaa\x02\xf0\xff\xd7\x02\xaa\x02\xf2\xff\xd7\x02\xaa\x02\ +\xf4\xff\xd7\x02\xaa\x02\xfe\xff\xd7\x02\xaa\x03\x0a\xff\xd7\x02\ +\xaa\x03\x0c\xff\xd7\x02\xaa\x03\x16\xff\xd7\x02\xaa\x03\x1a\xff\ +\xd7\x02\xab\x01\xa3\x00\xe1\x02\xab\x02\xea\x00)\x02\xab\x03\ +\x0e\xff\xd7\x02\xab\x03\x10\xff\xd7\x02\xac\x00\x05\xff\xec\x02\ +\xac\x00\x0a\xff\xec\x02\xac\x02\x07\xff\xec\x02\xac\x02\x0b\xff\ +\xec\x02\xad\x00\x0f\xff\x9a\x02\xad\x00\x10\xff\xd7\x02\xad\x00\ +\x11\xff\x9a\x02\xad\x01\x9d\x00)\x02\xad\x01\x9f\xff\xd7\x02\ +\xad\x01\xa4\xff\xae\x02\xad\x01\xa6\x00)\x02\xad\x01\xaa\xff\ +\x85\x02\xad\x01\xae\xff\xae\x02\xad\x01\xb5\xff\xae\x02\xad\x01\ +\xb8\xff\xd7\x02\xad\x01\xbb\xff\xd7\x02\xad\x01\xbc\x00)\x02\ +\xad\x01\xbe\xff\xc3\x02\xad\x01\xc4\x00)\x02\xad\x01\xcc\xff\ +\xc3\x02\xad\x01\xcd\xff\xc3\x02\xad\x01\xce\xff\x9a\x02\xad\x01\ +\xcf\xff\xae\x02\xad\x01\xd0\xff\xd7\x02\xad\x01\xd1\xff\xd7\x02\ +\xad\x01\xd2\xff\xc3\x02\xad\x01\xd3\xff\xc3\x02\xad\x01\xd4\xff\ +\xc3\x02\xad\x01\xd5\xff\x9a\x02\xad\x01\xd6\xff\xc3\x02\xad\x01\ +\xd7\xff\xc3\x02\xad\x01\xd8\xff\xae\x02\xad\x01\xd9\xff\xc3\x02\ +\xad\x01\xda\xff\xc3\x02\xad\x01\xdb\xff\xae\x02\xad\x01\xde\xff\ +\xae\x02\xad\x01\xdf\xff\xd7\x02\xad\x01\xe0\xff\xc3\x02\xad\x01\ +\xe1\xff\x9a\x02\xad\x01\xe2\xff\xc3\x02\xad\x01\xe3\xff\xc3\x02\ +\xad\x01\xe5\xff\xc3\x02\xad\x01\xe6\xff\xc3\x02\xad\x01\xe7\xff\ +\xd7\x02\xad\x01\xe8\xff\xc3\x02\xad\x01\xea\xff\xae\x02\xad\x01\ +\xeb\x00)\x02\xad\x01\xec\xff\xc3\x02\xad\x01\xed\xff\xae\x02\ +\xad\x01\xee\xff\xc3\x02\xad\x01\xf2\xff\x9a\x02\xad\x01\xf3\xff\ +\xc3\x02\xad\x01\xf4\x00)\x02\xad\x01\xf5\xff\xc3\x02\xad\x01\ +\xf7\xff\xc3\x02\xad\x01\xf9\xff\xc3\x02\xad\x02\x02\xff\xd7\x02\ +\xad\x02\x03\xff\xd7\x02\xad\x02\x04\xff\xd7\x02\xad\x02\x08\xff\ +\x9a\x02\xad\x02\x0c\xff\x9a\x02\xad\x02j\xff\xae\x02\xad\x02\ +k\xff\xc3\x02\xad\x02l\xff\xd7\x02\xad\x02q\xff\xc3\x02\ +\xad\x02r\xff\x85\x02\xad\x02s\xff\x9a\x02\xad\x02u\xff\ +\xc3\x02\xad\x02w\xff\xd7\x02\xad\x02y\xff\xc3\x02\xad\x02\ +}\xff\xc3\x02\xad\x02~\xff\xd7\x02\xad\x02\x7f\xff\xae\x02\ +\xad\x02\x84\xff\xd7\x02\xad\x02\x85\xff\xae\x02\xad\x02\x86\xff\ +\xd7\x02\xad\x02\x87\xff\xae\x02\xad\x02\x88\xff\xd7\x02\xad\x02\ +\x89\xff\xae\x02\xad\x02\x8a\xff\xd7\x02\xad\x02\x8c\xff\xd7\x02\ +\xad\x02\x8d\xff\xae\x02\xad\x02\x96\xff\xc3\x02\xad\x02\x98\x00\ +)\x02\xad\x02\x9a\xff\xc3\x02\xad\x02\x9e\xff\xc3\x02\xad\x02\ +\xa0\xff\xd7\x02\xad\x02\xa2\xff\xd7\x02\xad\x02\xa4\xff\xc3\x02\ +\xad\x02\xa6\xff\xc3\x02\xad\x02\xa8\x00)\x02\xad\x02\xa9\x00\ +)\x02\xad\x02\xac\xff\xc3\x02\xad\x02\xae\xff\xc3\x02\xad\x02\ +\xb0\xff\xc3\x02\xad\x02\xb1\xff\xd7\x02\xad\x02\xb2\xff\xae\x02\ +\xad\x02\xb3\xff\xd7\x02\xad\x02\xb4\xff\xae\x02\xad\x02\xb5\x00\ +)\x02\xad\x02\xbc\xff\xd7\x02\xad\x02\xbd\x00)\x02\xad\x02\ +\xc0\xff\x9a\x02\xad\x02\xc2\xff\x9a\x02\xad\x02\xc4\xff\xc3\x02\ +\xad\x02\xc5\xff\xd7\x02\xad\x02\xc6\xff\xc3\x02\xad\x02\xc7\xff\ +\xd7\x02\xad\x02\xc8\xff\xc3\x02\xad\x02\xcb\xff\xd7\x02\xad\x02\ +\xcd\xff\xc3\x02\xad\x02\xce\xff\xae\x02\xad\x02\xcf\xff\x9a\x02\ +\xad\x02\xd1\xff\xc3\x02\xad\x02\xd3\xff\xc3\x02\xad\x02\xd5\xff\ +\x9a\x02\xad\x02\xd7\xff\xc3\x02\xad\x02\xd9\xff\x85\x02\xad\x02\ +\xdb\xff\x85\x02\xad\x02\xdd\xff\x85\x02\xad\x02\xe0\xff\xae\x02\ +\xad\x02\xe6\xff\xd7\x02\xad\x02\xe8\xff\xd7\x02\xad\x02\xec\xff\ +\xc3\x02\xad\x02\xee\xff\xc3\x02\xad\x02\xef\xff\xd7\x02\xad\x02\ +\xf0\xff\xae\x02\xad\x02\xf1\xff\xd7\x02\xad\x02\xf2\xff\xae\x02\ +\xad\x02\xf3\xff\xd7\x02\xad\x02\xf4\xff\xae\x02\xad\x02\xf6\xff\ +\xd7\x02\xad\x02\xfe\xff\x9a\x02\xad\x03\x00\xff\xc3\x02\xad\x03\ +\x02\xff\xc3\x02\xad\x03\x06\xff\xd7\x02\xad\x03\x08\xff\xd7\x02\ +\xad\x03\x09\xff\x9a\x02\xad\x03\x0a\xff\xae\x02\xad\x03\x0b\xff\ +\x9a\x02\xad\x03\x0c\xff\xae\x02\xad\x03\x0e\xff\xd7\x02\xad\x03\ +\x10\xff\xd7\x02\xad\x03\x11\xff\xae\x02\xad\x03\x12\xff\x9a\x02\ +\xad\x03\x14\xff\xc3\x02\xad\x03\x15\xff\xd7\x02\xad\x03\x16\xff\ +\xae\x02\xad\x03\x17\x00)\x02\xad\x03\x1a\xff\xae\x02\xad\x03\ +\x1b\xff\xae\x02\xad\x03\x1c\xff\x9a\x02\xae\x00\x0f\xff\x9a\x02\ +\xae\x00\x10\xff\xd7\x02\xae\x00\x11\xff\x9a\x02\xae\x01\xce\xff\ +\xc3\x02\xae\x01\xcf\xff\xec\x02\xae\x01\xd5\xff\xc3\x02\xae\x01\ +\xd8\xff\xec\x02\xae\x01\xdb\xff\xec\x02\xae\x01\xde\xff\xec\x02\ +\xae\x01\xea\xff\xec\x02\xae\x01\xed\xff\xec\x02\xae\x01\xf2\xff\ +\xc3\x02\xae\x02\x02\xff\xd7\x02\xae\x02\x03\xff\xd7\x02\xae\x02\ +\x04\xff\xd7\x02\xae\x02\x08\xff\x9a\x02\xae\x02\x0c\xff\x9a\x02\ +\xae\x02j\xff\xec\x02\xae\x02s\xff\xc3\x02\xae\x02\x7f\xff\ +\xec\x02\xae\x02\x85\xff\xec\x02\xae\x02\x87\xff\xec\x02\xae\x02\ +\x89\xff\xec\x02\xae\x02\x8d\xff\xec\x02\xae\x02\xb2\xff\xec\x02\ +\xae\x02\xb4\xff\xec\x02\xae\x02\xcf\xff\xc3\x02\xae\x02\xe0\xff\ +\xec\x02\xae\x02\xf0\xff\xec\x02\xae\x02\xf2\xff\xec\x02\xae\x02\ +\xf4\xff\xec\x02\xae\x03\x0a\xff\xec\x02\xae\x03\x0c\xff\xec\x02\ +\xae\x03\x12\xff\xc3\x02\xae\x03\x16\xff\xec\x02\xae\x03\x1a\xff\ +\xec\x02\xae\x03\x1c\xff\xc3\x02\xaf\x00\x05\xff\x5c\x02\xaf\x00\ +\x0a\xff\x5c\x02\xaf\x01\x9d\xff\x9a\x02\xaf\x01\xa3\x00f\x02\ +\xaf\x01\xa6\xff\x9a\x02\xaf\x01\xbc\xffH\x02\xaf\x01\xc1\xff\ +\x85\x02\xaf\x01\xc4\xff\x9a\x02\xaf\x01\xdc\xff\xae\x02\xaf\x01\ +\xe1\xff\xd7\x02\xaf\x01\xe4\xff\xae\x02\xaf\x02\x07\xff\x5c\x02\ +\xaf\x02\x0b\xff\x5c\x02\xaf\x02|\xff\x85\x02\xaf\x02\x80\xff\ +q\x02\xaf\x02\x82\xffq\x02\xaf\x02\xa9\xff\x9a\x02\xaf\x02\ +\xaa\xff\xae\x02\xaf\x02\xb5\xffH\x02\xaf\x02\xb6\xff\xae\x02\ +\xaf\x02\xb7\xff\x9a\x02\xaf\x02\xb9\xff\x9a\x02\xaf\x02\xbd\xff\ +\x9a\x02\xaf\x02\xbe\xff\xae\x02\xaf\x02\xbf\xff\x85\x02\xaf\x02\ +\xc0\xff\xd7\x02\xaf\x02\xc1\xff\x85\x02\xaf\x02\xc2\xff\xd7\x02\ +\xaf\x02\xc5\xff\xc3\x02\xaf\x02\xc6\xff\xd7\x02\xaf\x02\xc7\xff\ +\xc3\x02\xaf\x02\xc8\xff\xd7\x02\xaf\x02\xd4\xff\x85\x02\xaf\x02\ +\xd5\xff\xd7\x02\xaf\x02\xfd\xff\x85\x02\xaf\x02\xfe\xff\xd7\x02\ +\xaf\x03\x0d\xffH\x02\xaf\x03\x0e\xff\xae\x02\xaf\x03\x0f\xff\ +H\x02\xaf\x03\x10\xff\xae\x02\xaf\x03\x17\xff\x9a\x02\xaf\x03\ +\x18\xff\xae\x02\xb0\x00\x05\xffq\x02\xb0\x00\x0a\xffq\x02\ +\xb0\x01\xdc\xff\x9a\x02\xb0\x01\xe1\xff\xd7\x02\xb0\x01\xe4\xff\ +\x9a\x02\xb0\x02\x07\xffq\x02\xb0\x02\x0b\xffq\x02\xb0\x02\ +m\xff\xd7\x02\xb0\x02\x81\xff\xd7\x02\xb0\x02\x83\xff\xd7\x02\ +\xb0\x02\x8b\xff\xd7\x02\xb0\x02\xaa\xff\x9a\x02\xb0\x02\xb6\xff\ +\x9a\x02\xb0\x02\xb8\xff\xd7\x02\xb0\x02\xba\xff\xd7\x02\xb0\x02\ +\xbe\xff\x9a\x02\xb0\x02\xc0\xff\xd7\x02\xb0\x02\xc2\xff\xd7\x02\ +\xb0\x02\xc6\xff\xd7\x02\xb0\x02\xc8\xff\xd7\x02\xb0\x02\xd5\xff\ +\xd7\x02\xb0\x02\xfe\xff\xd7\x02\xb0\x03\x0e\xffq\x02\xb0\x03\ +\x10\xffq\x02\xb0\x03\x18\xff\x9a\x02\xb1\x01\x9d\xff\xd7\x02\ +\xb1\x01\xa6\xff\xd7\x02\xb1\x01\xbc\xff\xc3\x02\xb1\x01\xc4\xff\ +\xd7\x02\xb1\x02\x80\xff\xec\x02\xb1\x02\x82\xff\xec\x02\xb1\x02\ +\xa9\xff\xd7\x02\xb1\x02\xb5\xff\xc3\x02\xb1\x02\xb7\xff\xec\x02\ +\xb1\x02\xb9\xff\xec\x02\xb1\x02\xbd\xff\xd7\x02\xb1\x03\x0d\xff\ +\xd7\x02\xb1\x03\x0f\xff\xd7\x02\xb1\x03\x17\xff\xd7\x02\xb2\x00\ +\x05\xff\xec\x02\xb2\x00\x0a\xff\xec\x02\xb2\x01\xd0\xff\xd7\x02\ +\xb2\x01\xdc\xff\xec\x02\xb2\x01\xdd\xff\xec\x02\xb2\x01\xdf\xff\ +\xd7\x02\xb2\x01\xe1\xff\xec\x02\xb2\x01\xe4\xff\xec\x02\xb2\x01\ +\xf6\xff\xec\x02\xb2\x02\x07\xff\xec\x02\xb2\x02\x0b\xff\xec\x02\ +\xb2\x02\xa0\xff\xd7\x02\xb2\x02\xaa\xff\xec\x02\xb2\x02\xb6\xff\ +\xec\x02\xb2\x02\xbc\xff\xd7\x02\xb2\x02\xbe\xff\xec\x02\xb2\x02\ +\xc0\xff\xec\x02\xb2\x02\xc2\xff\xec\x02\xb2\x02\xcb\xff\xd7\x02\ +\xb2\x02\xd5\xff\xec\x02\xb2\x02\xe6\xff\xd7\x02\xb2\x02\xf8\xff\ +\xec\x02\xb2\x02\xfa\xff\xec\x02\xb2\x02\xfc\xff\xec\x02\xb2\x02\ +\xfe\xff\xec\x02\xb2\x03\x06\xff\xd7\x02\xb2\x03\x08\xff\xd7\x02\ +\xb2\x03\x0e\xff\xec\x02\xb2\x03\x10\xff\xec\x02\xb2\x03\x18\xff\ +\xec\x02\xb3\x01\x9f\xff\xd7\x02\xb3\x01\xb8\xff\xd7\x02\xb3\x01\ +\xbb\xff\xd7\x02\xb3\x01\xbe\xff\xd7\x02\xb3\x01\xe1\xff\xd7\x02\ +\xb3\x02l\xff\xd7\x02\xb3\x02~\xff\xd7\x02\xb3\x02\x84\xff\ +\xd7\x02\xb3\x02\x86\xff\xd7\x02\xb3\x02\x88\xff\xd7\x02\xb3\x02\ +\x8a\xff\xd7\x02\xb3\x02\x8c\xff\xd7\x02\xb3\x02\xb1\xff\xd7\x02\ +\xb3\x02\xb3\xff\xd7\x02\xb3\x02\xc0\xff\xd7\x02\xb3\x02\xc2\xff\ +\xd7\x02\xb3\x02\xc5\xff\xd7\x02\xb3\x02\xc7\xff\xd7\x02\xb3\x02\ +\xd5\xff\xd7\x02\xb3\x02\xef\xff\xd7\x02\xb3\x02\xf1\xff\xd7\x02\ +\xb3\x02\xf3\xff\xd7\x02\xb3\x02\xfe\xff\xd7\x02\xb3\x03\x09\xff\ +\xd7\x02\xb3\x03\x0b\xff\xd7\x02\xb3\x03\x0e\xff\xd7\x02\xb3\x03\ +\x10\xff\xd7\x02\xb3\x03\x15\xff\xd7\x02\xb5\x00\x0f\xff\x85\x02\ +\xb5\x00\x10\xff\xae\x02\xb5\x00\x11\xff\x85\x02\xb5\x01\x9f\xff\ +\xd7\x02\xb5\x01\xa4\xff\x9a\x02\xb5\x01\xaa\xffq\x02\xb5\x01\ +\xae\xff\x9a\x02\xb5\x01\xb5\xff\x9a\x02\xb5\x01\xb8\xff\xd7\x02\ +\xb5\x01\xbb\xff\xd7\x02\xb5\x01\xbc\x00)\x02\xb5\x01\xbe\xff\ +\xae\x02\xb5\x01\xcc\xff\x9a\x02\xb5\x01\xcd\xff\x9a\x02\xb5\x01\ +\xce\xff\x85\x02\xb5\x01\xcf\xffq\x02\xb5\x01\xd0\xff\xd7\x02\ +\xb5\x01\xd1\xff\xd7\x02\xb5\x01\xd2\xff\x9a\x02\xb5\x01\xd3\xff\ +\x9a\x02\xb5\x01\xd4\xff\x9a\x02\xb5\x01\xd5\xff\x85\x02\xb5\x01\ +\xd6\xff\x9a\x02\xb5\x01\xd7\xff\x9a\x02\xb5\x01\xd8\xffq\x02\ +\xb5\x01\xd9\xff\x9a\x02\xb5\x01\xda\xff\x9a\x02\xb5\x01\xdb\xff\ +q\x02\xb5\x01\xdc\xff\xae\x02\xb5\x01\xdd\xff\xae\x02\xb5\x01\ +\xde\xffq\x02\xb5\x01\xdf\xff\xd7\x02\xb5\x01\xe0\xff\x9a\x02\ +\xb5\x01\xe1\xff\x9a\x02\xb5\x01\xe2\xff\x9a\x02\xb5\x01\xe3\xff\ +\x9a\x02\xb5\x01\xe4\xff\xae\x02\xb5\x01\xe5\xff\x9a\x02\xb5\x01\ +\xe6\xff\x9a\x02\xb5\x01\xe7\xff\xd7\x02\xb5\x01\xe8\xff\x9a\x02\ +\xb5\x01\xe9\xff\xc3\x02\xb5\x01\xea\xffq\x02\xb5\x01\xec\xff\ +\x9a\x02\xb5\x01\xed\xffq\x02\xb5\x01\xee\xff\x85\x02\xb5\x01\ +\xf2\xff\x85\x02\xb5\x01\xf3\xff\x9a\x02\xb5\x01\xf5\xff\x9a\x02\ +\xb5\x01\xf6\xff\xae\x02\xb5\x01\xf7\xff\x9a\x02\xb5\x01\xf9\xff\ +\x9a\x02\xb5\x02\x02\xff\xae\x02\xb5\x02\x03\xff\xae\x02\xb5\x02\ +\x04\xff\xae\x02\xb5\x02\x08\xff\x85\x02\xb5\x02\x0c\xff\x85\x02\ +\xb5\x02j\xffq\x02\xb5\x02k\xff\x9a\x02\xb5\x02l\xff\ +\xd7\x02\xb5\x02m\xff\xd7\x02\xb5\x02q\xff\x9a\x02\xb5\x02\ +r\xffq\x02\xb5\x02s\xff\x85\x02\xb5\x02u\xff\x9a\x02\ +\xb5\x02w\xff\x9a\x02\xb5\x02y\xff\x9a\x02\xb5\x02}\xff\ +\x9a\x02\xb5\x02~\xff\xd7\x02\xb5\x02\x7f\xffq\x02\xb5\x02\ +\x81\xff\xd7\x02\xb5\x02\x83\xff\xd7\x02\xb5\x02\x84\xff\xd7\x02\ +\xb5\x02\x85\xffq\x02\xb5\x02\x86\xff\xd7\x02\xb5\x02\x87\xff\ +q\x02\xb5\x02\x88\xff\xd7\x02\xb5\x02\x89\xffq\x02\xb5\x02\ +\x8a\xff\xd7\x02\xb5\x02\x8b\xff\xd7\x02\xb5\x02\x8c\xff\xd7\x02\ +\xb5\x02\x8d\xffq\x02\xb5\x02\x96\xff\x9a\x02\xb5\x02\x9a\xff\ +\x9a\x02\xb5\x02\x9e\xff\x9a\x02\xb5\x02\xa0\xff\xd7\x02\xb5\x02\ +\xa2\xff\xd7\x02\xb5\x02\xa4\xff\x9a\x02\xb5\x02\xa6\xff\x9a\x02\ +\xb5\x02\xaa\xff\xae\x02\xb5\x02\xac\xff\x9a\x02\xb5\x02\xae\xff\ +\x9a\x02\xb5\x02\xb0\xff\x9a\x02\xb5\x02\xb1\xff\xd7\x02\xb5\x02\ +\xb2\xffq\x02\xb5\x02\xb3\xff\xd7\x02\xb5\x02\xb4\xffq\x02\ +\xb5\x02\xb5\x00)\x02\xb5\x02\xb6\xff\xae\x02\xb5\x02\xb8\xff\ +\xae\x02\xb5\x02\xba\xff\xae\x02\xb5\x02\xbc\xff\xd7\x02\xb5\x02\ +\xbe\xff\xae\x02\xb5\x02\xc0\xff\x9a\x02\xb5\x02\xc2\xff\x9a\x02\ +\xb5\x02\xc4\xff\x9a\x02\xb5\x02\xc5\xff\x9a\x02\xb5\x02\xc6\xff\ +q\x02\xb5\x02\xc7\xff\x9a\x02\xb5\x02\xc8\xffq\x02\xb5\x02\ +\xcb\xff\xd7\x02\xb5\x02\xcd\xff\x9a\x02\xb5\x02\xce\xff\x9a\x02\ +\xb5\x02\xcf\xff\x85\x02\xb5\x02\xd1\xff\x9a\x02\xb5\x02\xd3\xff\ +\x9a\x02\xb5\x02\xd5\xff\x9a\x02\xb5\x02\xd7\xff\x9a\x02\xb5\x02\ +\xd9\xffq\x02\xb5\x02\xdb\xffq\x02\xb5\x02\xdd\xffq\x02\ +\xb5\x02\xe0\xffq\x02\xb5\x02\xe6\xff\xd7\x02\xb5\x02\xe8\xff\ +\xd7\x02\xb5\x02\xea\xff\xc3\x02\xb5\x02\xec\xff\x9a\x02\xb5\x02\ +\xee\xff\x9a\x02\xb5\x02\xef\xff\xd7\x02\xb5\x02\xf0\xffq\x02\ +\xb5\x02\xf1\xff\xd7\x02\xb5\x02\xf2\xffq\x02\xb5\x02\xf3\xff\ +\xd7\x02\xb5\x02\xf4\xffq\x02\xb5\x02\xf6\xff\xd7\x02\xb5\x02\ +\xf8\xff\xae\x02\xb5\x02\xfa\xff\xae\x02\xb5\x02\xfc\xff\xae\x02\ +\xb5\x02\xfe\xff\x9a\x02\xb5\x03\x00\xff\x9a\x02\xb5\x03\x02\xff\ +\x9a\x02\xb5\x03\x06\xff\xd7\x02\xb5\x03\x08\xff\xd7\x02\xb5\x03\ +\x09\xffq\x02\xb5\x03\x0a\xffq\x02\xb5\x03\x0b\xffq\x02\ +\xb5\x03\x0c\xffq\x02\xb5\x03\x0e\xff\x9a\x02\xb5\x03\x10\xff\ +\x9a\x02\xb5\x03\x11\xff\x9a\x02\xb5\x03\x12\xff\x85\x02\xb5\x03\ +\x14\xff\x9a\x02\xb5\x03\x15\xff\xd7\x02\xb5\x03\x16\xffq\x02\ +\xb5\x03\x18\xff\xae\x02\xb5\x03\x1a\xffq\x02\xb5\x03\x1b\xff\ +\x9a\x02\xb5\x03\x1c\xff\x85\x02\xb6\x00\x0f\xff\x9a\x02\xb6\x00\ +\x10\xff\xd7\x02\xb6\x00\x11\xff\x9a\x02\xb6\x01\xce\xff\xc3\x02\ +\xb6\x01\xcf\xff\xec\x02\xb6\x01\xd5\xff\xc3\x02\xb6\x01\xd8\xff\ +\xec\x02\xb6\x01\xdb\xff\xec\x02\xb6\x01\xde\xff\xec\x02\xb6\x01\ +\xea\xff\xec\x02\xb6\x01\xed\xff\xec\x02\xb6\x01\xf2\xff\xc3\x02\ +\xb6\x02\x02\xff\xd7\x02\xb6\x02\x03\xff\xd7\x02\xb6\x02\x04\xff\ +\xd7\x02\xb6\x02\x08\xff\x9a\x02\xb6\x02\x0c\xff\x9a\x02\xb6\x02\ +j\xff\xec\x02\xb6\x02s\xff\xc3\x02\xb6\x02\x7f\xff\xec\x02\ +\xb6\x02\x85\xff\xec\x02\xb6\x02\x87\xff\xec\x02\xb6\x02\x89\xff\ +\xec\x02\xb6\x02\x8d\xff\xec\x02\xb6\x02\xb2\xff\xec\x02\xb6\x02\ +\xb4\xff\xec\x02\xb6\x02\xcf\xff\xc3\x02\xb6\x02\xe0\xff\xec\x02\ +\xb6\x02\xf0\xff\xec\x02\xb6\x02\xf2\xff\xec\x02\xb6\x02\xf4\xff\ +\xec\x02\xb6\x03\x0a\xff\xec\x02\xb6\x03\x0c\xff\xec\x02\xb6\x03\ +\x12\xff\xc3\x02\xb6\x03\x16\xff\xec\x02\xb6\x03\x1a\xff\xec\x02\ +\xb6\x03\x1c\xff\xc3\x02\xb7\x00\x0f\xff\x85\x02\xb7\x00\x11\xff\ +\x85\x02\xb7\x01\x9f\xff\xd7\x02\xb7\x01\xa4\xff\xae\x02\xb7\x01\ +\xaa\xff\x85\x02\xb7\x01\xae\xff\xae\x02\xb7\x01\xb5\xff\xae\x02\ +\xb7\x01\xb8\xff\xd7\x02\xb7\x01\xbb\xff\xd7\x02\xb7\x01\xbe\xff\ +\xc3\x02\xb7\x01\xca\xff\xae\x02\xb7\x01\xcc\xff\xc3\x02\xb7\x01\ +\xcd\xff\xc3\x02\xb7\x01\xce\xff\x9a\x02\xb7\x01\xcf\xff\x9a\x02\ +\xb7\x01\xd2\xff\xc3\x02\xb7\x01\xd3\xff\xc3\x02\xb7\x01\xd4\xff\ +\xc3\x02\xb7\x01\xd5\xff\x9a\x02\xb7\x01\xd6\xff\xc3\x02\xb7\x01\ +\xd7\xff\xc3\x02\xb7\x01\xd8\xff\x9a\x02\xb7\x01\xd9\xff\xc3\x02\ +\xb7\x01\xda\xff\xc3\x02\xb7\x01\xdb\xff\x9a\x02\xb7\x01\xde\xff\ +\x9a\x02\xb7\x01\xe0\xff\xc3\x02\xb7\x01\xe1\xff\xae\x02\xb7\x01\ +\xe2\xff\xc3\x02\xb7\x01\xe3\xff\xc3\x02\xb7\x01\xe5\xff\xc3\x02\ +\xb7\x01\xe6\xff\xc3\x02\xb7\x01\xe8\xff\xc3\x02\xb7\x01\xe9\xff\ +\xd7\x02\xb7\x01\xea\xff\x9a\x02\xb7\x01\xeb\x00)\x02\xb7\x01\ +\xec\xff\xc3\x02\xb7\x01\xed\xff\x9a\x02\xb7\x01\xee\xff\xae\x02\ +\xb7\x01\xf2\xff\x9a\x02\xb7\x01\xf3\xff\xc3\x02\xb7\x01\xf4\x00\ +)\x02\xb7\x01\xf5\xff\xc3\x02\xb7\x01\xf7\xff\xc3\x02\xb7\x01\ +\xf9\xff\xc3\x02\xb7\x02\x08\xff\x85\x02\xb7\x02\x0c\xff\x85\x02\ +\xb7\x02j\xff\x9a\x02\xb7\x02k\xff\xc3\x02\xb7\x02l\xff\ +\xd7\x02\xb7\x02q\xff\xc3\x02\xb7\x02r\xff\x85\x02\xb7\x02\ +s\xff\x9a\x02\xb7\x02u\xff\xc3\x02\xb7\x02w\xff\xd7\x02\ +\xb7\x02y\xff\xc3\x02\xb7\x02}\xff\xd7\x02\xb7\x02~\xff\ +\xd7\x02\xb7\x02\x7f\xff\x9a\x02\xb7\x02\x84\xff\xd7\x02\xb7\x02\ +\x85\xff\x9a\x02\xb7\x02\x86\xff\xd7\x02\xb7\x02\x87\xff\x9a\x02\ +\xb7\x02\x88\xff\xd7\x02\xb7\x02\x89\xff\x9a\x02\xb7\x02\x8a\xff\ +\xd7\x02\xb7\x02\x8c\xff\xd7\x02\xb7\x02\x8d\xff\x9a\x02\xb7\x02\ +\x96\xff\xc3\x02\xb7\x02\x98\x00)\x02\xb7\x02\x9a\xff\xc3\x02\ +\xb7\x02\x9e\xff\xc3\x02\xb7\x02\xa4\xff\xc3\x02\xb7\x02\xa6\xff\ +\xc3\x02\xb7\x02\xa8\x00)\x02\xb7\x02\xac\xff\xc3\x02\xb7\x02\ +\xae\xff\xc3\x02\xb7\x02\xb0\xff\xc3\x02\xb7\x02\xb1\xff\xd7\x02\ +\xb7\x02\xb2\xff\x9a\x02\xb7\x02\xb3\xff\xd7\x02\xb7\x02\xb4\xff\ +\x9a\x02\xb7\x02\xc0\xff\xae\x02\xb7\x02\xc2\xff\xae\x02\xb7\x02\ +\xc4\xff\xc3\x02\xb7\x02\xc6\xff\xae\x02\xb7\x02\xc8\xff\xae\x02\ +\xb7\x02\xcd\xff\xc3\x02\xb7\x02\xce\xff\xae\x02\xb7\x02\xcf\xff\ +\x9a\x02\xb7\x02\xd1\xff\xc3\x02\xb7\x02\xd3\xff\xc3\x02\xb7\x02\ +\xd5\xff\xae\x02\xb7\x02\xd7\xff\xc3\x02\xb7\x02\xd9\xff\x85\x02\ +\xb7\x02\xda\xff\xae\x02\xb7\x02\xdb\xff\x85\x02\xb7\x02\xdc\xff\ +\xae\x02\xb7\x02\xdd\xff\x85\x02\xb7\x02\xde\xff\xae\x02\xb7\x02\ +\xe0\xff\x9a\x02\xb7\x02\xe1\xff\xec\x02\xb7\x02\xe2\xff\xae\x02\ +\xb7\x02\xe3\xff\xec\x02\xb7\x02\xe4\xff\xae\x02\xb7\x02\xec\xff\ +\xc3\x02\xb7\x02\xee\xff\xc3\x02\xb7\x02\xef\xff\xd7\x02\xb7\x02\ +\xf0\xff\x9a\x02\xb7\x02\xf1\xff\xd7\x02\xb7\x02\xf2\xff\x9a\x02\ +\xb7\x02\xf3\xff\xd7\x02\xb7\x02\xf4\xff\x9a\x02\xb7\x02\xfe\xff\ +\xae\x02\xb7\x03\x00\xff\xc3\x02\xb7\x03\x02\xff\xc3\x02\xb7\x03\ +\x09\xff\xae\x02\xb7\x03\x0a\xff\x9a\x02\xb7\x03\x0b\xff\xae\x02\ +\xb7\x03\x0c\xff\x9a\x02\xb7\x03\x0e\xff\xd7\x02\xb7\x03\x10\xff\ +\xd7\x02\xb7\x03\x11\xff\xae\x02\xb7\x03\x12\xff\x9a\x02\xb7\x03\ +\x14\xff\xc3\x02\xb7\x03\x15\xff\xd7\x02\xb7\x03\x16\xff\x9a\x02\ +\xb7\x03\x19\xff\xec\x02\xb7\x03\x1a\xff\x9a\x02\xb7\x03\x1b\xff\ +\xae\x02\xb7\x03\x1c\xff\x9a\x02\xb8\x00\x0f\xff\xae\x02\xb8\x00\ +\x11\xff\xae\x02\xb8\x01\xce\xff\xec\x02\xb8\x01\xd5\xff\xec\x02\ +\xb8\x01\xf2\xff\xec\x02\xb8\x02\x08\xff\xae\x02\xb8\x02\x0c\xff\ +\xae\x02\xb8\x02s\xff\xec\x02\xb8\x02\xcf\xff\xec\x02\xb8\x03\ +\x12\xff\xec\x02\xb8\x03\x1c\xff\xec\x02\xb9\x00\x0f\xff\x85\x02\ +\xb9\x00\x11\xff\x85\x02\xb9\x01\x9f\xff\xd7\x02\xb9\x01\xa4\xff\ +\xae\x02\xb9\x01\xaa\xff\x85\x02\xb9\x01\xae\xff\xae\x02\xb9\x01\ +\xb5\xff\xae\x02\xb9\x01\xb8\xff\xd7\x02\xb9\x01\xbb\xff\xd7\x02\ +\xb9\x01\xbe\xff\xc3\x02\xb9\x01\xca\xff\xae\x02\xb9\x01\xcc\xff\ +\xc3\x02\xb9\x01\xcd\xff\xc3\x02\xb9\x01\xce\xff\x9a\x02\xb9\x01\ +\xcf\xff\x9a\x02\xb9\x01\xd2\xff\xc3\x02\xb9\x01\xd3\xff\xc3\x02\ +\xb9\x01\xd4\xff\xc3\x02\xb9\x01\xd5\xff\x9a\x02\xb9\x01\xd6\xff\ +\xc3\x02\xb9\x01\xd7\xff\xc3\x02\xb9\x01\xd8\xff\x9a\x02\xb9\x01\ +\xd9\xff\xc3\x02\xb9\x01\xda\xff\xc3\x02\xb9\x01\xdb\xff\x9a\x02\ +\xb9\x01\xde\xff\x9a\x02\xb9\x01\xe0\xff\xc3\x02\xb9\x01\xe1\xff\ +\xae\x02\xb9\x01\xe2\xff\xc3\x02\xb9\x01\xe3\xff\xc3\x02\xb9\x01\ +\xe5\xff\xc3\x02\xb9\x01\xe6\xff\xc3\x02\xb9\x01\xe8\xff\xc3\x02\ +\xb9\x01\xe9\xff\xd7\x02\xb9\x01\xea\xff\x9a\x02\xb9\x01\xeb\x00\ +)\x02\xb9\x01\xec\xff\xc3\x02\xb9\x01\xed\xff\x9a\x02\xb9\x01\ +\xee\xff\xae\x02\xb9\x01\xf2\xff\x9a\x02\xb9\x01\xf3\xff\xc3\x02\ +\xb9\x01\xf4\x00)\x02\xb9\x01\xf5\xff\xc3\x02\xb9\x01\xf7\xff\ +\xc3\x02\xb9\x01\xf9\xff\xc3\x02\xb9\x02\x08\xff\x85\x02\xb9\x02\ +\x0c\xff\x85\x02\xb9\x02j\xff\x9a\x02\xb9\x02k\xff\xc3\x02\ +\xb9\x02l\xff\xd7\x02\xb9\x02q\xff\xc3\x02\xb9\x02r\xff\ +\x85\x02\xb9\x02s\xff\x9a\x02\xb9\x02u\xff\xc3\x02\xb9\x02\ +w\xff\xd7\x02\xb9\x02y\xff\xc3\x02\xb9\x02}\xff\xd7\x02\ +\xb9\x02~\xff\xd7\x02\xb9\x02\x7f\xff\x9a\x02\xb9\x02\x84\xff\ +\xd7\x02\xb9\x02\x85\xff\x9a\x02\xb9\x02\x86\xff\xd7\x02\xb9\x02\ +\x87\xff\x9a\x02\xb9\x02\x88\xff\xd7\x02\xb9\x02\x89\xff\x9a\x02\ +\xb9\x02\x8a\xff\xd7\x02\xb9\x02\x8c\xff\xd7\x02\xb9\x02\x8d\xff\ +\x9a\x02\xb9\x02\x96\xff\xc3\x02\xb9\x02\x98\x00)\x02\xb9\x02\ +\x9a\xff\xc3\x02\xb9\x02\x9e\xff\xc3\x02\xb9\x02\xa4\xff\xc3\x02\ +\xb9\x02\xa6\xff\xc3\x02\xb9\x02\xa8\x00)\x02\xb9\x02\xac\xff\ +\xc3\x02\xb9\x02\xae\xff\xc3\x02\xb9\x02\xb0\xff\xc3\x02\xb9\x02\ +\xb1\xff\xd7\x02\xb9\x02\xb2\xff\x9a\x02\xb9\x02\xb3\xff\xd7\x02\ +\xb9\x02\xb4\xff\x9a\x02\xb9\x02\xc0\xff\xae\x02\xb9\x02\xc2\xff\ +\xae\x02\xb9\x02\xc4\xff\xc3\x02\xb9\x02\xc6\xff\xae\x02\xb9\x02\ +\xc8\xff\xae\x02\xb9\x02\xcd\xff\xc3\x02\xb9\x02\xce\xff\xae\x02\ +\xb9\x02\xcf\xff\x9a\x02\xb9\x02\xd1\xff\xc3\x02\xb9\x02\xd3\xff\ +\xc3\x02\xb9\x02\xd5\xff\xae\x02\xb9\x02\xd7\xff\xc3\x02\xb9\x02\ +\xd9\xff\x85\x02\xb9\x02\xda\xff\xae\x02\xb9\x02\xdb\xff\x85\x02\ +\xb9\x02\xdc\xff\xae\x02\xb9\x02\xdd\xff\x85\x02\xb9\x02\xde\xff\ +\xae\x02\xb9\x02\xe0\xff\x9a\x02\xb9\x02\xe1\xff\xec\x02\xb9\x02\ +\xe2\xff\xae\x02\xb9\x02\xe3\xff\xec\x02\xb9\x02\xe4\xff\xae\x02\ +\xb9\x02\xec\xff\xc3\x02\xb9\x02\xee\xff\xc3\x02\xb9\x02\xef\xff\ +\xd7\x02\xb9\x02\xf0\xff\x9a\x02\xb9\x02\xf1\xff\xd7\x02\xb9\x02\ +\xf2\xff\x9a\x02\xb9\x02\xf3\xff\xd7\x02\xb9\x02\xf4\xff\x9a\x02\ +\xb9\x02\xfe\xff\xae\x02\xb9\x03\x00\xff\xc3\x02\xb9\x03\x02\xff\ +\xc3\x02\xb9\x03\x09\xff\xae\x02\xb9\x03\x0a\xff\x9a\x02\xb9\x03\ +\x0b\xff\xae\x02\xb9\x03\x0c\xff\x9a\x02\xb9\x03\x0e\xff\xd7\x02\ +\xb9\x03\x10\xff\xd7\x02\xb9\x03\x11\xff\xae\x02\xb9\x03\x12\xff\ +\x9a\x02\xb9\x03\x14\xff\xc3\x02\xb9\x03\x15\xff\xd7\x02\xb9\x03\ +\x16\xff\x9a\x02\xb9\x03\x19\xff\xec\x02\xb9\x03\x1a\xff\x9a\x02\ +\xb9\x03\x1b\xff\xae\x02\xb9\x03\x1c\xff\x9a\x02\xba\x00\x0f\xff\ +\xae\x02\xba\x00\x11\xff\xae\x02\xba\x01\xce\xff\xec\x02\xba\x01\ +\xd5\xff\xec\x02\xba\x01\xf2\xff\xec\x02\xba\x02\x08\xff\xae\x02\ +\xba\x02\x0c\xff\xae\x02\xba\x02s\xff\xec\x02\xba\x02\xcf\xff\ +\xec\x02\xba\x03\x12\xff\xec\x02\xba\x03\x1c\xff\xec\x02\xbb\x01\ +\x9f\xff\xd7\x02\xbb\x01\xa3\x00\xe1\x02\xbb\x01\xb8\xff\xd7\x02\ +\xbb\x01\xbb\xff\xd7\x02\xbb\x01\xbe\xff\xc3\x02\xbb\x01\xdc\xff\ +\xd7\x02\xbb\x01\xe1\xff\xae\x02\xbb\x01\xe4\xff\xd7\x02\xbb\x02\ +l\xff\xd7\x02\xbb\x02{\x00=\x02\xbb\x02}\xff\xec\x02\ +\xbb\x02~\xff\xd7\x02\xbb\x02\x84\xff\xd7\x02\xbb\x02\x86\xff\ +\xd7\x02\xbb\x02\x88\xff\xd7\x02\xbb\x02\x8a\xff\xd7\x02\xbb\x02\ +\x8c\xff\xd7\x02\xbb\x02\xaa\xff\xd7\x02\xbb\x02\xb1\xff\xd7\x02\ +\xbb\x02\xb3\xff\xd7\x02\xbb\x02\xb6\xff\xd7\x02\xbb\x02\xbe\xff\ +\xd7\x02\xbb\x02\xc0\xff\xae\x02\xbb\x02\xc2\xff\xae\x02\xbb\x02\ +\xc5\xff\xc3\x02\xbb\x02\xc6\xff\xd7\x02\xbb\x02\xc7\xff\xc3\x02\ +\xbb\x02\xc8\xff\xd7\x02\xbb\x02\xd5\xff\xae\x02\xbb\x02\xef\xff\ +\xd7\x02\xbb\x02\xf1\xff\xd7\x02\xbb\x02\xf3\xff\xd7\x02\xbb\x02\ +\xfe\xff\xae\x02\xbb\x03\x0e\xff\xd7\x02\xbb\x03\x10\xff\xd7\x02\ +\xbb\x03\x15\xff\xd7\x02\xbb\x03\x18\xff\xd7\x02\xbc\x01\xcf\xff\ +\xec\x02\xbc\x01\xd8\xff\xec\x02\xbc\x01\xdb\xff\xec\x02\xbc\x01\ +\xde\xff\xec\x02\xbc\x01\xe1\xff\xec\x02\xbc\x01\xea\xff\xec\x02\ +\xbc\x01\xed\xff\xec\x02\xbc\x02j\xff\xec\x02\xbc\x02\x7f\xff\ +\xec\x02\xbc\x02\x85\xff\xec\x02\xbc\x02\x87\xff\xec\x02\xbc\x02\ +\x89\xff\xec\x02\xbc\x02\x8d\xff\xec\x02\xbc\x02\xb2\xff\xec\x02\ +\xbc\x02\xb4\xff\xec\x02\xbc\x02\xc0\xff\xec\x02\xbc\x02\xc2\xff\ +\xec\x02\xbc\x02\xd5\xff\xec\x02\xbc\x02\xe0\xff\xec\x02\xbc\x02\ +\xf0\xff\xec\x02\xbc\x02\xf2\xff\xec\x02\xbc\x02\xf4\xff\xec\x02\ +\xbc\x02\xfe\xff\xec\x02\xbc\x03\x0a\xff\xec\x02\xbc\x03\x0c\xff\ +\xec\x02\xbc\x03\x0e\xff\xd7\x02\xbc\x03\x10\xff\xd7\x02\xbc\x03\ +\x16\xff\xec\x02\xbc\x03\x1a\xff\xec\x02\xbd\x01\xa3\x00\xe1\x02\ +\xbd\x02\xea\x00)\x02\xbd\x03\x0e\xff\xd7\x02\xbd\x03\x10\xff\ +\xd7\x02\xbe\x00\x05\xff\xec\x02\xbe\x00\x0a\xff\xec\x02\xbe\x02\ +\x07\xff\xec\x02\xbe\x02\x0b\xff\xec\x02\xbf\x01\xa3\x00\xe1\x02\ +\xbf\x02\xea\x00)\x02\xbf\x03\x0e\xff\xd7\x02\xbf\x03\x10\xff\ +\xd7\x02\xc0\x00\x05\xff\xec\x02\xc0\x00\x0a\xff\xec\x02\xc0\x02\ +\x07\xff\xec\x02\xc0\x02\x0b\xff\xec\x02\xc3\x00\x05\xff\xc3\x02\ +\xc3\x00\x0a\xff\xc3\x02\xc3\x01\x9d\xff\xd7\x02\xc3\x01\xa6\xff\ +\xd7\x02\xc3\x01\xbc\xff\x85\x02\xc3\x01\xc1\xff\xae\x02\xc3\x01\ +\xc4\xff\xd7\x02\xc3\x01\xdc\xff\xd7\x02\xc3\x01\xdd\xff\xec\x02\ +\xc3\x01\xe1\xff\xec\x02\xc3\x01\xe4\xff\xd7\x02\xc3\x01\xf6\xff\ +\xec\x02\xc3\x02\x07\xff\xc3\x02\xc3\x02\x0b\xff\xc3\x02\xc3\x02\ +|\xff\xae\x02\xc3\x02\x80\xff\xc3\x02\xc3\x02\x82\xff\xc3\x02\ +\xc3\x02\xa9\xff\xd7\x02\xc3\x02\xaa\xff\xd7\x02\xc3\x02\xb5\xff\ +\x85\x02\xc3\x02\xb6\xff\xd7\x02\xc3\x02\xb7\xff\x9a\x02\xc3\x02\ +\xb9\xff\x9a\x02\xc3\x02\xbd\xff\xd7\x02\xc3\x02\xbe\xff\xd7\x02\ +\xc3\x02\xbf\xff\xae\x02\xc3\x02\xc0\xff\xec\x02\xc3\x02\xc1\xff\ +\xae\x02\xc3\x02\xc2\xff\xec\x02\xc3\x02\xd4\xff\xae\x02\xc3\x02\ +\xd5\xff\xec\x02\xc3\x02\xf8\xff\xec\x02\xc3\x02\xfa\xff\xec\x02\ +\xc3\x02\xfc\xff\xec\x02\xc3\x02\xfd\xff\xae\x02\xc3\x02\xfe\xff\ +\xec\x02\xc3\x03\x0d\xff\xae\x02\xc3\x03\x0e\xff\xd7\x02\xc3\x03\ +\x0f\xff\xae\x02\xc3\x03\x10\xff\xd7\x02\xc3\x03\x17\xff\xd7\x02\ +\xc3\x03\x18\xff\xd7\x02\xc4\x00\x05\xff\x9a\x02\xc4\x00\x0a\xff\ +\x9a\x02\xc4\x01\xdc\xff\xd7\x02\xc4\x01\xdd\xff\xd7\x02\xc4\x01\ +\xe4\xff\xd7\x02\xc4\x01\xf6\xff\xd7\x02\xc4\x02\x07\xff\x9a\x02\ +\xc4\x02\x0b\xff\x9a\x02\xc4\x02\xaa\xff\xd7\x02\xc4\x02\xb6\xff\ +\xd7\x02\xc4\x02\xb8\xff\xd7\x02\xc4\x02\xba\xff\xd7\x02\xc4\x02\ +\xbe\xff\xd7\x02\xc4\x02\xf8\xff\xd7\x02\xc4\x02\xfa\xff\xd7\x02\ +\xc4\x02\xfc\xff\xd7\x02\xc4\x03\x0e\xff\xae\x02\xc4\x03\x10\xff\ +\xae\x02\xc4\x03\x18\xff\xd7\x02\xc5\x01\xbc\xff\xd7\x02\xc5\x02\ +\x80\xff\xec\x02\xc5\x02\x82\xff\xec\x02\xc5\x02\xb5\xff\xd7\x02\ +\xc5\x02\xb7\xff\xec\x02\xc5\x02\xb9\xff\xec\x02\xc5\x03\x0d\xff\ +\xec\x02\xc5\x03\x0f\xff\xec\x02\xc6\x00\x05\xff\xec\x02\xc6\x00\ +\x0a\xff\xec\x02\xc6\x02\x07\xff\xec\x02\xc6\x02\x0b\xff\xec\x02\ +\xc7\x01\xbc\xff\xd7\x02\xc7\x02\x80\xff\xec\x02\xc7\x02\x82\xff\ +\xec\x02\xc7\x02\xb5\xff\xd7\x02\xc7\x02\xb7\xff\xec\x02\xc7\x02\ +\xb9\xff\xec\x02\xc7\x03\x0d\xff\xec\x02\xc7\x03\x0f\xff\xec\x02\ +\xc8\x00\x05\xff\xec\x02\xc8\x00\x0a\xff\xec\x02\xc8\x02\x07\xff\ +\xec\x02\xc8\x02\x0b\xff\xec\x02\xca\x01\x9f\xff\xd7\x02\xca\x01\ +\xb8\xff\xd7\x02\xca\x01\xbb\xff\xd7\x02\xca\x01\xbe\xff\xd7\x02\ +\xca\x01\xc1\xff\xd7\x02\xca\x01\xe1\xff\xd7\x02\xca\x02l\xff\ +\xd7\x02\xca\x02|\xff\xd7\x02\xca\x02~\xff\xd7\x02\xca\x02\ +\x84\xff\xd7\x02\xca\x02\x86\xff\xd7\x02\xca\x02\x88\xff\xd7\x02\ +\xca\x02\x8a\xff\xd7\x02\xca\x02\x8c\xff\xd7\x02\xca\x02\xb1\xff\ +\xd7\x02\xca\x02\xb3\xff\xd7\x02\xca\x02\xbf\xff\xd7\x02\xca\x02\ +\xc0\xff\xd7\x02\xca\x02\xc1\xff\xd7\x02\xca\x02\xc2\xff\xd7\x02\ +\xca\x02\xc5\xff\x9a\x02\xca\x02\xc7\xff\x9a\x02\xca\x02\xd4\xff\ +\xd7\x02\xca\x02\xd5\xff\xd7\x02\xca\x02\xef\xff\xd7\x02\xca\x02\ +\xf1\xff\xd7\x02\xca\x02\xf3\xff\xd7\x02\xca\x02\xfd\xff\xd7\x02\ +\xca\x02\xfe\xff\xd7\x02\xca\x03\x09\xff\xd7\x02\xca\x03\x0b\xff\ +\xd7\x02\xca\x03\x0e\xff\xd7\x02\xca\x03\x10\xff\xd7\x02\xca\x03\ +\x15\xff\xd7\x02\xca\x03\x19\xff\xec\x02\xcb\x01\xcf\xff\xd7\x02\ +\xcb\x01\xd8\xff\xd7\x02\xcb\x01\xdb\xff\xd7\x02\xcb\x01\xde\xff\ +\xd7\x02\xcb\x01\xe1\xff\xd7\x02\xcb\x01\xea\xff\xd7\x02\xcb\x01\ +\xed\xff\xd7\x02\xcb\x02j\xff\xd7\x02\xcb\x02\x7f\xff\xd7\x02\ +\xcb\x02\x85\xff\xd7\x02\xcb\x02\x87\xff\xd7\x02\xcb\x02\x89\xff\ +\xd7\x02\xcb\x02\x8d\xff\xd7\x02\xcb\x02\xb2\xff\xd7\x02\xcb\x02\ +\xb4\xff\xd7\x02\xcb\x02\xc0\xff\xd7\x02\xcb\x02\xc2\xff\xd7\x02\ +\xcb\x02\xc6\xff\xd7\x02\xcb\x02\xc8\xff\xd7\x02\xcb\x02\xd5\xff\ +\xd7\x02\xcb\x02\xe0\xff\xd7\x02\xcb\x02\xf0\xff\xd7\x02\xcb\x02\ +\xf2\xff\xd7\x02\xcb\x02\xf4\xff\xd7\x02\xcb\x02\xfe\xff\xd7\x02\ +\xcb\x03\x0a\xff\xd7\x02\xcb\x03\x0c\xff\xd7\x02\xcb\x03\x16\xff\ +\xd7\x02\xcb\x03\x1a\xff\xd7\x02\xcc\x00\x05\xff\xc3\x02\xcc\x00\ +\x0a\xff\xc3\x02\xcc\x01\xa3\x00f\x02\xcc\x01\xbc\xff\xd7\x02\ +\xcc\x01\xbe\xff\xd7\x02\xcc\x01\xc1\xff\xae\x02\xcc\x01\xdc\xff\ +\xc3\x02\xcc\x01\xe1\xff\xd7\x02\xcc\x01\xe4\xff\xc3\x02\xcc\x02\ +\x07\xff\xc3\x02\xcc\x02\x0b\xff\xc3\x02\xcc\x02m\xff\xec\x02\ +\xcc\x02|\xff\xae\x02\xcc\x02\x80\xff\xd7\x02\xcc\x02\x81\xff\ +\xec\x02\xcc\x02\x82\xff\xd7\x02\xcc\x02\x83\xff\xec\x02\xcc\x02\ +\x8b\xff\xec\x02\xcc\x02\xaa\xff\xc3\x02\xcc\x02\xb5\xff\xd7\x02\ +\xcc\x02\xb6\xff\xc3\x02\xcc\x02\xb7\xff\xd7\x02\xcc\x02\xb8\xff\ +\xec\x02\xcc\x02\xb9\xff\xd7\x02\xcc\x02\xba\xff\xec\x02\xcc\x02\ +\xbe\xff\xc3\x02\xcc\x02\xbf\xff\xae\x02\xcc\x02\xc0\xff\xd7\x02\ +\xcc\x02\xc1\xff\xae\x02\xcc\x02\xc2\xff\xd7\x02\xcc\x02\xc5\xff\ +\xc3\x02\xcc\x02\xc6\xff\xd7\x02\xcc\x02\xc7\xff\xc3\x02\xcc\x02\ +\xc8\xff\xd7\x02\xcc\x02\xd4\xff\xae\x02\xcc\x02\xd5\xff\xd7\x02\ +\xcc\x02\xfd\xff\xae\x02\xcc\x02\xfe\xff\xd7\x02\xcc\x03\x0d\xff\ +\xd7\x02\xcc\x03\x0e\xff\xc3\x02\xcc\x03\x0f\xff\xd7\x02\xcc\x03\ +\x10\xff\xc3\x02\xcc\x03\x18\xff\xc3\x02\xcd\x01\xe1\xff\xd7\x02\ +\xcd\x02\xc0\xff\xd7\x02\xcd\x02\xc2\xff\xd7\x02\xcd\x02\xd5\xff\ +\xd7\x02\xcd\x02\xfe\xff\xd7\x02\xce\x01\xa3\x00\xe1\x02\xce\x02\ +\xea\x00)\x02\xce\x03\x0e\xff\xd7\x02\xce\x03\x10\xff\xd7\x02\ +\xcf\x00\x05\xff\xec\x02\xcf\x00\x0a\xff\xec\x02\xcf\x02\x07\xff\ +\xec\x02\xcf\x02\x0b\xff\xec\x02\xd2\x01\xa3\x00\xe1\x02\xd2\x02\ +\xea\x00)\x02\xd2\x03\x0e\xff\xd7\x02\xd2\x03\x10\xff\xd7\x02\ +\xd3\x00\x05\xff\xec\x02\xd3\x00\x0a\xff\xec\x02\xd3\x02\x07\xff\ +\xec\x02\xd3\x02\x0b\xff\xec\x02\xd6\x01\xa3\x00\xe1\x02\xd6\x02\ +\xea\x00)\x02\xd6\x03\x0e\xff\xd7\x02\xd6\x03\x10\xff\xd7\x02\ +\xd7\x00\x05\xff\xec\x02\xd7\x00\x0a\xff\xec\x02\xd7\x02\x07\xff\ +\xec\x02\xd7\x02\x0b\xff\xec\x02\xd9\x00\x05\xffq\x02\xd9\x00\ +\x0a\xffq\x02\xd9\x01\x9d\xff\x9a\x02\xd9\x01\xa6\xff\x9a\x02\ +\xd9\x01\xbc\xffq\x02\xd9\x01\xbe\xff\xd7\x02\xd9\x01\xc1\xff\ +\x9a\x02\xd9\x01\xc4\xff\x9a\x02\xd9\x01\xdc\xff\xd7\x02\xd9\x01\ +\xe1\xff\xd7\x02\xd9\x01\xe4\xff\xd7\x02\xd9\x02\x07\xffq\x02\ +\xd9\x02\x0b\xffq\x02\xd9\x02n\xff\xd7\x02\xd9\x02|\xff\ +\x9a\x02\xd9\x02\x80\xff\xae\x02\xd9\x02\x82\xff\xae\x02\xd9\x02\ +\x97\xff\xd7\x02\xd9\x02\x9b\xff\xd7\x02\xd9\x02\xa7\xff\xd7\x02\ +\xd9\x02\xa9\xff\x9a\x02\xd9\x02\xaa\xff\xd7\x02\xd9\x02\xb5\xff\ +q\x02\xd9\x02\xb6\xff\xd7\x02\xd9\x02\xb7\xff\x85\x02\xd9\x02\ +\xb9\xff\x85\x02\xd9\x02\xbd\xff\x9a\x02\xd9\x02\xbe\xff\xd7\x02\ +\xd9\x02\xbf\xff\x9a\x02\xd9\x02\xc0\xff\xd7\x02\xd9\x02\xc1\xff\ +\x9a\x02\xd9\x02\xc2\xff\xd7\x02\xd9\x02\xc5\xff\x9a\x02\xd9\x02\ +\xc7\xff\x9a\x02\xd9\x02\xd4\xff\x9a\x02\xd9\x02\xd5\xff\xd7\x02\ +\xd9\x02\xe1\xff\xd7\x02\xd9\x02\xe3\xff\xd7\x02\xd9\x02\xfd\xff\ +\x9a\x02\xd9\x02\xfe\xff\xd7\x02\xd9\x03\x03\xff\xd7\x02\xd9\x03\ +\x0d\xffq\x02\xd9\x03\x0e\xff\xd7\x02\xd9\x03\x0f\xffq\x02\ +\xd9\x03\x10\xff\xd7\x02\xd9\x03\x17\xff\x9a\x02\xd9\x03\x18\xff\ +\xd7\x02\xda\x00\x05\xff\xec\x02\xda\x00\x0a\xff\xec\x02\xda\x02\ +\x07\xff\xec\x02\xda\x02\x0b\xff\xec\x02\xdb\x00\x05\xffq\x02\ +\xdb\x00\x0a\xffq\x02\xdb\x01\x9d\xff\x9a\x02\xdb\x01\xa6\xff\ +\x9a\x02\xdb\x01\xbc\xffq\x02\xdb\x01\xbe\xff\xd7\x02\xdb\x01\ +\xc1\xff\x9a\x02\xdb\x01\xc4\xff\x9a\x02\xdb\x01\xdc\xff\xd7\x02\ +\xdb\x01\xe1\xff\xd7\x02\xdb\x01\xe4\xff\xd7\x02\xdb\x02\x07\xff\ +q\x02\xdb\x02\x0b\xffq\x02\xdb\x02n\xff\xd7\x02\xdb\x02\ +|\xff\x9a\x02\xdb\x02\x80\xff\xae\x02\xdb\x02\x82\xff\xae\x02\ +\xdb\x02\x97\xff\xd7\x02\xdb\x02\x9b\xff\xd7\x02\xdb\x02\xa7\xff\ +\xd7\x02\xdb\x02\xa9\xff\x9a\x02\xdb\x02\xaa\xff\xd7\x02\xdb\x02\ +\xb5\xffq\x02\xdb\x02\xb6\xff\xd7\x02\xdb\x02\xb7\xff\x85\x02\ +\xdb\x02\xb9\xff\x85\x02\xdb\x02\xbd\xff\x9a\x02\xdb\x02\xbe\xff\ +\xd7\x02\xdb\x02\xbf\xff\x9a\x02\xdb\x02\xc0\xff\xd7\x02\xdb\x02\ +\xc1\xff\x9a\x02\xdb\x02\xc2\xff\xd7\x02\xdb\x02\xc5\xff\x9a\x02\ +\xdb\x02\xc7\xff\x9a\x02\xdb\x02\xd4\xff\x9a\x02\xdb\x02\xd5\xff\ +\xd7\x02\xdb\x02\xe1\xff\xd7\x02\xdb\x02\xe3\xff\xd7\x02\xdb\x02\ +\xfd\xff\x9a\x02\xdb\x02\xfe\xff\xd7\x02\xdb\x03\x03\xff\xd7\x02\ +\xdb\x03\x0d\xffq\x02\xdb\x03\x0e\xff\xd7\x02\xdb\x03\x0f\xff\ +q\x02\xdb\x03\x10\xff\xd7\x02\xdb\x03\x17\xff\x9a\x02\xdb\x03\ +\x18\xff\xd7\x02\xdc\x00\x05\xff\xec\x02\xdc\x00\x0a\xff\xec\x02\ +\xdc\x02\x07\xff\xec\x02\xdc\x02\x0b\xff\xec\x02\xde\x00\x05\xff\ +\xec\x02\xde\x00\x0a\xff\xec\x02\xde\x02\x07\xff\xec\x02\xde\x02\ +\x0b\xff\xec\x02\xe0\x00\x05\xff\xec\x02\xe0\x00\x0a\xff\xec\x02\ +\xe0\x02\x07\xff\xec\x02\xe0\x02\x0b\xff\xec\x02\xe1\x00\x0f\xff\ +\xae\x02\xe1\x00\x11\xff\xae\x02\xe1\x01\x9d\xff\xec\x02\xe1\x01\ +\xa4\xff\xd7\x02\xe1\x01\xa6\xff\xec\x02\xe1\x01\xa8\xff\xd7\x02\ +\xe1\x01\xaa\xff\xd7\x02\xe1\x01\xae\xff\xd7\x02\xe1\x01\xb0\xff\ +\xd7\x02\xe1\x01\xb1\xff\xec\x02\xe1\x01\xb5\xff\xd7\x02\xe1\x01\ +\xbc\xff\xc3\x02\xe1\x01\xbd\xff\xd7\x02\xe1\x01\xbf\xff\xd7\x02\ +\xe1\x01\xc1\xff\xd7\x02\xe1\x01\xc4\xff\xec\x02\xe1\x01\xc7\xff\ +\xec\x02\xe1\x01\xce\xff\xec\x02\xe1\x01\xd5\xff\xec\x02\xe1\x01\ +\xf2\xff\xec\x02\xe1\x02\x08\xff\xae\x02\xe1\x02\x0c\xff\xae\x02\ +\xe1\x02r\xff\xd7\x02\xe1\x02s\xff\xec\x02\xe1\x02z\xff\ +\xec\x02\xe1\x02|\xff\xd7\x02\xe1\x02\x80\xff\xec\x02\xe1\x02\ +\x82\xff\xec\x02\xe1\x02\x9f\xff\xd7\x02\xe1\x02\xa1\xff\xec\x02\ +\xe1\x02\xa9\xff\xec\x02\xe1\x02\xb5\xff\xc3\x02\xe1\x02\xb7\xff\ +\xec\x02\xe1\x02\xb9\xff\xec\x02\xe1\x02\xbb\xff\xd7\x02\xe1\x02\ +\xbd\xff\xec\x02\xe1\x02\xbf\xff\xd7\x02\xe1\x02\xc1\xff\xd7\x02\ +\xe1\x02\xca\xff\xd7\x02\xe1\x02\xce\xff\xd7\x02\xe1\x02\xcf\xff\ +\xec\x02\xe1\x02\xd4\xff\xd7\x02\xe1\x02\xd9\xff\xd7\x02\xe1\x02\ +\xdb\xff\xd7\x02\xe1\x02\xdd\xff\xd7\x02\xe1\x02\xe5\xff\xd7\x02\ +\xe1\x02\xe7\xff\xec\x02\xe1\x02\xf5\xff\xec\x02\xe1\x02\xf7\xff\ +\xd7\x02\xe1\x02\xf9\xff\xd7\x02\xe1\x02\xfb\xff\xd7\x02\xe1\x02\ +\xfd\xff\xd7\x02\xe1\x03\x05\xff\xd7\x02\xe1\x03\x07\xff\xd7\x02\ +\xe1\x03\x0d\xff\xd7\x02\xe1\x03\x0f\xff\xd7\x02\xe1\x03\x11\xff\ +\xd7\x02\xe1\x03\x12\xff\xec\x02\xe1\x03\x17\xff\xec\x02\xe1\x03\ +\x1b\xff\xd7\x02\xe1\x03\x1c\xff\xec\x02\xe2\x00\x05\xff\xec\x02\ +\xe2\x00\x0a\xff\xec\x02\xe2\x01\xd0\xff\xd7\x02\xe2\x01\xdc\xff\ +\xec\x02\xe2\x01\xdd\xff\xec\x02\xe2\x01\xdf\xff\xd7\x02\xe2\x01\ +\xe1\xff\xec\x02\xe2\x01\xe4\xff\xec\x02\xe2\x01\xf6\xff\xec\x02\ +\xe2\x02\x07\xff\xec\x02\xe2\x02\x0b\xff\xec\x02\xe2\x02\xa0\xff\ +\xd7\x02\xe2\x02\xaa\xff\xec\x02\xe2\x02\xb6\xff\xec\x02\xe2\x02\ +\xbc\xff\xd7\x02\xe2\x02\xbe\xff\xec\x02\xe2\x02\xc0\xff\xec\x02\ +\xe2\x02\xc2\xff\xec\x02\xe2\x02\xcb\xff\xd7\x02\xe2\x02\xd5\xff\ +\xec\x02\xe2\x02\xe6\xff\xd7\x02\xe2\x02\xf8\xff\xec\x02\xe2\x02\ +\xfa\xff\xec\x02\xe2\x02\xfc\xff\xec\x02\xe2\x02\xfe\xff\xec\x02\ +\xe2\x03\x06\xff\xd7\x02\xe2\x03\x08\xff\xd7\x02\xe2\x03\x0e\xff\ +\xec\x02\xe2\x03\x10\xff\xec\x02\xe2\x03\x18\xff\xec\x02\xe3\x00\ +\x0f\xff\xae\x02\xe3\x00\x11\xff\xae\x02\xe3\x01\x9d\xff\xec\x02\ +\xe3\x01\xa4\xff\xd7\x02\xe3\x01\xa6\xff\xec\x02\xe3\x01\xa8\xff\ +\xd7\x02\xe3\x01\xaa\xff\xd7\x02\xe3\x01\xae\xff\xd7\x02\xe3\x01\ +\xb0\xff\xd7\x02\xe3\x01\xb1\xff\xec\x02\xe3\x01\xb5\xff\xd7\x02\ +\xe3\x01\xbc\xff\xc3\x02\xe3\x01\xbd\xff\xd7\x02\xe3\x01\xbf\xff\ +\xd7\x02\xe3\x01\xc1\xff\xd7\x02\xe3\x01\xc4\xff\xec\x02\xe3\x01\ +\xc7\xff\xec\x02\xe3\x01\xce\xff\xec\x02\xe3\x01\xd5\xff\xec\x02\ +\xe3\x01\xf2\xff\xec\x02\xe3\x02\x08\xff\xae\x02\xe3\x02\x0c\xff\ +\xae\x02\xe3\x02r\xff\xd7\x02\xe3\x02s\xff\xec\x02\xe3\x02\ +z\xff\xec\x02\xe3\x02|\xff\xd7\x02\xe3\x02\x80\xff\xec\x02\ +\xe3\x02\x82\xff\xec\x02\xe3\x02\x9f\xff\xd7\x02\xe3\x02\xa1\xff\ +\xec\x02\xe3\x02\xa9\xff\xec\x02\xe3\x02\xb5\xff\xc3\x02\xe3\x02\ +\xb7\xff\xec\x02\xe3\x02\xb9\xff\xec\x02\xe3\x02\xbb\xff\xd7\x02\ +\xe3\x02\xbd\xff\xec\x02\xe3\x02\xbf\xff\xd7\x02\xe3\x02\xc1\xff\ +\xd7\x02\xe3\x02\xca\xff\xd7\x02\xe3\x02\xce\xff\xd7\x02\xe3\x02\ +\xcf\xff\xec\x02\xe3\x02\xd4\xff\xd7\x02\xe3\x02\xd9\xff\xd7\x02\ +\xe3\x02\xdb\xff\xd7\x02\xe3\x02\xdd\xff\xd7\x02\xe3\x02\xe5\xff\ +\xd7\x02\xe3\x02\xe7\xff\xec\x02\xe3\x02\xf5\xff\xec\x02\xe3\x02\ +\xf7\xff\xd7\x02\xe3\x02\xf9\xff\xd7\x02\xe3\x02\xfb\xff\xd7\x02\ +\xe3\x02\xfd\xff\xd7\x02\xe3\x03\x05\xff\xd7\x02\xe3\x03\x07\xff\ +\xd7\x02\xe3\x03\x0d\xff\xd7\x02\xe3\x03\x0f\xff\xd7\x02\xe3\x03\ +\x11\xff\xd7\x02\xe3\x03\x12\xff\xec\x02\xe3\x03\x17\xff\xec\x02\ +\xe3\x03\x1b\xff\xd7\x02\xe3\x03\x1c\xff\xec\x02\xe4\x00\x05\xff\ +\xec\x02\xe4\x00\x0a\xff\xec\x02\xe4\x01\xd0\xff\xd7\x02\xe4\x01\ +\xdc\xff\xec\x02\xe4\x01\xdd\xff\xec\x02\xe4\x01\xdf\xff\xd7\x02\ +\xe4\x01\xe1\xff\xec\x02\xe4\x01\xe4\xff\xec\x02\xe4\x01\xf6\xff\ +\xec\x02\xe4\x02\x07\xff\xec\x02\xe4\x02\x0b\xff\xec\x02\xe4\x02\ +\xa0\xff\xd7\x02\xe4\x02\xaa\xff\xec\x02\xe4\x02\xb6\xff\xec\x02\ +\xe4\x02\xbc\xff\xd7\x02\xe4\x02\xbe\xff\xec\x02\xe4\x02\xc0\xff\ +\xec\x02\xe4\x02\xc2\xff\xec\x02\xe4\x02\xcb\xff\xd7\x02\xe4\x02\ +\xd5\xff\xec\x02\xe4\x02\xe6\xff\xd7\x02\xe4\x02\xf8\xff\xec\x02\ +\xe4\x02\xfa\xff\xec\x02\xe4\x02\xfc\xff\xec\x02\xe4\x02\xfe\xff\ +\xec\x02\xe4\x03\x06\xff\xd7\x02\xe4\x03\x08\xff\xd7\x02\xe4\x03\ +\x0e\xff\xec\x02\xe4\x03\x10\xff\xec\x02\xe4\x03\x18\xff\xec\x02\ +\xe5\x01\x9f\xff\xd7\x02\xe5\x01\xb8\xff\xd7\x02\xe5\x01\xbb\xff\ +\xd7\x02\xe5\x01\xbe\xff\xd7\x02\xe5\x01\xc1\xff\xd7\x02\xe5\x01\ +\xe1\xff\xd7\x02\xe5\x02l\xff\xd7\x02\xe5\x02|\xff\xd7\x02\ +\xe5\x02~\xff\xd7\x02\xe5\x02\x84\xff\xd7\x02\xe5\x02\x86\xff\ +\xd7\x02\xe5\x02\x88\xff\xd7\x02\xe5\x02\x8a\xff\xd7\x02\xe5\x02\ +\x8c\xff\xd7\x02\xe5\x02\xb1\xff\xd7\x02\xe5\x02\xb3\xff\xd7\x02\ +\xe5\x02\xbf\xff\xd7\x02\xe5\x02\xc0\xff\xd7\x02\xe5\x02\xc1\xff\ +\xd7\x02\xe5\x02\xc2\xff\xd7\x02\xe5\x02\xc5\xff\x9a\x02\xe5\x02\ +\xc7\xff\x9a\x02\xe5\x02\xd4\xff\xd7\x02\xe5\x02\xd5\xff\xd7\x02\ +\xe5\x02\xef\xff\xd7\x02\xe5\x02\xf1\xff\xd7\x02\xe5\x02\xf3\xff\ +\xd7\x02\xe5\x02\xfd\xff\xd7\x02\xe5\x02\xfe\xff\xd7\x02\xe5\x03\ +\x09\xff\xd7\x02\xe5\x03\x0b\xff\xd7\x02\xe5\x03\x0e\xff\xd7\x02\ +\xe5\x03\x10\xff\xd7\x02\xe5\x03\x15\xff\xd7\x02\xe5\x03\x19\xff\ +\xec\x02\xe6\x01\xcf\xff\xd7\x02\xe6\x01\xd8\xff\xd7\x02\xe6\x01\ +\xdb\xff\xd7\x02\xe6\x01\xde\xff\xd7\x02\xe6\x01\xe1\xff\xd7\x02\ +\xe6\x01\xea\xff\xd7\x02\xe6\x01\xed\xff\xd7\x02\xe6\x02j\xff\ +\xd7\x02\xe6\x02\x7f\xff\xd7\x02\xe6\x02\x85\xff\xd7\x02\xe6\x02\ +\x87\xff\xd7\x02\xe6\x02\x89\xff\xd7\x02\xe6\x02\x8d\xff\xd7\x02\ +\xe6\x02\xb2\xff\xd7\x02\xe6\x02\xb4\xff\xd7\x02\xe6\x02\xc0\xff\ +\xd7\x02\xe6\x02\xc2\xff\xd7\x02\xe6\x02\xc6\xff\xd7\x02\xe6\x02\ +\xc8\xff\xd7\x02\xe6\x02\xd5\xff\xd7\x02\xe6\x02\xe0\xff\xd7\x02\ +\xe6\x02\xf0\xff\xd7\x02\xe6\x02\xf2\xff\xd7\x02\xe6\x02\xf4\xff\ +\xd7\x02\xe6\x02\xfe\xff\xd7\x02\xe6\x03\x0a\xff\xd7\x02\xe6\x03\ +\x0c\xff\xd7\x02\xe6\x03\x16\xff\xd7\x02\xe6\x03\x1a\xff\xd7\x02\ +\xe7\x00\x0f\xff\xae\x02\xe7\x00\x11\xff\xae\x02\xe7\x02\x08\xff\ +\xae\x02\xe7\x02\x0c\xff\xae\x02\xe7\x02\x80\xff\xec\x02\xe7\x02\ +\x82\xff\xec\x02\xe7\x02\xb7\xff\xec\x02\xe7\x02\xb9\xff\xec\x02\ +\xe7\x03\x0d\xff\xd7\x02\xe7\x03\x0f\xff\xd7\x02\xe8\x01\xe9\x00\ +)\x02\xe9\x00\x05\xff\xec\x02\xe9\x00\x0a\xff\xec\x02\xe9\x02\ +\x07\xff\xec\x02\xe9\x02\x0b\xff\xec\x02\xe9\x03\x0e\xff\xd7\x02\ +\xe9\x03\x10\xff\xd7\x02\xef\x00\x0f\xff\xae\x02\xef\x00\x11\xff\ +\xae\x02\xef\x01\x9d\xff\xec\x02\xef\x01\xa4\xff\xd7\x02\xef\x01\ +\xa6\xff\xec\x02\xef\x01\xa8\xff\xd7\x02\xef\x01\xaa\xff\xd7\x02\ +\xef\x01\xae\xff\xd7\x02\xef\x01\xb0\xff\xd7\x02\xef\x01\xb1\xff\ +\xec\x02\xef\x01\xb5\xff\xd7\x02\xef\x01\xbc\xff\xc3\x02\xef\x01\ +\xbd\xff\xd7\x02\xef\x01\xbf\xff\xd7\x02\xef\x01\xc1\xff\xd7\x02\ +\xef\x01\xc4\xff\xec\x02\xef\x01\xc7\xff\xec\x02\xef\x01\xce\xff\ +\xec\x02\xef\x01\xd5\xff\xec\x02\xef\x01\xf2\xff\xec\x02\xef\x02\ +\x08\xff\xae\x02\xef\x02\x0c\xff\xae\x02\xef\x02r\xff\xd7\x02\ +\xef\x02s\xff\xec\x02\xef\x02z\xff\xec\x02\xef\x02|\xff\ +\xd7\x02\xef\x02\x80\xff\xec\x02\xef\x02\x82\xff\xec\x02\xef\x02\ +\x9f\xff\xd7\x02\xef\x02\xa1\xff\xec\x02\xef\x02\xa9\xff\xec\x02\ +\xef\x02\xb5\xff\xc3\x02\xef\x02\xb7\xff\xec\x02\xef\x02\xb9\xff\ +\xec\x02\xef\x02\xbb\xff\xd7\x02\xef\x02\xbd\xff\xec\x02\xef\x02\ +\xbf\xff\xd7\x02\xef\x02\xc1\xff\xd7\x02\xef\x02\xca\xff\xd7\x02\ +\xef\x02\xce\xff\xd7\x02\xef\x02\xcf\xff\xec\x02\xef\x02\xd4\xff\ +\xd7\x02\xef\x02\xd9\xff\xd7\x02\xef\x02\xdb\xff\xd7\x02\xef\x02\ +\xdd\xff\xd7\x02\xef\x02\xe5\xff\xd7\x02\xef\x02\xe7\xff\xec\x02\ +\xef\x02\xf5\xff\xec\x02\xef\x02\xf7\xff\xd7\x02\xef\x02\xf9\xff\ +\xd7\x02\xef\x02\xfb\xff\xd7\x02\xef\x02\xfd\xff\xd7\x02\xef\x03\ +\x05\xff\xd7\x02\xef\x03\x07\xff\xd7\x02\xef\x03\x0d\xff\xd7\x02\ +\xef\x03\x0f\xff\xd7\x02\xef\x03\x11\xff\xd7\x02\xef\x03\x12\xff\ +\xec\x02\xef\x03\x17\xff\xec\x02\xef\x03\x1b\xff\xd7\x02\xef\x03\ +\x1c\xff\xec\x02\xf0\x00\x05\xff\xec\x02\xf0\x00\x0a\xff\xec\x02\ +\xf0\x01\xd0\xff\xd7\x02\xf0\x01\xdc\xff\xec\x02\xf0\x01\xdd\xff\ +\xec\x02\xf0\x01\xdf\xff\xd7\x02\xf0\x01\xe1\xff\xec\x02\xf0\x01\ +\xe4\xff\xec\x02\xf0\x01\xf6\xff\xec\x02\xf0\x02\x07\xff\xec\x02\ +\xf0\x02\x0b\xff\xec\x02\xf0\x02\xa0\xff\xd7\x02\xf0\x02\xaa\xff\ +\xec\x02\xf0\x02\xb6\xff\xec\x02\xf0\x02\xbc\xff\xd7\x02\xf0\x02\ +\xbe\xff\xec\x02\xf0\x02\xc0\xff\xec\x02\xf0\x02\xc2\xff\xec\x02\ +\xf0\x02\xcb\xff\xd7\x02\xf0\x02\xd5\xff\xec\x02\xf0\x02\xe6\xff\ +\xd7\x02\xf0\x02\xf8\xff\xec\x02\xf0\x02\xfa\xff\xec\x02\xf0\x02\ +\xfc\xff\xec\x02\xf0\x02\xfe\xff\xec\x02\xf0\x03\x06\xff\xd7\x02\ +\xf0\x03\x08\xff\xd7\x02\xf0\x03\x0e\xff\xec\x02\xf0\x03\x10\xff\ +\xec\x02\xf0\x03\x18\xff\xec\x02\xf1\x00\x0f\xff\xae\x02\xf1\x00\ +\x11\xff\xae\x02\xf1\x01\x9d\xff\xec\x02\xf1\x01\xa4\xff\xd7\x02\ +\xf1\x01\xa6\xff\xec\x02\xf1\x01\xa8\xff\xd7\x02\xf1\x01\xaa\xff\ +\xd7\x02\xf1\x01\xae\xff\xd7\x02\xf1\x01\xb0\xff\xd7\x02\xf1\x01\ +\xb1\xff\xec\x02\xf1\x01\xb5\xff\xd7\x02\xf1\x01\xbc\xff\xc3\x02\ +\xf1\x01\xbd\xff\xd7\x02\xf1\x01\xbf\xff\xd7\x02\xf1\x01\xc1\xff\ +\xd7\x02\xf1\x01\xc4\xff\xec\x02\xf1\x01\xc7\xff\xec\x02\xf1\x01\ +\xce\xff\xec\x02\xf1\x01\xd5\xff\xec\x02\xf1\x01\xf2\xff\xec\x02\ +\xf1\x02\x08\xff\xae\x02\xf1\x02\x0c\xff\xae\x02\xf1\x02r\xff\ +\xd7\x02\xf1\x02s\xff\xec\x02\xf1\x02z\xff\xec\x02\xf1\x02\ +|\xff\xd7\x02\xf1\x02\x80\xff\xec\x02\xf1\x02\x82\xff\xec\x02\ +\xf1\x02\x9f\xff\xd7\x02\xf1\x02\xa1\xff\xec\x02\xf1\x02\xa9\xff\ +\xec\x02\xf1\x02\xb5\xff\xc3\x02\xf1\x02\xb7\xff\xec\x02\xf1\x02\ +\xb9\xff\xec\x02\xf1\x02\xbb\xff\xd7\x02\xf1\x02\xbd\xff\xec\x02\ +\xf1\x02\xbf\xff\xd7\x02\xf1\x02\xc1\xff\xd7\x02\xf1\x02\xca\xff\ +\xd7\x02\xf1\x02\xce\xff\xd7\x02\xf1\x02\xcf\xff\xec\x02\xf1\x02\ +\xd4\xff\xd7\x02\xf1\x02\xd9\xff\xd7\x02\xf1\x02\xdb\xff\xd7\x02\ +\xf1\x02\xdd\xff\xd7\x02\xf1\x02\xe5\xff\xd7\x02\xf1\x02\xe7\xff\ +\xec\x02\xf1\x02\xf5\xff\xec\x02\xf1\x02\xf7\xff\xd7\x02\xf1\x02\ +\xf9\xff\xd7\x02\xf1\x02\xfb\xff\xd7\x02\xf1\x02\xfd\xff\xd7\x02\ +\xf1\x03\x05\xff\xd7\x02\xf1\x03\x07\xff\xd7\x02\xf1\x03\x0d\xff\ +\xd7\x02\xf1\x03\x0f\xff\xd7\x02\xf1\x03\x11\xff\xd7\x02\xf1\x03\ +\x12\xff\xec\x02\xf1\x03\x17\xff\xec\x02\xf1\x03\x1b\xff\xd7\x02\ +\xf1\x03\x1c\xff\xec\x02\xf2\x00\x05\xff\xec\x02\xf2\x00\x0a\xff\ +\xec\x02\xf2\x01\xd0\xff\xd7\x02\xf2\x01\xdc\xff\xec\x02\xf2\x01\ +\xdd\xff\xec\x02\xf2\x01\xdf\xff\xd7\x02\xf2\x01\xe1\xff\xec\x02\ +\xf2\x01\xe4\xff\xec\x02\xf2\x01\xf6\xff\xec\x02\xf2\x02\x07\xff\ +\xec\x02\xf2\x02\x0b\xff\xec\x02\xf2\x02\xa0\xff\xd7\x02\xf2\x02\ +\xaa\xff\xec\x02\xf2\x02\xb6\xff\xec\x02\xf2\x02\xbc\xff\xd7\x02\ +\xf2\x02\xbe\xff\xec\x02\xf2\x02\xc0\xff\xec\x02\xf2\x02\xc2\xff\ +\xec\x02\xf2\x02\xcb\xff\xd7\x02\xf2\x02\xd5\xff\xec\x02\xf2\x02\ +\xe6\xff\xd7\x02\xf2\x02\xf8\xff\xec\x02\xf2\x02\xfa\xff\xec\x02\ +\xf2\x02\xfc\xff\xec\x02\xf2\x02\xfe\xff\xec\x02\xf2\x03\x06\xff\ +\xd7\x02\xf2\x03\x08\xff\xd7\x02\xf2\x03\x0e\xff\xec\x02\xf2\x03\ +\x10\xff\xec\x02\xf2\x03\x18\xff\xec\x02\xf3\x00\x0f\xff\xae\x02\ +\xf3\x00\x11\xff\xae\x02\xf3\x01\x9d\xff\xec\x02\xf3\x01\xa4\xff\ +\xd7\x02\xf3\x01\xa6\xff\xec\x02\xf3\x01\xa8\xff\xd7\x02\xf3\x01\ +\xaa\xff\xd7\x02\xf3\x01\xae\xff\xd7\x02\xf3\x01\xb0\xff\xd7\x02\ +\xf3\x01\xb1\xff\xec\x02\xf3\x01\xb5\xff\xd7\x02\xf3\x01\xbc\xff\ +\xc3\x02\xf3\x01\xbd\xff\xd7\x02\xf3\x01\xbf\xff\xd7\x02\xf3\x01\ +\xc1\xff\xd7\x02\xf3\x01\xc4\xff\xec\x02\xf3\x01\xc7\xff\xec\x02\ +\xf3\x01\xce\xff\xec\x02\xf3\x01\xd5\xff\xec\x02\xf3\x01\xf2\xff\ +\xec\x02\xf3\x02\x08\xff\xae\x02\xf3\x02\x0c\xff\xae\x02\xf3\x02\ +r\xff\xd7\x02\xf3\x02s\xff\xec\x02\xf3\x02z\xff\xec\x02\ +\xf3\x02|\xff\xd7\x02\xf3\x02\x80\xff\xec\x02\xf3\x02\x82\xff\ +\xec\x02\xf3\x02\x9f\xff\xd7\x02\xf3\x02\xa1\xff\xec\x02\xf3\x02\ +\xa9\xff\xec\x02\xf3\x02\xb5\xff\xc3\x02\xf3\x02\xb7\xff\xec\x02\ +\xf3\x02\xb9\xff\xec\x02\xf3\x02\xbb\xff\xd7\x02\xf3\x02\xbd\xff\ +\xec\x02\xf3\x02\xbf\xff\xd7\x02\xf3\x02\xc1\xff\xd7\x02\xf3\x02\ +\xca\xff\xd7\x02\xf3\x02\xce\xff\xd7\x02\xf3\x02\xcf\xff\xec\x02\ +\xf3\x02\xd4\xff\xd7\x02\xf3\x02\xd9\xff\xd7\x02\xf3\x02\xdb\xff\ +\xd7\x02\xf3\x02\xdd\xff\xd7\x02\xf3\x02\xe5\xff\xd7\x02\xf3\x02\ +\xe7\xff\xec\x02\xf3\x02\xf5\xff\xec\x02\xf3\x02\xf7\xff\xd7\x02\ +\xf3\x02\xf9\xff\xd7\x02\xf3\x02\xfb\xff\xd7\x02\xf3\x02\xfd\xff\ +\xd7\x02\xf3\x03\x05\xff\xd7\x02\xf3\x03\x07\xff\xd7\x02\xf3\x03\ +\x0d\xff\xd7\x02\xf3\x03\x0f\xff\xd7\x02\xf3\x03\x11\xff\xd7\x02\ +\xf3\x03\x12\xff\xec\x02\xf3\x03\x17\xff\xec\x02\xf3\x03\x1b\xff\ +\xd7\x02\xf3\x03\x1c\xff\xec\x02\xf4\x00\x05\xff\xec\x02\xf4\x00\ +\x0a\xff\xec\x02\xf4\x01\xd0\xff\xd7\x02\xf4\x01\xdc\xff\xec\x02\ +\xf4\x01\xdd\xff\xec\x02\xf4\x01\xdf\xff\xd7\x02\xf4\x01\xe1\xff\ +\xec\x02\xf4\x01\xe4\xff\xec\x02\xf4\x01\xf6\xff\xec\x02\xf4\x02\ +\x07\xff\xec\x02\xf4\x02\x0b\xff\xec\x02\xf4\x02\xa0\xff\xd7\x02\ +\xf4\x02\xaa\xff\xec\x02\xf4\x02\xb6\xff\xec\x02\xf4\x02\xbc\xff\ +\xd7\x02\xf4\x02\xbe\xff\xec\x02\xf4\x02\xc0\xff\xec\x02\xf4\x02\ +\xc2\xff\xec\x02\xf4\x02\xcb\xff\xd7\x02\xf4\x02\xd5\xff\xec\x02\ +\xf4\x02\xe6\xff\xd7\x02\xf4\x02\xf8\xff\xec\x02\xf4\x02\xfa\xff\ +\xec\x02\xf4\x02\xfc\xff\xec\x02\xf4\x02\xfe\xff\xec\x02\xf4\x03\ +\x06\xff\xd7\x02\xf4\x03\x08\xff\xd7\x02\xf4\x03\x0e\xff\xec\x02\ +\xf4\x03\x10\xff\xec\x02\xf4\x03\x18\xff\xec\x02\xf5\x00\x0f\xff\ +\xae\x02\xf5\x00\x11\xff\xae\x02\xf5\x01\x9d\xff\xec\x02\xf5\x01\ +\xa4\xff\xd7\x02\xf5\x01\xa6\xff\xec\x02\xf5\x01\xa8\xff\xd7\x02\ +\xf5\x01\xaa\xff\xd7\x02\xf5\x01\xae\xff\xd7\x02\xf5\x01\xb0\xff\ +\xd7\x02\xf5\x01\xb1\xff\xec\x02\xf5\x01\xb5\xff\xd7\x02\xf5\x01\ +\xbc\xff\xc3\x02\xf5\x01\xbd\xff\xd7\x02\xf5\x01\xbf\xff\xd7\x02\ +\xf5\x01\xc1\xff\xd7\x02\xf5\x01\xc4\xff\xec\x02\xf5\x01\xc7\xff\ +\xec\x02\xf5\x01\xce\xff\xec\x02\xf5\x01\xd5\xff\xec\x02\xf5\x01\ +\xf2\xff\xec\x02\xf5\x02\x08\xff\xae\x02\xf5\x02\x0c\xff\xae\x02\ +\xf5\x02r\xff\xd7\x02\xf5\x02s\xff\xec\x02\xf5\x02z\xff\ +\xec\x02\xf5\x02|\xff\xd7\x02\xf5\x02\x80\xff\xec\x02\xf5\x02\ +\x82\xff\xec\x02\xf5\x02\x9f\xff\xd7\x02\xf5\x02\xa1\xff\xec\x02\ +\xf5\x02\xa9\xff\xec\x02\xf5\x02\xb5\xff\xc3\x02\xf5\x02\xb7\xff\ +\xec\x02\xf5\x02\xb9\xff\xec\x02\xf5\x02\xbb\xff\xd7\x02\xf5\x02\ +\xbd\xff\xec\x02\xf5\x02\xbf\xff\xd7\x02\xf5\x02\xc1\xff\xd7\x02\ +\xf5\x02\xca\xff\xd7\x02\xf5\x02\xce\xff\xd7\x02\xf5\x02\xcf\xff\ +\xec\x02\xf5\x02\xd4\xff\xd7\x02\xf5\x02\xd9\xff\xd7\x02\xf5\x02\ +\xdb\xff\xd7\x02\xf5\x02\xdd\xff\xd7\x02\xf5\x02\xe5\xff\xd7\x02\ +\xf5\x02\xe7\xff\xec\x02\xf5\x02\xf5\xff\xec\x02\xf5\x02\xf7\xff\ +\xd7\x02\xf5\x02\xf9\xff\xd7\x02\xf5\x02\xfb\xff\xd7\x02\xf5\x02\ +\xfd\xff\xd7\x02\xf5\x03\x05\xff\xd7\x02\xf5\x03\x07\xff\xd7\x02\ +\xf5\x03\x0d\xff\xd7\x02\xf5\x03\x0f\xff\xd7\x02\xf5\x03\x11\xff\ +\xd7\x02\xf5\x03\x12\xff\xec\x02\xf5\x03\x17\xff\xec\x02\xf5\x03\ +\x1b\xff\xd7\x02\xf5\x03\x1c\xff\xec\x02\xf6\x00\x05\xff\xec\x02\ +\xf6\x00\x0a\xff\xec\x02\xf6\x01\xd0\xff\xd7\x02\xf6\x01\xdc\xff\ +\xec\x02\xf6\x01\xdd\xff\xec\x02\xf6\x01\xdf\xff\xd7\x02\xf6\x01\ +\xe1\xff\xec\x02\xf6\x01\xe4\xff\xec\x02\xf6\x01\xf6\xff\xec\x02\ +\xf6\x02\x07\xff\xec\x02\xf6\x02\x0b\xff\xec\x02\xf6\x02\xa0\xff\ +\xd7\x02\xf6\x02\xaa\xff\xec\x02\xf6\x02\xb6\xff\xec\x02\xf6\x02\ +\xbc\xff\xd7\x02\xf6\x02\xbe\xff\xec\x02\xf6\x02\xc0\xff\xec\x02\ +\xf6\x02\xc2\xff\xec\x02\xf6\x02\xcb\xff\xd7\x02\xf6\x02\xd5\xff\ +\xec\x02\xf6\x02\xe6\xff\xd7\x02\xf6\x02\xf8\xff\xec\x02\xf6\x02\ +\xfa\xff\xec\x02\xf6\x02\xfc\xff\xec\x02\xf6\x02\xfe\xff\xec\x02\ +\xf6\x03\x06\xff\xd7\x02\xf6\x03\x08\xff\xd7\x02\xf6\x03\x0e\xff\ +\xec\x02\xf6\x03\x10\xff\xec\x02\xf6\x03\x18\xff\xec\x02\xf7\x00\ +\x0f\xff\x85\x02\xf7\x00\x11\xff\x85\x02\xf7\x01\x9f\xff\xec\x02\ +\xf7\x01\xa4\xff\x9a\x02\xf7\x01\xaa\xffq\x02\xf7\x01\xae\xff\ +\x9a\x02\xf7\x01\xb5\xff\x9a\x02\xf7\x01\xb8\xff\xec\x02\xf7\x01\ +\xbb\xff\xec\x02\xf7\x01\xbe\xff\xc3\x02\xf7\x01\xc9\xff\xec\x02\ +\xf7\x01\xce\xff\xae\x02\xf7\x01\xcf\xff\xd7\x02\xf7\x01\xd5\xff\ +\xae\x02\xf7\x01\xd8\xff\xd7\x02\xf7\x01\xdb\xff\xd7\x02\xf7\x01\ +\xde\xff\xd7\x02\xf7\x01\xe1\xff\xd7\x02\xf7\x01\xea\xff\xd7\x02\ +\xf7\x01\xeb\x00f\x02\xf7\x01\xed\xff\xd7\x02\xf7\x01\xee\xff\ +\xec\x02\xf7\x01\xf2\xff\xae\x02\xf7\x01\xf4\x00f\x02\xf7\x02\ +\x08\xff\x85\x02\xf7\x02\x0c\xff\x85\x02\xf7\x02j\xff\xd7\x02\ +\xf7\x02l\xff\xec\x02\xf7\x02r\xffq\x02\xf7\x02s\xff\ +\xae\x02\xf7\x02~\xff\xec\x02\xf7\x02\x7f\xff\xd7\x02\xf7\x02\ +\x84\xff\xec\x02\xf7\x02\x85\xff\xd7\x02\xf7\x02\x86\xff\xec\x02\ +\xf7\x02\x87\xff\xd7\x02\xf7\x02\x88\xff\xec\x02\xf7\x02\x89\xff\ +\xd7\x02\xf7\x02\x8a\xff\xec\x02\xf7\x02\x8c\xff\xec\x02\xf7\x02\ +\x8d\xff\xd7\x02\xf7\x02\x98\x00f\x02\xf7\x02\xa8\x00f\x02\ +\xf7\x02\xb1\xff\xec\x02\xf7\x02\xb2\xff\xd7\x02\xf7\x02\xb3\xff\ +\xec\x02\xf7\x02\xb4\xff\xd7\x02\xf7\x02\xc0\xff\xd7\x02\xf7\x02\ +\xc2\xff\xd7\x02\xf7\x02\xc5\xff\xd7\x02\xf7\x02\xc6\xff\xc3\x02\ +\xf7\x02\xc7\xff\xd7\x02\xf7\x02\xc8\xff\xc3\x02\xf7\x02\xce\xff\ +\x9a\x02\xf7\x02\xcf\xff\xae\x02\xf7\x02\xd5\xff\xd7\x02\xf7\x02\ +\xd9\xffq\x02\xf7\x02\xdb\xffq\x02\xf7\x02\xdd\xffq\x02\ +\xf7\x02\xe0\xff\xd7\x02\xf7\x02\xef\xff\xec\x02\xf7\x02\xf0\xff\ +\xd7\x02\xf7\x02\xf1\xff\xec\x02\xf7\x02\xf2\xff\xd7\x02\xf7\x02\ +\xf3\xff\xec\x02\xf7\x02\xf4\xff\xd7\x02\xf7\x02\xfe\xff\xd7\x02\ +\xf7\x03\x09\xffq\x02\xf7\x03\x0a\xff\xd7\x02\xf7\x03\x0b\xff\ +q\x02\xf7\x03\x0c\xff\xd7\x02\xf7\x03\x11\xff\x9a\x02\xf7\x03\ +\x12\xff\xae\x02\xf7\x03\x15\xff\xec\x02\xf7\x03\x16\xff\xd7\x02\ +\xf7\x03\x1a\xff\xd7\x02\xf7\x03\x1b\xff\x9a\x02\xf7\x03\x1c\xff\ +\xae\x02\xf8\x00\x0f\xff\xae\x02\xf8\x00\x11\xff\xae\x02\xf8\x01\ +\xce\xff\xd7\x02\xf8\x01\xd5\xff\xd7\x02\xf8\x01\xf2\xff\xd7\x02\ +\xf8\x02\x08\xff\xae\x02\xf8\x02\x0c\xff\xae\x02\xf8\x02s\xff\ +\xd7\x02\xf8\x02\xcf\xff\xd7\x02\xf8\x03\x12\xff\xd7\x02\xf8\x03\ +\x1c\xff\xd7\x02\xf9\x00\x0f\xff\x85\x02\xf9\x00\x11\xff\x85\x02\ +\xf9\x01\x9f\xff\xec\x02\xf9\x01\xa4\xff\x9a\x02\xf9\x01\xaa\xff\ +q\x02\xf9\x01\xae\xff\x9a\x02\xf9\x01\xb5\xff\x9a\x02\xf9\x01\ +\xb8\xff\xec\x02\xf9\x01\xbb\xff\xec\x02\xf9\x01\xbe\xff\xc3\x02\ +\xf9\x01\xc9\xff\xec\x02\xf9\x01\xce\xff\xae\x02\xf9\x01\xcf\xff\ +\xd7\x02\xf9\x01\xd5\xff\xae\x02\xf9\x01\xd8\xff\xd7\x02\xf9\x01\ +\xdb\xff\xd7\x02\xf9\x01\xde\xff\xd7\x02\xf9\x01\xe1\xff\xd7\x02\ +\xf9\x01\xea\xff\xd7\x02\xf9\x01\xeb\x00f\x02\xf9\x01\xed\xff\ +\xd7\x02\xf9\x01\xee\xff\xec\x02\xf9\x01\xf2\xff\xae\x02\xf9\x01\ +\xf4\x00f\x02\xf9\x02\x08\xff\x85\x02\xf9\x02\x0c\xff\x85\x02\ +\xf9\x02j\xff\xd7\x02\xf9\x02l\xff\xec\x02\xf9\x02r\xff\ +q\x02\xf9\x02s\xff\xae\x02\xf9\x02~\xff\xec\x02\xf9\x02\ +\x7f\xff\xd7\x02\xf9\x02\x84\xff\xec\x02\xf9\x02\x85\xff\xd7\x02\ +\xf9\x02\x86\xff\xec\x02\xf9\x02\x87\xff\xd7\x02\xf9\x02\x88\xff\ +\xec\x02\xf9\x02\x89\xff\xd7\x02\xf9\x02\x8a\xff\xec\x02\xf9\x02\ +\x8c\xff\xec\x02\xf9\x02\x8d\xff\xd7\x02\xf9\x02\x98\x00f\x02\ +\xf9\x02\xa8\x00f\x02\xf9\x02\xb1\xff\xec\x02\xf9\x02\xb2\xff\ +\xd7\x02\xf9\x02\xb3\xff\xec\x02\xf9\x02\xb4\xff\xd7\x02\xf9\x02\ +\xc0\xff\xd7\x02\xf9\x02\xc2\xff\xd7\x02\xf9\x02\xc5\xff\xd7\x02\ +\xf9\x02\xc6\xff\xc3\x02\xf9\x02\xc7\xff\xd7\x02\xf9\x02\xc8\xff\ +\xc3\x02\xf9\x02\xce\xff\x9a\x02\xf9\x02\xcf\xff\xae\x02\xf9\x02\ +\xd5\xff\xd7\x02\xf9\x02\xd9\xffq\x02\xf9\x02\xdb\xffq\x02\ +\xf9\x02\xdd\xffq\x02\xf9\x02\xe0\xff\xd7\x02\xf9\x02\xef\xff\ +\xec\x02\xf9\x02\xf0\xff\xd7\x02\xf9\x02\xf1\xff\xec\x02\xf9\x02\ +\xf2\xff\xd7\x02\xf9\x02\xf3\xff\xec\x02\xf9\x02\xf4\xff\xd7\x02\ +\xf9\x02\xfe\xff\xd7\x02\xf9\x03\x09\xffq\x02\xf9\x03\x0a\xff\ +\xd7\x02\xf9\x03\x0b\xffq\x02\xf9\x03\x0c\xff\xd7\x02\xf9\x03\ +\x11\xff\x9a\x02\xf9\x03\x12\xff\xae\x02\xf9\x03\x15\xff\xec\x02\ +\xf9\x03\x16\xff\xd7\x02\xf9\x03\x1a\xff\xd7\x02\xf9\x03\x1b\xff\ +\x9a\x02\xf9\x03\x1c\xff\xae\x02\xfa\x00\x0f\xff\xae\x02\xfa\x00\ +\x11\xff\xae\x02\xfa\x01\xce\xff\xd7\x02\xfa\x01\xd5\xff\xd7\x02\ +\xfa\x01\xf2\xff\xd7\x02\xfa\x02\x08\xff\xae\x02\xfa\x02\x0c\xff\ +\xae\x02\xfa\x02s\xff\xd7\x02\xfa\x02\xcf\xff\xd7\x02\xfa\x03\ +\x12\xff\xd7\x02\xfa\x03\x1c\xff\xd7\x02\xfb\x00\x0f\xff\x85\x02\ +\xfb\x00\x11\xff\x85\x02\xfb\x01\x9f\xff\xec\x02\xfb\x01\xa4\xff\ +\x9a\x02\xfb\x01\xaa\xffq\x02\xfb\x01\xae\xff\x9a\x02\xfb\x01\ +\xb5\xff\x9a\x02\xfb\x01\xb8\xff\xec\x02\xfb\x01\xbb\xff\xec\x02\ +\xfb\x01\xbe\xff\xc3\x02\xfb\x01\xc9\xff\xec\x02\xfb\x01\xce\xff\ +\xae\x02\xfb\x01\xcf\xff\xd7\x02\xfb\x01\xd5\xff\xae\x02\xfb\x01\ +\xd8\xff\xd7\x02\xfb\x01\xdb\xff\xd7\x02\xfb\x01\xde\xff\xd7\x02\ +\xfb\x01\xe1\xff\xd7\x02\xfb\x01\xea\xff\xd7\x02\xfb\x01\xeb\x00\ +f\x02\xfb\x01\xed\xff\xd7\x02\xfb\x01\xee\xff\xec\x02\xfb\x01\ +\xf2\xff\xae\x02\xfb\x01\xf4\x00f\x02\xfb\x02\x08\xff\x85\x02\ +\xfb\x02\x0c\xff\x85\x02\xfb\x02j\xff\xd7\x02\xfb\x02l\xff\ +\xec\x02\xfb\x02r\xffq\x02\xfb\x02s\xff\xae\x02\xfb\x02\ +~\xff\xec\x02\xfb\x02\x7f\xff\xd7\x02\xfb\x02\x84\xff\xec\x02\ +\xfb\x02\x85\xff\xd7\x02\xfb\x02\x86\xff\xec\x02\xfb\x02\x87\xff\ +\xd7\x02\xfb\x02\x88\xff\xec\x02\xfb\x02\x89\xff\xd7\x02\xfb\x02\ +\x8a\xff\xec\x02\xfb\x02\x8c\xff\xec\x02\xfb\x02\x8d\xff\xd7\x02\ +\xfb\x02\x98\x00f\x02\xfb\x02\xa8\x00f\x02\xfb\x02\xb1\xff\ +\xec\x02\xfb\x02\xb2\xff\xd7\x02\xfb\x02\xb3\xff\xec\x02\xfb\x02\ +\xb4\xff\xd7\x02\xfb\x02\xc0\xff\xd7\x02\xfb\x02\xc2\xff\xd7\x02\ +\xfb\x02\xc5\xff\xd7\x02\xfb\x02\xc6\xff\xc3\x02\xfb\x02\xc7\xff\ +\xd7\x02\xfb\x02\xc8\xff\xc3\x02\xfb\x02\xce\xff\x9a\x02\xfb\x02\ +\xcf\xff\xae\x02\xfb\x02\xd5\xff\xd7\x02\xfb\x02\xd9\xffq\x02\ +\xfb\x02\xdb\xffq\x02\xfb\x02\xdd\xffq\x02\xfb\x02\xe0\xff\ +\xd7\x02\xfb\x02\xef\xff\xec\x02\xfb\x02\xf0\xff\xd7\x02\xfb\x02\ +\xf1\xff\xec\x02\xfb\x02\xf2\xff\xd7\x02\xfb\x02\xf3\xff\xec\x02\ +\xfb\x02\xf4\xff\xd7\x02\xfb\x02\xfe\xff\xd7\x02\xfb\x03\x09\xff\ +q\x02\xfb\x03\x0a\xff\xd7\x02\xfb\x03\x0b\xffq\x02\xfb\x03\ +\x0c\xff\xd7\x02\xfb\x03\x11\xff\x9a\x02\xfb\x03\x12\xff\xae\x02\ +\xfb\x03\x15\xff\xec\x02\xfb\x03\x16\xff\xd7\x02\xfb\x03\x1a\xff\ +\xd7\x02\xfb\x03\x1b\xff\x9a\x02\xfb\x03\x1c\xff\xae\x02\xfc\x00\ +\x0f\xff\xae\x02\xfc\x00\x11\xff\xae\x02\xfc\x01\xce\xff\xd7\x02\ +\xfc\x01\xd5\xff\xd7\x02\xfc\x01\xf2\xff\xd7\x02\xfc\x02\x08\xff\ +\xae\x02\xfc\x02\x0c\xff\xae\x02\xfc\x02s\xff\xd7\x02\xfc\x02\ +\xcf\xff\xd7\x02\xfc\x03\x12\xff\xd7\x02\xfc\x03\x1c\xff\xd7\x02\ +\xff\x00\x0f\xff\x85\x02\xff\x00\x10\xff\xae\x02\xff\x00\x11\xff\ +\x85\x02\xff\x01\x9f\xff\xd7\x02\xff\x01\xa4\xff\x9a\x02\xff\x01\ +\xaa\xffq\x02\xff\x01\xae\xff\x9a\x02\xff\x01\xb5\xff\x9a\x02\ +\xff\x01\xb8\xff\xd7\x02\xff\x01\xbb\xff\xd7\x02\xff\x01\xbc\x00\ +)\x02\xff\x01\xbe\xff\xae\x02\xff\x01\xcc\xff\x9a\x02\xff\x01\ +\xcd\xff\x9a\x02\xff\x01\xce\xff\x85\x02\xff\x01\xcf\xffq\x02\ +\xff\x01\xd0\xff\xd7\x02\xff\x01\xd1\xff\xd7\x02\xff\x01\xd2\xff\ +\x9a\x02\xff\x01\xd3\xff\x9a\x02\xff\x01\xd4\xff\x9a\x02\xff\x01\ +\xd5\xff\x85\x02\xff\x01\xd6\xff\x9a\x02\xff\x01\xd7\xff\x9a\x02\ +\xff\x01\xd8\xffq\x02\xff\x01\xd9\xff\x9a\x02\xff\x01\xda\xff\ +\x9a\x02\xff\x01\xdb\xffq\x02\xff\x01\xdc\xff\xae\x02\xff\x01\ +\xdd\xff\xae\x02\xff\x01\xde\xffq\x02\xff\x01\xdf\xff\xd7\x02\ +\xff\x01\xe0\xff\x9a\x02\xff\x01\xe1\xff\x9a\x02\xff\x01\xe2\xff\ +\x9a\x02\xff\x01\xe3\xff\x9a\x02\xff\x01\xe4\xff\xae\x02\xff\x01\ +\xe5\xff\x9a\x02\xff\x01\xe6\xff\x9a\x02\xff\x01\xe7\xff\xd7\x02\ +\xff\x01\xe8\xff\x9a\x02\xff\x01\xe9\xff\xc3\x02\xff\x01\xea\xff\ +q\x02\xff\x01\xec\xff\x9a\x02\xff\x01\xed\xffq\x02\xff\x01\ +\xee\xff\x85\x02\xff\x01\xf2\xff\x85\x02\xff\x01\xf3\xff\x9a\x02\ +\xff\x01\xf5\xff\x9a\x02\xff\x01\xf6\xff\xae\x02\xff\x01\xf7\xff\ +\x9a\x02\xff\x01\xf9\xff\x9a\x02\xff\x02\x02\xff\xae\x02\xff\x02\ +\x03\xff\xae\x02\xff\x02\x04\xff\xae\x02\xff\x02\x08\xff\x85\x02\ +\xff\x02\x0c\xff\x85\x02\xff\x02j\xffq\x02\xff\x02k\xff\ +\x9a\x02\xff\x02l\xff\xd7\x02\xff\x02m\xff\xd7\x02\xff\x02\ +q\xff\x9a\x02\xff\x02r\xffq\x02\xff\x02s\xff\x85\x02\ +\xff\x02u\xff\x9a\x02\xff\x02w\xff\x9a\x02\xff\x02y\xff\ +\x9a\x02\xff\x02}\xff\x9a\x02\xff\x02~\xff\xd7\x02\xff\x02\ +\x7f\xffq\x02\xff\x02\x81\xff\xd7\x02\xff\x02\x83\xff\xd7\x02\ +\xff\x02\x84\xff\xd7\x02\xff\x02\x85\xffq\x02\xff\x02\x86\xff\ +\xd7\x02\xff\x02\x87\xffq\x02\xff\x02\x88\xff\xd7\x02\xff\x02\ +\x89\xffq\x02\xff\x02\x8a\xff\xd7\x02\xff\x02\x8b\xff\xd7\x02\ +\xff\x02\x8c\xff\xd7\x02\xff\x02\x8d\xffq\x02\xff\x02\x96\xff\ +\x9a\x02\xff\x02\x9a\xff\x9a\x02\xff\x02\x9e\xff\x9a\x02\xff\x02\ +\xa0\xff\xd7\x02\xff\x02\xa2\xff\xd7\x02\xff\x02\xa4\xff\x9a\x02\ +\xff\x02\xa6\xff\x9a\x02\xff\x02\xaa\xff\xae\x02\xff\x02\xac\xff\ +\x9a\x02\xff\x02\xae\xff\x9a\x02\xff\x02\xb0\xff\x9a\x02\xff\x02\ +\xb1\xff\xd7\x02\xff\x02\xb2\xffq\x02\xff\x02\xb3\xff\xd7\x02\ +\xff\x02\xb4\xffq\x02\xff\x02\xb5\x00)\x02\xff\x02\xb6\xff\ +\xae\x02\xff\x02\xb8\xff\xae\x02\xff\x02\xba\xff\xae\x02\xff\x02\ +\xbc\xff\xd7\x02\xff\x02\xbe\xff\xae\x02\xff\x02\xc0\xff\x9a\x02\ +\xff\x02\xc2\xff\x9a\x02\xff\x02\xc4\xff\x9a\x02\xff\x02\xc5\xff\ +\x9a\x02\xff\x02\xc6\xffq\x02\xff\x02\xc7\xff\x9a\x02\xff\x02\ +\xc8\xffq\x02\xff\x02\xcb\xff\xd7\x02\xff\x02\xcd\xff\x9a\x02\ +\xff\x02\xce\xff\x9a\x02\xff\x02\xcf\xff\x85\x02\xff\x02\xd1\xff\ +\x9a\x02\xff\x02\xd3\xff\x9a\x02\xff\x02\xd5\xff\x9a\x02\xff\x02\ +\xd7\xff\x9a\x02\xff\x02\xd9\xffq\x02\xff\x02\xdb\xffq\x02\ +\xff\x02\xdd\xffq\x02\xff\x02\xe0\xffq\x02\xff\x02\xe6\xff\ +\xd7\x02\xff\x02\xe8\xff\xd7\x02\xff\x02\xea\xff\xc3\x02\xff\x02\ +\xec\xff\x9a\x02\xff\x02\xee\xff\x9a\x02\xff\x02\xef\xff\xd7\x02\ +\xff\x02\xf0\xffq\x02\xff\x02\xf1\xff\xd7\x02\xff\x02\xf2\xff\ +q\x02\xff\x02\xf3\xff\xd7\x02\xff\x02\xf4\xffq\x02\xff\x02\ +\xf6\xff\xd7\x02\xff\x02\xf8\xff\xae\x02\xff\x02\xfa\xff\xae\x02\ +\xff\x02\xfc\xff\xae\x02\xff\x02\xfe\xff\x9a\x02\xff\x03\x00\xff\ +\x9a\x02\xff\x03\x02\xff\x9a\x02\xff\x03\x06\xff\xd7\x02\xff\x03\ +\x08\xff\xd7\x02\xff\x03\x09\xffq\x02\xff\x03\x0a\xffq\x02\ +\xff\x03\x0b\xffq\x02\xff\x03\x0c\xffq\x02\xff\x03\x0e\xff\ +\x9a\x02\xff\x03\x10\xff\x9a\x02\xff\x03\x11\xff\x9a\x02\xff\x03\ +\x12\xff\x85\x02\xff\x03\x14\xff\x9a\x02\xff\x03\x15\xff\xd7\x02\ +\xff\x03\x16\xffq\x02\xff\x03\x18\xff\xae\x02\xff\x03\x1a\xff\ +q\x02\xff\x03\x1b\xff\x9a\x02\xff\x03\x1c\xff\x85\x03\x00\x00\ +\x0f\xff\x9a\x03\x00\x00\x10\xff\xd7\x03\x00\x00\x11\xff\x9a\x03\ +\x00\x01\xce\xff\xc3\x03\x00\x01\xcf\xff\xec\x03\x00\x01\xd5\xff\ +\xc3\x03\x00\x01\xd8\xff\xec\x03\x00\x01\xdb\xff\xec\x03\x00\x01\ +\xde\xff\xec\x03\x00\x01\xea\xff\xec\x03\x00\x01\xed\xff\xec\x03\ +\x00\x01\xf2\xff\xc3\x03\x00\x02\x02\xff\xd7\x03\x00\x02\x03\xff\ +\xd7\x03\x00\x02\x04\xff\xd7\x03\x00\x02\x08\xff\x9a\x03\x00\x02\ +\x0c\xff\x9a\x03\x00\x02j\xff\xec\x03\x00\x02s\xff\xc3\x03\ +\x00\x02\x7f\xff\xec\x03\x00\x02\x85\xff\xec\x03\x00\x02\x87\xff\ +\xec\x03\x00\x02\x89\xff\xec\x03\x00\x02\x8d\xff\xec\x03\x00\x02\ +\xb2\xff\xec\x03\x00\x02\xb4\xff\xec\x03\x00\x02\xcf\xff\xc3\x03\ +\x00\x02\xe0\xff\xec\x03\x00\x02\xf0\xff\xec\x03\x00\x02\xf2\xff\ +\xec\x03\x00\x02\xf4\xff\xec\x03\x00\x03\x0a\xff\xec\x03\x00\x03\ +\x0c\xff\xec\x03\x00\x03\x12\xff\xc3\x03\x00\x03\x16\xff\xec\x03\ +\x00\x03\x1a\xff\xec\x03\x00\x03\x1c\xff\xc3\x03\x03\x00\x0f\xff\ +\x9a\x03\x03\x00\x10\xff\xd7\x03\x03\x00\x11\xff\x9a\x03\x03\x01\ +\x9d\x00)\x03\x03\x01\x9f\xff\xd7\x03\x03\x01\xa4\xff\xae\x03\ +\x03\x01\xa6\x00)\x03\x03\x01\xaa\xff\x85\x03\x03\x01\xae\xff\ +\xae\x03\x03\x01\xb5\xff\xae\x03\x03\x01\xb8\xff\xd7\x03\x03\x01\ +\xbb\xff\xd7\x03\x03\x01\xbc\x00)\x03\x03\x01\xbe\xff\xc3\x03\ +\x03\x01\xc4\x00)\x03\x03\x01\xcc\xff\xc3\x03\x03\x01\xcd\xff\ +\xc3\x03\x03\x01\xce\xff\x9a\x03\x03\x01\xcf\xff\xae\x03\x03\x01\ +\xd0\xff\xd7\x03\x03\x01\xd1\xff\xd7\x03\x03\x01\xd2\xff\xc3\x03\ +\x03\x01\xd3\xff\xc3\x03\x03\x01\xd4\xff\xc3\x03\x03\x01\xd5\xff\ +\x9a\x03\x03\x01\xd6\xff\xc3\x03\x03\x01\xd7\xff\xc3\x03\x03\x01\ +\xd8\xff\xae\x03\x03\x01\xd9\xff\xc3\x03\x03\x01\xda\xff\xc3\x03\ +\x03\x01\xdb\xff\xae\x03\x03\x01\xde\xff\xae\x03\x03\x01\xdf\xff\ +\xd7\x03\x03\x01\xe0\xff\xc3\x03\x03\x01\xe1\xff\x9a\x03\x03\x01\ +\xe2\xff\xc3\x03\x03\x01\xe3\xff\xc3\x03\x03\x01\xe5\xff\xc3\x03\ +\x03\x01\xe6\xff\xc3\x03\x03\x01\xe7\xff\xd7\x03\x03\x01\xe8\xff\ +\xc3\x03\x03\x01\xea\xff\xae\x03\x03\x01\xeb\x00)\x03\x03\x01\ +\xec\xff\xc3\x03\x03\x01\xed\xff\xae\x03\x03\x01\xee\xff\xc3\x03\ +\x03\x01\xf2\xff\x9a\x03\x03\x01\xf3\xff\xc3\x03\x03\x01\xf4\x00\ +)\x03\x03\x01\xf5\xff\xc3\x03\x03\x01\xf7\xff\xc3\x03\x03\x01\ +\xf9\xff\xc3\x03\x03\x02\x02\xff\xd7\x03\x03\x02\x03\xff\xd7\x03\ +\x03\x02\x04\xff\xd7\x03\x03\x02\x08\xff\x9a\x03\x03\x02\x0c\xff\ +\x9a\x03\x03\x02j\xff\xae\x03\x03\x02k\xff\xc3\x03\x03\x02\ +l\xff\xd7\x03\x03\x02q\xff\xc3\x03\x03\x02r\xff\x85\x03\ +\x03\x02s\xff\x9a\x03\x03\x02u\xff\xc3\x03\x03\x02w\xff\ +\xd7\x03\x03\x02y\xff\xc3\x03\x03\x02}\xff\xc3\x03\x03\x02\ +~\xff\xd7\x03\x03\x02\x7f\xff\xae\x03\x03\x02\x84\xff\xd7\x03\ +\x03\x02\x85\xff\xae\x03\x03\x02\x86\xff\xd7\x03\x03\x02\x87\xff\ +\xae\x03\x03\x02\x88\xff\xd7\x03\x03\x02\x89\xff\xae\x03\x03\x02\ +\x8a\xff\xd7\x03\x03\x02\x8c\xff\xd7\x03\x03\x02\x8d\xff\xae\x03\ +\x03\x02\x96\xff\xc3\x03\x03\x02\x98\x00)\x03\x03\x02\x9a\xff\ +\xc3\x03\x03\x02\x9e\xff\xc3\x03\x03\x02\xa0\xff\xd7\x03\x03\x02\ +\xa2\xff\xd7\x03\x03\x02\xa4\xff\xc3\x03\x03\x02\xa6\xff\xc3\x03\ +\x03\x02\xa8\x00)\x03\x03\x02\xa9\x00)\x03\x03\x02\xac\xff\ +\xc3\x03\x03\x02\xae\xff\xc3\x03\x03\x02\xb0\xff\xc3\x03\x03\x02\ +\xb1\xff\xd7\x03\x03\x02\xb2\xff\xae\x03\x03\x02\xb3\xff\xd7\x03\ +\x03\x02\xb4\xff\xae\x03\x03\x02\xb5\x00)\x03\x03\x02\xbc\xff\ +\xd7\x03\x03\x02\xbd\x00)\x03\x03\x02\xc0\xff\x9a\x03\x03\x02\ +\xc2\xff\x9a\x03\x03\x02\xc4\xff\xc3\x03\x03\x02\xc5\xff\xd7\x03\ +\x03\x02\xc6\xff\xc3\x03\x03\x02\xc7\xff\xd7\x03\x03\x02\xc8\xff\ +\xc3\x03\x03\x02\xcb\xff\xd7\x03\x03\x02\xcd\xff\xc3\x03\x03\x02\ +\xce\xff\xae\x03\x03\x02\xcf\xff\x9a\x03\x03\x02\xd1\xff\xc3\x03\ +\x03\x02\xd3\xff\xc3\x03\x03\x02\xd5\xff\x9a\x03\x03\x02\xd7\xff\ +\xc3\x03\x03\x02\xd9\xff\x85\x03\x03\x02\xdb\xff\x85\x03\x03\x02\ +\xdd\xff\x85\x03\x03\x02\xe0\xff\xae\x03\x03\x02\xe6\xff\xd7\x03\ +\x03\x02\xe8\xff\xd7\x03\x03\x02\xec\xff\xc3\x03\x03\x02\xee\xff\ +\xc3\x03\x03\x02\xef\xff\xd7\x03\x03\x02\xf0\xff\xae\x03\x03\x02\ +\xf1\xff\xd7\x03\x03\x02\xf2\xff\xae\x03\x03\x02\xf3\xff\xd7\x03\ +\x03\x02\xf4\xff\xae\x03\x03\x02\xf6\xff\xd7\x03\x03\x02\xfe\xff\ +\x9a\x03\x03\x03\x00\xff\xc3\x03\x03\x03\x02\xff\xc3\x03\x03\x03\ +\x06\xff\xd7\x03\x03\x03\x08\xff\xd7\x03\x03\x03\x09\xff\x9a\x03\ +\x03\x03\x0a\xff\xae\x03\x03\x03\x0b\xff\x9a\x03\x03\x03\x0c\xff\ +\xae\x03\x03\x03\x0e\xff\xd7\x03\x03\x03\x10\xff\xd7\x03\x03\x03\ +\x11\xff\xae\x03\x03\x03\x12\xff\x9a\x03\x03\x03\x14\xff\xc3\x03\ +\x03\x03\x15\xff\xd7\x03\x03\x03\x16\xff\xae\x03\x03\x03\x17\x00\ +)\x03\x03\x03\x1a\xff\xae\x03\x03\x03\x1b\xff\xae\x03\x03\x03\ +\x1c\xff\x9a\x03\x04\x00\x0f\xff\xc3\x03\x04\x00\x11\xff\xc3\x03\ +\x04\x01\xce\xff\xc3\x03\x04\x01\xcf\xff\xd7\x03\x04\x01\xd5\xff\ +\xc3\x03\x04\x01\xd8\xff\xd7\x03\x04\x01\xdb\xff\xd7\x03\x04\x01\ +\xde\xff\xd7\x03\x04\x01\xea\xff\xd7\x03\x04\x01\xed\xff\xd7\x03\ +\x04\x01\xf2\xff\xc3\x03\x04\x02\x08\xff\xc3\x03\x04\x02\x0c\xff\ +\xc3\x03\x04\x02j\xff\xd7\x03\x04\x02s\xff\xc3\x03\x04\x02\ +\x7f\xff\xd7\x03\x04\x02\x85\xff\xd7\x03\x04\x02\x87\xff\xd7\x03\ +\x04\x02\x89\xff\xd7\x03\x04\x02\x8d\xff\xd7\x03\x04\x02\xb2\xff\ +\xd7\x03\x04\x02\xb4\xff\xd7\x03\x04\x02\xcf\xff\xc3\x03\x04\x02\ +\xe0\xff\xd7\x03\x04\x02\xf0\xff\xd7\x03\x04\x02\xf2\xff\xd7\x03\ +\x04\x02\xf4\xff\xd7\x03\x04\x03\x0a\xff\xd7\x03\x04\x03\x0c\xff\ +\xd7\x03\x04\x03\x12\xff\xc3\x03\x04\x03\x16\xff\xd7\x03\x04\x03\ +\x1a\xff\xd7\x03\x04\x03\x1c\xff\xc3\x03\x05\x01\x9f\xff\xd7\x03\ +\x05\x01\xa3\x00\xe1\x03\x05\x01\xb8\xff\xd7\x03\x05\x01\xbb\xff\ +\xd7\x03\x05\x01\xbe\xff\xc3\x03\x05\x01\xdc\xff\xd7\x03\x05\x01\ +\xe1\xff\xae\x03\x05\x01\xe4\xff\xd7\x03\x05\x02l\xff\xd7\x03\ +\x05\x02{\x00=\x03\x05\x02}\xff\xec\x03\x05\x02~\xff\ +\xd7\x03\x05\x02\x84\xff\xd7\x03\x05\x02\x86\xff\xd7\x03\x05\x02\ +\x88\xff\xd7\x03\x05\x02\x8a\xff\xd7\x03\x05\x02\x8c\xff\xd7\x03\ +\x05\x02\xaa\xff\xd7\x03\x05\x02\xb1\xff\xd7\x03\x05\x02\xb3\xff\ +\xd7\x03\x05\x02\xb6\xff\xd7\x03\x05\x02\xbe\xff\xd7\x03\x05\x02\ +\xc0\xff\xae\x03\x05\x02\xc2\xff\xae\x03\x05\x02\xc5\xff\xc3\x03\ +\x05\x02\xc6\xff\xd7\x03\x05\x02\xc7\xff\xc3\x03\x05\x02\xc8\xff\ +\xd7\x03\x05\x02\xd5\xff\xae\x03\x05\x02\xef\xff\xd7\x03\x05\x02\ +\xf1\xff\xd7\x03\x05\x02\xf3\xff\xd7\x03\x05\x02\xfe\xff\xae\x03\ +\x05\x03\x0e\xff\xd7\x03\x05\x03\x10\xff\xd7\x03\x05\x03\x15\xff\ +\xd7\x03\x05\x03\x18\xff\xd7\x03\x06\x01\xcf\xff\xec\x03\x06\x01\ +\xd8\xff\xec\x03\x06\x01\xdb\xff\xec\x03\x06\x01\xde\xff\xec\x03\ +\x06\x01\xe1\xff\xec\x03\x06\x01\xea\xff\xec\x03\x06\x01\xed\xff\ +\xec\x03\x06\x02j\xff\xec\x03\x06\x02\x7f\xff\xec\x03\x06\x02\ +\x85\xff\xec\x03\x06\x02\x87\xff\xec\x03\x06\x02\x89\xff\xec\x03\ +\x06\x02\x8d\xff\xec\x03\x06\x02\xb2\xff\xec\x03\x06\x02\xb4\xff\ +\xec\x03\x06\x02\xc0\xff\xec\x03\x06\x02\xc2\xff\xec\x03\x06\x02\ +\xd5\xff\xec\x03\x06\x02\xe0\xff\xec\x03\x06\x02\xf0\xff\xec\x03\ +\x06\x02\xf2\xff\xec\x03\x06\x02\xf4\xff\xec\x03\x06\x02\xfe\xff\ +\xec\x03\x06\x03\x0a\xff\xec\x03\x06\x03\x0c\xff\xec\x03\x06\x03\ +\x0e\xff\xd7\x03\x06\x03\x10\xff\xd7\x03\x06\x03\x16\xff\xec\x03\ +\x06\x03\x1a\xff\xec\x03\x07\x01\x9f\xff\xd7\x03\x07\x01\xb8\xff\ +\xd7\x03\x07\x01\xbb\xff\xd7\x03\x07\x01\xbe\xff\xd7\x03\x07\x01\ +\xc1\xff\xd7\x03\x07\x01\xe1\xff\xd7\x03\x07\x02l\xff\xd7\x03\ +\x07\x02|\xff\xd7\x03\x07\x02~\xff\xd7\x03\x07\x02\x84\xff\ +\xd7\x03\x07\x02\x86\xff\xd7\x03\x07\x02\x88\xff\xd7\x03\x07\x02\ +\x8a\xff\xd7\x03\x07\x02\x8c\xff\xd7\x03\x07\x02\xb1\xff\xd7\x03\ +\x07\x02\xb3\xff\xd7\x03\x07\x02\xbf\xff\xd7\x03\x07\x02\xc0\xff\ +\xd7\x03\x07\x02\xc1\xff\xd7\x03\x07\x02\xc2\xff\xd7\x03\x07\x02\ +\xc5\xff\x9a\x03\x07\x02\xc7\xff\x9a\x03\x07\x02\xd4\xff\xd7\x03\ +\x07\x02\xd5\xff\xd7\x03\x07\x02\xef\xff\xd7\x03\x07\x02\xf1\xff\ +\xd7\x03\x07\x02\xf3\xff\xd7\x03\x07\x02\xfd\xff\xd7\x03\x07\x02\ +\xfe\xff\xd7\x03\x07\x03\x09\xff\xd7\x03\x07\x03\x0b\xff\xd7\x03\ +\x07\x03\x0e\xff\xd7\x03\x07\x03\x10\xff\xd7\x03\x07\x03\x15\xff\ +\xd7\x03\x07\x03\x19\xff\xec\x03\x08\x01\xcf\xff\xec\x03\x08\x01\ +\xd8\xff\xec\x03\x08\x01\xdb\xff\xec\x03\x08\x01\xde\xff\xec\x03\ +\x08\x01\xe1\xff\xec\x03\x08\x01\xea\xff\xec\x03\x08\x01\xed\xff\ +\xec\x03\x08\x02j\xff\xec\x03\x08\x02\x7f\xff\xec\x03\x08\x02\ +\x85\xff\xec\x03\x08\x02\x87\xff\xec\x03\x08\x02\x89\xff\xec\x03\ +\x08\x02\x8d\xff\xec\x03\x08\x02\xb2\xff\xec\x03\x08\x02\xb4\xff\ +\xec\x03\x08\x02\xc0\xff\xec\x03\x08\x02\xc2\xff\xec\x03\x08\x02\ +\xd5\xff\xec\x03\x08\x02\xe0\xff\xec\x03\x08\x02\xf0\xff\xec\x03\ +\x08\x02\xf2\xff\xec\x03\x08\x02\xf4\xff\xec\x03\x08\x02\xfe\xff\ +\xec\x03\x08\x03\x0a\xff\xec\x03\x08\x03\x0c\xff\xec\x03\x08\x03\ +\x0e\xff\xd7\x03\x08\x03\x10\xff\xd7\x03\x08\x03\x16\xff\xec\x03\ +\x08\x03\x1a\xff\xec\x03\x0b\x00\x05\xff\x9a\x03\x0b\x00\x0a\xff\ +\x9a\x03\x0b\x01\x9d\xff\xae\x03\x0b\x01\xa6\xff\xae\x03\x0b\x01\ +\xa8\xff\xc3\x03\x0b\x01\xaa\xff\xc3\x03\x0b\x01\xb0\xff\xc3\x03\ +\x0b\x01\xbc\xffq\x03\x0b\x01\xbd\xff\xc3\x03\x0b\x01\xbf\xff\ +\xc3\x03\x0b\x01\xc1\xff\xc3\x03\x0b\x01\xc4\xff\xae\x03\x0b\x01\ +\xd0\xff\xd7\x03\x0b\x01\xdc\xff\xc3\x03\x0b\x01\xdf\xff\xd7\x03\ +\x0b\x01\xe1\xff\xd7\x03\x0b\x01\xe4\xff\xc3\x03\x0b\x02\x07\xff\ +\x9a\x03\x0b\x02\x0b\xff\x9a\x03\x0b\x02r\xff\xc3\x03\x0b\x02\ +v\xff\xd7\x03\x0b\x02|\xff\xc3\x03\x0b\x02\x80\xff\xc3\x03\ +\x0b\x02\x82\xff\xc3\x03\x0b\x02\x9f\xff\xc3\x03\x0b\x02\xa0\xff\ +\xd7\x03\x0b\x02\xa9\xff\xae\x03\x0b\x02\xaa\xff\xc3\x03\x0b\x02\ +\xb5\xffq\x03\x0b\x02\xb6\xff\xc3\x03\x0b\x02\xb7\xff\xc3\x03\ +\x0b\x02\xb9\xff\xc3\x03\x0b\x02\xbb\xff\xc3\x03\x0b\x02\xbc\xff\ +\xd7\x03\x0b\x02\xbd\xff\xae\x03\x0b\x02\xbe\xff\xc3\x03\x0b\x02\ +\xbf\xff\xc3\x03\x0b\x02\xc0\xff\xd7\x03\x0b\x02\xc1\xff\xc3\x03\ +\x0b\x02\xc2\xff\xd7\x03\x0b\x02\xca\xff\xc3\x03\x0b\x02\xcb\xff\ +\xd7\x03\x0b\x02\xd4\xff\xc3\x03\x0b\x02\xd5\xff\xd7\x03\x0b\x02\ +\xd9\xff\xc3\x03\x0b\x02\xdb\xff\xc3\x03\x0b\x02\xdd\xff\xc3\x03\ +\x0b\x02\xe5\xff\xc3\x03\x0b\x02\xe6\xff\xd7\x03\x0b\x02\xf7\xff\ +\xc3\x03\x0b\x02\xf9\xff\xc3\x03\x0b\x02\xfb\xff\xc3\x03\x0b\x02\ +\xfd\xff\xc3\x03\x0b\x02\xfe\xff\xd7\x03\x0b\x03\x05\xff\xc3\x03\ +\x0b\x03\x06\xff\xd7\x03\x0b\x03\x07\xff\xc3\x03\x0b\x03\x08\xff\ +\xd7\x03\x0b\x03\x0d\xff\xd7\x03\x0b\x03\x0e\xff\xd7\x03\x0b\x03\ +\x0f\xff\xd7\x03\x0b\x03\x10\xff\xd7\x03\x0b\x03\x17\xff\xae\x03\ +\x0b\x03\x18\xff\xc3\x03\x0c\x00\x05\xff\x9a\x03\x0c\x00\x0a\xff\ +\x9a\x03\x0c\x01\xd0\xff\xd7\x03\x0c\x01\xdc\xff\xc3\x03\x0c\x01\ +\xdd\xff\xd7\x03\x0c\x01\xdf\xff\xd7\x03\x0c\x01\xe1\xff\xd7\x03\ +\x0c\x01\xe4\xff\xc3\x03\x0c\x01\xf6\xff\xd7\x03\x0c\x02\x07\xff\ +\x9a\x03\x0c\x02\x0b\xff\x9a\x03\x0c\x02\xa0\xff\xd7\x03\x0c\x02\ +\xaa\xff\xc3\x03\x0c\x02\xb6\xff\xc3\x03\x0c\x02\xbc\xff\xd7\x03\ +\x0c\x02\xbe\xff\xc3\x03\x0c\x02\xc0\xff\xd7\x03\x0c\x02\xc2\xff\ +\xd7\x03\x0c\x02\xcb\xff\xd7\x03\x0c\x02\xd5\xff\xd7\x03\x0c\x02\ +\xe6\xff\xd7\x03\x0c\x02\xf8\xff\xd7\x03\x0c\x02\xfa\xff\xd7\x03\ +\x0c\x02\xfc\xff\xd7\x03\x0c\x02\xfe\xff\xd7\x03\x0c\x03\x06\xff\ +\xd7\x03\x0c\x03\x08\xff\xd7\x03\x0c\x03\x0e\xff\x9a\x03\x0c\x03\ +\x10\xff\x9a\x03\x0c\x03\x18\xff\xc3\x03\x0d\x00\x05\xff\x9a\x03\ +\x0d\x00\x0a\xff\x9a\x03\x0d\x01\x9d\xff\xae\x03\x0d\x01\xa6\xff\ +\xae\x03\x0d\x01\xa8\xff\xc3\x03\x0d\x01\xaa\xff\xc3\x03\x0d\x01\ +\xb0\xff\xc3\x03\x0d\x01\xbc\xffq\x03\x0d\x01\xbd\xff\xc3\x03\ +\x0d\x01\xbf\xff\xc3\x03\x0d\x01\xc1\xff\xc3\x03\x0d\x01\xc4\xff\ +\xae\x03\x0d\x01\xd0\xff\xd7\x03\x0d\x01\xdc\xff\xc3\x03\x0d\x01\ +\xdf\xff\xd7\x03\x0d\x01\xe1\xff\xd7\x03\x0d\x01\xe4\xff\xc3\x03\ +\x0d\x02\x07\xff\x9a\x03\x0d\x02\x0b\xff\x9a\x03\x0d\x02r\xff\ +\xc3\x03\x0d\x02v\xff\xd7\x03\x0d\x02|\xff\xc3\x03\x0d\x02\ +\x80\xff\xc3\x03\x0d\x02\x82\xff\xc3\x03\x0d\x02\x9f\xff\xc3\x03\ +\x0d\x02\xa0\xff\xd7\x03\x0d\x02\xa9\xff\xae\x03\x0d\x02\xaa\xff\ +\xc3\x03\x0d\x02\xb5\xffq\x03\x0d\x02\xb6\xff\xc3\x03\x0d\x02\ +\xb7\xff\xc3\x03\x0d\x02\xb9\xff\xc3\x03\x0d\x02\xbb\xff\xc3\x03\ +\x0d\x02\xbc\xff\xd7\x03\x0d\x02\xbd\xff\xae\x03\x0d\x02\xbe\xff\ +\xc3\x03\x0d\x02\xbf\xff\xc3\x03\x0d\x02\xc0\xff\xd7\x03\x0d\x02\ +\xc1\xff\xc3\x03\x0d\x02\xc2\xff\xd7\x03\x0d\x02\xca\xff\xc3\x03\ +\x0d\x02\xcb\xff\xd7\x03\x0d\x02\xd4\xff\xc3\x03\x0d\x02\xd5\xff\ +\xd7\x03\x0d\x02\xd9\xff\xc3\x03\x0d\x02\xdb\xff\xc3\x03\x0d\x02\ +\xdd\xff\xc3\x03\x0d\x02\xe5\xff\xc3\x03\x0d\x02\xe6\xff\xd7\x03\ +\x0d\x02\xf7\xff\xc3\x03\x0d\x02\xf9\xff\xc3\x03\x0d\x02\xfb\xff\ +\xc3\x03\x0d\x02\xfd\xff\xc3\x03\x0d\x02\xfe\xff\xd7\x03\x0d\x03\ +\x05\xff\xc3\x03\x0d\x03\x06\xff\xd7\x03\x0d\x03\x07\xff\xc3\x03\ +\x0d\x03\x08\xff\xd7\x03\x0d\x03\x0d\xff\xd7\x03\x0d\x03\x0e\xff\ +\xd7\x03\x0d\x03\x0f\xff\xd7\x03\x0d\x03\x10\xff\xd7\x03\x0d\x03\ +\x17\xff\xae\x03\x0d\x03\x18\xff\xc3\x03\x0e\x00\x05\xff\x9a\x03\ +\x0e\x00\x0a\xff\x9a\x03\x0e\x01\xd0\xff\xd7\x03\x0e\x01\xdc\xff\ +\xc3\x03\x0e\x01\xdd\xff\xd7\x03\x0e\x01\xdf\xff\xd7\x03\x0e\x01\ +\xe1\xff\xd7\x03\x0e\x01\xe4\xff\xc3\x03\x0e\x01\xf6\xff\xd7\x03\ +\x0e\x02\x07\xff\x9a\x03\x0e\x02\x0b\xff\x9a\x03\x0e\x02\xa0\xff\ +\xd7\x03\x0e\x02\xaa\xff\xc3\x03\x0e\x02\xb6\xff\xc3\x03\x0e\x02\ +\xbc\xff\xd7\x03\x0e\x02\xbe\xff\xc3\x03\x0e\x02\xc0\xff\xd7\x03\ +\x0e\x02\xc2\xff\xd7\x03\x0e\x02\xcb\xff\xd7\x03\x0e\x02\xd5\xff\ +\xd7\x03\x0e\x02\xe6\xff\xd7\x03\x0e\x02\xf8\xff\xd7\x03\x0e\x02\ +\xfa\xff\xd7\x03\x0e\x02\xfc\xff\xd7\x03\x0e\x02\xfe\xff\xd7\x03\ +\x0e\x03\x06\xff\xd7\x03\x0e\x03\x08\xff\xd7\x03\x0e\x03\x0e\xff\ +\x9a\x03\x0e\x03\x10\xff\x9a\x03\x0e\x03\x18\xff\xc3\x03\x0f\x01\ +\xa3\x00\xe1\x03\x0f\x02\xea\x00)\x03\x0f\x03\x0e\xff\xd7\x03\ +\x0f\x03\x10\xff\xd7\x03\x10\x00\x05\xff\xec\x03\x10\x00\x0a\xff\ +\xec\x03\x10\x02\x07\xff\xec\x03\x10\x02\x0b\xff\xec\x03\x11\x00\ +\x05\xff\x9a\x03\x11\x00\x0a\xff\x9a\x03\x11\x01\x9d\xff\xae\x03\ +\x11\x01\xa6\xff\xae\x03\x11\x01\xa8\xff\xc3\x03\x11\x01\xaa\xff\ +\xc3\x03\x11\x01\xb0\xff\xc3\x03\x11\x01\xbc\xffq\x03\x11\x01\ +\xbd\xff\xc3\x03\x11\x01\xbf\xff\xc3\x03\x11\x01\xc1\xff\xc3\x03\ +\x11\x01\xc4\xff\xae\x03\x11\x01\xd0\xff\xd7\x03\x11\x01\xdc\xff\ +\xc3\x03\x11\x01\xdf\xff\xd7\x03\x11\x01\xe1\xff\xd7\x03\x11\x01\ +\xe4\xff\xc3\x03\x11\x02\x07\xff\x9a\x03\x11\x02\x0b\xff\x9a\x03\ +\x11\x02r\xff\xc3\x03\x11\x02v\xff\xd7\x03\x11\x02|\xff\ +\xc3\x03\x11\x02\x80\xff\xc3\x03\x11\x02\x82\xff\xc3\x03\x11\x02\ +\x9f\xff\xc3\x03\x11\x02\xa0\xff\xd7\x03\x11\x02\xa9\xff\xae\x03\ +\x11\x02\xaa\xff\xc3\x03\x11\x02\xb5\xffq\x03\x11\x02\xb6\xff\ +\xc3\x03\x11\x02\xb7\xff\xc3\x03\x11\x02\xb9\xff\xc3\x03\x11\x02\ +\xbb\xff\xc3\x03\x11\x02\xbc\xff\xd7\x03\x11\x02\xbd\xff\xae\x03\ +\x11\x02\xbe\xff\xc3\x03\x11\x02\xbf\xff\xc3\x03\x11\x02\xc0\xff\ +\xd7\x03\x11\x02\xc1\xff\xc3\x03\x11\x02\xc2\xff\xd7\x03\x11\x02\ +\xca\xff\xc3\x03\x11\x02\xcb\xff\xd7\x03\x11\x02\xd4\xff\xc3\x03\ +\x11\x02\xd5\xff\xd7\x03\x11\x02\xd9\xff\xc3\x03\x11\x02\xdb\xff\ +\xc3\x03\x11\x02\xdd\xff\xc3\x03\x11\x02\xe5\xff\xc3\x03\x11\x02\ +\xe6\xff\xd7\x03\x11\x02\xf7\xff\xc3\x03\x11\x02\xf9\xff\xc3\x03\ +\x11\x02\xfb\xff\xc3\x03\x11\x02\xfd\xff\xc3\x03\x11\x02\xfe\xff\ +\xd7\x03\x11\x03\x05\xff\xc3\x03\x11\x03\x06\xff\xd7\x03\x11\x03\ +\x07\xff\xc3\x03\x11\x03\x08\xff\xd7\x03\x11\x03\x0d\xff\xd7\x03\ +\x11\x03\x0e\xff\xd7\x03\x11\x03\x0f\xff\xd7\x03\x11\x03\x10\xff\ +\xd7\x03\x11\x03\x17\xff\xae\x03\x11\x03\x18\xff\xc3\x03\x12\x00\ +\x05\xff\x9a\x03\x12\x00\x0a\xff\x9a\x03\x12\x01\xd0\xff\xd7\x03\ +\x12\x01\xdc\xff\xc3\x03\x12\x01\xdd\xff\xd7\x03\x12\x01\xdf\xff\ +\xd7\x03\x12\x01\xe1\xff\xd7\x03\x12\x01\xe4\xff\xc3\x03\x12\x01\ +\xf6\xff\xd7\x03\x12\x02\x07\xff\x9a\x03\x12\x02\x0b\xff\x9a\x03\ +\x12\x02\xa0\xff\xd7\x03\x12\x02\xaa\xff\xc3\x03\x12\x02\xb6\xff\ +\xc3\x03\x12\x02\xbc\xff\xd7\x03\x12\x02\xbe\xff\xc3\x03\x12\x02\ +\xc0\xff\xd7\x03\x12\x02\xc2\xff\xd7\x03\x12\x02\xcb\xff\xd7\x03\ +\x12\x02\xd5\xff\xd7\x03\x12\x02\xe6\xff\xd7\x03\x12\x02\xf8\xff\ +\xd7\x03\x12\x02\xfa\xff\xd7\x03\x12\x02\xfc\xff\xd7\x03\x12\x02\ +\xfe\xff\xd7\x03\x12\x03\x06\xff\xd7\x03\x12\x03\x08\xff\xd7\x03\ +\x12\x03\x0e\xff\x9a\x03\x12\x03\x10\xff\x9a\x03\x12\x03\x18\xff\ +\xc3\x03\x13\x00\x05\xff\x9a\x03\x13\x00\x0a\xff\x9a\x03\x13\x01\ +\x9d\xff\xae\x03\x13\x01\xa6\xff\xae\x03\x13\x01\xa8\xff\xc3\x03\ +\x13\x01\xaa\xff\xc3\x03\x13\x01\xb0\xff\xc3\x03\x13\x01\xbc\xff\ +q\x03\x13\x01\xbd\xff\xc3\x03\x13\x01\xbf\xff\xc3\x03\x13\x01\ +\xc1\xff\xc3\x03\x13\x01\xc4\xff\xae\x03\x13\x01\xd0\xff\xd7\x03\ +\x13\x01\xdc\xff\xc3\x03\x13\x01\xdf\xff\xd7\x03\x13\x01\xe1\xff\ +\xd7\x03\x13\x01\xe4\xff\xc3\x03\x13\x02\x07\xff\x9a\x03\x13\x02\ +\x0b\xff\x9a\x03\x13\x02r\xff\xc3\x03\x13\x02v\xff\xd7\x03\ +\x13\x02|\xff\xc3\x03\x13\x02\x80\xff\xc3\x03\x13\x02\x82\xff\ +\xc3\x03\x13\x02\x9f\xff\xc3\x03\x13\x02\xa0\xff\xd7\x03\x13\x02\ +\xa9\xff\xae\x03\x13\x02\xaa\xff\xc3\x03\x13\x02\xb5\xffq\x03\ +\x13\x02\xb6\xff\xc3\x03\x13\x02\xb7\xff\xc3\x03\x13\x02\xb9\xff\ +\xc3\x03\x13\x02\xbb\xff\xc3\x03\x13\x02\xbc\xff\xd7\x03\x13\x02\ +\xbd\xff\xae\x03\x13\x02\xbe\xff\xc3\x03\x13\x02\xbf\xff\xc3\x03\ +\x13\x02\xc0\xff\xd7\x03\x13\x02\xc1\xff\xc3\x03\x13\x02\xc2\xff\ +\xd7\x03\x13\x02\xca\xff\xc3\x03\x13\x02\xcb\xff\xd7\x03\x13\x02\ +\xd4\xff\xc3\x03\x13\x02\xd5\xff\xd7\x03\x13\x02\xd9\xff\xc3\x03\ +\x13\x02\xdb\xff\xc3\x03\x13\x02\xdd\xff\xc3\x03\x13\x02\xe5\xff\ +\xc3\x03\x13\x02\xe6\xff\xd7\x03\x13\x02\xf7\xff\xc3\x03\x13\x02\ +\xf9\xff\xc3\x03\x13\x02\xfb\xff\xc3\x03\x13\x02\xfd\xff\xc3\x03\ +\x13\x02\xfe\xff\xd7\x03\x13\x03\x05\xff\xc3\x03\x13\x03\x06\xff\ +\xd7\x03\x13\x03\x07\xff\xc3\x03\x13\x03\x08\xff\xd7\x03\x13\x03\ +\x0d\xff\xd7\x03\x13\x03\x0e\xff\xd7\x03\x13\x03\x0f\xff\xd7\x03\ +\x13\x03\x10\xff\xd7\x03\x13\x03\x17\xff\xae\x03\x13\x03\x18\xff\ +\xc3\x03\x14\x00\x05\xff\x9a\x03\x14\x00\x0a\xff\x9a\x03\x14\x01\ +\xd0\xff\xd7\x03\x14\x01\xdc\xff\xc3\x03\x14\x01\xdd\xff\xd7\x03\ +\x14\x01\xdf\xff\xd7\x03\x14\x01\xe1\xff\xd7\x03\x14\x01\xe4\xff\ +\xc3\x03\x14\x01\xf6\xff\xd7\x03\x14\x02\x07\xff\x9a\x03\x14\x02\ +\x0b\xff\x9a\x03\x14\x02\xa0\xff\xd7\x03\x14\x02\xaa\xff\xc3\x03\ +\x14\x02\xb6\xff\xc3\x03\x14\x02\xbc\xff\xd7\x03\x14\x02\xbe\xff\ +\xc3\x03\x14\x02\xc0\xff\xd7\x03\x14\x02\xc2\xff\xd7\x03\x14\x02\ +\xcb\xff\xd7\x03\x14\x02\xd5\xff\xd7\x03\x14\x02\xe6\xff\xd7\x03\ +\x14\x02\xf8\xff\xd7\x03\x14\x02\xfa\xff\xd7\x03\x14\x02\xfc\xff\ +\xd7\x03\x14\x02\xfe\xff\xd7\x03\x14\x03\x06\xff\xd7\x03\x14\x03\ +\x08\xff\xd7\x03\x14\x03\x0e\xff\x9a\x03\x14\x03\x10\xff\x9a\x03\ +\x14\x03\x18\xff\xc3\x03\x15\x00\x0f\xff\xae\x03\x15\x00\x11\xff\ +\xae\x03\x15\x01\xaa\xff\xec\x03\x15\x01\xb0\xff\xd7\x03\x15\x01\ +\xbc\xff\xd7\x03\x15\x01\xbf\xff\xd7\x03\x15\x02\x08\xff\xae\x03\ +\x15\x02\x0c\xff\xae\x03\x15\x02r\xff\xec\x03\x15\x02\x80\xff\ +\xec\x03\x15\x02\x82\xff\xec\x03\x15\x02\x9f\xff\xd7\x03\x15\x02\ +\xb5\xff\xd7\x03\x15\x02\xb7\xff\xec\x03\x15\x02\xb9\xff\xec\x03\ +\x15\x02\xbb\xff\xd7\x03\x15\x02\xca\xff\xd7\x03\x15\x02\xd9\xff\ +\xec\x03\x15\x02\xdb\xff\xec\x03\x15\x02\xdd\xff\xec\x03\x15\x02\ +\xe5\xff\xd7\x03\x15\x03\x05\xff\xd7\x03\x15\x03\x07\xff\xd7\x03\ +\x16\x00\x05\xff\xd7\x03\x16\x00\x0a\xff\xd7\x03\x16\x01\xd0\xff\ +\xec\x03\x16\x01\xdd\xff\xec\x03\x16\x01\xdf\xff\xec\x03\x16\x01\ +\xf6\xff\xec\x03\x16\x02\x07\xff\xd7\x03\x16\x02\x0b\xff\xd7\x03\ +\x16\x02\xa0\xff\xec\x03\x16\x02\xbc\xff\xec\x03\x16\x02\xcb\xff\ +\xec\x03\x16\x02\xe6\xff\xec\x03\x16\x02\xf8\xff\xec\x03\x16\x02\ +\xfa\xff\xec\x03\x16\x02\xfc\xff\xec\x03\x16\x03\x06\xff\xec\x03\ +\x16\x03\x08\xff\xec\x03\x16\x03\x0e\xff\xd7\x03\x16\x03\x10\xff\ +\xd7\x03\x17\x00\x05\xff\xae\x03\x17\x00\x0a\xff\xae\x03\x17\x01\ +\x9d\xff\xc3\x03\x17\x01\xa6\xff\xc3\x03\x17\x01\xaa\xff\xd7\x03\ +\x17\x01\xb0\xff\xd7\x03\x17\x01\xbc\xff\xc3\x03\x17\x01\xbf\xff\ +\xd7\x03\x17\x01\xc1\xff\xd7\x03\x17\x01\xc4\xff\xc3\x03\x17\x01\ +\xdc\xff\xd7\x03\x17\x01\xe4\xff\xd7\x03\x17\x02\x07\xff\xae\x03\ +\x17\x02\x0b\xff\xae\x03\x17\x02r\xff\xd7\x03\x17\x02|\xff\ +\xd7\x03\x17\x02\x80\xff\xd7\x03\x17\x02\x82\xff\xd7\x03\x17\x02\ +\x9f\xff\xd7\x03\x17\x02\xa9\xff\xc3\x03\x17\x02\xaa\xff\xd7\x03\ +\x17\x02\xb5\xff\xc3\x03\x17\x02\xb6\xff\xd7\x03\x17\x02\xb7\xff\ +\xd7\x03\x17\x02\xb9\xff\xd7\x03\x17\x02\xbb\xff\xd7\x03\x17\x02\ +\xbd\xff\xc3\x03\x17\x02\xbe\xff\xd7\x03\x17\x02\xbf\xff\xd7\x03\ +\x17\x02\xc1\xff\xd7\x03\x17\x02\xca\xff\xd7\x03\x17\x02\xd4\xff\ +\xd7\x03\x17\x02\xd9\xff\xd7\x03\x17\x02\xdb\xff\xd7\x03\x17\x02\ +\xdd\xff\xd7\x03\x17\x02\xe5\xff\xd7\x03\x17\x02\xfd\xff\xd7\x03\ +\x17\x03\x05\xff\xd7\x03\x17\x03\x07\xff\xd7\x03\x17\x03\x0d\xff\ +\xd7\x03\x17\x03\x0f\xff\xd7\x03\x17\x03\x17\xff\xc3\x03\x17\x03\ +\x18\xff\xd7\x03\x18\x00\x05\xff\x9a\x03\x18\x00\x0a\xff\x9a\x03\ +\x18\x01\xd0\xff\xd7\x03\x18\x01\xdc\xff\xc3\x03\x18\x01\xdd\xff\ +\xd7\x03\x18\x01\xdf\xff\xd7\x03\x18\x01\xe1\xff\xd7\x03\x18\x01\ +\xe4\xff\xc3\x03\x18\x01\xf6\xff\xd7\x03\x18\x02\x07\xff\x9a\x03\ +\x18\x02\x0b\xff\x9a\x03\x18\x02\xa0\xff\xd7\x03\x18\x02\xaa\xff\ +\xc3\x03\x18\x02\xb6\xff\xc3\x03\x18\x02\xbc\xff\xd7\x03\x18\x02\ +\xbe\xff\xc3\x03\x18\x02\xc0\xff\xd7\x03\x18\x02\xc2\xff\xd7\x03\ +\x18\x02\xcb\xff\xd7\x03\x18\x02\xd5\xff\xd7\x03\x18\x02\xe6\xff\ +\xd7\x03\x18\x02\xf8\xff\xd7\x03\x18\x02\xfa\xff\xd7\x03\x18\x02\ +\xfc\xff\xd7\x03\x18\x02\xfe\xff\xd7\x03\x18\x03\x06\xff\xd7\x03\ +\x18\x03\x08\xff\xd7\x03\x18\x03\x0e\xff\x9a\x03\x18\x03\x10\xff\ +\x9a\x03\x18\x03\x18\xff\xc3\x03\x19\x01\xe1\xff\xd7\x03\x19\x02\ +\xc0\xff\xd7\x03\x19\x02\xc2\xff\xd7\x03\x19\x02\xd5\xff\xd7\x03\ +\x19\x02\xfe\xff\xd7\x03\x1b\x01\xa3\x00\xe1\x03\x1b\x02\xea\x00\ +)\x03\x1b\x03\x0e\xff\xd7\x03\x1b\x03\x10\xff\xd7\x03\x1c\x00\ +\x05\xff\xec\x03\x1c\x00\x0a\xff\xec\x03\x1c\x02\x07\xff\xec\x03\ +\x1c\x02\x0b\xff\xec\x03\x1d\x00\x05\xffq\x03\x1d\x00\x0a\xff\ +q\x03\x1d\x00&\xff\xd7\x03\x1d\x00*\xff\xd7\x03\x1d\x00\ +-\x01\x0a\x03\x1d\x002\xff\xd7\x03\x1d\x004\xff\xd7\x03\ +\x1d\x007\xffq\x03\x1d\x009\xff\xae\x03\x1d\x00:\xff\ +\xae\x03\x1d\x00<\xff\x85\x03\x1d\x00\x89\xff\xd7\x03\x1d\x00\ +\x94\xff\xd7\x03\x1d\x00\x95\xff\xd7\x03\x1d\x00\x96\xff\xd7\x03\ +\x1d\x00\x97\xff\xd7\x03\x1d\x00\x98\xff\xd7\x03\x1d\x00\x9a\xff\ +\xd7\x03\x1d\x00\x9f\xff\x85\x03\x1d\x00\xc8\xff\xd7\x03\x1d\x00\ +\xca\xff\xd7\x03\x1d\x00\xcc\xff\xd7\x03\x1d\x00\xce\xff\xd7\x03\ +\x1d\x00\xde\xff\xd7\x03\x1d\x00\xe0\xff\xd7\x03\x1d\x00\xe2\xff\ +\xd7\x03\x1d\x00\xe4\xff\xd7\x03\x1d\x01\x0e\xff\xd7\x03\x1d\x01\ +\x10\xff\xd7\x03\x1d\x01\x12\xff\xd7\x03\x1d\x01\x14\xff\xd7\x03\ +\x1d\x01$\xffq\x03\x1d\x01&\xffq\x03\x1d\x016\xff\ +\xae\x03\x1d\x018\xff\x85\x03\x1d\x01:\xff\x85\x03\x1d\x01\ +G\xff\xd7\x03\x1d\x01\xfa\xff\xae\x03\x1d\x01\xfc\xff\xae\x03\ +\x1d\x01\xfe\xff\xae\x03\x1d\x02\x00\xff\x85\x03\x1d\x02\x07\xff\ +q\x03\x1d\x02\x0b\xffq\x03\x1d\x02_\xff\xd7\x03\x1d\x03\ +I\xff\xd7\x03\x1d\x03K\xff\xd7\x03\x1d\x03M\xff\xd7\x03\ +\x1d\x03O\xff\xd7\x03\x1d\x03Q\xff\xd7\x03\x1d\x03S\xff\ +\xd7\x03\x1d\x03U\xff\xd7\x03\x1d\x03W\xff\xd7\x03\x1d\x03\ +Y\xff\xd7\x03\x1d\x03[\xff\xd7\x03\x1d\x03]\xff\xd7\x03\ +\x1d\x03_\xff\xd7\x03\x1d\x03o\xff\x85\x03\x1d\x03q\xff\ +\x85\x03\x1d\x03s\xff\x85\x03\x1d\x03\x8f\xffq\x03\x1e\x00\ +\x05\xff\xec\x03\x1e\x00\x0a\xff\xec\x03\x1e\x02\x07\xff\xec\x03\ +\x1e\x02\x0b\xff\xec\x03\x1f\x00\x05\xffq\x03\x1f\x00\x0a\xff\ +q\x03\x1f\x00&\xff\xd7\x03\x1f\x00*\xff\xd7\x03\x1f\x00\ +-\x01\x0a\x03\x1f\x002\xff\xd7\x03\x1f\x004\xff\xd7\x03\ +\x1f\x007\xffq\x03\x1f\x009\xff\xae\x03\x1f\x00:\xff\ +\xae\x03\x1f\x00<\xff\x85\x03\x1f\x00\x89\xff\xd7\x03\x1f\x00\ +\x94\xff\xd7\x03\x1f\x00\x95\xff\xd7\x03\x1f\x00\x96\xff\xd7\x03\ +\x1f\x00\x97\xff\xd7\x03\x1f\x00\x98\xff\xd7\x03\x1f\x00\x9a\xff\ +\xd7\x03\x1f\x00\x9f\xff\x85\x03\x1f\x00\xc8\xff\xd7\x03\x1f\x00\ +\xca\xff\xd7\x03\x1f\x00\xcc\xff\xd7\x03\x1f\x00\xce\xff\xd7\x03\ +\x1f\x00\xde\xff\xd7\x03\x1f\x00\xe0\xff\xd7\x03\x1f\x00\xe2\xff\ +\xd7\x03\x1f\x00\xe4\xff\xd7\x03\x1f\x01\x0e\xff\xd7\x03\x1f\x01\ +\x10\xff\xd7\x03\x1f\x01\x12\xff\xd7\x03\x1f\x01\x14\xff\xd7\x03\ +\x1f\x01$\xffq\x03\x1f\x01&\xffq\x03\x1f\x016\xff\ +\xae\x03\x1f\x018\xff\x85\x03\x1f\x01:\xff\x85\x03\x1f\x01\ +G\xff\xd7\x03\x1f\x01\xfa\xff\xae\x03\x1f\x01\xfc\xff\xae\x03\ +\x1f\x01\xfe\xff\xae\x03\x1f\x02\x00\xff\x85\x03\x1f\x02\x07\xff\ +q\x03\x1f\x02\x0b\xffq\x03\x1f\x02_\xff\xd7\x03\x1f\x03\ +I\xff\xd7\x03\x1f\x03K\xff\xd7\x03\x1f\x03M\xff\xd7\x03\ +\x1f\x03O\xff\xd7\x03\x1f\x03Q\xff\xd7\x03\x1f\x03S\xff\ +\xd7\x03\x1f\x03U\xff\xd7\x03\x1f\x03W\xff\xd7\x03\x1f\x03\ +Y\xff\xd7\x03\x1f\x03[\xff\xd7\x03\x1f\x03]\xff\xd7\x03\ +\x1f\x03_\xff\xd7\x03\x1f\x03o\xff\x85\x03\x1f\x03q\xff\ +\x85\x03\x1f\x03s\xff\x85\x03\x1f\x03\x8f\xffq\x03 \x00\ +\x05\xff\xec\x03 \x00\x0a\xff\xec\x03 \x02\x07\xff\xec\x03\ + \x02\x0b\xff\xec\x03!\x00\x05\xffq\x03!\x00\x0a\xff\ +q\x03!\x00&\xff\xd7\x03!\x00*\xff\xd7\x03!\x00\ +-\x01\x0a\x03!\x002\xff\xd7\x03!\x004\xff\xd7\x03\ +!\x007\xffq\x03!\x009\xff\xae\x03!\x00:\xff\ +\xae\x03!\x00<\xff\x85\x03!\x00\x89\xff\xd7\x03!\x00\ +\x94\xff\xd7\x03!\x00\x95\xff\xd7\x03!\x00\x96\xff\xd7\x03\ +!\x00\x97\xff\xd7\x03!\x00\x98\xff\xd7\x03!\x00\x9a\xff\ +\xd7\x03!\x00\x9f\xff\x85\x03!\x00\xc8\xff\xd7\x03!\x00\ +\xca\xff\xd7\x03!\x00\xcc\xff\xd7\x03!\x00\xce\xff\xd7\x03\ +!\x00\xde\xff\xd7\x03!\x00\xe0\xff\xd7\x03!\x00\xe2\xff\ +\xd7\x03!\x00\xe4\xff\xd7\x03!\x01\x0e\xff\xd7\x03!\x01\ +\x10\xff\xd7\x03!\x01\x12\xff\xd7\x03!\x01\x14\xff\xd7\x03\ +!\x01$\xffq\x03!\x01&\xffq\x03!\x016\xff\ +\xae\x03!\x018\xff\x85\x03!\x01:\xff\x85\x03!\x01\ +G\xff\xd7\x03!\x01\xfa\xff\xae\x03!\x01\xfc\xff\xae\x03\ +!\x01\xfe\xff\xae\x03!\x02\x00\xff\x85\x03!\x02\x07\xff\ +q\x03!\x02\x0b\xffq\x03!\x02_\xff\xd7\x03!\x03\ +I\xff\xd7\x03!\x03K\xff\xd7\x03!\x03M\xff\xd7\x03\ +!\x03O\xff\xd7\x03!\x03Q\xff\xd7\x03!\x03S\xff\ +\xd7\x03!\x03U\xff\xd7\x03!\x03W\xff\xd7\x03!\x03\ +Y\xff\xd7\x03!\x03[\xff\xd7\x03!\x03]\xff\xd7\x03\ +!\x03_\xff\xd7\x03!\x03o\xff\x85\x03!\x03q\xff\ +\x85\x03!\x03s\xff\x85\x03!\x03\x8f\xffq\x03\x22\x00\ +\x05\xff\xec\x03\x22\x00\x0a\xff\xec\x03\x22\x02\x07\xff\xec\x03\ +\x22\x02\x0b\xff\xec\x03#\x00\x05\xffq\x03#\x00\x0a\xff\ +q\x03#\x00&\xff\xd7\x03#\x00*\xff\xd7\x03#\x00\ +-\x01\x0a\x03#\x002\xff\xd7\x03#\x004\xff\xd7\x03\ +#\x007\xffq\x03#\x009\xff\xae\x03#\x00:\xff\ +\xae\x03#\x00<\xff\x85\x03#\x00\x89\xff\xd7\x03#\x00\ +\x94\xff\xd7\x03#\x00\x95\xff\xd7\x03#\x00\x96\xff\xd7\x03\ +#\x00\x97\xff\xd7\x03#\x00\x98\xff\xd7\x03#\x00\x9a\xff\ +\xd7\x03#\x00\x9f\xff\x85\x03#\x00\xc8\xff\xd7\x03#\x00\ +\xca\xff\xd7\x03#\x00\xcc\xff\xd7\x03#\x00\xce\xff\xd7\x03\ +#\x00\xde\xff\xd7\x03#\x00\xe0\xff\xd7\x03#\x00\xe2\xff\ +\xd7\x03#\x00\xe4\xff\xd7\x03#\x01\x0e\xff\xd7\x03#\x01\ +\x10\xff\xd7\x03#\x01\x12\xff\xd7\x03#\x01\x14\xff\xd7\x03\ +#\x01$\xffq\x03#\x01&\xffq\x03#\x016\xff\ +\xae\x03#\x018\xff\x85\x03#\x01:\xff\x85\x03#\x01\ +G\xff\xd7\x03#\x01\xfa\xff\xae\x03#\x01\xfc\xff\xae\x03\ +#\x01\xfe\xff\xae\x03#\x02\x00\xff\x85\x03#\x02\x07\xff\ +q\x03#\x02\x0b\xffq\x03#\x02_\xff\xd7\x03#\x03\ +I\xff\xd7\x03#\x03K\xff\xd7\x03#\x03M\xff\xd7\x03\ +#\x03O\xff\xd7\x03#\x03Q\xff\xd7\x03#\x03S\xff\ +\xd7\x03#\x03U\xff\xd7\x03#\x03W\xff\xd7\x03#\x03\ +Y\xff\xd7\x03#\x03[\xff\xd7\x03#\x03]\xff\xd7\x03\ +#\x03_\xff\xd7\x03#\x03o\xff\x85\x03#\x03q\xff\ +\x85\x03#\x03s\xff\x85\x03#\x03\x8f\xffq\x03$\x00\ +\x05\xff\xec\x03$\x00\x0a\xff\xec\x03$\x02\x07\xff\xec\x03\ +$\x02\x0b\xff\xec\x03%\x00\x05\xffq\x03%\x00\x0a\xff\ +q\x03%\x00&\xff\xd7\x03%\x00*\xff\xd7\x03%\x00\ +-\x01\x0a\x03%\x002\xff\xd7\x03%\x004\xff\xd7\x03\ +%\x007\xffq\x03%\x009\xff\xae\x03%\x00:\xff\ +\xae\x03%\x00<\xff\x85\x03%\x00\x89\xff\xd7\x03%\x00\ +\x94\xff\xd7\x03%\x00\x95\xff\xd7\x03%\x00\x96\xff\xd7\x03\ +%\x00\x97\xff\xd7\x03%\x00\x98\xff\xd7\x03%\x00\x9a\xff\ +\xd7\x03%\x00\x9f\xff\x85\x03%\x00\xc8\xff\xd7\x03%\x00\ +\xca\xff\xd7\x03%\x00\xcc\xff\xd7\x03%\x00\xce\xff\xd7\x03\ +%\x00\xde\xff\xd7\x03%\x00\xe0\xff\xd7\x03%\x00\xe2\xff\ +\xd7\x03%\x00\xe4\xff\xd7\x03%\x01\x0e\xff\xd7\x03%\x01\ +\x10\xff\xd7\x03%\x01\x12\xff\xd7\x03%\x01\x14\xff\xd7\x03\ +%\x01$\xffq\x03%\x01&\xffq\x03%\x016\xff\ +\xae\x03%\x018\xff\x85\x03%\x01:\xff\x85\x03%\x01\ +G\xff\xd7\x03%\x01\xfa\xff\xae\x03%\x01\xfc\xff\xae\x03\ +%\x01\xfe\xff\xae\x03%\x02\x00\xff\x85\x03%\x02\x07\xff\ +q\x03%\x02\x0b\xffq\x03%\x02_\xff\xd7\x03%\x03\ +I\xff\xd7\x03%\x03K\xff\xd7\x03%\x03M\xff\xd7\x03\ +%\x03O\xff\xd7\x03%\x03Q\xff\xd7\x03%\x03S\xff\ +\xd7\x03%\x03U\xff\xd7\x03%\x03W\xff\xd7\x03%\x03\ +Y\xff\xd7\x03%\x03[\xff\xd7\x03%\x03]\xff\xd7\x03\ +%\x03_\xff\xd7\x03%\x03o\xff\x85\x03%\x03q\xff\ +\x85\x03%\x03s\xff\x85\x03%\x03\x8f\xffq\x03&\x00\ +\x05\xff\xec\x03&\x00\x0a\xff\xec\x03&\x02\x07\xff\xec\x03\ +&\x02\x0b\xff\xec\x03'\x00\x05\xffq\x03'\x00\x0a\xff\ +q\x03'\x00&\xff\xd7\x03'\x00*\xff\xd7\x03'\x00\ +-\x01\x0a\x03'\x002\xff\xd7\x03'\x004\xff\xd7\x03\ +'\x007\xffq\x03'\x009\xff\xae\x03'\x00:\xff\ +\xae\x03'\x00<\xff\x85\x03'\x00\x89\xff\xd7\x03'\x00\ +\x94\xff\xd7\x03'\x00\x95\xff\xd7\x03'\x00\x96\xff\xd7\x03\ +'\x00\x97\xff\xd7\x03'\x00\x98\xff\xd7\x03'\x00\x9a\xff\ +\xd7\x03'\x00\x9f\xff\x85\x03'\x00\xc8\xff\xd7\x03'\x00\ +\xca\xff\xd7\x03'\x00\xcc\xff\xd7\x03'\x00\xce\xff\xd7\x03\ +'\x00\xde\xff\xd7\x03'\x00\xe0\xff\xd7\x03'\x00\xe2\xff\ +\xd7\x03'\x00\xe4\xff\xd7\x03'\x01\x0e\xff\xd7\x03'\x01\ +\x10\xff\xd7\x03'\x01\x12\xff\xd7\x03'\x01\x14\xff\xd7\x03\ +'\x01$\xffq\x03'\x01&\xffq\x03'\x016\xff\ +\xae\x03'\x018\xff\x85\x03'\x01:\xff\x85\x03'\x01\ +G\xff\xd7\x03'\x01\xfa\xff\xae\x03'\x01\xfc\xff\xae\x03\ +'\x01\xfe\xff\xae\x03'\x02\x00\xff\x85\x03'\x02\x07\xff\ +q\x03'\x02\x0b\xffq\x03'\x02_\xff\xd7\x03'\x03\ +I\xff\xd7\x03'\x03K\xff\xd7\x03'\x03M\xff\xd7\x03\ +'\x03O\xff\xd7\x03'\x03Q\xff\xd7\x03'\x03S\xff\ +\xd7\x03'\x03U\xff\xd7\x03'\x03W\xff\xd7\x03'\x03\ +Y\xff\xd7\x03'\x03[\xff\xd7\x03'\x03]\xff\xd7\x03\ +'\x03_\xff\xd7\x03'\x03o\xff\x85\x03'\x03q\xff\ +\x85\x03'\x03s\xff\x85\x03'\x03\x8f\xffq\x03(\x00\ +\x05\xff\xec\x03(\x00\x0a\xff\xec\x03(\x02\x07\xff\xec\x03\ +(\x02\x0b\xff\xec\x03)\x00\x05\xffq\x03)\x00\x0a\xff\ +q\x03)\x00&\xff\xd7\x03)\x00*\xff\xd7\x03)\x00\ +-\x01\x0a\x03)\x002\xff\xd7\x03)\x004\xff\xd7\x03\ +)\x007\xffq\x03)\x009\xff\xae\x03)\x00:\xff\ +\xae\x03)\x00<\xff\x85\x03)\x00\x89\xff\xd7\x03)\x00\ +\x94\xff\xd7\x03)\x00\x95\xff\xd7\x03)\x00\x96\xff\xd7\x03\ +)\x00\x97\xff\xd7\x03)\x00\x98\xff\xd7\x03)\x00\x9a\xff\ +\xd7\x03)\x00\x9f\xff\x85\x03)\x00\xc8\xff\xd7\x03)\x00\ +\xca\xff\xd7\x03)\x00\xcc\xff\xd7\x03)\x00\xce\xff\xd7\x03\ +)\x00\xde\xff\xd7\x03)\x00\xe0\xff\xd7\x03)\x00\xe2\xff\ +\xd7\x03)\x00\xe4\xff\xd7\x03)\x01\x0e\xff\xd7\x03)\x01\ +\x10\xff\xd7\x03)\x01\x12\xff\xd7\x03)\x01\x14\xff\xd7\x03\ +)\x01$\xffq\x03)\x01&\xffq\x03)\x016\xff\ +\xae\x03)\x018\xff\x85\x03)\x01:\xff\x85\x03)\x01\ +G\xff\xd7\x03)\x01\xfa\xff\xae\x03)\x01\xfc\xff\xae\x03\ +)\x01\xfe\xff\xae\x03)\x02\x00\xff\x85\x03)\x02\x07\xff\ +q\x03)\x02\x0b\xffq\x03)\x02_\xff\xd7\x03)\x03\ +I\xff\xd7\x03)\x03K\xff\xd7\x03)\x03M\xff\xd7\x03\ +)\x03O\xff\xd7\x03)\x03Q\xff\xd7\x03)\x03S\xff\ +\xd7\x03)\x03U\xff\xd7\x03)\x03W\xff\xd7\x03)\x03\ +Y\xff\xd7\x03)\x03[\xff\xd7\x03)\x03]\xff\xd7\x03\ +)\x03_\xff\xd7\x03)\x03o\xff\x85\x03)\x03q\xff\ +\x85\x03)\x03s\xff\x85\x03)\x03\x8f\xffq\x03*\x00\ +\x05\xff\xec\x03*\x00\x0a\xff\xec\x03*\x02\x07\xff\xec\x03\ +*\x02\x0b\xff\xec\x03+\x00\x05\xffq\x03+\x00\x0a\xff\ +q\x03+\x00&\xff\xd7\x03+\x00*\xff\xd7\x03+\x00\ +-\x01\x0a\x03+\x002\xff\xd7\x03+\x004\xff\xd7\x03\ ++\x007\xffq\x03+\x009\xff\xae\x03+\x00:\xff\ +\xae\x03+\x00<\xff\x85\x03+\x00\x89\xff\xd7\x03+\x00\ +\x94\xff\xd7\x03+\x00\x95\xff\xd7\x03+\x00\x96\xff\xd7\x03\ ++\x00\x97\xff\xd7\x03+\x00\x98\xff\xd7\x03+\x00\x9a\xff\ +\xd7\x03+\x00\x9f\xff\x85\x03+\x00\xc8\xff\xd7\x03+\x00\ +\xca\xff\xd7\x03+\x00\xcc\xff\xd7\x03+\x00\xce\xff\xd7\x03\ ++\x00\xde\xff\xd7\x03+\x00\xe0\xff\xd7\x03+\x00\xe2\xff\ +\xd7\x03+\x00\xe4\xff\xd7\x03+\x01\x0e\xff\xd7\x03+\x01\ +\x10\xff\xd7\x03+\x01\x12\xff\xd7\x03+\x01\x14\xff\xd7\x03\ ++\x01$\xffq\x03+\x01&\xffq\x03+\x016\xff\ +\xae\x03+\x018\xff\x85\x03+\x01:\xff\x85\x03+\x01\ +G\xff\xd7\x03+\x01\xfa\xff\xae\x03+\x01\xfc\xff\xae\x03\ ++\x01\xfe\xff\xae\x03+\x02\x00\xff\x85\x03+\x02\x07\xff\ +q\x03+\x02\x0b\xffq\x03+\x02_\xff\xd7\x03+\x03\ +I\xff\xd7\x03+\x03K\xff\xd7\x03+\x03M\xff\xd7\x03\ ++\x03O\xff\xd7\x03+\x03Q\xff\xd7\x03+\x03S\xff\ +\xd7\x03+\x03U\xff\xd7\x03+\x03W\xff\xd7\x03+\x03\ +Y\xff\xd7\x03+\x03[\xff\xd7\x03+\x03]\xff\xd7\x03\ ++\x03_\xff\xd7\x03+\x03o\xff\x85\x03+\x03q\xff\ +\x85\x03+\x03s\xff\x85\x03+\x03\x8f\xffq\x03,\x00\ +\x05\xff\xec\x03,\x00\x0a\xff\xec\x03,\x02\x07\xff\xec\x03\ +,\x02\x0b\xff\xec\x03-\x00\x05\xffq\x03-\x00\x0a\xff\ +q\x03-\x00&\xff\xd7\x03-\x00*\xff\xd7\x03-\x00\ +-\x01\x0a\x03-\x002\xff\xd7\x03-\x004\xff\xd7\x03\ +-\x007\xffq\x03-\x009\xff\xae\x03-\x00:\xff\ +\xae\x03-\x00<\xff\x85\x03-\x00\x89\xff\xd7\x03-\x00\ +\x94\xff\xd7\x03-\x00\x95\xff\xd7\x03-\x00\x96\xff\xd7\x03\ +-\x00\x97\xff\xd7\x03-\x00\x98\xff\xd7\x03-\x00\x9a\xff\ +\xd7\x03-\x00\x9f\xff\x85\x03-\x00\xc8\xff\xd7\x03-\x00\ +\xca\xff\xd7\x03-\x00\xcc\xff\xd7\x03-\x00\xce\xff\xd7\x03\ +-\x00\xde\xff\xd7\x03-\x00\xe0\xff\xd7\x03-\x00\xe2\xff\ +\xd7\x03-\x00\xe4\xff\xd7\x03-\x01\x0e\xff\xd7\x03-\x01\ +\x10\xff\xd7\x03-\x01\x12\xff\xd7\x03-\x01\x14\xff\xd7\x03\ +-\x01$\xffq\x03-\x01&\xffq\x03-\x016\xff\ +\xae\x03-\x018\xff\x85\x03-\x01:\xff\x85\x03-\x01\ +G\xff\xd7\x03-\x01\xfa\xff\xae\x03-\x01\xfc\xff\xae\x03\ +-\x01\xfe\xff\xae\x03-\x02\x00\xff\x85\x03-\x02\x07\xff\ +q\x03-\x02\x0b\xffq\x03-\x02_\xff\xd7\x03-\x03\ +I\xff\xd7\x03-\x03K\xff\xd7\x03-\x03M\xff\xd7\x03\ +-\x03O\xff\xd7\x03-\x03Q\xff\xd7\x03-\x03S\xff\ +\xd7\x03-\x03U\xff\xd7\x03-\x03W\xff\xd7\x03-\x03\ +Y\xff\xd7\x03-\x03[\xff\xd7\x03-\x03]\xff\xd7\x03\ +-\x03_\xff\xd7\x03-\x03o\xff\x85\x03-\x03q\xff\ +\x85\x03-\x03s\xff\x85\x03-\x03\x8f\xffq\x03.\x00\ +\x05\xff\xec\x03.\x00\x0a\xff\xec\x03.\x02\x07\xff\xec\x03\ +.\x02\x0b\xff\xec\x03/\x00\x05\xffq\x03/\x00\x0a\xff\ +q\x03/\x00&\xff\xd7\x03/\x00*\xff\xd7\x03/\x00\ +-\x01\x0a\x03/\x002\xff\xd7\x03/\x004\xff\xd7\x03\ +/\x007\xffq\x03/\x009\xff\xae\x03/\x00:\xff\ +\xae\x03/\x00<\xff\x85\x03/\x00\x89\xff\xd7\x03/\x00\ +\x94\xff\xd7\x03/\x00\x95\xff\xd7\x03/\x00\x96\xff\xd7\x03\ +/\x00\x97\xff\xd7\x03/\x00\x98\xff\xd7\x03/\x00\x9a\xff\ +\xd7\x03/\x00\x9f\xff\x85\x03/\x00\xc8\xff\xd7\x03/\x00\ +\xca\xff\xd7\x03/\x00\xcc\xff\xd7\x03/\x00\xce\xff\xd7\x03\ +/\x00\xde\xff\xd7\x03/\x00\xe0\xff\xd7\x03/\x00\xe2\xff\ +\xd7\x03/\x00\xe4\xff\xd7\x03/\x01\x0e\xff\xd7\x03/\x01\ +\x10\xff\xd7\x03/\x01\x12\xff\xd7\x03/\x01\x14\xff\xd7\x03\ +/\x01$\xffq\x03/\x01&\xffq\x03/\x016\xff\ +\xae\x03/\x018\xff\x85\x03/\x01:\xff\x85\x03/\x01\ +G\xff\xd7\x03/\x01\xfa\xff\xae\x03/\x01\xfc\xff\xae\x03\ +/\x01\xfe\xff\xae\x03/\x02\x00\xff\x85\x03/\x02\x07\xff\ +q\x03/\x02\x0b\xffq\x03/\x02_\xff\xd7\x03/\x03\ +I\xff\xd7\x03/\x03K\xff\xd7\x03/\x03M\xff\xd7\x03\ +/\x03O\xff\xd7\x03/\x03Q\xff\xd7\x03/\x03S\xff\ +\xd7\x03/\x03U\xff\xd7\x03/\x03W\xff\xd7\x03/\x03\ +Y\xff\xd7\x03/\x03[\xff\xd7\x03/\x03]\xff\xd7\x03\ +/\x03_\xff\xd7\x03/\x03o\xff\x85\x03/\x03q\xff\ +\x85\x03/\x03s\xff\x85\x03/\x03\x8f\xffq\x030\x00\ +\x05\xff\xec\x030\x00\x0a\xff\xec\x030\x02\x07\xff\xec\x03\ +0\x02\x0b\xff\xec\x031\x00\x05\xffq\x031\x00\x0a\xff\ +q\x031\x00&\xff\xd7\x031\x00*\xff\xd7\x031\x00\ +-\x01\x0a\x031\x002\xff\xd7\x031\x004\xff\xd7\x03\ +1\x007\xffq\x031\x009\xff\xae\x031\x00:\xff\ +\xae\x031\x00<\xff\x85\x031\x00\x89\xff\xd7\x031\x00\ +\x94\xff\xd7\x031\x00\x95\xff\xd7\x031\x00\x96\xff\xd7\x03\ +1\x00\x97\xff\xd7\x031\x00\x98\xff\xd7\x031\x00\x9a\xff\ +\xd7\x031\x00\x9f\xff\x85\x031\x00\xc8\xff\xd7\x031\x00\ +\xca\xff\xd7\x031\x00\xcc\xff\xd7\x031\x00\xce\xff\xd7\x03\ +1\x00\xde\xff\xd7\x031\x00\xe0\xff\xd7\x031\x00\xe2\xff\ +\xd7\x031\x00\xe4\xff\xd7\x031\x01\x0e\xff\xd7\x031\x01\ +\x10\xff\xd7\x031\x01\x12\xff\xd7\x031\x01\x14\xff\xd7\x03\ +1\x01$\xffq\x031\x01&\xffq\x031\x016\xff\ +\xae\x031\x018\xff\x85\x031\x01:\xff\x85\x031\x01\ +G\xff\xd7\x031\x01\xfa\xff\xae\x031\x01\xfc\xff\xae\x03\ +1\x01\xfe\xff\xae\x031\x02\x00\xff\x85\x031\x02\x07\xff\ +q\x031\x02\x0b\xffq\x031\x02_\xff\xd7\x031\x03\ +I\xff\xd7\x031\x03K\xff\xd7\x031\x03M\xff\xd7\x03\ +1\x03O\xff\xd7\x031\x03Q\xff\xd7\x031\x03S\xff\ +\xd7\x031\x03U\xff\xd7\x031\x03W\xff\xd7\x031\x03\ +Y\xff\xd7\x031\x03[\xff\xd7\x031\x03]\xff\xd7\x03\ +1\x03_\xff\xd7\x031\x03o\xff\x85\x031\x03q\xff\ +\x85\x031\x03s\xff\x85\x031\x03\x8f\xffq\x032\x00\ +\x05\xff\xec\x032\x00\x0a\xff\xec\x032\x02\x07\xff\xec\x03\ +2\x02\x0b\xff\xec\x033\x00\x05\xffq\x033\x00\x0a\xff\ +q\x033\x00&\xff\xd7\x033\x00*\xff\xd7\x033\x00\ +-\x01\x0a\x033\x002\xff\xd7\x033\x004\xff\xd7\x03\ +3\x007\xffq\x033\x009\xff\xae\x033\x00:\xff\ +\xae\x033\x00<\xff\x85\x033\x00\x89\xff\xd7\x033\x00\ +\x94\xff\xd7\x033\x00\x95\xff\xd7\x033\x00\x96\xff\xd7\x03\ +3\x00\x97\xff\xd7\x033\x00\x98\xff\xd7\x033\x00\x9a\xff\ +\xd7\x033\x00\x9f\xff\x85\x033\x00\xc8\xff\xd7\x033\x00\ +\xca\xff\xd7\x033\x00\xcc\xff\xd7\x033\x00\xce\xff\xd7\x03\ +3\x00\xde\xff\xd7\x033\x00\xe0\xff\xd7\x033\x00\xe2\xff\ +\xd7\x033\x00\xe4\xff\xd7\x033\x01\x0e\xff\xd7\x033\x01\ +\x10\xff\xd7\x033\x01\x12\xff\xd7\x033\x01\x14\xff\xd7\x03\ +3\x01$\xffq\x033\x01&\xffq\x033\x016\xff\ +\xae\x033\x018\xff\x85\x033\x01:\xff\x85\x033\x01\ +G\xff\xd7\x033\x01\xfa\xff\xae\x033\x01\xfc\xff\xae\x03\ +3\x01\xfe\xff\xae\x033\x02\x00\xff\x85\x033\x02\x07\xff\ +q\x033\x02\x0b\xffq\x033\x02_\xff\xd7\x033\x03\ +I\xff\xd7\x033\x03K\xff\xd7\x033\x03M\xff\xd7\x03\ +3\x03O\xff\xd7\x033\x03Q\xff\xd7\x033\x03S\xff\ +\xd7\x033\x03U\xff\xd7\x033\x03W\xff\xd7\x033\x03\ +Y\xff\xd7\x033\x03[\xff\xd7\x033\x03]\xff\xd7\x03\ +3\x03_\xff\xd7\x033\x03o\xff\x85\x033\x03q\xff\ +\x85\x033\x03s\xff\x85\x033\x03\x8f\xffq\x034\x00\ +\x05\xff\xec\x034\x00\x0a\xff\xec\x034\x02\x07\xff\xec\x03\ +4\x02\x0b\xff\xec\x035\x00-\x00{\x036\x00\x05\xff\ +\xec\x036\x00\x0a\xff\xec\x036\x00Y\xff\xd7\x036\x00\ +Z\xff\xd7\x036\x00[\xff\xd7\x036\x00\x5c\xff\xd7\x03\ +6\x00]\xff\xec\x036\x00\xbf\xff\xd7\x036\x017\xff\ +\xd7\x036\x01<\xff\xec\x036\x01>\xff\xec\x036\x01\ +@\xff\xec\x036\x01\xfb\xff\xd7\x036\x01\xfd\xff\xd7\x03\ +6\x02\x07\xff\xec\x036\x02\x0b\xff\xec\x036\x03p\xff\ +\xd7\x037\x00-\x00{\x038\x00\x05\xff\xec\x038\x00\ +\x0a\xff\xec\x038\x00Y\xff\xd7\x038\x00Z\xff\xd7\x03\ +8\x00[\xff\xd7\x038\x00\x5c\xff\xd7\x038\x00]\xff\ +\xec\x038\x00\xbf\xff\xd7\x038\x017\xff\xd7\x038\x01\ +<\xff\xec\x038\x01>\xff\xec\x038\x01@\xff\xec\x03\ +8\x01\xfb\xff\xd7\x038\x01\xfd\xff\xd7\x038\x02\x07\xff\ +\xec\x038\x02\x0b\xff\xec\x038\x03p\xff\xd7\x039\x00\ +-\x00{\x03:\x00\x05\xff\xec\x03:\x00\x0a\xff\xec\x03\ +:\x00Y\xff\xd7\x03:\x00Z\xff\xd7\x03:\x00[\xff\ +\xd7\x03:\x00\x5c\xff\xd7\x03:\x00]\xff\xec\x03:\x00\ +\xbf\xff\xd7\x03:\x017\xff\xd7\x03:\x01<\xff\xec\x03\ +:\x01>\xff\xec\x03:\x01@\xff\xec\x03:\x01\xfb\xff\ +\xd7\x03:\x01\xfd\xff\xd7\x03:\x02\x07\xff\xec\x03:\x02\ +\x0b\xff\xec\x03:\x03p\xff\xd7\x03;\x00-\x00{\x03\ +<\x00\x05\xff\xec\x03<\x00\x0a\xff\xec\x03<\x00Y\xff\ +\xd7\x03<\x00Z\xff\xd7\x03<\x00[\xff\xd7\x03<\x00\ +\x5c\xff\xd7\x03<\x00]\xff\xec\x03<\x00\xbf\xff\xd7\x03\ +<\x017\xff\xd7\x03<\x01<\xff\xec\x03<\x01>\xff\ +\xec\x03<\x01@\xff\xec\x03<\x01\xfb\xff\xd7\x03<\x01\ +\xfd\xff\xd7\x03<\x02\x07\xff\xec\x03<\x02\x0b\xff\xec\x03\ +<\x03p\xff\xd7\x03=\x00-\x00{\x03>\x00\x05\xff\ +\xec\x03>\x00\x0a\xff\xec\x03>\x00Y\xff\xd7\x03>\x00\ +Z\xff\xd7\x03>\x00[\xff\xd7\x03>\x00\x5c\xff\xd7\x03\ +>\x00]\xff\xec\x03>\x00\xbf\xff\xd7\x03>\x017\xff\ +\xd7\x03>\x01<\xff\xec\x03>\x01>\xff\xec\x03>\x01\ +@\xff\xec\x03>\x01\xfb\xff\xd7\x03>\x01\xfd\xff\xd7\x03\ +>\x02\x07\xff\xec\x03>\x02\x0b\xff\xec\x03>\x03p\xff\ +\xd7\x03?\x00-\x00{\x03@\x00\x05\xff\xec\x03@\x00\ +\x0a\xff\xec\x03@\x00Y\xff\xd7\x03@\x00Z\xff\xd7\x03\ +@\x00[\xff\xd7\x03@\x00\x5c\xff\xd7\x03@\x00]\xff\ +\xec\x03@\x00\xbf\xff\xd7\x03@\x017\xff\xd7\x03@\x01\ +<\xff\xec\x03@\x01>\xff\xec\x03@\x01@\xff\xec\x03\ +@\x01\xfb\xff\xd7\x03@\x01\xfd\xff\xd7\x03@\x02\x07\xff\ +\xec\x03@\x02\x0b\xff\xec\x03@\x03p\xff\xd7\x03A\x00\ +-\x00{\x03B\x00\x05\xff\xec\x03B\x00\x0a\xff\xec\x03\ +B\x00Y\xff\xd7\x03B\x00Z\xff\xd7\x03B\x00[\xff\ +\xd7\x03B\x00\x5c\xff\xd7\x03B\x00]\xff\xec\x03B\x00\ +\xbf\xff\xd7\x03B\x017\xff\xd7\x03B\x01<\xff\xec\x03\ +B\x01>\xff\xec\x03B\x01@\xff\xec\x03B\x01\xfb\xff\ +\xd7\x03B\x01\xfd\xff\xd7\x03B\x02\x07\xff\xec\x03B\x02\ +\x0b\xff\xec\x03B\x03p\xff\xd7\x03C\x00-\x00{\x03\ +D\x00\x05\xff\xec\x03D\x00\x0a\xff\xec\x03D\x00Y\xff\ +\xd7\x03D\x00Z\xff\xd7\x03D\x00[\xff\xd7\x03D\x00\ +\x5c\xff\xd7\x03D\x00]\xff\xec\x03D\x00\xbf\xff\xd7\x03\ +D\x017\xff\xd7\x03D\x01<\xff\xec\x03D\x01>\xff\ +\xec\x03D\x01@\xff\xec\x03D\x01\xfb\xff\xd7\x03D\x01\ +\xfd\xff\xd7\x03D\x02\x07\xff\xec\x03D\x02\x0b\xff\xec\x03\ +D\x03p\xff\xd7\x03I\x00\x0f\xff\xae\x03I\x00\x11\xff\ +\xae\x03I\x00$\xff\xd7\x03I\x007\xff\xc3\x03I\x00\ +9\xff\xec\x03I\x00:\xff\xec\x03I\x00;\xff\xd7\x03\ +I\x00<\xff\xec\x03I\x00=\xff\xec\x03I\x00\x82\xff\ +\xd7\x03I\x00\x83\xff\xd7\x03I\x00\x84\xff\xd7\x03I\x00\ +\x85\xff\xd7\x03I\x00\x86\xff\xd7\x03I\x00\x87\xff\xd7\x03\ +I\x00\x9f\xff\xec\x03I\x00\xc2\xff\xd7\x03I\x00\xc4\xff\ +\xd7\x03I\x00\xc6\xff\xd7\x03I\x01$\xff\xc3\x03I\x01\ +&\xff\xc3\x03I\x016\xff\xec\x03I\x018\xff\xec\x03\ +I\x01:\xff\xec\x03I\x01;\xff\xec\x03I\x01=\xff\ +\xec\x03I\x01?\xff\xec\x03I\x01C\xff\xd7\x03I\x01\ +\xa0\xff\xec\x03I\x01\xfa\xff\xec\x03I\x01\xfc\xff\xec\x03\ +I\x01\xfe\xff\xec\x03I\x02\x00\xff\xec\x03I\x02\x08\xff\ +\xae\x03I\x02\x0c\xff\xae\x03I\x02X\xff\xd7\x03I\x03\ +\x1d\xff\xd7\x03I\x03\x1f\xff\xd7\x03I\x03!\xff\xd7\x03\ +I\x03#\xff\xd7\x03I\x03%\xff\xd7\x03I\x03'\xff\ +\xd7\x03I\x03)\xff\xd7\x03I\x03+\xff\xd7\x03I\x03\ +-\xff\xd7\x03I\x03/\xff\xd7\x03I\x031\xff\xd7\x03\ +I\x033\xff\xd7\x03I\x03o\xff\xec\x03I\x03q\xff\ +\xec\x03I\x03s\xff\xec\x03I\x03\x8f\xff\xc3\x03J\x00\ +\x05\xff\xec\x03J\x00\x0a\xff\xec\x03J\x00Y\xff\xd7\x03\ +J\x00Z\xff\xd7\x03J\x00[\xff\xd7\x03J\x00\x5c\xff\ +\xd7\x03J\x00]\xff\xec\x03J\x00\xbf\xff\xd7\x03J\x01\ +7\xff\xd7\x03J\x01<\xff\xec\x03J\x01>\xff\xec\x03\ +J\x01@\xff\xec\x03J\x01\xfb\xff\xd7\x03J\x01\xfd\xff\ +\xd7\x03J\x02\x07\xff\xec\x03J\x02\x0b\xff\xec\x03J\x03\ +p\xff\xd7\x03K\x00\x0f\xff\xae\x03K\x00\x11\xff\xae\x03\ +K\x00$\xff\xd7\x03K\x007\xff\xc3\x03K\x009\xff\ +\xec\x03K\x00:\xff\xec\x03K\x00;\xff\xd7\x03K\x00\ +<\xff\xec\x03K\x00=\xff\xec\x03K\x00\x82\xff\xd7\x03\ +K\x00\x83\xff\xd7\x03K\x00\x84\xff\xd7\x03K\x00\x85\xff\ +\xd7\x03K\x00\x86\xff\xd7\x03K\x00\x87\xff\xd7\x03K\x00\ +\x9f\xff\xec\x03K\x00\xc2\xff\xd7\x03K\x00\xc4\xff\xd7\x03\ +K\x00\xc6\xff\xd7\x03K\x01$\xff\xc3\x03K\x01&\xff\ +\xc3\x03K\x016\xff\xec\x03K\x018\xff\xec\x03K\x01\ +:\xff\xec\x03K\x01;\xff\xec\x03K\x01=\xff\xec\x03\ +K\x01?\xff\xec\x03K\x01C\xff\xd7\x03K\x01\xa0\xff\ +\xec\x03K\x01\xfa\xff\xec\x03K\x01\xfc\xff\xec\x03K\x01\ +\xfe\xff\xec\x03K\x02\x00\xff\xec\x03K\x02\x08\xff\xae\x03\ +K\x02\x0c\xff\xae\x03K\x02X\xff\xd7\x03K\x03\x1d\xff\ +\xd7\x03K\x03\x1f\xff\xd7\x03K\x03!\xff\xd7\x03K\x03\ +#\xff\xd7\x03K\x03%\xff\xd7\x03K\x03'\xff\xd7\x03\ +K\x03)\xff\xd7\x03K\x03+\xff\xd7\x03K\x03-\xff\ +\xd7\x03K\x03/\xff\xd7\x03K\x031\xff\xd7\x03K\x03\ +3\xff\xd7\x03K\x03o\xff\xec\x03K\x03q\xff\xec\x03\ +K\x03s\xff\xec\x03K\x03\x8f\xff\xc3\x03L\x00\x05\xff\ +\xec\x03L\x00\x0a\xff\xec\x03L\x00Y\xff\xd7\x03L\x00\ +Z\xff\xd7\x03L\x00[\xff\xd7\x03L\x00\x5c\xff\xd7\x03\ +L\x00]\xff\xec\x03L\x00\xbf\xff\xd7\x03L\x017\xff\ +\xd7\x03L\x01<\xff\xec\x03L\x01>\xff\xec\x03L\x01\ +@\xff\xec\x03L\x01\xfb\xff\xd7\x03L\x01\xfd\xff\xd7\x03\ +L\x02\x07\xff\xec\x03L\x02\x0b\xff\xec\x03L\x03p\xff\ +\xd7\x03M\x00\x0f\xff\xae\x03M\x00\x11\xff\xae\x03M\x00\ +$\xff\xd7\x03M\x007\xff\xc3\x03M\x009\xff\xec\x03\ +M\x00:\xff\xec\x03M\x00;\xff\xd7\x03M\x00<\xff\ +\xec\x03M\x00=\xff\xec\x03M\x00\x82\xff\xd7\x03M\x00\ +\x83\xff\xd7\x03M\x00\x84\xff\xd7\x03M\x00\x85\xff\xd7\x03\ +M\x00\x86\xff\xd7\x03M\x00\x87\xff\xd7\x03M\x00\x9f\xff\ +\xec\x03M\x00\xc2\xff\xd7\x03M\x00\xc4\xff\xd7\x03M\x00\ +\xc6\xff\xd7\x03M\x01$\xff\xc3\x03M\x01&\xff\xc3\x03\ +M\x016\xff\xec\x03M\x018\xff\xec\x03M\x01:\xff\ +\xec\x03M\x01;\xff\xec\x03M\x01=\xff\xec\x03M\x01\ +?\xff\xec\x03M\x01C\xff\xd7\x03M\x01\xa0\xff\xec\x03\ +M\x01\xfa\xff\xec\x03M\x01\xfc\xff\xec\x03M\x01\xfe\xff\ +\xec\x03M\x02\x00\xff\xec\x03M\x02\x08\xff\xae\x03M\x02\ +\x0c\xff\xae\x03M\x02X\xff\xd7\x03M\x03\x1d\xff\xd7\x03\ +M\x03\x1f\xff\xd7\x03M\x03!\xff\xd7\x03M\x03#\xff\ +\xd7\x03M\x03%\xff\xd7\x03M\x03'\xff\xd7\x03M\x03\ +)\xff\xd7\x03M\x03+\xff\xd7\x03M\x03-\xff\xd7\x03\ +M\x03/\xff\xd7\x03M\x031\xff\xd7\x03M\x033\xff\ +\xd7\x03M\x03o\xff\xec\x03M\x03q\xff\xec\x03M\x03\ +s\xff\xec\x03M\x03\x8f\xff\xc3\x03O\x00\x0f\xff\xae\x03\ +O\x00\x11\xff\xae\x03O\x00$\xff\xd7\x03O\x007\xff\ +\xc3\x03O\x009\xff\xec\x03O\x00:\xff\xec\x03O\x00\ +;\xff\xd7\x03O\x00<\xff\xec\x03O\x00=\xff\xec\x03\ +O\x00\x82\xff\xd7\x03O\x00\x83\xff\xd7\x03O\x00\x84\xff\ +\xd7\x03O\x00\x85\xff\xd7\x03O\x00\x86\xff\xd7\x03O\x00\ +\x87\xff\xd7\x03O\x00\x9f\xff\xec\x03O\x00\xc2\xff\xd7\x03\ +O\x00\xc4\xff\xd7\x03O\x00\xc6\xff\xd7\x03O\x01$\xff\ +\xc3\x03O\x01&\xff\xc3\x03O\x016\xff\xec\x03O\x01\ +8\xff\xec\x03O\x01:\xff\xec\x03O\x01;\xff\xec\x03\ +O\x01=\xff\xec\x03O\x01?\xff\xec\x03O\x01C\xff\ +\xd7\x03O\x01\xa0\xff\xec\x03O\x01\xfa\xff\xec\x03O\x01\ +\xfc\xff\xec\x03O\x01\xfe\xff\xec\x03O\x02\x00\xff\xec\x03\ +O\x02\x08\xff\xae\x03O\x02\x0c\xff\xae\x03O\x02X\xff\ +\xd7\x03O\x03\x1d\xff\xd7\x03O\x03\x1f\xff\xd7\x03O\x03\ +!\xff\xd7\x03O\x03#\xff\xd7\x03O\x03%\xff\xd7\x03\ +O\x03'\xff\xd7\x03O\x03)\xff\xd7\x03O\x03+\xff\ +\xd7\x03O\x03-\xff\xd7\x03O\x03/\xff\xd7\x03O\x03\ +1\xff\xd7\x03O\x033\xff\xd7\x03O\x03o\xff\xec\x03\ +O\x03q\xff\xec\x03O\x03s\xff\xec\x03O\x03\x8f\xff\ +\xc3\x03Q\x00\x0f\xff\xae\x03Q\x00\x11\xff\xae\x03Q\x00\ +$\xff\xd7\x03Q\x007\xff\xc3\x03Q\x009\xff\xec\x03\ +Q\x00:\xff\xec\x03Q\x00;\xff\xd7\x03Q\x00<\xff\ +\xec\x03Q\x00=\xff\xec\x03Q\x00\x82\xff\xd7\x03Q\x00\ +\x83\xff\xd7\x03Q\x00\x84\xff\xd7\x03Q\x00\x85\xff\xd7\x03\ +Q\x00\x86\xff\xd7\x03Q\x00\x87\xff\xd7\x03Q\x00\x9f\xff\ +\xec\x03Q\x00\xc2\xff\xd7\x03Q\x00\xc4\xff\xd7\x03Q\x00\ +\xc6\xff\xd7\x03Q\x01$\xff\xc3\x03Q\x01&\xff\xc3\x03\ +Q\x016\xff\xec\x03Q\x018\xff\xec\x03Q\x01:\xff\ +\xec\x03Q\x01;\xff\xec\x03Q\x01=\xff\xec\x03Q\x01\ +?\xff\xec\x03Q\x01C\xff\xd7\x03Q\x01\xa0\xff\xec\x03\ +Q\x01\xfa\xff\xec\x03Q\x01\xfc\xff\xec\x03Q\x01\xfe\xff\ +\xec\x03Q\x02\x00\xff\xec\x03Q\x02\x08\xff\xae\x03Q\x02\ +\x0c\xff\xae\x03Q\x02X\xff\xd7\x03Q\x03\x1d\xff\xd7\x03\ +Q\x03\x1f\xff\xd7\x03Q\x03!\xff\xd7\x03Q\x03#\xff\ +\xd7\x03Q\x03%\xff\xd7\x03Q\x03'\xff\xd7\x03Q\x03\ +)\xff\xd7\x03Q\x03+\xff\xd7\x03Q\x03-\xff\xd7\x03\ +Q\x03/\xff\xd7\x03Q\x031\xff\xd7\x03Q\x033\xff\ +\xd7\x03Q\x03o\xff\xec\x03Q\x03q\xff\xec\x03Q\x03\ +s\xff\xec\x03Q\x03\x8f\xff\xc3\x03S\x00\x0f\xff\xae\x03\ +S\x00\x11\xff\xae\x03S\x00$\xff\xd7\x03S\x007\xff\ +\xc3\x03S\x009\xff\xec\x03S\x00:\xff\xec\x03S\x00\ +;\xff\xd7\x03S\x00<\xff\xec\x03S\x00=\xff\xec\x03\ +S\x00\x82\xff\xd7\x03S\x00\x83\xff\xd7\x03S\x00\x84\xff\ +\xd7\x03S\x00\x85\xff\xd7\x03S\x00\x86\xff\xd7\x03S\x00\ +\x87\xff\xd7\x03S\x00\x9f\xff\xec\x03S\x00\xc2\xff\xd7\x03\ +S\x00\xc4\xff\xd7\x03S\x00\xc6\xff\xd7\x03S\x01$\xff\ +\xc3\x03S\x01&\xff\xc3\x03S\x016\xff\xec\x03S\x01\ +8\xff\xec\x03S\x01:\xff\xec\x03S\x01;\xff\xec\x03\ +S\x01=\xff\xec\x03S\x01?\xff\xec\x03S\x01C\xff\ +\xd7\x03S\x01\xa0\xff\xec\x03S\x01\xfa\xff\xec\x03S\x01\ +\xfc\xff\xec\x03S\x01\xfe\xff\xec\x03S\x02\x00\xff\xec\x03\ +S\x02\x08\xff\xae\x03S\x02\x0c\xff\xae\x03S\x02X\xff\ +\xd7\x03S\x03\x1d\xff\xd7\x03S\x03\x1f\xff\xd7\x03S\x03\ +!\xff\xd7\x03S\x03#\xff\xd7\x03S\x03%\xff\xd7\x03\ +S\x03'\xff\xd7\x03S\x03)\xff\xd7\x03S\x03+\xff\ +\xd7\x03S\x03-\xff\xd7\x03S\x03/\xff\xd7\x03S\x03\ +1\xff\xd7\x03S\x033\xff\xd7\x03S\x03o\xff\xec\x03\ +S\x03q\xff\xec\x03S\x03s\xff\xec\x03S\x03\x8f\xff\ +\xc3\x03U\x00\x0f\xff\xae\x03U\x00\x11\xff\xae\x03U\x00\ +$\xff\xd7\x03U\x007\xff\xc3\x03U\x009\xff\xec\x03\ +U\x00:\xff\xec\x03U\x00;\xff\xd7\x03U\x00<\xff\ +\xec\x03U\x00=\xff\xec\x03U\x00\x82\xff\xd7\x03U\x00\ +\x83\xff\xd7\x03U\x00\x84\xff\xd7\x03U\x00\x85\xff\xd7\x03\ +U\x00\x86\xff\xd7\x03U\x00\x87\xff\xd7\x03U\x00\x9f\xff\ +\xec\x03U\x00\xc2\xff\xd7\x03U\x00\xc4\xff\xd7\x03U\x00\ +\xc6\xff\xd7\x03U\x01$\xff\xc3\x03U\x01&\xff\xc3\x03\ +U\x016\xff\xec\x03U\x018\xff\xec\x03U\x01:\xff\ +\xec\x03U\x01;\xff\xec\x03U\x01=\xff\xec\x03U\x01\ +?\xff\xec\x03U\x01C\xff\xd7\x03U\x01\xa0\xff\xec\x03\ +U\x01\xfa\xff\xec\x03U\x01\xfc\xff\xec\x03U\x01\xfe\xff\ +\xec\x03U\x02\x00\xff\xec\x03U\x02\x08\xff\xae\x03U\x02\ +\x0c\xff\xae\x03U\x02X\xff\xd7\x03U\x03\x1d\xff\xd7\x03\ +U\x03\x1f\xff\xd7\x03U\x03!\xff\xd7\x03U\x03#\xff\ +\xd7\x03U\x03%\xff\xd7\x03U\x03'\xff\xd7\x03U\x03\ +)\xff\xd7\x03U\x03+\xff\xd7\x03U\x03-\xff\xd7\x03\ +U\x03/\xff\xd7\x03U\x031\xff\xd7\x03U\x033\xff\ +\xd7\x03U\x03o\xff\xec\x03U\x03q\xff\xec\x03U\x03\ +s\xff\xec\x03U\x03\x8f\xff\xc3\x03X\x00I\x00R\x03\ +X\x00W\x00R\x03X\x00Y\x00f\x03X\x00Z\x00\ +f\x03X\x00[\x00f\x03X\x00\x5c\x00f\x03X\x00\ +\xbf\x00f\x03X\x01%\x00R\x03X\x01'\x00R\x03\ +X\x017\x00f\x03X\x01\xfb\x00f\x03X\x01\xfd\x00\ +f\x03X\x024\x00R\x03X\x025\x00R\x03X\x02\ +]\x00R\x03X\x02^\x00R\x03X\x03p\x00f\x03\ +X\x03\x8d\x00R\x03X\x03\x90\x00R\x03Z\x00I\x00\ +R\x03Z\x00W\x00R\x03Z\x00Y\x00f\x03Z\x00\ +Z\x00f\x03Z\x00[\x00f\x03Z\x00\x5c\x00f\x03\ +Z\x00\xbf\x00f\x03Z\x01%\x00R\x03Z\x01'\x00\ +R\x03Z\x017\x00f\x03Z\x01\xfb\x00f\x03Z\x01\ +\xfd\x00f\x03Z\x024\x00R\x03Z\x025\x00R\x03\ +Z\x02]\x00R\x03Z\x02^\x00R\x03Z\x03p\x00\ +f\x03Z\x03\x8d\x00R\x03Z\x03\x90\x00R\x03\x5c\x00\ +I\x00R\x03\x5c\x00W\x00R\x03\x5c\x00Y\x00f\x03\ +\x5c\x00Z\x00f\x03\x5c\x00[\x00f\x03\x5c\x00\x5c\x00\ +f\x03\x5c\x00\xbf\x00f\x03\x5c\x01%\x00R\x03\x5c\x01\ +'\x00R\x03\x5c\x017\x00f\x03\x5c\x01\xfb\x00f\x03\ +\x5c\x01\xfd\x00f\x03\x5c\x024\x00R\x03\x5c\x025\x00\ +R\x03\x5c\x02]\x00R\x03\x5c\x02^\x00R\x03\x5c\x03\ +p\x00f\x03\x5c\x03\x8d\x00R\x03\x5c\x03\x90\x00R\x03\ +^\x00I\x00R\x03^\x00W\x00R\x03^\x00Y\x00\ +f\x03^\x00Z\x00f\x03^\x00[\x00f\x03^\x00\ +\x5c\x00f\x03^\x00\xbf\x00f\x03^\x01%\x00R\x03\ +^\x01'\x00R\x03^\x017\x00f\x03^\x01\xfb\x00\ +f\x03^\x01\xfd\x00f\x03^\x024\x00R\x03^\x02\ +5\x00R\x03^\x02]\x00R\x03^\x02^\x00R\x03\ +^\x03p\x00f\x03^\x03\x8d\x00R\x03^\x03\x90\x00\ +R\x03`\x00I\x00R\x03`\x00W\x00R\x03`\x00\ +Y\x00f\x03`\x00Z\x00f\x03`\x00[\x00f\x03\ +`\x00\x5c\x00f\x03`\x00\xbf\x00f\x03`\x01%\x00\ +R\x03`\x01'\x00R\x03`\x017\x00f\x03`\x01\ +\xfb\x00f\x03`\x01\xfd\x00f\x03`\x024\x00R\x03\ +`\x025\x00R\x03`\x02]\x00R\x03`\x02^\x00\ +R\x03`\x03p\x00f\x03`\x03\x8d\x00R\x03`\x03\ +\x90\x00R\x03a\x00\x0f\xff\xd7\x03a\x00\x11\xff\xd7\x03\ +a\x00$\xff\xec\x03a\x00\x82\xff\xec\x03a\x00\x83\xff\ +\xec\x03a\x00\x84\xff\xec\x03a\x00\x85\xff\xec\x03a\x00\ +\x86\xff\xec\x03a\x00\x87\xff\xec\x03a\x00\xc2\xff\xec\x03\ +a\x00\xc4\xff\xec\x03a\x00\xc6\xff\xec\x03a\x01C\xff\ +\xec\x03a\x02\x08\xff\xd7\x03a\x02\x0c\xff\xd7\x03a\x02\ +X\xff\xec\x03a\x03\x1d\xff\xec\x03a\x03\x1f\xff\xec\x03\ +a\x03!\xff\xec\x03a\x03#\xff\xec\x03a\x03%\xff\ +\xec\x03a\x03'\xff\xec\x03a\x03)\xff\xec\x03a\x03\ ++\xff\xec\x03a\x03-\xff\xec\x03a\x03/\xff\xec\x03\ +a\x031\xff\xec\x03a\x033\xff\xec\x03f\x00I\x00\ +f\x03f\x00W\x00f\x03f\x00Y\x00f\x03f\x00\ +Z\x00f\x03f\x00[\x00f\x03f\x00\x5c\x00f\x03\ +f\x00\xbf\x00f\x03f\x01%\x00f\x03f\x01'\x00\ +f\x03f\x017\x00f\x03f\x01\xfb\x00f\x03f\x01\ +\xfd\x00f\x03f\x024\x00f\x03f\x025\x00f\x03\ +f\x02]\x00f\x03f\x02^\x00f\x03f\x03p\x00\ +f\x03f\x03\x8d\x00f\x03f\x03\x90\x00f\x03h\x00\ +I\x00f\x03h\x00W\x00f\x03h\x00Y\x00f\x03\ +h\x00Z\x00f\x03h\x00[\x00f\x03h\x00\x5c\x00\ +f\x03h\x00\xbf\x00f\x03h\x01%\x00f\x03h\x01\ +'\x00f\x03h\x017\x00f\x03h\x01\xfb\x00f\x03\ +h\x01\xfd\x00f\x03h\x024\x00f\x03h\x025\x00\ +f\x03h\x02]\x00f\x03h\x02^\x00f\x03h\x03\ +p\x00f\x03h\x03\x8d\x00f\x03h\x03\x90\x00f\x03\ +j\x00I\x00f\x03j\x00W\x00f\x03j\x00Y\x00\ +f\x03j\x00Z\x00f\x03j\x00[\x00f\x03j\x00\ +\x5c\x00f\x03j\x00\xbf\x00f\x03j\x01%\x00f\x03\ +j\x01'\x00f\x03j\x017\x00f\x03j\x01\xfb\x00\ +f\x03j\x01\xfd\x00f\x03j\x024\x00f\x03j\x02\ +5\x00f\x03j\x02]\x00f\x03j\x02^\x00f\x03\ +j\x03p\x00f\x03j\x03\x8d\x00f\x03j\x03\x90\x00\ +f\x03l\x00I\x00f\x03l\x00W\x00f\x03l\x00\ +Y\x00f\x03l\x00Z\x00f\x03l\x00[\x00f\x03\ +l\x00\x5c\x00f\x03l\x00\xbf\x00f\x03l\x01%\x00\ +f\x03l\x01'\x00f\x03l\x017\x00f\x03l\x01\ +\xfb\x00f\x03l\x01\xfd\x00f\x03l\x024\x00f\x03\ +l\x025\x00f\x03l\x02]\x00f\x03l\x02^\x00\ +f\x03l\x03p\x00f\x03l\x03\x8d\x00f\x03l\x03\ +\x90\x00f\x03n\x00I\x00f\x03n\x00W\x00f\x03\ +n\x00Y\x00f\x03n\x00Z\x00f\x03n\x00[\x00\ +f\x03n\x00\x5c\x00f\x03n\x00\xbf\x00f\x03n\x01\ +%\x00f\x03n\x01'\x00f\x03n\x017\x00f\x03\ +n\x01\xfb\x00f\x03n\x01\xfd\x00f\x03n\x024\x00\ +f\x03n\x025\x00f\x03n\x02]\x00f\x03n\x02\ +^\x00f\x03n\x03p\x00f\x03n\x03\x8d\x00f\x03\ +n\x03\x90\x00f\x03o\x00\x0f\xff\x85\x03o\x00\x11\xff\ +\x85\x03o\x00\x22\x00)\x03o\x00$\xff\x85\x03o\x00\ +&\xff\xd7\x03o\x00*\xff\xd7\x03o\x002\xff\xd7\x03\ +o\x004\xff\xd7\x03o\x00D\xff\x9a\x03o\x00F\xff\ +\x9a\x03o\x00G\xff\x9a\x03o\x00H\xff\x9a\x03o\x00\ +J\xff\xd7\x03o\x00P\xff\xc3\x03o\x00Q\xff\xc3\x03\ +o\x00R\xff\x9a\x03o\x00S\xff\xc3\x03o\x00T\xff\ +\x9a\x03o\x00U\xff\xc3\x03o\x00V\xff\xae\x03o\x00\ +X\xff\xc3\x03o\x00]\xff\xd7\x03o\x00\x82\xff\x85\x03\ +o\x00\x83\xff\x85\x03o\x00\x84\xff\x85\x03o\x00\x85\xff\ +\x85\x03o\x00\x86\xff\x85\x03o\x00\x87\xff\x85\x03o\x00\ +\x89\xff\xd7\x03o\x00\x94\xff\xd7\x03o\x00\x95\xff\xd7\x03\ +o\x00\x96\xff\xd7\x03o\x00\x97\xff\xd7\x03o\x00\x98\xff\ +\xd7\x03o\x00\x9a\xff\xd7\x03o\x00\xa2\xff\x9a\x03o\x00\ +\xa3\xff\x9a\x03o\x00\xa4\xff\x9a\x03o\x00\xa5\xff\x9a\x03\ +o\x00\xa6\xff\x9a\x03o\x00\xa7\xff\x9a\x03o\x00\xa8\xff\ +\x9a\x03o\x00\xa9\xff\x9a\x03o\x00\xaa\xff\x9a\x03o\x00\ +\xab\xff\x9a\x03o\x00\xac\xff\x9a\x03o\x00\xad\xff\x9a\x03\ +o\x00\xb4\xff\x9a\x03o\x00\xb5\xff\x9a\x03o\x00\xb6\xff\ +\x9a\x03o\x00\xb7\xff\x9a\x03o\x00\xb8\xff\x9a\x03o\x00\ +\xba\xff\x9a\x03o\x00\xbb\xff\xc3\x03o\x00\xbc\xff\xc3\x03\ +o\x00\xbd\xff\xc3\x03o\x00\xbe\xff\xc3\x03o\x00\xc2\xff\ +\x85\x03o\x00\xc3\xff\x9a\x03o\x00\xc4\xff\x85\x03o\x00\ +\xc5\xff\x9a\x03o\x00\xc6\xff\x85\x03o\x00\xc7\xff\x9a\x03\ +o\x00\xc8\xff\xd7\x03o\x00\xc9\xff\x9a\x03o\x00\xca\xff\ +\xd7\x03o\x00\xcb\xff\x9a\x03o\x00\xcc\xff\xd7\x03o\x00\ +\xcd\xff\x9a\x03o\x00\xce\xff\xd7\x03o\x00\xcf\xff\x9a\x03\ +o\x00\xd1\xff\x9a\x03o\x00\xd3\xff\x9a\x03o\x00\xd5\xff\ +\x9a\x03o\x00\xd7\xff\x9a\x03o\x00\xd9\xff\x9a\x03o\x00\ +\xdb\xff\x9a\x03o\x00\xdd\xff\x9a\x03o\x00\xde\xff\xd7\x03\ +o\x00\xdf\xff\xd7\x03o\x00\xe0\xff\xd7\x03o\x00\xe1\xff\ +\xd7\x03o\x00\xe2\xff\xd7\x03o\x00\xe3\xff\xd7\x03o\x00\ +\xe4\xff\xd7\x03o\x00\xe5\xff\xd7\x03o\x00\xfa\xff\xc3\x03\ +o\x01\x06\xff\xc3\x03o\x01\x08\xff\xc3\x03o\x01\x0d\xff\ +\xc3\x03o\x01\x0e\xff\xd7\x03o\x01\x0f\xff\x9a\x03o\x01\ +\x10\xff\xd7\x03o\x01\x11\xff\x9a\x03o\x01\x12\xff\xd7\x03\ +o\x01\x13\xff\x9a\x03o\x01\x14\xff\xd7\x03o\x01\x15\xff\ +\x9a\x03o\x01\x17\xff\xc3\x03o\x01\x19\xff\xc3\x03o\x01\ +\x1d\xff\xae\x03o\x01!\xff\xae\x03o\x01+\xff\xc3\x03\ +o\x01-\xff\xc3\x03o\x01/\xff\xc3\x03o\x011\xff\ +\xc3\x03o\x013\xff\xc3\x03o\x015\xff\xc3\x03o\x01\ +<\xff\xd7\x03o\x01>\xff\xd7\x03o\x01@\xff\xd7\x03\ +o\x01C\xff\x85\x03o\x01D\xff\x9a\x03o\x01F\xff\ +\x9a\x03o\x01G\xff\xd7\x03o\x01H\xff\x9a\x03o\x01\ +J\xff\xae\x03o\x02\x08\xff\x85\x03o\x02\x0c\xff\x85\x03\ +o\x02W\xff\xc3\x03o\x02X\xff\x85\x03o\x02Y\xff\ +\x9a\x03o\x02_\xff\xd7\x03o\x02`\xff\x9a\x03o\x02\ +b\xff\xc3\x03o\x03\x1d\xff\x85\x03o\x03\x1e\xff\x9a\x03\ +o\x03\x1f\xff\x85\x03o\x03 \xff\x9a\x03o\x03!\xff\ +\x85\x03o\x03\x22\xff\x9a\x03o\x03#\xff\x85\x03o\x03\ +%\xff\x85\x03o\x03&\xff\x9a\x03o\x03'\xff\x85\x03\ +o\x03(\xff\x9a\x03o\x03)\xff\x85\x03o\x03*\xff\ +\x9a\x03o\x03+\xff\x85\x03o\x03,\xff\x9a\x03o\x03\ +-\xff\x85\x03o\x03.\xff\x9a\x03o\x03/\xff\x85\x03\ +o\x030\xff\x9a\x03o\x031\xff\x85\x03o\x032\xff\ +\x9a\x03o\x033\xff\x85\x03o\x034\xff\x9a\x03o\x03\ +6\xff\x9a\x03o\x038\xff\x9a\x03o\x03:\xff\x9a\x03\ +o\x03<\xff\x9a\x03o\x03@\xff\x9a\x03o\x03B\xff\ +\x9a\x03o\x03D\xff\x9a\x03o\x03I\xff\xd7\x03o\x03\ +J\xff\x9a\x03o\x03K\xff\xd7\x03o\x03L\xff\x9a\x03\ +o\x03M\xff\xd7\x03o\x03N\xff\x9a\x03o\x03O\xff\ +\xd7\x03o\x03Q\xff\xd7\x03o\x03R\xff\x9a\x03o\x03\ +S\xff\xd7\x03o\x03T\xff\x9a\x03o\x03U\xff\xd7\x03\ +o\x03V\xff\x9a\x03o\x03W\xff\xd7\x03o\x03X\xff\ +\x9a\x03o\x03Y\xff\xd7\x03o\x03Z\xff\x9a\x03o\x03\ +[\xff\xd7\x03o\x03\x5c\xff\x9a\x03o\x03]\xff\xd7\x03\ +o\x03^\xff\x9a\x03o\x03_\xff\xd7\x03o\x03`\xff\ +\x9a\x03o\x03b\xff\xc3\x03o\x03d\xff\xc3\x03o\x03\ +f\xff\xc3\x03o\x03h\xff\xc3\x03o\x03j\xff\xc3\x03\ +o\x03l\xff\xc3\x03o\x03n\xff\xc3\x03p\x00\x05\x00\ +R\x03p\x00\x0a\x00R\x03p\x00\x0f\xff\xae\x03p\x00\ +\x11\xff\xae\x03p\x00\x22\x00)\x03p\x02\x07\x00R\x03\ +p\x02\x08\xff\xae\x03p\x02\x0b\x00R\x03p\x02\x0c\xff\ +\xae\x03q\x00\x0f\xff\x85\x03q\x00\x11\xff\x85\x03q\x00\ +\x22\x00)\x03q\x00$\xff\x85\x03q\x00&\xff\xd7\x03\ +q\x00*\xff\xd7\x03q\x002\xff\xd7\x03q\x004\xff\ +\xd7\x03q\x00D\xff\x9a\x03q\x00F\xff\x9a\x03q\x00\ +G\xff\x9a\x03q\x00H\xff\x9a\x03q\x00J\xff\xd7\x03\ +q\x00P\xff\xc3\x03q\x00Q\xff\xc3\x03q\x00R\xff\ +\x9a\x03q\x00S\xff\xc3\x03q\x00T\xff\x9a\x03q\x00\ +U\xff\xc3\x03q\x00V\xff\xae\x03q\x00X\xff\xc3\x03\ +q\x00]\xff\xd7\x03q\x00\x82\xff\x85\x03q\x00\x83\xff\ +\x85\x03q\x00\x84\xff\x85\x03q\x00\x85\xff\x85\x03q\x00\ +\x86\xff\x85\x03q\x00\x87\xff\x85\x03q\x00\x89\xff\xd7\x03\ +q\x00\x94\xff\xd7\x03q\x00\x95\xff\xd7\x03q\x00\x96\xff\ +\xd7\x03q\x00\x97\xff\xd7\x03q\x00\x98\xff\xd7\x03q\x00\ +\x9a\xff\xd7\x03q\x00\xa2\xff\x9a\x03q\x00\xa3\xff\x9a\x03\ +q\x00\xa4\xff\x9a\x03q\x00\xa5\xff\x9a\x03q\x00\xa6\xff\ +\x9a\x03q\x00\xa7\xff\x9a\x03q\x00\xa8\xff\x9a\x03q\x00\ +\xa9\xff\x9a\x03q\x00\xaa\xff\x9a\x03q\x00\xab\xff\x9a\x03\ +q\x00\xac\xff\x9a\x03q\x00\xad\xff\x9a\x03q\x00\xb4\xff\ +\x9a\x03q\x00\xb5\xff\x9a\x03q\x00\xb6\xff\x9a\x03q\x00\ +\xb7\xff\x9a\x03q\x00\xb8\xff\x9a\x03q\x00\xba\xff\x9a\x03\ +q\x00\xbb\xff\xc3\x03q\x00\xbc\xff\xc3\x03q\x00\xbd\xff\ +\xc3\x03q\x00\xbe\xff\xc3\x03q\x00\xc2\xff\x85\x03q\x00\ +\xc3\xff\x9a\x03q\x00\xc4\xff\x85\x03q\x00\xc5\xff\x9a\x03\ +q\x00\xc6\xff\x85\x03q\x00\xc7\xff\x9a\x03q\x00\xc8\xff\ +\xd7\x03q\x00\xc9\xff\x9a\x03q\x00\xca\xff\xd7\x03q\x00\ +\xcb\xff\x9a\x03q\x00\xcc\xff\xd7\x03q\x00\xcd\xff\x9a\x03\ +q\x00\xce\xff\xd7\x03q\x00\xcf\xff\x9a\x03q\x00\xd1\xff\ +\x9a\x03q\x00\xd3\xff\x9a\x03q\x00\xd5\xff\x9a\x03q\x00\ +\xd7\xff\x9a\x03q\x00\xd9\xff\x9a\x03q\x00\xdb\xff\x9a\x03\ +q\x00\xdd\xff\x9a\x03q\x00\xde\xff\xd7\x03q\x00\xdf\xff\ +\xd7\x03q\x00\xe0\xff\xd7\x03q\x00\xe1\xff\xd7\x03q\x00\ +\xe2\xff\xd7\x03q\x00\xe3\xff\xd7\x03q\x00\xe4\xff\xd7\x03\ +q\x00\xe5\xff\xd7\x03q\x00\xfa\xff\xc3\x03q\x01\x06\xff\ +\xc3\x03q\x01\x08\xff\xc3\x03q\x01\x0d\xff\xc3\x03q\x01\ +\x0e\xff\xd7\x03q\x01\x0f\xff\x9a\x03q\x01\x10\xff\xd7\x03\ +q\x01\x11\xff\x9a\x03q\x01\x12\xff\xd7\x03q\x01\x13\xff\ +\x9a\x03q\x01\x14\xff\xd7\x03q\x01\x15\xff\x9a\x03q\x01\ +\x17\xff\xc3\x03q\x01\x19\xff\xc3\x03q\x01\x1d\xff\xae\x03\ +q\x01!\xff\xae\x03q\x01+\xff\xc3\x03q\x01-\xff\ +\xc3\x03q\x01/\xff\xc3\x03q\x011\xff\xc3\x03q\x01\ +3\xff\xc3\x03q\x015\xff\xc3\x03q\x01<\xff\xd7\x03\ +q\x01>\xff\xd7\x03q\x01@\xff\xd7\x03q\x01C\xff\ +\x85\x03q\x01D\xff\x9a\x03q\x01F\xff\x9a\x03q\x01\ +G\xff\xd7\x03q\x01H\xff\x9a\x03q\x01J\xff\xae\x03\ +q\x02\x08\xff\x85\x03q\x02\x0c\xff\x85\x03q\x02W\xff\ +\xc3\x03q\x02X\xff\x85\x03q\x02Y\xff\x9a\x03q\x02\ +_\xff\xd7\x03q\x02`\xff\x9a\x03q\x02b\xff\xc3\x03\ +q\x03\x1d\xff\x85\x03q\x03\x1e\xff\x9a\x03q\x03\x1f\xff\ +\x85\x03q\x03 \xff\x9a\x03q\x03!\xff\x85\x03q\x03\ +\x22\xff\x9a\x03q\x03#\xff\x85\x03q\x03%\xff\x85\x03\ +q\x03&\xff\x9a\x03q\x03'\xff\x85\x03q\x03(\xff\ +\x9a\x03q\x03)\xff\x85\x03q\x03*\xff\x9a\x03q\x03\ ++\xff\x85\x03q\x03,\xff\x9a\x03q\x03-\xff\x85\x03\ +q\x03.\xff\x9a\x03q\x03/\xff\x85\x03q\x030\xff\ +\x9a\x03q\x031\xff\x85\x03q\x032\xff\x9a\x03q\x03\ +3\xff\x85\x03q\x034\xff\x9a\x03q\x036\xff\x9a\x03\ +q\x038\xff\x9a\x03q\x03:\xff\x9a\x03q\x03<\xff\ +\x9a\x03q\x03@\xff\x9a\x03q\x03B\xff\x9a\x03q\x03\ +D\xff\x9a\x03q\x03I\xff\xd7\x03q\x03J\xff\x9a\x03\ +q\x03K\xff\xd7\x03q\x03L\xff\x9a\x03q\x03M\xff\ +\xd7\x03q\x03N\xff\x9a\x03q\x03O\xff\xd7\x03q\x03\ +Q\xff\xd7\x03q\x03R\xff\x9a\x03q\x03S\xff\xd7\x03\ +q\x03T\xff\x9a\x03q\x03U\xff\xd7\x03q\x03V\xff\ +\x9a\x03q\x03W\xff\xd7\x03q\x03X\xff\x9a\x03q\x03\ +Y\xff\xd7\x03q\x03Z\xff\x9a\x03q\x03[\xff\xd7\x03\ +q\x03\x5c\xff\x9a\x03q\x03]\xff\xd7\x03q\x03^\xff\ +\x9a\x03q\x03_\xff\xd7\x03q\x03`\xff\x9a\x03q\x03\ +b\xff\xc3\x03q\x03d\xff\xc3\x03q\x03f\xff\xc3\x03\ +q\x03h\xff\xc3\x03q\x03j\xff\xc3\x03q\x03l\xff\ +\xc3\x03q\x03n\xff\xc3\x03r\x00\x05\x00R\x03r\x00\ +\x0a\x00R\x03r\x00\x0f\xff\xae\x03r\x00\x11\xff\xae\x03\ +r\x00\x22\x00)\x03r\x02\x07\x00R\x03r\x02\x08\xff\ +\xae\x03r\x02\x0b\x00R\x03r\x02\x0c\xff\xae\x03s\x00\ +\x0f\xff\x85\x03s\x00\x11\xff\x85\x03s\x00\x22\x00)\x03\ +s\x00$\xff\x85\x03s\x00&\xff\xd7\x03s\x00*\xff\ +\xd7\x03s\x002\xff\xd7\x03s\x004\xff\xd7\x03s\x00\ +D\xff\x9a\x03s\x00F\xff\x9a\x03s\x00G\xff\x9a\x03\ +s\x00H\xff\x9a\x03s\x00J\xff\xd7\x03s\x00P\xff\ +\xc3\x03s\x00Q\xff\xc3\x03s\x00R\xff\x9a\x03s\x00\ +S\xff\xc3\x03s\x00T\xff\x9a\x03s\x00U\xff\xc3\x03\ +s\x00V\xff\xae\x03s\x00X\xff\xc3\x03s\x00]\xff\ +\xd7\x03s\x00\x82\xff\x85\x03s\x00\x83\xff\x85\x03s\x00\ +\x84\xff\x85\x03s\x00\x85\xff\x85\x03s\x00\x86\xff\x85\x03\ +s\x00\x87\xff\x85\x03s\x00\x89\xff\xd7\x03s\x00\x94\xff\ +\xd7\x03s\x00\x95\xff\xd7\x03s\x00\x96\xff\xd7\x03s\x00\ +\x97\xff\xd7\x03s\x00\x98\xff\xd7\x03s\x00\x9a\xff\xd7\x03\ +s\x00\xa2\xff\x9a\x03s\x00\xa3\xff\x9a\x03s\x00\xa4\xff\ +\x9a\x03s\x00\xa5\xff\x9a\x03s\x00\xa6\xff\x9a\x03s\x00\ +\xa7\xff\x9a\x03s\x00\xa8\xff\x9a\x03s\x00\xa9\xff\x9a\x03\ +s\x00\xaa\xff\x9a\x03s\x00\xab\xff\x9a\x03s\x00\xac\xff\ +\x9a\x03s\x00\xad\xff\x9a\x03s\x00\xb4\xff\x9a\x03s\x00\ +\xb5\xff\x9a\x03s\x00\xb6\xff\x9a\x03s\x00\xb7\xff\x9a\x03\ +s\x00\xb8\xff\x9a\x03s\x00\xba\xff\x9a\x03s\x00\xbb\xff\ +\xc3\x03s\x00\xbc\xff\xc3\x03s\x00\xbd\xff\xc3\x03s\x00\ +\xbe\xff\xc3\x03s\x00\xc2\xff\x85\x03s\x00\xc3\xff\x9a\x03\ +s\x00\xc4\xff\x85\x03s\x00\xc5\xff\x9a\x03s\x00\xc6\xff\ +\x85\x03s\x00\xc7\xff\x9a\x03s\x00\xc8\xff\xd7\x03s\x00\ +\xc9\xff\x9a\x03s\x00\xca\xff\xd7\x03s\x00\xcb\xff\x9a\x03\ +s\x00\xcc\xff\xd7\x03s\x00\xcd\xff\x9a\x03s\x00\xce\xff\ +\xd7\x03s\x00\xcf\xff\x9a\x03s\x00\xd1\xff\x9a\x03s\x00\ +\xd3\xff\x9a\x03s\x00\xd5\xff\x9a\x03s\x00\xd7\xff\x9a\x03\ +s\x00\xd9\xff\x9a\x03s\x00\xdb\xff\x9a\x03s\x00\xdd\xff\ +\x9a\x03s\x00\xde\xff\xd7\x03s\x00\xdf\xff\xd7\x03s\x00\ +\xe0\xff\xd7\x03s\x00\xe1\xff\xd7\x03s\x00\xe2\xff\xd7\x03\ +s\x00\xe3\xff\xd7\x03s\x00\xe4\xff\xd7\x03s\x00\xe5\xff\ +\xd7\x03s\x00\xfa\xff\xc3\x03s\x01\x06\xff\xc3\x03s\x01\ +\x08\xff\xc3\x03s\x01\x0d\xff\xc3\x03s\x01\x0e\xff\xd7\x03\ +s\x01\x0f\xff\x9a\x03s\x01\x10\xff\xd7\x03s\x01\x11\xff\ +\x9a\x03s\x01\x12\xff\xd7\x03s\x01\x13\xff\x9a\x03s\x01\ +\x14\xff\xd7\x03s\x01\x15\xff\x9a\x03s\x01\x17\xff\xc3\x03\ +s\x01\x19\xff\xc3\x03s\x01\x1d\xff\xae\x03s\x01!\xff\ +\xae\x03s\x01+\xff\xc3\x03s\x01-\xff\xc3\x03s\x01\ +/\xff\xc3\x03s\x011\xff\xc3\x03s\x013\xff\xc3\x03\ +s\x015\xff\xc3\x03s\x01<\xff\xd7\x03s\x01>\xff\ +\xd7\x03s\x01@\xff\xd7\x03s\x01C\xff\x85\x03s\x01\ +D\xff\x9a\x03s\x01F\xff\x9a\x03s\x01G\xff\xd7\x03\ +s\x01H\xff\x9a\x03s\x01J\xff\xae\x03s\x02\x08\xff\ +\x85\x03s\x02\x0c\xff\x85\x03s\x02W\xff\xc3\x03s\x02\ +X\xff\x85\x03s\x02Y\xff\x9a\x03s\x02_\xff\xd7\x03\ +s\x02`\xff\x9a\x03s\x02b\xff\xc3\x03s\x03\x1d\xff\ +\x85\x03s\x03\x1e\xff\x9a\x03s\x03\x1f\xff\x85\x03s\x03\ + \xff\x9a\x03s\x03!\xff\x85\x03s\x03\x22\xff\x9a\x03\ +s\x03#\xff\x85\x03s\x03%\xff\x85\x03s\x03&\xff\ +\x9a\x03s\x03'\xff\x85\x03s\x03(\xff\x9a\x03s\x03\ +)\xff\x85\x03s\x03*\xff\x9a\x03s\x03+\xff\x85\x03\ +s\x03,\xff\x9a\x03s\x03-\xff\x85\x03s\x03.\xff\ +\x9a\x03s\x03/\xff\x85\x03s\x030\xff\x9a\x03s\x03\ +1\xff\x85\x03s\x032\xff\x9a\x03s\x033\xff\x85\x03\ +s\x034\xff\x9a\x03s\x036\xff\x9a\x03s\x038\xff\ +\x9a\x03s\x03:\xff\x9a\x03s\x03<\xff\x9a\x03s\x03\ +@\xff\x9a\x03s\x03B\xff\x9a\x03s\x03D\xff\x9a\x03\ +s\x03I\xff\xd7\x03s\x03J\xff\x9a\x03s\x03K\xff\ +\xd7\x03s\x03L\xff\x9a\x03s\x03M\xff\xd7\x03s\x03\ +N\xff\x9a\x03s\x03O\xff\xd7\x03s\x03Q\xff\xd7\x03\ +s\x03R\xff\x9a\x03s\x03S\xff\xd7\x03s\x03T\xff\ +\x9a\x03s\x03U\xff\xd7\x03s\x03V\xff\x9a\x03s\x03\ +W\xff\xd7\x03s\x03X\xff\x9a\x03s\x03Y\xff\xd7\x03\ +s\x03Z\xff\x9a\x03s\x03[\xff\xd7\x03s\x03\x5c\xff\ +\x9a\x03s\x03]\xff\xd7\x03s\x03^\xff\x9a\x03s\x03\ +_\xff\xd7\x03s\x03`\xff\x9a\x03s\x03b\xff\xc3\x03\ +s\x03d\xff\xc3\x03s\x03f\xff\xc3\x03s\x03h\xff\ +\xc3\x03s\x03j\xff\xc3\x03s\x03l\xff\xc3\x03s\x03\ +n\xff\xc3\x03t\x00\x05\x00R\x03t\x00\x0a\x00R\x03\ +t\x00\x0f\xff\xae\x03t\x00\x11\xff\xae\x03t\x00\x22\x00\ +)\x03t\x02\x07\x00R\x03t\x02\x08\xff\xae\x03t\x02\ +\x0b\x00R\x03t\x02\x0c\xff\xae\x03\x8d\x00\x05\x00{\x03\ +\x8d\x00\x0a\x00{\x03\x8d\x02\x07\x00{\x03\x8d\x02\x0b\x00\ +{\x03\x8f\x00\x0f\xff\x85\x03\x8f\x00\x10\xff\xae\x03\x8f\x00\ +\x11\xff\x85\x03\x8f\x00\x22\x00)\x03\x8f\x00$\xffq\x03\ +\x8f\x00&\xff\xd7\x03\x8f\x00*\xff\xd7\x03\x8f\x002\xff\ +\xd7\x03\x8f\x004\xff\xd7\x03\x8f\x007\x00)\x03\x8f\x00\ +D\xff\x5c\x03\x8f\x00F\xffq\x03\x8f\x00G\xffq\x03\ +\x8f\x00H\xffq\x03\x8f\x00J\xffq\x03\x8f\x00P\xff\ +\x9a\x03\x8f\x00Q\xff\x9a\x03\x8f\x00R\xffq\x03\x8f\x00\ +S\xff\x9a\x03\x8f\x00T\xffq\x03\x8f\x00U\xff\x9a\x03\ +\x8f\x00V\xff\x85\x03\x8f\x00X\xff\x9a\x03\x8f\x00Y\xff\ +\xd7\x03\x8f\x00Z\xff\xd7\x03\x8f\x00[\xff\xd7\x03\x8f\x00\ +\x5c\xff\xd7\x03\x8f\x00]\xff\xae\x03\x8f\x00\x82\xffq\x03\ +\x8f\x00\x83\xffq\x03\x8f\x00\x84\xffq\x03\x8f\x00\x85\xff\ +q\x03\x8f\x00\x86\xffq\x03\x8f\x00\x87\xffq\x03\x8f\x00\ +\x89\xff\xd7\x03\x8f\x00\x94\xff\xd7\x03\x8f\x00\x95\xff\xd7\x03\ +\x8f\x00\x96\xff\xd7\x03\x8f\x00\x97\xff\xd7\x03\x8f\x00\x98\xff\ +\xd7\x03\x8f\x00\x9a\xff\xd7\x03\x8f\x00\xa2\xffq\x03\x8f\x00\ +\xa3\xff\x5c\x03\x8f\x00\xa4\xff\x5c\x03\x8f\x00\xa5\xff\x5c\x03\ +\x8f\x00\xa6\xff\x5c\x03\x8f\x00\xa7\xff\x5c\x03\x8f\x00\xa8\xff\ +\x5c\x03\x8f\x00\xa9\xffq\x03\x8f\x00\xaa\xffq\x03\x8f\x00\ +\xab\xffq\x03\x8f\x00\xac\xffq\x03\x8f\x00\xad\xffq\x03\ +\x8f\x00\xb4\xffq\x03\x8f\x00\xb5\xffq\x03\x8f\x00\xb6\xff\ +q\x03\x8f\x00\xb7\xffq\x03\x8f\x00\xb8\xffq\x03\x8f\x00\ +\xba\xffq\x03\x8f\x00\xbb\xff\x9a\x03\x8f\x00\xbc\xff\x9a\x03\ +\x8f\x00\xbd\xff\x9a\x03\x8f\x00\xbe\xff\x9a\x03\x8f\x00\xbf\xff\ +\xd7\x03\x8f\x00\xc2\xffq\x03\x8f\x00\xc3\xff\x5c\x03\x8f\x00\ +\xc4\xffq\x03\x8f\x00\xc5\xff\x5c\x03\x8f\x00\xc6\xffq\x03\ +\x8f\x00\xc7\xff\x5c\x03\x8f\x00\xc8\xff\xd7\x03\x8f\x00\xc9\xff\ +q\x03\x8f\x00\xca\xff\xd7\x03\x8f\x00\xcb\xffq\x03\x8f\x00\ +\xcc\xff\xd7\x03\x8f\x00\xcd\xffq\x03\x8f\x00\xce\xff\xd7\x03\ +\x8f\x00\xcf\xffq\x03\x8f\x00\xd1\xffq\x03\x8f\x00\xd3\xff\ +q\x03\x8f\x00\xd5\xffq\x03\x8f\x00\xd7\xffq\x03\x8f\x00\ +\xd9\xffq\x03\x8f\x00\xdb\xffq\x03\x8f\x00\xdd\xffq\x03\ +\x8f\x00\xde\xff\xd7\x03\x8f\x00\xdf\xffq\x03\x8f\x00\xe0\xff\ +\xd7\x03\x8f\x00\xe1\xffq\x03\x8f\x00\xe2\xff\xd7\x03\x8f\x00\ +\xe3\xffq\x03\x8f\x00\xe4\xff\xd7\x03\x8f\x00\xe5\xffq\x03\ +\x8f\x00\xfa\xff\x9a\x03\x8f\x01\x06\xff\x9a\x03\x8f\x01\x08\xff\ +\x9a\x03\x8f\x01\x0d\xff\x9a\x03\x8f\x01\x0e\xff\xd7\x03\x8f\x01\ +\x0f\xffq\x03\x8f\x01\x10\xff\xd7\x03\x8f\x01\x11\xffq\x03\ +\x8f\x01\x12\xff\xd7\x03\x8f\x01\x13\xffq\x03\x8f\x01\x14\xff\ +\xd7\x03\x8f\x01\x15\xffq\x03\x8f\x01\x17\xff\x9a\x03\x8f\x01\ +\x19\xff\x9a\x03\x8f\x01\x1d\xff\x85\x03\x8f\x01!\xff\x85\x03\ +\x8f\x01$\x00)\x03\x8f\x01&\x00)\x03\x8f\x01+\xff\ +\x9a\x03\x8f\x01-\xff\x9a\x03\x8f\x01/\xff\x9a\x03\x8f\x01\ +1\xff\x9a\x03\x8f\x013\xff\x9a\x03\x8f\x015\xff\x9a\x03\ +\x8f\x017\xff\xd7\x03\x8f\x01<\xff\xae\x03\x8f\x01>\xff\ +\xae\x03\x8f\x01@\xff\xae\x03\x8f\x01C\xffq\x03\x8f\x01\ +D\xff\x5c\x03\x8f\x01F\xff\x5c\x03\x8f\x01G\xff\xd7\x03\ +\x8f\x01H\xffq\x03\x8f\x01J\xff\x85\x03\x8f\x01\xfb\xff\ +\xd7\x03\x8f\x01\xfd\xff\xd7\x03\x8f\x02\x02\xff\xae\x03\x8f\x02\ +\x03\xff\xae\x03\x8f\x02\x04\xff\xae\x03\x8f\x02\x08\xff\x85\x03\ +\x8f\x02\x0c\xff\x85\x03\x8f\x02W\xff\x9a\x03\x8f\x02X\xff\ +q\x03\x8f\x02Y\xff\x5c\x03\x8f\x02_\xff\xd7\x03\x8f\x02\ +`\xffq\x03\x8f\x02b\xff\x9a\x03\x8f\x03\x1d\xffq\x03\ +\x8f\x03\x1e\xff\x5c\x03\x8f\x03\x1f\xffq\x03\x8f\x03 \xff\ +\x5c\x03\x8f\x03!\xffq\x03\x8f\x03\x22\xff\x5c\x03\x8f\x03\ +#\xffq\x03\x8f\x03%\xffq\x03\x8f\x03&\xff\x5c\x03\ +\x8f\x03'\xffq\x03\x8f\x03(\xff\x5c\x03\x8f\x03)\xff\ +q\x03\x8f\x03*\xff\x5c\x03\x8f\x03+\xffq\x03\x8f\x03\ +,\xff\x5c\x03\x8f\x03-\xffq\x03\x8f\x03.\xff\x5c\x03\ +\x8f\x03/\xffq\x03\x8f\x030\xff\x5c\x03\x8f\x031\xff\ +q\x03\x8f\x032\xff\x5c\x03\x8f\x033\xffq\x03\x8f\x03\ +4\xff\x5c\x03\x8f\x036\xffq\x03\x8f\x038\xffq\x03\ +\x8f\x03:\xffq\x03\x8f\x03<\xffq\x03\x8f\x03@\xff\ +q\x03\x8f\x03B\xffq\x03\x8f\x03D\xffq\x03\x8f\x03\ +I\xff\xd7\x03\x8f\x03J\xffq\x03\x8f\x03K\xff\xd7\x03\ +\x8f\x03L\xffq\x03\x8f\x03M\xff\xd7\x03\x8f\x03N\xff\ +q\x03\x8f\x03O\xff\xd7\x03\x8f\x03Q\xff\xd7\x03\x8f\x03\ +R\xffq\x03\x8f\x03S\xff\xd7\x03\x8f\x03T\xffq\x03\ +\x8f\x03U\xff\xd7\x03\x8f\x03V\xffq\x03\x8f\x03W\xff\ +\xd7\x03\x8f\x03X\xffq\x03\x8f\x03Y\xff\xd7\x03\x8f\x03\ +Z\xffq\x03\x8f\x03[\xff\xd7\x03\x8f\x03\x5c\xffq\x03\ +\x8f\x03]\xff\xd7\x03\x8f\x03^\xffq\x03\x8f\x03_\xff\ +\xd7\x03\x8f\x03`\xffq\x03\x8f\x03b\xff\x9a\x03\x8f\x03\ +d\xff\x9a\x03\x8f\x03f\xff\x9a\x03\x8f\x03h\xff\x9a\x03\ +\x8f\x03j\xff\x9a\x03\x8f\x03l\xff\x9a\x03\x8f\x03n\xff\ +\x9a\x03\x8f\x03p\xff\xd7\x03\x8f\x03\x8f\x00)\x03\x90\x00\ +\x05\x00)\x03\x90\x00\x0a\x00)\x03\x90\x02\x07\x00)\x03\ +\x90\x02\x0b\x00)\x00\x00\x00\x00\x00\x1e\x01n\x00\x01\x00\ +\x00\x00\x00\x00\x00\x004\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x12\x004\x00\x01\x00\x00\x00\x00\x00\x02\x00\x07\x00\ +F\x00\x01\x00\x00\x00\x00\x00\x03\x00'\x00M\x00\x01\x00\ +\x00\x00\x00\x00\x04\x00\x12\x004\x00\x01\x00\x00\x00\x00\x00\ +\x05\x00\x0c\x00t\x00\x01\x00\x00\x00\x00\x00\x06\x00\x11\x00\ +\x80\x00\x01\x00\x00\x00\x00\x00\x07\x00R\x00\x91\x00\x01\x00\ +\x00\x00\x00\x00\x08\x00\x14\x00\xe3\x00\x01\x00\x00\x00\x00\x00\ +\x0b\x00\x1c\x00\xf7\x00\x01\x00\x00\x00\x00\x00\x0c\x00.\x01\ +\x13\x00\x01\x00\x00\x00\x00\x00\x0d\x00.\x01A\x00\x01\x00\ +\x00\x00\x00\x00\x0e\x00*\x01o\x00\x01\x00\x00\x00\x00\x00\ +\x10\x00\x09\x004\x00\x01\x00\x00\x00\x00\x00\x11\x00\x08\x00\ +>\x00\x03\x00\x01\x04\x09\x00\x00\x00h\x01\x99\x00\x03\x00\ +\x01\x04\x09\x00\x01\x00$\x02\x01\x00\x03\x00\x01\x04\x09\x00\ +\x02\x00\x0e\x02%\x00\x03\x00\x01\x04\x09\x00\x03\x00N\x02\ +3\x00\x03\x00\x01\x04\x09\x00\x04\x00$\x02\x01\x00\x03\x00\ +\x01\x04\x09\x00\x05\x00\x18\x02\x81\x00\x03\x00\x01\x04\x09\x00\ +\x06\x00\x22\x02\x99\x00\x03\x00\x01\x04\x09\x00\x07\x00\xa4\x02\ +\xbb\x00\x03\x00\x01\x04\x09\x00\x08\x00(\x03_\x00\x03\x00\ +\x01\x04\x09\x00\x0b\x008\x03\x87\x00\x03\x00\x01\x04\x09\x00\ +\x0c\x00\x5c\x03\xbf\x00\x03\x00\x01\x04\x09\x00\x0d\x00\x5c\x04\ +\x1b\x00\x03\x00\x01\x04\x09\x00\x0e\x00T\x04w\x00\x03\x00\ +\x01\x04\x09\x00\x10\x00\x12\x02\x01\x00\x03\x00\x01\x04\x09\x00\ +\x11\x00\x10\x02\x15Digitized d\ +ata copyright \xa9 \ +2011, Google Cor\ +poration.Open Sa\ +ns SemiboldRegul\ +arAscender - Ope\ +n Sans Semibold \ +Build 100Version\ + 1.10OpenSans-Se\ +miboldOpen Sans \ +is a trademark o\ +f Google and may\ + be registered i\ +n certain jurisd\ +ictions.Ascender\ + Corporationhttp\ +://www.ascenderc\ +orp.com/http://w\ +ww.ascendercorp.\ +com/typedesigner\ +s.htmlLicensed u\ +nder the Apache \ +License, Version\ + 2.0http://www.a\ +pache.org/licens\ +es/LICENSE-2.0\x00D\ +\x00i\x00g\x00i\x00t\x00i\x00z\x00e\x00d\ +\x00 \x00d\x00a\x00t\x00a\x00 \x00c\x00o\ +\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \ +\x00\xa9\x00 \x002\x000\x001\x001\x00,\x00 \ +\x00G\x00o\x00o\x00g\x00l\x00e\x00 \x00C\ +\x00o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\ +\x00o\x00n\x00.\x00O\x00p\x00e\x00n\x00 \ +\x00S\x00a\x00n\x00s\x00 \x00S\x00e\x00m\ +\x00i\x00b\x00o\x00l\x00d\x00R\x00e\x00g\ +\x00u\x00l\x00a\x00r\x00A\x00s\x00c\x00e\ +\x00n\x00d\x00e\x00r\x00 \x00-\x00 \x00O\ +\x00p\x00e\x00n\x00 \x00S\x00a\x00n\x00s\ +\x00 \x00S\x00e\x00m\x00i\x00b\x00o\x00l\ +\x00d\x00 \x00B\x00u\x00i\x00l\x00d\x00 \ +\x001\x000\x000\x00V\x00e\x00r\x00s\x00i\ +\x00o\x00n\x00 \x001\x00.\x001\x000\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\ +\x00S\x00e\x00m\x00i\x00b\x00o\x00l\x00d\ +\x00O\x00p\x00e\x00n\x00 \x00S\x00a\x00n\ +\x00s\x00 \x00i\x00s\x00 \x00a\x00 \x00t\ +\x00r\x00a\x00d\x00e\x00m\x00a\x00r\x00k\ +\x00 \x00o\x00f\x00 \x00G\x00o\x00o\x00g\ +\x00l\x00e\x00 \x00a\x00n\x00d\x00 \x00m\ +\x00a\x00y\x00 \x00b\x00e\x00 \x00r\x00e\ +\x00g\x00i\x00s\x00t\x00e\x00r\x00e\x00d\ +\x00 \x00i\x00n\x00 \x00c\x00e\x00r\x00t\ +\x00a\x00i\x00n\x00 \x00j\x00u\x00r\x00i\ +\x00s\x00d\x00i\x00c\x00t\x00i\x00o\x00n\ +\x00s\x00.\x00A\x00s\x00c\x00e\x00n\x00d\ +\x00e\x00r\x00 \x00C\x00o\x00r\x00p\x00o\ +\x00r\x00a\x00t\x00i\x00o\x00n\x00h\x00t\ +\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\ +\x00.\x00a\x00s\x00c\x00e\x00n\x00d\x00e\ +\x00r\x00c\x00o\x00r\x00p\x00.\x00c\x00o\ +\x00m\x00/\x00h\x00t\x00t\x00p\x00:\x00/\ +\x00/\x00w\x00w\x00w\x00.\x00a\x00s\x00c\ +\x00e\x00n\x00d\x00e\x00r\x00c\x00o\x00r\ +\x00p\x00.\x00c\x00o\x00m\x00/\x00t\x00y\ +\x00p\x00e\x00d\x00e\x00s\x00i\x00g\x00n\ +\x00e\x00r\x00s\x00.\x00h\x00t\x00m\x00l\ +\x00L\x00i\x00c\x00e\x00n\x00s\x00e\x00d\ +\x00 \x00u\x00n\x00d\x00e\x00r\x00 \x00t\ +\x00h\x00e\x00 \x00A\x00p\x00a\x00c\x00h\ +\x00e\x00 \x00L\x00i\x00c\x00e\x00n\x00s\ +\x00e\x00,\x00 \x00V\x00e\x00r\x00s\x00i\ +\x00o\x00n\x00 \x002\x00.\x000\x00h\x00t\ +\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\ +\x00.\x00a\x00p\x00a\x00c\x00h\x00e\x00.\ +\x00o\x00r\x00g\x00/\x00l\x00i\x00c\x00e\ +\x00n\x00s\x00e\x00s\x00/\x00L\x00I\x00C\ +\x00E\x00N\x00S\x00E\x00-\x002\x00.\x000\ +\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\xfff\x00f\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x03\xaa\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\ +\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x0e\x01\ +\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\ +\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\ +\x1f\x01 \x01!\x01\x22\x01#\x01$\x01%\x01&\x01\ +'\x01(\x01)\x01*\x01+\x01,\x01-\x01.\x01\ +/\x010\x011\x012\x013\x014\x015\x016\x01\ +7\x018\x019\x01:\x01;\x01<\x01=\x01>\x01\ +?\x01@\x01A\x01B\x01C\x01D\x01E\x01F\x01\ +G\x01H\x01I\x01J\x01K\x01L\x01M\x01N\x01\ +O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01\ +W\x01X\x01Y\x01Z\x01[\x01\x5c\x01]\x01^\x01\ +_\x01`\x01a\x01b\x01c\x01d\x01e\x01f\x01\ +g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01\ +o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01\ +w\x01x\x01y\x01z\x01{\x01|\x01}\x01~\x01\ +\x7f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\ +\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\ +\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\ +\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\ +\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\ +\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\ +\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\ +\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\ +\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\ +\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\ +\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\ +\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\ +\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\ +\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\ +\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\ +\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\ +\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\ +\x07\x02\x08\x02\x09\x02\x0a\x02\x0b\x02\x0c\x02\x0d\x02\x0e\x02\ +\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\ +\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\ +\x1f\x02 \x02!\x02\x22\x02#\x02$\x02%\x02&\x02\ +'\x02(\x02)\x02*\x02+\x02,\x02-\x02.\x02\ +/\x020\x021\x022\x023\x024\x025\x026\x02\ +7\x028\x029\x02:\x02;\x02<\x02=\x02>\x02\ +?\x02@\x02A\x02B\x02C\x02D\x02E\x02F\x02\ +G\x02H\x02I\x02J\x02K\x02L\x02M\x02N\x02\ +O\x02P\x02Q\x02R\x02S\x02T\x02U\x02V\x02\ +W\x02X\x02Y\x02Z\x02[\x02\x5c\x02]\x02^\x02\ +_\x02`\x02a\x02b\x02c\x02d\x02e\x02f\x02\ +g\x02h\x02i\x02j\x02k\x02l\x02m\x02n\x02\ +o\x02p\x02q\x02r\x02s\x02t\x02u\x02v\x02\ +w\x02x\x02y\x02z\x02{\x02|\x02}\x02~\x02\ +\x7f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\ +\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\ +\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\ +\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\ +\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\ +\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\ +\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\ +\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\ +\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\ +\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\ +\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\ +\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\ +\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\ +\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\ +\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\ +\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\ +\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\ +\x07\x03\x08\x03\x09\x03\x0a\x03\x0b\x03\x0c\x03\x0d\x03\x0e\x03\ +\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\ +\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\ +\x1f\x03 \x03!\x03\x22\x03#\x03$\x03%\x03&\x03\ +'\x03(\x03)\x03*\x03+\x03,\x03-\x03.\x03\ +/\x030\x031\x032\x033\x034\x035\x036\x03\ +7\x038\x039\x03:\x03;\x03<\x03=\x03>\x03\ +?\x03@\x03A\x03B\x03C\x03D\x03E\x03F\x03\ +G\x03H\x03I\x03J\x03K\x03L\x03M\x03N\x03\ +O\x03P\x03Q\x03R\x03S\x03T\x03U\x03V\x03\ +W\x03X\x03Y\x03Z\x03[\x03\x5c\x03]\x03^\x03\ +_\x03`\x03a\x03b\x03c\x03d\x03e\x03f\x03\ +g\x03h\x03i\x03j\x03k\x03l\x03m\x03n\x03\ +o\x03p\x03q\x03r\x03s\x03t\x03u\x03v\x03\ +w\x03x\x03y\x03z\x03{\x03|\x03}\x03~\x03\ +\x7f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\ +\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\ +\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\ +\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\ +\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\ +\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\ +\xaf\x03\xb0\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\ +\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\ +\xbf\x03\xc0\x03\xc1\x03\xc2\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\ +\xc7\x03\xc8\x03\xc9\x03\xca\x03\xcb\x03\xcc\x03\xcd\x03\xce\x03\ +\xcf\x03\xd0\x03\xd1\x03\xd2\x03\xd3\x03\xd4\x03\xd5\x03\xd6\x03\ +\xd7\x03\xd8\x03\xd9\x03\xda\x03\xdb\x03\xdc\x03\xdd\x03\xde\x03\ +\xdf\x03\xe0\x03\xe1\x03\xe2\x03\xe3\x03\xe4\x03\xe5\x03\xe6\x03\ +\xe7\x03\xe8\x03\xe9\x03\xea\x03\xeb\x03\xec\x03\xed\x03\xee\x03\ +\xef\x03\xf0\x03\xf1\x03\xf2\x03\xf3\x03\xf4\x03\xf5\x03\xf6\x03\ +\xf7\x03\xf8\x03\xf9\x03\xfa\x03\xfb\x03\xfc\x03\xfd\x03\xfe\x03\ +\xff\x04\x00\x04\x01\x04\x02\x04\x03\x04\x04\x04\x05\x04\x06\x04\ +\x07\x04\x08\x04\x09\x04\x0a\x04\x0b\x04\x0c\x04\x0d\x04\x0e\x04\ +\x0f\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x16\x04\ +\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\ +\x1f\x04 \x04!\x04\x22\x04#\x04$\x04%\x04&\x04\ +'\x04(\x04)\x04*\x04+\x04,\x04-\x04.\x04\ +/\x040\x041\x042\x043\x044\x045\x046\x04\ +7\x048\x049\x04:\x04;\x04<\x04=\x04>\x04\ +?\x04@\x04A\x04B\x04C\x04D\x04E\x04F\x04\ +G\x04H\x04I\x04J\x04K\x04L\x04M\x04N\x04\ +O\x04P\x04Q\x04R\x04S\x04T\x04U\x04V\x04\ +W\x04X\x04Y\x04Z\x04[\x04\x5c\x04]\x04^\x04\ +_\x04`\x04a\x04b\x04c\x04d\x04e\x04f\x04\ +g\x04h\x04i\x04j\x04k\x04l\x04m\x04n\x04\ +o\x04p\x04q\x04r\x04s\x04t\x04u\x04v\x04\ +w\x04x\x04y\x04z\x04{\x04|\x04}\x04~\x04\ +\x7f\x04\x80\x04\x81\x04\x82\x04\x83\x04\x84\x04\x85\x04\x86\x04\ +\x87\x04\x88\x04\x89\x04\x8a\x04\x8b\x04\x8c\x04\x8d\x04\x8e\x04\ +\x8f\x04\x90\x04\x91\x04\x92\x04\x93\x04\x94\x04\x95\x04\x96\x04\ +\x97\x04\x98\x04\x99\x04\x9a\x04\x9b\x04\x9c\x04\x9d\x04\x9e\x04\ +\x9f\x04\xa0\x04\xa1\x04\xa2\x04\xa3\x04\xa4\x04\xa5\x04\xa6\x04\ +\xa7\x04\xa8\x04\xa9\x04\xaa\x04\xab\x07.notde\ +f\x04null\x10nonmarkin\ +greturn\x05space\x06ex\ +clam\x08quotedbl\x0anu\ +mbersign\x06dollar\x07\ +percent\x09ampersan\ +d\x0bquotesingle\x09pa\ +renleft\x0aparenrig\ +ht\x08asterisk\x04plus\ +\x05comma\x06hyphen\x06pe\ +riod\x05slash\x04zero\x03\ +one\x03two\x05three\x04fo\ +ur\x04five\x03six\x05seve\ +n\x05eight\x04nine\x05col\ +on\x09semicolon\x04les\ +s\x05equal\x07greater\x08\ +question\x02at\x01A\x01B\x01\ +C\x01D\x01E\x01F\x01G\x01H\x05I.al\ +t\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01\ +Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01\ +Y\x01Z\x0bbracketleft\x09\ +backslash\x0cbracke\ +tright\x0basciicirc\ +um\x0aunderscore\x05gr\ +ave\x01a\x01b\x01c\x01d\x01e\x01f\x01\ +g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01\ +o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01\ +w\x01x\x01y\x01z\x09bracelef\ +t\x03bar\x0abraceright\ +\x0aasciitilde\x10nonb\ +reakingspace\x0aexc\ +lamdown\x04cent\x08ste\ +rling\x08currency\x03y\ +en\x09brokenbar\x07sec\ +tion\x08dieresis\x09co\ +pyright\x0bordfemin\ +ine\x0dguillemotlef\ +t\x0alogicalnot\x07uni\ +00AD\x0aregistered\x09\ +overscore\x06degree\ +\x09plusminus\x0btwosu\ +perior\x0dthreesupe\ +rior\x05acute\x02mu\x09pa\ +ragraph\x0eperiodce\ +ntered\x07cedilla\x0bo\ +nesuperior\x0cordma\ +sculine\x0eguillemo\ +tright\x0aonequarte\ +r\x07onehalf\x0dthreeq\ +uarters\x0cquestion\ +down\x06Agrave\x06Aacu\ +te\x0bAcircumflex\x06A\ +tilde\x09Adieresis\x05\ +Aring\x02AE\x08Ccedill\ +a\x06Egrave\x06Eacute\x0b\ +Ecircumflex\x09Edie\ +resis\x0aIgrave.alt\ +\x0aIacute.alt\x0fIcir\ +cumflex.alt\x0dIdie\ +resis.alt\x03Eth\x06Nt\ +ilde\x06Ograve\x06Oacu\ +te\x0bOcircumflex\x06O\ +tilde\x09Odieresis\x08\ +multiply\x06Oslash\x06\ +Ugrave\x06Uacute\x0bUc\ +ircumflex\x09Udiere\ +sis\x06Yacute\x05Thorn\ +\x0agermandbls\x06agra\ +ve\x06aacute\x0bacircu\ +mflex\x06atilde\x09adi\ +eresis\x05aring\x02ae\x08\ +ccedilla\x06egrave\x06\ +eacute\x0becircumfl\ +ex\x09edieresis\x06igr\ +ave\x06iacute\x0bicirc\ +umflex\x09idieresis\ +\x03eth\x06ntilde\x06ogra\ +ve\x06oacute\x0bocircu\ +mflex\x06otilde\x09odi\ +eresis\x06divide\x06os\ +lash\x06ugrave\x06uacu\ +te\x0bucircumflex\x09u\ +dieresis\x06yacute\x05\ +thorn\x09ydieresis\x07\ +Amacron\x07amacron\x06\ +Abreve\x06abreve\x07Ao\ +gonek\x07aogonek\x06Ca\ +cute\x06cacute\x0bCcir\ +cumflex\x0bccircumf\ +lex\x04Cdot\x04cdot\x06Cc\ +aron\x06ccaron\x06Dcar\ +on\x06dcaron\x06Dcroat\ +\x06dcroat\x07Emacron\x07\ +emacron\x06Ebreve\x06e\ +breve\x0aEdotaccent\ +\x0aedotaccent\x07Eogo\ +nek\x07eogonek\x06Ecar\ +on\x06ecaron\x0bGcircu\ +mflex\x0bgcircumfle\ +x\x06Gbreve\x06gbreve\x04\ +Gdot\x04gdot\x0cGcomma\ +accent\x0cgcommaacc\ +ent\x0bHcircumflex\x0b\ +hcircumflex\x04Hbar\ +\x04hbar\x0aItilde.alt\ +\x06itilde\x0bImacron.\ +alt\x07imacron\x0aIbre\ +ve.alt\x06ibreve\x0bIo\ +gonek.alt\x07iogone\ +k\x0eIdotaccent.alt\ +\x08dotlessi\x06IJ.alt\ +\x02ij\x0bJcircumflex\x0b\ +jcircumflex\x0cKcom\ +maaccent\x0ckcommaa\ +ccent\x0ckgreenland\ +ic\x06Lacute\x06lacute\ +\x0cLcommaaccent\x0clc\ +ommaaccent\x06Lcaro\ +n\x06lcaron\x04Ldot\x04ld\ +ot\x06Lslash\x06lslash\ +\x06Nacute\x06nacute\x0cN\ +commaaccent\x0cncom\ +maaccent\x06Ncaron\x06\ +ncaron\x0bnapostrop\ +he\x03Eng\x03eng\x07Omacr\ +on\x07omacron\x06Obrev\ +e\x06obreve\x0dOhungar\ +umlaut\x0dohungarum\ +laut\x02OE\x02oe\x06Racut\ +e\x06racute\x0cRcommaa\ +ccent\x0crcommaacce\ +nt\x06Rcaron\x06rcaron\ +\x06Sacute\x06sacute\x0bS\ +circumflex\x0bscirc\ +umflex\x08Scedilla\x08\ +scedilla\x06Scaron\x06\ +scaron\x0cTcommaacc\ +ent\x0ctcommaaccent\ +\x06Tcaron\x06tcaron\x04T\ +bar\x04tbar\x06Utilde\x06\ +utilde\x07Umacron\x07u\ +macron\x06Ubreve\x06ub\ +reve\x05Uring\x05uring\ +\x0dUhungarumlaut\x0du\ +hungarumlaut\x07Uog\ +onek\x07uogonek\x0bWci\ +rcumflex\x0bwcircum\ +flex\x0bYcircumflex\ +\x0bycircumflex\x09Ydi\ +eresis\x06Zacute\x06za\ +cute\x0aZdotaccent\x0a\ +zdotaccent\x06Zcaro\ +n\x06zcaron\x05longs\x06f\ +lorin\x0aAringacute\ +\x0aaringacute\x07AEac\ +ute\x07aeacute\x0bOsla\ +shacute\x0boslashac\ +ute\x0cScommaaccent\ +\x0cscommaaccent\x0aci\ +rcumflex\x05caron\x06m\ +acron\x05breve\x09dota\ +ccent\x04ring\x06ogone\ +k\x05tilde\x0chungarum\ +laut\x05tonos\x0ddiere\ +sistonos\x0aAlphato\ +nos\x09anoteleia\x0cEp\ +silontonos\x08Etato\ +nos\x0dIotatonos.al\ +t\x0cOmicrontonos\x0cU\ +psilontonos\x0aOmeg\ +atonos\x11iotadiere\ +sistonos\x05Alpha\x04B\ +eta\x05Gamma\x07uni039\ +4\x07Epsilon\x04Zeta\x03E\ +ta\x05Theta\x08Iota.al\ +t\x05Kappa\x06Lambda\x02M\ +u\x02Nu\x02Xi\x07Omicron\x02\ +Pi\x03Rho\x05Sigma\x03Tau\ +\x07Upsilon\x03Phi\x03Chi\ +\x03Psi\x07uni03A9\x10Iot\ +adieresis.alt\x0fUp\ +silondieresis\x0aal\ +phatonos\x0cepsilon\ +tonos\x08etatonos\x09i\ +otatonos\x14upsilon\ +dieresistonos\x05al\ +pha\x04beta\x05gamma\x05d\ +elta\x07epsilon\x04zet\ +a\x03eta\x05theta\x04iota\ +\x05kappa\x06lambda\x07un\ +i03BC\x02nu\x02xi\x07omic\ +ron\x02pi\x03rho\x06sigma\ +1\x05sigma\x03tau\x07upsi\ +lon\x03phi\x03chi\x03psi\x05\ +omega\x0ciotadieres\ +is\x0fupsilondieres\ +is\x0comicrontonos\x0c\ +upsilontonos\x0aome\ +gatonos\x09afii1002\ +3\x09afii10051\x09afii\ +10052\x09afii10053\x09\ +afii10054\x0dafii10\ +055.alt\x0dafii1005\ +6.alt\x09afii10057\x09\ +afii10058\x09afii10\ +059\x09afii10060\x09af\ +ii10061\x09afii1006\ +2\x09afii10145\x09afii\ +10017\x09afii10018\x09\ +afii10019\x09afii10\ +020\x09afii10021\x09af\ +ii10022\x09afii1002\ +4\x09afii10025\x09afii\ +10026\x09afii10027\x09\ +afii10028\x09afii10\ +029\x09afii10030\x09af\ +ii10031\x09afii1003\ +2\x09afii10033\x09afii\ +10034\x09afii10035\x09\ +afii10036\x09afii10\ +037\x09afii10038\x09af\ +ii10039\x09afii1004\ +0\x09afii10041\x09afii\ +10042\x09afii10043\x09\ +afii10044\x09afii10\ +045\x09afii10046\x09af\ +ii10047\x09afii1004\ +8\x09afii10049\x09afii\ +10065\x09afii10066\x09\ +afii10067\x09afii10\ +068\x09afii10069\x09af\ +ii10070\x09afii1007\ +2\x09afii10073\x09afii\ +10074\x09afii10075\x09\ +afii10076\x09afii10\ +077\x09afii10078\x09af\ +ii10079\x09afii1008\ +0\x09afii10081\x09afii\ +10082\x09afii10083\x09\ +afii10084\x09afii10\ +085\x09afii10086\x09af\ +ii10087\x09afii1008\ +8\x09afii10089\x09afii\ +10090\x09afii10091\x09\ +afii10092\x09afii10\ +093\x09afii10094\x09af\ +ii10095\x09afii1009\ +6\x09afii10097\x09afii\ +10071\x09afii10099\x09\ +afii10100\x09afii10\ +101\x09afii10102\x09af\ +ii10103\x09afii1010\ +4\x09afii10105\x09afii\ +10106\x09afii10107\x09\ +afii10108\x09afii10\ +109\x09afii10110\x09af\ +ii10193\x09afii1005\ +0\x09afii10098\x06Wgra\ +ve\x06wgrave\x06Wacute\ +\x06wacute\x09Wdieresi\ +s\x09wdieresis\x06Ygra\ +ve\x06ygrave\x06endash\ +\x06emdash\x09afii0020\ +8\x0dunderscoredbl\x09\ +quoteleft\x0aquoter\ +ight\x0equotesinglb\ +ase\x0dquotereverse\ +d\x0cquotedblleft\x0dq\ +uotedblright\x0cquo\ +tedblbase\x06dagger\ +\x09daggerdbl\x06bulle\ +t\x08ellipsis\x0bperth\ +ousand\x06minute\x06se\ +cond\x0dguilsinglle\ +ft\x0eguilsinglrigh\ +t\x09exclamdbl\x08frac\ +tion\x09nsuperior\x05f\ +ranc\x09afii08941\x06p\ +eseta\x04Euro\x09afii6\ +1248\x09afii61289\x09a\ +fii61352\x09tradema\ +rk\x05Omega\x09estimat\ +ed\x09oneeighth\x0cthr\ +eeeighths\x0bfiveei\ +ghths\x0cseveneight\ +hs\x0bpartialdiff\x05D\ +elta\x07product\x09sum\ +mation\x05minus\x07rad\ +ical\x08infinity\x08in\ +tegral\x0bapproxequ\ +al\x08notequal\x09less\ +equal\x0cgreaterequ\ +al\x07lozenge\x07uniFB\ +01\x07uniFB02\x0dcyril\ +licbreve\x08dotless\ +j\x10caroncommaacce\ +nt\x0bcommaaccent\x11c\ +ommaaccentrotate\ +\x0czerosuperior\x0cfo\ +ursuperior\x0cfives\ +uperior\x0bsixsuper\ +ior\x0dsevensuperio\ +r\x0deightsuperior\x0c\ +ninesuperior\x07uni\ +2000\x07uni2001\x07uni\ +2002\x07uni2003\x07uni\ +2004\x07uni2005\x07uni\ +2006\x07uni2007\x07uni\ +2008\x07uni2009\x07uni\ +200A\x07uni200B\x07uni\ +FEFF\x07uniFFFC\x07uni\ +FFFD\x07uni01F0\x07uni\ +02BC\x07uni03D1\x07uni\ +03D2\x07uni03D6\x07uni\ +1E3E\x07uni1E3F\x07uni\ +1E00\x07uni1E01\x07uni\ +1F4D\x07uni02F3\x09das\ +iaoxia\x07uniFB03\x07u\ +niFB04\x05Ohorn\x05oho\ +rn\x05Uhorn\x05uhorn\x07u\ +ni0300\x07uni0301\x07u\ +ni0303\x04hook\x08dotb\ +elow\x07uni0400\x07uni\ +040D\x07uni0450\x07uni\ +045D\x07uni0460\x07uni\ +0461\x07uni0462\x07uni\ +0463\x07uni0464\x07uni\ +0465\x07uni0466\x07uni\ +0467\x07uni0468\x07uni\ +0469\x07uni046A\x07uni\ +046B\x07uni046C\x07uni\ +046D\x07uni046E\x07uni\ +046F\x07uni0470\x07uni\ +0471\x07uni0472\x07uni\ +0473\x07uni0474\x07uni\ +0475\x07uni0476\x07uni\ +0477\x07uni0478\x07uni\ +0479\x07uni047A\x07uni\ +047B\x07uni047C\x07uni\ +047D\x07uni047E\x07uni\ +047F\x07uni0480\x07uni\ +0481\x07uni0482\x07uni\ +0483\x07uni0484\x07uni\ +0485\x07uni0486\x07uni\ +0488\x07uni0489\x07uni\ +048A\x07uni048B\x07uni\ +048C\x07uni048D\x07uni\ +048E\x07uni048F\x07uni\ +0492\x07uni0493\x07uni\ +0494\x07uni0495\x07uni\ +0496\x07uni0497\x07uni\ +0498\x07uni0499\x07uni\ +049A\x07uni049B\x07uni\ +049C\x07uni049D\x07uni\ +049E\x07uni049F\x07uni\ +04A0\x07uni04A1\x07uni\ +04A2\x07uni04A3\x07uni\ +04A4\x07uni04A5\x07uni\ +04A6\x07uni04A7\x07uni\ +04A8\x07uni04A9\x07uni\ +04AA\x07uni04AB\x07uni\ +04AC\x07uni04AD\x07uni\ +04AE\x07uni04AF\x07uni\ +04B0\x07uni04B1\x07uni\ +04B2\x07uni04B3\x07uni\ +04B4\x07uni04B5\x07uni\ +04B6\x07uni04B7\x07uni\ +04B8\x07uni04B9\x07uni\ +04BA\x07uni04BB\x07uni\ +04BC\x07uni04BD\x07uni\ +04BE\x07uni04BF\x0buni\ +04C0.alt\x07uni04C1\ +\x07uni04C2\x07uni04C3\ +\x07uni04C4\x07uni04C5\ +\x07uni04C6\x07uni04C7\ +\x07uni04C8\x07uni04C9\ +\x07uni04CA\x07uni04CB\ +\x07uni04CC\x07uni04CD\ +\x07uni04CE\x0buni04CF\ +.alt\x07uni04D0\x07uni\ +04D1\x07uni04D2\x07uni\ +04D3\x07uni04D4\x07uni\ +04D5\x07uni04D6\x07uni\ +04D7\x07uni04D8\x07uni\ +04D9\x07uni04DA\x07uni\ +04DB\x07uni04DC\x07uni\ +04DD\x07uni04DE\x07uni\ +04DF\x07uni04E0\x07uni\ +04E1\x07uni04E2\x07uni\ +04E3\x07uni04E4\x07uni\ +04E5\x07uni04E6\x07uni\ +04E7\x07uni04E8\x07uni\ +04E9\x07uni04EA\x07uni\ +04EB\x07uni04EC\x07uni\ +04ED\x07uni04EE\x07uni\ +04EF\x07uni04F0\x07uni\ +04F1\x07uni04F2\x07uni\ +04F3\x07uni04F4\x07uni\ +04F5\x07uni04F6\x07uni\ +04F7\x07uni04F8\x07uni\ +04F9\x07uni04FA\x07uni\ +04FB\x07uni04FC\x07uni\ +04FD\x07uni04FE\x07uni\ +04FF\x07uni0500\x07uni\ +0501\x07uni0502\x07uni\ +0503\x07uni0504\x07uni\ +0505\x07uni0506\x07uni\ +0507\x07uni0508\x07uni\ +0509\x07uni050A\x07uni\ +050B\x07uni050C\x07uni\ +050D\x07uni050E\x07uni\ +050F\x07uni0510\x07uni\ +0511\x07uni0512\x07uni\ +0513\x07uni1EA0\x07uni\ +1EA1\x07uni1EA2\x07uni\ +1EA3\x07uni1EA4\x07uni\ +1EA5\x07uni1EA6\x07uni\ +1EA7\x07uni1EA8\x07uni\ +1EA9\x07uni1EAA\x07uni\ +1EAB\x07uni1EAC\x07uni\ +1EAD\x07uni1EAE\x07uni\ +1EAF\x07uni1EB0\x07uni\ +1EB1\x07uni1EB2\x07uni\ +1EB3\x07uni1EB4\x07uni\ +1EB5\x07uni1EB6\x07uni\ +1EB7\x07uni1EB8\x07uni\ +1EB9\x07uni1EBA\x07uni\ +1EBB\x07uni1EBC\x07uni\ +1EBD\x07uni1EBE\x07uni\ +1EBF\x07uni1EC0\x07uni\ +1EC1\x07uni1EC2\x07uni\ +1EC3\x07uni1EC4\x07uni\ +1EC5\x07uni1EC6\x07uni\ +1EC7\x0buni1EC8.alt\ +\x07uni1EC9\x0buni1ECA\ +.alt\x07uni1ECB\x07uni\ +1ECC\x07uni1ECD\x07uni\ +1ECE\x07uni1ECF\x07uni\ +1ED0\x07uni1ED1\x07uni\ +1ED2\x07uni1ED3\x07uni\ +1ED4\x07uni1ED5\x07uni\ +1ED6\x07uni1ED7\x07uni\ +1ED8\x07uni1ED9\x07uni\ +1EDA\x07uni1EDB\x07uni\ +1EDC\x07uni1EDD\x07uni\ +1EDE\x07uni1EDF\x07uni\ +1EE0\x07uni1EE1\x07uni\ +1EE2\x07uni1EE3\x07uni\ +1EE4\x07uni1EE5\x07uni\ +1EE6\x07uni1EE7\x07uni\ +1EE8\x07uni1EE9\x07uni\ +1EEA\x07uni1EEB\x07uni\ +1EEC\x07uni1EED\x07uni\ +1EEE\x07uni1EEF\x07uni\ +1EF0\x07uni1EF1\x07uni\ +1EF4\x07uni1EF5\x07uni\ +1EF6\x07uni1EF7\x07uni\ +1EF8\x07uni1EF9\x07uni\ +20AB\x07uni030F\x13cir\ +cumflexacutecomb\ +\x13circumflexgrave\ +comb\x12circumflexh\ +ookcomb\x13circumfl\ +extildecomb\x0ebrev\ +eacutecomb\x0ebreve\ +gravecomb\x0dbreveh\ +ookcomb\x0ebrevetil\ +decomb\x10cyrillich\ +ookleft\x11cyrillic\ +bighookUC\x11cyrill\ +icbighookLC\x08one.\ +pnum\x07zero.os\x06one\ +.os\x06two.os\x08three\ +.os\x07four.os\x07five\ +.os\x06six.os\x08seven\ +.os\x08eight.os\x07nin\ +e.os\x02ff\x07uni2120\x08\ +Tcedilla\x08tcedill\ +a\x05g.alt\x0fgcircumf\ +lex.alt\x0agbreve.a\ +lt\x08gdot.alt\x10gcom\ +maaccent.alt\x01I\x06I\ +grave\x06Iacute\x0bIci\ +rcumflex\x09Idieres\ +is\x06Itilde\x07Imacro\ +n\x06Ibreve\x07Iogonek\ +\x0aIdotaccent\x02IJ\x09I\ +otatonos\x04Iota\x0cIo\ +tadieresis\x09afii1\ +0055\x09afii10056\x07u\ +ni04C0\x07uni04CF\x07u\ +ni1EC8\x07uni1ECA\x00\x00\ +\x01\x00\x02\x00\x08\x00\x0a\xff\xff\x00\x0f\x00\x01\x00\x00\x00\ +\x0c\x00\x00\x00\x16\x00\x00\x00\x02\x00\x01\x00\x00\x03\xa9\x00\ +\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x0a\x004\x006\x00\x01latn\x00\x08\x00\x10\x00\ +\x02MOL \x00\x16ROM \x00\x1c\x00\x00\xff\ +\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x00n\x01\xe4\x00\x01l\ +atn\x00\x08\x00\x10\x00\x02MOL \x00(R\ +OM \x00B\x00\x00\xff\xff\x00\x09\x00\x03\x00\x08\x00\ +\x0b\x00\x00\x00\x0e\x00\x11\x00\x14\x00\x17\x00\x1a\x00\x00\xff\ +\xff\x00\x0a\x00\x04\x00\x06\x00\x09\x00\x0c\x00\x01\x00\x0f\x00\ +\x12\x00\x15\x00\x18\x00\x1b\x00\x00\xff\xff\x00\x0a\x00\x05\x00\ +\x07\x00\x0a\x00\x0d\x00\x02\x00\x10\x00\x13\x00\x16\x00\x19\x00\ +\x1c\x00\x1dliga\x00\xb0liga\x00\xb6l\ +iga\x00\xbclnum\x00\xc2lnum\x00\ +\xc8lnum\x00\xcelocl\x00\xd4loc\ +l\x00\xdaonum\x00\xe0onum\x00\xe8o\ +num\x00\xf0pnum\x00\xf8pnum\x00\ +\xfepnum\x01\x04salt\x01\x0asal\ +t\x01\x12salt\x01\x1ass01\x01\x22s\ +s01\x01*ss01\x012ss02\x01\ +:ss02\x01@ss02\x01Fss0\ +3\x01Lss03\x01Rss03\x01Xt\ +num\x01^tnum\x01ftnum\x01\ +n\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\ +\x01\x00\x09\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\ +\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x08\x00\x00\x00\x01\x00\ +\x08\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x01\x00\x04\x00\ +\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x0a\x00\x16\x00\x1e\x00&\x00\ +.\x006\x00>\x00F\x00N\x00V\x00^\x00\x01\x00\ +\x00\x00\x01\x00P\x00\x01\x00\x00\x00\x01\x00z\x00\x01\x00\ +\x00\x00\x01\x00\xaa\x00\x01\x00\x00\x00\x01\x00\xc6\x00\x01\x00\ +\x00\x00\x01\x00\xee\x00\x01\x00\x00\x00\x01\x00\xf4\x00\x01\x00\ +\x00\x00\x01\x01\x10\x00\x01\x00\x00\x00\x01\x01\x16\x00\x01\x00\ +\x00\x00\x01\x012\x00\x04\x00\x00\x00\x01\x01H\x00\x02\x00\ +\x10\x00\x05\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x00\x02\x00\ +\x05\x00J\x00J\x00\x00\x00\xdf\x00\xdf\x00\x01\x00\xe1\x00\ +\xe1\x00\x02\x00\xe3\x00\xe3\x00\x03\x00\xe5\x00\xe5\x00\x04\x00\ +\x02\x00.\x00\x14\x00,\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\ +\xea\x00\xec\x00\xee\x00\xf0\x00\xf2\x00\xf4\x01Z\x01g\x01\ +w\x01\xa1\x01\xa2\x02\xc9\x02\xd8\x03E\x03G\x00\x02\x00\ +\x01\x03\x96\x03\xa9\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\ +\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\ +\x8c\x00\x02\x00\x01\x00\x13\x00\x1c\x00\x00\x00\x02\x00\x1a\x00\ +\x0a\x03\x83\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\ +\x8b\x03\x8c\x03\x84\x00\x02\x00\x03\x00\x13\x00\x13\x00\x00\x00\ +\x15\x00\x1c\x00\x01\x03\x82\x03\x82\x00\x09\x00\x02\x00\x08\x00\ +\x01\x03\x82\x00\x01\x00\x01\x00\x14\x00\x02\x00\x1a\x00\x0a\x00\ +\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\ +\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\ +\x08\x00\x01\x00\x14\x00\x01\x00\x01\x03\x82\x00\x02\x00\x1a\x00\ +\x0a\x00\x13\x03\x82\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\ +\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\ +\x02\x00\x0e\x00\x04\x03\x8f\x03\x90\x01 \x01!\x00\x02\x00\ +\x02\x01$\x01%\x00\x00\x01I\x01J\x00\x02\x00\x01\x00\ +6\x00\x01\x00\x08\x00\x05\x00\x0c\x00\x14\x00\x1c\x00\x22\x00\ +(\x02^\x00\x03\x00I\x00O\x02]\x00\x03\x00I\x00\ +L\x03\x8d\x00\x02\x00I\x025\x00\x02\x00O\x024\x00\ +\x02\x00L\x00\x01\x00\x01\x00I\x00\x00\x00\x00\x00\x01\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x00\x15^\x00\x00\x00\x14\x00\ +\x00\x00\x00\x00\x00\x15V0\x82\x15R\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x07\x02\xa0\x82\x15C0\x82\x15?\x02\x01\ +\x011\x0b0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x000a\ +\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x04\xa0S0Q\ +0,\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1c\xa2\x1e\ +\x80\x1c\x00<\x00<\x00<\x00O\x00b\x00s\x00o\ +\x00l\x00e\x00t\x00e\x00>\x00>\x00>0!\ +0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14;\x09U\ +|\x0exG{\xd3\x89\x97\xd0\xf9\x92\xfa\xeef\xb3;\ +\xbf\xa0\x82\x11]0\x82\x03z0\x82\x02b\xa0\x03\x02\ +\x01\x02\x02\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\ +\xb5\xd6Z\xd50\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x000S1\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVer\ +iSign, Inc.1+0)\x06\ +\x03U\x04\x03\x13\x22VeriSign T\ +ime Stamping Ser\ +vices CA0\x1e\x17\x0d0706\ +15000000Z\x17\x0d12061\ +4235959Z0\x5c1\x0b0\x09\x06\x03\ +U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\ +\x13\x0eVeriSign, Inc.\ +1402\x06\x03U\x04\x03\x13+VeriS\ +ign Time Stampin\ +g Services Signe\ +r - G20\x81\x9f0\x0d\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\ +\x81\x81\x00\xc4\xb5\xf2R\x15\xbc\x88\x86`)\x16J[\ +/K\x91k\x87\x91\xf35TX5\xea\xd16^b\ +MRQ4q\xc2{f\x1d\x89\xc8\xdd*\xc4j\x0a\ +\xf67\xd9\x98t\x91\xf6\x92\xae\xb0\xb5v\x96\xf1\xa9J\ +cEG.k\x0b\x92NK+\x8c\xeeXJ\x8b\xd4\ +\x07\xe4\x1a,\xf8\x82\xaaX\xd9\xcdB\xf3-\xc0u\xde\ +\x8d\xab\xc7\x8e\x1d\x9alL\x08\x95\x1e\xde\xdb\xefg\xe1\ +r\xc2I\xc2\x9e`<\xe1\xe2\xbe\x16\xa3cxi\x14\ +{\xad-\x02\x03\x01\x00\x01\xa3\x81\xc40\x81\xc104\ +\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\ +\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18http\ +://ocsp.verisign\ +.com0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x02\ +0\x0003\x06\x03U\x1d\x1f\x04,0*0(\xa0\ +&\xa0$\x86\x22http://crl.\ +verisign.com/tss\ +-ca.crl0\x16\x06\x03U\x1d%\x01\x01\ +\xff\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\ +\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x06\xc00\ +\x1e\x06\x03U\x1d\x11\x04\x170\x15\xa4\x130\x111\x0f\ +0\x0d\x06\x03U\x04\x03\x13\x06TSA1-20\ +\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\ +\x01\x01\x00P\xc5K\xc8$\x80\xdf\xe4\x0d$\xc2\xde\x1a\ +\xb1\xa1\x02\xa1\xa6\x82-\x0c\x83\x15\x817\x0a\x82\x0e,\ +\xb0Z\x17a\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\x91\xb3V\x1a\ +@\xa6\xeb\x92\xbe89\xb0u6t:\x98O\xe47\ +\xba\x99\x89\xca\x95B\x1d\xb0\xb9\xc7\xa0\x8dW\xe0\xfa\xd5\ +d\x04B5N\x01\xd13\xa2\x17\xc8M\xaa'\xc7\xf2\ +\xe1\x86L\x028M\x83x\xc6\xfcS\xe0\xeb\xe0\x06\x87\ +\xdd\xa4\x96\x9e^\x0c\x98\xe2\xa5\xbe\xbf\x82\x85\xc3`\xe1\ +\xdf\xad(\xd8\xc7\xa5Kd\xda\xc7\x1b[\xbd\xac9\x08\ +\xd58\x22\xa13\x8b/\x8a\x9a\xeb\xbc\x07!?DA\ +\x09\x07\xb5e\x1c$\xbcH\xd3D\x80\xeb\xa1\xcf\xc9\x02\ +\xb4\x14\xcfT\xc7\x16\xa3\x80\x5c\xf9y>]r}\x88\ +\x17\x9e,C\xa2\xcaS\xce}=\xf6*:\xb8O\x94\ +\x00\xa5m\x0a\x83]\xf9^S\xf4\x18\xb3W\x0fp\xc3\ +\xfb\xf5\xad\x95\xa0\x0e\x17\xde\xc4\x16\x80`\xc9\x0f+n\ +\x86\x04\xf1\xeb\xf4x'\xd1\x05\xc5\xee4[^\xb9I\ +2\xf230\x82\x03\xc40\x82\x03-\xa0\x03\x02\x01\x02\ +\x02\x10G\xbf\x19\x95\xdf\x8dRFC\xf7\xdbmH\x0d\ +1\xa40\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000\x81\x8b1\x0b0\x09\x06\x03U\x04\x06\x13\x02Z\ +A1\x150\x13\x06\x03U\x04\x08\x13\x0cWest\ +ern Cape1\x140\x12\x06\x03U\x04\ +\x07\x13\x0bDurbanville1\x0f\ +0\x0d\x06\x03U\x04\x0a\x13\x06Thawte1\ +\x1d0\x1b\x06\x03U\x04\x0b\x13\x14Thawte\ + Certification1\x1f\ +0\x1d\x06\x03U\x04\x03\x13\x16Thawte \ +Timestamping CA0\ +\x1e\x17\x0d031204000000Z\ +\x17\x0d131203235959Z0\ +S1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1+0)\x06\x03U\x04\x03\ +\x13\x22VeriSign Time \ +Stamping Service\ +s CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\ +\x02\x82\x01\x01\x00\xa9\xca\xb2\xa4\xcc\xcd \xaf\x0a}\x89\ +\xac\x87u\xf0\xb4N\xf1\xdf\xc1\x0f\xbfga\xbd\xa3d\ +\x1c\xda\xbb\xf9\xca3\xab\x840\x89X~\x8c\xdbk\xdd\ +6\x9e\x0f\xbf\xd1\xecx\xf2w\xa6~o<\xbf\x93\xaf\ +\x0d\xbah\xf4l\x94\xca\xbdR-\xabH=\xf5\xb6\xd5\ +]_\x1b\x02\x9f\xfa/k\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\ +\x02\xe1\x7fLR\xe3\x0e`\xec@\x1c~\xb9\x0d\xde?\ +\xc7\xb4\xdf\x87\xbd_zj1.\x03\x99\x81\x13\xa8G\ + \xce1s\x0dW-\xcdx43\x95\x12\x99\x12\xb9\ +\xdeh/\xaa\xe6\xe3\xc2\x8a\x8c*\xc3\x8b!\x87f\xbd\ +\x83XWou\xbf<\xaa&\x87]\xca\x10\x15<\x9f\ +\x84\xeaT\xc1\x0an\xc4\xfe\xc5J\xdd\xb9\x07\x11\x97\x22\ +|\xdb>'\xd1\x1ex\xec\x9f1\xc9\xf1\xe6\x22\x19\xdb\ +\xc4\xb3GC\x9a\x1a_\xa0\x1e\x90\xe4^\xf5\xee|\xf1\ +}\xabb\x01\x8f\xf5M\x0b\xde\xd0\x22V\xa8\x95\xcd\xae\ +\x88v\xae\xee\xba\x0d\xf3\xe4M\xd9\xa0\xfbh\xa0\xae\x14\ +;\xb3\x87\xc1\xbb\x02\x03\x01\x00\x01\xa3\x81\xdb0\x81\xd8\ +04\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&\ +0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18ht\ +tp://ocsp.verisi\ +gn.com0\x12\x06\x03U\x1d\x13\x01\x01\xff\ +\x04\x080\x06\x01\x01\xff\x02\x01\x000A\x06\x03U\x1d\ +\x1f\x04:0806\xa04\xa02\x860htt\ +p://crl.verisign\ +.com/ThawteTimes\ +tampingCA.crl0\x13\x06\ +\x03U\x1d%\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\ +\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\ +\x01\x060$\x06\x03U\x1d\x11\x04\x1d0\x1b\xa4\x190\ +\x171\x150\x13\x06\x03U\x04\x03\x13\x0cTSA2\ +048-1-530\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00Jk\xf9\xeaX\ +\xc2D\x1c1\x89y\x99+\x96\xbf\x82\xac\x01\xd6\x1cL\ +\xcd\xb0\x8aXn\xdf\x08)\xa3^\xc8\xca\x93\x13\xe7\x04\ +R\x0d\xefG'/\x008\xb0\xe4\xc9\x93N\x9a\xd4\x22\ +b\x15\xf7?7!Op1\x80\xf1\x8b8\x87\xb3\xe8\ +\xe8\x97\x00\xfe\xcfU\x96N$\xd2\xa9'Nz\xae\xb7\ +aA\xf3*\xce\xe7\xc9\xd9^\xdd\xbb+\x85>\xb5\x9d\ +\xb5\xd9\xe1W\xff\xbe\xb4\xc5~\xf5\xcf\x0c\x9e\xf0\x97\xfe\ ++\xd3;R\x1b\x1b8'\xf7?J0\x82\x04\xfc0\ +\x82\x04e\xa0\x03\x02\x01\x02\x02\x10eR&\xe1\xb2.\ +\x18\xe1Y\x0f)\x85\xac\x22\xe7\x5c0\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000_1\x0b0\x09\x06\ +\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\ +\x0a\x13\x0eVeriSign, Inc\ +.1705\x06\x03U\x04\x0b\x13.Clas\ +s 3 Public Prima\ +ry Certification\ + Authority0\x1e\x17\x0d09\ +0521000000Z\x17\x0d190\ +520235959Z0\x81\xb61\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ve\ +riSign Trust Net\ +work1;09\x06\x03U\x04\x0b\x132T\ +erms of use at h\ +ttps://www.veris\ +ign.com/rpa (c)0\ +9100.\x06\x03U\x04\x03\x13'Veri\ +Sign Class 3 Cod\ +e Signing 2009-2\ + CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\ +\x82\x01\x01\x00\xbeg\x1d\xb4`\xaa\x10IoV\x17|\ +f\xc9^\x86\x0d\xd5\xf1\xac\xa7q\x83\x8e\x8b\x89\xf8\x88\ +\x04\x89\x15\x06\xba-\x84!\x95\xe4\xd1\x9cPL\xfb\xd2\ +\x22\xbd\xda\xf2\xb25;\x1e\x8f\xc3\x09\xfb\xfc\x13.Z\ +\xbf\x89|=;%\x1e\xf6\xf3X{\x9c\xf4\x01\xb5\xc6\ +\x0a\xb8\x80\xce\xbe'tag'Mj\xe5\xec\x81a\ +Xy\xa3\xe0\x17\x10\x12\x15'\xb0\xe1M4\x7f+G\ + D\xb9\xdef$f\x8a\xcdO\xba\x1f\xc58\xc8T\ +\x90\xe1r\xf6\x19fuj\xb9Ih\xcf8y\x0d\xaa\ +0\xa8\xdb,`H\x9e\xd7\xaa\x14\x01\xa9\x83\xd78\x91\ +09\x13\x96\x03:|@T\xb6\xad\xe0/\x1b\x83\xdc\ +\xa8\x11R>\x02\xb3\xd7+\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\ +\xa9\xa6\x10P\x0e4.M\xa7\xce\xc9^%\xd4\x8c\xbc\ +\xf3n|)\xbc\x01]\xfc1\x87Z\xd5\x8c\x85gX\ +\x88\x19\xa0\xbf5\xf0\xea+\xa3!\xe7\x90\xf6\x83\xe5\xa8\ +\xed`x^{`\x83\xfdW\x0b]A\x0dcT`\ +\xd6C!\xef\x02\x03\x01\x00\x01\xa3\x82\x01\xdb0\x82\x01\ +\xd70\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\ +\x01\xff\x02\x01\x000p\x06\x03U\x1d \x04i0g\ +0e\x06\x0b`\x86H\x01\x86\xf8E\x01\x07\x17\x030\ +V0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1ch\ +ttps://www.veris\ +ign.com/cps0*\x06\x08+\ +\x06\x01\x05\x05\x07\x02\x020\x1e\x1a\x1chttps\ +://www.verisign.\ +com/rpa0\x0e\x06\x03U\x1d\x0f\x01\x01\ +\xff\x04\x04\x03\x02\x01\x060m\x06\x08+\x06\x01\x05\x05\ +\x07\x01\x0c\x04a0_\xa1]\xa0[0Y0W0\ +U\x16\x09image/gif0!0\x1f\ +0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\ +\xac\x8d\x8ek\xc3\xcf\x80j\xd4H\x18,{\x19.0\ +%\x16#http://logo.v\ +erisign.com/vslo\ +go.gif0\x1d\x06\x03U\x1d%\x04\x160\ +\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\ +\x05\x05\x07\x03\x0304\x06\x08+\x06\x01\x05\x05\x07\x01\ +\x01\x04(0&0$\x06\x08+\x06\x01\x05\x05\x070\ +\x01\x86\x18http://ocsp.v\ +erisign.com01\x06\x03U\ +\x1d\x1f\x04*0(0&\xa0$\xa0\x22\x86 ht\ +tp://crl.verisig\ +n.com/pca3.crl0)\ +\x06\x03U\x1d\x11\x04\x220 \xa4\x1e0\x1c1\x1a0\ +\x18\x06\x03U\x04\x03\x13\x11Class3CA\ +2048-1-550\x1d\x06\x03U\x1d\x0e\ +\x04\x16\x04\x14\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08\ +-\xc45\x9b\xa4\xa1\x1e\xf20\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00\x8b\x03\xc0\xdd\x94\ +\xd8A\xa2ai\xb0\x15\xa8x\xc70\xc6\x90<~B\ +\xf7$\xb6\xe4\x83s\x17\x04\x7f\x04\x10\x9c\xa1\xe2\xfa\x81\ +/\xeb\xc0\xcaD\xe7r\xe0P\xb6U\x10 \x83n\x96\ +\x92\xe4\x9aQj\xb471\xdc\xa5-\xeb\x8c\x00\xc7\x1d\ +O\xe7M2\xba\x85\xf8N\xbe\xfagUe\xf0j\xbe\ +z\xcad8\x1a\x10\x10xEv1\xf3\x86z\x03\x0f\ +`\xc2\xb3]\x9d\xf6\x8bfv\x82\x1bY\xe1\x83\xe5\xbd\ +I\xa58V\xe5\xdeAw\x0eX\x0f0\x82\x05\x130\ +\x82\x03\xfb\xa0\x03\x02\x01\x02\x02\x10f\xe3\xf0gy\xca\ +\x15\x16mPSo\x88\x19\x1a\x830\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\xb61\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ver\ +iSign Trust Netw\ +ork1;09\x06\x03U\x04\x0b\x132Te\ +rms of use at ht\ +tps://www.verisi\ +gn.com/rpa (c)09\ +100.\x06\x03U\x04\x03\x13'VeriS\ +ign Class 3 Code\ + Signing 2009-2 \ +CA0\x1e\x17\x0d1007290000\ +00Z\x17\x0d12080823595\ +9Z0\x81\xd01\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x160\x14\x06\x03U\x04\x08\x13\x0dMas\ +sachusetts1\x0f0\x0d\x06\x03\ +U\x04\x07\x13\x06Woburn1\x1e0\x1c\x06\ +\x03U\x04\x0a\x14\x15Monotype I\ +maging Inc.1>0<\x06\ +\x03U\x04\x0b\x135Digital ID\ + Class 3 - Micro\ +soft Software Va\ +lidation v21\x180\x16\x06\ +\x03U\x04\x0b\x14\x0fType Opera\ +tions1\x1e0\x1c\x06\x03U\x04\x03\x14\x15\ +Monotype Imaging\ + Inc.0\x81\x9f0\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\ +\x81\x00\x94D\xa0\x95i|U\x0d\xd0\xdb\x16\x8d25\ +\x8aL3\xab^ \xa1L\xd7*\x878\xd7\x98\xa5@\ +\xf0\x19I\x0b\x22\x1eSO\xc2C\xa6\xca\x8b\xa9V\xef\ +nH\x06\xa8\x05\x159\x1ec;$\x12\x90\xb9\x98\xcf\ +\xca\x085}r\xe3GW\xfdy\xcb\x8aJ\xe7@p\ +-5c\x7f\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\ +\xd7\xa4\xa0\xdb\x09\xf2\xa2\xf2{\xef\xcdu\xc1\xf7eP\ +d\x22\x9d\xbd}\xbc\xad\xb8K\xccXE\x0eM\xd1Y\ +LM\x02\x03\x01\x00\x01\xa3\x82\x01\x830\x82\x01\x7f0\ +\x09\x06\x03U\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\ +\x0f\x01\x01\xff\x04\x04\x03\x02\x07\x800D\x06\x03U\x1d\ +\x1f\x04=0;09\xa07\xa05\x863htt\ +p://csc3-2009-2-\ +crl.verisign.com\ +/CSC3-2009-2.crl\ +0D\x06\x03U\x1d \x04=0;09\x06\x0b`\ +\x86H\x01\x86\xf8E\x01\x07\x17\x030*0(\x06\x08\ ++\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps:\ +//www.verisign.c\ +om/rpa0\x13\x06\x03U\x1d%\x04\x0c0\ +\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x030u\x06\x08+\ +\x06\x01\x05\x05\x07\x01\x01\x04i0g0$\x06\x08+\ +\x06\x01\x05\x05\x070\x01\x86\x18http://\ +ocsp.verisign.co\ +m0?\x06\x08+\x06\x01\x05\x05\x070\x02\x863h\ +ttp://csc3-2009-\ +2-aia.verisign.c\ +om/CSC3-2009-2.c\ +er0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\x97\ +\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\ +\xa1\x1e\xf20\x11\x06\x09`\x86H\x01\x86\xf8B\x01\x01\ +\x04\x04\x03\x02\x04\x100\x16\x06\x0a+\x06\x01\x04\x01\x82\ +7\x02\x01\x1b\x04\x080\x06\x01\x01\x00\x01\x01\xff0\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\ +\x01\x00N\xe6\x22\x87\xdfgA\x15\x17\xe2\xd2\xee~\x0e\ +\xce\xc2\x99\xd6c\xbd\xf0\xb5\x93\xe5jrb\xe1\xf5\xd2\ +<8\xee\xa8=\x08_\xbaG\x81\x82_[KI\xf4\ +\x1d \xfa\x0f\x93\x09\xd0\x1d\x19VD\x17\xa2\x88\xf3\xfb\ +\x8d\x9d\xae\xf7\x0d5\xde<\x0c\xacD\x94`E*\x9b\ +\xfe\x9boL;\xb14gp\x10\x86\xffZ9\x5cZ\ +\xe3l\x82\xab5|eK\xfd\x98m\xb5\x15\x94I\x9c\ +\x88p\x10\xbe=\xb1b\x95\xb4\xdb\xb4\xd4\xda\xe8\x9dA\ +\x90~\xfe}\xb9\xa4\x92\xebn\xf2\x22\x8a\xc6w6M\ +\x8aZ\x0bS\x051\xd3+(\xafR\xe1\x8dzk\xb5\ +wD\xbd\x0c\xad\xf4]%,\xe3\xcd\x8a0>K\x03\ +\x9cy\xca\xa6N\xae\x0b\xc2\xcc$\x07\x0b\xc1\x94\x82\xf6\ +\x10\xf1\xba\x90\xb6\x9b\x9a\xd8\x5c<\x13\xf1\xea\x02\x06\x18\ +'M<\x89o3\x8a\xd3\x86\xde\xe9X3u=\xeb\ +\x93i\xe2DoN\x00l\xcf\xd5\x85\xdaV\xa6\x9a\xa6\ +?\xcbL!h\x90\xf2`\xba\xe1\xe8\x06]9!\x13\ +2\xed1\x82\x03g0\x82\x03c\x02\x01\x010\x81\xcb\ +0\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02US\ +1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriS\ +ign, Inc.1\x1f0\x1d\x06\x03U\ +\x04\x0b\x13\x16VeriSign Tru\ +st Network1;09\x06\x03\ +U\x04\x0b\x132Terms of us\ +e at https://www\ +.verisign.com/rp\ +a (c)09100.\x06\x03U\x04\x03\ +\x13'VeriSign Class\ + 3 Code Signing \ +2009-2 CA\x02\x10f\xe3\xf0gy\ +\xca\x15\x16mPSo\x88\x19\x1a\x830\x09\x06\x05+\ +\x0e\x03\x02\x1a\x05\x00\xa0p0\x10\x06\x0a+\x06\x01\x04\ +\x01\x827\x02\x01\x0c1\x020\x000\x19\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x031\x0c\x06\x0a+\x06\x01\x04\x01\ +\x827\x02\x01\x040\x1c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x0b1\x0e0\x0c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x150#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x04\ +1\x16\x04\x14\x83A\x01\xd9\x89\x14K\xaf\xc3\xf2\xd0_\ +\xbe\xaa\xa1\xb4\x8aKd\xfb0\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80\x86\xfb\x03X\xfd/\ +j\x9d\x9b\xbc\xb0\x8c #\x1d\xf2\xcaQ\xc6M$!\ +[\x85\xba\xebE\xdf\x8fF\xe4\xcb\x00\xf3\xab\x04E\x0a\ +`\x8a\xcb\xfc\x5co\x96\x1dh\xe9\xf6?\xc4\xbf\xfc\xff\ +\x165\x01\x11\xc9\xfc9o\x13$\x8aC\x0b\x8f\xc6\xa4\ +}\x81v\xa0\xf1\xf6+\x13n\x97\x12Dy\xbb\xd4\xb5\ +o\x0c\xe4$\xd1\xc63\xf7k\xff&\x09Rh\x07\xc0\ +\x0f\xd4\xa0k2],[\x1e\xf1\x16}\xee\xc4N\xac\ +\x83E\xb5\xc4#RO\xad7(\xa1\x82\x01\x7f0\x82\ +\x01{\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x061\x82\x01\ +l0\x82\x01h\x02\x01\x010g0S1\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1+0)\x06\x03U\x04\x03\x13\x22Ver\ +iSign Time Stamp\ +ing Services CA\x02\ +\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\ +\xd50\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\xa0]0\x18\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\x0b\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x07\x010\x1c\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x09\x051\x0f\x17\x0d1105051\ +65510Z0#\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x041\x16\x04\x14\xc4\x9a\xdfO%\xca\xa6\x1f\xd9\ +\x90\xf41\x88\xa1\x12\x9c\xaa\xef\x8bQ0\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80\xc1]\xa6\ +\x8ew\xa5\x96\x85p+\xceX\x13\x81\xfe\x94O\xd5#\ +%\x04\xdb\x0f\x0f_\xb5\x156\x06\xad\xfa*\xe5\xb2F\ +\xe2\xbdhI\xc7uz\x8b\x0d\x8e\xe9\x22\xbd\x13\xc3\xe9\ +\x17\xca\x1e[\xddV\xc6\xbb\xa9cY\xbd\xbf\x83\xb1\xad\ +.M\xb0^\xd8\x83\xe3_}\xde\x88\x98C\xe7\x8c\xe4\ +\xbd\x15\xb4\x93\xc7\xa12\x15\xfaw\xf4k\xa0\xe4\x06\xee\ +Qv.\x1a\xcd\x95\x81aQ\x98\xa3y\xa9\xe4n\x98\ +\xf2\x14\x88\xf7z^K\xbc\x95\xef\xf2\x08\x84\x00\x00\ +\x00\x03Q\x10\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIG\x9e\ +\x12D\x1d\x00\x03;\x9c\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x037|\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x037\x9c\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x037\xd4\x00\x00\x03\xc6OS/2\xa1\ +>\x9e\xc9\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x0f\ +M\x18\xa4\x00\x00\x1d\x90\x00\x00\x00\xa2fpgm~\ +a\xb6\x11\x00\x00\x14\xd0\x00\x00\x07\xb4gasp\x00\ +\x15\x00#\x00\x037l\x00\x00\x00\x10glyft\ +8\x99K\x00\x00%\x8c\x00\x01/\xb4head\xf7\ +v\xe2\xa6\x00\x00\x01<\x00\x00\x006hhea\x0d\ +\xcc\x09s\x00\x00\x01t\x00\x00\x00$hmtx\xe8\ +5<\xdd\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01U@\x00\x01\xb66loca)\ +\x14\xdc\xf1\x00\x00\x1e4\x00\x00\x07Vmaxp\x05\ +C\x02\x0a\x00\x00\x01\x98\x00\x00\x00 names\ +\xb0\x88\x85\x00\x03\x0bx\x00\x00\x05\xc7post\x02\ +C\xefl\x00\x03\x11@\x00\x00&+prepC\ +\xb7\x96\xa4\x00\x00\x1c\x84\x00\x00\x01\x09\x00\x01\x00\x00\x00\ +\x01\x19\x9a!\xc7\xf5__\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc951\x8b\x00\x00\x00\x00\xc9\xe8LL\xfb\ +\x9a\xfd\xd5\x09\xa2\x08b\x00\x00\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x09\xac\xfb\ +\x9a\xfe{\x09\xa2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00V\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +\x0e\x00\xf8\x00\x03\x00\x01\x00\x03\x04\xb6\x01\x90\x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x01\xf1\x08\x02\x02\x0b\x06\x06\x03\x05\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00@\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04H\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc1\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x02#\x00\x98\x035\x00\x85\x05\ ++\x003\x04\x93\x00\x83\x06\x96\x00h\x05\xd7\x00q\x01\ +\xc5\x00\x85\x02^\x00R\x02^\x00=\x04j\x00V\x04\ +\x93\x00h\x01\xf6\x00?\x02\x93\x00T\x02!\x00\x98\x02\ +\xf0\x00\x14\x04\x93\x00f\x04\x93\x00\xbc\x04\x93\x00d\x04\ +\x93\x00^\x04\x93\x00+\x04\x93\x00\x85\x04\x93\x00u\x04\ +\x93\x00^\x04\x93\x00h\x04\x93\x00j\x02!\x00\x98\x02\ +!\x00?\x04\x93\x00h\x04\x93\x00w\x04\x93\x00h\x03\ +o\x00\x1b\x071\x00y\x05\x10\x00\x00\x05/\x00\xc9\x05\ +\x0c\x00}\x05\xd5\x00\xc9\x04s\x00\xc9\x04!\x00\xc9\x05\ +\xd3\x00}\x05\xe7\x00\xc9\x02\xaa\x00T\x02#\xff`\x04\ +\xe9\x00\xc9\x04'\x00\xc9\x079\x00\xc9\x06\x08\x00\xc9\x06\ +;\x00}\x04\xd1\x00\xc9\x06;\x00}\x04\xf2\x00\xc9\x04\ +d\x00j\x04m\x00\x12\x05\xd3\x00\xba\x04\xc3\x00\x00\x07\ +h\x00\x1b\x04\x9e\x00\x08\x04{\x00\x00\x04\x91\x00R\x02\ +\xa2\x00\xa6\x02\xf0\x00\x17\x02\xa2\x003\x04V\x001\x03\ +\x96\xff\xfc\x04\x9e\x01\x89\x04s\x00^\x04\xe7\x00\xb0\x03\ +\xcf\x00s\x04\xe7\x00s\x04}\x00s\x02\xb6\x00\x1d\x04\ +b\x00'\x04\xe9\x00\xb0\x02\x06\x00\xa2\x02\x06\xff\x91\x04\ +3\x00\xb0\x02\x06\x00\xb0\x07q\x00\xb0\x04\xe9\x00\xb0\x04\ +\xd5\x00s\x04\xe7\x00\xb0\x04\xe7\x00s\x03D\x00\xb0\x03\ +\xd1\x00j\x02\xd3\x00\x1f\x04\xe9\x00\xa4\x04\x02\x00\x00\x06\ +9\x00\x17\x041\x00'\x04\x08\x00\x02\x03\xbe\x00R\x03\ +\x08\x00=\x04h\x01\xee\x03\x08\x00H\x04\x93\x00h\x02\ +\x14\x00\x00\x02#\x00\x98\x04\x93\x00\xbe\x04\x93\x00?\x04\ +\x93\x00{\x04\x93\x00\x1f\x04h\x01\xee\x04!\x00{\x04\ +\x9e\x015\x06\xa8\x00d\x02\xd5\x00F\x03\xfa\x00R\x04\ +\x93\x00h\x02\x93\x00T\x06\xa8\x00d\x04\x00\xff\xfa\x03\ +m\x00\x7f\x04\x93\x00h\x02\xc7\x001\x02\xc7\x00!\x04\ +\x9e\x01\x89\x04\xf4\x00\xb0\x05=\x00q\x02!\x00\x98\x01\ +\xd1\x00%\x02\xc7\x00L\x03\x00\x00B\x03\xfa\x00P\x06\ +=\x00K\x06=\x00.\x06=\x00\x1a\x03o\x003\x05\ +\x10\x00\x00\x05\x10\x00\x00\x05\x10\x00\x00\x05\x10\x00\x00\x05\ +\x10\x00\x00\x05\x10\x00\x00\x06\xfc\xff\xfe\x05\x0c\x00}\x04\ +s\x00\xc9\x04s\x00\xc9\x04s\x00\xc9\x04s\x00\xc9\x02\ +\xaa\x00<\x02\xaa\x00T\x02\xaa\xff\xff\x02\xaa\x00<\x05\ +\xc7\x00/\x06\x08\x00\xc9\x06;\x00}\x06;\x00}\x06\ +;\x00}\x06;\x00}\x06;\x00}\x04\x93\x00\x85\x06\ +;\x00}\x05\xd3\x00\xba\x05\xd3\x00\xba\x05\xd3\x00\xba\x05\ +\xd3\x00\xba\x04{\x00\x00\x04\xe3\x00\xc9\x04\xfa\x00\xb0\x04\ +s\x00^\x04s\x00^\x04s\x00^\x04s\x00^\x04\ +s\x00^\x04s\x00^\x06\xdd\x00^\x03\xcf\x00s\x04\ +}\x00s\x04}\x00s\x04}\x00s\x04}\x00s\x02\ +\x06\xff\xda\x02\x06\x00\xa9\x02\x06\xff\xb3\x02\x06\xff\xec\x04\ +\xc5\x00q\x04\xe9\x00\xb0\x04\xd5\x00s\x04\xd5\x00s\x04\ +\xd5\x00s\x04\xd5\x00s\x04\xd5\x00s\x04\x93\x00h\x04\ +\xd5\x00s\x04\xe9\x00\xa4\x04\xe9\x00\xa4\x04\xe9\x00\xa4\x04\ +\xe9\x00\xa4\x04\x08\x00\x02\x04\xe7\x00\xb0\x04\x08\x00\x02\x05\ +\x10\x00\x00\x04s\x00^\x05\x10\x00\x00\x04s\x00^\x05\ +\x10\x00\x00\x04s\x00^\x05\x0c\x00}\x03\xcf\x00s\x05\ +\x0c\x00}\x03\xcf\x00s\x05\x0c\x00}\x03\xcf\x00s\x05\ +\x0c\x00}\x03\xcf\x00s\x05\xd5\x00\xc9\x04\xe7\x00s\x05\ +\xc7\x00/\x04\xe7\x00s\x04s\x00\xc9\x04}\x00s\x04\ +s\x00\xc9\x04}\x00s\x04s\x00\xc9\x04}\x00s\x04\ +s\x00\xc9\x04}\x00s\x04s\x00\xc9\x04}\x00s\x05\ +\xd3\x00}\x04b\x00'\x05\xd3\x00}\x04b\x00'\x05\ +\xd3\x00}\x04b\x00'\x05\xd3\x00}\x04b\x00'\x05\ +\xe7\x00\xc9\x04\xe9\x00\xb0\x05\xe7\x00\x00\x04\xe9\x00\x14\x02\ +\xaa\xff\xe2\x02\x06\xff\x90\x02\xaa\x00*\x02\x06\xff\xda\x02\ +\xaa\x00\x1e\x02\x06\xff\xcc\x02\xaa\x00T\x02\x06\x005\x02\ +\xaa\x00T\x02\x06\x00\xb0\x04\xcd\x00T\x04\x0c\x00\xa2\x02\ +#\xff`\x02\x06\xff\x91\x04\xe9\x00\xc9\x043\x00\xb0\x04\ +%\x00\xb0\x04'\x00\xc9\x02\x06\x00\xa3\x04'\x00\xc9\x02\ +\x06\x00Y\x04'\x00\xc9\x02\x06\x00\xb0\x04'\x00\xc9\x02\ +\x83\x00\xb0\x04/\x00\x1d\x02\x17\xff\xfc\x06\x08\x00\xc9\x04\ +\xe9\x00\xb0\x06\x08\x00\xc9\x04\xe9\x00\xb0\x06\x08\x00\xc9\x04\ +\xe9\x00\xb0\x05s\x00\x01\x06\x08\x00\xc9\x04\xe9\x00\xb0\x06\ +;\x00}\x04\xd5\x00s\x06;\x00}\x04\xd5\x00s\x06\ +;\x00}\x04\xd5\x00s\x07b\x00}\x07\x89\x00q\x04\ +\xf2\x00\xc9\x03D\x00\xb0\x04\xf2\x00\xc9\x03D\x00`\x04\ +\xf2\x00\xc9\x03D\x00\x82\x04d\x00j\x03\xd1\x00j\x04\ +d\x00j\x03\xd1\x00j\x04d\x00j\x03\xd1\x00j\x04\ +d\x00j\x03\xd1\x00j\x04m\x00\x12\x02\xd3\x00\x1f\x04\ +m\x00\x12\x02\xd3\x00\x1f\x04m\x00\x12\x02\xd3\x00\x1f\x05\ +\xd3\x00\xba\x04\xe9\x00\xa4\x05\xd3\x00\xba\x04\xe9\x00\xa4\x05\ +\xd3\x00\xba\x04\xe9\x00\xa4\x05\xd3\x00\xba\x04\xe9\x00\xa4\x05\ +\xd3\x00\xba\x04\xe9\x00\xa4\x05\xd3\x00\xba\x04\xe9\x00\xa4\x07\ +h\x00\x1b\x069\x00\x17\x04{\x00\x00\x04\x08\x00\x02\x04\ +{\x00\x00\x04\x91\x00R\x03\xbe\x00R\x04\x91\x00R\x03\ +\xbe\x00R\x04\x91\x00R\x03\xbe\x00R\x02\x8f\x00\xb0\x04\ +\x9e\x00\xc3\x05\x14\x00\x00\x04s\x00^\x06\xfc\xff\xfe\x06\ +\xdd\x00^\x06;\x00}\x04\xd5\x00s\x04d\x00j\x03\ +\xd1\x00j\x04\xbc\x01\x0c\x04\xbc\x01\x0c\x04\xb2\x01-\x04\ +\xbc\x01%\x02\x06\x00\xa2\x04\x9e\x01o\x01\x93\x00%\x04\ +\xbc\x01\x08\x04\x9e\x00\xe7\x04\x9e\x01\xfc\x04\x9e\x01\x1b\x05\ +\x10\x00\x00\x02!\x00\x98\x04\xf2\xff\xd4\x06}\xff\xd4\x03\ +\x98\xff\xe4\x06\x81\xff\xe4\x05\x85\xff\xd4\x06\x81\xff\xe4\x02\ +\xb6\xff\xe9\x05\x10\x00\x00\x05/\x00\xc9\x04)\x00\xc9\x04\ +\x93\x00'\x04s\x00\xc9\x04\x91\x00R\x05\xe7\x00\xc9\x06\ +;\x00}\x02\xaa\x00T\x04\xe9\x00\xc9\x04\xd3\x00\x00\x07\ +9\x00\xc9\x06\x08\x00\xc9\x04m\x00H\x06;\x00}\x05\ +\xd5\x00\xc9\x04\xd1\x00\xc9\x04\x89\x00J\x04m\x00\x12\x04\ +{\x00\x00\x06b\x00j\x04\x9e\x00\x08\x06^\x00m\x06\ +B\x00P\x02\xaa\x00<\x04{\x00\x00\x04\xe3\x00s\x03\ +\xcd\x00Z\x04\xe9\x00\xb0\x02\xb6\x00\xa8\x04\xdf\x00\xa4\x04\ +\xe3\x00s\x05\x06\x00\xb0\x04\x19\x00\x0a\x04\xa4\x00q\x03\ +\xcd\x00Z\x03\xdd\x00s\x04\xe9\x00\xb0\x04\xbc\x00s\x02\ +\xb6\x00\xa8\x04%\x00\xb0\x04F\xff\xf2\x04\xf4\x00\xb0\x04\ +V\x00\x00\x03\xcd\x00q\x04\xd5\x00s\x053\x00\x19\x04\ +\xd5\x00\xa6\x03\xdb\x00s\x04\xe7\x00s\x03\xc9\x00\x12\x04\ +\xdf\x00\xa4\x05\xbe\x00s\x04^\xff\xec\x06\x06\x00\xa4\x06\ +/\x00s\x02\xb6\x00\x09\x04\xdf\x00\xa4\x04\xd5\x00s\x04\ +\xdf\x00\xa4\x06/\x00s\x04s\x00\xc9\x05\xdf\x00\x12\x04\ +)\x00\xc9\x05\x1d\x00}\x04d\x00j\x02\xaa\x00T\x02\ +\xaa\x00<\x02#\xff`\x07o\x00\x00\x07\xa0\x00\xc9\x05\ +\xdf\x00\x12\x04\xe5\x00\xc9\x04\xf8\x00\x1b\x05\xd5\x00\xc9\x05\ +\x10\x00\x00\x04\xe7\x00\xc9\x05/\x00\xc9\x04)\x00\xc9\x05\ +w\x00\x0e\x04s\x00\xc9\x06\xc1\x00\x02\x04\xa6\x00J\x06\ +\x19\x00\xcb\x06\x19\x00\xcb\x04\xe5\x00\xc9\x05\xa2\x00\x00\x07\ +9\x00\xc9\x05\xe7\x00\xc9\x06;\x00}\x05\xd5\x00\xc9\x04\ +\xd1\x00\xc9\x05\x0c\x00}\x04m\x00\x12\x04\xf8\x00\x1b\x06\ +b\x00j\x04\x9e\x00\x08\x05\xe5\x00\xc9\x05\x8f\x00\xaa\x08\ +B\x00\xc9\x08D\x00\xc9\x05\x81\x00\x12\x06\xd3\x00\xc9\x05\ +%\x00\xc9\x05\x0a\x00=\x08f\x00\xc9\x05\x17\x003\x04\ +s\x00^\x04\xc5\x00w\x04\x8d\x00\xb0\x03m\x00\xb0\x04\ +\x93\x00)\x04}\x00s\x05\xe3\x00\x04\x03\xdd\x00D\x05\ +\x12\x00\xb0\x05\x12\x00\xb0\x04'\x00\xb0\x04\x91\x00\x10\x05\ +\xe1\x00\xb0\x05\x12\x00\xb0\x04\xd5\x00s\x04\xf8\x00\xb0\x04\ +\xe7\x00\xb0\x03\xcf\x00s\x03\xbc\x00)\x04\x08\x00\x02\x05\ +\xb8\x00q\x041\x00'\x05\x02\x00\xb0\x04\xdd\x00\x9c\x07\ +\x1f\x00\xb0\x07-\x00\xb0\x05\x8f\x00)\x06)\x00\xb0\x04\ +\xbc\x00\xb0\x03\xf0\x009\x06\xa6\x00\xb0\x04q\x00%\x04\ +}\x00s\x04\xe9\x00\x14\x03m\x00\xb0\x03\xf0\x00s\x03\ +\xd1\x00j\x02\x06\x00\xa2\x02\x06\xff\xec\x02\x06\xff\x91\x06\ +\xb2\x00\x10\x07\x17\x00\xb0\x04\xe9\x00\x14\x04'\x00\xb0\x04\ +\x08\x00\x02\x04\xf8\x00\xb0\x047\x00\xc9\x03m\x00\xb0\x07\ +h\x00\x1b\x069\x00\x17\x07h\x00\x1b\x069\x00\x17\x07\ +h\x00\x1b\x069\x00\x17\x04{\x00\x00\x04\x08\x00\x02\x04\ +\x00\x00R\x08\x00\x00R\x08\x00\x00R\x03J\xff\xfc\x01\ +\x5c\x00\x19\x01\x5c\x00\x19\x01\xf6\x00?\x01\x5c\x00\x19\x02\ +\xcd\x00\x19\x02\xcd\x00\x19\x03=\x00\x19\x04\x04\x00{\x04\ +\x14\x00{\x03\x02\x00\xa4\x06F\x00\x98\x09\x9e\x00d\x01\ +\xc5\x00\x85\x03%\x00\x85\x02o\x00R\x02o\x00P\x03\ +\xe3\x00\x98\x01\x0a\xfey\x03'\x00m\x04\x93\x00b\x04\ +\x93\x00D\x06\x1b\x00\x9a\x04\xb8\x00?\x06\x98\x00\x8d\x04\ +)\x00w\x08'\x00\xc9\x065\x00%\x06B\x00P\x04\ +\xf4\x00f\x06=\x00G\x06=\x00 \x06=\x00G\x06\ +=\x00j\x04\xa6\x00f\x04\x93\x00'\x05\xe9\x00\xc9\x05\ +\x0c\x00L\x04\x93\x00h\x04d\x00%\x05\xa4\x00w\x03\ +\x12\x00\x0c\x04\x93\x00b\x04\x93\x00h\x04\x93\x00h\x04\ +\x93\x00h\x04\xaa\x00o\x04\xbc\x00\x1d\x04\xbc\x00\x1d\x04\ +\x9e\x00\xdb\x02\x06\xff\x91\x04\x00\x01\x89\x04\x00\x01q\x04\ +\x00\x01\x81\x02\xc7\x00'\x02\xc7\x00\x14\x02\xc7\x00;\x02\ +\xc7\x00)\x02\xc7\x009\x02\xc7\x003\x02\xc7\x00#\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +!\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00T\x08\x00\x00T\x02\x06\xff\x91\x01\ +\x5c\x00\x19\x04\xfa\x00\x0a\x04\x85\x00\x00\x06\xb8\x00\x12\x07\ +9\x00\xc9\x07q\x00\xb0\x05\x10\x00\x00\x04s\x00^\x06\ +R\xfe\xdf\x02\xaa\x00u\x033\x00\x98\x07u\x00\x1d\x07\ +u\x00\x1d\x06=\x00}\x04\xdf\x00s\x06%\x00\xba\x05\ +R\x00\xa4\x00\x00\xfcS\x00\x00\xfd\x0d\x00\x00\xfc\x19\x00\ +\x00\xfd\x08\x00\x00\xfd;\x04s\x00\xc9\x06\x19\x00\xcb\x04\ +}\x00s\x05\x12\x00\xb0\x08\x17\x00\x85\x06\x8d\x00\x00\x05\ +f\x00\x17\x05\x0e\x00\x17\x07Z\x00\xc9\x05\xe3\x00\xb0\x05\ +m\x00\x00\x04\x83\x00\x0a\x07^\x00\xc9\x06!\x00\xb0\x05\ +\xc5\x00\x14\x05#\x00\x0c\x07\xcb\x00\xc9\x06\xc5\x00\xb0\x04\ +\xa8\x00?\x03\xdd\x00\x19\x06^\x00m\x06\x06\x00\xa4\x06\ +=\x00}\x04\xd5\x00s\x05\x02\x00\x00\x04\x0c\x00\x00\x05\ +\x02\x00\x00\x04\x0c\x00\x00\x09\xac\x00}\x08}\x00s\x06\ +\x8d\x00}\x05B\x00s\x07\xfe\x00}\x06w\x00s\x07\ +\xdf\x00^\x06\x8d\x00\x00\x05\x1d\x00}\x03\xe7\x00s\x04\ +\xdf\x00j\x04u\x00\xcb\x04\x9e\x00\xf8\x04\x9e\x01\xdf\x04\ +\x9e\x01\xe1\x07\xe9\x00)\x07\xa6\x00)\x06)\x00\xc9\x05\ +%\x00\xb0\x04\xe7\x00/\x04\xbc\x00\x14\x04\xe3\x00\xc9\x04\ +\xe7\x00\xb0\x047\x00/\x03m\x00\x12\x05#\x00\xc9\x04\ +3\x00\xb0\x07\x1f\x00\x02\x06=\x00\x04\x04\xa6\x00J\x03\ +\xdd\x00D\x05J\x00\xc9\x04\x5c\x00\xb0\x04\xe9\x00\xc9\x04\ +D\x00\xb0\x04\xe9\x00/\x04#\x00\x14\x05\x83\x00\x10\x04\ +\xec\x00)\x05\xf8\x00\xc9\x05/\x00\xb0\x06\x81\x00\xc9\x05\ +\xe3\x00\xb0\x08\x89\x00\xc9\x06\xec\x00\xb0\x06;\x00}\x05\ +\x1f\x00s\x05\x0c\x00}\x03\xcf\x00s\x04m\x00\x10\x03\ +\xbc\x00)\x04{\x00\x00\x04\x02\x00\x00\x04{\x00\x00\x04\ +\x02\x00\x00\x04\xf4\x00\x08\x04V\x00'\x06\xd7\x00\x10\x05\ +\xbc\x00)\x05\x89\x00\xaa\x04\xdf\x00\x9c\x05\x8f\x00\xaa\x04\ +\xcd\x00\x9c\x05\x8f\x00\xc9\x04\xae\x00\xb0\x06\xb4\x00=\x05\ +F\x003\x06\xb4\x00=\x05F\x003\x02\xaa\x00T\x06\ +\xc1\x00\x02\x05\xe3\x00\x04\x05\x83\x00\xc9\x04d\x00\xb0\x05\ +\xa6\x00\x00\x04\x93\x00\x10\x05\xd1\x00\xc9\x04\xee\x00\xb0\x05\ +\xf6\x00\xc9\x059\x00\xb0\x05\x8f\x00\xaa\x04\xdd\x00\x9c\x07\ +;\x00\xc9\x05\xe3\x00\xb0\x02\xaa\x00T\x05\x10\x00\x00\x04\ +s\x00^\x05\x10\x00\x00\x04s\x00^\x06\xfc\xff\xfe\x06\ +\xdd\x00^\x04s\x00\xc9\x04}\x00s\x05\xd7\x00u\x04\ +y\x00f\x05\xd7\x00u\x04y\x00f\x06\xc1\x00\x02\x05\ +\xe3\x00\x04\x04\xa6\x00J\x03\xdd\x00D\x04\xaa\x00J\x03\ +\xe9\x00\x1b\x06\x19\x00\xcb\x05\x12\x00\xb0\x06\x19\x00\xcb\x05\ +\x12\x00\xb0\x06;\x00}\x04\xd5\x00s\x06=\x00}\x04\ +\xd5\x00s\x06=\x00}\x04\xd5\x00s\x05\x0a\x00=\x03\ +\xf0\x009\x04\xf8\x00\x1b\x04\x08\x00\x02\x04\xf8\x00\x1b\x04\ +\x08\x00\x02\x04\xf8\x00\x1b\x04\x08\x00\x02\x05\x8f\x00\xaa\x04\ +\xdd\x00\x9c\x047\x00\xc9\x03m\x00\xb0\x06\xd3\x00\xc9\x06\ +)\x00\xb0\x047\x00/\x03m\x00\x12\x04\xf8\x00\x08\x04\ +R\x00'\x04\x9e\x00\x06\x041\x00'\x04\xe7\x00\x83\x04\ +\xe7\x00s\x071\x00\x83\x07+\x00s\x07;\x00N\x06\ +j\x00P\x05\x00\x00N\x04/\x00P\x07\xd9\x00\x00\x06\ +\xcf\x00\x10\x08\x19\x00\xc9\x07N\x00\xb0\x06\x0c\x00}\x05\ +\x1f\x00s\x05\xae\x00\x10\x05-\x00)\x04\xaa\x00o\x03\ +\xcd\x00Z\x05\x9a\x00\x00\x04\x91\x00\x10\x05\x10\x00\x00\x04\ +s\x00^\x05\x10\x00\x00\x04s\x00^\x05\x10\x00\x00\x04\ +s\x00^\x05\x10\x00\x00\x04s\x00-\x05\x10\x00\x00\x04\ +s\x00^\x05\x10\x00\x00\x04s\x00^\x05\x10\x00\x00\x04\ +s\x00^\x05\x10\x00\x00\x04s\x00^\x05\x10\x00\x00\x04\ +s\x00^\x05\x10\x00\x00\x04s\x00^\x05\x10\x00\x00\x04\ +s\x00^\x05\x10\x00\x00\x04s\x00^\x04s\x00\xc9\x04\ +}\x00s\x04s\x00\xc9\x04}\x00s\x04s\x00\xc9\x04\ +}\x00s\x04s\x00\xc9\x04}\x00s\x04s\x00]\x04\ +}\x00J\x04s\x00\xc9\x04}\x00s\x04s\x00\xc9\x04\ +}\x00s\x04s\x00\xc9\x04}\x00s\x02\xaa\x00T\x02\ +\x06\x00{\x02\xaa\x00T\x02\x06\x00\x9d\x06;\x00}\x04\ +\xd5\x00s\x06;\x00}\x04\xd5\x00s\x06;\x00}\x04\ +\xd5\x00s\x06;\x00}\x04\xd5\x00a\x06;\x00}\x04\ +\xd5\x00s\x06;\x00}\x04\xd5\x00s\x06;\x00}\x04\ +\xd5\x00s\x06=\x00}\x04\xdf\x00s\x06=\x00}\x04\ +\xdf\x00s\x06=\x00}\x04\xdf\x00s\x06=\x00}\x04\ +\xdf\x00s\x06=\x00}\x04\xdf\x00s\x05\xd3\x00\xba\x04\ +\xe9\x00\xa4\x05\xd3\x00\xba\x04\xe9\x00\xa4\x06%\x00\xba\x05\ +R\x00\xa4\x06%\x00\xba\x05R\x00\xa4\x06%\x00\xba\x05\ +R\x00\xa4\x06%\x00\xba\x05R\x00\xa4\x06%\x00\xba\x05\ +R\x00\xa4\x04{\x00\x00\x04\x08\x00\x02\x04{\x00\x00\x04\ +\x08\x00\x02\x04{\x00\x00\x04\x08\x00\x02\x04\xe7\x00s\x00\ +\x00\xfb\xe5\x00\x00\xfcq\x00\x00\xfb\x9a\x00\x00\xfcq\x00\ +\x00\xfch\x00\x00\xfcy\x00\x00\xfcy\x00\x00\xfcy\x00\ +\x00\xfch\x01\xa4\x001\x01\xa4\x00\x19\x01\xa4\x00\x19\x03\ +-\x004\x04\x89\x00s\x02\xf4\x00-\x04\x14\x00)\x04\ +\x93\x00^\x04\x8f\x00\x17\x04\x93\x00\x85\x04\x93\x00u\x04\ +\x93\x00^\x04\x93\x00h\x04\x93\x00j\x05m\x00\x1d\x06\ +Z\x00\x5c\x04m\x00\x12\x02\xd3\x00\x1f\x04\xe7\x00q\x04\ +\xe7\x00q\x04\xe7\x00q\x04\xe7\x00q\x04\xe7\x00q\x02\ +;\x00\xc9\x02;\x00\x05\x02;\x00\xb3\x02;\xff\xc7\x02\ +;\x00\x05\x02;\xff\xab\x02;\xff\xf3\x02;\xff\xe7\x02\ +;\x00V\x02;\x00\xbb\x04^\x00\xc9\x02\xe5\xff\xe4\x02\ +;\x00\xc9\x00\x05\x00\xc9\x00\x05\x00\xc9\x00\xc9\x00\x99\x00\ +\xb8\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,E#E`D-,K#QX\xb9\ +\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD\ +-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f\ +`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01\ +aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b\ +!!!!!Y-,\xb0\x02CTXKS#\ +KQZX8\x1b!!Y\x1b!!!!Y-\ +,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\ +\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#\ +D\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04\ +%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\ +\xb0\x07%\x08\xb0\x07%\x10\xb0\x06% F\xb0\x04%\ +\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\ +\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\x07%\x10\ +\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\ +\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\x07\ +%\x08\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y\ +!!!!!!!-,\x02\xb0\x04% F\ +\xb0\x04%#B\xb0\x05%\x08\xb0\x03%EH!!\ +!!-,\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%\ +CH!!!-,E# E\x18 \xb0\x00P\ + X#e#Y#h \xb0@PX!\xb0@\ +Y#XeY\x8a`D-,KS#KQZ\ +X E\x8a`D\x1b!!Y-,KTX \ +E\x8a`D\x1b!!Y-,KS#KQZ\ +X8\x1b!!Y-,\xb0\x00!KTX8\x1b\ +!!Y-,\xb0\x02CTX\xb0F+\x1b!!\ +!!Y-,\xb0\x02CTX\xb0G+\x1b!!\ +!Y-,\xb0\x02CTX\xb0H+\x1b!!!\ +!Y-,\xb0\x02CTX\xb0I+\x1b!!!\ +Y-, \x8a\x08#KS\x8aKQZX#8\ +\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \ +\xb0@8\x11\x1b!Y-,\x01F#F`#F\ +a# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\ +\x8apE`h:-, \x8a#Id\x8a#S\ +X<\x1b!Y-,KRX}\x1bzY-,\ +\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\ +\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88\ +TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\ +\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1\ +$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01K\ +RX\xb2\x02\x08\x02C`BY\x1b\xb9@\x00\x00\x80\ +\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80\ +c\xb8\x01\x00\x88TX\xb2\x02\x08\x02C`BY\xb9\ +@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C\ +`BY\xb1&\x01\x88QX\xb9@\x00\x02\x00c\xb8\ +\x04\x00\x88TX\xb2\x02@\x02C`BY\xb9@\x00\ +\x04\x00c\xb8\x08\x00\x88TX\xb2\x02\x80\x02C`B\ +YYYYYY\xb1\x00\x02CTX@\x0a\x05@\ +\x08@\x09@\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\ +\x05@\x08\xba\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\ +\xb1\x80\x02CRX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\ +\x1b\xb2\x05@\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\ +\x00\x80\x88U\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZ\ +X\xb3\x0c\x00\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYB\ +BBBB-,E\x18h#KQX# E\ + d\xb0@PX|Yh\x8a`YD-,\xb0\ +\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02\ +#>\xb1\x01\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\ +\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\ +\x06#eB\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\ +\xb0\x02CP\xb0\x01\xb0\x02CT[X!#\x10\xb0\ + \x1a\xc9\x1b\x8a\x10\xedY-,\xb0Y+-,\x8a\ +\x10\xe5-@\x99\x09!H U \x01\x1eU\x1fH\ +\x03U\x1f\x1e\x01\x0f\x1e?\x1e\xaf\x1e\x03MK&\x1f\ +LK3\x1fKF%\x1f&4\x10U%3$U\ +\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\xff\x1fJI3\x1f\ +IF%\x1f\x133\x12U\x05\x01\x03U\x043\x03U\ +\x1f\x03\x01\x0f\x03?\x03\xaf\x03\x03GF\x19\x1f\xebF\ +\x01#3\x22U\x1c3\x1bU\x163\x15U\x11\x01\x0f\ +U\x103\x0fU\x0f\x0fO\x0f\x02\x1f\x0f\xcf\x0f\x02\x0f\ +\x0f\xff\x0f\x02\x06\x02\x01\x00U\x013\x00Uo\x00\x7f\ +\x00\xaf\x00\xef\x00\x04\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\ +\x90\xb1TS++K\xb8\x07\xffRK\xb0\x09P[\ +\xb0\x01\x88\xb0%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\ +\xb0\x00UZ[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\ +\x1dK\xb02SX\xb0 \x1dYK\xb0dSX\xb0\ +\x10\x1d\xb1\x16\x00BYss++^stu+\ +++++t+st++++++++\ ++++++st+++\x18^\x00\x00\x00\x06\ +\x14\x00\x17\x00N\x05\xb6\x00\x17\x00u\x05\xb6\x05\xcd\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04H\x00\ +\x14\x00\x91\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\ +\x00\xff\xec\x00\x00\xfe\x14\xff\xec\x00\x00\x05\xb6\x00\x13\xfc\ +\x94\xff\xed\xfe\x85\xff\xea\xfe\xa9\xff\xec\x00\x18\xfe\xbc\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x8b\x00\x81\x00\ +\xdd\x00\x98\x00\x8f\x00\x8e\x00\x99\x00\x88\x00\x81\x01\x0f\x00\ +\x8a\x00\x00\x00\x00\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00Q\x00\ +w\x00\xff\x01{\x01\xec\x02j\x02\x83\x02\xae\x02\xd9\x03\ +\x15\x03A\x03_\x03t\x03\x96\x03\xaf\x03\xf1\x04\x1a\x04\ +[\x04\xb9\x04\xfb\x05F\x05\xa3\x05\xc5\x064\x06\x91\x06\ +\xc7\x06\xfb\x07\x1b\x07D\x07d\x07\xbb\x08A\x08\x80\x08\ +\xdb\x09\x19\x09U\x09\x8a\x09\xb8\x0a\x08\x0a9\x0al\x0a\ +\x94\x0a\xc3\x0a\xe1\x0b\x1f\x0bV\x0b\x9c\x0b\xd9\x0c,\x0c\ +y\x0c\xcc\x0c\xf0\x0d$\x0dK\x0d\x8f\x0d\xbf\x0d\xe6\x0e\ +\x12\x0e6\x0eO\x0er\x0e\x93\x0e\xa9\x0e\xc8\x0f$\x0f\ +y\x0f\xb4\x10\x07\x10T\x10\x94\x11(\x11f\x11\x94\x11\ +\xd2\x12\x10\x12'\x12\x7f\x12\xb9\x12\xfa\x13O\x13\xa3\x13\ +\xd6\x14(\x14h\x14\xa5\x14\xcc\x15\x17\x15G\x15\x80\x15\ +\xac\x15\xee\x16\x06\x16K\x16\x85\x16\x85\x16\xb6\x17\x01\x17\ +S\x17\xa1\x17\xf5\x18\x1a\x18\x95\x18\xcb\x19G\x19\x94\x19\ +\xcf\x19\xed\x19\xf5\x1a\x7f\x1a\x95\x1a\xcd\x1a\xd9\x1b\x13\x1b\ +c\x1b\x82\x1b\xc1\x1b\xf1\x1c\x13\x1cE\x1cl\x1c\xa5\x1c\ +\xdd\x1c\xf3\x1d\x08\x1d\x1e\x1d{\x1d\x8c\x1d\x9d\x1d\xae\x1d\ +\xbf\x1d\xd1\x1d\xdd\x1e+\x1e7\x1eH\x1eY\x1ej\x1e\ +|\x1e\x8d\x1e\x9e\x1e\xaf\x1e\xc1\x1f\x19\x1f*\x1f;\x1f\ +L\x1f]\x1fn\x1f\x80\x1f\xae \x19 * ; \ +L ^ o \xb1!\x18!(!8!H!\ +X!i!z\x22\x05\x22\x11\x22!\x221\x22A\x22\ +R\x22c\x22t\x22\x85\x22\x97\x22\xff#\x0f#\x1f#\ +/#?#O#`#\xa6$\x0c$\x1c$,$\ +<$M$]$\xb4$\xc5$\xd6$\xe6$\xf7%\ +\x07%\x13%\x1f%0%@%Q%a%r%\ +\x83%\x94%\xa4%\xb5%\xc6%\xce&:&K&\ +[&l&|&\x8d&\x9e&\xaa&\xb6&\xc7&\ +\xd7&\xe8&\xf8'\x09'\x19'*';'G'\ +W'h'y'\xc9(\x22(3(D(U(\ +f(w(\x88(\x93(\x9e(\xaf(\xc6(\xd2(\ +\xde(\xef)\x00)\x0c)\x17)L)])n)\ +y)\x85)\x96)\xa6)\xb2)\xbe)\xf8*-*\ +>*N*Z*e*v*\x86*\x97*\xde+\ +'+8+H+Y+i+{+\x8c+\xef,\ +i,z,\x8a,\x95,\xa1,\xb2,\xc3,\xd4,\ +\xe4,\xf5-\x05-\x11-\x1d-.->-I-\ +T-e-u-\xb2.\x04.\x15.%.6.\ +F.W.g.y.\x8a.\x9c.\xad.\xb9.\ +\xc5.\xd6.\xe7.\xf8/\x08/\x1a/+/;/\ +L/]/n/~/\xa5/\xf80w1\x161\ +'181I1Y1d1o1\x981\xc11\ +\xd71\xff2\x1f2T2{2\xb42\xe63\x053\ +N3_3g3x3\x8a3\x9c3\xad3\xbf3\ +\xd03\xe33\xeb3\xf34\x124\x1a4\x224*4\ +24\x8b4\x934\x9b4\xc14\xc94\xd15\x065\ +\x0e525:5q5y5\x815\xe85\xf06\ +<6\x906\xa26\xb46\xc46\xd46\xe46\xf57\ +\x077k7\xd08\x068g8\xc59\x129L9\ +\xa69\xd29\xda:,:4:_:\xca:\xd2;\ +\x10;\x5c;\xa8;\xed<%<]<\xba=\x10=\ +_=\xb9=\xcb=\xdc=\xec=\xfc>\x0d>\x1f>\ +o>\x80>\xca>\xd2>\xda>\xec>\xf4?S?\ +\xa6?\xe5?\xf6@\x07@7@?@\x86@\x8e@\ +\x96@\xdf@\xe7A,A\x89A\xc1A\xd2B\x01B\ +VcV\x97V\xaeV\xd2W\ +2WbW\xe3X,X>XPX}X\x89X\ +\x95X\xbcX\xe3Y\x02Y!Y@YuY\xb7Y\ +\xfcZMZnZ\xd3['['['['[\ +'['['['['['['['[\ +'['\x5cq\x5c\xcc\x5c\xdd\x5c\xe5]l]\xa7^\ +\x0b^\x1c^-^9^E^W^\x8c^\xc3^\ +\xd3^\xe3_@_\x97_\xe0`1`:`C`\ +L`z`\x99`\xaa`\xbb`\xcb`\xdbaNa\ +\x99a\xedb;b\x9bb\xfec?c\x80c\xd6d\ +,d\x8fd\xf4eie\xe0f\x8cg0g8g\ +@g\x9dg\xf6h/hghyh\x8bi\x01i\ +\x0di\x80i\xf3j\x9dk;k\xd1l:l}l\ +\xbfm\x03m3m`m\x86m\xacn\x90o\x1bo\ +\x81o\xdfp1p\x82p\xd7qCq{q\xb4r\ +\x06rUr\xa8r\xfbs\x07s\x13sPs\x8cs\ +\xcdt\x10tXt\xact\xe6u\x1eu]u\xa2u\ +\xddv\x1dvsv\xc6wBw\xb9w\xc5w\xd1x\ +\x02x4x\x8bP\x8bb\x8bt\x8b\x89\x8b\x9d\x8b\xaf\x8b\xc1\x8b\ +\xd3\x8b\xe5\x8b\xf7\x8c\x09\x8c\x1b\x8c-\x8cB\x8cV\x8c\ +b\x8cn\x8c\x7f\x8c\x90\x8c\xa1\x8c\xb1\x8c\xc3\x8c\xd5\x8c\ +\xe7\x8c\xf9\x8d\x0b\x8d\x1d\x8d/\x8dA\x8dV\x8dj\x8d\ +{\x8d\x8c\x8d\x98\x8d\xa4\x8d\xb0\x8d\xbc\x8d\xcd\x8d\xde\x8d\ +\xf0\x8e\x02\x8e\x14\x8e&\x8e8\x8eJ\x8e\x5c\x8en\x8e\ +\x83\x8e\x97\x8e\xa8\x8e\xb8\x8e\xc9\x8e\xd9\x8e\xea\x8e\xfb\x8f\ +\x0c\x8f\x1c\x8f(\x8f4\x8f@\x8fL\x8f]\x8fn\x8f\ +\x7f\x8f\x8f\x8f\xa0\x8f\xb0\x8f\xc1\x8f\xd2\x8f\xe3\x8f\xf3\x8f\ +\xff\x90\x0b\x90\x17\x90#\x904\x90E\x90V\x90f\x90\ +r\x90\xa6\x90\xe1\x91\x1d\x91j\x91\xc2\x91\xfa\x922\x92\ +{\x92\xcd\x92\xf5\x93\x18\x93;\x93D\x93\x83\x93\xad\x93\ +\xee\x94N\x94\x93\x94\xde\x94\xe6\x95\x09\x95\x11\x95n\x95\ +z\x95\xf6\x96\x02\x96\x0e\x96q\x96\x81\x96\x91\x96\xa2\x96\ +\xb2\x96\xc7\x96\xd8\x96\xe9\x96\xfa\x97\x0c\x97\x1d\x97.\x97\ +?\x97J\x97[\x97g\x97y\x97\x81\x97\x93\x97\x9b\x97\ +\xad\x97\xb5\x97\xbd\x97\xce\x97\xda\x00\x00\x00\x02\x00\xc1\x00\ +\x00\x04\x0a\x05\xb6\x00\x03\x00\x07\x00\x15\xb7\x04\x03\x05\x02\ +\x04\x03\x07\x00\x00/2/3\x01/3/310\ +\x13!\x11!7!\x11!\xc1\x03I\xfc\xb7h\x02y\ +\xfd\x87\x05\xb6\xfaJh\x04\xe6\x00\x02\x00\x98\xff\xe3\x01\ +\x89\x05\xb6\x00\x03\x00\x0e\x00+@\x14\x03\x09\x09\x02\x04\ +\x04\x0f\x10\x01\x01\x0c\x02\x0c\x06OY\x0c\x16\x02\x03\x00\ +??+\x11\x12\x009\x18/\x11\x12\x019\x1133\ +\x11310\x01#\x033\x03432\x16\x15\x14\x06\ +#\x22&\x01Fi3\xcf\xe1x:?@94D\ +\x01\x93\x04#\xfa\xb4\x88FB@G?\x00\x00\x02\x00\ +\x85\x03\xa6\x02\xb0\x05\xb6\x00\x03\x00\x07\x00\x1f@\x0d\x00\ +\x03\x07\x04\x03\x04\x08\x09\x06\x02\x07\x03\x03\x00?3\xcd\ +2\x11\x12\x0199\x113\x11310\x01\x03#\x03\ +!\x03#\x03\x01?(i)\x02+)h)\x05\xb6\ +\xfd\xf0\x02\x10\xfd\xf0\x02\x10\x00\x00\x02\x003\x00\x00\x04\ +\xf6\x05\xb6\x00\x1b\x00\x1f\x00\x99@U\x08\x1f\x1c\x15\x04\ +\x14\x09\x11\x0c\x0c\x09\x12\x0f\x0e\x0b\x04\x0a\x13\x13\x14\x16\ +\x1d\x1e\x07\x04\x06\x17\x04\x01\x00\x19\x04\x18\x05\x05\x06\x14\ +\x06\x0a!\x03\x1a\x17\x03\x18\x0a\x18 !\x08\x04\x0c\x0d\ +\x0cNY\x1c\x01\x0d\x1f\x00\x10\x11\x10NY\x19\x15\x11\ +O\x0d\x01O\x11\x01\x0d\x11\x0d\x11\x05\x17\x13\x03\x0a\x05\ +\x00/3?3\x1299//]]\x1133+\ +\x11\x0033\x1133+\x11\x0033\x11\x12\x019\ +9\x11\x173\x11\x1299\x113\x11\x12\x179\x11\x12\ +\x179\x113\x11\x12\x17922\x113\x11\x12\x179\ +10\x01\x03!\x15!\x03#\x13!\x03#\x13!5\ +!\x13!5!\x133\x03!\x133\x03!\x15\x01!\ +\x13!\x03\xd5B\x01\x1b\xfe\xcdT\x89T\xfe\xd1R\x88\ +P\xfe\xfa\x01\x1fD\xfe\xeb\x01+R\x8bR\x011T\ +\x86T\x01\x08\xfc\xe5\x01/B\xfe\xd1\x03\x83\xfe\xac\x81\ +\xfeR\x01\xae\xfeR\x01\xae\x81\x01T\x7f\x01\xb4\xfeL\ +\x01\xb4\xfeL\x7f\xfe\xac\x01T\x00\x03\x00\x83\xff\x89\x04\ +\x0c\x06\x12\x00 \x00&\x00-\x00f@5'\x11%\ +\x1d\x17\x04\x04*\x14\x0d\x05!\x00\x00\x19\x05\x11\x09\x05\ +./%\x0d\x06\x0dMY\x03\x06$\x0e*\x0eLY\ +\x1d*+\x1c\x14\x1cMY\x17*\x14\x06\x14\x06\x14\x05\ +\x16\x05\x00//\x1299//\x1292+\x11\x00\ +3\x113+\x11\x003\x113+\x11\x003\x11\x12\x01\ +\x179\x113\x113333\x11333\x1131\ +0\x01\x14\x06\x07\x15#5\x22&'5\x16\x163\x11\ +&&546753\x15\x16\x17\x07&'\x11\x1e\ +\x02\x074&'\x116\x01\x14\x16\x17\x11\x06\x06\x04\x0c\ +\xcc\xb7\x81p\xd2CS\xd9Y\xcd\xa5\xcb\xa7\x81\xb8\xab\ +4\x95\x9a\x9d\x9cJ\xaaY\x80\xd9\xfd\xddZocf\ +\x01\xc1\x88\xb1\x17\xe8\xdf#\x1f\x9c%/\x01\xb8A\xac\ +\x88\x83\xa8\x12\xb6\xb4\x05E\x83;\x0b\xfeN2_{\ +eHY,\xfe{\x1e\x03\x07L\x5c)\x01\x83\x10]\ +\x00\x00\x05\x00h\xff\xec\x06-\x05\xcb\x00\x09\x00\x15\x00\ +!\x00-\x001\x00E@$\x00\x10\x05\x0a\x16(\x1c\ +\x22\x22.(\x0a0\x10\x0623\x03\x0d\x1f+\x0d+\ +\x0d+01\x060\x18\x19%\x19\x07\x13\x07\x00?3\ +?3??\x1299//\x113\x113\x11\x12\x01\ +\x179\x113\x113\x113\x11310\x13\x14\x163\ +2\x11\x10#\x22\x06\x05\x14\x06#\x22&5463\ +2\x16\x01\x14\x1632654&#\x22\x06\x05\x14\ +\x06#\x22&54632\x16\x01\x01#\x01\xf2J\ +S\xa4\xa4SJ\x01\xca\x99\x94\x8c\x9b\x95\x92\x91\x9c\x01\ +\xa6JTTPPTTJ\x01\xcb\x99\x94\x8e\x99\x95\ +\x92\x8e\x9f\xfe\xfe\xfc\xd5\x93\x03+\x04\x02\xaa\xaa\x01T\ +\x01R\xa8\xaa\xe4\xe9\xee\xdf\xe3\xe6\xee\xfc\xdb\xab\xa9\xa7\ +\xad\xab\xa5\xa5\xab\xe3\xe9\xee\xde\xe3\xe6\xeb\x03 \xfaJ\ +\x05\xb6\x00\x00\x03\x00q\xff\xec\x05\xd3\x05\xcd\x00\x0b\x00\ +\x15\x005\x00Q@0\x13\x16\x00\x1d\x06#*+.\ ++-#\x0e&\x19\x1d\x16\x09673\x0cIY3\ +\x13\x0f'-\x0e0\x05/\x03\x19&\x03** /\ +\x12 \x09JY \x04\x00?+\x00\x18?\x129/\ +\x179\x12\x179?+\x11\x12\x01\x179\x113\x113\ +\x113\x11310\x01\x14\x16\x176654&#\ +\x22\x06\x1327\x01\x0e\x02\x15\x14\x16%467.\ +\x0254632\x16\x15\x14\x06\x07\x016673\ +\x02\x07\x01#'\x06\x06#\x22&\x01\x9eHW\x81e\ +gVYo\x9b\xf1\x9f\xfeKo\x5c,\x9b\xfe\xb9\x8b\ +\xb4U=$\xc4\xaf\xa2\xba\x88\x9d\x01\x978C\x17\xa8\ +D\x89\x01+\xe5\xb9v\xf4\x96\xd7\xed\x04\x93E}X\ +K\x7fSMa`\xfb\x9d\x9a\x01\xa8DYfAu\ +\x89\xfa\x82\xc8f_bj9\x96\xa8\xa7\x95k\xb5]\ +\xfey>\xa7c\xfe\xe2\x94\xfe\xdd\xb2j\x5c\xd4\x00\x00\ +\x01\x00\x85\x03\xa6\x01?\x05\xb6\x00\x03\x00\x14\xb7\x00\x03\ +\x03\x04\x05\x02\x03\x03\x00?\xcd\x11\x12\x019\x1131\ +0\x01\x03#\x03\x01?(i)\x05\xb6\xfd\xf0\x02\x10\ +\x00\x00\x01\x00R\xfe\xbc\x02!\x05\xb6\x00\x0d\x00\x1c@\ +\x0c\x07\x00\x0a\x04\x00\x04\x0e\x0f\x0b'\x03\x03\x00??\ +\x11\x12\x0199\x113\x11310\x13\x10\x1273\ +\x06\x02\x15\x14\x12\x17#&\x02R\x9b\x92\xa2\x90\x91\x94\ +\x8b\xa0\x93\x9a\x021\x01\x09\x01\xce\xae\xc1\xfe2\xf4\xf0\ +\xfe6\xbd\xaa\x01\xc6\x00\x00\x01\x00=\xfe\xbc\x02\x0c\x05\ +\xb6\x00\x0d\x00\x1c@\x0c\x04\x0a\x07\x00\x0a\x00\x0e\x0f\x0a\ +\x03\x04'\x00??\x11\x12\x0199\x113\x1131\ +0\x01\x10\x02\x07#6\x1254\x02'3\x16\x12\x02\ +\x0c\x9b\x92\xa0\x8b\x94\x91\x90\xa2\x93\x9a\x021\xfe\xf9\xfe\ +:\xa8\xbc\x01\xcb\xf0\xf4\x01\xce\xc1\xaf\xfe1\x00\x01\x00\ +V\x02\x7f\x04\x0e\x06\x14\x00\x0e\x000@\x1b\x03\x05\x04\ +\x01\x07\x0d\x0a\x09\x0b\x09\x0f\x10\x04\x0a\x01\x0d\x02\x0c\x0c\ +\x0d\x0a\x07\x04\x06\x08\x0e\x00\x00?\xc42\x179\x113\ +\x113\x113\x11\x12\x01\x17910\x01\x03%\x17\x05\ +\x13\x07\x03\x03'\x13%7\x05\x03\x02\x91+\x01\x8e\x1a\ +\xfe\x83\xf8\xac\xb0\xa0\xb0\xf2\xfe\x87\x1d\x01\x87+\x06\x14\ +\xfeuo\xb6\x1f\xfe\xba^\x01j\xfe\x96^\x01F\x1f\ +\xb6o\x01\x8b\x00\x00\x01\x00h\x00\xe3\x04)\x04\xc3\x00\ +\x0b\x00(@\x13\x00\x04\x04\x09\x05\x05\x0c\x0d\x03\x07\x08\ +\x07PY\x00\x0f\x08\x01\x08\x00/]3+\x11\x003\ +\x11\x12\x019\x1133\x11310\x01!\x15!\x11\ +#\x11!5!\x113\x02\x8d\x01\x9c\xfed\x8b\xfef\ +\x01\x9a\x8b\x03\x17\x8a\xfeV\x01\xaa\x8a\x01\xac\x00\x01\x00\ +?\xfe\xf8\x01m\x00\xee\x00\x08\x00\x11\xb5\x05\x00\x09\x0a\ +\x05\x00\x00/\xcd\x11\x12\x019910%\x17\x06\x02\ +\x07#6\x127\x01^\x0f\x1ab5}\x1bA\x0d\xee\ +\x17d\xfe\xf7rh\x012\x5c\x00\x01\x00T\x01\xd9\x02\ +?\x02q\x00\x03\x00\x11\xb5\x02\x00\x05\x04\x00\x01\x00/\ +3\x11\x12\x019910\x135!\x15T\x01\xeb\x01\ +\xd9\x98\x98\x00\x01\x00\x98\xff\xe3\x01\x89\x00\xf2\x00\x0b\x00\ +\x18@\x0b\x06\x00\x00\x0c\x0d\x09\x03OY\x09\x16\x00?\ ++\x11\x12\x019\x1131074632\x16\x15\ +\x14\x06#\x22&\x98=9:AB93CjC\ +EECAF?\x00\x00\x01\x00\x14\x00\x00\x02\xdb\x05\ +\xb6\x00\x03\x00\x13\xb7\x02\x00\x04\x05\x03\x03\x02\x12\x00?\ +?\x11\x12\x019910\x01\x01#\x01\x02\xdb\xfd\xdf\ +\xa6\x02!\x05\xb6\xfaJ\x05\xb6\x00\x02\x00f\xff\xec\x04\ +-\x05\xcd\x00\x0b\x00\x17\x00(@\x14\x12\x00\x0c\x06\x00\ +\x06\x19\x18\x09\x15KY\x09\x07\x03\x0fKY\x03\x19\x00\ +?+\x00\x18?+\x11\x12\x0199\x113\x1131\ +0\x01\x10\x02#\x22\x02\x11\x10\x1232\x12\x01\x10\x12\ +32\x12\x11\x10\x02#\x22\x02\x04-\xef\xf6\xec\xf6\xee\ +\xf4\xee\xf7\xfc\xe1\x96\xa4\xa6\x95\x95\xa6\xa4\x96\x02\xdd\xfe\ +\x85\xfe\x8a\x01\x7f\x01r\x01~\x01r\xfe~\xfe\x92\xfe\ +\xc1\xfe\xdd\x01'\x01;\x01;\x01%\xfe\xdf\x00\x01\x00\ +\xbc\x00\x00\x02\xcb\x05\xb6\x00\x0a\x00$@\x10\x09\x00\x01\ +\x08\x01\x0b\x0c\x04\x09\x07\x07\x01\x09\x06\x01\x18\x00??\ +\x129/\x129\x11\x12\x0199\x113310!\ +#\x1147\x06\x06\x07'\x013\x02\xcb\xa2\x08\x154\ +\xd4X\x01\x83\x8c\x04\x12\x82t\x15.\xacr\x01+\x00\ +\x01\x00d\x00\x00\x04%\x05\xcb\x00\x19\x00+@\x17\x18\ +\x01\x07\x13\x00\x13\x0e\x01\x04\x1a\x1b\x10\x0aKY\x10\x07\ +\x01\x18LY\x01\x18\x00?+\x00\x18?+\x11\x12\x01\ +\x179\x113\x11310!!5\x01>\x0254\ +&#\x22\x06\x07'632\x16\x15\x14\x02\x07\x01\x15\ +!\x04%\xfc?\x01\x81\xb0p8\x8e~[\xa3dX\ +\xca\xee\xce\xea\x9c\xd6\xfe\xc0\x02\xf0\x8f\x01\x83\xb2\x98\x90\ +Su\x89+\x198%\x0c\x1f=\x051\ +\x13\x01\x13\x05\x02*\x22\x1c\x1f%\x19\x0aBC\x1c\x0f\ +5\x0f5FY\x08;GY\x0a\x22\x08*\x0f\x08\x0f\ +\x08\x16**\x02GY*\x0f(?GY(\x10\x16\ +.GY\x16\x1b\x00?+\x00\x18?+\x00\x18?+\ +\x11\x12\x0099\x18//\x11\x1299++\x11\x12\ +\x009\x11\x12\x01\x179\x113\x113\x113\x113\x11\ +310\x01\x15\x07\x16\x16\x15\x14\x06#\x22'\x06\x15\ +\x14\x16332\x16\x15\x14\x04!\x22&5467\ +&&5467&&54632\x17\x01\x14\ +\x1632654&##\x22\x06\x13\x14\x1632\ +54#\x22\x06\x041\xcb\x1c,\xdc\xc01+jJ\ +Z\xc2\xb2\xbf\xfe\xdc\xfe\xe8\xd7\xe9\x80t*9@E\ +Uk\xd8\xc6VE\xfe\x11\x96\x8c\xd1\xc9n\x98\xc7q\ +~Z\x82t\xf3\xf6u~\x04Hi\x18#qG\xa1\ +\xc0\x088U-+\x96\x8f\xb6\xbf\xa0\x92d\x92\x1a\x13\ +P59UlK\x86\x9b\ +H\x87DJA,>85G\x90\x00\x01\x00\x1f\xff\ +\xec\x02\xa8\x05F\x00\x16\x004@\x1b\x10\x14\x14\x09\x0b\ +\x09\x12\x03\x04\x18\x17\x0a\x13\x10\x13GY\x0e@\x10\x0f\ +\x07\x00FY\x07\x16\x00?+\x00\x18?\x1a\xcd+\x11\ +\x003\x11\x12\x01\x179\x113\x11310%26\ +7\x15\x06\x06# \x11\x11#5773\x15!\x15\ +!\x11\x14\x16\x02\x12,R\x18\x1bi*\xfe\xc2\x9d\x9d\ +F`\x01>\xfe\xc2^u\x0d\x07\x7f\x0d\x11\x01O\x02\ +\x8cPE\xea\xfe\x81\xfd{cj\x00\x00\x01\x00\xa4\xff\ +\xec\x049\x04H\x00\x14\x004@\x19\x01\x13\x07\x0c\x0c\ +\x0a\x13\x0a\x15\x16\x0c\x0d\x0d\x10\x08\x14\x0f\x10\x04FY\ +\x10\x16\x0b\x15\x00??+\x00\x18?3\x129\x113\ +\x11\x12\x0199\x113\x113\x11310\x01\x11\x14\ +\x163265\x113\x11#'#\x06\x06#\x22&\ +5\x11\x01Lz\x82\xac\x9f\xa6\x89\x18\x093\xb5t\xc8\ +\xc7\x04H\xfd9\x86\x84\xbc\xd5\x02@\xfb\xb8\x93QV\ +\xbe\xd1\x02\xcd\x00\x00\x01\x00\x00\x00\x00\x04\x02\x04H\x00\ +\x0b\x00\x18@\x0a\x01\x0a\x0c\x0d\x05\x09\x01\x0f\x00\x15\x00\ +??39\x11\x12\x019910!\x013\x13\x16\ +\x1736\x12\x133\x01\x01\xa0\xfe`\xb2\xecP\x0e\x08\ +\x0bu\xcc\xb2\xfe`\x04H\xfdv\xe4D5\x01M\x02\ +0\xfb\xb8\x00\x01\x00\x17\x00\x00\x06#\x04H\x00\x1c\x00\ +,@\x14\x09\x1b\x1d\x1e\x17\x16\x0e\x0d\x03\x04\x0d\x04\x08\ +\x1a\x12\x09\x0f\x00\x08\x15\x00?3?33\x1299\ +\x113\x11333\x11\x12\x019910!\x03&\ +'#\x06\x07\x03#\x013\x12\x12\x173667\x13\ +3\x13\x16\x17366\x133\x01\x04/\xc9\x134\x08\ +(\x1e\xcf\xc0\xfe\xd5\xaejo\x08\x08\x0b1\x12\xc9\xb4\ +\xc48\x14\x08\x04#\xbf\xac\xfe\xd1\x02\x83;\xd1\xaf_\ +\xfd\x7f\x04H\xfec\xfePK9\xb55\x02u\xfd\x8b\ +\xacu$\x96\x02\xdc\xfb\xb8\x00\x00\x01\x00'\x00\x00\x04\ +\x08\x04H\x00\x0b\x00\x22@\x11\x07\x05\x06\x00\x01\x05\x0c\ +\x0d\x09\x03\x01\x08\x0b\x15\x04\x01\x0f\x00?3?3\x12\ +99\x11\x12\x01\x17910\x01\x013\x01\x013\x01\ +\x01#\x01\x01#\x01\xb8\xfe\x83\xbd\x01!\x01 \xbb\xfe\ +\x83\x01\x91\xbc\xfe\xcd\xfe\xca\xbc\x021\x02\x17\xfe\x5c\x01\ +\xa4\xfd\xe9\xfd\xcf\x01\xbc\xfeD\x00\x01\x00\x02\xfe\x14\x04\ +\x06\x04H\x00\x15\x00$@\x12\x09\x0f\x00\x03\x16\x17\x04\ +\x0d\x00\x0d\x12FY\x0d\x1b\x08\x00\x0f\x00?2?+\ +\x11\x12\x009\x11\x12\x01\x17910\x133\x13\x16\x17\ +366\x133\x01\x06\x06#\x22'5\x16327\ +7\x02\xb2\xf0O\x13\x08\x0dS\xe6\xb2\xfe)F\xbb\x88\ +LJ7D\xabI=\x04H\xfd\x8f\xd6_3\xf7\x02\ +|\xfb \xb9\x9b\x11\x85\x0c\xc0\x9c\x00\x00\x01\x00R\x00\ +\x00\x03m\x04H\x00\x09\x00+@\x17\x08\x01\x03\x07\x00\ +\x07\x04\x01\x04\x0a\x0b\x05\x04GY\x05\x0f\x01\x08GY\ +\x01\x15\x00?+\x00\x18?+\x11\x12\x01\x179\x113\ +\x11310!!5\x01!5!\x15\x01!\x03m\ +\xfc\xe5\x02V\xfd\xcf\x02\xe7\xfd\xb2\x02]q\x03V\x81\ +\x81\xfc\xba\x00\x01\x00=\xfe\xbc\x02\xc1\x05\xb6\x00\x1c\x00\ +,@\x15\x19\x1a\x1a\x0b\x17\x00\x00\x0f\x07\x14\x03\x03\x07\ +\x0b\x03\x1d\x1e\x13\x03\x04'\x00??\x11\x12\x01\x179\ +\x113\x1133\x113\x113\x11310%\x14\x16\ +\x17\x15&&5\x114ᘡ\x1146\ +3\x15\x06\x15\x11\x14\x07\x15\x16\x15\x01\xdbuq\xbe\xd0\ +~x\x82t\xd8\xb6\xe6\xdf\xdf\x0cf\x5c\x02\x8c\x02\xaa\ +\x9a\x01/hY\x8d\x02\x5c`\x012\x9b\xac\x8b\x06\xc1\ +\xfe\xd9\xd7'\x0c'\xd7\x00\x01\x01\xee\xfe\x10\x02{\x06\ +\x14\x00\x03\x00\x16@\x09\x02\x03\x03\x04\x05\x03\x1b\x00\x00\ +\x00??\x11\x12\x019\x11310\x013\x11#\x01\ +\xee\x8d\x8d\x06\x14\xf7\xfc\x00\x01\x00H\xfe\xbc\x02\xcb\x05\ +\xb6\x00\x1d\x00,@\x15\x15\x05\x0a\x12\x12\x02\x19\x00\x1d\ +\x1d\x0e\x0e\x19\x05\x03\x1e\x1f\x15'\x06\x03\x00??\x11\ +\x12\x01\x179\x113\x113\x1133\x113\x1131\ +0\x01&5\x114'52\x16\x15\x11\x14\x16\x17\x15\ +\x22\x06\x15\x11\x14\x06\x075665\x11467\x02\ +\x0a\xdf\xe3\xb8\xd3v\x82z~\xcd\xbeotnq\x02\ +?'\xd7\x01'\xc1\x06\x8b\xae\x99\xfe\xcea[\x02\x8d\ +Yh\xfe\xd1\x99\xab\x02\x8c\x02\x5cf\x01)rx\x14\ +\x00\x00\x01\x00h\x02P\x04)\x03T\x00\x17\x00$@\ +\x11\x03\x0f\x18\x19\x12\x0cPY\x03\x12\x0f\x06\x06\x00P\ +Y\x06\x00/+\x00\x10\x18\xc4/\xc4+\x11\x12\x019\ +910\x01\x22\x06\x075632\x16\x17\x16\x163\ +267\x15\x06#\x22&'&&\x01R5\x7f6\ +d\x90DqYBb/6\x806f\x8eH~H\ +KZ\x02\xc9C6\x97m\x1c&\x1c\x1b@9\x96n\ +! \x18\x00\x00\x02\x00\x98\xfe\x8b\x01\x89\x04^\x00\ +\x03\x00\x0e\x00+@\x14\x02\x04\x04\x03\x09\x09\x0f\x10\x00\ +\x00\x03\x0c\x0c\x06OY\x0c\x10\x03\x22\x00??+\x11\ +\x12\x009\x18/\x11\x12\x019\x1133\x11310\ +\x133\x13#\x13\x14#\x22&54632\x16\xdb\ +i3\xcf\xe1y<@\x1e\x16\x08\x0d\x03\x03\x0a\x04\x00\x10\ +\x10\x04\x08\x03\x1c\x1d\x19\x05\x02\x13\x0a\x0d\x02\x0d\x02\x0d\ +\x04\x0b\x07\x04\x19\x00??\x1299//\x1133\ +\x1133\x11\x12\x01\x179\x113\x1133\x113\x11\ +310%\x06\x07\x15#5&\x025\x10%53\ +\x15\x16\x16\x17\x07&#\x22\x06\x15\x14\x16327\x03\ +\xcbi\x93\x85\xcb\xc1\x01\x8c\x87K\x8e11\x85m\xac\ +\xa2\x9f\xa7\x8d\x8e\xf06\x06\xc8\xce \x01\x11\xfa\x01\xfc\ +>\xac\xa4\x03!\x17\x8c3\xd3\xd9\xd4\xcb;\x00\x01\x00\ +?\x00\x00\x04D\x05\xc9\x00\x1d\x00H@&\x18\x13\x09\ +\x0d\x0d\x1a\x16\x11\x02\x0b\x16\x13\x05\x1e\x1f\x0c\x18\x19\x18\ +NY\x09\x19\x19\x13\x00\x13\x10LY\x13\x18\x00\x05K\ +Y\x00\x07\x00?+\x00\x18?+\x11\x12\x009\x18/\ +3+\x11\x003\x11\x12\x01\x179\x1133\x113\x11\ +310\x012\x17\x07&#\x22\x06\x15\x11!\x15!\ +\x15\x14\x06\x07!\x15!5655#53\x114\ +6\x02\xaa\xbe\xaa=\x9a\x8f{}\x01\xa6\xfeZAJ\ +\x03\x1b\xfb\xfb\xcd\xc6\xc6\xe0\x05\xc9T\x85M|\x8c\xfe\ +\xd9\x7f\xddd\x88,\x9a\x8d/\xf4\xdf\x7f\x01<\xb2\xcd\ +\x00\x00\x02\x00{\x01\x06\x04\x17\x04\xa0\x00\x1b\x00'\x00\ + @\x0d\x1c\x00\x22\x0e\x00\x0e()\x1f\x15\x15%\x07\ +\x00/33/3\x11\x12\x0199\x113\x1131\ +0\x1347'7\x17632\x177\x17\x07\x16\x15\ +\x14\x07\x17\x07'\x06#\x22'\x07'7&7\x14\x16\ +32654&#\x22\x06\xb8J\x87^\x87h\x82\ +\x7ff\x89_\x86JJ\x83\x5c\x89f\x7f\x86d\x87\x5c\ +\x85J\x81\x9dtt\x9e\xa0rt\x9d\x02\xd3zk\x8c\ +\x5c\x85II\x85\x5c\x8aqv\x83g\x87\x5c\x85GI\ +\x85\x5c\x88k|p\xa0\x9fqr\xa2\xa4\x00\x00\x01\x00\ +\x1f\x00\x00\x04q\x05\xb6\x00\x16\x00V@.\x12\x0e\x07\ +\x0b\x0b\x10\x0c\x05\x09\x02\x09\x03\x0c\x14\x0e\x15\x07\x17\x18\ +\x0a\x0e\x0e\x07\x0f\x06\x12\x12\x03\x00\x13\x15\x0f\x13\x1f\x13\ +\x02\x0f\x13\x0f\x13\x0c\x01\x15\x06\x0c\x18\x00??3\x12\ +99//]\x11\x12922\x113\x1133\x11\ +3\x11\x12\x01\x179\x113\x1133\x113\x1131\ +0\x01\x013\x01!\x15!\x15!\x15!\x11#\x11!\ +5!5!5!\x013\x02H\x01{\xae\xfe`\x01\ +\x06\xfe\xc3\x01=\xfe\xc3\xa4\xfe\xc4\x01<\xfe\xc4\x01\x00\ +\xfee\xb2\x02\xdf\x02\xd7\xfc\xfe\x7f\xaa\x7f\xfe\xf4\x01\x0c\ +\x7f\xaa\x7f\x03\x02\x00\x02\x01\xee\xfe\x10\x02{\x06\x14\x00\ +\x03\x00\x07\x00$@\x10\x02\x06\x06\x03\x07\x07\x08\x09\x04\ +\x03\x04\x03\x07\x1b\x00\x00\x00??99//\x11\x12\ +\x019\x1133\x11310\x013\x11#\x113\x11\ +#\x01\xee\x8d\x8d\x8d\x8d\x06\x14\xfc\xf8\xfe\x0d\xfc\xf7\x00\ +\x02\x00{\xff\xf8\x03\x96\x06\x1d\x001\x00=\x00C@\ +&2\x00\x13\x06*\x1e8\x19\x19\x1e\x0c\x06\x00#\x06\ +>?\x15\x03;6\x1c-\x06!\x09!'GY!\ +\x15\x09\x10GY\x09\x00\x00?+\x00\x18?+\x11\x12\ +\x00\x179\x11\x12\x01\x179\x113\x113\x113\x113\ +10\x13467&&54632\x16\x17\x07\ +&&#\x22\x06\x15\x14\x16\x17\x16\x16\x15\x14\x06\x07\x16\ +\x15\x14\x06#\x22'5\x16\x1632654&&\ +'.\x027\x14\x16\x17\x17654&'\x06\x06\x8b\ +VNJT\xcf\xc5^\x9fa5b\x87Ltt{\ +\x9a\xba\x96RJ\x99\xea\xd4\xda\x80N\xc2R\x86\x8d0\ +ls\x8e\x86B\x92\x84\xa71\x89\x93\xb9DU\x03)\ +V\x89%(oUy\x8b\x1d'\x83'\x1b;@<\ +T7D\x97kZ\x8d)Q\x92\x8c\x99A\x94%-\ +LG.::+4ZrbMi=\x13Po\ +Sp9\x13d\x00\x02\x015\x05\x0e\x03h\x05\xd3\x00\ +\x0b\x00\x17\x00\x1e@\x0c\x06\x00\x0c\x12\x00\x12\x18\x19\x0f\ +\x03\x15\x09\x00/3\xcd2\x11\x12\x0199\x113\x11\ +310\x014632\x16\x15\x14\x06#\x22&%\ +4632\x16\x15\x14\x06#\x22&\x0155%&\ +77&%5\x01}5%%77%%5\x05\ +q4..421124..4211\ +\x00\x00\x03\x00d\xff\xec\x06D\x05\xcb\x00\x16\x00&\x00\ +6\x00F@''\x17\x03\x0f/\x1f\x1f\x14\x09\x0f\x17\ +\x0578\x06\x0c\x00\x12\x0f\x0c\x1f\x0c\x02\x00\x12\x10\x12\ +\x02\x0c\x12\x0c\x12\x1b+#\x133\x1b\x04\x00?3?\ +3\x1299//]]\x113\x113\x11\x12\x01\x17\ +9\x113\x113\x11310\x01\x22\x06\x15\x14\x163\ +27\x15\x06\x06#\x22&54632\x17\x07&\ +\x014\x12$32\x04\x12\x15\x14\x02\x04#\x22$\x02\ +7\x14\x12\x0432$\x1254\x02$#\x22\x04\x02\ +\x03}}\x87\x7f\x83V}0eF\xc2\xd0\xdd\xbf\x80\ +v:l\xfc\x97\xc8\x01^\xca\xc8\x01^\xca\xc2\xfe\xa2\ +\xd0\xcf\xfe\xa2\xc3i\xae\x01-\xac\xae\x01*\xaf\xae\xfe\ +\xd7\xb0\xae\xfe\xd6\xaf\x04#\xae\x9a\xa8\xa2-|\x14\x1c\ +\xf1\xd8\xd1\xf6\x0254&#\x22\x06\x07'632\x16\ +\x15\x14\x06\x07\x07!\x02\x8d\xfd\xa4\xecYR!P?\ +4bEB\x83\x98\x84\x93Y\x93\xae\x01\xb8\x02Jh\ +\xe6VaL6DE&2Xo\x82pP\x97\x8a\ +\xa5\x00\x01\x00!\x029\x02\x8d\x05\xc9\x00#\x009@\ +\x22\x0f\x05\x05\x00\x03\x12\x1e\x0a\x06$%\x12]\x13m\ +\x13\x02L\x13\x01\x0b\x13\x1b\x13\x02\x13\x13\x08\x1a!\x1f\ +\x0d\x08!\x00?3?3\x129/]]]3\x11\ +\x12\x01\x179\x11310\x01\x14\x06\x07\x16\x15\x14\x06\ +#\x22'5\x163254##53265\ +4&#\x22\x06\x07'6632\x16\x02sRD\ +\xb0\xb8\xa8\x98t\x93{\xd3\xe7uwgcPCB\ +p8E?\x8c^\x88\x9d\x04\xe7Pg\x17/\xa2\x80\ +\x8f8{D\xa2\x91kOD=D+#Z-6\ +w\x00\x01\x01\x89\x04\xd9\x03\x12\x06!\x00\x09\x00\x13\xb6\ +\x09\x04\x0a\x0b\x04\x80\x09\x00/\x1a\xcd\x11\x12\x0199\ +10\x016673\x15\x06\x06\x07#\x01\x890o\ + \xca,\xae@o\x04\xf2>\xb0A\x15A\xbe4\x00\ +\x01\x00\xb0\xfe\x14\x04D\x04H\x00\x16\x005@\x1a\x05\ +\x0a\x0a\x08\x10\x00\x13\x13\x14\x08\x14\x18\x17\x06\x15\x0f\x14\ +\x1b\x0d\x02FY\x0d\x16\x09\x15\x00??+\x00\x18?\ +?3\x11\x12\x0199\x113\x1133\x113\x113\ +10\x01\x103265\x113\x11#'#\x06#\ +\x22'#\x16\x15\x11#\x113\x01V\xfe\xab\x9f\xa6\x88\ +\x1a\x0ao\xe5\x96X\x0a\x0a\xa6\xa6\x01}\xfe\xfa\xbd\xd4\ +\x02@\xfb\xb8\x93\xa7\x5cT\xa0\xfe\xc0\x064\x00\x01\x00\ +q\xfe\xfc\x04`\x06\x14\x00\x0f\x00'@\x12\x04\x05\x01\ +\x00\x00\x05\x0b\x03\x10\x11\x08\x08\x05\x03\x0f\x05\x01\x05\x00\ +/3?3\x129/\x11\x12\x01\x179\x113\x113\ +10\x01#\x11#\x11#\x11\x06#\x22&5\x106\ +3!\x04`r\xd5s>T\xd8\xcb\xda\xe8\x02-\xfe\ +\xfc\x06\xb0\xf9P\x033\x12\xfa\xfb\x01\x04\xfe\x00\x01\x00\ +\x98\x02L\x01\x89\x03Z\x00\x0b\x00\x17@\x0a\x06\x00\x00\ +\x0d\x0c\x03\x09OY\x03\x00/+\x11\x12\x019\x113\ +10\x134632\x16\x15\x14\x06#\x22&\x98>\ +8:AB93C\x02\xd3BEEBAF?\ +\x00\x00\x01\x00%\xfe\x14\x01\xb4\x00\x00\x00\x12\x00$@\ +\x10\x11\x0e\x0b\x00\x00\x0e\x05\x03\x13\x14\x0e\x11\x11\x08\x03\ +\x10\x00/\xcc29/3\x11\x12\x01\x179\x113\x11\ +310\x01\x14\x06#\x22'5\x1632654\ +&'73\x07\x16\x01\xb4\x99\x963--;OQ\ +OmXn7\xb4\xfe\xdfaj\x09j\x08(6+\ +5\x11\xb2s'\x00\x01\x00L\x02J\x01\xe1\x05\xb6\x00\ +\x0a\x00 @\x0e\x02\x00\x03\x03\x0a\x0c\x0b\x09\x09\x03 \ +\x06\x00\x1e\x00?2?9/\x11\x12\x0199\x113\ +310\x013\x11#\x1147\x06\x06\x07'\x01R\ +\x8f\x85\x06\x166\x87C\x05\xb6\xfc\x94\x02C[Z\x16\ +-_`\x00\x02\x00B\x03\x14\x02\xbe\x05\xc7\x00\x0b\x00\ +\x17\x00%@\x12\x0c\x06\x12\x00\x06\x00\x18\x19\x0f\x00\x03\ +\x10\x03\x02\x03\x15\x09\x1f\x00?3\xc4]2\x11\x12\x01\ +99\x113\x11310\x01\x14\x06#\x22&54\ +632\x16\x05\x14\x1632654&#\x22\x06\ +\x02\xbe\xab\x96\x92\xa9\xa8\x97\x98\xa5\xfd\xfe[hi\x5c\ +\x5cig\x5c\x04o\xa4\xb7\xba\xa1\xa3\xb5\xb6\xa2zz\ +zz{vv\x00\x02\x00P\x00u\x03\xa8\x03\xbe\x00\ +\x06\x00\x0d\x00#@\x11\x0b\x09\x04\x02\x00\x03\x07\x02\x0a\ +\x09\x06\x0e\x0f\x0c\x05\x08\x01\x00/3/3\x11\x12\x01\ +\x179\x113\x11310\x01\x01'\x01\x017\x01\x05\ +\x01'\x01\x017\x01\x03\xa8\xfe\xa8u\x01\x1f\xfe\xe1u\ +\x01X\xfeu\xfe\xa8u\x01\x1f\xfe\xe1u\x01X\x02\x0c\ +\xfeiG\x01_\x01^E\xfei\x1b\xfeiG\x01_\ +\x01^E\xfei\xff\xff\x00K\x00\x00\x05\xd1\x05\xb6\x00\ +'\x02\x17\x02\x83\x00\x00\x00&\x00{\xff\x00\x01\x07\x02\ +<\x03\x1d\xfd\xb7\x00\x09\xb3\x03\x02\x12\x18\x00?55\ +\x00\xff\xff\x00.\x00\x00\x05\xdb\x05\xb6\x00'\x02\x17\x02\ +?\x00\x00\x00&\x00{\xe2\x00\x01\x07\x00t\x03N\xfd\ +\xb7\x00\x07\xb2\x02\x10\x18\x00?5\x00\xff\xff\x00\x1a\x00\ +\x00\x06!\x05\xc9\x00&\x00u\xf9\x00\x00'\x02\x17\x02\ +\xdf\x00\x00\x01\x07\x02<\x03m\xfd\xb7\x00\x09\xb3\x03\x02\ ++\x18\x00?55\x00\x00\x02\x003\xfew\x03T\x04\ +^\x00\x1d\x00(\x00A@\x22\x08\x14\x1e#\x01\x1c\x0f\ +\x1c#\x14\x04)*\x00\x1d\x01\x0c\x03\x1d\x1d\x11&&\ + OY&\x10\x11\x0bIY\x11#\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]\x11\x12\x01\x179\ +\x113\x113\x11310\x01\x15\x14\x06\x07\x0e\x02\x15\ +\x14\x163267\x17\x06#\x22&54>\x027\ +6655\x13\x14#\x22&54632\x16\x02\ +NKay=\x19\x84zP\x96b;\xc5\xc6\xbe\xd8\ +#@Y6eA\xb4y;>B73F\x02\xac\ +3z\x94TjKM8dq&0\x87`\xba\xaa\ +FiYR/Xt]\x1f\x01+\x87EB@G\ +@\xff\xff\x00\x00\x00\x00\x05\x10\x07s\x02&\x00$\x00\ +\x00\x01\x07\x00C\xff\xc2\x01R\x00\x08\xb3\x02\x10\x05&\ +\x00+5\xff\xff\x00\x00\x00\x00\x05\x10\x07s\x02&\x00\ +$\x00\x00\x01\x07\x00v\x00\x85\x01R\x00\x08\xb3\x02\x18\ +\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05\x10\x07s\x02\ +&\x00$\x00\x00\x01\x07\x01K\x00#\x01R\x00\x08\xb3\ +\x02\x1d\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05\x10\x07\ +/\x02&\x00$\x00\x00\x01\x07\x01R\x00\x04\x01R\x00\ +\x08\xb3\x02\x18\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05\ +\x10\x07%\x02&\x00$\x00\x00\x01\x07\x00j\x007\x01\ +R\x00\x0a\xb4\x03\x02$\x05&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05\x10\x07\x06\x02&\x00$\x00\x00\x00\x07\x01\ +P\x009\x00\x81\x00\x02\xff\xfe\x00\x00\x06\x81\x05\xb6\x00\ +\x0f\x00\x13\x00N@,\x0a\x0e\x0e\x11\x01\x00\x08\x0c\x01\ +\x10\x05\x05\x15\x05\x14\x09\x13\x06\x13IY\x10\x03IY\ +\x0a\x0dIY\x10\x0a\x10\x0a\x01\x06\x03\x05\x12\x01\x0eI\ +Y\x01\x12\x00?+\x00\x18??\x1299//+\ +++\x11\x003\x11\x013\x11\x12\x179\x1133\x11\ +310!!\x11!\x03#\x01!\x15!\x11!\x15\ +!\x11!\x01!\x11#\x06\x81\xfd\x12\xfd\xfe\xe3\xb0\x02\ +\xba\x03\xc9\xfd\xbc\x02\x1d\xfd\xe3\x02D\xfbT\x01\xbev\ +\x01\xd1\xfe/\x05\xb6\x97\xfe)\x96\xfd\xe6\x01\xd2\x02\xb5\ +\x00\xff\xff\x00}\xfe\x14\x04\xcf\x05\xcb\x02&\x00&\x00\ +\x00\x00\x07\x00z\x02\x02\x00\x00\xff\xff\x00\xc9\x00\x00\x03\ +\xf8\x07s\x02&\x00(\x00\x00\x01\x07\x00C\xff\xb7\x01\ +R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\xff\x00\xc9\x00\ +\x00\x03\xf8\x07s\x02&\x00(\x00\x00\x01\x07\x00v\x00\ +?\x01R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\ +\xc9\x00\x00\x03\xf8\x07s\x02&\x00(\x00\x00\x01\x07\x01\ +K\xff\xfb\x01R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\ +\xff\x00\xc9\x00\x00\x03\xf8\x07%\x02&\x00(\x00\x00\x01\ +\x07\x00j\x00\x12\x01R\x00\x0a\xb4\x02\x01!\x05&\x00\ ++55\xff\xff\x00<\x00\x00\x02V\x07s\x02&\x00\ +,\x00\x00\x01\x07\x00C\xfe\xb3\x01R\x00\x08\xb3\x01\x0d\ +\x05&\x00+5\xff\xff\x00T\x00\x00\x02s\x07s\x02\ +&\x00,\x00\x00\x01\x07\x00v\xffa\x01R\x00\x08\xb3\ +\x01\x15\x05&\x00+5\xff\xff\xff\xff\x00\x00\x02\xa1\x07\ +s\x02&\x00,\x00\x00\x01\x07\x01K\xfe\xf3\x01R\x00\ +\x08\xb3\x01\x1a\x05&\x00+5\xff\xff\x00<\x00\x00\x02\ +o\x07%\x02&\x00,\x00\x00\x01\x07\x00j\xff\x07\x01\ +R\x00\x0a\xb4\x02\x01!\x05&\x00+55\x00\x02\x00\ +/\x00\x00\x05H\x05\xb6\x00\x0c\x00\x17\x00W@2\x11\ +\x15\x15\x08\x04\x0d\x00\x00\x13\x04\x06\x04\x18\x19\x14\x06\x07\ +\x06IY\x11\x0f\x07?\x07\xaf\x07\xcf\x07\xdf\x07\x05\x0b\ +\x03\x07\x07\x04\x09\x09\x10JY\x09\x03\x04\x15JY\x04\ +\x12\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]3+\x11\x003\x11\x12\x01\x179\x113\x1133\ +\x11310\x01\x10\x00!!\x11#53\x11! \ +\x00\x03\x10!#\x11!\x15!\x113 \x05H\xfew\ +\xfe\x8f\xfe{\x9a\x9a\x01\xb2\x01Q\x01|\xb5\xfd\xc7\xe7\ +\x01{\xfe\x85\xbe\x02b\x02\xe9\xfe\x96\xfe\x81\x02\x89\x96\ +\x02\x97\xfe\x89\xfe\xa4\x02@\xfd\xfc\x96\xfe\x0a\xff\xff\x00\ +\xc9\x00\x00\x05?\x07/\x02&\x001\x00\x00\x01\x07\x01\ +R\x00\x93\x01R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\ +\xff\x00}\xff\xec\x05\xbe\x07s\x02&\x002\x00\x00\x01\ +\x07\x00C\x00y\x01R\x00\x08\xb3\x02\x19\x05&\x00+\ +5\xff\xff\x00}\xff\xec\x05\xbe\x07s\x02&\x002\x00\ +\x00\x01\x07\x00v\x01\x0a\x01R\x00\x08\xb3\x02!\x05&\ +\x00+5\xff\xff\x00}\xff\xec\x05\xbe\x07s\x02&\x00\ +2\x00\x00\x01\x07\x01K\x00\xb4\x01R\x00\x08\xb3\x02&\ +\x05&\x00+5\xff\xff\x00}\xff\xec\x05\xbe\x07/\x02\ +&\x002\x00\x00\x01\x07\x01R\x00\x9a\x01R\x00\x08\xb3\ +\x02!\x05&\x00+5\xff\xff\x00}\xff\xec\x05\xbe\x07\ +%\x02&\x002\x00\x00\x01\x07\x00j\x00\xd5\x01R\x00\ +\x0a\xb4\x03\x02-\x05&\x00+55\x00\x01\x00\x85\x01\ +\x10\x04\x0c\x04\x98\x00\x0b\x00\x19@\x09\x07\x09\x03\x01\x09\ +\x01\x0c\x0d\x08\x00\x19/\x11\x12\x0199\x113\x113\ +10\x01\x17\x01\x01\x07\x01\x01'\x01\x017\x01\x03\xac\ +`\xfe\xa0\x01^`\xfe\x9e\xfe\xa4e\x01^\xfe\xa0d\ +\x01a\x04\x98c\xfe\x9e\xfe\xa0c\x01_\xfe\xa1c\x01\ +`\x01`e\xfe\x9d\x00\x00\x03\x00}\xff\xc3\x05\xbe\x05\ +\xf6\x00\x13\x00\x1b\x00#\x00N@,\x16\x1f\x17\x1e\x04\ +\x1c\x14\x1c\x0a\x14\x00\x00\x12\x0f\x05\x08\x0a\x06$%\x16\ +\x1e!\x19\x0d!IY\x0f\x12\x08\x05\x04\x03\x10\x0d\x04\ +\x03\x19IY\x06\x03\x13\x00?\xc6+\x00\x18?\xc6\x12\ +\x179+\x11\x12\x0099\x11\x12\x01\x179\x113\x11\ +3\x11\x12\x17910\x01\x10\x00!\x22'\x07'7\ +&\x11\x10\x00!2\x177\x17\x07\x16\x03\x10'\x01\x16\ +32\x12\x01\x10\x17\x01&#\x22\x02\x05\xbe\xfe\x9d\xfe\ +\xc4\xeb\x94exl\xb2\x01`\x01D\xd1\x9daxj\ +\xc0\xb4n\xfd`s\xb0\xf3\xf8\xfc'e\x02\x9dj\xa8\ +\xf3\xfd\x02\xdd\xfe\xa1\xfend\x8dO\x9a\xc6\x01m\x01\ +e\x01\x89^\x87P\x94\xca\xfe\x95\x01\x10\x9a\xfcLR\ +\x012\x01*\xfe\xfa\x9a\x03\xafI\xfe\xcd\x00\xff\xff\x00\ +\xba\xff\xec\x05\x19\x07s\x02&\x008\x00\x00\x01\x07\x00\ +C\x00F\x01R\x00\x08\xb3\x01\x13\x05&\x00+5\xff\ +\xff\x00\xba\xff\xec\x05\x19\x07s\x02&\x008\x00\x00\x01\ +\x07\x00v\x00\xcf\x01R\x00\x08\xb3\x01\x1b\x05&\x00+\ +5\xff\xff\x00\xba\xff\xec\x05\x19\x07s\x02&\x008\x00\ +\x00\x01\x07\x01K\x00}\x01R\x00\x08\xb3\x01 \x05&\ +\x00+5\xff\xff\x00\xba\xff\xec\x05\x19\x07%\x02&\x00\ +8\x00\x00\x01\x07\x00j\x00\x98\x01R\x00\x0a\xb4\x02\x01\ +'\x05&\x00+55\xff\xff\x00\x00\x00\x00\x04{\x07\ +s\x02&\x00<\x00\x00\x01\x07\x00v\x001\x01R\x00\ +\x08\xb3\x01\x12\x05&\x00+5\x00\x02\x00\xc9\x00\x00\x04\ +y\x05\xb6\x00\x0c\x00\x15\x006@\x1c\x0d\x09\x05\x05\x06\ +\x11\x00\x06\x00\x16\x17\x0d\x04JY\x09\x15JY\x0d\x09\ +\x0d\x09\x06\x07\x03\x06\x12\x00??\x1299//+\ ++\x11\x12\x0199\x113\x113\x113310\x01\ +\x14\x04!#\x11#\x113\x113 \x04\x01326\ +54&##\x04y\xfe\xd1\xfe\xe1\xb8\xaa\xaa\xd7\x01\ +\x19\x01\x16\xfc\xfa\xa8\xe2\xca\xbe\xca\xcc\x03\x10\xe3\xee\xfe\ +\xc1\x05\xb6\xff\x00\xcf\xfd\xea\x8f\xa4\x95\x8a\x00\x00\x01\x00\ +\xb0\xff\xec\x04\x9c\x06\x1f\x000\x00A@\x22)*\x05\ +\x1d#\x00\x17\x0c\x0c\x00\x1d\x11*\x0512\x12\x12*\ +..&FY.\x00*\x15\x0f\x15FY\x0f\x16\x00\ +?+\x00\x18??+\x11\x12\x009\x18/\x11\x12\x01\ +\x179\x113\x113\x113\x11310\x01\x14\x07\x06\ +\x06\x15\x14\x16\x16\x17\x16\x16\x15\x14\x06#\x22'5\x16\ +\x163254&'&&5467665\ +4&# \x15\x11#\x114632\x16\x04\x19\x8f\ +X8\x1bGN\x8cf\xc2\xb3\xbck?\x9cH\xd7S\ +n\x7f`EGK@\x88\x7f\xfe\xec\xa6\xdc\xde\xce\xe1\ +\x04\xf2\x87sFC! *93_\x9de\xa0\xab\ +E\x9a'/\xb6KkFR{T?j59Z\ +5PU\xdf\xfbL\x04\xb2\xb2\xbb\x9d\xff\xff\x00^\xff\ +\xec\x03\xcd\x06!\x02&\x00D\x00\x00\x01\x06\x00C\x8e\ +\x00\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\x00^\xff\ +\xec\x03\xcd\x06!\x02&\x00D\x00\x00\x01\x06\x00v+\ +\x00\x00\x08\xb3\x02.\x11&\x00+5\xff\xff\x00^\xff\ +\xec\x03\xcd\x06!\x02&\x00D\x00\x00\x01\x06\x01K\xd8\ +\x00\x00\x08\xb3\x023\x11&\x00+5\xff\xff\x00^\xff\ +\xec\x03\xcd\x05\xdd\x02&\x00D\x00\x00\x01\x06\x01R\xbd\ +\x00\x00\x08\xb3\x02.\x11&\x00+5\xff\xff\x00^\xff\ +\xec\x03\xcd\x05\xd3\x02&\x00D\x00\x00\x01\x06\x00j\xe2\ +\x00\x00\x0a\xb4\x03\x02:\x11&\x00+55\xff\xff\x00\ +^\xff\xec\x03\xcd\x06\x85\x02&\x00D\x00\x00\x01\x06\x01\ +P\xf7\x00\x00\x0a\xb4\x03\x02(\x11&\x00+55\x00\ +\x03\x00^\xff\xec\x06s\x04\x5c\x00)\x004\x00;\x00\ +a@3*\x00$\x1108\x19\x19\x0409\x18\x18\ +\x1f0\x0b\x00\x05<=\x1b-'-FY\x191\x04\ +1GY8$'\x11\x04\x04\x0e\x22'\x165\x08\x0e\ +\x08FY\x14\x0e\x10\x00?3+\x11\x003\x18?3\ +\x129/9\x1293+\x11\x003+\x11\x003\x11\ +\x12\x01\x179\x113\x1133\x113\x1299\x113\ +10\x13467754&#\x22\x07'66\ +32\x16\x176632\x12\x15\x15!\x12!26\ +7\x15\x06\x06# '\x06\x06#\x22&7\x14\x163\ +2655\x07\x06\x06\x01\x22\x06\x07!4&^\xf8\ +\xfe\xb8tw\x90\xa34J\xc7b\x82\xa5)5\xabn\ +\xc0\xe8\xfdC\x08\x01:[\x9dTV\x95e\xfe\xdf}\ +Q\xc5\x86\xa3\xb9\xaekX\x91\xa8\x9e\xba\xa4\x03\xbdy\ +\x8b\x0b\x02\x07\x80\x01/\xa1\xb3\x08\x06D\x81{T\x7f\ +)5W_X`\xfe\xf5\xdek\xfeu#'\x94&\ +!\xe9\x7fj\xaa\x97_Y\xa9\x9ac\x07\x08m\x022\ +\xa6\x9e\x9c\xa8\x00\xff\xff\x00s\xfe\x14\x03\x8b\x04\x5c\x02\ +&\x00F\x00\x00\x00\x07\x00z\x01F\x00\x00\xff\xff\x00\ +s\xff\xec\x04\x12\x06!\x02&\x00H\x00\x00\x01\x06\x00\ +C\xb5\x00\x00\x08\xb3\x02\x1c\x11&\x00+5\xff\xff\x00\ +s\xff\xec\x04\x12\x06!\x02&\x00H\x00\x00\x01\x06\x00\ +vN\x00\x00\x08\xb3\x02$\x11&\x00+5\xff\xff\x00\ +s\xff\xec\x04\x12\x06!\x02&\x00H\x00\x00\x01\x06\x01\ +K\xf7\x00\x00\x08\xb3\x02)\x11&\x00+5\xff\xff\x00\ +s\xff\xec\x04\x12\x05\xd3\x02&\x00H\x00\x00\x01\x06\x00\ +j\x0a\x00\x00\x0a\xb4\x03\x020\x11&\x00+55\xff\ +\xff\xff\xda\x00\x00\x01c\x06!\x02&\x00\xf3\x00\x00\x01\ +\x07\x00C\xfeQ\x00\x00\x00\x08\xb3\x01\x05\x11&\x00+\ +5\xff\xff\x00\xa9\x00\x00\x022\x06!\x02&\x00\xf3\x00\ +\x00\x01\x07\x00v\xff \x00\x00\x00\x08\xb3\x01\x0d\x11&\ +\x00+5\xff\xff\xff\xb3\x00\x00\x02U\x06!\x02&\x00\ +\xf3\x00\x00\x01\x07\x01K\xfe\xa7\x00\x00\x00\x08\xb3\x01\x12\ +\x11&\x00+5\xff\xff\xff\xec\x00\x00\x02\x1f\x05\xd3\x02\ +&\x00\xf3\x00\x00\x01\x07\x00j\xfe\xb7\x00\x00\x00\x0a\xb4\ +\x02\x01\x19\x11&\x00+55\x00\x02\x00q\xff\xec\x04\ +b\x06!\x00\x1b\x00&\x00J@+!\x06\x0c\x1c\x1c\ +\x00\x00\x18\x19\x16\x0e\x11\x13\x10\x06\x09'(\x09\x1fF\ +Y\x0b\x03\x16\x11\x19\x0e\x0f\x05\x14\x09\x09\x03\x17\x14\x01\ +\x03$FY\x03\x16\x00?+\x00\x18?3\x129/\ +\x12\x179\x129+\x11\x12\x01\x179\x113\x113\x11\ +310\x01\x10\x00#\x22\x0054\x0032\x177\ +&'\x05'7&'7\x16\x177\x17\x07\x16\x12\x03\ +4&# \x11\x14\x16326\x04b\xfe\xfb\xf7\xde\ +\xfe\xe9\x01\x07\xdc\xe2d\x089\xcd\xfe\xf1I\xe9\x5c^\ +E\x9cf\xeeL\xcf\x98\xa5\xa8\xb4\x9c\xfe\xaf\xaf\xa2\xaf\ +\xa1\x023\xfe\xe7\xfe\xd2\x01\x0d\xe2\xe6\x01\x06y\x04\xd6\ +\xbf\x9bl\x85>1uIK\x8akw\x8f\xfer\xfe\ +\xe8\x93\xaa\xfe\x98\xa7\xb7\xc9\x00\xff\xff\x00\xb0\x00\x00\x04\ +D\x05\xdd\x02&\x00Q\x00\x00\x01\x06\x01R\x0e\x00\x00\ +\x08\xb3\x01\x1e\x11&\x00+5\xff\xff\x00s\xff\xec\x04\ +b\x06!\x02&\x00R\x00\x00\x01\x06\x00C\xd4\x00\x00\ +\x08\xb3\x02\x1a\x11&\x00+5\xff\xff\x00s\xff\xec\x04\ +b\x06!\x02&\x00R\x00\x00\x01\x06\x00vV\x00\x00\ +\x08\xb3\x02\x22\x11&\x00+5\xff\xff\x00s\xff\xec\x04\ +b\x06!\x02&\x00R\x00\x00\x01\x06\x01K\x0e\x00\x00\ +\x08\xb3\x02'\x11&\x00+5\xff\xff\x00s\xff\xec\x04\ +b\x05\xdd\x02&\x00R\x00\x00\x01\x06\x01R\xf1\x00\x00\ +\x08\xb3\x02\x22\x11&\x00+5\xff\xff\x00s\xff\xec\x04\ +b\x05\xd3\x02&\x00R\x00\x00\x01\x06\x00j\x1b\x00\x00\ +\x0a\xb4\x03\x02.\x11&\x00+55\x00\x03\x00h\x00\ +\xfc\x04)\x04\xa8\x00\x03\x00\x0f\x00\x1b\x003@\x18\x16\ +\x0a\x0a\x10\x04\x02\x04\x01\x03\x1c\x1d\x19\x13\x13\x01\x07\x0d\ +\x0d\x01\x01\x00PY\x01\x00/+\x11\x003\x18/3\ +\x113/3\x11\x12\x01\x179\x1133\x11310\ +\x135!\x15\x014632\x16\x15\x14\x06#\x22&\ +\x114632\x16\x15\x14\x06#\x22&h\x03\xc1\xfd\ +\xae;64:;34=;64:;34\ +=\x02\x8d\x8a\x8a\xfe\xe8<=?:9@?\x02\xf4\ +<=?:9@?\x00\x03\x00s\xff\xbc\x04b\x04\ +\x87\x00\x13\x00\x1b\x00#\x00K@)\x17\x1f\x1c\x14\x14\ +\x0a\x1c\x00\x00\x12\x0f\x05\x08\x0a\x06$%\x16\x1e!\x19\ +\x0d\x19FY\x0f\x12\x08\x05\x04\x03\x10\x0d\x10\x03!F\ +Y\x06\x03\x16\x00?\xc6+\x00\x18?\xc6\x12\x179+\ +\x11\x12\x0099\x11\x12\x01\x179\x113\x113\x11\x12\ +9910\x01\x10\x00#\x22'\x07'7&\x11\x10\ +\x0032\x177\x17\x07\x16\x05\x14\x17\x01&#\x22\x06\ +\x054'\x01\x16326\x04b\xfe\xf2\xee\x9apT\ +r^\x81\x01\x0c\xee\x9atTua\x7f\xfc\xbd5\x01\ +\xd1Kr\xa3\xa6\x02\x973\xfe/Gq\xa3\xa9\x02%\ +\xfe\xf4\xfe\xd3EuN\x83\x98\x01\x00\x01\x0c\x01+L\ +wL\x85\x98\xf9\xabf\x02\x865\xd6\xd4\xa4d\xfd}\ +3\xdb\x00\xff\xff\x00\xa4\xff\xec\x049\x06!\x02&\x00\ +X\x00\x00\x01\x06\x00C\xc4\x00\x00\x08\xb3\x01\x16\x11&\ +\x00+5\xff\xff\x00\xa4\xff\xec\x049\x06!\x02&\x00\ +X\x00\x00\x01\x06\x00vq\x00\x00\x08\xb3\x01\x1e\x11&\ +\x00+5\xff\xff\x00\xa4\xff\xec\x049\x06!\x02&\x00\ +X\x00\x00\x01\x06\x01K\x12\x00\x00\x08\xb3\x01#\x11&\ +\x00+5\xff\xff\x00\xa4\xff\xec\x049\x05\xd3\x02&\x00\ +X\x00\x00\x01\x06\x00j!\x00\x00\x0a\xb4\x02\x01*\x11\ +&\x00+55\xff\xff\x00\x02\xfe\x14\x04\x06\x06!\x02\ +&\x00\x5c\x00\x00\x01\x06\x00v\x12\x00\x00\x08\xb3\x01\x1f\ +\x11&\x00+5\x00\x02\x00\xb0\xfe\x14\x04u\x06\x14\x00\ +\x16\x00\x22\x00>@\x1f \x06\x1b\x14\x10\x10\x11\x06\x11\ +$#\x12\x00\x11\x1b\x0c\x16\x09\x03\x09\x1eFY\x09\x16\ +\x03\x17FY\x03\x10\x00?+\x00\x18?+\x11\x12\x00\ +99\x18??\x11\x12\x0199\x113\x1133\x11\ +310\x016632\x12\x11\x10\x02#\x22'#\ +\x17\x16\x15\x11#\x113\x11\x14\x07%\x22\x06\x07\x15\x14\ +\x163 \x114&\x01XB\xaaj\xd7\xf0\xf1\xd6\xde\ +z\x0c\x04\x08\xa6\xa6\x06\x01H\xa8\x98\x02\x9a\xaa\x01/\ +\x94\x03\xb4YO\xfe\xd4\xfe\xf5\xfe\xf4\xfe\xd3\xa1\x22M\ +?\xfe5\x08\x00\xfe.4Z\x1b\xb8\xc9)\xe7\xc7\x01\ +\xb0\xd7\xd1\xff\xff\x00\x02\xfe\x14\x04\x06\x05\xd3\x02&\x00\ +\x5c\x00\x00\x01\x06\x00j\xb5\x00\x00\x0a\xb4\x02\x01+\x11\ +&\x00+55\xff\xff\x00\x00\x00\x00\x05\x10\x06\xb4\x02\ +&\x00$\x00\x00\x01\x07\x01M\x00?\x01R\x00\x08\xb3\ +\x02\x12\x05&\x00+5\xff\xff\x00^\xff\xec\x03\xcd\x05\ +b\x02&\x00D\x00\x00\x01\x06\x01M\xf5\x00\x00\x08\xb3\ +\x02(\x11&\x00+5\xff\xff\x00\x00\x00\x00\x05\x10\x07\ +7\x02&\x00$\x00\x00\x01\x07\x01N\x00+\x01R\x00\ +\x08\xb3\x02\x0f\x05&\x00+5\xff\xff\x00^\xff\xec\x03\ +\xcd\x05\xe5\x02&\x00D\x00\x00\x01\x06\x01N\xe4\x00\x00\ +\x08\xb3\x02%\x11&\x00+5\xff\xff\x00\x00\xfeB\x05\ +\x11\x05\xbc\x02&\x00$\x00\x00\x00\x07\x01Q\x03\xa0\x00\ +\x00\xff\xff\x00^\xfeB\x04\x00\x04Z\x02&\x00D\x00\ +\x00\x00\x07\x01Q\x02\x8f\x00\x00\xff\xff\x00}\xff\xec\x04\ +\xcf\x07s\x02&\x00&\x00\x00\x01\x07\x00v\x01\x08\x01\ +R\x00\x08\xb3\x01 \x05&\x00+5\xff\xff\x00s\xff\ +\xec\x03\x8b\x06!\x02&\x00F\x00\x00\x01\x06\x00vD\ +\x00\x00\x08\xb3\x01 \x11&\x00+5\xff\xff\x00}\xff\ +\xec\x04\xcf\x07s\x02&\x00&\x00\x00\x01\x07\x01K\x00\ +\xac\x01R\x00\x08\xb3\x01%\x05&\x00+5\xff\xff\x00\ +s\xff\xec\x03\x8b\x06!\x02&\x00F\x00\x00\x01\x06\x01\ +K\xd4\x00\x00\x08\xb3\x01%\x11&\x00+5\xff\xff\x00\ +}\xff\xec\x04\xcf\x071\x02&\x00&\x00\x00\x01\x07\x01\ +O\x02\x1b\x01R\x00\x08\xb3\x01 \x05&\x00+5\xff\ +\xff\x00s\xff\xec\x03\x8b\x05\xdf\x02&\x00F\x00\x00\x01\ +\x07\x01O\x01P\x00\x00\x00\x08\xb3\x01 \x11&\x00+\ +5\xff\xff\x00}\xff\xec\x04\xcf\x07s\x02&\x00&\x00\ +\x00\x01\x07\x01L\x00\xc1\x01R\x00\x08\xb3\x01\x22\x05&\ +\x00+5\xff\xff\x00s\xff\xec\x03\xa1\x06!\x02&\x00\ +F\x00\x00\x01\x06\x01L\xf3\x00\x00\x08\xb3\x01\x22\x11&\ +\x00+5\xff\xff\x00\xc9\x00\x00\x05X\x07s\x02&\x00\ +'\x00\x00\x01\x07\x01L\x00X\x01R\x00\x08\xb3\x02\x1d\ +\x05&\x00+5\xff\xff\x00s\xff\xec\x05\x81\x06\x14\x02\ +&\x00G\x00\x00\x01\x07\x028\x03\x0c\x00\x00\x00\x07\xb2\ +\x02#\x00\x00?5\x00\xff\xff\x00/\x00\x00\x05H\x05\ +\xb6\x02\x06\x00\x92\x00\x00\x00\x02\x00s\xff\xec\x04\xd3\x06\ +\x14\x00\x1a\x00'\x00d@7%\x06\x12\x0e\x00\x1e\x1e\ +\x15\x19\x16\x19\x10\x06\x04()\x1a\x15\x18\x10\x11\x10G\ +Y\x15\x0f\x11\x1f\x11/\x11\x03\x09\x03\x11\x11\x09\x13\x00\ +\x01\x0c\x03\x09\x09\x22FY\x09\x10\x03\x1bFY\x03\x16\ +\x00?+\x00\x18?+\x11\x12\x0099\x18?\x129\ +/_^]3+\x11\x003\x18?\x11\x12\x01\x179\ +\x1133\x11333\x11310%#\x06#\x22\ +\x02\x11\x10\x1232\x173&55!5!53\ +\x153\x15#\x11#%26554&#\x22\x06\ +\x15\x14\x16\x03\x9a\x09s\xe5\xd7\xef\xf0\xd6\xdfw\x0d\x0b\ +\xfe@\x01\xc0\xa6\x9c\x9c\x87\xfe\x9e\xaa\x99\x9b\xaa\x92\x9b\ +\x9a\x93\xa7\x01&\x01\x0f\x01\x0f\x01,\xa2SI\x85\x81\ +\xb8\xb8\x81\xfb%w\xb9\xce#\xe9\xc7\xe3\xcf\xd2\xd6\xff\ +\xff\x00\xc9\x00\x00\x03\xf8\x06\xb4\x02&\x00(\x00\x00\x01\ +\x07\x01M\x00\x12\x01R\x00\x08\xb3\x01\x0f\x05&\x00+\ +5\xff\xff\x00s\xff\xec\x04\x12\x05b\x02&\x00H\x00\ +\x00\x01\x06\x01M\x0a\x00\x00\x08\xb3\x02\x1e\x11&\x00+\ +5\xff\xff\x00\xc9\x00\x00\x03\xf8\x077\x02&\x00(\x00\ +\x00\x01\x07\x01N\x00\x10\x01R\x00\x08\xb3\x01\x0c\x05&\ +\x00+5\xff\xff\x00s\xff\xec\x04\x12\x05\xe5\x02&\x00\ +H\x00\x00\x01\x06\x01N\xfb\x00\x00\x08\xb3\x02\x1b\x11&\ +\x00+5\xff\xff\x00\xc9\x00\x00\x03\xf8\x07\x14\x02&\x00\ +(\x00\x00\x01\x07\x01O\x01o\x015\x00\x08\xb3\x01\x15\ +\x05&\x00+5\xff\xff\x00s\xff\xec\x04\x12\x05\xdf\x02\ +&\x00H\x00\x00\x01\x07\x01O\x01T\x00\x00\x00\x08\xb3\ +\x02$\x11&\x00+5\xff\xff\x00\xc9\xfeB\x03\xf8\x05\ +\xb6\x02&\x00(\x00\x00\x00\x07\x01Q\x02s\x00\x00\xff\ +\xff\x00s\xfea\x04\x12\x04\x5c\x02&\x00H\x00\x00\x00\ +\x07\x01Q\x02f\x00\x1f\xff\xff\x00\xc9\x00\x00\x03\xf8\x07\ +s\x02&\x00(\x00\x00\x01\x07\x01L\x00\x10\x01R\x00\ +\x08\xb3\x01\x17\x05&\x00+5\xff\xff\x00s\xff\xec\x04\ +\x12\x06!\x02&\x00H\x00\x00\x01\x06\x01L\xfb\x00\x00\ +\x08\xb3\x02&\x11&\x00+5\xff\xff\x00}\xff\xec\x05\ +=\x07s\x02&\x00*\x00\x00\x01\x07\x01K\x00\xe9\x01\ +R\x00\x08\xb3\x01*\x05&\x00+5\xff\xff\x00'\xfe\ +\x14\x041\x06!\x02&\x00J\x00\x00\x01\x06\x01K\xca\ +\x00\x00\x08\xb3\x03P\x11&\x00+5\xff\xff\x00}\xff\ +\xec\x05=\x077\x02&\x00*\x00\x00\x01\x07\x01N\x01\ +\x00\x01R\x00\x08\xb3\x01\x1c\x05&\x00+5\xff\xff\x00\ +'\xfe\x14\x041\x05\xe5\x02&\x00J\x00\x00\x01\x06\x01\ +N\xce\x00\x00\x08\xb3\x03B\x11&\x00+5\xff\xff\x00\ +}\xff\xec\x05=\x071\x02&\x00*\x00\x00\x01\x07\x01\ +O\x02d\x01R\x00\x08\xb3\x01%\x05&\x00+5\xff\ +\xff\x00'\xfe\x14\x041\x05\xdf\x02&\x00J\x00\x00\x01\ +\x07\x01O\x01\x1f\x00\x00\x00\x08\xb3\x03K\x11&\x00+\ +5\xff\xff\x00}\xfe;\x05=\x05\xcb\x02&\x00*\x00\ +\x00\x00\x07\x029\x01'\x00\x00\xff\xff\x00'\xfe\x14\x04\ +1\x06!\x02&\x00J\x00\x00\x01\x06\x02:D\x00\x00\ +\x08\xb3\x03F\x11&\x00+5\xff\xff\x00\xc9\x00\x00\x05\ +\x1f\x07s\x02&\x00+\x00\x00\x01\x07\x01K\x00\x96\x01\ +R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\xff\x00\xb0\x00\ +\x00\x04D\x07\xaa\x02&\x00K\x00\x00\x01\x07\x01K\x00\ +\x1f\x01\x89\x00\x08\xb3\x01%\x02&\x00+5\x00\x02\x00\ +\x00\x00\x00\x05\xe7\x05\xb6\x00\x13\x00\x17\x00T@,\x17\ +\x03\x0f\x0f\x00\x10\x14\x04\x0c\x0c\x07\x0b\x08\x0b\x10\x12\x04\ +\x18\x19\x17\x0eIY\x16\x0a\x12\x13\x12JY\x07\x03\x13\ +\x17\x13\x17\x13\x01\x0c\x10\x12\x05\x01\x03\x00?3?3\ +\x1299//\x1133+\x11\x0033+\x11\x12\ +\x01\x179\x1133\x1133\x1133\x11331\ +0\x1353\x15!53\x153\x15#\x11#\x11!\ +\x11#\x11#5\x015!\x15\xc9\xaa\x03\x02\xaa\xc8\xc8\ +\xaa\xfc\xfe\xaa\xc9\x04u\xfc\xfe\x04\xbe\xf8\xf8\xf8\xf8\x8d\ +\xfb\xcf\x02\xb0\xfdP\x041\x8d\xfe\x8a\xe9\xe9\x00\x01\x00\ +\x14\x00\x00\x04D\x06\x14\x00\x1e\x00Y@2\x16\x14\x10\ +\x08\x08\x0d\x09\x00\x1e\x1e\x12\x09\x0b\x04\x1f \x17\x16\x1a\ +\x04FY\x13\x0b\x0c\x0bGY\x10\x0c\x0f\x0c\x1f\x0c/\ +\x0c\x03\x16\x1a\x0c\x0c\x1a\x16\x03\x09\x0e\x00\x00\x09\x15\x00\ +?3?\x12\x179///]\x113+\x11\x003\ ++\x11\x003\x11\x12\x01\x179\x113\x1133\x113\ +3310!\x114&#\x22\x06\x15\x11#\x11#\ +5353\x15!\x15!\x15\x14\x0736632\ +\x16\x15\x11\x03\x9ez\x82\xae\x9e\xa6\x9c\x9c\xa6\x01\xc1\xfe\ +?\x08\x0a1\xb5t\xc9\xc9\x02\x9e\x86\x84\xba\xd5\xfd\xe7\ +\x04\xdb\x7f\xba\xba\x7f\xc4T8O[\xbf\xd2\xfd\x5c\xff\ +\xff\xff\xe2\x00\x00\x02\xca\x07/\x02&\x00,\x00\x00\x01\ +\x07\x01R\xfe\xda\x01R\x00\x08\xb3\x01\x15\x05&\x00+\ +5\xff\xff\xff\x90\x00\x00\x02x\x05\xdd\x02&\x00\xf3\x00\ +\x00\x01\x07\x01R\xfe\x88\x00\x00\x00\x08\xb3\x01\x0d\x11&\ +\x00+5\xff\xff\x00*\x00\x00\x02\x82\x06\xb4\x02&\x00\ +,\x00\x00\x01\x07\x01M\xfe\xfd\x01R\x00\x08\xb3\x01\x0f\ +\x05&\x00+5\xff\xff\xff\xda\x00\x00\x022\x05b\x02\ +&\x00\xf3\x00\x00\x01\x07\x01M\xfe\xad\x00\x00\x00\x08\xb3\ +\x01\x07\x11&\x00+5\xff\xff\x00\x1e\x00\x00\x02\x8a\x07\ +7\x02&\x00,\x00\x00\x01\x07\x01N\xfe\xf9\x01R\x00\ +\x08\xb3\x01\x0c\x05&\x00+5\xff\xff\xff\xcc\x00\x00\x02\ +8\x05\xe5\x02&\x00\xf3\x00\x00\x01\x07\x01N\xfe\xa7\x00\ +\x00\x00\x08\xb3\x01\x04\x11&\x00+5\xff\xff\x00T\xfe\ +B\x02V\x05\xb6\x02&\x00,\x00\x00\x00\x06\x01Qh\ +\x00\xff\xff\x005\xfeB\x01\x81\x05\xdf\x02&\x00L\x00\ +\x00\x00\x06\x01Q\x10\x00\xff\xff\x00T\x00\x00\x02V\x07\ +1\x02&\x00,\x00\x00\x01\x07\x01O\x00P\x01R\x00\ +\x08\xb3\x01\x15\x05&\x00+5\x00\x01\x00\xb0\x00\x00\x01\ +V\x04H\x00\x03\x00\x16@\x09\x00\x01\x01\x05\x04\x02\x0f\ +\x01\x15\x00??\x11\x12\x019\x11310!#\x11\ +3\x01V\xa6\xa6\x04H\xff\xff\x00T\xfe\x7f\x04\x10\x05\ +\xb6\x00&\x00,\x00\x00\x00\x07\x00-\x02\xa8\x00\x00\xff\ +\xff\x00\xa2\xfe\x14\x03l\x05\xdf\x00&\x00L\x00\x00\x00\ +\x07\x00M\x02\x06\x00\x00\xff\xff\xff`\xfe\x7f\x02e\x07\ +s\x02&\x00-\x00\x00\x01\x07\x01K\xfe\xb7\x01R\x00\ +\x08\xb3\x01\x1c\x05&\x00+5\xff\xff\xff\x91\xfe\x14\x02\ +O\x06!\x02&\x027\x00\x00\x01\x07\x01K\xfe\xa1\x00\ +\x00\x00\x08\xb3\x01\x1b\x11&\x00+5\xff\xff\x00\xc9\xfe\ +;\x04\xe9\x05\xb6\x02&\x00.\x00\x00\x00\x07\x029\x00\ +\x89\x00\x00\xff\xff\x00\xb0\xfe;\x04\x1d\x06\x14\x02&\x00\ +N\x00\x00\x00\x06\x029+\x00\x00\x01\x00\xb0\x00\x00\x04\ +\x1b\x04F\x00\x0d\x00/@\x19\x0d\x0b\x07\x07\x08\x03\x01\ +\x02\x05\x08\x05\x0e\x0f\x02\x0d\x05\x06\x04\x08\x00\x09\x0f\x04\ +\x08\x15\x00?3?3\x12\x179\x11\x12\x01\x179\x11\ +3\x113310\x013\x01\x01#\x01\x07\x11#\x11\ +3\x11\x14\x07\x03/\xcf\xfeb\x01\xbb\xc9\xfe\x97\x87\xb2\ +\xb2\x0c\x04F\xfe\x1e\xfd\x9c\x01\xf8q\xfey\x04F\xfe\ +\xe5\xa6q\xff\xff\x00\xc9\x00\x00\x03\xf8\x07s\x02&\x00\ +/\x00\x00\x01\x07\x00v\xffc\x01R\x00\x08\xb3\x01\x0f\ +\x05&\x00+5\xff\xff\x00\xa3\x00\x00\x02,\x07\xac\x02\ +&\x00O\x00\x00\x01\x07\x00v\xff\x1a\x01\x8b\x00\x08\xb3\ +\x01\x0d\x02&\x00+5\xff\xff\x00\xc9\xfe;\x03\xf8\x05\ +\xb6\x02&\x00/\x00\x00\x00\x06\x0291\x00\xff\xff\x00\ +Y\xfe;\x01W\x06\x14\x02&\x00O\x00\x00\x00\x07\x02\ +9\xfe\xe8\x00\x00\xff\xff\x00\xc9\x00\x00\x03\xf8\x05\xb7\x02\ +&\x00/\x00\x00\x01\x07\x028\x01\x1d\xff\xa3\x00\x07\xb2\ +\x01\x09\x03\x00?5\x00\xff\xff\x00\xb0\x00\x00\x02\xa0\x06\ +\x14\x02&\x00O\x00\x00\x01\x06\x028+\x00\x00\x07\xb2\ +\x01\x07\x00\x00?5\x00\xff\xff\x00\xc9\x00\x00\x03\xf8\x05\ +\xb6\x02&\x00/\x00\x00\x00\x07\x01O\x02\x04\xfdg\xff\ +\xff\x00\xb0\x00\x00\x02\xa8\x06\x14\x00&\x00O\x00\x00\x00\ +\x07\x01O\x01B\xfd8\x00\x01\x00\x1d\x00\x00\x03\xf8\x05\ +\xb6\x00\x0d\x00=@!\x07\x0b\x0b\x04\x00\x0c\x09\x00\x03\ +\x04\x0f\x0e\x09\x07\x04\x0a\x03\x01\x06\x08\x02\x08\x02\x08\x00\ +\x05\x03\x00\x0bIY\x00\x12\x00?+\x00\x18?\x129\ +9//\x12\x179\x11\x12\x01\x179\x1133\x113\ +103\x11\x07'7\x113\x11%\x17\x05\x11!\x15\ +\xc9iC\xac\xaa\x01)C\xfe\x94\x02\x85\x01\xfc;r\ +e\x03\x1e\xfdF\xaey\xd3\xfe<\x9a\x00\x01\xff\xfc\x00\ +\x00\x02'\x06\x14\x00\x0b\x007@\x1c\x00\x04\x04\x09\x05\ +\x05\x0c\x02\x0d\x08\x0c\x00\x02\x09\x03\x08\x06\x06\x01\x07\x01\ +\x07\x01\x05\x0a\x00\x05\x15\x00??\x1299//\x12\ +\x179\x11\x013\x113\x129\x1133\x11310\ +\x017\x17\x07\x11#\x11\x07'7\x113\x01V\x89H\ +\xd1\xa6nF\xb4\xa6\x03`^p\x8d\xfd?\x02TH\ +qw\x03 \x00\xff\xff\x00\xc9\x00\x00\x05?\x07s\x02\ +&\x001\x00\x00\x01\x07\x00v\x01\x02\x01R\x00\x08\xb3\ +\x01\x1a\x05&\x00+5\xff\xff\x00\xb0\x00\x00\x04D\x06\ +!\x02&\x00Q\x00\x00\x01\x06\x00vy\x00\x00\x08\xb3\ +\x01\x1e\x11&\x00+5\xff\xff\x00\xc9\xfe;\x05?\x05\ +\xb6\x02&\x001\x00\x00\x00\x07\x029\x00\xcd\x00\x00\xff\ +\xff\x00\xb0\xfe;\x04D\x04\x5c\x02&\x00Q\x00\x00\x00\ +\x06\x029V\x00\xff\xff\x00\xc9\x00\x00\x05?\x07s\x02\ +&\x001\x00\x00\x01\x07\x01L\x00\xa6\x01R\x00\x08\xb3\ +\x01\x1c\x05&\x00+5\xff\xff\x00\xb0\x00\x00\x04D\x06\ +!\x02&\x00Q\x00\x00\x01\x06\x01L\x1f\x00\x00\x08\xb3\ +\x01 \x11&\x00+5\xff\xff\x00\x01\x00\x00\x04\xcb\x05\ +\xb6\x00'\x00Q\x00\x87\x00\x00\x01\x06\x02\x07\xe8\x00\x00\ +\x07\xb2\x01\x1c\x03\x00?5\x00\x00\x01\x00\xc9\xfe\x7f\x05\ +?\x05\xb6\x00\x19\x008@\x1c\x10\x0d\x0d\x0e\x08\x14\x14\ +\x17\x17\x02\x0e\x03\x1a\x1b\x12\x0a\x0e\x15\x0f\x03\x0e\x12\x00\ +\x05IY\x00\x22\x00?+\x00\x18??3\x1299\ +\x11\x12\x01\x179\x113\x113\x113\x11310\x01\ +\x22'5\x163265\x01#\x12\x15\x11#\x113\ +\x013&5\x113\x11\x14\x06\x03\xc9b6GSi\ +j\xfc\xc0\x08\x10\x9d\xc0\x03\x1d\x08\x0e\x9f\xc1\xfe\x7f\x1b\ +\x91\x14zo\x04\xcb\xfe\xf8\x9e\xfc\xdb\x05\xb6\xfbN\x95\ +\xe0\x03=\xfaX\xc3\xcc\x00\x01\x00\xb0\xfe\x14\x04D\x04\ +\x5c\x00\x1d\x008@\x1e\x13\x0f\x0f\x10\x07\x1b\x1b\x02\x10\ +\x03\x1e\x1f\x17\x0bFY\x17\x10\x13\x10\x11\x0f\x10\x15\x00\ +\x05FY\x00\x1b\x00?+\x00\x18??\x129?+\ +\x11\x12\x01\x179\x113\x113\x11310\x01\x22'\ +5\x16325\x114&#\x22\x06\x15\x11#\x113\ +\x1736632\x16\x15\x11\x14\x06\x03%V7<\ +>\x8cz\x82\xac\xa0\xa6\x87\x1b\x0a4\xb4n\xcb\xc7\x8c\ +\xfe\x14\x19\x87\x14\xac\x03y\x86\x84\xba\xd6\xfd\xc1\x04H\ +\x96RX\xbf\xd2\xfc\x8d\x9a\xaa\xff\xff\x00}\xff\xec\x05\ +\xbe\x06\xb4\x02&\x002\x00\x00\x01\x07\x01M\x00\xc7\x01\ +R\x00\x08\xb3\x02\x1b\x05&\x00+5\xff\xff\x00s\xff\ +\xec\x04b\x05b\x02&\x00R\x00\x00\x01\x06\x01M\x12\ +\x00\x00\x08\xb3\x02\x1c\x11&\x00+5\xff\xff\x00}\xff\ +\xec\x05\xbe\x077\x02&\x002\x00\x00\x01\x07\x01N\x00\ +\xc1\x01R\x00\x08\xb3\x02\x18\x05&\x00+5\xff\xff\x00\ +s\xff\xec\x04b\x05\xe5\x02&\x00R\x00\x00\x01\x06\x01\ +N\x0e\x00\x00\x08\xb3\x02\x19\x11&\x00+5\xff\xff\x00\ +}\xff\xec\x05\xbe\x07s\x02&\x002\x00\x00\x01\x07\x01\ +S\x01\x14\x01R\x00\x0a\xb4\x03\x02+\x05&\x00+5\ +5\xff\xff\x00s\xff\xec\x04b\x06!\x02&\x00R\x00\ +\x00\x01\x06\x01SZ\x00\x00\x0a\xb4\x03\x02,\x11&\x00\ ++55\x00\x02\x00}\xff\xec\x06\xe7\x05\xcd\x00\x14\x00\ +\x1f\x00S@.\x18\x06\x0f\x13\x13\x1d\x00\x0d\x11\x1d\x06\ +\x05 !\x0f\x12IY\x0f\x0f\x00\x0b\x0b\x0eIY\x0b\ +\x03\x09\x15IY\x09\x04\x03\x1bIY\x03\x12\x00\x13I\ +Y\x00\x12\x00?+\x00\x18?+\x00\x18?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\ +\x113\x11310!!\x06# \x00\x11\x10\x00!\ +2\x17!\x15!\x11!\x15!\x11!\x01\x22\x00\x11\x10\ +\x00327\x11&\x06\xe7\xfd\x00f\x5c\xfe\xb9\xfe\x9f\ +\x01\x5c\x01@fZ\x03\x0e\xfd\xb3\x02'\xfd\xd9\x02M\ +\xfcD\xf9\xfe\xff\x01\x01\xf7pWW\x14\x01\x89\x01j\ +\x01h\x01\x86\x17\x97\xfe)\x96\xfd\xe6\x04\x9d\xfe\xcf\xfe\ +\xd9\xfe\xd7\xfe\xcd!\x04u\x1e\x00\x03\x00q\xff\xec\x07\ +\x1f\x04Z\x00\x1e\x00*\x001\x00U@-\x1f\x08\x0e\ +\x02\x16\x16%/\x15\x15\x1c%\x08\x0423+(\x0b\ +(FY.\x16FY\x02\x05\x0e\x0b..\x05\x11\x0b\ +\x10\x18\x22\x05\x22FY\x00\x05\x16\x00?3+\x11\x00\ +3\x18?3\x129/\x129\x129++\x11\x003\ +\x11\x12\x01\x179\x113\x113\x1299\x11310\ +\x05 '\x06\x06#\x22\x00\x11\x10\x0032\x16\x176\ +632\x12\x15\x15!\x12!267\x15\x06\x06\x01\ +\x14\x1632654&#\x22\x06%\x22\x06\x07!\ +4&\x05\x96\xfe\xdb}>\xd1\x89\xdf\xfe\xf4\x01\x06\xeb\ +\x83\xcd>:\xc0~\xc9\xee\xfd'\x08\x01J^\xa1W\ +X\x98\xfb!\x98\xa7\xa3\x99\x9b\xa5\xa6\x95\x04G\x7f\x91\ +\x0c\x02 \x84\x14\xebtw\x011\x01\x08\x01\x09\x01,\ +wrpy\xfe\xf7\xe2i\xfew#'\x94' \x02\ +9\xd3\xdb\xd5\xd1\xdd\xd5\xd8\xd8\xa4\x9e\x9e\xa4\xff\xff\x00\ +\xc9\x00\x00\x04\xcf\x07s\x02&\x005\x00\x00\x01\x07\x00\ +v\x00y\x01R\x00\x08\xb3\x02\x1f\x05&\x00+5\xff\ +\xff\x00\xb0\x00\x00\x03'\x06!\x02&\x00U\x00\x00\x01\ +\x06\x00v\xdc\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\ +\xff\x00\xc9\xfe;\x04\xcf\x05\xb6\x02&\x005\x00\x00\x00\ +\x06\x029}\x00\xff\xff\x00`\xfe;\x03'\x04\x5c\x02\ +&\x00U\x00\x00\x00\x07\x029\xfe\xef\x00\x00\xff\xff\x00\ +\xc9\x00\x00\x04\xcf\x07s\x02&\x005\x00\x00\x01\x07\x01\ +L\x00\x1b\x01R\x00\x08\xb3\x02!\x05&\x00+5\xff\ +\xff\x00\x82\x00\x00\x03'\x06!\x02&\x00U\x00\x00\x01\ +\x07\x01L\xffv\x00\x00\x00\x08\xb3\x01\x1c\x11&\x00+\ +5\xff\xff\x00j\xff\xec\x04\x02\x07s\x02&\x006\x00\ +\x00\x01\x07\x00v\x00P\x01R\x00\x08\xb3\x01.\x05&\ +\x00+5\xff\xff\x00j\xff\xec\x03s\x06!\x02&\x00\ +V\x00\x00\x01\x06\x00v\xea\x00\x00\x08\xb3\x01.\x11&\ +\x00+5\xff\xff\x00j\xff\xec\x04\x02\x07s\x02&\x00\ +6\x00\x00\x01\x07\x01K\xff\xea\x01R\x00\x08\xb3\x013\ +\x05&\x00+5\xff\xff\x00j\xff\xec\x03s\x06!\x02\ +&\x00V\x00\x00\x01\x06\x01K\x97\x00\x00\x08\xb3\x013\ +\x11&\x00+5\xff\xff\x00j\xfe\x14\x04\x02\x05\xcb\x02\ +&\x006\x00\x00\x00\x07\x00z\x01'\x00\x00\xff\xff\x00\ +j\xfe\x14\x03s\x04\x5c\x02&\x00V\x00\x00\x00\x07\x00\ +z\x00\xd5\x00\x00\xff\xff\x00j\xff\xec\x04\x02\x07s\x02\ +&\x006\x00\x00\x01\x07\x01L\xff\xe4\x01R\x00\x08\xb3\ +\x010\x05&\x00+5\xff\xff\x00j\xff\xec\x03s\x06\ +!\x02&\x00V\x00\x00\x01\x06\x01L\x99\x00\x00\x08\xb3\ +\x010\x11&\x00+5\xff\xff\x00\x12\xfe;\x04Z\x05\ +\xb6\x02&\x007\x00\x00\x00\x06\x029\x19\x00\xff\xff\x00\ +\x1f\xfe;\x02\xa8\x05F\x02&\x00W\x00\x00\x00\x06\x02\ +9\x82\x00\xff\xff\x00\x12\x00\x00\x04Z\x07s\x02&\x00\ +7\x00\x00\x01\x07\x01L\xff\xdc\x01R\x00\x08\xb3\x01\x13\ +\x05&\x00+5\xff\xff\x00\x1f\xff\xec\x02\xd7\x06\x14\x02\ +&\x00W\x00\x00\x01\x06\x028b\x00\x00\x07\xb2\x01\x1a\ +\x00\x00?5\x00\x00\x01\x00\x12\x00\x00\x04Z\x05\xb6\x00\ +\x0f\x00?@!\x07\x0b\x0b\x00\x0c\x04\x09\x0c\x0e\x02\x05\ +\x10\x11\x0a\x0e\x0f\x0eJY\x07\x0f\x0f\x03\x0c\x12\x06\x02\ +\x03\x02IY\x03\x03\x00?+\x11\x003\x18?\x129\ +/3+\x11\x003\x11\x12\x01\x179\x1133\x113\ +10\x01\x11!5!\x15!\x11!\x15!\x11#\x11\ +!5\x01\xe1\xfe1\x04H\xfe1\x016\xfe\xca\xaa\xfe\ +\xc7\x03/\x01\xf0\x97\x97\xfe\x10\x8d\xfd^\x02\xa2\x8d\x00\ +\x01\x00\x1f\xff\xec\x02\xa8\x05F\x00\x1c\x00L@)\x17\ +\x13\x1b\x1b\x0c\x08\x02\x15\x19\x08\x0a\x0e\x06\x1d\x1e\x0e\x16\ +\x13\x16GY\x1a\x0a\x0b\x0aGY\x17\x0b\x0b\x06\x11@\ +\x13\x0f\x06\x00FY\x06\x16\x00?+\x00\x18?\x1a\xcd\ +\x129/3+\x11\x003+\x11\x003\x11\x12\x01\x17\ +9\x1133\x113310%27\x15\x06\x06#\ + \x115#53\x11#5773\x15!\x15!\ +\x11!\x15!\x15\x14\x02\x17U< j*\xfe\xc8\x8d\ +\x8d\x9d\x9dF`\x01>\xfe\xc2\x01-\xfe\xd3u\x14\x7f\ +\x0e\x10\x01\x5c\xfe\x81\x01\x00PE\xea\xfe\x81\xff\x00\x81\ +\xf4\xdd\x00\xff\xff\x00\xba\xff\xec\x05\x19\x07/\x02&\x00\ +8\x00\x00\x01\x07\x01R\x00o\x01R\x00\x08\xb3\x01\x1b\ +\x05&\x00+5\xff\xff\x00\xa4\xff\xec\x049\x05\xdd\x02\ +&\x00X\x00\x00\x01\x06\x01R\xf7\x00\x00\x08\xb3\x01\x1e\ +\x11&\x00+5\xff\xff\x00\xba\xff\xec\x05\x19\x06\xb4\x02\ +&\x008\x00\x00\x01\x07\x01M\x00\x91\x01R\x00\x08\xb3\ +\x01\x15\x05&\x00+5\xff\xff\x00\xa4\xff\xec\x049\x05\ +b\x02&\x00X\x00\x00\x01\x06\x01M\x19\x00\x00\x08\xb3\ +\x01\x18\x11&\x00+5\xff\xff\x00\xba\xff\xec\x05\x19\x07\ +7\x02&\x008\x00\x00\x01\x07\x01N\x00\x8b\x01R\x00\ +\x08\xb3\x01\x12\x05&\x00+5\xff\xff\x00\xa4\xff\xec\x04\ +9\x05\xe5\x02&\x00X\x00\x00\x01\x06\x01N\x12\x00\x00\ +\x08\xb3\x01\x15\x11&\x00+5\xff\xff\x00\xba\xff\xec\x05\ +\x19\x07\xd7\x02&\x008\x00\x00\x01\x07\x01P\x00\x9c\x01\ +R\x00\x0a\xb4\x02\x01\x15\x05&\x00+55\xff\xff\x00\ +\xa4\xff\xec\x049\x06\x85\x02&\x00X\x00\x00\x01\x06\x01\ +P#\x00\x00\x0a\xb4\x02\x01\x18\x11&\x00+55\xff\ +\xff\x00\xba\xff\xec\x05\x19\x07s\x02&\x008\x00\x00\x01\ +\x07\x01S\x00\xe1\x01R\x00\x0a\xb4\x02\x01%\x05&\x00\ ++55\xff\xff\x00\xa4\xff\xec\x049\x06!\x02&\x00\ +X\x00\x00\x01\x06\x01Sh\x00\x00\x0a\xb4\x02\x01(\x11\ +&\x00+55\xff\xff\x00\xba\xfeB\x05\x19\x05\xb6\x02\ +&\x008\x00\x00\x00\x07\x01Q\x02!\x00\x00\xff\xff\x00\ +\xa4\xfeB\x04e\x04H\x02&\x00X\x00\x00\x00\x07\x01\ +Q\x02\xf4\x00\x00\xff\xff\x00\x1b\x00\x00\x07L\x07s\x02\ +&\x00:\x00\x00\x01\x07\x01K\x01T\x01R\x00\x08\xb3\ +\x01(\x05&\x00+5\xff\xff\x00\x17\x00\x00\x06#\x06\ +!\x02&\x00Z\x00\x00\x01\x07\x01K\x00\xc1\x00\x00\x00\ +\x08\xb3\x01+\x11&\x00+5\xff\xff\x00\x00\x00\x00\x04\ +{\x07s\x02&\x00<\x00\x00\x01\x07\x01K\xff\xe0\x01\ +R\x00\x08\xb3\x01\x17\x05&\x00+5\xff\xff\x00\x02\xfe\ +\x14\x04\x06\x06!\x02&\x00\x5c\x00\x00\x01\x06\x01K\xad\ +\x00\x00\x08\xb3\x01$\x11&\x00+5\xff\xff\x00\x00\x00\ +\x00\x04{\x07%\x02&\x00<\x00\x00\x01\x07\x00j\xff\ +\xf1\x01R\x00\x0a\xb4\x02\x01\x1e\x05&\x00+55\xff\ +\xff\x00R\x00\x00\x04?\x07s\x02&\x00=\x00\x00\x01\ +\x07\x00v\x00B\x01R\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\x00R\x00\x00\x03m\x06!\x02&\x00]\x00\ +\x00\x01\x06\x00v\xe8\x00\x00\x08\xb3\x01\x13\x11&\x00+\ +5\xff\xff\x00R\x00\x00\x04?\x071\x02&\x00=\x00\ +\x00\x01\x07\x01O\x01D\x01R\x00\x08\xb3\x01\x13\x05&\ +\x00+5\xff\xff\x00R\x00\x00\x03m\x05\xdf\x02&\x00\ +]\x00\x00\x01\x07\x01O\x00\xdf\x00\x00\x00\x08\xb3\x01\x13\ +\x11&\x00+5\xff\xff\x00R\x00\x00\x04?\x07s\x02\ +&\x00=\x00\x00\x01\x07\x01L\xff\xed\x01R\x00\x08\xb3\ +\x01\x15\x05&\x00+5\xff\xff\x00R\x00\x00\x03m\x06\ +!\x02&\x00]\x00\x00\x01\x06\x01L\x86\x00\x00\x08\xb3\ +\x01\x15\x11&\x00+5\x00\x01\x00\xb0\x00\x00\x02\xdb\x06\ +\x1f\x00\x0c\x00\x1d@\x0e\x00\x01\x01\x0d\x06\x0e\x04\x09F\ +Y\x04\x00\x01\x15\x00??+\x11\x013\x129\x113\ +10!#\x11\x10!2\x17\x07&#\x22\x06\x15\x01\ +V\xa6\x01g`d+WIaY\x04\x9c\x01\x83%\ +\x85\x1e{z\x00\x00\x01\x00\xc3\xfe\x14\x04\x17\x05\xcb\x00\ + \x00D@$\x1a\x1e\x1e\x0c\x08\x12\x1c\x08\x0a\x02\x05\ +!\x22\x1d\x0a\x0c\x0aFY\x1a\x0c\x0c\x10\x00\x10\x16F\ +Y\x10\x04\x00\x05FY\x00\x1b\x00?+\x00\x18?+\ +\x11\x12\x009\x18/3+\x11\x003\x11\x12\x01\x179\ +\x1133\x11310\x01\x22'5\x163265\ +\x11#5754632\x17\x07\x07&#\x22\x06\ +\x15\x15!\x15!\x11\x14\x06\x01HE@F=_M\ +\xde\xde\xa2\xb6Ux\x16\x15f\ +y\x89\x00\x00\x02\x00\xe7\x04\xd9\x03\xb6\x06!\x00\x09\x00\ +\x13\x00\x1b@\x0c\x0e\x05\x13\x09\x04\x14\x15\x0d\x04\x80\x13\ +\x09\x00/3\x1a\xcd2\x11\x12\x01\x17910\x136\ +673\x15\x06\x06\x07#%6673\x15\x06\x06\ +\x07#\xe7$n\x1f\xba%\xab:a\x01e1e\x1a\ +\xba%\xab:`\x04\xf20\xbaE\x15?\xc40\x19D\ +\xb1:\x15?\xc40\x00\x00\x01\x01\xfc\x04\xd9\x03\x10\x06\ +s\x00\x09\x00\x13\xb6\x04\x00\x0b\x0a\x04\x80\x09\x00/\x1a\ +\xcd\x11\x12\x019910\x016673\x15\x06\x06\ +\x07#\x01\xfc\x1b5\x0c\xb8\x12m1d\x04\xf6H\xe3\ +R\x17J\xedL\x00\x03\x01\x1b\x05\x0e\x03\x83\x06\xb4\x00\ +\x08\x00\x14\x00 \x00+@\x14\x0f\x09\x15\x1b\x1b\x03\x08\ +\x09\x04!\x22\x18\x0c\x08\x0c\x08\x0c\x03\x1e\x12\x00/3\ +\xcc99//\x113\x11\x12\x01\x179\x113\x113\ +10\x01673\x15\x06\x06\x07#'4632\ +\x16\x15\x14\x06#\x22&%4632\x16\x15\x14\x06\ +#\x22&\x02\x00A\x1f\xbd!y3P\xe54&)\ +17#&4\x01\xb44&)17#&4\x05\ +\x85\xa9\x86\x14C\xb3=\x044.4.2112\ +4.4.211\xff\xff\x00\x00\x00\x00\x05\x10\x06\ +\x0a\x02&\x00$\x00\x00\x01\x07\x01T\xfe \xff\x97\x00\ +\x07\xb2\x02\x12\x00\x00?5\x00\xff\xff\x00\x98\x02L\x01\ +\x89\x03Z\x02\x06\x00y\x00\x00\xff\xff\xff\xd4\x00\x00\x04\ +u\x06\x0a\x00&\x00(}\x00\x01\x07\x01T\xfd\xd8\xff\ +\x97\x00\x07\xb2\x01\x10\x00\x00?5\x00\xff\xff\xff\xd4\x00\ +\x00\x05\xb5\x06\x0a\x00'\x00+\x00\x96\x00\x00\x01\x07\x01\ +T\xfd\xd8\xff\x97\x00\x07\xb2\x01\x10\x00\x00?5\x00\xff\ +\xff\xff\xe4\x00\x00\x03D\x06\x0a\x00'\x00,\x00\xee\x00\ +\x00\x01\x07\x01T\xfd\xe8\xff\x97\x00\x07\xb2\x01\x10\x00\x00\ +?5\x00\xff\xff\xff\xe4\xff\xec\x06\x02\x06\x0a\x00&\x00\ +2D\x00\x01\x07\x01T\xfd\xe8\xff\x97\x00\x07\xb2\x02\x1c\ +\x00\x00?5\x00\xff\xff\xff\xd4\x00\x00\x05\x85\x06\x0a\x00\ +'\x00<\x01\x0a\x00\x00\x01\x07\x01T\xfd\xd8\xff\x97\x00\ +\x07\xb2\x01\x0d\x00\x00?5\x00\xff\xff\xff\xe4\x00\x00\x06\ +3\x06\x0a\x00&\x01v?\x00\x01\x07\x01T\xfd\xe8\xff\ +\x97\x00\x07\xb2\x01#\x00\x00?5\x00\xff\xff\xff\xe9\xff\ +\xec\x02\x93\x06\xb4\x02&\x01\x86\x00\x00\x01\x07\x01U\xfe\ +\xce\x00\x00\x00\x0c\xb5\x03\x02\x01.\x11&\x00+55\ +5\xff\xff\x00\x00\x00\x00\x05\x10\x05\xbc\x02\x06\x00$\x00\ +\x00\xff\xff\x00\xc9\x00\x00\x04\xbe\x05\xb6\x02\x06\x00%\x00\ +\x00\x00\x01\x00\xc9\x00\x00\x03\xf8\x05\xb6\x00\x05\x00\x1d@\ +\x0e\x03\x04\x04\x00\x06\x07\x05\x02IY\x05\x03\x04\x12\x00\ +??+\x11\x12\x0199\x11310\x01\x15!\x11\ +#\x11\x03\xf8\xfd{\xaa\x05\xb6\x99\xfa\xe3\x05\xb6\x00\xff\ +\xff\x00'\x00\x00\x04m\x05\xb6\x02\x06\x02(\x00\x00\xff\ +\xff\x00\xc9\x00\x00\x03\xf8\x05\xb6\x02\x06\x00(\x00\x00\xff\ +\xff\x00R\x00\x00\x04?\x05\xb6\x02\x06\x00=\x00\x00\xff\ +\xff\x00\xc9\x00\x00\x05\x1f\x05\xb6\x02\x06\x00+\x00\x00\x00\ +\x03\x00}\xff\xec\x05\xbe\x05\xcd\x00\x03\x00\x0f\x00\x1b\x00\ +?@ \x02\x03\x10\x16\x10\x0a\x16\x04\x0a\x04\x1c\x1d\x00\ +\x03IY\x00\x00\x07\x0d\x0d\x19IY\x0d\x04\x07\x13I\ +Y\x07\x13\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++\x11\x12\x0199\x113\x113\x11\x129910\ +\x01!\x15!%\x10\x00! \x00\x11\x10\x00! \x00\ +\x01\x10\x1232\x12\x11\x10\x02#\x22\x02\x01\xe3\x02u\ +\xfd\x8b\x03\xdb\xfe\x9d\xfe\xc4\xfe\xbd\xfe\xa1\x01`\x01D\ +\x01;\x01b\xfbs\xfa\xf4\xf3\xf8\xf7\xf2\xf5\xfb\x033\ +\x95?\xfe\xa1\xfen\x01\x8b\x01h\x01e\x01\x89\xfep\ +\xfe\xa0\xfe\xd8\xfe\xcc\x010\x01,\x01*\x01.\xfe\xce\ +\x00\xff\xff\x00T\x00\x00\x02V\x05\xb6\x02\x06\x00,\x00\ +\x00\xff\xff\x00\xc9\x00\x00\x04\xe9\x05\xb6\x02\x06\x00.\x00\ +\x00\x00\x01\x00\x00\x00\x00\x04\xd3\x05\xb6\x00\x0a\x00\x1a@\ +\x0b\x08\x00\x0c\x0b\x04\x08\x09\x03\x01\x08\x12\x00?3?\ +\x129\x11\x12\x019910!#\x01&'\x06\x07\ +\x01#\x013\x04\xd3\xb6\xfe\xb6W\x16!G\xfe\xb8\xb6\ +\x02\x10\xb1\x03\xa0\xfcZ\x8b\xc9\xfc^\x05\xb6\xff\xff\x00\ +\xc9\x00\x00\x06q\x05\xb6\x02\x06\x000\x00\x00\xff\xff\x00\ +\xc9\x00\x00\x05?\x05\xb6\x02\x06\x001\x00\x00\x00\x03\x00\ +H\x00\x00\x04%\x05\xb6\x00\x03\x00\x07\x00\x0b\x004@\ +\x1d\x0a\x07\x03\x02\x06\x08\x06\x0d\x0c\x00\x03IY\x00\x00\ +\x0a\x04\x0a\x0bIY\x0a\x12\x04\x07IY\x04\x03\x00?\ ++\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x01\x17\ +910\x13!\x15!\x03!\x15!\x01\x15!5\xc3\ +\x02\xe7\xfd\x19R\x03\x8b\xfcu\x03\xb4\xfc#\x03H\x96\ +\x03\x04\x97\xfby\x98\x98\xff\xff\x00}\xff\xec\x05\xbe\x05\ +\xcd\x02\x06\x002\x00\x00\x00\x01\x00\xc9\x00\x00\x05\x0c\x05\ +\xb6\x00\x07\x00#@\x11\x01\x00\x04\x05\x00\x05\x09\x08\x06\ +\x03IY\x06\x03\x01\x05\x12\x00?3?+\x11\x12\x01\ +99\x113\x11310!#\x11!\x11#\x11!\ +\x05\x0c\xaa\xfd\x11\xaa\x04C\x05\x1f\xfa\xe1\x05\xb6\x00\xff\ +\xff\x00\xc9\x00\x00\x04h\x05\xb6\x02\x06\x003\x00\x00\x00\ +\x01\x00J\x00\x00\x04\x5c\x05\xb6\x00\x0c\x005@\x1c\x08\ +\x0a\x0a\x00\x09\x02\x0b\x06\x03\x02\x00\x05\x0d\x0e\x07\x08\x04\ +\x08IY\x04\x03\x00\x0aIY\x00\x12\x00?+\x00\x18\ +?+\x11\x003\x11\x12\x01\x179\x113\x113\x113\ +1035\x01\x015!\x15!'\x01\x01!\x15J\ +\x01\xe1\xfe+\x03\xcb\xfd\x5c`\x01\xcc\xfe\x1f\x03T\x8d\ +\x02o\x02+\x8f\x99\x02\xfd\xdf\xfd\x9a\x98\x00\xff\xff\x00\ +\x12\x00\x00\x04Z\x05\xb6\x02\x06\x007\x00\x00\xff\xff\x00\ +\x00\x00\x00\x04{\x05\xb6\x02\x06\x00<\x00\x00\x00\x03\x00\ +j\xff\xec\x05\xf8\x05\xcb\x00\x19\x00\x22\x00+\x00P@\ +)'\x14\x1a\x02\x0d\x0d+\x19\x0e\x1e\x07\x07\x0e\x14\x03\ +,-\x0c\x10\x1a*\x10*JY\x22$\x18$JY\ +\x02\x18\x10\x18\x10\x18\x0e\x13\x00\x04\x00??99/\ +/\x113+\x11\x003+\x11\x003\x113\x11\x12\x01\ +\x179\x113\x11333\x1133\x11310\x01\ +3\x1532\x16\x16\x15\x14\x02\x04##\x15#5#\ +\x22$\x02546633\x1332654&\ ++\x03\x22\x06\x15\x14\x1633\x02\xdb\xacF\xab\xfb\x85\ +\x95\xfe\xfd\xb0)\xac-\xb0\xfe\xfe\x92\x87\xfc\xabC\xac\ +\x19\xc9\xdf\xce\xb9:\xac9\xb6\xd1\xde\xca\x18\x05\xcb\xb4\ +\x88\xf8\x9f\xa6\xfe\xfd\x82\xe1\xe1\x84\x01\x04\xa1\x9e\xf8\x8b\ +\xfcE\xdb\xc3\xb9\xd2\xd4\xb7\xc5\xd9\x00\xff\xff\x00\x08\x00\ +\x00\x04\x96\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x00m\x00\ +\x00\x05\xf2\x05\xb6\x00\x1d\x00>@\x1f\x0a\x07\x11\x00\x00\ +\x0e\x01\x15\x18\x18\x01\x07\x03\x1e\x1f\x1d\x03\x0d\x03IY\ +\x11\x0d\x0d\x01\x16\x0f\x08\x03\x01\x12\x00??33\x12\ +9/3+\x11\x003\x11\x12\x01\x179\x113\x113\ +3\x113\x11310!#\x11#\x22&&5\x11\ +3\x11\x14\x1633\x113\x113265\x113\x11\ +\x14\x06\x04##\x03\x83\xaa-\xb0\xff\x90\xae\xcf\xd4\x1b\ +\xaa\x1d\xd3\xcf\xb0\x90\xfe\xfd\xaf-\x01\xbez\xf7\xa4\x01\ +\xe3\xfe!\xbc\xc9\x03d\xfc\x9c\xc6\xbb\x01\xe3\xfe\x1f\xa5\ +\xf7{\x00\x00\x01\x00P\x00\x00\x05\xf4\x05\xcd\x00\x1f\x00\ +9@ \x03\x0d\x1d\x13\x18\x13\x16\x19\x07\x0a\x0d\x08\x08\ + !\x10\x00IY\x10\x04\x1a\x16\x06\x09\x08\x09IY\ +\x19\x08\x12\x00?3+\x11\x00333\x18?+\x11\ +\x12\x01\x179\x113\x11310\x01\x22\x02\x15\x14\x12\ +\x17\x15!5!&\x025\x10\x00! \x00\x11\x14\x02\ +\x07!\x15!56\x1254\x02\x03!\xee\xfa\xad\xb4\ +\xfd\xb6\x01l\x97\xa0\x01b\x01:\x01;\x01b\x9e\x97\ +\x01k\xfd\xb6\xb7\xa9\xf9\x055\xfe\xff\xfd\xe1\xfe\xb3\x84\ +\x85\x98v\x01^\xcb\x016\x01`\xfe\xa5\xfe\xc7\xcf\xfe\ +\xa6x\x98\x85\x86\x01N\xde\xfc\x01\x02\xff\xff\x00<\x00\ +\x00\x02o\x07%\x02&\x00,\x00\x00\x01\x07\x00j\xff\ +\x07\x01R\x00\x0a\xb4\x02\x01!\x05&\x00+55\xff\ +\xff\x00\x00\x00\x00\x04{\x07%\x02&\x00<\x00\x00\x01\ +\x07\x00j\xff\xef\x01R\x00\x0a\xb4\x02\x01\x1e\x05&\x00\ ++55\xff\xff\x00s\xff\xec\x04\xc7\x06s\x02&\x01\ +~\x00\x00\x01\x06\x01T\x1d\x00\x00\x08\xb3\x024\x11&\ +\x00+5\xff\xff\x00Z\xff\xec\x03\x87\x06s\x02&\x01\ +\x82\x00\x00\x01\x06\x01T\xc8\x00\x00\x08\xb3\x01/\x11&\ +\x00+5\xff\xff\x00\xb0\xfe\x14\x04D\x06s\x02&\x01\ +\x84\x00\x00\x01\x06\x01T;\x00\x00\x08\xb3\x01\x1e\x11&\ +\x00+5\xff\xff\x00\xa8\xff\xec\x02\x93\x06s\x02&\x01\ +\x86\x00\x00\x01\x07\x01T\xfe\xc4\x00\x00\x00\x08\xb3\x01\x19\ +\x11&\x00+5\xff\xff\x00\xa4\xff\xec\x04q\x06\xb4\x02\ +&\x01\x92\x00\x00\x01\x06\x01U;\x00\x00\x0c\xb5\x03\x02\ +\x014\x11&\x00+555\x00\x02\x00s\xff\xec\x04\ +\xc7\x04\x5c\x00\x0b\x00*\x00G@$\x09\x0f'\x15\x04\ +\x04\x1d\x22\x1d\x0f\x03+,\x18\x0f'((\x16\x0c\x12\ +\x12\x07FY\x12\x10\x1f\x00\x0c\x00FY$\x0c\x16\x00\ +?3+\x11\x003\x18?+\x11\x12\x0099\x113\ +\x18?\x11\x12\x01\x179\x113\x1133\x11310\ +%26554&# \x11\x14\x16\x17\x22\x02\x11\ +\x10\x1232\x16\x173673\x06\x06\x15\x11\x143\ +27\x15\x06#\x22&'#\x06\x06\x02P\xa9\x96\x98\ +\xa9\xfe\xd1\x93\x85\xd6\xee\xf4\xe1y\xa16\x0c\x18)\x81\ +\x15\x1cT\x1d!.AQY\x12\x0d;\xa7w\xc3\xda\ +\x0f\xe5\xc7\xfeP\xd4\xd4\x8b\x01)\x01\x0c\x01\x12\x01)\ +TT\x5c8B\xf6t\xfeIr\x0aw\x1aQVV\ +Q\x00\x02\x00\xb0\xfe\x14\x04\xa8\x06\x1f\x00\x13\x00)\x00\ +L@(\x18\x0f\x0f\x10'\x03\x1e\x08\x08\x03\x05\x22\x10\ +\x05*+\x10\x1b#\x22FY\x0e#\x0e#\x0b\x00\x0b\ +\x1bFY\x0b\x16\x00\x14FY\x00\x00\x00?+\x00\x18\ +?+\x11\x12\x0099\x18//+\x00\x18?\x11\x12\ +\x01\x179\x113\x113\x113\x11310\x012\x16\ +\x15\x10\x05\x15\x04\x11\x14\x04#\x22&'\x11#\x114\ +6\x17\x22\x06\x15\x11\x16\x1632654&##\ +532654&\x02\x93\xdc\xf9\xfe\xc7\x01y\xfe\ +\xf8\xeem\xa0O\xa6\xfd\xe4\x9e\x9d]\xa1V\xab\xad\xbe\ +\xb1p\x5c\x9b\xa2\x9c\x06\x1f\xd0\xb7\xfe\xda3\x08*\xfe\ +\x91\xd1\xe1\x1f&\xfd\xe3\x064\xe1\xf6\x8c\xac\xa5\xfc\x89\ +1%\x96\x9d\x9d\xa4\x8e\x93\x89{\x85\x00\x01\x00\x0a\xfe\ +\x14\x04\x0e\x04H\x00\x12\x00!@\x10\x0f\x04\x01\x05\x04\ +\x13\x14\x0a\x09\x09\x01\x0e\x05\x0f\x01\x1b\x00??3\x12\ +9/3\x11\x12\x01\x17910\x01#4\x127\x01\ +3\x13\x16\x173>\x02\x133\x01\x06\x02\x02\x14\xb4@\ ++\xfe?\xac\xf0^\x13\x08\x05)+\xea\xac\xfek0\ +5\xfe\x14`\x01&r\x04<\xfd\xb8\xebg\x1e\x8e\x81\ +\x02m\xfb\xd3|\xfe\xdc\x00\x02\x00q\xff\xec\x04`\x06\ +\x12\x00\x1e\x00*\x00;@ %\x1c\x10\x03\x1f\x16\x16\ +\x09\x00\x03\x1c\x05+,\x10\x00\x22\x03\x19\x06\x19(F\ +Y\x19\x16\x06\x0dFY\x06\x00\x00?+\x00\x18?+\ +\x11\x12\x00\x179\x11\x12\x01\x179\x113\x113\x113\ +10\x01&&54632\x16\x17\x07&&#\ +\x22\x06\x15\x14\x16\x17\x16\x16\x15\x14\x00#\x22$54\ +\x12\x014&'\x06\x06\x15\x14\x16326\x02!\x8c\ +t\xc2\xa4g\xbd~Hp\x9fQUak\xa7\xd2\xb1\ +\xfe\xf0\xec\xe3\xfe\xf0\xe2\x02a{\x8d\xce\xbf\xb2\x93\xa2\ +\xae\x03\xa8N\x9fc\x82\x98-?\x87>,OBG\ +o[s\xf1\xa4\xeb\xfe\xf8\xf8\xd2\xb1\x01\x05\xfes\x80\ +\xb7J5\xd9\xa0\x90\xab\xba\x00\x00\x01\x00Z\xff\xec\x03\ +\x87\x04\x5c\x00%\x00M@+\x04\x10#\x17\x1d\x0b\x01\ +\x13\x17\x10\x06&'\x14%\x02%\x02FY\x0f%\x1f\ +%\x02\x0b\x03%%\x0d\x1a\x1a!FY\x1a\x10\x0d\x07\ +FY\x0d\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/_^]+\x11\x12\x009\x11\x12\x01\x179\x113\ +\x11310\x01\x15# \x15\x14\x163267\x15\ +\x06#\x22&54675&&54632\ +\x16\x17\x07&&#\x22\x15\x14!\x02\xcb\x94\xfe\xc9\x93\ +\x92T\xa6d\x89\xdd\xd2\xf1n\x82bk\xe0\xc0a\xa5\ +d?^\x82O\xfa\x01=\x02\x81\x8d\xc3Zb'/\ +\x94K\xa9\x94b\x83)\x0b\x1c\x7f\x5c\x85\x9e!-\x85\ +*\x1c\xa2\xac\x00\x00\x01\x00s\xfeo\x03\xa0\x06\x14\x00\ + \x000@\x18\x07\x19\x1e\x13\x13\x0e\x0e\x03\x00\x19\x04\ +!\x22\x11#\x1e\x03\x00\x01\x00FY\x01\x00\x00?+\ +\x11\x0033\x18?\x11\x12\x01\x179\x113\x113\x11\ +310\x135!\x15\x06\x00\x02\x15\x14\x16\x16\x17\x16\ +\x16\x15\x14\x07#654&'&&54>\x02\ +7\x06!\xb0\x02\xf0\xd7\xfe\xe0\x8a;}\xac\x95\x88\x7f\ +\xa6}o\x8f\xcb\xbc;p\xc9\xf2(\xfe\xf1\x05\x87\x8d\ +\x81\xb4\xfe\xbd\xfe\xdf\xa6bvI%\x1fm[\x95\xa4\ +\xa1k8=\x1a$\xdb\xc2r\xd0\xc3\xe5\xda\x08\x00\x00\ +\x01\x00\xb0\xfe\x14\x04D\x04\x5c\x00\x14\x00/@\x18\x00\ +\x14\x0c\x08\x08\x09\x14\x09\x16\x15\x10\x04FY\x10\x10\x0c\ +\x09\x0a\x0f\x09\x15\x00\x1b\x00???\x129?+\x11\ +\x12\x0199\x113\x113\x11310\x01\x114&\ +#\x22\x06\x15\x11#\x113\x1736632\x16\x15\ +\x11\x03\x9ez\x82\xac\xa0\xa6\x87\x1b\x083\xb8q\xc6\xc8\ +\xfe\x14\x04\xb1\x86\x84\xba\xd6\xfd\xc1\x04H\x96QY\xbf\ +\xd2\xfbI\x00\x03\x00s\xff\xec\x04J\x06+\x00\x0b\x00\ +\x12\x00\x19\x00I@'\x16\x10\x10\x06\x17\x0f\x0f\x00\x06\ +\x00\x1a\x1b\x16\x10FY\x0f\x16\xbf\x16\x02\x0b\x03\x16\x16\ +\x03\x09\x09\x13FY\x09\x01\x03\x0cFY\x03\x16\x00?\ ++\x00\x18?+\x11\x12\x009\x18/_^]+\x11\ +\x12\x0199\x113\x113\x113\x11310\x01\x10\ +\x02#\x22\x02\x11\x10\x1232\x12\x012\x12\x13!\x12\ +\x12\x13\x22\x02\x03!\x02\x02\x04J\xf4\xfa\xf0\xf9\xf5\xf4\ +\xf4\xfa\xfe\x12\xa4\x9c\x06\xfdy\x04\x96\xa7\xa1\x96\x0a\x02\ +\x85\x0b\x98\x03\x0c\xfej\xfev\x01\x93\x01\x8d\x01\x97\x01\ +\x88\xfek\xfb\xe1\x011\x013\xfe\xd0\xfe\xcc\x05)\xfe\ +\xe1\xfe\xe7\x01\x19\x01\x1f\x00\x01\x00\xa8\xff\xec\x02\x93\x04\ +H\x00\x0f\x00\x1f@\x0e\x01\x0e\x07\x0e\x11\x10\x0f\x0f\x0b\ +\x04FY\x0b\x16\x00?+\x00\x18?\x11\x12\x0199\ +\x11310\x01\x11\x14\x163267\x15\x06\x06#\ +\x22&5\x11\x01NIW%e\x1b\x1fi2\xa0\x91\ +\x04H\xfc\xfahe\x0d\x07\x7f\x0d\x11\xa8\xa9\x03\x0b\xff\ +\xff\x00\xb0\x00\x00\x04\x1b\x04F\x02\x06\x00\xfa\x00\x00\x00\ +\x01\xff\xf2\xff\xec\x04F\x06!\x00\x22\x003@\x1b\x08\ +\x01\x15\x03$\x00\x00#\x18\x13FY\x18\x16\x1e\x1f\x1f\ +\x00\x0b\x0b\x06FY\x0b\x01\x00\x15\x00??+\x11\x12\ +\x009\x113\x18?+\x11\x013\x11\x12\x17910\ +#\x01'.\x02#\x22\x075632\x16\x16\x17\x01\ +\x16\x16327\x15\x06#\x22&'\x03&'#\x06\ +\x07\x03\x0e\x01\xd9:\x1e2C1:9D?[y\ +X6\x01k\x13*#\x1b!0=JS\x1d\x9cT\ +\x16\x09\x1cX\xfe\x047\xa2UF$\x0d\x85\x11<\x82\ +\x98\xfc\x0c13\x0ay\x18LS\x01\xb4\xf0`t\xd1\ +\xfd\xb6\x00\xff\xff\x00\xb0\xfe\x14\x04D\x04H\x02\x06\x00\ +w\x00\x00\x00\x01\x00\x00\x00\x00\x04\x02\x04H\x00\x0e\x00\ +\x1c@\x0c\x09\x0a\x0a\x00\x10\x0f\x05\x0e\x15\x09\x00\x0f\x00\ +?2?9\x11\x12\x0199\x11310\x113\x13\ +\x16\x16\x1736\x12\x113\x10\x02\x07#\xac\xdb\x1aS\ +\x10\x08\xb1\x9f\xa6\xcf\xe1\xba\x04H\xfd\xb2C\xee>\xaf\ +\x01\xbd\x01Q\xfe\x95\xfe\x04\xe1\x00\x01\x00q\xfeo\x03\ +\xa0\x06\x14\x001\x00I@'\x04\x19-\x1f\x1d\x1c\x13\ +\x0c\x0c(\x00\x1c\x1f%\x19\x0723\x1c0\x010\x01\ +GY00\x10&)%&%FY&\x00\x10#\ +\x00??+\x11\x003\x11\x129\x18/+\x11\x12\x00\ +9\x11\x12\x01\x179\x113\x113\x113\x11310\ +\x01#\x22\x06\x15\x14\x1e\x02\x17\x16\x16\x15\x14\x06\x07#\ +6654&'&&54675&54\ +67\x06##5!\x15#\x22\x06\x06\x15\x14\x163\ +3\x03V\xb2\xb0\xd52_\x87T\x8e\x876C\x9c5\ +Bs\x8f\xc8\xc7\x9e\x80\xd9\x8b\xa6\x80sD\x02\xba3\ +\x82\xe0\x7f\xa7\xaf\xaa\x02\xf2\xb2\x8ePb=$\x12\x1d\ +nZA\x95cG\x9347=\x19\x22\xc8\xb0\x8c\xd2\ +'\x0c@\xd9u\x9e2\x0c\x8d\x83P\x90_sl\xff\ +\xff\x00s\xff\xec\x04b\x04\x5c\x02\x06\x00R\x00\x00\x00\ +\x01\x00\x19\xff\xec\x04\xf4\x04H\x00\x15\x006@\x1d\x0a\ +\x0b\x07\x13\x10\x03\x13\x0b\x0d\x05\x16\x17\x12\x09\x0d\x0f\x0d\ +FY\x0f\x0f\x0b\x15\x05\x00FY\x05\x16\x00?+\x00\ +\x18??+\x11\x0033\x11\x12\x01\x179\x113\x11\ +310%27\x15\x06#\x225\x11!\x11#\x11\ +#57!\x15#\x11\x14\x16\x04}&0+T\xdb\ +\xfe#\xa6\xdd\x8f\x04L\xd53u\x12\x83\x18\xfd\x02\xd1\ +\xfcF\x03\xbaJD\x8e\xfd\x8e\xa7\xfe\xf7\xc2\xd1\xc5\xb6\ +\x01\x0e\xba\xd0\x00\x00\x01\x00\x12\xff\xe7\x03\x93\x04H\x00\ +\x13\x00,@\x17\x03\x0f\x00\x09\x0f\x11\x04\x14\x15\x02\x11\ +\x13\x11FY\x13\x0f\x0c\x05FY\x0c\x16\x00?+\x00\ +\x18?+\x11\x003\x11\x12\x01\x179\x11310\x01\ +\x15!\x11\x143267\x15\x06\x06#\x22&5\x11\ +!57\x03\x93\xfeP\xcd/b\x1b#o0\xb5\xaa\ +\xfe\xd7\x94\x04H\x8e\xfd\x96\xdf\x0d\x07}\x0f\x12\xaa\xaa\ +\x02\x7fJD\x00\x00\x01\x00\xa4\xff\xec\x04q\x04H\x00\ +\x15\x00%@\x11\x0c\x13\x06\x03\x13\x03\x17\x16\x0f\x04\x0f\ +\x00\x09FY\x00\x16\x00?+\x00\x18?3\x11\x12\x01\ +99\x113\x11310\x05\x22&\x11\x113\x11\x14\ +\x1632654&'3\x16\x16\x15\x10\x00\x02s\ +\xe7\xe8\xa6\x9e\x99\xa7\xa1\x1c\x22\xa6$\x1c\xfe\xfe\x14\xfa\ +\x01\x0a\x02X\xfd\xb0\xc0\xc3\xee\xfb\x82\xe0\x88\x90\xd6\x8c\ +\xfe\xc2\xfe\xd4\x00\x00\x02\x00s\xfe\x14\x05L\x04\x5c\x00\ +\x18\x00\x22\x00A@#\x0a\x04 \x18\x18\x0c\x00\x19\x13\ +\x13\x00\x07\x04\x04#$\x10\x1cFY\x10\x10\x06\x0f \ +\x0c\x01\x0cFY\x17\x01\x16\x00\x1b\x00??3+\x11\ +\x003\x18??+\x11\x12\x01\x179\x113\x1133\ +\x113\x11310\x01\x11$\x00\x11\x107\x17\x06\x06\ +\x15\x10\x05\x114632\x12\x15\x14\x02\x06\x07\x11\x01\ +4&#\x22\x06\x15\x1166\x02\x83\xfe\xfc\xfe\xf4\xcf\ +\x83YQ\x01h\xa6\x95\xb4\xda\x88\xf8\xa5\x01y|f\ +IN\xb3\xc6\xfe\x14\x01\xda\x0b\x01#\x01\x0f\x01(\xfd\ +Zu\xe0|\xfeu#\x02l\xbb\xbe\xfe\xdb\xfa\xb2\xfe\ +\xfb\x90\x08\xfe&\x04'\xb9\xdbxr\xfd\x92\x10\xec\x00\ +\x01\xff\xec\xfe\x14\x04P\x04N\x00 \x009@!\x0e\ +\x07\x08\x05\x15\x18\x1e\x07\x22\x17!\x05\x18\x08\x15\x04\x06\ +\x17\x1b\x11\x0cFY\x11\x1b\x06\x0f\x00\x1cFY\x00\x0f\ +\x00?+\x00\x18??+\x00\x18?\x12\x179\x11\x01\ +3\x12\x17910\x132\x16\x16\x17\x13\x013\x01\x13\ +\x16\x16327\x15\x06#\x22&'\x03\x01#\x01\x03\ +&&#\x22\x0756\xb26N>,\x91\x01>\xb4\ +\xfeT\xbe0R?--<;s\x8d;\x96\xfe\x96\ +\xb2\x01\xd0\xac&F+%\x1b1\x04N+[p\xfe\ +\x8f\x02a\xfc\xfc\xfe\x1czJ\x08\x81\x0fv\x9f\x01\x83\ +\xfdh\x03D\x01\xbccP\x0b\x81\x11\x00\x01\x00\xa4\xfe\ +\x14\x05\x87\x06\x12\x00\x1a\x00=@\x1f\x16\x13\x01\x0e\x0e\ +\x19\x0f\x04\x0a\x0a\x0f\x13\x03\x1b\x1c\x1a\x00\x07\x14\x0f\x01\ +\x19\x10\x19FY\x0d\x10\x16\x0f\x1b\x00??3+\x11\ +\x003\x18?3?\x11\x12\x01\x179\x113\x1133\ +\x113\x11310\x01\x116654&'3\x12\ +\x15\x10\x00\x05\x11#\x11$\x00\x11\x113\x11\x14\x16\x17\ +\x11\x03Z\xbc\xcb\x1a%\xa6?\xfe\xe3\xfe\xf0\xa4\xfe\xf8\ +\xfe\xf6\xa6\xb4\xb8\x06\x12\xfai\x0f\xe7\xccx\xeb\xa8\xfe\ +\xf0\xf4\xfe\xec\xfe\xce\x10\xfe&\x01\xda\x09\x01\x22\x01\x10\ +\x02\x1f\xfd\xdb\xc3\xda\x0d\x05\x99\x00\x01\x00s\xff\xec\x05\ +\xbc\x04H\x00'\x00=@\x1e\x0a\x03&\x13\x13\x10\x19\ + \x10\x03\x03()&\x11\x11\x00\x1c\x06\x0f\x16\x0d\ +\x00\x0dFY#\x00\x16\x00?2+\x11\x003\x18?\ +3\x129/9\x11\x12\x01\x179\x113\x113\x129\ +\x11310\x05\x22\x0254\x1273\x06\x06\x15\x14\ +\x163265\x113\x11\x14\x1632654\x02\ +'3\x16\x12\x15\x14\x02#\x22'#\x06\x01\xf4\xb6\xcb\ +7D\xacD9xk^i\xa1j]kx7E\ +\xacA9\xcb\xb6\xdcD\x09A\x14\x01(\xfe\x9c\x01\x01\ +\x99\x9c\xff\x9d\xc1\xd8\x8f}\x017\xfe\xc9\x80\x8c\xd8\xc1\ +\x97\x01\x04\x9d\x92\xfe\xf9\x9d\xfc\xfe\xd6\xb6\xb6\xff\xff\x00\ +\x09\xff\xec\x02\x93\x05\xd3\x02&\x01\x86\x00\x00\x01\x07\x00\ +j\xfe\xd4\x00\x00\x00\x0a\xb4\x02\x01%\x11&\x00+5\ +5\xff\xff\x00\xa4\xff\xec\x04q\x05\xd3\x02&\x01\x92\x00\ +\x00\x01\x06\x00j9\x00\x00\x0a\xb4\x02\x01+\x11&\x00\ ++55\xff\xff\x00s\xff\xec\x04b\x06s\x02&\x00\ +R\x00\x00\x01\x06\x01T!\x00\x00\x08\xb3\x02\x22\x11&\ +\x00+5\xff\xff\x00\xa4\xff\xec\x04q\x06s\x02&\x01\ +\x92\x00\x00\x01\x06\x01T'\x00\x00\x08\xb3\x01\x1f\x11&\ +\x00+5\xff\xff\x00s\xff\xec\x05\xbc\x06s\x02&\x01\ +\x96\x00\x00\x01\x07\x01T\x00\xc9\x00\x00\x00\x08\xb3\x011\ +\x11&\x00+5\xff\xff\x00\xc9\x00\x00\x03\xf8\x07%\x02\ +&\x00(\x00\x00\x01\x07\x00j\x00'\x01R\x00\x0a\xb4\ +\x02\x01!\x05&\x00+55\x00\x01\x00\x12\xff\xec\x05\ +B\x05\xb6\x00\x1d\x00F@&\x16\x0e\x0e\x0f\x08\x1b\x1b\ +\x14\x02\x0f\x11\x05\x1e\x1f\x16\x0dIY\x16\x16\x0f\x12\x15\ +\x11\x12\x11IY\x12\x03\x0f\x12\x00\x05IY\x00\x13\x00\ +?+\x00\x18??+\x11\x003\x11\x129\x18/+\ +\x11\x12\x01\x179\x113\x113\x11310\x05\x22'\ +5\x16326554&#!\x11#\x11!5\ +!\x15!\x11!2\x16\x15\x15\x14\x06\x03\xcf`67\ +[eh\x83\x8c\xfe\x83\xaa\xfe\xb0\x03\xb7\xfeC\x01\x8c\ +\xcd\xdd\xc4\x14\x16\x96\x13|p\x83\x80q\xfd\x1b\x05\x1f\ +\x97\x97\xfe^\xbf\xb2\x8f\xbe\xd3\xff\xff\x00\xc9\x00\x00\x03\ +\xf8\x07s\x02&\x01a\x00\x00\x01\x07\x00v\x00Z\x01\ +R\x00\x08\xb3\x01\x0f\x05&\x00+5\x00\x01\x00}\xff\ +\xec\x04\xe3\x05\xcd\x00\x18\x008@\x1e\x06\x03\x11\x16\x0c\ +\x05\x11\x04\x19\x1a\x03\x06IY\x03\x03\x0e\x14\x14\x00I\ +Y\x14\x04\x0e\x09IY\x0e\x13\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x01\x179\x11331\ +0\x01\x22\x04\x07!\x15!\x12\x00327\x15\x06#\ + \x00\x11\x10\x00!2\x17\x07&\x03B\xe2\xfe\xf3\x1e\ +\x02\xd3\xfd)\x0a\x01\x0b\xf9\xa2\xc9\xa1\xe2\xfe\xb4\xfe\xa2\ +\x01y\x01N\xed\xb2G\xa9\x053\xfa\xf1\x96\xfe\xee\xfe\ +\xe37\x959\x01\x84\x01m\x01_\x01\x91X\x94R\xff\ +\xff\x00j\xff\xec\x04\x02\x05\xcb\x02\x06\x006\x00\x00\xff\ +\xff\x00T\x00\x00\x02V\x05\xb6\x02\x06\x00,\x00\x00\xff\ +\xff\x00<\x00\x00\x02o\x07%\x02&\x00,\x00\x00\x01\ +\x07\x00j\xff\x07\x01R\x00\x0a\xb4\x02\x01!\x05&\x00\ ++55\xff\xff\xff`\xfe\x7f\x01h\x05\xb6\x02\x06\x00\ +-\x00\x00\x00\x02\x00\x00\xff\xe9\x07#\x05\xb6\x00\x1a\x00\ +#\x00G@&\x18\x1b\x1b\x04\x1f\x00\x00\x04\x0d\x03$\ +%\x18#IY\x18\x18\x0b\x16\x16\x06IY\x16\x03\x0b\ +\x10JY\x0b\x12\x04\x1bJY\x04\x12\x00?+\x00\x18\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x01\ +\x179\x113\x113\x11310\x01\x14\x04!!\x11\ +!\x02\x02\x06\x06#\x22'5\x1632>\x02\x12\x13\ +!\x113 \x0132654&##\x07#\xfe\ +\xed\xfe\xfc\xfe\xb9\xfe\x939TP\x8bkE@2?\ +0A+7DA\x02\xa6z\x02:\xfdL\x85\xc6\xb7\ +\xc0\xdcf\x01\xaa\xce\xdc\x05\x1f\xfeH\xfd\xf6\xfby\x19\ +\x8f\x1a>g\xfa\x01\xbe\x01\xe2\xfd\x90\xfdM\x8b\x8c\x8a\ +|\x00\x02\x00\xc9\x00\x00\x07T\x05\xb6\x00\x11\x00\x1a\x00\ +J@&\x0b\x07\x07\x08\x0f\x12\x12\x0c\x04\x16\x00\x00\x04\ +\x08\x03\x1b\x1c\x1a\x06\x0b\x06IY\x0f\x0b\x0b\x04\x0d\x09\ +\x03\x08\x12\x04\x12JY\x04\x12\x00?+\x00\x18??\ +3\x129/3+\x11\x003\x11\x12\x01\x179\x113\ +\x1133\x113\x113\x11310\x01\x14\x04!!\ +\x11!\x11#\x113\x11!\x113\x113 \x0132\ +654&##\x07T\xfe\xf0\xfe\xfb\xfe\xb7\xfd}\ +\xaa\xaa\x02\x83\xacy\x029\xfdN\x85\xc4\xb9\xc1\xdbf\ +\x01\xaa\xce\xdc\x02\xb0\xfdP\x05\xb6\xfd\x92\x02n\xfd\x90\ +\xfdM\x8b\x8c\x89}\x00\x00\x01\x00\x12\x00\x00\x05B\x05\ +\xb6\x00\x13\x00:@\x1f\x00\x0c\x0c\x0d\x06\x05\x05\x12\x0d\ +\x0f\x04\x14\x15\x13\x0f\x10\x0fIY\x00\x0bIY\x00\x00\ +\x0d\x10\x03\x06\x0d\x12\x00?3?\x129/++\x11\ +\x003\x11\x12\x01\x179\x113\x113\x11310\x01\ +!2\x16\x15\x11#\x114&#!\x11#\x11!5\ +!\x15!\x02\x0c\x01\x90\xcd\xd9\xaa}\x8c\xfe}\xaa\xfe\ +\xb0\x03\xf6\xfe\x04\x03}\xbc\xb5\xfd\xf4\x01\xf6~q\xfd\ +\x1b\x05\x1f\x97\x97\xff\xff\x00\xc9\x00\x00\x04\xe5\x07s\x02\ +&\x01\xb4\x00\x00\x01\x07\x00v\x00\xa2\x01R\x00\x08\xb3\ +\x01\x14\x05&\x00+5\xff\xff\x00\x1b\xff\xec\x04\xf8\x07\ +^\x02&\x01\xbd\x00\x00\x01\x07\x026\x00D\x01R\x00\ +\x08\xb3\x01\x17\x05&\x00+5\x00\x01\x00\xc9\xfe\x83\x05\ +\x0c\x05\xb6\x00\x0b\x000@\x18\x08\x05\x02\x03\x09\x00\x00\ +\x03\x05\x03\x0c\x0d\x0a\x06\x03\x05\x08IY\x01\x05\x12\x03\ +\x22\x00??3+\x00\x18?3\x11\x12\x01\x179\x11\ +3\x113\x11310!!\x11#\x11!\x113\x11\ +!\x113\x05\x0c\xfe/\xb0\xfe>\xaa\x02\xef\xaa\xfe\x83\ +\x01}\x05\xb6\xfa\xe4\x05\x1c\x00\xff\xff\x00\x00\x00\x00\x05\ +\x10\x05\xbc\x02\x06\x00$\x00\x00\x00\x02\x00\xc9\x00\x00\x04\ +}\x05\xb6\x00\x0d\x00\x16\x00=@ \x12\x00\x09\x0e\x0e\ +\x04\x04\x07\x00\x03\x18\x17\x09\x16IY\x09\x09\x04\x05\x05\ +\x08IY\x05\x03\x04\x0eJY\x04\x12\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\ +\x113\x11310\x01\x14\x04!!\x11!\x15!\x11\ +32\x16\x16\x0132654&##\x04}\xfe\ +\xfd\xfe\xfb\xfeT\x03^\xfdL\xe3\xc1\xf2t\xfc\xf6\xef\ +\xbe\xad\xb0\xdb\xcf\x01\xaa\xda\xd0\x05\xb6\x97\xfe'Y\xae\ +\xfeT\x82\x95\x8ex\x00\xff\xff\x00\xc9\x00\x00\x04\xbe\x05\ +\xb6\x02\x06\x00%\x00\x00\xff\xff\x00\xc9\x00\x00\x03\xf8\x05\ +\xb6\x02\x06\x01a\x00\x00\x00\x02\x00\x0e\xfe\x83\x05J\x05\ +\xb6\x00\x0d\x00\x13\x00C@$\x04\x05\x13\x07\x10\x0a\x0e\ +\x0c\x01\x00\x00\x0c\x0a\x07\x05\x05\x14\x15\x0a\x10IY\x0a\ +\x03\x01\x05\x22\x13\x0c\x06\x03\x06IY\x03\x12\x00?+\ +\x11\x0033\x18?3?+\x11\x12\x01\x179\x113\ +\x113\x113\x113\x11310\x01#\x11!\x11#\ +\x113\x12\x12\x13!\x113!\x11!\x06\x02\x07\x05J\ +\xa2\xfc\x08\xa2q\x9a\xdb\x0c\x02\x91\xb9\xfe\x9d\xfe\xb3\x12\ +\xce\x89\xfe\x83\x01}\xfe\x83\x02\x17\x01\x03\x02\xe6\x013\ +\xfa\xe4\x04\x83\xf2\xfdY\xea\x00\xff\xff\x00\xc9\x00\x00\x03\ +\xf8\x05\xb6\x02\x06\x00(\x00\x00\x00\x01\x00\x02\x00\x00\x06\ +\xbc\x05\xb6\x00\x11\x00<@\x1f\x06\x0d\x0d\x03\x0e\x0a\x09\ +\x08\x01\x0e\x00\x11\x07\x12\x13\x0f\x0c\x09\x06\x03\x00\x00\x01\ +\x0e\x0b\x11\x12\x07\x04\x01\x03\x00?33?33\x12\ +9\x1133333\x11\x12\x01\x179\x1133\x11\ +310\x01\x013\x01\x113\x11\x013\x01\x01#\x01\ +\x11#\x11\x01#\x02V\xfd\xc1\xbe\x029\xa4\x02:\xbe\ +\xfd\xc0\x02R\xc4\xfd\xba\xa4\xfd\xbb\xc7\x02\xf0\x02\xc6\xfd\ +<\x02\xc4\xfd<\x02\xc4\xfd<\xfd\x0e\x02\xe5\xfd\x1b\x02\ +\xe5\xfd\x1b\x00\x01\x00J\xff\xec\x045\x05\xcb\x00(\x00\ +C@$\x1c\x00\x13\x07\x07\x00\x03\x17#\x0c\x06)*\ +\x03\x18\x17\x18\x17JY\x18\x18\x0a&&\x1fJY&\ +\x04\x0a\x10JY\x0a\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x009\x11\x12\x01\x179\x113\ +\x11310\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04!\x22\ +'5\x16\x1632654&##5326\ +54&#\x22\x06\x07'6632\x16\x04\x19\xb7\ +\xa1\xb7\xbd\xfe\xce\xfe\xe9\xff\xa3`\xdfg\xc6\xcb\xe1\xdf\ +\xda\xd1\xcd\xe1\xa2\x89n\xb2uTe\xfb\x87\xe1\xff\x04\ +`\x90\xb4\x18\x08\x19\xb4\x91\xcd\xe5O\x9e.2\x96\x8d\ +\x86\x8a\x8f\x93\x84k\x802JrKM\xc5\x00\x01\x00\ +\xcb\x00\x00\x05R\x05\xb6\x00\x0f\x004@\x18\x0e\x02\x02\ +\x0f\x06\x09\x09\x08\x0f\x08\x10\x11\x05\x04\x0c\x0d\x04\x0d\x09\ +\x0f\x12\x06\x00\x03\x00?2?399\x113\x113\ +\x11\x12\x0199\x113\x113\x113\x11310\x13\ +3\x11\x14\x073\x013\x11#\x1147#\x01#\xcb\ +\x9f\x0e\x08\x034\xba\xa0\x11\x09\xfc\xcb\xba\x05\xb6\xfc\xd3\ +\xe1\xb6\x04\xc4\xfaJ\x03%\xc9\xdd\xfb5\x00\xff\xff\x00\ +\xcb\x00\x00\x05R\x07^\x02&\x01\xb2\x00\x00\x01\x07\x02\ +6\x00\xe1\x01R\x00\x08\xb3\x01\x10\x05&\x00+5\x00\ +\x01\x00\xc9\x00\x00\x04\xe5\x05\xb6\x00\x0a\x00-@\x16\x07\ +\x03\x03\x04\x00\x09\x0a\x04\x04\x0b\x0c\x0a\x07\x02\x07\x04\x08\ +\x05\x03\x01\x04\x12\x00?3?3\x1299\x113\x11\ +\x12\x01\x179\x113\x11310!#\x01\x11#\x11\ +3\x11\x013\x01\x04\xe5\xce\xfd\x5c\xaa\xaa\x02\x93\xc3\xfd\ +y\x02\xe5\xfd\x1b\x05\xb6\xfd<\x02\xc4\xfd:\x00\x01\x00\ +\x00\xff\xe7\x04\xd9\x05\xb6\x00\x13\x00-@\x18\x03\x12\x01\ +\x00\x00\x12\x0a\x03\x14\x15\x12\x03IY\x12\x03\x08\x0dJ\ +Y\x08\x13\x01\x12\x00??+\x00\x18?+\x11\x12\x01\ +\x179\x113\x11310!#\x11!\x07\x02\x02\x06\ +'\x22'5\x163266\x12\x13!\x04\xd9\xaa\xfe\ +%\x1f=]\x98~J;6;5O=]8\x03\ +\x12\x05\x1f\xf0\xfe!\xfeE\xae\x02\x19\x8f\x1aW\xd7\x02\ +Y\x01\xb8\xff\xff\x00\xc9\x00\x00\x06q\x05\xb6\x02\x06\x00\ +0\x00\x00\xff\xff\x00\xc9\x00\x00\x05\x1f\x05\xb6\x02\x06\x00\ ++\x00\x00\xff\xff\x00}\xff\xec\x05\xbe\x05\xcd\x02\x06\x00\ +2\x00\x00\xff\xff\x00\xc9\x00\x00\x05\x0c\x05\xb6\x02\x06\x01\ +n\x00\x00\xff\xff\x00\xc9\x00\x00\x04h\x05\xb6\x02\x06\x00\ +3\x00\x00\xff\xff\x00}\xff\xec\x04\xcf\x05\xcb\x02\x06\x00\ +&\x00\x00\xff\xff\x00\x12\x00\x00\x04Z\x05\xb6\x02\x06\x00\ +7\x00\x00\x00\x01\x00\x1b\xff\xec\x04\xf8\x05\xb6\x00\x16\x00\ +*@\x15\x12\x08\x02\x09\x04\x17\x18\x0e\x0d\x08\x0d\x00\x11\ +\x09\x03\x00\x05IY\x00\x13\x00?+\x00\x18?3\x12\ +99\x113\x11\x12\x01\x17910\x05\x22'5\x16\ +3267\x013\x01\x16\x17367\x013\x01\x0e\ +\x02\x01%oT]`n\x85B\xfd\xc7\xbc\x01\xb0\x19\ +\x0e\x08\x1c\x0b\x01g\xb4\xfe-T\x87\xa9\x14\x1e\xa6+\ +e\x8b\x04A\xfc\xc11/T\x16\x035\xfb\xea\xbb\xaa\ +O\xff\xff\x00j\xff\xec\x05\xf8\x05\xcb\x02\x06\x01s\x00\ +\x00\xff\xff\x00\x08\x00\x00\x04\x96\x05\xb6\x02\x06\x00;\x00\ +\x00\x00\x01\x00\xc9\xfe\x83\x05\xb8\x05\xb6\x00\x0b\x002@\ +\x19\x08\x05\x09\x00\x03\x02\x02\x00\x05\x03\x0c\x0d\x0a\x06\x03\ +\x00\x08\x05\x08IY\x05\x12\x03\x22\x00??+\x11\x00\ +3\x18?3\x11\x12\x01\x179\x113\x113\x1131\ +0%3\x11#\x11!\x113\x11!\x113\x05\x0c\xac\ +\xa1\xfb\xb2\xaa\x02\xef\xaa\x9a\xfd\xe9\x01}\x05\xb6\xfa\xe4\ +\x05\x1c\x00\x00\x01\x00\xaa\x00\x00\x04\xc7\x05\xb6\x00\x13\x00\ +-@\x16\x0b\x08\x11\x01\x01\x00\x08\x00\x14\x15\x05\x0eI\ +Y\x05\x05\x01\x12\x09\x03\x01\x12\x00??3\x129/\ ++\x11\x12\x0199\x113\x113\x11310!#\ +\x11\x06\x06#\x22&5\x113\x11\x14\x163267\ +\x113\x04\xc7\xaa\x95\xc6j\xcf\xdf\xaa\x7f\x8fa\xb1\xa9\ +\xaa\x02\x5c5'\xbe\xb3\x02E\xfd\xcfyt\x1d7\x02\ +\xca\x00\x01\x00\xc9\x00\x00\x07y\x05\xb6\x00\x0b\x001@\ +\x18\x04\x01\x08\x05\x09\x00\x00\x05\x01\x03\x0c\x0d\x0a\x06\x02\ +\x03\x08\x04\x01\x04IY\x01\x12\x00?+\x11\x003\x18\ +?33\x11\x12\x01\x179\x113\x113\x11310\ +!!\x113\x11!\x113\x11!\x113\x07y\xf9P\ +\xaa\x02X\xaa\x02X\xac\x05\xb6\xfa\xe4\x05\x1c\xfa\xe4\x05\ +\x1c\x00\x01\x00\xc9\xfe\x83\x08\x04\x05\xb6\x00\x0f\x00;@\ +\x1e\x03\x00\x07\x04\x08\x0b\x0e\x0d\x0d\x0b\x04\x00\x04\x10\x11\ +\x0e\x22\x09\x05\x01\x03\x0b\x07\x03\x00\x03IY\x00\x12\x00\ +?+\x11\x0033\x18?33?\x11\x12\x01\x179\ +\x113\x113\x113\x113103\x113\x11!\x11\ +3\x11!\x113\x113\x11#\x11\xc9\xaa\x02G\xac\x02\ +H\xaa\xac\xa2\x05\xb6\xfa\xe4\x05\x1c\xfa\xe4\x05\x1c\xfa\xe4\ +\xfd\xe9\x01}\x00\x00\x02\x00\x12\x00\x00\x05\x17\x05\xb6\x00\ +\x0c\x00\x15\x00=@ \x09\x0d\x0d\x04\x11\x00\x00\x04\x06\ +\x03\x16\x17\x09\x15IY\x09\x09\x04\x07\x07\x06IY\x07\ +\x03\x04\x0dJY\x04\x12\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x01\x179\x113\x113\x113\ +10\x01\x14\x04#!\x11!5!\x113 \x04\x01\ +32654&##\x05\x17\xfe\xfd\xf9\xfeG\xfe\ +\xb0\x01\xfa\xf4\x01\x05\x01\x12\xfc\xf5\xfc\xb5\xa9\xaf\xcb\xe0\ +\x01\xaa\xce\xdc\x05\x1f\x97\xfd\x90\xcd\xfe\x1a\x8b\x8c\x88~\ +\x00\x00\x03\x00\xc9\x00\x00\x06\x0a\x05\xb6\x00\x0a\x00\x13\x00\ +\x17\x00?@ \x03\x0b\x0b\x00\x0f\x07\x15\x14\x14\x07\x00\ +\x03\x18\x19\x15\x12\x03\x13IY\x03\x03\x00\x16\x01\x03\x00\ +\x0bJY\x00\x12\x00?+\x00\x18?3\x129/+\ +\x00\x18?\x11\x12\x01\x179\x113\x113\x113\x113\ +103\x113\x113 \x04\x15\x14\x04#%32\ +654&##\x01#\x113\xc9\xaa\xef\x01\x05\x01\ +\x12\xfe\xfd\xf9\xfe\xf6\xf7\xb5\xaa\xb3\xc8\xdb\x04\x97\xaa\xaa\ +\x05\xb6\xfd\x90\xcd\xcf\xce\xdc\x91\x8d\x8c\x89{\xfdR\x05\ +\xb6\x00\x02\x00\xc9\x00\x00\x04\xba\x05\xb6\x00\x0a\x00\x12\x00\ +2@\x19\x07\x0b\x0b\x04\x0e\x00\x04\x00\x13\x14\x07\x12I\ +Y\x07\x07\x04\x05\x03\x04\x0bJY\x04\x12\x00?+\x00\ +\x18?\x129/+\x11\x12\x0199\x113\x113\x11\ +310\x01\x14\x04#!\x113\x11! \x04\x01!\ + \x114&#!\x04\xba\xfe\xf1\xfb\xfe\x19\xaa\x01#\ +\x01\x0b\x01\x19\xfc\xb9\x01+\x01l\xbb\xce\xfe\xf2\x01\xaa\ +\xcb\xdf\x05\xb6\xfd\x90\xd3\xfe \x01\x17\x87\x7f\x00\x01\x00\ +=\xff\xec\x04\x89\x05\xcb\x00\x1a\x00:@\x1f\x18\x15\x15\ +\x09\x09\x16\x0f\x03\x04\x1b\x1c\x17\x16IY\x17\x17\x0c\x05\ +\x0c\x12IY\x0c\x13\x05\x00IY\x05\x04\x00?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x01\x179\x11\ +3\x11310\x01\x22\x07'632\x04\x12\x15\x10\ +\x00!\x22'5\x16\x163 \x00\x13!5!&\x00\ +\x01\xd3\xac\xa2H\xac\xec\xd9\x019\xa2\xfe\x94\xfe\xaa\xe3\ +\x9cS\xacc\x01\x0f\x01\x14\x08\xfd1\x02\xcd\x16\xfe\xf1\ +\x053L\x90T\xb0\xfe\xba\xdd\xfe\x88\xfel9\x95\x15\ +\x22\x01!\x01\x10\x98\xe5\x01\x02\x00\x02\x00\xc9\xff\xec\x07\ +\xe7\x05\xcd\x00\x12\x00\x1e\x00G@&\x0c\x08\x08\x09\x13\ +\x0d\x06\x19\x00\x00\x06\x09\x03\x1f \x10\x1cIY\x10\x04\ +\x0c\x07IY\x0c\x0c\x09\x0a\x03\x09\x12\x03\x16IY\x03\ +\x13\x00?+\x00\x18??\x129/+\x00\x18?+\ +\x11\x12\x01\x179\x113\x1133\x113\x11310\ +\x01\x10\x00! \x00\x03!\x11#\x113\x11!\x12\x00\ +! \x00\x01\x10\x1232\x12\x11\x10\x02#\x22\x02\x07\ +\xe7\xfe\xab\xfe\xd0\xfe\xd3\xfe\xab\x0b\xfe\x9e\xaa\xaa\x01d\ +\x17\x01Q\x01\x1f\x013\x01V\xfb\xa0\xee\xe7\xea\xed\xeb\ +\xe8\xe9\xf0\x02\xdd\xfe\x9e\xfeq\x01o\x01U\xfdP\x05\ +\xb6\xfd\x92\x017\x01N\xfeo\xfe\xa1\xfe\xd8\xfe\xcc\x01\ +2\x01*\x01*\x01.\xfe\xcf\x00\x02\x003\x00\x00\x04\ +N\x05\xb6\x00\x0d\x00\x15\x00=@ \x15\x0c\x0c\x0b\x12\ +\x06\x02\x06\x03\x0b\x04\x17\x16\x00\x14JY\x03\x09\x00\x00\ +\x02\x09\x09\x0fJY\x09\x03\x0c\x02\x12\x00?3?+\ +\x11\x12\x009\x18/\x129+\x11\x12\x01\x179\x113\ +\x113\x11310\x01\x01#\x01&&54$!\ +!\x11#\x11\x11#\x22\x06\x15\x10!3\x02{\xfe\x81\ +\xc9\x01\x9a\xa1\x92\x01\x0f\x01\x13\x01\x92\xaa\xe3\xb7\xbe\x01\ +{\xdd\x02b\xfd\x9e\x02\x7f3\xcf\x9e\xc4\xd3\xfaJ\x02\ +b\x02\xc1~\x8e\xfe\xdd\xff\xff\x00^\xff\xec\x03\xcd\x04\ +Z\x02\x06\x00D\x00\x00\x00\x02\x00w\xff\xec\x04T\x06\ +!\x00\x17\x00\x22\x00;@\x1e\x1a\x12 \x0b\x00\x00\x06\ +\x12\x03$#\x0c\x0b\x0f\x1cFY\x0b\x0f\x0f\x15\x05\x15\ +\x18FY\x15\x16\x05\x01\x00??+\x11\x12\x009\x18\ +/9+\x11\x003\x11\x12\x01\x179\x1133\x113\ +10\x13\x10\x127$7\x17\x04\x07\x06\x06\x0736\ +632\x12\x15\x10\x00#\x22\x00\x05 \x11\x10!\x22\ +\x06\x06\x07\x10\x12w\xd4\xe6\x01\x1e\xda\x1f\xfe\xa5\x95\x91\ +\x91\x07\x0c>\xc4k\xca\xe2\xfe\xfa\xea\xe7\xfe\xfa\x01\xfc\ +\x011\xfe\xebL\x8du \xa6\x02\x91\x01h\x01\x932\ +=&\x92:\x22!\xf6\xd4T`\xfe\xfa\xe8\xfe\xff\xfe\ +\xdf\x01b\xd7\x01\x85\x01s?h7\xfe\xf9\xfe\xed\x00\ +\x03\x00\xb0\x00\x00\x04L\x04H\x00\x0e\x00\x16\x00\x1f\x00\ +I@&\x1c\x14\x14\x0b\x17\x00\x0f\x07\x07\x00\x03\x0b\x04\ + !\x04\x1c\x13\x1c\x13FY\x1c\x1c\x0b\x0c\x0c\x1bF\ +Y\x0c\x0f\x0b\x14FY\x0b\x15\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x009\x11\x12\x01\x179\ +\x113\x113\x113\x11310\x01\x14\x06\x07\x15\x16\ +\x16\x15\x14\x06#!\x11! \x034&#!\x11!\ + \x034&#!\x11!26\x04){o\x8c\x81\ +\xe1\xd8\xfe\x1d\x01\xe1\x01\x98\x83\x87\x9c\xfe\xd3\x011\x01\ +\x1f\x1f{}\xfe\xc7\x01\x19\x9a~\x035ko\x13\x09\ +\x13~o\x99\xa6\x04H\xfd\x02YQ\xfe\x97\x02\x9aP\ +C\xfe\xcbL\x00\x00\x01\x00\xb0\x00\x00\x03D\x04H\x00\ +\x05\x00\x1d@\x0e\x02\x03\x00\x03\x07\x06\x04\x01FY\x04\ +\x0f\x03\x15\x00??+\x11\x12\x0199\x11310\ +\x01!\x11#\x11!\x03D\xfe\x12\xa6\x02\x94\x03\xba\xfc\ +F\x04H\x00\x02\x00)\xfe\x85\x04h\x04H\x00\x0d\x00\ +\x13\x00C@$\x04\x05\x13\x07\x10\x0a\x0e\x0c\x01\x00\x00\ +\x0c\x0a\x07\x05\x05\x14\x15\x0a\x10GY\x0a\x0f\x01\x05\x22\ +\x13\x0c\x06\x03\x06FY\x03\x15\x00?+\x11\x0033\ +\x18?3?+\x11\x12\x01\x179\x113\x113\x113\ +\x113\x11310\x01#\x11!\x11#\x1136\x12\ +\x13!\x113!\x11#\x06\x02\x07\x04h\xa1\xfd\x02\xa0\ +V\x86\x98\x03\x02+\x9d\xfe\xc3\xf6\x0d\x91l\xfe\x85\x01\ +{\xfe\x85\x02\x0a\xb6\x01\xea\x01\x19\xfcG\x036\xde\xfe\ +9\x91\x00\xff\xff\x00s\xff\xec\x04\x12\x04\x5c\x02\x06\x00\ +H\x00\x00\x00\x01\x00\x04\x00\x00\x05\xdf\x04F\x00\x11\x00\ +<@\x1f\x02\x09\x09\x11\x0a\x06\x04\x05\x0a\x0e\x0f\x0d\x07\ +\x13\x12\x11\x0b\x08\x05\x02\x0e\x0e\x0d\x03\x00\x0f\x0f\x0a\x07\ +\x0d\x15\x00?33?33\x129\x113333\ +3\x11\x12\x01\x179\x1133\x11310\x013\x11\ +\x013\x01\x01#\x01\x11#\x11\x01#\x01\x013\x01\x02\ +\xa4\x99\x01\xc5\xb6\xfe6\x01\xf1\xc0\xfe\x1e\x99\xfe\x1f\xbf\ +\x01\xf0\xfe7\xb6\x01\xc3\x04F\xfd\xed\x02\x13\xfd\xed\xfd\ +\xcd\x02+\xfd\xd5\x02+\xfd\xd5\x023\x02\x13\xfd\xed\x00\ +\x01\x00D\xff\xec\x03\x7f\x04\x5c\x00\x22\x00M@+\x02\ +\x0d\x1e\x13\x13\x0d\x0f!\x08\x18\x06#$\x10\x22!\x22\ +!FY\x0f\x22\x1f\x22\x02\x0b\x03\x22\x22\x16\x0a\x16\x1b\ +FY\x16\x16\x0a\x04FY\x0a\x10\x00?+\x00\x18?\ ++\x11\x12\x009\x18/_^]+\x11\x12\x009\x11\ +\x12\x01\x179\x113\x11310\x01 54#\x22\ +\x06\x07'632\x16\x15\x14\x07\x15\x16\x16\x15\x14\x06\ +#\x22'5\x1632654!#5\x01\x81\x01\ +7\xfcM~f;\xaa\xc9\xbd\xda\xcd~t\xf5\xd8\xed\ +\x81\xb7\xbb\x90\x93\xfe\xc9\x98\x02\x81\xac\xa2\x1c*\x87L\ +\x9b\x86\xb89\x08%\x89g\x98\xa9G\x98Vc]\xbf\ +\x8d\x00\x01\x00\xb0\x00\x00\x04b\x04H\x00\x0d\x004@\ +\x19\x08\x04\x07\x07\x06\x0b\x03\x03\x0c\x06\x0c\x0f\x0e\x03\x0a\ +\x0c\x04\x0d\x0f\x0c\x15\x07\x15\x04\x0f\x00????\x11\ +\x1299\x11\x12\x0199\x113\x113\x113\x113\ +310\x01\x11\x07\x07\x013\x11#\x1177\x01#\ +\x11\x01L\x07\x03\x02Q\xcf\x9b\x03\x05\xfd\xb0\xcf\x04H\ +\xfdI\xb69\x03\xa6\xfb\xb8\x02\x9e\x84\x82\xfc\x5c\x04H\ +\x00\xff\xff\x00\xb0\x00\x00\x04b\x06\x0c\x02&\x01\xd2\x00\ +\x00\x01\x06\x026=\x00\x00\x08\xb3\x01\x0e\x11&\x00+\ +5\x00\x01\x00\xb0\x00\x00\x04\x0c\x04H\x00\x0a\x00-@\ +\x16\x0a\x06\x06\x07\x03\x01\x02\x07\x04\x0c\x0b\x02\x0a\x05\x0a\ +\x07\x00\x08\x0f\x04\x07\x15\x00?3?3\x1299\x11\ +3\x11\x12\x01\x179\x113\x11310\x013\x01\x01\ +#\x01\x11#\x113\x11\x03/\xb6\xfe'\x02\x00\xc2\xfe\ +\x0c\xa6\xa6\x04H\xfd\xef\xfd\xc9\x02+\xfd\xd5\x04H\xfd\ +\xeb\x00\x01\x00\x10\xff\xf2\x03\xe1\x04H\x00\x10\x00-@\ +\x18\x01\x00\x03\x0f\x0a\x0f\x00\x03\x12\x11\x0f\x03FY\x0f\ +\x0f\x07\x0cGY\x07\x16\x01\x15\x00??+\x00\x18?\ ++\x11\x12\x01\x179\x113\x11310!#\x11!\ +\x02\x02\x06#\x22'5\x1632\x12\x13!\x03\xe1\xa8\ +\xfe\xb7\x1b`\x99v6 \x16\x1cs\x88#\x02\x81\x03\ +\xba\xfe\x9c\xfe^\xc2\x0c{\x06\x01\xe6\x01\xef\x00\x01\x00\ +\xb0\x00\x00\x05/\x04F\x00\x14\x005@\x19\x03\x06\x06\ +\x05\x12\x0f\x0f\x10\x05\x10\x16\x15\x07\x0e\x00\x0e\x0b\x03\x11\ +\x0f\x06\x10\x15\x0b\x15\x00??3?3\x1299\x11\ +3\x11\x12\x0199\x113\x113\x113\x11310\ +%77\x013\x11#\x11\x07\x07\x01#\x01&'\x11\ +#\x113\x01\x16\x02\xe9\x1f+\x01)\xd3\x93\x14:\xfe\ +\xe5\x8b\xfe\xe55\x14\x94\xcb\x01\x1f+\xa0]v\x02\xd3\ +\xfb\xba\x03\x89:\x99\xfdJ\x02\xb8\x86K\xfcw\x04F\ +\xfdIn\x00\x01\x00\xb0\x00\x00\x04b\x04H\x00\x0b\x00\ +9@\x1e\x02\x06\x06\x05\x01\x09\x09\x0a\x05\x0a\x0d\x0c\x01\ +\x08FY/\x01?\x01\x02\x01\x01\x0a\x03\x0b\x0f\x06\x0a\ +\x15\x00?3?3\x129/]+\x11\x12\x0199\ +\x113\x113\x113\x11310\x01\x11!\x113\x11\ +#\x11!\x11#\x11\x01V\x02f\xa6\xa6\xfd\x9a\xa6\x04\ +H\xfe5\x01\xcb\xfb\xb8\x01\xee\xfe\x12\x04H\xff\xff\x00\ +s\xff\xec\x04b\x04\x5c\x02\x06\x00R\x00\x00\x00\x01\x00\ +\xb0\x00\x00\x04H\x04H\x00\x07\x00#@\x11\x00\x01\x05\ +\x04\x01\x04\x08\x09\x02\x07FY\x02\x0f\x05\x01\x15\x00?\ +3?+\x11\x12\x0199\x113\x11310!#\ +\x11!\x11#\x11!\x01V\xa6\x03\x98\xa8\xfd\xb6\x04H\ +\xfb\xb8\x03\xb8\x00\xff\xff\x00\xb0\xfe\x14\x04u\x04\x5c\x02\ +\x06\x00S\x00\x00\xff\xff\x00s\xff\xec\x03\x8b\x04\x5c\x02\ +\x06\x00F\x00\x00\x00\x01\x00)\x00\x00\x03\x93\x04H\x00\ +\x07\x00$@\x12\x02\x03\x00\x03\x05\x03\x08\x09\x01\x05\x06\ +\x05FY\x06\x0f\x03\x15\x00??+\x11\x003\x11\x12\ +\x01\x179\x11310\x01!\x11#\x11!5!\x03\ +\x93\xfe\x9c\xa6\xfe\xa0\x03j\x03\xba\xfcF\x03\xba\x8e\xff\ +\xff\x00\x02\xfe\x14\x04\x06\x04H\x02\x06\x00\x5c\x00\x00\x00\ +\x03\x00q\xfe\x14\x05F\x06\x14\x00\x11\x00\x18\x00\x1e\x00\ +L@'\x12\x09\x1c\x0f\x04\x04\x15\x0c\x05\x19\x00\x00\x05\ +\x09\x03\x1f \x0d\x00\x1b\x16\x0c\x16FY\x0f\x0c\x10\x1c\ +\x15\x06\x15FY\x03\x06\x16\x05\x1b\x00??3+\x11\ +\x003\x18?3+\x11\x003\x18?\x11\x12\x01\x179\ +\x113\x11333\x1133\x11310\x01\x14\x00\ +\x07\x11#\x11&\x0054\x007\x113\x11\x16\x00\x05\ +\x14\x16\x17\x11\x06\x06\x05\x10%\x1166\x05F\xfe\xe5\ +\xfe\xa4\xf8\xfe\xe0\x01\x1f\xff\x9e\xfb\x01\x1e\xfb\xd9\xb0\xc0\ +\xb9\xb7\x03{\xfe\x93\xbe\xaf\x02%\xf9\xfe\xd9\x15\xfe$\ +\x01\xdc\x13\x01.\xf4\xf9\x01&\x14\x01\xbc\xfeD\x17\xfe\ +\xd4\xf0\xc0\xda\x12\x03T\x11\xcf\xc8\x01\x7f'\xfc\xae\x13\ +\xda\xff\xff\x00'\x00\x00\x04\x08\x04H\x02\x06\x00[\x00\ +\x00\x00\x01\x00\xb0\xfe\x85\x04\xdd\x04H\x00\x0b\x002@\ +\x19\x06\x03\x07\x0a\x01\x00\x00\x0a\x03\x03\x0c\x0d\x08\x04\x0f\ +\x0a\x06\x03\x06FY\x03\x15\x01\x22\x00??+\x11\x00\ +3\x18?3\x11\x12\x01\x179\x113\x113\x1131\ +0\x01#\x11!\x113\x11!\x113\x113\x04\xdd\xa6\ +\xfcy\xa6\x02F\xa6\x9b\xfe\x85\x01{\x04H\xfcG\x03\ +\xb9\xfcG\x00\x01\x00\x9c\x00\x00\x04-\x04H\x00\x12\x00\ +-@\x16\x06\x0a\x0a\x09\x01\x11\x09\x11\x14\x13\x03\x0eF\ +Y\x03\x03\x0a\x07\x12\x0f\x0a\x15\x00??3\x129/\ ++\x11\x12\x0199\x113\x113\x11310\x01\x11\ +\x143267\x113\x11#\x11\x06\x06#\x22&5\ +\x11\x01B\xdb[\xa6i\xa6\xa6i\xb3q\xa4\xba\x04H\ +\xfep\xc08C\x01\xd5\xfb\xb8\x01\xf0H;\xac\x93\x01\ +\x9c\x00\x01\x00\xb0\x00\x00\x06o\x04H\x00\x0b\x001@\ +\x18\x08\x05\x00\x09\x01\x04\x04\x09\x05\x03\x0c\x0d\x0a\x02\x06\ +\x0f\x00\x08\x05\x08FY\x05\x15\x00?+\x11\x003\x18\ +?33\x11\x12\x01\x179\x113\x113\x11310\ +%!\x113\x11!\x113\x11!\x113\x03\xe1\x01\xe6\ +\xa8\xfaA\xa6\x01\xe5\xa6\x8f\x03\xb9\xfb\xb8\x04H\xfcG\ +\x03\xb9\x00\x00\x01\x00\xb0\xfe\x87\x07\x0a\x04F\x00\x0f\x00\ +;@\x1e\x0c\x09\x00\x0d\x01\x04\x07\x06\x06\x04\x0d\x09\x04\ +\x10\x11\x0e\x02\x0a\x0f\x04\x00\x0c\x09\x0cFY\x09\x15\x07\ +\x22\x00??+\x11\x0033\x18?33\x11\x12\x01\ +\x179\x113\x113\x113\x11310%!\x113\ +\x113\x11#\x11!\x113\x11!\x113\x03\xe1\x01\xe6\ +\xa6\x9d\xa8\xfaN\xa6\x01\xe5\xa6\x8f\x03\xb7\xfcI\xfd\xf8\ +\x01y\x04F\xfcI\x03\xb7\x00\x00\x02\x00)\x00\x00\x05\ +\x1d\x04H\x00\x0c\x00\x14\x00=@ \x00\x12\x12\x08\x0d\ +\x04\x04\x08\x0a\x03\x15\x16\x00\x11FY\x00\x00\x08\x0b\x0b\ +\x0aFY\x0b\x0f\x08\x12FY\x08\x15\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x01\x179\x113\ +\x113\x11310\x01!2\x16\x15\x14\x06#!\x11\ +!5!\x014&#!\x11! \x02-\x019\xe0\ +\xd7\xdf\xdc\xfe%\xfe\xa2\x02\x04\x02L|\x9d\xfe\xcd\x01\ +9\x01\x13\x02\x83\x9a\x9b\xa6\xa8\x03\xba\x8e\xfc\xfc]S\ +\xfe\x97\x00\x00\x03\x00\xb0\x00\x00\x05y\x04H\x00\x0a\x00\ +\x0e\x00\x16\x00?@ \x00\x10\x10\x08\x04\x13\x0c\x0b\x0b\ +\x13\x08\x03\x17\x18\x0c\x15\x00\x0fFY\x00\x00\x08\x0d\x09\ +\x0f\x08\x10FY\x08\x15\x00?+\x00\x18?3\x129\ +/+\x00\x18?\x11\x12\x01\x179\x113\x113\x113\ +\x11310\x01!2\x16\x15\x14\x06#!\x113\x01\ +#\x113\x01\x11! 54&#\x01V\x01+\xd1\ +\xc9\xd5\xcf\xfe9\xa6\x04#\xa6\xa6\xfb\xdd\x01\x19\x01\x08\ +z\x93\x02\x83\x9b\x9a\xa5\xa9\x04H\xfb\xb8\x04H\xfd\xac\ +\xfe\x97\xb9\x5cT\x00\x02\x00\xb0\x00\x00\x04L\x04H\x00\ +\x09\x00\x12\x002@\x19\x0f\x03\x00\x0b\x0b\x07\x03\x07\x14\ +\x13\x00\x0aFY\x00\x00\x07\x08\x0f\x07\x0bFY\x07\x15\ +\x00?+\x00\x18?\x129/+\x11\x12\x0199\x11\ +3\x113\x11310\x01! \x11\x14\x06#!\x11\ +3\x11\x11!2654&#\x01V\x01R\x01\xa4\ +\xdb\xd3\xfe\x12\xa6\x01@\x84\x8c\x81\x94\x02\x83\xfe\xcb\xa2\ +\xac\x04H\xfd\xac\xfe\x97\x5c][U\x00\x01\x009\xff\ +\xec\x03}\x04\x5c\x00\x1a\x00D@&\x0c\x09\x09\x18\x18\ +\x0a\x12\x02\x04\x1b\x1c\x0b\x0aFY\x0f\x0b\x1f\x0b\x02\x0b\ +\x03\x0b\x0b\x00\x15\x15\x0fFY\x15\x10\x00\x06FY\x00\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]+\x11\x12\x01\x179\x113\x11310\x05\x22'\ +5\x16\x163267!5!&&#\x22\x07'\ +663 \x00\x11\x10\x00\x01V\xa7v<\x8c[\xae\ +\xbd\x0a\xfd\xd5\x02)\x10\xa9\xa1g\x97/7\xa4P\x01\ +\x00\x01\x0a\xfe\xdf\x149\x93\x17$\xba\xb9\x8d\xac\xa06\ +\x8c\x1a#\xfe\xdb\xfe\xec\xfe\xf3\xfe\xd6\x00\x02\x00\xb0\xff\ +\xec\x063\x04\x5c\x00\x12\x00\x1e\x00Q@-\x0c\x08\x08\ +\x09\x13\x0d\x06\x19\x00\x00\x06\x09\x03\x1f \x10\x1cFY\ +\x10\x10\x0c\x07FY\x0f\x0c\x1f\x0c\x02\x0b\x03\x0c\x0c\x09\ +\x0a\x0f\x09\x15\x03\x16FY\x03\x16\x00?+\x00\x18?\ +?\x129/_^]+\x00\x18?+\x11\x12\x01\x17\ +9\x113\x1133\x113\x11310\x01\x10\x00#\ +\x22\x02'!\x11#\x113\x11!6632\x00\x01\ +\x14\x1632654&#\x22\x06\x063\xfe\xff\xe0\ +\xd5\xfa\x0e\xfe\xe1\xa6\xa6\x01!\x14\xfc\xcf\xdc\x01\x01\xfc\ +\xee\x92\xa1\x9e\x95\x92\xa1\xa1\x92\x02%\xfe\xf3\xfe\xd4\x01\ +\x0b\xf7\xfe\x12\x04H\xfe5\xe4\xfb\xfe\xcf\xfe\xfa\xd3\xdb\ +\xd5\xd9\xd2\xd8\xd8\x00\x02\x00%\x00\x00\x03\xc1\x04H\x00\ +\x0d\x00\x14\x00=@ \x11\x0b\x0b\x0a\x0e\x05\x01\x05\x02\ +\x0a\x04\x16\x15\x0d\x10FY\x02\x08\x0d\x0d\x01\x08\x08\x13\ +FY\x08\x0f\x0b\x01\x15\x00?3?+\x11\x12\x009\ +\x18/\x129+\x11\x12\x01\x179\x113\x113\x113\ +103#\x01&&5463!\x11#\x11!\ +\x01\x14!!\x11!\x22\xe7\xc2\x01;\x7f\x87\xca\xb5\x01\ +\xe8\xa6\xfe\xeb\xfe\xf6\x01\x14\x01\x0b\xfe\xd3\xf2\x01\xcf\x1c\ +\xa1z\x96\xac\xfb\xb8\x01\xb6\x01N\xbe\x01r\xff\xff\x00\ +s\xff\xec\x04\x12\x05\xd3\x02&\x00H\x00\x00\x01\x06\x00\ +j\x08\x00\x00\x0a\xb4\x03\x020\x11&\x00+55\x00\ +\x01\x00\x14\xfe\x14\x04D\x06\x14\x00'\x00f@:\x1d\ +\x1b\x17\x0f\x0f\x14\x10\x07%%\x19\x02\x10\x12\x05()\ +\x1e\x1d!\x0bFY\x1a\x12\x13\x12GY\x17\x13\x0f\x13\ +\x1f\x13/\x13\x03\x09\x03\x1d!\x13\x13!\x1d\x03\x10\x15\ +\x00\x10\x15\x00\x05FY\x00\x1b\x00?+\x00\x18??\ +\x12\x179///_^]\x113+\x11\x003+\ +\x11\x003\x11\x12\x01\x179\x113\x1133\x1133\ +310\x01\x22'5\x16325\x114&#\x22\ +\x06\x15\x11#\x11#5353\x15!\x15!\x15\x14\ +\x0736632\x16\x15\x11\x14\x06\x03/O4:\ +7\x81z\x82\xad\x9d\xa8\x9c\x9c\xa6\x01\x91\xfeo\x08\x0a\ +1\xb5t\xc9\xc9\x89\xfe\x14\x19\x89\x14\xaa\x03R\x86\x84\ +\xbc\xd3\xfd\xe7\x04\xdb\x7f\xba\xba\x7f\xc4T8O[\xbf\ +\xd2\xfc\xb6\x9c\xaa\xff\xff\x00\xb0\x00\x00\x03D\x06!\x02\ +&\x01\xcd\x00\x00\x01\x06\x00v\xf1\x00\x00\x08\xb3\x01\x0f\ +\x11&\x00+5\x00\x01\x00s\xff\xec\x03\xaa\x04\x5c\x00\ +\x19\x00D@&\x0f\x12\x12\x03\x09\x18\x11\x03\x04\x1a\x1b\ +\x0f\x12FY\x0f\x0f\x1f\x0f\x02\x0b\x03\x0f\x0f\x00\x06\x06\ +\x0cFY\x06\x10\x00\x15FY\x00\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]+\x11\x12\x01\x17\ +9\x113\x11310\x05\x22\x00\x11\x10\x0032\x16\ +\x17\x07&#\x22\x06\x07!\x15!\x16\x16327\x15\ +\x06\x02y\xf8\xfe\xf2\x01\x13\xfbR\x9e91\x8fm\xa4\ +\xaa\x10\x02)\xfd\xd5\x09\xaa\xa7\x8c\x97t\x14\x01#\x01\ +\x10\x01\x13\x01* \x19\x8d3\xa3\xa9\x8d\xbe\xb5;\x93\ +9\xff\xff\x00j\xff\xec\x03s\x04\x5c\x02\x06\x00V\x00\ +\x00\xff\xff\x00\xa2\x00\x00\x01f\x05\xdf\x02\x06\x00L\x00\ +\x00\xff\xff\xff\xec\x00\x00\x02\x1f\x05\xd3\x02&\x00\xf3\x00\ +\x00\x01\x07\x00j\xfe\xb7\x00\x00\x00\x0a\xb4\x02\x01\x19\x11\ +&\x00+55\xff\xff\xff\x91\xfe\x14\x01f\x05\xdf\x02\ +\x06\x00M\x00\x00\x00\x02\x00\x10\xff\xf2\x06B\x04H\x00\ +\x15\x00\x1d\x00L@)\x09\x14\x00\x1b\x1b\x07\x16\x04\x04\ +\x07\x14\x0e\x04\x1e\x1f\x00\x1aFY\x00\x00\x0c\x14\x14\x09\ +FY\x14\x0f\x0c\x11GY\x0c\x15\x07\x1bFY\x07\x15\ +\x00?+\x00\x18?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x01\x179\x113\x113\x113\x1131\ +0\x0132\x16\x15\x10!!\x11!\x02\x02#\x22'\ +5\x1632\x12\x13!\x014&##\x113 \x03\ +\xb0\xf4\xd3\xcb\xfeK\xfee\xfe\xfe(\xb5\xab8 \x16\ +\x1cs\x88#\x02P\x01\xec}\x9e\xe7\xed\x01\x15\x02\x83\ +\x9b\x9a\xfe\xb2\x03\xba\xfd\xfa\xfe>\x0c{\x06\x01\xe6\x01\ +\xef\xfc\xfc[U\xfe\x97\x00\x02\x00\xb0\x00\x00\x06\xa4\x04\ +F\x00\x11\x00\x19\x00J@&\x0f\x0b\x0b\x0c\x01\x13\x13\ +\x10\x08\x16\x05\x05\x08\x0c\x03\x1a\x1b\x12\x0a\x0f\x0aFY\ +\x01\x0f\x0f\x08\x11\x0d\x0f\x0c\x15\x08\x13FY\x08\x15\x00\ +?+\x00\x18??3\x129/3+\x11\x003\x11\ +\x12\x01\x179\x113\x1133\x113\x113\x1131\ +0\x01\x11!2\x16\x15\x10!!\x11!\x11#\x113\ +\x11!\x11\x13\x113 54&#\x04\x00\x01\x00\xd9\ +\xcb\xfeN\xfe`\xfe\x0a\xac\xac\x01\xfa\xa6\xf0\x01\x14\x80\ +\x99\x04F\xfe;\x99\x9a\xfe\xb2\x01\xee\xfe\x12\x04F\xfe\ +7\x01\xc9\xfd\xae\xfe\x97\xb9\x5cT\x00\xff\xff\x00\x14\x00\ +\x00\x04D\x06\x14\x02\x06\x00\xe9\x00\x00\xff\xff\x00\xb0\x00\ +\x00\x04\x0c\x06!\x02&\x01\xd4\x00\x00\x01\x06\x00v3\ +\x00\x00\x08\xb3\x01\x14\x11&\x00+5\xff\xff\x00\x02\xfe\ +\x14\x04\x06\x06\x0c\x02&\x00\x5c\x00\x00\x01\x06\x026\xb7\ +\x00\x00\x08\xb3\x01\x16\x11&\x00+5\x00\x01\x00\xb0\xfe\ +\x87\x04F\x04F\x00\x0b\x002@\x19\x04\x01\x0a\x0b\x05\ +\x08\x08\x0b\x01\x03\x0c\x0d\x0b\x22\x06\x02\x0f\x09\x01\x01\x04\ +FY\x01\x15\x00?+\x11\x003\x18?3?\x11\x12\ +\x01\x179\x113\x113\x11310!!\x113\x11\ +!\x113\x11!\x11#\x02/\xfe\x81\xa6\x02J\xa6\xfe\ +\x8f\xa6\x04F\xfcI\x03\xb7\xfb\xba\xfe\x87\x00\x00\x01\x00\ +\xc9\x00\x00\x04\x08\x06\xe3\x00\x07\x00#@\x11\x00\x03\x05\ +\x06\x03\x06\x09\x08\x07\x04IY\x01\x07\x03\x06\x12\x00?\ +?\xc6+\x11\x12\x0199\x113\x11310\x01\x11\ +3\x11!\x11#\x11\x03f\xa2\xfdk\xaa\x05\xb6\x01-\ +\xfe:\xfa\xe3\x05\xb6\x00\x00\x01\x00\xb0\x00\x00\x03D\x05\ +\x89\x00\x07\x00'@\x12\x05\x00\x02\x03\x00\x03\x09\x08\x06\ +\x04\x04\x01GY\x04\x0f\x03\x15\x00??+\x00\x18\x10\ +\xc6\x11\x12\x0199\x113\x11310\x01!\x11#\ +\x11!\x113\x03D\xfe\x12\xa6\x01\xee\xa6\x03\xc7\xfc9\ +\x04H\x01A\x00\xff\xff\x00\x1b\x00\x00\x07L\x07s\x02\ +&\x00:\x00\x00\x01\x07\x00C\x01\x17\x01R\x00\x08\xb3\ +\x01\x1b\x05&\x00+5\xff\xff\x00\x17\x00\x00\x06#\x06\ +!\x02&\x00Z\x00\x00\x01\x06\x00Cs\x00\x00\x08\xb3\ +\x01\x1e\x11&\x00+5\xff\xff\x00\x1b\x00\x00\x07L\x07\ +s\x02&\x00:\x00\x00\x01\x07\x00v\x01\xb0\x01R\x00\ +\x08\xb3\x01#\x05&\x00+5\xff\xff\x00\x17\x00\x00\x06\ +#\x06!\x02&\x00Z\x00\x00\x01\x07\x00v\x01\x1b\x00\ +\x00\x00\x08\xb3\x01&\x11&\x00+5\xff\xff\x00\x1b\x00\ +\x00\x07L\x07%\x02&\x00:\x00\x00\x01\x07\x00j\x01\ +d\x01R\x00\x0a\xb4\x02\x01/\x05&\x00+55\xff\ +\xff\x00\x17\x00\x00\x06#\x05\xd3\x02&\x00Z\x00\x00\x01\ +\x07\x00j\x00\xcf\x00\x00\x00\x0a\xb4\x02\x012\x11&\x00\ ++55\xff\xff\x00\x00\x00\x00\x04{\x07s\x02&\x00\ +<\x00\x00\x01\x07\x00C\xff\x94\x01R\x00\x08\xb3\x01\x0a\ +\x05&\x00+5\xff\xff\x00\x02\xfe\x14\x04\x06\x06!\x02\ +&\x00\x5c\x00\x00\x01\x07\x00C\xffa\x00\x00\x00\x08\xb3\ +\x01\x17\x11&\x00+5\x00\x01\x00R\x01\xd9\x03\xae\x02\ +q\x00\x03\x00\x11\xb5\x00\x02\x04\x05\x00\x01\x00/3\x11\ +\x12\x019910\x135!\x15R\x03\x5c\x01\xd9\x98\ +\x98\x00\x01\x00R\x01\xd9\x07\xae\x02q\x00\x03\x00\x11\xb5\ +\x00\x02\x04\x05\x00\x01\x00/3\x11\x12\x019910\ +\x135!\x15R\x07\x5c\x01\xd9\x98\x98\xff\xff\x00R\x01\ +\xd9\x07\xae\x02q\x02\x06\x02\x03\x00\x00\x00\x02\xff\xfc\xfe\ +1\x03N\xff\xd3\x00\x03\x00\x07\x00\x1c@\x0b\x04\x00\x09\ +\x05\x01\x01\x08\x05\x06\x02\x01\x00/3/3\x11\x013\ +\x113\x113210\x01!5!5!5!\x03\ +N\xfc\xae\x03R\xfc\xae\x03R\xfe1\x8b\x8c\x8b\x00\x00\ +\x01\x00\x19\x03\xc1\x01D\x05\xb6\x00\x07\x00\x12\xb6\x01\x05\ +\x08\x09\x00\x04\x03\x00?\xcd\x11\x12\x019910\x13\ +'6\x1273\x06\x07%\x0c\x16b8{B%\x03\ +\xc1\x16Z\x01\x0cy\xfe\xf7\x00\x00\x01\x00\x19\x03\xc1\x01\ +D\x05\xb6\x00\x07\x00\x12\xb6\x05\x01\x08\x09\x05\x07\x03\x00\ +?\xc6\x11\x12\x019910\x01\x17\x06\x02\x07#\x12\ +7\x015\x0f\x1ab5zF \x05\xb6\x16d\xfe\xf7\ +r\x01\x1d\xd8\x00\xff\xff\x00?\xfe\xf8\x01m\x00\xee\x02\ +\x06\x00\x0f\x00\x00\x00\x01\x00\x19\x03\xc1\x01F\x05\xb6\x00\ +\x07\x00\x12\xb6\x02\x06\x09\x08\x03\x07\x03\x00?\xcd\x11\x12\ +\x019910\x13\x16\x17#&\x02'7\xdf%B\ +{-m\x18\x0e\x05\xb6\xfb\xfa^\x01\x1ce\x16\x00\x00\ +\x02\x00\x19\x03\xc1\x02\xb4\x05\xb6\x00\x07\x00\x0f\x00\x1a@\ +\x0c\x04\x01\x0d\x09\x04\x10\x11\x00\x08\x03\x0c\x03\x00?3\ +\xcd2\x11\x12\x01\x17910\x01'6\x133\x06\x02\ +\x07!'6\x1273\x06\x07\x01\x96\x0f8z{\x1e\ +;\x0d\xfd\xd7\x0c\x16b8{B%\x03\xc1\x16\xd7\x01\ +\x08s\xfe\xdfa\x16Z\x01\x0cy\xfe\xf7\x00\x00\x02\x00\ +\x19\x03\xc1\x02\xb4\x05\xb6\x00\x07\x00\x10\x00\x1a@\x0c\x09\ +\x0d\x01\x05\x04\x11\x12\x0d\x05\x10\x07\x03\x00?3\xc62\ +\x11\x12\x01\x17910\x01\x17\x06\x02\x07#\x127!\ +\x17\x06\x02\x07#6\x127\x015\x0f\x1ab5zF\ + \x02'\x0e\x18`8}\x1aB\x0d\x05\xb6\x16d\xfe\ +\xf7r\x01\x1d\xd8\x16[\xfe\xf6zd\x014]\x00\xff\ +\xff\x00\x19\xfe\xf9\x02\xb4\x00\xee\x01\x07\x02\x0b\x00\x00\xfb\ +8\x00 \xb7\x01\x00\x07@\x0d\x0dH\x07\xb8\xff\xc0\xb3\ +\x0c\x0cH\x07\xb8\xff\xc0\xb3\x09\x09H\x07\x00\x11++\ ++55\x00\x01\x00{\x00\x00\x03\x89\x06\x14\x00\x0b\x00\ +C@!\x09\x02\x02\x08\x03\x0a\x01\x01\x07\x04\x00\x04\x03\ +\x05\x04\x0c\x0d\x00\x05\x05\x0b\x06\x06\x07\x08\x00\x01\x04\x04\ +\x0a\x07\x03\x12\x00?.33\x113?\x129/3\ +3\x113\x11\x12\x01\x179\x1133\x113\x1133\ +\x11310\x01%\x13#\x13\x055\x05\x033\x03%\ +\x03\x89\xfe\xa01\xc41\xfe\xb4\x01L1\xc41\x01`\ +\x03\xe7\x1f\xfb\xfa\x04\x06\x1f\xaa\x1e\x01\xa1\xfe_\x1e\x00\ +\x01\x00{\x00\x00\x03\x9a\x06\x14\x00\x15\x00u@:\x0c\ +\x07\x15\x10\x04\x04\x0f\x0a\x05\x14\x11\x00\x03\x03\x0e\x0b\x09\ +\x06\x13\x01\x01\x06\x05\x07\x04\x16\x17\x01\x08\x08\x02\x07\x03\ +\x06\x06\x00\x09\x14\x0b\x0b\x11\x0e\x13\x0c\x0c\x12\x09\x0e\x0d\ +\x07\x0d\x07\x0d\x05\x0f\x00\x05\x12\x00??\x1299/\ +/\x129922\x113\x1133\x113\x1133\ +\x113\x1133\x113\x11\x12\x01\x179\x113\x113\ +333\x11333\x11333\x1133\x113\ +10\x01%\x15%\x13#\x13\x055\x05\x03\x13\x055\ +\x05\x033\x03%\x15%\x13\x029\x01a\xfe\x9f1\xc6\ +1\xfe\xa6\x01Z++\xfe\xa6\x01Z1\xc61\x01a\ +\xfe\x9f+\x01\xe7\x1f\xa8\x1d\xfe\x85\x01{\x1d\xa8\x1f\x01\ ++\x01\x1b\x1f\xa8\x1e\x01|\xfe\x84\x1e\xa8\x1f\xfe\xe5\x00\ +\x01\x00\xa4\x01\xf4\x02^\x03\xe3\x00\x0b\x00\x13\xb6\x06\x00\ +\x00\x0c\x0d\x09\x03\x00/\xcd\x11\x12\x019\x11310\ +\x134632\x16\x15\x14\x06#\x22&\xa4qli\ +tsjkr\x02\xecy~|{w\x81\x83\x00\xff\ +\xff\x00\x98\xff\xe3\x05\xae\x00\xf2\x00&\x00\x11\x00\x00\x00\ +'\x00\x11\x02\x12\x00\x00\x00\x07\x00\x11\x04%\x00\x00\x00\ +\x07\x00d\xff\xec\x09;\x05\xcb\x00\x09\x00\x14\x00\x18\x00\ +$\x00/\x00;\x00F\x00[@0\x00\x10\x05\x0a0\ +B6<\x19+\x1f%%+<\x15B\x0a\x17\x10\x08\ +GH\x1c33(?\x19\x03\x0d\x2299-D\x0d\ +D\x0dD\x17\x18\x06\x17\x18\x07\x12\x07\x00?3??\ +\x1299//\x1133\x113\x113?33\x11\ +3\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +\x11310\x13\x14\x1632\x11\x10#\x22\x06\x05\x14\ +\x06#\x22&5\x10!2\x16%\x01#\x01\x01\x14\x16\ +32654&#\x22\x06\x05\x14\x06#\x22&5\ +\x10!2\x16\x05\x14\x1632654&#\x22\x06\ +\x05\x14\x06#\x22&5\x10!2\x16\xecS]\xb4\xb4\ +]S\x01\xed\xa1\x9c\x95\xa3\x018\x98\xa5\x02i\xfc\xd5\ +\x94\x03+\x02\xa0S][YY[]S\x01\xed\xa2\ +\x9b\x94\xa3\x017\x96\xa7\xfb8Q][YY[]\ +Q\x01\xeb\xa2\x9b\x95\xa3\x018\x96\xa7\x04\x02\xaa\xaa\x01\ +T\x01R\xa8\xaa\xe6\xe7\xee\xdf\x01\xc9\xf0\xdb\xfaJ\x05\ +\xb6\xfc\x02\xab\xa9\xa7\xad\xab\xa5\xa5\xab\xe6\xe6\xef\xdd\x01\ +\xc9\xec\xdd\xab\xa9\xa7\xad\xab\xa5\xa5\xab\xe6\xe6\xee\xde\x01\ +\xc9\xec\x00\xff\xff\x00\x85\x03\xa6\x01?\x05\xb6\x02\x06\x00\ +\x0a\x00\x00\xff\xff\x00\x85\x03\xa6\x02\xb0\x05\xb6\x00\x06\x00\ +\x05\x00\x00\x00\x01\x00R\x00u\x02\x1f\x03\xbe\x00\x06\x00\ +\x1a@\x0a\x04\x02\x03\x06\x02\x06\x08\x07\x05\x01\x00//\ +\x11\x12\x0199\x113\x11310\x13\x01\x17\x01\x01\ +\x07\x01R\x01Vw\xfe\xdf\x01!w\xfe\xaa\x02'\x01\ +\x97E\xfe\xa2\xfe\xa1G\x01\x97\x00\x01\x00P\x00u\x02\ +\x1d\x03\xbe\x00\x06\x00\x1a@\x0a\x03\x00\x04\x02\x00\x02\x08\ +\x07\x05\x01\x00//\x11\x12\x0199\x113\x1131\ +0\x01\x01'\x01\x017\x01\x02\x1d\xfe\xa8u\x01\x1f\xfe\ +\xe1u\x01X\x02\x0c\xfeiG\x01_\x01^E\xfei\ +\x00\xff\xff\x00\x98\xff\xe3\x03J\x05\xb6\x00&\x00\x04\x00\ +\x00\x00\x07\x00\x04\x01\xc1\x00\x00\x00\x01\xfey\x00\x00\x02\ +\x8f\x05\xb6\x00\x03\x00\x13\xb7\x00\x05\x02\x04\x03\x03\x02\x12\ +\x00??\x11\x013\x11310\x01\x01#\x01\x02\x8f\ +\xfcy\x8f\x03\x87\x05\xb6\xfaJ\x05\xb6\x00\x01\x00m\x03\ +!\x02\xc3\x05\xc7\x00\x12\x00&@\x11\x00\x12\x0c\x08\x08\ +\x09\x12\x09\x14\x13\x04\x0f\x1f\x00\x09\x0a\x1f\x00?\xcd2\ +?3\x11\x12\x0199\x113\x113\x11310\x01\ +\x114&#\x22\x06\x15\x11#\x113\x17363 \ +\x15\x11\x02LNPr[t`\x0e\x0aK\x91\x01\x02\ +\x03!\x01\xa4TGiz\xfe\xa4\x02\x99Xe\xfa\xfe\ +T\x00\x01\x00b\x00\x00\x04#\x05\xb6\x00\x11\x00K@\ +(\x0e\x00\x04\x04\x09\x05\x0b\x10\x02\x05\x07\x05\x12\x13\x03\ +\x07\x08\x07NY\x00\x08\x0e\x11LY\x08\x0e\x08\x0e\x05\ +\x0a\x0a\x0dLY\x0a\x06\x05\x18\x00??+\x11\x12\x00\ +99\x18//+\x11\x003+\x11\x003\x11\x12\x01\ +\x179\x1133\x113310\x01!\x15!\x11#\ +\x11#53\x11!\x15!\x11!\x15!\x01\xb8\x014\ +\xfe\xcc\xa6\xb0\xb0\x03\x11\xfd\x95\x02D\xfd\xbc\x01\x8b\x81\ +\xfe\xf6\x01\x0a\x81\x04+\x97\xfd\xe9\x97\x00\x01\x00D\x00\ +\x00\x04H\x05\xc9\x00%\x00p@@\x0d\x09\x11\x11\x22\ +\x1e\x1a\x0b\x0f\x15\x02\x0f\x1a\x1c \x17\x07&'\x10\x1c\ +\x1d\x1cNY\x0d\x1d\x0c ! NY\x09!\x0f!\ +\x1f!?!O!\x04\x09\x03\x1d!\x1d!\x17\x00\x17\ +\x14LY\x17\x18\x00\x05KY\x00\x07\x00?+\x00\x18\ +?+\x11\x12\x0099\x18//_^]\x113+\ +\x11\x003\x113+\x11\x003\x11\x12\x01\x179\x113\ +\x11333\x113310\x012\x17\x07&#\x22\ +\x06\x15\x15!\x15!\x15!\x15!\x15\x14\x06\x07!\x15\ +!5655#535#53546\x02\ +\xb0\xc9\x9e<\x98\x93z~\x01\xa4\xfe\x5c\x01\xa4\xfe\x5c\ +AJ\x03\x1b\xfb\xfc\xce\xc8\xc8\xc8\xc8\xe0\x05\xc9P\x83\ +G\x87\x81\xba\x81\xa6\x81!d\x88,\x9a\x8d0\xf3#\ +\x81\xa6\x81\xcf\xb2\xcd\x00\x00\x03\x00\x9a\xff\xec\x05\xd1\x05\ +\xb6\x00\x16\x00!\x00*\x00`@7\x22\x1c\x1c\x1d&\ +\x17\x10\x14\x14\x0d\x09\x02\x12\x09\x17\x0b\x1d\x06+,\x1b\ +\x22KY\x10\x13NY\x03\x1b\x0b\x10\x0e\x0e\x10\x0b\x1b\ +\x03\x05\x1d\x1e\x1e*KY\x1e\x06\x1d\x18\x06\x00MY\ +\x06\x19\x00?+\x00\x18??+\x11\x12\x00\x179\x18\ +/////++\x11\x12\x01\x179\x1133\x11\ +3\x113\x113\x11310%267\x15\x06#\ +\x22&5\x11#5773\x153\x15#\x11\x14\x16\ +\x01\x14\x04!#\x11#\x11! \x16\x013265\ +4&##\x05N\x22V\x0b\ +b\xdd\xdd4\xfe\x91\xfe\xeb\xfe\xf6@\xa5\x01\x06\x01\x00\ +\xfe\xfd\xa14\xc8\xb9\xac\xb7Ru\x0e\x04}\x1e\x88\x8a\ +\x01\xcfPE\xbf\xd3\x81\xfeGMR\x03\x97\xe3\xea\xfd\ +\xc1\x05\xb6\xd3\xfd\xee\x91\xa2\x91\x8e\x00\x00\x01\x00?\xff\ +\xec\x04\x89\x05\xcb\x00&\x00q@?\x1d\x17\x1f\x16\x16\ +\x1a\x0b\x02\x07\x07\x1a$\x11\x04\x0a\x1a\x17\x06'(\x0b\ +\x17\x18\x17NY\x08\x18\x05\x1d\x1e\x1dNY\x02\x1e\x0f\ +\x1e\x1f\x1e/\x1e\x03\x09\x03\x18\x1e\x18\x1e\x13\x22\x22\x00\ +LY\x22\x07\x13\x0eLY\x13\x19\x00?+\x00\x18?\ ++\x11\x12\x0099\x18//_^]\x113+\x11\ +\x003\x113+\x11\x003\x11\x12\x01\x179\x113\x11\ +33\x113\x113\x11310\x01 \x03!\x15!\ +\x07\x15\x17!\x15!\x16\x16327\x15\x06#\x22\x00\ +\x03#53'57#53\x12\x0032\x17\x07\ +&\x03\x1b\xfe\xc1O\x01\xfe\xfd\xf4\x02\x02\x01\xcf\xfeA\ +%\xcb\xaa\x9c\x99\x92\xab\xed\xfe\xdf.\xa6\x98\x02\x02\x98\ +\xa4'\x01$\xed\xc9\xa5G\xa6\x055\xfem\x819@\ +-\x81\xb4\xc5B\x96A\x01\x0d\x01\x01\x81*,P\x81\ +\x01\x05\x01$a\x8bV\x00\x04\x00\x8d\xff\xf8\x06\x0a\x05\ +\xc1\x00\x03\x00\x0f\x00\x17\x00+\x00E@$%\x1b \ +*\x10\x0a\x14\x04\x04\x00\x0a*\x02\x1b\x06,-#\x1e\ +\x06\x12\x07\x18\x16\x0d'\x18\x0d\x18\x0d\x18\x02\x03\x06\x02\ +\x18\x00??\x1299//\x113\x113?3?\ +3\x11\x12\x01\x179\x113\x113\x113\x11310\ +\x01\x01#\x01\x01\x14\x06#\x22&54632\x16\ +\x05\x143254#\x22%\x22&54632\ +\x17\x07&#\x22\x15\x14327\x15\x06\x05\x1f\xfc\xd5\ +\x94\x03+\x01\x7f\xa9\x94\x8b\xaa\xa7\x94\x8d\xaa\xfe\x15\xb2\ +\xb0\xb0\xb2\xfd\xca\xa6\xb6\xbc\xabhX!QP\xe0\xdc\ +bZN\x05\xb6\xfaJ\x05\xb6\xfb\x98\x9f\xb7\xb9\x9d\x9e\ +\xb8\xba\x9c\xee\xee\xeb\xdb\xb1\xa1\xa8\xb3#g\x1f\xee\xeb\ +!e%\x00\x02\x00w\xff\xec\x03\x9c\x05\xcb\x00\x1c\x00\ +$\x00=@\x1f#\x1a\x1a\x0f\x09\x1d\x16\x03\x16\x09\x0c\ +\x04%&#\x0f\x0d\x19\x0a\x05\x0c\x13\x02\x0c\x02\x0c\x06\ +\x1f\x13\x00\x06\x00/3/3\x1299//\x11\x12\ +\x179\x11\x12\x01\x179\x113\x1133\x11310\ +%273\x06\x06#\x22&55\x06\x07567\ +\x114632\x16\x15\x14\x02\x07\x11\x14\x16\x134#\ +\x22\x06\x15\x11$\x02}\xae\x12_\x08\x99\x8e\x96\xa0`\ +`Nr\x96\x87u\x87\xce\xafR\xae\x7fC>\x01\x00\ +o\xd5\xa6\xb2\xb5\xa9\xf3#\x16q\x15&\x01\xf2\x8a\x9f\ +\xa1\x8a\xb9\xfe\xd0J\xfe\xe5h{\x04+\xc2Vl\xfe\ +K\x89\x00\x00\x04\x00\xc9\x00\x00\x07\xc3\x05\xb6\x00\x0f\x00\ +\x1b\x00'\x00+\x00_@1\x09\x06\x06\x07\x01\x0d\x0d\ +\x00\x1c\x16\x22\x10\x10+(\x16\x00\x07\x06,-\x1f\x13\ +%\x19\x0b(\x13\x03\x19\x08\x13\x19\x13\x19(\x08()\ +JY(\x12\x0e\x08\x03\x01\x07\x12\x00?3?3?\ ++\x11\x12\x0099\x18//\x11\x129\x11\x129\x11\ +3\x113\x11\x12\x01\x179\x113\x113\x113\x113\ +\x113\x11310!#\x01#\x12\x15\x11#\x113\ +\x013&5\x113\x01\x14\x06#\x22&5463\ +2\x16\x05\x14\x1632654&#\x22\x06\x035\ +!\x15\x04\xc7\xbb\xfdL\x08\x10\x97\xc2\x02\xaa\x08\x0e\x98\ +\x02\xfc\xa1\x93\x8b\xa2\xa1\x93\x8b\xa2\xfe\x22Q][O\ +O[\x5cRV\x02\x00\x04\xcb\xfe\xe0l\xfc\xc1\x05\xb6\ +\xfb:\xf5\x8a\x03G\xfc\xb7\xa3\xb8\xbb\xa0\xa3\xb5\xbb\x9d\ +rvusspp\xfd \x87\x87\x00\x02\x00%\x02\ +\xe5\x05\x85\x05\xb6\x00\x07\x00\x18\x00O@'\x00\x01\x0f\ +\x0c\x0c\x0d\x11\x14\x14\x13\x13\x0d\x06\x01\x03\x05\x19\x1a\x17\ +\x16\x09\x0a\x0a\x11\x0e\x0e\x04\x07\x03\x03\x04\x10\x08\x08\x14\ +\x0d\x01\x04\x03\x00?\xc4229/3\x113\x113\ +\x113\x1133\x11333\x11\x12\x01\x179\x113\ +\x113\x113\x113\x11310\x01#\x11#5!\ +\x15#\x01\x03#\x17\x11#\x113\x13\x133\x11#\x11\ +7#\x03\x01q{\xd1\x02\x1f\xd3\x02X\xc9\x08\x06w\ +\xbb\xc4\xcb\xb4\x7f\x06\x08\xd3\x02\xe5\x02gjj\xfd\x99\ +\x02/\x81\xfeR\x02\xd1\xfd\xd1\x02/\xfd/\x01\xa4\x89\ +\xfd\xd3\x00\xff\xff\x00P\x00\x00\x05\xf4\x05\xcd\x02\x06\x01\ +v\x00\x00\x00\x02\x00f\xff\xdd\x04\x8b\x04H\x00\x17\x00\ +\x1f\x004@\x1a\x1f\x0e\x0e\x04\x18\x0c\x0c\x15\x04\x03 \ +!\x0d\x14/\x1f?\x1f\x02\x1f\x1f\x11\x1c\x08\x11\x00\x00\ +/2/3\x129/]93\x11\x12\x01\x179\x11\ +3\x113\x11310\x05\x22&\x0254663\ +2\x16\x12\x15!\x11\x16\x163267\x17\x06\x06\x13\ +\x11&&#\x22\x07\x11\x02y\x9d\xf1\x85\x8a\xf4\x95\x98\ +\xf3\x87\xfc\xc51\xa6R\x83\xb7QHb\xd9\x932\xa3\ +X\xadz#\x93\x01\x05\x9d\xab\xff\x8c\x8e\xfe\xfd\xa5\xfe\ +\x9c5Fi\x81)\x9b|\x02\x8b\x01\x155Bu\xfe\ +\xe9\xff\xff\x00G\xff\xec\x05\xf3\x05\xb6\x00'\x02\x17\x02\ +\x5c\x00\x00\x00&\x00{\xfb\x00\x01\x07\x02@\x03`\xfd\ +\xb3\x00\x0b\xb4\x04\x03\x02\x19\x19\x00?555\x00\xff\ +\xff\x00 \xff\xec\x06\x08\x05\xc9\x00'\x02\x17\x02\xa2\x00\ +\x00\x00'\x02@\x03u\xfd\xb3\x01\x06\x00u\xff\x00\x00\ +\x0b\xb4\x01\x03\x02\x0e\x19\x00?555\x00\xff\xff\x00\ +G\xff\xec\x06\x04\x05\xb6\x00'\x02\x17\x02\x9c\x00\x00\x00\ +&\x02=\x0c\x00\x01\x07\x02@\x03q\xfd\xb3\x00\x0b\xb4\ +\x04\x03\x02,\x19\x00?555\x00\xff\xff\x00j\xff\ +\xec\x06\x00\x05\xb6\x00'\x02\x17\x02F\x00\x00\x00'\x02\ +@\x03m\xfd\xb3\x01\x06\x02?1\x00\x00\x0b\xb4\x01\x03\ +\x02\x0e\x19\x00?555\x00\x00\x02\x00f\xff\xec\x04\ +5\x05\xc7\x00\x1a\x00(\x00A@\x22&\x07\x1f\x0f\x0f\ +\x00\x00\x14\x07\x03)*\x0b\x22GY\x0e\x04\x0b\x0b\x18\ +\x04\x18\x11FY\x18\x03\x04\x1bFY\x04\x16\x00?+\ +\x00\x18?+\x11\x12\x009\x18/\x129+\x11\x12\x01\ +\x179\x113\x113\x11310\x01\x10\x02\x04#\x22\ +&54\x12632\x16\x177\x10!\x22\x06\x075\ +6632\x12\x0126\x127&&#\x22\x06\x06\ +\x15\x14\x16\x045\xa7\xfe\xec\xad\xac\xbb\x88\xe8\x97a\x92\ ++\x04\xfe\xe6>\x900/\x9bJ\xd2\xd8\xfd\xa2_\xa6\ +x\x16\x19\x80Pe\xa5ee\x03\xa6\xfe\xfa\xfe5\xe9\ +\xc9\xc0\xa9\x013\xa1]KZ\x01\x95,!\x9f\x17%\ +\xfe\xec\xfb\xc6\x90\x01\x03\x96al\x84\xfa\x80v\x82\x00\ +\x02\x00'\x00\x00\x04m\x05\xb6\x00\x05\x00\x0c\x00(@\ +\x13\x09\x05\x0a\x04\x05\x04\x0e\x0d\x06\x05\x01\x05\x09IY\ +\x05\x12\x01\x03\x00??+\x11\x12\x009\x11\x12\x019\ +9\x113\x113107\x013\x01\x15!\x01\x06\x07\ +\x01!\x01&'\x01\xcf\xa6\x01\xd1\xfb\xba\x02!=(\ +\xfe\xfc\x02\xd1\xfe\xfeDh\x05N\xfa\xb0f\x04\xf4\xe1\ +y\xfc\xfe\x02\xf9\xca\x00\x00\x01\x00\xc9\xfe\x10\x05!\x05\ +\xb6\x00\x07\x00#@\x11\x00\x07\x03\x04\x07\x04\x09\x08\x05\ +\x02IY\x05\x03\x00\x04\x1b\x00?3?+\x11\x12\x01\ +99\x113\x11310\x01\x11!\x11#\x11!\x11\ +\x04w\xfc\xfc\xaa\x04X\xfe\x10\x07\x0d\xf8\xf3\x07\xa6\xf8\ +Z\x00\x01\x00L\xfe\x10\x04\xdd\x05\xb6\x00\x0b\x001@\ +\x1a\x07\x09\x09\x03\x00\x08\x02\x0a\x06\x02\x00\x04\x0c\x0d\x04\ +\x07IY\x04\x03\x00\x09IY\x00\x1b\x00?+\x00\x18\ +?+\x11\x12\x01\x179\x113\x1133\x11310\ +\x135\x01\x015!\x15!\x01\x01!\x15L\x02w\xfd\ +\x99\x04@\xfc\xb0\x02C\xfd\xa4\x03\xaa\xfe\x10k\x03\x9c\ +\x033l\x97\xfc\xfc\xfc\x8d\x98\x00\x01\x00h\x02\x8d\x04\ +)\x03\x17\x00\x03\x00\x15@\x09\x02\x00\x05\x04\x01\x00P\ +Y\x01\x00/+\x11\x12\x019910\x135!\x15\ +h\x03\xc1\x02\x8d\x8a\x8a\x00\x01\x00%\xff\xf2\x04\xbc\x06\ +\x98\x00\x08\x00\x1c@\x0b\x08\x0a\x03\x09\x03\x06\x04\x04\x01\ +\x08\x01\x00//\x129/93\x11\x013\x1131\ +0\x05#\x01#5!\x13\x013\x02o\x7f\xfe\xe9\xb4\ +\x01!\xeb\x02\x02\x89\x0e\x03\x0e\x87\xfdT\x05\xbd\x00\x00\ +\x03\x00w\x01\x93\x05-\x04\x0c\x00\x15\x00!\x00-\x00\ +3@\x18\x1f\x0c+\x00\x00%\x19\x0c\x04./\x22\x1c\ +\x1c\x11\x06\x09\x13\x0f(\x16\x16\x03\x09\x00/33\x11\ +3/3\x12993\x113\x11\x12\x01\x179\x113\ +\x11310\x01\x14\x06#\x22&'\x06\x06#\x22&\ +54632\x17632\x16\x01267&&\ +#\x22\x06\x15\x14\x16\x01\x22\x06\x07\x16\x163265\ +4&\x05-\xa7\x80]\x99A<\x99X\x83\xa8\xa8\x83\ +\xb5z|\xb9\x85\xa2\xfc}Bm62mHLd\ +a\x02\xa1Bm73nGLde\x02\xcf\x83\xb9\ +jthq\xad\x8e\x86\xb3\xdb\xd7\xaf\xfe\xbb[da\ +]iWSj\x01y\x5cba^kTUi\x00\ +\x01\x00\x0c\xfe\x14\x02\xf8\x06\x14\x00\x14\x00\x1c@\x0c\x08\ +\x12\x02\x12\x0d\x03\x15\x16\x10\x0b\x05\x00\x00/2/3\ +\x11\x12\x01\x179\x11310\x012\x17\x15&#\x22\ +\x15\x11\x14\x06#\x22'5\x16325\x11\x10\x02}\ +O,1>\xb0\xa5\xa3J;=:\xb6\x06\x14\x10\x89\ +\x16\xf3\xfa\xe1\xb0\xbb\x13\x87\x16\xf3\x05\x1f\x01j\x00\x00\ +\x02\x00b\x01\x87\x04-\x04\x1f\x00\x17\x00/\x00p@\ +@(\x0f\x1b\x03\x0f\x0310'\x1e\x1e\x18PY\x0f\ +\x1e\x1f\x1e/\x1e\x03\x09\x03\x1e*@*$PY\x1b\ +*@\x0f\x06\x06\x00PY\x0f\x06\x1f\x06/\x06\x03\x09\ +\x03\x06\x12@\x12\x0cPY\x03\x00\x12\x10\x12 \x12\x03\ +\x12\x00/]\xc4+\x00\x1a\x18\x10\xcd_^]+\x00\ +\x10\x18\xc4\x1a\xde\xc4+\x00\x1a\x18\x10\xcd_^]+\ +\x00\x10\x18\xc4\x11\x12\x0199\x113\x11310\x01\ +\x22\x06\x075632\x16\x17\x16\x163267\x15\ +\x06#\x22&'&&\x03\x22\x06\x075632\x16\ +\x17\x16\x163267\x15\x06#\x22&'&&\x01\ +P6\x7f9l\x94CpXM[-5\x806e\ +\x99CoXI[19\x805j\x96EtRE\ +_17\x813d\x9aEvOTU\x02\x00@9\ +\x96n\x1c%!\x19B9\x97m\x1d%\x1e\x19\x01\x96\ +D5\x95m \x22\x1d\x1aB7\x96n !\x22\x18\ +\x00\x00\x01\x00h\x00\xa6\x04)\x05\x02\x00\x13\x00F@\ +&\x05\x01\x10\x0b\x0b\x09\x0a\x0e\x04\x00\x13\x01\x08\x14\x15\ +\x0d\x05\x06\x05PY\x0a\x08\x0f\x06\x01\x09\x03\x06\x0e\x02\ +\x01\x02PY\x12\x11\x01\x00/3\xc4+\x11\x003\x18\ +/_^]\xc63+\x11\x003\x11\x12\x01\x179\x11\ +3\x11310\x01!5!\x13!5!\x13\x17\x07\ +!\x15!\x03!\x15!\x03'\x01}\xfe\xeb\x01T\x7f\ +\xfe-\x02\x13\x87}m\x01\x17\xfe\xaa\x81\x01\xd7\xfd\xe9\ +\x83}\x01\xc1\x89\x01\x10\x89\x01\x1f9\xe6\x89\xfe\xf0\x89\ +\xfe\xe57\xff\xff\x00h\x00\x01\x04)\x04\xd9\x02&\x00\ +\x1f\x00\x00\x01\x07\x02+\x00\x00\xfdt\x00\x09\xb3\x01\x00\ +\x07\x12\x00?55\x00\xff\xff\x00h\x00\x01\x04)\x04\ +\xd9\x02&\x00!\x00\x00\x01\x07\x02+\x00\x00\xfdt\x00\ +\x09\xb3\x01\x00\x07\x12\x00?55\x00\x00\x02\x00o\x00\ +\x00\x04=\x05\xc3\x00\x05\x00\x09\x00 @\x0d\x08\x00\x06\ +\x03\x00\x03\x0a\x0b\x09\x07\x02\x05\x02\x00//\x1299\ +\x11\x12\x0199\x113\x11310\x13\x013\x01\x01\ +#\x09\x03o\x01\xc2H\x01\xc4\xfe\x04h\x8f{\x8c\ +\x9b\x1f\x17\x83\x22&SYNX\x11\x08)\x01\xa0h\ +\xe6\x0c\x00\x00\x02\x00)\x029\x02\xa2\x05\xc7\x00\x17\x00\ +#\x006@\x1c\x1b\x12!\x0b\x00\x00\x06\x12\x03%$\ +\x1e\x0b\x15\x00\x0f\x10\x0f\x02\x0f\x0f\x03\x18\x15!\x08\x03\ +\x1f\x00?3?3\x129/]\x1293\x11\x12\x01\ +\x179\x1133\x11310\x13\x10632\x17\x15\ +&#\x22\x06\x0736632\x16\x15\x14\x06#\x22\ +&\x052654&#\x22\x06\x15\x14\x16)\xdb\xdb\ +J14S\x8d\x96\x0a\x08\x1dqU}\x94\xa6\x8d\x99\ +\xad\x01DQcXVUpj\x03\xc3\x01\x05\xff\x0f\ +r\x12\x99\xa6+;\x94~\x90\xa4\xd2c]cO[\ +Z;Y|\x00\x00\x01\x009\x02J\x02\x8f\x05\xb6\x00\ +\x06\x00\x1c@\x0d\x01\x05\x05\x00\x02\x03\x07\x08\x02\x03\x1e\ +\x00 \x00??3\x11\x12\x01\x179\x11310\x13\ +\x01!5!\x15\x01\xa2\x01^\xfe9\x02V\xfe\xa0\x02\ +J\x02\xf8t^\xfc\xf2\x00\x03\x003\x029\x02\x93\x05\ +\xc7\x00\x15\x00\x22\x00-\x00?@\x22\x16\x0d&\x13+\ +\x03\x1c\x07\x07\x03\x05\x10\x13\x0d\x06./\x05\x10 \ +\x0b)\x1b)\x02))\x19\x0a!#\x00\x1f\x00?2\ +?39/]3\x1299\x11\x12\x01\x179\x113\ +\x113\x113\x11310\x012\x16\x15\x14\x07\x16\x15\ +\x14\x06#\x22&5467&&546\x03\x14\ +\x1632654&''\x06\x06\x13\x22\x06\x15\x14\ +\x16\x17654&\x01d|\x97\x94\xb0\xa5\x8a\x92\x9f\ +IUJ9\x9d5TVZT]Q\x1cHF\xac\ +DKDQ\x8cN\x05\xc7vh\x82LJ\x9eq\x89\ +\x80tEt..]Df~\xfdfar\x00\x00\x16\x00T\xfe\x81\x07\ +\xc1\x05\xee\x00\x05\x00\x0b\x00\x11\x00\x17\x00\x1b\x00\x1f\x00\ +#\x00'\x00+\x00/\x003\x007\x00;\x00?\x00\ +C\x00G\x00S\x00[\x00k\x00t\x00|\x00\x89\x00\ +\xf8@\x87A@=<10\x0f\x05\x00\x0cTNX\ +Hvkp`zg\x85\x86ED)(%$\x14\ +\x0a\x09\x17\x17\x86\x06\x12;\x1b\x7fg`8\x187/\ +k4,H#\x1f \x1c\x03\x11N\x0c\x19\x8a\x8b\x0a\ +\x00*BZQ\x86\x5ct\x5c)AF>duu\ +lE=\x82}VKkvk&2%1\x15\x0d\ +\x00B\x01A>\x5c=l\x0d12\x03k\x0c\x5cl\ +kkl\x5c\x03\x01-,\x1d\x1c\x19\x18\x13\x12\x0f\x0c\ +9854! \x07\x06\x04\x01\x00/3333\ +33333/333333333\x12\ +\x179///\x11\x12\x179\x119\x1299\x119\ +9\x113\x113\x113\x113\x10\xc42\xc42\x113\ +\x113\x129\x113\x113\x113\x10\xc4\xc42\x113\ +\x113\x11\x12\x01\x179\x1133333333\ +3\x113\x113\x113\x113\x113\x113\x1133\ +333333310\x13\x11!\x15#\x15%\ +5!\x11#5\x01\x113\x153\x15!5353\ +\x11!5!\x15!5!\x15\x015!\x15\x01#\x11\ +3\x11#\x113\x015!\x15\x01#\x113\x015!\ +\x1535!\x15\x01#\x1135#\x113\x01#\x11\ +3\x05\x14\x06#\x22&54632\x16\x05\x143\ +254#\x22%32\x16\x15\x14\x06\x07\x15\x16\x16\ +\x15\x14\x06##\x1332654&##\x15\x15\ +32654#\x01\x22'5\x16325\x113\ +\x11\x14\x06T\x01/\xc0\x05\xce\x010m\xf9\x00o\xc0\ +\x05\x0e\xc3m\xfdI\x01\x11\xfb\xe1\x01\x0e\xfe\xf2\x01\x0e\ +\x04\xb7mmmm\xfb\xc2\x01\x10\xfc0oo\x02\xc0\ +\x01\x10w\x01\x11\xfa\xa8oooo\x06\xfemm\xfb\ +\x9f\x87\x7f\x7f\x87\x87\x7f~\x88\xfes\x87\x87\x87\x87\x01\ +\xe1\xacmp.,=.m^\xcf{B.$*\ +/;J1%Z\x01^4\x1c+\x19V}i\x04\ +\xbe\x010o\xc1\xc1o\xfe\xd0\xc1\xf9\x02\x01/\xc2m\ +m\xc2\xfe\xd1mmmm\x06\xfeoo\xfa\xa8\x01\x0e\ +\x02\x02\x01\x0f\xfa;mm\x01\xa6\x01\x0e\x04Joo\ +oo\xfc/\x01\x10y\x01\x0f\xfdh\x01\x10I\x91\x9c\ +\x9c\x91\x92\x9b\x9a\x93\xc5\xc5\xc4aCS1B\x08\x08\ +\x0eD5QY\x01b\x22 \x22\x1d\xe3\x9a+%J\ +\xfe\xfa\x0af\x08V\x01\x92\xfer_c\x00\x00\x03\x00\ +T\xfe\xc1\x07\xaa\x06\x14\x00\x03\x00\x1e\x00*\x00.@\ +\x19\x01\x0b\x17%\x04\x1e\x1f\x11\x03\x09+,(\x1e\x14\ +\x0e\x22\x1e\x0e\x0e\x1e\x22\x03\x02\x00\x00//\x179/\ +//\x113\x113\x11\x12\x01\x17910\x09\x03\x05\ +54676654&#\x22\x06\x07\x1763\ +2\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\x16326\ +54&#\x22\x06\x03\xfe\x03\xac\xfcT\xfcV\x03\xeb\ +,AgI\xbb\xa5O\xbaGR\xa0Z?>1H\ +T;\x1bGFBIHCHE\x06\x14\xfcV\xfc\ +W\x03\xa9\xfb/2A1R~X\x87\x9a8*\xb2\ +P:/5K6DpJ;\xfe\xed?HI>\ +@IH\xff\xff\xff\x91\xfe\x14\x02W\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01L\xfe\xa9\x00\x00\x00\x08\xb3\x01\x18\ +\x11&\x00+5\xff\xff\x00\x19\x03\xc1\x01D\x05\xb6\x02\ +\x06\x02\x07\x00\x00\x00\x02\x00\x0a\xff\xec\x04\xdf\x06+\x00\ +-\x006\x00f@9\x1b\x07\x17\x0b4%.\x1f\x1f\ ++\x02-\x02%\x0b\x07\x12\x0678\x14\x0eGY\x00\ +!.!GY+.\x0f.\x1f.\x02\x09\x03\x14.\ +\x14.\x05((1FY(\x01\x05\x1dFY\x05\x16\ +\x00?+\x00\x18?+\x11\x12\x0099\x18//_\ +^]\x113+\x11\x003+\x11\x12\x01\x179\x113\ +3\x113\x113\x113\x11310\x01\x16\x15\x10\x00\ +! \x1147654&#\x22\x06\x07'63\ +2\x16\x15\x14\x07\x06\x15\x143 \x114'&$&\ +54632\x00\x133\x15%&\x02#\x22\x06\x15\ +\x14\x04\x04V\x04\xfe\xe0\xfe\xfd\xfew\x10\x0f$ \x19\ +6\x0f!S_X]\x0f\x10\xe9\x01w\x04\xdf\xfe\xc9\ +\xa0\xb6\xa8\xd0\x01\x00*\x8f\xfe\xc7\x1c\xb7{]a\x01\ +\x13\x03N.A\xfe\x9f\xfen\x01X9{z\x17/\ +#\x0f\x09v']]#\x83\x84:\xcf\x02p?,\ +\x02i\xbc\x83\x90\xa3\xfe\xcd\xfe\xd7\x81\x81\xd3\x01\x00_\ +K\x8d\x9a\x00\x01\x00\x00\x00\x00\x04{\x05\xc3\x00\x15\x00\ +(@\x14\x11\x12\x07\x12\x14\x03\x16\x17\x00\x12\x14\x03\x12\ +\x12\x05\x0aJY\x05\x04\x00?+\x00\x18??\x129\ +\x11\x12\x01\x179\x11310\x01\x12\x126632\ +\x17\x15&#\x22\x0e\x03\x07\x11#\x11\x013\x029z\ +\x8dM\x5c:0(\x1a\x1f(;V|e\x1f\xac\xfe\ +#\xba\x02\xcd\x01#\x017l0\x0f\x87\x068\xa1\xfc\ +\xecU\xfd\xe3\x02/\x03\x87\x00\x00\x02\x00\x12\xff\xec\x06\ +w\x04H\x00\x14\x00)\x00L@'\x18\x03\x12!!\ +\x1e'\x0d\x0a\x0d\x1e\x03\x06\x05*+\x13\x1f\x1f\x00\x08\ +\x15\x0b\x06\x08\x06FY\x08\x0f$\x1b\x00\x1bFY\x10\ +\x00\x16\x00?2+\x11\x003\x18?+\x11\x0033\ +\x11\x129\x18/9\x11\x12\x01\x179\x113\x113\x12\ +9\x11310\x05\x22&54\x13!57!\x15\ +#\x16\x15\x14\x06#\x22'#\x06\x01\x06\x02\x15\x14\x16\ +326553\x15\x14\x1632654'\x02\ +)\xba\xc7\x87\xfe\xe3\x8e\x05\xd7\xfau\xc8\xb9\xddD\x08\ +D\xfe\xcf?Blu]l\xa2k]umo\x14\ +\xe7\xf0\xf0\x01\x07JD\x8e\xfc\xfb\xf0\xe7\xb6\xb6\x03\xce\ +\x84\xfe\xfeg\xae\xa8\x8f}\xbc\xbcz\x92\xa9\xad\xfe\xef\ +\x00\xff\xff\x00\xc9\x00\x00\x06q\x07u\x02&\x000\x00\ +\x00\x01\x07\x00v\x01\x9c\x01T\x00\x08\xb3\x01\x1d\x05&\ +\x00+5\xff\xff\x00\xb0\x00\x00\x06\xcb\x06!\x02&\x00\ +P\x00\x00\x01\x07\x00v\x01\xcd\x00\x00\x00\x08\xb3\x01-\ +\x11&\x00+5\xff\xff\x00\x00\xfd\xd5\x05\x10\x05\xbc\x02\ +&\x00$\x00\x00\x00\x07\x02[\x015\x00\x00\xff\xff\x00\ +^\xfd\xd5\x03\xcd\x04Z\x02&\x00D\x00\x00\x00\x07\x02\ +[\x00\xc7\x00\x00\xff\xff\xfe\xdf\xff\xec\x05\xd2\x05\xcd\x00\ +&\x002\x14\x00\x01\x07\x02\x5c\xfeG\x00\x00\x00\x09\xb3\ +\x03\x02\x1a\x03\x00?55\x00\x00\x02\x00u\xfd\xd5\x02\ +5\xff\x83\x00\x0b\x00\x17\x00\x1e@\x0c\x12\x06\x0c\x00\x06\ +\x00\x18\x19\x15\x03\x0f\x09\x00/3\xcc2\x11\x12\x019\ +9\x113\x11310\x01\x14\x06#\x22&546\ +32\x16\x074&#\x22\x06\x15\x14\x16326\x02\ +5}fexxee~nB33B<9\ +5@\xfe\xaeaxubbuva9<<9\ +8==\x00\x02\x00\x98\x04h\x02\xcf\x05\xc5\x00\x08\x00\ +\x17\x00\x1e@\x0e\x0e\x09\x03\x08\x0c\x13\x09\x05\x18\x19\x02\ +\x0b\x08\x15\x00/\xc4\xdc\xc6\x11\x12\x01\x179\x1131\ +0\x01673\x15\x06\x06\x07#%47\x15\x06\x15\ +\x14\x1e\x02\x15\x14#\x22&\x01\xb0F\x1c\xbd)w1\ +N\xfe\xe8\xedy\x1f%\x1f]7C\x04\x87\xb5z\x14\ +N\xac9v\xa3=H)5\x14\x13\x10\x1a\x1cJD\ +\x00\xff\xff\x00\x1d\x00\x00\x06\xd3\x06\x1f\x00'\x00I\x02\ +\xb0\x00\x00\x00&\x00I\x00\x00\x00\x07\x00L\x05m\x00\ +\x00\xff\xff\x00\x1d\x00\x00\x06\xc3\x06\x1f\x00'\x00I\x02\ +\xb0\x00\x00\x00&\x00I\x00\x00\x00\x07\x00O\x05m\x00\ +\x00\x00\x02\x00}\xff\xec\x06d\x06\x14\x00\x15\x00!\x00\ +<@\x1f\x16\x06\x0f\x11\x11\x1c\x00\x00\x14\x0b\x06\x04\x22\ +#\x14\x0b\x03\x09\x09\x1fIY\x0f\x09\x04\x03\x19IY\ +\x03\x13\x00?+\x00\x18?\xc6+\x11\x12\x0099\x11\ +\x12\x01\x179\x1133\x113\x11310\x01\x10\x00\ +! \x00\x11\x10\x00! \x17>\x0253\x17\x06\x06\ +\x07\x16\x01\x10\x1232\x12\x11\x10\x02#\x22\x02\x05\xbc\ +\xfe\x9d\xfe\xc6\xfe\xbd\xfe\xa1\x01a\x01C\x01E\xb32\ +:\x1b\xb6\x0e\x1d\x83h`\xfbu\xfa\xf4\xf3\xf6\xf5\xf2\ +\xf3\xfd\x02\xdd\xfe\x9e\xfeq\x01\x89\x01j\x01h\x01\x86\ +\xd7\x0cCfi\x16\x9b\xad'\xb0\xfe\xfe\xfe\xd6\xfe\xce\ +\x011\x01+\x01'\x011\xfe\xd1\x00\x00\x02\x00s\xff\ +\xec\x05\x19\x04\xf0\x00\x16\x00\x22\x00<@\x1f\x17\x07\x10\ +\x12\x12\x1d\x00\x00\x15\x0c\x07\x04#$\x15\x0c\x03\x0a\x0a\ + FY\x10\x0a\x10\x03\x1aFY\x03\x16\x00?+\x00\ +\x18?\xc6+\x11\x12\x0099\x11\x12\x01\x179\x113\ +3\x113\x11310\x01\x10\x00#\x22&\x025\x10\ +\x0032\x17>\x0253\x17\x06\x06\x07\x16\x05\x14\x16\ +32654&#\x22\x06\x04b\xfe\xf2\xee\x93\xe4\ +|\x01\x0c\xee\xd9\x893:\x1a\xb4\x0f\x1fyfG\xfc\ +\xbd\x9e\xad\xaf\x9d\x9f\xaf\xad\x9c\x02%\xfe\xf4\xfe\xd3\x8a\ +\x01\x02\xad\x01\x0c\x01+\x8d\x0fAcn\x17\x9c\xaf&\ +\x8a\xb9\xd3\xdb\xdb\xd3\xd2\xd8\xd8\x00\x01\x00\xba\xff\xec\x06\ +{\x06\x14\x00\x1b\x003@\x18\x05\x07\x07\x01\x0b\x14\x11\ +\x0b\x11\x1d\x1c\x0a\x01\x0e\x1b\x05\x12\x03\x0e\x17IY\x0e\ +\x13\x00?+\x00\x18?\xc63\x1299\x11\x12\x019\ +9\x113\x1133\x11310\x01\x15>\x0253\ +\x17\x06\x06\x07\x11\x10\x00! \x005\x113\x11\x14\x16\ +3265\x11\x05\x19:F\x1f\xb5\x0e!\xac\x95\xfe\ +\xe1\xfe\xf8\xfe\xf4\xfe\xd4\xaa\xcc\xc6\xb8\xc1\x05\xb6\xc6\x08\ +>pn\x16\xb6\xb8\x19\xfd\x8d\xfe\xfe\xfe\xea\x01\x1f\xfd\ +\x03\xae\xfcF\xb7\xc4\xc1\xbc\x03\xb8\x00\x00\x01\x00\xa4\xff\ +\xec\x05\x96\x04\xf2\x00\x1d\x00D@\x22\x01\x1c\x0d\x0f\x0f\ +\x13\x14\x07\x07\x0a\x13\x1c\x13\x1e\x1f\x15\x16\x0a\x12\x16\x03\ +\x14\x0d\x08\x1d\x0f\x19\x04FY\x19\x16\x14\x15\x00??\ ++\x00\x18?3\xc6\x12\x179\x113\x11\x12\x0199\ +\x1133\x113\x113\x113\x11310\x01\x11\x14\ +\x163265\x113\x156653\x17\x06\x06\x07\ +\x11#'#\x06\x06#\x22&5\x11\x01Lz\x82\xac\ +\x9f\xa6RJ\xb2\x0f \xb0\x8d\x89\x18\x094\xb5o\xcb\ +\xc8\x04F\xfd;\x86\x84\xbc\xd5\x02>y\x0b\x80\x9a\x17\ +\xba\xbf\x0e\xfc\xac\x93RU\xbe\xd1\x02\xcb\x00\xff\xff\xfc\ +S\x04\xd9\xfd\xdc\x06!\x00\x07\x00C\xfa\xca\x00\x00\xff\ +\xff\xfd\x0d\x04\xd9\xfe\x96\x06!\x00\x07\x00v\xfb\x84\x00\ +\x00\xff\xff\xfc\x19\x04\xd9\xff\x01\x05\xdd\x00\x07\x01R\xfb\ +\x11\x00\x00\x00\x01\xfd\x08\x04\xb8\xfes\x06\x8f\x00\x11\x00\ +\x1e@\x0c\x02\x05\x05\x0d\x0d\x08\x00\x00\x13\x0b\x10\x04\x00\ +/\xcc2\x11\x013\x1133\x129\x11310\x01\ +\x14\x07\x07#'6654&#\x22\x07563\ + \xfes\xa6\x0ai\x0cVNCI> &E\x01\ +\x00\x05\xd7\x8c\x22q\xb0\x0e2++)\x06d\x0a\x00\ +\x01\xfd;\xfe\xa0\xfe\x02\xff}\x00\x0b\x00\x11\xb5\x06\x00\ +\x00\x0d\x09\x03\x00/\xcd\x11\x013\x11310\x054\ +632\x16\x15\x14\x06#\x22&\xfd;;*(:\ +:(*;\xf29669777\x00\xff\xff\x00\ +\xc9\x00\x00\x03\xf8\x07s\x02&\x00(\x00\x00\x01\x07\x00\ +C\xff\xd8\x01R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\ +\xff\x00\xcb\x00\x00\x05R\x07s\x02&\x01\xb2\x00\x00\x01\ +\x07\x00C\x00h\x01R\x00\x08\xb3\x01\x11\x05&\x00+\ +5\xff\xff\x00s\xff\xec\x04\x12\x06!\x02&\x00H\x00\ +\x00\x01\x06\x00C\xb7\x00\x00\x08\xb3\x02\x1c\x11&\x00+\ +5\xff\xff\x00\xb0\x00\x00\x04b\x06!\x02&\x01\xd2\x00\ +\x00\x01\x06\x00C\xdc\x00\x00\x08\xb3\x01\x0f\x11&\x00+\ +5\x00\x01\x00\x85\xff\xec\x07\x91\x05\xc9\x001\x00E@\ +$\x22\x16*'/\x09\x09\x04'\x1b\x16\x0523\x00\ +\x1f\x19\x1fIY\x10((\x13\x06\x19\x04,%\x13%\ +IY\x0c\x13\x13\x00?3+\x11\x003\x18?3\x12\ +9/9+\x11\x003\x11\x12\x01\x179\x113\x113\ +\x11310\x01\x22\x06\x07'632\x00\x11\x10\x00\ +#\x22&'#\x06\x06# \x00\x11\x10\x1232\x17\ +\x07&&#\x22\x02\x11\x10\x12327\x113\x11\x16\ +32\x12\x11\x10\x02\x05\xa4<^-E~\x96\xe4\x01\ +\x01\xfe\xe5\xffl\xacS\x08P\xa9k\xff\x00\xfe\xe5\xff\ +\xe4\x99|F-]<\x93\xa5\xcf\xbb\x8bf\xaaf\x8e\ +\xbb\xce\xa5\x05/)\x1f\x92P\xfe\x88\xfe\xad\xfe\x8d\xfe\ +a-32.\x01\x9b\x01w\x01S\x01xP\x92\x1f\ +)\xfe\xd7\xfe\xf6\xfe\xd3\xfe\xb2L\x01\xc9\xfe7L\x01\ +K\x010\x01\x0b\x01(\x00\x01\x00\x00\x00\x00\x06\x1d\x04\ +H\x00\x1d\x00(@\x16\x17\x00\x0d\x0e\x05\x05\x1e\x1f\x1b\ +\x15\x0d\x00\x12\x0a\x04\x04\x16\x0e\x05\x0f\x04\x15\x00??\ +33\x12\x179?\x11\x12\x01\x17910\x01\x06\x06\ +\x03#\x013\x13\x16\x17366\x13\x033\x00\x16\x17\ +36\x12\x113\x10\x02\x07#\x03&\x03'\x0a\x14\xb3\ +\xd5\xfe\x7f\xac\xf6 .\x08\x13J\x8e\xac\xb2\x01\x09-\ +\x0a\x08\xad\x99\xa6\xc3\xdb\xb6}!\x01\xc9\x1a3\xfe\x84\ +\x04H\xfdI]\xbd5\xa3\x01$\x01\xd5\xfc\xff\x90,\ +\xb8\x01\xb3\x01R\xfe\x96\xfe\x07\xe5\x01Z\x5c\x00\x02\x00\ +\x17\x00\x00\x04\xfc\x06\x14\x00\x11\x00\x1a\x00L@(\x08\ +\x04\x12\x12\x01\x0f\x16\x0b\x0b\x06\x0f\x00\x04\x1b\x1c\x07\x11\ +\x00\x11IY\x04\x00\x08\x1aIY\x00\x08\x00\x08\x0f\x02\ +\x00\x0f\x12JY\x0f\x12\x00?+\x00\x18?\x1299\ +//+\x11\x003+\x11\x003\x11\x12\x01\x179\x11\ +3\x1133\x113310\x13!\x113\x11!\x15\ +!\x113 \x11\x14\x04!!\x11!\x013265\ +4&##\x17\x01?\xac\x01\xa2\xfe^\xc9\x021\xfe\ +\xf7\xfe\xfb\xfeh\xfe\xc1\x01\xeb\xd5\xc0\xb5\xba\xda\xb6\x04\ +\xfa\x01\x1a\xfe\xe6\x94\xfe\xe0\xfed\xd0\xda\x04f\xfc+\ +\x89\x90\x8az\x00\x00\x02\x00\x17\x00\x00\x04\x9c\x05'\x00\ +\x11\x00\x19\x00G@&\x04\x00\x13\x13\x0f\x0b\x16\x07\x07\ +\x02\x0b\x0d\x04\x1a\x1b\x03\x0d\x0e\x0dFY\x04\x12FY\ +\x04\x04\x0b\x10\x00\x0e\x0f\x0b\x13FY\x0b\x15\x00?+\ +\x00\x18?3\xc6\x129/++\x11\x003\x11\x12\x01\ +\x179\x113\x1133\x113310\x01!\x15!\ +\x11! \x11\x14\x06#!\x11#5353\x11\x11\ +! 54&#\x01\xa8\x01X\xfe\xa8\x01?\x01\xb5\ +\xdf\xdc\xfe!\xeb\xeb\xa6\x011\x01\x1f\x87\x9c\x04H\x8c\ +\xfe\xc5\xfe\xcd\xa6\xa8\x03\xbc\x8c\xdf\xfc\xcd\xfe\x97\xb9\x5c\ +T\x00\x01\x00\xc9\xff\xec\x07!\x05\xcb\x00 \x00J@\ +)\x17\x13\x13\x14\x06\x18\x1d\x0c\x05\x18\x11\x14\x06!\x22\ +\x1b\x00IY\x1b\x04\x06\x12\x17\x12IY\x03\x17\x17\x14\ +\x15\x03\x14\x12\x0e\x09IY\x0e\x13\x00?+\x00\x18?\ +?\x129/3+\x11\x003\x18?+\x11\x12\x01\x17\ +9\x113\x113\x11310\x01\x22\x04\x07!\x15!\ +\x12\x00327\x15\x06# \x00\x03!\x11#\x113\ +\x11!\x12\x00%2\x17\x07&&\x05\x8f\xe3\xfe\xfc\x1f\ +\x02\xbf\xfd=\x08\x01\x09\xf7\x9a\xc2\x98\xde\xfe\xc1\xfe\xa5\ +\x08\xfe\xa2\xaa\xaa\x01d\x1e\x01q\x010\xd5\xb6Hd\ +\x9d\x053\xfa\xf1\x96\xfe\xef\xfe\xe27\x959\x01p\x01\ +T\xfdP\x05\xb6\xfd\x92\x013\x01N\x02\x5c\x920&\ +\x00\x00\x01\x00\xb0\xff\xec\x05\x9c\x04\x5c\x00!\x00Y@\ +2\x16\x19\x19\x0a\x03\x09\x05\x05\x06\x10 \x18\x03\x06\x05\ +\x22#\x0d\x13FY\x0d\x10\x19\x04\x09\x04FY\x16\x0f\ +\x09\x1f\x09\x02\x0b\x03\x09\x09\x06\x07\x0f\x06\x15\x00\x1cF\ +Y\x00\x16\x00?+\x00\x18??\x129/_^]\ +3+\x11\x003\x18?+\x11\x12\x01\x179\x113\x11\ +3\x1133\x11310\x05\x22\x00'!\x11#\x11\ +3\x11!6$32\x16\x17\x07&#\x22\x06\x07!\ +\x15!\x16\x163267\x15\x06\x04w\xeb\xfe\xf4\x0b\ +\xfe\xe1\xa6\xa6\x01!\x18\x01\x0d\xdfQ\x9a62\x8ae\ +\xa3\xa7\x10\x02\x18\xfd\xe6\x09\xa9\xa4=wbn\x14\x01\ +\x0a\xf8\xfe\x12\x04H\xfe3\xeb\xf6 \x19\x8d3\xa4\xaa\ +\x8d\xbc\xb5\x16%\x939\x00\x02\x00\x00\x00\x00\x05m\x05\ +\xb6\x00\x0b\x00\x12\x004@\x1b\x02\x03\x07\x0c\x03\x0d\x0a\ +\x05\x14\x13\x01\x05\x0c\x05IY\x10\x08\x0c\x0c\x07\x08\x03\ +\x0b\x03\x07\x12\x00?33?\x129/\x129+\x11\ +\x003\x11\x12\x01\x179\x11310\x01#\x11#\x11\ +#\x01#\x013\x01#\x01!'&'\x06\x07\x03\x98\ +\x94\x9c\x95\xfe\xdf\xb2\x02h\x9e\x02g\xb7\xfd\x5c\x01L\ +R8\x1e\x18@\x02\xaa\xfdV\x02\xaa\xfdV\x05\xb6\xfa\ +J\x03?\xcf\x90db\xa4\x00\x00\x02\x00\x0a\x00\x00\x04\ +y\x04H\x00\x0b\x00\x12\x005@\x1c\x05\x06\x0a\x0c\x06\ +\x0d\x03\x01\x06\x14\x13\x04\x08\x0c\x08FY\x11\x0b\x0c\x0c\ +\x0a\x0b\x0f\x06\x02\x0a\x15\x00?33?\x129/\x12\ +9+\x11\x003\x11\x12\x01\x179\x11310\x01\x01\ +#\x03#\x11#\x11#\x03#\x01\x03!&&'#\ +\x06\x02\xa8\x01\xd1\xac\xcfq\x97s\xcd\xac\x01\xd1!\x01\ +\x0f+8\x22\x09\x1c\x04H\xfb\xb8\x01\xe9\xfe\x17\x01\xe9\ +\xfe\x17\x04H\xfe-l\x8aj\x5c\x00\x00\x02\x00\xc9\x00\ +\x00\x07^\x05\xb6\x00\x13\x00\x1a\x00F@%\x0e\x0a\x0a\ +\x0b\x02\x03\x12\x15\x03\x14\x08\x07\x0b\x07\x1b\x1c\x05\x01\x09\ +\x0e\x09IY\x14\x18\x0c\x0e\x0e\x0b\x10\x0c\x03\x13\x07\x03\ +\x0b\x12\x00?333?3\x129/\x1293+\ +\x11\x0033\x11\x12\x01\x179\x113\x113\x1131\ +0\x01#\x11#\x11#\x01#\x01!\x11#\x113\x11\ +!\x013\x01#\x01!\x02&'\x06\x06\x05\x85\x8f\x9a\ +\x93\xfe\xe3\xba\x01\x22\xfe_\xaa\xaa\x01\xe1\x01\x06\x9e\x02\ +f\xbc\xfdf\x01>v\x1c\x0c\x13#\x02\xb0\xfdP\x02\ +\xb0\xfdP\x02\xb0\xfdP\x05\xb6\xfd\x92\x02n\xfaJ\x03\ +H\x015V/Ch\x00\x02\x00\xb0\x00\x00\x06\x14\x04\ +H\x00\x13\x00\x19\x00M@+\x11\x0d\x0d\x0e\x05\x06\x01\ +\x19\x06\x18\x0b\x0a\x0e\x07\x1a\x1b\x08\x04\x0c\x11\x0cFY\ +\x18\x15\x13/\x11?\x11\x02\x11\x11\x0e\x13\x0f\x0f\x0f\x0a\ +\x06\x02\x0e\x15\x00?333??\x129/]\x12\ +93+\x11\x0033\x11\x12\x01\x179\x113\x113\ +\x11310\x01\x01#\x03#\x11#\x11#\x03#\x13\ +!\x11#\x113\x11!\x13\x17#\x06\x06\x07!\x04F\ +\x01\xce\xaa\xd0q\x98n\xd1\xac\xd1\xfe\xdf\xa6\xa6\x01^\ +\xc5h\x08\x0a Y\x01\x0c\x04H\xfb\xb8\x01\xee\xfe\x12\ +\x01\xee\xfe\x12\x01\xee\xfe\x12\x04H\xfe3\x01\xcds\x22\ +_\xd9\x00\x00\x02\x00\x14\x00\x00\x05\xae\x05\xb6\x00\x1f\x00\ +\x22\x00K@( \x01\x0f\x10!\x1e\x1e\x1d\x10\x02\x01\ +\x07\x06$#\x1e\x01!\x1f\x1f!IY\x0e\x12\x1d\x12\ +JY\x22\x02\x1d\x1d\x18\x1f\x03\x10\x08\x18\x12\x00?3\ +3?\x129/33+\x11\x003+\x11\x12\x009\ +9\x11\x12\x01\x179\x113\x113\x11310\x01\x15\ +\x01\x1e\x02\x17\x13#\x03.\x02##\x11#\x11#\x22\ +\x06\x06\x07\x03#\x13>\x027\x015\x05!\x01\x05)\ +\xfeZv\x9ad2\x85\xae\x89#DeY\x1b\xaa\x1a\ +[cA \x87\xb9\x88/c\x95v\xfee\x03\xbe\xfd\ +\x0a\x01{\x05\xb6\x85\xfe\x11\x06H\x8b\xa4\xfe;\x01\xc9\ +o`&\xfdB\x02\xbe'_o\xfe7\x01\xc5\x9f\x8e\ +I\x07\x01\xef\x85\x99\xfe9\x00\x00\x02\x00\x0c\x00\x00\x05\ +\x14\x04H\x00 \x00#\x00N@*!\x01\x0f\x10\x22\ +\x1f\x18\x1f\x1e\x10\x02\x01\x07\x07%$\x1f\x01\x22 \ +\x22FY\x11\x0e\x12\x1e\x12GY#\x02\x1e\x1e\x18 \ +\x0f\x10\x08\x18\x15\x00?33?\x129/33+\ +\x11\x0033+\x11\x12\x0099\x11\x12\x01\x179\x11\ +3\x113\x11310\x01\x15\x01\x1e\x03\x13#\x03.\ +\x02##\x11#\x11#\x22\x06\x06\x07\x03#\x13>\x03\ +7\x015\x05!\x01\x04\x8b\xfe\xaeWoI1\x9b\xac\ +\x85\x22:TL\x0a\x99\x0bKR8'\x87\xaa\x83\x18\ +0InW\xfe\xb1\x03 \xfd\xb4\x01%\x04Hi\xfe\ +\xa0\x070Pi\xfeq\x01PWG\x1c\xfd\xf6\x02\x0a\ +\x1a@^\xfe\xae\x01P=iO2\x08\x01`i\x8c\ +\xfe\xc1\x00\x00\x02\x00\xc9\x00\x00\x07\xc5\x05\xb6\x00$\x00\ +'\x00a@5!\x1d\x1d\x1e&#\x0f\x10\x02'%\ +\x01\x07\x01'\x10\x22\x1b#\x18\x1e\x09)(#\x01$\ +&$&IY\x12\x0e\x1c!\x1cIY'\x02!!\ +\x1e$\x03\x1f\x03\x18\x10\x08\x1e\x12\x00?333?\ +?\x129/33+\x11\x0033+\x11\x12\x009\ +9\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +\x11310\x01\x15\x01\x1e\x02\x17\x13#\x03.\x02#\ +#\x11#\x11#\x22\x06\x06\x07\x03#\x1367!\x11\ +#\x113\x11!\x015\x05!\x01\x07=\xfe]x\x99\ +e-\x88\xa8\x8a\x1fFi_\x18\xac\x19^dB!\ +\x87\xb2\x8778\xfeR\xaa\xaa\x02\xd7\xfeh\x03\xc1\xfd\ +\x0a\x01{\x05\xb6\x85\xfe\x0e\x06H\x90\x9c\xfe;\x01\xc9\ +hc(\xfdD\x02\xbc(_l\xfe7\x01\xbe\xb8:\ +\xfdP\x05\xb6\xfd\x92\x01\xe9\x85\x99\xfe7\x00\x00\x02\x00\ +\xb0\x00\x00\x06\xba\x04H\x00$\x00'\x00g@:!\ +\x1d\x1d\x1e&#\x0f\x10\x02'%\x01\x07\x01'\x10\x22\ +\x1b#\x18\x1e\x09)(#\x01$&$&FY\x12\ +\x0e\x1c!\x1cFY'\x02/!?!\x02!!\x1e\ +$\x0f\x1f\x0f\x18\x10\x08\x1e\x15\x00?333??\ +\x129/]33+\x11\x0033+\x11\x12\x009\ +9\x11\x12\x01\x179\x113\x113\x113\x113\x113\ +\x11310\x01\x15\x01\x1e\x03\x13#\x03.\x02##\ +\x11#\x11#\x22\x06\x06\x07\x03#\x1367!\x11#\ +\x113\x11!\x015\x05!\x01\x061\xfe\xaeXoI\ +0\x9b\xac\x85\x22:VJ\x0a\x9a\x0aKT7&\x87\ +\xaa\x83/%\xfe\xcd\xa6\xa6\x025\xfe\xb0\x03!\xfd\xb4\ +\x01%\x04Hi\xfe\x9e\x071Ni\xfer\x01PV\ +F\x1c\xfd\xf8\x02\x08\x1b?\x5c\xfe\xae\x01Px(\xfe\ +\x10\x04H\xfe5\x01bi\x8c\xfe\xc7\x00\x01\x00?\xfe\ +N\x045\x06\xd1\x00K\x00\x84@M\x00\x13!?\x19\ +FF\x0a?7C<*\x1c-(\x13\x0bLMI\ +\x16JYI\x13941\x0f.\x1f./.\x03\x09\ +\x03.*@C\x1d\x1c\x1d\x1cJY\x1d\x1d\x10<*\ +*$JY*\x04\x0a\x09IY\x0a\x10\x10\x03IY\ +\x10#\x0c\x07IY\x0c\x22\x00?+\x00\x18?+\x00\ +\x18\x10\xc6+\x00\x18?+\x11\x003\x129\x18/+\ +\x11\x12\x009\x1a\x18\x10\xdd_^]9\xc42?+\ +\x11\x12\x01\x179\x113\x113\x11310\x17\x14\x16\ +327632\x17\x15&#\x22\x07\x06#\x22&\ +5467665\x10!#532654\ +&#\x22\x06\x07'67&''53\x16\x176\ +632\x17\x15&#\x22\x06\x07\x16\x16\x15\x14\x06\x07\ +\x15\x16\x16\x15\x14\x04\x05\x06\x06\xf0WYaxxF\ +\x9bGP\xa0Diii\xb3\xb8\xd9\xe8\xcc\xb5\xfe@\ +\xda\xd1\xcd\xe1\xa2\x89j\xbbnV\xa8\xbe9u1{\ +\x5c\x83\x5c\x83@20\x18+,o0\xb2\xc1\xbf\xaa\ +\xba\xcb\xfe\xe5\xfe\xe6\x8a\x86\x8972\x07\x06'\xa63\ +\x05\x05}\x85~\x81\x09\x08\x8a\x8d\x01\x0c\x8f\x93\x84k\ +\x807Err\x1cBy4\x1b;\x88sV\x0eq\ +\x0aRG\x17\xbd\x8f\x8c\xb8\x1a\x08\x18\xb2\x90\xd0\xd5\x09\ +\x057\x00\x00\x01\x00\x19\xfe{\x03\x7f\x05N\x00F\x00\ +\x83@N\x17)6\x0b.\x10\x10 \x0b\x03\x0e\x08>\ +2@<)\x0bGHD>A\x00\x05GY\x00\x0f\ +A\x1fA/A\x03\x09\x03A>&\x1aFY#\x1d\ +FY\x0e3232FY!#&\x03\ + >>8FY\x08>\x10 \x22\x13,GY\x13\ +\x16\x00?+\x00\x18??3+\x11\x12\x00\x179\x18\ +///+\x11\x12\x009++\x00\x18\x10\xd4_^\ +]\xc4+\x11\x12\x009\x11\x12\x01\x179\x113\x113\ +\x11310\x012\x17\x15&#\x22\x06\x07\x16\x16\x15\ +\x14\x07\x15\x16\x15\x14\x06\x07\x0e\x02\x15\x14\x16327\ +72\x17\x15&&#\x07\x06#\x22&5467\ +$54&##53 54#\x22\x06\x07'\ +67&'53\x16\x1766\x02\xf83-\x18)\ +/g-z\x8c\xd3\xf8\xf2\xe1]m0KYVz\ +\xaf}'\x15T7\xb3\x82\x5c\x90\x9f\xbe\xb4\x01N\x9c\ +\x9f\x94w\x017\xfcJ\x8fX;|~\x5cg{K\ +\x8cX\x86\x05N\x0fp\x0aO>\x1c\x8ak\xb89\x08\ +G\xca\x94\xa8\x03\x02\x17*,1+\x05\x05'\x8f\x13\ +\x18\x05\x05wpt}\x03\x04\xbeaZ\x8d\xac\xa2\x22\ +$\x877\x0fub\x1b4\x89nU\xff\xff\x00m\x00\ +\x00\x05\xf2\x05\xb6\x02\x06\x01u\x00\x00\xff\xff\x00\xa4\xfe\ +\x14\x05\x87\x06\x12\x02\x06\x01\x95\x00\x00\x00\x03\x00}\xff\ +\xec\x05\xbe\x05\xcd\x00\x0b\x00\x12\x00\x19\x00G@%\x16\ +\x10\x10\x06\x17\x0f\x0f\x00\x06\x00\x1a\x1b\x16\x10IY\x0f\ +\x16\x01\x0b\x03\x16\x16\x03\x09\x09\x13IY\x09\x04\x03\x0c\ +IY\x03\x13\x00?+\x00\x18?+\x11\x12\x009\x18\ +/_^]+\x11\x12\x0199\x113\x113\x113\ +\x11310\x01\x10\x00! \x00\x11\x10\x00! \x00\ +\x012\x12\x13!\x12\x12\x13\x22\x02\x03!&\x02\x05\xbe\ +\xfe\x9d\xfe\xc4\xfe\xbd\xfe\xa1\x01`\x01D\x01;\x01b\ +\xfda\xe5\xf7\x0d\xfc+\x0d\xf9\xe8\xe0\xfb\x13\x03\xd3\x11\ +\xf4\x02\xdd\xfe\xa1\xfen\x01\x8b\x01h\x01e\x01\x89\xfe\ +p\xfcD\x01\x11\x01\x0c\xfe\xf5\xfe\xee\x04\xb4\xfe\xfe\xff\ +\x00\xfe\x01\x04\x00\x00\x03\x00s\xff\xec\x04b\x04\x5c\x00\ +\x0c\x00\x13\x00\x1a\x00I@'\x17\x11\x11\x07\x18\x10\x10\ +\x00\x07\x00\x1b\x1c\x17\x11FY\x0f\x17\x1f\x17\x02\x0b\x03\ +\x17\x17\x03\x0a\x0a\x14FY\x0a\x10\x03\x0dFY\x03\x16\ +\x00?+\x00\x18?+\x11\x12\x009\x18/_^]\ ++\x11\x12\x0199\x113\x113\x113\x11310\ +\x01\x10\x00#\x22&\x025\x10\x0032\x00\x0126\ +7!\x16\x16\x13\x22\x06\x07!&&\x04b\xfe\xf2\xee\ +\x93\xe4|\x01\x0c\xee\xe6\x01\x0f\xfe\x08\x9e\xa4\x0a\xfdi\ +\x09\xa0\xa0\x9c\x9e\x0d\x02\x93\x0f\xa1\x02%\xfe\xf4\xfe\xd3\ +\x8a\x01\x02\xad\x01\x0c\x01+\xfe\xce\xfdM\xb8\xbf\xba\xbd\ +\x03X\xad\xa7\xa8\xac\x00\x00\x01\x00\x00\x00\x00\x05H\x05\ +\xc3\x00\x15\x00 @\x10\x06\x16\x13\x17\x11\x00JY\x11\ +\x04\x0a\x05\x06\x03\x05\x12\x00??\x129?+\x11\x01\ +3\x12910\x01\x22\x06\x07\x01#\x013\x01\x16\x17\ +67\x13>\x0232\x17\x15&\x04\xe1;N9\xfe\ +\xb8\xc5\xfd\xee\xb4\x01RH# F\xa2;TnY\ +*O8\x057g\xb5\xfb\xe5\x05\xb6\xfcV\xc7\x8f\x90\ +\xdf\x02\x06\xbf\x98A\x13\x8d\x14\x00\x01\x00\x00\x00\x00\x04\ +=\x04R\x00\x16\x00\x1e@\x0f\x01\x17\x0f\x18\x0d\x12G\ +Y\x0d\x10\x05\x01\x0f\x00\x15\x00??9?+\x11\x01\ +3\x12910!\x013\x13\x12\x1736\x13\x13>\ +\x0232\x17\x15&#\x22\x06\x07\x03\x01\x96\xfej\xae\ +\xe1d\x13\x08\x17R`%G[T-\x1e\x1d&/\ +:\x1c\xf8\x04H\xfd\x9b\xfe\xf4dv\x01\x0b\x015z\ +{4\x0a\x7f\x08T\x5c\xfc\xdf\xff\xff\x00\x00\x00\x00\x05\ +H\x07s\x02&\x02\x80\x00\x00\x01\x07\x03v\x04\xd7\x01\ +R\x00\x0a\xb4\x02\x01!\x05&\x00+55\xff\xff\x00\ +\x00\x00\x00\x04=\x06!\x02&\x02\x81\x00\x00\x01\x07\x03\ +v\x04d\x00\x00\x00\x0a\xb4\x02\x01\x22\x11&\x00+5\ +5\x00\x03\x00}\xfe\x14\x09\xa2\x05\xcd\x00\x0b\x00\x17\x00\ +.\x00D@&\x0c\x06\x12\x00!.'\x18\x00\x06\x06\ +/0%*JY%\x1b\x1d\x1c\x1c\x03 \x18\x0f\x09\ +\x15IY\x09\x04\x03\x0fIY\x03\x13\x00?+\x00\x18\ +?+\x00\x18?3\x129\x113?+\x11\x12\x01\x17\ +9\x113\x11310\x01\x10\x00! \x00\x11\x10\x00\ +! \x00\x01\x10\x1232\x12\x11\x10\x02#\x22\x02%\ +3\x13\x16\x17366\x133\x01\x06\x06#\x22'5\ +\x1632677\x05T\xfe\xb9\xfe\xdc\xfe\xd7\xfe\xbd\ +\x01C\x01,\x01#\x01E\xfb\xdd\xdf\xd9\xda\xdd\xdc\xd8\ +\xda\xe1\x04o\xb0\xf6N\x14\x08\x0bS\xe4\xb0\xfe+E\ +\xbc\x88LJ7B^u#=\x02\xdd\xfe\xa0\xfeo\ +\x01\x8b\x01h\x01f\x01\x88\xfep\xfe\xa0\xfe\xd7\xfe\xcd\ +\x011\x01+\x01)\x01/\xfe\xd2A\xfd\x8b\xcff,\ +\xfb\x02\x83\xfb \xb6\x9e\x11\x85\x0cgY\x9c\xff\xff\x00\ +s\xfe\x14\x08{\x04\x5c\x00&\x00R\x00\x00\x00\x07\x00\ +\x5c\x04u\x00\x00\x00\x02\x00}\xff\x87\x06\x10\x06-\x00\ +\x13\x00(\x00Q@*\x14\x0a&\x0d\x07\x11\x22\x22\x03\ +\x1c\x1f\x00\x00\x1c\x07\x17\x0a\x05)*$\x22&\x0d&\ +IY\x11\x0f\x0d\x03\x1c\x1a\x17\x07\x17IY\x05\x03\x07\ +\x12\x00?33+\x11\x0033\x18?33+\x11\ +\x0033\x11\x12\x01\x179\x113\x1133\x113\x11\ +33\x11310\x01\x10\x00\x05\x06#\x22'$\x00\ +\x11\x10\x00%632\x17\x04\x00\x01\x14\x12\x1766\ +32\x176\x1254\x02'\x06#\x22'\x06\x02\x06\ +\x10\xfe\xd1\xfe\xf8\x1aw|\x14\xfe\xf4\xfe\xd1\x01+\x01\ +\x10\x14|y\x16\x01\x0c\x01-\xfb!\xca\xbd\x11I6\ +n\x1f\xbd\xca\xca\xbd\x1fnq\x1f\xbd\xca\x02\xdd\xfe\xd2\ +\xfes,oo)\x01\x8a\x016\x011\x01\x85,l\ +l,\xfes\xfe\xd5\xf4\xfe\xcf)0&V)\x011\ +\xf4\xf4\x01/'XV'\xfe\xd3\x00\x00\x02\x00s\xff\ +\x93\x04\xcf\x04\xb4\x00\x17\x00-\x00P@*\x18\x0c\x0f\ +\x09+\x1b%\x15\x03#\x00\x00\x03 \x1b\x09\x0c\x06.\ +/(%+\x0f+FY\x15\x12\x0f\x10 \x1e\x1b\x09\ +\x1bFY\x06\x03\x09\x15\x00?33+\x11\x0033\ +\x18?33+\x11\x0033\x11\x12\x01\x179\x113\ +\x1133\x113\x113\x11310\x01\x14\x02\x07\x06\ +\x06#\x22&'&\x0254\x1276632\x16\ +\x17\x16\x12\x05\x14\x16\x176632\x17665\x10\ +%\x06\x06#\x22&'\x06\x06\x04\xcf\xe0\xcc\x09@8\ +9=\x09\xcb\xe5\xe0\xd0\x08>98@\x09\xca\xe2\xfc\ +P}\x89\x0c<5g\x18\x86|\xfe\xfc\x0d=35\ +<\x0c\x89}\x02%\xe9\xfe\xdf%6-+8$\x01\ +&\xe5\xe9\x01 $8*+9&\xfe\xdc\xe1\xb1\xd2\ +\x1f*\x22J\x1f\xd2\xaf\x01`>* ,\x1f\xd1\ +\x00\x00\x03\x00}\xff\xec\x07\x7f\x08;\x00\x15\x00E\x00\ +T\x00U@.C7\x1f++\x01&FKPH\ +<\x0c7\x0aUV\x15\x02\x02\x07\x07\x10\x0cR@H\ +:\x22@:@IY(:\x04\x1c\x164\x16IY\ +.4\x13\x00?3+\x11\x003\x18?3+\x11\x00\ +3\x18\x10\xd6\x1a\xdc\xd4\xcd2\x129/3\x11\x12\x01\ +\x179\x113\x11310\x01\x15#\x22.\x02#\x22\ +\x06\x15\x15#54632\x1e\x023\x01267\ +\x16\x1632\x12\x11\x10\x02#\x22\x06\x07'632\ +\x00\x11\x10\x00!\x22&'\x06\x06# \x00\x11\x10\x00\ +32\x17\x07&&#\x22\x02\x11\x10\x12\x01\x14\x075\ +654.\x025432\x16\x05\xa2\x11T\x8ex\ +f+/<}tp:pw\x85N\xfd(X\xab\ +=7\xab]\xbc\xd2\xa5\x93<_+Fy\x9a\xe4\x01\ +\x01\xfe\xe0\xfe\xfdh\xaaLK\xa7n\xfe\xfc\xfe\xe3\x01\ +\x01\xe4\x9ayF+^<\x94\xa5\xd2\x02\x80\xedx\x1f\ +$\x1f\x5c8C\x07\xc7y$+$43\x10\x1cg\ +n$,$\xf8\xbaB?9H\x01N\x01-\x01\x0b\ +\x01(+\x1f\x92R\xfe\x88\xfe\xad\xfe\x8c\xfeb(0\ +-+\x01\x9d\x01u\x01U\x01vR\x92\x1f+\xfe\xd9\ +\xfe\xf4\xfe\xd1\xfe\xb4\x06h\xa2=H)5\x14\x12\x11\ +\x1a\x1cID\x00\x00\x03\x00s\xff\xec\x06\x04\x07\x06\x00\ +*\x00?\x00N\x00\x5c@3\x13\x07\x1c((,\x22\ +@E\x0dJB6\x07\x0aOP2:?--6\ +LB\x0a@\x1f\x10\x0a\x10FY\x02\x17FY\x02\x04\ +%\x0a\x10\x1a\x15\x04\x15FY\x00\x04\x16\x00?3+\ +\x11\x003\x18?3\x129++\x11\x003\x1a\x18\x10\ +\xde\xdc\xd42\x113\xcd2\x11\x12\x01\x179\x113\x11\ +310\x05\x22'\x06#\x22\x02\x11\x10\x1232\x16\ +\x17\x07&#\x22\x06\x15\x10!27\x16\x163 \x11\ +4&#\x22\x07'6632\x12\x11\x10\x02\x03\x15\ +#\x22.\x02#\x22\x15\x15#54632\x1e\x02\ +3\x05\x14\x075654.\x025432\x16\x04\ ++\x94^\x5c\x8f\xe1\xfa\xcf\xba>w(9YGt\ +m\x011{p>oC\x01-nsGY9(\ +w>\xbb\xce\xf7Q\x10T\x8fxe+k}sp\ +:qv\x83N\xfe\xf0\xeew\x1e$\x1e\x5c8C\x14\ +AA\x01#\x01\x0e\x01\x17\x01( \x19\x8b3\xd6\xd6\ +\xfe^P*&\x01\xa2\xd6\xd63\x8b\x19 \xfe\xd7\xfe\ +\xea\xfe\xf5\xfe\xda\x06\xa5x$*$f\x11\x1fdo\ +%+%\xdd\xa1>H(8\x14\x11\x11\x19\x1bJD\ +\x00\x00\x02\x00^\xff\xec\x07\x7f\x07\x04\x00\x0d\x00@\x00\ +_@40$96>\x17\x17\x01\x126)\x0c$\ +\x07AB\x0e-'-IY\x1e77!'\x05\x09\ +\x09\x0d@\x09\x0fH\x0d\x07\x03\x0b@\x14'\x04;3\ +!3IY\x1a!\x13\x00?3+\x11\x003\x18?\ +3\x1a\xde22\xcd+2\x113\x11\x129/9+\ +\x11\x003\x11\x12\x01\x179\x113\x113\x11310\ +\x01\x15\x07#'#\x07#'#\x07#'5\x01\x22\ +\x06\x07'632\x12\x11\x10\x00!\x22&'#\x06\ +\x06# \x00\x11\x10\x0032\x17\x07&&#\x22\x02\ +\x11\x10\x123267\x113\x11\x1632\x12\x11\x10\ +\x02\x05\x8bP 2\xba1!1\xbc/!P\x03C\ +<]-F|\x99\xe4\xff\xfe\xe2\xfe\xfdt\xacL\x09\ +N\xacp\xfe\xfc\xfe\xe3\x01\x01\xe5\x96~F-]<\ +\x93\xa5\xd2\xbeA\x823\xaaf\x91\xbc\xd4\xa5\x07\x04\x1b\ +\xacgggg\xac\x1b\xfe+)\x1f\x92P\xfe\x88\xfe\ +\xad\xfe\x8b\xfec001/\x01\xa0\x01r\x01U\x01\ +vP\x92\x1f)\xfe\xd7\xfe\xf6\xfe\xd1\xfe\xb4&&\x01\ +\xc9\xfe7L\x01J\x011\x01\x0b\x01(\x00\x00\x02\x00\ +\x00\x00\x00\x06\x1d\x05\xa4\x00\x0d\x00*\x00?@$$\ +\x01\x0e\x1a\x1b\x0c\x12\x07+,(\x15\x0e\x1f\x16\x03\x11\ +\x12\x05\x09\x09\x0d@\x09\x0fH\x0d\x07\x03\x0b#\x1b\x12\ +\x0f\x11\x15\x00??33\xde22\xcd+2\x113\ +\x11\x12\x179?\x11\x12\x01\x17910\x01\x15\x07#\ +'#\x07#'#\x07#'5\x01\x07\x03#\x013\ +\x13\x16\x17366\x13\x033\x00\x16\x1736\x12\x11\ +3\x10\x02\x07#\x03&\x04\xb6R\x1e2\xbc1\x1f1\ +\xbc2\x1eP\x01\xac'\xaa\xd5\xfe\x7f\xac\xf6')\x08\ +\x0c#\xba\xac\xb2\x01\x09-\x0a\x08\xad\x99\xa6\xc3\xdb\xb6\ +}!\x05\xa4\x1b\xacgggg\xac\x1b\xfc%_\xfe\ +\x96\x04H\xfdIo\xab#Q\x01\x88\x01\xd5\xfc\xff\x90\ +,\xb8\x01\xb3\x01R\xfe\x96\xfe\x07\xe5\x01Z\x5c\x00\x00\ +\x01\x00}\xfe\x14\x04\xe3\x05\xcb\x00\x17\x00-@\x18\x03\ +\x0f\x09\x0a\x15\x0a\x0f\x03\x18\x19\x13\x00IY\x13\x04\x0c\ +\x06IY\x0c\x13\x0a\x1b\x00??+\x00\x18?+\x11\ +\x12\x01\x179\x113\x11310\x01\x22\x00\x11\x10\x00\ +!27\x11#\x11# \x00\x114\x12$32\x17\ +\x07&\x03H\xf5\xfe\xe0\x01\x0a\x01\x02o9\xaa\x14\xfe\ +\xb5\xfe\x9f\xaf\x01H\xd8\xed\xaaG\xab\x053\xfe\xc0\xfe\ +\xe8\xfe\xda\xfe\xd4\x17\xfdt\x01\xd8\x01\x84\x01m\xe0\x01\ +V\xb8T\x92N\x00\x01\x00s\xfe\x14\x03\xa2\x04\x5c\x00\ +\x18\x00/@\x18\x0f\x03\x17\x16\x09\x16\x03\x03\x19\x1a\x17\ +\x1b\x06\x0cFY\x06\x10\x00\x12FY\x00\x16\x00?+\ +\x00\x18?+\x00\x18?\x11\x12\x01\x179\x113\x113\ +10\x05\x22\x00\x11\x10\x0032\x16\x17\x07&#\x22\ +\x06\x15\x14\x163267\x11#\x11\x02u\xfe\xfe\xfc\ +\x01\x11\xfbO\xa401\x8eh\xb1\xab\xab\xab5P9\ +\xa6\x14\x01\x1f\x01\x12\x01\x14\x01+\x22\x17\x8d3\xcd\xdd\ +\xdc\xc8\x11\x1a\xfdn\x01\xd8\x00\x00\x01\x00j\xff\xfc\x04\ +u\x05\x06\x00\x13\x00/@!\x04\x02\x08\x03\x06\x00\x11\ +\x07\x0a\x10\x0d\x12\x0c\x0e\x0e\x15\x14\x13\x00\x03\x11\x06\x0f\ +\x05\x10\x07\x0d\x0a\x09\x0c\x0b\x01\x12\x00?\xcd\x179\x11\ +\x12\x01\x17910\x01\x03'\x13%7\x05\x13%7\ +\x05\x13\x17\x03\x05\x07%\x03\x05\x07\x02\x02\xb6y\xb6\xfe\ +\xe1B\x01!\xcd\xfe\xdfC\x01!\xb9v\xb8\x01!D\ +\xfe\xe1\xcc\x01\x1eA\x019\xfe\xc3C\x01B\xa6s\xa8\ +\x01d\xa6u\xa8\x01=C\xfe\xc0\xa6s\xa6\xfe\x9e\xa8\ +s\x00\x01\x00\xcb\x04\x91\x03\xac\x05\xb4\x00\x13\x00\x1e@\ +\x0c\x00\x06\x0a\x10\x06\x10\x14\x15\x03\x00\x0d\x09\x00/3\ +32\x11\x12\x0199\x113\x11310\x01\x06\x06\ +#\x22&5463!6632\x16\x15\x14\x06\ +#\x01\x87\x06*03)*6\x01\xc1\x06+/3\ +-,6\x04\xf0-2255).0138\ +(\x00\x01\x00\xf8\x04\xe5\x03\xdb\x05\xd7\x00\x13\x00\x1c@\ +\x0b\x07\x12\x15\x14\x00\x12\x12\x0c\x04\x80\x09\x00/\x1a\xcc\ +23\x113\x11\x12\x019910\x012763\ +2\x16\x15\x15#54#\x22\x0e\x02##5\x01\x04\ +x\x96\x95Qot}j+fy\x8eT\x10\x05b\ +;:od\x1f\x11f$+$y\x00\x01\x01\xdf\x04\ +\xd7\x02\xcd\x065\x00\x0e\x00\x18@\x0a\x0a\x00\x0c\x05\x00\ +\x03\x0f\x10\x03\x0d\x00/\xcc\x11\x12\x01\x179\x1131\ +0\x014632\x15\x14\x0e\x02\x15\x14\x17\x15&\x01\ +\xdfC8\x5c\x1e$\x1ew\xee\x05\xb88EL\x1b\x19\ +\x10\x12\x146(J@\x00\x01\x01\xe1\x04\xd7\x02\xcf\x06\ +5\x00\x0e\x00\x18@\x0a\x05\x00\x00\x0a\x02\x03\x0f\x10\x0c\ +\x02\x00/\xcc\x11\x12\x01\x179\x11310\x01\x14\x07\ +5654.\x025432\x16\x02\xcf\xeew\x1e\ +$\x1e\x5c8C\x05\xb8\xa1@J(6\x14\x12\x10\x19\ +\x1bLE\x00\x08\x00)\xfe\xc1\x07\xc1\x05\x91\x00\x0c\x00\ +\x1a\x00(\x006\x00D\x00R\x00_\x00m\x00\x80@\ +I_(DZ\x22>\x0c\x1a\x07\x14R6mL0\ +g\x10no\x00\x07:HHAOED>LV\ +cc\x5cjf_Zm\x1e,,%3/\x22(\ +\x036\x10\x17\x07OLjm36\x17\x1763m\ +jLO\x07\x08\x09\x0d\x14\x03\x09\x00/3/3\x12\ +\x179////////\x113\x11\x173\x11\ +33\x113\x11333\x1133\x113\x1133\ +3\x1133\x113\x113\x11\x12\x01\x17910\x01\ +&&#\x22\x06\x07#632\x16\x17\x03&&#\ +\x22\x06\x07#6632\x16\x17\x01&&#\x22\x06\ +\x07#6632\x16\x17!&&#\x22\x06\x07#\ +6632\x16\x17\x01&&#\x22\x06\x07#66\ +32\x16\x17!&&#\x22\x06\x07#6632\ +\x16\x17\x01&&#\x22\x06\x07#632\x16\x17!\ +&&#\x22\x06\x07#6632\x16\x17\x04o\x05\ +\x004@%\x15\x17% >:\x05\ +\x01),\x1f\x1c25\x09\x0d\x10?@;+\x07.\ +6\x19\x15\x1d\x11/'\x0f$3\x0e\x05\x0c\x05\x00/\ +/\x12\x179\x11\x12\x01\x17910\x05\x17\x06\x06\x07\ +#67\x03'6673\x06\x07\x017\x16\x16\x17\ +\x15&'\x05\x07&&'5\x16\x17\x017667\ +\x17\x06\x07\x01\x07\x06\x07'67\x03'&'7\x16\ +\x17\x01\x17\x16\x16\x17\x07&&'\x047\x0b\x11F$\ +a5\x11;\x0b\x13I\x1fa4\x12\x02#\x0eG\xc8\ +A\xdd\x81\xfbh\x0eB\xbfO\xdd\x81\x03\xa6\x02C\xbe\ +CE\xb1x\xfc\xea\x02\x9b\xa9E\xb1x+\x11RE\ +C{L\x03j\x11'Z\x16C\x1f\x82&#\x0eB\ +\xbfO\xdd\x81\x04\x98\x0eG\xc8A\xdc\x82\xfe\x16\x0b\x13\ +I\x1fa5\x11;\x0b\x11F$a5\x11\x01\xaa\x10\ +'X\x19DnX\xfc\x95\x10Y?DnX\x02\xde\ +\x02\x8c\xb7F\xc6c\xfc\xe9\x02E\xc2\xa8\x97\xfef\x00\ +\x02\x00=\xff\xec\x06?\x05\xcd\x00 \x00'\x00Q@\ +*\x05\x03\x00$\x11\x11\x08\x1e%\x10\x10\x18\x1e\x00\x04\ +()\x11\x1e\x07\x1eIY$\x07\x02\x07\x02\x1b\x0c\x1b\ +\x14IY\x1b\x13\x0c!IY\x0c\x04\x00?+\x00\x18\ +?+\x11\x12\x0099\x18//3+\x11\x003\x11\ +\x12\x01\x179\x113\x1133\x113\x113310\ +\x13473\x06\x15\x14337\x12\x00! \x00\x11\ +\x15!\x12\x003267\x15\x06\x06# \x00\x03\x22\ +&\x01\x22\x02\x07!\x10&=\x1b\x91\x14q\x22\x05\x1d\ +\x01M\x01\x17\x01)\x01(\xfb\xdc\x0e\x01\x05\xf7e\xca\ +\x8dr\xdd\x82\xfe\xc6\xfe\xa3\x13\x8e\x9b\x03\xaf\xd1\xf0\x10\ +\x03n\xcb\x03\x87I62\x05\xfe\x95\x06\xb2\xfe\xf5\xf9\x01\x09\xfb\x00\x02\x00\ +3\xfe\x87\x04\xdd\x04Z\x00!\x00(\x00X@/\x0a\ +\x08\x05\x16\x0d !&\x15\x15\x1d!\x0d\x03\x05\x06)\ +*!\x22\x1f\x16\x16\x03\x0c\x03FY%\x0c\x07\x0c\x07\ +\x00\x11\x11\x22FY\x11\x10\x00\x19FY\x00\x15\x00?\ ++\x00\x18?+\x11\x12\x0099\x18//3+\x11\ +\x003\x18??\x11\x12\x01\x179\x113\x113\x113\ +\x113310\x05&\x02'$5473\x06\x15\ +\x143376632\x12\x15\x15!\x16\x1632\ +67\x15\x06\x07\x11#\x13\x22\x06\x07!4&\x02\xd5\ +\xbf\xd3\x06\xfe\xf6\x19\x8d\x14j\x15\x06\x22\xfa\xb7\xcf\xf1\ +\xfd\x0c\x06\xac\xade\x9fb\x8e\xa5\xa6D\x86\x97\x0e\x02\ +=\x8c\x0a\x1f\x01\x11\xe0\x04\xddE2/;g#\xca\ +\xe0\xfe\xf7\xe2i\xc6\xc3 *\x94A\x04\xfe\x99\x05H\ +\xa4\x9e\x9d\xa5\x00\xff\xff\x00T\x00\x00\x02V\x05\xb6\x02\ +\x06\x00,\x00\x00\xff\xff\x00\x02\x00\x00\x06\xbc\x07`\x02\ +&\x01\xb0\x00\x00\x01\x07\x026\x01\x10\x01T\x00\x08\xb3\ +\x01\x12\x05&\x00+5\xff\xff\x00\x04\x00\x00\x05\xdf\x06\ +\x0c\x02&\x01\xd0\x00\x00\x01\x07\x026\x00\xa4\x00\x00\x00\ +\x08\xb3\x01\x12\x11&\x00+5\x00\x01\x00\xc9\xfe\x00\x05\ +\x19\x05\xb6\x00\x1c\x00B@%\x07\x03\x03\x04\x1a\x0e\x0e\ +\x09\x0a\x14\x04\x05\x1d\x1e\x11\x17IY\x11\x1c\x07\x02I\ +Y\x0b\x00JY\x07\x0b\x0b\x04\x08\x05\x03\x04\x12\x00?\ +?3\x129/9++\x00\x18?+\x11\x12\x01\x17\ +9\x113\x113\x11310\x01\x22\x07\x11#\x113\ +\x11\x013\x017 \x00\x11\x10\x00!\x22&'5\x16\ +32\x1254$\x02^\x8c_\xaa\xaa\x02\x89\xcd\xfd\ +\x85\x1a\x01O\x01b\xfe\xd9\xfe\xf5R|Fz\x98\xbb\ +\xc8\xfe\xeb\x02{\x1f\xfd\xa4\x05\xb6\xfd<\x02\xc4\xfdT\ +\x02\xfe\xbb\xfe\xcf\xfe\xc6\xfe\xa4\x14\x1d\x981\x01\x0d\xf1\ +\xe8\xfd\x00\x00\x01\x00\xb0\xfe\x0a\x04!\x04H\x00\x1c\x00\ +B@%\x04\x00\x00\x01\x17\x0a\x10\x0a\x06\x07\x01\x05\x1d\ +\x1e\x0e\x14FY\x0e\x1b\x04\x1cGY\x07\x1aFY\x04\ +\x07\x07\x01\x05\x02\x0f\x01\x15\x00??3\x129/9\ +++\x00\x18?+\x11\x12\x01\x179\x113\x113\x11\ +310!#\x113\x11\x013\x01\x04\x12\x11\x14\x06\ +\x06#\x22'5\x16\x1632654&#\x22\x07\ +\x01T\xa4\xa4\x01\xe3\xb7\xfe7\x01\x00\xfcn\xcc\x85\x88\ +_.lG\x87\x98\xbb\xbeR\x5c\x04H\xfd\xfa\x02\x06\ +\xfe\x1e\x04\xfe\xe4\xfe\xf5\xb1\xfc\x84<\x91\x19&\xd9\xc8\ +\xd3\xcf\x18\x00\x01\x00\x00\xfe\x83\x05\x91\x05\xb6\x00\x17\x00\ +9@\x1f\x03\x00\x05\x04\x01\x01\x05\x0e\x03\x18\x19\x16\x07\ +IY\x16\x03\x0c\x11JY\x0c\x12\x05\x00IY\x05\x12\ +\x03\x22\x00??+\x00\x18?+\x00\x18?+\x11\x12\ +\x01\x179\x113\x113310%3\x03#\x13#\ +\x11!\x07\x02\x02\x06'\x22'5\x163266\x12\ +\x13!\x04\xd9\xb8\x8f\xc5\x9c\xaa\xfe%\x1f=]\x98~\ +J;6;5O=]8\x03\x12\x9a\xfd\xe9\x01}\ +\x05\x1f\xf0\xfe!\xfeE\xae\x02\x19\x8f\x1aW\xd7\x02Y\ +\x01\xb8\x00\x00\x01\x00\x10\xfe\x87\x04\x8f\x04F\x00\x14\x00\ +9@\x1f\x03\x00\x05\x04\x01\x01\x05\x0d\x03\x15\x16\x13\x07\ +FY\x13\x0f\x0b\x10GY\x0b\x15\x05\x00FY\x05\x15\ +\x03\x22\x00??+\x00\x18?+\x00\x18?+\x11\x12\ +\x01\x179\x113\x113310%3\x03#\x13#\ +\x11!\x02\x02\x06#\x22'5\x1632\x12\x13!\x03\ +\xdf\xb0\x81\xac}\xa6\xfe\xb5\x1c^\x98v:\x1c\x16\x1c\ +q\x89\x22\x02\x81\x8f\xfd\xf8\x01y\x03\xb8\xfe\x98\xfed\ +\xc0\x0a\x7f\x06\x01\xd9\x01\xf6\x00\x00\x01\x00\xc9\xfe\x00\x05\ +\x1f\x05\xb6\x00\x15\x00=@ \x12\x0e\x0e\x0f\x13\x0b\x0b\ +\x00\x00\x06\x0f\x03\x16\x17\x12\x0dIY\x12\x12\x0f\x14\x10\ +\x03\x0f\x12\x03\x09IY\x03\x1c\x00?+\x00\x18??\ +3\x129/+\x11\x12\x01\x179\x113\x113\x113\ +\x11310%\x10\x00!\x22&'5\x163 \x11\ +\x11!\x11#\x113\x11!\x113\x05\x1f\xfe\xe6\xfe\xfb\ +RzM{\x87\x01\x8c\xfc\xfe\xaa\xaa\x03\x02\xaa\x96\xfe\ +\xc2\xfe\xa8\x13\x1e\x961\x01\xf7\x02#\xfdP\x05\xb6\xfd\ +\x92\x02n\x00\x01\x00\xb0\xfe\x0a\x04b\x04H\x00\x15\x00\ +G@'\x0f\x0b\x0b\x0c\x10\x08\x08\x13\x13\x02\x0c\x03\x16\ +\x17\x0f\x0aFY\x0f\x0f\x1f\x0f\x02\x0b\x03\x0f\x0f\x0c\x11\ +\x0d\x0f\x0c\x15\x00\x05FY\x00\x1b\x00?+\x00\x18?\ +?3\x129/_^]+\x11\x12\x01\x179\x113\ +\x113\x113\x11310\x01\x22'5\x16326\ +5\x11!\x11#\x113\x11!\x113\x11\x10\x02\x02\xd3\ +\x84]of}v\xfd\x9c\xa6\xa6\x02d\xa8\xcf\xfe\x0a\ +:\x95=\xc6\xcf\x01\xbd\xfe\x12\x04H\xfe5\x01\xcb\xfb\ +\xeb\xfe\xf4\xfe\xe3\x00\x01\x00\xc9\xfe\x83\x05\xd7\x05\xb6\x00\ +\x0f\x00D@$\x0c\x08\x08\x09\x0d\x03\x00\x05\x04\x01\x01\ +\x05\x09\x03\x10\x11\x0c\x07IY\x0c\x0c\x05\x0e\x0a\x03\x09\ +\x12\x05\x00IY\x05\x12\x03\x22\x00??+\x00\x18?\ +?3\x129/+\x11\x12\x01\x179\x113\x1133\ +3\x113\x11310%3\x03#\x13#\x11!\x11\ +#\x113\x11!\x113\x05\x1f\xb8\x91\xc5\x9e\xaa\xfc\xfe\ +\xaa\xaa\x03\x02\xaa\x9a\xfd\xe9\x01}\x02\xb0\xfdP\x05\xb6\ +\xfd\x92\x02n\x00\x00\x01\x00\xb0\xfe\x87\x05\x12\x04F\x00\ +\x0f\x00D@$\x01\x0d\x0d\x0e\x08\x05\x02\x0a\x09\x06\x06\ +\x0a\x0e\x03\x10\x11\x01\x0cFY\x01\x01\x0a\x03\x0f\x0f\x0e\ +\x15\x0a\x05FY\x0a\x15\x08\x22\x00??+\x00\x18?\ +?3\x129/+\x11\x12\x01\x179\x113\x1133\ +3\x113\x11310\x01\x11!\x113\x113\x03#\ +\x13#\x11!\x11#\x11\x01V\x02f\xa6\xb0\x81\xac}\ +\xa6\xfd\x9a\xa6\x04F\xfe7\x01\xc9\xfcI\xfd\xf8\x01y\ +\x01\xee\xfe\x12\x04F\x00\x00\x01\x00\xaa\xfe\x83\x04\xc7\x05\ +\xb6\x00\x17\x00=@ \x0f\x0c\x02\x03\x15\x05\x05\x00\x00\ +\x03\x0c\x03\x18\x19\x12\x09IY\x12\x12\x01\x16\x0d\x03\x03\ +\x22\x01\x04IY\x01\x12\x00?+\x00\x18??3\x12\ +9/+\x11\x12\x01\x179\x113\x113\x113\x113\ +10!#\x11#\x113\x11\x06\x06#\x22&5\x11\ +3\x11\x14\x163267\x113\x04\xc7\xaa\xa2\xa2\x95\ +\xc6j\xcf\xdf\xaa\x7f\x8fa\xb1\xa9\xaa\xfe\x83\x02\x17\x01\ +\xc25'\xbe\xb3\x02E\xfd\xcfyt\x1d7\x02\xca\x00\ +\x01\x00\x9c\xfe\x85\x04-\x04H\x00\x16\x00=@ \x01\ +\x15\x0b\x0c\x06\x0e\x0e\x09\x09\x0c\x15\x03\x17\x18\x03\x12F\ +Y\x03\x03\x0a\x07\x16\x0f\x0c\x22\x0a\x0dFY\x0a\x15\x00\ +?+\x00\x18??3\x129/+\x11\x12\x01\x179\ +\x113\x113\x113\x11310\x01\x11\x14326\ +7\x113\x11#\x11#\x113\x11\x06\x06#\x22&5\ +\x11\x01B\xdb[\xa6i\xa6\x95\xa6\x95i\xb3q\xa4\xba\ +\x04H\xfep\xc08C\x01\xd5\xfb\xb8\xfe\x85\x02\x0a\x01\ +aH;\xac\x93\x01\x9c\x00\x01\x00\xc9\xfe\x83\x07)\x05\ +\xb6\x00\x18\x00H@%\x09\x06\x06\x07\x11\x0e\x0c\x13\x12\ +\x0f\x0f\x13\x07\x03\x19\x1a\x17\x16\x02\x0b\x02\x13\x08\x13\x0e\ +IY\x13\x12\x11\x22\x0c\x08\x03\x00\x07\x12\x00?3?\ +3??+\x11\x12\x0099\x1133\x11\x12\x01\x17\ +9\x113\x11333\x113\x11310!\x01#\ +\x17\x16\x15\x11#\x11!\x013\x013\x113\x03#\x13\ +#\x1147#\x01\x03P\xfe\x10\x08\x07\x07\x9d\x01\x00\ +\x01\xd1\x08\x01\xd1\xfe\xb8\x8f\xc7\x9e\xaa\x0e\x08\xfe\x0c\x05\ +\x10\x7f\xc0/\xfc^\x05\xb6\xfbJ\x04\xb6\xfa\xe4\xfd\xe9\ +\x01}\x03\xae\x84\xdc\xfa\xf2\x00\x00\x01\x00\xb0\xfe\x87\x05\ +\xdf\x04F\x00\x18\x00?@ \x13\x14\x08\x05\x0a\x09\x06\ +\x06\x0a\x14\x03\x19\x1a\x0b\x12\x00\x12\x0f\x03\x15\x0f\x14\x15\ +\x0a\x05FY\x0a\x0f\x15\x08\x22\x00??3+\x00\x18\ +??3\x1299\x113\x11\x12\x01\x179\x113\x11\ +33\x11310%77\x013\x113\x03#\x13\ +#\x11\x07\x07\x01#\x01&'\x11#\x113\x01\x16\x02\ +\xe9\x1f+\x01)\xd3\xb0\x81\xac}\x93\x14:\xfe\xe5\x8b\ +\xfe\xe55\x14\x94\xcb\x01)-\xa0]v\x02\xd3\xfcI\ +\xfd\xf8\x01y\x03\x89:\x99\xfdJ\x02\xb8\x86K\xfcw\ +\x04F\xfd-n\xff\xff\x00T\x00\x00\x02V\x05\xb6\x02\ +\x06\x00,\x00\x00\xff\xff\x00\x00\x00\x00\x05\x10\x07^\x02\ +&\x00$\x00\x00\x01\x07\x026\x009\x01R\x00\x08\xb3\ +\x02\x0f\x05&\x00+5\xff\xff\x00^\xff\xec\x03\xcd\x06\ +\x0c\x02&\x00D\x00\x00\x01\x06\x026\xe8\x00\x00\x08\xb3\ +\x02%\x11&\x00+5\xff\xff\x00\x00\x00\x00\x05\x10\x07\ +%\x02&\x00$\x00\x00\x01\x07\x00j\x00=\x01R\x00\ +\x0a\xb4\x03\x02$\x05&\x00+55\xff\xff\x00^\xff\ +\xec\x03\xcd\x05\xd3\x02&\x00D\x00\x00\x01\x06\x00j\xf3\ +\x00\x00\x0a\xb4\x03\x02:\x11&\x00+55\xff\xff\xff\ +\xfe\x00\x00\x06\x81\x05\xb6\x02\x06\x00\x88\x00\x00\xff\xff\x00\ +^\xff\xec\x06s\x04\x5c\x02\x06\x00\xa8\x00\x00\xff\xff\x00\ +\xc9\x00\x00\x03\xf8\x07^\x02&\x00(\x00\x00\x01\x07\x02\ +6\x00\x10\x01R\x00\x08\xb3\x01\x0c\x05&\x00+5\xff\ +\xff\x00s\xff\xec\x04\x12\x06\x0c\x02&\x00H\x00\x00\x01\ +\x06\x026\x0c\x00\x00\x08\xb3\x02\x1b\x11&\x00+5\x00\ +\x02\x00u\xff\xec\x05X\x05\xcd\x00\x12\x00\x19\x00=@\ + \x17\x0e\x10\x16\x16\x09\x09\x02\x0e\x03\x1a\x1b\x0f\x17I\ +Y\x0f\x0f\x0c\x06\x0c\x13IY\x0c\x13\x06\x00IY\x06\ +\x04\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x01\x179\x113\x113\x11310\x01\x22\x075\ +663 \x00\x11\x10\x00! \x115!\x02\x00\x03\ +2\x127!\x10\x16\x02\x98\xe3\xe2s\xd2\x86\x01K\x01\ +o\xfe\xa6\xfe\xcb\xfd\xac\x04/\x11\xfe\xf9\xc3\xd2\xf9\x10\ +\xfc\x87\xcc\x055L\x9e& \xfeq\xfe\x9b\xfe\xa2\xfe\ +q\x02\xebF\x01\x0a\x01\x0e\xfbN\x01\x0d\xf7\xfe\xf8\xfc\ +\x00\x00\x02\x00f\xff\xec\x04\x06\x04\x5c\x00\x14\x00\x1b\x00\ +;@\x1f\x19\x09\x18\x0b\x03\x03\x11\x09\x03\x1c\x1d\x0a\x19\ +FY\x0a\x0a\x06\x00\x06\x15FY\x06\x16\x00\x0eFY\ +\x00\x10\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x12\x01\x179\x1133\x11310\x012\x00\x11\ +\x10\x00#\x22\x0255!&&#\x22\x06\x0756\ +6\x13267!\x14\x16\x01\xfa\xf5\x01\x17\xfe\xfd\xda\ +\xd0\xf3\x02\xf4\x05\xb3\xa6b\xa5_Y\xa2\x9a\x85\x9a\x0c\ +\xfd\xc3\x8d\x04\x5c\xfe\xd4\xfe\xfb\xfe\xf8\xfe\xc9\x01\x0c\xe1\ +i\xcc\xbb!)\x93(\x22\xfc\x1b\xa5\x9c\x9d\xa4\x00\xff\ +\xff\x00u\xff\xec\x05X\x07%\x02&\x02\xe1\x00\x00\x01\ +\x07\x00j\x00\x93\x01R\x00\x0a\xb4\x03\x02/\x05&\x00\ ++55\xff\xff\x00f\xff\xec\x04\x06\x05\xd3\x02&\x02\ +\xe2\x00\x00\x01\x06\x00j\xea\x00\x00\x0a\xb4\x03\x021\x11\ +&\x00+55\xff\xff\x00\x02\x00\x00\x06\xbc\x07%\x02\ +&\x01\xb0\x00\x00\x01\x07\x00j\x01\x10\x01R\x00\x0a\xb4\ +\x02\x01'\x05&\x00+55\xff\xff\x00\x04\x00\x00\x05\ +\xdf\x05\xd3\x02&\x01\xd0\x00\x00\x01\x07\x00j\x00\xa2\x00\ +\x00\x00\x0a\xb4\x02\x01'\x11&\x00+55\xff\xff\x00\ +J\xff\xec\x045\x07%\x02&\x01\xb1\x00\x00\x01\x07\x00\ +j\xff\xf3\x01R\x00\x0a\xb4\x02\x01>\x05&\x00+5\ +5\xff\xff\x00D\xff\xec\x03\x7f\x05\xd3\x02&\x01\xd1\x00\ +\x00\x01\x06\x00j\x94\x00\x00\x0a\xb4\x02\x018\x11&\x00\ ++55\x00\x01\x00J\xff\xec\x047\x05\xb6\x00\x19\x00\ +@@#\x00\x13\x15\x19\x0f\x03\x03\x19\x13\x16\x08\x05\x1a\ +\x1b\x19\x16\x17\x16IY\x00\x12JY\x00\x00\x06\x17\x03\ +\x06\x0cJY\x06\x13\x00?+\x00\x18?\x129/+\ ++\x11\x003\x11\x12\x01\x179\x113\x113\x1131\ +0\x01\x04\x04\x15\x14\x04! '5\x16\x16326\ +54&##5\x01!5!\x15\x01\xfc\x01\x17\x01\ +$\xfe\xcd\xfe\xea\xfe\xff\xa3`\xdej\xc7\xca\xe1\xdf\x8c\ +\x01\xee\xfdN\x03\x87\x03?\x09\xd3\xc1\xce\xe8O\x9e.\ +2\x99\x90\x86\x8a\x8d\x01\xde\x99\x8b\x00\x00\x01\x00\x1b\xfe\ +\x14\x03\xa6\x04H\x00\x19\x00@@#\x00\x13\x15\x19\x0f\ +\x04\x04\x19\x13\x16\x09\x05\x1a\x1b\x19\x16\x17\x16FY\x00\ +\x12GY\x00\x00\x07\x17\x0f\x07\x0cFY\x07\x1b\x00?\ ++\x00\x18?\x129/++\x11\x003\x11\x12\x01\x17\ +9\x113\x113\x11310\x01\x1e\x02\x15\x14\x00#\ +\x22'5\x1632654&##5\x01!5\ +!\x15\x01\xac\x95\xe6\x7f\xfe\xd8\xef\xea\x8a\xb7\xc8\xa1\xc5\ +\xd6\xcay\x01\xc5\xfd\x89\x038\x01\xcf\x07r\xca\x88\xde\ +\xfe\xeeF\x9aV\xbe\xa0\xa4\xaar\x01\xfe\x8e{\x00\xff\ +\xff\x00\xcb\x00\x00\x05R\x06\xb4\x02&\x01\xb2\x00\x00\x01\ +\x07\x01M\x00\xb4\x01R\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\x00\xb0\x00\x00\x04b\x05b\x02&\x01\xd2\x00\ +\x00\x01\x06\x01M1\x00\x00\x08\xb3\x01\x11\x11&\x00+\ +5\xff\xff\x00\xcb\x00\x00\x05R\x07%\x02&\x01\xb2\x00\ +\x00\x01\x07\x00j\x00\xbe\x01R\x00\x0a\xb4\x02\x01%\x05\ +&\x00+55\xff\xff\x00\xb0\x00\x00\x04b\x05\xd3\x02\ +&\x01\xd2\x00\x00\x01\x06\x00j=\x00\x00\x0a\xb4\x02\x01\ +#\x11&\x00+55\xff\xff\x00}\xff\xec\x05\xbe\x07\ +%\x02&\x002\x00\x00\x01\x07\x00j\x00\xd1\x01R\x00\ +\x0a\xb4\x03\x02-\x05&\x00+55\xff\xff\x00s\xff\ +\xec\x04b\x05\xd3\x02&\x00R\x00\x00\x01\x06\x00j\x1d\ +\x00\x00\x0a\xb4\x03\x02.\x11&\x00+55\xff\xff\x00\ +}\xff\xec\x05\xbe\x05\xcd\x02\x06\x02~\x00\x00\xff\xff\x00\ +s\xff\xec\x04b\x04\x5c\x02\x06\x02\x7f\x00\x00\xff\xff\x00\ +}\xff\xec\x05\xbe\x07%\x02&\x02~\x00\x00\x01\x07\x00\ +j\x00\xd1\x01R\x00\x0a\xb4\x04\x03/\x05&\x00+5\ +5\xff\xff\x00s\xff\xec\x04b\x05\xd3\x02&\x02\x7f\x00\ +\x00\x01\x06\x00j\x1b\x00\x00\x0a\xb4\x04\x030\x11&\x00\ ++55\xff\xff\x00=\xff\xec\x04\x89\x07%\x02&\x01\ +\xc7\x00\x00\x01\x07\x00j\xff\xed\x01R\x00\x0a\xb4\x02\x01\ +0\x05&\x00+55\xff\xff\x009\xff\xec\x03}\x05\ +\xd3\x02&\x01\xe7\x00\x00\x01\x06\x00j\x8e\x00\x00\x0a\xb4\ +\x02\x010\x11&\x00+55\xff\xff\x00\x1b\xff\xec\x04\ +\xf8\x06\xb4\x02&\x01\xbd\x00\x00\x01\x07\x01M\x00/\x01\ +R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\xff\x00\x02\xfe\ +\x14\x04\x06\x05b\x02&\x00\x5c\x00\x00\x01\x06\x01M\xad\ +\x00\x00\x08\xb3\x01\x19\x11&\x00+5\xff\xff\x00\x1b\xff\ +\xec\x04\xf8\x07%\x02&\x01\xbd\x00\x00\x01\x07\x00j\x00\ +;\x01R\x00\x0a\xb4\x02\x01,\x05&\x00+55\xff\ +\xff\x00\x02\xfe\x14\x04\x06\x05\xd3\x02&\x00\x5c\x00\x00\x01\ +\x06\x00j\xb7\x00\x00\x0a\xb4\x02\x01+\x11&\x00+5\ +5\xff\xff\x00\x1b\xff\xec\x04\xf8\x07s\x02&\x01\xbd\x00\ +\x00\x01\x07\x01S\x00\x8d\x01R\x00\x0a\xb4\x02\x01*\x05\ +&\x00+55\xff\xff\x00\x02\xfe\x14\x04\x06\x06!\x02\ +&\x00\x5c\x00\x00\x01\x06\x01S\x04\x00\x00\x0a\xb4\x02\x01\ +)\x11&\x00+55\xff\xff\x00\xaa\x00\x00\x04\xc7\x07\ +%\x02&\x01\xc1\x00\x00\x01\x07\x00j\x00j\x01R\x00\ +\x0a\xb4\x02\x01)\x05&\x00+55\xff\xff\x00\x9c\x00\ +\x00\x04-\x05\xd3\x02&\x01\xe1\x00\x00\x01\x06\x00j\x17\ +\x00\x00\x0a\xb4\x02\x01(\x11&\x00+55\x00\x01\x00\ +\xc9\xfe\x83\x04\x08\x05\xb6\x00\x09\x00-@\x18\x04\x09\x06\ +\x07\x01\x07\x09\x03\x0a\x0b\x09\x04IY\x09\x12\x07\x22\x00\ +\x03IY\x00\x03\x00?+\x00\x18??+\x11\x12\x01\ +\x179\x113\x11310\x13!\x15!\x113\x11#\ +\x11#\xc9\x03?\xfdk\xa1\xa1\xaa\x05\xb6\x99\xfb}\xfd\ +\xe9\x01}\x00\x01\x00\xb0\xfe\x87\x03B\x04F\x00\x09\x00\ +-@\x18\x04\x09\x06\x07\x01\x07\x09\x03\x0a\x0b\x09\x04F\ +Y\x09\x15\x07\x22\x00\x03FY\x00\x0f\x00?+\x00\x18\ +??+\x11\x12\x01\x179\x113\x11310\x13!\ +\x15!\x113\x11#\x11#\xb0\x02\x92\xfe\x14\x96\xa6\x96\ +\x04F\x8c\xfc\xd5\xfd\xf8\x01y\xff\xff\x00\xc9\x00\x00\x06\ +\x0a\x07%\x02&\x01\xc5\x00\x00\x01\x07\x00j\x01\x1b\x01\ +R\x00\x0a\xb4\x04\x03-\x05&\x00+55\xff\xff\x00\ +\xb0\x00\x00\x05y\x05\xd3\x02&\x01\xe5\x00\x00\x01\x07\x00\ +j\x00\xc5\x00\x00\x00\x0a\xb4\x04\x03,\x11&\x00+5\ +5\xff\xff\x00/\xfeu\x04\x08\x05\xb6\x02&\x02\x9b\x00\ +\x00\x00\x07\x03\x80\x00\x93\x00\x00\xff\xff\x00\x12\xfeu\x03\ +B\x04H\x02&\x02\x9c\x00\x00\x00\x06\x03\x81u\x00\xff\ +\xff\x00\x08\xfeu\x04\xc9\x05\xb6\x00&\x00;\x00\x00\x00\ +\x07\x03\x80\x03X\x00\x00\xff\xff\x00'\xfeu\x044\x04\ +H\x00&\x00[\x00\x00\x00\x07\x03\x81\x02\xc3\x00\x00\x00\ +\x01\x00\x06\x00\x00\x04\x96\x05\xb6\x00\x11\x00;@\x22\x0f\ +\x02\x11\x01\x10\x0d\x04\x0a\x07\x09\x06\x0b\x0c\x13\x12\x0a\x11\ +\x00\x11IY\x07\x0d\x0f\x04\x00\x00\x02\x0c\x0f\x12\x05\x02\ +\x03\x00?3?3\x129/9\x1293+\x11\x00\ +3\x11\x12\x01\x17910\x13!\x013\x01\x013\x01\ +!\x15!\x01#\x01\x01#\x01!\x7f\x013\xfew\xbc\ +\x01k\x01l\xb7\xfep\x01<\xfe\xba\x01\xbd\xc1\xfew\ +\xfep\xb6\x01\xbf\xfe\xba\x03T\x02b\xfd\xbb\x02E\xfd\ +\x9e\x98\xfdD\x02\x83\xfd}\x02\xbc\x00\x00\x01\x00'\x00\ +\x00\x04\x08\x04H\x00\x11\x00;@\x22\x0f\x02\x11\x01\x10\ +\x0d\x04\x0a\x07\x09\x06\x0b\x0c\x13\x12\x0a\x11\x00\x11GY\ +\x07\x0d\x0f\x04\x00\x00\x02\x0c\x0f\x15\x05\x02\x0f\x00?3\ +?3\x129/9\x1293+\x11\x003\x11\x12\x01\ +\x17910\x13!\x013\x01\x013\x01!\x15!\x01\ +#\x01\x01#\x01!u\x01\x12\xfe\xb4\xbd\x01!\x01 \ +\xbb\xfe\xb2\x01\x18\xfe\xe2\x01h\xbc\xfe\xcd\xfe\xca\xbc\x01\ +f\xfe\xe8\x02w\x01\xd1\xfe\x5c\x01\xa4\xfe/\x81\xfe\x0a\ +\x01\xbc\xfeD\x01\xf6\x00\x00\x02\x00\x83\x00\x00\x047\x05\ +\xb6\x00\x0a\x00\x13\x004@\x1a\x04\x13\x13\x07\x0f\x00\x07\ +\x00\x15\x14\x03\x0cIY\x03\x03\x08\x05\x08\x12JY\x08\ +\x12\x05\x03\x00??+\x11\x12\x009\x18/+\x11\x12\ +\x0199\x113\x113\x11310\x134$!3\ +\x113\x11! $\x01#\x22\x06\x15\x14\x1633\x83\ +\x01$\x01 \xc6\xaa\xfec\xfe\xf5\xfe\xf4\x03\x0a\xba\xde\ +\xc2\xb6\xcb\xd9\x01\xa4\xd4\xce\x02p\xfaJ\xd5\x01\xdb|\ +\x8e\x8f\x84\xff\xff\x00s\xff\xec\x047\x06\x14\x02\x06\x00\ +G\x00\x00\x00\x02\x00\x83\xff\xec\x06w\x05\xb6\x00\x19\x00\ +#\x00F@$\x1e\x03\x18\x0a\x0a\x07#\x0f\x12\x12#\ +\x03\x03$%\x06\x1bIY\x18\x06\x10\x06\x10\x00\x08\x03\ +\x0c \x00 JY\x15\x00\x13\x00?2+\x11\x003\ +\x18?\x1299//9+\x11\x12\x01\x179\x113\ +\x1133\x129\x11310\x05\x22&54$!\ +3\x113\x11\x143265\x113\x11\x14\x06#\x22\ +&'\x06\x13#\x22\x06\x15\x10!265\x02N\xe2\ +\xe9\x01*\x01\x22\x91\xaa\xe6dy\xaa\xcf\xb8v\x9f3\ +q)\x97\xd4\xc2\x01!\x7f\x8d\x12\xd1\xd0\xd9\xde\x02p\ +\xfb\xb7\xec{n\x01\xe6\xfe\x18\xae\xceRZ\xaa\x02\xc0\ +\x8b\x96\xfe\xf4wp\x00\x00\x02\x00s\xff\xec\x06\x87\x06\ +\x14\x00\x22\x00.\x00Q@),\x13\x0c \x1d\x1a\ +&\x03\x06\x06&\x13\x03/0\x1e\x00\x0d\x10\x1a\x16\x04\ +\x04\x10\x16\x16*FY\x16\x10\x00#\x10#FY\x09\ +\x10\x16\x00?3+\x11\x003\x18?+\x11\x12\x009\ +\x18/\x129\x129?\x11\x12\x01\x179\x113\x113\ +33\x129\x11310%265\x113\x11\x14\ +\x06#\x22&'#\x06\x06#\x22\x02\x11\x10\x1232\ +\x16\x173&&5\x113\x11\x14\x16!2655\ +4&# \x11\x14\x16\x04\xfevk\xa8\xc8\xbd\x81\x9e\ ++\x08K\xb9\x81\xd0\xe8\xe7\xcfj\x9f?\x0c\x02\x08\xa6\ +m\xfd\xb9\xa2\x92\x94\xa2\xfe\xe2\x8bw\x84\x88\x019\xfe\ +\xbd\xc8\xc5[qq[\x01)\x01\x0c\x01\x0c\x01/M\ +U\x11p\x1b\x01\xbe\xfb\x8c\xa0\x89\xb9\xce#\xe7\xc9\xfe\ +N\xd6\xd2\x00\x01\x00N\xff\xec\x06\x81\x05\xcb\x00*\x00\ +K@(\x06\x13(\x19\x1f\x22\x22\x16\x19\x13\x01\x0d\x06\ ++,\x17\x02\x01\x02\x01JY\x02 \x02 %\x10%\ +\x1cIY%\x13\x10\x09JY\x10\x04\x00?+\x00\x18\ +?+\x11\x12\x0099\x18//+\x11\x12\x009\x11\ +\x12\x01\x179\x113\x113\x11310\x01#53\ +2654&#\x22\x06\x07'6632\x16\x15\ +\x14\x06\x07\x15\x04\x13\x16\x163265\x113\x11\x14\ +\x06#\x22&'&&\x01\xae\xc9\xc1\xc0\xd5\x9a\x80g\ +\xb1gT]\xf6\x82\xd6\xf5\xb2\x9c\x01b\x06\x02l|\ +wp\xa8\xd2\xbd\xca\xd0\x02\x02\xcd\x02\xac\x8f\x93\x84l\ +\x7f7ErHP\xc4\xa7\x8d\xb7\x1a\x083\xfe\xd1\x96\ +\x7fy\x87\x01\xcd\xfe)\xc6\xc7\xd1\xc8\x96\x91\x00\x01\x00\ +P\xff\xec\x05\xc5\x04\x5c\x00%\x00K@(\x12\x1e\x0a\ +$\x02\x05\x05$\x1e \x0e\x18\x06&'!\x0f\x0e\x0f\ +\x0eFY\x0f\x03\x0f\x03\x08\x1b\x1b\x14FY\x1b\x10\x08\ +\x00FY\x08\x16\x00?+\x00\x18?+\x11\x12\x009\ +9\x18//+\x11\x12\x009\x11\x12\x01\x179\x113\ +\x113\x11310%2\x11\x113\x11\x14\x06# \ +\x03&&##53 54#\x22\x06\x07'6\ +632\x16\x15\x14\x07\x15\x16\x16\x17\x16\x04B\xdd\xa6\ +\xbb\xc4\xfe\x86\x10\x05\x8d\x94\x8co\x01!\xf2K\x87M\ +9U\xa3h\xb8\xd3\xc0c{\x05\x09w\x01\x0c\x019\ +\xfe\xbd\xca\xc3\x01McX\x8d\xac\xa2$\x22\x87($\ +\x9b\x86\xb89\x08\x14zj\xd3\x00\x01\x00N\xfe\x83\x04\ +\xd1\x05\xcb\x00#\x00J@(\x19\x1a\x1e#! \ +\x16\x1a#\x04\x10\x06$%\x1a\x05\x04\x05\x04JY\x05\ +\x05#\x13#\x1eIY#\x12!\x22\x13\x0cJY\x13\ +\x04\x00?+\x00\x18??+\x11\x12\x009\x18/+\ +\x11\x12\x009\x11\x12\x01\x179\x113\x113\x1131\ +0\x014&##532654&#\x22\x06\ +\x07'6632\x16\x15\x14\x06\x07\x15\x16\x16\x15\x11\ +3\x11#\x11#\x03\x83\xe5\xe2\xd9\xd1\xcd\xe1\xa4\x87i\ +\xc3iTa\xfe\x84\xdc\xfd\xbd\xa3\xb8\xc3\xac\xa2\xac\x01\ +\x9c\x85\x8b\x8f\x93\x84k\x80:BrJN\xc4\xa7\x8c\ +\xb7\x19\x08\x19\xb3\x94\xfe\xfe\xfd\xe9\x01}\x00\x00\x01\x00\ +P\xfe\x87\x04\x10\x04Z\x00\x1e\x00J@(\x07\x12\x19\ +\x1e\x1c\x1b\x1b\x15\x1e\x12\x03\x0d\x06 \x1f\x15\x04\x03\x04\ +\x03FY\x04\x04\x1e\x0f\x1e\x19FY\x1e\x15\x1c\x22\x0f\ +\x0aFY\x0f\x10\x00?+\x00\x18??+\x11\x12\x00\ +9\x18/+\x11\x12\x009\x11\x12\x01\x179\x113\x11\ +3\x11310\x014!#53 54&#\ +\x22\x07'632\x16\x15\x14\x07\x15\x16\x16\x15\x153\ +\x11#\x11#\x02\xd5\xfe\xcb\x96u\x019\x85w\x99\x96\ +=\xa1\xcb\xbf\xd5\xcb~p\x9d\xa6\x95\x01-\xc7\x8d\xac\ +RPF\x87J\x9a\x87\xb69\x0b%\x89f\x9c\xfd\xf8\ +\x01y\x00\x00\x01\x00\x00\xff\xe9\x07!\x05\xb6\x00#\x00\ +:@\x1d\x14#\x1a\x1d\x1d#\x09\x03$%\x1b\x1b\x07\ +\x12\x12\x01IY\x12\x03\x17\x0c\x07\x0cJY \x07\x13\ +\x00?3+\x11\x003\x18?+\x11\x12\x009\x18/\ +\x11\x12\x01\x179\x113\x11310\x01!\x07\x02\x02\ +\x06\x06#\x22'5\x163266\x12\x12\x13!\x11\ +\x14\x163265\x113\x11\x14\x06#\x22&5\x04\ +\x0c\xfeH\x1f+LS\x82dE@2?1@,\ +8J7\x02\xefospq\xa8\xcd\xbc\xc4\xc8\x05\x1f\ +\xf0\xfe\xae\xfeD\xd2f\x19\x8f\x1a>h\x01\x02\x01\xe9\ +\x01\xae\xfb\xcf\x89yy\x87\x01\xcd\xfe)\xc1\xcc\xcc\xc5\ +\x00\x00\x01\x00\x10\xff\xec\x06)\x04F\x00\x1d\x00:@\ +\x1d\x00\x0e\x05\x08\x08\x0e\x16\x03\x1f\x1e\x06\x06\x14\x1c\x1c\ +\x10FY\x1c\x0f\x03\x19\x14\x19GY\x0b\x14\x16\x00?\ +3+\x11\x003\x18?+\x11\x12\x009\x18/\x11\x12\ +\x01\x179\x113\x11310\x01\x14\x1632\x11\x11\ +3\x11\x14\x06#\x22&5\x11!\x02\x02\x06#\x22'\ +5\x1632\x12\x13!\x03\xcfhw\xd5\xa6\xbb\xbe\xbc\ +\xcb\xfe\xc5\x1c^\x98v:\x1c\x16\x1cq\x89\x22\x02q\ +\x01\x83\x89\x83\x01\x0a\x01;\xfe\xbd\xca\xc3\xc4\xcb\x02=\ +\xfe\x98\xfed\xc0\x0a\x7f\x06\x01\xd9\x01\xf6\x00\x00\x01\x00\ +\xc9\xff\xec\x07^\x05\xb6\x00\x19\x00C@#\x17\x00\x0f\ +\x06\x09\x16\x12\x12\x13\x09\x0f\x13\x03\x1a\x1b\x16\x11IY\ +\x16\x07\x16\x07\x13\x18\x14\x03\x13\x12\x0c\x03IY\x0c\x13\ +\x00?+\x00\x18??3\x1299//+\x11\x12\ +\x01\x179\x113\x113\x113\x113310\x01\x14\ +\x163265\x113\x11\x14\x06#\x22&5\x11!\ +\x11#\x113\x11!\x113\x04\xf6nspq\xa6\xc8\ +\xbf\xc3\xc8\xfd'\xaa\xaa\x02\xd9\xaa\x01\x85\x89yy\x87\ +\x01\xcd\xfe)\xbf\xce\xcb\xc6\x013\xfdP\x05\xb6\xfd\x92\ +\x02n\x00\x00\x01\x00\xb0\xff\xec\x06\xa8\x04H\x00\x18\x00\ +M@*\x05\x02\x13\x0a\x0d\x01\x16\x16\x17\x0d\x13\x17\x03\ +\x19\x1a\x01\x15FY\x0f\x01\x1f\x01\x02\x0b\x03\x01\x0b\x01\ +\x0b\x17\x03\x18\x0f\x17\x15\x10\x08FY\x10\x16\x00?+\ +\x00\x18??3\x1299//_^]+\x11\x12\ +\x01\x179\x113\x113\x113\x113310\x01\x11\ +!\x113\x11\x14\x1632\x11\x113\x11\x14\x06#\x22\ +&55!\x11#\x11\x01V\x02P\xa6jw\xd5\xa6\ +\xbb\xc0\xba\xcd\xfd\xb0\xa6\x04H\xfe5\x01\xcb\xfd=\x89\ +\x85\x01\x0c\x019\xfe\xbd\xca\xc3\xc6\xc9s\xfe\x12\x04H\ +\x00\x00\x01\x00}\xff\xec\x05\x9a\x05\xcb\x00\x1c\x00:@\ +\x1f\x16\x08\x1b\x02\x02\x0f\x1c\x08\x04\x1d\x1e\x00\x1cIY\ +\x00\x00\x05\x0c\x0c\x13IY\x0c\x04\x05\x19IY\x05\x13\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x01\x179\x113\x11310\x01!\x15\x10\x00! \ +\x00\x114\x12$32\x16\x17\x07&&# \x00\x11\ +\x10\x003 \x11!\x03f\x024\xfe\xcc\xfe\xc9\xfe\xbb\ +\xfe\x93\xb3\x01U\xeax\xedSBZ\xd6W\xfe\xf5\xfe\ +\xde\x01\x0b\xf7\x01\xb4\xfe\x7f\x02\xf0V\xfe\xa1\xfe\xb1\x01\ +\x91\x01`\xe5\x01T\xb51'\x94&.\xfe\xc5\xfe\xe3\ +\xfe\xe3\xfe\xc3\x01\xd7\x00\x00\x01\x00s\xff\xec\x04\xb0\x04\ +\x5c\x00\x19\x00:@\x1f\x12\x07\x18\x02\x02\x0c\x19\x07\x04\ +\x1a\x1b\x00\x19FY\x00\x00\x04\x0a\x0a\x0fFY\x0a\x10\ +\x04\x15FY\x04\x16\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x01\x179\x113\x11310\x01\ +!\x15\x10! \x00\x11\x10\x00!2\x17\x07&#\x22\ +\x06\x15\x14\x163265!\x02\xb2\x01\xfe\xfd\xfe\xfe\ +\xee\xfe\xd7\x01C\x01!\xd4\xaf;\xa8\xa6\xcd\xe5\xcc\xc5\ +\xa9\xaf\xfe\xaa\x02?C\xfd\xf0\x01'\x01\x10\x01\x0e\x01\ ++P\x83J\xde\xd2\xcf\xdf\xa0\x9d\x00\x00\x01\x00\x10\xff\ +\xec\x04\xf4\x05\xb6\x00\x14\x009@\x1d\x05\x13\x0a\x0d\x0d\ +\x03\x13\x00\x04\x15\x16\x0b\x0b\x10\x01\x10\x08IY\x10\x13\ +\x04\x00\x01\x00IY\x01\x03\x00?+\x11\x003\x18?\ ++\x11\x12\x009\x18/\x11\x12\x01\x179\x113\x113\ +10\x135!\x15!\x11\x14\x1632\x11\x113\x11\ +\x14\x06#\x22&5\x11\x10\x04<\xfe/wr\xe8\xa8\ +\xd3\xbd\xc6\xcd\x05\x1d\x99\x99\xfch\x89{\x01\x00\x01\xcf\ +\xfe)\xc0\xcd\xce\xc3\x03\xa0\x00\x00\x01\x00)\xff\xec\x04\ +\x87\x04F\x00\x14\x006@\x1c\x02\x10\x07\x0a\x0a\x00\x10\ +\x12\x04\x15\x16\x01\x12\x13\x12FY\x08\x08\x0d\x13\x0f\x0d\ +\x05FY\x0d\x16\x00?+\x00\x18?\x129/+\x11\ +\x003\x11\x12\x01\x179\x113\x11310\x01!\x11\ +\x14\x1632\x11\x113\x11\x14\x06#\x22&5\x11!\ +5!\x03\x81\xfe\xa6mv\xd7\xa6\xbd\xc0\xc0\xc9\xfe\xa8\ +\x03X\x03\xba\xfd\xc9\x89\x83\x01\x04\x01A\xfe\xbd\xca\xc3\ +\xcb\xc4\x02?\x8c\x00\x01\x00o\xff\xec\x04X\x05\xcb\x00\ +&\x00G@&\x15 \x0c\x00$#\x05\x1b\x11#\x00\ + \x06'(#\x0f\x12\x0f\x12JY\x0f\x0f\x1d\x03\x1d\ +\x18JY\x1d\x13\x03\x09JY\x03\x04\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x009\x11\x12\x01\ +\x179\x113\x113\x11310\x134$3 \x17\ +\x07&&#\x22\x06\x15\x14\x1633\x15#\x22\x06\x15\ +\x14\x16327\x15\x06! $54675&\ +&\x9c\x01\x08\xe1\x01\x02\xd1^i\xb5e\x8c\x9f\xd1\xc8\ +\xd9\xd5\xde\xe8\xca\xb7\xe9\xc7\xaf\xfe\xfb\xfe\xf4\xfe\xdb\xcf\ +\xbc\xaa\xb4\x04\x5c\xa9\xc6\x90xD4{r\x80\x93\x8d\ +\x8e\x8a\x8e\x8d\x5c\x9eM\xdc\xc5\x97\xc0\x16\x08\x19\xb2\xff\ +\xff\x00Z\xff\xec\x03\x87\x04\x5c\x02\x06\x01\x82\x00\x00\xff\ +\xff\x00\x00\xfeu\x05k\x05\xb6\x00&\x01\xb5\x00\x00\x00\ +\x07\x03\x80\x03\xfa\x00\x00\xff\xff\x00\x10\xfeu\x04s\x04\ +H\x02&\x01\xd5\x00\x00\x00\x07\x03\x81\x03\x02\x00\x00\xff\ +\xff\x00\x00\xfe\xa0\x05\x10\x05\xbc\x02&\x00$\x00\x00\x00\ +\x07\x02g\x04\xe9\x00\x00\xff\xff\x00^\xfe\xa0\x03\xcd\x04\ +Z\x02&\x00D\x00\x00\x00\x07\x02g\x04y\x00\x00\xff\ +\xff\x00\x00\x00\x00\x05\x10\x07\xe1\x02&\x00$\x00\x00\x01\ +\x07\x02f\x04\xfc\x01R\x00\x08\xb3\x02\x13\x05&\x00+\ +5\xff\xff\x00^\xff\xec\x03\xcd\x06\x8f\x02&\x00D\x00\ +\x00\x01\x07\x02f\x04\xa6\x00\x00\x00\x08\xb3\x02)\x11&\ +\x00+5\xff\xff\x00\x00\x00\x00\x05\x10\x07\xd1\x02&\x00\ +$\x00\x00\x01\x07\x03w\x04\xe5\x01R\x00\x0a\xb4\x03\x02\ +\x15\x05&\x00+55\xff\xff\x00^\xff\xec\x04A\x06\ +\x7f\x02&\x00D\x00\x00\x01\x07\x03w\x04\x93\x00\x00\x00\ +\x0a\xb4\x03\x02+\x11&\x00+55\xff\xff\x00\x00\x00\ +\x00\x05\x10\x07\xd1\x02&\x00$\x00\x00\x01\x07\x03x\x04\ +\xdd\x01R\x00\x0a\xb4\x03\x02\x15\x05&\x00+55\xff\ +\xff\x00-\xff\xec\x03\xcd\x06\x7f\x02&\x00D\x00\x00\x01\ +\x07\x03x\x04\x93\x00\x00\x00\x0a\xb4\x03\x02+\x11&\x00\ ++55\xff\xff\x00\x00\x00\x00\x05\x10\x08J\x02&\x00\ +$\x00\x00\x01\x07\x03y\x04\xd9\x01R\x00\x0a\xb4\x03\x02\ +\x15\x05&\x00+55\xff\xff\x00^\xff\xec\x04\x17\x06\ +\xf8\x02&\x00D\x00\x00\x01\x07\x03y\x04\x9c\x00\x00\x00\ +\x0a\xb4\x03\x02+\x11&\x00+55\xff\xff\x00\x00\x00\ +\x00\x05\x10\x08b\x02&\x00$\x00\x00\x01\x07\x03z\x04\ +\xe5\x01R\x00\x0a\xb4\x03\x02-\x05&\x00+55\xff\ +\xff\x00^\xff\xec\x03\xcd\x07\x10\x02&\x00D\x00\x00\x01\ +\x07\x03z\x04\x91\x00\x00\x00\x0a\xb4\x03\x02C\x11&\x00\ ++55\xff\xff\x00\x00\xfe\xa0\x05\x10\x07s\x02&\x00\ +$\x00\x00\x00'\x02g\x04\xe9\x00\x00\x01\x07\x01K\x00\ ++\x01R\x00\x08\xb3\x03)\x05&\x00+5\xff\xff\x00\ +^\xfe\xa0\x03\xcd\x06!\x02&\x00D\x00\x00\x00'\x02\ +g\x04y\x00\x00\x01\x06\x01K\xd4\x00\x00\x08\xb3\x03>\ +\x11&\x00+5\xff\xff\x00\x00\x00\x00\x05\x10\x08\x13\x02\ +&\x00$\x00\x00\x01\x07\x03{\x04\xec\x01R\x00\x0a\xb4\ +\x03\x02\x17\x05&\x00+55\xff\xff\x00^\xff\xec\x03\ +\xcd\x06\xc1\x02&\x00D\x00\x00\x01\x07\x03{\x04\x9a\x00\ +\x00\x00\x0a\xb4\x03\x02-\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05\x10\x08\x13\x02&\x00$\x00\x00\x01\x07\x03\ +|\x04\xe9\x01R\x00\x0a\xb4\x03\x02\x17\x05&\x00+5\ +5\xff\xff\x00^\xff\xec\x03\xcd\x06\xc1\x02&\x00D\x00\ +\x00\x01\x07\x03|\x04\x98\x00\x00\x00\x0a\xb4\x03\x02-\x11\ +&\x00+55\xff\xff\x00\x00\x00\x00\x05\x10\x08X\x02\ +&\x00$\x00\x00\x01\x07\x03}\x04\xe9\x01R\x00\x0a\xb4\ +\x03\x02!\x05&\x00+55\xff\xff\x00^\xff\xec\x03\ +\xcd\x07\x06\x02&\x00D\x00\x00\x01\x07\x03}\x04\xa0\x00\ +\x00\x00\x0a\xb4\x03\x027\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05\x10\x08^\x02&\x00$\x00\x00\x01\x07\x03\ +~\x04\xe3\x01R\x00\x0a\xb4\x03\x02'\x05&\x00+5\ +5\xff\xff\x00^\xff\xec\x03\xcd\x07\x0c\x02&\x00D\x00\ +\x00\x01\x07\x03~\x04\x98\x00\x00\x00\x0a\xb4\x03\x02=\x11\ +&\x00+55\xff\xff\x00\x00\xfe\xa0\x05\x10\x07I\x02\ +&\x00$\x00\x00\x00'\x01N\x00-\x01d\x01\x07\x02\ +g\x04\xe9\x00\x00\x00\x08\xb3\x02\x0f\x05&\x00+5\xff\ +\xff\x00^\xfe\xa0\x03\xcd\x05\xe5\x02&\x00D\x00\x00\x00\ +&\x01N\xd8\x00\x01\x07\x02g\x04y\x00\x00\x00\x08\xb3\ +\x02%\x11&\x00+5\xff\xff\x00\xc9\xfe\xa0\x03\xf8\x05\ +\xb6\x02&\x00(\x00\x00\x00\x07\x02g\x04\xc1\x00\x00\xff\ +\xff\x00s\xfe\xa0\x04\x12\x04\x5c\x02&\x00H\x00\x00\x00\ +\x07\x02g\x04\xb8\x00\x00\xff\xff\x00\xc9\x00\x00\x03\xf8\x07\ +\xe1\x02&\x00(\x00\x00\x01\x07\x02f\x04\xd1\x01R\x00\ +\x08\xb3\x01\x10\x05&\x00+5\xff\xff\x00s\xff\xec\x04\ +\x12\x06\x8f\x02&\x00H\x00\x00\x01\x07\x02f\x04\xc9\x00\ +\x00\x00\x08\xb3\x02\x1f\x11&\x00+5\xff\xff\x00\xc9\x00\ +\x00\x03\xf8\x07/\x02&\x00(\x00\x00\x01\x07\x01R\xff\ +\xe4\x01R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\ +s\xff\xec\x04\x12\x05\xdd\x02&\x00H\x00\x00\x01\x06\x01\ +R\xd0\x00\x00\x08\xb3\x02$\x11&\x00+5\xff\xff\x00\ +\xc9\x00\x00\x04o\x07\xd1\x02&\x00(\x00\x00\x01\x07\x03\ +w\x04\xc1\x01R\x00\x0a\xb4\x02\x01\x12\x05&\x00+5\ +5\xff\xff\x00s\xff\xec\x04\x5c\x06\x7f\x02&\x00H\x00\ +\x00\x01\x07\x03w\x04\xae\x00\x00\x00\x0a\xb4\x03\x02!\x11\ +&\x00+55\xff\xff\x00]\x00\x00\x03\xf8\x07\xd1\x02\ +&\x00(\x00\x00\x01\x07\x03x\x04\xc3\x01R\x00\x0a\xb4\ +\x02\x01\x12\x05&\x00+55\xff\xff\x00J\xff\xec\x04\ +\x12\x06\x7f\x02&\x00H\x00\x00\x01\x07\x03x\x04\xb0\x00\ +\x00\x00\x0a\xb4\x03\x02!\x11&\x00+55\xff\xff\x00\ +\xc9\x00\x00\x049\x08J\x02&\x00(\x00\x00\x01\x07\x03\ +y\x04\xbe\x01R\x00\x0a\xb4\x02\x01\x12\x05&\x00+5\ +5\xff\xff\x00s\xff\xec\x04\x1d\x06\xf8\x02&\x00H\x00\ +\x00\x01\x07\x03y\x04\xa2\x00\x00\x00\x0a\xb4\x03\x02!\x11\ +&\x00+55\xff\xff\x00\xc9\x00\x00\x03\xf8\x08b\x02\ +&\x00(\x00\x00\x01\x07\x03z\x04\xb8\x01R\x00\x0a\xb4\ +\x02\x01*\x05&\x00+55\xff\xff\x00s\xff\xec\x04\ +\x12\x07\x10\x02&\x00H\x00\x00\x01\x07\x03z\x04\xa2\x00\ +\x00\x00\x0a\xb4\x03\x029\x11&\x00+55\xff\xff\x00\ +\xc9\xfe\xa0\x03\xf8\x07s\x02&\x00(\x00\x00\x00'\x02\ +g\x04\xbe\x00\x00\x01\x07\x01K\x00\x02\x01R\x00\x08\xb3\ +\x02%\x05&\x00+5\xff\xff\x00s\xfe\xa0\x04\x12\x06\ +!\x02&\x00H\x00\x00\x00'\x02g\x04\xb0\x00\x00\x01\ +\x06\x01K\xf1\x00\x00\x08\xb3\x034\x11&\x00+5\xff\ +\xff\x00T\x00\x00\x02V\x07\xe1\x02&\x00,\x00\x00\x01\ +\x07\x02f\x03\xc9\x01R\x00\x08\xb3\x01\x10\x05&\x00+\ +5\xff\xff\x00{\x00\x00\x01\xe6\x06\x8f\x02&\x00\xf3\x00\ +\x00\x01\x07\x02f\x03s\x00\x00\x00\x08\xb3\x01\x08\x11&\ +\x00+5\xff\xff\x00T\xfe\xa0\x02V\x05\xb6\x02&\x00\ +,\x00\x00\x00\x07\x02g\x03\xb4\x00\x00\xff\xff\x00\x9d\xfe\ +\xa0\x01f\x05\xdf\x02&\x00L\x00\x00\x00\x07\x02g\x03\ +b\x00\x00\xff\xff\x00}\xfe\xa0\x05\xbe\x05\xcd\x02&\x00\ +2\x00\x00\x00\x07\x02g\x05\x7f\x00\x00\xff\xff\x00s\xfe\ +\xa0\x04b\x04\x5c\x02&\x00R\x00\x00\x00\x07\x02g\x04\ +\xc9\x00\x00\xff\xff\x00}\xff\xec\x05\xbe\x07\xe1\x02&\x00\ +2\x00\x00\x01\x07\x02f\x05\x8f\x01R\x00\x08\xb3\x02\x1c\ +\x05&\x00+5\xff\xff\x00s\xff\xec\x04b\x06\x8f\x02\ +&\x00R\x00\x00\x01\x07\x02f\x04\xd9\x00\x00\x00\x08\xb3\ +\x02\x1d\x11&\x00+5\xff\xff\x00}\xff\xec\x05\xbe\x07\ +\xd1\x02&\x002\x00\x00\x01\x07\x03w\x05}\x01R\x00\ +\x0a\xb4\x03\x02\x1e\x05&\x00+55\xff\xff\x00s\xff\ +\xec\x04u\x06\x7f\x02&\x00R\x00\x00\x01\x07\x03w\x04\ +\xc7\x00\x00\x00\x0a\xb4\x03\x02\x1f\x11&\x00+55\xff\ +\xff\x00}\xff\xec\x05\xbe\x07\xd1\x02&\x002\x00\x00\x01\ +\x07\x03x\x05}\x01R\x00\x0a\xb4\x03\x02\x1e\x05&\x00\ ++55\xff\xff\x00a\xff\xec\x04b\x06\x7f\x02&\x00\ +R\x00\x00\x01\x07\x03x\x04\xc7\x00\x00\x00\x0a\xb4\x03\x02\ +\x1f\x11&\x00+55\xff\xff\x00}\xff\xec\x05\xbe\x08\ +J\x02&\x002\x00\x00\x01\x07\x03y\x05{\x01R\x00\ +\x0a\xb4\x03\x02\x1e\x05&\x00+55\xff\xff\x00s\xff\ +\xec\x04b\x06\xf8\x02&\x00R\x00\x00\x01\x07\x03y\x04\ +\xc7\x00\x00\x00\x0a\xb4\x03\x02\x1f\x11&\x00+55\xff\ +\xff\x00}\xff\xec\x05\xbe\x08b\x02&\x002\x00\x00\x01\ +\x07\x03z\x05y\x01R\x00\x0a\xb4\x03\x026\x05&\x00\ ++55\xff\xff\x00s\xff\xec\x04b\x07\x10\x02&\x00\ +R\x00\x00\x01\x07\x03z\x04\xc5\x00\x00\x00\x0a\xb4\x03\x02\ +7\x11&\x00+55\xff\xff\x00}\xfe\xa0\x05\xbe\x07\ +s\x02&\x002\x00\x00\x00'\x02g\x05\x7f\x00\x00\x01\ +\x07\x01K\x00\xc1\x01R\x00\x08\xb3\x031\x05&\x00+\ +5\xff\xff\x00s\xfe\xa0\x04b\x06!\x02&\x00R\x00\ +\x00\x00'\x02g\x04\xcd\x00\x00\x01\x06\x01K\x0e\x00\x00\ +\x08\xb3\x032\x11&\x00+5\xff\xff\x00}\xff\xec\x06\ +d\x07s\x02&\x02_\x00\x00\x01\x07\x00v\x01+\x01\ +R\x00\x08\xb3\x02+\x05&\x00+5\xff\xff\x00s\xff\ +\xec\x05\x19\x06!\x02&\x02`\x00\x00\x01\x06\x00vm\ +\x00\x00\x08\xb3\x02+\x11&\x00+5\xff\xff\x00}\xff\ +\xec\x06d\x07s\x02&\x02_\x00\x00\x01\x07\x00C\x00\ +\x87\x01R\x00\x08\xb3\x02#\x05&\x00+5\xff\xff\x00\ +s\xff\xec\x05\x19\x06!\x02&\x02`\x00\x00\x01\x06\x00\ +C\xd4\x00\x00\x08\xb3\x02$\x11&\x00+5\xff\xff\x00\ +}\xff\xec\x06d\x07\xe1\x02&\x02_\x00\x00\x01\x07\x02\ +f\x05\x8f\x01R\x00\x08\xb3\x02&\x05&\x00+5\xff\ +\xff\x00s\xff\xec\x05\x19\x06\x8f\x02&\x02`\x00\x00\x01\ +\x07\x02f\x04\xd9\x00\x00\x00\x08\xb3\x02'\x11&\x00+\ +5\xff\xff\x00}\xff\xec\x06d\x07/\x02&\x02_\x00\ +\x00\x01\x07\x01R\x00\xa0\x01R\x00\x08\xb3\x02+\x05&\ +\x00+5\xff\xff\x00s\xff\xec\x05\x19\x05\xdd\x02&\x02\ +`\x00\x00\x01\x06\x01R\xf5\x00\x00\x08\xb3\x02#\x11&\ +\x00+5\xff\xff\x00}\xfe\xa0\x06d\x06\x14\x02&\x02\ +_\x00\x00\x00\x07\x02g\x05{\x00\x00\xff\xff\x00s\xfe\ +\xa0\x05\x19\x04\xf0\x02&\x02`\x00\x00\x00\x07\x02g\x04\ +\xc9\x00\x00\xff\xff\x00\xba\xfe\xa0\x05\x19\x05\xb6\x02&\x00\ +8\x00\x00\x00\x07\x02g\x05J\x00\x00\xff\xff\x00\xa4\xfe\ +\xa0\x049\x04H\x02&\x00X\x00\x00\x00\x07\x02g\x04\ +\xb8\x00\x00\xff\xff\x00\xba\xff\xec\x05\x19\x07\xe1\x02&\x00\ +8\x00\x00\x01\x07\x02f\x05T\x01R\x00\x08\xb3\x01\x16\ +\x05&\x00+5\xff\xff\x00\xa4\xff\xec\x049\x06\x8f\x02\ +&\x00X\x00\x00\x01\x07\x02f\x04\xd5\x00\x00\x00\x08\xb3\ +\x01\x19\x11&\x00+5\xff\xff\x00\xba\xff\xec\x06{\x07\ +s\x02&\x02a\x00\x00\x01\x07\x00v\x00\xee\x01R\x00\ +\x08\xb3\x01%\x05&\x00+5\xff\xff\x00\xa4\xff\xec\x05\ +\x96\x06!\x02&\x02b\x00\x00\x01\x06\x00vy\x00\x00\ +\x08\xb3\x01&\x11&\x00+5\xff\xff\x00\xba\xff\xec\x06\ +{\x07s\x02&\x02a\x00\x00\x01\x07\x00C\x00Z\x01\ +R\x00\x08\xb3\x01\x1d\x05&\x00+5\xff\xff\x00\xa4\xff\ +\xec\x05\x96\x06!\x02&\x02b\x00\x00\x01\x06\x00C\xbb\ +\x00\x00\x08\xb3\x01\x1f\x11&\x00+5\xff\xff\x00\xba\xff\ +\xec\x06{\x07\xe1\x02&\x02a\x00\x00\x01\x07\x02f\x05\ +`\x01R\x00\x08\xb3\x01 \x05&\x00+5\xff\xff\x00\ +\xa4\xff\xec\x05\x96\x06\x8f\x02&\x02b\x00\x00\x01\x07\x02\ +f\x04\xdb\x00\x00\x00\x08\xb3\x01\x22\x11&\x00+5\xff\ +\xff\x00\xba\xff\xec\x06{\x07/\x02&\x02a\x00\x00\x01\ +\x07\x01R\x00\x7f\x01R\x00\x08\xb3\x01%\x05&\x00+\ +5\xff\xff\x00\xa4\xff\xec\x05\x96\x05\xdd\x02&\x02b\x00\ +\x00\x01\x06\x01R\xff\x00\x00\x08\xb3\x01\x1e\x11&\x00+\ +5\xff\xff\x00\xba\xfe\xa0\x06{\x06\x14\x02&\x02a\x00\ +\x00\x00\x07\x02g\x05L\x00\x00\xff\xff\x00\xa4\xfe\xa0\x05\ +\x96\x04\xf2\x02&\x02b\x00\x00\x00\x07\x02g\x04\xb2\x00\ +\x00\xff\xff\x00\x00\xfe\xa0\x04{\x05\xb6\x02&\x00<\x00\ +\x00\x00\x07\x02g\x04\x9c\x00\x00\xff\xff\x00\x02\xfe\x14\x04\ +\x06\x04H\x02&\x00\x5c\x00\x00\x00\x07\x02g\x05\x9e\xff\ +\xfd\xff\xff\x00\x00\x00\x00\x04{\x07\xe1\x02&\x00<\x00\ +\x00\x01\x07\x02f\x04\xaa\x01R\x00\x08\xb3\x01\x0d\x05&\ +\x00+5\xff\xff\x00\x02\xfe\x14\x04\x06\x06\x8f\x02&\x00\ +\x5c\x00\x00\x01\x07\x02f\x04j\x00\x00\x00\x08\xb3\x01\x1a\ +\x11&\x00+5\xff\xff\x00\x00\x00\x00\x04{\x07/\x02\ +&\x00<\x00\x00\x01\x07\x01R\xff\xc2\x01R\x00\x08\xb3\ +\x01\x12\x05&\x00+5\xff\xff\x00\x02\xfe\x14\x04\x06\x05\ +\xdd\x02&\x00\x5c\x00\x00\x01\x06\x01R\x8a\x00\x00\x08\xb3\ +\x01\x1f\x11&\x00+5\xff\xff\x00s\xfe\xc5\x04\xd3\x06\ +\x14\x02&\x00\xd3\x00\x00\x00\x07\x00B\x00\xb4\x00\x00\x00\ +\x02\xfb\xe5\x04\xd9\xfe\xb4\x06!\x00\x09\x00\x13\x00\x1e@\ +\x0c\x04\x0a\x0e\x0e\x00\x00\x15\x0f\x06\x80\x0b\x01\x00/3\ +\x1a\xcd2\x11\x013\x113\x129910\x01#&\ +&'53\x16\x16\x17\x05#&&'53\x16\x16\ +\x17\xfe\xb4`4\xb1%\xba\x1cc1\xfe\x9c`8\xae\ +%\xbb\x1cc1\x04\xd9*\xca?\x15=\xaeD\x19,\ +\xc8?\x15=\xaeD\x00\x00\x02\xfcq\x04\xd9\xff\xae\x06\ +\x7f\x00\x0d\x00\x15\x00(@\x11\x15\x00\x06\x11\x11\x17\x03\ +\x06\x0a\x15\x0a\x15\x0a\x11\xc0\x06\x01\x00/3\x1a\xcc9\ +9//\x11\x129\x11\x013\x1139910\x01\ +#&'\x06\x07#57673\x16\x17'67\ +3\x15\x06\x07#\xfe\xd3^pcra^5p4\ +\xb0B\x97PI6\xacSx`\x04\xd9K[eA\ +\x19<{M^\xa6\xc2[p\x15n`\x00\x00\x02\xfb\ +\x9a\x04\xd9\xfe\xd7\x06\x7f\x00\x0d\x00\x15\x00*@\x12\x06\ +\x0e\x11\x11\x00\x00\x17\x03\x06\x0a\x0f\x0a\x0f\x0a\x13\xc0\x06\ +\x01\x00/3\x1a\xcc99//\x11\x129\x11\x013\ +\x113\x129910\x01#&'\x06\x07#57\ +673\x16\x17%#&'53\x16\x17\xfe\xd7^\ +arji^5p4\xb0B\x97\xfd\xee_xT\ +\xac4K\x04\xd9Ae`F\x17<{M^\xa6\xac\ +^p\x15la\x00\x02\xfcq\x04\xd9\xff{\x06\xf8\x00\ +\x0d\x00\x1f\x004@\x18\x10\x13\x00\x13\x1b\x03\x06\x06\x16\ +\x0e\x0e!\x03\x0a\x06\x12\x0a\x12\x0a\x19\x1e\xc0\x06\x01\x00\ +/3\x1a\xcc299//\x11\x129\x11\x013\x11\ +33\x12\x179\x11310\x01#&'\x06\x07#\ +57673\x16\x17\x13\x14\x07\x07#'665\ +4&#\x22\x075632\xfe\xd3^pcra\ +^5p4\xb0B\x97\xa8\x7f\x06P\x0a9?9+\ +.\x1a\x197\xc3\x04\xd9K[eA\x19<{M^\ +\xa6\x01{g\x1dQ\x83\x09 &%\x19\x06P\x06\x00\ +\x02\xfch\x04\xd9\xfe\xe7\x07\x10\x00\x17\x00%\x00:@\ +\x1b\x18\x1e\x09\x09\x15\x15'\x1b\x1e\x22\x1e\x19\x11\x09\x00\ +\x05\x0c\x22\x00\x0c\x0c\x00\x22\x03\x15\xc0\x19\x00/\x1a\xcc\ +\x179///\x113\x10\xc43\x113\x11\x129\x11\ +\x013\x113\x129910\x01\x22.\x02#\x22\x06\ +\x07#6632\x1e\x0232673\x06\x06\x13\ +#&'\x06\x07#57673\x16\x17\xfe-%\ +GC?\x1c(*\x0e[\x0deK%IC>\x1b\ +(*\x0cZ\x0bc^^arji^5p4\ +\xb0B\x97\x065\x1e%\x1e12jq\x1e$\x1e1\ +1hs\xfe\xa4Ae`F\x17<{M^\xa6\x00\ +\x02\xfcy\x04\xd9\xfe\xc7\x06\xc1\x00\x07\x00\x14\x00$@\ +\x0f\x07\x04\x0a\x0a\x12\x12\x16\x03@\x07\x11\x0a\x80\x0e\x08\ +\x00/3\x1a\xdd2\xd4\x1a\xcd\x11\x013\x113\x129\ +910\x01673\x15\x06\x07#\x13 \x033\x16\ +\x1632673\x06\x06\xfd^P1\xacVw`\ +>\xfe\xec\x0ff\x09LjbV\x08i\x0b\x95\x05\xf4\ +he\x15r]\xfe\xfc\x01\x04H9A@x\x8c\x00\ +\x02\xfcy\x04\xd9\xfe\xc7\x06\xc1\x00\x07\x00\x14\x00$@\ +\x0f\x07\x04\x0a\x0a\x12\x12\x16\x04@\x01\x11\x0a\x80\x0e\x08\ +\x00/3\x1a\xdd2\xd4\x1a\xcd\x11\x013\x113\x129\ +910\x01#&'53\x16\x17\x03 \x033\x16\ +\x1632673\x06\x06\xfd\xd1^wV\xac4K\ +5\xfe\xec\x0ff\x09LjbV\x08i\x0b\x95\x05\xdd\ +]r\x15la\xfe\xe5\x01\x04H9A@x\x8c\x00\ +\x02\xfcy\x04\xd9\xfe\xc7\x07\x06\x00\x11\x00\x1e\x00.@\ +\x15\x08\x00\x00\x05\x0d\x03\x14\x14\x1c\x1c \x0b\x10\x04\x04\ +\x18\x18\x1b\x14\x80\x12\x00/\x1a\xcd23\x119/\xc4\ +2\x11\x013\x113\x12\x179\x11310\x01\x14\x07\ +\x07#'6654&#\x22\x075632\x03\ + \x033\x16\x1632673\x06\x06\xfe1\x7f\x06\ +R\x0a9B9,%$\x16>\xc0\x95\xfe\xec\x0ff\ +\x09LjbV\x08i\x0b\x95\x06yd\x1d)Z\x09\ + %%\x1a\x06N\x08\xfd\xd3\x01\x04H9A@x\ +\x8c\x00\x02\xfch\x04\xd9\xfe\xe7\x07\x0c\x00\x17\x00$\x00\ +0@\x15\x1a\x22\x09\x09\x15&\x05\x0c\x0c\x1e\x1e\x18\x15\ +@\x11\x09\x00!\x1a\x80\x18\x00/\x1a\xdd2\xd6\xc43\ +\x1a\xcd\x113\x119/3\x11\x0132\x11991\ +0\x01\x22.\x02#\x22\x06\x07#6632\x1e\x02\ +32673\x06\x06\x03 \x033\x16\x16326\ +73\x06\x06\xfe-%GC?\x1c(*\x0e[\x0d\ +dL%IC>\x1b(*\x0cZ\x0bc\xdd\xfe\xec\ +\x0ff\x09LjbV\x08i\x0b\x95\x063\x1e$\x1e\ +02hq\x1e$\x1e11gr\xfe\xa6\x01\x04H\ +9A@x\x8c\x00\x01\x001\xfeB\x01m\x00\x00\x00\ +\x0f\x00\x1a@\x0b\x00\x05\x05\x02\x0a\x03\x10\x11\x0d\x08\x03\ +\x00/\xcc2\x11\x12\x01\x179\x11310\x174'\ +3\x16\x15\x14\x06#\x22'5\x16326\xdf\x8b{\ +\x9efcA2 6%3\xeeg\x87x\x84[g\ +\x10l\x0a0\x00\x00\x01\x00\x19\xfeu\x01q\x00\x9a\x00\ +\x0b\x00\x18@\x09\x0a\x00\x06\x00\x0c\x0d\x08\x03\x00\x00/\ +\xcc2\x11\x12\x0199\x11310%\x11\x10#\x22\ +'5\x16325\x11\x01q\xe48<)=^\x9a\ +\xfe\xdf\xfe\xfc\x18\x8c\x13d\x010\x00\x00\x01\x00\x19\xfe\ +u\x01q\x00\x8f\x00\x0b\x00\x18@\x09\x0a\x00\x06\x00\x0c\ +\x0d\x08\x03\x00\x00/\xcc2\x11\x12\x0199\x1131\ +0%\x11\x10#\x22'5\x16325\x11\x01q\xe4\ +8<)=^\x8f\xfe\xea\xfe\xfc\x18\x8c\x13d\x01%\ +\x00\xff\xff\x004\x00\x00\x02C\x05\xb6\x00\x07\x00\x14\xff\ +x\x00\x00\x00\x02\x00s\xff\xec\x04\x17\x04s\x00\x0b\x00\ +\x17\x00(@\x14\x0c\x06\x12\x00\x06\x00\x18\x19\x09\x15K\ +Y\x09&\x03\x0fMY\x03\x19\x00?+\x00\x18?+\ +\x11\x12\x0199\x113\x11310\x01\x10\x02#\x22\ +\x02\x11\x10\x1232\x12\x01\x14\x1632654&\ +#\x22\x06\x04\x17\xf7\xde\xd9\xf6\xf9\xda\xd8\xf9\xfd\x04\x9b\ +\x8e\x8d\x9e\x9e\x8f\x8d\x9a\x02/\xfe\xf5\xfe\xc8\x015\x01\ +\x0e\x01\x0f\x015\xfe\xcb\xfe\xf1\xd0\xe8\xea\xce\xcc\xec\xe9\ +\x00\x00\x01\x00-\x00\x00\x027\x04^\x00\x0a\x00&@\ +\x11\x09\x01\x01\x00\x08\x00\x0b\x0c\x07\x04\x07\x04\x01\x09\x10\ +\x01\x18\x00??\x1299//\x11\x12\x0199\x11\ +3\x11310!#\x1147\x06\x07\x07'\x013\ +\x027\xa1\x08C>\x96Z\x01\x7f\x8b\x021\xef\x8cC\ +0pr\x01#\x00\x01\x00)\x00\x00\x03\xd7\x04s\x00\ +\x19\x00,@\x18\x07\x13\x00\x13\x17\x0e\x01\x05\x1a\x1b\x10\ +\x0aKY\x10&\x18\x17\x01\x17LY\x01\x18\x00?+\ +\x11\x003\x18?+\x11\x12\x01\x179\x11310!\ +!5\x01>\x0254&#\x22\x06\x07'632\ +\x16\x15\x14\x06\x07\x05\x17!\x03\xd7\xfcR\x01\x91\x9dq\ +,\x8bwX\x9c\x5cZ\xc0\xf2\xc6\xda\x82\xba\xfe\xb9\x02\ +\x02\xbe\x85\x01/whSAWg=Jm\xa8\xa8\ +\x96s\xbb\x80\xe7\x06\x00\x00\x01\x00^\xfe\x95\x04\x1b\x04\ +t\x00'\x00G@&\x03\x04\x1b\x00\x13\x07\x07\x00\x04\ +\x16\x22\x0d\x06()\x04\x17\x16\x17\x16KY\x17\x17\x0a\ +%%\x1eKY%&\x0a\x11KY\x0a%\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\x11\ +\x12\x01\x179\x113\x113\x11310\x01\x14\x06\x07\ +\x15\x16\x16\x15\x14\x04!\x22&'5\x16\x163 \x11\ +\x10!#532654&#\x22\x06\x07'6\ +632\x16\x03\xee\x9d\x90\xb0\xaa\xfe\xde\xfe\xf5t\xc1\ +[_\xd7`\x01{\xfe^\x90\x92\xab\xc8\x93~`\xaa\ +mTZ\xeb\x82\xd5\xec\x03\x07\x8c\xb2\x1e\x08\x16\xb4\x92\ +\xd1\xe1#,\x9e/1\x01)\x01\x0a\x8f\x97\x86kz\ +4FpGQ\xc3\x00\x00\x02\x00\x17\xfe\xa8\x04f\x04\ +^\x00\x0a\x00\x12\x00B@!\x12\x05\x09\x02\x02\x0b\x07\ +\x03\x00\x03\x05\x03\x13\x14\x01\x05\x12\x05MY\x09\x12\x0e\ +\x0f\x0f\x07\x12\x12\x03\x07\x10\x03$\x00??\x129/\ +\x129\x113\x113+\x11\x003\x11\x12\x01\x179\x11\ +333\x113\x11310%#\x11#\x11!5\ +\x013\x113!\x1147#\x06\x07\x01\x04f\xd9\xa8\ +\xfd2\x02\xbe\xb8\xd9\xfe\x86\x0c\x0a)D\xfe9\x1b\xfe\ +\x8d\x01s}\x03\xc6\xfcD\x01\x5c\xda\xdeV\x5c\xfd\x9e\ +\x00\x00\x01\x00\x85\xfe\x95\x04\x1d\x04_\x00\x1a\x00:@\ +\x1f\x0f\x03\x19\x14\x08\x14\x17\x03\x04\x1c\x1b\x00\x11KY\ +\x00\x00\x06\x15\x15\x18LY\x15\x10\x06\x0cKY\x06%\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x01\x179\x113\x11310\x012\x04\x15\x14\x00#\ +\x22'5\x16\x163265\x10!\x22\x07'\x13!\ +\x15!\x036\x02-\xe7\x01\x09\xfe\xdf\xfe\xf7\x82F\xd0\ +e\xb0\xc3\xfe\x89^\xa0V7\x02\xd7\xfd\xb7%s\x02\ +&\xe5\xc7\xe3\xfe\xfeO\xa0-3\xa6\x9d\x012\x1d7\ +\x02\xac\x99\xfeI\x17\x00\xff\xff\x00u\xff\xec\x04/\x05\ +\xcb\x02\x06\x00\x19\x00\x00\x00\x01\x00^\xfe\xa9\x04+\x04\ +_\x00\x06\x00\x1f@\x10\x01\x05\x05\x00\x02\x03\x07\x08\x03\ +\x02LY\x03\x10\x00$\x00??+\x11\x12\x01\x179\ +\x11310\x01\x01!5!\x15\x01\x01\x1d\x02^\xfc\ +\xe3\x03\xcd\xfd\xaa\xfe\xa9\x05\x1d\x99\x85\xfa\xcf\xff\xff\x00\ +h\xff\xec\x04)\x05\xcb\x02\x06\x00\x1b\x00\x00\x00\x02\x00\ +j\xfe\x95\x04%\x04t\x00\x17\x00%\x00A@\x22\x1b\ +\x11\x22\x0a\x0a\x00\x00\x04\x11\x03&'\x0e\x1eMY\x0a\ +\x14\x0e\x0e\x02\x14\x14\x18KY\x14&\x02\x07MY\x02\ +%\x00?+\x00\x18?+\x11\x12\x009\x18/\x129\ ++\x11\x12\x01\x179\x113\x113\x11310\x01\x10\ +!\x22'5\x1632\x12\x13#\x06\x06#\x22&5\ +4\x1232\x16\x12\x01\x22\x06\x15\x14\x163266\ +54&&\x04%\xfdhtDPf\xf0\xf5\x0b\x0c\ +7\xb6r\xc2\xe4\xff\xd0\x95\xdfx\xfe\x14\x8f\x9c\x90\x93\ +[\x99XR\x93\x01\xef\xfc\xa6\x14\x8f\x1a\x01)\x013\ +SW\xe8\xd0\xe4\x01\x08\x99\xfe\xdb\x010\xb8\xa4\x90\xa5\ +J\x80Fi\xb2f\x00\xff\xff\x00\x1d\x00\x00\x05\xc4\x06\ +\x1f\x00'\x00I\x02\xb6\x00\x00\x00\x06\x00I\x00\x00\x00\ +\x02\x00\x5c\x02\xdd\x05\xaa\x05\xc1\x00\x22\x003\x00Z@\ +.,00.*&&(\x0a\x00\x1c\x11\x05\x11\x16\ +\x00(.\x0654+1$\x03-/-)/#\ +#(\x1c\x0a\x14\x08\x03\x03()\x19\x14\x14)\x03\x00\ +?3/3\x10\xcd2/3\x1299\x113\x113\ +\x113\x11\x12\x179\x11\x12\x01\x179\x113\x113\x11\ +3\x113\x113\x11310\x01\x14\x06#\x22'5\ +\x163254&&'&&54632\x17\ +\x07&#\x22\x06\x15\x14\x16\x16\x17\x16\x16\x01\x03#\x17\ +\x11#\x113\x13\x133\x11#\x117#\x03\x02H\x95\ +|\x91Jjw\x94\x176UxQ\x8en}\x5c\x22\ +dS\xff\xae\x007\x01@\xff\xae\x007\x01C\xffq\x00\ +7\x01D\xff\x5c\x007\x01F\xff\x5c\x007\x01G\xff\ +\xd7\x007\x01H\xffq\x007\x01J\xff\x85\x007\x01\ +\xfb\xff\xd7\x007\x01\xfd\xff\xd7\x007\x02\x02\xff\xae\x00\ +7\x02\x03\xff\xae\x007\x02\x04\xff\xae\x007\x02\x08\xff\ +\x85\x007\x02\x0c\xff\x85\x007\x02W\xff\x9a\x007\x02\ +X\xffq\x007\x02Y\xff\x5c\x007\x02_\xff\xd7\x00\ +7\x02`\xffq\x007\x02b\xff\x9a\x007\x03\x1d\xff\ +q\x007\x03\x1e\xff\x5c\x007\x03\x1f\xffq\x007\x03\ + \xff\x5c\x007\x03!\xffq\x007\x03\x22\xff\x5c\x00\ +7\x03#\xffq\x007\x03%\xffq\x007\x03&\xff\ +\x5c\x007\x03'\xffq\x007\x03(\xff\x5c\x007\x03\ +)\xffq\x007\x03*\xff\x5c\x007\x03+\xffq\x00\ +7\x03,\xff\x5c\x007\x03-\xffq\x007\x03.\xff\ +\x5c\x007\x03/\xffq\x007\x030\xff\x5c\x007\x03\ +1\xffq\x007\x032\xff\x5c\x007\x033\xffq\x00\ +7\x034\xff\x5c\x007\x036\xffq\x007\x038\xff\ +q\x007\x03:\xffq\x007\x03<\xffq\x007\x03\ +@\xffq\x007\x03B\xffq\x007\x03D\xffq\x00\ +7\x03I\xff\xd7\x007\x03J\xffq\x007\x03K\xff\ +\xd7\x007\x03L\xffq\x007\x03M\xff\xd7\x007\x03\ +N\xffq\x007\x03O\xff\xd7\x007\x03Q\xff\xd7\x00\ +7\x03R\xffq\x007\x03S\xff\xd7\x007\x03T\xff\ +q\x007\x03U\xff\xd7\x007\x03V\xffq\x007\x03\ +W\xff\xd7\x007\x03X\xffq\x007\x03Y\xff\xd7\x00\ +7\x03Z\xffq\x007\x03[\xff\xd7\x007\x03\x5c\xff\ +q\x007\x03]\xff\xd7\x007\x03^\xffq\x007\x03\ +_\xff\xd7\x007\x03`\xffq\x007\x03b\xff\x9a\x00\ +7\x03d\xff\x9a\x007\x03f\xff\x9a\x007\x03h\xff\ +\x9a\x007\x03j\xff\x9a\x007\x03l\xff\x9a\x007\x03\ +n\xff\x9a\x007\x03p\xff\xd7\x007\x03\x8f\x00)\x00\ +8\x00\x0f\xff\xd7\x008\x00\x11\xff\xd7\x008\x00$\xff\ +\xec\x008\x00\x82\xff\xec\x008\x00\x83\xff\xec\x008\x00\ +\x84\xff\xec\x008\x00\x85\xff\xec\x008\x00\x86\xff\xec\x00\ +8\x00\x87\xff\xec\x008\x00\xc2\xff\xec\x008\x00\xc4\xff\ +\xec\x008\x00\xc6\xff\xec\x008\x01C\xff\xec\x008\x02\ +\x08\xff\xd7\x008\x02\x0c\xff\xd7\x008\x02X\xff\xec\x00\ +8\x03\x1d\xff\xec\x008\x03\x1f\xff\xec\x008\x03!\xff\ +\xec\x008\x03#\xff\xec\x008\x03%\xff\xec\x008\x03\ +'\xff\xec\x008\x03)\xff\xec\x008\x03+\xff\xec\x00\ +8\x03-\xff\xec\x008\x03/\xff\xec\x008\x031\xff\ +\xec\x008\x033\xff\xec\x009\x00\x0f\xff\x9a\x009\x00\ +\x11\xff\x9a\x009\x00\x22\x00)\x009\x00$\xff\xae\x00\ +9\x00&\xff\xec\x009\x00*\xff\xec\x009\x002\xff\ +\xec\x009\x004\xff\xec\x009\x00D\xff\xd7\x009\x00\ +F\xff\xd7\x009\x00G\xff\xd7\x009\x00H\xff\xd7\x00\ +9\x00J\xff\xec\x009\x00P\xff\xec\x009\x00Q\xff\ +\xec\x009\x00R\xff\xd7\x009\x00S\xff\xec\x009\x00\ +T\xff\xd7\x009\x00U\xff\xec\x009\x00V\xff\xec\x00\ +9\x00X\xff\xec\x009\x00\x82\xff\xae\x009\x00\x83\xff\ +\xae\x009\x00\x84\xff\xae\x009\x00\x85\xff\xae\x009\x00\ +\x86\xff\xae\x009\x00\x87\xff\xae\x009\x00\x89\xff\xec\x00\ +9\x00\x94\xff\xec\x009\x00\x95\xff\xec\x009\x00\x96\xff\ +\xec\x009\x00\x97\xff\xec\x009\x00\x98\xff\xec\x009\x00\ +\x9a\xff\xec\x009\x00\xa2\xff\xd7\x009\x00\xa3\xff\xd7\x00\ +9\x00\xa4\xff\xd7\x009\x00\xa5\xff\xd7\x009\x00\xa6\xff\ +\xd7\x009\x00\xa7\xff\xd7\x009\x00\xa8\xff\xd7\x009\x00\ +\xa9\xff\xd7\x009\x00\xaa\xff\xd7\x009\x00\xab\xff\xd7\x00\ +9\x00\xac\xff\xd7\x009\x00\xad\xff\xd7\x009\x00\xb4\xff\ +\xd7\x009\x00\xb5\xff\xd7\x009\x00\xb6\xff\xd7\x009\x00\ +\xb7\xff\xd7\x009\x00\xb8\xff\xd7\x009\x00\xba\xff\xd7\x00\ +9\x00\xbb\xff\xec\x009\x00\xbc\xff\xec\x009\x00\xbd\xff\ +\xec\x009\x00\xbe\xff\xec\x009\x00\xc2\xff\xae\x009\x00\ +\xc3\xff\xd7\x009\x00\xc4\xff\xae\x009\x00\xc5\xff\xd7\x00\ +9\x00\xc6\xff\xae\x009\x00\xc7\xff\xd7\x009\x00\xc8\xff\ +\xec\x009\x00\xc9\xff\xd7\x009\x00\xca\xff\xec\x009\x00\ +\xcb\xff\xd7\x009\x00\xcc\xff\xec\x009\x00\xcd\xff\xd7\x00\ +9\x00\xce\xff\xec\x009\x00\xcf\xff\xd7\x009\x00\xd1\xff\ +\xd7\x009\x00\xd3\xff\xd7\x009\x00\xd5\xff\xd7\x009\x00\ +\xd7\xff\xd7\x009\x00\xd9\xff\xd7\x009\x00\xdb\xff\xd7\x00\ +9\x00\xdd\xff\xd7\x009\x00\xde\xff\xec\x009\x00\xdf\xff\ +\xec\x009\x00\xe0\xff\xec\x009\x00\xe1\xff\xec\x009\x00\ +\xe2\xff\xec\x009\x00\xe3\xff\xec\x009\x00\xe4\xff\xec\x00\ +9\x00\xe5\xff\xec\x009\x00\xfa\xff\xec\x009\x01\x06\xff\ +\xec\x009\x01\x08\xff\xec\x009\x01\x0d\xff\xec\x009\x01\ +\x0e\xff\xec\x009\x01\x0f\xff\xd7\x009\x01\x10\xff\xec\x00\ +9\x01\x11\xff\xd7\x009\x01\x12\xff\xec\x009\x01\x13\xff\ +\xd7\x009\x01\x14\xff\xec\x009\x01\x15\xff\xd7\x009\x01\ +\x17\xff\xec\x009\x01\x19\xff\xec\x009\x01\x1d\xff\xec\x00\ +9\x01!\xff\xec\x009\x01+\xff\xec\x009\x01-\xff\ +\xec\x009\x01/\xff\xec\x009\x011\xff\xec\x009\x01\ +3\xff\xec\x009\x015\xff\xec\x009\x01C\xff\xae\x00\ +9\x01D\xff\xd7\x009\x01F\xff\xd7\x009\x01G\xff\ +\xec\x009\x01H\xff\xd7\x009\x01J\xff\xec\x009\x02\ +\x08\xff\x9a\x009\x02\x0c\xff\x9a\x009\x02W\xff\xec\x00\ +9\x02X\xff\xae\x009\x02Y\xff\xd7\x009\x02_\xff\ +\xec\x009\x02`\xff\xd7\x009\x02b\xff\xec\x009\x03\ +\x1d\xff\xae\x009\x03\x1e\xff\xd7\x009\x03\x1f\xff\xae\x00\ +9\x03 \xff\xd7\x009\x03!\xff\xae\x009\x03\x22\xff\ +\xd7\x009\x03#\xff\xae\x009\x03%\xff\xae\x009\x03\ +&\xff\xd7\x009\x03'\xff\xae\x009\x03(\xff\xd7\x00\ +9\x03)\xff\xae\x009\x03*\xff\xd7\x009\x03+\xff\ +\xae\x009\x03,\xff\xd7\x009\x03-\xff\xae\x009\x03\ +.\xff\xd7\x009\x03/\xff\xae\x009\x030\xff\xd7\x00\ +9\x031\xff\xae\x009\x032\xff\xd7\x009\x033\xff\ +\xae\x009\x034\xff\xd7\x009\x036\xff\xd7\x009\x03\ +8\xff\xd7\x009\x03:\xff\xd7\x009\x03<\xff\xd7\x00\ +9\x03@\xff\xd7\x009\x03B\xff\xd7\x009\x03D\xff\ +\xd7\x009\x03I\xff\xec\x009\x03J\xff\xd7\x009\x03\ +K\xff\xec\x009\x03L\xff\xd7\x009\x03M\xff\xec\x00\ +9\x03N\xff\xd7\x009\x03O\xff\xec\x009\x03Q\xff\ +\xec\x009\x03R\xff\xd7\x009\x03S\xff\xec\x009\x03\ +T\xff\xd7\x009\x03U\xff\xec\x009\x03V\xff\xd7\x00\ +9\x03W\xff\xec\x009\x03X\xff\xd7\x009\x03Y\xff\ +\xec\x009\x03Z\xff\xd7\x009\x03[\xff\xec\x009\x03\ +\x5c\xff\xd7\x009\x03]\xff\xec\x009\x03^\xff\xd7\x00\ +9\x03_\xff\xec\x009\x03`\xff\xd7\x009\x03b\xff\ +\xec\x009\x03d\xff\xec\x009\x03f\xff\xec\x009\x03\ +h\xff\xec\x009\x03j\xff\xec\x009\x03l\xff\xec\x00\ +9\x03n\xff\xec\x00:\x00\x0f\xff\x9a\x00:\x00\x11\xff\ +\x9a\x00:\x00\x22\x00)\x00:\x00$\xff\xae\x00:\x00\ +&\xff\xec\x00:\x00*\xff\xec\x00:\x002\xff\xec\x00\ +:\x004\xff\xec\x00:\x00D\xff\xd7\x00:\x00F\xff\ +\xd7\x00:\x00G\xff\xd7\x00:\x00H\xff\xd7\x00:\x00\ +J\xff\xec\x00:\x00P\xff\xec\x00:\x00Q\xff\xec\x00\ +:\x00R\xff\xd7\x00:\x00S\xff\xec\x00:\x00T\xff\ +\xd7\x00:\x00U\xff\xec\x00:\x00V\xff\xec\x00:\x00\ +X\xff\xec\x00:\x00\x82\xff\xae\x00:\x00\x83\xff\xae\x00\ +:\x00\x84\xff\xae\x00:\x00\x85\xff\xae\x00:\x00\x86\xff\ +\xae\x00:\x00\x87\xff\xae\x00:\x00\x89\xff\xec\x00:\x00\ +\x94\xff\xec\x00:\x00\x95\xff\xec\x00:\x00\x96\xff\xec\x00\ +:\x00\x97\xff\xec\x00:\x00\x98\xff\xec\x00:\x00\x9a\xff\ +\xec\x00:\x00\xa2\xff\xd7\x00:\x00\xa3\xff\xd7\x00:\x00\ +\xa4\xff\xd7\x00:\x00\xa5\xff\xd7\x00:\x00\xa6\xff\xd7\x00\ +:\x00\xa7\xff\xd7\x00:\x00\xa8\xff\xd7\x00:\x00\xa9\xff\ +\xd7\x00:\x00\xaa\xff\xd7\x00:\x00\xab\xff\xd7\x00:\x00\ +\xac\xff\xd7\x00:\x00\xad\xff\xd7\x00:\x00\xb4\xff\xd7\x00\ +:\x00\xb5\xff\xd7\x00:\x00\xb6\xff\xd7\x00:\x00\xb7\xff\ +\xd7\x00:\x00\xb8\xff\xd7\x00:\x00\xba\xff\xd7\x00:\x00\ +\xbb\xff\xec\x00:\x00\xbc\xff\xec\x00:\x00\xbd\xff\xec\x00\ +:\x00\xbe\xff\xec\x00:\x00\xc2\xff\xae\x00:\x00\xc3\xff\ +\xd7\x00:\x00\xc4\xff\xae\x00:\x00\xc5\xff\xd7\x00:\x00\ +\xc6\xff\xae\x00:\x00\xc7\xff\xd7\x00:\x00\xc8\xff\xec\x00\ +:\x00\xc9\xff\xd7\x00:\x00\xca\xff\xec\x00:\x00\xcb\xff\ +\xd7\x00:\x00\xcc\xff\xec\x00:\x00\xcd\xff\xd7\x00:\x00\ +\xce\xff\xec\x00:\x00\xcf\xff\xd7\x00:\x00\xd1\xff\xd7\x00\ +:\x00\xd3\xff\xd7\x00:\x00\xd5\xff\xd7\x00:\x00\xd7\xff\ +\xd7\x00:\x00\xd9\xff\xd7\x00:\x00\xdb\xff\xd7\x00:\x00\ +\xdd\xff\xd7\x00:\x00\xde\xff\xec\x00:\x00\xdf\xff\xec\x00\ +:\x00\xe0\xff\xec\x00:\x00\xe1\xff\xec\x00:\x00\xe2\xff\ +\xec\x00:\x00\xe3\xff\xec\x00:\x00\xe4\xff\xec\x00:\x00\ +\xe5\xff\xec\x00:\x00\xfa\xff\xec\x00:\x01\x06\xff\xec\x00\ +:\x01\x08\xff\xec\x00:\x01\x0d\xff\xec\x00:\x01\x0e\xff\ +\xec\x00:\x01\x0f\xff\xd7\x00:\x01\x10\xff\xec\x00:\x01\ +\x11\xff\xd7\x00:\x01\x12\xff\xec\x00:\x01\x13\xff\xd7\x00\ +:\x01\x14\xff\xec\x00:\x01\x15\xff\xd7\x00:\x01\x17\xff\ +\xec\x00:\x01\x19\xff\xec\x00:\x01\x1d\xff\xec\x00:\x01\ +!\xff\xec\x00:\x01+\xff\xec\x00:\x01-\xff\xec\x00\ +:\x01/\xff\xec\x00:\x011\xff\xec\x00:\x013\xff\ +\xec\x00:\x015\xff\xec\x00:\x01C\xff\xae\x00:\x01\ +D\xff\xd7\x00:\x01F\xff\xd7\x00:\x01G\xff\xec\x00\ +:\x01H\xff\xd7\x00:\x01J\xff\xec\x00:\x02\x08\xff\ +\x9a\x00:\x02\x0c\xff\x9a\x00:\x02W\xff\xec\x00:\x02\ +X\xff\xae\x00:\x02Y\xff\xd7\x00:\x02_\xff\xec\x00\ +:\x02`\xff\xd7\x00:\x02b\xff\xec\x00:\x03\x1d\xff\ +\xae\x00:\x03\x1e\xff\xd7\x00:\x03\x1f\xff\xae\x00:\x03\ + \xff\xd7\x00:\x03!\xff\xae\x00:\x03\x22\xff\xd7\x00\ +:\x03#\xff\xae\x00:\x03%\xff\xae\x00:\x03&\xff\ +\xd7\x00:\x03'\xff\xae\x00:\x03(\xff\xd7\x00:\x03\ +)\xff\xae\x00:\x03*\xff\xd7\x00:\x03+\xff\xae\x00\ +:\x03,\xff\xd7\x00:\x03-\xff\xae\x00:\x03.\xff\ +\xd7\x00:\x03/\xff\xae\x00:\x030\xff\xd7\x00:\x03\ +1\xff\xae\x00:\x032\xff\xd7\x00:\x033\xff\xae\x00\ +:\x034\xff\xd7\x00:\x036\xff\xd7\x00:\x038\xff\ +\xd7\x00:\x03:\xff\xd7\x00:\x03<\xff\xd7\x00:\x03\ +@\xff\xd7\x00:\x03B\xff\xd7\x00:\x03D\xff\xd7\x00\ +:\x03I\xff\xec\x00:\x03J\xff\xd7\x00:\x03K\xff\ +\xec\x00:\x03L\xff\xd7\x00:\x03M\xff\xec\x00:\x03\ +N\xff\xd7\x00:\x03O\xff\xec\x00:\x03Q\xff\xec\x00\ +:\x03R\xff\xd7\x00:\x03S\xff\xec\x00:\x03T\xff\ +\xd7\x00:\x03U\xff\xec\x00:\x03V\xff\xd7\x00:\x03\ +W\xff\xec\x00:\x03X\xff\xd7\x00:\x03Y\xff\xec\x00\ +:\x03Z\xff\xd7\x00:\x03[\xff\xec\x00:\x03\x5c\xff\ +\xd7\x00:\x03]\xff\xec\x00:\x03^\xff\xd7\x00:\x03\ +_\xff\xec\x00:\x03`\xff\xd7\x00:\x03b\xff\xec\x00\ +:\x03d\xff\xec\x00:\x03f\xff\xec\x00:\x03h\xff\ +\xec\x00:\x03j\xff\xec\x00:\x03l\xff\xec\x00:\x03\ +n\xff\xec\x00;\x00&\xff\xd7\x00;\x00*\xff\xd7\x00\ +;\x002\xff\xd7\x00;\x004\xff\xd7\x00;\x00\x89\xff\ +\xd7\x00;\x00\x94\xff\xd7\x00;\x00\x95\xff\xd7\x00;\x00\ +\x96\xff\xd7\x00;\x00\x97\xff\xd7\x00;\x00\x98\xff\xd7\x00\ +;\x00\x9a\xff\xd7\x00;\x00\xc8\xff\xd7\x00;\x00\xca\xff\ +\xd7\x00;\x00\xcc\xff\xd7\x00;\x00\xce\xff\xd7\x00;\x00\ +\xde\xff\xd7\x00;\x00\xe0\xff\xd7\x00;\x00\xe2\xff\xd7\x00\ +;\x00\xe4\xff\xd7\x00;\x01\x0e\xff\xd7\x00;\x01\x10\xff\ +\xd7\x00;\x01\x12\xff\xd7\x00;\x01\x14\xff\xd7\x00;\x01\ +G\xff\xd7\x00;\x02_\xff\xd7\x00;\x03I\xff\xd7\x00\ +;\x03K\xff\xd7\x00;\x03M\xff\xd7\x00;\x03O\xff\ +\xd7\x00;\x03Q\xff\xd7\x00;\x03S\xff\xd7\x00;\x03\ +U\xff\xd7\x00;\x03W\xff\xd7\x00;\x03Y\xff\xd7\x00\ +;\x03[\xff\xd7\x00;\x03]\xff\xd7\x00;\x03_\xff\ +\xd7\x00<\x00\x0f\xff\x85\x00<\x00\x11\xff\x85\x00<\x00\ +\x22\x00)\x00<\x00$\xff\x85\x00<\x00&\xff\xd7\x00\ +<\x00*\xff\xd7\x00<\x002\xff\xd7\x00<\x004\xff\ +\xd7\x00<\x00D\xff\x9a\x00<\x00F\xff\x9a\x00<\x00\ +G\xff\x9a\x00<\x00H\xff\x9a\x00<\x00J\xff\xd7\x00\ +<\x00P\xff\xc3\x00<\x00Q\xff\xc3\x00<\x00R\xff\ +\x9a\x00<\x00S\xff\xc3\x00<\x00T\xff\x9a\x00<\x00\ +U\xff\xc3\x00<\x00V\xff\xae\x00<\x00X\xff\xc3\x00\ +<\x00]\xff\xd7\x00<\x00\x82\xff\x85\x00<\x00\x83\xff\ +\x85\x00<\x00\x84\xff\x85\x00<\x00\x85\xff\x85\x00<\x00\ +\x86\xff\x85\x00<\x00\x87\xff\x85\x00<\x00\x89\xff\xd7\x00\ +<\x00\x94\xff\xd7\x00<\x00\x95\xff\xd7\x00<\x00\x96\xff\ +\xd7\x00<\x00\x97\xff\xd7\x00<\x00\x98\xff\xd7\x00<\x00\ +\x9a\xff\xd7\x00<\x00\xa2\xff\x9a\x00<\x00\xa3\xff\x9a\x00\ +<\x00\xa4\xff\x9a\x00<\x00\xa5\xff\x9a\x00<\x00\xa6\xff\ +\x9a\x00<\x00\xa7\xff\x9a\x00<\x00\xa8\xff\x9a\x00<\x00\ +\xa9\xff\x9a\x00<\x00\xaa\xff\x9a\x00<\x00\xab\xff\x9a\x00\ +<\x00\xac\xff\x9a\x00<\x00\xad\xff\x9a\x00<\x00\xb4\xff\ +\x9a\x00<\x00\xb5\xff\x9a\x00<\x00\xb6\xff\x9a\x00<\x00\ +\xb7\xff\x9a\x00<\x00\xb8\xff\x9a\x00<\x00\xba\xff\x9a\x00\ +<\x00\xbb\xff\xc3\x00<\x00\xbc\xff\xc3\x00<\x00\xbd\xff\ +\xc3\x00<\x00\xbe\xff\xc3\x00<\x00\xc2\xff\x85\x00<\x00\ +\xc3\xff\x9a\x00<\x00\xc4\xff\x85\x00<\x00\xc5\xff\x9a\x00\ +<\x00\xc6\xff\x85\x00<\x00\xc7\xff\x9a\x00<\x00\xc8\xff\ +\xd7\x00<\x00\xc9\xff\x9a\x00<\x00\xca\xff\xd7\x00<\x00\ +\xcb\xff\x9a\x00<\x00\xcc\xff\xd7\x00<\x00\xcd\xff\x9a\x00\ +<\x00\xce\xff\xd7\x00<\x00\xcf\xff\x9a\x00<\x00\xd1\xff\ +\x9a\x00<\x00\xd3\xff\x9a\x00<\x00\xd5\xff\x9a\x00<\x00\ +\xd7\xff\x9a\x00<\x00\xd9\xff\x9a\x00<\x00\xdb\xff\x9a\x00\ +<\x00\xdd\xff\x9a\x00<\x00\xde\xff\xd7\x00<\x00\xdf\xff\ +\xd7\x00<\x00\xe0\xff\xd7\x00<\x00\xe1\xff\xd7\x00<\x00\ +\xe2\xff\xd7\x00<\x00\xe3\xff\xd7\x00<\x00\xe4\xff\xd7\x00\ +<\x00\xe5\xff\xd7\x00<\x00\xfa\xff\xc3\x00<\x01\x06\xff\ +\xc3\x00<\x01\x08\xff\xc3\x00<\x01\x0d\xff\xc3\x00<\x01\ +\x0e\xff\xd7\x00<\x01\x0f\xff\x9a\x00<\x01\x10\xff\xd7\x00\ +<\x01\x11\xff\x9a\x00<\x01\x12\xff\xd7\x00<\x01\x13\xff\ +\x9a\x00<\x01\x14\xff\xd7\x00<\x01\x15\xff\x9a\x00<\x01\ +\x17\xff\xc3\x00<\x01\x19\xff\xc3\x00<\x01\x1d\xff\xae\x00\ +<\x01!\xff\xae\x00<\x01+\xff\xc3\x00<\x01-\xff\ +\xc3\x00<\x01/\xff\xc3\x00<\x011\xff\xc3\x00<\x01\ +3\xff\xc3\x00<\x015\xff\xc3\x00<\x01<\xff\xd7\x00\ +<\x01>\xff\xd7\x00<\x01@\xff\xd7\x00<\x01C\xff\ +\x85\x00<\x01D\xff\x9a\x00<\x01F\xff\x9a\x00<\x01\ +G\xff\xd7\x00<\x01H\xff\x9a\x00<\x01J\xff\xae\x00\ +<\x02\x08\xff\x85\x00<\x02\x0c\xff\x85\x00<\x02W\xff\ +\xc3\x00<\x02X\xff\x85\x00<\x02Y\xff\x9a\x00<\x02\ +_\xff\xd7\x00<\x02`\xff\x9a\x00<\x02b\xff\xc3\x00\ +<\x03\x1d\xff\x85\x00<\x03\x1e\xff\x9a\x00<\x03\x1f\xff\ +\x85\x00<\x03 \xff\x9a\x00<\x03!\xff\x85\x00<\x03\ +\x22\xff\x9a\x00<\x03#\xff\x85\x00<\x03%\xff\x85\x00\ +<\x03&\xff\x9a\x00<\x03'\xff\x85\x00<\x03(\xff\ +\x9a\x00<\x03)\xff\x85\x00<\x03*\xff\x9a\x00<\x03\ ++\xff\x85\x00<\x03,\xff\x9a\x00<\x03-\xff\x85\x00\ +<\x03.\xff\x9a\x00<\x03/\xff\x85\x00<\x030\xff\ +\x9a\x00<\x031\xff\x85\x00<\x032\xff\x9a\x00<\x03\ +3\xff\x85\x00<\x034\xff\x9a\x00<\x036\xff\x9a\x00\ +<\x038\xff\x9a\x00<\x03:\xff\x9a\x00<\x03<\xff\ +\x9a\x00<\x03@\xff\x9a\x00<\x03B\xff\x9a\x00<\x03\ +D\xff\x9a\x00<\x03I\xff\xd7\x00<\x03J\xff\x9a\x00\ +<\x03K\xff\xd7\x00<\x03L\xff\x9a\x00<\x03M\xff\ +\xd7\x00<\x03N\xff\x9a\x00<\x03O\xff\xd7\x00<\x03\ +Q\xff\xd7\x00<\x03R\xff\x9a\x00<\x03S\xff\xd7\x00\ +<\x03T\xff\x9a\x00<\x03U\xff\xd7\x00<\x03V\xff\ +\x9a\x00<\x03W\xff\xd7\x00<\x03X\xff\x9a\x00<\x03\ +Y\xff\xd7\x00<\x03Z\xff\x9a\x00<\x03[\xff\xd7\x00\ +<\x03\x5c\xff\x9a\x00<\x03]\xff\xd7\x00<\x03^\xff\ +\x9a\x00<\x03_\xff\xd7\x00<\x03`\xff\x9a\x00<\x03\ +b\xff\xc3\x00<\x03d\xff\xc3\x00<\x03f\xff\xc3\x00\ +<\x03h\xff\xc3\x00<\x03j\xff\xc3\x00<\x03l\xff\ +\xc3\x00<\x03n\xff\xc3\x00=\x00&\xff\xec\x00=\x00\ +*\xff\xec\x00=\x002\xff\xec\x00=\x004\xff\xec\x00\ +=\x00\x89\xff\xec\x00=\x00\x94\xff\xec\x00=\x00\x95\xff\ +\xec\x00=\x00\x96\xff\xec\x00=\x00\x97\xff\xec\x00=\x00\ +\x98\xff\xec\x00=\x00\x9a\xff\xec\x00=\x00\xc8\xff\xec\x00\ +=\x00\xca\xff\xec\x00=\x00\xcc\xff\xec\x00=\x00\xce\xff\ +\xec\x00=\x00\xde\xff\xec\x00=\x00\xe0\xff\xec\x00=\x00\ +\xe2\xff\xec\x00=\x00\xe4\xff\xec\x00=\x01\x0e\xff\xec\x00\ +=\x01\x10\xff\xec\x00=\x01\x12\xff\xec\x00=\x01\x14\xff\ +\xec\x00=\x01G\xff\xec\x00=\x02_\xff\xec\x00=\x03\ +I\xff\xec\x00=\x03K\xff\xec\x00=\x03M\xff\xec\x00\ +=\x03O\xff\xec\x00=\x03Q\xff\xec\x00=\x03S\xff\ +\xec\x00=\x03U\xff\xec\x00=\x03W\xff\xec\x00=\x03\ +Y\xff\xec\x00=\x03[\xff\xec\x00=\x03]\xff\xec\x00\ +=\x03_\xff\xec\x00>\x00-\x00\xb8\x00D\x00\x05\xff\ +\xec\x00D\x00\x0a\xff\xec\x00D\x02\x07\xff\xec\x00D\x02\ +\x0b\xff\xec\x00E\x00\x05\xff\xec\x00E\x00\x0a\xff\xec\x00\ +E\x00Y\xff\xd7\x00E\x00Z\xff\xd7\x00E\x00[\xff\ +\xd7\x00E\x00\x5c\xff\xd7\x00E\x00]\xff\xec\x00E\x00\ +\xbf\xff\xd7\x00E\x017\xff\xd7\x00E\x01<\xff\xec\x00\ +E\x01>\xff\xec\x00E\x01@\xff\xec\x00E\x01\xfb\xff\ +\xd7\x00E\x01\xfd\xff\xd7\x00E\x02\x07\xff\xec\x00E\x02\ +\x0b\xff\xec\x00E\x03p\xff\xd7\x00F\x00\x05\x00)\x00\ +F\x00\x0a\x00)\x00F\x02\x07\x00)\x00F\x02\x0b\x00\ +)\x00H\x00\x05\xff\xec\x00H\x00\x0a\xff\xec\x00H\x00\ +Y\xff\xd7\x00H\x00Z\xff\xd7\x00H\x00[\xff\xd7\x00\ +H\x00\x5c\xff\xd7\x00H\x00]\xff\xec\x00H\x00\xbf\xff\ +\xd7\x00H\x017\xff\xd7\x00H\x01<\xff\xec\x00H\x01\ +>\xff\xec\x00H\x01@\xff\xec\x00H\x01\xfb\xff\xd7\x00\ +H\x01\xfd\xff\xd7\x00H\x02\x07\xff\xec\x00H\x02\x0b\xff\ +\xec\x00H\x03p\xff\xd7\x00I\x00\x05\x00{\x00I\x00\ +\x0a\x00{\x00I\x02\x07\x00{\x00I\x02\x0b\x00{\x00\ +K\x00\x05\xff\xec\x00K\x00\x0a\xff\xec\x00K\x02\x07\xff\ +\xec\x00K\x02\x0b\xff\xec\x00N\x00F\xff\xd7\x00N\x00\ +G\xff\xd7\x00N\x00H\xff\xd7\x00N\x00R\xff\xd7\x00\ +N\x00T\xff\xd7\x00N\x00\xa2\xff\xd7\x00N\x00\xa9\xff\ +\xd7\x00N\x00\xaa\xff\xd7\x00N\x00\xab\xff\xd7\x00N\x00\ +\xac\xff\xd7\x00N\x00\xad\xff\xd7\x00N\x00\xb4\xff\xd7\x00\ +N\x00\xb5\xff\xd7\x00N\x00\xb6\xff\xd7\x00N\x00\xb7\xff\ +\xd7\x00N\x00\xb8\xff\xd7\x00N\x00\xba\xff\xd7\x00N\x00\ +\xc9\xff\xd7\x00N\x00\xcb\xff\xd7\x00N\x00\xcd\xff\xd7\x00\ +N\x00\xcf\xff\xd7\x00N\x00\xd1\xff\xd7\x00N\x00\xd3\xff\ +\xd7\x00N\x00\xd5\xff\xd7\x00N\x00\xd7\xff\xd7\x00N\x00\ +\xd9\xff\xd7\x00N\x00\xdb\xff\xd7\x00N\x00\xdd\xff\xd7\x00\ +N\x01\x0f\xff\xd7\x00N\x01\x11\xff\xd7\x00N\x01\x13\xff\ +\xd7\x00N\x01\x15\xff\xd7\x00N\x01H\xff\xd7\x00N\x02\ +`\xff\xd7\x00N\x036\xff\xd7\x00N\x038\xff\xd7\x00\ +N\x03:\xff\xd7\x00N\x03<\xff\xd7\x00N\x03@\xff\ +\xd7\x00N\x03B\xff\xd7\x00N\x03D\xff\xd7\x00N\x03\ +J\xff\xd7\x00N\x03L\xff\xd7\x00N\x03N\xff\xd7\x00\ +N\x03R\xff\xd7\x00N\x03T\xff\xd7\x00N\x03V\xff\ +\xd7\x00N\x03X\xff\xd7\x00N\x03Z\xff\xd7\x00N\x03\ +\x5c\xff\xd7\x00N\x03^\xff\xd7\x00N\x03`\xff\xd7\x00\ +P\x00\x05\xff\xec\x00P\x00\x0a\xff\xec\x00P\x02\x07\xff\ +\xec\x00P\x02\x0b\xff\xec\x00Q\x00\x05\xff\xec\x00Q\x00\ +\x0a\xff\xec\x00Q\x02\x07\xff\xec\x00Q\x02\x0b\xff\xec\x00\ +R\x00\x05\xff\xec\x00R\x00\x0a\xff\xec\x00R\x00Y\xff\ +\xd7\x00R\x00Z\xff\xd7\x00R\x00[\xff\xd7\x00R\x00\ +\x5c\xff\xd7\x00R\x00]\xff\xec\x00R\x00\xbf\xff\xd7\x00\ +R\x017\xff\xd7\x00R\x01<\xff\xec\x00R\x01>\xff\ +\xec\x00R\x01@\xff\xec\x00R\x01\xfb\xff\xd7\x00R\x01\ +\xfd\xff\xd7\x00R\x02\x07\xff\xec\x00R\x02\x0b\xff\xec\x00\ +R\x03p\xff\xd7\x00S\x00\x05\xff\xec\x00S\x00\x0a\xff\ +\xec\x00S\x00Y\xff\xd7\x00S\x00Z\xff\xd7\x00S\x00\ +[\xff\xd7\x00S\x00\x5c\xff\xd7\x00S\x00]\xff\xec\x00\ +S\x00\xbf\xff\xd7\x00S\x017\xff\xd7\x00S\x01<\xff\ +\xec\x00S\x01>\xff\xec\x00S\x01@\xff\xec\x00S\x01\ +\xfb\xff\xd7\x00S\x01\xfd\xff\xd7\x00S\x02\x07\xff\xec\x00\ +S\x02\x0b\xff\xec\x00S\x03p\xff\xd7\x00U\x00\x05\x00\ +R\x00U\x00\x0a\x00R\x00U\x00D\xff\xd7\x00U\x00\ +F\xff\xd7\x00U\x00G\xff\xd7\x00U\x00H\xff\xd7\x00\ +U\x00J\xff\xec\x00U\x00R\xff\xd7\x00U\x00T\xff\ +\xd7\x00U\x00\xa2\xff\xd7\x00U\x00\xa3\xff\xd7\x00U\x00\ +\xa4\xff\xd7\x00U\x00\xa5\xff\xd7\x00U\x00\xa6\xff\xd7\x00\ +U\x00\xa7\xff\xd7\x00U\x00\xa8\xff\xd7\x00U\x00\xa9\xff\ +\xd7\x00U\x00\xaa\xff\xd7\x00U\x00\xab\xff\xd7\x00U\x00\ +\xac\xff\xd7\x00U\x00\xad\xff\xd7\x00U\x00\xb4\xff\xd7\x00\ +U\x00\xb5\xff\xd7\x00U\x00\xb6\xff\xd7\x00U\x00\xb7\xff\ +\xd7\x00U\x00\xb8\xff\xd7\x00U\x00\xba\xff\xd7\x00U\x00\ +\xc3\xff\xd7\x00U\x00\xc5\xff\xd7\x00U\x00\xc7\xff\xd7\x00\ +U\x00\xc9\xff\xd7\x00U\x00\xcb\xff\xd7\x00U\x00\xcd\xff\ +\xd7\x00U\x00\xcf\xff\xd7\x00U\x00\xd1\xff\xd7\x00U\x00\ +\xd3\xff\xd7\x00U\x00\xd5\xff\xd7\x00U\x00\xd7\xff\xd7\x00\ +U\x00\xd9\xff\xd7\x00U\x00\xdb\xff\xd7\x00U\x00\xdd\xff\ +\xd7\x00U\x00\xdf\xff\xec\x00U\x00\xe1\xff\xec\x00U\x00\ +\xe3\xff\xec\x00U\x00\xe5\xff\xec\x00U\x01\x0f\xff\xd7\x00\ +U\x01\x11\xff\xd7\x00U\x01\x13\xff\xd7\x00U\x01\x15\xff\ +\xd7\x00U\x01D\xff\xd7\x00U\x01F\xff\xd7\x00U\x01\ +H\xff\xd7\x00U\x02\x07\x00R\x00U\x02\x0b\x00R\x00\ +U\x02Y\xff\xd7\x00U\x02`\xff\xd7\x00U\x03\x1e\xff\ +\xd7\x00U\x03 \xff\xd7\x00U\x03\x22\xff\xd7\x00U\x03\ +&\xff\xd7\x00U\x03(\xff\xd7\x00U\x03*\xff\xd7\x00\ +U\x03,\xff\xd7\x00U\x03.\xff\xd7\x00U\x030\xff\ +\xd7\x00U\x032\xff\xd7\x00U\x034\xff\xd7\x00U\x03\ +6\xff\xd7\x00U\x038\xff\xd7\x00U\x03:\xff\xd7\x00\ +U\x03<\xff\xd7\x00U\x03@\xff\xd7\x00U\x03B\xff\ +\xd7\x00U\x03D\xff\xd7\x00U\x03J\xff\xd7\x00U\x03\ +L\xff\xd7\x00U\x03N\xff\xd7\x00U\x03R\xff\xd7\x00\ +U\x03T\xff\xd7\x00U\x03V\xff\xd7\x00U\x03X\xff\ +\xd7\x00U\x03Z\xff\xd7\x00U\x03\x5c\xff\xd7\x00U\x03\ +^\xff\xd7\x00U\x03`\xff\xd7\x00W\x00\x05\x00)\x00\ +W\x00\x0a\x00)\x00W\x02\x07\x00)\x00W\x02\x0b\x00\ +)\x00Y\x00\x05\x00R\x00Y\x00\x0a\x00R\x00Y\x00\ +\x0f\xff\xae\x00Y\x00\x11\xff\xae\x00Y\x00\x22\x00)\x00\ +Y\x02\x07\x00R\x00Y\x02\x08\xff\xae\x00Y\x02\x0b\x00\ +R\x00Y\x02\x0c\xff\xae\x00Z\x00\x05\x00R\x00Z\x00\ +\x0a\x00R\x00Z\x00\x0f\xff\xae\x00Z\x00\x11\xff\xae\x00\ +Z\x00\x22\x00)\x00Z\x02\x07\x00R\x00Z\x02\x08\xff\ +\xae\x00Z\x02\x0b\x00R\x00Z\x02\x0c\xff\xae\x00[\x00\ +F\xff\xd7\x00[\x00G\xff\xd7\x00[\x00H\xff\xd7\x00\ +[\x00R\xff\xd7\x00[\x00T\xff\xd7\x00[\x00\xa2\xff\ +\xd7\x00[\x00\xa9\xff\xd7\x00[\x00\xaa\xff\xd7\x00[\x00\ +\xab\xff\xd7\x00[\x00\xac\xff\xd7\x00[\x00\xad\xff\xd7\x00\ +[\x00\xb4\xff\xd7\x00[\x00\xb5\xff\xd7\x00[\x00\xb6\xff\ +\xd7\x00[\x00\xb7\xff\xd7\x00[\x00\xb8\xff\xd7\x00[\x00\ +\xba\xff\xd7\x00[\x00\xc9\xff\xd7\x00[\x00\xcb\xff\xd7\x00\ +[\x00\xcd\xff\xd7\x00[\x00\xcf\xff\xd7\x00[\x00\xd1\xff\ +\xd7\x00[\x00\xd3\xff\xd7\x00[\x00\xd5\xff\xd7\x00[\x00\ +\xd7\xff\xd7\x00[\x00\xd9\xff\xd7\x00[\x00\xdb\xff\xd7\x00\ +[\x00\xdd\xff\xd7\x00[\x01\x0f\xff\xd7\x00[\x01\x11\xff\ +\xd7\x00[\x01\x13\xff\xd7\x00[\x01\x15\xff\xd7\x00[\x01\ +H\xff\xd7\x00[\x02`\xff\xd7\x00[\x036\xff\xd7\x00\ +[\x038\xff\xd7\x00[\x03:\xff\xd7\x00[\x03<\xff\ +\xd7\x00[\x03@\xff\xd7\x00[\x03B\xff\xd7\x00[\x03\ +D\xff\xd7\x00[\x03J\xff\xd7\x00[\x03L\xff\xd7\x00\ +[\x03N\xff\xd7\x00[\x03R\xff\xd7\x00[\x03T\xff\ +\xd7\x00[\x03V\xff\xd7\x00[\x03X\xff\xd7\x00[\x03\ +Z\xff\xd7\x00[\x03\x5c\xff\xd7\x00[\x03^\xff\xd7\x00\ +[\x03`\xff\xd7\x00\x5c\x00\x05\x00R\x00\x5c\x00\x0a\x00\ +R\x00\x5c\x00\x0f\xff\xae\x00\x5c\x00\x11\xff\xae\x00\x5c\x00\ +\x22\x00)\x00\x5c\x02\x07\x00R\x00\x5c\x02\x08\xff\xae\x00\ +\x5c\x02\x0b\x00R\x00\x5c\x02\x0c\xff\xae\x00^\x00-\x00\ +\xb8\x00\x82\x00\x05\xffq\x00\x82\x00\x0a\xffq\x00\x82\x00\ +&\xff\xd7\x00\x82\x00*\xff\xd7\x00\x82\x00-\x01\x0a\x00\ +\x82\x002\xff\xd7\x00\x82\x004\xff\xd7\x00\x82\x007\xff\ +q\x00\x82\x009\xff\xae\x00\x82\x00:\xff\xae\x00\x82\x00\ +<\xff\x85\x00\x82\x00\x89\xff\xd7\x00\x82\x00\x94\xff\xd7\x00\ +\x82\x00\x95\xff\xd7\x00\x82\x00\x96\xff\xd7\x00\x82\x00\x97\xff\ +\xd7\x00\x82\x00\x98\xff\xd7\x00\x82\x00\x9a\xff\xd7\x00\x82\x00\ +\x9f\xff\x85\x00\x82\x00\xc8\xff\xd7\x00\x82\x00\xca\xff\xd7\x00\ +\x82\x00\xcc\xff\xd7\x00\x82\x00\xce\xff\xd7\x00\x82\x00\xde\xff\ +\xd7\x00\x82\x00\xe0\xff\xd7\x00\x82\x00\xe2\xff\xd7\x00\x82\x00\ +\xe4\xff\xd7\x00\x82\x01\x0e\xff\xd7\x00\x82\x01\x10\xff\xd7\x00\ +\x82\x01\x12\xff\xd7\x00\x82\x01\x14\xff\xd7\x00\x82\x01$\xff\ +q\x00\x82\x01&\xffq\x00\x82\x016\xff\xae\x00\x82\x01\ +8\xff\x85\x00\x82\x01:\xff\x85\x00\x82\x01G\xff\xd7\x00\ +\x82\x01\xfa\xff\xae\x00\x82\x01\xfc\xff\xae\x00\x82\x01\xfe\xff\ +\xae\x00\x82\x02\x00\xff\x85\x00\x82\x02\x07\xffq\x00\x82\x02\ +\x0b\xffq\x00\x82\x02_\xff\xd7\x00\x82\x03I\xff\xd7\x00\ +\x82\x03K\xff\xd7\x00\x82\x03M\xff\xd7\x00\x82\x03O\xff\ +\xd7\x00\x82\x03Q\xff\xd7\x00\x82\x03S\xff\xd7\x00\x82\x03\ +U\xff\xd7\x00\x82\x03W\xff\xd7\x00\x82\x03Y\xff\xd7\x00\ +\x82\x03[\xff\xd7\x00\x82\x03]\xff\xd7\x00\x82\x03_\xff\ +\xd7\x00\x82\x03o\xff\x85\x00\x82\x03q\xff\x85\x00\x82\x03\ +s\xff\x85\x00\x82\x03\x8f\xffq\x00\x83\x00\x05\xffq\x00\ +\x83\x00\x0a\xffq\x00\x83\x00&\xff\xd7\x00\x83\x00*\xff\ +\xd7\x00\x83\x00-\x01\x0a\x00\x83\x002\xff\xd7\x00\x83\x00\ +4\xff\xd7\x00\x83\x007\xffq\x00\x83\x009\xff\xae\x00\ +\x83\x00:\xff\xae\x00\x83\x00<\xff\x85\x00\x83\x00\x89\xff\ +\xd7\x00\x83\x00\x94\xff\xd7\x00\x83\x00\x95\xff\xd7\x00\x83\x00\ +\x96\xff\xd7\x00\x83\x00\x97\xff\xd7\x00\x83\x00\x98\xff\xd7\x00\ +\x83\x00\x9a\xff\xd7\x00\x83\x00\x9f\xff\x85\x00\x83\x00\xc8\xff\ +\xd7\x00\x83\x00\xca\xff\xd7\x00\x83\x00\xcc\xff\xd7\x00\x83\x00\ +\xce\xff\xd7\x00\x83\x00\xde\xff\xd7\x00\x83\x00\xe0\xff\xd7\x00\ +\x83\x00\xe2\xff\xd7\x00\x83\x00\xe4\xff\xd7\x00\x83\x01\x0e\xff\ +\xd7\x00\x83\x01\x10\xff\xd7\x00\x83\x01\x12\xff\xd7\x00\x83\x01\ +\x14\xff\xd7\x00\x83\x01$\xffq\x00\x83\x01&\xffq\x00\ +\x83\x016\xff\xae\x00\x83\x018\xff\x85\x00\x83\x01:\xff\ +\x85\x00\x83\x01G\xff\xd7\x00\x83\x01\xfa\xff\xae\x00\x83\x01\ +\xfc\xff\xae\x00\x83\x01\xfe\xff\xae\x00\x83\x02\x00\xff\x85\x00\ +\x83\x02\x07\xffq\x00\x83\x02\x0b\xffq\x00\x83\x02_\xff\ +\xd7\x00\x83\x03I\xff\xd7\x00\x83\x03K\xff\xd7\x00\x83\x03\ +M\xff\xd7\x00\x83\x03O\xff\xd7\x00\x83\x03Q\xff\xd7\x00\ +\x83\x03S\xff\xd7\x00\x83\x03U\xff\xd7\x00\x83\x03W\xff\ +\xd7\x00\x83\x03Y\xff\xd7\x00\x83\x03[\xff\xd7\x00\x83\x03\ +]\xff\xd7\x00\x83\x03_\xff\xd7\x00\x83\x03o\xff\x85\x00\ +\x83\x03q\xff\x85\x00\x83\x03s\xff\x85\x00\x83\x03\x8f\xff\ +q\x00\x84\x00\x05\xffq\x00\x84\x00\x0a\xffq\x00\x84\x00\ +&\xff\xd7\x00\x84\x00*\xff\xd7\x00\x84\x00-\x01\x0a\x00\ +\x84\x002\xff\xd7\x00\x84\x004\xff\xd7\x00\x84\x007\xff\ +q\x00\x84\x009\xff\xae\x00\x84\x00:\xff\xae\x00\x84\x00\ +<\xff\x85\x00\x84\x00\x89\xff\xd7\x00\x84\x00\x94\xff\xd7\x00\ +\x84\x00\x95\xff\xd7\x00\x84\x00\x96\xff\xd7\x00\x84\x00\x97\xff\ +\xd7\x00\x84\x00\x98\xff\xd7\x00\x84\x00\x9a\xff\xd7\x00\x84\x00\ +\x9f\xff\x85\x00\x84\x00\xc8\xff\xd7\x00\x84\x00\xca\xff\xd7\x00\ +\x84\x00\xcc\xff\xd7\x00\x84\x00\xce\xff\xd7\x00\x84\x00\xde\xff\ +\xd7\x00\x84\x00\xe0\xff\xd7\x00\x84\x00\xe2\xff\xd7\x00\x84\x00\ +\xe4\xff\xd7\x00\x84\x01\x0e\xff\xd7\x00\x84\x01\x10\xff\xd7\x00\ +\x84\x01\x12\xff\xd7\x00\x84\x01\x14\xff\xd7\x00\x84\x01$\xff\ +q\x00\x84\x01&\xffq\x00\x84\x016\xff\xae\x00\x84\x01\ +8\xff\x85\x00\x84\x01:\xff\x85\x00\x84\x01G\xff\xd7\x00\ +\x84\x01\xfa\xff\xae\x00\x84\x01\xfc\xff\xae\x00\x84\x01\xfe\xff\ +\xae\x00\x84\x02\x00\xff\x85\x00\x84\x02\x07\xffq\x00\x84\x02\ +\x0b\xffq\x00\x84\x02_\xff\xd7\x00\x84\x03I\xff\xd7\x00\ +\x84\x03K\xff\xd7\x00\x84\x03M\xff\xd7\x00\x84\x03O\xff\ +\xd7\x00\x84\x03Q\xff\xd7\x00\x84\x03S\xff\xd7\x00\x84\x03\ +U\xff\xd7\x00\x84\x03W\xff\xd7\x00\x84\x03Y\xff\xd7\x00\ +\x84\x03[\xff\xd7\x00\x84\x03]\xff\xd7\x00\x84\x03_\xff\ +\xd7\x00\x84\x03o\xff\x85\x00\x84\x03q\xff\x85\x00\x84\x03\ +s\xff\x85\x00\x84\x03\x8f\xffq\x00\x85\x00\x05\xffq\x00\ +\x85\x00\x0a\xffq\x00\x85\x00&\xff\xd7\x00\x85\x00*\xff\ +\xd7\x00\x85\x00-\x01\x0a\x00\x85\x002\xff\xd7\x00\x85\x00\ +4\xff\xd7\x00\x85\x007\xffq\x00\x85\x009\xff\xae\x00\ +\x85\x00:\xff\xae\x00\x85\x00<\xff\x85\x00\x85\x00\x89\xff\ +\xd7\x00\x85\x00\x94\xff\xd7\x00\x85\x00\x95\xff\xd7\x00\x85\x00\ +\x96\xff\xd7\x00\x85\x00\x97\xff\xd7\x00\x85\x00\x98\xff\xd7\x00\ +\x85\x00\x9a\xff\xd7\x00\x85\x00\x9f\xff\x85\x00\x85\x00\xc8\xff\ +\xd7\x00\x85\x00\xca\xff\xd7\x00\x85\x00\xcc\xff\xd7\x00\x85\x00\ +\xce\xff\xd7\x00\x85\x00\xde\xff\xd7\x00\x85\x00\xe0\xff\xd7\x00\ +\x85\x00\xe2\xff\xd7\x00\x85\x00\xe4\xff\xd7\x00\x85\x01\x0e\xff\ +\xd7\x00\x85\x01\x10\xff\xd7\x00\x85\x01\x12\xff\xd7\x00\x85\x01\ +\x14\xff\xd7\x00\x85\x01$\xffq\x00\x85\x01&\xffq\x00\ +\x85\x016\xff\xae\x00\x85\x018\xff\x85\x00\x85\x01:\xff\ +\x85\x00\x85\x01G\xff\xd7\x00\x85\x01\xfa\xff\xae\x00\x85\x01\ +\xfc\xff\xae\x00\x85\x01\xfe\xff\xae\x00\x85\x02\x00\xff\x85\x00\ +\x85\x02\x07\xffq\x00\x85\x02\x0b\xffq\x00\x85\x02_\xff\ +\xd7\x00\x85\x03I\xff\xd7\x00\x85\x03K\xff\xd7\x00\x85\x03\ +M\xff\xd7\x00\x85\x03O\xff\xd7\x00\x85\x03Q\xff\xd7\x00\ +\x85\x03S\xff\xd7\x00\x85\x03U\xff\xd7\x00\x85\x03W\xff\ +\xd7\x00\x85\x03Y\xff\xd7\x00\x85\x03[\xff\xd7\x00\x85\x03\ +]\xff\xd7\x00\x85\x03_\xff\xd7\x00\x85\x03o\xff\x85\x00\ +\x85\x03q\xff\x85\x00\x85\x03s\xff\x85\x00\x85\x03\x8f\xff\ +q\x00\x86\x00\x05\xffq\x00\x86\x00\x0a\xffq\x00\x86\x00\ +&\xff\xd7\x00\x86\x00*\xff\xd7\x00\x86\x00-\x01\x0a\x00\ +\x86\x002\xff\xd7\x00\x86\x004\xff\xd7\x00\x86\x007\xff\ +q\x00\x86\x009\xff\xae\x00\x86\x00:\xff\xae\x00\x86\x00\ +<\xff\x85\x00\x86\x00\x89\xff\xd7\x00\x86\x00\x94\xff\xd7\x00\ +\x86\x00\x95\xff\xd7\x00\x86\x00\x96\xff\xd7\x00\x86\x00\x97\xff\ +\xd7\x00\x86\x00\x98\xff\xd7\x00\x86\x00\x9a\xff\xd7\x00\x86\x00\ +\x9f\xff\x85\x00\x86\x00\xc8\xff\xd7\x00\x86\x00\xca\xff\xd7\x00\ +\x86\x00\xcc\xff\xd7\x00\x86\x00\xce\xff\xd7\x00\x86\x00\xde\xff\ +\xd7\x00\x86\x00\xe0\xff\xd7\x00\x86\x00\xe2\xff\xd7\x00\x86\x00\ +\xe4\xff\xd7\x00\x86\x01\x0e\xff\xd7\x00\x86\x01\x10\xff\xd7\x00\ +\x86\x01\x12\xff\xd7\x00\x86\x01\x14\xff\xd7\x00\x86\x01$\xff\ +q\x00\x86\x01&\xffq\x00\x86\x016\xff\xae\x00\x86\x01\ +8\xff\x85\x00\x86\x01:\xff\x85\x00\x86\x01G\xff\xd7\x00\ +\x86\x01\xfa\xff\xae\x00\x86\x01\xfc\xff\xae\x00\x86\x01\xfe\xff\ +\xae\x00\x86\x02\x00\xff\x85\x00\x86\x02\x07\xffq\x00\x86\x02\ +\x0b\xffq\x00\x86\x02_\xff\xd7\x00\x86\x03I\xff\xd7\x00\ +\x86\x03K\xff\xd7\x00\x86\x03M\xff\xd7\x00\x86\x03O\xff\ +\xd7\x00\x86\x03Q\xff\xd7\x00\x86\x03S\xff\xd7\x00\x86\x03\ +U\xff\xd7\x00\x86\x03W\xff\xd7\x00\x86\x03Y\xff\xd7\x00\ +\x86\x03[\xff\xd7\x00\x86\x03]\xff\xd7\x00\x86\x03_\xff\ +\xd7\x00\x86\x03o\xff\x85\x00\x86\x03q\xff\x85\x00\x86\x03\ +s\xff\x85\x00\x86\x03\x8f\xffq\x00\x87\x00\x05\xffq\x00\ +\x87\x00\x0a\xffq\x00\x87\x00&\xff\xd7\x00\x87\x00*\xff\ +\xd7\x00\x87\x00-\x01\x0a\x00\x87\x002\xff\xd7\x00\x87\x00\ +4\xff\xd7\x00\x87\x007\xffq\x00\x87\x009\xff\xae\x00\ +\x87\x00:\xff\xae\x00\x87\x00<\xff\x85\x00\x87\x00\x89\xff\ +\xd7\x00\x87\x00\x94\xff\xd7\x00\x87\x00\x95\xff\xd7\x00\x87\x00\ +\x96\xff\xd7\x00\x87\x00\x97\xff\xd7\x00\x87\x00\x98\xff\xd7\x00\ +\x87\x00\x9a\xff\xd7\x00\x87\x00\x9f\xff\x85\x00\x87\x00\xc8\xff\ +\xd7\x00\x87\x00\xca\xff\xd7\x00\x87\x00\xcc\xff\xd7\x00\x87\x00\ +\xce\xff\xd7\x00\x87\x00\xde\xff\xd7\x00\x87\x00\xe0\xff\xd7\x00\ +\x87\x00\xe2\xff\xd7\x00\x87\x00\xe4\xff\xd7\x00\x87\x01\x0e\xff\ +\xd7\x00\x87\x01\x10\xff\xd7\x00\x87\x01\x12\xff\xd7\x00\x87\x01\ +\x14\xff\xd7\x00\x87\x01$\xffq\x00\x87\x01&\xffq\x00\ +\x87\x016\xff\xae\x00\x87\x018\xff\x85\x00\x87\x01:\xff\ +\x85\x00\x87\x01G\xff\xd7\x00\x87\x01\xfa\xff\xae\x00\x87\x01\ +\xfc\xff\xae\x00\x87\x01\xfe\xff\xae\x00\x87\x02\x00\xff\x85\x00\ +\x87\x02\x07\xffq\x00\x87\x02\x0b\xffq\x00\x87\x02_\xff\ +\xd7\x00\x87\x03I\xff\xd7\x00\x87\x03K\xff\xd7\x00\x87\x03\ +M\xff\xd7\x00\x87\x03O\xff\xd7\x00\x87\x03Q\xff\xd7\x00\ +\x87\x03S\xff\xd7\x00\x87\x03U\xff\xd7\x00\x87\x03W\xff\ +\xd7\x00\x87\x03Y\xff\xd7\x00\x87\x03[\xff\xd7\x00\x87\x03\ +]\xff\xd7\x00\x87\x03_\xff\xd7\x00\x87\x03o\xff\x85\x00\ +\x87\x03q\xff\x85\x00\x87\x03s\xff\x85\x00\x87\x03\x8f\xff\ +q\x00\x88\x00-\x00{\x00\x89\x00&\xff\xd7\x00\x89\x00\ +*\xff\xd7\x00\x89\x002\xff\xd7\x00\x89\x004\xff\xd7\x00\ +\x89\x00\x89\xff\xd7\x00\x89\x00\x94\xff\xd7\x00\x89\x00\x95\xff\ +\xd7\x00\x89\x00\x96\xff\xd7\x00\x89\x00\x97\xff\xd7\x00\x89\x00\ +\x98\xff\xd7\x00\x89\x00\x9a\xff\xd7\x00\x89\x00\xc8\xff\xd7\x00\ +\x89\x00\xca\xff\xd7\x00\x89\x00\xcc\xff\xd7\x00\x89\x00\xce\xff\ +\xd7\x00\x89\x00\xde\xff\xd7\x00\x89\x00\xe0\xff\xd7\x00\x89\x00\ +\xe2\xff\xd7\x00\x89\x00\xe4\xff\xd7\x00\x89\x01\x0e\xff\xd7\x00\ +\x89\x01\x10\xff\xd7\x00\x89\x01\x12\xff\xd7\x00\x89\x01\x14\xff\ +\xd7\x00\x89\x01G\xff\xd7\x00\x89\x02_\xff\xd7\x00\x89\x03\ +I\xff\xd7\x00\x89\x03K\xff\xd7\x00\x89\x03M\xff\xd7\x00\ +\x89\x03O\xff\xd7\x00\x89\x03Q\xff\xd7\x00\x89\x03S\xff\ +\xd7\x00\x89\x03U\xff\xd7\x00\x89\x03W\xff\xd7\x00\x89\x03\ +Y\xff\xd7\x00\x89\x03[\xff\xd7\x00\x89\x03]\xff\xd7\x00\ +\x89\x03_\xff\xd7\x00\x8a\x00-\x00{\x00\x8b\x00-\x00\ +{\x00\x8c\x00-\x00{\x00\x8d\x00-\x00{\x00\x92\x00\ +\x0f\xff\xae\x00\x92\x00\x11\xff\xae\x00\x92\x00$\xff\xd7\x00\ +\x92\x007\xff\xc3\x00\x92\x009\xff\xec\x00\x92\x00:\xff\ +\xec\x00\x92\x00;\xff\xd7\x00\x92\x00<\xff\xec\x00\x92\x00\ +=\xff\xec\x00\x92\x00\x82\xff\xd7\x00\x92\x00\x83\xff\xd7\x00\ +\x92\x00\x84\xff\xd7\x00\x92\x00\x85\xff\xd7\x00\x92\x00\x86\xff\ +\xd7\x00\x92\x00\x87\xff\xd7\x00\x92\x00\x9f\xff\xec\x00\x92\x00\ +\xc2\xff\xd7\x00\x92\x00\xc4\xff\xd7\x00\x92\x00\xc6\xff\xd7\x00\ +\x92\x01$\xff\xc3\x00\x92\x01&\xff\xc3\x00\x92\x016\xff\ +\xec\x00\x92\x018\xff\xec\x00\x92\x01:\xff\xec\x00\x92\x01\ +;\xff\xec\x00\x92\x01=\xff\xec\x00\x92\x01?\xff\xec\x00\ +\x92\x01C\xff\xd7\x00\x92\x01\xa0\xff\xec\x00\x92\x01\xfa\xff\ +\xec\x00\x92\x01\xfc\xff\xec\x00\x92\x01\xfe\xff\xec\x00\x92\x02\ +\x00\xff\xec\x00\x92\x02\x08\xff\xae\x00\x92\x02\x0c\xff\xae\x00\ +\x92\x02X\xff\xd7\x00\x92\x03\x1d\xff\xd7\x00\x92\x03\x1f\xff\ +\xd7\x00\x92\x03!\xff\xd7\x00\x92\x03#\xff\xd7\x00\x92\x03\ +%\xff\xd7\x00\x92\x03'\xff\xd7\x00\x92\x03)\xff\xd7\x00\ +\x92\x03+\xff\xd7\x00\x92\x03-\xff\xd7\x00\x92\x03/\xff\ +\xd7\x00\x92\x031\xff\xd7\x00\x92\x033\xff\xd7\x00\x92\x03\ +o\xff\xec\x00\x92\x03q\xff\xec\x00\x92\x03s\xff\xec\x00\ +\x92\x03\x8f\xff\xc3\x00\x94\x00\x0f\xff\xae\x00\x94\x00\x11\xff\ +\xae\x00\x94\x00$\xff\xd7\x00\x94\x007\xff\xc3\x00\x94\x00\ +9\xff\xec\x00\x94\x00:\xff\xec\x00\x94\x00;\xff\xd7\x00\ +\x94\x00<\xff\xec\x00\x94\x00=\xff\xec\x00\x94\x00\x82\xff\ +\xd7\x00\x94\x00\x83\xff\xd7\x00\x94\x00\x84\xff\xd7\x00\x94\x00\ +\x85\xff\xd7\x00\x94\x00\x86\xff\xd7\x00\x94\x00\x87\xff\xd7\x00\ +\x94\x00\x9f\xff\xec\x00\x94\x00\xc2\xff\xd7\x00\x94\x00\xc4\xff\ +\xd7\x00\x94\x00\xc6\xff\xd7\x00\x94\x01$\xff\xc3\x00\x94\x01\ +&\xff\xc3\x00\x94\x016\xff\xec\x00\x94\x018\xff\xec\x00\ +\x94\x01:\xff\xec\x00\x94\x01;\xff\xec\x00\x94\x01=\xff\ +\xec\x00\x94\x01?\xff\xec\x00\x94\x01C\xff\xd7\x00\x94\x01\ +\xa0\xff\xec\x00\x94\x01\xfa\xff\xec\x00\x94\x01\xfc\xff\xec\x00\ +\x94\x01\xfe\xff\xec\x00\x94\x02\x00\xff\xec\x00\x94\x02\x08\xff\ +\xae\x00\x94\x02\x0c\xff\xae\x00\x94\x02X\xff\xd7\x00\x94\x03\ +\x1d\xff\xd7\x00\x94\x03\x1f\xff\xd7\x00\x94\x03!\xff\xd7\x00\ +\x94\x03#\xff\xd7\x00\x94\x03%\xff\xd7\x00\x94\x03'\xff\ +\xd7\x00\x94\x03)\xff\xd7\x00\x94\x03+\xff\xd7\x00\x94\x03\ +-\xff\xd7\x00\x94\x03/\xff\xd7\x00\x94\x031\xff\xd7\x00\ +\x94\x033\xff\xd7\x00\x94\x03o\xff\xec\x00\x94\x03q\xff\ +\xec\x00\x94\x03s\xff\xec\x00\x94\x03\x8f\xff\xc3\x00\x95\x00\ +\x0f\xff\xae\x00\x95\x00\x11\xff\xae\x00\x95\x00$\xff\xd7\x00\ +\x95\x007\xff\xc3\x00\x95\x009\xff\xec\x00\x95\x00:\xff\ +\xec\x00\x95\x00;\xff\xd7\x00\x95\x00<\xff\xec\x00\x95\x00\ +=\xff\xec\x00\x95\x00\x82\xff\xd7\x00\x95\x00\x83\xff\xd7\x00\ +\x95\x00\x84\xff\xd7\x00\x95\x00\x85\xff\xd7\x00\x95\x00\x86\xff\ +\xd7\x00\x95\x00\x87\xff\xd7\x00\x95\x00\x9f\xff\xec\x00\x95\x00\ +\xc2\xff\xd7\x00\x95\x00\xc4\xff\xd7\x00\x95\x00\xc6\xff\xd7\x00\ +\x95\x01$\xff\xc3\x00\x95\x01&\xff\xc3\x00\x95\x016\xff\ +\xec\x00\x95\x018\xff\xec\x00\x95\x01:\xff\xec\x00\x95\x01\ +;\xff\xec\x00\x95\x01=\xff\xec\x00\x95\x01?\xff\xec\x00\ +\x95\x01C\xff\xd7\x00\x95\x01\xa0\xff\xec\x00\x95\x01\xfa\xff\ +\xec\x00\x95\x01\xfc\xff\xec\x00\x95\x01\xfe\xff\xec\x00\x95\x02\ +\x00\xff\xec\x00\x95\x02\x08\xff\xae\x00\x95\x02\x0c\xff\xae\x00\ +\x95\x02X\xff\xd7\x00\x95\x03\x1d\xff\xd7\x00\x95\x03\x1f\xff\ +\xd7\x00\x95\x03!\xff\xd7\x00\x95\x03#\xff\xd7\x00\x95\x03\ +%\xff\xd7\x00\x95\x03'\xff\xd7\x00\x95\x03)\xff\xd7\x00\ +\x95\x03+\xff\xd7\x00\x95\x03-\xff\xd7\x00\x95\x03/\xff\ +\xd7\x00\x95\x031\xff\xd7\x00\x95\x033\xff\xd7\x00\x95\x03\ +o\xff\xec\x00\x95\x03q\xff\xec\x00\x95\x03s\xff\xec\x00\ +\x95\x03\x8f\xff\xc3\x00\x96\x00\x0f\xff\xae\x00\x96\x00\x11\xff\ +\xae\x00\x96\x00$\xff\xd7\x00\x96\x007\xff\xc3\x00\x96\x00\ +9\xff\xec\x00\x96\x00:\xff\xec\x00\x96\x00;\xff\xd7\x00\ +\x96\x00<\xff\xec\x00\x96\x00=\xff\xec\x00\x96\x00\x82\xff\ +\xd7\x00\x96\x00\x83\xff\xd7\x00\x96\x00\x84\xff\xd7\x00\x96\x00\ +\x85\xff\xd7\x00\x96\x00\x86\xff\xd7\x00\x96\x00\x87\xff\xd7\x00\ +\x96\x00\x9f\xff\xec\x00\x96\x00\xc2\xff\xd7\x00\x96\x00\xc4\xff\ +\xd7\x00\x96\x00\xc6\xff\xd7\x00\x96\x01$\xff\xc3\x00\x96\x01\ +&\xff\xc3\x00\x96\x016\xff\xec\x00\x96\x018\xff\xec\x00\ +\x96\x01:\xff\xec\x00\x96\x01;\xff\xec\x00\x96\x01=\xff\ +\xec\x00\x96\x01?\xff\xec\x00\x96\x01C\xff\xd7\x00\x96\x01\ +\xa0\xff\xec\x00\x96\x01\xfa\xff\xec\x00\x96\x01\xfc\xff\xec\x00\ +\x96\x01\xfe\xff\xec\x00\x96\x02\x00\xff\xec\x00\x96\x02\x08\xff\ +\xae\x00\x96\x02\x0c\xff\xae\x00\x96\x02X\xff\xd7\x00\x96\x03\ +\x1d\xff\xd7\x00\x96\x03\x1f\xff\xd7\x00\x96\x03!\xff\xd7\x00\ +\x96\x03#\xff\xd7\x00\x96\x03%\xff\xd7\x00\x96\x03'\xff\ +\xd7\x00\x96\x03)\xff\xd7\x00\x96\x03+\xff\xd7\x00\x96\x03\ +-\xff\xd7\x00\x96\x03/\xff\xd7\x00\x96\x031\xff\xd7\x00\ +\x96\x033\xff\xd7\x00\x96\x03o\xff\xec\x00\x96\x03q\xff\ +\xec\x00\x96\x03s\xff\xec\x00\x96\x03\x8f\xff\xc3\x00\x97\x00\ +\x0f\xff\xae\x00\x97\x00\x11\xff\xae\x00\x97\x00$\xff\xd7\x00\ +\x97\x007\xff\xc3\x00\x97\x009\xff\xec\x00\x97\x00:\xff\ +\xec\x00\x97\x00;\xff\xd7\x00\x97\x00<\xff\xec\x00\x97\x00\ +=\xff\xec\x00\x97\x00\x82\xff\xd7\x00\x97\x00\x83\xff\xd7\x00\ +\x97\x00\x84\xff\xd7\x00\x97\x00\x85\xff\xd7\x00\x97\x00\x86\xff\ +\xd7\x00\x97\x00\x87\xff\xd7\x00\x97\x00\x9f\xff\xec\x00\x97\x00\ +\xc2\xff\xd7\x00\x97\x00\xc4\xff\xd7\x00\x97\x00\xc6\xff\xd7\x00\ +\x97\x01$\xff\xc3\x00\x97\x01&\xff\xc3\x00\x97\x016\xff\ +\xec\x00\x97\x018\xff\xec\x00\x97\x01:\xff\xec\x00\x97\x01\ +;\xff\xec\x00\x97\x01=\xff\xec\x00\x97\x01?\xff\xec\x00\ +\x97\x01C\xff\xd7\x00\x97\x01\xa0\xff\xec\x00\x97\x01\xfa\xff\ +\xec\x00\x97\x01\xfc\xff\xec\x00\x97\x01\xfe\xff\xec\x00\x97\x02\ +\x00\xff\xec\x00\x97\x02\x08\xff\xae\x00\x97\x02\x0c\xff\xae\x00\ +\x97\x02X\xff\xd7\x00\x97\x03\x1d\xff\xd7\x00\x97\x03\x1f\xff\ +\xd7\x00\x97\x03!\xff\xd7\x00\x97\x03#\xff\xd7\x00\x97\x03\ +%\xff\xd7\x00\x97\x03'\xff\xd7\x00\x97\x03)\xff\xd7\x00\ +\x97\x03+\xff\xd7\x00\x97\x03-\xff\xd7\x00\x97\x03/\xff\ +\xd7\x00\x97\x031\xff\xd7\x00\x97\x033\xff\xd7\x00\x97\x03\ +o\xff\xec\x00\x97\x03q\xff\xec\x00\x97\x03s\xff\xec\x00\ +\x97\x03\x8f\xff\xc3\x00\x98\x00\x0f\xff\xae\x00\x98\x00\x11\xff\ +\xae\x00\x98\x00$\xff\xd7\x00\x98\x007\xff\xc3\x00\x98\x00\ +9\xff\xec\x00\x98\x00:\xff\xec\x00\x98\x00;\xff\xd7\x00\ +\x98\x00<\xff\xec\x00\x98\x00=\xff\xec\x00\x98\x00\x82\xff\ +\xd7\x00\x98\x00\x83\xff\xd7\x00\x98\x00\x84\xff\xd7\x00\x98\x00\ +\x85\xff\xd7\x00\x98\x00\x86\xff\xd7\x00\x98\x00\x87\xff\xd7\x00\ +\x98\x00\x9f\xff\xec\x00\x98\x00\xc2\xff\xd7\x00\x98\x00\xc4\xff\ +\xd7\x00\x98\x00\xc6\xff\xd7\x00\x98\x01$\xff\xc3\x00\x98\x01\ +&\xff\xc3\x00\x98\x016\xff\xec\x00\x98\x018\xff\xec\x00\ +\x98\x01:\xff\xec\x00\x98\x01;\xff\xec\x00\x98\x01=\xff\ +\xec\x00\x98\x01?\xff\xec\x00\x98\x01C\xff\xd7\x00\x98\x01\ +\xa0\xff\xec\x00\x98\x01\xfa\xff\xec\x00\x98\x01\xfc\xff\xec\x00\ +\x98\x01\xfe\xff\xec\x00\x98\x02\x00\xff\xec\x00\x98\x02\x08\xff\ +\xae\x00\x98\x02\x0c\xff\xae\x00\x98\x02X\xff\xd7\x00\x98\x03\ +\x1d\xff\xd7\x00\x98\x03\x1f\xff\xd7\x00\x98\x03!\xff\xd7\x00\ +\x98\x03#\xff\xd7\x00\x98\x03%\xff\xd7\x00\x98\x03'\xff\ +\xd7\x00\x98\x03)\xff\xd7\x00\x98\x03+\xff\xd7\x00\x98\x03\ +-\xff\xd7\x00\x98\x03/\xff\xd7\x00\x98\x031\xff\xd7\x00\ +\x98\x033\xff\xd7\x00\x98\x03o\xff\xec\x00\x98\x03q\xff\ +\xec\x00\x98\x03s\xff\xec\x00\x98\x03\x8f\xff\xc3\x00\x9a\x00\ +\x0f\xff\xae\x00\x9a\x00\x11\xff\xae\x00\x9a\x00$\xff\xd7\x00\ +\x9a\x007\xff\xc3\x00\x9a\x009\xff\xec\x00\x9a\x00:\xff\ +\xec\x00\x9a\x00;\xff\xd7\x00\x9a\x00<\xff\xec\x00\x9a\x00\ +=\xff\xec\x00\x9a\x00\x82\xff\xd7\x00\x9a\x00\x83\xff\xd7\x00\ +\x9a\x00\x84\xff\xd7\x00\x9a\x00\x85\xff\xd7\x00\x9a\x00\x86\xff\ +\xd7\x00\x9a\x00\x87\xff\xd7\x00\x9a\x00\x9f\xff\xec\x00\x9a\x00\ +\xc2\xff\xd7\x00\x9a\x00\xc4\xff\xd7\x00\x9a\x00\xc6\xff\xd7\x00\ +\x9a\x01$\xff\xc3\x00\x9a\x01&\xff\xc3\x00\x9a\x016\xff\ +\xec\x00\x9a\x018\xff\xec\x00\x9a\x01:\xff\xec\x00\x9a\x01\ +;\xff\xec\x00\x9a\x01=\xff\xec\x00\x9a\x01?\xff\xec\x00\ +\x9a\x01C\xff\xd7\x00\x9a\x01\xa0\xff\xec\x00\x9a\x01\xfa\xff\ +\xec\x00\x9a\x01\xfc\xff\xec\x00\x9a\x01\xfe\xff\xec\x00\x9a\x02\ +\x00\xff\xec\x00\x9a\x02\x08\xff\xae\x00\x9a\x02\x0c\xff\xae\x00\ +\x9a\x02X\xff\xd7\x00\x9a\x03\x1d\xff\xd7\x00\x9a\x03\x1f\xff\ +\xd7\x00\x9a\x03!\xff\xd7\x00\x9a\x03#\xff\xd7\x00\x9a\x03\ +%\xff\xd7\x00\x9a\x03'\xff\xd7\x00\x9a\x03)\xff\xd7\x00\ +\x9a\x03+\xff\xd7\x00\x9a\x03-\xff\xd7\x00\x9a\x03/\xff\ +\xd7\x00\x9a\x031\xff\xd7\x00\x9a\x033\xff\xd7\x00\x9a\x03\ +o\xff\xec\x00\x9a\x03q\xff\xec\x00\x9a\x03s\xff\xec\x00\ +\x9a\x03\x8f\xff\xc3\x00\x9b\x00\x0f\xff\xd7\x00\x9b\x00\x11\xff\ +\xd7\x00\x9b\x00$\xff\xec\x00\x9b\x00\x82\xff\xec\x00\x9b\x00\ +\x83\xff\xec\x00\x9b\x00\x84\xff\xec\x00\x9b\x00\x85\xff\xec\x00\ +\x9b\x00\x86\xff\xec\x00\x9b\x00\x87\xff\xec\x00\x9b\x00\xc2\xff\ +\xec\x00\x9b\x00\xc4\xff\xec\x00\x9b\x00\xc6\xff\xec\x00\x9b\x01\ +C\xff\xec\x00\x9b\x02\x08\xff\xd7\x00\x9b\x02\x0c\xff\xd7\x00\ +\x9b\x02X\xff\xec\x00\x9b\x03\x1d\xff\xec\x00\x9b\x03\x1f\xff\ +\xec\x00\x9b\x03!\xff\xec\x00\x9b\x03#\xff\xec\x00\x9b\x03\ +%\xff\xec\x00\x9b\x03'\xff\xec\x00\x9b\x03)\xff\xec\x00\ +\x9b\x03+\xff\xec\x00\x9b\x03-\xff\xec\x00\x9b\x03/\xff\ +\xec\x00\x9b\x031\xff\xec\x00\x9b\x033\xff\xec\x00\x9c\x00\ +\x0f\xff\xd7\x00\x9c\x00\x11\xff\xd7\x00\x9c\x00$\xff\xec\x00\ +\x9c\x00\x82\xff\xec\x00\x9c\x00\x83\xff\xec\x00\x9c\x00\x84\xff\ +\xec\x00\x9c\x00\x85\xff\xec\x00\x9c\x00\x86\xff\xec\x00\x9c\x00\ +\x87\xff\xec\x00\x9c\x00\xc2\xff\xec\x00\x9c\x00\xc4\xff\xec\x00\ +\x9c\x00\xc6\xff\xec\x00\x9c\x01C\xff\xec\x00\x9c\x02\x08\xff\ +\xd7\x00\x9c\x02\x0c\xff\xd7\x00\x9c\x02X\xff\xec\x00\x9c\x03\ +\x1d\xff\xec\x00\x9c\x03\x1f\xff\xec\x00\x9c\x03!\xff\xec\x00\ +\x9c\x03#\xff\xec\x00\x9c\x03%\xff\xec\x00\x9c\x03'\xff\ +\xec\x00\x9c\x03)\xff\xec\x00\x9c\x03+\xff\xec\x00\x9c\x03\ +-\xff\xec\x00\x9c\x03/\xff\xec\x00\x9c\x031\xff\xec\x00\ +\x9c\x033\xff\xec\x00\x9d\x00\x0f\xff\xd7\x00\x9d\x00\x11\xff\ +\xd7\x00\x9d\x00$\xff\xec\x00\x9d\x00\x82\xff\xec\x00\x9d\x00\ +\x83\xff\xec\x00\x9d\x00\x84\xff\xec\x00\x9d\x00\x85\xff\xec\x00\ +\x9d\x00\x86\xff\xec\x00\x9d\x00\x87\xff\xec\x00\x9d\x00\xc2\xff\ +\xec\x00\x9d\x00\xc4\xff\xec\x00\x9d\x00\xc6\xff\xec\x00\x9d\x01\ +C\xff\xec\x00\x9d\x02\x08\xff\xd7\x00\x9d\x02\x0c\xff\xd7\x00\ +\x9d\x02X\xff\xec\x00\x9d\x03\x1d\xff\xec\x00\x9d\x03\x1f\xff\ +\xec\x00\x9d\x03!\xff\xec\x00\x9d\x03#\xff\xec\x00\x9d\x03\ +%\xff\xec\x00\x9d\x03'\xff\xec\x00\x9d\x03)\xff\xec\x00\ +\x9d\x03+\xff\xec\x00\x9d\x03-\xff\xec\x00\x9d\x03/\xff\ +\xec\x00\x9d\x031\xff\xec\x00\x9d\x033\xff\xec\x00\x9e\x00\ +\x0f\xff\xd7\x00\x9e\x00\x11\xff\xd7\x00\x9e\x00$\xff\xec\x00\ +\x9e\x00\x82\xff\xec\x00\x9e\x00\x83\xff\xec\x00\x9e\x00\x84\xff\ +\xec\x00\x9e\x00\x85\xff\xec\x00\x9e\x00\x86\xff\xec\x00\x9e\x00\ +\x87\xff\xec\x00\x9e\x00\xc2\xff\xec\x00\x9e\x00\xc4\xff\xec\x00\ +\x9e\x00\xc6\xff\xec\x00\x9e\x01C\xff\xec\x00\x9e\x02\x08\xff\ +\xd7\x00\x9e\x02\x0c\xff\xd7\x00\x9e\x02X\xff\xec\x00\x9e\x03\ +\x1d\xff\xec\x00\x9e\x03\x1f\xff\xec\x00\x9e\x03!\xff\xec\x00\ +\x9e\x03#\xff\xec\x00\x9e\x03%\xff\xec\x00\x9e\x03'\xff\ +\xec\x00\x9e\x03)\xff\xec\x00\x9e\x03+\xff\xec\x00\x9e\x03\ +-\xff\xec\x00\x9e\x03/\xff\xec\x00\x9e\x031\xff\xec\x00\ +\x9e\x033\xff\xec\x00\x9f\x00\x0f\xff\x85\x00\x9f\x00\x11\xff\ +\x85\x00\x9f\x00\x22\x00)\x00\x9f\x00$\xff\x85\x00\x9f\x00\ +&\xff\xd7\x00\x9f\x00*\xff\xd7\x00\x9f\x002\xff\xd7\x00\ +\x9f\x004\xff\xd7\x00\x9f\x00D\xff\x9a\x00\x9f\x00F\xff\ +\x9a\x00\x9f\x00G\xff\x9a\x00\x9f\x00H\xff\x9a\x00\x9f\x00\ +J\xff\xd7\x00\x9f\x00P\xff\xc3\x00\x9f\x00Q\xff\xc3\x00\ +\x9f\x00R\xff\x9a\x00\x9f\x00S\xff\xc3\x00\x9f\x00T\xff\ +\x9a\x00\x9f\x00U\xff\xc3\x00\x9f\x00V\xff\xae\x00\x9f\x00\ +X\xff\xc3\x00\x9f\x00]\xff\xd7\x00\x9f\x00\x82\xff\x85\x00\ +\x9f\x00\x83\xff\x85\x00\x9f\x00\x84\xff\x85\x00\x9f\x00\x85\xff\ +\x85\x00\x9f\x00\x86\xff\x85\x00\x9f\x00\x87\xff\x85\x00\x9f\x00\ +\x89\xff\xd7\x00\x9f\x00\x94\xff\xd7\x00\x9f\x00\x95\xff\xd7\x00\ +\x9f\x00\x96\xff\xd7\x00\x9f\x00\x97\xff\xd7\x00\x9f\x00\x98\xff\ +\xd7\x00\x9f\x00\x9a\xff\xd7\x00\x9f\x00\xa2\xff\x9a\x00\x9f\x00\ +\xa3\xff\x9a\x00\x9f\x00\xa4\xff\x9a\x00\x9f\x00\xa5\xff\x9a\x00\ +\x9f\x00\xa6\xff\x9a\x00\x9f\x00\xa7\xff\x9a\x00\x9f\x00\xa8\xff\ +\x9a\x00\x9f\x00\xa9\xff\x9a\x00\x9f\x00\xaa\xff\x9a\x00\x9f\x00\ +\xab\xff\x9a\x00\x9f\x00\xac\xff\x9a\x00\x9f\x00\xad\xff\x9a\x00\ +\x9f\x00\xb4\xff\x9a\x00\x9f\x00\xb5\xff\x9a\x00\x9f\x00\xb6\xff\ +\x9a\x00\x9f\x00\xb7\xff\x9a\x00\x9f\x00\xb8\xff\x9a\x00\x9f\x00\ +\xba\xff\x9a\x00\x9f\x00\xbb\xff\xc3\x00\x9f\x00\xbc\xff\xc3\x00\ +\x9f\x00\xbd\xff\xc3\x00\x9f\x00\xbe\xff\xc3\x00\x9f\x00\xc2\xff\ +\x85\x00\x9f\x00\xc3\xff\x9a\x00\x9f\x00\xc4\xff\x85\x00\x9f\x00\ +\xc5\xff\x9a\x00\x9f\x00\xc6\xff\x85\x00\x9f\x00\xc7\xff\x9a\x00\ +\x9f\x00\xc8\xff\xd7\x00\x9f\x00\xc9\xff\x9a\x00\x9f\x00\xca\xff\ +\xd7\x00\x9f\x00\xcb\xff\x9a\x00\x9f\x00\xcc\xff\xd7\x00\x9f\x00\ +\xcd\xff\x9a\x00\x9f\x00\xce\xff\xd7\x00\x9f\x00\xcf\xff\x9a\x00\ +\x9f\x00\xd1\xff\x9a\x00\x9f\x00\xd3\xff\x9a\x00\x9f\x00\xd5\xff\ +\x9a\x00\x9f\x00\xd7\xff\x9a\x00\x9f\x00\xd9\xff\x9a\x00\x9f\x00\ +\xdb\xff\x9a\x00\x9f\x00\xdd\xff\x9a\x00\x9f\x00\xde\xff\xd7\x00\ +\x9f\x00\xdf\xff\xd7\x00\x9f\x00\xe0\xff\xd7\x00\x9f\x00\xe1\xff\ +\xd7\x00\x9f\x00\xe2\xff\xd7\x00\x9f\x00\xe3\xff\xd7\x00\x9f\x00\ +\xe4\xff\xd7\x00\x9f\x00\xe5\xff\xd7\x00\x9f\x00\xfa\xff\xc3\x00\ +\x9f\x01\x06\xff\xc3\x00\x9f\x01\x08\xff\xc3\x00\x9f\x01\x0d\xff\ +\xc3\x00\x9f\x01\x0e\xff\xd7\x00\x9f\x01\x0f\xff\x9a\x00\x9f\x01\ +\x10\xff\xd7\x00\x9f\x01\x11\xff\x9a\x00\x9f\x01\x12\xff\xd7\x00\ +\x9f\x01\x13\xff\x9a\x00\x9f\x01\x14\xff\xd7\x00\x9f\x01\x15\xff\ +\x9a\x00\x9f\x01\x17\xff\xc3\x00\x9f\x01\x19\xff\xc3\x00\x9f\x01\ +\x1d\xff\xae\x00\x9f\x01!\xff\xae\x00\x9f\x01+\xff\xc3\x00\ +\x9f\x01-\xff\xc3\x00\x9f\x01/\xff\xc3\x00\x9f\x011\xff\ +\xc3\x00\x9f\x013\xff\xc3\x00\x9f\x015\xff\xc3\x00\x9f\x01\ +<\xff\xd7\x00\x9f\x01>\xff\xd7\x00\x9f\x01@\xff\xd7\x00\ +\x9f\x01C\xff\x85\x00\x9f\x01D\xff\x9a\x00\x9f\x01F\xff\ +\x9a\x00\x9f\x01G\xff\xd7\x00\x9f\x01H\xff\x9a\x00\x9f\x01\ +J\xff\xae\x00\x9f\x02\x08\xff\x85\x00\x9f\x02\x0c\xff\x85\x00\ +\x9f\x02W\xff\xc3\x00\x9f\x02X\xff\x85\x00\x9f\x02Y\xff\ +\x9a\x00\x9f\x02_\xff\xd7\x00\x9f\x02`\xff\x9a\x00\x9f\x02\ +b\xff\xc3\x00\x9f\x03\x1d\xff\x85\x00\x9f\x03\x1e\xff\x9a\x00\ +\x9f\x03\x1f\xff\x85\x00\x9f\x03 \xff\x9a\x00\x9f\x03!\xff\ +\x85\x00\x9f\x03\x22\xff\x9a\x00\x9f\x03#\xff\x85\x00\x9f\x03\ +%\xff\x85\x00\x9f\x03&\xff\x9a\x00\x9f\x03'\xff\x85\x00\ +\x9f\x03(\xff\x9a\x00\x9f\x03)\xff\x85\x00\x9f\x03*\xff\ +\x9a\x00\x9f\x03+\xff\x85\x00\x9f\x03,\xff\x9a\x00\x9f\x03\ +-\xff\x85\x00\x9f\x03.\xff\x9a\x00\x9f\x03/\xff\x85\x00\ +\x9f\x030\xff\x9a\x00\x9f\x031\xff\x85\x00\x9f\x032\xff\ +\x9a\x00\x9f\x033\xff\x85\x00\x9f\x034\xff\x9a\x00\x9f\x03\ +6\xff\x9a\x00\x9f\x038\xff\x9a\x00\x9f\x03:\xff\x9a\x00\ +\x9f\x03<\xff\x9a\x00\x9f\x03@\xff\x9a\x00\x9f\x03B\xff\ +\x9a\x00\x9f\x03D\xff\x9a\x00\x9f\x03I\xff\xd7\x00\x9f\x03\ +J\xff\x9a\x00\x9f\x03K\xff\xd7\x00\x9f\x03L\xff\x9a\x00\ +\x9f\x03M\xff\xd7\x00\x9f\x03N\xff\x9a\x00\x9f\x03O\xff\ +\xd7\x00\x9f\x03Q\xff\xd7\x00\x9f\x03R\xff\x9a\x00\x9f\x03\ +S\xff\xd7\x00\x9f\x03T\xff\x9a\x00\x9f\x03U\xff\xd7\x00\ +\x9f\x03V\xff\x9a\x00\x9f\x03W\xff\xd7\x00\x9f\x03X\xff\ +\x9a\x00\x9f\x03Y\xff\xd7\x00\x9f\x03Z\xff\x9a\x00\x9f\x03\ +[\xff\xd7\x00\x9f\x03\x5c\xff\x9a\x00\x9f\x03]\xff\xd7\x00\ +\x9f\x03^\xff\x9a\x00\x9f\x03_\xff\xd7\x00\x9f\x03`\xff\ +\x9a\x00\x9f\x03b\xff\xc3\x00\x9f\x03d\xff\xc3\x00\x9f\x03\ +f\xff\xc3\x00\x9f\x03h\xff\xc3\x00\x9f\x03j\xff\xc3\x00\ +\x9f\x03l\xff\xc3\x00\x9f\x03n\xff\xc3\x00\xa0\x00\x0f\xfe\ +\xf6\x00\xa0\x00\x11\xfe\xf6\x00\xa0\x00$\xff\x9a\x00\xa0\x00\ +;\xff\xd7\x00\xa0\x00=\xff\xec\x00\xa0\x00\x82\xff\x9a\x00\ +\xa0\x00\x83\xff\x9a\x00\xa0\x00\x84\xff\x9a\x00\xa0\x00\x85\xff\ +\x9a\x00\xa0\x00\x86\xff\x9a\x00\xa0\x00\x87\xff\x9a\x00\xa0\x00\ +\xc2\xff\x9a\x00\xa0\x00\xc4\xff\x9a\x00\xa0\x00\xc6\xff\x9a\x00\ +\xa0\x01;\xff\xec\x00\xa0\x01=\xff\xec\x00\xa0\x01?\xff\ +\xec\x00\xa0\x01C\xff\x9a\x00\xa0\x02\x08\xfe\xf6\x00\xa0\x02\ +\x0c\xfe\xf6\x00\xa0\x02X\xff\x9a\x00\xa0\x03\x1d\xff\x9a\x00\ +\xa0\x03\x1f\xff\x9a\x00\xa0\x03!\xff\x9a\x00\xa0\x03#\xff\ +\x9a\x00\xa0\x03%\xff\x9a\x00\xa0\x03'\xff\x9a\x00\xa0\x03\ +)\xff\x9a\x00\xa0\x03+\xff\x9a\x00\xa0\x03-\xff\x9a\x00\ +\xa0\x03/\xff\x9a\x00\xa0\x031\xff\x9a\x00\xa0\x033\xff\ +\x9a\x00\xa2\x00\x05\xff\xec\x00\xa2\x00\x0a\xff\xec\x00\xa2\x02\ +\x07\xff\xec\x00\xa2\x02\x0b\xff\xec\x00\xa3\x00\x05\xff\xec\x00\ +\xa3\x00\x0a\xff\xec\x00\xa3\x02\x07\xff\xec\x00\xa3\x02\x0b\xff\ +\xec\x00\xa4\x00\x05\xff\xec\x00\xa4\x00\x0a\xff\xec\x00\xa4\x02\ +\x07\xff\xec\x00\xa4\x02\x0b\xff\xec\x00\xa5\x00\x05\xff\xec\x00\ +\xa5\x00\x0a\xff\xec\x00\xa5\x02\x07\xff\xec\x00\xa5\x02\x0b\xff\ +\xec\x00\xa6\x00\x05\xff\xec\x00\xa6\x00\x0a\xff\xec\x00\xa6\x02\ +\x07\xff\xec\x00\xa6\x02\x0b\xff\xec\x00\xa7\x00\x05\xff\xec\x00\ +\xa7\x00\x0a\xff\xec\x00\xa7\x02\x07\xff\xec\x00\xa7\x02\x0b\xff\ +\xec\x00\xaa\x00\x05\xff\xec\x00\xaa\x00\x0a\xff\xec\x00\xaa\x00\ +Y\xff\xd7\x00\xaa\x00Z\xff\xd7\x00\xaa\x00[\xff\xd7\x00\ +\xaa\x00\x5c\xff\xd7\x00\xaa\x00]\xff\xec\x00\xaa\x00\xbf\xff\ +\xd7\x00\xaa\x017\xff\xd7\x00\xaa\x01<\xff\xec\x00\xaa\x01\ +>\xff\xec\x00\xaa\x01@\xff\xec\x00\xaa\x01\xfb\xff\xd7\x00\ +\xaa\x01\xfd\xff\xd7\x00\xaa\x02\x07\xff\xec\x00\xaa\x02\x0b\xff\ +\xec\x00\xaa\x03p\xff\xd7\x00\xab\x00\x05\xff\xec\x00\xab\x00\ +\x0a\xff\xec\x00\xab\x00Y\xff\xd7\x00\xab\x00Z\xff\xd7\x00\ +\xab\x00[\xff\xd7\x00\xab\x00\x5c\xff\xd7\x00\xab\x00]\xff\ +\xec\x00\xab\x00\xbf\xff\xd7\x00\xab\x017\xff\xd7\x00\xab\x01\ +<\xff\xec\x00\xab\x01>\xff\xec\x00\xab\x01@\xff\xec\x00\ +\xab\x01\xfb\xff\xd7\x00\xab\x01\xfd\xff\xd7\x00\xab\x02\x07\xff\ +\xec\x00\xab\x02\x0b\xff\xec\x00\xab\x03p\xff\xd7\x00\xac\x00\ +\x05\xff\xec\x00\xac\x00\x0a\xff\xec\x00\xac\x00Y\xff\xd7\x00\ +\xac\x00Z\xff\xd7\x00\xac\x00[\xff\xd7\x00\xac\x00\x5c\xff\ +\xd7\x00\xac\x00]\xff\xec\x00\xac\x00\xbf\xff\xd7\x00\xac\x01\ +7\xff\xd7\x00\xac\x01<\xff\xec\x00\xac\x01>\xff\xec\x00\ +\xac\x01@\xff\xec\x00\xac\x01\xfb\xff\xd7\x00\xac\x01\xfd\xff\ +\xd7\x00\xac\x02\x07\xff\xec\x00\xac\x02\x0b\xff\xec\x00\xac\x03\ +p\xff\xd7\x00\xad\x00\x05\xff\xec\x00\xad\x00\x0a\xff\xec\x00\ +\xad\x00Y\xff\xd7\x00\xad\x00Z\xff\xd7\x00\xad\x00[\xff\ +\xd7\x00\xad\x00\x5c\xff\xd7\x00\xad\x00]\xff\xec\x00\xad\x00\ +\xbf\xff\xd7\x00\xad\x017\xff\xd7\x00\xad\x01<\xff\xec\x00\ +\xad\x01>\xff\xec\x00\xad\x01@\xff\xec\x00\xad\x01\xfb\xff\ +\xd7\x00\xad\x01\xfd\xff\xd7\x00\xad\x02\x07\xff\xec\x00\xad\x02\ +\x0b\xff\xec\x00\xad\x03p\xff\xd7\x00\xb2\x00\x05\xff\xec\x00\ +\xb2\x00\x0a\xff\xec\x00\xb2\x00Y\xff\xd7\x00\xb2\x00Z\xff\ +\xd7\x00\xb2\x00[\xff\xd7\x00\xb2\x00\x5c\xff\xd7\x00\xb2\x00\ +]\xff\xec\x00\xb2\x00\xbf\xff\xd7\x00\xb2\x017\xff\xd7\x00\ +\xb2\x01<\xff\xec\x00\xb2\x01>\xff\xec\x00\xb2\x01@\xff\ +\xec\x00\xb2\x01\xfb\xff\xd7\x00\xb2\x01\xfd\xff\xd7\x00\xb2\x02\ +\x07\xff\xec\x00\xb2\x02\x0b\xff\xec\x00\xb2\x03p\xff\xd7\x00\ +\xb4\x00\x05\xff\xec\x00\xb4\x00\x0a\xff\xec\x00\xb4\x00Y\xff\ +\xd7\x00\xb4\x00Z\xff\xd7\x00\xb4\x00[\xff\xd7\x00\xb4\x00\ +\x5c\xff\xd7\x00\xb4\x00]\xff\xec\x00\xb4\x00\xbf\xff\xd7\x00\ +\xb4\x017\xff\xd7\x00\xb4\x01<\xff\xec\x00\xb4\x01>\xff\ +\xec\x00\xb4\x01@\xff\xec\x00\xb4\x01\xfb\xff\xd7\x00\xb4\x01\ +\xfd\xff\xd7\x00\xb4\x02\x07\xff\xec\x00\xb4\x02\x0b\xff\xec\x00\ +\xb4\x03p\xff\xd7\x00\xb5\x00\x05\xff\xec\x00\xb5\x00\x0a\xff\ +\xec\x00\xb5\x00Y\xff\xd7\x00\xb5\x00Z\xff\xd7\x00\xb5\x00\ +[\xff\xd7\x00\xb5\x00\x5c\xff\xd7\x00\xb5\x00]\xff\xec\x00\ +\xb5\x00\xbf\xff\xd7\x00\xb5\x017\xff\xd7\x00\xb5\x01<\xff\ +\xec\x00\xb5\x01>\xff\xec\x00\xb5\x01@\xff\xec\x00\xb5\x01\ +\xfb\xff\xd7\x00\xb5\x01\xfd\xff\xd7\x00\xb5\x02\x07\xff\xec\x00\ +\xb5\x02\x0b\xff\xec\x00\xb5\x03p\xff\xd7\x00\xb6\x00\x05\xff\ +\xec\x00\xb6\x00\x0a\xff\xec\x00\xb6\x00Y\xff\xd7\x00\xb6\x00\ +Z\xff\xd7\x00\xb6\x00[\xff\xd7\x00\xb6\x00\x5c\xff\xd7\x00\ +\xb6\x00]\xff\xec\x00\xb6\x00\xbf\xff\xd7\x00\xb6\x017\xff\ +\xd7\x00\xb6\x01<\xff\xec\x00\xb6\x01>\xff\xec\x00\xb6\x01\ +@\xff\xec\x00\xb6\x01\xfb\xff\xd7\x00\xb6\x01\xfd\xff\xd7\x00\ +\xb6\x02\x07\xff\xec\x00\xb6\x02\x0b\xff\xec\x00\xb6\x03p\xff\ +\xd7\x00\xb8\x00\x05\xff\xd7\x00\xb8\x00\x0a\xff\xd7\x00\xb8\x02\ +\x07\xff\xd7\x00\xb8\x02\x0b\xff\xd7\x00\xba\x00\x05\xff\xec\x00\ +\xba\x00\x0a\xff\xec\x00\xba\x00Y\xff\xd7\x00\xba\x00Z\xff\ +\xd7\x00\xba\x00[\xff\xd7\x00\xba\x00\x5c\xff\xd7\x00\xba\x00\ +]\xff\xec\x00\xba\x00\xbf\xff\xd7\x00\xba\x017\xff\xd7\x00\ +\xba\x01<\xff\xec\x00\xba\x01>\xff\xec\x00\xba\x01@\xff\ +\xec\x00\xba\x01\xfb\xff\xd7\x00\xba\x01\xfd\xff\xd7\x00\xba\x02\ +\x07\xff\xec\x00\xba\x02\x0b\xff\xec\x00\xba\x03p\xff\xd7\x00\ +\xbf\x00\x05\x00R\x00\xbf\x00\x0a\x00R\x00\xbf\x00\x0f\xff\ +\xae\x00\xbf\x00\x11\xff\xae\x00\xbf\x00\x22\x00)\x00\xbf\x02\ +\x07\x00R\x00\xbf\x02\x08\xff\xae\x00\xbf\x02\x0b\x00R\x00\ +\xbf\x02\x0c\xff\xae\x00\xc0\x00\x05\xff\xec\x00\xc0\x00\x0a\xff\ +\xec\x00\xc0\x00Y\xff\xd7\x00\xc0\x00Z\xff\xd7\x00\xc0\x00\ +[\xff\xd7\x00\xc0\x00\x5c\xff\xd7\x00\xc0\x00]\xff\xec\x00\ +\xc0\x00\xbf\xff\xd7\x00\xc0\x017\xff\xd7\x00\xc0\x01<\xff\ +\xec\x00\xc0\x01>\xff\xec\x00\xc0\x01@\xff\xec\x00\xc0\x01\ +\xfb\xff\xd7\x00\xc0\x01\xfd\xff\xd7\x00\xc0\x02\x07\xff\xec\x00\ +\xc0\x02\x0b\xff\xec\x00\xc0\x03p\xff\xd7\x00\xc1\x00\x05\x00\ +R\x00\xc1\x00\x0a\x00R\x00\xc1\x00\x0f\xff\xae\x00\xc1\x00\ +\x11\xff\xae\x00\xc1\x00\x22\x00)\x00\xc1\x02\x07\x00R\x00\ +\xc1\x02\x08\xff\xae\x00\xc1\x02\x0b\x00R\x00\xc1\x02\x0c\xff\ +\xae\x00\xc2\x00\x05\xffq\x00\xc2\x00\x0a\xffq\x00\xc2\x00\ +&\xff\xd7\x00\xc2\x00*\xff\xd7\x00\xc2\x00-\x01\x0a\x00\ +\xc2\x002\xff\xd7\x00\xc2\x004\xff\xd7\x00\xc2\x007\xff\ +q\x00\xc2\x009\xff\xae\x00\xc2\x00:\xff\xae\x00\xc2\x00\ +<\xff\x85\x00\xc2\x00\x89\xff\xd7\x00\xc2\x00\x94\xff\xd7\x00\ +\xc2\x00\x95\xff\xd7\x00\xc2\x00\x96\xff\xd7\x00\xc2\x00\x97\xff\ +\xd7\x00\xc2\x00\x98\xff\xd7\x00\xc2\x00\x9a\xff\xd7\x00\xc2\x00\ +\x9f\xff\x85\x00\xc2\x00\xc8\xff\xd7\x00\xc2\x00\xca\xff\xd7\x00\ +\xc2\x00\xcc\xff\xd7\x00\xc2\x00\xce\xff\xd7\x00\xc2\x00\xde\xff\ +\xd7\x00\xc2\x00\xe0\xff\xd7\x00\xc2\x00\xe2\xff\xd7\x00\xc2\x00\ +\xe4\xff\xd7\x00\xc2\x01\x0e\xff\xd7\x00\xc2\x01\x10\xff\xd7\x00\ +\xc2\x01\x12\xff\xd7\x00\xc2\x01\x14\xff\xd7\x00\xc2\x01$\xff\ +q\x00\xc2\x01&\xffq\x00\xc2\x016\xff\xae\x00\xc2\x01\ +8\xff\x85\x00\xc2\x01:\xff\x85\x00\xc2\x01G\xff\xd7\x00\ +\xc2\x01\xfa\xff\xae\x00\xc2\x01\xfc\xff\xae\x00\xc2\x01\xfe\xff\ +\xae\x00\xc2\x02\x00\xff\x85\x00\xc2\x02\x07\xffq\x00\xc2\x02\ +\x0b\xffq\x00\xc2\x02_\xff\xd7\x00\xc2\x03I\xff\xd7\x00\ +\xc2\x03K\xff\xd7\x00\xc2\x03M\xff\xd7\x00\xc2\x03O\xff\ +\xd7\x00\xc2\x03Q\xff\xd7\x00\xc2\x03S\xff\xd7\x00\xc2\x03\ +U\xff\xd7\x00\xc2\x03W\xff\xd7\x00\xc2\x03Y\xff\xd7\x00\ +\xc2\x03[\xff\xd7\x00\xc2\x03]\xff\xd7\x00\xc2\x03_\xff\ +\xd7\x00\xc2\x03o\xff\x85\x00\xc2\x03q\xff\x85\x00\xc2\x03\ +s\xff\x85\x00\xc2\x03\x8f\xffq\x00\xc3\x00\x05\xff\xec\x00\ +\xc3\x00\x0a\xff\xec\x00\xc3\x02\x07\xff\xec\x00\xc3\x02\x0b\xff\ +\xec\x00\xc4\x00\x05\xffq\x00\xc4\x00\x0a\xffq\x00\xc4\x00\ +&\xff\xd7\x00\xc4\x00*\xff\xd7\x00\xc4\x00-\x01\x0a\x00\ +\xc4\x002\xff\xd7\x00\xc4\x004\xff\xd7\x00\xc4\x007\xff\ +q\x00\xc4\x009\xff\xae\x00\xc4\x00:\xff\xae\x00\xc4\x00\ +<\xff\x85\x00\xc4\x00\x89\xff\xd7\x00\xc4\x00\x94\xff\xd7\x00\ +\xc4\x00\x95\xff\xd7\x00\xc4\x00\x96\xff\xd7\x00\xc4\x00\x97\xff\ +\xd7\x00\xc4\x00\x98\xff\xd7\x00\xc4\x00\x9a\xff\xd7\x00\xc4\x00\ +\x9f\xff\x85\x00\xc4\x00\xc8\xff\xd7\x00\xc4\x00\xca\xff\xd7\x00\ +\xc4\x00\xcc\xff\xd7\x00\xc4\x00\xce\xff\xd7\x00\xc4\x00\xde\xff\ +\xd7\x00\xc4\x00\xe0\xff\xd7\x00\xc4\x00\xe2\xff\xd7\x00\xc4\x00\ +\xe4\xff\xd7\x00\xc4\x01\x0e\xff\xd7\x00\xc4\x01\x10\xff\xd7\x00\ +\xc4\x01\x12\xff\xd7\x00\xc4\x01\x14\xff\xd7\x00\xc4\x01$\xff\ +q\x00\xc4\x01&\xffq\x00\xc4\x016\xff\xae\x00\xc4\x01\ +8\xff\x85\x00\xc4\x01:\xff\x85\x00\xc4\x01G\xff\xd7\x00\ +\xc4\x01\xfa\xff\xae\x00\xc4\x01\xfc\xff\xae\x00\xc4\x01\xfe\xff\ +\xae\x00\xc4\x02\x00\xff\x85\x00\xc4\x02\x07\xffq\x00\xc4\x02\ +\x0b\xffq\x00\xc4\x02_\xff\xd7\x00\xc4\x03I\xff\xd7\x00\ +\xc4\x03K\xff\xd7\x00\xc4\x03M\xff\xd7\x00\xc4\x03O\xff\ +\xd7\x00\xc4\x03Q\xff\xd7\x00\xc4\x03S\xff\xd7\x00\xc4\x03\ +U\xff\xd7\x00\xc4\x03W\xff\xd7\x00\xc4\x03Y\xff\xd7\x00\ +\xc4\x03[\xff\xd7\x00\xc4\x03]\xff\xd7\x00\xc4\x03_\xff\ +\xd7\x00\xc4\x03o\xff\x85\x00\xc4\x03q\xff\x85\x00\xc4\x03\ +s\xff\x85\x00\xc4\x03\x8f\xffq\x00\xc5\x00\x05\xff\xec\x00\ +\xc5\x00\x0a\xff\xec\x00\xc5\x02\x07\xff\xec\x00\xc5\x02\x0b\xff\ +\xec\x00\xc6\x00\x05\xffq\x00\xc6\x00\x0a\xffq\x00\xc6\x00\ +&\xff\xd7\x00\xc6\x00*\xff\xd7\x00\xc6\x00-\x01\x0a\x00\ +\xc6\x002\xff\xd7\x00\xc6\x004\xff\xd7\x00\xc6\x007\xff\ +q\x00\xc6\x009\xff\xae\x00\xc6\x00:\xff\xae\x00\xc6\x00\ +<\xff\x85\x00\xc6\x00\x89\xff\xd7\x00\xc6\x00\x94\xff\xd7\x00\ +\xc6\x00\x95\xff\xd7\x00\xc6\x00\x96\xff\xd7\x00\xc6\x00\x97\xff\ +\xd7\x00\xc6\x00\x98\xff\xd7\x00\xc6\x00\x9a\xff\xd7\x00\xc6\x00\ +\x9f\xff\x85\x00\xc6\x00\xc8\xff\xd7\x00\xc6\x00\xca\xff\xd7\x00\ +\xc6\x00\xcc\xff\xd7\x00\xc6\x00\xce\xff\xd7\x00\xc6\x00\xde\xff\ +\xd7\x00\xc6\x00\xe0\xff\xd7\x00\xc6\x00\xe2\xff\xd7\x00\xc6\x00\ +\xe4\xff\xd7\x00\xc6\x01\x0e\xff\xd7\x00\xc6\x01\x10\xff\xd7\x00\ +\xc6\x01\x12\xff\xd7\x00\xc6\x01\x14\xff\xd7\x00\xc6\x01$\xff\ +q\x00\xc6\x01&\xffq\x00\xc6\x016\xff\xae\x00\xc6\x01\ +8\xff\x85\x00\xc6\x01:\xff\x85\x00\xc6\x01G\xff\xd7\x00\ +\xc6\x01\xfa\xff\xae\x00\xc6\x01\xfc\xff\xae\x00\xc6\x01\xfe\xff\ +\xae\x00\xc6\x02\x00\xff\x85\x00\xc6\x02\x07\xffq\x00\xc6\x02\ +\x0b\xffq\x00\xc6\x02_\xff\xd7\x00\xc6\x03I\xff\xd7\x00\ +\xc6\x03K\xff\xd7\x00\xc6\x03M\xff\xd7\x00\xc6\x03O\xff\ +\xd7\x00\xc6\x03Q\xff\xd7\x00\xc6\x03S\xff\xd7\x00\xc6\x03\ +U\xff\xd7\x00\xc6\x03W\xff\xd7\x00\xc6\x03Y\xff\xd7\x00\ +\xc6\x03[\xff\xd7\x00\xc6\x03]\xff\xd7\x00\xc6\x03_\xff\ +\xd7\x00\xc6\x03o\xff\x85\x00\xc6\x03q\xff\x85\x00\xc6\x03\ +s\xff\x85\x00\xc6\x03\x8f\xffq\x00\xc7\x00\x05\xff\xec\x00\ +\xc7\x00\x0a\xff\xec\x00\xc7\x02\x07\xff\xec\x00\xc7\x02\x0b\xff\ +\xec\x00\xc8\x00&\xff\xd7\x00\xc8\x00*\xff\xd7\x00\xc8\x00\ +2\xff\xd7\x00\xc8\x004\xff\xd7\x00\xc8\x00\x89\xff\xd7\x00\ +\xc8\x00\x94\xff\xd7\x00\xc8\x00\x95\xff\xd7\x00\xc8\x00\x96\xff\ +\xd7\x00\xc8\x00\x97\xff\xd7\x00\xc8\x00\x98\xff\xd7\x00\xc8\x00\ +\x9a\xff\xd7\x00\xc8\x00\xc8\xff\xd7\x00\xc8\x00\xca\xff\xd7\x00\ +\xc8\x00\xcc\xff\xd7\x00\xc8\x00\xce\xff\xd7\x00\xc8\x00\xde\xff\ +\xd7\x00\xc8\x00\xe0\xff\xd7\x00\xc8\x00\xe2\xff\xd7\x00\xc8\x00\ +\xe4\xff\xd7\x00\xc8\x01\x0e\xff\xd7\x00\xc8\x01\x10\xff\xd7\x00\ +\xc8\x01\x12\xff\xd7\x00\xc8\x01\x14\xff\xd7\x00\xc8\x01G\xff\ +\xd7\x00\xc8\x02_\xff\xd7\x00\xc8\x03I\xff\xd7\x00\xc8\x03\ +K\xff\xd7\x00\xc8\x03M\xff\xd7\x00\xc8\x03O\xff\xd7\x00\ +\xc8\x03Q\xff\xd7\x00\xc8\x03S\xff\xd7\x00\xc8\x03U\xff\ +\xd7\x00\xc8\x03W\xff\xd7\x00\xc8\x03Y\xff\xd7\x00\xc8\x03\ +[\xff\xd7\x00\xc8\x03]\xff\xd7\x00\xc8\x03_\xff\xd7\x00\ +\xca\x00&\xff\xd7\x00\xca\x00*\xff\xd7\x00\xca\x002\xff\ +\xd7\x00\xca\x004\xff\xd7\x00\xca\x00\x89\xff\xd7\x00\xca\x00\ +\x94\xff\xd7\x00\xca\x00\x95\xff\xd7\x00\xca\x00\x96\xff\xd7\x00\ +\xca\x00\x97\xff\xd7\x00\xca\x00\x98\xff\xd7\x00\xca\x00\x9a\xff\ +\xd7\x00\xca\x00\xc8\xff\xd7\x00\xca\x00\xca\xff\xd7\x00\xca\x00\ +\xcc\xff\xd7\x00\xca\x00\xce\xff\xd7\x00\xca\x00\xde\xff\xd7\x00\ +\xca\x00\xe0\xff\xd7\x00\xca\x00\xe2\xff\xd7\x00\xca\x00\xe4\xff\ +\xd7\x00\xca\x01\x0e\xff\xd7\x00\xca\x01\x10\xff\xd7\x00\xca\x01\ +\x12\xff\xd7\x00\xca\x01\x14\xff\xd7\x00\xca\x01G\xff\xd7\x00\ +\xca\x02_\xff\xd7\x00\xca\x03I\xff\xd7\x00\xca\x03K\xff\ +\xd7\x00\xca\x03M\xff\xd7\x00\xca\x03O\xff\xd7\x00\xca\x03\ +Q\xff\xd7\x00\xca\x03S\xff\xd7\x00\xca\x03U\xff\xd7\x00\ +\xca\x03W\xff\xd7\x00\xca\x03Y\xff\xd7\x00\xca\x03[\xff\ +\xd7\x00\xca\x03]\xff\xd7\x00\xca\x03_\xff\xd7\x00\xcc\x00\ +&\xff\xd7\x00\xcc\x00*\xff\xd7\x00\xcc\x002\xff\xd7\x00\ +\xcc\x004\xff\xd7\x00\xcc\x00\x89\xff\xd7\x00\xcc\x00\x94\xff\ +\xd7\x00\xcc\x00\x95\xff\xd7\x00\xcc\x00\x96\xff\xd7\x00\xcc\x00\ +\x97\xff\xd7\x00\xcc\x00\x98\xff\xd7\x00\xcc\x00\x9a\xff\xd7\x00\ +\xcc\x00\xc8\xff\xd7\x00\xcc\x00\xca\xff\xd7\x00\xcc\x00\xcc\xff\ +\xd7\x00\xcc\x00\xce\xff\xd7\x00\xcc\x00\xde\xff\xd7\x00\xcc\x00\ +\xe0\xff\xd7\x00\xcc\x00\xe2\xff\xd7\x00\xcc\x00\xe4\xff\xd7\x00\ +\xcc\x01\x0e\xff\xd7\x00\xcc\x01\x10\xff\xd7\x00\xcc\x01\x12\xff\ +\xd7\x00\xcc\x01\x14\xff\xd7\x00\xcc\x01G\xff\xd7\x00\xcc\x02\ +_\xff\xd7\x00\xcc\x03I\xff\xd7\x00\xcc\x03K\xff\xd7\x00\ +\xcc\x03M\xff\xd7\x00\xcc\x03O\xff\xd7\x00\xcc\x03Q\xff\ +\xd7\x00\xcc\x03S\xff\xd7\x00\xcc\x03U\xff\xd7\x00\xcc\x03\ +W\xff\xd7\x00\xcc\x03Y\xff\xd7\x00\xcc\x03[\xff\xd7\x00\ +\xcc\x03]\xff\xd7\x00\xcc\x03_\xff\xd7\x00\xce\x00&\xff\ +\xd7\x00\xce\x00*\xff\xd7\x00\xce\x002\xff\xd7\x00\xce\x00\ +4\xff\xd7\x00\xce\x00\x89\xff\xd7\x00\xce\x00\x94\xff\xd7\x00\ +\xce\x00\x95\xff\xd7\x00\xce\x00\x96\xff\xd7\x00\xce\x00\x97\xff\ +\xd7\x00\xce\x00\x98\xff\xd7\x00\xce\x00\x9a\xff\xd7\x00\xce\x00\ +\xc8\xff\xd7\x00\xce\x00\xca\xff\xd7\x00\xce\x00\xcc\xff\xd7\x00\ +\xce\x00\xce\xff\xd7\x00\xce\x00\xde\xff\xd7\x00\xce\x00\xe0\xff\ +\xd7\x00\xce\x00\xe2\xff\xd7\x00\xce\x00\xe4\xff\xd7\x00\xce\x01\ +\x0e\xff\xd7\x00\xce\x01\x10\xff\xd7\x00\xce\x01\x12\xff\xd7\x00\ +\xce\x01\x14\xff\xd7\x00\xce\x01G\xff\xd7\x00\xce\x02_\xff\ +\xd7\x00\xce\x03I\xff\xd7\x00\xce\x03K\xff\xd7\x00\xce\x03\ +M\xff\xd7\x00\xce\x03O\xff\xd7\x00\xce\x03Q\xff\xd7\x00\ +\xce\x03S\xff\xd7\x00\xce\x03U\xff\xd7\x00\xce\x03W\xff\ +\xd7\x00\xce\x03Y\xff\xd7\x00\xce\x03[\xff\xd7\x00\xce\x03\ +]\xff\xd7\x00\xce\x03_\xff\xd7\x00\xd0\x00\x0f\xff\xae\x00\ +\xd0\x00\x11\xff\xae\x00\xd0\x00$\xff\xd7\x00\xd0\x007\xff\ +\xc3\x00\xd0\x009\xff\xec\x00\xd0\x00:\xff\xec\x00\xd0\x00\ +;\xff\xd7\x00\xd0\x00<\xff\xec\x00\xd0\x00=\xff\xec\x00\ +\xd0\x00\x82\xff\xd7\x00\xd0\x00\x83\xff\xd7\x00\xd0\x00\x84\xff\ +\xd7\x00\xd0\x00\x85\xff\xd7\x00\xd0\x00\x86\xff\xd7\x00\xd0\x00\ +\x87\xff\xd7\x00\xd0\x00\x9f\xff\xec\x00\xd0\x00\xc2\xff\xd7\x00\ +\xd0\x00\xc4\xff\xd7\x00\xd0\x00\xc6\xff\xd7\x00\xd0\x01$\xff\ +\xc3\x00\xd0\x01&\xff\xc3\x00\xd0\x016\xff\xec\x00\xd0\x01\ +8\xff\xec\x00\xd0\x01:\xff\xec\x00\xd0\x01;\xff\xec\x00\ +\xd0\x01=\xff\xec\x00\xd0\x01?\xff\xec\x00\xd0\x01C\xff\ +\xd7\x00\xd0\x01\xa0\xff\xec\x00\xd0\x01\xfa\xff\xec\x00\xd0\x01\ +\xfc\xff\xec\x00\xd0\x01\xfe\xff\xec\x00\xd0\x02\x00\xff\xec\x00\ +\xd0\x02\x08\xff\xae\x00\xd0\x02\x0c\xff\xae\x00\xd0\x02X\xff\ +\xd7\x00\xd0\x03\x1d\xff\xd7\x00\xd0\x03\x1f\xff\xd7\x00\xd0\x03\ +!\xff\xd7\x00\xd0\x03#\xff\xd7\x00\xd0\x03%\xff\xd7\x00\ +\xd0\x03'\xff\xd7\x00\xd0\x03)\xff\xd7\x00\xd0\x03+\xff\ +\xd7\x00\xd0\x03-\xff\xd7\x00\xd0\x03/\xff\xd7\x00\xd0\x03\ +1\xff\xd7\x00\xd0\x033\xff\xd7\x00\xd0\x03o\xff\xec\x00\ +\xd0\x03q\xff\xec\x00\xd0\x03s\xff\xec\x00\xd0\x03\x8f\xff\ +\xc3\x00\xd1\x00\x05\x00R\x00\xd1\x00\x0a\x00R\x00\xd1\x00\ +\x0c\x00\x8f\x00\xd1\x00\x22\x00\xa4\x00\xd1\x00@\x00\x8f\x00\ +\xd1\x00E\x00=\x00\xd1\x00K\x00=\x00\xd1\x00N\x00\ +=\x00\xd1\x00O\x00=\x00\xd1\x00`\x00\x8f\x00\xd1\x00\ +\xe7\x00=\x00\xd1\x00\xe9\x00{\x00\xd1\x02\x07\x00R\x00\ +\xd1\x02\x0b\x00R\x00\xd2\x00\x0f\xff\xae\x00\xd2\x00\x11\xff\ +\xae\x00\xd2\x00$\xff\xd7\x00\xd2\x007\xff\xc3\x00\xd2\x00\ +9\xff\xec\x00\xd2\x00:\xff\xec\x00\xd2\x00;\xff\xd7\x00\ +\xd2\x00<\xff\xec\x00\xd2\x00=\xff\xec\x00\xd2\x00\x82\xff\ +\xd7\x00\xd2\x00\x83\xff\xd7\x00\xd2\x00\x84\xff\xd7\x00\xd2\x00\ +\x85\xff\xd7\x00\xd2\x00\x86\xff\xd7\x00\xd2\x00\x87\xff\xd7\x00\ +\xd2\x00\x9f\xff\xec\x00\xd2\x00\xc2\xff\xd7\x00\xd2\x00\xc4\xff\ +\xd7\x00\xd2\x00\xc6\xff\xd7\x00\xd2\x01$\xff\xc3\x00\xd2\x01\ +&\xff\xc3\x00\xd2\x016\xff\xec\x00\xd2\x018\xff\xec\x00\ +\xd2\x01:\xff\xec\x00\xd2\x01;\xff\xec\x00\xd2\x01=\xff\ +\xec\x00\xd2\x01?\xff\xec\x00\xd2\x01C\xff\xd7\x00\xd2\x01\ +\xa0\xff\xec\x00\xd2\x01\xfa\xff\xec\x00\xd2\x01\xfc\xff\xec\x00\ +\xd2\x01\xfe\xff\xec\x00\xd2\x02\x00\xff\xec\x00\xd2\x02\x08\xff\ +\xae\x00\xd2\x02\x0c\xff\xae\x00\xd2\x02X\xff\xd7\x00\xd2\x03\ +\x1d\xff\xd7\x00\xd2\x03\x1f\xff\xd7\x00\xd2\x03!\xff\xd7\x00\ +\xd2\x03#\xff\xd7\x00\xd2\x03%\xff\xd7\x00\xd2\x03'\xff\ +\xd7\x00\xd2\x03)\xff\xd7\x00\xd2\x03+\xff\xd7\x00\xd2\x03\ +-\xff\xd7\x00\xd2\x03/\xff\xd7\x00\xd2\x031\xff\xd7\x00\ +\xd2\x033\xff\xd7\x00\xd2\x03o\xff\xec\x00\xd2\x03q\xff\ +\xec\x00\xd2\x03s\xff\xec\x00\xd2\x03\x8f\xff\xc3\x00\xd4\x00\ +-\x00{\x00\xd5\x00\x05\xff\xec\x00\xd5\x00\x0a\xff\xec\x00\ +\xd5\x00Y\xff\xd7\x00\xd5\x00Z\xff\xd7\x00\xd5\x00[\xff\ +\xd7\x00\xd5\x00\x5c\xff\xd7\x00\xd5\x00]\xff\xec\x00\xd5\x00\ +\xbf\xff\xd7\x00\xd5\x017\xff\xd7\x00\xd5\x01<\xff\xec\x00\ +\xd5\x01>\xff\xec\x00\xd5\x01@\xff\xec\x00\xd5\x01\xfb\xff\ +\xd7\x00\xd5\x01\xfd\xff\xd7\x00\xd5\x02\x07\xff\xec\x00\xd5\x02\ +\x0b\xff\xec\x00\xd5\x03p\xff\xd7\x00\xd6\x00-\x00{\x00\ +\xd7\x00\x05\xff\xec\x00\xd7\x00\x0a\xff\xec\x00\xd7\x00Y\xff\ +\xd7\x00\xd7\x00Z\xff\xd7\x00\xd7\x00[\xff\xd7\x00\xd7\x00\ +\x5c\xff\xd7\x00\xd7\x00]\xff\xec\x00\xd7\x00\xbf\xff\xd7\x00\ +\xd7\x017\xff\xd7\x00\xd7\x01<\xff\xec\x00\xd7\x01>\xff\ +\xec\x00\xd7\x01@\xff\xec\x00\xd7\x01\xfb\xff\xd7\x00\xd7\x01\ +\xfd\xff\xd7\x00\xd7\x02\x07\xff\xec\x00\xd7\x02\x0b\xff\xec\x00\ +\xd7\x03p\xff\xd7\x00\xd8\x00-\x00{\x00\xd9\x00\x05\xff\ +\xec\x00\xd9\x00\x0a\xff\xec\x00\xd9\x00Y\xff\xd7\x00\xd9\x00\ +Z\xff\xd7\x00\xd9\x00[\xff\xd7\x00\xd9\x00\x5c\xff\xd7\x00\ +\xd9\x00]\xff\xec\x00\xd9\x00\xbf\xff\xd7\x00\xd9\x017\xff\ +\xd7\x00\xd9\x01<\xff\xec\x00\xd9\x01>\xff\xec\x00\xd9\x01\ +@\xff\xec\x00\xd9\x01\xfb\xff\xd7\x00\xd9\x01\xfd\xff\xd7\x00\ +\xd9\x02\x07\xff\xec\x00\xd9\x02\x0b\xff\xec\x00\xd9\x03p\xff\ +\xd7\x00\xda\x00-\x00{\x00\xdb\x00\x05\xff\xec\x00\xdb\x00\ +\x0a\xff\xec\x00\xdb\x00Y\xff\xd7\x00\xdb\x00Z\xff\xd7\x00\ +\xdb\x00[\xff\xd7\x00\xdb\x00\x5c\xff\xd7\x00\xdb\x00]\xff\ +\xec\x00\xdb\x00\xbf\xff\xd7\x00\xdb\x017\xff\xd7\x00\xdb\x01\ +<\xff\xec\x00\xdb\x01>\xff\xec\x00\xdb\x01@\xff\xec\x00\ +\xdb\x01\xfb\xff\xd7\x00\xdb\x01\xfd\xff\xd7\x00\xdb\x02\x07\xff\ +\xec\x00\xdb\x02\x0b\xff\xec\x00\xdb\x03p\xff\xd7\x00\xdc\x00\ +-\x00{\x00\xdd\x00\x05\xff\xec\x00\xdd\x00\x0a\xff\xec\x00\ +\xdd\x00Y\xff\xd7\x00\xdd\x00Z\xff\xd7\x00\xdd\x00[\xff\ +\xd7\x00\xdd\x00\x5c\xff\xd7\x00\xdd\x00]\xff\xec\x00\xdd\x00\ +\xbf\xff\xd7\x00\xdd\x017\xff\xd7\x00\xdd\x01<\xff\xec\x00\ +\xdd\x01>\xff\xec\x00\xdd\x01@\xff\xec\x00\xdd\x01\xfb\xff\ +\xd7\x00\xdd\x01\xfd\xff\xd7\x00\xdd\x02\x07\xff\xec\x00\xdd\x02\ +\x0b\xff\xec\x00\xdd\x03p\xff\xd7\x00\xe7\x00\x05\xff\xec\x00\ +\xe7\x00\x0a\xff\xec\x00\xe7\x02\x07\xff\xec\x00\xe7\x02\x0b\xff\ +\xec\x00\xf8\x00&\xff\xd7\x00\xf8\x00*\xff\xd7\x00\xf8\x00\ +2\xff\xd7\x00\xf8\x004\xff\xd7\x00\xf8\x00\x89\xff\xd7\x00\ +\xf8\x00\x94\xff\xd7\x00\xf8\x00\x95\xff\xd7\x00\xf8\x00\x96\xff\ +\xd7\x00\xf8\x00\x97\xff\xd7\x00\xf8\x00\x98\xff\xd7\x00\xf8\x00\ +\x9a\xff\xd7\x00\xf8\x00\xc8\xff\xd7\x00\xf8\x00\xca\xff\xd7\x00\ +\xf8\x00\xcc\xff\xd7\x00\xf8\x00\xce\xff\xd7\x00\xf8\x00\xde\xff\ +\xd7\x00\xf8\x00\xe0\xff\xd7\x00\xf8\x00\xe2\xff\xd7\x00\xf8\x00\ +\xe4\xff\xd7\x00\xf8\x01\x0e\xff\xd7\x00\xf8\x01\x10\xff\xd7\x00\ +\xf8\x01\x12\xff\xd7\x00\xf8\x01\x14\xff\xd7\x00\xf8\x01G\xff\ +\xd7\x00\xf8\x02_\xff\xd7\x00\xf8\x03I\xff\xd7\x00\xf8\x03\ +K\xff\xd7\x00\xf8\x03M\xff\xd7\x00\xf8\x03O\xff\xd7\x00\ +\xf8\x03Q\xff\xd7\x00\xf8\x03S\xff\xd7\x00\xf8\x03U\xff\ +\xd7\x00\xf8\x03W\xff\xd7\x00\xf8\x03Y\xff\xd7\x00\xf8\x03\ +[\xff\xd7\x00\xf8\x03]\xff\xd7\x00\xf8\x03_\xff\xd7\x00\ +\xf9\x00F\xff\xd7\x00\xf9\x00G\xff\xd7\x00\xf9\x00H\xff\ +\xd7\x00\xf9\x00R\xff\xd7\x00\xf9\x00T\xff\xd7\x00\xf9\x00\ +\xa2\xff\xd7\x00\xf9\x00\xa9\xff\xd7\x00\xf9\x00\xaa\xff\xd7\x00\ +\xf9\x00\xab\xff\xd7\x00\xf9\x00\xac\xff\xd7\x00\xf9\x00\xad\xff\ +\xd7\x00\xf9\x00\xb4\xff\xd7\x00\xf9\x00\xb5\xff\xd7\x00\xf9\x00\ +\xb6\xff\xd7\x00\xf9\x00\xb7\xff\xd7\x00\xf9\x00\xb8\xff\xd7\x00\ +\xf9\x00\xba\xff\xd7\x00\xf9\x00\xc9\xff\xd7\x00\xf9\x00\xcb\xff\ +\xd7\x00\xf9\x00\xcd\xff\xd7\x00\xf9\x00\xcf\xff\xd7\x00\xf9\x00\ +\xd1\xff\xd7\x00\xf9\x00\xd3\xff\xd7\x00\xf9\x00\xd5\xff\xd7\x00\ +\xf9\x00\xd7\xff\xd7\x00\xf9\x00\xd9\xff\xd7\x00\xf9\x00\xdb\xff\ +\xd7\x00\xf9\x00\xdd\xff\xd7\x00\xf9\x01\x0f\xff\xd7\x00\xf9\x01\ +\x11\xff\xd7\x00\xf9\x01\x13\xff\xd7\x00\xf9\x01\x15\xff\xd7\x00\ +\xf9\x01H\xff\xd7\x00\xf9\x02`\xff\xd7\x00\xf9\x036\xff\ +\xd7\x00\xf9\x038\xff\xd7\x00\xf9\x03:\xff\xd7\x00\xf9\x03\ +<\xff\xd7\x00\xf9\x03@\xff\xd7\x00\xf9\x03B\xff\xd7\x00\ +\xf9\x03D\xff\xd7\x00\xf9\x03J\xff\xd7\x00\xf9\x03L\xff\ +\xd7\x00\xf9\x03N\xff\xd7\x00\xf9\x03R\xff\xd7\x00\xf9\x03\ +T\xff\xd7\x00\xf9\x03V\xff\xd7\x00\xf9\x03X\xff\xd7\x00\ +\xf9\x03Z\xff\xd7\x00\xf9\x03\x5c\xff\xd7\x00\xf9\x03^\xff\ +\xd7\x00\xf9\x03`\xff\xd7\x00\xfa\x00F\xff\xd7\x00\xfa\x00\ +G\xff\xd7\x00\xfa\x00H\xff\xd7\x00\xfa\x00R\xff\xd7\x00\ +\xfa\x00T\xff\xd7\x00\xfa\x00\xa2\xff\xd7\x00\xfa\x00\xa9\xff\ +\xd7\x00\xfa\x00\xaa\xff\xd7\x00\xfa\x00\xab\xff\xd7\x00\xfa\x00\ +\xac\xff\xd7\x00\xfa\x00\xad\xff\xd7\x00\xfa\x00\xb4\xff\xd7\x00\ +\xfa\x00\xb5\xff\xd7\x00\xfa\x00\xb6\xff\xd7\x00\xfa\x00\xb7\xff\ +\xd7\x00\xfa\x00\xb8\xff\xd7\x00\xfa\x00\xba\xff\xd7\x00\xfa\x00\ +\xc9\xff\xd7\x00\xfa\x00\xcb\xff\xd7\x00\xfa\x00\xcd\xff\xd7\x00\ +\xfa\x00\xcf\xff\xd7\x00\xfa\x00\xd1\xff\xd7\x00\xfa\x00\xd3\xff\ +\xd7\x00\xfa\x00\xd5\xff\xd7\x00\xfa\x00\xd7\xff\xd7\x00\xfa\x00\ +\xd9\xff\xd7\x00\xfa\x00\xdb\xff\xd7\x00\xfa\x00\xdd\xff\xd7\x00\ +\xfa\x01\x0f\xff\xd7\x00\xfa\x01\x11\xff\xd7\x00\xfa\x01\x13\xff\ +\xd7\x00\xfa\x01\x15\xff\xd7\x00\xfa\x01H\xff\xd7\x00\xfa\x02\ +`\xff\xd7\x00\xfa\x036\xff\xd7\x00\xfa\x038\xff\xd7\x00\ +\xfa\x03:\xff\xd7\x00\xfa\x03<\xff\xd7\x00\xfa\x03@\xff\ +\xd7\x00\xfa\x03B\xff\xd7\x00\xfa\x03D\xff\xd7\x00\xfa\x03\ +J\xff\xd7\x00\xfa\x03L\xff\xd7\x00\xfa\x03N\xff\xd7\x00\ +\xfa\x03R\xff\xd7\x00\xfa\x03T\xff\xd7\x00\xfa\x03V\xff\ +\xd7\x00\xfa\x03X\xff\xd7\x00\xfa\x03Z\xff\xd7\x00\xfa\x03\ +\x5c\xff\xd7\x00\xfa\x03^\xff\xd7\x00\xfa\x03`\xff\xd7\x00\ +\xfb\x00\x05\xff\x5c\x00\xfb\x00\x0a\xff\x5c\x00\xfb\x00&\xff\ +\xd7\x00\xfb\x00*\xff\xd7\x00\xfb\x002\xff\xd7\x00\xfb\x00\ +4\xff\xd7\x00\xfb\x007\xff\xd7\x00\xfb\x008\xff\xec\x00\ +\xfb\x009\xff\xd7\x00\xfb\x00:\xff\xd7\x00\xfb\x00<\xff\ +\xc3\x00\xfb\x00\x89\xff\xd7\x00\xfb\x00\x94\xff\xd7\x00\xfb\x00\ +\x95\xff\xd7\x00\xfb\x00\x96\xff\xd7\x00\xfb\x00\x97\xff\xd7\x00\ +\xfb\x00\x98\xff\xd7\x00\xfb\x00\x9a\xff\xd7\x00\xfb\x00\x9b\xff\ +\xec\x00\xfb\x00\x9c\xff\xec\x00\xfb\x00\x9d\xff\xec\x00\xfb\x00\ +\x9e\xff\xec\x00\xfb\x00\x9f\xff\xc3\x00\xfb\x00\xc8\xff\xd7\x00\ +\xfb\x00\xca\xff\xd7\x00\xfb\x00\xcc\xff\xd7\x00\xfb\x00\xce\xff\ +\xd7\x00\xfb\x00\xde\xff\xd7\x00\xfb\x00\xe0\xff\xd7\x00\xfb\x00\ +\xe2\xff\xd7\x00\xfb\x00\xe4\xff\xd7\x00\xfb\x01\x0e\xff\xd7\x00\ +\xfb\x01\x10\xff\xd7\x00\xfb\x01\x12\xff\xd7\x00\xfb\x01\x14\xff\ +\xd7\x00\xfb\x01$\xff\xd7\x00\xfb\x01&\xff\xd7\x00\xfb\x01\ +*\xff\xec\x00\xfb\x01,\xff\xec\x00\xfb\x01.\xff\xec\x00\ +\xfb\x010\xff\xec\x00\xfb\x012\xff\xec\x00\xfb\x014\xff\ +\xec\x00\xfb\x016\xff\xd7\x00\xfb\x018\xff\xc3\x00\xfb\x01\ +:\xff\xc3\x00\xfb\x01G\xff\xd7\x00\xfb\x01\xfa\xff\xd7\x00\ +\xfb\x01\xfc\xff\xd7\x00\xfb\x01\xfe\xff\xd7\x00\xfb\x02\x00\xff\ +\xc3\x00\xfb\x02\x07\xff\x5c\x00\xfb\x02\x0b\xff\x5c\x00\xfb\x02\ +_\xff\xd7\x00\xfb\x02a\xff\xec\x00\xfb\x03I\xff\xd7\x00\ +\xfb\x03K\xff\xd7\x00\xfb\x03M\xff\xd7\x00\xfb\x03O\xff\ +\xd7\x00\xfb\x03Q\xff\xd7\x00\xfb\x03S\xff\xd7\x00\xfb\x03\ +U\xff\xd7\x00\xfb\x03W\xff\xd7\x00\xfb\x03Y\xff\xd7\x00\ +\xfb\x03[\xff\xd7\x00\xfb\x03]\xff\xd7\x00\xfb\x03_\xff\ +\xd7\x00\xfb\x03a\xff\xec\x00\xfb\x03c\xff\xec\x00\xfb\x03\ +e\xff\xec\x00\xfb\x03g\xff\xec\x00\xfb\x03i\xff\xec\x00\ +\xfb\x03k\xff\xec\x00\xfb\x03m\xff\xec\x00\xfb\x03o\xff\ +\xc3\x00\xfb\x03q\xff\xc3\x00\xfb\x03s\xff\xc3\x00\xfb\x03\ +\x8f\xff\xd7\x00\xfd\x00\x05\xff\x5c\x00\xfd\x00\x0a\xff\x5c\x00\ +\xfd\x00&\xff\xd7\x00\xfd\x00*\xff\xd7\x00\xfd\x002\xff\ +\xd7\x00\xfd\x004\xff\xd7\x00\xfd\x007\xff\xd7\x00\xfd\x00\ +8\xff\xec\x00\xfd\x009\xff\xd7\x00\xfd\x00:\xff\xd7\x00\ +\xfd\x00<\xff\xc3\x00\xfd\x00\x89\xff\xd7\x00\xfd\x00\x94\xff\ +\xd7\x00\xfd\x00\x95\xff\xd7\x00\xfd\x00\x96\xff\xd7\x00\xfd\x00\ +\x97\xff\xd7\x00\xfd\x00\x98\xff\xd7\x00\xfd\x00\x9a\xff\xd7\x00\ +\xfd\x00\x9b\xff\xec\x00\xfd\x00\x9c\xff\xec\x00\xfd\x00\x9d\xff\ +\xec\x00\xfd\x00\x9e\xff\xec\x00\xfd\x00\x9f\xff\xc3\x00\xfd\x00\ +\xc8\xff\xd7\x00\xfd\x00\xca\xff\xd7\x00\xfd\x00\xcc\xff\xd7\x00\ +\xfd\x00\xce\xff\xd7\x00\xfd\x00\xde\xff\xd7\x00\xfd\x00\xe0\xff\ +\xd7\x00\xfd\x00\xe2\xff\xd7\x00\xfd\x00\xe4\xff\xd7\x00\xfd\x01\ +\x0e\xff\xd7\x00\xfd\x01\x10\xff\xd7\x00\xfd\x01\x12\xff\xd7\x00\ +\xfd\x01\x14\xff\xd7\x00\xfd\x01$\xff\xd7\x00\xfd\x01&\xff\ +\xd7\x00\xfd\x01*\xff\xec\x00\xfd\x01,\xff\xec\x00\xfd\x01\ +.\xff\xec\x00\xfd\x010\xff\xec\x00\xfd\x012\xff\xec\x00\ +\xfd\x014\xff\xec\x00\xfd\x016\xff\xd7\x00\xfd\x018\xff\ +\xc3\x00\xfd\x01:\xff\xc3\x00\xfd\x01G\xff\xd7\x00\xfd\x01\ +\xfa\xff\xd7\x00\xfd\x01\xfc\xff\xd7\x00\xfd\x01\xfe\xff\xd7\x00\ +\xfd\x02\x00\xff\xc3\x00\xfd\x02\x07\xff\x5c\x00\xfd\x02\x0b\xff\ +\x5c\x00\xfd\x02_\xff\xd7\x00\xfd\x02a\xff\xec\x00\xfd\x03\ +I\xff\xd7\x00\xfd\x03K\xff\xd7\x00\xfd\x03M\xff\xd7\x00\ +\xfd\x03O\xff\xd7\x00\xfd\x03Q\xff\xd7\x00\xfd\x03S\xff\ +\xd7\x00\xfd\x03U\xff\xd7\x00\xfd\x03W\xff\xd7\x00\xfd\x03\ +Y\xff\xd7\x00\xfd\x03[\xff\xd7\x00\xfd\x03]\xff\xd7\x00\ +\xfd\x03_\xff\xd7\x00\xfd\x03a\xff\xec\x00\xfd\x03c\xff\ +\xec\x00\xfd\x03e\xff\xec\x00\xfd\x03g\xff\xec\x00\xfd\x03\ +i\xff\xec\x00\xfd\x03k\xff\xec\x00\xfd\x03m\xff\xec\x00\ +\xfd\x03o\xff\xc3\x00\xfd\x03q\xff\xc3\x00\xfd\x03s\xff\ +\xc3\x00\xfd\x03\x8f\xff\xd7\x00\xff\x00\x05\xff\x5c\x00\xff\x00\ +\x0a\xff\x5c\x00\xff\x00&\xff\xd7\x00\xff\x00*\xff\xd7\x00\ +\xff\x002\xff\xd7\x00\xff\x004\xff\xd7\x00\xff\x007\xff\ +\xd7\x00\xff\x008\xff\xec\x00\xff\x009\xff\xd7\x00\xff\x00\ +:\xff\xd7\x00\xff\x00<\xff\xc3\x00\xff\x00\x89\xff\xd7\x00\ +\xff\x00\x94\xff\xd7\x00\xff\x00\x95\xff\xd7\x00\xff\x00\x96\xff\ +\xd7\x00\xff\x00\x97\xff\xd7\x00\xff\x00\x98\xff\xd7\x00\xff\x00\ +\x9a\xff\xd7\x00\xff\x00\x9b\xff\xec\x00\xff\x00\x9c\xff\xec\x00\ +\xff\x00\x9d\xff\xec\x00\xff\x00\x9e\xff\xec\x00\xff\x00\x9f\xff\ +\xc3\x00\xff\x00\xc8\xff\xd7\x00\xff\x00\xca\xff\xd7\x00\xff\x00\ +\xcc\xff\xd7\x00\xff\x00\xce\xff\xd7\x00\xff\x00\xde\xff\xd7\x00\ +\xff\x00\xe0\xff\xd7\x00\xff\x00\xe2\xff\xd7\x00\xff\x00\xe4\xff\ +\xd7\x00\xff\x01\x0e\xff\xd7\x00\xff\x01\x10\xff\xd7\x00\xff\x01\ +\x12\xff\xd7\x00\xff\x01\x14\xff\xd7\x00\xff\x01$\xff\xd7\x00\ +\xff\x01&\xff\xd7\x00\xff\x01*\xff\xec\x00\xff\x01,\xff\ +\xec\x00\xff\x01.\xff\xec\x00\xff\x010\xff\xec\x00\xff\x01\ +2\xff\xec\x00\xff\x014\xff\xec\x00\xff\x016\xff\xd7\x00\ +\xff\x018\xff\xc3\x00\xff\x01:\xff\xc3\x00\xff\x01G\xff\ +\xd7\x00\xff\x01\xfa\xff\xd7\x00\xff\x01\xfc\xff\xd7\x00\xff\x01\ +\xfe\xff\xd7\x00\xff\x02\x00\xff\xc3\x00\xff\x02\x07\xff\x5c\x00\ +\xff\x02\x0b\xff\x5c\x00\xff\x02_\xff\xd7\x00\xff\x02a\xff\ +\xec\x00\xff\x03I\xff\xd7\x00\xff\x03K\xff\xd7\x00\xff\x03\ +M\xff\xd7\x00\xff\x03O\xff\xd7\x00\xff\x03Q\xff\xd7\x00\ +\xff\x03S\xff\xd7\x00\xff\x03U\xff\xd7\x00\xff\x03W\xff\ +\xd7\x00\xff\x03Y\xff\xd7\x00\xff\x03[\xff\xd7\x00\xff\x03\ +]\xff\xd7\x00\xff\x03_\xff\xd7\x00\xff\x03a\xff\xec\x00\ +\xff\x03c\xff\xec\x00\xff\x03e\xff\xec\x00\xff\x03g\xff\ +\xec\x00\xff\x03i\xff\xec\x00\xff\x03k\xff\xec\x00\xff\x03\ +m\xff\xec\x00\xff\x03o\xff\xc3\x00\xff\x03q\xff\xc3\x00\ +\xff\x03s\xff\xc3\x00\xff\x03\x8f\xff\xd7\x01\x00\x00\x05\x00\ +R\x01\x00\x00\x0a\x00R\x01\x00\x00\x0c\x00\x8f\x01\x00\x00\ +\x22\x00\x8f\x01\x00\x00@\x00\x8f\x01\x00\x00E\x00=\x01\ +\x00\x00K\x00=\x01\x00\x00N\x00=\x01\x00\x00O\x00\ +=\x01\x00\x00`\x00\x8f\x01\x00\x00\xe7\x00=\x01\x00\x00\ +\xe9\x00\x8f\x01\x00\x02\x07\x00R\x01\x00\x02\x0b\x00R\x01\ +\x01\x00\x05\xff\x5c\x01\x01\x00\x0a\xff\x5c\x01\x01\x00&\xff\ +\xd7\x01\x01\x00*\xff\xd7\x01\x01\x002\xff\xd7\x01\x01\x00\ +4\xff\xd7\x01\x01\x007\xff\xd7\x01\x01\x008\xff\xec\x01\ +\x01\x009\xff\xd7\x01\x01\x00:\xff\xd7\x01\x01\x00<\xff\ +\xc3\x01\x01\x00\x89\xff\xd7\x01\x01\x00\x94\xff\xd7\x01\x01\x00\ +\x95\xff\xd7\x01\x01\x00\x96\xff\xd7\x01\x01\x00\x97\xff\xd7\x01\ +\x01\x00\x98\xff\xd7\x01\x01\x00\x9a\xff\xd7\x01\x01\x00\x9b\xff\ +\xec\x01\x01\x00\x9c\xff\xec\x01\x01\x00\x9d\xff\xec\x01\x01\x00\ +\x9e\xff\xec\x01\x01\x00\x9f\xff\xc3\x01\x01\x00\xc8\xff\xd7\x01\ +\x01\x00\xca\xff\xd7\x01\x01\x00\xcc\xff\xd7\x01\x01\x00\xce\xff\ +\xd7\x01\x01\x00\xde\xff\xd7\x01\x01\x00\xe0\xff\xd7\x01\x01\x00\ +\xe2\xff\xd7\x01\x01\x00\xe4\xff\xd7\x01\x01\x01\x0e\xff\xd7\x01\ +\x01\x01\x10\xff\xd7\x01\x01\x01\x12\xff\xd7\x01\x01\x01\x14\xff\ +\xd7\x01\x01\x01$\xff\xd7\x01\x01\x01&\xff\xd7\x01\x01\x01\ +*\xff\xec\x01\x01\x01,\xff\xec\x01\x01\x01.\xff\xec\x01\ +\x01\x010\xff\xec\x01\x01\x012\xff\xec\x01\x01\x014\xff\ +\xec\x01\x01\x016\xff\xd7\x01\x01\x018\xff\xc3\x01\x01\x01\ +:\xff\xc3\x01\x01\x01G\xff\xd7\x01\x01\x01\xfa\xff\xd7\x01\ +\x01\x01\xfc\xff\xd7\x01\x01\x01\xfe\xff\xd7\x01\x01\x02\x00\xff\ +\xc3\x01\x01\x02\x07\xff\x5c\x01\x01\x02\x0b\xff\x5c\x01\x01\x02\ +_\xff\xd7\x01\x01\x02a\xff\xec\x01\x01\x03I\xff\xd7\x01\ +\x01\x03K\xff\xd7\x01\x01\x03M\xff\xd7\x01\x01\x03O\xff\ +\xd7\x01\x01\x03Q\xff\xd7\x01\x01\x03S\xff\xd7\x01\x01\x03\ +U\xff\xd7\x01\x01\x03W\xff\xd7\x01\x01\x03Y\xff\xd7\x01\ +\x01\x03[\xff\xd7\x01\x01\x03]\xff\xd7\x01\x01\x03_\xff\ +\xd7\x01\x01\x03a\xff\xec\x01\x01\x03c\xff\xec\x01\x01\x03\ +e\xff\xec\x01\x01\x03g\xff\xec\x01\x01\x03i\xff\xec\x01\ +\x01\x03k\xff\xec\x01\x01\x03m\xff\xec\x01\x01\x03o\xff\ +\xc3\x01\x01\x03q\xff\xc3\x01\x01\x03s\xff\xc3\x01\x01\x03\ +\x8f\xff\xd7\x01\x03\x00\x05\xff\x5c\x01\x03\x00\x0a\xff\x5c\x01\ +\x03\x00&\xff\xd7\x01\x03\x00*\xff\xd7\x01\x03\x002\xff\ +\xd7\x01\x03\x004\xff\xd7\x01\x03\x007\xff\xd7\x01\x03\x00\ +8\xff\xec\x01\x03\x009\xff\xd7\x01\x03\x00:\xff\xd7\x01\ +\x03\x00<\xff\xc3\x01\x03\x00\x89\xff\xd7\x01\x03\x00\x94\xff\ +\xd7\x01\x03\x00\x95\xff\xd7\x01\x03\x00\x96\xff\xd7\x01\x03\x00\ +\x97\xff\xd7\x01\x03\x00\x98\xff\xd7\x01\x03\x00\x9a\xff\xd7\x01\ +\x03\x00\x9b\xff\xec\x01\x03\x00\x9c\xff\xec\x01\x03\x00\x9d\xff\ +\xec\x01\x03\x00\x9e\xff\xec\x01\x03\x00\x9f\xff\xc3\x01\x03\x00\ +\xc8\xff\xd7\x01\x03\x00\xca\xff\xd7\x01\x03\x00\xcc\xff\xd7\x01\ +\x03\x00\xce\xff\xd7\x01\x03\x00\xde\xff\xd7\x01\x03\x00\xe0\xff\ +\xd7\x01\x03\x00\xe2\xff\xd7\x01\x03\x00\xe4\xff\xd7\x01\x03\x01\ +\x0e\xff\xd7\x01\x03\x01\x10\xff\xd7\x01\x03\x01\x12\xff\xd7\x01\ +\x03\x01\x14\xff\xd7\x01\x03\x01$\xff\xd7\x01\x03\x01&\xff\ +\xd7\x01\x03\x01*\xff\xec\x01\x03\x01,\xff\xec\x01\x03\x01\ +.\xff\xec\x01\x03\x010\xff\xec\x01\x03\x012\xff\xec\x01\ +\x03\x014\xff\xec\x01\x03\x016\xff\xd7\x01\x03\x018\xff\ +\xc3\x01\x03\x01:\xff\xc3\x01\x03\x01G\xff\xd7\x01\x03\x01\ +\xfa\xff\xd7\x01\x03\x01\xfc\xff\xd7\x01\x03\x01\xfe\xff\xd7\x01\ +\x03\x02\x00\xff\xc3\x01\x03\x02\x07\xff\x5c\x01\x03\x02\x0b\xff\ +\x5c\x01\x03\x02_\xff\xd7\x01\x03\x02a\xff\xec\x01\x03\x03\ +I\xff\xd7\x01\x03\x03K\xff\xd7\x01\x03\x03M\xff\xd7\x01\ +\x03\x03O\xff\xd7\x01\x03\x03Q\xff\xd7\x01\x03\x03S\xff\ +\xd7\x01\x03\x03U\xff\xd7\x01\x03\x03W\xff\xd7\x01\x03\x03\ +Y\xff\xd7\x01\x03\x03[\xff\xd7\x01\x03\x03]\xff\xd7\x01\ +\x03\x03_\xff\xd7\x01\x03\x03a\xff\xec\x01\x03\x03c\xff\ +\xec\x01\x03\x03e\xff\xec\x01\x03\x03g\xff\xec\x01\x03\x03\ +i\xff\xec\x01\x03\x03k\xff\xec\x01\x03\x03m\xff\xec\x01\ +\x03\x03o\xff\xc3\x01\x03\x03q\xff\xc3\x01\x03\x03s\xff\ +\xc3\x01\x03\x03\x8f\xff\xd7\x01\x08\x00\x05\xff\xec\x01\x08\x00\ +\x0a\xff\xec\x01\x08\x02\x07\xff\xec\x01\x08\x02\x0b\xff\xec\x01\ +\x0e\x00\x0f\xff\xae\x01\x0e\x00\x11\xff\xae\x01\x0e\x00$\xff\ +\xd7\x01\x0e\x007\xff\xc3\x01\x0e\x009\xff\xec\x01\x0e\x00\ +:\xff\xec\x01\x0e\x00;\xff\xd7\x01\x0e\x00<\xff\xec\x01\ +\x0e\x00=\xff\xec\x01\x0e\x00\x82\xff\xd7\x01\x0e\x00\x83\xff\ +\xd7\x01\x0e\x00\x84\xff\xd7\x01\x0e\x00\x85\xff\xd7\x01\x0e\x00\ +\x86\xff\xd7\x01\x0e\x00\x87\xff\xd7\x01\x0e\x00\x9f\xff\xec\x01\ +\x0e\x00\xc2\xff\xd7\x01\x0e\x00\xc4\xff\xd7\x01\x0e\x00\xc6\xff\ +\xd7\x01\x0e\x01$\xff\xc3\x01\x0e\x01&\xff\xc3\x01\x0e\x01\ +6\xff\xec\x01\x0e\x018\xff\xec\x01\x0e\x01:\xff\xec\x01\ +\x0e\x01;\xff\xec\x01\x0e\x01=\xff\xec\x01\x0e\x01?\xff\ +\xec\x01\x0e\x01C\xff\xd7\x01\x0e\x01\xa0\xff\xec\x01\x0e\x01\ +\xfa\xff\xec\x01\x0e\x01\xfc\xff\xec\x01\x0e\x01\xfe\xff\xec\x01\ +\x0e\x02\x00\xff\xec\x01\x0e\x02\x08\xff\xae\x01\x0e\x02\x0c\xff\ +\xae\x01\x0e\x02X\xff\xd7\x01\x0e\x03\x1d\xff\xd7\x01\x0e\x03\ +\x1f\xff\xd7\x01\x0e\x03!\xff\xd7\x01\x0e\x03#\xff\xd7\x01\ +\x0e\x03%\xff\xd7\x01\x0e\x03'\xff\xd7\x01\x0e\x03)\xff\ +\xd7\x01\x0e\x03+\xff\xd7\x01\x0e\x03-\xff\xd7\x01\x0e\x03\ +/\xff\xd7\x01\x0e\x031\xff\xd7\x01\x0e\x033\xff\xd7\x01\ +\x0e\x03o\xff\xec\x01\x0e\x03q\xff\xec\x01\x0e\x03s\xff\ +\xec\x01\x0e\x03\x8f\xff\xc3\x01\x10\x00\x0f\xff\xae\x01\x10\x00\ +\x11\xff\xae\x01\x10\x00$\xff\xd7\x01\x10\x007\xff\xc3\x01\ +\x10\x009\xff\xec\x01\x10\x00:\xff\xec\x01\x10\x00;\xff\ +\xd7\x01\x10\x00<\xff\xec\x01\x10\x00=\xff\xec\x01\x10\x00\ +\x82\xff\xd7\x01\x10\x00\x83\xff\xd7\x01\x10\x00\x84\xff\xd7\x01\ +\x10\x00\x85\xff\xd7\x01\x10\x00\x86\xff\xd7\x01\x10\x00\x87\xff\ +\xd7\x01\x10\x00\x9f\xff\xec\x01\x10\x00\xc2\xff\xd7\x01\x10\x00\ +\xc4\xff\xd7\x01\x10\x00\xc6\xff\xd7\x01\x10\x01$\xff\xc3\x01\ +\x10\x01&\xff\xc3\x01\x10\x016\xff\xec\x01\x10\x018\xff\ +\xec\x01\x10\x01:\xff\xec\x01\x10\x01;\xff\xec\x01\x10\x01\ +=\xff\xec\x01\x10\x01?\xff\xec\x01\x10\x01C\xff\xd7\x01\ +\x10\x01\xa0\xff\xec\x01\x10\x01\xfa\xff\xec\x01\x10\x01\xfc\xff\ +\xec\x01\x10\x01\xfe\xff\xec\x01\x10\x02\x00\xff\xec\x01\x10\x02\ +\x08\xff\xae\x01\x10\x02\x0c\xff\xae\x01\x10\x02X\xff\xd7\x01\ +\x10\x03\x1d\xff\xd7\x01\x10\x03\x1f\xff\xd7\x01\x10\x03!\xff\ +\xd7\x01\x10\x03#\xff\xd7\x01\x10\x03%\xff\xd7\x01\x10\x03\ +'\xff\xd7\x01\x10\x03)\xff\xd7\x01\x10\x03+\xff\xd7\x01\ +\x10\x03-\xff\xd7\x01\x10\x03/\xff\xd7\x01\x10\x031\xff\ +\xd7\x01\x10\x033\xff\xd7\x01\x10\x03o\xff\xec\x01\x10\x03\ +q\xff\xec\x01\x10\x03s\xff\xec\x01\x10\x03\x8f\xff\xc3\x01\ +\x12\x00\x0f\xff\xae\x01\x12\x00\x11\xff\xae\x01\x12\x00$\xff\ +\xd7\x01\x12\x007\xff\xc3\x01\x12\x009\xff\xec\x01\x12\x00\ +:\xff\xec\x01\x12\x00;\xff\xd7\x01\x12\x00<\xff\xec\x01\ +\x12\x00=\xff\xec\x01\x12\x00\x82\xff\xd7\x01\x12\x00\x83\xff\ +\xd7\x01\x12\x00\x84\xff\xd7\x01\x12\x00\x85\xff\xd7\x01\x12\x00\ +\x86\xff\xd7\x01\x12\x00\x87\xff\xd7\x01\x12\x00\x9f\xff\xec\x01\ +\x12\x00\xc2\xff\xd7\x01\x12\x00\xc4\xff\xd7\x01\x12\x00\xc6\xff\ +\xd7\x01\x12\x01$\xff\xc3\x01\x12\x01&\xff\xc3\x01\x12\x01\ +6\xff\xec\x01\x12\x018\xff\xec\x01\x12\x01:\xff\xec\x01\ +\x12\x01;\xff\xec\x01\x12\x01=\xff\xec\x01\x12\x01?\xff\ +\xec\x01\x12\x01C\xff\xd7\x01\x12\x01\xa0\xff\xec\x01\x12\x01\ +\xfa\xff\xec\x01\x12\x01\xfc\xff\xec\x01\x12\x01\xfe\xff\xec\x01\ +\x12\x02\x00\xff\xec\x01\x12\x02\x08\xff\xae\x01\x12\x02\x0c\xff\ +\xae\x01\x12\x02X\xff\xd7\x01\x12\x03\x1d\xff\xd7\x01\x12\x03\ +\x1f\xff\xd7\x01\x12\x03!\xff\xd7\x01\x12\x03#\xff\xd7\x01\ +\x12\x03%\xff\xd7\x01\x12\x03'\xff\xd7\x01\x12\x03)\xff\ +\xd7\x01\x12\x03+\xff\xd7\x01\x12\x03-\xff\xd7\x01\x12\x03\ +/\xff\xd7\x01\x12\x031\xff\xd7\x01\x12\x033\xff\xd7\x01\ +\x12\x03o\xff\xec\x01\x12\x03q\xff\xec\x01\x12\x03s\xff\ +\xec\x01\x12\x03\x8f\xff\xc3\x01\x14\x00-\x00{\x01\x17\x00\ +\x05\x00R\x01\x17\x00\x0a\x00R\x01\x17\x00D\xff\xd7\x01\ +\x17\x00F\xff\xd7\x01\x17\x00G\xff\xd7\x01\x17\x00H\xff\ +\xd7\x01\x17\x00J\xff\xec\x01\x17\x00R\xff\xd7\x01\x17\x00\ +T\xff\xd7\x01\x17\x00\xa2\xff\xd7\x01\x17\x00\xa3\xff\xd7\x01\ +\x17\x00\xa4\xff\xd7\x01\x17\x00\xa5\xff\xd7\x01\x17\x00\xa6\xff\ +\xd7\x01\x17\x00\xa7\xff\xd7\x01\x17\x00\xa8\xff\xd7\x01\x17\x00\ +\xa9\xff\xd7\x01\x17\x00\xaa\xff\xd7\x01\x17\x00\xab\xff\xd7\x01\ +\x17\x00\xac\xff\xd7\x01\x17\x00\xad\xff\xd7\x01\x17\x00\xb4\xff\ +\xd7\x01\x17\x00\xb5\xff\xd7\x01\x17\x00\xb6\xff\xd7\x01\x17\x00\ +\xb7\xff\xd7\x01\x17\x00\xb8\xff\xd7\x01\x17\x00\xba\xff\xd7\x01\ +\x17\x00\xc3\xff\xd7\x01\x17\x00\xc5\xff\xd7\x01\x17\x00\xc7\xff\ +\xd7\x01\x17\x00\xc9\xff\xd7\x01\x17\x00\xcb\xff\xd7\x01\x17\x00\ +\xcd\xff\xd7\x01\x17\x00\xcf\xff\xd7\x01\x17\x00\xd1\xff\xd7\x01\ +\x17\x00\xd3\xff\xd7\x01\x17\x00\xd5\xff\xd7\x01\x17\x00\xd7\xff\ +\xd7\x01\x17\x00\xd9\xff\xd7\x01\x17\x00\xdb\xff\xd7\x01\x17\x00\ +\xdd\xff\xd7\x01\x17\x00\xdf\xff\xec\x01\x17\x00\xe1\xff\xec\x01\ +\x17\x00\xe3\xff\xec\x01\x17\x00\xe5\xff\xec\x01\x17\x01\x0f\xff\ +\xd7\x01\x17\x01\x11\xff\xd7\x01\x17\x01\x13\xff\xd7\x01\x17\x01\ +\x15\xff\xd7\x01\x17\x01D\xff\xd7\x01\x17\x01F\xff\xd7\x01\ +\x17\x01H\xff\xd7\x01\x17\x02\x07\x00R\x01\x17\x02\x0b\x00\ +R\x01\x17\x02Y\xff\xd7\x01\x17\x02`\xff\xd7\x01\x17\x03\ +\x1e\xff\xd7\x01\x17\x03 \xff\xd7\x01\x17\x03\x22\xff\xd7\x01\ +\x17\x03&\xff\xd7\x01\x17\x03(\xff\xd7\x01\x17\x03*\xff\ +\xd7\x01\x17\x03,\xff\xd7\x01\x17\x03.\xff\xd7\x01\x17\x03\ +0\xff\xd7\x01\x17\x032\xff\xd7\x01\x17\x034\xff\xd7\x01\ +\x17\x036\xff\xd7\x01\x17\x038\xff\xd7\x01\x17\x03:\xff\ +\xd7\x01\x17\x03<\xff\xd7\x01\x17\x03@\xff\xd7\x01\x17\x03\ +B\xff\xd7\x01\x17\x03D\xff\xd7\x01\x17\x03J\xff\xd7\x01\ +\x17\x03L\xff\xd7\x01\x17\x03N\xff\xd7\x01\x17\x03R\xff\ +\xd7\x01\x17\x03T\xff\xd7\x01\x17\x03V\xff\xd7\x01\x17\x03\ +X\xff\xd7\x01\x17\x03Z\xff\xd7\x01\x17\x03\x5c\xff\xd7\x01\ +\x17\x03^\xff\xd7\x01\x17\x03`\xff\xd7\x01\x19\x00\x05\x00\ +R\x01\x19\x00\x0a\x00R\x01\x19\x00D\xff\xd7\x01\x19\x00\ +F\xff\xd7\x01\x19\x00G\xff\xd7\x01\x19\x00H\xff\xd7\x01\ +\x19\x00J\xff\xec\x01\x19\x00R\xff\xd7\x01\x19\x00T\xff\ +\xd7\x01\x19\x00\xa2\xff\xd7\x01\x19\x00\xa3\xff\xd7\x01\x19\x00\ +\xa4\xff\xd7\x01\x19\x00\xa5\xff\xd7\x01\x19\x00\xa6\xff\xd7\x01\ +\x19\x00\xa7\xff\xd7\x01\x19\x00\xa8\xff\xd7\x01\x19\x00\xa9\xff\ +\xd7\x01\x19\x00\xaa\xff\xd7\x01\x19\x00\xab\xff\xd7\x01\x19\x00\ +\xac\xff\xd7\x01\x19\x00\xad\xff\xd7\x01\x19\x00\xb4\xff\xd7\x01\ +\x19\x00\xb5\xff\xd7\x01\x19\x00\xb6\xff\xd7\x01\x19\x00\xb7\xff\ +\xd7\x01\x19\x00\xb8\xff\xd7\x01\x19\x00\xba\xff\xd7\x01\x19\x00\ +\xc3\xff\xd7\x01\x19\x00\xc5\xff\xd7\x01\x19\x00\xc7\xff\xd7\x01\ +\x19\x00\xc9\xff\xd7\x01\x19\x00\xcb\xff\xd7\x01\x19\x00\xcd\xff\ +\xd7\x01\x19\x00\xcf\xff\xd7\x01\x19\x00\xd1\xff\xd7\x01\x19\x00\ +\xd3\xff\xd7\x01\x19\x00\xd5\xff\xd7\x01\x19\x00\xd7\xff\xd7\x01\ +\x19\x00\xd9\xff\xd7\x01\x19\x00\xdb\xff\xd7\x01\x19\x00\xdd\xff\ +\xd7\x01\x19\x00\xdf\xff\xec\x01\x19\x00\xe1\xff\xec\x01\x19\x00\ +\xe3\xff\xec\x01\x19\x00\xe5\xff\xec\x01\x19\x01\x0f\xff\xd7\x01\ +\x19\x01\x11\xff\xd7\x01\x19\x01\x13\xff\xd7\x01\x19\x01\x15\xff\ +\xd7\x01\x19\x01D\xff\xd7\x01\x19\x01F\xff\xd7\x01\x19\x01\ +H\xff\xd7\x01\x19\x02\x07\x00R\x01\x19\x02\x0b\x00R\x01\ +\x19\x02Y\xff\xd7\x01\x19\x02`\xff\xd7\x01\x19\x03\x1e\xff\ +\xd7\x01\x19\x03 \xff\xd7\x01\x19\x03\x22\xff\xd7\x01\x19\x03\ +&\xff\xd7\x01\x19\x03(\xff\xd7\x01\x19\x03*\xff\xd7\x01\ +\x19\x03,\xff\xd7\x01\x19\x03.\xff\xd7\x01\x19\x030\xff\ +\xd7\x01\x19\x032\xff\xd7\x01\x19\x034\xff\xd7\x01\x19\x03\ +6\xff\xd7\x01\x19\x038\xff\xd7\x01\x19\x03:\xff\xd7\x01\ +\x19\x03<\xff\xd7\x01\x19\x03@\xff\xd7\x01\x19\x03B\xff\ +\xd7\x01\x19\x03D\xff\xd7\x01\x19\x03J\xff\xd7\x01\x19\x03\ +L\xff\xd7\x01\x19\x03N\xff\xd7\x01\x19\x03R\xff\xd7\x01\ +\x19\x03T\xff\xd7\x01\x19\x03V\xff\xd7\x01\x19\x03X\xff\ +\xd7\x01\x19\x03Z\xff\xd7\x01\x19\x03\x5c\xff\xd7\x01\x19\x03\ +^\xff\xd7\x01\x19\x03`\xff\xd7\x01\x1b\x00\x05\x00R\x01\ +\x1b\x00\x0a\x00R\x01\x1b\x00D\xff\xd7\x01\x1b\x00F\xff\ +\xd7\x01\x1b\x00G\xff\xd7\x01\x1b\x00H\xff\xd7\x01\x1b\x00\ +J\xff\xec\x01\x1b\x00R\xff\xd7\x01\x1b\x00T\xff\xd7\x01\ +\x1b\x00\xa2\xff\xd7\x01\x1b\x00\xa3\xff\xd7\x01\x1b\x00\xa4\xff\ +\xd7\x01\x1b\x00\xa5\xff\xd7\x01\x1b\x00\xa6\xff\xd7\x01\x1b\x00\ +\xa7\xff\xd7\x01\x1b\x00\xa8\xff\xd7\x01\x1b\x00\xa9\xff\xd7\x01\ +\x1b\x00\xaa\xff\xd7\x01\x1b\x00\xab\xff\xd7\x01\x1b\x00\xac\xff\ +\xd7\x01\x1b\x00\xad\xff\xd7\x01\x1b\x00\xb4\xff\xd7\x01\x1b\x00\ +\xb5\xff\xd7\x01\x1b\x00\xb6\xff\xd7\x01\x1b\x00\xb7\xff\xd7\x01\ +\x1b\x00\xb8\xff\xd7\x01\x1b\x00\xba\xff\xd7\x01\x1b\x00\xc3\xff\ +\xd7\x01\x1b\x00\xc5\xff\xd7\x01\x1b\x00\xc7\xff\xd7\x01\x1b\x00\ +\xc9\xff\xd7\x01\x1b\x00\xcb\xff\xd7\x01\x1b\x00\xcd\xff\xd7\x01\ +\x1b\x00\xcf\xff\xd7\x01\x1b\x00\xd1\xff\xd7\x01\x1b\x00\xd3\xff\ +\xd7\x01\x1b\x00\xd5\xff\xd7\x01\x1b\x00\xd7\xff\xd7\x01\x1b\x00\ +\xd9\xff\xd7\x01\x1b\x00\xdb\xff\xd7\x01\x1b\x00\xdd\xff\xd7\x01\ +\x1b\x00\xdf\xff\xec\x01\x1b\x00\xe1\xff\xec\x01\x1b\x00\xe3\xff\ +\xec\x01\x1b\x00\xe5\xff\xec\x01\x1b\x01\x0f\xff\xd7\x01\x1b\x01\ +\x11\xff\xd7\x01\x1b\x01\x13\xff\xd7\x01\x1b\x01\x15\xff\xd7\x01\ +\x1b\x01D\xff\xd7\x01\x1b\x01F\xff\xd7\x01\x1b\x01H\xff\ +\xd7\x01\x1b\x02\x07\x00R\x01\x1b\x02\x0b\x00R\x01\x1b\x02\ +Y\xff\xd7\x01\x1b\x02`\xff\xd7\x01\x1b\x03\x1e\xff\xd7\x01\ +\x1b\x03 \xff\xd7\x01\x1b\x03\x22\xff\xd7\x01\x1b\x03&\xff\ +\xd7\x01\x1b\x03(\xff\xd7\x01\x1b\x03*\xff\xd7\x01\x1b\x03\ +,\xff\xd7\x01\x1b\x03.\xff\xd7\x01\x1b\x030\xff\xd7\x01\ +\x1b\x032\xff\xd7\x01\x1b\x034\xff\xd7\x01\x1b\x036\xff\ +\xd7\x01\x1b\x038\xff\xd7\x01\x1b\x03:\xff\xd7\x01\x1b\x03\ +<\xff\xd7\x01\x1b\x03@\xff\xd7\x01\x1b\x03B\xff\xd7\x01\ +\x1b\x03D\xff\xd7\x01\x1b\x03J\xff\xd7\x01\x1b\x03L\xff\ +\xd7\x01\x1b\x03N\xff\xd7\x01\x1b\x03R\xff\xd7\x01\x1b\x03\ +T\xff\xd7\x01\x1b\x03V\xff\xd7\x01\x1b\x03X\xff\xd7\x01\ +\x1b\x03Z\xff\xd7\x01\x1b\x03\x5c\xff\xd7\x01\x1b\x03^\xff\ +\xd7\x01\x1b\x03`\xff\xd7\x01$\x00\x0f\xff\x85\x01$\x00\ +\x10\xff\xae\x01$\x00\x11\xff\x85\x01$\x00\x22\x00)\x01\ +$\x00$\xffq\x01$\x00&\xff\xd7\x01$\x00*\xff\ +\xd7\x01$\x002\xff\xd7\x01$\x004\xff\xd7\x01$\x00\ +7\x00)\x01$\x00D\xff\x5c\x01$\x00F\xffq\x01\ +$\x00G\xffq\x01$\x00H\xffq\x01$\x00J\xff\ +q\x01$\x00P\xff\x9a\x01$\x00Q\xff\x9a\x01$\x00\ +R\xffq\x01$\x00S\xff\x9a\x01$\x00T\xffq\x01\ +$\x00U\xff\x9a\x01$\x00V\xff\x85\x01$\x00X\xff\ +\x9a\x01$\x00Y\xff\xd7\x01$\x00Z\xff\xd7\x01$\x00\ +[\xff\xd7\x01$\x00\x5c\xff\xd7\x01$\x00]\xff\xae\x01\ +$\x00\x82\xffq\x01$\x00\x83\xffq\x01$\x00\x84\xff\ +q\x01$\x00\x85\xffq\x01$\x00\x86\xffq\x01$\x00\ +\x87\xffq\x01$\x00\x89\xff\xd7\x01$\x00\x94\xff\xd7\x01\ +$\x00\x95\xff\xd7\x01$\x00\x96\xff\xd7\x01$\x00\x97\xff\ +\xd7\x01$\x00\x98\xff\xd7\x01$\x00\x9a\xff\xd7\x01$\x00\ +\xa2\xffq\x01$\x00\xa3\xff\x5c\x01$\x00\xa4\xff\x5c\x01\ +$\x00\xa5\xff\x5c\x01$\x00\xa6\xff\x5c\x01$\x00\xa7\xff\ +\x5c\x01$\x00\xa8\xff\x5c\x01$\x00\xa9\xffq\x01$\x00\ +\xaa\xffq\x01$\x00\xab\xffq\x01$\x00\xac\xffq\x01\ +$\x00\xad\xffq\x01$\x00\xb4\xffq\x01$\x00\xb5\xff\ +q\x01$\x00\xb6\xffq\x01$\x00\xb7\xffq\x01$\x00\ +\xb8\xffq\x01$\x00\xba\xffq\x01$\x00\xbb\xff\x9a\x01\ +$\x00\xbc\xff\x9a\x01$\x00\xbd\xff\x9a\x01$\x00\xbe\xff\ +\x9a\x01$\x00\xbf\xff\xd7\x01$\x00\xc2\xffq\x01$\x00\ +\xc3\xff\x5c\x01$\x00\xc4\xffq\x01$\x00\xc5\xff\x5c\x01\ +$\x00\xc6\xffq\x01$\x00\xc7\xff\x5c\x01$\x00\xc8\xff\ +\xd7\x01$\x00\xc9\xffq\x01$\x00\xca\xff\xd7\x01$\x00\ +\xcb\xffq\x01$\x00\xcc\xff\xd7\x01$\x00\xcd\xffq\x01\ +$\x00\xce\xff\xd7\x01$\x00\xcf\xffq\x01$\x00\xd1\xff\ +q\x01$\x00\xd3\xffq\x01$\x00\xd5\xffq\x01$\x00\ +\xd7\xffq\x01$\x00\xd9\xffq\x01$\x00\xdb\xffq\x01\ +$\x00\xdd\xffq\x01$\x00\xde\xff\xd7\x01$\x00\xdf\xff\ +q\x01$\x00\xe0\xff\xd7\x01$\x00\xe1\xffq\x01$\x00\ +\xe2\xff\xd7\x01$\x00\xe3\xffq\x01$\x00\xe4\xff\xd7\x01\ +$\x00\xe5\xffq\x01$\x00\xfa\xff\x9a\x01$\x01\x06\xff\ +\x9a\x01$\x01\x08\xff\x9a\x01$\x01\x0d\xff\x9a\x01$\x01\ +\x0e\xff\xd7\x01$\x01\x0f\xffq\x01$\x01\x10\xff\xd7\x01\ +$\x01\x11\xffq\x01$\x01\x12\xff\xd7\x01$\x01\x13\xff\ +q\x01$\x01\x14\xff\xd7\x01$\x01\x15\xffq\x01$\x01\ +\x17\xff\x9a\x01$\x01\x19\xff\x9a\x01$\x01\x1d\xff\x85\x01\ +$\x01!\xff\x85\x01$\x01$\x00)\x01$\x01&\x00\ +)\x01$\x01+\xff\x9a\x01$\x01-\xff\x9a\x01$\x01\ +/\xff\x9a\x01$\x011\xff\x9a\x01$\x013\xff\x9a\x01\ +$\x015\xff\x9a\x01$\x017\xff\xd7\x01$\x01<\xff\ +\xae\x01$\x01>\xff\xae\x01$\x01@\xff\xae\x01$\x01\ +C\xffq\x01$\x01D\xff\x5c\x01$\x01F\xff\x5c\x01\ +$\x01G\xff\xd7\x01$\x01H\xffq\x01$\x01J\xff\ +\x85\x01$\x01\xfb\xff\xd7\x01$\x01\xfd\xff\xd7\x01$\x02\ +\x02\xff\xae\x01$\x02\x03\xff\xae\x01$\x02\x04\xff\xae\x01\ +$\x02\x08\xff\x85\x01$\x02\x0c\xff\x85\x01$\x02W\xff\ +\x9a\x01$\x02X\xffq\x01$\x02Y\xff\x5c\x01$\x02\ +_\xff\xd7\x01$\x02`\xffq\x01$\x02b\xff\x9a\x01\ +$\x03\x1d\xffq\x01$\x03\x1e\xff\x5c\x01$\x03\x1f\xff\ +q\x01$\x03 \xff\x5c\x01$\x03!\xffq\x01$\x03\ +\x22\xff\x5c\x01$\x03#\xffq\x01$\x03%\xffq\x01\ +$\x03&\xff\x5c\x01$\x03'\xffq\x01$\x03(\xff\ +\x5c\x01$\x03)\xffq\x01$\x03*\xff\x5c\x01$\x03\ ++\xffq\x01$\x03,\xff\x5c\x01$\x03-\xffq\x01\ +$\x03.\xff\x5c\x01$\x03/\xffq\x01$\x030\xff\ +\x5c\x01$\x031\xffq\x01$\x032\xff\x5c\x01$\x03\ +3\xffq\x01$\x034\xff\x5c\x01$\x036\xffq\x01\ +$\x038\xffq\x01$\x03:\xffq\x01$\x03<\xff\ +q\x01$\x03@\xffq\x01$\x03B\xffq\x01$\x03\ +D\xffq\x01$\x03I\xff\xd7\x01$\x03J\xffq\x01\ +$\x03K\xff\xd7\x01$\x03L\xffq\x01$\x03M\xff\ +\xd7\x01$\x03N\xffq\x01$\x03O\xff\xd7\x01$\x03\ +Q\xff\xd7\x01$\x03R\xffq\x01$\x03S\xff\xd7\x01\ +$\x03T\xffq\x01$\x03U\xff\xd7\x01$\x03V\xff\ +q\x01$\x03W\xff\xd7\x01$\x03X\xffq\x01$\x03\ +Y\xff\xd7\x01$\x03Z\xffq\x01$\x03[\xff\xd7\x01\ +$\x03\x5c\xffq\x01$\x03]\xff\xd7\x01$\x03^\xff\ +q\x01$\x03_\xff\xd7\x01$\x03`\xffq\x01$\x03\ +b\xff\x9a\x01$\x03d\xff\x9a\x01$\x03f\xff\x9a\x01\ +$\x03h\xff\x9a\x01$\x03j\xff\x9a\x01$\x03l\xff\ +\x9a\x01$\x03n\xff\x9a\x01$\x03p\xff\xd7\x01$\x03\ +\x8f\x00)\x01%\x00\x05\x00)\x01%\x00\x0a\x00)\x01\ +%\x02\x07\x00)\x01%\x02\x0b\x00)\x01&\x00\x0f\xff\ +\x85\x01&\x00\x10\xff\xae\x01&\x00\x11\xff\x85\x01&\x00\ +\x22\x00)\x01&\x00$\xffq\x01&\x00&\xff\xd7\x01\ +&\x00*\xff\xd7\x01&\x002\xff\xd7\x01&\x004\xff\ +\xd7\x01&\x007\x00)\x01&\x00D\xff\x5c\x01&\x00\ +F\xffq\x01&\x00G\xffq\x01&\x00H\xffq\x01\ +&\x00J\xffq\x01&\x00P\xff\x9a\x01&\x00Q\xff\ +\x9a\x01&\x00R\xffq\x01&\x00S\xff\x9a\x01&\x00\ +T\xffq\x01&\x00U\xff\x9a\x01&\x00V\xff\x85\x01\ +&\x00X\xff\x9a\x01&\x00Y\xff\xd7\x01&\x00Z\xff\ +\xd7\x01&\x00[\xff\xd7\x01&\x00\x5c\xff\xd7\x01&\x00\ +]\xff\xae\x01&\x00\x82\xffq\x01&\x00\x83\xffq\x01\ +&\x00\x84\xffq\x01&\x00\x85\xffq\x01&\x00\x86\xff\ +q\x01&\x00\x87\xffq\x01&\x00\x89\xff\xd7\x01&\x00\ +\x94\xff\xd7\x01&\x00\x95\xff\xd7\x01&\x00\x96\xff\xd7\x01\ +&\x00\x97\xff\xd7\x01&\x00\x98\xff\xd7\x01&\x00\x9a\xff\ +\xd7\x01&\x00\xa2\xffq\x01&\x00\xa3\xff\x5c\x01&\x00\ +\xa4\xff\x5c\x01&\x00\xa5\xff\x5c\x01&\x00\xa6\xff\x5c\x01\ +&\x00\xa7\xff\x5c\x01&\x00\xa8\xff\x5c\x01&\x00\xa9\xff\ +q\x01&\x00\xaa\xffq\x01&\x00\xab\xffq\x01&\x00\ +\xac\xffq\x01&\x00\xad\xffq\x01&\x00\xb4\xffq\x01\ +&\x00\xb5\xffq\x01&\x00\xb6\xffq\x01&\x00\xb7\xff\ +q\x01&\x00\xb8\xffq\x01&\x00\xba\xffq\x01&\x00\ +\xbb\xff\x9a\x01&\x00\xbc\xff\x9a\x01&\x00\xbd\xff\x9a\x01\ +&\x00\xbe\xff\x9a\x01&\x00\xbf\xff\xd7\x01&\x00\xc2\xff\ +q\x01&\x00\xc3\xff\x5c\x01&\x00\xc4\xffq\x01&\x00\ +\xc5\xff\x5c\x01&\x00\xc6\xffq\x01&\x00\xc7\xff\x5c\x01\ +&\x00\xc8\xff\xd7\x01&\x00\xc9\xffq\x01&\x00\xca\xff\ +\xd7\x01&\x00\xcb\xffq\x01&\x00\xcc\xff\xd7\x01&\x00\ +\xcd\xffq\x01&\x00\xce\xff\xd7\x01&\x00\xcf\xffq\x01\ +&\x00\xd1\xffq\x01&\x00\xd3\xffq\x01&\x00\xd5\xff\ +q\x01&\x00\xd7\xffq\x01&\x00\xd9\xffq\x01&\x00\ +\xdb\xffq\x01&\x00\xdd\xffq\x01&\x00\xde\xff\xd7\x01\ +&\x00\xdf\xffq\x01&\x00\xe0\xff\xd7\x01&\x00\xe1\xff\ +q\x01&\x00\xe2\xff\xd7\x01&\x00\xe3\xffq\x01&\x00\ +\xe4\xff\xd7\x01&\x00\xe5\xffq\x01&\x00\xfa\xff\x9a\x01\ +&\x01\x06\xff\x9a\x01&\x01\x08\xff\x9a\x01&\x01\x0d\xff\ +\x9a\x01&\x01\x0e\xff\xd7\x01&\x01\x0f\xffq\x01&\x01\ +\x10\xff\xd7\x01&\x01\x11\xffq\x01&\x01\x12\xff\xd7\x01\ +&\x01\x13\xffq\x01&\x01\x14\xff\xd7\x01&\x01\x15\xff\ +q\x01&\x01\x17\xff\x9a\x01&\x01\x19\xff\x9a\x01&\x01\ +\x1d\xff\x85\x01&\x01!\xff\x85\x01&\x01$\x00)\x01\ +&\x01&\x00)\x01&\x01+\xff\x9a\x01&\x01-\xff\ +\x9a\x01&\x01/\xff\x9a\x01&\x011\xff\x9a\x01&\x01\ +3\xff\x9a\x01&\x015\xff\x9a\x01&\x017\xff\xd7\x01\ +&\x01<\xff\xae\x01&\x01>\xff\xae\x01&\x01@\xff\ +\xae\x01&\x01C\xffq\x01&\x01D\xff\x5c\x01&\x01\ +F\xff\x5c\x01&\x01G\xff\xd7\x01&\x01H\xffq\x01\ +&\x01J\xff\x85\x01&\x01\xfb\xff\xd7\x01&\x01\xfd\xff\ +\xd7\x01&\x02\x02\xff\xae\x01&\x02\x03\xff\xae\x01&\x02\ +\x04\xff\xae\x01&\x02\x08\xff\x85\x01&\x02\x0c\xff\x85\x01\ +&\x02W\xff\x9a\x01&\x02X\xffq\x01&\x02Y\xff\ +\x5c\x01&\x02_\xff\xd7\x01&\x02`\xffq\x01&\x02\ +b\xff\x9a\x01&\x03\x1d\xffq\x01&\x03\x1e\xff\x5c\x01\ +&\x03\x1f\xffq\x01&\x03 \xff\x5c\x01&\x03!\xff\ +q\x01&\x03\x22\xff\x5c\x01&\x03#\xffq\x01&\x03\ +%\xffq\x01&\x03&\xff\x5c\x01&\x03'\xffq\x01\ +&\x03(\xff\x5c\x01&\x03)\xffq\x01&\x03*\xff\ +\x5c\x01&\x03+\xffq\x01&\x03,\xff\x5c\x01&\x03\ +-\xffq\x01&\x03.\xff\x5c\x01&\x03/\xffq\x01\ +&\x030\xff\x5c\x01&\x031\xffq\x01&\x032\xff\ +\x5c\x01&\x033\xffq\x01&\x034\xff\x5c\x01&\x03\ +6\xffq\x01&\x038\xffq\x01&\x03:\xffq\x01\ +&\x03<\xffq\x01&\x03@\xffq\x01&\x03B\xff\ +q\x01&\x03D\xffq\x01&\x03I\xff\xd7\x01&\x03\ +J\xffq\x01&\x03K\xff\xd7\x01&\x03L\xffq\x01\ +&\x03M\xff\xd7\x01&\x03N\xffq\x01&\x03O\xff\ +\xd7\x01&\x03Q\xff\xd7\x01&\x03R\xffq\x01&\x03\ +S\xff\xd7\x01&\x03T\xffq\x01&\x03U\xff\xd7\x01\ +&\x03V\xffq\x01&\x03W\xff\xd7\x01&\x03X\xff\ +q\x01&\x03Y\xff\xd7\x01&\x03Z\xffq\x01&\x03\ +[\xff\xd7\x01&\x03\x5c\xffq\x01&\x03]\xff\xd7\x01\ +&\x03^\xffq\x01&\x03_\xff\xd7\x01&\x03`\xff\ +q\x01&\x03b\xff\x9a\x01&\x03d\xff\x9a\x01&\x03\ +f\xff\x9a\x01&\x03h\xff\x9a\x01&\x03j\xff\x9a\x01\ +&\x03l\xff\x9a\x01&\x03n\xff\x9a\x01&\x03p\xff\ +\xd7\x01&\x03\x8f\x00)\x01'\x00\x05\x00)\x01'\x00\ +\x0a\x00)\x01'\x02\x07\x00)\x01'\x02\x0b\x00)\x01\ +(\x00\x0f\xff\x85\x01(\x00\x10\xff\xae\x01(\x00\x11\xff\ +\x85\x01(\x00\x22\x00)\x01(\x00$\xffq\x01(\x00\ +&\xff\xd7\x01(\x00*\xff\xd7\x01(\x002\xff\xd7\x01\ +(\x004\xff\xd7\x01(\x007\x00)\x01(\x00D\xff\ +\x5c\x01(\x00F\xffq\x01(\x00G\xffq\x01(\x00\ +H\xffq\x01(\x00J\xffq\x01(\x00P\xff\x9a\x01\ +(\x00Q\xff\x9a\x01(\x00R\xffq\x01(\x00S\xff\ +\x9a\x01(\x00T\xffq\x01(\x00U\xff\x9a\x01(\x00\ +V\xff\x85\x01(\x00X\xff\x9a\x01(\x00Y\xff\xd7\x01\ +(\x00Z\xff\xd7\x01(\x00[\xff\xd7\x01(\x00\x5c\xff\ +\xd7\x01(\x00]\xff\xae\x01(\x00\x82\xffq\x01(\x00\ +\x83\xffq\x01(\x00\x84\xffq\x01(\x00\x85\xffq\x01\ +(\x00\x86\xffq\x01(\x00\x87\xffq\x01(\x00\x89\xff\ +\xd7\x01(\x00\x94\xff\xd7\x01(\x00\x95\xff\xd7\x01(\x00\ +\x96\xff\xd7\x01(\x00\x97\xff\xd7\x01(\x00\x98\xff\xd7\x01\ +(\x00\x9a\xff\xd7\x01(\x00\xa2\xffq\x01(\x00\xa3\xff\ +\x5c\x01(\x00\xa4\xff\x5c\x01(\x00\xa5\xff\x5c\x01(\x00\ +\xa6\xff\x5c\x01(\x00\xa7\xff\x5c\x01(\x00\xa8\xff\x5c\x01\ +(\x00\xa9\xffq\x01(\x00\xaa\xffq\x01(\x00\xab\xff\ +q\x01(\x00\xac\xffq\x01(\x00\xad\xffq\x01(\x00\ +\xb4\xffq\x01(\x00\xb5\xffq\x01(\x00\xb6\xffq\x01\ +(\x00\xb7\xffq\x01(\x00\xb8\xffq\x01(\x00\xba\xff\ +q\x01(\x00\xbb\xff\x9a\x01(\x00\xbc\xff\x9a\x01(\x00\ +\xbd\xff\x9a\x01(\x00\xbe\xff\x9a\x01(\x00\xbf\xff\xd7\x01\ +(\x00\xc2\xffq\x01(\x00\xc3\xff\x5c\x01(\x00\xc4\xff\ +q\x01(\x00\xc5\xff\x5c\x01(\x00\xc6\xffq\x01(\x00\ +\xc7\xff\x5c\x01(\x00\xc8\xff\xd7\x01(\x00\xc9\xffq\x01\ +(\x00\xca\xff\xd7\x01(\x00\xcb\xffq\x01(\x00\xcc\xff\ +\xd7\x01(\x00\xcd\xffq\x01(\x00\xce\xff\xd7\x01(\x00\ +\xcf\xffq\x01(\x00\xd1\xffq\x01(\x00\xd3\xffq\x01\ +(\x00\xd5\xffq\x01(\x00\xd7\xffq\x01(\x00\xd9\xff\ +q\x01(\x00\xdb\xffq\x01(\x00\xdd\xffq\x01(\x00\ +\xde\xff\xd7\x01(\x00\xdf\xffq\x01(\x00\xe0\xff\xd7\x01\ +(\x00\xe1\xffq\x01(\x00\xe2\xff\xd7\x01(\x00\xe3\xff\ +q\x01(\x00\xe4\xff\xd7\x01(\x00\xe5\xffq\x01(\x00\ +\xfa\xff\x9a\x01(\x01\x06\xff\x9a\x01(\x01\x08\xff\x9a\x01\ +(\x01\x0d\xff\x9a\x01(\x01\x0e\xff\xd7\x01(\x01\x0f\xff\ +q\x01(\x01\x10\xff\xd7\x01(\x01\x11\xffq\x01(\x01\ +\x12\xff\xd7\x01(\x01\x13\xffq\x01(\x01\x14\xff\xd7\x01\ +(\x01\x15\xffq\x01(\x01\x17\xff\x9a\x01(\x01\x19\xff\ +\x9a\x01(\x01\x1d\xff\x85\x01(\x01!\xff\x85\x01(\x01\ +$\x00)\x01(\x01&\x00)\x01(\x01+\xff\x9a\x01\ +(\x01-\xff\x9a\x01(\x01/\xff\x9a\x01(\x011\xff\ +\x9a\x01(\x013\xff\x9a\x01(\x015\xff\x9a\x01(\x01\ +7\xff\xd7\x01(\x01<\xff\xae\x01(\x01>\xff\xae\x01\ +(\x01@\xff\xae\x01(\x01C\xffq\x01(\x01D\xff\ +\x5c\x01(\x01F\xff\x5c\x01(\x01G\xff\xd7\x01(\x01\ +H\xffq\x01(\x01J\xff\x85\x01(\x01\xfb\xff\xd7\x01\ +(\x01\xfd\xff\xd7\x01(\x02\x02\xff\xae\x01(\x02\x03\xff\ +\xae\x01(\x02\x04\xff\xae\x01(\x02\x08\xff\x85\x01(\x02\ +\x0c\xff\x85\x01(\x02W\xff\x9a\x01(\x02X\xffq\x01\ +(\x02Y\xff\x5c\x01(\x02_\xff\xd7\x01(\x02`\xff\ +q\x01(\x02b\xff\x9a\x01(\x03\x1d\xffq\x01(\x03\ +\x1e\xff\x5c\x01(\x03\x1f\xffq\x01(\x03 \xff\x5c\x01\ +(\x03!\xffq\x01(\x03\x22\xff\x5c\x01(\x03#\xff\ +q\x01(\x03%\xffq\x01(\x03&\xff\x5c\x01(\x03\ +'\xffq\x01(\x03(\xff\x5c\x01(\x03)\xffq\x01\ +(\x03*\xff\x5c\x01(\x03+\xffq\x01(\x03,\xff\ +\x5c\x01(\x03-\xffq\x01(\x03.\xff\x5c\x01(\x03\ +/\xffq\x01(\x030\xff\x5c\x01(\x031\xffq\x01\ +(\x032\xff\x5c\x01(\x033\xffq\x01(\x034\xff\ +\x5c\x01(\x036\xffq\x01(\x038\xffq\x01(\x03\ +:\xffq\x01(\x03<\xffq\x01(\x03@\xffq\x01\ +(\x03B\xffq\x01(\x03D\xffq\x01(\x03I\xff\ +\xd7\x01(\x03J\xffq\x01(\x03K\xff\xd7\x01(\x03\ +L\xffq\x01(\x03M\xff\xd7\x01(\x03N\xffq\x01\ +(\x03O\xff\xd7\x01(\x03Q\xff\xd7\x01(\x03R\xff\ +q\x01(\x03S\xff\xd7\x01(\x03T\xffq\x01(\x03\ +U\xff\xd7\x01(\x03V\xffq\x01(\x03W\xff\xd7\x01\ +(\x03X\xffq\x01(\x03Y\xff\xd7\x01(\x03Z\xff\ +q\x01(\x03[\xff\xd7\x01(\x03\x5c\xffq\x01(\x03\ +]\xff\xd7\x01(\x03^\xffq\x01(\x03_\xff\xd7\x01\ +(\x03`\xffq\x01(\x03b\xff\x9a\x01(\x03d\xff\ +\x9a\x01(\x03f\xff\x9a\x01(\x03h\xff\x9a\x01(\x03\ +j\xff\x9a\x01(\x03l\xff\x9a\x01(\x03n\xff\x9a\x01\ +(\x03p\xff\xd7\x01(\x03\x8f\x00)\x01*\x00\x0f\xff\ +\xd7\x01*\x00\x11\xff\xd7\x01*\x00$\xff\xec\x01*\x00\ +\x82\xff\xec\x01*\x00\x83\xff\xec\x01*\x00\x84\xff\xec\x01\ +*\x00\x85\xff\xec\x01*\x00\x86\xff\xec\x01*\x00\x87\xff\ +\xec\x01*\x00\xc2\xff\xec\x01*\x00\xc4\xff\xec\x01*\x00\ +\xc6\xff\xec\x01*\x01C\xff\xec\x01*\x02\x08\xff\xd7\x01\ +*\x02\x0c\xff\xd7\x01*\x02X\xff\xec\x01*\x03\x1d\xff\ +\xec\x01*\x03\x1f\xff\xec\x01*\x03!\xff\xec\x01*\x03\ +#\xff\xec\x01*\x03%\xff\xec\x01*\x03'\xff\xec\x01\ +*\x03)\xff\xec\x01*\x03+\xff\xec\x01*\x03-\xff\ +\xec\x01*\x03/\xff\xec\x01*\x031\xff\xec\x01*\x03\ +3\xff\xec\x01,\x00\x0f\xff\xd7\x01,\x00\x11\xff\xd7\x01\ +,\x00$\xff\xec\x01,\x00\x82\xff\xec\x01,\x00\x83\xff\ +\xec\x01,\x00\x84\xff\xec\x01,\x00\x85\xff\xec\x01,\x00\ +\x86\xff\xec\x01,\x00\x87\xff\xec\x01,\x00\xc2\xff\xec\x01\ +,\x00\xc4\xff\xec\x01,\x00\xc6\xff\xec\x01,\x01C\xff\ +\xec\x01,\x02\x08\xff\xd7\x01,\x02\x0c\xff\xd7\x01,\x02\ +X\xff\xec\x01,\x03\x1d\xff\xec\x01,\x03\x1f\xff\xec\x01\ +,\x03!\xff\xec\x01,\x03#\xff\xec\x01,\x03%\xff\ +\xec\x01,\x03'\xff\xec\x01,\x03)\xff\xec\x01,\x03\ ++\xff\xec\x01,\x03-\xff\xec\x01,\x03/\xff\xec\x01\ +,\x031\xff\xec\x01,\x033\xff\xec\x01.\x00\x0f\xff\ +\xd7\x01.\x00\x11\xff\xd7\x01.\x00$\xff\xec\x01.\x00\ +\x82\xff\xec\x01.\x00\x83\xff\xec\x01.\x00\x84\xff\xec\x01\ +.\x00\x85\xff\xec\x01.\x00\x86\xff\xec\x01.\x00\x87\xff\ +\xec\x01.\x00\xc2\xff\xec\x01.\x00\xc4\xff\xec\x01.\x00\ +\xc6\xff\xec\x01.\x01C\xff\xec\x01.\x02\x08\xff\xd7\x01\ +.\x02\x0c\xff\xd7\x01.\x02X\xff\xec\x01.\x03\x1d\xff\ +\xec\x01.\x03\x1f\xff\xec\x01.\x03!\xff\xec\x01.\x03\ +#\xff\xec\x01.\x03%\xff\xec\x01.\x03'\xff\xec\x01\ +.\x03)\xff\xec\x01.\x03+\xff\xec\x01.\x03-\xff\ +\xec\x01.\x03/\xff\xec\x01.\x031\xff\xec\x01.\x03\ +3\xff\xec\x010\x00\x0f\xff\xd7\x010\x00\x11\xff\xd7\x01\ +0\x00$\xff\xec\x010\x00\x82\xff\xec\x010\x00\x83\xff\ +\xec\x010\x00\x84\xff\xec\x010\x00\x85\xff\xec\x010\x00\ +\x86\xff\xec\x010\x00\x87\xff\xec\x010\x00\xc2\xff\xec\x01\ +0\x00\xc4\xff\xec\x010\x00\xc6\xff\xec\x010\x01C\xff\ +\xec\x010\x02\x08\xff\xd7\x010\x02\x0c\xff\xd7\x010\x02\ +X\xff\xec\x010\x03\x1d\xff\xec\x010\x03\x1f\xff\xec\x01\ +0\x03!\xff\xec\x010\x03#\xff\xec\x010\x03%\xff\ +\xec\x010\x03'\xff\xec\x010\x03)\xff\xec\x010\x03\ ++\xff\xec\x010\x03-\xff\xec\x010\x03/\xff\xec\x01\ +0\x031\xff\xec\x010\x033\xff\xec\x012\x00\x0f\xff\ +\xd7\x012\x00\x11\xff\xd7\x012\x00$\xff\xec\x012\x00\ +\x82\xff\xec\x012\x00\x83\xff\xec\x012\x00\x84\xff\xec\x01\ +2\x00\x85\xff\xec\x012\x00\x86\xff\xec\x012\x00\x87\xff\ +\xec\x012\x00\xc2\xff\xec\x012\x00\xc4\xff\xec\x012\x00\ +\xc6\xff\xec\x012\x01C\xff\xec\x012\x02\x08\xff\xd7\x01\ +2\x02\x0c\xff\xd7\x012\x02X\xff\xec\x012\x03\x1d\xff\ +\xec\x012\x03\x1f\xff\xec\x012\x03!\xff\xec\x012\x03\ +#\xff\xec\x012\x03%\xff\xec\x012\x03'\xff\xec\x01\ +2\x03)\xff\xec\x012\x03+\xff\xec\x012\x03-\xff\ +\xec\x012\x03/\xff\xec\x012\x031\xff\xec\x012\x03\ +3\xff\xec\x014\x00\x0f\xff\xd7\x014\x00\x11\xff\xd7\x01\ +4\x00$\xff\xec\x014\x00\x82\xff\xec\x014\x00\x83\xff\ +\xec\x014\x00\x84\xff\xec\x014\x00\x85\xff\xec\x014\x00\ +\x86\xff\xec\x014\x00\x87\xff\xec\x014\x00\xc2\xff\xec\x01\ +4\x00\xc4\xff\xec\x014\x00\xc6\xff\xec\x014\x01C\xff\ +\xec\x014\x02\x08\xff\xd7\x014\x02\x0c\xff\xd7\x014\x02\ +X\xff\xec\x014\x03\x1d\xff\xec\x014\x03\x1f\xff\xec\x01\ +4\x03!\xff\xec\x014\x03#\xff\xec\x014\x03%\xff\ +\xec\x014\x03'\xff\xec\x014\x03)\xff\xec\x014\x03\ ++\xff\xec\x014\x03-\xff\xec\x014\x03/\xff\xec\x01\ +4\x031\xff\xec\x014\x033\xff\xec\x016\x00\x0f\xff\ +\x9a\x016\x00\x11\xff\x9a\x016\x00\x22\x00)\x016\x00\ +$\xff\xae\x016\x00&\xff\xec\x016\x00*\xff\xec\x01\ +6\x002\xff\xec\x016\x004\xff\xec\x016\x00D\xff\ +\xd7\x016\x00F\xff\xd7\x016\x00G\xff\xd7\x016\x00\ +H\xff\xd7\x016\x00J\xff\xec\x016\x00P\xff\xec\x01\ +6\x00Q\xff\xec\x016\x00R\xff\xd7\x016\x00S\xff\ +\xec\x016\x00T\xff\xd7\x016\x00U\xff\xec\x016\x00\ +V\xff\xec\x016\x00X\xff\xec\x016\x00\x82\xff\xae\x01\ +6\x00\x83\xff\xae\x016\x00\x84\xff\xae\x016\x00\x85\xff\ +\xae\x016\x00\x86\xff\xae\x016\x00\x87\xff\xae\x016\x00\ +\x89\xff\xec\x016\x00\x94\xff\xec\x016\x00\x95\xff\xec\x01\ +6\x00\x96\xff\xec\x016\x00\x97\xff\xec\x016\x00\x98\xff\ +\xec\x016\x00\x9a\xff\xec\x016\x00\xa2\xff\xd7\x016\x00\ +\xa3\xff\xd7\x016\x00\xa4\xff\xd7\x016\x00\xa5\xff\xd7\x01\ +6\x00\xa6\xff\xd7\x016\x00\xa7\xff\xd7\x016\x00\xa8\xff\ +\xd7\x016\x00\xa9\xff\xd7\x016\x00\xaa\xff\xd7\x016\x00\ +\xab\xff\xd7\x016\x00\xac\xff\xd7\x016\x00\xad\xff\xd7\x01\ +6\x00\xb4\xff\xd7\x016\x00\xb5\xff\xd7\x016\x00\xb6\xff\ +\xd7\x016\x00\xb7\xff\xd7\x016\x00\xb8\xff\xd7\x016\x00\ +\xba\xff\xd7\x016\x00\xbb\xff\xec\x016\x00\xbc\xff\xec\x01\ +6\x00\xbd\xff\xec\x016\x00\xbe\xff\xec\x016\x00\xc2\xff\ +\xae\x016\x00\xc3\xff\xd7\x016\x00\xc4\xff\xae\x016\x00\ +\xc5\xff\xd7\x016\x00\xc6\xff\xae\x016\x00\xc7\xff\xd7\x01\ +6\x00\xc8\xff\xec\x016\x00\xc9\xff\xd7\x016\x00\xca\xff\ +\xec\x016\x00\xcb\xff\xd7\x016\x00\xcc\xff\xec\x016\x00\ +\xcd\xff\xd7\x016\x00\xce\xff\xec\x016\x00\xcf\xff\xd7\x01\ +6\x00\xd1\xff\xd7\x016\x00\xd3\xff\xd7\x016\x00\xd5\xff\ +\xd7\x016\x00\xd7\xff\xd7\x016\x00\xd9\xff\xd7\x016\x00\ +\xdb\xff\xd7\x016\x00\xdd\xff\xd7\x016\x00\xde\xff\xec\x01\ +6\x00\xdf\xff\xec\x016\x00\xe0\xff\xec\x016\x00\xe1\xff\ +\xec\x016\x00\xe2\xff\xec\x016\x00\xe3\xff\xec\x016\x00\ +\xe4\xff\xec\x016\x00\xe5\xff\xec\x016\x00\xfa\xff\xec\x01\ +6\x01\x06\xff\xec\x016\x01\x08\xff\xec\x016\x01\x0d\xff\ +\xec\x016\x01\x0e\xff\xec\x016\x01\x0f\xff\xd7\x016\x01\ +\x10\xff\xec\x016\x01\x11\xff\xd7\x016\x01\x12\xff\xec\x01\ +6\x01\x13\xff\xd7\x016\x01\x14\xff\xec\x016\x01\x15\xff\ +\xd7\x016\x01\x17\xff\xec\x016\x01\x19\xff\xec\x016\x01\ +\x1d\xff\xec\x016\x01!\xff\xec\x016\x01+\xff\xec\x01\ +6\x01-\xff\xec\x016\x01/\xff\xec\x016\x011\xff\ +\xec\x016\x013\xff\xec\x016\x015\xff\xec\x016\x01\ +C\xff\xae\x016\x01D\xff\xd7\x016\x01F\xff\xd7\x01\ +6\x01G\xff\xec\x016\x01H\xff\xd7\x016\x01J\xff\ +\xec\x016\x02\x08\xff\x9a\x016\x02\x0c\xff\x9a\x016\x02\ +W\xff\xec\x016\x02X\xff\xae\x016\x02Y\xff\xd7\x01\ +6\x02_\xff\xec\x016\x02`\xff\xd7\x016\x02b\xff\ +\xec\x016\x03\x1d\xff\xae\x016\x03\x1e\xff\xd7\x016\x03\ +\x1f\xff\xae\x016\x03 \xff\xd7\x016\x03!\xff\xae\x01\ +6\x03\x22\xff\xd7\x016\x03#\xff\xae\x016\x03%\xff\ +\xae\x016\x03&\xff\xd7\x016\x03'\xff\xae\x016\x03\ +(\xff\xd7\x016\x03)\xff\xae\x016\x03*\xff\xd7\x01\ +6\x03+\xff\xae\x016\x03,\xff\xd7\x016\x03-\xff\ +\xae\x016\x03.\xff\xd7\x016\x03/\xff\xae\x016\x03\ +0\xff\xd7\x016\x031\xff\xae\x016\x032\xff\xd7\x01\ +6\x033\xff\xae\x016\x034\xff\xd7\x016\x036\xff\ +\xd7\x016\x038\xff\xd7\x016\x03:\xff\xd7\x016\x03\ +<\xff\xd7\x016\x03@\xff\xd7\x016\x03B\xff\xd7\x01\ +6\x03D\xff\xd7\x016\x03I\xff\xec\x016\x03J\xff\ +\xd7\x016\x03K\xff\xec\x016\x03L\xff\xd7\x016\x03\ +M\xff\xec\x016\x03N\xff\xd7\x016\x03O\xff\xec\x01\ +6\x03Q\xff\xec\x016\x03R\xff\xd7\x016\x03S\xff\ +\xec\x016\x03T\xff\xd7\x016\x03U\xff\xec\x016\x03\ +V\xff\xd7\x016\x03W\xff\xec\x016\x03X\xff\xd7\x01\ +6\x03Y\xff\xec\x016\x03Z\xff\xd7\x016\x03[\xff\ +\xec\x016\x03\x5c\xff\xd7\x016\x03]\xff\xec\x016\x03\ +^\xff\xd7\x016\x03_\xff\xec\x016\x03`\xff\xd7\x01\ +6\x03b\xff\xec\x016\x03d\xff\xec\x016\x03f\xff\ +\xec\x016\x03h\xff\xec\x016\x03j\xff\xec\x016\x03\ +l\xff\xec\x016\x03n\xff\xec\x017\x00\x05\x00R\x01\ +7\x00\x0a\x00R\x017\x00\x0f\xff\xae\x017\x00\x11\xff\ +\xae\x017\x00\x22\x00)\x017\x02\x07\x00R\x017\x02\ +\x08\xff\xae\x017\x02\x0b\x00R\x017\x02\x0c\xff\xae\x01\ +8\x00\x0f\xff\x85\x018\x00\x11\xff\x85\x018\x00\x22\x00\ +)\x018\x00$\xff\x85\x018\x00&\xff\xd7\x018\x00\ +*\xff\xd7\x018\x002\xff\xd7\x018\x004\xff\xd7\x01\ +8\x00D\xff\x9a\x018\x00F\xff\x9a\x018\x00G\xff\ +\x9a\x018\x00H\xff\x9a\x018\x00J\xff\xd7\x018\x00\ +P\xff\xc3\x018\x00Q\xff\xc3\x018\x00R\xff\x9a\x01\ +8\x00S\xff\xc3\x018\x00T\xff\x9a\x018\x00U\xff\ +\xc3\x018\x00V\xff\xae\x018\x00X\xff\xc3\x018\x00\ +]\xff\xd7\x018\x00\x82\xff\x85\x018\x00\x83\xff\x85\x01\ +8\x00\x84\xff\x85\x018\x00\x85\xff\x85\x018\x00\x86\xff\ +\x85\x018\x00\x87\xff\x85\x018\x00\x89\xff\xd7\x018\x00\ +\x94\xff\xd7\x018\x00\x95\xff\xd7\x018\x00\x96\xff\xd7\x01\ +8\x00\x97\xff\xd7\x018\x00\x98\xff\xd7\x018\x00\x9a\xff\ +\xd7\x018\x00\xa2\xff\x9a\x018\x00\xa3\xff\x9a\x018\x00\ +\xa4\xff\x9a\x018\x00\xa5\xff\x9a\x018\x00\xa6\xff\x9a\x01\ +8\x00\xa7\xff\x9a\x018\x00\xa8\xff\x9a\x018\x00\xa9\xff\ +\x9a\x018\x00\xaa\xff\x9a\x018\x00\xab\xff\x9a\x018\x00\ +\xac\xff\x9a\x018\x00\xad\xff\x9a\x018\x00\xb4\xff\x9a\x01\ +8\x00\xb5\xff\x9a\x018\x00\xb6\xff\x9a\x018\x00\xb7\xff\ +\x9a\x018\x00\xb8\xff\x9a\x018\x00\xba\xff\x9a\x018\x00\ +\xbb\xff\xc3\x018\x00\xbc\xff\xc3\x018\x00\xbd\xff\xc3\x01\ +8\x00\xbe\xff\xc3\x018\x00\xc2\xff\x85\x018\x00\xc3\xff\ +\x9a\x018\x00\xc4\xff\x85\x018\x00\xc5\xff\x9a\x018\x00\ +\xc6\xff\x85\x018\x00\xc7\xff\x9a\x018\x00\xc8\xff\xd7\x01\ +8\x00\xc9\xff\x9a\x018\x00\xca\xff\xd7\x018\x00\xcb\xff\ +\x9a\x018\x00\xcc\xff\xd7\x018\x00\xcd\xff\x9a\x018\x00\ +\xce\xff\xd7\x018\x00\xcf\xff\x9a\x018\x00\xd1\xff\x9a\x01\ +8\x00\xd3\xff\x9a\x018\x00\xd5\xff\x9a\x018\x00\xd7\xff\ +\x9a\x018\x00\xd9\xff\x9a\x018\x00\xdb\xff\x9a\x018\x00\ +\xdd\xff\x9a\x018\x00\xde\xff\xd7\x018\x00\xdf\xff\xd7\x01\ +8\x00\xe0\xff\xd7\x018\x00\xe1\xff\xd7\x018\x00\xe2\xff\ +\xd7\x018\x00\xe3\xff\xd7\x018\x00\xe4\xff\xd7\x018\x00\ +\xe5\xff\xd7\x018\x00\xfa\xff\xc3\x018\x01\x06\xff\xc3\x01\ +8\x01\x08\xff\xc3\x018\x01\x0d\xff\xc3\x018\x01\x0e\xff\ +\xd7\x018\x01\x0f\xff\x9a\x018\x01\x10\xff\xd7\x018\x01\ +\x11\xff\x9a\x018\x01\x12\xff\xd7\x018\x01\x13\xff\x9a\x01\ +8\x01\x14\xff\xd7\x018\x01\x15\xff\x9a\x018\x01\x17\xff\ +\xc3\x018\x01\x19\xff\xc3\x018\x01\x1d\xff\xae\x018\x01\ +!\xff\xae\x018\x01+\xff\xc3\x018\x01-\xff\xc3\x01\ +8\x01/\xff\xc3\x018\x011\xff\xc3\x018\x013\xff\ +\xc3\x018\x015\xff\xc3\x018\x01<\xff\xd7\x018\x01\ +>\xff\xd7\x018\x01@\xff\xd7\x018\x01C\xff\x85\x01\ +8\x01D\xff\x9a\x018\x01F\xff\x9a\x018\x01G\xff\ +\xd7\x018\x01H\xff\x9a\x018\x01J\xff\xae\x018\x02\ +\x08\xff\x85\x018\x02\x0c\xff\x85\x018\x02W\xff\xc3\x01\ +8\x02X\xff\x85\x018\x02Y\xff\x9a\x018\x02_\xff\ +\xd7\x018\x02`\xff\x9a\x018\x02b\xff\xc3\x018\x03\ +\x1d\xff\x85\x018\x03\x1e\xff\x9a\x018\x03\x1f\xff\x85\x01\ +8\x03 \xff\x9a\x018\x03!\xff\x85\x018\x03\x22\xff\ +\x9a\x018\x03#\xff\x85\x018\x03%\xff\x85\x018\x03\ +&\xff\x9a\x018\x03'\xff\x85\x018\x03(\xff\x9a\x01\ +8\x03)\xff\x85\x018\x03*\xff\x9a\x018\x03+\xff\ +\x85\x018\x03,\xff\x9a\x018\x03-\xff\x85\x018\x03\ +.\xff\x9a\x018\x03/\xff\x85\x018\x030\xff\x9a\x01\ +8\x031\xff\x85\x018\x032\xff\x9a\x018\x033\xff\ +\x85\x018\x034\xff\x9a\x018\x036\xff\x9a\x018\x03\ +8\xff\x9a\x018\x03:\xff\x9a\x018\x03<\xff\x9a\x01\ +8\x03@\xff\x9a\x018\x03B\xff\x9a\x018\x03D\xff\ +\x9a\x018\x03I\xff\xd7\x018\x03J\xff\x9a\x018\x03\ +K\xff\xd7\x018\x03L\xff\x9a\x018\x03M\xff\xd7\x01\ +8\x03N\xff\x9a\x018\x03O\xff\xd7\x018\x03Q\xff\ +\xd7\x018\x03R\xff\x9a\x018\x03S\xff\xd7\x018\x03\ +T\xff\x9a\x018\x03U\xff\xd7\x018\x03V\xff\x9a\x01\ +8\x03W\xff\xd7\x018\x03X\xff\x9a\x018\x03Y\xff\ +\xd7\x018\x03Z\xff\x9a\x018\x03[\xff\xd7\x018\x03\ +\x5c\xff\x9a\x018\x03]\xff\xd7\x018\x03^\xff\x9a\x01\ +8\x03_\xff\xd7\x018\x03`\xff\x9a\x018\x03b\xff\ +\xc3\x018\x03d\xff\xc3\x018\x03f\xff\xc3\x018\x03\ +h\xff\xc3\x018\x03j\xff\xc3\x018\x03l\xff\xc3\x01\ +8\x03n\xff\xc3\x019\x00\x05\x00R\x019\x00\x0a\x00\ +R\x019\x00\x0f\xff\xae\x019\x00\x11\xff\xae\x019\x00\ +\x22\x00)\x019\x02\x07\x00R\x019\x02\x08\xff\xae\x01\ +9\x02\x0b\x00R\x019\x02\x0c\xff\xae\x01:\x00\x0f\xff\ +\x85\x01:\x00\x11\xff\x85\x01:\x00\x22\x00)\x01:\x00\ +$\xff\x85\x01:\x00&\xff\xd7\x01:\x00*\xff\xd7\x01\ +:\x002\xff\xd7\x01:\x004\xff\xd7\x01:\x00D\xff\ +\x9a\x01:\x00F\xff\x9a\x01:\x00G\xff\x9a\x01:\x00\ +H\xff\x9a\x01:\x00J\xff\xd7\x01:\x00P\xff\xc3\x01\ +:\x00Q\xff\xc3\x01:\x00R\xff\x9a\x01:\x00S\xff\ +\xc3\x01:\x00T\xff\x9a\x01:\x00U\xff\xc3\x01:\x00\ +V\xff\xae\x01:\x00X\xff\xc3\x01:\x00]\xff\xd7\x01\ +:\x00\x82\xff\x85\x01:\x00\x83\xff\x85\x01:\x00\x84\xff\ +\x85\x01:\x00\x85\xff\x85\x01:\x00\x86\xff\x85\x01:\x00\ +\x87\xff\x85\x01:\x00\x89\xff\xd7\x01:\x00\x94\xff\xd7\x01\ +:\x00\x95\xff\xd7\x01:\x00\x96\xff\xd7\x01:\x00\x97\xff\ +\xd7\x01:\x00\x98\xff\xd7\x01:\x00\x9a\xff\xd7\x01:\x00\ +\xa2\xff\x9a\x01:\x00\xa3\xff\x9a\x01:\x00\xa4\xff\x9a\x01\ +:\x00\xa5\xff\x9a\x01:\x00\xa6\xff\x9a\x01:\x00\xa7\xff\ +\x9a\x01:\x00\xa8\xff\x9a\x01:\x00\xa9\xff\x9a\x01:\x00\ +\xaa\xff\x9a\x01:\x00\xab\xff\x9a\x01:\x00\xac\xff\x9a\x01\ +:\x00\xad\xff\x9a\x01:\x00\xb4\xff\x9a\x01:\x00\xb5\xff\ +\x9a\x01:\x00\xb6\xff\x9a\x01:\x00\xb7\xff\x9a\x01:\x00\ +\xb8\xff\x9a\x01:\x00\xba\xff\x9a\x01:\x00\xbb\xff\xc3\x01\ +:\x00\xbc\xff\xc3\x01:\x00\xbd\xff\xc3\x01:\x00\xbe\xff\ +\xc3\x01:\x00\xc2\xff\x85\x01:\x00\xc3\xff\x9a\x01:\x00\ +\xc4\xff\x85\x01:\x00\xc5\xff\x9a\x01:\x00\xc6\xff\x85\x01\ +:\x00\xc7\xff\x9a\x01:\x00\xc8\xff\xd7\x01:\x00\xc9\xff\ +\x9a\x01:\x00\xca\xff\xd7\x01:\x00\xcb\xff\x9a\x01:\x00\ +\xcc\xff\xd7\x01:\x00\xcd\xff\x9a\x01:\x00\xce\xff\xd7\x01\ +:\x00\xcf\xff\x9a\x01:\x00\xd1\xff\x9a\x01:\x00\xd3\xff\ +\x9a\x01:\x00\xd5\xff\x9a\x01:\x00\xd7\xff\x9a\x01:\x00\ +\xd9\xff\x9a\x01:\x00\xdb\xff\x9a\x01:\x00\xdd\xff\x9a\x01\ +:\x00\xde\xff\xd7\x01:\x00\xdf\xff\xd7\x01:\x00\xe0\xff\ +\xd7\x01:\x00\xe1\xff\xd7\x01:\x00\xe2\xff\xd7\x01:\x00\ +\xe3\xff\xd7\x01:\x00\xe4\xff\xd7\x01:\x00\xe5\xff\xd7\x01\ +:\x00\xfa\xff\xc3\x01:\x01\x06\xff\xc3\x01:\x01\x08\xff\ +\xc3\x01:\x01\x0d\xff\xc3\x01:\x01\x0e\xff\xd7\x01:\x01\ +\x0f\xff\x9a\x01:\x01\x10\xff\xd7\x01:\x01\x11\xff\x9a\x01\ +:\x01\x12\xff\xd7\x01:\x01\x13\xff\x9a\x01:\x01\x14\xff\ +\xd7\x01:\x01\x15\xff\x9a\x01:\x01\x17\xff\xc3\x01:\x01\ +\x19\xff\xc3\x01:\x01\x1d\xff\xae\x01:\x01!\xff\xae\x01\ +:\x01+\xff\xc3\x01:\x01-\xff\xc3\x01:\x01/\xff\ +\xc3\x01:\x011\xff\xc3\x01:\x013\xff\xc3\x01:\x01\ +5\xff\xc3\x01:\x01<\xff\xd7\x01:\x01>\xff\xd7\x01\ +:\x01@\xff\xd7\x01:\x01C\xff\x85\x01:\x01D\xff\ +\x9a\x01:\x01F\xff\x9a\x01:\x01G\xff\xd7\x01:\x01\ +H\xff\x9a\x01:\x01J\xff\xae\x01:\x02\x08\xff\x85\x01\ +:\x02\x0c\xff\x85\x01:\x02W\xff\xc3\x01:\x02X\xff\ +\x85\x01:\x02Y\xff\x9a\x01:\x02_\xff\xd7\x01:\x02\ +`\xff\x9a\x01:\x02b\xff\xc3\x01:\x03\x1d\xff\x85\x01\ +:\x03\x1e\xff\x9a\x01:\x03\x1f\xff\x85\x01:\x03 \xff\ +\x9a\x01:\x03!\xff\x85\x01:\x03\x22\xff\x9a\x01:\x03\ +#\xff\x85\x01:\x03%\xff\x85\x01:\x03&\xff\x9a\x01\ +:\x03'\xff\x85\x01:\x03(\xff\x9a\x01:\x03)\xff\ +\x85\x01:\x03*\xff\x9a\x01:\x03+\xff\x85\x01:\x03\ +,\xff\x9a\x01:\x03-\xff\x85\x01:\x03.\xff\x9a\x01\ +:\x03/\xff\x85\x01:\x030\xff\x9a\x01:\x031\xff\ +\x85\x01:\x032\xff\x9a\x01:\x033\xff\x85\x01:\x03\ +4\xff\x9a\x01:\x036\xff\x9a\x01:\x038\xff\x9a\x01\ +:\x03:\xff\x9a\x01:\x03<\xff\x9a\x01:\x03@\xff\ +\x9a\x01:\x03B\xff\x9a\x01:\x03D\xff\x9a\x01:\x03\ +I\xff\xd7\x01:\x03J\xff\x9a\x01:\x03K\xff\xd7\x01\ +:\x03L\xff\x9a\x01:\x03M\xff\xd7\x01:\x03N\xff\ +\x9a\x01:\x03O\xff\xd7\x01:\x03Q\xff\xd7\x01:\x03\ +R\xff\x9a\x01:\x03S\xff\xd7\x01:\x03T\xff\x9a\x01\ +:\x03U\xff\xd7\x01:\x03V\xff\x9a\x01:\x03W\xff\ +\xd7\x01:\x03X\xff\x9a\x01:\x03Y\xff\xd7\x01:\x03\ +Z\xff\x9a\x01:\x03[\xff\xd7\x01:\x03\x5c\xff\x9a\x01\ +:\x03]\xff\xd7\x01:\x03^\xff\x9a\x01:\x03_\xff\ +\xd7\x01:\x03`\xff\x9a\x01:\x03b\xff\xc3\x01:\x03\ +d\xff\xc3\x01:\x03f\xff\xc3\x01:\x03h\xff\xc3\x01\ +:\x03j\xff\xc3\x01:\x03l\xff\xc3\x01:\x03n\xff\ +\xc3\x01;\x00&\xff\xec\x01;\x00*\xff\xec\x01;\x00\ +2\xff\xec\x01;\x004\xff\xec\x01;\x00\x89\xff\xec\x01\ +;\x00\x94\xff\xec\x01;\x00\x95\xff\xec\x01;\x00\x96\xff\ +\xec\x01;\x00\x97\xff\xec\x01;\x00\x98\xff\xec\x01;\x00\ +\x9a\xff\xec\x01;\x00\xc8\xff\xec\x01;\x00\xca\xff\xec\x01\ +;\x00\xcc\xff\xec\x01;\x00\xce\xff\xec\x01;\x00\xde\xff\ +\xec\x01;\x00\xe0\xff\xec\x01;\x00\xe2\xff\xec\x01;\x00\ +\xe4\xff\xec\x01;\x01\x0e\xff\xec\x01;\x01\x10\xff\xec\x01\ +;\x01\x12\xff\xec\x01;\x01\x14\xff\xec\x01;\x01G\xff\ +\xec\x01;\x02_\xff\xec\x01;\x03I\xff\xec\x01;\x03\ +K\xff\xec\x01;\x03M\xff\xec\x01;\x03O\xff\xec\x01\ +;\x03Q\xff\xec\x01;\x03S\xff\xec\x01;\x03U\xff\ +\xec\x01;\x03W\xff\xec\x01;\x03Y\xff\xec\x01;\x03\ +[\xff\xec\x01;\x03]\xff\xec\x01;\x03_\xff\xec\x01\ +=\x00&\xff\xec\x01=\x00*\xff\xec\x01=\x002\xff\ +\xec\x01=\x004\xff\xec\x01=\x00\x89\xff\xec\x01=\x00\ +\x94\xff\xec\x01=\x00\x95\xff\xec\x01=\x00\x96\xff\xec\x01\ +=\x00\x97\xff\xec\x01=\x00\x98\xff\xec\x01=\x00\x9a\xff\ +\xec\x01=\x00\xc8\xff\xec\x01=\x00\xca\xff\xec\x01=\x00\ +\xcc\xff\xec\x01=\x00\xce\xff\xec\x01=\x00\xde\xff\xec\x01\ +=\x00\xe0\xff\xec\x01=\x00\xe2\xff\xec\x01=\x00\xe4\xff\ +\xec\x01=\x01\x0e\xff\xec\x01=\x01\x10\xff\xec\x01=\x01\ +\x12\xff\xec\x01=\x01\x14\xff\xec\x01=\x01G\xff\xec\x01\ +=\x02_\xff\xec\x01=\x03I\xff\xec\x01=\x03K\xff\ +\xec\x01=\x03M\xff\xec\x01=\x03O\xff\xec\x01=\x03\ +Q\xff\xec\x01=\x03S\xff\xec\x01=\x03U\xff\xec\x01\ +=\x03W\xff\xec\x01=\x03Y\xff\xec\x01=\x03[\xff\ +\xec\x01=\x03]\xff\xec\x01=\x03_\xff\xec\x01?\x00\ +&\xff\xec\x01?\x00*\xff\xec\x01?\x002\xff\xec\x01\ +?\x004\xff\xec\x01?\x00\x89\xff\xec\x01?\x00\x94\xff\ +\xec\x01?\x00\x95\xff\xec\x01?\x00\x96\xff\xec\x01?\x00\ +\x97\xff\xec\x01?\x00\x98\xff\xec\x01?\x00\x9a\xff\xec\x01\ +?\x00\xc8\xff\xec\x01?\x00\xca\xff\xec\x01?\x00\xcc\xff\ +\xec\x01?\x00\xce\xff\xec\x01?\x00\xde\xff\xec\x01?\x00\ +\xe0\xff\xec\x01?\x00\xe2\xff\xec\x01?\x00\xe4\xff\xec\x01\ +?\x01\x0e\xff\xec\x01?\x01\x10\xff\xec\x01?\x01\x12\xff\ +\xec\x01?\x01\x14\xff\xec\x01?\x01G\xff\xec\x01?\x02\ +_\xff\xec\x01?\x03I\xff\xec\x01?\x03K\xff\xec\x01\ +?\x03M\xff\xec\x01?\x03O\xff\xec\x01?\x03Q\xff\ +\xec\x01?\x03S\xff\xec\x01?\x03U\xff\xec\x01?\x03\ +W\xff\xec\x01?\x03Y\xff\xec\x01?\x03[\xff\xec\x01\ +?\x03]\xff\xec\x01?\x03_\xff\xec\x01C\x00\x05\xff\ +q\x01C\x00\x0a\xffq\x01C\x00&\xff\xd7\x01C\x00\ +*\xff\xd7\x01C\x00-\x01\x0a\x01C\x002\xff\xd7\x01\ +C\x004\xff\xd7\x01C\x007\xffq\x01C\x009\xff\ +\xae\x01C\x00:\xff\xae\x01C\x00<\xff\x85\x01C\x00\ +\x89\xff\xd7\x01C\x00\x94\xff\xd7\x01C\x00\x95\xff\xd7\x01\ +C\x00\x96\xff\xd7\x01C\x00\x97\xff\xd7\x01C\x00\x98\xff\ +\xd7\x01C\x00\x9a\xff\xd7\x01C\x00\x9f\xff\x85\x01C\x00\ +\xc8\xff\xd7\x01C\x00\xca\xff\xd7\x01C\x00\xcc\xff\xd7\x01\ +C\x00\xce\xff\xd7\x01C\x00\xde\xff\xd7\x01C\x00\xe0\xff\ +\xd7\x01C\x00\xe2\xff\xd7\x01C\x00\xe4\xff\xd7\x01C\x01\ +\x0e\xff\xd7\x01C\x01\x10\xff\xd7\x01C\x01\x12\xff\xd7\x01\ +C\x01\x14\xff\xd7\x01C\x01$\xffq\x01C\x01&\xff\ +q\x01C\x016\xff\xae\x01C\x018\xff\x85\x01C\x01\ +:\xff\x85\x01C\x01G\xff\xd7\x01C\x01\xfa\xff\xae\x01\ +C\x01\xfc\xff\xae\x01C\x01\xfe\xff\xae\x01C\x02\x00\xff\ +\x85\x01C\x02\x07\xffq\x01C\x02\x0b\xffq\x01C\x02\ +_\xff\xd7\x01C\x03I\xff\xd7\x01C\x03K\xff\xd7\x01\ +C\x03M\xff\xd7\x01C\x03O\xff\xd7\x01C\x03Q\xff\ +\xd7\x01C\x03S\xff\xd7\x01C\x03U\xff\xd7\x01C\x03\ +W\xff\xd7\x01C\x03Y\xff\xd7\x01C\x03[\xff\xd7\x01\ +C\x03]\xff\xd7\x01C\x03_\xff\xd7\x01C\x03o\xff\ +\x85\x01C\x03q\xff\x85\x01C\x03s\xff\x85\x01C\x03\ +\x8f\xffq\x01D\x00\x05\xff\xec\x01D\x00\x0a\xff\xec\x01\ +D\x02\x07\xff\xec\x01D\x02\x0b\xff\xec\x01E\x00-\x00\ +{\x01G\x00\x0f\xff\xae\x01G\x00\x11\xff\xae\x01G\x00\ +$\xff\xd7\x01G\x007\xff\xc3\x01G\x009\xff\xec\x01\ +G\x00:\xff\xec\x01G\x00;\xff\xd7\x01G\x00<\xff\ +\xec\x01G\x00=\xff\xec\x01G\x00\x82\xff\xd7\x01G\x00\ +\x83\xff\xd7\x01G\x00\x84\xff\xd7\x01G\x00\x85\xff\xd7\x01\ +G\x00\x86\xff\xd7\x01G\x00\x87\xff\xd7\x01G\x00\x9f\xff\ +\xec\x01G\x00\xc2\xff\xd7\x01G\x00\xc4\xff\xd7\x01G\x00\ +\xc6\xff\xd7\x01G\x01$\xff\xc3\x01G\x01&\xff\xc3\x01\ +G\x016\xff\xec\x01G\x018\xff\xec\x01G\x01:\xff\ +\xec\x01G\x01;\xff\xec\x01G\x01=\xff\xec\x01G\x01\ +?\xff\xec\x01G\x01C\xff\xd7\x01G\x01\xa0\xff\xec\x01\ +G\x01\xfa\xff\xec\x01G\x01\xfc\xff\xec\x01G\x01\xfe\xff\ +\xec\x01G\x02\x00\xff\xec\x01G\x02\x08\xff\xae\x01G\x02\ +\x0c\xff\xae\x01G\x02X\xff\xd7\x01G\x03\x1d\xff\xd7\x01\ +G\x03\x1f\xff\xd7\x01G\x03!\xff\xd7\x01G\x03#\xff\ +\xd7\x01G\x03%\xff\xd7\x01G\x03'\xff\xd7\x01G\x03\ +)\xff\xd7\x01G\x03+\xff\xd7\x01G\x03-\xff\xd7\x01\ +G\x03/\xff\xd7\x01G\x031\xff\xd7\x01G\x033\xff\ +\xd7\x01G\x03o\xff\xec\x01G\x03q\xff\xec\x01G\x03\ +s\xff\xec\x01G\x03\x8f\xff\xc3\x01V\x00\x05\xffq\x01\ +V\x00\x0a\xffq\x01V\x01f\xff\xd7\x01V\x01m\xff\ +\xd7\x01V\x01q\xffq\x01V\x01r\xff\x85\x01V\x01\ +s\xff\xd7\x01V\x01u\xff\xae\x01V\x01x\xff\x85\x01\ +V\x02\x07\xffq\x01V\x02\x0b\xffq\x01V\x02T\xff\ +\x85\x01[\x00\x0f\xff\xae\x01[\x00\x11\xff\xae\x01[\x01\ +V\xff\xd7\x01[\x01_\xff\xd7\x01[\x01b\xff\xd7\x01\ +[\x01d\xff\xec\x01[\x01i\xff\xd7\x01[\x01p\xff\ +\xec\x01[\x01q\xff\xc3\x01[\x01r\xff\xec\x01[\x01\ +t\xff\xd7\x01[\x01u\xff\xec\x01[\x01x\xff\xec\x01\ +[\x01\x88\xff\xec\x01[\x02\x08\xff\xae\x01[\x02\x0c\xff\ +\xae\x01[\x02T\xff\xec\x01\x5c\x00\x0f\xff\x85\x01\x5c\x00\ +\x11\xff\x85\x01\x5c\x01V\xff\x85\x01\x5c\x01_\xff\x85\x01\ +\x5c\x01b\xff\x85\x01\x5c\x01f\xff\xd7\x01\x5c\x01i\xff\ +\x85\x01\x5c\x01m\xff\xd7\x01\x5c\x01s\xff\xc3\x01\x5c\x01\ +v\xff\xec\x01\x5c\x01y\xff\x9a\x01\x5c\x01z\xff\xae\x01\ +\x5c\x01{\xff\xc3\x01\x5c\x01|\xff\xc3\x01\x5c\x01}\xff\ +\xc3\x01\x5c\x01~\xff\x9a\x01\x5c\x01\x81\xff\xc3\x01\x5c\x01\ +\x82\xff\xae\x01\x5c\x01\x84\xff\xc3\x01\x5c\x01\x86\xff\xc3\x01\ +\x5c\x01\x87\xff\xc3\x01\x5c\x01\x89\xff\xc3\x01\x5c\x01\x8c\xff\ +\x9a\x01\x5c\x01\x8e\xff\x9a\x01\x5c\x01\x8f\xff\x9a\x01\x5c\x01\ +\x90\xff\x9a\x01\x5c\x01\x92\xff\xc3\x01\x5c\x01\x93\xff\x9a\x01\ +\x5c\x01\x95\xff\xc3\x01\x5c\x01\x96\xff\xc3\x01\x5c\x01\x98\xff\ +\xc3\x01\x5c\x01\x99\xff\x9a\x01\x5c\x01\x9a\xff\xc3\x01\x5c\x01\ +\x9b\xff\xc3\x01\x5c\x02\x08\xff\x85\x01\x5c\x02\x0c\xff\x85\x01\ +\x5c\x02!\xff\xec\x01]\x01q\xff\xd7\x01]\x01r\xff\ +\xec\x01]\x01x\xff\xec\x01]\x02T\xff\xec\x01^\x00\ +\x05\xff\xd7\x01^\x00\x0a\xff\xd7\x01^\x02\x07\xff\xd7\x01\ +^\x02\x0b\xff\xd7\x01_\x00\x05\xffq\x01_\x00\x0a\xff\ +q\x01_\x01f\xff\xd7\x01_\x01m\xff\xd7\x01_\x01\ +q\xffq\x01_\x01r\xff\x85\x01_\x01s\xff\xd7\x01\ +_\x01u\xff\xae\x01_\x01x\xff\x85\x01_\x02\x07\xff\ +q\x01_\x02\x0b\xffq\x01_\x02T\xff\x85\x01`\x00\ +\x0f\xff\xae\x01`\x00\x11\xff\xae\x01`\x01V\xff\xd7\x01\ +`\x01_\xff\xd7\x01`\x01b\xff\xd7\x01`\x01i\xff\ +\xd7\x01`\x01t\xff\xd7\x01`\x02\x08\xff\xae\x01`\x02\ +\x0c\xff\xae\x01a\x00\x0f\xff\x85\x01a\x00\x10\xff\xae\x01\ +a\x00\x11\xff\x85\x01a\x01V\xff\x5c\x01a\x01_\xff\ +\x5c\x01a\x01b\xff\x5c\x01a\x01f\xff\xc3\x01a\x01\ +i\xff\x5c\x01a\x01m\xff\xc3\x01a\x01s\xff\x9a\x01\ +a\x01v\xff\xc3\x01a\x01y\xffq\x01a\x01z\xff\ +\x9a\x01a\x01{\xff\x9a\x01a\x01|\xff\xae\x01a\x01\ +}\xff\x9a\x01a\x01~\xffq\x01a\x01\x80\xff\xd7\x01\ +a\x01\x81\xff\xc3\x01a\x01\x82\xff\x9a\x01a\x01\x84\xff\ +\x9a\x01a\x01\x86\xff\xae\x01a\x01\x87\xff\x9a\x01a\x01\ +\x89\xff\x9a\x01a\x01\x8a\xff\xd7\x01a\x01\x8c\xffq\x01\ +a\x01\x8e\xff\x9a\x01a\x01\x8f\xffq\x01a\x01\x90\xff\ +q\x01a\x01\x92\xff\x9a\x01a\x01\x93\xffq\x01a\x01\ +\x94\xff\xd7\x01a\x01\x95\xff\x9a\x01a\x01\x96\xff\x9a\x01\ +a\x01\x98\xff\x9a\x01a\x01\x99\xffq\x01a\x01\x9a\xff\ +\x9a\x01a\x01\x9b\xff\x9a\x01a\x02\x02\xff\xae\x01a\x02\ +\x03\xff\xae\x01a\x02\x04\xff\xae\x01a\x02\x08\xff\x85\x01\ +a\x02\x0c\xff\x85\x01a\x02!\xff\xc3\x01a\x02S\xff\ +\xd7\x01b\x00\x05\xffq\x01b\x00\x0a\xffq\x01b\x01\ +f\xff\xd7\x01b\x01m\xff\xd7\x01b\x01q\xffq\x01\ +b\x01r\xff\x85\x01b\x01s\xff\xd7\x01b\x01u\xff\ +\xae\x01b\x01x\xff\x85\x01b\x02\x07\xffq\x01b\x02\ +\x0b\xffq\x01b\x02T\xff\x85\x01d\x01f\xff\xec\x01\ +d\x01m\xff\xec\x01d\x01s\xff\xc3\x01f\x00\x0f\xff\ +\xae\x01f\x00\x11\xff\xae\x01f\x01V\xff\xd7\x01f\x01\ +_\xff\xd7\x01f\x01b\xff\xd7\x01f\x01d\xff\xec\x01\ +f\x01i\xff\xd7\x01f\x01p\xff\xec\x01f\x01q\xff\ +\xc3\x01f\x01r\xff\xec\x01f\x01t\xff\xd7\x01f\x01\ +u\xff\xec\x01f\x01x\xff\xec\x01f\x01\x88\xff\xec\x01\ +f\x02\x08\xff\xae\x01f\x02\x0c\xff\xae\x01f\x02T\xff\ +\xec\x01h\x01f\xff\xd7\x01h\x01m\xff\xd7\x01h\x01\ +s\xff\xc3\x01h\x01\x8d\xff\xec\x01h\x01\x91\xff\xec\x01\ +i\x00\x05\xffq\x01i\x00\x0a\xffq\x01i\x01f\xff\ +\xd7\x01i\x01m\xff\xd7\x01i\x01q\xffq\x01i\x01\ +r\xff\x85\x01i\x01s\xff\xd7\x01i\x01u\xff\xae\x01\ +i\x01x\xff\x85\x01i\x02\x07\xffq\x01i\x02\x0b\xff\ +q\x01i\x02T\xff\x85\x01m\x00\x0f\xff\xae\x01m\x00\ +\x11\xff\xae\x01m\x01V\xff\xd7\x01m\x01_\xff\xd7\x01\ +m\x01b\xff\xd7\x01m\x01d\xff\xec\x01m\x01i\xff\ +\xd7\x01m\x01p\xff\xec\x01m\x01q\xff\xc3\x01m\x01\ +r\xff\xec\x01m\x01t\xff\xd7\x01m\x01u\xff\xec\x01\ +m\x01x\xff\xec\x01m\x01\x88\xff\xec\x01m\x02\x08\xff\ +\xae\x01m\x02\x0c\xff\xae\x01m\x02T\xff\xec\x01o\x00\ +\x0f\xfe\xf6\x01o\x00\x11\xfe\xf6\x01o\x01V\xff\x9a\x01\ +o\x01_\xff\x9a\x01o\x01b\xff\x9a\x01o\x01d\xff\ +\xec\x01o\x01i\xff\x9a\x01o\x01t\xff\xd7\x01o\x01\ +\x88\xff\xd7\x01o\x02\x08\xfe\xf6\x01o\x02\x0c\xfe\xf6\x01\ +q\x00\x0f\xff\x85\x01q\x00\x10\xff\xae\x01q\x00\x11\xff\ +\x85\x01q\x01V\xff\x5c\x01q\x01_\xff\x5c\x01q\x01\ +b\xff\x5c\x01q\x01f\xff\xc3\x01q\x01i\xff\x5c\x01\ +q\x01m\xff\xc3\x01q\x01s\xff\x9a\x01q\x01v\xff\ +\xc3\x01q\x01y\xffq\x01q\x01z\xff\x9a\x01q\x01\ +{\xff\x9a\x01q\x01|\xff\xae\x01q\x01}\xff\x9a\x01\ +q\x01~\xffq\x01q\x01\x80\xff\xd7\x01q\x01\x81\xff\ +\xc3\x01q\x01\x82\xff\x9a\x01q\x01\x84\xff\x9a\x01q\x01\ +\x86\xff\xae\x01q\x01\x87\xff\x9a\x01q\x01\x89\xff\x9a\x01\ +q\x01\x8a\xff\xd7\x01q\x01\x8c\xffq\x01q\x01\x8e\xff\ +\x9a\x01q\x01\x8f\xffq\x01q\x01\x90\xffq\x01q\x01\ +\x92\xff\x9a\x01q\x01\x93\xffq\x01q\x01\x94\xff\xd7\x01\ +q\x01\x95\xff\x9a\x01q\x01\x96\xff\x9a\x01q\x01\x98\xff\ +\x9a\x01q\x01\x99\xffq\x01q\x01\x9a\xff\x9a\x01q\x01\ +\x9b\xff\x9a\x01q\x02\x02\xff\xae\x01q\x02\x03\xff\xae\x01\ +q\x02\x04\xff\xae\x01q\x02\x08\xff\x85\x01q\x02\x0c\xff\ +\x85\x01q\x02!\xff\xc3\x01q\x02S\xff\xd7\x01r\x00\ +\x0f\xff\x85\x01r\x00\x11\xff\x85\x01r\x01V\xff\x85\x01\ +r\x01_\xff\x85\x01r\x01b\xff\x85\x01r\x01f\xff\ +\xd7\x01r\x01i\xff\x85\x01r\x01m\xff\xd7\x01r\x01\ +s\xff\xc3\x01r\x01v\xff\xec\x01r\x01y\xff\x9a\x01\ +r\x01z\xff\xae\x01r\x01{\xff\xc3\x01r\x01|\xff\ +\xc3\x01r\x01}\xff\xc3\x01r\x01~\xff\x9a\x01r\x01\ +\x81\xff\xc3\x01r\x01\x82\xff\xae\x01r\x01\x84\xff\xc3\x01\ +r\x01\x86\xff\xc3\x01r\x01\x87\xff\xc3\x01r\x01\x89\xff\ +\xc3\x01r\x01\x8c\xff\x9a\x01r\x01\x8e\xff\x9a\x01r\x01\ +\x8f\xff\x9a\x01r\x01\x90\xff\x9a\x01r\x01\x92\xff\xc3\x01\ +r\x01\x93\xff\x9a\x01r\x01\x95\xff\xc3\x01r\x01\x96\xff\ +\xc3\x01r\x01\x98\xff\xc3\x01r\x01\x99\xff\x9a\x01r\x01\ +\x9a\xff\xc3\x01r\x01\x9b\xff\xc3\x01r\x02\x08\xff\x85\x01\ +r\x02\x0c\xff\x85\x01r\x02!\xff\xec\x01s\x00\x0f\xff\ +\x9a\x01s\x00\x11\xff\x9a\x01s\x01V\xff\xd7\x01s\x01\ +_\xff\xd7\x01s\x01b\xff\xd7\x01s\x01d\xff\xc3\x01\ +s\x01i\xff\xd7\x01s\x01p\xff\xec\x01s\x01q\xff\ +\xae\x01s\x01r\xff\xc3\x01s\x01t\xff\xec\x01s\x01\ +x\xff\xc3\x01s\x01\x88\xff\xec\x01s\x02\x08\xff\x9a\x01\ +s\x02\x0c\xff\x9a\x01s\x02T\xff\xc3\x01t\x01f\xff\ +\xd7\x01t\x01m\xff\xd7\x01t\x01s\xff\xc3\x01t\x01\ +\x8d\xff\xec\x01t\x01\x91\xff\xec\x01u\x00\x0f\xff\x85\x01\ +u\x00\x11\xff\x85\x01u\x01V\xff\xae\x01u\x01_\xff\ +\xae\x01u\x01b\xff\xae\x01u\x01f\xff\xec\x01u\x01\ +i\xff\xae\x01u\x01m\xff\xec\x01u\x02\x08\xff\x85\x01\ +u\x02\x0c\xff\x85\x01v\x01q\xff\xd7\x01v\x01r\xff\ +\xec\x01v\x01x\xff\xec\x01v\x02T\xff\xec\x01x\x00\ +\x0f\xff\x85\x01x\x00\x11\xff\x85\x01x\x01V\xff\x85\x01\ +x\x01_\xff\x85\x01x\x01b\xff\x85\x01x\x01f\xff\ +\xd7\x01x\x01i\xff\x85\x01x\x01m\xff\xd7\x01x\x01\ +s\xff\xc3\x01x\x01v\xff\xec\x01x\x01y\xff\x9a\x01\ +x\x01z\xff\xae\x01x\x01{\xff\xc3\x01x\x01|\xff\ +\xc3\x01x\x01}\xff\xc3\x01x\x01~\xff\x9a\x01x\x01\ +\x81\xff\xc3\x01x\x01\x82\xff\xae\x01x\x01\x84\xff\xc3\x01\ +x\x01\x86\xff\xc3\x01x\x01\x87\xff\xc3\x01x\x01\x89\xff\ +\xc3\x01x\x01\x8c\xff\x9a\x01x\x01\x8e\xff\x9a\x01x\x01\ +\x8f\xff\x9a\x01x\x01\x90\xff\x9a\x01x\x01\x92\xff\xc3\x01\ +x\x01\x93\xff\x9a\x01x\x01\x95\xff\xc3\x01x\x01\x96\xff\ +\xc3\x01x\x01\x98\xff\xc3\x01x\x01\x99\xff\x9a\x01x\x01\ +\x9a\xff\xc3\x01x\x01\x9b\xff\xc3\x01x\x02\x08\xff\x85\x01\ +x\x02\x0c\xff\x85\x01x\x02!\xff\xec\x01y\x01\x88\x00\ +)\x01{\x00\x05\xff\xec\x01{\x00\x0a\xff\xec\x01{\x02\ +\x07\xff\xec\x01{\x02\x0b\xff\xec\x01|\x00\x05\xff\xae\x01\ +|\x00\x0a\xff\xae\x01|\x01\x8d\xff\xec\x01|\x01\x91\xff\ +\xec\x01|\x02\x07\xff\xae\x01|\x02\x0b\xff\xae\x01~\x01\ +\x88\x00)\x01\x80\x00\x0f\xff\xae\x01\x80\x00\x11\xff\xae\x01\ +\x80\x01\x88\xff\xec\x01\x80\x02\x08\xff\xae\x01\x80\x02\x0c\xff\ +\xae\x01\x83\x00\x10\xff\x9a\x01\x83\x01y\xff\xd7\x01\x83\x01\ +~\xff\xd7\x01\x83\x01\x81\xff\xd7\x01\x83\x01\x8c\xff\xd7\x01\ +\x83\x01\x8d\xff\xd7\x01\x83\x01\x8f\xff\xd7\x01\x83\x01\x90\xff\ +\xd7\x01\x83\x01\x91\xff\xd7\x01\x83\x01\x93\xff\xd7\x01\x83\x01\ +\x99\xff\xd7\x01\x83\x02\x02\xff\x9a\x01\x83\x02\x03\xff\x9a\x01\ +\x83\x02\x04\xff\x9a\x01\x84\x00\x05\xff\xec\x01\x84\x00\x0a\xff\ +\xec\x01\x84\x02\x07\xff\xec\x01\x84\x02\x0b\xff\xec\x01\x85\x00\ +\x0f\xff\xd7\x01\x85\x00\x11\xff\xd7\x01\x85\x02\x08\xff\xd7\x01\ +\x85\x02\x0c\xff\xd7\x01\x86\x00\x05\xff\xae\x01\x86\x00\x0a\xff\ +\xae\x01\x86\x01\x8d\xff\xec\x01\x86\x01\x91\xff\xec\x01\x86\x02\ +\x07\xff\xae\x01\x86\x02\x0b\xff\xae\x01\x87\x01y\xff\xd7\x01\ +\x87\x01~\xff\xd7\x01\x87\x01\x8c\xff\xd7\x01\x87\x01\x8f\xff\ +\xd7\x01\x87\x01\x90\xff\xd7\x01\x87\x01\x93\xff\xd7\x01\x87\x01\ +\x99\xff\xd7\x01\x88\x00\x05\xff\x85\x01\x88\x00\x0a\xff\x85\x01\ +\x88\x01y\xff\xec\x01\x88\x01~\xff\xec\x01\x88\x01\x80\xff\ +\xd7\x01\x88\x01\x8a\xff\xd7\x01\x88\x01\x8c\xff\xec\x01\x88\x01\ +\x8d\xff\xd7\x01\x88\x01\x8f\xff\xec\x01\x88\x01\x90\xff\xec\x01\ +\x88\x01\x91\xff\xd7\x01\x88\x01\x93\xff\xec\x01\x88\x01\x99\xff\ +\xec\x01\x88\x02\x07\xff\x85\x01\x88\x02\x0b\xff\x85\x01\x8a\x00\ +\x0f\xff\xae\x01\x8a\x00\x11\xff\xae\x01\x8a\x01\x88\xff\xec\x01\ +\x8a\x02\x08\xff\xae\x01\x8a\x02\x0c\xff\xae\x01\x8c\x00\x05\xff\ +\xec\x01\x8c\x00\x0a\xff\xec\x01\x8c\x01\x80\xff\xd7\x01\x8c\x01\ +\x8a\xff\xd7\x01\x8c\x02\x07\xff\xec\x01\x8c\x02\x0b\xff\xec\x01\ +\x8e\x00\x05\xff\xec\x01\x8e\x00\x0a\xff\xec\x01\x8e\x01\x80\xff\ +\xd7\x01\x8e\x01\x8a\xff\xd7\x01\x8e\x02\x07\xff\xec\x01\x8e\x02\ +\x0b\xff\xec\x01\x90\x00\x0f\xff\xec\x01\x90\x00\x11\xff\xec\x01\ +\x90\x02\x08\xff\xec\x01\x90\x02\x0c\xff\xec\x01\x93\x00\x05\xff\ +\xec\x01\x93\x00\x0a\xff\xec\x01\x93\x01\x80\xff\xd7\x01\x93\x01\ +\x8a\xff\xd7\x01\x93\x02\x07\xff\xec\x01\x93\x02\x0b\xff\xec\x01\ +\x94\x00\x0f\xff\xc3\x01\x94\x00\x10\xff\xd7\x01\x94\x00\x11\xff\ +\xc3\x01\x94\x01y\xff\xd7\x01\x94\x01~\xff\xd7\x01\x94\x01\ +\x81\xff\xd7\x01\x94\x01\x8c\xff\xd7\x01\x94\x01\x8f\xff\xd7\x01\ +\x94\x01\x90\xff\xd7\x01\x94\x01\x93\xff\xd7\x01\x94\x01\x99\xff\ +\xd7\x01\x94\x02\x02\xff\xd7\x01\x94\x02\x03\xff\xd7\x01\x94\x02\ +\x04\xff\xd7\x01\x94\x02\x08\xff\xc3\x01\x94\x02\x0c\xff\xc3\x01\ +\x97\x00\x05\xff\xd7\x01\x97\x00\x0a\xff\xd7\x01\x97\x02\x07\xff\ +\xd7\x01\x97\x02\x0b\xff\xd7\x01\x99\x00\x05\xff\xec\x01\x99\x00\ +\x0a\xff\xec\x01\x99\x01\x80\xff\xd7\x01\x99\x01\x8a\xff\xd7\x01\ +\x99\x02\x07\xff\xec\x01\x99\x02\x0b\xff\xec\x01\x9d\x00\x05\xff\ +\xae\x01\x9d\x00\x0a\xff\xae\x01\x9d\x01\x9d\xff\x85\x01\x9d\x01\ +\xa6\xff\x85\x01\x9d\x01\xa8\xff\xd7\x01\x9d\x01\xbc\xff\x9a\x01\ +\x9d\x01\xbd\xff\xd7\x01\x9d\x01\xc1\xff\x9a\x01\x9d\x01\xc4\xff\ +\x85\x01\x9d\x01\xdc\xff\xd7\x01\x9d\x01\xdd\xff\xd7\x01\x9d\x01\ +\xe1\xff\xd7\x01\x9d\x01\xe4\xff\xd7\x01\x9d\x01\xf6\xff\xd7\x01\ +\x9d\x02\x07\xff\xae\x01\x9d\x02\x0b\xff\xae\x01\x9d\x02n\xff\ +\xae\x01\x9d\x02|\xff\x9a\x01\x9d\x02\x80\xff\xae\x01\x9d\x02\ +\x82\xff\xae\x01\x9d\x02\x97\xff\xae\x01\x9d\x02\x9b\xff\xae\x01\ +\x9d\x02\xa7\xff\xae\x01\x9d\x02\xa9\xff\x85\x01\x9d\x02\xaa\xff\ +\xd7\x01\x9d\x02\xb5\xff\x9a\x01\x9d\x02\xb6\xff\xd7\x01\x9d\x02\ +\xb7\xff\x9a\x01\x9d\x02\xb8\xff\xd7\x01\x9d\x02\xb9\xff\x9a\x01\ +\x9d\x02\xba\xff\xd7\x01\x9d\x02\xbd\xff\x85\x01\x9d\x02\xbe\xff\ +\xd7\x01\x9d\x02\xbf\xff\x9a\x01\x9d\x02\xc0\xff\xd7\x01\x9d\x02\ +\xc1\xff\x9a\x01\x9d\x02\xc2\xff\xd7\x01\x9d\x02\xd4\xff\x9a\x01\ +\x9d\x02\xd5\xff\xd7\x01\x9d\x02\xf7\xff\xd7\x01\x9d\x02\xf8\xff\ +\xd7\x01\x9d\x02\xf9\xff\xd7\x01\x9d\x02\xfa\xff\xd7\x01\x9d\x02\ +\xfb\xff\xd7\x01\x9d\x02\xfc\xff\xd7\x01\x9d\x02\xfd\xff\x9a\x01\ +\x9d\x02\xfe\xff\xd7\x01\x9d\x03\x03\xff\xae\x01\x9d\x03\x0d\xff\ +\x9a\x01\x9d\x03\x0e\xff\xc3\x01\x9d\x03\x0f\xff\x9a\x01\x9d\x03\ +\x10\xff\xc3\x01\x9d\x03\x17\xff\x85\x01\x9d\x03\x18\xff\xd7\x01\ +\x9e\x00\x0f\xff\x85\x01\x9e\x00\x10\xff\xae\x01\x9e\x00\x11\xff\ +\x85\x01\x9e\x01\x9f\xff\xd7\x01\x9e\x01\xa4\xff\x9a\x01\x9e\x01\ +\xaa\xffq\x01\x9e\x01\xae\xff\x9a\x01\x9e\x01\xb5\xff\x9a\x01\ +\x9e\x01\xb8\xff\xd7\x01\x9e\x01\xbb\xff\xd7\x01\x9e\x01\xbc\x00\ +)\x01\x9e\x01\xbe\xff\xae\x01\x9e\x01\xcc\xff\x9a\x01\x9e\x01\ +\xcd\xff\x9a\x01\x9e\x01\xce\xff\x85\x01\x9e\x01\xcf\xffq\x01\ +\x9e\x01\xd0\xff\xd7\x01\x9e\x01\xd1\xff\xd7\x01\x9e\x01\xd2\xff\ +\x9a\x01\x9e\x01\xd3\xff\x9a\x01\x9e\x01\xd4\xff\x9a\x01\x9e\x01\ +\xd5\xff\x85\x01\x9e\x01\xd6\xff\x9a\x01\x9e\x01\xd7\xff\x9a\x01\ +\x9e\x01\xd8\xffq\x01\x9e\x01\xd9\xff\x9a\x01\x9e\x01\xda\xff\ +\x9a\x01\x9e\x01\xdb\xffq\x01\x9e\x01\xdc\xff\xae\x01\x9e\x01\ +\xdd\xff\xae\x01\x9e\x01\xde\xffq\x01\x9e\x01\xdf\xff\xd7\x01\ +\x9e\x01\xe0\xff\x9a\x01\x9e\x01\xe1\xff\x9a\x01\x9e\x01\xe2\xff\ +\x9a\x01\x9e\x01\xe3\xff\x9a\x01\x9e\x01\xe4\xff\xae\x01\x9e\x01\ +\xe5\xff\x9a\x01\x9e\x01\xe6\xff\x9a\x01\x9e\x01\xe7\xff\xd7\x01\ +\x9e\x01\xe8\xff\x9a\x01\x9e\x01\xe9\xff\xc3\x01\x9e\x01\xea\xff\ +q\x01\x9e\x01\xec\xff\x9a\x01\x9e\x01\xed\xffq\x01\x9e\x01\ +\xee\xff\x85\x01\x9e\x01\xf2\xff\x85\x01\x9e\x01\xf3\xff\x9a\x01\ +\x9e\x01\xf5\xff\x9a\x01\x9e\x01\xf6\xff\xae\x01\x9e\x01\xf7\xff\ +\x9a\x01\x9e\x01\xf9\xff\x9a\x01\x9e\x02\x02\xff\xae\x01\x9e\x02\ +\x03\xff\xae\x01\x9e\x02\x04\xff\xae\x01\x9e\x02\x08\xff\x85\x01\ +\x9e\x02\x0c\xff\x85\x01\x9e\x02j\xffq\x01\x9e\x02k\xff\ +\x9a\x01\x9e\x02l\xff\xd7\x01\x9e\x02m\xff\xd7\x01\x9e\x02\ +q\xff\x9a\x01\x9e\x02r\xffq\x01\x9e\x02s\xff\x85\x01\ +\x9e\x02u\xff\x9a\x01\x9e\x02w\xff\x9a\x01\x9e\x02y\xff\ +\x9a\x01\x9e\x02}\xff\x9a\x01\x9e\x02~\xff\xd7\x01\x9e\x02\ +\x7f\xffq\x01\x9e\x02\x81\xff\xd7\x01\x9e\x02\x83\xff\xd7\x01\ +\x9e\x02\x84\xff\xd7\x01\x9e\x02\x85\xffq\x01\x9e\x02\x86\xff\ +\xd7\x01\x9e\x02\x87\xffq\x01\x9e\x02\x88\xff\xd7\x01\x9e\x02\ +\x89\xffq\x01\x9e\x02\x8a\xff\xd7\x01\x9e\x02\x8b\xff\xd7\x01\ +\x9e\x02\x8c\xff\xd7\x01\x9e\x02\x8d\xffq\x01\x9e\x02\x96\xff\ +\x9a\x01\x9e\x02\x9a\xff\x9a\x01\x9e\x02\x9e\xff\x9a\x01\x9e\x02\ +\xa0\xff\xd7\x01\x9e\x02\xa2\xff\xd7\x01\x9e\x02\xa4\xff\x9a\x01\ +\x9e\x02\xa6\xff\x9a\x01\x9e\x02\xaa\xff\xae\x01\x9e\x02\xac\xff\ +\x9a\x01\x9e\x02\xae\xff\x9a\x01\x9e\x02\xb0\xff\x9a\x01\x9e\x02\ +\xb1\xff\xd7\x01\x9e\x02\xb2\xffq\x01\x9e\x02\xb3\xff\xd7\x01\ +\x9e\x02\xb4\xffq\x01\x9e\x02\xb5\x00)\x01\x9e\x02\xb6\xff\ +\xae\x01\x9e\x02\xb8\xff\xae\x01\x9e\x02\xba\xff\xae\x01\x9e\x02\ +\xbc\xff\xd7\x01\x9e\x02\xbe\xff\xae\x01\x9e\x02\xc0\xff\x9a\x01\ +\x9e\x02\xc2\xff\x9a\x01\x9e\x02\xc4\xff\x9a\x01\x9e\x02\xc5\xff\ +\x9a\x01\x9e\x02\xc6\xffq\x01\x9e\x02\xc7\xff\x9a\x01\x9e\x02\ +\xc8\xffq\x01\x9e\x02\xcb\xff\xd7\x01\x9e\x02\xcd\xff\x9a\x01\ +\x9e\x02\xce\xff\x9a\x01\x9e\x02\xcf\xff\x85\x01\x9e\x02\xd1\xff\ +\x9a\x01\x9e\x02\xd3\xff\x9a\x01\x9e\x02\xd5\xff\x9a\x01\x9e\x02\ +\xd7\xff\x9a\x01\x9e\x02\xd9\xffq\x01\x9e\x02\xdb\xffq\x01\ +\x9e\x02\xdd\xffq\x01\x9e\x02\xe0\xffq\x01\x9e\x02\xe6\xff\ +\xd7\x01\x9e\x02\xe8\xff\xd7\x01\x9e\x02\xea\xff\xc3\x01\x9e\x02\ +\xec\xff\x9a\x01\x9e\x02\xee\xff\x9a\x01\x9e\x02\xef\xff\xd7\x01\ +\x9e\x02\xf0\xffq\x01\x9e\x02\xf1\xff\xd7\x01\x9e\x02\xf2\xff\ +q\x01\x9e\x02\xf3\xff\xd7\x01\x9e\x02\xf4\xffq\x01\x9e\x02\ +\xf6\xff\xd7\x01\x9e\x02\xf8\xff\xae\x01\x9e\x02\xfa\xff\xae\x01\ +\x9e\x02\xfc\xff\xae\x01\x9e\x02\xfe\xff\x9a\x01\x9e\x03\x00\xff\ +\x9a\x01\x9e\x03\x02\xff\x9a\x01\x9e\x03\x06\xff\xd7\x01\x9e\x03\ +\x08\xff\xd7\x01\x9e\x03\x09\xffq\x01\x9e\x03\x0a\xffq\x01\ +\x9e\x03\x0b\xffq\x01\x9e\x03\x0c\xffq\x01\x9e\x03\x0e\xff\ +\x9a\x01\x9e\x03\x10\xff\x9a\x01\x9e\x03\x11\xff\x9a\x01\x9e\x03\ +\x12\xff\x85\x01\x9e\x03\x14\xff\x9a\x01\x9e\x03\x15\xff\xd7\x01\ +\x9e\x03\x16\xffq\x01\x9e\x03\x18\xff\xae\x01\x9e\x03\x1a\xff\ +q\x01\x9e\x03\x1b\xff\x9a\x01\x9e\x03\x1c\xff\x85\x01\x9f\x01\ +\x9f\xff\xd7\x01\x9f\x01\xb8\xff\xd7\x01\x9f\x01\xbb\xff\xd7\x01\ +\x9f\x01\xbe\xff\xd7\x01\x9f\x01\xe1\xff\xd7\x01\x9f\x02l\xff\ +\xd7\x01\x9f\x02~\xff\xd7\x01\x9f\x02\x84\xff\xd7\x01\x9f\x02\ +\x86\xff\xd7\x01\x9f\x02\x88\xff\xd7\x01\x9f\x02\x8a\xff\xd7\x01\ +\x9f\x02\x8c\xff\xd7\x01\x9f\x02\xb1\xff\xd7\x01\x9f\x02\xb3\xff\ +\xd7\x01\x9f\x02\xc0\xff\xd7\x01\x9f\x02\xc2\xff\xd7\x01\x9f\x02\ +\xc5\xff\xd7\x01\x9f\x02\xc7\xff\xd7\x01\x9f\x02\xd5\xff\xd7\x01\ +\x9f\x02\xef\xff\xd7\x01\x9f\x02\xf1\xff\xd7\x01\x9f\x02\xf3\xff\ +\xd7\x01\x9f\x02\xfe\xff\xd7\x01\x9f\x03\x09\xff\xd7\x01\x9f\x03\ +\x0b\xff\xd7\x01\x9f\x03\x0e\xff\xd7\x01\x9f\x03\x10\xff\xd7\x01\ +\x9f\x03\x15\xff\xd7\x01\xa0\x03\x0e\xff\xd7\x01\xa0\x03\x10\xff\ +\xd7\x01\xa4\x00\x05\xff\xae\x01\xa4\x00\x0a\xff\xae\x01\xa4\x01\ +\x9d\xff\x85\x01\xa4\x01\xa6\xff\x85\x01\xa4\x01\xa8\xff\xd7\x01\ +\xa4\x01\xbc\xff\x9a\x01\xa4\x01\xbd\xff\xd7\x01\xa4\x01\xc1\xff\ +\x9a\x01\xa4\x01\xc4\xff\x85\x01\xa4\x01\xdc\xff\xd7\x01\xa4\x01\ +\xdd\xff\xd7\x01\xa4\x01\xe1\xff\xd7\x01\xa4\x01\xe4\xff\xd7\x01\ +\xa4\x01\xf6\xff\xd7\x01\xa4\x02\x07\xff\xae\x01\xa4\x02\x0b\xff\ +\xae\x01\xa4\x02n\xff\xae\x01\xa4\x02|\xff\x9a\x01\xa4\x02\ +\x80\xff\xae\x01\xa4\x02\x82\xff\xae\x01\xa4\x02\x97\xff\xae\x01\ +\xa4\x02\x9b\xff\xae\x01\xa4\x02\xa7\xff\xae\x01\xa4\x02\xa9\xff\ +\x85\x01\xa4\x02\xaa\xff\xd7\x01\xa4\x02\xb5\xff\x9a\x01\xa4\x02\ +\xb6\xff\xd7\x01\xa4\x02\xb7\xff\x9a\x01\xa4\x02\xb8\xff\xd7\x01\ +\xa4\x02\xb9\xff\x9a\x01\xa4\x02\xba\xff\xd7\x01\xa4\x02\xbd\xff\ +\x85\x01\xa4\x02\xbe\xff\xd7\x01\xa4\x02\xbf\xff\x9a\x01\xa4\x02\ +\xc0\xff\xd7\x01\xa4\x02\xc1\xff\x9a\x01\xa4\x02\xc2\xff\xd7\x01\ +\xa4\x02\xd4\xff\x9a\x01\xa4\x02\xd5\xff\xd7\x01\xa4\x02\xf7\xff\ +\xd7\x01\xa4\x02\xf8\xff\xd7\x01\xa4\x02\xf9\xff\xd7\x01\xa4\x02\ +\xfa\xff\xd7\x01\xa4\x02\xfb\xff\xd7\x01\xa4\x02\xfc\xff\xd7\x01\ +\xa4\x02\xfd\xff\x9a\x01\xa4\x02\xfe\xff\xd7\x01\xa4\x03\x03\xff\ +\xae\x01\xa4\x03\x0d\xff\x9a\x01\xa4\x03\x0e\xff\xc3\x01\xa4\x03\ +\x0f\xff\x9a\x01\xa4\x03\x10\xff\xc3\x01\xa4\x03\x17\xff\x85\x01\ +\xa4\x03\x18\xff\xd7\x01\xa5\x00\x05\xff\xae\x01\xa5\x00\x0a\xff\ +\xae\x01\xa5\x01\x9d\xff\x85\x01\xa5\x01\xa6\xff\x85\x01\xa5\x01\ +\xa8\xff\xd7\x01\xa5\x01\xbc\xff\x9a\x01\xa5\x01\xbd\xff\xd7\x01\ +\xa5\x01\xc1\xff\x9a\x01\xa5\x01\xc4\xff\x85\x01\xa5\x01\xdc\xff\ +\xd7\x01\xa5\x01\xdd\xff\xd7\x01\xa5\x01\xe1\xff\xd7\x01\xa5\x01\ +\xe4\xff\xd7\x01\xa5\x01\xf6\xff\xd7\x01\xa5\x02\x07\xff\xae\x01\ +\xa5\x02\x0b\xff\xae\x01\xa5\x02n\xff\xae\x01\xa5\x02|\xff\ +\x9a\x01\xa5\x02\x80\xff\xae\x01\xa5\x02\x82\xff\xae\x01\xa5\x02\ +\x97\xff\xae\x01\xa5\x02\x9b\xff\xae\x01\xa5\x02\xa7\xff\xae\x01\ +\xa5\x02\xa9\xff\x85\x01\xa5\x02\xaa\xff\xd7\x01\xa5\x02\xb5\xff\ +\x9a\x01\xa5\x02\xb6\xff\xd7\x01\xa5\x02\xb7\xff\x9a\x01\xa5\x02\ +\xb8\xff\xd7\x01\xa5\x02\xb9\xff\x9a\x01\xa5\x02\xba\xff\xd7\x01\ +\xa5\x02\xbd\xff\x85\x01\xa5\x02\xbe\xff\xd7\x01\xa5\x02\xbf\xff\ +\x9a\x01\xa5\x02\xc0\xff\xd7\x01\xa5\x02\xc1\xff\x9a\x01\xa5\x02\ +\xc2\xff\xd7\x01\xa5\x02\xd4\xff\x9a\x01\xa5\x02\xd5\xff\xd7\x01\ +\xa5\x02\xf7\xff\xd7\x01\xa5\x02\xf8\xff\xd7\x01\xa5\x02\xf9\xff\ +\xd7\x01\xa5\x02\xfa\xff\xd7\x01\xa5\x02\xfb\xff\xd7\x01\xa5\x02\ +\xfc\xff\xd7\x01\xa5\x02\xfd\xff\x9a\x01\xa5\x02\xfe\xff\xd7\x01\ +\xa5\x03\x03\xff\xae\x01\xa5\x03\x0d\xff\x9a\x01\xa5\x03\x0e\xff\ +\xc3\x01\xa5\x03\x0f\xff\x9a\x01\xa5\x03\x10\xff\xc3\x01\xa5\x03\ +\x17\xff\x85\x01\xa5\x03\x18\xff\xd7\x01\xa6\x00\x05\xff\xae\x01\ +\xa6\x00\x0a\xff\xae\x01\xa6\x01\x9d\xff\x85\x01\xa6\x01\xa6\xff\ +\x85\x01\xa6\x01\xa8\xff\xd7\x01\xa6\x01\xbc\xff\x9a\x01\xa6\x01\ +\xbd\xff\xd7\x01\xa6\x01\xc1\xff\x9a\x01\xa6\x01\xc4\xff\x85\x01\ +\xa6\x01\xdc\xff\xd7\x01\xa6\x01\xdd\xff\xd7\x01\xa6\x01\xe1\xff\ +\xd7\x01\xa6\x01\xe4\xff\xd7\x01\xa6\x01\xf6\xff\xd7\x01\xa6\x02\ +\x07\xff\xae\x01\xa6\x02\x0b\xff\xae\x01\xa6\x02n\xff\xae\x01\ +\xa6\x02|\xff\x9a\x01\xa6\x02\x80\xff\xae\x01\xa6\x02\x82\xff\ +\xae\x01\xa6\x02\x97\xff\xae\x01\xa6\x02\x9b\xff\xae\x01\xa6\x02\ +\xa7\xff\xae\x01\xa6\x02\xa9\xff\x85\x01\xa6\x02\xaa\xff\xd7\x01\ +\xa6\x02\xb5\xff\x9a\x01\xa6\x02\xb6\xff\xd7\x01\xa6\x02\xb7\xff\ +\x9a\x01\xa6\x02\xb8\xff\xd7\x01\xa6\x02\xb9\xff\x9a\x01\xa6\x02\ +\xba\xff\xd7\x01\xa6\x02\xbd\xff\x85\x01\xa6\x02\xbe\xff\xd7\x01\ +\xa6\x02\xbf\xff\x9a\x01\xa6\x02\xc0\xff\xd7\x01\xa6\x02\xc1\xff\ +\x9a\x01\xa6\x02\xc2\xff\xd7\x01\xa6\x02\xd4\xff\x9a\x01\xa6\x02\ +\xd5\xff\xd7\x01\xa6\x02\xf7\xff\xd7\x01\xa6\x02\xf8\xff\xd7\x01\ +\xa6\x02\xf9\xff\xd7\x01\xa6\x02\xfa\xff\xd7\x01\xa6\x02\xfb\xff\ +\xd7\x01\xa6\x02\xfc\xff\xd7\x01\xa6\x02\xfd\xff\x9a\x01\xa6\x02\ +\xfe\xff\xd7\x01\xa6\x03\x03\xff\xae\x01\xa6\x03\x0d\xff\x9a\x01\ +\xa6\x03\x0e\xff\xc3\x01\xa6\x03\x0f\xff\x9a\x01\xa6\x03\x10\xff\ +\xc3\x01\xa6\x03\x17\xff\x85\x01\xa6\x03\x18\xff\xd7\x01\xa7\x01\ +\x9f\xff\xd7\x01\xa7\x01\xb8\xff\xd7\x01\xa7\x01\xbb\xff\xd7\x01\ +\xa7\x01\xbe\xff\xd7\x01\xa7\x01\xc1\xff\xd7\x01\xa7\x01\xe1\xff\ +\xd7\x01\xa7\x02l\xff\xd7\x01\xa7\x02|\xff\xd7\x01\xa7\x02\ +~\xff\xd7\x01\xa7\x02\x84\xff\xd7\x01\xa7\x02\x86\xff\xd7\x01\ +\xa7\x02\x88\xff\xd7\x01\xa7\x02\x8a\xff\xd7\x01\xa7\x02\x8c\xff\ +\xd7\x01\xa7\x02\xb1\xff\xd7\x01\xa7\x02\xb3\xff\xd7\x01\xa7\x02\ +\xbf\xff\xd7\x01\xa7\x02\xc0\xff\xd7\x01\xa7\x02\xc1\xff\xd7\x01\ +\xa7\x02\xc2\xff\xd7\x01\xa7\x02\xc5\xff\x9a\x01\xa7\x02\xc7\xff\ +\x9a\x01\xa7\x02\xd4\xff\xd7\x01\xa7\x02\xd5\xff\xd7\x01\xa7\x02\ +\xef\xff\xd7\x01\xa7\x02\xf1\xff\xd7\x01\xa7\x02\xf3\xff\xd7\x01\ +\xa7\x02\xfd\xff\xd7\x01\xa7\x02\xfe\xff\xd7\x01\xa7\x03\x09\xff\ +\xd7\x01\xa7\x03\x0b\xff\xd7\x01\xa7\x03\x0e\xff\xd7\x01\xa7\x03\ +\x10\xff\xd7\x01\xa7\x03\x15\xff\xd7\x01\xa7\x03\x19\xff\xec\x01\ +\xa8\x00\x0f\xff\x85\x01\xa8\x00\x11\xff\x85\x01\xa8\x01\x9f\xff\ +\xec\x01\xa8\x01\xa4\xff\x9a\x01\xa8\x01\xaa\xffq\x01\xa8\x01\ +\xae\xff\x9a\x01\xa8\x01\xb5\xff\x9a\x01\xa8\x01\xb8\xff\xec\x01\ +\xa8\x01\xbb\xff\xec\x01\xa8\x01\xbe\xff\xc3\x01\xa8\x01\xc9\xff\ +\xec\x01\xa8\x01\xce\xff\xae\x01\xa8\x01\xcf\xff\xd7\x01\xa8\x01\ +\xd5\xff\xae\x01\xa8\x01\xd8\xff\xd7\x01\xa8\x01\xdb\xff\xd7\x01\ +\xa8\x01\xde\xff\xd7\x01\xa8\x01\xe1\xff\xd7\x01\xa8\x01\xea\xff\ +\xd7\x01\xa8\x01\xeb\x00f\x01\xa8\x01\xed\xff\xd7\x01\xa8\x01\ +\xee\xff\xec\x01\xa8\x01\xf2\xff\xae\x01\xa8\x01\xf4\x00f\x01\ +\xa8\x02\x08\xff\x85\x01\xa8\x02\x0c\xff\x85\x01\xa8\x02j\xff\ +\xd7\x01\xa8\x02l\xff\xec\x01\xa8\x02r\xffq\x01\xa8\x02\ +s\xff\xae\x01\xa8\x02~\xff\xec\x01\xa8\x02\x7f\xff\xd7\x01\ +\xa8\x02\x84\xff\xec\x01\xa8\x02\x85\xff\xd7\x01\xa8\x02\x86\xff\ +\xec\x01\xa8\x02\x87\xff\xd7\x01\xa8\x02\x88\xff\xec\x01\xa8\x02\ +\x89\xff\xd7\x01\xa8\x02\x8a\xff\xec\x01\xa8\x02\x8c\xff\xec\x01\ +\xa8\x02\x8d\xff\xd7\x01\xa8\x02\x98\x00f\x01\xa8\x02\xa8\x00\ +f\x01\xa8\x02\xb1\xff\xec\x01\xa8\x02\xb2\xff\xd7\x01\xa8\x02\ +\xb3\xff\xec\x01\xa8\x02\xb4\xff\xd7\x01\xa8\x02\xc0\xff\xd7\x01\ +\xa8\x02\xc2\xff\xd7\x01\xa8\x02\xc5\xff\xd7\x01\xa8\x02\xc6\xff\ +\xc3\x01\xa8\x02\xc7\xff\xd7\x01\xa8\x02\xc8\xff\xc3\x01\xa8\x02\ +\xce\xff\x9a\x01\xa8\x02\xcf\xff\xae\x01\xa8\x02\xd5\xff\xd7\x01\ +\xa8\x02\xd9\xffq\x01\xa8\x02\xdb\xffq\x01\xa8\x02\xdd\xff\ +q\x01\xa8\x02\xe0\xff\xd7\x01\xa8\x02\xef\xff\xec\x01\xa8\x02\ +\xf0\xff\xd7\x01\xa8\x02\xf1\xff\xec\x01\xa8\x02\xf2\xff\xd7\x01\ +\xa8\x02\xf3\xff\xec\x01\xa8\x02\xf4\xff\xd7\x01\xa8\x02\xfe\xff\ +\xd7\x01\xa8\x03\x09\xffq\x01\xa8\x03\x0a\xff\xd7\x01\xa8\x03\ +\x0b\xffq\x01\xa8\x03\x0c\xff\xd7\x01\xa8\x03\x11\xff\x9a\x01\ +\xa8\x03\x12\xff\xae\x01\xa8\x03\x15\xff\xec\x01\xa8\x03\x16\xff\ +\xd7\x01\xa8\x03\x1a\xff\xd7\x01\xa8\x03\x1b\xff\x9a\x01\xa8\x03\ +\x1c\xff\xae\x01\xaa\x00\x05\xffq\x01\xaa\x00\x0a\xffq\x01\ +\xaa\x01\x9d\xff\x9a\x01\xaa\x01\xa6\xff\x9a\x01\xaa\x01\xbc\xff\ +q\x01\xaa\x01\xbe\xff\xd7\x01\xaa\x01\xc1\xff\x9a\x01\xaa\x01\ +\xc4\xff\x9a\x01\xaa\x01\xdc\xff\xd7\x01\xaa\x01\xe1\xff\xd7\x01\ +\xaa\x01\xe4\xff\xd7\x01\xaa\x02\x07\xffq\x01\xaa\x02\x0b\xff\ +q\x01\xaa\x02n\xff\xd7\x01\xaa\x02|\xff\x9a\x01\xaa\x02\ +\x80\xff\xae\x01\xaa\x02\x82\xff\xae\x01\xaa\x02\x97\xff\xd7\x01\ +\xaa\x02\x9b\xff\xd7\x01\xaa\x02\xa7\xff\xd7\x01\xaa\x02\xa9\xff\ +\x9a\x01\xaa\x02\xaa\xff\xd7\x01\xaa\x02\xb5\xffq\x01\xaa\x02\ +\xb6\xff\xd7\x01\xaa\x02\xb7\xff\x85\x01\xaa\x02\xb9\xff\x85\x01\ +\xaa\x02\xbd\xff\x9a\x01\xaa\x02\xbe\xff\xd7\x01\xaa\x02\xbf\xff\ +\x9a\x01\xaa\x02\xc0\xff\xd7\x01\xaa\x02\xc1\xff\x9a\x01\xaa\x02\ +\xc2\xff\xd7\x01\xaa\x02\xc5\xff\x9a\x01\xaa\x02\xc7\xff\x9a\x01\ +\xaa\x02\xd4\xff\x9a\x01\xaa\x02\xd5\xff\xd7\x01\xaa\x02\xe1\xff\ +\xd7\x01\xaa\x02\xe3\xff\xd7\x01\xaa\x02\xfd\xff\x9a\x01\xaa\x02\ +\xfe\xff\xd7\x01\xaa\x03\x03\xff\xd7\x01\xaa\x03\x0d\xffq\x01\ +\xaa\x03\x0e\xff\xd7\x01\xaa\x03\x0f\xffq\x01\xaa\x03\x10\xff\ +\xd7\x01\xaa\x03\x17\xff\x9a\x01\xaa\x03\x18\xff\xd7\x01\xab\x00\ +\x05\xff\xd7\x01\xab\x00\x0a\xff\xd7\x01\xab\x01\xaa\xff\xec\x01\ +\xab\x01\xc1\xff\xd7\x01\xab\x02\x07\xff\xd7\x01\xab\x02\x0b\xff\ +\xd7\x01\xab\x02r\xff\xec\x01\xab\x02|\xff\xd7\x01\xab\x02\ +\xbf\xff\xd7\x01\xab\x02\xc1\xff\xd7\x01\xab\x02\xc5\xff\xd7\x01\ +\xab\x02\xc7\xff\xd7\x01\xab\x02\xd4\xff\xd7\x01\xab\x02\xd9\xff\ +\xec\x01\xab\x02\xdb\xff\xec\x01\xab\x02\xdd\xff\xec\x01\xab\x02\ +\xfd\xff\xd7\x01\xac\x00\x0f\xff\xae\x01\xac\x00\x11\xff\xae\x01\ +\xac\x02\x08\xff\xae\x01\xac\x02\x0c\xff\xae\x01\xac\x02\x80\xff\ +\xec\x01\xac\x02\x82\xff\xec\x01\xac\x02\xb7\xff\xec\x01\xac\x02\ +\xb9\xff\xec\x01\xac\x03\x0d\xff\xd7\x01\xac\x03\x0f\xff\xd7\x01\ +\xad\x00\x0f\xff\x85\x01\xad\x00\x10\xff\xae\x01\xad\x00\x11\xff\ +\x85\x01\xad\x01\x9f\xff\xd7\x01\xad\x01\xa4\xff\x9a\x01\xad\x01\ +\xaa\xffq\x01\xad\x01\xae\xff\x9a\x01\xad\x01\xb5\xff\x9a\x01\ +\xad\x01\xb8\xff\xd7\x01\xad\x01\xbb\xff\xd7\x01\xad\x01\xbc\x00\ +)\x01\xad\x01\xbe\xff\xae\x01\xad\x01\xcc\xff\x9a\x01\xad\x01\ +\xcd\xff\x9a\x01\xad\x01\xce\xff\x85\x01\xad\x01\xcf\xffq\x01\ +\xad\x01\xd0\xff\xd7\x01\xad\x01\xd1\xff\xd7\x01\xad\x01\xd2\xff\ +\x9a\x01\xad\x01\xd3\xff\x9a\x01\xad\x01\xd4\xff\x9a\x01\xad\x01\ +\xd5\xff\x85\x01\xad\x01\xd6\xff\x9a\x01\xad\x01\xd7\xff\x9a\x01\ +\xad\x01\xd8\xffq\x01\xad\x01\xd9\xff\x9a\x01\xad\x01\xda\xff\ +\x9a\x01\xad\x01\xdb\xffq\x01\xad\x01\xdc\xff\xae\x01\xad\x01\ +\xdd\xff\xae\x01\xad\x01\xde\xffq\x01\xad\x01\xdf\xff\xd7\x01\ +\xad\x01\xe0\xff\x9a\x01\xad\x01\xe1\xff\x9a\x01\xad\x01\xe2\xff\ +\x9a\x01\xad\x01\xe3\xff\x9a\x01\xad\x01\xe4\xff\xae\x01\xad\x01\ +\xe5\xff\x9a\x01\xad\x01\xe6\xff\x9a\x01\xad\x01\xe7\xff\xd7\x01\ +\xad\x01\xe8\xff\x9a\x01\xad\x01\xe9\xff\xc3\x01\xad\x01\xea\xff\ +q\x01\xad\x01\xec\xff\x9a\x01\xad\x01\xed\xffq\x01\xad\x01\ +\xee\xff\x85\x01\xad\x01\xf2\xff\x85\x01\xad\x01\xf3\xff\x9a\x01\ +\xad\x01\xf5\xff\x9a\x01\xad\x01\xf6\xff\xae\x01\xad\x01\xf7\xff\ +\x9a\x01\xad\x01\xf9\xff\x9a\x01\xad\x02\x02\xff\xae\x01\xad\x02\ +\x03\xff\xae\x01\xad\x02\x04\xff\xae\x01\xad\x02\x08\xff\x85\x01\ +\xad\x02\x0c\xff\x85\x01\xad\x02j\xffq\x01\xad\x02k\xff\ +\x9a\x01\xad\x02l\xff\xd7\x01\xad\x02m\xff\xd7\x01\xad\x02\ +q\xff\x9a\x01\xad\x02r\xffq\x01\xad\x02s\xff\x85\x01\ +\xad\x02u\xff\x9a\x01\xad\x02w\xff\x9a\x01\xad\x02y\xff\ +\x9a\x01\xad\x02}\xff\x9a\x01\xad\x02~\xff\xd7\x01\xad\x02\ +\x7f\xffq\x01\xad\x02\x81\xff\xd7\x01\xad\x02\x83\xff\xd7\x01\ +\xad\x02\x84\xff\xd7\x01\xad\x02\x85\xffq\x01\xad\x02\x86\xff\ +\xd7\x01\xad\x02\x87\xffq\x01\xad\x02\x88\xff\xd7\x01\xad\x02\ +\x89\xffq\x01\xad\x02\x8a\xff\xd7\x01\xad\x02\x8b\xff\xd7\x01\ +\xad\x02\x8c\xff\xd7\x01\xad\x02\x8d\xffq\x01\xad\x02\x96\xff\ +\x9a\x01\xad\x02\x9a\xff\x9a\x01\xad\x02\x9e\xff\x9a\x01\xad\x02\ +\xa0\xff\xd7\x01\xad\x02\xa2\xff\xd7\x01\xad\x02\xa4\xff\x9a\x01\ +\xad\x02\xa6\xff\x9a\x01\xad\x02\xaa\xff\xae\x01\xad\x02\xac\xff\ +\x9a\x01\xad\x02\xae\xff\x9a\x01\xad\x02\xb0\xff\x9a\x01\xad\x02\ +\xb1\xff\xd7\x01\xad\x02\xb2\xffq\x01\xad\x02\xb3\xff\xd7\x01\ +\xad\x02\xb4\xffq\x01\xad\x02\xb5\x00)\x01\xad\x02\xb6\xff\ +\xae\x01\xad\x02\xb8\xff\xae\x01\xad\x02\xba\xff\xae\x01\xad\x02\ +\xbc\xff\xd7\x01\xad\x02\xbe\xff\xae\x01\xad\x02\xc0\xff\x9a\x01\ +\xad\x02\xc2\xff\x9a\x01\xad\x02\xc4\xff\x9a\x01\xad\x02\xc5\xff\ +\x9a\x01\xad\x02\xc6\xffq\x01\xad\x02\xc7\xff\x9a\x01\xad\x02\ +\xc8\xffq\x01\xad\x02\xcb\xff\xd7\x01\xad\x02\xcd\xff\x9a\x01\ +\xad\x02\xce\xff\x9a\x01\xad\x02\xcf\xff\x85\x01\xad\x02\xd1\xff\ +\x9a\x01\xad\x02\xd3\xff\x9a\x01\xad\x02\xd5\xff\x9a\x01\xad\x02\ +\xd7\xff\x9a\x01\xad\x02\xd9\xffq\x01\xad\x02\xdb\xffq\x01\ +\xad\x02\xdd\xffq\x01\xad\x02\xe0\xffq\x01\xad\x02\xe6\xff\ +\xd7\x01\xad\x02\xe8\xff\xd7\x01\xad\x02\xea\xff\xc3\x01\xad\x02\ +\xec\xff\x9a\x01\xad\x02\xee\xff\x9a\x01\xad\x02\xef\xff\xd7\x01\ +\xad\x02\xf0\xffq\x01\xad\x02\xf1\xff\xd7\x01\xad\x02\xf2\xff\ +q\x01\xad\x02\xf3\xff\xd7\x01\xad\x02\xf4\xffq\x01\xad\x02\ +\xf6\xff\xd7\x01\xad\x02\xf8\xff\xae\x01\xad\x02\xfa\xff\xae\x01\ +\xad\x02\xfc\xff\xae\x01\xad\x02\xfe\xff\x9a\x01\xad\x03\x00\xff\ +\x9a\x01\xad\x03\x02\xff\x9a\x01\xad\x03\x06\xff\xd7\x01\xad\x03\ +\x08\xff\xd7\x01\xad\x03\x09\xffq\x01\xad\x03\x0a\xffq\x01\ +\xad\x03\x0b\xffq\x01\xad\x03\x0c\xffq\x01\xad\x03\x0e\xff\ +\x9a\x01\xad\x03\x10\xff\x9a\x01\xad\x03\x11\xff\x9a\x01\xad\x03\ +\x12\xff\x85\x01\xad\x03\x14\xff\x9a\x01\xad\x03\x15\xff\xd7\x01\ +\xad\x03\x16\xffq\x01\xad\x03\x18\xff\xae\x01\xad\x03\x1a\xff\ +q\x01\xad\x03\x1b\xff\x9a\x01\xad\x03\x1c\xff\x85\x01\xae\x01\ +\xa3\x00\xe1\x01\xae\x02\xea\x00)\x01\xae\x03\x0e\xff\xd7\x01\ +\xae\x03\x10\xff\xd7\x01\xb0\x01\x9f\xff\xd7\x01\xb0\x01\xb8\xff\ +\xd7\x01\xb0\x01\xbb\xff\xd7\x01\xb0\x01\xbe\xff\xd7\x01\xb0\x01\ +\xc1\xff\xd7\x01\xb0\x01\xe1\xff\xd7\x01\xb0\x02l\xff\xd7\x01\ +\xb0\x02|\xff\xd7\x01\xb0\x02~\xff\xd7\x01\xb0\x02\x84\xff\ +\xd7\x01\xb0\x02\x86\xff\xd7\x01\xb0\x02\x88\xff\xd7\x01\xb0\x02\ +\x8a\xff\xd7\x01\xb0\x02\x8c\xff\xd7\x01\xb0\x02\xb1\xff\xd7\x01\ +\xb0\x02\xb3\xff\xd7\x01\xb0\x02\xbf\xff\xd7\x01\xb0\x02\xc0\xff\ +\xd7\x01\xb0\x02\xc1\xff\xd7\x01\xb0\x02\xc2\xff\xd7\x01\xb0\x02\ +\xc5\xff\x9a\x01\xb0\x02\xc7\xff\x9a\x01\xb0\x02\xd4\xff\xd7\x01\ +\xb0\x02\xd5\xff\xd7\x01\xb0\x02\xef\xff\xd7\x01\xb0\x02\xf1\xff\ +\xd7\x01\xb0\x02\xf3\xff\xd7\x01\xb0\x02\xfd\xff\xd7\x01\xb0\x02\ +\xfe\xff\xd7\x01\xb0\x03\x09\xff\xd7\x01\xb0\x03\x0b\xff\xd7\x01\ +\xb0\x03\x0e\xff\xd7\x01\xb0\x03\x10\xff\xd7\x01\xb0\x03\x15\xff\ +\xd7\x01\xb0\x03\x19\xff\xec\x01\xb1\x00\x0f\xff\xae\x01\xb1\x00\ +\x11\xff\xae\x01\xb1\x02\x08\xff\xae\x01\xb1\x02\x0c\xff\xae\x01\ +\xb1\x02\x80\xff\xec\x01\xb1\x02\x82\xff\xec\x01\xb1\x02\xb7\xff\ +\xec\x01\xb1\x02\xb9\xff\xec\x01\xb1\x03\x0d\xff\xd7\x01\xb1\x03\ +\x0f\xff\xd7\x01\xb4\x01\x9f\xff\xd7\x01\xb4\x01\xb8\xff\xd7\x01\ +\xb4\x01\xbb\xff\xd7\x01\xb4\x01\xbe\xff\xd7\x01\xb4\x01\xc1\xff\ +\xd7\x01\xb4\x01\xe1\xff\xd7\x01\xb4\x02l\xff\xd7\x01\xb4\x02\ +|\xff\xd7\x01\xb4\x02~\xff\xd7\x01\xb4\x02\x84\xff\xd7\x01\ +\xb4\x02\x86\xff\xd7\x01\xb4\x02\x88\xff\xd7\x01\xb4\x02\x8a\xff\ +\xd7\x01\xb4\x02\x8c\xff\xd7\x01\xb4\x02\xb1\xff\xd7\x01\xb4\x02\ +\xb3\xff\xd7\x01\xb4\x02\xbf\xff\xd7\x01\xb4\x02\xc0\xff\xd7\x01\ +\xb4\x02\xc1\xff\xd7\x01\xb4\x02\xc2\xff\xd7\x01\xb4\x02\xc5\xff\ +\x9a\x01\xb4\x02\xc7\xff\x9a\x01\xb4\x02\xd4\xff\xd7\x01\xb4\x02\ +\xd5\xff\xd7\x01\xb4\x02\xef\xff\xd7\x01\xb4\x02\xf1\xff\xd7\x01\ +\xb4\x02\xf3\xff\xd7\x01\xb4\x02\xfd\xff\xd7\x01\xb4\x02\xfe\xff\ +\xd7\x01\xb4\x03\x09\xff\xd7\x01\xb4\x03\x0b\xff\xd7\x01\xb4\x03\ +\x0e\xff\xd7\x01\xb4\x03\x10\xff\xd7\x01\xb4\x03\x15\xff\xd7\x01\ +\xb4\x03\x19\xff\xec\x01\xb8\x00\x0f\xff\xae\x01\xb8\x00\x11\xff\ +\xae\x01\xb8\x01\x9d\xff\xec\x01\xb8\x01\xa4\xff\xd7\x01\xb8\x01\ +\xa6\xff\xec\x01\xb8\x01\xa8\xff\xd7\x01\xb8\x01\xaa\xff\xd7\x01\ +\xb8\x01\xae\xff\xd7\x01\xb8\x01\xb0\xff\xd7\x01\xb8\x01\xb1\xff\ +\xec\x01\xb8\x01\xb5\xff\xd7\x01\xb8\x01\xbc\xff\xc3\x01\xb8\x01\ +\xbd\xff\xd7\x01\xb8\x01\xbf\xff\xd7\x01\xb8\x01\xc1\xff\xd7\x01\ +\xb8\x01\xc4\xff\xec\x01\xb8\x01\xc7\xff\xec\x01\xb8\x01\xce\xff\ +\xec\x01\xb8\x01\xd5\xff\xec\x01\xb8\x01\xf2\xff\xec\x01\xb8\x02\ +\x08\xff\xae\x01\xb8\x02\x0c\xff\xae\x01\xb8\x02r\xff\xd7\x01\ +\xb8\x02s\xff\xec\x01\xb8\x02z\xff\xec\x01\xb8\x02|\xff\ +\xd7\x01\xb8\x02\x80\xff\xec\x01\xb8\x02\x82\xff\xec\x01\xb8\x02\ +\x9f\xff\xd7\x01\xb8\x02\xa1\xff\xec\x01\xb8\x02\xa9\xff\xec\x01\ +\xb8\x02\xb5\xff\xc3\x01\xb8\x02\xb7\xff\xec\x01\xb8\x02\xb9\xff\ +\xec\x01\xb8\x02\xbb\xff\xd7\x01\xb8\x02\xbd\xff\xec\x01\xb8\x02\ +\xbf\xff\xd7\x01\xb8\x02\xc1\xff\xd7\x01\xb8\x02\xca\xff\xd7\x01\ +\xb8\x02\xce\xff\xd7\x01\xb8\x02\xcf\xff\xec\x01\xb8\x02\xd4\xff\ +\xd7\x01\xb8\x02\xd9\xff\xd7\x01\xb8\x02\xdb\xff\xd7\x01\xb8\x02\ +\xdd\xff\xd7\x01\xb8\x02\xe5\xff\xd7\x01\xb8\x02\xe7\xff\xec\x01\ +\xb8\x02\xf5\xff\xec\x01\xb8\x02\xf7\xff\xd7\x01\xb8\x02\xf9\xff\ +\xd7\x01\xb8\x02\xfb\xff\xd7\x01\xb8\x02\xfd\xff\xd7\x01\xb8\x03\ +\x05\xff\xd7\x01\xb8\x03\x07\xff\xd7\x01\xb8\x03\x0d\xff\xd7\x01\ +\xb8\x03\x0f\xff\xd7\x01\xb8\x03\x11\xff\xd7\x01\xb8\x03\x12\xff\ +\xec\x01\xb8\x03\x17\xff\xec\x01\xb8\x03\x1b\xff\xd7\x01\xb8\x03\ +\x1c\xff\xec\x01\xba\x00\x0f\xfe\xf6\x01\xba\x00\x11\xfe\xf6\x01\ +\xba\x01\xa4\xff\x85\x01\xba\x01\xaa\xff\x9a\x01\xba\x01\xae\xff\ +\x85\x01\xba\x01\xb0\xff\xd7\x01\xba\x01\xb5\xff\x85\x01\xba\x01\ +\xbf\xff\xd7\x01\xba\x01\xce\xff\x9a\x01\xba\x01\xd5\xff\x9a\x01\ +\xba\x01\xf2\xff\x9a\x01\xba\x02\x08\xfe\xf6\x01\xba\x02\x0c\xfe\ +\xf6\x01\xba\x02r\xff\x9a\x01\xba\x02s\xff\x9a\x01\xba\x02\ +v\xff\xec\x01\xba\x02\x9f\xff\xd7\x01\xba\x02\xbb\xff\xd7\x01\ +\xba\x02\xca\xff\xd7\x01\xba\x02\xce\xff\x85\x01\xba\x02\xcf\xff\ +\x9a\x01\xba\x02\xd9\xff\x9a\x01\xba\x02\xdb\xff\x9a\x01\xba\x02\ +\xdd\xff\x9a\x01\xba\x02\xe5\xff\xd7\x01\xba\x03\x05\xff\xd7\x01\ +\xba\x03\x07\xff\xd7\x01\xba\x03\x09\xff\xae\x01\xba\x03\x0b\xff\ +\xae\x01\xba\x03\x11\xff\x85\x01\xba\x03\x12\xff\x9a\x01\xba\x03\ +\x1b\xff\x85\x01\xba\x03\x1c\xff\x9a\x01\xbb\x01\x9f\xff\xd7\x01\ +\xbb\x01\xb8\xff\xd7\x01\xbb\x01\xbb\xff\xd7\x01\xbb\x01\xbe\xff\ +\xd7\x01\xbb\x01\xe1\xff\xd7\x01\xbb\x02l\xff\xd7\x01\xbb\x02\ +~\xff\xd7\x01\xbb\x02\x84\xff\xd7\x01\xbb\x02\x86\xff\xd7\x01\ +\xbb\x02\x88\xff\xd7\x01\xbb\x02\x8a\xff\xd7\x01\xbb\x02\x8c\xff\ +\xd7\x01\xbb\x02\xb1\xff\xd7\x01\xbb\x02\xb3\xff\xd7\x01\xbb\x02\ +\xc0\xff\xd7\x01\xbb\x02\xc2\xff\xd7\x01\xbb\x02\xc5\xff\xd7\x01\ +\xbb\x02\xc7\xff\xd7\x01\xbb\x02\xd5\xff\xd7\x01\xbb\x02\xef\xff\ +\xd7\x01\xbb\x02\xf1\xff\xd7\x01\xbb\x02\xf3\xff\xd7\x01\xbb\x02\ +\xfe\xff\xd7\x01\xbb\x03\x09\xff\xd7\x01\xbb\x03\x0b\xff\xd7\x01\ +\xbb\x03\x0e\xff\xd7\x01\xbb\x03\x10\xff\xd7\x01\xbb\x03\x15\xff\ +\xd7\x01\xbc\x00\x0f\xff\x85\x01\xbc\x00\x10\xff\xae\x01\xbc\x00\ +\x11\xff\x85\x01\xbc\x01\x9f\xff\xd7\x01\xbc\x01\xa4\xff\x9a\x01\ +\xbc\x01\xaa\xffq\x01\xbc\x01\xae\xff\x9a\x01\xbc\x01\xb5\xff\ +\x9a\x01\xbc\x01\xb8\xff\xd7\x01\xbc\x01\xbb\xff\xd7\x01\xbc\x01\ +\xbc\x00)\x01\xbc\x01\xbe\xff\xae\x01\xbc\x01\xcc\xff\x9a\x01\ +\xbc\x01\xcd\xff\x9a\x01\xbc\x01\xce\xff\x85\x01\xbc\x01\xcf\xff\ +q\x01\xbc\x01\xd0\xff\xd7\x01\xbc\x01\xd1\xff\xd7\x01\xbc\x01\ +\xd2\xff\x9a\x01\xbc\x01\xd3\xff\x9a\x01\xbc\x01\xd4\xff\x9a\x01\ +\xbc\x01\xd5\xff\x85\x01\xbc\x01\xd6\xff\x9a\x01\xbc\x01\xd7\xff\ +\x9a\x01\xbc\x01\xd8\xffq\x01\xbc\x01\xd9\xff\x9a\x01\xbc\x01\ +\xda\xff\x9a\x01\xbc\x01\xdb\xffq\x01\xbc\x01\xdc\xff\xae\x01\ +\xbc\x01\xdd\xff\xae\x01\xbc\x01\xde\xffq\x01\xbc\x01\xdf\xff\ +\xd7\x01\xbc\x01\xe0\xff\x9a\x01\xbc\x01\xe1\xff\x9a\x01\xbc\x01\ +\xe2\xff\x9a\x01\xbc\x01\xe3\xff\x9a\x01\xbc\x01\xe4\xff\xae\x01\ +\xbc\x01\xe5\xff\x9a\x01\xbc\x01\xe6\xff\x9a\x01\xbc\x01\xe7\xff\ +\xd7\x01\xbc\x01\xe8\xff\x9a\x01\xbc\x01\xe9\xff\xc3\x01\xbc\x01\ +\xea\xffq\x01\xbc\x01\xec\xff\x9a\x01\xbc\x01\xed\xffq\x01\ +\xbc\x01\xee\xff\x85\x01\xbc\x01\xf2\xff\x85\x01\xbc\x01\xf3\xff\ +\x9a\x01\xbc\x01\xf5\xff\x9a\x01\xbc\x01\xf6\xff\xae\x01\xbc\x01\ +\xf7\xff\x9a\x01\xbc\x01\xf9\xff\x9a\x01\xbc\x02\x02\xff\xae\x01\ +\xbc\x02\x03\xff\xae\x01\xbc\x02\x04\xff\xae\x01\xbc\x02\x08\xff\ +\x85\x01\xbc\x02\x0c\xff\x85\x01\xbc\x02j\xffq\x01\xbc\x02\ +k\xff\x9a\x01\xbc\x02l\xff\xd7\x01\xbc\x02m\xff\xd7\x01\ +\xbc\x02q\xff\x9a\x01\xbc\x02r\xffq\x01\xbc\x02s\xff\ +\x85\x01\xbc\x02u\xff\x9a\x01\xbc\x02w\xff\x9a\x01\xbc\x02\ +y\xff\x9a\x01\xbc\x02}\xff\x9a\x01\xbc\x02~\xff\xd7\x01\ +\xbc\x02\x7f\xffq\x01\xbc\x02\x81\xff\xd7\x01\xbc\x02\x83\xff\ +\xd7\x01\xbc\x02\x84\xff\xd7\x01\xbc\x02\x85\xffq\x01\xbc\x02\ +\x86\xff\xd7\x01\xbc\x02\x87\xffq\x01\xbc\x02\x88\xff\xd7\x01\ +\xbc\x02\x89\xffq\x01\xbc\x02\x8a\xff\xd7\x01\xbc\x02\x8b\xff\ +\xd7\x01\xbc\x02\x8c\xff\xd7\x01\xbc\x02\x8d\xffq\x01\xbc\x02\ +\x96\xff\x9a\x01\xbc\x02\x9a\xff\x9a\x01\xbc\x02\x9e\xff\x9a\x01\ +\xbc\x02\xa0\xff\xd7\x01\xbc\x02\xa2\xff\xd7\x01\xbc\x02\xa4\xff\ +\x9a\x01\xbc\x02\xa6\xff\x9a\x01\xbc\x02\xaa\xff\xae\x01\xbc\x02\ +\xac\xff\x9a\x01\xbc\x02\xae\xff\x9a\x01\xbc\x02\xb0\xff\x9a\x01\ +\xbc\x02\xb1\xff\xd7\x01\xbc\x02\xb2\xffq\x01\xbc\x02\xb3\xff\ +\xd7\x01\xbc\x02\xb4\xffq\x01\xbc\x02\xb5\x00)\x01\xbc\x02\ +\xb6\xff\xae\x01\xbc\x02\xb8\xff\xae\x01\xbc\x02\xba\xff\xae\x01\ +\xbc\x02\xbc\xff\xd7\x01\xbc\x02\xbe\xff\xae\x01\xbc\x02\xc0\xff\ +\x9a\x01\xbc\x02\xc2\xff\x9a\x01\xbc\x02\xc4\xff\x9a\x01\xbc\x02\ +\xc5\xff\x9a\x01\xbc\x02\xc6\xffq\x01\xbc\x02\xc7\xff\x9a\x01\ +\xbc\x02\xc8\xffq\x01\xbc\x02\xcb\xff\xd7\x01\xbc\x02\xcd\xff\ +\x9a\x01\xbc\x02\xce\xff\x9a\x01\xbc\x02\xcf\xff\x85\x01\xbc\x02\ +\xd1\xff\x9a\x01\xbc\x02\xd3\xff\x9a\x01\xbc\x02\xd5\xff\x9a\x01\ +\xbc\x02\xd7\xff\x9a\x01\xbc\x02\xd9\xffq\x01\xbc\x02\xdb\xff\ +q\x01\xbc\x02\xdd\xffq\x01\xbc\x02\xe0\xffq\x01\xbc\x02\ +\xe6\xff\xd7\x01\xbc\x02\xe8\xff\xd7\x01\xbc\x02\xea\xff\xc3\x01\ +\xbc\x02\xec\xff\x9a\x01\xbc\x02\xee\xff\x9a\x01\xbc\x02\xef\xff\ +\xd7\x01\xbc\x02\xf0\xffq\x01\xbc\x02\xf1\xff\xd7\x01\xbc\x02\ +\xf2\xffq\x01\xbc\x02\xf3\xff\xd7\x01\xbc\x02\xf4\xffq\x01\ +\xbc\x02\xf6\xff\xd7\x01\xbc\x02\xf8\xff\xae\x01\xbc\x02\xfa\xff\ +\xae\x01\xbc\x02\xfc\xff\xae\x01\xbc\x02\xfe\xff\x9a\x01\xbc\x03\ +\x00\xff\x9a\x01\xbc\x03\x02\xff\x9a\x01\xbc\x03\x06\xff\xd7\x01\ +\xbc\x03\x08\xff\xd7\x01\xbc\x03\x09\xffq\x01\xbc\x03\x0a\xff\ +q\x01\xbc\x03\x0b\xffq\x01\xbc\x03\x0c\xffq\x01\xbc\x03\ +\x0e\xff\x9a\x01\xbc\x03\x10\xff\x9a\x01\xbc\x03\x11\xff\x9a\x01\ +\xbc\x03\x12\xff\x85\x01\xbc\x03\x14\xff\x9a\x01\xbc\x03\x15\xff\ +\xd7\x01\xbc\x03\x16\xffq\x01\xbc\x03\x18\xff\xae\x01\xbc\x03\ +\x1a\xffq\x01\xbc\x03\x1b\xff\x9a\x01\xbc\x03\x1c\xff\x85\x01\ +\xbd\x00\x0f\xff\x85\x01\xbd\x00\x11\xff\x85\x01\xbd\x01\x9f\xff\ +\xec\x01\xbd\x01\xa4\xff\x9a\x01\xbd\x01\xaa\xffq\x01\xbd\x01\ +\xae\xff\x9a\x01\xbd\x01\xb5\xff\x9a\x01\xbd\x01\xb8\xff\xec\x01\ +\xbd\x01\xbb\xff\xec\x01\xbd\x01\xbe\xff\xc3\x01\xbd\x01\xc9\xff\ +\xec\x01\xbd\x01\xce\xff\xae\x01\xbd\x01\xcf\xff\xd7\x01\xbd\x01\ +\xd5\xff\xae\x01\xbd\x01\xd8\xff\xd7\x01\xbd\x01\xdb\xff\xd7\x01\ +\xbd\x01\xde\xff\xd7\x01\xbd\x01\xe1\xff\xd7\x01\xbd\x01\xea\xff\ +\xd7\x01\xbd\x01\xeb\x00f\x01\xbd\x01\xed\xff\xd7\x01\xbd\x01\ +\xee\xff\xec\x01\xbd\x01\xf2\xff\xae\x01\xbd\x01\xf4\x00f\x01\ +\xbd\x02\x08\xff\x85\x01\xbd\x02\x0c\xff\x85\x01\xbd\x02j\xff\ +\xd7\x01\xbd\x02l\xff\xec\x01\xbd\x02r\xffq\x01\xbd\x02\ +s\xff\xae\x01\xbd\x02~\xff\xec\x01\xbd\x02\x7f\xff\xd7\x01\ +\xbd\x02\x84\xff\xec\x01\xbd\x02\x85\xff\xd7\x01\xbd\x02\x86\xff\ +\xec\x01\xbd\x02\x87\xff\xd7\x01\xbd\x02\x88\xff\xec\x01\xbd\x02\ +\x89\xff\xd7\x01\xbd\x02\x8a\xff\xec\x01\xbd\x02\x8c\xff\xec\x01\ +\xbd\x02\x8d\xff\xd7\x01\xbd\x02\x98\x00f\x01\xbd\x02\xa8\x00\ +f\x01\xbd\x02\xb1\xff\xec\x01\xbd\x02\xb2\xff\xd7\x01\xbd\x02\ +\xb3\xff\xec\x01\xbd\x02\xb4\xff\xd7\x01\xbd\x02\xc0\xff\xd7\x01\ +\xbd\x02\xc2\xff\xd7\x01\xbd\x02\xc5\xff\xd7\x01\xbd\x02\xc6\xff\ +\xc3\x01\xbd\x02\xc7\xff\xd7\x01\xbd\x02\xc8\xff\xc3\x01\xbd\x02\ +\xce\xff\x9a\x01\xbd\x02\xcf\xff\xae\x01\xbd\x02\xd5\xff\xd7\x01\ +\xbd\x02\xd9\xffq\x01\xbd\x02\xdb\xffq\x01\xbd\x02\xdd\xff\ +q\x01\xbd\x02\xe0\xff\xd7\x01\xbd\x02\xef\xff\xec\x01\xbd\x02\ +\xf0\xff\xd7\x01\xbd\x02\xf1\xff\xec\x01\xbd\x02\xf2\xff\xd7\x01\ +\xbd\x02\xf3\xff\xec\x01\xbd\x02\xf4\xff\xd7\x01\xbd\x02\xfe\xff\ +\xd7\x01\xbd\x03\x09\xffq\x01\xbd\x03\x0a\xff\xd7\x01\xbd\x03\ +\x0b\xffq\x01\xbd\x03\x0c\xff\xd7\x01\xbd\x03\x11\xff\x9a\x01\ +\xbd\x03\x12\xff\xae\x01\xbd\x03\x15\xff\xec\x01\xbd\x03\x16\xff\ +\xd7\x01\xbd\x03\x1a\xff\xd7\x01\xbd\x03\x1b\xff\x9a\x01\xbd\x03\ +\x1c\xff\xae\x01\xbe\x00\x0f\xff\xae\x01\xbe\x00\x11\xff\xae\x01\ +\xbe\x01\x9d\xff\xd7\x01\xbe\x01\xa4\xff\xd7\x01\xbe\x01\xa6\xff\ +\xd7\x01\xbe\x01\xa8\xff\xc3\x01\xbe\x01\xaa\xff\xd7\x01\xbe\x01\ +\xae\xff\xd7\x01\xbe\x01\xb0\xff\xd7\x01\xbe\x01\xb1\xff\xd7\x01\ +\xbe\x01\xb5\xff\xd7\x01\xbe\x01\xbc\xff\xc3\x01\xbe\x01\xbd\xff\ +\xc3\x01\xbe\x01\xbf\xff\xd7\x01\xbe\x01\xc4\xff\xd7\x01\xbe\x01\ +\xc7\xff\xd7\x01\xbe\x01\xce\xff\xec\x01\xbe\x01\xd5\xff\xec\x01\ +\xbe\x01\xf2\xff\xec\x01\xbe\x02\x08\xff\xae\x01\xbe\x02\x0c\xff\ +\xae\x01\xbe\x02r\xff\xd7\x01\xbe\x02s\xff\xec\x01\xbe\x02\ +z\xff\xd7\x01\xbe\x02\x80\xff\xec\x01\xbe\x02\x82\xff\xec\x01\ +\xbe\x02\x9f\xff\xd7\x01\xbe\x02\xa1\xff\xd7\x01\xbe\x02\xa9\xff\ +\xd7\x01\xbe\x02\xb5\xff\xc3\x01\xbe\x02\xb7\xff\xc3\x01\xbe\x02\ +\xb9\xff\xc3\x01\xbe\x02\xbb\xff\xd7\x01\xbe\x02\xbd\xff\xd7\x01\ +\xbe\x02\xca\xff\xd7\x01\xbe\x02\xce\xff\xd7\x01\xbe\x02\xcf\xff\ +\xec\x01\xbe\x02\xd9\xff\xd7\x01\xbe\x02\xdb\xff\xd7\x01\xbe\x02\ +\xdd\xff\xd7\x01\xbe\x02\xe5\xff\xd7\x01\xbe\x02\xe7\xff\xd7\x01\ +\xbe\x02\xf5\xff\xd7\x01\xbe\x02\xf7\xff\xc3\x01\xbe\x02\xf9\xff\ +\xc3\x01\xbe\x02\xfb\xff\xc3\x01\xbe\x03\x05\xff\xd7\x01\xbe\x03\ +\x07\xff\xd7\x01\xbe\x03\x0d\xff\xd7\x01\xbe\x03\x0f\xff\xd7\x01\ +\xbe\x03\x11\xff\xd7\x01\xbe\x03\x12\xff\xec\x01\xbe\x03\x17\xff\ +\xd7\x01\xbe\x03\x1b\xff\xd7\x01\xbe\x03\x1c\xff\xec\x01\xbf\x01\ +\x9f\xff\xd7\x01\xbf\x01\xb8\xff\xd7\x01\xbf\x01\xbb\xff\xd7\x01\ +\xbf\x01\xbe\xff\xd7\x01\xbf\x01\xc1\xff\xd7\x01\xbf\x01\xe1\xff\ +\xd7\x01\xbf\x02l\xff\xd7\x01\xbf\x02|\xff\xd7\x01\xbf\x02\ +~\xff\xd7\x01\xbf\x02\x84\xff\xd7\x01\xbf\x02\x86\xff\xd7\x01\ +\xbf\x02\x88\xff\xd7\x01\xbf\x02\x8a\xff\xd7\x01\xbf\x02\x8c\xff\ +\xd7\x01\xbf\x02\xb1\xff\xd7\x01\xbf\x02\xb3\xff\xd7\x01\xbf\x02\ +\xbf\xff\xd7\x01\xbf\x02\xc0\xff\xd7\x01\xbf\x02\xc1\xff\xd7\x01\ +\xbf\x02\xc2\xff\xd7\x01\xbf\x02\xc5\xff\x9a\x01\xbf\x02\xc7\xff\ +\x9a\x01\xbf\x02\xd4\xff\xd7\x01\xbf\x02\xd5\xff\xd7\x01\xbf\x02\ +\xef\xff\xd7\x01\xbf\x02\xf1\xff\xd7\x01\xbf\x02\xf3\xff\xd7\x01\ +\xbf\x02\xfd\xff\xd7\x01\xbf\x02\xfe\xff\xd7\x01\xbf\x03\x09\xff\ +\xd7\x01\xbf\x03\x0b\xff\xd7\x01\xbf\x03\x0e\xff\xd7\x01\xbf\x03\ +\x10\xff\xd7\x01\xbf\x03\x15\xff\xd7\x01\xbf\x03\x19\xff\xec\x01\ +\xc0\x01\xa3\x00\xe1\x01\xc0\x02\xea\x00)\x01\xc0\x03\x0e\xff\ +\xd7\x01\xc0\x03\x10\xff\xd7\x01\xc3\x01\xa3\x00\xe1\x01\xc3\x02\ +\xea\x00)\x01\xc3\x03\x0e\xff\xd7\x01\xc3\x03\x10\xff\xd7\x01\ +\xc4\x00\x05\xff\xae\x01\xc4\x00\x0a\xff\xae\x01\xc4\x01\x9d\xff\ +\x85\x01\xc4\x01\xa6\xff\x85\x01\xc4\x01\xa8\xff\xd7\x01\xc4\x01\ +\xbc\xff\x9a\x01\xc4\x01\xbd\xff\xd7\x01\xc4\x01\xc1\xff\x9a\x01\ +\xc4\x01\xc4\xff\x85\x01\xc4\x01\xdc\xff\xd7\x01\xc4\x01\xdd\xff\ +\xd7\x01\xc4\x01\xe1\xff\xd7\x01\xc4\x01\xe4\xff\xd7\x01\xc4\x01\ +\xf6\xff\xd7\x01\xc4\x02\x07\xff\xae\x01\xc4\x02\x0b\xff\xae\x01\ +\xc4\x02n\xff\xae\x01\xc4\x02|\xff\x9a\x01\xc4\x02\x80\xff\ +\xae\x01\xc4\x02\x82\xff\xae\x01\xc4\x02\x97\xff\xae\x01\xc4\x02\ +\x9b\xff\xae\x01\xc4\x02\xa7\xff\xae\x01\xc4\x02\xa9\xff\x85\x01\ +\xc4\x02\xaa\xff\xd7\x01\xc4\x02\xb5\xff\x9a\x01\xc4\x02\xb6\xff\ +\xd7\x01\xc4\x02\xb7\xff\x9a\x01\xc4\x02\xb8\xff\xd7\x01\xc4\x02\ +\xb9\xff\x9a\x01\xc4\x02\xba\xff\xd7\x01\xc4\x02\xbd\xff\x85\x01\ +\xc4\x02\xbe\xff\xd7\x01\xc4\x02\xbf\xff\x9a\x01\xc4\x02\xc0\xff\ +\xd7\x01\xc4\x02\xc1\xff\x9a\x01\xc4\x02\xc2\xff\xd7\x01\xc4\x02\ +\xd4\xff\x9a\x01\xc4\x02\xd5\xff\xd7\x01\xc4\x02\xf7\xff\xd7\x01\ +\xc4\x02\xf8\xff\xd7\x01\xc4\x02\xf9\xff\xd7\x01\xc4\x02\xfa\xff\ +\xd7\x01\xc4\x02\xfb\xff\xd7\x01\xc4\x02\xfc\xff\xd7\x01\xc4\x02\ +\xfd\xff\x9a\x01\xc4\x02\xfe\xff\xd7\x01\xc4\x03\x03\xff\xae\x01\ +\xc4\x03\x0d\xff\x9a\x01\xc4\x03\x0e\xff\xc3\x01\xc4\x03\x0f\xff\ +\x9a\x01\xc4\x03\x10\xff\xc3\x01\xc4\x03\x17\xff\x85\x01\xc4\x03\ +\x18\xff\xd7\x01\xc6\x00\x05\xff\xae\x01\xc6\x00\x0a\xff\xae\x01\ +\xc6\x01\x9d\xff\x85\x01\xc6\x01\xa6\xff\x85\x01\xc6\x01\xa8\xff\ +\xd7\x01\xc6\x01\xbc\xff\x9a\x01\xc6\x01\xbd\xff\xd7\x01\xc6\x01\ +\xc1\xff\x9a\x01\xc6\x01\xc4\xff\x85\x01\xc6\x01\xdc\xff\xd7\x01\ +\xc6\x01\xdd\xff\xd7\x01\xc6\x01\xe1\xff\xd7\x01\xc6\x01\xe4\xff\ +\xd7\x01\xc6\x01\xf6\xff\xd7\x01\xc6\x02\x07\xff\xae\x01\xc6\x02\ +\x0b\xff\xae\x01\xc6\x02n\xff\xae\x01\xc6\x02|\xff\x9a\x01\ +\xc6\x02\x80\xff\xae\x01\xc6\x02\x82\xff\xae\x01\xc6\x02\x97\xff\ +\xae\x01\xc6\x02\x9b\xff\xae\x01\xc6\x02\xa7\xff\xae\x01\xc6\x02\ +\xa9\xff\x85\x01\xc6\x02\xaa\xff\xd7\x01\xc6\x02\xb5\xff\x9a\x01\ +\xc6\x02\xb6\xff\xd7\x01\xc6\x02\xb7\xff\x9a\x01\xc6\x02\xb8\xff\ +\xd7\x01\xc6\x02\xb9\xff\x9a\x01\xc6\x02\xba\xff\xd7\x01\xc6\x02\ +\xbd\xff\x85\x01\xc6\x02\xbe\xff\xd7\x01\xc6\x02\xbf\xff\x9a\x01\ +\xc6\x02\xc0\xff\xd7\x01\xc6\x02\xc1\xff\x9a\x01\xc6\x02\xc2\xff\ +\xd7\x01\xc6\x02\xd4\xff\x9a\x01\xc6\x02\xd5\xff\xd7\x01\xc6\x02\ +\xf7\xff\xd7\x01\xc6\x02\xf8\xff\xd7\x01\xc6\x02\xf9\xff\xd7\x01\ +\xc6\x02\xfa\xff\xd7\x01\xc6\x02\xfb\xff\xd7\x01\xc6\x02\xfc\xff\ +\xd7\x01\xc6\x02\xfd\xff\x9a\x01\xc6\x02\xfe\xff\xd7\x01\xc6\x03\ +\x03\xff\xae\x01\xc6\x03\x0d\xff\x9a\x01\xc6\x03\x0e\xff\xc3\x01\ +\xc6\x03\x0f\xff\x9a\x01\xc6\x03\x10\xff\xc3\x01\xc6\x03\x17\xff\ +\x85\x01\xc6\x03\x18\xff\xd7\x01\xc7\x00\x0f\xff\xae\x01\xc7\x00\ +\x11\xff\xae\x01\xc7\x01\x9d\xff\xec\x01\xc7\x01\xa4\xff\xd7\x01\ +\xc7\x01\xa6\xff\xec\x01\xc7\x01\xa8\xff\xd7\x01\xc7\x01\xaa\xff\ +\xd7\x01\xc7\x01\xae\xff\xd7\x01\xc7\x01\xb0\xff\xd7\x01\xc7\x01\ +\xb1\xff\xec\x01\xc7\x01\xb5\xff\xd7\x01\xc7\x01\xbc\xff\xc3\x01\ +\xc7\x01\xbd\xff\xd7\x01\xc7\x01\xbf\xff\xd7\x01\xc7\x01\xc1\xff\ +\xd7\x01\xc7\x01\xc4\xff\xec\x01\xc7\x01\xc7\xff\xec\x01\xc7\x01\ +\xce\xff\xec\x01\xc7\x01\xd5\xff\xec\x01\xc7\x01\xf2\xff\xec\x01\ +\xc7\x02\x08\xff\xae\x01\xc7\x02\x0c\xff\xae\x01\xc7\x02r\xff\ +\xd7\x01\xc7\x02s\xff\xec\x01\xc7\x02z\xff\xec\x01\xc7\x02\ +|\xff\xd7\x01\xc7\x02\x80\xff\xec\x01\xc7\x02\x82\xff\xec\x01\ +\xc7\x02\x9f\xff\xd7\x01\xc7\x02\xa1\xff\xec\x01\xc7\x02\xa9\xff\ +\xec\x01\xc7\x02\xb5\xff\xc3\x01\xc7\x02\xb7\xff\xec\x01\xc7\x02\ +\xb9\xff\xec\x01\xc7\x02\xbb\xff\xd7\x01\xc7\x02\xbd\xff\xec\x01\ +\xc7\x02\xbf\xff\xd7\x01\xc7\x02\xc1\xff\xd7\x01\xc7\x02\xca\xff\ +\xd7\x01\xc7\x02\xce\xff\xd7\x01\xc7\x02\xcf\xff\xec\x01\xc7\x02\ +\xd4\xff\xd7\x01\xc7\x02\xd9\xff\xd7\x01\xc7\x02\xdb\xff\xd7\x01\ +\xc7\x02\xdd\xff\xd7\x01\xc7\x02\xe5\xff\xd7\x01\xc7\x02\xe7\xff\ +\xec\x01\xc7\x02\xf5\xff\xec\x01\xc7\x02\xf7\xff\xd7\x01\xc7\x02\ +\xf9\xff\xd7\x01\xc7\x02\xfb\xff\xd7\x01\xc7\x02\xfd\xff\xd7\x01\ +\xc7\x03\x05\xff\xd7\x01\xc7\x03\x07\xff\xd7\x01\xc7\x03\x0d\xff\ +\xd7\x01\xc7\x03\x0f\xff\xd7\x01\xc7\x03\x11\xff\xd7\x01\xc7\x03\ +\x12\xff\xec\x01\xc7\x03\x17\xff\xec\x01\xc7\x03\x1b\xff\xd7\x01\ +\xc7\x03\x1c\xff\xec\x01\xc8\x00\x0f\xff\xae\x01\xc8\x00\x11\xff\ +\xae\x01\xc8\x01\x9d\xff\xec\x01\xc8\x01\xa4\xff\xd7\x01\xc8\x01\ +\xa6\xff\xec\x01\xc8\x01\xa8\xff\xd7\x01\xc8\x01\xaa\xff\xd7\x01\ +\xc8\x01\xae\xff\xd7\x01\xc8\x01\xb0\xff\xd7\x01\xc8\x01\xb1\xff\ +\xec\x01\xc8\x01\xb5\xff\xd7\x01\xc8\x01\xbc\xff\xc3\x01\xc8\x01\ +\xbd\xff\xd7\x01\xc8\x01\xbf\xff\xd7\x01\xc8\x01\xc1\xff\xd7\x01\ +\xc8\x01\xc4\xff\xec\x01\xc8\x01\xc7\xff\xec\x01\xc8\x01\xce\xff\ +\xec\x01\xc8\x01\xd5\xff\xec\x01\xc8\x01\xf2\xff\xec\x01\xc8\x02\ +\x08\xff\xae\x01\xc8\x02\x0c\xff\xae\x01\xc8\x02r\xff\xd7\x01\ +\xc8\x02s\xff\xec\x01\xc8\x02z\xff\xec\x01\xc8\x02|\xff\ +\xd7\x01\xc8\x02\x80\xff\xec\x01\xc8\x02\x82\xff\xec\x01\xc8\x02\ +\x9f\xff\xd7\x01\xc8\x02\xa1\xff\xec\x01\xc8\x02\xa9\xff\xec\x01\ +\xc8\x02\xb5\xff\xc3\x01\xc8\x02\xb7\xff\xec\x01\xc8\x02\xb9\xff\ +\xec\x01\xc8\x02\xbb\xff\xd7\x01\xc8\x02\xbd\xff\xec\x01\xc8\x02\ +\xbf\xff\xd7\x01\xc8\x02\xc1\xff\xd7\x01\xc8\x02\xca\xff\xd7\x01\ +\xc8\x02\xce\xff\xd7\x01\xc8\x02\xcf\xff\xec\x01\xc8\x02\xd4\xff\ +\xd7\x01\xc8\x02\xd9\xff\xd7\x01\xc8\x02\xdb\xff\xd7\x01\xc8\x02\ +\xdd\xff\xd7\x01\xc8\x02\xe5\xff\xd7\x01\xc8\x02\xe7\xff\xec\x01\ +\xc8\x02\xf5\xff\xec\x01\xc8\x02\xf7\xff\xd7\x01\xc8\x02\xf9\xff\ +\xd7\x01\xc8\x02\xfb\xff\xd7\x01\xc8\x02\xfd\xff\xd7\x01\xc8\x03\ +\x05\xff\xd7\x01\xc8\x03\x07\xff\xd7\x01\xc8\x03\x0d\xff\xd7\x01\ +\xc8\x03\x0f\xff\xd7\x01\xc8\x03\x11\xff\xd7\x01\xc8\x03\x12\xff\ +\xec\x01\xc8\x03\x17\xff\xec\x01\xc8\x03\x1b\xff\xd7\x01\xc8\x03\ +\x1c\xff\xec\x01\xca\x00\x05\xff\xec\x01\xca\x00\x0a\xff\xec\x01\ +\xca\x02\x07\xff\xec\x01\xca\x02\x0b\xff\xec\x01\xcc\x01\xe9\x00\ +)\x01\xcd\x00\x0f\xff\x9a\x01\xcd\x00\x10\xff\xd7\x01\xcd\x00\ +\x11\xff\x9a\x01\xcd\x01\xce\xff\xc3\x01\xcd\x01\xcf\xff\xec\x01\ +\xcd\x01\xd5\xff\xc3\x01\xcd\x01\xd8\xff\xec\x01\xcd\x01\xdb\xff\ +\xec\x01\xcd\x01\xde\xff\xec\x01\xcd\x01\xea\xff\xec\x01\xcd\x01\ +\xed\xff\xec\x01\xcd\x01\xf2\xff\xc3\x01\xcd\x02\x02\xff\xd7\x01\ +\xcd\x02\x03\xff\xd7\x01\xcd\x02\x04\xff\xd7\x01\xcd\x02\x08\xff\ +\x9a\x01\xcd\x02\x0c\xff\x9a\x01\xcd\x02j\xff\xec\x01\xcd\x02\ +s\xff\xc3\x01\xcd\x02\x7f\xff\xec\x01\xcd\x02\x85\xff\xec\x01\ +\xcd\x02\x87\xff\xec\x01\xcd\x02\x89\xff\xec\x01\xcd\x02\x8d\xff\ +\xec\x01\xcd\x02\xb2\xff\xec\x01\xcd\x02\xb4\xff\xec\x01\xcd\x02\ +\xcf\xff\xc3\x01\xcd\x02\xe0\xff\xec\x01\xcd\x02\xf0\xff\xec\x01\ +\xcd\x02\xf2\xff\xec\x01\xcd\x02\xf4\xff\xec\x01\xcd\x03\x0a\xff\ +\xec\x01\xcd\x03\x0c\xff\xec\x01\xcd\x03\x12\xff\xc3\x01\xcd\x03\ +\x16\xff\xec\x01\xcd\x03\x1a\xff\xec\x01\xcd\x03\x1c\xff\xc3\x01\ +\xce\x00\x05\xff\xec\x01\xce\x00\x0a\xff\xec\x01\xce\x02\x07\xff\ +\xec\x01\xce\x02\x0b\xff\xec\x01\xcf\x00\x05\xff\xec\x01\xcf\x00\ +\x0a\xff\xec\x01\xcf\x02\x07\xff\xec\x01\xcf\x02\x0b\xff\xec\x01\ +\xd0\x01\xcf\xff\xd7\x01\xd0\x01\xd8\xff\xd7\x01\xd0\x01\xdb\xff\ +\xd7\x01\xd0\x01\xde\xff\xd7\x01\xd0\x01\xe1\xff\xd7\x01\xd0\x01\ +\xea\xff\xd7\x01\xd0\x01\xed\xff\xd7\x01\xd0\x02j\xff\xd7\x01\ +\xd0\x02\x7f\xff\xd7\x01\xd0\x02\x85\xff\xd7\x01\xd0\x02\x87\xff\ +\xd7\x01\xd0\x02\x89\xff\xd7\x01\xd0\x02\x8d\xff\xd7\x01\xd0\x02\ +\xb2\xff\xd7\x01\xd0\x02\xb4\xff\xd7\x01\xd0\x02\xc0\xff\xd7\x01\ +\xd0\x02\xc2\xff\xd7\x01\xd0\x02\xc6\xff\xd7\x01\xd0\x02\xc8\xff\ +\xd7\x01\xd0\x02\xd5\xff\xd7\x01\xd0\x02\xe0\xff\xd7\x01\xd0\x02\ +\xf0\xff\xd7\x01\xd0\x02\xf2\xff\xd7\x01\xd0\x02\xf4\xff\xd7\x01\ +\xd0\x02\xfe\xff\xd7\x01\xd0\x03\x0a\xff\xd7\x01\xd0\x03\x0c\xff\ +\xd7\x01\xd0\x03\x16\xff\xd7\x01\xd0\x03\x1a\xff\xd7\x01\xd1\x01\ +\xe9\x00)\x01\xd4\x01\xcf\xff\xd7\x01\xd4\x01\xd8\xff\xd7\x01\ +\xd4\x01\xdb\xff\xd7\x01\xd4\x01\xde\xff\xd7\x01\xd4\x01\xe1\xff\ +\xd7\x01\xd4\x01\xea\xff\xd7\x01\xd4\x01\xed\xff\xd7\x01\xd4\x02\ +j\xff\xd7\x01\xd4\x02\x7f\xff\xd7\x01\xd4\x02\x85\xff\xd7\x01\ +\xd4\x02\x87\xff\xd7\x01\xd4\x02\x89\xff\xd7\x01\xd4\x02\x8d\xff\ +\xd7\x01\xd4\x02\xb2\xff\xd7\x01\xd4\x02\xb4\xff\xd7\x01\xd4\x02\ +\xc0\xff\xd7\x01\xd4\x02\xc2\xff\xd7\x01\xd4\x02\xc6\xff\xd7\x01\ +\xd4\x02\xc8\xff\xd7\x01\xd4\x02\xd5\xff\xd7\x01\xd4\x02\xe0\xff\ +\xd7\x01\xd4\x02\xf0\xff\xd7\x01\xd4\x02\xf2\xff\xd7\x01\xd4\x02\ +\xf4\xff\xd7\x01\xd4\x02\xfe\xff\xd7\x01\xd4\x03\x0a\xff\xd7\x01\ +\xd4\x03\x0c\xff\xd7\x01\xd4\x03\x16\xff\xd7\x01\xd4\x03\x1a\xff\ +\xd7\x01\xd8\x00\x05\xff\xec\x01\xd8\x00\x0a\xff\xec\x01\xd8\x01\ +\xd0\xff\xd7\x01\xd8\x01\xdc\xff\xec\x01\xd8\x01\xdd\xff\xec\x01\ +\xd8\x01\xdf\xff\xd7\x01\xd8\x01\xe1\xff\xec\x01\xd8\x01\xe4\xff\ +\xec\x01\xd8\x01\xf6\xff\xec\x01\xd8\x02\x07\xff\xec\x01\xd8\x02\ +\x0b\xff\xec\x01\xd8\x02\xa0\xff\xd7\x01\xd8\x02\xaa\xff\xec\x01\ +\xd8\x02\xb6\xff\xec\x01\xd8\x02\xbc\xff\xd7\x01\xd8\x02\xbe\xff\ +\xec\x01\xd8\x02\xc0\xff\xec\x01\xd8\x02\xc2\xff\xec\x01\xd8\x02\ +\xcb\xff\xd7\x01\xd8\x02\xd5\xff\xec\x01\xd8\x02\xe6\xff\xd7\x01\ +\xd8\x02\xf8\xff\xec\x01\xd8\x02\xfa\xff\xec\x01\xd8\x02\xfc\xff\ +\xec\x01\xd8\x02\xfe\xff\xec\x01\xd8\x03\x06\xff\xd7\x01\xd8\x03\ +\x08\xff\xd7\x01\xd8\x03\x0e\xff\xec\x01\xd8\x03\x10\xff\xec\x01\ +\xd8\x03\x18\xff\xec\x01\xda\x00\x05\xff\xec\x01\xda\x00\x0a\xff\ +\xec\x01\xda\x01\xd0\xff\xd7\x01\xda\x01\xdc\xff\xec\x01\xda\x01\ +\xdd\xff\xec\x01\xda\x01\xdf\xff\xd7\x01\xda\x01\xe1\xff\xec\x01\ +\xda\x01\xe4\xff\xec\x01\xda\x01\xf6\xff\xec\x01\xda\x02\x07\xff\ +\xec\x01\xda\x02\x0b\xff\xec\x01\xda\x02\xa0\xff\xd7\x01\xda\x02\ +\xaa\xff\xec\x01\xda\x02\xb6\xff\xec\x01\xda\x02\xbc\xff\xd7\x01\ +\xda\x02\xbe\xff\xec\x01\xda\x02\xc0\xff\xec\x01\xda\x02\xc2\xff\ +\xec\x01\xda\x02\xcb\xff\xd7\x01\xda\x02\xd5\xff\xec\x01\xda\x02\ +\xe6\xff\xd7\x01\xda\x02\xf8\xff\xec\x01\xda\x02\xfa\xff\xec\x01\ +\xda\x02\xfc\xff\xec\x01\xda\x02\xfe\xff\xec\x01\xda\x03\x06\xff\ +\xd7\x01\xda\x03\x08\xff\xd7\x01\xda\x03\x0e\xff\xec\x01\xda\x03\ +\x10\xff\xec\x01\xda\x03\x18\xff\xec\x01\xdc\x00\x0f\xff\x9a\x01\ +\xdc\x00\x10\xff\xd7\x01\xdc\x00\x11\xff\x9a\x01\xdc\x01\xce\xff\ +\xc3\x01\xdc\x01\xcf\xff\xec\x01\xdc\x01\xd5\xff\xc3\x01\xdc\x01\ +\xd8\xff\xec\x01\xdc\x01\xdb\xff\xec\x01\xdc\x01\xde\xff\xec\x01\ +\xdc\x01\xea\xff\xec\x01\xdc\x01\xed\xff\xec\x01\xdc\x01\xf2\xff\ +\xc3\x01\xdc\x02\x02\xff\xd7\x01\xdc\x02\x03\xff\xd7\x01\xdc\x02\ +\x04\xff\xd7\x01\xdc\x02\x08\xff\x9a\x01\xdc\x02\x0c\xff\x9a\x01\ +\xdc\x02j\xff\xec\x01\xdc\x02s\xff\xc3\x01\xdc\x02\x7f\xff\ +\xec\x01\xdc\x02\x85\xff\xec\x01\xdc\x02\x87\xff\xec\x01\xdc\x02\ +\x89\xff\xec\x01\xdc\x02\x8d\xff\xec\x01\xdc\x02\xb2\xff\xec\x01\ +\xdc\x02\xb4\xff\xec\x01\xdc\x02\xcf\xff\xc3\x01\xdc\x02\xe0\xff\ +\xec\x01\xdc\x02\xf0\xff\xec\x01\xdc\x02\xf2\xff\xec\x01\xdc\x02\ +\xf4\xff\xec\x01\xdc\x03\x0a\xff\xec\x01\xdc\x03\x0c\xff\xec\x01\ +\xdc\x03\x12\xff\xc3\x01\xdc\x03\x16\xff\xec\x01\xdc\x03\x1a\xff\ +\xec\x01\xdc\x03\x1c\xff\xc3\x01\xdd\x00\x0f\xff\xae\x01\xdd\x00\ +\x11\xff\xae\x01\xdd\x01\xce\xff\xd7\x01\xdd\x01\xd5\xff\xd7\x01\ +\xdd\x01\xf2\xff\xd7\x01\xdd\x02\x08\xff\xae\x01\xdd\x02\x0c\xff\ +\xae\x01\xdd\x02s\xff\xd7\x01\xdd\x02\xcf\xff\xd7\x01\xdd\x03\ +\x12\xff\xd7\x01\xdd\x03\x1c\xff\xd7\x01\xde\x00\x05\xff\xec\x01\ +\xde\x00\x0a\xff\xec\x01\xde\x01\xd0\xff\xd7\x01\xde\x01\xdc\xff\ +\xec\x01\xde\x01\xdd\xff\xec\x01\xde\x01\xdf\xff\xd7\x01\xde\x01\ +\xe1\xff\xec\x01\xde\x01\xe4\xff\xec\x01\xde\x01\xf6\xff\xec\x01\ +\xde\x02\x07\xff\xec\x01\xde\x02\x0b\xff\xec\x01\xde\x02\xa0\xff\ +\xd7\x01\xde\x02\xaa\xff\xec\x01\xde\x02\xb6\xff\xec\x01\xde\x02\ +\xbc\xff\xd7\x01\xde\x02\xbe\xff\xec\x01\xde\x02\xc0\xff\xec\x01\ +\xde\x02\xc2\xff\xec\x01\xde\x02\xcb\xff\xd7\x01\xde\x02\xd5\xff\ +\xec\x01\xde\x02\xe6\xff\xd7\x01\xde\x02\xf8\xff\xec\x01\xde\x02\ +\xfa\xff\xec\x01\xde\x02\xfc\xff\xec\x01\xde\x02\xfe\xff\xec\x01\ +\xde\x03\x06\xff\xd7\x01\xde\x03\x08\xff\xd7\x01\xde\x03\x0e\xff\ +\xec\x01\xde\x03\x10\xff\xec\x01\xde\x03\x18\xff\xec\x01\xdf\x01\ +\xcf\xff\xd7\x01\xdf\x01\xd8\xff\xd7\x01\xdf\x01\xdb\xff\xd7\x01\ +\xdf\x01\xde\xff\xd7\x01\xdf\x01\xe1\xff\xd7\x01\xdf\x01\xea\xff\ +\xd7\x01\xdf\x01\xed\xff\xd7\x01\xdf\x02j\xff\xd7\x01\xdf\x02\ +\x7f\xff\xd7\x01\xdf\x02\x85\xff\xd7\x01\xdf\x02\x87\xff\xd7\x01\ +\xdf\x02\x89\xff\xd7\x01\xdf\x02\x8d\xff\xd7\x01\xdf\x02\xb2\xff\ +\xd7\x01\xdf\x02\xb4\xff\xd7\x01\xdf\x02\xc0\xff\xd7\x01\xdf\x02\ +\xc2\xff\xd7\x01\xdf\x02\xc6\xff\xd7\x01\xdf\x02\xc8\xff\xd7\x01\ +\xdf\x02\xd5\xff\xd7\x01\xdf\x02\xe0\xff\xd7\x01\xdf\x02\xf0\xff\ +\xd7\x01\xdf\x02\xf2\xff\xd7\x01\xdf\x02\xf4\xff\xd7\x01\xdf\x02\ +\xfe\xff\xd7\x01\xdf\x03\x0a\xff\xd7\x01\xdf\x03\x0c\xff\xd7\x01\ +\xdf\x03\x16\xff\xd7\x01\xdf\x03\x1a\xff\xd7\x01\xe0\x00\x05\xff\ +\xec\x01\xe0\x00\x0a\xff\xec\x01\xe0\x02\x07\xff\xec\x01\xe0\x02\ +\x0b\xff\xec\x01\xe3\x00\x05\xff\xec\x01\xe3\x00\x0a\xff\xec\x01\ +\xe3\x02\x07\xff\xec\x01\xe3\x02\x0b\xff\xec\x01\xe4\x00\x05\xff\ +\x85\x01\xe4\x00\x0a\xff\x85\x01\xe4\x01\xd0\xff\xd7\x01\xe4\x01\ +\xdc\xff\x9a\x01\xe4\x01\xdd\xff\xc3\x01\xe4\x01\xdf\xff\xd7\x01\ +\xe4\x01\xe1\xff\xae\x01\xe4\x01\xe4\xff\x9a\x01\xe4\x01\xf6\xff\ +\xc3\x01\xe4\x02\x07\xff\x85\x01\xe4\x02\x0b\xff\x85\x01\xe4\x02\ +m\xff\xd7\x01\xe4\x02\x81\xff\xd7\x01\xe4\x02\x83\xff\xd7\x01\ +\xe4\x02\x8b\xff\xd7\x01\xe4\x02\xa0\xff\xd7\x01\xe4\x02\xaa\xff\ +\x9a\x01\xe4\x02\xb6\xff\x9a\x01\xe4\x02\xb8\xff\xc3\x01\xe4\x02\ +\xba\xff\xc3\x01\xe4\x02\xbc\xff\xd7\x01\xe4\x02\xbe\xff\x9a\x01\ +\xe4\x02\xc0\xff\xae\x01\xe4\x02\xc2\xff\xae\x01\xe4\x02\xc6\xff\ +\xd7\x01\xe4\x02\xc8\xff\xd7\x01\xe4\x02\xcb\xff\xd7\x01\xe4\x02\ +\xd5\xff\xae\x01\xe4\x02\xe6\xff\xd7\x01\xe4\x02\xea\xff\xd7\x01\ +\xe4\x02\xf8\xff\xc3\x01\xe4\x02\xfa\xff\xc3\x01\xe4\x02\xfc\xff\ +\xc3\x01\xe4\x02\xfe\xff\xae\x01\xe4\x03\x06\xff\xd7\x01\xe4\x03\ +\x08\xff\xd7\x01\xe4\x03\x0e\xff\x9a\x01\xe4\x03\x10\xff\x9a\x01\ +\xe4\x03\x18\xff\x9a\x01\xe6\x00\x05\xff\x85\x01\xe6\x00\x0a\xff\ +\x85\x01\xe6\x01\xd0\xff\xd7\x01\xe6\x01\xdc\xff\x9a\x01\xe6\x01\ +\xdd\xff\xc3\x01\xe6\x01\xdf\xff\xd7\x01\xe6\x01\xe1\xff\xae\x01\ +\xe6\x01\xe4\xff\x9a\x01\xe6\x01\xf6\xff\xc3\x01\xe6\x02\x07\xff\ +\x85\x01\xe6\x02\x0b\xff\x85\x01\xe6\x02m\xff\xd7\x01\xe6\x02\ +\x81\xff\xd7\x01\xe6\x02\x83\xff\xd7\x01\xe6\x02\x8b\xff\xd7\x01\ +\xe6\x02\xa0\xff\xd7\x01\xe6\x02\xaa\xff\x9a\x01\xe6\x02\xb6\xff\ +\x9a\x01\xe6\x02\xb8\xff\xc3\x01\xe6\x02\xba\xff\xc3\x01\xe6\x02\ +\xbc\xff\xd7\x01\xe6\x02\xbe\xff\x9a\x01\xe6\x02\xc0\xff\xae\x01\ +\xe6\x02\xc2\xff\xae\x01\xe6\x02\xc6\xff\xd7\x01\xe6\x02\xc8\xff\ +\xd7\x01\xe6\x02\xcb\xff\xd7\x01\xe6\x02\xd5\xff\xae\x01\xe6\x02\ +\xe6\xff\xd7\x01\xe6\x02\xea\xff\xd7\x01\xe6\x02\xf8\xff\xc3\x01\ +\xe6\x02\xfa\xff\xc3\x01\xe6\x02\xfc\xff\xc3\x01\xe6\x02\xfe\xff\ +\xae\x01\xe6\x03\x06\xff\xd7\x01\xe6\x03\x08\xff\xd7\x01\xe6\x03\ +\x0e\xff\x9a\x01\xe6\x03\x10\xff\x9a\x01\xe6\x03\x18\xff\x9a\x01\ +\xe7\x00\x05\xff\xec\x01\xe7\x00\x0a\xff\xec\x01\xe7\x01\xd0\xff\ +\xd7\x01\xe7\x01\xdc\xff\xec\x01\xe7\x01\xdd\xff\xec\x01\xe7\x01\ +\xdf\xff\xd7\x01\xe7\x01\xe1\xff\xec\x01\xe7\x01\xe4\xff\xec\x01\ +\xe7\x01\xf6\xff\xec\x01\xe7\x02\x07\xff\xec\x01\xe7\x02\x0b\xff\ +\xec\x01\xe7\x02\xa0\xff\xd7\x01\xe7\x02\xaa\xff\xec\x01\xe7\x02\ +\xb6\xff\xec\x01\xe7\x02\xbc\xff\xd7\x01\xe7\x02\xbe\xff\xec\x01\ +\xe7\x02\xc0\xff\xec\x01\xe7\x02\xc2\xff\xec\x01\xe7\x02\xcb\xff\ +\xd7\x01\xe7\x02\xd5\xff\xec\x01\xe7\x02\xe6\xff\xd7\x01\xe7\x02\ +\xf8\xff\xec\x01\xe7\x02\xfa\xff\xec\x01\xe7\x02\xfc\xff\xec\x01\ +\xe7\x02\xfe\xff\xec\x01\xe7\x03\x06\xff\xd7\x01\xe7\x03\x08\xff\ +\xd7\x01\xe7\x03\x0e\xff\xec\x01\xe7\x03\x10\xff\xec\x01\xe7\x03\ +\x18\xff\xec\x01\xe8\x00\x05\xff\xec\x01\xe8\x00\x0a\xff\xec\x01\ +\xe8\x01\xd0\xff\xd7\x01\xe8\x01\xdc\xff\xec\x01\xe8\x01\xdd\xff\ +\xec\x01\xe8\x01\xdf\xff\xd7\x01\xe8\x01\xe1\xff\xec\x01\xe8\x01\ +\xe4\xff\xec\x01\xe8\x01\xf6\xff\xec\x01\xe8\x02\x07\xff\xec\x01\ +\xe8\x02\x0b\xff\xec\x01\xe8\x02\xa0\xff\xd7\x01\xe8\x02\xaa\xff\ +\xec\x01\xe8\x02\xb6\xff\xec\x01\xe8\x02\xbc\xff\xd7\x01\xe8\x02\ +\xbe\xff\xec\x01\xe8\x02\xc0\xff\xec\x01\xe8\x02\xc2\xff\xec\x01\ +\xe8\x02\xcb\xff\xd7\x01\xe8\x02\xd5\xff\xec\x01\xe8\x02\xe6\xff\ +\xd7\x01\xe8\x02\xf8\xff\xec\x01\xe8\x02\xfa\xff\xec\x01\xe8\x02\ +\xfc\xff\xec\x01\xe8\x02\xfe\xff\xec\x01\xe8\x03\x06\xff\xd7\x01\ +\xe8\x03\x08\xff\xd7\x01\xe8\x03\x0e\xff\xec\x01\xe8\x03\x10\xff\ +\xec\x01\xe8\x03\x18\xff\xec\x01\xea\x00\x05\xff\xec\x01\xea\x00\ +\x0a\xff\xec\x01\xea\x02\x07\xff\xec\x01\xea\x02\x0b\xff\xec\x01\ +\xeb\x00\x05\xff\xec\x01\xeb\x00\x0a\xff\xec\x01\xeb\x02\x07\xff\ +\xec\x01\xeb\x02\x0b\xff\xec\x01\xeb\x03\x0e\xff\xd7\x01\xeb\x03\ +\x10\xff\xd7\x01\xec\x00\x0f\xff\x9a\x01\xec\x00\x10\xff\xd7\x01\ +\xec\x00\x11\xff\x9a\x01\xec\x01\xce\xff\xc3\x01\xec\x01\xcf\xff\ +\xec\x01\xec\x01\xd5\xff\xc3\x01\xec\x01\xd8\xff\xec\x01\xec\x01\ +\xdb\xff\xec\x01\xec\x01\xde\xff\xec\x01\xec\x01\xea\xff\xec\x01\ +\xec\x01\xed\xff\xec\x01\xec\x01\xf2\xff\xc3\x01\xec\x02\x02\xff\ +\xd7\x01\xec\x02\x03\xff\xd7\x01\xec\x02\x04\xff\xd7\x01\xec\x02\ +\x08\xff\x9a\x01\xec\x02\x0c\xff\x9a\x01\xec\x02j\xff\xec\x01\ +\xec\x02s\xff\xc3\x01\xec\x02\x7f\xff\xec\x01\xec\x02\x85\xff\ +\xec\x01\xec\x02\x87\xff\xec\x01\xec\x02\x89\xff\xec\x01\xec\x02\ +\x8d\xff\xec\x01\xec\x02\xb2\xff\xec\x01\xec\x02\xb4\xff\xec\x01\ +\xec\x02\xcf\xff\xc3\x01\xec\x02\xe0\xff\xec\x01\xec\x02\xf0\xff\ +\xec\x01\xec\x02\xf2\xff\xec\x01\xec\x02\xf4\xff\xec\x01\xec\x03\ +\x0a\xff\xec\x01\xec\x03\x0c\xff\xec\x01\xec\x03\x12\xff\xc3\x01\ +\xec\x03\x16\xff\xec\x01\xec\x03\x1a\xff\xec\x01\xec\x03\x1c\xff\ +\xc3\x01\xf2\x00\x05\xff\x85\x01\xf2\x00\x0a\xff\x85\x01\xf2\x01\ +\xd0\xff\xd7\x01\xf2\x01\xdc\xff\x9a\x01\xf2\x01\xdd\xff\xc3\x01\ +\xf2\x01\xdf\xff\xd7\x01\xf2\x01\xe1\xff\xae\x01\xf2\x01\xe4\xff\ +\x9a\x01\xf2\x01\xf6\xff\xc3\x01\xf2\x02\x07\xff\x85\x01\xf2\x02\ +\x0b\xff\x85\x01\xf2\x02m\xff\xd7\x01\xf2\x02\x81\xff\xd7\x01\ +\xf2\x02\x83\xff\xd7\x01\xf2\x02\x8b\xff\xd7\x01\xf2\x02\xa0\xff\ +\xd7\x01\xf2\x02\xaa\xff\x9a\x01\xf2\x02\xb6\xff\x9a\x01\xf2\x02\ +\xb8\xff\xc3\x01\xf2\x02\xba\xff\xc3\x01\xf2\x02\xbc\xff\xd7\x01\ +\xf2\x02\xbe\xff\x9a\x01\xf2\x02\xc0\xff\xae\x01\xf2\x02\xc2\xff\ +\xae\x01\xf2\x02\xc6\xff\xd7\x01\xf2\x02\xc8\xff\xd7\x01\xf2\x02\ +\xcb\xff\xd7\x01\xf2\x02\xd5\xff\xae\x01\xf2\x02\xe6\xff\xd7\x01\ +\xf2\x02\xea\xff\xd7\x01\xf2\x02\xf8\xff\xc3\x01\xf2\x02\xfa\xff\ +\xc3\x01\xf2\x02\xfc\xff\xc3\x01\xf2\x02\xfe\xff\xae\x01\xf2\x03\ +\x06\xff\xd7\x01\xf2\x03\x08\xff\xd7\x01\xf2\x03\x0e\xff\x9a\x01\ +\xf2\x03\x10\xff\x9a\x01\xf2\x03\x18\xff\x9a\x01\xf3\x00\x05\xff\ +\x85\x01\xf3\x00\x0a\xff\x85\x01\xf3\x01\xd0\xff\xd7\x01\xf3\x01\ +\xdc\xff\x9a\x01\xf3\x01\xdd\xff\xc3\x01\xf3\x01\xdf\xff\xd7\x01\ +\xf3\x01\xe1\xff\xae\x01\xf3\x01\xe4\xff\x9a\x01\xf3\x01\xf6\xff\ +\xc3\x01\xf3\x02\x07\xff\x85\x01\xf3\x02\x0b\xff\x85\x01\xf3\x02\ +m\xff\xd7\x01\xf3\x02\x81\xff\xd7\x01\xf3\x02\x83\xff\xd7\x01\ +\xf3\x02\x8b\xff\xd7\x01\xf3\x02\xa0\xff\xd7\x01\xf3\x02\xaa\xff\ +\x9a\x01\xf3\x02\xb6\xff\x9a\x01\xf3\x02\xb8\xff\xc3\x01\xf3\x02\ +\xba\xff\xc3\x01\xf3\x02\xbc\xff\xd7\x01\xf3\x02\xbe\xff\x9a\x01\ +\xf3\x02\xc0\xff\xae\x01\xf3\x02\xc2\xff\xae\x01\xf3\x02\xc6\xff\ +\xd7\x01\xf3\x02\xc8\xff\xd7\x01\xf3\x02\xcb\xff\xd7\x01\xf3\x02\ +\xd5\xff\xae\x01\xf3\x02\xe6\xff\xd7\x01\xf3\x02\xea\xff\xd7\x01\ +\xf3\x02\xf8\xff\xc3\x01\xf3\x02\xfa\xff\xc3\x01\xf3\x02\xfc\xff\ +\xc3\x01\xf3\x02\xfe\xff\xae\x01\xf3\x03\x06\xff\xd7\x01\xf3\x03\ +\x08\xff\xd7\x01\xf3\x03\x0e\xff\x9a\x01\xf3\x03\x10\xff\x9a\x01\ +\xf3\x03\x18\xff\x9a\x01\xf4\x00\x05\xff\xec\x01\xf4\x00\x0a\xff\ +\xec\x01\xf4\x02\x07\xff\xec\x01\xf4\x02\x0b\xff\xec\x01\xf4\x03\ +\x0e\xff\xd7\x01\xf4\x03\x10\xff\xd7\x01\xf5\x01\xcf\xff\xd7\x01\ +\xf5\x01\xd8\xff\xd7\x01\xf5\x01\xdb\xff\xd7\x01\xf5\x01\xde\xff\ +\xd7\x01\xf5\x01\xe1\xff\xd7\x01\xf5\x01\xea\xff\xd7\x01\xf5\x01\ +\xed\xff\xd7\x01\xf5\x02j\xff\xd7\x01\xf5\x02\x7f\xff\xd7\x01\ +\xf5\x02\x85\xff\xd7\x01\xf5\x02\x87\xff\xd7\x01\xf5\x02\x89\xff\ +\xd7\x01\xf5\x02\x8d\xff\xd7\x01\xf5\x02\xb2\xff\xd7\x01\xf5\x02\ +\xb4\xff\xd7\x01\xf5\x02\xc0\xff\xd7\x01\xf5\x02\xc2\xff\xd7\x01\ +\xf5\x02\xc6\xff\xd7\x01\xf5\x02\xc8\xff\xd7\x01\xf5\x02\xd5\xff\ +\xd7\x01\xf5\x02\xe0\xff\xd7\x01\xf5\x02\xf0\xff\xd7\x01\xf5\x02\ +\xf2\xff\xd7\x01\xf5\x02\xf4\xff\xd7\x01\xf5\x02\xfe\xff\xd7\x01\ +\xf5\x03\x0a\xff\xd7\x01\xf5\x03\x0c\xff\xd7\x01\xf5\x03\x16\xff\ +\xd7\x01\xf5\x03\x1a\xff\xd7\x01\xf6\x00\x0f\xff\xae\x01\xf6\x00\ +\x11\xff\xae\x01\xf6\x01\xce\xff\xd7\x01\xf6\x01\xd5\xff\xd7\x01\ +\xf6\x01\xf2\xff\xd7\x01\xf6\x02\x08\xff\xae\x01\xf6\x02\x0c\xff\ +\xae\x01\xf6\x02s\xff\xd7\x01\xf6\x02\xcf\xff\xd7\x01\xf6\x03\ +\x12\xff\xd7\x01\xf6\x03\x1c\xff\xd7\x01\xf8\x00\x0f\xff\x85\x01\ +\xf8\x00\x10\xff\xae\x01\xf8\x00\x11\xff\x85\x01\xf8\x01\x9f\xff\ +\xd7\x01\xf8\x01\xa4\xff\x9a\x01\xf8\x01\xaa\xffq\x01\xf8\x01\ +\xae\xff\x9a\x01\xf8\x01\xb5\xff\x9a\x01\xf8\x01\xb8\xff\xd7\x01\ +\xf8\x01\xbb\xff\xd7\x01\xf8\x01\xbc\x00)\x01\xf8\x01\xbe\xff\ +\xae\x01\xf8\x01\xcc\xff\x9a\x01\xf8\x01\xcd\xff\x9a\x01\xf8\x01\ +\xce\xff\x85\x01\xf8\x01\xcf\xffq\x01\xf8\x01\xd0\xff\xd7\x01\ +\xf8\x01\xd1\xff\xd7\x01\xf8\x01\xd2\xff\x9a\x01\xf8\x01\xd3\xff\ +\x9a\x01\xf8\x01\xd4\xff\x9a\x01\xf8\x01\xd5\xff\x85\x01\xf8\x01\ +\xd6\xff\x9a\x01\xf8\x01\xd7\xff\x9a\x01\xf8\x01\xd8\xffq\x01\ +\xf8\x01\xd9\xff\x9a\x01\xf8\x01\xda\xff\x9a\x01\xf8\x01\xdb\xff\ +q\x01\xf8\x01\xdc\xff\xae\x01\xf8\x01\xdd\xff\xae\x01\xf8\x01\ +\xde\xffq\x01\xf8\x01\xdf\xff\xd7\x01\xf8\x01\xe0\xff\x9a\x01\ +\xf8\x01\xe1\xff\x9a\x01\xf8\x01\xe2\xff\x9a\x01\xf8\x01\xe3\xff\ +\x9a\x01\xf8\x01\xe4\xff\xae\x01\xf8\x01\xe5\xff\x9a\x01\xf8\x01\ +\xe6\xff\x9a\x01\xf8\x01\xe7\xff\xd7\x01\xf8\x01\xe8\xff\x9a\x01\ +\xf8\x01\xe9\xff\xc3\x01\xf8\x01\xea\xffq\x01\xf8\x01\xec\xff\ +\x9a\x01\xf8\x01\xed\xffq\x01\xf8\x01\xee\xff\x85\x01\xf8\x01\ +\xf2\xff\x85\x01\xf8\x01\xf3\xff\x9a\x01\xf8\x01\xf5\xff\x9a\x01\ +\xf8\x01\xf6\xff\xae\x01\xf8\x01\xf7\xff\x9a\x01\xf8\x01\xf9\xff\ +\x9a\x01\xf8\x02\x02\xff\xae\x01\xf8\x02\x03\xff\xae\x01\xf8\x02\ +\x04\xff\xae\x01\xf8\x02\x08\xff\x85\x01\xf8\x02\x0c\xff\x85\x01\ +\xf8\x02j\xffq\x01\xf8\x02k\xff\x9a\x01\xf8\x02l\xff\ +\xd7\x01\xf8\x02m\xff\xd7\x01\xf8\x02q\xff\x9a\x01\xf8\x02\ +r\xffq\x01\xf8\x02s\xff\x85\x01\xf8\x02u\xff\x9a\x01\ +\xf8\x02w\xff\x9a\x01\xf8\x02y\xff\x9a\x01\xf8\x02}\xff\ +\x9a\x01\xf8\x02~\xff\xd7\x01\xf8\x02\x7f\xffq\x01\xf8\x02\ +\x81\xff\xd7\x01\xf8\x02\x83\xff\xd7\x01\xf8\x02\x84\xff\xd7\x01\ +\xf8\x02\x85\xffq\x01\xf8\x02\x86\xff\xd7\x01\xf8\x02\x87\xff\ +q\x01\xf8\x02\x88\xff\xd7\x01\xf8\x02\x89\xffq\x01\xf8\x02\ +\x8a\xff\xd7\x01\xf8\x02\x8b\xff\xd7\x01\xf8\x02\x8c\xff\xd7\x01\ +\xf8\x02\x8d\xffq\x01\xf8\x02\x96\xff\x9a\x01\xf8\x02\x9a\xff\ +\x9a\x01\xf8\x02\x9e\xff\x9a\x01\xf8\x02\xa0\xff\xd7\x01\xf8\x02\ +\xa2\xff\xd7\x01\xf8\x02\xa4\xff\x9a\x01\xf8\x02\xa6\xff\x9a\x01\ +\xf8\x02\xaa\xff\xae\x01\xf8\x02\xac\xff\x9a\x01\xf8\x02\xae\xff\ +\x9a\x01\xf8\x02\xb0\xff\x9a\x01\xf8\x02\xb1\xff\xd7\x01\xf8\x02\ +\xb2\xffq\x01\xf8\x02\xb3\xff\xd7\x01\xf8\x02\xb4\xffq\x01\ +\xf8\x02\xb5\x00)\x01\xf8\x02\xb6\xff\xae\x01\xf8\x02\xb8\xff\ +\xae\x01\xf8\x02\xba\xff\xae\x01\xf8\x02\xbc\xff\xd7\x01\xf8\x02\ +\xbe\xff\xae\x01\xf8\x02\xc0\xff\x9a\x01\xf8\x02\xc2\xff\x9a\x01\ +\xf8\x02\xc4\xff\x9a\x01\xf8\x02\xc5\xff\x9a\x01\xf8\x02\xc6\xff\ +q\x01\xf8\x02\xc7\xff\x9a\x01\xf8\x02\xc8\xffq\x01\xf8\x02\ +\xcb\xff\xd7\x01\xf8\x02\xcd\xff\x9a\x01\xf8\x02\xce\xff\x9a\x01\ +\xf8\x02\xcf\xff\x85\x01\xf8\x02\xd1\xff\x9a\x01\xf8\x02\xd3\xff\ +\x9a\x01\xf8\x02\xd5\xff\x9a\x01\xf8\x02\xd7\xff\x9a\x01\xf8\x02\ +\xd9\xffq\x01\xf8\x02\xdb\xffq\x01\xf8\x02\xdd\xffq\x01\ +\xf8\x02\xe0\xffq\x01\xf8\x02\xe6\xff\xd7\x01\xf8\x02\xe8\xff\ +\xd7\x01\xf8\x02\xea\xff\xc3\x01\xf8\x02\xec\xff\x9a\x01\xf8\x02\ +\xee\xff\x9a\x01\xf8\x02\xef\xff\xd7\x01\xf8\x02\xf0\xffq\x01\ +\xf8\x02\xf1\xff\xd7\x01\xf8\x02\xf2\xffq\x01\xf8\x02\xf3\xff\ +\xd7\x01\xf8\x02\xf4\xffq\x01\xf8\x02\xf6\xff\xd7\x01\xf8\x02\ +\xf8\xff\xae\x01\xf8\x02\xfa\xff\xae\x01\xf8\x02\xfc\xff\xae\x01\ +\xf8\x02\xfe\xff\x9a\x01\xf8\x03\x00\xff\x9a\x01\xf8\x03\x02\xff\ +\x9a\x01\xf8\x03\x06\xff\xd7\x01\xf8\x03\x08\xff\xd7\x01\xf8\x03\ +\x09\xffq\x01\xf8\x03\x0a\xffq\x01\xf8\x03\x0b\xffq\x01\ +\xf8\x03\x0c\xffq\x01\xf8\x03\x0e\xff\x9a\x01\xf8\x03\x10\xff\ +\x9a\x01\xf8\x03\x11\xff\x9a\x01\xf8\x03\x12\xff\x85\x01\xf8\x03\ +\x14\xff\x9a\x01\xf8\x03\x15\xff\xd7\x01\xf8\x03\x16\xffq\x01\ +\xf8\x03\x18\xff\xae\x01\xf8\x03\x1a\xffq\x01\xf8\x03\x1b\xff\ +\x9a\x01\xf8\x03\x1c\xff\x85\x01\xf9\x00\x0f\xff\x9a\x01\xf9\x00\ +\x10\xff\xd7\x01\xf9\x00\x11\xff\x9a\x01\xf9\x01\xce\xff\xc3\x01\ +\xf9\x01\xcf\xff\xec\x01\xf9\x01\xd5\xff\xc3\x01\xf9\x01\xd8\xff\ +\xec\x01\xf9\x01\xdb\xff\xec\x01\xf9\x01\xde\xff\xec\x01\xf9\x01\ +\xea\xff\xec\x01\xf9\x01\xed\xff\xec\x01\xf9\x01\xf2\xff\xc3\x01\ +\xf9\x02\x02\xff\xd7\x01\xf9\x02\x03\xff\xd7\x01\xf9\x02\x04\xff\ +\xd7\x01\xf9\x02\x08\xff\x9a\x01\xf9\x02\x0c\xff\x9a\x01\xf9\x02\ +j\xff\xec\x01\xf9\x02s\xff\xc3\x01\xf9\x02\x7f\xff\xec\x01\ +\xf9\x02\x85\xff\xec\x01\xf9\x02\x87\xff\xec\x01\xf9\x02\x89\xff\ +\xec\x01\xf9\x02\x8d\xff\xec\x01\xf9\x02\xb2\xff\xec\x01\xf9\x02\ +\xb4\xff\xec\x01\xf9\x02\xcf\xff\xc3\x01\xf9\x02\xe0\xff\xec\x01\ +\xf9\x02\xf0\xff\xec\x01\xf9\x02\xf2\xff\xec\x01\xf9\x02\xf4\xff\ +\xec\x01\xf9\x03\x0a\xff\xec\x01\xf9\x03\x0c\xff\xec\x01\xf9\x03\ +\x12\xff\xc3\x01\xf9\x03\x16\xff\xec\x01\xf9\x03\x1a\xff\xec\x01\ +\xf9\x03\x1c\xff\xc3\x01\xfa\x00\x0f\xff\x9a\x01\xfa\x00\x11\xff\ +\x9a\x01\xfa\x00\x22\x00)\x01\xfa\x00$\xff\xae\x01\xfa\x00\ +&\xff\xec\x01\xfa\x00*\xff\xec\x01\xfa\x002\xff\xec\x01\ +\xfa\x004\xff\xec\x01\xfa\x00D\xff\xd7\x01\xfa\x00F\xff\ +\xd7\x01\xfa\x00G\xff\xd7\x01\xfa\x00H\xff\xd7\x01\xfa\x00\ +J\xff\xec\x01\xfa\x00P\xff\xec\x01\xfa\x00Q\xff\xec\x01\ +\xfa\x00R\xff\xd7\x01\xfa\x00S\xff\xec\x01\xfa\x00T\xff\ +\xd7\x01\xfa\x00U\xff\xec\x01\xfa\x00V\xff\xec\x01\xfa\x00\ +X\xff\xec\x01\xfa\x00\x82\xff\xae\x01\xfa\x00\x83\xff\xae\x01\ +\xfa\x00\x84\xff\xae\x01\xfa\x00\x85\xff\xae\x01\xfa\x00\x86\xff\ +\xae\x01\xfa\x00\x87\xff\xae\x01\xfa\x00\x89\xff\xec\x01\xfa\x00\ +\x94\xff\xec\x01\xfa\x00\x95\xff\xec\x01\xfa\x00\x96\xff\xec\x01\ +\xfa\x00\x97\xff\xec\x01\xfa\x00\x98\xff\xec\x01\xfa\x00\x9a\xff\ +\xec\x01\xfa\x00\xa2\xff\xd7\x01\xfa\x00\xa3\xff\xd7\x01\xfa\x00\ +\xa4\xff\xd7\x01\xfa\x00\xa5\xff\xd7\x01\xfa\x00\xa6\xff\xd7\x01\ +\xfa\x00\xa7\xff\xd7\x01\xfa\x00\xa8\xff\xd7\x01\xfa\x00\xa9\xff\ +\xd7\x01\xfa\x00\xaa\xff\xd7\x01\xfa\x00\xab\xff\xd7\x01\xfa\x00\ +\xac\xff\xd7\x01\xfa\x00\xad\xff\xd7\x01\xfa\x00\xb4\xff\xd7\x01\ +\xfa\x00\xb5\xff\xd7\x01\xfa\x00\xb6\xff\xd7\x01\xfa\x00\xb7\xff\ +\xd7\x01\xfa\x00\xb8\xff\xd7\x01\xfa\x00\xba\xff\xd7\x01\xfa\x00\ +\xbb\xff\xec\x01\xfa\x00\xbc\xff\xec\x01\xfa\x00\xbd\xff\xec\x01\ +\xfa\x00\xbe\xff\xec\x01\xfa\x00\xc2\xff\xae\x01\xfa\x00\xc3\xff\ +\xd7\x01\xfa\x00\xc4\xff\xae\x01\xfa\x00\xc5\xff\xd7\x01\xfa\x00\ +\xc6\xff\xae\x01\xfa\x00\xc7\xff\xd7\x01\xfa\x00\xc8\xff\xec\x01\ +\xfa\x00\xc9\xff\xd7\x01\xfa\x00\xca\xff\xec\x01\xfa\x00\xcb\xff\ +\xd7\x01\xfa\x00\xcc\xff\xec\x01\xfa\x00\xcd\xff\xd7\x01\xfa\x00\ +\xce\xff\xec\x01\xfa\x00\xcf\xff\xd7\x01\xfa\x00\xd1\xff\xd7\x01\ +\xfa\x00\xd3\xff\xd7\x01\xfa\x00\xd5\xff\xd7\x01\xfa\x00\xd7\xff\ +\xd7\x01\xfa\x00\xd9\xff\xd7\x01\xfa\x00\xdb\xff\xd7\x01\xfa\x00\ +\xdd\xff\xd7\x01\xfa\x00\xde\xff\xec\x01\xfa\x00\xdf\xff\xec\x01\ +\xfa\x00\xe0\xff\xec\x01\xfa\x00\xe1\xff\xec\x01\xfa\x00\xe2\xff\ +\xec\x01\xfa\x00\xe3\xff\xec\x01\xfa\x00\xe4\xff\xec\x01\xfa\x00\ +\xe5\xff\xec\x01\xfa\x00\xfa\xff\xec\x01\xfa\x01\x06\xff\xec\x01\ +\xfa\x01\x08\xff\xec\x01\xfa\x01\x0d\xff\xec\x01\xfa\x01\x0e\xff\ +\xec\x01\xfa\x01\x0f\xff\xd7\x01\xfa\x01\x10\xff\xec\x01\xfa\x01\ +\x11\xff\xd7\x01\xfa\x01\x12\xff\xec\x01\xfa\x01\x13\xff\xd7\x01\ +\xfa\x01\x14\xff\xec\x01\xfa\x01\x15\xff\xd7\x01\xfa\x01\x17\xff\ +\xec\x01\xfa\x01\x19\xff\xec\x01\xfa\x01\x1d\xff\xec\x01\xfa\x01\ +!\xff\xec\x01\xfa\x01+\xff\xec\x01\xfa\x01-\xff\xec\x01\ +\xfa\x01/\xff\xec\x01\xfa\x011\xff\xec\x01\xfa\x013\xff\ +\xec\x01\xfa\x015\xff\xec\x01\xfa\x01C\xff\xae\x01\xfa\x01\ +D\xff\xd7\x01\xfa\x01F\xff\xd7\x01\xfa\x01G\xff\xec\x01\ +\xfa\x01H\xff\xd7\x01\xfa\x01J\xff\xec\x01\xfa\x02\x08\xff\ +\x9a\x01\xfa\x02\x0c\xff\x9a\x01\xfa\x02W\xff\xec\x01\xfa\x02\ +X\xff\xae\x01\xfa\x02Y\xff\xd7\x01\xfa\x02_\xff\xec\x01\ +\xfa\x02`\xff\xd7\x01\xfa\x02b\xff\xec\x01\xfa\x03\x1d\xff\ +\xae\x01\xfa\x03\x1e\xff\xd7\x01\xfa\x03\x1f\xff\xae\x01\xfa\x03\ + \xff\xd7\x01\xfa\x03!\xff\xae\x01\xfa\x03\x22\xff\xd7\x01\ +\xfa\x03#\xff\xae\x01\xfa\x03%\xff\xae\x01\xfa\x03&\xff\ +\xd7\x01\xfa\x03'\xff\xae\x01\xfa\x03(\xff\xd7\x01\xfa\x03\ +)\xff\xae\x01\xfa\x03*\xff\xd7\x01\xfa\x03+\xff\xae\x01\ +\xfa\x03,\xff\xd7\x01\xfa\x03-\xff\xae\x01\xfa\x03.\xff\ +\xd7\x01\xfa\x03/\xff\xae\x01\xfa\x030\xff\xd7\x01\xfa\x03\ +1\xff\xae\x01\xfa\x032\xff\xd7\x01\xfa\x033\xff\xae\x01\ +\xfa\x034\xff\xd7\x01\xfa\x036\xff\xd7\x01\xfa\x038\xff\ +\xd7\x01\xfa\x03:\xff\xd7\x01\xfa\x03<\xff\xd7\x01\xfa\x03\ +@\xff\xd7\x01\xfa\x03B\xff\xd7\x01\xfa\x03D\xff\xd7\x01\ +\xfa\x03I\xff\xec\x01\xfa\x03J\xff\xd7\x01\xfa\x03K\xff\ +\xec\x01\xfa\x03L\xff\xd7\x01\xfa\x03M\xff\xec\x01\xfa\x03\ +N\xff\xd7\x01\xfa\x03O\xff\xec\x01\xfa\x03Q\xff\xec\x01\ +\xfa\x03R\xff\xd7\x01\xfa\x03S\xff\xec\x01\xfa\x03T\xff\ +\xd7\x01\xfa\x03U\xff\xec\x01\xfa\x03V\xff\xd7\x01\xfa\x03\ +W\xff\xec\x01\xfa\x03X\xff\xd7\x01\xfa\x03Y\xff\xec\x01\ +\xfa\x03Z\xff\xd7\x01\xfa\x03[\xff\xec\x01\xfa\x03\x5c\xff\ +\xd7\x01\xfa\x03]\xff\xec\x01\xfa\x03^\xff\xd7\x01\xfa\x03\ +_\xff\xec\x01\xfa\x03`\xff\xd7\x01\xfa\x03b\xff\xec\x01\ +\xfa\x03d\xff\xec\x01\xfa\x03f\xff\xec\x01\xfa\x03h\xff\ +\xec\x01\xfa\x03j\xff\xec\x01\xfa\x03l\xff\xec\x01\xfa\x03\ +n\xff\xec\x01\xfb\x00\x05\x00R\x01\xfb\x00\x0a\x00R\x01\ +\xfb\x00\x0f\xff\xae\x01\xfb\x00\x11\xff\xae\x01\xfb\x00\x22\x00\ +)\x01\xfb\x02\x07\x00R\x01\xfb\x02\x08\xff\xae\x01\xfb\x02\ +\x0b\x00R\x01\xfb\x02\x0c\xff\xae\x01\xfc\x00\x0f\xff\x9a\x01\ +\xfc\x00\x11\xff\x9a\x01\xfc\x00\x22\x00)\x01\xfc\x00$\xff\ +\xae\x01\xfc\x00&\xff\xec\x01\xfc\x00*\xff\xec\x01\xfc\x00\ +2\xff\xec\x01\xfc\x004\xff\xec\x01\xfc\x00D\xff\xd7\x01\ +\xfc\x00F\xff\xd7\x01\xfc\x00G\xff\xd7\x01\xfc\x00H\xff\ +\xd7\x01\xfc\x00J\xff\xec\x01\xfc\x00P\xff\xec\x01\xfc\x00\ +Q\xff\xec\x01\xfc\x00R\xff\xd7\x01\xfc\x00S\xff\xec\x01\ +\xfc\x00T\xff\xd7\x01\xfc\x00U\xff\xec\x01\xfc\x00V\xff\ +\xec\x01\xfc\x00X\xff\xec\x01\xfc\x00\x82\xff\xae\x01\xfc\x00\ +\x83\xff\xae\x01\xfc\x00\x84\xff\xae\x01\xfc\x00\x85\xff\xae\x01\ +\xfc\x00\x86\xff\xae\x01\xfc\x00\x87\xff\xae\x01\xfc\x00\x89\xff\ +\xec\x01\xfc\x00\x94\xff\xec\x01\xfc\x00\x95\xff\xec\x01\xfc\x00\ +\x96\xff\xec\x01\xfc\x00\x97\xff\xec\x01\xfc\x00\x98\xff\xec\x01\ +\xfc\x00\x9a\xff\xec\x01\xfc\x00\xa2\xff\xd7\x01\xfc\x00\xa3\xff\ +\xd7\x01\xfc\x00\xa4\xff\xd7\x01\xfc\x00\xa5\xff\xd7\x01\xfc\x00\ +\xa6\xff\xd7\x01\xfc\x00\xa7\xff\xd7\x01\xfc\x00\xa8\xff\xd7\x01\ +\xfc\x00\xa9\xff\xd7\x01\xfc\x00\xaa\xff\xd7\x01\xfc\x00\xab\xff\ +\xd7\x01\xfc\x00\xac\xff\xd7\x01\xfc\x00\xad\xff\xd7\x01\xfc\x00\ +\xb4\xff\xd7\x01\xfc\x00\xb5\xff\xd7\x01\xfc\x00\xb6\xff\xd7\x01\ +\xfc\x00\xb7\xff\xd7\x01\xfc\x00\xb8\xff\xd7\x01\xfc\x00\xba\xff\ +\xd7\x01\xfc\x00\xbb\xff\xec\x01\xfc\x00\xbc\xff\xec\x01\xfc\x00\ +\xbd\xff\xec\x01\xfc\x00\xbe\xff\xec\x01\xfc\x00\xc2\xff\xae\x01\ +\xfc\x00\xc3\xff\xd7\x01\xfc\x00\xc4\xff\xae\x01\xfc\x00\xc5\xff\ +\xd7\x01\xfc\x00\xc6\xff\xae\x01\xfc\x00\xc7\xff\xd7\x01\xfc\x00\ +\xc8\xff\xec\x01\xfc\x00\xc9\xff\xd7\x01\xfc\x00\xca\xff\xec\x01\ +\xfc\x00\xcb\xff\xd7\x01\xfc\x00\xcc\xff\xec\x01\xfc\x00\xcd\xff\ +\xd7\x01\xfc\x00\xce\xff\xec\x01\xfc\x00\xcf\xff\xd7\x01\xfc\x00\ +\xd1\xff\xd7\x01\xfc\x00\xd3\xff\xd7\x01\xfc\x00\xd5\xff\xd7\x01\ +\xfc\x00\xd7\xff\xd7\x01\xfc\x00\xd9\xff\xd7\x01\xfc\x00\xdb\xff\ +\xd7\x01\xfc\x00\xdd\xff\xd7\x01\xfc\x00\xde\xff\xec\x01\xfc\x00\ +\xdf\xff\xec\x01\xfc\x00\xe0\xff\xec\x01\xfc\x00\xe1\xff\xec\x01\ +\xfc\x00\xe2\xff\xec\x01\xfc\x00\xe3\xff\xec\x01\xfc\x00\xe4\xff\ +\xec\x01\xfc\x00\xe5\xff\xec\x01\xfc\x00\xfa\xff\xec\x01\xfc\x01\ +\x06\xff\xec\x01\xfc\x01\x08\xff\xec\x01\xfc\x01\x0d\xff\xec\x01\ +\xfc\x01\x0e\xff\xec\x01\xfc\x01\x0f\xff\xd7\x01\xfc\x01\x10\xff\ +\xec\x01\xfc\x01\x11\xff\xd7\x01\xfc\x01\x12\xff\xec\x01\xfc\x01\ +\x13\xff\xd7\x01\xfc\x01\x14\xff\xec\x01\xfc\x01\x15\xff\xd7\x01\ +\xfc\x01\x17\xff\xec\x01\xfc\x01\x19\xff\xec\x01\xfc\x01\x1d\xff\ +\xec\x01\xfc\x01!\xff\xec\x01\xfc\x01+\xff\xec\x01\xfc\x01\ +-\xff\xec\x01\xfc\x01/\xff\xec\x01\xfc\x011\xff\xec\x01\ +\xfc\x013\xff\xec\x01\xfc\x015\xff\xec\x01\xfc\x01C\xff\ +\xae\x01\xfc\x01D\xff\xd7\x01\xfc\x01F\xff\xd7\x01\xfc\x01\ +G\xff\xec\x01\xfc\x01H\xff\xd7\x01\xfc\x01J\xff\xec\x01\ +\xfc\x02\x08\xff\x9a\x01\xfc\x02\x0c\xff\x9a\x01\xfc\x02W\xff\ +\xec\x01\xfc\x02X\xff\xae\x01\xfc\x02Y\xff\xd7\x01\xfc\x02\ +_\xff\xec\x01\xfc\x02`\xff\xd7\x01\xfc\x02b\xff\xec\x01\ +\xfc\x03\x1d\xff\xae\x01\xfc\x03\x1e\xff\xd7\x01\xfc\x03\x1f\xff\ +\xae\x01\xfc\x03 \xff\xd7\x01\xfc\x03!\xff\xae\x01\xfc\x03\ +\x22\xff\xd7\x01\xfc\x03#\xff\xae\x01\xfc\x03%\xff\xae\x01\ +\xfc\x03&\xff\xd7\x01\xfc\x03'\xff\xae\x01\xfc\x03(\xff\ +\xd7\x01\xfc\x03)\xff\xae\x01\xfc\x03*\xff\xd7\x01\xfc\x03\ ++\xff\xae\x01\xfc\x03,\xff\xd7\x01\xfc\x03-\xff\xae\x01\ +\xfc\x03.\xff\xd7\x01\xfc\x03/\xff\xae\x01\xfc\x030\xff\ +\xd7\x01\xfc\x031\xff\xae\x01\xfc\x032\xff\xd7\x01\xfc\x03\ +3\xff\xae\x01\xfc\x034\xff\xd7\x01\xfc\x036\xff\xd7\x01\ +\xfc\x038\xff\xd7\x01\xfc\x03:\xff\xd7\x01\xfc\x03<\xff\ +\xd7\x01\xfc\x03@\xff\xd7\x01\xfc\x03B\xff\xd7\x01\xfc\x03\ +D\xff\xd7\x01\xfc\x03I\xff\xec\x01\xfc\x03J\xff\xd7\x01\ +\xfc\x03K\xff\xec\x01\xfc\x03L\xff\xd7\x01\xfc\x03M\xff\ +\xec\x01\xfc\x03N\xff\xd7\x01\xfc\x03O\xff\xec\x01\xfc\x03\ +Q\xff\xec\x01\xfc\x03R\xff\xd7\x01\xfc\x03S\xff\xec\x01\ +\xfc\x03T\xff\xd7\x01\xfc\x03U\xff\xec\x01\xfc\x03V\xff\ +\xd7\x01\xfc\x03W\xff\xec\x01\xfc\x03X\xff\xd7\x01\xfc\x03\ +Y\xff\xec\x01\xfc\x03Z\xff\xd7\x01\xfc\x03[\xff\xec\x01\ +\xfc\x03\x5c\xff\xd7\x01\xfc\x03]\xff\xec\x01\xfc\x03^\xff\ +\xd7\x01\xfc\x03_\xff\xec\x01\xfc\x03`\xff\xd7\x01\xfc\x03\ +b\xff\xec\x01\xfc\x03d\xff\xec\x01\xfc\x03f\xff\xec\x01\ +\xfc\x03h\xff\xec\x01\xfc\x03j\xff\xec\x01\xfc\x03l\xff\ +\xec\x01\xfc\x03n\xff\xec\x01\xfd\x00\x05\x00R\x01\xfd\x00\ +\x0a\x00R\x01\xfd\x00\x0f\xff\xae\x01\xfd\x00\x11\xff\xae\x01\ +\xfd\x00\x22\x00)\x01\xfd\x02\x07\x00R\x01\xfd\x02\x08\xff\ +\xae\x01\xfd\x02\x0b\x00R\x01\xfd\x02\x0c\xff\xae\x01\xfe\x00\ +\x0f\xff\x9a\x01\xfe\x00\x11\xff\x9a\x01\xfe\x00\x22\x00)\x01\ +\xfe\x00$\xff\xae\x01\xfe\x00&\xff\xec\x01\xfe\x00*\xff\ +\xec\x01\xfe\x002\xff\xec\x01\xfe\x004\xff\xec\x01\xfe\x00\ +D\xff\xd7\x01\xfe\x00F\xff\xd7\x01\xfe\x00G\xff\xd7\x01\ +\xfe\x00H\xff\xd7\x01\xfe\x00J\xff\xec\x01\xfe\x00P\xff\ +\xec\x01\xfe\x00Q\xff\xec\x01\xfe\x00R\xff\xd7\x01\xfe\x00\ +S\xff\xec\x01\xfe\x00T\xff\xd7\x01\xfe\x00U\xff\xec\x01\ +\xfe\x00V\xff\xec\x01\xfe\x00X\xff\xec\x01\xfe\x00\x82\xff\ +\xae\x01\xfe\x00\x83\xff\xae\x01\xfe\x00\x84\xff\xae\x01\xfe\x00\ +\x85\xff\xae\x01\xfe\x00\x86\xff\xae\x01\xfe\x00\x87\xff\xae\x01\ +\xfe\x00\x89\xff\xec\x01\xfe\x00\x94\xff\xec\x01\xfe\x00\x95\xff\ +\xec\x01\xfe\x00\x96\xff\xec\x01\xfe\x00\x97\xff\xec\x01\xfe\x00\ +\x98\xff\xec\x01\xfe\x00\x9a\xff\xec\x01\xfe\x00\xa2\xff\xd7\x01\ +\xfe\x00\xa3\xff\xd7\x01\xfe\x00\xa4\xff\xd7\x01\xfe\x00\xa5\xff\ +\xd7\x01\xfe\x00\xa6\xff\xd7\x01\xfe\x00\xa7\xff\xd7\x01\xfe\x00\ +\xa8\xff\xd7\x01\xfe\x00\xa9\xff\xd7\x01\xfe\x00\xaa\xff\xd7\x01\ +\xfe\x00\xab\xff\xd7\x01\xfe\x00\xac\xff\xd7\x01\xfe\x00\xad\xff\ +\xd7\x01\xfe\x00\xb4\xff\xd7\x01\xfe\x00\xb5\xff\xd7\x01\xfe\x00\ +\xb6\xff\xd7\x01\xfe\x00\xb7\xff\xd7\x01\xfe\x00\xb8\xff\xd7\x01\ +\xfe\x00\xba\xff\xd7\x01\xfe\x00\xbb\xff\xec\x01\xfe\x00\xbc\xff\ +\xec\x01\xfe\x00\xbd\xff\xec\x01\xfe\x00\xbe\xff\xec\x01\xfe\x00\ +\xc2\xff\xae\x01\xfe\x00\xc3\xff\xd7\x01\xfe\x00\xc4\xff\xae\x01\ +\xfe\x00\xc5\xff\xd7\x01\xfe\x00\xc6\xff\xae\x01\xfe\x00\xc7\xff\ +\xd7\x01\xfe\x00\xc8\xff\xec\x01\xfe\x00\xc9\xff\xd7\x01\xfe\x00\ +\xca\xff\xec\x01\xfe\x00\xcb\xff\xd7\x01\xfe\x00\xcc\xff\xec\x01\ +\xfe\x00\xcd\xff\xd7\x01\xfe\x00\xce\xff\xec\x01\xfe\x00\xcf\xff\ +\xd7\x01\xfe\x00\xd1\xff\xd7\x01\xfe\x00\xd3\xff\xd7\x01\xfe\x00\ +\xd5\xff\xd7\x01\xfe\x00\xd7\xff\xd7\x01\xfe\x00\xd9\xff\xd7\x01\ +\xfe\x00\xdb\xff\xd7\x01\xfe\x00\xdd\xff\xd7\x01\xfe\x00\xde\xff\ +\xec\x01\xfe\x00\xdf\xff\xec\x01\xfe\x00\xe0\xff\xec\x01\xfe\x00\ +\xe1\xff\xec\x01\xfe\x00\xe2\xff\xec\x01\xfe\x00\xe3\xff\xec\x01\ +\xfe\x00\xe4\xff\xec\x01\xfe\x00\xe5\xff\xec\x01\xfe\x00\xfa\xff\ +\xec\x01\xfe\x01\x06\xff\xec\x01\xfe\x01\x08\xff\xec\x01\xfe\x01\ +\x0d\xff\xec\x01\xfe\x01\x0e\xff\xec\x01\xfe\x01\x0f\xff\xd7\x01\ +\xfe\x01\x10\xff\xec\x01\xfe\x01\x11\xff\xd7\x01\xfe\x01\x12\xff\ +\xec\x01\xfe\x01\x13\xff\xd7\x01\xfe\x01\x14\xff\xec\x01\xfe\x01\ +\x15\xff\xd7\x01\xfe\x01\x17\xff\xec\x01\xfe\x01\x19\xff\xec\x01\ +\xfe\x01\x1d\xff\xec\x01\xfe\x01!\xff\xec\x01\xfe\x01+\xff\ +\xec\x01\xfe\x01-\xff\xec\x01\xfe\x01/\xff\xec\x01\xfe\x01\ +1\xff\xec\x01\xfe\x013\xff\xec\x01\xfe\x015\xff\xec\x01\ +\xfe\x01C\xff\xae\x01\xfe\x01D\xff\xd7\x01\xfe\x01F\xff\ +\xd7\x01\xfe\x01G\xff\xec\x01\xfe\x01H\xff\xd7\x01\xfe\x01\ +J\xff\xec\x01\xfe\x02\x08\xff\x9a\x01\xfe\x02\x0c\xff\x9a\x01\ +\xfe\x02W\xff\xec\x01\xfe\x02X\xff\xae\x01\xfe\x02Y\xff\ +\xd7\x01\xfe\x02_\xff\xec\x01\xfe\x02`\xff\xd7\x01\xfe\x02\ +b\xff\xec\x01\xfe\x03\x1d\xff\xae\x01\xfe\x03\x1e\xff\xd7\x01\ +\xfe\x03\x1f\xff\xae\x01\xfe\x03 \xff\xd7\x01\xfe\x03!\xff\ +\xae\x01\xfe\x03\x22\xff\xd7\x01\xfe\x03#\xff\xae\x01\xfe\x03\ +%\xff\xae\x01\xfe\x03&\xff\xd7\x01\xfe\x03'\xff\xae\x01\ +\xfe\x03(\xff\xd7\x01\xfe\x03)\xff\xae\x01\xfe\x03*\xff\ +\xd7\x01\xfe\x03+\xff\xae\x01\xfe\x03,\xff\xd7\x01\xfe\x03\ +-\xff\xae\x01\xfe\x03.\xff\xd7\x01\xfe\x03/\xff\xae\x01\ +\xfe\x030\xff\xd7\x01\xfe\x031\xff\xae\x01\xfe\x032\xff\ +\xd7\x01\xfe\x033\xff\xae\x01\xfe\x034\xff\xd7\x01\xfe\x03\ +6\xff\xd7\x01\xfe\x038\xff\xd7\x01\xfe\x03:\xff\xd7\x01\ +\xfe\x03<\xff\xd7\x01\xfe\x03@\xff\xd7\x01\xfe\x03B\xff\ +\xd7\x01\xfe\x03D\xff\xd7\x01\xfe\x03I\xff\xec\x01\xfe\x03\ +J\xff\xd7\x01\xfe\x03K\xff\xec\x01\xfe\x03L\xff\xd7\x01\ +\xfe\x03M\xff\xec\x01\xfe\x03N\xff\xd7\x01\xfe\x03O\xff\ +\xec\x01\xfe\x03Q\xff\xec\x01\xfe\x03R\xff\xd7\x01\xfe\x03\ +S\xff\xec\x01\xfe\x03T\xff\xd7\x01\xfe\x03U\xff\xec\x01\ +\xfe\x03V\xff\xd7\x01\xfe\x03W\xff\xec\x01\xfe\x03X\xff\ +\xd7\x01\xfe\x03Y\xff\xec\x01\xfe\x03Z\xff\xd7\x01\xfe\x03\ +[\xff\xec\x01\xfe\x03\x5c\xff\xd7\x01\xfe\x03]\xff\xec\x01\ +\xfe\x03^\xff\xd7\x01\xfe\x03_\xff\xec\x01\xfe\x03`\xff\ +\xd7\x01\xfe\x03b\xff\xec\x01\xfe\x03d\xff\xec\x01\xfe\x03\ +f\xff\xec\x01\xfe\x03h\xff\xec\x01\xfe\x03j\xff\xec\x01\ +\xfe\x03l\xff\xec\x01\xfe\x03n\xff\xec\x01\xff\x00\x05\x00\ +R\x01\xff\x00\x0a\x00R\x01\xff\x00\x0f\xff\xae\x01\xff\x00\ +\x11\xff\xae\x01\xff\x00\x22\x00)\x01\xff\x02\x07\x00R\x01\ +\xff\x02\x08\xff\xae\x01\xff\x02\x0b\x00R\x01\xff\x02\x0c\xff\ +\xae\x02\x00\x00\x0f\xff\x85\x02\x00\x00\x11\xff\x85\x02\x00\x00\ +\x22\x00)\x02\x00\x00$\xff\x85\x02\x00\x00&\xff\xd7\x02\ +\x00\x00*\xff\xd7\x02\x00\x002\xff\xd7\x02\x00\x004\xff\ +\xd7\x02\x00\x00D\xff\x9a\x02\x00\x00F\xff\x9a\x02\x00\x00\ +G\xff\x9a\x02\x00\x00H\xff\x9a\x02\x00\x00J\xff\xd7\x02\ +\x00\x00P\xff\xc3\x02\x00\x00Q\xff\xc3\x02\x00\x00R\xff\ +\x9a\x02\x00\x00S\xff\xc3\x02\x00\x00T\xff\x9a\x02\x00\x00\ +U\xff\xc3\x02\x00\x00V\xff\xae\x02\x00\x00X\xff\xc3\x02\ +\x00\x00]\xff\xd7\x02\x00\x00\x82\xff\x85\x02\x00\x00\x83\xff\ +\x85\x02\x00\x00\x84\xff\x85\x02\x00\x00\x85\xff\x85\x02\x00\x00\ +\x86\xff\x85\x02\x00\x00\x87\xff\x85\x02\x00\x00\x89\xff\xd7\x02\ +\x00\x00\x94\xff\xd7\x02\x00\x00\x95\xff\xd7\x02\x00\x00\x96\xff\ +\xd7\x02\x00\x00\x97\xff\xd7\x02\x00\x00\x98\xff\xd7\x02\x00\x00\ +\x9a\xff\xd7\x02\x00\x00\xa2\xff\x9a\x02\x00\x00\xa3\xff\x9a\x02\ +\x00\x00\xa4\xff\x9a\x02\x00\x00\xa5\xff\x9a\x02\x00\x00\xa6\xff\ +\x9a\x02\x00\x00\xa7\xff\x9a\x02\x00\x00\xa8\xff\x9a\x02\x00\x00\ +\xa9\xff\x9a\x02\x00\x00\xaa\xff\x9a\x02\x00\x00\xab\xff\x9a\x02\ +\x00\x00\xac\xff\x9a\x02\x00\x00\xad\xff\x9a\x02\x00\x00\xb4\xff\ +\x9a\x02\x00\x00\xb5\xff\x9a\x02\x00\x00\xb6\xff\x9a\x02\x00\x00\ +\xb7\xff\x9a\x02\x00\x00\xb8\xff\x9a\x02\x00\x00\xba\xff\x9a\x02\ +\x00\x00\xbb\xff\xc3\x02\x00\x00\xbc\xff\xc3\x02\x00\x00\xbd\xff\ +\xc3\x02\x00\x00\xbe\xff\xc3\x02\x00\x00\xc2\xff\x85\x02\x00\x00\ +\xc3\xff\x9a\x02\x00\x00\xc4\xff\x85\x02\x00\x00\xc5\xff\x9a\x02\ +\x00\x00\xc6\xff\x85\x02\x00\x00\xc7\xff\x9a\x02\x00\x00\xc8\xff\ +\xd7\x02\x00\x00\xc9\xff\x9a\x02\x00\x00\xca\xff\xd7\x02\x00\x00\ +\xcb\xff\x9a\x02\x00\x00\xcc\xff\xd7\x02\x00\x00\xcd\xff\x9a\x02\ +\x00\x00\xce\xff\xd7\x02\x00\x00\xcf\xff\x9a\x02\x00\x00\xd1\xff\ +\x9a\x02\x00\x00\xd3\xff\x9a\x02\x00\x00\xd5\xff\x9a\x02\x00\x00\ +\xd7\xff\x9a\x02\x00\x00\xd9\xff\x9a\x02\x00\x00\xdb\xff\x9a\x02\ +\x00\x00\xdd\xff\x9a\x02\x00\x00\xde\xff\xd7\x02\x00\x00\xdf\xff\ +\xd7\x02\x00\x00\xe0\xff\xd7\x02\x00\x00\xe1\xff\xd7\x02\x00\x00\ +\xe2\xff\xd7\x02\x00\x00\xe3\xff\xd7\x02\x00\x00\xe4\xff\xd7\x02\ +\x00\x00\xe5\xff\xd7\x02\x00\x00\xfa\xff\xc3\x02\x00\x01\x06\xff\ +\xc3\x02\x00\x01\x08\xff\xc3\x02\x00\x01\x0d\xff\xc3\x02\x00\x01\ +\x0e\xff\xd7\x02\x00\x01\x0f\xff\x9a\x02\x00\x01\x10\xff\xd7\x02\ +\x00\x01\x11\xff\x9a\x02\x00\x01\x12\xff\xd7\x02\x00\x01\x13\xff\ +\x9a\x02\x00\x01\x14\xff\xd7\x02\x00\x01\x15\xff\x9a\x02\x00\x01\ +\x17\xff\xc3\x02\x00\x01\x19\xff\xc3\x02\x00\x01\x1d\xff\xae\x02\ +\x00\x01!\xff\xae\x02\x00\x01+\xff\xc3\x02\x00\x01-\xff\ +\xc3\x02\x00\x01/\xff\xc3\x02\x00\x011\xff\xc3\x02\x00\x01\ +3\xff\xc3\x02\x00\x015\xff\xc3\x02\x00\x01<\xff\xd7\x02\ +\x00\x01>\xff\xd7\x02\x00\x01@\xff\xd7\x02\x00\x01C\xff\ +\x85\x02\x00\x01D\xff\x9a\x02\x00\x01F\xff\x9a\x02\x00\x01\ +G\xff\xd7\x02\x00\x01H\xff\x9a\x02\x00\x01J\xff\xae\x02\ +\x00\x02\x08\xff\x85\x02\x00\x02\x0c\xff\x85\x02\x00\x02W\xff\ +\xc3\x02\x00\x02X\xff\x85\x02\x00\x02Y\xff\x9a\x02\x00\x02\ +_\xff\xd7\x02\x00\x02`\xff\x9a\x02\x00\x02b\xff\xc3\x02\ +\x00\x03\x1d\xff\x85\x02\x00\x03\x1e\xff\x9a\x02\x00\x03\x1f\xff\ +\x85\x02\x00\x03 \xff\x9a\x02\x00\x03!\xff\x85\x02\x00\x03\ +\x22\xff\x9a\x02\x00\x03#\xff\x85\x02\x00\x03%\xff\x85\x02\ +\x00\x03&\xff\x9a\x02\x00\x03'\xff\x85\x02\x00\x03(\xff\ +\x9a\x02\x00\x03)\xff\x85\x02\x00\x03*\xff\x9a\x02\x00\x03\ ++\xff\x85\x02\x00\x03,\xff\x9a\x02\x00\x03-\xff\x85\x02\ +\x00\x03.\xff\x9a\x02\x00\x03/\xff\x85\x02\x00\x030\xff\ +\x9a\x02\x00\x031\xff\x85\x02\x00\x032\xff\x9a\x02\x00\x03\ +3\xff\x85\x02\x00\x034\xff\x9a\x02\x00\x036\xff\x9a\x02\ +\x00\x038\xff\x9a\x02\x00\x03:\xff\x9a\x02\x00\x03<\xff\ +\x9a\x02\x00\x03@\xff\x9a\x02\x00\x03B\xff\x9a\x02\x00\x03\ +D\xff\x9a\x02\x00\x03I\xff\xd7\x02\x00\x03J\xff\x9a\x02\ +\x00\x03K\xff\xd7\x02\x00\x03L\xff\x9a\x02\x00\x03M\xff\ +\xd7\x02\x00\x03N\xff\x9a\x02\x00\x03O\xff\xd7\x02\x00\x03\ +Q\xff\xd7\x02\x00\x03R\xff\x9a\x02\x00\x03S\xff\xd7\x02\ +\x00\x03T\xff\x9a\x02\x00\x03U\xff\xd7\x02\x00\x03V\xff\ +\x9a\x02\x00\x03W\xff\xd7\x02\x00\x03X\xff\x9a\x02\x00\x03\ +Y\xff\xd7\x02\x00\x03Z\xff\x9a\x02\x00\x03[\xff\xd7\x02\ +\x00\x03\x5c\xff\x9a\x02\x00\x03]\xff\xd7\x02\x00\x03^\xff\ +\x9a\x02\x00\x03_\xff\xd7\x02\x00\x03`\xff\x9a\x02\x00\x03\ +b\xff\xc3\x02\x00\x03d\xff\xc3\x02\x00\x03f\xff\xc3\x02\ +\x00\x03h\xff\xc3\x02\x00\x03j\xff\xc3\x02\x00\x03l\xff\ +\xc3\x02\x00\x03n\xff\xc3\x02\x01\x00\x05\x00R\x02\x01\x00\ +\x0a\x00R\x02\x01\x00\x0f\xff\xae\x02\x01\x00\x11\xff\xae\x02\ +\x01\x00\x22\x00)\x02\x01\x02\x07\x00R\x02\x01\x02\x08\xff\ +\xae\x02\x01\x02\x0b\x00R\x02\x01\x02\x0c\xff\xae\x02\x02\x00\ +7\xff\xae\x02\x02\x01$\xff\xae\x02\x02\x01&\xff\xae\x02\ +\x02\x01q\xff\xae\x02\x02\x01\x9d\xff\xae\x02\x02\x01\xa6\xff\ +\xae\x02\x02\x01\xbc\xff\xae\x02\x02\x01\xc4\xff\xae\x02\x02\x01\ +\xdc\xff\xd7\x02\x02\x01\xe4\xff\xd7\x02\x02\x02\xa9\xff\xae\x02\ +\x02\x02\xaa\xff\xd7\x02\x02\x02\xb5\xff\xae\x02\x02\x02\xb6\xff\ +\xd7\x02\x02\x02\xbd\xff\xae\x02\x02\x02\xbe\xff\xd7\x02\x02\x03\ +\x17\xff\xae\x02\x02\x03\x18\xff\xd7\x02\x02\x03\x8f\xff\xae\x02\ +\x03\x007\xff\xae\x02\x03\x01$\xff\xae\x02\x03\x01&\xff\ +\xae\x02\x03\x01q\xff\xae\x02\x03\x01\x9d\xff\xae\x02\x03\x01\ +\xa6\xff\xae\x02\x03\x01\xbc\xff\xae\x02\x03\x01\xc4\xff\xae\x02\ +\x03\x01\xdc\xff\xd7\x02\x03\x01\xe4\xff\xd7\x02\x03\x02\xa9\xff\ +\xae\x02\x03\x02\xaa\xff\xd7\x02\x03\x02\xb5\xff\xae\x02\x03\x02\ +\xb6\xff\xd7\x02\x03\x02\xbd\xff\xae\x02\x03\x02\xbe\xff\xd7\x02\ +\x03\x03\x17\xff\xae\x02\x03\x03\x18\xff\xd7\x02\x03\x03\x8f\xff\ +\xae\x02\x04\x007\xff\xae\x02\x04\x01$\xff\xae\x02\x04\x01\ +&\xff\xae\x02\x04\x01q\xff\xae\x02\x04\x01\x9d\xff\xae\x02\ +\x04\x01\xa6\xff\xae\x02\x04\x01\xbc\xff\xae\x02\x04\x01\xc4\xff\ +\xae\x02\x04\x01\xdc\xff\xd7\x02\x04\x01\xe4\xff\xd7\x02\x04\x02\ +\xa9\xff\xae\x02\x04\x02\xaa\xff\xd7\x02\x04\x02\xb5\xff\xae\x02\ +\x04\x02\xb6\xff\xd7\x02\x04\x02\xbd\xff\xae\x02\x04\x02\xbe\xff\ +\xd7\x02\x04\x03\x17\xff\xae\x02\x04\x03\x18\xff\xd7\x02\x04\x03\ +\x8f\xff\xae\x02\x06\x00$\xffq\x02\x06\x007\x00)\x02\ +\x06\x009\x00)\x02\x06\x00:\x00)\x02\x06\x00<\x00\ +\x14\x02\x06\x00D\xff\xae\x02\x06\x00F\xff\x85\x02\x06\x00\ +G\xff\x85\x02\x06\x00H\xff\x85\x02\x06\x00J\xff\xc3\x02\ +\x06\x00P\xff\xc3\x02\x06\x00Q\xff\xc3\x02\x06\x00R\xff\ +\x85\x02\x06\x00S\xff\xc3\x02\x06\x00T\xff\x85\x02\x06\x00\ +U\xff\xc3\x02\x06\x00V\xff\xc3\x02\x06\x00X\xff\xc3\x02\ +\x06\x00\x82\xffq\x02\x06\x00\x83\xffq\x02\x06\x00\x84\xff\ +q\x02\x06\x00\x85\xffq\x02\x06\x00\x86\xffq\x02\x06\x00\ +\x87\xffq\x02\x06\x00\x9f\x00\x14\x02\x06\x00\xa2\xff\x85\x02\ +\x06\x00\xa3\xff\xae\x02\x06\x00\xa4\xff\xae\x02\x06\x00\xa5\xff\ +\xae\x02\x06\x00\xa6\xff\xae\x02\x06\x00\xa7\xff\xae\x02\x06\x00\ +\xa8\xff\xae\x02\x06\x00\xa9\xff\x85\x02\x06\x00\xaa\xff\x85\x02\ +\x06\x00\xab\xff\x85\x02\x06\x00\xac\xff\x85\x02\x06\x00\xad\xff\ +\x85\x02\x06\x00\xb4\xff\x85\x02\x06\x00\xb5\xff\x85\x02\x06\x00\ +\xb6\xff\x85\x02\x06\x00\xb7\xff\x85\x02\x06\x00\xb8\xff\x85\x02\ +\x06\x00\xba\xff\x85\x02\x06\x00\xbb\xff\xc3\x02\x06\x00\xbc\xff\ +\xc3\x02\x06\x00\xbd\xff\xc3\x02\x06\x00\xbe\xff\xc3\x02\x06\x00\ +\xc2\xffq\x02\x06\x00\xc3\xff\xae\x02\x06\x00\xc4\xffq\x02\ +\x06\x00\xc5\xff\xae\x02\x06\x00\xc6\xffq\x02\x06\x00\xc7\xff\ +\xae\x02\x06\x00\xc9\xff\x85\x02\x06\x00\xcb\xff\x85\x02\x06\x00\ +\xcd\xff\x85\x02\x06\x00\xcf\xff\x85\x02\x06\x00\xd1\xff\x85\x02\ +\x06\x00\xd3\xff\x85\x02\x06\x00\xd5\xff\x85\x02\x06\x00\xd7\xff\ +\x85\x02\x06\x00\xd9\xff\x85\x02\x06\x00\xdb\xff\x85\x02\x06\x00\ +\xdd\xff\x85\x02\x06\x00\xdf\xff\xc3\x02\x06\x00\xe1\xff\xc3\x02\ +\x06\x00\xe3\xff\xc3\x02\x06\x00\xe5\xff\xc3\x02\x06\x00\xfa\xff\ +\xc3\x02\x06\x01\x06\xff\xc3\x02\x06\x01\x08\xff\xc3\x02\x06\x01\ +\x0d\xff\xc3\x02\x06\x01\x0f\xff\x85\x02\x06\x01\x11\xff\x85\x02\ +\x06\x01\x13\xff\x85\x02\x06\x01\x15\xff\x85\x02\x06\x01\x17\xff\ +\xc3\x02\x06\x01\x19\xff\xc3\x02\x06\x01\x1d\xff\xc3\x02\x06\x01\ +!\xff\xc3\x02\x06\x01$\x00)\x02\x06\x01&\x00)\x02\ +\x06\x01+\xff\xc3\x02\x06\x01-\xff\xc3\x02\x06\x01/\xff\ +\xc3\x02\x06\x011\xff\xc3\x02\x06\x013\xff\xc3\x02\x06\x01\ +5\xff\xc3\x02\x06\x016\x00)\x02\x06\x018\x00\x14\x02\ +\x06\x01:\x00\x14\x02\x06\x01C\xffq\x02\x06\x01D\xff\ +\xae\x02\x06\x01F\xff\xae\x02\x06\x01H\xff\x85\x02\x06\x01\ +J\xff\xc3\x02\x06\x01V\xffq\x02\x06\x01_\xffq\x02\ +\x06\x01b\xffq\x02\x06\x01i\xffq\x02\x06\x01y\xff\ +\xae\x02\x06\x01z\xff\xd7\x02\x06\x01{\xff\xd7\x02\x06\x01\ +~\xff\xae\x02\x06\x01\x81\xff\xc3\x02\x06\x01\x82\xff\xd7\x02\ +\x06\x01\x83\xff\xd7\x02\x06\x01\x84\xff\xd7\x02\x06\x01\x87\xff\ +\xd7\x02\x06\x01\x89\xff\xd7\x02\x06\x01\x8c\xff\xae\x02\x06\x01\ +\x8e\xff\xc3\x02\x06\x01\x8f\xff\xae\x02\x06\x01\x90\xff\xae\x02\ +\x06\x01\x93\xff\xae\x02\x06\x01\x99\xff\xae\x02\x06\x01\xa4\xff\ +\x85\x02\x06\x01\xaa\xffq\x02\x06\x01\xae\xff\x85\x02\x06\x01\ +\xb5\xff\x85\x02\x06\x01\xca\xff\xd7\x02\x06\x01\xce\xffq\x02\ +\x06\x01\xcf\xff\x85\x02\x06\x01\xd5\xffq\x02\x06\x01\xd8\xff\ +\x85\x02\x06\x01\xdb\xff\x85\x02\x06\x01\xde\xff\x85\x02\x06\x01\ +\xea\xff\x85\x02\x06\x01\xed\xff\x85\x02\x06\x01\xee\xff\xc3\x02\ +\x06\x01\xf2\xffq\x02\x06\x01\xfa\x00)\x02\x06\x01\xfc\x00\ +)\x02\x06\x01\xfe\x00)\x02\x06\x02\x00\x00\x14\x02\x06\x02\ +W\xff\xc3\x02\x06\x02X\xffq\x02\x06\x02Y\xff\xae\x02\ +\x06\x02`\xff\x85\x02\x06\x02b\xff\xc3\x02\x06\x02j\xff\ +\x85\x02\x06\x02r\xffq\x02\x06\x02s\xffq\x02\x06\x02\ +}\xff\xec\x02\x06\x02\x7f\xff\x85\x02\x06\x02\x85\xff\x85\x02\ +\x06\x02\x87\xff\x85\x02\x06\x02\x89\xff\x85\x02\x06\x02\x8d\xff\ +\x85\x02\x06\x02\xb2\xff\x85\x02\x06\x02\xb4\xff\x85\x02\x06\x02\ +\xce\xff\x85\x02\x06\x02\xcf\xffq\x02\x06\x02\xd9\xffq\x02\ +\x06\x02\xda\xff\xd7\x02\x06\x02\xdb\xffq\x02\x06\x02\xdc\xff\ +\xd7\x02\x06\x02\xdd\xffq\x02\x06\x02\xde\xff\xd7\x02\x06\x02\ +\xe0\xff\x85\x02\x06\x02\xe2\xff\xd7\x02\x06\x02\xe4\xff\xd7\x02\ +\x06\x02\xf0\xff\x85\x02\x06\x02\xf2\xff\x85\x02\x06\x02\xf4\xff\ +\x85\x02\x06\x03\x09\xffq\x02\x06\x03\x0a\xff\x85\x02\x06\x03\ +\x0b\xffq\x02\x06\x03\x0c\xff\x85\x02\x06\x03\x11\xff\x85\x02\ +\x06\x03\x12\xffq\x02\x06\x03\x16\xff\x85\x02\x06\x03\x1a\xff\ +\x85\x02\x06\x03\x1b\xff\x85\x02\x06\x03\x1c\xffq\x02\x06\x03\ +\x1d\xffq\x02\x06\x03\x1e\xff\xae\x02\x06\x03\x1f\xffq\x02\ +\x06\x03 \xff\xae\x02\x06\x03!\xffq\x02\x06\x03\x22\xff\ +\xae\x02\x06\x03#\xffq\x02\x06\x03%\xffq\x02\x06\x03\ +&\xff\xae\x02\x06\x03'\xffq\x02\x06\x03(\xff\xae\x02\ +\x06\x03)\xffq\x02\x06\x03*\xff\xae\x02\x06\x03+\xff\ +q\x02\x06\x03,\xff\xae\x02\x06\x03-\xffq\x02\x06\x03\ +.\xff\xae\x02\x06\x03/\xffq\x02\x06\x030\xff\xae\x02\ +\x06\x031\xffq\x02\x06\x032\xff\xae\x02\x06\x033\xff\ +q\x02\x06\x034\xff\xae\x02\x06\x036\xff\x85\x02\x06\x03\ +8\xff\x85\x02\x06\x03:\xff\x85\x02\x06\x03<\xff\x85\x02\ +\x06\x03@\xff\x85\x02\x06\x03B\xff\x85\x02\x06\x03D\xff\ +\x85\x02\x06\x03J\xff\x85\x02\x06\x03L\xff\x85\x02\x06\x03\ +N\xff\x85\x02\x06\x03R\xff\x85\x02\x06\x03T\xff\x85\x02\ +\x06\x03V\xff\x85\x02\x06\x03X\xff\x85\x02\x06\x03Z\xff\ +\x85\x02\x06\x03\x5c\xff\x85\x02\x06\x03^\xff\x85\x02\x06\x03\ +`\xff\x85\x02\x06\x03b\xff\xc3\x02\x06\x03d\xff\xc3\x02\ +\x06\x03f\xff\xc3\x02\x06\x03h\xff\xc3\x02\x06\x03j\xff\ +\xc3\x02\x06\x03l\xff\xc3\x02\x06\x03n\xff\xc3\x02\x06\x03\ +o\x00\x14\x02\x06\x03q\x00\x14\x02\x06\x03s\x00\x14\x02\ +\x06\x03\x8f\x00)\x02\x07\x00$\xffq\x02\x07\x007\x00\ +)\x02\x07\x009\x00)\x02\x07\x00:\x00)\x02\x07\x00\ +<\x00\x14\x02\x07\x00D\xff\xae\x02\x07\x00F\xff\x85\x02\ +\x07\x00G\xff\x85\x02\x07\x00H\xff\x85\x02\x07\x00J\xff\ +\xc3\x02\x07\x00P\xff\xc3\x02\x07\x00Q\xff\xc3\x02\x07\x00\ +R\xff\x85\x02\x07\x00S\xff\xc3\x02\x07\x00T\xff\x85\x02\ +\x07\x00U\xff\xc3\x02\x07\x00V\xff\xc3\x02\x07\x00X\xff\ +\xc3\x02\x07\x00\x82\xffq\x02\x07\x00\x83\xffq\x02\x07\x00\ +\x84\xffq\x02\x07\x00\x85\xffq\x02\x07\x00\x86\xffq\x02\ +\x07\x00\x87\xffq\x02\x07\x00\x9f\x00\x14\x02\x07\x00\xa2\xff\ +\x85\x02\x07\x00\xa3\xff\xae\x02\x07\x00\xa4\xff\xae\x02\x07\x00\ +\xa5\xff\xae\x02\x07\x00\xa6\xff\xae\x02\x07\x00\xa7\xff\xae\x02\ +\x07\x00\xa8\xff\xae\x02\x07\x00\xa9\xff\x85\x02\x07\x00\xaa\xff\ +\x85\x02\x07\x00\xab\xff\x85\x02\x07\x00\xac\xff\x85\x02\x07\x00\ +\xad\xff\x85\x02\x07\x00\xb4\xff\x85\x02\x07\x00\xb5\xff\x85\x02\ +\x07\x00\xb6\xff\x85\x02\x07\x00\xb7\xff\x85\x02\x07\x00\xb8\xff\ +\x85\x02\x07\x00\xba\xff\x85\x02\x07\x00\xbb\xff\xc3\x02\x07\x00\ +\xbc\xff\xc3\x02\x07\x00\xbd\xff\xc3\x02\x07\x00\xbe\xff\xc3\x02\ +\x07\x00\xc2\xffq\x02\x07\x00\xc3\xff\xae\x02\x07\x00\xc4\xff\ +q\x02\x07\x00\xc5\xff\xae\x02\x07\x00\xc6\xffq\x02\x07\x00\ +\xc7\xff\xae\x02\x07\x00\xc9\xff\x85\x02\x07\x00\xcb\xff\x85\x02\ +\x07\x00\xcd\xff\x85\x02\x07\x00\xcf\xff\x85\x02\x07\x00\xd1\xff\ +\x85\x02\x07\x00\xd3\xff\x85\x02\x07\x00\xd5\xff\x85\x02\x07\x00\ +\xd7\xff\x85\x02\x07\x00\xd9\xff\x85\x02\x07\x00\xdb\xff\x85\x02\ +\x07\x00\xdd\xff\x85\x02\x07\x00\xdf\xff\xc3\x02\x07\x00\xe1\xff\ +\xc3\x02\x07\x00\xe3\xff\xc3\x02\x07\x00\xe5\xff\xc3\x02\x07\x00\ +\xfa\xff\xc3\x02\x07\x01\x06\xff\xc3\x02\x07\x01\x08\xff\xc3\x02\ +\x07\x01\x0d\xff\xc3\x02\x07\x01\x0f\xff\x85\x02\x07\x01\x11\xff\ +\x85\x02\x07\x01\x13\xff\x85\x02\x07\x01\x15\xff\x85\x02\x07\x01\ +\x17\xff\xc3\x02\x07\x01\x19\xff\xc3\x02\x07\x01\x1d\xff\xc3\x02\ +\x07\x01!\xff\xc3\x02\x07\x01$\x00)\x02\x07\x01&\x00\ +)\x02\x07\x01+\xff\xc3\x02\x07\x01-\xff\xc3\x02\x07\x01\ +/\xff\xc3\x02\x07\x011\xff\xc3\x02\x07\x013\xff\xc3\x02\ +\x07\x015\xff\xc3\x02\x07\x016\x00)\x02\x07\x018\x00\ +\x14\x02\x07\x01:\x00\x14\x02\x07\x01C\xffq\x02\x07\x01\ +D\xff\xae\x02\x07\x01F\xff\xae\x02\x07\x01H\xff\x85\x02\ +\x07\x01J\xff\xc3\x02\x07\x01V\xffq\x02\x07\x01_\xff\ +q\x02\x07\x01b\xffq\x02\x07\x01i\xffq\x02\x07\x01\ +y\xff\xae\x02\x07\x01z\xff\xd7\x02\x07\x01{\xff\xd7\x02\ +\x07\x01~\xff\xae\x02\x07\x01\x81\xff\xc3\x02\x07\x01\x82\xff\ +\xd7\x02\x07\x01\x83\xff\xd7\x02\x07\x01\x84\xff\xd7\x02\x07\x01\ +\x87\xff\xd7\x02\x07\x01\x89\xff\xd7\x02\x07\x01\x8c\xff\xae\x02\ +\x07\x01\x8e\xff\xc3\x02\x07\x01\x8f\xff\xae\x02\x07\x01\x90\xff\ +\xae\x02\x07\x01\x93\xff\xae\x02\x07\x01\x99\xff\xae\x02\x07\x01\ +\xa4\xff\x85\x02\x07\x01\xaa\xffq\x02\x07\x01\xae\xff\x85\x02\ +\x07\x01\xb5\xff\x85\x02\x07\x01\xca\xff\xd7\x02\x07\x01\xce\xff\ +q\x02\x07\x01\xcf\xff\x85\x02\x07\x01\xd5\xffq\x02\x07\x01\ +\xd8\xff\x85\x02\x07\x01\xdb\xff\x85\x02\x07\x01\xde\xff\x85\x02\ +\x07\x01\xea\xff\x85\x02\x07\x01\xed\xff\x85\x02\x07\x01\xee\xff\ +\xc3\x02\x07\x01\xf2\xffq\x02\x07\x01\xfa\x00)\x02\x07\x01\ +\xfc\x00)\x02\x07\x01\xfe\x00)\x02\x07\x02\x00\x00\x14\x02\ +\x07\x02W\xff\xc3\x02\x07\x02X\xffq\x02\x07\x02Y\xff\ +\xae\x02\x07\x02`\xff\x85\x02\x07\x02b\xff\xc3\x02\x07\x02\ +j\xff\x85\x02\x07\x02r\xffq\x02\x07\x02s\xffq\x02\ +\x07\x02}\xff\xec\x02\x07\x02\x7f\xff\x85\x02\x07\x02\x85\xff\ +\x85\x02\x07\x02\x87\xff\x85\x02\x07\x02\x89\xff\x85\x02\x07\x02\ +\x8d\xff\x85\x02\x07\x02\xb2\xff\x85\x02\x07\x02\xb4\xff\x85\x02\ +\x07\x02\xce\xff\x85\x02\x07\x02\xcf\xffq\x02\x07\x02\xd9\xff\ +q\x02\x07\x02\xda\xff\xd7\x02\x07\x02\xdb\xffq\x02\x07\x02\ +\xdc\xff\xd7\x02\x07\x02\xdd\xffq\x02\x07\x02\xde\xff\xd7\x02\ +\x07\x02\xe0\xff\x85\x02\x07\x02\xe2\xff\xd7\x02\x07\x02\xe4\xff\ +\xd7\x02\x07\x02\xf0\xff\x85\x02\x07\x02\xf2\xff\x85\x02\x07\x02\ +\xf4\xff\x85\x02\x07\x03\x09\xffq\x02\x07\x03\x0a\xff\x85\x02\ +\x07\x03\x0b\xffq\x02\x07\x03\x0c\xff\x85\x02\x07\x03\x11\xff\ +\x85\x02\x07\x03\x12\xffq\x02\x07\x03\x16\xff\x85\x02\x07\x03\ +\x1a\xff\x85\x02\x07\x03\x1b\xff\x85\x02\x07\x03\x1c\xffq\x02\ +\x07\x03\x1d\xffq\x02\x07\x03\x1e\xff\xae\x02\x07\x03\x1f\xff\ +q\x02\x07\x03 \xff\xae\x02\x07\x03!\xffq\x02\x07\x03\ +\x22\xff\xae\x02\x07\x03#\xffq\x02\x07\x03%\xffq\x02\ +\x07\x03&\xff\xae\x02\x07\x03'\xffq\x02\x07\x03(\xff\ +\xae\x02\x07\x03)\xffq\x02\x07\x03*\xff\xae\x02\x07\x03\ ++\xffq\x02\x07\x03,\xff\xae\x02\x07\x03-\xffq\x02\ +\x07\x03.\xff\xae\x02\x07\x03/\xffq\x02\x07\x030\xff\ +\xae\x02\x07\x031\xffq\x02\x07\x032\xff\xae\x02\x07\x03\ +3\xffq\x02\x07\x034\xff\xae\x02\x07\x036\xff\x85\x02\ +\x07\x038\xff\x85\x02\x07\x03:\xff\x85\x02\x07\x03<\xff\ +\x85\x02\x07\x03@\xff\x85\x02\x07\x03B\xff\x85\x02\x07\x03\ +D\xff\x85\x02\x07\x03J\xff\x85\x02\x07\x03L\xff\x85\x02\ +\x07\x03N\xff\x85\x02\x07\x03R\xff\x85\x02\x07\x03T\xff\ +\x85\x02\x07\x03V\xff\x85\x02\x07\x03X\xff\x85\x02\x07\x03\ +Z\xff\x85\x02\x07\x03\x5c\xff\x85\x02\x07\x03^\xff\x85\x02\ +\x07\x03`\xff\x85\x02\x07\x03b\xff\xc3\x02\x07\x03d\xff\ +\xc3\x02\x07\x03f\xff\xc3\x02\x07\x03h\xff\xc3\x02\x07\x03\ +j\xff\xc3\x02\x07\x03l\xff\xc3\x02\x07\x03n\xff\xc3\x02\ +\x07\x03o\x00\x14\x02\x07\x03q\x00\x14\x02\x07\x03s\x00\ +\x14\x02\x07\x03\x8f\x00)\x02\x08\x00&\xff\x9a\x02\x08\x00\ +*\xff\x9a\x02\x08\x002\xff\x9a\x02\x08\x004\xff\x9a\x02\ +\x08\x007\xffq\x02\x08\x008\xff\xd7\x02\x08\x009\xff\ +\x85\x02\x08\x00:\xff\x85\x02\x08\x00<\xff\x85\x02\x08\x00\ +\x89\xff\x9a\x02\x08\x00\x94\xff\x9a\x02\x08\x00\x95\xff\x9a\x02\ +\x08\x00\x96\xff\x9a\x02\x08\x00\x97\xff\x9a\x02\x08\x00\x98\xff\ +\x9a\x02\x08\x00\x9a\xff\x9a\x02\x08\x00\x9b\xff\xd7\x02\x08\x00\ +\x9c\xff\xd7\x02\x08\x00\x9d\xff\xd7\x02\x08\x00\x9e\xff\xd7\x02\ +\x08\x00\x9f\xff\x85\x02\x08\x00\xc8\xff\x9a\x02\x08\x00\xca\xff\ +\x9a\x02\x08\x00\xcc\xff\x9a\x02\x08\x00\xce\xff\x9a\x02\x08\x00\ +\xde\xff\x9a\x02\x08\x00\xe0\xff\x9a\x02\x08\x00\xe2\xff\x9a\x02\ +\x08\x00\xe4\xff\x9a\x02\x08\x01\x0e\xff\x9a\x02\x08\x01\x10\xff\ +\x9a\x02\x08\x01\x12\xff\x9a\x02\x08\x01\x14\xff\x9a\x02\x08\x01\ +$\xffq\x02\x08\x01&\xffq\x02\x08\x01*\xff\xd7\x02\ +\x08\x01,\xff\xd7\x02\x08\x01.\xff\xd7\x02\x08\x010\xff\ +\xd7\x02\x08\x012\xff\xd7\x02\x08\x014\xff\xd7\x02\x08\x01\ +6\xff\x85\x02\x08\x018\xff\x85\x02\x08\x01:\xff\x85\x02\ +\x08\x01G\xff\x9a\x02\x08\x01f\xff\xae\x02\x08\x01m\xff\ +\xae\x02\x08\x01q\xffq\x02\x08\x01r\xff\x85\x02\x08\x01\ +s\xff\x9a\x02\x08\x01u\xff\x85\x02\x08\x01x\xff\x85\x02\ +\x08\x01\x85\xff\xd7\x02\x08\x01\x9d\xffq\x02\x08\x01\x9f\xff\ +\x9a\x02\x08\x01\xa6\xffq\x02\x08\x01\xb8\xff\x9a\x02\x08\x01\ +\xbb\xff\x9a\x02\x08\x01\xbc\xffq\x02\x08\x01\xbe\xff\xae\x02\ +\x08\x01\xc1\xff\x5c\x02\x08\x01\xc4\xffq\x02\x08\x01\xdc\xff\ +\x9a\x02\x08\x01\xe1\xff\x85\x02\x08\x01\xe4\xff\x9a\x02\x08\x01\ +\xfa\xff\x85\x02\x08\x01\xfc\xff\x85\x02\x08\x01\xfe\xff\x85\x02\ +\x08\x02\x00\xff\x85\x02\x08\x02T\xff\x85\x02\x08\x02_\xff\ +\x9a\x02\x08\x02a\xff\xd7\x02\x08\x02l\xff\x9a\x02\x08\x02\ +|\xff\x5c\x02\x08\x02~\xff\x9a\x02\x08\x02\x80\xff\x85\x02\ +\x08\x02\x82\xff\x85\x02\x08\x02\x84\xff\x9a\x02\x08\x02\x86\xff\ +\x9a\x02\x08\x02\x88\xff\x9a\x02\x08\x02\x8a\xff\x9a\x02\x08\x02\ +\x8c\xff\x9a\x02\x08\x02\xa9\xffq\x02\x08\x02\xaa\xff\x9a\x02\ +\x08\x02\xb1\xff\x9a\x02\x08\x02\xb3\xff\x9a\x02\x08\x02\xb5\xff\ +q\x02\x08\x02\xb6\xff\x9a\x02\x08\x02\xb7\xff\x85\x02\x08\x02\ +\xb9\xff\x85\x02\x08\x02\xbd\xffq\x02\x08\x02\xbe\xff\x9a\x02\ +\x08\x02\xbf\xff\x5c\x02\x08\x02\xc0\xff\x85\x02\x08\x02\xc1\xff\ +\x5c\x02\x08\x02\xc2\xff\x85\x02\x08\x02\xc5\xff\x85\x02\x08\x02\ +\xc7\xff\x85\x02\x08\x02\xd4\xff\x5c\x02\x08\x02\xd5\xff\x85\x02\ +\x08\x02\xef\xff\x9a\x02\x08\x02\xf1\xff\x9a\x02\x08\x02\xf3\xff\ +\x9a\x02\x08\x02\xfd\xff\x5c\x02\x08\x02\xfe\xff\x85\x02\x08\x03\ +\x0d\xff\x85\x02\x08\x03\x0e\xff\x9a\x02\x08\x03\x0f\xff\x85\x02\ +\x08\x03\x10\xff\x9a\x02\x08\x03\x15\xff\x9a\x02\x08\x03\x17\xff\ +q\x02\x08\x03\x18\xff\x9a\x02\x08\x03I\xff\x9a\x02\x08\x03\ +K\xff\x9a\x02\x08\x03M\xff\x9a\x02\x08\x03O\xff\x9a\x02\ +\x08\x03Q\xff\x9a\x02\x08\x03S\xff\x9a\x02\x08\x03U\xff\ +\x9a\x02\x08\x03W\xff\x9a\x02\x08\x03Y\xff\x9a\x02\x08\x03\ +[\xff\x9a\x02\x08\x03]\xff\x9a\x02\x08\x03_\xff\x9a\x02\ +\x08\x03a\xff\xd7\x02\x08\x03c\xff\xd7\x02\x08\x03e\xff\ +\xd7\x02\x08\x03g\xff\xd7\x02\x08\x03i\xff\xd7\x02\x08\x03\ +k\xff\xd7\x02\x08\x03m\xff\xd7\x02\x08\x03o\xff\x85\x02\ +\x08\x03q\xff\x85\x02\x08\x03s\xff\x85\x02\x08\x03\x8f\xff\ +q\x02\x0a\x00$\xffq\x02\x0a\x007\x00)\x02\x0a\x00\ +9\x00)\x02\x0a\x00:\x00)\x02\x0a\x00<\x00\x14\x02\ +\x0a\x00D\xff\xae\x02\x0a\x00F\xff\x85\x02\x0a\x00G\xff\ +\x85\x02\x0a\x00H\xff\x85\x02\x0a\x00J\xff\xc3\x02\x0a\x00\ +P\xff\xc3\x02\x0a\x00Q\xff\xc3\x02\x0a\x00R\xff\x85\x02\ +\x0a\x00S\xff\xc3\x02\x0a\x00T\xff\x85\x02\x0a\x00U\xff\ +\xc3\x02\x0a\x00V\xff\xc3\x02\x0a\x00X\xff\xc3\x02\x0a\x00\ +\x82\xffq\x02\x0a\x00\x83\xffq\x02\x0a\x00\x84\xffq\x02\ +\x0a\x00\x85\xffq\x02\x0a\x00\x86\xffq\x02\x0a\x00\x87\xff\ +q\x02\x0a\x00\x9f\x00\x14\x02\x0a\x00\xa2\xff\x85\x02\x0a\x00\ +\xa3\xff\xae\x02\x0a\x00\xa4\xff\xae\x02\x0a\x00\xa5\xff\xae\x02\ +\x0a\x00\xa6\xff\xae\x02\x0a\x00\xa7\xff\xae\x02\x0a\x00\xa8\xff\ +\xae\x02\x0a\x00\xa9\xff\x85\x02\x0a\x00\xaa\xff\x85\x02\x0a\x00\ +\xab\xff\x85\x02\x0a\x00\xac\xff\x85\x02\x0a\x00\xad\xff\x85\x02\ +\x0a\x00\xb4\xff\x85\x02\x0a\x00\xb5\xff\x85\x02\x0a\x00\xb6\xff\ +\x85\x02\x0a\x00\xb7\xff\x85\x02\x0a\x00\xb8\xff\x85\x02\x0a\x00\ +\xba\xff\x85\x02\x0a\x00\xbb\xff\xc3\x02\x0a\x00\xbc\xff\xc3\x02\ +\x0a\x00\xbd\xff\xc3\x02\x0a\x00\xbe\xff\xc3\x02\x0a\x00\xc2\xff\ +q\x02\x0a\x00\xc3\xff\xae\x02\x0a\x00\xc4\xffq\x02\x0a\x00\ +\xc5\xff\xae\x02\x0a\x00\xc6\xffq\x02\x0a\x00\xc7\xff\xae\x02\ +\x0a\x00\xc9\xff\x85\x02\x0a\x00\xcb\xff\x85\x02\x0a\x00\xcd\xff\ +\x85\x02\x0a\x00\xcf\xff\x85\x02\x0a\x00\xd1\xff\x85\x02\x0a\x00\ +\xd3\xff\x85\x02\x0a\x00\xd5\xff\x85\x02\x0a\x00\xd7\xff\x85\x02\ +\x0a\x00\xd9\xff\x85\x02\x0a\x00\xdb\xff\x85\x02\x0a\x00\xdd\xff\ +\x85\x02\x0a\x00\xdf\xff\xc3\x02\x0a\x00\xe1\xff\xc3\x02\x0a\x00\ +\xe3\xff\xc3\x02\x0a\x00\xe5\xff\xc3\x02\x0a\x00\xfa\xff\xc3\x02\ +\x0a\x01\x06\xff\xc3\x02\x0a\x01\x08\xff\xc3\x02\x0a\x01\x0d\xff\ +\xc3\x02\x0a\x01\x0f\xff\x85\x02\x0a\x01\x11\xff\x85\x02\x0a\x01\ +\x13\xff\x85\x02\x0a\x01\x15\xff\x85\x02\x0a\x01\x17\xff\xc3\x02\ +\x0a\x01\x19\xff\xc3\x02\x0a\x01\x1d\xff\xc3\x02\x0a\x01!\xff\ +\xc3\x02\x0a\x01$\x00)\x02\x0a\x01&\x00)\x02\x0a\x01\ ++\xff\xc3\x02\x0a\x01-\xff\xc3\x02\x0a\x01/\xff\xc3\x02\ +\x0a\x011\xff\xc3\x02\x0a\x013\xff\xc3\x02\x0a\x015\xff\ +\xc3\x02\x0a\x016\x00)\x02\x0a\x018\x00\x14\x02\x0a\x01\ +:\x00\x14\x02\x0a\x01C\xffq\x02\x0a\x01D\xff\xae\x02\ +\x0a\x01F\xff\xae\x02\x0a\x01H\xff\x85\x02\x0a\x01J\xff\ +\xc3\x02\x0a\x01V\xffq\x02\x0a\x01_\xffq\x02\x0a\x01\ +b\xffq\x02\x0a\x01i\xffq\x02\x0a\x01y\xff\xae\x02\ +\x0a\x01z\xff\xd7\x02\x0a\x01{\xff\xd7\x02\x0a\x01~\xff\ +\xae\x02\x0a\x01\x81\xff\xc3\x02\x0a\x01\x82\xff\xd7\x02\x0a\x01\ +\x83\xff\xd7\x02\x0a\x01\x84\xff\xd7\x02\x0a\x01\x87\xff\xd7\x02\ +\x0a\x01\x89\xff\xd7\x02\x0a\x01\x8c\xff\xae\x02\x0a\x01\x8e\xff\ +\xc3\x02\x0a\x01\x8f\xff\xae\x02\x0a\x01\x90\xff\xae\x02\x0a\x01\ +\x93\xff\xae\x02\x0a\x01\x99\xff\xae\x02\x0a\x01\xa4\xff\x85\x02\ +\x0a\x01\xaa\xffq\x02\x0a\x01\xae\xff\x85\x02\x0a\x01\xb5\xff\ +\x85\x02\x0a\x01\xca\xff\xd7\x02\x0a\x01\xce\xffq\x02\x0a\x01\ +\xcf\xff\x85\x02\x0a\x01\xd5\xffq\x02\x0a\x01\xd8\xff\x85\x02\ +\x0a\x01\xdb\xff\x85\x02\x0a\x01\xde\xff\x85\x02\x0a\x01\xea\xff\ +\x85\x02\x0a\x01\xed\xff\x85\x02\x0a\x01\xee\xff\xc3\x02\x0a\x01\ +\xf2\xffq\x02\x0a\x01\xfa\x00)\x02\x0a\x01\xfc\x00)\x02\ +\x0a\x01\xfe\x00)\x02\x0a\x02\x00\x00\x14\x02\x0a\x02W\xff\ +\xc3\x02\x0a\x02X\xffq\x02\x0a\x02Y\xff\xae\x02\x0a\x02\ +`\xff\x85\x02\x0a\x02b\xff\xc3\x02\x0a\x02j\xff\x85\x02\ +\x0a\x02r\xffq\x02\x0a\x02s\xffq\x02\x0a\x02}\xff\ +\xec\x02\x0a\x02\x7f\xff\x85\x02\x0a\x02\x85\xff\x85\x02\x0a\x02\ +\x87\xff\x85\x02\x0a\x02\x89\xff\x85\x02\x0a\x02\x8d\xff\x85\x02\ +\x0a\x02\xb2\xff\x85\x02\x0a\x02\xb4\xff\x85\x02\x0a\x02\xce\xff\ +\x85\x02\x0a\x02\xcf\xffq\x02\x0a\x02\xd9\xffq\x02\x0a\x02\ +\xda\xff\xd7\x02\x0a\x02\xdb\xffq\x02\x0a\x02\xdc\xff\xd7\x02\ +\x0a\x02\xdd\xffq\x02\x0a\x02\xde\xff\xd7\x02\x0a\x02\xe0\xff\ +\x85\x02\x0a\x02\xe2\xff\xd7\x02\x0a\x02\xe4\xff\xd7\x02\x0a\x02\ +\xf0\xff\x85\x02\x0a\x02\xf2\xff\x85\x02\x0a\x02\xf4\xff\x85\x02\ +\x0a\x03\x09\xffq\x02\x0a\x03\x0a\xff\x85\x02\x0a\x03\x0b\xff\ +q\x02\x0a\x03\x0c\xff\x85\x02\x0a\x03\x11\xff\x85\x02\x0a\x03\ +\x12\xffq\x02\x0a\x03\x16\xff\x85\x02\x0a\x03\x1a\xff\x85\x02\ +\x0a\x03\x1b\xff\x85\x02\x0a\x03\x1c\xffq\x02\x0a\x03\x1d\xff\ +q\x02\x0a\x03\x1e\xff\xae\x02\x0a\x03\x1f\xffq\x02\x0a\x03\ + \xff\xae\x02\x0a\x03!\xffq\x02\x0a\x03\x22\xff\xae\x02\ +\x0a\x03#\xffq\x02\x0a\x03%\xffq\x02\x0a\x03&\xff\ +\xae\x02\x0a\x03'\xffq\x02\x0a\x03(\xff\xae\x02\x0a\x03\ +)\xffq\x02\x0a\x03*\xff\xae\x02\x0a\x03+\xffq\x02\ +\x0a\x03,\xff\xae\x02\x0a\x03-\xffq\x02\x0a\x03.\xff\ +\xae\x02\x0a\x03/\xffq\x02\x0a\x030\xff\xae\x02\x0a\x03\ +1\xffq\x02\x0a\x032\xff\xae\x02\x0a\x033\xffq\x02\ +\x0a\x034\xff\xae\x02\x0a\x036\xff\x85\x02\x0a\x038\xff\ +\x85\x02\x0a\x03:\xff\x85\x02\x0a\x03<\xff\x85\x02\x0a\x03\ +@\xff\x85\x02\x0a\x03B\xff\x85\x02\x0a\x03D\xff\x85\x02\ +\x0a\x03J\xff\x85\x02\x0a\x03L\xff\x85\x02\x0a\x03N\xff\ +\x85\x02\x0a\x03R\xff\x85\x02\x0a\x03T\xff\x85\x02\x0a\x03\ +V\xff\x85\x02\x0a\x03X\xff\x85\x02\x0a\x03Z\xff\x85\x02\ +\x0a\x03\x5c\xff\x85\x02\x0a\x03^\xff\x85\x02\x0a\x03`\xff\ +\x85\x02\x0a\x03b\xff\xc3\x02\x0a\x03d\xff\xc3\x02\x0a\x03\ +f\xff\xc3\x02\x0a\x03h\xff\xc3\x02\x0a\x03j\xff\xc3\x02\ +\x0a\x03l\xff\xc3\x02\x0a\x03n\xff\xc3\x02\x0a\x03o\x00\ +\x14\x02\x0a\x03q\x00\x14\x02\x0a\x03s\x00\x14\x02\x0a\x03\ +\x8f\x00)\x02\x0c\x00&\xff\x9a\x02\x0c\x00*\xff\x9a\x02\ +\x0c\x002\xff\x9a\x02\x0c\x004\xff\x9a\x02\x0c\x007\xff\ +q\x02\x0c\x008\xff\xd7\x02\x0c\x009\xff\x85\x02\x0c\x00\ +:\xff\x85\x02\x0c\x00<\xff\x85\x02\x0c\x00\x89\xff\x9a\x02\ +\x0c\x00\x94\xff\x9a\x02\x0c\x00\x95\xff\x9a\x02\x0c\x00\x96\xff\ +\x9a\x02\x0c\x00\x97\xff\x9a\x02\x0c\x00\x98\xff\x9a\x02\x0c\x00\ +\x9a\xff\x9a\x02\x0c\x00\x9b\xff\xd7\x02\x0c\x00\x9c\xff\xd7\x02\ +\x0c\x00\x9d\xff\xd7\x02\x0c\x00\x9e\xff\xd7\x02\x0c\x00\x9f\xff\ +\x85\x02\x0c\x00\xc8\xff\x9a\x02\x0c\x00\xca\xff\x9a\x02\x0c\x00\ +\xcc\xff\x9a\x02\x0c\x00\xce\xff\x9a\x02\x0c\x00\xde\xff\x9a\x02\ +\x0c\x00\xe0\xff\x9a\x02\x0c\x00\xe2\xff\x9a\x02\x0c\x00\xe4\xff\ +\x9a\x02\x0c\x01\x0e\xff\x9a\x02\x0c\x01\x10\xff\x9a\x02\x0c\x01\ +\x12\xff\x9a\x02\x0c\x01\x14\xff\x9a\x02\x0c\x01$\xffq\x02\ +\x0c\x01&\xffq\x02\x0c\x01*\xff\xd7\x02\x0c\x01,\xff\ +\xd7\x02\x0c\x01.\xff\xd7\x02\x0c\x010\xff\xd7\x02\x0c\x01\ +2\xff\xd7\x02\x0c\x014\xff\xd7\x02\x0c\x016\xff\x85\x02\ +\x0c\x018\xff\x85\x02\x0c\x01:\xff\x85\x02\x0c\x01G\xff\ +\x9a\x02\x0c\x01f\xff\xae\x02\x0c\x01m\xff\xae\x02\x0c\x01\ +q\xffq\x02\x0c\x01r\xff\x85\x02\x0c\x01s\xff\x9a\x02\ +\x0c\x01u\xff\x85\x02\x0c\x01x\xff\x85\x02\x0c\x01\x85\xff\ +\xd7\x02\x0c\x01\x9d\xffq\x02\x0c\x01\x9f\xff\x9a\x02\x0c\x01\ +\xa6\xffq\x02\x0c\x01\xb8\xff\x9a\x02\x0c\x01\xbb\xff\x9a\x02\ +\x0c\x01\xbc\xffq\x02\x0c\x01\xbe\xff\xae\x02\x0c\x01\xc1\xff\ +\x5c\x02\x0c\x01\xc4\xffq\x02\x0c\x01\xdc\xff\x9a\x02\x0c\x01\ +\xe1\xff\x85\x02\x0c\x01\xe4\xff\x9a\x02\x0c\x01\xfa\xff\x85\x02\ +\x0c\x01\xfc\xff\x85\x02\x0c\x01\xfe\xff\x85\x02\x0c\x02\x00\xff\ +\x85\x02\x0c\x02T\xff\x85\x02\x0c\x02_\xff\x9a\x02\x0c\x02\ +a\xff\xd7\x02\x0c\x02l\xff\x9a\x02\x0c\x02|\xff\x5c\x02\ +\x0c\x02~\xff\x9a\x02\x0c\x02\x80\xff\x85\x02\x0c\x02\x82\xff\ +\x85\x02\x0c\x02\x84\xff\x9a\x02\x0c\x02\x86\xff\x9a\x02\x0c\x02\ +\x88\xff\x9a\x02\x0c\x02\x8a\xff\x9a\x02\x0c\x02\x8c\xff\x9a\x02\ +\x0c\x02\xa9\xffq\x02\x0c\x02\xaa\xff\x9a\x02\x0c\x02\xb1\xff\ +\x9a\x02\x0c\x02\xb3\xff\x9a\x02\x0c\x02\xb5\xffq\x02\x0c\x02\ +\xb6\xff\x9a\x02\x0c\x02\xb7\xff\x85\x02\x0c\x02\xb9\xff\x85\x02\ +\x0c\x02\xbd\xffq\x02\x0c\x02\xbe\xff\x9a\x02\x0c\x02\xbf\xff\ +\x5c\x02\x0c\x02\xc0\xff\x85\x02\x0c\x02\xc1\xff\x5c\x02\x0c\x02\ +\xc2\xff\x85\x02\x0c\x02\xc5\xff\x85\x02\x0c\x02\xc7\xff\x85\x02\ +\x0c\x02\xd4\xff\x5c\x02\x0c\x02\xd5\xff\x85\x02\x0c\x02\xef\xff\ +\x9a\x02\x0c\x02\xf1\xff\x9a\x02\x0c\x02\xf3\xff\x9a\x02\x0c\x02\ +\xfd\xff\x5c\x02\x0c\x02\xfe\xff\x85\x02\x0c\x03\x0d\xff\x85\x02\ +\x0c\x03\x0e\xff\x9a\x02\x0c\x03\x0f\xff\x85\x02\x0c\x03\x10\xff\ +\x9a\x02\x0c\x03\x15\xff\x9a\x02\x0c\x03\x17\xffq\x02\x0c\x03\ +\x18\xff\x9a\x02\x0c\x03I\xff\x9a\x02\x0c\x03K\xff\x9a\x02\ +\x0c\x03M\xff\x9a\x02\x0c\x03O\xff\x9a\x02\x0c\x03Q\xff\ +\x9a\x02\x0c\x03S\xff\x9a\x02\x0c\x03U\xff\x9a\x02\x0c\x03\ +W\xff\x9a\x02\x0c\x03Y\xff\x9a\x02\x0c\x03[\xff\x9a\x02\ +\x0c\x03]\xff\x9a\x02\x0c\x03_\xff\x9a\x02\x0c\x03a\xff\ +\xd7\x02\x0c\x03c\xff\xd7\x02\x0c\x03e\xff\xd7\x02\x0c\x03\ +g\xff\xd7\x02\x0c\x03i\xff\xd7\x02\x0c\x03k\xff\xd7\x02\ +\x0c\x03m\xff\xd7\x02\x0c\x03o\xff\x85\x02\x0c\x03q\xff\ +\x85\x02\x0c\x03s\xff\x85\x02\x0c\x03\x8f\xffq\x02!\x01\ +q\xff\xd7\x02!\x01r\xff\xec\x02!\x01x\xff\xec\x02\ +!\x02T\xff\xec\x02S\x00\x0f\xff\xc3\x02S\x00\x11\xff\ +\xc3\x02S\x02\x08\xff\xc3\x02S\x02\x0c\xff\xc3\x02T\x00\ +\x0f\xff\x85\x02T\x00\x11\xff\x85\x02T\x01V\xff\x85\x02\ +T\x01_\xff\x85\x02T\x01b\xff\x85\x02T\x01f\xff\ +\xd7\x02T\x01i\xff\x85\x02T\x01m\xff\xd7\x02T\x01\ +s\xff\xc3\x02T\x01v\xff\xec\x02T\x01y\xff\x9a\x02\ +T\x01z\xff\xae\x02T\x01{\xff\xc3\x02T\x01|\xff\ +\xc3\x02T\x01}\xff\xc3\x02T\x01~\xff\x9a\x02T\x01\ +\x81\xff\xc3\x02T\x01\x82\xff\xae\x02T\x01\x84\xff\xc3\x02\ +T\x01\x86\xff\xc3\x02T\x01\x87\xff\xc3\x02T\x01\x89\xff\ +\xc3\x02T\x01\x8c\xff\x9a\x02T\x01\x8e\xff\x9a\x02T\x01\ +\x8f\xff\x9a\x02T\x01\x90\xff\x9a\x02T\x01\x92\xff\xc3\x02\ +T\x01\x93\xff\x9a\x02T\x01\x95\xff\xc3\x02T\x01\x96\xff\ +\xc3\x02T\x01\x98\xff\xc3\x02T\x01\x99\xff\x9a\x02T\x01\ +\x9a\xff\xc3\x02T\x01\x9b\xff\xc3\x02T\x02\x08\xff\x85\x02\ +T\x02\x0c\xff\x85\x02T\x02!\xff\xec\x02X\x00\x05\xff\ +q\x02X\x00\x0a\xffq\x02X\x00&\xff\xd7\x02X\x00\ +*\xff\xd7\x02X\x00-\x01\x0a\x02X\x002\xff\xd7\x02\ +X\x004\xff\xd7\x02X\x007\xffq\x02X\x009\xff\ +\xae\x02X\x00:\xff\xae\x02X\x00<\xff\x85\x02X\x00\ +\x89\xff\xd7\x02X\x00\x94\xff\xd7\x02X\x00\x95\xff\xd7\x02\ +X\x00\x96\xff\xd7\x02X\x00\x97\xff\xd7\x02X\x00\x98\xff\ +\xd7\x02X\x00\x9a\xff\xd7\x02X\x00\x9f\xff\x85\x02X\x00\ +\xc8\xff\xd7\x02X\x00\xca\xff\xd7\x02X\x00\xcc\xff\xd7\x02\ +X\x00\xce\xff\xd7\x02X\x00\xde\xff\xd7\x02X\x00\xe0\xff\ +\xd7\x02X\x00\xe2\xff\xd7\x02X\x00\xe4\xff\xd7\x02X\x01\ +\x0e\xff\xd7\x02X\x01\x10\xff\xd7\x02X\x01\x12\xff\xd7\x02\ +X\x01\x14\xff\xd7\x02X\x01$\xffq\x02X\x01&\xff\ +q\x02X\x016\xff\xae\x02X\x018\xff\x85\x02X\x01\ +:\xff\x85\x02X\x01G\xff\xd7\x02X\x01\xfa\xff\xae\x02\ +X\x01\xfc\xff\xae\x02X\x01\xfe\xff\xae\x02X\x02\x00\xff\ +\x85\x02X\x02\x07\xffq\x02X\x02\x0b\xffq\x02X\x02\ +_\xff\xd7\x02X\x03I\xff\xd7\x02X\x03K\xff\xd7\x02\ +X\x03M\xff\xd7\x02X\x03O\xff\xd7\x02X\x03Q\xff\ +\xd7\x02X\x03S\xff\xd7\x02X\x03U\xff\xd7\x02X\x03\ +W\xff\xd7\x02X\x03Y\xff\xd7\x02X\x03[\xff\xd7\x02\ +X\x03]\xff\xd7\x02X\x03_\xff\xd7\x02X\x03o\xff\ +\x85\x02X\x03q\xff\x85\x02X\x03s\xff\x85\x02X\x03\ +\x8f\xffq\x02Y\x00\x05\xff\xec\x02Y\x00\x0a\xff\xec\x02\ +Y\x02\x07\xff\xec\x02Y\x02\x0b\xff\xec\x02Z\x00\x0f\xff\ +\xae\x02Z\x00\x11\xff\xae\x02Z\x01V\xff\xd7\x02Z\x01\ +_\xff\xd7\x02Z\x01b\xff\xd7\x02Z\x01d\xff\xec\x02\ +Z\x01i\xff\xd7\x02Z\x01p\xff\xec\x02Z\x01q\xff\ +\xc3\x02Z\x01r\xff\xec\x02Z\x01t\xff\xd7\x02Z\x01\ +u\xff\xec\x02Z\x01x\xff\xec\x02Z\x01\x88\xff\xec\x02\ +Z\x02\x08\xff\xae\x02Z\x02\x0c\xff\xae\x02Z\x02T\xff\ +\xec\x02`\x00I\x00R\x02`\x00W\x00R\x02`\x00\ +Y\x00f\x02`\x00Z\x00f\x02`\x00[\x00f\x02\ +`\x00\x5c\x00f\x02`\x00\xbf\x00f\x02`\x01%\x00\ +R\x02`\x01'\x00R\x02`\x017\x00f\x02`\x01\ +\xfb\x00f\x02`\x01\xfd\x00f\x02`\x024\x00R\x02\ +`\x025\x00R\x02`\x02]\x00R\x02`\x02^\x00\ +R\x02`\x03p\x00f\x02`\x03\x8d\x00R\x02`\x03\ +\x90\x00R\x02b\x00I\x00f\x02b\x00W\x00f\x02\ +b\x00Y\x00f\x02b\x00Z\x00f\x02b\x00[\x00\ +f\x02b\x00\x5c\x00f\x02b\x00\xbf\x00f\x02b\x01\ +%\x00f\x02b\x01'\x00f\x02b\x017\x00f\x02\ +b\x01\xfb\x00f\x02b\x01\xfd\x00f\x02b\x024\x00\ +f\x02b\x025\x00f\x02b\x02]\x00f\x02b\x02\ +^\x00f\x02b\x03p\x00f\x02b\x03\x8d\x00f\x02\ +b\x03\x90\x00f\x02j\x00\x05\xff\xec\x02j\x00\x0a\xff\ +\xec\x02j\x02\x07\xff\xec\x02j\x02\x0b\xff\xec\x02l\x00\ +\x0f\xff\xae\x02l\x00\x11\xff\xae\x02l\x01\x9d\xff\xec\x02\ +l\x01\xa4\xff\xd7\x02l\x01\xa6\xff\xec\x02l\x01\xa8\xff\ +\xd7\x02l\x01\xaa\xff\xd7\x02l\x01\xae\xff\xd7\x02l\x01\ +\xb0\xff\xd7\x02l\x01\xb1\xff\xec\x02l\x01\xb5\xff\xd7\x02\ +l\x01\xbc\xff\xc3\x02l\x01\xbd\xff\xd7\x02l\x01\xbf\xff\ +\xd7\x02l\x01\xc1\xff\xd7\x02l\x01\xc4\xff\xec\x02l\x01\ +\xc7\xff\xec\x02l\x01\xce\xff\xec\x02l\x01\xd5\xff\xec\x02\ +l\x01\xf2\xff\xec\x02l\x02\x08\xff\xae\x02l\x02\x0c\xff\ +\xae\x02l\x02r\xff\xd7\x02l\x02s\xff\xec\x02l\x02\ +z\xff\xec\x02l\x02|\xff\xd7\x02l\x02\x80\xff\xec\x02\ +l\x02\x82\xff\xec\x02l\x02\x9f\xff\xd7\x02l\x02\xa1\xff\ +\xec\x02l\x02\xa9\xff\xec\x02l\x02\xb5\xff\xc3\x02l\x02\ +\xb7\xff\xec\x02l\x02\xb9\xff\xec\x02l\x02\xbb\xff\xd7\x02\ +l\x02\xbd\xff\xec\x02l\x02\xbf\xff\xd7\x02l\x02\xc1\xff\ +\xd7\x02l\x02\xca\xff\xd7\x02l\x02\xce\xff\xd7\x02l\x02\ +\xcf\xff\xec\x02l\x02\xd4\xff\xd7\x02l\x02\xd9\xff\xd7\x02\ +l\x02\xdb\xff\xd7\x02l\x02\xdd\xff\xd7\x02l\x02\xe5\xff\ +\xd7\x02l\x02\xe7\xff\xec\x02l\x02\xf5\xff\xec\x02l\x02\ +\xf7\xff\xd7\x02l\x02\xf9\xff\xd7\x02l\x02\xfb\xff\xd7\x02\ +l\x02\xfd\xff\xd7\x02l\x03\x05\xff\xd7\x02l\x03\x07\xff\ +\xd7\x02l\x03\x0d\xff\xd7\x02l\x03\x0f\xff\xd7\x02l\x03\ +\x11\xff\xd7\x02l\x03\x12\xff\xec\x02l\x03\x17\xff\xec\x02\ +l\x03\x1b\xff\xd7\x02l\x03\x1c\xff\xec\x02m\x00\x0f\xff\ +\xae\x02m\x00\x11\xff\xae\x02m\x01\xce\xff\xd7\x02m\x01\ +\xd5\xff\xd7\x02m\x01\xf2\xff\xd7\x02m\x02\x08\xff\xae\x02\ +m\x02\x0c\xff\xae\x02m\x02s\xff\xd7\x02m\x02\xcf\xff\ +\xd7\x02m\x03\x12\xff\xd7\x02m\x03\x1c\xff\xd7\x02n\x00\ +\x05\xff\xae\x02n\x00\x0a\xff\xae\x02n\x01\x9d\xff\xd7\x02\ +n\x01\xa6\xff\xd7\x02n\x01\xbc\xff\xae\x02n\x01\xc1\xff\ +\xae\x02n\x01\xc4\xff\xd7\x02n\x01\xdc\xff\xd7\x02n\x01\ +\xe4\xff\xd7\x02n\x02\x07\xff\xae\x02n\x02\x0b\xff\xae\x02\ +n\x02|\xff\xae\x02n\x02\x80\xff\xc3\x02n\x02\x82\xff\ +\xc3\x02n\x02\xa9\xff\xd7\x02n\x02\xaa\xff\xd7\x02n\x02\ +\xb5\xff\xae\x02n\x02\xb6\xff\xd7\x02n\x02\xb7\xff\xc3\x02\ +n\x02\xb9\xff\xc3\x02n\x02\xbd\xff\xd7\x02n\x02\xbe\xff\ +\xd7\x02n\x02\xbf\xff\xae\x02n\x02\xc1\xff\xae\x02n\x02\ +\xd4\xff\xae\x02n\x02\xfd\xff\xae\x02n\x03\x0d\xff\x9a\x02\ +n\x03\x0f\xff\x9a\x02n\x03\x17\xff\xd7\x02n\x03\x18\xff\ +\xd7\x02o\x00\x05\xff\x85\x02o\x00\x0a\xff\x85\x02o\x01\ +\xd0\xff\xd7\x02o\x01\xdc\xff\x9a\x02o\x01\xdd\xff\xc3\x02\ +o\x01\xdf\xff\xd7\x02o\x01\xe1\xff\xae\x02o\x01\xe4\xff\ +\x9a\x02o\x01\xf6\xff\xc3\x02o\x02\x07\xff\x85\x02o\x02\ +\x0b\xff\x85\x02o\x02m\xff\xd7\x02o\x02\x81\xff\xd7\x02\ +o\x02\x83\xff\xd7\x02o\x02\x8b\xff\xd7\x02o\x02\xa0\xff\ +\xd7\x02o\x02\xaa\xff\x9a\x02o\x02\xb6\xff\x9a\x02o\x02\ +\xb8\xff\xc3\x02o\x02\xba\xff\xc3\x02o\x02\xbc\xff\xd7\x02\ +o\x02\xbe\xff\x9a\x02o\x02\xc0\xff\xae\x02o\x02\xc2\xff\ +\xae\x02o\x02\xc6\xff\xd7\x02o\x02\xc8\xff\xd7\x02o\x02\ +\xcb\xff\xd7\x02o\x02\xd5\xff\xae\x02o\x02\xe6\xff\xd7\x02\ +o\x02\xea\xff\xd7\x02o\x02\xf8\xff\xc3\x02o\x02\xfa\xff\ +\xc3\x02o\x02\xfc\xff\xc3\x02o\x02\xfe\xff\xae\x02o\x03\ +\x06\xff\xd7\x02o\x03\x08\xff\xd7\x02o\x03\x0e\xff\x9a\x02\ +o\x03\x10\xff\x9a\x02o\x03\x18\xff\x9a\x02p\x01\x9f\xff\ +\xd7\x02p\x01\xb8\xff\xd7\x02p\x01\xbb\xff\xd7\x02p\x01\ +\xbe\xff\xd7\x02p\x01\xe1\xff\xd7\x02p\x02l\xff\xd7\x02\ +p\x02~\xff\xd7\x02p\x02\x84\xff\xd7\x02p\x02\x86\xff\ +\xd7\x02p\x02\x88\xff\xd7\x02p\x02\x8a\xff\xd7\x02p\x02\ +\x8c\xff\xd7\x02p\x02\xb1\xff\xd7\x02p\x02\xb3\xff\xd7\x02\ +p\x02\xc0\xff\xd7\x02p\x02\xc2\xff\xd7\x02p\x02\xc5\xff\ +\xd7\x02p\x02\xc7\xff\xd7\x02p\x02\xd5\xff\xd7\x02p\x02\ +\xef\xff\xd7\x02p\x02\xf1\xff\xd7\x02p\x02\xf3\xff\xd7\x02\ +p\x02\xfe\xff\xd7\x02p\x03\x09\xff\xd7\x02p\x03\x0b\xff\ +\xd7\x02p\x03\x0e\xff\xd7\x02p\x03\x10\xff\xd7\x02p\x03\ +\x15\xff\xd7\x02r\x00\x05\xffq\x02r\x00\x0a\xffq\x02\ +r\x01\x9d\xff\x9a\x02r\x01\xa6\xff\x9a\x02r\x01\xbc\xff\ +q\x02r\x01\xbe\xff\xd7\x02r\x01\xc1\xff\x9a\x02r\x01\ +\xc4\xff\x9a\x02r\x01\xdc\xff\xd7\x02r\x01\xe1\xff\xd7\x02\ +r\x01\xe4\xff\xd7\x02r\x02\x07\xffq\x02r\x02\x0b\xff\ +q\x02r\x02n\xff\xd7\x02r\x02|\xff\x9a\x02r\x02\ +\x80\xff\xae\x02r\x02\x82\xff\xae\x02r\x02\x97\xff\xd7\x02\ +r\x02\x9b\xff\xd7\x02r\x02\xa7\xff\xd7\x02r\x02\xa9\xff\ +\x9a\x02r\x02\xaa\xff\xd7\x02r\x02\xb5\xffq\x02r\x02\ +\xb6\xff\xd7\x02r\x02\xb7\xff\x85\x02r\x02\xb9\xff\x85\x02\ +r\x02\xbd\xff\x9a\x02r\x02\xbe\xff\xd7\x02r\x02\xbf\xff\ +\x9a\x02r\x02\xc0\xff\xd7\x02r\x02\xc1\xff\x9a\x02r\x02\ +\xc2\xff\xd7\x02r\x02\xc5\xff\x9a\x02r\x02\xc7\xff\x9a\x02\ +r\x02\xd4\xff\x9a\x02r\x02\xd5\xff\xd7\x02r\x02\xe1\xff\ +\xd7\x02r\x02\xe3\xff\xd7\x02r\x02\xfd\xff\x9a\x02r\x02\ +\xfe\xff\xd7\x02r\x03\x03\xff\xd7\x02r\x03\x0d\xffq\x02\ +r\x03\x0e\xff\xd7\x02r\x03\x0f\xffq\x02r\x03\x10\xff\ +\xd7\x02r\x03\x17\xff\x9a\x02r\x03\x18\xff\xd7\x02s\x00\ +\x05\xffq\x02s\x00\x0a\xffq\x02s\x01\xcf\xff\xd7\x02\ +s\x01\xd8\xff\xd7\x02s\x01\xdb\xff\xd7\x02s\x01\xdc\xff\ +\x9a\x02s\x01\xdd\xff\xc3\x02s\x01\xde\xff\xd7\x02s\x01\ +\xe1\xff\xc3\x02s\x01\xe4\xff\x9a\x02s\x01\xea\xff\xd7\x02\ +s\x01\xed\xff\xd7\x02s\x01\xf6\xff\xc3\x02s\x02\x07\xff\ +q\x02s\x02\x0b\xffq\x02s\x02j\xff\xd7\x02s\x02\ +m\xff\xd7\x02s\x02}\xff\xec\x02s\x02\x7f\xff\xd7\x02\ +s\x02\x81\xff\xd7\x02s\x02\x83\xff\xd7\x02s\x02\x85\xff\ +\xd7\x02s\x02\x87\xff\xd7\x02s\x02\x89\xff\xd7\x02s\x02\ +\x8b\xff\xd7\x02s\x02\x8d\xff\xd7\x02s\x02\xaa\xff\x9a\x02\ +s\x02\xb2\xff\xd7\x02s\x02\xb4\xff\xd7\x02s\x02\xb6\xff\ +\x9a\x02s\x02\xb8\xff\xd7\x02s\x02\xba\xff\xd7\x02s\x02\ +\xbe\xff\x9a\x02s\x02\xc0\xff\xc3\x02s\x02\xc2\xff\xc3\x02\ +s\x02\xc6\xff\xd7\x02s\x02\xc8\xff\xd7\x02s\x02\xd5\xff\ +\xc3\x02s\x02\xe0\xff\xd7\x02s\x02\xf0\xff\xd7\x02s\x02\ +\xf2\xff\xd7\x02s\x02\xf4\xff\xd7\x02s\x02\xf8\xff\xc3\x02\ +s\x02\xfa\xff\xc3\x02s\x02\xfc\xff\xc3\x02s\x02\xfe\xff\ +\xc3\x02s\x03\x0a\xff\xd7\x02s\x03\x0c\xff\xd7\x02s\x03\ +\x0e\xff\x85\x02s\x03\x10\xff\x85\x02s\x03\x16\xff\xd7\x02\ +s\x03\x18\xff\x9a\x02s\x03\x1a\xff\xd7\x02t\x00\x05\xff\ +q\x02t\x00\x0a\xffq\x02t\x01\x9d\xff\x9a\x02t\x01\ +\xa6\xff\x9a\x02t\x01\xbc\xffq\x02t\x01\xbe\xff\xd7\x02\ +t\x01\xc1\xff\x9a\x02t\x01\xc4\xff\x9a\x02t\x01\xdc\xff\ +\xd7\x02t\x01\xe1\xff\xd7\x02t\x01\xe4\xff\xd7\x02t\x02\ +\x07\xffq\x02t\x02\x0b\xffq\x02t\x02n\xff\xd7\x02\ +t\x02|\xff\x9a\x02t\x02\x80\xff\xae\x02t\x02\x82\xff\ +\xae\x02t\x02\x97\xff\xd7\x02t\x02\x9b\xff\xd7\x02t\x02\ +\xa7\xff\xd7\x02t\x02\xa9\xff\x9a\x02t\x02\xaa\xff\xd7\x02\ +t\x02\xb5\xffq\x02t\x02\xb6\xff\xd7\x02t\x02\xb7\xff\ +\x85\x02t\x02\xb9\xff\x85\x02t\x02\xbd\xff\x9a\x02t\x02\ +\xbe\xff\xd7\x02t\x02\xbf\xff\x9a\x02t\x02\xc0\xff\xd7\x02\ +t\x02\xc1\xff\x9a\x02t\x02\xc2\xff\xd7\x02t\x02\xc5\xff\ +\x9a\x02t\x02\xc7\xff\x9a\x02t\x02\xd4\xff\x9a\x02t\x02\ +\xd5\xff\xd7\x02t\x02\xe1\xff\xd7\x02t\x02\xe3\xff\xd7\x02\ +t\x02\xfd\xff\x9a\x02t\x02\xfe\xff\xd7\x02t\x03\x03\xff\ +\xd7\x02t\x03\x0d\xffq\x02t\x03\x0e\xff\xd7\x02t\x03\ +\x0f\xffq\x02t\x03\x10\xff\xd7\x02t\x03\x17\xff\x9a\x02\ +t\x03\x18\xff\xd7\x02u\x00\x05\xffq\x02u\x00\x0a\xff\ +q\x02u\x01\xcf\xff\xd7\x02u\x01\xd8\xff\xd7\x02u\x01\ +\xdb\xff\xd7\x02u\x01\xdc\xff\x9a\x02u\x01\xdd\xff\xc3\x02\ +u\x01\xde\xff\xd7\x02u\x01\xe1\xff\xc3\x02u\x01\xe4\xff\ +\x9a\x02u\x01\xea\xff\xd7\x02u\x01\xed\xff\xd7\x02u\x01\ +\xf6\xff\xc3\x02u\x02\x07\xffq\x02u\x02\x0b\xffq\x02\ +u\x02j\xff\xd7\x02u\x02m\xff\xd7\x02u\x02}\xff\ +\xec\x02u\x02\x7f\xff\xd7\x02u\x02\x81\xff\xd7\x02u\x02\ +\x83\xff\xd7\x02u\x02\x85\xff\xd7\x02u\x02\x87\xff\xd7\x02\ +u\x02\x89\xff\xd7\x02u\x02\x8b\xff\xd7\x02u\x02\x8d\xff\ +\xd7\x02u\x02\xaa\xff\x9a\x02u\x02\xb2\xff\xd7\x02u\x02\ +\xb4\xff\xd7\x02u\x02\xb6\xff\x9a\x02u\x02\xb8\xff\xd7\x02\ +u\x02\xba\xff\xd7\x02u\x02\xbe\xff\x9a\x02u\x02\xc0\xff\ +\xc3\x02u\x02\xc2\xff\xc3\x02u\x02\xc6\xff\xd7\x02u\x02\ +\xc8\xff\xd7\x02u\x02\xd5\xff\xc3\x02u\x02\xe0\xff\xd7\x02\ +u\x02\xf0\xff\xd7\x02u\x02\xf2\xff\xd7\x02u\x02\xf4\xff\ +\xd7\x02u\x02\xf8\xff\xc3\x02u\x02\xfa\xff\xc3\x02u\x02\ +\xfc\xff\xc3\x02u\x02\xfe\xff\xc3\x02u\x03\x0a\xff\xd7\x02\ +u\x03\x0c\xff\xd7\x02u\x03\x0e\xff\x85\x02u\x03\x10\xff\ +\x85\x02u\x03\x16\xff\xd7\x02u\x03\x18\xff\x9a\x02u\x03\ +\x1a\xff\xd7\x02v\x03\x0d\xff\xec\x02v\x03\x0f\xff\xec\x02\ +x\x03\x0d\xff\xec\x02x\x03\x0f\xff\xec\x02z\x00\x0f\xff\ +\xae\x02z\x00\x11\xff\xae\x02z\x02\x08\xff\xae\x02z\x02\ +\x0c\xff\xae\x02z\x02\x80\xff\xec\x02z\x02\x82\xff\xec\x02\ +z\x02\xb7\xff\xec\x02z\x02\xb9\xff\xec\x02z\x03\x0d\xff\ +\xd7\x02z\x03\x0f\xff\xd7\x02|\x00\x0f\xffq\x02|\x00\ +\x11\xffq\x02|\x01\xa4\xff\xc3\x02|\x01\xaa\xff\xae\x02\ +|\x01\xae\xff\xc3\x02|\x01\xb5\xff\xc3\x02|\x01\xce\xff\ +\xd7\x02|\x01\xd5\xff\xd7\x02|\x01\xf2\xff\xd7\x02|\x02\ +\x08\xffq\x02|\x02\x0c\xffq\x02|\x02r\xff\xae\x02\ +|\x02s\xff\xd7\x02|\x02\xce\xff\xc3\x02|\x02\xcf\xff\ +\xd7\x02|\x02\xd9\xff\xae\x02|\x02\xdb\xff\xae\x02|\x02\ +\xdd\xff\xae\x02|\x03\x09\xff\xae\x02|\x03\x0b\xff\xae\x02\ +|\x03\x11\xff\xc3\x02|\x03\x12\xff\xd7\x02|\x03\x1b\xff\ +\xc3\x02|\x03\x1c\xff\xd7\x02}\x00\x05\xff\xec\x02}\x00\ +\x0a\xff\xec\x02}\x01\xd0\xff\xd7\x02}\x01\xdc\xff\xec\x02\ +}\x01\xdd\xff\xec\x02}\x01\xdf\xff\xd7\x02}\x01\xe1\xff\ +\xec\x02}\x01\xe4\xff\xec\x02}\x01\xf6\xff\xec\x02}\x02\ +\x07\xff\xec\x02}\x02\x0b\xff\xec\x02}\x02\xa0\xff\xd7\x02\ +}\x02\xaa\xff\xec\x02}\x02\xb6\xff\xec\x02}\x02\xbc\xff\ +\xd7\x02}\x02\xbe\xff\xec\x02}\x02\xc0\xff\xec\x02}\x02\ +\xc2\xff\xec\x02}\x02\xcb\xff\xd7\x02}\x02\xd5\xff\xec\x02\ +}\x02\xe6\xff\xd7\x02}\x02\xf8\xff\xec\x02}\x02\xfa\xff\ +\xec\x02}\x02\xfc\xff\xec\x02}\x02\xfe\xff\xec\x02}\x03\ +\x06\xff\xd7\x02}\x03\x08\xff\xd7\x02}\x03\x0e\xff\xec\x02\ +}\x03\x10\xff\xec\x02}\x03\x18\xff\xec\x02~\x00\x0f\xff\ +\xae\x02~\x00\x11\xff\xae\x02~\x01\x9d\xff\xec\x02~\x01\ +\xa4\xff\xd7\x02~\x01\xa6\xff\xec\x02~\x01\xa8\xff\xd7\x02\ +~\x01\xaa\xff\xd7\x02~\x01\xae\xff\xd7\x02~\x01\xb0\xff\ +\xd7\x02~\x01\xb1\xff\xec\x02~\x01\xb5\xff\xd7\x02~\x01\ +\xbc\xff\xc3\x02~\x01\xbd\xff\xd7\x02~\x01\xbf\xff\xd7\x02\ +~\x01\xc1\xff\xd7\x02~\x01\xc4\xff\xec\x02~\x01\xc7\xff\ +\xec\x02~\x01\xce\xff\xec\x02~\x01\xd5\xff\xec\x02~\x01\ +\xf2\xff\xec\x02~\x02\x08\xff\xae\x02~\x02\x0c\xff\xae\x02\ +~\x02r\xff\xd7\x02~\x02s\xff\xec\x02~\x02z\xff\ +\xec\x02~\x02|\xff\xd7\x02~\x02\x80\xff\xec\x02~\x02\ +\x82\xff\xec\x02~\x02\x9f\xff\xd7\x02~\x02\xa1\xff\xec\x02\ +~\x02\xa9\xff\xec\x02~\x02\xb5\xff\xc3\x02~\x02\xb7\xff\ +\xec\x02~\x02\xb9\xff\xec\x02~\x02\xbb\xff\xd7\x02~\x02\ +\xbd\xff\xec\x02~\x02\xbf\xff\xd7\x02~\x02\xc1\xff\xd7\x02\ +~\x02\xca\xff\xd7\x02~\x02\xce\xff\xd7\x02~\x02\xcf\xff\ +\xec\x02~\x02\xd4\xff\xd7\x02~\x02\xd9\xff\xd7\x02~\x02\ +\xdb\xff\xd7\x02~\x02\xdd\xff\xd7\x02~\x02\xe5\xff\xd7\x02\ +~\x02\xe7\xff\xec\x02~\x02\xf5\xff\xec\x02~\x02\xf7\xff\ +\xd7\x02~\x02\xf9\xff\xd7\x02~\x02\xfb\xff\xd7\x02~\x02\ +\xfd\xff\xd7\x02~\x03\x05\xff\xd7\x02~\x03\x07\xff\xd7\x02\ +~\x03\x0d\xff\xd7\x02~\x03\x0f\xff\xd7\x02~\x03\x11\xff\ +\xd7\x02~\x03\x12\xff\xec\x02~\x03\x17\xff\xec\x02~\x03\ +\x1b\xff\xd7\x02~\x03\x1c\xff\xec\x02\x7f\x00\x05\xff\xec\x02\ +\x7f\x00\x0a\xff\xec\x02\x7f\x01\xd0\xff\xd7\x02\x7f\x01\xdc\xff\ +\xec\x02\x7f\x01\xdd\xff\xec\x02\x7f\x01\xdf\xff\xd7\x02\x7f\x01\ +\xe1\xff\xec\x02\x7f\x01\xe4\xff\xec\x02\x7f\x01\xf6\xff\xec\x02\ +\x7f\x02\x07\xff\xec\x02\x7f\x02\x0b\xff\xec\x02\x7f\x02\xa0\xff\ +\xd7\x02\x7f\x02\xaa\xff\xec\x02\x7f\x02\xb6\xff\xec\x02\x7f\x02\ +\xbc\xff\xd7\x02\x7f\x02\xbe\xff\xec\x02\x7f\x02\xc0\xff\xec\x02\ +\x7f\x02\xc2\xff\xec\x02\x7f\x02\xcb\xff\xd7\x02\x7f\x02\xd5\xff\ +\xec\x02\x7f\x02\xe6\xff\xd7\x02\x7f\x02\xf8\xff\xec\x02\x7f\x02\ +\xfa\xff\xec\x02\x7f\x02\xfc\xff\xec\x02\x7f\x02\xfe\xff\xec\x02\ +\x7f\x03\x06\xff\xd7\x02\x7f\x03\x08\xff\xd7\x02\x7f\x03\x0e\xff\ +\xec\x02\x7f\x03\x10\xff\xec\x02\x7f\x03\x18\xff\xec\x02\x80\x00\ +\x0f\xff\x85\x02\x80\x00\x11\xff\x85\x02\x80\x01\x9f\xff\xec\x02\ +\x80\x01\xa4\xff\x9a\x02\x80\x01\xaa\xffq\x02\x80\x01\xae\xff\ +\x9a\x02\x80\x01\xb5\xff\x9a\x02\x80\x01\xb8\xff\xec\x02\x80\x01\ +\xbb\xff\xec\x02\x80\x01\xbe\xff\xc3\x02\x80\x01\xc9\xff\xec\x02\ +\x80\x01\xce\xff\xae\x02\x80\x01\xcf\xff\xd7\x02\x80\x01\xd5\xff\ +\xae\x02\x80\x01\xd8\xff\xd7\x02\x80\x01\xdb\xff\xd7\x02\x80\x01\ +\xde\xff\xd7\x02\x80\x01\xe1\xff\xd7\x02\x80\x01\xea\xff\xd7\x02\ +\x80\x01\xeb\x00f\x02\x80\x01\xed\xff\xd7\x02\x80\x01\xee\xff\ +\xec\x02\x80\x01\xf2\xff\xae\x02\x80\x01\xf4\x00f\x02\x80\x02\ +\x08\xff\x85\x02\x80\x02\x0c\xff\x85\x02\x80\x02j\xff\xd7\x02\ +\x80\x02l\xff\xec\x02\x80\x02r\xffq\x02\x80\x02s\xff\ +\xae\x02\x80\x02~\xff\xec\x02\x80\x02\x7f\xff\xd7\x02\x80\x02\ +\x84\xff\xec\x02\x80\x02\x85\xff\xd7\x02\x80\x02\x86\xff\xec\x02\ +\x80\x02\x87\xff\xd7\x02\x80\x02\x88\xff\xec\x02\x80\x02\x89\xff\ +\xd7\x02\x80\x02\x8a\xff\xec\x02\x80\x02\x8c\xff\xec\x02\x80\x02\ +\x8d\xff\xd7\x02\x80\x02\x98\x00f\x02\x80\x02\xa8\x00f\x02\ +\x80\x02\xb1\xff\xec\x02\x80\x02\xb2\xff\xd7\x02\x80\x02\xb3\xff\ +\xec\x02\x80\x02\xb4\xff\xd7\x02\x80\x02\xc0\xff\xd7\x02\x80\x02\ +\xc2\xff\xd7\x02\x80\x02\xc5\xff\xd7\x02\x80\x02\xc6\xff\xc3\x02\ +\x80\x02\xc7\xff\xd7\x02\x80\x02\xc8\xff\xc3\x02\x80\x02\xce\xff\ +\x9a\x02\x80\x02\xcf\xff\xae\x02\x80\x02\xd5\xff\xd7\x02\x80\x02\ +\xd9\xffq\x02\x80\x02\xdb\xffq\x02\x80\x02\xdd\xffq\x02\ +\x80\x02\xe0\xff\xd7\x02\x80\x02\xef\xff\xec\x02\x80\x02\xf0\xff\ +\xd7\x02\x80\x02\xf1\xff\xec\x02\x80\x02\xf2\xff\xd7\x02\x80\x02\ +\xf3\xff\xec\x02\x80\x02\xf4\xff\xd7\x02\x80\x02\xfe\xff\xd7\x02\ +\x80\x03\x09\xffq\x02\x80\x03\x0a\xff\xd7\x02\x80\x03\x0b\xff\ +q\x02\x80\x03\x0c\xff\xd7\x02\x80\x03\x11\xff\x9a\x02\x80\x03\ +\x12\xff\xae\x02\x80\x03\x15\xff\xec\x02\x80\x03\x16\xff\xd7\x02\ +\x80\x03\x1a\xff\xd7\x02\x80\x03\x1b\xff\x9a\x02\x80\x03\x1c\xff\ +\xae\x02\x81\x00\x0f\xff\xae\x02\x81\x00\x11\xff\xae\x02\x81\x01\ +\xce\xff\xd7\x02\x81\x01\xd5\xff\xd7\x02\x81\x01\xf2\xff\xd7\x02\ +\x81\x02\x08\xff\xae\x02\x81\x02\x0c\xff\xae\x02\x81\x02s\xff\ +\xd7\x02\x81\x02\xcf\xff\xd7\x02\x81\x03\x12\xff\xd7\x02\x81\x03\ +\x1c\xff\xd7\x02\x82\x00\x0f\xff\x85\x02\x82\x00\x11\xff\x85\x02\ +\x82\x01\x9f\xff\xec\x02\x82\x01\xa4\xff\x9a\x02\x82\x01\xaa\xff\ +q\x02\x82\x01\xae\xff\x9a\x02\x82\x01\xb5\xff\x9a\x02\x82\x01\ +\xb8\xff\xec\x02\x82\x01\xbb\xff\xec\x02\x82\x01\xbe\xff\xc3\x02\ +\x82\x01\xc9\xff\xec\x02\x82\x01\xce\xff\xae\x02\x82\x01\xcf\xff\ +\xd7\x02\x82\x01\xd5\xff\xae\x02\x82\x01\xd8\xff\xd7\x02\x82\x01\ +\xdb\xff\xd7\x02\x82\x01\xde\xff\xd7\x02\x82\x01\xe1\xff\xd7\x02\ +\x82\x01\xea\xff\xd7\x02\x82\x01\xeb\x00f\x02\x82\x01\xed\xff\ +\xd7\x02\x82\x01\xee\xff\xec\x02\x82\x01\xf2\xff\xae\x02\x82\x01\ +\xf4\x00f\x02\x82\x02\x08\xff\x85\x02\x82\x02\x0c\xff\x85\x02\ +\x82\x02j\xff\xd7\x02\x82\x02l\xff\xec\x02\x82\x02r\xff\ +q\x02\x82\x02s\xff\xae\x02\x82\x02~\xff\xec\x02\x82\x02\ +\x7f\xff\xd7\x02\x82\x02\x84\xff\xec\x02\x82\x02\x85\xff\xd7\x02\ +\x82\x02\x86\xff\xec\x02\x82\x02\x87\xff\xd7\x02\x82\x02\x88\xff\ +\xec\x02\x82\x02\x89\xff\xd7\x02\x82\x02\x8a\xff\xec\x02\x82\x02\ +\x8c\xff\xec\x02\x82\x02\x8d\xff\xd7\x02\x82\x02\x98\x00f\x02\ +\x82\x02\xa8\x00f\x02\x82\x02\xb1\xff\xec\x02\x82\x02\xb2\xff\ +\xd7\x02\x82\x02\xb3\xff\xec\x02\x82\x02\xb4\xff\xd7\x02\x82\x02\ +\xc0\xff\xd7\x02\x82\x02\xc2\xff\xd7\x02\x82\x02\xc5\xff\xd7\x02\ +\x82\x02\xc6\xff\xc3\x02\x82\x02\xc7\xff\xd7\x02\x82\x02\xc8\xff\ +\xc3\x02\x82\x02\xce\xff\x9a\x02\x82\x02\xcf\xff\xae\x02\x82\x02\ +\xd5\xff\xd7\x02\x82\x02\xd9\xffq\x02\x82\x02\xdb\xffq\x02\ +\x82\x02\xdd\xffq\x02\x82\x02\xe0\xff\xd7\x02\x82\x02\xef\xff\ +\xec\x02\x82\x02\xf0\xff\xd7\x02\x82\x02\xf1\xff\xec\x02\x82\x02\ +\xf2\xff\xd7\x02\x82\x02\xf3\xff\xec\x02\x82\x02\xf4\xff\xd7\x02\ +\x82\x02\xfe\xff\xd7\x02\x82\x03\x09\xffq\x02\x82\x03\x0a\xff\ +\xd7\x02\x82\x03\x0b\xffq\x02\x82\x03\x0c\xff\xd7\x02\x82\x03\ +\x11\xff\x9a\x02\x82\x03\x12\xff\xae\x02\x82\x03\x15\xff\xec\x02\ +\x82\x03\x16\xff\xd7\x02\x82\x03\x1a\xff\xd7\x02\x82\x03\x1b\xff\ +\x9a\x02\x82\x03\x1c\xff\xae\x02\x83\x00\x0f\xff\xae\x02\x83\x00\ +\x11\xff\xae\x02\x83\x01\xce\xff\xd7\x02\x83\x01\xd5\xff\xd7\x02\ +\x83\x01\xf2\xff\xd7\x02\x83\x02\x08\xff\xae\x02\x83\x02\x0c\xff\ +\xae\x02\x83\x02s\xff\xd7\x02\x83\x02\xcf\xff\xd7\x02\x83\x03\ +\x12\xff\xd7\x02\x83\x03\x1c\xff\xd7\x02\x84\x00\x0f\xff\xae\x02\ +\x84\x00\x11\xff\xae\x02\x84\x01\xce\xff\xd7\x02\x84\x01\xd5\xff\ +\xd7\x02\x84\x01\xf2\xff\xd7\x02\x84\x02\x08\xff\xae\x02\x84\x02\ +\x0c\xff\xae\x02\x84\x02s\xff\xd7\x02\x84\x02\xcf\xff\xd7\x02\ +\x84\x03\x12\xff\xd7\x02\x84\x03\x1c\xff\xd7\x02\x85\x00\x0f\xff\ +\xae\x02\x85\x00\x11\xff\xae\x02\x85\x01\xce\xff\xd7\x02\x85\x01\ +\xd5\xff\xd7\x02\x85\x01\xf2\xff\xd7\x02\x85\x02\x08\xff\xae\x02\ +\x85\x02\x0c\xff\xae\x02\x85\x02s\xff\xd7\x02\x85\x02\xcf\xff\ +\xd7\x02\x85\x03\x12\xff\xd7\x02\x85\x03\x1c\xff\xd7\x02\x86\x00\ +\x0f\xff\xae\x02\x86\x00\x11\xff\xae\x02\x86\x01\x9d\xff\xec\x02\ +\x86\x01\xa4\xff\xd7\x02\x86\x01\xa6\xff\xec\x02\x86\x01\xa8\xff\ +\xd7\x02\x86\x01\xaa\xff\xd7\x02\x86\x01\xae\xff\xd7\x02\x86\x01\ +\xb0\xff\xd7\x02\x86\x01\xb1\xff\xec\x02\x86\x01\xb5\xff\xd7\x02\ +\x86\x01\xbc\xff\xc3\x02\x86\x01\xbd\xff\xd7\x02\x86\x01\xbf\xff\ +\xd7\x02\x86\x01\xc1\xff\xd7\x02\x86\x01\xc4\xff\xec\x02\x86\x01\ +\xc7\xff\xec\x02\x86\x01\xce\xff\xec\x02\x86\x01\xd5\xff\xec\x02\ +\x86\x01\xf2\xff\xec\x02\x86\x02\x08\xff\xae\x02\x86\x02\x0c\xff\ +\xae\x02\x86\x02r\xff\xd7\x02\x86\x02s\xff\xec\x02\x86\x02\ +z\xff\xec\x02\x86\x02|\xff\xd7\x02\x86\x02\x80\xff\xec\x02\ +\x86\x02\x82\xff\xec\x02\x86\x02\x9f\xff\xd7\x02\x86\x02\xa1\xff\ +\xec\x02\x86\x02\xa9\xff\xec\x02\x86\x02\xb5\xff\xc3\x02\x86\x02\ +\xb7\xff\xec\x02\x86\x02\xb9\xff\xec\x02\x86\x02\xbb\xff\xd7\x02\ +\x86\x02\xbd\xff\xec\x02\x86\x02\xbf\xff\xd7\x02\x86\x02\xc1\xff\ +\xd7\x02\x86\x02\xca\xff\xd7\x02\x86\x02\xce\xff\xd7\x02\x86\x02\ +\xcf\xff\xec\x02\x86\x02\xd4\xff\xd7\x02\x86\x02\xd9\xff\xd7\x02\ +\x86\x02\xdb\xff\xd7\x02\x86\x02\xdd\xff\xd7\x02\x86\x02\xe5\xff\ +\xd7\x02\x86\x02\xe7\xff\xec\x02\x86\x02\xf5\xff\xec\x02\x86\x02\ +\xf7\xff\xd7\x02\x86\x02\xf9\xff\xd7\x02\x86\x02\xfb\xff\xd7\x02\ +\x86\x02\xfd\xff\xd7\x02\x86\x03\x05\xff\xd7\x02\x86\x03\x07\xff\ +\xd7\x02\x86\x03\x0d\xff\xd7\x02\x86\x03\x0f\xff\xd7\x02\x86\x03\ +\x11\xff\xd7\x02\x86\x03\x12\xff\xec\x02\x86\x03\x17\xff\xec\x02\ +\x86\x03\x1b\xff\xd7\x02\x86\x03\x1c\xff\xec\x02\x87\x00\x05\xff\ +\xec\x02\x87\x00\x0a\xff\xec\x02\x87\x01\xd0\xff\xd7\x02\x87\x01\ +\xdc\xff\xec\x02\x87\x01\xdd\xff\xec\x02\x87\x01\xdf\xff\xd7\x02\ +\x87\x01\xe1\xff\xec\x02\x87\x01\xe4\xff\xec\x02\x87\x01\xf6\xff\ +\xec\x02\x87\x02\x07\xff\xec\x02\x87\x02\x0b\xff\xec\x02\x87\x02\ +\xa0\xff\xd7\x02\x87\x02\xaa\xff\xec\x02\x87\x02\xb6\xff\xec\x02\ +\x87\x02\xbc\xff\xd7\x02\x87\x02\xbe\xff\xec\x02\x87\x02\xc0\xff\ +\xec\x02\x87\x02\xc2\xff\xec\x02\x87\x02\xcb\xff\xd7\x02\x87\x02\ +\xd5\xff\xec\x02\x87\x02\xe6\xff\xd7\x02\x87\x02\xf8\xff\xec\x02\ +\x87\x02\xfa\xff\xec\x02\x87\x02\xfc\xff\xec\x02\x87\x02\xfe\xff\ +\xec\x02\x87\x03\x06\xff\xd7\x02\x87\x03\x08\xff\xd7\x02\x87\x03\ +\x0e\xff\xec\x02\x87\x03\x10\xff\xec\x02\x87\x03\x18\xff\xec\x02\ +\x88\x00\x0f\xff\xae\x02\x88\x00\x11\xff\xae\x02\x88\x01\x9d\xff\ +\xec\x02\x88\x01\xa4\xff\xd7\x02\x88\x01\xa6\xff\xec\x02\x88\x01\ +\xa8\xff\xd7\x02\x88\x01\xaa\xff\xd7\x02\x88\x01\xae\xff\xd7\x02\ +\x88\x01\xb0\xff\xd7\x02\x88\x01\xb1\xff\xec\x02\x88\x01\xb5\xff\ +\xd7\x02\x88\x01\xbc\xff\xc3\x02\x88\x01\xbd\xff\xd7\x02\x88\x01\ +\xbf\xff\xd7\x02\x88\x01\xc1\xff\xd7\x02\x88\x01\xc4\xff\xec\x02\ +\x88\x01\xc7\xff\xec\x02\x88\x01\xce\xff\xec\x02\x88\x01\xd5\xff\ +\xec\x02\x88\x01\xf2\xff\xec\x02\x88\x02\x08\xff\xae\x02\x88\x02\ +\x0c\xff\xae\x02\x88\x02r\xff\xd7\x02\x88\x02s\xff\xec\x02\ +\x88\x02z\xff\xec\x02\x88\x02|\xff\xd7\x02\x88\x02\x80\xff\ +\xec\x02\x88\x02\x82\xff\xec\x02\x88\x02\x9f\xff\xd7\x02\x88\x02\ +\xa1\xff\xec\x02\x88\x02\xa9\xff\xec\x02\x88\x02\xb5\xff\xc3\x02\ +\x88\x02\xb7\xff\xec\x02\x88\x02\xb9\xff\xec\x02\x88\x02\xbb\xff\ +\xd7\x02\x88\x02\xbd\xff\xec\x02\x88\x02\xbf\xff\xd7\x02\x88\x02\ +\xc1\xff\xd7\x02\x88\x02\xca\xff\xd7\x02\x88\x02\xce\xff\xd7\x02\ +\x88\x02\xcf\xff\xec\x02\x88\x02\xd4\xff\xd7\x02\x88\x02\xd9\xff\ +\xd7\x02\x88\x02\xdb\xff\xd7\x02\x88\x02\xdd\xff\xd7\x02\x88\x02\ +\xe5\xff\xd7\x02\x88\x02\xe7\xff\xec\x02\x88\x02\xf5\xff\xec\x02\ +\x88\x02\xf7\xff\xd7\x02\x88\x02\xf9\xff\xd7\x02\x88\x02\xfb\xff\ +\xd7\x02\x88\x02\xfd\xff\xd7\x02\x88\x03\x05\xff\xd7\x02\x88\x03\ +\x07\xff\xd7\x02\x88\x03\x0d\xff\xd7\x02\x88\x03\x0f\xff\xd7\x02\ +\x88\x03\x11\xff\xd7\x02\x88\x03\x12\xff\xec\x02\x88\x03\x17\xff\ +\xec\x02\x88\x03\x1b\xff\xd7\x02\x88\x03\x1c\xff\xec\x02\x89\x00\ +\x05\xff\xec\x02\x89\x00\x0a\xff\xec\x02\x89\x01\xd0\xff\xd7\x02\ +\x89\x01\xdc\xff\xec\x02\x89\x01\xdd\xff\xec\x02\x89\x01\xdf\xff\ +\xd7\x02\x89\x01\xe1\xff\xec\x02\x89\x01\xe4\xff\xec\x02\x89\x01\ +\xf6\xff\xec\x02\x89\x02\x07\xff\xec\x02\x89\x02\x0b\xff\xec\x02\ +\x89\x02\xa0\xff\xd7\x02\x89\x02\xaa\xff\xec\x02\x89\x02\xb6\xff\ +\xec\x02\x89\x02\xbc\xff\xd7\x02\x89\x02\xbe\xff\xec\x02\x89\x02\ +\xc0\xff\xec\x02\x89\x02\xc2\xff\xec\x02\x89\x02\xcb\xff\xd7\x02\ +\x89\x02\xd5\xff\xec\x02\x89\x02\xe6\xff\xd7\x02\x89\x02\xf8\xff\ +\xec\x02\x89\x02\xfa\xff\xec\x02\x89\x02\xfc\xff\xec\x02\x89\x02\ +\xfe\xff\xec\x02\x89\x03\x06\xff\xd7\x02\x89\x03\x08\xff\xd7\x02\ +\x89\x03\x0e\xff\xec\x02\x89\x03\x10\xff\xec\x02\x89\x03\x18\xff\ +\xec\x02\x8a\x00\x0f\xff\xae\x02\x8a\x00\x11\xff\xae\x02\x8a\x01\ +\x9d\xff\xec\x02\x8a\x01\xa4\xff\xd7\x02\x8a\x01\xa6\xff\xec\x02\ +\x8a\x01\xa8\xff\xd7\x02\x8a\x01\xaa\xff\xd7\x02\x8a\x01\xae\xff\ +\xd7\x02\x8a\x01\xb0\xff\xd7\x02\x8a\x01\xb1\xff\xec\x02\x8a\x01\ +\xb5\xff\xd7\x02\x8a\x01\xbc\xff\xc3\x02\x8a\x01\xbd\xff\xd7\x02\ +\x8a\x01\xbf\xff\xd7\x02\x8a\x01\xc1\xff\xd7\x02\x8a\x01\xc4\xff\ +\xec\x02\x8a\x01\xc7\xff\xec\x02\x8a\x01\xce\xff\xec\x02\x8a\x01\ +\xd5\xff\xec\x02\x8a\x01\xf2\xff\xec\x02\x8a\x02\x08\xff\xae\x02\ +\x8a\x02\x0c\xff\xae\x02\x8a\x02r\xff\xd7\x02\x8a\x02s\xff\ +\xec\x02\x8a\x02z\xff\xec\x02\x8a\x02|\xff\xd7\x02\x8a\x02\ +\x80\xff\xec\x02\x8a\x02\x82\xff\xec\x02\x8a\x02\x9f\xff\xd7\x02\ +\x8a\x02\xa1\xff\xec\x02\x8a\x02\xa9\xff\xec\x02\x8a\x02\xb5\xff\ +\xc3\x02\x8a\x02\xb7\xff\xec\x02\x8a\x02\xb9\xff\xec\x02\x8a\x02\ +\xbb\xff\xd7\x02\x8a\x02\xbd\xff\xec\x02\x8a\x02\xbf\xff\xd7\x02\ +\x8a\x02\xc1\xff\xd7\x02\x8a\x02\xca\xff\xd7\x02\x8a\x02\xce\xff\ +\xd7\x02\x8a\x02\xcf\xff\xec\x02\x8a\x02\xd4\xff\xd7\x02\x8a\x02\ +\xd9\xff\xd7\x02\x8a\x02\xdb\xff\xd7\x02\x8a\x02\xdd\xff\xd7\x02\ +\x8a\x02\xe5\xff\xd7\x02\x8a\x02\xe7\xff\xec\x02\x8a\x02\xf5\xff\ +\xec\x02\x8a\x02\xf7\xff\xd7\x02\x8a\x02\xf9\xff\xd7\x02\x8a\x02\ +\xfb\xff\xd7\x02\x8a\x02\xfd\xff\xd7\x02\x8a\x03\x05\xff\xd7\x02\ +\x8a\x03\x07\xff\xd7\x02\x8a\x03\x0d\xff\xd7\x02\x8a\x03\x0f\xff\ +\xd7\x02\x8a\x03\x11\xff\xd7\x02\x8a\x03\x12\xff\xec\x02\x8a\x03\ +\x17\xff\xec\x02\x8a\x03\x1b\xff\xd7\x02\x8a\x03\x1c\xff\xec\x02\ +\x8b\x00\x0f\xff\xae\x02\x8b\x00\x11\xff\xae\x02\x8b\x01\xce\xff\ +\xd7\x02\x8b\x01\xd5\xff\xd7\x02\x8b\x01\xf2\xff\xd7\x02\x8b\x02\ +\x08\xff\xae\x02\x8b\x02\x0c\xff\xae\x02\x8b\x02s\xff\xd7\x02\ +\x8b\x02\xcf\xff\xd7\x02\x8b\x03\x12\xff\xd7\x02\x8b\x03\x1c\xff\ +\xd7\x02\x8c\x01\x9f\xff\xd7\x02\x8c\x01\xb8\xff\xd7\x02\x8c\x01\ +\xbb\xff\xd7\x02\x8c\x01\xbe\xff\xd7\x02\x8c\x01\xe1\xff\xd7\x02\ +\x8c\x02l\xff\xd7\x02\x8c\x02~\xff\xd7\x02\x8c\x02\x84\xff\ +\xd7\x02\x8c\x02\x86\xff\xd7\x02\x8c\x02\x88\xff\xd7\x02\x8c\x02\ +\x8a\xff\xd7\x02\x8c\x02\x8c\xff\xd7\x02\x8c\x02\xb1\xff\xd7\x02\ +\x8c\x02\xb3\xff\xd7\x02\x8c\x02\xc0\xff\xd7\x02\x8c\x02\xc2\xff\ +\xd7\x02\x8c\x02\xc5\xff\xd7\x02\x8c\x02\xc7\xff\xd7\x02\x8c\x02\ +\xd5\xff\xd7\x02\x8c\x02\xef\xff\xd7\x02\x8c\x02\xf1\xff\xd7\x02\ +\x8c\x02\xf3\xff\xd7\x02\x8c\x02\xfe\xff\xd7\x02\x8c\x03\x09\xff\ +\xd7\x02\x8c\x03\x0b\xff\xd7\x02\x8c\x03\x0e\xff\xd7\x02\x8c\x03\ +\x10\xff\xd7\x02\x8c\x03\x15\xff\xd7\x02\x95\x01\xa3\x00\xe1\x02\ +\x95\x02\xea\x00)\x02\x95\x03\x0e\xff\xd7\x02\x95\x03\x10\xff\ +\xd7\x02\x96\x00\x05\xff\xec\x02\x96\x00\x0a\xff\xec\x02\x96\x02\ +\x07\xff\xec\x02\x96\x02\x0b\xff\xec\x02\x97\x00\x05\xff\xae\x02\ +\x97\x00\x0a\xff\xae\x02\x97\x01\x9d\xff\xd7\x02\x97\x01\xa6\xff\ +\xd7\x02\x97\x01\xbc\xff\xae\x02\x97\x01\xc1\xff\xae\x02\x97\x01\ +\xc4\xff\xd7\x02\x97\x01\xdc\xff\xd7\x02\x97\x01\xe4\xff\xd7\x02\ +\x97\x02\x07\xff\xae\x02\x97\x02\x0b\xff\xae\x02\x97\x02|\xff\ +\xae\x02\x97\x02\x80\xff\xc3\x02\x97\x02\x82\xff\xc3\x02\x97\x02\ +\xa9\xff\xd7\x02\x97\x02\xaa\xff\xd7\x02\x97\x02\xb5\xff\xae\x02\ +\x97\x02\xb6\xff\xd7\x02\x97\x02\xb7\xff\xc3\x02\x97\x02\xb9\xff\ +\xc3\x02\x97\x02\xbd\xff\xd7\x02\x97\x02\xbe\xff\xd7\x02\x97\x02\ +\xbf\xff\xae\x02\x97\x02\xc1\xff\xae\x02\x97\x02\xd4\xff\xae\x02\ +\x97\x02\xfd\xff\xae\x02\x97\x03\x0d\xff\x9a\x02\x97\x03\x0f\xff\ +\x9a\x02\x97\x03\x17\xff\xd7\x02\x97\x03\x18\xff\xd7\x02\x98\x00\ +\x05\xff\x85\x02\x98\x00\x0a\xff\x85\x02\x98\x01\xd0\xff\xd7\x02\ +\x98\x01\xdc\xff\x9a\x02\x98\x01\xdd\xff\xc3\x02\x98\x01\xdf\xff\ +\xd7\x02\x98\x01\xe1\xff\xae\x02\x98\x01\xe4\xff\x9a\x02\x98\x01\ +\xf6\xff\xc3\x02\x98\x02\x07\xff\x85\x02\x98\x02\x0b\xff\x85\x02\ +\x98\x02m\xff\xd7\x02\x98\x02\x81\xff\xd7\x02\x98\x02\x83\xff\ +\xd7\x02\x98\x02\x8b\xff\xd7\x02\x98\x02\xa0\xff\xd7\x02\x98\x02\ +\xaa\xff\x9a\x02\x98\x02\xb6\xff\x9a\x02\x98\x02\xb8\xff\xc3\x02\ +\x98\x02\xba\xff\xc3\x02\x98\x02\xbc\xff\xd7\x02\x98\x02\xbe\xff\ +\x9a\x02\x98\x02\xc0\xff\xae\x02\x98\x02\xc2\xff\xae\x02\x98\x02\ +\xc6\xff\xd7\x02\x98\x02\xc8\xff\xd7\x02\x98\x02\xcb\xff\xd7\x02\ +\x98\x02\xd5\xff\xae\x02\x98\x02\xe6\xff\xd7\x02\x98\x02\xea\xff\ +\xd7\x02\x98\x02\xf8\xff\xc3\x02\x98\x02\xfa\xff\xc3\x02\x98\x02\ +\xfc\xff\xc3\x02\x98\x02\xfe\xff\xae\x02\x98\x03\x06\xff\xd7\x02\ +\x98\x03\x08\xff\xd7\x02\x98\x03\x0e\xff\x9a\x02\x98\x03\x10\xff\ +\x9a\x02\x98\x03\x18\xff\x9a\x02\x99\x00\x0f\xfe\xf6\x02\x99\x00\ +\x11\xfe\xf6\x02\x99\x01\xa4\xff\x85\x02\x99\x01\xaa\xff\x9a\x02\ +\x99\x01\xae\xff\x85\x02\x99\x01\xb0\xff\xd7\x02\x99\x01\xb5\xff\ +\x85\x02\x99\x01\xbf\xff\xd7\x02\x99\x01\xce\xff\x9a\x02\x99\x01\ +\xd5\xff\x9a\x02\x99\x01\xf2\xff\x9a\x02\x99\x02\x08\xfe\xf6\x02\ +\x99\x02\x0c\xfe\xf6\x02\x99\x02r\xff\x9a\x02\x99\x02s\xff\ +\x9a\x02\x99\x02v\xff\xec\x02\x99\x02\x9f\xff\xd7\x02\x99\x02\ +\xbb\xff\xd7\x02\x99\x02\xca\xff\xd7\x02\x99\x02\xce\xff\x85\x02\ +\x99\x02\xcf\xff\x9a\x02\x99\x02\xd9\xff\x9a\x02\x99\x02\xdb\xff\ +\x9a\x02\x99\x02\xdd\xff\x9a\x02\x99\x02\xe5\xff\xd7\x02\x99\x03\ +\x05\xff\xd7\x02\x99\x03\x07\xff\xd7\x02\x99\x03\x09\xff\xae\x02\ +\x99\x03\x0b\xff\xae\x02\x99\x03\x11\xff\x85\x02\x99\x03\x12\xff\ +\x9a\x02\x99\x03\x1b\xff\x85\x02\x99\x03\x1c\xff\x9a\x02\x9a\x00\ +\x05\xff\xec\x02\x9a\x00\x0a\xff\xec\x02\x9a\x01\xd0\xff\xd7\x02\ +\x9a\x01\xdc\xff\xec\x02\x9a\x01\xdd\xff\xec\x02\x9a\x01\xdf\xff\ +\xd7\x02\x9a\x01\xe1\xff\xec\x02\x9a\x01\xe4\xff\xec\x02\x9a\x01\ +\xf6\xff\xec\x02\x9a\x02\x07\xff\xec\x02\x9a\x02\x0b\xff\xec\x02\ +\x9a\x02\xa0\xff\xd7\x02\x9a\x02\xaa\xff\xec\x02\x9a\x02\xb6\xff\ +\xec\x02\x9a\x02\xbc\xff\xd7\x02\x9a\x02\xbe\xff\xec\x02\x9a\x02\ +\xc0\xff\xec\x02\x9a\x02\xc2\xff\xec\x02\x9a\x02\xcb\xff\xd7\x02\ +\x9a\x02\xd5\xff\xec\x02\x9a\x02\xe6\xff\xd7\x02\x9a\x02\xf8\xff\ +\xec\x02\x9a\x02\xfa\xff\xec\x02\x9a\x02\xfc\xff\xec\x02\x9a\x02\ +\xfe\xff\xec\x02\x9a\x03\x06\xff\xd7\x02\x9a\x03\x08\xff\xd7\x02\ +\x9a\x03\x0e\xff\xec\x02\x9a\x03\x10\xff\xec\x02\x9a\x03\x18\xff\ +\xec\x02\x9b\x00\x0f\xff\x9a\x02\x9b\x00\x10\xff\xd7\x02\x9b\x00\ +\x11\xff\x9a\x02\x9b\x01\x9d\x00)\x02\x9b\x01\x9f\xff\xd7\x02\ +\x9b\x01\xa4\xff\xae\x02\x9b\x01\xa6\x00)\x02\x9b\x01\xaa\xff\ +\x85\x02\x9b\x01\xae\xff\xae\x02\x9b\x01\xb5\xff\xae\x02\x9b\x01\ +\xb8\xff\xd7\x02\x9b\x01\xbb\xff\xd7\x02\x9b\x01\xbc\x00)\x02\ +\x9b\x01\xbe\xff\xc3\x02\x9b\x01\xc4\x00)\x02\x9b\x01\xcc\xff\ +\xc3\x02\x9b\x01\xcd\xff\xc3\x02\x9b\x01\xce\xff\x9a\x02\x9b\x01\ +\xcf\xff\xae\x02\x9b\x01\xd0\xff\xd7\x02\x9b\x01\xd1\xff\xd7\x02\ +\x9b\x01\xd2\xff\xc3\x02\x9b\x01\xd3\xff\xc3\x02\x9b\x01\xd4\xff\ +\xc3\x02\x9b\x01\xd5\xff\x9a\x02\x9b\x01\xd6\xff\xc3\x02\x9b\x01\ +\xd7\xff\xc3\x02\x9b\x01\xd8\xff\xae\x02\x9b\x01\xd9\xff\xc3\x02\ +\x9b\x01\xda\xff\xc3\x02\x9b\x01\xdb\xff\xae\x02\x9b\x01\xde\xff\ +\xae\x02\x9b\x01\xdf\xff\xd7\x02\x9b\x01\xe0\xff\xc3\x02\x9b\x01\ +\xe1\xff\x9a\x02\x9b\x01\xe2\xff\xc3\x02\x9b\x01\xe3\xff\xc3\x02\ +\x9b\x01\xe5\xff\xc3\x02\x9b\x01\xe6\xff\xc3\x02\x9b\x01\xe7\xff\ +\xd7\x02\x9b\x01\xe8\xff\xc3\x02\x9b\x01\xea\xff\xae\x02\x9b\x01\ +\xeb\x00)\x02\x9b\x01\xec\xff\xc3\x02\x9b\x01\xed\xff\xae\x02\ +\x9b\x01\xee\xff\xc3\x02\x9b\x01\xf2\xff\x9a\x02\x9b\x01\xf3\xff\ +\xc3\x02\x9b\x01\xf4\x00)\x02\x9b\x01\xf5\xff\xc3\x02\x9b\x01\ +\xf7\xff\xc3\x02\x9b\x01\xf9\xff\xc3\x02\x9b\x02\x02\xff\xd7\x02\ +\x9b\x02\x03\xff\xd7\x02\x9b\x02\x04\xff\xd7\x02\x9b\x02\x08\xff\ +\x9a\x02\x9b\x02\x0c\xff\x9a\x02\x9b\x02j\xff\xae\x02\x9b\x02\ +k\xff\xc3\x02\x9b\x02l\xff\xd7\x02\x9b\x02q\xff\xc3\x02\ +\x9b\x02r\xff\x85\x02\x9b\x02s\xff\x9a\x02\x9b\x02u\xff\ +\xc3\x02\x9b\x02w\xff\xd7\x02\x9b\x02y\xff\xc3\x02\x9b\x02\ +}\xff\xc3\x02\x9b\x02~\xff\xd7\x02\x9b\x02\x7f\xff\xae\x02\ +\x9b\x02\x84\xff\xd7\x02\x9b\x02\x85\xff\xae\x02\x9b\x02\x86\xff\ +\xd7\x02\x9b\x02\x87\xff\xae\x02\x9b\x02\x88\xff\xd7\x02\x9b\x02\ +\x89\xff\xae\x02\x9b\x02\x8a\xff\xd7\x02\x9b\x02\x8c\xff\xd7\x02\ +\x9b\x02\x8d\xff\xae\x02\x9b\x02\x96\xff\xc3\x02\x9b\x02\x98\x00\ +)\x02\x9b\x02\x9a\xff\xc3\x02\x9b\x02\x9e\xff\xc3\x02\x9b\x02\ +\xa0\xff\xd7\x02\x9b\x02\xa2\xff\xd7\x02\x9b\x02\xa4\xff\xc3\x02\ +\x9b\x02\xa6\xff\xc3\x02\x9b\x02\xa8\x00)\x02\x9b\x02\xa9\x00\ +)\x02\x9b\x02\xac\xff\xc3\x02\x9b\x02\xae\xff\xc3\x02\x9b\x02\ +\xb0\xff\xc3\x02\x9b\x02\xb1\xff\xd7\x02\x9b\x02\xb2\xff\xae\x02\ +\x9b\x02\xb3\xff\xd7\x02\x9b\x02\xb4\xff\xae\x02\x9b\x02\xb5\x00\ +)\x02\x9b\x02\xbc\xff\xd7\x02\x9b\x02\xbd\x00)\x02\x9b\x02\ +\xc0\xff\x9a\x02\x9b\x02\xc2\xff\x9a\x02\x9b\x02\xc4\xff\xc3\x02\ +\x9b\x02\xc5\xff\xd7\x02\x9b\x02\xc6\xff\xc3\x02\x9b\x02\xc7\xff\ +\xd7\x02\x9b\x02\xc8\xff\xc3\x02\x9b\x02\xcb\xff\xd7\x02\x9b\x02\ +\xcd\xff\xc3\x02\x9b\x02\xce\xff\xae\x02\x9b\x02\xcf\xff\x9a\x02\ +\x9b\x02\xd1\xff\xc3\x02\x9b\x02\xd3\xff\xc3\x02\x9b\x02\xd5\xff\ +\x9a\x02\x9b\x02\xd7\xff\xc3\x02\x9b\x02\xd9\xff\x85\x02\x9b\x02\ +\xdb\xff\x85\x02\x9b\x02\xdd\xff\x85\x02\x9b\x02\xe0\xff\xae\x02\ +\x9b\x02\xe6\xff\xd7\x02\x9b\x02\xe8\xff\xd7\x02\x9b\x02\xec\xff\ +\xc3\x02\x9b\x02\xee\xff\xc3\x02\x9b\x02\xef\xff\xd7\x02\x9b\x02\ +\xf0\xff\xae\x02\x9b\x02\xf1\xff\xd7\x02\x9b\x02\xf2\xff\xae\x02\ +\x9b\x02\xf3\xff\xd7\x02\x9b\x02\xf4\xff\xae\x02\x9b\x02\xf6\xff\ +\xd7\x02\x9b\x02\xfe\xff\x9a\x02\x9b\x03\x00\xff\xc3\x02\x9b\x03\ +\x02\xff\xc3\x02\x9b\x03\x06\xff\xd7\x02\x9b\x03\x08\xff\xd7\x02\ +\x9b\x03\x09\xff\x9a\x02\x9b\x03\x0a\xff\xae\x02\x9b\x03\x0b\xff\ +\x9a\x02\x9b\x03\x0c\xff\xae\x02\x9b\x03\x0e\xff\xd7\x02\x9b\x03\ +\x10\xff\xd7\x02\x9b\x03\x11\xff\xae\x02\x9b\x03\x12\xff\x9a\x02\ +\x9b\x03\x14\xff\xc3\x02\x9b\x03\x15\xff\xd7\x02\x9b\x03\x16\xff\ +\xae\x02\x9b\x03\x17\x00)\x02\x9b\x03\x1a\xff\xae\x02\x9b\x03\ +\x1b\xff\xae\x02\x9b\x03\x1c\xff\x9a\x02\x9c\x00\x0f\xff\xc3\x02\ +\x9c\x00\x11\xff\xc3\x02\x9c\x01\xce\xff\xc3\x02\x9c\x01\xcf\xff\ +\xd7\x02\x9c\x01\xd5\xff\xc3\x02\x9c\x01\xd8\xff\xd7\x02\x9c\x01\ +\xdb\xff\xd7\x02\x9c\x01\xde\xff\xd7\x02\x9c\x01\xea\xff\xd7\x02\ +\x9c\x01\xed\xff\xd7\x02\x9c\x01\xf2\xff\xc3\x02\x9c\x02\x08\xff\ +\xc3\x02\x9c\x02\x0c\xff\xc3\x02\x9c\x02j\xff\xd7\x02\x9c\x02\ +s\xff\xc3\x02\x9c\x02\x7f\xff\xd7\x02\x9c\x02\x85\xff\xd7\x02\ +\x9c\x02\x87\xff\xd7\x02\x9c\x02\x89\xff\xd7\x02\x9c\x02\x8d\xff\ +\xd7\x02\x9c\x02\xb2\xff\xd7\x02\x9c\x02\xb4\xff\xd7\x02\x9c\x02\ +\xcf\xff\xc3\x02\x9c\x02\xe0\xff\xd7\x02\x9c\x02\xf0\xff\xd7\x02\ +\x9c\x02\xf2\xff\xd7\x02\x9c\x02\xf4\xff\xd7\x02\x9c\x03\x0a\xff\ +\xd7\x02\x9c\x03\x0c\xff\xd7\x02\x9c\x03\x12\xff\xc3\x02\x9c\x03\ +\x16\xff\xd7\x02\x9c\x03\x1a\xff\xd7\x02\x9c\x03\x1c\xff\xc3\x02\ +\x9d\x00\x05\xff\xc3\x02\x9d\x00\x0a\xff\xc3\x02\x9d\x01\x9d\xff\ +\xc3\x02\x9d\x01\xa3\x00f\x02\x9d\x01\xa6\xff\xc3\x02\x9d\x01\ +\xbc\xff\xc3\x02\x9d\x01\xc1\xff\xae\x02\x9d\x01\xc4\xff\xc3\x02\ +\x9d\x01\xdc\xff\xd7\x02\x9d\x01\xe1\xff\xd7\x02\x9d\x01\xe4\xff\ +\xd7\x02\x9d\x02\x07\xff\xc3\x02\x9d\x02\x0b\xff\xc3\x02\x9d\x02\ +|\xff\xae\x02\x9d\x02\x80\xff\xc3\x02\x9d\x02\x82\xff\xc3\x02\ +\x9d\x02\xa9\xff\xc3\x02\x9d\x02\xaa\xff\xd7\x02\x9d\x02\xb5\xff\ +\xc3\x02\x9d\x02\xb6\xff\xd7\x02\x9d\x02\xb7\xff\xd7\x02\x9d\x02\ +\xb9\xff\xd7\x02\x9d\x02\xbd\xff\xc3\x02\x9d\x02\xbe\xff\xd7\x02\ +\x9d\x02\xbf\xff\xae\x02\x9d\x02\xc0\xff\xd7\x02\x9d\x02\xc1\xff\ +\xae\x02\x9d\x02\xc2\xff\xd7\x02\x9d\x02\xd4\xff\xae\x02\x9d\x02\ +\xd5\xff\xd7\x02\x9d\x02\xfd\xff\xae\x02\x9d\x02\xfe\xff\xd7\x02\ +\x9d\x03\x0d\xff\xd7\x02\x9d\x03\x0e\xff\xc3\x02\x9d\x03\x0f\xff\ +\xd7\x02\x9d\x03\x10\xff\xc3\x02\x9d\x03\x17\xff\xc3\x02\x9d\x03\ +\x18\xff\xd7\x02\x9e\x00\x05\xff\xc3\x02\x9e\x00\x0a\xff\xc3\x02\ +\x9e\x02\x07\xff\xc3\x02\x9e\x02\x0b\xff\xc3\x02\x9e\x03\x0e\xff\ +\xd7\x02\x9e\x03\x10\xff\xd7\x02\x9f\x01\x9f\xff\xd7\x02\x9f\x01\ +\xa3\x00\xe1\x02\x9f\x01\xb8\xff\xd7\x02\x9f\x01\xbb\xff\xd7\x02\ +\x9f\x01\xbe\xff\xc3\x02\x9f\x01\xdc\xff\xd7\x02\x9f\x01\xe1\xff\ +\xae\x02\x9f\x01\xe4\xff\xd7\x02\x9f\x02l\xff\xd7\x02\x9f\x02\ +{\x00=\x02\x9f\x02}\xff\xec\x02\x9f\x02~\xff\xd7\x02\ +\x9f\x02\x84\xff\xd7\x02\x9f\x02\x86\xff\xd7\x02\x9f\x02\x88\xff\ +\xd7\x02\x9f\x02\x8a\xff\xd7\x02\x9f\x02\x8c\xff\xd7\x02\x9f\x02\ +\xaa\xff\xd7\x02\x9f\x02\xb1\xff\xd7\x02\x9f\x02\xb3\xff\xd7\x02\ +\x9f\x02\xb6\xff\xd7\x02\x9f\x02\xbe\xff\xd7\x02\x9f\x02\xc0\xff\ +\xae\x02\x9f\x02\xc2\xff\xae\x02\x9f\x02\xc5\xff\xc3\x02\x9f\x02\ +\xc6\xff\xd7\x02\x9f\x02\xc7\xff\xc3\x02\x9f\x02\xc8\xff\xd7\x02\ +\x9f\x02\xd5\xff\xae\x02\x9f\x02\xef\xff\xd7\x02\x9f\x02\xf1\xff\ +\xd7\x02\x9f\x02\xf3\xff\xd7\x02\x9f\x02\xfe\xff\xae\x02\x9f\x03\ +\x0e\xff\xd7\x02\x9f\x03\x10\xff\xd7\x02\x9f\x03\x15\xff\xd7\x02\ +\x9f\x03\x18\xff\xd7\x02\xa0\x01\xcf\xff\xec\x02\xa0\x01\xd8\xff\ +\xec\x02\xa0\x01\xdb\xff\xec\x02\xa0\x01\xde\xff\xec\x02\xa0\x01\ +\xe1\xff\xec\x02\xa0\x01\xea\xff\xec\x02\xa0\x01\xed\xff\xec\x02\ +\xa0\x02j\xff\xec\x02\xa0\x02\x7f\xff\xec\x02\xa0\x02\x85\xff\ +\xec\x02\xa0\x02\x87\xff\xec\x02\xa0\x02\x89\xff\xec\x02\xa0\x02\ +\x8d\xff\xec\x02\xa0\x02\xb2\xff\xec\x02\xa0\x02\xb4\xff\xec\x02\ +\xa0\x02\xc0\xff\xec\x02\xa0\x02\xc2\xff\xec\x02\xa0\x02\xd5\xff\ +\xec\x02\xa0\x02\xe0\xff\xec\x02\xa0\x02\xf0\xff\xec\x02\xa0\x02\ +\xf2\xff\xec\x02\xa0\x02\xf4\xff\xec\x02\xa0\x02\xfe\xff\xec\x02\ +\xa0\x03\x0a\xff\xec\x02\xa0\x03\x0c\xff\xec\x02\xa0\x03\x0e\xff\ +\xd7\x02\xa0\x03\x10\xff\xd7\x02\xa0\x03\x16\xff\xec\x02\xa0\x03\ +\x1a\xff\xec\x02\xa1\x00\x0f\xff\xae\x02\xa1\x00\x11\xff\xae\x02\ +\xa1\x02\x08\xff\xae\x02\xa1\x02\x0c\xff\xae\x02\xa1\x02\x80\xff\ +\xec\x02\xa1\x02\x82\xff\xec\x02\xa1\x02\xb7\xff\xec\x02\xa1\x02\ +\xb9\xff\xec\x02\xa1\x03\x0d\xff\xd7\x02\xa1\x03\x0f\xff\xd7\x02\ +\xa2\x01\xe9\x00)\x02\xa3\x01\x9f\xff\xd7\x02\xa3\x01\xa3\x00\ +\xe1\x02\xa3\x01\xb8\xff\xd7\x02\xa3\x01\xbb\xff\xd7\x02\xa3\x01\ +\xbe\xff\xc3\x02\xa3\x01\xdc\xff\xd7\x02\xa3\x01\xe1\xff\xae\x02\ +\xa3\x01\xe4\xff\xd7\x02\xa3\x02l\xff\xd7\x02\xa3\x02{\x00\ +=\x02\xa3\x02}\xff\xec\x02\xa3\x02~\xff\xd7\x02\xa3\x02\ +\x84\xff\xd7\x02\xa3\x02\x86\xff\xd7\x02\xa3\x02\x88\xff\xd7\x02\ +\xa3\x02\x8a\xff\xd7\x02\xa3\x02\x8c\xff\xd7\x02\xa3\x02\xaa\xff\ +\xd7\x02\xa3\x02\xb1\xff\xd7\x02\xa3\x02\xb3\xff\xd7\x02\xa3\x02\ +\xb6\xff\xd7\x02\xa3\x02\xbe\xff\xd7\x02\xa3\x02\xc0\xff\xae\x02\ +\xa3\x02\xc2\xff\xae\x02\xa3\x02\xc5\xff\xc3\x02\xa3\x02\xc6\xff\ +\xd7\x02\xa3\x02\xc7\xff\xc3\x02\xa3\x02\xc8\xff\xd7\x02\xa3\x02\ +\xd5\xff\xae\x02\xa3\x02\xef\xff\xd7\x02\xa3\x02\xf1\xff\xd7\x02\ +\xa3\x02\xf3\xff\xd7\x02\xa3\x02\xfe\xff\xae\x02\xa3\x03\x0e\xff\ +\xd7\x02\xa3\x03\x10\xff\xd7\x02\xa3\x03\x15\xff\xd7\x02\xa3\x03\ +\x18\xff\xd7\x02\xa4\x01\xcf\xff\xec\x02\xa4\x01\xd8\xff\xec\x02\ +\xa4\x01\xdb\xff\xec\x02\xa4\x01\xde\xff\xec\x02\xa4\x01\xe1\xff\ +\xec\x02\xa4\x01\xea\xff\xec\x02\xa4\x01\xed\xff\xec\x02\xa4\x02\ +j\xff\xec\x02\xa4\x02\x7f\xff\xec\x02\xa4\x02\x85\xff\xec\x02\ +\xa4\x02\x87\xff\xec\x02\xa4\x02\x89\xff\xec\x02\xa4\x02\x8d\xff\ +\xec\x02\xa4\x02\xb2\xff\xec\x02\xa4\x02\xb4\xff\xec\x02\xa4\x02\ +\xc0\xff\xec\x02\xa4\x02\xc2\xff\xec\x02\xa4\x02\xd5\xff\xec\x02\ +\xa4\x02\xe0\xff\xec\x02\xa4\x02\xf0\xff\xec\x02\xa4\x02\xf2\xff\ +\xec\x02\xa4\x02\xf4\xff\xec\x02\xa4\x02\xfe\xff\xec\x02\xa4\x03\ +\x0a\xff\xec\x02\xa4\x03\x0c\xff\xec\x02\xa4\x03\x0e\xff\xd7\x02\ +\xa4\x03\x10\xff\xd7\x02\xa4\x03\x16\xff\xec\x02\xa4\x03\x1a\xff\ +\xec\x02\xa5\x01\x9f\xff\xd7\x02\xa5\x01\xb8\xff\xd7\x02\xa5\x01\ +\xbb\xff\xd7\x02\xa5\x01\xbe\xff\xd7\x02\xa5\x01\xc1\xff\xd7\x02\ +\xa5\x01\xe1\xff\xd7\x02\xa5\x02l\xff\xd7\x02\xa5\x02|\xff\ +\xd7\x02\xa5\x02~\xff\xd7\x02\xa5\x02\x84\xff\xd7\x02\xa5\x02\ +\x86\xff\xd7\x02\xa5\x02\x88\xff\xd7\x02\xa5\x02\x8a\xff\xd7\x02\ +\xa5\x02\x8c\xff\xd7\x02\xa5\x02\xb1\xff\xd7\x02\xa5\x02\xb3\xff\ +\xd7\x02\xa5\x02\xbf\xff\xd7\x02\xa5\x02\xc0\xff\xd7\x02\xa5\x02\ +\xc1\xff\xd7\x02\xa5\x02\xc2\xff\xd7\x02\xa5\x02\xc5\xff\x9a\x02\ +\xa5\x02\xc7\xff\x9a\x02\xa5\x02\xd4\xff\xd7\x02\xa5\x02\xd5\xff\ +\xd7\x02\xa5\x02\xef\xff\xd7\x02\xa5\x02\xf1\xff\xd7\x02\xa5\x02\ +\xf3\xff\xd7\x02\xa5\x02\xfd\xff\xd7\x02\xa5\x02\xfe\xff\xd7\x02\ +\xa5\x03\x09\xff\xd7\x02\xa5\x03\x0b\xff\xd7\x02\xa5\x03\x0e\xff\ +\xd7\x02\xa5\x03\x10\xff\xd7\x02\xa5\x03\x15\xff\xd7\x02\xa5\x03\ +\x19\xff\xec\x02\xa6\x01\xcf\xff\xd7\x02\xa6\x01\xd8\xff\xd7\x02\ +\xa6\x01\xdb\xff\xd7\x02\xa6\x01\xde\xff\xd7\x02\xa6\x01\xe1\xff\ +\xd7\x02\xa6\x01\xea\xff\xd7\x02\xa6\x01\xed\xff\xd7\x02\xa6\x02\ +j\xff\xd7\x02\xa6\x02\x7f\xff\xd7\x02\xa6\x02\x85\xff\xd7\x02\ +\xa6\x02\x87\xff\xd7\x02\xa6\x02\x89\xff\xd7\x02\xa6\x02\x8d\xff\ +\xd7\x02\xa6\x02\xb2\xff\xd7\x02\xa6\x02\xb4\xff\xd7\x02\xa6\x02\ +\xc0\xff\xd7\x02\xa6\x02\xc2\xff\xd7\x02\xa6\x02\xc6\xff\xd7\x02\ +\xa6\x02\xc8\xff\xd7\x02\xa6\x02\xd5\xff\xd7\x02\xa6\x02\xe0\xff\ +\xd7\x02\xa6\x02\xf0\xff\xd7\x02\xa6\x02\xf2\xff\xd7\x02\xa6\x02\ +\xf4\xff\xd7\x02\xa6\x02\xfe\xff\xd7\x02\xa6\x03\x0a\xff\xd7\x02\ +\xa6\x03\x0c\xff\xd7\x02\xa6\x03\x16\xff\xd7\x02\xa6\x03\x1a\xff\ +\xd7\x02\xa7\x01\x9f\xff\xd7\x02\xa7\x01\xb8\xff\xd7\x02\xa7\x01\ +\xbb\xff\xd7\x02\xa7\x01\xbe\xff\xd7\x02\xa7\x01\xc1\xff\xd7\x02\ +\xa7\x01\xe1\xff\xd7\x02\xa7\x02l\xff\xd7\x02\xa7\x02|\xff\ +\xd7\x02\xa7\x02~\xff\xd7\x02\xa7\x02\x84\xff\xd7\x02\xa7\x02\ +\x86\xff\xd7\x02\xa7\x02\x88\xff\xd7\x02\xa7\x02\x8a\xff\xd7\x02\ +\xa7\x02\x8c\xff\xd7\x02\xa7\x02\xb1\xff\xd7\x02\xa7\x02\xb3\xff\ +\xd7\x02\xa7\x02\xbf\xff\xd7\x02\xa7\x02\xc0\xff\xd7\x02\xa7\x02\ +\xc1\xff\xd7\x02\xa7\x02\xc2\xff\xd7\x02\xa7\x02\xc5\xff\x9a\x02\ +\xa7\x02\xc7\xff\x9a\x02\xa7\x02\xd4\xff\xd7\x02\xa7\x02\xd5\xff\ +\xd7\x02\xa7\x02\xef\xff\xd7\x02\xa7\x02\xf1\xff\xd7\x02\xa7\x02\ +\xf3\xff\xd7\x02\xa7\x02\xfd\xff\xd7\x02\xa7\x02\xfe\xff\xd7\x02\ +\xa7\x03\x09\xff\xd7\x02\xa7\x03\x0b\xff\xd7\x02\xa7\x03\x0e\xff\ +\xd7\x02\xa7\x03\x10\xff\xd7\x02\xa7\x03\x15\xff\xd7\x02\xa7\x03\ +\x19\xff\xec\x02\xa8\x01\xcf\xff\xd7\x02\xa8\x01\xd8\xff\xd7\x02\ +\xa8\x01\xdb\xff\xd7\x02\xa8\x01\xde\xff\xd7\x02\xa8\x01\xe1\xff\ +\xd7\x02\xa8\x01\xea\xff\xd7\x02\xa8\x01\xed\xff\xd7\x02\xa8\x02\ +j\xff\xd7\x02\xa8\x02\x7f\xff\xd7\x02\xa8\x02\x85\xff\xd7\x02\ +\xa8\x02\x87\xff\xd7\x02\xa8\x02\x89\xff\xd7\x02\xa8\x02\x8d\xff\ +\xd7\x02\xa8\x02\xb2\xff\xd7\x02\xa8\x02\xb4\xff\xd7\x02\xa8\x02\ +\xc0\xff\xd7\x02\xa8\x02\xc2\xff\xd7\x02\xa8\x02\xc6\xff\xd7\x02\ +\xa8\x02\xc8\xff\xd7\x02\xa8\x02\xd5\xff\xd7\x02\xa8\x02\xe0\xff\ +\xd7\x02\xa8\x02\xf0\xff\xd7\x02\xa8\x02\xf2\xff\xd7\x02\xa8\x02\ +\xf4\xff\xd7\x02\xa8\x02\xfe\xff\xd7\x02\xa8\x03\x0a\xff\xd7\x02\ +\xa8\x03\x0c\xff\xd7\x02\xa8\x03\x16\xff\xd7\x02\xa8\x03\x1a\xff\ +\xd7\x02\xa9\x01\x9f\xff\xd7\x02\xa9\x01\xb8\xff\xd7\x02\xa9\x01\ +\xbb\xff\xd7\x02\xa9\x01\xbe\xff\xd7\x02\xa9\x01\xc1\xff\xd7\x02\ +\xa9\x01\xe1\xff\xd7\x02\xa9\x02l\xff\xd7\x02\xa9\x02|\xff\ +\xd7\x02\xa9\x02~\xff\xd7\x02\xa9\x02\x84\xff\xd7\x02\xa9\x02\ +\x86\xff\xd7\x02\xa9\x02\x88\xff\xd7\x02\xa9\x02\x8a\xff\xd7\x02\ +\xa9\x02\x8c\xff\xd7\x02\xa9\x02\xb1\xff\xd7\x02\xa9\x02\xb3\xff\ +\xd7\x02\xa9\x02\xbf\xff\xd7\x02\xa9\x02\xc0\xff\xd7\x02\xa9\x02\ +\xc1\xff\xd7\x02\xa9\x02\xc2\xff\xd7\x02\xa9\x02\xc5\xff\x9a\x02\ +\xa9\x02\xc7\xff\x9a\x02\xa9\x02\xd4\xff\xd7\x02\xa9\x02\xd5\xff\ +\xd7\x02\xa9\x02\xef\xff\xd7\x02\xa9\x02\xf1\xff\xd7\x02\xa9\x02\ +\xf3\xff\xd7\x02\xa9\x02\xfd\xff\xd7\x02\xa9\x02\xfe\xff\xd7\x02\ +\xa9\x03\x09\xff\xd7\x02\xa9\x03\x0b\xff\xd7\x02\xa9\x03\x0e\xff\ +\xd7\x02\xa9\x03\x10\xff\xd7\x02\xa9\x03\x15\xff\xd7\x02\xa9\x03\ +\x19\xff\xec\x02\xaa\x01\xcf\xff\xd7\x02\xaa\x01\xd8\xff\xd7\x02\ +\xaa\x01\xdb\xff\xd7\x02\xaa\x01\xde\xff\xd7\x02\xaa\x01\xe1\xff\ +\xd7\x02\xaa\x01\xea\xff\xd7\x02\xaa\x01\xed\xff\xd7\x02\xaa\x02\ +j\xff\xd7\x02\xaa\x02\x7f\xff\xd7\x02\xaa\x02\x85\xff\xd7\x02\ +\xaa\x02\x87\xff\xd7\x02\xaa\x02\x89\xff\xd7\x02\xaa\x02\x8d\xff\ +\xd7\x02\xaa\x02\xb2\xff\xd7\x02\xaa\x02\xb4\xff\xd7\x02\xaa\x02\ +\xc0\xff\xd7\x02\xaa\x02\xc2\xff\xd7\x02\xaa\x02\xc6\xff\xd7\x02\ +\xaa\x02\xc8\xff\xd7\x02\xaa\x02\xd5\xff\xd7\x02\xaa\x02\xe0\xff\ +\xd7\x02\xaa\x02\xf0\xff\xd7\x02\xaa\x02\xf2\xff\xd7\x02\xaa\x02\ +\xf4\xff\xd7\x02\xaa\x02\xfe\xff\xd7\x02\xaa\x03\x0a\xff\xd7\x02\ +\xaa\x03\x0c\xff\xd7\x02\xaa\x03\x16\xff\xd7\x02\xaa\x03\x1a\xff\ +\xd7\x02\xab\x01\xa3\x00\xe1\x02\xab\x02\xea\x00)\x02\xab\x03\ +\x0e\xff\xd7\x02\xab\x03\x10\xff\xd7\x02\xac\x00\x05\xff\xec\x02\ +\xac\x00\x0a\xff\xec\x02\xac\x02\x07\xff\xec\x02\xac\x02\x0b\xff\ +\xec\x02\xad\x00\x0f\xff\x9a\x02\xad\x00\x10\xff\xd7\x02\xad\x00\ +\x11\xff\x9a\x02\xad\x01\x9d\x00)\x02\xad\x01\x9f\xff\xd7\x02\ +\xad\x01\xa4\xff\xae\x02\xad\x01\xa6\x00)\x02\xad\x01\xaa\xff\ +\x85\x02\xad\x01\xae\xff\xae\x02\xad\x01\xb5\xff\xae\x02\xad\x01\ +\xb8\xff\xd7\x02\xad\x01\xbb\xff\xd7\x02\xad\x01\xbc\x00)\x02\ +\xad\x01\xbe\xff\xc3\x02\xad\x01\xc4\x00)\x02\xad\x01\xcc\xff\ +\xc3\x02\xad\x01\xcd\xff\xc3\x02\xad\x01\xce\xff\x9a\x02\xad\x01\ +\xcf\xff\xae\x02\xad\x01\xd0\xff\xd7\x02\xad\x01\xd1\xff\xd7\x02\ +\xad\x01\xd2\xff\xc3\x02\xad\x01\xd3\xff\xc3\x02\xad\x01\xd4\xff\ +\xc3\x02\xad\x01\xd5\xff\x9a\x02\xad\x01\xd6\xff\xc3\x02\xad\x01\ +\xd7\xff\xc3\x02\xad\x01\xd8\xff\xae\x02\xad\x01\xd9\xff\xc3\x02\ +\xad\x01\xda\xff\xc3\x02\xad\x01\xdb\xff\xae\x02\xad\x01\xde\xff\ +\xae\x02\xad\x01\xdf\xff\xd7\x02\xad\x01\xe0\xff\xc3\x02\xad\x01\ +\xe1\xff\x9a\x02\xad\x01\xe2\xff\xc3\x02\xad\x01\xe3\xff\xc3\x02\ +\xad\x01\xe5\xff\xc3\x02\xad\x01\xe6\xff\xc3\x02\xad\x01\xe7\xff\ +\xd7\x02\xad\x01\xe8\xff\xc3\x02\xad\x01\xea\xff\xae\x02\xad\x01\ +\xeb\x00)\x02\xad\x01\xec\xff\xc3\x02\xad\x01\xed\xff\xae\x02\ +\xad\x01\xee\xff\xc3\x02\xad\x01\xf2\xff\x9a\x02\xad\x01\xf3\xff\ +\xc3\x02\xad\x01\xf4\x00)\x02\xad\x01\xf5\xff\xc3\x02\xad\x01\ +\xf7\xff\xc3\x02\xad\x01\xf9\xff\xc3\x02\xad\x02\x02\xff\xd7\x02\ +\xad\x02\x03\xff\xd7\x02\xad\x02\x04\xff\xd7\x02\xad\x02\x08\xff\ +\x9a\x02\xad\x02\x0c\xff\x9a\x02\xad\x02j\xff\xae\x02\xad\x02\ +k\xff\xc3\x02\xad\x02l\xff\xd7\x02\xad\x02q\xff\xc3\x02\ +\xad\x02r\xff\x85\x02\xad\x02s\xff\x9a\x02\xad\x02u\xff\ +\xc3\x02\xad\x02w\xff\xd7\x02\xad\x02y\xff\xc3\x02\xad\x02\ +}\xff\xc3\x02\xad\x02~\xff\xd7\x02\xad\x02\x7f\xff\xae\x02\ +\xad\x02\x84\xff\xd7\x02\xad\x02\x85\xff\xae\x02\xad\x02\x86\xff\ +\xd7\x02\xad\x02\x87\xff\xae\x02\xad\x02\x88\xff\xd7\x02\xad\x02\ +\x89\xff\xae\x02\xad\x02\x8a\xff\xd7\x02\xad\x02\x8c\xff\xd7\x02\ +\xad\x02\x8d\xff\xae\x02\xad\x02\x96\xff\xc3\x02\xad\x02\x98\x00\ +)\x02\xad\x02\x9a\xff\xc3\x02\xad\x02\x9e\xff\xc3\x02\xad\x02\ +\xa0\xff\xd7\x02\xad\x02\xa2\xff\xd7\x02\xad\x02\xa4\xff\xc3\x02\ +\xad\x02\xa6\xff\xc3\x02\xad\x02\xa8\x00)\x02\xad\x02\xa9\x00\ +)\x02\xad\x02\xac\xff\xc3\x02\xad\x02\xae\xff\xc3\x02\xad\x02\ +\xb0\xff\xc3\x02\xad\x02\xb1\xff\xd7\x02\xad\x02\xb2\xff\xae\x02\ +\xad\x02\xb3\xff\xd7\x02\xad\x02\xb4\xff\xae\x02\xad\x02\xb5\x00\ +)\x02\xad\x02\xbc\xff\xd7\x02\xad\x02\xbd\x00)\x02\xad\x02\ +\xc0\xff\x9a\x02\xad\x02\xc2\xff\x9a\x02\xad\x02\xc4\xff\xc3\x02\ +\xad\x02\xc5\xff\xd7\x02\xad\x02\xc6\xff\xc3\x02\xad\x02\xc7\xff\ +\xd7\x02\xad\x02\xc8\xff\xc3\x02\xad\x02\xcb\xff\xd7\x02\xad\x02\ +\xcd\xff\xc3\x02\xad\x02\xce\xff\xae\x02\xad\x02\xcf\xff\x9a\x02\ +\xad\x02\xd1\xff\xc3\x02\xad\x02\xd3\xff\xc3\x02\xad\x02\xd5\xff\ +\x9a\x02\xad\x02\xd7\xff\xc3\x02\xad\x02\xd9\xff\x85\x02\xad\x02\ +\xdb\xff\x85\x02\xad\x02\xdd\xff\x85\x02\xad\x02\xe0\xff\xae\x02\ +\xad\x02\xe6\xff\xd7\x02\xad\x02\xe8\xff\xd7\x02\xad\x02\xec\xff\ +\xc3\x02\xad\x02\xee\xff\xc3\x02\xad\x02\xef\xff\xd7\x02\xad\x02\ +\xf0\xff\xae\x02\xad\x02\xf1\xff\xd7\x02\xad\x02\xf2\xff\xae\x02\ +\xad\x02\xf3\xff\xd7\x02\xad\x02\xf4\xff\xae\x02\xad\x02\xf6\xff\ +\xd7\x02\xad\x02\xfe\xff\x9a\x02\xad\x03\x00\xff\xc3\x02\xad\x03\ +\x02\xff\xc3\x02\xad\x03\x06\xff\xd7\x02\xad\x03\x08\xff\xd7\x02\ +\xad\x03\x09\xff\x9a\x02\xad\x03\x0a\xff\xae\x02\xad\x03\x0b\xff\ +\x9a\x02\xad\x03\x0c\xff\xae\x02\xad\x03\x0e\xff\xd7\x02\xad\x03\ +\x10\xff\xd7\x02\xad\x03\x11\xff\xae\x02\xad\x03\x12\xff\x9a\x02\ +\xad\x03\x14\xff\xc3\x02\xad\x03\x15\xff\xd7\x02\xad\x03\x16\xff\ +\xae\x02\xad\x03\x17\x00)\x02\xad\x03\x1a\xff\xae\x02\xad\x03\ +\x1b\xff\xae\x02\xad\x03\x1c\xff\x9a\x02\xae\x00\x0f\xff\x9a\x02\ +\xae\x00\x10\xff\xd7\x02\xae\x00\x11\xff\x9a\x02\xae\x01\xce\xff\ +\xc3\x02\xae\x01\xcf\xff\xec\x02\xae\x01\xd5\xff\xc3\x02\xae\x01\ +\xd8\xff\xec\x02\xae\x01\xdb\xff\xec\x02\xae\x01\xde\xff\xec\x02\ +\xae\x01\xea\xff\xec\x02\xae\x01\xed\xff\xec\x02\xae\x01\xf2\xff\ +\xc3\x02\xae\x02\x02\xff\xd7\x02\xae\x02\x03\xff\xd7\x02\xae\x02\ +\x04\xff\xd7\x02\xae\x02\x08\xff\x9a\x02\xae\x02\x0c\xff\x9a\x02\ +\xae\x02j\xff\xec\x02\xae\x02s\xff\xc3\x02\xae\x02\x7f\xff\ +\xec\x02\xae\x02\x85\xff\xec\x02\xae\x02\x87\xff\xec\x02\xae\x02\ +\x89\xff\xec\x02\xae\x02\x8d\xff\xec\x02\xae\x02\xb2\xff\xec\x02\ +\xae\x02\xb4\xff\xec\x02\xae\x02\xcf\xff\xc3\x02\xae\x02\xe0\xff\ +\xec\x02\xae\x02\xf0\xff\xec\x02\xae\x02\xf2\xff\xec\x02\xae\x02\ +\xf4\xff\xec\x02\xae\x03\x0a\xff\xec\x02\xae\x03\x0c\xff\xec\x02\ +\xae\x03\x12\xff\xc3\x02\xae\x03\x16\xff\xec\x02\xae\x03\x1a\xff\ +\xec\x02\xae\x03\x1c\xff\xc3\x02\xaf\x00\x05\xff\x5c\x02\xaf\x00\ +\x0a\xff\x5c\x02\xaf\x01\x9d\xff\x9a\x02\xaf\x01\xa3\x00f\x02\ +\xaf\x01\xa6\xff\x9a\x02\xaf\x01\xbc\xffH\x02\xaf\x01\xc1\xff\ +\x85\x02\xaf\x01\xc4\xff\x9a\x02\xaf\x01\xdc\xff\xae\x02\xaf\x01\ +\xe1\xff\xd7\x02\xaf\x01\xe4\xff\xae\x02\xaf\x02\x07\xff\x5c\x02\ +\xaf\x02\x0b\xff\x5c\x02\xaf\x02|\xff\x85\x02\xaf\x02\x80\xff\ +q\x02\xaf\x02\x82\xffq\x02\xaf\x02\xa9\xff\x9a\x02\xaf\x02\ +\xaa\xff\xae\x02\xaf\x02\xb5\xffH\x02\xaf\x02\xb6\xff\xae\x02\ +\xaf\x02\xb7\xff\x9a\x02\xaf\x02\xb9\xff\x9a\x02\xaf\x02\xbd\xff\ +\x9a\x02\xaf\x02\xbe\xff\xae\x02\xaf\x02\xbf\xff\x85\x02\xaf\x02\ +\xc0\xff\xd7\x02\xaf\x02\xc1\xff\x85\x02\xaf\x02\xc2\xff\xd7\x02\ +\xaf\x02\xc5\xff\xc3\x02\xaf\x02\xc6\xff\xd7\x02\xaf\x02\xc7\xff\ +\xc3\x02\xaf\x02\xc8\xff\xd7\x02\xaf\x02\xd4\xff\x85\x02\xaf\x02\ +\xd5\xff\xd7\x02\xaf\x02\xfd\xff\x85\x02\xaf\x02\xfe\xff\xd7\x02\ +\xaf\x03\x0d\xffH\x02\xaf\x03\x0e\xff\xae\x02\xaf\x03\x0f\xff\ +H\x02\xaf\x03\x10\xff\xae\x02\xaf\x03\x17\xff\x9a\x02\xaf\x03\ +\x18\xff\xae\x02\xb0\x00\x05\xffq\x02\xb0\x00\x0a\xffq\x02\ +\xb0\x01\xdc\xff\x9a\x02\xb0\x01\xe1\xff\xd7\x02\xb0\x01\xe4\xff\ +\x9a\x02\xb0\x02\x07\xffq\x02\xb0\x02\x0b\xffq\x02\xb0\x02\ +m\xff\xd7\x02\xb0\x02\x81\xff\xd7\x02\xb0\x02\x83\xff\xd7\x02\ +\xb0\x02\x8b\xff\xd7\x02\xb0\x02\xaa\xff\x9a\x02\xb0\x02\xb6\xff\ +\x9a\x02\xb0\x02\xb8\xff\xd7\x02\xb0\x02\xba\xff\xd7\x02\xb0\x02\ +\xbe\xff\x9a\x02\xb0\x02\xc0\xff\xd7\x02\xb0\x02\xc2\xff\xd7\x02\ +\xb0\x02\xc6\xff\xd7\x02\xb0\x02\xc8\xff\xd7\x02\xb0\x02\xd5\xff\ +\xd7\x02\xb0\x02\xfe\xff\xd7\x02\xb0\x03\x0e\xffq\x02\xb0\x03\ +\x10\xffq\x02\xb0\x03\x18\xff\x9a\x02\xb1\x01\x9d\xff\xd7\x02\ +\xb1\x01\xa6\xff\xd7\x02\xb1\x01\xbc\xff\xc3\x02\xb1\x01\xc4\xff\ +\xd7\x02\xb1\x02\x80\xff\xec\x02\xb1\x02\x82\xff\xec\x02\xb1\x02\ +\xa9\xff\xd7\x02\xb1\x02\xb5\xff\xc3\x02\xb1\x02\xb7\xff\xec\x02\ +\xb1\x02\xb9\xff\xec\x02\xb1\x02\xbd\xff\xd7\x02\xb1\x03\x0d\xff\ +\xd7\x02\xb1\x03\x0f\xff\xd7\x02\xb1\x03\x17\xff\xd7\x02\xb2\x00\ +\x05\xff\xec\x02\xb2\x00\x0a\xff\xec\x02\xb2\x01\xd0\xff\xd7\x02\ +\xb2\x01\xdc\xff\xec\x02\xb2\x01\xdd\xff\xec\x02\xb2\x01\xdf\xff\ +\xd7\x02\xb2\x01\xe1\xff\xec\x02\xb2\x01\xe4\xff\xec\x02\xb2\x01\ +\xf6\xff\xec\x02\xb2\x02\x07\xff\xec\x02\xb2\x02\x0b\xff\xec\x02\ +\xb2\x02\xa0\xff\xd7\x02\xb2\x02\xaa\xff\xec\x02\xb2\x02\xb6\xff\ +\xec\x02\xb2\x02\xbc\xff\xd7\x02\xb2\x02\xbe\xff\xec\x02\xb2\x02\ +\xc0\xff\xec\x02\xb2\x02\xc2\xff\xec\x02\xb2\x02\xcb\xff\xd7\x02\ +\xb2\x02\xd5\xff\xec\x02\xb2\x02\xe6\xff\xd7\x02\xb2\x02\xf8\xff\ +\xec\x02\xb2\x02\xfa\xff\xec\x02\xb2\x02\xfc\xff\xec\x02\xb2\x02\ +\xfe\xff\xec\x02\xb2\x03\x06\xff\xd7\x02\xb2\x03\x08\xff\xd7\x02\ +\xb2\x03\x0e\xff\xec\x02\xb2\x03\x10\xff\xec\x02\xb2\x03\x18\xff\ +\xec\x02\xb3\x01\x9f\xff\xd7\x02\xb3\x01\xb8\xff\xd7\x02\xb3\x01\ +\xbb\xff\xd7\x02\xb3\x01\xbe\xff\xd7\x02\xb3\x01\xe1\xff\xd7\x02\ +\xb3\x02l\xff\xd7\x02\xb3\x02~\xff\xd7\x02\xb3\x02\x84\xff\ +\xd7\x02\xb3\x02\x86\xff\xd7\x02\xb3\x02\x88\xff\xd7\x02\xb3\x02\ +\x8a\xff\xd7\x02\xb3\x02\x8c\xff\xd7\x02\xb3\x02\xb1\xff\xd7\x02\ +\xb3\x02\xb3\xff\xd7\x02\xb3\x02\xc0\xff\xd7\x02\xb3\x02\xc2\xff\ +\xd7\x02\xb3\x02\xc5\xff\xd7\x02\xb3\x02\xc7\xff\xd7\x02\xb3\x02\ +\xd5\xff\xd7\x02\xb3\x02\xef\xff\xd7\x02\xb3\x02\xf1\xff\xd7\x02\ +\xb3\x02\xf3\xff\xd7\x02\xb3\x02\xfe\xff\xd7\x02\xb3\x03\x09\xff\ +\xd7\x02\xb3\x03\x0b\xff\xd7\x02\xb3\x03\x0e\xff\xd7\x02\xb3\x03\ +\x10\xff\xd7\x02\xb3\x03\x15\xff\xd7\x02\xb5\x00\x0f\xff\x85\x02\ +\xb5\x00\x10\xff\xae\x02\xb5\x00\x11\xff\x85\x02\xb5\x01\x9f\xff\ +\xd7\x02\xb5\x01\xa4\xff\x9a\x02\xb5\x01\xaa\xffq\x02\xb5\x01\ +\xae\xff\x9a\x02\xb5\x01\xb5\xff\x9a\x02\xb5\x01\xb8\xff\xd7\x02\ +\xb5\x01\xbb\xff\xd7\x02\xb5\x01\xbc\x00)\x02\xb5\x01\xbe\xff\ +\xae\x02\xb5\x01\xcc\xff\x9a\x02\xb5\x01\xcd\xff\x9a\x02\xb5\x01\ +\xce\xff\x85\x02\xb5\x01\xcf\xffq\x02\xb5\x01\xd0\xff\xd7\x02\ +\xb5\x01\xd1\xff\xd7\x02\xb5\x01\xd2\xff\x9a\x02\xb5\x01\xd3\xff\ +\x9a\x02\xb5\x01\xd4\xff\x9a\x02\xb5\x01\xd5\xff\x85\x02\xb5\x01\ +\xd6\xff\x9a\x02\xb5\x01\xd7\xff\x9a\x02\xb5\x01\xd8\xffq\x02\ +\xb5\x01\xd9\xff\x9a\x02\xb5\x01\xda\xff\x9a\x02\xb5\x01\xdb\xff\ +q\x02\xb5\x01\xdc\xff\xae\x02\xb5\x01\xdd\xff\xae\x02\xb5\x01\ +\xde\xffq\x02\xb5\x01\xdf\xff\xd7\x02\xb5\x01\xe0\xff\x9a\x02\ +\xb5\x01\xe1\xff\x9a\x02\xb5\x01\xe2\xff\x9a\x02\xb5\x01\xe3\xff\ +\x9a\x02\xb5\x01\xe4\xff\xae\x02\xb5\x01\xe5\xff\x9a\x02\xb5\x01\ +\xe6\xff\x9a\x02\xb5\x01\xe7\xff\xd7\x02\xb5\x01\xe8\xff\x9a\x02\ +\xb5\x01\xe9\xff\xc3\x02\xb5\x01\xea\xffq\x02\xb5\x01\xec\xff\ +\x9a\x02\xb5\x01\xed\xffq\x02\xb5\x01\xee\xff\x85\x02\xb5\x01\ +\xf2\xff\x85\x02\xb5\x01\xf3\xff\x9a\x02\xb5\x01\xf5\xff\x9a\x02\ +\xb5\x01\xf6\xff\xae\x02\xb5\x01\xf7\xff\x9a\x02\xb5\x01\xf9\xff\ +\x9a\x02\xb5\x02\x02\xff\xae\x02\xb5\x02\x03\xff\xae\x02\xb5\x02\ +\x04\xff\xae\x02\xb5\x02\x08\xff\x85\x02\xb5\x02\x0c\xff\x85\x02\ +\xb5\x02j\xffq\x02\xb5\x02k\xff\x9a\x02\xb5\x02l\xff\ +\xd7\x02\xb5\x02m\xff\xd7\x02\xb5\x02q\xff\x9a\x02\xb5\x02\ +r\xffq\x02\xb5\x02s\xff\x85\x02\xb5\x02u\xff\x9a\x02\ +\xb5\x02w\xff\x9a\x02\xb5\x02y\xff\x9a\x02\xb5\x02}\xff\ +\x9a\x02\xb5\x02~\xff\xd7\x02\xb5\x02\x7f\xffq\x02\xb5\x02\ +\x81\xff\xd7\x02\xb5\x02\x83\xff\xd7\x02\xb5\x02\x84\xff\xd7\x02\ +\xb5\x02\x85\xffq\x02\xb5\x02\x86\xff\xd7\x02\xb5\x02\x87\xff\ +q\x02\xb5\x02\x88\xff\xd7\x02\xb5\x02\x89\xffq\x02\xb5\x02\ +\x8a\xff\xd7\x02\xb5\x02\x8b\xff\xd7\x02\xb5\x02\x8c\xff\xd7\x02\ +\xb5\x02\x8d\xffq\x02\xb5\x02\x96\xff\x9a\x02\xb5\x02\x9a\xff\ +\x9a\x02\xb5\x02\x9e\xff\x9a\x02\xb5\x02\xa0\xff\xd7\x02\xb5\x02\ +\xa2\xff\xd7\x02\xb5\x02\xa4\xff\x9a\x02\xb5\x02\xa6\xff\x9a\x02\ +\xb5\x02\xaa\xff\xae\x02\xb5\x02\xac\xff\x9a\x02\xb5\x02\xae\xff\ +\x9a\x02\xb5\x02\xb0\xff\x9a\x02\xb5\x02\xb1\xff\xd7\x02\xb5\x02\ +\xb2\xffq\x02\xb5\x02\xb3\xff\xd7\x02\xb5\x02\xb4\xffq\x02\ +\xb5\x02\xb5\x00)\x02\xb5\x02\xb6\xff\xae\x02\xb5\x02\xb8\xff\ +\xae\x02\xb5\x02\xba\xff\xae\x02\xb5\x02\xbc\xff\xd7\x02\xb5\x02\ +\xbe\xff\xae\x02\xb5\x02\xc0\xff\x9a\x02\xb5\x02\xc2\xff\x9a\x02\ +\xb5\x02\xc4\xff\x9a\x02\xb5\x02\xc5\xff\x9a\x02\xb5\x02\xc6\xff\ +q\x02\xb5\x02\xc7\xff\x9a\x02\xb5\x02\xc8\xffq\x02\xb5\x02\ +\xcb\xff\xd7\x02\xb5\x02\xcd\xff\x9a\x02\xb5\x02\xce\xff\x9a\x02\ +\xb5\x02\xcf\xff\x85\x02\xb5\x02\xd1\xff\x9a\x02\xb5\x02\xd3\xff\ +\x9a\x02\xb5\x02\xd5\xff\x9a\x02\xb5\x02\xd7\xff\x9a\x02\xb5\x02\ +\xd9\xffq\x02\xb5\x02\xdb\xffq\x02\xb5\x02\xdd\xffq\x02\ +\xb5\x02\xe0\xffq\x02\xb5\x02\xe6\xff\xd7\x02\xb5\x02\xe8\xff\ +\xd7\x02\xb5\x02\xea\xff\xc3\x02\xb5\x02\xec\xff\x9a\x02\xb5\x02\ +\xee\xff\x9a\x02\xb5\x02\xef\xff\xd7\x02\xb5\x02\xf0\xffq\x02\ +\xb5\x02\xf1\xff\xd7\x02\xb5\x02\xf2\xffq\x02\xb5\x02\xf3\xff\ +\xd7\x02\xb5\x02\xf4\xffq\x02\xb5\x02\xf6\xff\xd7\x02\xb5\x02\ +\xf8\xff\xae\x02\xb5\x02\xfa\xff\xae\x02\xb5\x02\xfc\xff\xae\x02\ +\xb5\x02\xfe\xff\x9a\x02\xb5\x03\x00\xff\x9a\x02\xb5\x03\x02\xff\ +\x9a\x02\xb5\x03\x06\xff\xd7\x02\xb5\x03\x08\xff\xd7\x02\xb5\x03\ +\x09\xffq\x02\xb5\x03\x0a\xffq\x02\xb5\x03\x0b\xffq\x02\ +\xb5\x03\x0c\xffq\x02\xb5\x03\x0e\xff\x9a\x02\xb5\x03\x10\xff\ +\x9a\x02\xb5\x03\x11\xff\x9a\x02\xb5\x03\x12\xff\x85\x02\xb5\x03\ +\x14\xff\x9a\x02\xb5\x03\x15\xff\xd7\x02\xb5\x03\x16\xffq\x02\ +\xb5\x03\x18\xff\xae\x02\xb5\x03\x1a\xffq\x02\xb5\x03\x1b\xff\ +\x9a\x02\xb5\x03\x1c\xff\x85\x02\xb6\x00\x0f\xff\x9a\x02\xb6\x00\ +\x10\xff\xd7\x02\xb6\x00\x11\xff\x9a\x02\xb6\x01\xce\xff\xc3\x02\ +\xb6\x01\xcf\xff\xec\x02\xb6\x01\xd5\xff\xc3\x02\xb6\x01\xd8\xff\ +\xec\x02\xb6\x01\xdb\xff\xec\x02\xb6\x01\xde\xff\xec\x02\xb6\x01\ +\xea\xff\xec\x02\xb6\x01\xed\xff\xec\x02\xb6\x01\xf2\xff\xc3\x02\ +\xb6\x02\x02\xff\xd7\x02\xb6\x02\x03\xff\xd7\x02\xb6\x02\x04\xff\ +\xd7\x02\xb6\x02\x08\xff\x9a\x02\xb6\x02\x0c\xff\x9a\x02\xb6\x02\ +j\xff\xec\x02\xb6\x02s\xff\xc3\x02\xb6\x02\x7f\xff\xec\x02\ +\xb6\x02\x85\xff\xec\x02\xb6\x02\x87\xff\xec\x02\xb6\x02\x89\xff\ +\xec\x02\xb6\x02\x8d\xff\xec\x02\xb6\x02\xb2\xff\xec\x02\xb6\x02\ +\xb4\xff\xec\x02\xb6\x02\xcf\xff\xc3\x02\xb6\x02\xe0\xff\xec\x02\ +\xb6\x02\xf0\xff\xec\x02\xb6\x02\xf2\xff\xec\x02\xb6\x02\xf4\xff\ +\xec\x02\xb6\x03\x0a\xff\xec\x02\xb6\x03\x0c\xff\xec\x02\xb6\x03\ +\x12\xff\xc3\x02\xb6\x03\x16\xff\xec\x02\xb6\x03\x1a\xff\xec\x02\ +\xb6\x03\x1c\xff\xc3\x02\xb7\x00\x0f\xff\x85\x02\xb7\x00\x11\xff\ +\x85\x02\xb7\x01\x9f\xff\xd7\x02\xb7\x01\xa4\xff\xae\x02\xb7\x01\ +\xaa\xff\x85\x02\xb7\x01\xae\xff\xae\x02\xb7\x01\xb5\xff\xae\x02\ +\xb7\x01\xb8\xff\xd7\x02\xb7\x01\xbb\xff\xd7\x02\xb7\x01\xbe\xff\ +\xc3\x02\xb7\x01\xca\xff\xae\x02\xb7\x01\xcc\xff\xc3\x02\xb7\x01\ +\xcd\xff\xc3\x02\xb7\x01\xce\xff\x9a\x02\xb7\x01\xcf\xff\x9a\x02\ +\xb7\x01\xd2\xff\xc3\x02\xb7\x01\xd3\xff\xc3\x02\xb7\x01\xd4\xff\ +\xc3\x02\xb7\x01\xd5\xff\x9a\x02\xb7\x01\xd6\xff\xc3\x02\xb7\x01\ +\xd7\xff\xc3\x02\xb7\x01\xd8\xff\x9a\x02\xb7\x01\xd9\xff\xc3\x02\ +\xb7\x01\xda\xff\xc3\x02\xb7\x01\xdb\xff\x9a\x02\xb7\x01\xde\xff\ +\x9a\x02\xb7\x01\xe0\xff\xc3\x02\xb7\x01\xe1\xff\xae\x02\xb7\x01\ +\xe2\xff\xc3\x02\xb7\x01\xe3\xff\xc3\x02\xb7\x01\xe5\xff\xc3\x02\ +\xb7\x01\xe6\xff\xc3\x02\xb7\x01\xe8\xff\xc3\x02\xb7\x01\xe9\xff\ +\xd7\x02\xb7\x01\xea\xff\x9a\x02\xb7\x01\xeb\x00)\x02\xb7\x01\ +\xec\xff\xc3\x02\xb7\x01\xed\xff\x9a\x02\xb7\x01\xee\xff\xae\x02\ +\xb7\x01\xf2\xff\x9a\x02\xb7\x01\xf3\xff\xc3\x02\xb7\x01\xf4\x00\ +)\x02\xb7\x01\xf5\xff\xc3\x02\xb7\x01\xf7\xff\xc3\x02\xb7\x01\ +\xf9\xff\xc3\x02\xb7\x02\x08\xff\x85\x02\xb7\x02\x0c\xff\x85\x02\ +\xb7\x02j\xff\x9a\x02\xb7\x02k\xff\xc3\x02\xb7\x02l\xff\ +\xd7\x02\xb7\x02q\xff\xc3\x02\xb7\x02r\xff\x85\x02\xb7\x02\ +s\xff\x9a\x02\xb7\x02u\xff\xc3\x02\xb7\x02w\xff\xd7\x02\ +\xb7\x02y\xff\xc3\x02\xb7\x02}\xff\xd7\x02\xb7\x02~\xff\ +\xd7\x02\xb7\x02\x7f\xff\x9a\x02\xb7\x02\x84\xff\xd7\x02\xb7\x02\ +\x85\xff\x9a\x02\xb7\x02\x86\xff\xd7\x02\xb7\x02\x87\xff\x9a\x02\ +\xb7\x02\x88\xff\xd7\x02\xb7\x02\x89\xff\x9a\x02\xb7\x02\x8a\xff\ +\xd7\x02\xb7\x02\x8c\xff\xd7\x02\xb7\x02\x8d\xff\x9a\x02\xb7\x02\ +\x96\xff\xc3\x02\xb7\x02\x98\x00)\x02\xb7\x02\x9a\xff\xc3\x02\ +\xb7\x02\x9e\xff\xc3\x02\xb7\x02\xa4\xff\xc3\x02\xb7\x02\xa6\xff\ +\xc3\x02\xb7\x02\xa8\x00)\x02\xb7\x02\xac\xff\xc3\x02\xb7\x02\ +\xae\xff\xc3\x02\xb7\x02\xb0\xff\xc3\x02\xb7\x02\xb1\xff\xd7\x02\ +\xb7\x02\xb2\xff\x9a\x02\xb7\x02\xb3\xff\xd7\x02\xb7\x02\xb4\xff\ +\x9a\x02\xb7\x02\xc0\xff\xae\x02\xb7\x02\xc2\xff\xae\x02\xb7\x02\ +\xc4\xff\xc3\x02\xb7\x02\xc6\xff\xae\x02\xb7\x02\xc8\xff\xae\x02\ +\xb7\x02\xcd\xff\xc3\x02\xb7\x02\xce\xff\xae\x02\xb7\x02\xcf\xff\ +\x9a\x02\xb7\x02\xd1\xff\xc3\x02\xb7\x02\xd3\xff\xc3\x02\xb7\x02\ +\xd5\xff\xae\x02\xb7\x02\xd7\xff\xc3\x02\xb7\x02\xd9\xff\x85\x02\ +\xb7\x02\xda\xff\xae\x02\xb7\x02\xdb\xff\x85\x02\xb7\x02\xdc\xff\ +\xae\x02\xb7\x02\xdd\xff\x85\x02\xb7\x02\xde\xff\xae\x02\xb7\x02\ +\xe0\xff\x9a\x02\xb7\x02\xe1\xff\xec\x02\xb7\x02\xe2\xff\xae\x02\ +\xb7\x02\xe3\xff\xec\x02\xb7\x02\xe4\xff\xae\x02\xb7\x02\xec\xff\ +\xc3\x02\xb7\x02\xee\xff\xc3\x02\xb7\x02\xef\xff\xd7\x02\xb7\x02\ +\xf0\xff\x9a\x02\xb7\x02\xf1\xff\xd7\x02\xb7\x02\xf2\xff\x9a\x02\ +\xb7\x02\xf3\xff\xd7\x02\xb7\x02\xf4\xff\x9a\x02\xb7\x02\xfe\xff\ +\xae\x02\xb7\x03\x00\xff\xc3\x02\xb7\x03\x02\xff\xc3\x02\xb7\x03\ +\x09\xff\xae\x02\xb7\x03\x0a\xff\x9a\x02\xb7\x03\x0b\xff\xae\x02\ +\xb7\x03\x0c\xff\x9a\x02\xb7\x03\x0e\xff\xd7\x02\xb7\x03\x10\xff\ +\xd7\x02\xb7\x03\x11\xff\xae\x02\xb7\x03\x12\xff\x9a\x02\xb7\x03\ +\x14\xff\xc3\x02\xb7\x03\x15\xff\xd7\x02\xb7\x03\x16\xff\x9a\x02\ +\xb7\x03\x19\xff\xec\x02\xb7\x03\x1a\xff\x9a\x02\xb7\x03\x1b\xff\ +\xae\x02\xb7\x03\x1c\xff\x9a\x02\xb8\x00\x0f\xff\xae\x02\xb8\x00\ +\x11\xff\xae\x02\xb8\x01\xce\xff\xec\x02\xb8\x01\xd5\xff\xec\x02\ +\xb8\x01\xf2\xff\xec\x02\xb8\x02\x08\xff\xae\x02\xb8\x02\x0c\xff\ +\xae\x02\xb8\x02s\xff\xec\x02\xb8\x02\xcf\xff\xec\x02\xb8\x03\ +\x12\xff\xec\x02\xb8\x03\x1c\xff\xec\x02\xb9\x00\x0f\xff\x85\x02\ +\xb9\x00\x11\xff\x85\x02\xb9\x01\x9f\xff\xd7\x02\xb9\x01\xa4\xff\ +\xae\x02\xb9\x01\xaa\xff\x85\x02\xb9\x01\xae\xff\xae\x02\xb9\x01\ +\xb5\xff\xae\x02\xb9\x01\xb8\xff\xd7\x02\xb9\x01\xbb\xff\xd7\x02\ +\xb9\x01\xbe\xff\xc3\x02\xb9\x01\xca\xff\xae\x02\xb9\x01\xcc\xff\ +\xc3\x02\xb9\x01\xcd\xff\xc3\x02\xb9\x01\xce\xff\x9a\x02\xb9\x01\ +\xcf\xff\x9a\x02\xb9\x01\xd2\xff\xc3\x02\xb9\x01\xd3\xff\xc3\x02\ +\xb9\x01\xd4\xff\xc3\x02\xb9\x01\xd5\xff\x9a\x02\xb9\x01\xd6\xff\ +\xc3\x02\xb9\x01\xd7\xff\xc3\x02\xb9\x01\xd8\xff\x9a\x02\xb9\x01\ +\xd9\xff\xc3\x02\xb9\x01\xda\xff\xc3\x02\xb9\x01\xdb\xff\x9a\x02\ +\xb9\x01\xde\xff\x9a\x02\xb9\x01\xe0\xff\xc3\x02\xb9\x01\xe1\xff\ +\xae\x02\xb9\x01\xe2\xff\xc3\x02\xb9\x01\xe3\xff\xc3\x02\xb9\x01\ +\xe5\xff\xc3\x02\xb9\x01\xe6\xff\xc3\x02\xb9\x01\xe8\xff\xc3\x02\ +\xb9\x01\xe9\xff\xd7\x02\xb9\x01\xea\xff\x9a\x02\xb9\x01\xeb\x00\ +)\x02\xb9\x01\xec\xff\xc3\x02\xb9\x01\xed\xff\x9a\x02\xb9\x01\ +\xee\xff\xae\x02\xb9\x01\xf2\xff\x9a\x02\xb9\x01\xf3\xff\xc3\x02\ +\xb9\x01\xf4\x00)\x02\xb9\x01\xf5\xff\xc3\x02\xb9\x01\xf7\xff\ +\xc3\x02\xb9\x01\xf9\xff\xc3\x02\xb9\x02\x08\xff\x85\x02\xb9\x02\ +\x0c\xff\x85\x02\xb9\x02j\xff\x9a\x02\xb9\x02k\xff\xc3\x02\ +\xb9\x02l\xff\xd7\x02\xb9\x02q\xff\xc3\x02\xb9\x02r\xff\ +\x85\x02\xb9\x02s\xff\x9a\x02\xb9\x02u\xff\xc3\x02\xb9\x02\ +w\xff\xd7\x02\xb9\x02y\xff\xc3\x02\xb9\x02}\xff\xd7\x02\ +\xb9\x02~\xff\xd7\x02\xb9\x02\x7f\xff\x9a\x02\xb9\x02\x84\xff\ +\xd7\x02\xb9\x02\x85\xff\x9a\x02\xb9\x02\x86\xff\xd7\x02\xb9\x02\ +\x87\xff\x9a\x02\xb9\x02\x88\xff\xd7\x02\xb9\x02\x89\xff\x9a\x02\ +\xb9\x02\x8a\xff\xd7\x02\xb9\x02\x8c\xff\xd7\x02\xb9\x02\x8d\xff\ +\x9a\x02\xb9\x02\x96\xff\xc3\x02\xb9\x02\x98\x00)\x02\xb9\x02\ +\x9a\xff\xc3\x02\xb9\x02\x9e\xff\xc3\x02\xb9\x02\xa4\xff\xc3\x02\ +\xb9\x02\xa6\xff\xc3\x02\xb9\x02\xa8\x00)\x02\xb9\x02\xac\xff\ +\xc3\x02\xb9\x02\xae\xff\xc3\x02\xb9\x02\xb0\xff\xc3\x02\xb9\x02\ +\xb1\xff\xd7\x02\xb9\x02\xb2\xff\x9a\x02\xb9\x02\xb3\xff\xd7\x02\ +\xb9\x02\xb4\xff\x9a\x02\xb9\x02\xc0\xff\xae\x02\xb9\x02\xc2\xff\ +\xae\x02\xb9\x02\xc4\xff\xc3\x02\xb9\x02\xc6\xff\xae\x02\xb9\x02\ +\xc8\xff\xae\x02\xb9\x02\xcd\xff\xc3\x02\xb9\x02\xce\xff\xae\x02\ +\xb9\x02\xcf\xff\x9a\x02\xb9\x02\xd1\xff\xc3\x02\xb9\x02\xd3\xff\ +\xc3\x02\xb9\x02\xd5\xff\xae\x02\xb9\x02\xd7\xff\xc3\x02\xb9\x02\ +\xd9\xff\x85\x02\xb9\x02\xda\xff\xae\x02\xb9\x02\xdb\xff\x85\x02\ +\xb9\x02\xdc\xff\xae\x02\xb9\x02\xdd\xff\x85\x02\xb9\x02\xde\xff\ +\xae\x02\xb9\x02\xe0\xff\x9a\x02\xb9\x02\xe1\xff\xec\x02\xb9\x02\ +\xe2\xff\xae\x02\xb9\x02\xe3\xff\xec\x02\xb9\x02\xe4\xff\xae\x02\ +\xb9\x02\xec\xff\xc3\x02\xb9\x02\xee\xff\xc3\x02\xb9\x02\xef\xff\ +\xd7\x02\xb9\x02\xf0\xff\x9a\x02\xb9\x02\xf1\xff\xd7\x02\xb9\x02\ +\xf2\xff\x9a\x02\xb9\x02\xf3\xff\xd7\x02\xb9\x02\xf4\xff\x9a\x02\ +\xb9\x02\xfe\xff\xae\x02\xb9\x03\x00\xff\xc3\x02\xb9\x03\x02\xff\ +\xc3\x02\xb9\x03\x09\xff\xae\x02\xb9\x03\x0a\xff\x9a\x02\xb9\x03\ +\x0b\xff\xae\x02\xb9\x03\x0c\xff\x9a\x02\xb9\x03\x0e\xff\xd7\x02\ +\xb9\x03\x10\xff\xd7\x02\xb9\x03\x11\xff\xae\x02\xb9\x03\x12\xff\ +\x9a\x02\xb9\x03\x14\xff\xc3\x02\xb9\x03\x15\xff\xd7\x02\xb9\x03\ +\x16\xff\x9a\x02\xb9\x03\x19\xff\xec\x02\xb9\x03\x1a\xff\x9a\x02\ +\xb9\x03\x1b\xff\xae\x02\xb9\x03\x1c\xff\x9a\x02\xba\x00\x0f\xff\ +\xae\x02\xba\x00\x11\xff\xae\x02\xba\x01\xce\xff\xec\x02\xba\x01\ +\xd5\xff\xec\x02\xba\x01\xf2\xff\xec\x02\xba\x02\x08\xff\xae\x02\ +\xba\x02\x0c\xff\xae\x02\xba\x02s\xff\xec\x02\xba\x02\xcf\xff\ +\xec\x02\xba\x03\x12\xff\xec\x02\xba\x03\x1c\xff\xec\x02\xbb\x01\ +\x9f\xff\xd7\x02\xbb\x01\xa3\x00\xe1\x02\xbb\x01\xb8\xff\xd7\x02\ +\xbb\x01\xbb\xff\xd7\x02\xbb\x01\xbe\xff\xc3\x02\xbb\x01\xdc\xff\ +\xd7\x02\xbb\x01\xe1\xff\xae\x02\xbb\x01\xe4\xff\xd7\x02\xbb\x02\ +l\xff\xd7\x02\xbb\x02{\x00=\x02\xbb\x02}\xff\xec\x02\ +\xbb\x02~\xff\xd7\x02\xbb\x02\x84\xff\xd7\x02\xbb\x02\x86\xff\ +\xd7\x02\xbb\x02\x88\xff\xd7\x02\xbb\x02\x8a\xff\xd7\x02\xbb\x02\ +\x8c\xff\xd7\x02\xbb\x02\xaa\xff\xd7\x02\xbb\x02\xb1\xff\xd7\x02\ +\xbb\x02\xb3\xff\xd7\x02\xbb\x02\xb6\xff\xd7\x02\xbb\x02\xbe\xff\ +\xd7\x02\xbb\x02\xc0\xff\xae\x02\xbb\x02\xc2\xff\xae\x02\xbb\x02\ +\xc5\xff\xc3\x02\xbb\x02\xc6\xff\xd7\x02\xbb\x02\xc7\xff\xc3\x02\ +\xbb\x02\xc8\xff\xd7\x02\xbb\x02\xd5\xff\xae\x02\xbb\x02\xef\xff\ +\xd7\x02\xbb\x02\xf1\xff\xd7\x02\xbb\x02\xf3\xff\xd7\x02\xbb\x02\ +\xfe\xff\xae\x02\xbb\x03\x0e\xff\xd7\x02\xbb\x03\x10\xff\xd7\x02\ +\xbb\x03\x15\xff\xd7\x02\xbb\x03\x18\xff\xd7\x02\xbc\x01\xcf\xff\ +\xec\x02\xbc\x01\xd8\xff\xec\x02\xbc\x01\xdb\xff\xec\x02\xbc\x01\ +\xde\xff\xec\x02\xbc\x01\xe1\xff\xec\x02\xbc\x01\xea\xff\xec\x02\ +\xbc\x01\xed\xff\xec\x02\xbc\x02j\xff\xec\x02\xbc\x02\x7f\xff\ +\xec\x02\xbc\x02\x85\xff\xec\x02\xbc\x02\x87\xff\xec\x02\xbc\x02\ +\x89\xff\xec\x02\xbc\x02\x8d\xff\xec\x02\xbc\x02\xb2\xff\xec\x02\ +\xbc\x02\xb4\xff\xec\x02\xbc\x02\xc0\xff\xec\x02\xbc\x02\xc2\xff\ +\xec\x02\xbc\x02\xd5\xff\xec\x02\xbc\x02\xe0\xff\xec\x02\xbc\x02\ +\xf0\xff\xec\x02\xbc\x02\xf2\xff\xec\x02\xbc\x02\xf4\xff\xec\x02\ +\xbc\x02\xfe\xff\xec\x02\xbc\x03\x0a\xff\xec\x02\xbc\x03\x0c\xff\ +\xec\x02\xbc\x03\x0e\xff\xd7\x02\xbc\x03\x10\xff\xd7\x02\xbc\x03\ +\x16\xff\xec\x02\xbc\x03\x1a\xff\xec\x02\xbd\x01\xa3\x00\xe1\x02\ +\xbd\x02\xea\x00)\x02\xbd\x03\x0e\xff\xd7\x02\xbd\x03\x10\xff\ +\xd7\x02\xbe\x00\x05\xff\xec\x02\xbe\x00\x0a\xff\xec\x02\xbe\x02\ +\x07\xff\xec\x02\xbe\x02\x0b\xff\xec\x02\xbf\x01\xa3\x00\xe1\x02\ +\xbf\x02\xea\x00)\x02\xbf\x03\x0e\xff\xd7\x02\xbf\x03\x10\xff\ +\xd7\x02\xc0\x00\x05\xff\xec\x02\xc0\x00\x0a\xff\xec\x02\xc0\x02\ +\x07\xff\xec\x02\xc0\x02\x0b\xff\xec\x02\xc3\x00\x05\xff\xc3\x02\ +\xc3\x00\x0a\xff\xc3\x02\xc3\x01\x9d\xff\xd7\x02\xc3\x01\xa6\xff\ +\xd7\x02\xc3\x01\xbc\xff\x85\x02\xc3\x01\xc1\xff\xae\x02\xc3\x01\ +\xc4\xff\xd7\x02\xc3\x01\xdc\xff\xd7\x02\xc3\x01\xdd\xff\xec\x02\ +\xc3\x01\xe1\xff\xec\x02\xc3\x01\xe4\xff\xd7\x02\xc3\x01\xf6\xff\ +\xec\x02\xc3\x02\x07\xff\xc3\x02\xc3\x02\x0b\xff\xc3\x02\xc3\x02\ +|\xff\xae\x02\xc3\x02\x80\xff\xc3\x02\xc3\x02\x82\xff\xc3\x02\ +\xc3\x02\xa9\xff\xd7\x02\xc3\x02\xaa\xff\xd7\x02\xc3\x02\xb5\xff\ +\x85\x02\xc3\x02\xb6\xff\xd7\x02\xc3\x02\xb7\xff\x9a\x02\xc3\x02\ +\xb9\xff\x9a\x02\xc3\x02\xbd\xff\xd7\x02\xc3\x02\xbe\xff\xd7\x02\ +\xc3\x02\xbf\xff\xae\x02\xc3\x02\xc0\xff\xec\x02\xc3\x02\xc1\xff\ +\xae\x02\xc3\x02\xc2\xff\xec\x02\xc3\x02\xd4\xff\xae\x02\xc3\x02\ +\xd5\xff\xec\x02\xc3\x02\xf8\xff\xec\x02\xc3\x02\xfa\xff\xec\x02\ +\xc3\x02\xfc\xff\xec\x02\xc3\x02\xfd\xff\xae\x02\xc3\x02\xfe\xff\ +\xec\x02\xc3\x03\x0d\xff\xae\x02\xc3\x03\x0e\xff\xd7\x02\xc3\x03\ +\x0f\xff\xae\x02\xc3\x03\x10\xff\xd7\x02\xc3\x03\x17\xff\xd7\x02\ +\xc3\x03\x18\xff\xd7\x02\xc4\x00\x05\xff\x9a\x02\xc4\x00\x0a\xff\ +\x9a\x02\xc4\x01\xdc\xff\xd7\x02\xc4\x01\xdd\xff\xd7\x02\xc4\x01\ +\xe4\xff\xd7\x02\xc4\x01\xf6\xff\xd7\x02\xc4\x02\x07\xff\x9a\x02\ +\xc4\x02\x0b\xff\x9a\x02\xc4\x02\xaa\xff\xd7\x02\xc4\x02\xb6\xff\ +\xd7\x02\xc4\x02\xb8\xff\xd7\x02\xc4\x02\xba\xff\xd7\x02\xc4\x02\ +\xbe\xff\xd7\x02\xc4\x02\xf8\xff\xd7\x02\xc4\x02\xfa\xff\xd7\x02\ +\xc4\x02\xfc\xff\xd7\x02\xc4\x03\x0e\xff\xae\x02\xc4\x03\x10\xff\ +\xae\x02\xc4\x03\x18\xff\xd7\x02\xc5\x01\xbc\xff\xd7\x02\xc5\x02\ +\x80\xff\xec\x02\xc5\x02\x82\xff\xec\x02\xc5\x02\xb5\xff\xd7\x02\ +\xc5\x02\xb7\xff\xec\x02\xc5\x02\xb9\xff\xec\x02\xc5\x03\x0d\xff\ +\xec\x02\xc5\x03\x0f\xff\xec\x02\xc6\x00\x05\xff\xec\x02\xc6\x00\ +\x0a\xff\xec\x02\xc6\x02\x07\xff\xec\x02\xc6\x02\x0b\xff\xec\x02\ +\xc7\x01\xbc\xff\xd7\x02\xc7\x02\x80\xff\xec\x02\xc7\x02\x82\xff\ +\xec\x02\xc7\x02\xb5\xff\xd7\x02\xc7\x02\xb7\xff\xec\x02\xc7\x02\ +\xb9\xff\xec\x02\xc7\x03\x0d\xff\xec\x02\xc7\x03\x0f\xff\xec\x02\ +\xc8\x00\x05\xff\xec\x02\xc8\x00\x0a\xff\xec\x02\xc8\x02\x07\xff\ +\xec\x02\xc8\x02\x0b\xff\xec\x02\xca\x01\x9f\xff\xd7\x02\xca\x01\ +\xb8\xff\xd7\x02\xca\x01\xbb\xff\xd7\x02\xca\x01\xbe\xff\xd7\x02\ +\xca\x01\xc1\xff\xd7\x02\xca\x01\xe1\xff\xd7\x02\xca\x02l\xff\ +\xd7\x02\xca\x02|\xff\xd7\x02\xca\x02~\xff\xd7\x02\xca\x02\ +\x84\xff\xd7\x02\xca\x02\x86\xff\xd7\x02\xca\x02\x88\xff\xd7\x02\ +\xca\x02\x8a\xff\xd7\x02\xca\x02\x8c\xff\xd7\x02\xca\x02\xb1\xff\ +\xd7\x02\xca\x02\xb3\xff\xd7\x02\xca\x02\xbf\xff\xd7\x02\xca\x02\ +\xc0\xff\xd7\x02\xca\x02\xc1\xff\xd7\x02\xca\x02\xc2\xff\xd7\x02\ +\xca\x02\xc5\xff\x9a\x02\xca\x02\xc7\xff\x9a\x02\xca\x02\xd4\xff\ +\xd7\x02\xca\x02\xd5\xff\xd7\x02\xca\x02\xef\xff\xd7\x02\xca\x02\ +\xf1\xff\xd7\x02\xca\x02\xf3\xff\xd7\x02\xca\x02\xfd\xff\xd7\x02\ +\xca\x02\xfe\xff\xd7\x02\xca\x03\x09\xff\xd7\x02\xca\x03\x0b\xff\ +\xd7\x02\xca\x03\x0e\xff\xd7\x02\xca\x03\x10\xff\xd7\x02\xca\x03\ +\x15\xff\xd7\x02\xca\x03\x19\xff\xec\x02\xcb\x01\xcf\xff\xd7\x02\ +\xcb\x01\xd8\xff\xd7\x02\xcb\x01\xdb\xff\xd7\x02\xcb\x01\xde\xff\ +\xd7\x02\xcb\x01\xe1\xff\xd7\x02\xcb\x01\xea\xff\xd7\x02\xcb\x01\ +\xed\xff\xd7\x02\xcb\x02j\xff\xd7\x02\xcb\x02\x7f\xff\xd7\x02\ +\xcb\x02\x85\xff\xd7\x02\xcb\x02\x87\xff\xd7\x02\xcb\x02\x89\xff\ +\xd7\x02\xcb\x02\x8d\xff\xd7\x02\xcb\x02\xb2\xff\xd7\x02\xcb\x02\ +\xb4\xff\xd7\x02\xcb\x02\xc0\xff\xd7\x02\xcb\x02\xc2\xff\xd7\x02\ +\xcb\x02\xc6\xff\xd7\x02\xcb\x02\xc8\xff\xd7\x02\xcb\x02\xd5\xff\ +\xd7\x02\xcb\x02\xe0\xff\xd7\x02\xcb\x02\xf0\xff\xd7\x02\xcb\x02\ +\xf2\xff\xd7\x02\xcb\x02\xf4\xff\xd7\x02\xcb\x02\xfe\xff\xd7\x02\ +\xcb\x03\x0a\xff\xd7\x02\xcb\x03\x0c\xff\xd7\x02\xcb\x03\x16\xff\ +\xd7\x02\xcb\x03\x1a\xff\xd7\x02\xcc\x00\x05\xff\xc3\x02\xcc\x00\ +\x0a\xff\xc3\x02\xcc\x01\xa3\x00f\x02\xcc\x01\xbc\xff\xd7\x02\ +\xcc\x01\xbe\xff\xd7\x02\xcc\x01\xc1\xff\xae\x02\xcc\x01\xdc\xff\ +\xc3\x02\xcc\x01\xe1\xff\xd7\x02\xcc\x01\xe4\xff\xc3\x02\xcc\x02\ +\x07\xff\xc3\x02\xcc\x02\x0b\xff\xc3\x02\xcc\x02m\xff\xec\x02\ +\xcc\x02|\xff\xae\x02\xcc\x02\x80\xff\xd7\x02\xcc\x02\x81\xff\ +\xec\x02\xcc\x02\x82\xff\xd7\x02\xcc\x02\x83\xff\xec\x02\xcc\x02\ +\x8b\xff\xec\x02\xcc\x02\xaa\xff\xc3\x02\xcc\x02\xb5\xff\xd7\x02\ +\xcc\x02\xb6\xff\xc3\x02\xcc\x02\xb7\xff\xd7\x02\xcc\x02\xb8\xff\ +\xec\x02\xcc\x02\xb9\xff\xd7\x02\xcc\x02\xba\xff\xec\x02\xcc\x02\ +\xbe\xff\xc3\x02\xcc\x02\xbf\xff\xae\x02\xcc\x02\xc0\xff\xd7\x02\ +\xcc\x02\xc1\xff\xae\x02\xcc\x02\xc2\xff\xd7\x02\xcc\x02\xc5\xff\ +\xc3\x02\xcc\x02\xc6\xff\xd7\x02\xcc\x02\xc7\xff\xc3\x02\xcc\x02\ +\xc8\xff\xd7\x02\xcc\x02\xd4\xff\xae\x02\xcc\x02\xd5\xff\xd7\x02\ +\xcc\x02\xfd\xff\xae\x02\xcc\x02\xfe\xff\xd7\x02\xcc\x03\x0d\xff\ +\xd7\x02\xcc\x03\x0e\xff\xc3\x02\xcc\x03\x0f\xff\xd7\x02\xcc\x03\ +\x10\xff\xc3\x02\xcc\x03\x18\xff\xc3\x02\xcd\x01\xe1\xff\xd7\x02\ +\xcd\x02\xc0\xff\xd7\x02\xcd\x02\xc2\xff\xd7\x02\xcd\x02\xd5\xff\ +\xd7\x02\xcd\x02\xfe\xff\xd7\x02\xce\x01\xa3\x00\xe1\x02\xce\x02\ +\xea\x00)\x02\xce\x03\x0e\xff\xd7\x02\xce\x03\x10\xff\xd7\x02\ +\xcf\x00\x05\xff\xec\x02\xcf\x00\x0a\xff\xec\x02\xcf\x02\x07\xff\ +\xec\x02\xcf\x02\x0b\xff\xec\x02\xd2\x01\xa3\x00\xe1\x02\xd2\x02\ +\xea\x00)\x02\xd2\x03\x0e\xff\xd7\x02\xd2\x03\x10\xff\xd7\x02\ +\xd3\x00\x05\xff\xec\x02\xd3\x00\x0a\xff\xec\x02\xd3\x02\x07\xff\ +\xec\x02\xd3\x02\x0b\xff\xec\x02\xd6\x01\xa3\x00\xe1\x02\xd6\x02\ +\xea\x00)\x02\xd6\x03\x0e\xff\xd7\x02\xd6\x03\x10\xff\xd7\x02\ +\xd7\x00\x05\xff\xec\x02\xd7\x00\x0a\xff\xec\x02\xd7\x02\x07\xff\ +\xec\x02\xd7\x02\x0b\xff\xec\x02\xd9\x00\x05\xffq\x02\xd9\x00\ +\x0a\xffq\x02\xd9\x01\x9d\xff\x9a\x02\xd9\x01\xa6\xff\x9a\x02\ +\xd9\x01\xbc\xffq\x02\xd9\x01\xbe\xff\xd7\x02\xd9\x01\xc1\xff\ +\x9a\x02\xd9\x01\xc4\xff\x9a\x02\xd9\x01\xdc\xff\xd7\x02\xd9\x01\ +\xe1\xff\xd7\x02\xd9\x01\xe4\xff\xd7\x02\xd9\x02\x07\xffq\x02\ +\xd9\x02\x0b\xffq\x02\xd9\x02n\xff\xd7\x02\xd9\x02|\xff\ +\x9a\x02\xd9\x02\x80\xff\xae\x02\xd9\x02\x82\xff\xae\x02\xd9\x02\ +\x97\xff\xd7\x02\xd9\x02\x9b\xff\xd7\x02\xd9\x02\xa7\xff\xd7\x02\ +\xd9\x02\xa9\xff\x9a\x02\xd9\x02\xaa\xff\xd7\x02\xd9\x02\xb5\xff\ +q\x02\xd9\x02\xb6\xff\xd7\x02\xd9\x02\xb7\xff\x85\x02\xd9\x02\ +\xb9\xff\x85\x02\xd9\x02\xbd\xff\x9a\x02\xd9\x02\xbe\xff\xd7\x02\ +\xd9\x02\xbf\xff\x9a\x02\xd9\x02\xc0\xff\xd7\x02\xd9\x02\xc1\xff\ +\x9a\x02\xd9\x02\xc2\xff\xd7\x02\xd9\x02\xc5\xff\x9a\x02\xd9\x02\ +\xc7\xff\x9a\x02\xd9\x02\xd4\xff\x9a\x02\xd9\x02\xd5\xff\xd7\x02\ +\xd9\x02\xe1\xff\xd7\x02\xd9\x02\xe3\xff\xd7\x02\xd9\x02\xfd\xff\ +\x9a\x02\xd9\x02\xfe\xff\xd7\x02\xd9\x03\x03\xff\xd7\x02\xd9\x03\ +\x0d\xffq\x02\xd9\x03\x0e\xff\xd7\x02\xd9\x03\x0f\xffq\x02\ +\xd9\x03\x10\xff\xd7\x02\xd9\x03\x17\xff\x9a\x02\xd9\x03\x18\xff\ +\xd7\x02\xda\x00\x05\xff\xec\x02\xda\x00\x0a\xff\xec\x02\xda\x02\ +\x07\xff\xec\x02\xda\x02\x0b\xff\xec\x02\xdb\x00\x05\xffq\x02\ +\xdb\x00\x0a\xffq\x02\xdb\x01\x9d\xff\x9a\x02\xdb\x01\xa6\xff\ +\x9a\x02\xdb\x01\xbc\xffq\x02\xdb\x01\xbe\xff\xd7\x02\xdb\x01\ +\xc1\xff\x9a\x02\xdb\x01\xc4\xff\x9a\x02\xdb\x01\xdc\xff\xd7\x02\ +\xdb\x01\xe1\xff\xd7\x02\xdb\x01\xe4\xff\xd7\x02\xdb\x02\x07\xff\ +q\x02\xdb\x02\x0b\xffq\x02\xdb\x02n\xff\xd7\x02\xdb\x02\ +|\xff\x9a\x02\xdb\x02\x80\xff\xae\x02\xdb\x02\x82\xff\xae\x02\ +\xdb\x02\x97\xff\xd7\x02\xdb\x02\x9b\xff\xd7\x02\xdb\x02\xa7\xff\ +\xd7\x02\xdb\x02\xa9\xff\x9a\x02\xdb\x02\xaa\xff\xd7\x02\xdb\x02\ +\xb5\xffq\x02\xdb\x02\xb6\xff\xd7\x02\xdb\x02\xb7\xff\x85\x02\ +\xdb\x02\xb9\xff\x85\x02\xdb\x02\xbd\xff\x9a\x02\xdb\x02\xbe\xff\ +\xd7\x02\xdb\x02\xbf\xff\x9a\x02\xdb\x02\xc0\xff\xd7\x02\xdb\x02\ +\xc1\xff\x9a\x02\xdb\x02\xc2\xff\xd7\x02\xdb\x02\xc5\xff\x9a\x02\ +\xdb\x02\xc7\xff\x9a\x02\xdb\x02\xd4\xff\x9a\x02\xdb\x02\xd5\xff\ +\xd7\x02\xdb\x02\xe1\xff\xd7\x02\xdb\x02\xe3\xff\xd7\x02\xdb\x02\ +\xfd\xff\x9a\x02\xdb\x02\xfe\xff\xd7\x02\xdb\x03\x03\xff\xd7\x02\ +\xdb\x03\x0d\xffq\x02\xdb\x03\x0e\xff\xd7\x02\xdb\x03\x0f\xff\ +q\x02\xdb\x03\x10\xff\xd7\x02\xdb\x03\x17\xff\x9a\x02\xdb\x03\ +\x18\xff\xd7\x02\xdc\x00\x05\xff\xec\x02\xdc\x00\x0a\xff\xec\x02\ +\xdc\x02\x07\xff\xec\x02\xdc\x02\x0b\xff\xec\x02\xde\x00\x05\xff\ +\xec\x02\xde\x00\x0a\xff\xec\x02\xde\x02\x07\xff\xec\x02\xde\x02\ +\x0b\xff\xec\x02\xe0\x00\x05\xff\xec\x02\xe0\x00\x0a\xff\xec\x02\ +\xe0\x02\x07\xff\xec\x02\xe0\x02\x0b\xff\xec\x02\xe1\x00\x0f\xff\ +\xae\x02\xe1\x00\x11\xff\xae\x02\xe1\x01\x9d\xff\xec\x02\xe1\x01\ +\xa4\xff\xd7\x02\xe1\x01\xa6\xff\xec\x02\xe1\x01\xa8\xff\xd7\x02\ +\xe1\x01\xaa\xff\xd7\x02\xe1\x01\xae\xff\xd7\x02\xe1\x01\xb0\xff\ +\xd7\x02\xe1\x01\xb1\xff\xec\x02\xe1\x01\xb5\xff\xd7\x02\xe1\x01\ +\xbc\xff\xc3\x02\xe1\x01\xbd\xff\xd7\x02\xe1\x01\xbf\xff\xd7\x02\ +\xe1\x01\xc1\xff\xd7\x02\xe1\x01\xc4\xff\xec\x02\xe1\x01\xc7\xff\ +\xec\x02\xe1\x01\xce\xff\xec\x02\xe1\x01\xd5\xff\xec\x02\xe1\x01\ +\xf2\xff\xec\x02\xe1\x02\x08\xff\xae\x02\xe1\x02\x0c\xff\xae\x02\ +\xe1\x02r\xff\xd7\x02\xe1\x02s\xff\xec\x02\xe1\x02z\xff\ +\xec\x02\xe1\x02|\xff\xd7\x02\xe1\x02\x80\xff\xec\x02\xe1\x02\ +\x82\xff\xec\x02\xe1\x02\x9f\xff\xd7\x02\xe1\x02\xa1\xff\xec\x02\ +\xe1\x02\xa9\xff\xec\x02\xe1\x02\xb5\xff\xc3\x02\xe1\x02\xb7\xff\ +\xec\x02\xe1\x02\xb9\xff\xec\x02\xe1\x02\xbb\xff\xd7\x02\xe1\x02\ +\xbd\xff\xec\x02\xe1\x02\xbf\xff\xd7\x02\xe1\x02\xc1\xff\xd7\x02\ +\xe1\x02\xca\xff\xd7\x02\xe1\x02\xce\xff\xd7\x02\xe1\x02\xcf\xff\ +\xec\x02\xe1\x02\xd4\xff\xd7\x02\xe1\x02\xd9\xff\xd7\x02\xe1\x02\ +\xdb\xff\xd7\x02\xe1\x02\xdd\xff\xd7\x02\xe1\x02\xe5\xff\xd7\x02\ +\xe1\x02\xe7\xff\xec\x02\xe1\x02\xf5\xff\xec\x02\xe1\x02\xf7\xff\ +\xd7\x02\xe1\x02\xf9\xff\xd7\x02\xe1\x02\xfb\xff\xd7\x02\xe1\x02\ +\xfd\xff\xd7\x02\xe1\x03\x05\xff\xd7\x02\xe1\x03\x07\xff\xd7\x02\ +\xe1\x03\x0d\xff\xd7\x02\xe1\x03\x0f\xff\xd7\x02\xe1\x03\x11\xff\ +\xd7\x02\xe1\x03\x12\xff\xec\x02\xe1\x03\x17\xff\xec\x02\xe1\x03\ +\x1b\xff\xd7\x02\xe1\x03\x1c\xff\xec\x02\xe2\x00\x05\xff\xec\x02\ +\xe2\x00\x0a\xff\xec\x02\xe2\x01\xd0\xff\xd7\x02\xe2\x01\xdc\xff\ +\xec\x02\xe2\x01\xdd\xff\xec\x02\xe2\x01\xdf\xff\xd7\x02\xe2\x01\ +\xe1\xff\xec\x02\xe2\x01\xe4\xff\xec\x02\xe2\x01\xf6\xff\xec\x02\ +\xe2\x02\x07\xff\xec\x02\xe2\x02\x0b\xff\xec\x02\xe2\x02\xa0\xff\ +\xd7\x02\xe2\x02\xaa\xff\xec\x02\xe2\x02\xb6\xff\xec\x02\xe2\x02\ +\xbc\xff\xd7\x02\xe2\x02\xbe\xff\xec\x02\xe2\x02\xc0\xff\xec\x02\ +\xe2\x02\xc2\xff\xec\x02\xe2\x02\xcb\xff\xd7\x02\xe2\x02\xd5\xff\ +\xec\x02\xe2\x02\xe6\xff\xd7\x02\xe2\x02\xf8\xff\xec\x02\xe2\x02\ +\xfa\xff\xec\x02\xe2\x02\xfc\xff\xec\x02\xe2\x02\xfe\xff\xec\x02\ +\xe2\x03\x06\xff\xd7\x02\xe2\x03\x08\xff\xd7\x02\xe2\x03\x0e\xff\ +\xec\x02\xe2\x03\x10\xff\xec\x02\xe2\x03\x18\xff\xec\x02\xe3\x00\ +\x0f\xff\xae\x02\xe3\x00\x11\xff\xae\x02\xe3\x01\x9d\xff\xec\x02\ +\xe3\x01\xa4\xff\xd7\x02\xe3\x01\xa6\xff\xec\x02\xe3\x01\xa8\xff\ +\xd7\x02\xe3\x01\xaa\xff\xd7\x02\xe3\x01\xae\xff\xd7\x02\xe3\x01\ +\xb0\xff\xd7\x02\xe3\x01\xb1\xff\xec\x02\xe3\x01\xb5\xff\xd7\x02\ +\xe3\x01\xbc\xff\xc3\x02\xe3\x01\xbd\xff\xd7\x02\xe3\x01\xbf\xff\ +\xd7\x02\xe3\x01\xc1\xff\xd7\x02\xe3\x01\xc4\xff\xec\x02\xe3\x01\ +\xc7\xff\xec\x02\xe3\x01\xce\xff\xec\x02\xe3\x01\xd5\xff\xec\x02\ +\xe3\x01\xf2\xff\xec\x02\xe3\x02\x08\xff\xae\x02\xe3\x02\x0c\xff\ +\xae\x02\xe3\x02r\xff\xd7\x02\xe3\x02s\xff\xec\x02\xe3\x02\ +z\xff\xec\x02\xe3\x02|\xff\xd7\x02\xe3\x02\x80\xff\xec\x02\ +\xe3\x02\x82\xff\xec\x02\xe3\x02\x9f\xff\xd7\x02\xe3\x02\xa1\xff\ +\xec\x02\xe3\x02\xa9\xff\xec\x02\xe3\x02\xb5\xff\xc3\x02\xe3\x02\ +\xb7\xff\xec\x02\xe3\x02\xb9\xff\xec\x02\xe3\x02\xbb\xff\xd7\x02\ +\xe3\x02\xbd\xff\xec\x02\xe3\x02\xbf\xff\xd7\x02\xe3\x02\xc1\xff\ +\xd7\x02\xe3\x02\xca\xff\xd7\x02\xe3\x02\xce\xff\xd7\x02\xe3\x02\ +\xcf\xff\xec\x02\xe3\x02\xd4\xff\xd7\x02\xe3\x02\xd9\xff\xd7\x02\ +\xe3\x02\xdb\xff\xd7\x02\xe3\x02\xdd\xff\xd7\x02\xe3\x02\xe5\xff\ +\xd7\x02\xe3\x02\xe7\xff\xec\x02\xe3\x02\xf5\xff\xec\x02\xe3\x02\ +\xf7\xff\xd7\x02\xe3\x02\xf9\xff\xd7\x02\xe3\x02\xfb\xff\xd7\x02\ +\xe3\x02\xfd\xff\xd7\x02\xe3\x03\x05\xff\xd7\x02\xe3\x03\x07\xff\ +\xd7\x02\xe3\x03\x0d\xff\xd7\x02\xe3\x03\x0f\xff\xd7\x02\xe3\x03\ +\x11\xff\xd7\x02\xe3\x03\x12\xff\xec\x02\xe3\x03\x17\xff\xec\x02\ +\xe3\x03\x1b\xff\xd7\x02\xe3\x03\x1c\xff\xec\x02\xe4\x00\x05\xff\ +\xec\x02\xe4\x00\x0a\xff\xec\x02\xe4\x01\xd0\xff\xd7\x02\xe4\x01\ +\xdc\xff\xec\x02\xe4\x01\xdd\xff\xec\x02\xe4\x01\xdf\xff\xd7\x02\ +\xe4\x01\xe1\xff\xec\x02\xe4\x01\xe4\xff\xec\x02\xe4\x01\xf6\xff\ +\xec\x02\xe4\x02\x07\xff\xec\x02\xe4\x02\x0b\xff\xec\x02\xe4\x02\ +\xa0\xff\xd7\x02\xe4\x02\xaa\xff\xec\x02\xe4\x02\xb6\xff\xec\x02\ +\xe4\x02\xbc\xff\xd7\x02\xe4\x02\xbe\xff\xec\x02\xe4\x02\xc0\xff\ +\xec\x02\xe4\x02\xc2\xff\xec\x02\xe4\x02\xcb\xff\xd7\x02\xe4\x02\ +\xd5\xff\xec\x02\xe4\x02\xe6\xff\xd7\x02\xe4\x02\xf8\xff\xec\x02\ +\xe4\x02\xfa\xff\xec\x02\xe4\x02\xfc\xff\xec\x02\xe4\x02\xfe\xff\ +\xec\x02\xe4\x03\x06\xff\xd7\x02\xe4\x03\x08\xff\xd7\x02\xe4\x03\ +\x0e\xff\xec\x02\xe4\x03\x10\xff\xec\x02\xe4\x03\x18\xff\xec\x02\ +\xe5\x01\x9f\xff\xd7\x02\xe5\x01\xb8\xff\xd7\x02\xe5\x01\xbb\xff\ +\xd7\x02\xe5\x01\xbe\xff\xd7\x02\xe5\x01\xc1\xff\xd7\x02\xe5\x01\ +\xe1\xff\xd7\x02\xe5\x02l\xff\xd7\x02\xe5\x02|\xff\xd7\x02\ +\xe5\x02~\xff\xd7\x02\xe5\x02\x84\xff\xd7\x02\xe5\x02\x86\xff\ +\xd7\x02\xe5\x02\x88\xff\xd7\x02\xe5\x02\x8a\xff\xd7\x02\xe5\x02\ +\x8c\xff\xd7\x02\xe5\x02\xb1\xff\xd7\x02\xe5\x02\xb3\xff\xd7\x02\ +\xe5\x02\xbf\xff\xd7\x02\xe5\x02\xc0\xff\xd7\x02\xe5\x02\xc1\xff\ +\xd7\x02\xe5\x02\xc2\xff\xd7\x02\xe5\x02\xc5\xff\x9a\x02\xe5\x02\ +\xc7\xff\x9a\x02\xe5\x02\xd4\xff\xd7\x02\xe5\x02\xd5\xff\xd7\x02\ +\xe5\x02\xef\xff\xd7\x02\xe5\x02\xf1\xff\xd7\x02\xe5\x02\xf3\xff\ +\xd7\x02\xe5\x02\xfd\xff\xd7\x02\xe5\x02\xfe\xff\xd7\x02\xe5\x03\ +\x09\xff\xd7\x02\xe5\x03\x0b\xff\xd7\x02\xe5\x03\x0e\xff\xd7\x02\ +\xe5\x03\x10\xff\xd7\x02\xe5\x03\x15\xff\xd7\x02\xe5\x03\x19\xff\ +\xec\x02\xe6\x01\xcf\xff\xd7\x02\xe6\x01\xd8\xff\xd7\x02\xe6\x01\ +\xdb\xff\xd7\x02\xe6\x01\xde\xff\xd7\x02\xe6\x01\xe1\xff\xd7\x02\ +\xe6\x01\xea\xff\xd7\x02\xe6\x01\xed\xff\xd7\x02\xe6\x02j\xff\ +\xd7\x02\xe6\x02\x7f\xff\xd7\x02\xe6\x02\x85\xff\xd7\x02\xe6\x02\ +\x87\xff\xd7\x02\xe6\x02\x89\xff\xd7\x02\xe6\x02\x8d\xff\xd7\x02\ +\xe6\x02\xb2\xff\xd7\x02\xe6\x02\xb4\xff\xd7\x02\xe6\x02\xc0\xff\ +\xd7\x02\xe6\x02\xc2\xff\xd7\x02\xe6\x02\xc6\xff\xd7\x02\xe6\x02\ +\xc8\xff\xd7\x02\xe6\x02\xd5\xff\xd7\x02\xe6\x02\xe0\xff\xd7\x02\ +\xe6\x02\xf0\xff\xd7\x02\xe6\x02\xf2\xff\xd7\x02\xe6\x02\xf4\xff\ +\xd7\x02\xe6\x02\xfe\xff\xd7\x02\xe6\x03\x0a\xff\xd7\x02\xe6\x03\ +\x0c\xff\xd7\x02\xe6\x03\x16\xff\xd7\x02\xe6\x03\x1a\xff\xd7\x02\ +\xe7\x00\x0f\xff\xae\x02\xe7\x00\x11\xff\xae\x02\xe7\x02\x08\xff\ +\xae\x02\xe7\x02\x0c\xff\xae\x02\xe7\x02\x80\xff\xec\x02\xe7\x02\ +\x82\xff\xec\x02\xe7\x02\xb7\xff\xec\x02\xe7\x02\xb9\xff\xec\x02\ +\xe7\x03\x0d\xff\xd7\x02\xe7\x03\x0f\xff\xd7\x02\xe8\x01\xe9\x00\ +)\x02\xe9\x00\x05\xff\xec\x02\xe9\x00\x0a\xff\xec\x02\xe9\x02\ +\x07\xff\xec\x02\xe9\x02\x0b\xff\xec\x02\xe9\x03\x0e\xff\xd7\x02\ +\xe9\x03\x10\xff\xd7\x02\xef\x00\x0f\xff\xae\x02\xef\x00\x11\xff\ +\xae\x02\xef\x01\x9d\xff\xec\x02\xef\x01\xa4\xff\xd7\x02\xef\x01\ +\xa6\xff\xec\x02\xef\x01\xa8\xff\xd7\x02\xef\x01\xaa\xff\xd7\x02\ +\xef\x01\xae\xff\xd7\x02\xef\x01\xb0\xff\xd7\x02\xef\x01\xb1\xff\ +\xec\x02\xef\x01\xb5\xff\xd7\x02\xef\x01\xbc\xff\xc3\x02\xef\x01\ +\xbd\xff\xd7\x02\xef\x01\xbf\xff\xd7\x02\xef\x01\xc1\xff\xd7\x02\ +\xef\x01\xc4\xff\xec\x02\xef\x01\xc7\xff\xec\x02\xef\x01\xce\xff\ +\xec\x02\xef\x01\xd5\xff\xec\x02\xef\x01\xf2\xff\xec\x02\xef\x02\ +\x08\xff\xae\x02\xef\x02\x0c\xff\xae\x02\xef\x02r\xff\xd7\x02\ +\xef\x02s\xff\xec\x02\xef\x02z\xff\xec\x02\xef\x02|\xff\ +\xd7\x02\xef\x02\x80\xff\xec\x02\xef\x02\x82\xff\xec\x02\xef\x02\ +\x9f\xff\xd7\x02\xef\x02\xa1\xff\xec\x02\xef\x02\xa9\xff\xec\x02\ +\xef\x02\xb5\xff\xc3\x02\xef\x02\xb7\xff\xec\x02\xef\x02\xb9\xff\ +\xec\x02\xef\x02\xbb\xff\xd7\x02\xef\x02\xbd\xff\xec\x02\xef\x02\ +\xbf\xff\xd7\x02\xef\x02\xc1\xff\xd7\x02\xef\x02\xca\xff\xd7\x02\ +\xef\x02\xce\xff\xd7\x02\xef\x02\xcf\xff\xec\x02\xef\x02\xd4\xff\ +\xd7\x02\xef\x02\xd9\xff\xd7\x02\xef\x02\xdb\xff\xd7\x02\xef\x02\ +\xdd\xff\xd7\x02\xef\x02\xe5\xff\xd7\x02\xef\x02\xe7\xff\xec\x02\ +\xef\x02\xf5\xff\xec\x02\xef\x02\xf7\xff\xd7\x02\xef\x02\xf9\xff\ +\xd7\x02\xef\x02\xfb\xff\xd7\x02\xef\x02\xfd\xff\xd7\x02\xef\x03\ +\x05\xff\xd7\x02\xef\x03\x07\xff\xd7\x02\xef\x03\x0d\xff\xd7\x02\ +\xef\x03\x0f\xff\xd7\x02\xef\x03\x11\xff\xd7\x02\xef\x03\x12\xff\ +\xec\x02\xef\x03\x17\xff\xec\x02\xef\x03\x1b\xff\xd7\x02\xef\x03\ +\x1c\xff\xec\x02\xf0\x00\x05\xff\xec\x02\xf0\x00\x0a\xff\xec\x02\ +\xf0\x01\xd0\xff\xd7\x02\xf0\x01\xdc\xff\xec\x02\xf0\x01\xdd\xff\ +\xec\x02\xf0\x01\xdf\xff\xd7\x02\xf0\x01\xe1\xff\xec\x02\xf0\x01\ +\xe4\xff\xec\x02\xf0\x01\xf6\xff\xec\x02\xf0\x02\x07\xff\xec\x02\ +\xf0\x02\x0b\xff\xec\x02\xf0\x02\xa0\xff\xd7\x02\xf0\x02\xaa\xff\ +\xec\x02\xf0\x02\xb6\xff\xec\x02\xf0\x02\xbc\xff\xd7\x02\xf0\x02\ +\xbe\xff\xec\x02\xf0\x02\xc0\xff\xec\x02\xf0\x02\xc2\xff\xec\x02\ +\xf0\x02\xcb\xff\xd7\x02\xf0\x02\xd5\xff\xec\x02\xf0\x02\xe6\xff\ +\xd7\x02\xf0\x02\xf8\xff\xec\x02\xf0\x02\xfa\xff\xec\x02\xf0\x02\ +\xfc\xff\xec\x02\xf0\x02\xfe\xff\xec\x02\xf0\x03\x06\xff\xd7\x02\ +\xf0\x03\x08\xff\xd7\x02\xf0\x03\x0e\xff\xec\x02\xf0\x03\x10\xff\ +\xec\x02\xf0\x03\x18\xff\xec\x02\xf1\x00\x0f\xff\xae\x02\xf1\x00\ +\x11\xff\xae\x02\xf1\x01\x9d\xff\xec\x02\xf1\x01\xa4\xff\xd7\x02\ +\xf1\x01\xa6\xff\xec\x02\xf1\x01\xa8\xff\xd7\x02\xf1\x01\xaa\xff\ +\xd7\x02\xf1\x01\xae\xff\xd7\x02\xf1\x01\xb0\xff\xd7\x02\xf1\x01\ +\xb1\xff\xec\x02\xf1\x01\xb5\xff\xd7\x02\xf1\x01\xbc\xff\xc3\x02\ +\xf1\x01\xbd\xff\xd7\x02\xf1\x01\xbf\xff\xd7\x02\xf1\x01\xc1\xff\ +\xd7\x02\xf1\x01\xc4\xff\xec\x02\xf1\x01\xc7\xff\xec\x02\xf1\x01\ +\xce\xff\xec\x02\xf1\x01\xd5\xff\xec\x02\xf1\x01\xf2\xff\xec\x02\ +\xf1\x02\x08\xff\xae\x02\xf1\x02\x0c\xff\xae\x02\xf1\x02r\xff\ +\xd7\x02\xf1\x02s\xff\xec\x02\xf1\x02z\xff\xec\x02\xf1\x02\ +|\xff\xd7\x02\xf1\x02\x80\xff\xec\x02\xf1\x02\x82\xff\xec\x02\ +\xf1\x02\x9f\xff\xd7\x02\xf1\x02\xa1\xff\xec\x02\xf1\x02\xa9\xff\ +\xec\x02\xf1\x02\xb5\xff\xc3\x02\xf1\x02\xb7\xff\xec\x02\xf1\x02\ +\xb9\xff\xec\x02\xf1\x02\xbb\xff\xd7\x02\xf1\x02\xbd\xff\xec\x02\ +\xf1\x02\xbf\xff\xd7\x02\xf1\x02\xc1\xff\xd7\x02\xf1\x02\xca\xff\ +\xd7\x02\xf1\x02\xce\xff\xd7\x02\xf1\x02\xcf\xff\xec\x02\xf1\x02\ +\xd4\xff\xd7\x02\xf1\x02\xd9\xff\xd7\x02\xf1\x02\xdb\xff\xd7\x02\ +\xf1\x02\xdd\xff\xd7\x02\xf1\x02\xe5\xff\xd7\x02\xf1\x02\xe7\xff\ +\xec\x02\xf1\x02\xf5\xff\xec\x02\xf1\x02\xf7\xff\xd7\x02\xf1\x02\ +\xf9\xff\xd7\x02\xf1\x02\xfb\xff\xd7\x02\xf1\x02\xfd\xff\xd7\x02\ +\xf1\x03\x05\xff\xd7\x02\xf1\x03\x07\xff\xd7\x02\xf1\x03\x0d\xff\ +\xd7\x02\xf1\x03\x0f\xff\xd7\x02\xf1\x03\x11\xff\xd7\x02\xf1\x03\ +\x12\xff\xec\x02\xf1\x03\x17\xff\xec\x02\xf1\x03\x1b\xff\xd7\x02\ +\xf1\x03\x1c\xff\xec\x02\xf2\x00\x05\xff\xec\x02\xf2\x00\x0a\xff\ +\xec\x02\xf2\x01\xd0\xff\xd7\x02\xf2\x01\xdc\xff\xec\x02\xf2\x01\ +\xdd\xff\xec\x02\xf2\x01\xdf\xff\xd7\x02\xf2\x01\xe1\xff\xec\x02\ +\xf2\x01\xe4\xff\xec\x02\xf2\x01\xf6\xff\xec\x02\xf2\x02\x07\xff\ +\xec\x02\xf2\x02\x0b\xff\xec\x02\xf2\x02\xa0\xff\xd7\x02\xf2\x02\ +\xaa\xff\xec\x02\xf2\x02\xb6\xff\xec\x02\xf2\x02\xbc\xff\xd7\x02\ +\xf2\x02\xbe\xff\xec\x02\xf2\x02\xc0\xff\xec\x02\xf2\x02\xc2\xff\ +\xec\x02\xf2\x02\xcb\xff\xd7\x02\xf2\x02\xd5\xff\xec\x02\xf2\x02\ +\xe6\xff\xd7\x02\xf2\x02\xf8\xff\xec\x02\xf2\x02\xfa\xff\xec\x02\ +\xf2\x02\xfc\xff\xec\x02\xf2\x02\xfe\xff\xec\x02\xf2\x03\x06\xff\ +\xd7\x02\xf2\x03\x08\xff\xd7\x02\xf2\x03\x0e\xff\xec\x02\xf2\x03\ +\x10\xff\xec\x02\xf2\x03\x18\xff\xec\x02\xf3\x00\x0f\xff\xae\x02\ +\xf3\x00\x11\xff\xae\x02\xf3\x01\x9d\xff\xec\x02\xf3\x01\xa4\xff\ +\xd7\x02\xf3\x01\xa6\xff\xec\x02\xf3\x01\xa8\xff\xd7\x02\xf3\x01\ +\xaa\xff\xd7\x02\xf3\x01\xae\xff\xd7\x02\xf3\x01\xb0\xff\xd7\x02\ +\xf3\x01\xb1\xff\xec\x02\xf3\x01\xb5\xff\xd7\x02\xf3\x01\xbc\xff\ +\xc3\x02\xf3\x01\xbd\xff\xd7\x02\xf3\x01\xbf\xff\xd7\x02\xf3\x01\ +\xc1\xff\xd7\x02\xf3\x01\xc4\xff\xec\x02\xf3\x01\xc7\xff\xec\x02\ +\xf3\x01\xce\xff\xec\x02\xf3\x01\xd5\xff\xec\x02\xf3\x01\xf2\xff\ +\xec\x02\xf3\x02\x08\xff\xae\x02\xf3\x02\x0c\xff\xae\x02\xf3\x02\ +r\xff\xd7\x02\xf3\x02s\xff\xec\x02\xf3\x02z\xff\xec\x02\ +\xf3\x02|\xff\xd7\x02\xf3\x02\x80\xff\xec\x02\xf3\x02\x82\xff\ +\xec\x02\xf3\x02\x9f\xff\xd7\x02\xf3\x02\xa1\xff\xec\x02\xf3\x02\ +\xa9\xff\xec\x02\xf3\x02\xb5\xff\xc3\x02\xf3\x02\xb7\xff\xec\x02\ +\xf3\x02\xb9\xff\xec\x02\xf3\x02\xbb\xff\xd7\x02\xf3\x02\xbd\xff\ +\xec\x02\xf3\x02\xbf\xff\xd7\x02\xf3\x02\xc1\xff\xd7\x02\xf3\x02\ +\xca\xff\xd7\x02\xf3\x02\xce\xff\xd7\x02\xf3\x02\xcf\xff\xec\x02\ +\xf3\x02\xd4\xff\xd7\x02\xf3\x02\xd9\xff\xd7\x02\xf3\x02\xdb\xff\ +\xd7\x02\xf3\x02\xdd\xff\xd7\x02\xf3\x02\xe5\xff\xd7\x02\xf3\x02\ +\xe7\xff\xec\x02\xf3\x02\xf5\xff\xec\x02\xf3\x02\xf7\xff\xd7\x02\ +\xf3\x02\xf9\xff\xd7\x02\xf3\x02\xfb\xff\xd7\x02\xf3\x02\xfd\xff\ +\xd7\x02\xf3\x03\x05\xff\xd7\x02\xf3\x03\x07\xff\xd7\x02\xf3\x03\ +\x0d\xff\xd7\x02\xf3\x03\x0f\xff\xd7\x02\xf3\x03\x11\xff\xd7\x02\ +\xf3\x03\x12\xff\xec\x02\xf3\x03\x17\xff\xec\x02\xf3\x03\x1b\xff\ +\xd7\x02\xf3\x03\x1c\xff\xec\x02\xf4\x00\x05\xff\xec\x02\xf4\x00\ +\x0a\xff\xec\x02\xf4\x01\xd0\xff\xd7\x02\xf4\x01\xdc\xff\xec\x02\ +\xf4\x01\xdd\xff\xec\x02\xf4\x01\xdf\xff\xd7\x02\xf4\x01\xe1\xff\ +\xec\x02\xf4\x01\xe4\xff\xec\x02\xf4\x01\xf6\xff\xec\x02\xf4\x02\ +\x07\xff\xec\x02\xf4\x02\x0b\xff\xec\x02\xf4\x02\xa0\xff\xd7\x02\ +\xf4\x02\xaa\xff\xec\x02\xf4\x02\xb6\xff\xec\x02\xf4\x02\xbc\xff\ +\xd7\x02\xf4\x02\xbe\xff\xec\x02\xf4\x02\xc0\xff\xec\x02\xf4\x02\ +\xc2\xff\xec\x02\xf4\x02\xcb\xff\xd7\x02\xf4\x02\xd5\xff\xec\x02\ +\xf4\x02\xe6\xff\xd7\x02\xf4\x02\xf8\xff\xec\x02\xf4\x02\xfa\xff\ +\xec\x02\xf4\x02\xfc\xff\xec\x02\xf4\x02\xfe\xff\xec\x02\xf4\x03\ +\x06\xff\xd7\x02\xf4\x03\x08\xff\xd7\x02\xf4\x03\x0e\xff\xec\x02\ +\xf4\x03\x10\xff\xec\x02\xf4\x03\x18\xff\xec\x02\xf5\x00\x0f\xff\ +\xae\x02\xf5\x00\x11\xff\xae\x02\xf5\x01\x9d\xff\xec\x02\xf5\x01\ +\xa4\xff\xd7\x02\xf5\x01\xa6\xff\xec\x02\xf5\x01\xa8\xff\xd7\x02\ +\xf5\x01\xaa\xff\xd7\x02\xf5\x01\xae\xff\xd7\x02\xf5\x01\xb0\xff\ +\xd7\x02\xf5\x01\xb1\xff\xec\x02\xf5\x01\xb5\xff\xd7\x02\xf5\x01\ +\xbc\xff\xc3\x02\xf5\x01\xbd\xff\xd7\x02\xf5\x01\xbf\xff\xd7\x02\ +\xf5\x01\xc1\xff\xd7\x02\xf5\x01\xc4\xff\xec\x02\xf5\x01\xc7\xff\ +\xec\x02\xf5\x01\xce\xff\xec\x02\xf5\x01\xd5\xff\xec\x02\xf5\x01\ +\xf2\xff\xec\x02\xf5\x02\x08\xff\xae\x02\xf5\x02\x0c\xff\xae\x02\ +\xf5\x02r\xff\xd7\x02\xf5\x02s\xff\xec\x02\xf5\x02z\xff\ +\xec\x02\xf5\x02|\xff\xd7\x02\xf5\x02\x80\xff\xec\x02\xf5\x02\ +\x82\xff\xec\x02\xf5\x02\x9f\xff\xd7\x02\xf5\x02\xa1\xff\xec\x02\ +\xf5\x02\xa9\xff\xec\x02\xf5\x02\xb5\xff\xc3\x02\xf5\x02\xb7\xff\ +\xec\x02\xf5\x02\xb9\xff\xec\x02\xf5\x02\xbb\xff\xd7\x02\xf5\x02\ +\xbd\xff\xec\x02\xf5\x02\xbf\xff\xd7\x02\xf5\x02\xc1\xff\xd7\x02\ +\xf5\x02\xca\xff\xd7\x02\xf5\x02\xce\xff\xd7\x02\xf5\x02\xcf\xff\ +\xec\x02\xf5\x02\xd4\xff\xd7\x02\xf5\x02\xd9\xff\xd7\x02\xf5\x02\ +\xdb\xff\xd7\x02\xf5\x02\xdd\xff\xd7\x02\xf5\x02\xe5\xff\xd7\x02\ +\xf5\x02\xe7\xff\xec\x02\xf5\x02\xf5\xff\xec\x02\xf5\x02\xf7\xff\ +\xd7\x02\xf5\x02\xf9\xff\xd7\x02\xf5\x02\xfb\xff\xd7\x02\xf5\x02\ +\xfd\xff\xd7\x02\xf5\x03\x05\xff\xd7\x02\xf5\x03\x07\xff\xd7\x02\ +\xf5\x03\x0d\xff\xd7\x02\xf5\x03\x0f\xff\xd7\x02\xf5\x03\x11\xff\ +\xd7\x02\xf5\x03\x12\xff\xec\x02\xf5\x03\x17\xff\xec\x02\xf5\x03\ +\x1b\xff\xd7\x02\xf5\x03\x1c\xff\xec\x02\xf6\x00\x05\xff\xec\x02\ +\xf6\x00\x0a\xff\xec\x02\xf6\x01\xd0\xff\xd7\x02\xf6\x01\xdc\xff\ +\xec\x02\xf6\x01\xdd\xff\xec\x02\xf6\x01\xdf\xff\xd7\x02\xf6\x01\ +\xe1\xff\xec\x02\xf6\x01\xe4\xff\xec\x02\xf6\x01\xf6\xff\xec\x02\ +\xf6\x02\x07\xff\xec\x02\xf6\x02\x0b\xff\xec\x02\xf6\x02\xa0\xff\ +\xd7\x02\xf6\x02\xaa\xff\xec\x02\xf6\x02\xb6\xff\xec\x02\xf6\x02\ +\xbc\xff\xd7\x02\xf6\x02\xbe\xff\xec\x02\xf6\x02\xc0\xff\xec\x02\ +\xf6\x02\xc2\xff\xec\x02\xf6\x02\xcb\xff\xd7\x02\xf6\x02\xd5\xff\ +\xec\x02\xf6\x02\xe6\xff\xd7\x02\xf6\x02\xf8\xff\xec\x02\xf6\x02\ +\xfa\xff\xec\x02\xf6\x02\xfc\xff\xec\x02\xf6\x02\xfe\xff\xec\x02\ +\xf6\x03\x06\xff\xd7\x02\xf6\x03\x08\xff\xd7\x02\xf6\x03\x0e\xff\ +\xec\x02\xf6\x03\x10\xff\xec\x02\xf6\x03\x18\xff\xec\x02\xf7\x00\ +\x0f\xff\x85\x02\xf7\x00\x11\xff\x85\x02\xf7\x01\x9f\xff\xec\x02\ +\xf7\x01\xa4\xff\x9a\x02\xf7\x01\xaa\xffq\x02\xf7\x01\xae\xff\ +\x9a\x02\xf7\x01\xb5\xff\x9a\x02\xf7\x01\xb8\xff\xec\x02\xf7\x01\ +\xbb\xff\xec\x02\xf7\x01\xbe\xff\xc3\x02\xf7\x01\xc9\xff\xec\x02\ +\xf7\x01\xce\xff\xae\x02\xf7\x01\xcf\xff\xd7\x02\xf7\x01\xd5\xff\ +\xae\x02\xf7\x01\xd8\xff\xd7\x02\xf7\x01\xdb\xff\xd7\x02\xf7\x01\ +\xde\xff\xd7\x02\xf7\x01\xe1\xff\xd7\x02\xf7\x01\xea\xff\xd7\x02\ +\xf7\x01\xeb\x00f\x02\xf7\x01\xed\xff\xd7\x02\xf7\x01\xee\xff\ +\xec\x02\xf7\x01\xf2\xff\xae\x02\xf7\x01\xf4\x00f\x02\xf7\x02\ +\x08\xff\x85\x02\xf7\x02\x0c\xff\x85\x02\xf7\x02j\xff\xd7\x02\ +\xf7\x02l\xff\xec\x02\xf7\x02r\xffq\x02\xf7\x02s\xff\ +\xae\x02\xf7\x02~\xff\xec\x02\xf7\x02\x7f\xff\xd7\x02\xf7\x02\ +\x84\xff\xec\x02\xf7\x02\x85\xff\xd7\x02\xf7\x02\x86\xff\xec\x02\ +\xf7\x02\x87\xff\xd7\x02\xf7\x02\x88\xff\xec\x02\xf7\x02\x89\xff\ +\xd7\x02\xf7\x02\x8a\xff\xec\x02\xf7\x02\x8c\xff\xec\x02\xf7\x02\ +\x8d\xff\xd7\x02\xf7\x02\x98\x00f\x02\xf7\x02\xa8\x00f\x02\ +\xf7\x02\xb1\xff\xec\x02\xf7\x02\xb2\xff\xd7\x02\xf7\x02\xb3\xff\ +\xec\x02\xf7\x02\xb4\xff\xd7\x02\xf7\x02\xc0\xff\xd7\x02\xf7\x02\ +\xc2\xff\xd7\x02\xf7\x02\xc5\xff\xd7\x02\xf7\x02\xc6\xff\xc3\x02\ +\xf7\x02\xc7\xff\xd7\x02\xf7\x02\xc8\xff\xc3\x02\xf7\x02\xce\xff\ +\x9a\x02\xf7\x02\xcf\xff\xae\x02\xf7\x02\xd5\xff\xd7\x02\xf7\x02\ +\xd9\xffq\x02\xf7\x02\xdb\xffq\x02\xf7\x02\xdd\xffq\x02\ +\xf7\x02\xe0\xff\xd7\x02\xf7\x02\xef\xff\xec\x02\xf7\x02\xf0\xff\ +\xd7\x02\xf7\x02\xf1\xff\xec\x02\xf7\x02\xf2\xff\xd7\x02\xf7\x02\ +\xf3\xff\xec\x02\xf7\x02\xf4\xff\xd7\x02\xf7\x02\xfe\xff\xd7\x02\ +\xf7\x03\x09\xffq\x02\xf7\x03\x0a\xff\xd7\x02\xf7\x03\x0b\xff\ +q\x02\xf7\x03\x0c\xff\xd7\x02\xf7\x03\x11\xff\x9a\x02\xf7\x03\ +\x12\xff\xae\x02\xf7\x03\x15\xff\xec\x02\xf7\x03\x16\xff\xd7\x02\ +\xf7\x03\x1a\xff\xd7\x02\xf7\x03\x1b\xff\x9a\x02\xf7\x03\x1c\xff\ +\xae\x02\xf8\x00\x0f\xff\xae\x02\xf8\x00\x11\xff\xae\x02\xf8\x01\ +\xce\xff\xd7\x02\xf8\x01\xd5\xff\xd7\x02\xf8\x01\xf2\xff\xd7\x02\ +\xf8\x02\x08\xff\xae\x02\xf8\x02\x0c\xff\xae\x02\xf8\x02s\xff\ +\xd7\x02\xf8\x02\xcf\xff\xd7\x02\xf8\x03\x12\xff\xd7\x02\xf8\x03\ +\x1c\xff\xd7\x02\xf9\x00\x0f\xff\x85\x02\xf9\x00\x11\xff\x85\x02\ +\xf9\x01\x9f\xff\xec\x02\xf9\x01\xa4\xff\x9a\x02\xf9\x01\xaa\xff\ +q\x02\xf9\x01\xae\xff\x9a\x02\xf9\x01\xb5\xff\x9a\x02\xf9\x01\ +\xb8\xff\xec\x02\xf9\x01\xbb\xff\xec\x02\xf9\x01\xbe\xff\xc3\x02\ +\xf9\x01\xc9\xff\xec\x02\xf9\x01\xce\xff\xae\x02\xf9\x01\xcf\xff\ +\xd7\x02\xf9\x01\xd5\xff\xae\x02\xf9\x01\xd8\xff\xd7\x02\xf9\x01\ +\xdb\xff\xd7\x02\xf9\x01\xde\xff\xd7\x02\xf9\x01\xe1\xff\xd7\x02\ +\xf9\x01\xea\xff\xd7\x02\xf9\x01\xeb\x00f\x02\xf9\x01\xed\xff\ +\xd7\x02\xf9\x01\xee\xff\xec\x02\xf9\x01\xf2\xff\xae\x02\xf9\x01\ +\xf4\x00f\x02\xf9\x02\x08\xff\x85\x02\xf9\x02\x0c\xff\x85\x02\ +\xf9\x02j\xff\xd7\x02\xf9\x02l\xff\xec\x02\xf9\x02r\xff\ +q\x02\xf9\x02s\xff\xae\x02\xf9\x02~\xff\xec\x02\xf9\x02\ +\x7f\xff\xd7\x02\xf9\x02\x84\xff\xec\x02\xf9\x02\x85\xff\xd7\x02\ +\xf9\x02\x86\xff\xec\x02\xf9\x02\x87\xff\xd7\x02\xf9\x02\x88\xff\ +\xec\x02\xf9\x02\x89\xff\xd7\x02\xf9\x02\x8a\xff\xec\x02\xf9\x02\ +\x8c\xff\xec\x02\xf9\x02\x8d\xff\xd7\x02\xf9\x02\x98\x00f\x02\ +\xf9\x02\xa8\x00f\x02\xf9\x02\xb1\xff\xec\x02\xf9\x02\xb2\xff\ +\xd7\x02\xf9\x02\xb3\xff\xec\x02\xf9\x02\xb4\xff\xd7\x02\xf9\x02\ +\xc0\xff\xd7\x02\xf9\x02\xc2\xff\xd7\x02\xf9\x02\xc5\xff\xd7\x02\ +\xf9\x02\xc6\xff\xc3\x02\xf9\x02\xc7\xff\xd7\x02\xf9\x02\xc8\xff\ +\xc3\x02\xf9\x02\xce\xff\x9a\x02\xf9\x02\xcf\xff\xae\x02\xf9\x02\ +\xd5\xff\xd7\x02\xf9\x02\xd9\xffq\x02\xf9\x02\xdb\xffq\x02\ +\xf9\x02\xdd\xffq\x02\xf9\x02\xe0\xff\xd7\x02\xf9\x02\xef\xff\ +\xec\x02\xf9\x02\xf0\xff\xd7\x02\xf9\x02\xf1\xff\xec\x02\xf9\x02\ +\xf2\xff\xd7\x02\xf9\x02\xf3\xff\xec\x02\xf9\x02\xf4\xff\xd7\x02\ +\xf9\x02\xfe\xff\xd7\x02\xf9\x03\x09\xffq\x02\xf9\x03\x0a\xff\ +\xd7\x02\xf9\x03\x0b\xffq\x02\xf9\x03\x0c\xff\xd7\x02\xf9\x03\ +\x11\xff\x9a\x02\xf9\x03\x12\xff\xae\x02\xf9\x03\x15\xff\xec\x02\ +\xf9\x03\x16\xff\xd7\x02\xf9\x03\x1a\xff\xd7\x02\xf9\x03\x1b\xff\ +\x9a\x02\xf9\x03\x1c\xff\xae\x02\xfa\x00\x0f\xff\xae\x02\xfa\x00\ +\x11\xff\xae\x02\xfa\x01\xce\xff\xd7\x02\xfa\x01\xd5\xff\xd7\x02\ +\xfa\x01\xf2\xff\xd7\x02\xfa\x02\x08\xff\xae\x02\xfa\x02\x0c\xff\ +\xae\x02\xfa\x02s\xff\xd7\x02\xfa\x02\xcf\xff\xd7\x02\xfa\x03\ +\x12\xff\xd7\x02\xfa\x03\x1c\xff\xd7\x02\xfb\x00\x0f\xff\x85\x02\ +\xfb\x00\x11\xff\x85\x02\xfb\x01\x9f\xff\xec\x02\xfb\x01\xa4\xff\ +\x9a\x02\xfb\x01\xaa\xffq\x02\xfb\x01\xae\xff\x9a\x02\xfb\x01\ +\xb5\xff\x9a\x02\xfb\x01\xb8\xff\xec\x02\xfb\x01\xbb\xff\xec\x02\ +\xfb\x01\xbe\xff\xc3\x02\xfb\x01\xc9\xff\xec\x02\xfb\x01\xce\xff\ +\xae\x02\xfb\x01\xcf\xff\xd7\x02\xfb\x01\xd5\xff\xae\x02\xfb\x01\ +\xd8\xff\xd7\x02\xfb\x01\xdb\xff\xd7\x02\xfb\x01\xde\xff\xd7\x02\ +\xfb\x01\xe1\xff\xd7\x02\xfb\x01\xea\xff\xd7\x02\xfb\x01\xeb\x00\ +f\x02\xfb\x01\xed\xff\xd7\x02\xfb\x01\xee\xff\xec\x02\xfb\x01\ +\xf2\xff\xae\x02\xfb\x01\xf4\x00f\x02\xfb\x02\x08\xff\x85\x02\ +\xfb\x02\x0c\xff\x85\x02\xfb\x02j\xff\xd7\x02\xfb\x02l\xff\ +\xec\x02\xfb\x02r\xffq\x02\xfb\x02s\xff\xae\x02\xfb\x02\ +~\xff\xec\x02\xfb\x02\x7f\xff\xd7\x02\xfb\x02\x84\xff\xec\x02\ +\xfb\x02\x85\xff\xd7\x02\xfb\x02\x86\xff\xec\x02\xfb\x02\x87\xff\ +\xd7\x02\xfb\x02\x88\xff\xec\x02\xfb\x02\x89\xff\xd7\x02\xfb\x02\ +\x8a\xff\xec\x02\xfb\x02\x8c\xff\xec\x02\xfb\x02\x8d\xff\xd7\x02\ +\xfb\x02\x98\x00f\x02\xfb\x02\xa8\x00f\x02\xfb\x02\xb1\xff\ +\xec\x02\xfb\x02\xb2\xff\xd7\x02\xfb\x02\xb3\xff\xec\x02\xfb\x02\ +\xb4\xff\xd7\x02\xfb\x02\xc0\xff\xd7\x02\xfb\x02\xc2\xff\xd7\x02\ +\xfb\x02\xc5\xff\xd7\x02\xfb\x02\xc6\xff\xc3\x02\xfb\x02\xc7\xff\ +\xd7\x02\xfb\x02\xc8\xff\xc3\x02\xfb\x02\xce\xff\x9a\x02\xfb\x02\ +\xcf\xff\xae\x02\xfb\x02\xd5\xff\xd7\x02\xfb\x02\xd9\xffq\x02\ +\xfb\x02\xdb\xffq\x02\xfb\x02\xdd\xffq\x02\xfb\x02\xe0\xff\ +\xd7\x02\xfb\x02\xef\xff\xec\x02\xfb\x02\xf0\xff\xd7\x02\xfb\x02\ +\xf1\xff\xec\x02\xfb\x02\xf2\xff\xd7\x02\xfb\x02\xf3\xff\xec\x02\ +\xfb\x02\xf4\xff\xd7\x02\xfb\x02\xfe\xff\xd7\x02\xfb\x03\x09\xff\ +q\x02\xfb\x03\x0a\xff\xd7\x02\xfb\x03\x0b\xffq\x02\xfb\x03\ +\x0c\xff\xd7\x02\xfb\x03\x11\xff\x9a\x02\xfb\x03\x12\xff\xae\x02\ +\xfb\x03\x15\xff\xec\x02\xfb\x03\x16\xff\xd7\x02\xfb\x03\x1a\xff\ +\xd7\x02\xfb\x03\x1b\xff\x9a\x02\xfb\x03\x1c\xff\xae\x02\xfc\x00\ +\x0f\xff\xae\x02\xfc\x00\x11\xff\xae\x02\xfc\x01\xce\xff\xd7\x02\ +\xfc\x01\xd5\xff\xd7\x02\xfc\x01\xf2\xff\xd7\x02\xfc\x02\x08\xff\ +\xae\x02\xfc\x02\x0c\xff\xae\x02\xfc\x02s\xff\xd7\x02\xfc\x02\ +\xcf\xff\xd7\x02\xfc\x03\x12\xff\xd7\x02\xfc\x03\x1c\xff\xd7\x02\ +\xff\x00\x0f\xff\x85\x02\xff\x00\x10\xff\xae\x02\xff\x00\x11\xff\ +\x85\x02\xff\x01\x9f\xff\xd7\x02\xff\x01\xa4\xff\x9a\x02\xff\x01\ +\xaa\xffq\x02\xff\x01\xae\xff\x9a\x02\xff\x01\xb5\xff\x9a\x02\ +\xff\x01\xb8\xff\xd7\x02\xff\x01\xbb\xff\xd7\x02\xff\x01\xbc\x00\ +)\x02\xff\x01\xbe\xff\xae\x02\xff\x01\xcc\xff\x9a\x02\xff\x01\ +\xcd\xff\x9a\x02\xff\x01\xce\xff\x85\x02\xff\x01\xcf\xffq\x02\ +\xff\x01\xd0\xff\xd7\x02\xff\x01\xd1\xff\xd7\x02\xff\x01\xd2\xff\ +\x9a\x02\xff\x01\xd3\xff\x9a\x02\xff\x01\xd4\xff\x9a\x02\xff\x01\ +\xd5\xff\x85\x02\xff\x01\xd6\xff\x9a\x02\xff\x01\xd7\xff\x9a\x02\ +\xff\x01\xd8\xffq\x02\xff\x01\xd9\xff\x9a\x02\xff\x01\xda\xff\ +\x9a\x02\xff\x01\xdb\xffq\x02\xff\x01\xdc\xff\xae\x02\xff\x01\ +\xdd\xff\xae\x02\xff\x01\xde\xffq\x02\xff\x01\xdf\xff\xd7\x02\ +\xff\x01\xe0\xff\x9a\x02\xff\x01\xe1\xff\x9a\x02\xff\x01\xe2\xff\ +\x9a\x02\xff\x01\xe3\xff\x9a\x02\xff\x01\xe4\xff\xae\x02\xff\x01\ +\xe5\xff\x9a\x02\xff\x01\xe6\xff\x9a\x02\xff\x01\xe7\xff\xd7\x02\ +\xff\x01\xe8\xff\x9a\x02\xff\x01\xe9\xff\xc3\x02\xff\x01\xea\xff\ +q\x02\xff\x01\xec\xff\x9a\x02\xff\x01\xed\xffq\x02\xff\x01\ +\xee\xff\x85\x02\xff\x01\xf2\xff\x85\x02\xff\x01\xf3\xff\x9a\x02\ +\xff\x01\xf5\xff\x9a\x02\xff\x01\xf6\xff\xae\x02\xff\x01\xf7\xff\ +\x9a\x02\xff\x01\xf9\xff\x9a\x02\xff\x02\x02\xff\xae\x02\xff\x02\ +\x03\xff\xae\x02\xff\x02\x04\xff\xae\x02\xff\x02\x08\xff\x85\x02\ +\xff\x02\x0c\xff\x85\x02\xff\x02j\xffq\x02\xff\x02k\xff\ +\x9a\x02\xff\x02l\xff\xd7\x02\xff\x02m\xff\xd7\x02\xff\x02\ +q\xff\x9a\x02\xff\x02r\xffq\x02\xff\x02s\xff\x85\x02\ +\xff\x02u\xff\x9a\x02\xff\x02w\xff\x9a\x02\xff\x02y\xff\ +\x9a\x02\xff\x02}\xff\x9a\x02\xff\x02~\xff\xd7\x02\xff\x02\ +\x7f\xffq\x02\xff\x02\x81\xff\xd7\x02\xff\x02\x83\xff\xd7\x02\ +\xff\x02\x84\xff\xd7\x02\xff\x02\x85\xffq\x02\xff\x02\x86\xff\ +\xd7\x02\xff\x02\x87\xffq\x02\xff\x02\x88\xff\xd7\x02\xff\x02\ +\x89\xffq\x02\xff\x02\x8a\xff\xd7\x02\xff\x02\x8b\xff\xd7\x02\ +\xff\x02\x8c\xff\xd7\x02\xff\x02\x8d\xffq\x02\xff\x02\x96\xff\ +\x9a\x02\xff\x02\x9a\xff\x9a\x02\xff\x02\x9e\xff\x9a\x02\xff\x02\ +\xa0\xff\xd7\x02\xff\x02\xa2\xff\xd7\x02\xff\x02\xa4\xff\x9a\x02\ +\xff\x02\xa6\xff\x9a\x02\xff\x02\xaa\xff\xae\x02\xff\x02\xac\xff\ +\x9a\x02\xff\x02\xae\xff\x9a\x02\xff\x02\xb0\xff\x9a\x02\xff\x02\ +\xb1\xff\xd7\x02\xff\x02\xb2\xffq\x02\xff\x02\xb3\xff\xd7\x02\ +\xff\x02\xb4\xffq\x02\xff\x02\xb5\x00)\x02\xff\x02\xb6\xff\ +\xae\x02\xff\x02\xb8\xff\xae\x02\xff\x02\xba\xff\xae\x02\xff\x02\ +\xbc\xff\xd7\x02\xff\x02\xbe\xff\xae\x02\xff\x02\xc0\xff\x9a\x02\ +\xff\x02\xc2\xff\x9a\x02\xff\x02\xc4\xff\x9a\x02\xff\x02\xc5\xff\ +\x9a\x02\xff\x02\xc6\xffq\x02\xff\x02\xc7\xff\x9a\x02\xff\x02\ +\xc8\xffq\x02\xff\x02\xcb\xff\xd7\x02\xff\x02\xcd\xff\x9a\x02\ +\xff\x02\xce\xff\x9a\x02\xff\x02\xcf\xff\x85\x02\xff\x02\xd1\xff\ +\x9a\x02\xff\x02\xd3\xff\x9a\x02\xff\x02\xd5\xff\x9a\x02\xff\x02\ +\xd7\xff\x9a\x02\xff\x02\xd9\xffq\x02\xff\x02\xdb\xffq\x02\ +\xff\x02\xdd\xffq\x02\xff\x02\xe0\xffq\x02\xff\x02\xe6\xff\ +\xd7\x02\xff\x02\xe8\xff\xd7\x02\xff\x02\xea\xff\xc3\x02\xff\x02\ +\xec\xff\x9a\x02\xff\x02\xee\xff\x9a\x02\xff\x02\xef\xff\xd7\x02\ +\xff\x02\xf0\xffq\x02\xff\x02\xf1\xff\xd7\x02\xff\x02\xf2\xff\ +q\x02\xff\x02\xf3\xff\xd7\x02\xff\x02\xf4\xffq\x02\xff\x02\ +\xf6\xff\xd7\x02\xff\x02\xf8\xff\xae\x02\xff\x02\xfa\xff\xae\x02\ +\xff\x02\xfc\xff\xae\x02\xff\x02\xfe\xff\x9a\x02\xff\x03\x00\xff\ +\x9a\x02\xff\x03\x02\xff\x9a\x02\xff\x03\x06\xff\xd7\x02\xff\x03\ +\x08\xff\xd7\x02\xff\x03\x09\xffq\x02\xff\x03\x0a\xffq\x02\ +\xff\x03\x0b\xffq\x02\xff\x03\x0c\xffq\x02\xff\x03\x0e\xff\ +\x9a\x02\xff\x03\x10\xff\x9a\x02\xff\x03\x11\xff\x9a\x02\xff\x03\ +\x12\xff\x85\x02\xff\x03\x14\xff\x9a\x02\xff\x03\x15\xff\xd7\x02\ +\xff\x03\x16\xffq\x02\xff\x03\x18\xff\xae\x02\xff\x03\x1a\xff\ +q\x02\xff\x03\x1b\xff\x9a\x02\xff\x03\x1c\xff\x85\x03\x00\x00\ +\x0f\xff\x9a\x03\x00\x00\x10\xff\xd7\x03\x00\x00\x11\xff\x9a\x03\ +\x00\x01\xce\xff\xc3\x03\x00\x01\xcf\xff\xec\x03\x00\x01\xd5\xff\ +\xc3\x03\x00\x01\xd8\xff\xec\x03\x00\x01\xdb\xff\xec\x03\x00\x01\ +\xde\xff\xec\x03\x00\x01\xea\xff\xec\x03\x00\x01\xed\xff\xec\x03\ +\x00\x01\xf2\xff\xc3\x03\x00\x02\x02\xff\xd7\x03\x00\x02\x03\xff\ +\xd7\x03\x00\x02\x04\xff\xd7\x03\x00\x02\x08\xff\x9a\x03\x00\x02\ +\x0c\xff\x9a\x03\x00\x02j\xff\xec\x03\x00\x02s\xff\xc3\x03\ +\x00\x02\x7f\xff\xec\x03\x00\x02\x85\xff\xec\x03\x00\x02\x87\xff\ +\xec\x03\x00\x02\x89\xff\xec\x03\x00\x02\x8d\xff\xec\x03\x00\x02\ +\xb2\xff\xec\x03\x00\x02\xb4\xff\xec\x03\x00\x02\xcf\xff\xc3\x03\ +\x00\x02\xe0\xff\xec\x03\x00\x02\xf0\xff\xec\x03\x00\x02\xf2\xff\ +\xec\x03\x00\x02\xf4\xff\xec\x03\x00\x03\x0a\xff\xec\x03\x00\x03\ +\x0c\xff\xec\x03\x00\x03\x12\xff\xc3\x03\x00\x03\x16\xff\xec\x03\ +\x00\x03\x1a\xff\xec\x03\x00\x03\x1c\xff\xc3\x03\x03\x00\x0f\xff\ +\x9a\x03\x03\x00\x10\xff\xd7\x03\x03\x00\x11\xff\x9a\x03\x03\x01\ +\x9d\x00)\x03\x03\x01\x9f\xff\xd7\x03\x03\x01\xa4\xff\xae\x03\ +\x03\x01\xa6\x00)\x03\x03\x01\xaa\xff\x85\x03\x03\x01\xae\xff\ +\xae\x03\x03\x01\xb5\xff\xae\x03\x03\x01\xb8\xff\xd7\x03\x03\x01\ +\xbb\xff\xd7\x03\x03\x01\xbc\x00)\x03\x03\x01\xbe\xff\xc3\x03\ +\x03\x01\xc4\x00)\x03\x03\x01\xcc\xff\xc3\x03\x03\x01\xcd\xff\ +\xc3\x03\x03\x01\xce\xff\x9a\x03\x03\x01\xcf\xff\xae\x03\x03\x01\ +\xd0\xff\xd7\x03\x03\x01\xd1\xff\xd7\x03\x03\x01\xd2\xff\xc3\x03\ +\x03\x01\xd3\xff\xc3\x03\x03\x01\xd4\xff\xc3\x03\x03\x01\xd5\xff\ +\x9a\x03\x03\x01\xd6\xff\xc3\x03\x03\x01\xd7\xff\xc3\x03\x03\x01\ +\xd8\xff\xae\x03\x03\x01\xd9\xff\xc3\x03\x03\x01\xda\xff\xc3\x03\ +\x03\x01\xdb\xff\xae\x03\x03\x01\xde\xff\xae\x03\x03\x01\xdf\xff\ +\xd7\x03\x03\x01\xe0\xff\xc3\x03\x03\x01\xe1\xff\x9a\x03\x03\x01\ +\xe2\xff\xc3\x03\x03\x01\xe3\xff\xc3\x03\x03\x01\xe5\xff\xc3\x03\ +\x03\x01\xe6\xff\xc3\x03\x03\x01\xe7\xff\xd7\x03\x03\x01\xe8\xff\ +\xc3\x03\x03\x01\xea\xff\xae\x03\x03\x01\xeb\x00)\x03\x03\x01\ +\xec\xff\xc3\x03\x03\x01\xed\xff\xae\x03\x03\x01\xee\xff\xc3\x03\ +\x03\x01\xf2\xff\x9a\x03\x03\x01\xf3\xff\xc3\x03\x03\x01\xf4\x00\ +)\x03\x03\x01\xf5\xff\xc3\x03\x03\x01\xf7\xff\xc3\x03\x03\x01\ +\xf9\xff\xc3\x03\x03\x02\x02\xff\xd7\x03\x03\x02\x03\xff\xd7\x03\ +\x03\x02\x04\xff\xd7\x03\x03\x02\x08\xff\x9a\x03\x03\x02\x0c\xff\ +\x9a\x03\x03\x02j\xff\xae\x03\x03\x02k\xff\xc3\x03\x03\x02\ +l\xff\xd7\x03\x03\x02q\xff\xc3\x03\x03\x02r\xff\x85\x03\ +\x03\x02s\xff\x9a\x03\x03\x02u\xff\xc3\x03\x03\x02w\xff\ +\xd7\x03\x03\x02y\xff\xc3\x03\x03\x02}\xff\xc3\x03\x03\x02\ +~\xff\xd7\x03\x03\x02\x7f\xff\xae\x03\x03\x02\x84\xff\xd7\x03\ +\x03\x02\x85\xff\xae\x03\x03\x02\x86\xff\xd7\x03\x03\x02\x87\xff\ +\xae\x03\x03\x02\x88\xff\xd7\x03\x03\x02\x89\xff\xae\x03\x03\x02\ +\x8a\xff\xd7\x03\x03\x02\x8c\xff\xd7\x03\x03\x02\x8d\xff\xae\x03\ +\x03\x02\x96\xff\xc3\x03\x03\x02\x98\x00)\x03\x03\x02\x9a\xff\ +\xc3\x03\x03\x02\x9e\xff\xc3\x03\x03\x02\xa0\xff\xd7\x03\x03\x02\ +\xa2\xff\xd7\x03\x03\x02\xa4\xff\xc3\x03\x03\x02\xa6\xff\xc3\x03\ +\x03\x02\xa8\x00)\x03\x03\x02\xa9\x00)\x03\x03\x02\xac\xff\ +\xc3\x03\x03\x02\xae\xff\xc3\x03\x03\x02\xb0\xff\xc3\x03\x03\x02\ +\xb1\xff\xd7\x03\x03\x02\xb2\xff\xae\x03\x03\x02\xb3\xff\xd7\x03\ +\x03\x02\xb4\xff\xae\x03\x03\x02\xb5\x00)\x03\x03\x02\xbc\xff\ +\xd7\x03\x03\x02\xbd\x00)\x03\x03\x02\xc0\xff\x9a\x03\x03\x02\ +\xc2\xff\x9a\x03\x03\x02\xc4\xff\xc3\x03\x03\x02\xc5\xff\xd7\x03\ +\x03\x02\xc6\xff\xc3\x03\x03\x02\xc7\xff\xd7\x03\x03\x02\xc8\xff\ +\xc3\x03\x03\x02\xcb\xff\xd7\x03\x03\x02\xcd\xff\xc3\x03\x03\x02\ +\xce\xff\xae\x03\x03\x02\xcf\xff\x9a\x03\x03\x02\xd1\xff\xc3\x03\ +\x03\x02\xd3\xff\xc3\x03\x03\x02\xd5\xff\x9a\x03\x03\x02\xd7\xff\ +\xc3\x03\x03\x02\xd9\xff\x85\x03\x03\x02\xdb\xff\x85\x03\x03\x02\ +\xdd\xff\x85\x03\x03\x02\xe0\xff\xae\x03\x03\x02\xe6\xff\xd7\x03\ +\x03\x02\xe8\xff\xd7\x03\x03\x02\xec\xff\xc3\x03\x03\x02\xee\xff\ +\xc3\x03\x03\x02\xef\xff\xd7\x03\x03\x02\xf0\xff\xae\x03\x03\x02\ +\xf1\xff\xd7\x03\x03\x02\xf2\xff\xae\x03\x03\x02\xf3\xff\xd7\x03\ +\x03\x02\xf4\xff\xae\x03\x03\x02\xf6\xff\xd7\x03\x03\x02\xfe\xff\ +\x9a\x03\x03\x03\x00\xff\xc3\x03\x03\x03\x02\xff\xc3\x03\x03\x03\ +\x06\xff\xd7\x03\x03\x03\x08\xff\xd7\x03\x03\x03\x09\xff\x9a\x03\ +\x03\x03\x0a\xff\xae\x03\x03\x03\x0b\xff\x9a\x03\x03\x03\x0c\xff\ +\xae\x03\x03\x03\x0e\xff\xd7\x03\x03\x03\x10\xff\xd7\x03\x03\x03\ +\x11\xff\xae\x03\x03\x03\x12\xff\x9a\x03\x03\x03\x14\xff\xc3\x03\ +\x03\x03\x15\xff\xd7\x03\x03\x03\x16\xff\xae\x03\x03\x03\x17\x00\ +)\x03\x03\x03\x1a\xff\xae\x03\x03\x03\x1b\xff\xae\x03\x03\x03\ +\x1c\xff\x9a\x03\x04\x00\x0f\xff\xc3\x03\x04\x00\x11\xff\xc3\x03\ +\x04\x01\xce\xff\xc3\x03\x04\x01\xcf\xff\xd7\x03\x04\x01\xd5\xff\ +\xc3\x03\x04\x01\xd8\xff\xd7\x03\x04\x01\xdb\xff\xd7\x03\x04\x01\ +\xde\xff\xd7\x03\x04\x01\xea\xff\xd7\x03\x04\x01\xed\xff\xd7\x03\ +\x04\x01\xf2\xff\xc3\x03\x04\x02\x08\xff\xc3\x03\x04\x02\x0c\xff\ +\xc3\x03\x04\x02j\xff\xd7\x03\x04\x02s\xff\xc3\x03\x04\x02\ +\x7f\xff\xd7\x03\x04\x02\x85\xff\xd7\x03\x04\x02\x87\xff\xd7\x03\ +\x04\x02\x89\xff\xd7\x03\x04\x02\x8d\xff\xd7\x03\x04\x02\xb2\xff\ +\xd7\x03\x04\x02\xb4\xff\xd7\x03\x04\x02\xcf\xff\xc3\x03\x04\x02\ +\xe0\xff\xd7\x03\x04\x02\xf0\xff\xd7\x03\x04\x02\xf2\xff\xd7\x03\ +\x04\x02\xf4\xff\xd7\x03\x04\x03\x0a\xff\xd7\x03\x04\x03\x0c\xff\ +\xd7\x03\x04\x03\x12\xff\xc3\x03\x04\x03\x16\xff\xd7\x03\x04\x03\ +\x1a\xff\xd7\x03\x04\x03\x1c\xff\xc3\x03\x05\x01\x9f\xff\xd7\x03\ +\x05\x01\xa3\x00\xe1\x03\x05\x01\xb8\xff\xd7\x03\x05\x01\xbb\xff\ +\xd7\x03\x05\x01\xbe\xff\xc3\x03\x05\x01\xdc\xff\xd7\x03\x05\x01\ +\xe1\xff\xae\x03\x05\x01\xe4\xff\xd7\x03\x05\x02l\xff\xd7\x03\ +\x05\x02{\x00=\x03\x05\x02}\xff\xec\x03\x05\x02~\xff\ +\xd7\x03\x05\x02\x84\xff\xd7\x03\x05\x02\x86\xff\xd7\x03\x05\x02\ +\x88\xff\xd7\x03\x05\x02\x8a\xff\xd7\x03\x05\x02\x8c\xff\xd7\x03\ +\x05\x02\xaa\xff\xd7\x03\x05\x02\xb1\xff\xd7\x03\x05\x02\xb3\xff\ +\xd7\x03\x05\x02\xb6\xff\xd7\x03\x05\x02\xbe\xff\xd7\x03\x05\x02\ +\xc0\xff\xae\x03\x05\x02\xc2\xff\xae\x03\x05\x02\xc5\xff\xc3\x03\ +\x05\x02\xc6\xff\xd7\x03\x05\x02\xc7\xff\xc3\x03\x05\x02\xc8\xff\ +\xd7\x03\x05\x02\xd5\xff\xae\x03\x05\x02\xef\xff\xd7\x03\x05\x02\ +\xf1\xff\xd7\x03\x05\x02\xf3\xff\xd7\x03\x05\x02\xfe\xff\xae\x03\ +\x05\x03\x0e\xff\xd7\x03\x05\x03\x10\xff\xd7\x03\x05\x03\x15\xff\ +\xd7\x03\x05\x03\x18\xff\xd7\x03\x06\x01\xcf\xff\xec\x03\x06\x01\ +\xd8\xff\xec\x03\x06\x01\xdb\xff\xec\x03\x06\x01\xde\xff\xec\x03\ +\x06\x01\xe1\xff\xec\x03\x06\x01\xea\xff\xec\x03\x06\x01\xed\xff\ +\xec\x03\x06\x02j\xff\xec\x03\x06\x02\x7f\xff\xec\x03\x06\x02\ +\x85\xff\xec\x03\x06\x02\x87\xff\xec\x03\x06\x02\x89\xff\xec\x03\ +\x06\x02\x8d\xff\xec\x03\x06\x02\xb2\xff\xec\x03\x06\x02\xb4\xff\ +\xec\x03\x06\x02\xc0\xff\xec\x03\x06\x02\xc2\xff\xec\x03\x06\x02\ +\xd5\xff\xec\x03\x06\x02\xe0\xff\xec\x03\x06\x02\xf0\xff\xec\x03\ +\x06\x02\xf2\xff\xec\x03\x06\x02\xf4\xff\xec\x03\x06\x02\xfe\xff\ +\xec\x03\x06\x03\x0a\xff\xec\x03\x06\x03\x0c\xff\xec\x03\x06\x03\ +\x0e\xff\xd7\x03\x06\x03\x10\xff\xd7\x03\x06\x03\x16\xff\xec\x03\ +\x06\x03\x1a\xff\xec\x03\x07\x01\x9f\xff\xd7\x03\x07\x01\xb8\xff\ +\xd7\x03\x07\x01\xbb\xff\xd7\x03\x07\x01\xbe\xff\xd7\x03\x07\x01\ +\xc1\xff\xd7\x03\x07\x01\xe1\xff\xd7\x03\x07\x02l\xff\xd7\x03\ +\x07\x02|\xff\xd7\x03\x07\x02~\xff\xd7\x03\x07\x02\x84\xff\ +\xd7\x03\x07\x02\x86\xff\xd7\x03\x07\x02\x88\xff\xd7\x03\x07\x02\ +\x8a\xff\xd7\x03\x07\x02\x8c\xff\xd7\x03\x07\x02\xb1\xff\xd7\x03\ +\x07\x02\xb3\xff\xd7\x03\x07\x02\xbf\xff\xd7\x03\x07\x02\xc0\xff\ +\xd7\x03\x07\x02\xc1\xff\xd7\x03\x07\x02\xc2\xff\xd7\x03\x07\x02\ +\xc5\xff\x9a\x03\x07\x02\xc7\xff\x9a\x03\x07\x02\xd4\xff\xd7\x03\ +\x07\x02\xd5\xff\xd7\x03\x07\x02\xef\xff\xd7\x03\x07\x02\xf1\xff\ +\xd7\x03\x07\x02\xf3\xff\xd7\x03\x07\x02\xfd\xff\xd7\x03\x07\x02\ +\xfe\xff\xd7\x03\x07\x03\x09\xff\xd7\x03\x07\x03\x0b\xff\xd7\x03\ +\x07\x03\x0e\xff\xd7\x03\x07\x03\x10\xff\xd7\x03\x07\x03\x15\xff\ +\xd7\x03\x07\x03\x19\xff\xec\x03\x08\x01\xcf\xff\xec\x03\x08\x01\ +\xd8\xff\xec\x03\x08\x01\xdb\xff\xec\x03\x08\x01\xde\xff\xec\x03\ +\x08\x01\xe1\xff\xec\x03\x08\x01\xea\xff\xec\x03\x08\x01\xed\xff\ +\xec\x03\x08\x02j\xff\xec\x03\x08\x02\x7f\xff\xec\x03\x08\x02\ +\x85\xff\xec\x03\x08\x02\x87\xff\xec\x03\x08\x02\x89\xff\xec\x03\ +\x08\x02\x8d\xff\xec\x03\x08\x02\xb2\xff\xec\x03\x08\x02\xb4\xff\ +\xec\x03\x08\x02\xc0\xff\xec\x03\x08\x02\xc2\xff\xec\x03\x08\x02\ +\xd5\xff\xec\x03\x08\x02\xe0\xff\xec\x03\x08\x02\xf0\xff\xec\x03\ +\x08\x02\xf2\xff\xec\x03\x08\x02\xf4\xff\xec\x03\x08\x02\xfe\xff\ +\xec\x03\x08\x03\x0a\xff\xec\x03\x08\x03\x0c\xff\xec\x03\x08\x03\ +\x0e\xff\xd7\x03\x08\x03\x10\xff\xd7\x03\x08\x03\x16\xff\xec\x03\ +\x08\x03\x1a\xff\xec\x03\x0b\x00\x05\xff\x9a\x03\x0b\x00\x0a\xff\ +\x9a\x03\x0b\x01\x9d\xff\xae\x03\x0b\x01\xa6\xff\xae\x03\x0b\x01\ +\xa8\xff\xc3\x03\x0b\x01\xaa\xff\xc3\x03\x0b\x01\xb0\xff\xc3\x03\ +\x0b\x01\xbc\xffq\x03\x0b\x01\xbd\xff\xc3\x03\x0b\x01\xbf\xff\ +\xc3\x03\x0b\x01\xc1\xff\xc3\x03\x0b\x01\xc4\xff\xae\x03\x0b\x01\ +\xd0\xff\xd7\x03\x0b\x01\xdc\xff\xc3\x03\x0b\x01\xdf\xff\xd7\x03\ +\x0b\x01\xe1\xff\xd7\x03\x0b\x01\xe4\xff\xc3\x03\x0b\x02\x07\xff\ +\x9a\x03\x0b\x02\x0b\xff\x9a\x03\x0b\x02r\xff\xc3\x03\x0b\x02\ +v\xff\xd7\x03\x0b\x02|\xff\xc3\x03\x0b\x02\x80\xff\xc3\x03\ +\x0b\x02\x82\xff\xc3\x03\x0b\x02\x9f\xff\xc3\x03\x0b\x02\xa0\xff\ +\xd7\x03\x0b\x02\xa9\xff\xae\x03\x0b\x02\xaa\xff\xc3\x03\x0b\x02\ +\xb5\xffq\x03\x0b\x02\xb6\xff\xc3\x03\x0b\x02\xb7\xff\xc3\x03\ +\x0b\x02\xb9\xff\xc3\x03\x0b\x02\xbb\xff\xc3\x03\x0b\x02\xbc\xff\ +\xd7\x03\x0b\x02\xbd\xff\xae\x03\x0b\x02\xbe\xff\xc3\x03\x0b\x02\ +\xbf\xff\xc3\x03\x0b\x02\xc0\xff\xd7\x03\x0b\x02\xc1\xff\xc3\x03\ +\x0b\x02\xc2\xff\xd7\x03\x0b\x02\xca\xff\xc3\x03\x0b\x02\xcb\xff\ +\xd7\x03\x0b\x02\xd4\xff\xc3\x03\x0b\x02\xd5\xff\xd7\x03\x0b\x02\ +\xd9\xff\xc3\x03\x0b\x02\xdb\xff\xc3\x03\x0b\x02\xdd\xff\xc3\x03\ +\x0b\x02\xe5\xff\xc3\x03\x0b\x02\xe6\xff\xd7\x03\x0b\x02\xf7\xff\ +\xc3\x03\x0b\x02\xf9\xff\xc3\x03\x0b\x02\xfb\xff\xc3\x03\x0b\x02\ +\xfd\xff\xc3\x03\x0b\x02\xfe\xff\xd7\x03\x0b\x03\x05\xff\xc3\x03\ +\x0b\x03\x06\xff\xd7\x03\x0b\x03\x07\xff\xc3\x03\x0b\x03\x08\xff\ +\xd7\x03\x0b\x03\x0d\xff\xd7\x03\x0b\x03\x0e\xff\xd7\x03\x0b\x03\ +\x0f\xff\xd7\x03\x0b\x03\x10\xff\xd7\x03\x0b\x03\x17\xff\xae\x03\ +\x0b\x03\x18\xff\xc3\x03\x0c\x00\x05\xff\x9a\x03\x0c\x00\x0a\xff\ +\x9a\x03\x0c\x01\xd0\xff\xd7\x03\x0c\x01\xdc\xff\xc3\x03\x0c\x01\ +\xdd\xff\xd7\x03\x0c\x01\xdf\xff\xd7\x03\x0c\x01\xe1\xff\xd7\x03\ +\x0c\x01\xe4\xff\xc3\x03\x0c\x01\xf6\xff\xd7\x03\x0c\x02\x07\xff\ +\x9a\x03\x0c\x02\x0b\xff\x9a\x03\x0c\x02\xa0\xff\xd7\x03\x0c\x02\ +\xaa\xff\xc3\x03\x0c\x02\xb6\xff\xc3\x03\x0c\x02\xbc\xff\xd7\x03\ +\x0c\x02\xbe\xff\xc3\x03\x0c\x02\xc0\xff\xd7\x03\x0c\x02\xc2\xff\ +\xd7\x03\x0c\x02\xcb\xff\xd7\x03\x0c\x02\xd5\xff\xd7\x03\x0c\x02\ +\xe6\xff\xd7\x03\x0c\x02\xf8\xff\xd7\x03\x0c\x02\xfa\xff\xd7\x03\ +\x0c\x02\xfc\xff\xd7\x03\x0c\x02\xfe\xff\xd7\x03\x0c\x03\x06\xff\ +\xd7\x03\x0c\x03\x08\xff\xd7\x03\x0c\x03\x0e\xff\x9a\x03\x0c\x03\ +\x10\xff\x9a\x03\x0c\x03\x18\xff\xc3\x03\x0d\x00\x05\xff\x9a\x03\ +\x0d\x00\x0a\xff\x9a\x03\x0d\x01\x9d\xff\xae\x03\x0d\x01\xa6\xff\ +\xae\x03\x0d\x01\xa8\xff\xc3\x03\x0d\x01\xaa\xff\xc3\x03\x0d\x01\ +\xb0\xff\xc3\x03\x0d\x01\xbc\xffq\x03\x0d\x01\xbd\xff\xc3\x03\ +\x0d\x01\xbf\xff\xc3\x03\x0d\x01\xc1\xff\xc3\x03\x0d\x01\xc4\xff\ +\xae\x03\x0d\x01\xd0\xff\xd7\x03\x0d\x01\xdc\xff\xc3\x03\x0d\x01\ +\xdf\xff\xd7\x03\x0d\x01\xe1\xff\xd7\x03\x0d\x01\xe4\xff\xc3\x03\ +\x0d\x02\x07\xff\x9a\x03\x0d\x02\x0b\xff\x9a\x03\x0d\x02r\xff\ +\xc3\x03\x0d\x02v\xff\xd7\x03\x0d\x02|\xff\xc3\x03\x0d\x02\ +\x80\xff\xc3\x03\x0d\x02\x82\xff\xc3\x03\x0d\x02\x9f\xff\xc3\x03\ +\x0d\x02\xa0\xff\xd7\x03\x0d\x02\xa9\xff\xae\x03\x0d\x02\xaa\xff\ +\xc3\x03\x0d\x02\xb5\xffq\x03\x0d\x02\xb6\xff\xc3\x03\x0d\x02\ +\xb7\xff\xc3\x03\x0d\x02\xb9\xff\xc3\x03\x0d\x02\xbb\xff\xc3\x03\ +\x0d\x02\xbc\xff\xd7\x03\x0d\x02\xbd\xff\xae\x03\x0d\x02\xbe\xff\ +\xc3\x03\x0d\x02\xbf\xff\xc3\x03\x0d\x02\xc0\xff\xd7\x03\x0d\x02\ +\xc1\xff\xc3\x03\x0d\x02\xc2\xff\xd7\x03\x0d\x02\xca\xff\xc3\x03\ +\x0d\x02\xcb\xff\xd7\x03\x0d\x02\xd4\xff\xc3\x03\x0d\x02\xd5\xff\ +\xd7\x03\x0d\x02\xd9\xff\xc3\x03\x0d\x02\xdb\xff\xc3\x03\x0d\x02\ +\xdd\xff\xc3\x03\x0d\x02\xe5\xff\xc3\x03\x0d\x02\xe6\xff\xd7\x03\ +\x0d\x02\xf7\xff\xc3\x03\x0d\x02\xf9\xff\xc3\x03\x0d\x02\xfb\xff\ +\xc3\x03\x0d\x02\xfd\xff\xc3\x03\x0d\x02\xfe\xff\xd7\x03\x0d\x03\ +\x05\xff\xc3\x03\x0d\x03\x06\xff\xd7\x03\x0d\x03\x07\xff\xc3\x03\ +\x0d\x03\x08\xff\xd7\x03\x0d\x03\x0d\xff\xd7\x03\x0d\x03\x0e\xff\ +\xd7\x03\x0d\x03\x0f\xff\xd7\x03\x0d\x03\x10\xff\xd7\x03\x0d\x03\ +\x17\xff\xae\x03\x0d\x03\x18\xff\xc3\x03\x0e\x00\x05\xff\x9a\x03\ +\x0e\x00\x0a\xff\x9a\x03\x0e\x01\xd0\xff\xd7\x03\x0e\x01\xdc\xff\ +\xc3\x03\x0e\x01\xdd\xff\xd7\x03\x0e\x01\xdf\xff\xd7\x03\x0e\x01\ +\xe1\xff\xd7\x03\x0e\x01\xe4\xff\xc3\x03\x0e\x01\xf6\xff\xd7\x03\ +\x0e\x02\x07\xff\x9a\x03\x0e\x02\x0b\xff\x9a\x03\x0e\x02\xa0\xff\ +\xd7\x03\x0e\x02\xaa\xff\xc3\x03\x0e\x02\xb6\xff\xc3\x03\x0e\x02\ +\xbc\xff\xd7\x03\x0e\x02\xbe\xff\xc3\x03\x0e\x02\xc0\xff\xd7\x03\ +\x0e\x02\xc2\xff\xd7\x03\x0e\x02\xcb\xff\xd7\x03\x0e\x02\xd5\xff\ +\xd7\x03\x0e\x02\xe6\xff\xd7\x03\x0e\x02\xf8\xff\xd7\x03\x0e\x02\ +\xfa\xff\xd7\x03\x0e\x02\xfc\xff\xd7\x03\x0e\x02\xfe\xff\xd7\x03\ +\x0e\x03\x06\xff\xd7\x03\x0e\x03\x08\xff\xd7\x03\x0e\x03\x0e\xff\ +\x9a\x03\x0e\x03\x10\xff\x9a\x03\x0e\x03\x18\xff\xc3\x03\x0f\x01\ +\xa3\x00\xe1\x03\x0f\x02\xea\x00)\x03\x0f\x03\x0e\xff\xd7\x03\ +\x0f\x03\x10\xff\xd7\x03\x10\x00\x05\xff\xec\x03\x10\x00\x0a\xff\ +\xec\x03\x10\x02\x07\xff\xec\x03\x10\x02\x0b\xff\xec\x03\x11\x00\ +\x05\xff\x9a\x03\x11\x00\x0a\xff\x9a\x03\x11\x01\x9d\xff\xae\x03\ +\x11\x01\xa6\xff\xae\x03\x11\x01\xa8\xff\xc3\x03\x11\x01\xaa\xff\ +\xc3\x03\x11\x01\xb0\xff\xc3\x03\x11\x01\xbc\xffq\x03\x11\x01\ +\xbd\xff\xc3\x03\x11\x01\xbf\xff\xc3\x03\x11\x01\xc1\xff\xc3\x03\ +\x11\x01\xc4\xff\xae\x03\x11\x01\xd0\xff\xd7\x03\x11\x01\xdc\xff\ +\xc3\x03\x11\x01\xdf\xff\xd7\x03\x11\x01\xe1\xff\xd7\x03\x11\x01\ +\xe4\xff\xc3\x03\x11\x02\x07\xff\x9a\x03\x11\x02\x0b\xff\x9a\x03\ +\x11\x02r\xff\xc3\x03\x11\x02v\xff\xd7\x03\x11\x02|\xff\ +\xc3\x03\x11\x02\x80\xff\xc3\x03\x11\x02\x82\xff\xc3\x03\x11\x02\ +\x9f\xff\xc3\x03\x11\x02\xa0\xff\xd7\x03\x11\x02\xa9\xff\xae\x03\ +\x11\x02\xaa\xff\xc3\x03\x11\x02\xb5\xffq\x03\x11\x02\xb6\xff\ +\xc3\x03\x11\x02\xb7\xff\xc3\x03\x11\x02\xb9\xff\xc3\x03\x11\x02\ +\xbb\xff\xc3\x03\x11\x02\xbc\xff\xd7\x03\x11\x02\xbd\xff\xae\x03\ +\x11\x02\xbe\xff\xc3\x03\x11\x02\xbf\xff\xc3\x03\x11\x02\xc0\xff\ +\xd7\x03\x11\x02\xc1\xff\xc3\x03\x11\x02\xc2\xff\xd7\x03\x11\x02\ +\xca\xff\xc3\x03\x11\x02\xcb\xff\xd7\x03\x11\x02\xd4\xff\xc3\x03\ +\x11\x02\xd5\xff\xd7\x03\x11\x02\xd9\xff\xc3\x03\x11\x02\xdb\xff\ +\xc3\x03\x11\x02\xdd\xff\xc3\x03\x11\x02\xe5\xff\xc3\x03\x11\x02\ +\xe6\xff\xd7\x03\x11\x02\xf7\xff\xc3\x03\x11\x02\xf9\xff\xc3\x03\ +\x11\x02\xfb\xff\xc3\x03\x11\x02\xfd\xff\xc3\x03\x11\x02\xfe\xff\ +\xd7\x03\x11\x03\x05\xff\xc3\x03\x11\x03\x06\xff\xd7\x03\x11\x03\ +\x07\xff\xc3\x03\x11\x03\x08\xff\xd7\x03\x11\x03\x0d\xff\xd7\x03\ +\x11\x03\x0e\xff\xd7\x03\x11\x03\x0f\xff\xd7\x03\x11\x03\x10\xff\ +\xd7\x03\x11\x03\x17\xff\xae\x03\x11\x03\x18\xff\xc3\x03\x12\x00\ +\x05\xff\x9a\x03\x12\x00\x0a\xff\x9a\x03\x12\x01\xd0\xff\xd7\x03\ +\x12\x01\xdc\xff\xc3\x03\x12\x01\xdd\xff\xd7\x03\x12\x01\xdf\xff\ +\xd7\x03\x12\x01\xe1\xff\xd7\x03\x12\x01\xe4\xff\xc3\x03\x12\x01\ +\xf6\xff\xd7\x03\x12\x02\x07\xff\x9a\x03\x12\x02\x0b\xff\x9a\x03\ +\x12\x02\xa0\xff\xd7\x03\x12\x02\xaa\xff\xc3\x03\x12\x02\xb6\xff\ +\xc3\x03\x12\x02\xbc\xff\xd7\x03\x12\x02\xbe\xff\xc3\x03\x12\x02\ +\xc0\xff\xd7\x03\x12\x02\xc2\xff\xd7\x03\x12\x02\xcb\xff\xd7\x03\ +\x12\x02\xd5\xff\xd7\x03\x12\x02\xe6\xff\xd7\x03\x12\x02\xf8\xff\ +\xd7\x03\x12\x02\xfa\xff\xd7\x03\x12\x02\xfc\xff\xd7\x03\x12\x02\ +\xfe\xff\xd7\x03\x12\x03\x06\xff\xd7\x03\x12\x03\x08\xff\xd7\x03\ +\x12\x03\x0e\xff\x9a\x03\x12\x03\x10\xff\x9a\x03\x12\x03\x18\xff\ +\xc3\x03\x13\x00\x05\xff\x9a\x03\x13\x00\x0a\xff\x9a\x03\x13\x01\ +\x9d\xff\xae\x03\x13\x01\xa6\xff\xae\x03\x13\x01\xa8\xff\xc3\x03\ +\x13\x01\xaa\xff\xc3\x03\x13\x01\xb0\xff\xc3\x03\x13\x01\xbc\xff\ +q\x03\x13\x01\xbd\xff\xc3\x03\x13\x01\xbf\xff\xc3\x03\x13\x01\ +\xc1\xff\xc3\x03\x13\x01\xc4\xff\xae\x03\x13\x01\xd0\xff\xd7\x03\ +\x13\x01\xdc\xff\xc3\x03\x13\x01\xdf\xff\xd7\x03\x13\x01\xe1\xff\ +\xd7\x03\x13\x01\xe4\xff\xc3\x03\x13\x02\x07\xff\x9a\x03\x13\x02\ +\x0b\xff\x9a\x03\x13\x02r\xff\xc3\x03\x13\x02v\xff\xd7\x03\ +\x13\x02|\xff\xc3\x03\x13\x02\x80\xff\xc3\x03\x13\x02\x82\xff\ +\xc3\x03\x13\x02\x9f\xff\xc3\x03\x13\x02\xa0\xff\xd7\x03\x13\x02\ +\xa9\xff\xae\x03\x13\x02\xaa\xff\xc3\x03\x13\x02\xb5\xffq\x03\ +\x13\x02\xb6\xff\xc3\x03\x13\x02\xb7\xff\xc3\x03\x13\x02\xb9\xff\ +\xc3\x03\x13\x02\xbb\xff\xc3\x03\x13\x02\xbc\xff\xd7\x03\x13\x02\ +\xbd\xff\xae\x03\x13\x02\xbe\xff\xc3\x03\x13\x02\xbf\xff\xc3\x03\ +\x13\x02\xc0\xff\xd7\x03\x13\x02\xc1\xff\xc3\x03\x13\x02\xc2\xff\ +\xd7\x03\x13\x02\xca\xff\xc3\x03\x13\x02\xcb\xff\xd7\x03\x13\x02\ +\xd4\xff\xc3\x03\x13\x02\xd5\xff\xd7\x03\x13\x02\xd9\xff\xc3\x03\ +\x13\x02\xdb\xff\xc3\x03\x13\x02\xdd\xff\xc3\x03\x13\x02\xe5\xff\ +\xc3\x03\x13\x02\xe6\xff\xd7\x03\x13\x02\xf7\xff\xc3\x03\x13\x02\ +\xf9\xff\xc3\x03\x13\x02\xfb\xff\xc3\x03\x13\x02\xfd\xff\xc3\x03\ +\x13\x02\xfe\xff\xd7\x03\x13\x03\x05\xff\xc3\x03\x13\x03\x06\xff\ +\xd7\x03\x13\x03\x07\xff\xc3\x03\x13\x03\x08\xff\xd7\x03\x13\x03\ +\x0d\xff\xd7\x03\x13\x03\x0e\xff\xd7\x03\x13\x03\x0f\xff\xd7\x03\ +\x13\x03\x10\xff\xd7\x03\x13\x03\x17\xff\xae\x03\x13\x03\x18\xff\ +\xc3\x03\x14\x00\x05\xff\x9a\x03\x14\x00\x0a\xff\x9a\x03\x14\x01\ +\xd0\xff\xd7\x03\x14\x01\xdc\xff\xc3\x03\x14\x01\xdd\xff\xd7\x03\ +\x14\x01\xdf\xff\xd7\x03\x14\x01\xe1\xff\xd7\x03\x14\x01\xe4\xff\ +\xc3\x03\x14\x01\xf6\xff\xd7\x03\x14\x02\x07\xff\x9a\x03\x14\x02\ +\x0b\xff\x9a\x03\x14\x02\xa0\xff\xd7\x03\x14\x02\xaa\xff\xc3\x03\ +\x14\x02\xb6\xff\xc3\x03\x14\x02\xbc\xff\xd7\x03\x14\x02\xbe\xff\ +\xc3\x03\x14\x02\xc0\xff\xd7\x03\x14\x02\xc2\xff\xd7\x03\x14\x02\ +\xcb\xff\xd7\x03\x14\x02\xd5\xff\xd7\x03\x14\x02\xe6\xff\xd7\x03\ +\x14\x02\xf8\xff\xd7\x03\x14\x02\xfa\xff\xd7\x03\x14\x02\xfc\xff\ +\xd7\x03\x14\x02\xfe\xff\xd7\x03\x14\x03\x06\xff\xd7\x03\x14\x03\ +\x08\xff\xd7\x03\x14\x03\x0e\xff\x9a\x03\x14\x03\x10\xff\x9a\x03\ +\x14\x03\x18\xff\xc3\x03\x15\x00\x0f\xff\xae\x03\x15\x00\x11\xff\ +\xae\x03\x15\x01\xaa\xff\xec\x03\x15\x01\xb0\xff\xd7\x03\x15\x01\ +\xbc\xff\xd7\x03\x15\x01\xbf\xff\xd7\x03\x15\x02\x08\xff\xae\x03\ +\x15\x02\x0c\xff\xae\x03\x15\x02r\xff\xec\x03\x15\x02\x80\xff\ +\xec\x03\x15\x02\x82\xff\xec\x03\x15\x02\x9f\xff\xd7\x03\x15\x02\ +\xb5\xff\xd7\x03\x15\x02\xb7\xff\xec\x03\x15\x02\xb9\xff\xec\x03\ +\x15\x02\xbb\xff\xd7\x03\x15\x02\xca\xff\xd7\x03\x15\x02\xd9\xff\ +\xec\x03\x15\x02\xdb\xff\xec\x03\x15\x02\xdd\xff\xec\x03\x15\x02\ +\xe5\xff\xd7\x03\x15\x03\x05\xff\xd7\x03\x15\x03\x07\xff\xd7\x03\ +\x16\x00\x05\xff\xd7\x03\x16\x00\x0a\xff\xd7\x03\x16\x01\xd0\xff\ +\xec\x03\x16\x01\xdd\xff\xec\x03\x16\x01\xdf\xff\xec\x03\x16\x01\ +\xf6\xff\xec\x03\x16\x02\x07\xff\xd7\x03\x16\x02\x0b\xff\xd7\x03\ +\x16\x02\xa0\xff\xec\x03\x16\x02\xbc\xff\xec\x03\x16\x02\xcb\xff\ +\xec\x03\x16\x02\xe6\xff\xec\x03\x16\x02\xf8\xff\xec\x03\x16\x02\ +\xfa\xff\xec\x03\x16\x02\xfc\xff\xec\x03\x16\x03\x06\xff\xec\x03\ +\x16\x03\x08\xff\xec\x03\x16\x03\x0e\xff\xd7\x03\x16\x03\x10\xff\ +\xd7\x03\x17\x00\x05\xff\xae\x03\x17\x00\x0a\xff\xae\x03\x17\x01\ +\x9d\xff\xc3\x03\x17\x01\xa6\xff\xc3\x03\x17\x01\xaa\xff\xd7\x03\ +\x17\x01\xb0\xff\xd7\x03\x17\x01\xbc\xff\xc3\x03\x17\x01\xbf\xff\ +\xd7\x03\x17\x01\xc1\xff\xd7\x03\x17\x01\xc4\xff\xc3\x03\x17\x01\ +\xdc\xff\xd7\x03\x17\x01\xe4\xff\xd7\x03\x17\x02\x07\xff\xae\x03\ +\x17\x02\x0b\xff\xae\x03\x17\x02r\xff\xd7\x03\x17\x02|\xff\ +\xd7\x03\x17\x02\x80\xff\xd7\x03\x17\x02\x82\xff\xd7\x03\x17\x02\ +\x9f\xff\xd7\x03\x17\x02\xa9\xff\xc3\x03\x17\x02\xaa\xff\xd7\x03\ +\x17\x02\xb5\xff\xc3\x03\x17\x02\xb6\xff\xd7\x03\x17\x02\xb7\xff\ +\xd7\x03\x17\x02\xb9\xff\xd7\x03\x17\x02\xbb\xff\xd7\x03\x17\x02\ +\xbd\xff\xc3\x03\x17\x02\xbe\xff\xd7\x03\x17\x02\xbf\xff\xd7\x03\ +\x17\x02\xc1\xff\xd7\x03\x17\x02\xca\xff\xd7\x03\x17\x02\xd4\xff\ +\xd7\x03\x17\x02\xd9\xff\xd7\x03\x17\x02\xdb\xff\xd7\x03\x17\x02\ +\xdd\xff\xd7\x03\x17\x02\xe5\xff\xd7\x03\x17\x02\xfd\xff\xd7\x03\ +\x17\x03\x05\xff\xd7\x03\x17\x03\x07\xff\xd7\x03\x17\x03\x0d\xff\ +\xd7\x03\x17\x03\x0f\xff\xd7\x03\x17\x03\x17\xff\xc3\x03\x17\x03\ +\x18\xff\xd7\x03\x18\x00\x05\xff\x9a\x03\x18\x00\x0a\xff\x9a\x03\ +\x18\x01\xd0\xff\xd7\x03\x18\x01\xdc\xff\xc3\x03\x18\x01\xdd\xff\ +\xd7\x03\x18\x01\xdf\xff\xd7\x03\x18\x01\xe1\xff\xd7\x03\x18\x01\ +\xe4\xff\xc3\x03\x18\x01\xf6\xff\xd7\x03\x18\x02\x07\xff\x9a\x03\ +\x18\x02\x0b\xff\x9a\x03\x18\x02\xa0\xff\xd7\x03\x18\x02\xaa\xff\ +\xc3\x03\x18\x02\xb6\xff\xc3\x03\x18\x02\xbc\xff\xd7\x03\x18\x02\ +\xbe\xff\xc3\x03\x18\x02\xc0\xff\xd7\x03\x18\x02\xc2\xff\xd7\x03\ +\x18\x02\xcb\xff\xd7\x03\x18\x02\xd5\xff\xd7\x03\x18\x02\xe6\xff\ +\xd7\x03\x18\x02\xf8\xff\xd7\x03\x18\x02\xfa\xff\xd7\x03\x18\x02\ +\xfc\xff\xd7\x03\x18\x02\xfe\xff\xd7\x03\x18\x03\x06\xff\xd7\x03\ +\x18\x03\x08\xff\xd7\x03\x18\x03\x0e\xff\x9a\x03\x18\x03\x10\xff\ +\x9a\x03\x18\x03\x18\xff\xc3\x03\x19\x01\xe1\xff\xd7\x03\x19\x02\ +\xc0\xff\xd7\x03\x19\x02\xc2\xff\xd7\x03\x19\x02\xd5\xff\xd7\x03\ +\x19\x02\xfe\xff\xd7\x03\x1b\x01\xa3\x00\xe1\x03\x1b\x02\xea\x00\ +)\x03\x1b\x03\x0e\xff\xd7\x03\x1b\x03\x10\xff\xd7\x03\x1c\x00\ +\x05\xff\xec\x03\x1c\x00\x0a\xff\xec\x03\x1c\x02\x07\xff\xec\x03\ +\x1c\x02\x0b\xff\xec\x03\x1d\x00\x05\xffq\x03\x1d\x00\x0a\xff\ +q\x03\x1d\x00&\xff\xd7\x03\x1d\x00*\xff\xd7\x03\x1d\x00\ +-\x01\x0a\x03\x1d\x002\xff\xd7\x03\x1d\x004\xff\xd7\x03\ +\x1d\x007\xffq\x03\x1d\x009\xff\xae\x03\x1d\x00:\xff\ +\xae\x03\x1d\x00<\xff\x85\x03\x1d\x00\x89\xff\xd7\x03\x1d\x00\ +\x94\xff\xd7\x03\x1d\x00\x95\xff\xd7\x03\x1d\x00\x96\xff\xd7\x03\ +\x1d\x00\x97\xff\xd7\x03\x1d\x00\x98\xff\xd7\x03\x1d\x00\x9a\xff\ +\xd7\x03\x1d\x00\x9f\xff\x85\x03\x1d\x00\xc8\xff\xd7\x03\x1d\x00\ +\xca\xff\xd7\x03\x1d\x00\xcc\xff\xd7\x03\x1d\x00\xce\xff\xd7\x03\ +\x1d\x00\xde\xff\xd7\x03\x1d\x00\xe0\xff\xd7\x03\x1d\x00\xe2\xff\ +\xd7\x03\x1d\x00\xe4\xff\xd7\x03\x1d\x01\x0e\xff\xd7\x03\x1d\x01\ +\x10\xff\xd7\x03\x1d\x01\x12\xff\xd7\x03\x1d\x01\x14\xff\xd7\x03\ +\x1d\x01$\xffq\x03\x1d\x01&\xffq\x03\x1d\x016\xff\ +\xae\x03\x1d\x018\xff\x85\x03\x1d\x01:\xff\x85\x03\x1d\x01\ +G\xff\xd7\x03\x1d\x01\xfa\xff\xae\x03\x1d\x01\xfc\xff\xae\x03\ +\x1d\x01\xfe\xff\xae\x03\x1d\x02\x00\xff\x85\x03\x1d\x02\x07\xff\ +q\x03\x1d\x02\x0b\xffq\x03\x1d\x02_\xff\xd7\x03\x1d\x03\ +I\xff\xd7\x03\x1d\x03K\xff\xd7\x03\x1d\x03M\xff\xd7\x03\ +\x1d\x03O\xff\xd7\x03\x1d\x03Q\xff\xd7\x03\x1d\x03S\xff\ +\xd7\x03\x1d\x03U\xff\xd7\x03\x1d\x03W\xff\xd7\x03\x1d\x03\ +Y\xff\xd7\x03\x1d\x03[\xff\xd7\x03\x1d\x03]\xff\xd7\x03\ +\x1d\x03_\xff\xd7\x03\x1d\x03o\xff\x85\x03\x1d\x03q\xff\ +\x85\x03\x1d\x03s\xff\x85\x03\x1d\x03\x8f\xffq\x03\x1e\x00\ +\x05\xff\xec\x03\x1e\x00\x0a\xff\xec\x03\x1e\x02\x07\xff\xec\x03\ +\x1e\x02\x0b\xff\xec\x03\x1f\x00\x05\xffq\x03\x1f\x00\x0a\xff\ +q\x03\x1f\x00&\xff\xd7\x03\x1f\x00*\xff\xd7\x03\x1f\x00\ +-\x01\x0a\x03\x1f\x002\xff\xd7\x03\x1f\x004\xff\xd7\x03\ +\x1f\x007\xffq\x03\x1f\x009\xff\xae\x03\x1f\x00:\xff\ +\xae\x03\x1f\x00<\xff\x85\x03\x1f\x00\x89\xff\xd7\x03\x1f\x00\ +\x94\xff\xd7\x03\x1f\x00\x95\xff\xd7\x03\x1f\x00\x96\xff\xd7\x03\ +\x1f\x00\x97\xff\xd7\x03\x1f\x00\x98\xff\xd7\x03\x1f\x00\x9a\xff\ +\xd7\x03\x1f\x00\x9f\xff\x85\x03\x1f\x00\xc8\xff\xd7\x03\x1f\x00\ +\xca\xff\xd7\x03\x1f\x00\xcc\xff\xd7\x03\x1f\x00\xce\xff\xd7\x03\ +\x1f\x00\xde\xff\xd7\x03\x1f\x00\xe0\xff\xd7\x03\x1f\x00\xe2\xff\ +\xd7\x03\x1f\x00\xe4\xff\xd7\x03\x1f\x01\x0e\xff\xd7\x03\x1f\x01\ +\x10\xff\xd7\x03\x1f\x01\x12\xff\xd7\x03\x1f\x01\x14\xff\xd7\x03\ +\x1f\x01$\xffq\x03\x1f\x01&\xffq\x03\x1f\x016\xff\ +\xae\x03\x1f\x018\xff\x85\x03\x1f\x01:\xff\x85\x03\x1f\x01\ +G\xff\xd7\x03\x1f\x01\xfa\xff\xae\x03\x1f\x01\xfc\xff\xae\x03\ +\x1f\x01\xfe\xff\xae\x03\x1f\x02\x00\xff\x85\x03\x1f\x02\x07\xff\ +q\x03\x1f\x02\x0b\xffq\x03\x1f\x02_\xff\xd7\x03\x1f\x03\ +I\xff\xd7\x03\x1f\x03K\xff\xd7\x03\x1f\x03M\xff\xd7\x03\ +\x1f\x03O\xff\xd7\x03\x1f\x03Q\xff\xd7\x03\x1f\x03S\xff\ +\xd7\x03\x1f\x03U\xff\xd7\x03\x1f\x03W\xff\xd7\x03\x1f\x03\ +Y\xff\xd7\x03\x1f\x03[\xff\xd7\x03\x1f\x03]\xff\xd7\x03\ +\x1f\x03_\xff\xd7\x03\x1f\x03o\xff\x85\x03\x1f\x03q\xff\ +\x85\x03\x1f\x03s\xff\x85\x03\x1f\x03\x8f\xffq\x03 \x00\ +\x05\xff\xec\x03 \x00\x0a\xff\xec\x03 \x02\x07\xff\xec\x03\ + \x02\x0b\xff\xec\x03!\x00\x05\xffq\x03!\x00\x0a\xff\ +q\x03!\x00&\xff\xd7\x03!\x00*\xff\xd7\x03!\x00\ +-\x01\x0a\x03!\x002\xff\xd7\x03!\x004\xff\xd7\x03\ +!\x007\xffq\x03!\x009\xff\xae\x03!\x00:\xff\ +\xae\x03!\x00<\xff\x85\x03!\x00\x89\xff\xd7\x03!\x00\ +\x94\xff\xd7\x03!\x00\x95\xff\xd7\x03!\x00\x96\xff\xd7\x03\ +!\x00\x97\xff\xd7\x03!\x00\x98\xff\xd7\x03!\x00\x9a\xff\ +\xd7\x03!\x00\x9f\xff\x85\x03!\x00\xc8\xff\xd7\x03!\x00\ +\xca\xff\xd7\x03!\x00\xcc\xff\xd7\x03!\x00\xce\xff\xd7\x03\ +!\x00\xde\xff\xd7\x03!\x00\xe0\xff\xd7\x03!\x00\xe2\xff\ +\xd7\x03!\x00\xe4\xff\xd7\x03!\x01\x0e\xff\xd7\x03!\x01\ +\x10\xff\xd7\x03!\x01\x12\xff\xd7\x03!\x01\x14\xff\xd7\x03\ +!\x01$\xffq\x03!\x01&\xffq\x03!\x016\xff\ +\xae\x03!\x018\xff\x85\x03!\x01:\xff\x85\x03!\x01\ +G\xff\xd7\x03!\x01\xfa\xff\xae\x03!\x01\xfc\xff\xae\x03\ +!\x01\xfe\xff\xae\x03!\x02\x00\xff\x85\x03!\x02\x07\xff\ +q\x03!\x02\x0b\xffq\x03!\x02_\xff\xd7\x03!\x03\ +I\xff\xd7\x03!\x03K\xff\xd7\x03!\x03M\xff\xd7\x03\ +!\x03O\xff\xd7\x03!\x03Q\xff\xd7\x03!\x03S\xff\ +\xd7\x03!\x03U\xff\xd7\x03!\x03W\xff\xd7\x03!\x03\ +Y\xff\xd7\x03!\x03[\xff\xd7\x03!\x03]\xff\xd7\x03\ +!\x03_\xff\xd7\x03!\x03o\xff\x85\x03!\x03q\xff\ +\x85\x03!\x03s\xff\x85\x03!\x03\x8f\xffq\x03\x22\x00\ +\x05\xff\xec\x03\x22\x00\x0a\xff\xec\x03\x22\x02\x07\xff\xec\x03\ +\x22\x02\x0b\xff\xec\x03#\x00\x05\xffq\x03#\x00\x0a\xff\ +q\x03#\x00&\xff\xd7\x03#\x00*\xff\xd7\x03#\x00\ +-\x01\x0a\x03#\x002\xff\xd7\x03#\x004\xff\xd7\x03\ +#\x007\xffq\x03#\x009\xff\xae\x03#\x00:\xff\ +\xae\x03#\x00<\xff\x85\x03#\x00\x89\xff\xd7\x03#\x00\ +\x94\xff\xd7\x03#\x00\x95\xff\xd7\x03#\x00\x96\xff\xd7\x03\ +#\x00\x97\xff\xd7\x03#\x00\x98\xff\xd7\x03#\x00\x9a\xff\ +\xd7\x03#\x00\x9f\xff\x85\x03#\x00\xc8\xff\xd7\x03#\x00\ +\xca\xff\xd7\x03#\x00\xcc\xff\xd7\x03#\x00\xce\xff\xd7\x03\ +#\x00\xde\xff\xd7\x03#\x00\xe0\xff\xd7\x03#\x00\xe2\xff\ +\xd7\x03#\x00\xe4\xff\xd7\x03#\x01\x0e\xff\xd7\x03#\x01\ +\x10\xff\xd7\x03#\x01\x12\xff\xd7\x03#\x01\x14\xff\xd7\x03\ +#\x01$\xffq\x03#\x01&\xffq\x03#\x016\xff\ +\xae\x03#\x018\xff\x85\x03#\x01:\xff\x85\x03#\x01\ +G\xff\xd7\x03#\x01\xfa\xff\xae\x03#\x01\xfc\xff\xae\x03\ +#\x01\xfe\xff\xae\x03#\x02\x00\xff\x85\x03#\x02\x07\xff\ +q\x03#\x02\x0b\xffq\x03#\x02_\xff\xd7\x03#\x03\ +I\xff\xd7\x03#\x03K\xff\xd7\x03#\x03M\xff\xd7\x03\ +#\x03O\xff\xd7\x03#\x03Q\xff\xd7\x03#\x03S\xff\ +\xd7\x03#\x03U\xff\xd7\x03#\x03W\xff\xd7\x03#\x03\ +Y\xff\xd7\x03#\x03[\xff\xd7\x03#\x03]\xff\xd7\x03\ +#\x03_\xff\xd7\x03#\x03o\xff\x85\x03#\x03q\xff\ +\x85\x03#\x03s\xff\x85\x03#\x03\x8f\xffq\x03$\x00\ +\x05\xff\xec\x03$\x00\x0a\xff\xec\x03$\x02\x07\xff\xec\x03\ +$\x02\x0b\xff\xec\x03%\x00\x05\xffq\x03%\x00\x0a\xff\ +q\x03%\x00&\xff\xd7\x03%\x00*\xff\xd7\x03%\x00\ +-\x01\x0a\x03%\x002\xff\xd7\x03%\x004\xff\xd7\x03\ +%\x007\xffq\x03%\x009\xff\xae\x03%\x00:\xff\ +\xae\x03%\x00<\xff\x85\x03%\x00\x89\xff\xd7\x03%\x00\ +\x94\xff\xd7\x03%\x00\x95\xff\xd7\x03%\x00\x96\xff\xd7\x03\ +%\x00\x97\xff\xd7\x03%\x00\x98\xff\xd7\x03%\x00\x9a\xff\ +\xd7\x03%\x00\x9f\xff\x85\x03%\x00\xc8\xff\xd7\x03%\x00\ +\xca\xff\xd7\x03%\x00\xcc\xff\xd7\x03%\x00\xce\xff\xd7\x03\ +%\x00\xde\xff\xd7\x03%\x00\xe0\xff\xd7\x03%\x00\xe2\xff\ +\xd7\x03%\x00\xe4\xff\xd7\x03%\x01\x0e\xff\xd7\x03%\x01\ +\x10\xff\xd7\x03%\x01\x12\xff\xd7\x03%\x01\x14\xff\xd7\x03\ +%\x01$\xffq\x03%\x01&\xffq\x03%\x016\xff\ +\xae\x03%\x018\xff\x85\x03%\x01:\xff\x85\x03%\x01\ +G\xff\xd7\x03%\x01\xfa\xff\xae\x03%\x01\xfc\xff\xae\x03\ +%\x01\xfe\xff\xae\x03%\x02\x00\xff\x85\x03%\x02\x07\xff\ +q\x03%\x02\x0b\xffq\x03%\x02_\xff\xd7\x03%\x03\ +I\xff\xd7\x03%\x03K\xff\xd7\x03%\x03M\xff\xd7\x03\ +%\x03O\xff\xd7\x03%\x03Q\xff\xd7\x03%\x03S\xff\ +\xd7\x03%\x03U\xff\xd7\x03%\x03W\xff\xd7\x03%\x03\ +Y\xff\xd7\x03%\x03[\xff\xd7\x03%\x03]\xff\xd7\x03\ +%\x03_\xff\xd7\x03%\x03o\xff\x85\x03%\x03q\xff\ +\x85\x03%\x03s\xff\x85\x03%\x03\x8f\xffq\x03&\x00\ +\x05\xff\xec\x03&\x00\x0a\xff\xec\x03&\x02\x07\xff\xec\x03\ +&\x02\x0b\xff\xec\x03'\x00\x05\xffq\x03'\x00\x0a\xff\ +q\x03'\x00&\xff\xd7\x03'\x00*\xff\xd7\x03'\x00\ +-\x01\x0a\x03'\x002\xff\xd7\x03'\x004\xff\xd7\x03\ +'\x007\xffq\x03'\x009\xff\xae\x03'\x00:\xff\ +\xae\x03'\x00<\xff\x85\x03'\x00\x89\xff\xd7\x03'\x00\ +\x94\xff\xd7\x03'\x00\x95\xff\xd7\x03'\x00\x96\xff\xd7\x03\ +'\x00\x97\xff\xd7\x03'\x00\x98\xff\xd7\x03'\x00\x9a\xff\ +\xd7\x03'\x00\x9f\xff\x85\x03'\x00\xc8\xff\xd7\x03'\x00\ +\xca\xff\xd7\x03'\x00\xcc\xff\xd7\x03'\x00\xce\xff\xd7\x03\ +'\x00\xde\xff\xd7\x03'\x00\xe0\xff\xd7\x03'\x00\xe2\xff\ +\xd7\x03'\x00\xe4\xff\xd7\x03'\x01\x0e\xff\xd7\x03'\x01\ +\x10\xff\xd7\x03'\x01\x12\xff\xd7\x03'\x01\x14\xff\xd7\x03\ +'\x01$\xffq\x03'\x01&\xffq\x03'\x016\xff\ +\xae\x03'\x018\xff\x85\x03'\x01:\xff\x85\x03'\x01\ +G\xff\xd7\x03'\x01\xfa\xff\xae\x03'\x01\xfc\xff\xae\x03\ +'\x01\xfe\xff\xae\x03'\x02\x00\xff\x85\x03'\x02\x07\xff\ +q\x03'\x02\x0b\xffq\x03'\x02_\xff\xd7\x03'\x03\ +I\xff\xd7\x03'\x03K\xff\xd7\x03'\x03M\xff\xd7\x03\ +'\x03O\xff\xd7\x03'\x03Q\xff\xd7\x03'\x03S\xff\ +\xd7\x03'\x03U\xff\xd7\x03'\x03W\xff\xd7\x03'\x03\ +Y\xff\xd7\x03'\x03[\xff\xd7\x03'\x03]\xff\xd7\x03\ +'\x03_\xff\xd7\x03'\x03o\xff\x85\x03'\x03q\xff\ +\x85\x03'\x03s\xff\x85\x03'\x03\x8f\xffq\x03(\x00\ +\x05\xff\xec\x03(\x00\x0a\xff\xec\x03(\x02\x07\xff\xec\x03\ +(\x02\x0b\xff\xec\x03)\x00\x05\xffq\x03)\x00\x0a\xff\ +q\x03)\x00&\xff\xd7\x03)\x00*\xff\xd7\x03)\x00\ +-\x01\x0a\x03)\x002\xff\xd7\x03)\x004\xff\xd7\x03\ +)\x007\xffq\x03)\x009\xff\xae\x03)\x00:\xff\ +\xae\x03)\x00<\xff\x85\x03)\x00\x89\xff\xd7\x03)\x00\ +\x94\xff\xd7\x03)\x00\x95\xff\xd7\x03)\x00\x96\xff\xd7\x03\ +)\x00\x97\xff\xd7\x03)\x00\x98\xff\xd7\x03)\x00\x9a\xff\ +\xd7\x03)\x00\x9f\xff\x85\x03)\x00\xc8\xff\xd7\x03)\x00\ +\xca\xff\xd7\x03)\x00\xcc\xff\xd7\x03)\x00\xce\xff\xd7\x03\ +)\x00\xde\xff\xd7\x03)\x00\xe0\xff\xd7\x03)\x00\xe2\xff\ +\xd7\x03)\x00\xe4\xff\xd7\x03)\x01\x0e\xff\xd7\x03)\x01\ +\x10\xff\xd7\x03)\x01\x12\xff\xd7\x03)\x01\x14\xff\xd7\x03\ +)\x01$\xffq\x03)\x01&\xffq\x03)\x016\xff\ +\xae\x03)\x018\xff\x85\x03)\x01:\xff\x85\x03)\x01\ +G\xff\xd7\x03)\x01\xfa\xff\xae\x03)\x01\xfc\xff\xae\x03\ +)\x01\xfe\xff\xae\x03)\x02\x00\xff\x85\x03)\x02\x07\xff\ +q\x03)\x02\x0b\xffq\x03)\x02_\xff\xd7\x03)\x03\ +I\xff\xd7\x03)\x03K\xff\xd7\x03)\x03M\xff\xd7\x03\ +)\x03O\xff\xd7\x03)\x03Q\xff\xd7\x03)\x03S\xff\ +\xd7\x03)\x03U\xff\xd7\x03)\x03W\xff\xd7\x03)\x03\ +Y\xff\xd7\x03)\x03[\xff\xd7\x03)\x03]\xff\xd7\x03\ +)\x03_\xff\xd7\x03)\x03o\xff\x85\x03)\x03q\xff\ +\x85\x03)\x03s\xff\x85\x03)\x03\x8f\xffq\x03*\x00\ +\x05\xff\xec\x03*\x00\x0a\xff\xec\x03*\x02\x07\xff\xec\x03\ +*\x02\x0b\xff\xec\x03+\x00\x05\xffq\x03+\x00\x0a\xff\ +q\x03+\x00&\xff\xd7\x03+\x00*\xff\xd7\x03+\x00\ +-\x01\x0a\x03+\x002\xff\xd7\x03+\x004\xff\xd7\x03\ ++\x007\xffq\x03+\x009\xff\xae\x03+\x00:\xff\ +\xae\x03+\x00<\xff\x85\x03+\x00\x89\xff\xd7\x03+\x00\ +\x94\xff\xd7\x03+\x00\x95\xff\xd7\x03+\x00\x96\xff\xd7\x03\ ++\x00\x97\xff\xd7\x03+\x00\x98\xff\xd7\x03+\x00\x9a\xff\ +\xd7\x03+\x00\x9f\xff\x85\x03+\x00\xc8\xff\xd7\x03+\x00\ +\xca\xff\xd7\x03+\x00\xcc\xff\xd7\x03+\x00\xce\xff\xd7\x03\ ++\x00\xde\xff\xd7\x03+\x00\xe0\xff\xd7\x03+\x00\xe2\xff\ +\xd7\x03+\x00\xe4\xff\xd7\x03+\x01\x0e\xff\xd7\x03+\x01\ +\x10\xff\xd7\x03+\x01\x12\xff\xd7\x03+\x01\x14\xff\xd7\x03\ ++\x01$\xffq\x03+\x01&\xffq\x03+\x016\xff\ +\xae\x03+\x018\xff\x85\x03+\x01:\xff\x85\x03+\x01\ +G\xff\xd7\x03+\x01\xfa\xff\xae\x03+\x01\xfc\xff\xae\x03\ ++\x01\xfe\xff\xae\x03+\x02\x00\xff\x85\x03+\x02\x07\xff\ +q\x03+\x02\x0b\xffq\x03+\x02_\xff\xd7\x03+\x03\ +I\xff\xd7\x03+\x03K\xff\xd7\x03+\x03M\xff\xd7\x03\ ++\x03O\xff\xd7\x03+\x03Q\xff\xd7\x03+\x03S\xff\ +\xd7\x03+\x03U\xff\xd7\x03+\x03W\xff\xd7\x03+\x03\ +Y\xff\xd7\x03+\x03[\xff\xd7\x03+\x03]\xff\xd7\x03\ ++\x03_\xff\xd7\x03+\x03o\xff\x85\x03+\x03q\xff\ +\x85\x03+\x03s\xff\x85\x03+\x03\x8f\xffq\x03,\x00\ +\x05\xff\xec\x03,\x00\x0a\xff\xec\x03,\x02\x07\xff\xec\x03\ +,\x02\x0b\xff\xec\x03-\x00\x05\xffq\x03-\x00\x0a\xff\ +q\x03-\x00&\xff\xd7\x03-\x00*\xff\xd7\x03-\x00\ +-\x01\x0a\x03-\x002\xff\xd7\x03-\x004\xff\xd7\x03\ +-\x007\xffq\x03-\x009\xff\xae\x03-\x00:\xff\ +\xae\x03-\x00<\xff\x85\x03-\x00\x89\xff\xd7\x03-\x00\ +\x94\xff\xd7\x03-\x00\x95\xff\xd7\x03-\x00\x96\xff\xd7\x03\ +-\x00\x97\xff\xd7\x03-\x00\x98\xff\xd7\x03-\x00\x9a\xff\ +\xd7\x03-\x00\x9f\xff\x85\x03-\x00\xc8\xff\xd7\x03-\x00\ +\xca\xff\xd7\x03-\x00\xcc\xff\xd7\x03-\x00\xce\xff\xd7\x03\ +-\x00\xde\xff\xd7\x03-\x00\xe0\xff\xd7\x03-\x00\xe2\xff\ +\xd7\x03-\x00\xe4\xff\xd7\x03-\x01\x0e\xff\xd7\x03-\x01\ +\x10\xff\xd7\x03-\x01\x12\xff\xd7\x03-\x01\x14\xff\xd7\x03\ +-\x01$\xffq\x03-\x01&\xffq\x03-\x016\xff\ +\xae\x03-\x018\xff\x85\x03-\x01:\xff\x85\x03-\x01\ +G\xff\xd7\x03-\x01\xfa\xff\xae\x03-\x01\xfc\xff\xae\x03\ +-\x01\xfe\xff\xae\x03-\x02\x00\xff\x85\x03-\x02\x07\xff\ +q\x03-\x02\x0b\xffq\x03-\x02_\xff\xd7\x03-\x03\ +I\xff\xd7\x03-\x03K\xff\xd7\x03-\x03M\xff\xd7\x03\ +-\x03O\xff\xd7\x03-\x03Q\xff\xd7\x03-\x03S\xff\ +\xd7\x03-\x03U\xff\xd7\x03-\x03W\xff\xd7\x03-\x03\ +Y\xff\xd7\x03-\x03[\xff\xd7\x03-\x03]\xff\xd7\x03\ +-\x03_\xff\xd7\x03-\x03o\xff\x85\x03-\x03q\xff\ +\x85\x03-\x03s\xff\x85\x03-\x03\x8f\xffq\x03.\x00\ +\x05\xff\xec\x03.\x00\x0a\xff\xec\x03.\x02\x07\xff\xec\x03\ +.\x02\x0b\xff\xec\x03/\x00\x05\xffq\x03/\x00\x0a\xff\ +q\x03/\x00&\xff\xd7\x03/\x00*\xff\xd7\x03/\x00\ +-\x01\x0a\x03/\x002\xff\xd7\x03/\x004\xff\xd7\x03\ +/\x007\xffq\x03/\x009\xff\xae\x03/\x00:\xff\ +\xae\x03/\x00<\xff\x85\x03/\x00\x89\xff\xd7\x03/\x00\ +\x94\xff\xd7\x03/\x00\x95\xff\xd7\x03/\x00\x96\xff\xd7\x03\ +/\x00\x97\xff\xd7\x03/\x00\x98\xff\xd7\x03/\x00\x9a\xff\ +\xd7\x03/\x00\x9f\xff\x85\x03/\x00\xc8\xff\xd7\x03/\x00\ +\xca\xff\xd7\x03/\x00\xcc\xff\xd7\x03/\x00\xce\xff\xd7\x03\ +/\x00\xde\xff\xd7\x03/\x00\xe0\xff\xd7\x03/\x00\xe2\xff\ +\xd7\x03/\x00\xe4\xff\xd7\x03/\x01\x0e\xff\xd7\x03/\x01\ +\x10\xff\xd7\x03/\x01\x12\xff\xd7\x03/\x01\x14\xff\xd7\x03\ +/\x01$\xffq\x03/\x01&\xffq\x03/\x016\xff\ +\xae\x03/\x018\xff\x85\x03/\x01:\xff\x85\x03/\x01\ +G\xff\xd7\x03/\x01\xfa\xff\xae\x03/\x01\xfc\xff\xae\x03\ +/\x01\xfe\xff\xae\x03/\x02\x00\xff\x85\x03/\x02\x07\xff\ +q\x03/\x02\x0b\xffq\x03/\x02_\xff\xd7\x03/\x03\ +I\xff\xd7\x03/\x03K\xff\xd7\x03/\x03M\xff\xd7\x03\ +/\x03O\xff\xd7\x03/\x03Q\xff\xd7\x03/\x03S\xff\ +\xd7\x03/\x03U\xff\xd7\x03/\x03W\xff\xd7\x03/\x03\ +Y\xff\xd7\x03/\x03[\xff\xd7\x03/\x03]\xff\xd7\x03\ +/\x03_\xff\xd7\x03/\x03o\xff\x85\x03/\x03q\xff\ +\x85\x03/\x03s\xff\x85\x03/\x03\x8f\xffq\x030\x00\ +\x05\xff\xec\x030\x00\x0a\xff\xec\x030\x02\x07\xff\xec\x03\ +0\x02\x0b\xff\xec\x031\x00\x05\xffq\x031\x00\x0a\xff\ +q\x031\x00&\xff\xd7\x031\x00*\xff\xd7\x031\x00\ +-\x01\x0a\x031\x002\xff\xd7\x031\x004\xff\xd7\x03\ +1\x007\xffq\x031\x009\xff\xae\x031\x00:\xff\ +\xae\x031\x00<\xff\x85\x031\x00\x89\xff\xd7\x031\x00\ +\x94\xff\xd7\x031\x00\x95\xff\xd7\x031\x00\x96\xff\xd7\x03\ +1\x00\x97\xff\xd7\x031\x00\x98\xff\xd7\x031\x00\x9a\xff\ +\xd7\x031\x00\x9f\xff\x85\x031\x00\xc8\xff\xd7\x031\x00\ +\xca\xff\xd7\x031\x00\xcc\xff\xd7\x031\x00\xce\xff\xd7\x03\ +1\x00\xde\xff\xd7\x031\x00\xe0\xff\xd7\x031\x00\xe2\xff\ +\xd7\x031\x00\xe4\xff\xd7\x031\x01\x0e\xff\xd7\x031\x01\ +\x10\xff\xd7\x031\x01\x12\xff\xd7\x031\x01\x14\xff\xd7\x03\ +1\x01$\xffq\x031\x01&\xffq\x031\x016\xff\ +\xae\x031\x018\xff\x85\x031\x01:\xff\x85\x031\x01\ +G\xff\xd7\x031\x01\xfa\xff\xae\x031\x01\xfc\xff\xae\x03\ +1\x01\xfe\xff\xae\x031\x02\x00\xff\x85\x031\x02\x07\xff\ +q\x031\x02\x0b\xffq\x031\x02_\xff\xd7\x031\x03\ +I\xff\xd7\x031\x03K\xff\xd7\x031\x03M\xff\xd7\x03\ +1\x03O\xff\xd7\x031\x03Q\xff\xd7\x031\x03S\xff\ +\xd7\x031\x03U\xff\xd7\x031\x03W\xff\xd7\x031\x03\ +Y\xff\xd7\x031\x03[\xff\xd7\x031\x03]\xff\xd7\x03\ +1\x03_\xff\xd7\x031\x03o\xff\x85\x031\x03q\xff\ +\x85\x031\x03s\xff\x85\x031\x03\x8f\xffq\x032\x00\ +\x05\xff\xec\x032\x00\x0a\xff\xec\x032\x02\x07\xff\xec\x03\ +2\x02\x0b\xff\xec\x033\x00\x05\xffq\x033\x00\x0a\xff\ +q\x033\x00&\xff\xd7\x033\x00*\xff\xd7\x033\x00\ +-\x01\x0a\x033\x002\xff\xd7\x033\x004\xff\xd7\x03\ +3\x007\xffq\x033\x009\xff\xae\x033\x00:\xff\ +\xae\x033\x00<\xff\x85\x033\x00\x89\xff\xd7\x033\x00\ +\x94\xff\xd7\x033\x00\x95\xff\xd7\x033\x00\x96\xff\xd7\x03\ +3\x00\x97\xff\xd7\x033\x00\x98\xff\xd7\x033\x00\x9a\xff\ +\xd7\x033\x00\x9f\xff\x85\x033\x00\xc8\xff\xd7\x033\x00\ +\xca\xff\xd7\x033\x00\xcc\xff\xd7\x033\x00\xce\xff\xd7\x03\ +3\x00\xde\xff\xd7\x033\x00\xe0\xff\xd7\x033\x00\xe2\xff\ +\xd7\x033\x00\xe4\xff\xd7\x033\x01\x0e\xff\xd7\x033\x01\ +\x10\xff\xd7\x033\x01\x12\xff\xd7\x033\x01\x14\xff\xd7\x03\ +3\x01$\xffq\x033\x01&\xffq\x033\x016\xff\ +\xae\x033\x018\xff\x85\x033\x01:\xff\x85\x033\x01\ +G\xff\xd7\x033\x01\xfa\xff\xae\x033\x01\xfc\xff\xae\x03\ +3\x01\xfe\xff\xae\x033\x02\x00\xff\x85\x033\x02\x07\xff\ +q\x033\x02\x0b\xffq\x033\x02_\xff\xd7\x033\x03\ +I\xff\xd7\x033\x03K\xff\xd7\x033\x03M\xff\xd7\x03\ +3\x03O\xff\xd7\x033\x03Q\xff\xd7\x033\x03S\xff\ +\xd7\x033\x03U\xff\xd7\x033\x03W\xff\xd7\x033\x03\ +Y\xff\xd7\x033\x03[\xff\xd7\x033\x03]\xff\xd7\x03\ +3\x03_\xff\xd7\x033\x03o\xff\x85\x033\x03q\xff\ +\x85\x033\x03s\xff\x85\x033\x03\x8f\xffq\x034\x00\ +\x05\xff\xec\x034\x00\x0a\xff\xec\x034\x02\x07\xff\xec\x03\ +4\x02\x0b\xff\xec\x035\x00-\x00{\x036\x00\x05\xff\ +\xec\x036\x00\x0a\xff\xec\x036\x00Y\xff\xd7\x036\x00\ +Z\xff\xd7\x036\x00[\xff\xd7\x036\x00\x5c\xff\xd7\x03\ +6\x00]\xff\xec\x036\x00\xbf\xff\xd7\x036\x017\xff\ +\xd7\x036\x01<\xff\xec\x036\x01>\xff\xec\x036\x01\ +@\xff\xec\x036\x01\xfb\xff\xd7\x036\x01\xfd\xff\xd7\x03\ +6\x02\x07\xff\xec\x036\x02\x0b\xff\xec\x036\x03p\xff\ +\xd7\x037\x00-\x00{\x038\x00\x05\xff\xec\x038\x00\ +\x0a\xff\xec\x038\x00Y\xff\xd7\x038\x00Z\xff\xd7\x03\ +8\x00[\xff\xd7\x038\x00\x5c\xff\xd7\x038\x00]\xff\ +\xec\x038\x00\xbf\xff\xd7\x038\x017\xff\xd7\x038\x01\ +<\xff\xec\x038\x01>\xff\xec\x038\x01@\xff\xec\x03\ +8\x01\xfb\xff\xd7\x038\x01\xfd\xff\xd7\x038\x02\x07\xff\ +\xec\x038\x02\x0b\xff\xec\x038\x03p\xff\xd7\x039\x00\ +-\x00{\x03:\x00\x05\xff\xec\x03:\x00\x0a\xff\xec\x03\ +:\x00Y\xff\xd7\x03:\x00Z\xff\xd7\x03:\x00[\xff\ +\xd7\x03:\x00\x5c\xff\xd7\x03:\x00]\xff\xec\x03:\x00\ +\xbf\xff\xd7\x03:\x017\xff\xd7\x03:\x01<\xff\xec\x03\ +:\x01>\xff\xec\x03:\x01@\xff\xec\x03:\x01\xfb\xff\ +\xd7\x03:\x01\xfd\xff\xd7\x03:\x02\x07\xff\xec\x03:\x02\ +\x0b\xff\xec\x03:\x03p\xff\xd7\x03;\x00-\x00{\x03\ +<\x00\x05\xff\xec\x03<\x00\x0a\xff\xec\x03<\x00Y\xff\ +\xd7\x03<\x00Z\xff\xd7\x03<\x00[\xff\xd7\x03<\x00\ +\x5c\xff\xd7\x03<\x00]\xff\xec\x03<\x00\xbf\xff\xd7\x03\ +<\x017\xff\xd7\x03<\x01<\xff\xec\x03<\x01>\xff\ +\xec\x03<\x01@\xff\xec\x03<\x01\xfb\xff\xd7\x03<\x01\ +\xfd\xff\xd7\x03<\x02\x07\xff\xec\x03<\x02\x0b\xff\xec\x03\ +<\x03p\xff\xd7\x03=\x00-\x00{\x03>\x00\x05\xff\ +\xec\x03>\x00\x0a\xff\xec\x03>\x00Y\xff\xd7\x03>\x00\ +Z\xff\xd7\x03>\x00[\xff\xd7\x03>\x00\x5c\xff\xd7\x03\ +>\x00]\xff\xec\x03>\x00\xbf\xff\xd7\x03>\x017\xff\ +\xd7\x03>\x01<\xff\xec\x03>\x01>\xff\xec\x03>\x01\ +@\xff\xec\x03>\x01\xfb\xff\xd7\x03>\x01\xfd\xff\xd7\x03\ +>\x02\x07\xff\xec\x03>\x02\x0b\xff\xec\x03>\x03p\xff\ +\xd7\x03?\x00-\x00{\x03@\x00\x05\xff\xec\x03@\x00\ +\x0a\xff\xec\x03@\x00Y\xff\xd7\x03@\x00Z\xff\xd7\x03\ +@\x00[\xff\xd7\x03@\x00\x5c\xff\xd7\x03@\x00]\xff\ +\xec\x03@\x00\xbf\xff\xd7\x03@\x017\xff\xd7\x03@\x01\ +<\xff\xec\x03@\x01>\xff\xec\x03@\x01@\xff\xec\x03\ +@\x01\xfb\xff\xd7\x03@\x01\xfd\xff\xd7\x03@\x02\x07\xff\ +\xec\x03@\x02\x0b\xff\xec\x03@\x03p\xff\xd7\x03A\x00\ +-\x00{\x03B\x00\x05\xff\xec\x03B\x00\x0a\xff\xec\x03\ +B\x00Y\xff\xd7\x03B\x00Z\xff\xd7\x03B\x00[\xff\ +\xd7\x03B\x00\x5c\xff\xd7\x03B\x00]\xff\xec\x03B\x00\ +\xbf\xff\xd7\x03B\x017\xff\xd7\x03B\x01<\xff\xec\x03\ +B\x01>\xff\xec\x03B\x01@\xff\xec\x03B\x01\xfb\xff\ +\xd7\x03B\x01\xfd\xff\xd7\x03B\x02\x07\xff\xec\x03B\x02\ +\x0b\xff\xec\x03B\x03p\xff\xd7\x03C\x00-\x00{\x03\ +D\x00\x05\xff\xec\x03D\x00\x0a\xff\xec\x03D\x00Y\xff\ +\xd7\x03D\x00Z\xff\xd7\x03D\x00[\xff\xd7\x03D\x00\ +\x5c\xff\xd7\x03D\x00]\xff\xec\x03D\x00\xbf\xff\xd7\x03\ +D\x017\xff\xd7\x03D\x01<\xff\xec\x03D\x01>\xff\ +\xec\x03D\x01@\xff\xec\x03D\x01\xfb\xff\xd7\x03D\x01\ +\xfd\xff\xd7\x03D\x02\x07\xff\xec\x03D\x02\x0b\xff\xec\x03\ +D\x03p\xff\xd7\x03I\x00\x0f\xff\xae\x03I\x00\x11\xff\ +\xae\x03I\x00$\xff\xd7\x03I\x007\xff\xc3\x03I\x00\ +9\xff\xec\x03I\x00:\xff\xec\x03I\x00;\xff\xd7\x03\ +I\x00<\xff\xec\x03I\x00=\xff\xec\x03I\x00\x82\xff\ +\xd7\x03I\x00\x83\xff\xd7\x03I\x00\x84\xff\xd7\x03I\x00\ +\x85\xff\xd7\x03I\x00\x86\xff\xd7\x03I\x00\x87\xff\xd7\x03\ +I\x00\x9f\xff\xec\x03I\x00\xc2\xff\xd7\x03I\x00\xc4\xff\ +\xd7\x03I\x00\xc6\xff\xd7\x03I\x01$\xff\xc3\x03I\x01\ +&\xff\xc3\x03I\x016\xff\xec\x03I\x018\xff\xec\x03\ +I\x01:\xff\xec\x03I\x01;\xff\xec\x03I\x01=\xff\ +\xec\x03I\x01?\xff\xec\x03I\x01C\xff\xd7\x03I\x01\ +\xa0\xff\xec\x03I\x01\xfa\xff\xec\x03I\x01\xfc\xff\xec\x03\ +I\x01\xfe\xff\xec\x03I\x02\x00\xff\xec\x03I\x02\x08\xff\ +\xae\x03I\x02\x0c\xff\xae\x03I\x02X\xff\xd7\x03I\x03\ +\x1d\xff\xd7\x03I\x03\x1f\xff\xd7\x03I\x03!\xff\xd7\x03\ +I\x03#\xff\xd7\x03I\x03%\xff\xd7\x03I\x03'\xff\ +\xd7\x03I\x03)\xff\xd7\x03I\x03+\xff\xd7\x03I\x03\ +-\xff\xd7\x03I\x03/\xff\xd7\x03I\x031\xff\xd7\x03\ +I\x033\xff\xd7\x03I\x03o\xff\xec\x03I\x03q\xff\ +\xec\x03I\x03s\xff\xec\x03I\x03\x8f\xff\xc3\x03J\x00\ +\x05\xff\xec\x03J\x00\x0a\xff\xec\x03J\x00Y\xff\xd7\x03\ +J\x00Z\xff\xd7\x03J\x00[\xff\xd7\x03J\x00\x5c\xff\ +\xd7\x03J\x00]\xff\xec\x03J\x00\xbf\xff\xd7\x03J\x01\ +7\xff\xd7\x03J\x01<\xff\xec\x03J\x01>\xff\xec\x03\ +J\x01@\xff\xec\x03J\x01\xfb\xff\xd7\x03J\x01\xfd\xff\ +\xd7\x03J\x02\x07\xff\xec\x03J\x02\x0b\xff\xec\x03J\x03\ +p\xff\xd7\x03K\x00\x0f\xff\xae\x03K\x00\x11\xff\xae\x03\ +K\x00$\xff\xd7\x03K\x007\xff\xc3\x03K\x009\xff\ +\xec\x03K\x00:\xff\xec\x03K\x00;\xff\xd7\x03K\x00\ +<\xff\xec\x03K\x00=\xff\xec\x03K\x00\x82\xff\xd7\x03\ +K\x00\x83\xff\xd7\x03K\x00\x84\xff\xd7\x03K\x00\x85\xff\ +\xd7\x03K\x00\x86\xff\xd7\x03K\x00\x87\xff\xd7\x03K\x00\ +\x9f\xff\xec\x03K\x00\xc2\xff\xd7\x03K\x00\xc4\xff\xd7\x03\ +K\x00\xc6\xff\xd7\x03K\x01$\xff\xc3\x03K\x01&\xff\ +\xc3\x03K\x016\xff\xec\x03K\x018\xff\xec\x03K\x01\ +:\xff\xec\x03K\x01;\xff\xec\x03K\x01=\xff\xec\x03\ +K\x01?\xff\xec\x03K\x01C\xff\xd7\x03K\x01\xa0\xff\ +\xec\x03K\x01\xfa\xff\xec\x03K\x01\xfc\xff\xec\x03K\x01\ +\xfe\xff\xec\x03K\x02\x00\xff\xec\x03K\x02\x08\xff\xae\x03\ +K\x02\x0c\xff\xae\x03K\x02X\xff\xd7\x03K\x03\x1d\xff\ +\xd7\x03K\x03\x1f\xff\xd7\x03K\x03!\xff\xd7\x03K\x03\ +#\xff\xd7\x03K\x03%\xff\xd7\x03K\x03'\xff\xd7\x03\ +K\x03)\xff\xd7\x03K\x03+\xff\xd7\x03K\x03-\xff\ +\xd7\x03K\x03/\xff\xd7\x03K\x031\xff\xd7\x03K\x03\ +3\xff\xd7\x03K\x03o\xff\xec\x03K\x03q\xff\xec\x03\ +K\x03s\xff\xec\x03K\x03\x8f\xff\xc3\x03L\x00\x05\xff\ +\xec\x03L\x00\x0a\xff\xec\x03L\x00Y\xff\xd7\x03L\x00\ +Z\xff\xd7\x03L\x00[\xff\xd7\x03L\x00\x5c\xff\xd7\x03\ +L\x00]\xff\xec\x03L\x00\xbf\xff\xd7\x03L\x017\xff\ +\xd7\x03L\x01<\xff\xec\x03L\x01>\xff\xec\x03L\x01\ +@\xff\xec\x03L\x01\xfb\xff\xd7\x03L\x01\xfd\xff\xd7\x03\ +L\x02\x07\xff\xec\x03L\x02\x0b\xff\xec\x03L\x03p\xff\ +\xd7\x03M\x00\x0f\xff\xae\x03M\x00\x11\xff\xae\x03M\x00\ +$\xff\xd7\x03M\x007\xff\xc3\x03M\x009\xff\xec\x03\ +M\x00:\xff\xec\x03M\x00;\xff\xd7\x03M\x00<\xff\ +\xec\x03M\x00=\xff\xec\x03M\x00\x82\xff\xd7\x03M\x00\ +\x83\xff\xd7\x03M\x00\x84\xff\xd7\x03M\x00\x85\xff\xd7\x03\ +M\x00\x86\xff\xd7\x03M\x00\x87\xff\xd7\x03M\x00\x9f\xff\ +\xec\x03M\x00\xc2\xff\xd7\x03M\x00\xc4\xff\xd7\x03M\x00\ +\xc6\xff\xd7\x03M\x01$\xff\xc3\x03M\x01&\xff\xc3\x03\ +M\x016\xff\xec\x03M\x018\xff\xec\x03M\x01:\xff\ +\xec\x03M\x01;\xff\xec\x03M\x01=\xff\xec\x03M\x01\ +?\xff\xec\x03M\x01C\xff\xd7\x03M\x01\xa0\xff\xec\x03\ +M\x01\xfa\xff\xec\x03M\x01\xfc\xff\xec\x03M\x01\xfe\xff\ +\xec\x03M\x02\x00\xff\xec\x03M\x02\x08\xff\xae\x03M\x02\ +\x0c\xff\xae\x03M\x02X\xff\xd7\x03M\x03\x1d\xff\xd7\x03\ +M\x03\x1f\xff\xd7\x03M\x03!\xff\xd7\x03M\x03#\xff\ +\xd7\x03M\x03%\xff\xd7\x03M\x03'\xff\xd7\x03M\x03\ +)\xff\xd7\x03M\x03+\xff\xd7\x03M\x03-\xff\xd7\x03\ +M\x03/\xff\xd7\x03M\x031\xff\xd7\x03M\x033\xff\ +\xd7\x03M\x03o\xff\xec\x03M\x03q\xff\xec\x03M\x03\ +s\xff\xec\x03M\x03\x8f\xff\xc3\x03O\x00\x0f\xff\xae\x03\ +O\x00\x11\xff\xae\x03O\x00$\xff\xd7\x03O\x007\xff\ +\xc3\x03O\x009\xff\xec\x03O\x00:\xff\xec\x03O\x00\ +;\xff\xd7\x03O\x00<\xff\xec\x03O\x00=\xff\xec\x03\ +O\x00\x82\xff\xd7\x03O\x00\x83\xff\xd7\x03O\x00\x84\xff\ +\xd7\x03O\x00\x85\xff\xd7\x03O\x00\x86\xff\xd7\x03O\x00\ +\x87\xff\xd7\x03O\x00\x9f\xff\xec\x03O\x00\xc2\xff\xd7\x03\ +O\x00\xc4\xff\xd7\x03O\x00\xc6\xff\xd7\x03O\x01$\xff\ +\xc3\x03O\x01&\xff\xc3\x03O\x016\xff\xec\x03O\x01\ +8\xff\xec\x03O\x01:\xff\xec\x03O\x01;\xff\xec\x03\ +O\x01=\xff\xec\x03O\x01?\xff\xec\x03O\x01C\xff\ +\xd7\x03O\x01\xa0\xff\xec\x03O\x01\xfa\xff\xec\x03O\x01\ +\xfc\xff\xec\x03O\x01\xfe\xff\xec\x03O\x02\x00\xff\xec\x03\ +O\x02\x08\xff\xae\x03O\x02\x0c\xff\xae\x03O\x02X\xff\ +\xd7\x03O\x03\x1d\xff\xd7\x03O\x03\x1f\xff\xd7\x03O\x03\ +!\xff\xd7\x03O\x03#\xff\xd7\x03O\x03%\xff\xd7\x03\ +O\x03'\xff\xd7\x03O\x03)\xff\xd7\x03O\x03+\xff\ +\xd7\x03O\x03-\xff\xd7\x03O\x03/\xff\xd7\x03O\x03\ +1\xff\xd7\x03O\x033\xff\xd7\x03O\x03o\xff\xec\x03\ +O\x03q\xff\xec\x03O\x03s\xff\xec\x03O\x03\x8f\xff\ +\xc3\x03Q\x00\x0f\xff\xae\x03Q\x00\x11\xff\xae\x03Q\x00\ +$\xff\xd7\x03Q\x007\xff\xc3\x03Q\x009\xff\xec\x03\ +Q\x00:\xff\xec\x03Q\x00;\xff\xd7\x03Q\x00<\xff\ +\xec\x03Q\x00=\xff\xec\x03Q\x00\x82\xff\xd7\x03Q\x00\ +\x83\xff\xd7\x03Q\x00\x84\xff\xd7\x03Q\x00\x85\xff\xd7\x03\ +Q\x00\x86\xff\xd7\x03Q\x00\x87\xff\xd7\x03Q\x00\x9f\xff\ +\xec\x03Q\x00\xc2\xff\xd7\x03Q\x00\xc4\xff\xd7\x03Q\x00\ +\xc6\xff\xd7\x03Q\x01$\xff\xc3\x03Q\x01&\xff\xc3\x03\ +Q\x016\xff\xec\x03Q\x018\xff\xec\x03Q\x01:\xff\ +\xec\x03Q\x01;\xff\xec\x03Q\x01=\xff\xec\x03Q\x01\ +?\xff\xec\x03Q\x01C\xff\xd7\x03Q\x01\xa0\xff\xec\x03\ +Q\x01\xfa\xff\xec\x03Q\x01\xfc\xff\xec\x03Q\x01\xfe\xff\ +\xec\x03Q\x02\x00\xff\xec\x03Q\x02\x08\xff\xae\x03Q\x02\ +\x0c\xff\xae\x03Q\x02X\xff\xd7\x03Q\x03\x1d\xff\xd7\x03\ +Q\x03\x1f\xff\xd7\x03Q\x03!\xff\xd7\x03Q\x03#\xff\ +\xd7\x03Q\x03%\xff\xd7\x03Q\x03'\xff\xd7\x03Q\x03\ +)\xff\xd7\x03Q\x03+\xff\xd7\x03Q\x03-\xff\xd7\x03\ +Q\x03/\xff\xd7\x03Q\x031\xff\xd7\x03Q\x033\xff\ +\xd7\x03Q\x03o\xff\xec\x03Q\x03q\xff\xec\x03Q\x03\ +s\xff\xec\x03Q\x03\x8f\xff\xc3\x03S\x00\x0f\xff\xae\x03\ +S\x00\x11\xff\xae\x03S\x00$\xff\xd7\x03S\x007\xff\ +\xc3\x03S\x009\xff\xec\x03S\x00:\xff\xec\x03S\x00\ +;\xff\xd7\x03S\x00<\xff\xec\x03S\x00=\xff\xec\x03\ +S\x00\x82\xff\xd7\x03S\x00\x83\xff\xd7\x03S\x00\x84\xff\ +\xd7\x03S\x00\x85\xff\xd7\x03S\x00\x86\xff\xd7\x03S\x00\ +\x87\xff\xd7\x03S\x00\x9f\xff\xec\x03S\x00\xc2\xff\xd7\x03\ +S\x00\xc4\xff\xd7\x03S\x00\xc6\xff\xd7\x03S\x01$\xff\ +\xc3\x03S\x01&\xff\xc3\x03S\x016\xff\xec\x03S\x01\ +8\xff\xec\x03S\x01:\xff\xec\x03S\x01;\xff\xec\x03\ +S\x01=\xff\xec\x03S\x01?\xff\xec\x03S\x01C\xff\ +\xd7\x03S\x01\xa0\xff\xec\x03S\x01\xfa\xff\xec\x03S\x01\ +\xfc\xff\xec\x03S\x01\xfe\xff\xec\x03S\x02\x00\xff\xec\x03\ +S\x02\x08\xff\xae\x03S\x02\x0c\xff\xae\x03S\x02X\xff\ +\xd7\x03S\x03\x1d\xff\xd7\x03S\x03\x1f\xff\xd7\x03S\x03\ +!\xff\xd7\x03S\x03#\xff\xd7\x03S\x03%\xff\xd7\x03\ +S\x03'\xff\xd7\x03S\x03)\xff\xd7\x03S\x03+\xff\ +\xd7\x03S\x03-\xff\xd7\x03S\x03/\xff\xd7\x03S\x03\ +1\xff\xd7\x03S\x033\xff\xd7\x03S\x03o\xff\xec\x03\ +S\x03q\xff\xec\x03S\x03s\xff\xec\x03S\x03\x8f\xff\ +\xc3\x03U\x00\x0f\xff\xae\x03U\x00\x11\xff\xae\x03U\x00\ +$\xff\xd7\x03U\x007\xff\xc3\x03U\x009\xff\xec\x03\ +U\x00:\xff\xec\x03U\x00;\xff\xd7\x03U\x00<\xff\ +\xec\x03U\x00=\xff\xec\x03U\x00\x82\xff\xd7\x03U\x00\ +\x83\xff\xd7\x03U\x00\x84\xff\xd7\x03U\x00\x85\xff\xd7\x03\ +U\x00\x86\xff\xd7\x03U\x00\x87\xff\xd7\x03U\x00\x9f\xff\ +\xec\x03U\x00\xc2\xff\xd7\x03U\x00\xc4\xff\xd7\x03U\x00\ +\xc6\xff\xd7\x03U\x01$\xff\xc3\x03U\x01&\xff\xc3\x03\ +U\x016\xff\xec\x03U\x018\xff\xec\x03U\x01:\xff\ +\xec\x03U\x01;\xff\xec\x03U\x01=\xff\xec\x03U\x01\ +?\xff\xec\x03U\x01C\xff\xd7\x03U\x01\xa0\xff\xec\x03\ +U\x01\xfa\xff\xec\x03U\x01\xfc\xff\xec\x03U\x01\xfe\xff\ +\xec\x03U\x02\x00\xff\xec\x03U\x02\x08\xff\xae\x03U\x02\ +\x0c\xff\xae\x03U\x02X\xff\xd7\x03U\x03\x1d\xff\xd7\x03\ +U\x03\x1f\xff\xd7\x03U\x03!\xff\xd7\x03U\x03#\xff\ +\xd7\x03U\x03%\xff\xd7\x03U\x03'\xff\xd7\x03U\x03\ +)\xff\xd7\x03U\x03+\xff\xd7\x03U\x03-\xff\xd7\x03\ +U\x03/\xff\xd7\x03U\x031\xff\xd7\x03U\x033\xff\ +\xd7\x03U\x03o\xff\xec\x03U\x03q\xff\xec\x03U\x03\ +s\xff\xec\x03U\x03\x8f\xff\xc3\x03X\x00I\x00R\x03\ +X\x00W\x00R\x03X\x00Y\x00f\x03X\x00Z\x00\ +f\x03X\x00[\x00f\x03X\x00\x5c\x00f\x03X\x00\ +\xbf\x00f\x03X\x01%\x00R\x03X\x01'\x00R\x03\ +X\x017\x00f\x03X\x01\xfb\x00f\x03X\x01\xfd\x00\ +f\x03X\x024\x00R\x03X\x025\x00R\x03X\x02\ +]\x00R\x03X\x02^\x00R\x03X\x03p\x00f\x03\ +X\x03\x8d\x00R\x03X\x03\x90\x00R\x03Z\x00I\x00\ +R\x03Z\x00W\x00R\x03Z\x00Y\x00f\x03Z\x00\ +Z\x00f\x03Z\x00[\x00f\x03Z\x00\x5c\x00f\x03\ +Z\x00\xbf\x00f\x03Z\x01%\x00R\x03Z\x01'\x00\ +R\x03Z\x017\x00f\x03Z\x01\xfb\x00f\x03Z\x01\ +\xfd\x00f\x03Z\x024\x00R\x03Z\x025\x00R\x03\ +Z\x02]\x00R\x03Z\x02^\x00R\x03Z\x03p\x00\ +f\x03Z\x03\x8d\x00R\x03Z\x03\x90\x00R\x03\x5c\x00\ +I\x00R\x03\x5c\x00W\x00R\x03\x5c\x00Y\x00f\x03\ +\x5c\x00Z\x00f\x03\x5c\x00[\x00f\x03\x5c\x00\x5c\x00\ +f\x03\x5c\x00\xbf\x00f\x03\x5c\x01%\x00R\x03\x5c\x01\ +'\x00R\x03\x5c\x017\x00f\x03\x5c\x01\xfb\x00f\x03\ +\x5c\x01\xfd\x00f\x03\x5c\x024\x00R\x03\x5c\x025\x00\ +R\x03\x5c\x02]\x00R\x03\x5c\x02^\x00R\x03\x5c\x03\ +p\x00f\x03\x5c\x03\x8d\x00R\x03\x5c\x03\x90\x00R\x03\ +^\x00I\x00R\x03^\x00W\x00R\x03^\x00Y\x00\ +f\x03^\x00Z\x00f\x03^\x00[\x00f\x03^\x00\ +\x5c\x00f\x03^\x00\xbf\x00f\x03^\x01%\x00R\x03\ +^\x01'\x00R\x03^\x017\x00f\x03^\x01\xfb\x00\ +f\x03^\x01\xfd\x00f\x03^\x024\x00R\x03^\x02\ +5\x00R\x03^\x02]\x00R\x03^\x02^\x00R\x03\ +^\x03p\x00f\x03^\x03\x8d\x00R\x03^\x03\x90\x00\ +R\x03`\x00I\x00R\x03`\x00W\x00R\x03`\x00\ +Y\x00f\x03`\x00Z\x00f\x03`\x00[\x00f\x03\ +`\x00\x5c\x00f\x03`\x00\xbf\x00f\x03`\x01%\x00\ +R\x03`\x01'\x00R\x03`\x017\x00f\x03`\x01\ +\xfb\x00f\x03`\x01\xfd\x00f\x03`\x024\x00R\x03\ +`\x025\x00R\x03`\x02]\x00R\x03`\x02^\x00\ +R\x03`\x03p\x00f\x03`\x03\x8d\x00R\x03`\x03\ +\x90\x00R\x03a\x00\x0f\xff\xd7\x03a\x00\x11\xff\xd7\x03\ +a\x00$\xff\xec\x03a\x00\x82\xff\xec\x03a\x00\x83\xff\ +\xec\x03a\x00\x84\xff\xec\x03a\x00\x85\xff\xec\x03a\x00\ +\x86\xff\xec\x03a\x00\x87\xff\xec\x03a\x00\xc2\xff\xec\x03\ +a\x00\xc4\xff\xec\x03a\x00\xc6\xff\xec\x03a\x01C\xff\ +\xec\x03a\x02\x08\xff\xd7\x03a\x02\x0c\xff\xd7\x03a\x02\ +X\xff\xec\x03a\x03\x1d\xff\xec\x03a\x03\x1f\xff\xec\x03\ +a\x03!\xff\xec\x03a\x03#\xff\xec\x03a\x03%\xff\ +\xec\x03a\x03'\xff\xec\x03a\x03)\xff\xec\x03a\x03\ ++\xff\xec\x03a\x03-\xff\xec\x03a\x03/\xff\xec\x03\ +a\x031\xff\xec\x03a\x033\xff\xec\x03f\x00I\x00\ +f\x03f\x00W\x00f\x03f\x00Y\x00f\x03f\x00\ +Z\x00f\x03f\x00[\x00f\x03f\x00\x5c\x00f\x03\ +f\x00\xbf\x00f\x03f\x01%\x00f\x03f\x01'\x00\ +f\x03f\x017\x00f\x03f\x01\xfb\x00f\x03f\x01\ +\xfd\x00f\x03f\x024\x00f\x03f\x025\x00f\x03\ +f\x02]\x00f\x03f\x02^\x00f\x03f\x03p\x00\ +f\x03f\x03\x8d\x00f\x03f\x03\x90\x00f\x03h\x00\ +I\x00f\x03h\x00W\x00f\x03h\x00Y\x00f\x03\ +h\x00Z\x00f\x03h\x00[\x00f\x03h\x00\x5c\x00\ +f\x03h\x00\xbf\x00f\x03h\x01%\x00f\x03h\x01\ +'\x00f\x03h\x017\x00f\x03h\x01\xfb\x00f\x03\ +h\x01\xfd\x00f\x03h\x024\x00f\x03h\x025\x00\ +f\x03h\x02]\x00f\x03h\x02^\x00f\x03h\x03\ +p\x00f\x03h\x03\x8d\x00f\x03h\x03\x90\x00f\x03\ +j\x00I\x00f\x03j\x00W\x00f\x03j\x00Y\x00\ +f\x03j\x00Z\x00f\x03j\x00[\x00f\x03j\x00\ +\x5c\x00f\x03j\x00\xbf\x00f\x03j\x01%\x00f\x03\ +j\x01'\x00f\x03j\x017\x00f\x03j\x01\xfb\x00\ +f\x03j\x01\xfd\x00f\x03j\x024\x00f\x03j\x02\ +5\x00f\x03j\x02]\x00f\x03j\x02^\x00f\x03\ +j\x03p\x00f\x03j\x03\x8d\x00f\x03j\x03\x90\x00\ +f\x03l\x00I\x00f\x03l\x00W\x00f\x03l\x00\ +Y\x00f\x03l\x00Z\x00f\x03l\x00[\x00f\x03\ +l\x00\x5c\x00f\x03l\x00\xbf\x00f\x03l\x01%\x00\ +f\x03l\x01'\x00f\x03l\x017\x00f\x03l\x01\ +\xfb\x00f\x03l\x01\xfd\x00f\x03l\x024\x00f\x03\ +l\x025\x00f\x03l\x02]\x00f\x03l\x02^\x00\ +f\x03l\x03p\x00f\x03l\x03\x8d\x00f\x03l\x03\ +\x90\x00f\x03n\x00I\x00f\x03n\x00W\x00f\x03\ +n\x00Y\x00f\x03n\x00Z\x00f\x03n\x00[\x00\ +f\x03n\x00\x5c\x00f\x03n\x00\xbf\x00f\x03n\x01\ +%\x00f\x03n\x01'\x00f\x03n\x017\x00f\x03\ +n\x01\xfb\x00f\x03n\x01\xfd\x00f\x03n\x024\x00\ +f\x03n\x025\x00f\x03n\x02]\x00f\x03n\x02\ +^\x00f\x03n\x03p\x00f\x03n\x03\x8d\x00f\x03\ +n\x03\x90\x00f\x03o\x00\x0f\xff\x85\x03o\x00\x11\xff\ +\x85\x03o\x00\x22\x00)\x03o\x00$\xff\x85\x03o\x00\ +&\xff\xd7\x03o\x00*\xff\xd7\x03o\x002\xff\xd7\x03\ +o\x004\xff\xd7\x03o\x00D\xff\x9a\x03o\x00F\xff\ +\x9a\x03o\x00G\xff\x9a\x03o\x00H\xff\x9a\x03o\x00\ +J\xff\xd7\x03o\x00P\xff\xc3\x03o\x00Q\xff\xc3\x03\ +o\x00R\xff\x9a\x03o\x00S\xff\xc3\x03o\x00T\xff\ +\x9a\x03o\x00U\xff\xc3\x03o\x00V\xff\xae\x03o\x00\ +X\xff\xc3\x03o\x00]\xff\xd7\x03o\x00\x82\xff\x85\x03\ +o\x00\x83\xff\x85\x03o\x00\x84\xff\x85\x03o\x00\x85\xff\ +\x85\x03o\x00\x86\xff\x85\x03o\x00\x87\xff\x85\x03o\x00\ +\x89\xff\xd7\x03o\x00\x94\xff\xd7\x03o\x00\x95\xff\xd7\x03\ +o\x00\x96\xff\xd7\x03o\x00\x97\xff\xd7\x03o\x00\x98\xff\ +\xd7\x03o\x00\x9a\xff\xd7\x03o\x00\xa2\xff\x9a\x03o\x00\ +\xa3\xff\x9a\x03o\x00\xa4\xff\x9a\x03o\x00\xa5\xff\x9a\x03\ +o\x00\xa6\xff\x9a\x03o\x00\xa7\xff\x9a\x03o\x00\xa8\xff\ +\x9a\x03o\x00\xa9\xff\x9a\x03o\x00\xaa\xff\x9a\x03o\x00\ +\xab\xff\x9a\x03o\x00\xac\xff\x9a\x03o\x00\xad\xff\x9a\x03\ +o\x00\xb4\xff\x9a\x03o\x00\xb5\xff\x9a\x03o\x00\xb6\xff\ +\x9a\x03o\x00\xb7\xff\x9a\x03o\x00\xb8\xff\x9a\x03o\x00\ +\xba\xff\x9a\x03o\x00\xbb\xff\xc3\x03o\x00\xbc\xff\xc3\x03\ +o\x00\xbd\xff\xc3\x03o\x00\xbe\xff\xc3\x03o\x00\xc2\xff\ +\x85\x03o\x00\xc3\xff\x9a\x03o\x00\xc4\xff\x85\x03o\x00\ +\xc5\xff\x9a\x03o\x00\xc6\xff\x85\x03o\x00\xc7\xff\x9a\x03\ +o\x00\xc8\xff\xd7\x03o\x00\xc9\xff\x9a\x03o\x00\xca\xff\ +\xd7\x03o\x00\xcb\xff\x9a\x03o\x00\xcc\xff\xd7\x03o\x00\ +\xcd\xff\x9a\x03o\x00\xce\xff\xd7\x03o\x00\xcf\xff\x9a\x03\ +o\x00\xd1\xff\x9a\x03o\x00\xd3\xff\x9a\x03o\x00\xd5\xff\ +\x9a\x03o\x00\xd7\xff\x9a\x03o\x00\xd9\xff\x9a\x03o\x00\ +\xdb\xff\x9a\x03o\x00\xdd\xff\x9a\x03o\x00\xde\xff\xd7\x03\ +o\x00\xdf\xff\xd7\x03o\x00\xe0\xff\xd7\x03o\x00\xe1\xff\ +\xd7\x03o\x00\xe2\xff\xd7\x03o\x00\xe3\xff\xd7\x03o\x00\ +\xe4\xff\xd7\x03o\x00\xe5\xff\xd7\x03o\x00\xfa\xff\xc3\x03\ +o\x01\x06\xff\xc3\x03o\x01\x08\xff\xc3\x03o\x01\x0d\xff\ +\xc3\x03o\x01\x0e\xff\xd7\x03o\x01\x0f\xff\x9a\x03o\x01\ +\x10\xff\xd7\x03o\x01\x11\xff\x9a\x03o\x01\x12\xff\xd7\x03\ +o\x01\x13\xff\x9a\x03o\x01\x14\xff\xd7\x03o\x01\x15\xff\ +\x9a\x03o\x01\x17\xff\xc3\x03o\x01\x19\xff\xc3\x03o\x01\ +\x1d\xff\xae\x03o\x01!\xff\xae\x03o\x01+\xff\xc3\x03\ +o\x01-\xff\xc3\x03o\x01/\xff\xc3\x03o\x011\xff\ +\xc3\x03o\x013\xff\xc3\x03o\x015\xff\xc3\x03o\x01\ +<\xff\xd7\x03o\x01>\xff\xd7\x03o\x01@\xff\xd7\x03\ +o\x01C\xff\x85\x03o\x01D\xff\x9a\x03o\x01F\xff\ +\x9a\x03o\x01G\xff\xd7\x03o\x01H\xff\x9a\x03o\x01\ +J\xff\xae\x03o\x02\x08\xff\x85\x03o\x02\x0c\xff\x85\x03\ +o\x02W\xff\xc3\x03o\x02X\xff\x85\x03o\x02Y\xff\ +\x9a\x03o\x02_\xff\xd7\x03o\x02`\xff\x9a\x03o\x02\ +b\xff\xc3\x03o\x03\x1d\xff\x85\x03o\x03\x1e\xff\x9a\x03\ +o\x03\x1f\xff\x85\x03o\x03 \xff\x9a\x03o\x03!\xff\ +\x85\x03o\x03\x22\xff\x9a\x03o\x03#\xff\x85\x03o\x03\ +%\xff\x85\x03o\x03&\xff\x9a\x03o\x03'\xff\x85\x03\ +o\x03(\xff\x9a\x03o\x03)\xff\x85\x03o\x03*\xff\ +\x9a\x03o\x03+\xff\x85\x03o\x03,\xff\x9a\x03o\x03\ +-\xff\x85\x03o\x03.\xff\x9a\x03o\x03/\xff\x85\x03\ +o\x030\xff\x9a\x03o\x031\xff\x85\x03o\x032\xff\ +\x9a\x03o\x033\xff\x85\x03o\x034\xff\x9a\x03o\x03\ +6\xff\x9a\x03o\x038\xff\x9a\x03o\x03:\xff\x9a\x03\ +o\x03<\xff\x9a\x03o\x03@\xff\x9a\x03o\x03B\xff\ +\x9a\x03o\x03D\xff\x9a\x03o\x03I\xff\xd7\x03o\x03\ +J\xff\x9a\x03o\x03K\xff\xd7\x03o\x03L\xff\x9a\x03\ +o\x03M\xff\xd7\x03o\x03N\xff\x9a\x03o\x03O\xff\ +\xd7\x03o\x03Q\xff\xd7\x03o\x03R\xff\x9a\x03o\x03\ +S\xff\xd7\x03o\x03T\xff\x9a\x03o\x03U\xff\xd7\x03\ +o\x03V\xff\x9a\x03o\x03W\xff\xd7\x03o\x03X\xff\ +\x9a\x03o\x03Y\xff\xd7\x03o\x03Z\xff\x9a\x03o\x03\ +[\xff\xd7\x03o\x03\x5c\xff\x9a\x03o\x03]\xff\xd7\x03\ +o\x03^\xff\x9a\x03o\x03_\xff\xd7\x03o\x03`\xff\ +\x9a\x03o\x03b\xff\xc3\x03o\x03d\xff\xc3\x03o\x03\ +f\xff\xc3\x03o\x03h\xff\xc3\x03o\x03j\xff\xc3\x03\ +o\x03l\xff\xc3\x03o\x03n\xff\xc3\x03p\x00\x05\x00\ +R\x03p\x00\x0a\x00R\x03p\x00\x0f\xff\xae\x03p\x00\ +\x11\xff\xae\x03p\x00\x22\x00)\x03p\x02\x07\x00R\x03\ +p\x02\x08\xff\xae\x03p\x02\x0b\x00R\x03p\x02\x0c\xff\ +\xae\x03q\x00\x0f\xff\x85\x03q\x00\x11\xff\x85\x03q\x00\ +\x22\x00)\x03q\x00$\xff\x85\x03q\x00&\xff\xd7\x03\ +q\x00*\xff\xd7\x03q\x002\xff\xd7\x03q\x004\xff\ +\xd7\x03q\x00D\xff\x9a\x03q\x00F\xff\x9a\x03q\x00\ +G\xff\x9a\x03q\x00H\xff\x9a\x03q\x00J\xff\xd7\x03\ +q\x00P\xff\xc3\x03q\x00Q\xff\xc3\x03q\x00R\xff\ +\x9a\x03q\x00S\xff\xc3\x03q\x00T\xff\x9a\x03q\x00\ +U\xff\xc3\x03q\x00V\xff\xae\x03q\x00X\xff\xc3\x03\ +q\x00]\xff\xd7\x03q\x00\x82\xff\x85\x03q\x00\x83\xff\ +\x85\x03q\x00\x84\xff\x85\x03q\x00\x85\xff\x85\x03q\x00\ +\x86\xff\x85\x03q\x00\x87\xff\x85\x03q\x00\x89\xff\xd7\x03\ +q\x00\x94\xff\xd7\x03q\x00\x95\xff\xd7\x03q\x00\x96\xff\ +\xd7\x03q\x00\x97\xff\xd7\x03q\x00\x98\xff\xd7\x03q\x00\ +\x9a\xff\xd7\x03q\x00\xa2\xff\x9a\x03q\x00\xa3\xff\x9a\x03\ +q\x00\xa4\xff\x9a\x03q\x00\xa5\xff\x9a\x03q\x00\xa6\xff\ +\x9a\x03q\x00\xa7\xff\x9a\x03q\x00\xa8\xff\x9a\x03q\x00\ +\xa9\xff\x9a\x03q\x00\xaa\xff\x9a\x03q\x00\xab\xff\x9a\x03\ +q\x00\xac\xff\x9a\x03q\x00\xad\xff\x9a\x03q\x00\xb4\xff\ +\x9a\x03q\x00\xb5\xff\x9a\x03q\x00\xb6\xff\x9a\x03q\x00\ +\xb7\xff\x9a\x03q\x00\xb8\xff\x9a\x03q\x00\xba\xff\x9a\x03\ +q\x00\xbb\xff\xc3\x03q\x00\xbc\xff\xc3\x03q\x00\xbd\xff\ +\xc3\x03q\x00\xbe\xff\xc3\x03q\x00\xc2\xff\x85\x03q\x00\ +\xc3\xff\x9a\x03q\x00\xc4\xff\x85\x03q\x00\xc5\xff\x9a\x03\ +q\x00\xc6\xff\x85\x03q\x00\xc7\xff\x9a\x03q\x00\xc8\xff\ +\xd7\x03q\x00\xc9\xff\x9a\x03q\x00\xca\xff\xd7\x03q\x00\ +\xcb\xff\x9a\x03q\x00\xcc\xff\xd7\x03q\x00\xcd\xff\x9a\x03\ +q\x00\xce\xff\xd7\x03q\x00\xcf\xff\x9a\x03q\x00\xd1\xff\ +\x9a\x03q\x00\xd3\xff\x9a\x03q\x00\xd5\xff\x9a\x03q\x00\ +\xd7\xff\x9a\x03q\x00\xd9\xff\x9a\x03q\x00\xdb\xff\x9a\x03\ +q\x00\xdd\xff\x9a\x03q\x00\xde\xff\xd7\x03q\x00\xdf\xff\ +\xd7\x03q\x00\xe0\xff\xd7\x03q\x00\xe1\xff\xd7\x03q\x00\ +\xe2\xff\xd7\x03q\x00\xe3\xff\xd7\x03q\x00\xe4\xff\xd7\x03\ +q\x00\xe5\xff\xd7\x03q\x00\xfa\xff\xc3\x03q\x01\x06\xff\ +\xc3\x03q\x01\x08\xff\xc3\x03q\x01\x0d\xff\xc3\x03q\x01\ +\x0e\xff\xd7\x03q\x01\x0f\xff\x9a\x03q\x01\x10\xff\xd7\x03\ +q\x01\x11\xff\x9a\x03q\x01\x12\xff\xd7\x03q\x01\x13\xff\ +\x9a\x03q\x01\x14\xff\xd7\x03q\x01\x15\xff\x9a\x03q\x01\ +\x17\xff\xc3\x03q\x01\x19\xff\xc3\x03q\x01\x1d\xff\xae\x03\ +q\x01!\xff\xae\x03q\x01+\xff\xc3\x03q\x01-\xff\ +\xc3\x03q\x01/\xff\xc3\x03q\x011\xff\xc3\x03q\x01\ +3\xff\xc3\x03q\x015\xff\xc3\x03q\x01<\xff\xd7\x03\ +q\x01>\xff\xd7\x03q\x01@\xff\xd7\x03q\x01C\xff\ +\x85\x03q\x01D\xff\x9a\x03q\x01F\xff\x9a\x03q\x01\ +G\xff\xd7\x03q\x01H\xff\x9a\x03q\x01J\xff\xae\x03\ +q\x02\x08\xff\x85\x03q\x02\x0c\xff\x85\x03q\x02W\xff\ +\xc3\x03q\x02X\xff\x85\x03q\x02Y\xff\x9a\x03q\x02\ +_\xff\xd7\x03q\x02`\xff\x9a\x03q\x02b\xff\xc3\x03\ +q\x03\x1d\xff\x85\x03q\x03\x1e\xff\x9a\x03q\x03\x1f\xff\ +\x85\x03q\x03 \xff\x9a\x03q\x03!\xff\x85\x03q\x03\ +\x22\xff\x9a\x03q\x03#\xff\x85\x03q\x03%\xff\x85\x03\ +q\x03&\xff\x9a\x03q\x03'\xff\x85\x03q\x03(\xff\ +\x9a\x03q\x03)\xff\x85\x03q\x03*\xff\x9a\x03q\x03\ ++\xff\x85\x03q\x03,\xff\x9a\x03q\x03-\xff\x85\x03\ +q\x03.\xff\x9a\x03q\x03/\xff\x85\x03q\x030\xff\ +\x9a\x03q\x031\xff\x85\x03q\x032\xff\x9a\x03q\x03\ +3\xff\x85\x03q\x034\xff\x9a\x03q\x036\xff\x9a\x03\ +q\x038\xff\x9a\x03q\x03:\xff\x9a\x03q\x03<\xff\ +\x9a\x03q\x03@\xff\x9a\x03q\x03B\xff\x9a\x03q\x03\ +D\xff\x9a\x03q\x03I\xff\xd7\x03q\x03J\xff\x9a\x03\ +q\x03K\xff\xd7\x03q\x03L\xff\x9a\x03q\x03M\xff\ +\xd7\x03q\x03N\xff\x9a\x03q\x03O\xff\xd7\x03q\x03\ +Q\xff\xd7\x03q\x03R\xff\x9a\x03q\x03S\xff\xd7\x03\ +q\x03T\xff\x9a\x03q\x03U\xff\xd7\x03q\x03V\xff\ +\x9a\x03q\x03W\xff\xd7\x03q\x03X\xff\x9a\x03q\x03\ +Y\xff\xd7\x03q\x03Z\xff\x9a\x03q\x03[\xff\xd7\x03\ +q\x03\x5c\xff\x9a\x03q\x03]\xff\xd7\x03q\x03^\xff\ +\x9a\x03q\x03_\xff\xd7\x03q\x03`\xff\x9a\x03q\x03\ +b\xff\xc3\x03q\x03d\xff\xc3\x03q\x03f\xff\xc3\x03\ +q\x03h\xff\xc3\x03q\x03j\xff\xc3\x03q\x03l\xff\ +\xc3\x03q\x03n\xff\xc3\x03r\x00\x05\x00R\x03r\x00\ +\x0a\x00R\x03r\x00\x0f\xff\xae\x03r\x00\x11\xff\xae\x03\ +r\x00\x22\x00)\x03r\x02\x07\x00R\x03r\x02\x08\xff\ +\xae\x03r\x02\x0b\x00R\x03r\x02\x0c\xff\xae\x03s\x00\ +\x0f\xff\x85\x03s\x00\x11\xff\x85\x03s\x00\x22\x00)\x03\ +s\x00$\xff\x85\x03s\x00&\xff\xd7\x03s\x00*\xff\ +\xd7\x03s\x002\xff\xd7\x03s\x004\xff\xd7\x03s\x00\ +D\xff\x9a\x03s\x00F\xff\x9a\x03s\x00G\xff\x9a\x03\ +s\x00H\xff\x9a\x03s\x00J\xff\xd7\x03s\x00P\xff\ +\xc3\x03s\x00Q\xff\xc3\x03s\x00R\xff\x9a\x03s\x00\ +S\xff\xc3\x03s\x00T\xff\x9a\x03s\x00U\xff\xc3\x03\ +s\x00V\xff\xae\x03s\x00X\xff\xc3\x03s\x00]\xff\ +\xd7\x03s\x00\x82\xff\x85\x03s\x00\x83\xff\x85\x03s\x00\ +\x84\xff\x85\x03s\x00\x85\xff\x85\x03s\x00\x86\xff\x85\x03\ +s\x00\x87\xff\x85\x03s\x00\x89\xff\xd7\x03s\x00\x94\xff\ +\xd7\x03s\x00\x95\xff\xd7\x03s\x00\x96\xff\xd7\x03s\x00\ +\x97\xff\xd7\x03s\x00\x98\xff\xd7\x03s\x00\x9a\xff\xd7\x03\ +s\x00\xa2\xff\x9a\x03s\x00\xa3\xff\x9a\x03s\x00\xa4\xff\ +\x9a\x03s\x00\xa5\xff\x9a\x03s\x00\xa6\xff\x9a\x03s\x00\ +\xa7\xff\x9a\x03s\x00\xa8\xff\x9a\x03s\x00\xa9\xff\x9a\x03\ +s\x00\xaa\xff\x9a\x03s\x00\xab\xff\x9a\x03s\x00\xac\xff\ +\x9a\x03s\x00\xad\xff\x9a\x03s\x00\xb4\xff\x9a\x03s\x00\ +\xb5\xff\x9a\x03s\x00\xb6\xff\x9a\x03s\x00\xb7\xff\x9a\x03\ +s\x00\xb8\xff\x9a\x03s\x00\xba\xff\x9a\x03s\x00\xbb\xff\ +\xc3\x03s\x00\xbc\xff\xc3\x03s\x00\xbd\xff\xc3\x03s\x00\ +\xbe\xff\xc3\x03s\x00\xc2\xff\x85\x03s\x00\xc3\xff\x9a\x03\ +s\x00\xc4\xff\x85\x03s\x00\xc5\xff\x9a\x03s\x00\xc6\xff\ +\x85\x03s\x00\xc7\xff\x9a\x03s\x00\xc8\xff\xd7\x03s\x00\ +\xc9\xff\x9a\x03s\x00\xca\xff\xd7\x03s\x00\xcb\xff\x9a\x03\ +s\x00\xcc\xff\xd7\x03s\x00\xcd\xff\x9a\x03s\x00\xce\xff\ +\xd7\x03s\x00\xcf\xff\x9a\x03s\x00\xd1\xff\x9a\x03s\x00\ +\xd3\xff\x9a\x03s\x00\xd5\xff\x9a\x03s\x00\xd7\xff\x9a\x03\ +s\x00\xd9\xff\x9a\x03s\x00\xdb\xff\x9a\x03s\x00\xdd\xff\ +\x9a\x03s\x00\xde\xff\xd7\x03s\x00\xdf\xff\xd7\x03s\x00\ +\xe0\xff\xd7\x03s\x00\xe1\xff\xd7\x03s\x00\xe2\xff\xd7\x03\ +s\x00\xe3\xff\xd7\x03s\x00\xe4\xff\xd7\x03s\x00\xe5\xff\ +\xd7\x03s\x00\xfa\xff\xc3\x03s\x01\x06\xff\xc3\x03s\x01\ +\x08\xff\xc3\x03s\x01\x0d\xff\xc3\x03s\x01\x0e\xff\xd7\x03\ +s\x01\x0f\xff\x9a\x03s\x01\x10\xff\xd7\x03s\x01\x11\xff\ +\x9a\x03s\x01\x12\xff\xd7\x03s\x01\x13\xff\x9a\x03s\x01\ +\x14\xff\xd7\x03s\x01\x15\xff\x9a\x03s\x01\x17\xff\xc3\x03\ +s\x01\x19\xff\xc3\x03s\x01\x1d\xff\xae\x03s\x01!\xff\ +\xae\x03s\x01+\xff\xc3\x03s\x01-\xff\xc3\x03s\x01\ +/\xff\xc3\x03s\x011\xff\xc3\x03s\x013\xff\xc3\x03\ +s\x015\xff\xc3\x03s\x01<\xff\xd7\x03s\x01>\xff\ +\xd7\x03s\x01@\xff\xd7\x03s\x01C\xff\x85\x03s\x01\ +D\xff\x9a\x03s\x01F\xff\x9a\x03s\x01G\xff\xd7\x03\ +s\x01H\xff\x9a\x03s\x01J\xff\xae\x03s\x02\x08\xff\ +\x85\x03s\x02\x0c\xff\x85\x03s\x02W\xff\xc3\x03s\x02\ +X\xff\x85\x03s\x02Y\xff\x9a\x03s\x02_\xff\xd7\x03\ +s\x02`\xff\x9a\x03s\x02b\xff\xc3\x03s\x03\x1d\xff\ +\x85\x03s\x03\x1e\xff\x9a\x03s\x03\x1f\xff\x85\x03s\x03\ + \xff\x9a\x03s\x03!\xff\x85\x03s\x03\x22\xff\x9a\x03\ +s\x03#\xff\x85\x03s\x03%\xff\x85\x03s\x03&\xff\ +\x9a\x03s\x03'\xff\x85\x03s\x03(\xff\x9a\x03s\x03\ +)\xff\x85\x03s\x03*\xff\x9a\x03s\x03+\xff\x85\x03\ +s\x03,\xff\x9a\x03s\x03-\xff\x85\x03s\x03.\xff\ +\x9a\x03s\x03/\xff\x85\x03s\x030\xff\x9a\x03s\x03\ +1\xff\x85\x03s\x032\xff\x9a\x03s\x033\xff\x85\x03\ +s\x034\xff\x9a\x03s\x036\xff\x9a\x03s\x038\xff\ +\x9a\x03s\x03:\xff\x9a\x03s\x03<\xff\x9a\x03s\x03\ +@\xff\x9a\x03s\x03B\xff\x9a\x03s\x03D\xff\x9a\x03\ +s\x03I\xff\xd7\x03s\x03J\xff\x9a\x03s\x03K\xff\ +\xd7\x03s\x03L\xff\x9a\x03s\x03M\xff\xd7\x03s\x03\ +N\xff\x9a\x03s\x03O\xff\xd7\x03s\x03Q\xff\xd7\x03\ +s\x03R\xff\x9a\x03s\x03S\xff\xd7\x03s\x03T\xff\ +\x9a\x03s\x03U\xff\xd7\x03s\x03V\xff\x9a\x03s\x03\ +W\xff\xd7\x03s\x03X\xff\x9a\x03s\x03Y\xff\xd7\x03\ +s\x03Z\xff\x9a\x03s\x03[\xff\xd7\x03s\x03\x5c\xff\ +\x9a\x03s\x03]\xff\xd7\x03s\x03^\xff\x9a\x03s\x03\ +_\xff\xd7\x03s\x03`\xff\x9a\x03s\x03b\xff\xc3\x03\ +s\x03d\xff\xc3\x03s\x03f\xff\xc3\x03s\x03h\xff\ +\xc3\x03s\x03j\xff\xc3\x03s\x03l\xff\xc3\x03s\x03\ +n\xff\xc3\x03t\x00\x05\x00R\x03t\x00\x0a\x00R\x03\ +t\x00\x0f\xff\xae\x03t\x00\x11\xff\xae\x03t\x00\x22\x00\ +)\x03t\x02\x07\x00R\x03t\x02\x08\xff\xae\x03t\x02\ +\x0b\x00R\x03t\x02\x0c\xff\xae\x03\x8d\x00\x05\x00{\x03\ +\x8d\x00\x0a\x00{\x03\x8d\x02\x07\x00{\x03\x8d\x02\x0b\x00\ +{\x03\x8f\x00\x0f\xff\x85\x03\x8f\x00\x10\xff\xae\x03\x8f\x00\ +\x11\xff\x85\x03\x8f\x00\x22\x00)\x03\x8f\x00$\xffq\x03\ +\x8f\x00&\xff\xd7\x03\x8f\x00*\xff\xd7\x03\x8f\x002\xff\ +\xd7\x03\x8f\x004\xff\xd7\x03\x8f\x007\x00)\x03\x8f\x00\ +D\xff\x5c\x03\x8f\x00F\xffq\x03\x8f\x00G\xffq\x03\ +\x8f\x00H\xffq\x03\x8f\x00J\xffq\x03\x8f\x00P\xff\ +\x9a\x03\x8f\x00Q\xff\x9a\x03\x8f\x00R\xffq\x03\x8f\x00\ +S\xff\x9a\x03\x8f\x00T\xffq\x03\x8f\x00U\xff\x9a\x03\ +\x8f\x00V\xff\x85\x03\x8f\x00X\xff\x9a\x03\x8f\x00Y\xff\ +\xd7\x03\x8f\x00Z\xff\xd7\x03\x8f\x00[\xff\xd7\x03\x8f\x00\ +\x5c\xff\xd7\x03\x8f\x00]\xff\xae\x03\x8f\x00\x82\xffq\x03\ +\x8f\x00\x83\xffq\x03\x8f\x00\x84\xffq\x03\x8f\x00\x85\xff\ +q\x03\x8f\x00\x86\xffq\x03\x8f\x00\x87\xffq\x03\x8f\x00\ +\x89\xff\xd7\x03\x8f\x00\x94\xff\xd7\x03\x8f\x00\x95\xff\xd7\x03\ +\x8f\x00\x96\xff\xd7\x03\x8f\x00\x97\xff\xd7\x03\x8f\x00\x98\xff\ +\xd7\x03\x8f\x00\x9a\xff\xd7\x03\x8f\x00\xa2\xffq\x03\x8f\x00\ +\xa3\xff\x5c\x03\x8f\x00\xa4\xff\x5c\x03\x8f\x00\xa5\xff\x5c\x03\ +\x8f\x00\xa6\xff\x5c\x03\x8f\x00\xa7\xff\x5c\x03\x8f\x00\xa8\xff\ +\x5c\x03\x8f\x00\xa9\xffq\x03\x8f\x00\xaa\xffq\x03\x8f\x00\ +\xab\xffq\x03\x8f\x00\xac\xffq\x03\x8f\x00\xad\xffq\x03\ +\x8f\x00\xb4\xffq\x03\x8f\x00\xb5\xffq\x03\x8f\x00\xb6\xff\ +q\x03\x8f\x00\xb7\xffq\x03\x8f\x00\xb8\xffq\x03\x8f\x00\ +\xba\xffq\x03\x8f\x00\xbb\xff\x9a\x03\x8f\x00\xbc\xff\x9a\x03\ +\x8f\x00\xbd\xff\x9a\x03\x8f\x00\xbe\xff\x9a\x03\x8f\x00\xbf\xff\ +\xd7\x03\x8f\x00\xc2\xffq\x03\x8f\x00\xc3\xff\x5c\x03\x8f\x00\ +\xc4\xffq\x03\x8f\x00\xc5\xff\x5c\x03\x8f\x00\xc6\xffq\x03\ +\x8f\x00\xc7\xff\x5c\x03\x8f\x00\xc8\xff\xd7\x03\x8f\x00\xc9\xff\ +q\x03\x8f\x00\xca\xff\xd7\x03\x8f\x00\xcb\xffq\x03\x8f\x00\ +\xcc\xff\xd7\x03\x8f\x00\xcd\xffq\x03\x8f\x00\xce\xff\xd7\x03\ +\x8f\x00\xcf\xffq\x03\x8f\x00\xd1\xffq\x03\x8f\x00\xd3\xff\ +q\x03\x8f\x00\xd5\xffq\x03\x8f\x00\xd7\xffq\x03\x8f\x00\ +\xd9\xffq\x03\x8f\x00\xdb\xffq\x03\x8f\x00\xdd\xffq\x03\ +\x8f\x00\xde\xff\xd7\x03\x8f\x00\xdf\xffq\x03\x8f\x00\xe0\xff\ +\xd7\x03\x8f\x00\xe1\xffq\x03\x8f\x00\xe2\xff\xd7\x03\x8f\x00\ +\xe3\xffq\x03\x8f\x00\xe4\xff\xd7\x03\x8f\x00\xe5\xffq\x03\ +\x8f\x00\xfa\xff\x9a\x03\x8f\x01\x06\xff\x9a\x03\x8f\x01\x08\xff\ +\x9a\x03\x8f\x01\x0d\xff\x9a\x03\x8f\x01\x0e\xff\xd7\x03\x8f\x01\ +\x0f\xffq\x03\x8f\x01\x10\xff\xd7\x03\x8f\x01\x11\xffq\x03\ +\x8f\x01\x12\xff\xd7\x03\x8f\x01\x13\xffq\x03\x8f\x01\x14\xff\ +\xd7\x03\x8f\x01\x15\xffq\x03\x8f\x01\x17\xff\x9a\x03\x8f\x01\ +\x19\xff\x9a\x03\x8f\x01\x1d\xff\x85\x03\x8f\x01!\xff\x85\x03\ +\x8f\x01$\x00)\x03\x8f\x01&\x00)\x03\x8f\x01+\xff\ +\x9a\x03\x8f\x01-\xff\x9a\x03\x8f\x01/\xff\x9a\x03\x8f\x01\ +1\xff\x9a\x03\x8f\x013\xff\x9a\x03\x8f\x015\xff\x9a\x03\ +\x8f\x017\xff\xd7\x03\x8f\x01<\xff\xae\x03\x8f\x01>\xff\ +\xae\x03\x8f\x01@\xff\xae\x03\x8f\x01C\xffq\x03\x8f\x01\ +D\xff\x5c\x03\x8f\x01F\xff\x5c\x03\x8f\x01G\xff\xd7\x03\ +\x8f\x01H\xffq\x03\x8f\x01J\xff\x85\x03\x8f\x01\xfb\xff\ +\xd7\x03\x8f\x01\xfd\xff\xd7\x03\x8f\x02\x02\xff\xae\x03\x8f\x02\ +\x03\xff\xae\x03\x8f\x02\x04\xff\xae\x03\x8f\x02\x08\xff\x85\x03\ +\x8f\x02\x0c\xff\x85\x03\x8f\x02W\xff\x9a\x03\x8f\x02X\xff\ +q\x03\x8f\x02Y\xff\x5c\x03\x8f\x02_\xff\xd7\x03\x8f\x02\ +`\xffq\x03\x8f\x02b\xff\x9a\x03\x8f\x03\x1d\xffq\x03\ +\x8f\x03\x1e\xff\x5c\x03\x8f\x03\x1f\xffq\x03\x8f\x03 \xff\ +\x5c\x03\x8f\x03!\xffq\x03\x8f\x03\x22\xff\x5c\x03\x8f\x03\ +#\xffq\x03\x8f\x03%\xffq\x03\x8f\x03&\xff\x5c\x03\ +\x8f\x03'\xffq\x03\x8f\x03(\xff\x5c\x03\x8f\x03)\xff\ +q\x03\x8f\x03*\xff\x5c\x03\x8f\x03+\xffq\x03\x8f\x03\ +,\xff\x5c\x03\x8f\x03-\xffq\x03\x8f\x03.\xff\x5c\x03\ +\x8f\x03/\xffq\x03\x8f\x030\xff\x5c\x03\x8f\x031\xff\ +q\x03\x8f\x032\xff\x5c\x03\x8f\x033\xffq\x03\x8f\x03\ +4\xff\x5c\x03\x8f\x036\xffq\x03\x8f\x038\xffq\x03\ +\x8f\x03:\xffq\x03\x8f\x03<\xffq\x03\x8f\x03@\xff\ +q\x03\x8f\x03B\xffq\x03\x8f\x03D\xffq\x03\x8f\x03\ +I\xff\xd7\x03\x8f\x03J\xffq\x03\x8f\x03K\xff\xd7\x03\ +\x8f\x03L\xffq\x03\x8f\x03M\xff\xd7\x03\x8f\x03N\xff\ +q\x03\x8f\x03O\xff\xd7\x03\x8f\x03Q\xff\xd7\x03\x8f\x03\ +R\xffq\x03\x8f\x03S\xff\xd7\x03\x8f\x03T\xffq\x03\ +\x8f\x03U\xff\xd7\x03\x8f\x03V\xffq\x03\x8f\x03W\xff\ +\xd7\x03\x8f\x03X\xffq\x03\x8f\x03Y\xff\xd7\x03\x8f\x03\ +Z\xffq\x03\x8f\x03[\xff\xd7\x03\x8f\x03\x5c\xffq\x03\ +\x8f\x03]\xff\xd7\x03\x8f\x03^\xffq\x03\x8f\x03_\xff\ +\xd7\x03\x8f\x03`\xffq\x03\x8f\x03b\xff\x9a\x03\x8f\x03\ +d\xff\x9a\x03\x8f\x03f\xff\x9a\x03\x8f\x03h\xff\x9a\x03\ +\x8f\x03j\xff\x9a\x03\x8f\x03l\xff\x9a\x03\x8f\x03n\xff\ +\x9a\x03\x8f\x03p\xff\xd7\x03\x8f\x03\x8f\x00)\x03\x90\x00\ +\x05\x00)\x03\x90\x00\x0a\x00)\x03\x90\x02\x07\x00)\x03\ +\x90\x02\x0b\x00)\x00\x00\x00\x00\x00\x1a\x01>\x00\x01\x00\ +\x00\x00\x00\x00\x00\x009\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x09\x009\x00\x01\x00\x00\x00\x00\x00\x02\x00\x07\x00\ +B\x00\x01\x00\x00\x00\x00\x00\x03\x00\x1e\x00I\x00\x01\x00\ +\x00\x00\x00\x00\x04\x00\x09\x009\x00\x01\x00\x00\x00\x00\x00\ +\x05\x00\x0c\x00g\x00\x01\x00\x00\x00\x00\x00\x06\x00\x08\x00\ +s\x00\x01\x00\x00\x00\x00\x00\x07\x00R\x00{\x00\x01\x00\ +\x00\x00\x00\x00\x08\x00\x14\x00\xcd\x00\x01\x00\x00\x00\x00\x00\ +\x0b\x00\x1c\x00\xe1\x00\x01\x00\x00\x00\x00\x00\x0c\x00.\x00\ +\xfd\x00\x01\x00\x00\x00\x00\x00\x0d\x00.\x01+\x00\x01\x00\ +\x00\x00\x00\x00\x0e\x00*\x01Y\x00\x03\x00\x01\x04\x09\x00\ +\x00\x00r\x01\x83\x00\x03\x00\x01\x04\x09\x00\x01\x00\x12\x01\ +\xf5\x00\x03\x00\x01\x04\x09\x00\x02\x00\x0e\x02\x07\x00\x03\x00\ +\x01\x04\x09\x00\x03\x00<\x02\x15\x00\x03\x00\x01\x04\x09\x00\ +\x04\x00\x12\x01\xf5\x00\x03\x00\x01\x04\x09\x00\x05\x00\x18\x02\ +Q\x00\x03\x00\x01\x04\x09\x00\x06\x00\x10\x02i\x00\x03\x00\ +\x01\x04\x09\x00\x07\x00\xa4\x02y\x00\x03\x00\x01\x04\x09\x00\ +\x08\x00(\x03\x1d\x00\x03\x00\x01\x04\x09\x00\x0b\x008\x03\ +E\x00\x03\x00\x01\x04\x09\x00\x0c\x00\x5c\x03}\x00\x03\x00\ +\x01\x04\x09\x00\x0d\x00\x5c\x03\xd9\x00\x03\x00\x01\x04\x09\x00\ +\x0e\x00T\x045Digitized d\ +ata copyright \xa9 \ +2010-2011, Googl\ +e Corporation.Op\ +en SansRegularAs\ +cender - Open Sa\ +ns Build 100Vers\ +ion 1.10OpenSans\ +Open Sans is a t\ +rademark of Goog\ +le and may be re\ +gistered in cert\ +ain jurisdiction\ +s.Ascender Corpo\ +rationhttp://www\ +.ascendercorp.co\ +m/http://www.asc\ +endercorp.com/ty\ +pedesigners.html\ +Licensed under t\ +he Apache Licens\ +e, Version 2.0ht\ +tp://www.apache.\ +org/licenses/LIC\ +ENSE-2.0\x00D\x00i\x00g\x00i\ +\x00t\x00i\x00z\x00e\x00d\x00 \x00d\x00a\ +\x00t\x00a\x00 \x00c\x00o\x00p\x00y\x00r\ +\x00i\x00g\x00h\x00t\x00 \x00\xa9\x00 \x002\ +\x000\x001\x000\x00-\x002\x000\x001\x001\ +\x00,\x00 \x00G\x00o\x00o\x00g\x00l\x00e\ +\x00 \x00C\x00o\x00r\x00p\x00o\x00r\x00a\ +\x00t\x00i\x00o\x00n\x00.\x00O\x00p\x00e\ +\x00n\x00 \x00S\x00a\x00n\x00s\x00R\x00e\ +\x00g\x00u\x00l\x00a\x00r\x00A\x00s\x00c\ +\x00e\x00n\x00d\x00e\x00r\x00 \x00-\x00 \ +\x00O\x00p\x00e\x00n\x00 \x00S\x00a\x00n\ +\x00s\x00 \x00B\x00u\x00i\x00l\x00d\x00 \ +\x001\x000\x000\x00V\x00e\x00r\x00s\x00i\ +\x00o\x00n\x00 \x001\x00.\x001\x000\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00O\ +\x00p\x00e\x00n\x00 \x00S\x00a\x00n\x00s\ +\x00 \x00i\x00s\x00 \x00a\x00 \x00t\x00r\ +\x00a\x00d\x00e\x00m\x00a\x00r\x00k\x00 \ +\x00o\x00f\x00 \x00G\x00o\x00o\x00g\x00l\ +\x00e\x00 \x00a\x00n\x00d\x00 \x00m\x00a\ +\x00y\x00 \x00b\x00e\x00 \x00r\x00e\x00g\ +\x00i\x00s\x00t\x00e\x00r\x00e\x00d\x00 \ +\x00i\x00n\x00 \x00c\x00e\x00r\x00t\x00a\ +\x00i\x00n\x00 \x00j\x00u\x00r\x00i\x00s\ +\x00d\x00i\x00c\x00t\x00i\x00o\x00n\x00s\ +\x00.\x00A\x00s\x00c\x00e\x00n\x00d\x00e\ +\x00r\x00 \x00C\x00o\x00r\x00p\x00o\x00r\ +\x00a\x00t\x00i\x00o\x00n\x00h\x00t\x00t\ +\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\ +\x00a\x00s\x00c\x00e\x00n\x00d\x00e\x00r\ +\x00c\x00o\x00r\x00p\x00.\x00c\x00o\x00m\ +\x00/\x00h\x00t\x00t\x00p\x00:\x00/\x00/\ +\x00w\x00w\x00w\x00.\x00a\x00s\x00c\x00e\ +\x00n\x00d\x00e\x00r\x00c\x00o\x00r\x00p\ +\x00.\x00c\x00o\x00m\x00/\x00t\x00y\x00p\ +\x00e\x00d\x00e\x00s\x00i\x00g\x00n\x00e\ +\x00r\x00s\x00.\x00h\x00t\x00m\x00l\x00L\ +\x00i\x00c\x00e\x00n\x00s\x00e\x00d\x00 \ +\x00u\x00n\x00d\x00e\x00r\x00 \x00t\x00h\ +\x00e\x00 \x00A\x00p\x00a\x00c\x00h\x00e\ +\x00 \x00L\x00i\x00c\x00e\x00n\x00s\x00e\ +\x00,\x00 \x00V\x00e\x00r\x00s\x00i\x00o\ +\x00n\x00 \x002\x00.\x000\x00h\x00t\x00t\ +\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\ +\x00a\x00p\x00a\x00c\x00h\x00e\x00.\x00o\ +\x00r\x00g\x00/\x00l\x00i\x00c\x00e\x00n\ +\x00s\x00e\x00s\x00/\x00L\x00I\x00C\x00E\ +\x00N\x00S\x00E\x00-\x002\x00.\x000\x00\x00\ +\x02\x00\x00\x00\x00\x00\x00\xfff\x00f\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\ +\xaa\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\ +\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\ +\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\ +\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\ +!\x01\x22\x01#\x01$\x01%\x01&\x01'\x01(\x01\ +)\x01*\x01+\x01,\x01-\x01.\x01/\x010\x01\ +1\x012\x013\x014\x015\x016\x017\x018\x01\ +9\x01:\x01;\x01<\x01=\x01>\x01?\x01@\x01\ +A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x01\ +I\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01\ +Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01\ +Y\x01Z\x01[\x01\x5c\x01]\x01^\x01_\x01`\x01\ +a\x01b\x01c\x01d\x01e\x01f\x01g\x01h\x01\ +i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01\ +q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01\ +y\x01z\x01{\x01|\x01}\x01~\x01\x7f\x01\x80\x01\ +\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\ +\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\ +\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\ +\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\ +\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\ +\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\ +\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\ +\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\ +\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\ +\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\ +\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\ +\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\ +\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\ +\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\ +\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\ +\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\ +\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\x07\x02\x08\x02\ +\x09\x02\x0a\x02\x0b\x02\x0c\x02\x0d\x02\x0e\x02\x0f\x02\x10\x02\ +\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\ +\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02\ +!\x02\x22\x02#\x02$\x02%\x02&\x02'\x02(\x02\ +)\x02*\x02+\x02,\x02-\x02.\x02/\x020\x02\ +1\x022\x023\x024\x025\x026\x027\x028\x02\ +9\x02:\x02;\x02<\x02=\x02>\x02?\x02@\x02\ +A\x02B\x02C\x02D\x02E\x02F\x02G\x02H\x02\ +I\x02J\x02K\x02L\x02M\x02N\x02O\x02P\x02\ +Q\x02R\x02S\x02T\x02U\x02V\x02W\x02X\x02\ +Y\x02Z\x02[\x02\x5c\x02]\x02^\x02_\x02`\x02\ +a\x02b\x02c\x02d\x02e\x02f\x02g\x02h\x02\ +i\x02j\x02k\x02l\x02m\x02n\x02o\x02p\x02\ +q\x02r\x02s\x02t\x02u\x02v\x02w\x02x\x02\ +y\x02z\x02{\x02|\x02}\x02~\x02\x7f\x02\x80\x02\ +\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\ +\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\ +\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\ +\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\ +\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\ +\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\ +\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\ +\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\ +\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\ +\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\ +\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\ +\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\ +\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\ +\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\ +\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\ +\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\ +\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\x07\x03\x08\x03\ +\x09\x03\x0a\x03\x0b\x03\x0c\x03\x0d\x03\x0e\x03\x0f\x03\x10\x03\ +\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\ +\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03\ +!\x03\x22\x03#\x03$\x03%\x03&\x03'\x03(\x03\ +)\x03*\x03+\x03,\x03-\x03.\x03/\x030\x03\ +1\x032\x033\x034\x035\x036\x037\x038\x03\ +9\x03:\x03;\x03<\x03=\x03>\x03?\x03@\x03\ +A\x03B\x03C\x03D\x03E\x03F\x03G\x03H\x03\ +I\x03J\x03K\x03L\x03M\x03N\x03O\x03P\x03\ +Q\x03R\x03S\x03T\x03U\x03V\x03W\x03X\x03\ +Y\x03Z\x03[\x03\x5c\x03]\x03^\x03_\x03`\x03\ +a\x03b\x03c\x03d\x03e\x03f\x03g\x03h\x03\ +i\x03j\x03k\x03l\x03m\x03n\x03o\x03p\x03\ +q\x03r\x03s\x03t\x03u\x03v\x03w\x03x\x03\ +y\x03z\x03{\x03|\x03}\x03~\x03\x7f\x03\x80\x03\ +\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\ +\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\ +\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\ +\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\ +\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\ +\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\ +\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\ +\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\ +\xc1\x03\xc2\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\ +\xc9\x03\xca\x03\xcb\x03\xcc\x03\xcd\x03\xce\x03\xcf\x03\xd0\x03\ +\xd1\x03\xd2\x03\xd3\x03\xd4\x03\xd5\x03\xd6\x03\xd7\x03\xd8\x03\ +\xd9\x03\xda\x03\xdb\x03\xdc\x03\xdd\x03\xde\x03\xdf\x03\xe0\x03\ +\xe1\x03\xe2\x03\xe3\x03\xe4\x03\xe5\x03\xe6\x03\xe7\x03\xe8\x03\ +\xe9\x03\xea\x03\xeb\x03\xec\x03\xed\x03\xee\x03\xef\x03\xf0\x03\ +\xf1\x03\xf2\x03\xf3\x03\xf4\x03\xf5\x03\xf6\x03\xf7\x03\xf8\x03\ +\xf9\x03\xfa\x03\xfb\x03\xfc\x03\xfd\x03\xfe\x03\xff\x04\x00\x04\ +\x01\x04\x02\x04\x03\x04\x04\x04\x05\x04\x06\x04\x07\x04\x08\x04\ +\x09\x04\x0a\x04\x0b\x04\x0c\x04\x0d\x04\x0e\x04\x0f\x04\x10\x04\ +\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x16\x04\x17\x04\x18\x04\ +\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04 \x04\ +!\x04\x22\x04#\x04$\x04%\x04&\x04'\x04(\x04\ +)\x04*\x04+\x04,\x04-\x04.\x04/\x040\x04\ +1\x042\x043\x044\x045\x046\x047\x048\x04\ +9\x04:\x04;\x04<\x04=\x04>\x04?\x04@\x04\ +A\x04B\x04C\x04D\x04E\x04F\x04G\x04H\x04\ +I\x04J\x04K\x04L\x04M\x04N\x04O\x04P\x04\ +Q\x04R\x04S\x04T\x04U\x04V\x04W\x04X\x04\ +Y\x04Z\x04[\x04\x5c\x04]\x04^\x04_\x04`\x04\ +a\x04b\x04c\x04d\x04e\x04f\x04g\x04h\x04\ +i\x04j\x04k\x04l\x04m\x04n\x04o\x04p\x04\ +q\x04r\x04s\x04t\x04u\x04v\x04w\x04x\x04\ +y\x04z\x04{\x04|\x04}\x04~\x04\x7f\x04\x80\x04\ +\x81\x04\x82\x04\x83\x04\x84\x04\x85\x04\x86\x04\x87\x04\x88\x04\ +\x89\x04\x8a\x04\x8b\x04\x8c\x04\x8d\x04\x8e\x04\x8f\x04\x90\x04\ +\x91\x04\x92\x04\x93\x04\x94\x04\x95\x04\x96\x04\x97\x04\x98\x04\ +\x99\x04\x9a\x04\x9b\x04\x9c\x04\x9d\x04\x9e\x04\x9f\x04\xa0\x04\ +\xa1\x04\xa2\x04\xa3\x04\xa4\x04\xa5\x04\xa6\x04\xa7\x04\xa8\x04\ +\xa9\x04\xaa\x04\xab\x07.notdef\x04nu\ +ll\x10nonmarkingret\ +urn\x05space\x06exclam\ +\x08quotedbl\x0anumber\ +sign\x06dollar\x07perc\ +ent\x09ampersand\x0bqu\ +otesingle\x09parenl\ +eft\x0aparenright\x08a\ +sterisk\x04plus\x05com\ +ma\x06hyphen\x06period\ +\x05slash\x04zero\x03one\x03\ +two\x05three\x04four\x04f\ +ive\x03six\x05seven\x05ei\ +ght\x04nine\x05colon\x09s\ +emicolon\x04less\x05eq\ +ual\x07greater\x08ques\ +tion\x02at\x01A\x01B\x01C\x01D\x01\ +E\x01F\x01G\x01H\x05I.alt\x01J\x01\ +K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01\ +S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x0b\ +bracketleft\x09back\ +slash\x0cbracketrig\ +ht\x0basciicircum\x0au\ +nderscore\x05grave\x01\ +a\x01b\x01c\x01d\x01e\x01f\x01g\x01h\x01\ +i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01\ +q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01\ +y\x01z\x09braceleft\x03ba\ +r\x0abraceright\x0aasc\ +iitilde\x10nonbreak\ +ingspace\x0aexclamd\ +own\x04cent\x08sterlin\ +g\x08currency\x03yen\x09b\ +rokenbar\x07section\ +\x08dieresis\x09copyri\ +ght\x0bordfeminine\x0d\ +guillemotleft\x0alo\ +gicalnot\x07uni00AD\ +\x0aregistered\x09over\ +score\x06degree\x09plu\ +sminus\x0btwosuperi\ +or\x0dthreesuperior\ +\x05acute\x02mu\x09paragr\ +aph\x0eperiodcenter\ +ed\x07cedilla\x0bonesu\ +perior\x0cordmascul\ +ine\x0eguillemotrig\ +ht\x0aonequarter\x07on\ +ehalf\x0dthreequart\ +ers\x0cquestiondown\ +\x06Agrave\x06Aacute\x0bA\ +circumflex\x06Atild\ +e\x09Adieresis\x05Arin\ +g\x02AE\x08Ccedilla\x06Eg\ +rave\x06Eacute\x0bEcir\ +cumflex\x09Edieresi\ +s\x0aIgrave.alt\x0aIac\ +ute.alt\x0fIcircumf\ +lex.alt\x0dIdieresi\ +s.alt\x03Eth\x06Ntilde\ +\x06Ograve\x06Oacute\x0bO\ +circumflex\x06Otild\ +e\x09Odieresis\x08mult\ +iply\x06Oslash\x06Ugra\ +ve\x06Uacute\x0bUcircu\ +mflex\x09Udieresis\x06\ +Yacute\x05Thorn\x0ager\ +mandbls\x06agrave\x06a\ +acute\x0bacircumfle\ +x\x06atilde\x09adieres\ +is\x05aring\x02ae\x08cced\ +illa\x06egrave\x06eacu\ +te\x0becircumflex\x09e\ +dieresis\x06igrave\x06\ +iacute\x0bicircumfl\ +ex\x09idieresis\x03eth\ +\x06ntilde\x06ograve\x06o\ +acute\x0bocircumfle\ +x\x06otilde\x09odieres\ +is\x06divide\x06oslash\ +\x06ugrave\x06uacute\x0bu\ +circumflex\x09udier\ +esis\x06yacute\x05thor\ +n\x09ydieresis\x07Amac\ +ron\x07amacron\x06Abre\ +ve\x06abreve\x07Aogone\ +k\x07aogonek\x06Cacute\ +\x06cacute\x0bCcircumf\ +lex\x0bccircumflex\x04\ +Cdot\x04cdot\x06Ccaron\ +\x06ccaron\x06Dcaron\x06d\ +caron\x06Dcroat\x06dcr\ +oat\x07Emacron\x07emac\ +ron\x06Ebreve\x06ebrev\ +e\x0aEdotaccent\x0aedo\ +taccent\x07Eogonek\x07\ +eogonek\x06Ecaron\x06e\ +caron\x0bGcircumfle\ +x\x0bgcircumflex\x06Gb\ +reve\x06gbreve\x04Gdot\ +\x04gdot\x0cGcommaacce\ +nt\x0cgcommaaccent\x0b\ +Hcircumflex\x0bhcir\ +cumflex\x04Hbar\x04hba\ +r\x0aItilde.alt\x06iti\ +lde\x0bImacron.alt\x07\ +imacron\x0aIbreve.a\ +lt\x06ibreve\x0bIogone\ +k.alt\x07iogonek\x0eId\ +otaccent.alt\x08dot\ +lessi\x06IJ.alt\x02ij\x0b\ +Jcircumflex\x0bjcir\ +cumflex\x0cKcommaac\ +cent\x0ckcommaaccen\ +t\x0ckgreenlandic\x06L\ +acute\x06lacute\x0cLco\ +mmaaccent\x0clcomma\ +accent\x06Lcaron\x06lc\ +aron\x04Ldot\x04ldot\x06L\ +slash\x06lslash\x06Nac\ +ute\x06nacute\x0cNcomm\ +aaccent\x0cncommaac\ +cent\x06Ncaron\x06ncar\ +on\x0bnapostrophe\x03E\ +ng\x03eng\x07Omacron\x07o\ +macron\x06Obreve\x06ob\ +reve\x0dOhungarumla\ +ut\x0dohungarumlaut\ +\x02OE\x02oe\x06Racute\x06ra\ +cute\x0cRcommaaccen\ +t\x0crcommaaccent\x06R\ +caron\x06rcaron\x06Sac\ +ute\x06sacute\x0bScirc\ +umflex\x0bscircumfl\ +ex\x08Scedilla\x08sced\ +illa\x06Scaron\x06scar\ +on\x0cTcommaaccent\x0c\ +tcommaaccent\x06Tca\ +ron\x06tcaron\x04Tbar\x04\ +tbar\x06Utilde\x06util\ +de\x07Umacron\x07umacr\ +on\x06Ubreve\x06ubreve\ +\x05Uring\x05uring\x0dUhu\ +ngarumlaut\x0duhung\ +arumlaut\x07Uogonek\ +\x07uogonek\x0bWcircum\ +flex\x0bwcircumflex\ +\x0bYcircumflex\x0byci\ +rcumflex\x09Ydieres\ +is\x06Zacute\x06zacute\ +\x0aZdotaccent\x0azdot\ +accent\x06Zcaron\x06zc\ +aron\x05longs\x06flori\ +n\x0aAringacute\x0aari\ +ngacute\x07AEacute\x07\ +aeacute\x0bOslashac\ +ute\x0boslashacute\x0c\ +Scommaaccent\x0csco\ +mmaaccent\x0acircum\ +flex\x05caron\x06macro\ +n\x05breve\x09dotaccen\ +t\x04ring\x06ogonek\x05ti\ +lde\x0chungarumlaut\ +\x05tonos\x0ddieresist\ +onos\x0aAlphatonos\x09\ +anoteleia\x0cEpsilo\ +ntonos\x08Etatonos\x0d\ +Iotatonos.alt\x0cOm\ +icrontonos\x0cUpsil\ +ontonos\x0aOmegaton\ +os\x11iotadieresist\ +onos\x05Alpha\x04Beta\x05\ +Gamma\x07uni0394\x07Ep\ +silon\x04Zeta\x03Eta\x05T\ +heta\x08Iota.alt\x05Ka\ +ppa\x06Lambda\x02Mu\x02Nu\ +\x02Xi\x07Omicron\x02Pi\x03R\ +ho\x05Sigma\x03Tau\x07Ups\ +ilon\x03Phi\x03Chi\x03Psi\ +\x07uni03A9\x10Iotadie\ +resis.alt\x0fUpsilo\ +ndieresis\x0aalphat\ +onos\x0cepsilontono\ +s\x08etatonos\x09iotat\ +onos\x14upsilondier\ +esistonos\x05alpha\x04\ +beta\x05gamma\x05delta\ +\x07epsilon\x04zeta\x03et\ +a\x05theta\x04iota\x05kap\ +pa\x06lambda\x07uni03B\ +C\x02nu\x02xi\x07omicron\x02\ +pi\x03rho\x06sigma1\x05si\ +gma\x03tau\x07upsilon\x03\ +phi\x03chi\x03psi\x05omeg\ +a\x0ciotadieresis\x0fu\ +psilondieresis\x0co\ +microntonos\x0cupsi\ +lontonos\x0aomegato\ +nos\x09afii10023\x09af\ +ii10051\x09afii1005\ +2\x09afii10053\x09afii\ +10054\x0dafii10055.\ +alt\x0dafii10056.al\ +t\x09afii10057\x09afii\ +10058\x09afii10059\x09\ +afii10060\x09afii10\ +061\x09afii10062\x09af\ +ii10145\x09afii1001\ +7\x09afii10018\x09afii\ +10019\x09afii10020\x09\ +afii10021\x09afii10\ +022\x09afii10024\x09af\ +ii10025\x09afii1002\ +6\x09afii10027\x09afii\ +10028\x09afii10029\x09\ +afii10030\x09afii10\ +031\x09afii10032\x09af\ +ii10033\x09afii1003\ +4\x09afii10035\x09afii\ +10036\x09afii10037\x09\ +afii10038\x09afii10\ +039\x09afii10040\x09af\ +ii10041\x09afii1004\ +2\x09afii10043\x09afii\ +10044\x09afii10045\x09\ +afii10046\x09afii10\ +047\x09afii10048\x09af\ +ii10049\x09afii1006\ +5\x09afii10066\x09afii\ +10067\x09afii10068\x09\ +afii10069\x09afii10\ +070\x09afii10072\x09af\ +ii10073\x09afii1007\ +4\x09afii10075\x09afii\ +10076\x09afii10077\x09\ +afii10078\x09afii10\ +079\x09afii10080\x09af\ +ii10081\x09afii1008\ +2\x09afii10083\x09afii\ +10084\x09afii10085\x09\ +afii10086\x09afii10\ +087\x09afii10088\x09af\ +ii10089\x09afii1009\ +0\x09afii10091\x09afii\ +10092\x09afii10093\x09\ +afii10094\x09afii10\ +095\x09afii10096\x09af\ +ii10097\x09afii1007\ +1\x09afii10099\x09afii\ +10100\x09afii10101\x09\ +afii10102\x09afii10\ +103\x09afii10104\x09af\ +ii10105\x09afii1010\ +6\x09afii10107\x09afii\ +10108\x09afii10109\x09\ +afii10110\x09afii10\ +193\x09afii10050\x09af\ +ii10098\x06Wgrave\x06w\ +grave\x06Wacute\x06wac\ +ute\x09Wdieresis\x09wd\ +ieresis\x06Ygrave\x06y\ +grave\x06endash\x06emd\ +ash\x09afii00208\x0dun\ +derscoredbl\x09quot\ +eleft\x0aquoteright\ +\x0equotesinglbase\x0d\ +quotereversed\x0cqu\ +otedblleft\x0dquote\ +dblright\x0cquotedb\ +lbase\x06dagger\x09dag\ +gerdbl\x06bullet\x08el\ +lipsis\x0bperthousa\ +nd\x06minute\x06second\ +\x0dguilsinglleft\x0eg\ +uilsinglright\x09ex\ +clamdbl\x08fraction\ +\x09nsuperior\x05franc\ +\x09afii08941\x06peset\ +a\x04Euro\x09afii61248\ +\x09afii61289\x09afii6\ +1352\x09trademark\x05O\ +mega\x09estimated\x09o\ +neeighth\x0cthreeei\ +ghths\x0bfiveeighth\ +s\x0cseveneighths\x0bp\ +artialdiff\x05Delta\ +\x07product\x09summati\ +on\x05minus\x07radical\ +\x08infinity\x08integr\ +al\x0bapproxequal\x08n\ +otequal\x09lessequa\ +l\x0cgreaterequal\x07l\ +ozenge\x07uniFB01\x07u\ +niFB02\x0dcyrillicb\ +reve\x08dotlessj\x10ca\ +roncommaaccent\x0bc\ +ommaaccent\x11comma\ +accentrotate\x0czer\ +osuperior\x0cfoursu\ +perior\x0cfivesuper\ +ior\x0bsixsuperior\x0d\ +sevensuperior\x0dei\ +ghtsuperior\x0cnine\ +superior\x07uni2000\ +\x07uni2001\x07uni2002\ +\x07uni2003\x07uni2004\ +\x07uni2005\x07uni2006\ +\x07uni2007\x07uni2008\ +\x07uni2009\x07uni200A\ +\x07uni200B\x07uniFEFF\ +\x07uniFFFC\x07uniFFFD\ +\x07uni01F0\x07uni02BC\ +\x07uni03D1\x07uni03D2\ +\x07uni03D6\x07uni1E3E\ +\x07uni1E3F\x07uni1E00\ +\x07uni1E01\x07uni1F4D\ +\x07uni02F3\x09dasiaox\ +ia\x07uniFB03\x07uniFB\ +04\x05Ohorn\x05ohorn\x05U\ +horn\x05uhorn\x07uni03\ +00\x07uni0301\x07uni03\ +03\x04hook\x08dotbelow\ +\x07uni0400\x07uni040D\ +\x07uni0450\x07uni045D\ +\x07uni0460\x07uni0461\ +\x07uni0462\x07uni0463\ +\x07uni0464\x07uni0465\ +\x07uni0466\x07uni0467\ +\x07uni0468\x07uni0469\ +\x07uni046A\x07uni046B\ +\x07uni046C\x07uni046D\ +\x07uni046E\x07uni046F\ +\x07uni0470\x07uni0471\ +\x07uni0472\x07uni0473\ +\x07uni0474\x07uni0475\ +\x07uni0476\x07uni0477\ +\x07uni0478\x07uni0479\ +\x07uni047A\x07uni047B\ +\x07uni047C\x07uni047D\ +\x07uni047E\x07uni047F\ +\x07uni0480\x07uni0481\ +\x07uni0482\x07uni0483\ +\x07uni0484\x07uni0485\ +\x07uni0486\x07uni0488\ +\x07uni0489\x07uni048A\ +\x07uni048B\x07uni048C\ +\x07uni048D\x07uni048E\ +\x07uni048F\x07uni0492\ +\x07uni0493\x07uni0494\ +\x07uni0495\x07uni0496\ +\x07uni0497\x07uni0498\ +\x07uni0499\x07uni049A\ +\x07uni049B\x07uni049C\ +\x07uni049D\x07uni049E\ +\x07uni049F\x07uni04A0\ +\x07uni04A1\x07uni04A2\ +\x07uni04A3\x07uni04A4\ +\x07uni04A5\x07uni04A6\ +\x07uni04A7\x07uni04A8\ +\x07uni04A9\x07uni04AA\ +\x07uni04AB\x07uni04AC\ +\x07uni04AD\x07uni04AE\ +\x07uni04AF\x07uni04B0\ +\x07uni04B1\x07uni04B2\ +\x07uni04B3\x07uni04B4\ +\x07uni04B5\x07uni04B6\ +\x07uni04B7\x07uni04B8\ +\x07uni04B9\x07uni04BA\ +\x07uni04BB\x07uni04BC\ +\x07uni04BD\x07uni04BE\ +\x07uni04BF\x0buni04C0\ +.alt\x07uni04C1\x07uni\ +04C2\x07uni04C3\x07uni\ +04C4\x07uni04C5\x07uni\ +04C6\x07uni04C7\x07uni\ +04C8\x07uni04C9\x07uni\ +04CA\x07uni04CB\x07uni\ +04CC\x07uni04CD\x07uni\ +04CE\x0buni04CF.alt\ +\x07uni04D0\x07uni04D1\ +\x07uni04D2\x07uni04D3\ +\x07uni04D4\x07uni04D5\ +\x07uni04D6\x07uni04D7\ +\x07uni04D8\x07uni04D9\ +\x07uni04DA\x07uni04DB\ +\x07uni04DC\x07uni04DD\ +\x07uni04DE\x07uni04DF\ +\x07uni04E0\x07uni04E1\ +\x07uni04E2\x07uni04E3\ +\x07uni04E4\x07uni04E5\ +\x07uni04E6\x07uni04E7\ +\x07uni04E8\x07uni04E9\ +\x07uni04EA\x07uni04EB\ +\x07uni04EC\x07uni04ED\ +\x07uni04EE\x07uni04EF\ +\x07uni04F0\x07uni04F1\ +\x07uni04F2\x07uni04F3\ +\x07uni04F4\x07uni04F5\ +\x07uni04F6\x07uni04F7\ +\x07uni04F8\x07uni04F9\ +\x07uni04FA\x07uni04FB\ +\x07uni04FC\x07uni04FD\ +\x07uni04FE\x07uni04FF\ +\x07uni0500\x07uni0501\ +\x07uni0502\x07uni0503\ +\x07uni0504\x07uni0505\ +\x07uni0506\x07uni0507\ +\x07uni0508\x07uni0509\ +\x07uni050A\x07uni050B\ +\x07uni050C\x07uni050D\ +\x07uni050E\x07uni050F\ +\x07uni0510\x07uni0511\ +\x07uni0512\x07uni0513\ +\x07uni1EA0\x07uni1EA1\ +\x07uni1EA2\x07uni1EA3\ +\x07uni1EA4\x07uni1EA5\ +\x07uni1EA6\x07uni1EA7\ +\x07uni1EA8\x07uni1EA9\ +\x07uni1EAA\x07uni1EAB\ +\x07uni1EAC\x07uni1EAD\ +\x07uni1EAE\x07uni1EAF\ +\x07uni1EB0\x07uni1EB1\ +\x07uni1EB2\x07uni1EB3\ +\x07uni1EB4\x07uni1EB5\ +\x07uni1EB6\x07uni1EB7\ +\x07uni1EB8\x07uni1EB9\ +\x07uni1EBA\x07uni1EBB\ +\x07uni1EBC\x07uni1EBD\ +\x07uni1EBE\x07uni1EBF\ +\x07uni1EC0\x07uni1EC1\ +\x07uni1EC2\x07uni1EC3\ +\x07uni1EC4\x07uni1EC5\ +\x07uni1EC6\x07uni1EC7\ +\x0buni1EC8.alt\x07uni\ +1EC9\x0buni1ECA.alt\ +\x07uni1ECB\x07uni1ECC\ +\x07uni1ECD\x07uni1ECE\ +\x07uni1ECF\x07uni1ED0\ +\x07uni1ED1\x07uni1ED2\ +\x07uni1ED3\x07uni1ED4\ +\x07uni1ED5\x07uni1ED6\ +\x07uni1ED7\x07uni1ED8\ +\x07uni1ED9\x07uni1EDA\ +\x07uni1EDB\x07uni1EDC\ +\x07uni1EDD\x07uni1EDE\ +\x07uni1EDF\x07uni1EE0\ +\x07uni1EE1\x07uni1EE2\ +\x07uni1EE3\x07uni1EE4\ +\x07uni1EE5\x07uni1EE6\ +\x07uni1EE7\x07uni1EE8\ +\x07uni1EE9\x07uni1EEA\ +\x07uni1EEB\x07uni1EEC\ +\x07uni1EED\x07uni1EEE\ +\x07uni1EEF\x07uni1EF0\ +\x07uni1EF1\x07uni1EF4\ +\x07uni1EF5\x07uni1EF6\ +\x07uni1EF7\x07uni1EF8\ +\x07uni1EF9\x07uni20AB\ +\x07uni030F\x13circumf\ +lexacutecomb\x13cir\ +cumflexgravecomb\ +\x12circumflexhookc\ +omb\x13circumflexti\ +ldecomb\x0ebreveacu\ +tecomb\x0ebrevegrav\ +ecomb\x0dbrevehookc\ +omb\x0ebrevetildeco\ +mb\x10cyrillichookl\ +eft\x11cyrillicbigh\ +ookUC\x11cyrillicbi\ +ghookLC\x08one.pnum\ +\x07zero.os\x06one.os\x06\ +two.os\x08three.os\x07\ +four.os\x07five.os\x06\ +six.os\x08seven.os\x08\ +eight.os\x07nine.os\ +\x02ff\x07uni2120\x08Tced\ +illa\x08tcedilla\x05g.\ +alt\x0fgcircumflex.\ +alt\x0agbreve.alt\x08g\ +dot.alt\x10gcommaac\ +cent.alt\x01I\x06Igrav\ +e\x06Iacute\x0bIcircum\ +flex\x09Idieresis\x06I\ +tilde\x07Imacron\x06Ib\ +reve\x07Iogonek\x0aIdo\ +taccent\x02IJ\x09Iotat\ +onos\x04Iota\x0cIotadi\ +eresis\x09afii10055\ +\x09afii10056\x07uni04\ +C0\x07uni04CF\x07uni1E\ +C8\x07uni1ECA\x00\x00\x01\x00\x03\x00\ +\x08\x00\x0a\x00\x0d\x00\x07\xff\xff\x00\x0f\x00\x01\x00\x00\x00\ +\x0c\x00\x00\x00\x16\x00\x00\x00\x02\x00\x01\x00\x00\x03\xa9\x00\ +\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x0a\x004\x006\x00\x01latn\x00\x08\x00\x10\x00\ +\x02MOL \x00\x16ROM \x00\x1c\x00\x00\xff\ +\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x00n\x01\xe4\x00\x01l\ +atn\x00\x08\x00\x10\x00\x02MOL \x00(R\ +OM \x00B\x00\x00\xff\xff\x00\x09\x00\x03\x00\x08\x00\ +\x0b\x00\x00\x00\x0e\x00\x11\x00\x14\x00\x17\x00\x1a\x00\x00\xff\ +\xff\x00\x0a\x00\x04\x00\x06\x00\x09\x00\x0c\x00\x01\x00\x0f\x00\ +\x12\x00\x15\x00\x18\x00\x1b\x00\x00\xff\xff\x00\x0a\x00\x05\x00\ +\x07\x00\x0a\x00\x0d\x00\x02\x00\x10\x00\x13\x00\x16\x00\x19\x00\ +\x1c\x00\x1dliga\x00\xb0liga\x00\xb6l\ +iga\x00\xbclnum\x00\xc2lnum\x00\ +\xc8lnum\x00\xcelocl\x00\xd4loc\ +l\x00\xdaonum\x00\xe0onum\x00\xe8o\ +num\x00\xf0pnum\x00\xf8pnum\x00\ +\xfepnum\x01\x04salt\x01\x0asal\ +t\x01\x12salt\x01\x1ass01\x01\x22s\ +s01\x01*ss01\x012ss02\x01\ +:ss02\x01@ss02\x01Fss0\ +3\x01Lss03\x01Rss03\x01Xt\ +num\x01^tnum\x01ftnum\x01\ +n\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\ +\x01\x00\x09\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\ +\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x08\x00\x00\x00\x01\x00\ +\x08\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x01\x00\x04\x00\ +\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x0a\x00\x16\x00\x1e\x00&\x00\ +.\x006\x00>\x00F\x00N\x00V\x00^\x00\x01\x00\ +\x00\x00\x01\x00P\x00\x01\x00\x00\x00\x01\x00z\x00\x01\x00\ +\x00\x00\x01\x00\xaa\x00\x01\x00\x00\x00\x01\x00\xc6\x00\x01\x00\ +\x00\x00\x01\x00\xee\x00\x01\x00\x00\x00\x01\x00\xf4\x00\x01\x00\ +\x00\x00\x01\x01\x10\x00\x01\x00\x00\x00\x01\x01\x16\x00\x01\x00\ +\x00\x00\x01\x012\x00\x04\x00\x00\x00\x01\x01H\x00\x02\x00\ +\x10\x00\x05\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x00\x02\x00\ +\x05\x00J\x00J\x00\x00\x00\xdf\x00\xdf\x00\x01\x00\xe1\x00\ +\xe1\x00\x02\x00\xe3\x00\xe3\x00\x03\x00\xe5\x00\xe5\x00\x04\x00\ +\x02\x00.\x00\x14\x00,\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\ +\xea\x00\xec\x00\xee\x00\xf0\x00\xf2\x00\xf4\x01Z\x01g\x01\ +w\x01\xa1\x01\xa2\x02\xc9\x02\xd8\x03E\x03G\x00\x02\x00\ +\x01\x03\x96\x03\xa9\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\ +\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\ +\x8c\x00\x02\x00\x01\x00\x13\x00\x1c\x00\x00\x00\x02\x00\x1a\x00\ +\x0a\x03\x83\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\ +\x8b\x03\x8c\x03\x84\x00\x02\x00\x03\x00\x13\x00\x13\x00\x00\x00\ +\x15\x00\x1c\x00\x01\x03\x82\x03\x82\x00\x09\x00\x02\x00\x08\x00\ +\x01\x03\x82\x00\x01\x00\x01\x00\x14\x00\x02\x00\x1a\x00\x0a\x00\ +\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\ +\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\ +\x08\x00\x01\x00\x14\x00\x01\x00\x01\x03\x82\x00\x02\x00\x1a\x00\ +\x0a\x00\x13\x03\x82\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\ +\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\ +\x02\x00\x0e\x00\x04\x03\x8f\x03\x90\x01 \x01!\x00\x02\x00\ +\x02\x01$\x01%\x00\x00\x01I\x01J\x00\x02\x00\x01\x00\ +6\x00\x01\x00\x08\x00\x05\x00\x0c\x00\x14\x00\x1c\x00\x22\x00\ +(\x02^\x00\x03\x00I\x00O\x02]\x00\x03\x00I\x00\ +L\x03\x8d\x00\x02\x00I\x025\x00\x02\x00O\x024\x00\ +\x02\x00L\x00\x01\x00\x01\x00I\x00\x00\x00\x00\x00\x01\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x00\x15^\x00\x00\x00\x14\x00\ +\x00\x00\x00\x00\x00\x15V0\x82\x15R\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x07\x02\xa0\x82\x15C0\x82\x15?\x02\x01\ +\x011\x0b0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x000a\ +\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x04\xa0S0Q\ +0,\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1c\xa2\x1e\ +\x80\x1c\x00<\x00<\x00<\x00O\x00b\x00s\x00o\ +\x00l\x00e\x00t\x00e\x00>\x00>\x00>0!\ +0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x82\xb8\xb9\ +\x80\x8f\xd9\xf5@\xa6mn\xb3\x15TA6\x99\xde\xd3\ +}\xa0\x82\x11]0\x82\x03z0\x82\x02b\xa0\x03\x02\ +\x01\x02\x02\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\ +\xb5\xd6Z\xd50\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x000S1\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVer\ +iSign, Inc.1+0)\x06\ +\x03U\x04\x03\x13\x22VeriSign T\ +ime Stamping Ser\ +vices CA0\x1e\x17\x0d0706\ +15000000Z\x17\x0d12061\ +4235959Z0\x5c1\x0b0\x09\x06\x03\ +U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\ +\x13\x0eVeriSign, Inc.\ +1402\x06\x03U\x04\x03\x13+VeriS\ +ign Time Stampin\ +g Services Signe\ +r - G20\x81\x9f0\x0d\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\ +\x81\x81\x00\xc4\xb5\xf2R\x15\xbc\x88\x86`)\x16J[\ +/K\x91k\x87\x91\xf35TX5\xea\xd16^b\ +MRQ4q\xc2{f\x1d\x89\xc8\xdd*\xc4j\x0a\ +\xf67\xd9\x98t\x91\xf6\x92\xae\xb0\xb5v\x96\xf1\xa9J\ +cEG.k\x0b\x92NK+\x8c\xeeXJ\x8b\xd4\ +\x07\xe4\x1a,\xf8\x82\xaaX\xd9\xcdB\xf3-\xc0u\xde\ +\x8d\xab\xc7\x8e\x1d\x9alL\x08\x95\x1e\xde\xdb\xefg\xe1\ +r\xc2I\xc2\x9e`<\xe1\xe2\xbe\x16\xa3cxi\x14\ +{\xad-\x02\x03\x01\x00\x01\xa3\x81\xc40\x81\xc104\ +\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\ +\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18http\ +://ocsp.verisign\ +.com0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x02\ +0\x0003\x06\x03U\x1d\x1f\x04,0*0(\xa0\ +&\xa0$\x86\x22http://crl.\ +verisign.com/tss\ +-ca.crl0\x16\x06\x03U\x1d%\x01\x01\ +\xff\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\ +\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x06\xc00\ +\x1e\x06\x03U\x1d\x11\x04\x170\x15\xa4\x130\x111\x0f\ +0\x0d\x06\x03U\x04\x03\x13\x06TSA1-20\ +\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\ +\x01\x01\x00P\xc5K\xc8$\x80\xdf\xe4\x0d$\xc2\xde\x1a\ +\xb1\xa1\x02\xa1\xa6\x82-\x0c\x83\x15\x817\x0a\x82\x0e,\ +\xb0Z\x17a\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\x91\xb3V\x1a\ +@\xa6\xeb\x92\xbe89\xb0u6t:\x98O\xe47\ +\xba\x99\x89\xca\x95B\x1d\xb0\xb9\xc7\xa0\x8dW\xe0\xfa\xd5\ +d\x04B5N\x01\xd13\xa2\x17\xc8M\xaa'\xc7\xf2\ +\xe1\x86L\x028M\x83x\xc6\xfcS\xe0\xeb\xe0\x06\x87\ +\xdd\xa4\x96\x9e^\x0c\x98\xe2\xa5\xbe\xbf\x82\x85\xc3`\xe1\ +\xdf\xad(\xd8\xc7\xa5Kd\xda\xc7\x1b[\xbd\xac9\x08\ +\xd58\x22\xa13\x8b/\x8a\x9a\xeb\xbc\x07!?DA\ +\x09\x07\xb5e\x1c$\xbcH\xd3D\x80\xeb\xa1\xcf\xc9\x02\ +\xb4\x14\xcfT\xc7\x16\xa3\x80\x5c\xf9y>]r}\x88\ +\x17\x9e,C\xa2\xcaS\xce}=\xf6*:\xb8O\x94\ +\x00\xa5m\x0a\x83]\xf9^S\xf4\x18\xb3W\x0fp\xc3\ +\xfb\xf5\xad\x95\xa0\x0e\x17\xde\xc4\x16\x80`\xc9\x0f+n\ +\x86\x04\xf1\xeb\xf4x'\xd1\x05\xc5\xee4[^\xb9I\ +2\xf230\x82\x03\xc40\x82\x03-\xa0\x03\x02\x01\x02\ +\x02\x10G\xbf\x19\x95\xdf\x8dRFC\xf7\xdbmH\x0d\ +1\xa40\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000\x81\x8b1\x0b0\x09\x06\x03U\x04\x06\x13\x02Z\ +A1\x150\x13\x06\x03U\x04\x08\x13\x0cWest\ +ern Cape1\x140\x12\x06\x03U\x04\ +\x07\x13\x0bDurbanville1\x0f\ +0\x0d\x06\x03U\x04\x0a\x13\x06Thawte1\ +\x1d0\x1b\x06\x03U\x04\x0b\x13\x14Thawte\ + Certification1\x1f\ +0\x1d\x06\x03U\x04\x03\x13\x16Thawte \ +Timestamping CA0\ +\x1e\x17\x0d031204000000Z\ +\x17\x0d131203235959Z0\ +S1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1+0)\x06\x03U\x04\x03\ +\x13\x22VeriSign Time \ +Stamping Service\ +s CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\ +\x02\x82\x01\x01\x00\xa9\xca\xb2\xa4\xcc\xcd \xaf\x0a}\x89\ +\xac\x87u\xf0\xb4N\xf1\xdf\xc1\x0f\xbfga\xbd\xa3d\ +\x1c\xda\xbb\xf9\xca3\xab\x840\x89X~\x8c\xdbk\xdd\ +6\x9e\x0f\xbf\xd1\xecx\xf2w\xa6~o<\xbf\x93\xaf\ +\x0d\xbah\xf4l\x94\xca\xbdR-\xabH=\xf5\xb6\xd5\ +]_\x1b\x02\x9f\xfa/k\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\ +\x02\xe1\x7fLR\xe3\x0e`\xec@\x1c~\xb9\x0d\xde?\ +\xc7\xb4\xdf\x87\xbd_zj1.\x03\x99\x81\x13\xa8G\ + \xce1s\x0dW-\xcdx43\x95\x12\x99\x12\xb9\ +\xdeh/\xaa\xe6\xe3\xc2\x8a\x8c*\xc3\x8b!\x87f\xbd\ +\x83XWou\xbf<\xaa&\x87]\xca\x10\x15<\x9f\ +\x84\xeaT\xc1\x0an\xc4\xfe\xc5J\xdd\xb9\x07\x11\x97\x22\ +|\xdb>'\xd1\x1ex\xec\x9f1\xc9\xf1\xe6\x22\x19\xdb\ +\xc4\xb3GC\x9a\x1a_\xa0\x1e\x90\xe4^\xf5\xee|\xf1\ +}\xabb\x01\x8f\xf5M\x0b\xde\xd0\x22V\xa8\x95\xcd\xae\ +\x88v\xae\xee\xba\x0d\xf3\xe4M\xd9\xa0\xfbh\xa0\xae\x14\ +;\xb3\x87\xc1\xbb\x02\x03\x01\x00\x01\xa3\x81\xdb0\x81\xd8\ +04\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&\ +0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18ht\ +tp://ocsp.verisi\ +gn.com0\x12\x06\x03U\x1d\x13\x01\x01\xff\ +\x04\x080\x06\x01\x01\xff\x02\x01\x000A\x06\x03U\x1d\ +\x1f\x04:0806\xa04\xa02\x860htt\ +p://crl.verisign\ +.com/ThawteTimes\ +tampingCA.crl0\x13\x06\ +\x03U\x1d%\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\ +\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\ +\x01\x060$\x06\x03U\x1d\x11\x04\x1d0\x1b\xa4\x190\ +\x171\x150\x13\x06\x03U\x04\x03\x13\x0cTSA2\ +048-1-530\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00Jk\xf9\xeaX\ +\xc2D\x1c1\x89y\x99+\x96\xbf\x82\xac\x01\xd6\x1cL\ +\xcd\xb0\x8aXn\xdf\x08)\xa3^\xc8\xca\x93\x13\xe7\x04\ +R\x0d\xefG'/\x008\xb0\xe4\xc9\x93N\x9a\xd4\x22\ +b\x15\xf7?7!Op1\x80\xf1\x8b8\x87\xb3\xe8\ +\xe8\x97\x00\xfe\xcfU\x96N$\xd2\xa9'Nz\xae\xb7\ +aA\xf3*\xce\xe7\xc9\xd9^\xdd\xbb+\x85>\xb5\x9d\ +\xb5\xd9\xe1W\xff\xbe\xb4\xc5~\xf5\xcf\x0c\x9e\xf0\x97\xfe\ ++\xd3;R\x1b\x1b8'\xf7?J0\x82\x04\xfc0\ +\x82\x04e\xa0\x03\x02\x01\x02\x02\x10eR&\xe1\xb2.\ +\x18\xe1Y\x0f)\x85\xac\x22\xe7\x5c0\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000_1\x0b0\x09\x06\ +\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\ +\x0a\x13\x0eVeriSign, Inc\ +.1705\x06\x03U\x04\x0b\x13.Clas\ +s 3 Public Prima\ +ry Certification\ + Authority0\x1e\x17\x0d09\ +0521000000Z\x17\x0d190\ +520235959Z0\x81\xb61\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ve\ +riSign Trust Net\ +work1;09\x06\x03U\x04\x0b\x132T\ +erms of use at h\ +ttps://www.veris\ +ign.com/rpa (c)0\ +9100.\x06\x03U\x04\x03\x13'Veri\ +Sign Class 3 Cod\ +e Signing 2009-2\ + CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\ +\x82\x01\x01\x00\xbeg\x1d\xb4`\xaa\x10IoV\x17|\ +f\xc9^\x86\x0d\xd5\xf1\xac\xa7q\x83\x8e\x8b\x89\xf8\x88\ +\x04\x89\x15\x06\xba-\x84!\x95\xe4\xd1\x9cPL\xfb\xd2\ +\x22\xbd\xda\xf2\xb25;\x1e\x8f\xc3\x09\xfb\xfc\x13.Z\ +\xbf\x89|=;%\x1e\xf6\xf3X{\x9c\xf4\x01\xb5\xc6\ +\x0a\xb8\x80\xce\xbe'tag'Mj\xe5\xec\x81a\ +Xy\xa3\xe0\x17\x10\x12\x15'\xb0\xe1M4\x7f+G\ + D\xb9\xdef$f\x8a\xcdO\xba\x1f\xc58\xc8T\ +\x90\xe1r\xf6\x19fuj\xb9Ih\xcf8y\x0d\xaa\ +0\xa8\xdb,`H\x9e\xd7\xaa\x14\x01\xa9\x83\xd78\x91\ +09\x13\x96\x03:|@T\xb6\xad\xe0/\x1b\x83\xdc\ +\xa8\x11R>\x02\xb3\xd7+\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\ +\xa9\xa6\x10P\x0e4.M\xa7\xce\xc9^%\xd4\x8c\xbc\ +\xf3n|)\xbc\x01]\xfc1\x87Z\xd5\x8c\x85gX\ +\x88\x19\xa0\xbf5\xf0\xea+\xa3!\xe7\x90\xf6\x83\xe5\xa8\ +\xed`x^{`\x83\xfdW\x0b]A\x0dcT`\ +\xd6C!\xef\x02\x03\x01\x00\x01\xa3\x82\x01\xdb0\x82\x01\ +\xd70\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\ +\x01\xff\x02\x01\x000p\x06\x03U\x1d \x04i0g\ +0e\x06\x0b`\x86H\x01\x86\xf8E\x01\x07\x17\x030\ +V0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1ch\ +ttps://www.veris\ +ign.com/cps0*\x06\x08+\ +\x06\x01\x05\x05\x07\x02\x020\x1e\x1a\x1chttps\ +://www.verisign.\ +com/rpa0\x0e\x06\x03U\x1d\x0f\x01\x01\ +\xff\x04\x04\x03\x02\x01\x060m\x06\x08+\x06\x01\x05\x05\ +\x07\x01\x0c\x04a0_\xa1]\xa0[0Y0W0\ +U\x16\x09image/gif0!0\x1f\ +0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\ +\xac\x8d\x8ek\xc3\xcf\x80j\xd4H\x18,{\x19.0\ +%\x16#http://logo.v\ +erisign.com/vslo\ +go.gif0\x1d\x06\x03U\x1d%\x04\x160\ +\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\ +\x05\x05\x07\x03\x0304\x06\x08+\x06\x01\x05\x05\x07\x01\ +\x01\x04(0&0$\x06\x08+\x06\x01\x05\x05\x070\ +\x01\x86\x18http://ocsp.v\ +erisign.com01\x06\x03U\ +\x1d\x1f\x04*0(0&\xa0$\xa0\x22\x86 ht\ +tp://crl.verisig\ +n.com/pca3.crl0)\ +\x06\x03U\x1d\x11\x04\x220 \xa4\x1e0\x1c1\x1a0\ +\x18\x06\x03U\x04\x03\x13\x11Class3CA\ +2048-1-550\x1d\x06\x03U\x1d\x0e\ +\x04\x16\x04\x14\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08\ +-\xc45\x9b\xa4\xa1\x1e\xf20\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00\x8b\x03\xc0\xdd\x94\ +\xd8A\xa2ai\xb0\x15\xa8x\xc70\xc6\x90<~B\ +\xf7$\xb6\xe4\x83s\x17\x04\x7f\x04\x10\x9c\xa1\xe2\xfa\x81\ +/\xeb\xc0\xcaD\xe7r\xe0P\xb6U\x10 \x83n\x96\ +\x92\xe4\x9aQj\xb471\xdc\xa5-\xeb\x8c\x00\xc7\x1d\ +O\xe7M2\xba\x85\xf8N\xbe\xfagUe\xf0j\xbe\ +z\xcad8\x1a\x10\x10xEv1\xf3\x86z\x03\x0f\ +`\xc2\xb3]\x9d\xf6\x8bfv\x82\x1bY\xe1\x83\xe5\xbd\ +I\xa58V\xe5\xdeAw\x0eX\x0f0\x82\x05\x130\ +\x82\x03\xfb\xa0\x03\x02\x01\x02\x02\x10f\xe3\xf0gy\xca\ +\x15\x16mPSo\x88\x19\x1a\x830\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\xb61\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ver\ +iSign Trust Netw\ +ork1;09\x06\x03U\x04\x0b\x132Te\ +rms of use at ht\ +tps://www.verisi\ +gn.com/rpa (c)09\ +100.\x06\x03U\x04\x03\x13'VeriS\ +ign Class 3 Code\ + Signing 2009-2 \ +CA0\x1e\x17\x0d1007290000\ +00Z\x17\x0d12080823595\ +9Z0\x81\xd01\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x160\x14\x06\x03U\x04\x08\x13\x0dMas\ +sachusetts1\x0f0\x0d\x06\x03\ +U\x04\x07\x13\x06Woburn1\x1e0\x1c\x06\ +\x03U\x04\x0a\x14\x15Monotype I\ +maging Inc.1>0<\x06\ +\x03U\x04\x0b\x135Digital ID\ + Class 3 - Micro\ +soft Software Va\ +lidation v21\x180\x16\x06\ +\x03U\x04\x0b\x14\x0fType Opera\ +tions1\x1e0\x1c\x06\x03U\x04\x03\x14\x15\ +Monotype Imaging\ + Inc.0\x81\x9f0\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\ +\x81\x00\x94D\xa0\x95i|U\x0d\xd0\xdb\x16\x8d25\ +\x8aL3\xab^ \xa1L\xd7*\x878\xd7\x98\xa5@\ +\xf0\x19I\x0b\x22\x1eSO\xc2C\xa6\xca\x8b\xa9V\xef\ +nH\x06\xa8\x05\x159\x1ec;$\x12\x90\xb9\x98\xcf\ +\xca\x085}r\xe3GW\xfdy\xcb\x8aJ\xe7@p\ +-5c\x7f\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\ +\xd7\xa4\xa0\xdb\x09\xf2\xa2\xf2{\xef\xcdu\xc1\xf7eP\ +d\x22\x9d\xbd}\xbc\xad\xb8K\xccXE\x0eM\xd1Y\ +LM\x02\x03\x01\x00\x01\xa3\x82\x01\x830\x82\x01\x7f0\ +\x09\x06\x03U\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\ +\x0f\x01\x01\xff\x04\x04\x03\x02\x07\x800D\x06\x03U\x1d\ +\x1f\x04=0;09\xa07\xa05\x863htt\ +p://csc3-2009-2-\ +crl.verisign.com\ +/CSC3-2009-2.crl\ +0D\x06\x03U\x1d \x04=0;09\x06\x0b`\ +\x86H\x01\x86\xf8E\x01\x07\x17\x030*0(\x06\x08\ ++\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps:\ +//www.verisign.c\ +om/rpa0\x13\x06\x03U\x1d%\x04\x0c0\ +\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x030u\x06\x08+\ +\x06\x01\x05\x05\x07\x01\x01\x04i0g0$\x06\x08+\ +\x06\x01\x05\x05\x070\x01\x86\x18http://\ +ocsp.verisign.co\ +m0?\x06\x08+\x06\x01\x05\x05\x070\x02\x863h\ +ttp://csc3-2009-\ +2-aia.verisign.c\ +om/CSC3-2009-2.c\ +er0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\x97\ +\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\ +\xa1\x1e\xf20\x11\x06\x09`\x86H\x01\x86\xf8B\x01\x01\ +\x04\x04\x03\x02\x04\x100\x16\x06\x0a+\x06\x01\x04\x01\x82\ +7\x02\x01\x1b\x04\x080\x06\x01\x01\x00\x01\x01\xff0\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\ +\x01\x00N\xe6\x22\x87\xdfgA\x15\x17\xe2\xd2\xee~\x0e\ +\xce\xc2\x99\xd6c\xbd\xf0\xb5\x93\xe5jrb\xe1\xf5\xd2\ +<8\xee\xa8=\x08_\xbaG\x81\x82_[KI\xf4\ +\x1d \xfa\x0f\x93\x09\xd0\x1d\x19VD\x17\xa2\x88\xf3\xfb\ +\x8d\x9d\xae\xf7\x0d5\xde<\x0c\xacD\x94`E*\x9b\ +\xfe\x9boL;\xb14gp\x10\x86\xffZ9\x5cZ\ +\xe3l\x82\xab5|eK\xfd\x98m\xb5\x15\x94I\x9c\ +\x88p\x10\xbe=\xb1b\x95\xb4\xdb\xb4\xd4\xda\xe8\x9dA\ +\x90~\xfe}\xb9\xa4\x92\xebn\xf2\x22\x8a\xc6w6M\ +\x8aZ\x0bS\x051\xd3+(\xafR\xe1\x8dzk\xb5\ +wD\xbd\x0c\xad\xf4]%,\xe3\xcd\x8a0>K\x03\ +\x9cy\xca\xa6N\xae\x0b\xc2\xcc$\x07\x0b\xc1\x94\x82\xf6\ +\x10\xf1\xba\x90\xb6\x9b\x9a\xd8\x5c<\x13\xf1\xea\x02\x06\x18\ +'M<\x89o3\x8a\xd3\x86\xde\xe9X3u=\xeb\ +\x93i\xe2DoN\x00l\xcf\xd5\x85\xdaV\xa6\x9a\xa6\ +?\xcbL!h\x90\xf2`\xba\xe1\xe8\x06]9!\x13\ +2\xed1\x82\x03g0\x82\x03c\x02\x01\x010\x81\xcb\ +0\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02US\ +1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriS\ +ign, Inc.1\x1f0\x1d\x06\x03U\ +\x04\x0b\x13\x16VeriSign Tru\ +st Network1;09\x06\x03\ +U\x04\x0b\x132Terms of us\ +e at https://www\ +.verisign.com/rp\ +a (c)09100.\x06\x03U\x04\x03\ +\x13'VeriSign Class\ + 3 Code Signing \ +2009-2 CA\x02\x10f\xe3\xf0gy\ +\xca\x15\x16mPSo\x88\x19\x1a\x830\x09\x06\x05+\ +\x0e\x03\x02\x1a\x05\x00\xa0p0\x10\x06\x0a+\x06\x01\x04\ +\x01\x827\x02\x01\x0c1\x020\x000\x19\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x031\x0c\x06\x0a+\x06\x01\x04\x01\ +\x827\x02\x01\x040\x1c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x0b1\x0e0\x0c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x150#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x04\ +1\x16\x04\x14H\xe3\xea\xdb\x17c\x8f\xc6\xb1\x15W'\ + \xb7e\xf4\x19S\x95\x180\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80E;\xbc\xd4\xba\xef\ +\xda\x1b\xbfb;\xde\x12\xecJ\x06\x84EqA\xc9\x02\ +\xfe.\x0e\x95\xf3\x89\xb1R\xf4A\xebm2,H\xbf\ +)\x91\xbc\xb2/]d$4.\xba\x96\xb4\xb6Js\ +\x97\xe0\xf6\x9fA\xf7\xf7h\xb6\xf5\x80\x06xA\xbeS\ +\x90\xc0~xR[\x1c\xaa\x0e!B\xdc\xbe\x09\x9c3\ +\xd3FP\x90;\x05\x99\x10+Yi\xec\x85\xd8c\xd1\ +-\xc3\x06\x964\xed\x14\xa3\x9c\xf2\xf1T@\xd5G\x17\ +\xa0\x0b\x00\x1f\x8cf\xef\xde>\x1b\xa1\x82\x01\x7f0\x82\ +\x01{\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x061\x82\x01\ +l0\x82\x01h\x02\x01\x010g0S1\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1+0)\x06\x03U\x04\x03\x13\x22Ver\ +iSign Time Stamp\ +ing Services CA\x02\ +\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\ +\xd50\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\xa0]0\x18\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\x0b\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x07\x010\x1c\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x09\x051\x0f\x17\x0d1105051\ +65510Z0#\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x041\x16\x04\x14T\x17\x08+\x0b\xbd\xee\x1a'\ +\x0e\x1f\x8d\xfcS\x93\xf48V\x10\x0f0\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80\x1d\xc1w\ +\x89\xae\x9bo\x22\xe3k\xe5E\xdaN\x91@\xf0\x9f\xef\ +;\x1f'JV\xac:\xfd\xa8\x94j|\xf7\x9c\xc1\x7f\ +{\x93`N\x1b\xc4+W\x95\x94\xcb\x16\xe1\x9ag3\ +\xd1+)\x13\xc8\xec\xbe\xbcY\xb1\x03\xa4)\x99\xec\x1d\ +\x88\x99$\x87w\x0f\x9b\xca\x14\xfb\xd4\xd4ILt\x0e\ +\xc8=.o \xc9\x03\xcd\xe8\xe5\x0f\xd0!9\xb3V\ +\x19\xd5\xfb\xac\xbd\xac\xa98\xbd\xb0\xd5\x0c\xa3\xd9c\xad\ +\xb0\x95\xb4hX\xc3\xe2\xd7)\xff\x91\xa4\xc7\x00\x00\ +\x00\x03?T\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIG\xdc\ +\xdb\xbe\xa0\x00\x03)\xe0\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03%\xc0\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03%\xe0\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03&\x18\x00\x00\x03\xc6OS/2\xa2\ +\x18\x97r\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x10\ +\x90\x18\xf6\x00\x00\x1d\x9c\x00\x00\x00\xa6fpgm~\ +a\xb6\x11\x00\x00\x14\xd0\x00\x00\x07\xb4gasp\x00\ +\x08\x00\x1b\x00\x03%\xb4\x00\x00\x00\x0cglyf[\ +\xff\xdd\xb9\x00\x00%\x9c\x00\x01\x1dHhead\xf8\ +\xa2\xf9\xf4\x00\x00\x01<\x00\x00\x006hhea\x10\ +{\x11\x01\x00\x00\x01t\x00\x00\x00$hmtxs\ +*\xae)\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01B\xe4\x00\x01\xb66loca\x8e\ +RF\x11\x00\x00\x1eD\x00\x00\x07Vmaxp\x05\ +O\x01\xb2\x00\x00\x01\x98\x00\x00\x00 name\xe0\ +\xf7\xf0\x05\x00\x02\xf9\x1c\x00\x00\x06lpost\x02\ +7\xefl\x00\x02\xff\x88\x00\x00&+prepx\ +\xac\x9c%\x00\x00\x1c\x84\x00\x00\x01\x18\x00\x01\x00\x00\x00\ +\x01\x19\x9a\xa3\xf2ZY_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9cH\x96\x00\x00\x00\x00\xc9\xe8L\xa3\xfc\ +\x1f\xfd\xc1\x0a\x19\x08b\x00\x02\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x09\xb2\xfc\ +\x1f\xfe\x04\x0a\x19\x08\x00\x01\xb3\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00T\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +\x1a\x00\xa2\x00\x03\x00\x01\x00\x03\x04\x96\x02X\x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x02\x00\x00\x00\x02\x0b\x07\x06\x03\x08\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00\x01\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04R\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc1\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x02-\x00!\x03Z\x00\xd5\x05\ ++\x003\x04h\x00=\x06\x98\x00\x8d\x05\x83\x00B\x01\ +\xe3\x00\xd5\x02\x7f\x00N\x02\x7f\xfff\x04b\x00\xc1\x04\ +h\x00u\x02\x12\xff\x9a\x02\x89\x00/\x02'\x00!\x03\ +\x14\xff\xa4\x04h\x00\x5c\x04h\x00\xf2\x04h\xff\xee\x04\ +h\x00\x1f\x04h\xff\xfc\x04h\x005\x04h\x00o\x04\ +h\x00}\x04h\x00L\x04h\x00\x5c\x02'\x00!\x02\ +'\xff\x9c\x04h\x00s\x04h\x00u\x04h\x00s\x03\ +\x8b\x00\xa2\x06\xcf\x00d\x04\xba\xff\x87\x04\xdf\x00F\x04\ +\xc9\x00\x87\x05^\x00F\x045\x00F\x04\x02\x00F\x05\ +w\x00\x87\x05\x83\x00F\x02\xcd\xff\xcf\x02d\xfe\xbe\x04\ +\xae\x00F\x03\xf8\x00F\x06\xdd\x00D\x05\xd3\x00D\x05\ +\xcd\x00\x87\x04\x96\x00F\x05\xcd\x00\x87\x04\xb6\x00F\x04\ +!\x00'\x04\x1d\x00\xb0\x05w\x00\x98\x04\x8d\x00\xba\x06\ +\xfc\x00\xcb\x04\x7f\xff\x91\x04D\x00\xba\x04D\xff\xd9\x02\ +w\xff\xe5\x03\x14\x00\xdd\x02w\xffq\x04-\x00%\x03\ +-\xffD\x04o\x02\x1d\x04\xa2\x00^\x04\xb0\x00/\x03\ +\xba\x00^\x04\xae\x00^\x043\x00^\x02\xbe\xff\x1f\x04\ ++\xff\x87\x04\xb8\x00/\x023\x00/\x023\xfe\xfa\x04\ +9\x00/\x023\x00/\x07\x1b\x00/\x04\xb8\x00/\x04\ +\x96\x00^\x04\xb0\xff\xc9\x04\xae\x00^\x03D\x00/\x03\ +\x9a\x00\x0e\x02\xf0\x00\x5c\x04\xb8\x00o\x03\xe5\x00d\x06\ +\x04\x00y\x04\x08\xff\xaa\x03\xec\xffV\x03\x98\xff\xd9\x02\ +\xd1\x00\x08\x04h\x01\xf2\x02\xd1\xff\xa8\x04h\x00o\x02\ +\x14\x00\x00\x02-\xff\xd3\x04h\x00\xc3\x04h\xff\xee\x04\ +h\x00\x8d\x04h\x00j\x04h\x01\xf2\x03\xe3\x00'\x04\ +o\x01\xaa\x06\xa8\x00\x83\x02\xd9\x00\xa0\x04\x1f\x00P\x04\ +h\x00u\x02\x89\x00/\x06\xa8\x00\x83\x03\x87\x00o\x03\ +m\x00\xbc\x04h\x00u\x02\xe9\x00N\x02\xe9\x00h\x04\ +o\x01\xfc\x04\xc5\xff\xc9\x05=\x00\xac\x02'\x00\x96\x01\ +\xa4\xffD\x02\xe9\x00\xc1\x02\xd1\x00\xa4\x04\x1f\x00\x0a\x06\ +}\x00\x95\x06}\x00y\x06\x93\x00l\x03\x8b\xff\xdd\x04\ +\xba\xff\x87\x04\xba\xff\x87\x04\xba\xff\x87\x04\xba\xff\x87\x04\ +\xba\xff\x87\x04\xba\xff\x87\x06\xd9\xff\x87\x04\xc9\x00\x87\x04\ +5\x00F\x045\x00F\x045\x00F\x045\x00F\x02\ +\xcd\xff\xcf\x02\xcd\xff\xcf\x02\xcd\xff\xcf\x02\xcd\xff\xcf\x05\ +^\x005\x05\xd3\x00D\x05\xcd\x00\x87\x05\xcd\x00\x87\x05\ +\xcd\x00\x87\x05\xcd\x00\x87\x05\xcd\x00\x87\x04h\x00\x93\x05\ +\xcd\x00m\x05w\x00\x98\x05w\x00\x98\x05w\x00\x98\x05\ +w\x00\x98\x04D\x00\xba\x04\x96\x00F\x04\xf2\xfe\xfe\x04\ +\xa2\x00^\x04\xa2\x00^\x04\xa2\x00^\x04\xa2\x00^\x04\ +\xa2\x00^\x04\xa2\x00^\x06\xbe\x00^\x03\xba\x00^\x04\ +3\x00^\x043\x00^\x043\x00^\x043\x00^\x02\ +3\x00/\x023\x00/\x023\x00/\x023\x00/\x04\ +\x96\x00P\x04\xb8\x00/\x04\x96\x00^\x04\x96\x00^\x04\ +\x96\x00^\x04\x96\x00^\x04\x96\x00^\x04h\x00u\x04\ +\x96\x003\x04\xb8\x00o\x04\xb8\x00o\x04\xb8\x00o\x04\ +\xb8\x00o\x03\xec\xffV\x04\xb0\xff\xc9\x03\xec\xffV\x04\ +\xba\xff\x87\x04\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x04\ +\xba\xff\x87\x04\xa2\x00^\x04\xc9\x00\x87\x03\xba\x00^\x04\ +\xc9\x00\x87\x03\xba\x00^\x04\xc9\x00\x87\x03\xba\x00^\x04\ +\xc9\x00\x87\x03\xba\x00^\x05^\x00F\x04\xae\x00^\x05\ +^\x005\x04\xae\x00^\x045\x00F\x043\x00^\x04\ +5\x00F\x043\x00^\x045\x00F\x043\x00^\x04\ +5\x00F\x043\x00^\x045\x00F\x043\x00^\x05\ +w\x00\x87\x04+\xff\x87\x05w\x00\x87\x04+\xff\x87\x05\ +w\x00\x87\x04+\xff\x87\x05w\x00\x87\x04+\xff\x87\x05\ +\x83\x00F\x04\xb8\x00/\x05\x83\x00F\x04\xb8\x00/\x02\ +\xcd\xff\xcf\x023\x00/\x02\xcd\xff\xcf\x023\x00/\x02\ +\xcd\xff\xcf\x023\x00/\x02\xcd\xff\xcf\x023\xff\xa6\x02\ +\xcd\xff\xcf\x023\x00/\x051\xff\xcf\x04h\x00/\x02\ +d\xfe\xbe\x023\xfe\xfc\x04\xae\x00F\x049\x00/\x04\ +9\x00/\x03\xf8\x00F\x023\x00/\x03\xf8\x00F\x02\ +3\xff\x9e\x03\xf8\x00F\x023\x00/\x03\xf8\x00F\x02\ +\xdd\x00/\x03\xf8\x00\x0a\x02N\x00\x02\x05\xd3\x00D\x04\ +\xb8\x00/\x05\xd3\x00D\x04\xb8\x00/\x05\xd3\x00D\x04\ +\xb8\x00/\x05N\x00.\x05\xd3\x00D\x04\xb8\x00/\x05\ +\xcd\x00\x87\x04\x96\x00^\x05\xcd\x00\x87\x04\x96\x00^\x05\ +\xcd\x00\x87\x04\x96\x00^\x07\x06\x00\x87\x06\xfc\x00^\x04\ +\xb6\x00F\x03D\x00/\x04\xb6\x00F\x03D\xff\x9c\x04\ +\xb6\x00F\x03D\x00/\x04!\x00'\x03\x9a\x00\x0e\x04\ +!\x00'\x03\x9a\x00\x0e\x04!\x00'\x03\x9a\x00\x0e\x04\ +!\x00'\x03\x9a\x00\x0e\x04\x1d\x00\x88\x02\xf0\x00:\x04\ +\x1d\x00\xb0\x02\xf0\x00\x5c\x04\x1d\x00\xa8\x02\xf0\x00%\x05\ +w\x00\x98\x04\xb8\x00o\x05w\x00\x98\x04\xb8\x00o\x05\ +w\x00\x98\x04\xb8\x00o\x05w\x00\x98\x04\xb8\x00o\x05\ +w\x00\x98\x04\xb8\x00o\x05w\x00\x98\x04\xb8\x00o\x06\ +\xfc\x00\xcb\x06\x04\x00y\x04D\x00\xba\x03\xec\xffV\x04\ +D\x00\xba\x04D\xff\xd9\x03\x98\xff\xd9\x04D\xff\xd9\x03\ +\x98\xff\xd9\x04D\xff\xd9\x03\x98\xff\xd9\x02\x87\xff\x02\x04\ +h\xff\xf2\x04\xba\xff\x89\x04\x9e\x00^\x06\xd9\xff\x87\x06\ +\xbe\x00^\x05\xcd\x00m\x04\x96\x003\x04!\x00'\x03\ +\x9a\x00\x0e\x04o\x01b\x04o\x01\xa6\x04H\x01\x8b\x04\ +o\x01\xc5\x02)\x01B\x04\x9e\x02\x1d\x01\x8d\xff`\x04\ +o\x01F\x04o\x01R\x04w\x02R\x04w\x01\x8b\x04\ +\xba\xff\x87\x02'\x00\x96\x04\xcb\x004\x06\x1b\x004\x03\ +\xcb\x00A\x06-\x00M\x05m\x004\x06R\x00W\x02\ +\xb0\x00d\x04\xba\xff\x87\x04\xdf\x00F\x03\xe9\x00F\x04\ +\xa6\xff\xc9\x045\x00F\x04D\xff\xd9\x05\x83\x00F\x05\ +\xd9\x00\x87\x02\xcd\xff\xcf\x04\xae\x00F\x04\xa2\xff\x87\x06\ +\xdd\x00D\x05\xd3\x00D\x04'\xff\xdd\x05\xcd\x00\x87\x05\ +\x7f\x00F\x04\x96\x00F\x04B\xff\xdb\x04\x1d\x00\xb0\x04\ +D\x00\xba\x06=\x00\x87\x04\x7f\xff\x91\x063\x00\xbc\x05\ +\xd3\xff\xd9\x02\xcd\xff\xcf\x04D\x00\xba\x04\xb2\x00^\x03\ +\xd5\x003\x04\xb8\x00/\x02\xb0\x00d\x04\xc5\x00}\x04\ +\xb2\x00^\x04\xc9\xff\xc9\x03\xe1\x00H\x04\x8f\x00?\x03\ +\xd5\x003\x03\xaa\x00^\x04\xb8\x00/\x04\x83\x00b\x02\ +\xb0\x00d\x049\x00/\x047\xff\x98\x04\xc5\xff\xc9\x04\ +'\x00d\x03\xa2\x00V\x04\x96\x00^\x05B\x00T\x04\ +\xaa\xff\xc9\x03\xaa\x00^\x04\xcb\x00^\x03\xaa\x00T\x04\ +\xc5\x00}\x05\xbc\x00^\x047\xff\x0a\x06\x17\x00\x83\x06\ +3\x00^\x02\xb0\x00d\x04\xc5\x00}\x04\x96\x00^\x04\ +\xc5\x00}\x063\x00^\x045\x00F\x05\xa2\x00\xb0\x03\ +\xe9\x00F\x04\xc9\x00\x87\x04!\x00'\x02\xcd\xff\xcf\x02\ +\xcd\xff\xcf\x02d\xfe\xbe\x07b\xff\xc1\x07\x5c\x00F\x05\ +\xa2\x00\xb0\x04\x9e\x00F\x04\xae\x00\x0c\x05\x7f\x00F\x04\ +\xba\xff\x87\x04\xa0\x00H\x04\xdf\x00F\x03\xe9\x00F\x05\ +\x5c\xffJ\x045\x00F\x06\x91\xff\x8f\x04\x83\x00\x10\x05\ +\xcf\x00F\x05\xcf\x00F\x04\x9e\x00F\x05Z\xff\xc1\x06\ +\xdd\x00D\x05\x83\x00F\x05\xcd\x00\x87\x05\x7f\x00F\x04\ +\x96\x00F\x04\xc9\x00\x87\x04\x1d\x00\xb0\x04\xae\x00\x0c\x06\ +=\x00\x87\x04\x7f\xff\x91\x05\x98\x00D\x05?\x00\xd9\x07\ +\xd5\x00D\x07\xfe\x00D\x05H\x00\xb0\x06\x8f\x00F\x04\ +\x96\x00F\x04\xc9\x00\x17\x07\xf0\x00F\x04\xba\xff\x9c\x04\ +\xa2\x00^\x04\x81\x00h\x04q\x00^\x03\xbe\x00%\x04\ +\xa8\x00^\x043\x00^\x07-\xff\xe3\x03\xd7\x00\x0a\x04\ +\xb8\x00o\x04\xb8\x00o\x047\x00/\x04\x9c\xff\xb2\x05\ +\xec\x00)\x04\xdb\x00/\x04\x96\x00^\x04\xb8\x00/\x04\ +\xb0\xff\xc9\x03\xba\x00^\x07\x1b\x00/\x03\xec\xffV\x05\ +\xb4\x00^\x04\x08\xff\xaa\x04\xdb\x00m\x04\x9a\x00\xa0\x07\ +\x1b\x00m\x07=\x00m\x05\x10\x00X\x06\x19\x00u\x04\ +T\x00u\x03\xc1\x00\x19\x06w\x00/\x04o\xff\xdf\x04\ +3\x00^\x04\xb8\x00/\x03\xbe\x00%\x03\xba\x00^\x03\ +\x9a\x00\x0e\x023\x00/\x023\x00/\x023\xfe\xfa\x06\ +\x7f\xff\xb2\x06\xb2\x005\x04\xb8\x00/\x047\x00/\x03\ +\xec\xffV\x04\xb8\x00m\x03\xe9\x00F\x03b\x00/\x06\ +\xfc\x00\xcb\x06\x04\x00y\x06\xfc\x00\xcb\x06\x04\x00y\x06\ +\xfc\x00\xcb\x06\x04\x00y\x04D\x00\xba\x03\xec\xffV\x03\ +\xd7\x00/\x07\xae\x00/\x07\xae\x00/\x03-\xff,\x01\ +\x89\x00w\x01\x89\x00s\x02\x12\xff\x9a\x01\x89\x00\xe1\x03\ +#\x00w\x03#\x00s\x03\xaa\xff\x9a\x03\xe3\x00\xcb\x03\ +\xf8\x00D\x02\xf4\x00\x98\x06b\x01%\x09V\x00\x8d\x01\ +\xe3\x00\xd5\x03Z\x00\xd5\x02m\x00P\x02m\x00\x0a\x04\ +)\xff\xff\x01\x06\xfe\x02\x03\x04\x00\x96\x04h\x00\x17\x04\ +h\xff\xf0\x06R\x007\x04h\x003\x06+\x00\xa2\x04\ +\x00\x00d\x07\xb6\x00)\x05\xfe\x00q\x05\xd3\xff\xd9\x04\ +\xf4\x00u\x06\x89\x00\x83\x06\xc7\x00W\x06\xcd\x00d\x06\ +\x85\x00\x81\x04\xa6\x00`\x04\xa6\xff\xc9\x05\xee\x00\xdb\x05\ +\x0c\x00\x9e\x04h\x00u\x04d\x00b\x05\xa8\x00\x8d\x03\ +/\x00\x12\x04h\x00o\x04h\x00u\x04h\x00u\x04\ +h\x00u\x04\xaa\x00\x83\x04\xe9\xff\x1f\x04\xe9\xff\x1f\x04\ +w\x01L\x023\xfe\xfc\x03\xe7\x01\xfa\x03\xe7\x00\x8b\x03\ +\xe7\x01\xe5\x02\xe9\x00{\x02\xe9\x00F\x02\xe9\x00s\x02\ +\xe9\x00\x7f\x02\xe9\x00\x93\x02\xe9\x00j\x02\xe9\x00s\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +3\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00T\x08\x00\x00T\x023\xfe\xfc\x01\ +\x89\x00s\x05\x0c\x00R\x04V\x00\xba\x06\xec\x00d\x06\ +\xdd\x00D\x07\x1b\x00/\x04\xba\xff\x87\x04\xa2\x00^\x06\ +;\xff2\x02\xaa\xff\xaa\x02\xac\x00\xcd\x07\x8b\xff\x1f\x07\ +\x8b\xff\x1f\x05\xf2\x00\x87\x04\xd1\x00^\x05\xfc\x00\x98\x05\ +P\x00m\x00\x00\xfd\x0e\x00\x00\xfd\xcc\x00\x00\xfc\x9b\x00\ +\x00\xfd\xb0\x00\x00\xfc\x87\x045\x00F\x05\xcf\x00F\x04\ +3\x00^\x04\xb8\x00o\x07\xe7\x00\x8b\x061\x00f\x04\ +\xfc\x00\x87\x04\x9e\x00L\x06\xfe\x00F\x05\xbe\x00/\x05\ +\x14\xff\x87\x04o\xff\x93\x07\x0e\x00F\x069\x00/\x05\ +\x8f\xff\xac\x04\xba\xff\x96\x07\x9a\x00F\x06\x83\x00/\x04\ +\x83\xff\xb4\x03\xe1\xff\xa2\x063\x00\xbc\x06\x17\x00\x83\x05\ +\xcd\x00\x87\x04\x96\x00^\x04\xd5\x00\xba\x03\xf2\x00b\x04\ +\xd5\x00\xba\x03\xf2\x00b\x09\xb2\x00\x87\x08B\x00^\x05\ +\xfc\x00\x87\x04\xd7\x00^\x07\xe7\x00\x8b\x06`\x00^\x07\ +\xe7\x00\x8b\x061\x00f\x04\xc9\x00\x87\x03\xba\x00^\x04\ +\xdf\x00o\x04`\x01?\x04\x89\x01Z\x04\x89\x02j\x04\ +\x89\x02h\x07\xe9\x00)\x07\xa6\x00)\x06\x19\x00F\x04\ +\xd5\x00m\x04\x93\x00F\x04V\x00y\x04\x96\x00F\x04\ +\xb0\xff\xc9\x03\xe5\x005\x03b\x00\x00\x05\x12\x00F\x04\ +B\x00/\x06\xf6\xff\x8f\x071\xff\xe3\x04\x83\x00\x10\x03\ +\xd7\x00\x0a\x05%\x00D\x04\x87\x00/\x04\x9e\x00D\x04\ +?\x00H\x04\xae\x00F\x04/\x00/\x05D\x00\xb0\x04\ +\xd5\x00L\x05\xc5\x00F\x05\x08\x00/\x06\x19\x00F\x05\ +\x98\x00/\x08\x1d\x00F\x06\xba\x00/\x05\xcd\x00\x87\x04\ +\xd9\x00^\x04\xc9\x00\x87\x03\xba\x00^\x04\x1d\x00\xb0\x07\ +=\x00/\x04D\x00\xba\x03\xe5\x00d\x04D\x00\x5c\x03\ +\xe5\xff\xd3\x05\x0a\xff\x91\x04o\xff\xc7\x06u\x00\xb0\x05\ +Z\x00Z\x05\x89\x00\xd7\x04\xba\x00\xa0\x05?\x00\xd7\x04\ +\xa2\x00\xa0\x05?\x00D\x04\xb8\x00/\x06-\x00^\x05\ +\x04\x001\x06-\x00^\x05\x04\x001\x02\xcd\xff\xcf\x06\ +\x91\xff\x8f\x07-\xff\xe3\x05H\x00F\x04\x87\x00/\x05\ +\xa4\xff\xc1\x04\xc7\xff\xb2\x05\x83\x00F\x04\xdb\x00/\x05\ +\xcd\x00F\x05\x08\x00/\x05?\x00\xd7\x04\xb0\x00\xb6\x07\ +'\x00D\x06\x1b\x00)\x02\xcd\xff\xcf\x04\xba\xff\x87\x04\ +\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x06\xd9\xff\x87\x06\ +\xbe\x00^\x045\x00F\x043\x00^\x05H\x00L\x04\ +3\x007\x05H\x00L\x043\x007\x06\x91\xff\x8f\x07\ +-\xff\xe3\x04\x83\x00\x10\x03\xd7\x00\x0a\x04R\x00\x06\x04\ +\x02\xff\x8d\x05\xcf\x00F\x04\xb8\x00o\x05\xcf\x00F\x04\ +\xb8\x00o\x05\xcd\x00\x87\x04\x96\x00^\x05\xcd\x00\x87\x04\ +\x96\x00^\x05\xcd\x00\x87\x04\x96\x00^\x04\xc9\x00\x17\x03\ +\xc1\x00\x19\x04\xae\x00\x0c\x03\xec\xffV\x04\xae\x00\x0c\x03\ +\xec\xffV\x04\xae\x00\x0c\x03\xec\xffV\x05?\x00\xd9\x04\ +\x9a\x00\xa0\x03\xe9\x00F\x03b\x00/\x06\x8f\x00F\x06\ +\x19\x00u\x03\xe5\x00)\x03b\x00\x00\x04\xcd\xff\x91\x04\ +F\xff\xa8\x04\x7f\xff\x91\x04\x08\xff\xaa\x04\x96\x00N\x04\ +\xae\x00^\x06\xc7\x00R\x06\xe5\x00^\x06\xcb\x00\xdd\x06\ +;\x00\x8f\x04\xe7\x00\xbc\x04J\x00\xa4\x07\x7f\xff\xc1\x06\ +\xcf\xff\xb2\x07\xbe\x00F\x07\x0e\x00/\x05\xba\x00\x87\x04\ +\xe1\x00^\x05w\x00\xb0\x05\x0a\x00Z\x04\x83\x00^\x03\ +\xd5\x003\x05\xa4\xff\xc1\x04\xe1\xff\xb2\x04\xba\xff\x87\x04\ +\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x04\xba\xff\x87\x04\ +\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x04\xba\xff\x87\x04\ +\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x04\xba\xff\x87\x04\ +\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x04\xba\xff\x87\x04\ +\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x04\xba\xff\x87\x04\ +\xa2\x00^\x04\xba\xff\x87\x04\xa2\x00^\x045\x00F\x04\ +3\x00^\x045\x00F\x043\x00^\x045\x00F\x04\ +3\x00^\x045\x00F\x043\x00^\x045\x00F\x04\ +3\x00^\x045\x00F\x043\x00^\x045\x00F\x04\ +3\x00^\x045\x00F\x043\x00^\x02\xcd\xff\xcf\x02\ +3\x00/\x02\xcd\xff\xcf\x023\xff\xeb\x05\xcd\x00\x87\x04\ +\x96\x00^\x05\xcd\x00\x87\x04\x96\x00^\x05\xcd\x00\x87\x04\ +\x96\x00^\x05\xcd\x00\x87\x04\x96\x00^\x05\xcd\x00\x87\x04\ +\x96\x00^\x05\xcd\x00\x87\x04\x96\x00^\x05\xcd\x00\x87\x04\ +\x96\x00^\x05\xf2\x00\x87\x04\xd1\x00^\x05\xf2\x00\x87\x04\ +\xd1\x00^\x05\xf2\x00\x87\x04\xd1\x00^\x05\xf2\x00\x87\x04\ +\xd1\x00^\x05\xf2\x00\x87\x04\xd1\x00^\x05w\x00\x98\x04\ +\xb8\x00o\x05w\x00\x98\x04\xb8\x00o\x05\xfc\x00\x98\x05\ +P\x00m\x05\xfc\x00\x98\x05P\x00m\x05\xfc\x00\x98\x05\ +P\x00m\x05\xfc\x00\x98\x05P\x00m\x05\xfc\x00\x98\x05\ +P\x00m\x04D\x00\xba\x03\xec\xffV\x04D\x00\xba\x03\ +\xec\xffV\x04D\x00\xba\x03\xec\xffV\x04\xae\x00\x1d\x00\ +\x00\xfc3\x00\x00\xfc\xc9\x00\x00\xfc\x1f\x00\x00\xfc\xc9\x00\ +\x00\xfc\xc9\x00\x00\xfd\x08\x00\x00\xfd\x08\x00\x00\xfd\x08\x00\ +\x00\xfd\x04\x01\xa4\xffb\x01\xf2\xff\xa2\x01\xf2\xff\xa2\x03\ +m\x00|\x04\x89\x00^\x037\x007\x04\x1f\xff\xdf\x04\ +#\xff\x95\x04\x5c\xff\xc7\x04+\xff\xe0\x04j\x00f\x04\ +\x14\xff\xff\x04`\x00?\x04h\x00&\x05`\xff\x1f\x05\ +\xfc\x00w\x04\x1d\x00\x92\x02\xf0\x00\x5c\x04\xae\x00'\x04\ +\xae\x00'\x04\xae\x00'\x04\xae\x00'\x04\xae\x00'\x02\ +`\x00F\x02`\x00F\x02`\x00F\x02`\x00F\x02\ +`\x00F\x02`\x00F\x02`\x00F\x02`\x00F\x02\ +`\xff\xb4\x02`\x00F\x04\xc5\x00F\x03\x06\x00A\x02\ +`\x00F\x00F\x00F\x00F\x00F\x00F\x00F\x00\ +\x02\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,E#E`D-,K#QX\xb9\ +\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD\ +-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f\ +`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01\ +aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b\ +!!!!!Y-,\xb0\x02CTXKS#\ +KQZX8\x1b!!Y\x1b!!!!Y-\ +,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\ +\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#\ +D\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04\ +%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\ +\xb0\x07%\x08\xb0\x07%\x10\xb0\x06% F\xb0\x04%\ +\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\ +\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\x07%\x10\ +\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\ +\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\x07\ +%\x08\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y\ +!!!!!!!-,\x02\xb0\x04% F\ +\xb0\x04%#B\xb0\x05%\x08\xb0\x03%EH!!\ +!!-,\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%\ +CH!!!-,E# E\x18 \xb0\x00P\ + X#e#Y#h \xb0@PX!\xb0@\ +Y#XeY\x8a`D-,KS#KQZ\ +X E\x8a`D\x1b!!Y-,KTX \ +E\x8a`D\x1b!!Y-,KS#KQZ\ +X8\x1b!!Y-,\xb0\x00!KTX8\x1b\ +!!Y-,\xb0\x02CTX\xb0F+\x1b!!\ +!!Y-,\xb0\x02CTX\xb0G+\x1b!!\ +!Y-,\xb0\x02CTX\xb0H+\x1b!!!\ +!Y-,\xb0\x02CTX\xb0I+\x1b!!!\ +Y-, \x8a\x08#KS\x8aKQZX#8\ +\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \ +\xb0@8\x11\x1b!Y-,\x01F#F`#F\ +a# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\ +\x8apE`h:-, \x8a#Id\x8a#S\ +X<\x1b!Y-,KRX}\x1bzY-,\ +\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\ +\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88\ +TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\ +\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1\ +$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01K\ +RX\xb2\x02\x08\x02C`BY\x1b\xb9@\x00\x00\x80\ +\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80\ +c\xb8\x01\x00\x88TX\xb2\x02\x08\x02C`BY\xb9\ +@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C\ +`BY\xb1&\x01\x88QX\xb9@\x00\x02\x00c\xb8\ +\x04\x00\x88TX\xb2\x02@\x02C`BY\xb9@\x00\ +\x04\x00c\xb8\x08\x00\x88TX\xb2\x02\x80\x02C`B\ +YYYYYY\xb1\x00\x02CTX@\x0a\x05@\ +\x08@\x09@\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\ +\x05@\x08\xba\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\ +\xb1\x80\x02CRX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\ +\x1b\xb2\x05@\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\ +\x00\x80\x88U\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZ\ +X\xb3\x0c\x00\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYB\ +BBBB-,E\x18h#KQX# E\ + d\xb0@PX|Yh\x8a`YD-,\xb0\ +\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02\ +#>\xb1\x01\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\ +\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\ +\x06#eB\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\ +\xb0\x02CP\xb0\x01\xb0\x02CT[X!#\x10\xb0\ + \x1a\xc9\x1b\x8a\x10\xedY-,\xb0Y+-,\x8a\ +\x10\xe5-@\xa5\x09!H U \x01\x1eU\x1fH\ +\x1eU\x1f\x1e\x01\x0f\x1e?\x1e\xaf\x1e\x03OF\x1c\x1f\ +NM\x1b\x1fMF\x1a\x1f&4\x10U%$\xff\x1f\ +\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\xff\x1fLK\x1c\x1f\ +KF\x1b\x1f\x133\x12U\x05\x01\x03U\x043\x03U\ +\x1f\x03\x01\x0f\x03?\x03\xaf\x03\x03\xcbJ\xdbJ\xebJ\ +\x03\xcbI\x01HF\x12\x1fGF\x12\x1fIF\x01#\ +H\x22U\x1c3\x1bU\x163\x15U\x11\x01\x0fU\x10\ +3\x0fU\xcf\x0f\x01\x1f\x0f\x01\x0f\x0f\xdf\x0f\xff\x0f\x03\ +\x06\x02\x01\x00U\x013\x00Uo\x00\x7f\x00\xaf\x00\xef\ +\x00\x04\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\x90\xb1TS\ +++K\xb8\x07\xffRK\xb0\x09P[\xb0\x01\x88\xb0\ +%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\xb0\x00UZ\ +[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\x1dK\xb02\ +SX\xb0 \x1dYK\xb0dSX\xb0\x10\x1d\xb1\x16\ +\x00BYss++^stt+++++\ +t++ssst+++++++++\ +++++st+++\x18^\x06\x14\x00\x17\x00\ +N\x05\xb6\x00\x17\x00u\x05\xb6\x05\xcd\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04R\x00\x14\x00\x86\x00\ +\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\ +\x00\xfe\x14\xff\xec\x00\x00\x05\xb6\x00\x15\xfc\x94\xff\xeb\xfe\ +y\xff\xf4\xfe\xa8\xfe\xa8\x00\x17\xfe\xbc\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x08\x00\x00\x00\x00\x00\x00\xc0\x00\xb8\x00\xb0\x00\xa3\x00\ +\x94\x00\xc0\x00\xcd\x00\xc5\x00\xcf\x00\xba\x00\x9a\x011\x00\ +\xb2\x00\x00\x00\x00\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00F\x00\ +c\x00\xb7\x01!\x01\x8b\x01\xf5\x02\x08\x02'\x02G\x02\ +p\x02\x91\x02\xa8\x02\xbb\x02\xd7\x02\xec\x03'\x03G\x03\ +\x84\x03\xd7\x04\x13\x04T\x04\xab\x04\xca\x05(\x05{\x05\ +\xad\x05\xda\x05\xf3\x06\x16\x06/\x06}\x06\xfc\x07+\x07\ +w\x07\xae\x07\xe4\x08\x12\x088\x08\x80\x08\xa7\x08\xd1\x08\ +\xf5\x09\x1e\x098\x09n\x09\x9d\x09\xdc\x0a\x10\x0a[\x0a\ +\x97\x0a\xdf\x0a\xfe\x0b0\x0bU\x0b\x97\x0b\xc0\x0b\xe0\x0c\ +\x08\x0c$\x0c8\x0cS\x0co\x0c\x81\x0c\x9a\x0c\xe2\x0d\ +0\x0dc\x0d\xb2\x0d\xfd\x0eC\x0e\xc7\x0f\x02\x0f2\x0f\ +u\x0f\xa3\x0f\xb5\x10\x04\x10;\x10t\x10\xbd\x11\x0a\x11\ +4\x11x\x11\xb6\x11\xef\x12\x11\x12S\x12|\x12\xb2\x12\ +\xdc\x13)\x13;\x13\x87\x13\xbe\x13\xbe\x13\xe8\x14+\x14\ +v\x14\xc0\x15\x09\x15&\x15\x8c\x15\xb9\x16(\x16g\x16\ +\x91\x16\xaa\x16\xb2\x17&\x178\x17e\x17\x96\x17\xca\x18\ +\x11\x18+\x18i\x18\x8f\x18\x98\x18\xc5\x18\xe5\x19\x16\x19\ +B\x19X\x19m\x19\x83\x19\xd5\x19\xe7\x19\xf9\x1a\x0b\x1a\ +\x1d\x1a0\x1aA\x1a\x8b\x1a\x97\x1a\xa9\x1a\xbb\x1a\xcd\x1a\ +\xe0\x1a\xf2\x1b\x04\x1b\x16\x1b)\x1bu\x1b\x87\x1b\x99\x1b\ +\xab\x1b\xbd\x1b\xcf\x1b\xe2\x1c\x0e\x1cl\x1c~\x1c\x90\x1c\ +\xa2\x1c\xb5\x1c\xc7\x1c\xfe\x1dh\x1dy\x1d\x8a\x1d\x9b\x1d\ +\xac\x1d\xbe\x1d\xd0\x1eP\x1e\x5c\x1em\x1e~\x1e\x8f\x1e\ +\xa1\x1e\xb3\x1e\xc5\x1e\xd7\x1e\xea\x1fK\x1f\x5c\x1fm\x1f\ +~\x1f\x8f\x1f\xa0\x1f\xb2\x1f\xed G X i \ +z \x8c \x9d \xec \xfe!\x10!!!3!\ +D!P!\x5c!n!\x7f!\x91!\xa2!\xb4!\ +\xc6!\xd8!\xe9!\xfb\x22\x0c\x22\x14\x22~\x22\x90\x22\ +\xa1\x22\xb3\x22\xc4\x22\xd6\x22\xe8\x22\xf4#\x00#\x12#\ +##5#F#X#i#{#\x8d#\x99#\ +\xaa#\xbc#\xce$\x12$e$w$\x89$\x9b$\ +\xad$\xbf$\xd1$\xdd$\xe8$\xfa%\x0c%\x18%\ +$%6%H%T%_%\x8e%\xa0%\xb2%\ +\xbd%\xc9%\xda%\xec%\xf8&\x04&3&b&\ +t&\x85&\x91&\x9c&\xae&\xbf&\xcb'\x09'\ +Q'c't'\x86'\x97'\xaa'\xbc(\x15(\ +\x88(\x9a(\xab(\xb7(\xc3(\xd5(\xe6(\xf8)\ +\x09)\x1b)-)9)E)W)i)t)\ +\x7f)\x91)\xa2)\xd7*(*:*K*]*\ +n*\x80*\x91*\xa4*\xb6*\xc9*\xdb*\xe7*\ +\xf3+\x05+\x17+)+:+M+_+p+\ +\x82+\x94+\xa6+\xb7+\xec,3,\xa8-5-\ +G-Y-k-|-\x87-\x92-\xb4-\xd6-\ +\xe8.\x0d.(.[.\x7f.\xb4.\xde.\xf7/\ +:/K/T/f/x/\x8a/\x9b/\xad/\ +\xbe/\xd2/\xda/\xe2/\xfb0\x030\x0b0\x130\ +\x1b0i0q0y0\x9b0\xa30\xab0\xdc0\ +\xe41\x031\x0b1=1E1M1\xa61\xae1\ +\xf52?2R2e2v2\x872\x982\xaa2\ +\xbd3\x183u3\xa13\xf54@4\x894\xc15\ +\x0e555=5\x835\x8b5\xaf6\x0f6\x176\ +S6\x986\xd87\x157K7w7\xc88\x148\ +U8\xa48\xb78\xc98\xda8\xeb8\xfd9\x109\ +Z9l9\xb09\xb89\xc09\xd39\xdb:1:\ +v:\xb2:\xc4:\xd6:\xff;\x07;B;J;\ +R;\x90;\x98;\xd3<&:>\ +w>\xaa>\xef?D?\x82?\x8a?\xdd@3@\ +x@\xce@\xd6AJA\x98A\xa0A\xb1A\xdaB\ +\x15BLBuB}B\x85B\x8dB\x95B\x9dB\ +\xa5B\xfbC\x03CJC\x86C\xd7D:D\x82D\ +\xcfE\x10EWE\xa4E\xf6F\x08FrF\x83F\ +\xc4F\xccF\xd4F\xe7F\xefGXG\xabG\xb3G\ +\xc4G\xd5H\x1aH;H[HmH~H\x90H\ +\xa2H\xb5H\xc8H\xdaH\xecH\xfeI\x10I\x18I\ +%I>IYIoI\x89I\xb0I\xdaI\xfeJ\ +/J\x80J\x9aJ\xabK?KGKOKhK\ +\x82K\x8eK\xa3K\xd4L\x10LtL\xd7M@M\ +\xa2M\xefNSN\x92N\x9aN\xdbN\xf3O\x0aO\ +!O8O\x89O\xb4O\xd1O\xfeP\x10P0P\ +\x86P\xb1Q#Q[Q\x82Q\xaaQ\xd1Q\xddQ\ +\xe9R\x0cR/RHRaRzR\xaaR\xdfS\ +\x16S_SyS\xc7T\x0cT\x0cT\x0cT\x0cT\ +\x0cT\x0cT\x0cT\x0cT\x0cT\x0cT\x0cT\x0cT\ +\x0cT\x0cU+U~U\x90U\x98V\x0eVBV\ +\x9dV\xafV\xc1V\xcdV\xd9V\xe5W\x15WGW\ +\xdaXXX\xa9X\xf6Y:Y\x87Y\x90Y\x99Y\ +\xa2Y\xc5Y\xe0Y\xf2Z\x04Z\x16Z'Z\x94Z\ +\xcf[\x17[l[\xc5\x5c\x17\x5cQ\x5c\x88\x5c\xd2]\ +\x1a]j]\xb8^\x16^r^\xff_\x84_\x8c_\ +\x94_\xe3`+`b`\x97`\xaa`\xbd`\xc9`\ +\xd5a8a\x9cbDb\xebcwc\xd6d\x0fd\ +Fd}d\xa2d\xcfd\xf2e\x15f\x02f\xa8f\ +\xffg\x5cg\xa5g\xfbhIh\xa8h\xd8i\x07i\ +Qi\x97i\xdcjVjbjnj\xa2j\xd5k\ +\x11kOk\x8ek\xd2l\x03l4lgl\x9bl\ +\xcdl\xfemLm\x96n\x0en\x89n\x95n\xa1n\ +\xcbo3o;obo\x99o\xd1p\x05p:p\ +qp\xc6q\x08qJq\x95q\xe4r\x1brTr\ +\xb9s\x18s\x84s\xees\xf6t\x08t\x1atbt\ +\xa5t\xe7u-uju\xa4u\xd8v\x0cvNv\ +\x92v\xd7w\x1aw\x22w4wEwXwjw\ +rwzw\x8cw\x9dw\xeax5xHxZx\ +mx\x80x\x93x\xa5x\xe7y+y=yNy\ +aysy\x86y\x98y\xa0y\xa8y\xbby\xcdy\ +\xe0y\xf3z\x05z\x16z)z;zNz`z\ +sz\x85z\xabz\xd0z\xe3z\xf6{?{\x89{\ +\xce|\x13|P|\x8a|\xbc|\xc4}\x1e}\x81}\ +\xdf~5~\x87~\xd7\x7f(\x7f\x84\x7f\xcc\x80\x15\x80\ +^\x80\xa0\x80\xdf\x81\x1f\x81n\x81v\x81\xc5\x82\x19\x82\ +%\x821\x82C\x82U\x82h\x82{\x82\x8e\x82\xa1\x82\ +\xb4\x82\xc7\x82\xda\x82\xed\x83\x03\x83\x18\x83+\x83>\x83\ +Q\x83d\x83w\x83\x8a\x83\x9d\x83\xb0\x83\xc6\x83\xdb\x83\ +\xe7\x83\xf3\x84\x05\x84\x17\x84)\x84:\x84M\x84`\x84\ +s\x84\x86\x84\x99\x84\xac\x84\xbf\x84\xd2\x84\xe8\x84\xfd\x85\ +\x0f\x85!\x85-\x859\x85E\x85Q\x85c\x85u\x85\ +\x88\x85\x9b\x85\xae\x85\xc1\x85\xd4\x85\xe7\x85\xfa\x86\x0d\x86\ +#\x868\x86J\x86[\x86m\x86~\x86\x90\x86\xa2\x86\ +\xb4\x86\xc5\x86\xd1\x86\xdd\x86\xe9\x86\xf5\x87\x07\x87\x19\x87\ ++\x87<\x87N\x87_\x87q\x87\x83\x87\x95\x87\xa6\x87\ +\xb2\x87\xbe\x87\xca\x87\xd6\x87\xe8\x87\xfa\x88\x0c\x88\x1d\x88\ +)\x88R\x88\x86\x88\xbb\x89\x02\x89a\x89\x9a\x89\xd4\x8a\ +!\x8av\x8a\x96\x8a\xb6\x8a\xd6\x8a\xde\x8b\x14\x8b7\x8b\ +q\x8bz\x8b\xb5\x8b\xbe\x8b\xc6\x8b\xcf\x8b\xd7\x8b\xe0\x8c\ +R\x8c\xb9\x8c\xc5\x8c\xd1\x8d.\x8d?\x8dP\x8db\x8d\ +s\x8d\x86\x8d\x98\x8d\xaa\x8d\xbc\x8d\xcf\x8d\xe1\x8d\xf3\x8e\ +\x05\x8e\x10\x8e\x22\x8e.\x8e@\x8eH\x8e[\x8ec\x8e\ +v\x8e~\x8e\x86\x8e\x98\x8e\xa4\x00\x00\x00\x02\x00\xc1\x00\ +\x00\x04\x0a\x05\xb6\x00\x03\x00\x07\x00\x0c\xb3\x04\x03\x07\x00\ +\x00/2/310\x13!\x11!7!\x11!\xc1\ +\x03I\xfc\xb7h\x02y\xfd\x87\x05\xb6\xfaJh\x04\xe6\ +\x00\x00\x02\x00!\xff\xe5\x02X\x05\xb6\x00\x03\x00\x0f\x00\ +\x18@\x0b\x01\x01\x0d\x02\x03\x0d\x07QY\x0d\x13\x00?\ ++\x00\x18?\x129/10\x01#\x13!\x0146\ +32\x16\x15\x14\x06#\x22&\x01P\xb0\xa8\x01\x10\xfd\ +\xc9[U9D^L>E\x01\xbc\x03\xfa\xfa\xaaP\ +dA=ObC\x00\x00\x02\x00\xd5\x03\xa6\x03}\x05\ +\xb6\x00\x03\x00\x07\x00\x0d\xb4\x06\x02\x07\x03\x03\x00?3\ +\xcd210\x01\x03#\x13!\x03#\x13\x02\x04\x97\x98\ +H\x02`\x98\x99J\x05\xb6\xfd\xf0\x02\x10\xfd\xf0\x02\x10\ +\x00\x00\x02\x003\x00\x00\x057\x05\xb6\x00\x1b\x00\x1f\x00\ +3@\x18\x00\x1f\x10\x10\x19\x15\x11\x04\x08\x0c\x0c\x01\x1c\ +\x0d\x11\x0d\x11\x0a\x17\x13\x03\x06\x0a\x12\x00?3?3\ +\x1299//333\x1133\x11333\x11\ +3310\x01\x03!\x07!\x03#\x13#\x03#\x13\ +#7!\x13!7!\x133\x033\x133\x033\x07\ +\x013\x13#\x04\x0cT\x01\x0f\x0f\xfe\xd1y\xb4{\xf8\ +y\xaeu\xfa\x11\x01\x18T\xfe\xf8\x10\x01'y\xb2y\ +\xfcy\xaey\xfc\x0e\xfc\xe5\xfaR\xfa\x03h\xfe\xe2\xa8\ +\xfe^\x01\xa2\xfe^\x01\xa2\xa8\x01\x1e\xa8\x01\xa6\xfeZ\ +\x01\xa6\xfeZ\xa8\xfe\xe2\x01\x1e\x00\x03\x00=\xff\x89\x04\ +H\x06\x12\x00\x1f\x00%\x00+\x00A@\x22\x15@\x0f\ +\x12H\x1c%\x0d\x03++\x13\x04\x06@ \x0c\x06\x0c\ +OY\x03\x06\x15\x13@\x1b&\x13&MY\x16\x13\x00\ +/3+\x11\x003\x1a\x18\x10\xcd/3+\x11\x003\ +\x1a\x18\x10\xcd\x129\x11\x173+10\x01\x14\x06\x07\ +\x07#7&'5\x16\x16\x17\x13&&5467\ +73\x07\x16\x17\x07&'\x03\x1e\x02\x016654\ +'\x03\x06\x06\x15\x14\x17\x03\xdb\xef\xda-\x87-\xc5\x89\ +N\xcb\x5cT\x9c\x87\xed\xce%\x87#\xa1\x80V\x86n\ +P\x80u8\xfe`Ves\x0eYYn\x01\xee\xac\ +\xd2\x14\xd3\xd3\x0dC\xd1*8\x02\x01\x838\xa5u\xa7\ +\xc9\x11\xa3\xa5\x10B\xb9B\x08\xfe\x8d3Xr\xfe\xe1\ +\x0bbMe,\x02D\x0b]Lb)\x00\x00\x05\x00\ +\x8d\xff\xec\x06F\x05\xcb\x00\x0b\x00\x19\x00\x1d\x00)\x00\ +7\x00'@\x13\x1e5\x06\x105\x105\x10\x1c\x1d\x03\ +\x1c\x12\x00\x17\x07$.\x13\x00?3?3??\x12\ +99//\x113\x11310\x01\x22\x06\x06\x15\x14\ +326654\x17\x14\x02\x06#\x22&54\x12\ +632\x16%\x01#\x01\x13\x22\x06\x06\x15\x1432\ +6654\x17\x14\x02\x06#\x22&54\x1263\ +2\x16\x02\x127X5P4W;\xc1o\xb6s|\ +\x84j\xb3w\x7f\x85\x02\xc2\xfb\xc3\xc3\x04>\x0c4W\ +9Q4X;\xc1o\xb6q\x7f\x85j\xb3v\x7f\x88\ +\x05#z\xe0g\x87t\xebf\x83\x81\xa0\xfe\xcd\x9a\x9e\ +\x95\xa6\x01'\x96\x98\x83\xfaJ\x05\xb6\xfd%s\xe3l\ +\x86u\xe8h\x83\x7f\xa1\xfe\xcb\x9a\x99\x92\xab\x01*\x95\ +\x96\x00\x03\x00B\xff\xec\x05Z\x05\xcd\x00\x0a\x00\x14\x00\ +1\x004@\x1d\x05\x18#\x0f\x04/\x1d$\x0e),\ +\x04&&\x1d+\x12\x1d\x00KY\x1d\x04/\x0bKY\ +/\x13\x00?+\x00\x18?+\x00\x18?\x129\x12\x17\ +9\x11\x12\x17910\x01\x22\x06\x15\x14\x17665\ +4&\x01267\x01\x06\x06\x15\x14\x16%467\ +&54632\x16\x15\x14\x06\x07\x13673\x02\ +\x07\x13!'\x06\x06#\x22&\x02\xecW^>\x93i\ +H\xfe\xd3M\x8cJ\xfe\xf8\x85ap\xfe\xa1\xab\xc9X\ +\xe1\xb9\xa0\xb8\xb3\xcc\xebmH\xe9q\xb8\xcd\xfe\xeb^\ +j\xd2|\xbe\xd3\x05\x12lXm\x5cKuDBG\ +\xfb\x9e67\x01}J\x87VVm\xae\x93\xd6b\x97\ +\x84\xb4\xd5\xa2\x89\x81\xca[\xfe\xbap\xb7\xfe\xf2\xb8\xfe\ +\xe9\x83PG\xc3\x00\x01\x00\xd5\x03\xa6\x02\x04\x05\xb6\x00\ +\x03\x00\x09\xb2\x02\x03\x03\x00?\xcd10\x01\x03#\x13\ +\x02\x04\x97\x98H\x05\xb6\xfd\xf0\x02\x10\x00\x01\x00N\xfe\ +\xbc\x03\x17\x05\xb6\x00\x0a\x00\x0a\xb3\x09'\x03\x03\x00?\ +?10\x13\x10\x12\x133\x00\x11\x10\x13#\x02N\xf9\ +\xff\xd1\xfe\x0es\xb7\x93\x01\x14\x01W\x02C\x01\x08\xfd\ +\xdc\xfd~\xfe\xb7\xfe\xf5\x01\x05\x00\x01\xfff\xfe\xbc\x02\ +/\x05\xb6\x00\x0a\x00\x0a\xb3\x04'\x08\x03\x00??1\ +0\x01\x10\x02\x01#\x00\x11\x10\x033\x12\x02/\xf6\xfe\ +\xfe\xd1\x01\xf2s\xb7\x93\x03\x5c\xfe\xaa\xfd\xc1\xfe\xf5\x02\ +$\x02\x82\x01G\x01\x0d\xfe\xf7\x00\x01\x00\xc1\x02V\x04\ +\x83\x06\x1f\x00\x0e\x00\x09\xb2\x06\x0e\x00\x00?\xcd10\ +\x01\x03%\x07%\x13\x07\x03\x03'\x01%7\x05\x13\x03\ +dt\x01\x93\x0c\xfe\x91\xaa\xcdf\xe3\xa2\x01%\xfe\xa2\ +G\x01b%\x05\xf4\xfe\x91\x17\xcd-\xfe\x97=\x01s\ +\xfe\xc8\x90\x01\x0ad\xc3\xb2\x01\x7f\x00\x00\x01\x00u\x01\ +\x00\x04\x1d\x04\xa8\x00\x0b\x00\x12\xb7\x09\x01\x02\x01RY\ +\x06\x02\x00/3+\x11\x00310\x01!5!\x11\ +3\x11!\x15!\x11#\x01\xf0\xfe\x85\x01{\xb4\x01y\ +\xfe\x87\xb4\x02w\xb4\x01}\xfe\x83\xb4\xfe\x89\x00\x01\xff\ +\x9a\xfe\xf8\x01V\x00\xee\x00\x06\x00\x08\xb1\x04\x00\x00/\ +\xcd10%\x17\x02\x07#6\x13\x01N\x08}\x8d\xb2\ +i_\xee\x17\xfe\xfc\xdb\xee\x01\x08\x00\x00\x01\x00/\x01\ +\xbe\x02R\x02\x89\x00\x03\x00\x0b\xb4\x01\x00LY\x01\x00\ +/+10\x137!\x07/-\x01\xf6-\x01\xbe\xcb\ +\xcb\x00\x01\x00!\xff\xe3\x01N\x01\x14\x00\x0b\x00\x0c\xb5\ +\x09\x03QY\x09\x13\x00?+1074632\ +\x16\x15\x14\x06#\x22&!^T8C_MB?\ +^Sc?=NgG\x00\x00\x01\xff\xa4\x00\x00\x03\ +\xb8\x05\xb6\x00\x03\x00\x0a\xb3\x03\x03\x02\x12\x00??1\ +0\x01\x01#\x01\x03\xb8\xfc\xd5\xe9\x03+\x05\xb6\xfaJ\ +\x05\xb6\x00\x00\x02\x00\x5c\xff\xec\x04L\x05\xcd\x00\x0d\x00\ +\x1a\x00\x17@\x0c\x0b\x0eMY\x0b\x07\x04\x15MY\x04\ +\x19\x00?+\x00\x18?+10\x01\x10\x02\x04#\x22\ +&5\x10\x12$32\x16%\x22\x06\x02\x15\x14\x163\ +26\x125\x10\x04L\x9e\xfe\xe8\xb9\xc2\xbf\xa6\x01\x17\ +\xb6\xbb\xc2\xfepa\xa6kNZd\xa5c\x03\xf4\xfe\ +\xce\xfe\x1f\xf5\xff\xec\x01\x1c\x01\xe4\xf6\xed(\xe0\xfeo\ +\xc2\x8f\x96\xe3\x01\x96\xd3\x01\x0c\x00\x01\x00\xf2\x00\x00\x03\ +\xb4\x05\xb6\x00\x0a\x00\x10\xb6\x07\x04\x01\x09\x06\x01\x18\x00\ +??\x129910!#\x1367\x06\x07\x07'\ +\x013\x02}\xee\xbd\x1c69N\xbbj\x01\xfc\xc6\x03\ +f\x96\xae7/u\xaa\x01=\x00\x01\xff\xee\x00\x00\x04\ +?\x05\xcb\x00\x1b\x00\x1d@\x0f\x11\x0aMY\x11\x07\x02\ +\x1a\x01\x01\x1aNY\x01\x18\x00?+\x11\x12\x009\x18\ +?+10!!7\x01>\x0254&#\x22\x06\ +\x07'6632\x16\x15\x14\x06\x06\x07\x01\x15!\x03\ +\x8f\xfc_$\x01\xd7\xb0}8cZF\x8aesx\ +\xdeu\xb5\xd6N\xa8\xc8\xfe\xc9\x02n\xb4\x01\xa6\x9f\x90\ +{FUc\x0254&#\x22\x06\x07'632\x16\ +\x15\x14\x06\x07\x06\x06\x07\x014632\x16\x15\x14\x06\ +#\x22&\x01\x04\x12k{kO%UQM\x92N\ +N\xcf\xcb\xab\xc4\x7f\xa8h\x5c\x0f\xfe\xd9^T8C\ +bLB=\x01\xbc\x85\xafZMPQ0FX7\ +%\xb0q\xab\x9dx\xc3wJvU\xfe\xa2Sc?\ +=OdE\x00\x00\x02\x00d\xffF\x06\xaa\x05\xb4\x00\ +8\x00D\x00,@\x14\x07\x0a9\x11\x11(5\x04\x0a\ +\x1a??\x0a\x0a-!5\x03(-\x00/3?3\ +\x129/3\x113\x113\x11\x129/3\x1291\ +0\x01\x14\x02\x06#\x22&'#\x06#\x22&54\ +\x12632\x16\x16\x17\x03\x06\x15\x1432665\ +4$#\x22\x04\x02\x15\x10\x00327\x15\x06#\x22\ +$\x025\x10\x12$!2\x04\x12\x05\x22\x06\x06\x15\x14\ +32677&\x06\xaaw\xd6\x84bi\x0c\x06e\ +\xb0{\x85\x87\xf1\x8f4UJ\x5ce\x1eOH|G\ +\xfe\xff\xeb\xd6\xfe\xaa\xbf\x01\x19\xfb\xc8\xe6\xdb\xeb\xd2\xfe\ +\xc6\xa9\xf5\x01\xb9\x01\x11\xc8\x01$\x9b\xfd3V\x91R\ +pRw)@5\x03N\xb0\xfe\xdb\xa6\x5cJ\xa6\x9d\ +\x8c\x97\x01\x01\x95\x0a\x10\x1f\xfexr-\x5c\x85\xd8z\ +\xe4\xef\xc7\xfe\x94\xe0\xfe\xfd\xfe\xe4V\x9bZ\xa7\x018\ +\xd1\x01\x0e\x01\xb6\xfa\x95\xfe\xe8vk\xb5g\x9d\x90\x94\ +\xf0\x10\x00\x00\x02\xff\x87\x00\x00\x04N\x05\xb8\x00\x07\x00\ +\x0e\x00\x1a@\x0d\x0e\x01LY\x0e\x0e\x04\x07\x03\x12\x0b\ +\x04\x03\x00?3?3\x129/+10\x01!\x03\ +#\x01!\x13#\x03\x02&5\x06\x07\x03\x03;\xfe\x1b\ +\xd1\xfe\x03\x0f\x01\x12\xa6\xea9(\x0b7W\xac\x01\x96\ +\xfej\x05\xb8\xfaH\x02f\x01\xa0\xaf4\x8b\xa8\xfe\xb0\ +\x00\x00\x03\x00F\x00\x00\x04\xcb\x05\xb6\x00\x0f\x00\x17\x00\ + \x00-@\x17\x06 \x10\x10 KY\x10\x10\x0e\x0f\ +\x0f\x17LY\x0f\x03\x0e\x18LY\x0e\x12\x00?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x00910\ +\x012\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04!!\x01\ +\x1332654##\x0332654&#\ +#\x03\x0a\xde\xe3\xad\x99lw\xfe\xd4\xfe\xf5\xfe\x15\x01\ +5n\xc7\x8b\x98\xdf\xb5\xe3\xdf\x93\xa7xt\xc8\x05\xb6\ +\xa8\xa4\x92\xc2\x1e\x08\x1c\x97l\xd9\xf8\x05\xb6\xfd\xa4y\ +o\xac\xfb\xdb\x88~bg\x00\x00\x01\x00\x87\xff\xec\x05\ +!\x05\xcb\x00\x18\x00\x17@\x0c\x13\x00LY\x13\x04\x0c\ +\x07LY\x0c\x13\x00?+\x00\x18?+10\x01\x22\ +\x06\x02\x15\x14\x16327\x15\x06#\x22\x00\x11\x10\x12\ +$32\x17\x07&&\x03\x9c\x9a\xf2\x91\xa5\xa1\x8d\xbc\ +\xb4\xc2\xf8\xfe\xe7\xd3\x01`\xe2\xd9\xac^?\x8e\x04\xfe\ +\xb2\xfe\xab\xcc\xb4\xbfD\xcdC\x01)\x01\x0c\x01\x04\x01\ +\xbe\xe8\x5c\xc3\x220\x00\x00\x02\x00F\x00\x00\x05\x1f\x05\ +\xb6\x00\x09\x00\x13\x00\x17@\x0c\x06\x12LY\x06\x03\x05\ +\x13LY\x05\x12\x00?+\x00\x18?+10\x01\x10\ +\x02\x04!!\x01! \x00\x012$\x1254&#\ +#\x03\x05\x1f\xc8\xfe\x82\xfe\xfe\xfeo\x015\x01q\x01\ +\x0f\x01$\xfc\xc4\xb1\x01\x08\x8d\xb0\xa8\x92\xe3\x03}\xfe\ +\xf1\xfel\xda\x05\xb6\xfe\xde\xfc5\xac\x018\xc8\xb8\xc1\ +\xfb\xdb\x00\x00\x01\x00F\x00\x00\x04\x83\x05\xb6\x00\x0b\x00\ +&@\x14\x06\x09LY\x06\x06\x01\x02\x02\x05LY\x02\ +\x03\x01\x0aLY\x01\x12\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10!!\x01!\x07!\x03!\x07\ +!\x03!\x03N\xfc\xf8\x015\x03\x08+\xfd\xe5T\x01\ +\xf6)\xfe\x08`\x02\x1b\x05\xb6\xcd\xfeu\xcb\xfe8\x00\ +\x01\x00F\x00\x00\x04\x81\x05\xb6\x00\x09\x00\x1d@\x0f\x06\ +\x09LY\x06\x06\x02\x01\x12\x02\x05LY\x02\x03\x00?\ ++\x00\x18?\x129/+10!#\x01!\x07!\ +\x03!\x07!\x013\xed\x015\x03\x06+\xfd\xe7`\x01\ +\xf6-\xfe\x0c\x05\xb6\xcd\xfe:\xcb\x00\x00\x01\x00\x87\xff\ +\xec\x05\x5c\x05\xcb\x00\x1d\x00&@\x14\x00\x1dLY\x00\ +\x00\x05\x0c\x0c\x12LY\x0c\x04\x05\x19LY\x05\x13\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +!\x03\x06\x06# \x00\x11\x10\x12$32\x16\x17\x07\ +&#\x22\x04\x02\x15\x14\x16327\x13!\x03\x12\x02\ +\x00\x9dp\xd5\x84\xfe\xfb\xfe\xe0\xcd\x01w\xefo\xccg\ +Z\xae\xa0\x9e\xfe\xfe\x95\xb2\xa4mjP\xfe\xeb\x03\x19\ +\xfd (%\x01$\x01\x0b\x01\x08\x01\xb6\xf2)1\xcb\ +V\xb5\xfe\xb1\xcd\xb7\xbc!\x01s\x00\x00\x01\x00F\x00\ +\x00\x05\x8b\x05\xb6\x00\x0b\x00\x1a@\x0d\x08\x03LY\x08\ +\x08\x05\x0a\x06\x03\x01\x05\x12\x00?3?3\x129/\ ++10!#\x13!\x03#\x013\x03!\x133\x04\ +V\xee\x8c\xfd\xca\x8b\xed\x015\xed\x7f\x026\x7f\xed\x02\ +\x93\xfdm\x05\xb6\xfd\xaa\x02V\x00\x01\xff\xcf\x00\x00\x03\ +?\x05\xb6\x00\x0b\x00 @\x10\x09\x04\x06\x04KY\x06\ +\x03\x0a\x03\x01\x03KY\x01\x12\x00?+\x11\x003\x18\ +?+\x11\x00310!!77\x13'7!\x07\ +\x07\x03\x17\x02\x0a\xfd\xc5\x1a\xb5\xe3\x9a\x1d\x02;\x1a\xb6\ +\xe6\x9e\x85<\x043;\x87\x87;\xfb\xcd<\x00\x01\xfe\ +\xbe\xfeh\x02s\x05\xb6\x00\x0c\x00\x11\xb7\x08\x03\x00\x05\ +LY\x00#\x00?+\x00\x18?10\x03\x22'7\ +\x16327\x013\x01\x06\x06\x98hB\x05TE\xc9\ +5\x01+\xee\xfe\xcf.\xe7\xfeh\x19\xc9\x15\xfa\x05\x87\ +\xfaZ\xd9\xcf\x00\x00\x01\x00F\x00\x00\x05f\x05\xb6\x00\ +\x0c\x00\x15@\x09\x08\x02\x05\x0a\x06\x03\x01\x05\x12\x00?\ +3?3\x129910!!\x03\x07\x03#\x013\ +\x037\x01!\x01\x04?\xfe\xfa\xfc\x95u\xed\x015\xed\ +\x97\x8d\x01\xec\x01\x1c\xfd\x98\x02\x8fd\xfd\xd5\x05\xb6\xfd\ +>\xa6\x02\x1c\xfdc\x00\x00\x01\x00F\x00\x00\x03y\x05\ +\xb6\x00\x05\x00\x11\xb7\x01\x03\x00\x03LY\x00\x12\x00?\ ++\x00\x18?103\x013\x01!\x07F\x015\xed\ +\xfe\xf6\x02\x1b+\x05\xb6\xfb\x17\xcd\x00\x00\x01\x00D\x00\ +\x00\x06\xe5\x05\xb6\x00\x13\x00\x1b@\x0c\x11\x02\x02\x09\x06\ +\x0b\x07\x03\x00\x0e\x06\x12\x00?33?3\x1299\ +\x11310!\x03#\x06\x07\x03#\x01!\x133\x01\ +!\x01#\x1367#\x01\x02\x87s\x06\x09.\xb8\xdb\ +\x015\x01Cm\x06\x02^\x01X\xfe\xcf\xe3\xb6'/\ +\x06\xfd}\x04\xbev\xde\xfc\x96\x05\xb6\xfb\x83\x04}\xfa\ +J\x03h\xba\x9c\xfbB\x00\x01\x00D\x00\x00\x05\xdd\x05\ +\xb6\x00\x11\x00\x15@\x09\x03\x0b\x08\x10\x09\x03\x01\x08\x12\ +\x00?3?3\x129910!!\x01#\x07\x06\ +\x06\x03#\x01!\x0136\x127\x133\x04\xa8\xfe\xfc\ +\xfef\x06\x0a\x18\x17\xac\xdb\x015\x01\x0c\x01\x8f\x07\x06\ +2\x0f\xa0\xdb\x04\x8bE\x95\x7f\xfc\xce\x05\xb6\xfb\x836\ +\x01\x15A\x02\xf1\x00\x02\x00\x87\xff\xec\x05\x8d\x05\xcd\x00\ +\x0d\x00\x1b\x00\x17@\x0c\x0b\x0eLY\x0b\x04\x04\x15L\ +Y\x04\x13\x00?+\x00\x18?+10\x01\x10\x02\x04\ +# \x00\x11\x10\x12$32\x00%\x22\x06\x02\x15\x14\ +\x16326\x1254&\x05\x8d\xbe\xfe\xb3\xdc\xfe\xfd\ +\xfe\xe4\xc5\x01V\xd9\xfb\x01\x17\xfd\xdb\x8a\xe0\x7f\xa3\x92\ +\x8a\xdd{\x9e\x03\x9a\xfe\xe9\xfeL\xe3\x01+\x01\x08\x01\ +\x0b\x01\xb9\xea\xfe\xd6]\xc0\xfe\xab\xca\xad\xbc\xbf\x01S\ +\xce\xaa\xbe\x00\x02\x00F\x00\x00\x04\x96\x05\xb6\x00\x08\x00\ +\x13\x00\x1d@\x0f\x0d\x00LY\x0d\x0d\x10\x0f\x12\x10\x08\ +LY\x10\x03\x00?+\x00\x18?\x129/+10\ +\x0132654&##\x05\x14\x00!#\x03#\ +\x01!2\x16\x01\xd1^\xb2\xc3uyw\x02W\xfe\xad\ +\xfe\xd1ns\xed\x015\x01N\xe5\xe8\x02\xec\x9f\x92m\ +d\xc9\xf8\xfe\xf6\xfd\xdd\x05\xb6\xc9\x00\x00\x02\x00\x87\xfe\ +\xa4\x05\x8d\x05\xcd\x00\x10\x00\x1e\x00#@\x11\x05\x07\x0e\ +\x11LY\x0e\x04\x03\x18\x07\x07\x18LY\x07\x13\x00?\ ++\x11\x12\x009\x18?+\x00\x18\x10\xc610\x01\x10\ +\x00\x07\x01!\x03# \x00\x11\x10\x12$32\x00%\ +\x22\x06\x02\x15\x14\x16326\x1254&\x05\x8d\xfe\ +\xfc\xe1\x01\x08\xfe\xdf\xca\x1f\xfe\xfd\xfe\xe4\xc5\x01V\xd9\ +\xfb\x01\x17\xfd\xdb\x8a\xe0\x7f\xa3\x92\x8a\xdd{\x9e\x03\x9a\ +\xfe\xbe\xfe\x1e[\xfe\x89\x01H\x01+\x01\x08\x01\x0b\x01\ +\xb9\xea\xfe\xd6]\xc0\xfe\xab\xca\xad\xbc\xbc\x01S\xd1\xaa\ +\xbe\x00\x02\x00F\x00\x00\x04\x9a\x05\xb6\x00\x0d\x00\x16\x00\ +&@\x13\x0a\x00\x0e\x0e\x00KY\x0e\x0e\x03\x0c\x02\x12\ +\x03\x16LY\x03\x03\x00?+\x00\x18?3\x129/\ ++\x11\x12\x00910\x01\x03#\x01!2\x16\x15\x14\ +\x06\x07\x13!\x03'32654&##\x01\xae\ +{\xed\x015\x01R\xdf\xee\xad\xab\xf9\xfe\xfc\xcf\x8f{\ +\xaa\xa8v|w\x02H\xfd\xb8\x05\xb6\xbd\xc4\xa5\xe34\ +\xfd\x87\x02H\xc6\x96\x83i\x5c\x00\x01\x00'\xff\xec\x04\ +;\x05\xcb\x00$\x00 @\x10\x0b\x1e\x03\x16\x16\x1bL\ +Y\x16\x04\x03\x08LY\x03\x13\x00?+\x00\x18?+\ +\x11\x12\x009910\x01\x14\x04#\x22'5\x163\ +2654&'.\x02546632\x17\x07\ +&#\x22\x06\x15\x14\x16\x16\x17\x16\x16\x03\xa2\xfe\xdf\xfe\ +\xd2\x8a\xad\xb1\x89\x9eR\x83id5{\xe1\x8d\xcd\xb0\ +V\xa1\x86m\x84\x1e?g\x9bv\x01\xac\xd2\xeeK\xe0\ +auhEkSCn\x83O\x80\xc6l\x5c\xbfN\ +u^/G=Aa\xb5\x00\x00\x01\x00\xb0\x00\x00\x04\ +\xc3\x05\xb6\x00\x07\x00\x16@\x0a\x01\x12\x07\x03\x04\x03L\ +Y\x04\x03\x00?+\x11\x003\x18?10!#\x01\ +!7!\x07!\x02\x10\xed\x01\x08\xfe\x85-\x03\xe6+\ +\xfe\x83\x04\xe9\xcd\xcd\x00\x00\x01\x00\x98\xff\xec\x05\x8b\x05\ +\xb6\x00\x15\x00\x14@\x09\x15\x0a\x03\x04\x11LY\x04\x13\ +\x00?+\x00\x18?310\x01\x03\x02\x00#\x22&\ +547\x133\x03\x06\x15\x14\x163267\x13\x05\ +\x8b\xca8\xfe\xd0\xfb\xd9\xed\x14\xc1\xed\xc0\x15wy\x91\ +\xaa'\xc7\x05\xb6\xfcD\xfe\xf5\xfe\xfd\xd4\xc7SW\x03\ +\x85\xfcwXFfq\xa1\xb5\x03\xa8\x00\x01\x00\xba\x00\ +\x00\x05H\x05\xb6\x00\x0c\x00\x10\xb6\x0c\x06\x03\x07\x03\x06\ +\x12\x00??3\x12910%67\x013\x01!\ +\x033\x13\x16\x17\x07\x01\xfaFC\x01\xc7\xfe\xfd\x04\xfe\ +\xfe\x90\xe8J\x09\x02\x01\xf8\xb2\x83\x03\x89\xfaJ\x05\xb6\ +\xfcwg\x82L\x00\x01\x00\xcb\x00\x00\x07\xb4\x05\xb6\x00\ +\x1c\x00\x1b@\x0c\x17\x0e\x05\x0e\x09\x1b\x12\x0a\x03\x01\x09\ +\x12\x00?3?33\x1299\x11310!!\ +\x03'7#\x06\x07\x01!\x033\x13\x14\x07367\ +\x013\x13\x17\x073667\x013\x05%\xfe\xfe%\ +\x06\x04\x06/F\xfe\x7f\xff\x005\xe5\x13\x0d\x06S;\ +\x01\x83\xe1\x1f\x03\x03\x08\x1cT\x13\x01f\xf6\x03J\xb9\ +j\x90\x93\xfc\xb6\x05\xb6\xfc\xae\x88\xd2\xdd\x86\x03I\xfc\ +\xb9\xa9\xbcX\xdb+\x03N\x00\x00\x01\xff\x91\x00\x00\x05\ +%\x05\xb6\x00\x0b\x00\x15@\x09\x02\x08\x04\x09\x06\x03\x01\ +\x04\x12\x00?3?3\x129910!!\x03\x01\ +!\x01\x033\x13\x01!\x01\x04\x10\xff\x00\xc0\xfeJ\xfe\ +\xf7\x02J\xfa\xf6\xb2\x01\x92\x01\x0a\xfd\xd9\x02P\xfd\xb0\ +\x03\x02\x02\xb4\xfd\xe4\x02\x1c\xfd:\x00\x00\x01\x00\xba\x00\ +\x00\x05\x00\x05\xb6\x00\x08\x00\x10\xb6\x00\x05\x01\x07\x03\x05\ +\x12\x00??3\x12910\x01\x01!\x01\x03#\x13\ +\x033\x02F\x01\xb0\x01\x0a\xfd\x91r\xeew\xee\xf2\x03\ +\x19\x02\x9d\xfco\xfd\xdb\x02)\x03\x8d\x00\x01\xff\xd9\x00\ +\x00\x04\xa2\x05\xb6\x00\x09\x00 @\x10\x07\x04\x05\x04L\ +Y\x05\x03\x02\x08\x01\x08LY\x01\x12\x00?+\x11\x00\ +3\x18?+\x11\x00310!!7\x01!7!\ +\x07\x01!\x03\x85\xfcT!\x03R\xfd\xaa+\x03\x81#\ +\xfc\xac\x02\x85\xa8\x04?\xcf\xac\xfb\xc3\x00\x01\xff\xe5\xfe\ +\xbc\x03\x10\x05\xb6\x00\x07\x00\x0e\xb5\x05\x02\x03\x06\x01'\ +\x00?3?310\x01!\x01!\x07#\x013\x01\ +\x93\xfeR\x01}\x01\xae'\xdd\xfe\xd1\xdd\xfe\xbc\x06\xfa\ +\xb0\xfag\x00\x01\x00\xdd\x00\x00\x02\x87\x05\xb6\x00\x03\x00\ +\x0a\xb3\x03\x03\x02\x12\x00??10\x01\x13#\x03\x01\ +\xac\xdb\xd1\xd9\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\xffq\xfe\ +\xbc\x02\x9a\x05\xb6\x00\x07\x00\x0e\xb5\x03\x04\x03\x00\x07'\ +\x00?3?310\x073\x01#7!\x01!j\ +\xdb\x011\xdd'\x01\xae\xfe\x83\xfeT\x93\x05\x99\xb0\xf9\ +\x06\x00\x01\x00%\x02\x19\x04\x14\x05\xbe\x00\x06\x00\x0e\xb4\ +\x05\x02\x00\x04\x02\x00//3\x12910\x13\x013\ +\x01#\x03\x01%\x02`\x7f\x01\x10\xb8\xbc\xfeN\x02\x19\ +\x03\xa5\xfc[\x02\xb2\xfdN\x00\x00\x01\xffD\xfe\xbc\x02\ +\x93\xffH\x00\x03\x00\x08\xb1\x01\x02\x00/310\x01\ +!7!\x02u\xfc\xcf\x1e\x031\xfe\xbc\x8c\x00\x01\x02\ +\x1d\x04\xd9\x03\x96\x06!\x00\x08\x00\x0a\xb2\x06\x80\x01\x00\ +/\x1a\xcd10\x01#&&'53\x16\x17\x03\x96\ +\x90A\x86\x22\xf5/U\x04\xd9?\xb1C\x15\x9a\x95\x00\ +\x02\x00^\xff\xec\x04\x7f\x04f\x00\x12\x00 \x00'@\ +\x14\x0b\x11\x00\x07\x0c\x0f\x07\x1aFY\x07\x10\x0f\x15\x00\ +\x13FY\x00\x16\x00?+\x00\x18??+\x00\x18?\ +\x11\x129910\x05\x22&54\x12632\x16\ +\x17373\x03#7#\x06'26\x1254&\ +#\x22\x06\x02\x15\x14\x16\x01\x8f\x8d\xa4\x8b\xf4\x92a\x8c\ +'\x0a>\xb4\xec\xb6\x15\x06\x9eiR\x9ef^LU\ +\x96ZQ\x14\xcb\xb8\xca\x01`\xcd[W\x9e\xfb\xae\xb0\ +\xc4\xbe\x9b\x01\x04\x9aXk\x9a\xfe\xf7\x8efe\x00\x00\ +\x02\x00/\xff\xec\x04P\x06\x14\x00\x16\x00#\x00'@\ +\x14\x04\x0c\x00\x10\x07\x00\x06\x15\x10\x17FY\x10\x10\x00\ +\x1eFY\x00\x16\x00?+\x00\x18?+\x00\x18??\ +\x11\x129910\x05\x22&'#\x07#\x013\x03\ +\x06\x06\x0736632\x16\x15\x14\x02\x06\x03\x22\x06\ +\x02\x15\x14\x16326\x1254\x02Bb\x8d(\x0a\ +@\xb2\x01J\xebG\x0d2\x0f\x08Z\x96V\x91\xa2\x8b\ +\xf2\x0cQ\xa2c]UU\x94V\x14ZV\x9c\x06\x14\ +\xfe\xb3?\xbb/qW\xcf\xb6\xca\xfe\x9d\xc8\x03\xba\xa0\ +\xfe\xfb\x8c`k\x9d\x01\x07\x8f\xc9\x00\x00\x01\x00^\xff\ +\xec\x03\xcd\x04f\x00\x17\x00\x17@\x0c\x07\x0cFY\x07\ +\x10\x00\x12FY\x00\x16\x00?+\x00\x18?+10\ +\x05\x22&54\x12$32\x17\x07&#\x22\x02\x15\ +\x14\x163267\x15\x06\x01\xfa\xc4\xd8\x93\x01\x0a\xa9\ +\xa4\x85Fzc\x96\xc8pcJ\x81A\x8c\x14\xd4\xc5\ +\xcf\x01S\xbf=\xb85\xfe\xcd\xe2ox, \xc3G\ +\x00\x00\x02\x00^\xff\xec\x04\xdd\x06\x14\x00\x14\x00!\x00\ +.@\x18\x03\x0b\x0e\x00\x06\x00\x00\x1cFY\x00\x10\x09\ +\x0aHY\x09\x15\x0e\x15FY\x0e\x16\x00?+\x00\x18\ +?+\x00\x18?+\x00\x18?\x11\x129910\x01\ +2\x17367\x133\x01#7#\x06\x06#\x22&\ +54\x126\x1326\x1254&#\x22\x06\x02\x15\ +\x14\x02o\xb3Y\x08\x0d\x18L\xe9\xfe\xb6\xb8\x13\x07X\ +\xa4\x5c\x8f\xa2\x8f\xf0\x0cR\xa1aWYU\x94X\x04\ +f\xb2\x92h\x01f\xf9\xec\xb0jZ\xcb\xba\xcd\x01d\ +\xc4\xfcD\xa4\x01\x08\x87[n\x9a\xfe\xf4\x8b\xcb\x00\x00\ +\x02\x00^\xff\xec\x03\xfa\x04f\x00\x09\x00#\x00&@\ +\x14\x03\x18HY\x03\x03\x0a\x11\x11\x00HY\x11\x10\x0a\ +\x1dGY\x0a\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01\x22\x06\x0732654&\x03\ +\x22&54\x12$32\x16\x15\x14\x04!#\x07\x15\ +\x14\x163267\x15\x06\x06\x02\x98`\xa9%\x1d\xbc\ +\xd4@\xd7\xc5\xdd\x9b\x01\x09\xa4\xa1\xb3\xfe\xb3\xfe\xcc+\ +\x02qpH\x8ea`\xa1\x03\xb2\xac\x8dkb39\ +\xfc:\xde\xc7\xc6\x01U\xba\x91\x85\xb6\xcd\x1f\x1do~\ +&.\xbb,%\x00\x01\xff\x1f\xfe\x14\x03\xae\x06\x1f\x00\ +\x1e\x00)@\x16\x0f\x14FY\x0f\x00\x08\x1b\x0b\x18\x18\ +\x1bHY\x18\x0f\x00\x05FY\x00\x1b\x00?+\x00\x18\ +?+\x11\x003\x113\x18?+10\x03\x22'5\ +\x16327\x13#?\x026632\x17\x07&#\ +\x22\x06\x07\x073\x07#\x03\x06\x06LZ;@2\x86\ ++\xd9\xb3\x15\xc2\x15,\xb5\xa6s`=J>ES\ +\x16\x12\xe5%\xe5\xdf(\xb6\xfe\x14\x17\xbe\x14\xcd\x03\xfe\ +jL\x5c\xc6\xa7+\xb0\x1cVbV\xb2\xfb\xe3\xbd\xb2\ +\x00\x00\x03\xff\x87\xfe\x14\x04w\x04f\x00'\x004\x00\ +A\x00H@(\x1b((\x0eFY\x07\xbc\ +\xd0\xce\xb7\xcc\xfe\x9d\xc6\x03\xba\x9f\xfe\xfa\x8c`k\x9d\ +\x01\x07\x8f\xc9\x00\x00\x02\x00^\xfe\x14\x04\x7f\x04f\x00\ +\x15\x00\x22\x00'@\x14\x0c\x03\x0f\x00\x04\x0f\x07\x1b\x00\ +\x1dFY\x00\x10\x0f\x16FY\x0f\x16\x00?+\x00\x18\ +?+\x00\x18??\x11\x129910\x012\x173\ +73\x01#\x13667#\x06\x06#\x22&54\ +\x126\x1326\x1254&#\x22\x06\x02\x15\x14\x02\ +q\xb7[\x0a@\xb2\xfe\xac\xe9K\x0c?\x07\x08T\xa0\ +Z\x8b\xa0\x92\xef\x0dP\x9ea[QV\x94Y\x04f\ +\xb2\x9e\xf9\xc2\x01]8\xf8\x11lZ\xcd\xb6\xd0\x01f\ +\xc1\xfcD\xa2\x01\x08\x89^k\x9b\xfe\xf8\x8e\xcb\x00\x00\ +\x01\x00/\x00\x00\x03\x89\x04f\x00\x10\x00\x14@\x09\x05\ +\x0d\x0a\x00\x10\x0a\x15\x0b\x0f\x00???\x11921\ +0\x012\x17\x07&#\x22\x06\x07\x03#\x133\x073\ +66\x03\x1d>.360~\xc6'j\xec\xec\xb8\ +\x15\x09S\xa6\x04f\x0c\xdb\x0e\xe2\xb7\xfe\x0c\x04R\xcd\ +xi\x00\x00\x01\x00\x0e\xff\xec\x03q\x04f\x00\x22\x00\ + @\x10\x0b\x1c\x03\x14\x14\x19GY\x14\x10\x03\x08H\ +Y\x03\x16\x00?+\x00\x18?+\x11\x12\x00991\ +0\x01\x14\x06#\x22'5\x1632654&'\ +&&54632\x17\x07&#\x22\x06\x15\x14\x16\ +\x17\x1e\x02\x03\x0e\xec\xd2\xbe\x84\x99\x9faxEk}\ +g\xd6\xb6\xc4\x96L\x8c~I[BfiX.\x01\ +T\xad\xbbC\xcbZPE3I=C\x8b_\x9b\xb0\ +T\xb0LB;-F7;Tc\x00\x01\x00\x5c\xff\ +\xec\x03%\x05H\x00\x19\x00'@\x13\x0f\x11@\x0b\x14\ +\x0e\x11\x11\x14HY\x11\x0f\x06\x00FY\x06\x16\x00?\ ++\x00\x18?+\x11\x003\x113\x1a\x18\x10\xcd10\ +%27\x15\x06\x06# 547\x13#?\x023\ +\x07!\x07!\x03\x06\x15\x14\x16\x01\xc7DS#x<\ +\xfe\xee\x10y\xa2\x15\xbe\x81\x924\x01\x17'\xfe\xebz\ +\x0d2\xaa\x1f\xb2\x11\x1a\xf79J\x02:nR\xe8\xf6\ +\xb2\xfd\xc47%+3\x00\x01\x00o\xff\xec\x04\x87\x04\ +R\x00\x19\x00\x1b@\x0d\x0f\x12\x0a\x19\x0f\x0d\x15\x12\x05\ +FY\x12\x16\x00?+\x00\x18??3\x12910\ +\x01\x03\x06\x15\x1432667\x133\x03#7#\ +\x06\x06#\x22&5467\x13\x01\xfa\x81\x1f\x7fH\ +\x8en\x1ec\xe9\xe9\xb9\x15\x08R\xb2g\x86\x92\x18\x0c\ +{\x04R\xfd\x9e\x8d4\x85r\xd3\x8e\x01\xd5\xfb\xae\xcd\ +tm\x98\x8e?{>\x02H\x00\x01\x00d\x00\x00\x04\ +P\x04R\x00\x0c\x00\x0e\xb5\x05\x0a\x01\x0f\x00\x15\x00?\ +?32103\x033\x13\x16\x153667\x01\ +3\x01\xe7\x83\xe87\x0e\x07\x1cT\x17\x017\xfa\xfd\xaa\ +\x04R\xfd\xaa\x9f\x8aJ\xb6)\x02V\xfb\xae\x00\x01\x00\ +y\x00\x00\x06^\x04R\x00\x1b\x00\x1d@\x0d\x14\x0c\x03\ +\x0c\x07\x10\x10\x19\x08\x0f\x00\x07\x15\x00?3?33\ +\x11\x1299\x11310!\x03'7\x06\x06\x01!\ +\x033\x13\x06\x07367\x013\x13\x17\x073>\x02\ +\x133\x01\x03L\x13\x01\x03\x195\xfe\xc1\xfe\xfa/\xdd\ +\x0d\x02\x09\x06B+\x01\x16\xfe\x13\x01\x03\x06\x11P/\ +\xe4\xf4\xfd\xfa\x02sF\xc8>~\xfd;\x04R\xfdz\ +W\x9e\xb0`\x02k\xfd\xa45\xea2\xd9n\x02\x02\xfb\ +\xae\x00\x01\xff\xaa\x00\x00\x04T\x04R\x00\x0b\x00\x15@\ +\x09\x00\x06\x02\x07\x04\x0f\x0b\x02\x15\x00?3?3\x12\ +9910\x01\x01!\x01\x033\x13\x01!\x01\x13#\ +\x01\xe9\xfe\xcf\xfe\xf2\x01\xdb\xe7\xf5\x90\x01\x1f\x01\x12\xfe\ +3\xf8\xf6\x01\x83\xfe}\x029\x02\x19\xfe\x8b\x01u\xfd\ +\xdb\xfd\xd3\x00\x01\xffV\xfe\x14\x04R\x04R\x00\x17\x00\ +\x18@\x0b\x05\x0e\x09\x00\x0f\x0e\x13FY\x0e\x1b\x00?\ ++\x00\x18?3\x12910\x133\x13\x16\x16\x153\ +67\x013\x01\x06\x06#\x22'5\x163267\ +7d\xe8?\x09\x0e\x06V1\x01%\xfe\xfdPZ\xd4\ +\x8fLCK2Jx@3\x04R\xfd\xed>\xe1E\ +\xd7b\x02>\xfb\x00\xa5\x99\x13\xbc\x10Wp\x5c\x00\x00\ +\x01\xff\xd9\x00\x00\x03\xa2\x04R\x00\x09\x00$@\x12\x07\ +\x04\x05\x05\x04HY\x05\x0f\x02\x08\x01\x01\x08HY\x01\ +\x15\x00?+\x11\x12\x009\x18?+\x11\x12\x0091\ +0!!7\x01!7!\x07\x01!\x02\xcf\xfd\x0a\x1d\ +\x02{\xfeI'\x02\xc1%\xfd\x91\x01\xe6\x93\x03\x0d\xb2\ +\xaa\xfd\x0a\x00\x01\x00\x08\xfe\xbc\x03J\x05\xb6\x00'\x00\ + @\x10\x1b\x09\x09\xaf\x0a\xbf\x0a\x02\x0a\x0a\x13&'\ +\x14\x13\x03\x00?3/3\x129/]3\x1291\ +0\x01 5477654#7267\x13\ +>\x0233\x07\x22\x06\x07\x03\x06\x06\x07\x15\x16\x15\x14\ +\x07\x07\x06\x15\x14\x163\x15\x01\xc9\xfe\xc4\x11-\x0e\xd1\ +'x\x8f\x16;\x1cZ\x96{<)`W\x12F\x18\ +~t\xa0\x10+\x0bAM\xfe\xbc\xec=H\xc9A!\ +\x8d\xbbUe\x01\x13\x86\x87<\xb8DR\xfe\xcbl}\ +\x11\x06-\xaa&S\xc20\x1a3/\xb9\x00\x00\x01\x01\ +\xf2\xfe\x1f\x02\xa4\x06\x10\x00\x03\x00\x09\xb2\x00\x00\x03\x00\ +/?10\x013\x11#\x01\xf2\xb2\xb2\x06\x10\xf8\x0f\ +\x00\x00\x01\xff\xa8\xfe\xbc\x02\xd1\x05\xb6\x00&\x00 @\ +\x10\x1a\x0a\x0a\xaf\x09\xbf\x09\x02\x09\x09&\x13\x12%&\ +\x03\x00?3/3\x129/]3\x12910\x01\ + \x15\x14\x07\x07\x06\x15\x143\x07\x22\x06\x07\x03\x06\x06\ +##5667\x136675&5477\ +654\x01\x0e\x01>\x11-\x0e\xd1'y\ +\x8e\x16?\x22\xb3\xb4\x1dj]\x12F\x18~t\x9e\x11\ ++\x0aVN#\x05\xb6\xeb=H\xcbA!\x8e\xbaT\ +d\xfe\xce\xa5\x86\xb7\x02EP\x015mz\x11\x060\ +\xa77B\xc5,\x1e:(\xb8\x00\x01\x00o\x02;\x04\ ++\x03h\x00\x17\x00\x1f@\x0e\x0f\x06\x03\x12\x12\x0cR\ +Y\x12\x06\x00RY\x06\x00/+\x00\x18/+\x00\x10\ +\x18\xc4\x10\xc610\x01\x22\x06\x075632\x16\x17\ +\x16\x163267\x15\x06#\x22&'&&\x01X\ +3z;\xbfl\x18'\x1e\x19>\ +:\xbeo!! \x17\x00\x02\xff\xd3\xfe\x8b\x02\x0a\x04\ +^\x00\x03\x00\x0f\x00\x17@\x0a\x00\x00\x0d\x03\x0d\x07Q\ +Y\x0d\x10\x00?+\x00\x18/\x129/10\x133\ +\x03!\x01\x14\x06#\x22&54632\x16\xdd\xae\ +\xa6\xfe\xee\x027^P;DbNA<\x02\x85\xfc\ +\x06\x05VPd?\xdf\xb9\xb2\x9aD>\x87\ +MVaIp\x7fwilf\xf6\xcf\xbc\x7f\x98\xa7\ +ttNf\x82v\x01\x5cES]\x7f>Kc\x02\ +\xfc\xbcw dA\x8a\xa5N\x9e\x1d+E<+C\ +28\x8f`\x5c\x9e=Lu\x9d\xb0C\xbb]QG\ ++I0<\x8f\x01A\x1aj>=W9$m<\ +\x01\x7fF?09G:/>\x05d7\x84r\x80\xddr\xfd\ +\xba`\x9fOw\xc3\x85}\x00\x00\x02\x00P\x00d\x04\ +\x12\x03\xe3\x00\x06\x00\x0d\x00\x0c\xb3\x0c\x05\x08\x01\x00/\ +3\xc4210\x13\x01\x17\x01\x13\x07\x03%\x01\x17\x01\ +\x13\x07\x03P\x01\x8b\x87\xfe\xe0\x99\xb2\xd9\x01\xb8\x01\x81\ +\x89\xfe\xe8\x93\xb4\xd1\x02?\x01\xa4v\xfe\xb4\xfe\x8fL\ +\x01\xc5\x02\x01\xb2p\xfe\xa1\xfe\xa2L\x01\xae\x00\x01\x00\ +u\x01\x00\x04\x1d\x03+\x00\x05\x00\x11\xb6\x02\x05\x05\x04\ +RY\x05\x00/+\x00\x18\x10\xc410\x01\x11#\x11\ +!5\x04\x1d\xb3\xfd\x0b\x03+\xfd\xd5\x01w\xb4\x00\xff\ +\xff\x00/\x01\xbe\x02R\x02\x89\x02\x06\x00\x10\x00\x00\x00\ +\x04\x00\x83\xff\xec\x06b\x05\xcb\x00\x0f\x00\x1f\x00,\x00\ +5\x003@\x1d%)\x0f)\x1f)\x025*\x00*\ +\x10*\x02'-)**)-\x03\x0c\x1c\x04\x04\x14\ +\x0c\x13\x00?3?3\x12\x179///3]\x11\ +3]\x11310\x134\x12$32\x04\x12\x15\x14\ +\x02\x04#\x22$\x027\x14\x12\x0432$\x1254\ +\x02$#\x22\x04\x02%\x14\x06\x07\x13#\x03#\x11#\ +\x11! \x0132654&##\x83\xc8\x01^\ +\xca\xc7\x01]\xcb\xc5\xfe\xa4\xce\xcf\xfe\xa2\xc3{\xa6\x01\ +$\xab\xad\x01%\xa2\xa4\xfe\xdd\xad\xa8\xfe\xdb\xa8\x03\xc0\ +[U\xd3\xc8\xac[\xb2\x01\x0d\x01Q\xfeTHTZ\ +[SH\x02\xdb\xc8\x01^\xca\xc6\xfe\x9f\xc9\xc7\xfe\xa4\ +\xcc\xcf\x01Z\xc6\xa8\xfe\xdf\xac\xae\x01!\xa6\xa5\x01#\ +\xad\xa9\xfe\xdb\x09S|$\xfe\x8b\x01E\xfe\xbb\x03n\ +\xfegH?I8\x00\x00\x01\x00o\x06\x14\x04%\x06\ +\xba\x00\x03\x00\x08\xb1\x01\x02\x00/310\x01!7\ +!\x03\xfc\xfcs'\x03\x8f\x06\x14\xa6\x00\x02\x00\xbc\x03\ +;\x03N\x05\xcb\x00\x0c\x00\x18\x00\x0c\xb3\x10\x09\x16\x03\ +\x00/3\xc4210\x134632\x16\x15\x14\x06\ +#\x22&&7\x14\x1632654&#\x22\x06\ +\xbc\xc2\x88\x88\xc0\xc0\x88X\x9aX\x98hJHhg\ +IJh\x04\x81\x88\xc2\xc2\x88\x89\xbdX\x96XFh\ +hFJhg\x00\x02\x00u\x00\x00\x04\x1d\x04\xc3\x00\ +\x0b\x00\x0f\x00$@\x14\x0c\x0dRY\x0cB\x09\x01\x02\ +\x01RY\x06\x10\x02\x01p\x02\x01\x02\x00/]q3\ ++\x11\x003\x18?+10\x01!5!\x113\x11\ +!\x15!\x11#\x015!\x15\x01\xf0\xfe\x85\x01{\xb4\ +\x01y\xfe\x87\xb4\xfe\x85\x03\xa8\x02\x91\xb5\x01}\xfe\x83\ +\xb5\xfe\x8a\xfe\xe5\xb4\xb4\x00\x01\x00N\x02J\x03\x10\x05\ +\xc9\x00\x19\x00\x12\xb7\x0a\x10\x1f\x02\x18\x18\x01 \x00?\ +3\x129?310\x01!7%>\x0254&\ +#\x22\x07'6632\x16\x15\x14\x06\x06\x07\x07!\ +\x02\xaa\xfd\xa4\x1c\x01\x0doK#80[dPD\ +\x95^s\x89/ev\xae\x01s\x02J\x87\xdf_R\ +H&.4P{67x_Eon[\x8e\x00\ +\x01\x00h\x029\x03\x10\x05\xc9\x00#\x00'@\x16\x03\ +\x15\x15\x0f\x16\x1f\x16\x02\x0f\x16\x1f\x16\x02\x16\x16\x0a\x1c\ +!\x1f\x0f\x0a!\x00?3?3\x129/]q3\ +\x12910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x06#\x22\ +'5\x1632654##732654\ +#\x22\x07'632\x16\x03\x10mhNJ\xc7\xaa\ +\x8ap~zZc\x92l\x1c]Yku\x5c`D\ +~\xa5|\x8a\x04\xf8Zv\x1a\x04\x12bB\x81\x9a8\ +\x9fGJEq\x85DAdAyZo\x00\x01\x01\ +\xfc\x04\xd9\x03\xe5\x06!\x00\x08\x00\x0a\xb2\x03\x80\x08\x00\ +/\x1a\xcd10\x0167!\x15\x06\x06\x07#\x01\xfc\ +a\x80\x01\x086\xd0G\x9c\x04\xf2l\xc3\x13B\xbf4\ +\x00\x00\x01\xff\xc9\xfe\x14\x04\x93\x04R\x00\x1a\x00 @\ +\x10\x12\x0c\x0a\x07\x17\x0f\x16\x1b\x0a\x15\x0f\x03FY\x0f\ +\x16\x00?+\x00\x18???3\x129910\x01\ +\x14\x163267\x133\x03#7#\x06\x06#\x22\ +'#\x06\x07\x03#\x013\x03\x06\x01fB?q\xc1\ +-f\xe7\xeb\xb8\x16\x0aK\x9cWl/\x08\x09\x1eB\ +\xe9\x01R\xeb\x8d\x13\x013AH\xfb\xd4\x01\xd9\xfb\xae\ +\xbeocQI\xa2\xfe\xc2\x06>\xfdbT\x00\x01\x00\ +\xac\xfe\xfc\x04\xb4\x06\x14\x00\x0f\x00\x13\xb7\x08\x08\x01\x03\ +\x0e\x00\x05\x01\x00/3?3\x129/10\x01#\ +\x11#\x11#\x11\x06#\x22&5\x1063!\x04\xb4\ +\x8b\xbc\x8c>S\xd8\xcc\xda\xe9\x02E\xfe\xfc\x06f\xf9\ +\x9a\x033\x12\xfa\xfb\x01\x04\xfe\xff\xff\x00\x96\x029\x01\ +\xc3\x03j\x00\x07\x00\x11\x00u\x02V\x00\x01\xffD\xfe\ +\x14\x00\xec\x00\x00\x00\x12\x00\x1a@\x0d\x0d\x10@\x0b\x0e\ +H\x10\x10\x0f\x08\x03\x1b\x0f\x00/?3\x129/+\ +310\x13\x14\x06#\x22'5\x163254&\ +'73\x07\x16\x16\xec\xa4\x8e@6/1\x89FE\ +b\x922H@\xfe\xf8jz\x0f\x87\x0e`(+\x09\ +\xa8`\x19T\x00\x00\x01\x00\xc1\x02J\x02\xb6\x05\xb6\x00\ +\x0a\x00\x0e\xb5\x09\x03 \x06\x00\x1e\x00?2?91\ +0\x013\x03#\x1367\x06\x06\x07'\x02\x14\xa2\xba\ +\xbfc\x11(\x159}M\x05\xb6\xfc\x94\x01\xcdO\x8a\ +\x14.P\x81\x00\x00\x02\x00\xa4\x03\x02\x03\x08\x05\xc7\x00\ +\x0d\x00\x17\x00\x14@\x0a\x13\x00\x04\x10\x04\x02\x04\x0e\x0b\ +\x1f\x00?3\xc4]210\x01\x14\x06\x06#\x22&\ +546632\x16%\x22\x06\x15\x143265\ +4\x03\x08T\x9enz\x8aX\xa3k|\x82\xfe\xf6Q\ +gpMe\x04\xb6~\xc6p\x92\x83z\xc7o\x8f\x0a\ +\xaf\x81\x8d\xaf\x84\x8a\x00\x00\x02\x00\x0a\x00\x5c\x03\xcf\x03\ +\xdb\x00\x06\x00\x0d\x00\x0e\xb4\x08\x01\x01\x0c\x05\x00/3\ +\xc4/210\x01\x01'\x01\x037\x13\x05\x01'\x01\ +\x037\x13\x03\xcf\xfes\x86\x01\x1f\x99\xb4\xd9\xfeH\xfe\ +\x7f\x8c\x01\x19\x92\xb3\xd3\x01\xfe\xfe^w\x01J\x01r\ +L\xfe9\x02\xfePq\x01\x5c\x01`L\xfeP\x00\xff\ +\xff\x00\x95\x00\x00\x05\xc5\x05\xb6\x00'\x02\x17\x02\x93\x00\ +\x00\x00&\x00{\xd6\x00\x01\x07\x02<\x02\xc1\xfd\xb7\x00\ +\x09\xb3\x03\x02\x11\x18\x00?55\x00\xff\xff\x00y\x00\ +\x00\x06\x1e\x05\xb6\x00'\x02\x17\x02w\x00\x00\x00&\x00\ +{\xb9\x00\x01\x07\x00t\x03\x0e\xfd\xb7\x00\x07\xb2\x02\x10\ +\x18\x00?5\x00\xff\xff\x00l\x00\x00\x06/\x05\xc9\x00\ +'\x02\x17\x03!\x00\x00\x00'\x02<\x03+\xfd\xb7\x01\ +\x06\x00u\x04\x00\x00\x09\xb3\x02\x01\x06\x18\x00?55\ +\x00\x00\x02\xff\xdd\xfeu\x02\xfe\x04Z\x00\x19\x00%\x00\ +-@\x18\x07\x00\x19\x10\x19\x02\x0b\x03\x19\x19\x10##\ +\x1dQY#\x10\x10\x0aMY\x10\x22\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]910\x01\x06\ +\x06\x07\x0e\x02\x15\x14\x163267\x17\x06#\x22&\ +5467667\x01\x14\x06#\x22&546\ +32\x16\x02\x9c\x19mtkM%TQL\x93O\ +K\xcd\xcc\xae\xbf\x80\xa7]`\x16\x01'`R8C\ +]OB?\x02\x83\x92\xaaSONP0GW7\ +&\xb1p\xab\x9cx\xc6u@u_\x01^UcA\ +\x02\ +&\x00$\x00\x00\x01\x07\x00j\x00\x5c\x01R\x00\x0c\xb5\ +\x03\x02$$\x05&\x00+\x1155\xff\xff\xff\x87\x00\ +\x00\x04N\x07\x07\x02&\x00$\x00\x00\x01\x06\x01P\x1b\ +m\x00\x09\xb3\x03\x02$\x03\x00?55\x00\x00\x02\xff\ +\x87\x00\x00\x07%\x05\xb6\x00\x0f\x00\x13\x00<@ \x0a\ +\x0dLY\x0a\x0a\x01\x06\x13\x03LY\x13\x13\x01\x06\x05\ +\x12\x09\x12\x06\x12LY\x06\x03\x01\x0eLY\x01\x12\x00\ +?+\x00\x18?+\x11\x003\x18?\x11\x129/+\ +\x11\x12\x009\x18/+10!!\x13!\x01!\x01\ +!\x07!\x03!\x07!\x03!\x01\x13#\x01\x05\xf0\xfc\ +\xf7V\xfeP\xff\x00\xfe\xfa\x03\xa2\x03\xfc+\xfd\xe5T\ +\x01\xf8+\xfe\x0ab\x02\x1b\xfdM\x8aR\xfep\x01\x96\ +\xfej\x05\xb6\xcd\xfeu\xc8\xfe5\x01\x9b\x02\x83\xfd}\ +\x00\xff\xff\x00\x87\xfe\x14\x05!\x05\xcb\x02&\x00&\x00\ +\x00\x00\x07\x00z\x02+\x00\x00\xff\xff\x00F\x00\x00\x04\ +\x83\x07s\x02&\x00(\x00\x00\x01\x07\x00C\xff\xf1\x01\ +R\x00\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\xff\x00\ +F\x00\x00\x04\x83\x07s\x02&\x00(\x00\x00\x01\x07\x00\ +v\x00}\x01R\x00\x0a\xb4\x01\x14\x14\x05&\x00+\x11\ +5\xff\xff\x00F\x00\x00\x04\x83\x07s\x02&\x00(\x00\ +\x00\x01\x07\x01K\x00?\x01R\x00\x0a\xb4\x01\x12\x12\x05\ +&\x00+\x115\xff\xff\x00F\x00\x00\x04\x83\x07>\x02\ +&\x00(\x00\x00\x01\x07\x00j\x005\x01R\x00\x0c\xb5\ +\x02\x01!!\x05&\x00+\x1155\xff\xff\xff\xcf\x00\ +\x00\x03?\x07s\x02&\x00,\x00\x00\x01\x07\x00C\xff\ +\x09\x01R\x00\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\ +\xff\xff\xcf\x00\x00\x03\xb1\x07s\x02&\x00,\x00\x00\x01\ +\x07\x00v\xff\xcc\x01R\x00\x0a\xb4\x01\x14\x14\x05&\x00\ ++\x115\xff\xff\xff\xcf\x00\x00\x03\x8e\x07s\x02&\x00\ +,\x00\x00\x01\x07\x01K\xffc\x01R\x00\x0a\xb4\x01\x12\ +\x12\x05&\x00+\x115\xff\xff\xff\xcf\x00\x00\x03~\x07\ +>\x02&\x00,\x00\x00\x01\x07\x00j\xffg\x01R\x00\ +\x0c\xb5\x02\x01!!\x05&\x00+\x1155\x00\x02\x00\ +5\x00\x00\x05\x1f\x05\xb6\x00\x0d\x00\x1b\x00-@\x17\x1a\ +\x07\x08\x07LY\x17\x08\x08\x05\x0a\x0a\x16LY\x0a\x03\ +\x05\x1bLY\x05\x12\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/3+\x11\x00310\x01\x10\x02\x04!!\ +\x13#73\x13! \x00\x012$\x1254&#\ +#\x03!\x07!\x03\x05\x1f\xc8\xfe\x82\xfe\xfe\xfeo\x81\ +\x92-\x90\x89\x01q\x01\x0f\x01$\xfc\xc4\xb1\x01\x08\x8d\ +\xb0\xa8\x92^\x01\x1d-\xfe\xe5Z\x03}\xfe\xf1\xfel\ +\xda\x02o\xc8\x02\x7f\xfe\xde\xfc5\xac\x018\xc8\xb8\xc1\ +\xfeI\xc8\xfeZ\xff\xff\x00D\x00\x00\x05\xdd\x07H\x02\ +&\x001\x00\x00\x01\x07\x01R\x01\x00\x01R\x00\x0a\xb4\ +\x01\x1b\x1b\x05&\x00+\x115\xff\xff\x00\x87\xff\xec\x05\ +\x8d\x07s\x02&\x002\x00\x00\x01\x07\x00C\x00o\x01\ +R\x00\x0a\xb4\x02\x1d\x1d\x05&\x00+\x115\xff\xff\x00\ +\x87\xff\xec\x05\x8d\x07s\x02&\x002\x00\x00\x01\x07\x00\ +v\x01\x17\x01R\x00\x0a\xb4\x02$$\x05&\x00+\x11\ +5\xff\xff\x00\x87\xff\xec\x05\x8d\x07s\x02&\x002\x00\ +\x00\x01\x07\x01K\x00\xc9\x01R\x00\x0a\xb4\x02\x22\x22\x05\ +&\x00+\x115\xff\xff\x00\x87\xff\xec\x05\x8d\x07H\x02\ +&\x002\x00\x00\x01\x07\x01R\x00\xd9\x01R\x00\x0a\xb4\ +\x02%%\x05&\x00+\x115\xff\xff\x00\x87\xff\xec\x05\ +\x8d\x07>\x02&\x002\x00\x00\x01\x07\x00j\x00\xc5\x01\ +R\x00\x0c\xb5\x03\x0211\x05&\x00+\x1155\x00\ +\x01\x00\x93\x01\x1f\x04\x00\x04\x87\x00\x0b\x00\x16@\x0a\x03\ +\x00\x06\x09\x04\x02\x0a\x08\x04\x02\x00/3/3\x12\x17\ +910\x01\x017\x01\x01\x17\x01\x01\x07\x01\x01'\x01\ +\xc9\xfe\xca}\x018\x019\x7f\xfe\xc5\x017{\xfe\xc7\ +\xfe\xc8z\x02\xd3\x017}\xfe\xcb\x015{\xfe\xc7\xfe\ +\xc7{\x015\xfe\xcd{\x00\x03\x00m\xff\xaa\x05\xb4\x06\ +\x04\x00\x15\x00\x1e\x00'\x00.@\x1a\x1d!\x1c\x22\x04\ +$\x16\x11\x14\x09\x06\x04\x04\x0f\x0f\x16LY\x0f\x04\x04\ +$LY\x04\x13\x00?+\x00\x18?+\x11\x12\x00\x17\ +9\x11\x12\x17910\x01\x10\x02\x04#\x22'\x07'\ +7&5\x10\x12$32\x177\x17\x07\x16%\x22\x06\ +\x02\x15\x14\x17\x01&\x134'\x01\x16326\x12\x05\ +\x8d\xbe\xfe\xb3\xdc\xc1}v\x85\x81g\xc5\x01V\xd9\xbd\ +\x80w\x85\x85^\xfd\xdb\x8d\xe0\x82\x18\x02\x9cP\xbf\x13\ +\xfdkKw\x8b\xdf|\x03\x9a\xfe\xe9\xfeL\xe3S\x95\ +h\xa0\x8a\xe3\x01\x0b\x01\xb9\xea^\x95h\xa6\x82\x8e\xba\ +\xfe\xa8\xcfXL\x03DA\xfe\x96X7\xfc\xc78\xbf\ +\x01R\x00\xff\xff\x00\x98\xff\xec\x05\x8b\x07s\x02&\x00\ +8\x00\x00\x01\x07\x00C\x00N\x01R\x00\x0a\xb4\x01\x17\ +\x17\x05&\x00+\x115\xff\xff\x00\x98\xff\xec\x05\x8b\x07\ +s\x02&\x008\x00\x00\x01\x07\x00v\x01\x1b\x01R\x00\ +\x0a\xb4\x01\x1e\x1e\x05&\x00+\x115\xff\xff\x00\x98\xff\ +\xec\x05\x8b\x07s\x02&\x008\x00\x00\x01\x07\x01K\x00\ +\xb6\x01R\x00\x0a\xb4\x01\x1c\x1c\x05&\x00+\x115\xff\ +\xff\x00\x98\xff\xec\x05\x8b\x07>\x02&\x008\x00\x00\x01\ +\x07\x00j\x00\xb0\x01R\x00\x0c\xb5\x02\x01++\x05&\ +\x00+\x1155\xff\xff\x00\xba\x00\x00\x05\x00\x07s\x02\ +&\x00<\x00\x00\x01\x07\x00v\x00f\x01R\x00\x0a\xb4\ +\x01\x11\x11\x05&\x00+\x115\x00\x02\x00F\x00\x00\x04\ +d\x05\xb6\x00\x0c\x00\x15\x00\x1f@\x11\x09\x15LY\x0d\ +\x04LY\x09\x0d\x09\x0d\x06\x07\x03\x06\x12\x00??\x12\ +99//++10\x01\x14\x00!#\x03#\x01\ +3\x0732\x16\x0132654&##\x04d\ +\xfe\xb3\xfe\xcalB\xed\x015\xed3a\xe3\xeb\xfd:\ +`\xb0\xc5wyy\x031\xf3\xfe\xf3\xfe\xcf\x05\xb6\xf3\ +\xca\xfe\x01\x9d\x94mb\x00\x01\xfe\xfe\xfe\x14\x04\xb6\x06\ +\x1b\x009\x00,@\x181\x14%\x03\x1d\x0c\x0c4G\ +Y\x0c\x00\x1d\x22HY\x1d\x16\x00\x05FY\x00\x1b\x00\ +?+\x00\x18?+\x00\x18?+\x11\x12\x00\x1791\ +0\x03\x22'5\x163267\x016632\x16\ +\x15\x14\x07\x06\x06\x15\x14\x17\x1e\x02\x15\x14\x06#\x22'\ +5\x1632654&'&&54676\ +654&#\x22\x07\x01\x06\x06uEH=4A\ +S\x16\x01\x060\xfa\xe0\xbc\xd1\xb3v=JkH&\ +\xe8\xc6\xb6e~~iv/XRNY[bQ\ +^U\xd24\xfe\xf8*\xb9\xfe\x14\x17\xc1\x15Wh\x04\ +\xd2\xe7\xcc\xa0\x87\xa9\x82WA#,9TVc<\ +\xac\xc8A\xc9VXP0JF@sEK\x80<\ +B\x5c4AH\xef\xfb\x14\xc5\xae\x00\xff\xff\x00^\xff\ +\xec\x04\x7f\x06!\x02&\x00D\x00\x00\x01\x06\x00C\xb9\ +\x00\x00\x0a\xb4\x02\x22\x22\x11&\x00+\x115\xff\xff\x00\ +^\xff\xec\x04\x7f\x06!\x02&\x00D\x00\x00\x01\x06\x00\ +vZ\x00\x00\x0a\xb4\x02))\x11&\x00+\x115\xff\ +\xff\x00^\xff\xec\x04\x7f\x06!\x02&\x00D\x00\x00\x01\ +\x06\x01K\xfd\x00\x00\x0a\xb4\x02''\x11&\x00+\x11\ +5\xff\xff\x00^\xff\xec\x04\x7f\x05\xf6\x02&\x00D\x00\ +\x00\x01\x06\x01R\x12\x00\x00\x0a\xb4\x02**\x11&\x00\ ++\x115\xff\xff\x00^\xff\xec\x04\x7f\x05\xec\x02&\x00\ +D\x00\x00\x01\x06\x00j\xff\x00\x00\x0c\xb5\x03\x0266\ +\x11&\x00+\x1155\xff\xff\x00^\xff\xec\x04\x7f\x06\ +\x9a\x02&\x00D\x00\x00\x01\x06\x01P\xe8\x00\x00\x0c\xb5\ +\x03\x02$$\x11&\x00+\x1155\x00\x03\x00^\xff\ +\xec\x06\x8f\x04f\x00)\x007\x00A\x00?@#;\ +!HY;;\x06\x02\x14\x17\x04\x09\x10\x15\x0f81\ +\x101FY\x1a\x10\x10\x04\x15%*\x09*FY\x00\ +\x09\x16\x00?3+\x11\x003\x18??3+\x11\x00\ +3\x18?\x11\x12\x1799/+10\x05\x22'\x07\ +#7#\x06\x06#\x22&54\x12632\x16\x17\ +373\x076632\x16\x15\x14\x04!#\x07\x14\ +\x16327\x15\x06%26\x1254&#\x22\x06\ +\x02\x15\x14\x16\x01\x22\x06\x0732654&\x04\xa2\ +\xdeS\x17\x97\x14\x08U\xa1^\x86\x97\x8a\xef\x8dX\x80\ +,\x09?\x94\x193\xa0d\x8c\xa1\xfe\xb3\xfe\xcc-\x04\ +ys}\xb4\xaf\xfc\x86U\x9b`MKU\x95SJ\ +\x03\x9fg\xab%\x1f\xbb\xd4D\x14\x89u\xb0jZ\xce\ +\xb5\xc9\x01b\xccW[\x9eu?J\x99}\xb6\xcd<\ +uxT\xbdO\xbe\xa1\x01\x0e\x84[n\xa0\xfe\xfa\x8b\ +ib\x03\x08\xac\x8dk`:4\x00\xff\xff\x00^\xfe\ +\x14\x03\xcd\x04f\x02&\x00F\x00\x00\x00\x07\x00z\x01\ +\x81\x00\x00\xff\xff\x00^\xff\xec\x03\xfa\x06!\x02&\x00\ +H\x00\x00\x01\x06\x00C\x97\x00\x00\x0a\xb4\x02%%\x11\ +&\x00+\x115\xff\xff\x00^\xff\xec\x04\x16\x06!\x02\ +&\x00H\x00\x00\x01\x06\x00v1\x00\x00\x0a\xb4\x02,\ +,\x11&\x00+\x115\xff\xff\x00^\xff\xec\x04\x09\x06\ +!\x02&\x00H\x00\x00\x01\x06\x01K\xde\x00\x00\x0a\xb4\ +\x02**\x11&\x00+\x115\xff\xff\x00^\xff\xec\x03\ +\xfa\x05\xec\x02&\x00H\x00\x00\x01\x06\x00j\xda\x00\x00\ +\x0c\xb5\x03\x0299\x11&\x00+\x1155\xff\xff\x00\ +/\x00\x00\x02\x18\x06!\x02&\x00\xf3\x00\x00\x01\x07\x00\ +C\xfe\x82\x00\x00\x00\x0a\xb4\x01\x05\x05\x11&\x00+\x11\ +5\xff\xff\x00/\x00\x00\x03\x1d\x06!\x02&\x00\xf3\x00\ +\x00\x01\x07\x00v\xff8\x00\x00\x00\x0a\xb4\x01\x0c\x0c\x11\ +&\x00+\x115\xff\xff\x00/\x00\x00\x03\x09\x06!\x02\ +&\x00\xf3\x00\x00\x01\x07\x01K\xfe\xde\x00\x00\x00\x0a\xb4\ +\x01\x0a\x0a\x11&\x00+\x115\xff\xff\x00/\x00\x00\x02\ +\xfb\x05\xec\x02&\x00\xf3\x00\x00\x01\x07\x00j\xfe\xe4\x00\ +\x00\x00\x0c\xb5\x02\x01\x19\x19\x11&\x00+\x1155\x00\ +\x02\x00P\xff\xec\x04{\x06%\x00\x1d\x00+\x006@\ +\x1c\x05\x08\x00\x1b\x04\x06\x1c\x1c\x03\x19\x0e\x15\x15%G\ +Y\x15\x15\x0e\x06\x03\x01\x0e\x1eGY\x0e\x16\x00?+\ +\x00\x18?3\x129/+\x11\x12\x009\x129\x18/\ +\x12\x17910\x01&'7\x16\x177\x17\x07\x16\x11\ +\x14\x02\x04#\x22&54\x12632\x16\x173&\ +'\x07'\x1326654&#\x22\x06\x06\x15\x14\ +\x16\x02\x87,[j\x81P\xfaF\xd9\x9b\x92\xfe\xfa\xb5\ +\xc5\xdb\x83\xee\x93`\x90)\x06\x0a{\xfaHP\x5c\x8b\ +Nh\x5c[\x8bJb\x05-)7\x98HJ\x8a\x7f\ +y\xcd\xfe\xcd\xff\xfe\x85\xbf\xd6\xc3\xa2\x01\x12\x9cMF\ +\xf3\x8c\x8e\x81\xfb\xeew\xc7jatp\xc3sho\ +\x00\xff\xff\x00/\x00\x00\x04}\x05\xf6\x02&\x00Q\x00\ +\x00\x01\x06\x01R%\x00\x00\x0a\xb4\x01\x22\x22\x11&\x00\ ++\x115\xff\xff\x00^\xff\xee\x047\x06!\x02&\x00\ +R\x00\x00\x01\x06\x00C\x9f\x00\x00\x0a\xb4\x02\x1d\x1d\x11\ +&\x00+\x115\xff\xff\x00^\xff\xee\x047\x06!\x02\ +&\x00R\x00\x00\x01\x06\x00vH\x00\x00\x0a\xb4\x02$\ +$\x11&\x00+\x115\xff\xff\x00^\xff\xee\x047\x06\ +!\x02&\x00R\x00\x00\x01\x06\x01K\xf3\x00\x00\x0a\xb4\ +\x02\x22\x22\x11&\x00+\x115\xff\xff\x00^\xff\xee\x04\ +Z\x05\xf6\x02&\x00R\x00\x00\x01\x06\x01R\x02\x00\x00\ +\x0a\xb4\x02%%\x11&\x00+\x115\xff\xff\x00^\xff\ +\xee\x047\x05\xec\x02&\x00R\x00\x00\x01\x06\x00j\xef\ +\x00\x00\x0c\xb5\x03\x0211\x11&\x00+\x1155\x00\ +\x03\x00u\x00\xec\x04\x1d\x04\xb6\x00\x03\x00\x0f\x00\x1b\x00\ +\x1c@\x0c\x07\x0d\x19\x13\x0d\x13\x01\x01\x00RY\x01\x00\ +/+\x11\x0033\x18/3/310\x135!\ +\x15\x014632\x16\x15\x14\x06#\x22&\x1146\ +32\x16\x15\x14\x06#\x22&u\x03\xa8\xfd\xae?>\ +>AE::C?>>AE::C\x02w\ +\xb4\xb4\xfe\xfe@GH?@IG\x02\xfc@GH\ +?@IG\x00\x00\x03\x003\xff\xa6\x04Z\x04\x93\x00\ +\x15\x00\x1d\x00&\x00.@\x1a\x1c$\x1b%\x04\x1e\x16\ +\x11\x14\x09\x06\x04\x04\x0f\x0f\x16GY\x0f\x10\x04\x1eG\ +Y\x04\x16\x00?+\x00\x18?+\x11\x12\x00\x179\x11\ +\x12\x17910\x01\x14\x02\x06#\x22'\x07'7&\ +54\x12$32\x177\x17\x07\x16%\x22\x02\x15\x14\ +\x17\x01&\x0326654'\x01\x16\x045\x94\xfd\ +\xa2\x89bi{sF\x8d\x01\x02\xa9\x88gV}d\ +?\xfeX\x8d\xbc\x08\x01\xba-\xc9Y\x94U\x06\xfeL\ +)\x02\xbc\xd0\xfe\xb0\xae;\x83`\x8dh\x9d\xc8\x01J\ +\xba=l`udN\xfe\xdd\xdb'#\x02%#\xfd\ +\x00\x85\xeb\x8c-\x16\xfd\xe2!\xff\xff\x00o\xff\xec\x04\ +\x87\x06!\x02&\x00X\x00\x00\x01\x06\x00C\xa1\x00\x00\ +\x0a\xb4\x01\x1b\x1b\x11&\x00+\x115\xff\xff\x00o\xff\ +\xec\x04\x87\x06!\x02&\x00X\x00\x00\x01\x06\x00vs\ +\x00\x00\x0a\xb4\x01\x22\x22\x11&\x00+\x115\xff\xff\x00\ +o\xff\xec\x04\x87\x06!\x02&\x00X\x00\x00\x01\x06\x01\ +K\x10\x00\x00\x0a\xb4\x01 \x11&\x00+\x115\xff\ +\xff\x00o\xff\xec\x04\x87\x05\xec\x02&\x00X\x00\x00\x01\ +\x06\x00j\x06\x00\x00\x0c\xb5\x02\x01//\x11&\x00+\ +\x1155\xff\xff\xffV\xfe\x14\x04R\x06!\x02&\x00\ +\x5c\x00\x00\x01\x06\x00v\xf9\x00\x00\x0a\xb4\x01 \x11\ +&\x00+\x115\x00\x02\xff\xc9\xfe\x14\x04P\x06\x14\x00\ +\x16\x00$\x00'@\x14\x04\x0d\x00\x10\x09\x00\x08\x1b\x10\ +\x17FY\x10\x10\x00\x1eFY\x00\x16\x00?+\x00\x18\ +?+\x00\x18??\x11\x129910\x05\x22&'\ +#\x06\x07\x03#\x013\x06\x06\x073632\x16\x15\ +\x14\x02\x06\x03\x22\x06\x02\x15\x14\x16326\x1254\ +&\x02J^\x8e+\x08\x07\x12`\xe9\x01\xb0\xeb02\ +3\x08\x9b\xad\x90\xa1\x88\xe9\x1cT\x9e`\x5cVV\x93\ +VR\x14[U[^\xfe1\x08\x00\xdf\xe8\xaf\xc8\xcc\ +\xb9\xcc\xfe\x9d\xc6\x03\xba\xa2\xfe\xf7\x86bi\x9a\x01\x08\ +\x91de\xff\xff\xffV\xfe\x14\x04R\x05\xec\x02&\x00\ +\x5c\x00\x00\x01\x06\x00j\x99\x00\x00\x0c\xb5\x02\x01--\ +\x11&\x00+\x1155\xff\xff\xff\x87\x00\x00\x04q\x06\ +\xdb\x02&\x00$\x00\x00\x01\x07\x01M\x00{\x01R\x00\ +\x0a\xb4\x02\x12\x12\x05&\x00+\x115\xff\xff\x00^\xff\ +\xec\x04\x7f\x05\x89\x02&\x00D\x00\x00\x01\x06\x01M#\ +\x00\x00\x0a\xb4\x02$$\x11&\x00+\x115\xff\xff\xff\ +\x87\x00\x00\x04\x92\x07Z\x02&\x00$\x00\x00\x01\x07\x01\ +N\x00H\x01R\x00\x0a\xb4\x02\x12\x12\x05&\x00+\x11\ +5\xff\xff\x00^\xff\xec\x04\x7f\x06\x08\x02&\x00D\x00\ +\x00\x01\x06\x01N\xf9\x00\x00\x0a\xb4\x02$$\x11&\x00\ ++\x115\xff\xff\xff\x87\xfe-\x04N\x05\xb8\x02&\x00\ +$\x00\x00\x00\x07\x01Q\x031\x00\x00\xff\xff\x00^\xfe\ +-\x04\x7f\x04f\x02&\x00D\x00\x00\x00\x07\x01Q\x02\ +\xa4\x00\x00\xff\xff\x00\x87\xff\xec\x05!\x07s\x02&\x00\ +&\x00\x00\x01\x07\x00v\x01\x1b\x01R\x00\x0a\xb4\x01!\ +!\x05&\x00+\x115\xff\xff\x00^\xff\xec\x04\x14\x06\ +!\x02&\x00F\x00\x00\x01\x06\x00v/\x00\x00\x0a\xb4\ +\x01 \x11&\x00+\x115\xff\xff\x00\x87\xff\xec\x05\ +!\x07s\x02&\x00&\x00\x00\x01\x07\x01K\x00\xc1\x01\ +R\x00\x0a\xb4\x01\x1f\x1f\x05&\x00+\x115\xff\xff\x00\ +^\xff\xec\x03\xf5\x06!\x02&\x00F\x00\x00\x01\x06\x01\ +K\xca\x00\x00\x0a\xb4\x01\x1e\x1e\x11&\x00+\x115\xff\ +\xff\x00\x87\xff\xec\x05!\x07L\x02&\x00&\x00\x00\x01\ +\x07\x01O\x01\xdb\x01R\x00\x0a\xb4\x01\x22\x22\x05&\x00\ ++\x115\xff\xff\x00^\xff\xec\x03\xcd\x05\xfa\x02&\x00\ +F\x00\x00\x01\x07\x01O\x00\xf4\x00\x00\x00\x0a\xb4\x01!\ +!\x11&\x00+\x115\xff\xff\x00\x87\xff\xec\x05!\x07\ +s\x02&\x00&\x00\x00\x01\x07\x01L\x00\x98\x01R\x00\ +\x0a\xb4\x01$$\x05&\x00+\x115\xff\xff\x00^\xff\ +\xec\x04*\x06!\x02&\x00F\x00\x00\x01\x06\x01L\xbd\ +\x00\x00\x0a\xb4\x01##\x11&\x00+\x115\xff\xff\x00\ +F\x00\x00\x05\x1f\x07s\x02&\x00'\x00\x00\x01\x07\x01\ +L\x00\x5c\x01R\x00\x0a\xb4\x02\x1f\x1f\x05&\x00+\x11\ +5\xff\xff\x00^\xff\xec\x06^\x06\x14\x02&\x00G\x00\ +\x00\x01\x07\x028\x02\xfe\x00\x00\x00\x07\xb2\x02$\x00\x00\ +?5\x00\xff\xff\x005\x00\x00\x05\x1f\x05\xb6\x02\x06\x00\ +\x92\x00\x00\x00\x02\x00^\xff\xec\x05P\x06\x14\x00\x1c\x00\ +)\x00Q@0\x13\x03\x11\x00\x0f\x07\x08\x07IY\x0c\ +\x0f\x08\x1f\x08/\x08\x03\x13\x03\x08\x08\x00\x0a\x00\x00$\ +FY\x00\x00\x10\x00 \x00\x03\x09\x03\x00\x0f\x11\x15\x16\ +\x1dFY\x16\x16\x00?+\x00\x18??_^]+\ +\x00\x18?\x129/_^]3+\x11\x003\x11\x12\ +9910\x012\x173677!7!73\ +\x073\x07#\x01#7#\x06\x06#\x22&54\x12\ +6\x1326\x1254&#\x22\x06\x06\x15\x14\x02f\ +\xb7Z\x08\x05\x12\x16\xfe\xb2!\x01P%\xe9%\x98#\ +\x97\xfe\xfd\xb8\x13\x07R\xa5]\x92\xa3\x86\xec\x1cP\x9b\ +dT\x5cW\x93U\x04L\xaaKim\xa3\xae\xae\xa3\ +\xfb=\xb0g]\xd0\xb5\xc0\x01X\xc3\xfc^\x9a\x01\x00\ +\x85Wk\x93\xfa\x89\xcb\xff\xff\x00F\x00\x00\x04\x83\x06\ +\xdb\x02&\x00(\x00\x00\x01\x07\x01M\x00X\x01R\x00\ +\x0a\xb4\x01\x0f\x0f\x05&\x00+\x115\xff\xff\x00^\xff\ +\xec\x03\xfa\x05\x89\x02&\x00H\x00\x00\x01\x06\x01M\x04\ +\x00\x00\x0a\xb4\x02''\x11&\x00+\x115\xff\xff\x00\ +F\x00\x00\x04\x83\x07Z\x02&\x00(\x00\x00\x01\x07\x01\ +N\x00-\x01R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00+\x11\ +5\xff\xff\x00^\xff\xec\x04(\x06\x08\x02&\x00H\x00\ +\x00\x01\x06\x01N\xde\x00\x00\x0a\xb4\x02''\x11&\x00\ ++\x115\xff\xff\x00F\x00\x00\x04\x83\x07/\x02&\x00\ +(\x00\x00\x01\x07\x01O\x01D\x015\x00\x0a\xb4\x01\x15\ +\x15\x05&\x00+\x115\xff\xff\x00^\xff\xec\x03\xfa\x05\ +\xfa\x02&\x00H\x00\x00\x01\x07\x01O\x00\xfe\x00\x00\x00\ +\x0a\xb4\x02--\x11&\x00+\x115\xff\xff\x00F\xfe\ +-\x04\x83\x05\xb6\x02&\x00(\x00\x00\x00\x07\x01Q\x02\ +/\x00\x00\xff\xff\x00^\xfeF\x03\xfa\x04f\x02&\x00\ +H\x00\x00\x00\x07\x01Q\x01\xf0\x00\x19\xff\xff\x00F\x00\ +\x00\x04\x9a\x07s\x02&\x00(\x00\x00\x01\x07\x01L\x00\ +-\x01R\x00\x0a\xb4\x01\x17\x17\x05&\x00+\x115\xff\ +\xff\x00^\xff\xec\x04G\x06!\x02&\x00H\x00\x00\x01\ +\x06\x01L\xda\x00\x00\x0a\xb4\x02//\x11&\x00+\x11\ +5\xff\xff\x00\x87\xff\xec\x05\x5c\x07s\x02&\x00*\x00\ +\x00\x01\x07\x01K\x00\xc5\x01R\x00\x0a\xb4\x01$$\x05\ +&\x00+\x115\xff\xff\xff\x87\xfe\x14\x04w\x06!\x02\ +&\x00J\x00\x00\x01\x06\x01K\x02\x00\x00\x0a\xb4\x03H\ +H\x11&\x00+\x115\xff\xff\x00\x87\xff\xec\x05\x5c\x07\ +Z\x02&\x00*\x00\x00\x01\x07\x01N\x00\xaa\x01R\x00\ +\x0a\xb4\x01!!\x05&\x00+\x115\xff\xff\xff\x87\xfe\ +\x14\x04w\x06\x08\x02&\x00J\x00\x00\x01\x06\x01N\xde\ +\x00\x00\x0a\xb4\x03EE\x11&\x00+\x115\xff\xff\x00\ +\x87\xff\xec\x05\x5c\x07L\x02&\x00*\x00\x00\x01\x07\x01\ +O\x01\xe3\x01R\x00\x0a\xb4\x01''\x05&\x00+\x11\ +5\xff\xff\xff\x87\xfe\x14\x04w\x05\xfa\x02&\x00J\x00\ +\x00\x01\x07\x01O\x01!\x00\x00\x00\x0a\xb4\x03KK\x11\ +&\x00+\x115\xff\xff\x00\x87\xfe;\x05\x5c\x05\xcb\x02\ +&\x00*\x00\x00\x00\x07\x029\x01#\x00\x00\xff\xff\xff\ +\x87\xfe\x14\x04w\x06!\x02&\x00J\x00\x00\x01\x06\x02\ +:u\x00\x00\x0a\xb4\x03EE\x11&\x00+\x115\xff\ +\xff\x00F\x00\x00\x05\x8b\x07s\x02&\x00+\x00\x00\x01\ +\x07\x01K\x00\xb8\x01R\x00\x0a\xb4\x01\x12\x12\x05&\x00\ ++\x115\xff\xff\x00/\x00\x00\x04q\x07\xaa\x02&\x00\ +K\x00\x00\x01\x07\x01K\x00F\x01\x89\x00\x0a\xb4\x01!\ +!\x02&\x00+\x115\x00\x02\x00F\x00\x00\x06\x14\x05\ +\xb6\x00\x13\x00\x17\x000@\x17\x03\x16\x0b\x0b\x00\x10\x0c\ +\x0c\x09\x0e\x17\x07LY\x17\x17\x09\x12\x0e\x03\x05\x09\x12\ +\x00?3?3\x129/+\x11\x12\x009\x18/3\ +33\x113310\x013\x07#\x03#\x13!\x03\ +#\x13#7373\x07!73\x017!\x07\x05\ +^\xb6\x22\xb9\xe1\xf0\x8c\xfd\xca\x8b\xed\xe1\xb6%\xb6/\ +\xed/\x026/\xef\xfe\x92+\xfd\xca+\x04\xd7\xaa\xfb\ +\xd3\x02\x93\xfdm\x04-\xaa\xdf\xdf\xdf\xfd\xaa\xcd\xcd\x00\ +\x01\x00/\x00\x00\x04?\x06\x14\x00\x1f\x00<@!\x16\ +\x0b\x1a\x15\x0d\x0e\x0dIY\x12\x0e\x0e\x1a\x10\x1a\x05F\ +Y\x00\x1a\x10\x1a \x1a\x03\x1a\x1a\x0b\x10\x00\x00\x0b\x15\ +\x00?3?\x129/]+\x11\x12\x009\x18/3\ ++\x11\x003\x11\x12910!\x13654#\x22\ +\x06\x06\x07\x03#\x01#7373\x07!\x07!\x03\ +3663 \x11\x14\x07\x03\x02\xbe\x88\x10yI\x93\ +q\x1bZ\xec\x01\x04\x9d$\x9a%\xeb%\x01D#\xfe\ +\xbdT\x08S\xa8]\x01\x16\x14\x83\x02{G8\x83s\ +\xd1\x89\xfeP\x04\xc3\xa3\xae\xae\xa3\xfe\xb8j]\xfe\xc6\ +8h\xfd\x98\x00\xff\xff\xff\xcf\x00\x00\x03\xda\x07H\x02\ +&\x00,\x00\x00\x01\x07\x01R\xff\x82\x01R\x00\x0a\xb4\ +\x01\x15\x15\x05&\x00+\x115\xff\xff\x00/\x00\x00\x03\ +M\x05\xf6\x02&\x00\xf3\x00\x00\x01\x07\x01R\xfe\xf5\x00\ +\x00\x00\x0a\xb4\x01\x0d\x0d\x11&\x00+\x115\xff\xff\xff\ +\xcf\x00\x00\x03z\x06\xdb\x02&\x00,\x00\x00\x01\x07\x01\ +M\xff\x84\x01R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00+\x11\ +5\xff\xff\x00/\x00\x00\x02\xeb\x05\x89\x02&\x00\xf3\x00\ +\x00\x01\x07\x01M\xfe\xf5\x00\x00\x00\x0a\xb4\x01\x07\x07\x11\ +&\x00+\x115\xff\xff\xff\xcf\x00\x00\x03\x9b\x07Z\x02\ +&\x00,\x00\x00\x01\x07\x01N\xffQ\x01R\x00\x0a\xb4\ +\x01\x0f\x0f\x05&\x00+\x115\xff\xff\x00/\x00\x00\x03\ +\x16\x06\x08\x02&\x00\xf3\x00\x00\x01\x07\x01N\xfe\xcc\x00\ +\x00\x00\x0a\xb4\x01\x07\x07\x11&\x00+\x115\xff\xff\xff\ +\xcf\xfe-\x03?\x05\xb6\x02&\x00,\x00\x00\x00\x07\x01\ +Q\x00\xa4\x00\x00\xff\xff\xff\xa6\xfe-\x02V\x05\xfa\x02\ +&\x00L\x00\x00\x00\x06\x01QF\x00\xff\xff\xff\xcf\x00\ +\x00\x03?\x07L\x02&\x00,\x00\x00\x01\x07\x01O\x00\ +{\x01R\x00\x0a\xb4\x01\x15\x15\x05&\x00+\x115\x00\ +\x01\x00/\x00\x00\x02\x06\x04R\x00\x03\x00\x0a\xb3\x02\x0f\ +\x01\x15\x00??10!#\x133\x01\x1b\xec\xec\xeb\ +\x04R\x00\xff\xff\xff\xcf\xfeh\x05@\x05\xb6\x00&\x00\ +,\x00\x00\x00\x07\x00-\x02\xcd\x00\x00\xff\xff\x00/\xfe\ +\x14\x04\x89\x05\xfa\x00&\x00L\x00\x00\x00\x07\x00M\x02\ +3\x00\x00\xff\xff\xfe\xbe\xfeh\x03i\x07s\x02&\x00\ +-\x00\x00\x01\x07\x01K\xff>\x01R\x00\x0a\xb4\x01\x13\ +\x13\x05&\x00+\x115\xff\xff\xfe\xfc\xfe\x14\x03\x01\x06\ +!\x02&\x027\x00\x00\x01\x07\x01K\xfe\xd6\x00\x00\x00\ +\x0a\xb4\x01\x13\x13\x11&\x00+\x115\xff\xff\x00F\xfe\ +;\x05f\x05\xb6\x02&\x00.\x00\x00\x00\x07\x029\x00\ +\xa2\x00\x00\xff\xff\x00/\xfe;\x04\x87\x06\x14\x02&\x00\ +N\x00\x00\x00\x06\x029`\x00\x00\x01\x00/\x00\x00\x04\ +\x87\x04R\x00\x0e\x00\x18@\x0c\x0e\x03\x06\x07\x04\x09\x01\ +\x0a\x0f\x05\x09\x15\x00?3?3\x12\x17910\x01\ +\x01!\x01\x01!\x03\x07\x03#\x133\x03\x06\x07\x01\x8b\ +\x01\xec\x01\x10\xfe\x1d\x01#\xfe\xfa\xd1\x88M\xec\xea\xeb\ +9\x0d7\x02V\x01\xfc\xfe\x1b\xfd\x93\x01\xd7`\xfe\x89\ +\x04R\xfe\xfa5\xc1\x00\xff\xff\x00F\x00\x00\x03\x8e\x07\ +s\x02&\x00/\x00\x00\x01\x07\x00v\xff\xa9\x01R\x00\ +\x0a\xb4\x01\x0e\x0e\x05&\x00+\x115\xff\xff\x00/\x00\ +\x00\x03u\x07\xac\x02&\x00O\x00\x00\x01\x07\x00v\xff\ +\x90\x01\x8b\x00\x0a\xb4\x01\x0c\x0c\x02&\x00+\x115\xff\ +\xff\x00F\xfe;\x03y\x05\xb6\x02&\x00/\x00\x00\x00\ +\x06\x029o\x00\xff\xff\xff\x9e\xfe;\x02d\x06\x14\x02\ +&\x00O\x00\x00\x00\x07\x029\xff\x13\x00\x00\xff\xff\x00\ +F\x00\x00\x04d\x05\xb7\x02&\x00/\x00\x00\x01\x07\x02\ +8\x01\x04\xff\xa3\x00\x07\xb2\x01\x09\x03\x00?5\x00\xff\ +\xff\x00/\x00\x00\x03\xe3\x06\x14\x02&\x00O\x00\x00\x01\ +\x07\x028\x00\x83\x00\x00\x00\x0a\xb4\x01\x06\x06\x00&\x00\ ++\x115\xff\xff\x00F\x00\x00\x03\xbd\x05\xb6\x02&\x00\ +/\x00\x00\x00\x07\x01O\x01o\xfdk\xff\xff\x00/\x00\ +\x00\x033\x06\x14\x00&\x00O\x00\x00\x00\x07\x01O\x00\ +\xe5\xfd]\x00\x01\x00\x0a\x00\x00\x03y\x05\xb6\x00\x0d\x00\ +#@\x12\x07\x0a\x04\x01\x04\x02@\x08\x08\x00\x05\x03\x00\ +\x0bLY\x00\x12\x00?+\x00\x18?\x129/\x1a\xcd\ +\x179103\x13\x07'7\x133\x037\x17\x05\x03\ +!\x07FjTR\xd5\x9c\xed|\xbcT\xfe\xbe\x5c\x02\ +\x1b+\x01\xee0\x9cu\x02\xe7\xfd\xaek\x9c\xb2\xfeL\ +\xcd\x00\x01\x00\x02\x00\x00\x02\x91\x06\x14\x00\x0b\x00(@\ +\x1a\x00\x03\x09\x06\x04\x01\x0f\x07\x1f\x07/\x07O\x07_\ +\x07\x9f\x07\x06\x07\x07\x05\x0a\x00\x05\x15\x00??\x129\ +/]\xcd\x17910\x017\x17\x07\x03#\x13\x07'\ +7\x133\x01\xe3_O\xdf\x8f\xeaqXP\xd7\xac\xe8\ +\x03\x877\x99\x7f\xfdZ\x02\x123\x9a{\x03 \x00\xff\ +\xff\x00D\x00\x00\x05\xdd\x07s\x02&\x001\x00\x00\x01\ +\x07\x00v\x01P\x01R\x00\x0a\xb4\x01\x1a\x1a\x05&\x00\ ++\x115\xff\xff\x00/\x00\x00\x04V\x06!\x02&\x00\ +Q\x00\x00\x01\x06\x00vq\x00\x00\x0a\xb4\x01!!\x11\ +&\x00+\x115\xff\xff\x00D\xfe;\x05\xdd\x05\xb6\x02\ +&\x001\x00\x00\x00\x07\x029\x00\xf2\x00\x00\xff\xff\x00\ +/\xfe;\x04J\x04f\x02&\x00Q\x00\x00\x00\x06\x02\ +9d\x00\xff\xff\x00D\x00\x00\x05\xdd\x07s\x02&\x00\ +1\x00\x00\x01\x07\x01L\x00\xd5\x01R\x00\x0a\xb4\x01\x1d\ +\x1d\x05&\x00+\x115\xff\xff\x00/\x00\x00\x04m\x06\ +!\x02&\x00Q\x00\x00\x01\x06\x01L\x00\x00\x00\x0a\xb4\ +\x01$$\x11&\x00+\x115\xff\xff\x00.\x00\x00\x04\ +\xdd\x05\xb6\x00'\x00Q\x00\x93\x00\x00\x00\x06\x02\x07\xbb\ +\x00\x00\x01\x00D\xfej\x05\xdd\x05\xb6\x00\x18\x00\x1d@\ +\x0e\x11\x09\x0d\x14\x0e\x03\x0d\x12\x00\x05LY\x00#\x00\ +?+\x00\x18??3\x129910\x01\x22'7\ +\x16327\x01#\x02\x07\x03#\x01!\x01367\ +\x133\x01\x06\x06\x02\xd1l@\x04WC\xce6\xfeC\ +\x06-\x1b\x9d\xdb\x015\x01\x00\x01\xa2\x06\x1a2\x95\xdb\ +\xfe\xcb+\xec\xfej\x19\xcb\x17\xc9\x04\x8b\xfe\xdb}\xfd\ +\x17\x05\xb6\xfb\xb4\xa9\xe1\x02\xc2\xfaJ\xc8\xce\x00\x01\x00\ +/\xfe\x14\x04J\x04f\x00\x22\x00#@\x12\x15\x19\x12\ +\x15\x19\x0cFY\x19\x10\x13\x0f\x00\x05FY\x00\x1b\x00\ +?+\x00\x18??+\x00\x18?\x12910\x01\x22\ +'5\x16327\x13654#\x22\x06\x06\x07\x03\ +#\x133\x0736632\x16\x15\x14\x07\x03\x0e\x02\ +\x02\x1dLH=8\x81'\xa6\x12\x81H\x8cp\x1cb\ +\xec\xec\xb8\x15\x09S\xb0g\x86\x93\x17\x9b\x22\x5c\x92\xfe\ +\x14\x17\xc1\x17\xbc\x03\x0fZ)\x83r\xd7\x88\xfe+\x04\ +R\xcdvk\x98\x8c:{\xfd\x1b\x9f\xa2S\xff\xff\x00\ +\x87\xff\xec\x05\x8d\x06\xdb\x02&\x002\x00\x00\x01\x07\x01\ +M\x00\xe9\x01R\x00\x0a\xb4\x02\x1f\x1f\x05&\x00+\x11\ +5\xff\xff\x00^\xff\xee\x047\x05\x89\x02&\x00R\x00\ +\x00\x01\x06\x01M\x08\x00\x00\x0a\xb4\x02\x1f\x1f\x11&\x00\ ++\x115\xff\xff\x00\x87\xff\xec\x05\x8d\x07Z\x02&\x00\ +2\x00\x00\x01\x07\x01N\x00\xaa\x01R\x00\x0a\xb4\x02\x1f\ +\x1f\x05&\x00+\x115\xff\xff\x00^\xff\xee\x047\x06\ +\x08\x02&\x00R\x00\x00\x01\x06\x01N\xd8\x00\x00\x0a\xb4\ +\x02\x1f\x1f\x11&\x00+\x115\xff\xff\x00\x87\xff\xec\x05\ +\xcb\x07s\x02&\x002\x00\x00\x01\x07\x01S\x013\x01\ +R\x00\x0c\xb5\x03\x02..\x05&\x00+\x1155\xff\ +\xff\x00^\xff\xee\x04\xd3\x06!\x02&\x00R\x00\x00\x01\ +\x06\x01S;\x00\x00\x0c\xb5\x03\x02..\x11&\x00+\ +\x1155\x00\x02\x00\x87\xff\xec\x07R\x05\xcd\x00\x15\x00\ +!\x00:@ \x10\x13LY\x10\x10\x01\x0c\x0c\x0fL\ +Y\x0c\x03\x0a\x1bLY\x0a\x04\x01\x14LY\x01\x12\x03\ +\x16LY\x03\x13\x00?+\x00\x18?+\x00\x18?+\ +\x00\x18?+\x11\x12\x009\x18/+10!!\x06\ +# \x00\x11\x10\x12$32\x17!\x07!\x03!\x07\ +!\x03!\x0527\x13&#\x22\x06\x02\x15\x14\x16\x06\ +\x1d\xfd3TV\xfe\xfd\xfe\xe4\xc5\x01V\xd9\x91N\x02\ +\xf8+\xfd\xe5T\x01\xf8+\xfe\x08`\x02\x1b\xfclJ\ +A\xdeDq\x8a\xe0\x7f\xa3\x14\x01+\x01\x08\x01\x0b\x01\ +\xb9\xea\x17\xcd\xfeu\xc8\xfe5\x13\x1b\x04\x0e\x1f\xc0\xfe\ +\xab\xca\xad\xbc\x00\x00\x03\x00^\xff\xec\x06\xc3\x04f\x00\ +\x22\x00/\x009\x00;@\x1e\x0e\x03\x05\x0c3\x18H\ +Y33\x05\x0c0#\x0c#FY\x11\x0c\x10\x1c*\ +\x05*FY\x00\x05\x16\x00?3+\x11\x003\x18?\ +3+\x11\x003\x11\x129\x18/+\x11\x12\x0099\ +10\x05\x22&'\x06#\x22&54\x12632\ +\x176632\x16\x15\x14\x04!#\x07\x14\x1632\ +67\x15\x06\x06\x01\x22\x06\x06\x15\x14\x1632\x125\ +4&%\x22\x06\x0732654&\x04\xc9x\xb9\ +0\x89\xed\xba\xda\x93\xff\xa6\xedbI\xca}\x9f\xaf\xfe\ +\xb5\xfe\xce/\x03qqE\x83o[\xa8\xfd]W\x8d\ +Wa[\x8f\xadc\x02\x89i\xae\x22\x1f\xbd\xd2<\x14\ +\x5c\x5c\xb6\xe7\xc5\xce\x01M\xaf\xc0[g\x95\x81\xb7\xcc\ +\x02&\x00<\x00\x00\x01\ +\x07\x00j\x00\x0e\x01R\x00\x0c\xb5\x02\x01\x1e\x1e\x05&\ +\x00+\x1155\xff\xff\xff\xd9\x00\x00\x04\xa2\x07s\x02\ +&\x00=\x00\x00\x01\x07\x00v\x00\x7f\x01R\x00\x0a\xb4\ +\x01\x12\x12\x05&\x00+\x115\xff\xff\xff\xd9\x00\x00\x03\ +\xde\x06!\x02&\x00]\x00\x00\x01\x06\x00v\xf9\x00\x00\ +\x0a\xb4\x01\x12\x12\x11&\x00+\x115\xff\xff\xff\xd9\x00\ +\x00\x04\xa2\x07L\x02&\x00=\x00\x00\x01\x07\x01O\x01\ +1\x01R\x00\x0a\xb4\x01\x13\x13\x05&\x00+\x115\xff\ +\xff\xff\xd9\x00\x00\x03\xa2\x05\xfa\x02&\x00]\x00\x00\x01\ +\x07\x01O\x00\x9a\x00\x00\x00\x0a\xb4\x01\x13\x13\x11&\x00\ ++\x115\xff\xff\xff\xd9\x00\x00\x04\xa2\x07s\x02&\x00\ +=\x00\x00\x01\x07\x01L\x00\x17\x01R\x00\x0a\xb4\x01\x15\ +\x15\x05&\x00+\x115\xff\xff\xff\xd9\x00\x00\x03\xf1\x06\ +!\x02&\x00]\x00\x00\x01\x06\x01L\x84\x00\x00\x0a\xb4\ +\x01\x15\x15\x11&\x00+\x115\x00\x01\xff\x02\xfe\x14\x03\ +\x91\x06\x1f\x00\x17\x00\x17@\x0c\x0c\x11FY\x0c\x00\x00\ +\x05FY\x00\x1b\x00?+\x00\x18?+10\x03\x22\ +'5\x163267\x016632\x17\x07&#\ +\x22\x06\x07\x01\x06\x06h[;@3>\x5c\x16\x01\x12\ +)\xb4\xa8u`=J=ET\x15\xfe\xe9(\xb5\xfe\ +\x14\x17\xbe\x14di\x05\x10\xc0\xad+\xb0\x1cUc\xfa\ +\xdb\xbf\xb0\x00\x01\xff\xf2\xfe\x14\x04o\x05\xcb\x00\x1f\x00\ +(@\x15\x10\x15FY\x0a\x1c\x19\x1cHY\x0c\x19\x19\ +\x10\x00\x00\x05FY\x00\x1b\x00?+\x00\x18\x10\xc49\ +/3+\x11\x003+10\x13\x22'5\x1632\ +67\x13#?\x026632\x17\x07&#\x22\x06\ +\x07\x073\x07#\x03\x06\x06\x87Z;@2>]\x15\ +\xc1\xb2\x14\xc5\x16%\xb9\xaasb>J=GS\x14\ +\x17\xe4%\xe3\xc9+\xb5\xfe\x14\x17\xbe\x14di\x03\x93\ +mGu\xbe\xaf+\xb0\x1cUcm\xb2\xfcN\xc0\xaf\ +\x00\x00\x04\xff\x89\x00\x00\x04\xc5\x07\xaa\x00\x10\x00\x1a\x00\ +&\x00.\x00M@\x16*\x06LY.\x09\x02$\x1e\ +\x1a@\x0d\x13H\x1a\x0e\x00\x0e\x10\x0e\x02\x0e\xb8\xff\xc0\ +@\x17\x0d\x10H*$\x0e\x0e$*\x03\x08\x0f\x14\x01\ +\x14@\x0d\x13H\x14\x04\x08\x12\x00?3/+]\x12\ +\x179///+]\x10\xc6+3\x11333+\ +10\x01\x14\x07\x13#\x03!\x03#\x01&546\ +32\x16%667!\x15\x06\x06\x07#\x134&\ +#\x22\x06\x15\x14\x16326\x07\x06\x06\x03!\x02&\ +'\x04\x06T\x9c\xea+\xfe\x1d\xd1\xfc\x02\xc9#\x83g\ +h\x85\xfe\xcf+\x8a&\x01\x155\xbfV\xa6\xac:.\ +/<65.:\xa0\x161\xd7\x01f&\x09\x04\x05\ +\xa6rB\xfb\x0e\x01\x8d\xfes\x05#0Qgzz\ +\xc2$\x8a/\x0e1\x810\xfe\xea199127\ +7\xd83h\xfe]\x01k\x8cG\x00\x00\x05\x00^\xff\ +\xec\x04\x8d\x07\xaa\x00\x09\x00\x15\x00!\x004\x00B\x00\ +Q@-\x08\x08\x13\x0f\x03_\x03\x02\x0c\x03\x19\x00\x13\ +\x01\x10\x13\x1f\x0f\x0d\x01\x22\x03\x0d)@2,\x22)\ +.\x0f)\xb4\ +\xec\xb6\x15\x06\x9eiR\x9ef^LU\x96ZQ\x06\ +\xcd)\x88,\x0e)\x845\xfe\xd5f{yfg{\ +yi2992088\xfa\x8f\xcb\xb8\xca\x01`\ +\xcd[W\x9e\xfb\xae\xb0\xc4\xbe\x9b\x01\x04\x9aXk\x9a\ +\xfe\xf7\x8efe\xff\xff\xff\x87\x00\x00\x07%\x07s\x02\ +&\x00\x88\x00\x00\x01\x07\x00v\x02m\x01R\x00\x0a\xb4\ +\x02\x1c\x1c\x05&\x00+\x115\xff\xff\x00^\xff\xec\x06\ +\x8f\x06!\x02&\x00\xa8\x00\x00\x01\x07\x00v\x01\xaa\x00\ +\x00\x00\x0a\xb4\x03JJ\x11&\x00+\x115\xff\xff\x00\ +m\xff\xaa\x05\xb4\x07s\x02&\x00\x9a\x00\x00\x01\x07\x00\ +v\x01\x12\x01R\x00\x0a\xb4\x0300\x05&\x00+\x11\ +5\xff\xff\x003\xff\xa6\x04Z\x06!\x02&\x00\xba\x00\ +\x00\x01\x06\x00v?\x00\x00\x0a\xb4\x03//\x11&\x00\ ++\x115\xff\xff\x00'\xfe;\x04;\x05\xcb\x02&\x00\ +6\x00\x00\x00\x06\x029\x1b\x00\xff\xff\x00\x0e\xfe;\x03\ +q\x04f\x02&\x00V\x00\x00\x00\x06\x029\xda\x00\x00\ +\x01\x01b\x04\xd9\x04+\x06!\x00\x0d\x00\x0e\xb4\x03\x0b\ +\x80\x06\x01\x00/3\x1a\xcd210\x01#&'\x06\ +\x07#56673\x16\x17\x04+\x98LU\x83i\ +\xa4\x8a~\x1b\xf8&\x88\x04\xd9?snD\x19\x80\x87\ +(c\xcc\x00\x01\x01\xa6\x04\xd9\x04m\x06!\x00\x0d\x00\ +\x0e\xb4\x05\x01\x80\x03\x0b\x00/3\x1a\xcd210\x01\ +3\x16\x17673\x15\x06\x06\x07#&'\x01\xa6\x95\ +E]}q\xa2P\xb2!\xf8,\x80\x06!:xi\ +I\x1bG\xb7/n\xbf\x00\x01\x01\x8b\x04\xd9\x03\xf6\x05\ +\x89\x00\x03\x00\x08\xb1\x00\x03\x00/310\x01!\x07\ +!\x01\xb0\x02F%\xfd\xba\x05\x89\xb0\x00\x01\x01\xc5\x04\ +\xd9\x04J\x06\x08\x00\x0f\x00\x12\xb7\x08\x7f\x00\x01\x00\x80\ +\x0c\x03\x00/3\x1a\xcd]210\x01\x06\x06#\x22\ +&5473\x14\x163267\x04J\x1f\xb2\x98\ +\x85\x97\x04\x87IWX_\x0f\x06\x08\x9b\x94\x84t$\ +\x13?>>?\x00\x01\x01B\x04\xf6\x02N\x05\xfa\x00\ +\x0b\x00\x08\xb1\x03\x09\x00/\xcd10\x014632\ +\x16\x15\x14\x06#\x22&\x01BNG5BQA4\ +F\x05bDT56GR4\x00\x00\x02\x02\x1d\x04\ +\xd7\x03\xf4\x06\x9a\x00\x0b\x00\x17\x00\x19@\x0e\x0f\x0f\x09\ +\x1f\x09/\x09\x03p\x09\x01\x09\x15\x03\x00/3\xcc]\ +]210\x01\x14\x06#\x22&54632\x16\ +\x074&#\x22\x06\x15\x14\x16326\x03\xf4\x84j\ +j\x7f\x82gh\x86\x83`6uj\x037\xfc\xc9\xa8\xac\x01\xe3\ +\xfe\x04\xfe\xf9\xfb\x00\x01\xff\xd9\x00\x00\x05\x8d\x05\xcd\x00\ +\x22\x00!@\x12\x12\x00LY\x12\x04\x19\x07\x1d\x03\x0a\ +\x09\x0aLY\x1c\x09\x12\x00?3+\x11\x00\x173\x18\ +?+10\x01\x22\x06\x02\x15\x14\x16\x17\x07!7!\ +&&54\x12$32\x16\x16\x15\x14\x02\x07!\x07\ +!76\x1254&\x03\x5c\x84\xcfzVc+\xfd\ +\xbc)\x01hfj\xb9\x01E\xd5\xaa\xf5\x81\xd5\xd5\x01\ +m+\xfd\x8d+\xda\xe1\xa4\x05\x00\x90\xfe\xeb\xa7\x9f\xe8\ +b\xcb\xcdU\xff\x9d\xe1\x01j\xc4\x84\xf9\xa4\xe9\xfe\x88\ +~\xcd\xcb\x80\x01n\xe5\xaa\xb8\xff\xff\xff\xcf\x00\x00\x03\ +\x93\x07>\x02&\x00,\x00\x00\x01\x07\x00j\xff|\x01\ +R\x00\x0c\xb5\x02\x01!!\x05&\x00+\x1155\xff\ +\xff\x00\xba\x00\x00\x05\x00\x07>\x02&\x00<\x00\x00\x01\ +\x07\x00j\x00#\x01R\x00\x0c\xb5\x02\x01\x1e\x1e\x05&\ +\x00+\x1155\xff\xff\x00^\xff\xec\x04\xb0\x06h\x02\ +&\x01~\x00\x00\x01\x06\x01T'\x00\x00\x0a\xb4\x026\ +6\x11&\x00+\x115\xff\xff\x003\xff\xec\x03\xe5\x06\ +h\x02&\x01\x82\x00\x00\x01\x06\x01T\xdc\x00\x00\x0a\xb4\ +\x01,,\x11&\x00+\x115\xff\xff\x00/\xfe\x14\x04\ +J\x06h\x02&\x01\x84\x00\x00\x01\x06\x01T%\x00\x00\ +\x0a\xb4\x01!!\x11&\x00+\x115\xff\xff\x00d\xff\ +\xec\x02\xd8\x06h\x02&\x01\x86\x00\x00\x01\x07\x01T\xfe\ +\xf9\x00\x00\x00\x0a\xb4\x01\x19\x19\x11&\x00+\x115\xff\ +\xff\x00}\xff\xec\x04o\x06\xb4\x02&\x01\x92\x00\x00\x01\ +\x06\x01U\xfb\x00\x00\x0e\xb6\x03\x02\x01((\x11&\x00\ ++\x11555\x00\x02\x00^\xff\xec\x04\xb0\x04f\x00\ + \x00-\x00+@\x17\x16\x02\x1a\x00\x06\x0f\x00(F\ +Y\x00\x10\x14\x0fFY\x1a!FY\x14\x1a\x16\x00?\ +3++\x00\x18?+\x00\x18?\x11\x129910\ +\x012\x1737673\x06\x07\x03\x06\x15\x14\x163\ +27\x15\x06#\x22'#\x06\x06#\x22&54\x12\ +6\x1326\x1254&#\x22\x06\x02\x15\x14\x02o\ +\xbdU\x08\x14*'\xc2]0P\x10\x22\x1d\x1c&>\ +R\xc0\x15\x06T\x9d]\x8e\x9f\x88\xf2\x0fT\x99_W\ +OV\x93X\x04f\xb4'R'\xbb\xc8\xfe\xa8D?\ +\x22$\x0c\xb2\x1c\xbafT\xcd\xb6\xd3\x01_\xc5\xfcD\ +\xa7\x01\x0c\x80[n\x96\xfe\xfe\x93\xd1\x00\x02\xff\xc9\xfe\ +\x14\x04\xa6\x06\x1f\x00\x14\x00)\x006@\x1c\x0f\x0c\x00\ +\x05\x22##\x22FY##\x0c\x00\x11\x1b\x00\x15F\ +Y\x00\x00\x0c\x1cFY\x0c\x16\x00?+\x00\x18?+\ +\x00\x18?\x11\x129/+\x11\x12\x009\x11\x1291\ +0\x012\x16\x15\x10\x05\x16\x16\x15\x14\x06\x06#\x22&\ +'\x03#\x0166\x17\x22\x06\x07\x03\x16\x16326\ +54##732654&\x03\x1b\xb8\xd3\xfe\ +\xa2}\x87w\xde\x9bQ\x8eRw\xeb\x01T2\xfc\xbd\ +d{#\xb6'\x7fC\x85\x9e\xfc9)A\x8e\x97X\ +\x06\x1f\xb8\xa4\xfe\xb0F\x1b\xae\x85\x8f\xe3\x81'7\xfd\ +\xca\x06H\xec\xd7\xbd\x86\x9d\xfc\xb5 *\xab\x8a\xec\xbe\ +\x98\x8dPd\x00\x00\x01\x00H\xfe\x14\x04N\x04R\x00\ +\x10\x00\x12\xb7\x03\x08\x01\x0d\x04\x0f\x01\x1b\x00??3\ +\x129910\x01#6\x13\x033\x13\x16\x1536\ +67\x013\x01\x02\x01?\xf7+\x8b\x9a\xe8;\x13\x04\ +\x17a!\x01\x1b\xfc\xfd\xc9\x9d\xfe\x14\xec\x01\x0c\x04F\ +\xfd\xdf\xa5\xab@\xd1=\x02#\xfb\xed\xfe\xe5\x00\x02\x00\ +?\xff\xec\x04\x9c\x06\x1f\x00\x1f\x00*\x00$@\x12\x12\ +\x00%%\x19\x05\x05\x0cGY\x05\x00\x19 FY\x19\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x11331\ +0\x01&54632\x16\x17\x07&&#\x22\x06\ +\x15\x14\x16\x17\x16\x16\x15\x14\x02\x06#\x22&&54\ +\x00\x132654'\x06\x06\x15\x14\x16\x023\xa6\xdc\ +\xb8`\xb9b]?\x8fPTZ\xa8(\xfd\ +\xdb\xff\xff\xff\xc9\xfe\x14\x04\x93\x04R\x02\x06\x00w\x00\ +\x00\x00\x01\x00d\x00\x00\x04;\x04R\x00\x0c\x00\x0e\xb5\ +\x07\x00\x0f\x04\x0c\x15\x00?3?210\x133\x13\ +\x16\x176\x12\x133\x02\x00\x07#d\xe8C\x0a\x09\x99\ +\xcbH\xedG\xfe\xdb\xf6\xeb\x04R\xfd\x93Z\xba\x9b\x01\ +\xa2\x01D\xfe\x93\xfd\xf3\xd8\x00\x00\x01\x00V\xfes\x04\ +\x10\x06\x14\x00/\x004@\x1a\x07\x14\x14\x0e%\x1b\x01\ +..\x01HY..%\x0e#'$%%$G\ +Y%\x00\x00?+\x11\x12\x009\x18?\x129/+\ +\x11\x12\x009\x11\x129\x11310\x01#\x22\x06\x15\ +\x14\x16\x17\x16\x16\x15\x14\x06\x07#6654&'\ +&&54675&&5467\x06##\ +7!\x07#\x22\x06\x06\x15\x14!3\x03DL\xc6\xee\ +Tt\x8fiT^\xf8sJ?g\x91\x8a\xcb\xc2d\ +o\xaf\x99\x8cS7&\x02\xa8$\x0f\x86\xde}\x01\x0a\ +b\x02\xd7\xa4\x8fPb1?\x80VP\x98Qkq\ +2*7,<\xb0\x87\xa4\xe1-\x06\x1b{Zo\xa9\ +'\x0c\xb8\xacH\x86[\xbc\x00\xff\xff\x00^\xff\xee\x04\ +7\x04d\x02\x06\x00R\x00\x00\x00\x01\x00T\xff\xec\x05\ +h\x04R\x00\x19\x00\x22@\x11\x0e\x15\x15\x0c\x10\x12\x10\ +GY\x12\x0f\x05\x00GY\x05\x16\x00?+\x00\x18?\ ++\x11\x0033\x18?10%27\x15\x06#\x22\ +&547\x13!\x03#\x13#77!\x07#\x03\ +\x06\x15\x14\x04#64Rlps\x10{\xfe\xb0\xc5\ +\xed\xc6\xe7\x14\xc5\x04;&\xe0}\x0a\xa8\x19\xb1$n\ +d9K\x02V\xfch\x03\x98jP\xba\xfd\xa1*#\ +D\x00\x02\xff\xc9\xfe\x14\x04J\x04f\x00\x10\x00\x1d\x00\ +\x22@\x11\x06\x04\x0e\x0a\x1b\x0e\x11FY\x0e\x10\x04\x17\ +FY\x04\x16\x00?+\x00\x18?+\x00\x18?\x11\x12\ +910\x01\x14\x02\x06#\x22'\x06\x06\x03#\x13\x12\ +632\x16%\x22\x06\x07\x03\x16326\x1254\ +&\x04J\x88\xed\x98\xa5s\x0a\x17R\xe9\xeb8\xfa\xd2\ +\xc0\xd2\xfe`h\x80&FO|V\x8bZV\x02\xb4\ +\xc7\xfe\xb3\xb4|G\x84\xfew\x04Y\x01\x0c\xed\xe2\x22\ +\x9f\xb7\xfe\xbed\x86\x01\x01\x87o\x7f\x00\x01\x00^\xfe\ +j\x03\xcd\x04f\x00\x1f\x00\x1a@\x0c\x03\x10\x10\x17\x0a\ +#\x17\x1cFY\x17\x10\x00?+\x00\x18?\x129\x11\ +310\x01\x14\x16\x17\x16\x16\x15\x14\x06\x07#66\ +54&'&&54\x12$32\x17\x07&#\ +\x22\x06\x06\x01LWv\x8bhS_\xf8WfA[\ +\x9d\x88\x9f\x01\x08\xa3\x9e\x87Fze]\x9cc\x01\xcf\ +f{2:\x7f[O\x97XR\x86?-9%A\ +\xd0\x95\xbf\x01J\xab=\xb85w\xe2\x00\x02\x00^\xff\ +\xee\x04\xfe\x04R\x00\x10\x00\x1b\x00\x1c@\x0e\x0f\x11\x0c\ +\x11GY\x0c\x0f\x05\x16FY\x05\x16\x00?+\x00\x18\ +?+\x11\x00310\x01\x14\x0e\x02#\x22&54\ +\x12$3!\x07!\x16%\x22\x02\x15\x1032\x125\ +4'\x04#R\x90\xc8y\xc9\xd9\x97\x01$\xca\x02\x1b\ +%\xfe\xec^\xfe\xb0\xb9\xce\xc4\x8b\xa29\x02Ru\xef\ +\xa7Y\xe9\xd7\xcf\x011\xa4\xb8\x88\x88\xfe\xfc\xe4\xfe\xfc\ +\x01\x0a\xde\x97m\x00\x01\x00T\xff\xec\x03\xdd\x04R\x00\ +\x16\x00\x1c@\x0e\x11\x0c\x0e\x0cGY\x0e\x0f\x06\x00F\ +Y\x06\x16\x00?+\x00\x18?+\x11\x00310%\ +27\x15\x06\x06# 547\x13!77!\x07\ +!\x03\x06\x15\x14\x16\x02JDS#w=\xfe\xee\x14\ +q\xfe\xd7\x14\xc3\x02\xb2'\xfe\xb2r\x112\xaa\x1f\xb2\ +\x11\x1a\xf7=]\x02\x1bjP\xba\xfd\xe1D-+3\ +\x00\x00\x01\x00}\xff\xec\x04o\x04R\x00\x12\x00\x14@\ +\x09\x0f\x06\x0f\x00\x0cFY\x00\x16\x00?+\x00\x18?\ +310\x05\x22&547\x133\x03\x06\x15\x143\ +2\x12\x113\x10\x00\x02\x08\xbf\xcc\x19x\xeay\x17\xb3\ +\xb1\xb7\xec\xfe\xcc\x14\xc0\xb0Gv\x029\xfd\xc7gH\ +\xc0\x01\xdb\x01\xcd\xfd\xb5\xfd\xe5\x00\x02\x00^\xfe\x14\x05\ +^\x04j\x00\x1a\x00$\x00'@\x14\x06\x10\x1a\x1b\x11\ +\x1dGY\x11\x10\x0c!\x00\x18\x18!FY\x18\x16\x00\ +?+\x11\x003\x113\x18?+\x00\x18??10\ +\x05&&54\x127\x17\x06\x02\x15\x14\x17\x13>\x02\ +32\x16\x15\x14\x02\x04\x07\x03#\x014#\x22\x06\x07\ +\x03>\x02\x01\xe5\xb7\xd0\xa2\xba\x96\x88~\xc2i%e\ +\x9cq\xa0\xb2\xa1\xfe\xd4\xccc\xe3\x02\xf2o;H\x17\ +zy\xad]\x0e\x16\xef\xbd\xc9\x01G\xa6\x89\x86\xfe\xfc\ +\x94\xf6!\x01\xf2\xb1\xbb\x5c\xd1\xbc\xd3\xfe\xb1\xbf\x0c\xfe\ +(\x04\xcf\xcbal\xfd\xcb\x0f\x9a\xf9\x00\x01\xff\x0a\xfe\ +\x14\x04\x9c\x04^\x00\x1f\x00%@\x13\x04\x14\x10\x05\x0f\ +\x16\x1b\x00\x1bFY\x00\x10\x10\x0bFY\x10\x1b\x00?\ ++\x00\x18?+\x00\x18??\x129910\x012\ +\x16\x17\x13\x013\x01\x13\x16\x16327\x15\x06#\x22\ +&'\x03\x01!\x01\x03&&#\x22\x07'6\x01\x14\ +pw\x13#\x01m\xfe\xfd\xceF\x0b48--L\ +Vs{\x14+\xfe\x5c\xfe\xfc\x02q9\x0b/-\x18\ +-)P\x04^\x82\x94\xfe\xf5\x02\x15\xfc\xf2\xfe K\ +B\x0e\xb6\x1b\x88\x99\x01F\xfd\x99\x03_\x01\x97N@\ +\x0f\xb4!\x00\x01\x00\x83\xfe\x14\x05\xc1\x06\x12\x00\x1a\x00\ + @\x10\x19\x00\x03\x11\x0f\x0a\x1b\x00\x18\x0b\x18GY\ +\x08\x0b\x16\x00?3+\x11\x003\x18??3?1\ +0%6\x12\x113\x10\x02\x04\x07\x03#\x13&&5\ +47\x133\x03\x06\x15\x14\x16\x17\x013\x03%\xe0\xd0\ +\xec\x97\xfe\xc7\xf5d\xe4e\xc8\xce\x0a\x81\xeaw\x12m\ +f\x01$\xe4\xaa\x1c\x01\xb7\x01\xd5\xfep\xfe*\xed\x13\ +\xfe(\x01\xd8\x11\xc8\xaa=@\x02f\xfd\xcd]?f\ +p\x07\x05l\x00\x00\x01\x00^\xff\xec\x05\xd5\x04R\x00\ +'\x00$@\x11%\x06\x10\x10\x00\x1c\x06\x0f\x16\x0c\x00\ +\x0cGY#\x00\x16\x00?2+\x11\x003\x18?3\ +\x129/\x11910\x05\x22&54\x1273\x06\ +\x02\x15\x143267\x133\x06\x06\x17\x14326\ +\x1254'3\x16\x15\x14\x02\x06#\x22'\x06\x06\x01\ +\x98\x93\xa7\x84z\xf0~\x8a\x81O]\x1c@\xe1(,\ +\x04sQ\x83M\x1d\xe1\x1f\x85\xe8\x99\xc77>\x96\x14\ +\xc8\xb6\xb2\x01~\xb8\xbc\xfe\x87\xac\xc9\x87}\x01-\xbc\ +\xcf\x19\x8d\xa1\x01-\xab\xa2\x8f\x8e\x95\xf6\xfey\xc6\xbc\ +dX\x00\xff\xff\x00d\xff\xec\x02\xfd\x05\xec\x02&\x01\ +\x86\x00\x00\x01\x07\x00j\xfe\xe6\x00\x00\x00\x0c\xb5\x02\x01\ +&&\x11&\x00+\x1155\xff\xff\x00}\xff\xec\x04\ +o\x05\xec\x02&\x01\x92\x00\x00\x01\x06\x00j\xff\x00\x00\ +\x0c\xb5\x02\x01((\x11&\x00+\x1155\xff\xff\x00\ +^\xff\xee\x047\x06h\x02&\x00R\x00\x00\x01\x06\x01\ +T\x10\x00\x00\x0a\xb4\x02$$\x11&\x00+\x115\xff\ +\xff\x00}\xff\xec\x04o\x06h\x02&\x01\x92\x00\x00\x01\ +\x06\x01T\x10\x00\x00\x0a\xb4\x01\x1b\x1b\x11&\x00+\x11\ +5\xff\xff\x00^\xff\xec\x05\xd5\x06h\x02&\x01\x96\x00\ +\x00\x01\x07\x01T\x00\xe1\x00\x00\x00\x0a\xb4\x0100\x11\ +&\x00+\x115\xff\xff\x00F\x00\x00\x04\x83\x07>\x02\ +&\x00(\x00\x00\x01\x07\x00j\x00=\x01R\x00\x0c\xb5\ +\x02\x01!!\x05&\x00+\x1155\x00\x01\x00\xb0\xff\ +\xec\x05\x17\x05\xb6\x00\x1f\x00+@\x17\x18\x0fLY\x18\ +\x18\x14\x11\x12\x17\x13\x14\x13LY\x14\x03\x00\x05LY\ +\x00\x13\x00?+\x00\x18?+\x11\x003\x18?\x129\ +/+10\x05\x22'5\x163267665\ +4&#!\x03#\x01!7!\x07!\x0332\x16\ +\x15\x14\x02\x06\x03dbD?KUZ\x15\x15\x06O\ +]\xff\x00\x96\xef\x01\x0c\xfe\xae-\x03\xb6+\xfe\x88J\ +\xfa\xbb\xbcL\xba\x14\x1c\xcb\x1d\x5cedA\x17GI\ +\xfd=\x04\xe9\xcd\xcd\xfe\xa6\xa8\x95`\xfe\x9e\xa4\x00\xff\ +\xff\x00F\x00\x00\x04\x81\x07s\x02&\x01a\x00\x00\x01\ +\x07\x00v\x00}\x01R\x00\x0a\xb4\x01\x0e\x0e\x05&\x00\ ++\x115\x00\x01\x00\x87\xff\xec\x05!\x05\xcb\x00\x1c\x00\ +&@\x14\x03\x06LY\x03\x03\x11\x18\x18\x00LY\x18\ +\x04\x11\x0bLY\x11\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10\x01\x22\x04\x07!\x07!\x06\x15\ +\x14\x16327\x15\x06\x06#\x22\x00\x11\x10\x12$3\ +2\x17\x07&\x03\x9c\xad\xfe\xfc?\x02B)\xfd\xc0\x06\ +\xa4\xa2\x8d\xbcW\xafp\xfe\xfe\xed\xd3\x01`\xe2\xd7\xae\ +^\x98\x04\xfe\xde\xca\xcb\x1fK\xaf\xbaD\xcd!\x22\x01\ +*\x01\x0b\x01\x04\x01\xbe\xe8\x5c\xc3R\xff\xff\x00'\xff\ +\xec\x04;\x05\xcb\x02\x06\x006\x00\x00\xff\xff\xff\xcf\x00\ +\x00\x03?\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\xff\xcf\x00\ +\x00\x03\x93\x07>\x02&\x00,\x00\x00\x01\x07\x00j\xff\ +|\x01R\x00\x0c\xb5\x02\x01!!\x05&\x00+\x115\ +5\xff\xff\xfe\xbe\xfeh\x02s\x05\xb6\x02\x06\x00-\x00\ +\x00\x00\x02\xff\xc1\xff\xec\x06\xf2\x05\xb6\x00\x1b\x00#\x00\ +0@\x1a\x12\x22LY\x12\x12\x1a\x10\x1a#LY\x1a\ +\x12\x10\x00LY\x10\x03\x05\x0aLY\x05\x13\x00?+\ +\x00\x18?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x01\x07\x02\x02\x06#\x22'5\x163266\x12\ +\x12\x13!\x0332\x16\x15\x14\x04!!\x01\x1326\ +54##\x03\x03\x04<\x8b\x9e\xc2\x97J;<(\ +DXSj\x8eF\x02\xf4}X\xe2\xef\xfe\xcc\xfe\xe2\ +\xfe\x83\x01\x08\x96\x9c\xa1\xe3}e\x04\xe7\xe1\xfd\xff\xfe\ +\x81\x9a\x16\xc9\x15?\x90\x012\x01\xf3\x01\x0c\xfd\xae\xbe\ +\xba\xed\xff\x04\xe7\xfb\xe0\x8c\x8a\xbf\xfe+\x00\x00\x02\x00\ +F\x00\x00\x06\xe9\x05\xb6\x00\x12\x00\x1a\x00)@\x15\x19\ +\x0c\x11\x0cLY\x02\x11\x11\x0a\x00\x0f\x03\x0e\x12\x0a\x1a\ +LY\x0a\x12\x00?+\x00\x18??3\x129/3\ ++\x11\x00310\x013\x0332\x16\x15\x14\x04!\ +!\x13!\x03#\x013\x03!\x132654##\ +\x03\x04P\xed|b\xe0\xe6\xfe\xd0\xfe\xe5\xfe}\x8d\xfe\ +\x19\x8e\xed\x015\xed|\x01\xe5\xeb\x9c\xa0\xe4|e\x05\ +\xb6\xfd\xb0\xbe\xba\xef\xff\x02\x9c\xfdd\x05\xb6\xfd\xb0\xfd\ +a\x8c\x88\xc1\xfe+\x00\x00\x01\x00\xb0\x00\x00\x05\x14\x05\ +\xb6\x00\x16\x00#@\x12\x0d\x04LY\x0d\x0d\x09\x14\x06\ +\x12\x0c\x08\x09\x08LY\x09\x03\x00?+\x11\x003\x18\ +?3\x129/+10\x014&##\x03#\x01\ +!7!\x07!\x033 \x11\x14\x07\x03#\x136\x04\ +'W]\xf8\x96\xef\x01\x0c\xfe\xae-\x03\xb6+\xfe\x88\ +J\xfa\x01t\x16T\xf2a\x0e\x021LF\xfd=\x04\ +\xe9\xcd\xcd\xfe\xa6\xfe\xbbDh\xfeb\x01\xbaK\x00\xff\ +\xff\x00F\x00\x00\x05X\x07s\x02&\x01\xb4\x00\x00\x01\ +\x07\x00v\x00\xcf\x01R\x00\x0a\xb4\x01\x13\x13\x05&\x00\ ++\x115\xff\xff\x00\x0c\xff\xec\x05j\x07y\x02&\x01\ +\xbd\x00\x00\x01\x07\x026\x00P\x01R\x00\x0a\xb4\x01\x19\ +\x19\x05&\x00+\x115\x00\x01\x00F\xfem\x05\x89\x05\ +\xb6\x00\x0b\x00\x19@\x0c\x04\x00\x03\x09#\x0b\x02LY\ +\x07\x0b\x12\x00?3+\x00\x18??310\x013\ +\x01!\x013\x01!\x03#\x13!\x01{\xef\xfe\xf6\x02\ +1\x01\x0b\xed\xfe\xcb\xfemW\xe7V\xfem\x05\xb6\xfb\ +\x17\x04\xe9\xfaJ\xfem\x01\x93\xff\xff\xff\x87\x00\x00\x04\ +N\x05\xb8\x02\x06\x00$\x00\x00\x00\x02\x00H\x00\x00\x04\ +\x85\x05\xb6\x00\x0c\x00\x14\x00&@\x14\x0c\x13LY\x0c\ +\x0c\x07\x08\x08\x0bLY\x08\x03\x07\x14LY\x07\x12\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x01\ +2\x16\x15\x14\x04!!\x01!\x07!\x03\x13265\ +4##\x03\x02X\xe6\xeb\xfe\xcb\xfe\xe3\xfeq\x015\ +\x03\x08+\xfd\xe3Q\x04\xa3\xa4\xe3\x93e\x03d\xc1\xbe\ +\xea\xfb\x05\xb6\xcd\xfe{\xfdc\x8b\x85\xc5\xfe+\x00\xff\ +\xff\x00F\x00\x00\x04\xcb\x05\xb6\x02\x06\x00%\x00\x00\xff\ +\xff\x00F\x00\x00\x04\x81\x05\xb6\x02\x06\x01a\x00\x00\x00\ +\x02\xffJ\xfeo\x055\x05\xb6\x00\x0d\x00\x13\x00$@\ +\x12\x00\x04#\x09\x0fLY\x09\x03\x0b\x12\x05\x02\x05L\ +Y\x02\x12\x00?+\x11\x0033\x18?+\x00\x18?\ +310\x01\x13!\x03#\x133\x12\x00\x13!\x013\ +\x03\x03#\x06\x00\x07!\x03{V\xfc\xb2V\xe3\x7fr\ +\xb7\x01Ca\x02\x9f\xfe\xf6\xba\x81K\xe2P\xfe\xee\x8f\ +\x01\xf1\xfeo\x01\x91\xfeo\x02^\x01\x01\x02\xa3\x01E\ +\xfb\x17\xfd\xa2\x06x\xf4\xfd\xb0\xd6\x00\xff\xff\x00F\x00\ +\x00\x04\x83\x05\xb6\x02\x06\x00(\x00\x00\x00\x01\xff\x8f\x00\ +\x00\x07B\x05\xb6\x00\x11\x00!@\x11\x03\x0f\x06\x0c\x09\ +\x05\x00\x00\x11\x07\x04\x01\x03\x0e\x0b\x11\x12\x00?33\ +?33\x129\x11\x17310\x01\x013\x01\x133\ +\x03\x01!\x01\x01#\x01\x03#\x13\x01!\x02\x1b\xfe\xbe\ +\xf4\x019\x94\xe5\x93\x02K\x01\x0b\xfd\x8d\x01N\xfc\xfe\ +\xc0\x97\xe6\x98\xfd\xa6\xfe\xed\x03\x06\x02\xb0\xfdL\x02\xb4\ +\xfdL\x02\xb4\xfd'\xfd#\x02\xd5\xfd+\x02\xd3\xfd-\ +\x00\x00\x01\x00\x10\xff\xec\x04j\x05\xcb\x00(\x00-@\ +\x17\x03\x18\x19\x19\x18KY\x19\x19\x0a&& KY\ +&\x04\x0a\x11KY\x0a\x13\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x00910\x01\x14\x06\x07\ +\x15\x16\x16\x15\x14\x04!\x22&'5\x16\x16326\ +54&##732654&#\x22\x07'\ +6632\x16\x04j\xd0\xb9\x89\x9e\xfe\xbc\xfe\xe4\x84\ +\xc2RT\xd3m\xad\xc1\xa7\x9a\xb2)\xa4\xbe\xcbnc\ +\xad\xb8Z}\xec\x8b\xb5\xdc\x04\x7f\xa0\xce\x19\x04\x12\xaa\ +\x84\xd6\xf2&)\xd5.6\x92\x80se\xbe\x88xZ\ +Zy\xa6RD\xb6\x00\x00\x01\x00F\x00\x00\x05\xd9\x05\ +\xb6\x00\x0f\x00\x15@\x09\x0d\x04\x0f\x06\x00\x03\x09\x0f\x12\ +\x00?3?2\x119910\x013\x02\x06\x073\ +\x01!\x01#\x12\x127#\x01!\x01{\xdd\xb74\x0d\ +\x08\x03T\x01\x1d\xfe\xcb\xdbp{\x0d\x07\xfc\xaa\xfe\xe2\ +\x05\xb6\xfc\xa1\xdc-\x04h\xfaJ\x02\x14\x02N\x1b\xfb\ +\x83\xff\xff\x00F\x00\x00\x05\xd9\x07y\x02&\x01\xb2\x00\ +\x00\x01\x07\x026\x00\xe9\x01R\x00\x0a\xb4\x01\x13\x13\x05\ +&\x00+\x115\x00\x01\x00F\x00\x00\x05X\x05\xb6\x00\ +\x0a\x00\x19@\x0b\x02\x07\x0a\x0a\x04\x08\x05\x03\x01\x04\x12\ +\x00?3?3\x129\x113310!!\x01\x03\ +#\x013\x03\x01!\x01\x04D\xfe\xf5\xfe\x92\x98\xed\x01\ +5\xed\x95\x02o\x01\x16\xfdm\x02\xd1\xfd/\x05\xb6\xfd\ +F\x02\xba\xfd)\x00\x01\xff\xc1\xff\xe9\x05d\x05\xb6\x00\ +\x13\x00\x1c@\x0e\x12\x12\x0f\x00LY\x0f\x03\x04\x09L\ +Y\x04\x13\x00?+\x00\x18?+\x00\x18?10\x01\ +\x02\x02\x06#\x22'5\x163266\x12\x12\x13!\ +\x01#\x01\x03\x04\x87\xb9\xce\xb0Q47-DXS\ +j\x8eF\x03\x12\xfe\xc9\xee\x01\x0d\x04\xe7\xfd\xf8\xfd\xdd\ +\xd3\x19\xc9\x15?\x90\x012\x01\xf3\x01\x0c\xfaJ\x04\xe7\ +\x00\xff\xff\x00D\x00\x00\x06\xe5\x05\xb6\x02\x06\x000\x00\ +\x00\xff\xff\x00F\x00\x00\x05\x8b\x05\xb6\x02\x06\x00+\x00\ +\x00\xff\xff\x00\x87\xff\xec\x05\x8d\x05\xcd\x02\x06\x002\x00\ +\x00\xff\xff\x00F\x00\x00\x05\x89\x05\xb6\x02\x06\x01n\x00\ +\x00\xff\xff\x00F\x00\x00\x04\x96\x05\xb6\x02\x06\x003\x00\ +\x00\xff\xff\x00\x87\xff\xec\x05!\x05\xcb\x02\x06\x00&\x00\ +\x00\xff\xff\x00\xb0\x00\x00\x04\xc3\x05\xb6\x02\x06\x007\x00\ +\x00\x00\x01\x00\x0c\xff\xec\x05j\x05\xb6\x00\x15\x00\x1c@\ +\x0d\x08\x0d\x0d\x00\x10\x09\x03\x00\x05LY\x00\x13\x00?\ ++\x00\x18?3\x129\x11310\x17\x22'5\x16\ +3267\x013\x13\x16\x1767\x01!\x01\x0e\x02\ +\xc9nOReU\x85Q\xfe\xd7\xef\xa6'\x0a2/\ +\x01v\x01\x08\xfd}k\x99\xaa\x14\x1e\xd9'b\x86\x04\ +\x12\xfd\x83\xa0=vQ\x02\x93\xfb\xd5\xb2\xa4I\x00\xff\ +\xff\x00\x87\xff\xec\x05\xfe\x05\xcb\x02\x06\x01s\x00\x00\xff\ +\xff\xff\x91\x00\x00\x05%\x05\xb6\x02\x06\x00;\x00\x00\x00\ +\x01\x00D\xfem\x05y\x05\xb6\x00\x0b\x00\x1b@\x0d\x09\ +\x05\x03\x02#\x0b\x07\x04\x07LY\x04\x12\x00?+\x11\ +\x003\x18??310%\x03#\x13!\x013\x01\ +!\x013\x01\x05)\x81\xeaV\xfc0\x015\xef\xfe\xf6\ +\x02#\x01\x0a\xee\xfe\xf4\xc9\xfd\xa4\x01\x93\x05\xb6\xfb\x17\ +\x04\xe9\xfb\x13\x00\x00\x01\x00\xd9\x00\x00\x05J\x05\xb6\x00\ +\x14\x00\x1d@\x0e\x01\x03\x09\x03\x0fLY\x03\x03\x12\x09\ +\x03\x00\x12\x00??39/+\x11\x12\x00910\ +!\x13\x06#\x22&547\x133\x03\x06\x15\x143\ +27\x133\x01\x03%{\xbc\xb9\xa2\xb0\x10o\xeek\ +\x10\xa8\x99\xbf\x8f\xf0\xfe\xca\x02DV\x9d\x8e=P\x02\ +\x10\xfe\x02D*\x90L\x02\xb0\xfaJ\x00\x01\x00D\x00\ +\x00\x07\xdf\x05\xb6\x00\x0b\x00\x1a@\x0c\x09\x05\x01\x03\x07\ +\x03\x00\x03LY\x00\x12\x00?+\x11\x003\x18?3\ +3103\x013\x01!\x013\x01!\x013\x01D\ +\x015\xf4\xfe\xf3\x01\xc9\x01\x0a\xf4\xfe\xf6\x01\xc6\x01\x0b\ +\xf1\xfe\xcb\x05\xb6\xfb\x17\x04\xe9\xfb\x17\x04\xe9\xfaJ\x00\ +\x01\x00D\xfem\x07\xdf\x05\xb6\x00\x0f\x00\x1f@\x0f\x0d\ +\x09\x05\x03\x02#\x0f\x0b\x07\x04\x07LY\x04\x12\x00?\ ++\x11\x0033\x18??3310%\x03#\x13\ +!\x013\x01!\x013\x01!\x013\x01\x07\x8f\x81\xe7\ +V\xf9\xc7\x015\xf4\xfe\xf3\x01\xc9\x01\x0a\xf4\xfe\xf6\x01\ +\xc6\x01\x0b\xf1\xfe\xf6\xc9\xfd\xa4\x01\x93\x05\xb6\xfb\x17\x04\ +\xe9\xfb\x17\x04\xe9\xfb\x13\x00\x02\x00\xb0\x00\x00\x04\xd7\x05\ +\xb6\x00\x0c\x00\x15\x00&@\x14\x0c\x14LY\x0c\x0c\x07\ +\x0a\x0a\x09LY\x0a\x03\x07\x15LY\x07\x12\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x012\x16\ +\x15\x14\x04!!\x01!7!\x03\x032654&\ +##\x03\x03\x06\xe4\xed\xfe\xcd\xfe\xe1\xfes\x01\x0a\xfe\ +\xae-\x02@\x7f\x02\xa3\xa4to\x8be\x03d\xc1\xbe\ +\xe9\xfc\x04\xe9\xcd\xfd\xae\xfdc\x8b\x85i\x5c\xfe+\x00\ +\x03\x00F\x00\x00\x06\x9a\x05\xb6\x00\x03\x00\x0e\x00\x17\x00\ +\x22@\x12\x05\x16LY\x05\x05\x0d\x02\x0e\x03\x01\x12\x0d\ +\x17LY\x0d\x12\x00?+\x00\x18??3\x129/\ ++10!#\x013!\x0332\x16\x15\x14\x04!\ +!\x01\x132654&##\x03\x05d\xf1\x015\ +\xf2\xfb\xce|X\xe3\xed\xfe\xcd\xfe\xe2\xfe\x83\x015^\ +\xa2\xa6uo|e\x05\xb6\xfd\xae\xc0\xbf\xe9\xfc\x05\xb6\ +\xfb\x11\x8a\x86h]\xfe+\x00\x00\x02\x00F\x00\x00\x04\ +#\x05\xb6\x00\x0a\x00\x12\x00\x1d@\x0f\x01\x11LY\x01\ +\x01\x09\x0a\x03\x09\x12LY\x09\x12\x00?+\x00\x18?\ +\x129/+10\x01\x0332\x16\x15\x14\x04!!\ +\x01\x132654##\x03\x02h|f\xe6\xeb\xfe\ +\xcb\xfe\xe3\xfeu\x015n\xa2\xa6\xe3\x8de\x05\xb6\xfd\ +\xae\xc1\xbe\xea\xfb\x05\xb6\xfb\x11\x8a\x86\xc5\xfe+\x00\x00\ +\x01\x00\x17\xff\xec\x04\x89\x05\xcb\x00\x1c\x00&@\x14\x04\ +\x03LY\x04\x04\x16\x0f\x0f\x09LY\x0f\x04\x16\x00L\ +Y\x16\x13\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++10% \x13!7!74&#\x22\x06\x07\ +'632\x00\x11\x10\x02\x04#\x22&'5\x16\x16\ +\x01}\x01\x8cj\xfd\xbc)\x029\x02\x9e\x93G\x90j\ +>\xc8\xd4\xfb\x01\x0f\xc0\xfe\xa8\xeam\xb3PZ\xab\xb8\ +\x01\xd3\xcbH\xaa\xb6\x1e(\xc3P\xfe\xe0\xfe\xf5\xfe\xe3\ +\xfeI\xe0$-\xda/0\x00\x00\x02\x00F\xff\xec\x07\ +\xb0\x05\xcd\x00\x15\x00#\x00*@\x17\x0f\x0aLY\x0f\ +\x0f\x0c\x0d\x03\x0c\x12\x13\x16LY\x13\x04\x04\x1dLY\ +\x04\x13\x00?+\x00\x18?+\x00\x18??\x129/\ ++10\x01\x10\x02\x04#\x22\x00\x1147!\x03#\ +\x013\x03!\x12\x0032\x00%\x22\x06\x02\x15\x14\x16\ +326\x1254&\x07\xb0\xb2\xfe\xc4\xd4\xf9\xfe\xf0\ +\x07\xfe\xd2\x8b\xed\x015\xed\x7f\x01#G\x01m\xfc\xeb\ +\x01\x09\xfd\xf2\x80\xd0u\x97\x88\x80\xc8v\x94\x03\x9a\xfe\ +\xe8\xfeO\xe5\x01*\x01\x09A3\xfdm\x05\xb6\xfd\xaa\ +\x01!\x01L\xfe\xd7\x5c\xbf\xfe\xab\xcb\xaf\xba\xb6\x01R\ +\xd8\xad\xbb\x00\x02\xff\x9c\x00\x00\x04\xc5\x05\xb6\x00\x0d\x00\ +\x16\x00$@\x12\x03\x00\x15\x00KY\x15\x15\x09\x0c\x02\ +\x12\x09\x0fLY\x09\x03\x00?+\x00\x18?3\x129\ +/+\x11\x00310\x01\x01!\x01&&54$\ +!!\x01#\x13\x13#\x22\x06\x15\x14\x1633\x02o\ +\xfeI\xfe\xe4\x02\x02h[\x01)\x01\x0e\x01\xb3\xfe\xca\ +\xed{\x91\xa0\x9c\x9f\x81s\x81\x02J\xfd\xb6\x02\x98=\ +\xa0j\xdf\xf8\xfaJ\x02J\x02\xa4\x89\x80fo\x00\xff\ +\xff\x00^\xff\xec\x04\x7f\x04f\x02\x06\x00D\x00\x00\x00\ +\x02\x00h\xff\xec\x04\xc7\x06\x1f\x00\x1a\x00'\x00$@\ +\x12\x0d\x18\x11\x11!GY\x11\x11\x18\x07\x00\x18\x1bF\ +Y\x18\x16\x00?+\x00\x18?\x129/+\x11\x12\x00\ +910\x134\x12\x1276$7\x17\x07\x04\x06\x06\ +\x0736632\x16\x15\x14\x02\x06#\x22&\x052\ +6654#\x22\x06\x07\x06\x15\x10h\x86\xe3\x91C\ +\x01Z\xad\x1bj\xfe\xb1\xcf\x8b'\x02J\xb7`\x8f\xa0\ +\x8b\xf7\xa3\xc4\xce\x01\xa6Q\x80R\x91K\xab=\x17\x01\ +\xc3\xde\x01\xb7\x01\x1e4\x1bD\x16\xc7\x101c\xc8\x98\ +XZ\xbc\xb4\xc6\xfe\xc1\xa5\xf11w\xe5}\xc9oX\ +q\x5c\xfe\xf2\x00\x00\x03\x00^\xff\xec\x045\x04f\x00\ +\x12\x00\x1e\x00(\x00-@\x17\x05\x13\x22\x22\x13HY\ +\x22\x22\x0c\x00\x00\x1fHY\x00\x10\x0c\x18HY\x0c\x16\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x012\x16\x15\x14\x05\x15\x16\x15\x14\x06\x06\ +#\x22&54\x12$\x03\x07\x15\x14\x163265\ +4&#\x13\x22\x06\x0732654&\x02\xb4\xb7\ +\xca\xfe\xfc\xc1m\xd0\x92\xdc\xe9\x94\x01\x10\xb6\x02qp\ +ivq~\x95w\xaa'\xd5\x85\x8cO\x04f\x96\x8a\ +\xdc;\x044\xb1d\x9cZ\xe9\xdb\xc7\x01?\xb0\xfdu\ +\x1b\x1c\x80\x88_OIH\x01\xd7\x9e\x8d\x5cP8G\ +\x00\x00\x01\x00%\xff\xec\x03\x87\x04f\x00#\x00 @\ +\x10\x0b\x1f\x15\x02\x02!GY\x02\x10\x15\x0eGY\x15\ +\x16\x00?+\x00\x18?+\x11\x12\x009910\x13\ +632\x16\x15\x14\x06\x07\x06\x06\x15\x14\x16326\ +7\x15\x06\x06#\x22&546676654\ +#\x22\x07\xb8\xbd\xbc\xa6\xb0\x8f\xb0\xb2}WQU\xa0\ +Jc\xa9^\xaf\xc2O\x98\xc7g`\x8a~\x9e\x04\x12\ +T\x8e\x86u\xa2C;aC:=4\x22\xbd.!\ +\x9a\x8cX\x86dI%R4fJ\x00\x02\x00^\xff\ +\xec\x04`\x06)\x00\x1a\x00'\x00-@\x17\x0e\x04\x0b\ +\x0b!GY\x0b\x0b\x04\x19\x19\x13FY\x19\x01\x04\x1b\ +FY\x04\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x01\x10\x02\x04#\x22&5\ +4\x12632\x173754&#\x22\x07'6\ +63 \x012\x127&&#\x22\x06\x06\x15\x14\x16\ +\x04`\xa3\xfe\xe4\xba\xbb\xce~\xe5\x8f\xbf^\x06\x02\x83\ +\x8cke6?\xa1G\x01\xd9\xfd\x9az\xb5)\x1ar\ +MS\x8cN\x5c\x03\xaa\xfe\xf2\xfe;\xeb\xdd\xc4\xb3\x01\ +.\xad\xb3\x22\x1c\xe8\xda-\xb5\x1b\x1e\xfa\x83\x01\x0c\xea\ +Zh}\xdb\x83js\xff\xff\x00^\xff\xec\x03\xfa\x04\ +f\x02\x06\x00H\x00\x00\x00\x01\xff\xe3\xff\xec\x07T\x04\ +f\x00;\x00=@ 9\x01\x1a\x01IY\x1e\x1a\x1a\ +;\x1c\x0f;\x15'\x10\x15\x10FY\x22\x15\x10.\x09\ +\x04\x09FY3\x04\x16\x00?3+\x11\x003\x18?\ +3+\x11\x003\x18??\x129/3+\x11\x003\ +10\x01#\x06\x00#\x22'7\x1632665\ +4&#\x22\x075632\x16\x15\x14\x073\x133\ +\x0336\x0032\x17\x07&#\x22\x06\x06\x15\x14\x16\ +327\x15\x06#\x22&557#\x03#\x03\x19\ +\x9e6\xfe\xe4\xc5D=%0*_\x96UYQ8\ +=LR\xad\xc0\x05\xa8e\xddf\x9f7\x01\x1b\xc3S\ +6),2Z\x93YUS2CFV\xac\xc0\x02\ +\xaae\xdb\x01\xd5\xe3\xfe\xfa\x0e\xbc\x0c\x8e\xf6\x8auy\ +\x15\xbf\x16\xde\xcc\x1b&\x01\xd7\xfe)\xe5\x01\x06\x0e\xbc\ +\x0a\x83\xf9\x90s}\x17\xc1\x14\xd9\xce!!\xfe+\x00\ +\x01\x00\x0a\xff\xec\x03\xa0\x04f\x00%\x00-@\x17\x10\ +$%%$HY%%\x17\x0a\x0a\x05GY\x0a\x10\ +\x17\x1dGY\x17\x16\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x00910\x012654#\ +\x22\x07'632\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\ +\x04#\x22&'5\x1632654&##7\ +\x01\xa4\x92\x80\xa4|\xad=\xc4\xc9\xab\xbc\x87{Zb\ +\xfe\xf5\xf1\x5c\xb7A\xaa\xae\x80\x8f]d\xa2'\x02\x98\ +PQuJ\xaeT\x8c~n\x8f\x1b\x07\x17tZ\xae\ +\xbe&!\xcbX_SHE\xb3\x00\xff\xff\x00o\xff\ +\xec\x04\x87\x04R\x02\x06\x00X\x00\x00\xff\xff\x00o\xff\ +\xec\x04\xae\x06'\x02&\x00X\x00\x00\x01\x06\x026\x1f\ +\x00\x00\x0a\xb4\x01\x1d\x1d\x11&\x00+\x115\x00\x01\x00\ +/\x00\x00\x04\x8b\x04R\x00\x0a\x00\x19@\x0b\x05\x0a\x02\ +\x02\x07\x00\x08\x0f\x04\x07\x15\x00?3?3\x129\x11\ +3310\x01!\x01\x01!\x01\x03#\x133\x03\x03\ +u\x01\x16\xfd\xfe\x01F\xfe\xf2\xfe\xccr\xec\xec\xe9n\ +\x04R\xfd\xd9\xfd\xd5\x02!\xfd\xdf\x04R\xfd\xf4\x00\x00\ +\x01\xff\xb2\xff\xee\x04b\x04`\x00\x1c\x00\x1c@\x0e\x01\ +\x15\x1a\x04FY\x1a\x10\x0c\x11FY\x0c\x16\x00?+\ +\x00\x18?+\x00\x18?10!#\x13&#\x22\x06\ +\x06\x07\x0e\x02#\x22'5\x1632667>\x03\ +32\x17\x03\x7f\xec\xc5%!H^QJWj\x8a\ +a@3$(1JEDIcx\xa2s\x9c\x8b\ +\x03\x98\x08@\x96\xda\xfb\xb1V\x14\xc5\x0fA\x85\xc4\xd1\ +\xb5g1+\x00\x00\x01\x00)\x00\x00\x05\xbc\x04R\x00\ +\x13\x00\x1b@\x0c\x00\x07\x0d\x07\x09\x10\x0a\x0f\x13\x04\x09\ +\x15\x00?33?3\x1299\x11310\x01\x06\ +\x06\x01#\x03&'\x03#\x13!\x13\x1767\x01!\ +\x03#\x04\xaa\x02\x03\xfe0\xb0b\x0c\x05\xb2\xd7\xeb\x01\ +)_\x10=6\x01d\x019\xeb\xdb\x03L\x03\x07\xfc\ +\xbe\x02\xa0M_\xfc\xb4\x04R\xfdZ\xb0\x8eY\x02o\ +\xfb\xae\x00\x00\x01\x00/\x00\x00\x04\xaa\x04R\x00\x0b\x00\ +\x1a@\x0d\x01\x08GY\x01\x01\x0a\x03\x0b\x0f\x06\x0a\x15\ +\x00?3?3\x129/+10\x01\x03!\x133\ +\x03#\x13!\x03#\x13\x02\x06^\x01\xba_\xe9\xe9\xec\ +d\xfeHf\xec\xee\x04R\xfeD\x01\xbc\xfb\xae\x01\xdd\ +\xfe#\x04R\x00\xff\xff\x00^\xff\xee\x047\x04d\x02\ +\x06\x00R\x00\x00\xff\xff\x00/\x00\x00\x04J\x04f\x02\ +\x06\x00Q\x00\x00\xff\xff\xff\xc9\xfe\x14\x04P\x04f\x02\ +\x06\x00S\x00\x00\xff\xff\x00^\xff\xec\x03\xcd\x04f\x02\ +\x06\x00F\x00\x00\xff\xff\x00/\x00\x00\x06\xae\x04f\x02\ +\x06\x00P\x00\x00\xff\xff\xffV\xfe\x14\x04R\x04R\x02\ +\x06\x00\x5c\x00\x00\x00\x03\x00^\xfe\x14\x05X\x06\x14\x00\ +\x13\x00\x1b\x00#\x00+@\x16\x12\x00\x09\x1b#\x18\x11\ +\x18GY\x00\x11\x10\x1c\x17\x0a\x17GY\x07\x0a\x16\x00\ +?3+\x11\x003\x18?3+\x11\x003\x18??\ +10\x01\x16\x16\x15\x14\x02\x04\x07\x03#\x13&&5\ +4\x12$7\x133\x01\x14\x16\x17\x13\x0e\x02\x01>\x02\ +54&'\x03\xc1\xc4\xd3\xa4\xfe\xdc\xbfd\xdeg\xc2\ +\xd6\xa4\x01#\xc0]\xdd\xfd/na\xa1o\xa4]\x01\ +\xacm\xa3^n`\x04^\x1a\xf3\xc2\xbe\xfe\xd0\xa8\x0b\ +\xfe&\x01\xde\x17\xf5\xc5\xbc\x010\xa7\x08\x01\xb6\xfb\xbb\ +\x7f\x97\x0b\x02\xf6\x07v\xd9\xfe`\x0aw\xda\x80|\x8e\ +\x0d\xff\xff\xff\xaa\x00\x00\x04T\x04R\x02\x06\x00[\x00\ +\x00\x00\x01\x00m\xfey\x04\x87\x04R\x00!\x00!@\ +\x10\x19\x1b\x09!\x0f\x14\x22\x10\x05\x1b\x05FY\x15\x1b\ +\x15\x00?3+\x11\x003\x18??3\x12910\ +\x01\x03\x06\x15\x143267\x133\x03\x06\x15\x14\x16\ +327\x03#\x13&&'#\x06#\x22&54\ +7\x13\x01\xfa\x90\x10\x7fp\xc5-c\xe9\xa2\x0c$\x22\ +!3}\xe2Y;:\x06\x06\x93\xd2\x86\x94\x1a\x87\x04\ +R\xfd^L5\x85\xff\xd4\x01\xd5\xfd\x00:\x22\x22&\ +\x0e\xfd\xbd\x01\x7f\x15aP\xd2\x98\x8eD}\x02\x7f\x00\ +\x01\x00\xa0\x00\x00\x04h\x04R\x00\x1a\x00\x1f@\x0f\x12\ +\x0d\x1a\x14\x06FY\x14\x14\x0d\x0a\x1a\x0f\x0d\x15\x00?\ +?3\x129/+\x11\x12\x00910\x01\x03\x06\x15\ +\x14\x16326773\x03#\x13667#\x06\ +#\x22&5477\x01\xdb;\x13J=z\xa42\ +\x1b\xe9\xeb\xec@\x0c!\x0c\x08\x87\xbf\x8b\x91\x1a6\x04\ +R\xfe\xebV5GB\xd5\xddw\xfb\xae\x011n\xb9/b\xec\ +\xa4\x0b& $0}\xe1Xs\x0c\x04\x93\xc7r}\ +\x0f\x08K\xbeh\x85\x8b\x16\x8b\xec\x90\x12yk\xbc+\ +d\x04R\xfd^L1DC\xfc\xd5\x01\xd5\xfd\x009\ +##%\x0e\xfd\xbd\x01\x7f(\xa1\xd5}ntw\x99\ +\x8b;z\x02\x8d\xfd^U.\x81\xf8\xcd\x01\xe1\x00\x00\ +\x02\x00X\xff\xec\x04\x96\x04R\x00\x12\x00\x1e\x00-@\ +\x17\x00\x09\x02\x02\x13HY\x02\x02\x09\x11\x11\x10GY\ +\x11\x0f\x09\x19HY\x09\x16\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x00910\x01632\ +\x16\x15\x14\x06\x06#\x22&547\x13!7!\x13\ +\x22\x07\x06\x15\x1432654&\x02bkp\xa4\ +\xb5q\xd7\x96\xbd\xbc\x19\x5c\xfe\xa4'\x02H/Oh\ +\x16\xaacvX\x02\x7f\x19\x9d\x8ct\xaf`\xa8\x97M\ +o\x01\xb1\xba\xfd\x95\x14h2\x9deWJE\x00\x00\ +\x03\x00u\xff\xec\x05\xe7\x04R\x00\x0f\x00\x1e\x00\x22\x00\ +)@\x15\x01\x09\x03\x03\x10HY\x03\x03\x09!\x0f\x0f\ + \x15\x09\x19HY\x09\x16\x00?+\x00\x18??3\ +\x129/+\x11\x12\x00910\x01\x03632\x16\ +\x15\x14\x06#\x22&547\x13\x01\x22\x07\x0e\x03\x15\ +\x1432654&\x01#\x133\x01\xfcd}U\ +\x98\xac\xf3\xd4\xbc\xb6\x16\x85\x01\x0bH`\x06\x09\x04\x02\ +\x9c]nV\x02\x8d\xea\xea\xeb\x04R\xfe-\x19\x9c\x89\ +\xb3\xd4\xa8\x97Vh\x02i\xfd\x95\x14\x1d+$\x1f\x11\ +\x9bgWM@\xfe\x19\x04R\x00\x02\x00u\xff\xec\x03\ +\xd9\x04R\x00\x10\x00\x1d\x00$@\x12\x00\x09\x02\x02\x11\ +HY\x02\x02\x09\x0f\x0f\x09\x18HY\x09\x16\x00?+\ +\x00\x18?\x129/+\x11\x12\x00910\x0163\ +2\x16\x15\x14\x06\x06#\x22&547\x133\x13\x22\ +\x07\x06\x06\x15\x1432654&\x01\x96ox\xa9\ +\xb3t\xdb\x98\xc2\xbb\x16\x85\xec=[k\x0e\x09\xb2j\ +x[\x02\x7f\x19\x9d\x8cs\xafa\xa9\x98Xb\x02k\ +\xfd\x95\x14C4#\x9deWJE\x00\x01\x00\x19\xff\ +\xec\x03b\x04f\x00\x1b\x004@\x1f\x12\x11HY\x0c\ +\x12\x1c\x12<\x12L\x12\x04\x10\x03\x12\x12\x07\x00\x00\x16\ +FY\x00\x10\x07\x0dFY\x07\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/_^]+10\x012\x16\ +\x15\x14\x02\x04#\x22&'5\x163267!7\ +!54#\x22\x06\x07'6\x01\xc9\xc5\xd4\x8a\xfe\xf8\ +\xb7O\x87*\x86x|\xab \xfeV#\x01\x9e\xd1>\ +l7B\x9f\x04f\xe5\xd9\xd1\xfe\xc2\xad\x1d\x16\xca=\ +\x95\x9a\xb0!\xfa!\x18\xaeK\x00\x02\x00/\xff\xee\x06\ +\x17\x04d\x00\x14\x00\x22\x00*@\x17\x0e\x09GY\x0e\ +\x0e\x0b\x0c\x0f\x0b\x15\x12\x15FY\x12\x10\x04\x1cFY\ +\x04\x16\x00?+\x00\x18?+\x00\x18??\x129/\ ++10\x01\x14\x02\x06#\x22&57#\x03#\x13\ +3\x0336$32\x16%\x22\x06\x06\x15\x14\x163\ +26654&\x06\x17\x88\xf5\xa2\xbe\xd4\x02\xe7f\ +\xec\xee\xe9^\xdd=\x01\x0b\xba\xbd\xd3\xfedT\x86Q\ +Z^P\x85L]\x02\xb4\xca\xfe\xb7\xb3\xe3\xc5G\xfe\ +#\x04R\xfeD\xdd\xf1\xe5#\x87\xfe\x8aj{\x89\xf4\ +\x93nv\x00\x02\xff\xdf\xff\xf0\x04;\x04R\x00\x1b\x00\ +$\x00.@\x18\x12\x00\x22\x22\x00HY\x22\x22\x17\x1a\ +\x15\x17\x1cHY\x17\x0f\x07\x0cFY\x07\x16\x00?+\ +\x00\x18?+\x00\x18?\x129/+\x11\x12\x0091\ +0\x01\x22\x06\x07\x0e\x02#\x22'5\x163267\ +667&5463!\x03#\x13\x03\x22\x06\x15\ +\x14\x1633\x13\x02`?Y$KUiIG,\ +$\x1c,>%2V4\xae\xf3\xd4\x01\xb8\xe9\xea]\ +R^maS\x8dD\x01\xa8BH\x92j2\x12\xbf\ +\x0d6I^R\x11;\xb8\xa8\xc3\xfb\xae\x01\xa8\x01\xf6\ +`UKF\x01F\x00\xff\xff\x00^\xff\xec\x03\xfa\x05\ +\xec\x02&\x00H\x00\x00\x01\x06\x00j\xd6\x00\x00\x0c\xb5\ +\x03\x0299\x11&\x00+\x1155\x00\x01\x00/\xfe\ +\x14\x04?\x06\x14\x00)\x00R@1\x06#\x09\x03%\ +&%IY\x00&&\x09(\x09\x1eFY\xaf\x09\xbf\ +\x09\xef\x09\xff\x09\x04\x00\x09\x10\x09 \x09\x03\x09\x03\x09\ +\x09#(\x00#\x15\x12\x17FY\x12\x1b\x00?+\x00\ +\x18??\x129/_^]]+\x11\x12\x009\x18\ +/3+\x11\x003\x11\x12910\x01!\x07!\x07\ +\x06\x073632\x16\x15\x14\x07\x03\x06\x06#\x22'\ +5\x16327\x13654#\x22\x06\x07\x03#\x01\ +#7373\x02?\x01D#\xfe\xbf\x11\x152\x08\ +\x95\xc3\x88\x90\x16\x9e&\xb5\x93^6;:\x81'\x9c\ +\x12\x7fp\xc3-Z\xec\x01\x02\x9b$\x9a%\xeb\x05f\ +\xa3Jp\x9a\xc6\x9d\x90L`\xfd\x19\xb7\xaa\x17\xc1\x17\ +\xbc\x02\xdeO0\x87\xfa\xd9\xfe^\x04\xc3\xa3\xae\x00\xff\ +\xff\x00%\xff\xec\x03\xeb\x06!\x02&\x01\xcd\x00\x00\x01\ +\x06\x00v\x06\x00\x00\x0a\xb4\x01,,\x11&\x00+\x11\ +5\x00\x01\x00^\xff\xec\x03\xcd\x04f\x00\x1c\x00&@\ +\x14\x0f\x12HY\x0f\x0f\x00\x07\x07\x0cFY\x07\x10\x00\ +\x17FY\x00\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x05\x22&54\x12$32\x17\x07\ +&#\x22\x06\x07!\x07!\x07\x15\x14\x163267\ +\x15\x06\x01\xfa\xc5\xd7\x96\x01\x05\xab\xa4\x85Fzcp\ +\xa4'\x01\xa3&\xfeb\x02ji:xZ\x8c\x14\xd6\ +\xc5\xcf\x01Z\xb6=\xb85\x97\x84\xb0$&j}\x1f\ +-\xc3G\xff\xff\x00\x0e\xff\xec\x03q\x04f\x02\x06\x00\ +V\x00\x00\xff\xff\x00/\x00\x00\x02V\x05\xfa\x02\x06\x00\ +L\x00\x00\xff\xff\x00/\x00\x00\x02\xfb\x05\xec\x02&\x00\ +\xf3\x00\x00\x01\x07\x00j\xfe\xe4\x00\x00\x00\x0c\xb5\x02\x01\ +\x19\x19\x11&\x00+\x1155\xff\xff\xfe\xfa\xfe\x14\x02\ +V\x05\xfa\x02\x06\x00M\x00\x00\x00\x02\xff\xb2\xff\xec\x06\ +\x08\x04`\x00)\x005\x007@\x1d\x00\x09\x02\x02*\ +HY\x02\x02\x19''\x11FY'\x10\x19\x1eFY\ +\x19\x16\x090HY\x09\x16\x00?+\x00\x18?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x12\x00910\ +\x01632\x16\x15\x14\x06\x06#\x22&547\x13\ +&#\x22\x06\x06\x07\x0e\x02#\x22'5\x16326\ +67>\x0332\x17\x13\x22\x07\x06\x15\x14326\ +54&\x03\xd5\x80[\xa3\xb5q\xd7\x95\xbd\xbc\x19\x5c\ +!\x14=RHNQj\x8cc>3\x22*0I\ +AFL\x5cp\x96b\xa3\x807Nh\x16\xaacv\ +Y\x02\x7f\x19\x9c\x8dt\xaf`\xa8\x97Mo\x01\xb3\x06\ +<\x8b\xe9\xf6\xb3Y\x14\xc5\x0f=}\xd0\xe0\xacc/\ +-\xfd\xb4\x14h2\x9deWJE\x00\x02\x005\xff\ +\xec\x06;\x04R\x00\x17\x00#\x004@\x1c\x00\x09\x02\ +\x02\x18HY\x14\x0fGY\x14\x14\x12\x02\x02\x11\x16\x12\ +\x0f\x11\x15\x09\x1eHY\x09\x16\x00?+\x00\x18??\ +3\x129/\x119/++\x11\x12\x00910\x01\ +632\x16\x15\x14\x06\x06#\x22&547!\x03\ +#\x133\x03!\x133\x13\x22\x07\x06\x15\x14326\ +54&\x04\x08\x83X\xa3\xb5q\xd7\x95\xbd\xbc\x17\xfe\ +\x8bf\xec\xee\xe9^\x01w^\xea/Oh\x16\xaac\ +vX\x02\x7f\x19\x9c\x8dt\xaf`\xa8\x97?s\xfe#\ +\x04R\xfeD\x01\xbc\xfd\x95\x14h2\x9deWJE\ +\x00\xff\xff\x00/\x00\x00\x04?\x06\x14\x02\x06\x00\xe9\x00\ +\x00\xff\xff\x00/\x00\x00\x04\x8b\x06!\x02&\x01\xd4\x00\ +\x00\x01\x06\x00vd\x00\x00\x0a\xb4\x01\x13\x13\x11&\x00\ ++\x115\xff\xff\xffV\xfe\x14\x04R\x06'\x02&\x00\ +\x5c\x00\x00\x01\x06\x026\xad\x00\x00\x0a\xb4\x01\x1b\x1b\x11\ +&\x00+\x115\x00\x02\x00m\xfe\x14\x04\x87\x04R\x00\ +\x04\x00\x1c\x00(@\x14\x12\x16\x1c\x00\x00\x03\x16\x0e\x1c\ +\x0f\x03\x1b\x11\x15\x16\x0aFY\x16\x16\x00?+\x00\x18\ +???3\x11\x129/\x11\x12910\x053\x03\ +#\x13\x13\x03\x06\x15\x143267\x133\x03#7\ +#\x06\x06#\x22&547\x13\x023-^\xe1P\ +\x89\x90\x10\x7fp\xc5-c\xe9\xe9\xb9\x15\x08R\xb2g\ +\x86\x94\x1a\x879\xfeM\x01g\x04\xd7\xfd^L5\x85\ +\xff\xd4\x01\xd5\xfb\xae\xcdtm\x98\x8eD}\x02\x7f\x00\ +\x01\x00F\x00\x00\x04\xbc\x06\xe5\x00\x07\x00\x16@\x0a\x01\ +\x07\x06\x12\x07\x04LY\x07\x03\x00?+\x00\x18?\x10\ +\xc610\x01\x133\x03!\x01#\x01\x03\xa2A\xd9j\ +\xfd\xe9\xfe\xf6\xeb\x015\x05\xb6\x01/\xfe\x04\xfb\x17\x05\ +\xb6\x00\x01\x00/\x00\x00\x03\xec\x05\x8b\x00\x07\x00\x16@\ +\x0a\x06\x04\x03\x15\x04\x01GY\x04\x0f\x00?+\x00\x18\ +?\x10\xc610\x01!\x03#\x13!\x133\x03\x81\xfe\ +\x5c\xc2\xec\xec\x01\xacC\xe2\x03\x98\xfch\x04R\x019\ +\x00\xff\xff\x00\xcb\x00\x00\x07\xb4\x07s\x02&\x00:\x00\ +\x00\x01\x07\x00C\x01\x12\x01R\x00\x0a\xb4\x01\x1e\x1e\x05\ +&\x00+\x115\xff\xff\x00y\x00\x00\x06^\x06!\x02\ +&\x00Z\x00\x00\x01\x06\x00CF\x00\x00\x0a\xb4\x01\x1d\ +\x1d\x11&\x00+\x115\xff\xff\x00\xcb\x00\x00\x07\xb4\x07\ +s\x02&\x00:\x00\x00\x01\x07\x00v\x01\xdb\x01R\x00\ +\x0a\xb4\x01%%\x05&\x00+\x115\xff\xff\x00y\x00\ +\x00\x06^\x06!\x02&\x00Z\x00\x00\x01\x07\x00v\x01\ +\x14\x00\x00\x00\x0a\xb4\x01$$\x11&\x00+\x115\xff\ +\xff\x00\xcb\x00\x00\x07\xb4\x07>\x02&\x00:\x00\x00\x01\ +\x07\x00j\x01u\x01R\x00\x0c\xb5\x02\x0122\x05&\ +\x00+\x1155\xff\xff\x00y\x00\x00\x06^\x05\xec\x02\ +&\x00Z\x00\x00\x01\x07\x00j\x00\x9c\x00\x00\x00\x0c\xb5\ +\x02\x0111\x11&\x00+\x1155\xff\xff\x00\xba\x00\ +\x00\x05\x00\x07s\x02&\x00<\x00\x00\x01\x07\x00C\xff\ +\x9b\x01R\x00\x0a\xb4\x01\x0a\x0a\x05&\x00+\x115\xff\ +\xff\xffV\xfe\x14\x04R\x06!\x02&\x00\x5c\x00\x00\x01\ +\x07\x00C\xff,\x00\x00\x00\x0a\xb4\x01\x19\x19\x11&\x00\ ++\x115\x00\x01\x00/\x01\xc5\x03\xa0\x02\x87\x00\x03\x00\ +\x08\xb1\x00\x01\x00/310\x137!\x07/+\x03\ +F+\x01\xc5\xc2\xc2\x00\x00\x01\x00/\x01\xc5\x07w\x02\ +\x87\x00\x03\x00\x08\xb1\x00\x01\x00/310\x137!\ +\x07/+\x07\x1d+\x01\xc5\xc2\xc2\x00\xff\xff\x00/\x01\ +\xc5\x07w\x02\x87\x02\x06\x02\x03\x00\x00\xff\xff\xff,\xfe\ +2\x02\xb2\xff\xd3\x00'\x00B\xff\xe8\xffv\x00\x07\x00\ +B\x00\x1f\x00\x8b\x00\x01\x00w\x03\xc1\x021\x05\xb6\x00\ +\x07\x00\x09\xb2\x00\x04\x03\x00?\xcd10\x13'6\x12\ +73\x02\x07}\x06\x22\x91W\xb0zM\x03\xc1\x16L\ +\x01\x0a\x89\xfe\xe2\xd7\x00\x00\x01\x00s\x03\xc1\x02/\x05\ +\xb6\x00\x08\x00\x09\xb2\x05\x08\x03\x00?\xce10\x01\x17\ +\x06\x02\x07#6\x127\x02'\x08%\x93R\xb2+~\ +\x1d\x05\xb6\x16S\xfe\xf3\x7f_\x01@V\x00\x00\x01\xff\ +\x9a\xfe\xf8\x01V\x00\xee\x00\x06\x00\x08\xb1\x04\x00\x00/\ +\xcd10%\x17\x06\x07#6\x13\x01N\x08l\x9e\xb2\ +i_\xee\x17\xe9\xf6\xee\x01\x08\x00\x01\x00\xe1\x03\xc1\x01\ +\xd5\x05\xb6\x00\x08\x00\x09\xb2\x04\x08\x03\x00?\xcd10\ +\x01\x07\x14\x17#&\x02'7\x01\xc9\x01\x0d\xa4\x19.\ +\x09\x0f\x05\xb6o\xda\xacZ\x01\x09|\x16\x00\x00\x02\x00\ +w\x03\xc1\x03\xc9\x05\xb6\x00\x06\x00\x0e\x00\x0d\xb4\x00\x07\ +\x03\x0b\x03\x00?3\xcd210\x01'6\x133\x02\ +\x07!'6\x1273\x02\x07\x02\x17\x09T\xb7\xb0z\ +M\xfd{\x06\x22\x91W\xb0zM\x03\xc1\x16\xbe\x01!\ +\xfe\xe2\xd7\x16L\x01\x0a\x89\xfe\xe2\xd7\x00\x02\x00s\x03\ +\xc1\x03\xc7\x05\xb6\x00\x08\x00\x10\x00\x0d\xb4\x0d\x05\x10\x08\ +\x03\x00?3\xce210\x01\x17\x06\x02\x07#6\x12\ +7!\x17\x06\x03#6\x127\x02'\x08%\x93R\xb2\ ++~\x1d\x02\x85\x09b\xab\xb03t \x05\xb6\x16S\ +\xfe\xf3\x7f_\x01@V\x16\xdc\xfe\xfdr\x01&]\x00\ +\x02\xff\x9a\xfe\xf8\x02\xee\x00\xee\x00\x06\x00\x0d\x00\x0c\xb3\ +\x0b\x04\x0d\x00\x00/2\xcd210%\x17\x06\x07#\ +6\x13!\x17\x06\x03#\x127\x01N\x08l\x9e\xb2i\ +_\x02\x83\x09\x5c\xaf\xb0xO\xee\x17\xe9\xf6\xee\x01\x08\ +\x17\xce\xfe\xef\x01\x19\xdd\x00\x01\x00\xcb\x00\x00\x03\xec\x06\ +\x14\x00\x0b\x00'@\x12\x00\x05\x05\x0b\x06\x06\x07\x01\x04\ +\x04\x0a\x07\x07\x08\x03\x12\x08\x00\x00??\x129/3\ +3\x113\x119\x1133\x11310\x01%\x03#\ +\x01\x057\x05\x133\x03%\x03\xc1\xfe\xc6\x9e\xf5\x01\x08\ +\xfe\xcf+\x01'\x22\xf6\x8f\x01F\x03\xc1\x1e\xfc!\x03\ +\xdf\x1e\xd0\x1e\x01\xa1\xfe_\x1e\x00\x01\x00D\x00\x00\x04\ +\x04\x06\x14\x00\x15\x00E@!\x14\x0b\x0b\x11\x0e\x01\x08\ +\x02\x08\x07\x00\x09\x09\x03\x07\x05\x06\x13\x0c\x0c\x12\x0d\x0d\ +\x0f\x0e\x06\x0e\x06\x05\x0f\x00\x05\x12\x00??\x1299\ +//\x129\x1133\x113\x11\x12933\x113\ +\x1133\x113\x1133\x11310\x01%\x07%\ +\x03#\x13\x057\x05\x137\x057\x05\x133\x03%\x07\ +%\x07\x023\x01F-\xfe\xc6\x1a\xf6\x85\xfe\xbd-\x01\ +7\x0a`\xfe\xbd-\x017\x1b\xf6\x86\x01F-\xfe\xc9\ +\x08\x02\x0a\x1f\xcf\x1d\xfe\x89\x01w\x1d\xcf\x1f\x01\x08\xf6\ +\x1f\xd1\x1e\x01x\xfe\x88\x1e\xd1\x1f\xf6\x00\x01\x00\x98\x01\ +\xcd\x02\xa4\x04\x08\x00\x0b\x00\x08\xb1\x09\x03\x00//1\ +0\x134632\x16\x15\x14\x06#\x22&\x98\xa7\x8c\ +du\xa4\x91fq\x02\xac\x9c\xc0mr\x9c\xc0s\xff\ +\xff\x01%\xff\xe3\x04o\x01\x14\x00'\x00\x11\x03!\x00\ +\x00\x00'\x00\x11\x021\x00\x00\x00\x07\x00\x11\x01\x04\x00\ +\x00\x00\x07\x00\x8d\xff\xec\x09\x04\x05\xcb\x00\x0b\x00\x19\x00\ +\x1d\x00)\x007\x00C\x00Q\x003@\x19\x1e88\ +5O\x06\x10O\x10O\x10\x1c\x1d\x03\x1c\x12\x00\x17\x07\ +$>>.H\x13\x00?33\x113?3??\ +\x1299//\x113\x1133\x11310\x01\x22\ +\x06\x06\x15\x14326654\x17\x14\x02\x06#\x22\ +&54\x12632\x16%\x01#\x01\x01\x22\x06\x06\ +\x15\x14326654\x17\x14\x02\x06#\x22&5\ +4\x12632\x16\x05\x22\x06\x06\x15\x143266\ +54\x17\x14\x02\x06#\x22&54\x12632\x16\ +\x02\x127X5P4W;\xc1o\xb6s|\x84j\ +\xb3w\x7f\x85\x02\xc2\xfb\xc3\xc3\x04>\x02\xcb5V:\ +R6X9\xc0o\xb3s\x7f\x86j\xb4v\x7f\x87\xfc\ +-4W9Q4X;\xc1o\xb6q\x7f\x85j\xb3\ +v\x7f\x88\x05#z\xe0g\x87t\xebf\x83\x81\xa0\xfe\ +\xcd\x9a\x9e\x95\xa6\x01'\x96\x98\x83\xfaJ\x05\xb6\xfd%\ +r\xe0p\x86z\xe8c\x83\x7f\xa1\xfe\xcb\x9a\x99\x92\xac\ +\x01)\x95\x96\x10s\xe3l\x86u\xe8h\x83\x7f\xa1\xfe\ +\xcb\x9a\x99\x92\xab\x01*\x95\x96\xff\xff\x00\xd5\x03\xa6\x02\ +\x04\x05\xb6\x02\x06\x00\x0a\x00\x00\xff\xff\x00\xd5\x03\xa6\x03\ +}\x05\xb6\x02\x06\x00\x05\x00\x00\x00\x01\x00P\x00d\x02\ +b\x03\xe3\x00\x06\x00\x08\xb1\x05\x01\x00/\xc410\x13\ +\x01\x17\x01\x13\x07\x03P\x01\x8b\x87\xfe\xe0\x99\xb2\xd9\x02\ +=\x01\xa6v\xfe\xb2\xfe\x91L\x01\xc1\x00\x01\x00\x0a\x00\ +\x5c\x02\x1d\x03\xdb\x00\x06\x00\x08\xb1\x01\x05\x00/\xc41\ +0\x01\x01'\x01\x037\x13\x02\x1d\xfet\x87\x01!\x9a\ +\xb3\xd9\x02\x02\xfeZw\x01N\x01nL\xfe@\x00\xff\ +\xff\xff\xff\xff\xe5\x04w\x05\xb6\x00'\x00\x04\x02\x1f\x00\ +\x00\x00\x06\x00\x04\xde\x00\x00\x01\xfe\x02\x00\x00\x03\x02\x05\ +\xb6\x00\x03\x00\x0a\xb3\x03\x03\x02\x12\x00??10\x01\ +\x01#\x01\x03\x02\xfb\xc5\xc5\x04=\x05\xb6\xfaJ\x05\xb6\ +\x00\x00\x01\x00\x96\x03\x0e\x039\x05\xc7\x00\x15\x00\x15@\ +\x09\x0d\x0f\x00\x0a\x0b\x03\x05\x0f\x04\x00?3?\xcd2\ +\x11310\x01\x13654#\x22\x06\x07\x03#\x13\ +3\x07632\x16\x15\x14\x07\x03\x021V\x0cGF\ +w\x1a>\xa1\x91\x87\x10d\x87T\x5c\x10R\x03\x0e\x01\ +\x88:\x1eM\x9dy\xfe\xe9\x02\xaa\x83\x92_X6>\ +\xfer\x00\x00\x01\x00\x17\x00\x00\x04\xb0\x05\xb6\x00\x11\x00\ +1@\x19\x0e\x11NY\x0e\x0e\x05\x0a\x03\x07\x08\x07P\ +Y\x00\x08\x08\x05\x0a\x0a\x0dNY\x0a\x06\x00?+\x11\ +\x12\x009\x18/3+\x11\x003\x11\x129\x18/+\ +10\x01!\x07!\x03#\x13#73\x13!\x07!\ +\x03!\x07!\x01\xbc\x01\x11\x1f\xfe\xee8\xe77\x9d \ +\x9e\xdd\x02\xfe+\xfd\xec_\x01\xf4-\xfe\x0e\x01\xa0\x9a\ +\xfe\xfa\x01\x06\x9a\x04\x16\xcd\xfeL\xcb\x00\x01\xff\xf0\x00\ +\x00\x04\xb8\x05\xcb\x00$\x00O@+\x11#$#P\ +Y\x0e$\x0f$\x1f$\x02\x09\x03\x15\x1f \x1fPY\ +\x12 $ $ \x1a\x04\x04\x0aMY\x04\x07\x1b\x17\ +\x1a\x17NY\x1a\x18\x00?+\x11\x003\x18?+\x11\ +\x12\x0099\x18//\x113+\x11\x003_^]\ +\x113+\x11\x00310\x0176632\x17\x07\ +&&#\x22\x06\x07\x07!\x07!\x07!\x07!\x06\x07\ +!\x07!7667#737#7\x01m\x1e\ +/\xe2\xbc\xbe\xa2X8\x8c>^o\x16#\x01N!\ +\xfe\xb2\x1e\x01M\x1e\xfe\xb09\x8c\x02\xb4-\xfc6$\ +aw \xbe!\xc0\x1d\xc5#\x03\x93\x94\xdb\xc9V\xb7\ +\x1f+eh\xa8\x99\x8b\x9c\xbaJ\xcf\xc1\x19\x83v\x9c\ +\x8b\x99\x00\x00\x03\x007\xff\xec\x063\x05\xb6\x00\x07\x00\ +\x12\x00,\x009@ \x1f'$'PY\x0c\x00M\ +Y\x22$\x0c\x0c$\x22\x03\x0f\x0e\x18\x0f\x07MY\x0f\ +\x06\x18\x13OY\x18\x19\x00?+\x00\x18?+\x00\x18\ +?\x12\x179///++\x11\x00310\x013\ +2654##\x05\x14\x00!#\x03#\x01!2\ +\x16\x1327\x15\x06#\x22&547\x13#?\x02\ +3\x073\x07#\x03\x06\x15\x14\x16\x01\xba)\xac\xb9\xe8\ +;\x02\x0e\xfe\xbf\xfe\xdfBt\xe4\x018\x01\x06\xd8\xe6\ +\xfc7PVptz\x17E\x83\x13\xa1o\x8b1\xdb\ +#\xdbL\x0c,\x02\xec\xa7\x92\xc9\xbb\xfb\xfe\xeb\xfd\xdd\ +\x05\xb6\xc9\xfb\xb3!\xaa+pg=\x5c\x01H\x5c`\ +\xcb\xdd\xaa\xfe\xa6>\x1c&*\x00\x01\x003\xff\xec\x04\ +\xd9\x05\xcb\x00'\x00S@/\x06\x1c\x1d\x1cPY\x03\ +\x1d\x0b\x17\x18\x17PY\x08\x18\x0f\x1d\x1f\x1d\x02\x09\x00\ +\x18p\x18\x02\x0b\x03\x1d\x18\x1d\x18\x13!!\x00MY\ +!\x07\x13\x0eNY\x13\x19\x00?+\x00\x18?+\x11\ +\x12\x0099\x18//_^]^]\x113+\x11\ +\x003\x113+\x11\x00310\x01\x22\x06\x07!\x07\ +!\x06\x07!\x07!\x14\x16327\x15\x06#\x22\x02\ +5#7367#73\x12\x0032\x16\x17\x07\ +&&\x03\x91v\xc1A\x01\x83!\xfen\x12\x0a\x01T\ +!\xfe\xc1y\x87x\x8a\x81\xb1\xd8\xe4\xa2!\x8b\x0f\x0c\ +\x89 \x94\x5c\x01G\xd0X\x99Pf6j\x05\x02\xae\ +\xa8\x9aCH\x9b\xa1\x93<\xcb=\x01\x04\xfc\x9b_,\ +\x9a\x01\x04\x01\x1b,7\xb4\x22,\x00\x00\x04\x00\xa2\xff\ +\xf4\x05\xa8\x05\xc3\x00\x03\x00\x10\x00\x1b\x003\x00%@\ +\x12.\x1c\x1c\x03\x11\x0e\x0e\x02\x03\x06\x02\x18(#\x07\ +\x16\x07\x19\x00?3?3??\x129/3\x119\ +/310\x01\x01#\x01\x13\x14\x06#\x22&54\ +6632\x16%\x22\x06\x15\x14326654\ +%\x22&546632\x17\x07&#\x22\x06\x06\ +\x15\x143267\x15\x06\x05\xa8\xfb\xc0\xc6\x04C\xc3\ +\xc3\xa6{\x89W\xa3m|\x8a\xfe\xeeMdi4M\ +-\xfc\xdb\x7f\x89^\xadrXb-NA<_4\ +y/E%P\x05\xb6\xfaJ\x05\xb6\xfb\xe6\xc2\xe6\x8d\ +{}\xc8o\x93\x0e\xb0{\x89P\x8aO\x8b\xd9\x8f}\ +z\xc9p'\x7f O\x87L\x92\x18\x11\x85)\x00\x00\ +\x02\x00d\xff\xec\x03\xa4\x05\xc9\x00\x1d\x00&\x00#@\ +\x10\x1a$$\x0b\x10\x03\x10\x03\x10\x14\x00\x07\x19 \x14\ +\x07\x00?3?3\x1199//\x1133\x113\ +10%2673\x06\x06#\x22&55\x06\x07\ +567\x114632\x16\x15\x14\x02\x07\x11\x14\x16\ +\x134#\x22\x06\x15\x1166\x02\x7f@M\x06\x92\x09\ +\x9f\x96\x9c\xa9Ti>\x7f\x9e\x99\x81\x94\xb1\xbeDn\ +X.,^T\x96ie\xc2\xb6\xc2\xb6\xbb\x1b\x1b\x9a\ +\x0f(\x01\xcb\xa1\xa3\xa7\x91\xae\xfe\xfa`\xfe\xe5eg\ +\x03\xf5\xa8I_\xfe\x987\xad\x00\x04\x00)\x00\x00\x07\ +u\x05\xb6\x00\x0e\x00\x12\x00 \x00,\x004@\x1b\x09\ +\x02\x06\x07!\x1e'\x17\x0f\x17\x1f\x17\x02\x1e\x17\x1e\x17\ +\x0f\x0d\x07\x03\x01\x06\x12\x10\x0f\x12\x00?3?3?\ +3\x1299//]\x113\x113\x11\x12991\ +0!#\x01\x06\x07\x03#\x013\x01767\x133\ +\x037!\x07\x13\x14\x06\x06#\x22&54663\ +2\x16%\x22\x06\x06\x15\x14326654\x04\x0a\ +\xf6\xfe\xcd'$\x98\xd5\x015\xf8\x011\x0f$\x17\x9c\ +\xd2\x81#\x02\x11#\xa6W\xa0py\x8dX\xa4mx\ +\x8c\xfe\xf15P-e6N.\x04s\xed\xb5\xfd/\ +\x05\xb6\xfb\x96V\xd6e\x02\xd9\xfaJ\xa4\xa4\x02\xbet\ +\xc5s\x8c\x83y\xc9t\x9a\x0dV\x8bH\x83Q\x89M\ +\x85\x00\x02\x00q\x02\xe5\x05\xc9\x05\xb6\x00\x07\x00\x18\x00\ +&@\x11\x14\x0d\x10\x08\x08\x01\x16\x0a\x0a\x11\x0e\x07\x03\ +\x03\x0e\x04\x03\x00?33\x113\x1133\x113\xc4\ +9/32210\x01#\x11#5!\x15#\x01\ +\x03#\x17\x11#\x113\x13\x133\x11#\x117#\x03\ +\x01\xc7\x92\xc4\x02\x1c\xc6\x02?\xb2\x06\x04\x8d\xd7\xaa\xb6\ +\xcd\x92\x04\x06\xb8\x02\xe5\x02R\x7f\x7f\xfd\xae\x02\x1bs\ +\xfeX\x02\xd1\xfd\xea\x02\x16\xfd/\x01\xa2y\xfd\xe5\xff\ +\xff\xff\xd9\x00\x00\x05\x8d\x05\xcd\x02\x06\x01v\x00\x00\x00\ +\x02\x00u\xff\xdd\x04\x9a\x04H\x00\x17\x00\x1f\x00\x17@\ +\x09\x0d\x1f\x1f\x11\x08\x11\x00\x1c\x08\x00/3/2\x11\ +\x129/310\x05\x22&\x02546632\ +\x16\x12\x15!\x11\x16\x163267\x17\x06\x06\x13\x11\ +&&#\x22\x07\x11\x02\x87\x9d\xf2\x83\x7f\xfa\x99\x98\xf5\ +\x86\xfc\xc41\xa6R\x84\xb5RHb\xd9\x932\xa3X\ +\xadz#\x93\x01\x05\x9d\xa1\xff\x96\x8e\xfe\xfd\xa5\xfe\x9c\ +5Fh\x82)\x9b|\x02\x8b\x01\x155Bu\xfe\xe9\ +\x00\xff\xff\x00\x83\xff\xea\x06$\x05\xb6\x00'\x02\x17\x02\ +\x81\x00\x00\x00&\x00{\xc4\x00\x01\x07\x02@\x03\x10\xfd\ +\xb3\x00\x0d\xb4\x04\x03\x02\x1a\x19\x00?55510\ +\x00\xff\xff\x00W\xff\xea\x06\x89\x05\xc9\x00'\x02\x17\x03\ +\x00\x00\x00\x00'\x02@\x03u\xfd\xb3\x01\x06\x00u\xef\ +\x00\x00\x0b\xb4\x03\x02\x01\x0f\x19\x00?555\x00\xff\ +\xff\x00d\xff\xea\x06\x87\x05\xb6\x00'\x02\x17\x02\xf4\x00\ +\x00\x00&\x02=\xf1\x00\x01\x07\x02@\x03s\xfd\xb3\x00\ +\x0b\xb4\x04\x03\x02*\x19\x00?555\x00\xff\xff\x00\ +\x81\xff\xea\x06\x22\x05\xb6\x00'\x02\x17\x02\x7f\x00\x00\x00\ +'\x02@\x03\x0e\xfd\xb3\x01\x06\x02?\xf5\x00\x00\x0b\xb4\ +\x03\x02\x01\x0f\x19\x00?555\x00\x00\x02\x00`\xff\ +\xec\x04\x5c\x05\xc7\x00\x19\x00%\x00(@\x15\x0d\x04\x0b\ +\x17\x10FY\x0b GY\x0b\x0b\x17\x04\x04\x1aFY\ +\x04\x16\x00?+\x00\x18\x10\xc49/++\x11\x12\x00\ +910\x01\x10\x02\x04#\x22&54\x12632\ +\x174&#\x22\x06\x0756632\x12\x012\x12\ +7&&#\x22\x06\x06\x15\x14\x04\x5c\xa9\xfe\xe4\xb8\xb8\ +\xc7\x8f\xea\x98\xa3Y\x85y;\x8dAA\xa1N\xdb\xeb\ +\xfd\x92}\xc3&\x18k@X\x8aU\x03\xa0\xfe\xf4\xfe\ +?\xe7\xcb\xca\xac\x016\x9du\xba\xbf(*\xcb\x22(\ +\xfe\xec\xfb\xf9\x01\x1a\xeeCSr\xd9v\xdd\x00\x02\xff\ +\xc9\x00\x00\x04)\x05\xb8\x00\x05\x00\x0c\x00\x16@\x0a\x06\ +\x04\x00\x03\x04\x09LY\x04\x12\x00?+\x00\x18?\x12\ +910\x01!\x13\x07!7\x01\x06\x07\x01!\x03&\ +\x02\x91\x01\x07\x91\x1f\xfb\xbf\x1c\x03\x02$J\xfe{\x02\ +PN\x0f\x05\xb8\xfa\xd1\x89\x8d\x04:j\x90\xfd\x00\x02\ +\xf6\xa3\x00\x00\x01\x00\xdb\xfe#\x05X\x05\xb6\x00\x07\x00\ +\x12\xb7\x00\x04\x05\x02LY\x05\x03\x00?+\x00\x18/\ +310\x01\x11!\x11#\x11!\x11\x04d\xfdk\xf4\ +\x04}\xfe#\x06\xc4\xf9<\x07\x93\xf8m\x00\x00\x01\x00\ +\x9e\xfe#\x05T\x05\xb6\x00\x0b\x00#@\x11\x01\x09\x00\ +\x00\x09LY\x00\x03\x07\x04\x04\x07LY\x04\x03\x00?\ ++\x11\x12\x009\x18/+\x11\x12\x00910\x135\ +\x01\x015!\x15!\x01\x01!\x15\x9e\x02\x5c\xfd\xb4\x04\ +f\xfc\xe0\x02\x18\xfd\xd1\x03w\xfe#\x8b\x03o\x03\x10\ +\x89\xca\xfd5\xfc\xcd\xcb\x00\x01\x00u\x02w\x04\x1d\x03\ ++\x00\x03\x00\x0b\xb4\x01\x00RY\x01\x00/+10\ +\x135!\x15u\x03\xa8\x02w\xb4\xb4\x00\x01\x00b\xff\ +\xf2\x05\x19\x06\xba\x00\x08\x00\x14\xb7\x06\x01\x03\x04\x04\x08\ +\x01\x08\x00//\x129/3\x12910\x05#\x01\ +#5!\x13\x013\x02\xc1\x9c\xfe\xef\xb2\x016\xdb\x01\ +\xf5\xb1\x0e\x02\xf7\xaf\xfd\x91\x05\x91\x00\x00\x03\x00\x8d\x01\ +\x87\x05N\x04\x17\x00\x14\x00 \x00+\x00$@\x11\x10\ +\x18$\x05\x04\x08\x0e&\x15\x15\x03\x08!\x1b\x1b\x12\x0e\ +\x00/33\x113/33\x113\x11\x12\x1791\ +0\x01\x14\x06#\x22'\x06\x06#\x22&5463\ +2\x17632\x16\x01267&&#\x22\x06\x15\ +\x14\x16\x01\x22\x06\x07\x1632654&\x05N\xae\ +\x83\xb5\x7f:\x99S\x8b\xab\xaf\x87\xb3x|\xb3\x8a\xa7\ +\xfc\x7f8^0-_\x95\xb2\xaeb>>\x05R`\x5c\xfa\xf7\ +\xba\xbf\x1b\xc5\x1d\xbc\x05\x0b\xb7\xbf\x1c\xc5\x1f\x00\x02\x00\ +o\x01y\x04+\x041\x00\x17\x00/\x00S@-\x1b\ +**$RY\x00*\x10*\x02\x09\x03*@'\x1e\ +\x1e\x18RY\x1e\x06\x03\x12\x12\x0cRY\x00\x12\x10\x12\ +\x02\x09\x03\x12@\x0f\x06\x06\x00RY\x06\x00/+\x00\ +\x18\x10\xc6\x1a\xcd_^]+\x00\x10\x18\xc4\x10\xc4+\ +\x00\x18\x10\xc6\x1a\xcd_^]+\x00\x10\x18\xc410\ +\x01\x22\x06\x075632\x16\x17\x16\x163267\ +\x15\x06#\x22&'&&\x03\x22\x06\x075632\ +\x16\x17\x16\x163267\x15\x06#\x22&'&&\ +\x01X3z\ +;\xbfl\x18'#\x15A8\xbeo\x1e$ \x17\xfe\ +uD5\xbem\x1b%\x1e\x19@9\xbfn !%\ +\x13\x00\x01\x00u\x00\x9a\x04\x1d\x05\x0c\x00\x13\x00'@\ +\x13\x12\x11\x01\x0e\x02\x01\x02RY\x0d\x05\x06\x05RY\ +\x0a\x08\x01\x06\x00/\xc633+\x11\x003+\x11\x00\ +3\x113310\x01#5!7!5!\x13\x17\ +\x073\x15!\x07!\x15!\x03'\x01^\xe9\x01=g\ +\xfe\x5c\x01\xf8\x83\xa6e\xec\xfe\xc2h\x01\xa6\xfe\x06\x81\ +\xa4\x01\xae\xb4\xdd\xb3\x01\x1aG\xd3\xb3\xdd\xb4\xfe\xecE\ +\x00\x00\x02\x00u\x00\x00\x04\x1f\x05\x06\x00\x03\x00\x0a\x00\ +\x1a@\x0c\x07\x0f\x04\x01\x0c\x03\x04\x00\x01RY\x00\x00\ +/+\x00\x18/_^]\xc61035!\x157\ +\x015\x01\x15\x01\x01u\x03\xa8\x02\xfcX\x03\xa8\xfdG\ +\x02\xb9\xb4\xb4\xf8\x01\xaey\x01\xe7\xc2\xfe\xa8\xfe\xd0\x00\ +\x02\x00u\x00\x00\x04\x1d\x05\x06\x00\x03\x00\x0a\x00\x1a@\ +\x0c\x07\x0f\x0a\x01\x0c\x03\x0a\x00\x01RY\x00\x00/+\ +\x00\x18/_^]\xc61035!\x15\x09\x025\ +\x01\x15\x01u\x03\xa8\xfcX\x02\xb8\xfdH\x03\xa8\xfcX\ +\xb4\xb4\x01\xbc\x010\x01X\xc2\xfe\x19y\xfeR\x00\x00\ +\x02\x00\x83\x00\x00\x04f\x05\xc1\x00\x05\x00\x09\x00\x14@\ +\x0a\x07\x03\x08\x06\x00\x09\x06\x05\x02\x05\x00//\x12\x17\ +910\x01\x01#\x01\x013\x13\x09\x02\x04f\xfe>\ +^\xfe=\x01\xc3^\xe7\xfe\xea\xfe\xe9\x01\x17\x02\xdf\xfd\ +!\x02\xdf\x02\xe2\xfd\x1e\x01\xd3\xfe-\xfe-\xff\xff\xff\ +\x1f\xfe\x14\x05\x0a\x06\x1f\x00&\x00I\x00\x00\x00\x07\x00\ +L\x02\xb4\x00\x00\xff\xff\xff\x1f\xfe\x14\x05\x18\x06\x1f\x00\ +&\x00I\x00\x00\x00\x07\x00O\x02\xb4\x00\x00\x00\x01\x01\ +L\x04\xd9\x04\x8f\x06'\x00\x0f\x00\x0e\xb4\x08\x00\x80\x0c\ +\x03\x00/3\x1a\xcd210\x01\x06\x06#\x22&5\ +473\x07\x143267\x04\x8f'\xe5\xcb\xb1\xbb\ +\x08\xcd\x04\xacjo\x14\x06'\xae\xa0\x8b\x8a\x1c\x1d5\ +\x85Ya\x00\x01\xfe\xfc\xfe\x14\x02\x06\x04R\x00\x0c\x00\ +\x11\xb7\x08\x0f\x00\x05FY\x00\x1b\x00?+\x00\x18?\ +10\x03\x22'5\x16327\x013\x01\x06\x06q\ +]6>7\x83'\x01\x02\xe9\xfe\xf8&\xb5\xfe\x14\x17\ +\xbe\x14\xba\x04\xc3\xfb!\xb6\xa9\x00\x01\x01\xfa\x04\xcd\x03\ +`\x06\x14\x00\x08\x00\x0a\xb2\x03\x80\x08\x00/\x1a\xcd1\ +0\x01673\x15\x06\x06\x07#\x01\xfaP9\xdd!\ +\x886\x87\x04\xe7\x90\x9d\x14E\xb95\x00\x01\x00\x8b\xfe\ +;\x01\xf0\xff\x83\x00\x08\x00\x0a\xb2\x08\x80\x03\x00/\x1a\ +\xcd10\x13673\x15\x06\x06\x07#\x8bW0\xde\ +\x1d\x80A\x87\xfeV\x9c\x91\x14A\xafD\x00\x00\x01\x01\ +\xe5\x04\xd9\x03L\x06!\x00\x08\x00\x0a\xb2\x08\x80\x03\x00\ +/\x1a\xcd10\x01\x06\x07#56673\x03L\ +a(\xde\x1f\x7f@\x89\x06\x06\xb5x\x15>\xb1D\x00\ +\x02\x00{\x025\x03\x10\x05\xcb\x00\x0a\x00\x18\x00\x0e\xb5\ +\x00\x16\x1f\x06\x0f!\x00?3?310\x01\x22\x06\ +\x06\x15\x1432\x1254\x17\x14\x02\x06#\x22&5\ +4\x12632\x16\x01\xfc3X:VYn\xbcb\ +\xb6y|\x88f\xb2s\x82\x88\x05'q\xd9s\x93\x01\ +\x1e\xad\x85\x89\xb1\xfe\xe6\x9e\x9e\x95\xaf\x01\x22\x92\x98\x00\ +\x02\x00F\x02J\x03\x04\x05\xbc\x00\x0a\x00\x10\x00%@\ +\x14\x0d\x07\x01\x05\x09\x05\x06\x03\x0f\x10\x1f\x10\x02\x10\x10\ +\x03\x07\x1e\x03 \x00??\x129/]\x173\x113\ +\x11310\x01#\x07#7!7\x013\x033!\ +77\x06\x07\x07\x02\xe7z'\xb7'\xfe\x90\x1a\x01\xdd\ +\xc5y{\xfe\xcf4\x22 B\xbb\x02\xfa\xb0\xb0\x89\x02\ +9\xfd\xcd\xdd\x813P\xdb\x00\x00\x01\x00s\x029\x03\ +\x1b\x05\xb6\x00\x1a\x00\x17@\x0a\x11\x00\x00\x06\x18\x15\x1e\ +\x0b\x06!\x00?3?3\x129/310\x012\ +\x16\x15\x14\x06#\x22'5\x1632654&#\ +\x22\x07'\x13!\x07!\x076\x01\xd9q\x87\xce\xab\x89\ +\x5cnsedRB:K?x\x01\xde!\xfe\xb2\ +7,\x04u\x83m\x96\xb64\x9dC`L?>\x15\ +7\x01\xa4\x99\xb5\x0d\x00\x00\x02\x00\x7f\x027\x03\x1b\x05\ +\xc5\x00\x18\x00%\x00\x1f@\x10\x18\x1f\x00\x02\x10\x02\x02\ +\x02\x02\x09\x15\x10\x1f\x19\x09!\x00?3?3\x129\ +/]3910\x01632\x16\x15\x14\x06\x06#\ +\x22&54\x12632\x17\x07&#\x22\x06\x07\x13\ +2654&#\x22\x06\x06\x15\x14\x16\x01JHx\ +etU\x9bb\x83\x8f\x89\xe7\x9cR>%8Ow\ +\x95\x1fVCX53)H/9\x04%Z}j\ +c\xa3[\x99\x92\xae\x01(\x8d\x13\x95\x14\x91{\xfe\xa2\ +kU8=%ED=J\x00\x01\x00\x93\x02J\x03\ +L\x05\xb6\x00\x06\x00\x0c\xb4\x00 \x02\x03\x1e\x00?3\ +?10\x13\x01!7!\x07\x01\x93\x01\xd1\xfes\x1f\ +\x02V\x19\xfe/\x02J\x02\xd7\x95{\xfd\x0f\x00\x03\x00\ +j\x027\x03\x14\x05\xc9\x00\x15\x00\x1f\x00+\x00\x18@\ +\x0c&\x10\x05\x16\x04\x0b \x00\x1f\x1b\x0b!\x00?3\ +?2\x11\x17910\x012\x16\x15\x14\x07\x16\x16\x15\ +\x14\x06#\x22&547&&546\x13\x06\x15\ +\x14\x1632654\x03\x22\x06\x15\x14\x16\x1766\ +54&\x02\x0ex\x8e\xc4?L\xbb\x9b\x82\x99\xe49\ +4\xa72\x9bA9:N\x1b6=0 F;1\ +\x05\xc9m`\xa2C'aKz\x93|f\xb3O'\ +[\x01E=&2%1\x0f\x15\x0d\ +}kK\x80v\x82\x03VVKpK\x01K\xb8\xff\ +\xc0@:\x0b\x0eHulOl\x01tZZ\x5cQ\ +OQ\x01\x0a\x00\x0dKl\x85Q\x00\x00Q\x85lK\ +\x0d\x06\x01\x19\x1d-\x13\x04\x0f\x0f\x12\x18\x1c,\x04\x0c\ + 48\x06\x04\x04\x04\x07!59\x04\x01\x00/\x17\ +33\x11\x173/\x1733\x11\x173\x12\x179/\ +/////\x113]\x1133\x113q\x113\ ++]\x113\x11\x173\x1133\x113\x10\xc42\xc4\ +2\xc42\x10\xc62\xc62\xc62]10\x13\x11!\ +\x15#\x15%5!\x11#5\x01\x113\x153\x15!\ +5353\x11!5!\x15!5!\x15\x015!\ +\x15\x01#\x113\x11#\x113\x015!\x15\x01#\x11\ +3\x015!\x1535!\x15\x01#\x1135#\x11\ +3\x01#\x113\x05\x14\x06#\x22&54632\ +\x16\x05\x143254#\x22%32\x16\x15\x14\x06\ +\x07\x15\x16\x16\x15\x14\x06##\x1332654&\ +##\x15\x1532654#\x01\x22'5\x163\ +25\x113\x11\x14\x06T\x01/\xc0\x05\xce\x010m\ +\xf9\x00o\xc0\x05\x0e\xc3m\xfdI\x01\x11\xfb\xe1\x01\x0e\ +\xfe\xf2\x01\x0e\x04\xb7mmmm\xfb\xc2\x01\x10\xfc0\ +oo\x02\xc0\x01\x10w\x01\x11\xfa\xa8oooo\x06\ +\xfemm\xfb\x9f\x87\x7f\x7f\x87\x87\x7f~\x88\xfes\x87\ +\x87\x87\x87\x01\xe1\xacmp.,;0m^\xcf{\ +B.$*/;J1%Z\x01^4\x1c+\x19\ +V}i\x04\xbe\x010o\xc1\xc1o\xfe\xd0\xc1\xf9\x02\ +\x01/\xc2mm\xc2\xfe\xd1mmmm\x06\xfeoo\ +\xfa\xa8\x01\x0e\x02\x02\x01\x0f\xfa;mm\x01\xa6\x01\x0e\ +\x04Joooo\xfc/\x01\x10y\x01\x0f\xfdh\x01\ +\x10I\x91\x9c\x9c\x91\x92\x9b\x9a\x93\xc5\xc5\xc4aCS\ +1D\x08\x04\x0dD8QY\x01b\x22 \x22\x1d\xe3\ +\x9a+%J\xfe\xfa\x0af\x08V\x01\x92\xfer_c\ +\x00\x00\x03\x00T\xfe\xc1\x07\xaa\x06\x14\x00\x03\x00\x1e\x00\ +*\x00\x1d@\x0d(\x1e\x14\x0e\x1e\x22\x0e\x0e\x22\x1e\x03\ +\x02\x00\x00//\x179///\x113\x11310\ +\x09\x03\x0554676654&#\x22\x06\x07\ +\x17632\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\x16\ +32654&#\x22\x06\x03\xfe\x03\xac\xfcT\xfc\ +V\x03\xeb,AgI\xbb\xa5O\xbaGR\xa0Z?\ +>1HT;\x1bGFBIHCHE\x06\x14\ +\xfcV\xfcW\x03\xa9\xfb/2A1R~X\x87\x9a\ +8*\xb2P:/5K6DpJ;\xfe\xed?\ +HI>@IH\x00\xff\xff\xfe\xfc\xfe\x14\x03E\x06\ +!\x02&\x027\x00\x00\x01\x07\x01L\xfe\xd8\x00\x00\x00\ +\x0a\xb4\x01\x18\x18\x11&\x00+\x115\xff\xff\x00s\x03\ +\xc1\x02/\x05\xb6\x02\x06\x02\x07\x00\x00\x00\x02\x00R\xff\ +\xec\x059\x06)\x00.\x009\x00@@#,2\x00\ +!!2HY\x14\x0eGY\x00\x14\x01\x12\x03!\x14\ +!\x14\x04''7GY'\x01\x04\x1eGY\x04\x16\ +\x00?+\x00\x18?+\x11\x12\x0099\x18//_\ +^]++\x11\x003\x11310\x01\x02\x02\x04#\ +\x22&54>\x0254#\x22\x06\x077632\ +\x16\x15\x14\x0e\x02\x15\x1432\x12\x13&$546\ +32\x12\x15\x14\x073\x07\x01\x14\x16\x17654&\ +#\x22\x06\x04\x8d*\xbb\xfe\xf4\xaa\xa5\xba\x1a\x1e\x1a7\ +\x146\x12\x04a[Xc\x1b \x1b\x8f\x8f\xd2;\xf9\ +\xfe\xed\xdc\xb3\xbc\xc9\x04\x93'\xfdk\x9a\xa1\x06UN\ +KS\x03%\xfe\xf5\xfe\x88\xb6\x98\x840]WQ#\ +:\x10\x0b\xae'^R7d]Y,\x81\x01E\x01\ +8\x07\xcd\xb3\xae\xd1\xfe\xf9\xf36\x22\xb2\x01\x8dlm\ +\x02(C\x97\x9ag\x00\x00\x01\x00\xba\x00\x00\x05\x12\x05\ +\xc3\x00\x12\x00\x1f@\x0f\x0d\x10\x00\x00\x0f\x11\x03\x0f\x12\ +\x04\x09KY\x04\x04\x00?+\x00\x18??\x129\x11\ +3310\x016\x12632\x17\x07&#\x22\x06\ +\x02\x03\x03#\x13\x033\x02Dw\xd5\x9bbH=-\ +(\x151d\xe0\xa4r\xeew\xec\xf0\x03\x19\xe1\x01Q\ +x\x17\xb6\x0ah\xfe\xa0\xfe\xe3\xfd\xe5\x02)\x03\x8d\x00\ +\x02\x00d\xff\xec\x07\x19\x04R\x00\x16\x00+\x00-@\ +\x16\x14\x09##\x00\x09\x0c\x1a\x07\x09\x07GY\x09\x0f\ +\x00\x1fGY\x12\x00\x16\x00?2+\x00\x18?+\x11\ +\x0033\x11\x129\x18/\x11910\x05\x22&5\ +4\x127!77!\x07#\x16\x15\x14\x02\x06#\x22\ +'\x06\x06\x014'!\x02\x15\x14\x1632677\ +3\x07\x06\x15\x1432\x12\x01\xf0\x98\xa6a^\xfe\xf3\ +\x15\xc4\x05\xdc'\xf0\x17\x83\xdf\x90\xce26\x94\x02\xd8\ +\x0e\xfd)\xb6?>Lb\x1c#\xdf\x1e\x13sx\x98\ +\x14\xc2\xb6\x84\x01(\x88jP\xbad~\xc3\xfe\xac\xb3\ +\xc2[g\x02\xf3^[\xfe\xcc\xfc\x5cd\x83\x81\xa0\x92\ +L9\x8d\x01I\xff\xff\x00D\x00\x00\x06\xe5\x07u\x02\ +&\x000\x00\x00\x01\x07\x00v\x01\xbe\x01T\x00\x0a\xb4\ +\x01\x1c\x1c\x05&\x00+\x115\xff\xff\x00/\x00\x00\x06\ +\xae\x06!\x02&\x00P\x00\x00\x01\x07\x00v\x01\xb2\x00\ +\x00\x00\x0a\xb4\x01//\x11&\x00+\x115\xff\xff\xff\ +\x87\xfd\xc1\x04N\x05\xb8\x02&\x00$\x00\x00\x00\x07\x02\ +[\x01;\x00\x00\xff\xff\x00^\xfd\xc1\x04\x7f\x04f\x02\ +&\x00D\x00\x00\x00\x07\x02[\x017\x00\x00\xff\xff\xff\ +2\xff\xec\x05\xfc\x05\xcd\x00&\x002o\x00\x00\x07\x02\ +\x5c\xfee\x00\x00\x00\x02\xff\xaa\xfd\xc1\x01\x83\xff\x83\x00\ +\x0b\x00\x17\x00\x13@\x09\x15\x03\x0f\x0f\x09\x1f\x09\x02\x09\ +\x00/q3\xcc210\x01\x14\x06#\x22&54\ +632\x16\x074&#\x22\x06\x15\x14\x16326\ +\x01\x83\x81ol}\x7fjh\x88\x87:/.<6\ +4/:\xfe\xa4d\x7fzggzzg177\ +1299\x00\x00\x02\x00\xcd\x04b\x03V\x05\xc7\x00\ +\x07\x00\x18\x00\x0f\xb5\x16\x07\xc0\x0a\x02\x03\x00?\xc6\x1a\ +\xdc\xc410\x01673\x15\x06\x07#%4%\x07\ +\x06\x06\x15\x14\x1e\x02\x15\x14\x06#\x22&\x01\xe3U?\ +\xdft\x90o\xfe\xea\x01%\x09BG\x18\x1c\x1871\ +5B\x04\x85\x9d\x94\x18\xa0\x94i\xba:P\x13,\x1f\ +\x0f\x12\x12\x19\x17%/;\x00\x00\x03\xff\x1f\xfe\x14\x07\ +\xac\x06\x1f\x009\x00=\x00I\x00K@'G@A\ +A\x18\x0f<\x0f;\x15\x08)6\x186HY\x0b&\ +\x18\x0f2\x05\x00\x05FY-\x00\x1b\x22\x14\x0f\x14F\ +Y\x1d\x0f\x00\x00?3+\x11\x003\x18?3+\x11\ +\x003\x18?33+\x11\x0033\x18??\x11\x12\ +9/\x1a\xcd10\x03\x22'5\x16327\x13#\ +?\x026632\x17\x07&#\x22\x06\x07\x07!7\ +6632\x17\x07&#\x22\x06\x07\x073\x07#\x03\ +\x06\x06#\x22'5\x16327\x13!\x03\x06\x06\x01\ +#\x133\x034632\x16\x15\x14\x06#\x22&L\ +Z;@2\x85,\xd9\xb3\x15\xc2\x15,\xb5\xa6s`\ +=J>ES\x16\x12\x01\xb6\x17,\xb2\xa7u`>\ +J=GQ\x16\x12\xe5'\xe3\xdf+\xb5\x91_6<\ +6\x88(\xd7\xfeJ\xdf(\xb6\x06*\xea\xec\xe9\xbaN\ +E6AOB3F\xfe\x14\x17\xbe\x14\xcd\x03\xfej\ +L\x5c\xc6\xa7+\xb0\x1cVbV`\xc5\xa8+\xb0\x1c\ +VbV\xb2\xfb\xe3\xc0\xaf\x17\xbe\x14\xcd\x03\xfe\xfb\xe3\ +\xbd\xb2\x01\xec\x04R\x01\x10DT56GR4\x00\ +\x02\xff\x1f\xfe\x14\x07\xba\x06\x1f\x009\x00=\x00?@\ +!<\x00;\x15\x22\x14\x0f\x14FY\x1d\x0f\x00\x09)\ +6\x186HY\x0b&\x18\x0f2\x05\x00\x05FY-\ +\x00\x1b\x00?2+\x11\x003\x18?33+\x11\x00\ +33\x18?3+\x11\x003\x18??10\x03\x22\ +'5\x16327\x13#?\x026632\x17\x07\ +&#\x22\x06\x07\x07!76632\x17\x07&#\ +\x22\x06\x07\x073\x07#\x03\x06\x06#\x22'5\x163\ +27\x13!\x03\x06\x06\x01#\x013LZ;@2\ +\x85,\xd9\xb3\x15\xc2\x15,\xb5\xa6s`=J>E\ +S\x16\x12\x01\xb6\x17,\xb2\xa7u`>J=GQ\ +\x16\x12\xe5'\xe3\xdf+\xb5\x91_6<6\x88(\xd7\ +\xfeJ\xdf(\xb6\x06*\xec\x01L\xe9\xfe\x14\x17\xbe\x14\ +\xcd\x03\xfejL\x5c\xc6\xa7+\xb0\x1cVbV`\xc5\ +\xa8+\xb0\x1cVbV\xb2\xfb\xe3\xc0\xaf\x17\xbe\x14\xcd\ +\x03\xfe\xfb\xe3\xbd\xb2\x01\xec\x06\x14\x00\x00\x02\x00\x87\xff\ +\xec\x06\xd5\x06\x14\x00\x16\x00$\x00\x22@\x11\x15\x0d\x04\ +\x0b\x0b\x17LY\x10\x0b\x04\x04\x1eLY\x04\x13\x00?\ ++\x00\x18?\xc6+\x11\x12\x009910\x01\x10\x02\ +\x04# \x00\x11\x10\x12$3 \x176673\x17\ +\x06\x06\x07\x16%\x22\x06\x02\x15\x14\x16326\x125\ +4&\x05\x8d\xbe\xfe\xb3\xdc\xfe\xfd\xfe\xe4\xc5\x01V\xd9\ +\x01.\x8aHM\x0f\xf6\x08)\xb1\x8e \xfd\xdb\x8a\xe0\ +\x7f\xa3\x92\x8a\xdd{\x9e\x03\x9a\xfe\xe9\xfeL\xe3\x01+\ +\x01\x08\x01\x0b\x01\xb9\xea\xd5%\x8dj\x18\x98\xbb8f\ +\xf5\xc0\xfe\xab\xca\xad\xbc\xbf\x01S\xce\xaa\xbe\x00\x02\x00\ +^\xff\xee\x05\x8f\x04\xfa\x00\x16\x00$\x00\x22@\x11\x0a\ +\x02\x10\x00\x10!FY\x10\x16\x00\x1aFY\x05\x00\x10\ +\x00?\xc6+\x00\x18?+\x11\x12\x009910\x01\ +2\x176673\x17\x06\x06\x07\x16\x15\x14\x02\x06#\ +\x22&54\x12$\x014&#\x22\x06\x06\x15\x14\x16\ +3266\x02\x98\xdbnGX\x18\xef\x08(\xab\x9d\ +\x18\x92\xff\xa6\xc0\xe2\x8f\x01\x02\x01[b[]\x93Q\ +caZ\x90P\x04d\x91\x1c\x88\x83\x17\x9d\xb99G\ +Y\xca\xfe\xb5\xb1\xe5\xc5\xc7\x01L\xb9\xfeZky\x8f\ +\xf5\x8bov\x88\xf5\x00\x00\x01\x00\x98\xff\xec\x07#\x06\ +\x14\x00\x1d\x00 @\x0f\x04\x13\x09\x01\x01\x0d\x1d\x13\x03\ +\x0d\x19LY\x0d\x13\x00?+\x00\x18?3\x129/\ +3\x10\xc610\x01\x076673\x17\x06\x06\x07\x03\ +\x02\x00#\x22&547\x133\x03\x06\x15\x1432\ +67\x13\x05\x8b)T\x5c\x13\xf4\x0a/\xf8\xba\x819\ +\xfe\xd1\xf9\xda\xee\x14\xc1\xed\xc0\x15\xf0\x93\xaa%\xc7\x05\ +\xb6\xc0\x17\x8c{\x18\xb0\xd9\x17\xfd\x9e\xfe\xf3\xfe\xff\xd8\ +\xc5H`\x03\x85\xfcuZ9\xe0\xa7\xaf\x03\xa8\x00\x00\ +\x01\x00m\xff\xec\x06/\x04\xfa\x00 \x00.@\x17\x0e\ + \x17\x1a \x0b\x13JY\x0b\x0b\x15\x09 \x0f\x15\x15\ +\x1a\x05FY\x1a\x16\x00?+\x00\x18??3\x129\ +/+\x11\x12\x009\x18\x10\xc610\x01\x03\x06\x15\x14\ +3267\x133\x076673\x17\x06\x06\x07\x03\ +#7#\x06\x06#\x22&547\x13\x01\xfa\x90\x10\ +\x7fp\xc5-c\xe9\x18P_\x15\xf4\x08,\xf8\xbd\xb0\ +\xb9\x15\x08R\xb2g\x86\x94\x1a\x87\x04R\xfd^L1\ +\x89\xff\xd4\x01\xd5w\x13\x88\x84\x19\xae\xd8\x19\xfc\xbe\xcd\ +tm\x99\x8fB}\x02\x7f\x00\xff\xff\xfd\x0e\x04\xd9\xfe\ +\x87\x06!\x00\x07\x00C\xfa\xf1\x00\x00\xff\xff\xfd\xcc\x04\ +\xd9\xff\xb5\x06!\x00\x07\x00v\xfb\xd0\x00\x00\xff\xff\xfc\ +\x9b\x04\xd7\xff\xad\x05\xf6\x00\x07\x01R\xfbU\x00\x00\x00\ +\x01\xfd\xb0\x04\xbc\xff3\x06\x98\x00\x11\x00\x0a\xb2\x0a\x0f\ +\x04\x00/\xcc210\x03\x14\x07\x07#7665\ +4#\x22\x075632\x16\xcd\xcb\x16\x91\x12[K\ +Z)F=Uq\x80\x05\xec\xa05[\xa6\x106+\ +=\x0e\x83\x13Y\x00\x01\xfc\x87\xfey\xfd\x91\xff}\x00\ +\x0b\x00\x08\xb1\x09\x03\x00/310\x014632\ +\x16\x15\x14\x06#\x22&\xfc\x87NF6@OB3\ +F\xfe\xe5DT56GR4\x00\xff\xff\x00F\x00\ +\x00\x04\x83\x07s\x02&\x00(\x00\x00\x01\x07\x00C\xff\ +\xf1\x01R\x00\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\ +\xff\x00F\x00\x00\x05\xd9\x07s\x02&\x01\xb2\x00\x00\x01\ +\x07\x00C\x00}\x01R\x00\x0a\xb4\x01\x11\x11\x05&\x00\ ++\x115\xff\xff\x00^\xff\xec\x03\xfa\x06!\x02&\x00\ +H\x00\x00\x01\x07\x00C\xffn\x00\x00\x00\x0a\xb4\x02%\ +%\x11&\x00+\x115\xff\xff\x00o\xff\xec\x04\x87\x06\ +!\x02&\x00X\x00\x00\x01\x06\x00C\x9b\x00\x00\x0a\xb4\ +\x01\x1b\x1b\x11&\x00+\x115\x00\x01\x00\x8b\xff\xec\x07\ +\xa8\x05\xc9\x008\x001@\x18\x10\x1a++\x13\x1a\x00\ + \x1a LY\x06\x1a\x042'\x13'LY\x0e\x13\ +\x13\x00?3+\x11\x003\x18?3+\x11\x003\x11\ +\x129\x18/\x11910\x01\x22\x06\x07'632\ +\x16\x15\x14\x02\x02\x06#\x22'\x06\x06#\x22\x025\x10\ +\x12$32\x17\x07&&#\x22\x06\x02\x15\x14\x163\ +26773\x07\x06\x15\x14\x16326\x1254\ +&\x05\xf65[5X\x93\xad\xc0\xcfm\xc1\xf4\x9d\xec\ +Y>\xaax\xd2\xe7\xb5\x01\x1e\xc1\xb0um)X7\ +p\xb8vpsgu\x1c5\xee)\x12QP\x7f\xc7\ +\x87a\x05\x00* \xb2a\xf5\xe8\xc4\xfew\xfe\xd8\x8b\ +\xb4`T\x01\x11\xfd\x01\x0c\x01\xd6\xeda\xb0\x1d+\xcc\ +\xfe\x8e\xc2\x9c\xac\x83{\xf6\xcbV5JT\xc6\x01\x99\ +\xd0\x8d\x8c\x00\x01\x00f\x00\x00\x06J\x04R\x00\x16\x00\ +\x1c@\x0d\x0b\x06\x07\x14\x15\x0e\x08\x01\x0f\x13\x15\x00\x15\ +\x00???339\x11322103\x033\ +\x13\x16\x17\x17\x01\x033\x13\x176\x12\x133\x02\x00\x07\ +#\x03#\x03\xee\x88\xea?\x0c\x04\x03\x01)-\xe56\ +\x10\x90\xb9J\xeeF\xfe\xe5\xe9\xe7-\x05\xf3\x04R\xfd\ +\x8fhdJ\x01\xef\x01\x98\xfdf\xe3\xa0\x01\x8d\x01P\ +\xfe\x97\xfd\xee\xd7\x01\xa6\xfeZ\x00\x02\x00\x87\x00\x00\x04\ +\x8b\x06\x14\x00\x12\x00\x1b\x00/@\x18\x0e\x06\x07\x06K\ +Y\x0b\x07\x0f\x1bLY\x07\x0f\x07\x0f\x09\x04\x04\x13L\ +Y\x04\x12\x00?+\x00\x18\x10\xc499//+\x11\ +\x003+\x11\x00310\x01\x14\x04!!\x13!7\ +!73\x07!\x07!\x0732\x16\x013265\ +4&##\x04\x8b\xfe\xbd\xfe\xd1\xfe\x95\xee\xfe\xeb+\ +\x01\x133\xef5\x01L)\xfe\xb45h\xe2\xed\xfd:\ +l\xb1\xb6uy\x81\x01\xe5\xeb\xfa\x04b\xc1\xf1\xf1\xc1\ +\xfe\xc2\xfe'\x8f\x83c\x5c\x00\x00\x02\x00L\xff\xec\x04\ +%\x05'\x00\x18\x00$\x008@\x1c\x02\x0b\x04\x15\x13\ +\x04\x19HY\x04\x04\x0b\x13\x01\x12\x13\x12GY\x17\x13\ +\x0f\x0b\x1fHY\x0b\x16\x00?+\x00\x18?3+\x11\ +\x003\x11\x129\x18/+\x00\x18\x10\xc6\x11\x1291\ +0\x01!\x03632\x16\x15\x14\x06\x06#\x22&5\ +47\x13#7373\x07!\x03\x22\x07\x06\x15\x14\ +32654&\x03=\xfe\xe2>my\xa7\xb7v\ +\xde\x96\xc3\xba\x19\x5c\xe7'\xe9-\xea-\x01\x1e\xe1Z\ +k\x16\xb0jyX\x03\x98\xfe\xe7\x19\x9b\x8es\xb1_\ +\xaa\x97Mo\x01\xaf\xba\xd5\xd5\xfd\x95\x14h2\x9df\ +VGH\x00\x01\x00F\xff\xec\x07V\x05\xcb\x00%\x00\ +1@\x1a\x06\x18\x1d\x18LY\x03\x1d\x1d\x1a\x1b\x03\x1a\ +\x12!\x00LY!\x04\x12\x0bLY\x12\x13\x00?+\ +\x00\x18?+\x00\x18??\x129/3+\x11\x003\ +10\x01\x22\x04\x07!\x07!\x06\x15\x14\x16326\ +7\x15\x06\x06#\x22\x00\x1147!\x03#\x013\x03\ +!\x12\x00!2\x17\x07&\x05\xcf\xab\xfe\xfc;\x02@\ +)\xfd\xbe\x08\xa6\x96U\xa3^^\xb3j\xf7\xfe\xea\x07\ +\xfe\xfb\x8b\xed\x015\xed\x7f\x01\x00S\x01\x86\x01\x0d\xd7\ +\xb0`\x96\x04\xfe\xdf\xbf\xca.G\xac\xbd%\x1f\xcd$\ +\x1f\x01$\x01\x0d@6\xfdm\x05\xb6\xfd\xaa\x01%\x01\ +F\x5c\xc3R\x00\x00\x01\x00/\xff\xec\x05\xd1\x04f\x00\ +$\x001@\x1a\x1a\x05\x0a\x05GY\x17\x0a\x0a\x07\x08\ +\x0f\x07\x15\x0e\x14FY\x0e\x10\x00\x1fFY\x00\x16\x00\ +?+\x00\x18?+\x00\x18??\x129/3+\x11\ +\x00310\x05\x22&57#\x03#\x133\x033\ +6$32\x17\x07&&#\x22\x06\x07!\x07!\x06\ +\x15\x14\x163267\x15\x06\x03\xfc\xc4\xd6\x04\xe5f\ +\xec\xee\xe9^\xdf@\x01\x1c\xc3\xa2\x89F0kBg\ +\xa2,\x01\x9e'\xfeb\x04qd:}U\x8c\x14\xd4\ +\xc7V\xfe#\x04R\xfeD\xdc\xf4=\xb8\x14!\x8f\x81\ +\xbb\x1f+mz!+\xc3G\x00\x02\xff\x87\x00\x00\x04\ +\xa8\x05\xb8\x00\x0b\x00\x13\x00%@\x12\x10\x05\x06\x0b\x03\ +\x13\x03KY\x13\x13\x05\x06\x03\x09\x01\x05\x12\x00?3\ +3?\x129/+\x11\x003\x11\x12910!#\ +\x13#\x01#\x01!\x13#\x03#7'&&'\x06\ +\x06\x07\x02\x91\xdb\x8eV\xfe\x93\xfa\x03B\x01\x02\xdd\xe3\ +XT9\x10\x08\x12\x01\x19\x027\x037!\x07\ +\x01\x1e\x02\x17\x13#\x03&&##\x03#\x13#\x22\ +\x06\x07\x03\x01\x01!T\xe5=o\x90f\xef\x1c\x04\x5c\ +\x1c\xfe9[q:\x08\x1d\xeb\x19\x07DK\x0e\x89\xf0\ +\x8c\x0bUi7\xcd\x02f\x01T\xfd\xf2\x01\xec\x81\x86\ +L\x0b\x01\xe1\x8b\x8d\xfe\x1b\x0eW\x95\x87\xfe=\x01\xc7\ +y^\xfdb\x02\x9e]z\xfe9\x03f\x01\x83\x00\x00\ +\x02\xff\x96\x00\x00\x04\xb2\x04R\x00\x1a\x00\x1d\x00*@\ +\x15\x13\x16\x04\x16JY\x1b\x09\x04\x04\x06\x15\x0f\x00\x15\ +\x06\x1dHY\x06\x0f\x00?+\x00\x18?33\x129\ +/33+\x11\x00310#\x13667\x037\ +!\x07\x01\x1e\x02\x17\x13#\x03&&'\x03#\x13\x22\ +\x06\x07\x03\x01\x13!j\xbcI\x9ey\xd3\x15\x03\xbe\x16\ +\xfe\x95EV0\x0e+\xd3#\x09\xfe\xba\x8b\xed\x015\xed\x7f\x02\ +F\xe5\x1c\x04]\x1d\xfe7^p8\x12\x13\xe9\x17\x09\ +\x90\x0d\x8b\xf0\x8e\x0dQf:\xcf\x02d\x01T\xfd\xf2\ +\x01\xc7\x8aB\xfdm\x05\xb6\xfd\xaa\x01\xcb\x8b\x8d\xfe\x1b\ +\x13U\x95\xfe\xea\xfe\xcf\x01\xc7\xd7\xfdb\x02\x9eV}\ +\xfe5\x03f\x01\x83\x00\x00\x02\x00/\x00\x00\x06\x81\x04\ +R\x00 \x00#\x003@\x1b\x1c\x19\x04\x09\x04GY\ +\x0f!\x09\x09\x06\x0c\x07\x0f\x15\x1b\x00\x03\x06\x15\x0c#\ +HY\x0c\x0f\x00?+\x00\x18?\x173?\x11\x129\ +/33+\x11\x003310!\x1367!\x03\ +#\x133\x03!\x037!\x07\x01\x1e\x02\x17\x13#\x03\ +&&'\x03#\x13\x22\x06\x07\x03\x01\x13!\x01d\xb5\ +/1\xfe\xfag\xdd\xec\xdd^\x01\xdf\xcb\x15\x03\xbe\x14\ +\xfe\x93EX1\x0d+\xd3#\x09=Cf\xd3jE\ +V-\xaa\x01\xf5\xfa\xfes\x01\x5cZ'\xfe#\x04R\ +\xfeD\x01Sii\xfe\x9a\x12Htk\xfe\xb6\x01D\ +WM\x04\xfe\x14\x01\xec?[\xfe\xae\x02\x96\x01\x0c\x00\ +\x01\xff\xb4\xfeD\x04j\x06\xdd\x00H\x00M@(:\ +4C8\x0f>\x1f>\x02\x09\x03>4\x0a \x1a\ +\x03'(('KY((\x1aF44/KY\ +4\x04\x1a\x0fKY\x1a\x00/+\x00\x18?+\x11\x00\ +3\x129\x18/+\x11\x12\x009\x119\x113\x18\x10\ +\xd4_^]\xc43\x12910\x01\x14\x06\x07\x15\x16\ +\x16\x15\x14\x04\x05\x06\x06\x15\x14327632\x17\ +\x15&#\x07\x07\x22&546%6654&\ +##732654&#\x22\x07'67&\ +'53\x16\x17>\x0232\x17\x15&#\x22\x06\x07\ +\x16\x16\x04j\xd0\xb9\x88\x9f\xfe\xe2\xfe\xc6\xa2l}D\ +__CkCAs\xb3\xbb\x95\xa7\xcf\x01\x0e\xd9\xa8\ +\xa7\x9a\xb2)\xa4\xbe\xcbnc\xad\xb8Z\xb8\xb9&o\ +\x8fj-NSS12((\x1b\x22KR}\x89\ +\x04\x7f\xa0\xce\x19\x04\x12\xa7\x87\xcb\xe3\x1f\x1114N\ +\x05\x05#\xc6&\x04\x04\x89q\x9a\x98\x22\x1d\x80vq\ +b\xbe\x86zZZy\xa6v\x18J\xa7\x19t>Y\ +E$\x0e\x83\x08:`\x1e\xa9\x00\x01\xff\xa2\xfeV\x03\ +\xd5\x05Z\x00E\x00I@'(= DEED\ +HY=EE7\x0a7-GY7\x22\x10\x0a\x0d\ +\x18\x13@\x09\x0cH\x13\x0a\x1b\x0a\x0a\x05HY\x0a\x10\ +\x00?+\x11\x003\x18\x10\xd4+2\xc4\x119?+\ +\x11\x12\x009\x18/9+\x11\x12\x009\x11310\ +\x012654#\x22\x07'67&'53\x16\ +\x176632\x17\x15&#\x22\x06\x07\x16\x15\x14\x06\ +\x07\x15\x16\x16\x15\x14\x06\x06\x07\x06\x06\x15\x14326\ +32\x17\x15&#\x07\x07\x22&5467>\x02\ +54##7\x01\xb2\x95z\xa4~\xa9@\x8fq(\ +]\x90MHdzC1-\x1e&$L:\xc5\x87\ +}]_m\xd0\xdb\x83V}N\x93Ho9Ce\ +\xa1\xab\x8d\x9e\xba\xe1\x8by<\xc1\xa1$\x02\x98PQ\ +uJ\xae;\x0fM\x84\x1bR^vL\x10\x83\x0a8\ +G8\xbel\x91\x1b\x07\x18vSo\x91X\x1d\x121\ ++L\x0a'\xba'\x04\x04\x81r\x83\x93 \x14-I\ +:\x83\xb3\xff\xff\x00\xbc\x00\x00\x06\x8b\x05\xb6\x02\x06\x01\ +u\x00\x00\xff\xff\x00\x83\xfe\x14\x05\xc1\x06\x12\x02\x06\x01\ +\x95\x00\x00\x00\x03\x00\x87\xff\xec\x05\x8d\x05\xcd\x00\x0d\x00\ +\x16\x00\x1f\x00&@\x14\x1a\x12LY\x1a\x1a\x04\x0b\x0b\ +\x17LY\x0b\x04\x04\x0eLY\x04\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+10\x01\x10\x02\x04#\ + \x00\x11\x10\x12$32\x00\x01267!\x06\x15\ +\x14\x16\x01\x22\x06\x07!654&\x05\x8d\xbe\xfe\xb3\ +\xdc\xfe\xfd\xfe\xe4\xc5\x01V\xd9\xfb\x01\x17\xfd'\x9b\xf3\ +5\xfd\x0c\x06\xa4\x01G\x98\xf08\x02\xeb\x05\xa1\x03\x9a\ +\xfe\xe9\xfeL\xe3\x01+\x01\x08\x01\x0b\x01\xb9\xea\xfe\xd6\ +\xfc\x15\xf3\xda,8\xab\xbe\x04H\xe5\xcb#%\xa9\xbf\ +\x00\x00\x03\x00^\xff\xee\x047\x04d\x00\x0d\x00\x16\x00\ +\x1e\x00&@\x14\x1a\x12HY\x1a\x1a\x04\x0b\x0b\x17F\ +Y\x0b\x10\x04\x0eGY\x04\x16\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+10\x01\x14\x02\x06#\x22&\ +54\x12$32\x16\x01267!\x06\x15\x14\x16\ +\x13\x22\x06\x07!54&\x047\x94\xfe\xa3\xc0\xe4\x8f\ +\x01\x02\xa9\xc1\xde\xfd\xd9b\x9c#\xfe\x1b\x04g\xdeb\ +\x98&\x01\xdfa\x02\xbc\xcc\xfe\xae\xb0\xe6\xc4\xc7\x01L\ +\xb9\xe3\xfd)\xa3\x8c\x1b-ox\x02\xfc\x99\x823q\ +w\x00\x01\x00\xba\x00\x00\x05\x91\x05\xc3\x00\x17\x00\x19@\ +\x0c\x17\x11\x12\x03\x11\x12\x07\x0cKY\x07\x04\x00?+\ +\x00\x18??\x12910%67\x13>\x0232\ +\x17\x15&#\x22\x06\x07\x01!\x033\x13\x16\x15\x07\x01\ +\xfc3J\xf4bi|VBE/3=\x5c@\xfd\ +\xf8\xfe\xfc\x90\xe8J\x0b\x01\xfa\x96\x9d\x02\x04\xcb\x88?\ +\x17\xc0\x12f\x7f\xfb\xe7\x05\xb6\xfc\x83\x9a_F\x00\x00\ +\x01\x00b\x00\x00\x04b\x04Z\x00\x16\x00\x19@\x0c\x04\ +\x16\x00\x0f\x16\x15\x0c\x11GY\x0c\x0f\x00?+\x00\x18\ +??\x12910\x133\x13\x16\x17367\x13>\ +\x0232\x17\x15&#\x22\x06\x07\x01!b\xea7\x09\ +\x05\x071I\x94?\x5coJ>*$#0=\x1d\ +\xfek\xfe\xeb\x04R\xfd\xb6n\xc3\x8b\x98\x015\x83r\ +6\x12\xb2\x0cD;\xfc\xdd\x00\xff\xff\x00\xba\x00\x00\x05\ +\x91\x07s\x02&\x02\x80\x00\x00\x01\x07\x03v\x05\x0e\x01\ +R\x00\x0c\xb5\x02\x01\x22\x22\x05&\x00+\x1155\xff\ +\xff\x00b\x00\x00\x04b\x06!\x02&\x02\x81\x00\x00\x01\ +\x07\x03v\x04d\x00\x00\x00\x0c\xb5\x02\x01!!\x11&\ +\x00+\x1155\xff\xff\x00\x87\xfe\x14\x0a\x19\x05\xcd\x00\ +&\x002\x00\x00\x00\x07\x00\x5c\x05\xc7\x00\x00\xff\xff\x00\ +^\xfe\x14\x08\xa8\x04d\x00&\x00R\x00\x00\x00\x07\x00\ +\x5c\x04V\x00\x00\x00\x02\x00\x87\xff\x83\x05\xbc\x061\x00\ +\x19\x00-\x00,@\x16\x1d\x1a,\x04\x07\x0a\x0a,L\ +Y\x22$&\x11&LY\x0a\x17\x14\x11\x04\x00?3\ +3/+\x11\x0033+\x11\x0033\x11331\ +0\x01\x14\x02\x04\x07\x06\x06#\x22&'&\x0254\ +\x12$76632\x16\x17\x16\x12\x012\x16\x176\ +\x12\x11\x10'\x06#\x22'\x06\x02\x15\x14\x16\x176\x05\ +\xbc\x9d\xfe\xd8\xc8\x11E;/LE!fy\x02\xa0\xfe\xf3\xfe\x91,52\ +90\x1e\xe9\xb3\xab\x01\x22\xbf\x1a0*1+\x22\xe8\ +\xa6Qz\x1a(!E.\xfe\xfc\xa9]{\x15A=\ +*\x01\x02\x00\x03\x00\x8b\xff\xec\x07\xa8\x08`\x00\x12\x00\ +#\x00T\x00W@\x173LL6=$C=C\ +LY\x12\x02\x02!\x00\x0a\x10\x0a\x02\x09\x03\x0a\xb8\xff\ +\xc0@\x15\x11\x14H\x0a\x16\x0a\x16\x07\x0d*=\x04N\ +I6ILY16\x13\x00?3+\x11\x003\x18\ +?3\xc4299//+_^]93/3\ ++\x11\x003\x11\x129\x18/310\x01\x07#\x22\ +.\x02#\x22\x07#6632\x1e\x023\x01\x14\x06\ +\x077654&'&&5432\x16\x13\x22\ +\x06\x07'632\x16\x15\x10\x02\x04#\x22'\x06\x06\ +#\x22\x025\x10\x12$32\x17\x07&&#\x22\x06\ +\x02\x15\x103267\x16326\x1254&\x06\ +{!!Lwf[0\x5c\x1b\xa1\x14\x97u=q\ +osA\xfe\xec\x8d\x92\x08}\x14\x11&\x15l?O\ +\xac5[5X\x93\xad\xc0\xcf\xc0\xfe\xce\xd7\xc8\x81W\ +\xa3_\xd0\xe2\xac\x01%\xc3\xb0um)X7s\xb7\ +t\xe5V\xb2Ht\xb1\x8d\xce|a\x07\xe9\x9d#*\ +#p\x8b\x89%-%\xfe\xfa^~\x15T#=\x11\ +\x10\x08\x11 \x17QG\xfd\xdf* \xb2a\xf5\xe8\xfe\ +\xec\xfe\x0f\xfbxB6\x01\x14\xfa\x01\x0a\x01\xd1\xf4a\ +\xb0\x1d+\xce\xfe\x90\xc2\xfe\xb8]S\xb0\xe1\x01\x8c\xc2\ +\x8d\x8c\x00\x00\x03\x00^\xff\xec\x06\x02\x07)\x00)\x00\ +<\x00N\x00o\xb9\x00@\xff\xc0@=\x0c\x10H<\ +,IY<7@@\x0b471IY\xaf7\xbf\ +7\x027@\x09\x0cH7L4\x0b\x02\x0f\x17\x1f\x17\ +\x02\x09\x03\x17\x17\x04\x0b\x1e\x10\x0b\x10GY#\x0b\x10\ +\x19\x15\x04\x15GY\x00\x04\x16\x00?3+\x11\x003\ +\x18?3+\x11\x003\x11\x129\x18/_^]3\ +\x10\xd6\xd4\xc4+]+\x11\x12\x009\x18/\x10\xc4+\ +\x00+10\x05\x22'\x06#\x22&54\x1263\ +2\x17\x07&#\x22\x02\x15\x14327\x1632\x12\ +54#\x22\x07'632\x16\x15\x14\x02\x06\x13\x07\ +#\x22.\x02#\x22\x07#6632\x1e\x023\x01\ +\x14\x06\x077654&'&&54632\ +\x16\x03\xe1\x9ahy\x8f\xb5\xc4\x89\xe8\x99zfLE\ +F}\xa8\xb6q\x83^\x7f\x90\xb1\x85BY3x\x83\ +\x9f\xa7\x8a\xf4\xf9!!Lwf[0\x5c\x1b\xa1\x14\ +\x97u>qorA\xfe\xf0\x8c\x93\x08}\x14\x11\x17\ +$85?N\x14SS\xdb\xcf\xcd\x01X\xab=\xac\ +-\xfe\xd0\xe0\xf2oo\x019\xf8\xd1+\xaa=\xc9\xc4\ +\xe1\xfe\xa3\xaf\x06\xc8\x9d\x22*\x22q\x8c\x89%+%\ +\xfe\xf8]\x7f\x16T$?\x11\x10\x08\x0a\x1b (,\ +I\x00\x02\x00\x8b\xff\xec\x07\xa8\x07\x1f\x00\x0d\x00F\x00\ +E@\x22\x05\x01\x0c\x0d\x09@\x1e!\x07\x03\x0b(9\ +9!(\x0e.(.LY\x14(\x04@5!5\ +LY\x1c!\x13\x00?3+\x11\x003\x18?3+\ +\x11\x003\x11\x129\x18/\x10\xd622\x129\x1a\xdd\ +\xcd99310\x01\x07\x07#'#\x07#'#\ +\x07#'7\x01\x22\x06\x07'632\x16\x15\x14\x02\ +\x02\x06#\x22'\x06\x06#\x22\x025\x10\x12$32\ +\x17\x07&&#\x22\x06\x02\x15\x14\x1632677\ +3\x07\x06\x15\x14\x16326\x1254&\x06s\x0d\ +t1\x1b\xa2F1\x1a\xa2F1+\x0c\x02\xbb5[\ +5X\x93\xad\xc0\xcfm\xc1\xf4\x9d\xecY>\xaax\xd2\ +\xe7\xb5\x01\x1e\xc1\xb0um)X7p\xb8vps\ +gu\x1c5\xee)\x12QP\x7f\xc7\x87a\x07\x1f6\ +\xacgggg\xac6\xfd\xe1* \xb2a\xf5\xe8\xc4\ +\xfew\xfe\xd8\x8b\xb4`T\x01\x11\xfd\x01\x0c\x01\xd6\xed\ +a\xb0\x1d+\xcc\xfe\x8e\xc2\x9c\xac\x83{\xf6\xcbV5\ +JT\xc6\x01\x99\xd0\x8d\x8c\x00\x00\x02\x00f\x00\x00\x06\ +J\x05\xc5\x00\x0d\x00$\x008@\x1e!\x15\x15##\ +\x0e\x0f\x05\x09\x09\x0c\x01\x03\x0d@\x09\x0dH\x0d\x07\x03\ +\x0b\x1c\x16\x0f\x0f\x19\x14\x0e\x15\x00?33?33\ +\xd622\xcd+\x179\x113\x11\x129\x113?1\ +0\x01\x07\x07#'#\x07#'#\x07#'7\x01\ +\x033\x13\x16\x17\x17\x01\x033\x13\x176\x12\x133\x02\ +\x00\x07#\x03#\x03\x05-\x0au3\x19\xa1F3\x19\ +\xa2G2(\x0a\xfe\xf8\x88\xea?\x0c\x04\x03\x01)-\ +\xe56\x10\x90\xb9J\xeeF\xfe\xe5\xe9\xe7-\x05\xf3\x05\ +\xc56\xacgggg\xac6\xfa;\x04R\xfd\x8fh\ +dJ\x01\xef\x01\x98\xfdf\xe3\xa0\x01\x8d\x01P\xfe\x97\ +\xfd\xee\xd7\x01\xa6\xfeZ\x00\x01\x00\x87\xfe\x14\x05!\x05\ +\xcb\x00\x17\x00\x1c@\x0e\x0b\x1b\x13\x00LY\x13\x04\x0c\ +\x07LY\x0c\x13\x00?+\x00\x18?+\x00\x18?1\ +0\x01\x22\x06\x02\x15\x14\x16327\x03#\x13&\x02\ +5\x10\x12$32\x17\x07&\x03\x9c\x9c\xf3\x8e\xa8\x9c\ +]i\x95\xf0f\xe5\xfe\xd3\x01a\xe1\xd7\xae^\x98\x04\ +\xfe\xb6\xfe\xa6\xcd\xae\xb9!\xfd9\x01\xda\x0c\x01(\xfb\ +\x01\x06\x01\xc1\xe7\x5c\xc3R\x00\x00\x01\x00^\xfe\x14\x03\ +\xcd\x04f\x00\x17\x00\x1c@\x0e\x00\x1b\x08\x0dFY\x08\ +\x10\x01\x14FY\x01\x16\x00?+\x00\x18?+\x00\x18\ +?10\x01\x13&&54\x12$32\x17\x07&\ +#\x22\x06\x06\x15\x14\x16327\x03\x01di\xac\xc3\ +\x99\x01\x06\xa7\xa4\x85Fzcc\xa1Zqdf`\ +\x97\xfe\x14\x01\xda\x08\xd4\xb7\xd5\x01Z\xb6=\xb85\x8e\ +\xf8\x93hu-\xfd7\x00\x01\x00o\xff\xfa\x04\x7f\x05\ +\x0a\x00\x13\x00\x15@\x0c\x00\x09\x10\x0d\x02\x12\x08\x0c\x08\ +\x0e\x04\x12\x00?\xcd\x17910\x01\x05\x07%\x03'\ +\x13%7\x05\x13%7\x05\x13\x17\x03\x05\x07%\x02R\ +\x01\x1dH\xfe\xe3\xb4\x81\xb4\xfe\xe6E\x01\x1f\xc7\xfe\xe3\ +H\x01\x1c\xb7\x7f\xb7\x01\x1fJ\xfe\xe6\x01\xb0\xa6{\xa4\ +\xfe\xc7J\x01;\xa4{\xa4\x01Z\xa4}\xa4\x019I\ +\xfe\xc4\xa4{\xa4\x00\x01\x01?\x04\x85\x04J\x05\xc1\x00\ +\x11\x00\x0c\xb3\x02\x00\x0b\x08\x00/33210\x01\ +\x06#\x22&5463!632\x16\x15\x14\x06\ +\x07\x02\x0e\x1bW-0EE\x01\xb4\x17Z..B\ +E\x04\xe3^7%;F_.&\x11\x10\x08\x0a\ +\x1c (,J\x00\x08\x00)\xfe\xc1\x07\xc1\x05\x91\x00\ +\x0c\x00\x1a\x00(\x006\x00D\x00R\x00_\x00m\x00\ +\x92\xb1\x04\x0b\xb8\xff\xc0@\x10\x09\x0fH\x0b\x00\x14\x0d\ +\x2200\x1b,&\x1e\x034\xb8\xff\xc0@\x0f\x09\x0f\ +H4)ZggS`IB:\x03P\xb8\xff\xc0\ +@\x0f\x09\x0fHPE>LL7Ec^V\x03\ +k\xb8\xff\xc0@\x1a\x09\x0fHk`\x0f`\x01)`\ +EE`)\x03\x00\x0d@\x09\x0fH\x0d\x11\x18\x07\x00\ +\x00/2/3\xcd+\x11\x179///]\x10\xcd\ ++\x172\x1133\x113\x10\xcd+\x172\x1133\ +\x113\x10\xcd+\x17233\x113\x113\x10\xcd+\ +210\x012\x16\x17#&&#\x22\x06\x07#6\ +\x132\x16\x17#&&#\x22\x06\x07#66\x012\ +\x16\x17#&&#\x22\x06\x07#66!2\x16\x17\ +#&&#\x22\x06\x07#66\x012\x16\x17#&\ +&#\x22\x06\x07#66!2\x16\x17#&&#\ +\x22\x06\x07#66\x012\x16\x17#&&#\x22\x06\ +\x07#6!2\x16\x17#&&#\x22\x06\x07#6\ +6\x03\xe9]q\x07O\x05bvzw\x04%\xfe\xd6\x86\x8eI\x9d\x18\xfd\xdd\ +\x05\xb6\xc9\xfd\xff\x0a\x81G\x83N\x94md\x00\x02\xff\ +\xc9\xfe\x14\x04P\x04f\x00\x17\x00'\x00<@ \x08\ +\x12\x0b# \x09\x06\x04\x08\x22\x22\x00\x12\x1b\x0e\x15\x0b\ +\x00\x00\x18FY\x00\x10\x13\x0f\x0b\x1fFY\x0b\x16\x00\ +?+\x00\x18??+\x11\x12\x0099\x18?\x119\ +\x11\x12\x179\x11\x12910\x012\x16\x15\x14\x02\x07\ +\x17\x07'\x06#\x22'#\x06\x07\x03#\x013\x073\ +6\x17\x22\x06\x02\x15\x14\x1637'7\x176\x125\ +4\x03\x1f\x8f\xa2\x9f\x84B\x98F-\x22\xb7X\x08\x0b\ +\x18V\xe9\x01R\xb8\x15\x09\x9dcT\xa2`WQ\x22\ +A\x95\xbc\xd0\xc0\xa6\xfe\xfb\x86a\ +j\x04\x8dH\x81P\x01\x01\x8a\xc9\x00\x00\x01\x005\x00\ +\x00\x04}\x05\xb6\x00\x0d\x00$@\x12\x06\x0a\x0b\x0aL\ +Y\x03\x0b\x0b\x0d\x08\x12\x0d\x02LY\x0d\x03\x00?+\ +\x00\x18?\x129/3+\x11\x00310\x01\x07!\ +\x03!\x07!\x03#\x13#73\x13\x04}+\xfd\xe9\ +\x5c\x01>+\xfe\xc2\x83\xeb\x83\x94+\x94\x87\x05\xb6\xcd\ +\xfeN\xc8\xfd\x91\x02o\xc8\x02\x7f\x00\x00\x01\x00\x00\x00\ +\x00\x03\xaa\x04R\x00\x0d\x00$@\x12\x0c\x02\x03\x02H\ +Y\x09\x03\x03\x05\x00\x15\x05\x08FY\x05\x0f\x00?+\ +\x00\x18?\x129/3+\x11\x003103\x13#\ +73\x13!\x07!\x03!\x07!\x03/b\x91%\x91\ +e\x02\x8f+\xfe\x5c;\x01\x0a'\xfe\xf8`\x01\xc5\xb4\ +\x01\xd9\xc3\xfe\xea\xb4\xfe;\x00\x00\x01\x00F\xfe\x00\x04\ +\x81\x05\xb6\x00\x1d\x00.@\x18\x09\x04\x0b\x0b\x00LY\ +\x0b\x0b\x05\x04\x12\x05\x08LY\x05\x03\x12\x17LY\x12\ +\x1c\x00?+\x00\x18?+\x00\x18?\x129/+\x11\ +\x12\x00910\x01\x22\x07\x03#\x01!\x07!\x036\ +32\x00\x15\x14\x02\x04#\x22'5\x16326\x12\ +54&\x02/W(\x7f\xeb\x015\x03\x06+\xfd\xe5\ +b@X\xe9\x01\x0c\xa1\xfe\xd6\xc4\xa1s\x7f\x81\x80\xc3\ +k\xa6\x02^\x0a\xfd\xac\x05\xb6\xcd\xfe0\x10\xfe\xd7\xfe\ +\xdf\xfe\xa0\xc3/\xd15\x8b\x01\x01\x9d\xaf\xbb\x00\x01\x00\ +/\xfe\x0a\x03\xae\x04R\x00\x1c\x00.@\x18\x18\x13\x1a\ +\x1a\x0fFY\x1a\x1a\x14\x13\x15\x14\x17FY\x14\x0f\x04\ +\x09FY\x04\x1b\x00?+\x00\x18?+\x00\x18?\x12\ +9/+\x11\x12\x00910%\x14\x02\x06#\x22'\ +5\x1632\x1254&#\x22\x07\x03#\x13!\x07\ +!\x03632\x16\x03\x9c\x8d\xfe\xa9\x83Vbm\x9b\ +\xb3nc=+X\xec\xec\x02\x93)\xfeV=N7\ +\xae\xcb\xba\xcf\xfe\xc0\xa1/\xd59\x01\x01\xd8\x83\x89\x10\ +\xfeV\x04R\xc3\xfe\xde\x12\xf5\x00\x01\xff\x8f\xfem\x07\ +B\x05\xb6\x00\x15\x00+@\x17\x03\x13\x06\x10\x04\x00\x00\ +\x15\x07\x04\x01\x03\x12\x15\x12\x0d#\x0f\x0aLY\x0f\x12\ +\x00?+\x00\x18??3?33\x129\x11\x173\ +10\x01\x013\x01\x133\x03\x01!\x01\x133\x03#\ +\x13#\x01\x03#\x13\x01!\x02\x1b\xfe\xbe\xf4\x019\x94\ +\xe5\x93\x02K\x01\x0b\xfd\x8d\xf4\xc4\x81\xe7VT\xfe\xc0\ +\x97\xe6\x98\xfd\xa6\xfe\xed\x03\x06\x02\xb0\xfdL\x02\xb4\xfd\ +L\x02\xb4\xfd'\xfd\xec\xfd\xa4\x01\x93\x02\xd5\xfd+\x02\ +\xd3\xfd-\x00\x01\xff\xe3\xfe{\x07T\x04f\x00;\x00\ +B@#$(\x05(IY\x09\x05\x05&\x07\x0f&\ +\x15\x1d\x22\x127\x007FY\x0d\x00\x10\x1e+\x190\ ++0FY+\x16\x00?+\x11\x003\x113\x18?\ +3+\x11\x003\x18???\x129/3+\x11\x00\ +310\x012\x16\x15\x14\x073\x133\x0336\x00\ +32\x17\x07&#\x22\x06\x06\x15\x14\x16327\x03\ +#\x13&&557#\x03#\x13#\x06\x00#\x22\ +'7\x16326654&#\x22\x0756\x01\ ++\xad\xc0\x05\xa8e\xddf\x9f7\x01\x1b\xc3S6)\ +,2Z\x93YXTNL}\xddT\x90\x9b\x02\xaa\ +e\xdbe\x9e6\xfe\xe4\xc5D=%0*_\x96U\ +YQ8=L\x04f\xde\xcc\x1b&\x01\xd7\xfe)\xe5\ +\x01\x06\x0e\xbc\x0a\x83\xf9\x90u{\x1d\xfd\xb4\x01w\x12\ +\xd5\xba!!\xfe+\x01\xd5\xe3\xfe\xfa\x0e\xbc\x0c\x8e\xf6\ +\x8auy\x15\xbf\x16\x00\xff\xff\x00\x10\xfe-\x04j\x05\ +\xcb\x02&\x01\xb1\x00\x00\x00\x07\x03\x7f\x01\x8d\x00\x00\xff\ +\xff\x00\x0a\xfe-\x03\xa0\x04f\x02&\x01\xd1\x00\x00\x00\ +\x07\x03\x7f\x01P\x00\x00\x00\x01\x00D\xfem\x05V\x05\ +\xb6\x00\x0e\x00$@\x12\x06\x0b\x0e\x0e\x08\x0c\x09\x03\x08\ +\x12\x03#\x05\x00LY\x05\x12\x00?+\x00\x18??\ +?3\x129\x113310%3\x03#\x13#\x01\ +\x03#\x013\x03\x01!\x01\x03\xdf\xe2\x7f\xeaXw\xfe\ +\x92\x98\xef\x015\xef\x95\x02o\x01\x14\xfdo\xc9\xfd\xa4\ +\x01\x93\x02\xd1\xfd/\x05\xb6\xfdF\x02\xba\xfd)\x00\x00\ +\x01\x00/\xfey\x04\x83\x04R\x00\x0e\x00$@\x12\x09\ +\x0e\x02\x02\x0b\x00\x0c\x0f\x0b\x15\x06\x22\x08\x03FY\x08\ +\x15\x00?+\x00\x18???3\x129\x11331\ +0\x01!\x01\x133\x03#\x13#\x01\x03#\x133\x03\ +\x03u\x01\x0e\xfd\xfe\xd9\xd3}\xdbXl\xfe\xccr\xec\ +\xec\xe9n\x04R\xfd\xdb\xfe\x96\xfd\xb6\x01\x87\x02!\xfd\ +\xdf\x04R\xfd\xf8\x00\x01\x00D\x00\x00\x05d\x05\xb6\x00\ +\x12\x00*@\x15\x05\x0c\x04\x0d\x04\x0d\x02\x0f\x04\x09\x06\ +\x0b\x12\x12\x08\x10\x09\x03\x01\x08\x12\x00?3?3\x12\ +9\x1133\x11\x179\x11\x129910!!\x03\ +\x07#\x13\x07\x03#\x013\x037\x133\x07\x01!\x01\ +\x045\xff\x00\xb6#\x8bR{u\xef\x015\xef\x95\x8d\ +H\x8b\x1f\x01:\x01\x16\xfd\x81\x01\xa6\xac\x01\x8bZ\xfd\ +\xd5\x05\xb6\xfdF\xa0\x01R\x8e\x01V\xfdF\x00\x01\x00\ +H\x00\x00\x04\xac\x04R\x00\x13\x00,@\x16\x12\x05\x11\ +\x06\x11\x06\x0f\x08\x04\x02\x13\x04\x0b\x0c\x0b\x01\x09\x02\x0f\ +\x0e\x01\x15\x00?3?3\x1299\x1133\x11\x17\ +9\x11\x129910!#\x133\x037\x133\x07\ +7!\x01\x07\x01!\x03\x07#\x13'\x011\xe9\xe9\xec\ +oiC\x83\x1f\xe4\x01\x0a\xfe\x08\x0c\x019\xfe\xfc\x9e\ +$\x85K=\x04R\xfd\xf8l\x01@\x90\xec\xfd\xfa>\ +\xfd\xf2\x01\x14\xba\x01^k\x00\x00\x01\x00F\x00\x00\x05\ +m\x05\xb6\x00\x13\x002@\x1c\x02\x10\x13\x03\x04\x05\x0a\ +\x0f\x07\x08\x07LY\x0c\xaf\x08\xbf\x08\x02\x08\x08\x05\x11\ +\x0a\x03\x01\x05\x12\x00?3?3\x129/]3+\ +\x11\x003\x11\x12\x17910!!\x03\x07\x03#\x13\ +#7373\x073\x07#\x03\x01!\x01\x04?\xfe\ +\xfa\xfc\x95u\xed\xe7\x8b+\x8b#\xed\x22\xa1+\xa1J\ +\x02\x81\x01\x1b\xfd\x91\x02\x8fb\xfd\xd3\x04L\xcb\x9f\x9f\ +\xcb\xfe\xa8\x02\xc2\xfd^\x00\x01\x00/\x00\x00\x04\x87\x06\ +\x14\x00\x16\x00-@\x18\x07\x16\x00\x16IY\x04\x00\x00\ +\x02\x0e\x0a\x11\x12\x04\x14\x0c\x02\x00\x0c\x0f\x10\x14\x15\x00\ +?3??\x11\x12\x179\x129/3+\x11\x003\ +10\x13373\x07!\x07!\x03\x06\x073\x01!\ +\x01\x01!\x03\x07\x03#\x01#\xba\x9a%\xeb'\x01\x1b\ +%\xfe\xe8B((\x06\x01\xe8\x01\x10\xfe\x1d\x01#\xfe\ +\xfa\xd1\x88M\xec\x01\x02\x9b\x05f\xae\xae\xa3\xfe\xc4\xb1\ +|\x01\xf8\xfe\x1b\xfd\x93\x01\xd7`\xfe\x89\x04\xc3\x00\x00\ +\x01\x00\xb0\x00\x00\x05\xfe\x05\xb6\x00\x0c\x00#@\x11\x02\ +\x09\x0c\x0c\x04\x07\x0a\x03\x01\x04\x12\x07\x06LY\x07\x03\ +\x00?+\x00\x18?3?\x11\x129\x113310\ +!!\x01\x03#\x01!7!\x03\x01!\x01\x04\xec\xfe\ +\xf3\xfe\x92\x98\xed\x01\x0a\xfe\xba+\x023\x93\x02n\x01\ +\x15\xfdl\x02\xd1\xfd/\x04\xe9\xcd\xfdF\x02\xba\xfd)\ +\x00\x00\x01\x00L\x00\x00\x05/\x04R\x00\x0c\x00#@\ +\x11\x05\x0c\x02\x02\x07\x0a\x00\x0f\x04\x07\x15\x0a\x09GY\ +\x0a\x0f\x00?+\x00\x18?3?\x11\x129\x1133\ +10\x01!\x01\x01!\x01\x03#\x13!7!\x03\x04\ +!\x01\x0e\xfd\xfc\x01J\xfe\xf8\xfe\xcct\xea\xc3\xfe\xae\ +'\x02=n\x04R\xfd\xdb\xfd\xd3\x02!\xfd\xdf\x03\x98\ +\xba\xfd\xf8\x00\x01\x00F\xfem\x05\x8b\x05\xb6\x00\x0f\x00\ +%@\x14\x0c\x07LY\x0c\x0c\x05\x0e\x0a\x03\x09\x12\x03\ +#\x05\x00LY\x05\x12\x00?+\x00\x18???3\ +\x129/+10%3\x03#\x13#\x13!\x03#\ +\x013\x03!\x133\x04\x7f\xdf\x81\xe7V\xe4\x8c\xfd\xca\ +\x8b\xed\x015\xed\x7f\x026\x7f\xed\xc9\xfd\xa4\x01\x93\x02\ +\x93\xfdm\x05\xb6\xfd\xaa\x02V\x00\x01\x00/\xfey\x04\ +\xaa\x04R\x00\x0f\x00%@\x14\x01\x0cGY\x01\x01\x0a\ +\x03\x0f\x0f\x0e\x15\x08\x22\x0a\x05FY\x0a\x15\x00?+\ +\x00\x18???3\x129/+10\x01\x03!\x13\ +3\x033\x03#\x13#\x13!\x03#\x13\x02\x06^\x01\ +\xba_\xe9\xc1\xb9}\xe1X\xc7d\xfeHf\xec\xee\x04\ +R\xfeD\x01\xbc\xfcq\xfd\xb6\x01\x87\x01\xdd\xfe#\x04\ +R\x00\x01\x00F\x00\x00\x06\xcb\x05\xb6\x00\x0d\x00$@\ +\x13\x09\x04LY\x09\x09\x06\x0b\x07\x03\x02\x06\x12\x0b\x00\ +LY\x0b\x03\x00?+\x00\x18?3?\x11\x129/\ ++10\x01\x01#\x13!\x03#\x013\x03!\x13!\ +\x07\x05`\xfe\xf6\xee\x8c\xfd\xca\x8b\xed\x015\xed\x7f\x02\ +6\x7f\x02-)\x04\xe9\xfb\x17\x02\x93\xfdm\x05\xb6\xfd\ +\xaa\x02V\xcd\x00\x00\x01\x00/\x00\x00\x06\x04\x04R\x00\ +\x0d\x00$@\x13\x01\x0aGY\x01\x01\x0c\x03\x0d\x0f\x08\ +\x0c\x15\x03\x06GY\x03\x0f\x00?+\x00\x18?3?\ +\x11\x129/+10\x01\x03!\x13!\x07!\x03#\ +\x13!\x03#\x13\x02\x06^\x01\xba_\x02C)\xfe\xa8\ +\xc2\xecd\xfeHf\xec\xee\x04R\xfeD\x01\xbc\xba\xfc\ +h\x01\xdd\xfe#\x04R\x00\x01\x00F\xfe\x00\x07q\x05\ +\xb6\x00\x1f\x000@\x19\x08\x05\x0a\x0a\x1dLY\x0a\x0a\ +\x06\x01\x05\x12\x06\x03LY\x06\x03\x11\x16LY\x11\x1c\ +\x00?+\x00\x18?+\x00\x18?3\x129/+\x11\ +\x12\x00910!#\x01!\x01#\x01!\x0363\ +2\x00\x11\x14\x02\x04#\x22'5\x1632665\ +4&#\x22\x07\x04;\xef\x01\x0a\xfd\xe7\xfe\xf6\xed\x01\ +5\x03\xf6\x90@Z\xe5\x01\x11\xa4\xfe\xd6\xc0\xa4t~\ +\x84}\xc5l\xa7\x9bS.\x04\xe9\xfb\x17\x05\xb6\xfdc\ +\x10\xfe\xda\xfe\xff\xdf\xfe\x9e\xc11\xcf3\x8f\xff\x99\xae\ +\xbc\x0a\x00\x00\x01\x00/\xfe\x0a\x06%\x04R\x00\x1e\x00\ +0@\x19\x00\x1c\x02\x02\x14FY\x02\x02\x1d\x18\x1c\x15\ +\x1d\x1aGY\x1d\x0f\x09\x0eFY\x09\x1b\x00?+\x00\ +\x18?+\x00\x18?3\x129/+\x11\x12\x0091\ +0\x01632\x16\x15\x14\x02\x06#\x22'5\x163\ +2654&#\x22\x07\x03#\x13!\x03#\x13!\ +\x04#N;\xae\xcb\x8d\xfc\xaa\x81Xgg\x9a\xb4k\ +d>.X\xec\xc3\xfed\xc2\xec\xee\x03n\x02m\x12\ +\xf5\xd0\xcf\xfe\xc0\xa1/\xd79\xff\xd8\x82\x8a\x10\xfeV\ +\x03\x98\xfch\x04R\x00\x00\x02\x00\x87\xff\xac\x05\x7f\x05\ +\xcd\x00+\x005\x00K@+,#\x03\x0c\x04\x0e)\ +)1KY\x00)\x10)`)\x03\x09\x03))\x0e\ +\x15\x0a\x05LY\x0a\x0e@\x15\x1aLY\x15\x04\x0e!\ +LY\x0e\x13\x00?+\x00\x18?+\x00\x1a\x18\x10\xcc\ ++\x11\x12\x009\x18/_^]+\x11\x12\x00\x179\ +10\x01\x14\x02\x07\x16327\x15\x06#\x22'\x06\ +#\x22\x00\x11\x10\x12$32\x17\x07&#\x22\x06\x02\ +\x15\x14\x16337&54\x12632\x16\x016\ +\x1254#\x22\x02\x15\x14\x05\x7f\xab\x97%8AJ\ +>f\xa8fZw\xfe\xfe\xe3\xc3\x01Y\xda\x84tF\ +S_\x91\xea\x83\xa0\x91\x17\x12Lr\xcf\x80\x93\x9e\xfe\ +%n\x88[Q{\x03!\xc7\xfe\x9bn\x12\x1a\xc8\x1b\ +^\x1e\x01*\x01\x0b\x01\x0a\x01\xb4\xee/\xc1#\xb9\xfe\ +\xb1\xcf\xad\xc6\x02\x88\xc2\xb7\x01+\xa7\xb8\xfd1Q\x01\ +5\xa9\x9c\xfe\xeb\xc8\x92\x00\x02\x00^\xff\xbe\x04{\x04\ +f\x00,\x007\x00S@\x13-\x03\x0c$\x04\x0e*\ +*2HY\x00*\x10*\x02\x11\x03*\xb8\xff\xc0@\ +\x1a\x09\x0cH**\x0e\x15\x0a\x05HY\x0a\x0e@\x15\ +\x1bGY\x15\x10\x0e\x22GY\x0e\x16\x00?+\x00\x18\ +?+\x00\x1a\x18\x10\xcc+\x11\x12\x009\x18/+_\ +^]+\x11\x12\x00\x17910\x01\x14\x02\x07\x163\ +27\x15\x06#\x22'\x06#\x22&54\x12$3\ +2\x16\x17\x07&#\x22\x06\x06\x15\x14\x16337&\ +&54632\x16\x016654#\x22\x06\x15\ +\x14\x16\x04{\x85m\x1f)7>BR\x82k]p\ +\xc1\xd9\x93\x01\x03\xaa2n$5@Kf\x98Xi\ +_\x1b\x15\x19%\xc9\xa4}\x8b\xfe\x87J^D>M\ +\x16\x02H\x8a\xff\x00C\x0c\x14\xae\x17P\x22\xf0\xd6\xc5\ +\x01E\xaa\x11\x0d\xb5\x17z\xf5\x91|\x8a\x02(}K\ +\xcc\xf6\x92\xfe\x1f5\xc6fb\xa2n5a\xff\xff\x00\ +\x87\xfe-\x05!\x05\xcb\x02&\x00&\x00\x00\x00\x07\x03\ +\x7f\x02;\x00\x00\xff\xff\x00^\xfe-\x03\xcd\x04f\x02\ +&\x00F\x00\x00\x00\x07\x03\x7f\x01\x9e\x00\x00\x00\x01\x00\ +\xb0\xfem\x04\xc3\x05\xb6\x00\x0b\x00 @\x10\x03#\x0b\ +\x07\x08\x07LY\x08\x03\x05\x00LY\x05\x12\x00?+\ +\x00\x18?+\x11\x003\x18?10%3\x03#\x13\ +#\x01!7!\x07!\x02;\xdc\x81\xe8V\xe1\x01\x08\ +\xfe\x85-\x03\xe6+\xfe\x83\xc9\xfd\xa4\x01\x93\x04\xe9\xcd\ +\xcd\x00\x01\x00/\xfey\x06\xe1\x04f\x003\x004@\ +\x1b\x02\x0311\x00$.\x15\x15\x22\x1f)\x00)F\ +Y\x06\x00\x10/\x0f\x16\x11GY\x16\x15\x00?+\x00\ +\x18??3+\x11\x003\x18??3\x129\x113\ +310\x012\x1736632\x16\x15\x14\x07\x03\ +\x06\x15\x14\x16327\x03#\x13&54766\ +'4#\x22\x06\x07\x03#\x13654#\x22\x06\x07\ +\x03#\x133\x0736\x03'\xdc\x22\x08K\xbfg\x85\ +\x8b\x16J\x08\x22\x1d*2{\xe1X\x89\x0e02\x03\ +wl\xbb+e\xeb\x8f\x11un\xbb-b\xec\xec\xb8\ +\x15\x09\x94\x04f\xebtw\x9b\x907u\xfe\xa8\x22!\ +\x22$\x13\xfd\xb8\x01\x7f'\x9f=8\xde\xec$\x85\xf8\ +\xcd\xfe\x1f\x02\xa0R-\x87\xfe\xd3\xfe+\x04R\xcd\xe1\ +\x00\xff\xff\x00\xba\x00\x00\x05\x00\x05\xb6\x02\x06\x00<\x00\ +\x00\x00\x01\x00d\xfe\x14\x04P\x04R\x00\x0d\x00\x10\xb6\ +\x0d\x07\x03\x09\x0f\x07\x1b\x00??3\x12910%\ +67\x013\x01\x03#\x13\x033\x13\x16\x17\x01\x9e3\ +V\x01/\xfa\xfd\x95h\xf0i\x92\xe87\x08\x0d\xfe\x80\ +\x9d\x027\xfb\xac\xfe\x16\x01\xea\x04T\xfd\xd1N\xd7\x00\ +\x01\x00\x5c\x00\x00\x05\x00\x05\xb6\x00\x10\x00%@\x12\x00\ +\x09\x0f\x07\x0b\x0c\x0bLY\x04\x0c\x0c\x09\x01\x0f\x03\x09\ +\x12\x00??3\x129/3+\x11\x003\x11\x129\ +10\x01\x01!\x01\x07!\x07!\x03#\x13!7!\ +7\x033\x02F\x01\xb0\x01\x0a\xfd\x91\x08\x01%+\xfe\ +\xddA\xeeB\xfe\xe9+\x01\x19\x08\xee\xf2\x03\x19\x02\x9d\ +\xfco!\xcd\xfe\xc9\x017\xcd%\x03\x8d\x00\x00\x01\xff\ +\xd3\xfe\x14\x04P\x04R\x00\x13\x00!@\x10\x13\x0d\x03\ +\x0f\x0f\x0a\x1b\x08\x0c\x0d\x0cHY\x05\x0d\x15\x00?3\ ++\x11\x003\x18??3\x12910%67\x01\ +3\x01!\x07!\x03#\x13#73\x033\x13\x16\x17\ +\x01\x9c(c\x01/\xfa\xfd\x95\x01\x0b'\xfe\xf5A\xf0\ +B\xfc'\xfa\x90\xe87\x05\x0e\xfce\xba\x027\xfb\xae\ +\xb2\xfe\xc6\x01:\xb2\x04R\xfd\xd1.\xf9\x00\x00\x01\xff\ +\x91\xfem\x05%\x05\xb6\x00\x0f\x00 @\x10\x06\x0c\x08\ +\x0d\x0a\x03\x08\x12\x03#\x05\x00LY\x05\x12\x00?+\ +\x00\x18???3\x129910%3\x03#\x13\ +#\x03\x01!\x01\x033\x13\x01!\x01\x03\xc5\xd7\x81\xe8\ +Vy\xc0\xfeJ\xfe\xf7\x02J\xfa\xf6\xb2\x01\x92\x01\x0a\ +\xfd\xd9\xc9\xfd\xa4\x01\x93\x02P\xfd\xb0\x03\x02\x02\xb4\xfd\ +\xe4\x02\x1c\xfd:\x00\x01\xff\xc7\xfe{\x04q\x04R\x00\ +\x0f\x00 @\x10\x00\x06\x02\x07\x04\x0f\x02\x15\x0d\x22\x0f\ +\x0aFY\x0f\x15\x00?+\x00\x18???3\x129\ +910\x01\x01!\x01\x033\x13\x01!\x01\x133\x03\ +#\x13#\x02\x08\xfe\xcd\xfe\xf2\x01\xdb\xe8\xf6\x8f\x01\x1f\ +\x01\x13\xfe3\xa2\xce|\xdcXn\x01\x83\xfe}\x029\ +\x02\x19\xfe\x8b\x01u\xfd\xdb\xfe\x96\xfd\xb8\x01\x85\x00\x00\ +\x01\x00\xb0\xfem\x06V\x05\xb6\x00\x0f\x00'@\x14\x0d\ +\x03\x02#\x0a\x06\x07\x06LY\x07\x03\x0f\x0b\x04\x0bL\ +Y\x04\x12\x00?+\x11\x003\x18?+\x11\x003\x18\ +??10%\x03#\x13!\x01!7!\x07!\x03\ +!\x013\x01\x06\x06\x81\xe9V\xfc/\x01\x0a\xfe\x85+\ +\x03\xd9+\xfe\x92\xde\x02!\x01\x0a\xee\xfe\xf6\xd1\xfd\x9c\ +\x01\x93\x04\xe7\xcf\xcf\xfb\xe6\x04\xe9\xfb\x1b\x00\x00\x01\x00\ +Z\xfey\x05\x14\x04R\x00&\x00.@\x17\x1a\x1c$\ +\x15\x22\x00#$#GY\x0a$\x0f\x11\x05\x1c\x05F\ +Y\x16\x1c\x15\x00?3+\x11\x003\x18?3+\x11\ +\x003\x18?\x11\x12910\x01\x03\x06\x15\x1432\ +667\x133\x03\x06\x15\x14\x16327\x03#\x13\ +&&'#\x06#\x22&547\x13!7!\x07\ +\x02^h\x11}J\x8cp\x1fb\xeb\xaa\x08#\x1d(\ +4{\xe3Z<=\x08\x04\x9a\xc9\x86\x92\x18a\xfe\xe7\ +'\x03\x1b'\x03\x98\xfe\x18Q0\x85p\xd5\x8e\x01\xd5\ +\xfc\xe5\x22! &\x13\xfd\xb8\x01\x7f\x15aP\xd2\x97\ +\x8bVm\x01\xc7\xba\xba\x00\x01\x00\xd7\xfeo\x05J\x05\ +\xb6\x00\x1a\x00)@\x15\x04\x03\x0d\x07\x13LY\x07\x07\ +\x03\x17\x0d\x03\x01#\x03\x19LY\x03\x12\x00?+\x00\ +\x18??3\x129/+\x11\x12\x00910\x01#\ +\x13#\x13\x06\x06#\x22&547\x133\x03\x06\x15\ +\x143267\x133\x013\x04\x9a\xeaV\xe1{v\ +\xabP\xa5\xb3\x0es\xeeo\x0c\xa6^\xa4X\x8f\xf0\xfe\ +\xf3\xde\xfeo\x01\x91\x02D0&\x9b\x8e?@\x02 \ +\xfd\xf002\x8a*\x22\x02\xb0\xfb\x13\x00\x01\x00\xa0\xfe\ +{\x04h\x04R\x00\x1a\x00)@\x15\x12\x10\x1a\x14\x06\ +FY\x14\x14\x10\x09\x1a\x0f\x0e\x22\x10\x0bFY\x10\x15\ +\x00?+\x00\x18??3\x129/+\x11\x12\x009\ +10\x01\x03\x06\x15\x14\x1632\x1373\x033\x03\ +#\x13#\x13#\x06#\x22&547\x13\x01\xdb=\ +\x13F?\xf2b\x1b\xe9\xc0\xb8}\xe1X\xc9{\x08\x93\ +\xb7\x86\x94\x188\x04R\xfe\xdfL3BG\x01\xb2w\ +\xfcq\xfd\xb8\x01\x85\x02\x14\xaa\x9e\x8eMo\x01\x00\x00\ +\x01\x00\xd7\x00\x00\x05J\x05\xb6\x00\x1b\x002@\x18\x01\ +\x0c\x14\x14\x0c\x05\x05\x00\x0c\x03\x06\x16\x13\x06\x13LY\ +\x06\x06\x19\x0c\x03\x00\x12\x00??39/+\x11\x00\ +3\x113\x11\x129\x18/\x119/\x11910!\ +\x13\x06\x07\x03#\x13\x22&547\x133\x03\x06\x15\ +\x14\x16\x17\x133\x0367\x133\x01\x03%{|W\ +D\x8dA\xab\xbb\x0cu\xeeq\x0aKPH\x8dE[\ +z\x8f\xf0\xfe\xca\x02D4\x12\xfe\xc5\x01+\x9a\x912\ +>\x02-\xfd\xe4.&DE\x03\x01P\xfe\xbd\x0f0\ +\x02\xb0\xfaJ\x00\x00\x01\x00\xa0\x00\x00\x04q\x04R\x00\ +\x1f\x002@\x18\x06\x06\x14\x1f\x18\x18\x0e\x1f\x16\x19\x08\ +\x05\x19\x05FY\x19\x19\x0e\x0b\x1f\x0f\x0e\x15\x00??\ +3\x129/+\x11\x003\x113\x11\x129\x18/\x11\ +99/10\x01\x06\x06\x17\x14\x17\x133\x076\x13\ +73\x03#\x13>\x027#\x06\x07\x03#7\x22&\ +547\x13\x01\xdb(+\x03i7\x857\xa6N\x1a\ +\xea\xec\xeb?\x03\x0c%\x07\x08Rh7\x831\x90\x99\ +\x188\x04R\xbf\xcc\x15w\x10\x01\x04\xf6H\x01Xy\ +\xfb\xae\x011\x110\x90\x12k&\xfe\xfe\xe9\x9a\x8fK\ +t\x01\x00\x00\x01\x00D\x00\x00\x04\xb6\x05\xb6\x00\x16\x00\ +\x1f@\x0f\x00\x14\x03\x03\x0fLY\x03\x03\x14\x15\x03\x0a\ +\x14\x12\x00?3?\x129/+\x11\x12\x00910\ +\x016632\x16\x15\x14\x07\x03#\x13654#\ +\x22\x06\x07\x03#\x013\x01\xee\x7f\xa7J\xa7\xb1\x0cu\ +\xedr\x0b\xa8^\xa4V\x92\xef\x015\xef\x03q4$\ +\x9d\x904=\xfd\xd5\x02\x1b/'\x89*\x22\xfdR\x05\ +\xb6\x00\x01\x00/\x00\x00\x03\xfa\x04R\x00\x18\x00\x1f@\ +\x0f\x0f\x0a\x12\x12\x06GY\x12\x12\x0a\x0b\x0f\x00\x0a\x15\ +\x00?3?\x129/+\x11\x12\x00910!\x13\ +674&#\x22\x03\x07#\x133\x06\x06\x0736\ +32\x16\x15\x14\x07\x07\x02\xbe>\x0a\x06DA\xf7]\ +\x18\xec\xec\xed+,\x22\x09\x91\xb6\x87\x947\x19\x01#\ +1NAH\xfeJu\x04R\xcb\xcez\xa8\x9f\x8aX\ +\xf0v\x00\x00\x02\x00^\xff\xec\x06%\x05\xcd\x00%\x00\ +/\x003@\x1a\x1b\x0a)\x0aLY\x00) ) \ +)\x16\x03\x03&LY\x03\x04\x16\x0fLY\x16\x13\x00\ +?+\x00\x18?+\x11\x12\x0099\x18//\x113\ ++\x11\x00310\x01\x12\x00!2\x16\x15\x14\x04!\ +#\x06\x15\x14\x163267\x15\x06\x06#\x22\x00\x11\ +47&&5473\x06\x15\x143\x01\x22\x04\x07\ +3 $54&\x01\x9aQ\x01\x89\x01\x0d\xc7\xdd\xfe\ +^\xfeTh\x05\xa9\x9fV\xb1|r\xcdm\xfc\xfe\xe8\ +\x08\x85\x9a>\xc8/T\x02\xec\xa2\xfe\xfc9I\x01.\ +\x01\x22d\x03J\x01*\x01Y\xbd\xaa\xf5\xee\x1b7\xbd\ +\xbc%1\xd1.#\x01)\x01\x0a\x1fK\x02til\ +QM\xc8/T\x11T\x01\x87\x01\x0c\xc7\ +\xdd\xfeX\xfeHV\x05\xa9\x9fV\xb1|\xa5\xb7P\xed\ +V\xb4\xc9\x08\x85\x9a\x04\xfe\xea\xca\x86\x90NP\xfej\ +lQM\x0332\x17\x03\xa6\xd1\xfc\xea\ +\xcf\xcd\xc5%!H^QJWj\x8aa@3$\ +(1JEDIcx\xa2s\x9c\x8b\xb8\xfd\xc1\x01\ +\x87\x03\x98\x08@\x96\xda\xfb\xb1V\x14\xc5\x0fA\x85\xc4\ +\xd1\xb5g1+\x00\x01\x00F\xfe\x00\x05\x8b\x05\xb6\x00\ +\x15\x00$@\x13\x0f\x0aLY\x0f\x0f\x0c\x0d\x00\x05L\ +Y\x00\x1c\x11\x0d\x03\x0c\x12\x00??3?+\x11\x12\ +\x009\x18/+10\x01\x22'5\x163267\ +\x13!\x03#\x013\x03!\x133\x01\x02\x00\x01\xf4\xa3\ +t\x8a\x80\xab\xc12o\xfd\xca\x8b\xed\x015\xed\x7f\x02\ +6\x7f\xed\xfe\xddA\xfe\xce\xfe\x001\xd93\xc4\xe8\x02\ +\x10\xfdm\x05\xb6\xfd\xaa\x02V\xfa\x9c\xfe\xcd\xfe\xe1\x00\ +\x01\x00/\xfe\x0a\x04\xaa\x04R\x00\x15\x00\x22@\x12\x01\ +\x12GY\x01\x01\x14\x03\x15\x0f\x14\x15\x08\x0dFY\x08\ +\x1b\x00?+\x00\x18??3\x129/+10\x01\ +\x03!\x133\x03\x02\x06#\x22'5\x163267\ +\x13!\x03#\x13\x02\x06^\x01\xba_\xe9\xe7<\xeb\xcb\ +\x8adlrs\x84'Z\xfeHf\xec\xee\x04R\xfe\ +D\x01\xbc\xfb\xbe\xfe\xed\xf35\xd3=\xa3\xb9\x01\xac\xfe\ +#\x04R\x00\x01\x00F\xfem\x05\x8b\x05\xb6\x00\x0f\x00\ +%@\x14\x0c\x07LY\x0c\x0c\x05\x0e\x0a\x03\x09\x12\x03\ +#\x05\x00LY\x05\x12\x00?+\x00\x18???3\ +\x129/+10%3\x01!\x13#\x13!\x03#\ +\x013\x03!\x133\x04\x81\xf2\xfe\xe7\xfe\xf0\xfa\xdc\x8c\ +\xfd\xca\x8b\xed\x015\xed\x7f\x026\x7f\xed\xd1\xfd\x9c\x01\ +\x93\x02\x93\xfdm\x05\xb6\xfd\xaa\x02V\x00\x01\x00/\xfe\ +{\x04\xb8\x04R\x00\x0f\x00%@\x14\x01\x0cGY\x01\ +\x01\x0a\x03\x0f\x0f\x0e\x15\x08\x22\x0a\x05GY\x0a\x15\x00\ +?+\x00\x18???3\x129/+10\x01\x03\ +!\x133\x033\x03#\x13#\x13!\x03#\x13\x02\x06\ +^\x01\xba_\xe9\xc3\xd1\xfa\xeb\xcf\xcdd\xfeHf\xec\ +\xee\x04R\xfeD\x01\xbc\xfcf\xfd\xc3\x01\x85\x01\xdd\xfe\ +#\x04R\x00\x01\x00\xd7\xfem\x05J\x05\xb6\x00\x1a\x00\ +)@\x15\x05\x08\x0e\x08\x14LY\x08\x08\x00\x18\x0e\x03\ +\x02#\x00\x03LY\x00\x12\x00?+\x00\x18??3\ +\x129/+\x11\x12\x00910!\x03#\x133\x13\ +\x06\x06#\x22&547\x133\x03\x06\x15\x1432\ +67\x133\x01\x033V\xe7\x81\xd9Pv\xabP\xa6\ +\xb2\x0cu\xeeq\x0a\xa6^\xa4V\x91\xf0\xfe\xca\xfem\ +\x02\x5c\x01{0&\x9d\x8e2>\x02-\xfd\xe4.&\ +\x8c*\x22\x02\xb0\xfaJ\x00\x01\x00\xb6\xfey\x04\x7f\x04\ +R\x00\x1c\x00)@\x15\x13\x1c\x16\x16\x05FY\x16\x16\ +\x0c\x09\x1c\x0f\x0e\x22\x0c\x0fFY\x0c\x15\x00?+\x00\ +\x18??3\x129/+\x11\x12\x00910\x01\x03\ +\x06\x15\x14326773\x03#\x03#\x1336\ +67#\x06#\x22&546\x13\x01\xf2>\x10\x83\ +z\xaf-\x19\xe9\xe9\xd3R\xe2\x83\xbf!\x1d\x14\x08\x8b\ +\xbd\x8a\x93\x0eB\x04R\xfe\xdfP/\x89\xdc\xd8u\xfb\ +\xae\xfey\x02J\x9ax7\xa2\xa2\x8a$[\x01=\x00\ +\x01\x00D\xfem\x06\xe5\x05\xb6\x00\x18\x00&@\x13\x17\ +\x02\x02\x09\x12\x0b\x07\x03\x00\x06\x12\x10#\x12\x0dLY\ +\x12\x12\x00?+\x00\x18??3?3\x1299\x11\ +310!\x03#\x06\x03\x03#\x01!\x133\x01!\ +\x013\x01!\x13#\x136\x127#\x01\x02\x87s\x06\ +\x109\xa6\xdb\x015\x01Cm\x06\x02^\x01X\xfe\xfa\ +\xee\xfe\xe9\xfe\xf0\xfa\xcf\xa6\x15G\x0a\x06\xfd}\x04\xbe\ +\x9e\xfe\xf4\xfc\xec\x05\xb6\xfb\x83\x04}\xfb\x1b\xfd\x9c\x01\ +\x93\x03\x14a\x01'\x22\xfbB\x00\x01\x00)\xfe{\x05\ +\xc9\x04R\x00\x17\x00(@\x14\x0d\x0a\x00\x07\x07\x17\x10\ +\x0a\x0f\x04\x09\x15\x15\x22\x17\x12GY\x17\x15\x00?+\ +\x00\x18??3?3\x129\x113\x11910\x01\ +\x06\x06\x01#\x03&'\x03#\x13!\x13\x1767\x01\ +!\x033\x03#\x13#\x04\xaa\x02\x03\xfe0\xb0c\x0d\ +\x03\xb2\xd7\xeb\x01)_\x10\x1dA\x01y\x019\xc4\xd1\ +\xf8\xee\xd1\xbe\x03L\x03\x07\xfc\xbe\x02\x9fSZ\xfc\xb4\ +\x04R\xfdZ\xb0Os\x02\x94\xfcd\xfd\xc5\x01\x85\xff\ +\xff\xff\xcf\x00\x00\x03?\x05\xb6\x02\x06\x00,\x00\x00\xff\ +\xff\xff\x87\x00\x00\x05\x08\x07y\x02&\x00$\x00\x00\x01\ +\x07\x026\x00y\x01R\x00\x0a\xb4\x02\x12\x12\x05&\x00\ ++\x115\xff\xff\x00^\xff\xec\x04\xc0\x06'\x02&\x00\ +D\x00\x00\x01\x06\x0261\x00\x00\x0a\xb4\x02$$\x11\ +&\x00+\x115\xff\xff\xff\x87\x00\x00\x04o\x07>\x02\ +&\x00$\x00\x00\x01\x07\x00j\x00X\x01R\x00\x0c\xb5\ +\x03\x02$$\x05&\x00+\x1155\xff\xff\x00^\xff\ +\xec\x04\x7f\x05\xec\x02&\x00D\x00\x00\x01\x06\x00j\x00\ +\x00\x00\x0c\xb5\x03\x0266\x11&\x00+\x1155\xff\ +\xff\xff\x87\x00\x00\x07%\x05\xb6\x02\x06\x00\x88\x00\x00\xff\ +\xff\x00^\xff\xec\x06\x8f\x04f\x02\x06\x00\xa8\x00\x00\xff\ +\xff\x00F\x00\x00\x04\xdb\x07y\x02&\x00(\x00\x00\x01\ +\x07\x026\x00L\x01R\x00\x0a\xb4\x01\x0f\x0f\x05&\x00\ ++\x115\xff\xff\x00^\xff\xec\x04\x88\x06'\x02&\x00\ +H\x00\x00\x01\x06\x026\xf9\x00\x00\x0a\xb4\x02''\x11\ +&\x00+\x115\x00\x02\x00L\xff\xec\x05\x06\x05\xcd\x00\ +\x18\x00\x22\x00&@\x14\x13\x1dKY\x13\x13\x0d\x06\x06\ +\x00LY\x06\x04\x0d\x19LY\x0d\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+10\x01\x22\x0756\ +63 \x00\x11\x14\x02\x04#\x22&54$!3\ +654&\x01267# \x04\x15\x14\x16\x02\xd1\ +\xc6\xcck\xc8z\x01\x02\x01\x18\xcc\xfe\x9d\xd9\xd1\xe1\x01\ +\xa8\x01\xb0h\x06\xaa\xfe\x96\xa6\xfeC\x81\xfe\xf4\xfe\xea\ +a\x04\xfeV\xd1-'\xfe\xd3\xfe\xf6\xfd\xfeF\xf3\xbc\ +\xa8\xf7\xec4&\xb1\xc0\xfb\xba\xdf\xd6\x87\x8eHX\x00\ +\x02\x007\xff\xec\x03\xd3\x04f\x00\x09\x00#\x00&@\ +\x14\x17\x04HY\x17\x17\x11\x0a\x0a\x1dGY\x0a\x10\x11\ +\x00HY\x11\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10%267#\x22\x06\x15\x14\x16\x13\ +2\x16\x15\x14\x02\x04#\x22&54$!375\ +4&#\x22\x06\x07566\x01\x9aa\xaa\x22\x1d\xbd\ +\xd2@\xd6\xc5\xdd\x9b\xfe\xf7\xa4\xa1\xb3\x01M\x014+\ +\x02pqF\x8bfa\xa6\xa0\xb0\x89la39\x03\ +\xc6\xde\xc7\xc6\xfe\xab\xba\x91\x85\xb6\xcd\x1f\x1do~$\ +0\xba.$\x00\xff\xff\x00L\xff\xec\x05\x06\x07>\x02\ +&\x02\xe1\x00\x00\x01\x07\x00j\x00\x7f\x01R\x00\x0c\xb5\ +\x03\x0288\x05&\x00+\x1155\xff\xff\x007\xff\ +\xec\x03\xd3\x05\xec\x02&\x02\xe2\x00\x00\x01\x06\x00j\xb3\ +\x00\x00\x0c\xb5\x03\x0299\x11&\x00+\x1155\xff\ +\xff\xff\x8f\x00\x00\x07B\x07>\x02&\x01\xb0\x00\x00\x01\ +\x07\x00j\x01T\x01R\x00\x0c\xb5\x02\x01''\x05&\ +\x00+\x1155\xff\xff\xff\xe3\xff\xec\x07T\x05\xec\x02\ +&\x01\xd0\x00\x00\x01\x07\x00j\x01X\x00\x00\x00\x0c\xb5\ +\x02\x01QQ\x11&\x00+\x1155\xff\xff\x00\x10\xff\ +\xec\x04j\x07>\x02&\x01\xb1\x00\x00\x01\x07\x00j\x00\ +\x19\x01R\x00\x0c\xb5\x02\x01>>\x05&\x00+\x115\ +5\xff\xff\x00\x0a\xff\xec\x03\xb0\x05\xec\x02&\x01\xd1\x00\ +\x00\x01\x06\x00j\x99\x00\x00\x0c\xb5\x02\x01;;\x11&\ +\x00+\x1155\x00\x01\x00\x06\xff\xec\x04q\x05\xb6\x00\ +\x1a\x00(@\x14\x1a\x17\x18\x18\x17LY\x15\x00\x14\x14\ +\x06\x18\x03\x06\x0dKY\x06\x13\x00?+\x00\x18?\x12\ +9/33+\x11\x12\x00910\x01\x16\x16\x15\x14\ +\x00!\x22&'5\x16\x1632654&##\ +7\x01!7!\x07\x02V\xb4\xcb\xfe\xbd\xfe\xe3c\xc2\ +JP\xc7T\xac\xc2\x85\x8b\x9e%\x01\xbe\xfd\xf6+\x03\ +<#\x03?\x0a\xbe\xa6\xe1\xfe\xfc'(\xd5-7\x99\ +\x86ih\xac\x01\x9f\xcf\xa8\x00\x00\x01\xff\x8d\xfe\x12\x03\ +\xdb\x04R\x00\x19\x001@\x19\x00\x13\x14\x14\x13IY\ +\x14\x14\x07\x19\x16\x17\x17\x16GY\x17\x0f\x07\x0cFY\ +\x07\x1b\x00?+\x00\x18?+\x11\x12\x009\x129\x18\ +/+\x11\x12\x00910\x01\x16\x16\x15\x14\x02\x04#\ +\x22'5\x1632654&##7\x01!7\ +!\x07\x01\xd1\xa7\xc7\x91\xfe\xf1\xb3\xc9\x96\xa0\xb0\xae\xc5\ +\x9b\x92g#\x01\xbb\xfe\x00)\x03\x18!\x01\xcf\x0e\xd1\ +\xaa\xa7\xff\x00\x8dL\xd3\x5c\xc1\x9d}\x83\xa4\x01\xbf\xbc\ +\xa0\xff\xff\x00F\x00\x00\x05\xd9\x06\xdb\x02&\x01\xb2\x00\ +\x00\x01\x07\x01M\x00\xfe\x01R\x00\x0a\xb4\x01\x13\x13\x05\ +&\x00+\x115\xff\xff\x00o\xff\xec\x04\x87\x05\x89\x02\ +&\x00X\x00\x00\x01\x06\x01M/\x00\x00\x0a\xb4\x01\x1d\ +\x1d\x11&\x00+\x115\xff\xff\x00F\x00\x00\x05\xd9\x07\ +>\x02&\x01\xb2\x00\x00\x01\x07\x00j\x00\xdf\x01R\x00\ +\x0c\xb5\x02\x01%%\x05&\x00+\x1155\xff\xff\x00\ +o\xff\xec\x04\x87\x05\xec\x02&\x00X\x00\x00\x01\x06\x00\ +j\x06\x00\x00\x0c\xb5\x02\x01//\x11&\x00+\x115\ +5\xff\xff\x00\x87\xff\xec\x05\x8d\x07>\x02&\x002\x00\ +\x00\x01\x07\x00j\x00\xc5\x01R\x00\x0c\xb5\x03\x0211\ +\x05&\x00+\x1155\xff\xff\x00^\xff\xee\x047\x05\ +\xec\x02&\x00R\x00\x00\x01\x06\x00j\xea\x00\x00\x0c\xb5\ +\x03\x0211\x11&\x00+\x1155\xff\xff\x00\x87\xff\ +\xec\x05\x8d\x05\xcd\x02\x06\x02~\x00\x00\xff\xff\x00^\xff\ +\xee\x047\x04d\x02\x06\x02\x7f\x00\x00\xff\xff\x00\x87\xff\ +\xec\x05\x8d\x07>\x02&\x02~\x00\x00\x01\x07\x00j\x00\ +\xc5\x01R\x00\x0c\xb5\x04\x0355\x05&\x00+\x115\ +5\xff\xff\x00^\xff\xee\x047\x05\xec\x02&\x02\x7f\x00\ +\x00\x01\x06\x00j\xea\x00\x00\x0c\xb5\x04\x0344\x11&\ +\x00+\x1155\xff\xff\x00\x17\xff\xec\x04\x89\x07>\x02\ +&\x01\xc7\x00\x00\x01\x07\x00j\xff\xfb\x01R\x00\x0c\xb5\ +\x02\x0122\x05&\x00+\x1155\xff\xff\x00\x19\xff\ +\xec\x03j\x05\xec\x02&\x01\xe7\x00\x00\x01\x07\x00j\xff\ +S\x00\x00\x00\x0c\xb5\x02\x0111\x11&\x00+\x115\ +5\xff\xff\x00\x0c\xff\xec\x05j\x06\xdb\x02&\x01\xbd\x00\ +\x00\x01\x07\x01M\x00d\x01R\x00\x0a\xb4\x01\x19\x19\x05\ +&\x00+\x115\xff\xff\xffV\xfe\x14\x04R\x05\x89\x02\ +&\x00\x5c\x00\x00\x01\x06\x01M\xb3\x00\x00\x0a\xb4\x01\x1b\ +\x1b\x11&\x00+\x115\xff\xff\x00\x0c\xff\xec\x05j\x07\ +>\x02&\x01\xbd\x00\x00\x01\x07\x00j\x009\x01R\x00\ +\x0c\xb5\x02\x01++\x05&\x00+\x1155\xff\xff\xff\ +V\xfe\x14\x04R\x05\xec\x02&\x00\x5c\x00\x00\x01\x06\x00\ +j\x94\x00\x00\x0c\xb5\x02\x01--\x11&\x00+\x115\ +5\xff\xff\x00\x0c\xff\xec\x05j\x07s\x02&\x01\xbd\x00\ +\x00\x01\x07\x01S\x00\xa6\x01R\x00\x0c\xb5\x02\x01((\ +\x05&\x00+\x1155\xff\xff\xffV\xfe\x14\x04~\x06\ +!\x02&\x00\x5c\x00\x00\x01\x06\x01S\xe6\x00\x00\x0c\xb5\ +\x02\x01**\x11&\x00+\x1155\xff\xff\x00\xd9\x00\ +\x00\x05J\x07>\x02&\x01\xc1\x00\x00\x01\x07\x00j\x00\ +\x8b\x01R\x00\x0c\xb5\x02\x01**\x05&\x00+\x115\ +5\xff\xff\x00\xa0\x00\x00\x04h\x05\xec\x02&\x01\xe1\x00\ +\x00\x01\x06\x00j\xef\x00\x00\x0c\xb5\x02\x0100\x11&\ +\x00+\x1155\x00\x01\x00F\xfem\x04\x81\x05\xb6\x00\ +\x09\x00\x1c@\x0e\x06#\x09\x02LY\x09\x03\x08\x03L\ +Y\x08\x12\x00?+\x00\x18?+\x00\x18?10\x01\ +\x07!\x033\x03#\x13#\x01\x04\x81+\xfd\xe5\xdf\xdb\ +\x81\xe7V\xdf\x015\x05\xb6\xcd\xfb\xe0\xfd\xa4\x01\x93\x05\ +\xb6\x00\x01\x00/\xfey\x03\xa8\x04R\x00\x09\x00\x1c@\ +\x0e\x08\x22\x01\x04FY\x01\x0f\x00\x05FY\x00\x15\x00\ +?+\x00\x18?+\x00\x18?103\x13!\x07!\ +\x033\x03#\x13/\xec\x02\x8d)\xfe\x5c\x97\xb8{\xe3\ +X\x04R\xc3\xfd4\xfd\xb6\x01\x87\x00\xff\xff\x00F\x00\ +\x00\x06\x9a\x07>\x02&\x01\xc5\x00\x00\x01\x07\x00j\x01\ +;\x01R\x00\x0c\xb5\x04\x03--\x05&\x00+\x115\ +5\xff\xff\x00u\xff\xec\x05\xe7\x05\xec\x02&\x01\xe5\x00\ +\x00\x01\x07\x00j\x00\xaa\x00\x00\x00\x0c\xb5\x04\x0388\ +\x11&\x00+\x1155\x00\x01\x00)\xfeD\x04}\x05\ +\xb6\x00\x1a\x004@\x1c\x00\x05KY\x00\x09\x09\x16L\ +Y\x15\x0b\x0c\x0bLY\x12\x0c\x0c\x0e\x09\x12\x0e\x11L\ +Y\x0e\x03\x00?+\x00\x18?\x129/3+\x11\x00\ +3+\x00\x18\x10\xc4+10\x13\x22'5\x1632\ +77#\x13#73\x13!\x07!\x03!\x07!\x03\ +3\x03\x06\x06\xb6V773h\x1e\x16\xe9\x83\x94+\ +\x94\x87\x03\x02+\xfd\xe9\x5c\x01>+\xfe\xc2T\xdbK\ +!\x97\xfeD\x18\xbf\x15\x8dm\x02o\xc8\x02\x7f\xcd\xfe\ +N\xc8\xfer\xfe\x94\x9e\x93\x00\x00\x01\x00\x00\xfeD\x03\ +\xaa\x04R\x00\x1a\x008@\x1d\x15\x0b\x0c\x0bHY\x12\ +\x0c\x0c\x09\x0e\x00\x05FY\x00\x09\x0e\x11FY\x0e\x0f\ +\x09\x16FY\x09\x15\x00?+\x00\x18?+\x00\x18\x10\ +\xc4+\x11\x12\x009\x18/3+\x11\x00310\x13\ +\x22'5\x163277#\x13#73\x13!\x07\ +!\x03!\x07!\x073\x03\x06\x06\x9eZ247e\ + \x17\xeab\x91%\x91e\x02\x8f+\xfe\x5c;\x01\x0a\ +'\xfe\xf87\xdbF!\x97\xfeD\x18\xbf\x15\x8dm\x01\ +\xc5\xb4\x01\xd9\xc3\xfe\xea\xb4\xfc\xfe\xac\x9e\x93\x00\x01\xff\ +\x91\xfeD\x05%\x05\xb6\x00\x18\x00(@\x14\x0a\x10\x0c\ +\x0e\x00\x05KY\x00\x0c\x11\x0e\x03\x09\x14LY\x09\x0c\ +\x12\x00?3+\x00\x18?3\x10\xc4+\x11\x12\x009\ +910\x01\x22'5\x163277#\x03\x01!\ +\x01\x033\x13\x01!\x01\x133\x03\x06\x06\x03\x12V7\ +74g\x1e\x16{\xc0\xfeJ\xfe\xf7\x02J\xfa\xf6\xb2\ +\x01\x92\x01\x0a\xfd\xd9\xbe\xdcL!\x97\xfeD\x18\xbf\x15\ +\x8dm\x02P\xfd\xb0\x03\x02\x02\xb4\xfd\xe4\x02\x1c\xfd:\ +\xfd\xf1\xfe\x94\x9e\x93\x00\x00\x01\xff\xa8\xfeD\x04T\x04\ +R\x00\x18\x00)@\x15\x0a\x10\x09\x0e\x00\x05FY\x00\ +\x09\x11\x0e\x0f\x0c\x15\x09\x14FY\x09\x15\x00?+\x00\ +\x18??3\x10\xc4+\x11\x12\x009910\x01\x22\ +'5\x163277#\x03\x01!\x01\x033\x13\x01\ +!\x01\x133\x03\x06\x06\x02\x81Y473i\x1c\x17\ +q\xa0\xfe\xcf\xfe\xf0\x01\xdd\xe7\xf5\x90\x01\x1f\x01\x12\xfe\ +3\xa0\xd9F!\x96\xfeD\x18\xbf\x15\x8dm\x01\x83\xfe\ +}\x029\x02\x19\xfe\x8b\x01u\xfd\xdb\xfe\x9c\xfe\xac\x9d\ +\x94\x00\x01\xff\x91\x00\x00\x05%\x05\xb6\x00\x11\x00)@\ +\x14\x03\x0c\x05\x0a\x00\x07\x08\x07LY\x0f\x08\x08\x05\x0d\ +\x0a\x03\x02\x05\x12\x00?3?3\x129/3+\x11\ +\x003\x11\x129910\x01\x13!\x03\x01!\x01#\ +7!\x033\x13\x01!\x01!\x07\x03\x1f\xf1\xff\x00\xc0\ +\xfeJ\xfe\xf7\x01\xf6\xfe+\x01\x06\xd9\xf6\xb2\x01\x92\x01\ +\x0a\xfe-\x01\x02+\x02\x93\xfdm\x02P\xfd\xb0\x02\x93\ +\xcb\x02X\xfd\xe4\x02\x1c\xfd\xa8\xcb\x00\x00\x01\xff\xaa\x00\ +\x00\x04T\x04R\x00\x11\x00)@\x14\x0d\x04\x0f\x02\x0a\ +\x11\x00\x11HY\x07\x00\x00\x0f\x05\x02\x0f\x0c\x0f\x15\x00\ +?3?3\x129/3+\x11\x003\x11\x1299\ +10\x133\x033\x13\x01!\x013\x07#\x13#\x03\ +\x01!\x01#\x7f\xe3\xc4\xf5\x90\x01\x1f\x01\x12\xfe\x85\xe5\ +&\xee\xd5\xf6\xa0\xfe\xcf\xfe\xf2\x01\x8f\xe1\x02\x8d\x01\xc5\ +\xfe\x8b\x01u\xfe;\xb0\xfe#\x01\x83\xfe}\x01\xdd\x00\ +\x02\x00N\x00\x00\x04\xa0\x05\xb6\x00\x0a\x00\x12\x00\x1d@\ +\x0f\x03\x0cKY\x03\x03\x08\x05\x03\x08\x11LY\x08\x12\ +\x00?+\x00\x18?\x129/+10\x134$!\ +3\x133\x01!\x22&\x01#\x22\x06\x15\x1433N\ +\x01=\x01\x1d\x8b\x7f\xee\xfe\xca\xfe\xb7\xea\xe9\x02\xba}\ +\x9d\xaf\xf2u\x01\x8b\xde\xfb\x02R\xfaJ\xcc\x01\xd2\x87\ +\x81\xcd\x00\xff\xff\x00^\xff\xec\x04\xdd\x06\x14\x02\x06\x00\ +G\x00\x00\x00\x02\x00R\xff\xec\x06^\x05\xb6\x00\x1d\x00\ +(\x001@\x18\x07\x12\x1d\x1d\x0a\x12\x10\x1fLY\x10\ +\x10\x0a\x12\x03\x19%\x0a%LY\x04\x0a\x13\x00?3\ ++\x11\x003\x18?\x129/+\x11\x12\x009\x18/\ +\x11910\x01\x03\x06\x06#\x22&'\x06\x06#\x22\ +&54\x00!3\x133\x03\x06\x15\x14\x16326\ +7\x13\x05#\x22\x06\x15\x14\x163267\x06^d\ +)\xd6\xbej\x97%K\xa2e\xaf\xc4\x01Q\x01 v\ +}\xee\xe3\x09LBPa\x17_\xfd\xa1V\xb4\xc0[\ +QXu\x14\x03P\xfe!\xc0\xc5NGOD\xbd\xab\ +\xf3\x01\x1b\x02R\xfb\xcf$\x1fEGlm\x01\xc1\xb6\ +\xa1\x95S[e\x5c\x00\x00\x02\x00^\xff\xec\x06j\x06\ +\x14\x00#\x000\x00.@\x17\x07\x07\x1d\x10\x12\x19 \ +\x00\x19+FY\x19\x10\x03$\x12$FY\x0c\x12\x16\ +\x00?3+\x11\x003\x18?+\x00\x18?\x11\x129\ +99/10\x01\x14\x163267\x133\x03\x06\ +\x06#\x22&'#\x06#\x22&54\x12632\ +\x16\x17367\x133\x03\x06\x0526\x1254&\ +#\x22\x06\x02\x15\x14\x03\xdfJF[`\x1a;\xebC\ +,\xd1\xb7\x84\xa1\x1f\x0a\xa1\xda\xa1\xab\x87\xec\x95Z\x8f\ +,\x08\x10\x15L\xe9\xf1\x0d\xfe\x0dU\x9f]V\x5cV\ +\x92W\x01?EPx~\x01\x1c\xfe\xc1\xd3\xbeo[\ +\xca\xd2\xb9\xc4\x01c\xc8ZX\x9c`\x01d\xfb\x924\ +\xc8\xa4\x01\x08\x87[n\x96\xfe\xf6\x91\xcb\x00\x00\x01\x00\ +\xdd\xff\xec\x06`\x05\xcb\x00-\x006@\x1b\x0f\x0f\x14\ ++\x03\x1e\x1f\x1f\x1eKY\x1f\x1f\x14++&KY\ ++\x04\x14\x0bLY\x14\x13\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x009\x11\x129\x18/1\ +0\x01\x14\x06\x07\x15\x16\x16\x15\x07\x14\x163267\ +\x133\x03\x06\x06#\x22&54654&##\ +732654&#\x22\x07'6!2\x16\x04\ +;\xbf\xa9{n\x06FLSa\x1bZ\xefd+\xd5\ +\xc3\xb6\xbe\x0a}\x85\xd7'\xb4\xb0\xc5h[\x99\xaf^\ +\xd0\x01\x07\xb4\xd3\x04}\x94\xd4%\x07\x1b\x80o\x8dO\ +Mj\x80\x01\xb0\xfe!\xcc\xb9\xa5\xa0#R3b[\ +\xb4\x8e\x82UWn\xa5\x8e\xb8\x00\x01\x00\x8f\xff\xec\x05\ +\xc1\x04f\x00'\x006@\x1b\x07\x07\x0c %\x14\x15\ +\x15\x14HY\x15\x15\x0c \x1bGY \x10\x0c\x03\ +FY\x0c\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x009\x11\x129\x18/10\x01\x15\x14\ +3267\x133\x03\x06\x06#\x22&574&\ +##732654#\x22\x07'632\x16\ +\x15\x14\x05\x15\x16\x037\x8cZ`\x19?\xecD)\xd6\ +\xc4\xad\xb9\x02Yr\x99'v\x8b\x82\xa4w\xb2@\xc1\ +\xc2\xb2\xbd\xff\x00\xb6\x01j?\x81qt\x01-\xfe\xc1\ +\xce\xc3\x92\x8eBQF\xb3NQwJ\xaeT\x8a\x80\ +\xdd=\x05\x1d\x00\x00\x01\x00\xbc\xfem\x04u\x05\xcb\x00\ +'\x000@\x19\x1d\x08\x09\x09\x08KY\x09\x09\x01\x16\ +'#\x16\x10KY\x16\x04\x01$LY\x01\x12\x00?\ ++\x00\x18?+\x00\x18?\x11\x129/+\x11\x12\x00\ +910!#\x13654&##7326\ +54&#\x22\x07'6632\x16\x16\x15\x14\x06\ +\x07\x15\x16\x16\x15\x14\x06\x073\x03#\x03b\xe5N\x10\ +}}\xeb)\xac\xb5\xcci`\xb2\xba[\x7f\xe8\x8dx\ +\xb7c\xd4\xb8\x88\x8d\x0d$\xdb\x7f\xea\x01hS\x1e[\ +b\xbe\x8byU[y\xa6RDT\x98`\xa5\xc7\x19\ +\x04\x11\x91s\x1bP\xad\xfd\xa4\x00\x01\x00\xa4\xfe{\x03\ +\xee\x04f\x00$\x000@\x19!\x0f\x10\x10\x0fHY\ +\x10\x10\x08\x1b\x06\x22\x1b\x16GY\x1b\x10\x08\x03FY\ +\x08\x15\x00?+\x00\x18?+\x00\x18?\x11\x129/\ ++\x11\x12\x00910\x01\x14\x06\x073\x03#\x13#\ +\x13654&##732654#\x22\x07\ +'632\x16\x15\x14\x06\x07\x15\x16\x16\x03L\x05\x14\ +\xbb}\xe0V\xc0;\x0bb[\xaa's\x8c\x82\xa4s\ +\xb4?\xc1\xc4\xb2\xbf\x83\x81V`\x01o\x191b\xfd\ +\xb8\x01\x85\x01\x040(L=\xb3POwJ\xaeT\ +\x8a\x80k\x91\x1e\x05\x14g\x00\x00\x01\xff\xc1\xff\xe9\x07\ +\x10\x05\xb6\x00$\x00'@\x13\x09\x09\x19$$\x15L\ +Y$\x03\x05\x1e\x19\x1eLY\x0e\x19\x13\x00?3+\ +\x11\x003\x18?+\x11\x12\x009\x18/10\x01\x03\ +\x06\x15\x143267\x133\x03\x06\x06#\x22&5\ +47\x13!\x02\x02\x06#\x22'5\x163266\ +\x12\x12\x13\x05N\xd7\x13\x90Te\x1aZ\xeff*\xd5\ +\xc2\xad\xc5\x18\xa4\xfe\xd1\x87\xb9\xce\xb0Q47-D\ +XSj\x8eF\x05\xb6\xfc\x11]+\x89m}\x01\xb0\ +\xfe#\xca\xbd\xa5\x98Mo\x03\x02\xfd\xf8\xfd\xdd\xd3\x19\ +\xc9\x15?\x90\x012\x01\xf3\x01\x0c\x00\x00\x01\xff\xb2\xff\ +\xec\x06T\x04`\x00.\x00+@\x16\x07\x07\x1c**\ +\x14FY*\x10\x1c!FY\x1c\x16\x0c\x03FY\x0c\ +\x16\x00?+\x00\x18?+\x00\x18?+\x11\x12\x009\ +\x18/10\x01\x14\x163267\x133\x03\x06\x06\ +#\x22&547\x13&#\x22\x06\x06\x07\x0e\x02#\ +\x22'5\x1632667>\x0332\x17\x03\x06\ +\x03\xcbIDT^!;\xeeF+\xd9\xc0\xb3\xb8\x0f\ +j%!H^QJWj\x8aa@3$(1\ +JEDIcx\xa2s\x9c\x8b\x8b\x0c\x019GH\ +d\x92\x01\x1c\xfe\xb5\xcc\xb9\xa5\x94?<\x01\xf8\x08@\ +\x96\xda\xfb\xb1V\x14\xc5\x0fA\x85\xc4\xd1\xb5g1+\ +\xfda5\x00\x01\x00F\xff\xec\x07P\x05\xb6\x00\x1c\x00\ +,@\x16\x06\x06\x14\x15\x17\x12LY\x17\x17\x14\x19\x15\ +\x03\x14\x12\x0b\x02LY\x0b\x13\x00?+\x00\x18??\ +3\x129/+\x11\x12\x009\x18/10\x01\x143\ +267\x133\x03\x06\x06#\x22&5477!\ +\x03#\x013\x03!\x133\x03\x06\x04\xa4\x91Vc\x1a\ +Z\xeed-\xd5\xbf\xae\xc7\x19%\xfd\xca\x8b\xed\x015\ +\xed\x7f\x026\x7f\xef\xdb\x0e\x01?\x89pz\x01\xb0\xfe\ +#\xce\xb9\xaa\x97?s\xb4\xfdm\x05\xb6\xfd\xaa\x02V\ +\xfb\xf4K\x00\x01\x00/\xff\xec\x06\x93\x04R\x00\x1d\x00\ +,@\x16\x13\x13\x03\x04\x06\x01GY\x06\x06\x03\x08\x04\ +\x0f\x03\x15\x18\x0fFY\x18\x16\x00?+\x00\x18??\ +3\x129/+\x11\x12\x009\x18/10\x01!\x03\ +#\x133\x03!\x133\x03\x06\x15\x14\x163267\ +\x133\x03\x06\x06#\x22&546\x039\xfeHf\ +\xec\xee\xe9^\x01\xba_\xe9\x93\x0dLFV`\x1b;\ +\xeb=4\xdc\xbb\xb2\xba\x05\x01\xdd\xfe#\x04R\xfeD\ +\x01\xbc\xfdJ:'EFn\x82\x01\x1c\xfe\xe2\xea\xc8\ +\xa5\x94\x195\x00\x00\x01\x00\x87\xff\xec\x05w\x05\xcb\x00\ +\x1e\x00&@\x14\x00\x1eLY\x00\x00\x06\x0d\x0d\x13L\ +Y\x0d\x04\x06\x1aLY\x06\x13\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+10\x01!\x07\x06\x02\x04#\ + \x00\x11\x10\x12$32\x17\x07&&#\x22\x04\x02\ +\x15\x14\x163267!\x03\x10\x02g\x1d.\xa7\xfe\ +\xf2\xc5\xfe\xf8\xfe\xdd\xd1\x01r\xee\xee\xb6Zf\x97U\ +\x9f\xfe\xfe\x90\xa4\xa0\xa4\xc3(\xfe\x93\x03\x10\x97\xf0\xfe\ +\xee\x8b\x01,\x01\x0f\x01\x06\x01\xad\xf1Z\xcb2$\xbb\ +\xfe\xb4\xc8\xb7\xbe\xbe\xce\x00\x01\x00^\xff\xec\x04\x89\x04\ +f\x00\x1b\x00&@\x14\x00\x1bGY\x00\x00\x05\x0c\x0c\ +\x11FY\x0c\x10\x05\x17GY\x05\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+10\x01!\x07\x02\x04\ +#\x22&54\x12$32\x17\x07&#\x22\x02\x15\ +\x14\x163267!\x02w\x02\x12\x1a:\xfe\xed\xf5\ +\xd9\xf6\xa3\x01.\xc7\xd9\x91V\x86\x90\xc3\xe5\x7fr|\ +\x9f\x1b\xfe\xdd\x02j|\xfe\xf9\xfb\xeb\xd5\xca\x01A\xaf\ +T\xb4J\xfe\xeb\xe9|\x86\x87\x83\x00\x00\x01\x00\xb0\xff\ +\xec\x05\x06\x05\xb6\x00\x19\x00%@\x12\x0e\x0e\x13\x01\x04\ +\x00\x01\x00LY\x01\x03\x13\x0aLY\x13\x13\x00?+\ +\x00\x18?+\x11\x003\x11\x129\x18/10\x137\ +!\x07!\x03\x06\x15\x14\x163267\x133\x03\x06\ +\x06#\x22&547\x13\xb0-\x03\xec-\xfe}\xb1\ +\x0eIISc\x1c[\xedd-\xd5\xbf\xae\xc6\x16\xaa\ +\x04\xe9\xcd\xcd\xfc\xc1K AHh\x82\x01\xb0\xfe#\ +\xce\xb9\xa4\x99?c\x03\x1e\x00\x00\x01\x00Z\xff\xec\x04\ +\x8f\x04R\x00\x19\x00%@\x12\x07\x07\x0c\x14\x17\x13\x14\ +\x13GY\x14\x0f\x0c\x03FY\x0c\x16\x00?+\x00\x18\ +?+\x11\x003\x11\x129\x18/10\x01\x14\x163\ +267\x133\x03\x06\x06#\x22&547\x13!\ +7!\x07!\x03\x06\x02\x06IDT^!<\xedE\ ++\xda\xc0\xb2\xb8\x16e\xfe\xc4%\x03d)\xfe\xc3k\ +\x0c\x019GHd\x92\x01\x1c\xfe\xb5\xca\xbb\xa7\x94B\ +^\x01\xd1\xba\xba\xfd\xfe5\x00\x00\x01\x00^\xff\xec\x04\ +\xc9\x05\xcb\x00%\x00-@\x17\x1f\x0e\x0b\x0b\x0eKY\ +\x0b\x0b\x18\x00\x00\x06LY\x00\x04\x18\x13KY\x18\x13\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x012\x16\x17\x07&#\x22\x06\x15\x14!\ +3\x07# \x11\x14\x16327\x15\x06#\x22&5\ +4675&&5466\x03\x17\x80\xceds\ +\x99\xabv\x92\x01\x1f\xa2)\x98\xfeN\x8c\x89\xb7\xc1\xb7\ +\xf5\xe0\xfb\xd7\xd5o|\x81\xe5\x05\xcbBL\xacsz\ +g\xcf\xbe\xfe\xedfk^\xd1S\xc9\xad\xad\xd3\x1a\x06\ +\x22\x99p\x7f\xbcc\x00\xff\xff\x003\xff\xec\x03\xe5\x04\ +f\x02\x06\x01\x82\x00\x00\x00\x01\xff\xc1\xfeD\x05d\x05\ +\xb6\x00 \x00,@\x18\x06\x0f\x0f\x01LY\x0f\x12\x06\ +\x0bKY\x15\x1aLY\x15\x13 \x11LY \x03\x00\ +?+\x00\x18?++\x00\x18?+\x00\x18\x10\xc41\ +0\x01\x013\x03\x06\x06#\x22'5\x163277\ +#\x01!\x02\x02\x06#\x22'5\x163266\x12\ +\x12\x13\x05d\xfe\xf8\xddK\x22\x96\x82Y255f\ + \x14\xee\x01\x0d\xfe\xb8\x87\xb9\xce\xb0Q47-D\ +XSj\x8eF\x05\xb6\xfb+\xfe\x94\xa1\x90\x18\xbf\x15\ +\x8dm\x04\xe7\xfd\xf8\xfd\xdd\xd3\x19\xc9\x15?\x90\x012\ +\x01\xf3\x01\x0c\x00\x00\x01\xff\xb2\xfeD\x04\x83\x04`\x00\ +)\x00,@\x18\x05\x0aFY\x05\x0e\x0e\x00FY\x0e\ +\x15'\x11FY'\x10\x19\x1eFY\x19\x16\x00?+\ +\x00\x18?+\x00\x18?+\x00\x18\x10\xc4+10%\ +3\x03\x06\x06#\x22'5\x163277#\x13&\ +#\x22\x06\x06\x07\x0e\x02#\x22'5\x163266\ +7>\x0332\x17\x03\xa8\xdbF!\x97\x83Y25\ +5e \x17\xea\xc5%!H^QJWj\x8aa\ +@3$(1JEDIcx\xa2s\x9c\x8b\xc9\ +\xfe\xac\x9e\x93\x18\xbf\x15\x8dm\x03\x98\x08@\x96\xda\xfb\ +\xb1V\x14\xc5\x0fA\x85\xc4\xd1\xb5g1+\xff\xff\xff\ +\x87\xfey\x04N\x05\xb8\x02&\x00$\x00\x00\x00\x07\x02\ +g\x04\xcb\x00\x00\xff\xff\x00^\xfey\x04\x7f\x04f\x02\ +&\x00D\x00\x00\x00\x07\x02g\x04\xb6\x00\x00\xff\xff\xff\ +\x87\x00\x00\x04N\x07\xea\x02&\x00$\x00\x00\x01\x07\x02\ +f\x05\x0e\x01R\x00\x0a\xb4\x02\x13\x13\x05&\x00+\x11\ +5\xff\xff\x00^\xff\xec\x04\x7f\x06\x98\x02&\x00D\x00\ +\x00\x01\x07\x02f\x04\xba\x00\x00\x00\x0a\xb4\x02%%\x11\ +&\x00+\x115\xff\xff\xff\x87\x00\x00\x05\xba\x07\xd1\x02\ +&\x00$\x00\x00\x01\x07\x03w\x05\x04\x01R\x00\x0c\xb5\ +\x03\x02\x19\x19\x05&\x00+\x1155\xff\xff\x00^\xff\ +\xec\x05^\x06\x7f\x02&\x00D\x00\x00\x01\x07\x03w\x04\ +\xa8\x00\x00\x00\x0c\xb5\x03\x02++\x11&\x00+\x115\ +5\xff\xff\xff\x87\x00\x00\x04q\x07\xd1\x02&\x00$\x00\ +\x00\x01\x07\x03x\x05\x04\x01R\x00\x0c\xb5\x03\x02\x19\x19\ +\x05&\x00+\x1155\xff\xff\x00^\xff\xec\x04\x7f\x06\ +\x7f\x02&\x00D\x00\x00\x01\x07\x03x\x04\xb2\x00\x00\x00\ +\x0c\xb5\x03\x02++\x11&\x00+\x1155\xff\xff\xff\ +\x87\x00\x00\x05`\x08;\x02&\x00$\x00\x00\x01\x07\x03\ +y\x05\x04\x01R\x00\x0c\xb5\x03\x02\x19\x19\x05&\x00+\ +\x1155\xff\xff\x00^\xff\xec\x05\x0c\x06\xe9\x02&\x00\ +D\x00\x00\x01\x07\x03y\x04\xb0\x00\x00\x00\x0c\xb5\x03\x02\ +++\x11&\x00+\x1155\xff\xff\xff\x87\x00\x00\x04\ +\xdd\x08b\x02&\x00$\x00\x00\x01\x07\x03z\x05\x04\x01\ +R\x00\x0c\xb5\x03\x0200\x05&\x00+\x1155\xff\ +\xff\x00^\xff\xec\x04\x87\x07\x10\x02&\x00D\x00\x00\x01\ +\x07\x03z\x04\xae\x00\x00\x00\x0c\xb5\x03\x02BB\x11&\ +\x00+\x1155\xff\xff\xff\x87\xfey\x04\x85\x07s\x02\ +&\x00$\x00\x00\x00'\x02g\x04\xcb\x00\x00\x01\x07\x01\ +K\x00Z\x01R\x00\x0a\xb4\x03\x1b\x1b\x05&\x00+\x11\ +5\xff\xff\x00^\xfey\x04\x7f\x06!\x02&\x00D\x00\ +\x00\x00'\x02g\x04\xb6\x00\x00\x01\x06\x01K\xf9\x00\x00\ +\x0a\xb4\x03--\x11&\x00+\x115\xff\xff\xff\x87\x00\ +\x00\x04\xb2\x08\x13\x02&\x00$\x00\x00\x01\x07\x03{\x05\ +\x1f\x01R\x00\x0c\xb5\x03\x02\x0f\x0f\x05&\x00+\x115\ +5\xff\xff\x00^\xff\xec\x04\x7f\x06\xc1\x02&\x00D\x00\ +\x00\x01\x07\x03{\x04\xb8\x00\x00\x00\x0c\xb5\x03\x02!!\ +\x11&\x00+\x1155\xff\xff\xff\x87\x00\x00\x04\x95\x08\ +\x13\x02&\x00$\x00\x00\x01\x07\x03|\x05\x02\x01R\x00\ +\x0c\xb5\x03\x02\x18\x18\x05&\x00+\x1155\xff\xff\x00\ +^\xff\xec\x04\x7f\x06\xc1\x02&\x00D\x00\x00\x01\x07\x03\ +|\x04\xb8\x00\x00\x00\x0c\xb5\x03\x02**\x11&\x00+\ +\x1155\xff\xff\xff\x87\x00\x00\x04\x91\x08X\x02&\x00\ +$\x00\x00\x01\x07\x03}\x04\xfe\x01R\x00\x0c\xb5\x03\x02\ +\x22\x22\x05&\x00+\x1155\xff\xff\x00^\xff\xec\x04\ +\x7f\x07\x06\x02&\x00D\x00\x00\x01\x07\x03}\x04\xb6\x00\ +\x00\x00\x0c\xb5\x03\x0244\x11&\x00+\x1155\xff\ +\xff\xff\x87\x00\x00\x04\xd1\x08b\x02&\x00$\x00\x00\x01\ +\x07\x03~\x04\xfe\x01R\x00\x0c\xb5\x03\x02$$\x05&\ +\x00+\x1155\xff\xff\x00^\xff\xec\x04\x87\x07\x10\x02\ +&\x00D\x00\x00\x01\x07\x03~\x04\xb4\x00\x00\x00\x0c\xb5\ +\x03\x0266\x11&\x00+\x1155\xff\xff\xff\x87\xfe\ +y\x04\x92\x07Z\x02&\x00$\x00\x00\x00'\x01N\x00\ +H\x01R\x01\x07\x02g\x04\xcb\x00\x00\x00\x0a\xb4\x02\x12\ +\x12\x05&\x00+\x115\xff\xff\x00^\xfey\x04\x7f\x06\ +\x08\x02&\x00D\x00\x00\x00&\x01N\x04\x00\x01\x07\x02\ +g\x04\xb6\x00\x00\x00\x0a\xb4\x02$$\x11&\x00+\x11\ +5\xff\xff\x00F\xfey\x04\x83\x05\xb6\x02&\x00(\x00\ +\x00\x00\x07\x02g\x04\x98\x00\x00\xff\xff\x00^\xfey\x03\ +\xfa\x04f\x02&\x00H\x00\x00\x00\x07\x02g\x04\x96\x00\ +\x00\xff\xff\x00F\x00\x00\x04\x83\x07\xea\x02&\x00(\x00\ +\x00\x01\x07\x02f\x04\xe1\x01R\x00\x0a\xb4\x01\x10\x10\x05\ +&\x00+\x115\xff\xff\x00^\xff\xec\x03\xfa\x06\x98\x02\ +&\x00H\x00\x00\x01\x07\x02f\x04\x8d\x00\x00\x00\x0a\xb4\ +\x02((\x11&\x00+\x115\xff\xff\x00F\x00\x00\x04\ +\xa8\x07H\x02&\x00(\x00\x00\x01\x07\x01R\x00P\x01\ +R\x00\x0a\xb4\x01\x15\x15\x05&\x00+\x115\xff\xff\x00\ +^\xff\xec\x04K\x05\xf6\x02&\x00H\x00\x00\x01\x06\x01\ +R\xf3\x00\x00\x0a\xb4\x02--\x11&\x00+\x115\xff\ +\xff\x00F\x00\x00\x05\x9d\x07\xd1\x02&\x00(\x00\x00\x01\ +\x07\x03w\x04\xe7\x01R\x00\x0c\xb5\x02\x01\x16\x16\x05&\ +\x00+\x1155\xff\xff\x00^\xff\xec\x05A\x06\x7f\x02\ +&\x00H\x00\x00\x01\x07\x03w\x04\x8b\x00\x00\x00\x0c\xb5\ +\x03\x02..\x11&\x00+\x1155\xff\xff\x00F\x00\ +\x00\x04\x83\x07\xd1\x02&\x00(\x00\x00\x01\x07\x03x\x04\ +\xe7\x01R\x00\x0c\xb5\x02\x01\x16\x16\x05&\x00+\x115\ +5\xff\xff\x00^\xff\xec\x03\xfa\x06\x7f\x02&\x00H\x00\ +\x00\x01\x07\x03x\x04\x8b\x00\x00\x00\x0c\xb5\x03\x02..\ +\x11&\x00+\x1155\xff\xff\x00F\x00\x00\x05C\x08\ +;\x02&\x00(\x00\x00\x01\x07\x03y\x04\xe7\x01R\x00\ +\x0c\xb5\x02\x01\x16\x16\x05&\x00+\x1155\xff\xff\x00\ +^\xff\xec\x04\xe7\x06\xe9\x02&\x00H\x00\x00\x01\x07\x03\ +y\x04\x8b\x00\x00\x00\x0c\xb5\x03\x02..\x11&\x00+\ +\x1155\xff\xff\x00F\x00\x00\x04\xc0\x08b\x02&\x00\ +(\x00\x00\x01\x07\x03z\x04\xe7\x01R\x00\x0c\xb5\x02\x01\ +--\x05&\x00+\x1155\xff\xff\x00^\xff\xec\x04\ +d\x07\x10\x02&\x00H\x00\x00\x01\x07\x03z\x04\x8b\x00\ +\x00\x00\x0c\xb5\x03\x02EE\x11&\x00+\x1155\xff\ +\xff\x00F\xfey\x04\x83\x07s\x02&\x00(\x00\x00\x00\ +'\x02g\x04\x98\x00\x00\x01\x07\x01K\x00?\x01R\x00\ +\x0a\xb4\x02\x18\x18\x05&\x00+\x115\xff\xff\x00^\xfe\ +y\x04\x07\x06!\x02&\x00H\x00\x00\x00'\x02g\x04\ +\x96\x00\x00\x01\x06\x01K\xdc\x00\x00\x0a\xb4\x0300\x11\ +&\x00+\x115\xff\xff\xff\xcf\x00\x00\x03E\x07\xea\x02\ +&\x00,\x00\x00\x01\x07\x02f\x04\x12\x01R\x00\x0a\xb4\ +\x01\x10\x10\x05&\x00+\x115\xff\xff\x00/\x00\x00\x02\ +\xc4\x06\x98\x02&\x00\xf3\x00\x00\x01\x07\x02f\x03\x91\x00\ +\x00\x00\x0a\xb4\x01\x08\x08\x11&\x00+\x115\xff\xff\xff\ +\xcf\xfey\x03?\x05\xb6\x02&\x00,\x00\x00\x00\x07\x02\ +g\x03\xb6\x00\x00\xff\xff\xff\xeb\xfey\x02V\x05\xfa\x02\ +&\x00L\x00\x00\x00\x07\x02g\x03d\x00\x00\xff\xff\x00\ +\x87\xfey\x05\x8d\x05\xcd\x02&\x002\x00\x00\x00\x07\x02\ +g\x05B\x00\x00\xff\xff\x00^\xfey\x047\x04d\x02\ +&\x00R\x00\x00\x00\x07\x02g\x04\xc1\x00\x00\xff\xff\x00\ +\x87\xff\xec\x05\x8d\x07\xea\x02&\x002\x00\x00\x01\x07\x02\ +f\x05\x93\x01R\x00\x0a\xb4\x02 \x05&\x00+\x11\ +5\xff\xff\x00^\xff\xee\x047\x06\x98\x02&\x00R\x00\ +\x00\x01\x07\x02f\x04\x9e\x00\x00\x00\x0a\xb4\x02 \x11\ +&\x00+\x115\xff\xff\x00\x87\xff\xec\x06'\x07\xd1\x02\ +&\x002\x00\x00\x01\x07\x03w\x05q\x01R\x00\x0c\xb5\ +\x03\x02&&\x05&\x00+\x1155\xff\xff\x00^\xff\ +\xee\x05N\x06\x7f\x02&\x00R\x00\x00\x01\x07\x03w\x04\ +\x98\x00\x00\x00\x0c\xb5\x03\x02&&\x11&\x00+\x115\ +5\xff\xff\x00\x87\xff\xec\x05\x8d\x07\xd1\x02&\x002\x00\ +\x00\x01\x07\x03x\x05o\x01R\x00\x0c\xb5\x03\x02&&\ +\x05&\x00+\x1155\xff\xff\x00^\xff\xee\x047\x06\ +\x7f\x02&\x00R\x00\x00\x01\x07\x03x\x04\x98\x00\x00\x00\ +\x0c\xb5\x03\x02&&\x11&\x00+\x1155\xff\xff\x00\ +\x87\xff\xec\x05\xcb\x08;\x02&\x002\x00\x00\x01\x07\x03\ +y\x05o\x01R\x00\x0c\xb5\x03\x02&&\x05&\x00+\ +\x1155\xff\xff\x00^\xff\xee\x04\xf4\x06\xe9\x02&\x00\ +R\x00\x00\x01\x07\x03y\x04\x98\x00\x00\x00\x0c\xb5\x03\x02\ +&&\x11&\x00+\x1155\xff\xff\x00\x87\xff\xec\x05\ +\x8d\x08b\x02&\x002\x00\x00\x01\x07\x03z\x05o\x01\ +R\x00\x0c\xb5\x03\x02==\x05&\x00+\x1155\xff\ +\xff\x00^\xff\xee\x04q\x07\x10\x02&\x00R\x00\x00\x01\ +\x07\x03z\x04\x98\x00\x00\x00\x0c\xb5\x03\x02==\x11&\ +\x00+\x1155\xff\xff\x00\x87\xfey\x05\x8d\x07s\x02\ +&\x002\x00\x00\x00'\x02g\x05B\x00\x00\x01\x07\x01\ +K\x00\xc5\x01R\x00\x0a\xb4\x03((\x05&\x00+\x11\ +5\xff\xff\x00^\xfey\x047\x06!\x02&\x00R\x00\ +\x00\x00'\x02g\x04\xc1\x00\x00\x01\x06\x01K\xf3\x00\x00\ +\x0a\xb4\x03((\x11&\x00+\x115\xff\xff\x00\x87\xff\ +\xec\x06\xd5\x07s\x02&\x02_\x00\x00\x01\x07\x00v\x01\ +\x12\x01R\x00\x0a\xb4\x02--\x05&\x00+\x115\xff\ +\xff\x00^\xff\xee\x05\x8f\x06!\x02&\x02`\x00\x00\x01\ +\x06\x00v?\x00\x00\x0a\xb4\x02,,\x11&\x00+\x11\ +5\xff\xff\x00\x87\xff\xec\x06\xd5\x07s\x02&\x02_\x00\ +\x00\x01\x07\x00C\x00o\x01R\x00\x0a\xb4\x02&&\x05\ +&\x00+\x115\xff\xff\x00^\xff\xee\x05\x8f\x06!\x02\ +&\x02`\x00\x00\x01\x06\x00C\x92\x00\x00\x0a\xb4\x02%\ +%\x11&\x00+\x115\xff\xff\x00\x87\xff\xec\x06\xd5\x07\ +\xea\x02&\x02_\x00\x00\x01\x07\x02f\x05\x93\x01R\x00\ +\x0a\xb4\x02((\x05&\x00+\x115\xff\xff\x00^\xff\ +\xee\x05\x8f\x06\x98\x02&\x02`\x00\x00\x01\x07\x02f\x04\ +\x9e\x00\x00\x00\x0a\xb4\x02((\x11&\x00+\x115\xff\ +\xff\x00\x87\xff\xec\x06\xd5\x07H\x02&\x02_\x00\x00\x01\ +\x07\x01R\x00\xd9\x01R\x00\x0a\xb4\x02..\x05&\x00\ ++\x115\xff\xff\x00^\xff\xee\x05\x8f\x05\xf6\x02&\x02\ +`\x00\x00\x01\x06\x01R\xff\x00\x00\x0a\xb4\x02--\x11\ +&\x00+\x115\xff\xff\x00\x87\xfey\x06\xd5\x06\x14\x02\ +&\x02_\x00\x00\x00\x07\x02g\x05B\x00\x00\xff\xff\x00\ +^\xfey\x05\x8f\x04\xfa\x02&\x02`\x00\x00\x00\x07\x02\ +g\x04\xc1\x00\x00\xff\xff\x00\x98\xfey\x05\x8b\x05\xb6\x02\ +&\x008\x00\x00\x00\x07\x02g\x05%\x00\x00\xff\xff\x00\ +o\xfey\x04\x87\x04R\x02&\x00X\x00\x00\x00\x07\x02\ +g\x04\xd7\x00\x00\xff\xff\x00\x98\xff\xec\x05\x8b\x07\xea\x02\ +&\x008\x00\x00\x01\x07\x02f\x05f\x01R\x00\x0a\xb4\ +\x01\x1a\x1a\x05&\x00+\x115\xff\xff\x00o\xff\xec\x04\ +\x87\x06\x98\x02&\x00X\x00\x00\x01\x07\x02f\x04\xbe\x00\ +\x00\x00\x0a\xb4\x01\x1e\x1e\x11&\x00+\x115\xff\xff\x00\ +\x98\xff\xec\x07#\x07s\x02&\x02a\x00\x00\x01\x07\x00\ +v\x01\x14\x01R\x00\x0a\xb4\x01&&\x05&\x00+\x11\ +5\xff\xff\x00m\xff\xec\x06/\x06!\x02&\x02b\x00\ +\x00\x01\x06\x00vb\x00\x00\x0a\xb4\x01((\x11&\x00\ ++\x115\xff\xff\x00\x98\xff\xec\x07#\x07s\x02&\x02\ +a\x00\x00\x01\x07\x00C\x00?\x01R\x00\x0a\xb4\x01\x1f\ +\x1f\x05&\x00+\x115\xff\xff\x00m\xff\xec\x06/\x06\ +!\x02&\x02b\x00\x00\x01\x06\x00C\x9b\x00\x00\x0a\xb4\ +\x01!!\x11&\x00+\x115\xff\xff\x00\x98\xff\xec\x07\ +#\x07\xea\x02&\x02a\x00\x00\x01\x07\x02f\x05h\x01\ +R\x00\x0a\xb4\x01!!\x05&\x00+\x115\xff\xff\x00\ +m\xff\xec\x06/\x06\x98\x02&\x02b\x00\x00\x01\x07\x02\ +f\x04\xc3\x00\x00\x00\x0a\xb4\x01$$\x11&\x00+\x11\ +5\xff\xff\x00\x98\xff\xec\x07#\x07H\x02&\x02a\x00\ +\x00\x01\x07\x01R\x00\xcf\x01R\x00\x0a\xb4\x01''\x05\ +&\x00+\x115\xff\xff\x00m\xff\xec\x06/\x05\xf6\x02\ +&\x02b\x00\x00\x01\x06\x01R1\x00\x00\x0a\xb4\x01)\ +)\x11&\x00+\x115\xff\xff\x00\x98\xfey\x07#\x06\ +\x14\x02&\x02a\x00\x00\x00\x07\x02g\x05%\x00\x00\xff\ +\xff\x00m\xfey\x06/\x04\xfa\x02&\x02b\x00\x00\x00\ +\x07\x02g\x04\xd7\x00\x00\xff\xff\x00\xba\xfey\x05\x00\x05\ +\xb6\x02&\x00<\x00\x00\x00\x07\x02g\x04j\x00\x00\xff\ +\xff\xffV\xfe\x14\x04R\x04R\x02&\x00\x5c\x00\x00\x00\ +\x07\x02g\x05\xac\x00\x00\xff\xff\x00\xba\x00\x00\x05\x00\x07\ +\xea\x02&\x00<\x00\x00\x01\x07\x02f\x04\xac\x01R\x00\ +\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\xff\xffV\xfe\ +\x14\x04R\x06\x98\x02&\x00\x5c\x00\x00\x01\x07\x02f\x04\ +;\x00\x00\x00\x0a\xb4\x01\x1c\x1c\x11&\x00+\x115\xff\ +\xff\x00\xba\x00\x00\x05\x00\x07H\x02&\x00<\x00\x00\x01\ +\x07\x01R\x00\x1f\x01R\x00\x0a\xb4\x01\x12\x12\x05&\x00\ ++\x115\xff\xff\xffV\xfe\x14\x04R\x05\xf6\x02&\x00\ +\x5c\x00\x00\x01\x06\x01R\xa7\x00\x00\x0a\xb4\x01!!\x11\ +&\x00+\x115\xff\xff\x00\x1d\xfe\xbc\x05P\x06\x14\x02\ +&\x00\xd3\x00\x00\x00\x07\x00B\x00\xd9\x00\x00\x00\x02\xfc\ +3\x04\xd9\xff\x0c\x06!\x00\x08\x00\x11\x00\x0e\xb4\x0e\x06\ +\x80\x0a\x01\x00/3\x1a\xcd210\x01#&&'\ +53\x16\x17\x05#&&'53\x16\x17\xfd\xa0\x85\ +<\x8a\x22\xea*Y\x01l\x85@\x87 \xe9*Y\x04\ +\xd9<\xb3D\x15\x96\x99\x19@\xb3@\x15\x96\x99\x00\x00\ +\x02\xfc\xc9\x04\xd9\x00\xb6\x06\x7f\x00\x0c\x00\x15\x00\x19@\ +\x0a\x07\x00\x15\x00\x15\x00\x10\xc0\x0a\x05\x00/3\x1a\xcc\ +99//\x11310\x013\x16\x17\x07#&'\ +\x06\x07#76\x05673\x15\x06\x06\x07#\xfd\xd9\ +\xf6-q\x05x[Q\x81q\x89\x04\xd2\x01\x9aiC\ +\xd1#\x9aC}\x06\x00w\x99\x17?cf<\x19\xc3\ +\x05na\x12'\x7f+\x00\x02\xfc\x1f\x04\xd9\xffm\x06\ +\x7f\x00\x0c\x00\x16\x00\x19@\x0a\x07\x00\x0d\x00\x0d\x00\x12\ +\xc0\x0a\x05\x00/3\x1a\xcc99//\x11310\ +\x013\x16\x17\x07#&'\x06\x07#76\x07&&\ +'53\x16\x16\x17\x15\xfd\xd9\xf6-q\x05x[Q\ +\x81q\x89\x04\xd2\xd02f\x18\xb8\x11?\x16\x06\x00w\ +\x99\x17?cf<\x19\xc3\x19.}&\x12-}%\ +\x14\x00\x02\xfc\xc9\x04\xd9\x00\x5c\x06\xe9\x00\x0c\x00\x1e\x00\ +*\xb9\x00\x0d\xff\xc0@\x13\x0a\x11H\x07\x00\x0d\x00\x0d\ +\x00\x13\x18@\x0a\x0dH\x18\xc0\x0a\x05\x00/3\x1a\xcc\ ++299//\x113+10\x013\x16\x17\x07\ +#&'\x06\x07#76\x0576654#\x22\ +\x075632\x16\x15\x14\x07\x07\xfd\xd9\xf6-q\x05\ +x[Q\x81q\x89\x04\xd2\x01\xb1\x0aF?G-!\ +!EO]\x99\x0f\x06\x00w\x99\x17?cf<\x19\ +\xc3\x15j\x07&#-\x0cd\x0aB?v#/\x00\ +\x02\xfc\xc9\x04\xd9\xff\xd9\x07\x10\x00\x16\x00$\x00J@\ +\x09\x09\x00\x1e\x17\x11\x00\x05\x0c\x17\xb8\xff\xc0\xb3\x1f\x22\ +H\x17\xb8\xff\xc0@\x1a\x11\x1bH\x17\x00\x0c\x0c\x00\x17\ +\x03\x1f\x15/\x15?\x15\x03\x15@\x14\x17H\x15\xc0!\ +\x1c\x00/3\x1a\xcc+]\x179///++\x11\ +3\x113\x113\x10\xc410\x01\x22.\x02#\x22\x06\ +\x07#6632\x1e\x0232673\x06\x053\ +\x16\x17\x07#&'\x06\x07#776\xfe\xf6)J\ +E?\x1e),\x0fw\x19uU'JEA\x1e%\ +/\x14s9\xfe5\xf6\x22\x80\x05xYX~m\x8b\ +\x04@\x8d\x06)\x1b!\x1c1)ts\x1c\x22\x1c,\ +0\xe71\x5c\xac\x17;]];\x19;\x7f\x00\x02\xfd\ +\x08\x04\xd9\xff\x93\x06\xc1\x00\x0d\x00\x16\x00#@\x12\x0f\ +\x16\x01\x0a\x04\x16\x04\x16\x08\x11@\x0a\x0eH\x11\xc0\x08\ +\x00\x00/2\x1a\xcc+\x1199//3]10\ +\x01\x22&573\x16\x163273\x06\x06\x036\ +73\x15\x06\x06\x07#\xfe'\x87\x98\x02}\x0aWM\ +\x9e=\x83#\xb8\xc0^L\xc2\x1f\xa9@d\x04\xd9\x94\ +\x83\x12MD\x91\x8f\x9a\x01\x19Xw\x11\x22\x8a'\x00\ +\x02\xfd\x08\x04\xd9\xff\x93\x06\xc1\x00\x08\x00\x16\x00#@\ +\x12\x0f\x00\x01\x13\x0d\x00\x0d\x00\x11\x05@\x0a\x0eH\x05\ +\xc0\x11\x09\x00/3\x1a\xcc+\x1199//3]\ +10\x01&&'73\x16\x17\x07\x03\x22&57\ +3\x16\x163273\x06\x06\xfe56h\x18\x02\xb0\ +\x1dJ\x05l\x87\x98\x02}\x0aWM\x9e=\x83#\xb8\ +\x05\xdd2x'\x13Vy\x15\xfe\xfc\x94\x83\x12MD\ +\x91\x8f\x9a\x00\x02\xfd\x08\x04\xd9\xff\x93\x07\x06\x00\x12\x00\ + \x004\xb4\x1f\x00\x01\x1d\x17\xb8\xff\xc0@\x18\x0f\x12\ +H\x17\x00\x17\x00\x1b\x06\x1f\x0b/\x0b?\x0bo\x0b\x7f\ +\x0b\x05\x0b\xc0\x1b\x13\x00/3\x1a\xcc]2\x1199\ +//+3]10\x0176654#\x22\x07\ +5632\x16\x15\x14\x06\x0f\x02\x22&573\x16\ +\x163273\x06\x06\xfd\xfa\x08>=B+\x1e$\ +7:\ +R\x0f)\xf4\x94\x83\x12MD\x91\x8f\x9a\x00\x00\x02\xfd\ +\x04\x04\xd9\xff\xd3\x07\x10\x00\x14\x00\x22\x00=@#\x1f\ +\x18\x0f\x18\x01\x08\x00\x0f\x00\x05\x0a\x18\x00\x0a\x0a\x00\x18\ +\x03\x1c\x1f\x13/\x13?\x13\x03\x13@\x13\x17H\x13\xc0\ +\x1c\x15\x00/3\x1a\xcc+]\x11\x179///\x11\ +3\x113\x10\xc4]\x11310\x01\x22.\x02#\x22\ +\x07#632\x1e\x0232673\x06\x01\x22&\ +53\x16\x1632673\x06\x06\xfe\xf2%KF\ +A\x1cH\x1eu2\xaf$LHB\x1b&,\x14s\ +:\xfe\x8e\x8c\x95}\x05WVWd\x1c\x83\x22\xb7\x06\ +1\x1b \x1bV\xdd\x1c\x22\x1c..\xdf\xfe\xa8\x8e\x87\ +A\x85\x90\x00\x00\x01\xffb\xfe-\x00\xd9\x00\ +\x00\x00\x0f\x00\x0a\xb2\x00\x0b\x06\x00/\xcc210\x03\ +2654'3\x16\x15\x14\x06#\x22'5\x16?\ +08Z\x97s\x84tJ5,\xfe\xc166\x5cw\ +s\x81iv\x15\x8f\x10\x00\x01\xff\xa2\xfeD\x01\xb4\x00\ +\xdd\x00\x0d\x00\x0a\xb2\x05\x00\x0a\x00/\xcd210\x13\ +\x22'5\x163267\x133\x03\x06\x06-Y2\ +423D\x12F\xddN!\x97\xfeD\x18\xbf\x15<\ +Q\x01J\xfe\x8d\x9b\x8b\x00\x01\xff\xa2\xfeD\x01\xae\x00\ +\xc9\x00\x0d\x00\x0a\xb2\x05\x00\x0a\x00/\xcd210\x13\ +\x22'5\x163267\x133\x03\x06\x06-Y2\ +423D\x12B\xdbH!\x97\xfeD\x18\xbf\x15<\ +Q\x016\xfe\xa1\x9b\x8b\xff\xff\x00|\x00\x00\x03>\x05\ +\xb6\x00\x06\x00\x14\x8a\x00\x00\x02\x00^\xff\xec\x04+\x04\ +{\x00\x0a\x00\x18\x00\x17@\x0c\x16\x00MY\x16&\x0f\ +\x05MY\x0f\x19\x00?+\x00\x18?+10\x01\x22\ +\x02\x15\x14326\x1254\x17\x14\x02\x06#\x22&\ +54\x12$32\x16\x02\x85\x86\xb3\xbeV\x8aS\xee\ +\x8f\xfd\xa5\xc4\xd8\x93\x01\x00\xa2\xc2\xd6\x03\xba\xfe\xca\xe8\ +\xf0\x84\x01\x05\x9c\xe9\xf3\xd4\xfe\xab\xb2\xeb\xcd\xd4\x01Q\ +\xb2\xe9\x00\x00\x01\x007\x00\x00\x02\xe7\x04f\x00\x0a\x00\ +\x15@\x09\x04\x09\x07\x07\x01\x09\x10\x01\x18\x00??\x12\ +9/\x11910!#\x12\x127\x06\x07\x07'\x01\ +3\x01\xfa\xecQV\x22,W\xb2k\x01\xee\xc2\x01o\ +\x01\x87l,:w\xa2\x01?\x00\x01\xff\xdf\x00\x00\x03\ +\xc7\x04{\x00\x19\x00\x1d@\x0f\x10\x09MY\x10&\x02\ +\x17\x01\x01\x18NY\x01\x18\x00?+\x11\x12\x009\x18\ +?+10!!7\x016654&#\x22\x06\ +\x07'6632\x16\x15\x14\x06\x07\x05\x15!\x03m\ +\xfcr#\x01\x8d\xca|EHO\x9aWp\x88\xd3u\ +\xa9\xb6\x93\xb7\xfe\xed\x02.\xa8\x01\x19\x8e\x8fQ9L\ +OD\x9bnQ\xa2\x91|\xceu\xb4\x06\x00\xff\xff\xff\ +\x95\xfe\x9f\x03\xb5\x04~\x00\x07\x00\x16\xffv\xfe\xb3\x00\ +\x02\xff\xc7\xfe\xa8\x04\x00\x04f\x00\x0a\x00\x13\x00%@\ +\x12\x0f\x03\x07\x01\x05\x13\x05OY\x06\x09\x13\x13\x03\x07\ +\x10\x03$\x00??\x129/33+\x11\x003\x11\ +\x12910%#\x03#\x13!7\x01!\x033!\ +667#\x06\x06\x07\x01\x03\xd3\xbcN\xe6N\xfd\x96\ +%\x03\x12\x01\x02\xc3\xbf\xfe^'1J\x08\x16X\x1e\ +\xfeo\x1b\xfe\x8d\x01s\xb2\x03\x99\xfco\xb6\xe5\xf8$\ +y!\xfe+\x00\xff\xff\xff\xe0\xfe\x9f\x04\x03\x04i\x00\ +\x07\x00\x18\xff\xab\xfe\xb3\xff\xff\x00f\xff\xec\x04d\x05\ +\xcb\x00\x06\x00\x19\xf7\x00\xff\xff\xff\xff\xfe\xb3\x04\x1e\x04\ +i\x00\x07\x00\x1a\xff\x82\xfe\xb3\xff\xff\x00?\xff\xec\x04\ +Q\x05\xcd\x00\x06\x00\x1b\xf3\x00\xff\xff\x00&\xfe\xa1\x04\ +\x01\x04\x80\x00\x07\x00\x1c\xff\xca\xfe\xb5\x00\x01\xff\x1f\xfe\ +\x14\x06P\x06\x1f\x009\x008@\x1d\x22\x14\x0f\x14F\ +Y\x1d\x0f\x00\x09)6\x186HY\x0b&\x18\x0f2\ +\x05\x00\x05FY-\x00\x1b\x00?2+\x11\x003\x18\ +?33+\x11\x0033\x18?3+\x11\x0031\ +0\x03\x22'5\x16327\x13#?\x02663\ +2\x17\x07&#\x22\x06\x07\x07!76632\x17\ +\x07&#\x22\x06\x07\x073\x07#\x03\x06\x06#\x22'\ +5\x16327\x13!\x03\x06\x06LZ;@2\x85\ +,\xd9\xb3\x15\xc2\x15,\xb5\xa6s`=J>ES\ +\x16\x12\x01\xb6\x17,\xb2\xa7u`>J=GQ\x16\ +\x12\xe5'\xe3\xdf+\xb5\x91_6<6\x88(\xd7\xfe\ +J\xdf(\xb6\xfe\x14\x17\xbe\x14\xcd\x03\xfejL\x5c\xc6\ +\xa7+\xb0\x1cVbV`\xc5\xa8+\xb0\x1cVbV\ +\xb2\xfb\xe3\xc0\xaf\x17\xbe\x14\xcd\x03\xfe\xfb\xe3\xbd\xb2\x00\ +\x02\x00w\x02\xdd\x05\x93\x05\xc1\x00 \x001\x006@\ +\x1b\x0a\x1b\x03\x13)!\x08\x03\x03!-\x03\x00&\x01\ +&'\x18/##'\x13\x13*'\x03\x00?33\ +/\x113\x113\xcd\x10\xcd]\x172/\xcd\x113\x11\ +\x129910\x01\x14\x06#\x22'5\x16325\ +4&'&&54632\x17\x07&#\x22\x06\ +\x15\x14\x16\x17\x16\x16\x01\x03#\x17\x11#\x113\x13\x13\ +3\x11#\x117#\x03\x02=\x8bwzJj\x5cu\ +/VbL~kcj+WF-85Ln\ +F\x01\x94\xb2\x06\x04\x8e\xd5\xac\xb7\xcc\x91\x04\x06\xba\x03\ +\xb4ds%\x7f/Z#/%,`G[p.\ +n'*&%/!3Y\xfe\xea\x02\x1bo\xfeT\ +\x02\xd1\xfd\xea\x02\x16\xfd/\x01\xa2y\xfd\xe5\xff\xff\x00\ +\x92\xfe\x14\x04\xc3\x05\xb6\x02&\x007\x00\x00\x00\x07\x00\ +z\x01N\x00\x00\xff\xff\x00\x5c\xfe\x14\x03%\x05H\x02\ +&\x00W\x00\x00\x00\x07\x00z\x01\x1b\x00\x00\x00\x02\x00\ +'\xfe\x14\x04\x7f\x04f\x00\x0d\x00-\x00.@\x18\x1a\ +(\x1d$)\x0f$\x07FY$\x10\x1d\x00FY\x1d\ +\x16\x0e\x14FY\x0e\x1b\x00?+\x00\x18?+\x00\x18\ +?+\x00\x18?\x11\x129910%26\x125\ +4&#\x22\x06\x02\x15\x14\x16\x03\x22'5\x16\x163\ +26?\x02#\x06\x06#\x22&54\x12632\ +\x16\x17373\x03\x06\x06\x01\xecS\x9d_XTV\ +\x94YT\x17\xd8\x8aG\xb5Tu\x9b\x19\x0e1\x08T\ +\xa0Z\x8c\x9f\x89\xed\x92`\x8e1\x08@\xb2\xf6/\xfb\ +\xaa\xa2\x01\x0a\x87ah\x97\xfe\xf6\x90fe\xfdjD\ +\xd5(0qr@\xbalZ\xcf\xb4\xcd\x01d\xc6V\ +\x5c\x9e\xfb\x7f\xde\xdf\x00\xff\xff\x00'\xfe\x14\x04\x7f\x06\ +!\x02&\x03\x91\x00\x00\x01\x06\x01K\x19\x00\x00\x0a\xb4\ +\x0244\x11&\x00+\x115\xff\xff\x00'\xfe\x14\x04\ +\x7f\x06\x08\x02&\x03\x91\x00\x00\x01\x06\x01N\x08\x00\x00\ +\x0a\xb4\x0211\x11&\x00+\x115\xff\xff\x00'\xfe\ +\x14\x04\x7f\x05\xfa\x02&\x03\x91\x00\x00\x01\x07\x01O\x01\ +#\x00\x00\x00\x0a\xb4\x0277\x11&\x00+\x115\xff\ +\xff\x00'\xfe\x14\x04\x7f\x06!\x02&\x03\x91\x00\x00\x01\ +\x06\x02:{\x00\x00\x0a\xb4\x0211\x11&\x00+\x11\ +5\x00\x01\x00F\x00\x00\x02h\x05\xb6\x00\x03\x00\x0a\xb3\ +\x01\x03\x00\x12\x00??103\x013\x01F\x017\ +\xeb\xfe\xc9\x05\xb6\xfaJ\xff\xff\x00F\x00\x00\x02v\x07\ +s\x02&\x03\x96\x00\x00\x01\x07\x00C\xfe\xe0\x01R\x00\ +\x0a\xb4\x01\x05\x05\x05&\x00+\x115\xff\xff\x00F\x00\ +\x00\x03\x88\x07s\x02&\x03\x96\x00\x00\x01\x07\x00v\xff\ +\xa3\x01R\x00\x0a\xb4\x01\x0c\x0c\x05&\x00+\x115\xff\ +\xff\x00F\x00\x00\x03i\x07s\x02&\x03\x96\x00\x00\x01\ +\x07\x01K\xff>\x01R\x00\x0a\xb4\x01\x0a\x0a\x05&\x00\ ++\x115\xff\xff\x00F\x00\x00\x03`\x07>\x02&\x03\ +\x96\x00\x00\x01\x07\x00j\xffI\x01R\x00\x0c\xb5\x02\x01\ +\x19\x19\x05&\x00+\x1155\xff\xff\x00F\x00\x00\x03\ +\xa3\x07H\x02&\x03\x96\x00\x00\x01\x07\x01R\xffK\x01\ +R\x00\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\xff\x00\ +F\x00\x00\x03M\x06\xdb\x02&\x03\x96\x00\x00\x01\x07\x01\ +M\xffW\x01R\x00\x0a\xb4\x01\x07\x07\x05&\x00+\x11\ +5\xff\xff\x00F\x00\x00\x03x\x07Z\x02&\x03\x96\x00\ +\x00\x01\x07\x01N\xff.\x01R\x00\x0a\xb4\x01\x07\x07\x05\ +&\x00+\x115\xff\xff\xff\xb4\xfe-\x02h\x05\xb6\x02\ +&\x03\x96\x00\x00\x00\x06\x01QT\x00\xff\xff\x00F\x00\ +\x00\x02\xac\x07L\x02&\x03\x96\x00\x00\x01\x07\x01O\x00\ +^\x01R\x00\x0a\xb4\x01\x0d\x0d\x05&\x00+\x115\xff\ +\xff\x00F\xfeh\x04\xd3\x05\xb6\x00'\x00-\x02`\x00\ +\x00\x00\x06\x03\x96\x00\x00\xff\xff\x00A\x00\x00\x03\x0c\x05\ +\xff\x00'\x03\x96\x00\xa4\x00\x00\x01\x07\x01T\xfd\xef\xff\ +\x97\x00\x07\xb2\x01\x06\x00\x00?5\x00\xff\xff\x00F\x00\ +\x00\x02h\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00F\x00\ +\x00\x03\x5c\x07>\x02&\x03\x96\x00\x00\x01\x07\x00j\xff\ +E\x01R\x00\x0c\xb5\x02\x01\x19\x19\x05&\x00+\x115\ +5\xff\xff\x00F\x00\x00\x02h\x05\xb6\x02\x06\x03\x96\x00\ +\x00\xff\xff\x00F\x00\x00\x03\x5c\x07>\x02&\x03\x96\x00\ +\x00\x01\x07\x00j\xffE\x01R\x00\x0c\xb5\x02\x01\x19\x19\ +\x05&\x00+\x1155\xff\xff\x00F\x00\x00\x02h\x05\ +\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00F\x00\x00\x02h\x05\ +\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00F\x00\x00\x03!\x07\ +\xea\x02&\x03\x96\x00\x00\x01\x07\x02f\x03\xee\x01R\x00\ +\x0a\xb4\x01\x08\x08\x05&\x00+\x115\xff\xff\x00\x02\xfe\ +y\x02h\x05\xb6\x02&\x03\x96\x00\x00\x00\x07\x02g\x03\ +{\x00\x00\x00\x00\x00\x01\x00\x00\xb62\x00\x01I\x06\x80\ +\x00\x00\x0e6$\x00\x05\x00$\xffq\x00\x05\x007\x00\ +)\x00\x05\x009\x00)\x00\x05\x00:\x00)\x00\x05\x00\ +<\x00\x14\x00\x05\x00D\xff\xae\x00\x05\x00F\xff\x85\x00\ +\x05\x00G\xff\x85\x00\x05\x00H\xff\x85\x00\x05\x00J\xff\ +\xc3\x00\x05\x00P\xff\xc3\x00\x05\x00Q\xff\xc3\x00\x05\x00\ +R\xff\x85\x00\x05\x00S\xff\xc3\x00\x05\x00T\xff\x85\x00\ +\x05\x00U\xff\xc3\x00\x05\x00V\xff\xc3\x00\x05\x00X\xff\ +\xc3\x00\x05\x00\x82\xffq\x00\x05\x00\x83\xffq\x00\x05\x00\ +\x84\xffq\x00\x05\x00\x85\xffq\x00\x05\x00\x86\xffq\x00\ +\x05\x00\x87\xffq\x00\x05\x00\x9f\x00\x14\x00\x05\x00\xa2\xff\ +\x85\x00\x05\x00\xa3\xff\xae\x00\x05\x00\xa4\xff\xae\x00\x05\x00\ +\xa5\xff\xae\x00\x05\x00\xa6\xff\xae\x00\x05\x00\xa7\xff\xae\x00\ +\x05\x00\xa8\xff\xae\x00\x05\x00\xa9\xff\x85\x00\x05\x00\xaa\xff\ +\x85\x00\x05\x00\xab\xff\x85\x00\x05\x00\xac\xff\x85\x00\x05\x00\ +\xad\xff\x85\x00\x05\x00\xb4\xff\x85\x00\x05\x00\xb5\xff\x85\x00\ +\x05\x00\xb6\xff\x85\x00\x05\x00\xb7\xff\x85\x00\x05\x00\xb8\xff\ +\x85\x00\x05\x00\xba\xff\x85\x00\x05\x00\xbb\xff\xc3\x00\x05\x00\ +\xbc\xff\xc3\x00\x05\x00\xbd\xff\xc3\x00\x05\x00\xbe\xff\xc3\x00\ +\x05\x00\xc2\xffq\x00\x05\x00\xc3\xff\xae\x00\x05\x00\xc4\xff\ +q\x00\x05\x00\xc5\xff\xae\x00\x05\x00\xc6\xffq\x00\x05\x00\ +\xc7\xff\xae\x00\x05\x00\xc9\xff\x85\x00\x05\x00\xcb\xff\x85\x00\ +\x05\x00\xcd\xff\x85\x00\x05\x00\xcf\xff\x85\x00\x05\x00\xd1\xff\ +\x85\x00\x05\x00\xd3\xff\x85\x00\x05\x00\xd5\xff\x85\x00\x05\x00\ +\xd7\xff\x85\x00\x05\x00\xd9\xff\x85\x00\x05\x00\xdb\xff\x85\x00\ +\x05\x00\xdd\xff\x85\x00\x05\x00\xdf\xff\xc3\x00\x05\x00\xe1\xff\ +\xc3\x00\x05\x00\xe3\xff\xc3\x00\x05\x00\xe5\xff\xc3\x00\x05\x00\ +\xfa\xff\xc3\x00\x05\x01\x06\xff\xc3\x00\x05\x01\x08\xff\xc3\x00\ +\x05\x01\x0d\xff\xc3\x00\x05\x01\x0f\xff\x85\x00\x05\x01\x11\xff\ +\x85\x00\x05\x01\x13\xff\x85\x00\x05\x01\x15\xff\x85\x00\x05\x01\ +\x17\xff\xc3\x00\x05\x01\x19\xff\xc3\x00\x05\x01\x1d\xff\xc3\x00\ +\x05\x01!\xff\xc3\x00\x05\x01$\x00)\x00\x05\x01&\x00\ +)\x00\x05\x01+\xff\xc3\x00\x05\x01-\xff\xc3\x00\x05\x01\ +/\xff\xc3\x00\x05\x011\xff\xc3\x00\x05\x013\xff\xc3\x00\ +\x05\x015\xff\xc3\x00\x05\x016\x00)\x00\x05\x018\x00\ +\x14\x00\x05\x01:\x00\x14\x00\x05\x01C\xffq\x00\x05\x01\ +D\xff\xae\x00\x05\x01F\xff\xae\x00\x05\x01H\xff\x85\x00\ +\x05\x01J\xff\xc3\x00\x05\x01V\xffq\x00\x05\x01_\xff\ +q\x00\x05\x01b\xffq\x00\x05\x01i\xffq\x00\x05\x01\ +y\xff\xae\x00\x05\x01z\xff\xd7\x00\x05\x01{\xff\xd7\x00\ +\x05\x01~\xff\xae\x00\x05\x01\x81\xff\xc3\x00\x05\x01\x82\xff\ +\xd7\x00\x05\x01\x83\xff\xd7\x00\x05\x01\x84\xff\xd7\x00\x05\x01\ +\x87\xff\xd7\x00\x05\x01\x89\xff\xd7\x00\x05\x01\x8c\xff\xae\x00\ +\x05\x01\x8e\xff\xc3\x00\x05\x01\x8f\xff\xae\x00\x05\x01\x90\xff\ +\xae\x00\x05\x01\x93\xff\xae\x00\x05\x01\x99\xff\xae\x00\x05\x01\ +\xa4\xff\x85\x00\x05\x01\xaa\xffq\x00\x05\x01\xae\xff\x85\x00\ +\x05\x01\xb5\xff\x85\x00\x05\x01\xca\xff\xd7\x00\x05\x01\xce\xff\ +q\x00\x05\x01\xcf\xff\x85\x00\x05\x01\xd5\xffq\x00\x05\x01\ +\xd8\xff\x85\x00\x05\x01\xdb\xff\x85\x00\x05\x01\xde\xff\x85\x00\ +\x05\x01\xea\xff\x85\x00\x05\x01\xed\xff\x85\x00\x05\x01\xee\xff\ +\xc3\x00\x05\x01\xf2\xffq\x00\x05\x01\xfa\x00)\x00\x05\x01\ +\xfc\x00)\x00\x05\x01\xfe\x00)\x00\x05\x02\x00\x00\x14\x00\ +\x05\x02W\xff\xc3\x00\x05\x02X\xffq\x00\x05\x02Y\xff\ +\xae\x00\x05\x02`\xff\x85\x00\x05\x02b\xff\xc3\x00\x05\x02\ +j\xff\x85\x00\x05\x02r\xffq\x00\x05\x02s\xffq\x00\ +\x05\x02}\xff\xec\x00\x05\x02\x7f\xff\x85\x00\x05\x02\x85\xff\ +\x85\x00\x05\x02\x87\xff\x85\x00\x05\x02\x89\xff\x85\x00\x05\x02\ +\x8d\xff\x85\x00\x05\x02\xb2\xff\x85\x00\x05\x02\xb4\xff\x85\x00\ +\x05\x02\xce\xff\x85\x00\x05\x02\xcf\xffq\x00\x05\x02\xd9\xff\ +q\x00\x05\x02\xda\xff\xd7\x00\x05\x02\xdb\xffq\x00\x05\x02\ +\xdc\xff\xd7\x00\x05\x02\xdd\xffq\x00\x05\x02\xde\xff\xd7\x00\ +\x05\x02\xe0\xff\x85\x00\x05\x02\xe2\xff\xd7\x00\x05\x02\xe4\xff\ +\xd7\x00\x05\x02\xf0\xff\x85\x00\x05\x02\xf2\xff\x85\x00\x05\x02\ +\xf4\xff\x85\x00\x05\x03\x09\xffq\x00\x05\x03\x0a\xff\x85\x00\ +\x05\x03\x0b\xffq\x00\x05\x03\x0c\xff\x85\x00\x05\x03\x11\xff\ +\x85\x00\x05\x03\x12\xffq\x00\x05\x03\x16\xff\x85\x00\x05\x03\ +\x1a\xff\x85\x00\x05\x03\x1b\xff\x85\x00\x05\x03\x1c\xffq\x00\ +\x05\x03\x1d\xffq\x00\x05\x03\x1e\xff\xae\x00\x05\x03\x1f\xff\ +q\x00\x05\x03 \xff\xae\x00\x05\x03!\xffq\x00\x05\x03\ +\x22\xff\xae\x00\x05\x03#\xffq\x00\x05\x03%\xffq\x00\ +\x05\x03&\xff\xae\x00\x05\x03'\xffq\x00\x05\x03(\xff\ +\xae\x00\x05\x03)\xffq\x00\x05\x03*\xff\xae\x00\x05\x03\ ++\xffq\x00\x05\x03,\xff\xae\x00\x05\x03-\xffq\x00\ +\x05\x03.\xff\xae\x00\x05\x03/\xffq\x00\x05\x030\xff\ +\xae\x00\x05\x031\xffq\x00\x05\x032\xff\xae\x00\x05\x03\ +3\xffq\x00\x05\x034\xff\xae\x00\x05\x036\xff\x85\x00\ +\x05\x038\xff\x85\x00\x05\x03:\xff\x85\x00\x05\x03<\xff\ +\x85\x00\x05\x03@\xff\x85\x00\x05\x03B\xff\x85\x00\x05\x03\ +D\xff\x85\x00\x05\x03J\xff\x85\x00\x05\x03L\xff\x85\x00\ +\x05\x03N\xff\x85\x00\x05\x03R\xff\x85\x00\x05\x03T\xff\ +\x85\x00\x05\x03V\xff\x85\x00\x05\x03X\xff\x85\x00\x05\x03\ +Z\xff\x85\x00\x05\x03\x5c\xff\x85\x00\x05\x03^\xff\x85\x00\ +\x05\x03`\xff\x85\x00\x05\x03b\xff\xc3\x00\x05\x03d\xff\ +\xc3\x00\x05\x03f\xff\xc3\x00\x05\x03h\xff\xc3\x00\x05\x03\ +j\xff\xc3\x00\x05\x03l\xff\xc3\x00\x05\x03n\xff\xc3\x00\ +\x05\x03o\x00\x14\x00\x05\x03q\x00\x14\x00\x05\x03s\x00\ +\x14\x00\x05\x03\x8f\x00)\x00\x0a\x00$\xffq\x00\x0a\x00\ +7\x00)\x00\x0a\x009\x00)\x00\x0a\x00:\x00)\x00\ +\x0a\x00<\x00\x14\x00\x0a\x00D\xff\xae\x00\x0a\x00F\xff\ +\x85\x00\x0a\x00G\xff\x85\x00\x0a\x00H\xff\x85\x00\x0a\x00\ +J\xff\xc3\x00\x0a\x00P\xff\xc3\x00\x0a\x00Q\xff\xc3\x00\ +\x0a\x00R\xff\x85\x00\x0a\x00S\xff\xc3\x00\x0a\x00T\xff\ +\x85\x00\x0a\x00U\xff\xc3\x00\x0a\x00V\xff\xc3\x00\x0a\x00\ +X\xff\xc3\x00\x0a\x00\x82\xffq\x00\x0a\x00\x83\xffq\x00\ +\x0a\x00\x84\xffq\x00\x0a\x00\x85\xffq\x00\x0a\x00\x86\xff\ +q\x00\x0a\x00\x87\xffq\x00\x0a\x00\x9f\x00\x14\x00\x0a\x00\ +\xa2\xff\x85\x00\x0a\x00\xa3\xff\xae\x00\x0a\x00\xa4\xff\xae\x00\ +\x0a\x00\xa5\xff\xae\x00\x0a\x00\xa6\xff\xae\x00\x0a\x00\xa7\xff\ +\xae\x00\x0a\x00\xa8\xff\xae\x00\x0a\x00\xa9\xff\x85\x00\x0a\x00\ +\xaa\xff\x85\x00\x0a\x00\xab\xff\x85\x00\x0a\x00\xac\xff\x85\x00\ +\x0a\x00\xad\xff\x85\x00\x0a\x00\xb4\xff\x85\x00\x0a\x00\xb5\xff\ +\x85\x00\x0a\x00\xb6\xff\x85\x00\x0a\x00\xb7\xff\x85\x00\x0a\x00\ +\xb8\xff\x85\x00\x0a\x00\xba\xff\x85\x00\x0a\x00\xbb\xff\xc3\x00\ +\x0a\x00\xbc\xff\xc3\x00\x0a\x00\xbd\xff\xc3\x00\x0a\x00\xbe\xff\ +\xc3\x00\x0a\x00\xc2\xffq\x00\x0a\x00\xc3\xff\xae\x00\x0a\x00\ +\xc4\xffq\x00\x0a\x00\xc5\xff\xae\x00\x0a\x00\xc6\xffq\x00\ +\x0a\x00\xc7\xff\xae\x00\x0a\x00\xc9\xff\x85\x00\x0a\x00\xcb\xff\ +\x85\x00\x0a\x00\xcd\xff\x85\x00\x0a\x00\xcf\xff\x85\x00\x0a\x00\ +\xd1\xff\x85\x00\x0a\x00\xd3\xff\x85\x00\x0a\x00\xd5\xff\x85\x00\ +\x0a\x00\xd7\xff\x85\x00\x0a\x00\xd9\xff\x85\x00\x0a\x00\xdb\xff\ +\x85\x00\x0a\x00\xdd\xff\x85\x00\x0a\x00\xdf\xff\xc3\x00\x0a\x00\ +\xe1\xff\xc3\x00\x0a\x00\xe3\xff\xc3\x00\x0a\x00\xe5\xff\xc3\x00\ +\x0a\x00\xfa\xff\xc3\x00\x0a\x01\x06\xff\xc3\x00\x0a\x01\x08\xff\ +\xc3\x00\x0a\x01\x0d\xff\xc3\x00\x0a\x01\x0f\xff\x85\x00\x0a\x01\ +\x11\xff\x85\x00\x0a\x01\x13\xff\x85\x00\x0a\x01\x15\xff\x85\x00\ +\x0a\x01\x17\xff\xc3\x00\x0a\x01\x19\xff\xc3\x00\x0a\x01\x1d\xff\ +\xc3\x00\x0a\x01!\xff\xc3\x00\x0a\x01$\x00)\x00\x0a\x01\ +&\x00)\x00\x0a\x01+\xff\xc3\x00\x0a\x01-\xff\xc3\x00\ +\x0a\x01/\xff\xc3\x00\x0a\x011\xff\xc3\x00\x0a\x013\xff\ +\xc3\x00\x0a\x015\xff\xc3\x00\x0a\x016\x00)\x00\x0a\x01\ +8\x00\x14\x00\x0a\x01:\x00\x14\x00\x0a\x01C\xffq\x00\ +\x0a\x01D\xff\xae\x00\x0a\x01F\xff\xae\x00\x0a\x01H\xff\ +\x85\x00\x0a\x01J\xff\xc3\x00\x0a\x01V\xffq\x00\x0a\x01\ +_\xffq\x00\x0a\x01b\xffq\x00\x0a\x01i\xffq\x00\ +\x0a\x01y\xff\xae\x00\x0a\x01z\xff\xd7\x00\x0a\x01{\xff\ +\xd7\x00\x0a\x01~\xff\xae\x00\x0a\x01\x81\xff\xc3\x00\x0a\x01\ +\x82\xff\xd7\x00\x0a\x01\x83\xff\xd7\x00\x0a\x01\x84\xff\xd7\x00\ +\x0a\x01\x87\xff\xd7\x00\x0a\x01\x89\xff\xd7\x00\x0a\x01\x8c\xff\ +\xae\x00\x0a\x01\x8e\xff\xc3\x00\x0a\x01\x8f\xff\xae\x00\x0a\x01\ +\x90\xff\xae\x00\x0a\x01\x93\xff\xae\x00\x0a\x01\x99\xff\xae\x00\ +\x0a\x01\xa4\xff\x85\x00\x0a\x01\xaa\xffq\x00\x0a\x01\xae\xff\ +\x85\x00\x0a\x01\xb5\xff\x85\x00\x0a\x01\xca\xff\xd7\x00\x0a\x01\ +\xce\xffq\x00\x0a\x01\xcf\xff\x85\x00\x0a\x01\xd5\xffq\x00\ +\x0a\x01\xd8\xff\x85\x00\x0a\x01\xdb\xff\x85\x00\x0a\x01\xde\xff\ +\x85\x00\x0a\x01\xea\xff\x85\x00\x0a\x01\xed\xff\x85\x00\x0a\x01\ +\xee\xff\xc3\x00\x0a\x01\xf2\xffq\x00\x0a\x01\xfa\x00)\x00\ +\x0a\x01\xfc\x00)\x00\x0a\x01\xfe\x00)\x00\x0a\x02\x00\x00\ +\x14\x00\x0a\x02W\xff\xc3\x00\x0a\x02X\xffq\x00\x0a\x02\ +Y\xff\xae\x00\x0a\x02`\xff\x85\x00\x0a\x02b\xff\xc3\x00\ +\x0a\x02j\xff\x85\x00\x0a\x02r\xffq\x00\x0a\x02s\xff\ +q\x00\x0a\x02}\xff\xec\x00\x0a\x02\x7f\xff\x85\x00\x0a\x02\ +\x85\xff\x85\x00\x0a\x02\x87\xff\x85\x00\x0a\x02\x89\xff\x85\x00\ +\x0a\x02\x8d\xff\x85\x00\x0a\x02\xb2\xff\x85\x00\x0a\x02\xb4\xff\ +\x85\x00\x0a\x02\xce\xff\x85\x00\x0a\x02\xcf\xffq\x00\x0a\x02\ +\xd9\xffq\x00\x0a\x02\xda\xff\xd7\x00\x0a\x02\xdb\xffq\x00\ +\x0a\x02\xdc\xff\xd7\x00\x0a\x02\xdd\xffq\x00\x0a\x02\xde\xff\ +\xd7\x00\x0a\x02\xe0\xff\x85\x00\x0a\x02\xe2\xff\xd7\x00\x0a\x02\ +\xe4\xff\xd7\x00\x0a\x02\xf0\xff\x85\x00\x0a\x02\xf2\xff\x85\x00\ +\x0a\x02\xf4\xff\x85\x00\x0a\x03\x09\xffq\x00\x0a\x03\x0a\xff\ +\x85\x00\x0a\x03\x0b\xffq\x00\x0a\x03\x0c\xff\x85\x00\x0a\x03\ +\x11\xff\x85\x00\x0a\x03\x12\xffq\x00\x0a\x03\x16\xff\x85\x00\ +\x0a\x03\x1a\xff\x85\x00\x0a\x03\x1b\xff\x85\x00\x0a\x03\x1c\xff\ +q\x00\x0a\x03\x1d\xffq\x00\x0a\x03\x1e\xff\xae\x00\x0a\x03\ +\x1f\xffq\x00\x0a\x03 \xff\xae\x00\x0a\x03!\xffq\x00\ +\x0a\x03\x22\xff\xae\x00\x0a\x03#\xffq\x00\x0a\x03%\xff\ +q\x00\x0a\x03&\xff\xae\x00\x0a\x03'\xffq\x00\x0a\x03\ +(\xff\xae\x00\x0a\x03)\xffq\x00\x0a\x03*\xff\xae\x00\ +\x0a\x03+\xffq\x00\x0a\x03,\xff\xae\x00\x0a\x03-\xff\ +q\x00\x0a\x03.\xff\xae\x00\x0a\x03/\xffq\x00\x0a\x03\ +0\xff\xae\x00\x0a\x031\xffq\x00\x0a\x032\xff\xae\x00\ +\x0a\x033\xffq\x00\x0a\x034\xff\xae\x00\x0a\x036\xff\ +\x85\x00\x0a\x038\xff\x85\x00\x0a\x03:\xff\x85\x00\x0a\x03\ +<\xff\x85\x00\x0a\x03@\xff\x85\x00\x0a\x03B\xff\x85\x00\ +\x0a\x03D\xff\x85\x00\x0a\x03J\xff\x85\x00\x0a\x03L\xff\ +\x85\x00\x0a\x03N\xff\x85\x00\x0a\x03R\xff\x85\x00\x0a\x03\ +T\xff\x85\x00\x0a\x03V\xff\x85\x00\x0a\x03X\xff\x85\x00\ +\x0a\x03Z\xff\x85\x00\x0a\x03\x5c\xff\x85\x00\x0a\x03^\xff\ +\x85\x00\x0a\x03`\xff\x85\x00\x0a\x03b\xff\xc3\x00\x0a\x03\ +d\xff\xc3\x00\x0a\x03f\xff\xc3\x00\x0a\x03h\xff\xc3\x00\ +\x0a\x03j\xff\xc3\x00\x0a\x03l\xff\xc3\x00\x0a\x03n\xff\ +\xc3\x00\x0a\x03o\x00\x14\x00\x0a\x03q\x00\x14\x00\x0a\x03\ +s\x00\x14\x00\x0a\x03\x8f\x00)\x00\x0b\x00-\x00\xb8\x00\ +\x0f\x00&\xff\x9a\x00\x0f\x00*\xff\x9a\x00\x0f\x002\xff\ +\x9a\x00\x0f\x004\xff\x9a\x00\x0f\x007\xffq\x00\x0f\x00\ +8\xff\xd7\x00\x0f\x009\xff\x85\x00\x0f\x00:\xff\x85\x00\ +\x0f\x00<\xff\x85\x00\x0f\x00\x89\xff\x9a\x00\x0f\x00\x94\xff\ +\x9a\x00\x0f\x00\x95\xff\x9a\x00\x0f\x00\x96\xff\x9a\x00\x0f\x00\ +\x97\xff\x9a\x00\x0f\x00\x98\xff\x9a\x00\x0f\x00\x9a\xff\x9a\x00\ +\x0f\x00\x9b\xff\xd7\x00\x0f\x00\x9c\xff\xd7\x00\x0f\x00\x9d\xff\ +\xd7\x00\x0f\x00\x9e\xff\xd7\x00\x0f\x00\x9f\xff\x85\x00\x0f\x00\ +\xc8\xff\x9a\x00\x0f\x00\xca\xff\x9a\x00\x0f\x00\xcc\xff\x9a\x00\ +\x0f\x00\xce\xff\x9a\x00\x0f\x00\xde\xff\x9a\x00\x0f\x00\xe0\xff\ +\x9a\x00\x0f\x00\xe2\xff\x9a\x00\x0f\x00\xe4\xff\x9a\x00\x0f\x01\ +\x0e\xff\x9a\x00\x0f\x01\x10\xff\x9a\x00\x0f\x01\x12\xff\x9a\x00\ +\x0f\x01\x14\xff\x9a\x00\x0f\x01$\xffq\x00\x0f\x01&\xff\ +q\x00\x0f\x01*\xff\xd7\x00\x0f\x01,\xff\xd7\x00\x0f\x01\ +.\xff\xd7\x00\x0f\x010\xff\xd7\x00\x0f\x012\xff\xd7\x00\ +\x0f\x014\xff\xd7\x00\x0f\x016\xff\x85\x00\x0f\x018\xff\ +\x85\x00\x0f\x01:\xff\x85\x00\x0f\x01G\xff\x9a\x00\x0f\x01\ +f\xff\xae\x00\x0f\x01m\xff\xae\x00\x0f\x01q\xffq\x00\ +\x0f\x01r\xff\x85\x00\x0f\x01s\xff\x9a\x00\x0f\x01u\xff\ +\x85\x00\x0f\x01x\xff\x85\x00\x0f\x01\x85\xff\xd7\x00\x0f\x01\ +\x9d\xffq\x00\x0f\x01\x9f\xff\x9a\x00\x0f\x01\xa6\xffq\x00\ +\x0f\x01\xb8\xff\x9a\x00\x0f\x01\xbb\xff\x9a\x00\x0f\x01\xbc\xff\ +q\x00\x0f\x01\xbe\xff\xae\x00\x0f\x01\xc1\xff\x5c\x00\x0f\x01\ +\xc4\xffq\x00\x0f\x01\xdc\xff\x9a\x00\x0f\x01\xe1\xff\x85\x00\ +\x0f\x01\xe4\xff\x9a\x00\x0f\x01\xfa\xff\x85\x00\x0f\x01\xfc\xff\ +\x85\x00\x0f\x01\xfe\xff\x85\x00\x0f\x02\x00\xff\x85\x00\x0f\x02\ +T\xff\x85\x00\x0f\x02_\xff\x9a\x00\x0f\x02a\xff\xd7\x00\ +\x0f\x02l\xff\x9a\x00\x0f\x02|\xff\x5c\x00\x0f\x02~\xff\ +\x9a\x00\x0f\x02\x80\xff\x85\x00\x0f\x02\x82\xff\x85\x00\x0f\x02\ +\x84\xff\x9a\x00\x0f\x02\x86\xff\x9a\x00\x0f\x02\x88\xff\x9a\x00\ +\x0f\x02\x8a\xff\x9a\x00\x0f\x02\x8c\xff\x9a\x00\x0f\x02\xa9\xff\ +q\x00\x0f\x02\xaa\xff\x9a\x00\x0f\x02\xb1\xff\x9a\x00\x0f\x02\ +\xb3\xff\x9a\x00\x0f\x02\xb5\xffq\x00\x0f\x02\xb6\xff\x9a\x00\ +\x0f\x02\xb7\xff\x85\x00\x0f\x02\xb9\xff\x85\x00\x0f\x02\xbd\xff\ +q\x00\x0f\x02\xbe\xff\x9a\x00\x0f\x02\xbf\xff\x5c\x00\x0f\x02\ +\xc0\xff\x85\x00\x0f\x02\xc1\xff\x5c\x00\x0f\x02\xc2\xff\x85\x00\ +\x0f\x02\xc5\xff\x85\x00\x0f\x02\xc7\xff\x85\x00\x0f\x02\xd4\xff\ +\x5c\x00\x0f\x02\xd5\xff\x85\x00\x0f\x02\xef\xff\x9a\x00\x0f\x02\ +\xf1\xff\x9a\x00\x0f\x02\xf3\xff\x9a\x00\x0f\x02\xfd\xff\x5c\x00\ +\x0f\x02\xfe\xff\x85\x00\x0f\x03\x0d\xff\x85\x00\x0f\x03\x0e\xff\ +\x9a\x00\x0f\x03\x0f\xff\x85\x00\x0f\x03\x10\xff\x9a\x00\x0f\x03\ +\x15\xff\x9a\x00\x0f\x03\x17\xffq\x00\x0f\x03\x18\xff\x9a\x00\ +\x0f\x03I\xff\x9a\x00\x0f\x03K\xff\x9a\x00\x0f\x03M\xff\ +\x9a\x00\x0f\x03O\xff\x9a\x00\x0f\x03Q\xff\x9a\x00\x0f\x03\ +S\xff\x9a\x00\x0f\x03U\xff\x9a\x00\x0f\x03W\xff\x9a\x00\ +\x0f\x03Y\xff\x9a\x00\x0f\x03[\xff\x9a\x00\x0f\x03]\xff\ +\x9a\x00\x0f\x03_\xff\x9a\x00\x0f\x03a\xff\xd7\x00\x0f\x03\ +c\xff\xd7\x00\x0f\x03e\xff\xd7\x00\x0f\x03g\xff\xd7\x00\ +\x0f\x03i\xff\xd7\x00\x0f\x03k\xff\xd7\x00\x0f\x03m\xff\ +\xd7\x00\x0f\x03o\xff\x85\x00\x0f\x03q\xff\x85\x00\x0f\x03\ +s\xff\x85\x00\x0f\x03\x8f\xffq\x00\x10\x007\xff\xae\x00\ +\x10\x01$\xff\xae\x00\x10\x01&\xff\xae\x00\x10\x01q\xff\ +\xae\x00\x10\x01\x9d\xff\xae\x00\x10\x01\xa6\xff\xae\x00\x10\x01\ +\xbc\xff\xae\x00\x10\x01\xc4\xff\xae\x00\x10\x01\xdc\xff\xd7\x00\ +\x10\x01\xe4\xff\xd7\x00\x10\x02\xa9\xff\xae\x00\x10\x02\xaa\xff\ +\xd7\x00\x10\x02\xb5\xff\xae\x00\x10\x02\xb6\xff\xd7\x00\x10\x02\ +\xbd\xff\xae\x00\x10\x02\xbe\xff\xd7\x00\x10\x03\x17\xff\xae\x00\ +\x10\x03\x18\xff\xd7\x00\x10\x03\x8f\xff\xae\x00\x11\x00&\xff\ +\x9a\x00\x11\x00*\xff\x9a\x00\x11\x002\xff\x9a\x00\x11\x00\ +4\xff\x9a\x00\x11\x007\xffq\x00\x11\x008\xff\xd7\x00\ +\x11\x009\xff\x85\x00\x11\x00:\xff\x85\x00\x11\x00<\xff\ +\x85\x00\x11\x00\x89\xff\x9a\x00\x11\x00\x94\xff\x9a\x00\x11\x00\ +\x95\xff\x9a\x00\x11\x00\x96\xff\x9a\x00\x11\x00\x97\xff\x9a\x00\ +\x11\x00\x98\xff\x9a\x00\x11\x00\x9a\xff\x9a\x00\x11\x00\x9b\xff\ +\xd7\x00\x11\x00\x9c\xff\xd7\x00\x11\x00\x9d\xff\xd7\x00\x11\x00\ +\x9e\xff\xd7\x00\x11\x00\x9f\xff\x85\x00\x11\x00\xc8\xff\x9a\x00\ +\x11\x00\xca\xff\x9a\x00\x11\x00\xcc\xff\x9a\x00\x11\x00\xce\xff\ +\x9a\x00\x11\x00\xde\xff\x9a\x00\x11\x00\xe0\xff\x9a\x00\x11\x00\ +\xe2\xff\x9a\x00\x11\x00\xe4\xff\x9a\x00\x11\x01\x0e\xff\x9a\x00\ +\x11\x01\x10\xff\x9a\x00\x11\x01\x12\xff\x9a\x00\x11\x01\x14\xff\ +\x9a\x00\x11\x01$\xffq\x00\x11\x01&\xffq\x00\x11\x01\ +*\xff\xd7\x00\x11\x01,\xff\xd7\x00\x11\x01.\xff\xd7\x00\ +\x11\x010\xff\xd7\x00\x11\x012\xff\xd7\x00\x11\x014\xff\ +\xd7\x00\x11\x016\xff\x85\x00\x11\x018\xff\x85\x00\x11\x01\ +:\xff\x85\x00\x11\x01G\xff\x9a\x00\x11\x01f\xff\xae\x00\ +\x11\x01m\xff\xae\x00\x11\x01q\xffq\x00\x11\x01r\xff\ +\x85\x00\x11\x01s\xff\x9a\x00\x11\x01u\xff\x85\x00\x11\x01\ +x\xff\x85\x00\x11\x01\x85\xff\xd7\x00\x11\x01\x9d\xffq\x00\ +\x11\x01\x9f\xff\x9a\x00\x11\x01\xa6\xffq\x00\x11\x01\xb8\xff\ +\x9a\x00\x11\x01\xbb\xff\x9a\x00\x11\x01\xbc\xffq\x00\x11\x01\ +\xbe\xff\xae\x00\x11\x01\xc1\xff\x5c\x00\x11\x01\xc4\xffq\x00\ +\x11\x01\xdc\xff\x9a\x00\x11\x01\xe1\xff\x85\x00\x11\x01\xe4\xff\ +\x9a\x00\x11\x01\xfa\xff\x85\x00\x11\x01\xfc\xff\x85\x00\x11\x01\ +\xfe\xff\x85\x00\x11\x02\x00\xff\x85\x00\x11\x02T\xff\x85\x00\ +\x11\x02_\xff\x9a\x00\x11\x02a\xff\xd7\x00\x11\x02l\xff\ +\x9a\x00\x11\x02|\xff\x5c\x00\x11\x02~\xff\x9a\x00\x11\x02\ +\x80\xff\x85\x00\x11\x02\x82\xff\x85\x00\x11\x02\x84\xff\x9a\x00\ +\x11\x02\x86\xff\x9a\x00\x11\x02\x88\xff\x9a\x00\x11\x02\x8a\xff\ +\x9a\x00\x11\x02\x8c\xff\x9a\x00\x11\x02\xa9\xffq\x00\x11\x02\ +\xaa\xff\x9a\x00\x11\x02\xb1\xff\x9a\x00\x11\x02\xb3\xff\x9a\x00\ +\x11\x02\xb5\xffq\x00\x11\x02\xb6\xff\x9a\x00\x11\x02\xb7\xff\ +\x85\x00\x11\x02\xb9\xff\x85\x00\x11\x02\xbd\xffq\x00\x11\x02\ +\xbe\xff\x9a\x00\x11\x02\xbf\xff\x5c\x00\x11\x02\xc0\xff\x85\x00\ +\x11\x02\xc1\xff\x5c\x00\x11\x02\xc2\xff\x85\x00\x11\x02\xc5\xff\ +\x85\x00\x11\x02\xc7\xff\x85\x00\x11\x02\xd4\xff\x5c\x00\x11\x02\ +\xd5\xff\x85\x00\x11\x02\xef\xff\x9a\x00\x11\x02\xf1\xff\x9a\x00\ +\x11\x02\xf3\xff\x9a\x00\x11\x02\xfd\xff\x5c\x00\x11\x02\xfe\xff\ +\x85\x00\x11\x03\x0d\xff\x85\x00\x11\x03\x0e\xff\x9a\x00\x11\x03\ +\x0f\xff\x85\x00\x11\x03\x10\xff\x9a\x00\x11\x03\x15\xff\x9a\x00\ +\x11\x03\x17\xffq\x00\x11\x03\x18\xff\x9a\x00\x11\x03I\xff\ +\x9a\x00\x11\x03K\xff\x9a\x00\x11\x03M\xff\x9a\x00\x11\x03\ +O\xff\x9a\x00\x11\x03Q\xff\x9a\x00\x11\x03S\xff\x9a\x00\ +\x11\x03U\xff\x9a\x00\x11\x03W\xff\x9a\x00\x11\x03Y\xff\ +\x9a\x00\x11\x03[\xff\x9a\x00\x11\x03]\xff\x9a\x00\x11\x03\ +_\xff\x9a\x00\x11\x03a\xff\xd7\x00\x11\x03c\xff\xd7\x00\ +\x11\x03e\xff\xd7\x00\x11\x03g\xff\xd7\x00\x11\x03i\xff\ +\xd7\x00\x11\x03k\xff\xd7\x00\x11\x03m\xff\xd7\x00\x11\x03\ +o\xff\x85\x00\x11\x03q\xff\x85\x00\x11\x03s\xff\x85\x00\ +\x11\x03\x8f\xffq\x00$\x00\x05\xffq\x00$\x00\x0a\xff\ +q\x00$\x00&\xff\xd7\x00$\x00*\xff\xd7\x00$\x00\ +-\x01\x0a\x00$\x002\xff\xd7\x00$\x004\xff\xd7\x00\ +$\x007\xffq\x00$\x009\xff\xae\x00$\x00:\xff\ +\xae\x00$\x00<\xff\x85\x00$\x00\x89\xff\xd7\x00$\x00\ +\x94\xff\xd7\x00$\x00\x95\xff\xd7\x00$\x00\x96\xff\xd7\x00\ +$\x00\x97\xff\xd7\x00$\x00\x98\xff\xd7\x00$\x00\x9a\xff\ +\xd7\x00$\x00\x9f\xff\x85\x00$\x00\xc8\xff\xd7\x00$\x00\ +\xca\xff\xd7\x00$\x00\xcc\xff\xd7\x00$\x00\xce\xff\xd7\x00\ +$\x00\xde\xff\xd7\x00$\x00\xe0\xff\xd7\x00$\x00\xe2\xff\ +\xd7\x00$\x00\xe4\xff\xd7\x00$\x01\x0e\xff\xd7\x00$\x01\ +\x10\xff\xd7\x00$\x01\x12\xff\xd7\x00$\x01\x14\xff\xd7\x00\ +$\x01$\xffq\x00$\x01&\xffq\x00$\x016\xff\ +\xae\x00$\x018\xff\x85\x00$\x01:\xff\x85\x00$\x01\ +G\xff\xd7\x00$\x01\xfa\xff\xae\x00$\x01\xfc\xff\xae\x00\ +$\x01\xfe\xff\xae\x00$\x02\x00\xff\x85\x00$\x02\x07\xff\ +q\x00$\x02\x0b\xffq\x00$\x02_\xff\xd7\x00$\x03\ +I\xff\xd7\x00$\x03K\xff\xd7\x00$\x03M\xff\xd7\x00\ +$\x03O\xff\xd7\x00$\x03Q\xff\xd7\x00$\x03S\xff\ +\xd7\x00$\x03U\xff\xd7\x00$\x03W\xff\xd7\x00$\x03\ +Y\xff\xd7\x00$\x03[\xff\xd7\x00$\x03]\xff\xd7\x00\ +$\x03_\xff\xd7\x00$\x03o\xff\x85\x00$\x03q\xff\ +\x85\x00$\x03s\xff\x85\x00$\x03\x8f\xffq\x00%\x00\ +\x0f\xff\xae\x00%\x00\x11\xff\xae\x00%\x00$\xff\xd7\x00\ +%\x007\xff\xc3\x00%\x009\xff\xec\x00%\x00:\xff\ +\xec\x00%\x00;\xff\xd7\x00%\x00<\xff\xec\x00%\x00\ +=\xff\xec\x00%\x00\x82\xff\xd7\x00%\x00\x83\xff\xd7\x00\ +%\x00\x84\xff\xd7\x00%\x00\x85\xff\xd7\x00%\x00\x86\xff\ +\xd7\x00%\x00\x87\xff\xd7\x00%\x00\x9f\xff\xec\x00%\x00\ +\xc2\xff\xd7\x00%\x00\xc4\xff\xd7\x00%\x00\xc6\xff\xd7\x00\ +%\x01$\xff\xc3\x00%\x01&\xff\xc3\x00%\x016\xff\ +\xec\x00%\x018\xff\xec\x00%\x01:\xff\xec\x00%\x01\ +;\xff\xec\x00%\x01=\xff\xec\x00%\x01?\xff\xec\x00\ +%\x01C\xff\xd7\x00%\x01\xa0\xff\xec\x00%\x01\xfa\xff\ +\xec\x00%\x01\xfc\xff\xec\x00%\x01\xfe\xff\xec\x00%\x02\ +\x00\xff\xec\x00%\x02\x08\xff\xae\x00%\x02\x0c\xff\xae\x00\ +%\x02X\xff\xd7\x00%\x03\x1d\xff\xd7\x00%\x03\x1f\xff\ +\xd7\x00%\x03!\xff\xd7\x00%\x03#\xff\xd7\x00%\x03\ +%\xff\xd7\x00%\x03'\xff\xd7\x00%\x03)\xff\xd7\x00\ +%\x03+\xff\xd7\x00%\x03-\xff\xd7\x00%\x03/\xff\ +\xd7\x00%\x031\xff\xd7\x00%\x033\xff\xd7\x00%\x03\ +o\xff\xec\x00%\x03q\xff\xec\x00%\x03s\xff\xec\x00\ +%\x03\x8f\xff\xc3\x00&\x00&\xff\xd7\x00&\x00*\xff\ +\xd7\x00&\x002\xff\xd7\x00&\x004\xff\xd7\x00&\x00\ +\x89\xff\xd7\x00&\x00\x94\xff\xd7\x00&\x00\x95\xff\xd7\x00\ +&\x00\x96\xff\xd7\x00&\x00\x97\xff\xd7\x00&\x00\x98\xff\ +\xd7\x00&\x00\x9a\xff\xd7\x00&\x00\xc8\xff\xd7\x00&\x00\ +\xca\xff\xd7\x00&\x00\xcc\xff\xd7\x00&\x00\xce\xff\xd7\x00\ +&\x00\xde\xff\xd7\x00&\x00\xe0\xff\xd7\x00&\x00\xe2\xff\ +\xd7\x00&\x00\xe4\xff\xd7\x00&\x01\x0e\xff\xd7\x00&\x01\ +\x10\xff\xd7\x00&\x01\x12\xff\xd7\x00&\x01\x14\xff\xd7\x00\ +&\x01G\xff\xd7\x00&\x02_\xff\xd7\x00&\x03I\xff\ +\xd7\x00&\x03K\xff\xd7\x00&\x03M\xff\xd7\x00&\x03\ +O\xff\xd7\x00&\x03Q\xff\xd7\x00&\x03S\xff\xd7\x00\ +&\x03U\xff\xd7\x00&\x03W\xff\xd7\x00&\x03Y\xff\ +\xd7\x00&\x03[\xff\xd7\x00&\x03]\xff\xd7\x00&\x03\ +_\xff\xd7\x00'\x00\x0f\xff\xae\x00'\x00\x11\xff\xae\x00\ +'\x00$\xff\xd7\x00'\x007\xff\xc3\x00'\x009\xff\ +\xec\x00'\x00:\xff\xec\x00'\x00;\xff\xd7\x00'\x00\ +<\xff\xec\x00'\x00=\xff\xec\x00'\x00\x82\xff\xd7\x00\ +'\x00\x83\xff\xd7\x00'\x00\x84\xff\xd7\x00'\x00\x85\xff\ +\xd7\x00'\x00\x86\xff\xd7\x00'\x00\x87\xff\xd7\x00'\x00\ +\x9f\xff\xec\x00'\x00\xc2\xff\xd7\x00'\x00\xc4\xff\xd7\x00\ +'\x00\xc6\xff\xd7\x00'\x01$\xff\xc3\x00'\x01&\xff\ +\xc3\x00'\x016\xff\xec\x00'\x018\xff\xec\x00'\x01\ +:\xff\xec\x00'\x01;\xff\xec\x00'\x01=\xff\xec\x00\ +'\x01?\xff\xec\x00'\x01C\xff\xd7\x00'\x01\xa0\xff\ +\xec\x00'\x01\xfa\xff\xec\x00'\x01\xfc\xff\xec\x00'\x01\ +\xfe\xff\xec\x00'\x02\x00\xff\xec\x00'\x02\x08\xff\xae\x00\ +'\x02\x0c\xff\xae\x00'\x02X\xff\xd7\x00'\x03\x1d\xff\ +\xd7\x00'\x03\x1f\xff\xd7\x00'\x03!\xff\xd7\x00'\x03\ +#\xff\xd7\x00'\x03%\xff\xd7\x00'\x03'\xff\xd7\x00\ +'\x03)\xff\xd7\x00'\x03+\xff\xd7\x00'\x03-\xff\ +\xd7\x00'\x03/\xff\xd7\x00'\x031\xff\xd7\x00'\x03\ +3\xff\xd7\x00'\x03o\xff\xec\x00'\x03q\xff\xec\x00\ +'\x03s\xff\xec\x00'\x03\x8f\xff\xc3\x00(\x00-\x00\ +{\x00)\x00\x0f\xff\x85\x00)\x00\x11\xff\x85\x00)\x00\ +\x22\x00)\x00)\x00$\xff\xd7\x00)\x00\x82\xff\xd7\x00\ +)\x00\x83\xff\xd7\x00)\x00\x84\xff\xd7\x00)\x00\x85\xff\ +\xd7\x00)\x00\x86\xff\xd7\x00)\x00\x87\xff\xd7\x00)\x00\ +\xc2\xff\xd7\x00)\x00\xc4\xff\xd7\x00)\x00\xc6\xff\xd7\x00\ +)\x01C\xff\xd7\x00)\x02\x08\xff\x85\x00)\x02\x0c\xff\ +\x85\x00)\x02X\xff\xd7\x00)\x03\x1d\xff\xd7\x00)\x03\ +\x1f\xff\xd7\x00)\x03!\xff\xd7\x00)\x03#\xff\xd7\x00\ +)\x03%\xff\xd7\x00)\x03'\xff\xd7\x00)\x03)\xff\ +\xd7\x00)\x03+\xff\xd7\x00)\x03-\xff\xd7\x00)\x03\ +/\xff\xd7\x00)\x031\xff\xd7\x00)\x033\xff\xd7\x00\ +.\x00&\xff\xd7\x00.\x00*\xff\xd7\x00.\x002\xff\ +\xd7\x00.\x004\xff\xd7\x00.\x00\x89\xff\xd7\x00.\x00\ +\x94\xff\xd7\x00.\x00\x95\xff\xd7\x00.\x00\x96\xff\xd7\x00\ +.\x00\x97\xff\xd7\x00.\x00\x98\xff\xd7\x00.\x00\x9a\xff\ +\xd7\x00.\x00\xc8\xff\xd7\x00.\x00\xca\xff\xd7\x00.\x00\ +\xcc\xff\xd7\x00.\x00\xce\xff\xd7\x00.\x00\xde\xff\xd7\x00\ +.\x00\xe0\xff\xd7\x00.\x00\xe2\xff\xd7\x00.\x00\xe4\xff\ +\xd7\x00.\x01\x0e\xff\xd7\x00.\x01\x10\xff\xd7\x00.\x01\ +\x12\xff\xd7\x00.\x01\x14\xff\xd7\x00.\x01G\xff\xd7\x00\ +.\x02_\xff\xd7\x00.\x03I\xff\xd7\x00.\x03K\xff\ +\xd7\x00.\x03M\xff\xd7\x00.\x03O\xff\xd7\x00.\x03\ +Q\xff\xd7\x00.\x03S\xff\xd7\x00.\x03U\xff\xd7\x00\ +.\x03W\xff\xd7\x00.\x03Y\xff\xd7\x00.\x03[\xff\ +\xd7\x00.\x03]\xff\xd7\x00.\x03_\xff\xd7\x00/\x00\ +\x05\xff\x5c\x00/\x00\x0a\xff\x5c\x00/\x00&\xff\xd7\x00\ +/\x00*\xff\xd7\x00/\x002\xff\xd7\x00/\x004\xff\ +\xd7\x00/\x007\xff\xd7\x00/\x008\xff\xec\x00/\x00\ +9\xff\xd7\x00/\x00:\xff\xd7\x00/\x00<\xff\xc3\x00\ +/\x00\x89\xff\xd7\x00/\x00\x94\xff\xd7\x00/\x00\x95\xff\ +\xd7\x00/\x00\x96\xff\xd7\x00/\x00\x97\xff\xd7\x00/\x00\ +\x98\xff\xd7\x00/\x00\x9a\xff\xd7\x00/\x00\x9b\xff\xec\x00\ +/\x00\x9c\xff\xec\x00/\x00\x9d\xff\xec\x00/\x00\x9e\xff\ +\xec\x00/\x00\x9f\xff\xc3\x00/\x00\xc8\xff\xd7\x00/\x00\ +\xca\xff\xd7\x00/\x00\xcc\xff\xd7\x00/\x00\xce\xff\xd7\x00\ +/\x00\xde\xff\xd7\x00/\x00\xe0\xff\xd7\x00/\x00\xe2\xff\ +\xd7\x00/\x00\xe4\xff\xd7\x00/\x01\x0e\xff\xd7\x00/\x01\ +\x10\xff\xd7\x00/\x01\x12\xff\xd7\x00/\x01\x14\xff\xd7\x00\ +/\x01$\xff\xd7\x00/\x01&\xff\xd7\x00/\x01*\xff\ +\xec\x00/\x01,\xff\xec\x00/\x01.\xff\xec\x00/\x01\ +0\xff\xec\x00/\x012\xff\xec\x00/\x014\xff\xec\x00\ +/\x016\xff\xd7\x00/\x018\xff\xc3\x00/\x01:\xff\ +\xc3\x00/\x01G\xff\xd7\x00/\x01\xfa\xff\xd7\x00/\x01\ +\xfc\xff\xd7\x00/\x01\xfe\xff\xd7\x00/\x02\x00\xff\xc3\x00\ +/\x02\x07\xff\x5c\x00/\x02\x0b\xff\x5c\x00/\x02_\xff\ +\xd7\x00/\x02a\xff\xec\x00/\x03I\xff\xd7\x00/\x03\ +K\xff\xd7\x00/\x03M\xff\xd7\x00/\x03O\xff\xd7\x00\ +/\x03Q\xff\xd7\x00/\x03S\xff\xd7\x00/\x03U\xff\ +\xd7\x00/\x03W\xff\xd7\x00/\x03Y\xff\xd7\x00/\x03\ +[\xff\xd7\x00/\x03]\xff\xd7\x00/\x03_\xff\xd7\x00\ +/\x03a\xff\xec\x00/\x03c\xff\xec\x00/\x03e\xff\ +\xec\x00/\x03g\xff\xec\x00/\x03i\xff\xec\x00/\x03\ +k\xff\xec\x00/\x03m\xff\xec\x00/\x03o\xff\xc3\x00\ +/\x03q\xff\xc3\x00/\x03s\xff\xc3\x00/\x03\x8f\xff\ +\xd7\x002\x00\x0f\xff\xae\x002\x00\x11\xff\xae\x002\x00\ +$\xff\xd7\x002\x007\xff\xc3\x002\x009\xff\xec\x00\ +2\x00:\xff\xec\x002\x00;\xff\xd7\x002\x00<\xff\ +\xec\x002\x00=\xff\xec\x002\x00\x82\xff\xd7\x002\x00\ +\x83\xff\xd7\x002\x00\x84\xff\xd7\x002\x00\x85\xff\xd7\x00\ +2\x00\x86\xff\xd7\x002\x00\x87\xff\xd7\x002\x00\x9f\xff\ +\xec\x002\x00\xc2\xff\xd7\x002\x00\xc4\xff\xd7\x002\x00\ +\xc6\xff\xd7\x002\x01$\xff\xc3\x002\x01&\xff\xc3\x00\ +2\x016\xff\xec\x002\x018\xff\xec\x002\x01:\xff\ +\xec\x002\x01;\xff\xec\x002\x01=\xff\xec\x002\x01\ +?\xff\xec\x002\x01C\xff\xd7\x002\x01\xa0\xff\xec\x00\ +2\x01\xfa\xff\xec\x002\x01\xfc\xff\xec\x002\x01\xfe\xff\ +\xec\x002\x02\x00\xff\xec\x002\x02\x08\xff\xae\x002\x02\ +\x0c\xff\xae\x002\x02X\xff\xd7\x002\x03\x1d\xff\xd7\x00\ +2\x03\x1f\xff\xd7\x002\x03!\xff\xd7\x002\x03#\xff\ +\xd7\x002\x03%\xff\xd7\x002\x03'\xff\xd7\x002\x03\ +)\xff\xd7\x002\x03+\xff\xd7\x002\x03-\xff\xd7\x00\ +2\x03/\xff\xd7\x002\x031\xff\xd7\x002\x033\xff\ +\xd7\x002\x03o\xff\xec\x002\x03q\xff\xec\x002\x03\ +s\xff\xec\x002\x03\x8f\xff\xc3\x003\x00\x0f\xfe\xf6\x00\ +3\x00\x11\xfe\xf6\x003\x00$\xff\x9a\x003\x00;\xff\ +\xd7\x003\x00=\xff\xec\x003\x00\x82\xff\x9a\x003\x00\ +\x83\xff\x9a\x003\x00\x84\xff\x9a\x003\x00\x85\xff\x9a\x00\ +3\x00\x86\xff\x9a\x003\x00\x87\xff\x9a\x003\x00\xc2\xff\ +\x9a\x003\x00\xc4\xff\x9a\x003\x00\xc6\xff\x9a\x003\x01\ +;\xff\xec\x003\x01=\xff\xec\x003\x01?\xff\xec\x00\ +3\x01C\xff\x9a\x003\x02\x08\xfe\xf6\x003\x02\x0c\xfe\ +\xf6\x003\x02X\xff\x9a\x003\x03\x1d\xff\x9a\x003\x03\ +\x1f\xff\x9a\x003\x03!\xff\x9a\x003\x03#\xff\x9a\x00\ +3\x03%\xff\x9a\x003\x03'\xff\x9a\x003\x03)\xff\ +\x9a\x003\x03+\xff\x9a\x003\x03-\xff\x9a\x003\x03\ +/\xff\x9a\x003\x031\xff\x9a\x003\x033\xff\x9a\x00\ +4\x00\x0f\xff\xae\x004\x00\x11\xff\xae\x004\x00$\xff\ +\xd7\x004\x007\xff\xc3\x004\x009\xff\xec\x004\x00\ +:\xff\xec\x004\x00;\xff\xd7\x004\x00<\xff\xec\x00\ +4\x00=\xff\xec\x004\x00\x82\xff\xd7\x004\x00\x83\xff\ +\xd7\x004\x00\x84\xff\xd7\x004\x00\x85\xff\xd7\x004\x00\ +\x86\xff\xd7\x004\x00\x87\xff\xd7\x004\x00\x9f\xff\xec\x00\ +4\x00\xc2\xff\xd7\x004\x00\xc4\xff\xd7\x004\x00\xc6\xff\ +\xd7\x004\x01$\xff\xc3\x004\x01&\xff\xc3\x004\x01\ +6\xff\xec\x004\x018\xff\xec\x004\x01:\xff\xec\x00\ +4\x01;\xff\xec\x004\x01=\xff\xec\x004\x01?\xff\ +\xec\x004\x01C\xff\xd7\x004\x01\xa0\xff\xec\x004\x01\ +\xfa\xff\xec\x004\x01\xfc\xff\xec\x004\x01\xfe\xff\xec\x00\ +4\x02\x00\xff\xec\x004\x02\x08\xff\xae\x004\x02\x0c\xff\ +\xae\x004\x02X\xff\xd7\x004\x03\x1d\xff\xd7\x004\x03\ +\x1f\xff\xd7\x004\x03!\xff\xd7\x004\x03#\xff\xd7\x00\ +4\x03%\xff\xd7\x004\x03'\xff\xd7\x004\x03)\xff\ +\xd7\x004\x03+\xff\xd7\x004\x03-\xff\xd7\x004\x03\ +/\xff\xd7\x004\x031\xff\xd7\x004\x033\xff\xd7\x00\ +4\x03o\xff\xec\x004\x03q\xff\xec\x004\x03s\xff\ +\xec\x004\x03\x8f\xff\xc3\x007\x00\x0f\xff\x85\x007\x00\ +\x10\xff\xae\x007\x00\x11\xff\x85\x007\x00\x22\x00)\x00\ +7\x00$\xffq\x007\x00&\xff\xd7\x007\x00*\xff\ +\xd7\x007\x002\xff\xd7\x007\x004\xff\xd7\x007\x00\ +7\x00)\x007\x00D\xff\x5c\x007\x00F\xffq\x00\ +7\x00G\xffq\x007\x00H\xffq\x007\x00J\xff\ +q\x007\x00P\xff\x9a\x007\x00Q\xff\x9a\x007\x00\ +R\xffq\x007\x00S\xff\x9a\x007\x00T\xffq\x00\ +7\x00U\xff\x9a\x007\x00V\xff\x85\x007\x00X\xff\ +\x9a\x007\x00Y\xff\xd7\x007\x00Z\xff\xd7\x007\x00\ +[\xff\xd7\x007\x00\x5c\xff\xd7\x007\x00]\xff\xae\x00\ +7\x00\x82\xffq\x007\x00\x83\xffq\x007\x00\x84\xff\ +q\x007\x00\x85\xffq\x007\x00\x86\xffq\x007\x00\ +\x87\xffq\x007\x00\x89\xff\xd7\x007\x00\x94\xff\xd7\x00\ +7\x00\x95\xff\xd7\x007\x00\x96\xff\xd7\x007\x00\x97\xff\ +\xd7\x007\x00\x98\xff\xd7\x007\x00\x9a\xff\xd7\x007\x00\ +\xa2\xffq\x007\x00\xa3\xff\x5c\x007\x00\xa4\xff\x5c\x00\ +7\x00\xa5\xff\x5c\x007\x00\xa6\xff\x5c\x007\x00\xa7\xff\ +\x5c\x007\x00\xa8\xff\x5c\x007\x00\xa9\xffq\x007\x00\ +\xaa\xffq\x007\x00\xab\xffq\x007\x00\xac\xffq\x00\ +7\x00\xad\xffq\x007\x00\xb4\xffq\x007\x00\xb5\xff\ +q\x007\x00\xb6\xffq\x007\x00\xb7\xffq\x007\x00\ +\xb8\xffq\x007\x00\xba\xffq\x007\x00\xbb\xff\x9a\x00\ +7\x00\xbc\xff\x9a\x007\x00\xbd\xff\x9a\x007\x00\xbe\xff\ +\x9a\x007\x00\xbf\xff\xd7\x007\x00\xc2\xffq\x007\x00\ +\xc3\xff\x5c\x007\x00\xc4\xffq\x007\x00\xc5\xff\x5c\x00\ +7\x00\xc6\xffq\x007\x00\xc7\xff\x5c\x007\x00\xc8\xff\ +\xd7\x007\x00\xc9\xffq\x007\x00\xca\xff\xd7\x007\x00\ +\xcb\xffq\x007\x00\xcc\xff\xd7\x007\x00\xcd\xffq\x00\ +7\x00\xce\xff\xd7\x007\x00\xcf\xffq\x007\x00\xd1\xff\ +q\x007\x00\xd3\xffq\x007\x00\xd5\xffq\x007\x00\ +\xd7\xffq\x007\x00\xd9\xffq\x007\x00\xdb\xffq\x00\ +7\x00\xdd\xffq\x007\x00\xde\xff\xd7\x007\x00\xdf\xff\ +q\x007\x00\xe0\xff\xd7\x007\x00\xe1\xffq\x007\x00\ +\xe2\xff\xd7\x007\x00\xe3\xffq\x007\x00\xe4\xff\xd7\x00\ +7\x00\xe5\xffq\x007\x00\xfa\xff\x9a\x007\x01\x06\xff\ +\x9a\x007\x01\x08\xff\x9a\x007\x01\x0d\xff\x9a\x007\x01\ +\x0e\xff\xd7\x007\x01\x0f\xffq\x007\x01\x10\xff\xd7\x00\ +7\x01\x11\xffq\x007\x01\x12\xff\xd7\x007\x01\x13\xff\ +q\x007\x01\x14\xff\xd7\x007\x01\x15\xffq\x007\x01\ +\x17\xff\x9a\x007\x01\x19\xff\x9a\x007\x01\x1d\xff\x85\x00\ +7\x01!\xff\x85\x007\x01$\x00)\x007\x01&\x00\ +)\x007\x01+\xff\x9a\x007\x01-\xff\x9a\x007\x01\ +/\xff\x9a\x007\x011\xff\x9a\x007\x013\xff\x9a\x00\ +7\x015\xff\x9a\x007\x017\xff\xd7\x007\x01<\xff\ +\xae\x007\x01>\xff\xae\x007\x01@\xff\xae\x007\x01\ +C\xffq\x007\x01D\xff\x5c\x007\x01F\xff\x5c\x00\ +7\x01G\xff\xd7\x007\x01H\xffq\x007\x01J\xff\ +\x85\x007\x01\xfb\xff\xd7\x007\x01\xfd\xff\xd7\x007\x02\ +\x02\xff\xae\x007\x02\x03\xff\xae\x007\x02\x04\xff\xae\x00\ +7\x02\x08\xff\x85\x007\x02\x0c\xff\x85\x007\x02W\xff\ +\x9a\x007\x02X\xffq\x007\x02Y\xff\x5c\x007\x02\ +_\xff\xd7\x007\x02`\xffq\x007\x02b\xff\x9a\x00\ +7\x03\x1d\xffq\x007\x03\x1e\xff\x5c\x007\x03\x1f\xff\ +q\x007\x03 \xff\x5c\x007\x03!\xffq\x007\x03\ +\x22\xff\x5c\x007\x03#\xffq\x007\x03%\xffq\x00\ +7\x03&\xff\x5c\x007\x03'\xffq\x007\x03(\xff\ +\x5c\x007\x03)\xffq\x007\x03*\xff\x5c\x007\x03\ ++\xffq\x007\x03,\xff\x5c\x007\x03-\xffq\x00\ +7\x03.\xff\x5c\x007\x03/\xffq\x007\x030\xff\ +\x5c\x007\x031\xffq\x007\x032\xff\x5c\x007\x03\ +3\xffq\x007\x034\xff\x5c\x007\x036\xffq\x00\ +7\x038\xffq\x007\x03:\xffq\x007\x03<\xff\ +q\x007\x03@\xffq\x007\x03B\xffq\x007\x03\ +D\xffq\x007\x03I\xff\xd7\x007\x03J\xffq\x00\ +7\x03K\xff\xd7\x007\x03L\xffq\x007\x03M\xff\ +\xd7\x007\x03N\xffq\x007\x03O\xff\xd7\x007\x03\ +Q\xff\xd7\x007\x03R\xffq\x007\x03S\xff\xd7\x00\ +7\x03T\xffq\x007\x03U\xff\xd7\x007\x03V\xff\ +q\x007\x03W\xff\xd7\x007\x03X\xffq\x007\x03\ +Y\xff\xd7\x007\x03Z\xffq\x007\x03[\xff\xd7\x00\ +7\x03\x5c\xffq\x007\x03]\xff\xd7\x007\x03^\xff\ +q\x007\x03_\xff\xd7\x007\x03`\xffq\x007\x03\ +b\xff\x9a\x007\x03d\xff\x9a\x007\x03f\xff\x9a\x00\ +7\x03h\xff\x9a\x007\x03j\xff\x9a\x007\x03l\xff\ +\x9a\x007\x03n\xff\x9a\x007\x03p\xff\xd7\x007\x03\ +\x8f\x00)\x008\x00\x0f\xff\xd7\x008\x00\x11\xff\xd7\x00\ +8\x00$\xff\xec\x008\x00\x82\xff\xec\x008\x00\x83\xff\ +\xec\x008\x00\x84\xff\xec\x008\x00\x85\xff\xec\x008\x00\ +\x86\xff\xec\x008\x00\x87\xff\xec\x008\x00\xc2\xff\xec\x00\ +8\x00\xc4\xff\xec\x008\x00\xc6\xff\xec\x008\x01C\xff\ +\xec\x008\x02\x08\xff\xd7\x008\x02\x0c\xff\xd7\x008\x02\ +X\xff\xec\x008\x03\x1d\xff\xec\x008\x03\x1f\xff\xec\x00\ +8\x03!\xff\xec\x008\x03#\xff\xec\x008\x03%\xff\ +\xec\x008\x03'\xff\xec\x008\x03)\xff\xec\x008\x03\ ++\xff\xec\x008\x03-\xff\xec\x008\x03/\xff\xec\x00\ +8\x031\xff\xec\x008\x033\xff\xec\x009\x00\x0f\xff\ +\x9a\x009\x00\x11\xff\x9a\x009\x00\x22\x00)\x009\x00\ +$\xff\xae\x009\x00&\xff\xec\x009\x00*\xff\xec\x00\ +9\x002\xff\xec\x009\x004\xff\xec\x009\x00D\xff\ +\xd7\x009\x00F\xff\xd7\x009\x00G\xff\xd7\x009\x00\ +H\xff\xd7\x009\x00J\xff\xec\x009\x00P\xff\xec\x00\ +9\x00Q\xff\xec\x009\x00R\xff\xd7\x009\x00S\xff\ +\xec\x009\x00T\xff\xd7\x009\x00U\xff\xec\x009\x00\ +V\xff\xec\x009\x00X\xff\xec\x009\x00\x82\xff\xae\x00\ +9\x00\x83\xff\xae\x009\x00\x84\xff\xae\x009\x00\x85\xff\ +\xae\x009\x00\x86\xff\xae\x009\x00\x87\xff\xae\x009\x00\ +\x89\xff\xec\x009\x00\x94\xff\xec\x009\x00\x95\xff\xec\x00\ +9\x00\x96\xff\xec\x009\x00\x97\xff\xec\x009\x00\x98\xff\ +\xec\x009\x00\x9a\xff\xec\x009\x00\xa2\xff\xd7\x009\x00\ +\xa3\xff\xd7\x009\x00\xa4\xff\xd7\x009\x00\xa5\xff\xd7\x00\ +9\x00\xa6\xff\xd7\x009\x00\xa7\xff\xd7\x009\x00\xa8\xff\ +\xd7\x009\x00\xa9\xff\xd7\x009\x00\xaa\xff\xd7\x009\x00\ +\xab\xff\xd7\x009\x00\xac\xff\xd7\x009\x00\xad\xff\xd7\x00\ +9\x00\xb4\xff\xd7\x009\x00\xb5\xff\xd7\x009\x00\xb6\xff\ +\xd7\x009\x00\xb7\xff\xd7\x009\x00\xb8\xff\xd7\x009\x00\ +\xba\xff\xd7\x009\x00\xbb\xff\xec\x009\x00\xbc\xff\xec\x00\ +9\x00\xbd\xff\xec\x009\x00\xbe\xff\xec\x009\x00\xc2\xff\ +\xae\x009\x00\xc3\xff\xd7\x009\x00\xc4\xff\xae\x009\x00\ +\xc5\xff\xd7\x009\x00\xc6\xff\xae\x009\x00\xc7\xff\xd7\x00\ +9\x00\xc8\xff\xec\x009\x00\xc9\xff\xd7\x009\x00\xca\xff\ +\xec\x009\x00\xcb\xff\xd7\x009\x00\xcc\xff\xec\x009\x00\ +\xcd\xff\xd7\x009\x00\xce\xff\xec\x009\x00\xcf\xff\xd7\x00\ +9\x00\xd1\xff\xd7\x009\x00\xd3\xff\xd7\x009\x00\xd5\xff\ +\xd7\x009\x00\xd7\xff\xd7\x009\x00\xd9\xff\xd7\x009\x00\ +\xdb\xff\xd7\x009\x00\xdd\xff\xd7\x009\x00\xde\xff\xec\x00\ +9\x00\xdf\xff\xec\x009\x00\xe0\xff\xec\x009\x00\xe1\xff\ +\xec\x009\x00\xe2\xff\xec\x009\x00\xe3\xff\xec\x009\x00\ +\xe4\xff\xec\x009\x00\xe5\xff\xec\x009\x00\xfa\xff\xec\x00\ +9\x01\x06\xff\xec\x009\x01\x08\xff\xec\x009\x01\x0d\xff\ +\xec\x009\x01\x0e\xff\xec\x009\x01\x0f\xff\xd7\x009\x01\ +\x10\xff\xec\x009\x01\x11\xff\xd7\x009\x01\x12\xff\xec\x00\ +9\x01\x13\xff\xd7\x009\x01\x14\xff\xec\x009\x01\x15\xff\ +\xd7\x009\x01\x17\xff\xec\x009\x01\x19\xff\xec\x009\x01\ +\x1d\xff\xec\x009\x01!\xff\xec\x009\x01+\xff\xec\x00\ +9\x01-\xff\xec\x009\x01/\xff\xec\x009\x011\xff\ +\xec\x009\x013\xff\xec\x009\x015\xff\xec\x009\x01\ +C\xff\xae\x009\x01D\xff\xd7\x009\x01F\xff\xd7\x00\ +9\x01G\xff\xec\x009\x01H\xff\xd7\x009\x01J\xff\ +\xec\x009\x02\x08\xff\x9a\x009\x02\x0c\xff\x9a\x009\x02\ +W\xff\xec\x009\x02X\xff\xae\x009\x02Y\xff\xd7\x00\ +9\x02_\xff\xec\x009\x02`\xff\xd7\x009\x02b\xff\ +\xec\x009\x03\x1d\xff\xae\x009\x03\x1e\xff\xd7\x009\x03\ +\x1f\xff\xae\x009\x03 \xff\xd7\x009\x03!\xff\xae\x00\ +9\x03\x22\xff\xd7\x009\x03#\xff\xae\x009\x03%\xff\ +\xae\x009\x03&\xff\xd7\x009\x03'\xff\xae\x009\x03\ +(\xff\xd7\x009\x03)\xff\xae\x009\x03*\xff\xd7\x00\ +9\x03+\xff\xae\x009\x03,\xff\xd7\x009\x03-\xff\ +\xae\x009\x03.\xff\xd7\x009\x03/\xff\xae\x009\x03\ +0\xff\xd7\x009\x031\xff\xae\x009\x032\xff\xd7\x00\ +9\x033\xff\xae\x009\x034\xff\xd7\x009\x036\xff\ +\xd7\x009\x038\xff\xd7\x009\x03:\xff\xd7\x009\x03\ +<\xff\xd7\x009\x03@\xff\xd7\x009\x03B\xff\xd7\x00\ +9\x03D\xff\xd7\x009\x03I\xff\xec\x009\x03J\xff\ +\xd7\x009\x03K\xff\xec\x009\x03L\xff\xd7\x009\x03\ +M\xff\xec\x009\x03N\xff\xd7\x009\x03O\xff\xec\x00\ +9\x03Q\xff\xec\x009\x03R\xff\xd7\x009\x03S\xff\ +\xec\x009\x03T\xff\xd7\x009\x03U\xff\xec\x009\x03\ +V\xff\xd7\x009\x03W\xff\xec\x009\x03X\xff\xd7\x00\ +9\x03Y\xff\xec\x009\x03Z\xff\xd7\x009\x03[\xff\ +\xec\x009\x03\x5c\xff\xd7\x009\x03]\xff\xec\x009\x03\ +^\xff\xd7\x009\x03_\xff\xec\x009\x03`\xff\xd7\x00\ +9\x03b\xff\xec\x009\x03d\xff\xec\x009\x03f\xff\ +\xec\x009\x03h\xff\xec\x009\x03j\xff\xec\x009\x03\ +l\xff\xec\x009\x03n\xff\xec\x00:\x00\x0f\xff\x9a\x00\ +:\x00\x11\xff\x9a\x00:\x00\x22\x00)\x00:\x00$\xff\ +\xae\x00:\x00&\xff\xec\x00:\x00*\xff\xec\x00:\x00\ +2\xff\xec\x00:\x004\xff\xec\x00:\x00D\xff\xd7\x00\ +:\x00F\xff\xd7\x00:\x00G\xff\xd7\x00:\x00H\xff\ +\xd7\x00:\x00J\xff\xec\x00:\x00P\xff\xec\x00:\x00\ +Q\xff\xec\x00:\x00R\xff\xd7\x00:\x00S\xff\xec\x00\ +:\x00T\xff\xd7\x00:\x00U\xff\xec\x00:\x00V\xff\ +\xec\x00:\x00X\xff\xec\x00:\x00\x82\xff\xae\x00:\x00\ +\x83\xff\xae\x00:\x00\x84\xff\xae\x00:\x00\x85\xff\xae\x00\ +:\x00\x86\xff\xae\x00:\x00\x87\xff\xae\x00:\x00\x89\xff\ +\xec\x00:\x00\x94\xff\xec\x00:\x00\x95\xff\xec\x00:\x00\ +\x96\xff\xec\x00:\x00\x97\xff\xec\x00:\x00\x98\xff\xec\x00\ +:\x00\x9a\xff\xec\x00:\x00\xa2\xff\xd7\x00:\x00\xa3\xff\ +\xd7\x00:\x00\xa4\xff\xd7\x00:\x00\xa5\xff\xd7\x00:\x00\ +\xa6\xff\xd7\x00:\x00\xa7\xff\xd7\x00:\x00\xa8\xff\xd7\x00\ +:\x00\xa9\xff\xd7\x00:\x00\xaa\xff\xd7\x00:\x00\xab\xff\ +\xd7\x00:\x00\xac\xff\xd7\x00:\x00\xad\xff\xd7\x00:\x00\ +\xb4\xff\xd7\x00:\x00\xb5\xff\xd7\x00:\x00\xb6\xff\xd7\x00\ +:\x00\xb7\xff\xd7\x00:\x00\xb8\xff\xd7\x00:\x00\xba\xff\ +\xd7\x00:\x00\xbb\xff\xec\x00:\x00\xbc\xff\xec\x00:\x00\ +\xbd\xff\xec\x00:\x00\xbe\xff\xec\x00:\x00\xc2\xff\xae\x00\ +:\x00\xc3\xff\xd7\x00:\x00\xc4\xff\xae\x00:\x00\xc5\xff\ +\xd7\x00:\x00\xc6\xff\xae\x00:\x00\xc7\xff\xd7\x00:\x00\ +\xc8\xff\xec\x00:\x00\xc9\xff\xd7\x00:\x00\xca\xff\xec\x00\ +:\x00\xcb\xff\xd7\x00:\x00\xcc\xff\xec\x00:\x00\xcd\xff\ +\xd7\x00:\x00\xce\xff\xec\x00:\x00\xcf\xff\xd7\x00:\x00\ +\xd1\xff\xd7\x00:\x00\xd3\xff\xd7\x00:\x00\xd5\xff\xd7\x00\ +:\x00\xd7\xff\xd7\x00:\x00\xd9\xff\xd7\x00:\x00\xdb\xff\ +\xd7\x00:\x00\xdd\xff\xd7\x00:\x00\xde\xff\xec\x00:\x00\ +\xdf\xff\xec\x00:\x00\xe0\xff\xec\x00:\x00\xe1\xff\xec\x00\ +:\x00\xe2\xff\xec\x00:\x00\xe3\xff\xec\x00:\x00\xe4\xff\ +\xec\x00:\x00\xe5\xff\xec\x00:\x00\xfa\xff\xec\x00:\x01\ +\x06\xff\xec\x00:\x01\x08\xff\xec\x00:\x01\x0d\xff\xec\x00\ +:\x01\x0e\xff\xec\x00:\x01\x0f\xff\xd7\x00:\x01\x10\xff\ +\xec\x00:\x01\x11\xff\xd7\x00:\x01\x12\xff\xec\x00:\x01\ +\x13\xff\xd7\x00:\x01\x14\xff\xec\x00:\x01\x15\xff\xd7\x00\ +:\x01\x17\xff\xec\x00:\x01\x19\xff\xec\x00:\x01\x1d\xff\ +\xec\x00:\x01!\xff\xec\x00:\x01+\xff\xec\x00:\x01\ +-\xff\xec\x00:\x01/\xff\xec\x00:\x011\xff\xec\x00\ +:\x013\xff\xec\x00:\x015\xff\xec\x00:\x01C\xff\ +\xae\x00:\x01D\xff\xd7\x00:\x01F\xff\xd7\x00:\x01\ +G\xff\xec\x00:\x01H\xff\xd7\x00:\x01J\xff\xec\x00\ +:\x02\x08\xff\x9a\x00:\x02\x0c\xff\x9a\x00:\x02W\xff\ +\xec\x00:\x02X\xff\xae\x00:\x02Y\xff\xd7\x00:\x02\ +_\xff\xec\x00:\x02`\xff\xd7\x00:\x02b\xff\xec\x00\ +:\x03\x1d\xff\xae\x00:\x03\x1e\xff\xd7\x00:\x03\x1f\xff\ +\xae\x00:\x03 \xff\xd7\x00:\x03!\xff\xae\x00:\x03\ +\x22\xff\xd7\x00:\x03#\xff\xae\x00:\x03%\xff\xae\x00\ +:\x03&\xff\xd7\x00:\x03'\xff\xae\x00:\x03(\xff\ +\xd7\x00:\x03)\xff\xae\x00:\x03*\xff\xd7\x00:\x03\ ++\xff\xae\x00:\x03,\xff\xd7\x00:\x03-\xff\xae\x00\ +:\x03.\xff\xd7\x00:\x03/\xff\xae\x00:\x030\xff\ +\xd7\x00:\x031\xff\xae\x00:\x032\xff\xd7\x00:\x03\ +3\xff\xae\x00:\x034\xff\xd7\x00:\x036\xff\xd7\x00\ +:\x038\xff\xd7\x00:\x03:\xff\xd7\x00:\x03<\xff\ +\xd7\x00:\x03@\xff\xd7\x00:\x03B\xff\xd7\x00:\x03\ +D\xff\xd7\x00:\x03I\xff\xec\x00:\x03J\xff\xd7\x00\ +:\x03K\xff\xec\x00:\x03L\xff\xd7\x00:\x03M\xff\ +\xec\x00:\x03N\xff\xd7\x00:\x03O\xff\xec\x00:\x03\ +Q\xff\xec\x00:\x03R\xff\xd7\x00:\x03S\xff\xec\x00\ +:\x03T\xff\xd7\x00:\x03U\xff\xec\x00:\x03V\xff\ +\xd7\x00:\x03W\xff\xec\x00:\x03X\xff\xd7\x00:\x03\ +Y\xff\xec\x00:\x03Z\xff\xd7\x00:\x03[\xff\xec\x00\ +:\x03\x5c\xff\xd7\x00:\x03]\xff\xec\x00:\x03^\xff\ +\xd7\x00:\x03_\xff\xec\x00:\x03`\xff\xd7\x00:\x03\ +b\xff\xec\x00:\x03d\xff\xec\x00:\x03f\xff\xec\x00\ +:\x03h\xff\xec\x00:\x03j\xff\xec\x00:\x03l\xff\ +\xec\x00:\x03n\xff\xec\x00;\x00&\xff\xd7\x00;\x00\ +*\xff\xd7\x00;\x002\xff\xd7\x00;\x004\xff\xd7\x00\ +;\x00\x89\xff\xd7\x00;\x00\x94\xff\xd7\x00;\x00\x95\xff\ +\xd7\x00;\x00\x96\xff\xd7\x00;\x00\x97\xff\xd7\x00;\x00\ +\x98\xff\xd7\x00;\x00\x9a\xff\xd7\x00;\x00\xc8\xff\xd7\x00\ +;\x00\xca\xff\xd7\x00;\x00\xcc\xff\xd7\x00;\x00\xce\xff\ +\xd7\x00;\x00\xde\xff\xd7\x00;\x00\xe0\xff\xd7\x00;\x00\ +\xe2\xff\xd7\x00;\x00\xe4\xff\xd7\x00;\x01\x0e\xff\xd7\x00\ +;\x01\x10\xff\xd7\x00;\x01\x12\xff\xd7\x00;\x01\x14\xff\ +\xd7\x00;\x01G\xff\xd7\x00;\x02_\xff\xd7\x00;\x03\ +I\xff\xd7\x00;\x03K\xff\xd7\x00;\x03M\xff\xd7\x00\ +;\x03O\xff\xd7\x00;\x03Q\xff\xd7\x00;\x03S\xff\ +\xd7\x00;\x03U\xff\xd7\x00;\x03W\xff\xd7\x00;\x03\ +Y\xff\xd7\x00;\x03[\xff\xd7\x00;\x03]\xff\xd7\x00\ +;\x03_\xff\xd7\x00<\x00\x0f\xff\x85\x00<\x00\x11\xff\ +\x85\x00<\x00\x22\x00)\x00<\x00$\xff\x85\x00<\x00\ +&\xff\xd7\x00<\x00*\xff\xd7\x00<\x002\xff\xd7\x00\ +<\x004\xff\xd7\x00<\x00D\xff\x9a\x00<\x00F\xff\ +\x9a\x00<\x00G\xff\x9a\x00<\x00H\xff\x9a\x00<\x00\ +J\xff\xd7\x00<\x00P\xff\xc3\x00<\x00Q\xff\xc3\x00\ +<\x00R\xff\x9a\x00<\x00S\xff\xc3\x00<\x00T\xff\ +\x9a\x00<\x00U\xff\xc3\x00<\x00V\xff\xae\x00<\x00\ +X\xff\xc3\x00<\x00]\xff\xd7\x00<\x00\x82\xff\x85\x00\ +<\x00\x83\xff\x85\x00<\x00\x84\xff\x85\x00<\x00\x85\xff\ +\x85\x00<\x00\x86\xff\x85\x00<\x00\x87\xff\x85\x00<\x00\ +\x89\xff\xd7\x00<\x00\x94\xff\xd7\x00<\x00\x95\xff\xd7\x00\ +<\x00\x96\xff\xd7\x00<\x00\x97\xff\xd7\x00<\x00\x98\xff\ +\xd7\x00<\x00\x9a\xff\xd7\x00<\x00\xa2\xff\x9a\x00<\x00\ +\xa3\xff\x9a\x00<\x00\xa4\xff\x9a\x00<\x00\xa5\xff\x9a\x00\ +<\x00\xa6\xff\x9a\x00<\x00\xa7\xff\x9a\x00<\x00\xa8\xff\ +\x9a\x00<\x00\xa9\xff\x9a\x00<\x00\xaa\xff\x9a\x00<\x00\ +\xab\xff\x9a\x00<\x00\xac\xff\x9a\x00<\x00\xad\xff\x9a\x00\ +<\x00\xb4\xff\x9a\x00<\x00\xb5\xff\x9a\x00<\x00\xb6\xff\ +\x9a\x00<\x00\xb7\xff\x9a\x00<\x00\xb8\xff\x9a\x00<\x00\ +\xba\xff\x9a\x00<\x00\xbb\xff\xc3\x00<\x00\xbc\xff\xc3\x00\ +<\x00\xbd\xff\xc3\x00<\x00\xbe\xff\xc3\x00<\x00\xc2\xff\ +\x85\x00<\x00\xc3\xff\x9a\x00<\x00\xc4\xff\x85\x00<\x00\ +\xc5\xff\x9a\x00<\x00\xc6\xff\x85\x00<\x00\xc7\xff\x9a\x00\ +<\x00\xc8\xff\xd7\x00<\x00\xc9\xff\x9a\x00<\x00\xca\xff\ +\xd7\x00<\x00\xcb\xff\x9a\x00<\x00\xcc\xff\xd7\x00<\x00\ +\xcd\xff\x9a\x00<\x00\xce\xff\xd7\x00<\x00\xcf\xff\x9a\x00\ +<\x00\xd1\xff\x9a\x00<\x00\xd3\xff\x9a\x00<\x00\xd5\xff\ +\x9a\x00<\x00\xd7\xff\x9a\x00<\x00\xd9\xff\x9a\x00<\x00\ +\xdb\xff\x9a\x00<\x00\xdd\xff\x9a\x00<\x00\xde\xff\xd7\x00\ +<\x00\xdf\xff\xd7\x00<\x00\xe0\xff\xd7\x00<\x00\xe1\xff\ +\xd7\x00<\x00\xe2\xff\xd7\x00<\x00\xe3\xff\xd7\x00<\x00\ +\xe4\xff\xd7\x00<\x00\xe5\xff\xd7\x00<\x00\xfa\xff\xc3\x00\ +<\x01\x06\xff\xc3\x00<\x01\x08\xff\xc3\x00<\x01\x0d\xff\ +\xc3\x00<\x01\x0e\xff\xd7\x00<\x01\x0f\xff\x9a\x00<\x01\ +\x10\xff\xd7\x00<\x01\x11\xff\x9a\x00<\x01\x12\xff\xd7\x00\ +<\x01\x13\xff\x9a\x00<\x01\x14\xff\xd7\x00<\x01\x15\xff\ +\x9a\x00<\x01\x17\xff\xc3\x00<\x01\x19\xff\xc3\x00<\x01\ +\x1d\xff\xae\x00<\x01!\xff\xae\x00<\x01+\xff\xc3\x00\ +<\x01-\xff\xc3\x00<\x01/\xff\xc3\x00<\x011\xff\ +\xc3\x00<\x013\xff\xc3\x00<\x015\xff\xc3\x00<\x01\ +<\xff\xd7\x00<\x01>\xff\xd7\x00<\x01@\xff\xd7\x00\ +<\x01C\xff\x85\x00<\x01D\xff\x9a\x00<\x01F\xff\ +\x9a\x00<\x01G\xff\xd7\x00<\x01H\xff\x9a\x00<\x01\ +J\xff\xae\x00<\x02\x08\xff\x85\x00<\x02\x0c\xff\x85\x00\ +<\x02W\xff\xc3\x00<\x02X\xff\x85\x00<\x02Y\xff\ +\x9a\x00<\x02_\xff\xd7\x00<\x02`\xff\x9a\x00<\x02\ +b\xff\xc3\x00<\x03\x1d\xff\x85\x00<\x03\x1e\xff\x9a\x00\ +<\x03\x1f\xff\x85\x00<\x03 \xff\x9a\x00<\x03!\xff\ +\x85\x00<\x03\x22\xff\x9a\x00<\x03#\xff\x85\x00<\x03\ +%\xff\x85\x00<\x03&\xff\x9a\x00<\x03'\xff\x85\x00\ +<\x03(\xff\x9a\x00<\x03)\xff\x85\x00<\x03*\xff\ +\x9a\x00<\x03+\xff\x85\x00<\x03,\xff\x9a\x00<\x03\ +-\xff\x85\x00<\x03.\xff\x9a\x00<\x03/\xff\x85\x00\ +<\x030\xff\x9a\x00<\x031\xff\x85\x00<\x032\xff\ +\x9a\x00<\x033\xff\x85\x00<\x034\xff\x9a\x00<\x03\ +6\xff\x9a\x00<\x038\xff\x9a\x00<\x03:\xff\x9a\x00\ +<\x03<\xff\x9a\x00<\x03@\xff\x9a\x00<\x03B\xff\ +\x9a\x00<\x03D\xff\x9a\x00<\x03I\xff\xd7\x00<\x03\ +J\xff\x9a\x00<\x03K\xff\xd7\x00<\x03L\xff\x9a\x00\ +<\x03M\xff\xd7\x00<\x03N\xff\x9a\x00<\x03O\xff\ +\xd7\x00<\x03Q\xff\xd7\x00<\x03R\xff\x9a\x00<\x03\ +S\xff\xd7\x00<\x03T\xff\x9a\x00<\x03U\xff\xd7\x00\ +<\x03V\xff\x9a\x00<\x03W\xff\xd7\x00<\x03X\xff\ +\x9a\x00<\x03Y\xff\xd7\x00<\x03Z\xff\x9a\x00<\x03\ +[\xff\xd7\x00<\x03\x5c\xff\x9a\x00<\x03]\xff\xd7\x00\ +<\x03^\xff\x9a\x00<\x03_\xff\xd7\x00<\x03`\xff\ +\x9a\x00<\x03b\xff\xc3\x00<\x03d\xff\xc3\x00<\x03\ +f\xff\xc3\x00<\x03h\xff\xc3\x00<\x03j\xff\xc3\x00\ +<\x03l\xff\xc3\x00<\x03n\xff\xc3\x00=\x00&\xff\ +\xec\x00=\x00*\xff\xec\x00=\x002\xff\xec\x00=\x00\ +4\xff\xec\x00=\x00\x89\xff\xec\x00=\x00\x94\xff\xec\x00\ +=\x00\x95\xff\xec\x00=\x00\x96\xff\xec\x00=\x00\x97\xff\ +\xec\x00=\x00\x98\xff\xec\x00=\x00\x9a\xff\xec\x00=\x00\ +\xc8\xff\xec\x00=\x00\xca\xff\xec\x00=\x00\xcc\xff\xec\x00\ +=\x00\xce\xff\xec\x00=\x00\xde\xff\xec\x00=\x00\xe0\xff\ +\xec\x00=\x00\xe2\xff\xec\x00=\x00\xe4\xff\xec\x00=\x01\ +\x0e\xff\xec\x00=\x01\x10\xff\xec\x00=\x01\x12\xff\xec\x00\ +=\x01\x14\xff\xec\x00=\x01G\xff\xec\x00=\x02_\xff\ +\xec\x00=\x03I\xff\xec\x00=\x03K\xff\xec\x00=\x03\ +M\xff\xec\x00=\x03O\xff\xec\x00=\x03Q\xff\xec\x00\ +=\x03S\xff\xec\x00=\x03U\xff\xec\x00=\x03W\xff\ +\xec\x00=\x03Y\xff\xec\x00=\x03[\xff\xec\x00=\x03\ +]\xff\xec\x00=\x03_\xff\xec\x00>\x00-\x00\xb8\x00\ +D\x00\x05\xff\xec\x00D\x00\x0a\xff\xec\x00D\x02\x07\xff\ +\xec\x00D\x02\x0b\xff\xec\x00E\x00\x05\xff\xec\x00E\x00\ +\x0a\xff\xec\x00E\x00Y\xff\xd7\x00E\x00Z\xff\xd7\x00\ +E\x00[\xff\xd7\x00E\x00\x5c\xff\xd7\x00E\x00]\xff\ +\xec\x00E\x00\xbf\xff\xd7\x00E\x017\xff\xd7\x00E\x01\ +<\xff\xec\x00E\x01>\xff\xec\x00E\x01@\xff\xec\x00\ +E\x01\xfb\xff\xd7\x00E\x01\xfd\xff\xd7\x00E\x02\x07\xff\ +\xec\x00E\x02\x0b\xff\xec\x00E\x03p\xff\xd7\x00F\x00\ +\x05\x00)\x00F\x00\x0a\x00)\x00F\x02\x07\x00)\x00\ +F\x02\x0b\x00)\x00H\x00\x05\xff\xec\x00H\x00\x0a\xff\ +\xec\x00H\x00Y\xff\xd7\x00H\x00Z\xff\xd7\x00H\x00\ +[\xff\xd7\x00H\x00\x5c\xff\xd7\x00H\x00]\xff\xec\x00\ +H\x00\xbf\xff\xd7\x00H\x017\xff\xd7\x00H\x01<\xff\ +\xec\x00H\x01>\xff\xec\x00H\x01@\xff\xec\x00H\x01\ +\xfb\xff\xd7\x00H\x01\xfd\xff\xd7\x00H\x02\x07\xff\xec\x00\ +H\x02\x0b\xff\xec\x00H\x03p\xff\xd7\x00I\x00\x05\x00\ +{\x00I\x00\x0a\x00{\x00I\x02\x07\x00{\x00I\x02\ +\x0b\x00{\x00K\x00\x05\xff\xec\x00K\x00\x0a\xff\xec\x00\ +K\x02\x07\xff\xec\x00K\x02\x0b\xff\xec\x00N\x00F\xff\ +\xd7\x00N\x00G\xff\xd7\x00N\x00H\xff\xd7\x00N\x00\ +R\xff\xd7\x00N\x00T\xff\xd7\x00N\x00\xa2\xff\xd7\x00\ +N\x00\xa9\xff\xd7\x00N\x00\xaa\xff\xd7\x00N\x00\xab\xff\ +\xd7\x00N\x00\xac\xff\xd7\x00N\x00\xad\xff\xd7\x00N\x00\ +\xb4\xff\xd7\x00N\x00\xb5\xff\xd7\x00N\x00\xb6\xff\xd7\x00\ +N\x00\xb7\xff\xd7\x00N\x00\xb8\xff\xd7\x00N\x00\xba\xff\ +\xd7\x00N\x00\xc9\xff\xd7\x00N\x00\xcb\xff\xd7\x00N\x00\ +\xcd\xff\xd7\x00N\x00\xcf\xff\xd7\x00N\x00\xd1\xff\xd7\x00\ +N\x00\xd3\xff\xd7\x00N\x00\xd5\xff\xd7\x00N\x00\xd7\xff\ +\xd7\x00N\x00\xd9\xff\xd7\x00N\x00\xdb\xff\xd7\x00N\x00\ +\xdd\xff\xd7\x00N\x01\x0f\xff\xd7\x00N\x01\x11\xff\xd7\x00\ +N\x01\x13\xff\xd7\x00N\x01\x15\xff\xd7\x00N\x01H\xff\ +\xd7\x00N\x02`\xff\xd7\x00N\x036\xff\xd7\x00N\x03\ +8\xff\xd7\x00N\x03:\xff\xd7\x00N\x03<\xff\xd7\x00\ +N\x03@\xff\xd7\x00N\x03B\xff\xd7\x00N\x03D\xff\ +\xd7\x00N\x03J\xff\xd7\x00N\x03L\xff\xd7\x00N\x03\ +N\xff\xd7\x00N\x03R\xff\xd7\x00N\x03T\xff\xd7\x00\ +N\x03V\xff\xd7\x00N\x03X\xff\xd7\x00N\x03Z\xff\ +\xd7\x00N\x03\x5c\xff\xd7\x00N\x03^\xff\xd7\x00N\x03\ +`\xff\xd7\x00P\x00\x05\xff\xec\x00P\x00\x0a\xff\xec\x00\ +P\x02\x07\xff\xec\x00P\x02\x0b\xff\xec\x00Q\x00\x05\xff\ +\xec\x00Q\x00\x0a\xff\xec\x00Q\x02\x07\xff\xec\x00Q\x02\ +\x0b\xff\xec\x00R\x00\x05\xff\xec\x00R\x00\x0a\xff\xec\x00\ +R\x00Y\xff\xd7\x00R\x00Z\xff\xd7\x00R\x00[\xff\ +\xd7\x00R\x00\x5c\xff\xd7\x00R\x00]\xff\xec\x00R\x00\ +\xbf\xff\xd7\x00R\x017\xff\xd7\x00R\x01<\xff\xec\x00\ +R\x01>\xff\xec\x00R\x01@\xff\xec\x00R\x01\xfb\xff\ +\xd7\x00R\x01\xfd\xff\xd7\x00R\x02\x07\xff\xec\x00R\x02\ +\x0b\xff\xec\x00R\x03p\xff\xd7\x00S\x00\x05\xff\xec\x00\ +S\x00\x0a\xff\xec\x00S\x00Y\xff\xd7\x00S\x00Z\xff\ +\xd7\x00S\x00[\xff\xd7\x00S\x00\x5c\xff\xd7\x00S\x00\ +]\xff\xec\x00S\x00\xbf\xff\xd7\x00S\x017\xff\xd7\x00\ +S\x01<\xff\xec\x00S\x01>\xff\xec\x00S\x01@\xff\ +\xec\x00S\x01\xfb\xff\xd7\x00S\x01\xfd\xff\xd7\x00S\x02\ +\x07\xff\xec\x00S\x02\x0b\xff\xec\x00S\x03p\xff\xd7\x00\ +U\x00\x05\x00R\x00U\x00\x0a\x00R\x00U\x00D\xff\ +\xd7\x00U\x00F\xff\xd7\x00U\x00G\xff\xd7\x00U\x00\ +H\xff\xd7\x00U\x00J\xff\xec\x00U\x00R\xff\xd7\x00\ +U\x00T\xff\xd7\x00U\x00\xa2\xff\xd7\x00U\x00\xa3\xff\ +\xd7\x00U\x00\xa4\xff\xd7\x00U\x00\xa5\xff\xd7\x00U\x00\ +\xa6\xff\xd7\x00U\x00\xa7\xff\xd7\x00U\x00\xa8\xff\xd7\x00\ +U\x00\xa9\xff\xd7\x00U\x00\xaa\xff\xd7\x00U\x00\xab\xff\ +\xd7\x00U\x00\xac\xff\xd7\x00U\x00\xad\xff\xd7\x00U\x00\ +\xb4\xff\xd7\x00U\x00\xb5\xff\xd7\x00U\x00\xb6\xff\xd7\x00\ +U\x00\xb7\xff\xd7\x00U\x00\xb8\xff\xd7\x00U\x00\xba\xff\ +\xd7\x00U\x00\xc3\xff\xd7\x00U\x00\xc5\xff\xd7\x00U\x00\ +\xc7\xff\xd7\x00U\x00\xc9\xff\xd7\x00U\x00\xcb\xff\xd7\x00\ +U\x00\xcd\xff\xd7\x00U\x00\xcf\xff\xd7\x00U\x00\xd1\xff\ +\xd7\x00U\x00\xd3\xff\xd7\x00U\x00\xd5\xff\xd7\x00U\x00\ +\xd7\xff\xd7\x00U\x00\xd9\xff\xd7\x00U\x00\xdb\xff\xd7\x00\ +U\x00\xdd\xff\xd7\x00U\x00\xdf\xff\xec\x00U\x00\xe1\xff\ +\xec\x00U\x00\xe3\xff\xec\x00U\x00\xe5\xff\xec\x00U\x01\ +\x0f\xff\xd7\x00U\x01\x11\xff\xd7\x00U\x01\x13\xff\xd7\x00\ +U\x01\x15\xff\xd7\x00U\x01D\xff\xd7\x00U\x01F\xff\ +\xd7\x00U\x01H\xff\xd7\x00U\x02\x07\x00R\x00U\x02\ +\x0b\x00R\x00U\x02Y\xff\xd7\x00U\x02`\xff\xd7\x00\ +U\x03\x1e\xff\xd7\x00U\x03 \xff\xd7\x00U\x03\x22\xff\ +\xd7\x00U\x03&\xff\xd7\x00U\x03(\xff\xd7\x00U\x03\ +*\xff\xd7\x00U\x03,\xff\xd7\x00U\x03.\xff\xd7\x00\ +U\x030\xff\xd7\x00U\x032\xff\xd7\x00U\x034\xff\ +\xd7\x00U\x036\xff\xd7\x00U\x038\xff\xd7\x00U\x03\ +:\xff\xd7\x00U\x03<\xff\xd7\x00U\x03@\xff\xd7\x00\ +U\x03B\xff\xd7\x00U\x03D\xff\xd7\x00U\x03J\xff\ +\xd7\x00U\x03L\xff\xd7\x00U\x03N\xff\xd7\x00U\x03\ +R\xff\xd7\x00U\x03T\xff\xd7\x00U\x03V\xff\xd7\x00\ +U\x03X\xff\xd7\x00U\x03Z\xff\xd7\x00U\x03\x5c\xff\ +\xd7\x00U\x03^\xff\xd7\x00U\x03`\xff\xd7\x00W\x00\ +\x05\x00)\x00W\x00\x0a\x00)\x00W\x02\x07\x00)\x00\ +W\x02\x0b\x00)\x00Y\x00\x05\x00R\x00Y\x00\x0a\x00\ +R\x00Y\x00\x0f\xff\xae\x00Y\x00\x11\xff\xae\x00Y\x00\ +\x22\x00)\x00Y\x02\x07\x00R\x00Y\x02\x08\xff\xae\x00\ +Y\x02\x0b\x00R\x00Y\x02\x0c\xff\xae\x00Z\x00\x05\x00\ +R\x00Z\x00\x0a\x00R\x00Z\x00\x0f\xff\xae\x00Z\x00\ +\x11\xff\xae\x00Z\x00\x22\x00)\x00Z\x02\x07\x00R\x00\ +Z\x02\x08\xff\xae\x00Z\x02\x0b\x00R\x00Z\x02\x0c\xff\ +\xae\x00[\x00F\xff\xd7\x00[\x00G\xff\xd7\x00[\x00\ +H\xff\xd7\x00[\x00R\xff\xd7\x00[\x00T\xff\xd7\x00\ +[\x00\xa2\xff\xd7\x00[\x00\xa9\xff\xd7\x00[\x00\xaa\xff\ +\xd7\x00[\x00\xab\xff\xd7\x00[\x00\xac\xff\xd7\x00[\x00\ +\xad\xff\xd7\x00[\x00\xb4\xff\xd7\x00[\x00\xb5\xff\xd7\x00\ +[\x00\xb6\xff\xd7\x00[\x00\xb7\xff\xd7\x00[\x00\xb8\xff\ +\xd7\x00[\x00\xba\xff\xd7\x00[\x00\xc9\xff\xd7\x00[\x00\ +\xcb\xff\xd7\x00[\x00\xcd\xff\xd7\x00[\x00\xcf\xff\xd7\x00\ +[\x00\xd1\xff\xd7\x00[\x00\xd3\xff\xd7\x00[\x00\xd5\xff\ +\xd7\x00[\x00\xd7\xff\xd7\x00[\x00\xd9\xff\xd7\x00[\x00\ +\xdb\xff\xd7\x00[\x00\xdd\xff\xd7\x00[\x01\x0f\xff\xd7\x00\ +[\x01\x11\xff\xd7\x00[\x01\x13\xff\xd7\x00[\x01\x15\xff\ +\xd7\x00[\x01H\xff\xd7\x00[\x02`\xff\xd7\x00[\x03\ +6\xff\xd7\x00[\x038\xff\xd7\x00[\x03:\xff\xd7\x00\ +[\x03<\xff\xd7\x00[\x03@\xff\xd7\x00[\x03B\xff\ +\xd7\x00[\x03D\xff\xd7\x00[\x03J\xff\xd7\x00[\x03\ +L\xff\xd7\x00[\x03N\xff\xd7\x00[\x03R\xff\xd7\x00\ +[\x03T\xff\xd7\x00[\x03V\xff\xd7\x00[\x03X\xff\ +\xd7\x00[\x03Z\xff\xd7\x00[\x03\x5c\xff\xd7\x00[\x03\ +^\xff\xd7\x00[\x03`\xff\xd7\x00\x5c\x00\x05\x00R\x00\ +\x5c\x00\x0a\x00R\x00\x5c\x00\x0f\xff\xae\x00\x5c\x00\x11\xff\ +\xae\x00\x5c\x00\x22\x00)\x00\x5c\x02\x07\x00R\x00\x5c\x02\ +\x08\xff\xae\x00\x5c\x02\x0b\x00R\x00\x5c\x02\x0c\xff\xae\x00\ +^\x00-\x00\xb8\x00\x82\x00\x05\xffq\x00\x82\x00\x0a\xff\ +q\x00\x82\x00&\xff\xd7\x00\x82\x00*\xff\xd7\x00\x82\x00\ +-\x01\x0a\x00\x82\x002\xff\xd7\x00\x82\x004\xff\xd7\x00\ +\x82\x007\xffq\x00\x82\x009\xff\xae\x00\x82\x00:\xff\ +\xae\x00\x82\x00<\xff\x85\x00\x82\x00\x89\xff\xd7\x00\x82\x00\ +\x94\xff\xd7\x00\x82\x00\x95\xff\xd7\x00\x82\x00\x96\xff\xd7\x00\ +\x82\x00\x97\xff\xd7\x00\x82\x00\x98\xff\xd7\x00\x82\x00\x9a\xff\ +\xd7\x00\x82\x00\x9f\xff\x85\x00\x82\x00\xc8\xff\xd7\x00\x82\x00\ +\xca\xff\xd7\x00\x82\x00\xcc\xff\xd7\x00\x82\x00\xce\xff\xd7\x00\ +\x82\x00\xde\xff\xd7\x00\x82\x00\xe0\xff\xd7\x00\x82\x00\xe2\xff\ +\xd7\x00\x82\x00\xe4\xff\xd7\x00\x82\x01\x0e\xff\xd7\x00\x82\x01\ +\x10\xff\xd7\x00\x82\x01\x12\xff\xd7\x00\x82\x01\x14\xff\xd7\x00\ +\x82\x01$\xffq\x00\x82\x01&\xffq\x00\x82\x016\xff\ +\xae\x00\x82\x018\xff\x85\x00\x82\x01:\xff\x85\x00\x82\x01\ +G\xff\xd7\x00\x82\x01\xfa\xff\xae\x00\x82\x01\xfc\xff\xae\x00\ +\x82\x01\xfe\xff\xae\x00\x82\x02\x00\xff\x85\x00\x82\x02\x07\xff\ +q\x00\x82\x02\x0b\xffq\x00\x82\x02_\xff\xd7\x00\x82\x03\ +I\xff\xd7\x00\x82\x03K\xff\xd7\x00\x82\x03M\xff\xd7\x00\ +\x82\x03O\xff\xd7\x00\x82\x03Q\xff\xd7\x00\x82\x03S\xff\ +\xd7\x00\x82\x03U\xff\xd7\x00\x82\x03W\xff\xd7\x00\x82\x03\ +Y\xff\xd7\x00\x82\x03[\xff\xd7\x00\x82\x03]\xff\xd7\x00\ +\x82\x03_\xff\xd7\x00\x82\x03o\xff\x85\x00\x82\x03q\xff\ +\x85\x00\x82\x03s\xff\x85\x00\x82\x03\x8f\xffq\x00\x83\x00\ +\x05\xffq\x00\x83\x00\x0a\xffq\x00\x83\x00&\xff\xd7\x00\ +\x83\x00*\xff\xd7\x00\x83\x00-\x01\x0a\x00\x83\x002\xff\ +\xd7\x00\x83\x004\xff\xd7\x00\x83\x007\xffq\x00\x83\x00\ +9\xff\xae\x00\x83\x00:\xff\xae\x00\x83\x00<\xff\x85\x00\ +\x83\x00\x89\xff\xd7\x00\x83\x00\x94\xff\xd7\x00\x83\x00\x95\xff\ +\xd7\x00\x83\x00\x96\xff\xd7\x00\x83\x00\x97\xff\xd7\x00\x83\x00\ +\x98\xff\xd7\x00\x83\x00\x9a\xff\xd7\x00\x83\x00\x9f\xff\x85\x00\ +\x83\x00\xc8\xff\xd7\x00\x83\x00\xca\xff\xd7\x00\x83\x00\xcc\xff\ +\xd7\x00\x83\x00\xce\xff\xd7\x00\x83\x00\xde\xff\xd7\x00\x83\x00\ +\xe0\xff\xd7\x00\x83\x00\xe2\xff\xd7\x00\x83\x00\xe4\xff\xd7\x00\ +\x83\x01\x0e\xff\xd7\x00\x83\x01\x10\xff\xd7\x00\x83\x01\x12\xff\ +\xd7\x00\x83\x01\x14\xff\xd7\x00\x83\x01$\xffq\x00\x83\x01\ +&\xffq\x00\x83\x016\xff\xae\x00\x83\x018\xff\x85\x00\ +\x83\x01:\xff\x85\x00\x83\x01G\xff\xd7\x00\x83\x01\xfa\xff\ +\xae\x00\x83\x01\xfc\xff\xae\x00\x83\x01\xfe\xff\xae\x00\x83\x02\ +\x00\xff\x85\x00\x83\x02\x07\xffq\x00\x83\x02\x0b\xffq\x00\ +\x83\x02_\xff\xd7\x00\x83\x03I\xff\xd7\x00\x83\x03K\xff\ +\xd7\x00\x83\x03M\xff\xd7\x00\x83\x03O\xff\xd7\x00\x83\x03\ +Q\xff\xd7\x00\x83\x03S\xff\xd7\x00\x83\x03U\xff\xd7\x00\ +\x83\x03W\xff\xd7\x00\x83\x03Y\xff\xd7\x00\x83\x03[\xff\ +\xd7\x00\x83\x03]\xff\xd7\x00\x83\x03_\xff\xd7\x00\x83\x03\ +o\xff\x85\x00\x83\x03q\xff\x85\x00\x83\x03s\xff\x85\x00\ +\x83\x03\x8f\xffq\x00\x84\x00\x05\xffq\x00\x84\x00\x0a\xff\ +q\x00\x84\x00&\xff\xd7\x00\x84\x00*\xff\xd7\x00\x84\x00\ +-\x01\x0a\x00\x84\x002\xff\xd7\x00\x84\x004\xff\xd7\x00\ +\x84\x007\xffq\x00\x84\x009\xff\xae\x00\x84\x00:\xff\ +\xae\x00\x84\x00<\xff\x85\x00\x84\x00\x89\xff\xd7\x00\x84\x00\ +\x94\xff\xd7\x00\x84\x00\x95\xff\xd7\x00\x84\x00\x96\xff\xd7\x00\ +\x84\x00\x97\xff\xd7\x00\x84\x00\x98\xff\xd7\x00\x84\x00\x9a\xff\ +\xd7\x00\x84\x00\x9f\xff\x85\x00\x84\x00\xc8\xff\xd7\x00\x84\x00\ +\xca\xff\xd7\x00\x84\x00\xcc\xff\xd7\x00\x84\x00\xce\xff\xd7\x00\ +\x84\x00\xde\xff\xd7\x00\x84\x00\xe0\xff\xd7\x00\x84\x00\xe2\xff\ +\xd7\x00\x84\x00\xe4\xff\xd7\x00\x84\x01\x0e\xff\xd7\x00\x84\x01\ +\x10\xff\xd7\x00\x84\x01\x12\xff\xd7\x00\x84\x01\x14\xff\xd7\x00\ +\x84\x01$\xffq\x00\x84\x01&\xffq\x00\x84\x016\xff\ +\xae\x00\x84\x018\xff\x85\x00\x84\x01:\xff\x85\x00\x84\x01\ +G\xff\xd7\x00\x84\x01\xfa\xff\xae\x00\x84\x01\xfc\xff\xae\x00\ +\x84\x01\xfe\xff\xae\x00\x84\x02\x00\xff\x85\x00\x84\x02\x07\xff\ +q\x00\x84\x02\x0b\xffq\x00\x84\x02_\xff\xd7\x00\x84\x03\ +I\xff\xd7\x00\x84\x03K\xff\xd7\x00\x84\x03M\xff\xd7\x00\ +\x84\x03O\xff\xd7\x00\x84\x03Q\xff\xd7\x00\x84\x03S\xff\ +\xd7\x00\x84\x03U\xff\xd7\x00\x84\x03W\xff\xd7\x00\x84\x03\ +Y\xff\xd7\x00\x84\x03[\xff\xd7\x00\x84\x03]\xff\xd7\x00\ +\x84\x03_\xff\xd7\x00\x84\x03o\xff\x85\x00\x84\x03q\xff\ +\x85\x00\x84\x03s\xff\x85\x00\x84\x03\x8f\xffq\x00\x85\x00\ +\x05\xffq\x00\x85\x00\x0a\xffq\x00\x85\x00&\xff\xd7\x00\ +\x85\x00*\xff\xd7\x00\x85\x00-\x01\x0a\x00\x85\x002\xff\ +\xd7\x00\x85\x004\xff\xd7\x00\x85\x007\xffq\x00\x85\x00\ +9\xff\xae\x00\x85\x00:\xff\xae\x00\x85\x00<\xff\x85\x00\ +\x85\x00\x89\xff\xd7\x00\x85\x00\x94\xff\xd7\x00\x85\x00\x95\xff\ +\xd7\x00\x85\x00\x96\xff\xd7\x00\x85\x00\x97\xff\xd7\x00\x85\x00\ +\x98\xff\xd7\x00\x85\x00\x9a\xff\xd7\x00\x85\x00\x9f\xff\x85\x00\ +\x85\x00\xc8\xff\xd7\x00\x85\x00\xca\xff\xd7\x00\x85\x00\xcc\xff\ +\xd7\x00\x85\x00\xce\xff\xd7\x00\x85\x00\xde\xff\xd7\x00\x85\x00\ +\xe0\xff\xd7\x00\x85\x00\xe2\xff\xd7\x00\x85\x00\xe4\xff\xd7\x00\ +\x85\x01\x0e\xff\xd7\x00\x85\x01\x10\xff\xd7\x00\x85\x01\x12\xff\ +\xd7\x00\x85\x01\x14\xff\xd7\x00\x85\x01$\xffq\x00\x85\x01\ +&\xffq\x00\x85\x016\xff\xae\x00\x85\x018\xff\x85\x00\ +\x85\x01:\xff\x85\x00\x85\x01G\xff\xd7\x00\x85\x01\xfa\xff\ +\xae\x00\x85\x01\xfc\xff\xae\x00\x85\x01\xfe\xff\xae\x00\x85\x02\ +\x00\xff\x85\x00\x85\x02\x07\xffq\x00\x85\x02\x0b\xffq\x00\ +\x85\x02_\xff\xd7\x00\x85\x03I\xff\xd7\x00\x85\x03K\xff\ +\xd7\x00\x85\x03M\xff\xd7\x00\x85\x03O\xff\xd7\x00\x85\x03\ +Q\xff\xd7\x00\x85\x03S\xff\xd7\x00\x85\x03U\xff\xd7\x00\ +\x85\x03W\xff\xd7\x00\x85\x03Y\xff\xd7\x00\x85\x03[\xff\ +\xd7\x00\x85\x03]\xff\xd7\x00\x85\x03_\xff\xd7\x00\x85\x03\ +o\xff\x85\x00\x85\x03q\xff\x85\x00\x85\x03s\xff\x85\x00\ +\x85\x03\x8f\xffq\x00\x86\x00\x05\xffq\x00\x86\x00\x0a\xff\ +q\x00\x86\x00&\xff\xd7\x00\x86\x00*\xff\xd7\x00\x86\x00\ +-\x01\x0a\x00\x86\x002\xff\xd7\x00\x86\x004\xff\xd7\x00\ +\x86\x007\xffq\x00\x86\x009\xff\xae\x00\x86\x00:\xff\ +\xae\x00\x86\x00<\xff\x85\x00\x86\x00\x89\xff\xd7\x00\x86\x00\ +\x94\xff\xd7\x00\x86\x00\x95\xff\xd7\x00\x86\x00\x96\xff\xd7\x00\ +\x86\x00\x97\xff\xd7\x00\x86\x00\x98\xff\xd7\x00\x86\x00\x9a\xff\ +\xd7\x00\x86\x00\x9f\xff\x85\x00\x86\x00\xc8\xff\xd7\x00\x86\x00\ +\xca\xff\xd7\x00\x86\x00\xcc\xff\xd7\x00\x86\x00\xce\xff\xd7\x00\ +\x86\x00\xde\xff\xd7\x00\x86\x00\xe0\xff\xd7\x00\x86\x00\xe2\xff\ +\xd7\x00\x86\x00\xe4\xff\xd7\x00\x86\x01\x0e\xff\xd7\x00\x86\x01\ +\x10\xff\xd7\x00\x86\x01\x12\xff\xd7\x00\x86\x01\x14\xff\xd7\x00\ +\x86\x01$\xffq\x00\x86\x01&\xffq\x00\x86\x016\xff\ +\xae\x00\x86\x018\xff\x85\x00\x86\x01:\xff\x85\x00\x86\x01\ +G\xff\xd7\x00\x86\x01\xfa\xff\xae\x00\x86\x01\xfc\xff\xae\x00\ +\x86\x01\xfe\xff\xae\x00\x86\x02\x00\xff\x85\x00\x86\x02\x07\xff\ +q\x00\x86\x02\x0b\xffq\x00\x86\x02_\xff\xd7\x00\x86\x03\ +I\xff\xd7\x00\x86\x03K\xff\xd7\x00\x86\x03M\xff\xd7\x00\ +\x86\x03O\xff\xd7\x00\x86\x03Q\xff\xd7\x00\x86\x03S\xff\ +\xd7\x00\x86\x03U\xff\xd7\x00\x86\x03W\xff\xd7\x00\x86\x03\ +Y\xff\xd7\x00\x86\x03[\xff\xd7\x00\x86\x03]\xff\xd7\x00\ +\x86\x03_\xff\xd7\x00\x86\x03o\xff\x85\x00\x86\x03q\xff\ +\x85\x00\x86\x03s\xff\x85\x00\x86\x03\x8f\xffq\x00\x87\x00\ +\x05\xffq\x00\x87\x00\x0a\xffq\x00\x87\x00&\xff\xd7\x00\ +\x87\x00*\xff\xd7\x00\x87\x00-\x01\x0a\x00\x87\x002\xff\ +\xd7\x00\x87\x004\xff\xd7\x00\x87\x007\xffq\x00\x87\x00\ +9\xff\xae\x00\x87\x00:\xff\xae\x00\x87\x00<\xff\x85\x00\ +\x87\x00\x89\xff\xd7\x00\x87\x00\x94\xff\xd7\x00\x87\x00\x95\xff\ +\xd7\x00\x87\x00\x96\xff\xd7\x00\x87\x00\x97\xff\xd7\x00\x87\x00\ +\x98\xff\xd7\x00\x87\x00\x9a\xff\xd7\x00\x87\x00\x9f\xff\x85\x00\ +\x87\x00\xc8\xff\xd7\x00\x87\x00\xca\xff\xd7\x00\x87\x00\xcc\xff\ +\xd7\x00\x87\x00\xce\xff\xd7\x00\x87\x00\xde\xff\xd7\x00\x87\x00\ +\xe0\xff\xd7\x00\x87\x00\xe2\xff\xd7\x00\x87\x00\xe4\xff\xd7\x00\ +\x87\x01\x0e\xff\xd7\x00\x87\x01\x10\xff\xd7\x00\x87\x01\x12\xff\ +\xd7\x00\x87\x01\x14\xff\xd7\x00\x87\x01$\xffq\x00\x87\x01\ +&\xffq\x00\x87\x016\xff\xae\x00\x87\x018\xff\x85\x00\ +\x87\x01:\xff\x85\x00\x87\x01G\xff\xd7\x00\x87\x01\xfa\xff\ +\xae\x00\x87\x01\xfc\xff\xae\x00\x87\x01\xfe\xff\xae\x00\x87\x02\ +\x00\xff\x85\x00\x87\x02\x07\xffq\x00\x87\x02\x0b\xffq\x00\ +\x87\x02_\xff\xd7\x00\x87\x03I\xff\xd7\x00\x87\x03K\xff\ +\xd7\x00\x87\x03M\xff\xd7\x00\x87\x03O\xff\xd7\x00\x87\x03\ +Q\xff\xd7\x00\x87\x03S\xff\xd7\x00\x87\x03U\xff\xd7\x00\ +\x87\x03W\xff\xd7\x00\x87\x03Y\xff\xd7\x00\x87\x03[\xff\ +\xd7\x00\x87\x03]\xff\xd7\x00\x87\x03_\xff\xd7\x00\x87\x03\ +o\xff\x85\x00\x87\x03q\xff\x85\x00\x87\x03s\xff\x85\x00\ +\x87\x03\x8f\xffq\x00\x88\x00-\x00{\x00\x89\x00&\xff\ +\xd7\x00\x89\x00*\xff\xd7\x00\x89\x002\xff\xd7\x00\x89\x00\ +4\xff\xd7\x00\x89\x00\x89\xff\xd7\x00\x89\x00\x94\xff\xd7\x00\ +\x89\x00\x95\xff\xd7\x00\x89\x00\x96\xff\xd7\x00\x89\x00\x97\xff\ +\xd7\x00\x89\x00\x98\xff\xd7\x00\x89\x00\x9a\xff\xd7\x00\x89\x00\ +\xc8\xff\xd7\x00\x89\x00\xca\xff\xd7\x00\x89\x00\xcc\xff\xd7\x00\ +\x89\x00\xce\xff\xd7\x00\x89\x00\xde\xff\xd7\x00\x89\x00\xe0\xff\ +\xd7\x00\x89\x00\xe2\xff\xd7\x00\x89\x00\xe4\xff\xd7\x00\x89\x01\ +\x0e\xff\xd7\x00\x89\x01\x10\xff\xd7\x00\x89\x01\x12\xff\xd7\x00\ +\x89\x01\x14\xff\xd7\x00\x89\x01G\xff\xd7\x00\x89\x02_\xff\ +\xd7\x00\x89\x03I\xff\xd7\x00\x89\x03K\xff\xd7\x00\x89\x03\ +M\xff\xd7\x00\x89\x03O\xff\xd7\x00\x89\x03Q\xff\xd7\x00\ +\x89\x03S\xff\xd7\x00\x89\x03U\xff\xd7\x00\x89\x03W\xff\ +\xd7\x00\x89\x03Y\xff\xd7\x00\x89\x03[\xff\xd7\x00\x89\x03\ +]\xff\xd7\x00\x89\x03_\xff\xd7\x00\x8a\x00-\x00{\x00\ +\x8b\x00-\x00{\x00\x8c\x00-\x00{\x00\x8d\x00-\x00\ +{\x00\x92\x00\x0f\xff\xae\x00\x92\x00\x11\xff\xae\x00\x92\x00\ +$\xff\xd7\x00\x92\x007\xff\xc3\x00\x92\x009\xff\xec\x00\ +\x92\x00:\xff\xec\x00\x92\x00;\xff\xd7\x00\x92\x00<\xff\ +\xec\x00\x92\x00=\xff\xec\x00\x92\x00\x82\xff\xd7\x00\x92\x00\ +\x83\xff\xd7\x00\x92\x00\x84\xff\xd7\x00\x92\x00\x85\xff\xd7\x00\ +\x92\x00\x86\xff\xd7\x00\x92\x00\x87\xff\xd7\x00\x92\x00\x9f\xff\ +\xec\x00\x92\x00\xc2\xff\xd7\x00\x92\x00\xc4\xff\xd7\x00\x92\x00\ +\xc6\xff\xd7\x00\x92\x01$\xff\xc3\x00\x92\x01&\xff\xc3\x00\ +\x92\x016\xff\xec\x00\x92\x018\xff\xec\x00\x92\x01:\xff\ +\xec\x00\x92\x01;\xff\xec\x00\x92\x01=\xff\xec\x00\x92\x01\ +?\xff\xec\x00\x92\x01C\xff\xd7\x00\x92\x01\xa0\xff\xec\x00\ +\x92\x01\xfa\xff\xec\x00\x92\x01\xfc\xff\xec\x00\x92\x01\xfe\xff\ +\xec\x00\x92\x02\x00\xff\xec\x00\x92\x02\x08\xff\xae\x00\x92\x02\ +\x0c\xff\xae\x00\x92\x02X\xff\xd7\x00\x92\x03\x1d\xff\xd7\x00\ +\x92\x03\x1f\xff\xd7\x00\x92\x03!\xff\xd7\x00\x92\x03#\xff\ +\xd7\x00\x92\x03%\xff\xd7\x00\x92\x03'\xff\xd7\x00\x92\x03\ +)\xff\xd7\x00\x92\x03+\xff\xd7\x00\x92\x03-\xff\xd7\x00\ +\x92\x03/\xff\xd7\x00\x92\x031\xff\xd7\x00\x92\x033\xff\ +\xd7\x00\x92\x03o\xff\xec\x00\x92\x03q\xff\xec\x00\x92\x03\ +s\xff\xec\x00\x92\x03\x8f\xff\xc3\x00\x94\x00\x0f\xff\xae\x00\ +\x94\x00\x11\xff\xae\x00\x94\x00$\xff\xd7\x00\x94\x007\xff\ +\xc3\x00\x94\x009\xff\xec\x00\x94\x00:\xff\xec\x00\x94\x00\ +;\xff\xd7\x00\x94\x00<\xff\xec\x00\x94\x00=\xff\xec\x00\ +\x94\x00\x82\xff\xd7\x00\x94\x00\x83\xff\xd7\x00\x94\x00\x84\xff\ +\xd7\x00\x94\x00\x85\xff\xd7\x00\x94\x00\x86\xff\xd7\x00\x94\x00\ +\x87\xff\xd7\x00\x94\x00\x9f\xff\xec\x00\x94\x00\xc2\xff\xd7\x00\ +\x94\x00\xc4\xff\xd7\x00\x94\x00\xc6\xff\xd7\x00\x94\x01$\xff\ +\xc3\x00\x94\x01&\xff\xc3\x00\x94\x016\xff\xec\x00\x94\x01\ +8\xff\xec\x00\x94\x01:\xff\xec\x00\x94\x01;\xff\xec\x00\ +\x94\x01=\xff\xec\x00\x94\x01?\xff\xec\x00\x94\x01C\xff\ +\xd7\x00\x94\x01\xa0\xff\xec\x00\x94\x01\xfa\xff\xec\x00\x94\x01\ +\xfc\xff\xec\x00\x94\x01\xfe\xff\xec\x00\x94\x02\x00\xff\xec\x00\ +\x94\x02\x08\xff\xae\x00\x94\x02\x0c\xff\xae\x00\x94\x02X\xff\ +\xd7\x00\x94\x03\x1d\xff\xd7\x00\x94\x03\x1f\xff\xd7\x00\x94\x03\ +!\xff\xd7\x00\x94\x03#\xff\xd7\x00\x94\x03%\xff\xd7\x00\ +\x94\x03'\xff\xd7\x00\x94\x03)\xff\xd7\x00\x94\x03+\xff\ +\xd7\x00\x94\x03-\xff\xd7\x00\x94\x03/\xff\xd7\x00\x94\x03\ +1\xff\xd7\x00\x94\x033\xff\xd7\x00\x94\x03o\xff\xec\x00\ +\x94\x03q\xff\xec\x00\x94\x03s\xff\xec\x00\x94\x03\x8f\xff\ +\xc3\x00\x95\x00\x0f\xff\xae\x00\x95\x00\x11\xff\xae\x00\x95\x00\ +$\xff\xd7\x00\x95\x007\xff\xc3\x00\x95\x009\xff\xec\x00\ +\x95\x00:\xff\xec\x00\x95\x00;\xff\xd7\x00\x95\x00<\xff\ +\xec\x00\x95\x00=\xff\xec\x00\x95\x00\x82\xff\xd7\x00\x95\x00\ +\x83\xff\xd7\x00\x95\x00\x84\xff\xd7\x00\x95\x00\x85\xff\xd7\x00\ +\x95\x00\x86\xff\xd7\x00\x95\x00\x87\xff\xd7\x00\x95\x00\x9f\xff\ +\xec\x00\x95\x00\xc2\xff\xd7\x00\x95\x00\xc4\xff\xd7\x00\x95\x00\ +\xc6\xff\xd7\x00\x95\x01$\xff\xc3\x00\x95\x01&\xff\xc3\x00\ +\x95\x016\xff\xec\x00\x95\x018\xff\xec\x00\x95\x01:\xff\ +\xec\x00\x95\x01;\xff\xec\x00\x95\x01=\xff\xec\x00\x95\x01\ +?\xff\xec\x00\x95\x01C\xff\xd7\x00\x95\x01\xa0\xff\xec\x00\ +\x95\x01\xfa\xff\xec\x00\x95\x01\xfc\xff\xec\x00\x95\x01\xfe\xff\ +\xec\x00\x95\x02\x00\xff\xec\x00\x95\x02\x08\xff\xae\x00\x95\x02\ +\x0c\xff\xae\x00\x95\x02X\xff\xd7\x00\x95\x03\x1d\xff\xd7\x00\ +\x95\x03\x1f\xff\xd7\x00\x95\x03!\xff\xd7\x00\x95\x03#\xff\ +\xd7\x00\x95\x03%\xff\xd7\x00\x95\x03'\xff\xd7\x00\x95\x03\ +)\xff\xd7\x00\x95\x03+\xff\xd7\x00\x95\x03-\xff\xd7\x00\ +\x95\x03/\xff\xd7\x00\x95\x031\xff\xd7\x00\x95\x033\xff\ +\xd7\x00\x95\x03o\xff\xec\x00\x95\x03q\xff\xec\x00\x95\x03\ +s\xff\xec\x00\x95\x03\x8f\xff\xc3\x00\x96\x00\x0f\xff\xae\x00\ +\x96\x00\x11\xff\xae\x00\x96\x00$\xff\xd7\x00\x96\x007\xff\ +\xc3\x00\x96\x009\xff\xec\x00\x96\x00:\xff\xec\x00\x96\x00\ +;\xff\xd7\x00\x96\x00<\xff\xec\x00\x96\x00=\xff\xec\x00\ +\x96\x00\x82\xff\xd7\x00\x96\x00\x83\xff\xd7\x00\x96\x00\x84\xff\ +\xd7\x00\x96\x00\x85\xff\xd7\x00\x96\x00\x86\xff\xd7\x00\x96\x00\ +\x87\xff\xd7\x00\x96\x00\x9f\xff\xec\x00\x96\x00\xc2\xff\xd7\x00\ +\x96\x00\xc4\xff\xd7\x00\x96\x00\xc6\xff\xd7\x00\x96\x01$\xff\ +\xc3\x00\x96\x01&\xff\xc3\x00\x96\x016\xff\xec\x00\x96\x01\ +8\xff\xec\x00\x96\x01:\xff\xec\x00\x96\x01;\xff\xec\x00\ +\x96\x01=\xff\xec\x00\x96\x01?\xff\xec\x00\x96\x01C\xff\ +\xd7\x00\x96\x01\xa0\xff\xec\x00\x96\x01\xfa\xff\xec\x00\x96\x01\ +\xfc\xff\xec\x00\x96\x01\xfe\xff\xec\x00\x96\x02\x00\xff\xec\x00\ +\x96\x02\x08\xff\xae\x00\x96\x02\x0c\xff\xae\x00\x96\x02X\xff\ +\xd7\x00\x96\x03\x1d\xff\xd7\x00\x96\x03\x1f\xff\xd7\x00\x96\x03\ +!\xff\xd7\x00\x96\x03#\xff\xd7\x00\x96\x03%\xff\xd7\x00\ +\x96\x03'\xff\xd7\x00\x96\x03)\xff\xd7\x00\x96\x03+\xff\ +\xd7\x00\x96\x03-\xff\xd7\x00\x96\x03/\xff\xd7\x00\x96\x03\ +1\xff\xd7\x00\x96\x033\xff\xd7\x00\x96\x03o\xff\xec\x00\ +\x96\x03q\xff\xec\x00\x96\x03s\xff\xec\x00\x96\x03\x8f\xff\ +\xc3\x00\x97\x00\x0f\xff\xae\x00\x97\x00\x11\xff\xae\x00\x97\x00\ +$\xff\xd7\x00\x97\x007\xff\xc3\x00\x97\x009\xff\xec\x00\ +\x97\x00:\xff\xec\x00\x97\x00;\xff\xd7\x00\x97\x00<\xff\ +\xec\x00\x97\x00=\xff\xec\x00\x97\x00\x82\xff\xd7\x00\x97\x00\ +\x83\xff\xd7\x00\x97\x00\x84\xff\xd7\x00\x97\x00\x85\xff\xd7\x00\ +\x97\x00\x86\xff\xd7\x00\x97\x00\x87\xff\xd7\x00\x97\x00\x9f\xff\ +\xec\x00\x97\x00\xc2\xff\xd7\x00\x97\x00\xc4\xff\xd7\x00\x97\x00\ +\xc6\xff\xd7\x00\x97\x01$\xff\xc3\x00\x97\x01&\xff\xc3\x00\ +\x97\x016\xff\xec\x00\x97\x018\xff\xec\x00\x97\x01:\xff\ +\xec\x00\x97\x01;\xff\xec\x00\x97\x01=\xff\xec\x00\x97\x01\ +?\xff\xec\x00\x97\x01C\xff\xd7\x00\x97\x01\xa0\xff\xec\x00\ +\x97\x01\xfa\xff\xec\x00\x97\x01\xfc\xff\xec\x00\x97\x01\xfe\xff\ +\xec\x00\x97\x02\x00\xff\xec\x00\x97\x02\x08\xff\xae\x00\x97\x02\ +\x0c\xff\xae\x00\x97\x02X\xff\xd7\x00\x97\x03\x1d\xff\xd7\x00\ +\x97\x03\x1f\xff\xd7\x00\x97\x03!\xff\xd7\x00\x97\x03#\xff\ +\xd7\x00\x97\x03%\xff\xd7\x00\x97\x03'\xff\xd7\x00\x97\x03\ +)\xff\xd7\x00\x97\x03+\xff\xd7\x00\x97\x03-\xff\xd7\x00\ +\x97\x03/\xff\xd7\x00\x97\x031\xff\xd7\x00\x97\x033\xff\ +\xd7\x00\x97\x03o\xff\xec\x00\x97\x03q\xff\xec\x00\x97\x03\ +s\xff\xec\x00\x97\x03\x8f\xff\xc3\x00\x98\x00\x0f\xff\xae\x00\ +\x98\x00\x11\xff\xae\x00\x98\x00$\xff\xd7\x00\x98\x007\xff\ +\xc3\x00\x98\x009\xff\xec\x00\x98\x00:\xff\xec\x00\x98\x00\ +;\xff\xd7\x00\x98\x00<\xff\xec\x00\x98\x00=\xff\xec\x00\ +\x98\x00\x82\xff\xd7\x00\x98\x00\x83\xff\xd7\x00\x98\x00\x84\xff\ +\xd7\x00\x98\x00\x85\xff\xd7\x00\x98\x00\x86\xff\xd7\x00\x98\x00\ +\x87\xff\xd7\x00\x98\x00\x9f\xff\xec\x00\x98\x00\xc2\xff\xd7\x00\ +\x98\x00\xc4\xff\xd7\x00\x98\x00\xc6\xff\xd7\x00\x98\x01$\xff\ +\xc3\x00\x98\x01&\xff\xc3\x00\x98\x016\xff\xec\x00\x98\x01\ +8\xff\xec\x00\x98\x01:\xff\xec\x00\x98\x01;\xff\xec\x00\ +\x98\x01=\xff\xec\x00\x98\x01?\xff\xec\x00\x98\x01C\xff\ +\xd7\x00\x98\x01\xa0\xff\xec\x00\x98\x01\xfa\xff\xec\x00\x98\x01\ +\xfc\xff\xec\x00\x98\x01\xfe\xff\xec\x00\x98\x02\x00\xff\xec\x00\ +\x98\x02\x08\xff\xae\x00\x98\x02\x0c\xff\xae\x00\x98\x02X\xff\ +\xd7\x00\x98\x03\x1d\xff\xd7\x00\x98\x03\x1f\xff\xd7\x00\x98\x03\ +!\xff\xd7\x00\x98\x03#\xff\xd7\x00\x98\x03%\xff\xd7\x00\ +\x98\x03'\xff\xd7\x00\x98\x03)\xff\xd7\x00\x98\x03+\xff\ +\xd7\x00\x98\x03-\xff\xd7\x00\x98\x03/\xff\xd7\x00\x98\x03\ +1\xff\xd7\x00\x98\x033\xff\xd7\x00\x98\x03o\xff\xec\x00\ +\x98\x03q\xff\xec\x00\x98\x03s\xff\xec\x00\x98\x03\x8f\xff\ +\xc3\x00\x9a\x00\x0f\xff\xae\x00\x9a\x00\x11\xff\xae\x00\x9a\x00\ +$\xff\xd7\x00\x9a\x007\xff\xc3\x00\x9a\x009\xff\xec\x00\ +\x9a\x00:\xff\xec\x00\x9a\x00;\xff\xd7\x00\x9a\x00<\xff\ +\xec\x00\x9a\x00=\xff\xec\x00\x9a\x00\x82\xff\xd7\x00\x9a\x00\ +\x83\xff\xd7\x00\x9a\x00\x84\xff\xd7\x00\x9a\x00\x85\xff\xd7\x00\ +\x9a\x00\x86\xff\xd7\x00\x9a\x00\x87\xff\xd7\x00\x9a\x00\x9f\xff\ +\xec\x00\x9a\x00\xc2\xff\xd7\x00\x9a\x00\xc4\xff\xd7\x00\x9a\x00\ +\xc6\xff\xd7\x00\x9a\x01$\xff\xc3\x00\x9a\x01&\xff\xc3\x00\ +\x9a\x016\xff\xec\x00\x9a\x018\xff\xec\x00\x9a\x01:\xff\ +\xec\x00\x9a\x01;\xff\xec\x00\x9a\x01=\xff\xec\x00\x9a\x01\ +?\xff\xec\x00\x9a\x01C\xff\xd7\x00\x9a\x01\xa0\xff\xec\x00\ +\x9a\x01\xfa\xff\xec\x00\x9a\x01\xfc\xff\xec\x00\x9a\x01\xfe\xff\ +\xec\x00\x9a\x02\x00\xff\xec\x00\x9a\x02\x08\xff\xae\x00\x9a\x02\ +\x0c\xff\xae\x00\x9a\x02X\xff\xd7\x00\x9a\x03\x1d\xff\xd7\x00\ +\x9a\x03\x1f\xff\xd7\x00\x9a\x03!\xff\xd7\x00\x9a\x03#\xff\ +\xd7\x00\x9a\x03%\xff\xd7\x00\x9a\x03'\xff\xd7\x00\x9a\x03\ +)\xff\xd7\x00\x9a\x03+\xff\xd7\x00\x9a\x03-\xff\xd7\x00\ +\x9a\x03/\xff\xd7\x00\x9a\x031\xff\xd7\x00\x9a\x033\xff\ +\xd7\x00\x9a\x03o\xff\xec\x00\x9a\x03q\xff\xec\x00\x9a\x03\ +s\xff\xec\x00\x9a\x03\x8f\xff\xc3\x00\x9b\x00\x0f\xff\xd7\x00\ +\x9b\x00\x11\xff\xd7\x00\x9b\x00$\xff\xec\x00\x9b\x00\x82\xff\ +\xec\x00\x9b\x00\x83\xff\xec\x00\x9b\x00\x84\xff\xec\x00\x9b\x00\ +\x85\xff\xec\x00\x9b\x00\x86\xff\xec\x00\x9b\x00\x87\xff\xec\x00\ +\x9b\x00\xc2\xff\xec\x00\x9b\x00\xc4\xff\xec\x00\x9b\x00\xc6\xff\ +\xec\x00\x9b\x01C\xff\xec\x00\x9b\x02\x08\xff\xd7\x00\x9b\x02\ +\x0c\xff\xd7\x00\x9b\x02X\xff\xec\x00\x9b\x03\x1d\xff\xec\x00\ +\x9b\x03\x1f\xff\xec\x00\x9b\x03!\xff\xec\x00\x9b\x03#\xff\ +\xec\x00\x9b\x03%\xff\xec\x00\x9b\x03'\xff\xec\x00\x9b\x03\ +)\xff\xec\x00\x9b\x03+\xff\xec\x00\x9b\x03-\xff\xec\x00\ +\x9b\x03/\xff\xec\x00\x9b\x031\xff\xec\x00\x9b\x033\xff\ +\xec\x00\x9c\x00\x0f\xff\xd7\x00\x9c\x00\x11\xff\xd7\x00\x9c\x00\ +$\xff\xec\x00\x9c\x00\x82\xff\xec\x00\x9c\x00\x83\xff\xec\x00\ +\x9c\x00\x84\xff\xec\x00\x9c\x00\x85\xff\xec\x00\x9c\x00\x86\xff\ +\xec\x00\x9c\x00\x87\xff\xec\x00\x9c\x00\xc2\xff\xec\x00\x9c\x00\ +\xc4\xff\xec\x00\x9c\x00\xc6\xff\xec\x00\x9c\x01C\xff\xec\x00\ +\x9c\x02\x08\xff\xd7\x00\x9c\x02\x0c\xff\xd7\x00\x9c\x02X\xff\ +\xec\x00\x9c\x03\x1d\xff\xec\x00\x9c\x03\x1f\xff\xec\x00\x9c\x03\ +!\xff\xec\x00\x9c\x03#\xff\xec\x00\x9c\x03%\xff\xec\x00\ +\x9c\x03'\xff\xec\x00\x9c\x03)\xff\xec\x00\x9c\x03+\xff\ +\xec\x00\x9c\x03-\xff\xec\x00\x9c\x03/\xff\xec\x00\x9c\x03\ +1\xff\xec\x00\x9c\x033\xff\xec\x00\x9d\x00\x0f\xff\xd7\x00\ +\x9d\x00\x11\xff\xd7\x00\x9d\x00$\xff\xec\x00\x9d\x00\x82\xff\ +\xec\x00\x9d\x00\x83\xff\xec\x00\x9d\x00\x84\xff\xec\x00\x9d\x00\ +\x85\xff\xec\x00\x9d\x00\x86\xff\xec\x00\x9d\x00\x87\xff\xec\x00\ +\x9d\x00\xc2\xff\xec\x00\x9d\x00\xc4\xff\xec\x00\x9d\x00\xc6\xff\ +\xec\x00\x9d\x01C\xff\xec\x00\x9d\x02\x08\xff\xd7\x00\x9d\x02\ +\x0c\xff\xd7\x00\x9d\x02X\xff\xec\x00\x9d\x03\x1d\xff\xec\x00\ +\x9d\x03\x1f\xff\xec\x00\x9d\x03!\xff\xec\x00\x9d\x03#\xff\ +\xec\x00\x9d\x03%\xff\xec\x00\x9d\x03'\xff\xec\x00\x9d\x03\ +)\xff\xec\x00\x9d\x03+\xff\xec\x00\x9d\x03-\xff\xec\x00\ +\x9d\x03/\xff\xec\x00\x9d\x031\xff\xec\x00\x9d\x033\xff\ +\xec\x00\x9e\x00\x0f\xff\xd7\x00\x9e\x00\x11\xff\xd7\x00\x9e\x00\ +$\xff\xec\x00\x9e\x00\x82\xff\xec\x00\x9e\x00\x83\xff\xec\x00\ +\x9e\x00\x84\xff\xec\x00\x9e\x00\x85\xff\xec\x00\x9e\x00\x86\xff\ +\xec\x00\x9e\x00\x87\xff\xec\x00\x9e\x00\xc2\xff\xec\x00\x9e\x00\ +\xc4\xff\xec\x00\x9e\x00\xc6\xff\xec\x00\x9e\x01C\xff\xec\x00\ +\x9e\x02\x08\xff\xd7\x00\x9e\x02\x0c\xff\xd7\x00\x9e\x02X\xff\ +\xec\x00\x9e\x03\x1d\xff\xec\x00\x9e\x03\x1f\xff\xec\x00\x9e\x03\ +!\xff\xec\x00\x9e\x03#\xff\xec\x00\x9e\x03%\xff\xec\x00\ +\x9e\x03'\xff\xec\x00\x9e\x03)\xff\xec\x00\x9e\x03+\xff\ +\xec\x00\x9e\x03-\xff\xec\x00\x9e\x03/\xff\xec\x00\x9e\x03\ +1\xff\xec\x00\x9e\x033\xff\xec\x00\x9f\x00\x0f\xff\x85\x00\ +\x9f\x00\x11\xff\x85\x00\x9f\x00\x22\x00)\x00\x9f\x00$\xff\ +\x85\x00\x9f\x00&\xff\xd7\x00\x9f\x00*\xff\xd7\x00\x9f\x00\ +2\xff\xd7\x00\x9f\x004\xff\xd7\x00\x9f\x00D\xff\x9a\x00\ +\x9f\x00F\xff\x9a\x00\x9f\x00G\xff\x9a\x00\x9f\x00H\xff\ +\x9a\x00\x9f\x00J\xff\xd7\x00\x9f\x00P\xff\xc3\x00\x9f\x00\ +Q\xff\xc3\x00\x9f\x00R\xff\x9a\x00\x9f\x00S\xff\xc3\x00\ +\x9f\x00T\xff\x9a\x00\x9f\x00U\xff\xc3\x00\x9f\x00V\xff\ +\xae\x00\x9f\x00X\xff\xc3\x00\x9f\x00]\xff\xd7\x00\x9f\x00\ +\x82\xff\x85\x00\x9f\x00\x83\xff\x85\x00\x9f\x00\x84\xff\x85\x00\ +\x9f\x00\x85\xff\x85\x00\x9f\x00\x86\xff\x85\x00\x9f\x00\x87\xff\ +\x85\x00\x9f\x00\x89\xff\xd7\x00\x9f\x00\x94\xff\xd7\x00\x9f\x00\ +\x95\xff\xd7\x00\x9f\x00\x96\xff\xd7\x00\x9f\x00\x97\xff\xd7\x00\ +\x9f\x00\x98\xff\xd7\x00\x9f\x00\x9a\xff\xd7\x00\x9f\x00\xa2\xff\ +\x9a\x00\x9f\x00\xa3\xff\x9a\x00\x9f\x00\xa4\xff\x9a\x00\x9f\x00\ +\xa5\xff\x9a\x00\x9f\x00\xa6\xff\x9a\x00\x9f\x00\xa7\xff\x9a\x00\ +\x9f\x00\xa8\xff\x9a\x00\x9f\x00\xa9\xff\x9a\x00\x9f\x00\xaa\xff\ +\x9a\x00\x9f\x00\xab\xff\x9a\x00\x9f\x00\xac\xff\x9a\x00\x9f\x00\ +\xad\xff\x9a\x00\x9f\x00\xb4\xff\x9a\x00\x9f\x00\xb5\xff\x9a\x00\ +\x9f\x00\xb6\xff\x9a\x00\x9f\x00\xb7\xff\x9a\x00\x9f\x00\xb8\xff\ +\x9a\x00\x9f\x00\xba\xff\x9a\x00\x9f\x00\xbb\xff\xc3\x00\x9f\x00\ +\xbc\xff\xc3\x00\x9f\x00\xbd\xff\xc3\x00\x9f\x00\xbe\xff\xc3\x00\ +\x9f\x00\xc2\xff\x85\x00\x9f\x00\xc3\xff\x9a\x00\x9f\x00\xc4\xff\ +\x85\x00\x9f\x00\xc5\xff\x9a\x00\x9f\x00\xc6\xff\x85\x00\x9f\x00\ +\xc7\xff\x9a\x00\x9f\x00\xc8\xff\xd7\x00\x9f\x00\xc9\xff\x9a\x00\ +\x9f\x00\xca\xff\xd7\x00\x9f\x00\xcb\xff\x9a\x00\x9f\x00\xcc\xff\ +\xd7\x00\x9f\x00\xcd\xff\x9a\x00\x9f\x00\xce\xff\xd7\x00\x9f\x00\ +\xcf\xff\x9a\x00\x9f\x00\xd1\xff\x9a\x00\x9f\x00\xd3\xff\x9a\x00\ +\x9f\x00\xd5\xff\x9a\x00\x9f\x00\xd7\xff\x9a\x00\x9f\x00\xd9\xff\ +\x9a\x00\x9f\x00\xdb\xff\x9a\x00\x9f\x00\xdd\xff\x9a\x00\x9f\x00\ +\xde\xff\xd7\x00\x9f\x00\xdf\xff\xd7\x00\x9f\x00\xe0\xff\xd7\x00\ +\x9f\x00\xe1\xff\xd7\x00\x9f\x00\xe2\xff\xd7\x00\x9f\x00\xe3\xff\ +\xd7\x00\x9f\x00\xe4\xff\xd7\x00\x9f\x00\xe5\xff\xd7\x00\x9f\x00\ +\xfa\xff\xc3\x00\x9f\x01\x06\xff\xc3\x00\x9f\x01\x08\xff\xc3\x00\ +\x9f\x01\x0d\xff\xc3\x00\x9f\x01\x0e\xff\xd7\x00\x9f\x01\x0f\xff\ +\x9a\x00\x9f\x01\x10\xff\xd7\x00\x9f\x01\x11\xff\x9a\x00\x9f\x01\ +\x12\xff\xd7\x00\x9f\x01\x13\xff\x9a\x00\x9f\x01\x14\xff\xd7\x00\ +\x9f\x01\x15\xff\x9a\x00\x9f\x01\x17\xff\xc3\x00\x9f\x01\x19\xff\ +\xc3\x00\x9f\x01\x1d\xff\xae\x00\x9f\x01!\xff\xae\x00\x9f\x01\ ++\xff\xc3\x00\x9f\x01-\xff\xc3\x00\x9f\x01/\xff\xc3\x00\ +\x9f\x011\xff\xc3\x00\x9f\x013\xff\xc3\x00\x9f\x015\xff\ +\xc3\x00\x9f\x01<\xff\xd7\x00\x9f\x01>\xff\xd7\x00\x9f\x01\ +@\xff\xd7\x00\x9f\x01C\xff\x85\x00\x9f\x01D\xff\x9a\x00\ +\x9f\x01F\xff\x9a\x00\x9f\x01G\xff\xd7\x00\x9f\x01H\xff\ +\x9a\x00\x9f\x01J\xff\xae\x00\x9f\x02\x08\xff\x85\x00\x9f\x02\ +\x0c\xff\x85\x00\x9f\x02W\xff\xc3\x00\x9f\x02X\xff\x85\x00\ +\x9f\x02Y\xff\x9a\x00\x9f\x02_\xff\xd7\x00\x9f\x02`\xff\ +\x9a\x00\x9f\x02b\xff\xc3\x00\x9f\x03\x1d\xff\x85\x00\x9f\x03\ +\x1e\xff\x9a\x00\x9f\x03\x1f\xff\x85\x00\x9f\x03 \xff\x9a\x00\ +\x9f\x03!\xff\x85\x00\x9f\x03\x22\xff\x9a\x00\x9f\x03#\xff\ +\x85\x00\x9f\x03%\xff\x85\x00\x9f\x03&\xff\x9a\x00\x9f\x03\ +'\xff\x85\x00\x9f\x03(\xff\x9a\x00\x9f\x03)\xff\x85\x00\ +\x9f\x03*\xff\x9a\x00\x9f\x03+\xff\x85\x00\x9f\x03,\xff\ +\x9a\x00\x9f\x03-\xff\x85\x00\x9f\x03.\xff\x9a\x00\x9f\x03\ +/\xff\x85\x00\x9f\x030\xff\x9a\x00\x9f\x031\xff\x85\x00\ +\x9f\x032\xff\x9a\x00\x9f\x033\xff\x85\x00\x9f\x034\xff\ +\x9a\x00\x9f\x036\xff\x9a\x00\x9f\x038\xff\x9a\x00\x9f\x03\ +:\xff\x9a\x00\x9f\x03<\xff\x9a\x00\x9f\x03@\xff\x9a\x00\ +\x9f\x03B\xff\x9a\x00\x9f\x03D\xff\x9a\x00\x9f\x03I\xff\ +\xd7\x00\x9f\x03J\xff\x9a\x00\x9f\x03K\xff\xd7\x00\x9f\x03\ +L\xff\x9a\x00\x9f\x03M\xff\xd7\x00\x9f\x03N\xff\x9a\x00\ +\x9f\x03O\xff\xd7\x00\x9f\x03Q\xff\xd7\x00\x9f\x03R\xff\ +\x9a\x00\x9f\x03S\xff\xd7\x00\x9f\x03T\xff\x9a\x00\x9f\x03\ +U\xff\xd7\x00\x9f\x03V\xff\x9a\x00\x9f\x03W\xff\xd7\x00\ +\x9f\x03X\xff\x9a\x00\x9f\x03Y\xff\xd7\x00\x9f\x03Z\xff\ +\x9a\x00\x9f\x03[\xff\xd7\x00\x9f\x03\x5c\xff\x9a\x00\x9f\x03\ +]\xff\xd7\x00\x9f\x03^\xff\x9a\x00\x9f\x03_\xff\xd7\x00\ +\x9f\x03`\xff\x9a\x00\x9f\x03b\xff\xc3\x00\x9f\x03d\xff\ +\xc3\x00\x9f\x03f\xff\xc3\x00\x9f\x03h\xff\xc3\x00\x9f\x03\ +j\xff\xc3\x00\x9f\x03l\xff\xc3\x00\x9f\x03n\xff\xc3\x00\ +\xa0\x00\x0f\xfe\xf6\x00\xa0\x00\x11\xfe\xf6\x00\xa0\x00$\xff\ +\x9a\x00\xa0\x00;\xff\xd7\x00\xa0\x00=\xff\xec\x00\xa0\x00\ +\x82\xff\x9a\x00\xa0\x00\x83\xff\x9a\x00\xa0\x00\x84\xff\x9a\x00\ +\xa0\x00\x85\xff\x9a\x00\xa0\x00\x86\xff\x9a\x00\xa0\x00\x87\xff\ +\x9a\x00\xa0\x00\xc2\xff\x9a\x00\xa0\x00\xc4\xff\x9a\x00\xa0\x00\ +\xc6\xff\x9a\x00\xa0\x01;\xff\xec\x00\xa0\x01=\xff\xec\x00\ +\xa0\x01?\xff\xec\x00\xa0\x01C\xff\x9a\x00\xa0\x02\x08\xfe\ +\xf6\x00\xa0\x02\x0c\xfe\xf6\x00\xa0\x02X\xff\x9a\x00\xa0\x03\ +\x1d\xff\x9a\x00\xa0\x03\x1f\xff\x9a\x00\xa0\x03!\xff\x9a\x00\ +\xa0\x03#\xff\x9a\x00\xa0\x03%\xff\x9a\x00\xa0\x03'\xff\ +\x9a\x00\xa0\x03)\xff\x9a\x00\xa0\x03+\xff\x9a\x00\xa0\x03\ +-\xff\x9a\x00\xa0\x03/\xff\x9a\x00\xa0\x031\xff\x9a\x00\ +\xa0\x033\xff\x9a\x00\xa2\x00\x05\xff\xec\x00\xa2\x00\x0a\xff\ +\xec\x00\xa2\x02\x07\xff\xec\x00\xa2\x02\x0b\xff\xec\x00\xa3\x00\ +\x05\xff\xec\x00\xa3\x00\x0a\xff\xec\x00\xa3\x02\x07\xff\xec\x00\ +\xa3\x02\x0b\xff\xec\x00\xa4\x00\x05\xff\xec\x00\xa4\x00\x0a\xff\ +\xec\x00\xa4\x02\x07\xff\xec\x00\xa4\x02\x0b\xff\xec\x00\xa5\x00\ +\x05\xff\xec\x00\xa5\x00\x0a\xff\xec\x00\xa5\x02\x07\xff\xec\x00\ +\xa5\x02\x0b\xff\xec\x00\xa6\x00\x05\xff\xec\x00\xa6\x00\x0a\xff\ +\xec\x00\xa6\x02\x07\xff\xec\x00\xa6\x02\x0b\xff\xec\x00\xa7\x00\ +\x05\xff\xec\x00\xa7\x00\x0a\xff\xec\x00\xa7\x02\x07\xff\xec\x00\ +\xa7\x02\x0b\xff\xec\x00\xaa\x00\x05\xff\xec\x00\xaa\x00\x0a\xff\ +\xec\x00\xaa\x00Y\xff\xd7\x00\xaa\x00Z\xff\xd7\x00\xaa\x00\ +[\xff\xd7\x00\xaa\x00\x5c\xff\xd7\x00\xaa\x00]\xff\xec\x00\ +\xaa\x00\xbf\xff\xd7\x00\xaa\x017\xff\xd7\x00\xaa\x01<\xff\ +\xec\x00\xaa\x01>\xff\xec\x00\xaa\x01@\xff\xec\x00\xaa\x01\ +\xfb\xff\xd7\x00\xaa\x01\xfd\xff\xd7\x00\xaa\x02\x07\xff\xec\x00\ +\xaa\x02\x0b\xff\xec\x00\xaa\x03p\xff\xd7\x00\xab\x00\x05\xff\ +\xec\x00\xab\x00\x0a\xff\xec\x00\xab\x00Y\xff\xd7\x00\xab\x00\ +Z\xff\xd7\x00\xab\x00[\xff\xd7\x00\xab\x00\x5c\xff\xd7\x00\ +\xab\x00]\xff\xec\x00\xab\x00\xbf\xff\xd7\x00\xab\x017\xff\ +\xd7\x00\xab\x01<\xff\xec\x00\xab\x01>\xff\xec\x00\xab\x01\ +@\xff\xec\x00\xab\x01\xfb\xff\xd7\x00\xab\x01\xfd\xff\xd7\x00\ +\xab\x02\x07\xff\xec\x00\xab\x02\x0b\xff\xec\x00\xab\x03p\xff\ +\xd7\x00\xac\x00\x05\xff\xec\x00\xac\x00\x0a\xff\xec\x00\xac\x00\ +Y\xff\xd7\x00\xac\x00Z\xff\xd7\x00\xac\x00[\xff\xd7\x00\ +\xac\x00\x5c\xff\xd7\x00\xac\x00]\xff\xec\x00\xac\x00\xbf\xff\ +\xd7\x00\xac\x017\xff\xd7\x00\xac\x01<\xff\xec\x00\xac\x01\ +>\xff\xec\x00\xac\x01@\xff\xec\x00\xac\x01\xfb\xff\xd7\x00\ +\xac\x01\xfd\xff\xd7\x00\xac\x02\x07\xff\xec\x00\xac\x02\x0b\xff\ +\xec\x00\xac\x03p\xff\xd7\x00\xad\x00\x05\xff\xec\x00\xad\x00\ +\x0a\xff\xec\x00\xad\x00Y\xff\xd7\x00\xad\x00Z\xff\xd7\x00\ +\xad\x00[\xff\xd7\x00\xad\x00\x5c\xff\xd7\x00\xad\x00]\xff\ +\xec\x00\xad\x00\xbf\xff\xd7\x00\xad\x017\xff\xd7\x00\xad\x01\ +<\xff\xec\x00\xad\x01>\xff\xec\x00\xad\x01@\xff\xec\x00\ +\xad\x01\xfb\xff\xd7\x00\xad\x01\xfd\xff\xd7\x00\xad\x02\x07\xff\ +\xec\x00\xad\x02\x0b\xff\xec\x00\xad\x03p\xff\xd7\x00\xb2\x00\ +\x05\xff\xec\x00\xb2\x00\x0a\xff\xec\x00\xb2\x00Y\xff\xd7\x00\ +\xb2\x00Z\xff\xd7\x00\xb2\x00[\xff\xd7\x00\xb2\x00\x5c\xff\ +\xd7\x00\xb2\x00]\xff\xec\x00\xb2\x00\xbf\xff\xd7\x00\xb2\x01\ +7\xff\xd7\x00\xb2\x01<\xff\xec\x00\xb2\x01>\xff\xec\x00\ +\xb2\x01@\xff\xec\x00\xb2\x01\xfb\xff\xd7\x00\xb2\x01\xfd\xff\ +\xd7\x00\xb2\x02\x07\xff\xec\x00\xb2\x02\x0b\xff\xec\x00\xb2\x03\ +p\xff\xd7\x00\xb4\x00\x05\xff\xec\x00\xb4\x00\x0a\xff\xec\x00\ +\xb4\x00Y\xff\xd7\x00\xb4\x00Z\xff\xd7\x00\xb4\x00[\xff\ +\xd7\x00\xb4\x00\x5c\xff\xd7\x00\xb4\x00]\xff\xec\x00\xb4\x00\ +\xbf\xff\xd7\x00\xb4\x017\xff\xd7\x00\xb4\x01<\xff\xec\x00\ +\xb4\x01>\xff\xec\x00\xb4\x01@\xff\xec\x00\xb4\x01\xfb\xff\ +\xd7\x00\xb4\x01\xfd\xff\xd7\x00\xb4\x02\x07\xff\xec\x00\xb4\x02\ +\x0b\xff\xec\x00\xb4\x03p\xff\xd7\x00\xb5\x00\x05\xff\xec\x00\ +\xb5\x00\x0a\xff\xec\x00\xb5\x00Y\xff\xd7\x00\xb5\x00Z\xff\ +\xd7\x00\xb5\x00[\xff\xd7\x00\xb5\x00\x5c\xff\xd7\x00\xb5\x00\ +]\xff\xec\x00\xb5\x00\xbf\xff\xd7\x00\xb5\x017\xff\xd7\x00\ +\xb5\x01<\xff\xec\x00\xb5\x01>\xff\xec\x00\xb5\x01@\xff\ +\xec\x00\xb5\x01\xfb\xff\xd7\x00\xb5\x01\xfd\xff\xd7\x00\xb5\x02\ +\x07\xff\xec\x00\xb5\x02\x0b\xff\xec\x00\xb5\x03p\xff\xd7\x00\ +\xb6\x00\x05\xff\xec\x00\xb6\x00\x0a\xff\xec\x00\xb6\x00Y\xff\ +\xd7\x00\xb6\x00Z\xff\xd7\x00\xb6\x00[\xff\xd7\x00\xb6\x00\ +\x5c\xff\xd7\x00\xb6\x00]\xff\xec\x00\xb6\x00\xbf\xff\xd7\x00\ +\xb6\x017\xff\xd7\x00\xb6\x01<\xff\xec\x00\xb6\x01>\xff\ +\xec\x00\xb6\x01@\xff\xec\x00\xb6\x01\xfb\xff\xd7\x00\xb6\x01\ +\xfd\xff\xd7\x00\xb6\x02\x07\xff\xec\x00\xb6\x02\x0b\xff\xec\x00\ +\xb6\x03p\xff\xd7\x00\xb8\x00\x05\xff\xd7\x00\xb8\x00\x0a\xff\ +\xd7\x00\xb8\x02\x07\xff\xd7\x00\xb8\x02\x0b\xff\xd7\x00\xba\x00\ +\x05\xff\xec\x00\xba\x00\x0a\xff\xec\x00\xba\x00Y\xff\xd7\x00\ +\xba\x00Z\xff\xd7\x00\xba\x00[\xff\xd7\x00\xba\x00\x5c\xff\ +\xd7\x00\xba\x00]\xff\xec\x00\xba\x00\xbf\xff\xd7\x00\xba\x01\ +7\xff\xd7\x00\xba\x01<\xff\xec\x00\xba\x01>\xff\xec\x00\ +\xba\x01@\xff\xec\x00\xba\x01\xfb\xff\xd7\x00\xba\x01\xfd\xff\ +\xd7\x00\xba\x02\x07\xff\xec\x00\xba\x02\x0b\xff\xec\x00\xba\x03\ +p\xff\xd7\x00\xbf\x00\x05\x00R\x00\xbf\x00\x0a\x00R\x00\ +\xbf\x00\x0f\xff\xae\x00\xbf\x00\x11\xff\xae\x00\xbf\x00\x22\x00\ +)\x00\xbf\x02\x07\x00R\x00\xbf\x02\x08\xff\xae\x00\xbf\x02\ +\x0b\x00R\x00\xbf\x02\x0c\xff\xae\x00\xc0\x00\x05\xff\xec\x00\ +\xc0\x00\x0a\xff\xec\x00\xc0\x00Y\xff\xd7\x00\xc0\x00Z\xff\ +\xd7\x00\xc0\x00[\xff\xd7\x00\xc0\x00\x5c\xff\xd7\x00\xc0\x00\ +]\xff\xec\x00\xc0\x00\xbf\xff\xd7\x00\xc0\x017\xff\xd7\x00\ +\xc0\x01<\xff\xec\x00\xc0\x01>\xff\xec\x00\xc0\x01@\xff\ +\xec\x00\xc0\x01\xfb\xff\xd7\x00\xc0\x01\xfd\xff\xd7\x00\xc0\x02\ +\x07\xff\xec\x00\xc0\x02\x0b\xff\xec\x00\xc0\x03p\xff\xd7\x00\ +\xc1\x00\x05\x00R\x00\xc1\x00\x0a\x00R\x00\xc1\x00\x0f\xff\ +\xae\x00\xc1\x00\x11\xff\xae\x00\xc1\x00\x22\x00)\x00\xc1\x02\ +\x07\x00R\x00\xc1\x02\x08\xff\xae\x00\xc1\x02\x0b\x00R\x00\ +\xc1\x02\x0c\xff\xae\x00\xc2\x00\x05\xffq\x00\xc2\x00\x0a\xff\ +q\x00\xc2\x00&\xff\xd7\x00\xc2\x00*\xff\xd7\x00\xc2\x00\ +-\x01\x0a\x00\xc2\x002\xff\xd7\x00\xc2\x004\xff\xd7\x00\ +\xc2\x007\xffq\x00\xc2\x009\xff\xae\x00\xc2\x00:\xff\ +\xae\x00\xc2\x00<\xff\x85\x00\xc2\x00\x89\xff\xd7\x00\xc2\x00\ +\x94\xff\xd7\x00\xc2\x00\x95\xff\xd7\x00\xc2\x00\x96\xff\xd7\x00\ +\xc2\x00\x97\xff\xd7\x00\xc2\x00\x98\xff\xd7\x00\xc2\x00\x9a\xff\ +\xd7\x00\xc2\x00\x9f\xff\x85\x00\xc2\x00\xc8\xff\xd7\x00\xc2\x00\ +\xca\xff\xd7\x00\xc2\x00\xcc\xff\xd7\x00\xc2\x00\xce\xff\xd7\x00\ +\xc2\x00\xde\xff\xd7\x00\xc2\x00\xe0\xff\xd7\x00\xc2\x00\xe2\xff\ +\xd7\x00\xc2\x00\xe4\xff\xd7\x00\xc2\x01\x0e\xff\xd7\x00\xc2\x01\ +\x10\xff\xd7\x00\xc2\x01\x12\xff\xd7\x00\xc2\x01\x14\xff\xd7\x00\ +\xc2\x01$\xffq\x00\xc2\x01&\xffq\x00\xc2\x016\xff\ +\xae\x00\xc2\x018\xff\x85\x00\xc2\x01:\xff\x85\x00\xc2\x01\ +G\xff\xd7\x00\xc2\x01\xfa\xff\xae\x00\xc2\x01\xfc\xff\xae\x00\ +\xc2\x01\xfe\xff\xae\x00\xc2\x02\x00\xff\x85\x00\xc2\x02\x07\xff\ +q\x00\xc2\x02\x0b\xffq\x00\xc2\x02_\xff\xd7\x00\xc2\x03\ +I\xff\xd7\x00\xc2\x03K\xff\xd7\x00\xc2\x03M\xff\xd7\x00\ +\xc2\x03O\xff\xd7\x00\xc2\x03Q\xff\xd7\x00\xc2\x03S\xff\ +\xd7\x00\xc2\x03U\xff\xd7\x00\xc2\x03W\xff\xd7\x00\xc2\x03\ +Y\xff\xd7\x00\xc2\x03[\xff\xd7\x00\xc2\x03]\xff\xd7\x00\ +\xc2\x03_\xff\xd7\x00\xc2\x03o\xff\x85\x00\xc2\x03q\xff\ +\x85\x00\xc2\x03s\xff\x85\x00\xc2\x03\x8f\xffq\x00\xc3\x00\ +\x05\xff\xec\x00\xc3\x00\x0a\xff\xec\x00\xc3\x02\x07\xff\xec\x00\ +\xc3\x02\x0b\xff\xec\x00\xc4\x00\x05\xffq\x00\xc4\x00\x0a\xff\ +q\x00\xc4\x00&\xff\xd7\x00\xc4\x00*\xff\xd7\x00\xc4\x00\ +-\x01\x0a\x00\xc4\x002\xff\xd7\x00\xc4\x004\xff\xd7\x00\ +\xc4\x007\xffq\x00\xc4\x009\xff\xae\x00\xc4\x00:\xff\ +\xae\x00\xc4\x00<\xff\x85\x00\xc4\x00\x89\xff\xd7\x00\xc4\x00\ +\x94\xff\xd7\x00\xc4\x00\x95\xff\xd7\x00\xc4\x00\x96\xff\xd7\x00\ +\xc4\x00\x97\xff\xd7\x00\xc4\x00\x98\xff\xd7\x00\xc4\x00\x9a\xff\ +\xd7\x00\xc4\x00\x9f\xff\x85\x00\xc4\x00\xc8\xff\xd7\x00\xc4\x00\ +\xca\xff\xd7\x00\xc4\x00\xcc\xff\xd7\x00\xc4\x00\xce\xff\xd7\x00\ +\xc4\x00\xde\xff\xd7\x00\xc4\x00\xe0\xff\xd7\x00\xc4\x00\xe2\xff\ +\xd7\x00\xc4\x00\xe4\xff\xd7\x00\xc4\x01\x0e\xff\xd7\x00\xc4\x01\ +\x10\xff\xd7\x00\xc4\x01\x12\xff\xd7\x00\xc4\x01\x14\xff\xd7\x00\ +\xc4\x01$\xffq\x00\xc4\x01&\xffq\x00\xc4\x016\xff\ +\xae\x00\xc4\x018\xff\x85\x00\xc4\x01:\xff\x85\x00\xc4\x01\ +G\xff\xd7\x00\xc4\x01\xfa\xff\xae\x00\xc4\x01\xfc\xff\xae\x00\ +\xc4\x01\xfe\xff\xae\x00\xc4\x02\x00\xff\x85\x00\xc4\x02\x07\xff\ +q\x00\xc4\x02\x0b\xffq\x00\xc4\x02_\xff\xd7\x00\xc4\x03\ +I\xff\xd7\x00\xc4\x03K\xff\xd7\x00\xc4\x03M\xff\xd7\x00\ +\xc4\x03O\xff\xd7\x00\xc4\x03Q\xff\xd7\x00\xc4\x03S\xff\ +\xd7\x00\xc4\x03U\xff\xd7\x00\xc4\x03W\xff\xd7\x00\xc4\x03\ +Y\xff\xd7\x00\xc4\x03[\xff\xd7\x00\xc4\x03]\xff\xd7\x00\ +\xc4\x03_\xff\xd7\x00\xc4\x03o\xff\x85\x00\xc4\x03q\xff\ +\x85\x00\xc4\x03s\xff\x85\x00\xc4\x03\x8f\xffq\x00\xc5\x00\ +\x05\xff\xec\x00\xc5\x00\x0a\xff\xec\x00\xc5\x02\x07\xff\xec\x00\ +\xc5\x02\x0b\xff\xec\x00\xc6\x00\x05\xffq\x00\xc6\x00\x0a\xff\ +q\x00\xc6\x00&\xff\xd7\x00\xc6\x00*\xff\xd7\x00\xc6\x00\ +-\x01\x0a\x00\xc6\x002\xff\xd7\x00\xc6\x004\xff\xd7\x00\ +\xc6\x007\xffq\x00\xc6\x009\xff\xae\x00\xc6\x00:\xff\ +\xae\x00\xc6\x00<\xff\x85\x00\xc6\x00\x89\xff\xd7\x00\xc6\x00\ +\x94\xff\xd7\x00\xc6\x00\x95\xff\xd7\x00\xc6\x00\x96\xff\xd7\x00\ +\xc6\x00\x97\xff\xd7\x00\xc6\x00\x98\xff\xd7\x00\xc6\x00\x9a\xff\ +\xd7\x00\xc6\x00\x9f\xff\x85\x00\xc6\x00\xc8\xff\xd7\x00\xc6\x00\ +\xca\xff\xd7\x00\xc6\x00\xcc\xff\xd7\x00\xc6\x00\xce\xff\xd7\x00\ +\xc6\x00\xde\xff\xd7\x00\xc6\x00\xe0\xff\xd7\x00\xc6\x00\xe2\xff\ +\xd7\x00\xc6\x00\xe4\xff\xd7\x00\xc6\x01\x0e\xff\xd7\x00\xc6\x01\ +\x10\xff\xd7\x00\xc6\x01\x12\xff\xd7\x00\xc6\x01\x14\xff\xd7\x00\ +\xc6\x01$\xffq\x00\xc6\x01&\xffq\x00\xc6\x016\xff\ +\xae\x00\xc6\x018\xff\x85\x00\xc6\x01:\xff\x85\x00\xc6\x01\ +G\xff\xd7\x00\xc6\x01\xfa\xff\xae\x00\xc6\x01\xfc\xff\xae\x00\ +\xc6\x01\xfe\xff\xae\x00\xc6\x02\x00\xff\x85\x00\xc6\x02\x07\xff\ +q\x00\xc6\x02\x0b\xffq\x00\xc6\x02_\xff\xd7\x00\xc6\x03\ +I\xff\xd7\x00\xc6\x03K\xff\xd7\x00\xc6\x03M\xff\xd7\x00\ +\xc6\x03O\xff\xd7\x00\xc6\x03Q\xff\xd7\x00\xc6\x03S\xff\ +\xd7\x00\xc6\x03U\xff\xd7\x00\xc6\x03W\xff\xd7\x00\xc6\x03\ +Y\xff\xd7\x00\xc6\x03[\xff\xd7\x00\xc6\x03]\xff\xd7\x00\ +\xc6\x03_\xff\xd7\x00\xc6\x03o\xff\x85\x00\xc6\x03q\xff\ +\x85\x00\xc6\x03s\xff\x85\x00\xc6\x03\x8f\xffq\x00\xc7\x00\ +\x05\xff\xec\x00\xc7\x00\x0a\xff\xec\x00\xc7\x02\x07\xff\xec\x00\ +\xc7\x02\x0b\xff\xec\x00\xc8\x00&\xff\xd7\x00\xc8\x00*\xff\ +\xd7\x00\xc8\x002\xff\xd7\x00\xc8\x004\xff\xd7\x00\xc8\x00\ +\x89\xff\xd7\x00\xc8\x00\x94\xff\xd7\x00\xc8\x00\x95\xff\xd7\x00\ +\xc8\x00\x96\xff\xd7\x00\xc8\x00\x97\xff\xd7\x00\xc8\x00\x98\xff\ +\xd7\x00\xc8\x00\x9a\xff\xd7\x00\xc8\x00\xc8\xff\xd7\x00\xc8\x00\ +\xca\xff\xd7\x00\xc8\x00\xcc\xff\xd7\x00\xc8\x00\xce\xff\xd7\x00\ +\xc8\x00\xde\xff\xd7\x00\xc8\x00\xe0\xff\xd7\x00\xc8\x00\xe2\xff\ +\xd7\x00\xc8\x00\xe4\xff\xd7\x00\xc8\x01\x0e\xff\xd7\x00\xc8\x01\ +\x10\xff\xd7\x00\xc8\x01\x12\xff\xd7\x00\xc8\x01\x14\xff\xd7\x00\ +\xc8\x01G\xff\xd7\x00\xc8\x02_\xff\xd7\x00\xc8\x03I\xff\ +\xd7\x00\xc8\x03K\xff\xd7\x00\xc8\x03M\xff\xd7\x00\xc8\x03\ +O\xff\xd7\x00\xc8\x03Q\xff\xd7\x00\xc8\x03S\xff\xd7\x00\ +\xc8\x03U\xff\xd7\x00\xc8\x03W\xff\xd7\x00\xc8\x03Y\xff\ +\xd7\x00\xc8\x03[\xff\xd7\x00\xc8\x03]\xff\xd7\x00\xc8\x03\ +_\xff\xd7\x00\xca\x00&\xff\xd7\x00\xca\x00*\xff\xd7\x00\ +\xca\x002\xff\xd7\x00\xca\x004\xff\xd7\x00\xca\x00\x89\xff\ +\xd7\x00\xca\x00\x94\xff\xd7\x00\xca\x00\x95\xff\xd7\x00\xca\x00\ +\x96\xff\xd7\x00\xca\x00\x97\xff\xd7\x00\xca\x00\x98\xff\xd7\x00\ +\xca\x00\x9a\xff\xd7\x00\xca\x00\xc8\xff\xd7\x00\xca\x00\xca\xff\ +\xd7\x00\xca\x00\xcc\xff\xd7\x00\xca\x00\xce\xff\xd7\x00\xca\x00\ +\xde\xff\xd7\x00\xca\x00\xe0\xff\xd7\x00\xca\x00\xe2\xff\xd7\x00\ +\xca\x00\xe4\xff\xd7\x00\xca\x01\x0e\xff\xd7\x00\xca\x01\x10\xff\ +\xd7\x00\xca\x01\x12\xff\xd7\x00\xca\x01\x14\xff\xd7\x00\xca\x01\ +G\xff\xd7\x00\xca\x02_\xff\xd7\x00\xca\x03I\xff\xd7\x00\ +\xca\x03K\xff\xd7\x00\xca\x03M\xff\xd7\x00\xca\x03O\xff\ +\xd7\x00\xca\x03Q\xff\xd7\x00\xca\x03S\xff\xd7\x00\xca\x03\ +U\xff\xd7\x00\xca\x03W\xff\xd7\x00\xca\x03Y\xff\xd7\x00\ +\xca\x03[\xff\xd7\x00\xca\x03]\xff\xd7\x00\xca\x03_\xff\ +\xd7\x00\xcc\x00&\xff\xd7\x00\xcc\x00*\xff\xd7\x00\xcc\x00\ +2\xff\xd7\x00\xcc\x004\xff\xd7\x00\xcc\x00\x89\xff\xd7\x00\ +\xcc\x00\x94\xff\xd7\x00\xcc\x00\x95\xff\xd7\x00\xcc\x00\x96\xff\ +\xd7\x00\xcc\x00\x97\xff\xd7\x00\xcc\x00\x98\xff\xd7\x00\xcc\x00\ +\x9a\xff\xd7\x00\xcc\x00\xc8\xff\xd7\x00\xcc\x00\xca\xff\xd7\x00\ +\xcc\x00\xcc\xff\xd7\x00\xcc\x00\xce\xff\xd7\x00\xcc\x00\xde\xff\ +\xd7\x00\xcc\x00\xe0\xff\xd7\x00\xcc\x00\xe2\xff\xd7\x00\xcc\x00\ +\xe4\xff\xd7\x00\xcc\x01\x0e\xff\xd7\x00\xcc\x01\x10\xff\xd7\x00\ +\xcc\x01\x12\xff\xd7\x00\xcc\x01\x14\xff\xd7\x00\xcc\x01G\xff\ +\xd7\x00\xcc\x02_\xff\xd7\x00\xcc\x03I\xff\xd7\x00\xcc\x03\ +K\xff\xd7\x00\xcc\x03M\xff\xd7\x00\xcc\x03O\xff\xd7\x00\ +\xcc\x03Q\xff\xd7\x00\xcc\x03S\xff\xd7\x00\xcc\x03U\xff\ +\xd7\x00\xcc\x03W\xff\xd7\x00\xcc\x03Y\xff\xd7\x00\xcc\x03\ +[\xff\xd7\x00\xcc\x03]\xff\xd7\x00\xcc\x03_\xff\xd7\x00\ +\xce\x00&\xff\xd7\x00\xce\x00*\xff\xd7\x00\xce\x002\xff\ +\xd7\x00\xce\x004\xff\xd7\x00\xce\x00\x89\xff\xd7\x00\xce\x00\ +\x94\xff\xd7\x00\xce\x00\x95\xff\xd7\x00\xce\x00\x96\xff\xd7\x00\ +\xce\x00\x97\xff\xd7\x00\xce\x00\x98\xff\xd7\x00\xce\x00\x9a\xff\ +\xd7\x00\xce\x00\xc8\xff\xd7\x00\xce\x00\xca\xff\xd7\x00\xce\x00\ +\xcc\xff\xd7\x00\xce\x00\xce\xff\xd7\x00\xce\x00\xde\xff\xd7\x00\ +\xce\x00\xe0\xff\xd7\x00\xce\x00\xe2\xff\xd7\x00\xce\x00\xe4\xff\ +\xd7\x00\xce\x01\x0e\xff\xd7\x00\xce\x01\x10\xff\xd7\x00\xce\x01\ +\x12\xff\xd7\x00\xce\x01\x14\xff\xd7\x00\xce\x01G\xff\xd7\x00\ +\xce\x02_\xff\xd7\x00\xce\x03I\xff\xd7\x00\xce\x03K\xff\ +\xd7\x00\xce\x03M\xff\xd7\x00\xce\x03O\xff\xd7\x00\xce\x03\ +Q\xff\xd7\x00\xce\x03S\xff\xd7\x00\xce\x03U\xff\xd7\x00\ +\xce\x03W\xff\xd7\x00\xce\x03Y\xff\xd7\x00\xce\x03[\xff\ +\xd7\x00\xce\x03]\xff\xd7\x00\xce\x03_\xff\xd7\x00\xd0\x00\ +\x0f\xff\xae\x00\xd0\x00\x11\xff\xae\x00\xd0\x00$\xff\xd7\x00\ +\xd0\x007\xff\xc3\x00\xd0\x009\xff\xec\x00\xd0\x00:\xff\ +\xec\x00\xd0\x00;\xff\xd7\x00\xd0\x00<\xff\xec\x00\xd0\x00\ +=\xff\xec\x00\xd0\x00\x82\xff\xd7\x00\xd0\x00\x83\xff\xd7\x00\ +\xd0\x00\x84\xff\xd7\x00\xd0\x00\x85\xff\xd7\x00\xd0\x00\x86\xff\ +\xd7\x00\xd0\x00\x87\xff\xd7\x00\xd0\x00\x9f\xff\xec\x00\xd0\x00\ +\xc2\xff\xd7\x00\xd0\x00\xc4\xff\xd7\x00\xd0\x00\xc6\xff\xd7\x00\ +\xd0\x01$\xff\xc3\x00\xd0\x01&\xff\xc3\x00\xd0\x016\xff\ +\xec\x00\xd0\x018\xff\xec\x00\xd0\x01:\xff\xec\x00\xd0\x01\ +;\xff\xec\x00\xd0\x01=\xff\xec\x00\xd0\x01?\xff\xec\x00\ +\xd0\x01C\xff\xd7\x00\xd0\x01\xa0\xff\xec\x00\xd0\x01\xfa\xff\ +\xec\x00\xd0\x01\xfc\xff\xec\x00\xd0\x01\xfe\xff\xec\x00\xd0\x02\ +\x00\xff\xec\x00\xd0\x02\x08\xff\xae\x00\xd0\x02\x0c\xff\xae\x00\ +\xd0\x02X\xff\xd7\x00\xd0\x03\x1d\xff\xd7\x00\xd0\x03\x1f\xff\ +\xd7\x00\xd0\x03!\xff\xd7\x00\xd0\x03#\xff\xd7\x00\xd0\x03\ +%\xff\xd7\x00\xd0\x03'\xff\xd7\x00\xd0\x03)\xff\xd7\x00\ +\xd0\x03+\xff\xd7\x00\xd0\x03-\xff\xd7\x00\xd0\x03/\xff\ +\xd7\x00\xd0\x031\xff\xd7\x00\xd0\x033\xff\xd7\x00\xd0\x03\ +o\xff\xec\x00\xd0\x03q\xff\xec\x00\xd0\x03s\xff\xec\x00\ +\xd0\x03\x8f\xff\xc3\x00\xd1\x00\x05\x00R\x00\xd1\x00\x0a\x00\ +R\x00\xd1\x00\x0c\x00\x8f\x00\xd1\x00\x22\x00\xa4\x00\xd1\x00\ +@\x00\x8f\x00\xd1\x00E\x00=\x00\xd1\x00K\x00=\x00\ +\xd1\x00N\x00=\x00\xd1\x00O\x00=\x00\xd1\x00`\x00\ +\x8f\x00\xd1\x00\xe7\x00=\x00\xd1\x00\xe9\x00{\x00\xd1\x02\ +\x07\x00R\x00\xd1\x02\x0b\x00R\x00\xd2\x00\x0f\xff\xae\x00\ +\xd2\x00\x11\xff\xae\x00\xd2\x00$\xff\xd7\x00\xd2\x007\xff\ +\xc3\x00\xd2\x009\xff\xec\x00\xd2\x00:\xff\xec\x00\xd2\x00\ +;\xff\xd7\x00\xd2\x00<\xff\xec\x00\xd2\x00=\xff\xec\x00\ +\xd2\x00\x82\xff\xd7\x00\xd2\x00\x83\xff\xd7\x00\xd2\x00\x84\xff\ +\xd7\x00\xd2\x00\x85\xff\xd7\x00\xd2\x00\x86\xff\xd7\x00\xd2\x00\ +\x87\xff\xd7\x00\xd2\x00\x9f\xff\xec\x00\xd2\x00\xc2\xff\xd7\x00\ +\xd2\x00\xc4\xff\xd7\x00\xd2\x00\xc6\xff\xd7\x00\xd2\x01$\xff\ +\xc3\x00\xd2\x01&\xff\xc3\x00\xd2\x016\xff\xec\x00\xd2\x01\ +8\xff\xec\x00\xd2\x01:\xff\xec\x00\xd2\x01;\xff\xec\x00\ +\xd2\x01=\xff\xec\x00\xd2\x01?\xff\xec\x00\xd2\x01C\xff\ +\xd7\x00\xd2\x01\xa0\xff\xec\x00\xd2\x01\xfa\xff\xec\x00\xd2\x01\ +\xfc\xff\xec\x00\xd2\x01\xfe\xff\xec\x00\xd2\x02\x00\xff\xec\x00\ +\xd2\x02\x08\xff\xae\x00\xd2\x02\x0c\xff\xae\x00\xd2\x02X\xff\ +\xd7\x00\xd2\x03\x1d\xff\xd7\x00\xd2\x03\x1f\xff\xd7\x00\xd2\x03\ +!\xff\xd7\x00\xd2\x03#\xff\xd7\x00\xd2\x03%\xff\xd7\x00\ +\xd2\x03'\xff\xd7\x00\xd2\x03)\xff\xd7\x00\xd2\x03+\xff\ +\xd7\x00\xd2\x03-\xff\xd7\x00\xd2\x03/\xff\xd7\x00\xd2\x03\ +1\xff\xd7\x00\xd2\x033\xff\xd7\x00\xd2\x03o\xff\xec\x00\ +\xd2\x03q\xff\xec\x00\xd2\x03s\xff\xec\x00\xd2\x03\x8f\xff\ +\xc3\x00\xd4\x00-\x00{\x00\xd5\x00\x05\xff\xec\x00\xd5\x00\ +\x0a\xff\xec\x00\xd5\x00Y\xff\xd7\x00\xd5\x00Z\xff\xd7\x00\ +\xd5\x00[\xff\xd7\x00\xd5\x00\x5c\xff\xd7\x00\xd5\x00]\xff\ +\xec\x00\xd5\x00\xbf\xff\xd7\x00\xd5\x017\xff\xd7\x00\xd5\x01\ +<\xff\xec\x00\xd5\x01>\xff\xec\x00\xd5\x01@\xff\xec\x00\ +\xd5\x01\xfb\xff\xd7\x00\xd5\x01\xfd\xff\xd7\x00\xd5\x02\x07\xff\ +\xec\x00\xd5\x02\x0b\xff\xec\x00\xd5\x03p\xff\xd7\x00\xd6\x00\ +-\x00{\x00\xd7\x00\x05\xff\xec\x00\xd7\x00\x0a\xff\xec\x00\ +\xd7\x00Y\xff\xd7\x00\xd7\x00Z\xff\xd7\x00\xd7\x00[\xff\ +\xd7\x00\xd7\x00\x5c\xff\xd7\x00\xd7\x00]\xff\xec\x00\xd7\x00\ +\xbf\xff\xd7\x00\xd7\x017\xff\xd7\x00\xd7\x01<\xff\xec\x00\ +\xd7\x01>\xff\xec\x00\xd7\x01@\xff\xec\x00\xd7\x01\xfb\xff\ +\xd7\x00\xd7\x01\xfd\xff\xd7\x00\xd7\x02\x07\xff\xec\x00\xd7\x02\ +\x0b\xff\xec\x00\xd7\x03p\xff\xd7\x00\xd8\x00-\x00{\x00\ +\xd9\x00\x05\xff\xec\x00\xd9\x00\x0a\xff\xec\x00\xd9\x00Y\xff\ +\xd7\x00\xd9\x00Z\xff\xd7\x00\xd9\x00[\xff\xd7\x00\xd9\x00\ +\x5c\xff\xd7\x00\xd9\x00]\xff\xec\x00\xd9\x00\xbf\xff\xd7\x00\ +\xd9\x017\xff\xd7\x00\xd9\x01<\xff\xec\x00\xd9\x01>\xff\ +\xec\x00\xd9\x01@\xff\xec\x00\xd9\x01\xfb\xff\xd7\x00\xd9\x01\ +\xfd\xff\xd7\x00\xd9\x02\x07\xff\xec\x00\xd9\x02\x0b\xff\xec\x00\ +\xd9\x03p\xff\xd7\x00\xda\x00-\x00{\x00\xdb\x00\x05\xff\ +\xec\x00\xdb\x00\x0a\xff\xec\x00\xdb\x00Y\xff\xd7\x00\xdb\x00\ +Z\xff\xd7\x00\xdb\x00[\xff\xd7\x00\xdb\x00\x5c\xff\xd7\x00\ +\xdb\x00]\xff\xec\x00\xdb\x00\xbf\xff\xd7\x00\xdb\x017\xff\ +\xd7\x00\xdb\x01<\xff\xec\x00\xdb\x01>\xff\xec\x00\xdb\x01\ +@\xff\xec\x00\xdb\x01\xfb\xff\xd7\x00\xdb\x01\xfd\xff\xd7\x00\ +\xdb\x02\x07\xff\xec\x00\xdb\x02\x0b\xff\xec\x00\xdb\x03p\xff\ +\xd7\x00\xdc\x00-\x00{\x00\xdd\x00\x05\xff\xec\x00\xdd\x00\ +\x0a\xff\xec\x00\xdd\x00Y\xff\xd7\x00\xdd\x00Z\xff\xd7\x00\ +\xdd\x00[\xff\xd7\x00\xdd\x00\x5c\xff\xd7\x00\xdd\x00]\xff\ +\xec\x00\xdd\x00\xbf\xff\xd7\x00\xdd\x017\xff\xd7\x00\xdd\x01\ +<\xff\xec\x00\xdd\x01>\xff\xec\x00\xdd\x01@\xff\xec\x00\ +\xdd\x01\xfb\xff\xd7\x00\xdd\x01\xfd\xff\xd7\x00\xdd\x02\x07\xff\ +\xec\x00\xdd\x02\x0b\xff\xec\x00\xdd\x03p\xff\xd7\x00\xe7\x00\ +\x05\xff\xec\x00\xe7\x00\x0a\xff\xec\x00\xe7\x02\x07\xff\xec\x00\ +\xe7\x02\x0b\xff\xec\x00\xf8\x00&\xff\xd7\x00\xf8\x00*\xff\ +\xd7\x00\xf8\x002\xff\xd7\x00\xf8\x004\xff\xd7\x00\xf8\x00\ +\x89\xff\xd7\x00\xf8\x00\x94\xff\xd7\x00\xf8\x00\x95\xff\xd7\x00\ +\xf8\x00\x96\xff\xd7\x00\xf8\x00\x97\xff\xd7\x00\xf8\x00\x98\xff\ +\xd7\x00\xf8\x00\x9a\xff\xd7\x00\xf8\x00\xc8\xff\xd7\x00\xf8\x00\ +\xca\xff\xd7\x00\xf8\x00\xcc\xff\xd7\x00\xf8\x00\xce\xff\xd7\x00\ +\xf8\x00\xde\xff\xd7\x00\xf8\x00\xe0\xff\xd7\x00\xf8\x00\xe2\xff\ +\xd7\x00\xf8\x00\xe4\xff\xd7\x00\xf8\x01\x0e\xff\xd7\x00\xf8\x01\ +\x10\xff\xd7\x00\xf8\x01\x12\xff\xd7\x00\xf8\x01\x14\xff\xd7\x00\ +\xf8\x01G\xff\xd7\x00\xf8\x02_\xff\xd7\x00\xf8\x03I\xff\ +\xd7\x00\xf8\x03K\xff\xd7\x00\xf8\x03M\xff\xd7\x00\xf8\x03\ +O\xff\xd7\x00\xf8\x03Q\xff\xd7\x00\xf8\x03S\xff\xd7\x00\ +\xf8\x03U\xff\xd7\x00\xf8\x03W\xff\xd7\x00\xf8\x03Y\xff\ +\xd7\x00\xf8\x03[\xff\xd7\x00\xf8\x03]\xff\xd7\x00\xf8\x03\ +_\xff\xd7\x00\xf9\x00F\xff\xd7\x00\xf9\x00G\xff\xd7\x00\ +\xf9\x00H\xff\xd7\x00\xf9\x00R\xff\xd7\x00\xf9\x00T\xff\ +\xd7\x00\xf9\x00\xa2\xff\xd7\x00\xf9\x00\xa9\xff\xd7\x00\xf9\x00\ +\xaa\xff\xd7\x00\xf9\x00\xab\xff\xd7\x00\xf9\x00\xac\xff\xd7\x00\ +\xf9\x00\xad\xff\xd7\x00\xf9\x00\xb4\xff\xd7\x00\xf9\x00\xb5\xff\ +\xd7\x00\xf9\x00\xb6\xff\xd7\x00\xf9\x00\xb7\xff\xd7\x00\xf9\x00\ +\xb8\xff\xd7\x00\xf9\x00\xba\xff\xd7\x00\xf9\x00\xc9\xff\xd7\x00\ +\xf9\x00\xcb\xff\xd7\x00\xf9\x00\xcd\xff\xd7\x00\xf9\x00\xcf\xff\ +\xd7\x00\xf9\x00\xd1\xff\xd7\x00\xf9\x00\xd3\xff\xd7\x00\xf9\x00\ +\xd5\xff\xd7\x00\xf9\x00\xd7\xff\xd7\x00\xf9\x00\xd9\xff\xd7\x00\ +\xf9\x00\xdb\xff\xd7\x00\xf9\x00\xdd\xff\xd7\x00\xf9\x01\x0f\xff\ +\xd7\x00\xf9\x01\x11\xff\xd7\x00\xf9\x01\x13\xff\xd7\x00\xf9\x01\ +\x15\xff\xd7\x00\xf9\x01H\xff\xd7\x00\xf9\x02`\xff\xd7\x00\ +\xf9\x036\xff\xd7\x00\xf9\x038\xff\xd7\x00\xf9\x03:\xff\ +\xd7\x00\xf9\x03<\xff\xd7\x00\xf9\x03@\xff\xd7\x00\xf9\x03\ +B\xff\xd7\x00\xf9\x03D\xff\xd7\x00\xf9\x03J\xff\xd7\x00\ +\xf9\x03L\xff\xd7\x00\xf9\x03N\xff\xd7\x00\xf9\x03R\xff\ +\xd7\x00\xf9\x03T\xff\xd7\x00\xf9\x03V\xff\xd7\x00\xf9\x03\ +X\xff\xd7\x00\xf9\x03Z\xff\xd7\x00\xf9\x03\x5c\xff\xd7\x00\ +\xf9\x03^\xff\xd7\x00\xf9\x03`\xff\xd7\x00\xfa\x00F\xff\ +\xd7\x00\xfa\x00G\xff\xd7\x00\xfa\x00H\xff\xd7\x00\xfa\x00\ +R\xff\xd7\x00\xfa\x00T\xff\xd7\x00\xfa\x00\xa2\xff\xd7\x00\ +\xfa\x00\xa9\xff\xd7\x00\xfa\x00\xaa\xff\xd7\x00\xfa\x00\xab\xff\ +\xd7\x00\xfa\x00\xac\xff\xd7\x00\xfa\x00\xad\xff\xd7\x00\xfa\x00\ +\xb4\xff\xd7\x00\xfa\x00\xb5\xff\xd7\x00\xfa\x00\xb6\xff\xd7\x00\ +\xfa\x00\xb7\xff\xd7\x00\xfa\x00\xb8\xff\xd7\x00\xfa\x00\xba\xff\ +\xd7\x00\xfa\x00\xc9\xff\xd7\x00\xfa\x00\xcb\xff\xd7\x00\xfa\x00\ +\xcd\xff\xd7\x00\xfa\x00\xcf\xff\xd7\x00\xfa\x00\xd1\xff\xd7\x00\ +\xfa\x00\xd3\xff\xd7\x00\xfa\x00\xd5\xff\xd7\x00\xfa\x00\xd7\xff\ +\xd7\x00\xfa\x00\xd9\xff\xd7\x00\xfa\x00\xdb\xff\xd7\x00\xfa\x00\ +\xdd\xff\xd7\x00\xfa\x01\x0f\xff\xd7\x00\xfa\x01\x11\xff\xd7\x00\ +\xfa\x01\x13\xff\xd7\x00\xfa\x01\x15\xff\xd7\x00\xfa\x01H\xff\ +\xd7\x00\xfa\x02`\xff\xd7\x00\xfa\x036\xff\xd7\x00\xfa\x03\ +8\xff\xd7\x00\xfa\x03:\xff\xd7\x00\xfa\x03<\xff\xd7\x00\ +\xfa\x03@\xff\xd7\x00\xfa\x03B\xff\xd7\x00\xfa\x03D\xff\ +\xd7\x00\xfa\x03J\xff\xd7\x00\xfa\x03L\xff\xd7\x00\xfa\x03\ +N\xff\xd7\x00\xfa\x03R\xff\xd7\x00\xfa\x03T\xff\xd7\x00\ +\xfa\x03V\xff\xd7\x00\xfa\x03X\xff\xd7\x00\xfa\x03Z\xff\ +\xd7\x00\xfa\x03\x5c\xff\xd7\x00\xfa\x03^\xff\xd7\x00\xfa\x03\ +`\xff\xd7\x00\xfb\x00\x05\xff\x5c\x00\xfb\x00\x0a\xff\x5c\x00\ +\xfb\x00&\xff\xd7\x00\xfb\x00*\xff\xd7\x00\xfb\x002\xff\ +\xd7\x00\xfb\x004\xff\xd7\x00\xfb\x007\xff\xd7\x00\xfb\x00\ +8\xff\xec\x00\xfb\x009\xff\xd7\x00\xfb\x00:\xff\xd7\x00\ +\xfb\x00<\xff\xc3\x00\xfb\x00\x89\xff\xd7\x00\xfb\x00\x94\xff\ +\xd7\x00\xfb\x00\x95\xff\xd7\x00\xfb\x00\x96\xff\xd7\x00\xfb\x00\ +\x97\xff\xd7\x00\xfb\x00\x98\xff\xd7\x00\xfb\x00\x9a\xff\xd7\x00\ +\xfb\x00\x9b\xff\xec\x00\xfb\x00\x9c\xff\xec\x00\xfb\x00\x9d\xff\ +\xec\x00\xfb\x00\x9e\xff\xec\x00\xfb\x00\x9f\xff\xc3\x00\xfb\x00\ +\xc8\xff\xd7\x00\xfb\x00\xca\xff\xd7\x00\xfb\x00\xcc\xff\xd7\x00\ +\xfb\x00\xce\xff\xd7\x00\xfb\x00\xde\xff\xd7\x00\xfb\x00\xe0\xff\ +\xd7\x00\xfb\x00\xe2\xff\xd7\x00\xfb\x00\xe4\xff\xd7\x00\xfb\x01\ +\x0e\xff\xd7\x00\xfb\x01\x10\xff\xd7\x00\xfb\x01\x12\xff\xd7\x00\ +\xfb\x01\x14\xff\xd7\x00\xfb\x01$\xff\xd7\x00\xfb\x01&\xff\ +\xd7\x00\xfb\x01*\xff\xec\x00\xfb\x01,\xff\xec\x00\xfb\x01\ +.\xff\xec\x00\xfb\x010\xff\xec\x00\xfb\x012\xff\xec\x00\ +\xfb\x014\xff\xec\x00\xfb\x016\xff\xd7\x00\xfb\x018\xff\ +\xc3\x00\xfb\x01:\xff\xc3\x00\xfb\x01G\xff\xd7\x00\xfb\x01\ +\xfa\xff\xd7\x00\xfb\x01\xfc\xff\xd7\x00\xfb\x01\xfe\xff\xd7\x00\ +\xfb\x02\x00\xff\xc3\x00\xfb\x02\x07\xff\x5c\x00\xfb\x02\x0b\xff\ +\x5c\x00\xfb\x02_\xff\xd7\x00\xfb\x02a\xff\xec\x00\xfb\x03\ +I\xff\xd7\x00\xfb\x03K\xff\xd7\x00\xfb\x03M\xff\xd7\x00\ +\xfb\x03O\xff\xd7\x00\xfb\x03Q\xff\xd7\x00\xfb\x03S\xff\ +\xd7\x00\xfb\x03U\xff\xd7\x00\xfb\x03W\xff\xd7\x00\xfb\x03\ +Y\xff\xd7\x00\xfb\x03[\xff\xd7\x00\xfb\x03]\xff\xd7\x00\ +\xfb\x03_\xff\xd7\x00\xfb\x03a\xff\xec\x00\xfb\x03c\xff\ +\xec\x00\xfb\x03e\xff\xec\x00\xfb\x03g\xff\xec\x00\xfb\x03\ +i\xff\xec\x00\xfb\x03k\xff\xec\x00\xfb\x03m\xff\xec\x00\ +\xfb\x03o\xff\xc3\x00\xfb\x03q\xff\xc3\x00\xfb\x03s\xff\ +\xc3\x00\xfb\x03\x8f\xff\xd7\x00\xfd\x00\x05\xff\x5c\x00\xfd\x00\ +\x0a\xff\x5c\x00\xfd\x00&\xff\xd7\x00\xfd\x00*\xff\xd7\x00\ +\xfd\x002\xff\xd7\x00\xfd\x004\xff\xd7\x00\xfd\x007\xff\ +\xd7\x00\xfd\x008\xff\xec\x00\xfd\x009\xff\xd7\x00\xfd\x00\ +:\xff\xd7\x00\xfd\x00<\xff\xc3\x00\xfd\x00\x89\xff\xd7\x00\ +\xfd\x00\x94\xff\xd7\x00\xfd\x00\x95\xff\xd7\x00\xfd\x00\x96\xff\ +\xd7\x00\xfd\x00\x97\xff\xd7\x00\xfd\x00\x98\xff\xd7\x00\xfd\x00\ +\x9a\xff\xd7\x00\xfd\x00\x9b\xff\xec\x00\xfd\x00\x9c\xff\xec\x00\ +\xfd\x00\x9d\xff\xec\x00\xfd\x00\x9e\xff\xec\x00\xfd\x00\x9f\xff\ +\xc3\x00\xfd\x00\xc8\xff\xd7\x00\xfd\x00\xca\xff\xd7\x00\xfd\x00\ +\xcc\xff\xd7\x00\xfd\x00\xce\xff\xd7\x00\xfd\x00\xde\xff\xd7\x00\ +\xfd\x00\xe0\xff\xd7\x00\xfd\x00\xe2\xff\xd7\x00\xfd\x00\xe4\xff\ +\xd7\x00\xfd\x01\x0e\xff\xd7\x00\xfd\x01\x10\xff\xd7\x00\xfd\x01\ +\x12\xff\xd7\x00\xfd\x01\x14\xff\xd7\x00\xfd\x01$\xff\xd7\x00\ +\xfd\x01&\xff\xd7\x00\xfd\x01*\xff\xec\x00\xfd\x01,\xff\ +\xec\x00\xfd\x01.\xff\xec\x00\xfd\x010\xff\xec\x00\xfd\x01\ +2\xff\xec\x00\xfd\x014\xff\xec\x00\xfd\x016\xff\xd7\x00\ +\xfd\x018\xff\xc3\x00\xfd\x01:\xff\xc3\x00\xfd\x01G\xff\ +\xd7\x00\xfd\x01\xfa\xff\xd7\x00\xfd\x01\xfc\xff\xd7\x00\xfd\x01\ +\xfe\xff\xd7\x00\xfd\x02\x00\xff\xc3\x00\xfd\x02\x07\xff\x5c\x00\ +\xfd\x02\x0b\xff\x5c\x00\xfd\x02_\xff\xd7\x00\xfd\x02a\xff\ +\xec\x00\xfd\x03I\xff\xd7\x00\xfd\x03K\xff\xd7\x00\xfd\x03\ +M\xff\xd7\x00\xfd\x03O\xff\xd7\x00\xfd\x03Q\xff\xd7\x00\ +\xfd\x03S\xff\xd7\x00\xfd\x03U\xff\xd7\x00\xfd\x03W\xff\ +\xd7\x00\xfd\x03Y\xff\xd7\x00\xfd\x03[\xff\xd7\x00\xfd\x03\ +]\xff\xd7\x00\xfd\x03_\xff\xd7\x00\xfd\x03a\xff\xec\x00\ +\xfd\x03c\xff\xec\x00\xfd\x03e\xff\xec\x00\xfd\x03g\xff\ +\xec\x00\xfd\x03i\xff\xec\x00\xfd\x03k\xff\xec\x00\xfd\x03\ +m\xff\xec\x00\xfd\x03o\xff\xc3\x00\xfd\x03q\xff\xc3\x00\ +\xfd\x03s\xff\xc3\x00\xfd\x03\x8f\xff\xd7\x00\xff\x00\x05\xff\ +\x5c\x00\xff\x00\x0a\xff\x5c\x00\xff\x00&\xff\xd7\x00\xff\x00\ +*\xff\xd7\x00\xff\x002\xff\xd7\x00\xff\x004\xff\xd7\x00\ +\xff\x007\xff\xd7\x00\xff\x008\xff\xec\x00\xff\x009\xff\ +\xd7\x00\xff\x00:\xff\xd7\x00\xff\x00<\xff\xc3\x00\xff\x00\ +\x89\xff\xd7\x00\xff\x00\x94\xff\xd7\x00\xff\x00\x95\xff\xd7\x00\ +\xff\x00\x96\xff\xd7\x00\xff\x00\x97\xff\xd7\x00\xff\x00\x98\xff\ +\xd7\x00\xff\x00\x9a\xff\xd7\x00\xff\x00\x9b\xff\xec\x00\xff\x00\ +\x9c\xff\xec\x00\xff\x00\x9d\xff\xec\x00\xff\x00\x9e\xff\xec\x00\ +\xff\x00\x9f\xff\xc3\x00\xff\x00\xc8\xff\xd7\x00\xff\x00\xca\xff\ +\xd7\x00\xff\x00\xcc\xff\xd7\x00\xff\x00\xce\xff\xd7\x00\xff\x00\ +\xde\xff\xd7\x00\xff\x00\xe0\xff\xd7\x00\xff\x00\xe2\xff\xd7\x00\ +\xff\x00\xe4\xff\xd7\x00\xff\x01\x0e\xff\xd7\x00\xff\x01\x10\xff\ +\xd7\x00\xff\x01\x12\xff\xd7\x00\xff\x01\x14\xff\xd7\x00\xff\x01\ +$\xff\xd7\x00\xff\x01&\xff\xd7\x00\xff\x01*\xff\xec\x00\ +\xff\x01,\xff\xec\x00\xff\x01.\xff\xec\x00\xff\x010\xff\ +\xec\x00\xff\x012\xff\xec\x00\xff\x014\xff\xec\x00\xff\x01\ +6\xff\xd7\x00\xff\x018\xff\xc3\x00\xff\x01:\xff\xc3\x00\ +\xff\x01G\xff\xd7\x00\xff\x01\xfa\xff\xd7\x00\xff\x01\xfc\xff\ +\xd7\x00\xff\x01\xfe\xff\xd7\x00\xff\x02\x00\xff\xc3\x00\xff\x02\ +\x07\xff\x5c\x00\xff\x02\x0b\xff\x5c\x00\xff\x02_\xff\xd7\x00\ +\xff\x02a\xff\xec\x00\xff\x03I\xff\xd7\x00\xff\x03K\xff\ +\xd7\x00\xff\x03M\xff\xd7\x00\xff\x03O\xff\xd7\x00\xff\x03\ +Q\xff\xd7\x00\xff\x03S\xff\xd7\x00\xff\x03U\xff\xd7\x00\ +\xff\x03W\xff\xd7\x00\xff\x03Y\xff\xd7\x00\xff\x03[\xff\ +\xd7\x00\xff\x03]\xff\xd7\x00\xff\x03_\xff\xd7\x00\xff\x03\ +a\xff\xec\x00\xff\x03c\xff\xec\x00\xff\x03e\xff\xec\x00\ +\xff\x03g\xff\xec\x00\xff\x03i\xff\xec\x00\xff\x03k\xff\ +\xec\x00\xff\x03m\xff\xec\x00\xff\x03o\xff\xc3\x00\xff\x03\ +q\xff\xc3\x00\xff\x03s\xff\xc3\x00\xff\x03\x8f\xff\xd7\x01\ +\x00\x00\x05\x00R\x01\x00\x00\x0a\x00R\x01\x00\x00\x0c\x00\ +\x8f\x01\x00\x00\x22\x00\x8f\x01\x00\x00@\x00\x8f\x01\x00\x00\ +E\x00=\x01\x00\x00K\x00=\x01\x00\x00N\x00=\x01\ +\x00\x00O\x00=\x01\x00\x00`\x00\x8f\x01\x00\x00\xe7\x00\ +=\x01\x00\x00\xe9\x00\x8f\x01\x00\x02\x07\x00R\x01\x00\x02\ +\x0b\x00R\x01\x01\x00\x05\xff\x5c\x01\x01\x00\x0a\xff\x5c\x01\ +\x01\x00&\xff\xd7\x01\x01\x00*\xff\xd7\x01\x01\x002\xff\ +\xd7\x01\x01\x004\xff\xd7\x01\x01\x007\xff\xd7\x01\x01\x00\ +8\xff\xec\x01\x01\x009\xff\xd7\x01\x01\x00:\xff\xd7\x01\ +\x01\x00<\xff\xc3\x01\x01\x00\x89\xff\xd7\x01\x01\x00\x94\xff\ +\xd7\x01\x01\x00\x95\xff\xd7\x01\x01\x00\x96\xff\xd7\x01\x01\x00\ +\x97\xff\xd7\x01\x01\x00\x98\xff\xd7\x01\x01\x00\x9a\xff\xd7\x01\ +\x01\x00\x9b\xff\xec\x01\x01\x00\x9c\xff\xec\x01\x01\x00\x9d\xff\ +\xec\x01\x01\x00\x9e\xff\xec\x01\x01\x00\x9f\xff\xc3\x01\x01\x00\ +\xc8\xff\xd7\x01\x01\x00\xca\xff\xd7\x01\x01\x00\xcc\xff\xd7\x01\ +\x01\x00\xce\xff\xd7\x01\x01\x00\xde\xff\xd7\x01\x01\x00\xe0\xff\ +\xd7\x01\x01\x00\xe2\xff\xd7\x01\x01\x00\xe4\xff\xd7\x01\x01\x01\ +\x0e\xff\xd7\x01\x01\x01\x10\xff\xd7\x01\x01\x01\x12\xff\xd7\x01\ +\x01\x01\x14\xff\xd7\x01\x01\x01$\xff\xd7\x01\x01\x01&\xff\ +\xd7\x01\x01\x01*\xff\xec\x01\x01\x01,\xff\xec\x01\x01\x01\ +.\xff\xec\x01\x01\x010\xff\xec\x01\x01\x012\xff\xec\x01\ +\x01\x014\xff\xec\x01\x01\x016\xff\xd7\x01\x01\x018\xff\ +\xc3\x01\x01\x01:\xff\xc3\x01\x01\x01G\xff\xd7\x01\x01\x01\ +\xfa\xff\xd7\x01\x01\x01\xfc\xff\xd7\x01\x01\x01\xfe\xff\xd7\x01\ +\x01\x02\x00\xff\xc3\x01\x01\x02\x07\xff\x5c\x01\x01\x02\x0b\xff\ +\x5c\x01\x01\x02_\xff\xd7\x01\x01\x02a\xff\xec\x01\x01\x03\ +I\xff\xd7\x01\x01\x03K\xff\xd7\x01\x01\x03M\xff\xd7\x01\ +\x01\x03O\xff\xd7\x01\x01\x03Q\xff\xd7\x01\x01\x03S\xff\ +\xd7\x01\x01\x03U\xff\xd7\x01\x01\x03W\xff\xd7\x01\x01\x03\ +Y\xff\xd7\x01\x01\x03[\xff\xd7\x01\x01\x03]\xff\xd7\x01\ +\x01\x03_\xff\xd7\x01\x01\x03a\xff\xec\x01\x01\x03c\xff\ +\xec\x01\x01\x03e\xff\xec\x01\x01\x03g\xff\xec\x01\x01\x03\ +i\xff\xec\x01\x01\x03k\xff\xec\x01\x01\x03m\xff\xec\x01\ +\x01\x03o\xff\xc3\x01\x01\x03q\xff\xc3\x01\x01\x03s\xff\ +\xc3\x01\x01\x03\x8f\xff\xd7\x01\x03\x00\x05\xff\x5c\x01\x03\x00\ +\x0a\xff\x5c\x01\x03\x00&\xff\xd7\x01\x03\x00*\xff\xd7\x01\ +\x03\x002\xff\xd7\x01\x03\x004\xff\xd7\x01\x03\x007\xff\ +\xd7\x01\x03\x008\xff\xec\x01\x03\x009\xff\xd7\x01\x03\x00\ +:\xff\xd7\x01\x03\x00<\xff\xc3\x01\x03\x00\x89\xff\xd7\x01\ +\x03\x00\x94\xff\xd7\x01\x03\x00\x95\xff\xd7\x01\x03\x00\x96\xff\ +\xd7\x01\x03\x00\x97\xff\xd7\x01\x03\x00\x98\xff\xd7\x01\x03\x00\ +\x9a\xff\xd7\x01\x03\x00\x9b\xff\xec\x01\x03\x00\x9c\xff\xec\x01\ +\x03\x00\x9d\xff\xec\x01\x03\x00\x9e\xff\xec\x01\x03\x00\x9f\xff\ +\xc3\x01\x03\x00\xc8\xff\xd7\x01\x03\x00\xca\xff\xd7\x01\x03\x00\ +\xcc\xff\xd7\x01\x03\x00\xce\xff\xd7\x01\x03\x00\xde\xff\xd7\x01\ +\x03\x00\xe0\xff\xd7\x01\x03\x00\xe2\xff\xd7\x01\x03\x00\xe4\xff\ +\xd7\x01\x03\x01\x0e\xff\xd7\x01\x03\x01\x10\xff\xd7\x01\x03\x01\ +\x12\xff\xd7\x01\x03\x01\x14\xff\xd7\x01\x03\x01$\xff\xd7\x01\ +\x03\x01&\xff\xd7\x01\x03\x01*\xff\xec\x01\x03\x01,\xff\ +\xec\x01\x03\x01.\xff\xec\x01\x03\x010\xff\xec\x01\x03\x01\ +2\xff\xec\x01\x03\x014\xff\xec\x01\x03\x016\xff\xd7\x01\ +\x03\x018\xff\xc3\x01\x03\x01:\xff\xc3\x01\x03\x01G\xff\ +\xd7\x01\x03\x01\xfa\xff\xd7\x01\x03\x01\xfc\xff\xd7\x01\x03\x01\ +\xfe\xff\xd7\x01\x03\x02\x00\xff\xc3\x01\x03\x02\x07\xff\x5c\x01\ +\x03\x02\x0b\xff\x5c\x01\x03\x02_\xff\xd7\x01\x03\x02a\xff\ +\xec\x01\x03\x03I\xff\xd7\x01\x03\x03K\xff\xd7\x01\x03\x03\ +M\xff\xd7\x01\x03\x03O\xff\xd7\x01\x03\x03Q\xff\xd7\x01\ +\x03\x03S\xff\xd7\x01\x03\x03U\xff\xd7\x01\x03\x03W\xff\ +\xd7\x01\x03\x03Y\xff\xd7\x01\x03\x03[\xff\xd7\x01\x03\x03\ +]\xff\xd7\x01\x03\x03_\xff\xd7\x01\x03\x03a\xff\xec\x01\ +\x03\x03c\xff\xec\x01\x03\x03e\xff\xec\x01\x03\x03g\xff\ +\xec\x01\x03\x03i\xff\xec\x01\x03\x03k\xff\xec\x01\x03\x03\ +m\xff\xec\x01\x03\x03o\xff\xc3\x01\x03\x03q\xff\xc3\x01\ +\x03\x03s\xff\xc3\x01\x03\x03\x8f\xff\xd7\x01\x08\x00\x05\xff\ +\xec\x01\x08\x00\x0a\xff\xec\x01\x08\x02\x07\xff\xec\x01\x08\x02\ +\x0b\xff\xec\x01\x0e\x00\x0f\xff\xae\x01\x0e\x00\x11\xff\xae\x01\ +\x0e\x00$\xff\xd7\x01\x0e\x007\xff\xc3\x01\x0e\x009\xff\ +\xec\x01\x0e\x00:\xff\xec\x01\x0e\x00;\xff\xd7\x01\x0e\x00\ +<\xff\xec\x01\x0e\x00=\xff\xec\x01\x0e\x00\x82\xff\xd7\x01\ +\x0e\x00\x83\xff\xd7\x01\x0e\x00\x84\xff\xd7\x01\x0e\x00\x85\xff\ +\xd7\x01\x0e\x00\x86\xff\xd7\x01\x0e\x00\x87\xff\xd7\x01\x0e\x00\ +\x9f\xff\xec\x01\x0e\x00\xc2\xff\xd7\x01\x0e\x00\xc4\xff\xd7\x01\ +\x0e\x00\xc6\xff\xd7\x01\x0e\x01$\xff\xc3\x01\x0e\x01&\xff\ +\xc3\x01\x0e\x016\xff\xec\x01\x0e\x018\xff\xec\x01\x0e\x01\ +:\xff\xec\x01\x0e\x01;\xff\xec\x01\x0e\x01=\xff\xec\x01\ +\x0e\x01?\xff\xec\x01\x0e\x01C\xff\xd7\x01\x0e\x01\xa0\xff\ +\xec\x01\x0e\x01\xfa\xff\xec\x01\x0e\x01\xfc\xff\xec\x01\x0e\x01\ +\xfe\xff\xec\x01\x0e\x02\x00\xff\xec\x01\x0e\x02\x08\xff\xae\x01\ +\x0e\x02\x0c\xff\xae\x01\x0e\x02X\xff\xd7\x01\x0e\x03\x1d\xff\ +\xd7\x01\x0e\x03\x1f\xff\xd7\x01\x0e\x03!\xff\xd7\x01\x0e\x03\ +#\xff\xd7\x01\x0e\x03%\xff\xd7\x01\x0e\x03'\xff\xd7\x01\ +\x0e\x03)\xff\xd7\x01\x0e\x03+\xff\xd7\x01\x0e\x03-\xff\ +\xd7\x01\x0e\x03/\xff\xd7\x01\x0e\x031\xff\xd7\x01\x0e\x03\ +3\xff\xd7\x01\x0e\x03o\xff\xec\x01\x0e\x03q\xff\xec\x01\ +\x0e\x03s\xff\xec\x01\x0e\x03\x8f\xff\xc3\x01\x10\x00\x0f\xff\ +\xae\x01\x10\x00\x11\xff\xae\x01\x10\x00$\xff\xd7\x01\x10\x00\ +7\xff\xc3\x01\x10\x009\xff\xec\x01\x10\x00:\xff\xec\x01\ +\x10\x00;\xff\xd7\x01\x10\x00<\xff\xec\x01\x10\x00=\xff\ +\xec\x01\x10\x00\x82\xff\xd7\x01\x10\x00\x83\xff\xd7\x01\x10\x00\ +\x84\xff\xd7\x01\x10\x00\x85\xff\xd7\x01\x10\x00\x86\xff\xd7\x01\ +\x10\x00\x87\xff\xd7\x01\x10\x00\x9f\xff\xec\x01\x10\x00\xc2\xff\ +\xd7\x01\x10\x00\xc4\xff\xd7\x01\x10\x00\xc6\xff\xd7\x01\x10\x01\ +$\xff\xc3\x01\x10\x01&\xff\xc3\x01\x10\x016\xff\xec\x01\ +\x10\x018\xff\xec\x01\x10\x01:\xff\xec\x01\x10\x01;\xff\ +\xec\x01\x10\x01=\xff\xec\x01\x10\x01?\xff\xec\x01\x10\x01\ +C\xff\xd7\x01\x10\x01\xa0\xff\xec\x01\x10\x01\xfa\xff\xec\x01\ +\x10\x01\xfc\xff\xec\x01\x10\x01\xfe\xff\xec\x01\x10\x02\x00\xff\ +\xec\x01\x10\x02\x08\xff\xae\x01\x10\x02\x0c\xff\xae\x01\x10\x02\ +X\xff\xd7\x01\x10\x03\x1d\xff\xd7\x01\x10\x03\x1f\xff\xd7\x01\ +\x10\x03!\xff\xd7\x01\x10\x03#\xff\xd7\x01\x10\x03%\xff\ +\xd7\x01\x10\x03'\xff\xd7\x01\x10\x03)\xff\xd7\x01\x10\x03\ ++\xff\xd7\x01\x10\x03-\xff\xd7\x01\x10\x03/\xff\xd7\x01\ +\x10\x031\xff\xd7\x01\x10\x033\xff\xd7\x01\x10\x03o\xff\ +\xec\x01\x10\x03q\xff\xec\x01\x10\x03s\xff\xec\x01\x10\x03\ +\x8f\xff\xc3\x01\x12\x00\x0f\xff\xae\x01\x12\x00\x11\xff\xae\x01\ +\x12\x00$\xff\xd7\x01\x12\x007\xff\xc3\x01\x12\x009\xff\ +\xec\x01\x12\x00:\xff\xec\x01\x12\x00;\xff\xd7\x01\x12\x00\ +<\xff\xec\x01\x12\x00=\xff\xec\x01\x12\x00\x82\xff\xd7\x01\ +\x12\x00\x83\xff\xd7\x01\x12\x00\x84\xff\xd7\x01\x12\x00\x85\xff\ +\xd7\x01\x12\x00\x86\xff\xd7\x01\x12\x00\x87\xff\xd7\x01\x12\x00\ +\x9f\xff\xec\x01\x12\x00\xc2\xff\xd7\x01\x12\x00\xc4\xff\xd7\x01\ +\x12\x00\xc6\xff\xd7\x01\x12\x01$\xff\xc3\x01\x12\x01&\xff\ +\xc3\x01\x12\x016\xff\xec\x01\x12\x018\xff\xec\x01\x12\x01\ +:\xff\xec\x01\x12\x01;\xff\xec\x01\x12\x01=\xff\xec\x01\ +\x12\x01?\xff\xec\x01\x12\x01C\xff\xd7\x01\x12\x01\xa0\xff\ +\xec\x01\x12\x01\xfa\xff\xec\x01\x12\x01\xfc\xff\xec\x01\x12\x01\ +\xfe\xff\xec\x01\x12\x02\x00\xff\xec\x01\x12\x02\x08\xff\xae\x01\ +\x12\x02\x0c\xff\xae\x01\x12\x02X\xff\xd7\x01\x12\x03\x1d\xff\ +\xd7\x01\x12\x03\x1f\xff\xd7\x01\x12\x03!\xff\xd7\x01\x12\x03\ +#\xff\xd7\x01\x12\x03%\xff\xd7\x01\x12\x03'\xff\xd7\x01\ +\x12\x03)\xff\xd7\x01\x12\x03+\xff\xd7\x01\x12\x03-\xff\ +\xd7\x01\x12\x03/\xff\xd7\x01\x12\x031\xff\xd7\x01\x12\x03\ +3\xff\xd7\x01\x12\x03o\xff\xec\x01\x12\x03q\xff\xec\x01\ +\x12\x03s\xff\xec\x01\x12\x03\x8f\xff\xc3\x01\x14\x00-\x00\ +{\x01\x17\x00\x05\x00R\x01\x17\x00\x0a\x00R\x01\x17\x00\ +D\xff\xd7\x01\x17\x00F\xff\xd7\x01\x17\x00G\xff\xd7\x01\ +\x17\x00H\xff\xd7\x01\x17\x00J\xff\xec\x01\x17\x00R\xff\ +\xd7\x01\x17\x00T\xff\xd7\x01\x17\x00\xa2\xff\xd7\x01\x17\x00\ +\xa3\xff\xd7\x01\x17\x00\xa4\xff\xd7\x01\x17\x00\xa5\xff\xd7\x01\ +\x17\x00\xa6\xff\xd7\x01\x17\x00\xa7\xff\xd7\x01\x17\x00\xa8\xff\ +\xd7\x01\x17\x00\xa9\xff\xd7\x01\x17\x00\xaa\xff\xd7\x01\x17\x00\ +\xab\xff\xd7\x01\x17\x00\xac\xff\xd7\x01\x17\x00\xad\xff\xd7\x01\ +\x17\x00\xb4\xff\xd7\x01\x17\x00\xb5\xff\xd7\x01\x17\x00\xb6\xff\ +\xd7\x01\x17\x00\xb7\xff\xd7\x01\x17\x00\xb8\xff\xd7\x01\x17\x00\ +\xba\xff\xd7\x01\x17\x00\xc3\xff\xd7\x01\x17\x00\xc5\xff\xd7\x01\ +\x17\x00\xc7\xff\xd7\x01\x17\x00\xc9\xff\xd7\x01\x17\x00\xcb\xff\ +\xd7\x01\x17\x00\xcd\xff\xd7\x01\x17\x00\xcf\xff\xd7\x01\x17\x00\ +\xd1\xff\xd7\x01\x17\x00\xd3\xff\xd7\x01\x17\x00\xd5\xff\xd7\x01\ +\x17\x00\xd7\xff\xd7\x01\x17\x00\xd9\xff\xd7\x01\x17\x00\xdb\xff\ +\xd7\x01\x17\x00\xdd\xff\xd7\x01\x17\x00\xdf\xff\xec\x01\x17\x00\ +\xe1\xff\xec\x01\x17\x00\xe3\xff\xec\x01\x17\x00\xe5\xff\xec\x01\ +\x17\x01\x0f\xff\xd7\x01\x17\x01\x11\xff\xd7\x01\x17\x01\x13\xff\ +\xd7\x01\x17\x01\x15\xff\xd7\x01\x17\x01D\xff\xd7\x01\x17\x01\ +F\xff\xd7\x01\x17\x01H\xff\xd7\x01\x17\x02\x07\x00R\x01\ +\x17\x02\x0b\x00R\x01\x17\x02Y\xff\xd7\x01\x17\x02`\xff\ +\xd7\x01\x17\x03\x1e\xff\xd7\x01\x17\x03 \xff\xd7\x01\x17\x03\ +\x22\xff\xd7\x01\x17\x03&\xff\xd7\x01\x17\x03(\xff\xd7\x01\ +\x17\x03*\xff\xd7\x01\x17\x03,\xff\xd7\x01\x17\x03.\xff\ +\xd7\x01\x17\x030\xff\xd7\x01\x17\x032\xff\xd7\x01\x17\x03\ +4\xff\xd7\x01\x17\x036\xff\xd7\x01\x17\x038\xff\xd7\x01\ +\x17\x03:\xff\xd7\x01\x17\x03<\xff\xd7\x01\x17\x03@\xff\ +\xd7\x01\x17\x03B\xff\xd7\x01\x17\x03D\xff\xd7\x01\x17\x03\ +J\xff\xd7\x01\x17\x03L\xff\xd7\x01\x17\x03N\xff\xd7\x01\ +\x17\x03R\xff\xd7\x01\x17\x03T\xff\xd7\x01\x17\x03V\xff\ +\xd7\x01\x17\x03X\xff\xd7\x01\x17\x03Z\xff\xd7\x01\x17\x03\ +\x5c\xff\xd7\x01\x17\x03^\xff\xd7\x01\x17\x03`\xff\xd7\x01\ +\x19\x00\x05\x00R\x01\x19\x00\x0a\x00R\x01\x19\x00D\xff\ +\xd7\x01\x19\x00F\xff\xd7\x01\x19\x00G\xff\xd7\x01\x19\x00\ +H\xff\xd7\x01\x19\x00J\xff\xec\x01\x19\x00R\xff\xd7\x01\ +\x19\x00T\xff\xd7\x01\x19\x00\xa2\xff\xd7\x01\x19\x00\xa3\xff\ +\xd7\x01\x19\x00\xa4\xff\xd7\x01\x19\x00\xa5\xff\xd7\x01\x19\x00\ +\xa6\xff\xd7\x01\x19\x00\xa7\xff\xd7\x01\x19\x00\xa8\xff\xd7\x01\ +\x19\x00\xa9\xff\xd7\x01\x19\x00\xaa\xff\xd7\x01\x19\x00\xab\xff\ +\xd7\x01\x19\x00\xac\xff\xd7\x01\x19\x00\xad\xff\xd7\x01\x19\x00\ +\xb4\xff\xd7\x01\x19\x00\xb5\xff\xd7\x01\x19\x00\xb6\xff\xd7\x01\ +\x19\x00\xb7\xff\xd7\x01\x19\x00\xb8\xff\xd7\x01\x19\x00\xba\xff\ +\xd7\x01\x19\x00\xc3\xff\xd7\x01\x19\x00\xc5\xff\xd7\x01\x19\x00\ +\xc7\xff\xd7\x01\x19\x00\xc9\xff\xd7\x01\x19\x00\xcb\xff\xd7\x01\ +\x19\x00\xcd\xff\xd7\x01\x19\x00\xcf\xff\xd7\x01\x19\x00\xd1\xff\ +\xd7\x01\x19\x00\xd3\xff\xd7\x01\x19\x00\xd5\xff\xd7\x01\x19\x00\ +\xd7\xff\xd7\x01\x19\x00\xd9\xff\xd7\x01\x19\x00\xdb\xff\xd7\x01\ +\x19\x00\xdd\xff\xd7\x01\x19\x00\xdf\xff\xec\x01\x19\x00\xe1\xff\ +\xec\x01\x19\x00\xe3\xff\xec\x01\x19\x00\xe5\xff\xec\x01\x19\x01\ +\x0f\xff\xd7\x01\x19\x01\x11\xff\xd7\x01\x19\x01\x13\xff\xd7\x01\ +\x19\x01\x15\xff\xd7\x01\x19\x01D\xff\xd7\x01\x19\x01F\xff\ +\xd7\x01\x19\x01H\xff\xd7\x01\x19\x02\x07\x00R\x01\x19\x02\ +\x0b\x00R\x01\x19\x02Y\xff\xd7\x01\x19\x02`\xff\xd7\x01\ +\x19\x03\x1e\xff\xd7\x01\x19\x03 \xff\xd7\x01\x19\x03\x22\xff\ +\xd7\x01\x19\x03&\xff\xd7\x01\x19\x03(\xff\xd7\x01\x19\x03\ +*\xff\xd7\x01\x19\x03,\xff\xd7\x01\x19\x03.\xff\xd7\x01\ +\x19\x030\xff\xd7\x01\x19\x032\xff\xd7\x01\x19\x034\xff\ +\xd7\x01\x19\x036\xff\xd7\x01\x19\x038\xff\xd7\x01\x19\x03\ +:\xff\xd7\x01\x19\x03<\xff\xd7\x01\x19\x03@\xff\xd7\x01\ +\x19\x03B\xff\xd7\x01\x19\x03D\xff\xd7\x01\x19\x03J\xff\ +\xd7\x01\x19\x03L\xff\xd7\x01\x19\x03N\xff\xd7\x01\x19\x03\ +R\xff\xd7\x01\x19\x03T\xff\xd7\x01\x19\x03V\xff\xd7\x01\ +\x19\x03X\xff\xd7\x01\x19\x03Z\xff\xd7\x01\x19\x03\x5c\xff\ +\xd7\x01\x19\x03^\xff\xd7\x01\x19\x03`\xff\xd7\x01\x1b\x00\ +\x05\x00R\x01\x1b\x00\x0a\x00R\x01\x1b\x00D\xff\xd7\x01\ +\x1b\x00F\xff\xd7\x01\x1b\x00G\xff\xd7\x01\x1b\x00H\xff\ +\xd7\x01\x1b\x00J\xff\xec\x01\x1b\x00R\xff\xd7\x01\x1b\x00\ +T\xff\xd7\x01\x1b\x00\xa2\xff\xd7\x01\x1b\x00\xa3\xff\xd7\x01\ +\x1b\x00\xa4\xff\xd7\x01\x1b\x00\xa5\xff\xd7\x01\x1b\x00\xa6\xff\ +\xd7\x01\x1b\x00\xa7\xff\xd7\x01\x1b\x00\xa8\xff\xd7\x01\x1b\x00\ +\xa9\xff\xd7\x01\x1b\x00\xaa\xff\xd7\x01\x1b\x00\xab\xff\xd7\x01\ +\x1b\x00\xac\xff\xd7\x01\x1b\x00\xad\xff\xd7\x01\x1b\x00\xb4\xff\ +\xd7\x01\x1b\x00\xb5\xff\xd7\x01\x1b\x00\xb6\xff\xd7\x01\x1b\x00\ +\xb7\xff\xd7\x01\x1b\x00\xb8\xff\xd7\x01\x1b\x00\xba\xff\xd7\x01\ +\x1b\x00\xc3\xff\xd7\x01\x1b\x00\xc5\xff\xd7\x01\x1b\x00\xc7\xff\ +\xd7\x01\x1b\x00\xc9\xff\xd7\x01\x1b\x00\xcb\xff\xd7\x01\x1b\x00\ +\xcd\xff\xd7\x01\x1b\x00\xcf\xff\xd7\x01\x1b\x00\xd1\xff\xd7\x01\ +\x1b\x00\xd3\xff\xd7\x01\x1b\x00\xd5\xff\xd7\x01\x1b\x00\xd7\xff\ +\xd7\x01\x1b\x00\xd9\xff\xd7\x01\x1b\x00\xdb\xff\xd7\x01\x1b\x00\ +\xdd\xff\xd7\x01\x1b\x00\xdf\xff\xec\x01\x1b\x00\xe1\xff\xec\x01\ +\x1b\x00\xe3\xff\xec\x01\x1b\x00\xe5\xff\xec\x01\x1b\x01\x0f\xff\ +\xd7\x01\x1b\x01\x11\xff\xd7\x01\x1b\x01\x13\xff\xd7\x01\x1b\x01\ +\x15\xff\xd7\x01\x1b\x01D\xff\xd7\x01\x1b\x01F\xff\xd7\x01\ +\x1b\x01H\xff\xd7\x01\x1b\x02\x07\x00R\x01\x1b\x02\x0b\x00\ +R\x01\x1b\x02Y\xff\xd7\x01\x1b\x02`\xff\xd7\x01\x1b\x03\ +\x1e\xff\xd7\x01\x1b\x03 \xff\xd7\x01\x1b\x03\x22\xff\xd7\x01\ +\x1b\x03&\xff\xd7\x01\x1b\x03(\xff\xd7\x01\x1b\x03*\xff\ +\xd7\x01\x1b\x03,\xff\xd7\x01\x1b\x03.\xff\xd7\x01\x1b\x03\ +0\xff\xd7\x01\x1b\x032\xff\xd7\x01\x1b\x034\xff\xd7\x01\ +\x1b\x036\xff\xd7\x01\x1b\x038\xff\xd7\x01\x1b\x03:\xff\ +\xd7\x01\x1b\x03<\xff\xd7\x01\x1b\x03@\xff\xd7\x01\x1b\x03\ +B\xff\xd7\x01\x1b\x03D\xff\xd7\x01\x1b\x03J\xff\xd7\x01\ +\x1b\x03L\xff\xd7\x01\x1b\x03N\xff\xd7\x01\x1b\x03R\xff\ +\xd7\x01\x1b\x03T\xff\xd7\x01\x1b\x03V\xff\xd7\x01\x1b\x03\ +X\xff\xd7\x01\x1b\x03Z\xff\xd7\x01\x1b\x03\x5c\xff\xd7\x01\ +\x1b\x03^\xff\xd7\x01\x1b\x03`\xff\xd7\x01$\x00\x0f\xff\ +\x85\x01$\x00\x10\xff\xae\x01$\x00\x11\xff\x85\x01$\x00\ +\x22\x00)\x01$\x00$\xffq\x01$\x00&\xff\xd7\x01\ +$\x00*\xff\xd7\x01$\x002\xff\xd7\x01$\x004\xff\ +\xd7\x01$\x007\x00)\x01$\x00D\xff\x5c\x01$\x00\ +F\xffq\x01$\x00G\xffq\x01$\x00H\xffq\x01\ +$\x00J\xffq\x01$\x00P\xff\x9a\x01$\x00Q\xff\ +\x9a\x01$\x00R\xffq\x01$\x00S\xff\x9a\x01$\x00\ +T\xffq\x01$\x00U\xff\x9a\x01$\x00V\xff\x85\x01\ +$\x00X\xff\x9a\x01$\x00Y\xff\xd7\x01$\x00Z\xff\ +\xd7\x01$\x00[\xff\xd7\x01$\x00\x5c\xff\xd7\x01$\x00\ +]\xff\xae\x01$\x00\x82\xffq\x01$\x00\x83\xffq\x01\ +$\x00\x84\xffq\x01$\x00\x85\xffq\x01$\x00\x86\xff\ +q\x01$\x00\x87\xffq\x01$\x00\x89\xff\xd7\x01$\x00\ +\x94\xff\xd7\x01$\x00\x95\xff\xd7\x01$\x00\x96\xff\xd7\x01\ +$\x00\x97\xff\xd7\x01$\x00\x98\xff\xd7\x01$\x00\x9a\xff\ +\xd7\x01$\x00\xa2\xffq\x01$\x00\xa3\xff\x5c\x01$\x00\ +\xa4\xff\x5c\x01$\x00\xa5\xff\x5c\x01$\x00\xa6\xff\x5c\x01\ +$\x00\xa7\xff\x5c\x01$\x00\xa8\xff\x5c\x01$\x00\xa9\xff\ +q\x01$\x00\xaa\xffq\x01$\x00\xab\xffq\x01$\x00\ +\xac\xffq\x01$\x00\xad\xffq\x01$\x00\xb4\xffq\x01\ +$\x00\xb5\xffq\x01$\x00\xb6\xffq\x01$\x00\xb7\xff\ +q\x01$\x00\xb8\xffq\x01$\x00\xba\xffq\x01$\x00\ +\xbb\xff\x9a\x01$\x00\xbc\xff\x9a\x01$\x00\xbd\xff\x9a\x01\ +$\x00\xbe\xff\x9a\x01$\x00\xbf\xff\xd7\x01$\x00\xc2\xff\ +q\x01$\x00\xc3\xff\x5c\x01$\x00\xc4\xffq\x01$\x00\ +\xc5\xff\x5c\x01$\x00\xc6\xffq\x01$\x00\xc7\xff\x5c\x01\ +$\x00\xc8\xff\xd7\x01$\x00\xc9\xffq\x01$\x00\xca\xff\ +\xd7\x01$\x00\xcb\xffq\x01$\x00\xcc\xff\xd7\x01$\x00\ +\xcd\xffq\x01$\x00\xce\xff\xd7\x01$\x00\xcf\xffq\x01\ +$\x00\xd1\xffq\x01$\x00\xd3\xffq\x01$\x00\xd5\xff\ +q\x01$\x00\xd7\xffq\x01$\x00\xd9\xffq\x01$\x00\ +\xdb\xffq\x01$\x00\xdd\xffq\x01$\x00\xde\xff\xd7\x01\ +$\x00\xdf\xffq\x01$\x00\xe0\xff\xd7\x01$\x00\xe1\xff\ +q\x01$\x00\xe2\xff\xd7\x01$\x00\xe3\xffq\x01$\x00\ +\xe4\xff\xd7\x01$\x00\xe5\xffq\x01$\x00\xfa\xff\x9a\x01\ +$\x01\x06\xff\x9a\x01$\x01\x08\xff\x9a\x01$\x01\x0d\xff\ +\x9a\x01$\x01\x0e\xff\xd7\x01$\x01\x0f\xffq\x01$\x01\ +\x10\xff\xd7\x01$\x01\x11\xffq\x01$\x01\x12\xff\xd7\x01\ +$\x01\x13\xffq\x01$\x01\x14\xff\xd7\x01$\x01\x15\xff\ +q\x01$\x01\x17\xff\x9a\x01$\x01\x19\xff\x9a\x01$\x01\ +\x1d\xff\x85\x01$\x01!\xff\x85\x01$\x01$\x00)\x01\ +$\x01&\x00)\x01$\x01+\xff\x9a\x01$\x01-\xff\ +\x9a\x01$\x01/\xff\x9a\x01$\x011\xff\x9a\x01$\x01\ +3\xff\x9a\x01$\x015\xff\x9a\x01$\x017\xff\xd7\x01\ +$\x01<\xff\xae\x01$\x01>\xff\xae\x01$\x01@\xff\ +\xae\x01$\x01C\xffq\x01$\x01D\xff\x5c\x01$\x01\ +F\xff\x5c\x01$\x01G\xff\xd7\x01$\x01H\xffq\x01\ +$\x01J\xff\x85\x01$\x01\xfb\xff\xd7\x01$\x01\xfd\xff\ +\xd7\x01$\x02\x02\xff\xae\x01$\x02\x03\xff\xae\x01$\x02\ +\x04\xff\xae\x01$\x02\x08\xff\x85\x01$\x02\x0c\xff\x85\x01\ +$\x02W\xff\x9a\x01$\x02X\xffq\x01$\x02Y\xff\ +\x5c\x01$\x02_\xff\xd7\x01$\x02`\xffq\x01$\x02\ +b\xff\x9a\x01$\x03\x1d\xffq\x01$\x03\x1e\xff\x5c\x01\ +$\x03\x1f\xffq\x01$\x03 \xff\x5c\x01$\x03!\xff\ +q\x01$\x03\x22\xff\x5c\x01$\x03#\xffq\x01$\x03\ +%\xffq\x01$\x03&\xff\x5c\x01$\x03'\xffq\x01\ +$\x03(\xff\x5c\x01$\x03)\xffq\x01$\x03*\xff\ +\x5c\x01$\x03+\xffq\x01$\x03,\xff\x5c\x01$\x03\ +-\xffq\x01$\x03.\xff\x5c\x01$\x03/\xffq\x01\ +$\x030\xff\x5c\x01$\x031\xffq\x01$\x032\xff\ +\x5c\x01$\x033\xffq\x01$\x034\xff\x5c\x01$\x03\ +6\xffq\x01$\x038\xffq\x01$\x03:\xffq\x01\ +$\x03<\xffq\x01$\x03@\xffq\x01$\x03B\xff\ +q\x01$\x03D\xffq\x01$\x03I\xff\xd7\x01$\x03\ +J\xffq\x01$\x03K\xff\xd7\x01$\x03L\xffq\x01\ +$\x03M\xff\xd7\x01$\x03N\xffq\x01$\x03O\xff\ +\xd7\x01$\x03Q\xff\xd7\x01$\x03R\xffq\x01$\x03\ +S\xff\xd7\x01$\x03T\xffq\x01$\x03U\xff\xd7\x01\ +$\x03V\xffq\x01$\x03W\xff\xd7\x01$\x03X\xff\ +q\x01$\x03Y\xff\xd7\x01$\x03Z\xffq\x01$\x03\ +[\xff\xd7\x01$\x03\x5c\xffq\x01$\x03]\xff\xd7\x01\ +$\x03^\xffq\x01$\x03_\xff\xd7\x01$\x03`\xff\ +q\x01$\x03b\xff\x9a\x01$\x03d\xff\x9a\x01$\x03\ +f\xff\x9a\x01$\x03h\xff\x9a\x01$\x03j\xff\x9a\x01\ +$\x03l\xff\x9a\x01$\x03n\xff\x9a\x01$\x03p\xff\ +\xd7\x01$\x03\x8f\x00)\x01%\x00\x05\x00)\x01%\x00\ +\x0a\x00)\x01%\x02\x07\x00)\x01%\x02\x0b\x00)\x01\ +&\x00\x0f\xff\x85\x01&\x00\x10\xff\xae\x01&\x00\x11\xff\ +\x85\x01&\x00\x22\x00)\x01&\x00$\xffq\x01&\x00\ +&\xff\xd7\x01&\x00*\xff\xd7\x01&\x002\xff\xd7\x01\ +&\x004\xff\xd7\x01&\x007\x00)\x01&\x00D\xff\ +\x5c\x01&\x00F\xffq\x01&\x00G\xffq\x01&\x00\ +H\xffq\x01&\x00J\xffq\x01&\x00P\xff\x9a\x01\ +&\x00Q\xff\x9a\x01&\x00R\xffq\x01&\x00S\xff\ +\x9a\x01&\x00T\xffq\x01&\x00U\xff\x9a\x01&\x00\ +V\xff\x85\x01&\x00X\xff\x9a\x01&\x00Y\xff\xd7\x01\ +&\x00Z\xff\xd7\x01&\x00[\xff\xd7\x01&\x00\x5c\xff\ +\xd7\x01&\x00]\xff\xae\x01&\x00\x82\xffq\x01&\x00\ +\x83\xffq\x01&\x00\x84\xffq\x01&\x00\x85\xffq\x01\ +&\x00\x86\xffq\x01&\x00\x87\xffq\x01&\x00\x89\xff\ +\xd7\x01&\x00\x94\xff\xd7\x01&\x00\x95\xff\xd7\x01&\x00\ +\x96\xff\xd7\x01&\x00\x97\xff\xd7\x01&\x00\x98\xff\xd7\x01\ +&\x00\x9a\xff\xd7\x01&\x00\xa2\xffq\x01&\x00\xa3\xff\ +\x5c\x01&\x00\xa4\xff\x5c\x01&\x00\xa5\xff\x5c\x01&\x00\ +\xa6\xff\x5c\x01&\x00\xa7\xff\x5c\x01&\x00\xa8\xff\x5c\x01\ +&\x00\xa9\xffq\x01&\x00\xaa\xffq\x01&\x00\xab\xff\ +q\x01&\x00\xac\xffq\x01&\x00\xad\xffq\x01&\x00\ +\xb4\xffq\x01&\x00\xb5\xffq\x01&\x00\xb6\xffq\x01\ +&\x00\xb7\xffq\x01&\x00\xb8\xffq\x01&\x00\xba\xff\ +q\x01&\x00\xbb\xff\x9a\x01&\x00\xbc\xff\x9a\x01&\x00\ +\xbd\xff\x9a\x01&\x00\xbe\xff\x9a\x01&\x00\xbf\xff\xd7\x01\ +&\x00\xc2\xffq\x01&\x00\xc3\xff\x5c\x01&\x00\xc4\xff\ +q\x01&\x00\xc5\xff\x5c\x01&\x00\xc6\xffq\x01&\x00\ +\xc7\xff\x5c\x01&\x00\xc8\xff\xd7\x01&\x00\xc9\xffq\x01\ +&\x00\xca\xff\xd7\x01&\x00\xcb\xffq\x01&\x00\xcc\xff\ +\xd7\x01&\x00\xcd\xffq\x01&\x00\xce\xff\xd7\x01&\x00\ +\xcf\xffq\x01&\x00\xd1\xffq\x01&\x00\xd3\xffq\x01\ +&\x00\xd5\xffq\x01&\x00\xd7\xffq\x01&\x00\xd9\xff\ +q\x01&\x00\xdb\xffq\x01&\x00\xdd\xffq\x01&\x00\ +\xde\xff\xd7\x01&\x00\xdf\xffq\x01&\x00\xe0\xff\xd7\x01\ +&\x00\xe1\xffq\x01&\x00\xe2\xff\xd7\x01&\x00\xe3\xff\ +q\x01&\x00\xe4\xff\xd7\x01&\x00\xe5\xffq\x01&\x00\ +\xfa\xff\x9a\x01&\x01\x06\xff\x9a\x01&\x01\x08\xff\x9a\x01\ +&\x01\x0d\xff\x9a\x01&\x01\x0e\xff\xd7\x01&\x01\x0f\xff\ +q\x01&\x01\x10\xff\xd7\x01&\x01\x11\xffq\x01&\x01\ +\x12\xff\xd7\x01&\x01\x13\xffq\x01&\x01\x14\xff\xd7\x01\ +&\x01\x15\xffq\x01&\x01\x17\xff\x9a\x01&\x01\x19\xff\ +\x9a\x01&\x01\x1d\xff\x85\x01&\x01!\xff\x85\x01&\x01\ +$\x00)\x01&\x01&\x00)\x01&\x01+\xff\x9a\x01\ +&\x01-\xff\x9a\x01&\x01/\xff\x9a\x01&\x011\xff\ +\x9a\x01&\x013\xff\x9a\x01&\x015\xff\x9a\x01&\x01\ +7\xff\xd7\x01&\x01<\xff\xae\x01&\x01>\xff\xae\x01\ +&\x01@\xff\xae\x01&\x01C\xffq\x01&\x01D\xff\ +\x5c\x01&\x01F\xff\x5c\x01&\x01G\xff\xd7\x01&\x01\ +H\xffq\x01&\x01J\xff\x85\x01&\x01\xfb\xff\xd7\x01\ +&\x01\xfd\xff\xd7\x01&\x02\x02\xff\xae\x01&\x02\x03\xff\ +\xae\x01&\x02\x04\xff\xae\x01&\x02\x08\xff\x85\x01&\x02\ +\x0c\xff\x85\x01&\x02W\xff\x9a\x01&\x02X\xffq\x01\ +&\x02Y\xff\x5c\x01&\x02_\xff\xd7\x01&\x02`\xff\ +q\x01&\x02b\xff\x9a\x01&\x03\x1d\xffq\x01&\x03\ +\x1e\xff\x5c\x01&\x03\x1f\xffq\x01&\x03 \xff\x5c\x01\ +&\x03!\xffq\x01&\x03\x22\xff\x5c\x01&\x03#\xff\ +q\x01&\x03%\xffq\x01&\x03&\xff\x5c\x01&\x03\ +'\xffq\x01&\x03(\xff\x5c\x01&\x03)\xffq\x01\ +&\x03*\xff\x5c\x01&\x03+\xffq\x01&\x03,\xff\ +\x5c\x01&\x03-\xffq\x01&\x03.\xff\x5c\x01&\x03\ +/\xffq\x01&\x030\xff\x5c\x01&\x031\xffq\x01\ +&\x032\xff\x5c\x01&\x033\xffq\x01&\x034\xff\ +\x5c\x01&\x036\xffq\x01&\x038\xffq\x01&\x03\ +:\xffq\x01&\x03<\xffq\x01&\x03@\xffq\x01\ +&\x03B\xffq\x01&\x03D\xffq\x01&\x03I\xff\ +\xd7\x01&\x03J\xffq\x01&\x03K\xff\xd7\x01&\x03\ +L\xffq\x01&\x03M\xff\xd7\x01&\x03N\xffq\x01\ +&\x03O\xff\xd7\x01&\x03Q\xff\xd7\x01&\x03R\xff\ +q\x01&\x03S\xff\xd7\x01&\x03T\xffq\x01&\x03\ +U\xff\xd7\x01&\x03V\xffq\x01&\x03W\xff\xd7\x01\ +&\x03X\xffq\x01&\x03Y\xff\xd7\x01&\x03Z\xff\ +q\x01&\x03[\xff\xd7\x01&\x03\x5c\xffq\x01&\x03\ +]\xff\xd7\x01&\x03^\xffq\x01&\x03_\xff\xd7\x01\ +&\x03`\xffq\x01&\x03b\xff\x9a\x01&\x03d\xff\ +\x9a\x01&\x03f\xff\x9a\x01&\x03h\xff\x9a\x01&\x03\ +j\xff\x9a\x01&\x03l\xff\x9a\x01&\x03n\xff\x9a\x01\ +&\x03p\xff\xd7\x01&\x03\x8f\x00)\x01'\x00\x05\x00\ +)\x01'\x00\x0a\x00)\x01'\x02\x07\x00)\x01'\x02\ +\x0b\x00)\x01(\x00\x0f\xff\x85\x01(\x00\x10\xff\xae\x01\ +(\x00\x11\xff\x85\x01(\x00\x22\x00)\x01(\x00$\xff\ +q\x01(\x00&\xff\xd7\x01(\x00*\xff\xd7\x01(\x00\ +2\xff\xd7\x01(\x004\xff\xd7\x01(\x007\x00)\x01\ +(\x00D\xff\x5c\x01(\x00F\xffq\x01(\x00G\xff\ +q\x01(\x00H\xffq\x01(\x00J\xffq\x01(\x00\ +P\xff\x9a\x01(\x00Q\xff\x9a\x01(\x00R\xffq\x01\ +(\x00S\xff\x9a\x01(\x00T\xffq\x01(\x00U\xff\ +\x9a\x01(\x00V\xff\x85\x01(\x00X\xff\x9a\x01(\x00\ +Y\xff\xd7\x01(\x00Z\xff\xd7\x01(\x00[\xff\xd7\x01\ +(\x00\x5c\xff\xd7\x01(\x00]\xff\xae\x01(\x00\x82\xff\ +q\x01(\x00\x83\xffq\x01(\x00\x84\xffq\x01(\x00\ +\x85\xffq\x01(\x00\x86\xffq\x01(\x00\x87\xffq\x01\ +(\x00\x89\xff\xd7\x01(\x00\x94\xff\xd7\x01(\x00\x95\xff\ +\xd7\x01(\x00\x96\xff\xd7\x01(\x00\x97\xff\xd7\x01(\x00\ +\x98\xff\xd7\x01(\x00\x9a\xff\xd7\x01(\x00\xa2\xffq\x01\ +(\x00\xa3\xff\x5c\x01(\x00\xa4\xff\x5c\x01(\x00\xa5\xff\ +\x5c\x01(\x00\xa6\xff\x5c\x01(\x00\xa7\xff\x5c\x01(\x00\ +\xa8\xff\x5c\x01(\x00\xa9\xffq\x01(\x00\xaa\xffq\x01\ +(\x00\xab\xffq\x01(\x00\xac\xffq\x01(\x00\xad\xff\ +q\x01(\x00\xb4\xffq\x01(\x00\xb5\xffq\x01(\x00\ +\xb6\xffq\x01(\x00\xb7\xffq\x01(\x00\xb8\xffq\x01\ +(\x00\xba\xffq\x01(\x00\xbb\xff\x9a\x01(\x00\xbc\xff\ +\x9a\x01(\x00\xbd\xff\x9a\x01(\x00\xbe\xff\x9a\x01(\x00\ +\xbf\xff\xd7\x01(\x00\xc2\xffq\x01(\x00\xc3\xff\x5c\x01\ +(\x00\xc4\xffq\x01(\x00\xc5\xff\x5c\x01(\x00\xc6\xff\ +q\x01(\x00\xc7\xff\x5c\x01(\x00\xc8\xff\xd7\x01(\x00\ +\xc9\xffq\x01(\x00\xca\xff\xd7\x01(\x00\xcb\xffq\x01\ +(\x00\xcc\xff\xd7\x01(\x00\xcd\xffq\x01(\x00\xce\xff\ +\xd7\x01(\x00\xcf\xffq\x01(\x00\xd1\xffq\x01(\x00\ +\xd3\xffq\x01(\x00\xd5\xffq\x01(\x00\xd7\xffq\x01\ +(\x00\xd9\xffq\x01(\x00\xdb\xffq\x01(\x00\xdd\xff\ +q\x01(\x00\xde\xff\xd7\x01(\x00\xdf\xffq\x01(\x00\ +\xe0\xff\xd7\x01(\x00\xe1\xffq\x01(\x00\xe2\xff\xd7\x01\ +(\x00\xe3\xffq\x01(\x00\xe4\xff\xd7\x01(\x00\xe5\xff\ +q\x01(\x00\xfa\xff\x9a\x01(\x01\x06\xff\x9a\x01(\x01\ +\x08\xff\x9a\x01(\x01\x0d\xff\x9a\x01(\x01\x0e\xff\xd7\x01\ +(\x01\x0f\xffq\x01(\x01\x10\xff\xd7\x01(\x01\x11\xff\ +q\x01(\x01\x12\xff\xd7\x01(\x01\x13\xffq\x01(\x01\ +\x14\xff\xd7\x01(\x01\x15\xffq\x01(\x01\x17\xff\x9a\x01\ +(\x01\x19\xff\x9a\x01(\x01\x1d\xff\x85\x01(\x01!\xff\ +\x85\x01(\x01$\x00)\x01(\x01&\x00)\x01(\x01\ ++\xff\x9a\x01(\x01-\xff\x9a\x01(\x01/\xff\x9a\x01\ +(\x011\xff\x9a\x01(\x013\xff\x9a\x01(\x015\xff\ +\x9a\x01(\x017\xff\xd7\x01(\x01<\xff\xae\x01(\x01\ +>\xff\xae\x01(\x01@\xff\xae\x01(\x01C\xffq\x01\ +(\x01D\xff\x5c\x01(\x01F\xff\x5c\x01(\x01G\xff\ +\xd7\x01(\x01H\xffq\x01(\x01J\xff\x85\x01(\x01\ +\xfb\xff\xd7\x01(\x01\xfd\xff\xd7\x01(\x02\x02\xff\xae\x01\ +(\x02\x03\xff\xae\x01(\x02\x04\xff\xae\x01(\x02\x08\xff\ +\x85\x01(\x02\x0c\xff\x85\x01(\x02W\xff\x9a\x01(\x02\ +X\xffq\x01(\x02Y\xff\x5c\x01(\x02_\xff\xd7\x01\ +(\x02`\xffq\x01(\x02b\xff\x9a\x01(\x03\x1d\xff\ +q\x01(\x03\x1e\xff\x5c\x01(\x03\x1f\xffq\x01(\x03\ + \xff\x5c\x01(\x03!\xffq\x01(\x03\x22\xff\x5c\x01\ +(\x03#\xffq\x01(\x03%\xffq\x01(\x03&\xff\ +\x5c\x01(\x03'\xffq\x01(\x03(\xff\x5c\x01(\x03\ +)\xffq\x01(\x03*\xff\x5c\x01(\x03+\xffq\x01\ +(\x03,\xff\x5c\x01(\x03-\xffq\x01(\x03.\xff\ +\x5c\x01(\x03/\xffq\x01(\x030\xff\x5c\x01(\x03\ +1\xffq\x01(\x032\xff\x5c\x01(\x033\xffq\x01\ +(\x034\xff\x5c\x01(\x036\xffq\x01(\x038\xff\ +q\x01(\x03:\xffq\x01(\x03<\xffq\x01(\x03\ +@\xffq\x01(\x03B\xffq\x01(\x03D\xffq\x01\ +(\x03I\xff\xd7\x01(\x03J\xffq\x01(\x03K\xff\ +\xd7\x01(\x03L\xffq\x01(\x03M\xff\xd7\x01(\x03\ +N\xffq\x01(\x03O\xff\xd7\x01(\x03Q\xff\xd7\x01\ +(\x03R\xffq\x01(\x03S\xff\xd7\x01(\x03T\xff\ +q\x01(\x03U\xff\xd7\x01(\x03V\xffq\x01(\x03\ +W\xff\xd7\x01(\x03X\xffq\x01(\x03Y\xff\xd7\x01\ +(\x03Z\xffq\x01(\x03[\xff\xd7\x01(\x03\x5c\xff\ +q\x01(\x03]\xff\xd7\x01(\x03^\xffq\x01(\x03\ +_\xff\xd7\x01(\x03`\xffq\x01(\x03b\xff\x9a\x01\ +(\x03d\xff\x9a\x01(\x03f\xff\x9a\x01(\x03h\xff\ +\x9a\x01(\x03j\xff\x9a\x01(\x03l\xff\x9a\x01(\x03\ +n\xff\x9a\x01(\x03p\xff\xd7\x01(\x03\x8f\x00)\x01\ +*\x00\x0f\xff\xd7\x01*\x00\x11\xff\xd7\x01*\x00$\xff\ +\xec\x01*\x00\x82\xff\xec\x01*\x00\x83\xff\xec\x01*\x00\ +\x84\xff\xec\x01*\x00\x85\xff\xec\x01*\x00\x86\xff\xec\x01\ +*\x00\x87\xff\xec\x01*\x00\xc2\xff\xec\x01*\x00\xc4\xff\ +\xec\x01*\x00\xc6\xff\xec\x01*\x01C\xff\xec\x01*\x02\ +\x08\xff\xd7\x01*\x02\x0c\xff\xd7\x01*\x02X\xff\xec\x01\ +*\x03\x1d\xff\xec\x01*\x03\x1f\xff\xec\x01*\x03!\xff\ +\xec\x01*\x03#\xff\xec\x01*\x03%\xff\xec\x01*\x03\ +'\xff\xec\x01*\x03)\xff\xec\x01*\x03+\xff\xec\x01\ +*\x03-\xff\xec\x01*\x03/\xff\xec\x01*\x031\xff\ +\xec\x01*\x033\xff\xec\x01,\x00\x0f\xff\xd7\x01,\x00\ +\x11\xff\xd7\x01,\x00$\xff\xec\x01,\x00\x82\xff\xec\x01\ +,\x00\x83\xff\xec\x01,\x00\x84\xff\xec\x01,\x00\x85\xff\ +\xec\x01,\x00\x86\xff\xec\x01,\x00\x87\xff\xec\x01,\x00\ +\xc2\xff\xec\x01,\x00\xc4\xff\xec\x01,\x00\xc6\xff\xec\x01\ +,\x01C\xff\xec\x01,\x02\x08\xff\xd7\x01,\x02\x0c\xff\ +\xd7\x01,\x02X\xff\xec\x01,\x03\x1d\xff\xec\x01,\x03\ +\x1f\xff\xec\x01,\x03!\xff\xec\x01,\x03#\xff\xec\x01\ +,\x03%\xff\xec\x01,\x03'\xff\xec\x01,\x03)\xff\ +\xec\x01,\x03+\xff\xec\x01,\x03-\xff\xec\x01,\x03\ +/\xff\xec\x01,\x031\xff\xec\x01,\x033\xff\xec\x01\ +.\x00\x0f\xff\xd7\x01.\x00\x11\xff\xd7\x01.\x00$\xff\ +\xec\x01.\x00\x82\xff\xec\x01.\x00\x83\xff\xec\x01.\x00\ +\x84\xff\xec\x01.\x00\x85\xff\xec\x01.\x00\x86\xff\xec\x01\ +.\x00\x87\xff\xec\x01.\x00\xc2\xff\xec\x01.\x00\xc4\xff\ +\xec\x01.\x00\xc6\xff\xec\x01.\x01C\xff\xec\x01.\x02\ +\x08\xff\xd7\x01.\x02\x0c\xff\xd7\x01.\x02X\xff\xec\x01\ +.\x03\x1d\xff\xec\x01.\x03\x1f\xff\xec\x01.\x03!\xff\ +\xec\x01.\x03#\xff\xec\x01.\x03%\xff\xec\x01.\x03\ +'\xff\xec\x01.\x03)\xff\xec\x01.\x03+\xff\xec\x01\ +.\x03-\xff\xec\x01.\x03/\xff\xec\x01.\x031\xff\ +\xec\x01.\x033\xff\xec\x010\x00\x0f\xff\xd7\x010\x00\ +\x11\xff\xd7\x010\x00$\xff\xec\x010\x00\x82\xff\xec\x01\ +0\x00\x83\xff\xec\x010\x00\x84\xff\xec\x010\x00\x85\xff\ +\xec\x010\x00\x86\xff\xec\x010\x00\x87\xff\xec\x010\x00\ +\xc2\xff\xec\x010\x00\xc4\xff\xec\x010\x00\xc6\xff\xec\x01\ +0\x01C\xff\xec\x010\x02\x08\xff\xd7\x010\x02\x0c\xff\ +\xd7\x010\x02X\xff\xec\x010\x03\x1d\xff\xec\x010\x03\ +\x1f\xff\xec\x010\x03!\xff\xec\x010\x03#\xff\xec\x01\ +0\x03%\xff\xec\x010\x03'\xff\xec\x010\x03)\xff\ +\xec\x010\x03+\xff\xec\x010\x03-\xff\xec\x010\x03\ +/\xff\xec\x010\x031\xff\xec\x010\x033\xff\xec\x01\ +2\x00\x0f\xff\xd7\x012\x00\x11\xff\xd7\x012\x00$\xff\ +\xec\x012\x00\x82\xff\xec\x012\x00\x83\xff\xec\x012\x00\ +\x84\xff\xec\x012\x00\x85\xff\xec\x012\x00\x86\xff\xec\x01\ +2\x00\x87\xff\xec\x012\x00\xc2\xff\xec\x012\x00\xc4\xff\ +\xec\x012\x00\xc6\xff\xec\x012\x01C\xff\xec\x012\x02\ +\x08\xff\xd7\x012\x02\x0c\xff\xd7\x012\x02X\xff\xec\x01\ +2\x03\x1d\xff\xec\x012\x03\x1f\xff\xec\x012\x03!\xff\ +\xec\x012\x03#\xff\xec\x012\x03%\xff\xec\x012\x03\ +'\xff\xec\x012\x03)\xff\xec\x012\x03+\xff\xec\x01\ +2\x03-\xff\xec\x012\x03/\xff\xec\x012\x031\xff\ +\xec\x012\x033\xff\xec\x014\x00\x0f\xff\xd7\x014\x00\ +\x11\xff\xd7\x014\x00$\xff\xec\x014\x00\x82\xff\xec\x01\ +4\x00\x83\xff\xec\x014\x00\x84\xff\xec\x014\x00\x85\xff\ +\xec\x014\x00\x86\xff\xec\x014\x00\x87\xff\xec\x014\x00\ +\xc2\xff\xec\x014\x00\xc4\xff\xec\x014\x00\xc6\xff\xec\x01\ +4\x01C\xff\xec\x014\x02\x08\xff\xd7\x014\x02\x0c\xff\ +\xd7\x014\x02X\xff\xec\x014\x03\x1d\xff\xec\x014\x03\ +\x1f\xff\xec\x014\x03!\xff\xec\x014\x03#\xff\xec\x01\ +4\x03%\xff\xec\x014\x03'\xff\xec\x014\x03)\xff\ +\xec\x014\x03+\xff\xec\x014\x03-\xff\xec\x014\x03\ +/\xff\xec\x014\x031\xff\xec\x014\x033\xff\xec\x01\ +6\x00\x0f\xff\x9a\x016\x00\x11\xff\x9a\x016\x00\x22\x00\ +)\x016\x00$\xff\xae\x016\x00&\xff\xec\x016\x00\ +*\xff\xec\x016\x002\xff\xec\x016\x004\xff\xec\x01\ +6\x00D\xff\xd7\x016\x00F\xff\xd7\x016\x00G\xff\ +\xd7\x016\x00H\xff\xd7\x016\x00J\xff\xec\x016\x00\ +P\xff\xec\x016\x00Q\xff\xec\x016\x00R\xff\xd7\x01\ +6\x00S\xff\xec\x016\x00T\xff\xd7\x016\x00U\xff\ +\xec\x016\x00V\xff\xec\x016\x00X\xff\xec\x016\x00\ +\x82\xff\xae\x016\x00\x83\xff\xae\x016\x00\x84\xff\xae\x01\ +6\x00\x85\xff\xae\x016\x00\x86\xff\xae\x016\x00\x87\xff\ +\xae\x016\x00\x89\xff\xec\x016\x00\x94\xff\xec\x016\x00\ +\x95\xff\xec\x016\x00\x96\xff\xec\x016\x00\x97\xff\xec\x01\ +6\x00\x98\xff\xec\x016\x00\x9a\xff\xec\x016\x00\xa2\xff\ +\xd7\x016\x00\xa3\xff\xd7\x016\x00\xa4\xff\xd7\x016\x00\ +\xa5\xff\xd7\x016\x00\xa6\xff\xd7\x016\x00\xa7\xff\xd7\x01\ +6\x00\xa8\xff\xd7\x016\x00\xa9\xff\xd7\x016\x00\xaa\xff\ +\xd7\x016\x00\xab\xff\xd7\x016\x00\xac\xff\xd7\x016\x00\ +\xad\xff\xd7\x016\x00\xb4\xff\xd7\x016\x00\xb5\xff\xd7\x01\ +6\x00\xb6\xff\xd7\x016\x00\xb7\xff\xd7\x016\x00\xb8\xff\ +\xd7\x016\x00\xba\xff\xd7\x016\x00\xbb\xff\xec\x016\x00\ +\xbc\xff\xec\x016\x00\xbd\xff\xec\x016\x00\xbe\xff\xec\x01\ +6\x00\xc2\xff\xae\x016\x00\xc3\xff\xd7\x016\x00\xc4\xff\ +\xae\x016\x00\xc5\xff\xd7\x016\x00\xc6\xff\xae\x016\x00\ +\xc7\xff\xd7\x016\x00\xc8\xff\xec\x016\x00\xc9\xff\xd7\x01\ +6\x00\xca\xff\xec\x016\x00\xcb\xff\xd7\x016\x00\xcc\xff\ +\xec\x016\x00\xcd\xff\xd7\x016\x00\xce\xff\xec\x016\x00\ +\xcf\xff\xd7\x016\x00\xd1\xff\xd7\x016\x00\xd3\xff\xd7\x01\ +6\x00\xd5\xff\xd7\x016\x00\xd7\xff\xd7\x016\x00\xd9\xff\ +\xd7\x016\x00\xdb\xff\xd7\x016\x00\xdd\xff\xd7\x016\x00\ +\xde\xff\xec\x016\x00\xdf\xff\xec\x016\x00\xe0\xff\xec\x01\ +6\x00\xe1\xff\xec\x016\x00\xe2\xff\xec\x016\x00\xe3\xff\ +\xec\x016\x00\xe4\xff\xec\x016\x00\xe5\xff\xec\x016\x00\ +\xfa\xff\xec\x016\x01\x06\xff\xec\x016\x01\x08\xff\xec\x01\ +6\x01\x0d\xff\xec\x016\x01\x0e\xff\xec\x016\x01\x0f\xff\ +\xd7\x016\x01\x10\xff\xec\x016\x01\x11\xff\xd7\x016\x01\ +\x12\xff\xec\x016\x01\x13\xff\xd7\x016\x01\x14\xff\xec\x01\ +6\x01\x15\xff\xd7\x016\x01\x17\xff\xec\x016\x01\x19\xff\ +\xec\x016\x01\x1d\xff\xec\x016\x01!\xff\xec\x016\x01\ ++\xff\xec\x016\x01-\xff\xec\x016\x01/\xff\xec\x01\ +6\x011\xff\xec\x016\x013\xff\xec\x016\x015\xff\ +\xec\x016\x01C\xff\xae\x016\x01D\xff\xd7\x016\x01\ +F\xff\xd7\x016\x01G\xff\xec\x016\x01H\xff\xd7\x01\ +6\x01J\xff\xec\x016\x02\x08\xff\x9a\x016\x02\x0c\xff\ +\x9a\x016\x02W\xff\xec\x016\x02X\xff\xae\x016\x02\ +Y\xff\xd7\x016\x02_\xff\xec\x016\x02`\xff\xd7\x01\ +6\x02b\xff\xec\x016\x03\x1d\xff\xae\x016\x03\x1e\xff\ +\xd7\x016\x03\x1f\xff\xae\x016\x03 \xff\xd7\x016\x03\ +!\xff\xae\x016\x03\x22\xff\xd7\x016\x03#\xff\xae\x01\ +6\x03%\xff\xae\x016\x03&\xff\xd7\x016\x03'\xff\ +\xae\x016\x03(\xff\xd7\x016\x03)\xff\xae\x016\x03\ +*\xff\xd7\x016\x03+\xff\xae\x016\x03,\xff\xd7\x01\ +6\x03-\xff\xae\x016\x03.\xff\xd7\x016\x03/\xff\ +\xae\x016\x030\xff\xd7\x016\x031\xff\xae\x016\x03\ +2\xff\xd7\x016\x033\xff\xae\x016\x034\xff\xd7\x01\ +6\x036\xff\xd7\x016\x038\xff\xd7\x016\x03:\xff\ +\xd7\x016\x03<\xff\xd7\x016\x03@\xff\xd7\x016\x03\ +B\xff\xd7\x016\x03D\xff\xd7\x016\x03I\xff\xec\x01\ +6\x03J\xff\xd7\x016\x03K\xff\xec\x016\x03L\xff\ +\xd7\x016\x03M\xff\xec\x016\x03N\xff\xd7\x016\x03\ +O\xff\xec\x016\x03Q\xff\xec\x016\x03R\xff\xd7\x01\ +6\x03S\xff\xec\x016\x03T\xff\xd7\x016\x03U\xff\ +\xec\x016\x03V\xff\xd7\x016\x03W\xff\xec\x016\x03\ +X\xff\xd7\x016\x03Y\xff\xec\x016\x03Z\xff\xd7\x01\ +6\x03[\xff\xec\x016\x03\x5c\xff\xd7\x016\x03]\xff\ +\xec\x016\x03^\xff\xd7\x016\x03_\xff\xec\x016\x03\ +`\xff\xd7\x016\x03b\xff\xec\x016\x03d\xff\xec\x01\ +6\x03f\xff\xec\x016\x03h\xff\xec\x016\x03j\xff\ +\xec\x016\x03l\xff\xec\x016\x03n\xff\xec\x017\x00\ +\x05\x00R\x017\x00\x0a\x00R\x017\x00\x0f\xff\xae\x01\ +7\x00\x11\xff\xae\x017\x00\x22\x00)\x017\x02\x07\x00\ +R\x017\x02\x08\xff\xae\x017\x02\x0b\x00R\x017\x02\ +\x0c\xff\xae\x018\x00\x0f\xff\x85\x018\x00\x11\xff\x85\x01\ +8\x00\x22\x00)\x018\x00$\xff\x85\x018\x00&\xff\ +\xd7\x018\x00*\xff\xd7\x018\x002\xff\xd7\x018\x00\ +4\xff\xd7\x018\x00D\xff\x9a\x018\x00F\xff\x9a\x01\ +8\x00G\xff\x9a\x018\x00H\xff\x9a\x018\x00J\xff\ +\xd7\x018\x00P\xff\xc3\x018\x00Q\xff\xc3\x018\x00\ +R\xff\x9a\x018\x00S\xff\xc3\x018\x00T\xff\x9a\x01\ +8\x00U\xff\xc3\x018\x00V\xff\xae\x018\x00X\xff\ +\xc3\x018\x00]\xff\xd7\x018\x00\x82\xff\x85\x018\x00\ +\x83\xff\x85\x018\x00\x84\xff\x85\x018\x00\x85\xff\x85\x01\ +8\x00\x86\xff\x85\x018\x00\x87\xff\x85\x018\x00\x89\xff\ +\xd7\x018\x00\x94\xff\xd7\x018\x00\x95\xff\xd7\x018\x00\ +\x96\xff\xd7\x018\x00\x97\xff\xd7\x018\x00\x98\xff\xd7\x01\ +8\x00\x9a\xff\xd7\x018\x00\xa2\xff\x9a\x018\x00\xa3\xff\ +\x9a\x018\x00\xa4\xff\x9a\x018\x00\xa5\xff\x9a\x018\x00\ +\xa6\xff\x9a\x018\x00\xa7\xff\x9a\x018\x00\xa8\xff\x9a\x01\ +8\x00\xa9\xff\x9a\x018\x00\xaa\xff\x9a\x018\x00\xab\xff\ +\x9a\x018\x00\xac\xff\x9a\x018\x00\xad\xff\x9a\x018\x00\ +\xb4\xff\x9a\x018\x00\xb5\xff\x9a\x018\x00\xb6\xff\x9a\x01\ +8\x00\xb7\xff\x9a\x018\x00\xb8\xff\x9a\x018\x00\xba\xff\ +\x9a\x018\x00\xbb\xff\xc3\x018\x00\xbc\xff\xc3\x018\x00\ +\xbd\xff\xc3\x018\x00\xbe\xff\xc3\x018\x00\xc2\xff\x85\x01\ +8\x00\xc3\xff\x9a\x018\x00\xc4\xff\x85\x018\x00\xc5\xff\ +\x9a\x018\x00\xc6\xff\x85\x018\x00\xc7\xff\x9a\x018\x00\ +\xc8\xff\xd7\x018\x00\xc9\xff\x9a\x018\x00\xca\xff\xd7\x01\ +8\x00\xcb\xff\x9a\x018\x00\xcc\xff\xd7\x018\x00\xcd\xff\ +\x9a\x018\x00\xce\xff\xd7\x018\x00\xcf\xff\x9a\x018\x00\ +\xd1\xff\x9a\x018\x00\xd3\xff\x9a\x018\x00\xd5\xff\x9a\x01\ +8\x00\xd7\xff\x9a\x018\x00\xd9\xff\x9a\x018\x00\xdb\xff\ +\x9a\x018\x00\xdd\xff\x9a\x018\x00\xde\xff\xd7\x018\x00\ +\xdf\xff\xd7\x018\x00\xe0\xff\xd7\x018\x00\xe1\xff\xd7\x01\ +8\x00\xe2\xff\xd7\x018\x00\xe3\xff\xd7\x018\x00\xe4\xff\ +\xd7\x018\x00\xe5\xff\xd7\x018\x00\xfa\xff\xc3\x018\x01\ +\x06\xff\xc3\x018\x01\x08\xff\xc3\x018\x01\x0d\xff\xc3\x01\ +8\x01\x0e\xff\xd7\x018\x01\x0f\xff\x9a\x018\x01\x10\xff\ +\xd7\x018\x01\x11\xff\x9a\x018\x01\x12\xff\xd7\x018\x01\ +\x13\xff\x9a\x018\x01\x14\xff\xd7\x018\x01\x15\xff\x9a\x01\ +8\x01\x17\xff\xc3\x018\x01\x19\xff\xc3\x018\x01\x1d\xff\ +\xae\x018\x01!\xff\xae\x018\x01+\xff\xc3\x018\x01\ +-\xff\xc3\x018\x01/\xff\xc3\x018\x011\xff\xc3\x01\ +8\x013\xff\xc3\x018\x015\xff\xc3\x018\x01<\xff\ +\xd7\x018\x01>\xff\xd7\x018\x01@\xff\xd7\x018\x01\ +C\xff\x85\x018\x01D\xff\x9a\x018\x01F\xff\x9a\x01\ +8\x01G\xff\xd7\x018\x01H\xff\x9a\x018\x01J\xff\ +\xae\x018\x02\x08\xff\x85\x018\x02\x0c\xff\x85\x018\x02\ +W\xff\xc3\x018\x02X\xff\x85\x018\x02Y\xff\x9a\x01\ +8\x02_\xff\xd7\x018\x02`\xff\x9a\x018\x02b\xff\ +\xc3\x018\x03\x1d\xff\x85\x018\x03\x1e\xff\x9a\x018\x03\ +\x1f\xff\x85\x018\x03 \xff\x9a\x018\x03!\xff\x85\x01\ +8\x03\x22\xff\x9a\x018\x03#\xff\x85\x018\x03%\xff\ +\x85\x018\x03&\xff\x9a\x018\x03'\xff\x85\x018\x03\ +(\xff\x9a\x018\x03)\xff\x85\x018\x03*\xff\x9a\x01\ +8\x03+\xff\x85\x018\x03,\xff\x9a\x018\x03-\xff\ +\x85\x018\x03.\xff\x9a\x018\x03/\xff\x85\x018\x03\ +0\xff\x9a\x018\x031\xff\x85\x018\x032\xff\x9a\x01\ +8\x033\xff\x85\x018\x034\xff\x9a\x018\x036\xff\ +\x9a\x018\x038\xff\x9a\x018\x03:\xff\x9a\x018\x03\ +<\xff\x9a\x018\x03@\xff\x9a\x018\x03B\xff\x9a\x01\ +8\x03D\xff\x9a\x018\x03I\xff\xd7\x018\x03J\xff\ +\x9a\x018\x03K\xff\xd7\x018\x03L\xff\x9a\x018\x03\ +M\xff\xd7\x018\x03N\xff\x9a\x018\x03O\xff\xd7\x01\ +8\x03Q\xff\xd7\x018\x03R\xff\x9a\x018\x03S\xff\ +\xd7\x018\x03T\xff\x9a\x018\x03U\xff\xd7\x018\x03\ +V\xff\x9a\x018\x03W\xff\xd7\x018\x03X\xff\x9a\x01\ +8\x03Y\xff\xd7\x018\x03Z\xff\x9a\x018\x03[\xff\ +\xd7\x018\x03\x5c\xff\x9a\x018\x03]\xff\xd7\x018\x03\ +^\xff\x9a\x018\x03_\xff\xd7\x018\x03`\xff\x9a\x01\ +8\x03b\xff\xc3\x018\x03d\xff\xc3\x018\x03f\xff\ +\xc3\x018\x03h\xff\xc3\x018\x03j\xff\xc3\x018\x03\ +l\xff\xc3\x018\x03n\xff\xc3\x019\x00\x05\x00R\x01\ +9\x00\x0a\x00R\x019\x00\x0f\xff\xae\x019\x00\x11\xff\ +\xae\x019\x00\x22\x00)\x019\x02\x07\x00R\x019\x02\ +\x08\xff\xae\x019\x02\x0b\x00R\x019\x02\x0c\xff\xae\x01\ +:\x00\x0f\xff\x85\x01:\x00\x11\xff\x85\x01:\x00\x22\x00\ +)\x01:\x00$\xff\x85\x01:\x00&\xff\xd7\x01:\x00\ +*\xff\xd7\x01:\x002\xff\xd7\x01:\x004\xff\xd7\x01\ +:\x00D\xff\x9a\x01:\x00F\xff\x9a\x01:\x00G\xff\ +\x9a\x01:\x00H\xff\x9a\x01:\x00J\xff\xd7\x01:\x00\ +P\xff\xc3\x01:\x00Q\xff\xc3\x01:\x00R\xff\x9a\x01\ +:\x00S\xff\xc3\x01:\x00T\xff\x9a\x01:\x00U\xff\ +\xc3\x01:\x00V\xff\xae\x01:\x00X\xff\xc3\x01:\x00\ +]\xff\xd7\x01:\x00\x82\xff\x85\x01:\x00\x83\xff\x85\x01\ +:\x00\x84\xff\x85\x01:\x00\x85\xff\x85\x01:\x00\x86\xff\ +\x85\x01:\x00\x87\xff\x85\x01:\x00\x89\xff\xd7\x01:\x00\ +\x94\xff\xd7\x01:\x00\x95\xff\xd7\x01:\x00\x96\xff\xd7\x01\ +:\x00\x97\xff\xd7\x01:\x00\x98\xff\xd7\x01:\x00\x9a\xff\ +\xd7\x01:\x00\xa2\xff\x9a\x01:\x00\xa3\xff\x9a\x01:\x00\ +\xa4\xff\x9a\x01:\x00\xa5\xff\x9a\x01:\x00\xa6\xff\x9a\x01\ +:\x00\xa7\xff\x9a\x01:\x00\xa8\xff\x9a\x01:\x00\xa9\xff\ +\x9a\x01:\x00\xaa\xff\x9a\x01:\x00\xab\xff\x9a\x01:\x00\ +\xac\xff\x9a\x01:\x00\xad\xff\x9a\x01:\x00\xb4\xff\x9a\x01\ +:\x00\xb5\xff\x9a\x01:\x00\xb6\xff\x9a\x01:\x00\xb7\xff\ +\x9a\x01:\x00\xb8\xff\x9a\x01:\x00\xba\xff\x9a\x01:\x00\ +\xbb\xff\xc3\x01:\x00\xbc\xff\xc3\x01:\x00\xbd\xff\xc3\x01\ +:\x00\xbe\xff\xc3\x01:\x00\xc2\xff\x85\x01:\x00\xc3\xff\ +\x9a\x01:\x00\xc4\xff\x85\x01:\x00\xc5\xff\x9a\x01:\x00\ +\xc6\xff\x85\x01:\x00\xc7\xff\x9a\x01:\x00\xc8\xff\xd7\x01\ +:\x00\xc9\xff\x9a\x01:\x00\xca\xff\xd7\x01:\x00\xcb\xff\ +\x9a\x01:\x00\xcc\xff\xd7\x01:\x00\xcd\xff\x9a\x01:\x00\ +\xce\xff\xd7\x01:\x00\xcf\xff\x9a\x01:\x00\xd1\xff\x9a\x01\ +:\x00\xd3\xff\x9a\x01:\x00\xd5\xff\x9a\x01:\x00\xd7\xff\ +\x9a\x01:\x00\xd9\xff\x9a\x01:\x00\xdb\xff\x9a\x01:\x00\ +\xdd\xff\x9a\x01:\x00\xde\xff\xd7\x01:\x00\xdf\xff\xd7\x01\ +:\x00\xe0\xff\xd7\x01:\x00\xe1\xff\xd7\x01:\x00\xe2\xff\ +\xd7\x01:\x00\xe3\xff\xd7\x01:\x00\xe4\xff\xd7\x01:\x00\ +\xe5\xff\xd7\x01:\x00\xfa\xff\xc3\x01:\x01\x06\xff\xc3\x01\ +:\x01\x08\xff\xc3\x01:\x01\x0d\xff\xc3\x01:\x01\x0e\xff\ +\xd7\x01:\x01\x0f\xff\x9a\x01:\x01\x10\xff\xd7\x01:\x01\ +\x11\xff\x9a\x01:\x01\x12\xff\xd7\x01:\x01\x13\xff\x9a\x01\ +:\x01\x14\xff\xd7\x01:\x01\x15\xff\x9a\x01:\x01\x17\xff\ +\xc3\x01:\x01\x19\xff\xc3\x01:\x01\x1d\xff\xae\x01:\x01\ +!\xff\xae\x01:\x01+\xff\xc3\x01:\x01-\xff\xc3\x01\ +:\x01/\xff\xc3\x01:\x011\xff\xc3\x01:\x013\xff\ +\xc3\x01:\x015\xff\xc3\x01:\x01<\xff\xd7\x01:\x01\ +>\xff\xd7\x01:\x01@\xff\xd7\x01:\x01C\xff\x85\x01\ +:\x01D\xff\x9a\x01:\x01F\xff\x9a\x01:\x01G\xff\ +\xd7\x01:\x01H\xff\x9a\x01:\x01J\xff\xae\x01:\x02\ +\x08\xff\x85\x01:\x02\x0c\xff\x85\x01:\x02W\xff\xc3\x01\ +:\x02X\xff\x85\x01:\x02Y\xff\x9a\x01:\x02_\xff\ +\xd7\x01:\x02`\xff\x9a\x01:\x02b\xff\xc3\x01:\x03\ +\x1d\xff\x85\x01:\x03\x1e\xff\x9a\x01:\x03\x1f\xff\x85\x01\ +:\x03 \xff\x9a\x01:\x03!\xff\x85\x01:\x03\x22\xff\ +\x9a\x01:\x03#\xff\x85\x01:\x03%\xff\x85\x01:\x03\ +&\xff\x9a\x01:\x03'\xff\x85\x01:\x03(\xff\x9a\x01\ +:\x03)\xff\x85\x01:\x03*\xff\x9a\x01:\x03+\xff\ +\x85\x01:\x03,\xff\x9a\x01:\x03-\xff\x85\x01:\x03\ +.\xff\x9a\x01:\x03/\xff\x85\x01:\x030\xff\x9a\x01\ +:\x031\xff\x85\x01:\x032\xff\x9a\x01:\x033\xff\ +\x85\x01:\x034\xff\x9a\x01:\x036\xff\x9a\x01:\x03\ +8\xff\x9a\x01:\x03:\xff\x9a\x01:\x03<\xff\x9a\x01\ +:\x03@\xff\x9a\x01:\x03B\xff\x9a\x01:\x03D\xff\ +\x9a\x01:\x03I\xff\xd7\x01:\x03J\xff\x9a\x01:\x03\ +K\xff\xd7\x01:\x03L\xff\x9a\x01:\x03M\xff\xd7\x01\ +:\x03N\xff\x9a\x01:\x03O\xff\xd7\x01:\x03Q\xff\ +\xd7\x01:\x03R\xff\x9a\x01:\x03S\xff\xd7\x01:\x03\ +T\xff\x9a\x01:\x03U\xff\xd7\x01:\x03V\xff\x9a\x01\ +:\x03W\xff\xd7\x01:\x03X\xff\x9a\x01:\x03Y\xff\ +\xd7\x01:\x03Z\xff\x9a\x01:\x03[\xff\xd7\x01:\x03\ +\x5c\xff\x9a\x01:\x03]\xff\xd7\x01:\x03^\xff\x9a\x01\ +:\x03_\xff\xd7\x01:\x03`\xff\x9a\x01:\x03b\xff\ +\xc3\x01:\x03d\xff\xc3\x01:\x03f\xff\xc3\x01:\x03\ +h\xff\xc3\x01:\x03j\xff\xc3\x01:\x03l\xff\xc3\x01\ +:\x03n\xff\xc3\x01;\x00&\xff\xec\x01;\x00*\xff\ +\xec\x01;\x002\xff\xec\x01;\x004\xff\xec\x01;\x00\ +\x89\xff\xec\x01;\x00\x94\xff\xec\x01;\x00\x95\xff\xec\x01\ +;\x00\x96\xff\xec\x01;\x00\x97\xff\xec\x01;\x00\x98\xff\ +\xec\x01;\x00\x9a\xff\xec\x01;\x00\xc8\xff\xec\x01;\x00\ +\xca\xff\xec\x01;\x00\xcc\xff\xec\x01;\x00\xce\xff\xec\x01\ +;\x00\xde\xff\xec\x01;\x00\xe0\xff\xec\x01;\x00\xe2\xff\ +\xec\x01;\x00\xe4\xff\xec\x01;\x01\x0e\xff\xec\x01;\x01\ +\x10\xff\xec\x01;\x01\x12\xff\xec\x01;\x01\x14\xff\xec\x01\ +;\x01G\xff\xec\x01;\x02_\xff\xec\x01;\x03I\xff\ +\xec\x01;\x03K\xff\xec\x01;\x03M\xff\xec\x01;\x03\ +O\xff\xec\x01;\x03Q\xff\xec\x01;\x03S\xff\xec\x01\ +;\x03U\xff\xec\x01;\x03W\xff\xec\x01;\x03Y\xff\ +\xec\x01;\x03[\xff\xec\x01;\x03]\xff\xec\x01;\x03\ +_\xff\xec\x01=\x00&\xff\xec\x01=\x00*\xff\xec\x01\ +=\x002\xff\xec\x01=\x004\xff\xec\x01=\x00\x89\xff\ +\xec\x01=\x00\x94\xff\xec\x01=\x00\x95\xff\xec\x01=\x00\ +\x96\xff\xec\x01=\x00\x97\xff\xec\x01=\x00\x98\xff\xec\x01\ +=\x00\x9a\xff\xec\x01=\x00\xc8\xff\xec\x01=\x00\xca\xff\ +\xec\x01=\x00\xcc\xff\xec\x01=\x00\xce\xff\xec\x01=\x00\ +\xde\xff\xec\x01=\x00\xe0\xff\xec\x01=\x00\xe2\xff\xec\x01\ +=\x00\xe4\xff\xec\x01=\x01\x0e\xff\xec\x01=\x01\x10\xff\ +\xec\x01=\x01\x12\xff\xec\x01=\x01\x14\xff\xec\x01=\x01\ +G\xff\xec\x01=\x02_\xff\xec\x01=\x03I\xff\xec\x01\ +=\x03K\xff\xec\x01=\x03M\xff\xec\x01=\x03O\xff\ +\xec\x01=\x03Q\xff\xec\x01=\x03S\xff\xec\x01=\x03\ +U\xff\xec\x01=\x03W\xff\xec\x01=\x03Y\xff\xec\x01\ +=\x03[\xff\xec\x01=\x03]\xff\xec\x01=\x03_\xff\ +\xec\x01?\x00&\xff\xec\x01?\x00*\xff\xec\x01?\x00\ +2\xff\xec\x01?\x004\xff\xec\x01?\x00\x89\xff\xec\x01\ +?\x00\x94\xff\xec\x01?\x00\x95\xff\xec\x01?\x00\x96\xff\ +\xec\x01?\x00\x97\xff\xec\x01?\x00\x98\xff\xec\x01?\x00\ +\x9a\xff\xec\x01?\x00\xc8\xff\xec\x01?\x00\xca\xff\xec\x01\ +?\x00\xcc\xff\xec\x01?\x00\xce\xff\xec\x01?\x00\xde\xff\ +\xec\x01?\x00\xe0\xff\xec\x01?\x00\xe2\xff\xec\x01?\x00\ +\xe4\xff\xec\x01?\x01\x0e\xff\xec\x01?\x01\x10\xff\xec\x01\ +?\x01\x12\xff\xec\x01?\x01\x14\xff\xec\x01?\x01G\xff\ +\xec\x01?\x02_\xff\xec\x01?\x03I\xff\xec\x01?\x03\ +K\xff\xec\x01?\x03M\xff\xec\x01?\x03O\xff\xec\x01\ +?\x03Q\xff\xec\x01?\x03S\xff\xec\x01?\x03U\xff\ +\xec\x01?\x03W\xff\xec\x01?\x03Y\xff\xec\x01?\x03\ +[\xff\xec\x01?\x03]\xff\xec\x01?\x03_\xff\xec\x01\ +C\x00\x05\xffq\x01C\x00\x0a\xffq\x01C\x00&\xff\ +\xd7\x01C\x00*\xff\xd7\x01C\x00-\x01\x0a\x01C\x00\ +2\xff\xd7\x01C\x004\xff\xd7\x01C\x007\xffq\x01\ +C\x009\xff\xae\x01C\x00:\xff\xae\x01C\x00<\xff\ +\x85\x01C\x00\x89\xff\xd7\x01C\x00\x94\xff\xd7\x01C\x00\ +\x95\xff\xd7\x01C\x00\x96\xff\xd7\x01C\x00\x97\xff\xd7\x01\ +C\x00\x98\xff\xd7\x01C\x00\x9a\xff\xd7\x01C\x00\x9f\xff\ +\x85\x01C\x00\xc8\xff\xd7\x01C\x00\xca\xff\xd7\x01C\x00\ +\xcc\xff\xd7\x01C\x00\xce\xff\xd7\x01C\x00\xde\xff\xd7\x01\ +C\x00\xe0\xff\xd7\x01C\x00\xe2\xff\xd7\x01C\x00\xe4\xff\ +\xd7\x01C\x01\x0e\xff\xd7\x01C\x01\x10\xff\xd7\x01C\x01\ +\x12\xff\xd7\x01C\x01\x14\xff\xd7\x01C\x01$\xffq\x01\ +C\x01&\xffq\x01C\x016\xff\xae\x01C\x018\xff\ +\x85\x01C\x01:\xff\x85\x01C\x01G\xff\xd7\x01C\x01\ +\xfa\xff\xae\x01C\x01\xfc\xff\xae\x01C\x01\xfe\xff\xae\x01\ +C\x02\x00\xff\x85\x01C\x02\x07\xffq\x01C\x02\x0b\xff\ +q\x01C\x02_\xff\xd7\x01C\x03I\xff\xd7\x01C\x03\ +K\xff\xd7\x01C\x03M\xff\xd7\x01C\x03O\xff\xd7\x01\ +C\x03Q\xff\xd7\x01C\x03S\xff\xd7\x01C\x03U\xff\ +\xd7\x01C\x03W\xff\xd7\x01C\x03Y\xff\xd7\x01C\x03\ +[\xff\xd7\x01C\x03]\xff\xd7\x01C\x03_\xff\xd7\x01\ +C\x03o\xff\x85\x01C\x03q\xff\x85\x01C\x03s\xff\ +\x85\x01C\x03\x8f\xffq\x01D\x00\x05\xff\xec\x01D\x00\ +\x0a\xff\xec\x01D\x02\x07\xff\xec\x01D\x02\x0b\xff\xec\x01\ +E\x00-\x00{\x01G\x00\x0f\xff\xae\x01G\x00\x11\xff\ +\xae\x01G\x00$\xff\xd7\x01G\x007\xff\xc3\x01G\x00\ +9\xff\xec\x01G\x00:\xff\xec\x01G\x00;\xff\xd7\x01\ +G\x00<\xff\xec\x01G\x00=\xff\xec\x01G\x00\x82\xff\ +\xd7\x01G\x00\x83\xff\xd7\x01G\x00\x84\xff\xd7\x01G\x00\ +\x85\xff\xd7\x01G\x00\x86\xff\xd7\x01G\x00\x87\xff\xd7\x01\ +G\x00\x9f\xff\xec\x01G\x00\xc2\xff\xd7\x01G\x00\xc4\xff\ +\xd7\x01G\x00\xc6\xff\xd7\x01G\x01$\xff\xc3\x01G\x01\ +&\xff\xc3\x01G\x016\xff\xec\x01G\x018\xff\xec\x01\ +G\x01:\xff\xec\x01G\x01;\xff\xec\x01G\x01=\xff\ +\xec\x01G\x01?\xff\xec\x01G\x01C\xff\xd7\x01G\x01\ +\xa0\xff\xec\x01G\x01\xfa\xff\xec\x01G\x01\xfc\xff\xec\x01\ +G\x01\xfe\xff\xec\x01G\x02\x00\xff\xec\x01G\x02\x08\xff\ +\xae\x01G\x02\x0c\xff\xae\x01G\x02X\xff\xd7\x01G\x03\ +\x1d\xff\xd7\x01G\x03\x1f\xff\xd7\x01G\x03!\xff\xd7\x01\ +G\x03#\xff\xd7\x01G\x03%\xff\xd7\x01G\x03'\xff\ +\xd7\x01G\x03)\xff\xd7\x01G\x03+\xff\xd7\x01G\x03\ +-\xff\xd7\x01G\x03/\xff\xd7\x01G\x031\xff\xd7\x01\ +G\x033\xff\xd7\x01G\x03o\xff\xec\x01G\x03q\xff\ +\xec\x01G\x03s\xff\xec\x01G\x03\x8f\xff\xc3\x01V\x00\ +\x05\xffq\x01V\x00\x0a\xffq\x01V\x01f\xff\xd7\x01\ +V\x01m\xff\xd7\x01V\x01q\xffq\x01V\x01r\xff\ +\x85\x01V\x01s\xff\xd7\x01V\x01u\xff\xae\x01V\x01\ +x\xff\x85\x01V\x02\x07\xffq\x01V\x02\x0b\xffq\x01\ +V\x02T\xff\x85\x01[\x00\x0f\xff\xae\x01[\x00\x11\xff\ +\xae\x01[\x01V\xff\xd7\x01[\x01_\xff\xd7\x01[\x01\ +b\xff\xd7\x01[\x01d\xff\xec\x01[\x01i\xff\xd7\x01\ +[\x01p\xff\xec\x01[\x01q\xff\xc3\x01[\x01r\xff\ +\xec\x01[\x01t\xff\xd7\x01[\x01u\xff\xec\x01[\x01\ +x\xff\xec\x01[\x01\x88\xff\xec\x01[\x02\x08\xff\xae\x01\ +[\x02\x0c\xff\xae\x01[\x02T\xff\xec\x01\x5c\x00\x0f\xff\ +\x85\x01\x5c\x00\x11\xff\x85\x01\x5c\x01V\xff\x85\x01\x5c\x01\ +_\xff\x85\x01\x5c\x01b\xff\x85\x01\x5c\x01f\xff\xd7\x01\ +\x5c\x01i\xff\x85\x01\x5c\x01m\xff\xd7\x01\x5c\x01s\xff\ +\xc3\x01\x5c\x01v\xff\xec\x01\x5c\x01y\xff\x9a\x01\x5c\x01\ +z\xff\xae\x01\x5c\x01{\xff\xc3\x01\x5c\x01|\xff\xc3\x01\ +\x5c\x01}\xff\xc3\x01\x5c\x01~\xff\x9a\x01\x5c\x01\x81\xff\ +\xc3\x01\x5c\x01\x82\xff\xae\x01\x5c\x01\x84\xff\xc3\x01\x5c\x01\ +\x86\xff\xc3\x01\x5c\x01\x87\xff\xc3\x01\x5c\x01\x89\xff\xc3\x01\ +\x5c\x01\x8c\xff\x9a\x01\x5c\x01\x8e\xff\x9a\x01\x5c\x01\x8f\xff\ +\x9a\x01\x5c\x01\x90\xff\x9a\x01\x5c\x01\x92\xff\xc3\x01\x5c\x01\ +\x93\xff\x9a\x01\x5c\x01\x95\xff\xc3\x01\x5c\x01\x96\xff\xc3\x01\ +\x5c\x01\x98\xff\xc3\x01\x5c\x01\x99\xff\x9a\x01\x5c\x01\x9a\xff\ +\xc3\x01\x5c\x01\x9b\xff\xc3\x01\x5c\x02\x08\xff\x85\x01\x5c\x02\ +\x0c\xff\x85\x01\x5c\x02!\xff\xec\x01]\x01q\xff\xd7\x01\ +]\x01r\xff\xec\x01]\x01x\xff\xec\x01]\x02T\xff\ +\xec\x01^\x00\x05\xff\xd7\x01^\x00\x0a\xff\xd7\x01^\x02\ +\x07\xff\xd7\x01^\x02\x0b\xff\xd7\x01_\x00\x05\xffq\x01\ +_\x00\x0a\xffq\x01_\x01f\xff\xd7\x01_\x01m\xff\ +\xd7\x01_\x01q\xffq\x01_\x01r\xff\x85\x01_\x01\ +s\xff\xd7\x01_\x01u\xff\xae\x01_\x01x\xff\x85\x01\ +_\x02\x07\xffq\x01_\x02\x0b\xffq\x01_\x02T\xff\ +\x85\x01`\x00\x0f\xff\xae\x01`\x00\x11\xff\xae\x01`\x01\ +V\xff\xd7\x01`\x01_\xff\xd7\x01`\x01b\xff\xd7\x01\ +`\x01i\xff\xd7\x01`\x01t\xff\xd7\x01`\x02\x08\xff\ +\xae\x01`\x02\x0c\xff\xae\x01a\x00\x0f\xff\x85\x01a\x00\ +\x10\xff\xae\x01a\x00\x11\xff\x85\x01a\x01V\xff\x5c\x01\ +a\x01_\xff\x5c\x01a\x01b\xff\x5c\x01a\x01f\xff\ +\xc3\x01a\x01i\xff\x5c\x01a\x01m\xff\xc3\x01a\x01\ +s\xff\x9a\x01a\x01v\xff\xc3\x01a\x01y\xffq\x01\ +a\x01z\xff\x9a\x01a\x01{\xff\x9a\x01a\x01|\xff\ +\xae\x01a\x01}\xff\x9a\x01a\x01~\xffq\x01a\x01\ +\x80\xff\xd7\x01a\x01\x81\xff\xc3\x01a\x01\x82\xff\x9a\x01\ +a\x01\x84\xff\x9a\x01a\x01\x86\xff\xae\x01a\x01\x87\xff\ +\x9a\x01a\x01\x89\xff\x9a\x01a\x01\x8a\xff\xd7\x01a\x01\ +\x8c\xffq\x01a\x01\x8e\xff\x9a\x01a\x01\x8f\xffq\x01\ +a\x01\x90\xffq\x01a\x01\x92\xff\x9a\x01a\x01\x93\xff\ +q\x01a\x01\x94\xff\xd7\x01a\x01\x95\xff\x9a\x01a\x01\ +\x96\xff\x9a\x01a\x01\x98\xff\x9a\x01a\x01\x99\xffq\x01\ +a\x01\x9a\xff\x9a\x01a\x01\x9b\xff\x9a\x01a\x02\x02\xff\ +\xae\x01a\x02\x03\xff\xae\x01a\x02\x04\xff\xae\x01a\x02\ +\x08\xff\x85\x01a\x02\x0c\xff\x85\x01a\x02!\xff\xc3\x01\ +a\x02S\xff\xd7\x01b\x00\x05\xffq\x01b\x00\x0a\xff\ +q\x01b\x01f\xff\xd7\x01b\x01m\xff\xd7\x01b\x01\ +q\xffq\x01b\x01r\xff\x85\x01b\x01s\xff\xd7\x01\ +b\x01u\xff\xae\x01b\x01x\xff\x85\x01b\x02\x07\xff\ +q\x01b\x02\x0b\xffq\x01b\x02T\xff\x85\x01d\x01\ +f\xff\xec\x01d\x01m\xff\xec\x01d\x01s\xff\xc3\x01\ +f\x00\x0f\xff\xae\x01f\x00\x11\xff\xae\x01f\x01V\xff\ +\xd7\x01f\x01_\xff\xd7\x01f\x01b\xff\xd7\x01f\x01\ +d\xff\xec\x01f\x01i\xff\xd7\x01f\x01p\xff\xec\x01\ +f\x01q\xff\xc3\x01f\x01r\xff\xec\x01f\x01t\xff\ +\xd7\x01f\x01u\xff\xec\x01f\x01x\xff\xec\x01f\x01\ +\x88\xff\xec\x01f\x02\x08\xff\xae\x01f\x02\x0c\xff\xae\x01\ +f\x02T\xff\xec\x01h\x01f\xff\xd7\x01h\x01m\xff\ +\xd7\x01h\x01s\xff\xc3\x01h\x01\x8d\xff\xec\x01h\x01\ +\x91\xff\xec\x01i\x00\x05\xffq\x01i\x00\x0a\xffq\x01\ +i\x01f\xff\xd7\x01i\x01m\xff\xd7\x01i\x01q\xff\ +q\x01i\x01r\xff\x85\x01i\x01s\xff\xd7\x01i\x01\ +u\xff\xae\x01i\x01x\xff\x85\x01i\x02\x07\xffq\x01\ +i\x02\x0b\xffq\x01i\x02T\xff\x85\x01m\x00\x0f\xff\ +\xae\x01m\x00\x11\xff\xae\x01m\x01V\xff\xd7\x01m\x01\ +_\xff\xd7\x01m\x01b\xff\xd7\x01m\x01d\xff\xec\x01\ +m\x01i\xff\xd7\x01m\x01p\xff\xec\x01m\x01q\xff\ +\xc3\x01m\x01r\xff\xec\x01m\x01t\xff\xd7\x01m\x01\ +u\xff\xec\x01m\x01x\xff\xec\x01m\x01\x88\xff\xec\x01\ +m\x02\x08\xff\xae\x01m\x02\x0c\xff\xae\x01m\x02T\xff\ +\xec\x01o\x00\x0f\xfe\xf6\x01o\x00\x11\xfe\xf6\x01o\x01\ +V\xff\x9a\x01o\x01_\xff\x9a\x01o\x01b\xff\x9a\x01\ +o\x01d\xff\xec\x01o\x01i\xff\x9a\x01o\x01t\xff\ +\xd7\x01o\x01\x88\xff\xd7\x01o\x02\x08\xfe\xf6\x01o\x02\ +\x0c\xfe\xf6\x01q\x00\x0f\xff\x85\x01q\x00\x10\xff\xae\x01\ +q\x00\x11\xff\x85\x01q\x01V\xff\x5c\x01q\x01_\xff\ +\x5c\x01q\x01b\xff\x5c\x01q\x01f\xff\xc3\x01q\x01\ +i\xff\x5c\x01q\x01m\xff\xc3\x01q\x01s\xff\x9a\x01\ +q\x01v\xff\xc3\x01q\x01y\xffq\x01q\x01z\xff\ +\x9a\x01q\x01{\xff\x9a\x01q\x01|\xff\xae\x01q\x01\ +}\xff\x9a\x01q\x01~\xffq\x01q\x01\x80\xff\xd7\x01\ +q\x01\x81\xff\xc3\x01q\x01\x82\xff\x9a\x01q\x01\x84\xff\ +\x9a\x01q\x01\x86\xff\xae\x01q\x01\x87\xff\x9a\x01q\x01\ +\x89\xff\x9a\x01q\x01\x8a\xff\xd7\x01q\x01\x8c\xffq\x01\ +q\x01\x8e\xff\x9a\x01q\x01\x8f\xffq\x01q\x01\x90\xff\ +q\x01q\x01\x92\xff\x9a\x01q\x01\x93\xffq\x01q\x01\ +\x94\xff\xd7\x01q\x01\x95\xff\x9a\x01q\x01\x96\xff\x9a\x01\ +q\x01\x98\xff\x9a\x01q\x01\x99\xffq\x01q\x01\x9a\xff\ +\x9a\x01q\x01\x9b\xff\x9a\x01q\x02\x02\xff\xae\x01q\x02\ +\x03\xff\xae\x01q\x02\x04\xff\xae\x01q\x02\x08\xff\x85\x01\ +q\x02\x0c\xff\x85\x01q\x02!\xff\xc3\x01q\x02S\xff\ +\xd7\x01r\x00\x0f\xff\x85\x01r\x00\x11\xff\x85\x01r\x01\ +V\xff\x85\x01r\x01_\xff\x85\x01r\x01b\xff\x85\x01\ +r\x01f\xff\xd7\x01r\x01i\xff\x85\x01r\x01m\xff\ +\xd7\x01r\x01s\xff\xc3\x01r\x01v\xff\xec\x01r\x01\ +y\xff\x9a\x01r\x01z\xff\xae\x01r\x01{\xff\xc3\x01\ +r\x01|\xff\xc3\x01r\x01}\xff\xc3\x01r\x01~\xff\ +\x9a\x01r\x01\x81\xff\xc3\x01r\x01\x82\xff\xae\x01r\x01\ +\x84\xff\xc3\x01r\x01\x86\xff\xc3\x01r\x01\x87\xff\xc3\x01\ +r\x01\x89\xff\xc3\x01r\x01\x8c\xff\x9a\x01r\x01\x8e\xff\ +\x9a\x01r\x01\x8f\xff\x9a\x01r\x01\x90\xff\x9a\x01r\x01\ +\x92\xff\xc3\x01r\x01\x93\xff\x9a\x01r\x01\x95\xff\xc3\x01\ +r\x01\x96\xff\xc3\x01r\x01\x98\xff\xc3\x01r\x01\x99\xff\ +\x9a\x01r\x01\x9a\xff\xc3\x01r\x01\x9b\xff\xc3\x01r\x02\ +\x08\xff\x85\x01r\x02\x0c\xff\x85\x01r\x02!\xff\xec\x01\ +s\x00\x0f\xff\x9a\x01s\x00\x11\xff\x9a\x01s\x01V\xff\ +\xd7\x01s\x01_\xff\xd7\x01s\x01b\xff\xd7\x01s\x01\ +d\xff\xc3\x01s\x01i\xff\xd7\x01s\x01p\xff\xec\x01\ +s\x01q\xff\xae\x01s\x01r\xff\xc3\x01s\x01t\xff\ +\xec\x01s\x01x\xff\xc3\x01s\x01\x88\xff\xec\x01s\x02\ +\x08\xff\x9a\x01s\x02\x0c\xff\x9a\x01s\x02T\xff\xc3\x01\ +t\x01f\xff\xd7\x01t\x01m\xff\xd7\x01t\x01s\xff\ +\xc3\x01t\x01\x8d\xff\xec\x01t\x01\x91\xff\xec\x01u\x00\ +\x0f\xff\x85\x01u\x00\x11\xff\x85\x01u\x01V\xff\xae\x01\ +u\x01_\xff\xae\x01u\x01b\xff\xae\x01u\x01f\xff\ +\xec\x01u\x01i\xff\xae\x01u\x01m\xff\xec\x01u\x02\ +\x08\xff\x85\x01u\x02\x0c\xff\x85\x01v\x01q\xff\xd7\x01\ +v\x01r\xff\xec\x01v\x01x\xff\xec\x01v\x02T\xff\ +\xec\x01x\x00\x0f\xff\x85\x01x\x00\x11\xff\x85\x01x\x01\ +V\xff\x85\x01x\x01_\xff\x85\x01x\x01b\xff\x85\x01\ +x\x01f\xff\xd7\x01x\x01i\xff\x85\x01x\x01m\xff\ +\xd7\x01x\x01s\xff\xc3\x01x\x01v\xff\xec\x01x\x01\ +y\xff\x9a\x01x\x01z\xff\xae\x01x\x01{\xff\xc3\x01\ +x\x01|\xff\xc3\x01x\x01}\xff\xc3\x01x\x01~\xff\ +\x9a\x01x\x01\x81\xff\xc3\x01x\x01\x82\xff\xae\x01x\x01\ +\x84\xff\xc3\x01x\x01\x86\xff\xc3\x01x\x01\x87\xff\xc3\x01\ +x\x01\x89\xff\xc3\x01x\x01\x8c\xff\x9a\x01x\x01\x8e\xff\ +\x9a\x01x\x01\x8f\xff\x9a\x01x\x01\x90\xff\x9a\x01x\x01\ +\x92\xff\xc3\x01x\x01\x93\xff\x9a\x01x\x01\x95\xff\xc3\x01\ +x\x01\x96\xff\xc3\x01x\x01\x98\xff\xc3\x01x\x01\x99\xff\ +\x9a\x01x\x01\x9a\xff\xc3\x01x\x01\x9b\xff\xc3\x01x\x02\ +\x08\xff\x85\x01x\x02\x0c\xff\x85\x01x\x02!\xff\xec\x01\ +y\x01\x88\x00)\x01{\x00\x05\xff\xec\x01{\x00\x0a\xff\ +\xec\x01{\x02\x07\xff\xec\x01{\x02\x0b\xff\xec\x01|\x00\ +\x05\xff\xae\x01|\x00\x0a\xff\xae\x01|\x01\x8d\xff\xec\x01\ +|\x01\x91\xff\xec\x01|\x02\x07\xff\xae\x01|\x02\x0b\xff\ +\xae\x01~\x01\x88\x00)\x01\x80\x00\x0f\xff\xae\x01\x80\x00\ +\x11\xff\xae\x01\x80\x01\x88\xff\xec\x01\x80\x02\x08\xff\xae\x01\ +\x80\x02\x0c\xff\xae\x01\x83\x00\x10\xff\x9a\x01\x83\x01y\xff\ +\xd7\x01\x83\x01~\xff\xd7\x01\x83\x01\x81\xff\xd7\x01\x83\x01\ +\x8c\xff\xd7\x01\x83\x01\x8d\xff\xd7\x01\x83\x01\x8f\xff\xd7\x01\ +\x83\x01\x90\xff\xd7\x01\x83\x01\x91\xff\xd7\x01\x83\x01\x93\xff\ +\xd7\x01\x83\x01\x99\xff\xd7\x01\x83\x02\x02\xff\x9a\x01\x83\x02\ +\x03\xff\x9a\x01\x83\x02\x04\xff\x9a\x01\x84\x00\x05\xff\xec\x01\ +\x84\x00\x0a\xff\xec\x01\x84\x02\x07\xff\xec\x01\x84\x02\x0b\xff\ +\xec\x01\x85\x00\x0f\xff\xd7\x01\x85\x00\x11\xff\xd7\x01\x85\x02\ +\x08\xff\xd7\x01\x85\x02\x0c\xff\xd7\x01\x86\x00\x05\xff\xae\x01\ +\x86\x00\x0a\xff\xae\x01\x86\x01\x8d\xff\xec\x01\x86\x01\x91\xff\ +\xec\x01\x86\x02\x07\xff\xae\x01\x86\x02\x0b\xff\xae\x01\x87\x01\ +y\xff\xd7\x01\x87\x01~\xff\xd7\x01\x87\x01\x8c\xff\xd7\x01\ +\x87\x01\x8f\xff\xd7\x01\x87\x01\x90\xff\xd7\x01\x87\x01\x93\xff\ +\xd7\x01\x87\x01\x99\xff\xd7\x01\x88\x00\x05\xff\x85\x01\x88\x00\ +\x0a\xff\x85\x01\x88\x01y\xff\xec\x01\x88\x01~\xff\xec\x01\ +\x88\x01\x80\xff\xd7\x01\x88\x01\x8a\xff\xd7\x01\x88\x01\x8c\xff\ +\xec\x01\x88\x01\x8d\xff\xd7\x01\x88\x01\x8f\xff\xec\x01\x88\x01\ +\x90\xff\xec\x01\x88\x01\x91\xff\xd7\x01\x88\x01\x93\xff\xec\x01\ +\x88\x01\x99\xff\xec\x01\x88\x02\x07\xff\x85\x01\x88\x02\x0b\xff\ +\x85\x01\x8a\x00\x0f\xff\xae\x01\x8a\x00\x11\xff\xae\x01\x8a\x01\ +\x88\xff\xec\x01\x8a\x02\x08\xff\xae\x01\x8a\x02\x0c\xff\xae\x01\ +\x8c\x00\x05\xff\xec\x01\x8c\x00\x0a\xff\xec\x01\x8c\x01\x80\xff\ +\xd7\x01\x8c\x01\x8a\xff\xd7\x01\x8c\x02\x07\xff\xec\x01\x8c\x02\ +\x0b\xff\xec\x01\x8e\x00\x05\xff\xec\x01\x8e\x00\x0a\xff\xec\x01\ +\x8e\x01\x80\xff\xd7\x01\x8e\x01\x8a\xff\xd7\x01\x8e\x02\x07\xff\ +\xec\x01\x8e\x02\x0b\xff\xec\x01\x90\x00\x0f\xff\xec\x01\x90\x00\ +\x11\xff\xec\x01\x90\x02\x08\xff\xec\x01\x90\x02\x0c\xff\xec\x01\ +\x93\x00\x05\xff\xec\x01\x93\x00\x0a\xff\xec\x01\x93\x01\x80\xff\ +\xd7\x01\x93\x01\x8a\xff\xd7\x01\x93\x02\x07\xff\xec\x01\x93\x02\ +\x0b\xff\xec\x01\x94\x00\x0f\xff\xc3\x01\x94\x00\x10\xff\xd7\x01\ +\x94\x00\x11\xff\xc3\x01\x94\x01y\xff\xd7\x01\x94\x01~\xff\ +\xd7\x01\x94\x01\x81\xff\xd7\x01\x94\x01\x8c\xff\xd7\x01\x94\x01\ +\x8f\xff\xd7\x01\x94\x01\x90\xff\xd7\x01\x94\x01\x93\xff\xd7\x01\ +\x94\x01\x99\xff\xd7\x01\x94\x02\x02\xff\xd7\x01\x94\x02\x03\xff\ +\xd7\x01\x94\x02\x04\xff\xd7\x01\x94\x02\x08\xff\xc3\x01\x94\x02\ +\x0c\xff\xc3\x01\x97\x00\x05\xff\xd7\x01\x97\x00\x0a\xff\xd7\x01\ +\x97\x02\x07\xff\xd7\x01\x97\x02\x0b\xff\xd7\x01\x99\x00\x05\xff\ +\xec\x01\x99\x00\x0a\xff\xec\x01\x99\x01\x80\xff\xd7\x01\x99\x01\ +\x8a\xff\xd7\x01\x99\x02\x07\xff\xec\x01\x99\x02\x0b\xff\xec\x01\ +\x9d\x00\x05\xff\xae\x01\x9d\x00\x0a\xff\xae\x01\x9d\x01\x9d\xff\ +\x85\x01\x9d\x01\xa6\xff\x85\x01\x9d\x01\xa8\xff\xd7\x01\x9d\x01\ +\xbc\xff\x9a\x01\x9d\x01\xbd\xff\xd7\x01\x9d\x01\xc1\xff\x9a\x01\ +\x9d\x01\xc4\xff\x85\x01\x9d\x01\xdc\xff\xd7\x01\x9d\x01\xdd\xff\ +\xd7\x01\x9d\x01\xe1\xff\xd7\x01\x9d\x01\xe4\xff\xd7\x01\x9d\x01\ +\xf6\xff\xd7\x01\x9d\x02\x07\xff\xae\x01\x9d\x02\x0b\xff\xae\x01\ +\x9d\x02n\xff\xae\x01\x9d\x02|\xff\x9a\x01\x9d\x02\x80\xff\ +\xae\x01\x9d\x02\x82\xff\xae\x01\x9d\x02\x97\xff\xae\x01\x9d\x02\ +\x9b\xff\xae\x01\x9d\x02\xa7\xff\xae\x01\x9d\x02\xa9\xff\x85\x01\ +\x9d\x02\xaa\xff\xd7\x01\x9d\x02\xb5\xff\x9a\x01\x9d\x02\xb6\xff\ +\xd7\x01\x9d\x02\xb7\xff\x9a\x01\x9d\x02\xb8\xff\xd7\x01\x9d\x02\ +\xb9\xff\x9a\x01\x9d\x02\xba\xff\xd7\x01\x9d\x02\xbd\xff\x85\x01\ +\x9d\x02\xbe\xff\xd7\x01\x9d\x02\xbf\xff\x9a\x01\x9d\x02\xc0\xff\ +\xd7\x01\x9d\x02\xc1\xff\x9a\x01\x9d\x02\xc2\xff\xd7\x01\x9d\x02\ +\xd4\xff\x9a\x01\x9d\x02\xd5\xff\xd7\x01\x9d\x02\xf7\xff\xd7\x01\ +\x9d\x02\xf8\xff\xd7\x01\x9d\x02\xf9\xff\xd7\x01\x9d\x02\xfa\xff\ +\xd7\x01\x9d\x02\xfb\xff\xd7\x01\x9d\x02\xfc\xff\xd7\x01\x9d\x02\ +\xfd\xff\x9a\x01\x9d\x02\xfe\xff\xd7\x01\x9d\x03\x03\xff\xae\x01\ +\x9d\x03\x0d\xff\x9a\x01\x9d\x03\x0e\xff\xc3\x01\x9d\x03\x0f\xff\ +\x9a\x01\x9d\x03\x10\xff\xc3\x01\x9d\x03\x17\xff\x85\x01\x9d\x03\ +\x18\xff\xd7\x01\x9e\x00\x0f\xff\x85\x01\x9e\x00\x10\xff\xae\x01\ +\x9e\x00\x11\xff\x85\x01\x9e\x01\x9f\xff\xd7\x01\x9e\x01\xa4\xff\ +\x9a\x01\x9e\x01\xaa\xffq\x01\x9e\x01\xae\xff\x9a\x01\x9e\x01\ +\xb5\xff\x9a\x01\x9e\x01\xb8\xff\xd7\x01\x9e\x01\xbb\xff\xd7\x01\ +\x9e\x01\xbc\x00)\x01\x9e\x01\xbe\xff\xae\x01\x9e\x01\xcc\xff\ +\x9a\x01\x9e\x01\xcd\xff\x9a\x01\x9e\x01\xce\xff\x85\x01\x9e\x01\ +\xcf\xffq\x01\x9e\x01\xd0\xff\xd7\x01\x9e\x01\xd1\xff\xd7\x01\ +\x9e\x01\xd2\xff\x9a\x01\x9e\x01\xd3\xff\x9a\x01\x9e\x01\xd4\xff\ +\x9a\x01\x9e\x01\xd5\xff\x85\x01\x9e\x01\xd6\xff\x9a\x01\x9e\x01\ +\xd7\xff\x9a\x01\x9e\x01\xd8\xffq\x01\x9e\x01\xd9\xff\x9a\x01\ +\x9e\x01\xda\xff\x9a\x01\x9e\x01\xdb\xffq\x01\x9e\x01\xdc\xff\ +\xae\x01\x9e\x01\xdd\xff\xae\x01\x9e\x01\xde\xffq\x01\x9e\x01\ +\xdf\xff\xd7\x01\x9e\x01\xe0\xff\x9a\x01\x9e\x01\xe1\xff\x9a\x01\ +\x9e\x01\xe2\xff\x9a\x01\x9e\x01\xe3\xff\x9a\x01\x9e\x01\xe4\xff\ +\xae\x01\x9e\x01\xe5\xff\x9a\x01\x9e\x01\xe6\xff\x9a\x01\x9e\x01\ +\xe7\xff\xd7\x01\x9e\x01\xe8\xff\x9a\x01\x9e\x01\xe9\xff\xc3\x01\ +\x9e\x01\xea\xffq\x01\x9e\x01\xec\xff\x9a\x01\x9e\x01\xed\xff\ +q\x01\x9e\x01\xee\xff\x85\x01\x9e\x01\xf2\xff\x85\x01\x9e\x01\ +\xf3\xff\x9a\x01\x9e\x01\xf5\xff\x9a\x01\x9e\x01\xf6\xff\xae\x01\ +\x9e\x01\xf7\xff\x9a\x01\x9e\x01\xf9\xff\x9a\x01\x9e\x02\x02\xff\ +\xae\x01\x9e\x02\x03\xff\xae\x01\x9e\x02\x04\xff\xae\x01\x9e\x02\ +\x08\xff\x85\x01\x9e\x02\x0c\xff\x85\x01\x9e\x02j\xffq\x01\ +\x9e\x02k\xff\x9a\x01\x9e\x02l\xff\xd7\x01\x9e\x02m\xff\ +\xd7\x01\x9e\x02q\xff\x9a\x01\x9e\x02r\xffq\x01\x9e\x02\ +s\xff\x85\x01\x9e\x02u\xff\x9a\x01\x9e\x02w\xff\x9a\x01\ +\x9e\x02y\xff\x9a\x01\x9e\x02}\xff\x9a\x01\x9e\x02~\xff\ +\xd7\x01\x9e\x02\x7f\xffq\x01\x9e\x02\x81\xff\xd7\x01\x9e\x02\ +\x83\xff\xd7\x01\x9e\x02\x84\xff\xd7\x01\x9e\x02\x85\xffq\x01\ +\x9e\x02\x86\xff\xd7\x01\x9e\x02\x87\xffq\x01\x9e\x02\x88\xff\ +\xd7\x01\x9e\x02\x89\xffq\x01\x9e\x02\x8a\xff\xd7\x01\x9e\x02\ +\x8b\xff\xd7\x01\x9e\x02\x8c\xff\xd7\x01\x9e\x02\x8d\xffq\x01\ +\x9e\x02\x96\xff\x9a\x01\x9e\x02\x9a\xff\x9a\x01\x9e\x02\x9e\xff\ +\x9a\x01\x9e\x02\xa0\xff\xd7\x01\x9e\x02\xa2\xff\xd7\x01\x9e\x02\ +\xa4\xff\x9a\x01\x9e\x02\xa6\xff\x9a\x01\x9e\x02\xaa\xff\xae\x01\ +\x9e\x02\xac\xff\x9a\x01\x9e\x02\xae\xff\x9a\x01\x9e\x02\xb0\xff\ +\x9a\x01\x9e\x02\xb1\xff\xd7\x01\x9e\x02\xb2\xffq\x01\x9e\x02\ +\xb3\xff\xd7\x01\x9e\x02\xb4\xffq\x01\x9e\x02\xb5\x00)\x01\ +\x9e\x02\xb6\xff\xae\x01\x9e\x02\xb8\xff\xae\x01\x9e\x02\xba\xff\ +\xae\x01\x9e\x02\xbc\xff\xd7\x01\x9e\x02\xbe\xff\xae\x01\x9e\x02\ +\xc0\xff\x9a\x01\x9e\x02\xc2\xff\x9a\x01\x9e\x02\xc4\xff\x9a\x01\ +\x9e\x02\xc5\xff\x9a\x01\x9e\x02\xc6\xffq\x01\x9e\x02\xc7\xff\ +\x9a\x01\x9e\x02\xc8\xffq\x01\x9e\x02\xcb\xff\xd7\x01\x9e\x02\ +\xcd\xff\x9a\x01\x9e\x02\xce\xff\x9a\x01\x9e\x02\xcf\xff\x85\x01\ +\x9e\x02\xd1\xff\x9a\x01\x9e\x02\xd3\xff\x9a\x01\x9e\x02\xd5\xff\ +\x9a\x01\x9e\x02\xd7\xff\x9a\x01\x9e\x02\xd9\xffq\x01\x9e\x02\ +\xdb\xffq\x01\x9e\x02\xdd\xffq\x01\x9e\x02\xe0\xffq\x01\ +\x9e\x02\xe6\xff\xd7\x01\x9e\x02\xe8\xff\xd7\x01\x9e\x02\xea\xff\ +\xc3\x01\x9e\x02\xec\xff\x9a\x01\x9e\x02\xee\xff\x9a\x01\x9e\x02\ +\xef\xff\xd7\x01\x9e\x02\xf0\xffq\x01\x9e\x02\xf1\xff\xd7\x01\ +\x9e\x02\xf2\xffq\x01\x9e\x02\xf3\xff\xd7\x01\x9e\x02\xf4\xff\ +q\x01\x9e\x02\xf6\xff\xd7\x01\x9e\x02\xf8\xff\xae\x01\x9e\x02\ +\xfa\xff\xae\x01\x9e\x02\xfc\xff\xae\x01\x9e\x02\xfe\xff\x9a\x01\ +\x9e\x03\x00\xff\x9a\x01\x9e\x03\x02\xff\x9a\x01\x9e\x03\x06\xff\ +\xd7\x01\x9e\x03\x08\xff\xd7\x01\x9e\x03\x09\xffq\x01\x9e\x03\ +\x0a\xffq\x01\x9e\x03\x0b\xffq\x01\x9e\x03\x0c\xffq\x01\ +\x9e\x03\x0e\xff\x9a\x01\x9e\x03\x10\xff\x9a\x01\x9e\x03\x11\xff\ +\x9a\x01\x9e\x03\x12\xff\x85\x01\x9e\x03\x14\xff\x9a\x01\x9e\x03\ +\x15\xff\xd7\x01\x9e\x03\x16\xffq\x01\x9e\x03\x18\xff\xae\x01\ +\x9e\x03\x1a\xffq\x01\x9e\x03\x1b\xff\x9a\x01\x9e\x03\x1c\xff\ +\x85\x01\x9f\x01\x9f\xff\xd7\x01\x9f\x01\xb8\xff\xd7\x01\x9f\x01\ +\xbb\xff\xd7\x01\x9f\x01\xbe\xff\xd7\x01\x9f\x01\xe1\xff\xd7\x01\ +\x9f\x02l\xff\xd7\x01\x9f\x02~\xff\xd7\x01\x9f\x02\x84\xff\ +\xd7\x01\x9f\x02\x86\xff\xd7\x01\x9f\x02\x88\xff\xd7\x01\x9f\x02\ +\x8a\xff\xd7\x01\x9f\x02\x8c\xff\xd7\x01\x9f\x02\xb1\xff\xd7\x01\ +\x9f\x02\xb3\xff\xd7\x01\x9f\x02\xc0\xff\xd7\x01\x9f\x02\xc2\xff\ +\xd7\x01\x9f\x02\xc5\xff\xd7\x01\x9f\x02\xc7\xff\xd7\x01\x9f\x02\ +\xd5\xff\xd7\x01\x9f\x02\xef\xff\xd7\x01\x9f\x02\xf1\xff\xd7\x01\ +\x9f\x02\xf3\xff\xd7\x01\x9f\x02\xfe\xff\xd7\x01\x9f\x03\x09\xff\ +\xd7\x01\x9f\x03\x0b\xff\xd7\x01\x9f\x03\x0e\xff\xd7\x01\x9f\x03\ +\x10\xff\xd7\x01\x9f\x03\x15\xff\xd7\x01\xa0\x03\x0e\xff\xd7\x01\ +\xa0\x03\x10\xff\xd7\x01\xa4\x00\x05\xff\xae\x01\xa4\x00\x0a\xff\ +\xae\x01\xa4\x01\x9d\xff\x85\x01\xa4\x01\xa6\xff\x85\x01\xa4\x01\ +\xa8\xff\xd7\x01\xa4\x01\xbc\xff\x9a\x01\xa4\x01\xbd\xff\xd7\x01\ +\xa4\x01\xc1\xff\x9a\x01\xa4\x01\xc4\xff\x85\x01\xa4\x01\xdc\xff\ +\xd7\x01\xa4\x01\xdd\xff\xd7\x01\xa4\x01\xe1\xff\xd7\x01\xa4\x01\ +\xe4\xff\xd7\x01\xa4\x01\xf6\xff\xd7\x01\xa4\x02\x07\xff\xae\x01\ +\xa4\x02\x0b\xff\xae\x01\xa4\x02n\xff\xae\x01\xa4\x02|\xff\ +\x9a\x01\xa4\x02\x80\xff\xae\x01\xa4\x02\x82\xff\xae\x01\xa4\x02\ +\x97\xff\xae\x01\xa4\x02\x9b\xff\xae\x01\xa4\x02\xa7\xff\xae\x01\ +\xa4\x02\xa9\xff\x85\x01\xa4\x02\xaa\xff\xd7\x01\xa4\x02\xb5\xff\ +\x9a\x01\xa4\x02\xb6\xff\xd7\x01\xa4\x02\xb7\xff\x9a\x01\xa4\x02\ +\xb8\xff\xd7\x01\xa4\x02\xb9\xff\x9a\x01\xa4\x02\xba\xff\xd7\x01\ +\xa4\x02\xbd\xff\x85\x01\xa4\x02\xbe\xff\xd7\x01\xa4\x02\xbf\xff\ +\x9a\x01\xa4\x02\xc0\xff\xd7\x01\xa4\x02\xc1\xff\x9a\x01\xa4\x02\ +\xc2\xff\xd7\x01\xa4\x02\xd4\xff\x9a\x01\xa4\x02\xd5\xff\xd7\x01\ +\xa4\x02\xf7\xff\xd7\x01\xa4\x02\xf8\xff\xd7\x01\xa4\x02\xf9\xff\ +\xd7\x01\xa4\x02\xfa\xff\xd7\x01\xa4\x02\xfb\xff\xd7\x01\xa4\x02\ +\xfc\xff\xd7\x01\xa4\x02\xfd\xff\x9a\x01\xa4\x02\xfe\xff\xd7\x01\ +\xa4\x03\x03\xff\xae\x01\xa4\x03\x0d\xff\x9a\x01\xa4\x03\x0e\xff\ +\xc3\x01\xa4\x03\x0f\xff\x9a\x01\xa4\x03\x10\xff\xc3\x01\xa4\x03\ +\x17\xff\x85\x01\xa4\x03\x18\xff\xd7\x01\xa5\x00\x05\xff\xae\x01\ +\xa5\x00\x0a\xff\xae\x01\xa5\x01\x9d\xff\x85\x01\xa5\x01\xa6\xff\ +\x85\x01\xa5\x01\xa8\xff\xd7\x01\xa5\x01\xbc\xff\x9a\x01\xa5\x01\ +\xbd\xff\xd7\x01\xa5\x01\xc1\xff\x9a\x01\xa5\x01\xc4\xff\x85\x01\ +\xa5\x01\xdc\xff\xd7\x01\xa5\x01\xdd\xff\xd7\x01\xa5\x01\xe1\xff\ +\xd7\x01\xa5\x01\xe4\xff\xd7\x01\xa5\x01\xf6\xff\xd7\x01\xa5\x02\ +\x07\xff\xae\x01\xa5\x02\x0b\xff\xae\x01\xa5\x02n\xff\xae\x01\ +\xa5\x02|\xff\x9a\x01\xa5\x02\x80\xff\xae\x01\xa5\x02\x82\xff\ +\xae\x01\xa5\x02\x97\xff\xae\x01\xa5\x02\x9b\xff\xae\x01\xa5\x02\ +\xa7\xff\xae\x01\xa5\x02\xa9\xff\x85\x01\xa5\x02\xaa\xff\xd7\x01\ +\xa5\x02\xb5\xff\x9a\x01\xa5\x02\xb6\xff\xd7\x01\xa5\x02\xb7\xff\ +\x9a\x01\xa5\x02\xb8\xff\xd7\x01\xa5\x02\xb9\xff\x9a\x01\xa5\x02\ +\xba\xff\xd7\x01\xa5\x02\xbd\xff\x85\x01\xa5\x02\xbe\xff\xd7\x01\ +\xa5\x02\xbf\xff\x9a\x01\xa5\x02\xc0\xff\xd7\x01\xa5\x02\xc1\xff\ +\x9a\x01\xa5\x02\xc2\xff\xd7\x01\xa5\x02\xd4\xff\x9a\x01\xa5\x02\ +\xd5\xff\xd7\x01\xa5\x02\xf7\xff\xd7\x01\xa5\x02\xf8\xff\xd7\x01\ +\xa5\x02\xf9\xff\xd7\x01\xa5\x02\xfa\xff\xd7\x01\xa5\x02\xfb\xff\ +\xd7\x01\xa5\x02\xfc\xff\xd7\x01\xa5\x02\xfd\xff\x9a\x01\xa5\x02\ +\xfe\xff\xd7\x01\xa5\x03\x03\xff\xae\x01\xa5\x03\x0d\xff\x9a\x01\ +\xa5\x03\x0e\xff\xc3\x01\xa5\x03\x0f\xff\x9a\x01\xa5\x03\x10\xff\ +\xc3\x01\xa5\x03\x17\xff\x85\x01\xa5\x03\x18\xff\xd7\x01\xa6\x00\ +\x05\xff\xae\x01\xa6\x00\x0a\xff\xae\x01\xa6\x01\x9d\xff\x85\x01\ +\xa6\x01\xa6\xff\x85\x01\xa6\x01\xa8\xff\xd7\x01\xa6\x01\xbc\xff\ +\x9a\x01\xa6\x01\xbd\xff\xd7\x01\xa6\x01\xc1\xff\x9a\x01\xa6\x01\ +\xc4\xff\x85\x01\xa6\x01\xdc\xff\xd7\x01\xa6\x01\xdd\xff\xd7\x01\ +\xa6\x01\xe1\xff\xd7\x01\xa6\x01\xe4\xff\xd7\x01\xa6\x01\xf6\xff\ +\xd7\x01\xa6\x02\x07\xff\xae\x01\xa6\x02\x0b\xff\xae\x01\xa6\x02\ +n\xff\xae\x01\xa6\x02|\xff\x9a\x01\xa6\x02\x80\xff\xae\x01\ +\xa6\x02\x82\xff\xae\x01\xa6\x02\x97\xff\xae\x01\xa6\x02\x9b\xff\ +\xae\x01\xa6\x02\xa7\xff\xae\x01\xa6\x02\xa9\xff\x85\x01\xa6\x02\ +\xaa\xff\xd7\x01\xa6\x02\xb5\xff\x9a\x01\xa6\x02\xb6\xff\xd7\x01\ +\xa6\x02\xb7\xff\x9a\x01\xa6\x02\xb8\xff\xd7\x01\xa6\x02\xb9\xff\ +\x9a\x01\xa6\x02\xba\xff\xd7\x01\xa6\x02\xbd\xff\x85\x01\xa6\x02\ +\xbe\xff\xd7\x01\xa6\x02\xbf\xff\x9a\x01\xa6\x02\xc0\xff\xd7\x01\ +\xa6\x02\xc1\xff\x9a\x01\xa6\x02\xc2\xff\xd7\x01\xa6\x02\xd4\xff\ +\x9a\x01\xa6\x02\xd5\xff\xd7\x01\xa6\x02\xf7\xff\xd7\x01\xa6\x02\ +\xf8\xff\xd7\x01\xa6\x02\xf9\xff\xd7\x01\xa6\x02\xfa\xff\xd7\x01\ +\xa6\x02\xfb\xff\xd7\x01\xa6\x02\xfc\xff\xd7\x01\xa6\x02\xfd\xff\ +\x9a\x01\xa6\x02\xfe\xff\xd7\x01\xa6\x03\x03\xff\xae\x01\xa6\x03\ +\x0d\xff\x9a\x01\xa6\x03\x0e\xff\xc3\x01\xa6\x03\x0f\xff\x9a\x01\ +\xa6\x03\x10\xff\xc3\x01\xa6\x03\x17\xff\x85\x01\xa6\x03\x18\xff\ +\xd7\x01\xa7\x01\x9f\xff\xd7\x01\xa7\x01\xb8\xff\xd7\x01\xa7\x01\ +\xbb\xff\xd7\x01\xa7\x01\xbe\xff\xd7\x01\xa7\x01\xc1\xff\xd7\x01\ +\xa7\x01\xe1\xff\xd7\x01\xa7\x02l\xff\xd7\x01\xa7\x02|\xff\ +\xd7\x01\xa7\x02~\xff\xd7\x01\xa7\x02\x84\xff\xd7\x01\xa7\x02\ +\x86\xff\xd7\x01\xa7\x02\x88\xff\xd7\x01\xa7\x02\x8a\xff\xd7\x01\ +\xa7\x02\x8c\xff\xd7\x01\xa7\x02\xb1\xff\xd7\x01\xa7\x02\xb3\xff\ +\xd7\x01\xa7\x02\xbf\xff\xd7\x01\xa7\x02\xc0\xff\xd7\x01\xa7\x02\ +\xc1\xff\xd7\x01\xa7\x02\xc2\xff\xd7\x01\xa7\x02\xc5\xff\x9a\x01\ +\xa7\x02\xc7\xff\x9a\x01\xa7\x02\xd4\xff\xd7\x01\xa7\x02\xd5\xff\ +\xd7\x01\xa7\x02\xef\xff\xd7\x01\xa7\x02\xf1\xff\xd7\x01\xa7\x02\ +\xf3\xff\xd7\x01\xa7\x02\xfd\xff\xd7\x01\xa7\x02\xfe\xff\xd7\x01\ +\xa7\x03\x09\xff\xd7\x01\xa7\x03\x0b\xff\xd7\x01\xa7\x03\x0e\xff\ +\xd7\x01\xa7\x03\x10\xff\xd7\x01\xa7\x03\x15\xff\xd7\x01\xa7\x03\ +\x19\xff\xec\x01\xa8\x00\x0f\xff\x85\x01\xa8\x00\x11\xff\x85\x01\ +\xa8\x01\x9f\xff\xec\x01\xa8\x01\xa4\xff\x9a\x01\xa8\x01\xaa\xff\ +q\x01\xa8\x01\xae\xff\x9a\x01\xa8\x01\xb5\xff\x9a\x01\xa8\x01\ +\xb8\xff\xec\x01\xa8\x01\xbb\xff\xec\x01\xa8\x01\xbe\xff\xc3\x01\ +\xa8\x01\xc9\xff\xec\x01\xa8\x01\xce\xff\xae\x01\xa8\x01\xcf\xff\ +\xd7\x01\xa8\x01\xd5\xff\xae\x01\xa8\x01\xd8\xff\xd7\x01\xa8\x01\ +\xdb\xff\xd7\x01\xa8\x01\xde\xff\xd7\x01\xa8\x01\xe1\xff\xd7\x01\ +\xa8\x01\xea\xff\xd7\x01\xa8\x01\xeb\x00f\x01\xa8\x01\xed\xff\ +\xd7\x01\xa8\x01\xee\xff\xec\x01\xa8\x01\xf2\xff\xae\x01\xa8\x01\ +\xf4\x00f\x01\xa8\x02\x08\xff\x85\x01\xa8\x02\x0c\xff\x85\x01\ +\xa8\x02j\xff\xd7\x01\xa8\x02l\xff\xec\x01\xa8\x02r\xff\ +q\x01\xa8\x02s\xff\xae\x01\xa8\x02~\xff\xec\x01\xa8\x02\ +\x7f\xff\xd7\x01\xa8\x02\x84\xff\xec\x01\xa8\x02\x85\xff\xd7\x01\ +\xa8\x02\x86\xff\xec\x01\xa8\x02\x87\xff\xd7\x01\xa8\x02\x88\xff\ +\xec\x01\xa8\x02\x89\xff\xd7\x01\xa8\x02\x8a\xff\xec\x01\xa8\x02\ +\x8c\xff\xec\x01\xa8\x02\x8d\xff\xd7\x01\xa8\x02\x98\x00f\x01\ +\xa8\x02\xa8\x00f\x01\xa8\x02\xb1\xff\xec\x01\xa8\x02\xb2\xff\ +\xd7\x01\xa8\x02\xb3\xff\xec\x01\xa8\x02\xb4\xff\xd7\x01\xa8\x02\ +\xc0\xff\xd7\x01\xa8\x02\xc2\xff\xd7\x01\xa8\x02\xc5\xff\xd7\x01\ +\xa8\x02\xc6\xff\xc3\x01\xa8\x02\xc7\xff\xd7\x01\xa8\x02\xc8\xff\ +\xc3\x01\xa8\x02\xce\xff\x9a\x01\xa8\x02\xcf\xff\xae\x01\xa8\x02\ +\xd5\xff\xd7\x01\xa8\x02\xd9\xffq\x01\xa8\x02\xdb\xffq\x01\ +\xa8\x02\xdd\xffq\x01\xa8\x02\xe0\xff\xd7\x01\xa8\x02\xef\xff\ +\xec\x01\xa8\x02\xf0\xff\xd7\x01\xa8\x02\xf1\xff\xec\x01\xa8\x02\ +\xf2\xff\xd7\x01\xa8\x02\xf3\xff\xec\x01\xa8\x02\xf4\xff\xd7\x01\ +\xa8\x02\xfe\xff\xd7\x01\xa8\x03\x09\xffq\x01\xa8\x03\x0a\xff\ +\xd7\x01\xa8\x03\x0b\xffq\x01\xa8\x03\x0c\xff\xd7\x01\xa8\x03\ +\x11\xff\x9a\x01\xa8\x03\x12\xff\xae\x01\xa8\x03\x15\xff\xec\x01\ +\xa8\x03\x16\xff\xd7\x01\xa8\x03\x1a\xff\xd7\x01\xa8\x03\x1b\xff\ +\x9a\x01\xa8\x03\x1c\xff\xae\x01\xaa\x00\x05\xffq\x01\xaa\x00\ +\x0a\xffq\x01\xaa\x01\x9d\xff\x9a\x01\xaa\x01\xa6\xff\x9a\x01\ +\xaa\x01\xbc\xffq\x01\xaa\x01\xbe\xff\xd7\x01\xaa\x01\xc1\xff\ +\x9a\x01\xaa\x01\xc4\xff\x9a\x01\xaa\x01\xdc\xff\xd7\x01\xaa\x01\ +\xe1\xff\xd7\x01\xaa\x01\xe4\xff\xd7\x01\xaa\x02\x07\xffq\x01\ +\xaa\x02\x0b\xffq\x01\xaa\x02n\xff\xd7\x01\xaa\x02|\xff\ +\x9a\x01\xaa\x02\x80\xff\xae\x01\xaa\x02\x82\xff\xae\x01\xaa\x02\ +\x97\xff\xd7\x01\xaa\x02\x9b\xff\xd7\x01\xaa\x02\xa7\xff\xd7\x01\ +\xaa\x02\xa9\xff\x9a\x01\xaa\x02\xaa\xff\xd7\x01\xaa\x02\xb5\xff\ +q\x01\xaa\x02\xb6\xff\xd7\x01\xaa\x02\xb7\xff\x85\x01\xaa\x02\ +\xb9\xff\x85\x01\xaa\x02\xbd\xff\x9a\x01\xaa\x02\xbe\xff\xd7\x01\ +\xaa\x02\xbf\xff\x9a\x01\xaa\x02\xc0\xff\xd7\x01\xaa\x02\xc1\xff\ +\x9a\x01\xaa\x02\xc2\xff\xd7\x01\xaa\x02\xc5\xff\x9a\x01\xaa\x02\ +\xc7\xff\x9a\x01\xaa\x02\xd4\xff\x9a\x01\xaa\x02\xd5\xff\xd7\x01\ +\xaa\x02\xe1\xff\xd7\x01\xaa\x02\xe3\xff\xd7\x01\xaa\x02\xfd\xff\ +\x9a\x01\xaa\x02\xfe\xff\xd7\x01\xaa\x03\x03\xff\xd7\x01\xaa\x03\ +\x0d\xffq\x01\xaa\x03\x0e\xff\xd7\x01\xaa\x03\x0f\xffq\x01\ +\xaa\x03\x10\xff\xd7\x01\xaa\x03\x17\xff\x9a\x01\xaa\x03\x18\xff\ +\xd7\x01\xab\x00\x05\xff\xd7\x01\xab\x00\x0a\xff\xd7\x01\xab\x01\ +\xaa\xff\xec\x01\xab\x01\xc1\xff\xd7\x01\xab\x02\x07\xff\xd7\x01\ +\xab\x02\x0b\xff\xd7\x01\xab\x02r\xff\xec\x01\xab\x02|\xff\ +\xd7\x01\xab\x02\xbf\xff\xd7\x01\xab\x02\xc1\xff\xd7\x01\xab\x02\ +\xc5\xff\xd7\x01\xab\x02\xc7\xff\xd7\x01\xab\x02\xd4\xff\xd7\x01\ +\xab\x02\xd9\xff\xec\x01\xab\x02\xdb\xff\xec\x01\xab\x02\xdd\xff\ +\xec\x01\xab\x02\xfd\xff\xd7\x01\xac\x00\x0f\xff\xae\x01\xac\x00\ +\x11\xff\xae\x01\xac\x02\x08\xff\xae\x01\xac\x02\x0c\xff\xae\x01\ +\xac\x02\x80\xff\xec\x01\xac\x02\x82\xff\xec\x01\xac\x02\xb7\xff\ +\xec\x01\xac\x02\xb9\xff\xec\x01\xac\x03\x0d\xff\xd7\x01\xac\x03\ +\x0f\xff\xd7\x01\xad\x00\x0f\xff\x85\x01\xad\x00\x10\xff\xae\x01\ +\xad\x00\x11\xff\x85\x01\xad\x01\x9f\xff\xd7\x01\xad\x01\xa4\xff\ +\x9a\x01\xad\x01\xaa\xffq\x01\xad\x01\xae\xff\x9a\x01\xad\x01\ +\xb5\xff\x9a\x01\xad\x01\xb8\xff\xd7\x01\xad\x01\xbb\xff\xd7\x01\ +\xad\x01\xbc\x00)\x01\xad\x01\xbe\xff\xae\x01\xad\x01\xcc\xff\ +\x9a\x01\xad\x01\xcd\xff\x9a\x01\xad\x01\xce\xff\x85\x01\xad\x01\ +\xcf\xffq\x01\xad\x01\xd0\xff\xd7\x01\xad\x01\xd1\xff\xd7\x01\ +\xad\x01\xd2\xff\x9a\x01\xad\x01\xd3\xff\x9a\x01\xad\x01\xd4\xff\ +\x9a\x01\xad\x01\xd5\xff\x85\x01\xad\x01\xd6\xff\x9a\x01\xad\x01\ +\xd7\xff\x9a\x01\xad\x01\xd8\xffq\x01\xad\x01\xd9\xff\x9a\x01\ +\xad\x01\xda\xff\x9a\x01\xad\x01\xdb\xffq\x01\xad\x01\xdc\xff\ +\xae\x01\xad\x01\xdd\xff\xae\x01\xad\x01\xde\xffq\x01\xad\x01\ +\xdf\xff\xd7\x01\xad\x01\xe0\xff\x9a\x01\xad\x01\xe1\xff\x9a\x01\ +\xad\x01\xe2\xff\x9a\x01\xad\x01\xe3\xff\x9a\x01\xad\x01\xe4\xff\ +\xae\x01\xad\x01\xe5\xff\x9a\x01\xad\x01\xe6\xff\x9a\x01\xad\x01\ +\xe7\xff\xd7\x01\xad\x01\xe8\xff\x9a\x01\xad\x01\xe9\xff\xc3\x01\ +\xad\x01\xea\xffq\x01\xad\x01\xec\xff\x9a\x01\xad\x01\xed\xff\ +q\x01\xad\x01\xee\xff\x85\x01\xad\x01\xf2\xff\x85\x01\xad\x01\ +\xf3\xff\x9a\x01\xad\x01\xf5\xff\x9a\x01\xad\x01\xf6\xff\xae\x01\ +\xad\x01\xf7\xff\x9a\x01\xad\x01\xf9\xff\x9a\x01\xad\x02\x02\xff\ +\xae\x01\xad\x02\x03\xff\xae\x01\xad\x02\x04\xff\xae\x01\xad\x02\ +\x08\xff\x85\x01\xad\x02\x0c\xff\x85\x01\xad\x02j\xffq\x01\ +\xad\x02k\xff\x9a\x01\xad\x02l\xff\xd7\x01\xad\x02m\xff\ +\xd7\x01\xad\x02q\xff\x9a\x01\xad\x02r\xffq\x01\xad\x02\ +s\xff\x85\x01\xad\x02u\xff\x9a\x01\xad\x02w\xff\x9a\x01\ +\xad\x02y\xff\x9a\x01\xad\x02}\xff\x9a\x01\xad\x02~\xff\ +\xd7\x01\xad\x02\x7f\xffq\x01\xad\x02\x81\xff\xd7\x01\xad\x02\ +\x83\xff\xd7\x01\xad\x02\x84\xff\xd7\x01\xad\x02\x85\xffq\x01\ +\xad\x02\x86\xff\xd7\x01\xad\x02\x87\xffq\x01\xad\x02\x88\xff\ +\xd7\x01\xad\x02\x89\xffq\x01\xad\x02\x8a\xff\xd7\x01\xad\x02\ +\x8b\xff\xd7\x01\xad\x02\x8c\xff\xd7\x01\xad\x02\x8d\xffq\x01\ +\xad\x02\x96\xff\x9a\x01\xad\x02\x9a\xff\x9a\x01\xad\x02\x9e\xff\ +\x9a\x01\xad\x02\xa0\xff\xd7\x01\xad\x02\xa2\xff\xd7\x01\xad\x02\ +\xa4\xff\x9a\x01\xad\x02\xa6\xff\x9a\x01\xad\x02\xaa\xff\xae\x01\ +\xad\x02\xac\xff\x9a\x01\xad\x02\xae\xff\x9a\x01\xad\x02\xb0\xff\ +\x9a\x01\xad\x02\xb1\xff\xd7\x01\xad\x02\xb2\xffq\x01\xad\x02\ +\xb3\xff\xd7\x01\xad\x02\xb4\xffq\x01\xad\x02\xb5\x00)\x01\ +\xad\x02\xb6\xff\xae\x01\xad\x02\xb8\xff\xae\x01\xad\x02\xba\xff\ +\xae\x01\xad\x02\xbc\xff\xd7\x01\xad\x02\xbe\xff\xae\x01\xad\x02\ +\xc0\xff\x9a\x01\xad\x02\xc2\xff\x9a\x01\xad\x02\xc4\xff\x9a\x01\ +\xad\x02\xc5\xff\x9a\x01\xad\x02\xc6\xffq\x01\xad\x02\xc7\xff\ +\x9a\x01\xad\x02\xc8\xffq\x01\xad\x02\xcb\xff\xd7\x01\xad\x02\ +\xcd\xff\x9a\x01\xad\x02\xce\xff\x9a\x01\xad\x02\xcf\xff\x85\x01\ +\xad\x02\xd1\xff\x9a\x01\xad\x02\xd3\xff\x9a\x01\xad\x02\xd5\xff\ +\x9a\x01\xad\x02\xd7\xff\x9a\x01\xad\x02\xd9\xffq\x01\xad\x02\ +\xdb\xffq\x01\xad\x02\xdd\xffq\x01\xad\x02\xe0\xffq\x01\ +\xad\x02\xe6\xff\xd7\x01\xad\x02\xe8\xff\xd7\x01\xad\x02\xea\xff\ +\xc3\x01\xad\x02\xec\xff\x9a\x01\xad\x02\xee\xff\x9a\x01\xad\x02\ +\xef\xff\xd7\x01\xad\x02\xf0\xffq\x01\xad\x02\xf1\xff\xd7\x01\ +\xad\x02\xf2\xffq\x01\xad\x02\xf3\xff\xd7\x01\xad\x02\xf4\xff\ +q\x01\xad\x02\xf6\xff\xd7\x01\xad\x02\xf8\xff\xae\x01\xad\x02\ +\xfa\xff\xae\x01\xad\x02\xfc\xff\xae\x01\xad\x02\xfe\xff\x9a\x01\ +\xad\x03\x00\xff\x9a\x01\xad\x03\x02\xff\x9a\x01\xad\x03\x06\xff\ +\xd7\x01\xad\x03\x08\xff\xd7\x01\xad\x03\x09\xffq\x01\xad\x03\ +\x0a\xffq\x01\xad\x03\x0b\xffq\x01\xad\x03\x0c\xffq\x01\ +\xad\x03\x0e\xff\x9a\x01\xad\x03\x10\xff\x9a\x01\xad\x03\x11\xff\ +\x9a\x01\xad\x03\x12\xff\x85\x01\xad\x03\x14\xff\x9a\x01\xad\x03\ +\x15\xff\xd7\x01\xad\x03\x16\xffq\x01\xad\x03\x18\xff\xae\x01\ +\xad\x03\x1a\xffq\x01\xad\x03\x1b\xff\x9a\x01\xad\x03\x1c\xff\ +\x85\x01\xae\x01\xa3\x00\xe1\x01\xae\x02\xea\x00)\x01\xae\x03\ +\x0e\xff\xd7\x01\xae\x03\x10\xff\xd7\x01\xb0\x01\x9f\xff\xd7\x01\ +\xb0\x01\xb8\xff\xd7\x01\xb0\x01\xbb\xff\xd7\x01\xb0\x01\xbe\xff\ +\xd7\x01\xb0\x01\xc1\xff\xd7\x01\xb0\x01\xe1\xff\xd7\x01\xb0\x02\ +l\xff\xd7\x01\xb0\x02|\xff\xd7\x01\xb0\x02~\xff\xd7\x01\ +\xb0\x02\x84\xff\xd7\x01\xb0\x02\x86\xff\xd7\x01\xb0\x02\x88\xff\ +\xd7\x01\xb0\x02\x8a\xff\xd7\x01\xb0\x02\x8c\xff\xd7\x01\xb0\x02\ +\xb1\xff\xd7\x01\xb0\x02\xb3\xff\xd7\x01\xb0\x02\xbf\xff\xd7\x01\ +\xb0\x02\xc0\xff\xd7\x01\xb0\x02\xc1\xff\xd7\x01\xb0\x02\xc2\xff\ +\xd7\x01\xb0\x02\xc5\xff\x9a\x01\xb0\x02\xc7\xff\x9a\x01\xb0\x02\ +\xd4\xff\xd7\x01\xb0\x02\xd5\xff\xd7\x01\xb0\x02\xef\xff\xd7\x01\ +\xb0\x02\xf1\xff\xd7\x01\xb0\x02\xf3\xff\xd7\x01\xb0\x02\xfd\xff\ +\xd7\x01\xb0\x02\xfe\xff\xd7\x01\xb0\x03\x09\xff\xd7\x01\xb0\x03\ +\x0b\xff\xd7\x01\xb0\x03\x0e\xff\xd7\x01\xb0\x03\x10\xff\xd7\x01\ +\xb0\x03\x15\xff\xd7\x01\xb0\x03\x19\xff\xec\x01\xb1\x00\x0f\xff\ +\xae\x01\xb1\x00\x11\xff\xae\x01\xb1\x02\x08\xff\xae\x01\xb1\x02\ +\x0c\xff\xae\x01\xb1\x02\x80\xff\xec\x01\xb1\x02\x82\xff\xec\x01\ +\xb1\x02\xb7\xff\xec\x01\xb1\x02\xb9\xff\xec\x01\xb1\x03\x0d\xff\ +\xd7\x01\xb1\x03\x0f\xff\xd7\x01\xb4\x01\x9f\xff\xd7\x01\xb4\x01\ +\xb8\xff\xd7\x01\xb4\x01\xbb\xff\xd7\x01\xb4\x01\xbe\xff\xd7\x01\ +\xb4\x01\xc1\xff\xd7\x01\xb4\x01\xe1\xff\xd7\x01\xb4\x02l\xff\ +\xd7\x01\xb4\x02|\xff\xd7\x01\xb4\x02~\xff\xd7\x01\xb4\x02\ +\x84\xff\xd7\x01\xb4\x02\x86\xff\xd7\x01\xb4\x02\x88\xff\xd7\x01\ +\xb4\x02\x8a\xff\xd7\x01\xb4\x02\x8c\xff\xd7\x01\xb4\x02\xb1\xff\ +\xd7\x01\xb4\x02\xb3\xff\xd7\x01\xb4\x02\xbf\xff\xd7\x01\xb4\x02\ +\xc0\xff\xd7\x01\xb4\x02\xc1\xff\xd7\x01\xb4\x02\xc2\xff\xd7\x01\ +\xb4\x02\xc5\xff\x9a\x01\xb4\x02\xc7\xff\x9a\x01\xb4\x02\xd4\xff\ +\xd7\x01\xb4\x02\xd5\xff\xd7\x01\xb4\x02\xef\xff\xd7\x01\xb4\x02\ +\xf1\xff\xd7\x01\xb4\x02\xf3\xff\xd7\x01\xb4\x02\xfd\xff\xd7\x01\ +\xb4\x02\xfe\xff\xd7\x01\xb4\x03\x09\xff\xd7\x01\xb4\x03\x0b\xff\ +\xd7\x01\xb4\x03\x0e\xff\xd7\x01\xb4\x03\x10\xff\xd7\x01\xb4\x03\ +\x15\xff\xd7\x01\xb4\x03\x19\xff\xec\x01\xb8\x00\x0f\xff\xae\x01\ +\xb8\x00\x11\xff\xae\x01\xb8\x01\x9d\xff\xec\x01\xb8\x01\xa4\xff\ +\xd7\x01\xb8\x01\xa6\xff\xec\x01\xb8\x01\xa8\xff\xd7\x01\xb8\x01\ +\xaa\xff\xd7\x01\xb8\x01\xae\xff\xd7\x01\xb8\x01\xb0\xff\xd7\x01\ +\xb8\x01\xb1\xff\xec\x01\xb8\x01\xb5\xff\xd7\x01\xb8\x01\xbc\xff\ +\xc3\x01\xb8\x01\xbd\xff\xd7\x01\xb8\x01\xbf\xff\xd7\x01\xb8\x01\ +\xc1\xff\xd7\x01\xb8\x01\xc4\xff\xec\x01\xb8\x01\xc7\xff\xec\x01\ +\xb8\x01\xce\xff\xec\x01\xb8\x01\xd5\xff\xec\x01\xb8\x01\xf2\xff\ +\xec\x01\xb8\x02\x08\xff\xae\x01\xb8\x02\x0c\xff\xae\x01\xb8\x02\ +r\xff\xd7\x01\xb8\x02s\xff\xec\x01\xb8\x02z\xff\xec\x01\ +\xb8\x02|\xff\xd7\x01\xb8\x02\x80\xff\xec\x01\xb8\x02\x82\xff\ +\xec\x01\xb8\x02\x9f\xff\xd7\x01\xb8\x02\xa1\xff\xec\x01\xb8\x02\ +\xa9\xff\xec\x01\xb8\x02\xb5\xff\xc3\x01\xb8\x02\xb7\xff\xec\x01\ +\xb8\x02\xb9\xff\xec\x01\xb8\x02\xbb\xff\xd7\x01\xb8\x02\xbd\xff\ +\xec\x01\xb8\x02\xbf\xff\xd7\x01\xb8\x02\xc1\xff\xd7\x01\xb8\x02\ +\xca\xff\xd7\x01\xb8\x02\xce\xff\xd7\x01\xb8\x02\xcf\xff\xec\x01\ +\xb8\x02\xd4\xff\xd7\x01\xb8\x02\xd9\xff\xd7\x01\xb8\x02\xdb\xff\ +\xd7\x01\xb8\x02\xdd\xff\xd7\x01\xb8\x02\xe5\xff\xd7\x01\xb8\x02\ +\xe7\xff\xec\x01\xb8\x02\xf5\xff\xec\x01\xb8\x02\xf7\xff\xd7\x01\ +\xb8\x02\xf9\xff\xd7\x01\xb8\x02\xfb\xff\xd7\x01\xb8\x02\xfd\xff\ +\xd7\x01\xb8\x03\x05\xff\xd7\x01\xb8\x03\x07\xff\xd7\x01\xb8\x03\ +\x0d\xff\xd7\x01\xb8\x03\x0f\xff\xd7\x01\xb8\x03\x11\xff\xd7\x01\ +\xb8\x03\x12\xff\xec\x01\xb8\x03\x17\xff\xec\x01\xb8\x03\x1b\xff\ +\xd7\x01\xb8\x03\x1c\xff\xec\x01\xba\x00\x0f\xfe\xf6\x01\xba\x00\ +\x11\xfe\xf6\x01\xba\x01\xa4\xff\x85\x01\xba\x01\xaa\xff\x9a\x01\ +\xba\x01\xae\xff\x85\x01\xba\x01\xb0\xff\xd7\x01\xba\x01\xb5\xff\ +\x85\x01\xba\x01\xbf\xff\xd7\x01\xba\x01\xce\xff\x9a\x01\xba\x01\ +\xd5\xff\x9a\x01\xba\x01\xf2\xff\x9a\x01\xba\x02\x08\xfe\xf6\x01\ +\xba\x02\x0c\xfe\xf6\x01\xba\x02r\xff\x9a\x01\xba\x02s\xff\ +\x9a\x01\xba\x02v\xff\xec\x01\xba\x02\x9f\xff\xd7\x01\xba\x02\ +\xbb\xff\xd7\x01\xba\x02\xca\xff\xd7\x01\xba\x02\xce\xff\x85\x01\ +\xba\x02\xcf\xff\x9a\x01\xba\x02\xd9\xff\x9a\x01\xba\x02\xdb\xff\ +\x9a\x01\xba\x02\xdd\xff\x9a\x01\xba\x02\xe5\xff\xd7\x01\xba\x03\ +\x05\xff\xd7\x01\xba\x03\x07\xff\xd7\x01\xba\x03\x09\xff\xae\x01\ +\xba\x03\x0b\xff\xae\x01\xba\x03\x11\xff\x85\x01\xba\x03\x12\xff\ +\x9a\x01\xba\x03\x1b\xff\x85\x01\xba\x03\x1c\xff\x9a\x01\xbb\x01\ +\x9f\xff\xd7\x01\xbb\x01\xb8\xff\xd7\x01\xbb\x01\xbb\xff\xd7\x01\ +\xbb\x01\xbe\xff\xd7\x01\xbb\x01\xe1\xff\xd7\x01\xbb\x02l\xff\ +\xd7\x01\xbb\x02~\xff\xd7\x01\xbb\x02\x84\xff\xd7\x01\xbb\x02\ +\x86\xff\xd7\x01\xbb\x02\x88\xff\xd7\x01\xbb\x02\x8a\xff\xd7\x01\ +\xbb\x02\x8c\xff\xd7\x01\xbb\x02\xb1\xff\xd7\x01\xbb\x02\xb3\xff\ +\xd7\x01\xbb\x02\xc0\xff\xd7\x01\xbb\x02\xc2\xff\xd7\x01\xbb\x02\ +\xc5\xff\xd7\x01\xbb\x02\xc7\xff\xd7\x01\xbb\x02\xd5\xff\xd7\x01\ +\xbb\x02\xef\xff\xd7\x01\xbb\x02\xf1\xff\xd7\x01\xbb\x02\xf3\xff\ +\xd7\x01\xbb\x02\xfe\xff\xd7\x01\xbb\x03\x09\xff\xd7\x01\xbb\x03\ +\x0b\xff\xd7\x01\xbb\x03\x0e\xff\xd7\x01\xbb\x03\x10\xff\xd7\x01\ +\xbb\x03\x15\xff\xd7\x01\xbc\x00\x0f\xff\x85\x01\xbc\x00\x10\xff\ +\xae\x01\xbc\x00\x11\xff\x85\x01\xbc\x01\x9f\xff\xd7\x01\xbc\x01\ +\xa4\xff\x9a\x01\xbc\x01\xaa\xffq\x01\xbc\x01\xae\xff\x9a\x01\ +\xbc\x01\xb5\xff\x9a\x01\xbc\x01\xb8\xff\xd7\x01\xbc\x01\xbb\xff\ +\xd7\x01\xbc\x01\xbc\x00)\x01\xbc\x01\xbe\xff\xae\x01\xbc\x01\ +\xcc\xff\x9a\x01\xbc\x01\xcd\xff\x9a\x01\xbc\x01\xce\xff\x85\x01\ +\xbc\x01\xcf\xffq\x01\xbc\x01\xd0\xff\xd7\x01\xbc\x01\xd1\xff\ +\xd7\x01\xbc\x01\xd2\xff\x9a\x01\xbc\x01\xd3\xff\x9a\x01\xbc\x01\ +\xd4\xff\x9a\x01\xbc\x01\xd5\xff\x85\x01\xbc\x01\xd6\xff\x9a\x01\ +\xbc\x01\xd7\xff\x9a\x01\xbc\x01\xd8\xffq\x01\xbc\x01\xd9\xff\ +\x9a\x01\xbc\x01\xda\xff\x9a\x01\xbc\x01\xdb\xffq\x01\xbc\x01\ +\xdc\xff\xae\x01\xbc\x01\xdd\xff\xae\x01\xbc\x01\xde\xffq\x01\ +\xbc\x01\xdf\xff\xd7\x01\xbc\x01\xe0\xff\x9a\x01\xbc\x01\xe1\xff\ +\x9a\x01\xbc\x01\xe2\xff\x9a\x01\xbc\x01\xe3\xff\x9a\x01\xbc\x01\ +\xe4\xff\xae\x01\xbc\x01\xe5\xff\x9a\x01\xbc\x01\xe6\xff\x9a\x01\ +\xbc\x01\xe7\xff\xd7\x01\xbc\x01\xe8\xff\x9a\x01\xbc\x01\xe9\xff\ +\xc3\x01\xbc\x01\xea\xffq\x01\xbc\x01\xec\xff\x9a\x01\xbc\x01\ +\xed\xffq\x01\xbc\x01\xee\xff\x85\x01\xbc\x01\xf2\xff\x85\x01\ +\xbc\x01\xf3\xff\x9a\x01\xbc\x01\xf5\xff\x9a\x01\xbc\x01\xf6\xff\ +\xae\x01\xbc\x01\xf7\xff\x9a\x01\xbc\x01\xf9\xff\x9a\x01\xbc\x02\ +\x02\xff\xae\x01\xbc\x02\x03\xff\xae\x01\xbc\x02\x04\xff\xae\x01\ +\xbc\x02\x08\xff\x85\x01\xbc\x02\x0c\xff\x85\x01\xbc\x02j\xff\ +q\x01\xbc\x02k\xff\x9a\x01\xbc\x02l\xff\xd7\x01\xbc\x02\ +m\xff\xd7\x01\xbc\x02q\xff\x9a\x01\xbc\x02r\xffq\x01\ +\xbc\x02s\xff\x85\x01\xbc\x02u\xff\x9a\x01\xbc\x02w\xff\ +\x9a\x01\xbc\x02y\xff\x9a\x01\xbc\x02}\xff\x9a\x01\xbc\x02\ +~\xff\xd7\x01\xbc\x02\x7f\xffq\x01\xbc\x02\x81\xff\xd7\x01\ +\xbc\x02\x83\xff\xd7\x01\xbc\x02\x84\xff\xd7\x01\xbc\x02\x85\xff\ +q\x01\xbc\x02\x86\xff\xd7\x01\xbc\x02\x87\xffq\x01\xbc\x02\ +\x88\xff\xd7\x01\xbc\x02\x89\xffq\x01\xbc\x02\x8a\xff\xd7\x01\ +\xbc\x02\x8b\xff\xd7\x01\xbc\x02\x8c\xff\xd7\x01\xbc\x02\x8d\xff\ +q\x01\xbc\x02\x96\xff\x9a\x01\xbc\x02\x9a\xff\x9a\x01\xbc\x02\ +\x9e\xff\x9a\x01\xbc\x02\xa0\xff\xd7\x01\xbc\x02\xa2\xff\xd7\x01\ +\xbc\x02\xa4\xff\x9a\x01\xbc\x02\xa6\xff\x9a\x01\xbc\x02\xaa\xff\ +\xae\x01\xbc\x02\xac\xff\x9a\x01\xbc\x02\xae\xff\x9a\x01\xbc\x02\ +\xb0\xff\x9a\x01\xbc\x02\xb1\xff\xd7\x01\xbc\x02\xb2\xffq\x01\ +\xbc\x02\xb3\xff\xd7\x01\xbc\x02\xb4\xffq\x01\xbc\x02\xb5\x00\ +)\x01\xbc\x02\xb6\xff\xae\x01\xbc\x02\xb8\xff\xae\x01\xbc\x02\ +\xba\xff\xae\x01\xbc\x02\xbc\xff\xd7\x01\xbc\x02\xbe\xff\xae\x01\ +\xbc\x02\xc0\xff\x9a\x01\xbc\x02\xc2\xff\x9a\x01\xbc\x02\xc4\xff\ +\x9a\x01\xbc\x02\xc5\xff\x9a\x01\xbc\x02\xc6\xffq\x01\xbc\x02\ +\xc7\xff\x9a\x01\xbc\x02\xc8\xffq\x01\xbc\x02\xcb\xff\xd7\x01\ +\xbc\x02\xcd\xff\x9a\x01\xbc\x02\xce\xff\x9a\x01\xbc\x02\xcf\xff\ +\x85\x01\xbc\x02\xd1\xff\x9a\x01\xbc\x02\xd3\xff\x9a\x01\xbc\x02\ +\xd5\xff\x9a\x01\xbc\x02\xd7\xff\x9a\x01\xbc\x02\xd9\xffq\x01\ +\xbc\x02\xdb\xffq\x01\xbc\x02\xdd\xffq\x01\xbc\x02\xe0\xff\ +q\x01\xbc\x02\xe6\xff\xd7\x01\xbc\x02\xe8\xff\xd7\x01\xbc\x02\ +\xea\xff\xc3\x01\xbc\x02\xec\xff\x9a\x01\xbc\x02\xee\xff\x9a\x01\ +\xbc\x02\xef\xff\xd7\x01\xbc\x02\xf0\xffq\x01\xbc\x02\xf1\xff\ +\xd7\x01\xbc\x02\xf2\xffq\x01\xbc\x02\xf3\xff\xd7\x01\xbc\x02\ +\xf4\xffq\x01\xbc\x02\xf6\xff\xd7\x01\xbc\x02\xf8\xff\xae\x01\ +\xbc\x02\xfa\xff\xae\x01\xbc\x02\xfc\xff\xae\x01\xbc\x02\xfe\xff\ +\x9a\x01\xbc\x03\x00\xff\x9a\x01\xbc\x03\x02\xff\x9a\x01\xbc\x03\ +\x06\xff\xd7\x01\xbc\x03\x08\xff\xd7\x01\xbc\x03\x09\xffq\x01\ +\xbc\x03\x0a\xffq\x01\xbc\x03\x0b\xffq\x01\xbc\x03\x0c\xff\ +q\x01\xbc\x03\x0e\xff\x9a\x01\xbc\x03\x10\xff\x9a\x01\xbc\x03\ +\x11\xff\x9a\x01\xbc\x03\x12\xff\x85\x01\xbc\x03\x14\xff\x9a\x01\ +\xbc\x03\x15\xff\xd7\x01\xbc\x03\x16\xffq\x01\xbc\x03\x18\xff\ +\xae\x01\xbc\x03\x1a\xffq\x01\xbc\x03\x1b\xff\x9a\x01\xbc\x03\ +\x1c\xff\x85\x01\xbd\x00\x0f\xff\x85\x01\xbd\x00\x11\xff\x85\x01\ +\xbd\x01\x9f\xff\xec\x01\xbd\x01\xa4\xff\x9a\x01\xbd\x01\xaa\xff\ +q\x01\xbd\x01\xae\xff\x9a\x01\xbd\x01\xb5\xff\x9a\x01\xbd\x01\ +\xb8\xff\xec\x01\xbd\x01\xbb\xff\xec\x01\xbd\x01\xbe\xff\xc3\x01\ +\xbd\x01\xc9\xff\xec\x01\xbd\x01\xce\xff\xae\x01\xbd\x01\xcf\xff\ +\xd7\x01\xbd\x01\xd5\xff\xae\x01\xbd\x01\xd8\xff\xd7\x01\xbd\x01\ +\xdb\xff\xd7\x01\xbd\x01\xde\xff\xd7\x01\xbd\x01\xe1\xff\xd7\x01\ +\xbd\x01\xea\xff\xd7\x01\xbd\x01\xeb\x00f\x01\xbd\x01\xed\xff\ +\xd7\x01\xbd\x01\xee\xff\xec\x01\xbd\x01\xf2\xff\xae\x01\xbd\x01\ +\xf4\x00f\x01\xbd\x02\x08\xff\x85\x01\xbd\x02\x0c\xff\x85\x01\ +\xbd\x02j\xff\xd7\x01\xbd\x02l\xff\xec\x01\xbd\x02r\xff\ +q\x01\xbd\x02s\xff\xae\x01\xbd\x02~\xff\xec\x01\xbd\x02\ +\x7f\xff\xd7\x01\xbd\x02\x84\xff\xec\x01\xbd\x02\x85\xff\xd7\x01\ +\xbd\x02\x86\xff\xec\x01\xbd\x02\x87\xff\xd7\x01\xbd\x02\x88\xff\ +\xec\x01\xbd\x02\x89\xff\xd7\x01\xbd\x02\x8a\xff\xec\x01\xbd\x02\ +\x8c\xff\xec\x01\xbd\x02\x8d\xff\xd7\x01\xbd\x02\x98\x00f\x01\ +\xbd\x02\xa8\x00f\x01\xbd\x02\xb1\xff\xec\x01\xbd\x02\xb2\xff\ +\xd7\x01\xbd\x02\xb3\xff\xec\x01\xbd\x02\xb4\xff\xd7\x01\xbd\x02\ +\xc0\xff\xd7\x01\xbd\x02\xc2\xff\xd7\x01\xbd\x02\xc5\xff\xd7\x01\ +\xbd\x02\xc6\xff\xc3\x01\xbd\x02\xc7\xff\xd7\x01\xbd\x02\xc8\xff\ +\xc3\x01\xbd\x02\xce\xff\x9a\x01\xbd\x02\xcf\xff\xae\x01\xbd\x02\ +\xd5\xff\xd7\x01\xbd\x02\xd9\xffq\x01\xbd\x02\xdb\xffq\x01\ +\xbd\x02\xdd\xffq\x01\xbd\x02\xe0\xff\xd7\x01\xbd\x02\xef\xff\ +\xec\x01\xbd\x02\xf0\xff\xd7\x01\xbd\x02\xf1\xff\xec\x01\xbd\x02\ +\xf2\xff\xd7\x01\xbd\x02\xf3\xff\xec\x01\xbd\x02\xf4\xff\xd7\x01\ +\xbd\x02\xfe\xff\xd7\x01\xbd\x03\x09\xffq\x01\xbd\x03\x0a\xff\ +\xd7\x01\xbd\x03\x0b\xffq\x01\xbd\x03\x0c\xff\xd7\x01\xbd\x03\ +\x11\xff\x9a\x01\xbd\x03\x12\xff\xae\x01\xbd\x03\x15\xff\xec\x01\ +\xbd\x03\x16\xff\xd7\x01\xbd\x03\x1a\xff\xd7\x01\xbd\x03\x1b\xff\ +\x9a\x01\xbd\x03\x1c\xff\xae\x01\xbe\x00\x0f\xff\xae\x01\xbe\x00\ +\x11\xff\xae\x01\xbe\x01\x9d\xff\xd7\x01\xbe\x01\xa4\xff\xd7\x01\ +\xbe\x01\xa6\xff\xd7\x01\xbe\x01\xa8\xff\xc3\x01\xbe\x01\xaa\xff\ +\xd7\x01\xbe\x01\xae\xff\xd7\x01\xbe\x01\xb0\xff\xd7\x01\xbe\x01\ +\xb1\xff\xd7\x01\xbe\x01\xb5\xff\xd7\x01\xbe\x01\xbc\xff\xc3\x01\ +\xbe\x01\xbd\xff\xc3\x01\xbe\x01\xbf\xff\xd7\x01\xbe\x01\xc4\xff\ +\xd7\x01\xbe\x01\xc7\xff\xd7\x01\xbe\x01\xce\xff\xec\x01\xbe\x01\ +\xd5\xff\xec\x01\xbe\x01\xf2\xff\xec\x01\xbe\x02\x08\xff\xae\x01\ +\xbe\x02\x0c\xff\xae\x01\xbe\x02r\xff\xd7\x01\xbe\x02s\xff\ +\xec\x01\xbe\x02z\xff\xd7\x01\xbe\x02\x80\xff\xec\x01\xbe\x02\ +\x82\xff\xec\x01\xbe\x02\x9f\xff\xd7\x01\xbe\x02\xa1\xff\xd7\x01\ +\xbe\x02\xa9\xff\xd7\x01\xbe\x02\xb5\xff\xc3\x01\xbe\x02\xb7\xff\ +\xc3\x01\xbe\x02\xb9\xff\xc3\x01\xbe\x02\xbb\xff\xd7\x01\xbe\x02\ +\xbd\xff\xd7\x01\xbe\x02\xca\xff\xd7\x01\xbe\x02\xce\xff\xd7\x01\ +\xbe\x02\xcf\xff\xec\x01\xbe\x02\xd9\xff\xd7\x01\xbe\x02\xdb\xff\ +\xd7\x01\xbe\x02\xdd\xff\xd7\x01\xbe\x02\xe5\xff\xd7\x01\xbe\x02\ +\xe7\xff\xd7\x01\xbe\x02\xf5\xff\xd7\x01\xbe\x02\xf7\xff\xc3\x01\ +\xbe\x02\xf9\xff\xc3\x01\xbe\x02\xfb\xff\xc3\x01\xbe\x03\x05\xff\ +\xd7\x01\xbe\x03\x07\xff\xd7\x01\xbe\x03\x0d\xff\xd7\x01\xbe\x03\ +\x0f\xff\xd7\x01\xbe\x03\x11\xff\xd7\x01\xbe\x03\x12\xff\xec\x01\ +\xbe\x03\x17\xff\xd7\x01\xbe\x03\x1b\xff\xd7\x01\xbe\x03\x1c\xff\ +\xec\x01\xbf\x01\x9f\xff\xd7\x01\xbf\x01\xb8\xff\xd7\x01\xbf\x01\ +\xbb\xff\xd7\x01\xbf\x01\xbe\xff\xd7\x01\xbf\x01\xc1\xff\xd7\x01\ +\xbf\x01\xe1\xff\xd7\x01\xbf\x02l\xff\xd7\x01\xbf\x02|\xff\ +\xd7\x01\xbf\x02~\xff\xd7\x01\xbf\x02\x84\xff\xd7\x01\xbf\x02\ +\x86\xff\xd7\x01\xbf\x02\x88\xff\xd7\x01\xbf\x02\x8a\xff\xd7\x01\ +\xbf\x02\x8c\xff\xd7\x01\xbf\x02\xb1\xff\xd7\x01\xbf\x02\xb3\xff\ +\xd7\x01\xbf\x02\xbf\xff\xd7\x01\xbf\x02\xc0\xff\xd7\x01\xbf\x02\ +\xc1\xff\xd7\x01\xbf\x02\xc2\xff\xd7\x01\xbf\x02\xc5\xff\x9a\x01\ +\xbf\x02\xc7\xff\x9a\x01\xbf\x02\xd4\xff\xd7\x01\xbf\x02\xd5\xff\ +\xd7\x01\xbf\x02\xef\xff\xd7\x01\xbf\x02\xf1\xff\xd7\x01\xbf\x02\ +\xf3\xff\xd7\x01\xbf\x02\xfd\xff\xd7\x01\xbf\x02\xfe\xff\xd7\x01\ +\xbf\x03\x09\xff\xd7\x01\xbf\x03\x0b\xff\xd7\x01\xbf\x03\x0e\xff\ +\xd7\x01\xbf\x03\x10\xff\xd7\x01\xbf\x03\x15\xff\xd7\x01\xbf\x03\ +\x19\xff\xec\x01\xc0\x01\xa3\x00\xe1\x01\xc0\x02\xea\x00)\x01\ +\xc0\x03\x0e\xff\xd7\x01\xc0\x03\x10\xff\xd7\x01\xc3\x01\xa3\x00\ +\xe1\x01\xc3\x02\xea\x00)\x01\xc3\x03\x0e\xff\xd7\x01\xc3\x03\ +\x10\xff\xd7\x01\xc4\x00\x05\xff\xae\x01\xc4\x00\x0a\xff\xae\x01\ +\xc4\x01\x9d\xff\x85\x01\xc4\x01\xa6\xff\x85\x01\xc4\x01\xa8\xff\ +\xd7\x01\xc4\x01\xbc\xff\x9a\x01\xc4\x01\xbd\xff\xd7\x01\xc4\x01\ +\xc1\xff\x9a\x01\xc4\x01\xc4\xff\x85\x01\xc4\x01\xdc\xff\xd7\x01\ +\xc4\x01\xdd\xff\xd7\x01\xc4\x01\xe1\xff\xd7\x01\xc4\x01\xe4\xff\ +\xd7\x01\xc4\x01\xf6\xff\xd7\x01\xc4\x02\x07\xff\xae\x01\xc4\x02\ +\x0b\xff\xae\x01\xc4\x02n\xff\xae\x01\xc4\x02|\xff\x9a\x01\ +\xc4\x02\x80\xff\xae\x01\xc4\x02\x82\xff\xae\x01\xc4\x02\x97\xff\ +\xae\x01\xc4\x02\x9b\xff\xae\x01\xc4\x02\xa7\xff\xae\x01\xc4\x02\ +\xa9\xff\x85\x01\xc4\x02\xaa\xff\xd7\x01\xc4\x02\xb5\xff\x9a\x01\ +\xc4\x02\xb6\xff\xd7\x01\xc4\x02\xb7\xff\x9a\x01\xc4\x02\xb8\xff\ +\xd7\x01\xc4\x02\xb9\xff\x9a\x01\xc4\x02\xba\xff\xd7\x01\xc4\x02\ +\xbd\xff\x85\x01\xc4\x02\xbe\xff\xd7\x01\xc4\x02\xbf\xff\x9a\x01\ +\xc4\x02\xc0\xff\xd7\x01\xc4\x02\xc1\xff\x9a\x01\xc4\x02\xc2\xff\ +\xd7\x01\xc4\x02\xd4\xff\x9a\x01\xc4\x02\xd5\xff\xd7\x01\xc4\x02\ +\xf7\xff\xd7\x01\xc4\x02\xf8\xff\xd7\x01\xc4\x02\xf9\xff\xd7\x01\ +\xc4\x02\xfa\xff\xd7\x01\xc4\x02\xfb\xff\xd7\x01\xc4\x02\xfc\xff\ +\xd7\x01\xc4\x02\xfd\xff\x9a\x01\xc4\x02\xfe\xff\xd7\x01\xc4\x03\ +\x03\xff\xae\x01\xc4\x03\x0d\xff\x9a\x01\xc4\x03\x0e\xff\xc3\x01\ +\xc4\x03\x0f\xff\x9a\x01\xc4\x03\x10\xff\xc3\x01\xc4\x03\x17\xff\ +\x85\x01\xc4\x03\x18\xff\xd7\x01\xc6\x00\x05\xff\xae\x01\xc6\x00\ +\x0a\xff\xae\x01\xc6\x01\x9d\xff\x85\x01\xc6\x01\xa6\xff\x85\x01\ +\xc6\x01\xa8\xff\xd7\x01\xc6\x01\xbc\xff\x9a\x01\xc6\x01\xbd\xff\ +\xd7\x01\xc6\x01\xc1\xff\x9a\x01\xc6\x01\xc4\xff\x85\x01\xc6\x01\ +\xdc\xff\xd7\x01\xc6\x01\xdd\xff\xd7\x01\xc6\x01\xe1\xff\xd7\x01\ +\xc6\x01\xe4\xff\xd7\x01\xc6\x01\xf6\xff\xd7\x01\xc6\x02\x07\xff\ +\xae\x01\xc6\x02\x0b\xff\xae\x01\xc6\x02n\xff\xae\x01\xc6\x02\ +|\xff\x9a\x01\xc6\x02\x80\xff\xae\x01\xc6\x02\x82\xff\xae\x01\ +\xc6\x02\x97\xff\xae\x01\xc6\x02\x9b\xff\xae\x01\xc6\x02\xa7\xff\ +\xae\x01\xc6\x02\xa9\xff\x85\x01\xc6\x02\xaa\xff\xd7\x01\xc6\x02\ +\xb5\xff\x9a\x01\xc6\x02\xb6\xff\xd7\x01\xc6\x02\xb7\xff\x9a\x01\ +\xc6\x02\xb8\xff\xd7\x01\xc6\x02\xb9\xff\x9a\x01\xc6\x02\xba\xff\ +\xd7\x01\xc6\x02\xbd\xff\x85\x01\xc6\x02\xbe\xff\xd7\x01\xc6\x02\ +\xbf\xff\x9a\x01\xc6\x02\xc0\xff\xd7\x01\xc6\x02\xc1\xff\x9a\x01\ +\xc6\x02\xc2\xff\xd7\x01\xc6\x02\xd4\xff\x9a\x01\xc6\x02\xd5\xff\ +\xd7\x01\xc6\x02\xf7\xff\xd7\x01\xc6\x02\xf8\xff\xd7\x01\xc6\x02\ +\xf9\xff\xd7\x01\xc6\x02\xfa\xff\xd7\x01\xc6\x02\xfb\xff\xd7\x01\ +\xc6\x02\xfc\xff\xd7\x01\xc6\x02\xfd\xff\x9a\x01\xc6\x02\xfe\xff\ +\xd7\x01\xc6\x03\x03\xff\xae\x01\xc6\x03\x0d\xff\x9a\x01\xc6\x03\ +\x0e\xff\xc3\x01\xc6\x03\x0f\xff\x9a\x01\xc6\x03\x10\xff\xc3\x01\ +\xc6\x03\x17\xff\x85\x01\xc6\x03\x18\xff\xd7\x01\xc7\x00\x0f\xff\ +\xae\x01\xc7\x00\x11\xff\xae\x01\xc7\x01\x9d\xff\xec\x01\xc7\x01\ +\xa4\xff\xd7\x01\xc7\x01\xa6\xff\xec\x01\xc7\x01\xa8\xff\xd7\x01\ +\xc7\x01\xaa\xff\xd7\x01\xc7\x01\xae\xff\xd7\x01\xc7\x01\xb0\xff\ +\xd7\x01\xc7\x01\xb1\xff\xec\x01\xc7\x01\xb5\xff\xd7\x01\xc7\x01\ +\xbc\xff\xc3\x01\xc7\x01\xbd\xff\xd7\x01\xc7\x01\xbf\xff\xd7\x01\ +\xc7\x01\xc1\xff\xd7\x01\xc7\x01\xc4\xff\xec\x01\xc7\x01\xc7\xff\ +\xec\x01\xc7\x01\xce\xff\xec\x01\xc7\x01\xd5\xff\xec\x01\xc7\x01\ +\xf2\xff\xec\x01\xc7\x02\x08\xff\xae\x01\xc7\x02\x0c\xff\xae\x01\ +\xc7\x02r\xff\xd7\x01\xc7\x02s\xff\xec\x01\xc7\x02z\xff\ +\xec\x01\xc7\x02|\xff\xd7\x01\xc7\x02\x80\xff\xec\x01\xc7\x02\ +\x82\xff\xec\x01\xc7\x02\x9f\xff\xd7\x01\xc7\x02\xa1\xff\xec\x01\ +\xc7\x02\xa9\xff\xec\x01\xc7\x02\xb5\xff\xc3\x01\xc7\x02\xb7\xff\ +\xec\x01\xc7\x02\xb9\xff\xec\x01\xc7\x02\xbb\xff\xd7\x01\xc7\x02\ +\xbd\xff\xec\x01\xc7\x02\xbf\xff\xd7\x01\xc7\x02\xc1\xff\xd7\x01\ +\xc7\x02\xca\xff\xd7\x01\xc7\x02\xce\xff\xd7\x01\xc7\x02\xcf\xff\ +\xec\x01\xc7\x02\xd4\xff\xd7\x01\xc7\x02\xd9\xff\xd7\x01\xc7\x02\ +\xdb\xff\xd7\x01\xc7\x02\xdd\xff\xd7\x01\xc7\x02\xe5\xff\xd7\x01\ +\xc7\x02\xe7\xff\xec\x01\xc7\x02\xf5\xff\xec\x01\xc7\x02\xf7\xff\ +\xd7\x01\xc7\x02\xf9\xff\xd7\x01\xc7\x02\xfb\xff\xd7\x01\xc7\x02\ +\xfd\xff\xd7\x01\xc7\x03\x05\xff\xd7\x01\xc7\x03\x07\xff\xd7\x01\ +\xc7\x03\x0d\xff\xd7\x01\xc7\x03\x0f\xff\xd7\x01\xc7\x03\x11\xff\ +\xd7\x01\xc7\x03\x12\xff\xec\x01\xc7\x03\x17\xff\xec\x01\xc7\x03\ +\x1b\xff\xd7\x01\xc7\x03\x1c\xff\xec\x01\xc8\x00\x0f\xff\xae\x01\ +\xc8\x00\x11\xff\xae\x01\xc8\x01\x9d\xff\xec\x01\xc8\x01\xa4\xff\ +\xd7\x01\xc8\x01\xa6\xff\xec\x01\xc8\x01\xa8\xff\xd7\x01\xc8\x01\ +\xaa\xff\xd7\x01\xc8\x01\xae\xff\xd7\x01\xc8\x01\xb0\xff\xd7\x01\ +\xc8\x01\xb1\xff\xec\x01\xc8\x01\xb5\xff\xd7\x01\xc8\x01\xbc\xff\ +\xc3\x01\xc8\x01\xbd\xff\xd7\x01\xc8\x01\xbf\xff\xd7\x01\xc8\x01\ +\xc1\xff\xd7\x01\xc8\x01\xc4\xff\xec\x01\xc8\x01\xc7\xff\xec\x01\ +\xc8\x01\xce\xff\xec\x01\xc8\x01\xd5\xff\xec\x01\xc8\x01\xf2\xff\ +\xec\x01\xc8\x02\x08\xff\xae\x01\xc8\x02\x0c\xff\xae\x01\xc8\x02\ +r\xff\xd7\x01\xc8\x02s\xff\xec\x01\xc8\x02z\xff\xec\x01\ +\xc8\x02|\xff\xd7\x01\xc8\x02\x80\xff\xec\x01\xc8\x02\x82\xff\ +\xec\x01\xc8\x02\x9f\xff\xd7\x01\xc8\x02\xa1\xff\xec\x01\xc8\x02\ +\xa9\xff\xec\x01\xc8\x02\xb5\xff\xc3\x01\xc8\x02\xb7\xff\xec\x01\ +\xc8\x02\xb9\xff\xec\x01\xc8\x02\xbb\xff\xd7\x01\xc8\x02\xbd\xff\ +\xec\x01\xc8\x02\xbf\xff\xd7\x01\xc8\x02\xc1\xff\xd7\x01\xc8\x02\ +\xca\xff\xd7\x01\xc8\x02\xce\xff\xd7\x01\xc8\x02\xcf\xff\xec\x01\ +\xc8\x02\xd4\xff\xd7\x01\xc8\x02\xd9\xff\xd7\x01\xc8\x02\xdb\xff\ +\xd7\x01\xc8\x02\xdd\xff\xd7\x01\xc8\x02\xe5\xff\xd7\x01\xc8\x02\ +\xe7\xff\xec\x01\xc8\x02\xf5\xff\xec\x01\xc8\x02\xf7\xff\xd7\x01\ +\xc8\x02\xf9\xff\xd7\x01\xc8\x02\xfb\xff\xd7\x01\xc8\x02\xfd\xff\ +\xd7\x01\xc8\x03\x05\xff\xd7\x01\xc8\x03\x07\xff\xd7\x01\xc8\x03\ +\x0d\xff\xd7\x01\xc8\x03\x0f\xff\xd7\x01\xc8\x03\x11\xff\xd7\x01\ +\xc8\x03\x12\xff\xec\x01\xc8\x03\x17\xff\xec\x01\xc8\x03\x1b\xff\ +\xd7\x01\xc8\x03\x1c\xff\xec\x01\xca\x00\x05\xff\xec\x01\xca\x00\ +\x0a\xff\xec\x01\xca\x02\x07\xff\xec\x01\xca\x02\x0b\xff\xec\x01\ +\xcc\x01\xe9\x00)\x01\xcd\x00\x0f\xff\x9a\x01\xcd\x00\x10\xff\ +\xd7\x01\xcd\x00\x11\xff\x9a\x01\xcd\x01\xce\xff\xc3\x01\xcd\x01\ +\xcf\xff\xec\x01\xcd\x01\xd5\xff\xc3\x01\xcd\x01\xd8\xff\xec\x01\ +\xcd\x01\xdb\xff\xec\x01\xcd\x01\xde\xff\xec\x01\xcd\x01\xea\xff\ +\xec\x01\xcd\x01\xed\xff\xec\x01\xcd\x01\xf2\xff\xc3\x01\xcd\x02\ +\x02\xff\xd7\x01\xcd\x02\x03\xff\xd7\x01\xcd\x02\x04\xff\xd7\x01\ +\xcd\x02\x08\xff\x9a\x01\xcd\x02\x0c\xff\x9a\x01\xcd\x02j\xff\ +\xec\x01\xcd\x02s\xff\xc3\x01\xcd\x02\x7f\xff\xec\x01\xcd\x02\ +\x85\xff\xec\x01\xcd\x02\x87\xff\xec\x01\xcd\x02\x89\xff\xec\x01\ +\xcd\x02\x8d\xff\xec\x01\xcd\x02\xb2\xff\xec\x01\xcd\x02\xb4\xff\ +\xec\x01\xcd\x02\xcf\xff\xc3\x01\xcd\x02\xe0\xff\xec\x01\xcd\x02\ +\xf0\xff\xec\x01\xcd\x02\xf2\xff\xec\x01\xcd\x02\xf4\xff\xec\x01\ +\xcd\x03\x0a\xff\xec\x01\xcd\x03\x0c\xff\xec\x01\xcd\x03\x12\xff\ +\xc3\x01\xcd\x03\x16\xff\xec\x01\xcd\x03\x1a\xff\xec\x01\xcd\x03\ +\x1c\xff\xc3\x01\xce\x00\x05\xff\xec\x01\xce\x00\x0a\xff\xec\x01\ +\xce\x02\x07\xff\xec\x01\xce\x02\x0b\xff\xec\x01\xcf\x00\x05\xff\ +\xec\x01\xcf\x00\x0a\xff\xec\x01\xcf\x02\x07\xff\xec\x01\xcf\x02\ +\x0b\xff\xec\x01\xd0\x01\xcf\xff\xd7\x01\xd0\x01\xd8\xff\xd7\x01\ +\xd0\x01\xdb\xff\xd7\x01\xd0\x01\xde\xff\xd7\x01\xd0\x01\xe1\xff\ +\xd7\x01\xd0\x01\xea\xff\xd7\x01\xd0\x01\xed\xff\xd7\x01\xd0\x02\ +j\xff\xd7\x01\xd0\x02\x7f\xff\xd7\x01\xd0\x02\x85\xff\xd7\x01\ +\xd0\x02\x87\xff\xd7\x01\xd0\x02\x89\xff\xd7\x01\xd0\x02\x8d\xff\ +\xd7\x01\xd0\x02\xb2\xff\xd7\x01\xd0\x02\xb4\xff\xd7\x01\xd0\x02\ +\xc0\xff\xd7\x01\xd0\x02\xc2\xff\xd7\x01\xd0\x02\xc6\xff\xd7\x01\ +\xd0\x02\xc8\xff\xd7\x01\xd0\x02\xd5\xff\xd7\x01\xd0\x02\xe0\xff\ +\xd7\x01\xd0\x02\xf0\xff\xd7\x01\xd0\x02\xf2\xff\xd7\x01\xd0\x02\ +\xf4\xff\xd7\x01\xd0\x02\xfe\xff\xd7\x01\xd0\x03\x0a\xff\xd7\x01\ +\xd0\x03\x0c\xff\xd7\x01\xd0\x03\x16\xff\xd7\x01\xd0\x03\x1a\xff\ +\xd7\x01\xd1\x01\xe9\x00)\x01\xd4\x01\xcf\xff\xd7\x01\xd4\x01\ +\xd8\xff\xd7\x01\xd4\x01\xdb\xff\xd7\x01\xd4\x01\xde\xff\xd7\x01\ +\xd4\x01\xe1\xff\xd7\x01\xd4\x01\xea\xff\xd7\x01\xd4\x01\xed\xff\ +\xd7\x01\xd4\x02j\xff\xd7\x01\xd4\x02\x7f\xff\xd7\x01\xd4\x02\ +\x85\xff\xd7\x01\xd4\x02\x87\xff\xd7\x01\xd4\x02\x89\xff\xd7\x01\ +\xd4\x02\x8d\xff\xd7\x01\xd4\x02\xb2\xff\xd7\x01\xd4\x02\xb4\xff\ +\xd7\x01\xd4\x02\xc0\xff\xd7\x01\xd4\x02\xc2\xff\xd7\x01\xd4\x02\ +\xc6\xff\xd7\x01\xd4\x02\xc8\xff\xd7\x01\xd4\x02\xd5\xff\xd7\x01\ +\xd4\x02\xe0\xff\xd7\x01\xd4\x02\xf0\xff\xd7\x01\xd4\x02\xf2\xff\ +\xd7\x01\xd4\x02\xf4\xff\xd7\x01\xd4\x02\xfe\xff\xd7\x01\xd4\x03\ +\x0a\xff\xd7\x01\xd4\x03\x0c\xff\xd7\x01\xd4\x03\x16\xff\xd7\x01\ +\xd4\x03\x1a\xff\xd7\x01\xd8\x00\x05\xff\xec\x01\xd8\x00\x0a\xff\ +\xec\x01\xd8\x01\xd0\xff\xd7\x01\xd8\x01\xdc\xff\xec\x01\xd8\x01\ +\xdd\xff\xec\x01\xd8\x01\xdf\xff\xd7\x01\xd8\x01\xe1\xff\xec\x01\ +\xd8\x01\xe4\xff\xec\x01\xd8\x01\xf6\xff\xec\x01\xd8\x02\x07\xff\ +\xec\x01\xd8\x02\x0b\xff\xec\x01\xd8\x02\xa0\xff\xd7\x01\xd8\x02\ +\xaa\xff\xec\x01\xd8\x02\xb6\xff\xec\x01\xd8\x02\xbc\xff\xd7\x01\ +\xd8\x02\xbe\xff\xec\x01\xd8\x02\xc0\xff\xec\x01\xd8\x02\xc2\xff\ +\xec\x01\xd8\x02\xcb\xff\xd7\x01\xd8\x02\xd5\xff\xec\x01\xd8\x02\ +\xe6\xff\xd7\x01\xd8\x02\xf8\xff\xec\x01\xd8\x02\xfa\xff\xec\x01\ +\xd8\x02\xfc\xff\xec\x01\xd8\x02\xfe\xff\xec\x01\xd8\x03\x06\xff\ +\xd7\x01\xd8\x03\x08\xff\xd7\x01\xd8\x03\x0e\xff\xec\x01\xd8\x03\ +\x10\xff\xec\x01\xd8\x03\x18\xff\xec\x01\xda\x00\x05\xff\xec\x01\ +\xda\x00\x0a\xff\xec\x01\xda\x01\xd0\xff\xd7\x01\xda\x01\xdc\xff\ +\xec\x01\xda\x01\xdd\xff\xec\x01\xda\x01\xdf\xff\xd7\x01\xda\x01\ +\xe1\xff\xec\x01\xda\x01\xe4\xff\xec\x01\xda\x01\xf6\xff\xec\x01\ +\xda\x02\x07\xff\xec\x01\xda\x02\x0b\xff\xec\x01\xda\x02\xa0\xff\ +\xd7\x01\xda\x02\xaa\xff\xec\x01\xda\x02\xb6\xff\xec\x01\xda\x02\ +\xbc\xff\xd7\x01\xda\x02\xbe\xff\xec\x01\xda\x02\xc0\xff\xec\x01\ +\xda\x02\xc2\xff\xec\x01\xda\x02\xcb\xff\xd7\x01\xda\x02\xd5\xff\ +\xec\x01\xda\x02\xe6\xff\xd7\x01\xda\x02\xf8\xff\xec\x01\xda\x02\ +\xfa\xff\xec\x01\xda\x02\xfc\xff\xec\x01\xda\x02\xfe\xff\xec\x01\ +\xda\x03\x06\xff\xd7\x01\xda\x03\x08\xff\xd7\x01\xda\x03\x0e\xff\ +\xec\x01\xda\x03\x10\xff\xec\x01\xda\x03\x18\xff\xec\x01\xdc\x00\ +\x0f\xff\x9a\x01\xdc\x00\x10\xff\xd7\x01\xdc\x00\x11\xff\x9a\x01\ +\xdc\x01\xce\xff\xc3\x01\xdc\x01\xcf\xff\xec\x01\xdc\x01\xd5\xff\ +\xc3\x01\xdc\x01\xd8\xff\xec\x01\xdc\x01\xdb\xff\xec\x01\xdc\x01\ +\xde\xff\xec\x01\xdc\x01\xea\xff\xec\x01\xdc\x01\xed\xff\xec\x01\ +\xdc\x01\xf2\xff\xc3\x01\xdc\x02\x02\xff\xd7\x01\xdc\x02\x03\xff\ +\xd7\x01\xdc\x02\x04\xff\xd7\x01\xdc\x02\x08\xff\x9a\x01\xdc\x02\ +\x0c\xff\x9a\x01\xdc\x02j\xff\xec\x01\xdc\x02s\xff\xc3\x01\ +\xdc\x02\x7f\xff\xec\x01\xdc\x02\x85\xff\xec\x01\xdc\x02\x87\xff\ +\xec\x01\xdc\x02\x89\xff\xec\x01\xdc\x02\x8d\xff\xec\x01\xdc\x02\ +\xb2\xff\xec\x01\xdc\x02\xb4\xff\xec\x01\xdc\x02\xcf\xff\xc3\x01\ +\xdc\x02\xe0\xff\xec\x01\xdc\x02\xf0\xff\xec\x01\xdc\x02\xf2\xff\ +\xec\x01\xdc\x02\xf4\xff\xec\x01\xdc\x03\x0a\xff\xec\x01\xdc\x03\ +\x0c\xff\xec\x01\xdc\x03\x12\xff\xc3\x01\xdc\x03\x16\xff\xec\x01\ +\xdc\x03\x1a\xff\xec\x01\xdc\x03\x1c\xff\xc3\x01\xdd\x00\x0f\xff\ +\xae\x01\xdd\x00\x11\xff\xae\x01\xdd\x01\xce\xff\xd7\x01\xdd\x01\ +\xd5\xff\xd7\x01\xdd\x01\xf2\xff\xd7\x01\xdd\x02\x08\xff\xae\x01\ +\xdd\x02\x0c\xff\xae\x01\xdd\x02s\xff\xd7\x01\xdd\x02\xcf\xff\ +\xd7\x01\xdd\x03\x12\xff\xd7\x01\xdd\x03\x1c\xff\xd7\x01\xde\x00\ +\x05\xff\xec\x01\xde\x00\x0a\xff\xec\x01\xde\x01\xd0\xff\xd7\x01\ +\xde\x01\xdc\xff\xec\x01\xde\x01\xdd\xff\xec\x01\xde\x01\xdf\xff\ +\xd7\x01\xde\x01\xe1\xff\xec\x01\xde\x01\xe4\xff\xec\x01\xde\x01\ +\xf6\xff\xec\x01\xde\x02\x07\xff\xec\x01\xde\x02\x0b\xff\xec\x01\ +\xde\x02\xa0\xff\xd7\x01\xde\x02\xaa\xff\xec\x01\xde\x02\xb6\xff\ +\xec\x01\xde\x02\xbc\xff\xd7\x01\xde\x02\xbe\xff\xec\x01\xde\x02\ +\xc0\xff\xec\x01\xde\x02\xc2\xff\xec\x01\xde\x02\xcb\xff\xd7\x01\ +\xde\x02\xd5\xff\xec\x01\xde\x02\xe6\xff\xd7\x01\xde\x02\xf8\xff\ +\xec\x01\xde\x02\xfa\xff\xec\x01\xde\x02\xfc\xff\xec\x01\xde\x02\ +\xfe\xff\xec\x01\xde\x03\x06\xff\xd7\x01\xde\x03\x08\xff\xd7\x01\ +\xde\x03\x0e\xff\xec\x01\xde\x03\x10\xff\xec\x01\xde\x03\x18\xff\ +\xec\x01\xdf\x01\xcf\xff\xd7\x01\xdf\x01\xd8\xff\xd7\x01\xdf\x01\ +\xdb\xff\xd7\x01\xdf\x01\xde\xff\xd7\x01\xdf\x01\xe1\xff\xd7\x01\ +\xdf\x01\xea\xff\xd7\x01\xdf\x01\xed\xff\xd7\x01\xdf\x02j\xff\ +\xd7\x01\xdf\x02\x7f\xff\xd7\x01\xdf\x02\x85\xff\xd7\x01\xdf\x02\ +\x87\xff\xd7\x01\xdf\x02\x89\xff\xd7\x01\xdf\x02\x8d\xff\xd7\x01\ +\xdf\x02\xb2\xff\xd7\x01\xdf\x02\xb4\xff\xd7\x01\xdf\x02\xc0\xff\ +\xd7\x01\xdf\x02\xc2\xff\xd7\x01\xdf\x02\xc6\xff\xd7\x01\xdf\x02\ +\xc8\xff\xd7\x01\xdf\x02\xd5\xff\xd7\x01\xdf\x02\xe0\xff\xd7\x01\ +\xdf\x02\xf0\xff\xd7\x01\xdf\x02\xf2\xff\xd7\x01\xdf\x02\xf4\xff\ +\xd7\x01\xdf\x02\xfe\xff\xd7\x01\xdf\x03\x0a\xff\xd7\x01\xdf\x03\ +\x0c\xff\xd7\x01\xdf\x03\x16\xff\xd7\x01\xdf\x03\x1a\xff\xd7\x01\ +\xe0\x00\x05\xff\xec\x01\xe0\x00\x0a\xff\xec\x01\xe0\x02\x07\xff\ +\xec\x01\xe0\x02\x0b\xff\xec\x01\xe3\x00\x05\xff\xec\x01\xe3\x00\ +\x0a\xff\xec\x01\xe3\x02\x07\xff\xec\x01\xe3\x02\x0b\xff\xec\x01\ +\xe4\x00\x05\xff\x85\x01\xe4\x00\x0a\xff\x85\x01\xe4\x01\xd0\xff\ +\xd7\x01\xe4\x01\xdc\xff\x9a\x01\xe4\x01\xdd\xff\xc3\x01\xe4\x01\ +\xdf\xff\xd7\x01\xe4\x01\xe1\xff\xae\x01\xe4\x01\xe4\xff\x9a\x01\ +\xe4\x01\xf6\xff\xc3\x01\xe4\x02\x07\xff\x85\x01\xe4\x02\x0b\xff\ +\x85\x01\xe4\x02m\xff\xd7\x01\xe4\x02\x81\xff\xd7\x01\xe4\x02\ +\x83\xff\xd7\x01\xe4\x02\x8b\xff\xd7\x01\xe4\x02\xa0\xff\xd7\x01\ +\xe4\x02\xaa\xff\x9a\x01\xe4\x02\xb6\xff\x9a\x01\xe4\x02\xb8\xff\ +\xc3\x01\xe4\x02\xba\xff\xc3\x01\xe4\x02\xbc\xff\xd7\x01\xe4\x02\ +\xbe\xff\x9a\x01\xe4\x02\xc0\xff\xae\x01\xe4\x02\xc2\xff\xae\x01\ +\xe4\x02\xc6\xff\xd7\x01\xe4\x02\xc8\xff\xd7\x01\xe4\x02\xcb\xff\ +\xd7\x01\xe4\x02\xd5\xff\xae\x01\xe4\x02\xe6\xff\xd7\x01\xe4\x02\ +\xea\xff\xd7\x01\xe4\x02\xf8\xff\xc3\x01\xe4\x02\xfa\xff\xc3\x01\ +\xe4\x02\xfc\xff\xc3\x01\xe4\x02\xfe\xff\xae\x01\xe4\x03\x06\xff\ +\xd7\x01\xe4\x03\x08\xff\xd7\x01\xe4\x03\x0e\xff\x9a\x01\xe4\x03\ +\x10\xff\x9a\x01\xe4\x03\x18\xff\x9a\x01\xe6\x00\x05\xff\x85\x01\ +\xe6\x00\x0a\xff\x85\x01\xe6\x01\xd0\xff\xd7\x01\xe6\x01\xdc\xff\ +\x9a\x01\xe6\x01\xdd\xff\xc3\x01\xe6\x01\xdf\xff\xd7\x01\xe6\x01\ +\xe1\xff\xae\x01\xe6\x01\xe4\xff\x9a\x01\xe6\x01\xf6\xff\xc3\x01\ +\xe6\x02\x07\xff\x85\x01\xe6\x02\x0b\xff\x85\x01\xe6\x02m\xff\ +\xd7\x01\xe6\x02\x81\xff\xd7\x01\xe6\x02\x83\xff\xd7\x01\xe6\x02\ +\x8b\xff\xd7\x01\xe6\x02\xa0\xff\xd7\x01\xe6\x02\xaa\xff\x9a\x01\ +\xe6\x02\xb6\xff\x9a\x01\xe6\x02\xb8\xff\xc3\x01\xe6\x02\xba\xff\ +\xc3\x01\xe6\x02\xbc\xff\xd7\x01\xe6\x02\xbe\xff\x9a\x01\xe6\x02\ +\xc0\xff\xae\x01\xe6\x02\xc2\xff\xae\x01\xe6\x02\xc6\xff\xd7\x01\ +\xe6\x02\xc8\xff\xd7\x01\xe6\x02\xcb\xff\xd7\x01\xe6\x02\xd5\xff\ +\xae\x01\xe6\x02\xe6\xff\xd7\x01\xe6\x02\xea\xff\xd7\x01\xe6\x02\ +\xf8\xff\xc3\x01\xe6\x02\xfa\xff\xc3\x01\xe6\x02\xfc\xff\xc3\x01\ +\xe6\x02\xfe\xff\xae\x01\xe6\x03\x06\xff\xd7\x01\xe6\x03\x08\xff\ +\xd7\x01\xe6\x03\x0e\xff\x9a\x01\xe6\x03\x10\xff\x9a\x01\xe6\x03\ +\x18\xff\x9a\x01\xe7\x00\x05\xff\xec\x01\xe7\x00\x0a\xff\xec\x01\ +\xe7\x01\xd0\xff\xd7\x01\xe7\x01\xdc\xff\xec\x01\xe7\x01\xdd\xff\ +\xec\x01\xe7\x01\xdf\xff\xd7\x01\xe7\x01\xe1\xff\xec\x01\xe7\x01\ +\xe4\xff\xec\x01\xe7\x01\xf6\xff\xec\x01\xe7\x02\x07\xff\xec\x01\ +\xe7\x02\x0b\xff\xec\x01\xe7\x02\xa0\xff\xd7\x01\xe7\x02\xaa\xff\ +\xec\x01\xe7\x02\xb6\xff\xec\x01\xe7\x02\xbc\xff\xd7\x01\xe7\x02\ +\xbe\xff\xec\x01\xe7\x02\xc0\xff\xec\x01\xe7\x02\xc2\xff\xec\x01\ +\xe7\x02\xcb\xff\xd7\x01\xe7\x02\xd5\xff\xec\x01\xe7\x02\xe6\xff\ +\xd7\x01\xe7\x02\xf8\xff\xec\x01\xe7\x02\xfa\xff\xec\x01\xe7\x02\ +\xfc\xff\xec\x01\xe7\x02\xfe\xff\xec\x01\xe7\x03\x06\xff\xd7\x01\ +\xe7\x03\x08\xff\xd7\x01\xe7\x03\x0e\xff\xec\x01\xe7\x03\x10\xff\ +\xec\x01\xe7\x03\x18\xff\xec\x01\xe8\x00\x05\xff\xec\x01\xe8\x00\ +\x0a\xff\xec\x01\xe8\x01\xd0\xff\xd7\x01\xe8\x01\xdc\xff\xec\x01\ +\xe8\x01\xdd\xff\xec\x01\xe8\x01\xdf\xff\xd7\x01\xe8\x01\xe1\xff\ +\xec\x01\xe8\x01\xe4\xff\xec\x01\xe8\x01\xf6\xff\xec\x01\xe8\x02\ +\x07\xff\xec\x01\xe8\x02\x0b\xff\xec\x01\xe8\x02\xa0\xff\xd7\x01\ +\xe8\x02\xaa\xff\xec\x01\xe8\x02\xb6\xff\xec\x01\xe8\x02\xbc\xff\ +\xd7\x01\xe8\x02\xbe\xff\xec\x01\xe8\x02\xc0\xff\xec\x01\xe8\x02\ +\xc2\xff\xec\x01\xe8\x02\xcb\xff\xd7\x01\xe8\x02\xd5\xff\xec\x01\ +\xe8\x02\xe6\xff\xd7\x01\xe8\x02\xf8\xff\xec\x01\xe8\x02\xfa\xff\ +\xec\x01\xe8\x02\xfc\xff\xec\x01\xe8\x02\xfe\xff\xec\x01\xe8\x03\ +\x06\xff\xd7\x01\xe8\x03\x08\xff\xd7\x01\xe8\x03\x0e\xff\xec\x01\ +\xe8\x03\x10\xff\xec\x01\xe8\x03\x18\xff\xec\x01\xea\x00\x05\xff\ +\xec\x01\xea\x00\x0a\xff\xec\x01\xea\x02\x07\xff\xec\x01\xea\x02\ +\x0b\xff\xec\x01\xeb\x00\x05\xff\xec\x01\xeb\x00\x0a\xff\xec\x01\ +\xeb\x02\x07\xff\xec\x01\xeb\x02\x0b\xff\xec\x01\xeb\x03\x0e\xff\ +\xd7\x01\xeb\x03\x10\xff\xd7\x01\xec\x00\x0f\xff\x9a\x01\xec\x00\ +\x10\xff\xd7\x01\xec\x00\x11\xff\x9a\x01\xec\x01\xce\xff\xc3\x01\ +\xec\x01\xcf\xff\xec\x01\xec\x01\xd5\xff\xc3\x01\xec\x01\xd8\xff\ +\xec\x01\xec\x01\xdb\xff\xec\x01\xec\x01\xde\xff\xec\x01\xec\x01\ +\xea\xff\xec\x01\xec\x01\xed\xff\xec\x01\xec\x01\xf2\xff\xc3\x01\ +\xec\x02\x02\xff\xd7\x01\xec\x02\x03\xff\xd7\x01\xec\x02\x04\xff\ +\xd7\x01\xec\x02\x08\xff\x9a\x01\xec\x02\x0c\xff\x9a\x01\xec\x02\ +j\xff\xec\x01\xec\x02s\xff\xc3\x01\xec\x02\x7f\xff\xec\x01\ +\xec\x02\x85\xff\xec\x01\xec\x02\x87\xff\xec\x01\xec\x02\x89\xff\ +\xec\x01\xec\x02\x8d\xff\xec\x01\xec\x02\xb2\xff\xec\x01\xec\x02\ +\xb4\xff\xec\x01\xec\x02\xcf\xff\xc3\x01\xec\x02\xe0\xff\xec\x01\ +\xec\x02\xf0\xff\xec\x01\xec\x02\xf2\xff\xec\x01\xec\x02\xf4\xff\ +\xec\x01\xec\x03\x0a\xff\xec\x01\xec\x03\x0c\xff\xec\x01\xec\x03\ +\x12\xff\xc3\x01\xec\x03\x16\xff\xec\x01\xec\x03\x1a\xff\xec\x01\ +\xec\x03\x1c\xff\xc3\x01\xf2\x00\x05\xff\x85\x01\xf2\x00\x0a\xff\ +\x85\x01\xf2\x01\xd0\xff\xd7\x01\xf2\x01\xdc\xff\x9a\x01\xf2\x01\ +\xdd\xff\xc3\x01\xf2\x01\xdf\xff\xd7\x01\xf2\x01\xe1\xff\xae\x01\ +\xf2\x01\xe4\xff\x9a\x01\xf2\x01\xf6\xff\xc3\x01\xf2\x02\x07\xff\ +\x85\x01\xf2\x02\x0b\xff\x85\x01\xf2\x02m\xff\xd7\x01\xf2\x02\ +\x81\xff\xd7\x01\xf2\x02\x83\xff\xd7\x01\xf2\x02\x8b\xff\xd7\x01\ +\xf2\x02\xa0\xff\xd7\x01\xf2\x02\xaa\xff\x9a\x01\xf2\x02\xb6\xff\ +\x9a\x01\xf2\x02\xb8\xff\xc3\x01\xf2\x02\xba\xff\xc3\x01\xf2\x02\ +\xbc\xff\xd7\x01\xf2\x02\xbe\xff\x9a\x01\xf2\x02\xc0\xff\xae\x01\ +\xf2\x02\xc2\xff\xae\x01\xf2\x02\xc6\xff\xd7\x01\xf2\x02\xc8\xff\ +\xd7\x01\xf2\x02\xcb\xff\xd7\x01\xf2\x02\xd5\xff\xae\x01\xf2\x02\ +\xe6\xff\xd7\x01\xf2\x02\xea\xff\xd7\x01\xf2\x02\xf8\xff\xc3\x01\ +\xf2\x02\xfa\xff\xc3\x01\xf2\x02\xfc\xff\xc3\x01\xf2\x02\xfe\xff\ +\xae\x01\xf2\x03\x06\xff\xd7\x01\xf2\x03\x08\xff\xd7\x01\xf2\x03\ +\x0e\xff\x9a\x01\xf2\x03\x10\xff\x9a\x01\xf2\x03\x18\xff\x9a\x01\ +\xf3\x00\x05\xff\x85\x01\xf3\x00\x0a\xff\x85\x01\xf3\x01\xd0\xff\ +\xd7\x01\xf3\x01\xdc\xff\x9a\x01\xf3\x01\xdd\xff\xc3\x01\xf3\x01\ +\xdf\xff\xd7\x01\xf3\x01\xe1\xff\xae\x01\xf3\x01\xe4\xff\x9a\x01\ +\xf3\x01\xf6\xff\xc3\x01\xf3\x02\x07\xff\x85\x01\xf3\x02\x0b\xff\ +\x85\x01\xf3\x02m\xff\xd7\x01\xf3\x02\x81\xff\xd7\x01\xf3\x02\ +\x83\xff\xd7\x01\xf3\x02\x8b\xff\xd7\x01\xf3\x02\xa0\xff\xd7\x01\ +\xf3\x02\xaa\xff\x9a\x01\xf3\x02\xb6\xff\x9a\x01\xf3\x02\xb8\xff\ +\xc3\x01\xf3\x02\xba\xff\xc3\x01\xf3\x02\xbc\xff\xd7\x01\xf3\x02\ +\xbe\xff\x9a\x01\xf3\x02\xc0\xff\xae\x01\xf3\x02\xc2\xff\xae\x01\ +\xf3\x02\xc6\xff\xd7\x01\xf3\x02\xc8\xff\xd7\x01\xf3\x02\xcb\xff\ +\xd7\x01\xf3\x02\xd5\xff\xae\x01\xf3\x02\xe6\xff\xd7\x01\xf3\x02\ +\xea\xff\xd7\x01\xf3\x02\xf8\xff\xc3\x01\xf3\x02\xfa\xff\xc3\x01\ +\xf3\x02\xfc\xff\xc3\x01\xf3\x02\xfe\xff\xae\x01\xf3\x03\x06\xff\ +\xd7\x01\xf3\x03\x08\xff\xd7\x01\xf3\x03\x0e\xff\x9a\x01\xf3\x03\ +\x10\xff\x9a\x01\xf3\x03\x18\xff\x9a\x01\xf4\x00\x05\xff\xec\x01\ +\xf4\x00\x0a\xff\xec\x01\xf4\x02\x07\xff\xec\x01\xf4\x02\x0b\xff\ +\xec\x01\xf4\x03\x0e\xff\xd7\x01\xf4\x03\x10\xff\xd7\x01\xf5\x01\ +\xcf\xff\xd7\x01\xf5\x01\xd8\xff\xd7\x01\xf5\x01\xdb\xff\xd7\x01\ +\xf5\x01\xde\xff\xd7\x01\xf5\x01\xe1\xff\xd7\x01\xf5\x01\xea\xff\ +\xd7\x01\xf5\x01\xed\xff\xd7\x01\xf5\x02j\xff\xd7\x01\xf5\x02\ +\x7f\xff\xd7\x01\xf5\x02\x85\xff\xd7\x01\xf5\x02\x87\xff\xd7\x01\ +\xf5\x02\x89\xff\xd7\x01\xf5\x02\x8d\xff\xd7\x01\xf5\x02\xb2\xff\ +\xd7\x01\xf5\x02\xb4\xff\xd7\x01\xf5\x02\xc0\xff\xd7\x01\xf5\x02\ +\xc2\xff\xd7\x01\xf5\x02\xc6\xff\xd7\x01\xf5\x02\xc8\xff\xd7\x01\ +\xf5\x02\xd5\xff\xd7\x01\xf5\x02\xe0\xff\xd7\x01\xf5\x02\xf0\xff\ +\xd7\x01\xf5\x02\xf2\xff\xd7\x01\xf5\x02\xf4\xff\xd7\x01\xf5\x02\ +\xfe\xff\xd7\x01\xf5\x03\x0a\xff\xd7\x01\xf5\x03\x0c\xff\xd7\x01\ +\xf5\x03\x16\xff\xd7\x01\xf5\x03\x1a\xff\xd7\x01\xf6\x00\x0f\xff\ +\xae\x01\xf6\x00\x11\xff\xae\x01\xf6\x01\xce\xff\xd7\x01\xf6\x01\ +\xd5\xff\xd7\x01\xf6\x01\xf2\xff\xd7\x01\xf6\x02\x08\xff\xae\x01\ +\xf6\x02\x0c\xff\xae\x01\xf6\x02s\xff\xd7\x01\xf6\x02\xcf\xff\ +\xd7\x01\xf6\x03\x12\xff\xd7\x01\xf6\x03\x1c\xff\xd7\x01\xf8\x00\ +\x0f\xff\x85\x01\xf8\x00\x10\xff\xae\x01\xf8\x00\x11\xff\x85\x01\ +\xf8\x01\x9f\xff\xd7\x01\xf8\x01\xa4\xff\x9a\x01\xf8\x01\xaa\xff\ +q\x01\xf8\x01\xae\xff\x9a\x01\xf8\x01\xb5\xff\x9a\x01\xf8\x01\ +\xb8\xff\xd7\x01\xf8\x01\xbb\xff\xd7\x01\xf8\x01\xbc\x00)\x01\ +\xf8\x01\xbe\xff\xae\x01\xf8\x01\xcc\xff\x9a\x01\xf8\x01\xcd\xff\ +\x9a\x01\xf8\x01\xce\xff\x85\x01\xf8\x01\xcf\xffq\x01\xf8\x01\ +\xd0\xff\xd7\x01\xf8\x01\xd1\xff\xd7\x01\xf8\x01\xd2\xff\x9a\x01\ +\xf8\x01\xd3\xff\x9a\x01\xf8\x01\xd4\xff\x9a\x01\xf8\x01\xd5\xff\ +\x85\x01\xf8\x01\xd6\xff\x9a\x01\xf8\x01\xd7\xff\x9a\x01\xf8\x01\ +\xd8\xffq\x01\xf8\x01\xd9\xff\x9a\x01\xf8\x01\xda\xff\x9a\x01\ +\xf8\x01\xdb\xffq\x01\xf8\x01\xdc\xff\xae\x01\xf8\x01\xdd\xff\ +\xae\x01\xf8\x01\xde\xffq\x01\xf8\x01\xdf\xff\xd7\x01\xf8\x01\ +\xe0\xff\x9a\x01\xf8\x01\xe1\xff\x9a\x01\xf8\x01\xe2\xff\x9a\x01\ +\xf8\x01\xe3\xff\x9a\x01\xf8\x01\xe4\xff\xae\x01\xf8\x01\xe5\xff\ +\x9a\x01\xf8\x01\xe6\xff\x9a\x01\xf8\x01\xe7\xff\xd7\x01\xf8\x01\ +\xe8\xff\x9a\x01\xf8\x01\xe9\xff\xc3\x01\xf8\x01\xea\xffq\x01\ +\xf8\x01\xec\xff\x9a\x01\xf8\x01\xed\xffq\x01\xf8\x01\xee\xff\ +\x85\x01\xf8\x01\xf2\xff\x85\x01\xf8\x01\xf3\xff\x9a\x01\xf8\x01\ +\xf5\xff\x9a\x01\xf8\x01\xf6\xff\xae\x01\xf8\x01\xf7\xff\x9a\x01\ +\xf8\x01\xf9\xff\x9a\x01\xf8\x02\x02\xff\xae\x01\xf8\x02\x03\xff\ +\xae\x01\xf8\x02\x04\xff\xae\x01\xf8\x02\x08\xff\x85\x01\xf8\x02\ +\x0c\xff\x85\x01\xf8\x02j\xffq\x01\xf8\x02k\xff\x9a\x01\ +\xf8\x02l\xff\xd7\x01\xf8\x02m\xff\xd7\x01\xf8\x02q\xff\ +\x9a\x01\xf8\x02r\xffq\x01\xf8\x02s\xff\x85\x01\xf8\x02\ +u\xff\x9a\x01\xf8\x02w\xff\x9a\x01\xf8\x02y\xff\x9a\x01\ +\xf8\x02}\xff\x9a\x01\xf8\x02~\xff\xd7\x01\xf8\x02\x7f\xff\ +q\x01\xf8\x02\x81\xff\xd7\x01\xf8\x02\x83\xff\xd7\x01\xf8\x02\ +\x84\xff\xd7\x01\xf8\x02\x85\xffq\x01\xf8\x02\x86\xff\xd7\x01\ +\xf8\x02\x87\xffq\x01\xf8\x02\x88\xff\xd7\x01\xf8\x02\x89\xff\ +q\x01\xf8\x02\x8a\xff\xd7\x01\xf8\x02\x8b\xff\xd7\x01\xf8\x02\ +\x8c\xff\xd7\x01\xf8\x02\x8d\xffq\x01\xf8\x02\x96\xff\x9a\x01\ +\xf8\x02\x9a\xff\x9a\x01\xf8\x02\x9e\xff\x9a\x01\xf8\x02\xa0\xff\ +\xd7\x01\xf8\x02\xa2\xff\xd7\x01\xf8\x02\xa4\xff\x9a\x01\xf8\x02\ +\xa6\xff\x9a\x01\xf8\x02\xaa\xff\xae\x01\xf8\x02\xac\xff\x9a\x01\ +\xf8\x02\xae\xff\x9a\x01\xf8\x02\xb0\xff\x9a\x01\xf8\x02\xb1\xff\ +\xd7\x01\xf8\x02\xb2\xffq\x01\xf8\x02\xb3\xff\xd7\x01\xf8\x02\ +\xb4\xffq\x01\xf8\x02\xb5\x00)\x01\xf8\x02\xb6\xff\xae\x01\ +\xf8\x02\xb8\xff\xae\x01\xf8\x02\xba\xff\xae\x01\xf8\x02\xbc\xff\ +\xd7\x01\xf8\x02\xbe\xff\xae\x01\xf8\x02\xc0\xff\x9a\x01\xf8\x02\ +\xc2\xff\x9a\x01\xf8\x02\xc4\xff\x9a\x01\xf8\x02\xc5\xff\x9a\x01\ +\xf8\x02\xc6\xffq\x01\xf8\x02\xc7\xff\x9a\x01\xf8\x02\xc8\xff\ +q\x01\xf8\x02\xcb\xff\xd7\x01\xf8\x02\xcd\xff\x9a\x01\xf8\x02\ +\xce\xff\x9a\x01\xf8\x02\xcf\xff\x85\x01\xf8\x02\xd1\xff\x9a\x01\ +\xf8\x02\xd3\xff\x9a\x01\xf8\x02\xd5\xff\x9a\x01\xf8\x02\xd7\xff\ +\x9a\x01\xf8\x02\xd9\xffq\x01\xf8\x02\xdb\xffq\x01\xf8\x02\ +\xdd\xffq\x01\xf8\x02\xe0\xffq\x01\xf8\x02\xe6\xff\xd7\x01\ +\xf8\x02\xe8\xff\xd7\x01\xf8\x02\xea\xff\xc3\x01\xf8\x02\xec\xff\ +\x9a\x01\xf8\x02\xee\xff\x9a\x01\xf8\x02\xef\xff\xd7\x01\xf8\x02\ +\xf0\xffq\x01\xf8\x02\xf1\xff\xd7\x01\xf8\x02\xf2\xffq\x01\ +\xf8\x02\xf3\xff\xd7\x01\xf8\x02\xf4\xffq\x01\xf8\x02\xf6\xff\ +\xd7\x01\xf8\x02\xf8\xff\xae\x01\xf8\x02\xfa\xff\xae\x01\xf8\x02\ +\xfc\xff\xae\x01\xf8\x02\xfe\xff\x9a\x01\xf8\x03\x00\xff\x9a\x01\ +\xf8\x03\x02\xff\x9a\x01\xf8\x03\x06\xff\xd7\x01\xf8\x03\x08\xff\ +\xd7\x01\xf8\x03\x09\xffq\x01\xf8\x03\x0a\xffq\x01\xf8\x03\ +\x0b\xffq\x01\xf8\x03\x0c\xffq\x01\xf8\x03\x0e\xff\x9a\x01\ +\xf8\x03\x10\xff\x9a\x01\xf8\x03\x11\xff\x9a\x01\xf8\x03\x12\xff\ +\x85\x01\xf8\x03\x14\xff\x9a\x01\xf8\x03\x15\xff\xd7\x01\xf8\x03\ +\x16\xffq\x01\xf8\x03\x18\xff\xae\x01\xf8\x03\x1a\xffq\x01\ +\xf8\x03\x1b\xff\x9a\x01\xf8\x03\x1c\xff\x85\x01\xf9\x00\x0f\xff\ +\x9a\x01\xf9\x00\x10\xff\xd7\x01\xf9\x00\x11\xff\x9a\x01\xf9\x01\ +\xce\xff\xc3\x01\xf9\x01\xcf\xff\xec\x01\xf9\x01\xd5\xff\xc3\x01\ +\xf9\x01\xd8\xff\xec\x01\xf9\x01\xdb\xff\xec\x01\xf9\x01\xde\xff\ +\xec\x01\xf9\x01\xea\xff\xec\x01\xf9\x01\xed\xff\xec\x01\xf9\x01\ +\xf2\xff\xc3\x01\xf9\x02\x02\xff\xd7\x01\xf9\x02\x03\xff\xd7\x01\ +\xf9\x02\x04\xff\xd7\x01\xf9\x02\x08\xff\x9a\x01\xf9\x02\x0c\xff\ +\x9a\x01\xf9\x02j\xff\xec\x01\xf9\x02s\xff\xc3\x01\xf9\x02\ +\x7f\xff\xec\x01\xf9\x02\x85\xff\xec\x01\xf9\x02\x87\xff\xec\x01\ +\xf9\x02\x89\xff\xec\x01\xf9\x02\x8d\xff\xec\x01\xf9\x02\xb2\xff\ +\xec\x01\xf9\x02\xb4\xff\xec\x01\xf9\x02\xcf\xff\xc3\x01\xf9\x02\ +\xe0\xff\xec\x01\xf9\x02\xf0\xff\xec\x01\xf9\x02\xf2\xff\xec\x01\ +\xf9\x02\xf4\xff\xec\x01\xf9\x03\x0a\xff\xec\x01\xf9\x03\x0c\xff\ +\xec\x01\xf9\x03\x12\xff\xc3\x01\xf9\x03\x16\xff\xec\x01\xf9\x03\ +\x1a\xff\xec\x01\xf9\x03\x1c\xff\xc3\x01\xfa\x00\x0f\xff\x9a\x01\ +\xfa\x00\x11\xff\x9a\x01\xfa\x00\x22\x00)\x01\xfa\x00$\xff\ +\xae\x01\xfa\x00&\xff\xec\x01\xfa\x00*\xff\xec\x01\xfa\x00\ +2\xff\xec\x01\xfa\x004\xff\xec\x01\xfa\x00D\xff\xd7\x01\ +\xfa\x00F\xff\xd7\x01\xfa\x00G\xff\xd7\x01\xfa\x00H\xff\ +\xd7\x01\xfa\x00J\xff\xec\x01\xfa\x00P\xff\xec\x01\xfa\x00\ +Q\xff\xec\x01\xfa\x00R\xff\xd7\x01\xfa\x00S\xff\xec\x01\ +\xfa\x00T\xff\xd7\x01\xfa\x00U\xff\xec\x01\xfa\x00V\xff\ +\xec\x01\xfa\x00X\xff\xec\x01\xfa\x00\x82\xff\xae\x01\xfa\x00\ +\x83\xff\xae\x01\xfa\x00\x84\xff\xae\x01\xfa\x00\x85\xff\xae\x01\ +\xfa\x00\x86\xff\xae\x01\xfa\x00\x87\xff\xae\x01\xfa\x00\x89\xff\ +\xec\x01\xfa\x00\x94\xff\xec\x01\xfa\x00\x95\xff\xec\x01\xfa\x00\ +\x96\xff\xec\x01\xfa\x00\x97\xff\xec\x01\xfa\x00\x98\xff\xec\x01\ +\xfa\x00\x9a\xff\xec\x01\xfa\x00\xa2\xff\xd7\x01\xfa\x00\xa3\xff\ +\xd7\x01\xfa\x00\xa4\xff\xd7\x01\xfa\x00\xa5\xff\xd7\x01\xfa\x00\ +\xa6\xff\xd7\x01\xfa\x00\xa7\xff\xd7\x01\xfa\x00\xa8\xff\xd7\x01\ +\xfa\x00\xa9\xff\xd7\x01\xfa\x00\xaa\xff\xd7\x01\xfa\x00\xab\xff\ +\xd7\x01\xfa\x00\xac\xff\xd7\x01\xfa\x00\xad\xff\xd7\x01\xfa\x00\ +\xb4\xff\xd7\x01\xfa\x00\xb5\xff\xd7\x01\xfa\x00\xb6\xff\xd7\x01\ +\xfa\x00\xb7\xff\xd7\x01\xfa\x00\xb8\xff\xd7\x01\xfa\x00\xba\xff\ +\xd7\x01\xfa\x00\xbb\xff\xec\x01\xfa\x00\xbc\xff\xec\x01\xfa\x00\ +\xbd\xff\xec\x01\xfa\x00\xbe\xff\xec\x01\xfa\x00\xc2\xff\xae\x01\ +\xfa\x00\xc3\xff\xd7\x01\xfa\x00\xc4\xff\xae\x01\xfa\x00\xc5\xff\ +\xd7\x01\xfa\x00\xc6\xff\xae\x01\xfa\x00\xc7\xff\xd7\x01\xfa\x00\ +\xc8\xff\xec\x01\xfa\x00\xc9\xff\xd7\x01\xfa\x00\xca\xff\xec\x01\ +\xfa\x00\xcb\xff\xd7\x01\xfa\x00\xcc\xff\xec\x01\xfa\x00\xcd\xff\ +\xd7\x01\xfa\x00\xce\xff\xec\x01\xfa\x00\xcf\xff\xd7\x01\xfa\x00\ +\xd1\xff\xd7\x01\xfa\x00\xd3\xff\xd7\x01\xfa\x00\xd5\xff\xd7\x01\ +\xfa\x00\xd7\xff\xd7\x01\xfa\x00\xd9\xff\xd7\x01\xfa\x00\xdb\xff\ +\xd7\x01\xfa\x00\xdd\xff\xd7\x01\xfa\x00\xde\xff\xec\x01\xfa\x00\ +\xdf\xff\xec\x01\xfa\x00\xe0\xff\xec\x01\xfa\x00\xe1\xff\xec\x01\ +\xfa\x00\xe2\xff\xec\x01\xfa\x00\xe3\xff\xec\x01\xfa\x00\xe4\xff\ +\xec\x01\xfa\x00\xe5\xff\xec\x01\xfa\x00\xfa\xff\xec\x01\xfa\x01\ +\x06\xff\xec\x01\xfa\x01\x08\xff\xec\x01\xfa\x01\x0d\xff\xec\x01\ +\xfa\x01\x0e\xff\xec\x01\xfa\x01\x0f\xff\xd7\x01\xfa\x01\x10\xff\ +\xec\x01\xfa\x01\x11\xff\xd7\x01\xfa\x01\x12\xff\xec\x01\xfa\x01\ +\x13\xff\xd7\x01\xfa\x01\x14\xff\xec\x01\xfa\x01\x15\xff\xd7\x01\ +\xfa\x01\x17\xff\xec\x01\xfa\x01\x19\xff\xec\x01\xfa\x01\x1d\xff\ +\xec\x01\xfa\x01!\xff\xec\x01\xfa\x01+\xff\xec\x01\xfa\x01\ +-\xff\xec\x01\xfa\x01/\xff\xec\x01\xfa\x011\xff\xec\x01\ +\xfa\x013\xff\xec\x01\xfa\x015\xff\xec\x01\xfa\x01C\xff\ +\xae\x01\xfa\x01D\xff\xd7\x01\xfa\x01F\xff\xd7\x01\xfa\x01\ +G\xff\xec\x01\xfa\x01H\xff\xd7\x01\xfa\x01J\xff\xec\x01\ +\xfa\x02\x08\xff\x9a\x01\xfa\x02\x0c\xff\x9a\x01\xfa\x02W\xff\ +\xec\x01\xfa\x02X\xff\xae\x01\xfa\x02Y\xff\xd7\x01\xfa\x02\ +_\xff\xec\x01\xfa\x02`\xff\xd7\x01\xfa\x02b\xff\xec\x01\ +\xfa\x03\x1d\xff\xae\x01\xfa\x03\x1e\xff\xd7\x01\xfa\x03\x1f\xff\ +\xae\x01\xfa\x03 \xff\xd7\x01\xfa\x03!\xff\xae\x01\xfa\x03\ +\x22\xff\xd7\x01\xfa\x03#\xff\xae\x01\xfa\x03%\xff\xae\x01\ +\xfa\x03&\xff\xd7\x01\xfa\x03'\xff\xae\x01\xfa\x03(\xff\ +\xd7\x01\xfa\x03)\xff\xae\x01\xfa\x03*\xff\xd7\x01\xfa\x03\ ++\xff\xae\x01\xfa\x03,\xff\xd7\x01\xfa\x03-\xff\xae\x01\ +\xfa\x03.\xff\xd7\x01\xfa\x03/\xff\xae\x01\xfa\x030\xff\ +\xd7\x01\xfa\x031\xff\xae\x01\xfa\x032\xff\xd7\x01\xfa\x03\ +3\xff\xae\x01\xfa\x034\xff\xd7\x01\xfa\x036\xff\xd7\x01\ +\xfa\x038\xff\xd7\x01\xfa\x03:\xff\xd7\x01\xfa\x03<\xff\ +\xd7\x01\xfa\x03@\xff\xd7\x01\xfa\x03B\xff\xd7\x01\xfa\x03\ +D\xff\xd7\x01\xfa\x03I\xff\xec\x01\xfa\x03J\xff\xd7\x01\ +\xfa\x03K\xff\xec\x01\xfa\x03L\xff\xd7\x01\xfa\x03M\xff\ +\xec\x01\xfa\x03N\xff\xd7\x01\xfa\x03O\xff\xec\x01\xfa\x03\ +Q\xff\xec\x01\xfa\x03R\xff\xd7\x01\xfa\x03S\xff\xec\x01\ +\xfa\x03T\xff\xd7\x01\xfa\x03U\xff\xec\x01\xfa\x03V\xff\ +\xd7\x01\xfa\x03W\xff\xec\x01\xfa\x03X\xff\xd7\x01\xfa\x03\ +Y\xff\xec\x01\xfa\x03Z\xff\xd7\x01\xfa\x03[\xff\xec\x01\ +\xfa\x03\x5c\xff\xd7\x01\xfa\x03]\xff\xec\x01\xfa\x03^\xff\ +\xd7\x01\xfa\x03_\xff\xec\x01\xfa\x03`\xff\xd7\x01\xfa\x03\ +b\xff\xec\x01\xfa\x03d\xff\xec\x01\xfa\x03f\xff\xec\x01\ +\xfa\x03h\xff\xec\x01\xfa\x03j\xff\xec\x01\xfa\x03l\xff\ +\xec\x01\xfa\x03n\xff\xec\x01\xfb\x00\x05\x00R\x01\xfb\x00\ +\x0a\x00R\x01\xfb\x00\x0f\xff\xae\x01\xfb\x00\x11\xff\xae\x01\ +\xfb\x00\x22\x00)\x01\xfb\x02\x07\x00R\x01\xfb\x02\x08\xff\ +\xae\x01\xfb\x02\x0b\x00R\x01\xfb\x02\x0c\xff\xae\x01\xfc\x00\ +\x0f\xff\x9a\x01\xfc\x00\x11\xff\x9a\x01\xfc\x00\x22\x00)\x01\ +\xfc\x00$\xff\xae\x01\xfc\x00&\xff\xec\x01\xfc\x00*\xff\ +\xec\x01\xfc\x002\xff\xec\x01\xfc\x004\xff\xec\x01\xfc\x00\ +D\xff\xd7\x01\xfc\x00F\xff\xd7\x01\xfc\x00G\xff\xd7\x01\ +\xfc\x00H\xff\xd7\x01\xfc\x00J\xff\xec\x01\xfc\x00P\xff\ +\xec\x01\xfc\x00Q\xff\xec\x01\xfc\x00R\xff\xd7\x01\xfc\x00\ +S\xff\xec\x01\xfc\x00T\xff\xd7\x01\xfc\x00U\xff\xec\x01\ +\xfc\x00V\xff\xec\x01\xfc\x00X\xff\xec\x01\xfc\x00\x82\xff\ +\xae\x01\xfc\x00\x83\xff\xae\x01\xfc\x00\x84\xff\xae\x01\xfc\x00\ +\x85\xff\xae\x01\xfc\x00\x86\xff\xae\x01\xfc\x00\x87\xff\xae\x01\ +\xfc\x00\x89\xff\xec\x01\xfc\x00\x94\xff\xec\x01\xfc\x00\x95\xff\ +\xec\x01\xfc\x00\x96\xff\xec\x01\xfc\x00\x97\xff\xec\x01\xfc\x00\ +\x98\xff\xec\x01\xfc\x00\x9a\xff\xec\x01\xfc\x00\xa2\xff\xd7\x01\ +\xfc\x00\xa3\xff\xd7\x01\xfc\x00\xa4\xff\xd7\x01\xfc\x00\xa5\xff\ +\xd7\x01\xfc\x00\xa6\xff\xd7\x01\xfc\x00\xa7\xff\xd7\x01\xfc\x00\ +\xa8\xff\xd7\x01\xfc\x00\xa9\xff\xd7\x01\xfc\x00\xaa\xff\xd7\x01\ +\xfc\x00\xab\xff\xd7\x01\xfc\x00\xac\xff\xd7\x01\xfc\x00\xad\xff\ +\xd7\x01\xfc\x00\xb4\xff\xd7\x01\xfc\x00\xb5\xff\xd7\x01\xfc\x00\ +\xb6\xff\xd7\x01\xfc\x00\xb7\xff\xd7\x01\xfc\x00\xb8\xff\xd7\x01\ +\xfc\x00\xba\xff\xd7\x01\xfc\x00\xbb\xff\xec\x01\xfc\x00\xbc\xff\ +\xec\x01\xfc\x00\xbd\xff\xec\x01\xfc\x00\xbe\xff\xec\x01\xfc\x00\ +\xc2\xff\xae\x01\xfc\x00\xc3\xff\xd7\x01\xfc\x00\xc4\xff\xae\x01\ +\xfc\x00\xc5\xff\xd7\x01\xfc\x00\xc6\xff\xae\x01\xfc\x00\xc7\xff\ +\xd7\x01\xfc\x00\xc8\xff\xec\x01\xfc\x00\xc9\xff\xd7\x01\xfc\x00\ +\xca\xff\xec\x01\xfc\x00\xcb\xff\xd7\x01\xfc\x00\xcc\xff\xec\x01\ +\xfc\x00\xcd\xff\xd7\x01\xfc\x00\xce\xff\xec\x01\xfc\x00\xcf\xff\ +\xd7\x01\xfc\x00\xd1\xff\xd7\x01\xfc\x00\xd3\xff\xd7\x01\xfc\x00\ +\xd5\xff\xd7\x01\xfc\x00\xd7\xff\xd7\x01\xfc\x00\xd9\xff\xd7\x01\ +\xfc\x00\xdb\xff\xd7\x01\xfc\x00\xdd\xff\xd7\x01\xfc\x00\xde\xff\ +\xec\x01\xfc\x00\xdf\xff\xec\x01\xfc\x00\xe0\xff\xec\x01\xfc\x00\ +\xe1\xff\xec\x01\xfc\x00\xe2\xff\xec\x01\xfc\x00\xe3\xff\xec\x01\ +\xfc\x00\xe4\xff\xec\x01\xfc\x00\xe5\xff\xec\x01\xfc\x00\xfa\xff\ +\xec\x01\xfc\x01\x06\xff\xec\x01\xfc\x01\x08\xff\xec\x01\xfc\x01\ +\x0d\xff\xec\x01\xfc\x01\x0e\xff\xec\x01\xfc\x01\x0f\xff\xd7\x01\ +\xfc\x01\x10\xff\xec\x01\xfc\x01\x11\xff\xd7\x01\xfc\x01\x12\xff\ +\xec\x01\xfc\x01\x13\xff\xd7\x01\xfc\x01\x14\xff\xec\x01\xfc\x01\ +\x15\xff\xd7\x01\xfc\x01\x17\xff\xec\x01\xfc\x01\x19\xff\xec\x01\ +\xfc\x01\x1d\xff\xec\x01\xfc\x01!\xff\xec\x01\xfc\x01+\xff\ +\xec\x01\xfc\x01-\xff\xec\x01\xfc\x01/\xff\xec\x01\xfc\x01\ +1\xff\xec\x01\xfc\x013\xff\xec\x01\xfc\x015\xff\xec\x01\ +\xfc\x01C\xff\xae\x01\xfc\x01D\xff\xd7\x01\xfc\x01F\xff\ +\xd7\x01\xfc\x01G\xff\xec\x01\xfc\x01H\xff\xd7\x01\xfc\x01\ +J\xff\xec\x01\xfc\x02\x08\xff\x9a\x01\xfc\x02\x0c\xff\x9a\x01\ +\xfc\x02W\xff\xec\x01\xfc\x02X\xff\xae\x01\xfc\x02Y\xff\ +\xd7\x01\xfc\x02_\xff\xec\x01\xfc\x02`\xff\xd7\x01\xfc\x02\ +b\xff\xec\x01\xfc\x03\x1d\xff\xae\x01\xfc\x03\x1e\xff\xd7\x01\ +\xfc\x03\x1f\xff\xae\x01\xfc\x03 \xff\xd7\x01\xfc\x03!\xff\ +\xae\x01\xfc\x03\x22\xff\xd7\x01\xfc\x03#\xff\xae\x01\xfc\x03\ +%\xff\xae\x01\xfc\x03&\xff\xd7\x01\xfc\x03'\xff\xae\x01\ +\xfc\x03(\xff\xd7\x01\xfc\x03)\xff\xae\x01\xfc\x03*\xff\ +\xd7\x01\xfc\x03+\xff\xae\x01\xfc\x03,\xff\xd7\x01\xfc\x03\ +-\xff\xae\x01\xfc\x03.\xff\xd7\x01\xfc\x03/\xff\xae\x01\ +\xfc\x030\xff\xd7\x01\xfc\x031\xff\xae\x01\xfc\x032\xff\ +\xd7\x01\xfc\x033\xff\xae\x01\xfc\x034\xff\xd7\x01\xfc\x03\ +6\xff\xd7\x01\xfc\x038\xff\xd7\x01\xfc\x03:\xff\xd7\x01\ +\xfc\x03<\xff\xd7\x01\xfc\x03@\xff\xd7\x01\xfc\x03B\xff\ +\xd7\x01\xfc\x03D\xff\xd7\x01\xfc\x03I\xff\xec\x01\xfc\x03\ +J\xff\xd7\x01\xfc\x03K\xff\xec\x01\xfc\x03L\xff\xd7\x01\ +\xfc\x03M\xff\xec\x01\xfc\x03N\xff\xd7\x01\xfc\x03O\xff\ +\xec\x01\xfc\x03Q\xff\xec\x01\xfc\x03R\xff\xd7\x01\xfc\x03\ +S\xff\xec\x01\xfc\x03T\xff\xd7\x01\xfc\x03U\xff\xec\x01\ +\xfc\x03V\xff\xd7\x01\xfc\x03W\xff\xec\x01\xfc\x03X\xff\ +\xd7\x01\xfc\x03Y\xff\xec\x01\xfc\x03Z\xff\xd7\x01\xfc\x03\ +[\xff\xec\x01\xfc\x03\x5c\xff\xd7\x01\xfc\x03]\xff\xec\x01\ +\xfc\x03^\xff\xd7\x01\xfc\x03_\xff\xec\x01\xfc\x03`\xff\ +\xd7\x01\xfc\x03b\xff\xec\x01\xfc\x03d\xff\xec\x01\xfc\x03\ +f\xff\xec\x01\xfc\x03h\xff\xec\x01\xfc\x03j\xff\xec\x01\ +\xfc\x03l\xff\xec\x01\xfc\x03n\xff\xec\x01\xfd\x00\x05\x00\ +R\x01\xfd\x00\x0a\x00R\x01\xfd\x00\x0f\xff\xae\x01\xfd\x00\ +\x11\xff\xae\x01\xfd\x00\x22\x00)\x01\xfd\x02\x07\x00R\x01\ +\xfd\x02\x08\xff\xae\x01\xfd\x02\x0b\x00R\x01\xfd\x02\x0c\xff\ +\xae\x01\xfe\x00\x0f\xff\x9a\x01\xfe\x00\x11\xff\x9a\x01\xfe\x00\ +\x22\x00)\x01\xfe\x00$\xff\xae\x01\xfe\x00&\xff\xec\x01\ +\xfe\x00*\xff\xec\x01\xfe\x002\xff\xec\x01\xfe\x004\xff\ +\xec\x01\xfe\x00D\xff\xd7\x01\xfe\x00F\xff\xd7\x01\xfe\x00\ +G\xff\xd7\x01\xfe\x00H\xff\xd7\x01\xfe\x00J\xff\xec\x01\ +\xfe\x00P\xff\xec\x01\xfe\x00Q\xff\xec\x01\xfe\x00R\xff\ +\xd7\x01\xfe\x00S\xff\xec\x01\xfe\x00T\xff\xd7\x01\xfe\x00\ +U\xff\xec\x01\xfe\x00V\xff\xec\x01\xfe\x00X\xff\xec\x01\ +\xfe\x00\x82\xff\xae\x01\xfe\x00\x83\xff\xae\x01\xfe\x00\x84\xff\ +\xae\x01\xfe\x00\x85\xff\xae\x01\xfe\x00\x86\xff\xae\x01\xfe\x00\ +\x87\xff\xae\x01\xfe\x00\x89\xff\xec\x01\xfe\x00\x94\xff\xec\x01\ +\xfe\x00\x95\xff\xec\x01\xfe\x00\x96\xff\xec\x01\xfe\x00\x97\xff\ +\xec\x01\xfe\x00\x98\xff\xec\x01\xfe\x00\x9a\xff\xec\x01\xfe\x00\ +\xa2\xff\xd7\x01\xfe\x00\xa3\xff\xd7\x01\xfe\x00\xa4\xff\xd7\x01\ +\xfe\x00\xa5\xff\xd7\x01\xfe\x00\xa6\xff\xd7\x01\xfe\x00\xa7\xff\ +\xd7\x01\xfe\x00\xa8\xff\xd7\x01\xfe\x00\xa9\xff\xd7\x01\xfe\x00\ +\xaa\xff\xd7\x01\xfe\x00\xab\xff\xd7\x01\xfe\x00\xac\xff\xd7\x01\ +\xfe\x00\xad\xff\xd7\x01\xfe\x00\xb4\xff\xd7\x01\xfe\x00\xb5\xff\ +\xd7\x01\xfe\x00\xb6\xff\xd7\x01\xfe\x00\xb7\xff\xd7\x01\xfe\x00\ +\xb8\xff\xd7\x01\xfe\x00\xba\xff\xd7\x01\xfe\x00\xbb\xff\xec\x01\ +\xfe\x00\xbc\xff\xec\x01\xfe\x00\xbd\xff\xec\x01\xfe\x00\xbe\xff\ +\xec\x01\xfe\x00\xc2\xff\xae\x01\xfe\x00\xc3\xff\xd7\x01\xfe\x00\ +\xc4\xff\xae\x01\xfe\x00\xc5\xff\xd7\x01\xfe\x00\xc6\xff\xae\x01\ +\xfe\x00\xc7\xff\xd7\x01\xfe\x00\xc8\xff\xec\x01\xfe\x00\xc9\xff\ +\xd7\x01\xfe\x00\xca\xff\xec\x01\xfe\x00\xcb\xff\xd7\x01\xfe\x00\ +\xcc\xff\xec\x01\xfe\x00\xcd\xff\xd7\x01\xfe\x00\xce\xff\xec\x01\ +\xfe\x00\xcf\xff\xd7\x01\xfe\x00\xd1\xff\xd7\x01\xfe\x00\xd3\xff\ +\xd7\x01\xfe\x00\xd5\xff\xd7\x01\xfe\x00\xd7\xff\xd7\x01\xfe\x00\ +\xd9\xff\xd7\x01\xfe\x00\xdb\xff\xd7\x01\xfe\x00\xdd\xff\xd7\x01\ +\xfe\x00\xde\xff\xec\x01\xfe\x00\xdf\xff\xec\x01\xfe\x00\xe0\xff\ +\xec\x01\xfe\x00\xe1\xff\xec\x01\xfe\x00\xe2\xff\xec\x01\xfe\x00\ +\xe3\xff\xec\x01\xfe\x00\xe4\xff\xec\x01\xfe\x00\xe5\xff\xec\x01\ +\xfe\x00\xfa\xff\xec\x01\xfe\x01\x06\xff\xec\x01\xfe\x01\x08\xff\ +\xec\x01\xfe\x01\x0d\xff\xec\x01\xfe\x01\x0e\xff\xec\x01\xfe\x01\ +\x0f\xff\xd7\x01\xfe\x01\x10\xff\xec\x01\xfe\x01\x11\xff\xd7\x01\ +\xfe\x01\x12\xff\xec\x01\xfe\x01\x13\xff\xd7\x01\xfe\x01\x14\xff\ +\xec\x01\xfe\x01\x15\xff\xd7\x01\xfe\x01\x17\xff\xec\x01\xfe\x01\ +\x19\xff\xec\x01\xfe\x01\x1d\xff\xec\x01\xfe\x01!\xff\xec\x01\ +\xfe\x01+\xff\xec\x01\xfe\x01-\xff\xec\x01\xfe\x01/\xff\ +\xec\x01\xfe\x011\xff\xec\x01\xfe\x013\xff\xec\x01\xfe\x01\ +5\xff\xec\x01\xfe\x01C\xff\xae\x01\xfe\x01D\xff\xd7\x01\ +\xfe\x01F\xff\xd7\x01\xfe\x01G\xff\xec\x01\xfe\x01H\xff\ +\xd7\x01\xfe\x01J\xff\xec\x01\xfe\x02\x08\xff\x9a\x01\xfe\x02\ +\x0c\xff\x9a\x01\xfe\x02W\xff\xec\x01\xfe\x02X\xff\xae\x01\ +\xfe\x02Y\xff\xd7\x01\xfe\x02_\xff\xec\x01\xfe\x02`\xff\ +\xd7\x01\xfe\x02b\xff\xec\x01\xfe\x03\x1d\xff\xae\x01\xfe\x03\ +\x1e\xff\xd7\x01\xfe\x03\x1f\xff\xae\x01\xfe\x03 \xff\xd7\x01\ +\xfe\x03!\xff\xae\x01\xfe\x03\x22\xff\xd7\x01\xfe\x03#\xff\ +\xae\x01\xfe\x03%\xff\xae\x01\xfe\x03&\xff\xd7\x01\xfe\x03\ +'\xff\xae\x01\xfe\x03(\xff\xd7\x01\xfe\x03)\xff\xae\x01\ +\xfe\x03*\xff\xd7\x01\xfe\x03+\xff\xae\x01\xfe\x03,\xff\ +\xd7\x01\xfe\x03-\xff\xae\x01\xfe\x03.\xff\xd7\x01\xfe\x03\ +/\xff\xae\x01\xfe\x030\xff\xd7\x01\xfe\x031\xff\xae\x01\ +\xfe\x032\xff\xd7\x01\xfe\x033\xff\xae\x01\xfe\x034\xff\ +\xd7\x01\xfe\x036\xff\xd7\x01\xfe\x038\xff\xd7\x01\xfe\x03\ +:\xff\xd7\x01\xfe\x03<\xff\xd7\x01\xfe\x03@\xff\xd7\x01\ +\xfe\x03B\xff\xd7\x01\xfe\x03D\xff\xd7\x01\xfe\x03I\xff\ +\xec\x01\xfe\x03J\xff\xd7\x01\xfe\x03K\xff\xec\x01\xfe\x03\ +L\xff\xd7\x01\xfe\x03M\xff\xec\x01\xfe\x03N\xff\xd7\x01\ +\xfe\x03O\xff\xec\x01\xfe\x03Q\xff\xec\x01\xfe\x03R\xff\ +\xd7\x01\xfe\x03S\xff\xec\x01\xfe\x03T\xff\xd7\x01\xfe\x03\ +U\xff\xec\x01\xfe\x03V\xff\xd7\x01\xfe\x03W\xff\xec\x01\ +\xfe\x03X\xff\xd7\x01\xfe\x03Y\xff\xec\x01\xfe\x03Z\xff\ +\xd7\x01\xfe\x03[\xff\xec\x01\xfe\x03\x5c\xff\xd7\x01\xfe\x03\ +]\xff\xec\x01\xfe\x03^\xff\xd7\x01\xfe\x03_\xff\xec\x01\ +\xfe\x03`\xff\xd7\x01\xfe\x03b\xff\xec\x01\xfe\x03d\xff\ +\xec\x01\xfe\x03f\xff\xec\x01\xfe\x03h\xff\xec\x01\xfe\x03\ +j\xff\xec\x01\xfe\x03l\xff\xec\x01\xfe\x03n\xff\xec\x01\ +\xff\x00\x05\x00R\x01\xff\x00\x0a\x00R\x01\xff\x00\x0f\xff\ +\xae\x01\xff\x00\x11\xff\xae\x01\xff\x00\x22\x00)\x01\xff\x02\ +\x07\x00R\x01\xff\x02\x08\xff\xae\x01\xff\x02\x0b\x00R\x01\ +\xff\x02\x0c\xff\xae\x02\x00\x00\x0f\xff\x85\x02\x00\x00\x11\xff\ +\x85\x02\x00\x00\x22\x00)\x02\x00\x00$\xff\x85\x02\x00\x00\ +&\xff\xd7\x02\x00\x00*\xff\xd7\x02\x00\x002\xff\xd7\x02\ +\x00\x004\xff\xd7\x02\x00\x00D\xff\x9a\x02\x00\x00F\xff\ +\x9a\x02\x00\x00G\xff\x9a\x02\x00\x00H\xff\x9a\x02\x00\x00\ +J\xff\xd7\x02\x00\x00P\xff\xc3\x02\x00\x00Q\xff\xc3\x02\ +\x00\x00R\xff\x9a\x02\x00\x00S\xff\xc3\x02\x00\x00T\xff\ +\x9a\x02\x00\x00U\xff\xc3\x02\x00\x00V\xff\xae\x02\x00\x00\ +X\xff\xc3\x02\x00\x00]\xff\xd7\x02\x00\x00\x82\xff\x85\x02\ +\x00\x00\x83\xff\x85\x02\x00\x00\x84\xff\x85\x02\x00\x00\x85\xff\ +\x85\x02\x00\x00\x86\xff\x85\x02\x00\x00\x87\xff\x85\x02\x00\x00\ +\x89\xff\xd7\x02\x00\x00\x94\xff\xd7\x02\x00\x00\x95\xff\xd7\x02\ +\x00\x00\x96\xff\xd7\x02\x00\x00\x97\xff\xd7\x02\x00\x00\x98\xff\ +\xd7\x02\x00\x00\x9a\xff\xd7\x02\x00\x00\xa2\xff\x9a\x02\x00\x00\ +\xa3\xff\x9a\x02\x00\x00\xa4\xff\x9a\x02\x00\x00\xa5\xff\x9a\x02\ +\x00\x00\xa6\xff\x9a\x02\x00\x00\xa7\xff\x9a\x02\x00\x00\xa8\xff\ +\x9a\x02\x00\x00\xa9\xff\x9a\x02\x00\x00\xaa\xff\x9a\x02\x00\x00\ +\xab\xff\x9a\x02\x00\x00\xac\xff\x9a\x02\x00\x00\xad\xff\x9a\x02\ +\x00\x00\xb4\xff\x9a\x02\x00\x00\xb5\xff\x9a\x02\x00\x00\xb6\xff\ +\x9a\x02\x00\x00\xb7\xff\x9a\x02\x00\x00\xb8\xff\x9a\x02\x00\x00\ +\xba\xff\x9a\x02\x00\x00\xbb\xff\xc3\x02\x00\x00\xbc\xff\xc3\x02\ +\x00\x00\xbd\xff\xc3\x02\x00\x00\xbe\xff\xc3\x02\x00\x00\xc2\xff\ +\x85\x02\x00\x00\xc3\xff\x9a\x02\x00\x00\xc4\xff\x85\x02\x00\x00\ +\xc5\xff\x9a\x02\x00\x00\xc6\xff\x85\x02\x00\x00\xc7\xff\x9a\x02\ +\x00\x00\xc8\xff\xd7\x02\x00\x00\xc9\xff\x9a\x02\x00\x00\xca\xff\ +\xd7\x02\x00\x00\xcb\xff\x9a\x02\x00\x00\xcc\xff\xd7\x02\x00\x00\ +\xcd\xff\x9a\x02\x00\x00\xce\xff\xd7\x02\x00\x00\xcf\xff\x9a\x02\ +\x00\x00\xd1\xff\x9a\x02\x00\x00\xd3\xff\x9a\x02\x00\x00\xd5\xff\ +\x9a\x02\x00\x00\xd7\xff\x9a\x02\x00\x00\xd9\xff\x9a\x02\x00\x00\ +\xdb\xff\x9a\x02\x00\x00\xdd\xff\x9a\x02\x00\x00\xde\xff\xd7\x02\ +\x00\x00\xdf\xff\xd7\x02\x00\x00\xe0\xff\xd7\x02\x00\x00\xe1\xff\ +\xd7\x02\x00\x00\xe2\xff\xd7\x02\x00\x00\xe3\xff\xd7\x02\x00\x00\ +\xe4\xff\xd7\x02\x00\x00\xe5\xff\xd7\x02\x00\x00\xfa\xff\xc3\x02\ +\x00\x01\x06\xff\xc3\x02\x00\x01\x08\xff\xc3\x02\x00\x01\x0d\xff\ +\xc3\x02\x00\x01\x0e\xff\xd7\x02\x00\x01\x0f\xff\x9a\x02\x00\x01\ +\x10\xff\xd7\x02\x00\x01\x11\xff\x9a\x02\x00\x01\x12\xff\xd7\x02\ +\x00\x01\x13\xff\x9a\x02\x00\x01\x14\xff\xd7\x02\x00\x01\x15\xff\ +\x9a\x02\x00\x01\x17\xff\xc3\x02\x00\x01\x19\xff\xc3\x02\x00\x01\ +\x1d\xff\xae\x02\x00\x01!\xff\xae\x02\x00\x01+\xff\xc3\x02\ +\x00\x01-\xff\xc3\x02\x00\x01/\xff\xc3\x02\x00\x011\xff\ +\xc3\x02\x00\x013\xff\xc3\x02\x00\x015\xff\xc3\x02\x00\x01\ +<\xff\xd7\x02\x00\x01>\xff\xd7\x02\x00\x01@\xff\xd7\x02\ +\x00\x01C\xff\x85\x02\x00\x01D\xff\x9a\x02\x00\x01F\xff\ +\x9a\x02\x00\x01G\xff\xd7\x02\x00\x01H\xff\x9a\x02\x00\x01\ +J\xff\xae\x02\x00\x02\x08\xff\x85\x02\x00\x02\x0c\xff\x85\x02\ +\x00\x02W\xff\xc3\x02\x00\x02X\xff\x85\x02\x00\x02Y\xff\ +\x9a\x02\x00\x02_\xff\xd7\x02\x00\x02`\xff\x9a\x02\x00\x02\ +b\xff\xc3\x02\x00\x03\x1d\xff\x85\x02\x00\x03\x1e\xff\x9a\x02\ +\x00\x03\x1f\xff\x85\x02\x00\x03 \xff\x9a\x02\x00\x03!\xff\ +\x85\x02\x00\x03\x22\xff\x9a\x02\x00\x03#\xff\x85\x02\x00\x03\ +%\xff\x85\x02\x00\x03&\xff\x9a\x02\x00\x03'\xff\x85\x02\ +\x00\x03(\xff\x9a\x02\x00\x03)\xff\x85\x02\x00\x03*\xff\ +\x9a\x02\x00\x03+\xff\x85\x02\x00\x03,\xff\x9a\x02\x00\x03\ +-\xff\x85\x02\x00\x03.\xff\x9a\x02\x00\x03/\xff\x85\x02\ +\x00\x030\xff\x9a\x02\x00\x031\xff\x85\x02\x00\x032\xff\ +\x9a\x02\x00\x033\xff\x85\x02\x00\x034\xff\x9a\x02\x00\x03\ +6\xff\x9a\x02\x00\x038\xff\x9a\x02\x00\x03:\xff\x9a\x02\ +\x00\x03<\xff\x9a\x02\x00\x03@\xff\x9a\x02\x00\x03B\xff\ +\x9a\x02\x00\x03D\xff\x9a\x02\x00\x03I\xff\xd7\x02\x00\x03\ +J\xff\x9a\x02\x00\x03K\xff\xd7\x02\x00\x03L\xff\x9a\x02\ +\x00\x03M\xff\xd7\x02\x00\x03N\xff\x9a\x02\x00\x03O\xff\ +\xd7\x02\x00\x03Q\xff\xd7\x02\x00\x03R\xff\x9a\x02\x00\x03\ +S\xff\xd7\x02\x00\x03T\xff\x9a\x02\x00\x03U\xff\xd7\x02\ +\x00\x03V\xff\x9a\x02\x00\x03W\xff\xd7\x02\x00\x03X\xff\ +\x9a\x02\x00\x03Y\xff\xd7\x02\x00\x03Z\xff\x9a\x02\x00\x03\ +[\xff\xd7\x02\x00\x03\x5c\xff\x9a\x02\x00\x03]\xff\xd7\x02\ +\x00\x03^\xff\x9a\x02\x00\x03_\xff\xd7\x02\x00\x03`\xff\ +\x9a\x02\x00\x03b\xff\xc3\x02\x00\x03d\xff\xc3\x02\x00\x03\ +f\xff\xc3\x02\x00\x03h\xff\xc3\x02\x00\x03j\xff\xc3\x02\ +\x00\x03l\xff\xc3\x02\x00\x03n\xff\xc3\x02\x01\x00\x05\x00\ +R\x02\x01\x00\x0a\x00R\x02\x01\x00\x0f\xff\xae\x02\x01\x00\ +\x11\xff\xae\x02\x01\x00\x22\x00)\x02\x01\x02\x07\x00R\x02\ +\x01\x02\x08\xff\xae\x02\x01\x02\x0b\x00R\x02\x01\x02\x0c\xff\ +\xae\x02\x02\x007\xff\xae\x02\x02\x01$\xff\xae\x02\x02\x01\ +&\xff\xae\x02\x02\x01q\xff\xae\x02\x02\x01\x9d\xff\xae\x02\ +\x02\x01\xa6\xff\xae\x02\x02\x01\xbc\xff\xae\x02\x02\x01\xc4\xff\ +\xae\x02\x02\x01\xdc\xff\xd7\x02\x02\x01\xe4\xff\xd7\x02\x02\x02\ +\xa9\xff\xae\x02\x02\x02\xaa\xff\xd7\x02\x02\x02\xb5\xff\xae\x02\ +\x02\x02\xb6\xff\xd7\x02\x02\x02\xbd\xff\xae\x02\x02\x02\xbe\xff\ +\xd7\x02\x02\x03\x17\xff\xae\x02\x02\x03\x18\xff\xd7\x02\x02\x03\ +\x8f\xff\xae\x02\x03\x007\xff\xae\x02\x03\x01$\xff\xae\x02\ +\x03\x01&\xff\xae\x02\x03\x01q\xff\xae\x02\x03\x01\x9d\xff\ +\xae\x02\x03\x01\xa6\xff\xae\x02\x03\x01\xbc\xff\xae\x02\x03\x01\ +\xc4\xff\xae\x02\x03\x01\xdc\xff\xd7\x02\x03\x01\xe4\xff\xd7\x02\ +\x03\x02\xa9\xff\xae\x02\x03\x02\xaa\xff\xd7\x02\x03\x02\xb5\xff\ +\xae\x02\x03\x02\xb6\xff\xd7\x02\x03\x02\xbd\xff\xae\x02\x03\x02\ +\xbe\xff\xd7\x02\x03\x03\x17\xff\xae\x02\x03\x03\x18\xff\xd7\x02\ +\x03\x03\x8f\xff\xae\x02\x04\x007\xff\xae\x02\x04\x01$\xff\ +\xae\x02\x04\x01&\xff\xae\x02\x04\x01q\xff\xae\x02\x04\x01\ +\x9d\xff\xae\x02\x04\x01\xa6\xff\xae\x02\x04\x01\xbc\xff\xae\x02\ +\x04\x01\xc4\xff\xae\x02\x04\x01\xdc\xff\xd7\x02\x04\x01\xe4\xff\ +\xd7\x02\x04\x02\xa9\xff\xae\x02\x04\x02\xaa\xff\xd7\x02\x04\x02\ +\xb5\xff\xae\x02\x04\x02\xb6\xff\xd7\x02\x04\x02\xbd\xff\xae\x02\ +\x04\x02\xbe\xff\xd7\x02\x04\x03\x17\xff\xae\x02\x04\x03\x18\xff\ +\xd7\x02\x04\x03\x8f\xff\xae\x02\x06\x00$\xffq\x02\x06\x00\ +7\x00)\x02\x06\x009\x00)\x02\x06\x00:\x00)\x02\ +\x06\x00<\x00\x14\x02\x06\x00D\xff\xae\x02\x06\x00F\xff\ +\x85\x02\x06\x00G\xff\x85\x02\x06\x00H\xff\x85\x02\x06\x00\ +J\xff\xc3\x02\x06\x00P\xff\xc3\x02\x06\x00Q\xff\xc3\x02\ +\x06\x00R\xff\x85\x02\x06\x00S\xff\xc3\x02\x06\x00T\xff\ +\x85\x02\x06\x00U\xff\xc3\x02\x06\x00V\xff\xc3\x02\x06\x00\ +X\xff\xc3\x02\x06\x00\x82\xffq\x02\x06\x00\x83\xffq\x02\ +\x06\x00\x84\xffq\x02\x06\x00\x85\xffq\x02\x06\x00\x86\xff\ +q\x02\x06\x00\x87\xffq\x02\x06\x00\x9f\x00\x14\x02\x06\x00\ +\xa2\xff\x85\x02\x06\x00\xa3\xff\xae\x02\x06\x00\xa4\xff\xae\x02\ +\x06\x00\xa5\xff\xae\x02\x06\x00\xa6\xff\xae\x02\x06\x00\xa7\xff\ +\xae\x02\x06\x00\xa8\xff\xae\x02\x06\x00\xa9\xff\x85\x02\x06\x00\ +\xaa\xff\x85\x02\x06\x00\xab\xff\x85\x02\x06\x00\xac\xff\x85\x02\ +\x06\x00\xad\xff\x85\x02\x06\x00\xb4\xff\x85\x02\x06\x00\xb5\xff\ +\x85\x02\x06\x00\xb6\xff\x85\x02\x06\x00\xb7\xff\x85\x02\x06\x00\ +\xb8\xff\x85\x02\x06\x00\xba\xff\x85\x02\x06\x00\xbb\xff\xc3\x02\ +\x06\x00\xbc\xff\xc3\x02\x06\x00\xbd\xff\xc3\x02\x06\x00\xbe\xff\ +\xc3\x02\x06\x00\xc2\xffq\x02\x06\x00\xc3\xff\xae\x02\x06\x00\ +\xc4\xffq\x02\x06\x00\xc5\xff\xae\x02\x06\x00\xc6\xffq\x02\ +\x06\x00\xc7\xff\xae\x02\x06\x00\xc9\xff\x85\x02\x06\x00\xcb\xff\ +\x85\x02\x06\x00\xcd\xff\x85\x02\x06\x00\xcf\xff\x85\x02\x06\x00\ +\xd1\xff\x85\x02\x06\x00\xd3\xff\x85\x02\x06\x00\xd5\xff\x85\x02\ +\x06\x00\xd7\xff\x85\x02\x06\x00\xd9\xff\x85\x02\x06\x00\xdb\xff\ +\x85\x02\x06\x00\xdd\xff\x85\x02\x06\x00\xdf\xff\xc3\x02\x06\x00\ +\xe1\xff\xc3\x02\x06\x00\xe3\xff\xc3\x02\x06\x00\xe5\xff\xc3\x02\ +\x06\x00\xfa\xff\xc3\x02\x06\x01\x06\xff\xc3\x02\x06\x01\x08\xff\ +\xc3\x02\x06\x01\x0d\xff\xc3\x02\x06\x01\x0f\xff\x85\x02\x06\x01\ +\x11\xff\x85\x02\x06\x01\x13\xff\x85\x02\x06\x01\x15\xff\x85\x02\ +\x06\x01\x17\xff\xc3\x02\x06\x01\x19\xff\xc3\x02\x06\x01\x1d\xff\ +\xc3\x02\x06\x01!\xff\xc3\x02\x06\x01$\x00)\x02\x06\x01\ +&\x00)\x02\x06\x01+\xff\xc3\x02\x06\x01-\xff\xc3\x02\ +\x06\x01/\xff\xc3\x02\x06\x011\xff\xc3\x02\x06\x013\xff\ +\xc3\x02\x06\x015\xff\xc3\x02\x06\x016\x00)\x02\x06\x01\ +8\x00\x14\x02\x06\x01:\x00\x14\x02\x06\x01C\xffq\x02\ +\x06\x01D\xff\xae\x02\x06\x01F\xff\xae\x02\x06\x01H\xff\ +\x85\x02\x06\x01J\xff\xc3\x02\x06\x01V\xffq\x02\x06\x01\ +_\xffq\x02\x06\x01b\xffq\x02\x06\x01i\xffq\x02\ +\x06\x01y\xff\xae\x02\x06\x01z\xff\xd7\x02\x06\x01{\xff\ +\xd7\x02\x06\x01~\xff\xae\x02\x06\x01\x81\xff\xc3\x02\x06\x01\ +\x82\xff\xd7\x02\x06\x01\x83\xff\xd7\x02\x06\x01\x84\xff\xd7\x02\ +\x06\x01\x87\xff\xd7\x02\x06\x01\x89\xff\xd7\x02\x06\x01\x8c\xff\ +\xae\x02\x06\x01\x8e\xff\xc3\x02\x06\x01\x8f\xff\xae\x02\x06\x01\ +\x90\xff\xae\x02\x06\x01\x93\xff\xae\x02\x06\x01\x99\xff\xae\x02\ +\x06\x01\xa4\xff\x85\x02\x06\x01\xaa\xffq\x02\x06\x01\xae\xff\ +\x85\x02\x06\x01\xb5\xff\x85\x02\x06\x01\xca\xff\xd7\x02\x06\x01\ +\xce\xffq\x02\x06\x01\xcf\xff\x85\x02\x06\x01\xd5\xffq\x02\ +\x06\x01\xd8\xff\x85\x02\x06\x01\xdb\xff\x85\x02\x06\x01\xde\xff\ +\x85\x02\x06\x01\xea\xff\x85\x02\x06\x01\xed\xff\x85\x02\x06\x01\ +\xee\xff\xc3\x02\x06\x01\xf2\xffq\x02\x06\x01\xfa\x00)\x02\ +\x06\x01\xfc\x00)\x02\x06\x01\xfe\x00)\x02\x06\x02\x00\x00\ +\x14\x02\x06\x02W\xff\xc3\x02\x06\x02X\xffq\x02\x06\x02\ +Y\xff\xae\x02\x06\x02`\xff\x85\x02\x06\x02b\xff\xc3\x02\ +\x06\x02j\xff\x85\x02\x06\x02r\xffq\x02\x06\x02s\xff\ +q\x02\x06\x02}\xff\xec\x02\x06\x02\x7f\xff\x85\x02\x06\x02\ +\x85\xff\x85\x02\x06\x02\x87\xff\x85\x02\x06\x02\x89\xff\x85\x02\ +\x06\x02\x8d\xff\x85\x02\x06\x02\xb2\xff\x85\x02\x06\x02\xb4\xff\ +\x85\x02\x06\x02\xce\xff\x85\x02\x06\x02\xcf\xffq\x02\x06\x02\ +\xd9\xffq\x02\x06\x02\xda\xff\xd7\x02\x06\x02\xdb\xffq\x02\ +\x06\x02\xdc\xff\xd7\x02\x06\x02\xdd\xffq\x02\x06\x02\xde\xff\ +\xd7\x02\x06\x02\xe0\xff\x85\x02\x06\x02\xe2\xff\xd7\x02\x06\x02\ +\xe4\xff\xd7\x02\x06\x02\xf0\xff\x85\x02\x06\x02\xf2\xff\x85\x02\ +\x06\x02\xf4\xff\x85\x02\x06\x03\x09\xffq\x02\x06\x03\x0a\xff\ +\x85\x02\x06\x03\x0b\xffq\x02\x06\x03\x0c\xff\x85\x02\x06\x03\ +\x11\xff\x85\x02\x06\x03\x12\xffq\x02\x06\x03\x16\xff\x85\x02\ +\x06\x03\x1a\xff\x85\x02\x06\x03\x1b\xff\x85\x02\x06\x03\x1c\xff\ +q\x02\x06\x03\x1d\xffq\x02\x06\x03\x1e\xff\xae\x02\x06\x03\ +\x1f\xffq\x02\x06\x03 \xff\xae\x02\x06\x03!\xffq\x02\ +\x06\x03\x22\xff\xae\x02\x06\x03#\xffq\x02\x06\x03%\xff\ +q\x02\x06\x03&\xff\xae\x02\x06\x03'\xffq\x02\x06\x03\ +(\xff\xae\x02\x06\x03)\xffq\x02\x06\x03*\xff\xae\x02\ +\x06\x03+\xffq\x02\x06\x03,\xff\xae\x02\x06\x03-\xff\ +q\x02\x06\x03.\xff\xae\x02\x06\x03/\xffq\x02\x06\x03\ +0\xff\xae\x02\x06\x031\xffq\x02\x06\x032\xff\xae\x02\ +\x06\x033\xffq\x02\x06\x034\xff\xae\x02\x06\x036\xff\ +\x85\x02\x06\x038\xff\x85\x02\x06\x03:\xff\x85\x02\x06\x03\ +<\xff\x85\x02\x06\x03@\xff\x85\x02\x06\x03B\xff\x85\x02\ +\x06\x03D\xff\x85\x02\x06\x03J\xff\x85\x02\x06\x03L\xff\ +\x85\x02\x06\x03N\xff\x85\x02\x06\x03R\xff\x85\x02\x06\x03\ +T\xff\x85\x02\x06\x03V\xff\x85\x02\x06\x03X\xff\x85\x02\ +\x06\x03Z\xff\x85\x02\x06\x03\x5c\xff\x85\x02\x06\x03^\xff\ +\x85\x02\x06\x03`\xff\x85\x02\x06\x03b\xff\xc3\x02\x06\x03\ +d\xff\xc3\x02\x06\x03f\xff\xc3\x02\x06\x03h\xff\xc3\x02\ +\x06\x03j\xff\xc3\x02\x06\x03l\xff\xc3\x02\x06\x03n\xff\ +\xc3\x02\x06\x03o\x00\x14\x02\x06\x03q\x00\x14\x02\x06\x03\ +s\x00\x14\x02\x06\x03\x8f\x00)\x02\x07\x00$\xffq\x02\ +\x07\x007\x00)\x02\x07\x009\x00)\x02\x07\x00:\x00\ +)\x02\x07\x00<\x00\x14\x02\x07\x00D\xff\xae\x02\x07\x00\ +F\xff\x85\x02\x07\x00G\xff\x85\x02\x07\x00H\xff\x85\x02\ +\x07\x00J\xff\xc3\x02\x07\x00P\xff\xc3\x02\x07\x00Q\xff\ +\xc3\x02\x07\x00R\xff\x85\x02\x07\x00S\xff\xc3\x02\x07\x00\ +T\xff\x85\x02\x07\x00U\xff\xc3\x02\x07\x00V\xff\xc3\x02\ +\x07\x00X\xff\xc3\x02\x07\x00\x82\xffq\x02\x07\x00\x83\xff\ +q\x02\x07\x00\x84\xffq\x02\x07\x00\x85\xffq\x02\x07\x00\ +\x86\xffq\x02\x07\x00\x87\xffq\x02\x07\x00\x9f\x00\x14\x02\ +\x07\x00\xa2\xff\x85\x02\x07\x00\xa3\xff\xae\x02\x07\x00\xa4\xff\ +\xae\x02\x07\x00\xa5\xff\xae\x02\x07\x00\xa6\xff\xae\x02\x07\x00\ +\xa7\xff\xae\x02\x07\x00\xa8\xff\xae\x02\x07\x00\xa9\xff\x85\x02\ +\x07\x00\xaa\xff\x85\x02\x07\x00\xab\xff\x85\x02\x07\x00\xac\xff\ +\x85\x02\x07\x00\xad\xff\x85\x02\x07\x00\xb4\xff\x85\x02\x07\x00\ +\xb5\xff\x85\x02\x07\x00\xb6\xff\x85\x02\x07\x00\xb7\xff\x85\x02\ +\x07\x00\xb8\xff\x85\x02\x07\x00\xba\xff\x85\x02\x07\x00\xbb\xff\ +\xc3\x02\x07\x00\xbc\xff\xc3\x02\x07\x00\xbd\xff\xc3\x02\x07\x00\ +\xbe\xff\xc3\x02\x07\x00\xc2\xffq\x02\x07\x00\xc3\xff\xae\x02\ +\x07\x00\xc4\xffq\x02\x07\x00\xc5\xff\xae\x02\x07\x00\xc6\xff\ +q\x02\x07\x00\xc7\xff\xae\x02\x07\x00\xc9\xff\x85\x02\x07\x00\ +\xcb\xff\x85\x02\x07\x00\xcd\xff\x85\x02\x07\x00\xcf\xff\x85\x02\ +\x07\x00\xd1\xff\x85\x02\x07\x00\xd3\xff\x85\x02\x07\x00\xd5\xff\ +\x85\x02\x07\x00\xd7\xff\x85\x02\x07\x00\xd9\xff\x85\x02\x07\x00\ +\xdb\xff\x85\x02\x07\x00\xdd\xff\x85\x02\x07\x00\xdf\xff\xc3\x02\ +\x07\x00\xe1\xff\xc3\x02\x07\x00\xe3\xff\xc3\x02\x07\x00\xe5\xff\ +\xc3\x02\x07\x00\xfa\xff\xc3\x02\x07\x01\x06\xff\xc3\x02\x07\x01\ +\x08\xff\xc3\x02\x07\x01\x0d\xff\xc3\x02\x07\x01\x0f\xff\x85\x02\ +\x07\x01\x11\xff\x85\x02\x07\x01\x13\xff\x85\x02\x07\x01\x15\xff\ +\x85\x02\x07\x01\x17\xff\xc3\x02\x07\x01\x19\xff\xc3\x02\x07\x01\ +\x1d\xff\xc3\x02\x07\x01!\xff\xc3\x02\x07\x01$\x00)\x02\ +\x07\x01&\x00)\x02\x07\x01+\xff\xc3\x02\x07\x01-\xff\ +\xc3\x02\x07\x01/\xff\xc3\x02\x07\x011\xff\xc3\x02\x07\x01\ +3\xff\xc3\x02\x07\x015\xff\xc3\x02\x07\x016\x00)\x02\ +\x07\x018\x00\x14\x02\x07\x01:\x00\x14\x02\x07\x01C\xff\ +q\x02\x07\x01D\xff\xae\x02\x07\x01F\xff\xae\x02\x07\x01\ +H\xff\x85\x02\x07\x01J\xff\xc3\x02\x07\x01V\xffq\x02\ +\x07\x01_\xffq\x02\x07\x01b\xffq\x02\x07\x01i\xff\ +q\x02\x07\x01y\xff\xae\x02\x07\x01z\xff\xd7\x02\x07\x01\ +{\xff\xd7\x02\x07\x01~\xff\xae\x02\x07\x01\x81\xff\xc3\x02\ +\x07\x01\x82\xff\xd7\x02\x07\x01\x83\xff\xd7\x02\x07\x01\x84\xff\ +\xd7\x02\x07\x01\x87\xff\xd7\x02\x07\x01\x89\xff\xd7\x02\x07\x01\ +\x8c\xff\xae\x02\x07\x01\x8e\xff\xc3\x02\x07\x01\x8f\xff\xae\x02\ +\x07\x01\x90\xff\xae\x02\x07\x01\x93\xff\xae\x02\x07\x01\x99\xff\ +\xae\x02\x07\x01\xa4\xff\x85\x02\x07\x01\xaa\xffq\x02\x07\x01\ +\xae\xff\x85\x02\x07\x01\xb5\xff\x85\x02\x07\x01\xca\xff\xd7\x02\ +\x07\x01\xce\xffq\x02\x07\x01\xcf\xff\x85\x02\x07\x01\xd5\xff\ +q\x02\x07\x01\xd8\xff\x85\x02\x07\x01\xdb\xff\x85\x02\x07\x01\ +\xde\xff\x85\x02\x07\x01\xea\xff\x85\x02\x07\x01\xed\xff\x85\x02\ +\x07\x01\xee\xff\xc3\x02\x07\x01\xf2\xffq\x02\x07\x01\xfa\x00\ +)\x02\x07\x01\xfc\x00)\x02\x07\x01\xfe\x00)\x02\x07\x02\ +\x00\x00\x14\x02\x07\x02W\xff\xc3\x02\x07\x02X\xffq\x02\ +\x07\x02Y\xff\xae\x02\x07\x02`\xff\x85\x02\x07\x02b\xff\ +\xc3\x02\x07\x02j\xff\x85\x02\x07\x02r\xffq\x02\x07\x02\ +s\xffq\x02\x07\x02}\xff\xec\x02\x07\x02\x7f\xff\x85\x02\ +\x07\x02\x85\xff\x85\x02\x07\x02\x87\xff\x85\x02\x07\x02\x89\xff\ +\x85\x02\x07\x02\x8d\xff\x85\x02\x07\x02\xb2\xff\x85\x02\x07\x02\ +\xb4\xff\x85\x02\x07\x02\xce\xff\x85\x02\x07\x02\xcf\xffq\x02\ +\x07\x02\xd9\xffq\x02\x07\x02\xda\xff\xd7\x02\x07\x02\xdb\xff\ +q\x02\x07\x02\xdc\xff\xd7\x02\x07\x02\xdd\xffq\x02\x07\x02\ +\xde\xff\xd7\x02\x07\x02\xe0\xff\x85\x02\x07\x02\xe2\xff\xd7\x02\ +\x07\x02\xe4\xff\xd7\x02\x07\x02\xf0\xff\x85\x02\x07\x02\xf2\xff\ +\x85\x02\x07\x02\xf4\xff\x85\x02\x07\x03\x09\xffq\x02\x07\x03\ +\x0a\xff\x85\x02\x07\x03\x0b\xffq\x02\x07\x03\x0c\xff\x85\x02\ +\x07\x03\x11\xff\x85\x02\x07\x03\x12\xffq\x02\x07\x03\x16\xff\ +\x85\x02\x07\x03\x1a\xff\x85\x02\x07\x03\x1b\xff\x85\x02\x07\x03\ +\x1c\xffq\x02\x07\x03\x1d\xffq\x02\x07\x03\x1e\xff\xae\x02\ +\x07\x03\x1f\xffq\x02\x07\x03 \xff\xae\x02\x07\x03!\xff\ +q\x02\x07\x03\x22\xff\xae\x02\x07\x03#\xffq\x02\x07\x03\ +%\xffq\x02\x07\x03&\xff\xae\x02\x07\x03'\xffq\x02\ +\x07\x03(\xff\xae\x02\x07\x03)\xffq\x02\x07\x03*\xff\ +\xae\x02\x07\x03+\xffq\x02\x07\x03,\xff\xae\x02\x07\x03\ +-\xffq\x02\x07\x03.\xff\xae\x02\x07\x03/\xffq\x02\ +\x07\x030\xff\xae\x02\x07\x031\xffq\x02\x07\x032\xff\ +\xae\x02\x07\x033\xffq\x02\x07\x034\xff\xae\x02\x07\x03\ +6\xff\x85\x02\x07\x038\xff\x85\x02\x07\x03:\xff\x85\x02\ +\x07\x03<\xff\x85\x02\x07\x03@\xff\x85\x02\x07\x03B\xff\ +\x85\x02\x07\x03D\xff\x85\x02\x07\x03J\xff\x85\x02\x07\x03\ +L\xff\x85\x02\x07\x03N\xff\x85\x02\x07\x03R\xff\x85\x02\ +\x07\x03T\xff\x85\x02\x07\x03V\xff\x85\x02\x07\x03X\xff\ +\x85\x02\x07\x03Z\xff\x85\x02\x07\x03\x5c\xff\x85\x02\x07\x03\ +^\xff\x85\x02\x07\x03`\xff\x85\x02\x07\x03b\xff\xc3\x02\ +\x07\x03d\xff\xc3\x02\x07\x03f\xff\xc3\x02\x07\x03h\xff\ +\xc3\x02\x07\x03j\xff\xc3\x02\x07\x03l\xff\xc3\x02\x07\x03\ +n\xff\xc3\x02\x07\x03o\x00\x14\x02\x07\x03q\x00\x14\x02\ +\x07\x03s\x00\x14\x02\x07\x03\x8f\x00)\x02\x08\x00&\xff\ +\x9a\x02\x08\x00*\xff\x9a\x02\x08\x002\xff\x9a\x02\x08\x00\ +4\xff\x9a\x02\x08\x007\xffq\x02\x08\x008\xff\xd7\x02\ +\x08\x009\xff\x85\x02\x08\x00:\xff\x85\x02\x08\x00<\xff\ +\x85\x02\x08\x00\x89\xff\x9a\x02\x08\x00\x94\xff\x9a\x02\x08\x00\ +\x95\xff\x9a\x02\x08\x00\x96\xff\x9a\x02\x08\x00\x97\xff\x9a\x02\ +\x08\x00\x98\xff\x9a\x02\x08\x00\x9a\xff\x9a\x02\x08\x00\x9b\xff\ +\xd7\x02\x08\x00\x9c\xff\xd7\x02\x08\x00\x9d\xff\xd7\x02\x08\x00\ +\x9e\xff\xd7\x02\x08\x00\x9f\xff\x85\x02\x08\x00\xc8\xff\x9a\x02\ +\x08\x00\xca\xff\x9a\x02\x08\x00\xcc\xff\x9a\x02\x08\x00\xce\xff\ +\x9a\x02\x08\x00\xde\xff\x9a\x02\x08\x00\xe0\xff\x9a\x02\x08\x00\ +\xe2\xff\x9a\x02\x08\x00\xe4\xff\x9a\x02\x08\x01\x0e\xff\x9a\x02\ +\x08\x01\x10\xff\x9a\x02\x08\x01\x12\xff\x9a\x02\x08\x01\x14\xff\ +\x9a\x02\x08\x01$\xffq\x02\x08\x01&\xffq\x02\x08\x01\ +*\xff\xd7\x02\x08\x01,\xff\xd7\x02\x08\x01.\xff\xd7\x02\ +\x08\x010\xff\xd7\x02\x08\x012\xff\xd7\x02\x08\x014\xff\ +\xd7\x02\x08\x016\xff\x85\x02\x08\x018\xff\x85\x02\x08\x01\ +:\xff\x85\x02\x08\x01G\xff\x9a\x02\x08\x01f\xff\xae\x02\ +\x08\x01m\xff\xae\x02\x08\x01q\xffq\x02\x08\x01r\xff\ +\x85\x02\x08\x01s\xff\x9a\x02\x08\x01u\xff\x85\x02\x08\x01\ +x\xff\x85\x02\x08\x01\x85\xff\xd7\x02\x08\x01\x9d\xffq\x02\ +\x08\x01\x9f\xff\x9a\x02\x08\x01\xa6\xffq\x02\x08\x01\xb8\xff\ +\x9a\x02\x08\x01\xbb\xff\x9a\x02\x08\x01\xbc\xffq\x02\x08\x01\ +\xbe\xff\xae\x02\x08\x01\xc1\xff\x5c\x02\x08\x01\xc4\xffq\x02\ +\x08\x01\xdc\xff\x9a\x02\x08\x01\xe1\xff\x85\x02\x08\x01\xe4\xff\ +\x9a\x02\x08\x01\xfa\xff\x85\x02\x08\x01\xfc\xff\x85\x02\x08\x01\ +\xfe\xff\x85\x02\x08\x02\x00\xff\x85\x02\x08\x02T\xff\x85\x02\ +\x08\x02_\xff\x9a\x02\x08\x02a\xff\xd7\x02\x08\x02l\xff\ +\x9a\x02\x08\x02|\xff\x5c\x02\x08\x02~\xff\x9a\x02\x08\x02\ +\x80\xff\x85\x02\x08\x02\x82\xff\x85\x02\x08\x02\x84\xff\x9a\x02\ +\x08\x02\x86\xff\x9a\x02\x08\x02\x88\xff\x9a\x02\x08\x02\x8a\xff\ +\x9a\x02\x08\x02\x8c\xff\x9a\x02\x08\x02\xa9\xffq\x02\x08\x02\ +\xaa\xff\x9a\x02\x08\x02\xb1\xff\x9a\x02\x08\x02\xb3\xff\x9a\x02\ +\x08\x02\xb5\xffq\x02\x08\x02\xb6\xff\x9a\x02\x08\x02\xb7\xff\ +\x85\x02\x08\x02\xb9\xff\x85\x02\x08\x02\xbd\xffq\x02\x08\x02\ +\xbe\xff\x9a\x02\x08\x02\xbf\xff\x5c\x02\x08\x02\xc0\xff\x85\x02\ +\x08\x02\xc1\xff\x5c\x02\x08\x02\xc2\xff\x85\x02\x08\x02\xc5\xff\ +\x85\x02\x08\x02\xc7\xff\x85\x02\x08\x02\xd4\xff\x5c\x02\x08\x02\ +\xd5\xff\x85\x02\x08\x02\xef\xff\x9a\x02\x08\x02\xf1\xff\x9a\x02\ +\x08\x02\xf3\xff\x9a\x02\x08\x02\xfd\xff\x5c\x02\x08\x02\xfe\xff\ +\x85\x02\x08\x03\x0d\xff\x85\x02\x08\x03\x0e\xff\x9a\x02\x08\x03\ +\x0f\xff\x85\x02\x08\x03\x10\xff\x9a\x02\x08\x03\x15\xff\x9a\x02\ +\x08\x03\x17\xffq\x02\x08\x03\x18\xff\x9a\x02\x08\x03I\xff\ +\x9a\x02\x08\x03K\xff\x9a\x02\x08\x03M\xff\x9a\x02\x08\x03\ +O\xff\x9a\x02\x08\x03Q\xff\x9a\x02\x08\x03S\xff\x9a\x02\ +\x08\x03U\xff\x9a\x02\x08\x03W\xff\x9a\x02\x08\x03Y\xff\ +\x9a\x02\x08\x03[\xff\x9a\x02\x08\x03]\xff\x9a\x02\x08\x03\ +_\xff\x9a\x02\x08\x03a\xff\xd7\x02\x08\x03c\xff\xd7\x02\ +\x08\x03e\xff\xd7\x02\x08\x03g\xff\xd7\x02\x08\x03i\xff\ +\xd7\x02\x08\x03k\xff\xd7\x02\x08\x03m\xff\xd7\x02\x08\x03\ +o\xff\x85\x02\x08\x03q\xff\x85\x02\x08\x03s\xff\x85\x02\ +\x08\x03\x8f\xffq\x02\x0a\x00$\xffq\x02\x0a\x007\x00\ +)\x02\x0a\x009\x00)\x02\x0a\x00:\x00)\x02\x0a\x00\ +<\x00\x14\x02\x0a\x00D\xff\xae\x02\x0a\x00F\xff\x85\x02\ +\x0a\x00G\xff\x85\x02\x0a\x00H\xff\x85\x02\x0a\x00J\xff\ +\xc3\x02\x0a\x00P\xff\xc3\x02\x0a\x00Q\xff\xc3\x02\x0a\x00\ +R\xff\x85\x02\x0a\x00S\xff\xc3\x02\x0a\x00T\xff\x85\x02\ +\x0a\x00U\xff\xc3\x02\x0a\x00V\xff\xc3\x02\x0a\x00X\xff\ +\xc3\x02\x0a\x00\x82\xffq\x02\x0a\x00\x83\xffq\x02\x0a\x00\ +\x84\xffq\x02\x0a\x00\x85\xffq\x02\x0a\x00\x86\xffq\x02\ +\x0a\x00\x87\xffq\x02\x0a\x00\x9f\x00\x14\x02\x0a\x00\xa2\xff\ +\x85\x02\x0a\x00\xa3\xff\xae\x02\x0a\x00\xa4\xff\xae\x02\x0a\x00\ +\xa5\xff\xae\x02\x0a\x00\xa6\xff\xae\x02\x0a\x00\xa7\xff\xae\x02\ +\x0a\x00\xa8\xff\xae\x02\x0a\x00\xa9\xff\x85\x02\x0a\x00\xaa\xff\ +\x85\x02\x0a\x00\xab\xff\x85\x02\x0a\x00\xac\xff\x85\x02\x0a\x00\ +\xad\xff\x85\x02\x0a\x00\xb4\xff\x85\x02\x0a\x00\xb5\xff\x85\x02\ +\x0a\x00\xb6\xff\x85\x02\x0a\x00\xb7\xff\x85\x02\x0a\x00\xb8\xff\ +\x85\x02\x0a\x00\xba\xff\x85\x02\x0a\x00\xbb\xff\xc3\x02\x0a\x00\ +\xbc\xff\xc3\x02\x0a\x00\xbd\xff\xc3\x02\x0a\x00\xbe\xff\xc3\x02\ +\x0a\x00\xc2\xffq\x02\x0a\x00\xc3\xff\xae\x02\x0a\x00\xc4\xff\ +q\x02\x0a\x00\xc5\xff\xae\x02\x0a\x00\xc6\xffq\x02\x0a\x00\ +\xc7\xff\xae\x02\x0a\x00\xc9\xff\x85\x02\x0a\x00\xcb\xff\x85\x02\ +\x0a\x00\xcd\xff\x85\x02\x0a\x00\xcf\xff\x85\x02\x0a\x00\xd1\xff\ +\x85\x02\x0a\x00\xd3\xff\x85\x02\x0a\x00\xd5\xff\x85\x02\x0a\x00\ +\xd7\xff\x85\x02\x0a\x00\xd9\xff\x85\x02\x0a\x00\xdb\xff\x85\x02\ +\x0a\x00\xdd\xff\x85\x02\x0a\x00\xdf\xff\xc3\x02\x0a\x00\xe1\xff\ +\xc3\x02\x0a\x00\xe3\xff\xc3\x02\x0a\x00\xe5\xff\xc3\x02\x0a\x00\ +\xfa\xff\xc3\x02\x0a\x01\x06\xff\xc3\x02\x0a\x01\x08\xff\xc3\x02\ +\x0a\x01\x0d\xff\xc3\x02\x0a\x01\x0f\xff\x85\x02\x0a\x01\x11\xff\ +\x85\x02\x0a\x01\x13\xff\x85\x02\x0a\x01\x15\xff\x85\x02\x0a\x01\ +\x17\xff\xc3\x02\x0a\x01\x19\xff\xc3\x02\x0a\x01\x1d\xff\xc3\x02\ +\x0a\x01!\xff\xc3\x02\x0a\x01$\x00)\x02\x0a\x01&\x00\ +)\x02\x0a\x01+\xff\xc3\x02\x0a\x01-\xff\xc3\x02\x0a\x01\ +/\xff\xc3\x02\x0a\x011\xff\xc3\x02\x0a\x013\xff\xc3\x02\ +\x0a\x015\xff\xc3\x02\x0a\x016\x00)\x02\x0a\x018\x00\ +\x14\x02\x0a\x01:\x00\x14\x02\x0a\x01C\xffq\x02\x0a\x01\ +D\xff\xae\x02\x0a\x01F\xff\xae\x02\x0a\x01H\xff\x85\x02\ +\x0a\x01J\xff\xc3\x02\x0a\x01V\xffq\x02\x0a\x01_\xff\ +q\x02\x0a\x01b\xffq\x02\x0a\x01i\xffq\x02\x0a\x01\ +y\xff\xae\x02\x0a\x01z\xff\xd7\x02\x0a\x01{\xff\xd7\x02\ +\x0a\x01~\xff\xae\x02\x0a\x01\x81\xff\xc3\x02\x0a\x01\x82\xff\ +\xd7\x02\x0a\x01\x83\xff\xd7\x02\x0a\x01\x84\xff\xd7\x02\x0a\x01\ +\x87\xff\xd7\x02\x0a\x01\x89\xff\xd7\x02\x0a\x01\x8c\xff\xae\x02\ +\x0a\x01\x8e\xff\xc3\x02\x0a\x01\x8f\xff\xae\x02\x0a\x01\x90\xff\ +\xae\x02\x0a\x01\x93\xff\xae\x02\x0a\x01\x99\xff\xae\x02\x0a\x01\ +\xa4\xff\x85\x02\x0a\x01\xaa\xffq\x02\x0a\x01\xae\xff\x85\x02\ +\x0a\x01\xb5\xff\x85\x02\x0a\x01\xca\xff\xd7\x02\x0a\x01\xce\xff\ +q\x02\x0a\x01\xcf\xff\x85\x02\x0a\x01\xd5\xffq\x02\x0a\x01\ +\xd8\xff\x85\x02\x0a\x01\xdb\xff\x85\x02\x0a\x01\xde\xff\x85\x02\ +\x0a\x01\xea\xff\x85\x02\x0a\x01\xed\xff\x85\x02\x0a\x01\xee\xff\ +\xc3\x02\x0a\x01\xf2\xffq\x02\x0a\x01\xfa\x00)\x02\x0a\x01\ +\xfc\x00)\x02\x0a\x01\xfe\x00)\x02\x0a\x02\x00\x00\x14\x02\ +\x0a\x02W\xff\xc3\x02\x0a\x02X\xffq\x02\x0a\x02Y\xff\ +\xae\x02\x0a\x02`\xff\x85\x02\x0a\x02b\xff\xc3\x02\x0a\x02\ +j\xff\x85\x02\x0a\x02r\xffq\x02\x0a\x02s\xffq\x02\ +\x0a\x02}\xff\xec\x02\x0a\x02\x7f\xff\x85\x02\x0a\x02\x85\xff\ +\x85\x02\x0a\x02\x87\xff\x85\x02\x0a\x02\x89\xff\x85\x02\x0a\x02\ +\x8d\xff\x85\x02\x0a\x02\xb2\xff\x85\x02\x0a\x02\xb4\xff\x85\x02\ +\x0a\x02\xce\xff\x85\x02\x0a\x02\xcf\xffq\x02\x0a\x02\xd9\xff\ +q\x02\x0a\x02\xda\xff\xd7\x02\x0a\x02\xdb\xffq\x02\x0a\x02\ +\xdc\xff\xd7\x02\x0a\x02\xdd\xffq\x02\x0a\x02\xde\xff\xd7\x02\ +\x0a\x02\xe0\xff\x85\x02\x0a\x02\xe2\xff\xd7\x02\x0a\x02\xe4\xff\ +\xd7\x02\x0a\x02\xf0\xff\x85\x02\x0a\x02\xf2\xff\x85\x02\x0a\x02\ +\xf4\xff\x85\x02\x0a\x03\x09\xffq\x02\x0a\x03\x0a\xff\x85\x02\ +\x0a\x03\x0b\xffq\x02\x0a\x03\x0c\xff\x85\x02\x0a\x03\x11\xff\ +\x85\x02\x0a\x03\x12\xffq\x02\x0a\x03\x16\xff\x85\x02\x0a\x03\ +\x1a\xff\x85\x02\x0a\x03\x1b\xff\x85\x02\x0a\x03\x1c\xffq\x02\ +\x0a\x03\x1d\xffq\x02\x0a\x03\x1e\xff\xae\x02\x0a\x03\x1f\xff\ +q\x02\x0a\x03 \xff\xae\x02\x0a\x03!\xffq\x02\x0a\x03\ +\x22\xff\xae\x02\x0a\x03#\xffq\x02\x0a\x03%\xffq\x02\ +\x0a\x03&\xff\xae\x02\x0a\x03'\xffq\x02\x0a\x03(\xff\ +\xae\x02\x0a\x03)\xffq\x02\x0a\x03*\xff\xae\x02\x0a\x03\ ++\xffq\x02\x0a\x03,\xff\xae\x02\x0a\x03-\xffq\x02\ +\x0a\x03.\xff\xae\x02\x0a\x03/\xffq\x02\x0a\x030\xff\ +\xae\x02\x0a\x031\xffq\x02\x0a\x032\xff\xae\x02\x0a\x03\ +3\xffq\x02\x0a\x034\xff\xae\x02\x0a\x036\xff\x85\x02\ +\x0a\x038\xff\x85\x02\x0a\x03:\xff\x85\x02\x0a\x03<\xff\ +\x85\x02\x0a\x03@\xff\x85\x02\x0a\x03B\xff\x85\x02\x0a\x03\ +D\xff\x85\x02\x0a\x03J\xff\x85\x02\x0a\x03L\xff\x85\x02\ +\x0a\x03N\xff\x85\x02\x0a\x03R\xff\x85\x02\x0a\x03T\xff\ +\x85\x02\x0a\x03V\xff\x85\x02\x0a\x03X\xff\x85\x02\x0a\x03\ +Z\xff\x85\x02\x0a\x03\x5c\xff\x85\x02\x0a\x03^\xff\x85\x02\ +\x0a\x03`\xff\x85\x02\x0a\x03b\xff\xc3\x02\x0a\x03d\xff\ +\xc3\x02\x0a\x03f\xff\xc3\x02\x0a\x03h\xff\xc3\x02\x0a\x03\ +j\xff\xc3\x02\x0a\x03l\xff\xc3\x02\x0a\x03n\xff\xc3\x02\ +\x0a\x03o\x00\x14\x02\x0a\x03q\x00\x14\x02\x0a\x03s\x00\ +\x14\x02\x0a\x03\x8f\x00)\x02\x0c\x00&\xff\x9a\x02\x0c\x00\ +*\xff\x9a\x02\x0c\x002\xff\x9a\x02\x0c\x004\xff\x9a\x02\ +\x0c\x007\xffq\x02\x0c\x008\xff\xd7\x02\x0c\x009\xff\ +\x85\x02\x0c\x00:\xff\x85\x02\x0c\x00<\xff\x85\x02\x0c\x00\ +\x89\xff\x9a\x02\x0c\x00\x94\xff\x9a\x02\x0c\x00\x95\xff\x9a\x02\ +\x0c\x00\x96\xff\x9a\x02\x0c\x00\x97\xff\x9a\x02\x0c\x00\x98\xff\ +\x9a\x02\x0c\x00\x9a\xff\x9a\x02\x0c\x00\x9b\xff\xd7\x02\x0c\x00\ +\x9c\xff\xd7\x02\x0c\x00\x9d\xff\xd7\x02\x0c\x00\x9e\xff\xd7\x02\ +\x0c\x00\x9f\xff\x85\x02\x0c\x00\xc8\xff\x9a\x02\x0c\x00\xca\xff\ +\x9a\x02\x0c\x00\xcc\xff\x9a\x02\x0c\x00\xce\xff\x9a\x02\x0c\x00\ +\xde\xff\x9a\x02\x0c\x00\xe0\xff\x9a\x02\x0c\x00\xe2\xff\x9a\x02\ +\x0c\x00\xe4\xff\x9a\x02\x0c\x01\x0e\xff\x9a\x02\x0c\x01\x10\xff\ +\x9a\x02\x0c\x01\x12\xff\x9a\x02\x0c\x01\x14\xff\x9a\x02\x0c\x01\ +$\xffq\x02\x0c\x01&\xffq\x02\x0c\x01*\xff\xd7\x02\ +\x0c\x01,\xff\xd7\x02\x0c\x01.\xff\xd7\x02\x0c\x010\xff\ +\xd7\x02\x0c\x012\xff\xd7\x02\x0c\x014\xff\xd7\x02\x0c\x01\ +6\xff\x85\x02\x0c\x018\xff\x85\x02\x0c\x01:\xff\x85\x02\ +\x0c\x01G\xff\x9a\x02\x0c\x01f\xff\xae\x02\x0c\x01m\xff\ +\xae\x02\x0c\x01q\xffq\x02\x0c\x01r\xff\x85\x02\x0c\x01\ +s\xff\x9a\x02\x0c\x01u\xff\x85\x02\x0c\x01x\xff\x85\x02\ +\x0c\x01\x85\xff\xd7\x02\x0c\x01\x9d\xffq\x02\x0c\x01\x9f\xff\ +\x9a\x02\x0c\x01\xa6\xffq\x02\x0c\x01\xb8\xff\x9a\x02\x0c\x01\ +\xbb\xff\x9a\x02\x0c\x01\xbc\xffq\x02\x0c\x01\xbe\xff\xae\x02\ +\x0c\x01\xc1\xff\x5c\x02\x0c\x01\xc4\xffq\x02\x0c\x01\xdc\xff\ +\x9a\x02\x0c\x01\xe1\xff\x85\x02\x0c\x01\xe4\xff\x9a\x02\x0c\x01\ +\xfa\xff\x85\x02\x0c\x01\xfc\xff\x85\x02\x0c\x01\xfe\xff\x85\x02\ +\x0c\x02\x00\xff\x85\x02\x0c\x02T\xff\x85\x02\x0c\x02_\xff\ +\x9a\x02\x0c\x02a\xff\xd7\x02\x0c\x02l\xff\x9a\x02\x0c\x02\ +|\xff\x5c\x02\x0c\x02~\xff\x9a\x02\x0c\x02\x80\xff\x85\x02\ +\x0c\x02\x82\xff\x85\x02\x0c\x02\x84\xff\x9a\x02\x0c\x02\x86\xff\ +\x9a\x02\x0c\x02\x88\xff\x9a\x02\x0c\x02\x8a\xff\x9a\x02\x0c\x02\ +\x8c\xff\x9a\x02\x0c\x02\xa9\xffq\x02\x0c\x02\xaa\xff\x9a\x02\ +\x0c\x02\xb1\xff\x9a\x02\x0c\x02\xb3\xff\x9a\x02\x0c\x02\xb5\xff\ +q\x02\x0c\x02\xb6\xff\x9a\x02\x0c\x02\xb7\xff\x85\x02\x0c\x02\ +\xb9\xff\x85\x02\x0c\x02\xbd\xffq\x02\x0c\x02\xbe\xff\x9a\x02\ +\x0c\x02\xbf\xff\x5c\x02\x0c\x02\xc0\xff\x85\x02\x0c\x02\xc1\xff\ +\x5c\x02\x0c\x02\xc2\xff\x85\x02\x0c\x02\xc5\xff\x85\x02\x0c\x02\ +\xc7\xff\x85\x02\x0c\x02\xd4\xff\x5c\x02\x0c\x02\xd5\xff\x85\x02\ +\x0c\x02\xef\xff\x9a\x02\x0c\x02\xf1\xff\x9a\x02\x0c\x02\xf3\xff\ +\x9a\x02\x0c\x02\xfd\xff\x5c\x02\x0c\x02\xfe\xff\x85\x02\x0c\x03\ +\x0d\xff\x85\x02\x0c\x03\x0e\xff\x9a\x02\x0c\x03\x0f\xff\x85\x02\ +\x0c\x03\x10\xff\x9a\x02\x0c\x03\x15\xff\x9a\x02\x0c\x03\x17\xff\ +q\x02\x0c\x03\x18\xff\x9a\x02\x0c\x03I\xff\x9a\x02\x0c\x03\ +K\xff\x9a\x02\x0c\x03M\xff\x9a\x02\x0c\x03O\xff\x9a\x02\ +\x0c\x03Q\xff\x9a\x02\x0c\x03S\xff\x9a\x02\x0c\x03U\xff\ +\x9a\x02\x0c\x03W\xff\x9a\x02\x0c\x03Y\xff\x9a\x02\x0c\x03\ +[\xff\x9a\x02\x0c\x03]\xff\x9a\x02\x0c\x03_\xff\x9a\x02\ +\x0c\x03a\xff\xd7\x02\x0c\x03c\xff\xd7\x02\x0c\x03e\xff\ +\xd7\x02\x0c\x03g\xff\xd7\x02\x0c\x03i\xff\xd7\x02\x0c\x03\ +k\xff\xd7\x02\x0c\x03m\xff\xd7\x02\x0c\x03o\xff\x85\x02\ +\x0c\x03q\xff\x85\x02\x0c\x03s\xff\x85\x02\x0c\x03\x8f\xff\ +q\x02!\x01q\xff\xd7\x02!\x01r\xff\xec\x02!\x01\ +x\xff\xec\x02!\x02T\xff\xec\x02S\x00\x0f\xff\xc3\x02\ +S\x00\x11\xff\xc3\x02S\x02\x08\xff\xc3\x02S\x02\x0c\xff\ +\xc3\x02T\x00\x0f\xff\x85\x02T\x00\x11\xff\x85\x02T\x01\ +V\xff\x85\x02T\x01_\xff\x85\x02T\x01b\xff\x85\x02\ +T\x01f\xff\xd7\x02T\x01i\xff\x85\x02T\x01m\xff\ +\xd7\x02T\x01s\xff\xc3\x02T\x01v\xff\xec\x02T\x01\ +y\xff\x9a\x02T\x01z\xff\xae\x02T\x01{\xff\xc3\x02\ +T\x01|\xff\xc3\x02T\x01}\xff\xc3\x02T\x01~\xff\ +\x9a\x02T\x01\x81\xff\xc3\x02T\x01\x82\xff\xae\x02T\x01\ +\x84\xff\xc3\x02T\x01\x86\xff\xc3\x02T\x01\x87\xff\xc3\x02\ +T\x01\x89\xff\xc3\x02T\x01\x8c\xff\x9a\x02T\x01\x8e\xff\ +\x9a\x02T\x01\x8f\xff\x9a\x02T\x01\x90\xff\x9a\x02T\x01\ +\x92\xff\xc3\x02T\x01\x93\xff\x9a\x02T\x01\x95\xff\xc3\x02\ +T\x01\x96\xff\xc3\x02T\x01\x98\xff\xc3\x02T\x01\x99\xff\ +\x9a\x02T\x01\x9a\xff\xc3\x02T\x01\x9b\xff\xc3\x02T\x02\ +\x08\xff\x85\x02T\x02\x0c\xff\x85\x02T\x02!\xff\xec\x02\ +X\x00\x05\xffq\x02X\x00\x0a\xffq\x02X\x00&\xff\ +\xd7\x02X\x00*\xff\xd7\x02X\x00-\x01\x0a\x02X\x00\ +2\xff\xd7\x02X\x004\xff\xd7\x02X\x007\xffq\x02\ +X\x009\xff\xae\x02X\x00:\xff\xae\x02X\x00<\xff\ +\x85\x02X\x00\x89\xff\xd7\x02X\x00\x94\xff\xd7\x02X\x00\ +\x95\xff\xd7\x02X\x00\x96\xff\xd7\x02X\x00\x97\xff\xd7\x02\ +X\x00\x98\xff\xd7\x02X\x00\x9a\xff\xd7\x02X\x00\x9f\xff\ +\x85\x02X\x00\xc8\xff\xd7\x02X\x00\xca\xff\xd7\x02X\x00\ +\xcc\xff\xd7\x02X\x00\xce\xff\xd7\x02X\x00\xde\xff\xd7\x02\ +X\x00\xe0\xff\xd7\x02X\x00\xe2\xff\xd7\x02X\x00\xe4\xff\ +\xd7\x02X\x01\x0e\xff\xd7\x02X\x01\x10\xff\xd7\x02X\x01\ +\x12\xff\xd7\x02X\x01\x14\xff\xd7\x02X\x01$\xffq\x02\ +X\x01&\xffq\x02X\x016\xff\xae\x02X\x018\xff\ +\x85\x02X\x01:\xff\x85\x02X\x01G\xff\xd7\x02X\x01\ +\xfa\xff\xae\x02X\x01\xfc\xff\xae\x02X\x01\xfe\xff\xae\x02\ +X\x02\x00\xff\x85\x02X\x02\x07\xffq\x02X\x02\x0b\xff\ +q\x02X\x02_\xff\xd7\x02X\x03I\xff\xd7\x02X\x03\ +K\xff\xd7\x02X\x03M\xff\xd7\x02X\x03O\xff\xd7\x02\ +X\x03Q\xff\xd7\x02X\x03S\xff\xd7\x02X\x03U\xff\ +\xd7\x02X\x03W\xff\xd7\x02X\x03Y\xff\xd7\x02X\x03\ +[\xff\xd7\x02X\x03]\xff\xd7\x02X\x03_\xff\xd7\x02\ +X\x03o\xff\x85\x02X\x03q\xff\x85\x02X\x03s\xff\ +\x85\x02X\x03\x8f\xffq\x02Y\x00\x05\xff\xec\x02Y\x00\ +\x0a\xff\xec\x02Y\x02\x07\xff\xec\x02Y\x02\x0b\xff\xec\x02\ +Z\x00\x0f\xff\xae\x02Z\x00\x11\xff\xae\x02Z\x01V\xff\ +\xd7\x02Z\x01_\xff\xd7\x02Z\x01b\xff\xd7\x02Z\x01\ +d\xff\xec\x02Z\x01i\xff\xd7\x02Z\x01p\xff\xec\x02\ +Z\x01q\xff\xc3\x02Z\x01r\xff\xec\x02Z\x01t\xff\ +\xd7\x02Z\x01u\xff\xec\x02Z\x01x\xff\xec\x02Z\x01\ +\x88\xff\xec\x02Z\x02\x08\xff\xae\x02Z\x02\x0c\xff\xae\x02\ +Z\x02T\xff\xec\x02`\x00I\x00R\x02`\x00W\x00\ +R\x02`\x00Y\x00f\x02`\x00Z\x00f\x02`\x00\ +[\x00f\x02`\x00\x5c\x00f\x02`\x00\xbf\x00f\x02\ +`\x01%\x00R\x02`\x01'\x00R\x02`\x017\x00\ +f\x02`\x01\xfb\x00f\x02`\x01\xfd\x00f\x02`\x02\ +4\x00R\x02`\x025\x00R\x02`\x02]\x00R\x02\ +`\x02^\x00R\x02`\x03p\x00f\x02`\x03\x8d\x00\ +R\x02`\x03\x90\x00R\x02b\x00I\x00f\x02b\x00\ +W\x00f\x02b\x00Y\x00f\x02b\x00Z\x00f\x02\ +b\x00[\x00f\x02b\x00\x5c\x00f\x02b\x00\xbf\x00\ +f\x02b\x01%\x00f\x02b\x01'\x00f\x02b\x01\ +7\x00f\x02b\x01\xfb\x00f\x02b\x01\xfd\x00f\x02\ +b\x024\x00f\x02b\x025\x00f\x02b\x02]\x00\ +f\x02b\x02^\x00f\x02b\x03p\x00f\x02b\x03\ +\x8d\x00f\x02b\x03\x90\x00f\x02j\x00\x05\xff\xec\x02\ +j\x00\x0a\xff\xec\x02j\x02\x07\xff\xec\x02j\x02\x0b\xff\ +\xec\x02l\x00\x0f\xff\xae\x02l\x00\x11\xff\xae\x02l\x01\ +\x9d\xff\xec\x02l\x01\xa4\xff\xd7\x02l\x01\xa6\xff\xec\x02\ +l\x01\xa8\xff\xd7\x02l\x01\xaa\xff\xd7\x02l\x01\xae\xff\ +\xd7\x02l\x01\xb0\xff\xd7\x02l\x01\xb1\xff\xec\x02l\x01\ +\xb5\xff\xd7\x02l\x01\xbc\xff\xc3\x02l\x01\xbd\xff\xd7\x02\ +l\x01\xbf\xff\xd7\x02l\x01\xc1\xff\xd7\x02l\x01\xc4\xff\ +\xec\x02l\x01\xc7\xff\xec\x02l\x01\xce\xff\xec\x02l\x01\ +\xd5\xff\xec\x02l\x01\xf2\xff\xec\x02l\x02\x08\xff\xae\x02\ +l\x02\x0c\xff\xae\x02l\x02r\xff\xd7\x02l\x02s\xff\ +\xec\x02l\x02z\xff\xec\x02l\x02|\xff\xd7\x02l\x02\ +\x80\xff\xec\x02l\x02\x82\xff\xec\x02l\x02\x9f\xff\xd7\x02\ +l\x02\xa1\xff\xec\x02l\x02\xa9\xff\xec\x02l\x02\xb5\xff\ +\xc3\x02l\x02\xb7\xff\xec\x02l\x02\xb9\xff\xec\x02l\x02\ +\xbb\xff\xd7\x02l\x02\xbd\xff\xec\x02l\x02\xbf\xff\xd7\x02\ +l\x02\xc1\xff\xd7\x02l\x02\xca\xff\xd7\x02l\x02\xce\xff\ +\xd7\x02l\x02\xcf\xff\xec\x02l\x02\xd4\xff\xd7\x02l\x02\ +\xd9\xff\xd7\x02l\x02\xdb\xff\xd7\x02l\x02\xdd\xff\xd7\x02\ +l\x02\xe5\xff\xd7\x02l\x02\xe7\xff\xec\x02l\x02\xf5\xff\ +\xec\x02l\x02\xf7\xff\xd7\x02l\x02\xf9\xff\xd7\x02l\x02\ +\xfb\xff\xd7\x02l\x02\xfd\xff\xd7\x02l\x03\x05\xff\xd7\x02\ +l\x03\x07\xff\xd7\x02l\x03\x0d\xff\xd7\x02l\x03\x0f\xff\ +\xd7\x02l\x03\x11\xff\xd7\x02l\x03\x12\xff\xec\x02l\x03\ +\x17\xff\xec\x02l\x03\x1b\xff\xd7\x02l\x03\x1c\xff\xec\x02\ +m\x00\x0f\xff\xae\x02m\x00\x11\xff\xae\x02m\x01\xce\xff\ +\xd7\x02m\x01\xd5\xff\xd7\x02m\x01\xf2\xff\xd7\x02m\x02\ +\x08\xff\xae\x02m\x02\x0c\xff\xae\x02m\x02s\xff\xd7\x02\ +m\x02\xcf\xff\xd7\x02m\x03\x12\xff\xd7\x02m\x03\x1c\xff\ +\xd7\x02n\x00\x05\xff\xae\x02n\x00\x0a\xff\xae\x02n\x01\ +\x9d\xff\xd7\x02n\x01\xa6\xff\xd7\x02n\x01\xbc\xff\xae\x02\ +n\x01\xc1\xff\xae\x02n\x01\xc4\xff\xd7\x02n\x01\xdc\xff\ +\xd7\x02n\x01\xe4\xff\xd7\x02n\x02\x07\xff\xae\x02n\x02\ +\x0b\xff\xae\x02n\x02|\xff\xae\x02n\x02\x80\xff\xc3\x02\ +n\x02\x82\xff\xc3\x02n\x02\xa9\xff\xd7\x02n\x02\xaa\xff\ +\xd7\x02n\x02\xb5\xff\xae\x02n\x02\xb6\xff\xd7\x02n\x02\ +\xb7\xff\xc3\x02n\x02\xb9\xff\xc3\x02n\x02\xbd\xff\xd7\x02\ +n\x02\xbe\xff\xd7\x02n\x02\xbf\xff\xae\x02n\x02\xc1\xff\ +\xae\x02n\x02\xd4\xff\xae\x02n\x02\xfd\xff\xae\x02n\x03\ +\x0d\xff\x9a\x02n\x03\x0f\xff\x9a\x02n\x03\x17\xff\xd7\x02\ +n\x03\x18\xff\xd7\x02o\x00\x05\xff\x85\x02o\x00\x0a\xff\ +\x85\x02o\x01\xd0\xff\xd7\x02o\x01\xdc\xff\x9a\x02o\x01\ +\xdd\xff\xc3\x02o\x01\xdf\xff\xd7\x02o\x01\xe1\xff\xae\x02\ +o\x01\xe4\xff\x9a\x02o\x01\xf6\xff\xc3\x02o\x02\x07\xff\ +\x85\x02o\x02\x0b\xff\x85\x02o\x02m\xff\xd7\x02o\x02\ +\x81\xff\xd7\x02o\x02\x83\xff\xd7\x02o\x02\x8b\xff\xd7\x02\ +o\x02\xa0\xff\xd7\x02o\x02\xaa\xff\x9a\x02o\x02\xb6\xff\ +\x9a\x02o\x02\xb8\xff\xc3\x02o\x02\xba\xff\xc3\x02o\x02\ +\xbc\xff\xd7\x02o\x02\xbe\xff\x9a\x02o\x02\xc0\xff\xae\x02\ +o\x02\xc2\xff\xae\x02o\x02\xc6\xff\xd7\x02o\x02\xc8\xff\ +\xd7\x02o\x02\xcb\xff\xd7\x02o\x02\xd5\xff\xae\x02o\x02\ +\xe6\xff\xd7\x02o\x02\xea\xff\xd7\x02o\x02\xf8\xff\xc3\x02\ +o\x02\xfa\xff\xc3\x02o\x02\xfc\xff\xc3\x02o\x02\xfe\xff\ +\xae\x02o\x03\x06\xff\xd7\x02o\x03\x08\xff\xd7\x02o\x03\ +\x0e\xff\x9a\x02o\x03\x10\xff\x9a\x02o\x03\x18\xff\x9a\x02\ +p\x01\x9f\xff\xd7\x02p\x01\xb8\xff\xd7\x02p\x01\xbb\xff\ +\xd7\x02p\x01\xbe\xff\xd7\x02p\x01\xe1\xff\xd7\x02p\x02\ +l\xff\xd7\x02p\x02~\xff\xd7\x02p\x02\x84\xff\xd7\x02\ +p\x02\x86\xff\xd7\x02p\x02\x88\xff\xd7\x02p\x02\x8a\xff\ +\xd7\x02p\x02\x8c\xff\xd7\x02p\x02\xb1\xff\xd7\x02p\x02\ +\xb3\xff\xd7\x02p\x02\xc0\xff\xd7\x02p\x02\xc2\xff\xd7\x02\ +p\x02\xc5\xff\xd7\x02p\x02\xc7\xff\xd7\x02p\x02\xd5\xff\ +\xd7\x02p\x02\xef\xff\xd7\x02p\x02\xf1\xff\xd7\x02p\x02\ +\xf3\xff\xd7\x02p\x02\xfe\xff\xd7\x02p\x03\x09\xff\xd7\x02\ +p\x03\x0b\xff\xd7\x02p\x03\x0e\xff\xd7\x02p\x03\x10\xff\ +\xd7\x02p\x03\x15\xff\xd7\x02r\x00\x05\xffq\x02r\x00\ +\x0a\xffq\x02r\x01\x9d\xff\x9a\x02r\x01\xa6\xff\x9a\x02\ +r\x01\xbc\xffq\x02r\x01\xbe\xff\xd7\x02r\x01\xc1\xff\ +\x9a\x02r\x01\xc4\xff\x9a\x02r\x01\xdc\xff\xd7\x02r\x01\ +\xe1\xff\xd7\x02r\x01\xe4\xff\xd7\x02r\x02\x07\xffq\x02\ +r\x02\x0b\xffq\x02r\x02n\xff\xd7\x02r\x02|\xff\ +\x9a\x02r\x02\x80\xff\xae\x02r\x02\x82\xff\xae\x02r\x02\ +\x97\xff\xd7\x02r\x02\x9b\xff\xd7\x02r\x02\xa7\xff\xd7\x02\ +r\x02\xa9\xff\x9a\x02r\x02\xaa\xff\xd7\x02r\x02\xb5\xff\ +q\x02r\x02\xb6\xff\xd7\x02r\x02\xb7\xff\x85\x02r\x02\ +\xb9\xff\x85\x02r\x02\xbd\xff\x9a\x02r\x02\xbe\xff\xd7\x02\ +r\x02\xbf\xff\x9a\x02r\x02\xc0\xff\xd7\x02r\x02\xc1\xff\ +\x9a\x02r\x02\xc2\xff\xd7\x02r\x02\xc5\xff\x9a\x02r\x02\ +\xc7\xff\x9a\x02r\x02\xd4\xff\x9a\x02r\x02\xd5\xff\xd7\x02\ +r\x02\xe1\xff\xd7\x02r\x02\xe3\xff\xd7\x02r\x02\xfd\xff\ +\x9a\x02r\x02\xfe\xff\xd7\x02r\x03\x03\xff\xd7\x02r\x03\ +\x0d\xffq\x02r\x03\x0e\xff\xd7\x02r\x03\x0f\xffq\x02\ +r\x03\x10\xff\xd7\x02r\x03\x17\xff\x9a\x02r\x03\x18\xff\ +\xd7\x02s\x00\x05\xffq\x02s\x00\x0a\xffq\x02s\x01\ +\xcf\xff\xd7\x02s\x01\xd8\xff\xd7\x02s\x01\xdb\xff\xd7\x02\ +s\x01\xdc\xff\x9a\x02s\x01\xdd\xff\xc3\x02s\x01\xde\xff\ +\xd7\x02s\x01\xe1\xff\xc3\x02s\x01\xe4\xff\x9a\x02s\x01\ +\xea\xff\xd7\x02s\x01\xed\xff\xd7\x02s\x01\xf6\xff\xc3\x02\ +s\x02\x07\xffq\x02s\x02\x0b\xffq\x02s\x02j\xff\ +\xd7\x02s\x02m\xff\xd7\x02s\x02}\xff\xec\x02s\x02\ +\x7f\xff\xd7\x02s\x02\x81\xff\xd7\x02s\x02\x83\xff\xd7\x02\ +s\x02\x85\xff\xd7\x02s\x02\x87\xff\xd7\x02s\x02\x89\xff\ +\xd7\x02s\x02\x8b\xff\xd7\x02s\x02\x8d\xff\xd7\x02s\x02\ +\xaa\xff\x9a\x02s\x02\xb2\xff\xd7\x02s\x02\xb4\xff\xd7\x02\ +s\x02\xb6\xff\x9a\x02s\x02\xb8\xff\xd7\x02s\x02\xba\xff\ +\xd7\x02s\x02\xbe\xff\x9a\x02s\x02\xc0\xff\xc3\x02s\x02\ +\xc2\xff\xc3\x02s\x02\xc6\xff\xd7\x02s\x02\xc8\xff\xd7\x02\ +s\x02\xd5\xff\xc3\x02s\x02\xe0\xff\xd7\x02s\x02\xf0\xff\ +\xd7\x02s\x02\xf2\xff\xd7\x02s\x02\xf4\xff\xd7\x02s\x02\ +\xf8\xff\xc3\x02s\x02\xfa\xff\xc3\x02s\x02\xfc\xff\xc3\x02\ +s\x02\xfe\xff\xc3\x02s\x03\x0a\xff\xd7\x02s\x03\x0c\xff\ +\xd7\x02s\x03\x0e\xff\x85\x02s\x03\x10\xff\x85\x02s\x03\ +\x16\xff\xd7\x02s\x03\x18\xff\x9a\x02s\x03\x1a\xff\xd7\x02\ +t\x00\x05\xffq\x02t\x00\x0a\xffq\x02t\x01\x9d\xff\ +\x9a\x02t\x01\xa6\xff\x9a\x02t\x01\xbc\xffq\x02t\x01\ +\xbe\xff\xd7\x02t\x01\xc1\xff\x9a\x02t\x01\xc4\xff\x9a\x02\ +t\x01\xdc\xff\xd7\x02t\x01\xe1\xff\xd7\x02t\x01\xe4\xff\ +\xd7\x02t\x02\x07\xffq\x02t\x02\x0b\xffq\x02t\x02\ +n\xff\xd7\x02t\x02|\xff\x9a\x02t\x02\x80\xff\xae\x02\ +t\x02\x82\xff\xae\x02t\x02\x97\xff\xd7\x02t\x02\x9b\xff\ +\xd7\x02t\x02\xa7\xff\xd7\x02t\x02\xa9\xff\x9a\x02t\x02\ +\xaa\xff\xd7\x02t\x02\xb5\xffq\x02t\x02\xb6\xff\xd7\x02\ +t\x02\xb7\xff\x85\x02t\x02\xb9\xff\x85\x02t\x02\xbd\xff\ +\x9a\x02t\x02\xbe\xff\xd7\x02t\x02\xbf\xff\x9a\x02t\x02\ +\xc0\xff\xd7\x02t\x02\xc1\xff\x9a\x02t\x02\xc2\xff\xd7\x02\ +t\x02\xc5\xff\x9a\x02t\x02\xc7\xff\x9a\x02t\x02\xd4\xff\ +\x9a\x02t\x02\xd5\xff\xd7\x02t\x02\xe1\xff\xd7\x02t\x02\ +\xe3\xff\xd7\x02t\x02\xfd\xff\x9a\x02t\x02\xfe\xff\xd7\x02\ +t\x03\x03\xff\xd7\x02t\x03\x0d\xffq\x02t\x03\x0e\xff\ +\xd7\x02t\x03\x0f\xffq\x02t\x03\x10\xff\xd7\x02t\x03\ +\x17\xff\x9a\x02t\x03\x18\xff\xd7\x02u\x00\x05\xffq\x02\ +u\x00\x0a\xffq\x02u\x01\xcf\xff\xd7\x02u\x01\xd8\xff\ +\xd7\x02u\x01\xdb\xff\xd7\x02u\x01\xdc\xff\x9a\x02u\x01\ +\xdd\xff\xc3\x02u\x01\xde\xff\xd7\x02u\x01\xe1\xff\xc3\x02\ +u\x01\xe4\xff\x9a\x02u\x01\xea\xff\xd7\x02u\x01\xed\xff\ +\xd7\x02u\x01\xf6\xff\xc3\x02u\x02\x07\xffq\x02u\x02\ +\x0b\xffq\x02u\x02j\xff\xd7\x02u\x02m\xff\xd7\x02\ +u\x02}\xff\xec\x02u\x02\x7f\xff\xd7\x02u\x02\x81\xff\ +\xd7\x02u\x02\x83\xff\xd7\x02u\x02\x85\xff\xd7\x02u\x02\ +\x87\xff\xd7\x02u\x02\x89\xff\xd7\x02u\x02\x8b\xff\xd7\x02\ +u\x02\x8d\xff\xd7\x02u\x02\xaa\xff\x9a\x02u\x02\xb2\xff\ +\xd7\x02u\x02\xb4\xff\xd7\x02u\x02\xb6\xff\x9a\x02u\x02\ +\xb8\xff\xd7\x02u\x02\xba\xff\xd7\x02u\x02\xbe\xff\x9a\x02\ +u\x02\xc0\xff\xc3\x02u\x02\xc2\xff\xc3\x02u\x02\xc6\xff\ +\xd7\x02u\x02\xc8\xff\xd7\x02u\x02\xd5\xff\xc3\x02u\x02\ +\xe0\xff\xd7\x02u\x02\xf0\xff\xd7\x02u\x02\xf2\xff\xd7\x02\ +u\x02\xf4\xff\xd7\x02u\x02\xf8\xff\xc3\x02u\x02\xfa\xff\ +\xc3\x02u\x02\xfc\xff\xc3\x02u\x02\xfe\xff\xc3\x02u\x03\ +\x0a\xff\xd7\x02u\x03\x0c\xff\xd7\x02u\x03\x0e\xff\x85\x02\ +u\x03\x10\xff\x85\x02u\x03\x16\xff\xd7\x02u\x03\x18\xff\ +\x9a\x02u\x03\x1a\xff\xd7\x02v\x03\x0d\xff\xec\x02v\x03\ +\x0f\xff\xec\x02x\x03\x0d\xff\xec\x02x\x03\x0f\xff\xec\x02\ +z\x00\x0f\xff\xae\x02z\x00\x11\xff\xae\x02z\x02\x08\xff\ +\xae\x02z\x02\x0c\xff\xae\x02z\x02\x80\xff\xec\x02z\x02\ +\x82\xff\xec\x02z\x02\xb7\xff\xec\x02z\x02\xb9\xff\xec\x02\ +z\x03\x0d\xff\xd7\x02z\x03\x0f\xff\xd7\x02|\x00\x0f\xff\ +q\x02|\x00\x11\xffq\x02|\x01\xa4\xff\xc3\x02|\x01\ +\xaa\xff\xae\x02|\x01\xae\xff\xc3\x02|\x01\xb5\xff\xc3\x02\ +|\x01\xce\xff\xd7\x02|\x01\xd5\xff\xd7\x02|\x01\xf2\xff\ +\xd7\x02|\x02\x08\xffq\x02|\x02\x0c\xffq\x02|\x02\ +r\xff\xae\x02|\x02s\xff\xd7\x02|\x02\xce\xff\xc3\x02\ +|\x02\xcf\xff\xd7\x02|\x02\xd9\xff\xae\x02|\x02\xdb\xff\ +\xae\x02|\x02\xdd\xff\xae\x02|\x03\x09\xff\xae\x02|\x03\ +\x0b\xff\xae\x02|\x03\x11\xff\xc3\x02|\x03\x12\xff\xd7\x02\ +|\x03\x1b\xff\xc3\x02|\x03\x1c\xff\xd7\x02}\x00\x05\xff\ +\xec\x02}\x00\x0a\xff\xec\x02}\x01\xd0\xff\xd7\x02}\x01\ +\xdc\xff\xec\x02}\x01\xdd\xff\xec\x02}\x01\xdf\xff\xd7\x02\ +}\x01\xe1\xff\xec\x02}\x01\xe4\xff\xec\x02}\x01\xf6\xff\ +\xec\x02}\x02\x07\xff\xec\x02}\x02\x0b\xff\xec\x02}\x02\ +\xa0\xff\xd7\x02}\x02\xaa\xff\xec\x02}\x02\xb6\xff\xec\x02\ +}\x02\xbc\xff\xd7\x02}\x02\xbe\xff\xec\x02}\x02\xc0\xff\ +\xec\x02}\x02\xc2\xff\xec\x02}\x02\xcb\xff\xd7\x02}\x02\ +\xd5\xff\xec\x02}\x02\xe6\xff\xd7\x02}\x02\xf8\xff\xec\x02\ +}\x02\xfa\xff\xec\x02}\x02\xfc\xff\xec\x02}\x02\xfe\xff\ +\xec\x02}\x03\x06\xff\xd7\x02}\x03\x08\xff\xd7\x02}\x03\ +\x0e\xff\xec\x02}\x03\x10\xff\xec\x02}\x03\x18\xff\xec\x02\ +~\x00\x0f\xff\xae\x02~\x00\x11\xff\xae\x02~\x01\x9d\xff\ +\xec\x02~\x01\xa4\xff\xd7\x02~\x01\xa6\xff\xec\x02~\x01\ +\xa8\xff\xd7\x02~\x01\xaa\xff\xd7\x02~\x01\xae\xff\xd7\x02\ +~\x01\xb0\xff\xd7\x02~\x01\xb1\xff\xec\x02~\x01\xb5\xff\ +\xd7\x02~\x01\xbc\xff\xc3\x02~\x01\xbd\xff\xd7\x02~\x01\ +\xbf\xff\xd7\x02~\x01\xc1\xff\xd7\x02~\x01\xc4\xff\xec\x02\ +~\x01\xc7\xff\xec\x02~\x01\xce\xff\xec\x02~\x01\xd5\xff\ +\xec\x02~\x01\xf2\xff\xec\x02~\x02\x08\xff\xae\x02~\x02\ +\x0c\xff\xae\x02~\x02r\xff\xd7\x02~\x02s\xff\xec\x02\ +~\x02z\xff\xec\x02~\x02|\xff\xd7\x02~\x02\x80\xff\ +\xec\x02~\x02\x82\xff\xec\x02~\x02\x9f\xff\xd7\x02~\x02\ +\xa1\xff\xec\x02~\x02\xa9\xff\xec\x02~\x02\xb5\xff\xc3\x02\ +~\x02\xb7\xff\xec\x02~\x02\xb9\xff\xec\x02~\x02\xbb\xff\ +\xd7\x02~\x02\xbd\xff\xec\x02~\x02\xbf\xff\xd7\x02~\x02\ +\xc1\xff\xd7\x02~\x02\xca\xff\xd7\x02~\x02\xce\xff\xd7\x02\ +~\x02\xcf\xff\xec\x02~\x02\xd4\xff\xd7\x02~\x02\xd9\xff\ +\xd7\x02~\x02\xdb\xff\xd7\x02~\x02\xdd\xff\xd7\x02~\x02\ +\xe5\xff\xd7\x02~\x02\xe7\xff\xec\x02~\x02\xf5\xff\xec\x02\ +~\x02\xf7\xff\xd7\x02~\x02\xf9\xff\xd7\x02~\x02\xfb\xff\ +\xd7\x02~\x02\xfd\xff\xd7\x02~\x03\x05\xff\xd7\x02~\x03\ +\x07\xff\xd7\x02~\x03\x0d\xff\xd7\x02~\x03\x0f\xff\xd7\x02\ +~\x03\x11\xff\xd7\x02~\x03\x12\xff\xec\x02~\x03\x17\xff\ +\xec\x02~\x03\x1b\xff\xd7\x02~\x03\x1c\xff\xec\x02\x7f\x00\ +\x05\xff\xec\x02\x7f\x00\x0a\xff\xec\x02\x7f\x01\xd0\xff\xd7\x02\ +\x7f\x01\xdc\xff\xec\x02\x7f\x01\xdd\xff\xec\x02\x7f\x01\xdf\xff\ +\xd7\x02\x7f\x01\xe1\xff\xec\x02\x7f\x01\xe4\xff\xec\x02\x7f\x01\ +\xf6\xff\xec\x02\x7f\x02\x07\xff\xec\x02\x7f\x02\x0b\xff\xec\x02\ +\x7f\x02\xa0\xff\xd7\x02\x7f\x02\xaa\xff\xec\x02\x7f\x02\xb6\xff\ +\xec\x02\x7f\x02\xbc\xff\xd7\x02\x7f\x02\xbe\xff\xec\x02\x7f\x02\ +\xc0\xff\xec\x02\x7f\x02\xc2\xff\xec\x02\x7f\x02\xcb\xff\xd7\x02\ +\x7f\x02\xd5\xff\xec\x02\x7f\x02\xe6\xff\xd7\x02\x7f\x02\xf8\xff\ +\xec\x02\x7f\x02\xfa\xff\xec\x02\x7f\x02\xfc\xff\xec\x02\x7f\x02\ +\xfe\xff\xec\x02\x7f\x03\x06\xff\xd7\x02\x7f\x03\x08\xff\xd7\x02\ +\x7f\x03\x0e\xff\xec\x02\x7f\x03\x10\xff\xec\x02\x7f\x03\x18\xff\ +\xec\x02\x80\x00\x0f\xff\x85\x02\x80\x00\x11\xff\x85\x02\x80\x01\ +\x9f\xff\xec\x02\x80\x01\xa4\xff\x9a\x02\x80\x01\xaa\xffq\x02\ +\x80\x01\xae\xff\x9a\x02\x80\x01\xb5\xff\x9a\x02\x80\x01\xb8\xff\ +\xec\x02\x80\x01\xbb\xff\xec\x02\x80\x01\xbe\xff\xc3\x02\x80\x01\ +\xc9\xff\xec\x02\x80\x01\xce\xff\xae\x02\x80\x01\xcf\xff\xd7\x02\ +\x80\x01\xd5\xff\xae\x02\x80\x01\xd8\xff\xd7\x02\x80\x01\xdb\xff\ +\xd7\x02\x80\x01\xde\xff\xd7\x02\x80\x01\xe1\xff\xd7\x02\x80\x01\ +\xea\xff\xd7\x02\x80\x01\xeb\x00f\x02\x80\x01\xed\xff\xd7\x02\ +\x80\x01\xee\xff\xec\x02\x80\x01\xf2\xff\xae\x02\x80\x01\xf4\x00\ +f\x02\x80\x02\x08\xff\x85\x02\x80\x02\x0c\xff\x85\x02\x80\x02\ +j\xff\xd7\x02\x80\x02l\xff\xec\x02\x80\x02r\xffq\x02\ +\x80\x02s\xff\xae\x02\x80\x02~\xff\xec\x02\x80\x02\x7f\xff\ +\xd7\x02\x80\x02\x84\xff\xec\x02\x80\x02\x85\xff\xd7\x02\x80\x02\ +\x86\xff\xec\x02\x80\x02\x87\xff\xd7\x02\x80\x02\x88\xff\xec\x02\ +\x80\x02\x89\xff\xd7\x02\x80\x02\x8a\xff\xec\x02\x80\x02\x8c\xff\ +\xec\x02\x80\x02\x8d\xff\xd7\x02\x80\x02\x98\x00f\x02\x80\x02\ +\xa8\x00f\x02\x80\x02\xb1\xff\xec\x02\x80\x02\xb2\xff\xd7\x02\ +\x80\x02\xb3\xff\xec\x02\x80\x02\xb4\xff\xd7\x02\x80\x02\xc0\xff\ +\xd7\x02\x80\x02\xc2\xff\xd7\x02\x80\x02\xc5\xff\xd7\x02\x80\x02\ +\xc6\xff\xc3\x02\x80\x02\xc7\xff\xd7\x02\x80\x02\xc8\xff\xc3\x02\ +\x80\x02\xce\xff\x9a\x02\x80\x02\xcf\xff\xae\x02\x80\x02\xd5\xff\ +\xd7\x02\x80\x02\xd9\xffq\x02\x80\x02\xdb\xffq\x02\x80\x02\ +\xdd\xffq\x02\x80\x02\xe0\xff\xd7\x02\x80\x02\xef\xff\xec\x02\ +\x80\x02\xf0\xff\xd7\x02\x80\x02\xf1\xff\xec\x02\x80\x02\xf2\xff\ +\xd7\x02\x80\x02\xf3\xff\xec\x02\x80\x02\xf4\xff\xd7\x02\x80\x02\ +\xfe\xff\xd7\x02\x80\x03\x09\xffq\x02\x80\x03\x0a\xff\xd7\x02\ +\x80\x03\x0b\xffq\x02\x80\x03\x0c\xff\xd7\x02\x80\x03\x11\xff\ +\x9a\x02\x80\x03\x12\xff\xae\x02\x80\x03\x15\xff\xec\x02\x80\x03\ +\x16\xff\xd7\x02\x80\x03\x1a\xff\xd7\x02\x80\x03\x1b\xff\x9a\x02\ +\x80\x03\x1c\xff\xae\x02\x81\x00\x0f\xff\xae\x02\x81\x00\x11\xff\ +\xae\x02\x81\x01\xce\xff\xd7\x02\x81\x01\xd5\xff\xd7\x02\x81\x01\ +\xf2\xff\xd7\x02\x81\x02\x08\xff\xae\x02\x81\x02\x0c\xff\xae\x02\ +\x81\x02s\xff\xd7\x02\x81\x02\xcf\xff\xd7\x02\x81\x03\x12\xff\ +\xd7\x02\x81\x03\x1c\xff\xd7\x02\x82\x00\x0f\xff\x85\x02\x82\x00\ +\x11\xff\x85\x02\x82\x01\x9f\xff\xec\x02\x82\x01\xa4\xff\x9a\x02\ +\x82\x01\xaa\xffq\x02\x82\x01\xae\xff\x9a\x02\x82\x01\xb5\xff\ +\x9a\x02\x82\x01\xb8\xff\xec\x02\x82\x01\xbb\xff\xec\x02\x82\x01\ +\xbe\xff\xc3\x02\x82\x01\xc9\xff\xec\x02\x82\x01\xce\xff\xae\x02\ +\x82\x01\xcf\xff\xd7\x02\x82\x01\xd5\xff\xae\x02\x82\x01\xd8\xff\ +\xd7\x02\x82\x01\xdb\xff\xd7\x02\x82\x01\xde\xff\xd7\x02\x82\x01\ +\xe1\xff\xd7\x02\x82\x01\xea\xff\xd7\x02\x82\x01\xeb\x00f\x02\ +\x82\x01\xed\xff\xd7\x02\x82\x01\xee\xff\xec\x02\x82\x01\xf2\xff\ +\xae\x02\x82\x01\xf4\x00f\x02\x82\x02\x08\xff\x85\x02\x82\x02\ +\x0c\xff\x85\x02\x82\x02j\xff\xd7\x02\x82\x02l\xff\xec\x02\ +\x82\x02r\xffq\x02\x82\x02s\xff\xae\x02\x82\x02~\xff\ +\xec\x02\x82\x02\x7f\xff\xd7\x02\x82\x02\x84\xff\xec\x02\x82\x02\ +\x85\xff\xd7\x02\x82\x02\x86\xff\xec\x02\x82\x02\x87\xff\xd7\x02\ +\x82\x02\x88\xff\xec\x02\x82\x02\x89\xff\xd7\x02\x82\x02\x8a\xff\ +\xec\x02\x82\x02\x8c\xff\xec\x02\x82\x02\x8d\xff\xd7\x02\x82\x02\ +\x98\x00f\x02\x82\x02\xa8\x00f\x02\x82\x02\xb1\xff\xec\x02\ +\x82\x02\xb2\xff\xd7\x02\x82\x02\xb3\xff\xec\x02\x82\x02\xb4\xff\ +\xd7\x02\x82\x02\xc0\xff\xd7\x02\x82\x02\xc2\xff\xd7\x02\x82\x02\ +\xc5\xff\xd7\x02\x82\x02\xc6\xff\xc3\x02\x82\x02\xc7\xff\xd7\x02\ +\x82\x02\xc8\xff\xc3\x02\x82\x02\xce\xff\x9a\x02\x82\x02\xcf\xff\ +\xae\x02\x82\x02\xd5\xff\xd7\x02\x82\x02\xd9\xffq\x02\x82\x02\ +\xdb\xffq\x02\x82\x02\xdd\xffq\x02\x82\x02\xe0\xff\xd7\x02\ +\x82\x02\xef\xff\xec\x02\x82\x02\xf0\xff\xd7\x02\x82\x02\xf1\xff\ +\xec\x02\x82\x02\xf2\xff\xd7\x02\x82\x02\xf3\xff\xec\x02\x82\x02\ +\xf4\xff\xd7\x02\x82\x02\xfe\xff\xd7\x02\x82\x03\x09\xffq\x02\ +\x82\x03\x0a\xff\xd7\x02\x82\x03\x0b\xffq\x02\x82\x03\x0c\xff\ +\xd7\x02\x82\x03\x11\xff\x9a\x02\x82\x03\x12\xff\xae\x02\x82\x03\ +\x15\xff\xec\x02\x82\x03\x16\xff\xd7\x02\x82\x03\x1a\xff\xd7\x02\ +\x82\x03\x1b\xff\x9a\x02\x82\x03\x1c\xff\xae\x02\x83\x00\x0f\xff\ +\xae\x02\x83\x00\x11\xff\xae\x02\x83\x01\xce\xff\xd7\x02\x83\x01\ +\xd5\xff\xd7\x02\x83\x01\xf2\xff\xd7\x02\x83\x02\x08\xff\xae\x02\ +\x83\x02\x0c\xff\xae\x02\x83\x02s\xff\xd7\x02\x83\x02\xcf\xff\ +\xd7\x02\x83\x03\x12\xff\xd7\x02\x83\x03\x1c\xff\xd7\x02\x84\x00\ +\x0f\xff\xae\x02\x84\x00\x11\xff\xae\x02\x84\x01\xce\xff\xd7\x02\ +\x84\x01\xd5\xff\xd7\x02\x84\x01\xf2\xff\xd7\x02\x84\x02\x08\xff\ +\xae\x02\x84\x02\x0c\xff\xae\x02\x84\x02s\xff\xd7\x02\x84\x02\ +\xcf\xff\xd7\x02\x84\x03\x12\xff\xd7\x02\x84\x03\x1c\xff\xd7\x02\ +\x85\x00\x0f\xff\xae\x02\x85\x00\x11\xff\xae\x02\x85\x01\xce\xff\ +\xd7\x02\x85\x01\xd5\xff\xd7\x02\x85\x01\xf2\xff\xd7\x02\x85\x02\ +\x08\xff\xae\x02\x85\x02\x0c\xff\xae\x02\x85\x02s\xff\xd7\x02\ +\x85\x02\xcf\xff\xd7\x02\x85\x03\x12\xff\xd7\x02\x85\x03\x1c\xff\ +\xd7\x02\x86\x00\x0f\xff\xae\x02\x86\x00\x11\xff\xae\x02\x86\x01\ +\x9d\xff\xec\x02\x86\x01\xa4\xff\xd7\x02\x86\x01\xa6\xff\xec\x02\ +\x86\x01\xa8\xff\xd7\x02\x86\x01\xaa\xff\xd7\x02\x86\x01\xae\xff\ +\xd7\x02\x86\x01\xb0\xff\xd7\x02\x86\x01\xb1\xff\xec\x02\x86\x01\ +\xb5\xff\xd7\x02\x86\x01\xbc\xff\xc3\x02\x86\x01\xbd\xff\xd7\x02\ +\x86\x01\xbf\xff\xd7\x02\x86\x01\xc1\xff\xd7\x02\x86\x01\xc4\xff\ +\xec\x02\x86\x01\xc7\xff\xec\x02\x86\x01\xce\xff\xec\x02\x86\x01\ +\xd5\xff\xec\x02\x86\x01\xf2\xff\xec\x02\x86\x02\x08\xff\xae\x02\ +\x86\x02\x0c\xff\xae\x02\x86\x02r\xff\xd7\x02\x86\x02s\xff\ +\xec\x02\x86\x02z\xff\xec\x02\x86\x02|\xff\xd7\x02\x86\x02\ +\x80\xff\xec\x02\x86\x02\x82\xff\xec\x02\x86\x02\x9f\xff\xd7\x02\ +\x86\x02\xa1\xff\xec\x02\x86\x02\xa9\xff\xec\x02\x86\x02\xb5\xff\ +\xc3\x02\x86\x02\xb7\xff\xec\x02\x86\x02\xb9\xff\xec\x02\x86\x02\ +\xbb\xff\xd7\x02\x86\x02\xbd\xff\xec\x02\x86\x02\xbf\xff\xd7\x02\ +\x86\x02\xc1\xff\xd7\x02\x86\x02\xca\xff\xd7\x02\x86\x02\xce\xff\ +\xd7\x02\x86\x02\xcf\xff\xec\x02\x86\x02\xd4\xff\xd7\x02\x86\x02\ +\xd9\xff\xd7\x02\x86\x02\xdb\xff\xd7\x02\x86\x02\xdd\xff\xd7\x02\ +\x86\x02\xe5\xff\xd7\x02\x86\x02\xe7\xff\xec\x02\x86\x02\xf5\xff\ +\xec\x02\x86\x02\xf7\xff\xd7\x02\x86\x02\xf9\xff\xd7\x02\x86\x02\ +\xfb\xff\xd7\x02\x86\x02\xfd\xff\xd7\x02\x86\x03\x05\xff\xd7\x02\ +\x86\x03\x07\xff\xd7\x02\x86\x03\x0d\xff\xd7\x02\x86\x03\x0f\xff\ +\xd7\x02\x86\x03\x11\xff\xd7\x02\x86\x03\x12\xff\xec\x02\x86\x03\ +\x17\xff\xec\x02\x86\x03\x1b\xff\xd7\x02\x86\x03\x1c\xff\xec\x02\ +\x87\x00\x05\xff\xec\x02\x87\x00\x0a\xff\xec\x02\x87\x01\xd0\xff\ +\xd7\x02\x87\x01\xdc\xff\xec\x02\x87\x01\xdd\xff\xec\x02\x87\x01\ +\xdf\xff\xd7\x02\x87\x01\xe1\xff\xec\x02\x87\x01\xe4\xff\xec\x02\ +\x87\x01\xf6\xff\xec\x02\x87\x02\x07\xff\xec\x02\x87\x02\x0b\xff\ +\xec\x02\x87\x02\xa0\xff\xd7\x02\x87\x02\xaa\xff\xec\x02\x87\x02\ +\xb6\xff\xec\x02\x87\x02\xbc\xff\xd7\x02\x87\x02\xbe\xff\xec\x02\ +\x87\x02\xc0\xff\xec\x02\x87\x02\xc2\xff\xec\x02\x87\x02\xcb\xff\ +\xd7\x02\x87\x02\xd5\xff\xec\x02\x87\x02\xe6\xff\xd7\x02\x87\x02\ +\xf8\xff\xec\x02\x87\x02\xfa\xff\xec\x02\x87\x02\xfc\xff\xec\x02\ +\x87\x02\xfe\xff\xec\x02\x87\x03\x06\xff\xd7\x02\x87\x03\x08\xff\ +\xd7\x02\x87\x03\x0e\xff\xec\x02\x87\x03\x10\xff\xec\x02\x87\x03\ +\x18\xff\xec\x02\x88\x00\x0f\xff\xae\x02\x88\x00\x11\xff\xae\x02\ +\x88\x01\x9d\xff\xec\x02\x88\x01\xa4\xff\xd7\x02\x88\x01\xa6\xff\ +\xec\x02\x88\x01\xa8\xff\xd7\x02\x88\x01\xaa\xff\xd7\x02\x88\x01\ +\xae\xff\xd7\x02\x88\x01\xb0\xff\xd7\x02\x88\x01\xb1\xff\xec\x02\ +\x88\x01\xb5\xff\xd7\x02\x88\x01\xbc\xff\xc3\x02\x88\x01\xbd\xff\ +\xd7\x02\x88\x01\xbf\xff\xd7\x02\x88\x01\xc1\xff\xd7\x02\x88\x01\ +\xc4\xff\xec\x02\x88\x01\xc7\xff\xec\x02\x88\x01\xce\xff\xec\x02\ +\x88\x01\xd5\xff\xec\x02\x88\x01\xf2\xff\xec\x02\x88\x02\x08\xff\ +\xae\x02\x88\x02\x0c\xff\xae\x02\x88\x02r\xff\xd7\x02\x88\x02\ +s\xff\xec\x02\x88\x02z\xff\xec\x02\x88\x02|\xff\xd7\x02\ +\x88\x02\x80\xff\xec\x02\x88\x02\x82\xff\xec\x02\x88\x02\x9f\xff\ +\xd7\x02\x88\x02\xa1\xff\xec\x02\x88\x02\xa9\xff\xec\x02\x88\x02\ +\xb5\xff\xc3\x02\x88\x02\xb7\xff\xec\x02\x88\x02\xb9\xff\xec\x02\ +\x88\x02\xbb\xff\xd7\x02\x88\x02\xbd\xff\xec\x02\x88\x02\xbf\xff\ +\xd7\x02\x88\x02\xc1\xff\xd7\x02\x88\x02\xca\xff\xd7\x02\x88\x02\ +\xce\xff\xd7\x02\x88\x02\xcf\xff\xec\x02\x88\x02\xd4\xff\xd7\x02\ +\x88\x02\xd9\xff\xd7\x02\x88\x02\xdb\xff\xd7\x02\x88\x02\xdd\xff\ +\xd7\x02\x88\x02\xe5\xff\xd7\x02\x88\x02\xe7\xff\xec\x02\x88\x02\ +\xf5\xff\xec\x02\x88\x02\xf7\xff\xd7\x02\x88\x02\xf9\xff\xd7\x02\ +\x88\x02\xfb\xff\xd7\x02\x88\x02\xfd\xff\xd7\x02\x88\x03\x05\xff\ +\xd7\x02\x88\x03\x07\xff\xd7\x02\x88\x03\x0d\xff\xd7\x02\x88\x03\ +\x0f\xff\xd7\x02\x88\x03\x11\xff\xd7\x02\x88\x03\x12\xff\xec\x02\ +\x88\x03\x17\xff\xec\x02\x88\x03\x1b\xff\xd7\x02\x88\x03\x1c\xff\ +\xec\x02\x89\x00\x05\xff\xec\x02\x89\x00\x0a\xff\xec\x02\x89\x01\ +\xd0\xff\xd7\x02\x89\x01\xdc\xff\xec\x02\x89\x01\xdd\xff\xec\x02\ +\x89\x01\xdf\xff\xd7\x02\x89\x01\xe1\xff\xec\x02\x89\x01\xe4\xff\ +\xec\x02\x89\x01\xf6\xff\xec\x02\x89\x02\x07\xff\xec\x02\x89\x02\ +\x0b\xff\xec\x02\x89\x02\xa0\xff\xd7\x02\x89\x02\xaa\xff\xec\x02\ +\x89\x02\xb6\xff\xec\x02\x89\x02\xbc\xff\xd7\x02\x89\x02\xbe\xff\ +\xec\x02\x89\x02\xc0\xff\xec\x02\x89\x02\xc2\xff\xec\x02\x89\x02\ +\xcb\xff\xd7\x02\x89\x02\xd5\xff\xec\x02\x89\x02\xe6\xff\xd7\x02\ +\x89\x02\xf8\xff\xec\x02\x89\x02\xfa\xff\xec\x02\x89\x02\xfc\xff\ +\xec\x02\x89\x02\xfe\xff\xec\x02\x89\x03\x06\xff\xd7\x02\x89\x03\ +\x08\xff\xd7\x02\x89\x03\x0e\xff\xec\x02\x89\x03\x10\xff\xec\x02\ +\x89\x03\x18\xff\xec\x02\x8a\x00\x0f\xff\xae\x02\x8a\x00\x11\xff\ +\xae\x02\x8a\x01\x9d\xff\xec\x02\x8a\x01\xa4\xff\xd7\x02\x8a\x01\ +\xa6\xff\xec\x02\x8a\x01\xa8\xff\xd7\x02\x8a\x01\xaa\xff\xd7\x02\ +\x8a\x01\xae\xff\xd7\x02\x8a\x01\xb0\xff\xd7\x02\x8a\x01\xb1\xff\ +\xec\x02\x8a\x01\xb5\xff\xd7\x02\x8a\x01\xbc\xff\xc3\x02\x8a\x01\ +\xbd\xff\xd7\x02\x8a\x01\xbf\xff\xd7\x02\x8a\x01\xc1\xff\xd7\x02\ +\x8a\x01\xc4\xff\xec\x02\x8a\x01\xc7\xff\xec\x02\x8a\x01\xce\xff\ +\xec\x02\x8a\x01\xd5\xff\xec\x02\x8a\x01\xf2\xff\xec\x02\x8a\x02\ +\x08\xff\xae\x02\x8a\x02\x0c\xff\xae\x02\x8a\x02r\xff\xd7\x02\ +\x8a\x02s\xff\xec\x02\x8a\x02z\xff\xec\x02\x8a\x02|\xff\ +\xd7\x02\x8a\x02\x80\xff\xec\x02\x8a\x02\x82\xff\xec\x02\x8a\x02\ +\x9f\xff\xd7\x02\x8a\x02\xa1\xff\xec\x02\x8a\x02\xa9\xff\xec\x02\ +\x8a\x02\xb5\xff\xc3\x02\x8a\x02\xb7\xff\xec\x02\x8a\x02\xb9\xff\ +\xec\x02\x8a\x02\xbb\xff\xd7\x02\x8a\x02\xbd\xff\xec\x02\x8a\x02\ +\xbf\xff\xd7\x02\x8a\x02\xc1\xff\xd7\x02\x8a\x02\xca\xff\xd7\x02\ +\x8a\x02\xce\xff\xd7\x02\x8a\x02\xcf\xff\xec\x02\x8a\x02\xd4\xff\ +\xd7\x02\x8a\x02\xd9\xff\xd7\x02\x8a\x02\xdb\xff\xd7\x02\x8a\x02\ +\xdd\xff\xd7\x02\x8a\x02\xe5\xff\xd7\x02\x8a\x02\xe7\xff\xec\x02\ +\x8a\x02\xf5\xff\xec\x02\x8a\x02\xf7\xff\xd7\x02\x8a\x02\xf9\xff\ +\xd7\x02\x8a\x02\xfb\xff\xd7\x02\x8a\x02\xfd\xff\xd7\x02\x8a\x03\ +\x05\xff\xd7\x02\x8a\x03\x07\xff\xd7\x02\x8a\x03\x0d\xff\xd7\x02\ +\x8a\x03\x0f\xff\xd7\x02\x8a\x03\x11\xff\xd7\x02\x8a\x03\x12\xff\ +\xec\x02\x8a\x03\x17\xff\xec\x02\x8a\x03\x1b\xff\xd7\x02\x8a\x03\ +\x1c\xff\xec\x02\x8b\x00\x0f\xff\xae\x02\x8b\x00\x11\xff\xae\x02\ +\x8b\x01\xce\xff\xd7\x02\x8b\x01\xd5\xff\xd7\x02\x8b\x01\xf2\xff\ +\xd7\x02\x8b\x02\x08\xff\xae\x02\x8b\x02\x0c\xff\xae\x02\x8b\x02\ +s\xff\xd7\x02\x8b\x02\xcf\xff\xd7\x02\x8b\x03\x12\xff\xd7\x02\ +\x8b\x03\x1c\xff\xd7\x02\x8c\x01\x9f\xff\xd7\x02\x8c\x01\xb8\xff\ +\xd7\x02\x8c\x01\xbb\xff\xd7\x02\x8c\x01\xbe\xff\xd7\x02\x8c\x01\ +\xe1\xff\xd7\x02\x8c\x02l\xff\xd7\x02\x8c\x02~\xff\xd7\x02\ +\x8c\x02\x84\xff\xd7\x02\x8c\x02\x86\xff\xd7\x02\x8c\x02\x88\xff\ +\xd7\x02\x8c\x02\x8a\xff\xd7\x02\x8c\x02\x8c\xff\xd7\x02\x8c\x02\ +\xb1\xff\xd7\x02\x8c\x02\xb3\xff\xd7\x02\x8c\x02\xc0\xff\xd7\x02\ +\x8c\x02\xc2\xff\xd7\x02\x8c\x02\xc5\xff\xd7\x02\x8c\x02\xc7\xff\ +\xd7\x02\x8c\x02\xd5\xff\xd7\x02\x8c\x02\xef\xff\xd7\x02\x8c\x02\ +\xf1\xff\xd7\x02\x8c\x02\xf3\xff\xd7\x02\x8c\x02\xfe\xff\xd7\x02\ +\x8c\x03\x09\xff\xd7\x02\x8c\x03\x0b\xff\xd7\x02\x8c\x03\x0e\xff\ +\xd7\x02\x8c\x03\x10\xff\xd7\x02\x8c\x03\x15\xff\xd7\x02\x95\x01\ +\xa3\x00\xe1\x02\x95\x02\xea\x00)\x02\x95\x03\x0e\xff\xd7\x02\ +\x95\x03\x10\xff\xd7\x02\x96\x00\x05\xff\xec\x02\x96\x00\x0a\xff\ +\xec\x02\x96\x02\x07\xff\xec\x02\x96\x02\x0b\xff\xec\x02\x97\x00\ +\x05\xff\xae\x02\x97\x00\x0a\xff\xae\x02\x97\x01\x9d\xff\xd7\x02\ +\x97\x01\xa6\xff\xd7\x02\x97\x01\xbc\xff\xae\x02\x97\x01\xc1\xff\ +\xae\x02\x97\x01\xc4\xff\xd7\x02\x97\x01\xdc\xff\xd7\x02\x97\x01\ +\xe4\xff\xd7\x02\x97\x02\x07\xff\xae\x02\x97\x02\x0b\xff\xae\x02\ +\x97\x02|\xff\xae\x02\x97\x02\x80\xff\xc3\x02\x97\x02\x82\xff\ +\xc3\x02\x97\x02\xa9\xff\xd7\x02\x97\x02\xaa\xff\xd7\x02\x97\x02\ +\xb5\xff\xae\x02\x97\x02\xb6\xff\xd7\x02\x97\x02\xb7\xff\xc3\x02\ +\x97\x02\xb9\xff\xc3\x02\x97\x02\xbd\xff\xd7\x02\x97\x02\xbe\xff\ +\xd7\x02\x97\x02\xbf\xff\xae\x02\x97\x02\xc1\xff\xae\x02\x97\x02\ +\xd4\xff\xae\x02\x97\x02\xfd\xff\xae\x02\x97\x03\x0d\xff\x9a\x02\ +\x97\x03\x0f\xff\x9a\x02\x97\x03\x17\xff\xd7\x02\x97\x03\x18\xff\ +\xd7\x02\x98\x00\x05\xff\x85\x02\x98\x00\x0a\xff\x85\x02\x98\x01\ +\xd0\xff\xd7\x02\x98\x01\xdc\xff\x9a\x02\x98\x01\xdd\xff\xc3\x02\ +\x98\x01\xdf\xff\xd7\x02\x98\x01\xe1\xff\xae\x02\x98\x01\xe4\xff\ +\x9a\x02\x98\x01\xf6\xff\xc3\x02\x98\x02\x07\xff\x85\x02\x98\x02\ +\x0b\xff\x85\x02\x98\x02m\xff\xd7\x02\x98\x02\x81\xff\xd7\x02\ +\x98\x02\x83\xff\xd7\x02\x98\x02\x8b\xff\xd7\x02\x98\x02\xa0\xff\ +\xd7\x02\x98\x02\xaa\xff\x9a\x02\x98\x02\xb6\xff\x9a\x02\x98\x02\ +\xb8\xff\xc3\x02\x98\x02\xba\xff\xc3\x02\x98\x02\xbc\xff\xd7\x02\ +\x98\x02\xbe\xff\x9a\x02\x98\x02\xc0\xff\xae\x02\x98\x02\xc2\xff\ +\xae\x02\x98\x02\xc6\xff\xd7\x02\x98\x02\xc8\xff\xd7\x02\x98\x02\ +\xcb\xff\xd7\x02\x98\x02\xd5\xff\xae\x02\x98\x02\xe6\xff\xd7\x02\ +\x98\x02\xea\xff\xd7\x02\x98\x02\xf8\xff\xc3\x02\x98\x02\xfa\xff\ +\xc3\x02\x98\x02\xfc\xff\xc3\x02\x98\x02\xfe\xff\xae\x02\x98\x03\ +\x06\xff\xd7\x02\x98\x03\x08\xff\xd7\x02\x98\x03\x0e\xff\x9a\x02\ +\x98\x03\x10\xff\x9a\x02\x98\x03\x18\xff\x9a\x02\x99\x00\x0f\xfe\ +\xf6\x02\x99\x00\x11\xfe\xf6\x02\x99\x01\xa4\xff\x85\x02\x99\x01\ +\xaa\xff\x9a\x02\x99\x01\xae\xff\x85\x02\x99\x01\xb0\xff\xd7\x02\ +\x99\x01\xb5\xff\x85\x02\x99\x01\xbf\xff\xd7\x02\x99\x01\xce\xff\ +\x9a\x02\x99\x01\xd5\xff\x9a\x02\x99\x01\xf2\xff\x9a\x02\x99\x02\ +\x08\xfe\xf6\x02\x99\x02\x0c\xfe\xf6\x02\x99\x02r\xff\x9a\x02\ +\x99\x02s\xff\x9a\x02\x99\x02v\xff\xec\x02\x99\x02\x9f\xff\ +\xd7\x02\x99\x02\xbb\xff\xd7\x02\x99\x02\xca\xff\xd7\x02\x99\x02\ +\xce\xff\x85\x02\x99\x02\xcf\xff\x9a\x02\x99\x02\xd9\xff\x9a\x02\ +\x99\x02\xdb\xff\x9a\x02\x99\x02\xdd\xff\x9a\x02\x99\x02\xe5\xff\ +\xd7\x02\x99\x03\x05\xff\xd7\x02\x99\x03\x07\xff\xd7\x02\x99\x03\ +\x09\xff\xae\x02\x99\x03\x0b\xff\xae\x02\x99\x03\x11\xff\x85\x02\ +\x99\x03\x12\xff\x9a\x02\x99\x03\x1b\xff\x85\x02\x99\x03\x1c\xff\ +\x9a\x02\x9a\x00\x05\xff\xec\x02\x9a\x00\x0a\xff\xec\x02\x9a\x01\ +\xd0\xff\xd7\x02\x9a\x01\xdc\xff\xec\x02\x9a\x01\xdd\xff\xec\x02\ +\x9a\x01\xdf\xff\xd7\x02\x9a\x01\xe1\xff\xec\x02\x9a\x01\xe4\xff\ +\xec\x02\x9a\x01\xf6\xff\xec\x02\x9a\x02\x07\xff\xec\x02\x9a\x02\ +\x0b\xff\xec\x02\x9a\x02\xa0\xff\xd7\x02\x9a\x02\xaa\xff\xec\x02\ +\x9a\x02\xb6\xff\xec\x02\x9a\x02\xbc\xff\xd7\x02\x9a\x02\xbe\xff\ +\xec\x02\x9a\x02\xc0\xff\xec\x02\x9a\x02\xc2\xff\xec\x02\x9a\x02\ +\xcb\xff\xd7\x02\x9a\x02\xd5\xff\xec\x02\x9a\x02\xe6\xff\xd7\x02\ +\x9a\x02\xf8\xff\xec\x02\x9a\x02\xfa\xff\xec\x02\x9a\x02\xfc\xff\ +\xec\x02\x9a\x02\xfe\xff\xec\x02\x9a\x03\x06\xff\xd7\x02\x9a\x03\ +\x08\xff\xd7\x02\x9a\x03\x0e\xff\xec\x02\x9a\x03\x10\xff\xec\x02\ +\x9a\x03\x18\xff\xec\x02\x9b\x00\x0f\xff\x9a\x02\x9b\x00\x10\xff\ +\xd7\x02\x9b\x00\x11\xff\x9a\x02\x9b\x01\x9d\x00)\x02\x9b\x01\ +\x9f\xff\xd7\x02\x9b\x01\xa4\xff\xae\x02\x9b\x01\xa6\x00)\x02\ +\x9b\x01\xaa\xff\x85\x02\x9b\x01\xae\xff\xae\x02\x9b\x01\xb5\xff\ +\xae\x02\x9b\x01\xb8\xff\xd7\x02\x9b\x01\xbb\xff\xd7\x02\x9b\x01\ +\xbc\x00)\x02\x9b\x01\xbe\xff\xc3\x02\x9b\x01\xc4\x00)\x02\ +\x9b\x01\xcc\xff\xc3\x02\x9b\x01\xcd\xff\xc3\x02\x9b\x01\xce\xff\ +\x9a\x02\x9b\x01\xcf\xff\xae\x02\x9b\x01\xd0\xff\xd7\x02\x9b\x01\ +\xd1\xff\xd7\x02\x9b\x01\xd2\xff\xc3\x02\x9b\x01\xd3\xff\xc3\x02\ +\x9b\x01\xd4\xff\xc3\x02\x9b\x01\xd5\xff\x9a\x02\x9b\x01\xd6\xff\ +\xc3\x02\x9b\x01\xd7\xff\xc3\x02\x9b\x01\xd8\xff\xae\x02\x9b\x01\ +\xd9\xff\xc3\x02\x9b\x01\xda\xff\xc3\x02\x9b\x01\xdb\xff\xae\x02\ +\x9b\x01\xde\xff\xae\x02\x9b\x01\xdf\xff\xd7\x02\x9b\x01\xe0\xff\ +\xc3\x02\x9b\x01\xe1\xff\x9a\x02\x9b\x01\xe2\xff\xc3\x02\x9b\x01\ +\xe3\xff\xc3\x02\x9b\x01\xe5\xff\xc3\x02\x9b\x01\xe6\xff\xc3\x02\ +\x9b\x01\xe7\xff\xd7\x02\x9b\x01\xe8\xff\xc3\x02\x9b\x01\xea\xff\ +\xae\x02\x9b\x01\xeb\x00)\x02\x9b\x01\xec\xff\xc3\x02\x9b\x01\ +\xed\xff\xae\x02\x9b\x01\xee\xff\xc3\x02\x9b\x01\xf2\xff\x9a\x02\ +\x9b\x01\xf3\xff\xc3\x02\x9b\x01\xf4\x00)\x02\x9b\x01\xf5\xff\ +\xc3\x02\x9b\x01\xf7\xff\xc3\x02\x9b\x01\xf9\xff\xc3\x02\x9b\x02\ +\x02\xff\xd7\x02\x9b\x02\x03\xff\xd7\x02\x9b\x02\x04\xff\xd7\x02\ +\x9b\x02\x08\xff\x9a\x02\x9b\x02\x0c\xff\x9a\x02\x9b\x02j\xff\ +\xae\x02\x9b\x02k\xff\xc3\x02\x9b\x02l\xff\xd7\x02\x9b\x02\ +q\xff\xc3\x02\x9b\x02r\xff\x85\x02\x9b\x02s\xff\x9a\x02\ +\x9b\x02u\xff\xc3\x02\x9b\x02w\xff\xd7\x02\x9b\x02y\xff\ +\xc3\x02\x9b\x02}\xff\xc3\x02\x9b\x02~\xff\xd7\x02\x9b\x02\ +\x7f\xff\xae\x02\x9b\x02\x84\xff\xd7\x02\x9b\x02\x85\xff\xae\x02\ +\x9b\x02\x86\xff\xd7\x02\x9b\x02\x87\xff\xae\x02\x9b\x02\x88\xff\ +\xd7\x02\x9b\x02\x89\xff\xae\x02\x9b\x02\x8a\xff\xd7\x02\x9b\x02\ +\x8c\xff\xd7\x02\x9b\x02\x8d\xff\xae\x02\x9b\x02\x96\xff\xc3\x02\ +\x9b\x02\x98\x00)\x02\x9b\x02\x9a\xff\xc3\x02\x9b\x02\x9e\xff\ +\xc3\x02\x9b\x02\xa0\xff\xd7\x02\x9b\x02\xa2\xff\xd7\x02\x9b\x02\ +\xa4\xff\xc3\x02\x9b\x02\xa6\xff\xc3\x02\x9b\x02\xa8\x00)\x02\ +\x9b\x02\xa9\x00)\x02\x9b\x02\xac\xff\xc3\x02\x9b\x02\xae\xff\ +\xc3\x02\x9b\x02\xb0\xff\xc3\x02\x9b\x02\xb1\xff\xd7\x02\x9b\x02\ +\xb2\xff\xae\x02\x9b\x02\xb3\xff\xd7\x02\x9b\x02\xb4\xff\xae\x02\ +\x9b\x02\xb5\x00)\x02\x9b\x02\xbc\xff\xd7\x02\x9b\x02\xbd\x00\ +)\x02\x9b\x02\xc0\xff\x9a\x02\x9b\x02\xc2\xff\x9a\x02\x9b\x02\ +\xc4\xff\xc3\x02\x9b\x02\xc5\xff\xd7\x02\x9b\x02\xc6\xff\xc3\x02\ +\x9b\x02\xc7\xff\xd7\x02\x9b\x02\xc8\xff\xc3\x02\x9b\x02\xcb\xff\ +\xd7\x02\x9b\x02\xcd\xff\xc3\x02\x9b\x02\xce\xff\xae\x02\x9b\x02\ +\xcf\xff\x9a\x02\x9b\x02\xd1\xff\xc3\x02\x9b\x02\xd3\xff\xc3\x02\ +\x9b\x02\xd5\xff\x9a\x02\x9b\x02\xd7\xff\xc3\x02\x9b\x02\xd9\xff\ +\x85\x02\x9b\x02\xdb\xff\x85\x02\x9b\x02\xdd\xff\x85\x02\x9b\x02\ +\xe0\xff\xae\x02\x9b\x02\xe6\xff\xd7\x02\x9b\x02\xe8\xff\xd7\x02\ +\x9b\x02\xec\xff\xc3\x02\x9b\x02\xee\xff\xc3\x02\x9b\x02\xef\xff\ +\xd7\x02\x9b\x02\xf0\xff\xae\x02\x9b\x02\xf1\xff\xd7\x02\x9b\x02\ +\xf2\xff\xae\x02\x9b\x02\xf3\xff\xd7\x02\x9b\x02\xf4\xff\xae\x02\ +\x9b\x02\xf6\xff\xd7\x02\x9b\x02\xfe\xff\x9a\x02\x9b\x03\x00\xff\ +\xc3\x02\x9b\x03\x02\xff\xc3\x02\x9b\x03\x06\xff\xd7\x02\x9b\x03\ +\x08\xff\xd7\x02\x9b\x03\x09\xff\x9a\x02\x9b\x03\x0a\xff\xae\x02\ +\x9b\x03\x0b\xff\x9a\x02\x9b\x03\x0c\xff\xae\x02\x9b\x03\x0e\xff\ +\xd7\x02\x9b\x03\x10\xff\xd7\x02\x9b\x03\x11\xff\xae\x02\x9b\x03\ +\x12\xff\x9a\x02\x9b\x03\x14\xff\xc3\x02\x9b\x03\x15\xff\xd7\x02\ +\x9b\x03\x16\xff\xae\x02\x9b\x03\x17\x00)\x02\x9b\x03\x1a\xff\ +\xae\x02\x9b\x03\x1b\xff\xae\x02\x9b\x03\x1c\xff\x9a\x02\x9c\x00\ +\x0f\xff\xc3\x02\x9c\x00\x11\xff\xc3\x02\x9c\x01\xce\xff\xc3\x02\ +\x9c\x01\xcf\xff\xd7\x02\x9c\x01\xd5\xff\xc3\x02\x9c\x01\xd8\xff\ +\xd7\x02\x9c\x01\xdb\xff\xd7\x02\x9c\x01\xde\xff\xd7\x02\x9c\x01\ +\xea\xff\xd7\x02\x9c\x01\xed\xff\xd7\x02\x9c\x01\xf2\xff\xc3\x02\ +\x9c\x02\x08\xff\xc3\x02\x9c\x02\x0c\xff\xc3\x02\x9c\x02j\xff\ +\xd7\x02\x9c\x02s\xff\xc3\x02\x9c\x02\x7f\xff\xd7\x02\x9c\x02\ +\x85\xff\xd7\x02\x9c\x02\x87\xff\xd7\x02\x9c\x02\x89\xff\xd7\x02\ +\x9c\x02\x8d\xff\xd7\x02\x9c\x02\xb2\xff\xd7\x02\x9c\x02\xb4\xff\ +\xd7\x02\x9c\x02\xcf\xff\xc3\x02\x9c\x02\xe0\xff\xd7\x02\x9c\x02\ +\xf0\xff\xd7\x02\x9c\x02\xf2\xff\xd7\x02\x9c\x02\xf4\xff\xd7\x02\ +\x9c\x03\x0a\xff\xd7\x02\x9c\x03\x0c\xff\xd7\x02\x9c\x03\x12\xff\ +\xc3\x02\x9c\x03\x16\xff\xd7\x02\x9c\x03\x1a\xff\xd7\x02\x9c\x03\ +\x1c\xff\xc3\x02\x9d\x00\x05\xff\xc3\x02\x9d\x00\x0a\xff\xc3\x02\ +\x9d\x01\x9d\xff\xc3\x02\x9d\x01\xa3\x00f\x02\x9d\x01\xa6\xff\ +\xc3\x02\x9d\x01\xbc\xff\xc3\x02\x9d\x01\xc1\xff\xae\x02\x9d\x01\ +\xc4\xff\xc3\x02\x9d\x01\xdc\xff\xd7\x02\x9d\x01\xe1\xff\xd7\x02\ +\x9d\x01\xe4\xff\xd7\x02\x9d\x02\x07\xff\xc3\x02\x9d\x02\x0b\xff\ +\xc3\x02\x9d\x02|\xff\xae\x02\x9d\x02\x80\xff\xc3\x02\x9d\x02\ +\x82\xff\xc3\x02\x9d\x02\xa9\xff\xc3\x02\x9d\x02\xaa\xff\xd7\x02\ +\x9d\x02\xb5\xff\xc3\x02\x9d\x02\xb6\xff\xd7\x02\x9d\x02\xb7\xff\ +\xd7\x02\x9d\x02\xb9\xff\xd7\x02\x9d\x02\xbd\xff\xc3\x02\x9d\x02\ +\xbe\xff\xd7\x02\x9d\x02\xbf\xff\xae\x02\x9d\x02\xc0\xff\xd7\x02\ +\x9d\x02\xc1\xff\xae\x02\x9d\x02\xc2\xff\xd7\x02\x9d\x02\xd4\xff\ +\xae\x02\x9d\x02\xd5\xff\xd7\x02\x9d\x02\xfd\xff\xae\x02\x9d\x02\ +\xfe\xff\xd7\x02\x9d\x03\x0d\xff\xd7\x02\x9d\x03\x0e\xff\xc3\x02\ +\x9d\x03\x0f\xff\xd7\x02\x9d\x03\x10\xff\xc3\x02\x9d\x03\x17\xff\ +\xc3\x02\x9d\x03\x18\xff\xd7\x02\x9e\x00\x05\xff\xc3\x02\x9e\x00\ +\x0a\xff\xc3\x02\x9e\x02\x07\xff\xc3\x02\x9e\x02\x0b\xff\xc3\x02\ +\x9e\x03\x0e\xff\xd7\x02\x9e\x03\x10\xff\xd7\x02\x9f\x01\x9f\xff\ +\xd7\x02\x9f\x01\xa3\x00\xe1\x02\x9f\x01\xb8\xff\xd7\x02\x9f\x01\ +\xbb\xff\xd7\x02\x9f\x01\xbe\xff\xc3\x02\x9f\x01\xdc\xff\xd7\x02\ +\x9f\x01\xe1\xff\xae\x02\x9f\x01\xe4\xff\xd7\x02\x9f\x02l\xff\ +\xd7\x02\x9f\x02{\x00=\x02\x9f\x02}\xff\xec\x02\x9f\x02\ +~\xff\xd7\x02\x9f\x02\x84\xff\xd7\x02\x9f\x02\x86\xff\xd7\x02\ +\x9f\x02\x88\xff\xd7\x02\x9f\x02\x8a\xff\xd7\x02\x9f\x02\x8c\xff\ +\xd7\x02\x9f\x02\xaa\xff\xd7\x02\x9f\x02\xb1\xff\xd7\x02\x9f\x02\ +\xb3\xff\xd7\x02\x9f\x02\xb6\xff\xd7\x02\x9f\x02\xbe\xff\xd7\x02\ +\x9f\x02\xc0\xff\xae\x02\x9f\x02\xc2\xff\xae\x02\x9f\x02\xc5\xff\ +\xc3\x02\x9f\x02\xc6\xff\xd7\x02\x9f\x02\xc7\xff\xc3\x02\x9f\x02\ +\xc8\xff\xd7\x02\x9f\x02\xd5\xff\xae\x02\x9f\x02\xef\xff\xd7\x02\ +\x9f\x02\xf1\xff\xd7\x02\x9f\x02\xf3\xff\xd7\x02\x9f\x02\xfe\xff\ +\xae\x02\x9f\x03\x0e\xff\xd7\x02\x9f\x03\x10\xff\xd7\x02\x9f\x03\ +\x15\xff\xd7\x02\x9f\x03\x18\xff\xd7\x02\xa0\x01\xcf\xff\xec\x02\ +\xa0\x01\xd8\xff\xec\x02\xa0\x01\xdb\xff\xec\x02\xa0\x01\xde\xff\ +\xec\x02\xa0\x01\xe1\xff\xec\x02\xa0\x01\xea\xff\xec\x02\xa0\x01\ +\xed\xff\xec\x02\xa0\x02j\xff\xec\x02\xa0\x02\x7f\xff\xec\x02\ +\xa0\x02\x85\xff\xec\x02\xa0\x02\x87\xff\xec\x02\xa0\x02\x89\xff\ +\xec\x02\xa0\x02\x8d\xff\xec\x02\xa0\x02\xb2\xff\xec\x02\xa0\x02\ +\xb4\xff\xec\x02\xa0\x02\xc0\xff\xec\x02\xa0\x02\xc2\xff\xec\x02\ +\xa0\x02\xd5\xff\xec\x02\xa0\x02\xe0\xff\xec\x02\xa0\x02\xf0\xff\ +\xec\x02\xa0\x02\xf2\xff\xec\x02\xa0\x02\xf4\xff\xec\x02\xa0\x02\ +\xfe\xff\xec\x02\xa0\x03\x0a\xff\xec\x02\xa0\x03\x0c\xff\xec\x02\ +\xa0\x03\x0e\xff\xd7\x02\xa0\x03\x10\xff\xd7\x02\xa0\x03\x16\xff\ +\xec\x02\xa0\x03\x1a\xff\xec\x02\xa1\x00\x0f\xff\xae\x02\xa1\x00\ +\x11\xff\xae\x02\xa1\x02\x08\xff\xae\x02\xa1\x02\x0c\xff\xae\x02\ +\xa1\x02\x80\xff\xec\x02\xa1\x02\x82\xff\xec\x02\xa1\x02\xb7\xff\ +\xec\x02\xa1\x02\xb9\xff\xec\x02\xa1\x03\x0d\xff\xd7\x02\xa1\x03\ +\x0f\xff\xd7\x02\xa2\x01\xe9\x00)\x02\xa3\x01\x9f\xff\xd7\x02\ +\xa3\x01\xa3\x00\xe1\x02\xa3\x01\xb8\xff\xd7\x02\xa3\x01\xbb\xff\ +\xd7\x02\xa3\x01\xbe\xff\xc3\x02\xa3\x01\xdc\xff\xd7\x02\xa3\x01\ +\xe1\xff\xae\x02\xa3\x01\xe4\xff\xd7\x02\xa3\x02l\xff\xd7\x02\ +\xa3\x02{\x00=\x02\xa3\x02}\xff\xec\x02\xa3\x02~\xff\ +\xd7\x02\xa3\x02\x84\xff\xd7\x02\xa3\x02\x86\xff\xd7\x02\xa3\x02\ +\x88\xff\xd7\x02\xa3\x02\x8a\xff\xd7\x02\xa3\x02\x8c\xff\xd7\x02\ +\xa3\x02\xaa\xff\xd7\x02\xa3\x02\xb1\xff\xd7\x02\xa3\x02\xb3\xff\ +\xd7\x02\xa3\x02\xb6\xff\xd7\x02\xa3\x02\xbe\xff\xd7\x02\xa3\x02\ +\xc0\xff\xae\x02\xa3\x02\xc2\xff\xae\x02\xa3\x02\xc5\xff\xc3\x02\ +\xa3\x02\xc6\xff\xd7\x02\xa3\x02\xc7\xff\xc3\x02\xa3\x02\xc8\xff\ +\xd7\x02\xa3\x02\xd5\xff\xae\x02\xa3\x02\xef\xff\xd7\x02\xa3\x02\ +\xf1\xff\xd7\x02\xa3\x02\xf3\xff\xd7\x02\xa3\x02\xfe\xff\xae\x02\ +\xa3\x03\x0e\xff\xd7\x02\xa3\x03\x10\xff\xd7\x02\xa3\x03\x15\xff\ +\xd7\x02\xa3\x03\x18\xff\xd7\x02\xa4\x01\xcf\xff\xec\x02\xa4\x01\ +\xd8\xff\xec\x02\xa4\x01\xdb\xff\xec\x02\xa4\x01\xde\xff\xec\x02\ +\xa4\x01\xe1\xff\xec\x02\xa4\x01\xea\xff\xec\x02\xa4\x01\xed\xff\ +\xec\x02\xa4\x02j\xff\xec\x02\xa4\x02\x7f\xff\xec\x02\xa4\x02\ +\x85\xff\xec\x02\xa4\x02\x87\xff\xec\x02\xa4\x02\x89\xff\xec\x02\ +\xa4\x02\x8d\xff\xec\x02\xa4\x02\xb2\xff\xec\x02\xa4\x02\xb4\xff\ +\xec\x02\xa4\x02\xc0\xff\xec\x02\xa4\x02\xc2\xff\xec\x02\xa4\x02\ +\xd5\xff\xec\x02\xa4\x02\xe0\xff\xec\x02\xa4\x02\xf0\xff\xec\x02\ +\xa4\x02\xf2\xff\xec\x02\xa4\x02\xf4\xff\xec\x02\xa4\x02\xfe\xff\ +\xec\x02\xa4\x03\x0a\xff\xec\x02\xa4\x03\x0c\xff\xec\x02\xa4\x03\ +\x0e\xff\xd7\x02\xa4\x03\x10\xff\xd7\x02\xa4\x03\x16\xff\xec\x02\ +\xa4\x03\x1a\xff\xec\x02\xa5\x01\x9f\xff\xd7\x02\xa5\x01\xb8\xff\ +\xd7\x02\xa5\x01\xbb\xff\xd7\x02\xa5\x01\xbe\xff\xd7\x02\xa5\x01\ +\xc1\xff\xd7\x02\xa5\x01\xe1\xff\xd7\x02\xa5\x02l\xff\xd7\x02\ +\xa5\x02|\xff\xd7\x02\xa5\x02~\xff\xd7\x02\xa5\x02\x84\xff\ +\xd7\x02\xa5\x02\x86\xff\xd7\x02\xa5\x02\x88\xff\xd7\x02\xa5\x02\ +\x8a\xff\xd7\x02\xa5\x02\x8c\xff\xd7\x02\xa5\x02\xb1\xff\xd7\x02\ +\xa5\x02\xb3\xff\xd7\x02\xa5\x02\xbf\xff\xd7\x02\xa5\x02\xc0\xff\ +\xd7\x02\xa5\x02\xc1\xff\xd7\x02\xa5\x02\xc2\xff\xd7\x02\xa5\x02\ +\xc5\xff\x9a\x02\xa5\x02\xc7\xff\x9a\x02\xa5\x02\xd4\xff\xd7\x02\ +\xa5\x02\xd5\xff\xd7\x02\xa5\x02\xef\xff\xd7\x02\xa5\x02\xf1\xff\ +\xd7\x02\xa5\x02\xf3\xff\xd7\x02\xa5\x02\xfd\xff\xd7\x02\xa5\x02\ +\xfe\xff\xd7\x02\xa5\x03\x09\xff\xd7\x02\xa5\x03\x0b\xff\xd7\x02\ +\xa5\x03\x0e\xff\xd7\x02\xa5\x03\x10\xff\xd7\x02\xa5\x03\x15\xff\ +\xd7\x02\xa5\x03\x19\xff\xec\x02\xa6\x01\xcf\xff\xd7\x02\xa6\x01\ +\xd8\xff\xd7\x02\xa6\x01\xdb\xff\xd7\x02\xa6\x01\xde\xff\xd7\x02\ +\xa6\x01\xe1\xff\xd7\x02\xa6\x01\xea\xff\xd7\x02\xa6\x01\xed\xff\ +\xd7\x02\xa6\x02j\xff\xd7\x02\xa6\x02\x7f\xff\xd7\x02\xa6\x02\ +\x85\xff\xd7\x02\xa6\x02\x87\xff\xd7\x02\xa6\x02\x89\xff\xd7\x02\ +\xa6\x02\x8d\xff\xd7\x02\xa6\x02\xb2\xff\xd7\x02\xa6\x02\xb4\xff\ +\xd7\x02\xa6\x02\xc0\xff\xd7\x02\xa6\x02\xc2\xff\xd7\x02\xa6\x02\ +\xc6\xff\xd7\x02\xa6\x02\xc8\xff\xd7\x02\xa6\x02\xd5\xff\xd7\x02\ +\xa6\x02\xe0\xff\xd7\x02\xa6\x02\xf0\xff\xd7\x02\xa6\x02\xf2\xff\ +\xd7\x02\xa6\x02\xf4\xff\xd7\x02\xa6\x02\xfe\xff\xd7\x02\xa6\x03\ +\x0a\xff\xd7\x02\xa6\x03\x0c\xff\xd7\x02\xa6\x03\x16\xff\xd7\x02\ +\xa6\x03\x1a\xff\xd7\x02\xa7\x01\x9f\xff\xd7\x02\xa7\x01\xb8\xff\ +\xd7\x02\xa7\x01\xbb\xff\xd7\x02\xa7\x01\xbe\xff\xd7\x02\xa7\x01\ +\xc1\xff\xd7\x02\xa7\x01\xe1\xff\xd7\x02\xa7\x02l\xff\xd7\x02\ +\xa7\x02|\xff\xd7\x02\xa7\x02~\xff\xd7\x02\xa7\x02\x84\xff\ +\xd7\x02\xa7\x02\x86\xff\xd7\x02\xa7\x02\x88\xff\xd7\x02\xa7\x02\ +\x8a\xff\xd7\x02\xa7\x02\x8c\xff\xd7\x02\xa7\x02\xb1\xff\xd7\x02\ +\xa7\x02\xb3\xff\xd7\x02\xa7\x02\xbf\xff\xd7\x02\xa7\x02\xc0\xff\ +\xd7\x02\xa7\x02\xc1\xff\xd7\x02\xa7\x02\xc2\xff\xd7\x02\xa7\x02\ +\xc5\xff\x9a\x02\xa7\x02\xc7\xff\x9a\x02\xa7\x02\xd4\xff\xd7\x02\ +\xa7\x02\xd5\xff\xd7\x02\xa7\x02\xef\xff\xd7\x02\xa7\x02\xf1\xff\ +\xd7\x02\xa7\x02\xf3\xff\xd7\x02\xa7\x02\xfd\xff\xd7\x02\xa7\x02\ +\xfe\xff\xd7\x02\xa7\x03\x09\xff\xd7\x02\xa7\x03\x0b\xff\xd7\x02\ +\xa7\x03\x0e\xff\xd7\x02\xa7\x03\x10\xff\xd7\x02\xa7\x03\x15\xff\ +\xd7\x02\xa7\x03\x19\xff\xec\x02\xa8\x01\xcf\xff\xd7\x02\xa8\x01\ +\xd8\xff\xd7\x02\xa8\x01\xdb\xff\xd7\x02\xa8\x01\xde\xff\xd7\x02\ +\xa8\x01\xe1\xff\xd7\x02\xa8\x01\xea\xff\xd7\x02\xa8\x01\xed\xff\ +\xd7\x02\xa8\x02j\xff\xd7\x02\xa8\x02\x7f\xff\xd7\x02\xa8\x02\ +\x85\xff\xd7\x02\xa8\x02\x87\xff\xd7\x02\xa8\x02\x89\xff\xd7\x02\ +\xa8\x02\x8d\xff\xd7\x02\xa8\x02\xb2\xff\xd7\x02\xa8\x02\xb4\xff\ +\xd7\x02\xa8\x02\xc0\xff\xd7\x02\xa8\x02\xc2\xff\xd7\x02\xa8\x02\ +\xc6\xff\xd7\x02\xa8\x02\xc8\xff\xd7\x02\xa8\x02\xd5\xff\xd7\x02\ +\xa8\x02\xe0\xff\xd7\x02\xa8\x02\xf0\xff\xd7\x02\xa8\x02\xf2\xff\ +\xd7\x02\xa8\x02\xf4\xff\xd7\x02\xa8\x02\xfe\xff\xd7\x02\xa8\x03\ +\x0a\xff\xd7\x02\xa8\x03\x0c\xff\xd7\x02\xa8\x03\x16\xff\xd7\x02\ +\xa8\x03\x1a\xff\xd7\x02\xa9\x01\x9f\xff\xd7\x02\xa9\x01\xb8\xff\ +\xd7\x02\xa9\x01\xbb\xff\xd7\x02\xa9\x01\xbe\xff\xd7\x02\xa9\x01\ +\xc1\xff\xd7\x02\xa9\x01\xe1\xff\xd7\x02\xa9\x02l\xff\xd7\x02\ +\xa9\x02|\xff\xd7\x02\xa9\x02~\xff\xd7\x02\xa9\x02\x84\xff\ +\xd7\x02\xa9\x02\x86\xff\xd7\x02\xa9\x02\x88\xff\xd7\x02\xa9\x02\ +\x8a\xff\xd7\x02\xa9\x02\x8c\xff\xd7\x02\xa9\x02\xb1\xff\xd7\x02\ +\xa9\x02\xb3\xff\xd7\x02\xa9\x02\xbf\xff\xd7\x02\xa9\x02\xc0\xff\ +\xd7\x02\xa9\x02\xc1\xff\xd7\x02\xa9\x02\xc2\xff\xd7\x02\xa9\x02\ +\xc5\xff\x9a\x02\xa9\x02\xc7\xff\x9a\x02\xa9\x02\xd4\xff\xd7\x02\ +\xa9\x02\xd5\xff\xd7\x02\xa9\x02\xef\xff\xd7\x02\xa9\x02\xf1\xff\ +\xd7\x02\xa9\x02\xf3\xff\xd7\x02\xa9\x02\xfd\xff\xd7\x02\xa9\x02\ +\xfe\xff\xd7\x02\xa9\x03\x09\xff\xd7\x02\xa9\x03\x0b\xff\xd7\x02\ +\xa9\x03\x0e\xff\xd7\x02\xa9\x03\x10\xff\xd7\x02\xa9\x03\x15\xff\ +\xd7\x02\xa9\x03\x19\xff\xec\x02\xaa\x01\xcf\xff\xd7\x02\xaa\x01\ +\xd8\xff\xd7\x02\xaa\x01\xdb\xff\xd7\x02\xaa\x01\xde\xff\xd7\x02\ +\xaa\x01\xe1\xff\xd7\x02\xaa\x01\xea\xff\xd7\x02\xaa\x01\xed\xff\ +\xd7\x02\xaa\x02j\xff\xd7\x02\xaa\x02\x7f\xff\xd7\x02\xaa\x02\ +\x85\xff\xd7\x02\xaa\x02\x87\xff\xd7\x02\xaa\x02\x89\xff\xd7\x02\ +\xaa\x02\x8d\xff\xd7\x02\xaa\x02\xb2\xff\xd7\x02\xaa\x02\xb4\xff\ +\xd7\x02\xaa\x02\xc0\xff\xd7\x02\xaa\x02\xc2\xff\xd7\x02\xaa\x02\ +\xc6\xff\xd7\x02\xaa\x02\xc8\xff\xd7\x02\xaa\x02\xd5\xff\xd7\x02\ +\xaa\x02\xe0\xff\xd7\x02\xaa\x02\xf0\xff\xd7\x02\xaa\x02\xf2\xff\ +\xd7\x02\xaa\x02\xf4\xff\xd7\x02\xaa\x02\xfe\xff\xd7\x02\xaa\x03\ +\x0a\xff\xd7\x02\xaa\x03\x0c\xff\xd7\x02\xaa\x03\x16\xff\xd7\x02\ +\xaa\x03\x1a\xff\xd7\x02\xab\x01\xa3\x00\xe1\x02\xab\x02\xea\x00\ +)\x02\xab\x03\x0e\xff\xd7\x02\xab\x03\x10\xff\xd7\x02\xac\x00\ +\x05\xff\xec\x02\xac\x00\x0a\xff\xec\x02\xac\x02\x07\xff\xec\x02\ +\xac\x02\x0b\xff\xec\x02\xad\x00\x0f\xff\x9a\x02\xad\x00\x10\xff\ +\xd7\x02\xad\x00\x11\xff\x9a\x02\xad\x01\x9d\x00)\x02\xad\x01\ +\x9f\xff\xd7\x02\xad\x01\xa4\xff\xae\x02\xad\x01\xa6\x00)\x02\ +\xad\x01\xaa\xff\x85\x02\xad\x01\xae\xff\xae\x02\xad\x01\xb5\xff\ +\xae\x02\xad\x01\xb8\xff\xd7\x02\xad\x01\xbb\xff\xd7\x02\xad\x01\ +\xbc\x00)\x02\xad\x01\xbe\xff\xc3\x02\xad\x01\xc4\x00)\x02\ +\xad\x01\xcc\xff\xc3\x02\xad\x01\xcd\xff\xc3\x02\xad\x01\xce\xff\ +\x9a\x02\xad\x01\xcf\xff\xae\x02\xad\x01\xd0\xff\xd7\x02\xad\x01\ +\xd1\xff\xd7\x02\xad\x01\xd2\xff\xc3\x02\xad\x01\xd3\xff\xc3\x02\ +\xad\x01\xd4\xff\xc3\x02\xad\x01\xd5\xff\x9a\x02\xad\x01\xd6\xff\ +\xc3\x02\xad\x01\xd7\xff\xc3\x02\xad\x01\xd8\xff\xae\x02\xad\x01\ +\xd9\xff\xc3\x02\xad\x01\xda\xff\xc3\x02\xad\x01\xdb\xff\xae\x02\ +\xad\x01\xde\xff\xae\x02\xad\x01\xdf\xff\xd7\x02\xad\x01\xe0\xff\ +\xc3\x02\xad\x01\xe1\xff\x9a\x02\xad\x01\xe2\xff\xc3\x02\xad\x01\ +\xe3\xff\xc3\x02\xad\x01\xe5\xff\xc3\x02\xad\x01\xe6\xff\xc3\x02\ +\xad\x01\xe7\xff\xd7\x02\xad\x01\xe8\xff\xc3\x02\xad\x01\xea\xff\ +\xae\x02\xad\x01\xeb\x00)\x02\xad\x01\xec\xff\xc3\x02\xad\x01\ +\xed\xff\xae\x02\xad\x01\xee\xff\xc3\x02\xad\x01\xf2\xff\x9a\x02\ +\xad\x01\xf3\xff\xc3\x02\xad\x01\xf4\x00)\x02\xad\x01\xf5\xff\ +\xc3\x02\xad\x01\xf7\xff\xc3\x02\xad\x01\xf9\xff\xc3\x02\xad\x02\ +\x02\xff\xd7\x02\xad\x02\x03\xff\xd7\x02\xad\x02\x04\xff\xd7\x02\ +\xad\x02\x08\xff\x9a\x02\xad\x02\x0c\xff\x9a\x02\xad\x02j\xff\ +\xae\x02\xad\x02k\xff\xc3\x02\xad\x02l\xff\xd7\x02\xad\x02\ +q\xff\xc3\x02\xad\x02r\xff\x85\x02\xad\x02s\xff\x9a\x02\ +\xad\x02u\xff\xc3\x02\xad\x02w\xff\xd7\x02\xad\x02y\xff\ +\xc3\x02\xad\x02}\xff\xc3\x02\xad\x02~\xff\xd7\x02\xad\x02\ +\x7f\xff\xae\x02\xad\x02\x84\xff\xd7\x02\xad\x02\x85\xff\xae\x02\ +\xad\x02\x86\xff\xd7\x02\xad\x02\x87\xff\xae\x02\xad\x02\x88\xff\ +\xd7\x02\xad\x02\x89\xff\xae\x02\xad\x02\x8a\xff\xd7\x02\xad\x02\ +\x8c\xff\xd7\x02\xad\x02\x8d\xff\xae\x02\xad\x02\x96\xff\xc3\x02\ +\xad\x02\x98\x00)\x02\xad\x02\x9a\xff\xc3\x02\xad\x02\x9e\xff\ +\xc3\x02\xad\x02\xa0\xff\xd7\x02\xad\x02\xa2\xff\xd7\x02\xad\x02\ +\xa4\xff\xc3\x02\xad\x02\xa6\xff\xc3\x02\xad\x02\xa8\x00)\x02\ +\xad\x02\xa9\x00)\x02\xad\x02\xac\xff\xc3\x02\xad\x02\xae\xff\ +\xc3\x02\xad\x02\xb0\xff\xc3\x02\xad\x02\xb1\xff\xd7\x02\xad\x02\ +\xb2\xff\xae\x02\xad\x02\xb3\xff\xd7\x02\xad\x02\xb4\xff\xae\x02\ +\xad\x02\xb5\x00)\x02\xad\x02\xbc\xff\xd7\x02\xad\x02\xbd\x00\ +)\x02\xad\x02\xc0\xff\x9a\x02\xad\x02\xc2\xff\x9a\x02\xad\x02\ +\xc4\xff\xc3\x02\xad\x02\xc5\xff\xd7\x02\xad\x02\xc6\xff\xc3\x02\ +\xad\x02\xc7\xff\xd7\x02\xad\x02\xc8\xff\xc3\x02\xad\x02\xcb\xff\ +\xd7\x02\xad\x02\xcd\xff\xc3\x02\xad\x02\xce\xff\xae\x02\xad\x02\ +\xcf\xff\x9a\x02\xad\x02\xd1\xff\xc3\x02\xad\x02\xd3\xff\xc3\x02\ +\xad\x02\xd5\xff\x9a\x02\xad\x02\xd7\xff\xc3\x02\xad\x02\xd9\xff\ +\x85\x02\xad\x02\xdb\xff\x85\x02\xad\x02\xdd\xff\x85\x02\xad\x02\ +\xe0\xff\xae\x02\xad\x02\xe6\xff\xd7\x02\xad\x02\xe8\xff\xd7\x02\ +\xad\x02\xec\xff\xc3\x02\xad\x02\xee\xff\xc3\x02\xad\x02\xef\xff\ +\xd7\x02\xad\x02\xf0\xff\xae\x02\xad\x02\xf1\xff\xd7\x02\xad\x02\ +\xf2\xff\xae\x02\xad\x02\xf3\xff\xd7\x02\xad\x02\xf4\xff\xae\x02\ +\xad\x02\xf6\xff\xd7\x02\xad\x02\xfe\xff\x9a\x02\xad\x03\x00\xff\ +\xc3\x02\xad\x03\x02\xff\xc3\x02\xad\x03\x06\xff\xd7\x02\xad\x03\ +\x08\xff\xd7\x02\xad\x03\x09\xff\x9a\x02\xad\x03\x0a\xff\xae\x02\ +\xad\x03\x0b\xff\x9a\x02\xad\x03\x0c\xff\xae\x02\xad\x03\x0e\xff\ +\xd7\x02\xad\x03\x10\xff\xd7\x02\xad\x03\x11\xff\xae\x02\xad\x03\ +\x12\xff\x9a\x02\xad\x03\x14\xff\xc3\x02\xad\x03\x15\xff\xd7\x02\ +\xad\x03\x16\xff\xae\x02\xad\x03\x17\x00)\x02\xad\x03\x1a\xff\ +\xae\x02\xad\x03\x1b\xff\xae\x02\xad\x03\x1c\xff\x9a\x02\xae\x00\ +\x0f\xff\x9a\x02\xae\x00\x10\xff\xd7\x02\xae\x00\x11\xff\x9a\x02\ +\xae\x01\xce\xff\xc3\x02\xae\x01\xcf\xff\xec\x02\xae\x01\xd5\xff\ +\xc3\x02\xae\x01\xd8\xff\xec\x02\xae\x01\xdb\xff\xec\x02\xae\x01\ +\xde\xff\xec\x02\xae\x01\xea\xff\xec\x02\xae\x01\xed\xff\xec\x02\ +\xae\x01\xf2\xff\xc3\x02\xae\x02\x02\xff\xd7\x02\xae\x02\x03\xff\ +\xd7\x02\xae\x02\x04\xff\xd7\x02\xae\x02\x08\xff\x9a\x02\xae\x02\ +\x0c\xff\x9a\x02\xae\x02j\xff\xec\x02\xae\x02s\xff\xc3\x02\ +\xae\x02\x7f\xff\xec\x02\xae\x02\x85\xff\xec\x02\xae\x02\x87\xff\ +\xec\x02\xae\x02\x89\xff\xec\x02\xae\x02\x8d\xff\xec\x02\xae\x02\ +\xb2\xff\xec\x02\xae\x02\xb4\xff\xec\x02\xae\x02\xcf\xff\xc3\x02\ +\xae\x02\xe0\xff\xec\x02\xae\x02\xf0\xff\xec\x02\xae\x02\xf2\xff\ +\xec\x02\xae\x02\xf4\xff\xec\x02\xae\x03\x0a\xff\xec\x02\xae\x03\ +\x0c\xff\xec\x02\xae\x03\x12\xff\xc3\x02\xae\x03\x16\xff\xec\x02\ +\xae\x03\x1a\xff\xec\x02\xae\x03\x1c\xff\xc3\x02\xaf\x00\x05\xff\ +\x5c\x02\xaf\x00\x0a\xff\x5c\x02\xaf\x01\x9d\xff\x9a\x02\xaf\x01\ +\xa3\x00f\x02\xaf\x01\xa6\xff\x9a\x02\xaf\x01\xbc\xffH\x02\ +\xaf\x01\xc1\xff\x85\x02\xaf\x01\xc4\xff\x9a\x02\xaf\x01\xdc\xff\ +\xae\x02\xaf\x01\xe1\xff\xd7\x02\xaf\x01\xe4\xff\xae\x02\xaf\x02\ +\x07\xff\x5c\x02\xaf\x02\x0b\xff\x5c\x02\xaf\x02|\xff\x85\x02\ +\xaf\x02\x80\xffq\x02\xaf\x02\x82\xffq\x02\xaf\x02\xa9\xff\ +\x9a\x02\xaf\x02\xaa\xff\xae\x02\xaf\x02\xb5\xffH\x02\xaf\x02\ +\xb6\xff\xae\x02\xaf\x02\xb7\xff\x9a\x02\xaf\x02\xb9\xff\x9a\x02\ +\xaf\x02\xbd\xff\x9a\x02\xaf\x02\xbe\xff\xae\x02\xaf\x02\xbf\xff\ +\x85\x02\xaf\x02\xc0\xff\xd7\x02\xaf\x02\xc1\xff\x85\x02\xaf\x02\ +\xc2\xff\xd7\x02\xaf\x02\xc5\xff\xc3\x02\xaf\x02\xc6\xff\xd7\x02\ +\xaf\x02\xc7\xff\xc3\x02\xaf\x02\xc8\xff\xd7\x02\xaf\x02\xd4\xff\ +\x85\x02\xaf\x02\xd5\xff\xd7\x02\xaf\x02\xfd\xff\x85\x02\xaf\x02\ +\xfe\xff\xd7\x02\xaf\x03\x0d\xffH\x02\xaf\x03\x0e\xff\xae\x02\ +\xaf\x03\x0f\xffH\x02\xaf\x03\x10\xff\xae\x02\xaf\x03\x17\xff\ +\x9a\x02\xaf\x03\x18\xff\xae\x02\xb0\x00\x05\xffq\x02\xb0\x00\ +\x0a\xffq\x02\xb0\x01\xdc\xff\x9a\x02\xb0\x01\xe1\xff\xd7\x02\ +\xb0\x01\xe4\xff\x9a\x02\xb0\x02\x07\xffq\x02\xb0\x02\x0b\xff\ +q\x02\xb0\x02m\xff\xd7\x02\xb0\x02\x81\xff\xd7\x02\xb0\x02\ +\x83\xff\xd7\x02\xb0\x02\x8b\xff\xd7\x02\xb0\x02\xaa\xff\x9a\x02\ +\xb0\x02\xb6\xff\x9a\x02\xb0\x02\xb8\xff\xd7\x02\xb0\x02\xba\xff\ +\xd7\x02\xb0\x02\xbe\xff\x9a\x02\xb0\x02\xc0\xff\xd7\x02\xb0\x02\ +\xc2\xff\xd7\x02\xb0\x02\xc6\xff\xd7\x02\xb0\x02\xc8\xff\xd7\x02\ +\xb0\x02\xd5\xff\xd7\x02\xb0\x02\xfe\xff\xd7\x02\xb0\x03\x0e\xff\ +q\x02\xb0\x03\x10\xffq\x02\xb0\x03\x18\xff\x9a\x02\xb1\x01\ +\x9d\xff\xd7\x02\xb1\x01\xa6\xff\xd7\x02\xb1\x01\xbc\xff\xc3\x02\ +\xb1\x01\xc4\xff\xd7\x02\xb1\x02\x80\xff\xec\x02\xb1\x02\x82\xff\ +\xec\x02\xb1\x02\xa9\xff\xd7\x02\xb1\x02\xb5\xff\xc3\x02\xb1\x02\ +\xb7\xff\xec\x02\xb1\x02\xb9\xff\xec\x02\xb1\x02\xbd\xff\xd7\x02\ +\xb1\x03\x0d\xff\xd7\x02\xb1\x03\x0f\xff\xd7\x02\xb1\x03\x17\xff\ +\xd7\x02\xb2\x00\x05\xff\xec\x02\xb2\x00\x0a\xff\xec\x02\xb2\x01\ +\xd0\xff\xd7\x02\xb2\x01\xdc\xff\xec\x02\xb2\x01\xdd\xff\xec\x02\ +\xb2\x01\xdf\xff\xd7\x02\xb2\x01\xe1\xff\xec\x02\xb2\x01\xe4\xff\ +\xec\x02\xb2\x01\xf6\xff\xec\x02\xb2\x02\x07\xff\xec\x02\xb2\x02\ +\x0b\xff\xec\x02\xb2\x02\xa0\xff\xd7\x02\xb2\x02\xaa\xff\xec\x02\ +\xb2\x02\xb6\xff\xec\x02\xb2\x02\xbc\xff\xd7\x02\xb2\x02\xbe\xff\ +\xec\x02\xb2\x02\xc0\xff\xec\x02\xb2\x02\xc2\xff\xec\x02\xb2\x02\ +\xcb\xff\xd7\x02\xb2\x02\xd5\xff\xec\x02\xb2\x02\xe6\xff\xd7\x02\ +\xb2\x02\xf8\xff\xec\x02\xb2\x02\xfa\xff\xec\x02\xb2\x02\xfc\xff\ +\xec\x02\xb2\x02\xfe\xff\xec\x02\xb2\x03\x06\xff\xd7\x02\xb2\x03\ +\x08\xff\xd7\x02\xb2\x03\x0e\xff\xec\x02\xb2\x03\x10\xff\xec\x02\ +\xb2\x03\x18\xff\xec\x02\xb3\x01\x9f\xff\xd7\x02\xb3\x01\xb8\xff\ +\xd7\x02\xb3\x01\xbb\xff\xd7\x02\xb3\x01\xbe\xff\xd7\x02\xb3\x01\ +\xe1\xff\xd7\x02\xb3\x02l\xff\xd7\x02\xb3\x02~\xff\xd7\x02\ +\xb3\x02\x84\xff\xd7\x02\xb3\x02\x86\xff\xd7\x02\xb3\x02\x88\xff\ +\xd7\x02\xb3\x02\x8a\xff\xd7\x02\xb3\x02\x8c\xff\xd7\x02\xb3\x02\ +\xb1\xff\xd7\x02\xb3\x02\xb3\xff\xd7\x02\xb3\x02\xc0\xff\xd7\x02\ +\xb3\x02\xc2\xff\xd7\x02\xb3\x02\xc5\xff\xd7\x02\xb3\x02\xc7\xff\ +\xd7\x02\xb3\x02\xd5\xff\xd7\x02\xb3\x02\xef\xff\xd7\x02\xb3\x02\ +\xf1\xff\xd7\x02\xb3\x02\xf3\xff\xd7\x02\xb3\x02\xfe\xff\xd7\x02\ +\xb3\x03\x09\xff\xd7\x02\xb3\x03\x0b\xff\xd7\x02\xb3\x03\x0e\xff\ +\xd7\x02\xb3\x03\x10\xff\xd7\x02\xb3\x03\x15\xff\xd7\x02\xb5\x00\ +\x0f\xff\x85\x02\xb5\x00\x10\xff\xae\x02\xb5\x00\x11\xff\x85\x02\ +\xb5\x01\x9f\xff\xd7\x02\xb5\x01\xa4\xff\x9a\x02\xb5\x01\xaa\xff\ +q\x02\xb5\x01\xae\xff\x9a\x02\xb5\x01\xb5\xff\x9a\x02\xb5\x01\ +\xb8\xff\xd7\x02\xb5\x01\xbb\xff\xd7\x02\xb5\x01\xbc\x00)\x02\ +\xb5\x01\xbe\xff\xae\x02\xb5\x01\xcc\xff\x9a\x02\xb5\x01\xcd\xff\ +\x9a\x02\xb5\x01\xce\xff\x85\x02\xb5\x01\xcf\xffq\x02\xb5\x01\ +\xd0\xff\xd7\x02\xb5\x01\xd1\xff\xd7\x02\xb5\x01\xd2\xff\x9a\x02\ +\xb5\x01\xd3\xff\x9a\x02\xb5\x01\xd4\xff\x9a\x02\xb5\x01\xd5\xff\ +\x85\x02\xb5\x01\xd6\xff\x9a\x02\xb5\x01\xd7\xff\x9a\x02\xb5\x01\ +\xd8\xffq\x02\xb5\x01\xd9\xff\x9a\x02\xb5\x01\xda\xff\x9a\x02\ +\xb5\x01\xdb\xffq\x02\xb5\x01\xdc\xff\xae\x02\xb5\x01\xdd\xff\ +\xae\x02\xb5\x01\xde\xffq\x02\xb5\x01\xdf\xff\xd7\x02\xb5\x01\ +\xe0\xff\x9a\x02\xb5\x01\xe1\xff\x9a\x02\xb5\x01\xe2\xff\x9a\x02\ +\xb5\x01\xe3\xff\x9a\x02\xb5\x01\xe4\xff\xae\x02\xb5\x01\xe5\xff\ +\x9a\x02\xb5\x01\xe6\xff\x9a\x02\xb5\x01\xe7\xff\xd7\x02\xb5\x01\ +\xe8\xff\x9a\x02\xb5\x01\xe9\xff\xc3\x02\xb5\x01\xea\xffq\x02\ +\xb5\x01\xec\xff\x9a\x02\xb5\x01\xed\xffq\x02\xb5\x01\xee\xff\ +\x85\x02\xb5\x01\xf2\xff\x85\x02\xb5\x01\xf3\xff\x9a\x02\xb5\x01\ +\xf5\xff\x9a\x02\xb5\x01\xf6\xff\xae\x02\xb5\x01\xf7\xff\x9a\x02\ +\xb5\x01\xf9\xff\x9a\x02\xb5\x02\x02\xff\xae\x02\xb5\x02\x03\xff\ +\xae\x02\xb5\x02\x04\xff\xae\x02\xb5\x02\x08\xff\x85\x02\xb5\x02\ +\x0c\xff\x85\x02\xb5\x02j\xffq\x02\xb5\x02k\xff\x9a\x02\ +\xb5\x02l\xff\xd7\x02\xb5\x02m\xff\xd7\x02\xb5\x02q\xff\ +\x9a\x02\xb5\x02r\xffq\x02\xb5\x02s\xff\x85\x02\xb5\x02\ +u\xff\x9a\x02\xb5\x02w\xff\x9a\x02\xb5\x02y\xff\x9a\x02\ +\xb5\x02}\xff\x9a\x02\xb5\x02~\xff\xd7\x02\xb5\x02\x7f\xff\ +q\x02\xb5\x02\x81\xff\xd7\x02\xb5\x02\x83\xff\xd7\x02\xb5\x02\ +\x84\xff\xd7\x02\xb5\x02\x85\xffq\x02\xb5\x02\x86\xff\xd7\x02\ +\xb5\x02\x87\xffq\x02\xb5\x02\x88\xff\xd7\x02\xb5\x02\x89\xff\ +q\x02\xb5\x02\x8a\xff\xd7\x02\xb5\x02\x8b\xff\xd7\x02\xb5\x02\ +\x8c\xff\xd7\x02\xb5\x02\x8d\xffq\x02\xb5\x02\x96\xff\x9a\x02\ +\xb5\x02\x9a\xff\x9a\x02\xb5\x02\x9e\xff\x9a\x02\xb5\x02\xa0\xff\ +\xd7\x02\xb5\x02\xa2\xff\xd7\x02\xb5\x02\xa4\xff\x9a\x02\xb5\x02\ +\xa6\xff\x9a\x02\xb5\x02\xaa\xff\xae\x02\xb5\x02\xac\xff\x9a\x02\ +\xb5\x02\xae\xff\x9a\x02\xb5\x02\xb0\xff\x9a\x02\xb5\x02\xb1\xff\ +\xd7\x02\xb5\x02\xb2\xffq\x02\xb5\x02\xb3\xff\xd7\x02\xb5\x02\ +\xb4\xffq\x02\xb5\x02\xb5\x00)\x02\xb5\x02\xb6\xff\xae\x02\ +\xb5\x02\xb8\xff\xae\x02\xb5\x02\xba\xff\xae\x02\xb5\x02\xbc\xff\ +\xd7\x02\xb5\x02\xbe\xff\xae\x02\xb5\x02\xc0\xff\x9a\x02\xb5\x02\ +\xc2\xff\x9a\x02\xb5\x02\xc4\xff\x9a\x02\xb5\x02\xc5\xff\x9a\x02\ +\xb5\x02\xc6\xffq\x02\xb5\x02\xc7\xff\x9a\x02\xb5\x02\xc8\xff\ +q\x02\xb5\x02\xcb\xff\xd7\x02\xb5\x02\xcd\xff\x9a\x02\xb5\x02\ +\xce\xff\x9a\x02\xb5\x02\xcf\xff\x85\x02\xb5\x02\xd1\xff\x9a\x02\ +\xb5\x02\xd3\xff\x9a\x02\xb5\x02\xd5\xff\x9a\x02\xb5\x02\xd7\xff\ +\x9a\x02\xb5\x02\xd9\xffq\x02\xb5\x02\xdb\xffq\x02\xb5\x02\ +\xdd\xffq\x02\xb5\x02\xe0\xffq\x02\xb5\x02\xe6\xff\xd7\x02\ +\xb5\x02\xe8\xff\xd7\x02\xb5\x02\xea\xff\xc3\x02\xb5\x02\xec\xff\ +\x9a\x02\xb5\x02\xee\xff\x9a\x02\xb5\x02\xef\xff\xd7\x02\xb5\x02\ +\xf0\xffq\x02\xb5\x02\xf1\xff\xd7\x02\xb5\x02\xf2\xffq\x02\ +\xb5\x02\xf3\xff\xd7\x02\xb5\x02\xf4\xffq\x02\xb5\x02\xf6\xff\ +\xd7\x02\xb5\x02\xf8\xff\xae\x02\xb5\x02\xfa\xff\xae\x02\xb5\x02\ +\xfc\xff\xae\x02\xb5\x02\xfe\xff\x9a\x02\xb5\x03\x00\xff\x9a\x02\ +\xb5\x03\x02\xff\x9a\x02\xb5\x03\x06\xff\xd7\x02\xb5\x03\x08\xff\ +\xd7\x02\xb5\x03\x09\xffq\x02\xb5\x03\x0a\xffq\x02\xb5\x03\ +\x0b\xffq\x02\xb5\x03\x0c\xffq\x02\xb5\x03\x0e\xff\x9a\x02\ +\xb5\x03\x10\xff\x9a\x02\xb5\x03\x11\xff\x9a\x02\xb5\x03\x12\xff\ +\x85\x02\xb5\x03\x14\xff\x9a\x02\xb5\x03\x15\xff\xd7\x02\xb5\x03\ +\x16\xffq\x02\xb5\x03\x18\xff\xae\x02\xb5\x03\x1a\xffq\x02\ +\xb5\x03\x1b\xff\x9a\x02\xb5\x03\x1c\xff\x85\x02\xb6\x00\x0f\xff\ +\x9a\x02\xb6\x00\x10\xff\xd7\x02\xb6\x00\x11\xff\x9a\x02\xb6\x01\ +\xce\xff\xc3\x02\xb6\x01\xcf\xff\xec\x02\xb6\x01\xd5\xff\xc3\x02\ +\xb6\x01\xd8\xff\xec\x02\xb6\x01\xdb\xff\xec\x02\xb6\x01\xde\xff\ +\xec\x02\xb6\x01\xea\xff\xec\x02\xb6\x01\xed\xff\xec\x02\xb6\x01\ +\xf2\xff\xc3\x02\xb6\x02\x02\xff\xd7\x02\xb6\x02\x03\xff\xd7\x02\ +\xb6\x02\x04\xff\xd7\x02\xb6\x02\x08\xff\x9a\x02\xb6\x02\x0c\xff\ +\x9a\x02\xb6\x02j\xff\xec\x02\xb6\x02s\xff\xc3\x02\xb6\x02\ +\x7f\xff\xec\x02\xb6\x02\x85\xff\xec\x02\xb6\x02\x87\xff\xec\x02\ +\xb6\x02\x89\xff\xec\x02\xb6\x02\x8d\xff\xec\x02\xb6\x02\xb2\xff\ +\xec\x02\xb6\x02\xb4\xff\xec\x02\xb6\x02\xcf\xff\xc3\x02\xb6\x02\ +\xe0\xff\xec\x02\xb6\x02\xf0\xff\xec\x02\xb6\x02\xf2\xff\xec\x02\ +\xb6\x02\xf4\xff\xec\x02\xb6\x03\x0a\xff\xec\x02\xb6\x03\x0c\xff\ +\xec\x02\xb6\x03\x12\xff\xc3\x02\xb6\x03\x16\xff\xec\x02\xb6\x03\ +\x1a\xff\xec\x02\xb6\x03\x1c\xff\xc3\x02\xb7\x00\x0f\xff\x85\x02\ +\xb7\x00\x11\xff\x85\x02\xb7\x01\x9f\xff\xd7\x02\xb7\x01\xa4\xff\ +\xae\x02\xb7\x01\xaa\xff\x85\x02\xb7\x01\xae\xff\xae\x02\xb7\x01\ +\xb5\xff\xae\x02\xb7\x01\xb8\xff\xd7\x02\xb7\x01\xbb\xff\xd7\x02\ +\xb7\x01\xbe\xff\xc3\x02\xb7\x01\xca\xff\xae\x02\xb7\x01\xcc\xff\ +\xc3\x02\xb7\x01\xcd\xff\xc3\x02\xb7\x01\xce\xff\x9a\x02\xb7\x01\ +\xcf\xff\x9a\x02\xb7\x01\xd2\xff\xc3\x02\xb7\x01\xd3\xff\xc3\x02\ +\xb7\x01\xd4\xff\xc3\x02\xb7\x01\xd5\xff\x9a\x02\xb7\x01\xd6\xff\ +\xc3\x02\xb7\x01\xd7\xff\xc3\x02\xb7\x01\xd8\xff\x9a\x02\xb7\x01\ +\xd9\xff\xc3\x02\xb7\x01\xda\xff\xc3\x02\xb7\x01\xdb\xff\x9a\x02\ +\xb7\x01\xde\xff\x9a\x02\xb7\x01\xe0\xff\xc3\x02\xb7\x01\xe1\xff\ +\xae\x02\xb7\x01\xe2\xff\xc3\x02\xb7\x01\xe3\xff\xc3\x02\xb7\x01\ +\xe5\xff\xc3\x02\xb7\x01\xe6\xff\xc3\x02\xb7\x01\xe8\xff\xc3\x02\ +\xb7\x01\xe9\xff\xd7\x02\xb7\x01\xea\xff\x9a\x02\xb7\x01\xeb\x00\ +)\x02\xb7\x01\xec\xff\xc3\x02\xb7\x01\xed\xff\x9a\x02\xb7\x01\ +\xee\xff\xae\x02\xb7\x01\xf2\xff\x9a\x02\xb7\x01\xf3\xff\xc3\x02\ +\xb7\x01\xf4\x00)\x02\xb7\x01\xf5\xff\xc3\x02\xb7\x01\xf7\xff\ +\xc3\x02\xb7\x01\xf9\xff\xc3\x02\xb7\x02\x08\xff\x85\x02\xb7\x02\ +\x0c\xff\x85\x02\xb7\x02j\xff\x9a\x02\xb7\x02k\xff\xc3\x02\ +\xb7\x02l\xff\xd7\x02\xb7\x02q\xff\xc3\x02\xb7\x02r\xff\ +\x85\x02\xb7\x02s\xff\x9a\x02\xb7\x02u\xff\xc3\x02\xb7\x02\ +w\xff\xd7\x02\xb7\x02y\xff\xc3\x02\xb7\x02}\xff\xd7\x02\ +\xb7\x02~\xff\xd7\x02\xb7\x02\x7f\xff\x9a\x02\xb7\x02\x84\xff\ +\xd7\x02\xb7\x02\x85\xff\x9a\x02\xb7\x02\x86\xff\xd7\x02\xb7\x02\ +\x87\xff\x9a\x02\xb7\x02\x88\xff\xd7\x02\xb7\x02\x89\xff\x9a\x02\ +\xb7\x02\x8a\xff\xd7\x02\xb7\x02\x8c\xff\xd7\x02\xb7\x02\x8d\xff\ +\x9a\x02\xb7\x02\x96\xff\xc3\x02\xb7\x02\x98\x00)\x02\xb7\x02\ +\x9a\xff\xc3\x02\xb7\x02\x9e\xff\xc3\x02\xb7\x02\xa4\xff\xc3\x02\ +\xb7\x02\xa6\xff\xc3\x02\xb7\x02\xa8\x00)\x02\xb7\x02\xac\xff\ +\xc3\x02\xb7\x02\xae\xff\xc3\x02\xb7\x02\xb0\xff\xc3\x02\xb7\x02\ +\xb1\xff\xd7\x02\xb7\x02\xb2\xff\x9a\x02\xb7\x02\xb3\xff\xd7\x02\ +\xb7\x02\xb4\xff\x9a\x02\xb7\x02\xc0\xff\xae\x02\xb7\x02\xc2\xff\ +\xae\x02\xb7\x02\xc4\xff\xc3\x02\xb7\x02\xc6\xff\xae\x02\xb7\x02\ +\xc8\xff\xae\x02\xb7\x02\xcd\xff\xc3\x02\xb7\x02\xce\xff\xae\x02\ +\xb7\x02\xcf\xff\x9a\x02\xb7\x02\xd1\xff\xc3\x02\xb7\x02\xd3\xff\ +\xc3\x02\xb7\x02\xd5\xff\xae\x02\xb7\x02\xd7\xff\xc3\x02\xb7\x02\ +\xd9\xff\x85\x02\xb7\x02\xda\xff\xae\x02\xb7\x02\xdb\xff\x85\x02\ +\xb7\x02\xdc\xff\xae\x02\xb7\x02\xdd\xff\x85\x02\xb7\x02\xde\xff\ +\xae\x02\xb7\x02\xe0\xff\x9a\x02\xb7\x02\xe1\xff\xec\x02\xb7\x02\ +\xe2\xff\xae\x02\xb7\x02\xe3\xff\xec\x02\xb7\x02\xe4\xff\xae\x02\ +\xb7\x02\xec\xff\xc3\x02\xb7\x02\xee\xff\xc3\x02\xb7\x02\xef\xff\ +\xd7\x02\xb7\x02\xf0\xff\x9a\x02\xb7\x02\xf1\xff\xd7\x02\xb7\x02\ +\xf2\xff\x9a\x02\xb7\x02\xf3\xff\xd7\x02\xb7\x02\xf4\xff\x9a\x02\ +\xb7\x02\xfe\xff\xae\x02\xb7\x03\x00\xff\xc3\x02\xb7\x03\x02\xff\ +\xc3\x02\xb7\x03\x09\xff\xae\x02\xb7\x03\x0a\xff\x9a\x02\xb7\x03\ +\x0b\xff\xae\x02\xb7\x03\x0c\xff\x9a\x02\xb7\x03\x0e\xff\xd7\x02\ +\xb7\x03\x10\xff\xd7\x02\xb7\x03\x11\xff\xae\x02\xb7\x03\x12\xff\ +\x9a\x02\xb7\x03\x14\xff\xc3\x02\xb7\x03\x15\xff\xd7\x02\xb7\x03\ +\x16\xff\x9a\x02\xb7\x03\x19\xff\xec\x02\xb7\x03\x1a\xff\x9a\x02\ +\xb7\x03\x1b\xff\xae\x02\xb7\x03\x1c\xff\x9a\x02\xb8\x00\x0f\xff\ +\xae\x02\xb8\x00\x11\xff\xae\x02\xb8\x01\xce\xff\xec\x02\xb8\x01\ +\xd5\xff\xec\x02\xb8\x01\xf2\xff\xec\x02\xb8\x02\x08\xff\xae\x02\ +\xb8\x02\x0c\xff\xae\x02\xb8\x02s\xff\xec\x02\xb8\x02\xcf\xff\ +\xec\x02\xb8\x03\x12\xff\xec\x02\xb8\x03\x1c\xff\xec\x02\xb9\x00\ +\x0f\xff\x85\x02\xb9\x00\x11\xff\x85\x02\xb9\x01\x9f\xff\xd7\x02\ +\xb9\x01\xa4\xff\xae\x02\xb9\x01\xaa\xff\x85\x02\xb9\x01\xae\xff\ +\xae\x02\xb9\x01\xb5\xff\xae\x02\xb9\x01\xb8\xff\xd7\x02\xb9\x01\ +\xbb\xff\xd7\x02\xb9\x01\xbe\xff\xc3\x02\xb9\x01\xca\xff\xae\x02\ +\xb9\x01\xcc\xff\xc3\x02\xb9\x01\xcd\xff\xc3\x02\xb9\x01\xce\xff\ +\x9a\x02\xb9\x01\xcf\xff\x9a\x02\xb9\x01\xd2\xff\xc3\x02\xb9\x01\ +\xd3\xff\xc3\x02\xb9\x01\xd4\xff\xc3\x02\xb9\x01\xd5\xff\x9a\x02\ +\xb9\x01\xd6\xff\xc3\x02\xb9\x01\xd7\xff\xc3\x02\xb9\x01\xd8\xff\ +\x9a\x02\xb9\x01\xd9\xff\xc3\x02\xb9\x01\xda\xff\xc3\x02\xb9\x01\ +\xdb\xff\x9a\x02\xb9\x01\xde\xff\x9a\x02\xb9\x01\xe0\xff\xc3\x02\ +\xb9\x01\xe1\xff\xae\x02\xb9\x01\xe2\xff\xc3\x02\xb9\x01\xe3\xff\ +\xc3\x02\xb9\x01\xe5\xff\xc3\x02\xb9\x01\xe6\xff\xc3\x02\xb9\x01\ +\xe8\xff\xc3\x02\xb9\x01\xe9\xff\xd7\x02\xb9\x01\xea\xff\x9a\x02\ +\xb9\x01\xeb\x00)\x02\xb9\x01\xec\xff\xc3\x02\xb9\x01\xed\xff\ +\x9a\x02\xb9\x01\xee\xff\xae\x02\xb9\x01\xf2\xff\x9a\x02\xb9\x01\ +\xf3\xff\xc3\x02\xb9\x01\xf4\x00)\x02\xb9\x01\xf5\xff\xc3\x02\ +\xb9\x01\xf7\xff\xc3\x02\xb9\x01\xf9\xff\xc3\x02\xb9\x02\x08\xff\ +\x85\x02\xb9\x02\x0c\xff\x85\x02\xb9\x02j\xff\x9a\x02\xb9\x02\ +k\xff\xc3\x02\xb9\x02l\xff\xd7\x02\xb9\x02q\xff\xc3\x02\ +\xb9\x02r\xff\x85\x02\xb9\x02s\xff\x9a\x02\xb9\x02u\xff\ +\xc3\x02\xb9\x02w\xff\xd7\x02\xb9\x02y\xff\xc3\x02\xb9\x02\ +}\xff\xd7\x02\xb9\x02~\xff\xd7\x02\xb9\x02\x7f\xff\x9a\x02\ +\xb9\x02\x84\xff\xd7\x02\xb9\x02\x85\xff\x9a\x02\xb9\x02\x86\xff\ +\xd7\x02\xb9\x02\x87\xff\x9a\x02\xb9\x02\x88\xff\xd7\x02\xb9\x02\ +\x89\xff\x9a\x02\xb9\x02\x8a\xff\xd7\x02\xb9\x02\x8c\xff\xd7\x02\ +\xb9\x02\x8d\xff\x9a\x02\xb9\x02\x96\xff\xc3\x02\xb9\x02\x98\x00\ +)\x02\xb9\x02\x9a\xff\xc3\x02\xb9\x02\x9e\xff\xc3\x02\xb9\x02\ +\xa4\xff\xc3\x02\xb9\x02\xa6\xff\xc3\x02\xb9\x02\xa8\x00)\x02\ +\xb9\x02\xac\xff\xc3\x02\xb9\x02\xae\xff\xc3\x02\xb9\x02\xb0\xff\ +\xc3\x02\xb9\x02\xb1\xff\xd7\x02\xb9\x02\xb2\xff\x9a\x02\xb9\x02\ +\xb3\xff\xd7\x02\xb9\x02\xb4\xff\x9a\x02\xb9\x02\xc0\xff\xae\x02\ +\xb9\x02\xc2\xff\xae\x02\xb9\x02\xc4\xff\xc3\x02\xb9\x02\xc6\xff\ +\xae\x02\xb9\x02\xc8\xff\xae\x02\xb9\x02\xcd\xff\xc3\x02\xb9\x02\ +\xce\xff\xae\x02\xb9\x02\xcf\xff\x9a\x02\xb9\x02\xd1\xff\xc3\x02\ +\xb9\x02\xd3\xff\xc3\x02\xb9\x02\xd5\xff\xae\x02\xb9\x02\xd7\xff\ +\xc3\x02\xb9\x02\xd9\xff\x85\x02\xb9\x02\xda\xff\xae\x02\xb9\x02\ +\xdb\xff\x85\x02\xb9\x02\xdc\xff\xae\x02\xb9\x02\xdd\xff\x85\x02\ +\xb9\x02\xde\xff\xae\x02\xb9\x02\xe0\xff\x9a\x02\xb9\x02\xe1\xff\ +\xec\x02\xb9\x02\xe2\xff\xae\x02\xb9\x02\xe3\xff\xec\x02\xb9\x02\ +\xe4\xff\xae\x02\xb9\x02\xec\xff\xc3\x02\xb9\x02\xee\xff\xc3\x02\ +\xb9\x02\xef\xff\xd7\x02\xb9\x02\xf0\xff\x9a\x02\xb9\x02\xf1\xff\ +\xd7\x02\xb9\x02\xf2\xff\x9a\x02\xb9\x02\xf3\xff\xd7\x02\xb9\x02\ +\xf4\xff\x9a\x02\xb9\x02\xfe\xff\xae\x02\xb9\x03\x00\xff\xc3\x02\ +\xb9\x03\x02\xff\xc3\x02\xb9\x03\x09\xff\xae\x02\xb9\x03\x0a\xff\ +\x9a\x02\xb9\x03\x0b\xff\xae\x02\xb9\x03\x0c\xff\x9a\x02\xb9\x03\ +\x0e\xff\xd7\x02\xb9\x03\x10\xff\xd7\x02\xb9\x03\x11\xff\xae\x02\ +\xb9\x03\x12\xff\x9a\x02\xb9\x03\x14\xff\xc3\x02\xb9\x03\x15\xff\ +\xd7\x02\xb9\x03\x16\xff\x9a\x02\xb9\x03\x19\xff\xec\x02\xb9\x03\ +\x1a\xff\x9a\x02\xb9\x03\x1b\xff\xae\x02\xb9\x03\x1c\xff\x9a\x02\ +\xba\x00\x0f\xff\xae\x02\xba\x00\x11\xff\xae\x02\xba\x01\xce\xff\ +\xec\x02\xba\x01\xd5\xff\xec\x02\xba\x01\xf2\xff\xec\x02\xba\x02\ +\x08\xff\xae\x02\xba\x02\x0c\xff\xae\x02\xba\x02s\xff\xec\x02\ +\xba\x02\xcf\xff\xec\x02\xba\x03\x12\xff\xec\x02\xba\x03\x1c\xff\ +\xec\x02\xbb\x01\x9f\xff\xd7\x02\xbb\x01\xa3\x00\xe1\x02\xbb\x01\ +\xb8\xff\xd7\x02\xbb\x01\xbb\xff\xd7\x02\xbb\x01\xbe\xff\xc3\x02\ +\xbb\x01\xdc\xff\xd7\x02\xbb\x01\xe1\xff\xae\x02\xbb\x01\xe4\xff\ +\xd7\x02\xbb\x02l\xff\xd7\x02\xbb\x02{\x00=\x02\xbb\x02\ +}\xff\xec\x02\xbb\x02~\xff\xd7\x02\xbb\x02\x84\xff\xd7\x02\ +\xbb\x02\x86\xff\xd7\x02\xbb\x02\x88\xff\xd7\x02\xbb\x02\x8a\xff\ +\xd7\x02\xbb\x02\x8c\xff\xd7\x02\xbb\x02\xaa\xff\xd7\x02\xbb\x02\ +\xb1\xff\xd7\x02\xbb\x02\xb3\xff\xd7\x02\xbb\x02\xb6\xff\xd7\x02\ +\xbb\x02\xbe\xff\xd7\x02\xbb\x02\xc0\xff\xae\x02\xbb\x02\xc2\xff\ +\xae\x02\xbb\x02\xc5\xff\xc3\x02\xbb\x02\xc6\xff\xd7\x02\xbb\x02\ +\xc7\xff\xc3\x02\xbb\x02\xc8\xff\xd7\x02\xbb\x02\xd5\xff\xae\x02\ +\xbb\x02\xef\xff\xd7\x02\xbb\x02\xf1\xff\xd7\x02\xbb\x02\xf3\xff\ +\xd7\x02\xbb\x02\xfe\xff\xae\x02\xbb\x03\x0e\xff\xd7\x02\xbb\x03\ +\x10\xff\xd7\x02\xbb\x03\x15\xff\xd7\x02\xbb\x03\x18\xff\xd7\x02\ +\xbc\x01\xcf\xff\xec\x02\xbc\x01\xd8\xff\xec\x02\xbc\x01\xdb\xff\ +\xec\x02\xbc\x01\xde\xff\xec\x02\xbc\x01\xe1\xff\xec\x02\xbc\x01\ +\xea\xff\xec\x02\xbc\x01\xed\xff\xec\x02\xbc\x02j\xff\xec\x02\ +\xbc\x02\x7f\xff\xec\x02\xbc\x02\x85\xff\xec\x02\xbc\x02\x87\xff\ +\xec\x02\xbc\x02\x89\xff\xec\x02\xbc\x02\x8d\xff\xec\x02\xbc\x02\ +\xb2\xff\xec\x02\xbc\x02\xb4\xff\xec\x02\xbc\x02\xc0\xff\xec\x02\ +\xbc\x02\xc2\xff\xec\x02\xbc\x02\xd5\xff\xec\x02\xbc\x02\xe0\xff\ +\xec\x02\xbc\x02\xf0\xff\xec\x02\xbc\x02\xf2\xff\xec\x02\xbc\x02\ +\xf4\xff\xec\x02\xbc\x02\xfe\xff\xec\x02\xbc\x03\x0a\xff\xec\x02\ +\xbc\x03\x0c\xff\xec\x02\xbc\x03\x0e\xff\xd7\x02\xbc\x03\x10\xff\ +\xd7\x02\xbc\x03\x16\xff\xec\x02\xbc\x03\x1a\xff\xec\x02\xbd\x01\ +\xa3\x00\xe1\x02\xbd\x02\xea\x00)\x02\xbd\x03\x0e\xff\xd7\x02\ +\xbd\x03\x10\xff\xd7\x02\xbe\x00\x05\xff\xec\x02\xbe\x00\x0a\xff\ +\xec\x02\xbe\x02\x07\xff\xec\x02\xbe\x02\x0b\xff\xec\x02\xbf\x01\ +\xa3\x00\xe1\x02\xbf\x02\xea\x00)\x02\xbf\x03\x0e\xff\xd7\x02\ +\xbf\x03\x10\xff\xd7\x02\xc0\x00\x05\xff\xec\x02\xc0\x00\x0a\xff\ +\xec\x02\xc0\x02\x07\xff\xec\x02\xc0\x02\x0b\xff\xec\x02\xc3\x00\ +\x05\xff\xc3\x02\xc3\x00\x0a\xff\xc3\x02\xc3\x01\x9d\xff\xd7\x02\ +\xc3\x01\xa6\xff\xd7\x02\xc3\x01\xbc\xff\x85\x02\xc3\x01\xc1\xff\ +\xae\x02\xc3\x01\xc4\xff\xd7\x02\xc3\x01\xdc\xff\xd7\x02\xc3\x01\ +\xdd\xff\xec\x02\xc3\x01\xe1\xff\xec\x02\xc3\x01\xe4\xff\xd7\x02\ +\xc3\x01\xf6\xff\xec\x02\xc3\x02\x07\xff\xc3\x02\xc3\x02\x0b\xff\ +\xc3\x02\xc3\x02|\xff\xae\x02\xc3\x02\x80\xff\xc3\x02\xc3\x02\ +\x82\xff\xc3\x02\xc3\x02\xa9\xff\xd7\x02\xc3\x02\xaa\xff\xd7\x02\ +\xc3\x02\xb5\xff\x85\x02\xc3\x02\xb6\xff\xd7\x02\xc3\x02\xb7\xff\ +\x9a\x02\xc3\x02\xb9\xff\x9a\x02\xc3\x02\xbd\xff\xd7\x02\xc3\x02\ +\xbe\xff\xd7\x02\xc3\x02\xbf\xff\xae\x02\xc3\x02\xc0\xff\xec\x02\ +\xc3\x02\xc1\xff\xae\x02\xc3\x02\xc2\xff\xec\x02\xc3\x02\xd4\xff\ +\xae\x02\xc3\x02\xd5\xff\xec\x02\xc3\x02\xf8\xff\xec\x02\xc3\x02\ +\xfa\xff\xec\x02\xc3\x02\xfc\xff\xec\x02\xc3\x02\xfd\xff\xae\x02\ +\xc3\x02\xfe\xff\xec\x02\xc3\x03\x0d\xff\xae\x02\xc3\x03\x0e\xff\ +\xd7\x02\xc3\x03\x0f\xff\xae\x02\xc3\x03\x10\xff\xd7\x02\xc3\x03\ +\x17\xff\xd7\x02\xc3\x03\x18\xff\xd7\x02\xc4\x00\x05\xff\x9a\x02\ +\xc4\x00\x0a\xff\x9a\x02\xc4\x01\xdc\xff\xd7\x02\xc4\x01\xdd\xff\ +\xd7\x02\xc4\x01\xe4\xff\xd7\x02\xc4\x01\xf6\xff\xd7\x02\xc4\x02\ +\x07\xff\x9a\x02\xc4\x02\x0b\xff\x9a\x02\xc4\x02\xaa\xff\xd7\x02\ +\xc4\x02\xb6\xff\xd7\x02\xc4\x02\xb8\xff\xd7\x02\xc4\x02\xba\xff\ +\xd7\x02\xc4\x02\xbe\xff\xd7\x02\xc4\x02\xf8\xff\xd7\x02\xc4\x02\ +\xfa\xff\xd7\x02\xc4\x02\xfc\xff\xd7\x02\xc4\x03\x0e\xff\xae\x02\ +\xc4\x03\x10\xff\xae\x02\xc4\x03\x18\xff\xd7\x02\xc5\x01\xbc\xff\ +\xd7\x02\xc5\x02\x80\xff\xec\x02\xc5\x02\x82\xff\xec\x02\xc5\x02\ +\xb5\xff\xd7\x02\xc5\x02\xb7\xff\xec\x02\xc5\x02\xb9\xff\xec\x02\ +\xc5\x03\x0d\xff\xec\x02\xc5\x03\x0f\xff\xec\x02\xc6\x00\x05\xff\ +\xec\x02\xc6\x00\x0a\xff\xec\x02\xc6\x02\x07\xff\xec\x02\xc6\x02\ +\x0b\xff\xec\x02\xc7\x01\xbc\xff\xd7\x02\xc7\x02\x80\xff\xec\x02\ +\xc7\x02\x82\xff\xec\x02\xc7\x02\xb5\xff\xd7\x02\xc7\x02\xb7\xff\ +\xec\x02\xc7\x02\xb9\xff\xec\x02\xc7\x03\x0d\xff\xec\x02\xc7\x03\ +\x0f\xff\xec\x02\xc8\x00\x05\xff\xec\x02\xc8\x00\x0a\xff\xec\x02\ +\xc8\x02\x07\xff\xec\x02\xc8\x02\x0b\xff\xec\x02\xca\x01\x9f\xff\ +\xd7\x02\xca\x01\xb8\xff\xd7\x02\xca\x01\xbb\xff\xd7\x02\xca\x01\ +\xbe\xff\xd7\x02\xca\x01\xc1\xff\xd7\x02\xca\x01\xe1\xff\xd7\x02\ +\xca\x02l\xff\xd7\x02\xca\x02|\xff\xd7\x02\xca\x02~\xff\ +\xd7\x02\xca\x02\x84\xff\xd7\x02\xca\x02\x86\xff\xd7\x02\xca\x02\ +\x88\xff\xd7\x02\xca\x02\x8a\xff\xd7\x02\xca\x02\x8c\xff\xd7\x02\ +\xca\x02\xb1\xff\xd7\x02\xca\x02\xb3\xff\xd7\x02\xca\x02\xbf\xff\ +\xd7\x02\xca\x02\xc0\xff\xd7\x02\xca\x02\xc1\xff\xd7\x02\xca\x02\ +\xc2\xff\xd7\x02\xca\x02\xc5\xff\x9a\x02\xca\x02\xc7\xff\x9a\x02\ +\xca\x02\xd4\xff\xd7\x02\xca\x02\xd5\xff\xd7\x02\xca\x02\xef\xff\ +\xd7\x02\xca\x02\xf1\xff\xd7\x02\xca\x02\xf3\xff\xd7\x02\xca\x02\ +\xfd\xff\xd7\x02\xca\x02\xfe\xff\xd7\x02\xca\x03\x09\xff\xd7\x02\ +\xca\x03\x0b\xff\xd7\x02\xca\x03\x0e\xff\xd7\x02\xca\x03\x10\xff\ +\xd7\x02\xca\x03\x15\xff\xd7\x02\xca\x03\x19\xff\xec\x02\xcb\x01\ +\xcf\xff\xd7\x02\xcb\x01\xd8\xff\xd7\x02\xcb\x01\xdb\xff\xd7\x02\ +\xcb\x01\xde\xff\xd7\x02\xcb\x01\xe1\xff\xd7\x02\xcb\x01\xea\xff\ +\xd7\x02\xcb\x01\xed\xff\xd7\x02\xcb\x02j\xff\xd7\x02\xcb\x02\ +\x7f\xff\xd7\x02\xcb\x02\x85\xff\xd7\x02\xcb\x02\x87\xff\xd7\x02\ +\xcb\x02\x89\xff\xd7\x02\xcb\x02\x8d\xff\xd7\x02\xcb\x02\xb2\xff\ +\xd7\x02\xcb\x02\xb4\xff\xd7\x02\xcb\x02\xc0\xff\xd7\x02\xcb\x02\ +\xc2\xff\xd7\x02\xcb\x02\xc6\xff\xd7\x02\xcb\x02\xc8\xff\xd7\x02\ +\xcb\x02\xd5\xff\xd7\x02\xcb\x02\xe0\xff\xd7\x02\xcb\x02\xf0\xff\ +\xd7\x02\xcb\x02\xf2\xff\xd7\x02\xcb\x02\xf4\xff\xd7\x02\xcb\x02\ +\xfe\xff\xd7\x02\xcb\x03\x0a\xff\xd7\x02\xcb\x03\x0c\xff\xd7\x02\ +\xcb\x03\x16\xff\xd7\x02\xcb\x03\x1a\xff\xd7\x02\xcc\x00\x05\xff\ +\xc3\x02\xcc\x00\x0a\xff\xc3\x02\xcc\x01\xa3\x00f\x02\xcc\x01\ +\xbc\xff\xd7\x02\xcc\x01\xbe\xff\xd7\x02\xcc\x01\xc1\xff\xae\x02\ +\xcc\x01\xdc\xff\xc3\x02\xcc\x01\xe1\xff\xd7\x02\xcc\x01\xe4\xff\ +\xc3\x02\xcc\x02\x07\xff\xc3\x02\xcc\x02\x0b\xff\xc3\x02\xcc\x02\ +m\xff\xec\x02\xcc\x02|\xff\xae\x02\xcc\x02\x80\xff\xd7\x02\ +\xcc\x02\x81\xff\xec\x02\xcc\x02\x82\xff\xd7\x02\xcc\x02\x83\xff\ +\xec\x02\xcc\x02\x8b\xff\xec\x02\xcc\x02\xaa\xff\xc3\x02\xcc\x02\ +\xb5\xff\xd7\x02\xcc\x02\xb6\xff\xc3\x02\xcc\x02\xb7\xff\xd7\x02\ +\xcc\x02\xb8\xff\xec\x02\xcc\x02\xb9\xff\xd7\x02\xcc\x02\xba\xff\ +\xec\x02\xcc\x02\xbe\xff\xc3\x02\xcc\x02\xbf\xff\xae\x02\xcc\x02\ +\xc0\xff\xd7\x02\xcc\x02\xc1\xff\xae\x02\xcc\x02\xc2\xff\xd7\x02\ +\xcc\x02\xc5\xff\xc3\x02\xcc\x02\xc6\xff\xd7\x02\xcc\x02\xc7\xff\ +\xc3\x02\xcc\x02\xc8\xff\xd7\x02\xcc\x02\xd4\xff\xae\x02\xcc\x02\ +\xd5\xff\xd7\x02\xcc\x02\xfd\xff\xae\x02\xcc\x02\xfe\xff\xd7\x02\ +\xcc\x03\x0d\xff\xd7\x02\xcc\x03\x0e\xff\xc3\x02\xcc\x03\x0f\xff\ +\xd7\x02\xcc\x03\x10\xff\xc3\x02\xcc\x03\x18\xff\xc3\x02\xcd\x01\ +\xe1\xff\xd7\x02\xcd\x02\xc0\xff\xd7\x02\xcd\x02\xc2\xff\xd7\x02\ +\xcd\x02\xd5\xff\xd7\x02\xcd\x02\xfe\xff\xd7\x02\xce\x01\xa3\x00\ +\xe1\x02\xce\x02\xea\x00)\x02\xce\x03\x0e\xff\xd7\x02\xce\x03\ +\x10\xff\xd7\x02\xcf\x00\x05\xff\xec\x02\xcf\x00\x0a\xff\xec\x02\ +\xcf\x02\x07\xff\xec\x02\xcf\x02\x0b\xff\xec\x02\xd2\x01\xa3\x00\ +\xe1\x02\xd2\x02\xea\x00)\x02\xd2\x03\x0e\xff\xd7\x02\xd2\x03\ +\x10\xff\xd7\x02\xd3\x00\x05\xff\xec\x02\xd3\x00\x0a\xff\xec\x02\ +\xd3\x02\x07\xff\xec\x02\xd3\x02\x0b\xff\xec\x02\xd6\x01\xa3\x00\ +\xe1\x02\xd6\x02\xea\x00)\x02\xd6\x03\x0e\xff\xd7\x02\xd6\x03\ +\x10\xff\xd7\x02\xd7\x00\x05\xff\xec\x02\xd7\x00\x0a\xff\xec\x02\ +\xd7\x02\x07\xff\xec\x02\xd7\x02\x0b\xff\xec\x02\xd9\x00\x05\xff\ +q\x02\xd9\x00\x0a\xffq\x02\xd9\x01\x9d\xff\x9a\x02\xd9\x01\ +\xa6\xff\x9a\x02\xd9\x01\xbc\xffq\x02\xd9\x01\xbe\xff\xd7\x02\ +\xd9\x01\xc1\xff\x9a\x02\xd9\x01\xc4\xff\x9a\x02\xd9\x01\xdc\xff\ +\xd7\x02\xd9\x01\xe1\xff\xd7\x02\xd9\x01\xe4\xff\xd7\x02\xd9\x02\ +\x07\xffq\x02\xd9\x02\x0b\xffq\x02\xd9\x02n\xff\xd7\x02\ +\xd9\x02|\xff\x9a\x02\xd9\x02\x80\xff\xae\x02\xd9\x02\x82\xff\ +\xae\x02\xd9\x02\x97\xff\xd7\x02\xd9\x02\x9b\xff\xd7\x02\xd9\x02\ +\xa7\xff\xd7\x02\xd9\x02\xa9\xff\x9a\x02\xd9\x02\xaa\xff\xd7\x02\ +\xd9\x02\xb5\xffq\x02\xd9\x02\xb6\xff\xd7\x02\xd9\x02\xb7\xff\ +\x85\x02\xd9\x02\xb9\xff\x85\x02\xd9\x02\xbd\xff\x9a\x02\xd9\x02\ +\xbe\xff\xd7\x02\xd9\x02\xbf\xff\x9a\x02\xd9\x02\xc0\xff\xd7\x02\ +\xd9\x02\xc1\xff\x9a\x02\xd9\x02\xc2\xff\xd7\x02\xd9\x02\xc5\xff\ +\x9a\x02\xd9\x02\xc7\xff\x9a\x02\xd9\x02\xd4\xff\x9a\x02\xd9\x02\ +\xd5\xff\xd7\x02\xd9\x02\xe1\xff\xd7\x02\xd9\x02\xe3\xff\xd7\x02\ +\xd9\x02\xfd\xff\x9a\x02\xd9\x02\xfe\xff\xd7\x02\xd9\x03\x03\xff\ +\xd7\x02\xd9\x03\x0d\xffq\x02\xd9\x03\x0e\xff\xd7\x02\xd9\x03\ +\x0f\xffq\x02\xd9\x03\x10\xff\xd7\x02\xd9\x03\x17\xff\x9a\x02\ +\xd9\x03\x18\xff\xd7\x02\xda\x00\x05\xff\xec\x02\xda\x00\x0a\xff\ +\xec\x02\xda\x02\x07\xff\xec\x02\xda\x02\x0b\xff\xec\x02\xdb\x00\ +\x05\xffq\x02\xdb\x00\x0a\xffq\x02\xdb\x01\x9d\xff\x9a\x02\ +\xdb\x01\xa6\xff\x9a\x02\xdb\x01\xbc\xffq\x02\xdb\x01\xbe\xff\ +\xd7\x02\xdb\x01\xc1\xff\x9a\x02\xdb\x01\xc4\xff\x9a\x02\xdb\x01\ +\xdc\xff\xd7\x02\xdb\x01\xe1\xff\xd7\x02\xdb\x01\xe4\xff\xd7\x02\ +\xdb\x02\x07\xffq\x02\xdb\x02\x0b\xffq\x02\xdb\x02n\xff\ +\xd7\x02\xdb\x02|\xff\x9a\x02\xdb\x02\x80\xff\xae\x02\xdb\x02\ +\x82\xff\xae\x02\xdb\x02\x97\xff\xd7\x02\xdb\x02\x9b\xff\xd7\x02\ +\xdb\x02\xa7\xff\xd7\x02\xdb\x02\xa9\xff\x9a\x02\xdb\x02\xaa\xff\ +\xd7\x02\xdb\x02\xb5\xffq\x02\xdb\x02\xb6\xff\xd7\x02\xdb\x02\ +\xb7\xff\x85\x02\xdb\x02\xb9\xff\x85\x02\xdb\x02\xbd\xff\x9a\x02\ +\xdb\x02\xbe\xff\xd7\x02\xdb\x02\xbf\xff\x9a\x02\xdb\x02\xc0\xff\ +\xd7\x02\xdb\x02\xc1\xff\x9a\x02\xdb\x02\xc2\xff\xd7\x02\xdb\x02\ +\xc5\xff\x9a\x02\xdb\x02\xc7\xff\x9a\x02\xdb\x02\xd4\xff\x9a\x02\ +\xdb\x02\xd5\xff\xd7\x02\xdb\x02\xe1\xff\xd7\x02\xdb\x02\xe3\xff\ +\xd7\x02\xdb\x02\xfd\xff\x9a\x02\xdb\x02\xfe\xff\xd7\x02\xdb\x03\ +\x03\xff\xd7\x02\xdb\x03\x0d\xffq\x02\xdb\x03\x0e\xff\xd7\x02\ +\xdb\x03\x0f\xffq\x02\xdb\x03\x10\xff\xd7\x02\xdb\x03\x17\xff\ +\x9a\x02\xdb\x03\x18\xff\xd7\x02\xdc\x00\x05\xff\xec\x02\xdc\x00\ +\x0a\xff\xec\x02\xdc\x02\x07\xff\xec\x02\xdc\x02\x0b\xff\xec\x02\ +\xde\x00\x05\xff\xec\x02\xde\x00\x0a\xff\xec\x02\xde\x02\x07\xff\ +\xec\x02\xde\x02\x0b\xff\xec\x02\xe0\x00\x05\xff\xec\x02\xe0\x00\ +\x0a\xff\xec\x02\xe0\x02\x07\xff\xec\x02\xe0\x02\x0b\xff\xec\x02\ +\xe1\x00\x0f\xff\xae\x02\xe1\x00\x11\xff\xae\x02\xe1\x01\x9d\xff\ +\xec\x02\xe1\x01\xa4\xff\xd7\x02\xe1\x01\xa6\xff\xec\x02\xe1\x01\ +\xa8\xff\xd7\x02\xe1\x01\xaa\xff\xd7\x02\xe1\x01\xae\xff\xd7\x02\ +\xe1\x01\xb0\xff\xd7\x02\xe1\x01\xb1\xff\xec\x02\xe1\x01\xb5\xff\ +\xd7\x02\xe1\x01\xbc\xff\xc3\x02\xe1\x01\xbd\xff\xd7\x02\xe1\x01\ +\xbf\xff\xd7\x02\xe1\x01\xc1\xff\xd7\x02\xe1\x01\xc4\xff\xec\x02\ +\xe1\x01\xc7\xff\xec\x02\xe1\x01\xce\xff\xec\x02\xe1\x01\xd5\xff\ +\xec\x02\xe1\x01\xf2\xff\xec\x02\xe1\x02\x08\xff\xae\x02\xe1\x02\ +\x0c\xff\xae\x02\xe1\x02r\xff\xd7\x02\xe1\x02s\xff\xec\x02\ +\xe1\x02z\xff\xec\x02\xe1\x02|\xff\xd7\x02\xe1\x02\x80\xff\ +\xec\x02\xe1\x02\x82\xff\xec\x02\xe1\x02\x9f\xff\xd7\x02\xe1\x02\ +\xa1\xff\xec\x02\xe1\x02\xa9\xff\xec\x02\xe1\x02\xb5\xff\xc3\x02\ +\xe1\x02\xb7\xff\xec\x02\xe1\x02\xb9\xff\xec\x02\xe1\x02\xbb\xff\ +\xd7\x02\xe1\x02\xbd\xff\xec\x02\xe1\x02\xbf\xff\xd7\x02\xe1\x02\ +\xc1\xff\xd7\x02\xe1\x02\xca\xff\xd7\x02\xe1\x02\xce\xff\xd7\x02\ +\xe1\x02\xcf\xff\xec\x02\xe1\x02\xd4\xff\xd7\x02\xe1\x02\xd9\xff\ +\xd7\x02\xe1\x02\xdb\xff\xd7\x02\xe1\x02\xdd\xff\xd7\x02\xe1\x02\ +\xe5\xff\xd7\x02\xe1\x02\xe7\xff\xec\x02\xe1\x02\xf5\xff\xec\x02\ +\xe1\x02\xf7\xff\xd7\x02\xe1\x02\xf9\xff\xd7\x02\xe1\x02\xfb\xff\ +\xd7\x02\xe1\x02\xfd\xff\xd7\x02\xe1\x03\x05\xff\xd7\x02\xe1\x03\ +\x07\xff\xd7\x02\xe1\x03\x0d\xff\xd7\x02\xe1\x03\x0f\xff\xd7\x02\ +\xe1\x03\x11\xff\xd7\x02\xe1\x03\x12\xff\xec\x02\xe1\x03\x17\xff\ +\xec\x02\xe1\x03\x1b\xff\xd7\x02\xe1\x03\x1c\xff\xec\x02\xe2\x00\ +\x05\xff\xec\x02\xe2\x00\x0a\xff\xec\x02\xe2\x01\xd0\xff\xd7\x02\ +\xe2\x01\xdc\xff\xec\x02\xe2\x01\xdd\xff\xec\x02\xe2\x01\xdf\xff\ +\xd7\x02\xe2\x01\xe1\xff\xec\x02\xe2\x01\xe4\xff\xec\x02\xe2\x01\ +\xf6\xff\xec\x02\xe2\x02\x07\xff\xec\x02\xe2\x02\x0b\xff\xec\x02\ +\xe2\x02\xa0\xff\xd7\x02\xe2\x02\xaa\xff\xec\x02\xe2\x02\xb6\xff\ +\xec\x02\xe2\x02\xbc\xff\xd7\x02\xe2\x02\xbe\xff\xec\x02\xe2\x02\ +\xc0\xff\xec\x02\xe2\x02\xc2\xff\xec\x02\xe2\x02\xcb\xff\xd7\x02\ +\xe2\x02\xd5\xff\xec\x02\xe2\x02\xe6\xff\xd7\x02\xe2\x02\xf8\xff\ +\xec\x02\xe2\x02\xfa\xff\xec\x02\xe2\x02\xfc\xff\xec\x02\xe2\x02\ +\xfe\xff\xec\x02\xe2\x03\x06\xff\xd7\x02\xe2\x03\x08\xff\xd7\x02\ +\xe2\x03\x0e\xff\xec\x02\xe2\x03\x10\xff\xec\x02\xe2\x03\x18\xff\ +\xec\x02\xe3\x00\x0f\xff\xae\x02\xe3\x00\x11\xff\xae\x02\xe3\x01\ +\x9d\xff\xec\x02\xe3\x01\xa4\xff\xd7\x02\xe3\x01\xa6\xff\xec\x02\ +\xe3\x01\xa8\xff\xd7\x02\xe3\x01\xaa\xff\xd7\x02\xe3\x01\xae\xff\ +\xd7\x02\xe3\x01\xb0\xff\xd7\x02\xe3\x01\xb1\xff\xec\x02\xe3\x01\ +\xb5\xff\xd7\x02\xe3\x01\xbc\xff\xc3\x02\xe3\x01\xbd\xff\xd7\x02\ +\xe3\x01\xbf\xff\xd7\x02\xe3\x01\xc1\xff\xd7\x02\xe3\x01\xc4\xff\ +\xec\x02\xe3\x01\xc7\xff\xec\x02\xe3\x01\xce\xff\xec\x02\xe3\x01\ +\xd5\xff\xec\x02\xe3\x01\xf2\xff\xec\x02\xe3\x02\x08\xff\xae\x02\ +\xe3\x02\x0c\xff\xae\x02\xe3\x02r\xff\xd7\x02\xe3\x02s\xff\ +\xec\x02\xe3\x02z\xff\xec\x02\xe3\x02|\xff\xd7\x02\xe3\x02\ +\x80\xff\xec\x02\xe3\x02\x82\xff\xec\x02\xe3\x02\x9f\xff\xd7\x02\ +\xe3\x02\xa1\xff\xec\x02\xe3\x02\xa9\xff\xec\x02\xe3\x02\xb5\xff\ +\xc3\x02\xe3\x02\xb7\xff\xec\x02\xe3\x02\xb9\xff\xec\x02\xe3\x02\ +\xbb\xff\xd7\x02\xe3\x02\xbd\xff\xec\x02\xe3\x02\xbf\xff\xd7\x02\ +\xe3\x02\xc1\xff\xd7\x02\xe3\x02\xca\xff\xd7\x02\xe3\x02\xce\xff\ +\xd7\x02\xe3\x02\xcf\xff\xec\x02\xe3\x02\xd4\xff\xd7\x02\xe3\x02\ +\xd9\xff\xd7\x02\xe3\x02\xdb\xff\xd7\x02\xe3\x02\xdd\xff\xd7\x02\ +\xe3\x02\xe5\xff\xd7\x02\xe3\x02\xe7\xff\xec\x02\xe3\x02\xf5\xff\ +\xec\x02\xe3\x02\xf7\xff\xd7\x02\xe3\x02\xf9\xff\xd7\x02\xe3\x02\ +\xfb\xff\xd7\x02\xe3\x02\xfd\xff\xd7\x02\xe3\x03\x05\xff\xd7\x02\ +\xe3\x03\x07\xff\xd7\x02\xe3\x03\x0d\xff\xd7\x02\xe3\x03\x0f\xff\ +\xd7\x02\xe3\x03\x11\xff\xd7\x02\xe3\x03\x12\xff\xec\x02\xe3\x03\ +\x17\xff\xec\x02\xe3\x03\x1b\xff\xd7\x02\xe3\x03\x1c\xff\xec\x02\ +\xe4\x00\x05\xff\xec\x02\xe4\x00\x0a\xff\xec\x02\xe4\x01\xd0\xff\ +\xd7\x02\xe4\x01\xdc\xff\xec\x02\xe4\x01\xdd\xff\xec\x02\xe4\x01\ +\xdf\xff\xd7\x02\xe4\x01\xe1\xff\xec\x02\xe4\x01\xe4\xff\xec\x02\ +\xe4\x01\xf6\xff\xec\x02\xe4\x02\x07\xff\xec\x02\xe4\x02\x0b\xff\ +\xec\x02\xe4\x02\xa0\xff\xd7\x02\xe4\x02\xaa\xff\xec\x02\xe4\x02\ +\xb6\xff\xec\x02\xe4\x02\xbc\xff\xd7\x02\xe4\x02\xbe\xff\xec\x02\ +\xe4\x02\xc0\xff\xec\x02\xe4\x02\xc2\xff\xec\x02\xe4\x02\xcb\xff\ +\xd7\x02\xe4\x02\xd5\xff\xec\x02\xe4\x02\xe6\xff\xd7\x02\xe4\x02\ +\xf8\xff\xec\x02\xe4\x02\xfa\xff\xec\x02\xe4\x02\xfc\xff\xec\x02\ +\xe4\x02\xfe\xff\xec\x02\xe4\x03\x06\xff\xd7\x02\xe4\x03\x08\xff\ +\xd7\x02\xe4\x03\x0e\xff\xec\x02\xe4\x03\x10\xff\xec\x02\xe4\x03\ +\x18\xff\xec\x02\xe5\x01\x9f\xff\xd7\x02\xe5\x01\xb8\xff\xd7\x02\ +\xe5\x01\xbb\xff\xd7\x02\xe5\x01\xbe\xff\xd7\x02\xe5\x01\xc1\xff\ +\xd7\x02\xe5\x01\xe1\xff\xd7\x02\xe5\x02l\xff\xd7\x02\xe5\x02\ +|\xff\xd7\x02\xe5\x02~\xff\xd7\x02\xe5\x02\x84\xff\xd7\x02\ +\xe5\x02\x86\xff\xd7\x02\xe5\x02\x88\xff\xd7\x02\xe5\x02\x8a\xff\ +\xd7\x02\xe5\x02\x8c\xff\xd7\x02\xe5\x02\xb1\xff\xd7\x02\xe5\x02\ +\xb3\xff\xd7\x02\xe5\x02\xbf\xff\xd7\x02\xe5\x02\xc0\xff\xd7\x02\ +\xe5\x02\xc1\xff\xd7\x02\xe5\x02\xc2\xff\xd7\x02\xe5\x02\xc5\xff\ +\x9a\x02\xe5\x02\xc7\xff\x9a\x02\xe5\x02\xd4\xff\xd7\x02\xe5\x02\ +\xd5\xff\xd7\x02\xe5\x02\xef\xff\xd7\x02\xe5\x02\xf1\xff\xd7\x02\ +\xe5\x02\xf3\xff\xd7\x02\xe5\x02\xfd\xff\xd7\x02\xe5\x02\xfe\xff\ +\xd7\x02\xe5\x03\x09\xff\xd7\x02\xe5\x03\x0b\xff\xd7\x02\xe5\x03\ +\x0e\xff\xd7\x02\xe5\x03\x10\xff\xd7\x02\xe5\x03\x15\xff\xd7\x02\ +\xe5\x03\x19\xff\xec\x02\xe6\x01\xcf\xff\xd7\x02\xe6\x01\xd8\xff\ +\xd7\x02\xe6\x01\xdb\xff\xd7\x02\xe6\x01\xde\xff\xd7\x02\xe6\x01\ +\xe1\xff\xd7\x02\xe6\x01\xea\xff\xd7\x02\xe6\x01\xed\xff\xd7\x02\ +\xe6\x02j\xff\xd7\x02\xe6\x02\x7f\xff\xd7\x02\xe6\x02\x85\xff\ +\xd7\x02\xe6\x02\x87\xff\xd7\x02\xe6\x02\x89\xff\xd7\x02\xe6\x02\ +\x8d\xff\xd7\x02\xe6\x02\xb2\xff\xd7\x02\xe6\x02\xb4\xff\xd7\x02\ +\xe6\x02\xc0\xff\xd7\x02\xe6\x02\xc2\xff\xd7\x02\xe6\x02\xc6\xff\ +\xd7\x02\xe6\x02\xc8\xff\xd7\x02\xe6\x02\xd5\xff\xd7\x02\xe6\x02\ +\xe0\xff\xd7\x02\xe6\x02\xf0\xff\xd7\x02\xe6\x02\xf2\xff\xd7\x02\ +\xe6\x02\xf4\xff\xd7\x02\xe6\x02\xfe\xff\xd7\x02\xe6\x03\x0a\xff\ +\xd7\x02\xe6\x03\x0c\xff\xd7\x02\xe6\x03\x16\xff\xd7\x02\xe6\x03\ +\x1a\xff\xd7\x02\xe7\x00\x0f\xff\xae\x02\xe7\x00\x11\xff\xae\x02\ +\xe7\x02\x08\xff\xae\x02\xe7\x02\x0c\xff\xae\x02\xe7\x02\x80\xff\ +\xec\x02\xe7\x02\x82\xff\xec\x02\xe7\x02\xb7\xff\xec\x02\xe7\x02\ +\xb9\xff\xec\x02\xe7\x03\x0d\xff\xd7\x02\xe7\x03\x0f\xff\xd7\x02\ +\xe8\x01\xe9\x00)\x02\xe9\x00\x05\xff\xec\x02\xe9\x00\x0a\xff\ +\xec\x02\xe9\x02\x07\xff\xec\x02\xe9\x02\x0b\xff\xec\x02\xe9\x03\ +\x0e\xff\xd7\x02\xe9\x03\x10\xff\xd7\x02\xef\x00\x0f\xff\xae\x02\ +\xef\x00\x11\xff\xae\x02\xef\x01\x9d\xff\xec\x02\xef\x01\xa4\xff\ +\xd7\x02\xef\x01\xa6\xff\xec\x02\xef\x01\xa8\xff\xd7\x02\xef\x01\ +\xaa\xff\xd7\x02\xef\x01\xae\xff\xd7\x02\xef\x01\xb0\xff\xd7\x02\ +\xef\x01\xb1\xff\xec\x02\xef\x01\xb5\xff\xd7\x02\xef\x01\xbc\xff\ +\xc3\x02\xef\x01\xbd\xff\xd7\x02\xef\x01\xbf\xff\xd7\x02\xef\x01\ +\xc1\xff\xd7\x02\xef\x01\xc4\xff\xec\x02\xef\x01\xc7\xff\xec\x02\ +\xef\x01\xce\xff\xec\x02\xef\x01\xd5\xff\xec\x02\xef\x01\xf2\xff\ +\xec\x02\xef\x02\x08\xff\xae\x02\xef\x02\x0c\xff\xae\x02\xef\x02\ +r\xff\xd7\x02\xef\x02s\xff\xec\x02\xef\x02z\xff\xec\x02\ +\xef\x02|\xff\xd7\x02\xef\x02\x80\xff\xec\x02\xef\x02\x82\xff\ +\xec\x02\xef\x02\x9f\xff\xd7\x02\xef\x02\xa1\xff\xec\x02\xef\x02\ +\xa9\xff\xec\x02\xef\x02\xb5\xff\xc3\x02\xef\x02\xb7\xff\xec\x02\ +\xef\x02\xb9\xff\xec\x02\xef\x02\xbb\xff\xd7\x02\xef\x02\xbd\xff\ +\xec\x02\xef\x02\xbf\xff\xd7\x02\xef\x02\xc1\xff\xd7\x02\xef\x02\ +\xca\xff\xd7\x02\xef\x02\xce\xff\xd7\x02\xef\x02\xcf\xff\xec\x02\ +\xef\x02\xd4\xff\xd7\x02\xef\x02\xd9\xff\xd7\x02\xef\x02\xdb\xff\ +\xd7\x02\xef\x02\xdd\xff\xd7\x02\xef\x02\xe5\xff\xd7\x02\xef\x02\ +\xe7\xff\xec\x02\xef\x02\xf5\xff\xec\x02\xef\x02\xf7\xff\xd7\x02\ +\xef\x02\xf9\xff\xd7\x02\xef\x02\xfb\xff\xd7\x02\xef\x02\xfd\xff\ +\xd7\x02\xef\x03\x05\xff\xd7\x02\xef\x03\x07\xff\xd7\x02\xef\x03\ +\x0d\xff\xd7\x02\xef\x03\x0f\xff\xd7\x02\xef\x03\x11\xff\xd7\x02\ +\xef\x03\x12\xff\xec\x02\xef\x03\x17\xff\xec\x02\xef\x03\x1b\xff\ +\xd7\x02\xef\x03\x1c\xff\xec\x02\xf0\x00\x05\xff\xec\x02\xf0\x00\ +\x0a\xff\xec\x02\xf0\x01\xd0\xff\xd7\x02\xf0\x01\xdc\xff\xec\x02\ +\xf0\x01\xdd\xff\xec\x02\xf0\x01\xdf\xff\xd7\x02\xf0\x01\xe1\xff\ +\xec\x02\xf0\x01\xe4\xff\xec\x02\xf0\x01\xf6\xff\xec\x02\xf0\x02\ +\x07\xff\xec\x02\xf0\x02\x0b\xff\xec\x02\xf0\x02\xa0\xff\xd7\x02\ +\xf0\x02\xaa\xff\xec\x02\xf0\x02\xb6\xff\xec\x02\xf0\x02\xbc\xff\ +\xd7\x02\xf0\x02\xbe\xff\xec\x02\xf0\x02\xc0\xff\xec\x02\xf0\x02\ +\xc2\xff\xec\x02\xf0\x02\xcb\xff\xd7\x02\xf0\x02\xd5\xff\xec\x02\ +\xf0\x02\xe6\xff\xd7\x02\xf0\x02\xf8\xff\xec\x02\xf0\x02\xfa\xff\ +\xec\x02\xf0\x02\xfc\xff\xec\x02\xf0\x02\xfe\xff\xec\x02\xf0\x03\ +\x06\xff\xd7\x02\xf0\x03\x08\xff\xd7\x02\xf0\x03\x0e\xff\xec\x02\ +\xf0\x03\x10\xff\xec\x02\xf0\x03\x18\xff\xec\x02\xf1\x00\x0f\xff\ +\xae\x02\xf1\x00\x11\xff\xae\x02\xf1\x01\x9d\xff\xec\x02\xf1\x01\ +\xa4\xff\xd7\x02\xf1\x01\xa6\xff\xec\x02\xf1\x01\xa8\xff\xd7\x02\ +\xf1\x01\xaa\xff\xd7\x02\xf1\x01\xae\xff\xd7\x02\xf1\x01\xb0\xff\ +\xd7\x02\xf1\x01\xb1\xff\xec\x02\xf1\x01\xb5\xff\xd7\x02\xf1\x01\ +\xbc\xff\xc3\x02\xf1\x01\xbd\xff\xd7\x02\xf1\x01\xbf\xff\xd7\x02\ +\xf1\x01\xc1\xff\xd7\x02\xf1\x01\xc4\xff\xec\x02\xf1\x01\xc7\xff\ +\xec\x02\xf1\x01\xce\xff\xec\x02\xf1\x01\xd5\xff\xec\x02\xf1\x01\ +\xf2\xff\xec\x02\xf1\x02\x08\xff\xae\x02\xf1\x02\x0c\xff\xae\x02\ +\xf1\x02r\xff\xd7\x02\xf1\x02s\xff\xec\x02\xf1\x02z\xff\ +\xec\x02\xf1\x02|\xff\xd7\x02\xf1\x02\x80\xff\xec\x02\xf1\x02\ +\x82\xff\xec\x02\xf1\x02\x9f\xff\xd7\x02\xf1\x02\xa1\xff\xec\x02\ +\xf1\x02\xa9\xff\xec\x02\xf1\x02\xb5\xff\xc3\x02\xf1\x02\xb7\xff\ +\xec\x02\xf1\x02\xb9\xff\xec\x02\xf1\x02\xbb\xff\xd7\x02\xf1\x02\ +\xbd\xff\xec\x02\xf1\x02\xbf\xff\xd7\x02\xf1\x02\xc1\xff\xd7\x02\ +\xf1\x02\xca\xff\xd7\x02\xf1\x02\xce\xff\xd7\x02\xf1\x02\xcf\xff\ +\xec\x02\xf1\x02\xd4\xff\xd7\x02\xf1\x02\xd9\xff\xd7\x02\xf1\x02\ +\xdb\xff\xd7\x02\xf1\x02\xdd\xff\xd7\x02\xf1\x02\xe5\xff\xd7\x02\ +\xf1\x02\xe7\xff\xec\x02\xf1\x02\xf5\xff\xec\x02\xf1\x02\xf7\xff\ +\xd7\x02\xf1\x02\xf9\xff\xd7\x02\xf1\x02\xfb\xff\xd7\x02\xf1\x02\ +\xfd\xff\xd7\x02\xf1\x03\x05\xff\xd7\x02\xf1\x03\x07\xff\xd7\x02\ +\xf1\x03\x0d\xff\xd7\x02\xf1\x03\x0f\xff\xd7\x02\xf1\x03\x11\xff\ +\xd7\x02\xf1\x03\x12\xff\xec\x02\xf1\x03\x17\xff\xec\x02\xf1\x03\ +\x1b\xff\xd7\x02\xf1\x03\x1c\xff\xec\x02\xf2\x00\x05\xff\xec\x02\ +\xf2\x00\x0a\xff\xec\x02\xf2\x01\xd0\xff\xd7\x02\xf2\x01\xdc\xff\ +\xec\x02\xf2\x01\xdd\xff\xec\x02\xf2\x01\xdf\xff\xd7\x02\xf2\x01\ +\xe1\xff\xec\x02\xf2\x01\xe4\xff\xec\x02\xf2\x01\xf6\xff\xec\x02\ +\xf2\x02\x07\xff\xec\x02\xf2\x02\x0b\xff\xec\x02\xf2\x02\xa0\xff\ +\xd7\x02\xf2\x02\xaa\xff\xec\x02\xf2\x02\xb6\xff\xec\x02\xf2\x02\ +\xbc\xff\xd7\x02\xf2\x02\xbe\xff\xec\x02\xf2\x02\xc0\xff\xec\x02\ +\xf2\x02\xc2\xff\xec\x02\xf2\x02\xcb\xff\xd7\x02\xf2\x02\xd5\xff\ +\xec\x02\xf2\x02\xe6\xff\xd7\x02\xf2\x02\xf8\xff\xec\x02\xf2\x02\ +\xfa\xff\xec\x02\xf2\x02\xfc\xff\xec\x02\xf2\x02\xfe\xff\xec\x02\ +\xf2\x03\x06\xff\xd7\x02\xf2\x03\x08\xff\xd7\x02\xf2\x03\x0e\xff\ +\xec\x02\xf2\x03\x10\xff\xec\x02\xf2\x03\x18\xff\xec\x02\xf3\x00\ +\x0f\xff\xae\x02\xf3\x00\x11\xff\xae\x02\xf3\x01\x9d\xff\xec\x02\ +\xf3\x01\xa4\xff\xd7\x02\xf3\x01\xa6\xff\xec\x02\xf3\x01\xa8\xff\ +\xd7\x02\xf3\x01\xaa\xff\xd7\x02\xf3\x01\xae\xff\xd7\x02\xf3\x01\ +\xb0\xff\xd7\x02\xf3\x01\xb1\xff\xec\x02\xf3\x01\xb5\xff\xd7\x02\ +\xf3\x01\xbc\xff\xc3\x02\xf3\x01\xbd\xff\xd7\x02\xf3\x01\xbf\xff\ +\xd7\x02\xf3\x01\xc1\xff\xd7\x02\xf3\x01\xc4\xff\xec\x02\xf3\x01\ +\xc7\xff\xec\x02\xf3\x01\xce\xff\xec\x02\xf3\x01\xd5\xff\xec\x02\ +\xf3\x01\xf2\xff\xec\x02\xf3\x02\x08\xff\xae\x02\xf3\x02\x0c\xff\ +\xae\x02\xf3\x02r\xff\xd7\x02\xf3\x02s\xff\xec\x02\xf3\x02\ +z\xff\xec\x02\xf3\x02|\xff\xd7\x02\xf3\x02\x80\xff\xec\x02\ +\xf3\x02\x82\xff\xec\x02\xf3\x02\x9f\xff\xd7\x02\xf3\x02\xa1\xff\ +\xec\x02\xf3\x02\xa9\xff\xec\x02\xf3\x02\xb5\xff\xc3\x02\xf3\x02\ +\xb7\xff\xec\x02\xf3\x02\xb9\xff\xec\x02\xf3\x02\xbb\xff\xd7\x02\ +\xf3\x02\xbd\xff\xec\x02\xf3\x02\xbf\xff\xd7\x02\xf3\x02\xc1\xff\ +\xd7\x02\xf3\x02\xca\xff\xd7\x02\xf3\x02\xce\xff\xd7\x02\xf3\x02\ +\xcf\xff\xec\x02\xf3\x02\xd4\xff\xd7\x02\xf3\x02\xd9\xff\xd7\x02\ +\xf3\x02\xdb\xff\xd7\x02\xf3\x02\xdd\xff\xd7\x02\xf3\x02\xe5\xff\ +\xd7\x02\xf3\x02\xe7\xff\xec\x02\xf3\x02\xf5\xff\xec\x02\xf3\x02\ +\xf7\xff\xd7\x02\xf3\x02\xf9\xff\xd7\x02\xf3\x02\xfb\xff\xd7\x02\ +\xf3\x02\xfd\xff\xd7\x02\xf3\x03\x05\xff\xd7\x02\xf3\x03\x07\xff\ +\xd7\x02\xf3\x03\x0d\xff\xd7\x02\xf3\x03\x0f\xff\xd7\x02\xf3\x03\ +\x11\xff\xd7\x02\xf3\x03\x12\xff\xec\x02\xf3\x03\x17\xff\xec\x02\ +\xf3\x03\x1b\xff\xd7\x02\xf3\x03\x1c\xff\xec\x02\xf4\x00\x05\xff\ +\xec\x02\xf4\x00\x0a\xff\xec\x02\xf4\x01\xd0\xff\xd7\x02\xf4\x01\ +\xdc\xff\xec\x02\xf4\x01\xdd\xff\xec\x02\xf4\x01\xdf\xff\xd7\x02\ +\xf4\x01\xe1\xff\xec\x02\xf4\x01\xe4\xff\xec\x02\xf4\x01\xf6\xff\ +\xec\x02\xf4\x02\x07\xff\xec\x02\xf4\x02\x0b\xff\xec\x02\xf4\x02\ +\xa0\xff\xd7\x02\xf4\x02\xaa\xff\xec\x02\xf4\x02\xb6\xff\xec\x02\ +\xf4\x02\xbc\xff\xd7\x02\xf4\x02\xbe\xff\xec\x02\xf4\x02\xc0\xff\ +\xec\x02\xf4\x02\xc2\xff\xec\x02\xf4\x02\xcb\xff\xd7\x02\xf4\x02\ +\xd5\xff\xec\x02\xf4\x02\xe6\xff\xd7\x02\xf4\x02\xf8\xff\xec\x02\ +\xf4\x02\xfa\xff\xec\x02\xf4\x02\xfc\xff\xec\x02\xf4\x02\xfe\xff\ +\xec\x02\xf4\x03\x06\xff\xd7\x02\xf4\x03\x08\xff\xd7\x02\xf4\x03\ +\x0e\xff\xec\x02\xf4\x03\x10\xff\xec\x02\xf4\x03\x18\xff\xec\x02\ +\xf5\x00\x0f\xff\xae\x02\xf5\x00\x11\xff\xae\x02\xf5\x01\x9d\xff\ +\xec\x02\xf5\x01\xa4\xff\xd7\x02\xf5\x01\xa6\xff\xec\x02\xf5\x01\ +\xa8\xff\xd7\x02\xf5\x01\xaa\xff\xd7\x02\xf5\x01\xae\xff\xd7\x02\ +\xf5\x01\xb0\xff\xd7\x02\xf5\x01\xb1\xff\xec\x02\xf5\x01\xb5\xff\ +\xd7\x02\xf5\x01\xbc\xff\xc3\x02\xf5\x01\xbd\xff\xd7\x02\xf5\x01\ +\xbf\xff\xd7\x02\xf5\x01\xc1\xff\xd7\x02\xf5\x01\xc4\xff\xec\x02\ +\xf5\x01\xc7\xff\xec\x02\xf5\x01\xce\xff\xec\x02\xf5\x01\xd5\xff\ +\xec\x02\xf5\x01\xf2\xff\xec\x02\xf5\x02\x08\xff\xae\x02\xf5\x02\ +\x0c\xff\xae\x02\xf5\x02r\xff\xd7\x02\xf5\x02s\xff\xec\x02\ +\xf5\x02z\xff\xec\x02\xf5\x02|\xff\xd7\x02\xf5\x02\x80\xff\ +\xec\x02\xf5\x02\x82\xff\xec\x02\xf5\x02\x9f\xff\xd7\x02\xf5\x02\ +\xa1\xff\xec\x02\xf5\x02\xa9\xff\xec\x02\xf5\x02\xb5\xff\xc3\x02\ +\xf5\x02\xb7\xff\xec\x02\xf5\x02\xb9\xff\xec\x02\xf5\x02\xbb\xff\ +\xd7\x02\xf5\x02\xbd\xff\xec\x02\xf5\x02\xbf\xff\xd7\x02\xf5\x02\ +\xc1\xff\xd7\x02\xf5\x02\xca\xff\xd7\x02\xf5\x02\xce\xff\xd7\x02\ +\xf5\x02\xcf\xff\xec\x02\xf5\x02\xd4\xff\xd7\x02\xf5\x02\xd9\xff\ +\xd7\x02\xf5\x02\xdb\xff\xd7\x02\xf5\x02\xdd\xff\xd7\x02\xf5\x02\ +\xe5\xff\xd7\x02\xf5\x02\xe7\xff\xec\x02\xf5\x02\xf5\xff\xec\x02\ +\xf5\x02\xf7\xff\xd7\x02\xf5\x02\xf9\xff\xd7\x02\xf5\x02\xfb\xff\ +\xd7\x02\xf5\x02\xfd\xff\xd7\x02\xf5\x03\x05\xff\xd7\x02\xf5\x03\ +\x07\xff\xd7\x02\xf5\x03\x0d\xff\xd7\x02\xf5\x03\x0f\xff\xd7\x02\ +\xf5\x03\x11\xff\xd7\x02\xf5\x03\x12\xff\xec\x02\xf5\x03\x17\xff\ +\xec\x02\xf5\x03\x1b\xff\xd7\x02\xf5\x03\x1c\xff\xec\x02\xf6\x00\ +\x05\xff\xec\x02\xf6\x00\x0a\xff\xec\x02\xf6\x01\xd0\xff\xd7\x02\ +\xf6\x01\xdc\xff\xec\x02\xf6\x01\xdd\xff\xec\x02\xf6\x01\xdf\xff\ +\xd7\x02\xf6\x01\xe1\xff\xec\x02\xf6\x01\xe4\xff\xec\x02\xf6\x01\ +\xf6\xff\xec\x02\xf6\x02\x07\xff\xec\x02\xf6\x02\x0b\xff\xec\x02\ +\xf6\x02\xa0\xff\xd7\x02\xf6\x02\xaa\xff\xec\x02\xf6\x02\xb6\xff\ +\xec\x02\xf6\x02\xbc\xff\xd7\x02\xf6\x02\xbe\xff\xec\x02\xf6\x02\ +\xc0\xff\xec\x02\xf6\x02\xc2\xff\xec\x02\xf6\x02\xcb\xff\xd7\x02\ +\xf6\x02\xd5\xff\xec\x02\xf6\x02\xe6\xff\xd7\x02\xf6\x02\xf8\xff\ +\xec\x02\xf6\x02\xfa\xff\xec\x02\xf6\x02\xfc\xff\xec\x02\xf6\x02\ +\xfe\xff\xec\x02\xf6\x03\x06\xff\xd7\x02\xf6\x03\x08\xff\xd7\x02\ +\xf6\x03\x0e\xff\xec\x02\xf6\x03\x10\xff\xec\x02\xf6\x03\x18\xff\ +\xec\x02\xf7\x00\x0f\xff\x85\x02\xf7\x00\x11\xff\x85\x02\xf7\x01\ +\x9f\xff\xec\x02\xf7\x01\xa4\xff\x9a\x02\xf7\x01\xaa\xffq\x02\ +\xf7\x01\xae\xff\x9a\x02\xf7\x01\xb5\xff\x9a\x02\xf7\x01\xb8\xff\ +\xec\x02\xf7\x01\xbb\xff\xec\x02\xf7\x01\xbe\xff\xc3\x02\xf7\x01\ +\xc9\xff\xec\x02\xf7\x01\xce\xff\xae\x02\xf7\x01\xcf\xff\xd7\x02\ +\xf7\x01\xd5\xff\xae\x02\xf7\x01\xd8\xff\xd7\x02\xf7\x01\xdb\xff\ +\xd7\x02\xf7\x01\xde\xff\xd7\x02\xf7\x01\xe1\xff\xd7\x02\xf7\x01\ +\xea\xff\xd7\x02\xf7\x01\xeb\x00f\x02\xf7\x01\xed\xff\xd7\x02\ +\xf7\x01\xee\xff\xec\x02\xf7\x01\xf2\xff\xae\x02\xf7\x01\xf4\x00\ +f\x02\xf7\x02\x08\xff\x85\x02\xf7\x02\x0c\xff\x85\x02\xf7\x02\ +j\xff\xd7\x02\xf7\x02l\xff\xec\x02\xf7\x02r\xffq\x02\ +\xf7\x02s\xff\xae\x02\xf7\x02~\xff\xec\x02\xf7\x02\x7f\xff\ +\xd7\x02\xf7\x02\x84\xff\xec\x02\xf7\x02\x85\xff\xd7\x02\xf7\x02\ +\x86\xff\xec\x02\xf7\x02\x87\xff\xd7\x02\xf7\x02\x88\xff\xec\x02\ +\xf7\x02\x89\xff\xd7\x02\xf7\x02\x8a\xff\xec\x02\xf7\x02\x8c\xff\ +\xec\x02\xf7\x02\x8d\xff\xd7\x02\xf7\x02\x98\x00f\x02\xf7\x02\ +\xa8\x00f\x02\xf7\x02\xb1\xff\xec\x02\xf7\x02\xb2\xff\xd7\x02\ +\xf7\x02\xb3\xff\xec\x02\xf7\x02\xb4\xff\xd7\x02\xf7\x02\xc0\xff\ +\xd7\x02\xf7\x02\xc2\xff\xd7\x02\xf7\x02\xc5\xff\xd7\x02\xf7\x02\ +\xc6\xff\xc3\x02\xf7\x02\xc7\xff\xd7\x02\xf7\x02\xc8\xff\xc3\x02\ +\xf7\x02\xce\xff\x9a\x02\xf7\x02\xcf\xff\xae\x02\xf7\x02\xd5\xff\ +\xd7\x02\xf7\x02\xd9\xffq\x02\xf7\x02\xdb\xffq\x02\xf7\x02\ +\xdd\xffq\x02\xf7\x02\xe0\xff\xd7\x02\xf7\x02\xef\xff\xec\x02\ +\xf7\x02\xf0\xff\xd7\x02\xf7\x02\xf1\xff\xec\x02\xf7\x02\xf2\xff\ +\xd7\x02\xf7\x02\xf3\xff\xec\x02\xf7\x02\xf4\xff\xd7\x02\xf7\x02\ +\xfe\xff\xd7\x02\xf7\x03\x09\xffq\x02\xf7\x03\x0a\xff\xd7\x02\ +\xf7\x03\x0b\xffq\x02\xf7\x03\x0c\xff\xd7\x02\xf7\x03\x11\xff\ +\x9a\x02\xf7\x03\x12\xff\xae\x02\xf7\x03\x15\xff\xec\x02\xf7\x03\ +\x16\xff\xd7\x02\xf7\x03\x1a\xff\xd7\x02\xf7\x03\x1b\xff\x9a\x02\ +\xf7\x03\x1c\xff\xae\x02\xf8\x00\x0f\xff\xae\x02\xf8\x00\x11\xff\ +\xae\x02\xf8\x01\xce\xff\xd7\x02\xf8\x01\xd5\xff\xd7\x02\xf8\x01\ +\xf2\xff\xd7\x02\xf8\x02\x08\xff\xae\x02\xf8\x02\x0c\xff\xae\x02\ +\xf8\x02s\xff\xd7\x02\xf8\x02\xcf\xff\xd7\x02\xf8\x03\x12\xff\ +\xd7\x02\xf8\x03\x1c\xff\xd7\x02\xf9\x00\x0f\xff\x85\x02\xf9\x00\ +\x11\xff\x85\x02\xf9\x01\x9f\xff\xec\x02\xf9\x01\xa4\xff\x9a\x02\ +\xf9\x01\xaa\xffq\x02\xf9\x01\xae\xff\x9a\x02\xf9\x01\xb5\xff\ +\x9a\x02\xf9\x01\xb8\xff\xec\x02\xf9\x01\xbb\xff\xec\x02\xf9\x01\ +\xbe\xff\xc3\x02\xf9\x01\xc9\xff\xec\x02\xf9\x01\xce\xff\xae\x02\ +\xf9\x01\xcf\xff\xd7\x02\xf9\x01\xd5\xff\xae\x02\xf9\x01\xd8\xff\ +\xd7\x02\xf9\x01\xdb\xff\xd7\x02\xf9\x01\xde\xff\xd7\x02\xf9\x01\ +\xe1\xff\xd7\x02\xf9\x01\xea\xff\xd7\x02\xf9\x01\xeb\x00f\x02\ +\xf9\x01\xed\xff\xd7\x02\xf9\x01\xee\xff\xec\x02\xf9\x01\xf2\xff\ +\xae\x02\xf9\x01\xf4\x00f\x02\xf9\x02\x08\xff\x85\x02\xf9\x02\ +\x0c\xff\x85\x02\xf9\x02j\xff\xd7\x02\xf9\x02l\xff\xec\x02\ +\xf9\x02r\xffq\x02\xf9\x02s\xff\xae\x02\xf9\x02~\xff\ +\xec\x02\xf9\x02\x7f\xff\xd7\x02\xf9\x02\x84\xff\xec\x02\xf9\x02\ +\x85\xff\xd7\x02\xf9\x02\x86\xff\xec\x02\xf9\x02\x87\xff\xd7\x02\ +\xf9\x02\x88\xff\xec\x02\xf9\x02\x89\xff\xd7\x02\xf9\x02\x8a\xff\ +\xec\x02\xf9\x02\x8c\xff\xec\x02\xf9\x02\x8d\xff\xd7\x02\xf9\x02\ +\x98\x00f\x02\xf9\x02\xa8\x00f\x02\xf9\x02\xb1\xff\xec\x02\ +\xf9\x02\xb2\xff\xd7\x02\xf9\x02\xb3\xff\xec\x02\xf9\x02\xb4\xff\ +\xd7\x02\xf9\x02\xc0\xff\xd7\x02\xf9\x02\xc2\xff\xd7\x02\xf9\x02\ +\xc5\xff\xd7\x02\xf9\x02\xc6\xff\xc3\x02\xf9\x02\xc7\xff\xd7\x02\ +\xf9\x02\xc8\xff\xc3\x02\xf9\x02\xce\xff\x9a\x02\xf9\x02\xcf\xff\ +\xae\x02\xf9\x02\xd5\xff\xd7\x02\xf9\x02\xd9\xffq\x02\xf9\x02\ +\xdb\xffq\x02\xf9\x02\xdd\xffq\x02\xf9\x02\xe0\xff\xd7\x02\ +\xf9\x02\xef\xff\xec\x02\xf9\x02\xf0\xff\xd7\x02\xf9\x02\xf1\xff\ +\xec\x02\xf9\x02\xf2\xff\xd7\x02\xf9\x02\xf3\xff\xec\x02\xf9\x02\ +\xf4\xff\xd7\x02\xf9\x02\xfe\xff\xd7\x02\xf9\x03\x09\xffq\x02\ +\xf9\x03\x0a\xff\xd7\x02\xf9\x03\x0b\xffq\x02\xf9\x03\x0c\xff\ +\xd7\x02\xf9\x03\x11\xff\x9a\x02\xf9\x03\x12\xff\xae\x02\xf9\x03\ +\x15\xff\xec\x02\xf9\x03\x16\xff\xd7\x02\xf9\x03\x1a\xff\xd7\x02\ +\xf9\x03\x1b\xff\x9a\x02\xf9\x03\x1c\xff\xae\x02\xfa\x00\x0f\xff\ +\xae\x02\xfa\x00\x11\xff\xae\x02\xfa\x01\xce\xff\xd7\x02\xfa\x01\ +\xd5\xff\xd7\x02\xfa\x01\xf2\xff\xd7\x02\xfa\x02\x08\xff\xae\x02\ +\xfa\x02\x0c\xff\xae\x02\xfa\x02s\xff\xd7\x02\xfa\x02\xcf\xff\ +\xd7\x02\xfa\x03\x12\xff\xd7\x02\xfa\x03\x1c\xff\xd7\x02\xfb\x00\ +\x0f\xff\x85\x02\xfb\x00\x11\xff\x85\x02\xfb\x01\x9f\xff\xec\x02\ +\xfb\x01\xa4\xff\x9a\x02\xfb\x01\xaa\xffq\x02\xfb\x01\xae\xff\ +\x9a\x02\xfb\x01\xb5\xff\x9a\x02\xfb\x01\xb8\xff\xec\x02\xfb\x01\ +\xbb\xff\xec\x02\xfb\x01\xbe\xff\xc3\x02\xfb\x01\xc9\xff\xec\x02\ +\xfb\x01\xce\xff\xae\x02\xfb\x01\xcf\xff\xd7\x02\xfb\x01\xd5\xff\ +\xae\x02\xfb\x01\xd8\xff\xd7\x02\xfb\x01\xdb\xff\xd7\x02\xfb\x01\ +\xde\xff\xd7\x02\xfb\x01\xe1\xff\xd7\x02\xfb\x01\xea\xff\xd7\x02\ +\xfb\x01\xeb\x00f\x02\xfb\x01\xed\xff\xd7\x02\xfb\x01\xee\xff\ +\xec\x02\xfb\x01\xf2\xff\xae\x02\xfb\x01\xf4\x00f\x02\xfb\x02\ +\x08\xff\x85\x02\xfb\x02\x0c\xff\x85\x02\xfb\x02j\xff\xd7\x02\ +\xfb\x02l\xff\xec\x02\xfb\x02r\xffq\x02\xfb\x02s\xff\ +\xae\x02\xfb\x02~\xff\xec\x02\xfb\x02\x7f\xff\xd7\x02\xfb\x02\ +\x84\xff\xec\x02\xfb\x02\x85\xff\xd7\x02\xfb\x02\x86\xff\xec\x02\ +\xfb\x02\x87\xff\xd7\x02\xfb\x02\x88\xff\xec\x02\xfb\x02\x89\xff\ +\xd7\x02\xfb\x02\x8a\xff\xec\x02\xfb\x02\x8c\xff\xec\x02\xfb\x02\ +\x8d\xff\xd7\x02\xfb\x02\x98\x00f\x02\xfb\x02\xa8\x00f\x02\ +\xfb\x02\xb1\xff\xec\x02\xfb\x02\xb2\xff\xd7\x02\xfb\x02\xb3\xff\ +\xec\x02\xfb\x02\xb4\xff\xd7\x02\xfb\x02\xc0\xff\xd7\x02\xfb\x02\ +\xc2\xff\xd7\x02\xfb\x02\xc5\xff\xd7\x02\xfb\x02\xc6\xff\xc3\x02\ +\xfb\x02\xc7\xff\xd7\x02\xfb\x02\xc8\xff\xc3\x02\xfb\x02\xce\xff\ +\x9a\x02\xfb\x02\xcf\xff\xae\x02\xfb\x02\xd5\xff\xd7\x02\xfb\x02\ +\xd9\xffq\x02\xfb\x02\xdb\xffq\x02\xfb\x02\xdd\xffq\x02\ +\xfb\x02\xe0\xff\xd7\x02\xfb\x02\xef\xff\xec\x02\xfb\x02\xf0\xff\ +\xd7\x02\xfb\x02\xf1\xff\xec\x02\xfb\x02\xf2\xff\xd7\x02\xfb\x02\ +\xf3\xff\xec\x02\xfb\x02\xf4\xff\xd7\x02\xfb\x02\xfe\xff\xd7\x02\ +\xfb\x03\x09\xffq\x02\xfb\x03\x0a\xff\xd7\x02\xfb\x03\x0b\xff\ +q\x02\xfb\x03\x0c\xff\xd7\x02\xfb\x03\x11\xff\x9a\x02\xfb\x03\ +\x12\xff\xae\x02\xfb\x03\x15\xff\xec\x02\xfb\x03\x16\xff\xd7\x02\ +\xfb\x03\x1a\xff\xd7\x02\xfb\x03\x1b\xff\x9a\x02\xfb\x03\x1c\xff\ +\xae\x02\xfc\x00\x0f\xff\xae\x02\xfc\x00\x11\xff\xae\x02\xfc\x01\ +\xce\xff\xd7\x02\xfc\x01\xd5\xff\xd7\x02\xfc\x01\xf2\xff\xd7\x02\ +\xfc\x02\x08\xff\xae\x02\xfc\x02\x0c\xff\xae\x02\xfc\x02s\xff\ +\xd7\x02\xfc\x02\xcf\xff\xd7\x02\xfc\x03\x12\xff\xd7\x02\xfc\x03\ +\x1c\xff\xd7\x02\xff\x00\x0f\xff\x85\x02\xff\x00\x10\xff\xae\x02\ +\xff\x00\x11\xff\x85\x02\xff\x01\x9f\xff\xd7\x02\xff\x01\xa4\xff\ +\x9a\x02\xff\x01\xaa\xffq\x02\xff\x01\xae\xff\x9a\x02\xff\x01\ +\xb5\xff\x9a\x02\xff\x01\xb8\xff\xd7\x02\xff\x01\xbb\xff\xd7\x02\ +\xff\x01\xbc\x00)\x02\xff\x01\xbe\xff\xae\x02\xff\x01\xcc\xff\ +\x9a\x02\xff\x01\xcd\xff\x9a\x02\xff\x01\xce\xff\x85\x02\xff\x01\ +\xcf\xffq\x02\xff\x01\xd0\xff\xd7\x02\xff\x01\xd1\xff\xd7\x02\ +\xff\x01\xd2\xff\x9a\x02\xff\x01\xd3\xff\x9a\x02\xff\x01\xd4\xff\ +\x9a\x02\xff\x01\xd5\xff\x85\x02\xff\x01\xd6\xff\x9a\x02\xff\x01\ +\xd7\xff\x9a\x02\xff\x01\xd8\xffq\x02\xff\x01\xd9\xff\x9a\x02\ +\xff\x01\xda\xff\x9a\x02\xff\x01\xdb\xffq\x02\xff\x01\xdc\xff\ +\xae\x02\xff\x01\xdd\xff\xae\x02\xff\x01\xde\xffq\x02\xff\x01\ +\xdf\xff\xd7\x02\xff\x01\xe0\xff\x9a\x02\xff\x01\xe1\xff\x9a\x02\ +\xff\x01\xe2\xff\x9a\x02\xff\x01\xe3\xff\x9a\x02\xff\x01\xe4\xff\ +\xae\x02\xff\x01\xe5\xff\x9a\x02\xff\x01\xe6\xff\x9a\x02\xff\x01\ +\xe7\xff\xd7\x02\xff\x01\xe8\xff\x9a\x02\xff\x01\xe9\xff\xc3\x02\ +\xff\x01\xea\xffq\x02\xff\x01\xec\xff\x9a\x02\xff\x01\xed\xff\ +q\x02\xff\x01\xee\xff\x85\x02\xff\x01\xf2\xff\x85\x02\xff\x01\ +\xf3\xff\x9a\x02\xff\x01\xf5\xff\x9a\x02\xff\x01\xf6\xff\xae\x02\ +\xff\x01\xf7\xff\x9a\x02\xff\x01\xf9\xff\x9a\x02\xff\x02\x02\xff\ +\xae\x02\xff\x02\x03\xff\xae\x02\xff\x02\x04\xff\xae\x02\xff\x02\ +\x08\xff\x85\x02\xff\x02\x0c\xff\x85\x02\xff\x02j\xffq\x02\ +\xff\x02k\xff\x9a\x02\xff\x02l\xff\xd7\x02\xff\x02m\xff\ +\xd7\x02\xff\x02q\xff\x9a\x02\xff\x02r\xffq\x02\xff\x02\ +s\xff\x85\x02\xff\x02u\xff\x9a\x02\xff\x02w\xff\x9a\x02\ +\xff\x02y\xff\x9a\x02\xff\x02}\xff\x9a\x02\xff\x02~\xff\ +\xd7\x02\xff\x02\x7f\xffq\x02\xff\x02\x81\xff\xd7\x02\xff\x02\ +\x83\xff\xd7\x02\xff\x02\x84\xff\xd7\x02\xff\x02\x85\xffq\x02\ +\xff\x02\x86\xff\xd7\x02\xff\x02\x87\xffq\x02\xff\x02\x88\xff\ +\xd7\x02\xff\x02\x89\xffq\x02\xff\x02\x8a\xff\xd7\x02\xff\x02\ +\x8b\xff\xd7\x02\xff\x02\x8c\xff\xd7\x02\xff\x02\x8d\xffq\x02\ +\xff\x02\x96\xff\x9a\x02\xff\x02\x9a\xff\x9a\x02\xff\x02\x9e\xff\ +\x9a\x02\xff\x02\xa0\xff\xd7\x02\xff\x02\xa2\xff\xd7\x02\xff\x02\ +\xa4\xff\x9a\x02\xff\x02\xa6\xff\x9a\x02\xff\x02\xaa\xff\xae\x02\ +\xff\x02\xac\xff\x9a\x02\xff\x02\xae\xff\x9a\x02\xff\x02\xb0\xff\ +\x9a\x02\xff\x02\xb1\xff\xd7\x02\xff\x02\xb2\xffq\x02\xff\x02\ +\xb3\xff\xd7\x02\xff\x02\xb4\xffq\x02\xff\x02\xb5\x00)\x02\ +\xff\x02\xb6\xff\xae\x02\xff\x02\xb8\xff\xae\x02\xff\x02\xba\xff\ +\xae\x02\xff\x02\xbc\xff\xd7\x02\xff\x02\xbe\xff\xae\x02\xff\x02\ +\xc0\xff\x9a\x02\xff\x02\xc2\xff\x9a\x02\xff\x02\xc4\xff\x9a\x02\ +\xff\x02\xc5\xff\x9a\x02\xff\x02\xc6\xffq\x02\xff\x02\xc7\xff\ +\x9a\x02\xff\x02\xc8\xffq\x02\xff\x02\xcb\xff\xd7\x02\xff\x02\ +\xcd\xff\x9a\x02\xff\x02\xce\xff\x9a\x02\xff\x02\xcf\xff\x85\x02\ +\xff\x02\xd1\xff\x9a\x02\xff\x02\xd3\xff\x9a\x02\xff\x02\xd5\xff\ +\x9a\x02\xff\x02\xd7\xff\x9a\x02\xff\x02\xd9\xffq\x02\xff\x02\ +\xdb\xffq\x02\xff\x02\xdd\xffq\x02\xff\x02\xe0\xffq\x02\ +\xff\x02\xe6\xff\xd7\x02\xff\x02\xe8\xff\xd7\x02\xff\x02\xea\xff\ +\xc3\x02\xff\x02\xec\xff\x9a\x02\xff\x02\xee\xff\x9a\x02\xff\x02\ +\xef\xff\xd7\x02\xff\x02\xf0\xffq\x02\xff\x02\xf1\xff\xd7\x02\ +\xff\x02\xf2\xffq\x02\xff\x02\xf3\xff\xd7\x02\xff\x02\xf4\xff\ +q\x02\xff\x02\xf6\xff\xd7\x02\xff\x02\xf8\xff\xae\x02\xff\x02\ +\xfa\xff\xae\x02\xff\x02\xfc\xff\xae\x02\xff\x02\xfe\xff\x9a\x02\ +\xff\x03\x00\xff\x9a\x02\xff\x03\x02\xff\x9a\x02\xff\x03\x06\xff\ +\xd7\x02\xff\x03\x08\xff\xd7\x02\xff\x03\x09\xffq\x02\xff\x03\ +\x0a\xffq\x02\xff\x03\x0b\xffq\x02\xff\x03\x0c\xffq\x02\ +\xff\x03\x0e\xff\x9a\x02\xff\x03\x10\xff\x9a\x02\xff\x03\x11\xff\ +\x9a\x02\xff\x03\x12\xff\x85\x02\xff\x03\x14\xff\x9a\x02\xff\x03\ +\x15\xff\xd7\x02\xff\x03\x16\xffq\x02\xff\x03\x18\xff\xae\x02\ +\xff\x03\x1a\xffq\x02\xff\x03\x1b\xff\x9a\x02\xff\x03\x1c\xff\ +\x85\x03\x00\x00\x0f\xff\x9a\x03\x00\x00\x10\xff\xd7\x03\x00\x00\ +\x11\xff\x9a\x03\x00\x01\xce\xff\xc3\x03\x00\x01\xcf\xff\xec\x03\ +\x00\x01\xd5\xff\xc3\x03\x00\x01\xd8\xff\xec\x03\x00\x01\xdb\xff\ +\xec\x03\x00\x01\xde\xff\xec\x03\x00\x01\xea\xff\xec\x03\x00\x01\ +\xed\xff\xec\x03\x00\x01\xf2\xff\xc3\x03\x00\x02\x02\xff\xd7\x03\ +\x00\x02\x03\xff\xd7\x03\x00\x02\x04\xff\xd7\x03\x00\x02\x08\xff\ +\x9a\x03\x00\x02\x0c\xff\x9a\x03\x00\x02j\xff\xec\x03\x00\x02\ +s\xff\xc3\x03\x00\x02\x7f\xff\xec\x03\x00\x02\x85\xff\xec\x03\ +\x00\x02\x87\xff\xec\x03\x00\x02\x89\xff\xec\x03\x00\x02\x8d\xff\ +\xec\x03\x00\x02\xb2\xff\xec\x03\x00\x02\xb4\xff\xec\x03\x00\x02\ +\xcf\xff\xc3\x03\x00\x02\xe0\xff\xec\x03\x00\x02\xf0\xff\xec\x03\ +\x00\x02\xf2\xff\xec\x03\x00\x02\xf4\xff\xec\x03\x00\x03\x0a\xff\ +\xec\x03\x00\x03\x0c\xff\xec\x03\x00\x03\x12\xff\xc3\x03\x00\x03\ +\x16\xff\xec\x03\x00\x03\x1a\xff\xec\x03\x00\x03\x1c\xff\xc3\x03\ +\x03\x00\x0f\xff\x9a\x03\x03\x00\x10\xff\xd7\x03\x03\x00\x11\xff\ +\x9a\x03\x03\x01\x9d\x00)\x03\x03\x01\x9f\xff\xd7\x03\x03\x01\ +\xa4\xff\xae\x03\x03\x01\xa6\x00)\x03\x03\x01\xaa\xff\x85\x03\ +\x03\x01\xae\xff\xae\x03\x03\x01\xb5\xff\xae\x03\x03\x01\xb8\xff\ +\xd7\x03\x03\x01\xbb\xff\xd7\x03\x03\x01\xbc\x00)\x03\x03\x01\ +\xbe\xff\xc3\x03\x03\x01\xc4\x00)\x03\x03\x01\xcc\xff\xc3\x03\ +\x03\x01\xcd\xff\xc3\x03\x03\x01\xce\xff\x9a\x03\x03\x01\xcf\xff\ +\xae\x03\x03\x01\xd0\xff\xd7\x03\x03\x01\xd1\xff\xd7\x03\x03\x01\ +\xd2\xff\xc3\x03\x03\x01\xd3\xff\xc3\x03\x03\x01\xd4\xff\xc3\x03\ +\x03\x01\xd5\xff\x9a\x03\x03\x01\xd6\xff\xc3\x03\x03\x01\xd7\xff\ +\xc3\x03\x03\x01\xd8\xff\xae\x03\x03\x01\xd9\xff\xc3\x03\x03\x01\ +\xda\xff\xc3\x03\x03\x01\xdb\xff\xae\x03\x03\x01\xde\xff\xae\x03\ +\x03\x01\xdf\xff\xd7\x03\x03\x01\xe0\xff\xc3\x03\x03\x01\xe1\xff\ +\x9a\x03\x03\x01\xe2\xff\xc3\x03\x03\x01\xe3\xff\xc3\x03\x03\x01\ +\xe5\xff\xc3\x03\x03\x01\xe6\xff\xc3\x03\x03\x01\xe7\xff\xd7\x03\ +\x03\x01\xe8\xff\xc3\x03\x03\x01\xea\xff\xae\x03\x03\x01\xeb\x00\ +)\x03\x03\x01\xec\xff\xc3\x03\x03\x01\xed\xff\xae\x03\x03\x01\ +\xee\xff\xc3\x03\x03\x01\xf2\xff\x9a\x03\x03\x01\xf3\xff\xc3\x03\ +\x03\x01\xf4\x00)\x03\x03\x01\xf5\xff\xc3\x03\x03\x01\xf7\xff\ +\xc3\x03\x03\x01\xf9\xff\xc3\x03\x03\x02\x02\xff\xd7\x03\x03\x02\ +\x03\xff\xd7\x03\x03\x02\x04\xff\xd7\x03\x03\x02\x08\xff\x9a\x03\ +\x03\x02\x0c\xff\x9a\x03\x03\x02j\xff\xae\x03\x03\x02k\xff\ +\xc3\x03\x03\x02l\xff\xd7\x03\x03\x02q\xff\xc3\x03\x03\x02\ +r\xff\x85\x03\x03\x02s\xff\x9a\x03\x03\x02u\xff\xc3\x03\ +\x03\x02w\xff\xd7\x03\x03\x02y\xff\xc3\x03\x03\x02}\xff\ +\xc3\x03\x03\x02~\xff\xd7\x03\x03\x02\x7f\xff\xae\x03\x03\x02\ +\x84\xff\xd7\x03\x03\x02\x85\xff\xae\x03\x03\x02\x86\xff\xd7\x03\ +\x03\x02\x87\xff\xae\x03\x03\x02\x88\xff\xd7\x03\x03\x02\x89\xff\ +\xae\x03\x03\x02\x8a\xff\xd7\x03\x03\x02\x8c\xff\xd7\x03\x03\x02\ +\x8d\xff\xae\x03\x03\x02\x96\xff\xc3\x03\x03\x02\x98\x00)\x03\ +\x03\x02\x9a\xff\xc3\x03\x03\x02\x9e\xff\xc3\x03\x03\x02\xa0\xff\ +\xd7\x03\x03\x02\xa2\xff\xd7\x03\x03\x02\xa4\xff\xc3\x03\x03\x02\ +\xa6\xff\xc3\x03\x03\x02\xa8\x00)\x03\x03\x02\xa9\x00)\x03\ +\x03\x02\xac\xff\xc3\x03\x03\x02\xae\xff\xc3\x03\x03\x02\xb0\xff\ +\xc3\x03\x03\x02\xb1\xff\xd7\x03\x03\x02\xb2\xff\xae\x03\x03\x02\ +\xb3\xff\xd7\x03\x03\x02\xb4\xff\xae\x03\x03\x02\xb5\x00)\x03\ +\x03\x02\xbc\xff\xd7\x03\x03\x02\xbd\x00)\x03\x03\x02\xc0\xff\ +\x9a\x03\x03\x02\xc2\xff\x9a\x03\x03\x02\xc4\xff\xc3\x03\x03\x02\ +\xc5\xff\xd7\x03\x03\x02\xc6\xff\xc3\x03\x03\x02\xc7\xff\xd7\x03\ +\x03\x02\xc8\xff\xc3\x03\x03\x02\xcb\xff\xd7\x03\x03\x02\xcd\xff\ +\xc3\x03\x03\x02\xce\xff\xae\x03\x03\x02\xcf\xff\x9a\x03\x03\x02\ +\xd1\xff\xc3\x03\x03\x02\xd3\xff\xc3\x03\x03\x02\xd5\xff\x9a\x03\ +\x03\x02\xd7\xff\xc3\x03\x03\x02\xd9\xff\x85\x03\x03\x02\xdb\xff\ +\x85\x03\x03\x02\xdd\xff\x85\x03\x03\x02\xe0\xff\xae\x03\x03\x02\ +\xe6\xff\xd7\x03\x03\x02\xe8\xff\xd7\x03\x03\x02\xec\xff\xc3\x03\ +\x03\x02\xee\xff\xc3\x03\x03\x02\xef\xff\xd7\x03\x03\x02\xf0\xff\ +\xae\x03\x03\x02\xf1\xff\xd7\x03\x03\x02\xf2\xff\xae\x03\x03\x02\ +\xf3\xff\xd7\x03\x03\x02\xf4\xff\xae\x03\x03\x02\xf6\xff\xd7\x03\ +\x03\x02\xfe\xff\x9a\x03\x03\x03\x00\xff\xc3\x03\x03\x03\x02\xff\ +\xc3\x03\x03\x03\x06\xff\xd7\x03\x03\x03\x08\xff\xd7\x03\x03\x03\ +\x09\xff\x9a\x03\x03\x03\x0a\xff\xae\x03\x03\x03\x0b\xff\x9a\x03\ +\x03\x03\x0c\xff\xae\x03\x03\x03\x0e\xff\xd7\x03\x03\x03\x10\xff\ +\xd7\x03\x03\x03\x11\xff\xae\x03\x03\x03\x12\xff\x9a\x03\x03\x03\ +\x14\xff\xc3\x03\x03\x03\x15\xff\xd7\x03\x03\x03\x16\xff\xae\x03\ +\x03\x03\x17\x00)\x03\x03\x03\x1a\xff\xae\x03\x03\x03\x1b\xff\ +\xae\x03\x03\x03\x1c\xff\x9a\x03\x04\x00\x0f\xff\xc3\x03\x04\x00\ +\x11\xff\xc3\x03\x04\x01\xce\xff\xc3\x03\x04\x01\xcf\xff\xd7\x03\ +\x04\x01\xd5\xff\xc3\x03\x04\x01\xd8\xff\xd7\x03\x04\x01\xdb\xff\ +\xd7\x03\x04\x01\xde\xff\xd7\x03\x04\x01\xea\xff\xd7\x03\x04\x01\ +\xed\xff\xd7\x03\x04\x01\xf2\xff\xc3\x03\x04\x02\x08\xff\xc3\x03\ +\x04\x02\x0c\xff\xc3\x03\x04\x02j\xff\xd7\x03\x04\x02s\xff\ +\xc3\x03\x04\x02\x7f\xff\xd7\x03\x04\x02\x85\xff\xd7\x03\x04\x02\ +\x87\xff\xd7\x03\x04\x02\x89\xff\xd7\x03\x04\x02\x8d\xff\xd7\x03\ +\x04\x02\xb2\xff\xd7\x03\x04\x02\xb4\xff\xd7\x03\x04\x02\xcf\xff\ +\xc3\x03\x04\x02\xe0\xff\xd7\x03\x04\x02\xf0\xff\xd7\x03\x04\x02\ +\xf2\xff\xd7\x03\x04\x02\xf4\xff\xd7\x03\x04\x03\x0a\xff\xd7\x03\ +\x04\x03\x0c\xff\xd7\x03\x04\x03\x12\xff\xc3\x03\x04\x03\x16\xff\ +\xd7\x03\x04\x03\x1a\xff\xd7\x03\x04\x03\x1c\xff\xc3\x03\x05\x01\ +\x9f\xff\xd7\x03\x05\x01\xa3\x00\xe1\x03\x05\x01\xb8\xff\xd7\x03\ +\x05\x01\xbb\xff\xd7\x03\x05\x01\xbe\xff\xc3\x03\x05\x01\xdc\xff\ +\xd7\x03\x05\x01\xe1\xff\xae\x03\x05\x01\xe4\xff\xd7\x03\x05\x02\ +l\xff\xd7\x03\x05\x02{\x00=\x03\x05\x02}\xff\xec\x03\ +\x05\x02~\xff\xd7\x03\x05\x02\x84\xff\xd7\x03\x05\x02\x86\xff\ +\xd7\x03\x05\x02\x88\xff\xd7\x03\x05\x02\x8a\xff\xd7\x03\x05\x02\ +\x8c\xff\xd7\x03\x05\x02\xaa\xff\xd7\x03\x05\x02\xb1\xff\xd7\x03\ +\x05\x02\xb3\xff\xd7\x03\x05\x02\xb6\xff\xd7\x03\x05\x02\xbe\xff\ +\xd7\x03\x05\x02\xc0\xff\xae\x03\x05\x02\xc2\xff\xae\x03\x05\x02\ +\xc5\xff\xc3\x03\x05\x02\xc6\xff\xd7\x03\x05\x02\xc7\xff\xc3\x03\ +\x05\x02\xc8\xff\xd7\x03\x05\x02\xd5\xff\xae\x03\x05\x02\xef\xff\ +\xd7\x03\x05\x02\xf1\xff\xd7\x03\x05\x02\xf3\xff\xd7\x03\x05\x02\ +\xfe\xff\xae\x03\x05\x03\x0e\xff\xd7\x03\x05\x03\x10\xff\xd7\x03\ +\x05\x03\x15\xff\xd7\x03\x05\x03\x18\xff\xd7\x03\x06\x01\xcf\xff\ +\xec\x03\x06\x01\xd8\xff\xec\x03\x06\x01\xdb\xff\xec\x03\x06\x01\ +\xde\xff\xec\x03\x06\x01\xe1\xff\xec\x03\x06\x01\xea\xff\xec\x03\ +\x06\x01\xed\xff\xec\x03\x06\x02j\xff\xec\x03\x06\x02\x7f\xff\ +\xec\x03\x06\x02\x85\xff\xec\x03\x06\x02\x87\xff\xec\x03\x06\x02\ +\x89\xff\xec\x03\x06\x02\x8d\xff\xec\x03\x06\x02\xb2\xff\xec\x03\ +\x06\x02\xb4\xff\xec\x03\x06\x02\xc0\xff\xec\x03\x06\x02\xc2\xff\ +\xec\x03\x06\x02\xd5\xff\xec\x03\x06\x02\xe0\xff\xec\x03\x06\x02\ +\xf0\xff\xec\x03\x06\x02\xf2\xff\xec\x03\x06\x02\xf4\xff\xec\x03\ +\x06\x02\xfe\xff\xec\x03\x06\x03\x0a\xff\xec\x03\x06\x03\x0c\xff\ +\xec\x03\x06\x03\x0e\xff\xd7\x03\x06\x03\x10\xff\xd7\x03\x06\x03\ +\x16\xff\xec\x03\x06\x03\x1a\xff\xec\x03\x07\x01\x9f\xff\xd7\x03\ +\x07\x01\xb8\xff\xd7\x03\x07\x01\xbb\xff\xd7\x03\x07\x01\xbe\xff\ +\xd7\x03\x07\x01\xc1\xff\xd7\x03\x07\x01\xe1\xff\xd7\x03\x07\x02\ +l\xff\xd7\x03\x07\x02|\xff\xd7\x03\x07\x02~\xff\xd7\x03\ +\x07\x02\x84\xff\xd7\x03\x07\x02\x86\xff\xd7\x03\x07\x02\x88\xff\ +\xd7\x03\x07\x02\x8a\xff\xd7\x03\x07\x02\x8c\xff\xd7\x03\x07\x02\ +\xb1\xff\xd7\x03\x07\x02\xb3\xff\xd7\x03\x07\x02\xbf\xff\xd7\x03\ +\x07\x02\xc0\xff\xd7\x03\x07\x02\xc1\xff\xd7\x03\x07\x02\xc2\xff\ +\xd7\x03\x07\x02\xc5\xff\x9a\x03\x07\x02\xc7\xff\x9a\x03\x07\x02\ +\xd4\xff\xd7\x03\x07\x02\xd5\xff\xd7\x03\x07\x02\xef\xff\xd7\x03\ +\x07\x02\xf1\xff\xd7\x03\x07\x02\xf3\xff\xd7\x03\x07\x02\xfd\xff\ +\xd7\x03\x07\x02\xfe\xff\xd7\x03\x07\x03\x09\xff\xd7\x03\x07\x03\ +\x0b\xff\xd7\x03\x07\x03\x0e\xff\xd7\x03\x07\x03\x10\xff\xd7\x03\ +\x07\x03\x15\xff\xd7\x03\x07\x03\x19\xff\xec\x03\x08\x01\xcf\xff\ +\xec\x03\x08\x01\xd8\xff\xec\x03\x08\x01\xdb\xff\xec\x03\x08\x01\ +\xde\xff\xec\x03\x08\x01\xe1\xff\xec\x03\x08\x01\xea\xff\xec\x03\ +\x08\x01\xed\xff\xec\x03\x08\x02j\xff\xec\x03\x08\x02\x7f\xff\ +\xec\x03\x08\x02\x85\xff\xec\x03\x08\x02\x87\xff\xec\x03\x08\x02\ +\x89\xff\xec\x03\x08\x02\x8d\xff\xec\x03\x08\x02\xb2\xff\xec\x03\ +\x08\x02\xb4\xff\xec\x03\x08\x02\xc0\xff\xec\x03\x08\x02\xc2\xff\ +\xec\x03\x08\x02\xd5\xff\xec\x03\x08\x02\xe0\xff\xec\x03\x08\x02\ +\xf0\xff\xec\x03\x08\x02\xf2\xff\xec\x03\x08\x02\xf4\xff\xec\x03\ +\x08\x02\xfe\xff\xec\x03\x08\x03\x0a\xff\xec\x03\x08\x03\x0c\xff\ +\xec\x03\x08\x03\x0e\xff\xd7\x03\x08\x03\x10\xff\xd7\x03\x08\x03\ +\x16\xff\xec\x03\x08\x03\x1a\xff\xec\x03\x0b\x00\x05\xff\x9a\x03\ +\x0b\x00\x0a\xff\x9a\x03\x0b\x01\x9d\xff\xae\x03\x0b\x01\xa6\xff\ +\xae\x03\x0b\x01\xa8\xff\xc3\x03\x0b\x01\xaa\xff\xc3\x03\x0b\x01\ +\xb0\xff\xc3\x03\x0b\x01\xbc\xffq\x03\x0b\x01\xbd\xff\xc3\x03\ +\x0b\x01\xbf\xff\xc3\x03\x0b\x01\xc1\xff\xc3\x03\x0b\x01\xc4\xff\ +\xae\x03\x0b\x01\xd0\xff\xd7\x03\x0b\x01\xdc\xff\xc3\x03\x0b\x01\ +\xdf\xff\xd7\x03\x0b\x01\xe1\xff\xd7\x03\x0b\x01\xe4\xff\xc3\x03\ +\x0b\x02\x07\xff\x9a\x03\x0b\x02\x0b\xff\x9a\x03\x0b\x02r\xff\ +\xc3\x03\x0b\x02v\xff\xd7\x03\x0b\x02|\xff\xc3\x03\x0b\x02\ +\x80\xff\xc3\x03\x0b\x02\x82\xff\xc3\x03\x0b\x02\x9f\xff\xc3\x03\ +\x0b\x02\xa0\xff\xd7\x03\x0b\x02\xa9\xff\xae\x03\x0b\x02\xaa\xff\ +\xc3\x03\x0b\x02\xb5\xffq\x03\x0b\x02\xb6\xff\xc3\x03\x0b\x02\ +\xb7\xff\xc3\x03\x0b\x02\xb9\xff\xc3\x03\x0b\x02\xbb\xff\xc3\x03\ +\x0b\x02\xbc\xff\xd7\x03\x0b\x02\xbd\xff\xae\x03\x0b\x02\xbe\xff\ +\xc3\x03\x0b\x02\xbf\xff\xc3\x03\x0b\x02\xc0\xff\xd7\x03\x0b\x02\ +\xc1\xff\xc3\x03\x0b\x02\xc2\xff\xd7\x03\x0b\x02\xca\xff\xc3\x03\ +\x0b\x02\xcb\xff\xd7\x03\x0b\x02\xd4\xff\xc3\x03\x0b\x02\xd5\xff\ +\xd7\x03\x0b\x02\xd9\xff\xc3\x03\x0b\x02\xdb\xff\xc3\x03\x0b\x02\ +\xdd\xff\xc3\x03\x0b\x02\xe5\xff\xc3\x03\x0b\x02\xe6\xff\xd7\x03\ +\x0b\x02\xf7\xff\xc3\x03\x0b\x02\xf9\xff\xc3\x03\x0b\x02\xfb\xff\ +\xc3\x03\x0b\x02\xfd\xff\xc3\x03\x0b\x02\xfe\xff\xd7\x03\x0b\x03\ +\x05\xff\xc3\x03\x0b\x03\x06\xff\xd7\x03\x0b\x03\x07\xff\xc3\x03\ +\x0b\x03\x08\xff\xd7\x03\x0b\x03\x0d\xff\xd7\x03\x0b\x03\x0e\xff\ +\xd7\x03\x0b\x03\x0f\xff\xd7\x03\x0b\x03\x10\xff\xd7\x03\x0b\x03\ +\x17\xff\xae\x03\x0b\x03\x18\xff\xc3\x03\x0c\x00\x05\xff\x9a\x03\ +\x0c\x00\x0a\xff\x9a\x03\x0c\x01\xd0\xff\xd7\x03\x0c\x01\xdc\xff\ +\xc3\x03\x0c\x01\xdd\xff\xd7\x03\x0c\x01\xdf\xff\xd7\x03\x0c\x01\ +\xe1\xff\xd7\x03\x0c\x01\xe4\xff\xc3\x03\x0c\x01\xf6\xff\xd7\x03\ +\x0c\x02\x07\xff\x9a\x03\x0c\x02\x0b\xff\x9a\x03\x0c\x02\xa0\xff\ +\xd7\x03\x0c\x02\xaa\xff\xc3\x03\x0c\x02\xb6\xff\xc3\x03\x0c\x02\ +\xbc\xff\xd7\x03\x0c\x02\xbe\xff\xc3\x03\x0c\x02\xc0\xff\xd7\x03\ +\x0c\x02\xc2\xff\xd7\x03\x0c\x02\xcb\xff\xd7\x03\x0c\x02\xd5\xff\ +\xd7\x03\x0c\x02\xe6\xff\xd7\x03\x0c\x02\xf8\xff\xd7\x03\x0c\x02\ +\xfa\xff\xd7\x03\x0c\x02\xfc\xff\xd7\x03\x0c\x02\xfe\xff\xd7\x03\ +\x0c\x03\x06\xff\xd7\x03\x0c\x03\x08\xff\xd7\x03\x0c\x03\x0e\xff\ +\x9a\x03\x0c\x03\x10\xff\x9a\x03\x0c\x03\x18\xff\xc3\x03\x0d\x00\ +\x05\xff\x9a\x03\x0d\x00\x0a\xff\x9a\x03\x0d\x01\x9d\xff\xae\x03\ +\x0d\x01\xa6\xff\xae\x03\x0d\x01\xa8\xff\xc3\x03\x0d\x01\xaa\xff\ +\xc3\x03\x0d\x01\xb0\xff\xc3\x03\x0d\x01\xbc\xffq\x03\x0d\x01\ +\xbd\xff\xc3\x03\x0d\x01\xbf\xff\xc3\x03\x0d\x01\xc1\xff\xc3\x03\ +\x0d\x01\xc4\xff\xae\x03\x0d\x01\xd0\xff\xd7\x03\x0d\x01\xdc\xff\ +\xc3\x03\x0d\x01\xdf\xff\xd7\x03\x0d\x01\xe1\xff\xd7\x03\x0d\x01\ +\xe4\xff\xc3\x03\x0d\x02\x07\xff\x9a\x03\x0d\x02\x0b\xff\x9a\x03\ +\x0d\x02r\xff\xc3\x03\x0d\x02v\xff\xd7\x03\x0d\x02|\xff\ +\xc3\x03\x0d\x02\x80\xff\xc3\x03\x0d\x02\x82\xff\xc3\x03\x0d\x02\ +\x9f\xff\xc3\x03\x0d\x02\xa0\xff\xd7\x03\x0d\x02\xa9\xff\xae\x03\ +\x0d\x02\xaa\xff\xc3\x03\x0d\x02\xb5\xffq\x03\x0d\x02\xb6\xff\ +\xc3\x03\x0d\x02\xb7\xff\xc3\x03\x0d\x02\xb9\xff\xc3\x03\x0d\x02\ +\xbb\xff\xc3\x03\x0d\x02\xbc\xff\xd7\x03\x0d\x02\xbd\xff\xae\x03\ +\x0d\x02\xbe\xff\xc3\x03\x0d\x02\xbf\xff\xc3\x03\x0d\x02\xc0\xff\ +\xd7\x03\x0d\x02\xc1\xff\xc3\x03\x0d\x02\xc2\xff\xd7\x03\x0d\x02\ +\xca\xff\xc3\x03\x0d\x02\xcb\xff\xd7\x03\x0d\x02\xd4\xff\xc3\x03\ +\x0d\x02\xd5\xff\xd7\x03\x0d\x02\xd9\xff\xc3\x03\x0d\x02\xdb\xff\ +\xc3\x03\x0d\x02\xdd\xff\xc3\x03\x0d\x02\xe5\xff\xc3\x03\x0d\x02\ +\xe6\xff\xd7\x03\x0d\x02\xf7\xff\xc3\x03\x0d\x02\xf9\xff\xc3\x03\ +\x0d\x02\xfb\xff\xc3\x03\x0d\x02\xfd\xff\xc3\x03\x0d\x02\xfe\xff\ +\xd7\x03\x0d\x03\x05\xff\xc3\x03\x0d\x03\x06\xff\xd7\x03\x0d\x03\ +\x07\xff\xc3\x03\x0d\x03\x08\xff\xd7\x03\x0d\x03\x0d\xff\xd7\x03\ +\x0d\x03\x0e\xff\xd7\x03\x0d\x03\x0f\xff\xd7\x03\x0d\x03\x10\xff\ +\xd7\x03\x0d\x03\x17\xff\xae\x03\x0d\x03\x18\xff\xc3\x03\x0e\x00\ +\x05\xff\x9a\x03\x0e\x00\x0a\xff\x9a\x03\x0e\x01\xd0\xff\xd7\x03\ +\x0e\x01\xdc\xff\xc3\x03\x0e\x01\xdd\xff\xd7\x03\x0e\x01\xdf\xff\ +\xd7\x03\x0e\x01\xe1\xff\xd7\x03\x0e\x01\xe4\xff\xc3\x03\x0e\x01\ +\xf6\xff\xd7\x03\x0e\x02\x07\xff\x9a\x03\x0e\x02\x0b\xff\x9a\x03\ +\x0e\x02\xa0\xff\xd7\x03\x0e\x02\xaa\xff\xc3\x03\x0e\x02\xb6\xff\ +\xc3\x03\x0e\x02\xbc\xff\xd7\x03\x0e\x02\xbe\xff\xc3\x03\x0e\x02\ +\xc0\xff\xd7\x03\x0e\x02\xc2\xff\xd7\x03\x0e\x02\xcb\xff\xd7\x03\ +\x0e\x02\xd5\xff\xd7\x03\x0e\x02\xe6\xff\xd7\x03\x0e\x02\xf8\xff\ +\xd7\x03\x0e\x02\xfa\xff\xd7\x03\x0e\x02\xfc\xff\xd7\x03\x0e\x02\ +\xfe\xff\xd7\x03\x0e\x03\x06\xff\xd7\x03\x0e\x03\x08\xff\xd7\x03\ +\x0e\x03\x0e\xff\x9a\x03\x0e\x03\x10\xff\x9a\x03\x0e\x03\x18\xff\ +\xc3\x03\x0f\x01\xa3\x00\xe1\x03\x0f\x02\xea\x00)\x03\x0f\x03\ +\x0e\xff\xd7\x03\x0f\x03\x10\xff\xd7\x03\x10\x00\x05\xff\xec\x03\ +\x10\x00\x0a\xff\xec\x03\x10\x02\x07\xff\xec\x03\x10\x02\x0b\xff\ +\xec\x03\x11\x00\x05\xff\x9a\x03\x11\x00\x0a\xff\x9a\x03\x11\x01\ +\x9d\xff\xae\x03\x11\x01\xa6\xff\xae\x03\x11\x01\xa8\xff\xc3\x03\ +\x11\x01\xaa\xff\xc3\x03\x11\x01\xb0\xff\xc3\x03\x11\x01\xbc\xff\ +q\x03\x11\x01\xbd\xff\xc3\x03\x11\x01\xbf\xff\xc3\x03\x11\x01\ +\xc1\xff\xc3\x03\x11\x01\xc4\xff\xae\x03\x11\x01\xd0\xff\xd7\x03\ +\x11\x01\xdc\xff\xc3\x03\x11\x01\xdf\xff\xd7\x03\x11\x01\xe1\xff\ +\xd7\x03\x11\x01\xe4\xff\xc3\x03\x11\x02\x07\xff\x9a\x03\x11\x02\ +\x0b\xff\x9a\x03\x11\x02r\xff\xc3\x03\x11\x02v\xff\xd7\x03\ +\x11\x02|\xff\xc3\x03\x11\x02\x80\xff\xc3\x03\x11\x02\x82\xff\ +\xc3\x03\x11\x02\x9f\xff\xc3\x03\x11\x02\xa0\xff\xd7\x03\x11\x02\ +\xa9\xff\xae\x03\x11\x02\xaa\xff\xc3\x03\x11\x02\xb5\xffq\x03\ +\x11\x02\xb6\xff\xc3\x03\x11\x02\xb7\xff\xc3\x03\x11\x02\xb9\xff\ +\xc3\x03\x11\x02\xbb\xff\xc3\x03\x11\x02\xbc\xff\xd7\x03\x11\x02\ +\xbd\xff\xae\x03\x11\x02\xbe\xff\xc3\x03\x11\x02\xbf\xff\xc3\x03\ +\x11\x02\xc0\xff\xd7\x03\x11\x02\xc1\xff\xc3\x03\x11\x02\xc2\xff\ +\xd7\x03\x11\x02\xca\xff\xc3\x03\x11\x02\xcb\xff\xd7\x03\x11\x02\ +\xd4\xff\xc3\x03\x11\x02\xd5\xff\xd7\x03\x11\x02\xd9\xff\xc3\x03\ +\x11\x02\xdb\xff\xc3\x03\x11\x02\xdd\xff\xc3\x03\x11\x02\xe5\xff\ +\xc3\x03\x11\x02\xe6\xff\xd7\x03\x11\x02\xf7\xff\xc3\x03\x11\x02\ +\xf9\xff\xc3\x03\x11\x02\xfb\xff\xc3\x03\x11\x02\xfd\xff\xc3\x03\ +\x11\x02\xfe\xff\xd7\x03\x11\x03\x05\xff\xc3\x03\x11\x03\x06\xff\ +\xd7\x03\x11\x03\x07\xff\xc3\x03\x11\x03\x08\xff\xd7\x03\x11\x03\ +\x0d\xff\xd7\x03\x11\x03\x0e\xff\xd7\x03\x11\x03\x0f\xff\xd7\x03\ +\x11\x03\x10\xff\xd7\x03\x11\x03\x17\xff\xae\x03\x11\x03\x18\xff\ +\xc3\x03\x12\x00\x05\xff\x9a\x03\x12\x00\x0a\xff\x9a\x03\x12\x01\ +\xd0\xff\xd7\x03\x12\x01\xdc\xff\xc3\x03\x12\x01\xdd\xff\xd7\x03\ +\x12\x01\xdf\xff\xd7\x03\x12\x01\xe1\xff\xd7\x03\x12\x01\xe4\xff\ +\xc3\x03\x12\x01\xf6\xff\xd7\x03\x12\x02\x07\xff\x9a\x03\x12\x02\ +\x0b\xff\x9a\x03\x12\x02\xa0\xff\xd7\x03\x12\x02\xaa\xff\xc3\x03\ +\x12\x02\xb6\xff\xc3\x03\x12\x02\xbc\xff\xd7\x03\x12\x02\xbe\xff\ +\xc3\x03\x12\x02\xc0\xff\xd7\x03\x12\x02\xc2\xff\xd7\x03\x12\x02\ +\xcb\xff\xd7\x03\x12\x02\xd5\xff\xd7\x03\x12\x02\xe6\xff\xd7\x03\ +\x12\x02\xf8\xff\xd7\x03\x12\x02\xfa\xff\xd7\x03\x12\x02\xfc\xff\ +\xd7\x03\x12\x02\xfe\xff\xd7\x03\x12\x03\x06\xff\xd7\x03\x12\x03\ +\x08\xff\xd7\x03\x12\x03\x0e\xff\x9a\x03\x12\x03\x10\xff\x9a\x03\ +\x12\x03\x18\xff\xc3\x03\x13\x00\x05\xff\x9a\x03\x13\x00\x0a\xff\ +\x9a\x03\x13\x01\x9d\xff\xae\x03\x13\x01\xa6\xff\xae\x03\x13\x01\ +\xa8\xff\xc3\x03\x13\x01\xaa\xff\xc3\x03\x13\x01\xb0\xff\xc3\x03\ +\x13\x01\xbc\xffq\x03\x13\x01\xbd\xff\xc3\x03\x13\x01\xbf\xff\ +\xc3\x03\x13\x01\xc1\xff\xc3\x03\x13\x01\xc4\xff\xae\x03\x13\x01\ +\xd0\xff\xd7\x03\x13\x01\xdc\xff\xc3\x03\x13\x01\xdf\xff\xd7\x03\ +\x13\x01\xe1\xff\xd7\x03\x13\x01\xe4\xff\xc3\x03\x13\x02\x07\xff\ +\x9a\x03\x13\x02\x0b\xff\x9a\x03\x13\x02r\xff\xc3\x03\x13\x02\ +v\xff\xd7\x03\x13\x02|\xff\xc3\x03\x13\x02\x80\xff\xc3\x03\ +\x13\x02\x82\xff\xc3\x03\x13\x02\x9f\xff\xc3\x03\x13\x02\xa0\xff\ +\xd7\x03\x13\x02\xa9\xff\xae\x03\x13\x02\xaa\xff\xc3\x03\x13\x02\ +\xb5\xffq\x03\x13\x02\xb6\xff\xc3\x03\x13\x02\xb7\xff\xc3\x03\ +\x13\x02\xb9\xff\xc3\x03\x13\x02\xbb\xff\xc3\x03\x13\x02\xbc\xff\ +\xd7\x03\x13\x02\xbd\xff\xae\x03\x13\x02\xbe\xff\xc3\x03\x13\x02\ +\xbf\xff\xc3\x03\x13\x02\xc0\xff\xd7\x03\x13\x02\xc1\xff\xc3\x03\ +\x13\x02\xc2\xff\xd7\x03\x13\x02\xca\xff\xc3\x03\x13\x02\xcb\xff\ +\xd7\x03\x13\x02\xd4\xff\xc3\x03\x13\x02\xd5\xff\xd7\x03\x13\x02\ +\xd9\xff\xc3\x03\x13\x02\xdb\xff\xc3\x03\x13\x02\xdd\xff\xc3\x03\ +\x13\x02\xe5\xff\xc3\x03\x13\x02\xe6\xff\xd7\x03\x13\x02\xf7\xff\ +\xc3\x03\x13\x02\xf9\xff\xc3\x03\x13\x02\xfb\xff\xc3\x03\x13\x02\ +\xfd\xff\xc3\x03\x13\x02\xfe\xff\xd7\x03\x13\x03\x05\xff\xc3\x03\ +\x13\x03\x06\xff\xd7\x03\x13\x03\x07\xff\xc3\x03\x13\x03\x08\xff\ +\xd7\x03\x13\x03\x0d\xff\xd7\x03\x13\x03\x0e\xff\xd7\x03\x13\x03\ +\x0f\xff\xd7\x03\x13\x03\x10\xff\xd7\x03\x13\x03\x17\xff\xae\x03\ +\x13\x03\x18\xff\xc3\x03\x14\x00\x05\xff\x9a\x03\x14\x00\x0a\xff\ +\x9a\x03\x14\x01\xd0\xff\xd7\x03\x14\x01\xdc\xff\xc3\x03\x14\x01\ +\xdd\xff\xd7\x03\x14\x01\xdf\xff\xd7\x03\x14\x01\xe1\xff\xd7\x03\ +\x14\x01\xe4\xff\xc3\x03\x14\x01\xf6\xff\xd7\x03\x14\x02\x07\xff\ +\x9a\x03\x14\x02\x0b\xff\x9a\x03\x14\x02\xa0\xff\xd7\x03\x14\x02\ +\xaa\xff\xc3\x03\x14\x02\xb6\xff\xc3\x03\x14\x02\xbc\xff\xd7\x03\ +\x14\x02\xbe\xff\xc3\x03\x14\x02\xc0\xff\xd7\x03\x14\x02\xc2\xff\ +\xd7\x03\x14\x02\xcb\xff\xd7\x03\x14\x02\xd5\xff\xd7\x03\x14\x02\ +\xe6\xff\xd7\x03\x14\x02\xf8\xff\xd7\x03\x14\x02\xfa\xff\xd7\x03\ +\x14\x02\xfc\xff\xd7\x03\x14\x02\xfe\xff\xd7\x03\x14\x03\x06\xff\ +\xd7\x03\x14\x03\x08\xff\xd7\x03\x14\x03\x0e\xff\x9a\x03\x14\x03\ +\x10\xff\x9a\x03\x14\x03\x18\xff\xc3\x03\x15\x00\x0f\xff\xae\x03\ +\x15\x00\x11\xff\xae\x03\x15\x01\xaa\xff\xec\x03\x15\x01\xb0\xff\ +\xd7\x03\x15\x01\xbc\xff\xd7\x03\x15\x01\xbf\xff\xd7\x03\x15\x02\ +\x08\xff\xae\x03\x15\x02\x0c\xff\xae\x03\x15\x02r\xff\xec\x03\ +\x15\x02\x80\xff\xec\x03\x15\x02\x82\xff\xec\x03\x15\x02\x9f\xff\ +\xd7\x03\x15\x02\xb5\xff\xd7\x03\x15\x02\xb7\xff\xec\x03\x15\x02\ +\xb9\xff\xec\x03\x15\x02\xbb\xff\xd7\x03\x15\x02\xca\xff\xd7\x03\ +\x15\x02\xd9\xff\xec\x03\x15\x02\xdb\xff\xec\x03\x15\x02\xdd\xff\ +\xec\x03\x15\x02\xe5\xff\xd7\x03\x15\x03\x05\xff\xd7\x03\x15\x03\ +\x07\xff\xd7\x03\x16\x00\x05\xff\xd7\x03\x16\x00\x0a\xff\xd7\x03\ +\x16\x01\xd0\xff\xec\x03\x16\x01\xdd\xff\xec\x03\x16\x01\xdf\xff\ +\xec\x03\x16\x01\xf6\xff\xec\x03\x16\x02\x07\xff\xd7\x03\x16\x02\ +\x0b\xff\xd7\x03\x16\x02\xa0\xff\xec\x03\x16\x02\xbc\xff\xec\x03\ +\x16\x02\xcb\xff\xec\x03\x16\x02\xe6\xff\xec\x03\x16\x02\xf8\xff\ +\xec\x03\x16\x02\xfa\xff\xec\x03\x16\x02\xfc\xff\xec\x03\x16\x03\ +\x06\xff\xec\x03\x16\x03\x08\xff\xec\x03\x16\x03\x0e\xff\xd7\x03\ +\x16\x03\x10\xff\xd7\x03\x17\x00\x05\xff\xae\x03\x17\x00\x0a\xff\ +\xae\x03\x17\x01\x9d\xff\xc3\x03\x17\x01\xa6\xff\xc3\x03\x17\x01\ +\xaa\xff\xd7\x03\x17\x01\xb0\xff\xd7\x03\x17\x01\xbc\xff\xc3\x03\ +\x17\x01\xbf\xff\xd7\x03\x17\x01\xc1\xff\xd7\x03\x17\x01\xc4\xff\ +\xc3\x03\x17\x01\xdc\xff\xd7\x03\x17\x01\xe4\xff\xd7\x03\x17\x02\ +\x07\xff\xae\x03\x17\x02\x0b\xff\xae\x03\x17\x02r\xff\xd7\x03\ +\x17\x02|\xff\xd7\x03\x17\x02\x80\xff\xd7\x03\x17\x02\x82\xff\ +\xd7\x03\x17\x02\x9f\xff\xd7\x03\x17\x02\xa9\xff\xc3\x03\x17\x02\ +\xaa\xff\xd7\x03\x17\x02\xb5\xff\xc3\x03\x17\x02\xb6\xff\xd7\x03\ +\x17\x02\xb7\xff\xd7\x03\x17\x02\xb9\xff\xd7\x03\x17\x02\xbb\xff\ +\xd7\x03\x17\x02\xbd\xff\xc3\x03\x17\x02\xbe\xff\xd7\x03\x17\x02\ +\xbf\xff\xd7\x03\x17\x02\xc1\xff\xd7\x03\x17\x02\xca\xff\xd7\x03\ +\x17\x02\xd4\xff\xd7\x03\x17\x02\xd9\xff\xd7\x03\x17\x02\xdb\xff\ +\xd7\x03\x17\x02\xdd\xff\xd7\x03\x17\x02\xe5\xff\xd7\x03\x17\x02\ +\xfd\xff\xd7\x03\x17\x03\x05\xff\xd7\x03\x17\x03\x07\xff\xd7\x03\ +\x17\x03\x0d\xff\xd7\x03\x17\x03\x0f\xff\xd7\x03\x17\x03\x17\xff\ +\xc3\x03\x17\x03\x18\xff\xd7\x03\x18\x00\x05\xff\x9a\x03\x18\x00\ +\x0a\xff\x9a\x03\x18\x01\xd0\xff\xd7\x03\x18\x01\xdc\xff\xc3\x03\ +\x18\x01\xdd\xff\xd7\x03\x18\x01\xdf\xff\xd7\x03\x18\x01\xe1\xff\ +\xd7\x03\x18\x01\xe4\xff\xc3\x03\x18\x01\xf6\xff\xd7\x03\x18\x02\ +\x07\xff\x9a\x03\x18\x02\x0b\xff\x9a\x03\x18\x02\xa0\xff\xd7\x03\ +\x18\x02\xaa\xff\xc3\x03\x18\x02\xb6\xff\xc3\x03\x18\x02\xbc\xff\ +\xd7\x03\x18\x02\xbe\xff\xc3\x03\x18\x02\xc0\xff\xd7\x03\x18\x02\ +\xc2\xff\xd7\x03\x18\x02\xcb\xff\xd7\x03\x18\x02\xd5\xff\xd7\x03\ +\x18\x02\xe6\xff\xd7\x03\x18\x02\xf8\xff\xd7\x03\x18\x02\xfa\xff\ +\xd7\x03\x18\x02\xfc\xff\xd7\x03\x18\x02\xfe\xff\xd7\x03\x18\x03\ +\x06\xff\xd7\x03\x18\x03\x08\xff\xd7\x03\x18\x03\x0e\xff\x9a\x03\ +\x18\x03\x10\xff\x9a\x03\x18\x03\x18\xff\xc3\x03\x19\x01\xe1\xff\ +\xd7\x03\x19\x02\xc0\xff\xd7\x03\x19\x02\xc2\xff\xd7\x03\x19\x02\ +\xd5\xff\xd7\x03\x19\x02\xfe\xff\xd7\x03\x1b\x01\xa3\x00\xe1\x03\ +\x1b\x02\xea\x00)\x03\x1b\x03\x0e\xff\xd7\x03\x1b\x03\x10\xff\ +\xd7\x03\x1c\x00\x05\xff\xec\x03\x1c\x00\x0a\xff\xec\x03\x1c\x02\ +\x07\xff\xec\x03\x1c\x02\x0b\xff\xec\x03\x1d\x00\x05\xffq\x03\ +\x1d\x00\x0a\xffq\x03\x1d\x00&\xff\xd7\x03\x1d\x00*\xff\ +\xd7\x03\x1d\x00-\x01\x0a\x03\x1d\x002\xff\xd7\x03\x1d\x00\ +4\xff\xd7\x03\x1d\x007\xffq\x03\x1d\x009\xff\xae\x03\ +\x1d\x00:\xff\xae\x03\x1d\x00<\xff\x85\x03\x1d\x00\x89\xff\ +\xd7\x03\x1d\x00\x94\xff\xd7\x03\x1d\x00\x95\xff\xd7\x03\x1d\x00\ +\x96\xff\xd7\x03\x1d\x00\x97\xff\xd7\x03\x1d\x00\x98\xff\xd7\x03\ +\x1d\x00\x9a\xff\xd7\x03\x1d\x00\x9f\xff\x85\x03\x1d\x00\xc8\xff\ +\xd7\x03\x1d\x00\xca\xff\xd7\x03\x1d\x00\xcc\xff\xd7\x03\x1d\x00\ +\xce\xff\xd7\x03\x1d\x00\xde\xff\xd7\x03\x1d\x00\xe0\xff\xd7\x03\ +\x1d\x00\xe2\xff\xd7\x03\x1d\x00\xe4\xff\xd7\x03\x1d\x01\x0e\xff\ +\xd7\x03\x1d\x01\x10\xff\xd7\x03\x1d\x01\x12\xff\xd7\x03\x1d\x01\ +\x14\xff\xd7\x03\x1d\x01$\xffq\x03\x1d\x01&\xffq\x03\ +\x1d\x016\xff\xae\x03\x1d\x018\xff\x85\x03\x1d\x01:\xff\ +\x85\x03\x1d\x01G\xff\xd7\x03\x1d\x01\xfa\xff\xae\x03\x1d\x01\ +\xfc\xff\xae\x03\x1d\x01\xfe\xff\xae\x03\x1d\x02\x00\xff\x85\x03\ +\x1d\x02\x07\xffq\x03\x1d\x02\x0b\xffq\x03\x1d\x02_\xff\ +\xd7\x03\x1d\x03I\xff\xd7\x03\x1d\x03K\xff\xd7\x03\x1d\x03\ +M\xff\xd7\x03\x1d\x03O\xff\xd7\x03\x1d\x03Q\xff\xd7\x03\ +\x1d\x03S\xff\xd7\x03\x1d\x03U\xff\xd7\x03\x1d\x03W\xff\ +\xd7\x03\x1d\x03Y\xff\xd7\x03\x1d\x03[\xff\xd7\x03\x1d\x03\ +]\xff\xd7\x03\x1d\x03_\xff\xd7\x03\x1d\x03o\xff\x85\x03\ +\x1d\x03q\xff\x85\x03\x1d\x03s\xff\x85\x03\x1d\x03\x8f\xff\ +q\x03\x1e\x00\x05\xff\xec\x03\x1e\x00\x0a\xff\xec\x03\x1e\x02\ +\x07\xff\xec\x03\x1e\x02\x0b\xff\xec\x03\x1f\x00\x05\xffq\x03\ +\x1f\x00\x0a\xffq\x03\x1f\x00&\xff\xd7\x03\x1f\x00*\xff\ +\xd7\x03\x1f\x00-\x01\x0a\x03\x1f\x002\xff\xd7\x03\x1f\x00\ +4\xff\xd7\x03\x1f\x007\xffq\x03\x1f\x009\xff\xae\x03\ +\x1f\x00:\xff\xae\x03\x1f\x00<\xff\x85\x03\x1f\x00\x89\xff\ +\xd7\x03\x1f\x00\x94\xff\xd7\x03\x1f\x00\x95\xff\xd7\x03\x1f\x00\ +\x96\xff\xd7\x03\x1f\x00\x97\xff\xd7\x03\x1f\x00\x98\xff\xd7\x03\ +\x1f\x00\x9a\xff\xd7\x03\x1f\x00\x9f\xff\x85\x03\x1f\x00\xc8\xff\ +\xd7\x03\x1f\x00\xca\xff\xd7\x03\x1f\x00\xcc\xff\xd7\x03\x1f\x00\ +\xce\xff\xd7\x03\x1f\x00\xde\xff\xd7\x03\x1f\x00\xe0\xff\xd7\x03\ +\x1f\x00\xe2\xff\xd7\x03\x1f\x00\xe4\xff\xd7\x03\x1f\x01\x0e\xff\ +\xd7\x03\x1f\x01\x10\xff\xd7\x03\x1f\x01\x12\xff\xd7\x03\x1f\x01\ +\x14\xff\xd7\x03\x1f\x01$\xffq\x03\x1f\x01&\xffq\x03\ +\x1f\x016\xff\xae\x03\x1f\x018\xff\x85\x03\x1f\x01:\xff\ +\x85\x03\x1f\x01G\xff\xd7\x03\x1f\x01\xfa\xff\xae\x03\x1f\x01\ +\xfc\xff\xae\x03\x1f\x01\xfe\xff\xae\x03\x1f\x02\x00\xff\x85\x03\ +\x1f\x02\x07\xffq\x03\x1f\x02\x0b\xffq\x03\x1f\x02_\xff\ +\xd7\x03\x1f\x03I\xff\xd7\x03\x1f\x03K\xff\xd7\x03\x1f\x03\ +M\xff\xd7\x03\x1f\x03O\xff\xd7\x03\x1f\x03Q\xff\xd7\x03\ +\x1f\x03S\xff\xd7\x03\x1f\x03U\xff\xd7\x03\x1f\x03W\xff\ +\xd7\x03\x1f\x03Y\xff\xd7\x03\x1f\x03[\xff\xd7\x03\x1f\x03\ +]\xff\xd7\x03\x1f\x03_\xff\xd7\x03\x1f\x03o\xff\x85\x03\ +\x1f\x03q\xff\x85\x03\x1f\x03s\xff\x85\x03\x1f\x03\x8f\xff\ +q\x03 \x00\x05\xff\xec\x03 \x00\x0a\xff\xec\x03 \x02\ +\x07\xff\xec\x03 \x02\x0b\xff\xec\x03!\x00\x05\xffq\x03\ +!\x00\x0a\xffq\x03!\x00&\xff\xd7\x03!\x00*\xff\ +\xd7\x03!\x00-\x01\x0a\x03!\x002\xff\xd7\x03!\x00\ +4\xff\xd7\x03!\x007\xffq\x03!\x009\xff\xae\x03\ +!\x00:\xff\xae\x03!\x00<\xff\x85\x03!\x00\x89\xff\ +\xd7\x03!\x00\x94\xff\xd7\x03!\x00\x95\xff\xd7\x03!\x00\ +\x96\xff\xd7\x03!\x00\x97\xff\xd7\x03!\x00\x98\xff\xd7\x03\ +!\x00\x9a\xff\xd7\x03!\x00\x9f\xff\x85\x03!\x00\xc8\xff\ +\xd7\x03!\x00\xca\xff\xd7\x03!\x00\xcc\xff\xd7\x03!\x00\ +\xce\xff\xd7\x03!\x00\xde\xff\xd7\x03!\x00\xe0\xff\xd7\x03\ +!\x00\xe2\xff\xd7\x03!\x00\xe4\xff\xd7\x03!\x01\x0e\xff\ +\xd7\x03!\x01\x10\xff\xd7\x03!\x01\x12\xff\xd7\x03!\x01\ +\x14\xff\xd7\x03!\x01$\xffq\x03!\x01&\xffq\x03\ +!\x016\xff\xae\x03!\x018\xff\x85\x03!\x01:\xff\ +\x85\x03!\x01G\xff\xd7\x03!\x01\xfa\xff\xae\x03!\x01\ +\xfc\xff\xae\x03!\x01\xfe\xff\xae\x03!\x02\x00\xff\x85\x03\ +!\x02\x07\xffq\x03!\x02\x0b\xffq\x03!\x02_\xff\ +\xd7\x03!\x03I\xff\xd7\x03!\x03K\xff\xd7\x03!\x03\ +M\xff\xd7\x03!\x03O\xff\xd7\x03!\x03Q\xff\xd7\x03\ +!\x03S\xff\xd7\x03!\x03U\xff\xd7\x03!\x03W\xff\ +\xd7\x03!\x03Y\xff\xd7\x03!\x03[\xff\xd7\x03!\x03\ +]\xff\xd7\x03!\x03_\xff\xd7\x03!\x03o\xff\x85\x03\ +!\x03q\xff\x85\x03!\x03s\xff\x85\x03!\x03\x8f\xff\ +q\x03\x22\x00\x05\xff\xec\x03\x22\x00\x0a\xff\xec\x03\x22\x02\ +\x07\xff\xec\x03\x22\x02\x0b\xff\xec\x03#\x00\x05\xffq\x03\ +#\x00\x0a\xffq\x03#\x00&\xff\xd7\x03#\x00*\xff\ +\xd7\x03#\x00-\x01\x0a\x03#\x002\xff\xd7\x03#\x00\ +4\xff\xd7\x03#\x007\xffq\x03#\x009\xff\xae\x03\ +#\x00:\xff\xae\x03#\x00<\xff\x85\x03#\x00\x89\xff\ +\xd7\x03#\x00\x94\xff\xd7\x03#\x00\x95\xff\xd7\x03#\x00\ +\x96\xff\xd7\x03#\x00\x97\xff\xd7\x03#\x00\x98\xff\xd7\x03\ +#\x00\x9a\xff\xd7\x03#\x00\x9f\xff\x85\x03#\x00\xc8\xff\ +\xd7\x03#\x00\xca\xff\xd7\x03#\x00\xcc\xff\xd7\x03#\x00\ +\xce\xff\xd7\x03#\x00\xde\xff\xd7\x03#\x00\xe0\xff\xd7\x03\ +#\x00\xe2\xff\xd7\x03#\x00\xe4\xff\xd7\x03#\x01\x0e\xff\ +\xd7\x03#\x01\x10\xff\xd7\x03#\x01\x12\xff\xd7\x03#\x01\ +\x14\xff\xd7\x03#\x01$\xffq\x03#\x01&\xffq\x03\ +#\x016\xff\xae\x03#\x018\xff\x85\x03#\x01:\xff\ +\x85\x03#\x01G\xff\xd7\x03#\x01\xfa\xff\xae\x03#\x01\ +\xfc\xff\xae\x03#\x01\xfe\xff\xae\x03#\x02\x00\xff\x85\x03\ +#\x02\x07\xffq\x03#\x02\x0b\xffq\x03#\x02_\xff\ +\xd7\x03#\x03I\xff\xd7\x03#\x03K\xff\xd7\x03#\x03\ +M\xff\xd7\x03#\x03O\xff\xd7\x03#\x03Q\xff\xd7\x03\ +#\x03S\xff\xd7\x03#\x03U\xff\xd7\x03#\x03W\xff\ +\xd7\x03#\x03Y\xff\xd7\x03#\x03[\xff\xd7\x03#\x03\ +]\xff\xd7\x03#\x03_\xff\xd7\x03#\x03o\xff\x85\x03\ +#\x03q\xff\x85\x03#\x03s\xff\x85\x03#\x03\x8f\xff\ +q\x03$\x00\x05\xff\xec\x03$\x00\x0a\xff\xec\x03$\x02\ +\x07\xff\xec\x03$\x02\x0b\xff\xec\x03%\x00\x05\xffq\x03\ +%\x00\x0a\xffq\x03%\x00&\xff\xd7\x03%\x00*\xff\ +\xd7\x03%\x00-\x01\x0a\x03%\x002\xff\xd7\x03%\x00\ +4\xff\xd7\x03%\x007\xffq\x03%\x009\xff\xae\x03\ +%\x00:\xff\xae\x03%\x00<\xff\x85\x03%\x00\x89\xff\ +\xd7\x03%\x00\x94\xff\xd7\x03%\x00\x95\xff\xd7\x03%\x00\ +\x96\xff\xd7\x03%\x00\x97\xff\xd7\x03%\x00\x98\xff\xd7\x03\ +%\x00\x9a\xff\xd7\x03%\x00\x9f\xff\x85\x03%\x00\xc8\xff\ +\xd7\x03%\x00\xca\xff\xd7\x03%\x00\xcc\xff\xd7\x03%\x00\ +\xce\xff\xd7\x03%\x00\xde\xff\xd7\x03%\x00\xe0\xff\xd7\x03\ +%\x00\xe2\xff\xd7\x03%\x00\xe4\xff\xd7\x03%\x01\x0e\xff\ +\xd7\x03%\x01\x10\xff\xd7\x03%\x01\x12\xff\xd7\x03%\x01\ +\x14\xff\xd7\x03%\x01$\xffq\x03%\x01&\xffq\x03\ +%\x016\xff\xae\x03%\x018\xff\x85\x03%\x01:\xff\ +\x85\x03%\x01G\xff\xd7\x03%\x01\xfa\xff\xae\x03%\x01\ +\xfc\xff\xae\x03%\x01\xfe\xff\xae\x03%\x02\x00\xff\x85\x03\ +%\x02\x07\xffq\x03%\x02\x0b\xffq\x03%\x02_\xff\ +\xd7\x03%\x03I\xff\xd7\x03%\x03K\xff\xd7\x03%\x03\ +M\xff\xd7\x03%\x03O\xff\xd7\x03%\x03Q\xff\xd7\x03\ +%\x03S\xff\xd7\x03%\x03U\xff\xd7\x03%\x03W\xff\ +\xd7\x03%\x03Y\xff\xd7\x03%\x03[\xff\xd7\x03%\x03\ +]\xff\xd7\x03%\x03_\xff\xd7\x03%\x03o\xff\x85\x03\ +%\x03q\xff\x85\x03%\x03s\xff\x85\x03%\x03\x8f\xff\ +q\x03&\x00\x05\xff\xec\x03&\x00\x0a\xff\xec\x03&\x02\ +\x07\xff\xec\x03&\x02\x0b\xff\xec\x03'\x00\x05\xffq\x03\ +'\x00\x0a\xffq\x03'\x00&\xff\xd7\x03'\x00*\xff\ +\xd7\x03'\x00-\x01\x0a\x03'\x002\xff\xd7\x03'\x00\ +4\xff\xd7\x03'\x007\xffq\x03'\x009\xff\xae\x03\ +'\x00:\xff\xae\x03'\x00<\xff\x85\x03'\x00\x89\xff\ +\xd7\x03'\x00\x94\xff\xd7\x03'\x00\x95\xff\xd7\x03'\x00\ +\x96\xff\xd7\x03'\x00\x97\xff\xd7\x03'\x00\x98\xff\xd7\x03\ +'\x00\x9a\xff\xd7\x03'\x00\x9f\xff\x85\x03'\x00\xc8\xff\ +\xd7\x03'\x00\xca\xff\xd7\x03'\x00\xcc\xff\xd7\x03'\x00\ +\xce\xff\xd7\x03'\x00\xde\xff\xd7\x03'\x00\xe0\xff\xd7\x03\ +'\x00\xe2\xff\xd7\x03'\x00\xe4\xff\xd7\x03'\x01\x0e\xff\ +\xd7\x03'\x01\x10\xff\xd7\x03'\x01\x12\xff\xd7\x03'\x01\ +\x14\xff\xd7\x03'\x01$\xffq\x03'\x01&\xffq\x03\ +'\x016\xff\xae\x03'\x018\xff\x85\x03'\x01:\xff\ +\x85\x03'\x01G\xff\xd7\x03'\x01\xfa\xff\xae\x03'\x01\ +\xfc\xff\xae\x03'\x01\xfe\xff\xae\x03'\x02\x00\xff\x85\x03\ +'\x02\x07\xffq\x03'\x02\x0b\xffq\x03'\x02_\xff\ +\xd7\x03'\x03I\xff\xd7\x03'\x03K\xff\xd7\x03'\x03\ +M\xff\xd7\x03'\x03O\xff\xd7\x03'\x03Q\xff\xd7\x03\ +'\x03S\xff\xd7\x03'\x03U\xff\xd7\x03'\x03W\xff\ +\xd7\x03'\x03Y\xff\xd7\x03'\x03[\xff\xd7\x03'\x03\ +]\xff\xd7\x03'\x03_\xff\xd7\x03'\x03o\xff\x85\x03\ +'\x03q\xff\x85\x03'\x03s\xff\x85\x03'\x03\x8f\xff\ +q\x03(\x00\x05\xff\xec\x03(\x00\x0a\xff\xec\x03(\x02\ +\x07\xff\xec\x03(\x02\x0b\xff\xec\x03)\x00\x05\xffq\x03\ +)\x00\x0a\xffq\x03)\x00&\xff\xd7\x03)\x00*\xff\ +\xd7\x03)\x00-\x01\x0a\x03)\x002\xff\xd7\x03)\x00\ +4\xff\xd7\x03)\x007\xffq\x03)\x009\xff\xae\x03\ +)\x00:\xff\xae\x03)\x00<\xff\x85\x03)\x00\x89\xff\ +\xd7\x03)\x00\x94\xff\xd7\x03)\x00\x95\xff\xd7\x03)\x00\ +\x96\xff\xd7\x03)\x00\x97\xff\xd7\x03)\x00\x98\xff\xd7\x03\ +)\x00\x9a\xff\xd7\x03)\x00\x9f\xff\x85\x03)\x00\xc8\xff\ +\xd7\x03)\x00\xca\xff\xd7\x03)\x00\xcc\xff\xd7\x03)\x00\ +\xce\xff\xd7\x03)\x00\xde\xff\xd7\x03)\x00\xe0\xff\xd7\x03\ +)\x00\xe2\xff\xd7\x03)\x00\xe4\xff\xd7\x03)\x01\x0e\xff\ +\xd7\x03)\x01\x10\xff\xd7\x03)\x01\x12\xff\xd7\x03)\x01\ +\x14\xff\xd7\x03)\x01$\xffq\x03)\x01&\xffq\x03\ +)\x016\xff\xae\x03)\x018\xff\x85\x03)\x01:\xff\ +\x85\x03)\x01G\xff\xd7\x03)\x01\xfa\xff\xae\x03)\x01\ +\xfc\xff\xae\x03)\x01\xfe\xff\xae\x03)\x02\x00\xff\x85\x03\ +)\x02\x07\xffq\x03)\x02\x0b\xffq\x03)\x02_\xff\ +\xd7\x03)\x03I\xff\xd7\x03)\x03K\xff\xd7\x03)\x03\ +M\xff\xd7\x03)\x03O\xff\xd7\x03)\x03Q\xff\xd7\x03\ +)\x03S\xff\xd7\x03)\x03U\xff\xd7\x03)\x03W\xff\ +\xd7\x03)\x03Y\xff\xd7\x03)\x03[\xff\xd7\x03)\x03\ +]\xff\xd7\x03)\x03_\xff\xd7\x03)\x03o\xff\x85\x03\ +)\x03q\xff\x85\x03)\x03s\xff\x85\x03)\x03\x8f\xff\ +q\x03*\x00\x05\xff\xec\x03*\x00\x0a\xff\xec\x03*\x02\ +\x07\xff\xec\x03*\x02\x0b\xff\xec\x03+\x00\x05\xffq\x03\ ++\x00\x0a\xffq\x03+\x00&\xff\xd7\x03+\x00*\xff\ +\xd7\x03+\x00-\x01\x0a\x03+\x002\xff\xd7\x03+\x00\ +4\xff\xd7\x03+\x007\xffq\x03+\x009\xff\xae\x03\ ++\x00:\xff\xae\x03+\x00<\xff\x85\x03+\x00\x89\xff\ +\xd7\x03+\x00\x94\xff\xd7\x03+\x00\x95\xff\xd7\x03+\x00\ +\x96\xff\xd7\x03+\x00\x97\xff\xd7\x03+\x00\x98\xff\xd7\x03\ ++\x00\x9a\xff\xd7\x03+\x00\x9f\xff\x85\x03+\x00\xc8\xff\ +\xd7\x03+\x00\xca\xff\xd7\x03+\x00\xcc\xff\xd7\x03+\x00\ +\xce\xff\xd7\x03+\x00\xde\xff\xd7\x03+\x00\xe0\xff\xd7\x03\ ++\x00\xe2\xff\xd7\x03+\x00\xe4\xff\xd7\x03+\x01\x0e\xff\ +\xd7\x03+\x01\x10\xff\xd7\x03+\x01\x12\xff\xd7\x03+\x01\ +\x14\xff\xd7\x03+\x01$\xffq\x03+\x01&\xffq\x03\ ++\x016\xff\xae\x03+\x018\xff\x85\x03+\x01:\xff\ +\x85\x03+\x01G\xff\xd7\x03+\x01\xfa\xff\xae\x03+\x01\ +\xfc\xff\xae\x03+\x01\xfe\xff\xae\x03+\x02\x00\xff\x85\x03\ ++\x02\x07\xffq\x03+\x02\x0b\xffq\x03+\x02_\xff\ +\xd7\x03+\x03I\xff\xd7\x03+\x03K\xff\xd7\x03+\x03\ +M\xff\xd7\x03+\x03O\xff\xd7\x03+\x03Q\xff\xd7\x03\ ++\x03S\xff\xd7\x03+\x03U\xff\xd7\x03+\x03W\xff\ +\xd7\x03+\x03Y\xff\xd7\x03+\x03[\xff\xd7\x03+\x03\ +]\xff\xd7\x03+\x03_\xff\xd7\x03+\x03o\xff\x85\x03\ ++\x03q\xff\x85\x03+\x03s\xff\x85\x03+\x03\x8f\xff\ +q\x03,\x00\x05\xff\xec\x03,\x00\x0a\xff\xec\x03,\x02\ +\x07\xff\xec\x03,\x02\x0b\xff\xec\x03-\x00\x05\xffq\x03\ +-\x00\x0a\xffq\x03-\x00&\xff\xd7\x03-\x00*\xff\ +\xd7\x03-\x00-\x01\x0a\x03-\x002\xff\xd7\x03-\x00\ +4\xff\xd7\x03-\x007\xffq\x03-\x009\xff\xae\x03\ +-\x00:\xff\xae\x03-\x00<\xff\x85\x03-\x00\x89\xff\ +\xd7\x03-\x00\x94\xff\xd7\x03-\x00\x95\xff\xd7\x03-\x00\ +\x96\xff\xd7\x03-\x00\x97\xff\xd7\x03-\x00\x98\xff\xd7\x03\ +-\x00\x9a\xff\xd7\x03-\x00\x9f\xff\x85\x03-\x00\xc8\xff\ +\xd7\x03-\x00\xca\xff\xd7\x03-\x00\xcc\xff\xd7\x03-\x00\ +\xce\xff\xd7\x03-\x00\xde\xff\xd7\x03-\x00\xe0\xff\xd7\x03\ +-\x00\xe2\xff\xd7\x03-\x00\xe4\xff\xd7\x03-\x01\x0e\xff\ +\xd7\x03-\x01\x10\xff\xd7\x03-\x01\x12\xff\xd7\x03-\x01\ +\x14\xff\xd7\x03-\x01$\xffq\x03-\x01&\xffq\x03\ +-\x016\xff\xae\x03-\x018\xff\x85\x03-\x01:\xff\ +\x85\x03-\x01G\xff\xd7\x03-\x01\xfa\xff\xae\x03-\x01\ +\xfc\xff\xae\x03-\x01\xfe\xff\xae\x03-\x02\x00\xff\x85\x03\ +-\x02\x07\xffq\x03-\x02\x0b\xffq\x03-\x02_\xff\ +\xd7\x03-\x03I\xff\xd7\x03-\x03K\xff\xd7\x03-\x03\ +M\xff\xd7\x03-\x03O\xff\xd7\x03-\x03Q\xff\xd7\x03\ +-\x03S\xff\xd7\x03-\x03U\xff\xd7\x03-\x03W\xff\ +\xd7\x03-\x03Y\xff\xd7\x03-\x03[\xff\xd7\x03-\x03\ +]\xff\xd7\x03-\x03_\xff\xd7\x03-\x03o\xff\x85\x03\ +-\x03q\xff\x85\x03-\x03s\xff\x85\x03-\x03\x8f\xff\ +q\x03.\x00\x05\xff\xec\x03.\x00\x0a\xff\xec\x03.\x02\ +\x07\xff\xec\x03.\x02\x0b\xff\xec\x03/\x00\x05\xffq\x03\ +/\x00\x0a\xffq\x03/\x00&\xff\xd7\x03/\x00*\xff\ +\xd7\x03/\x00-\x01\x0a\x03/\x002\xff\xd7\x03/\x00\ +4\xff\xd7\x03/\x007\xffq\x03/\x009\xff\xae\x03\ +/\x00:\xff\xae\x03/\x00<\xff\x85\x03/\x00\x89\xff\ +\xd7\x03/\x00\x94\xff\xd7\x03/\x00\x95\xff\xd7\x03/\x00\ +\x96\xff\xd7\x03/\x00\x97\xff\xd7\x03/\x00\x98\xff\xd7\x03\ +/\x00\x9a\xff\xd7\x03/\x00\x9f\xff\x85\x03/\x00\xc8\xff\ +\xd7\x03/\x00\xca\xff\xd7\x03/\x00\xcc\xff\xd7\x03/\x00\ +\xce\xff\xd7\x03/\x00\xde\xff\xd7\x03/\x00\xe0\xff\xd7\x03\ +/\x00\xe2\xff\xd7\x03/\x00\xe4\xff\xd7\x03/\x01\x0e\xff\ +\xd7\x03/\x01\x10\xff\xd7\x03/\x01\x12\xff\xd7\x03/\x01\ +\x14\xff\xd7\x03/\x01$\xffq\x03/\x01&\xffq\x03\ +/\x016\xff\xae\x03/\x018\xff\x85\x03/\x01:\xff\ +\x85\x03/\x01G\xff\xd7\x03/\x01\xfa\xff\xae\x03/\x01\ +\xfc\xff\xae\x03/\x01\xfe\xff\xae\x03/\x02\x00\xff\x85\x03\ +/\x02\x07\xffq\x03/\x02\x0b\xffq\x03/\x02_\xff\ +\xd7\x03/\x03I\xff\xd7\x03/\x03K\xff\xd7\x03/\x03\ +M\xff\xd7\x03/\x03O\xff\xd7\x03/\x03Q\xff\xd7\x03\ +/\x03S\xff\xd7\x03/\x03U\xff\xd7\x03/\x03W\xff\ +\xd7\x03/\x03Y\xff\xd7\x03/\x03[\xff\xd7\x03/\x03\ +]\xff\xd7\x03/\x03_\xff\xd7\x03/\x03o\xff\x85\x03\ +/\x03q\xff\x85\x03/\x03s\xff\x85\x03/\x03\x8f\xff\ +q\x030\x00\x05\xff\xec\x030\x00\x0a\xff\xec\x030\x02\ +\x07\xff\xec\x030\x02\x0b\xff\xec\x031\x00\x05\xffq\x03\ +1\x00\x0a\xffq\x031\x00&\xff\xd7\x031\x00*\xff\ +\xd7\x031\x00-\x01\x0a\x031\x002\xff\xd7\x031\x00\ +4\xff\xd7\x031\x007\xffq\x031\x009\xff\xae\x03\ +1\x00:\xff\xae\x031\x00<\xff\x85\x031\x00\x89\xff\ +\xd7\x031\x00\x94\xff\xd7\x031\x00\x95\xff\xd7\x031\x00\ +\x96\xff\xd7\x031\x00\x97\xff\xd7\x031\x00\x98\xff\xd7\x03\ +1\x00\x9a\xff\xd7\x031\x00\x9f\xff\x85\x031\x00\xc8\xff\ +\xd7\x031\x00\xca\xff\xd7\x031\x00\xcc\xff\xd7\x031\x00\ +\xce\xff\xd7\x031\x00\xde\xff\xd7\x031\x00\xe0\xff\xd7\x03\ +1\x00\xe2\xff\xd7\x031\x00\xe4\xff\xd7\x031\x01\x0e\xff\ +\xd7\x031\x01\x10\xff\xd7\x031\x01\x12\xff\xd7\x031\x01\ +\x14\xff\xd7\x031\x01$\xffq\x031\x01&\xffq\x03\ +1\x016\xff\xae\x031\x018\xff\x85\x031\x01:\xff\ +\x85\x031\x01G\xff\xd7\x031\x01\xfa\xff\xae\x031\x01\ +\xfc\xff\xae\x031\x01\xfe\xff\xae\x031\x02\x00\xff\x85\x03\ +1\x02\x07\xffq\x031\x02\x0b\xffq\x031\x02_\xff\ +\xd7\x031\x03I\xff\xd7\x031\x03K\xff\xd7\x031\x03\ +M\xff\xd7\x031\x03O\xff\xd7\x031\x03Q\xff\xd7\x03\ +1\x03S\xff\xd7\x031\x03U\xff\xd7\x031\x03W\xff\ +\xd7\x031\x03Y\xff\xd7\x031\x03[\xff\xd7\x031\x03\ +]\xff\xd7\x031\x03_\xff\xd7\x031\x03o\xff\x85\x03\ +1\x03q\xff\x85\x031\x03s\xff\x85\x031\x03\x8f\xff\ +q\x032\x00\x05\xff\xec\x032\x00\x0a\xff\xec\x032\x02\ +\x07\xff\xec\x032\x02\x0b\xff\xec\x033\x00\x05\xffq\x03\ +3\x00\x0a\xffq\x033\x00&\xff\xd7\x033\x00*\xff\ +\xd7\x033\x00-\x01\x0a\x033\x002\xff\xd7\x033\x00\ +4\xff\xd7\x033\x007\xffq\x033\x009\xff\xae\x03\ +3\x00:\xff\xae\x033\x00<\xff\x85\x033\x00\x89\xff\ +\xd7\x033\x00\x94\xff\xd7\x033\x00\x95\xff\xd7\x033\x00\ +\x96\xff\xd7\x033\x00\x97\xff\xd7\x033\x00\x98\xff\xd7\x03\ +3\x00\x9a\xff\xd7\x033\x00\x9f\xff\x85\x033\x00\xc8\xff\ +\xd7\x033\x00\xca\xff\xd7\x033\x00\xcc\xff\xd7\x033\x00\ +\xce\xff\xd7\x033\x00\xde\xff\xd7\x033\x00\xe0\xff\xd7\x03\ +3\x00\xe2\xff\xd7\x033\x00\xe4\xff\xd7\x033\x01\x0e\xff\ +\xd7\x033\x01\x10\xff\xd7\x033\x01\x12\xff\xd7\x033\x01\ +\x14\xff\xd7\x033\x01$\xffq\x033\x01&\xffq\x03\ +3\x016\xff\xae\x033\x018\xff\x85\x033\x01:\xff\ +\x85\x033\x01G\xff\xd7\x033\x01\xfa\xff\xae\x033\x01\ +\xfc\xff\xae\x033\x01\xfe\xff\xae\x033\x02\x00\xff\x85\x03\ +3\x02\x07\xffq\x033\x02\x0b\xffq\x033\x02_\xff\ +\xd7\x033\x03I\xff\xd7\x033\x03K\xff\xd7\x033\x03\ +M\xff\xd7\x033\x03O\xff\xd7\x033\x03Q\xff\xd7\x03\ +3\x03S\xff\xd7\x033\x03U\xff\xd7\x033\x03W\xff\ +\xd7\x033\x03Y\xff\xd7\x033\x03[\xff\xd7\x033\x03\ +]\xff\xd7\x033\x03_\xff\xd7\x033\x03o\xff\x85\x03\ +3\x03q\xff\x85\x033\x03s\xff\x85\x033\x03\x8f\xff\ +q\x034\x00\x05\xff\xec\x034\x00\x0a\xff\xec\x034\x02\ +\x07\xff\xec\x034\x02\x0b\xff\xec\x035\x00-\x00{\x03\ +6\x00\x05\xff\xec\x036\x00\x0a\xff\xec\x036\x00Y\xff\ +\xd7\x036\x00Z\xff\xd7\x036\x00[\xff\xd7\x036\x00\ +\x5c\xff\xd7\x036\x00]\xff\xec\x036\x00\xbf\xff\xd7\x03\ +6\x017\xff\xd7\x036\x01<\xff\xec\x036\x01>\xff\ +\xec\x036\x01@\xff\xec\x036\x01\xfb\xff\xd7\x036\x01\ +\xfd\xff\xd7\x036\x02\x07\xff\xec\x036\x02\x0b\xff\xec\x03\ +6\x03p\xff\xd7\x037\x00-\x00{\x038\x00\x05\xff\ +\xec\x038\x00\x0a\xff\xec\x038\x00Y\xff\xd7\x038\x00\ +Z\xff\xd7\x038\x00[\xff\xd7\x038\x00\x5c\xff\xd7\x03\ +8\x00]\xff\xec\x038\x00\xbf\xff\xd7\x038\x017\xff\ +\xd7\x038\x01<\xff\xec\x038\x01>\xff\xec\x038\x01\ +@\xff\xec\x038\x01\xfb\xff\xd7\x038\x01\xfd\xff\xd7\x03\ +8\x02\x07\xff\xec\x038\x02\x0b\xff\xec\x038\x03p\xff\ +\xd7\x039\x00-\x00{\x03:\x00\x05\xff\xec\x03:\x00\ +\x0a\xff\xec\x03:\x00Y\xff\xd7\x03:\x00Z\xff\xd7\x03\ +:\x00[\xff\xd7\x03:\x00\x5c\xff\xd7\x03:\x00]\xff\ +\xec\x03:\x00\xbf\xff\xd7\x03:\x017\xff\xd7\x03:\x01\ +<\xff\xec\x03:\x01>\xff\xec\x03:\x01@\xff\xec\x03\ +:\x01\xfb\xff\xd7\x03:\x01\xfd\xff\xd7\x03:\x02\x07\xff\ +\xec\x03:\x02\x0b\xff\xec\x03:\x03p\xff\xd7\x03;\x00\ +-\x00{\x03<\x00\x05\xff\xec\x03<\x00\x0a\xff\xec\x03\ +<\x00Y\xff\xd7\x03<\x00Z\xff\xd7\x03<\x00[\xff\ +\xd7\x03<\x00\x5c\xff\xd7\x03<\x00]\xff\xec\x03<\x00\ +\xbf\xff\xd7\x03<\x017\xff\xd7\x03<\x01<\xff\xec\x03\ +<\x01>\xff\xec\x03<\x01@\xff\xec\x03<\x01\xfb\xff\ +\xd7\x03<\x01\xfd\xff\xd7\x03<\x02\x07\xff\xec\x03<\x02\ +\x0b\xff\xec\x03<\x03p\xff\xd7\x03=\x00-\x00{\x03\ +>\x00\x05\xff\xec\x03>\x00\x0a\xff\xec\x03>\x00Y\xff\ +\xd7\x03>\x00Z\xff\xd7\x03>\x00[\xff\xd7\x03>\x00\ +\x5c\xff\xd7\x03>\x00]\xff\xec\x03>\x00\xbf\xff\xd7\x03\ +>\x017\xff\xd7\x03>\x01<\xff\xec\x03>\x01>\xff\ +\xec\x03>\x01@\xff\xec\x03>\x01\xfb\xff\xd7\x03>\x01\ +\xfd\xff\xd7\x03>\x02\x07\xff\xec\x03>\x02\x0b\xff\xec\x03\ +>\x03p\xff\xd7\x03?\x00-\x00{\x03@\x00\x05\xff\ +\xec\x03@\x00\x0a\xff\xec\x03@\x00Y\xff\xd7\x03@\x00\ +Z\xff\xd7\x03@\x00[\xff\xd7\x03@\x00\x5c\xff\xd7\x03\ +@\x00]\xff\xec\x03@\x00\xbf\xff\xd7\x03@\x017\xff\ +\xd7\x03@\x01<\xff\xec\x03@\x01>\xff\xec\x03@\x01\ +@\xff\xec\x03@\x01\xfb\xff\xd7\x03@\x01\xfd\xff\xd7\x03\ +@\x02\x07\xff\xec\x03@\x02\x0b\xff\xec\x03@\x03p\xff\ +\xd7\x03A\x00-\x00{\x03B\x00\x05\xff\xec\x03B\x00\ +\x0a\xff\xec\x03B\x00Y\xff\xd7\x03B\x00Z\xff\xd7\x03\ +B\x00[\xff\xd7\x03B\x00\x5c\xff\xd7\x03B\x00]\xff\ +\xec\x03B\x00\xbf\xff\xd7\x03B\x017\xff\xd7\x03B\x01\ +<\xff\xec\x03B\x01>\xff\xec\x03B\x01@\xff\xec\x03\ +B\x01\xfb\xff\xd7\x03B\x01\xfd\xff\xd7\x03B\x02\x07\xff\ +\xec\x03B\x02\x0b\xff\xec\x03B\x03p\xff\xd7\x03C\x00\ +-\x00{\x03D\x00\x05\xff\xec\x03D\x00\x0a\xff\xec\x03\ +D\x00Y\xff\xd7\x03D\x00Z\xff\xd7\x03D\x00[\xff\ +\xd7\x03D\x00\x5c\xff\xd7\x03D\x00]\xff\xec\x03D\x00\ +\xbf\xff\xd7\x03D\x017\xff\xd7\x03D\x01<\xff\xec\x03\ +D\x01>\xff\xec\x03D\x01@\xff\xec\x03D\x01\xfb\xff\ +\xd7\x03D\x01\xfd\xff\xd7\x03D\x02\x07\xff\xec\x03D\x02\ +\x0b\xff\xec\x03D\x03p\xff\xd7\x03I\x00\x0f\xff\xae\x03\ +I\x00\x11\xff\xae\x03I\x00$\xff\xd7\x03I\x007\xff\ +\xc3\x03I\x009\xff\xec\x03I\x00:\xff\xec\x03I\x00\ +;\xff\xd7\x03I\x00<\xff\xec\x03I\x00=\xff\xec\x03\ +I\x00\x82\xff\xd7\x03I\x00\x83\xff\xd7\x03I\x00\x84\xff\ +\xd7\x03I\x00\x85\xff\xd7\x03I\x00\x86\xff\xd7\x03I\x00\ +\x87\xff\xd7\x03I\x00\x9f\xff\xec\x03I\x00\xc2\xff\xd7\x03\ +I\x00\xc4\xff\xd7\x03I\x00\xc6\xff\xd7\x03I\x01$\xff\ +\xc3\x03I\x01&\xff\xc3\x03I\x016\xff\xec\x03I\x01\ +8\xff\xec\x03I\x01:\xff\xec\x03I\x01;\xff\xec\x03\ +I\x01=\xff\xec\x03I\x01?\xff\xec\x03I\x01C\xff\ +\xd7\x03I\x01\xa0\xff\xec\x03I\x01\xfa\xff\xec\x03I\x01\ +\xfc\xff\xec\x03I\x01\xfe\xff\xec\x03I\x02\x00\xff\xec\x03\ +I\x02\x08\xff\xae\x03I\x02\x0c\xff\xae\x03I\x02X\xff\ +\xd7\x03I\x03\x1d\xff\xd7\x03I\x03\x1f\xff\xd7\x03I\x03\ +!\xff\xd7\x03I\x03#\xff\xd7\x03I\x03%\xff\xd7\x03\ +I\x03'\xff\xd7\x03I\x03)\xff\xd7\x03I\x03+\xff\ +\xd7\x03I\x03-\xff\xd7\x03I\x03/\xff\xd7\x03I\x03\ +1\xff\xd7\x03I\x033\xff\xd7\x03I\x03o\xff\xec\x03\ +I\x03q\xff\xec\x03I\x03s\xff\xec\x03I\x03\x8f\xff\ +\xc3\x03J\x00\x05\xff\xec\x03J\x00\x0a\xff\xec\x03J\x00\ +Y\xff\xd7\x03J\x00Z\xff\xd7\x03J\x00[\xff\xd7\x03\ +J\x00\x5c\xff\xd7\x03J\x00]\xff\xec\x03J\x00\xbf\xff\ +\xd7\x03J\x017\xff\xd7\x03J\x01<\xff\xec\x03J\x01\ +>\xff\xec\x03J\x01@\xff\xec\x03J\x01\xfb\xff\xd7\x03\ +J\x01\xfd\xff\xd7\x03J\x02\x07\xff\xec\x03J\x02\x0b\xff\ +\xec\x03J\x03p\xff\xd7\x03K\x00\x0f\xff\xae\x03K\x00\ +\x11\xff\xae\x03K\x00$\xff\xd7\x03K\x007\xff\xc3\x03\ +K\x009\xff\xec\x03K\x00:\xff\xec\x03K\x00;\xff\ +\xd7\x03K\x00<\xff\xec\x03K\x00=\xff\xec\x03K\x00\ +\x82\xff\xd7\x03K\x00\x83\xff\xd7\x03K\x00\x84\xff\xd7\x03\ +K\x00\x85\xff\xd7\x03K\x00\x86\xff\xd7\x03K\x00\x87\xff\ +\xd7\x03K\x00\x9f\xff\xec\x03K\x00\xc2\xff\xd7\x03K\x00\ +\xc4\xff\xd7\x03K\x00\xc6\xff\xd7\x03K\x01$\xff\xc3\x03\ +K\x01&\xff\xc3\x03K\x016\xff\xec\x03K\x018\xff\ +\xec\x03K\x01:\xff\xec\x03K\x01;\xff\xec\x03K\x01\ +=\xff\xec\x03K\x01?\xff\xec\x03K\x01C\xff\xd7\x03\ +K\x01\xa0\xff\xec\x03K\x01\xfa\xff\xec\x03K\x01\xfc\xff\ +\xec\x03K\x01\xfe\xff\xec\x03K\x02\x00\xff\xec\x03K\x02\ +\x08\xff\xae\x03K\x02\x0c\xff\xae\x03K\x02X\xff\xd7\x03\ +K\x03\x1d\xff\xd7\x03K\x03\x1f\xff\xd7\x03K\x03!\xff\ +\xd7\x03K\x03#\xff\xd7\x03K\x03%\xff\xd7\x03K\x03\ +'\xff\xd7\x03K\x03)\xff\xd7\x03K\x03+\xff\xd7\x03\ +K\x03-\xff\xd7\x03K\x03/\xff\xd7\x03K\x031\xff\ +\xd7\x03K\x033\xff\xd7\x03K\x03o\xff\xec\x03K\x03\ +q\xff\xec\x03K\x03s\xff\xec\x03K\x03\x8f\xff\xc3\x03\ +L\x00\x05\xff\xec\x03L\x00\x0a\xff\xec\x03L\x00Y\xff\ +\xd7\x03L\x00Z\xff\xd7\x03L\x00[\xff\xd7\x03L\x00\ +\x5c\xff\xd7\x03L\x00]\xff\xec\x03L\x00\xbf\xff\xd7\x03\ +L\x017\xff\xd7\x03L\x01<\xff\xec\x03L\x01>\xff\ +\xec\x03L\x01@\xff\xec\x03L\x01\xfb\xff\xd7\x03L\x01\ +\xfd\xff\xd7\x03L\x02\x07\xff\xec\x03L\x02\x0b\xff\xec\x03\ +L\x03p\xff\xd7\x03M\x00\x0f\xff\xae\x03M\x00\x11\xff\ +\xae\x03M\x00$\xff\xd7\x03M\x007\xff\xc3\x03M\x00\ +9\xff\xec\x03M\x00:\xff\xec\x03M\x00;\xff\xd7\x03\ +M\x00<\xff\xec\x03M\x00=\xff\xec\x03M\x00\x82\xff\ +\xd7\x03M\x00\x83\xff\xd7\x03M\x00\x84\xff\xd7\x03M\x00\ +\x85\xff\xd7\x03M\x00\x86\xff\xd7\x03M\x00\x87\xff\xd7\x03\ +M\x00\x9f\xff\xec\x03M\x00\xc2\xff\xd7\x03M\x00\xc4\xff\ +\xd7\x03M\x00\xc6\xff\xd7\x03M\x01$\xff\xc3\x03M\x01\ +&\xff\xc3\x03M\x016\xff\xec\x03M\x018\xff\xec\x03\ +M\x01:\xff\xec\x03M\x01;\xff\xec\x03M\x01=\xff\ +\xec\x03M\x01?\xff\xec\x03M\x01C\xff\xd7\x03M\x01\ +\xa0\xff\xec\x03M\x01\xfa\xff\xec\x03M\x01\xfc\xff\xec\x03\ +M\x01\xfe\xff\xec\x03M\x02\x00\xff\xec\x03M\x02\x08\xff\ +\xae\x03M\x02\x0c\xff\xae\x03M\x02X\xff\xd7\x03M\x03\ +\x1d\xff\xd7\x03M\x03\x1f\xff\xd7\x03M\x03!\xff\xd7\x03\ +M\x03#\xff\xd7\x03M\x03%\xff\xd7\x03M\x03'\xff\ +\xd7\x03M\x03)\xff\xd7\x03M\x03+\xff\xd7\x03M\x03\ +-\xff\xd7\x03M\x03/\xff\xd7\x03M\x031\xff\xd7\x03\ +M\x033\xff\xd7\x03M\x03o\xff\xec\x03M\x03q\xff\ +\xec\x03M\x03s\xff\xec\x03M\x03\x8f\xff\xc3\x03O\x00\ +\x0f\xff\xae\x03O\x00\x11\xff\xae\x03O\x00$\xff\xd7\x03\ +O\x007\xff\xc3\x03O\x009\xff\xec\x03O\x00:\xff\ +\xec\x03O\x00;\xff\xd7\x03O\x00<\xff\xec\x03O\x00\ +=\xff\xec\x03O\x00\x82\xff\xd7\x03O\x00\x83\xff\xd7\x03\ +O\x00\x84\xff\xd7\x03O\x00\x85\xff\xd7\x03O\x00\x86\xff\ +\xd7\x03O\x00\x87\xff\xd7\x03O\x00\x9f\xff\xec\x03O\x00\ +\xc2\xff\xd7\x03O\x00\xc4\xff\xd7\x03O\x00\xc6\xff\xd7\x03\ +O\x01$\xff\xc3\x03O\x01&\xff\xc3\x03O\x016\xff\ +\xec\x03O\x018\xff\xec\x03O\x01:\xff\xec\x03O\x01\ +;\xff\xec\x03O\x01=\xff\xec\x03O\x01?\xff\xec\x03\ +O\x01C\xff\xd7\x03O\x01\xa0\xff\xec\x03O\x01\xfa\xff\ +\xec\x03O\x01\xfc\xff\xec\x03O\x01\xfe\xff\xec\x03O\x02\ +\x00\xff\xec\x03O\x02\x08\xff\xae\x03O\x02\x0c\xff\xae\x03\ +O\x02X\xff\xd7\x03O\x03\x1d\xff\xd7\x03O\x03\x1f\xff\ +\xd7\x03O\x03!\xff\xd7\x03O\x03#\xff\xd7\x03O\x03\ +%\xff\xd7\x03O\x03'\xff\xd7\x03O\x03)\xff\xd7\x03\ +O\x03+\xff\xd7\x03O\x03-\xff\xd7\x03O\x03/\xff\ +\xd7\x03O\x031\xff\xd7\x03O\x033\xff\xd7\x03O\x03\ +o\xff\xec\x03O\x03q\xff\xec\x03O\x03s\xff\xec\x03\ +O\x03\x8f\xff\xc3\x03Q\x00\x0f\xff\xae\x03Q\x00\x11\xff\ +\xae\x03Q\x00$\xff\xd7\x03Q\x007\xff\xc3\x03Q\x00\ +9\xff\xec\x03Q\x00:\xff\xec\x03Q\x00;\xff\xd7\x03\ +Q\x00<\xff\xec\x03Q\x00=\xff\xec\x03Q\x00\x82\xff\ +\xd7\x03Q\x00\x83\xff\xd7\x03Q\x00\x84\xff\xd7\x03Q\x00\ +\x85\xff\xd7\x03Q\x00\x86\xff\xd7\x03Q\x00\x87\xff\xd7\x03\ +Q\x00\x9f\xff\xec\x03Q\x00\xc2\xff\xd7\x03Q\x00\xc4\xff\ +\xd7\x03Q\x00\xc6\xff\xd7\x03Q\x01$\xff\xc3\x03Q\x01\ +&\xff\xc3\x03Q\x016\xff\xec\x03Q\x018\xff\xec\x03\ +Q\x01:\xff\xec\x03Q\x01;\xff\xec\x03Q\x01=\xff\ +\xec\x03Q\x01?\xff\xec\x03Q\x01C\xff\xd7\x03Q\x01\ +\xa0\xff\xec\x03Q\x01\xfa\xff\xec\x03Q\x01\xfc\xff\xec\x03\ +Q\x01\xfe\xff\xec\x03Q\x02\x00\xff\xec\x03Q\x02\x08\xff\ +\xae\x03Q\x02\x0c\xff\xae\x03Q\x02X\xff\xd7\x03Q\x03\ +\x1d\xff\xd7\x03Q\x03\x1f\xff\xd7\x03Q\x03!\xff\xd7\x03\ +Q\x03#\xff\xd7\x03Q\x03%\xff\xd7\x03Q\x03'\xff\ +\xd7\x03Q\x03)\xff\xd7\x03Q\x03+\xff\xd7\x03Q\x03\ +-\xff\xd7\x03Q\x03/\xff\xd7\x03Q\x031\xff\xd7\x03\ +Q\x033\xff\xd7\x03Q\x03o\xff\xec\x03Q\x03q\xff\ +\xec\x03Q\x03s\xff\xec\x03Q\x03\x8f\xff\xc3\x03S\x00\ +\x0f\xff\xae\x03S\x00\x11\xff\xae\x03S\x00$\xff\xd7\x03\ +S\x007\xff\xc3\x03S\x009\xff\xec\x03S\x00:\xff\ +\xec\x03S\x00;\xff\xd7\x03S\x00<\xff\xec\x03S\x00\ +=\xff\xec\x03S\x00\x82\xff\xd7\x03S\x00\x83\xff\xd7\x03\ +S\x00\x84\xff\xd7\x03S\x00\x85\xff\xd7\x03S\x00\x86\xff\ +\xd7\x03S\x00\x87\xff\xd7\x03S\x00\x9f\xff\xec\x03S\x00\ +\xc2\xff\xd7\x03S\x00\xc4\xff\xd7\x03S\x00\xc6\xff\xd7\x03\ +S\x01$\xff\xc3\x03S\x01&\xff\xc3\x03S\x016\xff\ +\xec\x03S\x018\xff\xec\x03S\x01:\xff\xec\x03S\x01\ +;\xff\xec\x03S\x01=\xff\xec\x03S\x01?\xff\xec\x03\ +S\x01C\xff\xd7\x03S\x01\xa0\xff\xec\x03S\x01\xfa\xff\ +\xec\x03S\x01\xfc\xff\xec\x03S\x01\xfe\xff\xec\x03S\x02\ +\x00\xff\xec\x03S\x02\x08\xff\xae\x03S\x02\x0c\xff\xae\x03\ +S\x02X\xff\xd7\x03S\x03\x1d\xff\xd7\x03S\x03\x1f\xff\ +\xd7\x03S\x03!\xff\xd7\x03S\x03#\xff\xd7\x03S\x03\ +%\xff\xd7\x03S\x03'\xff\xd7\x03S\x03)\xff\xd7\x03\ +S\x03+\xff\xd7\x03S\x03-\xff\xd7\x03S\x03/\xff\ +\xd7\x03S\x031\xff\xd7\x03S\x033\xff\xd7\x03S\x03\ +o\xff\xec\x03S\x03q\xff\xec\x03S\x03s\xff\xec\x03\ +S\x03\x8f\xff\xc3\x03U\x00\x0f\xff\xae\x03U\x00\x11\xff\ +\xae\x03U\x00$\xff\xd7\x03U\x007\xff\xc3\x03U\x00\ +9\xff\xec\x03U\x00:\xff\xec\x03U\x00;\xff\xd7\x03\ +U\x00<\xff\xec\x03U\x00=\xff\xec\x03U\x00\x82\xff\ +\xd7\x03U\x00\x83\xff\xd7\x03U\x00\x84\xff\xd7\x03U\x00\ +\x85\xff\xd7\x03U\x00\x86\xff\xd7\x03U\x00\x87\xff\xd7\x03\ +U\x00\x9f\xff\xec\x03U\x00\xc2\xff\xd7\x03U\x00\xc4\xff\ +\xd7\x03U\x00\xc6\xff\xd7\x03U\x01$\xff\xc3\x03U\x01\ +&\xff\xc3\x03U\x016\xff\xec\x03U\x018\xff\xec\x03\ +U\x01:\xff\xec\x03U\x01;\xff\xec\x03U\x01=\xff\ +\xec\x03U\x01?\xff\xec\x03U\x01C\xff\xd7\x03U\x01\ +\xa0\xff\xec\x03U\x01\xfa\xff\xec\x03U\x01\xfc\xff\xec\x03\ +U\x01\xfe\xff\xec\x03U\x02\x00\xff\xec\x03U\x02\x08\xff\ +\xae\x03U\x02\x0c\xff\xae\x03U\x02X\xff\xd7\x03U\x03\ +\x1d\xff\xd7\x03U\x03\x1f\xff\xd7\x03U\x03!\xff\xd7\x03\ +U\x03#\xff\xd7\x03U\x03%\xff\xd7\x03U\x03'\xff\ +\xd7\x03U\x03)\xff\xd7\x03U\x03+\xff\xd7\x03U\x03\ +-\xff\xd7\x03U\x03/\xff\xd7\x03U\x031\xff\xd7\x03\ +U\x033\xff\xd7\x03U\x03o\xff\xec\x03U\x03q\xff\ +\xec\x03U\x03s\xff\xec\x03U\x03\x8f\xff\xc3\x03X\x00\ +I\x00R\x03X\x00W\x00R\x03X\x00Y\x00f\x03\ +X\x00Z\x00f\x03X\x00[\x00f\x03X\x00\x5c\x00\ +f\x03X\x00\xbf\x00f\x03X\x01%\x00R\x03X\x01\ +'\x00R\x03X\x017\x00f\x03X\x01\xfb\x00f\x03\ +X\x01\xfd\x00f\x03X\x024\x00R\x03X\x025\x00\ +R\x03X\x02]\x00R\x03X\x02^\x00R\x03X\x03\ +p\x00f\x03X\x03\x8d\x00R\x03X\x03\x90\x00R\x03\ +Z\x00I\x00R\x03Z\x00W\x00R\x03Z\x00Y\x00\ +f\x03Z\x00Z\x00f\x03Z\x00[\x00f\x03Z\x00\ +\x5c\x00f\x03Z\x00\xbf\x00f\x03Z\x01%\x00R\x03\ +Z\x01'\x00R\x03Z\x017\x00f\x03Z\x01\xfb\x00\ +f\x03Z\x01\xfd\x00f\x03Z\x024\x00R\x03Z\x02\ +5\x00R\x03Z\x02]\x00R\x03Z\x02^\x00R\x03\ +Z\x03p\x00f\x03Z\x03\x8d\x00R\x03Z\x03\x90\x00\ +R\x03\x5c\x00I\x00R\x03\x5c\x00W\x00R\x03\x5c\x00\ +Y\x00f\x03\x5c\x00Z\x00f\x03\x5c\x00[\x00f\x03\ +\x5c\x00\x5c\x00f\x03\x5c\x00\xbf\x00f\x03\x5c\x01%\x00\ +R\x03\x5c\x01'\x00R\x03\x5c\x017\x00f\x03\x5c\x01\ +\xfb\x00f\x03\x5c\x01\xfd\x00f\x03\x5c\x024\x00R\x03\ +\x5c\x025\x00R\x03\x5c\x02]\x00R\x03\x5c\x02^\x00\ +R\x03\x5c\x03p\x00f\x03\x5c\x03\x8d\x00R\x03\x5c\x03\ +\x90\x00R\x03^\x00I\x00R\x03^\x00W\x00R\x03\ +^\x00Y\x00f\x03^\x00Z\x00f\x03^\x00[\x00\ +f\x03^\x00\x5c\x00f\x03^\x00\xbf\x00f\x03^\x01\ +%\x00R\x03^\x01'\x00R\x03^\x017\x00f\x03\ +^\x01\xfb\x00f\x03^\x01\xfd\x00f\x03^\x024\x00\ +R\x03^\x025\x00R\x03^\x02]\x00R\x03^\x02\ +^\x00R\x03^\x03p\x00f\x03^\x03\x8d\x00R\x03\ +^\x03\x90\x00R\x03`\x00I\x00R\x03`\x00W\x00\ +R\x03`\x00Y\x00f\x03`\x00Z\x00f\x03`\x00\ +[\x00f\x03`\x00\x5c\x00f\x03`\x00\xbf\x00f\x03\ +`\x01%\x00R\x03`\x01'\x00R\x03`\x017\x00\ +f\x03`\x01\xfb\x00f\x03`\x01\xfd\x00f\x03`\x02\ +4\x00R\x03`\x025\x00R\x03`\x02]\x00R\x03\ +`\x02^\x00R\x03`\x03p\x00f\x03`\x03\x8d\x00\ +R\x03`\x03\x90\x00R\x03a\x00\x0f\xff\xd7\x03a\x00\ +\x11\xff\xd7\x03a\x00$\xff\xec\x03a\x00\x82\xff\xec\x03\ +a\x00\x83\xff\xec\x03a\x00\x84\xff\xec\x03a\x00\x85\xff\ +\xec\x03a\x00\x86\xff\xec\x03a\x00\x87\xff\xec\x03a\x00\ +\xc2\xff\xec\x03a\x00\xc4\xff\xec\x03a\x00\xc6\xff\xec\x03\ +a\x01C\xff\xec\x03a\x02\x08\xff\xd7\x03a\x02\x0c\xff\ +\xd7\x03a\x02X\xff\xec\x03a\x03\x1d\xff\xec\x03a\x03\ +\x1f\xff\xec\x03a\x03!\xff\xec\x03a\x03#\xff\xec\x03\ +a\x03%\xff\xec\x03a\x03'\xff\xec\x03a\x03)\xff\ +\xec\x03a\x03+\xff\xec\x03a\x03-\xff\xec\x03a\x03\ +/\xff\xec\x03a\x031\xff\xec\x03a\x033\xff\xec\x03\ +f\x00I\x00f\x03f\x00W\x00f\x03f\x00Y\x00\ +f\x03f\x00Z\x00f\x03f\x00[\x00f\x03f\x00\ +\x5c\x00f\x03f\x00\xbf\x00f\x03f\x01%\x00f\x03\ +f\x01'\x00f\x03f\x017\x00f\x03f\x01\xfb\x00\ +f\x03f\x01\xfd\x00f\x03f\x024\x00f\x03f\x02\ +5\x00f\x03f\x02]\x00f\x03f\x02^\x00f\x03\ +f\x03p\x00f\x03f\x03\x8d\x00f\x03f\x03\x90\x00\ +f\x03h\x00I\x00f\x03h\x00W\x00f\x03h\x00\ +Y\x00f\x03h\x00Z\x00f\x03h\x00[\x00f\x03\ +h\x00\x5c\x00f\x03h\x00\xbf\x00f\x03h\x01%\x00\ +f\x03h\x01'\x00f\x03h\x017\x00f\x03h\x01\ +\xfb\x00f\x03h\x01\xfd\x00f\x03h\x024\x00f\x03\ +h\x025\x00f\x03h\x02]\x00f\x03h\x02^\x00\ +f\x03h\x03p\x00f\x03h\x03\x8d\x00f\x03h\x03\ +\x90\x00f\x03j\x00I\x00f\x03j\x00W\x00f\x03\ +j\x00Y\x00f\x03j\x00Z\x00f\x03j\x00[\x00\ +f\x03j\x00\x5c\x00f\x03j\x00\xbf\x00f\x03j\x01\ +%\x00f\x03j\x01'\x00f\x03j\x017\x00f\x03\ +j\x01\xfb\x00f\x03j\x01\xfd\x00f\x03j\x024\x00\ +f\x03j\x025\x00f\x03j\x02]\x00f\x03j\x02\ +^\x00f\x03j\x03p\x00f\x03j\x03\x8d\x00f\x03\ +j\x03\x90\x00f\x03l\x00I\x00f\x03l\x00W\x00\ +f\x03l\x00Y\x00f\x03l\x00Z\x00f\x03l\x00\ +[\x00f\x03l\x00\x5c\x00f\x03l\x00\xbf\x00f\x03\ +l\x01%\x00f\x03l\x01'\x00f\x03l\x017\x00\ +f\x03l\x01\xfb\x00f\x03l\x01\xfd\x00f\x03l\x02\ +4\x00f\x03l\x025\x00f\x03l\x02]\x00f\x03\ +l\x02^\x00f\x03l\x03p\x00f\x03l\x03\x8d\x00\ +f\x03l\x03\x90\x00f\x03n\x00I\x00f\x03n\x00\ +W\x00f\x03n\x00Y\x00f\x03n\x00Z\x00f\x03\ +n\x00[\x00f\x03n\x00\x5c\x00f\x03n\x00\xbf\x00\ +f\x03n\x01%\x00f\x03n\x01'\x00f\x03n\x01\ +7\x00f\x03n\x01\xfb\x00f\x03n\x01\xfd\x00f\x03\ +n\x024\x00f\x03n\x025\x00f\x03n\x02]\x00\ +f\x03n\x02^\x00f\x03n\x03p\x00f\x03n\x03\ +\x8d\x00f\x03n\x03\x90\x00f\x03o\x00\x0f\xff\x85\x03\ +o\x00\x11\xff\x85\x03o\x00\x22\x00)\x03o\x00$\xff\ +\x85\x03o\x00&\xff\xd7\x03o\x00*\xff\xd7\x03o\x00\ +2\xff\xd7\x03o\x004\xff\xd7\x03o\x00D\xff\x9a\x03\ +o\x00F\xff\x9a\x03o\x00G\xff\x9a\x03o\x00H\xff\ +\x9a\x03o\x00J\xff\xd7\x03o\x00P\xff\xc3\x03o\x00\ +Q\xff\xc3\x03o\x00R\xff\x9a\x03o\x00S\xff\xc3\x03\ +o\x00T\xff\x9a\x03o\x00U\xff\xc3\x03o\x00V\xff\ +\xae\x03o\x00X\xff\xc3\x03o\x00]\xff\xd7\x03o\x00\ +\x82\xff\x85\x03o\x00\x83\xff\x85\x03o\x00\x84\xff\x85\x03\ +o\x00\x85\xff\x85\x03o\x00\x86\xff\x85\x03o\x00\x87\xff\ +\x85\x03o\x00\x89\xff\xd7\x03o\x00\x94\xff\xd7\x03o\x00\ +\x95\xff\xd7\x03o\x00\x96\xff\xd7\x03o\x00\x97\xff\xd7\x03\ +o\x00\x98\xff\xd7\x03o\x00\x9a\xff\xd7\x03o\x00\xa2\xff\ +\x9a\x03o\x00\xa3\xff\x9a\x03o\x00\xa4\xff\x9a\x03o\x00\ +\xa5\xff\x9a\x03o\x00\xa6\xff\x9a\x03o\x00\xa7\xff\x9a\x03\ +o\x00\xa8\xff\x9a\x03o\x00\xa9\xff\x9a\x03o\x00\xaa\xff\ +\x9a\x03o\x00\xab\xff\x9a\x03o\x00\xac\xff\x9a\x03o\x00\ +\xad\xff\x9a\x03o\x00\xb4\xff\x9a\x03o\x00\xb5\xff\x9a\x03\ +o\x00\xb6\xff\x9a\x03o\x00\xb7\xff\x9a\x03o\x00\xb8\xff\ +\x9a\x03o\x00\xba\xff\x9a\x03o\x00\xbb\xff\xc3\x03o\x00\ +\xbc\xff\xc3\x03o\x00\xbd\xff\xc3\x03o\x00\xbe\xff\xc3\x03\ +o\x00\xc2\xff\x85\x03o\x00\xc3\xff\x9a\x03o\x00\xc4\xff\ +\x85\x03o\x00\xc5\xff\x9a\x03o\x00\xc6\xff\x85\x03o\x00\ +\xc7\xff\x9a\x03o\x00\xc8\xff\xd7\x03o\x00\xc9\xff\x9a\x03\ +o\x00\xca\xff\xd7\x03o\x00\xcb\xff\x9a\x03o\x00\xcc\xff\ +\xd7\x03o\x00\xcd\xff\x9a\x03o\x00\xce\xff\xd7\x03o\x00\ +\xcf\xff\x9a\x03o\x00\xd1\xff\x9a\x03o\x00\xd3\xff\x9a\x03\ +o\x00\xd5\xff\x9a\x03o\x00\xd7\xff\x9a\x03o\x00\xd9\xff\ +\x9a\x03o\x00\xdb\xff\x9a\x03o\x00\xdd\xff\x9a\x03o\x00\ +\xde\xff\xd7\x03o\x00\xdf\xff\xd7\x03o\x00\xe0\xff\xd7\x03\ +o\x00\xe1\xff\xd7\x03o\x00\xe2\xff\xd7\x03o\x00\xe3\xff\ +\xd7\x03o\x00\xe4\xff\xd7\x03o\x00\xe5\xff\xd7\x03o\x00\ +\xfa\xff\xc3\x03o\x01\x06\xff\xc3\x03o\x01\x08\xff\xc3\x03\ +o\x01\x0d\xff\xc3\x03o\x01\x0e\xff\xd7\x03o\x01\x0f\xff\ +\x9a\x03o\x01\x10\xff\xd7\x03o\x01\x11\xff\x9a\x03o\x01\ +\x12\xff\xd7\x03o\x01\x13\xff\x9a\x03o\x01\x14\xff\xd7\x03\ +o\x01\x15\xff\x9a\x03o\x01\x17\xff\xc3\x03o\x01\x19\xff\ +\xc3\x03o\x01\x1d\xff\xae\x03o\x01!\xff\xae\x03o\x01\ ++\xff\xc3\x03o\x01-\xff\xc3\x03o\x01/\xff\xc3\x03\ +o\x011\xff\xc3\x03o\x013\xff\xc3\x03o\x015\xff\ +\xc3\x03o\x01<\xff\xd7\x03o\x01>\xff\xd7\x03o\x01\ +@\xff\xd7\x03o\x01C\xff\x85\x03o\x01D\xff\x9a\x03\ +o\x01F\xff\x9a\x03o\x01G\xff\xd7\x03o\x01H\xff\ +\x9a\x03o\x01J\xff\xae\x03o\x02\x08\xff\x85\x03o\x02\ +\x0c\xff\x85\x03o\x02W\xff\xc3\x03o\x02X\xff\x85\x03\ +o\x02Y\xff\x9a\x03o\x02_\xff\xd7\x03o\x02`\xff\ +\x9a\x03o\x02b\xff\xc3\x03o\x03\x1d\xff\x85\x03o\x03\ +\x1e\xff\x9a\x03o\x03\x1f\xff\x85\x03o\x03 \xff\x9a\x03\ +o\x03!\xff\x85\x03o\x03\x22\xff\x9a\x03o\x03#\xff\ +\x85\x03o\x03%\xff\x85\x03o\x03&\xff\x9a\x03o\x03\ +'\xff\x85\x03o\x03(\xff\x9a\x03o\x03)\xff\x85\x03\ +o\x03*\xff\x9a\x03o\x03+\xff\x85\x03o\x03,\xff\ +\x9a\x03o\x03-\xff\x85\x03o\x03.\xff\x9a\x03o\x03\ +/\xff\x85\x03o\x030\xff\x9a\x03o\x031\xff\x85\x03\ +o\x032\xff\x9a\x03o\x033\xff\x85\x03o\x034\xff\ +\x9a\x03o\x036\xff\x9a\x03o\x038\xff\x9a\x03o\x03\ +:\xff\x9a\x03o\x03<\xff\x9a\x03o\x03@\xff\x9a\x03\ +o\x03B\xff\x9a\x03o\x03D\xff\x9a\x03o\x03I\xff\ +\xd7\x03o\x03J\xff\x9a\x03o\x03K\xff\xd7\x03o\x03\ +L\xff\x9a\x03o\x03M\xff\xd7\x03o\x03N\xff\x9a\x03\ +o\x03O\xff\xd7\x03o\x03Q\xff\xd7\x03o\x03R\xff\ +\x9a\x03o\x03S\xff\xd7\x03o\x03T\xff\x9a\x03o\x03\ +U\xff\xd7\x03o\x03V\xff\x9a\x03o\x03W\xff\xd7\x03\ +o\x03X\xff\x9a\x03o\x03Y\xff\xd7\x03o\x03Z\xff\ +\x9a\x03o\x03[\xff\xd7\x03o\x03\x5c\xff\x9a\x03o\x03\ +]\xff\xd7\x03o\x03^\xff\x9a\x03o\x03_\xff\xd7\x03\ +o\x03`\xff\x9a\x03o\x03b\xff\xc3\x03o\x03d\xff\ +\xc3\x03o\x03f\xff\xc3\x03o\x03h\xff\xc3\x03o\x03\ +j\xff\xc3\x03o\x03l\xff\xc3\x03o\x03n\xff\xc3\x03\ +p\x00\x05\x00R\x03p\x00\x0a\x00R\x03p\x00\x0f\xff\ +\xae\x03p\x00\x11\xff\xae\x03p\x00\x22\x00)\x03p\x02\ +\x07\x00R\x03p\x02\x08\xff\xae\x03p\x02\x0b\x00R\x03\ +p\x02\x0c\xff\xae\x03q\x00\x0f\xff\x85\x03q\x00\x11\xff\ +\x85\x03q\x00\x22\x00)\x03q\x00$\xff\x85\x03q\x00\ +&\xff\xd7\x03q\x00*\xff\xd7\x03q\x002\xff\xd7\x03\ +q\x004\xff\xd7\x03q\x00D\xff\x9a\x03q\x00F\xff\ +\x9a\x03q\x00G\xff\x9a\x03q\x00H\xff\x9a\x03q\x00\ +J\xff\xd7\x03q\x00P\xff\xc3\x03q\x00Q\xff\xc3\x03\ +q\x00R\xff\x9a\x03q\x00S\xff\xc3\x03q\x00T\xff\ +\x9a\x03q\x00U\xff\xc3\x03q\x00V\xff\xae\x03q\x00\ +X\xff\xc3\x03q\x00]\xff\xd7\x03q\x00\x82\xff\x85\x03\ +q\x00\x83\xff\x85\x03q\x00\x84\xff\x85\x03q\x00\x85\xff\ +\x85\x03q\x00\x86\xff\x85\x03q\x00\x87\xff\x85\x03q\x00\ +\x89\xff\xd7\x03q\x00\x94\xff\xd7\x03q\x00\x95\xff\xd7\x03\ +q\x00\x96\xff\xd7\x03q\x00\x97\xff\xd7\x03q\x00\x98\xff\ +\xd7\x03q\x00\x9a\xff\xd7\x03q\x00\xa2\xff\x9a\x03q\x00\ +\xa3\xff\x9a\x03q\x00\xa4\xff\x9a\x03q\x00\xa5\xff\x9a\x03\ +q\x00\xa6\xff\x9a\x03q\x00\xa7\xff\x9a\x03q\x00\xa8\xff\ +\x9a\x03q\x00\xa9\xff\x9a\x03q\x00\xaa\xff\x9a\x03q\x00\ +\xab\xff\x9a\x03q\x00\xac\xff\x9a\x03q\x00\xad\xff\x9a\x03\ +q\x00\xb4\xff\x9a\x03q\x00\xb5\xff\x9a\x03q\x00\xb6\xff\ +\x9a\x03q\x00\xb7\xff\x9a\x03q\x00\xb8\xff\x9a\x03q\x00\ +\xba\xff\x9a\x03q\x00\xbb\xff\xc3\x03q\x00\xbc\xff\xc3\x03\ +q\x00\xbd\xff\xc3\x03q\x00\xbe\xff\xc3\x03q\x00\xc2\xff\ +\x85\x03q\x00\xc3\xff\x9a\x03q\x00\xc4\xff\x85\x03q\x00\ +\xc5\xff\x9a\x03q\x00\xc6\xff\x85\x03q\x00\xc7\xff\x9a\x03\ +q\x00\xc8\xff\xd7\x03q\x00\xc9\xff\x9a\x03q\x00\xca\xff\ +\xd7\x03q\x00\xcb\xff\x9a\x03q\x00\xcc\xff\xd7\x03q\x00\ +\xcd\xff\x9a\x03q\x00\xce\xff\xd7\x03q\x00\xcf\xff\x9a\x03\ +q\x00\xd1\xff\x9a\x03q\x00\xd3\xff\x9a\x03q\x00\xd5\xff\ +\x9a\x03q\x00\xd7\xff\x9a\x03q\x00\xd9\xff\x9a\x03q\x00\ +\xdb\xff\x9a\x03q\x00\xdd\xff\x9a\x03q\x00\xde\xff\xd7\x03\ +q\x00\xdf\xff\xd7\x03q\x00\xe0\xff\xd7\x03q\x00\xe1\xff\ +\xd7\x03q\x00\xe2\xff\xd7\x03q\x00\xe3\xff\xd7\x03q\x00\ +\xe4\xff\xd7\x03q\x00\xe5\xff\xd7\x03q\x00\xfa\xff\xc3\x03\ +q\x01\x06\xff\xc3\x03q\x01\x08\xff\xc3\x03q\x01\x0d\xff\ +\xc3\x03q\x01\x0e\xff\xd7\x03q\x01\x0f\xff\x9a\x03q\x01\ +\x10\xff\xd7\x03q\x01\x11\xff\x9a\x03q\x01\x12\xff\xd7\x03\ +q\x01\x13\xff\x9a\x03q\x01\x14\xff\xd7\x03q\x01\x15\xff\ +\x9a\x03q\x01\x17\xff\xc3\x03q\x01\x19\xff\xc3\x03q\x01\ +\x1d\xff\xae\x03q\x01!\xff\xae\x03q\x01+\xff\xc3\x03\ +q\x01-\xff\xc3\x03q\x01/\xff\xc3\x03q\x011\xff\ +\xc3\x03q\x013\xff\xc3\x03q\x015\xff\xc3\x03q\x01\ +<\xff\xd7\x03q\x01>\xff\xd7\x03q\x01@\xff\xd7\x03\ +q\x01C\xff\x85\x03q\x01D\xff\x9a\x03q\x01F\xff\ +\x9a\x03q\x01G\xff\xd7\x03q\x01H\xff\x9a\x03q\x01\ +J\xff\xae\x03q\x02\x08\xff\x85\x03q\x02\x0c\xff\x85\x03\ +q\x02W\xff\xc3\x03q\x02X\xff\x85\x03q\x02Y\xff\ +\x9a\x03q\x02_\xff\xd7\x03q\x02`\xff\x9a\x03q\x02\ +b\xff\xc3\x03q\x03\x1d\xff\x85\x03q\x03\x1e\xff\x9a\x03\ +q\x03\x1f\xff\x85\x03q\x03 \xff\x9a\x03q\x03!\xff\ +\x85\x03q\x03\x22\xff\x9a\x03q\x03#\xff\x85\x03q\x03\ +%\xff\x85\x03q\x03&\xff\x9a\x03q\x03'\xff\x85\x03\ +q\x03(\xff\x9a\x03q\x03)\xff\x85\x03q\x03*\xff\ +\x9a\x03q\x03+\xff\x85\x03q\x03,\xff\x9a\x03q\x03\ +-\xff\x85\x03q\x03.\xff\x9a\x03q\x03/\xff\x85\x03\ +q\x030\xff\x9a\x03q\x031\xff\x85\x03q\x032\xff\ +\x9a\x03q\x033\xff\x85\x03q\x034\xff\x9a\x03q\x03\ +6\xff\x9a\x03q\x038\xff\x9a\x03q\x03:\xff\x9a\x03\ +q\x03<\xff\x9a\x03q\x03@\xff\x9a\x03q\x03B\xff\ +\x9a\x03q\x03D\xff\x9a\x03q\x03I\xff\xd7\x03q\x03\ +J\xff\x9a\x03q\x03K\xff\xd7\x03q\x03L\xff\x9a\x03\ +q\x03M\xff\xd7\x03q\x03N\xff\x9a\x03q\x03O\xff\ +\xd7\x03q\x03Q\xff\xd7\x03q\x03R\xff\x9a\x03q\x03\ +S\xff\xd7\x03q\x03T\xff\x9a\x03q\x03U\xff\xd7\x03\ +q\x03V\xff\x9a\x03q\x03W\xff\xd7\x03q\x03X\xff\ +\x9a\x03q\x03Y\xff\xd7\x03q\x03Z\xff\x9a\x03q\x03\ +[\xff\xd7\x03q\x03\x5c\xff\x9a\x03q\x03]\xff\xd7\x03\ +q\x03^\xff\x9a\x03q\x03_\xff\xd7\x03q\x03`\xff\ +\x9a\x03q\x03b\xff\xc3\x03q\x03d\xff\xc3\x03q\x03\ +f\xff\xc3\x03q\x03h\xff\xc3\x03q\x03j\xff\xc3\x03\ +q\x03l\xff\xc3\x03q\x03n\xff\xc3\x03r\x00\x05\x00\ +R\x03r\x00\x0a\x00R\x03r\x00\x0f\xff\xae\x03r\x00\ +\x11\xff\xae\x03r\x00\x22\x00)\x03r\x02\x07\x00R\x03\ +r\x02\x08\xff\xae\x03r\x02\x0b\x00R\x03r\x02\x0c\xff\ +\xae\x03s\x00\x0f\xff\x85\x03s\x00\x11\xff\x85\x03s\x00\ +\x22\x00)\x03s\x00$\xff\x85\x03s\x00&\xff\xd7\x03\ +s\x00*\xff\xd7\x03s\x002\xff\xd7\x03s\x004\xff\ +\xd7\x03s\x00D\xff\x9a\x03s\x00F\xff\x9a\x03s\x00\ +G\xff\x9a\x03s\x00H\xff\x9a\x03s\x00J\xff\xd7\x03\ +s\x00P\xff\xc3\x03s\x00Q\xff\xc3\x03s\x00R\xff\ +\x9a\x03s\x00S\xff\xc3\x03s\x00T\xff\x9a\x03s\x00\ +U\xff\xc3\x03s\x00V\xff\xae\x03s\x00X\xff\xc3\x03\ +s\x00]\xff\xd7\x03s\x00\x82\xff\x85\x03s\x00\x83\xff\ +\x85\x03s\x00\x84\xff\x85\x03s\x00\x85\xff\x85\x03s\x00\ +\x86\xff\x85\x03s\x00\x87\xff\x85\x03s\x00\x89\xff\xd7\x03\ +s\x00\x94\xff\xd7\x03s\x00\x95\xff\xd7\x03s\x00\x96\xff\ +\xd7\x03s\x00\x97\xff\xd7\x03s\x00\x98\xff\xd7\x03s\x00\ +\x9a\xff\xd7\x03s\x00\xa2\xff\x9a\x03s\x00\xa3\xff\x9a\x03\ +s\x00\xa4\xff\x9a\x03s\x00\xa5\xff\x9a\x03s\x00\xa6\xff\ +\x9a\x03s\x00\xa7\xff\x9a\x03s\x00\xa8\xff\x9a\x03s\x00\ +\xa9\xff\x9a\x03s\x00\xaa\xff\x9a\x03s\x00\xab\xff\x9a\x03\ +s\x00\xac\xff\x9a\x03s\x00\xad\xff\x9a\x03s\x00\xb4\xff\ +\x9a\x03s\x00\xb5\xff\x9a\x03s\x00\xb6\xff\x9a\x03s\x00\ +\xb7\xff\x9a\x03s\x00\xb8\xff\x9a\x03s\x00\xba\xff\x9a\x03\ +s\x00\xbb\xff\xc3\x03s\x00\xbc\xff\xc3\x03s\x00\xbd\xff\ +\xc3\x03s\x00\xbe\xff\xc3\x03s\x00\xc2\xff\x85\x03s\x00\ +\xc3\xff\x9a\x03s\x00\xc4\xff\x85\x03s\x00\xc5\xff\x9a\x03\ +s\x00\xc6\xff\x85\x03s\x00\xc7\xff\x9a\x03s\x00\xc8\xff\ +\xd7\x03s\x00\xc9\xff\x9a\x03s\x00\xca\xff\xd7\x03s\x00\ +\xcb\xff\x9a\x03s\x00\xcc\xff\xd7\x03s\x00\xcd\xff\x9a\x03\ +s\x00\xce\xff\xd7\x03s\x00\xcf\xff\x9a\x03s\x00\xd1\xff\ +\x9a\x03s\x00\xd3\xff\x9a\x03s\x00\xd5\xff\x9a\x03s\x00\ +\xd7\xff\x9a\x03s\x00\xd9\xff\x9a\x03s\x00\xdb\xff\x9a\x03\ +s\x00\xdd\xff\x9a\x03s\x00\xde\xff\xd7\x03s\x00\xdf\xff\ +\xd7\x03s\x00\xe0\xff\xd7\x03s\x00\xe1\xff\xd7\x03s\x00\ +\xe2\xff\xd7\x03s\x00\xe3\xff\xd7\x03s\x00\xe4\xff\xd7\x03\ +s\x00\xe5\xff\xd7\x03s\x00\xfa\xff\xc3\x03s\x01\x06\xff\ +\xc3\x03s\x01\x08\xff\xc3\x03s\x01\x0d\xff\xc3\x03s\x01\ +\x0e\xff\xd7\x03s\x01\x0f\xff\x9a\x03s\x01\x10\xff\xd7\x03\ +s\x01\x11\xff\x9a\x03s\x01\x12\xff\xd7\x03s\x01\x13\xff\ +\x9a\x03s\x01\x14\xff\xd7\x03s\x01\x15\xff\x9a\x03s\x01\ +\x17\xff\xc3\x03s\x01\x19\xff\xc3\x03s\x01\x1d\xff\xae\x03\ +s\x01!\xff\xae\x03s\x01+\xff\xc3\x03s\x01-\xff\ +\xc3\x03s\x01/\xff\xc3\x03s\x011\xff\xc3\x03s\x01\ +3\xff\xc3\x03s\x015\xff\xc3\x03s\x01<\xff\xd7\x03\ +s\x01>\xff\xd7\x03s\x01@\xff\xd7\x03s\x01C\xff\ +\x85\x03s\x01D\xff\x9a\x03s\x01F\xff\x9a\x03s\x01\ +G\xff\xd7\x03s\x01H\xff\x9a\x03s\x01J\xff\xae\x03\ +s\x02\x08\xff\x85\x03s\x02\x0c\xff\x85\x03s\x02W\xff\ +\xc3\x03s\x02X\xff\x85\x03s\x02Y\xff\x9a\x03s\x02\ +_\xff\xd7\x03s\x02`\xff\x9a\x03s\x02b\xff\xc3\x03\ +s\x03\x1d\xff\x85\x03s\x03\x1e\xff\x9a\x03s\x03\x1f\xff\ +\x85\x03s\x03 \xff\x9a\x03s\x03!\xff\x85\x03s\x03\ +\x22\xff\x9a\x03s\x03#\xff\x85\x03s\x03%\xff\x85\x03\ +s\x03&\xff\x9a\x03s\x03'\xff\x85\x03s\x03(\xff\ +\x9a\x03s\x03)\xff\x85\x03s\x03*\xff\x9a\x03s\x03\ ++\xff\x85\x03s\x03,\xff\x9a\x03s\x03-\xff\x85\x03\ +s\x03.\xff\x9a\x03s\x03/\xff\x85\x03s\x030\xff\ +\x9a\x03s\x031\xff\x85\x03s\x032\xff\x9a\x03s\x03\ +3\xff\x85\x03s\x034\xff\x9a\x03s\x036\xff\x9a\x03\ +s\x038\xff\x9a\x03s\x03:\xff\x9a\x03s\x03<\xff\ +\x9a\x03s\x03@\xff\x9a\x03s\x03B\xff\x9a\x03s\x03\ +D\xff\x9a\x03s\x03I\xff\xd7\x03s\x03J\xff\x9a\x03\ +s\x03K\xff\xd7\x03s\x03L\xff\x9a\x03s\x03M\xff\ +\xd7\x03s\x03N\xff\x9a\x03s\x03O\xff\xd7\x03s\x03\ +Q\xff\xd7\x03s\x03R\xff\x9a\x03s\x03S\xff\xd7\x03\ +s\x03T\xff\x9a\x03s\x03U\xff\xd7\x03s\x03V\xff\ +\x9a\x03s\x03W\xff\xd7\x03s\x03X\xff\x9a\x03s\x03\ +Y\xff\xd7\x03s\x03Z\xff\x9a\x03s\x03[\xff\xd7\x03\ +s\x03\x5c\xff\x9a\x03s\x03]\xff\xd7\x03s\x03^\xff\ +\x9a\x03s\x03_\xff\xd7\x03s\x03`\xff\x9a\x03s\x03\ +b\xff\xc3\x03s\x03d\xff\xc3\x03s\x03f\xff\xc3\x03\ +s\x03h\xff\xc3\x03s\x03j\xff\xc3\x03s\x03l\xff\ +\xc3\x03s\x03n\xff\xc3\x03t\x00\x05\x00R\x03t\x00\ +\x0a\x00R\x03t\x00\x0f\xff\xae\x03t\x00\x11\xff\xae\x03\ +t\x00\x22\x00)\x03t\x02\x07\x00R\x03t\x02\x08\xff\ +\xae\x03t\x02\x0b\x00R\x03t\x02\x0c\xff\xae\x03\x8d\x00\ +\x05\x00{\x03\x8d\x00\x0a\x00{\x03\x8d\x02\x07\x00{\x03\ +\x8d\x02\x0b\x00{\x03\x8f\x00\x0f\xff\x85\x03\x8f\x00\x10\xff\ +\xae\x03\x8f\x00\x11\xff\x85\x03\x8f\x00\x22\x00)\x03\x8f\x00\ +$\xffq\x03\x8f\x00&\xff\xd7\x03\x8f\x00*\xff\xd7\x03\ +\x8f\x002\xff\xd7\x03\x8f\x004\xff\xd7\x03\x8f\x007\x00\ +)\x03\x8f\x00D\xff\x5c\x03\x8f\x00F\xffq\x03\x8f\x00\ +G\xffq\x03\x8f\x00H\xffq\x03\x8f\x00J\xffq\x03\ +\x8f\x00P\xff\x9a\x03\x8f\x00Q\xff\x9a\x03\x8f\x00R\xff\ +q\x03\x8f\x00S\xff\x9a\x03\x8f\x00T\xffq\x03\x8f\x00\ +U\xff\x9a\x03\x8f\x00V\xff\x85\x03\x8f\x00X\xff\x9a\x03\ +\x8f\x00Y\xff\xd7\x03\x8f\x00Z\xff\xd7\x03\x8f\x00[\xff\ +\xd7\x03\x8f\x00\x5c\xff\xd7\x03\x8f\x00]\xff\xae\x03\x8f\x00\ +\x82\xffq\x03\x8f\x00\x83\xffq\x03\x8f\x00\x84\xffq\x03\ +\x8f\x00\x85\xffq\x03\x8f\x00\x86\xffq\x03\x8f\x00\x87\xff\ +q\x03\x8f\x00\x89\xff\xd7\x03\x8f\x00\x94\xff\xd7\x03\x8f\x00\ +\x95\xff\xd7\x03\x8f\x00\x96\xff\xd7\x03\x8f\x00\x97\xff\xd7\x03\ +\x8f\x00\x98\xff\xd7\x03\x8f\x00\x9a\xff\xd7\x03\x8f\x00\xa2\xff\ +q\x03\x8f\x00\xa3\xff\x5c\x03\x8f\x00\xa4\xff\x5c\x03\x8f\x00\ +\xa5\xff\x5c\x03\x8f\x00\xa6\xff\x5c\x03\x8f\x00\xa7\xff\x5c\x03\ +\x8f\x00\xa8\xff\x5c\x03\x8f\x00\xa9\xffq\x03\x8f\x00\xaa\xff\ +q\x03\x8f\x00\xab\xffq\x03\x8f\x00\xac\xffq\x03\x8f\x00\ +\xad\xffq\x03\x8f\x00\xb4\xffq\x03\x8f\x00\xb5\xffq\x03\ +\x8f\x00\xb6\xffq\x03\x8f\x00\xb7\xffq\x03\x8f\x00\xb8\xff\ +q\x03\x8f\x00\xba\xffq\x03\x8f\x00\xbb\xff\x9a\x03\x8f\x00\ +\xbc\xff\x9a\x03\x8f\x00\xbd\xff\x9a\x03\x8f\x00\xbe\xff\x9a\x03\ +\x8f\x00\xbf\xff\xd7\x03\x8f\x00\xc2\xffq\x03\x8f\x00\xc3\xff\ +\x5c\x03\x8f\x00\xc4\xffq\x03\x8f\x00\xc5\xff\x5c\x03\x8f\x00\ +\xc6\xffq\x03\x8f\x00\xc7\xff\x5c\x03\x8f\x00\xc8\xff\xd7\x03\ +\x8f\x00\xc9\xffq\x03\x8f\x00\xca\xff\xd7\x03\x8f\x00\xcb\xff\ +q\x03\x8f\x00\xcc\xff\xd7\x03\x8f\x00\xcd\xffq\x03\x8f\x00\ +\xce\xff\xd7\x03\x8f\x00\xcf\xffq\x03\x8f\x00\xd1\xffq\x03\ +\x8f\x00\xd3\xffq\x03\x8f\x00\xd5\xffq\x03\x8f\x00\xd7\xff\ +q\x03\x8f\x00\xd9\xffq\x03\x8f\x00\xdb\xffq\x03\x8f\x00\ +\xdd\xffq\x03\x8f\x00\xde\xff\xd7\x03\x8f\x00\xdf\xffq\x03\ +\x8f\x00\xe0\xff\xd7\x03\x8f\x00\xe1\xffq\x03\x8f\x00\xe2\xff\ +\xd7\x03\x8f\x00\xe3\xffq\x03\x8f\x00\xe4\xff\xd7\x03\x8f\x00\ +\xe5\xffq\x03\x8f\x00\xfa\xff\x9a\x03\x8f\x01\x06\xff\x9a\x03\ +\x8f\x01\x08\xff\x9a\x03\x8f\x01\x0d\xff\x9a\x03\x8f\x01\x0e\xff\ +\xd7\x03\x8f\x01\x0f\xffq\x03\x8f\x01\x10\xff\xd7\x03\x8f\x01\ +\x11\xffq\x03\x8f\x01\x12\xff\xd7\x03\x8f\x01\x13\xffq\x03\ +\x8f\x01\x14\xff\xd7\x03\x8f\x01\x15\xffq\x03\x8f\x01\x17\xff\ +\x9a\x03\x8f\x01\x19\xff\x9a\x03\x8f\x01\x1d\xff\x85\x03\x8f\x01\ +!\xff\x85\x03\x8f\x01$\x00)\x03\x8f\x01&\x00)\x03\ +\x8f\x01+\xff\x9a\x03\x8f\x01-\xff\x9a\x03\x8f\x01/\xff\ +\x9a\x03\x8f\x011\xff\x9a\x03\x8f\x013\xff\x9a\x03\x8f\x01\ +5\xff\x9a\x03\x8f\x017\xff\xd7\x03\x8f\x01<\xff\xae\x03\ +\x8f\x01>\xff\xae\x03\x8f\x01@\xff\xae\x03\x8f\x01C\xff\ +q\x03\x8f\x01D\xff\x5c\x03\x8f\x01F\xff\x5c\x03\x8f\x01\ +G\xff\xd7\x03\x8f\x01H\xffq\x03\x8f\x01J\xff\x85\x03\ +\x8f\x01\xfb\xff\xd7\x03\x8f\x01\xfd\xff\xd7\x03\x8f\x02\x02\xff\ +\xae\x03\x8f\x02\x03\xff\xae\x03\x8f\x02\x04\xff\xae\x03\x8f\x02\ +\x08\xff\x85\x03\x8f\x02\x0c\xff\x85\x03\x8f\x02W\xff\x9a\x03\ +\x8f\x02X\xffq\x03\x8f\x02Y\xff\x5c\x03\x8f\x02_\xff\ +\xd7\x03\x8f\x02`\xffq\x03\x8f\x02b\xff\x9a\x03\x8f\x03\ +\x1d\xffq\x03\x8f\x03\x1e\xff\x5c\x03\x8f\x03\x1f\xffq\x03\ +\x8f\x03 \xff\x5c\x03\x8f\x03!\xffq\x03\x8f\x03\x22\xff\ +\x5c\x03\x8f\x03#\xffq\x03\x8f\x03%\xffq\x03\x8f\x03\ +&\xff\x5c\x03\x8f\x03'\xffq\x03\x8f\x03(\xff\x5c\x03\ +\x8f\x03)\xffq\x03\x8f\x03*\xff\x5c\x03\x8f\x03+\xff\ +q\x03\x8f\x03,\xff\x5c\x03\x8f\x03-\xffq\x03\x8f\x03\ +.\xff\x5c\x03\x8f\x03/\xffq\x03\x8f\x030\xff\x5c\x03\ +\x8f\x031\xffq\x03\x8f\x032\xff\x5c\x03\x8f\x033\xff\ +q\x03\x8f\x034\xff\x5c\x03\x8f\x036\xffq\x03\x8f\x03\ +8\xffq\x03\x8f\x03:\xffq\x03\x8f\x03<\xffq\x03\ +\x8f\x03@\xffq\x03\x8f\x03B\xffq\x03\x8f\x03D\xff\ +q\x03\x8f\x03I\xff\xd7\x03\x8f\x03J\xffq\x03\x8f\x03\ +K\xff\xd7\x03\x8f\x03L\xffq\x03\x8f\x03M\xff\xd7\x03\ +\x8f\x03N\xffq\x03\x8f\x03O\xff\xd7\x03\x8f\x03Q\xff\ +\xd7\x03\x8f\x03R\xffq\x03\x8f\x03S\xff\xd7\x03\x8f\x03\ +T\xffq\x03\x8f\x03U\xff\xd7\x03\x8f\x03V\xffq\x03\ +\x8f\x03W\xff\xd7\x03\x8f\x03X\xffq\x03\x8f\x03Y\xff\ +\xd7\x03\x8f\x03Z\xffq\x03\x8f\x03[\xff\xd7\x03\x8f\x03\ +\x5c\xffq\x03\x8f\x03]\xff\xd7\x03\x8f\x03^\xffq\x03\ +\x8f\x03_\xff\xd7\x03\x8f\x03`\xffq\x03\x8f\x03b\xff\ +\x9a\x03\x8f\x03d\xff\x9a\x03\x8f\x03f\xff\x9a\x03\x8f\x03\ +h\xff\x9a\x03\x8f\x03j\xff\x9a\x03\x8f\x03l\xff\x9a\x03\ +\x8f\x03n\xff\x9a\x03\x8f\x03p\xff\xd7\x03\x8f\x03\x8f\x00\ +)\x03\x90\x00\x05\x00)\x03\x90\x00\x0a\x00)\x03\x90\x02\ +\x07\x00)\x03\x90\x02\x0b\x00)\x00\x00\x00\x00\x00\x1e\x01\ +n\x00\x01\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x12\x009\x00\x01\x00\x00\x00\x00\x00\ +\x02\x00\x06\x00K\x00\x01\x00\x00\x00\x00\x00\x03\x00.\x00\ +Q\x00\x01\x00\x00\x00\x00\x00\x04\x00\x19\x00\x5c\x00\x01\x00\ +\x00\x00\x00\x00\x05\x00\x0c\x00\x7f\x00\x01\x00\x00\x00\x00\x00\ +\x06\x00\x17\x00\x8b\x00\x01\x00\x00\x00\x00\x00\x07\x00R\x00\ +\xa2\x00\x01\x00\x00\x00\x00\x00\x08\x00\x14\x00\xf4\x00\x01\x00\ +\x00\x00\x00\x00\x0b\x00\x1c\x01\x08\x00\x01\x00\x00\x00\x00\x00\ +\x0c\x00.\x01$\x00\x01\x00\x00\x00\x00\x00\x0d\x00.\x01\ +R\x00\x01\x00\x00\x00\x00\x00\x0e\x00*\x01\x80\x00\x01\x00\ +\x00\x00\x00\x00\x10\x00\x09\x009\x00\x01\x00\x00\x00\x00\x00\ +\x11\x00\x0f\x00f\x00\x03\x00\x01\x04\x09\x00\x00\x00r\x01\ +\xaa\x00\x03\x00\x01\x04\x09\x00\x01\x00$\x02\x1c\x00\x03\x00\ +\x01\x04\x09\x00\x02\x00\x0c\x02@\x00\x03\x00\x01\x04\x09\x00\ +\x03\x00\x5c\x02L\x00\x03\x00\x01\x04\x09\x00\x04\x002\x02\ +b\x00\x03\x00\x01\x04\x09\x00\x05\x00\x18\x02\xa8\x00\x03\x00\ +\x01\x04\x09\x00\x06\x00.\x02\xc0\x00\x03\x00\x01\x04\x09\x00\ +\x07\x00\xa4\x02\xee\x00\x03\x00\x01\x04\x09\x00\x08\x00(\x03\ +\x92\x00\x03\x00\x01\x04\x09\x00\x0b\x008\x03\xba\x00\x03\x00\ +\x01\x04\x09\x00\x0c\x00\x5c\x03\xf2\x00\x03\x00\x01\x04\x09\x00\ +\x0d\x00\x5c\x04N\x00\x03\x00\x01\x04\x09\x00\x0e\x00T\x04\ +\xaa\x00\x03\x00\x01\x04\x09\x00\x10\x00\x12\x02\x1c\x00\x03\x00\ +\x01\x04\x09\x00\x11\x00\x1e\x02vDigitiz\ +ed data copyrigh\ +t \xa9 2010-2011, G\ +oogle Corporatio\ +n.Open Sans Semi\ +boldItalicAscend\ +er - Open Sans S\ +emibold Italic B\ +uild 100Version \ +1.10OpenSans-Sem\ +iboldItalicOpen \ +Sans is a tradem\ +ark of Google an\ +d may be registe\ +red in certain j\ +urisdictions.Asc\ +ender Corporatio\ +nhttp://www.asce\ +ndercorp.com/htt\ +p://www.ascender\ +corp.com/typedes\ +igners.htmlLicen\ +sed under the Ap\ +ache License, Ve\ +rsion 2.0http://\ +www.apache.org/l\ +icenses/LICENSE-\ +2.0\x00D\x00i\x00g\x00i\x00t\x00i\x00\ +z\x00e\x00d\x00 \x00d\x00a\x00t\x00a\x00\ + \x00c\x00o\x00p\x00y\x00r\x00i\x00g\x00\ +h\x00t\x00 \x00\xa9\x00 \x002\x000\x001\x00\ +0\x00-\x002\x000\x001\x001\x00,\x00 \x00\ +G\x00o\x00o\x00g\x00l\x00e\x00 \x00C\x00\ +o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\x00\ +o\x00n\x00.\x00O\x00p\x00e\x00n\x00 \x00\ +S\x00a\x00n\x00s\x00 \x00S\x00e\x00m\x00\ +i\x00b\x00o\x00l\x00d\x00I\x00t\x00a\x00\ +l\x00i\x00c\x00A\x00s\x00c\x00e\x00n\x00\ +d\x00e\x00r\x00 \x00-\x00 \x00O\x00p\x00\ +e\x00n\x00 \x00S\x00a\x00n\x00s\x00 \x00\ +S\x00e\x00m\x00i\x00b\x00o\x00l\x00d\x00\ + \x00I\x00t\x00a\x00l\x00i\x00c\x00 \x00\ +B\x00u\x00i\x00l\x00d\x00 \x001\x000\x00\ +0\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\ + \x001\x00.\x001\x000\x00O\x00p\x00e\x00\ +n\x00S\x00a\x00n\x00s\x00-\x00S\x00e\x00\ +m\x00i\x00b\x00o\x00l\x00d\x00I\x00t\x00\ +a\x00l\x00i\x00c\x00O\x00p\x00e\x00n\x00\ + \x00S\x00a\x00n\x00s\x00 \x00i\x00s\x00\ + \x00a\x00 \x00t\x00r\x00a\x00d\x00e\x00\ +m\x00a\x00r\x00k\x00 \x00o\x00f\x00 \x00\ +G\x00o\x00o\x00g\x00l\x00e\x00 \x00a\x00\ +n\x00d\x00 \x00m\x00a\x00y\x00 \x00b\x00\ +e\x00 \x00r\x00e\x00g\x00i\x00s\x00t\x00\ +e\x00r\x00e\x00d\x00 \x00i\x00n\x00 \x00\ +c\x00e\x00r\x00t\x00a\x00i\x00n\x00 \x00\ +j\x00u\x00r\x00i\x00s\x00d\x00i\x00c\x00\ +t\x00i\x00o\x00n\x00s\x00.\x00A\x00s\x00\ +c\x00e\x00n\x00d\x00e\x00r\x00 \x00C\x00\ +o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\x00\ +o\x00n\x00h\x00t\x00t\x00p\x00:\x00/\x00\ +/\x00w\x00w\x00w\x00.\x00a\x00s\x00c\x00\ +e\x00n\x00d\x00e\x00r\x00c\x00o\x00r\x00\ +p\x00.\x00c\x00o\x00m\x00/\x00h\x00t\x00\ +t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00\ +.\x00a\x00s\x00c\x00e\x00n\x00d\x00e\x00\ +r\x00c\x00o\x00r\x00p\x00.\x00c\x00o\x00\ +m\x00/\x00t\x00y\x00p\x00e\x00d\x00e\x00\ +s\x00i\x00g\x00n\x00e\x00r\x00s\x00.\x00\ +h\x00t\x00m\x00l\x00L\x00i\x00c\x00e\x00\ +n\x00s\x00e\x00d\x00 \x00u\x00n\x00d\x00\ +e\x00r\x00 \x00t\x00h\x00e\x00 \x00A\x00\ +p\x00a\x00c\x00h\x00e\x00 \x00L\x00i\x00\ +c\x00e\x00n\x00s\x00e\x00,\x00 \x00V\x00\ +e\x00r\x00s\x00i\x00o\x00n\x00 \x002\x00\ +.\x000\x00h\x00t\x00t\x00p\x00:\x00/\x00\ +/\x00w\x00w\x00w\x00.\x00a\x00p\x00a\x00\ +c\x00h\x00e\x00.\x00o\x00r\x00g\x00/\x00\ +l\x00i\x00c\x00e\x00n\x00s\x00e\x00s\x00\ +/\x00L\x00I\x00C\x00E\x00N\x00S\x00E\x00\ +-\x002\x00.\x000\x00\x02\x00\x00\xff\xf4\x00\x00\xff\ +f\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x03\xaa\x01\x02\x01\x03\x01\x04\x01\ +\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\ +\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\ +\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\ +\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\x22\x01#\x01$\x01\ +%\x01&\x01'\x01(\x01)\x01*\x01+\x01,\x01\ +-\x01.\x01/\x010\x011\x012\x013\x014\x01\ +5\x016\x017\x018\x019\x01:\x01;\x01<\x01\ +=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01\ +E\x01F\x01G\x01H\x01I\x01J\x01K\x01L\x01\ +M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01\ +U\x01V\x01W\x01X\x01Y\x01Z\x01[\x01\x5c\x01\ +]\x01^\x01_\x01`\x01a\x01b\x01c\x01d\x01\ +e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01\ +m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01\ +u\x01v\x01w\x01x\x01y\x01z\x01{\x01|\x01\ +}\x01~\x01\x7f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\ +\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\ +\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\ +\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\ +\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\ +\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\ +\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\ +\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\ +\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\ +\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\ +\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\ +\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\ +\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\ +\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\ +\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\ +\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\ +\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\ +\x05\x02\x06\x02\x07\x02\x08\x02\x09\x02\x0a\x02\x0b\x02\x0c\x02\ +\x0d\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\ +\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\ +\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\x22\x02#\x02$\x02\ +%\x02&\x02'\x02(\x02)\x02*\x02+\x02,\x02\ +-\x02.\x02/\x020\x021\x022\x023\x024\x02\ +5\x026\x027\x028\x029\x02:\x02;\x02<\x02\ +=\x02>\x02?\x02@\x02A\x02B\x02C\x02D\x02\ +E\x02F\x02G\x02H\x02I\x02J\x02K\x02L\x02\ +M\x02N\x02O\x02P\x02Q\x02R\x02S\x02T\x02\ +U\x02V\x02W\x02X\x02Y\x02Z\x02[\x02\x5c\x02\ +]\x02^\x02_\x02`\x02a\x02b\x02c\x02d\x02\ +e\x02f\x02g\x02h\x02i\x02j\x02k\x02l\x02\ +m\x02n\x02o\x02p\x02q\x02r\x02s\x02t\x02\ +u\x02v\x02w\x02x\x02y\x02z\x02{\x02|\x02\ +}\x02~\x02\x7f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\ +\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\ +\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\ +\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\ +\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\ +\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\ +\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\ +\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\ +\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\ +\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\ +\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\ +\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\ +\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\ +\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\ +\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\ +\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\ +\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\ +\x05\x03\x06\x03\x07\x03\x08\x03\x09\x03\x0a\x03\x0b\x03\x0c\x03\ +\x0d\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\ +\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\ +\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\x22\x03#\x03$\x03\ +%\x03&\x03'\x03(\x03)\x03*\x03+\x03,\x03\ +-\x03.\x03/\x030\x031\x032\x033\x034\x03\ +5\x036\x037\x038\x039\x03:\x03;\x03<\x03\ +=\x03>\x03?\x03@\x03A\x03B\x03C\x03D\x03\ +E\x03F\x03G\x03H\x03I\x03J\x03K\x03L\x03\ +M\x03N\x03O\x03P\x03Q\x03R\x03S\x03T\x03\ +U\x03V\x03W\x03X\x03Y\x03Z\x03[\x03\x5c\x03\ +]\x03^\x03_\x03`\x03a\x03b\x03c\x03d\x03\ +e\x03f\x03g\x03h\x03i\x03j\x03k\x03l\x03\ +m\x03n\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x03v\x03w\x03x\x03y\x03z\x03{\x03|\x03\ +}\x03~\x03\x7f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\ +\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\ +\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\ +\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\ +\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\ +\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\ +\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\ +\xb5\x03\xb6\x03\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\ +\xbd\x03\xbe\x03\xbf\x03\xc0\x03\xc1\x03\xc2\x03\xc3\x03\xc4\x03\ +\xc5\x03\xc6\x03\xc7\x03\xc8\x03\xc9\x03\xca\x03\xcb\x03\xcc\x03\ +\xcd\x03\xce\x03\xcf\x03\xd0\x03\xd1\x03\xd2\x03\xd3\x03\xd4\x03\ +\xd5\x03\xd6\x03\xd7\x03\xd8\x03\xd9\x03\xda\x03\xdb\x03\xdc\x03\ +\xdd\x03\xde\x03\xdf\x03\xe0\x03\xe1\x03\xe2\x03\xe3\x03\xe4\x03\ +\xe5\x03\xe6\x03\xe7\x03\xe8\x03\xe9\x03\xea\x03\xeb\x03\xec\x03\ +\xed\x03\xee\x03\xef\x03\xf0\x03\xf1\x03\xf2\x03\xf3\x03\xf4\x03\ +\xf5\x03\xf6\x03\xf7\x03\xf8\x03\xf9\x03\xfa\x03\xfb\x03\xfc\x03\ +\xfd\x03\xfe\x03\xff\x04\x00\x04\x01\x04\x02\x04\x03\x04\x04\x04\ +\x05\x04\x06\x04\x07\x04\x08\x04\x09\x04\x0a\x04\x0b\x04\x0c\x04\ +\x0d\x04\x0e\x04\x0f\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\ +\x15\x04\x16\x04\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\ +\x1d\x04\x1e\x04\x1f\x04 \x04!\x04\x22\x04#\x04$\x04\ +%\x04&\x04'\x04(\x04)\x04*\x04+\x04,\x04\ +-\x04.\x04/\x040\x041\x042\x043\x044\x04\ +5\x046\x047\x048\x049\x04:\x04;\x04<\x04\ +=\x04>\x04?\x04@\x04A\x04B\x04C\x04D\x04\ +E\x04F\x04G\x04H\x04I\x04J\x04K\x04L\x04\ +M\x04N\x04O\x04P\x04Q\x04R\x04S\x04T\x04\ +U\x04V\x04W\x04X\x04Y\x04Z\x04[\x04\x5c\x04\ +]\x04^\x04_\x04`\x04a\x04b\x04c\x04d\x04\ +e\x04f\x04g\x04h\x04i\x04j\x04k\x04l\x04\ +m\x04n\x04o\x04p\x04q\x04r\x04s\x04t\x04\ +u\x04v\x04w\x04x\x04y\x04z\x04{\x04|\x04\ +}\x04~\x04\x7f\x04\x80\x04\x81\x04\x82\x04\x83\x04\x84\x04\ +\x85\x04\x86\x04\x87\x04\x88\x04\x89\x04\x8a\x04\x8b\x04\x8c\x04\ +\x8d\x04\x8e\x04\x8f\x04\x90\x04\x91\x04\x92\x04\x93\x04\x94\x04\ +\x95\x04\x96\x04\x97\x04\x98\x04\x99\x04\x9a\x04\x9b\x04\x9c\x04\ +\x9d\x04\x9e\x04\x9f\x04\xa0\x04\xa1\x04\xa2\x04\xa3\x04\xa4\x04\ +\xa5\x04\xa6\x04\xa7\x04\xa8\x04\xa9\x04\xaa\x04\xab\x07.n\ +otdef\x04null\x10nonma\ +rkingreturn\x05spac\ +e\x06exclam\x08quotedb\ +l\x0anumbersign\x06dol\ +lar\x07percent\x09ampe\ +rsand\x0bquotesingl\ +e\x09parenleft\x0apare\ +nright\x08asterisk\x04\ +plus\x05comma\x06hyphe\ +n\x06period\x05slash\x04z\ +ero\x03one\x03two\x05thre\ +e\x04four\x04five\x03six\x05\ +seven\x05eight\x04nine\ +\x05colon\x09semicolon\ +\x04less\x05equal\x07grea\ +ter\x08question\x02at\x01\ +A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x05\ +I.alt\x01J\x01K\x01L\x01M\x01N\x01\ +O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01\ +W\x01X\x01Y\x01Z\x0bbracketl\ +eft\x09backslash\x0cbr\ +acketright\x0bascii\ +circum\x0aunderscor\ +e\x05grave\x01a\x01b\x01c\x01d\x01\ +e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01\ +m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01\ +u\x01v\x01w\x01x\x01y\x01z\x09brac\ +eleft\x03bar\x0abracer\ +ight\x0aasciitilde\x10\ +nonbreakingspace\ +\x0aexclamdown\x04cent\ +\x08sterling\x08curren\ +cy\x03yen\x09brokenbar\ +\x07section\x08dieresi\ +s\x09copyright\x0bordf\ +eminine\x0dguillemo\ +tleft\x0alogicalnot\ +\x07uni00AD\x0aregiste\ +red\x09overscore\x06de\ +gree\x09plusminus\x0bt\ +wosuperior\x0dthree\ +superior\x05acute\x02m\ +u\x09paragraph\x0eperi\ +odcentered\x07cedil\ +la\x0bonesuperior\x0co\ +rdmasculine\x0eguil\ +lemotright\x0aonequ\ +arter\x07onehalf\x0dth\ +reequarters\x0cques\ +tiondown\x06Agrave\x06\ +Aacute\x0bAcircumfl\ +ex\x06Atilde\x09Adiere\ +sis\x05Aring\x02AE\x08Cce\ +dilla\x06Egrave\x06Eac\ +ute\x0bEcircumflex\x09\ +Edieresis\x0aIgrave\ +.alt\x0aIacute.alt\x0f\ +Icircumflex.alt\x0d\ +Idieresis.alt\x03Et\ +h\x06Ntilde\x06Ograve\x06\ +Oacute\x0bOcircumfl\ +ex\x06Otilde\x09Odiere\ +sis\x08multiply\x06Osl\ +ash\x06Ugrave\x06Uacut\ +e\x0bUcircumflex\x09Ud\ +ieresis\x06Yacute\x05T\ +horn\x0agermandbls\x06\ +agrave\x06aacute\x0bac\ +ircumflex\x06atilde\ +\x09adieresis\x05aring\ +\x02ae\x08ccedilla\x06egr\ +ave\x06eacute\x0becirc\ +umflex\x09edieresis\ +\x06igrave\x06iacute\x0bi\ +circumflex\x09idier\ +esis\x03eth\x06ntilde\x06\ +ograve\x06oacute\x0boc\ +ircumflex\x06otilde\ +\x09odieresis\x06divid\ +e\x06oslash\x06ugrave\x06\ +uacute\x0bucircumfl\ +ex\x09udieresis\x06yac\ +ute\x05thorn\x09ydiere\ +sis\x07Amacron\x07amac\ +ron\x06Abreve\x06abrev\ +e\x07Aogonek\x07aogone\ +k\x06Cacute\x06cacute\x0b\ +Ccircumflex\x0bccir\ +cumflex\x04Cdot\x04cdo\ +t\x06Ccaron\x06ccaron\x06\ +Dcaron\x06dcaron\x06Dc\ +roat\x06dcroat\x07Emac\ +ron\x07emacron\x06Ebre\ +ve\x06ebreve\x0aEdotac\ +cent\x0aedotaccent\x07\ +Eogonek\x07eogonek\x06\ +Ecaron\x06ecaron\x0bGc\ +ircumflex\x0bgcircu\ +mflex\x06Gbreve\x06gbr\ +eve\x04Gdot\x04gdot\x0cGc\ +ommaaccent\x0cgcomm\ +aaccent\x0bHcircumf\ +lex\x0bhcircumflex\x04\ +Hbar\x04hbar\x0aItilde\ +.alt\x06itilde\x0bImac\ +ron.alt\x07imacron\x0a\ +Ibreve.alt\x06ibrev\ +e\x0bIogonek.alt\x07io\ +gonek\x0eIdotaccent\ +.alt\x08dotlessi\x06IJ\ +.alt\x02ij\x0bJcircumf\ +lex\x0bjcircumflex\x0c\ +Kcommaaccent\x0ckco\ +mmaaccent\x0ckgreen\ +landic\x06Lacute\x06la\ +cute\x0cLcommaaccen\ +t\x0clcommaaccent\x06L\ +caron\x06lcaron\x04Ldo\ +t\x04ldot\x06Lslash\x06ls\ +lash\x06Nacute\x06nacu\ +te\x0cNcommaaccent\x0c\ +ncommaaccent\x06Nca\ +ron\x06ncaron\x0bnapos\ +trophe\x03Eng\x03eng\x07O\ +macron\x07omacron\x06O\ +breve\x06obreve\x0dOhu\ +ngarumlaut\x0dohung\ +arumlaut\x02OE\x02oe\x06R\ +acute\x06racute\x0cRco\ +mmaaccent\x0crcomma\ +accent\x06Rcaron\x06rc\ +aron\x06Sacute\x06sacu\ +te\x0bScircumflex\x0bs\ +circumflex\x08Scedi\ +lla\x08scedilla\x06Sca\ +ron\x06scaron\x0cTcomm\ +aaccent\x0ctcommaac\ +cent\x06Tcaron\x06tcar\ +on\x04Tbar\x04tbar\x06Uti\ +lde\x06utilde\x07Umacr\ +on\x07umacron\x06Ubrev\ +e\x06ubreve\x05Uring\x05u\ +ring\x0dUhungarumla\ +ut\x0duhungarumlaut\ +\x07Uogonek\x07uogonek\ +\x0bWcircumflex\x0bwci\ +rcumflex\x0bYcircum\ +flex\x0bycircumflex\ +\x09Ydieresis\x06Zacut\ +e\x06zacute\x0aZdotacc\ +ent\x0azdotaccent\x06Z\ +caron\x06zcaron\x05lon\ +gs\x06florin\x0aAringa\ +cute\x0aaringacute\x07\ +AEacute\x07aeacute\x0b\ +Oslashacute\x0bosla\ +shacute\x0cScommaac\ +cent\x0cscommaaccen\ +t\x0acircumflex\x05car\ +on\x06macron\x05breve\x09\ +dotaccent\x04ring\x06o\ +gonek\x05tilde\x0chung\ +arumlaut\x05tonos\x0dd\ +ieresistonos\x0aAlp\ +hatonos\x09anotelei\ +a\x0cEpsilontonos\x08E\ +tatonos\x0dIotatono\ +s.alt\x0cOmicronton\ +os\x0cUpsilontonos\x0a\ +Omegatonos\x11iotad\ +ieresistonos\x05Alp\ +ha\x04Beta\x05Gamma\x07un\ +i0394\x07Epsilon\x04Ze\ +ta\x03Eta\x05Theta\x08Iot\ +a.alt\x05Kappa\x06Lamb\ +da\x02Mu\x02Nu\x02Xi\x07Omic\ +ron\x02Pi\x03Rho\x05Sigma\ +\x03Tau\x07Upsilon\x03Phi\ +\x03Chi\x03Psi\x07uni03A9\ +\x10Iotadieresis.al\ +t\x0fUpsilondieresi\ +s\x0aalphatonos\x0ceps\ +ilontonos\x08etaton\ +os\x09iotatonos\x14ups\ +ilondieresistono\ +s\x05alpha\x04beta\x05gam\ +ma\x05delta\x07epsilon\ +\x04zeta\x03eta\x05theta\x04\ +iota\x05kappa\x06lambd\ +a\x07uni03BC\x02nu\x02xi\x07\ +omicron\x02pi\x03rho\x06s\ +igma1\x05sigma\x03tau\x07\ +upsilon\x03phi\x03chi\x03\ +psi\x05omega\x0ciotadi\ +eresis\x0fupsilondi\ +eresis\x0comicronto\ +nos\x0cupsilontonos\ +\x0aomegatonos\x09afii\ +10023\x09afii10051\x09\ +afii10052\x09afii10\ +053\x09afii10054\x0daf\ +ii10055.alt\x0dafii\ +10056.alt\x09afii10\ +057\x09afii10058\x09af\ +ii10059\x09afii1006\ +0\x09afii10061\x09afii\ +10062\x09afii10145\x09\ +afii10017\x09afii10\ +018\x09afii10019\x09af\ +ii10020\x09afii1002\ +1\x09afii10022\x09afii\ +10024\x09afii10025\x09\ +afii10026\x09afii10\ +027\x09afii10028\x09af\ +ii10029\x09afii1003\ +0\x09afii10031\x09afii\ +10032\x09afii10033\x09\ +afii10034\x09afii10\ +035\x09afii10036\x09af\ +ii10037\x09afii1003\ +8\x09afii10039\x09afii\ +10040\x09afii10041\x09\ +afii10042\x09afii10\ +043\x09afii10044\x09af\ +ii10045\x09afii1004\ +6\x09afii10047\x09afii\ +10048\x09afii10049\x09\ +afii10065\x09afii10\ +066\x09afii10067\x09af\ +ii10068\x09afii1006\ +9\x09afii10070\x09afii\ +10072\x09afii10073\x09\ +afii10074\x09afii10\ +075\x09afii10076\x09af\ +ii10077\x09afii1007\ +8\x09afii10079\x09afii\ +10080\x09afii10081\x09\ +afii10082\x09afii10\ +083\x09afii10084\x09af\ +ii10085\x09afii1008\ +6\x09afii10087\x09afii\ +10088\x09afii10089\x09\ +afii10090\x09afii10\ +091\x09afii10092\x09af\ +ii10093\x09afii1009\ +4\x09afii10095\x09afii\ +10096\x09afii10097\x09\ +afii10071\x09afii10\ +099\x09afii10100\x09af\ +ii10101\x09afii1010\ +2\x09afii10103\x09afii\ +10104\x09afii10105\x09\ +afii10106\x09afii10\ +107\x09afii10108\x09af\ +ii10109\x09afii1011\ +0\x09afii10193\x09afii\ +10050\x09afii10098\x06\ +Wgrave\x06wgrave\x06Wa\ +cute\x06wacute\x09Wdie\ +resis\x09wdieresis\x06\ +Ygrave\x06ygrave\x06en\ +dash\x06emdash\x09afii\ +00208\x0dunderscore\ +dbl\x09quoteleft\x0aqu\ +oteright\x0equotesi\ +nglbase\x0dquoterev\ +ersed\x0cquotedblle\ +ft\x0dquotedblright\ +\x0cquotedblbase\x06da\ +gger\x09daggerdbl\x06b\ +ullet\x08ellipsis\x0bp\ +erthousand\x06minut\ +e\x06second\x0dguilsin\ +glleft\x0eguilsingl\ +right\x09exclamdbl\x08\ +fraction\x09nsuperi\ +or\x05franc\x09afii089\ +41\x06peseta\x04Euro\x09a\ +fii61248\x09afii612\ +89\x09afii61352\x09tra\ +demark\x05Omega\x09est\ +imated\x09oneeighth\ +\x0cthreeeighths\x0bfi\ +veeighths\x0csevene\ +ighths\x0bpartialdi\ +ff\x05Delta\x07product\ +\x09summation\x05minus\ +\x07radical\x08infinit\ +y\x08integral\x0bappro\ +xequal\x08notequal\x09\ +lessequal\x0cgreate\ +requal\x07lozenge\x07u\ +niFB01\x07uniFB02\x0dc\ +yrillicbreve\x08dot\ +lessj\x10caroncomma\ +accent\x0bcommaacce\ +nt\x11commaaccentro\ +tate\x0czerosuperio\ +r\x0cfoursuperior\x0cf\ +ivesuperior\x0bsixs\ +uperior\x0dsevensup\ +erior\x0deightsuper\ +ior\x0cninesuperior\ +\x07uni2000\x07uni2001\ +\x07uni2002\x07uni2003\ +\x07uni2004\x07uni2005\ +\x07uni2006\x07uni2007\ +\x07uni2008\x07uni2009\ +\x07uni200A\x07uni200B\ +\x07uniFEFF\x07uniFFFC\ +\x07uniFFFD\x07uni01F0\ +\x07uni02BC\x07uni03D1\ +\x07uni03D2\x07uni03D6\ +\x07uni1E3E\x07uni1E3F\ +\x07uni1E00\x07uni1E01\ +\x07uni1F4D\x07uni02F3\ +\x09dasiaoxia\x07uniFB\ +03\x07uniFB04\x05Ohorn\ +\x05ohorn\x05Uhorn\x05uho\ +rn\x07uni0300\x07uni03\ +01\x07uni0303\x04hook\x08\ +dotbelow\x07uni0400\ +\x07uni040D\x07uni0450\ +\x07uni045D\x07uni0460\ +\x07uni0461\x07uni0462\ +\x07uni0463\x07uni0464\ +\x07uni0465\x07uni0466\ +\x07uni0467\x07uni0468\ +\x07uni0469\x07uni046A\ +\x07uni046B\x07uni046C\ +\x07uni046D\x07uni046E\ +\x07uni046F\x07uni0470\ +\x07uni0471\x07uni0472\ +\x07uni0473\x07uni0474\ +\x07uni0475\x07uni0476\ +\x07uni0477\x07uni0478\ +\x07uni0479\x07uni047A\ +\x07uni047B\x07uni047C\ +\x07uni047D\x07uni047E\ +\x07uni047F\x07uni0480\ +\x07uni0481\x07uni0482\ +\x07uni0483\x07uni0484\ +\x07uni0485\x07uni0486\ +\x07uni0488\x07uni0489\ +\x07uni048A\x07uni048B\ +\x07uni048C\x07uni048D\ +\x07uni048E\x07uni048F\ +\x07uni0492\x07uni0493\ +\x07uni0494\x07uni0495\ +\x07uni0496\x07uni0497\ +\x07uni0498\x07uni0499\ +\x07uni049A\x07uni049B\ +\x07uni049C\x07uni049D\ +\x07uni049E\x07uni049F\ +\x07uni04A0\x07uni04A1\ +\x07uni04A2\x07uni04A3\ +\x07uni04A4\x07uni04A5\ +\x07uni04A6\x07uni04A7\ +\x07uni04A8\x07uni04A9\ +\x07uni04AA\x07uni04AB\ +\x07uni04AC\x07uni04AD\ +\x07uni04AE\x07uni04AF\ +\x07uni04B0\x07uni04B1\ +\x07uni04B2\x07uni04B3\ +\x07uni04B4\x07uni04B5\ +\x07uni04B6\x07uni04B7\ +\x07uni04B8\x07uni04B9\ +\x07uni04BA\x07uni04BB\ +\x07uni04BC\x07uni04BD\ +\x07uni04BE\x07uni04BF\ +\x0buni04C0.alt\x07uni\ +04C1\x07uni04C2\x07uni\ +04C3\x07uni04C4\x07uni\ +04C5\x07uni04C6\x07uni\ +04C7\x07uni04C8\x07uni\ +04C9\x07uni04CA\x07uni\ +04CB\x07uni04CC\x07uni\ +04CD\x07uni04CE\x0buni\ +04CF.alt\x07uni04D0\ +\x07uni04D1\x07uni04D2\ +\x07uni04D3\x07uni04D4\ +\x07uni04D5\x07uni04D6\ +\x07uni04D7\x07uni04D8\ +\x07uni04D9\x07uni04DA\ +\x07uni04DB\x07uni04DC\ +\x07uni04DD\x07uni04DE\ +\x07uni04DF\x07uni04E0\ +\x07uni04E1\x07uni04E2\ +\x07uni04E3\x07uni04E4\ +\x07uni04E5\x07uni04E6\ +\x07uni04E7\x07uni04E8\ +\x07uni04E9\x07uni04EA\ +\x07uni04EB\x07uni04EC\ +\x07uni04ED\x07uni04EE\ +\x07uni04EF\x07uni04F0\ +\x07uni04F1\x07uni04F2\ +\x07uni04F3\x07uni04F4\ +\x07uni04F5\x07uni04F6\ +\x07uni04F7\x07uni04F8\ +\x07uni04F9\x07uni04FA\ +\x07uni04FB\x07uni04FC\ +\x07uni04FD\x07uni04FE\ +\x07uni04FF\x07uni0500\ +\x07uni0501\x07uni0502\ +\x07uni0503\x07uni0504\ +\x07uni0505\x07uni0506\ +\x07uni0507\x07uni0508\ +\x07uni0509\x07uni050A\ +\x07uni050B\x07uni050C\ +\x07uni050D\x07uni050E\ +\x07uni050F\x07uni0510\ +\x07uni0511\x07uni0512\ +\x07uni0513\x07uni1EA0\ +\x07uni1EA1\x07uni1EA2\ +\x07uni1EA3\x07uni1EA4\ +\x07uni1EA5\x07uni1EA6\ +\x07uni1EA7\x07uni1EA8\ +\x07uni1EA9\x07uni1EAA\ +\x07uni1EAB\x07uni1EAC\ +\x07uni1EAD\x07uni1EAE\ +\x07uni1EAF\x07uni1EB0\ +\x07uni1EB1\x07uni1EB2\ +\x07uni1EB3\x07uni1EB4\ +\x07uni1EB5\x07uni1EB6\ +\x07uni1EB7\x07uni1EB8\ +\x07uni1EB9\x07uni1EBA\ +\x07uni1EBB\x07uni1EBC\ +\x07uni1EBD\x07uni1EBE\ +\x07uni1EBF\x07uni1EC0\ +\x07uni1EC1\x07uni1EC2\ +\x07uni1EC3\x07uni1EC4\ +\x07uni1EC5\x07uni1EC6\ +\x07uni1EC7\x0buni1EC8\ +.alt\x07uni1EC9\x0buni\ +1ECA.alt\x07uni1ECB\ +\x07uni1ECC\x07uni1ECD\ +\x07uni1ECE\x07uni1ECF\ +\x07uni1ED0\x07uni1ED1\ +\x07uni1ED2\x07uni1ED3\ +\x07uni1ED4\x07uni1ED5\ +\x07uni1ED6\x07uni1ED7\ +\x07uni1ED8\x07uni1ED9\ +\x07uni1EDA\x07uni1EDB\ +\x07uni1EDC\x07uni1EDD\ +\x07uni1EDE\x07uni1EDF\ +\x07uni1EE0\x07uni1EE1\ +\x07uni1EE2\x07uni1EE3\ +\x07uni1EE4\x07uni1EE5\ +\x07uni1EE6\x07uni1EE7\ +\x07uni1EE8\x07uni1EE9\ +\x07uni1EEA\x07uni1EEB\ +\x07uni1EEC\x07uni1EED\ +\x07uni1EEE\x07uni1EEF\ +\x07uni1EF0\x07uni1EF1\ +\x07uni1EF4\x07uni1EF5\ +\x07uni1EF6\x07uni1EF7\ +\x07uni1EF8\x07uni1EF9\ +\x07uni20AB\x07uni030F\ +\x13circumflexacute\ +comb\x13circumflexg\ +ravecomb\x12circumf\ +lexhookcomb\x13circ\ +umflextildecomb\x0e\ +breveacutecomb\x0eb\ +revegravecomb\x0dbr\ +evehookcomb\x0ebrev\ +etildecomb\x10cyril\ +lichookleft\x11cyri\ +llicbighookUC\x11cy\ +rillicbighookLC\x08\ +one.pnum\x07zero.os\ +\x06one.os\x06two.os\x08t\ +hree.os\x07four.os\x07\ +five.os\x06six.os\x08s\ +even.os\x08eight.os\ +\x07nine.os\x02ff\x07uni2\ +120\x08Tcedilla\x08tce\ +dilla\x05g.alt\x0fgcir\ +cumflex.alt\x0agbre\ +ve.alt\x08gdot.alt\x10\ +gcommaaccent.alt\ +\x01I\x06Igrave\x06Iacute\ +\x0bIcircumflex\x09Idi\ +eresis\x06Itilde\x07Im\ +acron\x06Ibreve\x07Iog\ +onek\x0aIdotaccent\x02\ +IJ\x09Iotatonos\x04Iot\ +a\x0cIotadieresis\x09a\ +fii10055\x09afii100\ +56\x07uni04C0\x07uni04\ +CF\x07uni1EC8\x07uni1E\ +CA\x00\x00\x01\x00\x02\x00\x08\x00\x0a\xff\xff\x00\x0f\x00\ +\x01\x00\x00\x00\x0c\x00\x00\x00\x16\x00\x00\x00\x02\x00\x01\x00\ +\x00\x03\xa9\x00\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x00\x00\x0a\x004\x006\x00\x01latn\x00\ +\x08\x00\x10\x00\x02MOL \x00\x16ROM \x00\ +\x1c\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\ +\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x00n\x01\ +\xe4\x00\x01latn\x00\x08\x00\x10\x00\x02MOL\ + \x00(ROM \x00B\x00\x00\xff\xff\x00\x09\x00\ +\x03\x00\x08\x00\x0b\x00\x00\x00\x0e\x00\x11\x00\x14\x00\x17\x00\ +\x1a\x00\x00\xff\xff\x00\x0a\x00\x04\x00\x06\x00\x09\x00\x0c\x00\ +\x01\x00\x0f\x00\x12\x00\x15\x00\x18\x00\x1b\x00\x00\xff\xff\x00\ +\x0a\x00\x05\x00\x07\x00\x0a\x00\x0d\x00\x02\x00\x10\x00\x13\x00\ +\x16\x00\x19\x00\x1c\x00\x1dliga\x00\xb0lig\ +a\x00\xb6liga\x00\xbclnum\x00\xc2l\ +num\x00\xc8lnum\x00\xcelocl\x00\ +\xd4locl\x00\xdaonum\x00\xe0onu\ +m\x00\xe8onum\x00\xf0pnum\x00\xf8p\ +num\x00\xfepnum\x01\x04salt\x01\ +\x0asalt\x01\x12salt\x01\x1ass0\ +1\x01\x22ss01\x01*ss01\x012s\ +s02\x01:ss02\x01@ss02\x01\ +Fss03\x01Lss03\x01Rss0\ +3\x01Xtnum\x01^tnum\x01ft\ +num\x01n\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\ +\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x07\x00\x00\x00\ +\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x08\x00\ +\x00\x00\x01\x00\x08\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\ +\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\ +\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\ +\x01\x00\x01\x00\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\ +\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\x0a\x00\x16\x00\ +\x1e\x00&\x00.\x006\x00>\x00F\x00N\x00V\x00\ +^\x00\x01\x00\x00\x00\x01\x00P\x00\x01\x00\x00\x00\x01\x00\ +z\x00\x01\x00\x00\x00\x01\x00\xaa\x00\x01\x00\x00\x00\x01\x00\ +\xc6\x00\x01\x00\x00\x00\x01\x00\xee\x00\x01\x00\x00\x00\x01\x00\ +\xf4\x00\x01\x00\x00\x00\x01\x01\x10\x00\x01\x00\x00\x00\x01\x01\ +\x16\x00\x01\x00\x00\x00\x01\x012\x00\x04\x00\x00\x00\x01\x01\ +H\x00\x02\x00\x10\x00\x05\x03\x91\x03\x92\x03\x93\x03\x94\x03\ +\x95\x00\x02\x00\x05\x00J\x00J\x00\x00\x00\xdf\x00\xdf\x00\ +\x01\x00\xe1\x00\xe1\x00\x02\x00\xe3\x00\xe3\x00\x03\x00\xe5\x00\ +\xe5\x00\x04\x00\x02\x00.\x00\x14\x00,\x00\x8e\x00\x8f\x00\ +\x90\x00\x91\x00\xea\x00\xec\x00\xee\x00\xf0\x00\xf2\x00\xf4\x01\ +Z\x01g\x01w\x01\xa1\x01\xa2\x02\xc9\x02\xd8\x03E\x03\ +G\x00\x02\x00\x01\x03\x96\x03\xa9\x00\x00\x00\x02\x00\x1a\x00\ +\x0a\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\ +\x8a\x03\x8b\x03\x8c\x00\x02\x00\x01\x00\x13\x00\x1c\x00\x00\x00\ +\x02\x00\x1a\x00\x0a\x03\x83\x03\x85\x03\x86\x03\x87\x03\x88\x03\ +\x89\x03\x8a\x03\x8b\x03\x8c\x03\x84\x00\x02\x00\x03\x00\x13\x00\ +\x13\x00\x00\x00\x15\x00\x1c\x00\x01\x03\x82\x03\x82\x00\x09\x00\ +\x02\x00\x08\x00\x01\x03\x82\x00\x01\x00\x01\x00\x14\x00\x02\x00\ +\x1a\x00\x0a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\ +\x19\x00\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\ +\x00\x00\x02\x00\x08\x00\x01\x00\x14\x00\x01\x00\x01\x03\x82\x00\ +\x02\x00\x1a\x00\x0a\x00\x13\x03\x82\x00\x15\x00\x16\x00\x17\x00\ +\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\ +\x8c\x00\x00\x00\x02\x00\x0e\x00\x04\x03\x8f\x03\x90\x01 \x01\ +!\x00\x02\x00\x02\x01$\x01%\x00\x00\x01I\x01J\x00\ +\x02\x00\x01\x006\x00\x01\x00\x08\x00\x05\x00\x0c\x00\x14\x00\ +\x1c\x00\x22\x00(\x02^\x00\x03\x00I\x00O\x02]\x00\ +\x03\x00I\x00L\x03\x8d\x00\x02\x00I\x025\x00\x02\x00\ +O\x024\x00\x02\x00L\x00\x01\x00\x01\x00I\x00\x00\x00\ +\x00\x00\x01\x00\x01\x00\x01\x00\x00\x00\x01\x00\x00\x15^\x00\ +\x00\x00\x14\x00\x00\x00\x00\x00\x00\x15V0\x82\x15R\x06\ +\x09*\x86H\x86\xf7\x0d\x01\x07\x02\xa0\x82\x15C0\x82\ +\x15?\x02\x01\x011\x0b0\x09\x06\x05+\x0e\x03\x02\x1a\ +\x05\x000a\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x04\ +\xa0S0Q0,\x06\x0a+\x06\x01\x04\x01\x827\x02\ +\x01\x1c\xa2\x1e\x80\x1c\x00<\x00<\x00<\x00O\x00b\ +\x00s\x00o\x00l\x00e\x00t\x00e\x00>\x00>\ +\x00>0!0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\ +\x14\x9a3\x08\xd77\xb9yc\xbe\x09\x051:\xa4\xe6\ +\xb2X\xdb;y\xa0\x82\x11]0\x82\x03z0\x82\x02\ +b\xa0\x03\x02\x01\x02\x02\x108%\xd7\xfa\xf8a\xaf\x9e\ +\xf4\x90\xe7&\xb5\xd6Z\xd50\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x000S1\x0b0\x09\x06\x03U\ +\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\ +\x0eVeriSign, Inc.1\ ++0)\x06\x03U\x04\x03\x13\x22VeriSi\ +gn Time Stamping\ + Services CA0\x1e\x17\x0d\ +070615000000Z\x17\x0d1\ +20614235959Z0\x5c1\x0b\ +0\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\ +\x03U\x04\x0a\x13\x0eVeriSign, \ +Inc.1402\x06\x03U\x04\x03\x13+V\ +eriSign Time Sta\ +mping Services S\ +igner - G20\x81\x9f0\x0d\x06\ +\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x00\ +0\x81\x89\x02\x81\x81\x00\xc4\xb5\xf2R\x15\xbc\x88\x86`\ +)\x16J[/K\x91k\x87\x91\xf35TX5\xea\ +\xd16^bMRQ4q\xc2{f\x1d\x89\xc8\xdd\ +*\xc4j\x0a\xf67\xd9\x98t\x91\xf6\x92\xae\xb0\xb5v\ +\x96\xf1\xa9JcEG.k\x0b\x92NK+\x8c\xee\ +XJ\x8b\xd4\x07\xe4\x1a,\xf8\x82\xaaX\xd9\xcdB\xf3\ +-\xc0u\xde\x8d\xab\xc7\x8e\x1d\x9alL\x08\x95\x1e\xde\ +\xdb\xefg\xe1r\xc2I\xc2\x9e`<\xe1\xe2\xbe\x16\xa3\ +cxi\x14{\xad-\x02\x03\x01\x00\x01\xa3\x81\xc40\ +\x81\xc104\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(\ +0&0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18\ +http://ocsp.veri\ +sign.com0\x0c\x06\x03U\x1d\x13\x01\ +\x01\xff\x04\x020\x0003\x06\x03U\x1d\x1f\x04,0\ +*0(\xa0&\xa0$\x86\x22http://\ +crl.verisign.com\ +/tss-ca.crl0\x16\x06\x03U\ +\x1d%\x01\x01\xff\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\ +\x07\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\ +\x02\x06\xc00\x1e\x06\x03U\x1d\x11\x04\x170\x15\xa4\x13\ +0\x111\x0f0\x0d\x06\x03U\x04\x03\x13\x06TSA\ +1-20\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\ +\x05\x00\x03\x82\x01\x01\x00P\xc5K\xc8$\x80\xdf\xe4\x0d\ +$\xc2\xde\x1a\xb1\xa1\x02\xa1\xa6\x82-\x0c\x83\x15\x817\ +\x0a\x82\x0e,\xb0Z\x17a\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\ +\x91\xb3V\x1a@\xa6\xeb\x92\xbe89\xb0u6t:\ +\x98O\xe47\xba\x99\x89\xca\x95B\x1d\xb0\xb9\xc7\xa0\x8d\ +W\xe0\xfa\xd5d\x04B5N\x01\xd13\xa2\x17\xc8M\ +\xaa'\xc7\xf2\xe1\x86L\x028M\x83x\xc6\xfcS\xe0\ +\xeb\xe0\x06\x87\xdd\xa4\x96\x9e^\x0c\x98\xe2\xa5\xbe\xbf\x82\ +\x85\xc3`\xe1\xdf\xad(\xd8\xc7\xa5Kd\xda\xc7\x1b[\ +\xbd\xac9\x08\xd58\x22\xa13\x8b/\x8a\x9a\xeb\xbc\x07\ +!?DA\x09\x07\xb5e\x1c$\xbcH\xd3D\x80\xeb\ +\xa1\xcf\xc9\x02\xb4\x14\xcfT\xc7\x16\xa3\x80\x5c\xf9y>\ +]r}\x88\x17\x9e,C\xa2\xcaS\xce}=\xf6*\ +:\xb8O\x94\x00\xa5m\x0a\x83]\xf9^S\xf4\x18\xb3\ +W\x0fp\xc3\xfb\xf5\xad\x95\xa0\x0e\x17\xde\xc4\x16\x80`\ +\xc9\x0f+n\x86\x04\xf1\xeb\xf4x'\xd1\x05\xc5\xee4\ +[^\xb9I2\xf230\x82\x03\xc40\x82\x03-\xa0\ +\x03\x02\x01\x02\x02\x10G\xbf\x19\x95\xdf\x8dRFC\xf7\ +\xdbmH\x0d1\xa40\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x000\x81\x8b1\x0b0\x09\x06\x03U\x04\ +\x06\x13\x02ZA1\x150\x13\x06\x03U\x04\x08\x13\x0c\ +Western Cape1\x140\x12\ +\x06\x03U\x04\x07\x13\x0bDurbanvil\ +le1\x0f0\x0d\x06\x03U\x04\x0a\x13\x06Tha\ +wte1\x1d0\x1b\x06\x03U\x04\x0b\x13\x14Th\ +awte Certificati\ +on1\x1f0\x1d\x06\x03U\x04\x03\x13\x16Tha\ +wte Timestamping\ + CA0\x1e\x17\x0d031204000\ +000Z\x17\x0d1312032359\ +59Z0S1\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVer\ +iSign, Inc.1+0)\x06\ +\x03U\x04\x03\x13\x22VeriSign T\ +ime Stamping Ser\ +vices CA0\x82\x01\x220\x0d\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x00\ +0\x82\x01\x0a\x02\x82\x01\x01\x00\xa9\xca\xb2\xa4\xcc\xcd \ +\xaf\x0a}\x89\xac\x87u\xf0\xb4N\xf1\xdf\xc1\x0f\xbfg\ +a\xbd\xa3d\x1c\xda\xbb\xf9\xca3\xab\x840\x89X~\ +\x8c\xdbk\xdd6\x9e\x0f\xbf\xd1\xecx\xf2w\xa6~o\ +<\xbf\x93\xaf\x0d\xbah\xf4l\x94\xca\xbdR-\xabH\ +=\xf5\xb6\xd5]_\x1b\x02\x9f\xfa/k\x1e\xa4\xf7\xa3\ +\x9a\xa6\x1a\xc8\x02\xe1\x7fLR\xe3\x0e`\xec@\x1c~\ +\xb9\x0d\xde?\xc7\xb4\xdf\x87\xbd_zj1.\x03\x99\ +\x81\x13\xa8G \xce1s\x0dW-\xcdx43\x95\ +\x12\x99\x12\xb9\xdeh/\xaa\xe6\xe3\xc2\x8a\x8c*\xc3\x8b\ +!\x87f\xbd\x83XWou\xbf<\xaa&\x87]\xca\ +\x10\x15<\x9f\x84\xeaT\xc1\x0an\xc4\xfe\xc5J\xdd\xb9\ +\x07\x11\x97\x22|\xdb>'\xd1\x1ex\xec\x9f1\xc9\xf1\ +\xe6\x22\x19\xdb\xc4\xb3GC\x9a\x1a_\xa0\x1e\x90\xe4^\ +\xf5\xee|\xf1}\xabb\x01\x8f\xf5M\x0b\xde\xd0\x22V\ +\xa8\x95\xcd\xae\x88v\xae\xee\xba\x0d\xf3\xe4M\xd9\xa0\xfb\ +h\xa0\xae\x14;\xb3\x87\xc1\xbb\x02\x03\x01\x00\x01\xa3\x81\ +\xdb0\x81\xd804\x06\x08+\x06\x01\x05\x05\x07\x01\x01\ +\x04(0&0$\x06\x08+\x06\x01\x05\x05\x070\x01\ +\x86\x18http://ocsp.ve\ +risign.com0\x12\x06\x03U\x1d\ +\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x000A\ +\x06\x03U\x1d\x1f\x04:0806\xa04\xa02\x86\ +0http://crl.veri\ +sign.com/ThawteT\ +imestampingCA.cr\ +l0\x13\x06\x03U\x1d%\x04\x0c0\x0a\x06\x08+\x06\ +\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\xff\ +\x04\x04\x03\x02\x01\x060$\x06\x03U\x1d\x11\x04\x1d0\ +\x1b\xa4\x190\x171\x150\x13\x06\x03U\x04\x03\x13\x0c\ +TSA2048-1-530\x0d\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00J\ +k\xf9\xeaX\xc2D\x1c1\x89y\x99+\x96\xbf\x82\xac\ +\x01\xd6\x1cL\xcd\xb0\x8aXn\xdf\x08)\xa3^\xc8\xca\ +\x93\x13\xe7\x04R\x0d\xefG'/\x008\xb0\xe4\xc9\x93\ +N\x9a\xd4\x22b\x15\xf7?7!Op1\x80\xf1\x8b\ +8\x87\xb3\xe8\xe8\x97\x00\xfe\xcfU\x96N$\xd2\xa9'\ +Nz\xae\xb7aA\xf3*\xce\xe7\xc9\xd9^\xdd\xbb+\ +\x85>\xb5\x9d\xb5\xd9\xe1W\xff\xbe\xb4\xc5~\xf5\xcf\x0c\ +\x9e\xf0\x97\xfe+\xd3;R\x1b\x1b8'\xf7?J0\ +\x82\x04\xfc0\x82\x04e\xa0\x03\x02\x01\x02\x02\x10eR\ +&\xe1\xb2.\x18\xe1Y\x0f)\x85\xac\x22\xe7\x5c0\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000_1\ +\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\ +\x06\x03U\x04\x0a\x13\x0eVeriSign,\ + Inc.1705\x06\x03U\x04\x0b\x13.\ +Class 3 Public P\ +rimary Certifica\ +tion Authority0\x1e\ +\x17\x0d090521000000Z\x17\ +\x0d190520235959Z0\x81\ +\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1\x1f0\x1d\x06\x03U\x04\x0b\ +\x13\x16VeriSign Trust\ + Network1;09\x06\x03U\x04\ +\x0b\x132Terms of use \ +at https://www.v\ +erisign.com/rpa \ +(c)09100.\x06\x03U\x04\x03\x13'\ +VeriSign Class 3\ + Code Signing 20\ +09-2 CA0\x82\x01\x220\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\ +\x82\x01\x0a\x02\x82\x01\x01\x00\xbeg\x1d\xb4`\xaa\x10I\ +oV\x17|f\xc9^\x86\x0d\xd5\xf1\xac\xa7q\x83\x8e\ +\x8b\x89\xf8\x88\x04\x89\x15\x06\xba-\x84!\x95\xe4\xd1\x9c\ +PL\xfb\xd2\x22\xbd\xda\xf2\xb25;\x1e\x8f\xc3\x09\xfb\ +\xfc\x13.Z\xbf\x89|=;%\x1e\xf6\xf3X{\x9c\ +\xf4\x01\xb5\xc6\x0a\xb8\x80\xce\xbe'tag'Mj\ +\xe5\xec\x81aXy\xa3\xe0\x17\x10\x12\x15'\xb0\xe1M\ +4\x7f+G D\xb9\xdef$f\x8a\xcdO\xba\x1f\ +\xc58\xc8T\x90\xe1r\xf6\x19fuj\xb9Ih\xcf\ +8y\x0d\xaa0\xa8\xdb,`H\x9e\xd7\xaa\x14\x01\xa9\ +\x83\xd78\x9109\x13\x96\x03:|@T\xb6\xad\xe0\ +/\x1b\x83\xdc\xa8\x11R>\x02\xb3\xd7+\xfd!\xb6\xa7\ +\x5c\xa3\x0f\x0b\xa9\xa6\x10P\x0e4.M\xa7\xce\xc9^\ +%\xd4\x8c\xbc\xf3n|)\xbc\x01]\xfc1\x87Z\xd5\ +\x8c\x85gX\x88\x19\xa0\xbf5\xf0\xea+\xa3!\xe7\x90\ +\xf6\x83\xe5\xa8\xed`x^{`\x83\xfdW\x0b]A\ +\x0dcT`\xd6C!\xef\x02\x03\x01\x00\x01\xa3\x82\x01\ +\xdb0\x82\x01\xd70\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\ +\x080\x06\x01\x01\xff\x02\x01\x000p\x06\x03U\x1d \ +\x04i0g0e\x06\x0b`\x86H\x01\x86\xf8E\x01\ +\x07\x17\x030V0(\x06\x08+\x06\x01\x05\x05\x07\x02\ +\x01\x16\x1chttps://www.v\ +erisign.com/cps0\ +*\x06\x08+\x06\x01\x05\x05\x07\x02\x020\x1e\x1a\x1ch\ +ttps://www.veris\ +ign.com/rpa0\x0e\x06\x03U\ +\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060m\x06\x08+\ +\x06\x01\x05\x05\x07\x01\x0c\x04a0_\xa1]\xa0[0\ +Y0W0U\x16\x09image/gif\ +0!0\x1f0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14\x8f\ +\xe5\xd3\x1a\x86\xac\x8d\x8ek\xc3\xcf\x80j\xd4H\x18,\ +{\x19.0%\x16#http://lo\ +go.verisign.com/\ +vslogo.gif0\x1d\x06\x03U\x1d\ +%\x04\x160\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x02\x06\ +\x08+\x06\x01\x05\x05\x07\x03\x0304\x06\x08+\x06\x01\ +\x05\x05\x07\x01\x01\x04(0&0$\x06\x08+\x06\x01\ +\x05\x05\x070\x01\x86\x18http://oc\ +sp.verisign.com0\ +1\x06\x03U\x1d\x1f\x04*0(0&\xa0$\xa0\x22\ +\x86 http://crl.ver\ +isign.com/pca3.c\ +rl0)\x06\x03U\x1d\x11\x04\x220 \xa4\x1e0\ +\x1c1\x1a0\x18\x06\x03U\x04\x03\x13\x11Clas\ +s3CA2048-1-550\x1d\x06\ +\x03U\x1d\x0e\x04\x16\x04\x14\x97\xd0k\xa8&p\xc8\xa1\ +?\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf20\x0d\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00\x8b\ +\x03\xc0\xdd\x94\xd8A\xa2ai\xb0\x15\xa8x\xc70\xc6\ +\x90<~B\xf7$\xb6\xe4\x83s\x17\x04\x7f\x04\x10\x9c\ +\xa1\xe2\xfa\x81/\xeb\xc0\xcaD\xe7r\xe0P\xb6U\x10\ + \x83n\x96\x92\xe4\x9aQj\xb471\xdc\xa5-\xeb\ +\x8c\x00\xc7\x1dO\xe7M2\xba\x85\xf8N\xbe\xfagU\ +e\xf0j\xbez\xcad8\x1a\x10\x10xEv1\xf3\ +\x86z\x03\x0f`\xc2\xb3]\x9d\xf6\x8bfv\x82\x1bY\ +\xe1\x83\xe5\xbdI\xa58V\xe5\xdeAw\x0eX\x0f0\ +\x82\x05\x130\x82\x03\xfb\xa0\x03\x02\x01\x02\x02\x10f\xe3\ +\xf0gy\xca\x15\x16mPSo\x88\x19\x1a\x830\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\xb6\ +1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x170\ +\x15\x06\x03U\x04\x0a\x13\x0eVeriSign\ +, Inc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\ +\x16VeriSign Trust \ +Network1;09\x06\x03U\x04\x0b\ +\x132Terms of use a\ +t https://www.ve\ +risign.com/rpa (\ +c)09100.\x06\x03U\x04\x03\x13'V\ +eriSign Class 3 \ +Code Signing 200\ +9-2 CA0\x1e\x17\x0d100729\ +000000Z\x17\x0d1208082\ +35959Z0\x81\xd01\x0b0\x09\x06\x03U\ +\x04\x06\x13\x02US1\x160\x14\x06\x03U\x04\x08\x13\ +\x0dMassachusetts1\x0f\ +0\x0d\x06\x03U\x04\x07\x13\x06Woburn1\ +\x1e0\x1c\x06\x03U\x04\x0a\x14\x15Monoty\ +pe Imaging Inc.1\ +>0<\x06\x03U\x04\x0b\x135Digita\ +l ID Class 3 - M\ +icrosoft Softwar\ +e Validation v21\ +\x180\x16\x06\x03U\x04\x0b\x14\x0fType O\ +perations1\x1e0\x1c\x06\x03U\ +\x04\x03\x14\x15Monotype Ima\ +ging Inc.0\x81\x9f0\x0d\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\ +\x81\x89\x02\x81\x81\x00\x94D\xa0\x95i|U\x0d\xd0\xdb\ +\x16\x8d25\x8aL3\xab^ \xa1L\xd7*\x878\ +\xd7\x98\xa5@\xf0\x19I\x0b\x22\x1eSO\xc2C\xa6\xca\ +\x8b\xa9V\xefnH\x06\xa8\x05\x159\x1ec;$\x12\ +\x90\xb9\x98\xcf\xca\x085}r\xe3GW\xfdy\xcb\x8a\ +J\xe7@p-5c\x7f\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\ +\xc9\xfc\x89\xd8\xd7\xa4\xa0\xdb\x09\xf2\xa2\xf2{\xef\xcdu\ +\xc1\xf7ePd\x22\x9d\xbd}\xbc\xad\xb8K\xccXE\ +\x0eM\xd1YLM\x02\x03\x01\x00\x01\xa3\x82\x01\x830\ +\x82\x01\x7f0\x09\x06\x03U\x1d\x13\x04\x020\x000\x0e\ +\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x07\x800D\ +\x06\x03U\x1d\x1f\x04=0;09\xa07\xa05\x86\ +3http://csc3-200\ +9-2-crl.verisign\ +.com/CSC3-2009-2\ +.crl0D\x06\x03U\x1d \x04=0;0\ +9\x06\x0b`\x86H\x01\x86\xf8E\x01\x07\x17\x030*\ +0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1cht\ +tps://www.verisi\ +gn.com/rpa0\x13\x06\x03U\x1d\ +%\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x030\ +u\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04i0g0\ +$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18htt\ +p://ocsp.verisig\ +n.com0?\x06\x08+\x06\x01\x05\x05\x070\ +\x02\x863http://csc3-2\ +009-2-aia.verisi\ +gn.com/CSC3-2009\ +-2.cer0\x1f\x06\x03U\x1d#\x04\x180\ +\x16\x80\x14\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\ +\xc45\x9b\xa4\xa1\x1e\xf20\x11\x06\x09`\x86H\x01\x86\ +\xf8B\x01\x01\x04\x04\x03\x02\x04\x100\x16\x06\x0a+\x06\ +\x01\x04\x01\x827\x02\x01\x1b\x04\x080\x06\x01\x01\x00\x01\ +\x01\xff0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x00\x03\x82\x01\x01\x00N\xe6\x22\x87\xdfgA\x15\x17\xe2\ +\xd2\xee~\x0e\xce\xc2\x99\xd6c\xbd\xf0\xb5\x93\xe5jr\ +b\xe1\xf5\xd2<8\xee\xa8=\x08_\xbaG\x81\x82_\ +[KI\xf4\x1d \xfa\x0f\x93\x09\xd0\x1d\x19VD\x17\ +\xa2\x88\xf3\xfb\x8d\x9d\xae\xf7\x0d5\xde<\x0c\xacD\x94\ +`E*\x9b\xfe\x9boL;\xb14gp\x10\x86\xff\ +Z9\x5cZ\xe3l\x82\xab5|eK\xfd\x98m\xb5\ +\x15\x94I\x9c\x88p\x10\xbe=\xb1b\x95\xb4\xdb\xb4\xd4\ +\xda\xe8\x9dA\x90~\xfe}\xb9\xa4\x92\xebn\xf2\x22\x8a\ +\xc6w6M\x8aZ\x0bS\x051\xd3+(\xafR\xe1\ +\x8dzk\xb5wD\xbd\x0c\xad\xf4]%,\xe3\xcd\x8a\ +0>K\x03\x9cy\xca\xa6N\xae\x0b\xc2\xcc$\x07\x0b\ +\xc1\x94\x82\xf6\x10\xf1\xba\x90\xb6\x9b\x9a\xd8\x5c<\x13\xf1\ +\xea\x02\x06\x18'M<\x89o3\x8a\xd3\x86\xde\xe9X\ +3u=\xeb\x93i\xe2DoN\x00l\xcf\xd5\x85\xda\ +V\xa6\x9a\xa6?\xcbL!h\x90\xf2`\xba\xe1\xe8\x06\ +]9!\x132\xed1\x82\x03g0\x82\x03c\x02\x01\ +\x010\x81\xcb0\x81\xb61\x0b0\x09\x06\x03U\x04\x06\ +\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0eV\ +eriSign, Inc.1\x1f0\ +\x1d\x06\x03U\x04\x0b\x13\x16VeriSign\ + Trust Network1;\ +09\x06\x03U\x04\x0b\x132Terms o\ +f use at https:/\ +/www.verisign.co\ +m/rpa (c)09100.\x06\ +\x03U\x04\x03\x13'VeriSign C\ +lass 3 Code Sign\ +ing 2009-2 CA\x02\x10f\ +\xe3\xf0gy\xca\x15\x16mPSo\x88\x19\x1a\x830\ +\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\xa0p0\x10\x06\x0a\ ++\x06\x01\x04\x01\x827\x02\x01\x0c1\x020\x000\x19\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\x0c\x06\x0a+\ +\x06\x01\x04\x01\x827\x02\x01\x040\x1c\x06\x0a+\x06\x01\ +\x04\x01\x827\x02\x01\x0b1\x0e0\x0c\x06\x0a+\x06\x01\ +\x04\x01\x827\x02\x01\x150#\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x09\x041\x16\x04\x14\xdd\xe7\x87,\xc2h\x9es\ +\xd0Y\x8f\x94\xe5B\xb9\x96\xa1\xef\x91\xeb0\x0d\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80q\x17\ +\x80\xfc,$Tt\x0c|\x0e\xc9E\xa3\xbb\xfez\x5c\ +\xfd\x8dvm\x1efL\xb5\x0f\x9f\xf2\xa5\x0c\xdb\xc5\x0c\ +bR\x89\xad]Gb*h\xba.1\x12\xb10\x91\ +O\x883m\xa6;\xbc6\xd6\x1e\xcc\x04\x1c\x84~\x0e\ +\xaa\x80\xe2\x8c\xc8\x87\xeb\xf5x\xf1\x04h|#\xeb\xae\ +\xb3\xe2\xc3\x1a\xea9\xd2\xdf\xd3d\xcd\xbe\xbc\x03T\x94\ +\xb1y\xdfQ\xeakl$\x1a\xf6\x0e\x8d\xc5\x89\x84\xdb\ +\xa1lh\x14\xcd-EVH\xfa\x8e\xb7\xaf\xe2\xa1\x82\ +\x01\x7f0\x82\x01{\x06\x09*\x86H\x86\xf7\x0d\x01\x09\ +\x061\x82\x01l0\x82\x01h\x02\x01\x010g0S\ +1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x170\ +\x15\x06\x03U\x04\x0a\x13\x0eVeriSign\ +, Inc.1+0)\x06\x03U\x04\x03\x13\ +\x22VeriSign Time S\ +tamping Services\ + CA\x02\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7\ +&\xb5\xd6Z\xd50\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\ +\xa0]0\x18\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\ +\x0b\x06\x09*\x86H\x86\xf7\x0d\x01\x07\x010\x1c\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x09\x051\x0f\x17\x0d110\ +505165511Z0#\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14\xf1\x83\xb7K\xba\ +y#\xc6F\x924\xac\xa5{\xbak>\xfb\xb2\xa20\ +\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\ +\x80Pj\xb8\x03<1\xebw\xbdP\xe2\xe6d\x01%\ +i9\x9d\x7f\xb0Z\xe1\xbd\x00p\x9b&3\xa2\x17\x1d\ +\xe1ZF\x0eJ\xb3\xd8\xc6\xdb\xc5\xac\xf1>\xc1\xf1\xe8\ +PO'\xfa/\x93\xb6\xd3\x81A\x9aZ\xd4\xaf\x96d\ +\xdfb\xd1:\x04\xf58\xc6\x17\xf8\xd8\x9bp.\x91@\ +\xf0\xacam\xe1\xaa\xc4\x0bJ\xc3.\x00w1o{\ +\x15\xc6\xb5\xd1\xac\x80\x9bd\x89\xc1\xee~\xa9\x0eM\xc5\ +#\xef\xe3\x84,\xd3\x0d-~z\x0a\xc9\xc9\xdf(P\ +\x83\x00\x00\ +\x00\x03A,\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIG\xe9\ +IU\x09\x00\x03+\xb8\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03'\x98\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03'\xb8\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03'\xf0\x00\x00\x03\xc6OS/2\xa2\ +y\x98\xcb\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x13\ +g\x19i\x00\x00\x1d\xb4\x00\x00\x00\xacfpgm\xbb\ +s\xa4u\x00\x00\x14\xd0\x00\x00\x07\xe0gasp\x00\ +\x08\x00\x1b\x00\x03'\x8c\x00\x00\x00\x0cglyf\xa3\ +Ig\x1a\x00\x00%\xb8\x00\x01\x1fXhead\xf8\ +\xa8\xf8\xbb\x00\x00\x01<\x00\x00\x006hhea\x10\ +\x80\x11\x22\x00\x00\x01t\x00\x00\x00$hmtx\x11\ +F\x8d\x98\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01E\x10\x00\x01\xb66loca\x1d\ +\x1f\xd4\xe2\x00\x00\x1e`\x00\x00\x07Vmaxp\x05\ +<\x01\xaf\x00\x00\x01\x98\x00\x00\x00 namej\ +\xb3\x9b\xd5\x00\x02\xfbH\x00\x00\x06\x18post\x02\ +7\xefl\x00\x03\x01`\x00\x00&+prep\xe2\ +\xaf\x13\x05\x00\x00\x1c\xb0\x00\x00\x01\x01\x00\x01\x00\x00\x00\ +\x01\x19\x9a:\xb1\x09\x00_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9cI\x1e\x00\x00\x00\x00\xc9\xe8J\xd0\xfb\ +\xe5\xfd\xa8\x0aX\x08\x8d\x00\x03\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x09\xee\xfb\ +\xe5\xfd\xe9\x0aX\x08\x00\x01\xb3\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00W\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +\x07\x00\x9c\x00\x03\x00\x01\x00\x03\x04\xc3\x02\xbc\x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x02\x00\x00\x00\x02\x0b\x08\x06\x03\x05\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00!\x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04^\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc1\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x02J\x00\x19\x03\xa0\x00\xc9\x05\ ++\x00)\x04h\x003\x06\xd9\x00s\x05\xaa\x00D\x02\ +\x0a\x00\xc9\x02\xb6\x00J\x02\xb6\xffm\x04\x5c\x00\xac\x04\ +h\x00m\x029\xff\x9a\x02\x93\x00)\x02H\x00\x19\x03\ +^\xff\xa6\x04h\x00B\x04h\x00\xb6\x04h\xff\xcf\x04\ +h\x00\x0e\x04h\xff\xe7\x04h\x00\x1b\x04h\x00X\x04\ +h\x00N\x04h\x007\x04h\x00V\x02H\x00\x19\x02\ +H\xff\x9a\x04h\x00m\x04h\x00m\x04h\x00m\x03\ +\xac\x00\xa6\x06\xd9\x00\x5c\x05\x06\xff\x85\x04\xf6\x005\x04\ +\xe5\x00{\x05j\x005\x04V\x005\x04?\x005\x05\ +\x85\x00{\x05\x9a\x005\x03\x10\xff\xc5\x02\xa6\xfe\xbe\x04\ +\xe7\x005\x04%\x005\x07\x0a\x005\x06\x0a\x005\x05\ +\xd7\x00{\x04\xa4\x005\x05\xd7\x00{\x04\xdf\x005\x04\ +=\x00)\x04?\x00\xa8\x05\x87\x00\x8d\x04\xb8\x00\xb8\x07\ +'\x00\xb8\x04\xd9\xff\x8b\x04\x83\x00\xba\x04J\xff\xc3\x02\ +\xa6\xff\xdb\x03^\x00\xdd\x02\xa6\xffw\x049\x00\x14\x03\ +3\xffF\x04o\x01\xfc\x04\xc1\x00Z\x04\xc3\x00%\x03\ +\xdd\x00Z\x04\xc1\x00Z\x04u\x00Z\x02\xfc\xff%\x04\ +T\xff\x8d\x04\xd5\x00%\x02`\x00%\x02`\xfe\xf8\x04\ +\x8b\x00%\x02`\x00%\x07=\x00%\x04\xd5\x00%\x04\ +\xae\x00Z\x04\xc3\xff\xbc\x04\xc1\x00Z\x03^\x00%\x03\ +\xc9\x00\x17\x03H\x00^\x04\xd5\x00o\x04\x19\x00f\x06\ +N\x00}\x04?\xff\x9c\x04'\xffs\x03\xa4\xff\xd1\x02\ +\xd7\xff\xf8\x04h\x01\xc7\x02\xd7\xff\x9c\x04h\x00m\x02\ +\x14\x00\x00\x02J\xff\xb6\x04h\x00\xa4\x04h\xff\xf4\x04\ +h\x00s\x04h\x00X\x04h\x01\xc7\x03\xe3\x00\x14\x04\ +o\x01\x8d\x06\xa8\x00}\x03\x04\x00\x98\x04\x7f\x00H\x04\ +h\x00m\x02\x93\x00)\x06\xa8\x00}\x04\x00\xff\xfa\x03\ +m\x00\xa4\x04h\x00m\x03\x08\x00;\x03\x08\x00\x5c\x04\ +o\x01\xe3\x04\xe1\xff\xbc\x05=\x00\x93\x02H\x00\x83\x01\ +\xa4\xff1\x03\x08\x00\x81\x02\xf2\x00\xa2\x04\x7f\x00\x00\x07\ +\x0c\x00a\x07\x0c\x00a\x07\x0c\x00\x85\x03\xac\xff\xbc\x05\ +\x06\xff\x85\x05\x06\xff\x85\x05\x06\xff\x85\x05\x06\xff\x85\x05\ +\x06\xff\x85\x05\x06\xff\x85\x07)\xff\x85\x04\xe5\x00{\x04\ +V\x005\x04V\x005\x04V\x005\x04V\x005\x03\ +\x10\xff\xc5\x03\x10\xff\xc5\x03\x10\xff\xc5\x03\x10\xff\xc5\x05\ +j\x00%\x06\x0a\x005\x05\xd7\x00{\x05\xd7\x00{\x05\ +\xd7\x00{\x05\xd7\x00{\x05\xd7\x00{\x04h\x00\x81\x05\ +\xd7\x00d\x05\x87\x00\x8d\x05\x87\x00\x8d\x05\x87\x00\x8d\x05\ +\x87\x00\x8d\x04\x83\x00\xba\x04\xa4\x005\x05F\xfe\xfc\x04\ +\xc1\x00Z\x04\xc1\x00Z\x04\xc1\x00Z\x04\xc1\x00Z\x04\ +\xc1\x00Z\x04\xc1\x00Z\x06\xfa\x00Z\x03\xdd\x00Z\x04\ +u\x00Z\x04u\x00Z\x04u\x00Z\x04u\x00Z\x02\ +`\x00%\x02`\x00%\x02`\x00$\x02`\x00%\x04\ +\x9e\x00H\x04\xd5\x00%\x04\xae\x00Z\x04\xae\x00Z\x04\ +\xae\x00Z\x04\xae\x00Z\x04\xae\x00Z\x04h\x00m\x04\ +\xae\x00+\x04\xd5\x00o\x04\xd5\x00o\x04\xd5\x00o\x04\ +\xd5\x00o\x04'\xffs\x04\xc3\xff\xbc\x04'\xffs\x05\ +\x06\xff\x85\x04\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x05\ +\x06\xff\x85\x04\xc1\x00Z\x04\xe5\x00{\x03\xdd\x00Z\x04\ +\xe5\x00{\x03\xdd\x00Z\x04\xe5\x00{\x03\xdd\x00Z\x04\ +\xe5\x00{\x03\xdd\x00Z\x05j\x005\x04\xc1\x00Z\x05\ +j\x00%\x04\xc1\x00Z\x04V\x005\x04u\x00Z\x04\ +V\x005\x04u\x00Z\x04V\x005\x04u\x00Z\x04\ +V\x005\x04u\x00Z\x04V\x005\x04u\x00Z\x05\ +\x85\x00{\x04T\xff\x8d\x05\x85\x00{\x04T\xff\x8d\x05\ +\x85\x00{\x04T\xff\x8d\x05\x85\x00{\x04T\xff\x8d\x05\ +\x9a\x005\x04\xd5\x00%\x05\x9a\x005\x04\xd5\x00%\x03\ +\x10\xff\xc5\x02`\x00%\x03\x10\xff\xc5\x02`\x00%\x03\ +\x10\xff\xc5\x02`\x00%\x03\x10\xff\xc5\x02`\xff\xb4\x03\ +\x10\xff\xc5\x02`\x00%\x05\xb6\xff\xc5\x04\xc1\x00%\x02\ +\xa6\xfe\xbe\x02`\xfe\xfa\x04\xe7\x005\x04\x8b\x00%\x04\ +\x8b\x00%\x04%\x005\x02`\x00%\x04%\x005\x02\ +`\xff\x9d\x04%\x005\x02`\x00%\x04%\x005\x03\ +y\x00%\x04'\x00\x00\x02\x9e\x00\x00\x06\x0a\x005\x04\ +\xd5\x00%\x06\x0a\x005\x04\xd5\x00%\x06\x0a\x005\x04\ +\xd5\x00%\x05s\x00\x01\x06\x0a\x005\x04\xd5\x00%\x05\ +\xd7\x00{\x04\xae\x00Z\x05\xd7\x00{\x04\xae\x00Z\x05\ +\xd7\x00{\x04\xae\x00Z\x075\x00{\x07\x0e\x00Z\x04\ +\xdf\x005\x03^\x00%\x04\xdf\x005\x03^\xff\xa1\x04\ +\xdf\x005\x03^\x00%\x04=\x00)\x03\xc9\x00\x17\x04\ +=\x00)\x03\xc9\x00\x17\x04=\x00)\x03\xc9\x00\x17\x04\ +=\x00)\x03\xc9\x00\x17\x04?\x00\x7f\x03H\x008\x04\ +?\x00\xa8\x03H\x00^\x04?\x00\xa6\x03H\x00\x1f\x05\ +\x87\x00\x8d\x04\xd5\x00o\x05\x87\x00\x8d\x04\xd5\x00o\x05\ +\x87\x00\x8d\x04\xd5\x00o\x05\x87\x00\x8d\x04\xd5\x00o\x05\ +\x87\x00\x8d\x04\xd5\x00o\x05\x87\x00\x8d\x04\xd5\x00o\x07\ +'\x00\xb8\x06N\x00}\x04\x83\x00\xba\x04'\xffs\x04\ +\x83\x00\xba\x04J\xff\xc3\x03\xa4\xff\xd1\x04J\xff\xc3\x03\ +\xa4\xff\xd1\x04J\xff\xc3\x03\xa4\xff\xd1\x02\xdd\xff\x0a\x04\ +h\xff\xe1\x05\x06\xff\x85\x04\xb6\x00Z\x07)\xff\x85\x06\ +\xfa\x00Z\x05\xd7\x00d\x04\xae\x00+\x04=\x00)\x03\ +\xc9\x00\x17\x04o\x017\x04o\x01y\x04H\x01\x81\x04\ +o\x01\xae\x02`\x01B\x04\x9e\x02\x14\x01\xa6\xffT\x04\ +o\x01;\x04o\x01\x17\x04o\x025\x04o\x01V\x05\ +\x06\xff\x85\x02H\x00\x83\x05\x0a\x00\x22\x06-\x00\x22\x04\ +\x12\x00\x22\x06N\x00>\x05\xba\x00\x22\x06d\x00>\x02\ +\xf0\x00G\x05\x06\xff\x85\x04\xf6\x005\x04\x06\x005\x04\ +\xd7\xff\xcb\x04V\x005\x04J\xff\xc3\x05\x9a\x005\x05\ +\xf0\x00{\x03\x10\xff\xc5\x04\xe7\x005\x04\xcd\xff\x85\x07\ +\x0a\x005\x06\x0a\x005\x04+\xff\xd5\x05\xd7\x00{\x05\ +\x8f\x005\x04\xa4\x005\x04X\xff\xd5\x04?\x00\xa8\x04\ +\x83\x00\xba\x06\x87\x00{\x04\xd9\xff\x8b\x06\x87\x00\xb2\x05\ +\xcb\xff\xc3\x03\x10\xff\xc5\x04\x83\x00\xba\x04\xd9\x00Z\x04\ +\x1b\x00'\x04\xd5\x00%\x02\xf0\x00`\x04\xee\x00w\x04\ +\xd9\x00Z\x04\xf6\xff\xbe\x04\x19\x00;\x04\xb4\x007\x04\ +\x1b\x00'\x03\xb4\x00Z\x04\xd5\x00%\x04\xae\x00d\x02\ +\xf0\x00`\x04\x8b\x00%\x04\x93\xff\xa4\x04\xe1\xff\xbc\x04\ +f\x00f\x03\xb4\x00\x5c\x04\xae\x00Z\x05\xb8\x00^\x04\ +\xc3\xff\xbe\x03\xb4\x00Z\x04\xf2\x00Z\x03\xfe\x00^\x04\ +\xee\x00w\x06\x1d\x00Z\x04j\xfe\xfc\x06w\x00w\x06\ +\x8f\x00Z\x02\xf0\x00`\x04\xee\x00w\x04\xae\x00Z\x04\ +\xee\x00w\x06\x8f\x00Z\x04V\x005\x05\xf0\x00\xa8\x04\ +\x06\x005\x04\xe5\x00{\x04=\x00)\x03\x10\xff\xc5\x03\ +\x10\xff\xc5\x02\xa6\xfe\xbe\x07\xaa\xff\xc3\x07\x81\x005\x05\ +\xf0\x00\xa8\x04\xc3\x005\x04\xc9\x00\x1f\x05\x8f\x005\x05\ +\x06\xff\x85\x04\xbc\x005\x04\xf6\x005\x04\x06\x005\x05\ +\xc3\xff;\x04V\x005\x06\xf0\xff\x83\x04\xc5\x00)\x06\ +\x0a\x005\x06\x0a\x005\x04\xc3\x005\x05\x8f\xff\xc3\x07\ +\x0a\x005\x05\x9a\x005\x05\xd7\x00{\x05\x8f\x005\x04\ +\xa4\x005\x04\xe5\x00{\x04?\x00\xa8\x04\xc9\x00\x1f\x06\ +\x87\x00{\x04\xd9\xff\x8b\x05\xdd\x005\x05b\x00\xb8\x08\ +\x08\x005\x08V\x005\x05\x91\x00\xa8\x06\xd7\x005\x04\ +\xbc\x005\x04\xe5\x00\x1b\x08\x0c\x005\x04\xe7\xff\x83\x04\ +\xc1\x00Z\x04\xae\x00m\x04\x96\x00Z\x03\xd5\x00\x14\x04\ +\xcf\x00Z\x04u\x00Z\x07\xae\xff\xec\x041\x00\x19\x04\ +\xd5\x00o\x04\xd5\x00o\x04\xa0\x00%\x04\xec\xff\xc5\x06\ +T\x00\x17\x04\xee\x00%\x04\xae\x00Z\x04\xd5\x00%\x04\ +\xc3\xff\xbc\x03\xdd\x00Z\x07=\x00%\x04'\xffs\x06\ +\x1b\x00Z\x04?\xff\x9c\x04\xf6\x00j\x04\xc3\x00\xa4\x07\ +=\x00j\x07^\x00j\x05d\x00\x5c\x06m\x00j\x04\ +\x81\x00h\x03\xdd\x00\x1f\x06\xae\x00%\x04\xa8\xff\xec\x04\ +u\x00Z\x04\xd5\x00%\x03\xd5\x00\x14\x03\xdd\x00Z\x03\ +\xc9\x00\x17\x02`\x00%\x02`\x00%\x02`\xfe\xf8\x06\ +\xe7\xff\xc5\x06\xe7\x001\x04\xd5\x00%\x04\xa0\x00%\x04\ +'\xffs\x04\xd5\x00j\x04\x06\x005\x03\xb4\x00%\x07\ +'\x00\xb8\x06N\x00}\x07'\x00\xb8\x06N\x00}\x07\ +'\x00\xb8\x06N\x00}\x04\x83\x00\xba\x04'\xffs\x03\ +\xd7\x00)\x07\xae\x00)\x07\xae\x00)\x033\xff,\x01\ +\xb8\x00s\x01\xb8\x00j\x029\xff\x9a\x01\xb8\x00\xdf\x03\ +w\x00s\x03w\x00j\x03\xfa\xff\x9a\x04\x0c\x00\xbe\x04\ +!\x00;\x02\xe3\x00h\x06\xaa\x00\x19\x09\xbe\x00s\x02\ +\x0a\x00\xc9\x03\xa0\x00\xc9\x02\x98\x00H\x02\x98\x00\x00\x04\ +}\x00\x19\x01\x00\xfd\xec\x03\x19\x00\x85\x04h\x00\x00\x04\ +h\xff\xf4\x06\xd9\x009\x04h\x00)\x06\x1f\x00{\x04\ +\x00\x00)\x07\xd5\x00\x19\x05\xfe\x00j\x05\xcb\xff\xc3\x04\ +\xf4\x00m\x07\x0c\x00a\x07\x0c\x00\x5c\x07\x0c\x00f\x07\ +\x0c\x00\x94\x04\xa6\x00L\x04\xd7\xff\xcb\x05\xee\x00\xc1\x05\ +\x0c\x00{\x04h\x00m\x04d\x00b\x05\xa8\x00\x85\x03\ +L\x00\x00\x04h\x00m\x04h\x00m\x04h\x00m\x04\ +h\x00m\x04\xaa\x00q\x05H\xff%\x05H\xff%\x04\ +o\x01=\x02`\xfe\xfa\x04\x00\x01\xee\x04\x00\x00{\x04\ +\x00\x01\xd5\x03\x08\x00b\x03\x08\x00/\x03\x08\x00^\x03\ +\x08\x00Z\x03\x08\x00{\x03\x08\x00R\x03\x08\x00Z\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +H\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00T\x08\x00\x00T\x02`\xfe\xfa\x01\ +\xb8\x00j\x05\x8b\x00u\x04\x9a\x00\xb8\x07\x81\x00^\x07\ +\x0a\x005\x07=\x00%\x05\x06\xff\x85\x04\xc1\x00Z\x06\ +;\xfe\xee\x02\xaa\xff\x9a\x02\x00\x00f\x08\x00\xff%\x08\ +\x00\xff%\x06-\x00{\x05%\x00Z\x063\x00\x8d\x05\ +\xb0\x00j\x00\x00\xfc\xef\x00\x00\xfd\xaf\x00\x00\xfc\x80\x00\ +\x00\xfd\xa4\x00\x00\xfcb\x04V\x005\x06\x0a\x005\x04\ +u\x00Z\x04\xd5\x00o\x081\x00\x81\x06\xa4\x00f\x05\ +\x06\x00{\x04\xd3\x00=\x07\x19\x005\x06\x00\x00%\x05\ +Z\xff\x85\x04\xa4\xff\x83\x07d\x005\x06\xb0\x00%\x05\ +\xd7\xff\xaa\x04\xa2\xff\x9a\x07\xe1\x005\x06\xa0\x00%\x04\ +\xc5\xff\xb0\x041\xff\xa4\x06\x87\x00\xb2\x06w\x00w\x05\ +\xd7\x00{\x04\xae\x00Z\x053\x00\xb8\x04^\x00f\x05\ +3\x00\xb8\x04^\x00f\x09\xee\x00{\x08}\x00Z\x06\ +\x0e\x00{\x05\x10\x00Z\x081\x00\x81\x06\xae\x00Z\x08\ +1\x00\x81\x06\xa4\x00f\x04\xe5\x00{\x03\xdd\x00Z\x04\ +\xdf\x00h\x04H\x01-\x04q\x01?\x04o\x02Z\x04\ +o\x02;\x07\xe9\x00)\x07\xa6\x00)\x06\x91\x005\x05\ +\x08\x00j\x04\xbc\x005\x04\x85\x00s\x04\xa4\x005\x04\ +\xc3\xff\xbc\x04\x06\x00\x1d\x03\xb4\xff\xf4\x05T\x005\x04\ +\x96\x00%\x07Z\xff\x83\x07\xae\xff\xec\x04\xc5\x00)\x04\ +1\x00\x19\x05\x7f\x005\x04\xe5\x00%\x04\xc3\x005\x04\ +\xb4\x00Z\x04\xe7\x005\x04\x8b\x00%\x05{\x00\xa8\x05\ +/\x00J\x06!\x005\x05H\x00%\x06)\x005\x05\ +\xb0\x00%\x08B\x005\x06\xe9\x00%\x05\xd7\x00{\x04\ +\xe7\x00Z\x04\xe5\x00{\x03\xdd\x00Z\x04?\x00\xa8\x07\ +h\x00%\x04\x83\x00\xba\x04\x19\x00f\x04\x83\x00L\x04\ +\x19\xff\xc3\x05\x87\xff\x8b\x04\xb4\xff\x9c\x06\xb2\x00\xa8\x05\ +u\x00\x5c\x05\xfc\x00\xb8\x05\x1d\x00\xa4\x05b\x00\xb8\x04\ +\xd5\x00\xa4\x05b\x005\x04\xd5\x00%\x06;\x00=\x05\ +J\x00\x14\x06;\x00=\x05J\x00\x14\x03\x10\xff\xc5\x06\ +\xf0\xff\x83\x07\xae\xff\xec\x05\x89\x005\x04\xf4\x00%\x06\ +\x14\xff\xc3\x05F\xff\xc5\x05\x9a\x005\x04\xee\x00%\x06\ +!\x005\x05H\x00%\x05b\x00\xb8\x04\xc3\x00\xa4\x07\ +\x91\x005\x06\xb2\x00\x17\x03\x10\xff\xc5\x05\x06\xff\x85\x04\ +\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x07)\xff\x85\x06\ +\xfa\x00Z\x04V\x005\x04u\x00Z\x05H\x00D\x04\ +u\x003\x05H\x00D\x04u\x003\x06\xf0\xff\x83\x07\ +\xae\xff\xec\x04\xc5\x00)\x041\x00\x19\x04q\xff\xfc\x04\ +`\xff\xa6\x06\x0a\x005\x04\xd5\x00o\x06\x0a\x005\x04\ +\xd5\x00o\x05\xd7\x00{\x04\xae\x00Z\x05\xd7\x00{\x04\ +\xae\x00Z\x05\xd7\x00{\x04\xae\x00Z\x04\xe5\x00\x1b\x03\ +\xdd\x00\x1f\x04\xc9\x00\x1f\x04'\xffs\x04\xc9\x00\x1f\x04\ +'\xffs\x04\xc9\x00\x1f\x04'\xffs\x05b\x00\xb8\x04\ +\xc3\x00\xa4\x04\x06\x005\x03\xb4\x00%\x06\xd7\x005\x06\ +m\x00j\x04\x06\x00\x1d\x03\xb4\xff\xf4\x05\x87\xff\x8b\x04\ +\xcb\xff\x9c\x04\xd9\xff\x8b\x04?\xff\x9c\x04\xa4\x00=\x04\ +\xc1\x00Z\x06\xe9\x00=\x07\x00\x00Z\x06\xe1\x00\xc5\x06\ +\x87\x00\x89\x05B\x00\x83\x04\xd3\x00\xb2\x07\xd5\xff\xc3\x07\ ++\xff\xc5\x07\xdf\x005\x07/\x00%\x05\xe3\x00{\x05\ +\x0c\x00Z\x05\xaa\x00\xa8\x05b\x00^\x04\xb8\x00D\x04\ +\x1b\x00'\x065\xff\xc3\x05\x8b\xff\xc5\x05\x06\xff\x85\x04\ +\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x05\x06\xff\x85\x04\ +\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x05\x06\xff\x85\x04\ +\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x05\x06\xff\x85\x04\ +\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x05\x06\xff\x85\x04\ +\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x05\x06\xff\x85\x04\ +\xc1\x00Z\x05\x06\xff\x85\x04\xc1\x00Z\x04V\x005\x04\ +u\x00Z\x04V\x005\x04u\x00Z\x04V\x005\x04\ +u\x00Z\x04V\x005\x04u\x00Z\x04V\x005\x04\ +u\x00Z\x04V\x005\x04u\x00Z\x04V\x005\x04\ +u\x00Z\x04V\x005\x04u\x00Z\x03\x10\xff\xc5\x02\ +`\x00%\x03\x10\xff\xc5\x02`\xff\xdf\x05\xd7\x00{\x04\ +\xae\x00Z\x05\xd7\x00{\x04\xae\x00Z\x05\xd7\x00{\x04\ +\xae\x00Z\x05\xd7\x00{\x04\xae\x00Z\x05\xd7\x00{\x04\ +\xae\x00Z\x05\xd7\x00{\x04\xae\x00Z\x05\xd7\x00{\x04\ +\xae\x00Z\x06-\x00{\x05%\x00Z\x06-\x00{\x05\ +%\x00Z\x06-\x00{\x05%\x00Z\x06-\x00{\x05\ +%\x00Z\x06-\x00{\x05%\x00Z\x05\x87\x00\x8d\x04\ +\xd5\x00o\x05\x87\x00\x8d\x04\xd5\x00o\x063\x00\x8d\x05\ +\xb0\x00j\x063\x00\x8d\x05\xb0\x00j\x063\x00\x8d\x05\ +\xb0\x00j\x063\x00\x8d\x05\xb0\x00j\x063\x00\x8d\x05\ +\xb0\x00j\x04\x83\x00\xba\x04'\xffs\x04\x83\x00\xba\x04\ +'\xffs\x04\x83\x00\xba\x04'\xffs\x04\xc1\x006\x00\ +\x00\xfc`\x00\x00\xfc\xa8\x00\x00\xfb\xe5\x00\x00\xfc\xa8\x00\ +\x00\xfc\xa8\x00\x00\xfd\x04\x00\x00\xfd\x04\x00\x00\xfd\x04\x00\ +\x00\xfc\xfe\x01\xa6\xffF\x02V\xff`\x02V\xff`\x03\ +\xd9\x00q\x04\xa6\x00Z\x03\x8f\x00'\x04`\xff\xec\x04\ +h\xff\xaf\x04h\xff\xc9\x04N\xff\xe3\x04\x85\x00Z\x04\ +`\x00\x01\x04}\x00?\x04\x9a\x00E\x05\xb4\xff%\x05\ +\xe1\x00\x9e\x04?\x00\x8d\x03H\x00V\x04\xc1\x00\x1b\x04\ +\xc1\x00\x1b\x04\xc1\x00\x1b\x04\xc1\x00\x1b\x04\xc1\x00\x1b\x02\ +\x93\x005\x02\x93\x005\x02\x93\x005\x02\x93\x005\x02\ +\x93\x005\x02\x93\x005\x02\x93\x005\x02\x93\x005\x02\ +\x93\xff\xb8\x02\x93\x005\x059\x005\x03%\x00\x22\x02\ +\x93\x005\x005\x005\x005\x005\x005\x005\xff\ +\xf1\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,F#F`\x8a\x8aF# F\x8a`\ +\x8aa\xb8\xff\x80b# \x10#\x8a\xb1\x0c\x0c\x8ap\ +E` \xb0\x00PX\xb0\x01a\xb8\xff\x80\x8b\x1b\xb0\ +\x81\x8cYh:-,K#QX\xb9\x003\xff\xe0\ +\xb14 \x1b\xb33\x004\x00YDD-,\xb0\x16\ +CX\xb0\x03&E\x8aXdf\xb0\x1f`\x1bd\xb0\ + `f X\x1b!\xb0@Y\xb0\x01aY#X\ +eY\xb0)#D#\x10\xb0)\xe0\x1b!!!!\ +!Y-,\xb0\x02CTXKS#KQZX\ +8\x1b!!Y\x1b!!!!Y-,\xb0\x16C\ +X\xb0\x04%Ed\xb0 `f X\x1b!\xb0@\ +Y\xb0\x01a#X\x1beY\xb0)#D\xb0\x05%\ +\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04%\x10\xb0\x05\ +% F\xb0\x04%#B<\xb0\x04%\xb0\x07%\x08\ +\xb0\x07%\x10\xb0\x06% F\xb0\x04%\xb0\x01`#\ +B< X\x01\x1b\x00Y\xb0\x04%\x10\xb0\x05%\xb0\ +)\xe0\xb0) EeD\xb0\x07%\x10\xb0\x06%\xb0\ +)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\ +\x05%\xb0\x03%CH\xb0\x04%\xb0\x07%\x08\xb0\x06\ +%\xb0\x03%\xb0\x01`CH\x1b!Y!!!!\ +!!!-,\x02\xb0\x04% F\xb0\x04%#\ +B\xb0\x05%\x08\xb0\x03%EH!!!!-,\ +\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%CH!!\ +!-,E# E\x18 \xb0\x00P X#e\ +#Y#h \xb0@PX!\xb0@Y#Xe\ +Y\x8a`D-,KS#KQZX E\x8a\ +`D\x1b!!Y-,KTX E\x8a`D\ +\x1b!!Y-,KS#KQZX8\x1b!\ +!Y-,\xb0\x00!KTX8\x1b!!Y-\ +,\xb0\x02CTX\xb0F+\x1b!!!!Y-\ +,\xb0\x02CTX\xb0G+\x1b!!!Y-,\ +\xb0\x02CTX\xb0H+\x1b!!!!Y-,\ +\xb0\x02CTX\xb0I+\x1b!!!Y-, \ +\x8a\x08#KS\x8aKQZX#8\x1b!!Y\ +-,\x00\xb0\x02%I\xb0\x00SX \xb0@8\x11\ +\x1b!Y-,\x01F#F`#Fa# \x10\ + F\x8aa\xb8\xff\x80b\x8a\xb1@@\x8apE`\ +h:-, \x8a#Id\x8a#SX<\x1b!\ +Y-,KRX}\x1bzY-,\xb0\x12\x00K\ +\x01KTB-,\xb1\x02\x00B\xb1#\x01\x88Q\xb1\ +@\x01\x88SZX\xb9\x10\x00\x00 \x88TX\xb2\x02\ +\x01\x02C`BY\xb1$\x01\x88QX\xb9 \x00\x00\ +@\x88TX\xb2\x02\x02\x02C`B\xb1$\x01\x88T\ +X\xb2\x02 \x02C`B\x00K\x01KRX\xb2\x02\ +\x08\x02C`BY\x1b\xb9@\x00\x00\x80\x88TX\xb2\ +\x02\x04\x02C`BY\xb9@\x00\x00\x80c\xb8\x01\x00\ +\x88TX\xb2\x02\x08\x02C`BY\xb9@\x00\x01\x00\ +c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C`BY\xb1\ +&\x01\x88QX\xb9@\x00\x02\x00c\xb8\x04\x00\x88T\ +X\xb2\x02@\x02C`BY\xb9@\x00\x04\x00c\xb8\ +\x08\x00\x88TX\xb2\x02\x80\x02C`BYYYY\ +YY\xb1\x00\x02CTX@\x0a\x05@\x08@\x09@\ +\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\x05@\x08\xba\ +\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\xb1\x80\x02C\ +RX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\x1b\xb2\x05@\ +\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\x00\x80\x88U\ +\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZX\xb3\x0c\x00\ +\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYBBBBB\ +-,E\x18h#KQX# E d\xb0@\ +PX|Yh\x8a`YD-,\xb0\x00\x16\xb0\x02\ +%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02#>\xb1\x01\ +\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\x01\xb0\x01#\ +?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\x06#eB\ +\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\xb0\x02CP\ +\xb0\x01\xb0\x02CT[X!#\x10\xb0 \x1a\xc9\x1b\ +\x8a\x10\xedY-,\xb0Y+-,\x8a\x10\xe5-@\ +\x92\x09!H U \x01\x03U\x1fH\x03U\x1e\x03\ +\xff\x1fPL\x16\x1fOMd\x1fNLd\x1f&4\ +\x10U%3$U\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\ +\xff\x1fML\x1e\x1fdL\x01LF\x0d\x1f\x133\x12\ +U\x05\x01\x03U\x043\x03U\x1f\x03\x01\x0f\x03?\x03\ +\xaf\x03\x03\x06KF\xcbF\xdbF\x03#3\x22UO\ +\x22\x01\x1c3\x1bU\x163\x15U\x11\x01\x0fU\x103\ +\x0fU\xaf\x0f\xcf\x0f\x020\x0f\x01\x02\x01\x00U\x013\ +\x00Uo\x00\x7f\x00\xaf\x00\xef\x00\x04\x10\x00\x01\x80\x16\ +\x01\x05\x01\xb8\x01\x90\xb1TS++K\xb8\x07\xffR\ +K\xb0\x09P[\xb0\x01\x88\xb0%S\xb0\x01\x88\xb0@\ +QZ\xb0\x06\x88\xb0\x00UZ[X\xb1\x01\x01\x8eY\ +\x85\x8d\x8d\x00B\x1dK\xb02SX\xb0 \x1dYK\ +\xb0dSX\xb0\x10\x1d\xb1\x16\x00BYss++\ +ss++++s+s^st++++\ +t+++++++++++++\x18^\ +\x00\x00\x00\x06\x14\x00\x17\x00N\x05\xb6\x00\x17\x00u\x05\ +\xb6\x05\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x04^\x00\x15\x00{\x00\x00\xff\xec\x00\x00\x00\x00\xff\ +\xec\x00\x00\x00\x00\xff\xec\x00\x00\xfe\x14\xff\xec\x00\x00\x05\ +\xb6\x00\x15\xfc\x94\xff\xeb\xfeo\xff\xe7\xfe\xbf\xff\xe9\x00\ +\x1c\xfe\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\ +\xe5\x00\xf6\x01\x00\x01+\x00\xd3\x00\xc7\x01\x02\x00\xf6\x01\ +\x02\x00\xf6\x00\xed\x00\xdf\x00\xb2\x00\x00\x01T\xfeV\x00\ +\x00\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00K\x00h\x00\xbe\x01\ +)\x01\x94\x01\xfc\x02\x0f\x021\x02Q\x02y\x02\xa4\x02\ +\xbb\x02\xcd\x02\xe9\x02\xfe\x038\x03Y\x03\x95\x03\xeb\x04\ +'\x04j\x04\xbd\x04\xd9\x05/\x05\x84\x05\xb6\x05\xe3\x06\ +\x03\x06$\x06F\x06\x95\x07\x17\x07J\x07\x98\x07\xd1\x08\ +\x06\x088\x08^\x08\xa5\x08\xd0\x08\xf6\x09\x1b\x09L\x09\ +g\x09\x9f\x09\xce\x0a\x0d\x0a@\x0a\x89\x0a\xc7\x0b\x0e\x0b\ +.\x0b`\x0b\x88\x0b\xcf\x0b\xfa\x0c\x1f\x0cJ\x0cf\x0c\ +z\x0c\x95\x0c\xb0\x0c\xc4\x0c\xde\x0d$\x0dp\x0d\xa5\x0d\ +\xf2\x0e?\x0e\x86\x0e\xfc\x0f6\x0f]\x0f\x92\x0f\xc3\x0f\ +\xd6\x10&\x10Z\x10\x91\x10\xdb\x11)\x11R\x11\x97\x11\ +\xd3\x12\x08\x12-\x12r\x12\x9d\x12\xd3\x12\xfd\x13G\x13\ +Y\x13\xa3\x13\xdf\x13\xdf\x14\x0e\x14U\x14\x9d\x14\xf2\x15\ +:\x15V\x15\xb2\x15\xdb\x16W\x16\x90\x16\xd3\x16\xf2\x16\ +\xfa\x17s\x17\x8e\x17\xc5\x17\xf0\x18&\x18p\x18\x8a\x18\ +\xca\x18\xf1\x18\xfa\x19&\x19G\x19s\x19\xba\x19\xd0\x19\ +\xe5\x19\xfb\x1aK\x1a\x5c\x1am\x1a~\x1a\x8f\x1a\xa1\x1a\ +\xb2\x1b\x01\x1b\x0d\x1b\x1e\x1b/\x1b@\x1bR\x1bc\x1b\ +t\x1b\x85\x1b\x97\x1b\xe1\x1b\xf2\x1c\x03\x1c\x14\x1c%\x1c\ +6\x1cH\x1cr\x1c\xc8\x1c\xd9\x1c\xea\x1c\xfb\x1d\x0d\x1d\ +\x1e\x1dU\x1d\xc1\x1d\xd1\x1d\xe1\x1d\xf1\x1e\x01\x1e\x12\x1e\ +#\x1e\xaf\x1e\xbb\x1e\xcb\x1e\xdb\x1e\xeb\x1e\xfc\x1f\x0d\x1f\ +\x1e\x1f/\x1fA\x1f\xa4\x1f\xb4\x1f\xc4\x1f\xd4\x1f\xe4\x1f\ +\xf4 \x05 K \x9d \xad \xbd \xcd \xde \ +\xee! >Y>\x96>\xc9?\ +\x12?l?\xaa?\xb2@\x04@\x5c@\xa4@\xf9A\ +\x01AsA\xc0A\xc8A\xd8B\x02B?B|B\ +\xa6B\xaeB\xb6B\xbeB\xc6B\xceB\xd6C.C\ +6C}C\xb7D\x05DeD\xacD\xf6E3E\ +vE\xc1F\x12F#F\x8aF\x9aF\xdbF\xe3F\ +\xebF\xfdG\x05GqG\xc3G\xcbG\xdcG\xecH\ +/HQHrH\x83H\x93H\xa4H\xb5H\xc7H\ +\xd9H\xeaH\xfbI\x0dI\x1fI'IMIeI\ +}I\x94I\xaeI\xd4I\xfbJ\x22JTJ\xa5J\ +\xc5J\xd5KiKqKyK\x9bK\xc7K\xd3K\ +\xe8L\x1cL^L\xc4M2M\x95M\xf8NEN\ +\xaeN\xf2N\xfaODO[OrO\x89O\xa0O\ +\xe7P\x16P1P[PvP\x95P\xf2Q\x1cQ\ +\x82Q\xc0Q\xebR\x15R@RLRXR}R\ +\xa1R\xbbR\xd6R\xf1S SSS\x8dS\xd6S\ +\xf0T@T\x87T\x87T\x87T\x87T\x87T\x87T\ +\x87T\x87T\x87T\x87T\x87T\x87T\x87T\x87U\ +\xa3V\x00V\x11V\x19V\x8fV\xc4W\x22W3W\ +DWPW\x5cWhW\x96W\xccX\x5cX\xdbY\ +.Y{Y\xc1Z\x12Z\x1bZ$Z-ZUZ\ +nZ\x7fZ\x90Z\xa0Z\xb0[\x1c[X[\xa7[\ +\xfb\x5cW\x5c\xab\x5c\xe2]\x19]h]\xaf^\x04^\ +U^\xb8_\x17_\xa9`;`C`K`\x99`\ +\xe2a\x1caSaeawa\x83a\x8fa\xf1b\ +Jc\x00c\xa8d:d\x99d\xd5e\x0ce=e\ +be\x90e\xb3e\xd5f\xa8g/g\x88g\xe5h\ +,h\x86h\xd1i/i_i\x8fi\xd6j\x19j\ +bj\xdbj\xe7j\xf3k)k^k\x94k\xcbl\ +\x0dlQl\x82l\xb4l\xeem$m[m\x8dm\ +\xd9n\x22n\x9bo\x1ao&o2o^o\xc5o\ +\xcdo\xf7p4pmp\xa5p\xdcq\x14qgq\ +\xa5q\xear2rzr\xacr\xe2sDs\xa0t\ +\x0btrtzt\x8bt\x9ct\xe3u'uku\ +\xb4u\xf7v2vmv\xa3v\xe1w)wnw\ +\xb5w\xbdw\xcew\xdew\xf0x\x01x\x09x\x11x\ +\x22x2x\x7fx\xc8x\xdax\xebx\xfdy\x0fy\ +!y2yvy\xb9y\xcay\xday\xecy\xfdz\ +\x0fz z(z0zBzSzezwz\ +\x88z\x98z\xaaz\xbbz\xcdz\xdez\xf0{\x01{\ +'{L{^{p{\xbd|\x09|Q|\x99|\ +\xd5}\x0f}C}K}\xa2~\x04~^~\xb6\x7f\ +\x08\x7fW\x7f\xa8\x80\x02\x80N\x80\x95\x80\xdd\x81!\x81\ +^\x81\x9b\x81\xed\x81\xf5\x82G\x82\xa0\x82\xac\x82\xb8\x82\ +\xc9\x82\xda\x82\xec\x82\xfe\x83\x10\x83\x22\x834\x83F\x83\ +X\x83j\x83\x7f\x83\x93\x83\xa5\x83\xb7\x83\xc9\x83\xdb\x83\ +\xed\x83\xff\x84\x11\x84#\x848\x84L\x84X\x84d\x84\ +u\x84\x86\x84\x97\x84\xa7\x84\xb9\x84\xcb\x84\xdd\x84\xef\x85\ +\x01\x85\x13\x85%\x857\x85L\x85`\x85q\x85\x82\x85\ +\x8e\x85\x9a\x85\xa6\x85\xb2\x85\xc3\x85\xd4\x85\xe6\x85\xf8\x86\ +\x0a\x86\x1c\x86.\x86@\x86R\x86d\x86y\x86\x8d\x86\ +\x9e\x86\xae\x86\xbf\x86\xcf\x86\xe0\x86\xf1\x87\x02\x87\x12\x87\ +\x1e\x87*\x876\x87B\x87S\x87d\x87u\x87\x85\x87\ +\x96\x87\xa6\x87\xb7\x87\xc8\x87\xd9\x87\xe9\x87\xf5\x88\x01\x88\ +\x0d\x88\x19\x88*\x88;\x88L\x88\x5c\x88h\x88\x91\x88\ +\xc6\x88\xfc\x89?\x89\xa1\x89\xd2\x8a\x01\x8aC\x8a\x9e\x8a\ +\xbf\x8a\xe0\x8b\x01\x8b\x09\x8b>\x8b_\x8b\x99\x8b\xeb\x8c\ +&\x8ci\x8cq\x8c\x92\x8c\x9a\x8c\xef\x8da\x8d\xcf\x8d\ +\xdb\x8d\xe7\x8eA\x8eQ\x8ea\x8er\x8e\x82\x8e\x96\x8e\ +\xa7\x8e\xb8\x8e\xc9\x8e\xdb\x8e\xec\x8e\xfd\x8f\x0e\x8f\x19\x8f\ +*\x8f6\x8fK\x8fS\x8fe\x8fm\x8f\x7f\x8f\x87\x8f\ +\x8f\x8f\xa0\x8f\xac\x00\x00\x00\x02\x00\xc1\x00\x00\x04\x0a\x05\ +\xb6\x00\x03\x00\x07\x00\x0c\xb3\x04\x03\x07\x00\x00/2/\ +310\x13!\x11!7!\x11!\xc1\x03I\xfc\xb7\ +h\x02y\xfd\x87\x05\xb6\xfaJh\x04\xe6\x00\x00\x02\x00\ +\x19\xff\xe5\x02\x87\x05\xb6\x00\x03\x00\x0f\x00\x22@\x12\x0f\ +\x01\x1f\x01\x02\x09\x03\x01\x01\x0d\x02\x03\x0d\x07TY\x0d\ +\x16\x00?+\x00\x18?\x129/_^]10\x01\ +#\x13!\x014632\x16\x15\x14\x06#\x22&\x01\ +\x87\xf1\x9d\x01T\xfd\x92kaDRnYIR\x01\ +\xe5\x03\xd1\xfa\xbdZlLEWlK\x00\x00\x02\x00\ +\xc9\x03\xa6\x03\xba\x05\xb6\x00\x03\x00\x07\x00\x0d\xb4\x06\x02\ +\x07\x03\x03\x00?3\xcd210\x01\x03#\x13!\x03\ +#\x13\x02%\x98\xc4G\x02\xaa\x97\xc7J\x05\xb6\xfd\xf0\ +\x02\x10\xfd\xf0\x02\x10\x00\x00\x02\x00)\x00\x00\x055\x05\ +\xb6\x00\x1b\x00\x1f\x00;@\x1e\x08\x04\x0b\x0b\x1c\x01\x0e\ +\x1f\x00\x0f\x0f\x19\x15\x120\x12@\x12\x02\x0e\x12\x0e\x12\ +\x0a\x17\x13\x03\x06\x0a\x12\x00?3?3\x1299/\ +/]\x11333\x1133\x11333\x1133\ +10\x01\x07!\x07!\x03#\x13#\x03#\x13#7\ +!7#7!\x133\x033\x133\x033\x07\x053\ +7#\x04\x0cE\x01\x02\x13\xfe\xd7t\xdcu\xc2s\xd7\ +q\xee\x12\x01\x15F\xfc\x12\x01!w\xd9u\xc7t\xd7\ +t\xef\x12\xfd\x06\xc5E\xc4\x03N\xe8\xce\xfeh\x01\x98\ +\xfeh\x01\x98\xce\xe8\xd1\x01\x97\xfei\x01\x97\xfei\xd1\ +\xe8\xe8\x00\x00\x03\x003\xff\x89\x04`\x06\x14\x00\x1e\x00\ +%\x00+\x00C@%+\x1b\x0c%\x04\x06\x15&\x1a\ +\x15\x1aOY\x12\x15\x1f\x0b\x06\x0bPY\x05@\x10\x14\ +H\x05\x06\x03\x06\x15\x06\x15\x06,\x14\x00\x00?\x129\ +9//\x113\x10\xcd++\x11\x003\x113+\x11\ +\x003\x11\x12\x17910\x01\x14\x06\x07\x07#7&\ +'\x11\x16\x17\x13&&546773\x07\x16\x17\ +\x07&'\x03\x1e\x02\x016654&'\x03\x06\x06\ +\x15\x14\x17\x04\x0a\xfb\xf2'\x8c,\xd1\x92\xc6\xceG\xa3\ +\x9c\xfe\xdf#\x8b!\xa6\x81j\x84n?\x83\x80B\xfe\ +H?N1#\x12>EP\x01\xf0\xb8\xd7\x11\xc7\xc9\ +\x0cJ\x01\x0ak\x0a\x01B=\xb4|\xad\xd5\x0f\x97\x97\ +\x16D\xe8A\x09\xfe\xd53a\x81\xfe\xfd\x09H>.\ +;\x0e\x02=\x07D+\x01\xdd\xb4\x89REB\x8bf\x92\x84\ +\xf0\x82\xbe\xdeR\xa3\xb9\xfe\xf3\x028\xd5\x01\xa8\x9f\xbf\ +TKOCU\xcbp_\xc4\xa1k\xbc\xbc\x97\xde\x0a\ +\x00\x00\x01\x00\x0e\xff\xec\x04P\x05\xcb\x00'\x005@\ +\x1c\x03\x17\x18\x18\x17QY\x0c\x18\x01\x0d\x03\x18\x18\x0b\ +!%\x1fOY%\x07\x0b\x11OY\x0b\x19\x00?+\ +\x00\x18?+\x11\x12\x009\x18/_^]+\x11\x12\ +\x00910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x06\x04#\ +\x22'\x11\x16\x1632654!#7326\ +54&#\x22\x07'6632\x16\x04P\xbd\xa7\ +\x83\x87\x94\xfe\xec\xbd\xef\x94T\xc4]\x9e\xaa\xfe\xfe\x8a\ +.I\xa7\xc0VN\x86\x99\x7f|\xd9\x8a\xbe\xd8\x04}\ +\x9c\xd4\x1d\x04\x1a\xa1y\x85\xd2uO\x01\x0b23\x7f\ +q\xac\xdd|nCJd\xccQA\xb5\x00\x00\x02\xff\ +\xe7\x00\x00\x04P\x05\xb6\x00\x0a\x00\x13\x00%@\x12\x10\ +\x03\x07\x01\x05\x13\x05PY\x06\x09\x13\x13\x03\x07\x06\x03\ +\x18\x00??\x129/33+\x11\x003\x11\x129\ +10\x01#\x03!\x13!7\x01!\x033!76\ +67#\x06\x07\x01\x04\x04\xaa?\xfe\xdb?\xfd\xb20\ +\x03\x02\x017\xc3\xaa\xfe1:\x0c8\x0e\x06#a\xfe\ +\xc7\x01/\xfe\xd1\x01/\xea\x03\x9d\xfci\xf8:\xd4#\ +?v\xfe\x8c\x00\x00\x01\x00\x1b\xff\xec\x04h\x05\xb6\x00\ +\x1c\x00&@\x14\x00\x13PY\x00\x00\x07\x17\x17\x1aN\ +Y\x17\x06\x07\x0dOY\x07\x19\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+10\x012\x16\x15\x14\x06\x04\ +#\x22&'\x11\x1632654&#\x22\x07'\ +\x13!\x03!\x036\x02o\xb7\xd4\x8f\xfe\xee\xc1u\xcb\ +=\xae\xb2\x9a\xaesmfoh\xcf\x02\xf37\xfe\x17\ +XH\x03\x9a\xce\xb8\xa7\xfa\x87.#\x01\x0dc\x8e{\ +^^!N\x02\xdd\xfe\xfa\xfe\xdb\x0f\x00\x02\x00X\xff\ +\xec\x04\x81\x05\xcd\x00\x19\x00&\x00-@\x17\x0d\x17\x10\ +\x10 PY\x10\x10\x17\x05\x05\x0aOY\x05\x07\x17\x1a\ +OY\x17\x19\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x134\x12\x12$32\x17\ +\x07&#\x22\x06\x073632\x16\x15\x14\x02\x06#\ +\x22&\x052654&#\x22\x06\x06\x15\x14\x16X\ +z\xd5\x01,\xcf}b3Tk\xc2\xefB\x04s\xc4\ +\x9d\xab\x8e\xef\x9e\xd4\xd8\x01\xbac}CE\x01j\xfd\x1eR\ +\x7fI1-\x8dH9$\x03H\xad\xfe\xd8\xa6MF\ +MF\x9f\x96\x93\x01\x03\x977\xfe\x5c,A D\x80\ +\xd6k\xd5\xe1\xbc\xfe\xa8\xdc\xf3\xfe\xed(.\xbaZ\xab\ +\x018\xcb\x01\x17\x01\xb4\xf7\xfe\xb9\xf6g\xabYAJ\ +\x01\x0e\xde\x0a\x00\x00\x02\xff\x85\x00\x00\x04\x8b\x05\xbc\x00\ +\x07\x00\x0f\x00\x1f@\x0f\x0c\x03\x04\x0f\x01LY\x0f\x0f\ +\x04\x07\x03\x12\x04\x03\x00??3\x129/+\x11\x12\ +\x00910\x01!\x03!\x01!\x13!\x03\x03&5\ +5\x06\x07\x03\x03J\xfe'\xac\xfe\xc0\x02\xfe\x01u\x93\ +\xfe\xd7'\x1a\x0a,A\xbc\x01\x5c\xfe\xa4\x05\xbc\xfaD\ +\x02`\x01^\x83z$x\x86\xfe\x7f\x00\x03\x005\x00\ +\x00\x04\xe3\x05\xb6\x00\x0f\x00\x17\x00\x1f\x005@\x1c\x06\ +\x1f\x10\x10\x1fMY\x0c\x10\x01\x0d\x03\x10\x10\x0e\x0f\x0f\ +\x17LY\x0f\x03\x0e\x18LY\x0e\x12\x00?+\x00\x18\ +?+\x11\x12\x009\x18/_^]+\x11\x12\x009\ +10\x012\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x04!\ +!\x01\x1332654##\x0332654\ +##\x03\x14\xe5\xea\xa6\x99dw\xfe\xce\xfe\xf2\xfd\xf6\ +\x015\xb7\x95yy\xaa\x98\xca\xb4u\x85\xb7\xa5\x05\xb6\ +\xa3\xa2\x96\xc3 \x06\x1a\x8dn\xe5\xf8\x05\xb6\xfd\xbda\ +[\x89\xfcHtg\xa2\x00\x01\x00{\xff\xec\x057\x05\ +\xcd\x00\x19\x00\x17@\x0c\x13\x00LY\x13\x04\x0c\x07L\ +Y\x0c\x13\x00?+\x00\x18?+10\x01\x22\x06\x02\ +\x15\x14\x16327\x11\x06#\x22\x00\x11\x10\x12$3\ +2\x16\x17\x07&&\x03\x89\x84\xd3\x80\x89\x96\x92\xc0\xc7\ +\xc9\xfe\xfe\xe6\xd0\x01\x5c\xe2}\xc2ovj\x8a\x04\xcb\ +\xa2\xfe\xc5\xb5\xa7\xa2M\xfe\xfcM\x01+\x01\x12\x01\x06\ +\x01\xb9\xe5-<\xfa;&\x00\x00\x02\x005\x00\x00\x05\ ++\x05\xb6\x00\x09\x00\x13\x00\x17@\x0c\x06\x12LY\x06\ +\x03\x05\x13LY\x05\x12\x00?+\x00\x18?+10\ +\x01\x10\x02\x04#!\x01! \x00\x0126\x1254\ +&##\x03\x05+\xc4\xfe\x8d\xfc\xfe=\x015\x01\x8c\ +\x01\x0e\x01'\xfc\xdb\x94\xdc|\x91\x88s\xca\x03\x8d\xfe\ +\xe8\xfec\xd8\x05\xb6\xfe\xe2\xfch\x98\x01'\xbe\x9a\xa1\ +\xfcH\x00\x00\x01\x005\x00\x00\x04\x9c\x05\xb6\x00\x0b\x00\ +.@\x19\x06\x09LY\x0c\x06\x01\x0d\x03\x06\x06\x01\x02\ +\x02\x05LY\x02\x03\x01\x0aLY\x01\x12\x00?+\x00\ +\x18?+\x11\x12\x009\x18/_^]+10!\ +!\x01!\x07!\x03!\x07!\x03!\x03f\xfc\xcf\x01\ +5\x0326\xfe\x00C\x01\xdd7\xfe#P\x02\x00\x05\ +\xb6\xfe\xfe\xbf\xfe\xfe\x87\x00\x01\x005\x00\x00\x04\x98\x05\ +\xb6\x00\x09\x00\x1d@\x0f\x06\x09LY\x06\x06\x02\x01\x12\ +\x02\x05LY\x02\x03\x00?+\x00\x18?\x129/+\ +10!!\x01!\x07!\x03!\x07!\x01f\xfe\xcf\ +\x015\x03.6\xfe\x04O\x01\xd98\xfe'\x05\xb6\xfe\ +\xfe\x87\xfd\x00\x01\x00{\xff\xec\x05m\x05\xcd\x00\x1d\x00\ +&@\x14\x00\x1dLY\x00\x00\x05\x0c\x0c\x12LY\x0c\ +\x04\x05\x19LY\x05\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10\x01!\x03\x06\x06# \x00\x11\ +\x10\x12$32\x17\x07&&#\x22\x06\x02\x15\x14\x16\ +327\x13!\x02\xf2\x023\xa2\x86\xe5\x80\xfe\xfd\xfe\ +\xe6\xd6\x01\x84\xfe\xda\xc0sJ\x94W\x99\xf1\x89\x91\x96\ +L^B\xfe\xf5\x035\xfd\x06.!\x01&\x01\x13\x01\ +\x0c\x01\xb1\xebc\xfb(0\xa6\xfe\xcd\xb1\xac\xa1\x18\x01\ ++\x00\x01\x005\x00\x00\x05\xa4\x05\xb6\x00\x0b\x00\x1e@\ +\x10\x08\x03LYL\x08\x01\x08\x08\x05\x0a\x06\x03\x01\x05\ +\x12\x00?3?3\x129/]+10!!\x13\ +!\x03!\x01!\x03!\x13!\x04o\xfe\xce\x86\xfe)\ +\x86\xfe\xcf\x015\x012y\x01\xd7y\x011\x02w\xfd\ +\x89\x05\xb6\xfd\xc3\x02=\x00\x01\xff\xc5\x00\x00\x03\x81\x05\ +\xb6\x00\x0b\x00\x17@\x0a\x09\x04\x04\x06\x03\x0a\x03\x03\x01\ +\x12\x00?3\x113?3\x11310!!77\ +\x13'7!\x07\x07\x03\x17\x02L\xfdy$\xbb\xc9\x98\ +%\x02\x87%\xbe\xc9\x9c\xb0R\x03\xb2R\xb0\xb0R\xfc\ +NR\x00\x00\x01\xfe\xbe\xfeR\x02\xb2\x05\xb6\x00\x0d\x00\ +\x11\xb7\x09\x03\x00\x05LY\x00#\x00?+\x00\x18?\ +10\x03\x22'5\x163267\x01!\x01\x06\x06\ +\x87^]XLc{\x1c\x01%\x011\xfe\xd14\xf7\ +\xfeR\x1b\xfd\x14y\x83\x05d\xfaq\xf5\xe0\x00\x01\x00\ +5\x00\x00\x05\xa4\x05\xb6\x00\x0c\x00#@\x10\x0c\x02\x02\ +\x03\x0b\x0b\x06\x03\x08\x08\x05\x06\x03\x01\x05\x12\x00?3\ +?\x129\x113\x113\x11\x129\x11310!!\ +\x03\x07\x03!\x01!\x037\x01!\x01\x04u\xfe\xae\xd3\ +}m\xfe\xcf\x015\x012\x98\x9e\x01\x99\x01i\xfd\xae\ +\x02PF\xfd\xf6\x05\xb6\xfdB\xcd\x01\xf1\xfdD\x00\x00\ +\x01\x005\x00\x00\x03\x9c\x05\xb6\x00\x05\x00\x11\xb7\x01\x03\ +\x00\x03LY\x00\x12\x00?+\x00\x18?103\x01\ +!\x01!\x035\x015\x012\xff\x00\x02\x006\x05\xb6\ +\xfbJ\xff\x00\x00\x00\x01\x005\x00\x00\x07\x14\x05\xb6\x00\ +\x13\x00\x19@\x0c\x0b\x08\x13\x03\x10\x01\x11\x03\x0a\x04\x10\ +\x12\x00?33?3\x12\x17910\x01\x01!\x01\ +!\x1367#\x01!\x03#\x06\x02\x03!\x01!\x13\ +\x03F\x02'\x01\xa7\xfe\xcb\xfe\xe8\x9154\x05\xfd\xc7\ +\xfe\xe7=\x04\x0b6\xa0\xfe\xed\x015\x01\x94D\x01q\ +\x04E\xfaJ\x02\xb4\xf7\xc2\xfb\x93\x04mX\xfe\xe2\xfd\ +\x09\x05\xb6\xfb\xbb\x00\x01\x005\x00\x00\x06\x14\x05\xb6\x00\ +\x10\x00\x15@\x09\x03\x0b\x08\x0f\x09\x03\x01\x08\x12\x00?\ +3?3\x129910!!\x01#\x07\x06\x07\x03\ +!\x01!\x0136\x12\x13!\x04\xdf\xfe\xaa\xfe\x9c\x06\ +\x04 \x22\x91\xfe\xed\x015\x01e\x01T\x04\x0c6\x99\ +\x01\x12\x04R \xd8\xaa\xfdP\x05\xb6\xfb\xcbL\x01\x1a\ +\x02\xcf\x00\x00\x02\x00{\xff\xec\x05\x98\x05\xcd\x00\x0d\x00\ +\x1b\x00\x17@\x0c\x0b\x0eLY\x0b\x04\x04\x15LY\x04\ +\x13\x00?+\x00\x18?+10\x01\x10\x02\x04# \ +\x00\x11\x10\x12$32\x00%\x22\x06\x02\x15\x14\x163\ +26\x1254&\x05\x98\xc6\xfe\xa8\xe0\xff\x00\xfe\xe1\ +\xc6\x01\x5c\xe4\xff\x01\x18\xfd\xd0y\xcas\x85yy\xc7\ +p\x82\x03\xaa\xfe\xe5\xfeA\xe4\x01'\x01\x06\x01\x09\x01\ +\xbd\xee\xfe\xe0\x1e\xb7\xfe\xc0\xbb\x93\x96\xae\x01>\xc6\x8e\ +\x9b\x00\x02\x005\x00\x00\x04\xa6\x05\xb6\x00\x07\x00\x12\x00\ +\x1d@\x0f\x0c\x00LY\x0c\x0c\x0f\x0e\x12\x0f\x07LY\ +\x0f\x03\x00?+\x00\x18?\x129/+10\x013\ +2654##\x05\x14\x00!#\x03!\x01!2\ +\x16\x02\x0a8\x8e\xa3\xc3J\x02@\xfe\xad\xfe\xd6Vm\ +\xfe\xcf\x015\x01R\xf2\xf8\x03\x06\x8at\xb4\xac\xf1\xfe\ +\xed\xfd\xf8\x05\xb6\xd5\x00\x00\x02\x00{\xfe\xa4\x05\x98\x05\ +\xcd\x00\x10\x00\x1e\x00!@\x10\x05\x07\x0e\x11LY\x0e\ +\x04\x03\x07\x07\x18LY\x07\x13\x00?+\x11\x003\x18\ +?+\x00\x18\x10\xc610\x01\x10\x02\x07\x13!\x03#\ + \x00\x11\x10\x12$32\x00%\x22\x06\x02\x15\x14\x16\ +326\x1254&\x05\x98\xf5\xd4\xfe\xfe\x99\xb2\x1a\ +\xff\x00\xfe\xe1\xc6\x01\x5c\xe4\xff\x01\x18\xfd\xd0y\xcas\ +\x85yy\xc7p\x82\x03\xaa\xfe\xc4\xfe!b\xfew\x01\ +H\x01'\x01\x06\x01\x09\x01\xbd\xee\xfe\xe0\x1e\xb7\xfe\xc0\ +\xbb\x93\x96\xae\x01>\xc6\x8e\x9b\x00\x02\x005\x00\x00\x04\ +\xac\x05\xb6\x00\x08\x00\x16\x00&@\x13\x13\x09\x0c\x00\x09\ +MY\x00\x00\x0c\x15\x0b\x12\x0c\x08LY\x0c\x03\x00?\ ++\x00\x18?3\x129/+\x11\x12\x00910\x01\ +32654&##\x03\x03!\x01!2\x16\x15\ +\x14\x06\x07\x01!\x03\x02\x12N\x83\x92_fJ\x89w\ +\xfe\xcf\x015\x01g\xed\xee\xa6\x9c\x01\x05\xfe\xb4\xcf\x03\ +-ruRR\xfdy\xfd\xcf\x05\xb6\xcc\xc5\x9e\xe37\ +\xfd\x93\x021\x00\x00\x01\x00)\xff\xec\x04V\x05\xcb\x00\ +#\x00 @\x10\x0b\x1e\x03\x16\x16\x1bLY\x16\x04\x03\ +\x08LY\x03\x13\x00?+\x00\x18?+\x11\x12\x009\ +910\x01\x14\x04#\x22'\x11\x1632654\ +&&'&&546632\x17\x07&#\x22\ +\x06\x15\x14\x16\x17\x16\x16\x03\xb2\xfe\xd8\xfd\xdd\x87\xc1\xa5\ +p~\x1b2c\x8ap|\xe5\x95\xd9\xb4m\x9c\x84S\ +jBsyx\x01\xb0\xd1\xf3Z\x01\x12lUJ+\ +A8Jc\xc2p\x81\xcbqc\xe9JZJ=[\ +KP\xc1\x00\x01\x00\xa8\x00\x00\x04\xd1\x05\xb6\x00\x07\x00\ +\x16@\x0a\x01\x12\x07\x03\x04\x03LY\x04\x03\x00?+\ +\x11\x003\x18?10!!\x13!\x13!\x03!\x02\ +;\xfe\xcf\xfe\xfe\xa07\x03\xf27\xfe\x9f\x04\xb4\x01\x02\ +\xfe\xfe\x00\x00\x01\x00\x8d\xff\xec\x05\x9a\x05\xb6\x00\x14\x00\ +\x14@\x09\x14\x0a\x03\x04\x10LY\x04\x13\x00?+\x00\ +\x18?310\x01\x03\x02\x00!\x22&547\x13\ +!\x03\x06\x15\x143267\x13\x05\x9a\xc99\xfe\xbe\ +\xfe\xfe\xd4\xf3\x0f\xc4\x011\xc2\x11\xbd{\x90 \xc2\x05\ +\xb6\xfcN\xfe\xf6\xfe\xf2\xe3\xc2HB\x03\x9b\xfciJ\ +3\xb2\x99\x98\x03\x95\x00\x00\x01\x00\xb8\x00\x00\x05q\x05\ +\xb6\x00\x0d\x00\x10\xb6\x0d\x06\x03\x07\x03\x06\x12\x00??\ +3\x12910\x0167\x01!\x01!\x03!\x13\x16\ +\x15\x06\x07\x02\x17N \x01\xb0\x01<\xfd\x14\xfe\xb2\x7f\ +\x01'3\x04\x02\x04\x01+\xdd>\x03p\xfaJ\x05\xb6\ +\xfc\x90-Xg/\x00\x00\x01\x00\xb8\x00\x00\x07\xe7\x05\ +\xb6\x00\x1e\x00\x19@\x0c\x0a\x1e\x13\x03\x04\x17\x0f\x05\x03\ +\x1a\x04\x12\x00?3?33\x12\x17910\x01\x06\ +\x07\x01!\x03!\x13\x14\x06\x073667\x01!\x13\ +\x14\x07367\x01!\x01!\x03'47\x03\xee.\ +E\xfe\xbc\xfe\xae-\x01\x1f\x06\x08\x06\x06\x16Z\x0f\x01\ +q\x01\x0e\x15\x09\x06+X\x01J\x015\xfdy\xfe\xa6\ +\x16\x02\x04\x03\xfa\x92\x99\xfd1\x05\xb6\xfc\xe24\xf25\ +@\xe9\x1d\x033\xfc\x97\x92~\x81\xdc\x03\x1c\xfaJ\x02\ +\xd1\x8bXF\x00\x00\x01\xff\x8b\x00\x00\x05y\x05\xb6\x00\ +\x0b\x00\x18@\x0c\x08\x0b\x05\x02\x04\x04\x09\x06\x03\x01\x04\ +\x12\x00?3?3\x12\x17910!!\x03\x01!\ +\x01\x03!\x13\x01!\x01\x04d\xfe\xb5\xac\xfet\xfe\xaa\ +\x02@\xee\x01@\x99\x01k\x01X\xfd\xdf\x02\x1f\xfd\xe1\ +\x02\xfc\x02\xba\xfd\xfa\x02\x06\xfd+\x00\x00\x01\x00\xba\x00\ +\x00\x05?\x05\xb6\x00\x08\x00\x17@\x0a\x03\x06\x00\x00\x05\ +\x01\x07\x03\x05\x12\x00??3\x129\x113310\ +\x01\x01!\x01\x03!\x13\x03!\x02s\x01v\x01V\xfd\ +\x96w\xfe\xd1w\xec\x018\x03f\x02P\xfcy\xfd\xd1\ +\x02/\x03\x87\x00\x00\x01\xff\xc3\x00\x00\x04\xb0\x05\xb6\x00\ +\x09\x00$@\x12\x07\x04\x05\x05\x04LY\x05\x03\x02\x08\ +\x01\x01\x08LY\x01\x12\x00?+\x11\x12\x009\x18?\ ++\x11\x12\x00910!!7\x01!\x13!\x07\x01\ +!\x03\x98\xfc+&\x03\x09\xfd\xe15\x03\xa8)\xfc\xf2\ +\x02T\xc9\x03\xed\x01\x00\xca\xfc\x14\x00\x00\x01\xff\xdb\xfe\ +\xbc\x031\x05\xb6\x00\x07\x00\x0e\xb5\x05\x02\x03\x06\x01'\ +\x00?3?310\x01!\x01!\x07#\x013\x01\ +\xb4\xfe'\x01}\x01\xd9-\xd7\xfe\xdd\xd7\xfe\xbc\x06\xfa\ +\xd3\xfa\xac\x00\x01\x00\xdd\x00\x00\x02\xc1\x05\xb6\x00\x03\x00\ +\x0a\xb3\x03\x03\x02\x12\x00??10\x01\x13!\x03\x01\ +\xe1\xe0\xfe\xf5\xd9\x05\xb6\xfaJ\x05\xb6\x00\x01\xffw\xfe\ +\xbc\x02\xcb\x05\xb6\x00\x07\x00\x0e\xb5\x03\x04\x03\x00\x07'\ +\x00?3?310\x073\x01#7!\x01!\x5c\ +\xd5\x01#\xd7-\x01\xd9\xfe\x83\xfe)q\x05T\xd3\xf9\ +\x06\x00\x01\x00\x14\x02\x08\x04'\x05\xbe\x00\x06\x00\x0d\xb4\ +\x05\x00\x04\x02\x03\x00?\xcd2910\x13\x013\x01\ +#\x03\x01\x14\x02k\x93\x01\x15\xdf\xae\xfen\x02\x08\x03\ +\xb6\xfcJ\x02y\xfd\x87\x00\x01\xffF\xfe\xbc\x02\x9a\xff\ +H\x00\x03\x00\x0c\xb4\x02\x00\x01\x01\x01\x00/]31\ +0\x01!7!\x02{\xfc\xcb\x1e\x036\xfe\xbc\x8c\x00\ +\x01\x01\xfc\x04\xd9\x03\xa6\x06!\x00\x08\x00\x0a\xb2\x06\x80\ +\x01\x00/\x1a\xcd10\x01#&&'5!\x16\x17\ +\x03\xa6\xb8G\x87$\x017$O\x04\xd9E\xa9E\x15\ +\x94\x9b\x00\x00\x02\x00Z\xff\xec\x04\x9e\x04s\x00\x12\x00\ + \x00%@\x13\x0b\x11\x0f\x0c\x0f\x07\x1aGY\x07\x10\ +\x00\x13GY\x00\x16\x0f\x15\x00??+\x00\x18?+\ +\x00\x18?\x129910\x05\x22&54\x1263\ +2\x16\x17373\x03#7#\x06'2665\ +4&#\x22\x06\x06\x15\x14\x16\x01\x96\x93\xa9\x90\xea\x8c\ +a\x8d'\x089\xe8\xee\xe5\x0e\x04\x86CE\x80NM\ +?D{IC\x14\xd5\xc0\xc6\x01g\xc5TP\x8f\xfb\ +\xa2\x91\xa5\xf3\x86\xe5\x91G]\x90\xectXX\x00\x00\ +\x02\x00%\xff\xec\x04h\x06\x14\x00\x14\x00!\x00+@\ +\x16\x0a\x11\x0a\x11\x07\x00\x0d\x00\x0c\x15\x00\x15GY\x00\ +\x10\x07\x1cGY\x07\x16\x00?+\x00\x18?+\x00\x18\ +??\x11\x1299//10\x012\x16\x15\x14\x02\ +\x06#\x22'#\x07#\x01!\x03\x06\x07366\x07\ +\x22\x06\x06\x15\x14\x16326654\x03-\x92\xa9\ +\x88\xee\x90\xc2R\x08:\xe7\x01J\x01->)+\x08\ +N\x81-D|PJACzK\x04s\xd8\xbe\xbe\ +\xfe\x9d\xd0\xa3\x8f\x06\x14\xfe\xe0\xb6ubH\xf4\x82\xe7\ +\x87P`\x8a\xf1u\xb0\x00\x01\x00Z\xff\xec\x03\xf2\x04\ +s\x00\x19\x00\x17@\x0c\x07\x0dGY\x07\x10\x00\x14G\ +Y\x00\x16\x00?+\x00\x18?+10\x05\x22&5\ +4\x12$32\x17\x07&&#\x22\x06\x06\x15\x14\x16\ +3267\x15\x06\x01\xfa\xc9\xd7\x95\x01\x0e\xad\xb6\x92\ +\x5c6hBU\x89M[QL\x82E\x98\x14\xd7\xc4\ +\xd4\x01[\xbdH\xe5\x17\x22\x80\xdf\x80`a/#\xf6\ +O\x00\x02\x00Z\xff\xec\x04\xfa\x06\x14\x00\x16\x00#\x00\ +'@\x14\x0b\x14\x00\x07\x0f\x00\x07\x1eGY\x07\x10\x00\ +\x17GY\x00\x16\x12\x15\x00??+\x00\x18?+\x00\ +\x18?\x11\x129910\x05\x22&54\x1263\ +2\x16\x173767\x13!\x01#7#\x06\x067\ +26654&#\x22\x06\x06\x15\x14\x01\x96\x93\xa9\ +\x8f\xea\x8dRw5\x08\x02\x06\x13L\x01-\xfe\xb6\xe5\ +\x0e\x04G\x9b!B}LKAD{I\x14\xd6\xc1\ +\xc4\x01e\xc7JZ\x1cnU\x01f\xf9\xec\x91WN\ +\xf3\x89\xe4\x83P`\x90\xect\xb0\x00\x00\x02\x00Z\xff\ +\xec\x04B\x04s\x00\x08\x00!\x00.@\x19\x03\x17K\ +Y\x0f\x03\x01\x0c\x06\x03\x03\x09\x10\x10\x00JY\x10\x10\ +\x09\x1cFY\x09\x16\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/_^]+10\x01\x22\x06\x07326\ +54\x01\x22&54\x12$32\x16\x15\x14\x04!\ +#\x07\x15\x14\x163267\x15\x06\x02\xb8X\x9c\x18\ +-\x9b\xad\xfe\xf3\xd2\xe8\xa5\x01\x1a\xb2\xb1\xc6\xfe\xb2\xfe\ +\xca3\x02g`W\x8ee\xac\x03\x9a\xa0saS_\ +\xfcR\xe2\xce\xcf\x01U\xb3\xa3\x8e\xbb\xcb\x15\x14[i\ +&0\xe3V\x00\x00\x01\xff%\xfe\x14\x03\xdb\x06\x1f\x00\ +\x1e\x00*@\x16\x0c\x0a\x1c\x19\x10\x15GY\x10\x00\x19\ +\x1cFY\x19\x0f\x00\x05GY\x00\x1b\x00?+\x00\x18\ +?+\x00\x18?+\x11\x12\x009910\x03\x22'\ +5\x163267\x13#?\x026632\x17\x07\ +&#\x22\x06\x07\x073\x07#\x03\x02-hF=6\ +=\x5c\x13\xcc\xa3\x1e\xb7\x12)\xc3\xb0\x83hPE@\ +9F\x0c\x0c\xdb1\xdc\xd7M\xfe\x14\x19\xf2\x15PZ\ +\x03\xc5\x91TT\xbe\xaf1\xe0\x1fPA>\xe5\xfc\x0e\ +\xfe\x8d\x00\x00\x03\xff\x8d\xfe\x14\x04\xa2\x04s\x00(\x00\ +4\x00>\x004@\x1c\x07:KY\x07\x07(\x0e\x1b\ +)&5KY&\x10(\x02JY(\x0f\x15.K\ +Y\x15\x1b\x00?+\x00\x18?+\x00\x18?+\x00\x18\ +/33\x129/+10\x01\x07\x07\x16\x15\x14\x06\ +#\x22'\x06\x15\x14\x16\x17\x17\x16\x16\x15\x14\x04!\x22\ +&5467&5467&&5463\ +2\x17\x01\x06\x06\x15\x1432654&'\x13\x22\ +\x06\x15\x1432654\x04\xa2#\xae\x10\xf2\xd0;\ +(T<;\x89\xa3\x95\xfe\xc8\xfe\xde\xd0\xe9\x89\x92J\ +YfA>\xfb\xd8SS\xfeVjm\xc2\x97\x9aA\ +i\x87M_gK]\x04\x5c\xa6)4B\xc3\xe3\x0a\ +\x1b3\x22\x1e\x08\x12\x15\x7fx\xd3\xe0\x97\x84f\x930\ +/VGg/1~Z\xc7\xe9\x17\xfb\x9e\x0eVB\ +sZR'*\x0e\x03\xc8\x99sw\x99uu\x00\x00\ +\x01\x00%\x00\x00\x04m\x06\x14\x00\x19\x00\x1c@\x0e\x10\ +\x0b\x14\x14\x06GY\x14\x10\x0c\x00\x01\x0b\x15\x00?3\ +??+\x11\x12\x00910!!\x13654#\ +\x22\x06\x07\x03!\x01!\x06\x06\x0736632\x16\ +\x15\x14\x07\x03\xd1\xfe\xd3\x89\x10l\x5c\x96+b\xfe\xd3\ +\x01J\x01-'*A\x08>\x98d\x8a\x97\x17\x02\x8d\ +D3{\xe4\xcc\xfe1\x06\x14\xb5\xc2\xd4M]\xa7\x9b\ +Ik\x00\x00\x02\x00%\x00\x00\x02\x8d\x06\x14\x00\x0a\x00\ +\x0e\x00\x13@\x0a\x03\x09IY\x03\x00\x0d\x0f\x0c\x15\x00\ +???+10\x014632\x16\x15\x14\x06#\ +\x22\x13!\x13!\x01B_WILX\x5c\x97\x10\xfe\ +\xd3\xed\x01-\x05dWY>:Pc\xfb\x17\x04^\ +\x00\x00\x02\xfe\xf8\xfe\x14\x02\x8f\x06\x14\x00\x0b\x00\x16\x00\ +\x1a@\x0e\x0f\x15IY\x0f\x00\x08\x0f\x00\x05GY\x00\ +\x1b\x00?+\x00\x18??+10\x03\x22'5\x16\ +327\x13!\x01\x02\x134632\x16\x15\x14\x06\ +#\x22ZhF=5\x89$\xfd\x01.\xfe\xf7MX\ +_WILX\x5c\x97\xfe\x14\x19\xf2\x15\xaa\x04\xaa\xfb\ +)\xfe\x8d\x07PWY>:Pc\x00\x01\x00%\x00\ +\x00\x04\xf0\x06\x14\x00\x0f\x00\x19@\x0d\x0e\x06\x05\x02\x04\ +\x08\x09\x00\x00\x0f\x04\x08\x15\x00?3??\x11\x179\ +10\x01!\x01\x01!\x03\x07\x03!\x01!\x03\x06\x07\ +\x073\x03\x98\x01X\xfe\x0e\x01\x1d\xfe\xb0\xb7xJ\xfe\ +\xd3\x01J\x01-\x94\x08\x15\x1c\x04\x04^\xfe\x08\xfd\x9a\ +\x01\xa4H\xfe\xa4\x06\x14\xfdJ)Lf\x00\x00\x01\x00\ +%\x00\x00\x02\x9c\x06\x14\x00\x03\x00\x0a\xb3\x02\x00\x01\x15\ +\x00??10!!\x01!\x01R\xfe\xd3\x01J\x01\ +-\x06\x14\x00\x01\x00%\x00\x00\x06\xd5\x04s\x00&\x00\ +%@\x12%\x03\x00\x17\x0d!\x15\x12\x1c\x00\x1cGY\ +\x06\x00\x10\x22\x0f\x00??2+\x11\x003\x18?3\ +3\x129910\x012\x1736632\x16\x15\ +\x14\x07\x03!\x13654#\x22\x06\x07\x03!\x136\ +54#\x22\x06\x07\x03!\x133\x0736\x03L\xdb\ ++\x06D\xb9i\x88\x8f\x17\x85\xfe\xd3\x8a\x10b\x5c\x95\ +,`\xfe\xd3\x89\x10b\x5c\x96+b\xfe\xd3\xed\xe6\x15\ +\x06\x92\x04s\xe4nv\xaa\x98Lh\xfd\x83\x02\x8dD\ +3{\xe0\xce\xfe/\x02\x8dD3{\xe4\xcc\xfe1\x04\ +^\xcf\xe4\x00\x01\x00%\x00\x00\x04m\x04s\x00\x16\x00\ +\x1c@\x0e\x0e\x0b\x11\x11\x06GY\x11\x10\x0c\x0f\x01\x0b\ +\x15\x00?3??+\x11\x12\x00910!!\x13\ +654#\x22\x06\x07\x03!\x133\x073632\ +\x16\x15\x14\x07\x03\xd1\xfe\xd3\x89\x10l\x5c\x96+b\xfe\ +\xd3\xed\xe6\x15\x06\x92\xd1\x8a\x97\x17\x02\x8dD3{\xe4\ +\xcc\xfe1\x04^\xcf\xe4\xa7\x9bIk\x00\x02\x00Z\xff\ +\xec\x04T\x04s\x00\x0b\x00\x19\x00\x17@\x0c\x17\x02G\ +Y\x17\x10\x10\x08GY\x10\x16\x00?+\x00\x18?+\ +10\x014#\x22\x06\x06\x15\x143266%\x14\ +\x02\x04#\x22&54\x12$32\x16\x03%\x8fK\ +wK\x96KxC\x01/\x8d\xfe\xf6\xb7\xc3\xe9\x8f\x01\ +\x0e\xb5\xc4\xe4\x02\xb8\xc5z\xec}\xb9{\xdb\x81\xd3\xfe\ +\xba\xb3\xeb\xc3\xd5\x01M\xb7\xec\x00\x02\xff\xbc\xfe\x14\x04\ +h\x04s\x00\x14\x00!\x00'@\x14\x10\x0f\x0f\x1b\x0a\ +\x12\x07\x00\x07\x1cGY\x07\x16\x00\x15GY\x00\x10\x00\ +?+\x00\x18?+\x11\x12\x0099\x18??10\ +\x012\x16\x15\x14\x02\x06#\x22&'#\x06\x07\x03!\ +\x013\x0736\x17\x22\x06\x06\x15\x14\x163266\ +54\x03-\x92\xa9\x89\xee\x8fSx3\x08\x0c\x1fH\ +\xfe\xd3\x01V\xe6\x11\x09\x8a:D\x7fMJACz\ +K\x04s\xd7\xc1\xbf\xfe\x9f\xcfJY\x9f\x88\xfe\xac\x06\ +J\xaa\xbf\xf4\x87\xe1\x88P`\x8a\xf1u\xb0\x00\x02\x00\ +Z\xfe\x14\x04\x9e\x04s\x00\x16\x00$\x00'@\x14\x0b\ +\x14\x00\x08\x0d\x0f\x10\x1b\x08\x1eGY\x08\x10\x00\x17G\ +Y\x00\x16\x00?+\x00\x18?+\x00\x18??\x11\x12\ +9910\x05\x22&&54\x12632\x16\x17\ +373\x01!667#\x06\x0672665\ +4&#\x22\x06\x06\x15\x14\x16\x01\x87X\x88M\x90\xea\ +\x8cV\x85:\x089\xe8\xfe\xaa\xfe\xd3/4:\x08H\ +\x8e=@\x7fIKAD{II\x14_\xb6\x80\xc6\ +\x01g\xc5KY\x8f\xf9\xb6\xda\xef\xb9^L\xf3\x8c\xde\ +\x86P`\x90\xectXX\x00\x00\x01\x00%\x00\x00\x03\ +\xaa\x04s\x00\x0f\x00\x14@\x09\x0d\x0a\x05\x00\x10\x0a\x15\ +\x0b\x0f\x00???2\x11910\x012\x17\x03&\ +#\x22\x06\x07\x03!\x133\x0736\x03J;%B\ +-7t\xaf%j\xfe\xd3\xed\xe6\x15\x06\x93\x04s\x0b\ +\xfe\xde\x10\xb7\xab\xfe\x0c\x04^\xcf\xe4\x00\x01\x00\x17\xff\ +\xec\x03\xa0\x04s\x00\x22\x00 @\x10\x0c\x1d\x03\x15\x15\ +\x1aFY\x15\x10\x03\x09FY\x03\x16\x00?+\x00\x18\ +?+\x11\x12\x009910\x01\x14\x06#\x22&'\ +5\x1632654&'&&54632\ +\x17\x07&#\x22\x06\x15\x14\x16\x17\x16\x16\x03=\xf9\xde\ +k\x9fE\x9d\xa2PfJ^y`\xdd\xcd\xc9\xa2c\ +\x8cv9F@X{n\x01q\xbc\xc9\x1e#\xf8Z\ +A8+D4D\x87\x5c\xaa\xbb_\xd7T3+'\ +;-?\x94\x00\x00\x01\x00^\xff\xec\x03o\x05L\x00\ +\x18\x00'@\x13\x0f\x11@\x0b\x14\x0e\x11\x11\x14FY\ +\x11\x0f\x05\x00GY\x05\x16\x00?+\x00\x18?+\x11\ +\x003\x113\x1a\x18\x10\xcd10%27\x15\x06#\ +\x22&547\x13#?\x023\x07!\x07!\x03\x06\ +\x15\x14\x02\x02Aao\x9b\x96\x8d\x0cs\x98\x1d\xc4\x84\ +\xc21\x01\x1b2\xfe\xe6s\x06\xdf#\xe15~\x842\ +>\x02\x1b\x93T\xec\xee\xe5\xfd\xe5\x1e\x17J\x00\x01\x00\ +o\xff\xec\x04\xb2\x04^\x00\x16\x00\x1b@\x0d\x0f\x11\x0a\ +\x00\x0f\x11\x06GY\x11\x16\x0d\x15\x00??+\x00\x18\ +?3\x12910\x01!\x03\x06\x15\x143267\ +\x13!\x03#7#\x06#\x22&547\x01\x06\x01\ +-\x89\x10l\x5c\x96+b\x01-\xed\xe6\x15\x06\x91\xd2\ +\x8a\x92\x18\x04^\xfdsD3{\xe4\xcc\x01\xcf\xfb\xa2\ +\xcf\xe3\xa5\x9c]x\x00\x00\x01\x00f\x00\x00\x04\x8f\x04\ +^\x00\x0b\x00\x10\xb6\x0b\x06\x03\x07\x0f\x06\x15\x00??\ +3\x12910\x0167\x01!\x01!\x03!\x13\x16\ +\x15\x01\xc77%\x01)\x01C\xfd\xa4\xfe\xbd\x8a\x01'\ +-\x07\x01-\x99F\x02R\xfb\xa2\x04^\xfd\xb6\x85b\ +\x00\x00\x01\x00}\x00\x00\x06\xb6\x04^\x00\x1e\x00\x19@\ +\x0c\x00\x13\x09\x03\x05\x1b\x04\x15\x18\x0f\x05\x0f\x00?3\ +3?3\x12\x17910\x01\x06\x07\x03!\x03!\x13\ +\x07\x073>\x027\x13!\x11\x14\x073767\x13\ +!\x01!\x0347\x03X>=\xe9\xfe\xbc3\x01\x19\ +\x04\x04\x07\x04\x06\x10V\x03\xe7\x01H\x0a\x06\x1cI\x16\ +\xdb\x013\xfd\xee\xfe\xb6\x06\x0a\x03\x5c\xb2\x8d\xfd\xe3\x04\ +^\xfe\x11\xa7\xab\x14+\xe6\x04\x02\x18\xfd\xe8\x8e\x9bP\ +\xd02\x01\xef\xfb\xa2\x02\x08\x9b\xb9\x00\x00\x01\xff\x9c\x00\ +\x00\x04\xa4\x04^\x00\x0b\x00\x18@\x0c\x09\x06\x00\x03\x04\ +\x0b\x04\x01\x0f\x08\x0b\x15\x00?3?3\x12\x1791\ +0\x01\x03!\x13\x13!\x01\x13!\x03\x01!\x01{\xe1\ +\x01As\xf4\x01b\xfe-\xf4\xfe\xba}\xfe\xf8\xfe\xa2\ +\x02=\x02!\xfe\xb2\x01N\xfd\xcf\xfd\xd3\x01V\xfe\xaa\ +\x00\x00\x01\xffs\xfe\x14\x04\x91\x04^\x00\x16\x00\x18@\ +\x0b\x04\x16\x09\x00\x0f\x0d\x12GY\x0d\x1b\x00?+\x00\ +\x18?3/310\x13!\x13\x16\x153667\ +\x01!\x01\x02!\x22'5\x1632677f\x01\ +'8\x0e\x06\x140)\x01\x04\x01G\xfdX\xb1\xfe\xce\ +Z9D0T\x7f6\x1a\x04^\xfd\xfaz\xab3\x89\ +U\x02\x1a\xfb\x02\xfe\xb4\x13\xf0\x0d`e1\x00\x01\xff\ +\xd1\x00\x00\x03\xc7\x04^\x00\x09\x00$@\x12\x07\x04\x05\ +\x05\x04FY\x05\x0f\x02\x08\x01\x01\x08FY\x01\x15\x00\ +?+\x11\x12\x009\x18?+\x11\x12\x00910!\ +!7\x01!7!\x07\x01!\x02\xec\xfc\xe5#\x02?\ +\xfes3\x02\xee+\xfd\xca\x01\xb7\xb4\x02\xc1\xe9\xc8\xfd\ +S\x00\x01\xff\xf8\xfe\xbc\x03d\x05\xb6\x00'\x00\x1b@\ +\x0c\x02\x03\x13\x13\x1f\x0c\x0c\x0a\x03\x1e\x1f'\x00?3\ +?3\x11\x129\x113310\x134#726\ +7\x136633\x07\x06\x06\x07\x03\x06\x07\x15\x16\x16\ +\x15\x14\x07\x07\x06\x15\x14\x163\x15#\x22&547\ +76\xc9\xd1-z\x8d\x16=&\xba\xb1T1ZQ\ +\x0fB-\xe7US\x0f$\x07C:5\xa7\xad\x0e'\ +\x0f\x01?\x8c\xe5Sa\x01\x1d\xaa\x8b\xe1\x02AJ\xfe\ +\xd7\xcf\x1d\x08\x1aqN,E\xb2\x1c\x176(\xe2\x7f\ +y9D\xb8E\x00\x01\x01\xc7\xfe/\x02\xa2\x06\x0e\x00\ +\x03\x00\x09\xb2\x03\x00\x00\x00?\xcd10\x013\x11#\ +\x01\xc7\xdb\xdb\x06\x0e\xf8!\x00\x00\x01\xff\x9c\xfe\xbc\x02\ +\xe1\x05\xb6\x00&\x00\x1b@\x0c\x0a\x09\x1b\x1b\x12%&\ +\x03\x13\x13\x12'\x00?\x113?3\x129\x1133\ +10\x01 \x15\x14\x07\x07\x06\x15\x143\x07\x22\x06\x07\ +\x03\x06\x06##5667\x136675&5\ +477654\x01\x00\x01T\x0e'\x0f\ +\xd1-z\x8d\x15>%\xbb\xb1-]X\x0fB\x19\x8c\ +o\xa8\x0f%\x06II)\x05\xb6\xf88D\xb9E\x11\ +\x8b\xe5Ta\xfe\xe4\xaa\x8c\xe2\x03AI\x01)on\ +\x0e\x093\xa6+E\xb3\x1e\x156(\xe1\x00\x00\x01\x00\ +m\x02'\x04%\x03}\x00\x17\x00(@\x19\x03\x0c\x12\ +\x12\x0f\x00\x1f\x06\x01\x0f\x06\x1f\x06?\x06_\x06\x7f\x06\ +\x8f\x06\xaf\x06\x07\x06\x00/]q333}/3\ +310\x01\x22\x06\x075632\x16\x17\x16\x163\ +267\x15\x06#\x22&'&&\x01V6}6\ +e\x9b@jV@^03z=g\x99;da\ +YL\x02\xa0B7\xe7m\x1c$\x1b\x1c=<\xe7m\ +\x17(&\x12\x00\x00\x02\xff\xb6\xfe\x8d\x02%\x04^\x00\ +\x03\x00\x0f\x00!@\x11\x00\x00\x10\x00\x02\x09\x03\x00\x00\ +\x0d\x03\x0d\x07TY\x0d\x0f\x00?+\x00\x18/\x129\ +/_^]10\x133\x03!\x01\x14\x06#\x22&\ +54632\x16\xb6\xf2\x9e\xfe\xac\x02oo^D\ +QlZIS\x02^\xfc/\x05D\x5ckLFU\ +mJ\x00\x00\x01\x00\xa4\xff\xec\x04;\x05\xcb\x00\x1e\x00\ +*@\x0f\x0c\x12PY\x09\x0c@\x0a\x07\x1e\x18OY\ +\x02\x1e\xb8\xff\xc0\xb5\x10\x13H\x1e\x01\x19\x00?\xcd+\ +2+\x00\x18?\x1a\xcd2+10\x05#7&&\ +54\x126773\x07\x16\x17\x07&&#\x22\x02\ +\x15\x14\x163267\x15\x06\x07\x02?\xbc1\x86\x8a\ +}\xe7\x98!\xbc#vk\x5c5hB\x85\xa6ZR\ +K\x82E\x88\xa3\x14\xd2$\xc8\x9e\xc1\x01D\xc9\x17\x9e\ +\x9e\x0e3\xe6\x17\x22\xfe\xe2\xc1``/#\xf6G\x09\ +\x00\x00\x01\xff\xf4\x00\x00\x04\xd9\x05\xcd\x00\x1c\x00-@\ +\x17\x0c\x17\x18\x17QY\x09\x18\x18\x12\x00\x00\x05OY\ +\x00\x07\x12\x0fNY\x12\x18\x00?+\x00\x18?+\x11\ +\x12\x009\x18/3+\x11\x00310\x012\x17\x07\ +&#\x22\x06\x07\x07!\x07!\x07\x06\x07!\x03!7\ +677#73766\x03h\xc3\xaeq\x8d`\ +K`\x14/\x01+-\xfe\xd5\x12*\xa7\x02\x8f7\xfc\ +\x1f1\xc40\x16\xc0-\xc01)\xf2\x05\xcdV\xe8D\ +O]\xe5\xdcT\xc3K\xfe\xfc\xf60\xd8h\xdc\xf7\xc5\ +\xcf\x00\x02\x00s\x00\xfe\x04#\x04\xaa\x00\x1b\x00'\x00\ +.@ \x17\x13\x10\x1a\x02\x0c\x09\x05\x08\x07\x15\x15\x1f\ +\x07\x0f%\x1f%?%_%\x7f%\xaf%\xcf%\xef\ +%\x08%\x00/]3\xc62\x11\x12\x17910\x13\ +47'7\x17632\x177\x17\x07\x16\x15\x14\x07\ +\x17\x07'\x06#\x22'\x07'7&7\x14\x1632\ +654&#\x22\x06\xbe6\x81\x93\x7f[ji[\ +\x7f\x96\x8155}\x92\x7f_esT}\x91\x7f6\ +\xcfmPQoqONo\x02\xd3f_\x7f\x93\x7f\ +57\x81\x8f\x81Ynk\x5c}\x91}33{\x91\ +}]hMonNPnp\x00\x00\x01\x00X\x00\ +\x00\x05\x0a\x05\xb6\x00\x16\x00>@ \x06\x12\x13\x12R\ +Y\x00\x03\x01\x03\x0f\x13\x01\x09\x03\x13\x0f\x0a\x0e\x0f\x0e\ +RY\x07\x0f\x0f\x0c\x01\x15\x06\x0c\x18\x00??3\x12\ +9/3+\x11\x003\x18\x10\xc4_^]2\x11\x12\ +9+\x11\x00310\x01\x01!\x013\x07#\x073\ +\x07#\x07!7#737#73\x03!\x02`\ +\x01s\x017\xfe\x06\xcb'\xfc\x1c\xfc%\xfc/\xfe\xdd\ +/\xfc%\xfc\x1d\xfc'\xc4\xc0\x01)\x03h\x02N\xfd\ +\x15\xb2\x8a\xb2\xdd\xdd\xb2\x8a\xb2\x02\xeb\x00\x02\x01\xc7\xfe\ +/\x02\xa2\x06\x0e\x00\x03\x00\x07\x00\x11\xb6\x03\x04\x03\x04\ +\x07\x00\x00\x00?/99//10\x013\x11#\ +\x113\x11#\x01\xc7\xdb\xdb\xdb\xdb\x06\x0e\xfc\xd1\xfe\x7f\ +\xfc\xd1\x00\x00\x02\x00\x14\xff\xec\x04\x04\x06)\x00*\x00\ +5\x00\x1a@\x0e1+\x13\x171(\x06\x1d\x0e\x09\x01\ +\x22\x1d\x16\x00?3?3\x12\x17910\x1346\ +7&&54632\x17\x07&#\x22\x15\x14\x16\ +\x17\x16\x15\x14\x07\x16\x16\x15\x14\x06#\x22'5\x163\ +2654&'&&\x01\x06\x06\x15\x14\x16\x176\ +654\x96_k*8\xea\xc4\xac\xacR\x93\x87\x90\ +QW\xf2\xc1&4\xfc\xdb\xcc\x84\xac\xadc[B^\ +u\x80\x01d3>Wd15\x02\xf8Y\x94D\x22\ +e9\x95\xabX\xc1Tj+B'j\xc5\xbcs#\ +e:\xa1\xb9K\xe0iF9'C.9\x94\x015\ +\x19[66U.\x1f_0m\x00\x00\x02\x01\x8d\x04\ +\xf8\x04F\x06\x04\x00\x09\x00\x14\x00\x0e\xb4\x0d\x03\x03\x13\ +\x08\x00/33\x11310\x014632\x15\x14\ +\x06#\x22%4632\x16\x15\x14\x06#\x22\x01\x8d\ +UM\x85NR\x87\x01\x92TNADOQ\x87\x05\ +fNPlIWnNP84IW\x00\x03\x00\ +}\xff\xec\x06\x5c\x05\xcb\x00\x16\x00&\x006\x00G@\ +2\x00\x00\x12\x01\x00\x12\x10\x12p\x12\x80\x12\x90\x12\xe0\ +\x12\xf0\x12\x07\x12\x12\x1b\x06\x0f\x0c\x01\x0f\x0c\x1f\x0c\x7f\ +\x0c\x8f\x0c\x9f\x0c\xef\x0c\xff\x0c\x07\x0c\x0c#3\x1b\x04\ ++#\x13\x00?3?3\x129/]q3\x119\ +/]q310\x01\x22\x06\x15\x14\x163267\ +\x15\x06#\x22&54632\x17\x07&\x014\x12\ +$32\x04\x12\x15\x14\x02\x04#\x22$\x027\x14\x12\ +\x0432$\x1254\x02$#\x22\x04\x02\x03\xa4o\ +hoh+\x83;\x83\x83\xc4\xde\xeb\xd0\x8e\x8eKr\ +\xfc~\xc8\x01^\xca\xc7\x01]\xcb\xc5\xfe\xa4\xce\xcf\xfe\ +\xa2\xc3\x8d\xa3\x01\x1d\xa3\xa7\x01\x1a\xa1\xa1\xfe\xe5\xa6\xa4\ +\xfe\xe3\xa2\x03\xf2\x92\x8d\x86\x8a\x1f\x1c\xbf9\xf5\xd6\xe1\ +\xfcH\xae:\xfe\xe9\xc8\x01^\xca\xc6\xfe\x9f\xc9\xc7\xfe\ +\xa4\xcc\xcf\x01Z\xc6\xa4\xfe\xe6\xa4\xa6\x01\x19\xa3\xa3\x01\ +\x19\xa6\xa5\xfe\xe6\x00\x02\x00\x98\x02\xf0\x03m\x05\xc7\x00\ +\x11\x00\x1c\x00\x18@\x0a\x0a\x0f\x07\x0e\x12\x00\x0b\x18\x07\ +\x1f\x00?3\xc4\xd42\xc4\x129910\x01\x22&\ +546632\x17373\x03#7#\x06'\ +26654#\x22\x06\x15\x14\x01qgr\x5c\x9a\ +dx<\x06'\x9a\x9e\x9a\x08\x02P1-N5X\ +Ie\x02\xf0\x8c\x80u\xdexgZ\xfdB\x5ch\x97\ +S\x9dLj\xc0wo\x00\x02\x00H\x00Z\x04\x7f\x04\ +\x08\x00\x06\x00\x0d\x00=@\x1e\x0d\x06\x06\x03\x07\x00\x00\ +\x0a\x03\x03\x02\x0b\x04\x04\x0c0\x05\x01\x05\x05\x01\x0e\x09\ +\x02\x02\x08 \x01\x01\x01\x00/]33\x113\x11\x12\ +9/]33\x113\x129\x1133\x113\x113\ +\x11310\x13\x01\x17\x01\x13\x07\x03%\x01\x17\x01\x13\ +\x07\x03H\x01\x91\xbf\xfe\xe9\x87\xf6\xca\x01\xe7\x01\x92\xbe\ +\xfe\xe9\x88\xf6\xcb\x029\x01\xcf\x9b\xfe\xb2\xfe\xa2g\x01\ +\xcd\x12\x01\xcf\x9b\xfe\xb2\xfe\xa2g\x01\xcd\x00\x00\x01\x00\ +m\x00\xf8\x04%\x03?\x00\x05\x00\x1f@\x15\x01\x03\x0f\ +\x04\x1f\x04?\x04\x03/\x04\x9f\x04\xbf\x04\xdf\x04\xef\x04\ +\x05\x04\x00/]q3\xc410%#\x11!5!\ +\x04%\xdb\xfd#\x03\xb8\xf8\x01l\xdb\xff\xff\x00)\x01\ +\xa8\x02j\x02\xa2\x02\x06\x00\x10\x00\x00\x00\x04\x00}\xff\ +\xec\x06\x5c\x05\xcb\x00\x0d\x00\x16\x00&\x006\x009@\ +\x1f\x03\x07\x07\x0e\x0e\x0a\x05\x09\x0f\x09\x1f\x09\x02\x16\x0a\ +\x00\x0a\x10\x0a\x02\x09\x0a\x09\x0a#3\x1b\x04+#\x13\ +\x00?3?3\x1299//]\x113]\x113\ +\x129/3\x11310\x01\x14\x06\x07\x13#\x03#\ +\x11#\x11!2\x16\x0132654&##\x01\ +4\x12$32\x04\x12\x15\x14\x02\x04#\x22$\x027\ +\x14\x12\x0432$\x1254\x02$#\x22\x04\x02\x04\ +\xd5XV\xc5\xfe\x8aC\xe6\x014\xad\xb9\xfeL3H\ +RGQ5\xfd\x5c\xc8\x01^\xca\xc7\x01]\xcb\xc5\xfe\ +\xa4\xce\xcf\xfe\xa2\xc3\x8d\xa3\x01\x1d\xa3\xa7\x01\x1a\xa1\xa1\ +\xfe\xe5\xa6\xa4\xfe\xe3\xa2\x03\x83V\x7f!\xfe\x98\x01)\ +\xfe\xd7\x03j\x87\xfe\xee>=;;\xfe\xf4\xc8\x01^\ +\xca\xc6\xfe\x9f\xc9\xc7\xfe\xa4\xcc\xcf\x01Z\xc6\xa4\xfe\xe6\ +\xa4\xa6\x01\x19\xa3\xa3\x01\x19\xa6\xa5\xfe\xe6\x00\x00\x01\xff\ +\xfa\x06\x14\x043\x06\xdd\x00\x03\x00\x19@\x11\x02\x0f\x01\ +/\x01?\x01o\x01\x7f\x01\xaf\x01\xef\x01\x07\x01\x00/\ +]310\x01!7!\x04\x06\xfb\xf4-\x04\x0c\x06\ +\x14\xc9\x00\x00\x02\x00\xa4\x03\x19\x03X\x05\xcb\x00\x0f\x00\ +\x1b\x00\x16@\x0b\x13p\x0c\x01_\x0c\x01\x0c\x19\x04\x07\ +\x00?3\xc4]]210\x1346632\x16\ +\x16\x15\x14\x06\x06#\x22&&7\x14\x163265\ +4&#\x22\x06\xa4]\xa2[]\xa1\x5c\x5c\xa0^]\ +\xa0]\xbe[ABZ[AA[\x04q]\xa1\x5c\ +^\xa0\x5c]\xa0[Z\xa0^?[\x5c>?^_\ +\x00\x00\x02\x00m\x00\x00\x04%\x04\xee\x00\x0b\x00\x0f\x00\ +\x17@\x09\x0d\x0c\x0b\x09\x01\x01\x06\x04\x02\x00/33\ +3\x1133/310\x01!5!\x113\x11!\ +\x15!\x11#\x015!\x15\x01\xdb\xfe\x92\x01n\xdb\x01\ +o\xfe\x91\xdb\xfe\x92\x03\xb8\x02\xa2\xdb\x01q\xfe\x8f\xdb\ +\xfe\x93\xfe\xcb\xdb\xdb\x00\x00\x01\x00;\x02J\x03+\x05\ +\xcb\x00\x19\x00\x15@\x09\x02\x18\x01\x0a\x10\x1f\x18\x01 \ +\x00?3?3\x11\x12910\x01!7%>\x02\ +54&#\x22\x07'6632\x16\x15\x14\x06\x06\ +\x07\x07!\x02\xc3\xfdx#\x01\x11o<\x1d3#V\ +fdJ\xa4n{\x93,`\x8d\x81\x01[\x02J\xa6\ +\xdb[>8\x1c*(R\x9e9<~aFje\ +f_\x00\x00\x01\x00\x5c\x029\x03-\x05\xc9\x00%\x00\ +'@\x17\x03\x16\x16\x0f\x17\x1f\x17\xbf\x17\xcf\x17\xdf\x17\ +\x05\x17\x17\x09\x1e#\x1f\x0f\x09!\x00?3?3\x12\ +9/]3\x12910\x01\x14\x06\x07\x15\x16\x15\x14\ +\x06#\x22&'5\x1632654&##7\ +32654&#\x22\x07'632\x16\x03-\ +fs\x9a\xd6\xb2K\x8d2}\x81Lb4>\x7f\x22\ +ZTa4-VfR\x8e\xab\x82\x99\x04\xf6Wu\ +\x1e\x04!\x8f\x83\x9c\x1f\x19\xc0H=:%3\xa08\ +9((B\x96\x5co\x00\x01\x01\xe3\x04\xd9\x04\x10\x06\ +!\x00\x08\x00\x0a\xb2\x03\x80\x08\x00/\x1a\xcd10\x01\ +67!\x15\x06\x06\x07#\x01\xe3O\x8f\x01O.\xd8\ +V\xd1\x04\xf2X\xd7\x118\xc1>\x00\x00\x01\xff\xbc\xfe\ +\x14\x04\xbe\x04^\x00\x1a\x00 @\x10\x12\x0c\x0e\x07\x17\ +\x0f\x16\x1b\x0e\x03GY\x0e\x16\x0a\x15\x00??+\x00\ +\x18??3\x129910\x01\x14\x163267\ +\x13!\x03#7#\x06#\x22&'#\x06\x06\x03!\ +\x01!\x03\x06\x01\xa8?0Z\x91-b\x01-\xed\xe5\ +\x12\x06u\x953M\x14\x06\x08\x1bE\xfe\xd0\x01V\x01\ +-\x87\x10\x01\x5cT\xd8\xcc\xd7\xec\x02\x5c\xfe\xfc\x06P\xf9\xb0\x03\ +3\x12\xfa\xfb\x01\x00\x01\x02\x00\xff\xff\x00\x83\x02)\x01\ +\xe5\x03}\x00\x07\x00\x11\x00j\x02D\x00\x01\xff1\xfe\ +\x14\x01\x06\x00\x00\x00\x11\x00\x1b@\x0b\x10\x10\x0d\x0d\x09\ +\x0e\x06\x09\x09\x03\x1b\x00?3\x113/\x129\x129\ +|/10\x05\x14\x06#\x22'5\x163254\ +&'73\x07\x16\x01\x06\xa6\x97VB?>f>\ +O`\xb9'\x8d\xfat~\x17\xa8\x17R\x22-\x09\x9a\ +H1\x00\x00\x01\x00\x81\x02J\x02\xdf\x05\xb6\x00\x0a\x00\ +\x10\xb6\x06\x09\x03\x00\x1e\x03 \x00??\x11991\ +0\x013\x03#\x1367\x06\x07\x07'\x02\x10\xcf\xba\ +\xf6T\x18\x1f\x10@\x83f\x05\xb6\xfc\x94\x01\x8dmb\ +\x0f-Q\xa5\x00\x00\x02\x00\xa2\x02\xf0\x03)\x05\xc7\x00\ +\x0c\x00\x16\x00\x0d\xb4\x12\x04\x0d\x0a\x1f\x00?3\xc42\ +10\x01\x14\x06\x06#\x22&54632\x16\x05\ +\x22\x06\x15\x1432654\x03)a\xa8p\x86\x88\ +\xd0\xad\x81\x89\xfe\xe1@WP?T\x04\xaa\x80\xd1i\ +\x96\x88\xc5\xf4\x93\x11\xb3no\xabzk\x00\x00\x02\x00\ +\x00\x00H\x047\x03\xf6\x00\x06\x00\x0d\x00E@'\x0d\ +\x06\x06\x03\x07\x00\x00\x0a\x03\x03\x04\x09\x02\x02\x08\x01\x01\ +\x05\x0e\x0b\x04\x04\x0c\x0f\x05O\x05o\x05\x8f\x05\xaf\x05\ +\xcf\x05\xef\x05\x07\x05\x00/]33\x113\x11\x129\ +/33\x113\x129\x1133\x113\x113\x113\ +10\x01\x01'\x01\x037\x13\x05\x01'\x01\x037\x13\ +\x047\xfeo\xbf\x01\x17\x87\xf6\xca\xfe\x19\xfen\xbe\x01\ +\x17\x88\xf6\xcb\x02\x17\xfe1\x9b\x01N\x01^g\xfe3\ +\x12\xfe1\x9b\x01N\x01^g\xfe3\xff\xff\x00a\x00\ +\x00\x06J\x05\xb6\x00'\x02\x17\x02\xc5\x00\x00\x00&\x00\ +{\xe0\x00\x01\x07\x02<\x03\x1d\xfd\xb7\x00\x09\xb3\x03\x02\ +\x12\x12\x00?55\x00\xff\xff\x00a\x00\x00\x06\x9c\x05\ +\xb6\x00'\x00t\x03q\xfd\xb7\x00&\x00{\xe0\x00\x01\ +\x07\x02\x17\x02\xc5\x00\x00\x00\x07\xb2\x00\x01\x12\x00?5\ +\x00\xff\xff\x00\x85\x00\x00\x06\x87\x05\xc9\x00'\x02\x17\x03\ +J\x00\x00\x00'\x02<\x03Z\xfd\xb7\x01\x06\x00u)\ +\x00\x00\x09\xb3\x02\x01\x07\x12\x00?55\x00\x00\x02\xff\ +\xbc\xfey\x03\x04\x04^\x00\x1a\x00&\x00&@\x14\x00\ +\x1a\x10\x1a\x02\x09\x03\x1a\x1a\x0f$$\x1eTY$\x0f\ +\x09\x0f\x22\x00?3?+\x11\x12\x009\x18/_^\ +]10\x01\x07\x06\x06\x07\x06\x06\x15\x143267\ +\x17\x06#\x22&546676677\x01\x14\ +\x06#\x22&54632\x16\x02\xa6\x0e\x13sp\ +zE\x852q\x91\x5c\xdd\xe0\xb1\xce9n\x86]F\ +\x10\x08\x01`o^DQmYIS\x02^Ni\ +\x96LSV7v D\xdd}\xaf\x9dR\x85sY\ +>Y>!\x01s\x5ckLFVlJ\xff\xff\xff\ +\x85\x00\x00\x04\x8b\x07s\x02&\x00$\x00\x00\x01\x07\x00\ +C\x00\x1f\x01R\x00\x08\xb3\x02\x11\x05&\x00+5\xff\ +\xff\xff\x85\x00\x00\x05\x0c\x07s\x02&\x00$\x00\x00\x01\ +\x07\x00v\x00\xfc\x01R\x00\x08\xb3\x02\x18\x05&\x00+\ +5\xff\xff\xff\x85\x00\x00\x04\xd3\x07s\x02&\x00$\x00\ +\x00\x01\x07\x01K\x00s\x01R\x00\x08\xb3\x02\x16\x05&\ +\x00+5\xff\xff\xff\x85\x00\x00\x05\x06\x07`\x02&\x00\ +$\x00\x00\x01\x07\x01R\x00\x85\x01R\x00\x08\xb3\x02\x19\ +\x05&\x00+5\xff\xff\xff\x85\x00\x00\x04\xbd\x07V\x02\ +&\x00$\x00\x00\x01\x07\x00j\x00w\x01R\x00\x0a\xb4\ +\x03\x02#\x05&\x00+55\xff\xff\xff\x85\x00\x00\x04\ +\x8b\x07\x0a\x02&\x00$\x00\x00\x01\x06\x01P5X\x00\ +\x09\xb3\x03\x02%\x03\x00?55\x00\x00\x02\xff\x85\x00\ +\x00\x07o\x05\xb6\x00\x0f\x00\x13\x00H@'\x0a\x0dL\ +Y\x0c\x0a\x01\x0d\x03\x0a\x0a\x01\x06\x13\x03LY\x0a\x13\ +\x0a\x13\x01\x06\x05\x12\x09\x12\x06\x12LY\x06\x03\x01\x0e\ +LY\x01\x12\x00?+\x00\x18?+\x11\x003\x18?\ +\x11\x1299//+\x11\x12\x009\x18/_^]\ ++10!!\x13!\x03!\x01!\x07!\x03!\x07\ +!\x03!\x01\x13#\x01\x069\xfc\xcfJ\xfeV\xdb\xfe\ +\xb8\x03\x9a\x04P6\xfe\x00C\x01\xdd7\xfe\x22O\x02\ +\x00\xfd\x1a\x7fP\xfe\x94\x01\x5c\xfe\xa4\x05\xb6\xfe\xfe\xbf\ +\xfe\xfe\x87\x01`\x02X\xfd\xa8\xff\xff\x00{\xfe\x14\x05\ +7\x05\xcd\x02&\x00&\x00\x00\x00\x07\x00z\x023\x00\ +\x00\xff\xff\x005\x00\x00\x04\x9c\x07s\x02&\x00(\x00\ +\x00\x01\x07\x00C\xff\xe4\x01R\x00\x08\xb3\x01\x0d\x05&\ +\x00+5\xff\xff\x005\x00\x00\x04\x9c\x07s\x02&\x00\ +(\x00\x00\x01\x07\x00v\x00}\x01R\x00\x08\xb3\x01\x14\ +\x05&\x00+5\xff\xff\x005\x00\x00\x04\x9c\x07s\x02\ +&\x00(\x00\x00\x01\x07\x01K\x009\x01R\x00\x08\xb3\ +\x01\x12\x05&\x00+5\xff\xff\x005\x00\x00\x04\x9c\x07\ +V\x02&\x00(\x00\x00\x01\x07\x00j\x00)\x01R\x00\ +\x0a\xb4\x02\x01\x1f\x05&\x00+55\xff\xff\xff\xc5\x00\ +\x00\x03\x81\x07s\x02&\x00,\x00\x00\x01\x07\x00C\xff\ +\x1e\x01R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\xff\xff\ +\xc5\x00\x00\x03\xf4\x07s\x02&\x00,\x00\x00\x01\x07\x00\ +v\xff\xe4\x01R\x00\x08\xb3\x01\x14\x05&\x00+5\xff\ +\xff\xff\xc5\x00\x00\x03\xd2\x07s\x02&\x00,\x00\x00\x01\ +\x07\x01K\xffr\x01R\x00\x08\xb3\x01\x12\x05&\x00+\ +5\xff\xff\xff\xc5\x00\x00\x03\xc0\x07V\x02&\x00,\x00\ +\x00\x01\x07\x00j\xffz\x01R\x00\x0a\xb4\x02\x01\x1f\x05\ +&\x00+55\x00\x02\x00%\x00\x00\x05+\x05\xb6\x00\ +\x0d\x00\x1b\x00-@\x17\x1a\x07\x08\x07LY\x17\x08\x08\ +\x05\x0a\x0a\x16LY\x0a\x03\x05\x1bLY\x05\x12\x00?\ ++\x00\x18?+\x11\x12\x009\x18/3+\x11\x003\ +10\x01\x10\x02\x04#!\x13#73\x13! \x00\ +\x0126\x1254&##\x033\x07#\x03\x05+\ +\xc4\xfe\x8d\xfc\xfe=}\x8d7\x8b\x83\x01\x8c\x01\x0e\x01\ +'\xfc\xdb\x94\xdc|\x91\x88sK\xed7\xeeG\x03\x8d\ +\xfe\xe8\xfec\xd8\x02T\xfe\x02d\xfe\xe2\xfch\x98\x01\ +'\xbe\x9a\xa1\xfe\x9a\xfe\xfe\xac\xff\xff\x005\x00\x00\x06\ +\x14\x07`\x02&\x001\x00\x00\x01\x07\x01R\x00\xf8\x01\ +R\x00\x08\xb3\x01\x1a\x05&\x00+5\xff\xff\x00{\xff\ +\xec\x05\x98\x07s\x02&\x002\x00\x00\x01\x07\x00C\x00\ +w\x01R\x00\x08\xb3\x02\x1d\x05&\x00+5\xff\xff\x00\ +{\xff\xec\x05\x98\x07s\x02&\x002\x00\x00\x01\x07\x00\ +v\x01\x0e\x01R\x00\x08\xb3\x02$\x05&\x00+5\xff\ +\xff\x00{\xff\xec\x05\x98\x07s\x02&\x002\x00\x00\x01\ +\x07\x01K\x00\xbc\x01R\x00\x08\xb3\x02\x22\x05&\x00+\ +5\xff\xff\x00{\xff\xec\x05\x98\x07`\x02&\x002\x00\ +\x00\x01\x07\x01R\x00\xcd\x01R\x00\x08\xb3\x02%\x05&\ +\x00+5\xff\xff\x00{\xff\xec\x05\x98\x07V\x02&\x00\ +2\x00\x00\x01\x07\x00j\x00\xbc\x01R\x00\x0a\xb4\x03\x02\ +/\x05&\x00+55\x00\x01\x00\x81\x01\x0c\x04\x10\x04\ +\x9a\x00\x0b\x00\x12@\x0a/\x00_\x00\x7f\x00\xdf\x00\x04\ +\x00\x00\x19/]10\x01\x017\x01\x01\x17\x01\x01\x07\ +\x01\x01'\x01\xac\xfe\xd5\x98\x01-\x011\x99\xfe\xcf\x01\ +-\x95\xfe\xcf\xfe\xd3\x96\x02\xd3\x01-\x9a\xfe\xd5\x01+\ +\x96\xfe\xcf\xfe\xd1\x98\x01-\xfe\xd5\x98\x00\x03\x00d\xff\ +\xaa\x05\xb2\x06\x04\x00\x15\x00\x1e\x00&\x00 @\x10\x1c\ + #\x16\x0f\x16MY\x0f\x04\x04#LY\x04\x13\x00\ +?+\x00\x18?+\x11\x12\x009910\x01\x10\x02\ +\x04#\x22'\x07'7&5\x10\x12$32\x177\ +\x17\x07\x16%\x22\x06\x02\x15\x14\x17\x01&\x13'\x01\x16\ +326\x12\x05\x98\xc6\xfe\xa8\xe0\xb4|l\x9ayb\ +\xc6\x01\x5c\xe4\xb6{i\x97u[\xfd\xce~\xcer\x08\ +\x02TE\xae\x05\xfd\xb3;^|\xccq\x03\xaa\xfe\xe5\ +\xfeA\xe4G\x89s\x97\x8a\xdb\x01\x09\x01\xbd\xeeL\x83\ +u\x91\x86Y\xb7\xfe\xbe\xbf E\x02\xf2+\xfe\xd1P\ +\xfd\x1c%\xb2\x01=\x00\xff\xff\x00\x8d\xff\xec\x05\x9a\x07\ +s\x02&\x008\x00\x00\x01\x07\x00C\x00D\x01R\x00\ +\x08\xb3\x01\x16\x05&\x00+5\xff\xff\x00\x8d\xff\xec\x05\ +\x9a\x07s\x02&\x008\x00\x00\x01\x07\x00v\x01\x12\x01\ +R\x00\x08\xb3\x01\x1d\x05&\x00+5\xff\xff\x00\x8d\xff\ +\xec\x05\x9a\x07s\x02&\x008\x00\x00\x01\x07\x01K\x00\ +\xa4\x01R\x00\x08\xb3\x01\x1b\x05&\x00+5\xff\xff\x00\ +\x8d\xff\xec\x05\x9a\x07V\x02&\x008\x00\x00\x01\x07\x00\ +j\x00\xa8\x01R\x00\x0a\xb4\x02\x01(\x05&\x00+5\ +5\xff\xff\x00\xba\x00\x00\x05?\x07s\x02&\x00<\x00\ +\x00\x01\x07\x00v\x00{\x01R\x00\x08\xb3\x01\x11\x05&\ +\x00+5\x00\x02\x005\x00\x00\x04w\x05\xb6\x00\x0c\x00\ +\x14\x00\x1f@\x11\x04\x0dLY\x09\x14LY\x04\x09\x04\ +\x09\x06\x07\x03\x06\x12\x00??\x1299//++\ +10\x01\x14\x00!#\x03!\x01!\x0732\x16\x01\ +32654##\x04w\xfe\xab\xfe\xd8V>\xfe\ +\xcf\x015\x0122#\xf2\xf8\xfdd7\x8b\xa7\xc3J\ +\x03'\xf3\xfe\xf1\xfe\xdb\x05\xb6\xe5\xd5\xfe'\x85w\xb4\ +\x00\x00\x01\xfe\xfc\xfe\x14\x05\x14\x06\x1f\x00:\x00,@\ +\x18&\x09\x1a\x03\x17)\x00)GY\x00\x00\x12\x17F\ +Y\x12\x1605GY0\x1b\x00?+\x00\x18?+\ +\x00\x18?+\x11\x12\x00\x17910\x012\x16\x15\x14\ +\x06\x07\x06\x06\x15\x14\x16\x17\x16\x16\x15\x14\x06#\x22'\ +5\x1632654&'&&54676\ +654&#\x22\x06\x07\x03\x06\x06#\x22'5\x16\ +327\x136$\x03N\xd0\xf6b\x81I.,9\ +kK\xf7\xd6\xbbn\x80\x82e^5R^FZu\ +BMOU`x\x19\xfe+\xd0\xadZF=6\x85\ +%\xfe/\x01\x0e\x06\x1f\xb4\x96r\x9cJ*5\x1c\x17\ +5+S\x87S\xaa\xc8=\xf0NB5(F>H\ +tDTzB%N9>Igx\xfb=\xc6\xb5\ +\x19\xf2\x15\xb2\x04\xb7\xe0\xcc\x00\xff\xff\x00Z\xff\xec\x04\ +\x9e\x06!\x02&\x00D\x00\x00\x01\x06\x00C\xbf\x00\x00\ +\x08\xb3\x02\x22\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\ +\x9e\x06!\x02&\x00D\x00\x00\x01\x06\x00vs\x00\x00\ +\x08\xb3\x02)\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\ +\x9e\x06 \x02&\x00D\x00\x00\x01\x06\x01K\x00\xff\x00\ +\x08\xb3\x02'\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\ +\x9e\x06\x0e\x02&\x00D\x00\x00\x01\x06\x01R\x12\x00\x00\ +\x08\xb3\x02*\x11&\x00+5\xff\xff\x00Z\xff\xec\x04\ +\x9e\x06\x04\x02&\x00D\x00\x00\x01\x06\x00j\x00\x00\x00\ +\x0a\xb4\x03\x024\x11&\x00+55\xff\xff\x00Z\xff\ +\xec\x04\x9e\x06\xb2\x02&\x00D\x00\x00\x01\x06\x01P\xf5\ +\x00\x00\x0a\xb4\x03\x02$\x11&\x00+55\x00\x03\x00\ +Z\xff\xec\x06\xc7\x04s\x00,\x00:\x00C\x00T@\ +0\x14\x18\x03\x06\x04\x0a\x11>\x22KY\x0f>\x01\x0c\ +\x06>>\x00\x1b\x16\x0f\x1b;JY\x1b\x10\x114G\ +Y\x11\x10\x00'FY\x00\x0a\x0a-GY\x0a\x16\x05\ +\x15\x00??+\x11\x003+\x00\x18?+\x00\x18?\ ++\x00\x18?\x11\x129/_^]+\x11\x12\x00\x17\ +910\x05\x22&'\x07#7#\x06\x06#\x22&\ +54\x12632\x16\x17373\x076632\ +\x16\x15\x14\x04!#\x07\x15\x14\x163267\x15\x06\ +%26654&#\x22\x06\x06\x15\x14\x16\x01\x22\ +\x06\x0732654\x04\xb6m\x8d/\x10\xbc\x0e\x06\ +G\x97\x5c\x92\xa3\x89\xe9\x8e`\x812\x069\xbc\x12,\ +\x99\x5c\x9d\xb3\xfe\xb2\xfe\xcb4\x02ohB\xacL\xb3\ +\xfc\x9aH|JBEDxFA\x03qX\x9c\x18\ +-\x9b\xad\x146<^\x91XM\xda\xbb\xc8\x01_\xcb\ +MW\x8fZ1>\xa7\x8a\xbb\xcb\x13\x13`g.(\ +\xe3V\xf3\x88\xe9\x7fP`\x8a\xe9}T\x5c\x02\xbb\xa0\ +saS_\x00\xff\xff\x00Z\xfe\x14\x03\xf2\x04s\x02\ +&\x00F\x00\x00\x00\x07\x00z\x01\x87\x00\x00\xff\xff\x00\ +Z\xff\xec\x04B\x06!\x02&\x00H\x00\x00\x01\x06\x00\ +C\xab\x00\x00\x08\xb3\x02#\x11&\x00+5\xff\xff\x00\ +Z\xff\xec\x04B\x06!\x02&\x00H\x00\x00\x01\x06\x00\ +v-\x00\x00\x08\xb3\x02*\x11&\x00+5\xff\xff\x00\ +Z\xff\xec\x04M\x06!\x02&\x00H\x00\x00\x01\x06\x01\ +K\xed\x00\x00\x08\xb3\x02(\x11&\x00+5\xff\xff\x00\ +Z\xff\xec\x04B\x06\x04\x02&\x00H\x00\x00\x01\x06\x00\ +j\xe0\x00\x00\x0a\xb4\x03\x025\x11&\x00+55\xff\ +\xff\x00%\x00\x00\x02C\x06!\x02&\x00\xf3\x00\x00\x01\ +\x07\x00C\xfe\x9d\x00\x00\x00\x08\xb3\x01\x05\x11&\x00+\ +5\xff\xff\x00%\x00\x00\x03P\x06!\x02&\x00\xf3\x00\ +\x00\x01\x07\x00v\xff@\x00\x00\x00\x08\xb3\x01\x0c\x11&\ +\x00+5\xff\xff\x00$\x00\x00\x03M\x06!\x02&\x00\ +\xf3\x00\x00\x01\x07\x01K\xfe\xed\x00\x00\x00\x08\xb3\x01\x0a\ +\x11&\x00+5\xff\xff\x00%\x00\x00\x037\x06\x04\x02\ +&\x00\xf3\x00\x00\x01\x07\x00j\xfe\xf1\x00\x00\x00\x0a\xb4\ +\x02\x01\x17\x11&\x00+55\x00\x02\x00H\xff\xec\x04\ +\x85\x06'\x00\x1e\x00,\x007@\x1e\x1e\x00\x1c\x05\x08\ +\x07\x06\x1d\x1d\x06\x1a\x0f\x16\x16&FY\x16\x16\x0f\x02\ +\x03\x06\x01\x0f\x1fFY\x0f\x16\x00?+\x00\x18?\xc6\ +2\x119/+\x11\x12\x009\x129\x11\x17910\ +\x01&'7\x16\x177\x17\x07\x16\x12\x15\x14\x02\x04#\ +\x22&54\x12632\x16\x173&'\x07'\x13\ +26654&#\x22\x06\x06\x15\x14\x16\x02j\x22\ +Zv\x86b\xedL\xc0Q@\x8b\xfe\xf4\xbd\xd8\xe2\x81\ +\xe8\x95S\x89.\x06\x14a\xe7XnBqAMF\ +Ir?N\x05\x1d\x22.\xba=N\x83\x98jk\xff\ +\x00\x97\xf9\xfe\x91\xc7\xdc\xce\xa5\x01\x10\x98>?\xd5a\ +\x83\x93\xfc!o\xbadM[j\xb4kQ[\x00\xff\ +\xff\x00%\x00\x00\x04\xac\x06\x0e\x02&\x00Q\x00\x00\x01\ +\x06\x01R+\x00\x00\x08\xb3\x01 \x11&\x00+5\xff\ +\xff\x00Z\xff\xec\x04T\x06!\x02&\x00R\x00\x00\x01\ +\x06\x00C\xa7\x00\x00\x08\xb3\x02\x1b\x11&\x00+5\xff\ +\xff\x00Z\xff\xec\x04h\x06!\x02&\x00R\x00\x00\x01\ +\x06\x00vX\x00\x00\x08\xb3\x02\x22\x11&\x00+5\xff\ +\xff\x00Z\xff\xec\x04U\x06!\x02&\x00R\x00\x00\x01\ +\x06\x01K\xf5\x00\x00\x08\xb3\x02 \x11&\x00+5\xff\ +\xff\x00Z\xff\xec\x04\x80\x06\x0e\x02&\x00R\x00\x00\x01\ +\x06\x01R\xff\x00\x00\x08\xb3\x02#\x11&\x00+5\xff\ +\xff\x00Z\xff\xec\x04T\x06\x04\x02&\x00R\x00\x00\x01\ +\x06\x00j\xf5\x00\x00\x0a\xb4\x03\x02-\x11&\x00+5\ +5\x00\x03\x00m\x00\xdd\x04%\x04\xc7\x00\x03\x00\x0f\x00\ +\x1b\x003@$\x19\x9f\x13\x01\x13\x0d\x00\x07P\x07`\ +\x07p\x07\x04\x07\x00\x0f\x01\x1f\x01?\x01\x03/\x01\x9f\ +\x01\xbf\x01\xdf\x01\xef\x01\x05\x01\x00/]q3\xc4]\ +2\xc4]210\x135!\x15\x054632\x16\ +\x15\x14\x06#\x22&\x114632\x16\x15\x14\x06#\ +\x22&m\x03\xb8\xfd\x97JBBIJAAKJ\ +BCHJAAK\x02d\xdb\xdb\xefLKNI\ +FRN\x03\x04KMQGFQN\x00\x00\x03\x00\ ++\xff\x9a\x04f\x04\x93\x00\x15\x00\x1d\x00%\x00 @\ +\x10\x1a\x22\x1e\x16\x0f\x16FY\x0f\x10\x04\x1eFY\x04\ +\x16\x00?+\x00\x18?+\x11\x12\x009910\x01\ +\x14\x02\x04#\x22'\x07'7&54\x12$32\ +\x177\x17\x07\x16%\x22\x06\x06\x15\x15\x01&\x032\x12\ +55\x01\x16\x16\x04T\x8d\xfe\xf6\xb7{fm\x8dw\ +H\x8f\x01\x0e\xb5\x83`F\x91TB\xfeBQ\x7fE\ +\x01m#\xacr\x9e\xfe\x9a\x0b1\x02\xb8\xd3\xfe\xba\xb3\ +5\x87l\x94k\x95\xd5\x01M\xb78Xnik6\ +}\xd6~\x0c\x01\xc5\x18\xfdP\x01\x0a\xb9\x10\xfeD\x08\ +\x0f\xff\xff\x00o\xff\xec\x04\xb2\x06!\x02&\x00X\x00\ +\x00\x01\x06\x00C\xa7\x00\x00\x08\xb3\x01\x18\x11&\x00+\ +5\xff\xff\x00o\xff\xec\x04\xb2\x06!\x02&\x00X\x00\ +\x00\x01\x06\x00v\x7f\x00\x00\x08\xb3\x01\x1f\x11&\x00+\ +5\xff\xff\x00o\xff\xec\x04\xb2\x06!\x02&\x00X\x00\ +\x00\x01\x06\x01K\x17\x00\x00\x08\xb3\x01\x1d\x11&\x00+\ +5\xff\xff\x00o\xff\xec\x04\xb2\x06\x04\x02&\x00X\x00\ +\x00\x01\x06\x00j\x0e\x00\x00\x0a\xb4\x02\x01*\x11&\x00\ ++55\xff\xff\xffs\xfe\x14\x04\x91\x06!\x02&\x00\ +\x5c\x00\x00\x01\x06\x00v\x0e\x00\x00\x08\xb3\x01\x1f\x11&\ +\x00+5\x00\x02\xff\xbc\xfe\x14\x04h\x06\x14\x00\x15\x00\ +#\x00'@\x14\x0a\x13\x07\x00\x0f\x00\x0e\x1b\x00\x16G\ +Y\x00\x10\x07\x1dGY\x07\x16\x00?+\x00\x18?+\ +\x00\x18??\x11\x129910\x012\x16\x15\x14\x02\ +\x06#\x22'#\x06\x07\x03!\x01!\x03\x06\x0736\ +\x17\x22\x06\x06\x15\x14\x16326654&\x03-\ +\x96\xa5\x8a\xe2\x89\xb2]\x08\x0c\x1fH\xfe\xd3\x01\xb3\x01\ +-B\x1d3\x08\x83\x15GvICHExKK\ +\x04s\xd5\xc3\xc7\xfe\x94\xbc\xa3\x9f\x88\xfe\xac\x08\x00\xfe\ +\xcd\x83\x95\xaa\xf4\x82\xef\x7fP`\x82\xed\x81XX\xff\ +\xff\xffs\xfe\x14\x04\x91\x06\x04\x02&\x00\x5c\x00\x00\x01\ +\x06\x00j\xa9\x00\x00\x0a\xb4\x02\x01*\x11&\x00+5\ +5\xff\xff\xff\x85\x00\x00\x04\xac\x06\xfe\x02&\x00$\x00\ +\x00\x01\x07\x01M\x00\x93\x01R\x00\x08\xb3\x02\x13\x05&\ +\x00+5\xff\xff\x00Z\xff\xec\x04\x9e\x05\xac\x02&\x00\ +D\x00\x00\x01\x06\x01M#\x00\x00\x08\xb3\x02$\x11&\ +\x00+5\xff\xff\xff\x85\x00\x00\x04\xd7\x07}\x02&\x00\ +$\x00\x00\x01\x07\x01N\x00\x5c\x01R\x00\x08\xb3\x02\x12\ +\x05&\x00+5\xff\xff\x00Z\xff\xec\x04\x9e\x06+\x02\ +&\x00D\x00\x00\x01\x06\x01N\xef\x00\x00\x08\xb3\x02#\ +\x11&\x00+5\xff\xff\xff\x85\xfe\x14\x04\x8b\x05\xbc\x02\ +&\x00$\x00\x00\x00\x07\x01Q\x037\x00\x00\xff\xff\x00\ +Z\xfe\x14\x04\x9e\x04s\x02&\x00D\x00\x00\x00\x07\x01\ +Q\x02\xa0\x00\x00\xff\xff\x00{\xff\xec\x057\x07s\x02\ +&\x00&\x00\x00\x01\x07\x00v\x00\xfc\x01R\x00\x08\xb3\ +\x01\x22\x05&\x00+5\xff\xff\x00Z\xff\xec\x04+\x06\ +!\x02&\x00F\x00\x00\x01\x06\x00v\x1b\x00\x00\x08\xb3\ +\x01\x22\x11&\x00+5\xff\xff\x00{\xff\xec\x057\x07\ +s\x02&\x00&\x00\x00\x01\x07\x01K\x00\xac\x01R\x00\ +\x08\xb3\x01 \x05&\x00+5\xff\xff\x00Z\xff\xec\x04\ +&\x06!\x02&\x00F\x00\x00\x01\x06\x01K\xc6\x00\x00\ +\x08\xb3\x01 \x11&\x00+5\xff\xff\x00{\xff\xec\x05\ +7\x07f\x02&\x00&\x00\x00\x01\x07\x01O\x01\xc5\x01\ +R\x00\x08\xb3\x01#\x05&\x00+5\xff\xff\x00Z\xff\ +\xec\x03\xf2\x06\x14\x02&\x00F\x00\x00\x01\x07\x01O\x00\ +\xd1\x00\x00\x00\x08\xb3\x01#\x11&\x00+5\xff\xff\x00\ +{\xff\xec\x057\x07s\x02&\x00&\x00\x00\x01\x07\x01\ +L\x00\x89\x01R\x00\x08\xb3\x01$\x05&\x00+5\xff\ +\xff\x00Z\xff\xec\x04]\x06!\x02&\x00F\x00\x00\x01\ +\x06\x01L\xbb\x00\x00\x08\xb3\x01$\x11&\x00+5\xff\ +\xff\x005\x00\x00\x05+\x07s\x02&\x00'\x00\x00\x01\ +\x07\x01L\x00\x5c\x01R\x00\x08\xb3\x02\x1e\x05&\x00+\ +5\xff\xff\x00Z\xff\xec\x06\xac\x06\x14\x02&\x00G\x00\ +\x00\x00\x07\x028\x03'\x00\x00\xff\xff\x00%\x00\x00\x05\ ++\x05\xb6\x02\x06\x00\x92\x00\x00\x00\x02\x00Z\xff\xec\x05\ +q\x06\x14\x00\x1d\x00+\x00J@)\x04\x14\x17\x00\x10\ +\x08\x09\x08KY\x0d\x09\x09\x00\x0b\x00%GY\x00\x00\ +\x10\x00 \x00\x03\x09\x03\x00\x00\x12\x0b\x00\x17\x1eGY\ +\x17\x16\x12\x15\x00??+\x00\x18?\x129/_^\ +]+\x11\x12\x009\x18/3+\x11\x003\x11\x129\ +910\x012\x16\x173467!7!7!\ +\x073\x07#\x03#7#\x06\x06#\x22&54\x12\ +6\x1326654&#\x22\x06\x06\x15\x14\x16\x02\ +TX}-\x08\x0b\x18\xfe\xd9)\x01'#\x01-#\ +\x9a)\x9c\xfc\xe5\x0e\x04M\x93U\x98\xae\x8c\xe2QD\ +tLAIGzGL\x045EP\x1bl\x85\xc7\ +\xa1\xa1\xc7\xfbT\x91ZK\xd4\xc3\xb5\x01N\xaf\xfc\xaa\ +w\xe0lHXz\xcaoXX\x00\xff\xff\x005\x00\ +\x00\x04\x9c\x06\xfe\x02&\x00(\x00\x00\x01\x07\x01M\x00\ +V\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00\ +Z\xff\xec\x04B\x05\xac\x02&\x00H\x00\x00\x01\x06\x01\ +M\x0a\x00\x00\x08\xb3\x02%\x11&\x00+5\xff\xff\x00\ +5\x00\x00\x04\x9c\x07}\x02&\x00(\x00\x00\x01\x07\x01\ +N\x00\x1f\x01R\x00\x08\xb3\x01\x0e\x05&\x00+5\xff\ +\xff\x00Z\xff\xec\x04c\x06+\x02&\x00H\x00\x00\x01\ +\x06\x01N\xe8\x00\x00\x08\xb3\x02$\x11&\x00+5\xff\ +\xff\x005\x00\x00\x04\x9c\x07I\x02&\x00(\x00\x00\x01\ +\x07\x01O\x01-\x015\x00\x08\xb3\x01\x15\x05&\x00+\ +5\xff\xff\x00Z\xff\xec\x04B\x06\x14\x02&\x00H\x00\ +\x00\x01\x07\x01O\x00\xfa\x00\x00\x00\x08\xb3\x02+\x11&\ +\x00+5\xff\xff\x005\xfe\x14\x04\x9c\x05\xb6\x02&\x00\ +(\x00\x00\x00\x07\x01Q\x02\x12\x00\x00\xff\xff\x00Z\xfe\ +(\x04B\x04s\x02&\x00H\x00\x00\x00\x07\x01Q\x01\ +\xc1\x00\x14\xff\xff\x005\x00\x00\x04\xcf\x07s\x02&\x00\ +(\x00\x00\x01\x07\x01L\x00-\x01R\x00\x08\xb3\x01\x16\ +\x05&\x00+5\xff\xff\x00Z\xff\xec\x04\x95\x06!\x02\ +&\x00H\x00\x00\x01\x06\x01L\xf3\x00\x00\x08\xb3\x02,\ +\x11&\x00+5\xff\xff\x00{\xff\xec\x05m\x07s\x02\ +&\x00*\x00\x00\x01\x07\x01K\x00\xbc\x01R\x00\x08\xb3\ +\x01$\x05&\x00+5\xff\xff\xff\x8d\xfe\x14\x04\xa6\x06\ +!\x02&\x00J\x00\x00\x01\x06\x01KF\x00\x00\x08\xb3\ +\x03E\x11&\x00+5\xff\xff\x00{\xff\xec\x05m\x07\ +}\x02&\x00*\x00\x00\x01\x07\x01N\x00\x9c\x01R\x00\ +\x08\xb3\x01 \x05&\x00+5\xff\xff\xff\x8d\xfe\x14\x04\ +\xa2\x06+\x02&\x00J\x00\x00\x01\x06\x01N\x02\x00\x00\ +\x08\xb3\x03A\x11&\x00+5\xff\xff\x00{\xff\xec\x05\ +m\x07f\x02&\x00*\x00\x00\x01\x07\x01O\x01\xc7\x01\ +R\x00\x08\xb3\x01'\x05&\x00+5\xff\xff\xff\x8d\xfe\ +\x14\x04\xa2\x06\x14\x02&\x00J\x00\x00\x01\x07\x01O\x01\ +#\x00\x00\x00\x08\xb3\x03H\x11&\x00+5\xff\xff\x00\ +{\xfe;\x05m\x05\xcd\x02&\x00*\x00\x00\x00\x07\x02\ +9\x01\x19\x00\x00\xff\xff\xff\x8d\xfe\x14\x04\xa2\x06!\x02\ +&\x00J\x00\x00\x01\x06\x02:w\x00\x00\x08\xb3\x03C\ +\x11&\x00+5\xff\xff\x005\x00\x00\x05\xa4\x07s\x02\ +&\x00+\x00\x00\x01\x07\x01K\x00\xb8\x01R\x00\x08\xb3\ +\x01\x12\x05&\x00+5\xff\xff\x00%\x00\x00\x04\xae\x07\ +\xaa\x02&\x00K\x00\x00\x01\x07\x01K\x00N\x01\x89\x00\ +\x08\xb3\x01 \x02&\x00+5\x00\x02\x005\x00\x00\x06\ +-\x05\xb6\x00\x13\x00\x17\x003@\x1b\x10\x00\x03\x16\x04\ +\x0b\x0b\x0c\x0c\x17\x0e\x17\x07LYL\x17\x01\x17\x17\x09\ +\x12\x0e\x03\x05\x09\x12\x00?3?3\x129/]+\ +\x11\x12\x009\x18/3\x12\x17910\x013\x07#\ +\x03!\x13!\x03!\x13#737!\x07!7!\ +\x017!\x07\x05{\xb2)\xb4\xe1\xfe\xce\x86\xfe)\x86\ +\xfe\xcf\xe2\xb1)\xb3(\x012)\x01\xd7)\x011\xfe\ +V%\xfe)%\x04\xf4\xc7\xfb\xd3\x02w\xfd\x89\x04-\ +\xc7\xc2\xc2\xc2\xfd\xc3\xb4\xb4\x00\x00\x01\x00%\x00\x00\x04\ +`\x06\x14\x00 \x00<@!\x17\x0b\x1b\x15\x0d\x0e\x0d\ +KY\x12\x0e\x0e\x1b\x10\x1b\x06GY\x00\x1b\x10\x1b \ +\x1b\x03\x1b\x1b\x0b\x10\x00\x01\x0b\x15\x00?3?\x129\ +/]+\x11\x12\x009\x18/3+\x11\x003\x11\x12\ +910!!\x13654#\x22\x06\x07\x03!\x13\ +#737!\x07!\x07!\x06\x0736632\ +\x16\x15\x14\x07\x03\xd1\xfe\xd3}\x10j]\x97+V\xfe\ +\xd3\xfe\xa2+\xa0#\x01-!\x01++\xfe\xd5&*\ +\x08>\x95d\x8c\x95\x16\x02PD3{\xe7\xca\xfeo\ +\x04\xac\xc7\xa1\xa1\xc7\xa4}N\x5c\xa8\x99Of\x00\xff\ +\xff\xff\xc5\x00\x00\x04\x11\x07`\x02&\x00,\x00\x00\x01\ +\x07\x01R\xff\x90\x01R\x00\x08\xb3\x01\x15\x05&\x00+\ +5\xff\xff\x00%\x00\x00\x03|\x06\x0e\x02&\x00\xf3\x00\ +\x00\x01\x07\x01R\xfe\xfb\x00\x00\x00\x08\xb3\x01\x0d\x11&\ +\x00+5\xff\xff\xff\xc5\x00\x00\x03\xb2\x06\xfe\x02&\x00\ +,\x00\x00\x01\x07\x01M\xff\x99\x01R\x00\x08\xb3\x01\x0f\ +\x05&\x00+5\xff\xff\x00%\x00\x00\x03\x18\x05\xac\x02\ +&\x00\xf3\x00\x00\x01\x07\x01M\xfe\xff\x00\x00\x00\x08\xb3\ +\x01\x07\x11&\x00+5\xff\xff\xff\xc5\x00\x00\x03\xd8\x07\ +}\x02&\x00,\x00\x00\x01\x07\x01N\xff]\x01R\x00\ +\x08\xb3\x01\x0e\x05&\x00+5\xff\xff\x00%\x00\x00\x03\ +S\x06+\x02&\x00\xf3\x00\x00\x01\x07\x01N\xfe\xd8\x00\ +\x00\x00\x08\xb3\x01\x06\x11&\x00+5\xff\xff\xff\xc5\xfe\ +\x14\x03\x81\x05\xb6\x02&\x00,\x00\x00\x00\x07\x01Q\x00\ +\xa8\x00\x00\xff\xff\xff\xb4\xfe\x14\x02\x8d\x06\x14\x02&\x00\ +L\x00\x00\x00\x06\x01Q`\x00\xff\xff\xff\xc5\x00\x00\x03\ +\x81\x07f\x02&\x00,\x00\x00\x01\x07\x01O\x00s\x01\ +R\x00\x08\xb3\x01\x15\x05&\x00+5\x00\x01\x00%\x00\ +\x00\x02?\x04^\x00\x03\x00\x0a\xb3\x02\x0f\x01\x15\x00?\ +?10!!\x13!\x01R\xfe\xd3\xed\x01-\x04^\ +\x00\xff\xff\xff\xc5\xfeR\x05\xc2\x05\xb6\x00&\x00,\x00\ +\x00\x00\x07\x00-\x03\x10\x00\x00\xff\xff\x00%\xfe\x14\x04\ +\xef\x06\x14\x00&\x00L\x00\x00\x00\x07\x00M\x02`\x00\ +\x00\xff\xff\xfe\xbe\xfeR\x03\xb5\x07s\x02&\x00-\x00\ +\x00\x01\x07\x01K\xffU\x01R\x00\x08\xb3\x01\x14\x05&\ +\x00+5\xff\xff\xfe\xfa\xfe\x14\x03D\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01K\xfe\xe4\x00\x00\x00\x08\xb3\x01\x13\ +\x11&\x00+5\xff\xff\x005\xfe;\x05\xa4\x05\xb6\x02\ +&\x00.\x00\x00\x00\x07\x029\x00\xb4\x00\x00\xff\xff\x00\ +%\xfe;\x04\xf0\x06\x14\x02&\x00N\x00\x00\x00\x06\x02\ +9{\x00\x00\x01\x00%\x00\x00\x04\xf0\x04^\x00\x0e\x00\ +\x18@\x0c\x0e\x06\x05\x02\x04\x08\x00\x09\x0f\x04\x08\x15\x00\ +?3?3\x12\x17910\x01!\x01\x01!\x03\x07\ +\x03!\x13!\x02\x06\x073\x03\x98\x01X\xfe\x0e\x01\x1d\ +\xfe\xb0\xb7xJ\xfe\xd3\xed\x01-G \x0d\x04\x04^\ +\xfe\x08\xfd\x9a\x01\xa4H\xfe\xa4\x04^\xfe\xc1x*\xff\ +\xff\x005\x00\x00\x03\xc1\x07s\x02&\x00/\x00\x00\x01\ +\x07\x00v\xff\xb1\x01R\x00\x08\xb3\x01\x0e\x05&\x00+\ +5\xff\xff\x00%\x00\x00\x03\xad\x07\xac\x02&\x00O\x00\ +\x00\x01\x07\x00v\xff\x9d\x01\x8b\x00\x08\xb3\x01\x0c\x02&\ +\x00+5\xff\xff\x005\xfe;\x03\x9c\x05\xb6\x02&\x00\ +/\x00\x00\x00\x06\x029B\x00\xff\xff\xff\x9d\xfe;\x02\ +\x9c\x06\x14\x02&\x00O\x00\x00\x00\x07\x029\xff\x22\x00\ +\x00\xff\xff\x005\x00\x00\x04\xa6\x05\xb7\x02&\x00/\x00\ +\x00\x01\x07\x028\x01!\xff\xa3\x00\x07\xb2\x01\x08\x03\x00\ +?5\x00\xff\xff\x00%\x00\x00\x04N\x06\x14\x02&\x00\ +O\x00\x00\x00\x07\x028\x00\xc9\x00\x00\xff\xff\x005\x00\ +\x00\x04\x02\x05\xb6\x02&\x00/\x00\x00\x00\x07\x01O\x01\ +u\xfdp\xff\xff\x00%\x00\x00\x03\xae\x06\x14\x00&\x00\ +O\x00\x00\x00\x07\x01O\x01!\xfd8\x00\x01\x00\x00\x00\ +\x00\x03\x9e\x05\xb6\x00\x0d\x00'@\x15\x01\x03\x04\x0a\x07\ +\x09\x06\x08\x02\x02\x09\x08\x00\x05\x03\x00\x0bLY\x00\x12\ +\x00?+\x00\x18?\x129\x113\x11\x12\x17910\ +3\x13\x07'7\x13!\x037\x17\x05\x03!\x039g\ +:f\xdd\x92\x01/k\x8ej\xfe\xc9V\x02\x006\x01\ +\xe1\x1e\xcaw\x02\xb2\xfe\x06N\xcb\xa7\xfeh\xff\x00\x00\ +\x01\x00\x00\x00\x00\x02\xd9\x06\x14\x00\x0b\x00\x1e@\x10\x06\ +\x08\x09\x03\x00\x02\x06\x07\x07\x01\x01\x05\x0a\x00\x05\x15\x00\ +??\x129\x113\x12\x17910\x017\x17\x07\x03\ +!\x13\x07'7\x13!\x02/@j\xe7\x8a\xfe\xd7c\ +jy\xcas\x85\x14\x01'\x01\x06\x01\x09\x01\xbd\xee\ +\x17\xfe\xfe\xbf\xfe\xfe\x87\x10 \x03\x94'\xb7\xfe\xc0\xbb\ +\x93\x96\x00\x00\x03\x00Z\xff\xec\x06\xdb\x04s\x00#\x00\ +0\x009\x00K@)\x0f\x03\x00\x0d4\x18KY\x0f\ +4\x01\x0c\x0644\x00\x0d\x111JY\x11\x10\x0d$\ +GY\x0d\x10\x06+GY\x06\x16\x00\x1dFY\x00\x16\ +\x00?+\x00\x18?+\x00\x18?+\x00\x18?+\x11\ +\x12\x009\x18/_^]+\x11\x12\x009910\ +\x05\x22&'\x06\x06#\x22&54\x12$32\x17\ +632\x16\x15\x14\x04!#\x07\x15\x14\x16326\ +7\x15\x06\x06\x01\x22\x06\x06\x15\x14\x1632\x1254\ +&%\x22\x06\x0732654\x04\xaet\xb8.?\ +\xa8{\xbb\xdd\x8a\x01\x06\xb2\xd1h\x9a\xf5\xb1\xc6\xfe\xb2\ +\xfe\xcb3\x02f`W\x8ee]\xb9\xfdhGpE\ +IIm\x8cJ\x02\x88X\x9b\x19-\x9b\xac\x14MD\ +DM\xea\xc8\xd8\x01I\xb4\xa0\xa0\xa3\x8e\xbb\xcb\x15\x14\ +[i&0\xe3.(\x03\x91y\xe8~[b\x01\x0d\ +\xca`e\x1d\x9dvaS_\xff\xff\x005\x00\x00\x04\ +\xb2\x07s\x02&\x005\x00\x00\x01\x07\x00v\x00\xa2\x01\ +R\x00\x08\xb3\x02\x1f\x05&\x00+5\xff\xff\x00%\x00\ +\x00\x03\xf8\x06!\x02&\x00U\x00\x00\x01\x06\x00v\xe8\ +\x00\x00\x08\xb3\x01\x18\x11&\x00+5\xff\xff\x005\xfe\ +;\x04\xac\x05\xb6\x02&\x005\x00\x00\x00\x07\x029\x00\ +\xb0\x00\x00\xff\xff\xff\xa1\xfe;\x03\xaa\x04s\x02&\x00\ +U\x00\x00\x00\x07\x029\xff&\x00\x00\xff\xff\x005\x00\ +\x00\x04\xe4\x07s\x02&\x005\x00\x00\x01\x07\x01L\x00\ +B\x01R\x00\x08\xb3\x02!\x05&\x00+5\xff\xff\x00\ +%\x00\x00\x04,\x06!\x02&\x00U\x00\x00\x01\x06\x01\ +L\x8a\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\xff\x00\ +)\xff\xec\x04x\x07s\x02&\x006\x00\x00\x01\x07\x00\ +v\x00h\x01R\x00\x08\xb3\x01,\x05&\x00+5\xff\ +\xff\x00\x17\xff\xec\x03\xe8\x06!\x02&\x00V\x00\x00\x01\ +\x06\x00v\xd8\x00\x00\x08\xb3\x01+\x11&\x00+5\xff\ +\xff\x00)\xff\xec\x04d\x07s\x02&\x006\x00\x00\x01\ +\x07\x01K\x00\x04\x01R\x00\x08\xb3\x01*\x05&\x00+\ +5\xff\xff\x00\x17\xff\xec\x03\xd4\x06!\x02&\x00V\x00\ +\x00\x01\x07\x01K\xfft\x00\x00\x00\x08\xb3\x01)\x11&\ +\x00+5\xff\xff\x00)\xfe\x14\x04V\x05\xcb\x02&\x00\ +6\x00\x00\x00\x07\x00z\x01d\x00\x00\xff\xff\x00\x17\xfe\ +\x14\x03\xa0\x04s\x02&\x00V\x00\x00\x00\x07\x00z\x01\ +/\x00\x00\xff\xff\x00)\xff\xec\x04\x93\x07s\x02&\x00\ +6\x00\x00\x01\x07\x01L\xff\xf1\x01R\x00\x08\xb3\x01.\ +\x05&\x00+5\xff\xff\x00\x17\xff\xec\x04\x22\x06!\x02\ +&\x00V\x00\x00\x01\x06\x01L\x80\x00\x00\x08\xb3\x01-\ +\x11&\x00+5\xff\xff\x00\x7f\xfe;\x04\xd1\x05\xb6\x02\ +&\x007\x00\x00\x00\x06\x029\x04\x00\xff\xff\x008\xfe\ +;\x03o\x05L\x02&\x00W\x00\x00\x00\x06\x029\xbd\ +\x00\xff\xff\x00\xa8\x00\x00\x04\xd1\x07s\x02&\x007\x00\ +\x00\x01\x07\x01L\x00\x14\x01R\x00\x08\xb3\x01\x12\x05&\ +\x00+5\xff\xff\x00^\xff\xec\x04\x87\x06(\x02&\x00\ +W\x00\x00\x00\x07\x028\x01\x02\x00\x14\x00\x01\x00\xa6\x00\ +\x00\x04\xd1\x05\xb6\x00\x0f\x00$@\x11\x03\x07\x07\x00\x08\ +\x08\x0c\x05\x12\x0f\x0b\x0c\x0bLY\x0c\x03\x00?+\x11\ +\x003\x18?\x129/33\x11310\x013\x07\ +#\x03!\x13#73\x13!\x13!\x03!\x02\xee\xeb\ +7\xea}\xfe\xcf}\xe17\xdfL\xfe\xa07\x03\xf27\ +\xfe\x9f\x03R\xfe\xfd\xac\x02T\xfe\x01b\x01\x02\xfe\xfe\ +\x00\x00\x01\x00\x1f\xff\xec\x03o\x05L\x00 \x009@\ +\x1d\x1c\x0c\x0d\x0cKY\x19\x0d\x0d\x05\x13\x15@\x0f\x18\ +\x12\x15\x15\x18FY\x15\x0f\x05\x00GY\x05\x16\x00?\ ++\x00\x18?+\x11\x003\x113\x1a\x18\x10\xcd\x129\ +/3+\x11\x00310%27\x15\x06#\x22&\ +5477#737#?\x023\x07!\x07!\ +\x073\x07#\x07\x06\x15\x14\x02\x02Aao\x9b\x96\x8d\ +\x0c!\x85)\x85)\x98\x1d\xc4\x84\xc21\x01\x1b2\xfe\ +\xe6)\xe9)\xeb\x1f\x06\xdf#\xe15~\x842>\x94\ +\xc6\xc1\x93T\xec\xee\xe5\xc1\xc6\x94\x1e\x17J\xff\xff\x00\ +\x8d\xff\xec\x05\x9a\x07`\x02&\x008\x00\x00\x01\x07\x01\ +R\x00\xcd\x01R\x00\x08\xb3\x01\x1e\x05&\x00+5\xff\ +\xff\x00o\xff\xec\x04\xb2\x06\x0e\x02&\x00X\x00\x00\x01\ +\x06\x01R1\x00\x00\x08\xb3\x01 \x11&\x00+5\xff\ +\xff\x00\x8d\xff\xec\x05\x9a\x06\xfe\x02&\x008\x00\x00\x01\ +\x07\x01M\x00\xd9\x01R\x00\x08\xb3\x01\x18\x05&\x00+\ +5\xff\xff\x00o\xff\xec\x04\xb2\x05\xac\x02&\x00X\x00\ +\x00\x01\x06\x01M9\x00\x00\x08\xb3\x01\x1a\x11&\x00+\ +5\xff\xff\x00\x8d\xff\xec\x05\x9a\x07}\x02&\x008\x00\ +\x00\x01\x07\x01N\x00\xa2\x01R\x00\x08\xb3\x01\x17\x05&\ +\x00+5\xff\xff\x00o\xff\xec\x04\xb2\x06+\x02&\x00\ +X\x00\x00\x01\x06\x01N\x0e\x00\x00\x08\xb3\x01\x19\x11&\ +\x00+5\xff\xff\x00\x8d\xff\xec\x05\x9a\x08\x04\x02&\x00\ +8\x00\x00\x01\x07\x01P\x00\xa0\x01R\x00\x0a\xb4\x02\x01\ +\x18\x05&\x00+55\xff\xff\x00o\xff\xec\x04\xb2\x06\ +\xb2\x02&\x00X\x00\x00\x01\x06\x01P\x00\x00\x00\x0a\xb4\ +\x02\x01\x1a\x11&\x00+55\xff\xff\x00\x8d\xff\xec\x05\ +\xfb\x07s\x02&\x008\x00\x00\x01\x07\x01S\x01?\x01\ +R\x00\x0a\xb4\x02\x01&\x05&\x00+55\xff\xff\x00\ +o\xff\xec\x05R\x06!\x02&\x00X\x00\x00\x01\x07\x01\ +S\x00\x96\x00\x00\x00\x0a\xb4\x02\x01(\x11&\x00+5\ +5\xff\xff\x00\x8d\xfe\x14\x05\x9a\x05\xb6\x02&\x008\x00\ +\x00\x00\x07\x01Q\x02m\x00\x00\xff\xff\x00o\xfe\x14\x04\ +\xb2\x04^\x02&\x00X\x00\x00\x00\x07\x01Q\x02\xb4\x00\ +\x00\xff\xff\x00\xb8\x00\x00\x07\xe7\x07s\x02&\x00:\x00\ +\x00\x01\x07\x01K\x01\x8f\x01R\x00\x08\xb3\x01%\x05&\ +\x00+5\xff\xff\x00}\x00\x00\x06\xb6\x06!\x02&\x00\ +Z\x00\x00\x01\x07\x01K\x00\xc9\x00\x00\x00\x08\xb3\x01%\ +\x11&\x00+5\xff\xff\x00\xba\x00\x00\x05?\x07s\x02\ +&\x00<\x00\x00\x01\x07\x01K\x00\x1f\x01R\x00\x08\xb3\ +\x01\x0f\x05&\x00+5\xff\xff\xffs\xfe\x14\x04\x91\x06\ +!\x02&\x00\x5c\x00\x00\x01\x06\x01K\xa9\x00\x00\x08\xb3\ +\x01\x1d\x11&\x00+5\xff\xff\x00\xba\x00\x00\x05?\x07\ +V\x02&\x00<\x00\x00\x01\x07\x00j\x00#\x01R\x00\ +\x0a\xb4\x02\x01\x1c\x05&\x00+55\xff\xff\xff\xc3\x00\ +\x00\x04\xb0\x07s\x02&\x00=\x00\x00\x01\x07\x00v\x00\ +j\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\xff\xff\xff\ +\xd1\x00\x00\x04\x09\x06!\x02&\x00]\x00\x00\x01\x06\x00\ +v\xf9\x00\x00\x08\xb3\x01\x12\x11&\x00+5\xff\xff\xff\ +\xc3\x00\x00\x04\xb0\x07f\x02&\x00=\x00\x00\x01\x07\x01\ +O\x01\x10\x01R\x00\x08\xb3\x01\x13\x05&\x00+5\xff\ +\xff\xff\xd1\x00\x00\x03\xc7\x06\x14\x02&\x00]\x00\x00\x01\ +\x07\x01O\x00\x85\x00\x00\x00\x08\xb3\x01\x13\x11&\x00+\ +5\xff\xff\xff\xc3\x00\x00\x04\xb0\x07s\x02&\x00=\x00\ +\x00\x01\x07\x01L\x00\x0a\x01R\x00\x08\xb3\x01\x14\x05&\ +\x00+5\xff\xff\xff\xd1\x00\x00\x042\x06!\x02&\x00\ +]\x00\x00\x01\x06\x01L\x90\x00\x00\x08\xb3\x01\x14\x11&\ +\x00+5\x00\x01\xff\x0a\xfe\x14\x03\xc1\x06\x1f\x00\x15\x00\ +\x17@\x0c\x0b\x10GY\x0b\x00\x00\x05GY\x00\x1b\x00\ +?+\x00\x18?+10\x03\x22'5\x16327\ +\x016632\x17\x07&#\x22\x06\x07\x01\x02Hh\ +F=6\x88$\x01\x10*\xc3\xaf\x81kPE@9\ +E\x0e\xfe\xecM\xfe\x14\x19\xf2\x15\xaa\x04\xfe\xc0\xad1\ +\xe0\x1fPA\xfa\xeb\xfe\x8d\x00\x00\x01\xff\xe1\xfe\x14\x04\ +\x85\x05\xcb\x00\x1d\x00/@\x18\x08\x0b\x1b\x18\x18\x1bF\ +Y\x18\x18\x0f\x00\x0f\x14GY\x0f\x00\x00\x05GY\x00\ +\x1b\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x12\x009910\x13\x22'5\x16327\x13#\ +?\x026632\x17\x07&#\x22\x06\x07\x073\x07\ +#\x03\x02\x8fhF=6\x88$\xba\xa8\x1d\xbd\x12)\ +\xc3\xb0\x83hPE@9F\x0c\x0c\xdb1\xdc\xc4M\ +\xfe\x14\x19\xf2\x15\xaa\x03q\x95PT\xbe\xaf1\xe0\x1f\ +PA>\xe5\xfcb\xfe\x8d\x00\x00\x04\xff\x85\x00\x00\x05\ +)\x07\xaa\x00\x10\x00\x1a\x00&\x00.\x00,@\x18*\ +\x06LY**\x07\x09\x02'\x03`$\x01$\x19\x0e\ +\x14\x0e\x1e\x00\x04\x07\x12\x00?3?3\xcc\x119\xce\ +]\x172\x119/+10\x01\x14\x07\x13!\x03!\ +\x03!\x01&54632\x16%667!\x15\ +\x06\x06\x07#\x134&#\x22\x06\x15\x14\x16326\ +\x03\x06\x07\x03!\x03&'\x04=M\x9b\xfe\xd7\x1e\xfe\ ++\xaa\xfe\xc0\x02\xdb\x18\x88on\x90\xfe\xc3$\x85*\ +\x01V:\xc4T\xd7\xa07**600*7\xa0\ ++5\xae\x01C\x1a\x0a\x05\x05\xb6pD\xfa\xfe\x01J\ +\xfe\xb6\x05B0Bn\x80\x82\xc7\x1by/\x0a1p\ +&\xfe\xdb-33--33\xfe\xf6oj\xfe\xaa\ +\x015U\xa5\x00\x00\x05\x00Z\xff\xec\x04\xd1\x07\xaa\x00\ +\x09\x00\x15\x00!\x004\x00B\x00Q@/\x08\x13\x13\ +\x0f\x03\x1f\x03\xbf\x03\x03\x0f\x03\x00\x19\x01\x10\x03\x19\x0d\ +\x1f@\x0a\x0fH\x1f)@-3\x22).\x0f)<\ +GY)\x10\x225GY\x22\x161\x15\x00??+\ +\x00\x18?+\x00\x18?\x11\x1299\x1a\x10\xdc+2\ +\xde_^]\xcc^]3\x11910\x01667\ +!\x15\x06\x06\x07#\x01\x14\x06#\x22&5463\ +2\x16\x074&#\x22\x06\x15\x14\x16326\x01\x22\ +&54\x12632\x16\x17373\x03#7#\ +\x06'26654&#\x22\x06\x06\x15\x14\x16\x02\ +\xa8'\x86&\x01V:\xc4T\xd7\x01;\x8crp\x87\ +\x87pn\x90\x9d7**600*7\xfeP\x93\ +\xa9\x90\xea\x8ca\x8d'\x089\xe8\xee\xe5\x0e\x04\x86C\ +E\x80NM?D{IC\x06\xe7\x1fz*\x0a1\ +p&\xfe\xc5k\x85\x81ml\x81\x82k-33-\ +-44\xfa}\xd5\xc0\xc6\x01g\xc5TP\x8f\xfb\xa2\ +\x91\xa5\xf3\x86\xe5\x91G]\x90\xectXX\xff\xff\xff\ +\x85\x00\x00\x07o\x07s\x02&\x00\x88\x00\x00\x01\x07\x00\ +v\x02\x85\x01R\x00\x08\xb3\x02\x1c\x05&\x00+5\xff\ +\xff\x00Z\xff\xec\x06\xc7\x06!\x02&\x00\xa8\x00\x00\x01\ +\x07\x00v\x01\xd1\x00\x00\x00\x08\xb3\x03L\x11&\x00+\ +5\xff\xff\x00d\xff\xaa\x05\xb2\x07s\x02&\x00\x9a\x00\ +\x00\x01\x07\x00v\x01\x0e\x01R\x00\x08\xb3\x03/\x05&\ +\x00+5\xff\xff\x00+\xff\x9a\x04f\x06!\x02&\x00\ +\xba\x00\x00\x01\x06\x00vH\x00\x00\x08\xb3\x03.\x11&\ +\x00+5\xff\xff\x00)\xfe;\x04V\x05\xcb\x02&\x00\ +6\x00\x00\x00\x06\x029\x1b\x00\xff\xff\x00\x17\xfe;\x03\ +\xa0\x04s\x02&\x00V\x00\x00\x00\x06\x029\xf1\x00\x00\ +\x01\x017\x04\xd9\x04`\x06!\x00\x0e\x00\x0e\xb4\x03\x0b\ +\x80\x06\x01\x00/3\x1a\xcd210\x01#&'\x06\ +\x07#5667!\x16\x16\x17\x04`\xc6?ci\ +\x7f\xd9?\xb44\x01R\x16h2\x04\xd95sXP\ +\x199\xb4B6\xb1H\x00\x01\x01y\x04\xd9\x04\xa2\x06\ +!\x00\x0d\x00\x0e\xb4\x05\x01\x80\x03\x0a\x00/3\x1a\xcd\ +210\x013\x16\x17673\x15\x06\x07!&&\ +'\x01y\xc6?csu\xd9\xd4S\xfe\xae\x16h2\ +\x06!5s^J\x19\xc6i6\xb1H\x00\x00\x01\x01\ +\x81\x04\xd9\x04\x19\x05\xac\x00\x03\x00\x08\xb1\x00\x03\x00/\ +310\x01!\x07!\x01\xae\x02k-\xfd\x95\x05\xac\ +\xd3\x00\x01\x01\xae\x04\xd9\x04{\x06+\x00\x0e\x00\x12\xb7\ +\x07o\x00\x01\x00\x80\x0b\x02\x00/3\x1a\xcd]21\ +0\x01\x02!\x22&5473\x14\x163267\ +\x04{7\xfe\xae\x99\xab\x06\xaeIQNc\x11\x06+\ +\xfe\xae\x92~&\x1cA<6G\x00\x00\x01\x01B\x04\ +\xe9\x02\x8d\x06\x14\x00\x0a\x00\x08\xb1\x03\x09\x00/31\ +0\x014632\x16\x15\x14\x06#\x22\x01B_W\ +ILX\x5c\x97\x05dWY>:Pc\x00\x02\x02\ +\x14\x04\xd7\x04\x0a\x06\xb2\x00\x0b\x00\x17\x00\x13@\x09\x0f\ +\x0f\x09\x1f\x09\x02\x09\x15\x03\x00/3\xcc]210\ +\x01\x14\x06#\x22&54632\x16\x074&#\ +\x22\x06\x15\x14\x16326\x04\x0a\x8crn\x8a\x89o\ +n\x90\x9d7**600*7\x05\xc7k\x85\x7f\ +om\x80\x82k-33--44\x00\x00\x01\xff\ +T\xfe\x14\x00\xf2\x00\x00\x00\x11\x00\x0b\xb3\x06\x0b\x1b\x00\ +\x00/?3103\x06\x06\x15\x14\x16327\x15\ +\x06#\x22&5467\xf2wH \x1c,:T\ +Pfw_x`h2\x1c\x1f\x12\xb0\x19kXR\ +\x8aM\x00\x00\x01\x01;\x04\xd7\x04\x81\x06\x0e\x00\x15\x00\ +!@\x10\x10\x00\x05\x0b\x00\x0b\x00\x0bo\x14\x7f\x14\x02\ +\x14\x80\x09\x00/\x1a\xcc]99//\x113\x113\ +10\x01\x22.\x02#\x22\x06\x07#\x1232\x1e\x02\ +32673\x02\x03b1K@;!\x1f1\x0e\ +\xb1;\xde1MB:\x1f\x220\x16\xacB\x04\xd9!\ +'!83\x015!' 37\xfe\xcb\x00\x02\x01\ +\x17\x04\xd9\x04\xbc\x06!\x00\x08\x00\x11\x00\x0e\xb4\x0b\x03\ +\x80\x11\x08\x00/3\x1a\xcd210\x0167!\x15\ +\x06\x06\x07#%67!\x15\x06\x06\x07#\x01\x17r\ +u\x011+\xdb`\xb2\x01\x8dru\x011+\xdb`\ +\xb2\x04\xf2\x80\xaf\x115\xbdE\x19\x80\xaf\x115\xbdE\ +\x00\x00\x01\x025\x04\xd9\x03\xe7\x06^\x00\x07\x00\x08\xb1\ +\x03\x07\x00/\xcd10\x0167!\x15\x06\x07#\x02\ +5LJ\x01\x1cx\x86\xb4\x04\xf8\x98\xce\x18\xc6\xa7\x00\ +\x03\x01V\x04\xf8\x04\x87\x06\xb4\x00\x08\x00\x13\x00\x1e\x00\ +\x12\xb6\x08\x04\x17\x0c\x0c\x1d\x12\x00/33\x113\xcc\ +910\x01667!\x15\x06\x07#\x05463\ +2\x16\x15\x14\x06#\x22%4632\x16\x15\x14\x06\ +#\x22\x02\x85\x15I\x19\x01\x04Z\x94\x8d\xfe\xd1MD\ +<=GJy\x02'MD<=GJy\x05\x87\ +*\xb8K\x14\x8f\xa4\x07NP93IWnNP\ +93IW\x00\xff\xff\xff\x85\x00\x00\x04\x8b\x05\xf5\x02\ +&\x00$\x00\x00\x01\x07\x01T\xfe\x15\xff\x97\x00\x0d\xb7\ +\x02\x122\x12\x12\x05\x05>\x00+\x115\x00\xff\xff\x00\ +\x83\x02)\x01\xe5\x03}\x00\x07\x00\x11\x00j\x02D\xff\ +\xff\x00\x22\x00\x00\x05/\x05\xf5\x00'\x00(\x00\x93\x00\ +\x00\x01\x07\x01T\xfd\xed\xff\x97\x00\x0d\xb7\x01\x0e2\x0e\ +\x0e\x02\x02>\x00+\x115\x00\xff\xff\x00\x22\x00\x00\x06\ +7\x05\xf5\x00'\x00+\x00\x93\x00\x00\x01\x07\x01T\xfd\ +\xed\xff\x97\x00\x0d\xb7\x01\x0e2\x0e\x0e\x06\x06>\x00+\ +\x115\x00\xff\xff\x00\x22\x00\x00\x04\x83\x05\xf5\x00'\x00\ +,\x01\x02\x00\x00\x01\x07\x01T\xfd\xed\xff\x97\x00\x0d\xb7\ +\x01\x0e2\x0e\x0e\x06\x06>\x00+\x115\x00\xff\xff\x00\ +>\xff\xec\x06\x0f\x05\xf5\x00&\x002w\x00\x01\x07\x01\ +T\xfe\x09\xff\x97\x00\x0d\xb7\x02\x1e2\x1e\x1e\x0b\x0b>\ +\x00+\x115\x00\xff\xff\x00\x22\x00\x00\x06v\x05\xf5\x00\ +'\x00<\x017\x00\x00\x01\x07\x01T\xfd\xed\xff\x97\x00\ +\x0d\xb7\x01\x0b2\x0b\x0b\x07\x07>\x00+\x115\x00\xff\ +\xff\x00>\x00\x00\x06'\x05\xf5\x00'\x01v\x00\x9a\x00\ +\x00\x01\x07\x01T\xfe\x09\xff\x97\x00\x0d\xb7\x01#2#\ +#\x12\x12>\x00+\x115\x00\xff\xff\x00G\xff\xec\x03\ +x\x06\xb4\x02&\x01\x86\x00\x00\x01\x07\x01U\xfe\xf1\x00\ +\x00\x00\x0c\xb5\x03\x02\x01.\x11&\x00+555\xff\ +\xff\xff\x85\x00\x00\x04\x8b\x05\xbc\x02\x06\x00$\x00\x00\xff\ +\xff\x005\x00\x00\x04\xe3\x05\xb6\x02\x06\x00%\x00\x00\x00\ +\x01\x005\x00\x00\x04\x98\x05\xb6\x00\x05\x00\x11\xb7\x01\x12\ +\x02\x05LY\x02\x03\x00?+\x00\x18?10!!\ +\x01!\x07!\x01b\xfe\xd3\x015\x03.6\xfe\x00\x05\ +\xb6\xfe\x00\xff\xff\xff\xcb\x00\x00\x04b\x05\xbc\x02\x06\x02\ +(\x00\x00\xff\xff\x005\x00\x00\x04\x9c\x05\xb6\x02\x06\x00\ +(\x00\x00\xff\xff\xff\xc3\x00\x00\x04\xb0\x05\xb6\x02\x06\x00\ +=\x00\x00\xff\xff\x005\x00\x00\x05\xa4\x05\xb6\x02\x06\x00\ ++\x00\x00\x00\x03\x00{\xff\xec\x05\xb0\x05\xcd\x00\x03\x00\ +\x11\x00\x1f\x00.@\x19\x03\x02LY\x0c\x03\x01\x0d\x03\ +\x03\x03\x08\x0f\x0f\x12LY\x0f\x04\x08\x19LY\x08\x13\ +\x00?+\x00\x18?+\x11\x12\x009\x18/_^]\ ++10\x01\x07!7%\x10\x02\x04# \x00\x11\x10\ +\x12$3 \x00%\x22\x06\x02\x15\x14\x16326\x12\ +54&\x04\x105\xfeD5\x03\x5c\xba\xfe\xa5\xe7\xfe\ +\xf4\xfe\xd3\xc9\x01_\xe4\x01\x07\x01\x22\xfd\xc5\x84\xcbt\ +\x92}\x88\xc6j\x8b\x03f\xfe\xfe!\xfe\xf2\xfeV\xe3\ +\x013\x01\x0c\x01\x0f\x01\xb2\xe1\xfe\xcd1\xa8\xfe\xc1\xc1\ +\x8e\xa5\xa9\x018\xc5\x8e\xa7\x00\xff\xff\xff\xc5\x00\x00\x03\ +\x81\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x005\x00\x00\x05\ +\xa4\x05\xb6\x02\x06\x00.\x00\x00\x00\x01\xff\x85\x00\x00\x04\ +R\x05\xbc\x00\x0b\x00\x0e\xb5\x07\x01\x03\x04\x00\x12\x00?\ +2?910#\x01!\x13!\x03&5\x07\x06\x07\ +\x01{\x02\xec\x01V\x8b\xfe\xd9;\x09\x1d/*\xfeT\ +\x05\xbc\xfaD\x03Dq\xe1O\x7fW\xfc\x8f\xff\xff\x00\ +5\x00\x00\x07\x14\x05\xb6\x02\x06\x000\x00\x00\xff\xff\x00\ +5\x00\x00\x06\x14\x05\xb6\x02\x06\x001\x00\x00\x00\x03\xff\ +\xd5\x00\x00\x04h\x05\xb6\x00\x03\x00\x07\x00\x0b\x00.@\ +\x19\x00\x03LY\x0c\x00\x01\x0d\x03\x00\x00\x0a\x04\x04\x07\ +LY\x04\x03\x0a\x0bLY\x0a\x12\x00?+\x00\x18?\ ++\x11\x12\x009\x18/_^]+10\x01!\x07\ +!\x13!\x07!\x01\x03!\x13\x01\x06\x02\x9c8\xfde\ +b\x0375\xfc\xc9\x02\x935\xfc{3\x03w\xfe\x03\ +=\xfe\xfcH\xff\x00\x01\x00\x00\xff\xff\x00{\xff\xec\x05\ +\x98\x05\xcd\x02\x06\x002\x00\x00\x00\x01\x005\x00\x00\x05\ +\x9a\x05\xb6\x00\x07\x00\x14@\x09\x01\x05\x12\x06\x03LY\ +\x06\x03\x00?+\x00\x18?310!!\x01!\x01\ +!\x01!\x04d\xfe\xcf\x01\x00\xfe3\xff\x00\xfe\xcf\x01\ +5\x040\x04\xb4\xfbL\x05\xb6\xff\xff\x005\x00\x00\x04\ +\xa6\x05\xb6\x02\x06\x003\x00\x00\x00\x01\xff\xd5\x00\x00\x04\ +\x9e\x05\xb6\x00\x0b\x00*@\x15\x02\x08\x00\x03\x07\x04\x04\ +\x07LY\x04\x03\x01\x09\x00\x00\x09LY\x00\x12\x00?\ ++\x11\x12\x009\x18?+\x11\x12\x009\x12991\ +0#7\x01\x017!\x07!\x01\x01!\x03+1\x02\ +\x1f\xfe\xbe1\x03\x8a6\xfd\xd1\x01>\xfe\x0c\x02T5\ +\xf2\x01\xfa\x01\xe1\xe9\xfe\xfe\x1f\xfe)\xff\x00\xff\xff\x00\ +\xa8\x00\x00\x04\xd1\x05\xb6\x02\x06\x007\x00\x00\xff\xff\x00\ +\xba\x00\x00\x05?\x05\xb6\x02\x06\x00<\x00\x00\x00\x03\x00\ +{\xff\xec\x06H\x05\xcb\x00\x12\x00\x19\x00 \x00<@\ +!\x1a\x08\x19\x0b\x0b\x19MY\x00\x0b\x01\x10\x03\x0b@\ +\x09\x04\x13\x11 \x01\x01 MYP\x01`\x01\x02\x01\ +\x00\x13\x00?\xcd]+\x11\x12\x0099\x18?\x1a\xcd\ +_^]+\x11\x12\x009910\x057.\x025\ +\x10\x00%7!\x07\x16\x16\x15\x10\x00\x05\x07\x1366\ +54&'!\x06\x06\x15\x14\x16\x17\x02-1\x93\xd9\ +w\x01t\x01Y%\x01\x1c%\xe8\xfc\xfe\x85\xfe\xae1\ +d\xb0\xb9vp\xfe\xe3\xa8\xc0vo\x14\xdf\x0bt\xd7\ +\x91\x01\x19\x01?\x0d\xb4\xb4\x14\xfb\xd3\xfe\xe1\xfe\xbb\x04\ +\xe1\x01\xd0\x0c\xc7\xa6m\x7f\x04\x0a\xc2\xa9p\x80\x04\xff\ +\xff\xff\x8b\x00\x00\x05y\x05\xb6\x02\x06\x00;\x00\x00\x00\ +\x01\x00\xb2\x00\x00\x06\xd3\x05\xb6\x00\x1e\x00%@\x13\x01\ +\x04\x13\x04MY\x17O\x13\x01\x13\x13\x03\x1b\x14\x0b\x03\ +\x03\x12\x00??33\x129/]3+\x11\x003\ +10\x01#\x03!\x13#\x22&547\x13!\x03\ +\x06\x15\x14\x1633\x13!\x033267\x13!\x03\ +\x02\x03\xc7\x15\x5c\xfe\xe3_\x0f\xde\xf9\x17^\x01'e\ +\x0eop\x11\xa4\x01\x1c\xa4\x11\x93\x97\x22f\x01)o\ +m\x01\xb2\xfeN\x01\xb2\xcf\xb8Yl\x01\xb8\xfe!D\ +1bR\x03\x08\xfc\xf8\x8a\x9b\x01\xe3\xfd\xfa\xfe\x02\x00\ +\x01\xff\xc3\x00\x00\x05\x8d\x05\xcd\x00 \x00!@\x12\x12\ +\x00LY\x12\x04\x18\x07\x1c\x03\x0a\x09\x0aLY\x1b\x09\ +\x12\x00?3+\x11\x00\x173\x18?+10\x01\x22\ +\x06\x06\x15\x14\x16\x17\x03!\x13!&&54\x12$\ +3 \x00\x15\x14\x02\x07!\x03!\x13$\x114&\x03\ +To\xb1oLO;\xfd\x9e5\x01uew\xba\x01\ +H\xd7\x01\x00\x01#\xd8\xc9\x01l7\xfdw;\x01\x83\ +\x86\x04\xcb~\xf9\x8d\x99\xcfK\xfe\xec\x01\x04?\xf5\x97\ +\xdf\x01e\xba\xfe\xec\xf4\xf6\xfe\x97b\xfe\xfc\x01\x14\xe3\ +\x01\xa9\x91\x9a\x00\xff\xff\xff\xc5\x00\x00\x03\xc0\x07V\x02\ +&\x00,\x00\x00\x01\x07\x00j\xffz\x01R\x00\x0a\xb4\ +\x02\x01\x1f\x05&\x00+55\xff\xff\x00\xba\x00\x00\x05\ +?\x07V\x02&\x00<\x00\x00\x01\x07\x00j\x00#\x01\ +R\x00\x0a\xb4\x02\x01\x1c\x05&\x00+55\xff\xff\x00\ +Z\xff\xec\x04\xd9\x06^\x02&\x01~\x00\x00\x01\x06\x01\ +TD\x00\x00\x08\xb3\x027\x11&\x00+5\xff\xff\x00\ +'\xff\xec\x04/\x06^\x02&\x01\x82\x00\x00\x01\x06\x01\ +T\xfd\x00\x00\x08\xb3\x01.\x11&\x00+5\xff\xff\x00\ +%\xfe\x14\x04m\x06^\x02&\x01\x84\x00\x00\x01\x06\x01\ +TB\x00\x00\x08\xb3\x01\x1e\x11&\x00+5\xff\xff\x00\ +`\xff\xec\x02\xff\x06^\x02&\x01\x86\x00\x00\x01\x07\x01\ +T\xff\x18\x00\x00\x00\x08\xb3\x01\x18\x11&\x00+5\xff\ +\xff\x00w\xff\xec\x04\x93\x06\xb4\x02&\x01\x92\x00\x00\x01\ +\x06\x01U\x0c\x00\x00\x0c\xb5\x03\x02\x011\x11&\x00+\ +555\x00\x02\x00Z\xff\xec\x04\xd9\x04s\x00!\x00\ +/\x00+@\x17\x00\x14\x17\x1e\x03\x0f\x1e)GY\x1e\ +\x10\x11\x0cHY\x17\x22GY\x11\x17\x16\x00?3+\ ++\x00\x18?+\x00\x18?\x11\x129910\x016\ +673\x06\x06\x07\x03\x06\x15\x14327\x15\x06#\ +\x22'#\x06\x06#\x22&54\x12632\x16\x17\ +\x0126\x1254&#\x22\x06\x06\x15\x14\x16\x03w\ +\x13;\x16\xfe-]\x1aC\x06=$\x1d?f\xc9-\ +\x06Q\x91\x5c\x91\xa0\x86\xf2\x96Y}3\xfe\x9fMt\ +C@AGyHA\x03\xc7)W\x17S\xf1x\xfe\ +\xc0\x1e\x17A\x0c\xee\x1e\xa5_F\xd5\xc0\xd4\x01[\xc3\ +N^\xfd\x18\x8d\x01\x0dVP`\x88\xe1xc\x5c\x00\ +\x02\xff\xbe\xfe\x14\x04\xcf\x06\x1f\x00\x15\x00+\x000@\ +\x19\x06$%%$GY%%\x0d\x00\x12\x1b\x00\x16\ +GY\x00\x00\x0d\x1dGY\x0d\x16\x00?+\x00\x18?\ ++\x00\x18?\x11\x129/+\x11\x12\x00910\x01\ +2\x16\x15\x14\x06\x07\x16\x16\x15\x14\x06\x06#\x22&'\ +\x03!\x0166\x17\x22\x06\x07\x03\x16\x163265\ +4&##732654&\x03#\xcc\xe0\xb9\ +\xa7}\x8f\x81\xe0\x97O\x88Lr\xfe\xd0\x01Y.\xfd\ +\xd0Sf\x1a\xae\x1bh6q\x82ic/3;n\ +|J\x06\x1f\xba\xa4\xb0\xc6\x1c\x17\xac\x85\x95\xefw!\ +*\xfd\xdd\x06c\xdb\xcd\xeex|\xfc\xe0\x1b#\x97~\ +\x5c\x5c\xf2\x88|DK\x00\x01\x00;\xfe\x14\x04\x8f\x04\ +^\x00\x11\x00\x12\xb7\x08\x03\x12\x0d\x04\x0f\x01\x1b\x00?\ +?3\x113310\x01!\x127\x03!\x12\x12\x07\ +3>\x02\x01!\x01\x06\x02\x01}\xfe\xbe3\x84\x8c\x01\ +'\x19\x1a\x02\x05\x0f--\x01 \x01C\xfd\xd9bj\ +\xfe\x14\x01\x01\xf9\x04P\xfe\xc6\xfe\xb0\xa5)i_\x02\ +>\xfc\x0c\xb5\xfe\xee\x00\x00\x02\x007\xff\xec\x04\xcf\x06\ +\x1f\x00\x1c\x00'\x00$@\x12\x12\x22\x00\x00\x17\x05\x05\ +\x0bFY\x05\x00\x17\x1dGY\x17\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x113310\x01&546\ +32\x16\x17\x07&#\x22\x06\x15\x14\x16\x16\x17\x16\x15\ +\x10\x00!\x22&54\x12\x132654'\x06\x06\ +\x15\x14\x16\x02\x12\x97\xf0\xccp\xc5cw\x9d\x82CP\ +\x14.h\xe9\xfe\xc8\xfe\xed\xca\xed\xf8\xe1e\x87f~\ +\xa3M\x03\x9e~\x9e\xa6\xbf5<\xd7f@8\x1e0\ +2U\xbb\xfa\xfe\xf1\xfe\xc0\xd3\xb6\xcc\x01#\xfd}\xbe\ +\x94\x93Q+\xd6\x83U]\x00\x00\x01\x00'\xff\xec\x04\ +/\x04s\x00&\x00-@\x17\x13\x01%%\x01JY\ +%%\x0d\x19\x19\x1fFY\x19\x10\x0d\x07FY\x0d\x16\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x01#\x22\x06\x15\x14\x163267\x15\ +\x06#\x22&5\x10%5&&54632\x17\ +\x07&&#\x22\x06\x15\x14\x1633\x02\xfa\x94x\x8a\ +ZV\x5c\xa7^\xa0\xf2\xce\xee\x01HPV\xf6\xdd\xf5\ +\x9e\x5c\x5c\x8bHahad\x87\x01\xddMD8=\ +)1\xf6O\x9b\x8b\x01\x035\x06\x1fqG\x9e\xaeV\ +\xde.$@=40\x00\x01\x00Z\xfe\x85\x04}\x06\ +\x14\x00!\x00)@\x14\x11\x1f\x1f\x22\x0f\x19\x01\x13\x03\ +\x19\x0a\x04\x07\x08\x08\x07FY\x08\x00\x00?+\x11\x12\ +\x0099\x18/_^]\x113\x11310\x134\ +\x12\x12%\x06##7!\x07\x04\x00\x06\x15\x14\x16\x17\ +\x1e\x02\x15\x14\x06\x07!6654&'&&Z\ +}\xf6\x01\x14Nf\xee2\x03\x0c'\xfe\xe7\xfe\xd6\x88\ +V\x5cja1Wc\xfe\xc5wM8Q\x9b\x8a\x01\ +\xb6\x9c\x01\x12\x01\x0c\xd2\x0d\xdf\xb6\xe2\xfe\xd7\xf6|L\ +k*2ObB[\x9f\x5cwu-\x224%F\ +\xc7\x00\x01\x00%\xfe\x14\x04m\x04s\x00\x16\x00\x1c@\ +\x0e\x0f\x11\x0b\x15\x01\x1b\x11\x06GY\x11\x10\x0c\x0f\x00\ +??+\x00\x18??\x12910\x01!\x1365\ +4#\x22\x06\x07\x03!\x133\x073632\x16\x15\ +\x14\x07\x03h\xfe\xd3\xf2\x10l\x5c\x96+b\xfe\xd3\xed\ +\xe6\x15\x06\x92\xd1\x8a\x97\x17\xfe\x14\x04yD3{\xe4\ +\xcc\xfe1\x04^\xcf\xe4\xa7\x9bIk\x00\x03\x00d\xff\ +\xec\x04\x8b\x06+\x00\x0f\x00\x17\x00\x1f\x00&@\x14\x1a\ +\x14FY\x1a\x1a\x00\x09\x09\x18FY\x09\x01\x00\x10F\ +Y\x00\x16\x00?+\x00\x18?+\x11\x12\x009\x18/\ ++10\x05\x22&54\x12\x126632\x16\x15\ +\x10\x02\x00'267!\x06\x15\x14\x01\x22\x03!6\ +54&\x01\xec\xc0\xc8\x0a\x85\xad?\ +\x013A\xfe\xdc\xf9\xfe\xd7\x04^\xfd\x98a\x85\x9d\x01\ +\x8d\x01$\xfe\x9b\xfd\xe9\xe2\x00\x00\x01\x00\x5c\xfe\x85\x04\ +9\x06\x14\x000\x009@\x1d\x07\x15\x151\x1b\x000\ +0\x00JY00\x0f\x0f\x01\x13\x03\x0f'!%$\ +%$FY%\x00\x00?+\x11\x12\x0099\x18/\ +_^]9/+\x11\x12\x009\x113\x11310\ +\x01#\x22\x06\x15\x14\x16\x17\x1e\x02\x15\x14\x06\x07!6\ +654&'&&5\x10%5&&546\ +7\x06##7!\x07#\x22\x06\x06\x15\x14\x1633\ +\x03PF\xb3\xccFlxW-Wc\xfe\xc5qO\ +;J\x98\x8b\x01k`k\x9b\xa8\xb9:51\x02\xf1\ +-\x18\x86\xd5jusf\x02\xc1\x81sDU4<\ +L_>[\x9f\x5cqz.&3\x22F\xba\x81\x01\ +=^\x06\x17rPp\x94*\x0d\xdf\xd2@xSP\ +T\xff\xff\x00Z\xff\xec\x04T\x04s\x02\x06\x00R\x00\ +\x00\x00\x01\x00^\xff\xec\x05\xdd\x04^\x00\x19\x00\x22@\ +\x11\x0e\x15\x15\x0c\x10\x12\x10FY\x12\x0f\x05\x00GY\ +\x05\x16\x00?+\x00\x18?+\x11\x0033\x18?1\ +0%27\x15\x06#\x22&546\x13!\x03!\ +\x13#77!\x07#\x03\x06\x15\x14\x04\x96ABd\ +\x94\x83\x8c\x0br\xfe\xee\xbc\xfe\xce\xbf\xf0\x1d\xc4\x04\x9e\ +/\xf0l\x08\xdb!\xd97\x80y\x1bF\x023\xfc\x87\ +\x03y\x93R\xe5\xfd\xe3(\x11H\x00\x00\x02\xff\xbe\xfe\ +\x14\x04h\x04s\x00\x11\x00\x1e\x00\x22@\x11\x06\x04\x0f\ +\x0a\x1b\x0f\x12GY\x0f\x10\x04\x18GY\x04\x16\x00?\ ++\x00\x18?+\x00\x18?\x11\x12910\x01\x14\x02\ +\x06#\x22'\x06\x06\x03!\x13>\x0232\x16\x05\x22\ +\x06\x07\x03\x16326654&\x04h\x82\xf0\x9a\ +\xa3_\x09 H\xfe\xd5\xe4.\x86\xd6\x9d\xc3\xdc\xfeN\ +Wj\x2271dEuLB\x02\xc1\xd2\xfe\xb4\xb7\ +|R\xb0\xfe\xae\x04:\xd8\xdeo\xe6\x0e\x9d\xa3\xfe\xf8\ +X\x81\xf8mXb\x00\x00\x01\x00Z\xfe\x85\x03\xf2\x04\ +s\x00 \x00!@\x10\x03\x11\x11!\x0f\x0b\x01\x13\x03\ +\x0b\x18\x1dGY\x18\x10\x00?+\x00\x18/_^]\ +\x113\x11310\x01\x14\x16\x17\x1e\x02\x15\x14\x06\x07\ +!6654&'&&54\x12$32\x17\ +\x07&#\x22\x06\x06\x01\x8bNdja1Wc\xfe\ +\xc5qO>G\x9d\x88\xa3\x01\x0c\xa9\xa9\x97\x5c~b\ +T\x88O\x01\xe7Pj-2ObB[\x9f\x5cq\ +z.(7 G\xc6\x94\xbe\x01K\xacH\xe59p\ +\xc0\x00\x02\x00Z\xff\xec\x05;\x04^\x00\x11\x00\x1d\x00\ +\x1c@\x0e\x12\x0f\x0c\x0fFY\x0c\x0f\x05\x18GY\x05\ +\x16\x00?+\x00\x18?+\x11\x00310\x01\x14\x0e\ +\x02#\x22&54\x12$3!\x07!\x16\x16%\x22\ +\x06\x06\x15\x1432\x1254'\x04JW\x95\xcf\x83\ +\xc9\xe9\xa0\x011\xcf\x02A/\xfe\xe4%5\xfe\x95i\ +\x9bR\x96t\x92)\x02Nm\xf2\xa8[\xec\xd0\xd3\x01\ +;\xa8\xdf-\x9d\xcax\xd5\x84\xcd\x01\x06\xc3of\x00\ +\x01\x00^\xff\xec\x04%\x04^\x00\x15\x00\x1c@\x0e\x11\ +\x0c\x0e\x0cFY\x0e\x0f\x05\x00GY\x05\x16\x00?+\ +\x00\x18?+\x11\x00310%27\x15\x06#\x22\ +&547\x13!77!\x07!\x03\x06\x15\x14\x02\ +\x85Aao\x9b\x94\x8f\x0cs\xfe\xe5\x1d\xbe\x02\xec1\ +\xfe\xb2s\x06\xdf#\xe15}\x852>\x02\x1b\x93R\ +\xe5\xfd\xe5\x1e\x17J\x00\x00\x01\x00w\xff\xec\x04\x93\x04\ +^\x00\x13\x00\x14@\x09\x0e\x06\x0f\x00\x0cGY\x00\x16\ +\x00?+\x00\x18?310\x05\x22&547\x13\ +!\x03\x06\x15\x143 \x11!\x10\x02\x02\x06\x02\x14\xc9\ +\xd4\x10\x81\x01+\x81\x0e\x8d\x015\x01-P\x9b\xf1\x14\ +\xc6\xb6FP\x02`\xfd\x98=<\x9c\x03}\xfe\xb5\xfe\ +a\xfe\xff\x87\x00\x00\x02\x00Z\xfe\x14\x05\xc3\x04\x87\x00\ +\x08\x00#\x00(@\x14\x10\x1b\x09\x1b\x1b\x06FY\x1b\ +\x10\x17\x0a\x00\x22\x22\x00GY\x22\x16\x00?+\x11\x12\ +\x0099\x18?+\x00\x18?\x10\xc610%>\x02\ +54#\x22\x07\x01\x13&&54\x127\x17\x06\x06\ +\x15\x14\x16\x17\x136632\x16\x15\x14\x02\x04\x07\x03\ +\x03Df\x96Q^Y(\xfd\xdbi\xbd\xdf\xac\xc1\xc0\ +\x85uTDn/\xcc\xaf\xb8\xce\xa9\xfe\xc5\xcf`\xe3\ +\x10\x8c\xdd\x83\xb2\xb0\xfb3\x01\xe2\x19\xf8\xc6\xcb\x01O\ +\xa0\xb0\x87\xf8\x81mx\x11\x02\x04\xd2\xbc\xe6\xc8\xd1\xfe\ +\xbc\xb9\x09\xfe&\x00\x01\xfe\xfc\xfe\x14\x04\xec\x04s\x00\ +\x1f\x00(@\x16\x04\x17\x07\x14\x04\x16\x05\x0f\x16\x1b\x00\ +\x1bHY\x00\x10\x10\x0bHY\x10\x1b\x00?+\x00\x18\ +?+\x00\x18??\x12\x17910\x012\x16\x17\x17\ +\x01!\x01\x13\x16\x16327\x15\x06#\x22&'\x03\ +\x01!\x01\x03&&#\x22\x07'6\x013|\x7f\x18\ +\x1a\x01@\x01L\xfd\xc2J\x0901-:ab~\ +\x83\x17)\xfe\x7f\xfe\xb8\x02\x7f5\x0d**\x22'4\ +e\x04s\x8c\xa3\xb7\x01\xd1\xfc\xfa\xfe1:;\x0f\xee\ +!\x8b\xa0\x01\x19\xfd\xbc\x03}\x01NMA\x0f\xee'\ +\x00\x00\x01\x00w\xfe\x14\x06\x1d\x06\x12\x00\x1a\x00 @\ +\x10\x1a\x00\x04\x12\x0f\x0b\x1b\x01\x19\x0c\x19GY\x09\x0c\ +\x16\x00?3+\x11\x003\x18??3?10\x01\ +\x016\x12\x11!\x10\x02\x04\x07\x03!\x13&&54\ +7\x13!\x03\x06\x15\x14\x16\x17\x01\x04\x93\xfe\xe4\xc4\xb5\ +\x01-\x9c\xfe\xbe\xfbc\xfe\xe0b\xd1\xdb\x10\x81\x01+\ +\x81\x0e[W\x01\x1d\x06\x12\xfa\xc5 \x01\xb1\x01\xb6\xfe\ +`\xfe-\xf2\x16\xfe1\x01\xcf\x15\xc6\xaaFP\x02`\ +\xfd\x98=\x02'4&##\x03!\x01!\x13!\ +\x03!\x0332\x16\x15\x14\x06\x02\x06\x06\x03\xa4uN\ +PDIL%\x0a\x02?F\xe9\x90\xfe\xcf\x01\x00\xfe\ +\xa07\x03\xe88\xfe\xaa9\xf2\xb2\xc6\x064b\xa0\x14\ +&\xfe'L\xa9F\x0b=6\xfd^\x04\xb4\x01\x02\xfe\ +\xfe\xfe\xf0\xae\x9c'B\xfe\xe9\xa0L\xff\xff\x005\x00\ +\x00\x04\x98\x07s\x02&\x01a\x00\x00\x01\x07\x00v\x00\ +}\x01R\x00\x08\xb3\x01\x0e\x05&\x00+5\x00\x01\x00\ +{\xff\xec\x057\x05\xcd\x00\x1c\x00.@\x19\x03\x06L\ +Y\x0c\x03\x01\x0d\x03\x03\x03\x0f\x16\x16\x00LY\x16\x04\ +\x0f\x0aLY\x0f\x13\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/_^]+10\x01\x22\x06\x07!\x07!\ +\x07\x15\x10!27\x11\x06#\x22\x00\x11\x10\x12$3\ +2\x16\x17\x07&&\x03\x89\x92\xdb9\x02\x155\xfd\xf1\ +\x02\x01\x1f\x92\xc0\xbb\xd5\xfe\xfe\xe6\xd0\x01\x5c\xe2z\xcc\ +hvH\x99\x04\xcb\xbf\xac\xfe\x1e\x1f\xfe\xcbM\xfe\xfc\ +M\x01+\x01\x12\x01\x06\x01\xb9\xe518\xfa)8\xff\ +\xff\x00)\xff\xec\x04V\x05\xcb\x02\x06\x006\x00\x00\xff\ +\xff\xff\xc5\x00\x00\x03\x81\x05\xb6\x02\x06\x00,\x00\x00\xff\ +\xff\xff\xc5\x00\x00\x03\xc0\x07V\x02&\x00,\x00\x00\x01\ +\x07\x00j\xffz\x01R\x00\x0a\xb4\x02\x01\x1f\x05&\x00\ ++55\xff\xff\xfe\xbe\xfeR\x02\xb2\x05\xb6\x02\x06\x00\ +-\x00\x00\x00\x02\xff\xc3\xff\xec\x07?\x05\xb6\x00\x1b\x00\ +$\x000@\x1a\x00$LY\x00\x00\x08\x1a\x08\x1cL\ +Y\x08\x12\x1a\x0aLY\x1a\x03\x0f\x14LY\x0f\x13\x00\ +?+\x00\x18?+\x00\x18?+\x11\x12\x009\x18/\ ++10\x0132\x16\x15\x14\x00!!\x13#\x0a\x02\ +\x06#\x22'5\x163266\x12\x12\x13!\x013\ +2654&##\x05\x12D\xed\xfc\xfe\xc4\xfe\xd6\ +\xfeJ\xfe\xfeO\xa4\x93\xb5\x96P?5/ATP\ +i\x81G\x03L\xff\x00w\x81\x89_am\x03\x85\xce\ +\xc1\xf3\xfe\xfd\x04\xb4\xfe\xc0\xfd\xfe\xfe\xefu\x18\xfe\x14\ +?\x8c\x01'\x01\xc0\x01\x16\xfbHyuJQ\x00\x00\ +\x02\x005\x00\x00\x07\x17\x05\xb6\x00\x12\x00\x1a\x00)@\ +\x15\x1a\x06\x0b\x06LY\x0f\x0b\x0b\x04\x0d\x09\x03\x08\x12\ +\x04\x13LY\x04\x12\x00?+\x00\x18??3\x129\ +/3+\x11\x00310\x01\x14\x00!!\x13!\x03\ +!\x01!\x03!\x13!\x0332\x16\x013265\ +4##\x07\x17\xfe\xc7\xfe\xdc\xfe@\x89\xfem\x8a\xfe\ +\xcf\x015\x012w\x01\x91y\x011wV\xe6\xf2\xfd\ +I\x7f}\x85\xc0m\x01\xfa\xf4\xfe\xfa\x02\x87\xfdy\x05\ +\xb6\xfd\xcf\x021\xfd\xcf\xcc\xfeEyn\xa2\x00\x01\x00\ +\xa8\x00\x00\x05h\x05\xb6\x00\x17\x00#@\x12\x0d\x04L\ +Y\x0d\x0d\x09\x15\x06\x12\x0c\x08\x09\x08LY\x09\x03\x00\ +?+\x11\x003\x18?3\x129/+10\x014\ +&##\x03!\x01!\x13!\x03!\x0332\x16\x15\ +\x14\x07\x03!\x136\x047JK\xd9\x90\xfe\xcf\x01\x00\ +\xfe\xa07\x03\xe88\xfe\xaa9\xe1\xc3\xc4\x16T\xfe\xcb\ +d\x0a\x02'D7\xfd^\x04\xb4\x01\x02\xfe\xfe\xfe\xf0\ +\xb4\xa0>p\xfe^\x01\xd72\xff\xff\x005\x00\x00\x05\ +\x7f\x07s\x02&\x01\xb4\x00\x00\x01\x07\x00v\x00\xdb\x01\ +R\x00\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x00\x1f\xff\ +\xec\x05\x85\x07\x91\x02&\x01\xbd\x00\x00\x01\x07\x026\x00\ +/\x01R\x00\x08\xb3\x01\x1b\x05&\x00+5\x00\x01\x00\ +5\xfeV\x05\x9a\x05\xb6\x00\x0b\x00\x19@\x0c\x04\x00\x03\ +\x09U\x0b\x02LY\x07\x0b\x12\x00?3+\x00\x18?\ +?310\x01!\x01!\x01!\x01!\x03!\x13!\ +\x01j\x014\xff\x00\x01\xcc\x01\x00\x010\xfe\xca\xfe\x81\ +\x5c\xfe\xd1\x5c\xfe\x7f\x05\xb6\xfbL\x04\xb4\xfaJ\xfeV\ +\x01\xaa\x00\xff\xff\xff\x85\x00\x00\x04\x8b\x05\xbc\x02\x06\x00\ +$\x00\x00\x00\x02\x005\x00\x00\x04\xa0\x05\xb6\x00\x0c\x00\ +\x14\x00&@\x14\x0c\x13LY\x0c\x0c\x07\x08\x08\x0bL\ +Y\x08\x03\x07\x14LY\x07\x12\x00?+\x00\x18?+\ +\x11\x12\x009\x18/+10\x012\x16\x15\x14\x04!\ +!\x01!\x07!\x03\x032654##\x03\x02d\ +\xee\xfc\xfe\xc4\xfe\xd5\xfeN\x015\x0366\xfd\xf8A\ +%\x8b\x92\xc1lT\x03\x85\xd1\xc8\xed\xff\x05\xb6\xfe\xfe\ +\xcd\xfdyuj\xaa\xfew\x00\xff\xff\x005\x00\x00\x04\ +\xe3\x05\xb6\x02\x06\x00%\x00\x00\xff\xff\x005\x00\x00\x04\ +\x98\x05\xb6\x02\x06\x01a\x00\x00\x00\x02\xff;\xfeV\x05\ +\x7f\x05\xb6\x00\x0d\x00\x12\x00$@\x12\x09\x0dU\x04\x0e\ +LY\x04\x03\x06\x10\x00\x0b\x00LY\x0b\x12\x00?+\ +\x11\x0033\x18?+\x00\x18?310\x0336\ +\x00\x13!\x013\x03!\x13!\x03!\x01\x02\x03!\x13\ +5\x81\xab\x01\x11y\x02\xfe\xff\x00\xba\x91\xfe\xd1\x5c\xfc\ +\xf0]\xfe\xd3\x04\x0d\xd7\xd3\x01\xa8\xca\x01\x02\xf7\x02N\ +\x01o\xfbL\xfdT\x01\xaa\xfeV\x06^\xfd\x98\xfe\xb6\ +\x03\xb2\x00\xff\xff\x005\x00\x00\x04\x9c\x05\xb6\x02\x06\x00\ +(\x00\x00\x00\x01\xff\x83\x00\x00\x07\x96\x05\xb6\x00\x11\x00\ +!@\x11\x03\x0f\x06\x0c\x09\x05\x00\x00\x11\x07\x04\x01\x03\ +\x0e\x0b\x11\x12\x00?33?33\x129\x11\x173\ +10\x01\x01!\x01\x13!\x03\x01!\x01\x01!\x01\x03\ +!\x13\x01!\x01\xee\xfe\xe9\x01/\x01\x0a\x92\x01%\x92\ +\x02\x19\x01H\xfd\xba\x01'\xfe\xc4\xfe\xee\x98\xfe\xdc\x97\ +\xfd\xd5\xfe\xaa\x03\x0c\x02\xaa\xfdT\x02\xac\xfdT\x02\xac\ +\xfd-\xfd\x1d\x02\xcf\xfd1\x02\xcd\xfd3\x00\x00\x01\x00\ +)\xff\xec\x04\xb0\x05\xcb\x00'\x00-@\x17\x03\x17\x18\ +\x18\x17MY\x18\x18\x0a$$\x1eMY$\x04\x0a\x10\ +MY\x0a\x13\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x01\x14\x06\x07\x15\x16\x16\x15\ +\x14\x04!\x22&'\x11\x1632654&##\ +73 54&#\x22\x07'6632\x16\x16\ +\x04\xb0\xdb\xc5\x8f\xa7\xfe\xbe\xfe\xcd\x8b\xcfN\xb6\xd9\xaa\ +\xac\x9a\xa5\x8d3\x7f\x01\x7f_^\xaa\xbem\x8f\xfb\x97\ +{\xc6m\x04w\xa9\xc3\x0d\x04\x11\xa8\x83\xe0\xf2$+\ +\x01\x07cys]W\xf2\xc8HR{\xd1[GX\ +\x9c\x00\x01\x005\x00\x00\x06\x14\x05\xb6\x00\x0f\x00\x15@\ +\x09\x08\x0f\x0a\x01\x0b\x03\x04\x0a\x12\x00?3?3\x12\ +9910\x01\x01!\x01!\x12\x127'\x01!\x01\ +!\x03\x02\x07\x01\xa6\x02\xfc\x01r\xfe\xcb\xfe\xec^d\ +#\x08\xfd\x04\xfe\x89\x015\x01\x19\x93A\x13\x01\xa2\x04\ +\x14\xfaJ\x01\xbe\x01\xd8\x8f\x02\xfb\xd9\x05\xb6\xfdL\xfe\ +\xe6F\x00\xff\xff\x005\x00\x00\x06\x14\x07\x91\x02&\x01\ +\xb2\x00\x00\x01\x07\x026\x00\xe1\x01R\x00\x08\xb3\x01\x14\ +\x05&\x00+5\x00\x01\x005\x00\x00\x05\x7f\x05\xb6\x00\ +\x0a\x00\x19@\x0b\x07\x02\x0a\x0a\x04\x08\x05\x03\x01\x04\x12\ +\x00?3?3\x129\x113310!!\x01\x03\ +!\x01!\x03\x01!\x01\x04`\xfe\xae\xfe\xf0\x98\xfe\xcf\ +\x015\x012\x92\x02\x1d\x01X\xfd\xba\x02\xcf\xfd1\x05\ +\xb6\xfdT\x02\xac\xfd-\x00\x01\xff\xc3\xff\xec\x05\x9a\x05\ +\xb6\x00\x14\x00\x1c@\x0e\x13\x12\x10\x00LY\x10\x03\x05\ +\x0aLY\x05\x13\x00?+\x00\x18?+\x00\x18?1\ +0\x01\x0a\x02\x06#\x22'5\x163266\x12\x12\ +\x13!\x01!\x01\x03#O\xa4\x93\xb5\x96P?5/\ +ATPi\x81G\x03]\xfe\xc8\xfe\xd1\x01\x00\x04\xb4\ +\xfe\xc0\xfd\xfe\xfe\xefu\x18\xfe\x14?\x8c\x01'\x01\xc0\ +\x01\x16\xfaJ\x04\xb4\x00\xff\xff\x005\x00\x00\x07\x14\x05\ +\xb6\x02\x06\x000\x00\x00\xff\xff\x005\x00\x00\x05\xa4\x05\ +\xb6\x02\x06\x00+\x00\x00\xff\xff\x00{\xff\xec\x05\x98\x05\ +\xcd\x02\x06\x002\x00\x00\xff\xff\x005\x00\x00\x05\x9a\x05\ +\xb6\x02\x06\x01n\x00\x00\xff\xff\x005\x00\x00\x04\xa6\x05\ +\xb6\x02\x06\x003\x00\x00\xff\xff\x00{\xff\xec\x057\x05\ +\xcd\x02\x06\x00&\x00\x00\xff\xff\x00\xa8\x00\x00\x04\xd1\x05\ +\xb6\x02\x06\x007\x00\x00\x00\x01\x00\x1f\xff\xec\x05\x85\x05\ +\xb6\x00\x16\x00\x1c@\x0d\x09\x0e\x0e\x00\x11\x0a\x03\x00\x05\ +LY\x00\x13\x00?+\x00\x18?3\x129\x1131\ +0\x17\x22'\x11\x1632667\x01!\x13\x16\x17\ +67\x01!\x01\x0e\x02\xf2|WQu0J?1\ +\xfe\xe3\x013\x9a\x17\x06.\x15\x01X\x01N\xfd\xa6\x84\ +\x92\xac\x14 \x01\x0b'\x22AQ\x04\x12\xfd\x89]:\ +n'\x02y\xfb\xfa\xe1\x9aI\xff\xff\x00{\xff\xec\x06\ +H\x05\xcb\x02\x06\x01s\x00\x00\xff\xff\xff\x8b\x00\x00\x05\ +y\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x005\xfeV\x05\ +\x9a\x05\xb6\x00\x0b\x00\x1b@\x0d\x09\x05\x03\x02U\x0b\x07\ +\x04\x07LY\x04\x12\x00?+\x11\x003\x18??3\ +10%\x03!\x13!\x01!\x01!\x01!\x01\x05h\ +\x8f\xfe\xd1\x5c\xfc/\x015\x014\xff\x00\x01\xcc\x01\x00\ +\x010\xfe\xfe\xf6\xfd`\x01\xaa\x05\xb6\xfbL\x04\xb4\xfb\ +@\x00\x01\x00\xb8\x00\x00\x05m\x05\xb6\x00\x14\x00\x16@\ +\x0b\x03\x0fLY\x03\x03\x12\x09\x03\x00\x12\x00??3\ +9/+10!\x13\x06#\x22&547\x13!\ +\x03\x06\x15\x14327\x13!\x01\x03\x06w\xbb\xa1\xa7\ +\xc2\x0dp\x011l\x0a\x99\x83\xa4\x8b\x012\xfe\xca\x02\ +1V\xaa\x989;\x02%\xfd\xfc.$\x83J\x02\x8f\ +\xfaJ\x00\x00\x01\x005\x00\x00\x08\x12\x05\xb6\x00\x0b\x00\ +\x1a@\x0c\x09\x05\x01\x03\x07\x03\x00\x03LY\x00\x12\x00\ +?+\x11\x003\x18?33103\x01!\x01!\ +\x01!\x01!\x01!\x015\x015\x01:\xff\x00\x01}\ +\x01\x00\x01;\xff\x00\x01}\x01\x00\x019\xfe\xcb\x05\xb6\ +\xfbL\x04\xb4\xfbL\x04\xb4\xfaJ\x00\x00\x01\x005\xfe\ +V\x08\x12\x05\xb6\x00\x0f\x00\x1f@\x0f\x0d\x09\x05\x03\x02\ +U\x0f\x0b\x07\x04\x07LY\x04\x12\x00?+\x11\x003\ +3\x18??3310%\x03!\x13!\x01!\x01\ +!\x01!\x01!\x01!\x01\x07\xe1\x8f\xfe\xd1\x5c\xf9\xb6\ +\x015\x01:\xff\x00\x01}\x01\x00\x01;\xff\x00\x01}\ +\x01\x00\x019\xfe\xfe\xf6\xfd`\x01\xaa\x05\xb6\xfbL\x04\ +\xb4\xfbL\x04\xb4\xfb@\x00\x02\x00\xa8\x00\x00\x05'\x05\ +\xb6\x00\x0c\x00\x14\x00&@\x14\x00\x14LY\x00\x00\x08\ +\x0b\x0b\x0aLY\x0b\x03\x08\x0dLY\x08\x12\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+10\x0132\ +\x16\x15\x14\x04!!\x13!\x13!\x0132654\ +##\x02\xfaC\xf0\xfa\xfe\xc4\xfe\xd6\xfeI\xfe\xfe\xa0\ +7\x02\x92\xff\x00d\x8b\x92\xc1l\x03\x85\xd2\xc7\xed\xff\ +\x04\xb4\x01\x02\xfbHuj\xaa\x00\x03\x005\x00\x00\x06\ +\xe1\x05\xb6\x00\x03\x00\x0e\x00\x16\x00\x22@\x12\x0b\x16L\ +Y\x0b\x0b\x08\x02\x09\x03\x01\x12\x08\x0fLY\x08\x12\x00\ +?+\x00\x18??3\x129/+10!!\x01\ +!\x01\x14\x04!!\x01!\x0332\x16\x01326\ +54##\x05\xac\xfe\xc7\x015\x019\xfdR\xfe\xc4\ +\xfe\xd6\xfeh\x015\x012w%\xf0\xf9\xfdiE\x8b\ +\x92\xc1M\x05\xb6\xfc6\xed\xff\x05\xb6\xfd\xcf\xd2\xfeK\ +uj\xaa\x00\x02\x005\x00\x00\x04R\x05\xb6\x00\x0a\x00\ +\x12\x00\x1d@\x0f\x07\x12LY\x07\x07\x04\x05\x03\x04\x0b\ +LY\x04\x12\x00?+\x00\x18?\x129/+10\ +\x01\x14\x04!!\x01!\x0332\x16\x013265\ +4##\x04R\xfe\xc4\xfe\xd6\xfeI\x015\x012w\ +C\xf0\xfa\xfdJd\x8b\x92\xc1l\x01\xec\xed\xff\x05\xb6\ +\xfd\xcf\xd2\xfeKuj\xaa\x00\x00\x01\x00\x1b\xff\xec\x04\ +\xa6\x05\xcd\x00\x1c\x00.@\x19\x05\x04LY\x0c\x05\x01\ +\x0d\x03\x05\x05\x17\x10\x10\x0aLY\x10\x04\x17\x00LY\ +\x17\x13\x00?+\x00\x18?+\x11\x12\x009\x18/_\ +^]+10%267!7!75\x10!\ +\x22\x06\x07'63 \x00\x11\x10\x02\x04#\x22&'\ +\x11\x16\x01\x85\xa9\xda<\xfd\xe55\x02\x0f\x02\xfe\xfeA\ +}\x84P\xd0\xe8\x01\x02\x01\x11\xc6\xfe\xab\xe3y\xc1S\ +\xad\xee\xb7\xbd\xfe\x19\x1a\x018\x1b3\xf6Z\xfe\xdb\xfe\ +\xf0\xfe\xf4\xfeE\xe5%.\x01\x0f`\x00\x02\x005\xff\ +\xec\x07\xcd\x05\xcd\x00\x15\x00#\x002@\x1c\x0f\x0aL\ +Y\x0f\x0f\x0c\x0c\x0f\x01\x0d\x03\x0d\x03\x0c\x12\x13\x16L\ +Y\x13\x04\x04\x1dLY\x04\x13\x00?+\x00\x18?+\ +\x00\x18??_^]\x129/+10\x01\x10\x02\ +\x04#\x22\x00\x1147!\x03!\x01!\x03!\x12\x00\ +32\x00%\x22\x06\x02\x15\x14\x16326\x1254\ +&\x07\xcd\xb0\xfe\xbd\xdc\xf1\xfe\xef\x04\xfe\xec\x86\xfe\xcf\ +\x015\x012y\x01\x06P\x01e\xf5\xf1\x01\x09\xfd\xeb\ +k\xb4fwjk\xb2er\x03\xaa\xfe\xe9\xfeD\xeb\ +\x01'\x01\x062,\xfd\x89\x05\xb6\xfd\xc3\x01 \x014\ +\xfe\xe0\x1e\xb7\xfe\xc0\xbb\x93\x96\xae\x01;\xc9\x8b\x9e\x00\ +\x02\xff\x83\x00\x00\x04\xf2\x05\xb6\x00\x0d\x00\x16\x00$@\ +\x12\x03\x00\x15\x00MY\x15\x15\x09\x0c\x02\x12\x09\x0fL\ +Y\x09\x03\x00?+\x00\x18?3\x129/+\x11\x00\ +310\x01\x01!\x01&&54$!!\x01!\ +\x13\x13#\x22\x06\x15\x14\x1633\x02\x8d\xfea\xfe\x95\ +\x02\x02kY\x013\x01\x18\x01\xe6\xfe\xca\xfe\xcfw\x89\ +\x87\x7f\x85m^l\x021\xfd\xcf\x02\x91D\x9dk\xdf\ +\xfa\xfaJ\x021\x02\x87roO[\xff\xff\x00Z\xff\ +\xec\x04\x9e\x04s\x02\x06\x00D\x00\x00\x00\x02\x00m\xff\ +\xec\x04\xf4\x06#\x00\x19\x00&\x00$@\x12\x0c\x17\x10\ +\x10 FY\x10\x10\x17\x06\x01\x17\x1aGY\x17\x16\x00\ +?+\x00\x18?\x129/+\x11\x12\x00910\x13\ +\x10\x0076$%\x13\x04\x0e\x02\x0736632\ +\x16\x15\x14\x02\x04#\x22&%26654#\x22\ +\x06\x07\x06\x15\x14m\x01\x06\xe3H\x01\x0c\x01+\x1f\xfe\ +\xce\xe9\x86Z\x1e\x02B\xaa`\x8e\x9b\x94\xfe\xf7\xab\xc9\ +\xd4\x01\xbaBsGs8\x86<\x18\x01\xcd\x01K\x02\ +#g 9(\xfe\xfe-/W\x92tTV\xbd\xb3\ +\xc5\xfe\xbb\xac\xf6\x01y\xd1k\x99ZRsO\xe0\x00\ +\x03\x00Z\xff\xec\x04Z\x04s\x00\x14\x00 \x00*\x00\ +-@\x17\x06\x15$$\x15JY$$\x0e\x00\x00!\ +JY\x00\x10\x0e\x1aJY\x0e\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x00910\x012\ +\x16\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06\x06#\x22&5\ +4\x12$\x03\x07\x15\x14\x1632654&#\x13\ +\x22\x06\x0732654&\x02\xc7\xbb\xd8yyY\ +Zu\xdb\x94\xe3\xfa\x99\x01\x1b\x85\x02[YU\x5ca\ +p\x9fU\x8c'\xc9W_B\x04s\xa3\x8ap\x85\x1c\ +\x04\x19rTj\xa3Y\xe9\xdb\xca\x01C\xb6\xfdh\x1f\ + iuVDBA\x01\xbf\x82nFE05\x00\ +\x01\x00\x14\xff\xec\x03\xa2\x04s\x00&\x00 @\x10\x22\ +\x0e\x02\x16\x02$FY\x02\x10\x16\x10FY\x16\x16\x00\ +?+\x00\x18?+\x11\x12\x009910\x1363\ +2\x16\x15\x14\x0e\x02\x07\x0e\x02\x15\x14327\x15\x06\ +\x06#\x22&54>\x027>\x0254#\x22\x07\ +\xa6\xb7\xd0\xb3\xc2Bp\x94RdA\x1f\x8f\x87\xbf^\ +\xb5r\xb8\xcaFo\x8cE\x83:\x1cyr\x98\x04\x1b\ +X\x9d\x92_{T;\x1d#$*\x1edZ\xe3/\ +'\xa7\x96]|S6\x17,\x22,\x1fVK\x00\x00\ +\x02\x00Z\xff\xec\x04\x8d\x06)\x00\x19\x00%\x001@\ +\x19\x1d \x0d\x04\x0b\x0b FY\x0b\x0b\x04\x18\x18\x13\ +GY\x18\x01\x04\x1aGY\x04\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x009\x11310\ +\x01\x10\x02\x04#\x22&54\x12632\x1737\ +54&#\x22\x07'63 \x01267&&\ +#\x22\x06\x15\x14\x16\x04\x8d\xa0\xfe\xe1\xc4\xcf\xe1y\xdd\ +\x8d\xb9`\x06\x02|\x8cja?\x7f\xba\x02\x08\xfd\x8e\ +j\x93!\x14YGs\x89L\x03\xa0\xfe\xe4\xfeJ\xe2\ +\xe9\xd1\xba\x01\x1e\x9d\xb7$\x1e\xcf\xbe)\xee1\xfa\xb8\ +\xe0\xd9BW\xdd\xbaXc\x00\xff\xff\x00Z\xff\xec\x04\ +B\x04s\x02\x06\x00H\x00\x00\x00\x01\xff\xec\xff\xec\x07\ +\xc3\x04s\x009\x00=@ 7\x01\x1a\x01KY\x1e\ +\x1a\x1a9\x1c\x0f9\x15'\x10\x15\x10GY\x22\x15\x10\ +-\x09\x04\x09GY2\x04\x16\x00?3+\x11\x003\ +\x18?3+\x11\x003\x18??\x129/3+\x11\ +\x00310\x01#\x06\x04#\x22'7\x16326\ +654&#\x22\x075632\x16\x15\x15\x073\ +\x13!\x0336\x0032\x17\x07&#\x22\x02\x15\x14\ +\x16327\x15\x06#\x22&55#\x03!\x03+\ +\x989\xfe\xe3\xcaM:/5\x1aT\x83HHA-\ +LLf\xaf\xca\x02\xa6d\x01!d\x9d9\x01$\xca\ +GA45\x1b}\xa1HA-LIi\xb1\xc8\xac\ +`\xfe\xdf\x01\xc3\xdf\xf8\x0c\xef\x08\x80\xde\x81`a\x1b\ +\xf4\x1b\xe4\xcc\x1b\x1b\x01\xd1\xfe/\xe3\x01\x03\x0d\xef\x08\ +\xfe\xf0\xcf`a\x1b\xf4\x1a\xdf\xcb-\xfe=\x00\x01\x00\ +\x19\xff\xec\x03\xfc\x04s\x00$\x00-@\x17\x12#$\ +$#JY$$\x18\x0c\x0c\x06FY\x0c\x10\x18\x1e\ +FY\x18\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x012654&#\x22\ +\x06\x07'632\x16\x15\x14\x06\x07\x15\x16\x15\x14\x04\ +!\x22&'5\x163 54##7\x01\xcf\x8c\ +tDVE\xa9MH\xe0\xd8\xc1\xd1~\x86\xbe\xfe\xe1\ +\xfe\xf6e\xcaE\xb0\xba\x01\x02\xb0\xb0-\x02\xb0;D\ +.4-\x22\xdbV\x8e\x87h\x8a$\x068\xaa\xb4\xc0\ +(#\xf8X\x91u\xd3\xff\xff\x00o\xff\xec\x04\xb2\x04\ +^\x02\x06\x00X\x00\x00\xff\xff\x00o\xff\xec\x04\xf1\x06\ +?\x02&\x00X\x00\x00\x01\x06\x026\x08\x00\x00\x08\xb3\ +\x01\x1b\x11&\x00+5\x00\x01\x00%\x00\x00\x04\xe3\x04\ +^\x00\x0a\x00\x19@\x0b\x05\x0a\x02\x02\x07\x00\x08\x0f\x04\ +\x07\x15\x00?3?3\x129\x113310\x01!\ +\x01\x01!\x01\x03!\x13!\x03\x03\x8b\x01X\xfe!\x01\ +\x15\xfe\xae\xff\x00u\xfe\xd3\xef\x01.o\x04^\xfd\xcf\ +\xfd\xd3\x02!\xfd\xdf\x04^\xfd\xf8\x00\x00\x01\xff\xc5\xff\ +\xec\x04\xbe\x04s\x00\x1d\x00\x1c@\x0e\x01\x15\x1a\x04G\ +Y\x1a\x10\x0d\x12HY\x0d\x16\x00?+\x00\x18?+\ +\x00\x18?10!!\x13&#\x22\x06\x06\x07\x0e\x03\ +#\x22'5\x163267\x12>\x0232\x16\x17\ +\x03\xdb\xfe\xd3\xbc(\x17CZJH#C[\x81`\ +Y<%/2O&fp\x85\xc0\x89W\xbeE\x03\ +u\x08?\x8b\xd6g\xb5\x87N\x18\xf8\x10io\x01/\ +\xd2u9\x1f\x1b\x00\x01\x00\x17\x00\x00\x063\x04^\x00\ +\x17\x00\x19@\x0c\x08\x00\x10\x03\x0a\x14\x0b\x0f\x17\x05\x0a\ +\x15\x00?33?3\x12\x17910\x01\x06\x06\x07\ +\x01#\x03&'\x03!\x13!\x13\x16\x16\x17667\ +\x01!\x03!\x04\xcf\x1cR*\xfe\xec\xe8?\x18\x07\xaa\ +\xfe\xe4\xef\x01\x96;\x0b\x09\x05\x1aB-\x01\x0e\x01\xac\ +\xeb\xfe\xdb\x03'>\x94O\xfd\xfa\x01\xf8\xcbh\xfc\xd5\ +\x04^\xfe#T\x90G<\x98O\x01\xe5\xfb\xa2\x00\x00\ +\x01\x00%\x00\x00\x04\xcb\x04^\x00\x0b\x00\x1a@\x0d\x01\ +\x08FY\x01\x01\x0a\x03\x0b\x0f\x06\x0a\x15\x00?3?\ +3\x129/+10\x01\x03!\x13!\x03!\x13!\ +\x03!\x13\x02D]\x01]Z\x01-\xee\xfe\xd3`\xfe\ +\xa6b\xfe\xd1\xef\x04^\xfeR\x01\xae\xfb\xa2\x01\xcd\xfe\ +3\x04^\xff\xff\x00Z\xff\xec\x04T\x04s\x02\x06\x00\ +R\x00\x00\xff\xff\x00%\x00\x00\x04m\x04s\x02\x06\x00\ +Q\x00\x00\xff\xff\xff\xbc\xfe\x14\x04h\x04s\x02\x06\x00\ +S\x00\x00\xff\xff\x00Z\xff\xec\x03\xf2\x04s\x02\x06\x00\ +F\x00\x00\xff\xff\x00%\x00\x00\x06\xd5\x04s\x02\x06\x00\ +P\x00\x00\xff\xff\xffs\xfe\x14\x04\x91\x04^\x02\x06\x00\ +\x5c\x00\x00\x00\x03\x00Z\xfe\x14\x05\xc1\x06\x14\x00\x13\x00\ +\x1b\x00#\x00-@\x17\x12\x00\x09\x1b#\x18\x11\x18F\ +Y\x00\x11\x0f\x17\x0a\x1c\x07\x07\x1cGY\x07\x16\x00?\ ++\x11\x12\x0099\x18?3+\x11\x003\x18??\ +10\x01\x16\x16\x15\x14\x02\x04\x07\x03!\x13&&5\ +4\x12$7\x13!\x01\x14\x16\x17\x13\x0e\x02\x01>\x02\ +54&'\x04\x19\xcc\xdc\xa2\xfe\xd7\xd1`\xfe\xddh\ +\xca\xe6\xa9\x01+\xccZ\x01\x1f\xfd\x1aVV\x90]\x8d\ +R\x01\xcb]\x89Q[O\x04d\x1e\xf6\xbf\xc1\xfe\xd9\ +\xa6\x15\xfe&\x01\xe4\x17\xf9\xbd\xbf\x01/\xa6\x0d\x01\xae\ +\xfb\xc9g\x88\x0d\x02\x9c\x06j\xc3\xfe\x97\x0dj\xc1r\ +`\x7f\x0f\xff\xff\xff\x9c\x00\x00\x04\xa4\x04^\x02\x06\x00\ +[\x00\x00\x00\x01\x00j\xfeo\x04\xb2\x04^\x00\x1f\x00\ +%@\x13\x17\x19\x09\x1f\x0f\x13\x22\x14\x0fFY\x14\x15\ +\x19\x05GY\x19\x16\x00?+\x00\x18?+\x00\x18?\ +?3\x12910\x01\x03\x06\x15\x143267\x13\ +!\x03\x06\x15\x14327\x03!\x13&'#\x06#\ +\x22&547\x13\x023\x89\x10l\x5c\x96+b\x01\ +-\xa2\x06>'3\x89\xfe\xe9`a \x02\x8e\xc6\x89\ +\x98\x1d\x7f\x04^\xfdsD3{\xe4\xcc\x01\xcf\xfd\x04\ +\x1e\x17A\x0e\xfdu\x01\x91-\x87\xc8\xa5\x9cD\x91\x02\ +\x5c\x00\x01\x00\xa4\x00\x00\x04\xa0\x04^\x00\x18\x00\x1f@\ +\x0f\x11\x00\x13\x07\x13GY\x07\x07\x0e\x0b\x00\x0f\x0e\x15\ +\x00??2\x119/+\x11\x12\x00910\x13!\ +\x03\x06\x15\x14\x1632677!\x03!\x137#\ +\x06#\x22&547\xf4\x01->\x10>9b\x7f\ +-\x1b\x01-\xee\xfe\xd3@+\x07\x80\xa4\x87\x9a\x1d\x04\ +^\xfe\xddD2?@\xc5\xd4\x7f\xfb\xa2\x01/\xb4\x8d\ +\xac\x96O\x86\x00\x00\x01\x00j\xff\xec\x07\x1b\x04^\x00\ +%\x00%@\x12\x0e\x13\x15%\x09\x1b\x0f\x0c\x15\x05!\ +\x15!GY\x10\x15\x16\x00?3+\x11\x003\x18?\ +?33\x129910\x01\x03\x06\x15\x14326\ +7\x13!\x03#7#\x06#\x22'#\x06#\x22&\ +547\x13!\x03\x06\x15\x143267\x13\x04\xa6\ +\x89\x11c]\x94+c\x01-\xee\xe5\x14\x06\x91\xd1\xdb\ ++\x07\x91\xd5\x85\x92\x17\x85\x01-\x89\x10b\x5c\x92/\ +`\x04^\xfdsF1{\xe6\xca\x01\xcf\xfb\xa2\xcf\xe3\ +\xe3\xe3\xa6\x9bIk\x02}\xfdsD3{\xdd\xd1\x01\ +\xd1\x00\x01\x00j\xfeo\x07\x1b\x04^\x00.\x00/@\ +\x18\x1c\x17\x1e.\x09$\x0f\x13\x22\x14\x0fFY\x14\x15\ +\x05*\x1e*GY\x19\x1e\x16\x00?3+\x11\x003\ +\x18?+\x00\x18??33\x129910\x01\x03\ +\x06\x15\x143267\x13!\x03\x06\x15\x14327\ +\x03!\x13&'#\x06#\x22'#\x06#\x22&5\ +47\x13!\x03\x06\x15\x143267\x13\x04\xa6\x89\ +\x11c]\x94+c\x01-\xa2\x06=)1\x89\xfe\xe9\ +ag\x1a\x02\x91\xc3\xdb+\x07\x91\xd5\x85\x92\x17\x85\x01\ +-\x89\x10b\x5c\x92/`\x04^\xfdsF1{\xe6\ +\xca\x01\xcf\xfd\x04\x1e\x17A\x0e\xfdu\x01\x91/\x89\xcc\ +\xe3\xe3\xa6\x9bIk\x02}\xfdsD3{\xdd\xd1\x01\ +\xd1\x00\x02\x00\x5c\xff\xec\x04\xf2\x04^\x00\x12\x00\x1f\x00\ +&@\x14\x03\x1bJY\x03\x03\x0a\x12\x12\x11FY\x12\ +\x0f\x0a\x16JY\x0a\x16\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10\x01\x03632\x16\x15\x14\x06\ +\x06#\x22&547\x13!7\x01\x14\x16326\ +54#\x22\x07\x06\x06\x03\x19cX\x81\xa6\xbd}\xef\ +\xab\xc3\xcc\x18X\xfe\xa01\x01\xeaLCVg\x96F\ +Z\x07\x0f\x04^\xfe:\x16\xa5\x8ax\xb6e\xa6\xa1F\ +n\x01\x92\xe5\xfc\xdf=BYI{\x12 N\x00\x00\ +\x03\x00j\xff\xec\x06J\x04^\x00\x0f\x00\x1c\x00 \x00\ +\x22@\x12\x03\x10JY\x03\x03\x1e\x1f\x0f\x0f\x1e\x15\x0a\ +\x18JY\x0a\x16\x00?+\x00\x18??3\x129/\ ++10\x01\x03632\x16\x15\x14\x06\x06# \x11\ +47\x13\x01\x22\x07\x06\x06\x15\x14\x1632654\ +\x01!\x13!\x025bbi\x8b\xaes\xdc\x98\xfez\ +\x17\x87\x01%9J\x0f\x05>4IY\x02\xb2\xfe\xd3\ +\xee\x01-\x04^\xfe:\x16\xa4\x85y\xb8h\x01EW\ +f\x02p\xfd}\x12C5\x18=>]Iw\xfe%\ +\x04^\x00\x00\x02\x00h\xff\xec\x04\x0e\x04^\x00\x10\x00\ +\x1c\x00\x1d@\x0f\x02\x11JY\x02\x02\x09\x0f\x0f\x09\x18\ +JY\x09\x16\x00?+\x00\x18?\x129/+10\ +\x01632\x16\x15\x14\x06\x06#\x22&547\x13\ +!\x13\x22\x07\x06\x15\x14\x1632654\x01\xd3V\ +\x83\xa6\xbc|\xef\xab\xc3\xcd\x19\x87\x01-\x15FZ\x17\ +NBVf\x02\x98\x16\xa6\x89y\xb5e\xa7\xa0As\ +\x02w\xfd}\x12g%>AZH{\x00\x00\x01\x00\ +\x1f\xff\xec\x03\x83\x04s\x00\x1d\x00&@\x14\x12\x11K\ +Y\x12\x12\x07\x00\x00\x18GY\x00\x10\x07\x0dGY\x07\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x012\x16\x15\x14\x02\x04#\x22'5\x16\x1632\ +67!7!754&#\x22\x06\x07'6\x01\ +\xe9\xc3\xd7\x91\xfe\xec\xbf\x98h4xNq\x8c!\xfe\ +\x8c+\x01d\x02WQ9]9P\xa4\x04s\xea\xd7\ +\xd5\xfe\xbe\xaf7\xfc\x19'u{\xcb\x13\x14[c \ +\x1b\xddR\x00\x02\x00%\xff\xec\x06T\x04s\x00\x14\x00\ + \x00*@\x17\x0e\x09FY\x0e\x0e\x0b\x0c\x0f\x0b\x15\ +\x12\x15GY\x12\x10\x04\x1bGY\x04\x16\x00?+\x00\ +\x18?+\x00\x18??\x129/+10\x01\x14\x02\ +\x06#\x22&55#\x03!\x13!\x0336$3\ +2\x16\x05\x22\x06\x06\x15\x14326654\x06T\ +\x87\xff\xaf\xc2\xd8\xcfb\xfe\xd1\xef\x010]\xc19\x01\ +\x14\xc7\xc2\xd6\xfeNDnD\x89@nB\x02\xb8\xd3\ +\xfe\xba\xb3\xe2\xca5\xfe3\x04^\xfeR\xd6\xed\xea\x0c\ +\x82\xe8y\xb9}\xdf{\xc5\x00\x00\x02\xff\xec\xff\xec\x04\ +\x83\x04^\x00\x1a\x00#\x00.@\x18\x11\x00!!\x00\ +KY!!\x16\x19\x15\x16\x1bJY\x16\x0f\x06\x0bH\ +Y\x06\x16\x00?+\x00\x18?+\x00\x18?\x129/\ ++\x11\x12\x00910\x01\x22\x06\x07\x06\x06#\x22'\ +5\x163267767&5463!\x03\ +!\x13\x03\x22\x06\x15\x14\x1633\x13\x02\x879R.\ +B\x9ao[<(%*5\x14\x1f@_\x9d\xff\xe4\ +\x01\xd3\xeb\xfe\xd2[\x19O]FM];\x01\xa0O\ +d\x8dt\x18\xf8\x10-\x223m\x1dA\xaa\xb2\xc9\xfb\ +\xa2\x01\xa0\x01\xe7WI7C\x01\x1a\xff\xff\x00Z\xff\ +\xec\x04B\x06\x04\x02&\x00H\x00\x00\x01\x06\x00j\xd6\ +\x00\x00\x0a\xb4\x03\x025\x11&\x00+55\x00\x01\x00\ +%\xfe\x14\x04`\x06\x14\x00*\x00H@(\x05$\x09\ +\x03&'&KY\x00''\x09)\x09\x1fGY\x00\ +\x09\x10\x09 \x09\x03\x09\x03\x09\x09$)\x00$\x15\x12\ +\x17GY\x12\x1b\x00?+\x00\x18??\x129/_\ +^]+\x11\x12\x009\x18/3+\x11\x003\x11\x12\ +910\x01!\x07!\x06\x0736632\x16\x15\ +\x14\x07\x03\x06\x06#\x22'5\x163267\x136\ +54#\x22\x06\x07\x03!\x13#737!\x02{\ +\x01++\xfe\xd7&,\x08>\x95d\x8c\x95\x16\x92)\ +\xc9\xa3hF=5=]\x12\x8e\x10j\x5c\x95,X\ +\xfe\xd3\xfc\xa0+\xa0#\x01-\x05s\xc7\xbbfN\x5c\ +\xa8\x99Of\xfdL\xc0\xb7\x19\xf2\x15QY\x02\x9cD\ +3{\xe3\xce\xfeo\x04\xac\xc7\xa1\x00\xff\xff\x00\x14\xff\ +\xec\x04\x12\x06!\x02&\x01\xcd\x00\x00\x01\x06\x00v\x02\ +\x00\x00\x08\xb3\x01/\x11&\x00+5\x00\x01\x00Z\xff\ +\xec\x03\xf2\x04s\x00\x1c\x00&@\x14\x10\x13KY\x10\ +\x10\x00\x07\x07\x0dGY\x07\x10\x00\x17GY\x00\x16\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+10\x05\ +\x22&54\x12$32\x17\x07&&#\x22\x06\x07\ +!\x07!\x07\x15\x143267\x15\x06\x01\xfa\xc8\xd8\ +\x97\x01\x0a\xaf\xb6\x92\x5c6hB[\x8b\x22\x01o+\ +\xfe\x99\x02\xaeL\x82E\x98\x14\xd8\xc5\xdc\x01Z\xb4H\ +\xe5\x17\x22sr\xcb\x18\x17\xc1/#\xf6O\xff\xff\x00\ +\x17\xff\xec\x03\xa0\x04s\x02\x06\x00V\x00\x00\xff\xff\x00\ +%\x00\x00\x02\x8d\x06\x14\x02\x06\x00L\x00\x00\xff\xff\x00\ +%\x00\x00\x037\x06\x04\x02&\x00\xf3\x00\x00\x01\x07\x00\ +j\xfe\xf1\x00\x00\x00\x0a\xb4\x02\x01\x17\x11&\x00+5\ +5\xff\xff\xfe\xf8\xfe\x14\x02\x8f\x06\x14\x02\x06\x00M\x00\ +\x00\x00\x02\xff\xc5\xff\xec\x06{\x04s\x00(\x005\x00\ +:@!\x02)JY\x0f\x02\x1f\x02\x02\x10\x03\x02\x02\ +\x09&&\x10GY&\x10\x18\x1eHY\x18\x16\x091\ +JY\x09\x16\x00?+\x00\x18?+\x00\x18?+\x11\ +\x12\x009\x18/_^]+10\x01632\x16\ +\x15\x14\x06\x06#\x22&547\x13'\x22\x06\x06\x07\ +\x0e\x02#\x22&'5\x1632677>\x023\ +2\x17\x13\x22\x07\x06\x06\x15\x14\x1632654\x04\ +?ln\xa5\xbd|\xef\xac\xc3\xcc\x19Z-CYG\ +DHg\x8ce3;!%/3M#+Q\x8e\ +\xcc\x9d\xce\x9d\x1cEZ\x14\x03LCVg\x02\x98\x16\ +\xa5\x8ay\xb5e\xa6\xa1Ik\x01\x92\x04@\x87\xd9\xe8\ +\xae[\x0c\x0c\xf8\x10gp\x87\xfb\xd2\x5c:\xfd\xa2\x12\ +[#\x0e=BYI{\x00\x00\x02\x001\xff\xec\x06\ +{\x04^\x00\x17\x00$\x00-@\x18\x02\x18JY\x02\ +\x14\x14\x0fFY\x14\x14\x11\x16\x12\x0f\x11\x15\x09 J\ +Y\x09\x16\x00?+\x00\x18??3\x129/+\x00\ +\x18\x10\xc4+10\x01632\x16\x15\x14\x06\x06#\ +\x22&547!\x03!\x13!\x03!\x13!\x13\x22\ +\x07\x06\x06\x15\x14\x1632654\x04?tf\xa5\ +\xbd|\xef\xac\xc3\xcc\x14\xfe\xdac\xfe\xd1\xf0\x01/\x5c\ +\x01'Z\x01-\x14EZ\x14\x03LCVg\x02\x98\ +\x16\xa5\x8ay\xb5e\xa6\xa1=]\xfe3\x04^\xfeR\ +\x01\xae\xfd}\x12[#\x0e=BYI{\xff\xff\x00\ +%\x00\x00\x04`\x06\x14\x02\x06\x00\xe9\x00\x00\xff\xff\x00\ +%\x00\x00\x04\xe3\x06!\x02&\x01\xd4\x00\x00\x01\x07\x00\ +v\x00\x8d\x00\x00\x00\x08\xb3\x01\x13\x11&\x00+5\xff\ +\xff\xffs\xfe\x14\x04\x91\x06?\x02&\x00\x5c\x00\x00\x01\ +\x06\x026\x9b\x00\x00\x08\xb3\x01\x1b\x11&\x00+5\x00\ +\x02\x00j\xfe\x14\x04\xb2\x04^\x00\x04\x00\x1b\x00$@\ +\x12\x13\x1b\x00\x03\x15\x0e\x1b\x0f\x03\x1b\x15\x0aGY\x15\ +\x16\x11\x15\x00??+\x00\x18??3\x11\x129\x12\ +910\x053\x03!\x13\x13\x03\x06\x15\x14326\ +7\x13!\x03#7#\x06#\x22&547\x13\x02\ +T1`\xfe\xe7L\xdb\x89\x10l\x5c\x96+b\x01-\ +\xed\xe6\x15\x06\x91\xd2\x89\x98\x1d\x7f)\xfe=\x01Y\x04\ +\xf1\xfdsD3{\xe4\xcc\x01\xcf\xfb\xa2\xcf\xe3\xa5\x9c\ +D\x91\x02\x5c\x00\x00\x01\x005\x00\x00\x04\xd7\x06\xec\x00\ +\x07\x00\x16@\x0a\x01\x07\x06\x12\x07\x04LY\x07\x03\x00\ +?+\x00\x18?\x10\xc610\x01\x13!\x03!\x01!\ +\x01\x03\x85B\x01\x10u\xfe\x00\xff\x00\xfe\xd3\x015\x05\ +\xb6\x016\xfd\xcc\xfbH\x05\xb6\x00\x01\x00%\x00\x00\x04\ +5\x05\x8f\x00\x07\x00\x16@\x0a\x06\x04\x03\x15\x04\x01G\ +Y\x04\x0f\x00?+\x00\x18?\x10\xc610\x01!\x03\ +!\x13!\x13!\x03\xc1\xfeI\xb8\xfe\xd3\xed\x01\xcd@\ +\x01\x16\x03f\xfc\x9a\x04^\x011\x00\xff\xff\x00\xb8\x00\ +\x00\x07\xe7\x07s\x02&\x00:\x00\x00\x01\x07\x00C\x01\ +%\x01R\x00\x08\xb3\x01 \x05&\x00+5\xff\xff\x00\ +}\x00\x00\x06\xb6\x06!\x02&\x00Z\x00\x00\x01\x06\x00\ +Cs\x00\x00\x08\xb3\x01 \x11&\x00+5\xff\xff\x00\ +\xb8\x00\x00\x07\xe7\x07s\x02&\x00:\x00\x00\x01\x07\x00\ +v\x01\xd7\x01R\x00\x08\xb3\x01'\x05&\x00+5\xff\ +\xff\x00}\x00\x00\x06\xb6\x06!\x02&\x00Z\x00\x00\x01\ +\x07\x00v\x01;\x00\x00\x00\x08\xb3\x01'\x11&\x00+\ +5\xff\xff\x00\xb8\x00\x00\x07\xe7\x07V\x02&\x00:\x00\ +\x00\x01\x07\x00j\x01}\x01R\x00\x0a\xb4\x02\x012\x05\ +&\x00+55\xff\xff\x00}\x00\x00\x06\xb6\x06\x04\x02\ +&\x00Z\x00\x00\x01\x07\x00j\x00\xbc\x00\x00\x00\x0a\xb4\ +\x02\x012\x11&\x00+55\xff\xff\x00\xba\x00\x00\x05\ +?\x07s\x02&\x00<\x00\x00\x01\x07\x00C\xff\xbb\x01\ +R\x00\x08\xb3\x01\x0a\x05&\x00+5\xff\xff\xffs\xfe\ +\x14\x04\x91\x06!\x02&\x00\x5c\x00\x00\x01\x07\x00C\xff\ +M\x00\x00\x00\x08\xb3\x01\x18\x11&\x00+5\x00\x01\x00\ +)\x01\xb4\x03\xae\x02\x9a\x00\x03\x00\x08\xb1\x00\x01\x00/\ +310\x137!\x07)1\x03T1\x01\xb4\xe6\xe6\ +\x00\x00\x01\x00)\x01\xb4\x07\x85\x02\x9a\x00\x03\x00\x08\xb1\ +\x00\x01\x00/310\x137!\x07)1\x07+1\ +\x01\xb4\xe6\xe6\x00\xff\xff\x00)\x01\xb4\x07\x85\x02\x9a\x02\ +\x06\x02\x03\x00\x00\xff\xff\xff,\xfe2\x02\xb7\xff\xd3\x00\ +'\x00B\x00\x1d\x00\x8b\x01\x07\x00B\xff\xe6\xffv\x00\ +0\xb2\x01\x00\x02\xb8\xff\xc0\xb345H\x02\xb8\xff\xc0\ +\xb3./H\x02\xb8\xff\xc0@\x0c%)H\xd0\x02\x01\ +\x02\x01\xc0\x06\x01\x06\x00\x11]5\x11]+++5\ +5\x00\x01\x00s\x03\xc1\x02Z\x05\xb6\x00\x06\x00\x0b\xb3\ +\x00\x80\x03\x03\x00?\x1a\xcd10\x13'673\x06\ +\x03{\x08g\x9f\xe1[g\x03\xc1\x16\xe3\xfc\xd5\xfe\xe0\ +\x00\x00\x01\x00j\x03\xc1\x02R\x05\xb6\x00\x06\x00\x0b\xb3\ +\x04\x80\x06\x03\x00?\x1a\xce10\x01\x17\x06\x07#6\ +\x13\x02J\x08g\x9f\xe2Yj\x05\xb6\x16\xe3\xfc\xce\x01\ +'\x00\x01\xff\x9a\xfe\xf8\x01\x81\x00\xee\x00\x06\x00\x0a\xb2\ +\x04\x80\x00\x00/\x1a\xcd10%\x17\x06\x07#6\x13\ +\x01y\x08g\x9f\xe1Xj\xee\x17\xe3\xfc\xcf\x01'\x00\ +\x01\x00\xdf\x03\xc1\x01\xfe\x05\xb6\x00\x08\x00\x0b\xb3\x05\x80\ +\x08\x03\x00?\x1a\xcd10\x01\x06\x15\x14\x17#\x02'\ +7\x01\xf8\x04\x0a\xd1C\x0b\x0d\x05\xb6hh\x97\x8e\x01\ +\x0d\xd2\x16\x00\x02\x00s\x03\xc1\x04\x19\x05\xb6\x00\x06\x00\ +\x0d\x00\x0f\xb5\x00\x07\x80\x03\x0a\x03\x00?3\x1a\xcd2\ +10\x01'673\x06\x03!'673\x06\x03\ +\x029\x08g\x9f\xe2ab\xfd%\x08g\x9f\xe1[g\ +\x03\xc1\x16\xe3\xfc\xe3\xfe\xee\x16\xe3\xfc\xd5\xfe\xe0\x00\x00\ +\x02\x00j\x03\xc1\x04\x10\x05\xb6\x00\x06\x00\x0e\x00\x0f\xb5\ +\x0b\x04\x80\x0e\x06\x03\x00?3\x1a\xce210\x01\x17\ +\x06\x07#6\x13!\x17\x06\x07#66\x13\x02J\x08\ +g\x9f\xe2Yj\x02\xdb\x08g\x9f\xe1\x17/}\x05\xb6\ +\x16\xe3\xfc\xce\x01'\x16\xe3\xfc5t\x01L\x00\x02\xff\ +\x9a\xfe\xf8\x03B\x00\xee\x00\x06\x00\x0e\x00\x0e\xb4\x0b\x04\ +\x80\x0e\x00\x00/2\x1a\xcd210%\x17\x06\x07#\ +6\x13!\x17\x06\x03#66\x13\x01y\x08g\x9f\xe1\ +Xj\x02\xdd\x09d\xa3\xe1\x182y\xee\x17\xe3\xfc\xcf\ +\x01'\x17\xdd\xfe\xfe9{\x01B\x00\x00\x01\x00\xbe\x00\ +\x00\x04\x0c\x06\x14\x00\x0b\x00'@\x12\x0a\x07\x01\x04\x07\ +\x04\x06\x00\x05\x05\x0b\x06\x06\x03\x08\x00\x03\x12\x00??\ +\x129/33\x113\x1299\x113\x11310\ +\x01%\x03!\x01\x057\x05\x13!\x03%\x03\xd9\xfe\xc9\ +\x98\xfe\xe6\x01\x00\xfe\xce4\x01'\x22\x01\x1b\x8d\x01C\ +\x03\xa0\x1e\xfcB\x03\xbc\x1c\xf1\x1c\x01\x9f\xfea\x1c\x00\ +\x01\x00;\x00\x00\x04!\x06\x14\x00\x15\x00E@!\x00\ +\x09\x03\x06\x09\x06\x08\x02\x07\x07\x01\x08\x11\x0e\x14\x0b\x0e\ +\x0b\x0d\x13\x0c\x0c\x12\x0d\x08\x0d\x08\x0d\x05\x0f\x00\x05\x12\ +\x00??\x1299//\x1133\x113\x1299\ +\x113\x113\x1133\x113\x1299\x113\x113\ +10\x01%\x07%\x03!\x13\x057\x0577\x057\ +\x05\x13!\x03%\x07%\x15\x02X\x01D4\xfe\xc9\x1a\ +\xfe\xe3\x85\xfe\xbc4\x017\x04Z\xfe\xbd3\x017\x1b\ +\x01\x1c\x85\x01D3\xfe\xc8\x02/\x1d\xf2\x1d\xfe\x89\x01\ +w\x1d\xf2\x1d\xe3\xd3\x1c\xf1\x1c\x01v\xfe\x8a\x1c\xf1\x1c\ +\xd3\x00\x01\x00h\x01\xae\x02\xb6\x04)\x00\x0c\x00\x11@\ +\x09\x0a?\x04\x7f\x04\x9f\x04\x03\x04\x00/]\xcd10\ +\x1346632\x16\x15\x14\x06#\x22&hU\x9b\ +ix}\xb7\x9du\x85\x02\xaej\xb0a\x86|\xb1\xc8\ +\x86\xff\xff\x00\x19\xff\xe5\x05\xdd\x019\x00&\x00\x11\x00\ +\x00\x00'\x00\x11\x021\x00\x00\x00\x07\x00\x11\x04b\x00\ +\x00\x00\x07\x00s\xff\xee\x09u\x05\xcb\x00\x09\x00\x17\x00\ +\x1b\x00&\x004\x00@\x00N\x009@\x1e\x1c55\ +20L\x01LL\x1b\x05?\x0e\x01\x0e\x0e\x1a\x1b\x06\ +\x1a\x18\x00\x15\x07\x22;;+E\x19\x00?33\x11\ +3?3??\x129/]3\x119/]33\ +\x11310\x01\x22\x02\x15\x1432\x1254\x17\x14\ +\x02\x06#\x22&54\x12632\x16%\x01#\x01\ +\x01\x22\x06\x06\x15\x1432\x1254\x17\x14\x02\x06#\ +\x22&54\x12632\x16\x05\x22\x06\x06\x15\x143\ +26654\x17\x14\x02\x06#\x22&54\x126\ +32\x16\x02\x06?_8A^\xf6p\xbez\x8b\x8f\ +o\xba{\x89\x95\x02\xdd\xfb\xc5\xf0\x04@\x03\x1f'I\ +.7B^\xf6o\xbbx\x90\x91j\xbe|\x89\x96\xfb\ +\xeb'H.7)H/\xf5l\xbcy\x90\x91j\xbe\ +|\x89\x95\x04\xfa\xfe\xff\x95`\x01\x06\x90`m\xa6\xfe\ +\xe0\x92\xa7\x99\xa9\x01\x1d\x90\xa0\x8b\xfaJ\x05\xb6\xfc\xfc\ +p\xc8]a\x01\x06\x90`d\xa7\xfe\xda\x93\x9d\x90\xb2\ +\x01!\x95\x9d4p\xc4aan\xc7a`d\xa7\xfe\ +\xdb\x94\x9d\x90\xb1\x01#\x94\x9d\xff\xff\x00\xc9\x03\xa6\x02\ +%\x05\xb6\x02\x06\x00\x0a\x00\x00\xff\xff\x00\xc9\x03\xa6\x03\ +\xba\x05\xb6\x02\x06\x00\x05\x00\x00\x00\x01\x00H\x00Z\x02\ +\x98\x04\x08\x00\x06\x00\x19@\x0c\x040\x05\x01\x05\x05\x07\ +\x02 \x01\x01\x01\x00/]3\x129/]310\ +\x13\x01\x17\x01\x13\x07\x03H\x01\x91\xbf\xfe\xe9\x87\xf6\xca\ +\x029\x01\xcf\x9b\xfe\xb2\xfe\xa2g\x01\xcd\x00\x00\x01\x00\ +\x00\x00H\x02P\x03\xf6\x00\x06\x00-@\x1b\x06\x00\x03\ +\x03\x04\x02\x02\x01\x01\x07\x04\x0f\x05O\x05o\x05\x8f\x05\ +\xaf\x05\xcf\x05\xef\x05\x07\x05\x00/]3\x129/3\ +\x11\x129\x113310\x01\x01'\x01\x037\x13\x02\ +P\xfen\xbe\x01\x17\x88\xf6\xcb\x02\x17\xfe1\x9b\x01N\ +\x01^g\xfe3\xff\xff\x00\x19\xff\xe5\x04\xba\x05\xb6\x00\ +&\x00\x04\x00\x00\x00\x07\x00\x04\x023\x00\x00\x00\x01\xfd\ +\xec\x00\x00\x03\x17\x05\xb6\x00\x03\x00\x0a\xb3\x03\x03\x02\x12\ +\x00??10\x01\x01#\x01\x03\x17\xfb\xc4\xef\x04?\ +\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\x00\x85\x02\xfc\x03X\x05\ +\xc7\x00\x15\x00\x1c@\x0f\x0d\x00 \x0a\x01\x10\x0a\xf0\x0a\ +\x02\x0a\x0b\x05\x0f\x1f\x00?3\xc4\xc4]q291\ +0\x01\x13654#\x22\x06\x07\x03#\x133\x076\ +32\x16\x15\x14\x07\x03\x02'T\x08A<\x5c\x1b=\ +\xcd\x94\xaa\x11d}ad\x08X\x02\xfc\x01\x91 \x22\ +J\x8b|\xfe\xea\x02\xbay\x8ao^-#\xfeR\x00\ +\x01\x00\x00\x00\x00\x04\xba\x05\xb6\x00\x11\x00;@\x1f\x03\ +\x07\x08\x07RY\x00\x00\x08\x01\x0d\x03\x08\x08\x05\x0e\x0e\ +\x11NY\x0e\x0e\x0a\x05\x18\x0a\x0dNY\x0a\x06\x00?\ ++\x00\x18?\x129/+\x11\x12\x009\x18/_^\ +]3+\x11\x00310\x01!\x07!\x03!\x13#\ +73\x13!\x07!\x03!\x07!\x01\xdf\x01\x08$\xfe\ +\xf75\xfe\xd37\x8f%\x8f\xd9\x03-5\xfe\x00H\x01\ +\xde8\xfe#\x01\xb8\xb2\xfe\xfa\x01\x06\xb2\x03\xfe\xfe\xfe\ +\xb0\xfe\x00\x00\x01\xff\xf4\x00\x00\x04\xd9\x05\xcd\x00#\x00\ +V@0\x10\x22#\x22RY\x0d\x0f#\x1f#/#\ +\x9f#\x04\x09\x03##\x1f\x04\x14\x1e\x1f\x1eRY\x11\ +\x1f\x1f\x19\x04\x04\x09OY\x04\x07\x1a\x16\x19\x19\x16N\ +Y\x19\x18\x00?+\x11\x12\x009\x18?+\x11\x12\x00\ +9\x18/3+\x11\x003\x11\x129\x18/_^]\ +3+\x11\x00310\x0176632\x17\x07&\ +#\x22\x06\x07\x07!\x07!\x07!\x07!\x06\x07!\x03\ +!7667#737#7\x01s\x1a)\xf3\ +\xbf\xc3\xaeq\x8d`Hc\x14\x18\x01+'\xfe\xd7\x19\ +\x01)%\xfe\xd5+\x99\x02\x917\xfc\x1f1em\x19\ +\xc0%\xc0\x19\xc1'\x03\xb6\x83\xc6\xceV\xe8DM_\ +q\xb0s\xb2\x98E\xfe\xfc\xf6!n\x5c\xb2s\xb0\x00\ +\x03\x009\xff\xec\x06\xc1\x05\xb6\x00\x08\x00\x13\x00.\x00\ +F@$%&@#& )&)QY&&\ +\x0f\x10\x0d\x00NY\x0d\x0d\x10\x0f\x18\x10\x08NY\x10\ +\x06\x1a\x14QY\x1a\x19\x00?+\x00\x18?+\x00\x18\ +?\x129/+\x11\x12\x009\x18/+\x11\x003\x11\ +3\x1a\x18\x10\xcd10\x0132654&##\ +\x05\x14\x00!#\x03!\x01!2\x16\x01267\x15\ +\x06#\x22&547\x13#?\x023\x073\x07#\ +\x03\x06\x15\x14\x16\x01\xfc3\x8d\x9e`^D\x02+\xfe\ +\xb7\xfe\xdfRo\xfe\xe1\x018\x01=\xe0\xf5\x01+&\ +@+h{\x82\x92\x12>o\x16\x9c{\xac3\xf2.\ +\xf1B\x06.\x03\x06\x93\x84KP\x95\xfe\xfe\xe3\xfd\xf8\ +\x05\xb6\xd4\xfb\xe9\x16\x13\xd35\x7ft/V\x01\x19j\ +s\xe1\xed\xd1\xfe\xcd\x1a\x19$(\x00\x00\x01\x00)\xff\ +\xec\x04\xdd\x05\xcd\x00&\x00J@(\x06\x1b\x1c\x1bR\ +Y\x03\x0f\x1c\x1f\x1c\x02\x09\x03\x1c\x17@\x0b\x16\x17\x16\ +RY\x08\x17\x17\x13 \x00OY \x07\x13\x0eN\ +Y\x13\x19\x00?+\x00\x18?+\x11\x12\x009\x18/\ +3+\x11\x003\x1a\x18\x10\xcc_^]2+\x11\x00\ +310\x01\x22\x06\x07!\x07!\x06\x07!\x07!\x14\ +\x16327\x11\x06# \x11#7367#7\ +36\x0032\x16\x17\x07&&\x03\x83a\x9e8\x01\ +\x5c'\xfe\x98\x0b\x0e\x01+%\xfe\xe8Yg\x85\x96~\ +\xcc\xfeB\x98%\x7f\x09\x0d}'\x87W\x01G\xd3d\ +\x9eV}WX\x04\xd5\x95\x8a\xb0\x22Q\xb2x{?\ +\xfe\xfe?\x01\xf5\xb2C0\xb0\xfc\x01\x1b.9\xdf1\ +\x1d\x00\x04\x00{\xff\xec\x05\xbc\x05\xc7\x00\x17\x00\x1b\x00\ +'\x003\x00%@\x12\x12\x00\x00\x1b(%%\x1a\x1b\ +\x06\x1a\x18\x0b\x06\x07/\x1f\x19\x00?3?3??\ +\x129/3\x119/310\x01\x22&54\x12\ +32\x17\x07&#\x22\x06\x06\x15\x14\x163267\ +\x15\x06\x01\x01#\x01\x01\x14\x06#\x22&5463\ +2\x16\x05\x22\x06\x06\x15\x14\x1632654\x01\xaa\ +\x80\x90\xca\xa8mb7U;2M+63!=\ +@`\x03\x95\xfb\xc4\xef\x04?\x01\x02\xca\xae}\x92\xcc\ +\xad\x7f\x8f\xfe\xe2+E(*&?T\x02\xf0\x93}\ +\xc7\x01\x00)\x9e#P\x82A@\ +#\x1b$))&\x18\x1e\x06\x80\x03\x0c\x12\x12\x0f\x00\ +\x0f\x06\x01\x0f\x06\x1f\x06\xaf\x06\xcf\x06\xef\x06\x05\x06@\ +\x0c\x0fH\x06\x00/+]q333}/33\ +\x1a\x18\x10\xcc222}/3310\x01\x22\x06\ +\x075632\x16\x17\x16\x163267\x15\x06#\ +\x22&'&&\x03\x22\x06\x075632\x16\x17\x16\ +\x16327\x15\x06#\x22&'&&\x01V3z\ +\xef\xfe\x11\x90\xfe\ +J\x00\x02\x00q\x00\x00\x04h\x05\xc1\x00\x05\x00\x09\x00\ +\x1d@\x0e\x00\x06\x06\x03\x08\x07\x08\x09\x03\x02\x05\x07\x02\ +\x18\x00??\x12\x179\x1133\x11310\x01\x01\ +#\x01\x013\x13\x03\x03\x13\x04h\xfe>s\xfe>\x01\ +\xc2s\xba\xf3\xf4\xf4\x02\xdf\xfd!\x02\xdf\x02\xe2\xfd\x1e\ +\x01\x9a\xfef\xfeg\x00\xff\xff\xff%\xfe\x14\x05t\x06\ +\x1f\x00&\x00I\x00\x00\x00\x07\x00L\x02\xe7\x00\x00\xff\ +\xff\xff%\xfe\x14\x05\x83\x06\x1f\x00&\x00I\x00\x00\x00\ +\x07\x00O\x02\xe7\x00\x00\x00\x01\x01=\x04\xd9\x04\xe9\x06\ +?\x00\x11\x00\x0c\xb3\x09\x00\x0e\x04\x00/3\xcd21\ +0\x01\x0e\x02#\x22&547!\x07\x15\x1432\ +67\x04\xe9\x22\x80\xd4\x98\xc8\xd6\x05\x01\x0a\x02\xaac\ +k\x17\x06?\x85\x95L\x99\x9e\x18\x17\x1a\x15\x8bXb\ +\x00\x00\x01\xfe\xfa\xfe\x14\x02D\x04^\x00\x0c\x00\x11\xb7\ +\x09\x0f\x00\x05GY\x00\x1b\x00?+\x00\x18?10\ +\x03\x22'5\x163267\x13!\x01\x02XhF\ +=6=\x5c\x13\xfe\x01-\xfe\xf7M\xfe\x14\x19\xf2\x15\ +PZ\x04\xaa\xfb)\xfe\x8d\x00\x00\x01\x01\xee\x04\xcd\x03\ +\x85\x06\x14\x00\x08\x00\x0b\xb3\x08\x80\x03\x00\x00?\x1a\xcd\ +10\x0167!\x15\x06\x06\x07#\x01\xeeS)\x01\ +\x1b\x1e\x85@\xb4\x04\xe7\xb2{\x149\xb5E\x00\x01\x00\ +{\xfe;\x02\x12\xff\x83\x00\x09\x00\x0a\xb2\x09\x80\x04\x00\ +/\x1a\xcd10\x13667!\x15\x06\x06\x07#{\ +\x19Q\x13\x01\x1a!}E\xb4\xfeV3\xc19\x14>\ +\xa9M\x00\x00\x01\x01\xd5\x04\xd9\x03m\x06!\x00\x09\x00\ +\x0a\xb2\x09\x80\x04\x00/\x1a\xcd10\x01\x06\x06\x07!\ +56673\x03m\x14W\x12\xfe\xe5\x1f\x81C\xb5\ +\x06\x06(\xca;\x15;\xaeJ\x00\x02\x00b\x025\x03\ +%\x05\xcb\x00\x09\x00\x17\x00\x0e\xb5\x00\x15\x1f\x05\x0e!\ +\x00?3?310\x01\x22\x02\x15\x1432\x125\ +4\x17\x14\x02\x06#\x22&54\x12632\x16\x01\ +\xf6?_7B^\xf6i\xc1~\x82\x99i\xbb\x80\x89\ +\x96\x04\xfa\xfe\xff\x95`\x01\x06\x90`d\xb1\xfe\xe9\x99\ +\x9f\x8e\xb7\x01 \x92\x9e\x00\x02\x00/\x02J\x03-\x05\ +\xbc\x00\x0a\x00\x10\x00!@\x11\x01\x05\x05\x09\x0f\x10\x1f\ +\x10\x02\x10\x10\x07\x03 \x0d\x07\x1e\x00?3?\x129\ +/]33\x11310\x01#\x07#7!7\x01\ +!\x033!77\x06\x06\x07\x03\x08w \xee!\xfe\ +\x8b\x1f\x01\xdb\x01\x04yw\xfe\x9c:\x16\x0d<\xb5\x02\ +\xe1\x97\x97\xae\x02-\xfd\xcd\xe7J\x14L\xd1\x00\x01\x00\ +^\x029\x035\x05\xb6\x00\x1a\x00\x1d@\x0f\x11p\x00\ +\x80\x00\x02\x00\x00\x06\x18\x15\x1e\x0c\x06!\x00?3?\ +3\x129/]310\x012\x16\x15\x14\x06#\x22\ +'5\x16\x1632654#\x22\x07'\x13!\x07\ +!\x076\x01\xe9q\x8f\xda\xb3\xa1]3|9Yc\ +\x83?FLw\x02\x10)\xfe\x9e+$\x04\x7f\x85k\ +\x9b\xbb6\xb6\x1f#NFn\x14C\x01\xa2\xb8\x8b\x0c\ +\x00\x00\x02\x00Z\x029\x03#\x05\xc9\x00\x18\x00$\x00\ +!@\x13\x1f\x00\x02\x10\x02p\x02\x80\x02\x04\x02\x02\x08\ +\x15\x0f\x1f\x19\x08!\x00?3?3\x129/]3\ +10\x01632\x16\x15\x14\x06#\x22&54\x12\ +632\x16\x17\x07&#\x22\x06\x07\x132654\ +&#\x22\x06\x15\x14\x16\x01LPtiy\xc6\xa1\x9a\ +\x97\x8a\xf7\xaa$f\x14+9Wm\x96\x1fI=K\ +3*=H/\x04-X|m\x9b\xc8\xac\x98\xad\x01\ +\x11\x8e\x0e\x07\xb6\x16wp\xfe\xb8[G07MI\ +1B\x00\x00\x01\x00{\x02J\x03m\x05\xb6\x00\x06\x00\ +\x0c\xb4\x00 \x02\x03\x1e\x00?3?10\x13\x01!\ +7!\x07\x01{\x01\xcf\xfej'\x02\x92\x1f\xfe/\x02\ +J\x02\xb4\xb8\x95\xfd)\x00\x03\x00R\x025\x03'\x05\ +\xcb\x00\x17\x00\x22\x00,\x00\x18@\x0c(\x06\x12\x18\x04\ +\x0c#\x00\x1f\x1d\x0c!\x00?3?2\x11\x1791\ +0\x012\x16\x15\x14\x06\x07\x16\x16\x15\x14\x06#\x22&\ +5467&&546\x13\x06\x15\x14\x1632\ +654&\x13\x22\x06\x15\x14\x17654&\x02\x04\ +\x8b\x98dYAO\xc6\xab\x8e\xa9xm39\xb0=\ +\x7f5,4<+##1@^*\x05\xcbpa\ +Xi $bI\x83\x92\x81i^x&#W>\ +n\x8a\xfd\xed,]*2?+,8\x01\x8c2(\ +8*)K\x22&\x00\x00\x02\x00Z\x029\x03\x17\x05\ +\xc9\x00\x17\x00#\x00!@\x13\x1e\x0f\x0f\x1f\x0f\x7f\x0f\ +\x8f\x0f\x04\x0f\x0f\x04\x18\x15\x1f\x0a\x04!\x00?3?\ +3\x129/]310\x01\x14\x02\x06#\x22'5\ +\x16\x163267\x06#\x22&54632\x16\ +\x05\x22\x06\x15\x14\x1632654&\x03\x17\x86\xfb\ +\xaaY9\x1c\x5c z\x9b&Zshy\xc6\xa0\x93\ +\x9f\xfe\xca:K2*(A\ ++B\x09\x00\x00BA>=21\x0d\x08\x01,\x1c\ +\x18\x0c\x07\x0184 \x06\x04\x0495!\x01\x00/\ +3333\x113333\x113/333\x12\ +\x179\x113\x113\x113\x113\x113\x113\x113\ +\x113\x113\x113333\x113\x11\x129/3\ +33/3\x11\x129/3/3\x113\x119/\ +3\x129\x113/310\x13\x11!\x15#\x15%\ +5!\x11#5\x01\x113\x153\x15!5353\ +\x11!5!\x15!5!\x15\x015!\x15\x01#\x11\ +3\x11#\x113\x015!\x15\x01#\x113\x015!\ +\x1535!\x15\x01#\x1135#\x113\x01#\x11\ +3\x05\x14\x06#\x22&54632\x16\x05\x143\ +254#\x22%32\x16\x15\x14\x06\x07\x15\x16\x16\ +\x15\x14\x06##\x1332654&##\x15\x15\ +32654#\x01\x22'5\x16325\x113\ +\x11\x14\x06T\x01/\xc0\x05\xce\x010m\xf9\x00o\xc0\ +\x05\x0e\xc3m\xfdI\x01\x11\xfb\xe1\x01\x0e\xfe\xf2\x01\x0e\ +\x04\xb7mmmm\xfb\xc2\x01\x10\xfc0oo\x02\xc0\ +\x01\x10w\x01\x11\xfa\xa8oooo\x06\xfemm\xfb\ +\x9f\x87\x7f\x7f\x87\x87\x7f~\x88\xfes\x87\x87\x87\x87\x01\ +\xe1\xacmp.,;0m^\xcf{B.$*\ +/;J1%Z\x01^4\x1c+\x19V}i\x04\ +\xbe\x010o\xc1\xc1o\xfe\xd0\xc1\xf9\x02\x01/\xc2m\ +m\xc2\xfe\xd1mmmm\x06\xfeoo\xfa\xa8\x01\x0e\ +\x02\x02\x01\x0f\xfa;mm\x01\xa6\x01\x0e\x04Joo\ +oo\xfc/\x01\x10y\x01\x0f\xfdh\x01\x10I\x91\x9c\ +\x9c\x91\x92\x9b\x9a\x93\xc5\xc5\xc4aCS1D\x08\x04\ +\x0dD8QY\x01b\x22 \x22\x1d\xe3\x9a+%J\ +\xfe\xfa\x0af\x08V\x01\x92\xfer_c\x00\x00\x03\x00\ +T\xfe\xc1\x07\xaa\x06\x14\x00\x03\x00\x1e\x00*\x001@\ +\x16\x1c\x06\x0b\x17\x06\x17\x14\x1e\x1e((\x22\x12\x14\x14\ +\x0e\x22\x0e\x22\x0e\x02\x00\x00//99//\x113\ +\x113\x113\x113/\x1299\x113\x11310\ +\x09\x03\x0554676654&#\x22\x06\x07\ +\x17632\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\x16\ +32654&#\x22\x06\x03\xfe\x03\xac\xfcT\xfc\ +V\x03\xeb,AgI\xbb\xa5O\xbaGR\xa0Z?\ +>1HT;\x1bGFBIHCHE\x06\x14\ +\xfcV\xfcW\x03\xa9\xfb/2A1R~X\x87\x9a\ +8*\xb2P:/5K6DpJ;\xfe\xed?\ +HI>@IH\x00\xff\xff\xfe\xfa\xfe\x14\x03\x8a\x06\ +!\x02&\x027\x00\x00\x01\x07\x01L\xfe\xe8\x00\x00\x00\ +\x08\xb3\x01\x17\x11&\x00+5\xff\xff\x00j\x03\xc1\x02\ +R\x05\xb6\x02\x06\x02\x07\x00\x00\x00\x02\x00u\xff\xec\x05\ +\xb4\x06)\x00\x0a\x007\x00H@'\x03\x086)0\ +677\x0f0\x1d\x18FY\x00\x1d\x10\x1d0\x1d\x03\ +\x09\x03\x1d\x1d\x0f00\x08FY0\x01\x0f&FY\ +\x0f\x16\x00?+\x00\x18?+\x11\x12\x009\x18/_\ +^]+\x11\x12\x009\x18/3\x129\x11\x1291\ +0\x01\x14\x16\x17654&#\x22\x06\x01\x02\x02\x04\ +#\x22&547654#\x22\x075632\ +\x16\x15\x14\x07\x06\x15\x1432\x12\x13.\x02546\ +32\x12\x15\x15\x073\x07\x02\xec\x88|\x06H?B\ +A\x02\x126\xba\xfe\xf3\xb1\xb3\xce\x1f\x189+-t\ +mfo#\x1a|z\xb0;\xa3\xed|\xf0\xcc\xcc\xd6\ +\x02\x951\x04\xa0Ye\x032;y\x7f\x5c\xfe\x12\xfe\ +\xe2\xfe\xaf\x9f\x9a\x86E]M\x1e9\x19\xd7-e[\ +IvS,f\x01\x09\x01\x14\x08m\xb6r\xbb\xdb\xfe\ +\xf6\xf8%#\xe5\x00\x01\x00\xb8\x00\x00\x05H\x05\xc3\x00\ +\x12\x00\x1f@\x0f\x0d\x10\x00\x00\x0f\x11\x03\x0f\x12\x04\x09\ +MY\x04\x04\x00?+\x00\x18??\x129\x1133\ +10\x017\x12632\x17\x07&#\x22\x07\x06\x03\ +\x03!\x13\x03!\x02qC\x9d\xd1\x84SO8\x1f&\ +;@\x88\xf7u\xfe\xd1w\xec\x018\x03f{\x01\x1f\ +\xc3\x1b\xe7\x0eP\xa8\xfeN\xfd\xdb\x02/\x03\x87\x00\x00\ +\x02\x00^\xff\xec\x07\xa8\x04^\x00\x17\x00+\x001@\ +\x18\x15\x09##\x00\x09\x0c\x1b\x07\x09\x07FY\x09\x0f\ +)\x1f\x00\x1fFY\x12\x00\x16\x00?2+\x11\x003\ +\x18?+\x11\x0033\x11\x129\x18/\x11910\ +\x05\x22&54\x127!77!\x07#\x16\x15\x14\ +\x02\x06#\x22&'\x06\x06\x014'!\x02\x15\x143\ +2677!\x07\x06\x15\x1432\x12\x02)\xa6\xb6\ +YI\xfe\xef\x1d\xc4\x06i/\xf4\x11\x90\xec\x91l\x88\ +\x1eB\xa2\x02\xe8\x06\xfd\x08\x8fpES\x1e\x1f\x01\x1d\ +\x1f\x12dr\x86\x14\xd3\xbe\x80\x01\x13i\x93R\xe5X\ +o\xc6\xfe\xad\xadaim]\x03\x14I0\xfe\xe7\xdb\ +\xaco\x8b\x89\x89U2s\x01+\x00\xff\xff\x005\x00\ +\x00\x07\x14\x07u\x02&\x000\x00\x00\x01\x07\x00v\x01\ +\xbc\x01T\x00\x08\xb3\x01\x1c\x05&\x00+5\xff\xff\x00\ +%\x00\x00\x06\xd5\x06!\x02&\x00P\x00\x00\x01\x07\x00\ +v\x01\xcd\x00\x00\x00\x08\xb3\x01/\x11&\x00+5\xff\ +\xff\xff\x85\xfd\xa8\x04\x8b\x05\xbc\x02&\x00$\x00\x00\x00\ +\x07\x02[\x01^\x00\x00\xff\xff\x00Z\xfd\xa8\x04\x9e\x04\ +s\x02&\x00D\x00\x00\x00\x07\x02[\x01B\x00\x00\xff\ +\xff\xfe\xee\xff\xec\x05\xfc\x05\xcd\x00&\x002d\x00\x00\ +\x07\x02\x5c\xfe\x88\x00\x00\x00\x02\xff\x9a\xfd\xa8\x01\x8f\xff\ +\x83\x00\x0b\x00\x17\x00\x10\xb5\x0f\x09\x09\x18\x15\x03\x00/\ +3\x129/310\x01\x14\x06#\x22&546\ +32\x16\x074&#\x22\x06\x15\x14\x16326\x01\ +\x8f\x8crp\x87\x87pn\x90\x9d7**600\ +*7\xfe\x98k\x85\x81ml\x81\x82k-33-\ +-44\x00\x02\x00f\x04h\x033\x05\xc9\x00\x07\x00\ +\x1a\x00\x11\xb6\x0b\x02\x18\x07\x80\x02\x03\x00?\x1a\xdd\xc4\ +\x10\xc610\x0167!\x15\x06\x07#%467\ +\x15\x06\x06\x15\x14\x16\x17\x16\x16\x15\x14\x06#\x22&\x01\ +\x9e=R\x01\x06x\x84\x99\xfe\xc8\x96\xa2EO\x12\x0f\ +\x16\x1b869O\x04\x8by\xb4\x14\xab\x88l^t\ +\x1aJ\x11)&\x0e\x0d\x08\x0b\x1a\x1d&,<\x00\x00\ +\x03\xff%\xfe\x14\x08-\x06\x1f\x008\x00<\x00G\x00\ +F@'@FIY@\x00:\x15#\x15\x10\x15G\ +Y\x1e\x10\x00\x09*6\x196FY;'\x0c\x03\x19\ +\x0f2\x05\x00\x05GY-\x00\x1b\x00?2+\x11\x00\ +3\x18?\x173+\x11\x0033\x18?3+\x11\x00\ +3\x18??+10\x03\x22'5\x163267\ +\x13#?\x026632\x17\x07&#\x22\x06\x07\x07\ +!76632\x17\x07&#\x22\x06\x07\x073\x07\ +#\x03\x02!\x22'5\x16327\x13!\x03\x02\x01\ +!\x13!\x034632\x16\x15\x14\x06#\x22-h\ +F=6=\x5c\x13\xcc\xa3\x1e\xb7\x12)\xc3\xb0\x83h\ +PE@9F\x0c\x0c\x01\x8b\x12)\xc3\xb0\x83hO\ +EA9E\x0d\x0c\xdb1\xdb\xd7M\xfe\xb9hF=\ +6\x88$\xcd\xfet\xd7M\x05\xd9\xfe\xd3\xed\x01-\xfe\ +`WILX\x5c\x98\xfe\x14\x19\xf2\x15PZ\x03\xc5\ +\x91TT\xbe\xaf1\xe0\x1fPA>T\xbe\xaf1\xe0\ +\x1fPA>\xe5\xfc\x0e\xfe\x8d\x19\xf2\x15\xaa\x03\xc5\xfc\ +\x0e\xfe\x8d\x01\xec\x04^\x01\x06WY>:Pc\x00\ +\x02\xff%\xfe\x14\x08;\x06\x1f\x008\x00<\x00?@\ +!;\x00:\x15#\x15\x10\x15GY\x1e\x10\x00\x09*\ +6\x196FY\x0c'\x19\x0f2\x05\x00\x05GY-\ +\x00\x1b\x00?2+\x11\x003\x18?33+\x11\x00\ +33\x18?3+\x11\x003\x18??10\x03\x22\ +'5\x163267\x13#?\x026632\x17\ +\x07&#\x22\x06\x07\x07!76632\x17\x07&\ +#\x22\x06\x07\x073\x07#\x03\x02!\x22'5\x163\ +27\x13!\x03\x02\x01!\x01!-hF=6=\ +\x5c\x13\xcc\xa3\x1e\xb7\x12)\xc3\xb0\x83hPE@9\ +F\x0c\x0c\x01\x8b\x12)\xc3\xb0\x83hOEA9E\ +\x0d\x0c\xdb1\xdb\xd7M\xfe\xb9hF=6\x88$\xcd\ +\xfet\xd7M\x05\xd9\xfe\xd3\x01I\x01-\xfe\x14\x19\xf2\ +\x15PZ\x03\xc5\x91TT\xbe\xaf1\xe0\x1fPA>\ +T\xbe\xaf1\xe0\x1fPA>\xe5\xfc\x0e\xfe\x8d\x19\xf2\ +\x15\xaa\x03\xc5\xfc\x0e\xfe\x8d\x01\xec\x06\x14\x00\x00\x02\x00\ +{\xff\xec\x07\x06\x06\x14\x00\x15\x00#\x00'@\x13\x0f\ +\x0b@\x14\x0d\x04\x0b\x0b\x16LY\x0b\x04\x04\x1dLY\ +\x04\x13\x00?+\x00\x18?+\x11\x12\x0099\x1a\x18\ +\x10\xce10\x01\x10\x02\x04# \x00\x11\x10\x12$3\ + \x1767!\x17\x06\x06\x07\x16%\x22\x06\x02\x15\x14\ +\x16326\x1254&\x05\x98\xc6\xfe\xa8\xe0\xff\x00\ +\xfe\xe1\xc6\x01\x5c\xe4\x012\x8ap \x01/\x0a/\xbb\ +\x97\x13\xfd\xd0y\xcas\x85yy\xc7p\x82\x03\xaa\xfe\ +\xe5\xfeA\xe4\x01'\x01\x06\x01\x09\x01\xbd\xee\xcfJ\xcc\ +\x18\x9f\xd1:T\xcd\xb7\xfe\xc0\xbb\x93\x96\xae\x01>\xc6\ +\x8e\x9b\x00\x00\x02\x00Z\xff\xec\x05\xd9\x05\x06\x00\x16\x00\ +\x22\x00'@\x13\x05\x00@\x0a\x02\x10\x00\x00\x19GY\ +\x00\x10\x10\x1fGY\x10\x16\x00?+\x00\x18?+\x11\ +\x12\x0099\x1a\x18\x10\xce10\x012\x17667\ +!\x17\x06\x06\x07\x16\x15\x14\x02\x04#\x22&54\x12\ +$\x014#\x22\x06\x06\x15\x143266\x02\xac\xdb\ +sDT\x16\x01'\x0a0\xb9\xaa\x0e\x8d\xfe\xf6\xb7\xc3\ +\xe9\x8f\x01\x0e\x01.\x8fKwK\x96KxC\x04s\ +\x92\x1b\x8a\x80\x18\xb4\xc5<3N\xd3\xfe\xba\xb3\xeb\xc3\ +\xd5\x01M\xb7\xfeE\xc5z\xec}\xb9{\xdb\x00\x01\x00\ +\x8d\xff\xec\x07`\x06\x14\x00\x1d\x00 @\x0f\x09\x01\x01\ +\x0d\x04@\x1d\x13\x03\x0d\x19LY\x0d\x13\x00?+\x00\ +\x18?3\x1a\xce\x129/310\x01\x07667\ +!\x17\x06\x04\x07\x03\x02\x00!\x22&547\x13!\ +\x03\x06\x15\x143267\x13\x05\x9a'LT\x14\x01\ +/\x0a<\xfe\xee\xc8y9\xfe\xbe\xfe\xfe\xd4\xf3\x0f\xc4\ +\x011\xc2\x11\xbd{\x90 \xc2\x05\xb6\xb8\x18}\x81\x18\ +\xcc\xe1\x0d\xfd\xc2\xfe\xf6\xfe\xf2\xe3\xc2HB\x03\x9b\xfc\ +iJ3\xb2\x99\x98\x03\x95\x00\x00\x01\x00j\xff\xec\x06\ +\x89\x05\x04\x00 \x005@\x1c\x0f @\x18\x1a \x14\ +\x00\x0b\x10\x0b\x02\x09\x03\x0b\x0b\x16\x09 \x0f\x1a\x05G\ +Y\x1a\x16\x16\x15\x00??+\x00\x18?3\x129/\ +_^]3\x11\x129\x1a\x10\xce10\x01\x03\x06\x15\ +\x143267\x13!\x07>\x027!\x17\x06\x04\x07\ +\x03#7#\x06#\x22&547\x13\x023\x89\x10\ +l\x5c\x96+b\x01-\x183D+\x14\x01/\x0a:\ +\xfe\xf0\xcc\xae\xe6\x15\x06\x91\xd2\x89\x98\x1d\x7f\x04^\xfd\ +sD3{\xe4\xcc\x01\xcfp\x0d>aj\x18\xc9\xe2\ +\x10\xfc\xcf\xcf\xe3\xa5\x9cD\x91\x02\x5c\xff\xff\xfc\xef\x04\ +\xd9\xfe\x99\x06!\x00\x07\x00C\xfa\xf3\x00\x00\xff\xff\xfd\ +\xaf\x04\xd9\xff\xdc\x06!\x00\x07\x00v\xfb\xcc\x00\x00\xff\ +\xff\xfc\x80\x04\xd7\xff\xc6\x06\x0e\x00\x07\x01R\xfbE\x00\ +\x00\x00\x01\xfd\xa4\x04\xc3\xffR\x06\xa4\x00\x12\x00\x10\xb5\ +\x05\x0b\x0b\x10\x02\x04\x00/\xc9\xcc2\x12910\x03\ +\x14\x07\x07#76654&#\x22\x07563\ +2\x16\xae\xc5\x14\xb6\x0eNA \x1f3JIez\ +\x86\x05\xec\xa6AZH{\x00\x00\x01\x00\ +5\xff\xec\x07j\x05\xcd\x00$\x009@\x1f\x06\x16\x1b\ +\x16LY\x03\x0c\x1b\x01\x0d\x03\x1b\x1b\x18\x19\x03\x18\x12\ +\x1f\x00LY\x1f\x04\x11\x0bLY\x11\x13\x00?+\x00\ +\x18?+\x00\x18??\x129/_^]3+\x11\ +\x00310\x01\x22\x06\x07!\x07!\x06\x15\x14\x163\ +267\x11\x06#\x22\x00\x117#\x03!\x01!\x03\ +3\x12\x00!2\x16\x17\x07&\x05\xbc\x8b\xdb7\x02\x12\ +5\xfd\xf0\x07\x8b|J\x9d\x83\xbb\xda\xfe\xfe\xeb\x04\xc6\ +\x86\xfe\xcf\x015\x012y\xbcR\x01\x81\x01\x0az\xcc\ +hv\xa8\x04\xcb\xb2\xa0\xfe#3\x96\x9f -\xfe\xfc\ +M\x01+\x01\x0aV\xfd\x89\x05\xb6\xfd\xc3\x01\x19\x01;\ +18\xfaa\x00\x00\x01\x00%\xff\xec\x06\x14\x04s\x00\ +%\x001@\x1a\x1b\x06\x0b\x06FY\x18\x0b\x0b\x08\x09\ +\x0f\x08\x15\x0f\x15GY\x0f\x10\x00 GY\x00\x16\x00\ +?+\x00\x18?+\x00\x18??\x129/3+\x11\ +\x00310\x05\x22&547#\x03!\x13!\x03\ +36$32\x17\x07&&#\x22\x06\x07!\x07!\ +\x07\x15\x14\x163267\x15\x06\x04\x1d\xc8\xd8\x04\xcb\ +b\xfe\xd1\xef\x010]\xbfB\x01#\xc2\xb5\x92\x5c5\ +hBP\x85'\x01g0\xfe\x9a\x02]Q={[\ +\x9a\x14\xd8\xc5& \xfe1\x04^\xfeR\xd5\xeeH\xe5\ +\x16#mb\xe1\x18\x17`a#/\xf6O\x00\x02\xff\ +\x85\x00\x00\x04\xdf\x05\xbc\x00\x0b\x00\x10\x00%@\x12\x0e\ +\x05\x06\x0b\x03\x10\x03MY\x10\x10\x06\x09\x01\x05\x12\x06\ +\x03\x00??33\x129/+\x11\x003\x11\x129\ +10!!\x13#\x01!\x01!\x13!\x03#7&\ +'\x06\x07\x02\xd1\xfe\xe7\x87/\xfe\xb7\xfe\xbe\x03)\x01\ +u\xbc\xfe\xe6D1\x16\x1b\x075|\x02w\xfd\x89\x05\ +\xbc\xfaD\x02w\xed\xf3~{\xf6\x00\x00\x02\xff\x83\x00\ +\x00\x04;\x04^\x00\x0b\x00\x0f\x00%@\x12\x0e\x0a\x0b\ +\x04\x08\x0f\x08JY\x0f\x0f\x0b\x06\x02\x0a\x15\x0b\x0f\x00\ +??33\x129/+\x11\x003\x11\x12910\ +\x01\x13!\x03#\x03!\x13#\x03!\x01\x13&'\x03\ +\x03\x7f\xbc\xfe\xea9%P\xfe\xf1a)\xea\xfe\xcd\x02\ +\x91\xbf\x1d\x0a\x93\x04^\xfb\xa2\x01\xa6\xfeZ\x01\xa6\xfe\ +Z\x04^\xfe\x17\xbce\xfe\xdf\x00\x02\x005\x00\x00\x06\ +\xe9\x05\xbc\x00\x13\x00\x18\x005@\x1c\x17\x0c\x11\x02\x06\ +\x14\x06MY\x14\x0f\x0f\x0aLY\x0f\x0f\x0c\x0d\x03\x04\ +\x08\x00\x03\x0c\x12\x11\x03\x00??\x173?\x129/\ ++\x00\x18\x10\xc5+\x11\x003\x11\x12910!\x03\ +#\x03!\x13#\x01!\x01!\x03!\x01!\x03!\x01\ +!\x13\x013&'\x06\x05\xcfD1\x7f\xfe\xe8\x87/\ +\xfe\xb6\xfe\xbe\x01Z\xfe\xfa\x85\xfe\xd7\x015\x01)x\ +\x01^\x01?\x01u\xbc\xfd\xb5\xd3\x1b\x08*\x02w\xfd\ +\x89\x02w\xfd\x89\x02w\xfd\x89\x05\xb6\xfd\xc3\x02C\xfa\ +D\x03d\xda\x97c\x00\x00\x02\x00%\x00\x00\x06H\x04\ +^\x00\x13\x00\x16\x00-@\x17\x15\x0b\x10\x05\x01\x09\x0e\ +\x09FY\x16\x0e\x0e\x10\x03\x07\x13\x03\x0b\x15\x0c\x10\x0f\ +\x00?3?\x173\x129/3+\x11\x0033\x11\ +\x12910\x01#\x03!\x13#\x03!\x01!\x03!\ +\x13!\x03!\x13!\x13!\x03'\x07\x04\xf2\x19V\xfe\ +\xf2h\x1c\xfe\xfe\xcc\x01\x0f\xfe\xf8c\xfe\xf2\xed\x01\x11\ +\x5c\x01\x5c\xfe\x01j\xbd\xfe\xe9Z\x1ft\x01\xcd\xfe3\ +\x01\xcd\xfe3\x01\xcd\xfe3\x04^\xfeR\x01\xae\xfb\xa2\ +\x02\xb0\xe6\xe6\x00\x00\x02\xff\xaa\x00\x00\x06\x00\x05\xb6\x00\ +\x1b\x00\x1e\x004@\x1a\x13\x17\x09\x1c\x04\x04\x17MY\ +\x04\x04\x06\x15\x0e\x00\x12\x08\x05\x1e\x06\x06\x1eLY\x06\ +\x03\x00?+\x11\x12\x0099\x18?33\x129/\ ++\x11\x0033\x11310#\x13667\x037\ +!\x07\x01\x16\x16\x17\x13!\x03&&##\x03!\x13\ +#\x22\x06\x07\x03\x01\x01!V\xfcD\xac\x8d\xdf\x1c\x04\ +\xa0\x1b\xfeHyq\x0c!\xfe\xd5\x17\x05/.\x08}\ +\xfe\xca\x83\x087W(\xc3\x02F\x01\x04\xfek\x02\x1d\ +\x91\x8c\x1a\x01\xd9\x89\x8f\xfe\x1f$\xb8\xae\xfeD\x01\xc7\ +`T\xfd\x85\x02{O_\xfe3\x03q\x01C\x00\x00\ +\x02\xff\x9a\x00\x00\x04\xc1\x04^\x00\x19\x00\x1c\x002@\ +\x19\x12\x15\x04\x15KY\x1a\x09\x04\x04\x06\x14\x0e\x00\x15\ +\x08\x05\x1c\x06\x06\x1cJY\x06\x0f\x00?+\x11\x12\x00\ +99\x18?33\x129/33+\x11\x0031\ +0#\x13667\x037!\x07\x01\x16\x16\x17\x13#\ +\x03&&'\x03!\x13\x06\x06\x07\x03\x017!f\xb8\ +=\x8az\xc4\x16\x03\xdc\x15\xfe\x9ePR\x14%\xfe\x17\ +\x06! \x5c\xfe\xf5g/8\x1a\xa0\x01\xc5\xba\xfe\xdd\ +\x01s}\x7f\x1a\x01mhh\xfe\x8f\x1f\x88\x9f\xfe\xc1\ +\x013I@\x07\xfe=\x01\xc7\x0388\xfe\xac\x02\xa8\ +\xe7\x00\x02\x005\x00\x00\x08\x0a\x05\xb6\x00\x02\x00%\x00\ +8@\x1e%\x06\x0f\x14\x0fLY\x1a\x00\x14\x14\x17\x04\ +\x0b \x03\x11\x12\x12\x16\x19\x03\x02\x17\x17\x02LY\x17\ +\x03\x00?+\x11\x12\x00\x179\x18?\x173\x129/\ +33+\x11\x003310\x01\x01!\x13!\x13#\ +\x22\x06\x07\x03!\x1367!\x03!\x01!\x03!\x03\ +7!\x07\x01\x1e\x02\x17\x13!\x03&&##\x057\ +\x01\x02\xfem\x7f\xfe\xcb\x83\x099P)\xc6\xfe\xc2\xd5\ +2;\xfe\xf6\x86\xfe\xcf\x015\x012y\x01\xfc\xd1\x1c\ +\x04\xa0\x1a\xfeG^]2\x09!\xfe\xd5\x17\x05./\ +\x08\x03q\x01C\xfbL\x02{M]\xfe/\x01\xc9o\ +?\xfd\x89\x05\xb6\xfd\xc3\x01\xb4\x89\x8f\xfe\x1f&[\x91\ +x\xfeD\x01\xc7`T\x00\x02\x00%\x00\x00\x06\xbe\x04\ +^\x00\x1f\x00\x22\x008@\x1e\x18\x1b\x04\x09\x04FY\ +\x0f \x09\x09\x0c\x14\x1a\x00\x03\x06\x15\x07\x0b\x0e\x03\x22\ +\x0c\x0c\x22JY\x0c\x0f\x00?+\x11\x12\x00\x179\x18\ +?\x173\x129/33+\x11\x003310!\ +\x1367!\x03!\x13!\x03!\x037!\x07\x01\x16\ +\x16\x17\x13#\x03&&'\x03!\x13\x06\x06\x07\x03\x01\ +7!\x01\x98\xa3+2\xfe\xfec\xfe\xf2\xed\x01\x11\x5c\ +\x01\xb6\xb0\x16\x03\xdb\x14\xfe\x9eSP\x13%\xfe\x17\x05\ +#\x1f]\xfe\xf6g/8\x1a\xa0\x01\xc4\xbb\xfe\xdd\x01\ +LX)\xfe3\x04^\xfeR\x01Fhh\xfe\x8f \ +\x8c\x9a\xfe\xc1\x013HA\x07\xfe=\x01\xc7\x0388\ +\xfe\xac\x02\xa8\xe7\x00\x01\xff\xb0\xfe/\x04\xb0\x06\xf0\x00\ +L\x00N@(#\x0b\x0bM>8;G\x0fB\x01\ +\x09\x03B8@\x03+,,+MY,,\x1c8\ +82MYJ8\x03\x1c\x11MY\x1c#\x00?+\ +\x00\x18?3+\x11\x12\x009\x18/+\x11\x12\x009\ +\x1a\x18\x10\xdd_^]2\xc4\x119\x113\x1131\ +0\x01\x14\x06\x07\x15\x16\x16\x15\x14\x06\x06\x07\x0e\x02\x15\ +\x14327632\x17\x15&&#\x05\x22&5\ +4667>\x0254&##73 54\ +&#\x22\x07'667&'53\x16\x17>\x02\ +32\x17\x15&#\x22\x06\x07\x16\x16\x04\xb0\xdb\xc5\x92\ +\xa4w\xff\xe9\x83^)wGXW7z\x1e\x10J\ +8\xfe\x8b\xa5\xbd`\xd4\xddy\x92B\x97\xa8\x8d3\x7f\ +\x01\x7f_^\xaa\xbemV\xb1n2f\xa6k/P\ +`b:<*\x22&%_Q\x82\x9b\x04w\xa9\xc3\ +\x0d\x04\x11\xa8\x83\x84\xbct\x1c\x10\x1a)\x1eJ\x05\x05\ +)\xe5\x10\x19\x08\x98\x85v\x8fY!\x11:TF[\ +S\xf2\xc8HR{\xd17M\x11h\x94\x19p>Y\ +K'\x11\x95\x0aCW!\xaf\x00\x01\xff\xa4\xfe/\x04\ +)\x05d\x00L\x00P@+C**M\x12\x0c\x0f\ +\x1b\x0f\x16\x1f\x16/\x16\x03\x09\x03\x16\x0c#KLL\ +KJYLL=\x1e\x0c\x0c\x06JY\x0c\x0f=0\ +FY=#\x00?+\x00\x18?+\x11\x003\x129\ +\x18/+\x11\x12\x009\x18\x10\xd4_^]2\xc4\x11\ +9\x113\x11310\x012654&#\x22\x06\ +\x07'67&'53\x16\x17>\x0232\x17\x15\ +&#\x22\x06\x07\x16\x15\x14\x06\x07\x15\x16\x15\x14\x06\x06\ +\x07\x06\x06\x15\x14\x1632632\x16\x17\x15&&\ +#\x22\x06#\x22&5467>\x0254&#\ +#7\x01\xd5\x8dmDVE\xa9MH\x8du)T\ +\xa6k/Q_e7>(%#$N>\xcb~\ +\x86\xbew\xea\xe8pUG>E\x8fADB\x0f\x11\ +L4V\xa5]\xa4\xa6\xcf\xdf\x8cs4XX\xb0-\ +\x02\xb0;D.4-\x22\xdb4\x13P{\x19p>\ +ZI'\x10\x96\x0b1>?\xbdh\x8a$\x068\xaa\ +v\x97X\x18\x0c-++!\x0a\x15\x14\xe5\x11\x18\x08\ +\x9b\x88\x97\xac\x19\x10#;24:\xd3\x00\xff\xff\x00\ +\xb2\x00\x00\x06\xd3\x05\xb6\x02\x06\x01u\x00\x00\xff\xff\x00\ +w\xfe\x14\x06\x1d\x06\x12\x02\x06\x01\x95\x00\x00\x00\x03\x00\ +{\xff\xec\x05\x98\x05\xcd\x00\x0d\x00\x16\x00\x1e\x00&@\ +\x14\x1a\x12LY\x1a\x1a\x04\x0b\x0b\x17LY\x0b\x04\x04\ +\x0eLY\x04\x13\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01\x10\x02\x04# \x00\x11\x10\x12$\ +32\x00\x01267!\x06\x15\x14\x16\x01\x22\x06\x07\ +!74&\x05\x98\xc6\xfe\xa8\xe0\xff\x00\xfe\xe1\xc6\x01\ +\x5c\xe4\xff\x01\x18\xfd\x18\x81\xd44\xfd{\x04\x87\x011\ +x\xcc=\x02y\x02\x82\x03\xaa\xfe\xe5\xfeA\xe4\x01'\ +\x01\x06\x01\x09\x01\xbd\xee\xfe\xe0\xfcC\xc9\xb4\x1c8\x93\ +\x96\x03\xdb\xb7\xa53\x8b\x9e\x00\x00\x03\x00Z\xff\xec\x04\ +T\x04s\x00\x0d\x00\x16\x00\x1e\x00&@\x14\x1a\x12J\ +Y\x1a\x1a\x04\x0b\x0b\x17GY\x0b\x10\x04\x0eGY\x04\ +\x16\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x01\x14\x02\x04#\x22&54\x12$32\x16\x01\ +267!\x07\x15\x14\x16\x13\x22\x06\x07!54&\ +\x04T\x8d\xfe\xf6\xb7\xc3\xe9\x8f\x01\x0e\xb5\xc4\xe4\xfd\xcb\ +M|\x22\xfe{\x02P\xc3K{$\x01\x7fL\x02\xb8\ +\xd3\xfe\xba\xb3\xeb\xc3\xd5\x01M\xb7\xec\xfdT|r\x1d\ +\x14[b\x02\xaa{n\x1cdi\x00\x00\x01\x00\xb8\x00\ +\x00\x05\xc1\x05\xc3\x00\x19\x00\x19@\x0c\x19\x12\x13\x03\x12\ +\x12\x08\x0dLY\x08\x04\x00?+\x00\x18??\x129\ +10\x01667\x13>\x0232\x17\x15&#\x22\ +\x06\x07\x01!\x03!\x13\x16\x15\x14\x07\x02\x19\x13J\x11\ +\xe6\x5cv\x8b_RF4-@Z3\xfd\xf2\xfe\xb2\ +\x7f\x01'3\x06\x06\x011:\xb9\x22\x01\xe1\xbf\x95H\ +\x1d\xf8\x13Zc\xfb\xfc\x05\xb6\xfc\xb0bQD>\x00\ +\x01\x00f\x00\x00\x04\xa6\x04f\x00\x16\x00\x19@\x0c\x16\ +\x11\x12\x0f\x11\x15\x07\x0cGY\x07\x0f\x00?+\x00\x18\ +??\x12910\x0167\x13>\x0232\x17\x15\ +&#\x22\x06\x06\x01!\x03!\x13\x17\x07\x01\xc7 <\ +\x89Bf{TK8*&#=-\xfej\xfe\xbd\ +\x8a\x01'0\x05\x01\x015Y~\x01\x19\x89};\x1a\ +\xee\x130R\xfd\x11\x04^\xfd\x87u;\x00\xff\xff\x00\ +\xb8\x00\x00\x05\xc1\x07s\x02&\x02\x80\x00\x00\x01\x07\x03\ +v\x04\xf2\x01R\x00\x0a\xb4\x02\x01+\x05&\x00+5\ +5\xff\xff\x00f\x00\x00\x04\xa6\x06!\x02&\x02\x81\x00\ +\x00\x01\x07\x03v\x04L\x00\x00\x00\x0a\xb4\x02\x01(\x11\ +&\x00+55\xff\xff\x00{\xfe\x14\x0aX\x05\xcd\x00\ +&\x002\x00\x00\x00\x07\x00\x5c\x05\xc7\x00\x00\xff\xff\x00\ +Z\xfe\x14\x08\xe7\x04s\x00&\x00R\x00\x00\x00\x07\x00\ +\x5c\x04V\x00\x00\x00\x02\x00{\xff\x83\x05\xcf\x061\x00\ +\x19\x00-\x00-@\x16\x1c\x1a,\x0a,LY\x07\x04\ +\x0a\x22$&\x17\x14\x11\x11&LY\x11\x03\x00?+\ +\x11\x0033\x1133\x18/33+\x11\x0033\ +10\x01\x14\x02\x04\x07\x06\x06#\x22&5&\x025\ +4\x12$76632\x16\x17\x16\x12\x012\x176\ +\x1254&'\x06#\x22'\x06\x02\x15\x14\x16\x176\ +\x05\xcf\xa3\xfe\xda\xc4\x0dBAwux@\xfe\xf5\x9e\xa7H\ +?\x12\x13\x19\x1e?>GV\xaa3X3i\xa4\xb6\ +\xd3\xde\xb4\xfe\xbb\xd6}\xa8>V\xa5i\xe0\xf9\xa8\x01\ +:\xd2a\x9e4\x85$DHc\xaej\xcdW\xbb[\ +)OmDv\xbam\x08\x14\xc2\x22(\x223;\x9c\ +\xa1&-&\xfe\xc7p\x8d\x09\x5c\x0e1*\x11\x10\x08\ +\x0c\x1d\x22-2Q\xfd\xb7)#\xd9i\xfe\xf2\xfe\xce\ +\xfe8\xf3NKVC\x01(\x01\x07\x01\x16\x01\xad\xeb\ +;,\xd9\x1a0\xb3\xfe\xb9\xbe\xfe\xd5pqXW2\ +\xc0\x01X\xc9\x01\x02\x00\x00\x03\x00Z\xff\xec\x06T\x07\ +R\x00,\x00@\x00R\x00g@\x0eEDD\x0bP\ +8-..4\x008\x018\xb8\xff\xc0@&\x0d\x10\ +H8844\x0f;\x01\x09\x03;\x0b\x19\x10\x16\x02\ +\x0b\x04!\x10\x0b\x10FY&\x0b\x10\x1b\x16\x04\x16F\ +Y\x00\x04\x16\x00?3+\x11\x003\x18?3+\x11\ +\x003\x11\x129\x11\x129\x18\x10\xc4_^]2\x11\ +3/+]\x129/3\x10\xc4\x119/310\ +\x05\x22'\x06#\x22&54\x12632\x17\x07&\ +#\x22\x06\x06\x15\x143267\x1632\x1254\ +&#\x22\x07'632\x16\x15\x14\x02\x06\x13\x07#\ +\x22.\x02#\x22\x06\x07#6632\x1e\x023\x01\ +\x14\x06\x0756654&'&&5432\ +\x16\x04'\xb6i\x87\xa0\xbe\xc9\x90\xf6\xa5\x8efV<\ +IJ\x80K\x989{PY\x86\x82\x9fB?;W\ +;\x84\x8c\xb4\xb9\x8f\xfb\xe2)3HyhY&+\ +4\x0e\xc0\x0e\x9d\x82>vvw@\xfe\xf6\xa7\x9fI\ +?\x13\x12\x19\x1f}HV\x14nn\xe1\xd7\xd1\x01U\ +\xa9>\xcd)z\xdd\x8c\xdf?N\x8d\x01\x1c\xdal`\ +)\xcd>\xdd\xd1\xd6\xfe\xa8\xab\x06\xed\xc2\x22(\x224\ +;\x9c\xa2&-&\xfe\xc7w\x87\x08\x5c\x0e0*\x11\ +\x10\x08\x0d\x1d\x22^R\x00\x02\x00\x81\xff\xec\x07\xf0\x07\ +B\x005\x00C\x00U@0;??\x0fC\x1fC\ +/C\x8fC\x9fC\xafC\x06\x09\x03C8\ +LLZ\x07-%\x1f3\x1b))\x2200\x14Z\ +Zgg\x07\x11\x17\x0d\x14\x04\x0a\x00\x07\x00/3\xca\ +2/3\xca2\x129/3\x11\x129/33\x11\ +3\xca222\x11\x129/33\x113\xca22\ +2\x113\x113\x10\xca22210\x012\x16\x17\ +#&&#\x22\x06\x07#6\x132\x16\x17#&&\ +#\x22\x06\x07#66\x012\x16\x17#&&#\x22\ +\x06\x07#66!2\x16\x17#&&#\x22\x06\x07\ +#66\x012\x16\x17#&&#\x22\x06\x07#6\ +6!2\x16\x17#&&#\x22\x06\x07#66\x01\ +2\x16\x17#&&#\x22\x06\x07#6!2\x16\x17\ +#&&#\x22\x06\x07#66\x03\xe9]q\x07O\ +\x05\x000@\x18 #03\x18\x1e\x10\x167;(\ +++;\x16\x1e3#\x06\x06\x0c\x0e\x04\x06\x00/3\ +/3\x12\x179\x113\x113\x113\x113\x113\x11\ +310\x05\x06\x06\x07#673\x036673\ +\x06\x07#\x01\x16\x16\x17\x15&'5\x05&&'5\ +\x16\x17\x15\x01\x17\x06\x07'766\x01'67\x17\ +\x07\x06\x037\x16\x17\x07'&\x01\x07&&'7\x17\ +\x16\x16\x04B\x11F$a5\x11\x8b\xd1\x13I\x1fa\ +4\x12\x8b\x02\xbcG\xc8A\xdd\x81\xfbZB\xbfO\xdd\ +\x81\x04\xecE\xb1xb\x02C\xbe\xfb\x03E\xb1xb\ +\x02\x9b\x98C{Lb\x11R\x04\xd7C\x1f\x82&b\ +\x11'Z1B\xbfO\xdd\x81\x04\xa6G\xc8A\xdc\x82\ +\xfe!\x13I\x1fa5\x11\x8b\xd1\x11F$a5\x11\ +\x8b\x02\xddDnXb\x10'X\xfa\xfcDnXb\ +\x10Y\x04\xeeF\xc6cb\x02\x8c\xfbxF2\xc34\ +b\x02E\xc2\x00\x00\x02\x005\xfeV\x06H\x07\x8b\x00\ +\x13\x00$\x00+@\x15\x10\x04\x13\x00$\x1d!\x18@\ +\x06\x00\x03\x0d\x08LY\x0d\x13\x12\x0bU\x00??3\ ++\x00\x18?3\x1a\xde2\xcd2\x11\x129910\ +\x01!\x03\x02\x073\x01!\x03!\x01!\x01#\x12\x12\ +7'\x01!\x01\x0e\x02#\x22&547!\x07\x14\ +3267\x01j\x01\x19\x93A\x13\x0a\x02\xfc\x01r\ +\xfd\x011\xfe\xc8\xfe\xa6\x01\x06\xf1^d#\x08\xfd\x04\ +\xfe\x89\x05\xaa\x22\x80\xd4\x98\xc8\xd6\x04\x01\x0b\x03\xaad\ +l\x16\x05\xb6\xfdL\xfe\xe6F\x04\x14\xfbT\xfdL\x01\ +\xaa\x01\xbe\x01\xd8\x8f\x02\xfb\xd9\x07\x8b\x85\x95L\x99\x9e\ +\x19\x16/\x8b[_\x00\x00\x02\x00j\xfeo\x04\xf2\x06\ +?\x00\x1a\x00+\x00/@\x18+#(\x1e@\x02\x04\ +\x14\x0a\x0f\x19\x22\x04\x10GY\x04\x16\x00\x16FY\x00\ +\x15\x00?+\x00\x18?+\x00\x18??3\x129\x1a\ +\xde2\xcd210!7#\x06#\x22&547\ +\x13!\x03\x06\x15\x143267\x13!\x033\x01!\ +\x13\x01\x06\x06#\x22&547!\x07\x15\x1432\ +67\x02\xcd\x14\x02\x8e\xc6\x89\x98\x1d\x7f\x01-\x89\x10\ +l\x5c\x96+b\x01-\xbe\xfc\xfe\xef\xfe\xd1\xd9\x01i\ +2\xff\xde\xc7\xd6\x04\x01\x0a\x02\xaack\x17\xb4\xc8\xa5\ +\x9cD\x91\x02\x5c\xfdsD3{\xe4\xcc\x01\xcf\xfc\x81\ +\xfd\x90\x01\x91\x06?\xc2\xa4\x9a\x9d\x19\x16\x1a\x15\x8bX\ +b\x00\x02\x005\x00\x00\x04R\x05\xb6\x00\x12\x00\x1a\x00\ +3@\x1a\x0e\x06\x07\x06LY\x0b\x07\x07\x0f\x09\x0f\x1a\ +LY\x0f\x0f\x04\x09\x03\x04\x13LY\x04\x12\x00?+\ +\x00\x18?\x129/+\x11\x12\x009\x18/3+\x11\ +\x00310\x01\x14\x04!!\x13#737!\x07\ +3\x07#\x0732\x16\x0132654##\x04\ +R\xfe\xc4\xfe\xd6\xfeI\xe2\x967\x92 \x012!\xf8\ +8\xf5!C\xf0\xfa\xfdJd\x8b\x92\xc1l\x01\xec\xed\ +\xff\x04!\xfe\x97\x97\xfe\x9c\xd2\xfeKuj\xaa\x00\x00\ +\x02\x00s\xff\xec\x04\x19\x06\x14\x00\x18\x00%\x00=@\ + \x03\x00\x13\x16\x16\x13KY\x16\x16\x06\x17\x06\x19J\ +Y\x00\x06\x01\x16\x03\x06\x06\x0d\x17\x00\x0d!JY\x0d\ +\x16\x00?+\x00\x18?\x129/_^]+\x11\x12\ +\x009\x18/+\x11\x12\x009910\x01!\x07!\ +\x03632\x16\x15\x14\x06\x06#\x22&547\x13\ +#737!\x03\x22\x07\x06\x06\x15\x14\x16326\ +54\x02m\x01/)\xfe\xcfeX\x81\xa6\xbd}\xef\ +\xab\xc3\xcc\x18\x8c\x9e)\xa0/\x01-JFZ\x07\x0f\ +LCVf\x055\xc6\xfe)\x16\xa5\x8ax\xb6e\xa6\ +\xa1Fn\x02\x88\xc6\xdf\xfb\xc7\x12 N\x1e=BZ\ +H{\x00\x00\x02\x005\x00\x00\x04\xa6\x05\xb6\x00\x0f\x00\ +\x1b\x004@\x1b\x13\x16\x15\x03\x1b\x10\x03\x06\x0c\x05\x0a\ +\x09\x09\x10LY\x09\x09\x0c\x0b\x12\x0c\x1bLY\x0c\x03\ +\x00?+\x00\x18?\x129/+\x11\x12\x009\x129\ +9\x11\x12\x17910\x01\x14\x06\x07\x17\x07'\x06#\ +#\x03!\x01!2\x16\x01327'7\x1765\ +4##\x04\xa6zt>\xaeDgtVm\xfe\xcf\ +\x015\x01R\xf2\xf8\xfdd8+)4\xaa16\xc3\ +J\x04\x0c\x8f\xd9B\x81R\x90\x17\xfd\xf8\x05\xb6\xd5\xfe\ +%\x06qRi?_\xb4\x00\x00\x02\xff\xbc\xfe\x14\x04\ +h\x04s\x00\x17\x00'\x00;@\x1f #\x22\x03\x18\ +\x1f\x06\x09\x00\x08\x12\x0d\x16\x0a\x00\x12\x1b\x00\x18GY\ +\x00\x10\x13\x0f\x0a\x1fGY\x0a\x16\x00?+\x00\x18?\ +?+\x00\x18?\x11\x1299\x119\x1199\x11\x12\ +\x17910\x012\x16\x15\x14\x02\x07\x17\x07'\x07\x22\ +&'#\x06\x07\x03!\x013\x0736\x17\x22\x06\x06\ +\x15\x14\x1633'7\x176654\x03-\x92\xa9\ +\x9c\x827\xae=4Sx3\x08\x0c\x1fH\xfe\xd3\x01\ +V\xe6\x11\x09\x8a:F|NE0\x0c7\xaa14\ +:\x04s\xd7\xc1\xce\xfe\x8b]\x7fR\x84\x02JY\x9f\ +\x88\xfe\xac\x06J\xaa\xbf\xf4\x82\xf1}ZVyRh\ +K\xd6l\xb0\x00\x00\x01\x00\x1d\x00\x00\x04\x98\x05\xb6\x00\ +\x0d\x00$@\x12\x03\x07\x08\x07LY\x00\x08\x08\x0a\x05\ +\x12\x0a\x0dLY\x0a\x03\x00?+\x00\x18?\x129/\ +3+\x11\x00310\x01!\x07!\x03!\x13#7\ +3\x13!\x07!\x02\x17\x0158\xfe\xcb}\xfe\xd3\x7f\ +\x977\x95\x81\x03.6\xfe\x00\x03R\xfe\xfd\xac\x02T\ +\xfe\x02d\xfe\x00\x00\x01\xff\xf4\x00\x00\x03\xf6\x04^\x00\ +\x0d\x00$@\x12\x06\x0a\x0b\x0aFY\x03\x0b\x0b\x0d\x08\ +\x15\x0d\x02GY\x0d\x0f\x00?+\x00\x18?\x129/\ +3+\x11\x00310\x01\x07!\x07!\x07!\x03!\ +\x13#73\x13\x03\xf65\xfeI/\x01\x061\xfe\xfa\ +X\xfe\xd3Z\x8b1\x8bb\x04^\xf8\xd9\xeb\xfe^\x01\ +\xa2\xeb\x01\xd1\x00\x00\x01\x005\xfe\x00\x04\xa6\x05\xb6\x00\ +\x1d\x00'@\x15\x0b\x00LY\x0b\x0b\x05\x04\x12\x05\x08\ +LY\x05\x03\x13\x18LY\x13\x1c\x00?+\x00\x18?\ ++\x00\x18?\x129/+10\x01\x22\x07\x03!\x01\ +!\x07!\x03632\x16\x16\x15\x14\x02\x04#\x22'\ +\x11\x1632\x1254&\x02VI6u\xfe\xd3\x01\ +5\x03.6\xfe\x00VPX\x97\xe8s\xa7\xfe\xd8\xbe\ +\xa9z\x81\x8d\xa3\xc8\x91\x02/\x0c\xfd\xdd\x05\xb6\xfe\xfe\ +g\x14\x8f\xfc\xa8\xdf\xfe\x98\xb91\x01\x043\x01\x0a\xd3\ +\xa5\xab\x00\x00\x01\x00%\xfe\x0a\x03\xf6\x04^\x00\x1c\x00\ +'@\x15\x1a\x0fGY\x1a\x1a\x14\x13\x15\x14\x17GY\ +\x14\x0f\x04\x09HY\x04\x1b\x00?+\x00\x18?+\x00\ +\x18?\x129/+10%\x14\x02\x04#\x22'\x11\ +\x1632654&#\x22\x07\x03!\x13!\x07!\ +\x07632\x16\x03\xd5\x92\xfe\xf6\xb4\x95R`}\x8d\ +\x9cYW/#P\xfe\xd3\xed\x02\xe45\xfeI53\ +P\xb3\xca\xb8\xd1\xfe\xc0\x9d+\x01\x0f6\xd8\xbcqz\ +\x0e\xfe\x81\x04^\xf8\xf7\x12\xf4\x00\x01\xff\x83\xfeV\x07\ +\x96\x05\xb6\x00\x15\x00-@\x18\x0a\x04\x0d\x01\x10\x05\x07\ +\x07\x00\x0e\x0b\x08\x03\x14U\x03\x06\x00\x00\x11MY\x00\ +\x12\x00?+\x11\x0033\x18??33\x129\x11\ +\x17310!\x01\x03!\x13\x01!\x01\x01!\x01\x13\ +!\x03\x01!\x01\x133\x03!\x13\x05;\xfe\xee\x98\xfe\ +\xdc\x97\xfd\xd5\xfe\xaa\x02k\xfe\xe9\x01/\x01\x0a\x92\x01\ +%\x92\x02\x19\x01H\xfd\xba\xc4\xd1\x8f\xfe\xd1\x5c\x02\xcf\ +\xfd1\x02\xcd\xfd3\x03\x0c\x02\xaa\xfdT\x02\xac\xfdT\ +\x02\xac\xfd-\xfe\x13\xfd`\x01\xaa\x00\x00\x01\xff\xec\xfe\ +o\x07\xc3\x04s\x009\x00C@$\x22&\x05&K\ +Y\x09\x05\x05$\x07\x0f$\x15\x1c\x22\x125\x005G\ +Y\x0d\x00\x10\x1d\x18FY\x1d).GY)\x16\x00\ +?+\x00\x18/+\x00\x18?3+\x11\x003\x18?\ +??\x129/3+\x11\x00310\x012\x16\x15\ +\x15\x073\x13!\x0336\x0032\x17\x07&#\x22\ +\x02\x15\x14\x16327\x03!\x13&&55#\x03\ +!\x13#\x06\x04#\x22'7\x16326654\ +&#\x22\x0756\x019\xaf\xca\x02\xa6d\x01!d\ +\x9d9\x01$\xcaGA45\x1b}\xa1NERP\ +\x89\xfe\xe9\x5c\x86\x94\xac`\xfe\xdf`\x989\xfe\xe3\xca\ +M:/5\x1aT\x83HHA-LL\x04s\xe4\ +\xcc\x1b\x1b\x01\xd1\xfe/\xe3\x01\x03\x0d\xef\x08\xfe\xf0\xcf\ +`a!\xfdo\x01\x87\x1b\xd6\xaf-\xfe=\x01\xc3\xdf\ +\xf8\x0c\xef\x08\x80\xde\x81`a\x1b\xf4\x1b\x00\xff\xff\x00\ +)\xfe\x14\x04\xb0\x05\xcb\x02&\x01\xb1\x00\x00\x00\x07\x03\ +\x7f\x01\xb6\x00\x00\xff\xff\x00\x19\xfe\x14\x03\xfc\x04s\x02\ +&\x01\xd1\x00\x00\x00\x07\x03\x7f\x01q\x00\x00\x00\x01\x00\ +5\xfeV\x05\x7f\x05\xb6\x00\x0e\x00$@\x12\x06\x0b\x0e\ +\x0e\x05\x0c\x09\x03\x08\x12\x03U\x05\x00MY\x05\x12\x00\ +?+\x00\x18???3\x129\x113310%\ +!\x03!\x13#\x01\x03!\x01!\x03\x01!\x01\x04\x00\ +\x01#\x90\xfe\xd1]\xb3\xfe\xf0\x98\xfe\xcf\x015\x012\ +\x92\x02\x1d\x01X\xfd\xba\xf6\xfd`\x01\xaa\x02\xcf\xfd1\ +\x05\xb6\xfdT\x02\xac\xfd-\x00\x00\x01\x00%\xfeo\x04\ +\xe3\x04^\x00\x0e\x00$@\x12\x09\x0e\x02\x02\x08\x00\x0c\ +\x0f\x0b\x15\x06\x22\x08\x03GY\x08\x15\x00?+\x00\x18\ +???3\x129\x113310\x01!\x01\x133\ +\x03!\x13#\x01\x03!\x13!\x03\x03\x8b\x01X\xfe!\ +\x98\xf5\x89\xfe\xea`\x8b\xff\x00u\xfe\xd3\xef\x01.o\ +\x04^\xfd\xcf\xfe\xcd\xfdu\x01\x91\x02!\xfd\xdf\x04^\ +\xfd\xf8\x00\x00\x01\x005\x00\x00\x05\x9c\x05\xb6\x00\x12\x00\ +\x1d@\x11\x0b\x0c\x0f\x0d\x06\x05\x12\x04\x02\x09\x08\x10\x09\ +\x03\x01\x08\x12\x00?3?3\x12\x17910!!\ +\x03\x07#\x13\x07\x03!\x01!\x037\x133\x07\x13!\ +\x01\x04`\xfe\xbb{\x19\x8fVyo\xfe\xcf\x015\x01\ +2\x92\x92K\x90\x1f\xec\x01X\xfd\x9b\x01N\x8d\x01\x9d\ +T\xfd\xf6\x05\xb6\xfdT\xb9\x01f\x8d\x01\x1a\xfd/\x00\ +\x01\x00Z\x00\x00\x05\x19\x04^\x00\x13\x00\x1c@\x10\x04\ +\x13\x05\x08\x06\x12\x0f\x11\x08\x01\x09\x02\x0f\x0e\x01\x15\x00\ +?3?3\x12\x17910!!\x13!\x037\x13\ +3\x077!\x01\x07\x01!\x03\x07#\x13'\x01\x87\xfe\ +\xd3\xf0\x01-oVD\x85\x19\xbb\x01P\xfe\x22\x02\x01\ +\x15\xfe\xb6}#\x87N/\x04^\xfd\xf8d\x01E_\x03\x12\xb3\ +\xfe\xbam\x0c\x1a\xf3\x0b\x10` \x01$\x01\x02\x01\x0f\ +\x01\xc0\xec-\xf0\x1f\xae\xfe\xb5\xbd\x8f\xa1x\xb3\xb5\x01\ +\x12\x94\xb7\xfd\x90L\x01\x10}f\xde\xafb\x00\x02\x00\ +Z\xff\xb8\x04\x8d\x04s\x00+\x007\x00\x5c@\x19,\ +2\x22\x03\x0c)\x0e)2KY\x00)\x10)\xd0)\ +\xe0)\xf0)\x05\x09\x03)\xb8\xff\xc0@\x1a\x0d\x11H\ +))\x0e\x15\x0a\x05JY\x0a\x0e@\x15\x1bGY\x15\ +\x10\x0e\x22FY\x0e\x16\x00?+\x00\x18?+\x00\x1a\ +\x18\x10\xcc+\x11\x12\x009\x18/+_^]+\x11\ +\x12\x0099\x11\x12910\x01\x14\x06\x07\x1632\ +7\x15\x06#\x22'\x06#\x22&54\x12$32\ +\x16\x17\x07&#\x22\x06\x06\x15\x14\x1633&&5\ +4632\x16\x016654&#\x22\x06\x15\x14\ +\x16\x04\x8dyZ\x16\x22>8FU\x8bk`}\xc8\ +\xd8\x99\x01\x0d\xb4A\x01/D3{\xe0\ +\xce\xfe/\x02\x8dD3{\xe4\xcc\xfe1\x04^\xcf\xe4\ +\x00\xff\xff\x00\xba\x00\x00\x05?\x05\xb6\x02\x06\x00<\x00\ +\x00\x00\x01\x00f\xfe\x14\x04\x8f\x04^\x00\x0d\x00\x12\xb7\ +\x00\x05\x08\x03\x09\x0f\x07\x1b\x00??3/331\ +0\x0167\x01!\x01\x03!\x13\x03!\x13\x16\x15\x01\ +\xc9'3\x01)\x01C\xfd\x9eh\xfe\xc8i\x90\x01'\ +0\x06\x015re\x02R\xfb\xa2\xfe\x14\x01\xec\x04^\ +\xfd\x88Pa\x00\x00\x01\x00L\x00\x00\x05?\x05\xb6\x00\ +\x10\x00-@\x19\x07\x0b\x0c\x0bLY\x04\x00\x0c\x10\x0c\ +\x02\x0c\x0e\x03\x0c\x03\x00\x00\x09\x01\x0f\x03\x09\x12\x00?\ +?3\x129\x11\x173/]3+\x11\x00310\ +\x01\x01!\x01\x07!\x03!\x03!\x13!\x13!7\x03\ +!\x02s\x01v\x01V\xfd\x96\x06\x01'5\xfe\xd7:\ +\xfe\xd19\xfe\xe45\x01\x1f\x06\xec\x018\x03f\x02P\ +\xfcy\x1f\xfe\xfe\xfe\xf2\x01\x0e\x01\x02\x1f\x03\x87\x00\x00\ +\x01\xff\xc3\xfe\x14\x04\x8f\x04^\x00\x13\x00\x1e@\x0f\x08\ +\x0c\x0d\x0cFY\x00\x05\x0d\x15\x03\x0f\x0f\x0a\x1b\x00?\ +?3?33+\x11\x00310\x0167\x01!\ +\x01!\x07!\x03!\x13!7!\x03!\x13\x16\x15\x01\ +\xc5$:\x01)\x01C\xfd\x9e\x01\x121\xfe\xee7\xfe\ +\xc88\xfe\xfe1\x01\x02\x90\x01'-\x04\x011mn\ +\x02R\xfb\xa2\xe5\xfe\xf9\x01\x07\xe5\x04^\xfd\xb69\xaa\ +\x00\x00\x01\xff\x8b\xfeV\x05y\x05\xb6\x00\x0f\x00#@\ +\x13\x07\x0a\x04\x01\x04\x03\x08\x05\x03\x03\x12\x0eU\x00\x0b\ +MY\x00\x12\x00?+\x00\x18???3\x12\x179\ +10!\x03\x01!\x01\x03!\x13\x01!\x01\x13!\x03\ +!\x13\x03\x19\xac\xfet\xfe\xaa\x02@\xee\x01@\x99\x01\ +k\x01X\xfd\xdf\xb2\x01\x08\x8f\xfe\xd1\x5c\x02\x1f\xfd\xe1\ +\x02\xfc\x02\xba\xfd\xfa\x02\x06\xfd+\xfe\x15\xfd`\x01\xaa\ +\x00\x00\x01\xff\x9c\xfeo\x04\xa4\x04^\x00\x0f\x00#@\ +\x13\x03\x06\x0d\x00\x04\x0f\x04\x01\x0f\x0f\x15\x0a\x22\x0c\x07\ +GY\x0c\x15\x00?+\x00\x18???3\x12\x179\ +10\x01\x03!\x13\x13!\x01\x13!\x03!\x13#\x03\ +\x01!\x01{\xe1\x01As\xf4\x01b\xfe-\x85\x01\x0a\ +\x89\xfe\xea^\xa0}\xfe\xf8\xfe\xa2\x02=\x02!\xfe\xb2\ +\x01N\xfd\xcf\xfe\xcd\xfdu\x01\x91\x01V\xfe\xaa\x00\x00\ +\x01\x00\xa8\xfeV\x06o\x05\xb6\x00\x0f\x00&@\x13\x02\ +U\x0a\x06\x07\x06LY\x0d\x07\x03\x0f\x0b\x04\x0bLY\ +\x04\x12\x00?+\x11\x003\x18?3+\x11\x003\x18\ +?10\x01\x03!\x13!\x13!\x13!\x03!\x03!\ +\x01!\x03\x06B\x94\xfe\xd1\x5c\xfc/\xfe\xfe\xa07\x03\ +\xd35\xfe\xbc\xc6\x01\xcc\x01\x00\x010\xfe\x01\x0a\xfdL\ +\x01\xaa\x04\xb4\x01\x02\xfe\xfe\xfcN\x04\xb4\xfbT\x00\x00\ +\x01\x00\x5c\xfeo\x051\x04^\x00#\x002@\x1a\x16\ +!\x19\x13\x22\x00 ! FY\x09!\x0f\x14\x0fF\ +Y\x14\x15\x19\x05GY\x19\x16\x00?+\x00\x18?+\ +\x00\x18?3+\x11\x003\x18?\x11\x12910\x01\ +\x03\x06\x15\x143267\x13!\x03\x06\x15\x1432\ +7\x03!\x13&'#\x06#\x22&547\x13#\ +7!\x07\x02\x81X\x10fa\x97+b\x01-\xa2\x06\ +>'3\x89\xfe\xe9`a \x02\x8e\xc6\x89\x98\x1dP\ +\xfa1\x03\x1d1\x03y\xfeXD9u\xe6\xca\x01\xcf\ +\xfd\x04\x1e\x17A\x0e\xfdu\x01\x91-\x87\xc8\xa1\x92Z\ +\x87\x01y\xe5\xe5\x00\x01\x00\xb8\xfeV\x05\x87\x05\xb6\x00\ +\x18\x00\x22@\x12\x03\x0fLY\x03\x03\x00\x12\x09\x03\x17\ +U\x00\x14MY\x00\x12\x00?+\x00\x18??3\x12\ +9/+10!\x13\x06#\x22&547\x13!\ +\x03\x06\x15\x14327\x13!\x01!\x03!\x13\x03\x06\ +w\xbb\xa1\xa7\xc2\x0dp\x011l\x0a\x99\x83\xa4\x8b\x01\ +2\xfe\xfd\x01\x1d\x8f\xfe\xd1\x5c\x021V\xaa\x989;\ +\x02%\xfd\xfc.$\x83J\x02\x8f\xfb@\xfd`\x01\xaa\ +\x00\x00\x01\x00\xa4\xfeo\x04\xc9\x04^\x00\x1c\x00)@\ +\x15\x03\x0b\x05\x05\x12GY\x05\x05\x00\x16\x0b\x0f\x1b\x22\ +\x00\x18GY\x00\x15\x00?+\x00\x18??3\x129\ +/+\x11\x12\x00910!\x137#\x06#\x22&\ +5477!\x03\x06\x15\x14\x1632677!\ +\x033\x03!\x13\x02\x85@+\x07\x80\xa4\x87\x9a\x1d3\ +\x01->\x10>9b\x7f-\x1b\x01-\xb9\xe2\x8a\xfe\ +\xea`\x01/\xb4\x8d\xac\x96O\x86\xf1\xfe\xddD2?\ +@\xc5\xd4\x7f\xfc\x9c\xfdu\x01\x91\x00\x00\x01\x00\xb8\x00\ +\x00\x05m\x05\xb6\x00\x1b\x00-@\x17\x06\x01\x02\x04\x08\ +\x17\x19\x15\x03\x0e\x14\x08\x14LY\x08\x08\x01\x1a\x0e\x03\ +\x01\x12\x00??3\x129/+\x11\x12\x00\x179\x11\ +99\x12910!!\x13\x06\x07\x03#\x13#\x22\ +&547\x13!\x03\x06\x15\x14\x17\x133\x0367\ +\x13!\x047\xfe\xcfwfLF\x91A\x14\xa7\xc2\x0d\ +p\x011l\x0a}E\x92DR^\x8b\x012\x021\ +.\x13\xfe\xbc\x01/\xaa\x989;\x02%\xfd\xfc.$\ +v\x0d\x01H\xfe\xc4\x12,\x02\x8f\x00\x00\x01\x00\xa4\x00\ +\x00\x04\xb2\x04^\x00\x1d\x00+@\x15\x16\x0f\x12\x14\x17\ +\x06\x08\x1d\x05\x17\x05GY\x17\x17\x0f\x0c\x1d\x0f\x0f\x15\ +\x00??3\x129/+\x11\x12\x0099\x1199\ +\x12910\x01\x03\x06\x15\x14\x1773\x07667\ +7!\x03!\x137#\x06\x07\x07#7\x22&54\ +77\x02!>\x10H1\x89/E\x5c#\x1b\x01-\ +\xed\xfe\xd3?+\x06>I6\x89/\x99\xa8\x1d3\x04\ +^\xfe\xddD2^\x19\xe5\xd9#\xc3\x9f\x7f\xfb\xa2\x01\ +/\xb4D$\xfa\xd5\xa8\x9aO\x86\xf1\x00\x01\x005\x00\ +\x00\x04\xe9\x05\xb6\x00\x14\x00\x18@\x0c\x04\x10LY\x04\ +\x04\x14\x00\x03\x0b\x14\x12\x00?3?\x119/+1\ +0\x01!\x03632\x16\x15\x14\x07\x03!\x1365\ +4#\x22\x07\x03!\x01j\x012w\xbb\xa1\xa7\xc1\x0c\ +p\xfe\xcem\x0a\x99\x83\xa4\x8c\xfe\xcf\x05\xb6\xfd\xcfV\ +\xaa\x975@\xfd\xdb\x02\x04.$\x83J\xfdq\x00\x00\ +\x01\x00%\x00\x00\x04!\x04^\x00\x18\x00\x18@\x0c\x13\ +\x07GY\x13\x13\x0c\x0d\x0f\x01\x0c\x15\x00?3?\x12\ +9/+10!!\x13654&#\x22\x06\x07\ +\x07!\x13!\x03\x073632\x16\x15\x14\x07\x03\xd1\ +\xfe\xd3=\x11>9b\x7f-\x1b\xfe\xd3\xed\x01-?\ ++\x06\x80\xa5\x87\x9a\x1d\x01#F1?@\xc5\xd5\x7f\ +\x04^\xfe\xd1\xb4\x8d\xac\x95D\x91\x00\x00\x02\x00=\xff\ +\xec\x06;\x05\xcd\x00#\x00-\x004@\x1a\x1d'\x18\ +\x00\x0a''\x0aMY''\x14\x03\x03$LY\x03\ +\x04\x14\x0fLY\x14\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x0099\x18\x10\xc410\x01\ +\x12\x00!2\x16\x15\x14\x04!#\x07\x15\x14\x1632\ +7\x11\x06# \x00\x117&&5473\x06\x15\ +\x14\x163\x01\x22\x06\x0732654&\x01\xb2X\ +\x01\x80\x01\x10\xc8\xd9\xfev\xfe~j\x02\x8d\x91\xa2\xc5\ +\xb1\xe9\xfe\xfa\xfe\xe3\x04\xa6\xacJ\xfc5--\x02\xd7\ +\x80\xd90\x5c\xdb\xdbE\x03d\x01'\x01B\xc6\xb3\xf2\ +\xf8\x16\x1b\xa7\xa2K\xfe\xfeM\x01&\x01\x0fV\x08\x81\ +qubQ='/\x01g\xc9\x9evr;D\x00\ +\x02\x00\x14\xff\xec\x05\x17\x04s\x00#\x00,\x004@\ +\x1a\x08'\x04\x19\x0f''\x19KY''\x00\x12\x12\ +$JY\x12\x10\x00\x1eFY\x00\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x003\x113\x18\x10\ +\xc410\x05\x22&55$5473\x06\x15\x14\ +\x16336\x0032\x16\x15\x14\x04!#\x07\x15\x14\ +\x163267\x15\x06\x03\x22\x06\x0732654\ +\x02\xe9\xd2\xe8\xfe\xe5:\xd5+)!\x0c<\x01=\xd9\ +\xb1\xc6\xfe\xb2\xfe\xca3\x02g`W\x8ee\xac6X\ +\x9c\x18-\x9b\xad\x14\xe2\xce)\x1e\xcfdR@G*\ +.\xe7\x01\x03\xa3\x8e\xbb\xcb\x15\x14[i&0\xe3V\ +\x03\xae\xa0saS_\x00\x02\x00=\xfeV\x06;\x05\ +\xcd\x00\x09\x000\x00;@\x1e\x0c\x03.\x13\x1d\x03\x03\ +\x1dMY\x03\x03'\x16)U\x16\x00LY\x16\x04*\ +''\x22LY'\x13\x00?+\x11\x003\x18?+\ +\x00\x18?\x11\x129/+\x11\x12\x0099\x18\x10\xc4\ +10\x01\x22\x06\x0732654&\x01473\ +\x06\x15\x14\x1633\x12\x00!2\x16\x15\x14\x04!#\ +\x07\x15\x14\x16327\x11\x06\x07\x03!\x13&\x025\ +7&&\x04\x7f\x80\xd90\x5c\xdb\xdbE\xfbzJ\xfc\ +5--\x0a^\x01~\x01\x0c\xc8\xd9\xfev\xfe~j\ +\x02\x8d\x91\xa2\xc5\x86\xb8V\xfe\xd1^\xa7\xb1\x04\xa6\xac\ +\x04\xcb\xc9\x9evr;D\xfe\xa6ubQ='/\ +\x01,\x01=\xc6\xb3\xf2\xf8\x16\x1b\xa7\xa2K\xfe\xfe=\ +\x0c\xfef\x01\xb02\x01\x16\xd3V\x08\x81\x00\x00\x02\x00\ +\x14\xfeo\x05\x17\x04s\x00\x08\x00/\x00;@\x1e)\ +\x03%\x13\x09\x03\x03\x13KY\x03\x03\x1e\x0c \x22\x0c\ +\x00JY\x0c\x10!\x1e\x1e\x18FY\x1e\x16\x00?+\ +\x11\x003\x18?+\x00\x18?\x11\x129/+\x11\x00\ +3\x113\x18\x10\xc410\x01\x22\x06\x073265\ +4\x016\x0032\x16\x15\x14\x04!#\x07\x15\x14\x16\ +3267\x15\x06\x07\x03!\x13&&55$5\ +473\x06\x15\x14\x163\x03\x8dX\x9c\x18-\x9b\xad\ +\xfdX<\x01=\xd9\xb1\xc6\xfe\xb2\xfe\xca3\x02g`\ +W\x8ee\x85\xa0P\xfe\xe9\x5c\x83\x8d\xfe\xe5:\xd5+\ +)!\x03\x9a\xa0saS_\xfe\xef\xe7\x01\x03\xa3\x8e\ +\xbb\xcb\x15\x14[i&0\xe3C\x0f\xfe\x7f\x01\x93'\ +\xd2\xa1)\x1e\xcfdR@G*.\xff\xff\xff\xc5\x00\ +\x00\x03\x81\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\xff\x83\x00\ +\x00\x07\x96\x07\x91\x02&\x01\xb0\x00\x00\x01\x07\x026\x01\ +`\x01R\x00\x08\xb3\x01\x16\x05&\x00+5\xff\xff\xff\ +\xec\xff\xec\x07\xc3\x06?\x02&\x01\xd0\x00\x00\x01\x07\x02\ +6\x01y\x00\x00\x00\x08\xb3\x01>\x11&\x00+5\x00\ +\x01\x005\xfe\x00\x05\x7f\x05\xb6\x00\x1b\x00'@\x14\x07\ +\x0a\x0a\x00MY\x0a\x0a\x04\x08\x05\x03\x04\x12\x12\x17L\ +Y\x12\x1c\x00?+\x00\x18??3\x129/+\x11\ +\x00310\x01\x22\x07\x03!\x01!\x03\x01!\x01\x1e\ +\x02\x15\x14\x02\x04#\x22'\x11\x1632\x125\x10\x02\ +sSMm\xfe\xcf\x015\x012\x92\x02\x1d\x01X\xfd\ +\xd5v\xafb\xa6\xfe\xdd\xc4\xa8{z\x94\xa3\xc8\x02!\ +\x19\xfd\xf8\x05\xb6\xfdT\x02\xac\xfdR\x15\x89\xe1\x91\xd9\ +\xfe\x9c\xbb1\x01\x043\x01\x0a\xd3\x01B\x00\x00\x01\x00\ +%\xfe\x0a\x04\xe3\x04^\x00\x1b\x00'@\x14\x1b\x02\x02\ +\x14KY\x02\x02\x18\x00\x19\x0f\x18\x15\x09\x0eHY\x09\ +\x1b\x00?+\x00\x18??3\x129/+\x11\x003\ +10\x01!\x01\x16\x16\x15\x14\x02\x04#\x22'\x11\x16\ +32654&#\x22\x07\x03!\x13!\x03\x03\x8b\ +\x01X\xfe-\x8f\x9e\x8d\xfe\xf5\xb7\x8b]b{\x89\xa0\ +|oF;N\xfe\xd3\xed\x01-n\x04^\xfd\xea\x1c\ +\xdb\xb7\xc1\xfe\xd5\xa4+\x01\x0f6\xc8\xb5t\x84\x19\xfe\ +\x96\x04^\xfd\xf8\x00\x01\xff\xc3\xfeV\x05\xcb\x05\xb6\x00\ +\x18\x00$@\x14\x06\x01LY\x06\x12\x04U\x18\x08L\ +Y\x18\x03\x0d\x12LY\x0d\x13\x00?+\x00\x18?+\ +\x00\x18??+10\x01\x01!\x01!\x01!\x01!\ +\x0a\x02\x06#\x22'5\x163266\x12\x12\x13\x05\ +\x9a\xff\x00\x011\xfe\xc8\xfe\xa6\x01\x06\xfe\xf4\x01\x00\xfe\ +\xf0O\xa4\x93\xb5\x96P?5/ATPi\x81G\ +\x05\xb6\xfbT\xfdL\x01\xaa\x04\xb4\xfe\xc0\xfd\xfe\xfe\xef\ +u\x18\xfe\x14?\x8c\x01'\x01\xc0\x01\x16\x00\x00\x01\xff\ +\xc5\xfeo\x05\x08\x04s\x00!\x00&@\x14\x03\x22\x05\ +\x00FY\x05\x15\x1e\x08GY\x1e\x10\x11\x16HY\x11\ +\x15\x00?+\x00\x18?+\x00\x18?+\x00\x18?1\ +0%3\x01!\x13#\x13&#\x22\x06\x06\x07\x0e\x03\ +#\x22'5\x163267\x12>\x0232\x16\x17\ +\x04\x0a\xfe\xfe\xf0\xfe\xd1\xd9\xf4\xbc(\x17CZJH\ +#C[\x81`Y<%/2O&fp\x85\xc0\ +\x89W\xbeE\xdf\xfd\x90\x01\x91\x03u\x08?\x8b\xd6g\ +\xb5\x87N\x18\xf8\x10io\x01/\xd2u9\x1f\x1b\x00\ +\x01\x005\xfe\x00\x05\xa4\x05\xb6\x00\x15\x00,@\x18\x0f\ +\x0aLY\x0c\x0f\x01\x0d\x03\x0f\x0f\x0c\x0d\x0f\x0aLY\ +\x00\x1c\x11\x0d\x03\x0c\x12\x00??3?+\x11\x12\x00\ +9\x18/_^]+10\x01\x22'\x11\x1632\ +67\x13!\x03!\x01!\x03!\x13!\x01\x02\x00\x02\ +\x1f\xaa{}\x93\x87\xa0'k\xfe)\x86\xfe\xcf\x015\ +\x012y\x01\xd7y\x011\xfe\xd7=\xfe\xdb\xfe\x001\ +\x01\x112\xb2\xbb\x01\xfa\xfd\x89\x05\xb6\xfd\xc3\x02=\xfa\ +\x83\xfe\xdf\xfe\xe8\x00\x01\x00%\xfe\x0a\x04\xcb\x04^\x00\ +\x15\x00\x22@\x12\x01\x12FY\x01\x01\x14\x03\x15\x0f\x14\ +\x15\x08\x0dHY\x08\x1b\x00?+\x00\x18??3\x12\ +9/+10\x01\x03!\x13!\x03\x06\x06#\x22'\ +\x11\x163267\x13!\x03!\x13\x02D]\x01]\ +Z\x01-\xee5\xf7\xd4\x9bgrobx\x22X\xfe\ +\xa6b\xfe\xd1\xef\x04^\xfeR\x01\xae\xfb\xa2\xf9\xfd:\ +\x01\x06<\x81\x98\x01\xa6\xfe3\x04^\x00\x01\x005\xfe\ +V\x05\xd7\x05\xb6\x00\x0f\x00,@\x18\x07\x02LY\x0c\ +\x07\x01\x0d\x03\x07\x07\x04\x09\x05\x03\x00\x0bLY\x04\x00\ +\x12\x0eU\x00??2+\x00\x18?3\x129/_\ +^]+10!\x13!\x03!\x01!\x03!\x13!\ +\x03!\x01!\x01\x03=\x86\xfe)\x86\xfe\xcf\x015\x01\ +2y\x01\xd7y\x011\xfe\x011\xfe\xc9\xfe\xa6\x01\x06\ +\x02w\xfd\x89\x05\xb6\xfd\xc3\x02=\xfbT\xfdL\x01\xaa\ +\x00\x00\x01\x00%\xfeo\x05\x0a\x04^\x00\x0f\x00%@\ +\x14\x07\x02FY\x07\x07\x00\x09\x05\x0f\x04\x15\x0e\x22\x00\ +\x0bFY\x00\x15\x00?+\x00\x18???3\x129\ +/+10!\x13!\x03!\x13!\x03!\x13!\x03\ +3\x01!\x13\x02\xb0`\xfe\xa6b\xfe\xd1\xef\x010]\ +\x01]Z\x01-\xbf\xfe\xfe\xf0\xfe\xd1\xd9\x01\xcd\xfe3\ +\x04^\xfeR\x01\xae\xfc\x81\xfd\x90\x01\x91\x00\x00\x01\x00\ +\xb8\xfeV\x05m\x05\xb6\x00\x18\x00\x22@\x12\x07\x13L\ +Y\x07\x07\x00\x16\x0d\x03\x02U\x00\x03MY\x00\x12\x00\ +?+\x00\x18??3\x129/+10!\x03!\ +\x13!\x13\x06#\x22&547\x13!\x03\x06\x15\x14\ +327\x13!\x01\x03\x19[\xfe\xd1\x94\x01\x16D\xbb\ +\xa1\xa7\xc2\x0dp\x011l\x0a\x99\x83\xa4\x8b\x012\xfe\ +\xca\xfeV\x02\xa0\x01;V\xaa\x989;\x02%\xfd\xfc\ +.$\x83J\x02\x8f\xfaJ\x00\x00\x01\x00\xa4\xfeo\x04\ +\xa0\x04^\x00\x1e\x00)@\x15\x16\x18\x1e\x18\x06GY\ +\x18\x18\x0d\x0a\x1e\x0f\x0f\x22\x0d\x10GY\x0d\x15\x00?\ ++\x00\x18??3\x129/+\x11\x12\x00910\ +\x01\x03\x06\x15\x14\x1632677!\x03!\x03!\ +\x1337667#\x06#\x22&5477\x02\ +!>\x10>9b\x7f-\x1b\x01-\xee\xfe\xe6T\xfe\ +\xe9\x98\xf3\x0d\x08\x1d\x06\x07\x80\xa4\x87\x9a\x1d3\x04^\ +\xfe\xddD2?@\xc5\xd4\x7f\xfb\xa2\xfeo\x02\x8b7\ +-u\x10\x8d\xac\x96O\x86\xf1\x00\x01\x005\xfeV\x07\ +H\x05\xb6\x00\x18\x00#@\x12\x01\x17\x0a\x03\x07\x0c\x08\ +\x03\x13\x0eLY\x13\x00\x07\x12\x11U\x00??33\ ++\x00\x18?3\x12\x17910!\x03#\x06\x02\x07\ +\x03!\x01!\x133\x01!\x03!\x01!\x01#\x13\x12\ +7#\x01\x02j=\x04\x0a6\x12\x8f\xfe\xed\x015\x01\ +\x94D\x04\x02'\x01\xa7\xfd\x011\xfe\xc8\xfe\xa6\x01\x06\ +\xf5\x91:/\x05\xfd\xc7\x04mH\xfe\xd3P\xfdX\x05\ +\xb6\xfb\xbb\x04E\xfbT\xfdL\x01\xaa\x02\xb4\x01\x0c\xad\ +\xfb\x93\x00\x00\x01\x00\x17\xfeo\x06u\x04^\x00\x1a\x00\ +$@\x13\x09\x01\x11\x03\x0b\x14\x0c\x0f\x06\x0b\x15\x19\x22\ +\x00\x16FY\x00\x15\x00?+\x00\x18??3?3\ +\x12\x17910!\x13\x06\x06\x07\x01#\x03&'\x03\ +!\x13!\x13\x16\x16\x1767\x01!\x033\x01!\x13\ +\x04#\xac\x1cR*\xfe\xec\xe8?\x18\x07\xaa\xfe\xe4\xef\ +\x01\x96;\x0b\x09\x05X1\x01\x0e\x01\xac\xbc\xfe\xfe\xef\ +\xfe\xd1\xd9\x03'>\x94O\xfd\xfa\x01\xf8\xcbh\xfc\xd5\ +\x04^\xfe#T\x90G\xcbX\x01\xe5\xfc\x81\xfd\x90\x01\ +\x91\xff\xff\xff\xc5\x00\x00\x03\x81\x05\xb6\x02\x06\x00,\x00\ +\x00\xff\xff\xff\x85\x00\x00\x05^\x07\x91\x02&\x00$\x00\ +\x00\x01\x07\x026\x00u\x01R\x00\x08\xb3\x02\x14\x05&\ +\x00+5\xff\xff\x00Z\xff\xec\x04\xfd\x06?\x02&\x00\ +D\x00\x00\x01\x06\x026\x14\x00\x00\x08\xb3\x02%\x11&\ +\x00+5\xff\xff\xff\x85\x00\x00\x04\xb7\x07V\x02&\x00\ +$\x00\x00\x01\x07\x00j\x00q\x01R\x00\x0a\xb4\x03\x02\ +#\x05&\x00+55\xff\xff\x00Z\xff\xec\x04\x9e\x06\ +\x04\x02&\x00D\x00\x00\x01\x06\x00j\x02\x00\x00\x0a\xb4\ +\x03\x024\x11&\x00+55\xff\xff\xff\x85\x00\x00\x07\ +o\x05\xb6\x02\x06\x00\x88\x00\x00\xff\xff\x00Z\xff\xec\x06\ +\xc7\x04s\x02\x06\x00\xa8\x00\x00\xff\xff\x005\x00\x00\x05\ +\x10\x07\x91\x02&\x00(\x00\x00\x01\x07\x026\x00'\x01\ +R\x00\x08\xb3\x01\x10\x05&\x00+5\xff\xff\x00Z\xff\ +\xec\x04\xe2\x06?\x02&\x00H\x00\x00\x01\x06\x026\xf9\ +\x00\x00\x08\xb3\x02&\x11&\x00+5\x00\x02\x00D\xff\ +\xec\x05\x08\x05\xcd\x00\x18\x00\x22\x00&@\x14\x13\x1dM\ +Y\x13\x13\x0d\x06\x06\x00LY\x06\x04\x0d\x19LY\x0d\ +\x13\x00?+\x00\x18?+\x11\x12\x009\x18/+1\ +0\x01\x22\x06\x07\x1163 \x00\x11\x10\x02\x04#\x22\ +&54$!3654&\x01267#\x22\ +\x06\x15\x14\x16\x02\xb6m\xb4S\xb3\xe6\x01\x0b\x01\x22\xcb\ +\xfe\xa2\xdf\xd4\xe8\x01\x96\x01\x8ak\x04\x8e\xfe\xbd\x8b\xd3\ +@\x9a\xc1\xceN\x04\xc9, \x01\x02N\xfe\xd8\xfe\xea\ +\xfe\xff\xfeF\xe8\xc4\xb4\xf7\xf3\x18)\x94\xa6\xfc%\xb4\ +\xb2wn\xfd`\x01\xaa\x00\x01\x00%\xfeo\x03\xf4\x04^\x00\ +\x09\x00\x1c@\x0e\x08\x22\x01\x04GY\x01\x0f\x00\x05G\ +Y\x00\x15\x00?+\x00\x18?+\x00\x18?103\ +\x13!\x07!\x033\x03!\x13%\xed\x02\xe23\xfeI\ +\x83\xe1\x89\xfe\xea`\x04^\xf8\xfd\x94\xfdu\x01\x91\xff\ +\xff\x005\x00\x00\x06\xe1\x07V\x02&\x01\xc5\x00\x00\x01\ +\x07\x00j\x01R\x01R\x00\x0a\xb4\x04\x03*\x05&\x00\ ++55\xff\xff\x00j\xff\xec\x06J\x06\x04\x02&\x01\ +\xe5\x00\x00\x01\x07\x00j\x00\xcf\x00\x00\x00\x0a\xb4\x04\x03\ +4\x11&\x00+55\x00\x01\x00\x1d\xfe\x10\x04\x98\x05\ +\xb6\x00\x1b\x007@\x1d\x16\x0c\x0d\x0cLY\x13\x0d\x0d\ +\x0a\x0f\x0a\x17LY\x0a\x12\x0f\x12LY\x0f\x03\x00\x05\ +MY\x00\x1b\x00?+\x00\x18?+\x00\x18?+\x11\ +\x12\x009\x18/3+\x11\x00310\x13\x22'5\ +\x1632677!\x13#73\x13!\x07!\x03\ +!\x07!\x03!\x03\x06\x06\xeciH7K4\xc6\xae\xa5\xfa\x84\x021\xfb\xec#\x1f9\ +;fq\x01\x8d\xc9\x8b}KH\x9d\x00\x02\x00Z\xff\ +\xec\x06\x8d\x06\x14\x00#\x001\x00,@\x16\x1b\x00\x0b\ +\x02\x09\x10\x00\x09+GY\x09\x10\x17$\x02$GY\ + \x02\x16\x00?3+\x11\x003\x18?+\x00\x18?\ +\x11\x1299/10%\x06#\x22&54\x126\ +32\x173466\x13!\x03\x06\x15\x14\x1632\ +677!\x03\x06\x06#\x22&'%2665\ +4&#\x22\x06\x06\x15\x14\x16\x03)\x8b\xcf\xba\xbb\x8b\ +\xe5\x8a\xaa`\x08\x07\x0dS\x01-\xf0\x0a@3KN\ +\x1b5\x011C-\xdf\xbds\xad,\xfe\xe4IwF\ +CIExKL\x96\xaa\xdb\xc8\xbe\x01h\xbe\xa4\x18\ +K[\x01\x87\xfb\x962$8=c\x81\xf9\xfe\xc1\xd0\ +\xc1VTI\x87\xed|P`\x82\xed\x81XX\x00\x00\ +\x01\x00\xc5\xff\xec\x06q\x05\xcb\x00,\x000@\x18\x0e\ +\x03\x1d\x1e\x1e\x1dMY\x1e\x1e\x13**%MY*\ +\x04\x13\x0aLY\x13\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x009\x18/10\x01\x14\x06\ +\x07\x15\x16\x16\x15\x07\x143267\x13!\x03\x06\x06\ +#\x22&54654&##73265\ +4&#\x22\x07'6!2\x16\x04D\xb7\xa8nt\ +\x04zBP\x18T\x016c,\xe9\xd2\xc1\xce\x0am\ +l\xe6/\x9e\xa4\xb2QO\x8c\xa3r\xd1\x01\x12\xbb\xe1\ +\x04s\x90\xce)\x05\x1d\x7fn}t`w\x01\x8d\xfe\ +-\xd0\xc1\xae\xa1&M-OU\xdbws?Ni\ +\xd3\x90\xc0\x00\x01\x00\x89\xff\xec\x06\x14\x04s\x00+\x00\ +0@\x18\x08)\x15\x16\x16\x15JY\x16\x16\x0d##\ +\x1dFY#\x10\x0d\x04GY\x0d\x16\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x009\x18/1\ +0\x01\x15\x14\x163267\x13!\x03\x06\x06#\x22\ +&554&##732654&#\x22\ +\x06\x07'632\x16\x15\x14\x06\x07\x15\x16\x03\x87A\ +2IM\x16=\x011C+\xe5\xcf\xbd\xcf\x5c}\x91\ +-\x83\x90pIQF\xb1JH\xde\xd4\xc1\xd1{\x83\ +\xb8\x01s)65Zi\x01\x1a\xfe\xc1\xcc\xc5\xa2\x93\ +)OD\xd3:E6,.!\xdbV\x8e\x87j\x88\ +$\x06\x22\x00\x01\x00\x83\xfeV\x04\xcd\x05\xcb\x00%\x00\ +0@\x19\x1a\x06\x07\x07\x06MY\x07\x07\x00\x13$U\ +\x13\x0dMY\x13\x04\x00!MY\x00\x12\x00?+\x00\ +\x18?+\x00\x18?\x11\x129/+\x11\x12\x0091\ +0!\x13654##73 54&#\x22\ +\x07'6632\x16\x16\x15\x14\x06\x07\x15\x16\x16\x15\ +\x14\x06\x07!\x03!\x13\x02DO\x11\xdb\xe64\x7f\x01\ +~^^\xaa\xbem\x8f\xfb\x97{\xc6m\xdb\xc5\x88\x9d\ +\x0a\x1b\x01\x1b\x90\xfe\xd1\x5c\x01m?-\xa8\xf0\xc8H\ +R{\xd1[GX\x9c`\xa9\xc3\x0d\x04\x0e\x92w\x1e\ +O\x80\xfd`\x01\xaa\x00\x00\x01\x00\xb2\xfeo\x04\x7f\x04\ +s\x00$\x000@\x19\x1b\x07\x08\x08\x07JY\x08\x08\ +\x00\x15#\x22\x15\x0fFY\x15\x10\x00 GY\x00\x15\ +\x00?+\x00\x18?+\x00\x18?\x11\x129/+\x11\ +\x12\x00910!7654&##732\ +654&#\x22\x06\x07'632\x16\x15\x14\x06\ +\x07\x15\x16\x15\x14\x073\x03!\x13\x02L7\x0e^^\ +\xb0-}\x8ctDVE\xa9MH\xe0\xd8\xc1\xd1\x80\ +\x84\xb8\x12\xe1\x89\xfe\xe9`\xfaD\x1cH;\xd3;D\ +.4-\x22\xdbV\x8e\x87m\x88!\x063\x98%X\ +\xfdu\x01\x91\x00\x00\x01\xff\xc3\xff\xec\x07d\x05\xb6\x00\ +&\x00!@\x10\x0a&\x16LY&\x03\x06 \x1b \ +LY\x0f\x1b\x13\x00?3+\x11\x003\x18?+\x00\ +\x18/10\x01\x03\x06\x15\x14\x163267\x13!\ +\x03\x06\x06#\x22&547\x13!\x0a\x02\x06#\x22\ +'5\x163266\x12\x12\x13\x05\x9a\xd7\x0f<;\ +ET\x17T\x015b+\xea\xcc\xc5\xd9\x19\x97\xfe\xf0\ +O\xa4\x93\xb5\x96P?5/ATPi\x81G\x05\ +\xb6\xfc\x06<\x223?fq\x01\x8d\xfe-\xce\xc3\xb1\ +\xa0>q\x02\xc8\xfe\xc0\xfd\xfe\xfe\xefu\x18\xfe\x14?\ +\x8c\x01'\x01\xc0\x01\x16\x00\x01\xff\xc5\xff\xec\x06\xb8\x04\ +s\x00/\x00\x22@\x12\x07*\x14GY*\x10\x0c\x03\ +GY\x1d\x22HY\x0c\x1d\x16\x00?3++\x00\x18\ +?+\x00\x18/10\x01\x14\x1632677!\ +\x03\x06\x06#\x22&547\x13&#\x22\x06\x06\x07\ +\x0e\x03#\x22'5\x163267\x12>\x0232\ +\x16\x17\x03\x06\x04+@3KN\x1b5\x011C-\ +\xe7\xce\xc4\xd3\x0cb(\x17CZJH#C[\x81\ +`Y<%/2O&fp\x85\xc0\x89W\xbeE\ +\x89\x0a\x01T8=c\x81\xf9\xfe\xc1\xcf\xc2\xaf\x9e6\ +;\x01\xcb\x08?\x8b\xd6g\xb5\x87N\x18\xf8\x10io\ +\x01/\xd2u9\x1f\x1b\xfdq2\x00\x00\x01\x005\xff\ +\xec\x07o\x05\xb6\x00\x1d\x00.@\x18\x0a\x1b\x16LY\ +\x0c\x1b\x01\x0d\x03\x1b\x1b\x18\x1d\x19\x03\x18\x12\x0f\x06L\ +Y\x0f\x13\x00?+\x00\x18??3\x129/_^\ +]+\x00\x18/10\x01\x03\x06\x15\x14\x16326\ +7\x13!\x03\x06\x06#\x22&5467!\x03!\ +\x01!\x03!\x13\x05\xa4\xd7\x0f<;ET\x17T\x01\ +6c+\xea\xcc\xc0\xda\x11!\xfe)\x86\xfe\xcf\x015\ +\x012y\x01\xd7y\x05\xb6\xfc\x06<\x223?fq\ +\x01\x8d\xfe-\xce\xc3\xb4\xa4-k\x9b\xfd\x89\x05\xb6\xfd\ +\xc3\x02=\x00\x01\x00%\xff\xec\x06\xbc\x04^\x00\x1d\x00\ +&@\x13\x0e\x01\x1aFY\x01\x01\x1c\x03\x1d\x0f\x1c\x15\ +\x13\x0aHY\x13\x16\x00?+\x00\x18??3\x129\ +/+\x00\x18/10\x01\x03!\x13!\x03\x06\x15\x14\ +\x1632677!\x03\x06\x06#\x22&547\ +7!\x03!\x13\x02D]\x01]Z\x01-\x92\x0aC\ +6CQ\x1a5\x011C-\xe7\xcd\xc2\xd6\x0c\x06\xfe\ +\xa4b\xfe\xd1\xef\x04^\xfeR\x01\xae\xfdV4&6\ +8`w\xf9\xfe\xc1\xcf\xc2\xae\x9f6;#\xfe3\x04\ +^\x00\x01\x00{\xff\xec\x05\xa2\x05\xcd\x00\x1c\x00&@\ +\x14\x00\x1cLY\x00\x00\x05\x0c\x0c\x12LY\x0c\x04\x05\ +\x18LY\x05\x13\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01!\x07\x02\x00! \x00\x11\x10\x12\ +$32\x17\x07&&#\x22\x06\x02\x15\x10!26\ +7!\x02\xf2\x02\xb0#D\xfe\xb0\xfe\xcf\xfe\xef\xfe\xd2\ +\xd8\x01\x7f\xfb\xee\xb2se\x8fJ\x94\xed\x89\x01\x1b\x89\ +\xb0!\xfe\x93\x035\xb6\xfe\xa2\xfe\xcb\x010\x01\x0f\x01\ +\x06\x01\xb2\xeac\xfb6\x22\xa9\xfe\xca\xb7\xfe\xbd\xa5\xa0\ +\x00\x00\x01\x00Z\xff\xec\x04\xb6\x04s\x00\x1c\x00&@\ +\x14\x00\x1cFY\x00\x00\x05\x0c\x0c\x12GY\x0c\x10\x05\ +\x18GY\x05\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+10\x01!\x07\x02\x00!\x22&54\x12\ +$32\x16\x17\x07&#\x22\x06\x15\x14\x16326\ +7!\x02\x7f\x027 8\xfe\xdb\xfe\xfe\xe1\xfc\xa5\x01\ +2\xcdm\xc2Dm\x82\x8a\xa7\xc8h[i\x87\x18\xfe\ +\xfc\x02\x96\x9e\xfe\xf5\xfe\xff\xe7\xd5\xd3\x01G\xb12&\ +\xe6H\xff\xd4alkj\x00\x00\x01\x00\xa8\xff\xec\x05\ +9\x05\xb6\x00\x19\x00\x1f@\x0f\x0e\x04\x00\x01\x00LY\ +\x01\x03\x13\x0aLY\x13\x13\x00?+\x00\x18?+\x11\ +\x003\x18/10\x13\x13!\x03!\x03\x06\x15\x14\x16\ +3267\x13!\x03\x06\x06#\x22&547\x13\ +\xa87\x03\xfe7\xfe\x91\x9f\x0f<;ET\x17T\x01\ +5b+\xea\xcc\xc5\xd9\x19\x99\x04\xb4\x01\x02\xfe\xfe\xfd\ +\x08<\x223?fq\x01\x8d\xfe-\xce\xc3\xb1\xa0>\ +q\x02\xc8\x00\x01\x00^\xff\xec\x04\xf0\x04^\x00\x19\x00\ +\x1f@\x0f\x07\x17\x13\x14\x13FY\x14\x0f\x0c\x03GY\ +\x0c\x16\x00?+\x00\x18?+\x11\x003\x18/10\ +\x01\x14\x1632677!\x03\x06\x06#\x22&5\ +47\x13!7!\x07!\x03\x06\x02b@3KN\ +\x1b5\x012D+\xea\xcc\xc1\xd5\x1bT\xfe\xba/\x03\ +\xbd1\xfe\xb4`\x0b\x01T8=c\x81\xf9\xfe\xc1\xce\ +\xc3\xb1\xa2Et\x01\x81\xe5\xe5\xfe17\x00\x00\x01\x00\ +D\xff\xec\x04\xfc\x05\xcb\x00'\x00-@\x17#\x10\x0d\ +\x0d\x10MY\x0d\x0d\x1c\x00\x00\x07LY\x00\x04\x1c\x16\ +LY\x1c\x13\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x012\x16\x17\x07&&#\ +\x22\x06\x15\x14\x1633\x07#\x22\x06\x15\x14\x1632\ +67\x11\x06!\x22$54675&54$\ +\x03#\x7f\xdc~\x8dA\xb1fjz\x8e\x93\x8b3{\ +\xe3\xcb\x89{]\xd1O\xba\xfe\xf8\xee\xfe\xf0\xd8\xdc\xf2\ +\x01,\x05\xcb>P\xe1/@^N[S\xf2ur\ +\x5cN5+\xfe\xf4V\xc8\xb2\xb0\xca \x04H\xe3\xc1\ +\xdb\xff\xff\x00'\xff\xec\x04/\x04s\x02\x06\x01\x82\x00\ +\x00\x00\x01\xff\xc3\xfe\x10\x05\xcd\x05\xb6\x00\x22\x00+@\ +\x18\x10\x01LY\x10\x12\x22\x12LY\x22\x03\x17\x1cL\ +Y\x17\x13\x06\x0bMY\x06\x1b\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?+10\x01\x03!\x03\x06\x06\ +#\x22'5\x1632677!\x01!\x0a\x02\x06\ +#\x22'5\x163266\x12\x12\x13\x05\x9a\xf8\x01\ ++X'\xbb\xa5iH7\x0232\x16\x17\x04\x12\x01'M'\xbd\xa4h\ +H7<\ +j\xfc\xf8;d\x14\xe8\x17=\x04\xd9B\x5cLR\x17\ +?\x88U\x87\x95\x17\xc56w(\x0e_t\x10\x00\x00\ +\x02\xfc\xa8\x04\xd9\x00\x9e\x06\xf8\x00\x10\x00\x1e\x00!@\ +\x0f\x02\x05\x05\x09\x0e\x04\x04\x13\x7f\x1a\x01\x1a\x80\x16\x11\ +\x00/3\x1a\xcd]29/\xcc29\x11310\ +\x13\x14\x07\x07#7654#\x22\x075632\ +\x16\x01&'\x06\x07#5767!\x16\x17\x15\x9e\ +\x9a\x0e{\x0e\x7f7,(/FQ[\xfeGKN\ +Z\x7f\xcbB\x8fC\x01>\ +q\x11,-#%\x10\x835\xaa%A6=)\xf3\ +x)\xd1\xcbA\x8f<\x01>$^,\x06o/#\ +yx1\x09\x18'-\xf3\x10\x1b\x1d\x0a\xfej`)\ +\x89\x17<\x7fMRz<\x17\x00\x02\xfd\x04\x04\xd9\xff\ +\xc5\x06\xc1\x00\x0e\x00\x17\x00\x14\xb7\x0f\x0c\x12\x0e\x08\x80\ +\x0c\x03\x00/3\x1a\xdc2\xce\x11910\x03\x06\x06\ +#\x22&5473\x15\x14327\x05567\ +3\x15\x06\x06\x07;\x22\xd1\x9f\x92\x9d\x04\x90\xaa\xabB\ +\xfe\xba?e\xd9\x19\xa0G\x06+\xa4\xae\x92\x89\x1f\x18\ +\x12\x98\xaaN\x13?\x92\x0b\x1e\x8b0\x00\x02\xfd\x04\x04\ +\xd9\xff\xc5\x06\xc1\x00\x0e\x00\x16\x00\x14\xb7\x0f\x0c\x12\x0e\ +\x08\x80\x0c\x03\x00/3\x1a\xdc2\xce\x11910\x03\ +\x06\x06#\x22&5473\x15\x14327\x07&\ +'53\x16\x17\x15;\x22\xd1\x9f\x92\x9d\x04\x90\xaa\xab\ +B\xed~5\xd3\x1c8\x06+\xa4\xae\x92\x89\x1f\x18\x12\ +\x98\xaaNsb\x0fji\x11\x00\x02\xfd\x04\x04\xd9\xff\ +\xc5\x07\x06\x00\x0e\x00!\x00\x1f@\x0d\x12\x15\x15\x14\x14\ +\x0c\x1a\x1f\x0e\x08\x80\x0c\x03\x00/3\x1a\xdc2\xcc2\ +\x119\x119\x11310\x03\x06\x06#\x22&54\ +73\x15\x14327'\x14\x06\x07\x07#766\ +54#\x22\x075632\x16;\x22\xd1\x9f\x92\x9d\ +\x04\x90\xaa\xabB5CD\x0dh\x0c63-* \ +*\x15\x86\x16uQ5T28%#'\x0c\ +\x815\xa8)>5%0\x06\x02\x90\x99\x82v\x1b\x16\ +\x0dt8I{Lpm\x1c\x1a\x1e.(\xdf\x11\x1a\ +\x13\x0e\x00\x00\x01\xffF\xfe\x14\x00\xf8\x00\x00\x00\x0f\x00\ +\x0b\xb3\x00\x0b\x1b\x06\x00/?310\x03254\ +&'3\x16\x15\x14\x06#\x22'5\x16Jm1-\ +\xb4\x7f\x96\x83\x5c=:\xfe\xcbf5a9v\x88r\ +|\x19\xb4\x16\x00\x00\x01\xff`\xfe\x10\x01\xf0\x01/\x00\ +\x0d\x00\x0b\xb3\x0a\x05\x00\x1b\x00?2210\x13\x22\ +'5\x163267\x13!\x03\x06\x06\x10hH7\ +\x02\ +32\x16\x15\x14\x06\x07\x07\x15!\x03\xb4\xfc8(\x01\ +m\xc3\x85<5A\x94^\x8fl\x91\x9dY\xb6\xc5\x90\ +\xb3\xcf\x01\xfa\xcb\xfa\x84\x8cJ/7JK\xc8WN\ +*\xae\x9c\x81\xc9n}\x04\x00\x00\x01\xff\xaf\xfe\xa9\x03\ +\xf1\x04\x88\x00'\x00-@\x17\x03\x17\x18\x18\x17QY\ +\x18\x18\x0b%%\x1fOY%&\x0b\x11OY\x0b%\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x00910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x06\x04#\ +\x22'\x11\x16\x1632654!#7326\ +54&#\x22\x07'6632\x16\x03\xf1\xbd\xa7\ +\x83\x87\x94\xfe\xec\xbd\xef\x94T\xc4]\x9e\xaa\xfe\xfe\x8a\ +.I\xa7\xc0VN\x86\x99\x7f|\xd9\x8a\xbe\xd8\x03:\ +\x9c\xd4\x1d\x04\x1a\xa1y\x85\xd2uO\x01\x0b23\x7f\ +q\xac\xdd|nCJd\xccQA\xb5\x00\x00\x02\xff\ +\xc9\xfe\xa8\x04)\x04s\x00\x0a\x00\x12\x00'@\x13\x0f\ +\x03\x07\x01\x06\x12\x05\x12\x05PY\x09\x12\x12\x03\x07\x10\ +\x03%\x00??\x129/3+\x11\x12\x0093\x11\ +\x12910%#\x03!\x13!7\x01!\x033!\ +667#\x06\x07\x01\x03\xe5\xaaM\xfe\xd9P\xfd\xb2\ +1\x02\xf6\x019\xba\xaa\xfe1 &?\x06D=\xfe\ +\xca\x1b\xfe\x8d\x01s\xeb\x03m\xfc\x97\x96\xaf\xd0pE\ +\xfe\xa0\x00\x00\x01\xff\xe3\xfe\xa9\x040\x04s\x00\x1c\x00\ +&@\x14\x00\x13PY\x00\x00\x07\x17\x17\x1aNY\x17\ +\x10\x07\x0dOY\x07%\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+10\x012\x16\x15\x14\x06\x04#\x22\ +&'\x11\x1632654&#\x22\x07'\x13!\ +\x03!\x036\x027\xb7\xd4\x8f\xfe\xee\xc1u\xcb=\xae\ +\xb2\x9a\xaesmfoh\xcf\x02\xf37\xfe\x17XH\ +\x02W\xce\xb8\xa7\xfa\x87.#\x01\x0dc\x8e{^^\ +!N\x02\xdd\xfe\xfa\xfe\xdb\x0f\xff\xff\x00Z\xff\xec\x04\ +\x83\x05\xcd\x00\x06\x00\x19\x02\x00\x00\x01\x00\x01\xfe\xbf\x04\ +t\x04u\x00\x06\x00\x18@\x0b\x00$\x05\x02\x03\x03\x02\ +NY\x03\x10\x00?+\x11\x12\x009\x18?10\x13\ +\x01!\x13!\x07\x01\x01\x02\xe1\xfd\x8b8\x03\xcf)\xfd\ +\x10\xfe\xbf\x04\xb2\x01\x04\xc2\xfb\x0c\x00\xff\xff\x00?\xff\ +\xec\x04n\x05\xcd\x00\x06\x00\x1b\x08\x00\x00\x02\x00E\xfe\ +\xae\x043\x04\x8f\x00\x19\x00'\x00-@\x17\x0e\x10\x17\ +\x10!PY\x10\x10\x04\x17\x17\x1aOY\x17&\x04\x09\ +OY\x04%\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x00910\x01\x10\x02\x04#\x22'\x11\ +\x1632667#\x06#\x22&54\x1263\ +2\x16\x05\x22\x06\x06\x15\x14\x16326654&\ +\x043\xc6\xfe\xb6\xee\x80poty\xads*\x04o\ +\xb8\xa3\xb3\x92\xf6\xa3\xcb\xd3\xfeAAe7KD<\ +g=G\x02\xab\xfe\xe8\xfe\x06\xeb \x01\x00)b\xb3\ +\xa8\x9e\xcf\xb6\xa6\x01\x17\x89\xf6\x02T\x90QWYI\ +\x7f_Tj\x00\x00\x01\xff%\xfe\x14\x06\x93\x06\x1f\x00\ +8\x008@\x1d#\x15\x10\x15GY\x1e\x10\x00\x09*\ +6\x196FY\x0c'\x19\x0f2\x05\x00\x05GY-\ +\x00\x1b\x00?2+\x11\x003\x18?33+\x11\x00\ +33\x18?3+\x11\x00310\x03\x22'5\x16\ +3267\x13#?\x026632\x17\x07&#\ +\x22\x06\x07\x07!76632\x17\x07&#\x22\x06\ +\x07\x073\x07#\x03\x02!\x22'5\x16327\x13\ +!\x03\x02-hF=6=\x5c\x13\xcc\xa3\x1e\xb7\x12\ +)\xc3\xb0\x83hPE@9F\x0c\x0c\x01\x8b\x12)\ +\xc3\xb0\x83hOEA9E\x0d\x0c\xdb1\xdb\xd7M\ +\xfe\xb9hF=6\x88$\xcd\xfet\xd7M\xfe\x14\x19\ +\xf2\x15PZ\x03\xc5\x91TT\xbe\xaf1\xe0\x1fPA\ +>T\xbe\xaf1\xe0\x1fPA>\xe5\xfc\x0e\xfe\x8d\x19\ +\xf2\x15\xaa\x03\xc5\xfc\x0e\xfe\x8d\x00\x02\x00\x9e\x02\xdd\x05\ +\xd1\x05\xc1\x00\x22\x003\x00>@\x1e1%%+*\ +#\x12\x1d\x00\x0b\x1d\x0b\x1b\x08\x08\x03/#\x03\x03(\ +(*5\x1b\x15\x15-*\x03\x00?33/3\x11\ +\x129/\x173/3\x11\x1299\x113\x113\x11\ +\x1299\x11310\x01\x14\x06#\x22'5\x163\ +2654&''&&54632\x17\x07\ +&&#\x22\x15\x14\x16\x17\x16\x16\x01\x03#\x17\x11#\ +\x113\x13\x133\x11#\x117#\x03\x02d\x8bun\ +XsW-0$%2bF\x80q_p38\ +<(Q.FgG\x01\x88\xa6\x07\x05\xa4\xf8\x9f\xaa\ +\xf0\xa8\x04\x06\xae\x03\xb2dq+\x906'#\x1b'\ +\x11\x1a1eC]r4}\x1b\x10C .!2\ +^\xfe\xec\x02\x11o\xfe^\x02\xd1\xfe\x02\x01\xfe\xfd/\ +\x01\x98y\xfd\xef\xff\xff\x00\x8d\xfe\x14\x04\xd1\x05\xb6\x02\ +&\x007\x00\x00\x00\x07\x00z\x01\x5c\x00\x00\xff\xff\x00\ +V\xfe\x14\x03o\x05L\x02&\x00W\x00\x00\x00\x07\x00\ +z\x01%\x00\x00\x00\x02\x00\x1b\xfe\x14\x04\x9e\x04s\x00\ +\x0d\x00+\x00.@\x18&\x19#\x1c(\x0f#\x07G\ +Y#\x10\x1c\x00GY\x1c\x16\x0e\x13GY\x0e\x1b\x00\ +?+\x00\x18?+\x00\x18?+\x00\x18?\x11\x129\ +910%26654&#\x22\x06\x06\x15\x14\ +\x16\x03\x22'\x11\x16326767#\x06\x06#\ +\x22&54\x12632\x16\x17373\x03\x02\x02\ +\x19HxFFFExKL;\xff\x82\x9d\xbfe\ +\x92\x13\x16!\x08H\x8eS\x8b\xa2\x87\xe1\x8a_\x8e<\ +\x089\xe8\xf4d\xdf\x88\xec|P`\x82\xed\x81XX\ +\xfd5B\x01\x10ZcOkm^L\xd6\xbf\xca\x01\ +e\xc3JZ\x8f\xfb\x87\xfe/\xff\xff\x00\x1b\xfe\x14\x04\ +\x9e\x06!\x02&\x03\x91\x00\x00\x01\x06\x01K\x19\x00\x00\ +\x08\xb3\x022\x11&\x00+5\xff\xff\x00\x1b\xfe\x14\x04\ +\x9e\x06+\x02&\x03\x91\x00\x00\x01\x06\x01N\x08\x00\x00\ +\x08\xb3\x02.\x11&\x00+5\xff\xff\x00\x1b\xfe\x14\x04\ +\x9e\x06\x14\x02&\x03\x91\x00\x00\x01\x07\x01O\x01#\x00\ +\x00\x00\x08\xb3\x025\x11&\x00+5\xff\xff\x00\x1b\xfe\ +\x14\x04\x9e\x06!\x02&\x03\x91\x00\x00\x01\x06\x02:{\ +\x00\x00\x08\xb3\x020\x11&\x00+5\x00\x01\x005\x00\ +\x00\x02\x9e\x05\xb6\x00\x03\x00\x0a\xb3\x01\x03\x00\x12\x00?\ +?103\x01!\x015\x018\x011\xfe\xc8\x05\xb6\ +\xfaJ\x00\xff\xff\x005\x00\x00\x02\x9e\x07s\x02&\x03\ +\x96\x00\x00\x01\x07\x00C\xfe\xf5\x01R\x00\x08\xb3\x01\x05\ +\x05&\x00+5\xff\xff\x005\x00\x00\x03\xcb\x07s\x02\ +&\x03\x96\x00\x00\x01\x07\x00v\xff\xbb\x01R\x00\x08\xb3\ +\x01\x0c\x05&\x00+5\xff\xff\x005\x00\x00\x03\xa9\x07\ +s\x02&\x03\x96\x00\x00\x01\x07\x01K\xffI\x01R\x00\ +\x08\xb3\x01\x0a\x05&\x00+5\xff\xff\x005\x00\x00\x03\ +\x97\x07V\x02&\x03\x96\x00\x00\x01\x07\x00j\xffQ\x01\ +R\x00\x0a\xb4\x02\x01\x17\x05&\x00+55\xff\xff\x00\ +5\x00\x00\x03\xd0\x07`\x02&\x03\x96\x00\x00\x01\x07\x01\ +R\xffO\x01R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\ +\xff\x005\x00\x00\x03~\x06\xfe\x02&\x03\x96\x00\x00\x01\ +\x07\x01M\xffe\x01R\x00\x08\xb3\x01\x07\x05&\x00+\ +5\xff\xff\x005\x00\x00\x03\xaf\x07}\x02&\x03\x96\x00\ +\x00\x01\x07\x01N\xff4\x01R\x00\x08\xb3\x01\x06\x05&\ +\x00+5\xff\xff\xff\xb8\xfe\x14\x02\x9e\x05\xb6\x02&\x03\ +\x96\x00\x00\x00\x06\x01Qd\x00\xff\xff\x005\x00\x00\x02\ +\xe5\x07f\x02&\x03\x96\x00\x00\x01\x07\x01O\x00X\x01\ +R\x00\x08\xb3\x01\x0d\x05&\x00+5\xff\xff\x005\xfe\ +R\x05E\x05\xb6\x00&\x03\x96\x00\x00\x00\x07\x00-\x02\ +\x93\x00\x00\xff\xff\x00\x22\x00\x00\x03/\x05\xf5\x00'\x03\ +\x96\x00\x91\x00\x00\x01\x07\x01T\xfd\xed\xff\x97\x00\x0d\xb7\ +\x01\x062\x06\x06\x01\x01>\x00+\x115\x00\xff\xff\x00\ +5\x00\x00\x02\x9e\x05\xb6\x02\x06\x03\x96\x00\x00\xff\xff\x00\ +5\x00\x00\x03\x97\x07V\x02&\x03\x96\x00\x00\x01\x07\x00\ +j\xffQ\x01R\x00\x0a\xb4\x02\x01\x17\x05&\x00+5\ +5\xff\xff\x005\x00\x00\x02\x9e\x05\xb6\x02\x06\x03\x96\x00\ +\x00\xff\xff\x005\x00\x00\x03\x97\x07V\x02&\x03\x96\x00\ +\x00\x01\x07\x00j\xffQ\x01R\x00\x0a\xb4\x02\x01\x17\x05\ +&\x00+55\xff\xff\x005\x00\x00\x02\x9e\x05\xb6\x02\ +\x06\x03\x96\x00\x00\xff\xff\x005\x00\x00\x02\x9e\x05\xb6\x02\ +\x06\x03\x96\x00\x00\xff\xff\x005\x00\x00\x03;\x07\xf6\x02\ +&\x03\x96\x00\x00\x01\x07\x02f\x03\xe9\x01R\x00\x08\xb3\ +\x01\x08\x05&\x00+5\xff\xff\xff\xf1\xfeR\x02\x9e\x05\ +\xb6\x02&\x03\x96\x00\x00\x00\x07\x02g\x03\x8f\x00\x00\x00\ +\x00\x00\x01\x00\x00\xb62\x00\x01I\x06\x80\x00\x00\x0e6\ +$\x00\x05\x00$\xffq\x00\x05\x007\x00)\x00\x05\x00\ +9\x00)\x00\x05\x00:\x00)\x00\x05\x00<\x00\x14\x00\ +\x05\x00D\xff\xae\x00\x05\x00F\xff\x85\x00\x05\x00G\xff\ +\x85\x00\x05\x00H\xff\x85\x00\x05\x00J\xff\xc3\x00\x05\x00\ +P\xff\xc3\x00\x05\x00Q\xff\xc3\x00\x05\x00R\xff\x85\x00\ +\x05\x00S\xff\xc3\x00\x05\x00T\xff\x85\x00\x05\x00U\xff\ +\xc3\x00\x05\x00V\xff\xc3\x00\x05\x00X\xff\xc3\x00\x05\x00\ +\x82\xffq\x00\x05\x00\x83\xffq\x00\x05\x00\x84\xffq\x00\ +\x05\x00\x85\xffq\x00\x05\x00\x86\xffq\x00\x05\x00\x87\xff\ +q\x00\x05\x00\x9f\x00\x14\x00\x05\x00\xa2\xff\x85\x00\x05\x00\ +\xa3\xff\xae\x00\x05\x00\xa4\xff\xae\x00\x05\x00\xa5\xff\xae\x00\ +\x05\x00\xa6\xff\xae\x00\x05\x00\xa7\xff\xae\x00\x05\x00\xa8\xff\ +\xae\x00\x05\x00\xa9\xff\x85\x00\x05\x00\xaa\xff\x85\x00\x05\x00\ +\xab\xff\x85\x00\x05\x00\xac\xff\x85\x00\x05\x00\xad\xff\x85\x00\ +\x05\x00\xb4\xff\x85\x00\x05\x00\xb5\xff\x85\x00\x05\x00\xb6\xff\ +\x85\x00\x05\x00\xb7\xff\x85\x00\x05\x00\xb8\xff\x85\x00\x05\x00\ +\xba\xff\x85\x00\x05\x00\xbb\xff\xc3\x00\x05\x00\xbc\xff\xc3\x00\ +\x05\x00\xbd\xff\xc3\x00\x05\x00\xbe\xff\xc3\x00\x05\x00\xc2\xff\ +q\x00\x05\x00\xc3\xff\xae\x00\x05\x00\xc4\xffq\x00\x05\x00\ +\xc5\xff\xae\x00\x05\x00\xc6\xffq\x00\x05\x00\xc7\xff\xae\x00\ +\x05\x00\xc9\xff\x85\x00\x05\x00\xcb\xff\x85\x00\x05\x00\xcd\xff\ +\x85\x00\x05\x00\xcf\xff\x85\x00\x05\x00\xd1\xff\x85\x00\x05\x00\ +\xd3\xff\x85\x00\x05\x00\xd5\xff\x85\x00\x05\x00\xd7\xff\x85\x00\ +\x05\x00\xd9\xff\x85\x00\x05\x00\xdb\xff\x85\x00\x05\x00\xdd\xff\ +\x85\x00\x05\x00\xdf\xff\xc3\x00\x05\x00\xe1\xff\xc3\x00\x05\x00\ +\xe3\xff\xc3\x00\x05\x00\xe5\xff\xc3\x00\x05\x00\xfa\xff\xc3\x00\ +\x05\x01\x06\xff\xc3\x00\x05\x01\x08\xff\xc3\x00\x05\x01\x0d\xff\ +\xc3\x00\x05\x01\x0f\xff\x85\x00\x05\x01\x11\xff\x85\x00\x05\x01\ +\x13\xff\x85\x00\x05\x01\x15\xff\x85\x00\x05\x01\x17\xff\xc3\x00\ +\x05\x01\x19\xff\xc3\x00\x05\x01\x1d\xff\xc3\x00\x05\x01!\xff\ +\xc3\x00\x05\x01$\x00)\x00\x05\x01&\x00)\x00\x05\x01\ ++\xff\xc3\x00\x05\x01-\xff\xc3\x00\x05\x01/\xff\xc3\x00\ +\x05\x011\xff\xc3\x00\x05\x013\xff\xc3\x00\x05\x015\xff\ +\xc3\x00\x05\x016\x00)\x00\x05\x018\x00\x14\x00\x05\x01\ +:\x00\x14\x00\x05\x01C\xffq\x00\x05\x01D\xff\xae\x00\ +\x05\x01F\xff\xae\x00\x05\x01H\xff\x85\x00\x05\x01J\xff\ +\xc3\x00\x05\x01V\xffq\x00\x05\x01_\xffq\x00\x05\x01\ +b\xffq\x00\x05\x01i\xffq\x00\x05\x01y\xff\xae\x00\ +\x05\x01z\xff\xd7\x00\x05\x01{\xff\xd7\x00\x05\x01~\xff\ +\xae\x00\x05\x01\x81\xff\xc3\x00\x05\x01\x82\xff\xd7\x00\x05\x01\ +\x83\xff\xd7\x00\x05\x01\x84\xff\xd7\x00\x05\x01\x87\xff\xd7\x00\ +\x05\x01\x89\xff\xd7\x00\x05\x01\x8c\xff\xae\x00\x05\x01\x8e\xff\ +\xc3\x00\x05\x01\x8f\xff\xae\x00\x05\x01\x90\xff\xae\x00\x05\x01\ +\x93\xff\xae\x00\x05\x01\x99\xff\xae\x00\x05\x01\xa4\xff\x85\x00\ +\x05\x01\xaa\xffq\x00\x05\x01\xae\xff\x85\x00\x05\x01\xb5\xff\ +\x85\x00\x05\x01\xca\xff\xd7\x00\x05\x01\xce\xffq\x00\x05\x01\ +\xcf\xff\x85\x00\x05\x01\xd5\xffq\x00\x05\x01\xd8\xff\x85\x00\ +\x05\x01\xdb\xff\x85\x00\x05\x01\xde\xff\x85\x00\x05\x01\xea\xff\ +\x85\x00\x05\x01\xed\xff\x85\x00\x05\x01\xee\xff\xc3\x00\x05\x01\ +\xf2\xffq\x00\x05\x01\xfa\x00)\x00\x05\x01\xfc\x00)\x00\ +\x05\x01\xfe\x00)\x00\x05\x02\x00\x00\x14\x00\x05\x02W\xff\ +\xc3\x00\x05\x02X\xffq\x00\x05\x02Y\xff\xae\x00\x05\x02\ +`\xff\x85\x00\x05\x02b\xff\xc3\x00\x05\x02j\xff\x85\x00\ +\x05\x02r\xffq\x00\x05\x02s\xffq\x00\x05\x02}\xff\ +\xec\x00\x05\x02\x7f\xff\x85\x00\x05\x02\x85\xff\x85\x00\x05\x02\ +\x87\xff\x85\x00\x05\x02\x89\xff\x85\x00\x05\x02\x8d\xff\x85\x00\ +\x05\x02\xb2\xff\x85\x00\x05\x02\xb4\xff\x85\x00\x05\x02\xce\xff\ +\x85\x00\x05\x02\xcf\xffq\x00\x05\x02\xd9\xffq\x00\x05\x02\ +\xda\xff\xd7\x00\x05\x02\xdb\xffq\x00\x05\x02\xdc\xff\xd7\x00\ +\x05\x02\xdd\xffq\x00\x05\x02\xde\xff\xd7\x00\x05\x02\xe0\xff\ +\x85\x00\x05\x02\xe2\xff\xd7\x00\x05\x02\xe4\xff\xd7\x00\x05\x02\ +\xf0\xff\x85\x00\x05\x02\xf2\xff\x85\x00\x05\x02\xf4\xff\x85\x00\ +\x05\x03\x09\xffq\x00\x05\x03\x0a\xff\x85\x00\x05\x03\x0b\xff\ +q\x00\x05\x03\x0c\xff\x85\x00\x05\x03\x11\xff\x85\x00\x05\x03\ +\x12\xffq\x00\x05\x03\x16\xff\x85\x00\x05\x03\x1a\xff\x85\x00\ +\x05\x03\x1b\xff\x85\x00\x05\x03\x1c\xffq\x00\x05\x03\x1d\xff\ +q\x00\x05\x03\x1e\xff\xae\x00\x05\x03\x1f\xffq\x00\x05\x03\ + \xff\xae\x00\x05\x03!\xffq\x00\x05\x03\x22\xff\xae\x00\ +\x05\x03#\xffq\x00\x05\x03%\xffq\x00\x05\x03&\xff\ +\xae\x00\x05\x03'\xffq\x00\x05\x03(\xff\xae\x00\x05\x03\ +)\xffq\x00\x05\x03*\xff\xae\x00\x05\x03+\xffq\x00\ +\x05\x03,\xff\xae\x00\x05\x03-\xffq\x00\x05\x03.\xff\ +\xae\x00\x05\x03/\xffq\x00\x05\x030\xff\xae\x00\x05\x03\ +1\xffq\x00\x05\x032\xff\xae\x00\x05\x033\xffq\x00\ +\x05\x034\xff\xae\x00\x05\x036\xff\x85\x00\x05\x038\xff\ +\x85\x00\x05\x03:\xff\x85\x00\x05\x03<\xff\x85\x00\x05\x03\ +@\xff\x85\x00\x05\x03B\xff\x85\x00\x05\x03D\xff\x85\x00\ +\x05\x03J\xff\x85\x00\x05\x03L\xff\x85\x00\x05\x03N\xff\ +\x85\x00\x05\x03R\xff\x85\x00\x05\x03T\xff\x85\x00\x05\x03\ +V\xff\x85\x00\x05\x03X\xff\x85\x00\x05\x03Z\xff\x85\x00\ +\x05\x03\x5c\xff\x85\x00\x05\x03^\xff\x85\x00\x05\x03`\xff\ +\x85\x00\x05\x03b\xff\xc3\x00\x05\x03d\xff\xc3\x00\x05\x03\ +f\xff\xc3\x00\x05\x03h\xff\xc3\x00\x05\x03j\xff\xc3\x00\ +\x05\x03l\xff\xc3\x00\x05\x03n\xff\xc3\x00\x05\x03o\x00\ +\x14\x00\x05\x03q\x00\x14\x00\x05\x03s\x00\x14\x00\x05\x03\ +\x8f\x00)\x00\x0a\x00$\xffq\x00\x0a\x007\x00)\x00\ +\x0a\x009\x00)\x00\x0a\x00:\x00)\x00\x0a\x00<\x00\ +\x14\x00\x0a\x00D\xff\xae\x00\x0a\x00F\xff\x85\x00\x0a\x00\ +G\xff\x85\x00\x0a\x00H\xff\x85\x00\x0a\x00J\xff\xc3\x00\ +\x0a\x00P\xff\xc3\x00\x0a\x00Q\xff\xc3\x00\x0a\x00R\xff\ +\x85\x00\x0a\x00S\xff\xc3\x00\x0a\x00T\xff\x85\x00\x0a\x00\ +U\xff\xc3\x00\x0a\x00V\xff\xc3\x00\x0a\x00X\xff\xc3\x00\ +\x0a\x00\x82\xffq\x00\x0a\x00\x83\xffq\x00\x0a\x00\x84\xff\ +q\x00\x0a\x00\x85\xffq\x00\x0a\x00\x86\xffq\x00\x0a\x00\ +\x87\xffq\x00\x0a\x00\x9f\x00\x14\x00\x0a\x00\xa2\xff\x85\x00\ +\x0a\x00\xa3\xff\xae\x00\x0a\x00\xa4\xff\xae\x00\x0a\x00\xa5\xff\ +\xae\x00\x0a\x00\xa6\xff\xae\x00\x0a\x00\xa7\xff\xae\x00\x0a\x00\ +\xa8\xff\xae\x00\x0a\x00\xa9\xff\x85\x00\x0a\x00\xaa\xff\x85\x00\ +\x0a\x00\xab\xff\x85\x00\x0a\x00\xac\xff\x85\x00\x0a\x00\xad\xff\ +\x85\x00\x0a\x00\xb4\xff\x85\x00\x0a\x00\xb5\xff\x85\x00\x0a\x00\ +\xb6\xff\x85\x00\x0a\x00\xb7\xff\x85\x00\x0a\x00\xb8\xff\x85\x00\ +\x0a\x00\xba\xff\x85\x00\x0a\x00\xbb\xff\xc3\x00\x0a\x00\xbc\xff\ +\xc3\x00\x0a\x00\xbd\xff\xc3\x00\x0a\x00\xbe\xff\xc3\x00\x0a\x00\ +\xc2\xffq\x00\x0a\x00\xc3\xff\xae\x00\x0a\x00\xc4\xffq\x00\ +\x0a\x00\xc5\xff\xae\x00\x0a\x00\xc6\xffq\x00\x0a\x00\xc7\xff\ +\xae\x00\x0a\x00\xc9\xff\x85\x00\x0a\x00\xcb\xff\x85\x00\x0a\x00\ +\xcd\xff\x85\x00\x0a\x00\xcf\xff\x85\x00\x0a\x00\xd1\xff\x85\x00\ +\x0a\x00\xd3\xff\x85\x00\x0a\x00\xd5\xff\x85\x00\x0a\x00\xd7\xff\ +\x85\x00\x0a\x00\xd9\xff\x85\x00\x0a\x00\xdb\xff\x85\x00\x0a\x00\ +\xdd\xff\x85\x00\x0a\x00\xdf\xff\xc3\x00\x0a\x00\xe1\xff\xc3\x00\ +\x0a\x00\xe3\xff\xc3\x00\x0a\x00\xe5\xff\xc3\x00\x0a\x00\xfa\xff\ +\xc3\x00\x0a\x01\x06\xff\xc3\x00\x0a\x01\x08\xff\xc3\x00\x0a\x01\ +\x0d\xff\xc3\x00\x0a\x01\x0f\xff\x85\x00\x0a\x01\x11\xff\x85\x00\ +\x0a\x01\x13\xff\x85\x00\x0a\x01\x15\xff\x85\x00\x0a\x01\x17\xff\ +\xc3\x00\x0a\x01\x19\xff\xc3\x00\x0a\x01\x1d\xff\xc3\x00\x0a\x01\ +!\xff\xc3\x00\x0a\x01$\x00)\x00\x0a\x01&\x00)\x00\ +\x0a\x01+\xff\xc3\x00\x0a\x01-\xff\xc3\x00\x0a\x01/\xff\ +\xc3\x00\x0a\x011\xff\xc3\x00\x0a\x013\xff\xc3\x00\x0a\x01\ +5\xff\xc3\x00\x0a\x016\x00)\x00\x0a\x018\x00\x14\x00\ +\x0a\x01:\x00\x14\x00\x0a\x01C\xffq\x00\x0a\x01D\xff\ +\xae\x00\x0a\x01F\xff\xae\x00\x0a\x01H\xff\x85\x00\x0a\x01\ +J\xff\xc3\x00\x0a\x01V\xffq\x00\x0a\x01_\xffq\x00\ +\x0a\x01b\xffq\x00\x0a\x01i\xffq\x00\x0a\x01y\xff\ +\xae\x00\x0a\x01z\xff\xd7\x00\x0a\x01{\xff\xd7\x00\x0a\x01\ +~\xff\xae\x00\x0a\x01\x81\xff\xc3\x00\x0a\x01\x82\xff\xd7\x00\ +\x0a\x01\x83\xff\xd7\x00\x0a\x01\x84\xff\xd7\x00\x0a\x01\x87\xff\ +\xd7\x00\x0a\x01\x89\xff\xd7\x00\x0a\x01\x8c\xff\xae\x00\x0a\x01\ +\x8e\xff\xc3\x00\x0a\x01\x8f\xff\xae\x00\x0a\x01\x90\xff\xae\x00\ +\x0a\x01\x93\xff\xae\x00\x0a\x01\x99\xff\xae\x00\x0a\x01\xa4\xff\ +\x85\x00\x0a\x01\xaa\xffq\x00\x0a\x01\xae\xff\x85\x00\x0a\x01\ +\xb5\xff\x85\x00\x0a\x01\xca\xff\xd7\x00\x0a\x01\xce\xffq\x00\ +\x0a\x01\xcf\xff\x85\x00\x0a\x01\xd5\xffq\x00\x0a\x01\xd8\xff\ +\x85\x00\x0a\x01\xdb\xff\x85\x00\x0a\x01\xde\xff\x85\x00\x0a\x01\ +\xea\xff\x85\x00\x0a\x01\xed\xff\x85\x00\x0a\x01\xee\xff\xc3\x00\ +\x0a\x01\xf2\xffq\x00\x0a\x01\xfa\x00)\x00\x0a\x01\xfc\x00\ +)\x00\x0a\x01\xfe\x00)\x00\x0a\x02\x00\x00\x14\x00\x0a\x02\ +W\xff\xc3\x00\x0a\x02X\xffq\x00\x0a\x02Y\xff\xae\x00\ +\x0a\x02`\xff\x85\x00\x0a\x02b\xff\xc3\x00\x0a\x02j\xff\ +\x85\x00\x0a\x02r\xffq\x00\x0a\x02s\xffq\x00\x0a\x02\ +}\xff\xec\x00\x0a\x02\x7f\xff\x85\x00\x0a\x02\x85\xff\x85\x00\ +\x0a\x02\x87\xff\x85\x00\x0a\x02\x89\xff\x85\x00\x0a\x02\x8d\xff\ +\x85\x00\x0a\x02\xb2\xff\x85\x00\x0a\x02\xb4\xff\x85\x00\x0a\x02\ +\xce\xff\x85\x00\x0a\x02\xcf\xffq\x00\x0a\x02\xd9\xffq\x00\ +\x0a\x02\xda\xff\xd7\x00\x0a\x02\xdb\xffq\x00\x0a\x02\xdc\xff\ +\xd7\x00\x0a\x02\xdd\xffq\x00\x0a\x02\xde\xff\xd7\x00\x0a\x02\ +\xe0\xff\x85\x00\x0a\x02\xe2\xff\xd7\x00\x0a\x02\xe4\xff\xd7\x00\ +\x0a\x02\xf0\xff\x85\x00\x0a\x02\xf2\xff\x85\x00\x0a\x02\xf4\xff\ +\x85\x00\x0a\x03\x09\xffq\x00\x0a\x03\x0a\xff\x85\x00\x0a\x03\ +\x0b\xffq\x00\x0a\x03\x0c\xff\x85\x00\x0a\x03\x11\xff\x85\x00\ +\x0a\x03\x12\xffq\x00\x0a\x03\x16\xff\x85\x00\x0a\x03\x1a\xff\ +\x85\x00\x0a\x03\x1b\xff\x85\x00\x0a\x03\x1c\xffq\x00\x0a\x03\ +\x1d\xffq\x00\x0a\x03\x1e\xff\xae\x00\x0a\x03\x1f\xffq\x00\ +\x0a\x03 \xff\xae\x00\x0a\x03!\xffq\x00\x0a\x03\x22\xff\ +\xae\x00\x0a\x03#\xffq\x00\x0a\x03%\xffq\x00\x0a\x03\ +&\xff\xae\x00\x0a\x03'\xffq\x00\x0a\x03(\xff\xae\x00\ +\x0a\x03)\xffq\x00\x0a\x03*\xff\xae\x00\x0a\x03+\xff\ +q\x00\x0a\x03,\xff\xae\x00\x0a\x03-\xffq\x00\x0a\x03\ +.\xff\xae\x00\x0a\x03/\xffq\x00\x0a\x030\xff\xae\x00\ +\x0a\x031\xffq\x00\x0a\x032\xff\xae\x00\x0a\x033\xff\ +q\x00\x0a\x034\xff\xae\x00\x0a\x036\xff\x85\x00\x0a\x03\ +8\xff\x85\x00\x0a\x03:\xff\x85\x00\x0a\x03<\xff\x85\x00\ +\x0a\x03@\xff\x85\x00\x0a\x03B\xff\x85\x00\x0a\x03D\xff\ +\x85\x00\x0a\x03J\xff\x85\x00\x0a\x03L\xff\x85\x00\x0a\x03\ +N\xff\x85\x00\x0a\x03R\xff\x85\x00\x0a\x03T\xff\x85\x00\ +\x0a\x03V\xff\x85\x00\x0a\x03X\xff\x85\x00\x0a\x03Z\xff\ +\x85\x00\x0a\x03\x5c\xff\x85\x00\x0a\x03^\xff\x85\x00\x0a\x03\ +`\xff\x85\x00\x0a\x03b\xff\xc3\x00\x0a\x03d\xff\xc3\x00\ +\x0a\x03f\xff\xc3\x00\x0a\x03h\xff\xc3\x00\x0a\x03j\xff\ +\xc3\x00\x0a\x03l\xff\xc3\x00\x0a\x03n\xff\xc3\x00\x0a\x03\ +o\x00\x14\x00\x0a\x03q\x00\x14\x00\x0a\x03s\x00\x14\x00\ +\x0a\x03\x8f\x00)\x00\x0b\x00-\x00\xb8\x00\x0f\x00&\xff\ +\x9a\x00\x0f\x00*\xff\x9a\x00\x0f\x002\xff\x9a\x00\x0f\x00\ +4\xff\x9a\x00\x0f\x007\xffq\x00\x0f\x008\xff\xd7\x00\ +\x0f\x009\xff\x85\x00\x0f\x00:\xff\x85\x00\x0f\x00<\xff\ +\x85\x00\x0f\x00\x89\xff\x9a\x00\x0f\x00\x94\xff\x9a\x00\x0f\x00\ +\x95\xff\x9a\x00\x0f\x00\x96\xff\x9a\x00\x0f\x00\x97\xff\x9a\x00\ +\x0f\x00\x98\xff\x9a\x00\x0f\x00\x9a\xff\x9a\x00\x0f\x00\x9b\xff\ +\xd7\x00\x0f\x00\x9c\xff\xd7\x00\x0f\x00\x9d\xff\xd7\x00\x0f\x00\ +\x9e\xff\xd7\x00\x0f\x00\x9f\xff\x85\x00\x0f\x00\xc8\xff\x9a\x00\ +\x0f\x00\xca\xff\x9a\x00\x0f\x00\xcc\xff\x9a\x00\x0f\x00\xce\xff\ +\x9a\x00\x0f\x00\xde\xff\x9a\x00\x0f\x00\xe0\xff\x9a\x00\x0f\x00\ +\xe2\xff\x9a\x00\x0f\x00\xe4\xff\x9a\x00\x0f\x01\x0e\xff\x9a\x00\ +\x0f\x01\x10\xff\x9a\x00\x0f\x01\x12\xff\x9a\x00\x0f\x01\x14\xff\ +\x9a\x00\x0f\x01$\xffq\x00\x0f\x01&\xffq\x00\x0f\x01\ +*\xff\xd7\x00\x0f\x01,\xff\xd7\x00\x0f\x01.\xff\xd7\x00\ +\x0f\x010\xff\xd7\x00\x0f\x012\xff\xd7\x00\x0f\x014\xff\ +\xd7\x00\x0f\x016\xff\x85\x00\x0f\x018\xff\x85\x00\x0f\x01\ +:\xff\x85\x00\x0f\x01G\xff\x9a\x00\x0f\x01f\xff\xae\x00\ +\x0f\x01m\xff\xae\x00\x0f\x01q\xffq\x00\x0f\x01r\xff\ +\x85\x00\x0f\x01s\xff\x9a\x00\x0f\x01u\xff\x85\x00\x0f\x01\ +x\xff\x85\x00\x0f\x01\x85\xff\xd7\x00\x0f\x01\x9d\xffq\x00\ +\x0f\x01\x9f\xff\x9a\x00\x0f\x01\xa6\xffq\x00\x0f\x01\xb8\xff\ +\x9a\x00\x0f\x01\xbb\xff\x9a\x00\x0f\x01\xbc\xffq\x00\x0f\x01\ +\xbe\xff\xae\x00\x0f\x01\xc1\xff\x5c\x00\x0f\x01\xc4\xffq\x00\ +\x0f\x01\xdc\xff\x9a\x00\x0f\x01\xe1\xff\x85\x00\x0f\x01\xe4\xff\ +\x9a\x00\x0f\x01\xfa\xff\x85\x00\x0f\x01\xfc\xff\x85\x00\x0f\x01\ +\xfe\xff\x85\x00\x0f\x02\x00\xff\x85\x00\x0f\x02T\xff\x85\x00\ +\x0f\x02_\xff\x9a\x00\x0f\x02a\xff\xd7\x00\x0f\x02l\xff\ +\x9a\x00\x0f\x02|\xff\x5c\x00\x0f\x02~\xff\x9a\x00\x0f\x02\ +\x80\xff\x85\x00\x0f\x02\x82\xff\x85\x00\x0f\x02\x84\xff\x9a\x00\ +\x0f\x02\x86\xff\x9a\x00\x0f\x02\x88\xff\x9a\x00\x0f\x02\x8a\xff\ +\x9a\x00\x0f\x02\x8c\xff\x9a\x00\x0f\x02\xa9\xffq\x00\x0f\x02\ +\xaa\xff\x9a\x00\x0f\x02\xb1\xff\x9a\x00\x0f\x02\xb3\xff\x9a\x00\ +\x0f\x02\xb5\xffq\x00\x0f\x02\xb6\xff\x9a\x00\x0f\x02\xb7\xff\ +\x85\x00\x0f\x02\xb9\xff\x85\x00\x0f\x02\xbd\xffq\x00\x0f\x02\ +\xbe\xff\x9a\x00\x0f\x02\xbf\xff\x5c\x00\x0f\x02\xc0\xff\x85\x00\ +\x0f\x02\xc1\xff\x5c\x00\x0f\x02\xc2\xff\x85\x00\x0f\x02\xc5\xff\ +\x85\x00\x0f\x02\xc7\xff\x85\x00\x0f\x02\xd4\xff\x5c\x00\x0f\x02\ +\xd5\xff\x85\x00\x0f\x02\xef\xff\x9a\x00\x0f\x02\xf1\xff\x9a\x00\ +\x0f\x02\xf3\xff\x9a\x00\x0f\x02\xfd\xff\x5c\x00\x0f\x02\xfe\xff\ +\x85\x00\x0f\x03\x0d\xff\x85\x00\x0f\x03\x0e\xff\x9a\x00\x0f\x03\ +\x0f\xff\x85\x00\x0f\x03\x10\xff\x9a\x00\x0f\x03\x15\xff\x9a\x00\ +\x0f\x03\x17\xffq\x00\x0f\x03\x18\xff\x9a\x00\x0f\x03I\xff\ +\x9a\x00\x0f\x03K\xff\x9a\x00\x0f\x03M\xff\x9a\x00\x0f\x03\ +O\xff\x9a\x00\x0f\x03Q\xff\x9a\x00\x0f\x03S\xff\x9a\x00\ +\x0f\x03U\xff\x9a\x00\x0f\x03W\xff\x9a\x00\x0f\x03Y\xff\ +\x9a\x00\x0f\x03[\xff\x9a\x00\x0f\x03]\xff\x9a\x00\x0f\x03\ +_\xff\x9a\x00\x0f\x03a\xff\xd7\x00\x0f\x03c\xff\xd7\x00\ +\x0f\x03e\xff\xd7\x00\x0f\x03g\xff\xd7\x00\x0f\x03i\xff\ +\xd7\x00\x0f\x03k\xff\xd7\x00\x0f\x03m\xff\xd7\x00\x0f\x03\ +o\xff\x85\x00\x0f\x03q\xff\x85\x00\x0f\x03s\xff\x85\x00\ +\x0f\x03\x8f\xffq\x00\x10\x007\xff\xae\x00\x10\x01$\xff\ +\xae\x00\x10\x01&\xff\xae\x00\x10\x01q\xff\xae\x00\x10\x01\ +\x9d\xff\xae\x00\x10\x01\xa6\xff\xae\x00\x10\x01\xbc\xff\xae\x00\ +\x10\x01\xc4\xff\xae\x00\x10\x01\xdc\xff\xd7\x00\x10\x01\xe4\xff\ +\xd7\x00\x10\x02\xa9\xff\xae\x00\x10\x02\xaa\xff\xd7\x00\x10\x02\ +\xb5\xff\xae\x00\x10\x02\xb6\xff\xd7\x00\x10\x02\xbd\xff\xae\x00\ +\x10\x02\xbe\xff\xd7\x00\x10\x03\x17\xff\xae\x00\x10\x03\x18\xff\ +\xd7\x00\x10\x03\x8f\xff\xae\x00\x11\x00&\xff\x9a\x00\x11\x00\ +*\xff\x9a\x00\x11\x002\xff\x9a\x00\x11\x004\xff\x9a\x00\ +\x11\x007\xffq\x00\x11\x008\xff\xd7\x00\x11\x009\xff\ +\x85\x00\x11\x00:\xff\x85\x00\x11\x00<\xff\x85\x00\x11\x00\ +\x89\xff\x9a\x00\x11\x00\x94\xff\x9a\x00\x11\x00\x95\xff\x9a\x00\ +\x11\x00\x96\xff\x9a\x00\x11\x00\x97\xff\x9a\x00\x11\x00\x98\xff\ +\x9a\x00\x11\x00\x9a\xff\x9a\x00\x11\x00\x9b\xff\xd7\x00\x11\x00\ +\x9c\xff\xd7\x00\x11\x00\x9d\xff\xd7\x00\x11\x00\x9e\xff\xd7\x00\ +\x11\x00\x9f\xff\x85\x00\x11\x00\xc8\xff\x9a\x00\x11\x00\xca\xff\ +\x9a\x00\x11\x00\xcc\xff\x9a\x00\x11\x00\xce\xff\x9a\x00\x11\x00\ +\xde\xff\x9a\x00\x11\x00\xe0\xff\x9a\x00\x11\x00\xe2\xff\x9a\x00\ +\x11\x00\xe4\xff\x9a\x00\x11\x01\x0e\xff\x9a\x00\x11\x01\x10\xff\ +\x9a\x00\x11\x01\x12\xff\x9a\x00\x11\x01\x14\xff\x9a\x00\x11\x01\ +$\xffq\x00\x11\x01&\xffq\x00\x11\x01*\xff\xd7\x00\ +\x11\x01,\xff\xd7\x00\x11\x01.\xff\xd7\x00\x11\x010\xff\ +\xd7\x00\x11\x012\xff\xd7\x00\x11\x014\xff\xd7\x00\x11\x01\ +6\xff\x85\x00\x11\x018\xff\x85\x00\x11\x01:\xff\x85\x00\ +\x11\x01G\xff\x9a\x00\x11\x01f\xff\xae\x00\x11\x01m\xff\ +\xae\x00\x11\x01q\xffq\x00\x11\x01r\xff\x85\x00\x11\x01\ +s\xff\x9a\x00\x11\x01u\xff\x85\x00\x11\x01x\xff\x85\x00\ +\x11\x01\x85\xff\xd7\x00\x11\x01\x9d\xffq\x00\x11\x01\x9f\xff\ +\x9a\x00\x11\x01\xa6\xffq\x00\x11\x01\xb8\xff\x9a\x00\x11\x01\ +\xbb\xff\x9a\x00\x11\x01\xbc\xffq\x00\x11\x01\xbe\xff\xae\x00\ +\x11\x01\xc1\xff\x5c\x00\x11\x01\xc4\xffq\x00\x11\x01\xdc\xff\ +\x9a\x00\x11\x01\xe1\xff\x85\x00\x11\x01\xe4\xff\x9a\x00\x11\x01\ +\xfa\xff\x85\x00\x11\x01\xfc\xff\x85\x00\x11\x01\xfe\xff\x85\x00\ +\x11\x02\x00\xff\x85\x00\x11\x02T\xff\x85\x00\x11\x02_\xff\ +\x9a\x00\x11\x02a\xff\xd7\x00\x11\x02l\xff\x9a\x00\x11\x02\ +|\xff\x5c\x00\x11\x02~\xff\x9a\x00\x11\x02\x80\xff\x85\x00\ +\x11\x02\x82\xff\x85\x00\x11\x02\x84\xff\x9a\x00\x11\x02\x86\xff\ +\x9a\x00\x11\x02\x88\xff\x9a\x00\x11\x02\x8a\xff\x9a\x00\x11\x02\ +\x8c\xff\x9a\x00\x11\x02\xa9\xffq\x00\x11\x02\xaa\xff\x9a\x00\ +\x11\x02\xb1\xff\x9a\x00\x11\x02\xb3\xff\x9a\x00\x11\x02\xb5\xff\ +q\x00\x11\x02\xb6\xff\x9a\x00\x11\x02\xb7\xff\x85\x00\x11\x02\ +\xb9\xff\x85\x00\x11\x02\xbd\xffq\x00\x11\x02\xbe\xff\x9a\x00\ +\x11\x02\xbf\xff\x5c\x00\x11\x02\xc0\xff\x85\x00\x11\x02\xc1\xff\ +\x5c\x00\x11\x02\xc2\xff\x85\x00\x11\x02\xc5\xff\x85\x00\x11\x02\ +\xc7\xff\x85\x00\x11\x02\xd4\xff\x5c\x00\x11\x02\xd5\xff\x85\x00\ +\x11\x02\xef\xff\x9a\x00\x11\x02\xf1\xff\x9a\x00\x11\x02\xf3\xff\ +\x9a\x00\x11\x02\xfd\xff\x5c\x00\x11\x02\xfe\xff\x85\x00\x11\x03\ +\x0d\xff\x85\x00\x11\x03\x0e\xff\x9a\x00\x11\x03\x0f\xff\x85\x00\ +\x11\x03\x10\xff\x9a\x00\x11\x03\x15\xff\x9a\x00\x11\x03\x17\xff\ +q\x00\x11\x03\x18\xff\x9a\x00\x11\x03I\xff\x9a\x00\x11\x03\ +K\xff\x9a\x00\x11\x03M\xff\x9a\x00\x11\x03O\xff\x9a\x00\ +\x11\x03Q\xff\x9a\x00\x11\x03S\xff\x9a\x00\x11\x03U\xff\ +\x9a\x00\x11\x03W\xff\x9a\x00\x11\x03Y\xff\x9a\x00\x11\x03\ +[\xff\x9a\x00\x11\x03]\xff\x9a\x00\x11\x03_\xff\x9a\x00\ +\x11\x03a\xff\xd7\x00\x11\x03c\xff\xd7\x00\x11\x03e\xff\ +\xd7\x00\x11\x03g\xff\xd7\x00\x11\x03i\xff\xd7\x00\x11\x03\ +k\xff\xd7\x00\x11\x03m\xff\xd7\x00\x11\x03o\xff\x85\x00\ +\x11\x03q\xff\x85\x00\x11\x03s\xff\x85\x00\x11\x03\x8f\xff\ +q\x00$\x00\x05\xffq\x00$\x00\x0a\xffq\x00$\x00\ +&\xff\xd7\x00$\x00*\xff\xd7\x00$\x00-\x01\x0a\x00\ +$\x002\xff\xd7\x00$\x004\xff\xd7\x00$\x007\xff\ +q\x00$\x009\xff\xae\x00$\x00:\xff\xae\x00$\x00\ +<\xff\x85\x00$\x00\x89\xff\xd7\x00$\x00\x94\xff\xd7\x00\ +$\x00\x95\xff\xd7\x00$\x00\x96\xff\xd7\x00$\x00\x97\xff\ +\xd7\x00$\x00\x98\xff\xd7\x00$\x00\x9a\xff\xd7\x00$\x00\ +\x9f\xff\x85\x00$\x00\xc8\xff\xd7\x00$\x00\xca\xff\xd7\x00\ +$\x00\xcc\xff\xd7\x00$\x00\xce\xff\xd7\x00$\x00\xde\xff\ +\xd7\x00$\x00\xe0\xff\xd7\x00$\x00\xe2\xff\xd7\x00$\x00\ +\xe4\xff\xd7\x00$\x01\x0e\xff\xd7\x00$\x01\x10\xff\xd7\x00\ +$\x01\x12\xff\xd7\x00$\x01\x14\xff\xd7\x00$\x01$\xff\ +q\x00$\x01&\xffq\x00$\x016\xff\xae\x00$\x01\ +8\xff\x85\x00$\x01:\xff\x85\x00$\x01G\xff\xd7\x00\ +$\x01\xfa\xff\xae\x00$\x01\xfc\xff\xae\x00$\x01\xfe\xff\ +\xae\x00$\x02\x00\xff\x85\x00$\x02\x07\xffq\x00$\x02\ +\x0b\xffq\x00$\x02_\xff\xd7\x00$\x03I\xff\xd7\x00\ +$\x03K\xff\xd7\x00$\x03M\xff\xd7\x00$\x03O\xff\ +\xd7\x00$\x03Q\xff\xd7\x00$\x03S\xff\xd7\x00$\x03\ +U\xff\xd7\x00$\x03W\xff\xd7\x00$\x03Y\xff\xd7\x00\ +$\x03[\xff\xd7\x00$\x03]\xff\xd7\x00$\x03_\xff\ +\xd7\x00$\x03o\xff\x85\x00$\x03q\xff\x85\x00$\x03\ +s\xff\x85\x00$\x03\x8f\xffq\x00%\x00\x0f\xff\xae\x00\ +%\x00\x11\xff\xae\x00%\x00$\xff\xd7\x00%\x007\xff\ +\xc3\x00%\x009\xff\xec\x00%\x00:\xff\xec\x00%\x00\ +;\xff\xd7\x00%\x00<\xff\xec\x00%\x00=\xff\xec\x00\ +%\x00\x82\xff\xd7\x00%\x00\x83\xff\xd7\x00%\x00\x84\xff\ +\xd7\x00%\x00\x85\xff\xd7\x00%\x00\x86\xff\xd7\x00%\x00\ +\x87\xff\xd7\x00%\x00\x9f\xff\xec\x00%\x00\xc2\xff\xd7\x00\ +%\x00\xc4\xff\xd7\x00%\x00\xc6\xff\xd7\x00%\x01$\xff\ +\xc3\x00%\x01&\xff\xc3\x00%\x016\xff\xec\x00%\x01\ +8\xff\xec\x00%\x01:\xff\xec\x00%\x01;\xff\xec\x00\ +%\x01=\xff\xec\x00%\x01?\xff\xec\x00%\x01C\xff\ +\xd7\x00%\x01\xa0\xff\xec\x00%\x01\xfa\xff\xec\x00%\x01\ +\xfc\xff\xec\x00%\x01\xfe\xff\xec\x00%\x02\x00\xff\xec\x00\ +%\x02\x08\xff\xae\x00%\x02\x0c\xff\xae\x00%\x02X\xff\ +\xd7\x00%\x03\x1d\xff\xd7\x00%\x03\x1f\xff\xd7\x00%\x03\ +!\xff\xd7\x00%\x03#\xff\xd7\x00%\x03%\xff\xd7\x00\ +%\x03'\xff\xd7\x00%\x03)\xff\xd7\x00%\x03+\xff\ +\xd7\x00%\x03-\xff\xd7\x00%\x03/\xff\xd7\x00%\x03\ +1\xff\xd7\x00%\x033\xff\xd7\x00%\x03o\xff\xec\x00\ +%\x03q\xff\xec\x00%\x03s\xff\xec\x00%\x03\x8f\xff\ +\xc3\x00&\x00&\xff\xd7\x00&\x00*\xff\xd7\x00&\x00\ +2\xff\xd7\x00&\x004\xff\xd7\x00&\x00\x89\xff\xd7\x00\ +&\x00\x94\xff\xd7\x00&\x00\x95\xff\xd7\x00&\x00\x96\xff\ +\xd7\x00&\x00\x97\xff\xd7\x00&\x00\x98\xff\xd7\x00&\x00\ +\x9a\xff\xd7\x00&\x00\xc8\xff\xd7\x00&\x00\xca\xff\xd7\x00\ +&\x00\xcc\xff\xd7\x00&\x00\xce\xff\xd7\x00&\x00\xde\xff\ +\xd7\x00&\x00\xe0\xff\xd7\x00&\x00\xe2\xff\xd7\x00&\x00\ +\xe4\xff\xd7\x00&\x01\x0e\xff\xd7\x00&\x01\x10\xff\xd7\x00\ +&\x01\x12\xff\xd7\x00&\x01\x14\xff\xd7\x00&\x01G\xff\ +\xd7\x00&\x02_\xff\xd7\x00&\x03I\xff\xd7\x00&\x03\ +K\xff\xd7\x00&\x03M\xff\xd7\x00&\x03O\xff\xd7\x00\ +&\x03Q\xff\xd7\x00&\x03S\xff\xd7\x00&\x03U\xff\ +\xd7\x00&\x03W\xff\xd7\x00&\x03Y\xff\xd7\x00&\x03\ +[\xff\xd7\x00&\x03]\xff\xd7\x00&\x03_\xff\xd7\x00\ +'\x00\x0f\xff\xae\x00'\x00\x11\xff\xae\x00'\x00$\xff\ +\xd7\x00'\x007\xff\xc3\x00'\x009\xff\xec\x00'\x00\ +:\xff\xec\x00'\x00;\xff\xd7\x00'\x00<\xff\xec\x00\ +'\x00=\xff\xec\x00'\x00\x82\xff\xd7\x00'\x00\x83\xff\ +\xd7\x00'\x00\x84\xff\xd7\x00'\x00\x85\xff\xd7\x00'\x00\ +\x86\xff\xd7\x00'\x00\x87\xff\xd7\x00'\x00\x9f\xff\xec\x00\ +'\x00\xc2\xff\xd7\x00'\x00\xc4\xff\xd7\x00'\x00\xc6\xff\ +\xd7\x00'\x01$\xff\xc3\x00'\x01&\xff\xc3\x00'\x01\ +6\xff\xec\x00'\x018\xff\xec\x00'\x01:\xff\xec\x00\ +'\x01;\xff\xec\x00'\x01=\xff\xec\x00'\x01?\xff\ +\xec\x00'\x01C\xff\xd7\x00'\x01\xa0\xff\xec\x00'\x01\ +\xfa\xff\xec\x00'\x01\xfc\xff\xec\x00'\x01\xfe\xff\xec\x00\ +'\x02\x00\xff\xec\x00'\x02\x08\xff\xae\x00'\x02\x0c\xff\ +\xae\x00'\x02X\xff\xd7\x00'\x03\x1d\xff\xd7\x00'\x03\ +\x1f\xff\xd7\x00'\x03!\xff\xd7\x00'\x03#\xff\xd7\x00\ +'\x03%\xff\xd7\x00'\x03'\xff\xd7\x00'\x03)\xff\ +\xd7\x00'\x03+\xff\xd7\x00'\x03-\xff\xd7\x00'\x03\ +/\xff\xd7\x00'\x031\xff\xd7\x00'\x033\xff\xd7\x00\ +'\x03o\xff\xec\x00'\x03q\xff\xec\x00'\x03s\xff\ +\xec\x00'\x03\x8f\xff\xc3\x00(\x00-\x00{\x00)\x00\ +\x0f\xff\x85\x00)\x00\x11\xff\x85\x00)\x00\x22\x00)\x00\ +)\x00$\xff\xd7\x00)\x00\x82\xff\xd7\x00)\x00\x83\xff\ +\xd7\x00)\x00\x84\xff\xd7\x00)\x00\x85\xff\xd7\x00)\x00\ +\x86\xff\xd7\x00)\x00\x87\xff\xd7\x00)\x00\xc2\xff\xd7\x00\ +)\x00\xc4\xff\xd7\x00)\x00\xc6\xff\xd7\x00)\x01C\xff\ +\xd7\x00)\x02\x08\xff\x85\x00)\x02\x0c\xff\x85\x00)\x02\ +X\xff\xd7\x00)\x03\x1d\xff\xd7\x00)\x03\x1f\xff\xd7\x00\ +)\x03!\xff\xd7\x00)\x03#\xff\xd7\x00)\x03%\xff\ +\xd7\x00)\x03'\xff\xd7\x00)\x03)\xff\xd7\x00)\x03\ ++\xff\xd7\x00)\x03-\xff\xd7\x00)\x03/\xff\xd7\x00\ +)\x031\xff\xd7\x00)\x033\xff\xd7\x00.\x00&\xff\ +\xd7\x00.\x00*\xff\xd7\x00.\x002\xff\xd7\x00.\x00\ +4\xff\xd7\x00.\x00\x89\xff\xd7\x00.\x00\x94\xff\xd7\x00\ +.\x00\x95\xff\xd7\x00.\x00\x96\xff\xd7\x00.\x00\x97\xff\ +\xd7\x00.\x00\x98\xff\xd7\x00.\x00\x9a\xff\xd7\x00.\x00\ +\xc8\xff\xd7\x00.\x00\xca\xff\xd7\x00.\x00\xcc\xff\xd7\x00\ +.\x00\xce\xff\xd7\x00.\x00\xde\xff\xd7\x00.\x00\xe0\xff\ +\xd7\x00.\x00\xe2\xff\xd7\x00.\x00\xe4\xff\xd7\x00.\x01\ +\x0e\xff\xd7\x00.\x01\x10\xff\xd7\x00.\x01\x12\xff\xd7\x00\ +.\x01\x14\xff\xd7\x00.\x01G\xff\xd7\x00.\x02_\xff\ +\xd7\x00.\x03I\xff\xd7\x00.\x03K\xff\xd7\x00.\x03\ +M\xff\xd7\x00.\x03O\xff\xd7\x00.\x03Q\xff\xd7\x00\ +.\x03S\xff\xd7\x00.\x03U\xff\xd7\x00.\x03W\xff\ +\xd7\x00.\x03Y\xff\xd7\x00.\x03[\xff\xd7\x00.\x03\ +]\xff\xd7\x00.\x03_\xff\xd7\x00/\x00\x05\xff\x5c\x00\ +/\x00\x0a\xff\x5c\x00/\x00&\xff\xd7\x00/\x00*\xff\ +\xd7\x00/\x002\xff\xd7\x00/\x004\xff\xd7\x00/\x00\ +7\xff\xd7\x00/\x008\xff\xec\x00/\x009\xff\xd7\x00\ +/\x00:\xff\xd7\x00/\x00<\xff\xc3\x00/\x00\x89\xff\ +\xd7\x00/\x00\x94\xff\xd7\x00/\x00\x95\xff\xd7\x00/\x00\ +\x96\xff\xd7\x00/\x00\x97\xff\xd7\x00/\x00\x98\xff\xd7\x00\ +/\x00\x9a\xff\xd7\x00/\x00\x9b\xff\xec\x00/\x00\x9c\xff\ +\xec\x00/\x00\x9d\xff\xec\x00/\x00\x9e\xff\xec\x00/\x00\ +\x9f\xff\xc3\x00/\x00\xc8\xff\xd7\x00/\x00\xca\xff\xd7\x00\ +/\x00\xcc\xff\xd7\x00/\x00\xce\xff\xd7\x00/\x00\xde\xff\ +\xd7\x00/\x00\xe0\xff\xd7\x00/\x00\xe2\xff\xd7\x00/\x00\ +\xe4\xff\xd7\x00/\x01\x0e\xff\xd7\x00/\x01\x10\xff\xd7\x00\ +/\x01\x12\xff\xd7\x00/\x01\x14\xff\xd7\x00/\x01$\xff\ +\xd7\x00/\x01&\xff\xd7\x00/\x01*\xff\xec\x00/\x01\ +,\xff\xec\x00/\x01.\xff\xec\x00/\x010\xff\xec\x00\ +/\x012\xff\xec\x00/\x014\xff\xec\x00/\x016\xff\ +\xd7\x00/\x018\xff\xc3\x00/\x01:\xff\xc3\x00/\x01\ +G\xff\xd7\x00/\x01\xfa\xff\xd7\x00/\x01\xfc\xff\xd7\x00\ +/\x01\xfe\xff\xd7\x00/\x02\x00\xff\xc3\x00/\x02\x07\xff\ +\x5c\x00/\x02\x0b\xff\x5c\x00/\x02_\xff\xd7\x00/\x02\ +a\xff\xec\x00/\x03I\xff\xd7\x00/\x03K\xff\xd7\x00\ +/\x03M\xff\xd7\x00/\x03O\xff\xd7\x00/\x03Q\xff\ +\xd7\x00/\x03S\xff\xd7\x00/\x03U\xff\xd7\x00/\x03\ +W\xff\xd7\x00/\x03Y\xff\xd7\x00/\x03[\xff\xd7\x00\ +/\x03]\xff\xd7\x00/\x03_\xff\xd7\x00/\x03a\xff\ +\xec\x00/\x03c\xff\xec\x00/\x03e\xff\xec\x00/\x03\ +g\xff\xec\x00/\x03i\xff\xec\x00/\x03k\xff\xec\x00\ +/\x03m\xff\xec\x00/\x03o\xff\xc3\x00/\x03q\xff\ +\xc3\x00/\x03s\xff\xc3\x00/\x03\x8f\xff\xd7\x002\x00\ +\x0f\xff\xae\x002\x00\x11\xff\xae\x002\x00$\xff\xd7\x00\ +2\x007\xff\xc3\x002\x009\xff\xec\x002\x00:\xff\ +\xec\x002\x00;\xff\xd7\x002\x00<\xff\xec\x002\x00\ +=\xff\xec\x002\x00\x82\xff\xd7\x002\x00\x83\xff\xd7\x00\ +2\x00\x84\xff\xd7\x002\x00\x85\xff\xd7\x002\x00\x86\xff\ +\xd7\x002\x00\x87\xff\xd7\x002\x00\x9f\xff\xec\x002\x00\ +\xc2\xff\xd7\x002\x00\xc4\xff\xd7\x002\x00\xc6\xff\xd7\x00\ +2\x01$\xff\xc3\x002\x01&\xff\xc3\x002\x016\xff\ +\xec\x002\x018\xff\xec\x002\x01:\xff\xec\x002\x01\ +;\xff\xec\x002\x01=\xff\xec\x002\x01?\xff\xec\x00\ +2\x01C\xff\xd7\x002\x01\xa0\xff\xec\x002\x01\xfa\xff\ +\xec\x002\x01\xfc\xff\xec\x002\x01\xfe\xff\xec\x002\x02\ +\x00\xff\xec\x002\x02\x08\xff\xae\x002\x02\x0c\xff\xae\x00\ +2\x02X\xff\xd7\x002\x03\x1d\xff\xd7\x002\x03\x1f\xff\ +\xd7\x002\x03!\xff\xd7\x002\x03#\xff\xd7\x002\x03\ +%\xff\xd7\x002\x03'\xff\xd7\x002\x03)\xff\xd7\x00\ +2\x03+\xff\xd7\x002\x03-\xff\xd7\x002\x03/\xff\ +\xd7\x002\x031\xff\xd7\x002\x033\xff\xd7\x002\x03\ +o\xff\xec\x002\x03q\xff\xec\x002\x03s\xff\xec\x00\ +2\x03\x8f\xff\xc3\x003\x00\x0f\xfe\xf6\x003\x00\x11\xfe\ +\xf6\x003\x00$\xff\x9a\x003\x00;\xff\xd7\x003\x00\ +=\xff\xec\x003\x00\x82\xff\x9a\x003\x00\x83\xff\x9a\x00\ +3\x00\x84\xff\x9a\x003\x00\x85\xff\x9a\x003\x00\x86\xff\ +\x9a\x003\x00\x87\xff\x9a\x003\x00\xc2\xff\x9a\x003\x00\ +\xc4\xff\x9a\x003\x00\xc6\xff\x9a\x003\x01;\xff\xec\x00\ +3\x01=\xff\xec\x003\x01?\xff\xec\x003\x01C\xff\ +\x9a\x003\x02\x08\xfe\xf6\x003\x02\x0c\xfe\xf6\x003\x02\ +X\xff\x9a\x003\x03\x1d\xff\x9a\x003\x03\x1f\xff\x9a\x00\ +3\x03!\xff\x9a\x003\x03#\xff\x9a\x003\x03%\xff\ +\x9a\x003\x03'\xff\x9a\x003\x03)\xff\x9a\x003\x03\ ++\xff\x9a\x003\x03-\xff\x9a\x003\x03/\xff\x9a\x00\ +3\x031\xff\x9a\x003\x033\xff\x9a\x004\x00\x0f\xff\ +\xae\x004\x00\x11\xff\xae\x004\x00$\xff\xd7\x004\x00\ +7\xff\xc3\x004\x009\xff\xec\x004\x00:\xff\xec\x00\ +4\x00;\xff\xd7\x004\x00<\xff\xec\x004\x00=\xff\ +\xec\x004\x00\x82\xff\xd7\x004\x00\x83\xff\xd7\x004\x00\ +\x84\xff\xd7\x004\x00\x85\xff\xd7\x004\x00\x86\xff\xd7\x00\ +4\x00\x87\xff\xd7\x004\x00\x9f\xff\xec\x004\x00\xc2\xff\ +\xd7\x004\x00\xc4\xff\xd7\x004\x00\xc6\xff\xd7\x004\x01\ +$\xff\xc3\x004\x01&\xff\xc3\x004\x016\xff\xec\x00\ +4\x018\xff\xec\x004\x01:\xff\xec\x004\x01;\xff\ +\xec\x004\x01=\xff\xec\x004\x01?\xff\xec\x004\x01\ +C\xff\xd7\x004\x01\xa0\xff\xec\x004\x01\xfa\xff\xec\x00\ +4\x01\xfc\xff\xec\x004\x01\xfe\xff\xec\x004\x02\x00\xff\ +\xec\x004\x02\x08\xff\xae\x004\x02\x0c\xff\xae\x004\x02\ +X\xff\xd7\x004\x03\x1d\xff\xd7\x004\x03\x1f\xff\xd7\x00\ +4\x03!\xff\xd7\x004\x03#\xff\xd7\x004\x03%\xff\ +\xd7\x004\x03'\xff\xd7\x004\x03)\xff\xd7\x004\x03\ ++\xff\xd7\x004\x03-\xff\xd7\x004\x03/\xff\xd7\x00\ +4\x031\xff\xd7\x004\x033\xff\xd7\x004\x03o\xff\ +\xec\x004\x03q\xff\xec\x004\x03s\xff\xec\x004\x03\ +\x8f\xff\xc3\x007\x00\x0f\xff\x85\x007\x00\x10\xff\xae\x00\ +7\x00\x11\xff\x85\x007\x00\x22\x00)\x007\x00$\xff\ +q\x007\x00&\xff\xd7\x007\x00*\xff\xd7\x007\x00\ +2\xff\xd7\x007\x004\xff\xd7\x007\x007\x00)\x00\ +7\x00D\xff\x5c\x007\x00F\xffq\x007\x00G\xff\ +q\x007\x00H\xffq\x007\x00J\xffq\x007\x00\ +P\xff\x9a\x007\x00Q\xff\x9a\x007\x00R\xffq\x00\ +7\x00S\xff\x9a\x007\x00T\xffq\x007\x00U\xff\ +\x9a\x007\x00V\xff\x85\x007\x00X\xff\x9a\x007\x00\ +Y\xff\xd7\x007\x00Z\xff\xd7\x007\x00[\xff\xd7\x00\ +7\x00\x5c\xff\xd7\x007\x00]\xff\xae\x007\x00\x82\xff\ +q\x007\x00\x83\xffq\x007\x00\x84\xffq\x007\x00\ +\x85\xffq\x007\x00\x86\xffq\x007\x00\x87\xffq\x00\ +7\x00\x89\xff\xd7\x007\x00\x94\xff\xd7\x007\x00\x95\xff\ +\xd7\x007\x00\x96\xff\xd7\x007\x00\x97\xff\xd7\x007\x00\ +\x98\xff\xd7\x007\x00\x9a\xff\xd7\x007\x00\xa2\xffq\x00\ +7\x00\xa3\xff\x5c\x007\x00\xa4\xff\x5c\x007\x00\xa5\xff\ +\x5c\x007\x00\xa6\xff\x5c\x007\x00\xa7\xff\x5c\x007\x00\ +\xa8\xff\x5c\x007\x00\xa9\xffq\x007\x00\xaa\xffq\x00\ +7\x00\xab\xffq\x007\x00\xac\xffq\x007\x00\xad\xff\ +q\x007\x00\xb4\xffq\x007\x00\xb5\xffq\x007\x00\ +\xb6\xffq\x007\x00\xb7\xffq\x007\x00\xb8\xffq\x00\ +7\x00\xba\xffq\x007\x00\xbb\xff\x9a\x007\x00\xbc\xff\ +\x9a\x007\x00\xbd\xff\x9a\x007\x00\xbe\xff\x9a\x007\x00\ +\xbf\xff\xd7\x007\x00\xc2\xffq\x007\x00\xc3\xff\x5c\x00\ +7\x00\xc4\xffq\x007\x00\xc5\xff\x5c\x007\x00\xc6\xff\ +q\x007\x00\xc7\xff\x5c\x007\x00\xc8\xff\xd7\x007\x00\ +\xc9\xffq\x007\x00\xca\xff\xd7\x007\x00\xcb\xffq\x00\ +7\x00\xcc\xff\xd7\x007\x00\xcd\xffq\x007\x00\xce\xff\ +\xd7\x007\x00\xcf\xffq\x007\x00\xd1\xffq\x007\x00\ +\xd3\xffq\x007\x00\xd5\xffq\x007\x00\xd7\xffq\x00\ +7\x00\xd9\xffq\x007\x00\xdb\xffq\x007\x00\xdd\xff\ +q\x007\x00\xde\xff\xd7\x007\x00\xdf\xffq\x007\x00\ +\xe0\xff\xd7\x007\x00\xe1\xffq\x007\x00\xe2\xff\xd7\x00\ +7\x00\xe3\xffq\x007\x00\xe4\xff\xd7\x007\x00\xe5\xff\ +q\x007\x00\xfa\xff\x9a\x007\x01\x06\xff\x9a\x007\x01\ +\x08\xff\x9a\x007\x01\x0d\xff\x9a\x007\x01\x0e\xff\xd7\x00\ +7\x01\x0f\xffq\x007\x01\x10\xff\xd7\x007\x01\x11\xff\ +q\x007\x01\x12\xff\xd7\x007\x01\x13\xffq\x007\x01\ +\x14\xff\xd7\x007\x01\x15\xffq\x007\x01\x17\xff\x9a\x00\ +7\x01\x19\xff\x9a\x007\x01\x1d\xff\x85\x007\x01!\xff\ +\x85\x007\x01$\x00)\x007\x01&\x00)\x007\x01\ ++\xff\x9a\x007\x01-\xff\x9a\x007\x01/\xff\x9a\x00\ +7\x011\xff\x9a\x007\x013\xff\x9a\x007\x015\xff\ +\x9a\x007\x017\xff\xd7\x007\x01<\xff\xae\x007\x01\ +>\xff\xae\x007\x01@\xff\xae\x007\x01C\xffq\x00\ +7\x01D\xff\x5c\x007\x01F\xff\x5c\x007\x01G\xff\ +\xd7\x007\x01H\xffq\x007\x01J\xff\x85\x007\x01\ +\xfb\xff\xd7\x007\x01\xfd\xff\xd7\x007\x02\x02\xff\xae\x00\ +7\x02\x03\xff\xae\x007\x02\x04\xff\xae\x007\x02\x08\xff\ +\x85\x007\x02\x0c\xff\x85\x007\x02W\xff\x9a\x007\x02\ +X\xffq\x007\x02Y\xff\x5c\x007\x02_\xff\xd7\x00\ +7\x02`\xffq\x007\x02b\xff\x9a\x007\x03\x1d\xff\ +q\x007\x03\x1e\xff\x5c\x007\x03\x1f\xffq\x007\x03\ + \xff\x5c\x007\x03!\xffq\x007\x03\x22\xff\x5c\x00\ +7\x03#\xffq\x007\x03%\xffq\x007\x03&\xff\ +\x5c\x007\x03'\xffq\x007\x03(\xff\x5c\x007\x03\ +)\xffq\x007\x03*\xff\x5c\x007\x03+\xffq\x00\ +7\x03,\xff\x5c\x007\x03-\xffq\x007\x03.\xff\ +\x5c\x007\x03/\xffq\x007\x030\xff\x5c\x007\x03\ +1\xffq\x007\x032\xff\x5c\x007\x033\xffq\x00\ +7\x034\xff\x5c\x007\x036\xffq\x007\x038\xff\ +q\x007\x03:\xffq\x007\x03<\xffq\x007\x03\ +@\xffq\x007\x03B\xffq\x007\x03D\xffq\x00\ +7\x03I\xff\xd7\x007\x03J\xffq\x007\x03K\xff\ +\xd7\x007\x03L\xffq\x007\x03M\xff\xd7\x007\x03\ +N\xffq\x007\x03O\xff\xd7\x007\x03Q\xff\xd7\x00\ +7\x03R\xffq\x007\x03S\xff\xd7\x007\x03T\xff\ +q\x007\x03U\xff\xd7\x007\x03V\xffq\x007\x03\ +W\xff\xd7\x007\x03X\xffq\x007\x03Y\xff\xd7\x00\ +7\x03Z\xffq\x007\x03[\xff\xd7\x007\x03\x5c\xff\ +q\x007\x03]\xff\xd7\x007\x03^\xffq\x007\x03\ +_\xff\xd7\x007\x03`\xffq\x007\x03b\xff\x9a\x00\ +7\x03d\xff\x9a\x007\x03f\xff\x9a\x007\x03h\xff\ +\x9a\x007\x03j\xff\x9a\x007\x03l\xff\x9a\x007\x03\ +n\xff\x9a\x007\x03p\xff\xd7\x007\x03\x8f\x00)\x00\ +8\x00\x0f\xff\xd7\x008\x00\x11\xff\xd7\x008\x00$\xff\ +\xec\x008\x00\x82\xff\xec\x008\x00\x83\xff\xec\x008\x00\ +\x84\xff\xec\x008\x00\x85\xff\xec\x008\x00\x86\xff\xec\x00\ +8\x00\x87\xff\xec\x008\x00\xc2\xff\xec\x008\x00\xc4\xff\ +\xec\x008\x00\xc6\xff\xec\x008\x01C\xff\xec\x008\x02\ +\x08\xff\xd7\x008\x02\x0c\xff\xd7\x008\x02X\xff\xec\x00\ +8\x03\x1d\xff\xec\x008\x03\x1f\xff\xec\x008\x03!\xff\ +\xec\x008\x03#\xff\xec\x008\x03%\xff\xec\x008\x03\ +'\xff\xec\x008\x03)\xff\xec\x008\x03+\xff\xec\x00\ +8\x03-\xff\xec\x008\x03/\xff\xec\x008\x031\xff\ +\xec\x008\x033\xff\xec\x009\x00\x0f\xff\x9a\x009\x00\ +\x11\xff\x9a\x009\x00\x22\x00)\x009\x00$\xff\xae\x00\ +9\x00&\xff\xec\x009\x00*\xff\xec\x009\x002\xff\ +\xec\x009\x004\xff\xec\x009\x00D\xff\xd7\x009\x00\ +F\xff\xd7\x009\x00G\xff\xd7\x009\x00H\xff\xd7\x00\ +9\x00J\xff\xec\x009\x00P\xff\xec\x009\x00Q\xff\ +\xec\x009\x00R\xff\xd7\x009\x00S\xff\xec\x009\x00\ +T\xff\xd7\x009\x00U\xff\xec\x009\x00V\xff\xec\x00\ +9\x00X\xff\xec\x009\x00\x82\xff\xae\x009\x00\x83\xff\ +\xae\x009\x00\x84\xff\xae\x009\x00\x85\xff\xae\x009\x00\ +\x86\xff\xae\x009\x00\x87\xff\xae\x009\x00\x89\xff\xec\x00\ +9\x00\x94\xff\xec\x009\x00\x95\xff\xec\x009\x00\x96\xff\ +\xec\x009\x00\x97\xff\xec\x009\x00\x98\xff\xec\x009\x00\ +\x9a\xff\xec\x009\x00\xa2\xff\xd7\x009\x00\xa3\xff\xd7\x00\ +9\x00\xa4\xff\xd7\x009\x00\xa5\xff\xd7\x009\x00\xa6\xff\ +\xd7\x009\x00\xa7\xff\xd7\x009\x00\xa8\xff\xd7\x009\x00\ +\xa9\xff\xd7\x009\x00\xaa\xff\xd7\x009\x00\xab\xff\xd7\x00\ +9\x00\xac\xff\xd7\x009\x00\xad\xff\xd7\x009\x00\xb4\xff\ +\xd7\x009\x00\xb5\xff\xd7\x009\x00\xb6\xff\xd7\x009\x00\ +\xb7\xff\xd7\x009\x00\xb8\xff\xd7\x009\x00\xba\xff\xd7\x00\ +9\x00\xbb\xff\xec\x009\x00\xbc\xff\xec\x009\x00\xbd\xff\ +\xec\x009\x00\xbe\xff\xec\x009\x00\xc2\xff\xae\x009\x00\ +\xc3\xff\xd7\x009\x00\xc4\xff\xae\x009\x00\xc5\xff\xd7\x00\ +9\x00\xc6\xff\xae\x009\x00\xc7\xff\xd7\x009\x00\xc8\xff\ +\xec\x009\x00\xc9\xff\xd7\x009\x00\xca\xff\xec\x009\x00\ +\xcb\xff\xd7\x009\x00\xcc\xff\xec\x009\x00\xcd\xff\xd7\x00\ +9\x00\xce\xff\xec\x009\x00\xcf\xff\xd7\x009\x00\xd1\xff\ +\xd7\x009\x00\xd3\xff\xd7\x009\x00\xd5\xff\xd7\x009\x00\ +\xd7\xff\xd7\x009\x00\xd9\xff\xd7\x009\x00\xdb\xff\xd7\x00\ +9\x00\xdd\xff\xd7\x009\x00\xde\xff\xec\x009\x00\xdf\xff\ +\xec\x009\x00\xe0\xff\xec\x009\x00\xe1\xff\xec\x009\x00\ +\xe2\xff\xec\x009\x00\xe3\xff\xec\x009\x00\xe4\xff\xec\x00\ +9\x00\xe5\xff\xec\x009\x00\xfa\xff\xec\x009\x01\x06\xff\ +\xec\x009\x01\x08\xff\xec\x009\x01\x0d\xff\xec\x009\x01\ +\x0e\xff\xec\x009\x01\x0f\xff\xd7\x009\x01\x10\xff\xec\x00\ +9\x01\x11\xff\xd7\x009\x01\x12\xff\xec\x009\x01\x13\xff\ +\xd7\x009\x01\x14\xff\xec\x009\x01\x15\xff\xd7\x009\x01\ +\x17\xff\xec\x009\x01\x19\xff\xec\x009\x01\x1d\xff\xec\x00\ +9\x01!\xff\xec\x009\x01+\xff\xec\x009\x01-\xff\ +\xec\x009\x01/\xff\xec\x009\x011\xff\xec\x009\x01\ +3\xff\xec\x009\x015\xff\xec\x009\x01C\xff\xae\x00\ +9\x01D\xff\xd7\x009\x01F\xff\xd7\x009\x01G\xff\ +\xec\x009\x01H\xff\xd7\x009\x01J\xff\xec\x009\x02\ +\x08\xff\x9a\x009\x02\x0c\xff\x9a\x009\x02W\xff\xec\x00\ +9\x02X\xff\xae\x009\x02Y\xff\xd7\x009\x02_\xff\ +\xec\x009\x02`\xff\xd7\x009\x02b\xff\xec\x009\x03\ +\x1d\xff\xae\x009\x03\x1e\xff\xd7\x009\x03\x1f\xff\xae\x00\ +9\x03 \xff\xd7\x009\x03!\xff\xae\x009\x03\x22\xff\ +\xd7\x009\x03#\xff\xae\x009\x03%\xff\xae\x009\x03\ +&\xff\xd7\x009\x03'\xff\xae\x009\x03(\xff\xd7\x00\ +9\x03)\xff\xae\x009\x03*\xff\xd7\x009\x03+\xff\ +\xae\x009\x03,\xff\xd7\x009\x03-\xff\xae\x009\x03\ +.\xff\xd7\x009\x03/\xff\xae\x009\x030\xff\xd7\x00\ +9\x031\xff\xae\x009\x032\xff\xd7\x009\x033\xff\ +\xae\x009\x034\xff\xd7\x009\x036\xff\xd7\x009\x03\ +8\xff\xd7\x009\x03:\xff\xd7\x009\x03<\xff\xd7\x00\ +9\x03@\xff\xd7\x009\x03B\xff\xd7\x009\x03D\xff\ +\xd7\x009\x03I\xff\xec\x009\x03J\xff\xd7\x009\x03\ +K\xff\xec\x009\x03L\xff\xd7\x009\x03M\xff\xec\x00\ +9\x03N\xff\xd7\x009\x03O\xff\xec\x009\x03Q\xff\ +\xec\x009\x03R\xff\xd7\x009\x03S\xff\xec\x009\x03\ +T\xff\xd7\x009\x03U\xff\xec\x009\x03V\xff\xd7\x00\ +9\x03W\xff\xec\x009\x03X\xff\xd7\x009\x03Y\xff\ +\xec\x009\x03Z\xff\xd7\x009\x03[\xff\xec\x009\x03\ +\x5c\xff\xd7\x009\x03]\xff\xec\x009\x03^\xff\xd7\x00\ +9\x03_\xff\xec\x009\x03`\xff\xd7\x009\x03b\xff\ +\xec\x009\x03d\xff\xec\x009\x03f\xff\xec\x009\x03\ +h\xff\xec\x009\x03j\xff\xec\x009\x03l\xff\xec\x00\ +9\x03n\xff\xec\x00:\x00\x0f\xff\x9a\x00:\x00\x11\xff\ +\x9a\x00:\x00\x22\x00)\x00:\x00$\xff\xae\x00:\x00\ +&\xff\xec\x00:\x00*\xff\xec\x00:\x002\xff\xec\x00\ +:\x004\xff\xec\x00:\x00D\xff\xd7\x00:\x00F\xff\ +\xd7\x00:\x00G\xff\xd7\x00:\x00H\xff\xd7\x00:\x00\ +J\xff\xec\x00:\x00P\xff\xec\x00:\x00Q\xff\xec\x00\ +:\x00R\xff\xd7\x00:\x00S\xff\xec\x00:\x00T\xff\ +\xd7\x00:\x00U\xff\xec\x00:\x00V\xff\xec\x00:\x00\ +X\xff\xec\x00:\x00\x82\xff\xae\x00:\x00\x83\xff\xae\x00\ +:\x00\x84\xff\xae\x00:\x00\x85\xff\xae\x00:\x00\x86\xff\ +\xae\x00:\x00\x87\xff\xae\x00:\x00\x89\xff\xec\x00:\x00\ +\x94\xff\xec\x00:\x00\x95\xff\xec\x00:\x00\x96\xff\xec\x00\ +:\x00\x97\xff\xec\x00:\x00\x98\xff\xec\x00:\x00\x9a\xff\ +\xec\x00:\x00\xa2\xff\xd7\x00:\x00\xa3\xff\xd7\x00:\x00\ +\xa4\xff\xd7\x00:\x00\xa5\xff\xd7\x00:\x00\xa6\xff\xd7\x00\ +:\x00\xa7\xff\xd7\x00:\x00\xa8\xff\xd7\x00:\x00\xa9\xff\ +\xd7\x00:\x00\xaa\xff\xd7\x00:\x00\xab\xff\xd7\x00:\x00\ +\xac\xff\xd7\x00:\x00\xad\xff\xd7\x00:\x00\xb4\xff\xd7\x00\ +:\x00\xb5\xff\xd7\x00:\x00\xb6\xff\xd7\x00:\x00\xb7\xff\ +\xd7\x00:\x00\xb8\xff\xd7\x00:\x00\xba\xff\xd7\x00:\x00\ +\xbb\xff\xec\x00:\x00\xbc\xff\xec\x00:\x00\xbd\xff\xec\x00\ +:\x00\xbe\xff\xec\x00:\x00\xc2\xff\xae\x00:\x00\xc3\xff\ +\xd7\x00:\x00\xc4\xff\xae\x00:\x00\xc5\xff\xd7\x00:\x00\ +\xc6\xff\xae\x00:\x00\xc7\xff\xd7\x00:\x00\xc8\xff\xec\x00\ +:\x00\xc9\xff\xd7\x00:\x00\xca\xff\xec\x00:\x00\xcb\xff\ +\xd7\x00:\x00\xcc\xff\xec\x00:\x00\xcd\xff\xd7\x00:\x00\ +\xce\xff\xec\x00:\x00\xcf\xff\xd7\x00:\x00\xd1\xff\xd7\x00\ +:\x00\xd3\xff\xd7\x00:\x00\xd5\xff\xd7\x00:\x00\xd7\xff\ +\xd7\x00:\x00\xd9\xff\xd7\x00:\x00\xdb\xff\xd7\x00:\x00\ +\xdd\xff\xd7\x00:\x00\xde\xff\xec\x00:\x00\xdf\xff\xec\x00\ +:\x00\xe0\xff\xec\x00:\x00\xe1\xff\xec\x00:\x00\xe2\xff\ +\xec\x00:\x00\xe3\xff\xec\x00:\x00\xe4\xff\xec\x00:\x00\ +\xe5\xff\xec\x00:\x00\xfa\xff\xec\x00:\x01\x06\xff\xec\x00\ +:\x01\x08\xff\xec\x00:\x01\x0d\xff\xec\x00:\x01\x0e\xff\ +\xec\x00:\x01\x0f\xff\xd7\x00:\x01\x10\xff\xec\x00:\x01\ +\x11\xff\xd7\x00:\x01\x12\xff\xec\x00:\x01\x13\xff\xd7\x00\ +:\x01\x14\xff\xec\x00:\x01\x15\xff\xd7\x00:\x01\x17\xff\ +\xec\x00:\x01\x19\xff\xec\x00:\x01\x1d\xff\xec\x00:\x01\ +!\xff\xec\x00:\x01+\xff\xec\x00:\x01-\xff\xec\x00\ +:\x01/\xff\xec\x00:\x011\xff\xec\x00:\x013\xff\ +\xec\x00:\x015\xff\xec\x00:\x01C\xff\xae\x00:\x01\ +D\xff\xd7\x00:\x01F\xff\xd7\x00:\x01G\xff\xec\x00\ +:\x01H\xff\xd7\x00:\x01J\xff\xec\x00:\x02\x08\xff\ +\x9a\x00:\x02\x0c\xff\x9a\x00:\x02W\xff\xec\x00:\x02\ +X\xff\xae\x00:\x02Y\xff\xd7\x00:\x02_\xff\xec\x00\ +:\x02`\xff\xd7\x00:\x02b\xff\xec\x00:\x03\x1d\xff\ +\xae\x00:\x03\x1e\xff\xd7\x00:\x03\x1f\xff\xae\x00:\x03\ + \xff\xd7\x00:\x03!\xff\xae\x00:\x03\x22\xff\xd7\x00\ +:\x03#\xff\xae\x00:\x03%\xff\xae\x00:\x03&\xff\ +\xd7\x00:\x03'\xff\xae\x00:\x03(\xff\xd7\x00:\x03\ +)\xff\xae\x00:\x03*\xff\xd7\x00:\x03+\xff\xae\x00\ +:\x03,\xff\xd7\x00:\x03-\xff\xae\x00:\x03.\xff\ +\xd7\x00:\x03/\xff\xae\x00:\x030\xff\xd7\x00:\x03\ +1\xff\xae\x00:\x032\xff\xd7\x00:\x033\xff\xae\x00\ +:\x034\xff\xd7\x00:\x036\xff\xd7\x00:\x038\xff\ +\xd7\x00:\x03:\xff\xd7\x00:\x03<\xff\xd7\x00:\x03\ +@\xff\xd7\x00:\x03B\xff\xd7\x00:\x03D\xff\xd7\x00\ +:\x03I\xff\xec\x00:\x03J\xff\xd7\x00:\x03K\xff\ +\xec\x00:\x03L\xff\xd7\x00:\x03M\xff\xec\x00:\x03\ +N\xff\xd7\x00:\x03O\xff\xec\x00:\x03Q\xff\xec\x00\ +:\x03R\xff\xd7\x00:\x03S\xff\xec\x00:\x03T\xff\ +\xd7\x00:\x03U\xff\xec\x00:\x03V\xff\xd7\x00:\x03\ +W\xff\xec\x00:\x03X\xff\xd7\x00:\x03Y\xff\xec\x00\ +:\x03Z\xff\xd7\x00:\x03[\xff\xec\x00:\x03\x5c\xff\ +\xd7\x00:\x03]\xff\xec\x00:\x03^\xff\xd7\x00:\x03\ +_\xff\xec\x00:\x03`\xff\xd7\x00:\x03b\xff\xec\x00\ +:\x03d\xff\xec\x00:\x03f\xff\xec\x00:\x03h\xff\ +\xec\x00:\x03j\xff\xec\x00:\x03l\xff\xec\x00:\x03\ +n\xff\xec\x00;\x00&\xff\xd7\x00;\x00*\xff\xd7\x00\ +;\x002\xff\xd7\x00;\x004\xff\xd7\x00;\x00\x89\xff\ +\xd7\x00;\x00\x94\xff\xd7\x00;\x00\x95\xff\xd7\x00;\x00\ +\x96\xff\xd7\x00;\x00\x97\xff\xd7\x00;\x00\x98\xff\xd7\x00\ +;\x00\x9a\xff\xd7\x00;\x00\xc8\xff\xd7\x00;\x00\xca\xff\ +\xd7\x00;\x00\xcc\xff\xd7\x00;\x00\xce\xff\xd7\x00;\x00\ +\xde\xff\xd7\x00;\x00\xe0\xff\xd7\x00;\x00\xe2\xff\xd7\x00\ +;\x00\xe4\xff\xd7\x00;\x01\x0e\xff\xd7\x00;\x01\x10\xff\ +\xd7\x00;\x01\x12\xff\xd7\x00;\x01\x14\xff\xd7\x00;\x01\ +G\xff\xd7\x00;\x02_\xff\xd7\x00;\x03I\xff\xd7\x00\ +;\x03K\xff\xd7\x00;\x03M\xff\xd7\x00;\x03O\xff\ +\xd7\x00;\x03Q\xff\xd7\x00;\x03S\xff\xd7\x00;\x03\ +U\xff\xd7\x00;\x03W\xff\xd7\x00;\x03Y\xff\xd7\x00\ +;\x03[\xff\xd7\x00;\x03]\xff\xd7\x00;\x03_\xff\ +\xd7\x00<\x00\x0f\xff\x85\x00<\x00\x11\xff\x85\x00<\x00\ +\x22\x00)\x00<\x00$\xff\x85\x00<\x00&\xff\xd7\x00\ +<\x00*\xff\xd7\x00<\x002\xff\xd7\x00<\x004\xff\ +\xd7\x00<\x00D\xff\x9a\x00<\x00F\xff\x9a\x00<\x00\ +G\xff\x9a\x00<\x00H\xff\x9a\x00<\x00J\xff\xd7\x00\ +<\x00P\xff\xc3\x00<\x00Q\xff\xc3\x00<\x00R\xff\ +\x9a\x00<\x00S\xff\xc3\x00<\x00T\xff\x9a\x00<\x00\ +U\xff\xc3\x00<\x00V\xff\xae\x00<\x00X\xff\xc3\x00\ +<\x00]\xff\xd7\x00<\x00\x82\xff\x85\x00<\x00\x83\xff\ +\x85\x00<\x00\x84\xff\x85\x00<\x00\x85\xff\x85\x00<\x00\ +\x86\xff\x85\x00<\x00\x87\xff\x85\x00<\x00\x89\xff\xd7\x00\ +<\x00\x94\xff\xd7\x00<\x00\x95\xff\xd7\x00<\x00\x96\xff\ +\xd7\x00<\x00\x97\xff\xd7\x00<\x00\x98\xff\xd7\x00<\x00\ +\x9a\xff\xd7\x00<\x00\xa2\xff\x9a\x00<\x00\xa3\xff\x9a\x00\ +<\x00\xa4\xff\x9a\x00<\x00\xa5\xff\x9a\x00<\x00\xa6\xff\ +\x9a\x00<\x00\xa7\xff\x9a\x00<\x00\xa8\xff\x9a\x00<\x00\ +\xa9\xff\x9a\x00<\x00\xaa\xff\x9a\x00<\x00\xab\xff\x9a\x00\ +<\x00\xac\xff\x9a\x00<\x00\xad\xff\x9a\x00<\x00\xb4\xff\ +\x9a\x00<\x00\xb5\xff\x9a\x00<\x00\xb6\xff\x9a\x00<\x00\ +\xb7\xff\x9a\x00<\x00\xb8\xff\x9a\x00<\x00\xba\xff\x9a\x00\ +<\x00\xbb\xff\xc3\x00<\x00\xbc\xff\xc3\x00<\x00\xbd\xff\ +\xc3\x00<\x00\xbe\xff\xc3\x00<\x00\xc2\xff\x85\x00<\x00\ +\xc3\xff\x9a\x00<\x00\xc4\xff\x85\x00<\x00\xc5\xff\x9a\x00\ +<\x00\xc6\xff\x85\x00<\x00\xc7\xff\x9a\x00<\x00\xc8\xff\ +\xd7\x00<\x00\xc9\xff\x9a\x00<\x00\xca\xff\xd7\x00<\x00\ +\xcb\xff\x9a\x00<\x00\xcc\xff\xd7\x00<\x00\xcd\xff\x9a\x00\ +<\x00\xce\xff\xd7\x00<\x00\xcf\xff\x9a\x00<\x00\xd1\xff\ +\x9a\x00<\x00\xd3\xff\x9a\x00<\x00\xd5\xff\x9a\x00<\x00\ +\xd7\xff\x9a\x00<\x00\xd9\xff\x9a\x00<\x00\xdb\xff\x9a\x00\ +<\x00\xdd\xff\x9a\x00<\x00\xde\xff\xd7\x00<\x00\xdf\xff\ +\xd7\x00<\x00\xe0\xff\xd7\x00<\x00\xe1\xff\xd7\x00<\x00\ +\xe2\xff\xd7\x00<\x00\xe3\xff\xd7\x00<\x00\xe4\xff\xd7\x00\ +<\x00\xe5\xff\xd7\x00<\x00\xfa\xff\xc3\x00<\x01\x06\xff\ +\xc3\x00<\x01\x08\xff\xc3\x00<\x01\x0d\xff\xc3\x00<\x01\ +\x0e\xff\xd7\x00<\x01\x0f\xff\x9a\x00<\x01\x10\xff\xd7\x00\ +<\x01\x11\xff\x9a\x00<\x01\x12\xff\xd7\x00<\x01\x13\xff\ +\x9a\x00<\x01\x14\xff\xd7\x00<\x01\x15\xff\x9a\x00<\x01\ +\x17\xff\xc3\x00<\x01\x19\xff\xc3\x00<\x01\x1d\xff\xae\x00\ +<\x01!\xff\xae\x00<\x01+\xff\xc3\x00<\x01-\xff\ +\xc3\x00<\x01/\xff\xc3\x00<\x011\xff\xc3\x00<\x01\ +3\xff\xc3\x00<\x015\xff\xc3\x00<\x01<\xff\xd7\x00\ +<\x01>\xff\xd7\x00<\x01@\xff\xd7\x00<\x01C\xff\ +\x85\x00<\x01D\xff\x9a\x00<\x01F\xff\x9a\x00<\x01\ +G\xff\xd7\x00<\x01H\xff\x9a\x00<\x01J\xff\xae\x00\ +<\x02\x08\xff\x85\x00<\x02\x0c\xff\x85\x00<\x02W\xff\ +\xc3\x00<\x02X\xff\x85\x00<\x02Y\xff\x9a\x00<\x02\ +_\xff\xd7\x00<\x02`\xff\x9a\x00<\x02b\xff\xc3\x00\ +<\x03\x1d\xff\x85\x00<\x03\x1e\xff\x9a\x00<\x03\x1f\xff\ +\x85\x00<\x03 \xff\x9a\x00<\x03!\xff\x85\x00<\x03\ +\x22\xff\x9a\x00<\x03#\xff\x85\x00<\x03%\xff\x85\x00\ +<\x03&\xff\x9a\x00<\x03'\xff\x85\x00<\x03(\xff\ +\x9a\x00<\x03)\xff\x85\x00<\x03*\xff\x9a\x00<\x03\ ++\xff\x85\x00<\x03,\xff\x9a\x00<\x03-\xff\x85\x00\ +<\x03.\xff\x9a\x00<\x03/\xff\x85\x00<\x030\xff\ +\x9a\x00<\x031\xff\x85\x00<\x032\xff\x9a\x00<\x03\ +3\xff\x85\x00<\x034\xff\x9a\x00<\x036\xff\x9a\x00\ +<\x038\xff\x9a\x00<\x03:\xff\x9a\x00<\x03<\xff\ +\x9a\x00<\x03@\xff\x9a\x00<\x03B\xff\x9a\x00<\x03\ +D\xff\x9a\x00<\x03I\xff\xd7\x00<\x03J\xff\x9a\x00\ +<\x03K\xff\xd7\x00<\x03L\xff\x9a\x00<\x03M\xff\ +\xd7\x00<\x03N\xff\x9a\x00<\x03O\xff\xd7\x00<\x03\ +Q\xff\xd7\x00<\x03R\xff\x9a\x00<\x03S\xff\xd7\x00\ +<\x03T\xff\x9a\x00<\x03U\xff\xd7\x00<\x03V\xff\ +\x9a\x00<\x03W\xff\xd7\x00<\x03X\xff\x9a\x00<\x03\ +Y\xff\xd7\x00<\x03Z\xff\x9a\x00<\x03[\xff\xd7\x00\ +<\x03\x5c\xff\x9a\x00<\x03]\xff\xd7\x00<\x03^\xff\ +\x9a\x00<\x03_\xff\xd7\x00<\x03`\xff\x9a\x00<\x03\ +b\xff\xc3\x00<\x03d\xff\xc3\x00<\x03f\xff\xc3\x00\ +<\x03h\xff\xc3\x00<\x03j\xff\xc3\x00<\x03l\xff\ +\xc3\x00<\x03n\xff\xc3\x00=\x00&\xff\xec\x00=\x00\ +*\xff\xec\x00=\x002\xff\xec\x00=\x004\xff\xec\x00\ +=\x00\x89\xff\xec\x00=\x00\x94\xff\xec\x00=\x00\x95\xff\ +\xec\x00=\x00\x96\xff\xec\x00=\x00\x97\xff\xec\x00=\x00\ +\x98\xff\xec\x00=\x00\x9a\xff\xec\x00=\x00\xc8\xff\xec\x00\ +=\x00\xca\xff\xec\x00=\x00\xcc\xff\xec\x00=\x00\xce\xff\ +\xec\x00=\x00\xde\xff\xec\x00=\x00\xe0\xff\xec\x00=\x00\ +\xe2\xff\xec\x00=\x00\xe4\xff\xec\x00=\x01\x0e\xff\xec\x00\ +=\x01\x10\xff\xec\x00=\x01\x12\xff\xec\x00=\x01\x14\xff\ +\xec\x00=\x01G\xff\xec\x00=\x02_\xff\xec\x00=\x03\ +I\xff\xec\x00=\x03K\xff\xec\x00=\x03M\xff\xec\x00\ +=\x03O\xff\xec\x00=\x03Q\xff\xec\x00=\x03S\xff\ +\xec\x00=\x03U\xff\xec\x00=\x03W\xff\xec\x00=\x03\ +Y\xff\xec\x00=\x03[\xff\xec\x00=\x03]\xff\xec\x00\ +=\x03_\xff\xec\x00>\x00-\x00\xb8\x00D\x00\x05\xff\ +\xec\x00D\x00\x0a\xff\xec\x00D\x02\x07\xff\xec\x00D\x02\ +\x0b\xff\xec\x00E\x00\x05\xff\xec\x00E\x00\x0a\xff\xec\x00\ +E\x00Y\xff\xd7\x00E\x00Z\xff\xd7\x00E\x00[\xff\ +\xd7\x00E\x00\x5c\xff\xd7\x00E\x00]\xff\xec\x00E\x00\ +\xbf\xff\xd7\x00E\x017\xff\xd7\x00E\x01<\xff\xec\x00\ +E\x01>\xff\xec\x00E\x01@\xff\xec\x00E\x01\xfb\xff\ +\xd7\x00E\x01\xfd\xff\xd7\x00E\x02\x07\xff\xec\x00E\x02\ +\x0b\xff\xec\x00E\x03p\xff\xd7\x00F\x00\x05\x00)\x00\ +F\x00\x0a\x00)\x00F\x02\x07\x00)\x00F\x02\x0b\x00\ +)\x00H\x00\x05\xff\xec\x00H\x00\x0a\xff\xec\x00H\x00\ +Y\xff\xd7\x00H\x00Z\xff\xd7\x00H\x00[\xff\xd7\x00\ +H\x00\x5c\xff\xd7\x00H\x00]\xff\xec\x00H\x00\xbf\xff\ +\xd7\x00H\x017\xff\xd7\x00H\x01<\xff\xec\x00H\x01\ +>\xff\xec\x00H\x01@\xff\xec\x00H\x01\xfb\xff\xd7\x00\ +H\x01\xfd\xff\xd7\x00H\x02\x07\xff\xec\x00H\x02\x0b\xff\ +\xec\x00H\x03p\xff\xd7\x00I\x00\x05\x00{\x00I\x00\ +\x0a\x00{\x00I\x02\x07\x00{\x00I\x02\x0b\x00{\x00\ +K\x00\x05\xff\xec\x00K\x00\x0a\xff\xec\x00K\x02\x07\xff\ +\xec\x00K\x02\x0b\xff\xec\x00N\x00F\xff\xd7\x00N\x00\ +G\xff\xd7\x00N\x00H\xff\xd7\x00N\x00R\xff\xd7\x00\ +N\x00T\xff\xd7\x00N\x00\xa2\xff\xd7\x00N\x00\xa9\xff\ +\xd7\x00N\x00\xaa\xff\xd7\x00N\x00\xab\xff\xd7\x00N\x00\ +\xac\xff\xd7\x00N\x00\xad\xff\xd7\x00N\x00\xb4\xff\xd7\x00\ +N\x00\xb5\xff\xd7\x00N\x00\xb6\xff\xd7\x00N\x00\xb7\xff\ +\xd7\x00N\x00\xb8\xff\xd7\x00N\x00\xba\xff\xd7\x00N\x00\ +\xc9\xff\xd7\x00N\x00\xcb\xff\xd7\x00N\x00\xcd\xff\xd7\x00\ +N\x00\xcf\xff\xd7\x00N\x00\xd1\xff\xd7\x00N\x00\xd3\xff\ +\xd7\x00N\x00\xd5\xff\xd7\x00N\x00\xd7\xff\xd7\x00N\x00\ +\xd9\xff\xd7\x00N\x00\xdb\xff\xd7\x00N\x00\xdd\xff\xd7\x00\ +N\x01\x0f\xff\xd7\x00N\x01\x11\xff\xd7\x00N\x01\x13\xff\ +\xd7\x00N\x01\x15\xff\xd7\x00N\x01H\xff\xd7\x00N\x02\ +`\xff\xd7\x00N\x036\xff\xd7\x00N\x038\xff\xd7\x00\ +N\x03:\xff\xd7\x00N\x03<\xff\xd7\x00N\x03@\xff\ +\xd7\x00N\x03B\xff\xd7\x00N\x03D\xff\xd7\x00N\x03\ +J\xff\xd7\x00N\x03L\xff\xd7\x00N\x03N\xff\xd7\x00\ +N\x03R\xff\xd7\x00N\x03T\xff\xd7\x00N\x03V\xff\ +\xd7\x00N\x03X\xff\xd7\x00N\x03Z\xff\xd7\x00N\x03\ +\x5c\xff\xd7\x00N\x03^\xff\xd7\x00N\x03`\xff\xd7\x00\ +P\x00\x05\xff\xec\x00P\x00\x0a\xff\xec\x00P\x02\x07\xff\ +\xec\x00P\x02\x0b\xff\xec\x00Q\x00\x05\xff\xec\x00Q\x00\ +\x0a\xff\xec\x00Q\x02\x07\xff\xec\x00Q\x02\x0b\xff\xec\x00\ +R\x00\x05\xff\xec\x00R\x00\x0a\xff\xec\x00R\x00Y\xff\ +\xd7\x00R\x00Z\xff\xd7\x00R\x00[\xff\xd7\x00R\x00\ +\x5c\xff\xd7\x00R\x00]\xff\xec\x00R\x00\xbf\xff\xd7\x00\ +R\x017\xff\xd7\x00R\x01<\xff\xec\x00R\x01>\xff\ +\xec\x00R\x01@\xff\xec\x00R\x01\xfb\xff\xd7\x00R\x01\ +\xfd\xff\xd7\x00R\x02\x07\xff\xec\x00R\x02\x0b\xff\xec\x00\ +R\x03p\xff\xd7\x00S\x00\x05\xff\xec\x00S\x00\x0a\xff\ +\xec\x00S\x00Y\xff\xd7\x00S\x00Z\xff\xd7\x00S\x00\ +[\xff\xd7\x00S\x00\x5c\xff\xd7\x00S\x00]\xff\xec\x00\ +S\x00\xbf\xff\xd7\x00S\x017\xff\xd7\x00S\x01<\xff\ +\xec\x00S\x01>\xff\xec\x00S\x01@\xff\xec\x00S\x01\ +\xfb\xff\xd7\x00S\x01\xfd\xff\xd7\x00S\x02\x07\xff\xec\x00\ +S\x02\x0b\xff\xec\x00S\x03p\xff\xd7\x00U\x00\x05\x00\ +R\x00U\x00\x0a\x00R\x00U\x00D\xff\xd7\x00U\x00\ +F\xff\xd7\x00U\x00G\xff\xd7\x00U\x00H\xff\xd7\x00\ +U\x00J\xff\xec\x00U\x00R\xff\xd7\x00U\x00T\xff\ +\xd7\x00U\x00\xa2\xff\xd7\x00U\x00\xa3\xff\xd7\x00U\x00\ +\xa4\xff\xd7\x00U\x00\xa5\xff\xd7\x00U\x00\xa6\xff\xd7\x00\ +U\x00\xa7\xff\xd7\x00U\x00\xa8\xff\xd7\x00U\x00\xa9\xff\ +\xd7\x00U\x00\xaa\xff\xd7\x00U\x00\xab\xff\xd7\x00U\x00\ +\xac\xff\xd7\x00U\x00\xad\xff\xd7\x00U\x00\xb4\xff\xd7\x00\ +U\x00\xb5\xff\xd7\x00U\x00\xb6\xff\xd7\x00U\x00\xb7\xff\ +\xd7\x00U\x00\xb8\xff\xd7\x00U\x00\xba\xff\xd7\x00U\x00\ +\xc3\xff\xd7\x00U\x00\xc5\xff\xd7\x00U\x00\xc7\xff\xd7\x00\ +U\x00\xc9\xff\xd7\x00U\x00\xcb\xff\xd7\x00U\x00\xcd\xff\ +\xd7\x00U\x00\xcf\xff\xd7\x00U\x00\xd1\xff\xd7\x00U\x00\ +\xd3\xff\xd7\x00U\x00\xd5\xff\xd7\x00U\x00\xd7\xff\xd7\x00\ +U\x00\xd9\xff\xd7\x00U\x00\xdb\xff\xd7\x00U\x00\xdd\xff\ +\xd7\x00U\x00\xdf\xff\xec\x00U\x00\xe1\xff\xec\x00U\x00\ +\xe3\xff\xec\x00U\x00\xe5\xff\xec\x00U\x01\x0f\xff\xd7\x00\ +U\x01\x11\xff\xd7\x00U\x01\x13\xff\xd7\x00U\x01\x15\xff\ +\xd7\x00U\x01D\xff\xd7\x00U\x01F\xff\xd7\x00U\x01\ +H\xff\xd7\x00U\x02\x07\x00R\x00U\x02\x0b\x00R\x00\ +U\x02Y\xff\xd7\x00U\x02`\xff\xd7\x00U\x03\x1e\xff\ +\xd7\x00U\x03 \xff\xd7\x00U\x03\x22\xff\xd7\x00U\x03\ +&\xff\xd7\x00U\x03(\xff\xd7\x00U\x03*\xff\xd7\x00\ +U\x03,\xff\xd7\x00U\x03.\xff\xd7\x00U\x030\xff\ +\xd7\x00U\x032\xff\xd7\x00U\x034\xff\xd7\x00U\x03\ +6\xff\xd7\x00U\x038\xff\xd7\x00U\x03:\xff\xd7\x00\ +U\x03<\xff\xd7\x00U\x03@\xff\xd7\x00U\x03B\xff\ +\xd7\x00U\x03D\xff\xd7\x00U\x03J\xff\xd7\x00U\x03\ +L\xff\xd7\x00U\x03N\xff\xd7\x00U\x03R\xff\xd7\x00\ +U\x03T\xff\xd7\x00U\x03V\xff\xd7\x00U\x03X\xff\ +\xd7\x00U\x03Z\xff\xd7\x00U\x03\x5c\xff\xd7\x00U\x03\ +^\xff\xd7\x00U\x03`\xff\xd7\x00W\x00\x05\x00)\x00\ +W\x00\x0a\x00)\x00W\x02\x07\x00)\x00W\x02\x0b\x00\ +)\x00Y\x00\x05\x00R\x00Y\x00\x0a\x00R\x00Y\x00\ +\x0f\xff\xae\x00Y\x00\x11\xff\xae\x00Y\x00\x22\x00)\x00\ +Y\x02\x07\x00R\x00Y\x02\x08\xff\xae\x00Y\x02\x0b\x00\ +R\x00Y\x02\x0c\xff\xae\x00Z\x00\x05\x00R\x00Z\x00\ +\x0a\x00R\x00Z\x00\x0f\xff\xae\x00Z\x00\x11\xff\xae\x00\ +Z\x00\x22\x00)\x00Z\x02\x07\x00R\x00Z\x02\x08\xff\ +\xae\x00Z\x02\x0b\x00R\x00Z\x02\x0c\xff\xae\x00[\x00\ +F\xff\xd7\x00[\x00G\xff\xd7\x00[\x00H\xff\xd7\x00\ +[\x00R\xff\xd7\x00[\x00T\xff\xd7\x00[\x00\xa2\xff\ +\xd7\x00[\x00\xa9\xff\xd7\x00[\x00\xaa\xff\xd7\x00[\x00\ +\xab\xff\xd7\x00[\x00\xac\xff\xd7\x00[\x00\xad\xff\xd7\x00\ +[\x00\xb4\xff\xd7\x00[\x00\xb5\xff\xd7\x00[\x00\xb6\xff\ +\xd7\x00[\x00\xb7\xff\xd7\x00[\x00\xb8\xff\xd7\x00[\x00\ +\xba\xff\xd7\x00[\x00\xc9\xff\xd7\x00[\x00\xcb\xff\xd7\x00\ +[\x00\xcd\xff\xd7\x00[\x00\xcf\xff\xd7\x00[\x00\xd1\xff\ +\xd7\x00[\x00\xd3\xff\xd7\x00[\x00\xd5\xff\xd7\x00[\x00\ +\xd7\xff\xd7\x00[\x00\xd9\xff\xd7\x00[\x00\xdb\xff\xd7\x00\ +[\x00\xdd\xff\xd7\x00[\x01\x0f\xff\xd7\x00[\x01\x11\xff\ +\xd7\x00[\x01\x13\xff\xd7\x00[\x01\x15\xff\xd7\x00[\x01\ +H\xff\xd7\x00[\x02`\xff\xd7\x00[\x036\xff\xd7\x00\ +[\x038\xff\xd7\x00[\x03:\xff\xd7\x00[\x03<\xff\ +\xd7\x00[\x03@\xff\xd7\x00[\x03B\xff\xd7\x00[\x03\ +D\xff\xd7\x00[\x03J\xff\xd7\x00[\x03L\xff\xd7\x00\ +[\x03N\xff\xd7\x00[\x03R\xff\xd7\x00[\x03T\xff\ +\xd7\x00[\x03V\xff\xd7\x00[\x03X\xff\xd7\x00[\x03\ +Z\xff\xd7\x00[\x03\x5c\xff\xd7\x00[\x03^\xff\xd7\x00\ +[\x03`\xff\xd7\x00\x5c\x00\x05\x00R\x00\x5c\x00\x0a\x00\ +R\x00\x5c\x00\x0f\xff\xae\x00\x5c\x00\x11\xff\xae\x00\x5c\x00\ +\x22\x00)\x00\x5c\x02\x07\x00R\x00\x5c\x02\x08\xff\xae\x00\ +\x5c\x02\x0b\x00R\x00\x5c\x02\x0c\xff\xae\x00^\x00-\x00\ +\xb8\x00\x82\x00\x05\xffq\x00\x82\x00\x0a\xffq\x00\x82\x00\ +&\xff\xd7\x00\x82\x00*\xff\xd7\x00\x82\x00-\x01\x0a\x00\ +\x82\x002\xff\xd7\x00\x82\x004\xff\xd7\x00\x82\x007\xff\ +q\x00\x82\x009\xff\xae\x00\x82\x00:\xff\xae\x00\x82\x00\ +<\xff\x85\x00\x82\x00\x89\xff\xd7\x00\x82\x00\x94\xff\xd7\x00\ +\x82\x00\x95\xff\xd7\x00\x82\x00\x96\xff\xd7\x00\x82\x00\x97\xff\ +\xd7\x00\x82\x00\x98\xff\xd7\x00\x82\x00\x9a\xff\xd7\x00\x82\x00\ +\x9f\xff\x85\x00\x82\x00\xc8\xff\xd7\x00\x82\x00\xca\xff\xd7\x00\ +\x82\x00\xcc\xff\xd7\x00\x82\x00\xce\xff\xd7\x00\x82\x00\xde\xff\ +\xd7\x00\x82\x00\xe0\xff\xd7\x00\x82\x00\xe2\xff\xd7\x00\x82\x00\ +\xe4\xff\xd7\x00\x82\x01\x0e\xff\xd7\x00\x82\x01\x10\xff\xd7\x00\ +\x82\x01\x12\xff\xd7\x00\x82\x01\x14\xff\xd7\x00\x82\x01$\xff\ +q\x00\x82\x01&\xffq\x00\x82\x016\xff\xae\x00\x82\x01\ +8\xff\x85\x00\x82\x01:\xff\x85\x00\x82\x01G\xff\xd7\x00\ +\x82\x01\xfa\xff\xae\x00\x82\x01\xfc\xff\xae\x00\x82\x01\xfe\xff\ +\xae\x00\x82\x02\x00\xff\x85\x00\x82\x02\x07\xffq\x00\x82\x02\ +\x0b\xffq\x00\x82\x02_\xff\xd7\x00\x82\x03I\xff\xd7\x00\ +\x82\x03K\xff\xd7\x00\x82\x03M\xff\xd7\x00\x82\x03O\xff\ +\xd7\x00\x82\x03Q\xff\xd7\x00\x82\x03S\xff\xd7\x00\x82\x03\ +U\xff\xd7\x00\x82\x03W\xff\xd7\x00\x82\x03Y\xff\xd7\x00\ +\x82\x03[\xff\xd7\x00\x82\x03]\xff\xd7\x00\x82\x03_\xff\ +\xd7\x00\x82\x03o\xff\x85\x00\x82\x03q\xff\x85\x00\x82\x03\ +s\xff\x85\x00\x82\x03\x8f\xffq\x00\x83\x00\x05\xffq\x00\ +\x83\x00\x0a\xffq\x00\x83\x00&\xff\xd7\x00\x83\x00*\xff\ +\xd7\x00\x83\x00-\x01\x0a\x00\x83\x002\xff\xd7\x00\x83\x00\ +4\xff\xd7\x00\x83\x007\xffq\x00\x83\x009\xff\xae\x00\ +\x83\x00:\xff\xae\x00\x83\x00<\xff\x85\x00\x83\x00\x89\xff\ +\xd7\x00\x83\x00\x94\xff\xd7\x00\x83\x00\x95\xff\xd7\x00\x83\x00\ +\x96\xff\xd7\x00\x83\x00\x97\xff\xd7\x00\x83\x00\x98\xff\xd7\x00\ +\x83\x00\x9a\xff\xd7\x00\x83\x00\x9f\xff\x85\x00\x83\x00\xc8\xff\ +\xd7\x00\x83\x00\xca\xff\xd7\x00\x83\x00\xcc\xff\xd7\x00\x83\x00\ +\xce\xff\xd7\x00\x83\x00\xde\xff\xd7\x00\x83\x00\xe0\xff\xd7\x00\ +\x83\x00\xe2\xff\xd7\x00\x83\x00\xe4\xff\xd7\x00\x83\x01\x0e\xff\ +\xd7\x00\x83\x01\x10\xff\xd7\x00\x83\x01\x12\xff\xd7\x00\x83\x01\ +\x14\xff\xd7\x00\x83\x01$\xffq\x00\x83\x01&\xffq\x00\ +\x83\x016\xff\xae\x00\x83\x018\xff\x85\x00\x83\x01:\xff\ +\x85\x00\x83\x01G\xff\xd7\x00\x83\x01\xfa\xff\xae\x00\x83\x01\ +\xfc\xff\xae\x00\x83\x01\xfe\xff\xae\x00\x83\x02\x00\xff\x85\x00\ +\x83\x02\x07\xffq\x00\x83\x02\x0b\xffq\x00\x83\x02_\xff\ +\xd7\x00\x83\x03I\xff\xd7\x00\x83\x03K\xff\xd7\x00\x83\x03\ +M\xff\xd7\x00\x83\x03O\xff\xd7\x00\x83\x03Q\xff\xd7\x00\ +\x83\x03S\xff\xd7\x00\x83\x03U\xff\xd7\x00\x83\x03W\xff\ +\xd7\x00\x83\x03Y\xff\xd7\x00\x83\x03[\xff\xd7\x00\x83\x03\ +]\xff\xd7\x00\x83\x03_\xff\xd7\x00\x83\x03o\xff\x85\x00\ +\x83\x03q\xff\x85\x00\x83\x03s\xff\x85\x00\x83\x03\x8f\xff\ +q\x00\x84\x00\x05\xffq\x00\x84\x00\x0a\xffq\x00\x84\x00\ +&\xff\xd7\x00\x84\x00*\xff\xd7\x00\x84\x00-\x01\x0a\x00\ +\x84\x002\xff\xd7\x00\x84\x004\xff\xd7\x00\x84\x007\xff\ +q\x00\x84\x009\xff\xae\x00\x84\x00:\xff\xae\x00\x84\x00\ +<\xff\x85\x00\x84\x00\x89\xff\xd7\x00\x84\x00\x94\xff\xd7\x00\ +\x84\x00\x95\xff\xd7\x00\x84\x00\x96\xff\xd7\x00\x84\x00\x97\xff\ +\xd7\x00\x84\x00\x98\xff\xd7\x00\x84\x00\x9a\xff\xd7\x00\x84\x00\ +\x9f\xff\x85\x00\x84\x00\xc8\xff\xd7\x00\x84\x00\xca\xff\xd7\x00\ +\x84\x00\xcc\xff\xd7\x00\x84\x00\xce\xff\xd7\x00\x84\x00\xde\xff\ +\xd7\x00\x84\x00\xe0\xff\xd7\x00\x84\x00\xe2\xff\xd7\x00\x84\x00\ +\xe4\xff\xd7\x00\x84\x01\x0e\xff\xd7\x00\x84\x01\x10\xff\xd7\x00\ +\x84\x01\x12\xff\xd7\x00\x84\x01\x14\xff\xd7\x00\x84\x01$\xff\ +q\x00\x84\x01&\xffq\x00\x84\x016\xff\xae\x00\x84\x01\ +8\xff\x85\x00\x84\x01:\xff\x85\x00\x84\x01G\xff\xd7\x00\ +\x84\x01\xfa\xff\xae\x00\x84\x01\xfc\xff\xae\x00\x84\x01\xfe\xff\ +\xae\x00\x84\x02\x00\xff\x85\x00\x84\x02\x07\xffq\x00\x84\x02\ +\x0b\xffq\x00\x84\x02_\xff\xd7\x00\x84\x03I\xff\xd7\x00\ +\x84\x03K\xff\xd7\x00\x84\x03M\xff\xd7\x00\x84\x03O\xff\ +\xd7\x00\x84\x03Q\xff\xd7\x00\x84\x03S\xff\xd7\x00\x84\x03\ +U\xff\xd7\x00\x84\x03W\xff\xd7\x00\x84\x03Y\xff\xd7\x00\ +\x84\x03[\xff\xd7\x00\x84\x03]\xff\xd7\x00\x84\x03_\xff\ +\xd7\x00\x84\x03o\xff\x85\x00\x84\x03q\xff\x85\x00\x84\x03\ +s\xff\x85\x00\x84\x03\x8f\xffq\x00\x85\x00\x05\xffq\x00\ +\x85\x00\x0a\xffq\x00\x85\x00&\xff\xd7\x00\x85\x00*\xff\ +\xd7\x00\x85\x00-\x01\x0a\x00\x85\x002\xff\xd7\x00\x85\x00\ +4\xff\xd7\x00\x85\x007\xffq\x00\x85\x009\xff\xae\x00\ +\x85\x00:\xff\xae\x00\x85\x00<\xff\x85\x00\x85\x00\x89\xff\ +\xd7\x00\x85\x00\x94\xff\xd7\x00\x85\x00\x95\xff\xd7\x00\x85\x00\ +\x96\xff\xd7\x00\x85\x00\x97\xff\xd7\x00\x85\x00\x98\xff\xd7\x00\ +\x85\x00\x9a\xff\xd7\x00\x85\x00\x9f\xff\x85\x00\x85\x00\xc8\xff\ +\xd7\x00\x85\x00\xca\xff\xd7\x00\x85\x00\xcc\xff\xd7\x00\x85\x00\ +\xce\xff\xd7\x00\x85\x00\xde\xff\xd7\x00\x85\x00\xe0\xff\xd7\x00\ +\x85\x00\xe2\xff\xd7\x00\x85\x00\xe4\xff\xd7\x00\x85\x01\x0e\xff\ +\xd7\x00\x85\x01\x10\xff\xd7\x00\x85\x01\x12\xff\xd7\x00\x85\x01\ +\x14\xff\xd7\x00\x85\x01$\xffq\x00\x85\x01&\xffq\x00\ +\x85\x016\xff\xae\x00\x85\x018\xff\x85\x00\x85\x01:\xff\ +\x85\x00\x85\x01G\xff\xd7\x00\x85\x01\xfa\xff\xae\x00\x85\x01\ +\xfc\xff\xae\x00\x85\x01\xfe\xff\xae\x00\x85\x02\x00\xff\x85\x00\ +\x85\x02\x07\xffq\x00\x85\x02\x0b\xffq\x00\x85\x02_\xff\ +\xd7\x00\x85\x03I\xff\xd7\x00\x85\x03K\xff\xd7\x00\x85\x03\ +M\xff\xd7\x00\x85\x03O\xff\xd7\x00\x85\x03Q\xff\xd7\x00\ +\x85\x03S\xff\xd7\x00\x85\x03U\xff\xd7\x00\x85\x03W\xff\ +\xd7\x00\x85\x03Y\xff\xd7\x00\x85\x03[\xff\xd7\x00\x85\x03\ +]\xff\xd7\x00\x85\x03_\xff\xd7\x00\x85\x03o\xff\x85\x00\ +\x85\x03q\xff\x85\x00\x85\x03s\xff\x85\x00\x85\x03\x8f\xff\ +q\x00\x86\x00\x05\xffq\x00\x86\x00\x0a\xffq\x00\x86\x00\ +&\xff\xd7\x00\x86\x00*\xff\xd7\x00\x86\x00-\x01\x0a\x00\ +\x86\x002\xff\xd7\x00\x86\x004\xff\xd7\x00\x86\x007\xff\ +q\x00\x86\x009\xff\xae\x00\x86\x00:\xff\xae\x00\x86\x00\ +<\xff\x85\x00\x86\x00\x89\xff\xd7\x00\x86\x00\x94\xff\xd7\x00\ +\x86\x00\x95\xff\xd7\x00\x86\x00\x96\xff\xd7\x00\x86\x00\x97\xff\ +\xd7\x00\x86\x00\x98\xff\xd7\x00\x86\x00\x9a\xff\xd7\x00\x86\x00\ +\x9f\xff\x85\x00\x86\x00\xc8\xff\xd7\x00\x86\x00\xca\xff\xd7\x00\ +\x86\x00\xcc\xff\xd7\x00\x86\x00\xce\xff\xd7\x00\x86\x00\xde\xff\ +\xd7\x00\x86\x00\xe0\xff\xd7\x00\x86\x00\xe2\xff\xd7\x00\x86\x00\ +\xe4\xff\xd7\x00\x86\x01\x0e\xff\xd7\x00\x86\x01\x10\xff\xd7\x00\ +\x86\x01\x12\xff\xd7\x00\x86\x01\x14\xff\xd7\x00\x86\x01$\xff\ +q\x00\x86\x01&\xffq\x00\x86\x016\xff\xae\x00\x86\x01\ +8\xff\x85\x00\x86\x01:\xff\x85\x00\x86\x01G\xff\xd7\x00\ +\x86\x01\xfa\xff\xae\x00\x86\x01\xfc\xff\xae\x00\x86\x01\xfe\xff\ +\xae\x00\x86\x02\x00\xff\x85\x00\x86\x02\x07\xffq\x00\x86\x02\ +\x0b\xffq\x00\x86\x02_\xff\xd7\x00\x86\x03I\xff\xd7\x00\ +\x86\x03K\xff\xd7\x00\x86\x03M\xff\xd7\x00\x86\x03O\xff\ +\xd7\x00\x86\x03Q\xff\xd7\x00\x86\x03S\xff\xd7\x00\x86\x03\ +U\xff\xd7\x00\x86\x03W\xff\xd7\x00\x86\x03Y\xff\xd7\x00\ +\x86\x03[\xff\xd7\x00\x86\x03]\xff\xd7\x00\x86\x03_\xff\ +\xd7\x00\x86\x03o\xff\x85\x00\x86\x03q\xff\x85\x00\x86\x03\ +s\xff\x85\x00\x86\x03\x8f\xffq\x00\x87\x00\x05\xffq\x00\ +\x87\x00\x0a\xffq\x00\x87\x00&\xff\xd7\x00\x87\x00*\xff\ +\xd7\x00\x87\x00-\x01\x0a\x00\x87\x002\xff\xd7\x00\x87\x00\ +4\xff\xd7\x00\x87\x007\xffq\x00\x87\x009\xff\xae\x00\ +\x87\x00:\xff\xae\x00\x87\x00<\xff\x85\x00\x87\x00\x89\xff\ +\xd7\x00\x87\x00\x94\xff\xd7\x00\x87\x00\x95\xff\xd7\x00\x87\x00\ +\x96\xff\xd7\x00\x87\x00\x97\xff\xd7\x00\x87\x00\x98\xff\xd7\x00\ +\x87\x00\x9a\xff\xd7\x00\x87\x00\x9f\xff\x85\x00\x87\x00\xc8\xff\ +\xd7\x00\x87\x00\xca\xff\xd7\x00\x87\x00\xcc\xff\xd7\x00\x87\x00\ +\xce\xff\xd7\x00\x87\x00\xde\xff\xd7\x00\x87\x00\xe0\xff\xd7\x00\ +\x87\x00\xe2\xff\xd7\x00\x87\x00\xe4\xff\xd7\x00\x87\x01\x0e\xff\ +\xd7\x00\x87\x01\x10\xff\xd7\x00\x87\x01\x12\xff\xd7\x00\x87\x01\ +\x14\xff\xd7\x00\x87\x01$\xffq\x00\x87\x01&\xffq\x00\ +\x87\x016\xff\xae\x00\x87\x018\xff\x85\x00\x87\x01:\xff\ +\x85\x00\x87\x01G\xff\xd7\x00\x87\x01\xfa\xff\xae\x00\x87\x01\ +\xfc\xff\xae\x00\x87\x01\xfe\xff\xae\x00\x87\x02\x00\xff\x85\x00\ +\x87\x02\x07\xffq\x00\x87\x02\x0b\xffq\x00\x87\x02_\xff\ +\xd7\x00\x87\x03I\xff\xd7\x00\x87\x03K\xff\xd7\x00\x87\x03\ +M\xff\xd7\x00\x87\x03O\xff\xd7\x00\x87\x03Q\xff\xd7\x00\ +\x87\x03S\xff\xd7\x00\x87\x03U\xff\xd7\x00\x87\x03W\xff\ +\xd7\x00\x87\x03Y\xff\xd7\x00\x87\x03[\xff\xd7\x00\x87\x03\ +]\xff\xd7\x00\x87\x03_\xff\xd7\x00\x87\x03o\xff\x85\x00\ +\x87\x03q\xff\x85\x00\x87\x03s\xff\x85\x00\x87\x03\x8f\xff\ +q\x00\x88\x00-\x00{\x00\x89\x00&\xff\xd7\x00\x89\x00\ +*\xff\xd7\x00\x89\x002\xff\xd7\x00\x89\x004\xff\xd7\x00\ +\x89\x00\x89\xff\xd7\x00\x89\x00\x94\xff\xd7\x00\x89\x00\x95\xff\ +\xd7\x00\x89\x00\x96\xff\xd7\x00\x89\x00\x97\xff\xd7\x00\x89\x00\ +\x98\xff\xd7\x00\x89\x00\x9a\xff\xd7\x00\x89\x00\xc8\xff\xd7\x00\ +\x89\x00\xca\xff\xd7\x00\x89\x00\xcc\xff\xd7\x00\x89\x00\xce\xff\ +\xd7\x00\x89\x00\xde\xff\xd7\x00\x89\x00\xe0\xff\xd7\x00\x89\x00\ +\xe2\xff\xd7\x00\x89\x00\xe4\xff\xd7\x00\x89\x01\x0e\xff\xd7\x00\ +\x89\x01\x10\xff\xd7\x00\x89\x01\x12\xff\xd7\x00\x89\x01\x14\xff\ +\xd7\x00\x89\x01G\xff\xd7\x00\x89\x02_\xff\xd7\x00\x89\x03\ +I\xff\xd7\x00\x89\x03K\xff\xd7\x00\x89\x03M\xff\xd7\x00\ +\x89\x03O\xff\xd7\x00\x89\x03Q\xff\xd7\x00\x89\x03S\xff\ +\xd7\x00\x89\x03U\xff\xd7\x00\x89\x03W\xff\xd7\x00\x89\x03\ +Y\xff\xd7\x00\x89\x03[\xff\xd7\x00\x89\x03]\xff\xd7\x00\ +\x89\x03_\xff\xd7\x00\x8a\x00-\x00{\x00\x8b\x00-\x00\ +{\x00\x8c\x00-\x00{\x00\x8d\x00-\x00{\x00\x92\x00\ +\x0f\xff\xae\x00\x92\x00\x11\xff\xae\x00\x92\x00$\xff\xd7\x00\ +\x92\x007\xff\xc3\x00\x92\x009\xff\xec\x00\x92\x00:\xff\ +\xec\x00\x92\x00;\xff\xd7\x00\x92\x00<\xff\xec\x00\x92\x00\ +=\xff\xec\x00\x92\x00\x82\xff\xd7\x00\x92\x00\x83\xff\xd7\x00\ +\x92\x00\x84\xff\xd7\x00\x92\x00\x85\xff\xd7\x00\x92\x00\x86\xff\ +\xd7\x00\x92\x00\x87\xff\xd7\x00\x92\x00\x9f\xff\xec\x00\x92\x00\ +\xc2\xff\xd7\x00\x92\x00\xc4\xff\xd7\x00\x92\x00\xc6\xff\xd7\x00\ +\x92\x01$\xff\xc3\x00\x92\x01&\xff\xc3\x00\x92\x016\xff\ +\xec\x00\x92\x018\xff\xec\x00\x92\x01:\xff\xec\x00\x92\x01\ +;\xff\xec\x00\x92\x01=\xff\xec\x00\x92\x01?\xff\xec\x00\ +\x92\x01C\xff\xd7\x00\x92\x01\xa0\xff\xec\x00\x92\x01\xfa\xff\ +\xec\x00\x92\x01\xfc\xff\xec\x00\x92\x01\xfe\xff\xec\x00\x92\x02\ +\x00\xff\xec\x00\x92\x02\x08\xff\xae\x00\x92\x02\x0c\xff\xae\x00\ +\x92\x02X\xff\xd7\x00\x92\x03\x1d\xff\xd7\x00\x92\x03\x1f\xff\ +\xd7\x00\x92\x03!\xff\xd7\x00\x92\x03#\xff\xd7\x00\x92\x03\ +%\xff\xd7\x00\x92\x03'\xff\xd7\x00\x92\x03)\xff\xd7\x00\ +\x92\x03+\xff\xd7\x00\x92\x03-\xff\xd7\x00\x92\x03/\xff\ +\xd7\x00\x92\x031\xff\xd7\x00\x92\x033\xff\xd7\x00\x92\x03\ +o\xff\xec\x00\x92\x03q\xff\xec\x00\x92\x03s\xff\xec\x00\ +\x92\x03\x8f\xff\xc3\x00\x94\x00\x0f\xff\xae\x00\x94\x00\x11\xff\ +\xae\x00\x94\x00$\xff\xd7\x00\x94\x007\xff\xc3\x00\x94\x00\ +9\xff\xec\x00\x94\x00:\xff\xec\x00\x94\x00;\xff\xd7\x00\ +\x94\x00<\xff\xec\x00\x94\x00=\xff\xec\x00\x94\x00\x82\xff\ +\xd7\x00\x94\x00\x83\xff\xd7\x00\x94\x00\x84\xff\xd7\x00\x94\x00\ +\x85\xff\xd7\x00\x94\x00\x86\xff\xd7\x00\x94\x00\x87\xff\xd7\x00\ +\x94\x00\x9f\xff\xec\x00\x94\x00\xc2\xff\xd7\x00\x94\x00\xc4\xff\ +\xd7\x00\x94\x00\xc6\xff\xd7\x00\x94\x01$\xff\xc3\x00\x94\x01\ +&\xff\xc3\x00\x94\x016\xff\xec\x00\x94\x018\xff\xec\x00\ +\x94\x01:\xff\xec\x00\x94\x01;\xff\xec\x00\x94\x01=\xff\ +\xec\x00\x94\x01?\xff\xec\x00\x94\x01C\xff\xd7\x00\x94\x01\ +\xa0\xff\xec\x00\x94\x01\xfa\xff\xec\x00\x94\x01\xfc\xff\xec\x00\ +\x94\x01\xfe\xff\xec\x00\x94\x02\x00\xff\xec\x00\x94\x02\x08\xff\ +\xae\x00\x94\x02\x0c\xff\xae\x00\x94\x02X\xff\xd7\x00\x94\x03\ +\x1d\xff\xd7\x00\x94\x03\x1f\xff\xd7\x00\x94\x03!\xff\xd7\x00\ +\x94\x03#\xff\xd7\x00\x94\x03%\xff\xd7\x00\x94\x03'\xff\ +\xd7\x00\x94\x03)\xff\xd7\x00\x94\x03+\xff\xd7\x00\x94\x03\ +-\xff\xd7\x00\x94\x03/\xff\xd7\x00\x94\x031\xff\xd7\x00\ +\x94\x033\xff\xd7\x00\x94\x03o\xff\xec\x00\x94\x03q\xff\ +\xec\x00\x94\x03s\xff\xec\x00\x94\x03\x8f\xff\xc3\x00\x95\x00\ +\x0f\xff\xae\x00\x95\x00\x11\xff\xae\x00\x95\x00$\xff\xd7\x00\ +\x95\x007\xff\xc3\x00\x95\x009\xff\xec\x00\x95\x00:\xff\ +\xec\x00\x95\x00;\xff\xd7\x00\x95\x00<\xff\xec\x00\x95\x00\ +=\xff\xec\x00\x95\x00\x82\xff\xd7\x00\x95\x00\x83\xff\xd7\x00\ +\x95\x00\x84\xff\xd7\x00\x95\x00\x85\xff\xd7\x00\x95\x00\x86\xff\ +\xd7\x00\x95\x00\x87\xff\xd7\x00\x95\x00\x9f\xff\xec\x00\x95\x00\ +\xc2\xff\xd7\x00\x95\x00\xc4\xff\xd7\x00\x95\x00\xc6\xff\xd7\x00\ +\x95\x01$\xff\xc3\x00\x95\x01&\xff\xc3\x00\x95\x016\xff\ +\xec\x00\x95\x018\xff\xec\x00\x95\x01:\xff\xec\x00\x95\x01\ +;\xff\xec\x00\x95\x01=\xff\xec\x00\x95\x01?\xff\xec\x00\ +\x95\x01C\xff\xd7\x00\x95\x01\xa0\xff\xec\x00\x95\x01\xfa\xff\ +\xec\x00\x95\x01\xfc\xff\xec\x00\x95\x01\xfe\xff\xec\x00\x95\x02\ +\x00\xff\xec\x00\x95\x02\x08\xff\xae\x00\x95\x02\x0c\xff\xae\x00\ +\x95\x02X\xff\xd7\x00\x95\x03\x1d\xff\xd7\x00\x95\x03\x1f\xff\ +\xd7\x00\x95\x03!\xff\xd7\x00\x95\x03#\xff\xd7\x00\x95\x03\ +%\xff\xd7\x00\x95\x03'\xff\xd7\x00\x95\x03)\xff\xd7\x00\ +\x95\x03+\xff\xd7\x00\x95\x03-\xff\xd7\x00\x95\x03/\xff\ +\xd7\x00\x95\x031\xff\xd7\x00\x95\x033\xff\xd7\x00\x95\x03\ +o\xff\xec\x00\x95\x03q\xff\xec\x00\x95\x03s\xff\xec\x00\ +\x95\x03\x8f\xff\xc3\x00\x96\x00\x0f\xff\xae\x00\x96\x00\x11\xff\ +\xae\x00\x96\x00$\xff\xd7\x00\x96\x007\xff\xc3\x00\x96\x00\ +9\xff\xec\x00\x96\x00:\xff\xec\x00\x96\x00;\xff\xd7\x00\ +\x96\x00<\xff\xec\x00\x96\x00=\xff\xec\x00\x96\x00\x82\xff\ +\xd7\x00\x96\x00\x83\xff\xd7\x00\x96\x00\x84\xff\xd7\x00\x96\x00\ +\x85\xff\xd7\x00\x96\x00\x86\xff\xd7\x00\x96\x00\x87\xff\xd7\x00\ +\x96\x00\x9f\xff\xec\x00\x96\x00\xc2\xff\xd7\x00\x96\x00\xc4\xff\ +\xd7\x00\x96\x00\xc6\xff\xd7\x00\x96\x01$\xff\xc3\x00\x96\x01\ +&\xff\xc3\x00\x96\x016\xff\xec\x00\x96\x018\xff\xec\x00\ +\x96\x01:\xff\xec\x00\x96\x01;\xff\xec\x00\x96\x01=\xff\ +\xec\x00\x96\x01?\xff\xec\x00\x96\x01C\xff\xd7\x00\x96\x01\ +\xa0\xff\xec\x00\x96\x01\xfa\xff\xec\x00\x96\x01\xfc\xff\xec\x00\ +\x96\x01\xfe\xff\xec\x00\x96\x02\x00\xff\xec\x00\x96\x02\x08\xff\ +\xae\x00\x96\x02\x0c\xff\xae\x00\x96\x02X\xff\xd7\x00\x96\x03\ +\x1d\xff\xd7\x00\x96\x03\x1f\xff\xd7\x00\x96\x03!\xff\xd7\x00\ +\x96\x03#\xff\xd7\x00\x96\x03%\xff\xd7\x00\x96\x03'\xff\ +\xd7\x00\x96\x03)\xff\xd7\x00\x96\x03+\xff\xd7\x00\x96\x03\ +-\xff\xd7\x00\x96\x03/\xff\xd7\x00\x96\x031\xff\xd7\x00\ +\x96\x033\xff\xd7\x00\x96\x03o\xff\xec\x00\x96\x03q\xff\ +\xec\x00\x96\x03s\xff\xec\x00\x96\x03\x8f\xff\xc3\x00\x97\x00\ +\x0f\xff\xae\x00\x97\x00\x11\xff\xae\x00\x97\x00$\xff\xd7\x00\ +\x97\x007\xff\xc3\x00\x97\x009\xff\xec\x00\x97\x00:\xff\ +\xec\x00\x97\x00;\xff\xd7\x00\x97\x00<\xff\xec\x00\x97\x00\ +=\xff\xec\x00\x97\x00\x82\xff\xd7\x00\x97\x00\x83\xff\xd7\x00\ +\x97\x00\x84\xff\xd7\x00\x97\x00\x85\xff\xd7\x00\x97\x00\x86\xff\ +\xd7\x00\x97\x00\x87\xff\xd7\x00\x97\x00\x9f\xff\xec\x00\x97\x00\ +\xc2\xff\xd7\x00\x97\x00\xc4\xff\xd7\x00\x97\x00\xc6\xff\xd7\x00\ +\x97\x01$\xff\xc3\x00\x97\x01&\xff\xc3\x00\x97\x016\xff\ +\xec\x00\x97\x018\xff\xec\x00\x97\x01:\xff\xec\x00\x97\x01\ +;\xff\xec\x00\x97\x01=\xff\xec\x00\x97\x01?\xff\xec\x00\ +\x97\x01C\xff\xd7\x00\x97\x01\xa0\xff\xec\x00\x97\x01\xfa\xff\ +\xec\x00\x97\x01\xfc\xff\xec\x00\x97\x01\xfe\xff\xec\x00\x97\x02\ +\x00\xff\xec\x00\x97\x02\x08\xff\xae\x00\x97\x02\x0c\xff\xae\x00\ +\x97\x02X\xff\xd7\x00\x97\x03\x1d\xff\xd7\x00\x97\x03\x1f\xff\ +\xd7\x00\x97\x03!\xff\xd7\x00\x97\x03#\xff\xd7\x00\x97\x03\ +%\xff\xd7\x00\x97\x03'\xff\xd7\x00\x97\x03)\xff\xd7\x00\ +\x97\x03+\xff\xd7\x00\x97\x03-\xff\xd7\x00\x97\x03/\xff\ +\xd7\x00\x97\x031\xff\xd7\x00\x97\x033\xff\xd7\x00\x97\x03\ +o\xff\xec\x00\x97\x03q\xff\xec\x00\x97\x03s\xff\xec\x00\ +\x97\x03\x8f\xff\xc3\x00\x98\x00\x0f\xff\xae\x00\x98\x00\x11\xff\ +\xae\x00\x98\x00$\xff\xd7\x00\x98\x007\xff\xc3\x00\x98\x00\ +9\xff\xec\x00\x98\x00:\xff\xec\x00\x98\x00;\xff\xd7\x00\ +\x98\x00<\xff\xec\x00\x98\x00=\xff\xec\x00\x98\x00\x82\xff\ +\xd7\x00\x98\x00\x83\xff\xd7\x00\x98\x00\x84\xff\xd7\x00\x98\x00\ +\x85\xff\xd7\x00\x98\x00\x86\xff\xd7\x00\x98\x00\x87\xff\xd7\x00\ +\x98\x00\x9f\xff\xec\x00\x98\x00\xc2\xff\xd7\x00\x98\x00\xc4\xff\ +\xd7\x00\x98\x00\xc6\xff\xd7\x00\x98\x01$\xff\xc3\x00\x98\x01\ +&\xff\xc3\x00\x98\x016\xff\xec\x00\x98\x018\xff\xec\x00\ +\x98\x01:\xff\xec\x00\x98\x01;\xff\xec\x00\x98\x01=\xff\ +\xec\x00\x98\x01?\xff\xec\x00\x98\x01C\xff\xd7\x00\x98\x01\ +\xa0\xff\xec\x00\x98\x01\xfa\xff\xec\x00\x98\x01\xfc\xff\xec\x00\ +\x98\x01\xfe\xff\xec\x00\x98\x02\x00\xff\xec\x00\x98\x02\x08\xff\ +\xae\x00\x98\x02\x0c\xff\xae\x00\x98\x02X\xff\xd7\x00\x98\x03\ +\x1d\xff\xd7\x00\x98\x03\x1f\xff\xd7\x00\x98\x03!\xff\xd7\x00\ +\x98\x03#\xff\xd7\x00\x98\x03%\xff\xd7\x00\x98\x03'\xff\ +\xd7\x00\x98\x03)\xff\xd7\x00\x98\x03+\xff\xd7\x00\x98\x03\ +-\xff\xd7\x00\x98\x03/\xff\xd7\x00\x98\x031\xff\xd7\x00\ +\x98\x033\xff\xd7\x00\x98\x03o\xff\xec\x00\x98\x03q\xff\ +\xec\x00\x98\x03s\xff\xec\x00\x98\x03\x8f\xff\xc3\x00\x9a\x00\ +\x0f\xff\xae\x00\x9a\x00\x11\xff\xae\x00\x9a\x00$\xff\xd7\x00\ +\x9a\x007\xff\xc3\x00\x9a\x009\xff\xec\x00\x9a\x00:\xff\ +\xec\x00\x9a\x00;\xff\xd7\x00\x9a\x00<\xff\xec\x00\x9a\x00\ +=\xff\xec\x00\x9a\x00\x82\xff\xd7\x00\x9a\x00\x83\xff\xd7\x00\ +\x9a\x00\x84\xff\xd7\x00\x9a\x00\x85\xff\xd7\x00\x9a\x00\x86\xff\ +\xd7\x00\x9a\x00\x87\xff\xd7\x00\x9a\x00\x9f\xff\xec\x00\x9a\x00\ +\xc2\xff\xd7\x00\x9a\x00\xc4\xff\xd7\x00\x9a\x00\xc6\xff\xd7\x00\ +\x9a\x01$\xff\xc3\x00\x9a\x01&\xff\xc3\x00\x9a\x016\xff\ +\xec\x00\x9a\x018\xff\xec\x00\x9a\x01:\xff\xec\x00\x9a\x01\ +;\xff\xec\x00\x9a\x01=\xff\xec\x00\x9a\x01?\xff\xec\x00\ +\x9a\x01C\xff\xd7\x00\x9a\x01\xa0\xff\xec\x00\x9a\x01\xfa\xff\ +\xec\x00\x9a\x01\xfc\xff\xec\x00\x9a\x01\xfe\xff\xec\x00\x9a\x02\ +\x00\xff\xec\x00\x9a\x02\x08\xff\xae\x00\x9a\x02\x0c\xff\xae\x00\ +\x9a\x02X\xff\xd7\x00\x9a\x03\x1d\xff\xd7\x00\x9a\x03\x1f\xff\ +\xd7\x00\x9a\x03!\xff\xd7\x00\x9a\x03#\xff\xd7\x00\x9a\x03\ +%\xff\xd7\x00\x9a\x03'\xff\xd7\x00\x9a\x03)\xff\xd7\x00\ +\x9a\x03+\xff\xd7\x00\x9a\x03-\xff\xd7\x00\x9a\x03/\xff\ +\xd7\x00\x9a\x031\xff\xd7\x00\x9a\x033\xff\xd7\x00\x9a\x03\ +o\xff\xec\x00\x9a\x03q\xff\xec\x00\x9a\x03s\xff\xec\x00\ +\x9a\x03\x8f\xff\xc3\x00\x9b\x00\x0f\xff\xd7\x00\x9b\x00\x11\xff\ +\xd7\x00\x9b\x00$\xff\xec\x00\x9b\x00\x82\xff\xec\x00\x9b\x00\ +\x83\xff\xec\x00\x9b\x00\x84\xff\xec\x00\x9b\x00\x85\xff\xec\x00\ +\x9b\x00\x86\xff\xec\x00\x9b\x00\x87\xff\xec\x00\x9b\x00\xc2\xff\ +\xec\x00\x9b\x00\xc4\xff\xec\x00\x9b\x00\xc6\xff\xec\x00\x9b\x01\ +C\xff\xec\x00\x9b\x02\x08\xff\xd7\x00\x9b\x02\x0c\xff\xd7\x00\ +\x9b\x02X\xff\xec\x00\x9b\x03\x1d\xff\xec\x00\x9b\x03\x1f\xff\ +\xec\x00\x9b\x03!\xff\xec\x00\x9b\x03#\xff\xec\x00\x9b\x03\ +%\xff\xec\x00\x9b\x03'\xff\xec\x00\x9b\x03)\xff\xec\x00\ +\x9b\x03+\xff\xec\x00\x9b\x03-\xff\xec\x00\x9b\x03/\xff\ +\xec\x00\x9b\x031\xff\xec\x00\x9b\x033\xff\xec\x00\x9c\x00\ +\x0f\xff\xd7\x00\x9c\x00\x11\xff\xd7\x00\x9c\x00$\xff\xec\x00\ +\x9c\x00\x82\xff\xec\x00\x9c\x00\x83\xff\xec\x00\x9c\x00\x84\xff\ +\xec\x00\x9c\x00\x85\xff\xec\x00\x9c\x00\x86\xff\xec\x00\x9c\x00\ +\x87\xff\xec\x00\x9c\x00\xc2\xff\xec\x00\x9c\x00\xc4\xff\xec\x00\ +\x9c\x00\xc6\xff\xec\x00\x9c\x01C\xff\xec\x00\x9c\x02\x08\xff\ +\xd7\x00\x9c\x02\x0c\xff\xd7\x00\x9c\x02X\xff\xec\x00\x9c\x03\ +\x1d\xff\xec\x00\x9c\x03\x1f\xff\xec\x00\x9c\x03!\xff\xec\x00\ +\x9c\x03#\xff\xec\x00\x9c\x03%\xff\xec\x00\x9c\x03'\xff\ +\xec\x00\x9c\x03)\xff\xec\x00\x9c\x03+\xff\xec\x00\x9c\x03\ +-\xff\xec\x00\x9c\x03/\xff\xec\x00\x9c\x031\xff\xec\x00\ +\x9c\x033\xff\xec\x00\x9d\x00\x0f\xff\xd7\x00\x9d\x00\x11\xff\ +\xd7\x00\x9d\x00$\xff\xec\x00\x9d\x00\x82\xff\xec\x00\x9d\x00\ +\x83\xff\xec\x00\x9d\x00\x84\xff\xec\x00\x9d\x00\x85\xff\xec\x00\ +\x9d\x00\x86\xff\xec\x00\x9d\x00\x87\xff\xec\x00\x9d\x00\xc2\xff\ +\xec\x00\x9d\x00\xc4\xff\xec\x00\x9d\x00\xc6\xff\xec\x00\x9d\x01\ +C\xff\xec\x00\x9d\x02\x08\xff\xd7\x00\x9d\x02\x0c\xff\xd7\x00\ +\x9d\x02X\xff\xec\x00\x9d\x03\x1d\xff\xec\x00\x9d\x03\x1f\xff\ +\xec\x00\x9d\x03!\xff\xec\x00\x9d\x03#\xff\xec\x00\x9d\x03\ +%\xff\xec\x00\x9d\x03'\xff\xec\x00\x9d\x03)\xff\xec\x00\ +\x9d\x03+\xff\xec\x00\x9d\x03-\xff\xec\x00\x9d\x03/\xff\ +\xec\x00\x9d\x031\xff\xec\x00\x9d\x033\xff\xec\x00\x9e\x00\ +\x0f\xff\xd7\x00\x9e\x00\x11\xff\xd7\x00\x9e\x00$\xff\xec\x00\ +\x9e\x00\x82\xff\xec\x00\x9e\x00\x83\xff\xec\x00\x9e\x00\x84\xff\ +\xec\x00\x9e\x00\x85\xff\xec\x00\x9e\x00\x86\xff\xec\x00\x9e\x00\ +\x87\xff\xec\x00\x9e\x00\xc2\xff\xec\x00\x9e\x00\xc4\xff\xec\x00\ +\x9e\x00\xc6\xff\xec\x00\x9e\x01C\xff\xec\x00\x9e\x02\x08\xff\ +\xd7\x00\x9e\x02\x0c\xff\xd7\x00\x9e\x02X\xff\xec\x00\x9e\x03\ +\x1d\xff\xec\x00\x9e\x03\x1f\xff\xec\x00\x9e\x03!\xff\xec\x00\ +\x9e\x03#\xff\xec\x00\x9e\x03%\xff\xec\x00\x9e\x03'\xff\ +\xec\x00\x9e\x03)\xff\xec\x00\x9e\x03+\xff\xec\x00\x9e\x03\ +-\xff\xec\x00\x9e\x03/\xff\xec\x00\x9e\x031\xff\xec\x00\ +\x9e\x033\xff\xec\x00\x9f\x00\x0f\xff\x85\x00\x9f\x00\x11\xff\ +\x85\x00\x9f\x00\x22\x00)\x00\x9f\x00$\xff\x85\x00\x9f\x00\ +&\xff\xd7\x00\x9f\x00*\xff\xd7\x00\x9f\x002\xff\xd7\x00\ +\x9f\x004\xff\xd7\x00\x9f\x00D\xff\x9a\x00\x9f\x00F\xff\ +\x9a\x00\x9f\x00G\xff\x9a\x00\x9f\x00H\xff\x9a\x00\x9f\x00\ +J\xff\xd7\x00\x9f\x00P\xff\xc3\x00\x9f\x00Q\xff\xc3\x00\ +\x9f\x00R\xff\x9a\x00\x9f\x00S\xff\xc3\x00\x9f\x00T\xff\ +\x9a\x00\x9f\x00U\xff\xc3\x00\x9f\x00V\xff\xae\x00\x9f\x00\ +X\xff\xc3\x00\x9f\x00]\xff\xd7\x00\x9f\x00\x82\xff\x85\x00\ +\x9f\x00\x83\xff\x85\x00\x9f\x00\x84\xff\x85\x00\x9f\x00\x85\xff\ +\x85\x00\x9f\x00\x86\xff\x85\x00\x9f\x00\x87\xff\x85\x00\x9f\x00\ +\x89\xff\xd7\x00\x9f\x00\x94\xff\xd7\x00\x9f\x00\x95\xff\xd7\x00\ +\x9f\x00\x96\xff\xd7\x00\x9f\x00\x97\xff\xd7\x00\x9f\x00\x98\xff\ +\xd7\x00\x9f\x00\x9a\xff\xd7\x00\x9f\x00\xa2\xff\x9a\x00\x9f\x00\ +\xa3\xff\x9a\x00\x9f\x00\xa4\xff\x9a\x00\x9f\x00\xa5\xff\x9a\x00\ +\x9f\x00\xa6\xff\x9a\x00\x9f\x00\xa7\xff\x9a\x00\x9f\x00\xa8\xff\ +\x9a\x00\x9f\x00\xa9\xff\x9a\x00\x9f\x00\xaa\xff\x9a\x00\x9f\x00\ +\xab\xff\x9a\x00\x9f\x00\xac\xff\x9a\x00\x9f\x00\xad\xff\x9a\x00\ +\x9f\x00\xb4\xff\x9a\x00\x9f\x00\xb5\xff\x9a\x00\x9f\x00\xb6\xff\ +\x9a\x00\x9f\x00\xb7\xff\x9a\x00\x9f\x00\xb8\xff\x9a\x00\x9f\x00\ +\xba\xff\x9a\x00\x9f\x00\xbb\xff\xc3\x00\x9f\x00\xbc\xff\xc3\x00\ +\x9f\x00\xbd\xff\xc3\x00\x9f\x00\xbe\xff\xc3\x00\x9f\x00\xc2\xff\ +\x85\x00\x9f\x00\xc3\xff\x9a\x00\x9f\x00\xc4\xff\x85\x00\x9f\x00\ +\xc5\xff\x9a\x00\x9f\x00\xc6\xff\x85\x00\x9f\x00\xc7\xff\x9a\x00\ +\x9f\x00\xc8\xff\xd7\x00\x9f\x00\xc9\xff\x9a\x00\x9f\x00\xca\xff\ +\xd7\x00\x9f\x00\xcb\xff\x9a\x00\x9f\x00\xcc\xff\xd7\x00\x9f\x00\ +\xcd\xff\x9a\x00\x9f\x00\xce\xff\xd7\x00\x9f\x00\xcf\xff\x9a\x00\ +\x9f\x00\xd1\xff\x9a\x00\x9f\x00\xd3\xff\x9a\x00\x9f\x00\xd5\xff\ +\x9a\x00\x9f\x00\xd7\xff\x9a\x00\x9f\x00\xd9\xff\x9a\x00\x9f\x00\ +\xdb\xff\x9a\x00\x9f\x00\xdd\xff\x9a\x00\x9f\x00\xde\xff\xd7\x00\ +\x9f\x00\xdf\xff\xd7\x00\x9f\x00\xe0\xff\xd7\x00\x9f\x00\xe1\xff\ +\xd7\x00\x9f\x00\xe2\xff\xd7\x00\x9f\x00\xe3\xff\xd7\x00\x9f\x00\ +\xe4\xff\xd7\x00\x9f\x00\xe5\xff\xd7\x00\x9f\x00\xfa\xff\xc3\x00\ +\x9f\x01\x06\xff\xc3\x00\x9f\x01\x08\xff\xc3\x00\x9f\x01\x0d\xff\ +\xc3\x00\x9f\x01\x0e\xff\xd7\x00\x9f\x01\x0f\xff\x9a\x00\x9f\x01\ +\x10\xff\xd7\x00\x9f\x01\x11\xff\x9a\x00\x9f\x01\x12\xff\xd7\x00\ +\x9f\x01\x13\xff\x9a\x00\x9f\x01\x14\xff\xd7\x00\x9f\x01\x15\xff\ +\x9a\x00\x9f\x01\x17\xff\xc3\x00\x9f\x01\x19\xff\xc3\x00\x9f\x01\ +\x1d\xff\xae\x00\x9f\x01!\xff\xae\x00\x9f\x01+\xff\xc3\x00\ +\x9f\x01-\xff\xc3\x00\x9f\x01/\xff\xc3\x00\x9f\x011\xff\ +\xc3\x00\x9f\x013\xff\xc3\x00\x9f\x015\xff\xc3\x00\x9f\x01\ +<\xff\xd7\x00\x9f\x01>\xff\xd7\x00\x9f\x01@\xff\xd7\x00\ +\x9f\x01C\xff\x85\x00\x9f\x01D\xff\x9a\x00\x9f\x01F\xff\ +\x9a\x00\x9f\x01G\xff\xd7\x00\x9f\x01H\xff\x9a\x00\x9f\x01\ +J\xff\xae\x00\x9f\x02\x08\xff\x85\x00\x9f\x02\x0c\xff\x85\x00\ +\x9f\x02W\xff\xc3\x00\x9f\x02X\xff\x85\x00\x9f\x02Y\xff\ +\x9a\x00\x9f\x02_\xff\xd7\x00\x9f\x02`\xff\x9a\x00\x9f\x02\ +b\xff\xc3\x00\x9f\x03\x1d\xff\x85\x00\x9f\x03\x1e\xff\x9a\x00\ +\x9f\x03\x1f\xff\x85\x00\x9f\x03 \xff\x9a\x00\x9f\x03!\xff\ +\x85\x00\x9f\x03\x22\xff\x9a\x00\x9f\x03#\xff\x85\x00\x9f\x03\ +%\xff\x85\x00\x9f\x03&\xff\x9a\x00\x9f\x03'\xff\x85\x00\ +\x9f\x03(\xff\x9a\x00\x9f\x03)\xff\x85\x00\x9f\x03*\xff\ +\x9a\x00\x9f\x03+\xff\x85\x00\x9f\x03,\xff\x9a\x00\x9f\x03\ +-\xff\x85\x00\x9f\x03.\xff\x9a\x00\x9f\x03/\xff\x85\x00\ +\x9f\x030\xff\x9a\x00\x9f\x031\xff\x85\x00\x9f\x032\xff\ +\x9a\x00\x9f\x033\xff\x85\x00\x9f\x034\xff\x9a\x00\x9f\x03\ +6\xff\x9a\x00\x9f\x038\xff\x9a\x00\x9f\x03:\xff\x9a\x00\ +\x9f\x03<\xff\x9a\x00\x9f\x03@\xff\x9a\x00\x9f\x03B\xff\ +\x9a\x00\x9f\x03D\xff\x9a\x00\x9f\x03I\xff\xd7\x00\x9f\x03\ +J\xff\x9a\x00\x9f\x03K\xff\xd7\x00\x9f\x03L\xff\x9a\x00\ +\x9f\x03M\xff\xd7\x00\x9f\x03N\xff\x9a\x00\x9f\x03O\xff\ +\xd7\x00\x9f\x03Q\xff\xd7\x00\x9f\x03R\xff\x9a\x00\x9f\x03\ +S\xff\xd7\x00\x9f\x03T\xff\x9a\x00\x9f\x03U\xff\xd7\x00\ +\x9f\x03V\xff\x9a\x00\x9f\x03W\xff\xd7\x00\x9f\x03X\xff\ +\x9a\x00\x9f\x03Y\xff\xd7\x00\x9f\x03Z\xff\x9a\x00\x9f\x03\ +[\xff\xd7\x00\x9f\x03\x5c\xff\x9a\x00\x9f\x03]\xff\xd7\x00\ +\x9f\x03^\xff\x9a\x00\x9f\x03_\xff\xd7\x00\x9f\x03`\xff\ +\x9a\x00\x9f\x03b\xff\xc3\x00\x9f\x03d\xff\xc3\x00\x9f\x03\ +f\xff\xc3\x00\x9f\x03h\xff\xc3\x00\x9f\x03j\xff\xc3\x00\ +\x9f\x03l\xff\xc3\x00\x9f\x03n\xff\xc3\x00\xa0\x00\x0f\xfe\ +\xf6\x00\xa0\x00\x11\xfe\xf6\x00\xa0\x00$\xff\x9a\x00\xa0\x00\ +;\xff\xd7\x00\xa0\x00=\xff\xec\x00\xa0\x00\x82\xff\x9a\x00\ +\xa0\x00\x83\xff\x9a\x00\xa0\x00\x84\xff\x9a\x00\xa0\x00\x85\xff\ +\x9a\x00\xa0\x00\x86\xff\x9a\x00\xa0\x00\x87\xff\x9a\x00\xa0\x00\ +\xc2\xff\x9a\x00\xa0\x00\xc4\xff\x9a\x00\xa0\x00\xc6\xff\x9a\x00\ +\xa0\x01;\xff\xec\x00\xa0\x01=\xff\xec\x00\xa0\x01?\xff\ +\xec\x00\xa0\x01C\xff\x9a\x00\xa0\x02\x08\xfe\xf6\x00\xa0\x02\ +\x0c\xfe\xf6\x00\xa0\x02X\xff\x9a\x00\xa0\x03\x1d\xff\x9a\x00\ +\xa0\x03\x1f\xff\x9a\x00\xa0\x03!\xff\x9a\x00\xa0\x03#\xff\ +\x9a\x00\xa0\x03%\xff\x9a\x00\xa0\x03'\xff\x9a\x00\xa0\x03\ +)\xff\x9a\x00\xa0\x03+\xff\x9a\x00\xa0\x03-\xff\x9a\x00\ +\xa0\x03/\xff\x9a\x00\xa0\x031\xff\x9a\x00\xa0\x033\xff\ +\x9a\x00\xa2\x00\x05\xff\xec\x00\xa2\x00\x0a\xff\xec\x00\xa2\x02\ +\x07\xff\xec\x00\xa2\x02\x0b\xff\xec\x00\xa3\x00\x05\xff\xec\x00\ +\xa3\x00\x0a\xff\xec\x00\xa3\x02\x07\xff\xec\x00\xa3\x02\x0b\xff\ +\xec\x00\xa4\x00\x05\xff\xec\x00\xa4\x00\x0a\xff\xec\x00\xa4\x02\ +\x07\xff\xec\x00\xa4\x02\x0b\xff\xec\x00\xa5\x00\x05\xff\xec\x00\ +\xa5\x00\x0a\xff\xec\x00\xa5\x02\x07\xff\xec\x00\xa5\x02\x0b\xff\ +\xec\x00\xa6\x00\x05\xff\xec\x00\xa6\x00\x0a\xff\xec\x00\xa6\x02\ +\x07\xff\xec\x00\xa6\x02\x0b\xff\xec\x00\xa7\x00\x05\xff\xec\x00\ +\xa7\x00\x0a\xff\xec\x00\xa7\x02\x07\xff\xec\x00\xa7\x02\x0b\xff\ +\xec\x00\xaa\x00\x05\xff\xec\x00\xaa\x00\x0a\xff\xec\x00\xaa\x00\ +Y\xff\xd7\x00\xaa\x00Z\xff\xd7\x00\xaa\x00[\xff\xd7\x00\ +\xaa\x00\x5c\xff\xd7\x00\xaa\x00]\xff\xec\x00\xaa\x00\xbf\xff\ +\xd7\x00\xaa\x017\xff\xd7\x00\xaa\x01<\xff\xec\x00\xaa\x01\ +>\xff\xec\x00\xaa\x01@\xff\xec\x00\xaa\x01\xfb\xff\xd7\x00\ +\xaa\x01\xfd\xff\xd7\x00\xaa\x02\x07\xff\xec\x00\xaa\x02\x0b\xff\ +\xec\x00\xaa\x03p\xff\xd7\x00\xab\x00\x05\xff\xec\x00\xab\x00\ +\x0a\xff\xec\x00\xab\x00Y\xff\xd7\x00\xab\x00Z\xff\xd7\x00\ +\xab\x00[\xff\xd7\x00\xab\x00\x5c\xff\xd7\x00\xab\x00]\xff\ +\xec\x00\xab\x00\xbf\xff\xd7\x00\xab\x017\xff\xd7\x00\xab\x01\ +<\xff\xec\x00\xab\x01>\xff\xec\x00\xab\x01@\xff\xec\x00\ +\xab\x01\xfb\xff\xd7\x00\xab\x01\xfd\xff\xd7\x00\xab\x02\x07\xff\ +\xec\x00\xab\x02\x0b\xff\xec\x00\xab\x03p\xff\xd7\x00\xac\x00\ +\x05\xff\xec\x00\xac\x00\x0a\xff\xec\x00\xac\x00Y\xff\xd7\x00\ +\xac\x00Z\xff\xd7\x00\xac\x00[\xff\xd7\x00\xac\x00\x5c\xff\ +\xd7\x00\xac\x00]\xff\xec\x00\xac\x00\xbf\xff\xd7\x00\xac\x01\ +7\xff\xd7\x00\xac\x01<\xff\xec\x00\xac\x01>\xff\xec\x00\ +\xac\x01@\xff\xec\x00\xac\x01\xfb\xff\xd7\x00\xac\x01\xfd\xff\ +\xd7\x00\xac\x02\x07\xff\xec\x00\xac\x02\x0b\xff\xec\x00\xac\x03\ +p\xff\xd7\x00\xad\x00\x05\xff\xec\x00\xad\x00\x0a\xff\xec\x00\ +\xad\x00Y\xff\xd7\x00\xad\x00Z\xff\xd7\x00\xad\x00[\xff\ +\xd7\x00\xad\x00\x5c\xff\xd7\x00\xad\x00]\xff\xec\x00\xad\x00\ +\xbf\xff\xd7\x00\xad\x017\xff\xd7\x00\xad\x01<\xff\xec\x00\ +\xad\x01>\xff\xec\x00\xad\x01@\xff\xec\x00\xad\x01\xfb\xff\ +\xd7\x00\xad\x01\xfd\xff\xd7\x00\xad\x02\x07\xff\xec\x00\xad\x02\ +\x0b\xff\xec\x00\xad\x03p\xff\xd7\x00\xb2\x00\x05\xff\xec\x00\ +\xb2\x00\x0a\xff\xec\x00\xb2\x00Y\xff\xd7\x00\xb2\x00Z\xff\ +\xd7\x00\xb2\x00[\xff\xd7\x00\xb2\x00\x5c\xff\xd7\x00\xb2\x00\ +]\xff\xec\x00\xb2\x00\xbf\xff\xd7\x00\xb2\x017\xff\xd7\x00\ +\xb2\x01<\xff\xec\x00\xb2\x01>\xff\xec\x00\xb2\x01@\xff\ +\xec\x00\xb2\x01\xfb\xff\xd7\x00\xb2\x01\xfd\xff\xd7\x00\xb2\x02\ +\x07\xff\xec\x00\xb2\x02\x0b\xff\xec\x00\xb2\x03p\xff\xd7\x00\ +\xb4\x00\x05\xff\xec\x00\xb4\x00\x0a\xff\xec\x00\xb4\x00Y\xff\ +\xd7\x00\xb4\x00Z\xff\xd7\x00\xb4\x00[\xff\xd7\x00\xb4\x00\ +\x5c\xff\xd7\x00\xb4\x00]\xff\xec\x00\xb4\x00\xbf\xff\xd7\x00\ +\xb4\x017\xff\xd7\x00\xb4\x01<\xff\xec\x00\xb4\x01>\xff\ +\xec\x00\xb4\x01@\xff\xec\x00\xb4\x01\xfb\xff\xd7\x00\xb4\x01\ +\xfd\xff\xd7\x00\xb4\x02\x07\xff\xec\x00\xb4\x02\x0b\xff\xec\x00\ +\xb4\x03p\xff\xd7\x00\xb5\x00\x05\xff\xec\x00\xb5\x00\x0a\xff\ +\xec\x00\xb5\x00Y\xff\xd7\x00\xb5\x00Z\xff\xd7\x00\xb5\x00\ +[\xff\xd7\x00\xb5\x00\x5c\xff\xd7\x00\xb5\x00]\xff\xec\x00\ +\xb5\x00\xbf\xff\xd7\x00\xb5\x017\xff\xd7\x00\xb5\x01<\xff\ +\xec\x00\xb5\x01>\xff\xec\x00\xb5\x01@\xff\xec\x00\xb5\x01\ +\xfb\xff\xd7\x00\xb5\x01\xfd\xff\xd7\x00\xb5\x02\x07\xff\xec\x00\ +\xb5\x02\x0b\xff\xec\x00\xb5\x03p\xff\xd7\x00\xb6\x00\x05\xff\ +\xec\x00\xb6\x00\x0a\xff\xec\x00\xb6\x00Y\xff\xd7\x00\xb6\x00\ +Z\xff\xd7\x00\xb6\x00[\xff\xd7\x00\xb6\x00\x5c\xff\xd7\x00\ +\xb6\x00]\xff\xec\x00\xb6\x00\xbf\xff\xd7\x00\xb6\x017\xff\ +\xd7\x00\xb6\x01<\xff\xec\x00\xb6\x01>\xff\xec\x00\xb6\x01\ +@\xff\xec\x00\xb6\x01\xfb\xff\xd7\x00\xb6\x01\xfd\xff\xd7\x00\ +\xb6\x02\x07\xff\xec\x00\xb6\x02\x0b\xff\xec\x00\xb6\x03p\xff\ +\xd7\x00\xb8\x00\x05\xff\xd7\x00\xb8\x00\x0a\xff\xd7\x00\xb8\x02\ +\x07\xff\xd7\x00\xb8\x02\x0b\xff\xd7\x00\xba\x00\x05\xff\xec\x00\ +\xba\x00\x0a\xff\xec\x00\xba\x00Y\xff\xd7\x00\xba\x00Z\xff\ +\xd7\x00\xba\x00[\xff\xd7\x00\xba\x00\x5c\xff\xd7\x00\xba\x00\ +]\xff\xec\x00\xba\x00\xbf\xff\xd7\x00\xba\x017\xff\xd7\x00\ +\xba\x01<\xff\xec\x00\xba\x01>\xff\xec\x00\xba\x01@\xff\ +\xec\x00\xba\x01\xfb\xff\xd7\x00\xba\x01\xfd\xff\xd7\x00\xba\x02\ +\x07\xff\xec\x00\xba\x02\x0b\xff\xec\x00\xba\x03p\xff\xd7\x00\ +\xbf\x00\x05\x00R\x00\xbf\x00\x0a\x00R\x00\xbf\x00\x0f\xff\ +\xae\x00\xbf\x00\x11\xff\xae\x00\xbf\x00\x22\x00)\x00\xbf\x02\ +\x07\x00R\x00\xbf\x02\x08\xff\xae\x00\xbf\x02\x0b\x00R\x00\ +\xbf\x02\x0c\xff\xae\x00\xc0\x00\x05\xff\xec\x00\xc0\x00\x0a\xff\ +\xec\x00\xc0\x00Y\xff\xd7\x00\xc0\x00Z\xff\xd7\x00\xc0\x00\ +[\xff\xd7\x00\xc0\x00\x5c\xff\xd7\x00\xc0\x00]\xff\xec\x00\ +\xc0\x00\xbf\xff\xd7\x00\xc0\x017\xff\xd7\x00\xc0\x01<\xff\ +\xec\x00\xc0\x01>\xff\xec\x00\xc0\x01@\xff\xec\x00\xc0\x01\ +\xfb\xff\xd7\x00\xc0\x01\xfd\xff\xd7\x00\xc0\x02\x07\xff\xec\x00\ +\xc0\x02\x0b\xff\xec\x00\xc0\x03p\xff\xd7\x00\xc1\x00\x05\x00\ +R\x00\xc1\x00\x0a\x00R\x00\xc1\x00\x0f\xff\xae\x00\xc1\x00\ +\x11\xff\xae\x00\xc1\x00\x22\x00)\x00\xc1\x02\x07\x00R\x00\ +\xc1\x02\x08\xff\xae\x00\xc1\x02\x0b\x00R\x00\xc1\x02\x0c\xff\ +\xae\x00\xc2\x00\x05\xffq\x00\xc2\x00\x0a\xffq\x00\xc2\x00\ +&\xff\xd7\x00\xc2\x00*\xff\xd7\x00\xc2\x00-\x01\x0a\x00\ +\xc2\x002\xff\xd7\x00\xc2\x004\xff\xd7\x00\xc2\x007\xff\ +q\x00\xc2\x009\xff\xae\x00\xc2\x00:\xff\xae\x00\xc2\x00\ +<\xff\x85\x00\xc2\x00\x89\xff\xd7\x00\xc2\x00\x94\xff\xd7\x00\ +\xc2\x00\x95\xff\xd7\x00\xc2\x00\x96\xff\xd7\x00\xc2\x00\x97\xff\ +\xd7\x00\xc2\x00\x98\xff\xd7\x00\xc2\x00\x9a\xff\xd7\x00\xc2\x00\ +\x9f\xff\x85\x00\xc2\x00\xc8\xff\xd7\x00\xc2\x00\xca\xff\xd7\x00\ +\xc2\x00\xcc\xff\xd7\x00\xc2\x00\xce\xff\xd7\x00\xc2\x00\xde\xff\ +\xd7\x00\xc2\x00\xe0\xff\xd7\x00\xc2\x00\xe2\xff\xd7\x00\xc2\x00\ +\xe4\xff\xd7\x00\xc2\x01\x0e\xff\xd7\x00\xc2\x01\x10\xff\xd7\x00\ +\xc2\x01\x12\xff\xd7\x00\xc2\x01\x14\xff\xd7\x00\xc2\x01$\xff\ +q\x00\xc2\x01&\xffq\x00\xc2\x016\xff\xae\x00\xc2\x01\ +8\xff\x85\x00\xc2\x01:\xff\x85\x00\xc2\x01G\xff\xd7\x00\ +\xc2\x01\xfa\xff\xae\x00\xc2\x01\xfc\xff\xae\x00\xc2\x01\xfe\xff\ +\xae\x00\xc2\x02\x00\xff\x85\x00\xc2\x02\x07\xffq\x00\xc2\x02\ +\x0b\xffq\x00\xc2\x02_\xff\xd7\x00\xc2\x03I\xff\xd7\x00\ +\xc2\x03K\xff\xd7\x00\xc2\x03M\xff\xd7\x00\xc2\x03O\xff\ +\xd7\x00\xc2\x03Q\xff\xd7\x00\xc2\x03S\xff\xd7\x00\xc2\x03\ +U\xff\xd7\x00\xc2\x03W\xff\xd7\x00\xc2\x03Y\xff\xd7\x00\ +\xc2\x03[\xff\xd7\x00\xc2\x03]\xff\xd7\x00\xc2\x03_\xff\ +\xd7\x00\xc2\x03o\xff\x85\x00\xc2\x03q\xff\x85\x00\xc2\x03\ +s\xff\x85\x00\xc2\x03\x8f\xffq\x00\xc3\x00\x05\xff\xec\x00\ +\xc3\x00\x0a\xff\xec\x00\xc3\x02\x07\xff\xec\x00\xc3\x02\x0b\xff\ +\xec\x00\xc4\x00\x05\xffq\x00\xc4\x00\x0a\xffq\x00\xc4\x00\ +&\xff\xd7\x00\xc4\x00*\xff\xd7\x00\xc4\x00-\x01\x0a\x00\ +\xc4\x002\xff\xd7\x00\xc4\x004\xff\xd7\x00\xc4\x007\xff\ +q\x00\xc4\x009\xff\xae\x00\xc4\x00:\xff\xae\x00\xc4\x00\ +<\xff\x85\x00\xc4\x00\x89\xff\xd7\x00\xc4\x00\x94\xff\xd7\x00\ +\xc4\x00\x95\xff\xd7\x00\xc4\x00\x96\xff\xd7\x00\xc4\x00\x97\xff\ +\xd7\x00\xc4\x00\x98\xff\xd7\x00\xc4\x00\x9a\xff\xd7\x00\xc4\x00\ +\x9f\xff\x85\x00\xc4\x00\xc8\xff\xd7\x00\xc4\x00\xca\xff\xd7\x00\ +\xc4\x00\xcc\xff\xd7\x00\xc4\x00\xce\xff\xd7\x00\xc4\x00\xde\xff\ +\xd7\x00\xc4\x00\xe0\xff\xd7\x00\xc4\x00\xe2\xff\xd7\x00\xc4\x00\ +\xe4\xff\xd7\x00\xc4\x01\x0e\xff\xd7\x00\xc4\x01\x10\xff\xd7\x00\ +\xc4\x01\x12\xff\xd7\x00\xc4\x01\x14\xff\xd7\x00\xc4\x01$\xff\ +q\x00\xc4\x01&\xffq\x00\xc4\x016\xff\xae\x00\xc4\x01\ +8\xff\x85\x00\xc4\x01:\xff\x85\x00\xc4\x01G\xff\xd7\x00\ +\xc4\x01\xfa\xff\xae\x00\xc4\x01\xfc\xff\xae\x00\xc4\x01\xfe\xff\ +\xae\x00\xc4\x02\x00\xff\x85\x00\xc4\x02\x07\xffq\x00\xc4\x02\ +\x0b\xffq\x00\xc4\x02_\xff\xd7\x00\xc4\x03I\xff\xd7\x00\ +\xc4\x03K\xff\xd7\x00\xc4\x03M\xff\xd7\x00\xc4\x03O\xff\ +\xd7\x00\xc4\x03Q\xff\xd7\x00\xc4\x03S\xff\xd7\x00\xc4\x03\ +U\xff\xd7\x00\xc4\x03W\xff\xd7\x00\xc4\x03Y\xff\xd7\x00\ +\xc4\x03[\xff\xd7\x00\xc4\x03]\xff\xd7\x00\xc4\x03_\xff\ +\xd7\x00\xc4\x03o\xff\x85\x00\xc4\x03q\xff\x85\x00\xc4\x03\ +s\xff\x85\x00\xc4\x03\x8f\xffq\x00\xc5\x00\x05\xff\xec\x00\ +\xc5\x00\x0a\xff\xec\x00\xc5\x02\x07\xff\xec\x00\xc5\x02\x0b\xff\ +\xec\x00\xc6\x00\x05\xffq\x00\xc6\x00\x0a\xffq\x00\xc6\x00\ +&\xff\xd7\x00\xc6\x00*\xff\xd7\x00\xc6\x00-\x01\x0a\x00\ +\xc6\x002\xff\xd7\x00\xc6\x004\xff\xd7\x00\xc6\x007\xff\ +q\x00\xc6\x009\xff\xae\x00\xc6\x00:\xff\xae\x00\xc6\x00\ +<\xff\x85\x00\xc6\x00\x89\xff\xd7\x00\xc6\x00\x94\xff\xd7\x00\ +\xc6\x00\x95\xff\xd7\x00\xc6\x00\x96\xff\xd7\x00\xc6\x00\x97\xff\ +\xd7\x00\xc6\x00\x98\xff\xd7\x00\xc6\x00\x9a\xff\xd7\x00\xc6\x00\ +\x9f\xff\x85\x00\xc6\x00\xc8\xff\xd7\x00\xc6\x00\xca\xff\xd7\x00\ +\xc6\x00\xcc\xff\xd7\x00\xc6\x00\xce\xff\xd7\x00\xc6\x00\xde\xff\ +\xd7\x00\xc6\x00\xe0\xff\xd7\x00\xc6\x00\xe2\xff\xd7\x00\xc6\x00\ +\xe4\xff\xd7\x00\xc6\x01\x0e\xff\xd7\x00\xc6\x01\x10\xff\xd7\x00\ +\xc6\x01\x12\xff\xd7\x00\xc6\x01\x14\xff\xd7\x00\xc6\x01$\xff\ +q\x00\xc6\x01&\xffq\x00\xc6\x016\xff\xae\x00\xc6\x01\ +8\xff\x85\x00\xc6\x01:\xff\x85\x00\xc6\x01G\xff\xd7\x00\ +\xc6\x01\xfa\xff\xae\x00\xc6\x01\xfc\xff\xae\x00\xc6\x01\xfe\xff\ +\xae\x00\xc6\x02\x00\xff\x85\x00\xc6\x02\x07\xffq\x00\xc6\x02\ +\x0b\xffq\x00\xc6\x02_\xff\xd7\x00\xc6\x03I\xff\xd7\x00\ +\xc6\x03K\xff\xd7\x00\xc6\x03M\xff\xd7\x00\xc6\x03O\xff\ +\xd7\x00\xc6\x03Q\xff\xd7\x00\xc6\x03S\xff\xd7\x00\xc6\x03\ +U\xff\xd7\x00\xc6\x03W\xff\xd7\x00\xc6\x03Y\xff\xd7\x00\ +\xc6\x03[\xff\xd7\x00\xc6\x03]\xff\xd7\x00\xc6\x03_\xff\ +\xd7\x00\xc6\x03o\xff\x85\x00\xc6\x03q\xff\x85\x00\xc6\x03\ +s\xff\x85\x00\xc6\x03\x8f\xffq\x00\xc7\x00\x05\xff\xec\x00\ +\xc7\x00\x0a\xff\xec\x00\xc7\x02\x07\xff\xec\x00\xc7\x02\x0b\xff\ +\xec\x00\xc8\x00&\xff\xd7\x00\xc8\x00*\xff\xd7\x00\xc8\x00\ +2\xff\xd7\x00\xc8\x004\xff\xd7\x00\xc8\x00\x89\xff\xd7\x00\ +\xc8\x00\x94\xff\xd7\x00\xc8\x00\x95\xff\xd7\x00\xc8\x00\x96\xff\ +\xd7\x00\xc8\x00\x97\xff\xd7\x00\xc8\x00\x98\xff\xd7\x00\xc8\x00\ +\x9a\xff\xd7\x00\xc8\x00\xc8\xff\xd7\x00\xc8\x00\xca\xff\xd7\x00\ +\xc8\x00\xcc\xff\xd7\x00\xc8\x00\xce\xff\xd7\x00\xc8\x00\xde\xff\ +\xd7\x00\xc8\x00\xe0\xff\xd7\x00\xc8\x00\xe2\xff\xd7\x00\xc8\x00\ +\xe4\xff\xd7\x00\xc8\x01\x0e\xff\xd7\x00\xc8\x01\x10\xff\xd7\x00\ +\xc8\x01\x12\xff\xd7\x00\xc8\x01\x14\xff\xd7\x00\xc8\x01G\xff\ +\xd7\x00\xc8\x02_\xff\xd7\x00\xc8\x03I\xff\xd7\x00\xc8\x03\ +K\xff\xd7\x00\xc8\x03M\xff\xd7\x00\xc8\x03O\xff\xd7\x00\ +\xc8\x03Q\xff\xd7\x00\xc8\x03S\xff\xd7\x00\xc8\x03U\xff\ +\xd7\x00\xc8\x03W\xff\xd7\x00\xc8\x03Y\xff\xd7\x00\xc8\x03\ +[\xff\xd7\x00\xc8\x03]\xff\xd7\x00\xc8\x03_\xff\xd7\x00\ +\xca\x00&\xff\xd7\x00\xca\x00*\xff\xd7\x00\xca\x002\xff\ +\xd7\x00\xca\x004\xff\xd7\x00\xca\x00\x89\xff\xd7\x00\xca\x00\ +\x94\xff\xd7\x00\xca\x00\x95\xff\xd7\x00\xca\x00\x96\xff\xd7\x00\ +\xca\x00\x97\xff\xd7\x00\xca\x00\x98\xff\xd7\x00\xca\x00\x9a\xff\ +\xd7\x00\xca\x00\xc8\xff\xd7\x00\xca\x00\xca\xff\xd7\x00\xca\x00\ +\xcc\xff\xd7\x00\xca\x00\xce\xff\xd7\x00\xca\x00\xde\xff\xd7\x00\ +\xca\x00\xe0\xff\xd7\x00\xca\x00\xe2\xff\xd7\x00\xca\x00\xe4\xff\ +\xd7\x00\xca\x01\x0e\xff\xd7\x00\xca\x01\x10\xff\xd7\x00\xca\x01\ +\x12\xff\xd7\x00\xca\x01\x14\xff\xd7\x00\xca\x01G\xff\xd7\x00\ +\xca\x02_\xff\xd7\x00\xca\x03I\xff\xd7\x00\xca\x03K\xff\ +\xd7\x00\xca\x03M\xff\xd7\x00\xca\x03O\xff\xd7\x00\xca\x03\ +Q\xff\xd7\x00\xca\x03S\xff\xd7\x00\xca\x03U\xff\xd7\x00\ +\xca\x03W\xff\xd7\x00\xca\x03Y\xff\xd7\x00\xca\x03[\xff\ +\xd7\x00\xca\x03]\xff\xd7\x00\xca\x03_\xff\xd7\x00\xcc\x00\ +&\xff\xd7\x00\xcc\x00*\xff\xd7\x00\xcc\x002\xff\xd7\x00\ +\xcc\x004\xff\xd7\x00\xcc\x00\x89\xff\xd7\x00\xcc\x00\x94\xff\ +\xd7\x00\xcc\x00\x95\xff\xd7\x00\xcc\x00\x96\xff\xd7\x00\xcc\x00\ +\x97\xff\xd7\x00\xcc\x00\x98\xff\xd7\x00\xcc\x00\x9a\xff\xd7\x00\ +\xcc\x00\xc8\xff\xd7\x00\xcc\x00\xca\xff\xd7\x00\xcc\x00\xcc\xff\ +\xd7\x00\xcc\x00\xce\xff\xd7\x00\xcc\x00\xde\xff\xd7\x00\xcc\x00\ +\xe0\xff\xd7\x00\xcc\x00\xe2\xff\xd7\x00\xcc\x00\xe4\xff\xd7\x00\ +\xcc\x01\x0e\xff\xd7\x00\xcc\x01\x10\xff\xd7\x00\xcc\x01\x12\xff\ +\xd7\x00\xcc\x01\x14\xff\xd7\x00\xcc\x01G\xff\xd7\x00\xcc\x02\ +_\xff\xd7\x00\xcc\x03I\xff\xd7\x00\xcc\x03K\xff\xd7\x00\ +\xcc\x03M\xff\xd7\x00\xcc\x03O\xff\xd7\x00\xcc\x03Q\xff\ +\xd7\x00\xcc\x03S\xff\xd7\x00\xcc\x03U\xff\xd7\x00\xcc\x03\ +W\xff\xd7\x00\xcc\x03Y\xff\xd7\x00\xcc\x03[\xff\xd7\x00\ +\xcc\x03]\xff\xd7\x00\xcc\x03_\xff\xd7\x00\xce\x00&\xff\ +\xd7\x00\xce\x00*\xff\xd7\x00\xce\x002\xff\xd7\x00\xce\x00\ +4\xff\xd7\x00\xce\x00\x89\xff\xd7\x00\xce\x00\x94\xff\xd7\x00\ +\xce\x00\x95\xff\xd7\x00\xce\x00\x96\xff\xd7\x00\xce\x00\x97\xff\ +\xd7\x00\xce\x00\x98\xff\xd7\x00\xce\x00\x9a\xff\xd7\x00\xce\x00\ +\xc8\xff\xd7\x00\xce\x00\xca\xff\xd7\x00\xce\x00\xcc\xff\xd7\x00\ +\xce\x00\xce\xff\xd7\x00\xce\x00\xde\xff\xd7\x00\xce\x00\xe0\xff\ +\xd7\x00\xce\x00\xe2\xff\xd7\x00\xce\x00\xe4\xff\xd7\x00\xce\x01\ +\x0e\xff\xd7\x00\xce\x01\x10\xff\xd7\x00\xce\x01\x12\xff\xd7\x00\ +\xce\x01\x14\xff\xd7\x00\xce\x01G\xff\xd7\x00\xce\x02_\xff\ +\xd7\x00\xce\x03I\xff\xd7\x00\xce\x03K\xff\xd7\x00\xce\x03\ +M\xff\xd7\x00\xce\x03O\xff\xd7\x00\xce\x03Q\xff\xd7\x00\ +\xce\x03S\xff\xd7\x00\xce\x03U\xff\xd7\x00\xce\x03W\xff\ +\xd7\x00\xce\x03Y\xff\xd7\x00\xce\x03[\xff\xd7\x00\xce\x03\ +]\xff\xd7\x00\xce\x03_\xff\xd7\x00\xd0\x00\x0f\xff\xae\x00\ +\xd0\x00\x11\xff\xae\x00\xd0\x00$\xff\xd7\x00\xd0\x007\xff\ +\xc3\x00\xd0\x009\xff\xec\x00\xd0\x00:\xff\xec\x00\xd0\x00\ +;\xff\xd7\x00\xd0\x00<\xff\xec\x00\xd0\x00=\xff\xec\x00\ +\xd0\x00\x82\xff\xd7\x00\xd0\x00\x83\xff\xd7\x00\xd0\x00\x84\xff\ +\xd7\x00\xd0\x00\x85\xff\xd7\x00\xd0\x00\x86\xff\xd7\x00\xd0\x00\ +\x87\xff\xd7\x00\xd0\x00\x9f\xff\xec\x00\xd0\x00\xc2\xff\xd7\x00\ +\xd0\x00\xc4\xff\xd7\x00\xd0\x00\xc6\xff\xd7\x00\xd0\x01$\xff\ +\xc3\x00\xd0\x01&\xff\xc3\x00\xd0\x016\xff\xec\x00\xd0\x01\ +8\xff\xec\x00\xd0\x01:\xff\xec\x00\xd0\x01;\xff\xec\x00\ +\xd0\x01=\xff\xec\x00\xd0\x01?\xff\xec\x00\xd0\x01C\xff\ +\xd7\x00\xd0\x01\xa0\xff\xec\x00\xd0\x01\xfa\xff\xec\x00\xd0\x01\ +\xfc\xff\xec\x00\xd0\x01\xfe\xff\xec\x00\xd0\x02\x00\xff\xec\x00\ +\xd0\x02\x08\xff\xae\x00\xd0\x02\x0c\xff\xae\x00\xd0\x02X\xff\ +\xd7\x00\xd0\x03\x1d\xff\xd7\x00\xd0\x03\x1f\xff\xd7\x00\xd0\x03\ +!\xff\xd7\x00\xd0\x03#\xff\xd7\x00\xd0\x03%\xff\xd7\x00\ +\xd0\x03'\xff\xd7\x00\xd0\x03)\xff\xd7\x00\xd0\x03+\xff\ +\xd7\x00\xd0\x03-\xff\xd7\x00\xd0\x03/\xff\xd7\x00\xd0\x03\ +1\xff\xd7\x00\xd0\x033\xff\xd7\x00\xd0\x03o\xff\xec\x00\ +\xd0\x03q\xff\xec\x00\xd0\x03s\xff\xec\x00\xd0\x03\x8f\xff\ +\xc3\x00\xd1\x00\x05\x00R\x00\xd1\x00\x0a\x00R\x00\xd1\x00\ +\x0c\x00\x8f\x00\xd1\x00\x22\x00\xa4\x00\xd1\x00@\x00\x8f\x00\ +\xd1\x00E\x00=\x00\xd1\x00K\x00=\x00\xd1\x00N\x00\ +=\x00\xd1\x00O\x00=\x00\xd1\x00`\x00\x8f\x00\xd1\x00\ +\xe7\x00=\x00\xd1\x00\xe9\x00{\x00\xd1\x02\x07\x00R\x00\ +\xd1\x02\x0b\x00R\x00\xd2\x00\x0f\xff\xae\x00\xd2\x00\x11\xff\ +\xae\x00\xd2\x00$\xff\xd7\x00\xd2\x007\xff\xc3\x00\xd2\x00\ +9\xff\xec\x00\xd2\x00:\xff\xec\x00\xd2\x00;\xff\xd7\x00\ +\xd2\x00<\xff\xec\x00\xd2\x00=\xff\xec\x00\xd2\x00\x82\xff\ +\xd7\x00\xd2\x00\x83\xff\xd7\x00\xd2\x00\x84\xff\xd7\x00\xd2\x00\ +\x85\xff\xd7\x00\xd2\x00\x86\xff\xd7\x00\xd2\x00\x87\xff\xd7\x00\ +\xd2\x00\x9f\xff\xec\x00\xd2\x00\xc2\xff\xd7\x00\xd2\x00\xc4\xff\ +\xd7\x00\xd2\x00\xc6\xff\xd7\x00\xd2\x01$\xff\xc3\x00\xd2\x01\ +&\xff\xc3\x00\xd2\x016\xff\xec\x00\xd2\x018\xff\xec\x00\ +\xd2\x01:\xff\xec\x00\xd2\x01;\xff\xec\x00\xd2\x01=\xff\ +\xec\x00\xd2\x01?\xff\xec\x00\xd2\x01C\xff\xd7\x00\xd2\x01\ +\xa0\xff\xec\x00\xd2\x01\xfa\xff\xec\x00\xd2\x01\xfc\xff\xec\x00\ +\xd2\x01\xfe\xff\xec\x00\xd2\x02\x00\xff\xec\x00\xd2\x02\x08\xff\ +\xae\x00\xd2\x02\x0c\xff\xae\x00\xd2\x02X\xff\xd7\x00\xd2\x03\ +\x1d\xff\xd7\x00\xd2\x03\x1f\xff\xd7\x00\xd2\x03!\xff\xd7\x00\ +\xd2\x03#\xff\xd7\x00\xd2\x03%\xff\xd7\x00\xd2\x03'\xff\ +\xd7\x00\xd2\x03)\xff\xd7\x00\xd2\x03+\xff\xd7\x00\xd2\x03\ +-\xff\xd7\x00\xd2\x03/\xff\xd7\x00\xd2\x031\xff\xd7\x00\ +\xd2\x033\xff\xd7\x00\xd2\x03o\xff\xec\x00\xd2\x03q\xff\ +\xec\x00\xd2\x03s\xff\xec\x00\xd2\x03\x8f\xff\xc3\x00\xd4\x00\ +-\x00{\x00\xd5\x00\x05\xff\xec\x00\xd5\x00\x0a\xff\xec\x00\ +\xd5\x00Y\xff\xd7\x00\xd5\x00Z\xff\xd7\x00\xd5\x00[\xff\ +\xd7\x00\xd5\x00\x5c\xff\xd7\x00\xd5\x00]\xff\xec\x00\xd5\x00\ +\xbf\xff\xd7\x00\xd5\x017\xff\xd7\x00\xd5\x01<\xff\xec\x00\ +\xd5\x01>\xff\xec\x00\xd5\x01@\xff\xec\x00\xd5\x01\xfb\xff\ +\xd7\x00\xd5\x01\xfd\xff\xd7\x00\xd5\x02\x07\xff\xec\x00\xd5\x02\ +\x0b\xff\xec\x00\xd5\x03p\xff\xd7\x00\xd6\x00-\x00{\x00\ +\xd7\x00\x05\xff\xec\x00\xd7\x00\x0a\xff\xec\x00\xd7\x00Y\xff\ +\xd7\x00\xd7\x00Z\xff\xd7\x00\xd7\x00[\xff\xd7\x00\xd7\x00\ +\x5c\xff\xd7\x00\xd7\x00]\xff\xec\x00\xd7\x00\xbf\xff\xd7\x00\ +\xd7\x017\xff\xd7\x00\xd7\x01<\xff\xec\x00\xd7\x01>\xff\ +\xec\x00\xd7\x01@\xff\xec\x00\xd7\x01\xfb\xff\xd7\x00\xd7\x01\ +\xfd\xff\xd7\x00\xd7\x02\x07\xff\xec\x00\xd7\x02\x0b\xff\xec\x00\ +\xd7\x03p\xff\xd7\x00\xd8\x00-\x00{\x00\xd9\x00\x05\xff\ +\xec\x00\xd9\x00\x0a\xff\xec\x00\xd9\x00Y\xff\xd7\x00\xd9\x00\ +Z\xff\xd7\x00\xd9\x00[\xff\xd7\x00\xd9\x00\x5c\xff\xd7\x00\ +\xd9\x00]\xff\xec\x00\xd9\x00\xbf\xff\xd7\x00\xd9\x017\xff\ +\xd7\x00\xd9\x01<\xff\xec\x00\xd9\x01>\xff\xec\x00\xd9\x01\ +@\xff\xec\x00\xd9\x01\xfb\xff\xd7\x00\xd9\x01\xfd\xff\xd7\x00\ +\xd9\x02\x07\xff\xec\x00\xd9\x02\x0b\xff\xec\x00\xd9\x03p\xff\ +\xd7\x00\xda\x00-\x00{\x00\xdb\x00\x05\xff\xec\x00\xdb\x00\ +\x0a\xff\xec\x00\xdb\x00Y\xff\xd7\x00\xdb\x00Z\xff\xd7\x00\ +\xdb\x00[\xff\xd7\x00\xdb\x00\x5c\xff\xd7\x00\xdb\x00]\xff\ +\xec\x00\xdb\x00\xbf\xff\xd7\x00\xdb\x017\xff\xd7\x00\xdb\x01\ +<\xff\xec\x00\xdb\x01>\xff\xec\x00\xdb\x01@\xff\xec\x00\ +\xdb\x01\xfb\xff\xd7\x00\xdb\x01\xfd\xff\xd7\x00\xdb\x02\x07\xff\ +\xec\x00\xdb\x02\x0b\xff\xec\x00\xdb\x03p\xff\xd7\x00\xdc\x00\ +-\x00{\x00\xdd\x00\x05\xff\xec\x00\xdd\x00\x0a\xff\xec\x00\ +\xdd\x00Y\xff\xd7\x00\xdd\x00Z\xff\xd7\x00\xdd\x00[\xff\ +\xd7\x00\xdd\x00\x5c\xff\xd7\x00\xdd\x00]\xff\xec\x00\xdd\x00\ +\xbf\xff\xd7\x00\xdd\x017\xff\xd7\x00\xdd\x01<\xff\xec\x00\ +\xdd\x01>\xff\xec\x00\xdd\x01@\xff\xec\x00\xdd\x01\xfb\xff\ +\xd7\x00\xdd\x01\xfd\xff\xd7\x00\xdd\x02\x07\xff\xec\x00\xdd\x02\ +\x0b\xff\xec\x00\xdd\x03p\xff\xd7\x00\xe7\x00\x05\xff\xec\x00\ +\xe7\x00\x0a\xff\xec\x00\xe7\x02\x07\xff\xec\x00\xe7\x02\x0b\xff\ +\xec\x00\xf8\x00&\xff\xd7\x00\xf8\x00*\xff\xd7\x00\xf8\x00\ +2\xff\xd7\x00\xf8\x004\xff\xd7\x00\xf8\x00\x89\xff\xd7\x00\ +\xf8\x00\x94\xff\xd7\x00\xf8\x00\x95\xff\xd7\x00\xf8\x00\x96\xff\ +\xd7\x00\xf8\x00\x97\xff\xd7\x00\xf8\x00\x98\xff\xd7\x00\xf8\x00\ +\x9a\xff\xd7\x00\xf8\x00\xc8\xff\xd7\x00\xf8\x00\xca\xff\xd7\x00\ +\xf8\x00\xcc\xff\xd7\x00\xf8\x00\xce\xff\xd7\x00\xf8\x00\xde\xff\ +\xd7\x00\xf8\x00\xe0\xff\xd7\x00\xf8\x00\xe2\xff\xd7\x00\xf8\x00\ +\xe4\xff\xd7\x00\xf8\x01\x0e\xff\xd7\x00\xf8\x01\x10\xff\xd7\x00\ +\xf8\x01\x12\xff\xd7\x00\xf8\x01\x14\xff\xd7\x00\xf8\x01G\xff\ +\xd7\x00\xf8\x02_\xff\xd7\x00\xf8\x03I\xff\xd7\x00\xf8\x03\ +K\xff\xd7\x00\xf8\x03M\xff\xd7\x00\xf8\x03O\xff\xd7\x00\ +\xf8\x03Q\xff\xd7\x00\xf8\x03S\xff\xd7\x00\xf8\x03U\xff\ +\xd7\x00\xf8\x03W\xff\xd7\x00\xf8\x03Y\xff\xd7\x00\xf8\x03\ +[\xff\xd7\x00\xf8\x03]\xff\xd7\x00\xf8\x03_\xff\xd7\x00\ +\xf9\x00F\xff\xd7\x00\xf9\x00G\xff\xd7\x00\xf9\x00H\xff\ +\xd7\x00\xf9\x00R\xff\xd7\x00\xf9\x00T\xff\xd7\x00\xf9\x00\ +\xa2\xff\xd7\x00\xf9\x00\xa9\xff\xd7\x00\xf9\x00\xaa\xff\xd7\x00\ +\xf9\x00\xab\xff\xd7\x00\xf9\x00\xac\xff\xd7\x00\xf9\x00\xad\xff\ +\xd7\x00\xf9\x00\xb4\xff\xd7\x00\xf9\x00\xb5\xff\xd7\x00\xf9\x00\ +\xb6\xff\xd7\x00\xf9\x00\xb7\xff\xd7\x00\xf9\x00\xb8\xff\xd7\x00\ +\xf9\x00\xba\xff\xd7\x00\xf9\x00\xc9\xff\xd7\x00\xf9\x00\xcb\xff\ +\xd7\x00\xf9\x00\xcd\xff\xd7\x00\xf9\x00\xcf\xff\xd7\x00\xf9\x00\ +\xd1\xff\xd7\x00\xf9\x00\xd3\xff\xd7\x00\xf9\x00\xd5\xff\xd7\x00\ +\xf9\x00\xd7\xff\xd7\x00\xf9\x00\xd9\xff\xd7\x00\xf9\x00\xdb\xff\ +\xd7\x00\xf9\x00\xdd\xff\xd7\x00\xf9\x01\x0f\xff\xd7\x00\xf9\x01\ +\x11\xff\xd7\x00\xf9\x01\x13\xff\xd7\x00\xf9\x01\x15\xff\xd7\x00\ +\xf9\x01H\xff\xd7\x00\xf9\x02`\xff\xd7\x00\xf9\x036\xff\ +\xd7\x00\xf9\x038\xff\xd7\x00\xf9\x03:\xff\xd7\x00\xf9\x03\ +<\xff\xd7\x00\xf9\x03@\xff\xd7\x00\xf9\x03B\xff\xd7\x00\ +\xf9\x03D\xff\xd7\x00\xf9\x03J\xff\xd7\x00\xf9\x03L\xff\ +\xd7\x00\xf9\x03N\xff\xd7\x00\xf9\x03R\xff\xd7\x00\xf9\x03\ +T\xff\xd7\x00\xf9\x03V\xff\xd7\x00\xf9\x03X\xff\xd7\x00\ +\xf9\x03Z\xff\xd7\x00\xf9\x03\x5c\xff\xd7\x00\xf9\x03^\xff\ +\xd7\x00\xf9\x03`\xff\xd7\x00\xfa\x00F\xff\xd7\x00\xfa\x00\ +G\xff\xd7\x00\xfa\x00H\xff\xd7\x00\xfa\x00R\xff\xd7\x00\ +\xfa\x00T\xff\xd7\x00\xfa\x00\xa2\xff\xd7\x00\xfa\x00\xa9\xff\ +\xd7\x00\xfa\x00\xaa\xff\xd7\x00\xfa\x00\xab\xff\xd7\x00\xfa\x00\ +\xac\xff\xd7\x00\xfa\x00\xad\xff\xd7\x00\xfa\x00\xb4\xff\xd7\x00\ +\xfa\x00\xb5\xff\xd7\x00\xfa\x00\xb6\xff\xd7\x00\xfa\x00\xb7\xff\ +\xd7\x00\xfa\x00\xb8\xff\xd7\x00\xfa\x00\xba\xff\xd7\x00\xfa\x00\ +\xc9\xff\xd7\x00\xfa\x00\xcb\xff\xd7\x00\xfa\x00\xcd\xff\xd7\x00\ +\xfa\x00\xcf\xff\xd7\x00\xfa\x00\xd1\xff\xd7\x00\xfa\x00\xd3\xff\ +\xd7\x00\xfa\x00\xd5\xff\xd7\x00\xfa\x00\xd7\xff\xd7\x00\xfa\x00\ +\xd9\xff\xd7\x00\xfa\x00\xdb\xff\xd7\x00\xfa\x00\xdd\xff\xd7\x00\ +\xfa\x01\x0f\xff\xd7\x00\xfa\x01\x11\xff\xd7\x00\xfa\x01\x13\xff\ +\xd7\x00\xfa\x01\x15\xff\xd7\x00\xfa\x01H\xff\xd7\x00\xfa\x02\ +`\xff\xd7\x00\xfa\x036\xff\xd7\x00\xfa\x038\xff\xd7\x00\ +\xfa\x03:\xff\xd7\x00\xfa\x03<\xff\xd7\x00\xfa\x03@\xff\ +\xd7\x00\xfa\x03B\xff\xd7\x00\xfa\x03D\xff\xd7\x00\xfa\x03\ +J\xff\xd7\x00\xfa\x03L\xff\xd7\x00\xfa\x03N\xff\xd7\x00\ +\xfa\x03R\xff\xd7\x00\xfa\x03T\xff\xd7\x00\xfa\x03V\xff\ +\xd7\x00\xfa\x03X\xff\xd7\x00\xfa\x03Z\xff\xd7\x00\xfa\x03\ +\x5c\xff\xd7\x00\xfa\x03^\xff\xd7\x00\xfa\x03`\xff\xd7\x00\ +\xfb\x00\x05\xff\x5c\x00\xfb\x00\x0a\xff\x5c\x00\xfb\x00&\xff\ +\xd7\x00\xfb\x00*\xff\xd7\x00\xfb\x002\xff\xd7\x00\xfb\x00\ +4\xff\xd7\x00\xfb\x007\xff\xd7\x00\xfb\x008\xff\xec\x00\ +\xfb\x009\xff\xd7\x00\xfb\x00:\xff\xd7\x00\xfb\x00<\xff\ +\xc3\x00\xfb\x00\x89\xff\xd7\x00\xfb\x00\x94\xff\xd7\x00\xfb\x00\ +\x95\xff\xd7\x00\xfb\x00\x96\xff\xd7\x00\xfb\x00\x97\xff\xd7\x00\ +\xfb\x00\x98\xff\xd7\x00\xfb\x00\x9a\xff\xd7\x00\xfb\x00\x9b\xff\ +\xec\x00\xfb\x00\x9c\xff\xec\x00\xfb\x00\x9d\xff\xec\x00\xfb\x00\ +\x9e\xff\xec\x00\xfb\x00\x9f\xff\xc3\x00\xfb\x00\xc8\xff\xd7\x00\ +\xfb\x00\xca\xff\xd7\x00\xfb\x00\xcc\xff\xd7\x00\xfb\x00\xce\xff\ +\xd7\x00\xfb\x00\xde\xff\xd7\x00\xfb\x00\xe0\xff\xd7\x00\xfb\x00\ +\xe2\xff\xd7\x00\xfb\x00\xe4\xff\xd7\x00\xfb\x01\x0e\xff\xd7\x00\ +\xfb\x01\x10\xff\xd7\x00\xfb\x01\x12\xff\xd7\x00\xfb\x01\x14\xff\ +\xd7\x00\xfb\x01$\xff\xd7\x00\xfb\x01&\xff\xd7\x00\xfb\x01\ +*\xff\xec\x00\xfb\x01,\xff\xec\x00\xfb\x01.\xff\xec\x00\ +\xfb\x010\xff\xec\x00\xfb\x012\xff\xec\x00\xfb\x014\xff\ +\xec\x00\xfb\x016\xff\xd7\x00\xfb\x018\xff\xc3\x00\xfb\x01\ +:\xff\xc3\x00\xfb\x01G\xff\xd7\x00\xfb\x01\xfa\xff\xd7\x00\ +\xfb\x01\xfc\xff\xd7\x00\xfb\x01\xfe\xff\xd7\x00\xfb\x02\x00\xff\ +\xc3\x00\xfb\x02\x07\xff\x5c\x00\xfb\x02\x0b\xff\x5c\x00\xfb\x02\ +_\xff\xd7\x00\xfb\x02a\xff\xec\x00\xfb\x03I\xff\xd7\x00\ +\xfb\x03K\xff\xd7\x00\xfb\x03M\xff\xd7\x00\xfb\x03O\xff\ +\xd7\x00\xfb\x03Q\xff\xd7\x00\xfb\x03S\xff\xd7\x00\xfb\x03\ +U\xff\xd7\x00\xfb\x03W\xff\xd7\x00\xfb\x03Y\xff\xd7\x00\ +\xfb\x03[\xff\xd7\x00\xfb\x03]\xff\xd7\x00\xfb\x03_\xff\ +\xd7\x00\xfb\x03a\xff\xec\x00\xfb\x03c\xff\xec\x00\xfb\x03\ +e\xff\xec\x00\xfb\x03g\xff\xec\x00\xfb\x03i\xff\xec\x00\ +\xfb\x03k\xff\xec\x00\xfb\x03m\xff\xec\x00\xfb\x03o\xff\ +\xc3\x00\xfb\x03q\xff\xc3\x00\xfb\x03s\xff\xc3\x00\xfb\x03\ +\x8f\xff\xd7\x00\xfd\x00\x05\xff\x5c\x00\xfd\x00\x0a\xff\x5c\x00\ +\xfd\x00&\xff\xd7\x00\xfd\x00*\xff\xd7\x00\xfd\x002\xff\ +\xd7\x00\xfd\x004\xff\xd7\x00\xfd\x007\xff\xd7\x00\xfd\x00\ +8\xff\xec\x00\xfd\x009\xff\xd7\x00\xfd\x00:\xff\xd7\x00\ +\xfd\x00<\xff\xc3\x00\xfd\x00\x89\xff\xd7\x00\xfd\x00\x94\xff\ +\xd7\x00\xfd\x00\x95\xff\xd7\x00\xfd\x00\x96\xff\xd7\x00\xfd\x00\ +\x97\xff\xd7\x00\xfd\x00\x98\xff\xd7\x00\xfd\x00\x9a\xff\xd7\x00\ +\xfd\x00\x9b\xff\xec\x00\xfd\x00\x9c\xff\xec\x00\xfd\x00\x9d\xff\ +\xec\x00\xfd\x00\x9e\xff\xec\x00\xfd\x00\x9f\xff\xc3\x00\xfd\x00\ +\xc8\xff\xd7\x00\xfd\x00\xca\xff\xd7\x00\xfd\x00\xcc\xff\xd7\x00\ +\xfd\x00\xce\xff\xd7\x00\xfd\x00\xde\xff\xd7\x00\xfd\x00\xe0\xff\ +\xd7\x00\xfd\x00\xe2\xff\xd7\x00\xfd\x00\xe4\xff\xd7\x00\xfd\x01\ +\x0e\xff\xd7\x00\xfd\x01\x10\xff\xd7\x00\xfd\x01\x12\xff\xd7\x00\ +\xfd\x01\x14\xff\xd7\x00\xfd\x01$\xff\xd7\x00\xfd\x01&\xff\ +\xd7\x00\xfd\x01*\xff\xec\x00\xfd\x01,\xff\xec\x00\xfd\x01\ +.\xff\xec\x00\xfd\x010\xff\xec\x00\xfd\x012\xff\xec\x00\ +\xfd\x014\xff\xec\x00\xfd\x016\xff\xd7\x00\xfd\x018\xff\ +\xc3\x00\xfd\x01:\xff\xc3\x00\xfd\x01G\xff\xd7\x00\xfd\x01\ +\xfa\xff\xd7\x00\xfd\x01\xfc\xff\xd7\x00\xfd\x01\xfe\xff\xd7\x00\ +\xfd\x02\x00\xff\xc3\x00\xfd\x02\x07\xff\x5c\x00\xfd\x02\x0b\xff\ +\x5c\x00\xfd\x02_\xff\xd7\x00\xfd\x02a\xff\xec\x00\xfd\x03\ +I\xff\xd7\x00\xfd\x03K\xff\xd7\x00\xfd\x03M\xff\xd7\x00\ +\xfd\x03O\xff\xd7\x00\xfd\x03Q\xff\xd7\x00\xfd\x03S\xff\ +\xd7\x00\xfd\x03U\xff\xd7\x00\xfd\x03W\xff\xd7\x00\xfd\x03\ +Y\xff\xd7\x00\xfd\x03[\xff\xd7\x00\xfd\x03]\xff\xd7\x00\ +\xfd\x03_\xff\xd7\x00\xfd\x03a\xff\xec\x00\xfd\x03c\xff\ +\xec\x00\xfd\x03e\xff\xec\x00\xfd\x03g\xff\xec\x00\xfd\x03\ +i\xff\xec\x00\xfd\x03k\xff\xec\x00\xfd\x03m\xff\xec\x00\ +\xfd\x03o\xff\xc3\x00\xfd\x03q\xff\xc3\x00\xfd\x03s\xff\ +\xc3\x00\xfd\x03\x8f\xff\xd7\x00\xff\x00\x05\xff\x5c\x00\xff\x00\ +\x0a\xff\x5c\x00\xff\x00&\xff\xd7\x00\xff\x00*\xff\xd7\x00\ +\xff\x002\xff\xd7\x00\xff\x004\xff\xd7\x00\xff\x007\xff\ +\xd7\x00\xff\x008\xff\xec\x00\xff\x009\xff\xd7\x00\xff\x00\ +:\xff\xd7\x00\xff\x00<\xff\xc3\x00\xff\x00\x89\xff\xd7\x00\ +\xff\x00\x94\xff\xd7\x00\xff\x00\x95\xff\xd7\x00\xff\x00\x96\xff\ +\xd7\x00\xff\x00\x97\xff\xd7\x00\xff\x00\x98\xff\xd7\x00\xff\x00\ +\x9a\xff\xd7\x00\xff\x00\x9b\xff\xec\x00\xff\x00\x9c\xff\xec\x00\ +\xff\x00\x9d\xff\xec\x00\xff\x00\x9e\xff\xec\x00\xff\x00\x9f\xff\ +\xc3\x00\xff\x00\xc8\xff\xd7\x00\xff\x00\xca\xff\xd7\x00\xff\x00\ +\xcc\xff\xd7\x00\xff\x00\xce\xff\xd7\x00\xff\x00\xde\xff\xd7\x00\ +\xff\x00\xe0\xff\xd7\x00\xff\x00\xe2\xff\xd7\x00\xff\x00\xe4\xff\ +\xd7\x00\xff\x01\x0e\xff\xd7\x00\xff\x01\x10\xff\xd7\x00\xff\x01\ +\x12\xff\xd7\x00\xff\x01\x14\xff\xd7\x00\xff\x01$\xff\xd7\x00\ +\xff\x01&\xff\xd7\x00\xff\x01*\xff\xec\x00\xff\x01,\xff\ +\xec\x00\xff\x01.\xff\xec\x00\xff\x010\xff\xec\x00\xff\x01\ +2\xff\xec\x00\xff\x014\xff\xec\x00\xff\x016\xff\xd7\x00\ +\xff\x018\xff\xc3\x00\xff\x01:\xff\xc3\x00\xff\x01G\xff\ +\xd7\x00\xff\x01\xfa\xff\xd7\x00\xff\x01\xfc\xff\xd7\x00\xff\x01\ +\xfe\xff\xd7\x00\xff\x02\x00\xff\xc3\x00\xff\x02\x07\xff\x5c\x00\ +\xff\x02\x0b\xff\x5c\x00\xff\x02_\xff\xd7\x00\xff\x02a\xff\ +\xec\x00\xff\x03I\xff\xd7\x00\xff\x03K\xff\xd7\x00\xff\x03\ +M\xff\xd7\x00\xff\x03O\xff\xd7\x00\xff\x03Q\xff\xd7\x00\ +\xff\x03S\xff\xd7\x00\xff\x03U\xff\xd7\x00\xff\x03W\xff\ +\xd7\x00\xff\x03Y\xff\xd7\x00\xff\x03[\xff\xd7\x00\xff\x03\ +]\xff\xd7\x00\xff\x03_\xff\xd7\x00\xff\x03a\xff\xec\x00\ +\xff\x03c\xff\xec\x00\xff\x03e\xff\xec\x00\xff\x03g\xff\ +\xec\x00\xff\x03i\xff\xec\x00\xff\x03k\xff\xec\x00\xff\x03\ +m\xff\xec\x00\xff\x03o\xff\xc3\x00\xff\x03q\xff\xc3\x00\ +\xff\x03s\xff\xc3\x00\xff\x03\x8f\xff\xd7\x01\x00\x00\x05\x00\ +R\x01\x00\x00\x0a\x00R\x01\x00\x00\x0c\x00\x8f\x01\x00\x00\ +\x22\x00\x8f\x01\x00\x00@\x00\x8f\x01\x00\x00E\x00=\x01\ +\x00\x00K\x00=\x01\x00\x00N\x00=\x01\x00\x00O\x00\ +=\x01\x00\x00`\x00\x8f\x01\x00\x00\xe7\x00=\x01\x00\x00\ +\xe9\x00\x8f\x01\x00\x02\x07\x00R\x01\x00\x02\x0b\x00R\x01\ +\x01\x00\x05\xff\x5c\x01\x01\x00\x0a\xff\x5c\x01\x01\x00&\xff\ +\xd7\x01\x01\x00*\xff\xd7\x01\x01\x002\xff\xd7\x01\x01\x00\ +4\xff\xd7\x01\x01\x007\xff\xd7\x01\x01\x008\xff\xec\x01\ +\x01\x009\xff\xd7\x01\x01\x00:\xff\xd7\x01\x01\x00<\xff\ +\xc3\x01\x01\x00\x89\xff\xd7\x01\x01\x00\x94\xff\xd7\x01\x01\x00\ +\x95\xff\xd7\x01\x01\x00\x96\xff\xd7\x01\x01\x00\x97\xff\xd7\x01\ +\x01\x00\x98\xff\xd7\x01\x01\x00\x9a\xff\xd7\x01\x01\x00\x9b\xff\ +\xec\x01\x01\x00\x9c\xff\xec\x01\x01\x00\x9d\xff\xec\x01\x01\x00\ +\x9e\xff\xec\x01\x01\x00\x9f\xff\xc3\x01\x01\x00\xc8\xff\xd7\x01\ +\x01\x00\xca\xff\xd7\x01\x01\x00\xcc\xff\xd7\x01\x01\x00\xce\xff\ +\xd7\x01\x01\x00\xde\xff\xd7\x01\x01\x00\xe0\xff\xd7\x01\x01\x00\ +\xe2\xff\xd7\x01\x01\x00\xe4\xff\xd7\x01\x01\x01\x0e\xff\xd7\x01\ +\x01\x01\x10\xff\xd7\x01\x01\x01\x12\xff\xd7\x01\x01\x01\x14\xff\ +\xd7\x01\x01\x01$\xff\xd7\x01\x01\x01&\xff\xd7\x01\x01\x01\ +*\xff\xec\x01\x01\x01,\xff\xec\x01\x01\x01.\xff\xec\x01\ +\x01\x010\xff\xec\x01\x01\x012\xff\xec\x01\x01\x014\xff\ +\xec\x01\x01\x016\xff\xd7\x01\x01\x018\xff\xc3\x01\x01\x01\ +:\xff\xc3\x01\x01\x01G\xff\xd7\x01\x01\x01\xfa\xff\xd7\x01\ +\x01\x01\xfc\xff\xd7\x01\x01\x01\xfe\xff\xd7\x01\x01\x02\x00\xff\ +\xc3\x01\x01\x02\x07\xff\x5c\x01\x01\x02\x0b\xff\x5c\x01\x01\x02\ +_\xff\xd7\x01\x01\x02a\xff\xec\x01\x01\x03I\xff\xd7\x01\ +\x01\x03K\xff\xd7\x01\x01\x03M\xff\xd7\x01\x01\x03O\xff\ +\xd7\x01\x01\x03Q\xff\xd7\x01\x01\x03S\xff\xd7\x01\x01\x03\ +U\xff\xd7\x01\x01\x03W\xff\xd7\x01\x01\x03Y\xff\xd7\x01\ +\x01\x03[\xff\xd7\x01\x01\x03]\xff\xd7\x01\x01\x03_\xff\ +\xd7\x01\x01\x03a\xff\xec\x01\x01\x03c\xff\xec\x01\x01\x03\ +e\xff\xec\x01\x01\x03g\xff\xec\x01\x01\x03i\xff\xec\x01\ +\x01\x03k\xff\xec\x01\x01\x03m\xff\xec\x01\x01\x03o\xff\ +\xc3\x01\x01\x03q\xff\xc3\x01\x01\x03s\xff\xc3\x01\x01\x03\ +\x8f\xff\xd7\x01\x03\x00\x05\xff\x5c\x01\x03\x00\x0a\xff\x5c\x01\ +\x03\x00&\xff\xd7\x01\x03\x00*\xff\xd7\x01\x03\x002\xff\ +\xd7\x01\x03\x004\xff\xd7\x01\x03\x007\xff\xd7\x01\x03\x00\ +8\xff\xec\x01\x03\x009\xff\xd7\x01\x03\x00:\xff\xd7\x01\ +\x03\x00<\xff\xc3\x01\x03\x00\x89\xff\xd7\x01\x03\x00\x94\xff\ +\xd7\x01\x03\x00\x95\xff\xd7\x01\x03\x00\x96\xff\xd7\x01\x03\x00\ +\x97\xff\xd7\x01\x03\x00\x98\xff\xd7\x01\x03\x00\x9a\xff\xd7\x01\ +\x03\x00\x9b\xff\xec\x01\x03\x00\x9c\xff\xec\x01\x03\x00\x9d\xff\ +\xec\x01\x03\x00\x9e\xff\xec\x01\x03\x00\x9f\xff\xc3\x01\x03\x00\ +\xc8\xff\xd7\x01\x03\x00\xca\xff\xd7\x01\x03\x00\xcc\xff\xd7\x01\ +\x03\x00\xce\xff\xd7\x01\x03\x00\xde\xff\xd7\x01\x03\x00\xe0\xff\ +\xd7\x01\x03\x00\xe2\xff\xd7\x01\x03\x00\xe4\xff\xd7\x01\x03\x01\ +\x0e\xff\xd7\x01\x03\x01\x10\xff\xd7\x01\x03\x01\x12\xff\xd7\x01\ +\x03\x01\x14\xff\xd7\x01\x03\x01$\xff\xd7\x01\x03\x01&\xff\ +\xd7\x01\x03\x01*\xff\xec\x01\x03\x01,\xff\xec\x01\x03\x01\ +.\xff\xec\x01\x03\x010\xff\xec\x01\x03\x012\xff\xec\x01\ +\x03\x014\xff\xec\x01\x03\x016\xff\xd7\x01\x03\x018\xff\ +\xc3\x01\x03\x01:\xff\xc3\x01\x03\x01G\xff\xd7\x01\x03\x01\ +\xfa\xff\xd7\x01\x03\x01\xfc\xff\xd7\x01\x03\x01\xfe\xff\xd7\x01\ +\x03\x02\x00\xff\xc3\x01\x03\x02\x07\xff\x5c\x01\x03\x02\x0b\xff\ +\x5c\x01\x03\x02_\xff\xd7\x01\x03\x02a\xff\xec\x01\x03\x03\ +I\xff\xd7\x01\x03\x03K\xff\xd7\x01\x03\x03M\xff\xd7\x01\ +\x03\x03O\xff\xd7\x01\x03\x03Q\xff\xd7\x01\x03\x03S\xff\ +\xd7\x01\x03\x03U\xff\xd7\x01\x03\x03W\xff\xd7\x01\x03\x03\ +Y\xff\xd7\x01\x03\x03[\xff\xd7\x01\x03\x03]\xff\xd7\x01\ +\x03\x03_\xff\xd7\x01\x03\x03a\xff\xec\x01\x03\x03c\xff\ +\xec\x01\x03\x03e\xff\xec\x01\x03\x03g\xff\xec\x01\x03\x03\ +i\xff\xec\x01\x03\x03k\xff\xec\x01\x03\x03m\xff\xec\x01\ +\x03\x03o\xff\xc3\x01\x03\x03q\xff\xc3\x01\x03\x03s\xff\ +\xc3\x01\x03\x03\x8f\xff\xd7\x01\x08\x00\x05\xff\xec\x01\x08\x00\ +\x0a\xff\xec\x01\x08\x02\x07\xff\xec\x01\x08\x02\x0b\xff\xec\x01\ +\x0e\x00\x0f\xff\xae\x01\x0e\x00\x11\xff\xae\x01\x0e\x00$\xff\ +\xd7\x01\x0e\x007\xff\xc3\x01\x0e\x009\xff\xec\x01\x0e\x00\ +:\xff\xec\x01\x0e\x00;\xff\xd7\x01\x0e\x00<\xff\xec\x01\ +\x0e\x00=\xff\xec\x01\x0e\x00\x82\xff\xd7\x01\x0e\x00\x83\xff\ +\xd7\x01\x0e\x00\x84\xff\xd7\x01\x0e\x00\x85\xff\xd7\x01\x0e\x00\ +\x86\xff\xd7\x01\x0e\x00\x87\xff\xd7\x01\x0e\x00\x9f\xff\xec\x01\ +\x0e\x00\xc2\xff\xd7\x01\x0e\x00\xc4\xff\xd7\x01\x0e\x00\xc6\xff\ +\xd7\x01\x0e\x01$\xff\xc3\x01\x0e\x01&\xff\xc3\x01\x0e\x01\ +6\xff\xec\x01\x0e\x018\xff\xec\x01\x0e\x01:\xff\xec\x01\ +\x0e\x01;\xff\xec\x01\x0e\x01=\xff\xec\x01\x0e\x01?\xff\ +\xec\x01\x0e\x01C\xff\xd7\x01\x0e\x01\xa0\xff\xec\x01\x0e\x01\ +\xfa\xff\xec\x01\x0e\x01\xfc\xff\xec\x01\x0e\x01\xfe\xff\xec\x01\ +\x0e\x02\x00\xff\xec\x01\x0e\x02\x08\xff\xae\x01\x0e\x02\x0c\xff\ +\xae\x01\x0e\x02X\xff\xd7\x01\x0e\x03\x1d\xff\xd7\x01\x0e\x03\ +\x1f\xff\xd7\x01\x0e\x03!\xff\xd7\x01\x0e\x03#\xff\xd7\x01\ +\x0e\x03%\xff\xd7\x01\x0e\x03'\xff\xd7\x01\x0e\x03)\xff\ +\xd7\x01\x0e\x03+\xff\xd7\x01\x0e\x03-\xff\xd7\x01\x0e\x03\ +/\xff\xd7\x01\x0e\x031\xff\xd7\x01\x0e\x033\xff\xd7\x01\ +\x0e\x03o\xff\xec\x01\x0e\x03q\xff\xec\x01\x0e\x03s\xff\ +\xec\x01\x0e\x03\x8f\xff\xc3\x01\x10\x00\x0f\xff\xae\x01\x10\x00\ +\x11\xff\xae\x01\x10\x00$\xff\xd7\x01\x10\x007\xff\xc3\x01\ +\x10\x009\xff\xec\x01\x10\x00:\xff\xec\x01\x10\x00;\xff\ +\xd7\x01\x10\x00<\xff\xec\x01\x10\x00=\xff\xec\x01\x10\x00\ +\x82\xff\xd7\x01\x10\x00\x83\xff\xd7\x01\x10\x00\x84\xff\xd7\x01\ +\x10\x00\x85\xff\xd7\x01\x10\x00\x86\xff\xd7\x01\x10\x00\x87\xff\ +\xd7\x01\x10\x00\x9f\xff\xec\x01\x10\x00\xc2\xff\xd7\x01\x10\x00\ +\xc4\xff\xd7\x01\x10\x00\xc6\xff\xd7\x01\x10\x01$\xff\xc3\x01\ +\x10\x01&\xff\xc3\x01\x10\x016\xff\xec\x01\x10\x018\xff\ +\xec\x01\x10\x01:\xff\xec\x01\x10\x01;\xff\xec\x01\x10\x01\ +=\xff\xec\x01\x10\x01?\xff\xec\x01\x10\x01C\xff\xd7\x01\ +\x10\x01\xa0\xff\xec\x01\x10\x01\xfa\xff\xec\x01\x10\x01\xfc\xff\ +\xec\x01\x10\x01\xfe\xff\xec\x01\x10\x02\x00\xff\xec\x01\x10\x02\ +\x08\xff\xae\x01\x10\x02\x0c\xff\xae\x01\x10\x02X\xff\xd7\x01\ +\x10\x03\x1d\xff\xd7\x01\x10\x03\x1f\xff\xd7\x01\x10\x03!\xff\ +\xd7\x01\x10\x03#\xff\xd7\x01\x10\x03%\xff\xd7\x01\x10\x03\ +'\xff\xd7\x01\x10\x03)\xff\xd7\x01\x10\x03+\xff\xd7\x01\ +\x10\x03-\xff\xd7\x01\x10\x03/\xff\xd7\x01\x10\x031\xff\ +\xd7\x01\x10\x033\xff\xd7\x01\x10\x03o\xff\xec\x01\x10\x03\ +q\xff\xec\x01\x10\x03s\xff\xec\x01\x10\x03\x8f\xff\xc3\x01\ +\x12\x00\x0f\xff\xae\x01\x12\x00\x11\xff\xae\x01\x12\x00$\xff\ +\xd7\x01\x12\x007\xff\xc3\x01\x12\x009\xff\xec\x01\x12\x00\ +:\xff\xec\x01\x12\x00;\xff\xd7\x01\x12\x00<\xff\xec\x01\ +\x12\x00=\xff\xec\x01\x12\x00\x82\xff\xd7\x01\x12\x00\x83\xff\ +\xd7\x01\x12\x00\x84\xff\xd7\x01\x12\x00\x85\xff\xd7\x01\x12\x00\ +\x86\xff\xd7\x01\x12\x00\x87\xff\xd7\x01\x12\x00\x9f\xff\xec\x01\ +\x12\x00\xc2\xff\xd7\x01\x12\x00\xc4\xff\xd7\x01\x12\x00\xc6\xff\ +\xd7\x01\x12\x01$\xff\xc3\x01\x12\x01&\xff\xc3\x01\x12\x01\ +6\xff\xec\x01\x12\x018\xff\xec\x01\x12\x01:\xff\xec\x01\ +\x12\x01;\xff\xec\x01\x12\x01=\xff\xec\x01\x12\x01?\xff\ +\xec\x01\x12\x01C\xff\xd7\x01\x12\x01\xa0\xff\xec\x01\x12\x01\ +\xfa\xff\xec\x01\x12\x01\xfc\xff\xec\x01\x12\x01\xfe\xff\xec\x01\ +\x12\x02\x00\xff\xec\x01\x12\x02\x08\xff\xae\x01\x12\x02\x0c\xff\ +\xae\x01\x12\x02X\xff\xd7\x01\x12\x03\x1d\xff\xd7\x01\x12\x03\ +\x1f\xff\xd7\x01\x12\x03!\xff\xd7\x01\x12\x03#\xff\xd7\x01\ +\x12\x03%\xff\xd7\x01\x12\x03'\xff\xd7\x01\x12\x03)\xff\ +\xd7\x01\x12\x03+\xff\xd7\x01\x12\x03-\xff\xd7\x01\x12\x03\ +/\xff\xd7\x01\x12\x031\xff\xd7\x01\x12\x033\xff\xd7\x01\ +\x12\x03o\xff\xec\x01\x12\x03q\xff\xec\x01\x12\x03s\xff\ +\xec\x01\x12\x03\x8f\xff\xc3\x01\x14\x00-\x00{\x01\x17\x00\ +\x05\x00R\x01\x17\x00\x0a\x00R\x01\x17\x00D\xff\xd7\x01\ +\x17\x00F\xff\xd7\x01\x17\x00G\xff\xd7\x01\x17\x00H\xff\ +\xd7\x01\x17\x00J\xff\xec\x01\x17\x00R\xff\xd7\x01\x17\x00\ +T\xff\xd7\x01\x17\x00\xa2\xff\xd7\x01\x17\x00\xa3\xff\xd7\x01\ +\x17\x00\xa4\xff\xd7\x01\x17\x00\xa5\xff\xd7\x01\x17\x00\xa6\xff\ +\xd7\x01\x17\x00\xa7\xff\xd7\x01\x17\x00\xa8\xff\xd7\x01\x17\x00\ +\xa9\xff\xd7\x01\x17\x00\xaa\xff\xd7\x01\x17\x00\xab\xff\xd7\x01\ +\x17\x00\xac\xff\xd7\x01\x17\x00\xad\xff\xd7\x01\x17\x00\xb4\xff\ +\xd7\x01\x17\x00\xb5\xff\xd7\x01\x17\x00\xb6\xff\xd7\x01\x17\x00\ +\xb7\xff\xd7\x01\x17\x00\xb8\xff\xd7\x01\x17\x00\xba\xff\xd7\x01\ +\x17\x00\xc3\xff\xd7\x01\x17\x00\xc5\xff\xd7\x01\x17\x00\xc7\xff\ +\xd7\x01\x17\x00\xc9\xff\xd7\x01\x17\x00\xcb\xff\xd7\x01\x17\x00\ +\xcd\xff\xd7\x01\x17\x00\xcf\xff\xd7\x01\x17\x00\xd1\xff\xd7\x01\ +\x17\x00\xd3\xff\xd7\x01\x17\x00\xd5\xff\xd7\x01\x17\x00\xd7\xff\ +\xd7\x01\x17\x00\xd9\xff\xd7\x01\x17\x00\xdb\xff\xd7\x01\x17\x00\ +\xdd\xff\xd7\x01\x17\x00\xdf\xff\xec\x01\x17\x00\xe1\xff\xec\x01\ +\x17\x00\xe3\xff\xec\x01\x17\x00\xe5\xff\xec\x01\x17\x01\x0f\xff\ +\xd7\x01\x17\x01\x11\xff\xd7\x01\x17\x01\x13\xff\xd7\x01\x17\x01\ +\x15\xff\xd7\x01\x17\x01D\xff\xd7\x01\x17\x01F\xff\xd7\x01\ +\x17\x01H\xff\xd7\x01\x17\x02\x07\x00R\x01\x17\x02\x0b\x00\ +R\x01\x17\x02Y\xff\xd7\x01\x17\x02`\xff\xd7\x01\x17\x03\ +\x1e\xff\xd7\x01\x17\x03 \xff\xd7\x01\x17\x03\x22\xff\xd7\x01\ +\x17\x03&\xff\xd7\x01\x17\x03(\xff\xd7\x01\x17\x03*\xff\ +\xd7\x01\x17\x03,\xff\xd7\x01\x17\x03.\xff\xd7\x01\x17\x03\ +0\xff\xd7\x01\x17\x032\xff\xd7\x01\x17\x034\xff\xd7\x01\ +\x17\x036\xff\xd7\x01\x17\x038\xff\xd7\x01\x17\x03:\xff\ +\xd7\x01\x17\x03<\xff\xd7\x01\x17\x03@\xff\xd7\x01\x17\x03\ +B\xff\xd7\x01\x17\x03D\xff\xd7\x01\x17\x03J\xff\xd7\x01\ +\x17\x03L\xff\xd7\x01\x17\x03N\xff\xd7\x01\x17\x03R\xff\ +\xd7\x01\x17\x03T\xff\xd7\x01\x17\x03V\xff\xd7\x01\x17\x03\ +X\xff\xd7\x01\x17\x03Z\xff\xd7\x01\x17\x03\x5c\xff\xd7\x01\ +\x17\x03^\xff\xd7\x01\x17\x03`\xff\xd7\x01\x19\x00\x05\x00\ +R\x01\x19\x00\x0a\x00R\x01\x19\x00D\xff\xd7\x01\x19\x00\ +F\xff\xd7\x01\x19\x00G\xff\xd7\x01\x19\x00H\xff\xd7\x01\ +\x19\x00J\xff\xec\x01\x19\x00R\xff\xd7\x01\x19\x00T\xff\ +\xd7\x01\x19\x00\xa2\xff\xd7\x01\x19\x00\xa3\xff\xd7\x01\x19\x00\ +\xa4\xff\xd7\x01\x19\x00\xa5\xff\xd7\x01\x19\x00\xa6\xff\xd7\x01\ +\x19\x00\xa7\xff\xd7\x01\x19\x00\xa8\xff\xd7\x01\x19\x00\xa9\xff\ +\xd7\x01\x19\x00\xaa\xff\xd7\x01\x19\x00\xab\xff\xd7\x01\x19\x00\ +\xac\xff\xd7\x01\x19\x00\xad\xff\xd7\x01\x19\x00\xb4\xff\xd7\x01\ +\x19\x00\xb5\xff\xd7\x01\x19\x00\xb6\xff\xd7\x01\x19\x00\xb7\xff\ +\xd7\x01\x19\x00\xb8\xff\xd7\x01\x19\x00\xba\xff\xd7\x01\x19\x00\ +\xc3\xff\xd7\x01\x19\x00\xc5\xff\xd7\x01\x19\x00\xc7\xff\xd7\x01\ +\x19\x00\xc9\xff\xd7\x01\x19\x00\xcb\xff\xd7\x01\x19\x00\xcd\xff\ +\xd7\x01\x19\x00\xcf\xff\xd7\x01\x19\x00\xd1\xff\xd7\x01\x19\x00\ +\xd3\xff\xd7\x01\x19\x00\xd5\xff\xd7\x01\x19\x00\xd7\xff\xd7\x01\ +\x19\x00\xd9\xff\xd7\x01\x19\x00\xdb\xff\xd7\x01\x19\x00\xdd\xff\ +\xd7\x01\x19\x00\xdf\xff\xec\x01\x19\x00\xe1\xff\xec\x01\x19\x00\ +\xe3\xff\xec\x01\x19\x00\xe5\xff\xec\x01\x19\x01\x0f\xff\xd7\x01\ +\x19\x01\x11\xff\xd7\x01\x19\x01\x13\xff\xd7\x01\x19\x01\x15\xff\ +\xd7\x01\x19\x01D\xff\xd7\x01\x19\x01F\xff\xd7\x01\x19\x01\ +H\xff\xd7\x01\x19\x02\x07\x00R\x01\x19\x02\x0b\x00R\x01\ +\x19\x02Y\xff\xd7\x01\x19\x02`\xff\xd7\x01\x19\x03\x1e\xff\ +\xd7\x01\x19\x03 \xff\xd7\x01\x19\x03\x22\xff\xd7\x01\x19\x03\ +&\xff\xd7\x01\x19\x03(\xff\xd7\x01\x19\x03*\xff\xd7\x01\ +\x19\x03,\xff\xd7\x01\x19\x03.\xff\xd7\x01\x19\x030\xff\ +\xd7\x01\x19\x032\xff\xd7\x01\x19\x034\xff\xd7\x01\x19\x03\ +6\xff\xd7\x01\x19\x038\xff\xd7\x01\x19\x03:\xff\xd7\x01\ +\x19\x03<\xff\xd7\x01\x19\x03@\xff\xd7\x01\x19\x03B\xff\ +\xd7\x01\x19\x03D\xff\xd7\x01\x19\x03J\xff\xd7\x01\x19\x03\ +L\xff\xd7\x01\x19\x03N\xff\xd7\x01\x19\x03R\xff\xd7\x01\ +\x19\x03T\xff\xd7\x01\x19\x03V\xff\xd7\x01\x19\x03X\xff\ +\xd7\x01\x19\x03Z\xff\xd7\x01\x19\x03\x5c\xff\xd7\x01\x19\x03\ +^\xff\xd7\x01\x19\x03`\xff\xd7\x01\x1b\x00\x05\x00R\x01\ +\x1b\x00\x0a\x00R\x01\x1b\x00D\xff\xd7\x01\x1b\x00F\xff\ +\xd7\x01\x1b\x00G\xff\xd7\x01\x1b\x00H\xff\xd7\x01\x1b\x00\ +J\xff\xec\x01\x1b\x00R\xff\xd7\x01\x1b\x00T\xff\xd7\x01\ +\x1b\x00\xa2\xff\xd7\x01\x1b\x00\xa3\xff\xd7\x01\x1b\x00\xa4\xff\ +\xd7\x01\x1b\x00\xa5\xff\xd7\x01\x1b\x00\xa6\xff\xd7\x01\x1b\x00\ +\xa7\xff\xd7\x01\x1b\x00\xa8\xff\xd7\x01\x1b\x00\xa9\xff\xd7\x01\ +\x1b\x00\xaa\xff\xd7\x01\x1b\x00\xab\xff\xd7\x01\x1b\x00\xac\xff\ +\xd7\x01\x1b\x00\xad\xff\xd7\x01\x1b\x00\xb4\xff\xd7\x01\x1b\x00\ +\xb5\xff\xd7\x01\x1b\x00\xb6\xff\xd7\x01\x1b\x00\xb7\xff\xd7\x01\ +\x1b\x00\xb8\xff\xd7\x01\x1b\x00\xba\xff\xd7\x01\x1b\x00\xc3\xff\ +\xd7\x01\x1b\x00\xc5\xff\xd7\x01\x1b\x00\xc7\xff\xd7\x01\x1b\x00\ +\xc9\xff\xd7\x01\x1b\x00\xcb\xff\xd7\x01\x1b\x00\xcd\xff\xd7\x01\ +\x1b\x00\xcf\xff\xd7\x01\x1b\x00\xd1\xff\xd7\x01\x1b\x00\xd3\xff\ +\xd7\x01\x1b\x00\xd5\xff\xd7\x01\x1b\x00\xd7\xff\xd7\x01\x1b\x00\ +\xd9\xff\xd7\x01\x1b\x00\xdb\xff\xd7\x01\x1b\x00\xdd\xff\xd7\x01\ +\x1b\x00\xdf\xff\xec\x01\x1b\x00\xe1\xff\xec\x01\x1b\x00\xe3\xff\ +\xec\x01\x1b\x00\xe5\xff\xec\x01\x1b\x01\x0f\xff\xd7\x01\x1b\x01\ +\x11\xff\xd7\x01\x1b\x01\x13\xff\xd7\x01\x1b\x01\x15\xff\xd7\x01\ +\x1b\x01D\xff\xd7\x01\x1b\x01F\xff\xd7\x01\x1b\x01H\xff\ +\xd7\x01\x1b\x02\x07\x00R\x01\x1b\x02\x0b\x00R\x01\x1b\x02\ +Y\xff\xd7\x01\x1b\x02`\xff\xd7\x01\x1b\x03\x1e\xff\xd7\x01\ +\x1b\x03 \xff\xd7\x01\x1b\x03\x22\xff\xd7\x01\x1b\x03&\xff\ +\xd7\x01\x1b\x03(\xff\xd7\x01\x1b\x03*\xff\xd7\x01\x1b\x03\ +,\xff\xd7\x01\x1b\x03.\xff\xd7\x01\x1b\x030\xff\xd7\x01\ +\x1b\x032\xff\xd7\x01\x1b\x034\xff\xd7\x01\x1b\x036\xff\ +\xd7\x01\x1b\x038\xff\xd7\x01\x1b\x03:\xff\xd7\x01\x1b\x03\ +<\xff\xd7\x01\x1b\x03@\xff\xd7\x01\x1b\x03B\xff\xd7\x01\ +\x1b\x03D\xff\xd7\x01\x1b\x03J\xff\xd7\x01\x1b\x03L\xff\ +\xd7\x01\x1b\x03N\xff\xd7\x01\x1b\x03R\xff\xd7\x01\x1b\x03\ +T\xff\xd7\x01\x1b\x03V\xff\xd7\x01\x1b\x03X\xff\xd7\x01\ +\x1b\x03Z\xff\xd7\x01\x1b\x03\x5c\xff\xd7\x01\x1b\x03^\xff\ +\xd7\x01\x1b\x03`\xff\xd7\x01$\x00\x0f\xff\x85\x01$\x00\ +\x10\xff\xae\x01$\x00\x11\xff\x85\x01$\x00\x22\x00)\x01\ +$\x00$\xffq\x01$\x00&\xff\xd7\x01$\x00*\xff\ +\xd7\x01$\x002\xff\xd7\x01$\x004\xff\xd7\x01$\x00\ +7\x00)\x01$\x00D\xff\x5c\x01$\x00F\xffq\x01\ +$\x00G\xffq\x01$\x00H\xffq\x01$\x00J\xff\ +q\x01$\x00P\xff\x9a\x01$\x00Q\xff\x9a\x01$\x00\ +R\xffq\x01$\x00S\xff\x9a\x01$\x00T\xffq\x01\ +$\x00U\xff\x9a\x01$\x00V\xff\x85\x01$\x00X\xff\ +\x9a\x01$\x00Y\xff\xd7\x01$\x00Z\xff\xd7\x01$\x00\ +[\xff\xd7\x01$\x00\x5c\xff\xd7\x01$\x00]\xff\xae\x01\ +$\x00\x82\xffq\x01$\x00\x83\xffq\x01$\x00\x84\xff\ +q\x01$\x00\x85\xffq\x01$\x00\x86\xffq\x01$\x00\ +\x87\xffq\x01$\x00\x89\xff\xd7\x01$\x00\x94\xff\xd7\x01\ +$\x00\x95\xff\xd7\x01$\x00\x96\xff\xd7\x01$\x00\x97\xff\ +\xd7\x01$\x00\x98\xff\xd7\x01$\x00\x9a\xff\xd7\x01$\x00\ +\xa2\xffq\x01$\x00\xa3\xff\x5c\x01$\x00\xa4\xff\x5c\x01\ +$\x00\xa5\xff\x5c\x01$\x00\xa6\xff\x5c\x01$\x00\xa7\xff\ +\x5c\x01$\x00\xa8\xff\x5c\x01$\x00\xa9\xffq\x01$\x00\ +\xaa\xffq\x01$\x00\xab\xffq\x01$\x00\xac\xffq\x01\ +$\x00\xad\xffq\x01$\x00\xb4\xffq\x01$\x00\xb5\xff\ +q\x01$\x00\xb6\xffq\x01$\x00\xb7\xffq\x01$\x00\ +\xb8\xffq\x01$\x00\xba\xffq\x01$\x00\xbb\xff\x9a\x01\ +$\x00\xbc\xff\x9a\x01$\x00\xbd\xff\x9a\x01$\x00\xbe\xff\ +\x9a\x01$\x00\xbf\xff\xd7\x01$\x00\xc2\xffq\x01$\x00\ +\xc3\xff\x5c\x01$\x00\xc4\xffq\x01$\x00\xc5\xff\x5c\x01\ +$\x00\xc6\xffq\x01$\x00\xc7\xff\x5c\x01$\x00\xc8\xff\ +\xd7\x01$\x00\xc9\xffq\x01$\x00\xca\xff\xd7\x01$\x00\ +\xcb\xffq\x01$\x00\xcc\xff\xd7\x01$\x00\xcd\xffq\x01\ +$\x00\xce\xff\xd7\x01$\x00\xcf\xffq\x01$\x00\xd1\xff\ +q\x01$\x00\xd3\xffq\x01$\x00\xd5\xffq\x01$\x00\ +\xd7\xffq\x01$\x00\xd9\xffq\x01$\x00\xdb\xffq\x01\ +$\x00\xdd\xffq\x01$\x00\xde\xff\xd7\x01$\x00\xdf\xff\ +q\x01$\x00\xe0\xff\xd7\x01$\x00\xe1\xffq\x01$\x00\ +\xe2\xff\xd7\x01$\x00\xe3\xffq\x01$\x00\xe4\xff\xd7\x01\ +$\x00\xe5\xffq\x01$\x00\xfa\xff\x9a\x01$\x01\x06\xff\ +\x9a\x01$\x01\x08\xff\x9a\x01$\x01\x0d\xff\x9a\x01$\x01\ +\x0e\xff\xd7\x01$\x01\x0f\xffq\x01$\x01\x10\xff\xd7\x01\ +$\x01\x11\xffq\x01$\x01\x12\xff\xd7\x01$\x01\x13\xff\ +q\x01$\x01\x14\xff\xd7\x01$\x01\x15\xffq\x01$\x01\ +\x17\xff\x9a\x01$\x01\x19\xff\x9a\x01$\x01\x1d\xff\x85\x01\ +$\x01!\xff\x85\x01$\x01$\x00)\x01$\x01&\x00\ +)\x01$\x01+\xff\x9a\x01$\x01-\xff\x9a\x01$\x01\ +/\xff\x9a\x01$\x011\xff\x9a\x01$\x013\xff\x9a\x01\ +$\x015\xff\x9a\x01$\x017\xff\xd7\x01$\x01<\xff\ +\xae\x01$\x01>\xff\xae\x01$\x01@\xff\xae\x01$\x01\ +C\xffq\x01$\x01D\xff\x5c\x01$\x01F\xff\x5c\x01\ +$\x01G\xff\xd7\x01$\x01H\xffq\x01$\x01J\xff\ +\x85\x01$\x01\xfb\xff\xd7\x01$\x01\xfd\xff\xd7\x01$\x02\ +\x02\xff\xae\x01$\x02\x03\xff\xae\x01$\x02\x04\xff\xae\x01\ +$\x02\x08\xff\x85\x01$\x02\x0c\xff\x85\x01$\x02W\xff\ +\x9a\x01$\x02X\xffq\x01$\x02Y\xff\x5c\x01$\x02\ +_\xff\xd7\x01$\x02`\xffq\x01$\x02b\xff\x9a\x01\ +$\x03\x1d\xffq\x01$\x03\x1e\xff\x5c\x01$\x03\x1f\xff\ +q\x01$\x03 \xff\x5c\x01$\x03!\xffq\x01$\x03\ +\x22\xff\x5c\x01$\x03#\xffq\x01$\x03%\xffq\x01\ +$\x03&\xff\x5c\x01$\x03'\xffq\x01$\x03(\xff\ +\x5c\x01$\x03)\xffq\x01$\x03*\xff\x5c\x01$\x03\ ++\xffq\x01$\x03,\xff\x5c\x01$\x03-\xffq\x01\ +$\x03.\xff\x5c\x01$\x03/\xffq\x01$\x030\xff\ +\x5c\x01$\x031\xffq\x01$\x032\xff\x5c\x01$\x03\ +3\xffq\x01$\x034\xff\x5c\x01$\x036\xffq\x01\ +$\x038\xffq\x01$\x03:\xffq\x01$\x03<\xff\ +q\x01$\x03@\xffq\x01$\x03B\xffq\x01$\x03\ +D\xffq\x01$\x03I\xff\xd7\x01$\x03J\xffq\x01\ +$\x03K\xff\xd7\x01$\x03L\xffq\x01$\x03M\xff\ +\xd7\x01$\x03N\xffq\x01$\x03O\xff\xd7\x01$\x03\ +Q\xff\xd7\x01$\x03R\xffq\x01$\x03S\xff\xd7\x01\ +$\x03T\xffq\x01$\x03U\xff\xd7\x01$\x03V\xff\ +q\x01$\x03W\xff\xd7\x01$\x03X\xffq\x01$\x03\ +Y\xff\xd7\x01$\x03Z\xffq\x01$\x03[\xff\xd7\x01\ +$\x03\x5c\xffq\x01$\x03]\xff\xd7\x01$\x03^\xff\ +q\x01$\x03_\xff\xd7\x01$\x03`\xffq\x01$\x03\ +b\xff\x9a\x01$\x03d\xff\x9a\x01$\x03f\xff\x9a\x01\ +$\x03h\xff\x9a\x01$\x03j\xff\x9a\x01$\x03l\xff\ +\x9a\x01$\x03n\xff\x9a\x01$\x03p\xff\xd7\x01$\x03\ +\x8f\x00)\x01%\x00\x05\x00)\x01%\x00\x0a\x00)\x01\ +%\x02\x07\x00)\x01%\x02\x0b\x00)\x01&\x00\x0f\xff\ +\x85\x01&\x00\x10\xff\xae\x01&\x00\x11\xff\x85\x01&\x00\ +\x22\x00)\x01&\x00$\xffq\x01&\x00&\xff\xd7\x01\ +&\x00*\xff\xd7\x01&\x002\xff\xd7\x01&\x004\xff\ +\xd7\x01&\x007\x00)\x01&\x00D\xff\x5c\x01&\x00\ +F\xffq\x01&\x00G\xffq\x01&\x00H\xffq\x01\ +&\x00J\xffq\x01&\x00P\xff\x9a\x01&\x00Q\xff\ +\x9a\x01&\x00R\xffq\x01&\x00S\xff\x9a\x01&\x00\ +T\xffq\x01&\x00U\xff\x9a\x01&\x00V\xff\x85\x01\ +&\x00X\xff\x9a\x01&\x00Y\xff\xd7\x01&\x00Z\xff\ +\xd7\x01&\x00[\xff\xd7\x01&\x00\x5c\xff\xd7\x01&\x00\ +]\xff\xae\x01&\x00\x82\xffq\x01&\x00\x83\xffq\x01\ +&\x00\x84\xffq\x01&\x00\x85\xffq\x01&\x00\x86\xff\ +q\x01&\x00\x87\xffq\x01&\x00\x89\xff\xd7\x01&\x00\ +\x94\xff\xd7\x01&\x00\x95\xff\xd7\x01&\x00\x96\xff\xd7\x01\ +&\x00\x97\xff\xd7\x01&\x00\x98\xff\xd7\x01&\x00\x9a\xff\ +\xd7\x01&\x00\xa2\xffq\x01&\x00\xa3\xff\x5c\x01&\x00\ +\xa4\xff\x5c\x01&\x00\xa5\xff\x5c\x01&\x00\xa6\xff\x5c\x01\ +&\x00\xa7\xff\x5c\x01&\x00\xa8\xff\x5c\x01&\x00\xa9\xff\ +q\x01&\x00\xaa\xffq\x01&\x00\xab\xffq\x01&\x00\ +\xac\xffq\x01&\x00\xad\xffq\x01&\x00\xb4\xffq\x01\ +&\x00\xb5\xffq\x01&\x00\xb6\xffq\x01&\x00\xb7\xff\ +q\x01&\x00\xb8\xffq\x01&\x00\xba\xffq\x01&\x00\ +\xbb\xff\x9a\x01&\x00\xbc\xff\x9a\x01&\x00\xbd\xff\x9a\x01\ +&\x00\xbe\xff\x9a\x01&\x00\xbf\xff\xd7\x01&\x00\xc2\xff\ +q\x01&\x00\xc3\xff\x5c\x01&\x00\xc4\xffq\x01&\x00\ +\xc5\xff\x5c\x01&\x00\xc6\xffq\x01&\x00\xc7\xff\x5c\x01\ +&\x00\xc8\xff\xd7\x01&\x00\xc9\xffq\x01&\x00\xca\xff\ +\xd7\x01&\x00\xcb\xffq\x01&\x00\xcc\xff\xd7\x01&\x00\ +\xcd\xffq\x01&\x00\xce\xff\xd7\x01&\x00\xcf\xffq\x01\ +&\x00\xd1\xffq\x01&\x00\xd3\xffq\x01&\x00\xd5\xff\ +q\x01&\x00\xd7\xffq\x01&\x00\xd9\xffq\x01&\x00\ +\xdb\xffq\x01&\x00\xdd\xffq\x01&\x00\xde\xff\xd7\x01\ +&\x00\xdf\xffq\x01&\x00\xe0\xff\xd7\x01&\x00\xe1\xff\ +q\x01&\x00\xe2\xff\xd7\x01&\x00\xe3\xffq\x01&\x00\ +\xe4\xff\xd7\x01&\x00\xe5\xffq\x01&\x00\xfa\xff\x9a\x01\ +&\x01\x06\xff\x9a\x01&\x01\x08\xff\x9a\x01&\x01\x0d\xff\ +\x9a\x01&\x01\x0e\xff\xd7\x01&\x01\x0f\xffq\x01&\x01\ +\x10\xff\xd7\x01&\x01\x11\xffq\x01&\x01\x12\xff\xd7\x01\ +&\x01\x13\xffq\x01&\x01\x14\xff\xd7\x01&\x01\x15\xff\ +q\x01&\x01\x17\xff\x9a\x01&\x01\x19\xff\x9a\x01&\x01\ +\x1d\xff\x85\x01&\x01!\xff\x85\x01&\x01$\x00)\x01\ +&\x01&\x00)\x01&\x01+\xff\x9a\x01&\x01-\xff\ +\x9a\x01&\x01/\xff\x9a\x01&\x011\xff\x9a\x01&\x01\ +3\xff\x9a\x01&\x015\xff\x9a\x01&\x017\xff\xd7\x01\ +&\x01<\xff\xae\x01&\x01>\xff\xae\x01&\x01@\xff\ +\xae\x01&\x01C\xffq\x01&\x01D\xff\x5c\x01&\x01\ +F\xff\x5c\x01&\x01G\xff\xd7\x01&\x01H\xffq\x01\ +&\x01J\xff\x85\x01&\x01\xfb\xff\xd7\x01&\x01\xfd\xff\ +\xd7\x01&\x02\x02\xff\xae\x01&\x02\x03\xff\xae\x01&\x02\ +\x04\xff\xae\x01&\x02\x08\xff\x85\x01&\x02\x0c\xff\x85\x01\ +&\x02W\xff\x9a\x01&\x02X\xffq\x01&\x02Y\xff\ +\x5c\x01&\x02_\xff\xd7\x01&\x02`\xffq\x01&\x02\ +b\xff\x9a\x01&\x03\x1d\xffq\x01&\x03\x1e\xff\x5c\x01\ +&\x03\x1f\xffq\x01&\x03 \xff\x5c\x01&\x03!\xff\ +q\x01&\x03\x22\xff\x5c\x01&\x03#\xffq\x01&\x03\ +%\xffq\x01&\x03&\xff\x5c\x01&\x03'\xffq\x01\ +&\x03(\xff\x5c\x01&\x03)\xffq\x01&\x03*\xff\ +\x5c\x01&\x03+\xffq\x01&\x03,\xff\x5c\x01&\x03\ +-\xffq\x01&\x03.\xff\x5c\x01&\x03/\xffq\x01\ +&\x030\xff\x5c\x01&\x031\xffq\x01&\x032\xff\ +\x5c\x01&\x033\xffq\x01&\x034\xff\x5c\x01&\x03\ +6\xffq\x01&\x038\xffq\x01&\x03:\xffq\x01\ +&\x03<\xffq\x01&\x03@\xffq\x01&\x03B\xff\ +q\x01&\x03D\xffq\x01&\x03I\xff\xd7\x01&\x03\ +J\xffq\x01&\x03K\xff\xd7\x01&\x03L\xffq\x01\ +&\x03M\xff\xd7\x01&\x03N\xffq\x01&\x03O\xff\ +\xd7\x01&\x03Q\xff\xd7\x01&\x03R\xffq\x01&\x03\ +S\xff\xd7\x01&\x03T\xffq\x01&\x03U\xff\xd7\x01\ +&\x03V\xffq\x01&\x03W\xff\xd7\x01&\x03X\xff\ +q\x01&\x03Y\xff\xd7\x01&\x03Z\xffq\x01&\x03\ +[\xff\xd7\x01&\x03\x5c\xffq\x01&\x03]\xff\xd7\x01\ +&\x03^\xffq\x01&\x03_\xff\xd7\x01&\x03`\xff\ +q\x01&\x03b\xff\x9a\x01&\x03d\xff\x9a\x01&\x03\ +f\xff\x9a\x01&\x03h\xff\x9a\x01&\x03j\xff\x9a\x01\ +&\x03l\xff\x9a\x01&\x03n\xff\x9a\x01&\x03p\xff\ +\xd7\x01&\x03\x8f\x00)\x01'\x00\x05\x00)\x01'\x00\ +\x0a\x00)\x01'\x02\x07\x00)\x01'\x02\x0b\x00)\x01\ +(\x00\x0f\xff\x85\x01(\x00\x10\xff\xae\x01(\x00\x11\xff\ +\x85\x01(\x00\x22\x00)\x01(\x00$\xffq\x01(\x00\ +&\xff\xd7\x01(\x00*\xff\xd7\x01(\x002\xff\xd7\x01\ +(\x004\xff\xd7\x01(\x007\x00)\x01(\x00D\xff\ +\x5c\x01(\x00F\xffq\x01(\x00G\xffq\x01(\x00\ +H\xffq\x01(\x00J\xffq\x01(\x00P\xff\x9a\x01\ +(\x00Q\xff\x9a\x01(\x00R\xffq\x01(\x00S\xff\ +\x9a\x01(\x00T\xffq\x01(\x00U\xff\x9a\x01(\x00\ +V\xff\x85\x01(\x00X\xff\x9a\x01(\x00Y\xff\xd7\x01\ +(\x00Z\xff\xd7\x01(\x00[\xff\xd7\x01(\x00\x5c\xff\ +\xd7\x01(\x00]\xff\xae\x01(\x00\x82\xffq\x01(\x00\ +\x83\xffq\x01(\x00\x84\xffq\x01(\x00\x85\xffq\x01\ +(\x00\x86\xffq\x01(\x00\x87\xffq\x01(\x00\x89\xff\ +\xd7\x01(\x00\x94\xff\xd7\x01(\x00\x95\xff\xd7\x01(\x00\ +\x96\xff\xd7\x01(\x00\x97\xff\xd7\x01(\x00\x98\xff\xd7\x01\ +(\x00\x9a\xff\xd7\x01(\x00\xa2\xffq\x01(\x00\xa3\xff\ +\x5c\x01(\x00\xa4\xff\x5c\x01(\x00\xa5\xff\x5c\x01(\x00\ +\xa6\xff\x5c\x01(\x00\xa7\xff\x5c\x01(\x00\xa8\xff\x5c\x01\ +(\x00\xa9\xffq\x01(\x00\xaa\xffq\x01(\x00\xab\xff\ +q\x01(\x00\xac\xffq\x01(\x00\xad\xffq\x01(\x00\ +\xb4\xffq\x01(\x00\xb5\xffq\x01(\x00\xb6\xffq\x01\ +(\x00\xb7\xffq\x01(\x00\xb8\xffq\x01(\x00\xba\xff\ +q\x01(\x00\xbb\xff\x9a\x01(\x00\xbc\xff\x9a\x01(\x00\ +\xbd\xff\x9a\x01(\x00\xbe\xff\x9a\x01(\x00\xbf\xff\xd7\x01\ +(\x00\xc2\xffq\x01(\x00\xc3\xff\x5c\x01(\x00\xc4\xff\ +q\x01(\x00\xc5\xff\x5c\x01(\x00\xc6\xffq\x01(\x00\ +\xc7\xff\x5c\x01(\x00\xc8\xff\xd7\x01(\x00\xc9\xffq\x01\ +(\x00\xca\xff\xd7\x01(\x00\xcb\xffq\x01(\x00\xcc\xff\ +\xd7\x01(\x00\xcd\xffq\x01(\x00\xce\xff\xd7\x01(\x00\ +\xcf\xffq\x01(\x00\xd1\xffq\x01(\x00\xd3\xffq\x01\ +(\x00\xd5\xffq\x01(\x00\xd7\xffq\x01(\x00\xd9\xff\ +q\x01(\x00\xdb\xffq\x01(\x00\xdd\xffq\x01(\x00\ +\xde\xff\xd7\x01(\x00\xdf\xffq\x01(\x00\xe0\xff\xd7\x01\ +(\x00\xe1\xffq\x01(\x00\xe2\xff\xd7\x01(\x00\xe3\xff\ +q\x01(\x00\xe4\xff\xd7\x01(\x00\xe5\xffq\x01(\x00\ +\xfa\xff\x9a\x01(\x01\x06\xff\x9a\x01(\x01\x08\xff\x9a\x01\ +(\x01\x0d\xff\x9a\x01(\x01\x0e\xff\xd7\x01(\x01\x0f\xff\ +q\x01(\x01\x10\xff\xd7\x01(\x01\x11\xffq\x01(\x01\ +\x12\xff\xd7\x01(\x01\x13\xffq\x01(\x01\x14\xff\xd7\x01\ +(\x01\x15\xffq\x01(\x01\x17\xff\x9a\x01(\x01\x19\xff\ +\x9a\x01(\x01\x1d\xff\x85\x01(\x01!\xff\x85\x01(\x01\ +$\x00)\x01(\x01&\x00)\x01(\x01+\xff\x9a\x01\ +(\x01-\xff\x9a\x01(\x01/\xff\x9a\x01(\x011\xff\ +\x9a\x01(\x013\xff\x9a\x01(\x015\xff\x9a\x01(\x01\ +7\xff\xd7\x01(\x01<\xff\xae\x01(\x01>\xff\xae\x01\ +(\x01@\xff\xae\x01(\x01C\xffq\x01(\x01D\xff\ +\x5c\x01(\x01F\xff\x5c\x01(\x01G\xff\xd7\x01(\x01\ +H\xffq\x01(\x01J\xff\x85\x01(\x01\xfb\xff\xd7\x01\ +(\x01\xfd\xff\xd7\x01(\x02\x02\xff\xae\x01(\x02\x03\xff\ +\xae\x01(\x02\x04\xff\xae\x01(\x02\x08\xff\x85\x01(\x02\ +\x0c\xff\x85\x01(\x02W\xff\x9a\x01(\x02X\xffq\x01\ +(\x02Y\xff\x5c\x01(\x02_\xff\xd7\x01(\x02`\xff\ +q\x01(\x02b\xff\x9a\x01(\x03\x1d\xffq\x01(\x03\ +\x1e\xff\x5c\x01(\x03\x1f\xffq\x01(\x03 \xff\x5c\x01\ +(\x03!\xffq\x01(\x03\x22\xff\x5c\x01(\x03#\xff\ +q\x01(\x03%\xffq\x01(\x03&\xff\x5c\x01(\x03\ +'\xffq\x01(\x03(\xff\x5c\x01(\x03)\xffq\x01\ +(\x03*\xff\x5c\x01(\x03+\xffq\x01(\x03,\xff\ +\x5c\x01(\x03-\xffq\x01(\x03.\xff\x5c\x01(\x03\ +/\xffq\x01(\x030\xff\x5c\x01(\x031\xffq\x01\ +(\x032\xff\x5c\x01(\x033\xffq\x01(\x034\xff\ +\x5c\x01(\x036\xffq\x01(\x038\xffq\x01(\x03\ +:\xffq\x01(\x03<\xffq\x01(\x03@\xffq\x01\ +(\x03B\xffq\x01(\x03D\xffq\x01(\x03I\xff\ +\xd7\x01(\x03J\xffq\x01(\x03K\xff\xd7\x01(\x03\ +L\xffq\x01(\x03M\xff\xd7\x01(\x03N\xffq\x01\ +(\x03O\xff\xd7\x01(\x03Q\xff\xd7\x01(\x03R\xff\ +q\x01(\x03S\xff\xd7\x01(\x03T\xffq\x01(\x03\ +U\xff\xd7\x01(\x03V\xffq\x01(\x03W\xff\xd7\x01\ +(\x03X\xffq\x01(\x03Y\xff\xd7\x01(\x03Z\xff\ +q\x01(\x03[\xff\xd7\x01(\x03\x5c\xffq\x01(\x03\ +]\xff\xd7\x01(\x03^\xffq\x01(\x03_\xff\xd7\x01\ +(\x03`\xffq\x01(\x03b\xff\x9a\x01(\x03d\xff\ +\x9a\x01(\x03f\xff\x9a\x01(\x03h\xff\x9a\x01(\x03\ +j\xff\x9a\x01(\x03l\xff\x9a\x01(\x03n\xff\x9a\x01\ +(\x03p\xff\xd7\x01(\x03\x8f\x00)\x01*\x00\x0f\xff\ +\xd7\x01*\x00\x11\xff\xd7\x01*\x00$\xff\xec\x01*\x00\ +\x82\xff\xec\x01*\x00\x83\xff\xec\x01*\x00\x84\xff\xec\x01\ +*\x00\x85\xff\xec\x01*\x00\x86\xff\xec\x01*\x00\x87\xff\ +\xec\x01*\x00\xc2\xff\xec\x01*\x00\xc4\xff\xec\x01*\x00\ +\xc6\xff\xec\x01*\x01C\xff\xec\x01*\x02\x08\xff\xd7\x01\ +*\x02\x0c\xff\xd7\x01*\x02X\xff\xec\x01*\x03\x1d\xff\ +\xec\x01*\x03\x1f\xff\xec\x01*\x03!\xff\xec\x01*\x03\ +#\xff\xec\x01*\x03%\xff\xec\x01*\x03'\xff\xec\x01\ +*\x03)\xff\xec\x01*\x03+\xff\xec\x01*\x03-\xff\ +\xec\x01*\x03/\xff\xec\x01*\x031\xff\xec\x01*\x03\ +3\xff\xec\x01,\x00\x0f\xff\xd7\x01,\x00\x11\xff\xd7\x01\ +,\x00$\xff\xec\x01,\x00\x82\xff\xec\x01,\x00\x83\xff\ +\xec\x01,\x00\x84\xff\xec\x01,\x00\x85\xff\xec\x01,\x00\ +\x86\xff\xec\x01,\x00\x87\xff\xec\x01,\x00\xc2\xff\xec\x01\ +,\x00\xc4\xff\xec\x01,\x00\xc6\xff\xec\x01,\x01C\xff\ +\xec\x01,\x02\x08\xff\xd7\x01,\x02\x0c\xff\xd7\x01,\x02\ +X\xff\xec\x01,\x03\x1d\xff\xec\x01,\x03\x1f\xff\xec\x01\ +,\x03!\xff\xec\x01,\x03#\xff\xec\x01,\x03%\xff\ +\xec\x01,\x03'\xff\xec\x01,\x03)\xff\xec\x01,\x03\ ++\xff\xec\x01,\x03-\xff\xec\x01,\x03/\xff\xec\x01\ +,\x031\xff\xec\x01,\x033\xff\xec\x01.\x00\x0f\xff\ +\xd7\x01.\x00\x11\xff\xd7\x01.\x00$\xff\xec\x01.\x00\ +\x82\xff\xec\x01.\x00\x83\xff\xec\x01.\x00\x84\xff\xec\x01\ +.\x00\x85\xff\xec\x01.\x00\x86\xff\xec\x01.\x00\x87\xff\ +\xec\x01.\x00\xc2\xff\xec\x01.\x00\xc4\xff\xec\x01.\x00\ +\xc6\xff\xec\x01.\x01C\xff\xec\x01.\x02\x08\xff\xd7\x01\ +.\x02\x0c\xff\xd7\x01.\x02X\xff\xec\x01.\x03\x1d\xff\ +\xec\x01.\x03\x1f\xff\xec\x01.\x03!\xff\xec\x01.\x03\ +#\xff\xec\x01.\x03%\xff\xec\x01.\x03'\xff\xec\x01\ +.\x03)\xff\xec\x01.\x03+\xff\xec\x01.\x03-\xff\ +\xec\x01.\x03/\xff\xec\x01.\x031\xff\xec\x01.\x03\ +3\xff\xec\x010\x00\x0f\xff\xd7\x010\x00\x11\xff\xd7\x01\ +0\x00$\xff\xec\x010\x00\x82\xff\xec\x010\x00\x83\xff\ +\xec\x010\x00\x84\xff\xec\x010\x00\x85\xff\xec\x010\x00\ +\x86\xff\xec\x010\x00\x87\xff\xec\x010\x00\xc2\xff\xec\x01\ +0\x00\xc4\xff\xec\x010\x00\xc6\xff\xec\x010\x01C\xff\ +\xec\x010\x02\x08\xff\xd7\x010\x02\x0c\xff\xd7\x010\x02\ +X\xff\xec\x010\x03\x1d\xff\xec\x010\x03\x1f\xff\xec\x01\ +0\x03!\xff\xec\x010\x03#\xff\xec\x010\x03%\xff\ +\xec\x010\x03'\xff\xec\x010\x03)\xff\xec\x010\x03\ ++\xff\xec\x010\x03-\xff\xec\x010\x03/\xff\xec\x01\ +0\x031\xff\xec\x010\x033\xff\xec\x012\x00\x0f\xff\ +\xd7\x012\x00\x11\xff\xd7\x012\x00$\xff\xec\x012\x00\ +\x82\xff\xec\x012\x00\x83\xff\xec\x012\x00\x84\xff\xec\x01\ +2\x00\x85\xff\xec\x012\x00\x86\xff\xec\x012\x00\x87\xff\ +\xec\x012\x00\xc2\xff\xec\x012\x00\xc4\xff\xec\x012\x00\ +\xc6\xff\xec\x012\x01C\xff\xec\x012\x02\x08\xff\xd7\x01\ +2\x02\x0c\xff\xd7\x012\x02X\xff\xec\x012\x03\x1d\xff\ +\xec\x012\x03\x1f\xff\xec\x012\x03!\xff\xec\x012\x03\ +#\xff\xec\x012\x03%\xff\xec\x012\x03'\xff\xec\x01\ +2\x03)\xff\xec\x012\x03+\xff\xec\x012\x03-\xff\ +\xec\x012\x03/\xff\xec\x012\x031\xff\xec\x012\x03\ +3\xff\xec\x014\x00\x0f\xff\xd7\x014\x00\x11\xff\xd7\x01\ +4\x00$\xff\xec\x014\x00\x82\xff\xec\x014\x00\x83\xff\ +\xec\x014\x00\x84\xff\xec\x014\x00\x85\xff\xec\x014\x00\ +\x86\xff\xec\x014\x00\x87\xff\xec\x014\x00\xc2\xff\xec\x01\ +4\x00\xc4\xff\xec\x014\x00\xc6\xff\xec\x014\x01C\xff\ +\xec\x014\x02\x08\xff\xd7\x014\x02\x0c\xff\xd7\x014\x02\ +X\xff\xec\x014\x03\x1d\xff\xec\x014\x03\x1f\xff\xec\x01\ +4\x03!\xff\xec\x014\x03#\xff\xec\x014\x03%\xff\ +\xec\x014\x03'\xff\xec\x014\x03)\xff\xec\x014\x03\ ++\xff\xec\x014\x03-\xff\xec\x014\x03/\xff\xec\x01\ +4\x031\xff\xec\x014\x033\xff\xec\x016\x00\x0f\xff\ +\x9a\x016\x00\x11\xff\x9a\x016\x00\x22\x00)\x016\x00\ +$\xff\xae\x016\x00&\xff\xec\x016\x00*\xff\xec\x01\ +6\x002\xff\xec\x016\x004\xff\xec\x016\x00D\xff\ +\xd7\x016\x00F\xff\xd7\x016\x00G\xff\xd7\x016\x00\ +H\xff\xd7\x016\x00J\xff\xec\x016\x00P\xff\xec\x01\ +6\x00Q\xff\xec\x016\x00R\xff\xd7\x016\x00S\xff\ +\xec\x016\x00T\xff\xd7\x016\x00U\xff\xec\x016\x00\ +V\xff\xec\x016\x00X\xff\xec\x016\x00\x82\xff\xae\x01\ +6\x00\x83\xff\xae\x016\x00\x84\xff\xae\x016\x00\x85\xff\ +\xae\x016\x00\x86\xff\xae\x016\x00\x87\xff\xae\x016\x00\ +\x89\xff\xec\x016\x00\x94\xff\xec\x016\x00\x95\xff\xec\x01\ +6\x00\x96\xff\xec\x016\x00\x97\xff\xec\x016\x00\x98\xff\ +\xec\x016\x00\x9a\xff\xec\x016\x00\xa2\xff\xd7\x016\x00\ +\xa3\xff\xd7\x016\x00\xa4\xff\xd7\x016\x00\xa5\xff\xd7\x01\ +6\x00\xa6\xff\xd7\x016\x00\xa7\xff\xd7\x016\x00\xa8\xff\ +\xd7\x016\x00\xa9\xff\xd7\x016\x00\xaa\xff\xd7\x016\x00\ +\xab\xff\xd7\x016\x00\xac\xff\xd7\x016\x00\xad\xff\xd7\x01\ +6\x00\xb4\xff\xd7\x016\x00\xb5\xff\xd7\x016\x00\xb6\xff\ +\xd7\x016\x00\xb7\xff\xd7\x016\x00\xb8\xff\xd7\x016\x00\ +\xba\xff\xd7\x016\x00\xbb\xff\xec\x016\x00\xbc\xff\xec\x01\ +6\x00\xbd\xff\xec\x016\x00\xbe\xff\xec\x016\x00\xc2\xff\ +\xae\x016\x00\xc3\xff\xd7\x016\x00\xc4\xff\xae\x016\x00\ +\xc5\xff\xd7\x016\x00\xc6\xff\xae\x016\x00\xc7\xff\xd7\x01\ +6\x00\xc8\xff\xec\x016\x00\xc9\xff\xd7\x016\x00\xca\xff\ +\xec\x016\x00\xcb\xff\xd7\x016\x00\xcc\xff\xec\x016\x00\ +\xcd\xff\xd7\x016\x00\xce\xff\xec\x016\x00\xcf\xff\xd7\x01\ +6\x00\xd1\xff\xd7\x016\x00\xd3\xff\xd7\x016\x00\xd5\xff\ +\xd7\x016\x00\xd7\xff\xd7\x016\x00\xd9\xff\xd7\x016\x00\ +\xdb\xff\xd7\x016\x00\xdd\xff\xd7\x016\x00\xde\xff\xec\x01\ +6\x00\xdf\xff\xec\x016\x00\xe0\xff\xec\x016\x00\xe1\xff\ +\xec\x016\x00\xe2\xff\xec\x016\x00\xe3\xff\xec\x016\x00\ +\xe4\xff\xec\x016\x00\xe5\xff\xec\x016\x00\xfa\xff\xec\x01\ +6\x01\x06\xff\xec\x016\x01\x08\xff\xec\x016\x01\x0d\xff\ +\xec\x016\x01\x0e\xff\xec\x016\x01\x0f\xff\xd7\x016\x01\ +\x10\xff\xec\x016\x01\x11\xff\xd7\x016\x01\x12\xff\xec\x01\ +6\x01\x13\xff\xd7\x016\x01\x14\xff\xec\x016\x01\x15\xff\ +\xd7\x016\x01\x17\xff\xec\x016\x01\x19\xff\xec\x016\x01\ +\x1d\xff\xec\x016\x01!\xff\xec\x016\x01+\xff\xec\x01\ +6\x01-\xff\xec\x016\x01/\xff\xec\x016\x011\xff\ +\xec\x016\x013\xff\xec\x016\x015\xff\xec\x016\x01\ +C\xff\xae\x016\x01D\xff\xd7\x016\x01F\xff\xd7\x01\ +6\x01G\xff\xec\x016\x01H\xff\xd7\x016\x01J\xff\ +\xec\x016\x02\x08\xff\x9a\x016\x02\x0c\xff\x9a\x016\x02\ +W\xff\xec\x016\x02X\xff\xae\x016\x02Y\xff\xd7\x01\ +6\x02_\xff\xec\x016\x02`\xff\xd7\x016\x02b\xff\ +\xec\x016\x03\x1d\xff\xae\x016\x03\x1e\xff\xd7\x016\x03\ +\x1f\xff\xae\x016\x03 \xff\xd7\x016\x03!\xff\xae\x01\ +6\x03\x22\xff\xd7\x016\x03#\xff\xae\x016\x03%\xff\ +\xae\x016\x03&\xff\xd7\x016\x03'\xff\xae\x016\x03\ +(\xff\xd7\x016\x03)\xff\xae\x016\x03*\xff\xd7\x01\ +6\x03+\xff\xae\x016\x03,\xff\xd7\x016\x03-\xff\ +\xae\x016\x03.\xff\xd7\x016\x03/\xff\xae\x016\x03\ +0\xff\xd7\x016\x031\xff\xae\x016\x032\xff\xd7\x01\ +6\x033\xff\xae\x016\x034\xff\xd7\x016\x036\xff\ +\xd7\x016\x038\xff\xd7\x016\x03:\xff\xd7\x016\x03\ +<\xff\xd7\x016\x03@\xff\xd7\x016\x03B\xff\xd7\x01\ +6\x03D\xff\xd7\x016\x03I\xff\xec\x016\x03J\xff\ +\xd7\x016\x03K\xff\xec\x016\x03L\xff\xd7\x016\x03\ +M\xff\xec\x016\x03N\xff\xd7\x016\x03O\xff\xec\x01\ +6\x03Q\xff\xec\x016\x03R\xff\xd7\x016\x03S\xff\ +\xec\x016\x03T\xff\xd7\x016\x03U\xff\xec\x016\x03\ +V\xff\xd7\x016\x03W\xff\xec\x016\x03X\xff\xd7\x01\ +6\x03Y\xff\xec\x016\x03Z\xff\xd7\x016\x03[\xff\ +\xec\x016\x03\x5c\xff\xd7\x016\x03]\xff\xec\x016\x03\ +^\xff\xd7\x016\x03_\xff\xec\x016\x03`\xff\xd7\x01\ +6\x03b\xff\xec\x016\x03d\xff\xec\x016\x03f\xff\ +\xec\x016\x03h\xff\xec\x016\x03j\xff\xec\x016\x03\ +l\xff\xec\x016\x03n\xff\xec\x017\x00\x05\x00R\x01\ +7\x00\x0a\x00R\x017\x00\x0f\xff\xae\x017\x00\x11\xff\ +\xae\x017\x00\x22\x00)\x017\x02\x07\x00R\x017\x02\ +\x08\xff\xae\x017\x02\x0b\x00R\x017\x02\x0c\xff\xae\x01\ +8\x00\x0f\xff\x85\x018\x00\x11\xff\x85\x018\x00\x22\x00\ +)\x018\x00$\xff\x85\x018\x00&\xff\xd7\x018\x00\ +*\xff\xd7\x018\x002\xff\xd7\x018\x004\xff\xd7\x01\ +8\x00D\xff\x9a\x018\x00F\xff\x9a\x018\x00G\xff\ +\x9a\x018\x00H\xff\x9a\x018\x00J\xff\xd7\x018\x00\ +P\xff\xc3\x018\x00Q\xff\xc3\x018\x00R\xff\x9a\x01\ +8\x00S\xff\xc3\x018\x00T\xff\x9a\x018\x00U\xff\ +\xc3\x018\x00V\xff\xae\x018\x00X\xff\xc3\x018\x00\ +]\xff\xd7\x018\x00\x82\xff\x85\x018\x00\x83\xff\x85\x01\ +8\x00\x84\xff\x85\x018\x00\x85\xff\x85\x018\x00\x86\xff\ +\x85\x018\x00\x87\xff\x85\x018\x00\x89\xff\xd7\x018\x00\ +\x94\xff\xd7\x018\x00\x95\xff\xd7\x018\x00\x96\xff\xd7\x01\ +8\x00\x97\xff\xd7\x018\x00\x98\xff\xd7\x018\x00\x9a\xff\ +\xd7\x018\x00\xa2\xff\x9a\x018\x00\xa3\xff\x9a\x018\x00\ +\xa4\xff\x9a\x018\x00\xa5\xff\x9a\x018\x00\xa6\xff\x9a\x01\ +8\x00\xa7\xff\x9a\x018\x00\xa8\xff\x9a\x018\x00\xa9\xff\ +\x9a\x018\x00\xaa\xff\x9a\x018\x00\xab\xff\x9a\x018\x00\ +\xac\xff\x9a\x018\x00\xad\xff\x9a\x018\x00\xb4\xff\x9a\x01\ +8\x00\xb5\xff\x9a\x018\x00\xb6\xff\x9a\x018\x00\xb7\xff\ +\x9a\x018\x00\xb8\xff\x9a\x018\x00\xba\xff\x9a\x018\x00\ +\xbb\xff\xc3\x018\x00\xbc\xff\xc3\x018\x00\xbd\xff\xc3\x01\ +8\x00\xbe\xff\xc3\x018\x00\xc2\xff\x85\x018\x00\xc3\xff\ +\x9a\x018\x00\xc4\xff\x85\x018\x00\xc5\xff\x9a\x018\x00\ +\xc6\xff\x85\x018\x00\xc7\xff\x9a\x018\x00\xc8\xff\xd7\x01\ +8\x00\xc9\xff\x9a\x018\x00\xca\xff\xd7\x018\x00\xcb\xff\ +\x9a\x018\x00\xcc\xff\xd7\x018\x00\xcd\xff\x9a\x018\x00\ +\xce\xff\xd7\x018\x00\xcf\xff\x9a\x018\x00\xd1\xff\x9a\x01\ +8\x00\xd3\xff\x9a\x018\x00\xd5\xff\x9a\x018\x00\xd7\xff\ +\x9a\x018\x00\xd9\xff\x9a\x018\x00\xdb\xff\x9a\x018\x00\ +\xdd\xff\x9a\x018\x00\xde\xff\xd7\x018\x00\xdf\xff\xd7\x01\ +8\x00\xe0\xff\xd7\x018\x00\xe1\xff\xd7\x018\x00\xe2\xff\ +\xd7\x018\x00\xe3\xff\xd7\x018\x00\xe4\xff\xd7\x018\x00\ +\xe5\xff\xd7\x018\x00\xfa\xff\xc3\x018\x01\x06\xff\xc3\x01\ +8\x01\x08\xff\xc3\x018\x01\x0d\xff\xc3\x018\x01\x0e\xff\ +\xd7\x018\x01\x0f\xff\x9a\x018\x01\x10\xff\xd7\x018\x01\ +\x11\xff\x9a\x018\x01\x12\xff\xd7\x018\x01\x13\xff\x9a\x01\ +8\x01\x14\xff\xd7\x018\x01\x15\xff\x9a\x018\x01\x17\xff\ +\xc3\x018\x01\x19\xff\xc3\x018\x01\x1d\xff\xae\x018\x01\ +!\xff\xae\x018\x01+\xff\xc3\x018\x01-\xff\xc3\x01\ +8\x01/\xff\xc3\x018\x011\xff\xc3\x018\x013\xff\ +\xc3\x018\x015\xff\xc3\x018\x01<\xff\xd7\x018\x01\ +>\xff\xd7\x018\x01@\xff\xd7\x018\x01C\xff\x85\x01\ +8\x01D\xff\x9a\x018\x01F\xff\x9a\x018\x01G\xff\ +\xd7\x018\x01H\xff\x9a\x018\x01J\xff\xae\x018\x02\ +\x08\xff\x85\x018\x02\x0c\xff\x85\x018\x02W\xff\xc3\x01\ +8\x02X\xff\x85\x018\x02Y\xff\x9a\x018\x02_\xff\ +\xd7\x018\x02`\xff\x9a\x018\x02b\xff\xc3\x018\x03\ +\x1d\xff\x85\x018\x03\x1e\xff\x9a\x018\x03\x1f\xff\x85\x01\ +8\x03 \xff\x9a\x018\x03!\xff\x85\x018\x03\x22\xff\ +\x9a\x018\x03#\xff\x85\x018\x03%\xff\x85\x018\x03\ +&\xff\x9a\x018\x03'\xff\x85\x018\x03(\xff\x9a\x01\ +8\x03)\xff\x85\x018\x03*\xff\x9a\x018\x03+\xff\ +\x85\x018\x03,\xff\x9a\x018\x03-\xff\x85\x018\x03\ +.\xff\x9a\x018\x03/\xff\x85\x018\x030\xff\x9a\x01\ +8\x031\xff\x85\x018\x032\xff\x9a\x018\x033\xff\ +\x85\x018\x034\xff\x9a\x018\x036\xff\x9a\x018\x03\ +8\xff\x9a\x018\x03:\xff\x9a\x018\x03<\xff\x9a\x01\ +8\x03@\xff\x9a\x018\x03B\xff\x9a\x018\x03D\xff\ +\x9a\x018\x03I\xff\xd7\x018\x03J\xff\x9a\x018\x03\ +K\xff\xd7\x018\x03L\xff\x9a\x018\x03M\xff\xd7\x01\ +8\x03N\xff\x9a\x018\x03O\xff\xd7\x018\x03Q\xff\ +\xd7\x018\x03R\xff\x9a\x018\x03S\xff\xd7\x018\x03\ +T\xff\x9a\x018\x03U\xff\xd7\x018\x03V\xff\x9a\x01\ +8\x03W\xff\xd7\x018\x03X\xff\x9a\x018\x03Y\xff\ +\xd7\x018\x03Z\xff\x9a\x018\x03[\xff\xd7\x018\x03\ +\x5c\xff\x9a\x018\x03]\xff\xd7\x018\x03^\xff\x9a\x01\ +8\x03_\xff\xd7\x018\x03`\xff\x9a\x018\x03b\xff\ +\xc3\x018\x03d\xff\xc3\x018\x03f\xff\xc3\x018\x03\ +h\xff\xc3\x018\x03j\xff\xc3\x018\x03l\xff\xc3\x01\ +8\x03n\xff\xc3\x019\x00\x05\x00R\x019\x00\x0a\x00\ +R\x019\x00\x0f\xff\xae\x019\x00\x11\xff\xae\x019\x00\ +\x22\x00)\x019\x02\x07\x00R\x019\x02\x08\xff\xae\x01\ +9\x02\x0b\x00R\x019\x02\x0c\xff\xae\x01:\x00\x0f\xff\ +\x85\x01:\x00\x11\xff\x85\x01:\x00\x22\x00)\x01:\x00\ +$\xff\x85\x01:\x00&\xff\xd7\x01:\x00*\xff\xd7\x01\ +:\x002\xff\xd7\x01:\x004\xff\xd7\x01:\x00D\xff\ +\x9a\x01:\x00F\xff\x9a\x01:\x00G\xff\x9a\x01:\x00\ +H\xff\x9a\x01:\x00J\xff\xd7\x01:\x00P\xff\xc3\x01\ +:\x00Q\xff\xc3\x01:\x00R\xff\x9a\x01:\x00S\xff\ +\xc3\x01:\x00T\xff\x9a\x01:\x00U\xff\xc3\x01:\x00\ +V\xff\xae\x01:\x00X\xff\xc3\x01:\x00]\xff\xd7\x01\ +:\x00\x82\xff\x85\x01:\x00\x83\xff\x85\x01:\x00\x84\xff\ +\x85\x01:\x00\x85\xff\x85\x01:\x00\x86\xff\x85\x01:\x00\ +\x87\xff\x85\x01:\x00\x89\xff\xd7\x01:\x00\x94\xff\xd7\x01\ +:\x00\x95\xff\xd7\x01:\x00\x96\xff\xd7\x01:\x00\x97\xff\ +\xd7\x01:\x00\x98\xff\xd7\x01:\x00\x9a\xff\xd7\x01:\x00\ +\xa2\xff\x9a\x01:\x00\xa3\xff\x9a\x01:\x00\xa4\xff\x9a\x01\ +:\x00\xa5\xff\x9a\x01:\x00\xa6\xff\x9a\x01:\x00\xa7\xff\ +\x9a\x01:\x00\xa8\xff\x9a\x01:\x00\xa9\xff\x9a\x01:\x00\ +\xaa\xff\x9a\x01:\x00\xab\xff\x9a\x01:\x00\xac\xff\x9a\x01\ +:\x00\xad\xff\x9a\x01:\x00\xb4\xff\x9a\x01:\x00\xb5\xff\ +\x9a\x01:\x00\xb6\xff\x9a\x01:\x00\xb7\xff\x9a\x01:\x00\ +\xb8\xff\x9a\x01:\x00\xba\xff\x9a\x01:\x00\xbb\xff\xc3\x01\ +:\x00\xbc\xff\xc3\x01:\x00\xbd\xff\xc3\x01:\x00\xbe\xff\ +\xc3\x01:\x00\xc2\xff\x85\x01:\x00\xc3\xff\x9a\x01:\x00\ +\xc4\xff\x85\x01:\x00\xc5\xff\x9a\x01:\x00\xc6\xff\x85\x01\ +:\x00\xc7\xff\x9a\x01:\x00\xc8\xff\xd7\x01:\x00\xc9\xff\ +\x9a\x01:\x00\xca\xff\xd7\x01:\x00\xcb\xff\x9a\x01:\x00\ +\xcc\xff\xd7\x01:\x00\xcd\xff\x9a\x01:\x00\xce\xff\xd7\x01\ +:\x00\xcf\xff\x9a\x01:\x00\xd1\xff\x9a\x01:\x00\xd3\xff\ +\x9a\x01:\x00\xd5\xff\x9a\x01:\x00\xd7\xff\x9a\x01:\x00\ +\xd9\xff\x9a\x01:\x00\xdb\xff\x9a\x01:\x00\xdd\xff\x9a\x01\ +:\x00\xde\xff\xd7\x01:\x00\xdf\xff\xd7\x01:\x00\xe0\xff\ +\xd7\x01:\x00\xe1\xff\xd7\x01:\x00\xe2\xff\xd7\x01:\x00\ +\xe3\xff\xd7\x01:\x00\xe4\xff\xd7\x01:\x00\xe5\xff\xd7\x01\ +:\x00\xfa\xff\xc3\x01:\x01\x06\xff\xc3\x01:\x01\x08\xff\ +\xc3\x01:\x01\x0d\xff\xc3\x01:\x01\x0e\xff\xd7\x01:\x01\ +\x0f\xff\x9a\x01:\x01\x10\xff\xd7\x01:\x01\x11\xff\x9a\x01\ +:\x01\x12\xff\xd7\x01:\x01\x13\xff\x9a\x01:\x01\x14\xff\ +\xd7\x01:\x01\x15\xff\x9a\x01:\x01\x17\xff\xc3\x01:\x01\ +\x19\xff\xc3\x01:\x01\x1d\xff\xae\x01:\x01!\xff\xae\x01\ +:\x01+\xff\xc3\x01:\x01-\xff\xc3\x01:\x01/\xff\ +\xc3\x01:\x011\xff\xc3\x01:\x013\xff\xc3\x01:\x01\ +5\xff\xc3\x01:\x01<\xff\xd7\x01:\x01>\xff\xd7\x01\ +:\x01@\xff\xd7\x01:\x01C\xff\x85\x01:\x01D\xff\ +\x9a\x01:\x01F\xff\x9a\x01:\x01G\xff\xd7\x01:\x01\ +H\xff\x9a\x01:\x01J\xff\xae\x01:\x02\x08\xff\x85\x01\ +:\x02\x0c\xff\x85\x01:\x02W\xff\xc3\x01:\x02X\xff\ +\x85\x01:\x02Y\xff\x9a\x01:\x02_\xff\xd7\x01:\x02\ +`\xff\x9a\x01:\x02b\xff\xc3\x01:\x03\x1d\xff\x85\x01\ +:\x03\x1e\xff\x9a\x01:\x03\x1f\xff\x85\x01:\x03 \xff\ +\x9a\x01:\x03!\xff\x85\x01:\x03\x22\xff\x9a\x01:\x03\ +#\xff\x85\x01:\x03%\xff\x85\x01:\x03&\xff\x9a\x01\ +:\x03'\xff\x85\x01:\x03(\xff\x9a\x01:\x03)\xff\ +\x85\x01:\x03*\xff\x9a\x01:\x03+\xff\x85\x01:\x03\ +,\xff\x9a\x01:\x03-\xff\x85\x01:\x03.\xff\x9a\x01\ +:\x03/\xff\x85\x01:\x030\xff\x9a\x01:\x031\xff\ +\x85\x01:\x032\xff\x9a\x01:\x033\xff\x85\x01:\x03\ +4\xff\x9a\x01:\x036\xff\x9a\x01:\x038\xff\x9a\x01\ +:\x03:\xff\x9a\x01:\x03<\xff\x9a\x01:\x03@\xff\ +\x9a\x01:\x03B\xff\x9a\x01:\x03D\xff\x9a\x01:\x03\ +I\xff\xd7\x01:\x03J\xff\x9a\x01:\x03K\xff\xd7\x01\ +:\x03L\xff\x9a\x01:\x03M\xff\xd7\x01:\x03N\xff\ +\x9a\x01:\x03O\xff\xd7\x01:\x03Q\xff\xd7\x01:\x03\ +R\xff\x9a\x01:\x03S\xff\xd7\x01:\x03T\xff\x9a\x01\ +:\x03U\xff\xd7\x01:\x03V\xff\x9a\x01:\x03W\xff\ +\xd7\x01:\x03X\xff\x9a\x01:\x03Y\xff\xd7\x01:\x03\ +Z\xff\x9a\x01:\x03[\xff\xd7\x01:\x03\x5c\xff\x9a\x01\ +:\x03]\xff\xd7\x01:\x03^\xff\x9a\x01:\x03_\xff\ +\xd7\x01:\x03`\xff\x9a\x01:\x03b\xff\xc3\x01:\x03\ +d\xff\xc3\x01:\x03f\xff\xc3\x01:\x03h\xff\xc3\x01\ +:\x03j\xff\xc3\x01:\x03l\xff\xc3\x01:\x03n\xff\ +\xc3\x01;\x00&\xff\xec\x01;\x00*\xff\xec\x01;\x00\ +2\xff\xec\x01;\x004\xff\xec\x01;\x00\x89\xff\xec\x01\ +;\x00\x94\xff\xec\x01;\x00\x95\xff\xec\x01;\x00\x96\xff\ +\xec\x01;\x00\x97\xff\xec\x01;\x00\x98\xff\xec\x01;\x00\ +\x9a\xff\xec\x01;\x00\xc8\xff\xec\x01;\x00\xca\xff\xec\x01\ +;\x00\xcc\xff\xec\x01;\x00\xce\xff\xec\x01;\x00\xde\xff\ +\xec\x01;\x00\xe0\xff\xec\x01;\x00\xe2\xff\xec\x01;\x00\ +\xe4\xff\xec\x01;\x01\x0e\xff\xec\x01;\x01\x10\xff\xec\x01\ +;\x01\x12\xff\xec\x01;\x01\x14\xff\xec\x01;\x01G\xff\ +\xec\x01;\x02_\xff\xec\x01;\x03I\xff\xec\x01;\x03\ +K\xff\xec\x01;\x03M\xff\xec\x01;\x03O\xff\xec\x01\ +;\x03Q\xff\xec\x01;\x03S\xff\xec\x01;\x03U\xff\ +\xec\x01;\x03W\xff\xec\x01;\x03Y\xff\xec\x01;\x03\ +[\xff\xec\x01;\x03]\xff\xec\x01;\x03_\xff\xec\x01\ +=\x00&\xff\xec\x01=\x00*\xff\xec\x01=\x002\xff\ +\xec\x01=\x004\xff\xec\x01=\x00\x89\xff\xec\x01=\x00\ +\x94\xff\xec\x01=\x00\x95\xff\xec\x01=\x00\x96\xff\xec\x01\ +=\x00\x97\xff\xec\x01=\x00\x98\xff\xec\x01=\x00\x9a\xff\ +\xec\x01=\x00\xc8\xff\xec\x01=\x00\xca\xff\xec\x01=\x00\ +\xcc\xff\xec\x01=\x00\xce\xff\xec\x01=\x00\xde\xff\xec\x01\ +=\x00\xe0\xff\xec\x01=\x00\xe2\xff\xec\x01=\x00\xe4\xff\ +\xec\x01=\x01\x0e\xff\xec\x01=\x01\x10\xff\xec\x01=\x01\ +\x12\xff\xec\x01=\x01\x14\xff\xec\x01=\x01G\xff\xec\x01\ +=\x02_\xff\xec\x01=\x03I\xff\xec\x01=\x03K\xff\ +\xec\x01=\x03M\xff\xec\x01=\x03O\xff\xec\x01=\x03\ +Q\xff\xec\x01=\x03S\xff\xec\x01=\x03U\xff\xec\x01\ +=\x03W\xff\xec\x01=\x03Y\xff\xec\x01=\x03[\xff\ +\xec\x01=\x03]\xff\xec\x01=\x03_\xff\xec\x01?\x00\ +&\xff\xec\x01?\x00*\xff\xec\x01?\x002\xff\xec\x01\ +?\x004\xff\xec\x01?\x00\x89\xff\xec\x01?\x00\x94\xff\ +\xec\x01?\x00\x95\xff\xec\x01?\x00\x96\xff\xec\x01?\x00\ +\x97\xff\xec\x01?\x00\x98\xff\xec\x01?\x00\x9a\xff\xec\x01\ +?\x00\xc8\xff\xec\x01?\x00\xca\xff\xec\x01?\x00\xcc\xff\ +\xec\x01?\x00\xce\xff\xec\x01?\x00\xde\xff\xec\x01?\x00\ +\xe0\xff\xec\x01?\x00\xe2\xff\xec\x01?\x00\xe4\xff\xec\x01\ +?\x01\x0e\xff\xec\x01?\x01\x10\xff\xec\x01?\x01\x12\xff\ +\xec\x01?\x01\x14\xff\xec\x01?\x01G\xff\xec\x01?\x02\ +_\xff\xec\x01?\x03I\xff\xec\x01?\x03K\xff\xec\x01\ +?\x03M\xff\xec\x01?\x03O\xff\xec\x01?\x03Q\xff\ +\xec\x01?\x03S\xff\xec\x01?\x03U\xff\xec\x01?\x03\ +W\xff\xec\x01?\x03Y\xff\xec\x01?\x03[\xff\xec\x01\ +?\x03]\xff\xec\x01?\x03_\xff\xec\x01C\x00\x05\xff\ +q\x01C\x00\x0a\xffq\x01C\x00&\xff\xd7\x01C\x00\ +*\xff\xd7\x01C\x00-\x01\x0a\x01C\x002\xff\xd7\x01\ +C\x004\xff\xd7\x01C\x007\xffq\x01C\x009\xff\ +\xae\x01C\x00:\xff\xae\x01C\x00<\xff\x85\x01C\x00\ +\x89\xff\xd7\x01C\x00\x94\xff\xd7\x01C\x00\x95\xff\xd7\x01\ +C\x00\x96\xff\xd7\x01C\x00\x97\xff\xd7\x01C\x00\x98\xff\ +\xd7\x01C\x00\x9a\xff\xd7\x01C\x00\x9f\xff\x85\x01C\x00\ +\xc8\xff\xd7\x01C\x00\xca\xff\xd7\x01C\x00\xcc\xff\xd7\x01\ +C\x00\xce\xff\xd7\x01C\x00\xde\xff\xd7\x01C\x00\xe0\xff\ +\xd7\x01C\x00\xe2\xff\xd7\x01C\x00\xe4\xff\xd7\x01C\x01\ +\x0e\xff\xd7\x01C\x01\x10\xff\xd7\x01C\x01\x12\xff\xd7\x01\ +C\x01\x14\xff\xd7\x01C\x01$\xffq\x01C\x01&\xff\ +q\x01C\x016\xff\xae\x01C\x018\xff\x85\x01C\x01\ +:\xff\x85\x01C\x01G\xff\xd7\x01C\x01\xfa\xff\xae\x01\ +C\x01\xfc\xff\xae\x01C\x01\xfe\xff\xae\x01C\x02\x00\xff\ +\x85\x01C\x02\x07\xffq\x01C\x02\x0b\xffq\x01C\x02\ +_\xff\xd7\x01C\x03I\xff\xd7\x01C\x03K\xff\xd7\x01\ +C\x03M\xff\xd7\x01C\x03O\xff\xd7\x01C\x03Q\xff\ +\xd7\x01C\x03S\xff\xd7\x01C\x03U\xff\xd7\x01C\x03\ +W\xff\xd7\x01C\x03Y\xff\xd7\x01C\x03[\xff\xd7\x01\ +C\x03]\xff\xd7\x01C\x03_\xff\xd7\x01C\x03o\xff\ +\x85\x01C\x03q\xff\x85\x01C\x03s\xff\x85\x01C\x03\ +\x8f\xffq\x01D\x00\x05\xff\xec\x01D\x00\x0a\xff\xec\x01\ +D\x02\x07\xff\xec\x01D\x02\x0b\xff\xec\x01E\x00-\x00\ +{\x01G\x00\x0f\xff\xae\x01G\x00\x11\xff\xae\x01G\x00\ +$\xff\xd7\x01G\x007\xff\xc3\x01G\x009\xff\xec\x01\ +G\x00:\xff\xec\x01G\x00;\xff\xd7\x01G\x00<\xff\ +\xec\x01G\x00=\xff\xec\x01G\x00\x82\xff\xd7\x01G\x00\ +\x83\xff\xd7\x01G\x00\x84\xff\xd7\x01G\x00\x85\xff\xd7\x01\ +G\x00\x86\xff\xd7\x01G\x00\x87\xff\xd7\x01G\x00\x9f\xff\ +\xec\x01G\x00\xc2\xff\xd7\x01G\x00\xc4\xff\xd7\x01G\x00\ +\xc6\xff\xd7\x01G\x01$\xff\xc3\x01G\x01&\xff\xc3\x01\ +G\x016\xff\xec\x01G\x018\xff\xec\x01G\x01:\xff\ +\xec\x01G\x01;\xff\xec\x01G\x01=\xff\xec\x01G\x01\ +?\xff\xec\x01G\x01C\xff\xd7\x01G\x01\xa0\xff\xec\x01\ +G\x01\xfa\xff\xec\x01G\x01\xfc\xff\xec\x01G\x01\xfe\xff\ +\xec\x01G\x02\x00\xff\xec\x01G\x02\x08\xff\xae\x01G\x02\ +\x0c\xff\xae\x01G\x02X\xff\xd7\x01G\x03\x1d\xff\xd7\x01\ +G\x03\x1f\xff\xd7\x01G\x03!\xff\xd7\x01G\x03#\xff\ +\xd7\x01G\x03%\xff\xd7\x01G\x03'\xff\xd7\x01G\x03\ +)\xff\xd7\x01G\x03+\xff\xd7\x01G\x03-\xff\xd7\x01\ +G\x03/\xff\xd7\x01G\x031\xff\xd7\x01G\x033\xff\ +\xd7\x01G\x03o\xff\xec\x01G\x03q\xff\xec\x01G\x03\ +s\xff\xec\x01G\x03\x8f\xff\xc3\x01V\x00\x05\xffq\x01\ +V\x00\x0a\xffq\x01V\x01f\xff\xd7\x01V\x01m\xff\ +\xd7\x01V\x01q\xffq\x01V\x01r\xff\x85\x01V\x01\ +s\xff\xd7\x01V\x01u\xff\xae\x01V\x01x\xff\x85\x01\ +V\x02\x07\xffq\x01V\x02\x0b\xffq\x01V\x02T\xff\ +\x85\x01[\x00\x0f\xff\xae\x01[\x00\x11\xff\xae\x01[\x01\ +V\xff\xd7\x01[\x01_\xff\xd7\x01[\x01b\xff\xd7\x01\ +[\x01d\xff\xec\x01[\x01i\xff\xd7\x01[\x01p\xff\ +\xec\x01[\x01q\xff\xc3\x01[\x01r\xff\xec\x01[\x01\ +t\xff\xd7\x01[\x01u\xff\xec\x01[\x01x\xff\xec\x01\ +[\x01\x88\xff\xec\x01[\x02\x08\xff\xae\x01[\x02\x0c\xff\ +\xae\x01[\x02T\xff\xec\x01\x5c\x00\x0f\xff\x85\x01\x5c\x00\ +\x11\xff\x85\x01\x5c\x01V\xff\x85\x01\x5c\x01_\xff\x85\x01\ +\x5c\x01b\xff\x85\x01\x5c\x01f\xff\xd7\x01\x5c\x01i\xff\ +\x85\x01\x5c\x01m\xff\xd7\x01\x5c\x01s\xff\xc3\x01\x5c\x01\ +v\xff\xec\x01\x5c\x01y\xff\x9a\x01\x5c\x01z\xff\xae\x01\ +\x5c\x01{\xff\xc3\x01\x5c\x01|\xff\xc3\x01\x5c\x01}\xff\ +\xc3\x01\x5c\x01~\xff\x9a\x01\x5c\x01\x81\xff\xc3\x01\x5c\x01\ +\x82\xff\xae\x01\x5c\x01\x84\xff\xc3\x01\x5c\x01\x86\xff\xc3\x01\ +\x5c\x01\x87\xff\xc3\x01\x5c\x01\x89\xff\xc3\x01\x5c\x01\x8c\xff\ +\x9a\x01\x5c\x01\x8e\xff\x9a\x01\x5c\x01\x8f\xff\x9a\x01\x5c\x01\ +\x90\xff\x9a\x01\x5c\x01\x92\xff\xc3\x01\x5c\x01\x93\xff\x9a\x01\ +\x5c\x01\x95\xff\xc3\x01\x5c\x01\x96\xff\xc3\x01\x5c\x01\x98\xff\ +\xc3\x01\x5c\x01\x99\xff\x9a\x01\x5c\x01\x9a\xff\xc3\x01\x5c\x01\ +\x9b\xff\xc3\x01\x5c\x02\x08\xff\x85\x01\x5c\x02\x0c\xff\x85\x01\ +\x5c\x02!\xff\xec\x01]\x01q\xff\xd7\x01]\x01r\xff\ +\xec\x01]\x01x\xff\xec\x01]\x02T\xff\xec\x01^\x00\ +\x05\xff\xd7\x01^\x00\x0a\xff\xd7\x01^\x02\x07\xff\xd7\x01\ +^\x02\x0b\xff\xd7\x01_\x00\x05\xffq\x01_\x00\x0a\xff\ +q\x01_\x01f\xff\xd7\x01_\x01m\xff\xd7\x01_\x01\ +q\xffq\x01_\x01r\xff\x85\x01_\x01s\xff\xd7\x01\ +_\x01u\xff\xae\x01_\x01x\xff\x85\x01_\x02\x07\xff\ +q\x01_\x02\x0b\xffq\x01_\x02T\xff\x85\x01`\x00\ +\x0f\xff\xae\x01`\x00\x11\xff\xae\x01`\x01V\xff\xd7\x01\ +`\x01_\xff\xd7\x01`\x01b\xff\xd7\x01`\x01i\xff\ +\xd7\x01`\x01t\xff\xd7\x01`\x02\x08\xff\xae\x01`\x02\ +\x0c\xff\xae\x01a\x00\x0f\xff\x85\x01a\x00\x10\xff\xae\x01\ +a\x00\x11\xff\x85\x01a\x01V\xff\x5c\x01a\x01_\xff\ +\x5c\x01a\x01b\xff\x5c\x01a\x01f\xff\xc3\x01a\x01\ +i\xff\x5c\x01a\x01m\xff\xc3\x01a\x01s\xff\x9a\x01\ +a\x01v\xff\xc3\x01a\x01y\xffq\x01a\x01z\xff\ +\x9a\x01a\x01{\xff\x9a\x01a\x01|\xff\xae\x01a\x01\ +}\xff\x9a\x01a\x01~\xffq\x01a\x01\x80\xff\xd7\x01\ +a\x01\x81\xff\xc3\x01a\x01\x82\xff\x9a\x01a\x01\x84\xff\ +\x9a\x01a\x01\x86\xff\xae\x01a\x01\x87\xff\x9a\x01a\x01\ +\x89\xff\x9a\x01a\x01\x8a\xff\xd7\x01a\x01\x8c\xffq\x01\ +a\x01\x8e\xff\x9a\x01a\x01\x8f\xffq\x01a\x01\x90\xff\ +q\x01a\x01\x92\xff\x9a\x01a\x01\x93\xffq\x01a\x01\ +\x94\xff\xd7\x01a\x01\x95\xff\x9a\x01a\x01\x96\xff\x9a\x01\ +a\x01\x98\xff\x9a\x01a\x01\x99\xffq\x01a\x01\x9a\xff\ +\x9a\x01a\x01\x9b\xff\x9a\x01a\x02\x02\xff\xae\x01a\x02\ +\x03\xff\xae\x01a\x02\x04\xff\xae\x01a\x02\x08\xff\x85\x01\ +a\x02\x0c\xff\x85\x01a\x02!\xff\xc3\x01a\x02S\xff\ +\xd7\x01b\x00\x05\xffq\x01b\x00\x0a\xffq\x01b\x01\ +f\xff\xd7\x01b\x01m\xff\xd7\x01b\x01q\xffq\x01\ +b\x01r\xff\x85\x01b\x01s\xff\xd7\x01b\x01u\xff\ +\xae\x01b\x01x\xff\x85\x01b\x02\x07\xffq\x01b\x02\ +\x0b\xffq\x01b\x02T\xff\x85\x01d\x01f\xff\xec\x01\ +d\x01m\xff\xec\x01d\x01s\xff\xc3\x01f\x00\x0f\xff\ +\xae\x01f\x00\x11\xff\xae\x01f\x01V\xff\xd7\x01f\x01\ +_\xff\xd7\x01f\x01b\xff\xd7\x01f\x01d\xff\xec\x01\ +f\x01i\xff\xd7\x01f\x01p\xff\xec\x01f\x01q\xff\ +\xc3\x01f\x01r\xff\xec\x01f\x01t\xff\xd7\x01f\x01\ +u\xff\xec\x01f\x01x\xff\xec\x01f\x01\x88\xff\xec\x01\ +f\x02\x08\xff\xae\x01f\x02\x0c\xff\xae\x01f\x02T\xff\ +\xec\x01h\x01f\xff\xd7\x01h\x01m\xff\xd7\x01h\x01\ +s\xff\xc3\x01h\x01\x8d\xff\xec\x01h\x01\x91\xff\xec\x01\ +i\x00\x05\xffq\x01i\x00\x0a\xffq\x01i\x01f\xff\ +\xd7\x01i\x01m\xff\xd7\x01i\x01q\xffq\x01i\x01\ +r\xff\x85\x01i\x01s\xff\xd7\x01i\x01u\xff\xae\x01\ +i\x01x\xff\x85\x01i\x02\x07\xffq\x01i\x02\x0b\xff\ +q\x01i\x02T\xff\x85\x01m\x00\x0f\xff\xae\x01m\x00\ +\x11\xff\xae\x01m\x01V\xff\xd7\x01m\x01_\xff\xd7\x01\ +m\x01b\xff\xd7\x01m\x01d\xff\xec\x01m\x01i\xff\ +\xd7\x01m\x01p\xff\xec\x01m\x01q\xff\xc3\x01m\x01\ +r\xff\xec\x01m\x01t\xff\xd7\x01m\x01u\xff\xec\x01\ +m\x01x\xff\xec\x01m\x01\x88\xff\xec\x01m\x02\x08\xff\ +\xae\x01m\x02\x0c\xff\xae\x01m\x02T\xff\xec\x01o\x00\ +\x0f\xfe\xf6\x01o\x00\x11\xfe\xf6\x01o\x01V\xff\x9a\x01\ +o\x01_\xff\x9a\x01o\x01b\xff\x9a\x01o\x01d\xff\ +\xec\x01o\x01i\xff\x9a\x01o\x01t\xff\xd7\x01o\x01\ +\x88\xff\xd7\x01o\x02\x08\xfe\xf6\x01o\x02\x0c\xfe\xf6\x01\ +q\x00\x0f\xff\x85\x01q\x00\x10\xff\xae\x01q\x00\x11\xff\ +\x85\x01q\x01V\xff\x5c\x01q\x01_\xff\x5c\x01q\x01\ +b\xff\x5c\x01q\x01f\xff\xc3\x01q\x01i\xff\x5c\x01\ +q\x01m\xff\xc3\x01q\x01s\xff\x9a\x01q\x01v\xff\ +\xc3\x01q\x01y\xffq\x01q\x01z\xff\x9a\x01q\x01\ +{\xff\x9a\x01q\x01|\xff\xae\x01q\x01}\xff\x9a\x01\ +q\x01~\xffq\x01q\x01\x80\xff\xd7\x01q\x01\x81\xff\ +\xc3\x01q\x01\x82\xff\x9a\x01q\x01\x84\xff\x9a\x01q\x01\ +\x86\xff\xae\x01q\x01\x87\xff\x9a\x01q\x01\x89\xff\x9a\x01\ +q\x01\x8a\xff\xd7\x01q\x01\x8c\xffq\x01q\x01\x8e\xff\ +\x9a\x01q\x01\x8f\xffq\x01q\x01\x90\xffq\x01q\x01\ +\x92\xff\x9a\x01q\x01\x93\xffq\x01q\x01\x94\xff\xd7\x01\ +q\x01\x95\xff\x9a\x01q\x01\x96\xff\x9a\x01q\x01\x98\xff\ +\x9a\x01q\x01\x99\xffq\x01q\x01\x9a\xff\x9a\x01q\x01\ +\x9b\xff\x9a\x01q\x02\x02\xff\xae\x01q\x02\x03\xff\xae\x01\ +q\x02\x04\xff\xae\x01q\x02\x08\xff\x85\x01q\x02\x0c\xff\ +\x85\x01q\x02!\xff\xc3\x01q\x02S\xff\xd7\x01r\x00\ +\x0f\xff\x85\x01r\x00\x11\xff\x85\x01r\x01V\xff\x85\x01\ +r\x01_\xff\x85\x01r\x01b\xff\x85\x01r\x01f\xff\ +\xd7\x01r\x01i\xff\x85\x01r\x01m\xff\xd7\x01r\x01\ +s\xff\xc3\x01r\x01v\xff\xec\x01r\x01y\xff\x9a\x01\ +r\x01z\xff\xae\x01r\x01{\xff\xc3\x01r\x01|\xff\ +\xc3\x01r\x01}\xff\xc3\x01r\x01~\xff\x9a\x01r\x01\ +\x81\xff\xc3\x01r\x01\x82\xff\xae\x01r\x01\x84\xff\xc3\x01\ +r\x01\x86\xff\xc3\x01r\x01\x87\xff\xc3\x01r\x01\x89\xff\ +\xc3\x01r\x01\x8c\xff\x9a\x01r\x01\x8e\xff\x9a\x01r\x01\ +\x8f\xff\x9a\x01r\x01\x90\xff\x9a\x01r\x01\x92\xff\xc3\x01\ +r\x01\x93\xff\x9a\x01r\x01\x95\xff\xc3\x01r\x01\x96\xff\ +\xc3\x01r\x01\x98\xff\xc3\x01r\x01\x99\xff\x9a\x01r\x01\ +\x9a\xff\xc3\x01r\x01\x9b\xff\xc3\x01r\x02\x08\xff\x85\x01\ +r\x02\x0c\xff\x85\x01r\x02!\xff\xec\x01s\x00\x0f\xff\ +\x9a\x01s\x00\x11\xff\x9a\x01s\x01V\xff\xd7\x01s\x01\ +_\xff\xd7\x01s\x01b\xff\xd7\x01s\x01d\xff\xc3\x01\ +s\x01i\xff\xd7\x01s\x01p\xff\xec\x01s\x01q\xff\ +\xae\x01s\x01r\xff\xc3\x01s\x01t\xff\xec\x01s\x01\ +x\xff\xc3\x01s\x01\x88\xff\xec\x01s\x02\x08\xff\x9a\x01\ +s\x02\x0c\xff\x9a\x01s\x02T\xff\xc3\x01t\x01f\xff\ +\xd7\x01t\x01m\xff\xd7\x01t\x01s\xff\xc3\x01t\x01\ +\x8d\xff\xec\x01t\x01\x91\xff\xec\x01u\x00\x0f\xff\x85\x01\ +u\x00\x11\xff\x85\x01u\x01V\xff\xae\x01u\x01_\xff\ +\xae\x01u\x01b\xff\xae\x01u\x01f\xff\xec\x01u\x01\ +i\xff\xae\x01u\x01m\xff\xec\x01u\x02\x08\xff\x85\x01\ +u\x02\x0c\xff\x85\x01v\x01q\xff\xd7\x01v\x01r\xff\ +\xec\x01v\x01x\xff\xec\x01v\x02T\xff\xec\x01x\x00\ +\x0f\xff\x85\x01x\x00\x11\xff\x85\x01x\x01V\xff\x85\x01\ +x\x01_\xff\x85\x01x\x01b\xff\x85\x01x\x01f\xff\ +\xd7\x01x\x01i\xff\x85\x01x\x01m\xff\xd7\x01x\x01\ +s\xff\xc3\x01x\x01v\xff\xec\x01x\x01y\xff\x9a\x01\ +x\x01z\xff\xae\x01x\x01{\xff\xc3\x01x\x01|\xff\ +\xc3\x01x\x01}\xff\xc3\x01x\x01~\xff\x9a\x01x\x01\ +\x81\xff\xc3\x01x\x01\x82\xff\xae\x01x\x01\x84\xff\xc3\x01\ +x\x01\x86\xff\xc3\x01x\x01\x87\xff\xc3\x01x\x01\x89\xff\ +\xc3\x01x\x01\x8c\xff\x9a\x01x\x01\x8e\xff\x9a\x01x\x01\ +\x8f\xff\x9a\x01x\x01\x90\xff\x9a\x01x\x01\x92\xff\xc3\x01\ +x\x01\x93\xff\x9a\x01x\x01\x95\xff\xc3\x01x\x01\x96\xff\ +\xc3\x01x\x01\x98\xff\xc3\x01x\x01\x99\xff\x9a\x01x\x01\ +\x9a\xff\xc3\x01x\x01\x9b\xff\xc3\x01x\x02\x08\xff\x85\x01\ +x\x02\x0c\xff\x85\x01x\x02!\xff\xec\x01y\x01\x88\x00\ +)\x01{\x00\x05\xff\xec\x01{\x00\x0a\xff\xec\x01{\x02\ +\x07\xff\xec\x01{\x02\x0b\xff\xec\x01|\x00\x05\xff\xae\x01\ +|\x00\x0a\xff\xae\x01|\x01\x8d\xff\xec\x01|\x01\x91\xff\ +\xec\x01|\x02\x07\xff\xae\x01|\x02\x0b\xff\xae\x01~\x01\ +\x88\x00)\x01\x80\x00\x0f\xff\xae\x01\x80\x00\x11\xff\xae\x01\ +\x80\x01\x88\xff\xec\x01\x80\x02\x08\xff\xae\x01\x80\x02\x0c\xff\ +\xae\x01\x83\x00\x10\xff\x9a\x01\x83\x01y\xff\xd7\x01\x83\x01\ +~\xff\xd7\x01\x83\x01\x81\xff\xd7\x01\x83\x01\x8c\xff\xd7\x01\ +\x83\x01\x8d\xff\xd7\x01\x83\x01\x8f\xff\xd7\x01\x83\x01\x90\xff\ +\xd7\x01\x83\x01\x91\xff\xd7\x01\x83\x01\x93\xff\xd7\x01\x83\x01\ +\x99\xff\xd7\x01\x83\x02\x02\xff\x9a\x01\x83\x02\x03\xff\x9a\x01\ +\x83\x02\x04\xff\x9a\x01\x84\x00\x05\xff\xec\x01\x84\x00\x0a\xff\ +\xec\x01\x84\x02\x07\xff\xec\x01\x84\x02\x0b\xff\xec\x01\x85\x00\ +\x0f\xff\xd7\x01\x85\x00\x11\xff\xd7\x01\x85\x02\x08\xff\xd7\x01\ +\x85\x02\x0c\xff\xd7\x01\x86\x00\x05\xff\xae\x01\x86\x00\x0a\xff\ +\xae\x01\x86\x01\x8d\xff\xec\x01\x86\x01\x91\xff\xec\x01\x86\x02\ +\x07\xff\xae\x01\x86\x02\x0b\xff\xae\x01\x87\x01y\xff\xd7\x01\ +\x87\x01~\xff\xd7\x01\x87\x01\x8c\xff\xd7\x01\x87\x01\x8f\xff\ +\xd7\x01\x87\x01\x90\xff\xd7\x01\x87\x01\x93\xff\xd7\x01\x87\x01\ +\x99\xff\xd7\x01\x88\x00\x05\xff\x85\x01\x88\x00\x0a\xff\x85\x01\ +\x88\x01y\xff\xec\x01\x88\x01~\xff\xec\x01\x88\x01\x80\xff\ +\xd7\x01\x88\x01\x8a\xff\xd7\x01\x88\x01\x8c\xff\xec\x01\x88\x01\ +\x8d\xff\xd7\x01\x88\x01\x8f\xff\xec\x01\x88\x01\x90\xff\xec\x01\ +\x88\x01\x91\xff\xd7\x01\x88\x01\x93\xff\xec\x01\x88\x01\x99\xff\ +\xec\x01\x88\x02\x07\xff\x85\x01\x88\x02\x0b\xff\x85\x01\x8a\x00\ +\x0f\xff\xae\x01\x8a\x00\x11\xff\xae\x01\x8a\x01\x88\xff\xec\x01\ +\x8a\x02\x08\xff\xae\x01\x8a\x02\x0c\xff\xae\x01\x8c\x00\x05\xff\ +\xec\x01\x8c\x00\x0a\xff\xec\x01\x8c\x01\x80\xff\xd7\x01\x8c\x01\ +\x8a\xff\xd7\x01\x8c\x02\x07\xff\xec\x01\x8c\x02\x0b\xff\xec\x01\ +\x8e\x00\x05\xff\xec\x01\x8e\x00\x0a\xff\xec\x01\x8e\x01\x80\xff\ +\xd7\x01\x8e\x01\x8a\xff\xd7\x01\x8e\x02\x07\xff\xec\x01\x8e\x02\ +\x0b\xff\xec\x01\x90\x00\x0f\xff\xec\x01\x90\x00\x11\xff\xec\x01\ +\x90\x02\x08\xff\xec\x01\x90\x02\x0c\xff\xec\x01\x93\x00\x05\xff\ +\xec\x01\x93\x00\x0a\xff\xec\x01\x93\x01\x80\xff\xd7\x01\x93\x01\ +\x8a\xff\xd7\x01\x93\x02\x07\xff\xec\x01\x93\x02\x0b\xff\xec\x01\ +\x94\x00\x0f\xff\xc3\x01\x94\x00\x10\xff\xd7\x01\x94\x00\x11\xff\ +\xc3\x01\x94\x01y\xff\xd7\x01\x94\x01~\xff\xd7\x01\x94\x01\ +\x81\xff\xd7\x01\x94\x01\x8c\xff\xd7\x01\x94\x01\x8f\xff\xd7\x01\ +\x94\x01\x90\xff\xd7\x01\x94\x01\x93\xff\xd7\x01\x94\x01\x99\xff\ +\xd7\x01\x94\x02\x02\xff\xd7\x01\x94\x02\x03\xff\xd7\x01\x94\x02\ +\x04\xff\xd7\x01\x94\x02\x08\xff\xc3\x01\x94\x02\x0c\xff\xc3\x01\ +\x97\x00\x05\xff\xd7\x01\x97\x00\x0a\xff\xd7\x01\x97\x02\x07\xff\ +\xd7\x01\x97\x02\x0b\xff\xd7\x01\x99\x00\x05\xff\xec\x01\x99\x00\ +\x0a\xff\xec\x01\x99\x01\x80\xff\xd7\x01\x99\x01\x8a\xff\xd7\x01\ +\x99\x02\x07\xff\xec\x01\x99\x02\x0b\xff\xec\x01\x9d\x00\x05\xff\ +\xae\x01\x9d\x00\x0a\xff\xae\x01\x9d\x01\x9d\xff\x85\x01\x9d\x01\ +\xa6\xff\x85\x01\x9d\x01\xa8\xff\xd7\x01\x9d\x01\xbc\xff\x9a\x01\ +\x9d\x01\xbd\xff\xd7\x01\x9d\x01\xc1\xff\x9a\x01\x9d\x01\xc4\xff\ +\x85\x01\x9d\x01\xdc\xff\xd7\x01\x9d\x01\xdd\xff\xd7\x01\x9d\x01\ +\xe1\xff\xd7\x01\x9d\x01\xe4\xff\xd7\x01\x9d\x01\xf6\xff\xd7\x01\ +\x9d\x02\x07\xff\xae\x01\x9d\x02\x0b\xff\xae\x01\x9d\x02n\xff\ +\xae\x01\x9d\x02|\xff\x9a\x01\x9d\x02\x80\xff\xae\x01\x9d\x02\ +\x82\xff\xae\x01\x9d\x02\x97\xff\xae\x01\x9d\x02\x9b\xff\xae\x01\ +\x9d\x02\xa7\xff\xae\x01\x9d\x02\xa9\xff\x85\x01\x9d\x02\xaa\xff\ +\xd7\x01\x9d\x02\xb5\xff\x9a\x01\x9d\x02\xb6\xff\xd7\x01\x9d\x02\ +\xb7\xff\x9a\x01\x9d\x02\xb8\xff\xd7\x01\x9d\x02\xb9\xff\x9a\x01\ +\x9d\x02\xba\xff\xd7\x01\x9d\x02\xbd\xff\x85\x01\x9d\x02\xbe\xff\ +\xd7\x01\x9d\x02\xbf\xff\x9a\x01\x9d\x02\xc0\xff\xd7\x01\x9d\x02\ +\xc1\xff\x9a\x01\x9d\x02\xc2\xff\xd7\x01\x9d\x02\xd4\xff\x9a\x01\ +\x9d\x02\xd5\xff\xd7\x01\x9d\x02\xf7\xff\xd7\x01\x9d\x02\xf8\xff\ +\xd7\x01\x9d\x02\xf9\xff\xd7\x01\x9d\x02\xfa\xff\xd7\x01\x9d\x02\ +\xfb\xff\xd7\x01\x9d\x02\xfc\xff\xd7\x01\x9d\x02\xfd\xff\x9a\x01\ +\x9d\x02\xfe\xff\xd7\x01\x9d\x03\x03\xff\xae\x01\x9d\x03\x0d\xff\ +\x9a\x01\x9d\x03\x0e\xff\xc3\x01\x9d\x03\x0f\xff\x9a\x01\x9d\x03\ +\x10\xff\xc3\x01\x9d\x03\x17\xff\x85\x01\x9d\x03\x18\xff\xd7\x01\ +\x9e\x00\x0f\xff\x85\x01\x9e\x00\x10\xff\xae\x01\x9e\x00\x11\xff\ +\x85\x01\x9e\x01\x9f\xff\xd7\x01\x9e\x01\xa4\xff\x9a\x01\x9e\x01\ +\xaa\xffq\x01\x9e\x01\xae\xff\x9a\x01\x9e\x01\xb5\xff\x9a\x01\ +\x9e\x01\xb8\xff\xd7\x01\x9e\x01\xbb\xff\xd7\x01\x9e\x01\xbc\x00\ +)\x01\x9e\x01\xbe\xff\xae\x01\x9e\x01\xcc\xff\x9a\x01\x9e\x01\ +\xcd\xff\x9a\x01\x9e\x01\xce\xff\x85\x01\x9e\x01\xcf\xffq\x01\ +\x9e\x01\xd0\xff\xd7\x01\x9e\x01\xd1\xff\xd7\x01\x9e\x01\xd2\xff\ +\x9a\x01\x9e\x01\xd3\xff\x9a\x01\x9e\x01\xd4\xff\x9a\x01\x9e\x01\ +\xd5\xff\x85\x01\x9e\x01\xd6\xff\x9a\x01\x9e\x01\xd7\xff\x9a\x01\ +\x9e\x01\xd8\xffq\x01\x9e\x01\xd9\xff\x9a\x01\x9e\x01\xda\xff\ +\x9a\x01\x9e\x01\xdb\xffq\x01\x9e\x01\xdc\xff\xae\x01\x9e\x01\ +\xdd\xff\xae\x01\x9e\x01\xde\xffq\x01\x9e\x01\xdf\xff\xd7\x01\ +\x9e\x01\xe0\xff\x9a\x01\x9e\x01\xe1\xff\x9a\x01\x9e\x01\xe2\xff\ +\x9a\x01\x9e\x01\xe3\xff\x9a\x01\x9e\x01\xe4\xff\xae\x01\x9e\x01\ +\xe5\xff\x9a\x01\x9e\x01\xe6\xff\x9a\x01\x9e\x01\xe7\xff\xd7\x01\ +\x9e\x01\xe8\xff\x9a\x01\x9e\x01\xe9\xff\xc3\x01\x9e\x01\xea\xff\ +q\x01\x9e\x01\xec\xff\x9a\x01\x9e\x01\xed\xffq\x01\x9e\x01\ +\xee\xff\x85\x01\x9e\x01\xf2\xff\x85\x01\x9e\x01\xf3\xff\x9a\x01\ +\x9e\x01\xf5\xff\x9a\x01\x9e\x01\xf6\xff\xae\x01\x9e\x01\xf7\xff\ +\x9a\x01\x9e\x01\xf9\xff\x9a\x01\x9e\x02\x02\xff\xae\x01\x9e\x02\ +\x03\xff\xae\x01\x9e\x02\x04\xff\xae\x01\x9e\x02\x08\xff\x85\x01\ +\x9e\x02\x0c\xff\x85\x01\x9e\x02j\xffq\x01\x9e\x02k\xff\ +\x9a\x01\x9e\x02l\xff\xd7\x01\x9e\x02m\xff\xd7\x01\x9e\x02\ +q\xff\x9a\x01\x9e\x02r\xffq\x01\x9e\x02s\xff\x85\x01\ +\x9e\x02u\xff\x9a\x01\x9e\x02w\xff\x9a\x01\x9e\x02y\xff\ +\x9a\x01\x9e\x02}\xff\x9a\x01\x9e\x02~\xff\xd7\x01\x9e\x02\ +\x7f\xffq\x01\x9e\x02\x81\xff\xd7\x01\x9e\x02\x83\xff\xd7\x01\ +\x9e\x02\x84\xff\xd7\x01\x9e\x02\x85\xffq\x01\x9e\x02\x86\xff\ +\xd7\x01\x9e\x02\x87\xffq\x01\x9e\x02\x88\xff\xd7\x01\x9e\x02\ +\x89\xffq\x01\x9e\x02\x8a\xff\xd7\x01\x9e\x02\x8b\xff\xd7\x01\ +\x9e\x02\x8c\xff\xd7\x01\x9e\x02\x8d\xffq\x01\x9e\x02\x96\xff\ +\x9a\x01\x9e\x02\x9a\xff\x9a\x01\x9e\x02\x9e\xff\x9a\x01\x9e\x02\ +\xa0\xff\xd7\x01\x9e\x02\xa2\xff\xd7\x01\x9e\x02\xa4\xff\x9a\x01\ +\x9e\x02\xa6\xff\x9a\x01\x9e\x02\xaa\xff\xae\x01\x9e\x02\xac\xff\ +\x9a\x01\x9e\x02\xae\xff\x9a\x01\x9e\x02\xb0\xff\x9a\x01\x9e\x02\ +\xb1\xff\xd7\x01\x9e\x02\xb2\xffq\x01\x9e\x02\xb3\xff\xd7\x01\ +\x9e\x02\xb4\xffq\x01\x9e\x02\xb5\x00)\x01\x9e\x02\xb6\xff\ +\xae\x01\x9e\x02\xb8\xff\xae\x01\x9e\x02\xba\xff\xae\x01\x9e\x02\ +\xbc\xff\xd7\x01\x9e\x02\xbe\xff\xae\x01\x9e\x02\xc0\xff\x9a\x01\ +\x9e\x02\xc2\xff\x9a\x01\x9e\x02\xc4\xff\x9a\x01\x9e\x02\xc5\xff\ +\x9a\x01\x9e\x02\xc6\xffq\x01\x9e\x02\xc7\xff\x9a\x01\x9e\x02\ +\xc8\xffq\x01\x9e\x02\xcb\xff\xd7\x01\x9e\x02\xcd\xff\x9a\x01\ +\x9e\x02\xce\xff\x9a\x01\x9e\x02\xcf\xff\x85\x01\x9e\x02\xd1\xff\ +\x9a\x01\x9e\x02\xd3\xff\x9a\x01\x9e\x02\xd5\xff\x9a\x01\x9e\x02\ +\xd7\xff\x9a\x01\x9e\x02\xd9\xffq\x01\x9e\x02\xdb\xffq\x01\ +\x9e\x02\xdd\xffq\x01\x9e\x02\xe0\xffq\x01\x9e\x02\xe6\xff\ +\xd7\x01\x9e\x02\xe8\xff\xd7\x01\x9e\x02\xea\xff\xc3\x01\x9e\x02\ +\xec\xff\x9a\x01\x9e\x02\xee\xff\x9a\x01\x9e\x02\xef\xff\xd7\x01\ +\x9e\x02\xf0\xffq\x01\x9e\x02\xf1\xff\xd7\x01\x9e\x02\xf2\xff\ +q\x01\x9e\x02\xf3\xff\xd7\x01\x9e\x02\xf4\xffq\x01\x9e\x02\ +\xf6\xff\xd7\x01\x9e\x02\xf8\xff\xae\x01\x9e\x02\xfa\xff\xae\x01\ +\x9e\x02\xfc\xff\xae\x01\x9e\x02\xfe\xff\x9a\x01\x9e\x03\x00\xff\ +\x9a\x01\x9e\x03\x02\xff\x9a\x01\x9e\x03\x06\xff\xd7\x01\x9e\x03\ +\x08\xff\xd7\x01\x9e\x03\x09\xffq\x01\x9e\x03\x0a\xffq\x01\ +\x9e\x03\x0b\xffq\x01\x9e\x03\x0c\xffq\x01\x9e\x03\x0e\xff\ +\x9a\x01\x9e\x03\x10\xff\x9a\x01\x9e\x03\x11\xff\x9a\x01\x9e\x03\ +\x12\xff\x85\x01\x9e\x03\x14\xff\x9a\x01\x9e\x03\x15\xff\xd7\x01\ +\x9e\x03\x16\xffq\x01\x9e\x03\x18\xff\xae\x01\x9e\x03\x1a\xff\ +q\x01\x9e\x03\x1b\xff\x9a\x01\x9e\x03\x1c\xff\x85\x01\x9f\x01\ +\x9f\xff\xd7\x01\x9f\x01\xb8\xff\xd7\x01\x9f\x01\xbb\xff\xd7\x01\ +\x9f\x01\xbe\xff\xd7\x01\x9f\x01\xe1\xff\xd7\x01\x9f\x02l\xff\ +\xd7\x01\x9f\x02~\xff\xd7\x01\x9f\x02\x84\xff\xd7\x01\x9f\x02\ +\x86\xff\xd7\x01\x9f\x02\x88\xff\xd7\x01\x9f\x02\x8a\xff\xd7\x01\ +\x9f\x02\x8c\xff\xd7\x01\x9f\x02\xb1\xff\xd7\x01\x9f\x02\xb3\xff\ +\xd7\x01\x9f\x02\xc0\xff\xd7\x01\x9f\x02\xc2\xff\xd7\x01\x9f\x02\ +\xc5\xff\xd7\x01\x9f\x02\xc7\xff\xd7\x01\x9f\x02\xd5\xff\xd7\x01\ +\x9f\x02\xef\xff\xd7\x01\x9f\x02\xf1\xff\xd7\x01\x9f\x02\xf3\xff\ +\xd7\x01\x9f\x02\xfe\xff\xd7\x01\x9f\x03\x09\xff\xd7\x01\x9f\x03\ +\x0b\xff\xd7\x01\x9f\x03\x0e\xff\xd7\x01\x9f\x03\x10\xff\xd7\x01\ +\x9f\x03\x15\xff\xd7\x01\xa0\x03\x0e\xff\xd7\x01\xa0\x03\x10\xff\ +\xd7\x01\xa4\x00\x05\xff\xae\x01\xa4\x00\x0a\xff\xae\x01\xa4\x01\ +\x9d\xff\x85\x01\xa4\x01\xa6\xff\x85\x01\xa4\x01\xa8\xff\xd7\x01\ +\xa4\x01\xbc\xff\x9a\x01\xa4\x01\xbd\xff\xd7\x01\xa4\x01\xc1\xff\ +\x9a\x01\xa4\x01\xc4\xff\x85\x01\xa4\x01\xdc\xff\xd7\x01\xa4\x01\ +\xdd\xff\xd7\x01\xa4\x01\xe1\xff\xd7\x01\xa4\x01\xe4\xff\xd7\x01\ +\xa4\x01\xf6\xff\xd7\x01\xa4\x02\x07\xff\xae\x01\xa4\x02\x0b\xff\ +\xae\x01\xa4\x02n\xff\xae\x01\xa4\x02|\xff\x9a\x01\xa4\x02\ +\x80\xff\xae\x01\xa4\x02\x82\xff\xae\x01\xa4\x02\x97\xff\xae\x01\ +\xa4\x02\x9b\xff\xae\x01\xa4\x02\xa7\xff\xae\x01\xa4\x02\xa9\xff\ +\x85\x01\xa4\x02\xaa\xff\xd7\x01\xa4\x02\xb5\xff\x9a\x01\xa4\x02\ +\xb6\xff\xd7\x01\xa4\x02\xb7\xff\x9a\x01\xa4\x02\xb8\xff\xd7\x01\ +\xa4\x02\xb9\xff\x9a\x01\xa4\x02\xba\xff\xd7\x01\xa4\x02\xbd\xff\ +\x85\x01\xa4\x02\xbe\xff\xd7\x01\xa4\x02\xbf\xff\x9a\x01\xa4\x02\ +\xc0\xff\xd7\x01\xa4\x02\xc1\xff\x9a\x01\xa4\x02\xc2\xff\xd7\x01\ +\xa4\x02\xd4\xff\x9a\x01\xa4\x02\xd5\xff\xd7\x01\xa4\x02\xf7\xff\ +\xd7\x01\xa4\x02\xf8\xff\xd7\x01\xa4\x02\xf9\xff\xd7\x01\xa4\x02\ +\xfa\xff\xd7\x01\xa4\x02\xfb\xff\xd7\x01\xa4\x02\xfc\xff\xd7\x01\ +\xa4\x02\xfd\xff\x9a\x01\xa4\x02\xfe\xff\xd7\x01\xa4\x03\x03\xff\ +\xae\x01\xa4\x03\x0d\xff\x9a\x01\xa4\x03\x0e\xff\xc3\x01\xa4\x03\ +\x0f\xff\x9a\x01\xa4\x03\x10\xff\xc3\x01\xa4\x03\x17\xff\x85\x01\ +\xa4\x03\x18\xff\xd7\x01\xa5\x00\x05\xff\xae\x01\xa5\x00\x0a\xff\ +\xae\x01\xa5\x01\x9d\xff\x85\x01\xa5\x01\xa6\xff\x85\x01\xa5\x01\ +\xa8\xff\xd7\x01\xa5\x01\xbc\xff\x9a\x01\xa5\x01\xbd\xff\xd7\x01\ +\xa5\x01\xc1\xff\x9a\x01\xa5\x01\xc4\xff\x85\x01\xa5\x01\xdc\xff\ +\xd7\x01\xa5\x01\xdd\xff\xd7\x01\xa5\x01\xe1\xff\xd7\x01\xa5\x01\ +\xe4\xff\xd7\x01\xa5\x01\xf6\xff\xd7\x01\xa5\x02\x07\xff\xae\x01\ +\xa5\x02\x0b\xff\xae\x01\xa5\x02n\xff\xae\x01\xa5\x02|\xff\ +\x9a\x01\xa5\x02\x80\xff\xae\x01\xa5\x02\x82\xff\xae\x01\xa5\x02\ +\x97\xff\xae\x01\xa5\x02\x9b\xff\xae\x01\xa5\x02\xa7\xff\xae\x01\ +\xa5\x02\xa9\xff\x85\x01\xa5\x02\xaa\xff\xd7\x01\xa5\x02\xb5\xff\ +\x9a\x01\xa5\x02\xb6\xff\xd7\x01\xa5\x02\xb7\xff\x9a\x01\xa5\x02\ +\xb8\xff\xd7\x01\xa5\x02\xb9\xff\x9a\x01\xa5\x02\xba\xff\xd7\x01\ +\xa5\x02\xbd\xff\x85\x01\xa5\x02\xbe\xff\xd7\x01\xa5\x02\xbf\xff\ +\x9a\x01\xa5\x02\xc0\xff\xd7\x01\xa5\x02\xc1\xff\x9a\x01\xa5\x02\ +\xc2\xff\xd7\x01\xa5\x02\xd4\xff\x9a\x01\xa5\x02\xd5\xff\xd7\x01\ +\xa5\x02\xf7\xff\xd7\x01\xa5\x02\xf8\xff\xd7\x01\xa5\x02\xf9\xff\ +\xd7\x01\xa5\x02\xfa\xff\xd7\x01\xa5\x02\xfb\xff\xd7\x01\xa5\x02\ +\xfc\xff\xd7\x01\xa5\x02\xfd\xff\x9a\x01\xa5\x02\xfe\xff\xd7\x01\ +\xa5\x03\x03\xff\xae\x01\xa5\x03\x0d\xff\x9a\x01\xa5\x03\x0e\xff\ +\xc3\x01\xa5\x03\x0f\xff\x9a\x01\xa5\x03\x10\xff\xc3\x01\xa5\x03\ +\x17\xff\x85\x01\xa5\x03\x18\xff\xd7\x01\xa6\x00\x05\xff\xae\x01\ +\xa6\x00\x0a\xff\xae\x01\xa6\x01\x9d\xff\x85\x01\xa6\x01\xa6\xff\ +\x85\x01\xa6\x01\xa8\xff\xd7\x01\xa6\x01\xbc\xff\x9a\x01\xa6\x01\ +\xbd\xff\xd7\x01\xa6\x01\xc1\xff\x9a\x01\xa6\x01\xc4\xff\x85\x01\ +\xa6\x01\xdc\xff\xd7\x01\xa6\x01\xdd\xff\xd7\x01\xa6\x01\xe1\xff\ +\xd7\x01\xa6\x01\xe4\xff\xd7\x01\xa6\x01\xf6\xff\xd7\x01\xa6\x02\ +\x07\xff\xae\x01\xa6\x02\x0b\xff\xae\x01\xa6\x02n\xff\xae\x01\ +\xa6\x02|\xff\x9a\x01\xa6\x02\x80\xff\xae\x01\xa6\x02\x82\xff\ +\xae\x01\xa6\x02\x97\xff\xae\x01\xa6\x02\x9b\xff\xae\x01\xa6\x02\ +\xa7\xff\xae\x01\xa6\x02\xa9\xff\x85\x01\xa6\x02\xaa\xff\xd7\x01\ +\xa6\x02\xb5\xff\x9a\x01\xa6\x02\xb6\xff\xd7\x01\xa6\x02\xb7\xff\ +\x9a\x01\xa6\x02\xb8\xff\xd7\x01\xa6\x02\xb9\xff\x9a\x01\xa6\x02\ +\xba\xff\xd7\x01\xa6\x02\xbd\xff\x85\x01\xa6\x02\xbe\xff\xd7\x01\ +\xa6\x02\xbf\xff\x9a\x01\xa6\x02\xc0\xff\xd7\x01\xa6\x02\xc1\xff\ +\x9a\x01\xa6\x02\xc2\xff\xd7\x01\xa6\x02\xd4\xff\x9a\x01\xa6\x02\ +\xd5\xff\xd7\x01\xa6\x02\xf7\xff\xd7\x01\xa6\x02\xf8\xff\xd7\x01\ +\xa6\x02\xf9\xff\xd7\x01\xa6\x02\xfa\xff\xd7\x01\xa6\x02\xfb\xff\ +\xd7\x01\xa6\x02\xfc\xff\xd7\x01\xa6\x02\xfd\xff\x9a\x01\xa6\x02\ +\xfe\xff\xd7\x01\xa6\x03\x03\xff\xae\x01\xa6\x03\x0d\xff\x9a\x01\ +\xa6\x03\x0e\xff\xc3\x01\xa6\x03\x0f\xff\x9a\x01\xa6\x03\x10\xff\ +\xc3\x01\xa6\x03\x17\xff\x85\x01\xa6\x03\x18\xff\xd7\x01\xa7\x01\ +\x9f\xff\xd7\x01\xa7\x01\xb8\xff\xd7\x01\xa7\x01\xbb\xff\xd7\x01\ +\xa7\x01\xbe\xff\xd7\x01\xa7\x01\xc1\xff\xd7\x01\xa7\x01\xe1\xff\ +\xd7\x01\xa7\x02l\xff\xd7\x01\xa7\x02|\xff\xd7\x01\xa7\x02\ +~\xff\xd7\x01\xa7\x02\x84\xff\xd7\x01\xa7\x02\x86\xff\xd7\x01\ +\xa7\x02\x88\xff\xd7\x01\xa7\x02\x8a\xff\xd7\x01\xa7\x02\x8c\xff\ +\xd7\x01\xa7\x02\xb1\xff\xd7\x01\xa7\x02\xb3\xff\xd7\x01\xa7\x02\ +\xbf\xff\xd7\x01\xa7\x02\xc0\xff\xd7\x01\xa7\x02\xc1\xff\xd7\x01\ +\xa7\x02\xc2\xff\xd7\x01\xa7\x02\xc5\xff\x9a\x01\xa7\x02\xc7\xff\ +\x9a\x01\xa7\x02\xd4\xff\xd7\x01\xa7\x02\xd5\xff\xd7\x01\xa7\x02\ +\xef\xff\xd7\x01\xa7\x02\xf1\xff\xd7\x01\xa7\x02\xf3\xff\xd7\x01\ +\xa7\x02\xfd\xff\xd7\x01\xa7\x02\xfe\xff\xd7\x01\xa7\x03\x09\xff\ +\xd7\x01\xa7\x03\x0b\xff\xd7\x01\xa7\x03\x0e\xff\xd7\x01\xa7\x03\ +\x10\xff\xd7\x01\xa7\x03\x15\xff\xd7\x01\xa7\x03\x19\xff\xec\x01\ +\xa8\x00\x0f\xff\x85\x01\xa8\x00\x11\xff\x85\x01\xa8\x01\x9f\xff\ +\xec\x01\xa8\x01\xa4\xff\x9a\x01\xa8\x01\xaa\xffq\x01\xa8\x01\ +\xae\xff\x9a\x01\xa8\x01\xb5\xff\x9a\x01\xa8\x01\xb8\xff\xec\x01\ +\xa8\x01\xbb\xff\xec\x01\xa8\x01\xbe\xff\xc3\x01\xa8\x01\xc9\xff\ +\xec\x01\xa8\x01\xce\xff\xae\x01\xa8\x01\xcf\xff\xd7\x01\xa8\x01\ +\xd5\xff\xae\x01\xa8\x01\xd8\xff\xd7\x01\xa8\x01\xdb\xff\xd7\x01\ +\xa8\x01\xde\xff\xd7\x01\xa8\x01\xe1\xff\xd7\x01\xa8\x01\xea\xff\ +\xd7\x01\xa8\x01\xeb\x00f\x01\xa8\x01\xed\xff\xd7\x01\xa8\x01\ +\xee\xff\xec\x01\xa8\x01\xf2\xff\xae\x01\xa8\x01\xf4\x00f\x01\ +\xa8\x02\x08\xff\x85\x01\xa8\x02\x0c\xff\x85\x01\xa8\x02j\xff\ +\xd7\x01\xa8\x02l\xff\xec\x01\xa8\x02r\xffq\x01\xa8\x02\ +s\xff\xae\x01\xa8\x02~\xff\xec\x01\xa8\x02\x7f\xff\xd7\x01\ +\xa8\x02\x84\xff\xec\x01\xa8\x02\x85\xff\xd7\x01\xa8\x02\x86\xff\ +\xec\x01\xa8\x02\x87\xff\xd7\x01\xa8\x02\x88\xff\xec\x01\xa8\x02\ +\x89\xff\xd7\x01\xa8\x02\x8a\xff\xec\x01\xa8\x02\x8c\xff\xec\x01\ +\xa8\x02\x8d\xff\xd7\x01\xa8\x02\x98\x00f\x01\xa8\x02\xa8\x00\ +f\x01\xa8\x02\xb1\xff\xec\x01\xa8\x02\xb2\xff\xd7\x01\xa8\x02\ +\xb3\xff\xec\x01\xa8\x02\xb4\xff\xd7\x01\xa8\x02\xc0\xff\xd7\x01\ +\xa8\x02\xc2\xff\xd7\x01\xa8\x02\xc5\xff\xd7\x01\xa8\x02\xc6\xff\ +\xc3\x01\xa8\x02\xc7\xff\xd7\x01\xa8\x02\xc8\xff\xc3\x01\xa8\x02\ +\xce\xff\x9a\x01\xa8\x02\xcf\xff\xae\x01\xa8\x02\xd5\xff\xd7\x01\ +\xa8\x02\xd9\xffq\x01\xa8\x02\xdb\xffq\x01\xa8\x02\xdd\xff\ +q\x01\xa8\x02\xe0\xff\xd7\x01\xa8\x02\xef\xff\xec\x01\xa8\x02\ +\xf0\xff\xd7\x01\xa8\x02\xf1\xff\xec\x01\xa8\x02\xf2\xff\xd7\x01\ +\xa8\x02\xf3\xff\xec\x01\xa8\x02\xf4\xff\xd7\x01\xa8\x02\xfe\xff\ +\xd7\x01\xa8\x03\x09\xffq\x01\xa8\x03\x0a\xff\xd7\x01\xa8\x03\ +\x0b\xffq\x01\xa8\x03\x0c\xff\xd7\x01\xa8\x03\x11\xff\x9a\x01\ +\xa8\x03\x12\xff\xae\x01\xa8\x03\x15\xff\xec\x01\xa8\x03\x16\xff\ +\xd7\x01\xa8\x03\x1a\xff\xd7\x01\xa8\x03\x1b\xff\x9a\x01\xa8\x03\ +\x1c\xff\xae\x01\xaa\x00\x05\xffq\x01\xaa\x00\x0a\xffq\x01\ +\xaa\x01\x9d\xff\x9a\x01\xaa\x01\xa6\xff\x9a\x01\xaa\x01\xbc\xff\ +q\x01\xaa\x01\xbe\xff\xd7\x01\xaa\x01\xc1\xff\x9a\x01\xaa\x01\ +\xc4\xff\x9a\x01\xaa\x01\xdc\xff\xd7\x01\xaa\x01\xe1\xff\xd7\x01\ +\xaa\x01\xe4\xff\xd7\x01\xaa\x02\x07\xffq\x01\xaa\x02\x0b\xff\ +q\x01\xaa\x02n\xff\xd7\x01\xaa\x02|\xff\x9a\x01\xaa\x02\ +\x80\xff\xae\x01\xaa\x02\x82\xff\xae\x01\xaa\x02\x97\xff\xd7\x01\ +\xaa\x02\x9b\xff\xd7\x01\xaa\x02\xa7\xff\xd7\x01\xaa\x02\xa9\xff\ +\x9a\x01\xaa\x02\xaa\xff\xd7\x01\xaa\x02\xb5\xffq\x01\xaa\x02\ +\xb6\xff\xd7\x01\xaa\x02\xb7\xff\x85\x01\xaa\x02\xb9\xff\x85\x01\ +\xaa\x02\xbd\xff\x9a\x01\xaa\x02\xbe\xff\xd7\x01\xaa\x02\xbf\xff\ +\x9a\x01\xaa\x02\xc0\xff\xd7\x01\xaa\x02\xc1\xff\x9a\x01\xaa\x02\ +\xc2\xff\xd7\x01\xaa\x02\xc5\xff\x9a\x01\xaa\x02\xc7\xff\x9a\x01\ +\xaa\x02\xd4\xff\x9a\x01\xaa\x02\xd5\xff\xd7\x01\xaa\x02\xe1\xff\ +\xd7\x01\xaa\x02\xe3\xff\xd7\x01\xaa\x02\xfd\xff\x9a\x01\xaa\x02\ +\xfe\xff\xd7\x01\xaa\x03\x03\xff\xd7\x01\xaa\x03\x0d\xffq\x01\ +\xaa\x03\x0e\xff\xd7\x01\xaa\x03\x0f\xffq\x01\xaa\x03\x10\xff\ +\xd7\x01\xaa\x03\x17\xff\x9a\x01\xaa\x03\x18\xff\xd7\x01\xab\x00\ +\x05\xff\xd7\x01\xab\x00\x0a\xff\xd7\x01\xab\x01\xaa\xff\xec\x01\ +\xab\x01\xc1\xff\xd7\x01\xab\x02\x07\xff\xd7\x01\xab\x02\x0b\xff\ +\xd7\x01\xab\x02r\xff\xec\x01\xab\x02|\xff\xd7\x01\xab\x02\ +\xbf\xff\xd7\x01\xab\x02\xc1\xff\xd7\x01\xab\x02\xc5\xff\xd7\x01\ +\xab\x02\xc7\xff\xd7\x01\xab\x02\xd4\xff\xd7\x01\xab\x02\xd9\xff\ +\xec\x01\xab\x02\xdb\xff\xec\x01\xab\x02\xdd\xff\xec\x01\xab\x02\ +\xfd\xff\xd7\x01\xac\x00\x0f\xff\xae\x01\xac\x00\x11\xff\xae\x01\ +\xac\x02\x08\xff\xae\x01\xac\x02\x0c\xff\xae\x01\xac\x02\x80\xff\ +\xec\x01\xac\x02\x82\xff\xec\x01\xac\x02\xb7\xff\xec\x01\xac\x02\ +\xb9\xff\xec\x01\xac\x03\x0d\xff\xd7\x01\xac\x03\x0f\xff\xd7\x01\ +\xad\x00\x0f\xff\x85\x01\xad\x00\x10\xff\xae\x01\xad\x00\x11\xff\ +\x85\x01\xad\x01\x9f\xff\xd7\x01\xad\x01\xa4\xff\x9a\x01\xad\x01\ +\xaa\xffq\x01\xad\x01\xae\xff\x9a\x01\xad\x01\xb5\xff\x9a\x01\ +\xad\x01\xb8\xff\xd7\x01\xad\x01\xbb\xff\xd7\x01\xad\x01\xbc\x00\ +)\x01\xad\x01\xbe\xff\xae\x01\xad\x01\xcc\xff\x9a\x01\xad\x01\ +\xcd\xff\x9a\x01\xad\x01\xce\xff\x85\x01\xad\x01\xcf\xffq\x01\ +\xad\x01\xd0\xff\xd7\x01\xad\x01\xd1\xff\xd7\x01\xad\x01\xd2\xff\ +\x9a\x01\xad\x01\xd3\xff\x9a\x01\xad\x01\xd4\xff\x9a\x01\xad\x01\ +\xd5\xff\x85\x01\xad\x01\xd6\xff\x9a\x01\xad\x01\xd7\xff\x9a\x01\ +\xad\x01\xd8\xffq\x01\xad\x01\xd9\xff\x9a\x01\xad\x01\xda\xff\ +\x9a\x01\xad\x01\xdb\xffq\x01\xad\x01\xdc\xff\xae\x01\xad\x01\ +\xdd\xff\xae\x01\xad\x01\xde\xffq\x01\xad\x01\xdf\xff\xd7\x01\ +\xad\x01\xe0\xff\x9a\x01\xad\x01\xe1\xff\x9a\x01\xad\x01\xe2\xff\ +\x9a\x01\xad\x01\xe3\xff\x9a\x01\xad\x01\xe4\xff\xae\x01\xad\x01\ +\xe5\xff\x9a\x01\xad\x01\xe6\xff\x9a\x01\xad\x01\xe7\xff\xd7\x01\ +\xad\x01\xe8\xff\x9a\x01\xad\x01\xe9\xff\xc3\x01\xad\x01\xea\xff\ +q\x01\xad\x01\xec\xff\x9a\x01\xad\x01\xed\xffq\x01\xad\x01\ +\xee\xff\x85\x01\xad\x01\xf2\xff\x85\x01\xad\x01\xf3\xff\x9a\x01\ +\xad\x01\xf5\xff\x9a\x01\xad\x01\xf6\xff\xae\x01\xad\x01\xf7\xff\ +\x9a\x01\xad\x01\xf9\xff\x9a\x01\xad\x02\x02\xff\xae\x01\xad\x02\ +\x03\xff\xae\x01\xad\x02\x04\xff\xae\x01\xad\x02\x08\xff\x85\x01\ +\xad\x02\x0c\xff\x85\x01\xad\x02j\xffq\x01\xad\x02k\xff\ +\x9a\x01\xad\x02l\xff\xd7\x01\xad\x02m\xff\xd7\x01\xad\x02\ +q\xff\x9a\x01\xad\x02r\xffq\x01\xad\x02s\xff\x85\x01\ +\xad\x02u\xff\x9a\x01\xad\x02w\xff\x9a\x01\xad\x02y\xff\ +\x9a\x01\xad\x02}\xff\x9a\x01\xad\x02~\xff\xd7\x01\xad\x02\ +\x7f\xffq\x01\xad\x02\x81\xff\xd7\x01\xad\x02\x83\xff\xd7\x01\ +\xad\x02\x84\xff\xd7\x01\xad\x02\x85\xffq\x01\xad\x02\x86\xff\ +\xd7\x01\xad\x02\x87\xffq\x01\xad\x02\x88\xff\xd7\x01\xad\x02\ +\x89\xffq\x01\xad\x02\x8a\xff\xd7\x01\xad\x02\x8b\xff\xd7\x01\ +\xad\x02\x8c\xff\xd7\x01\xad\x02\x8d\xffq\x01\xad\x02\x96\xff\ +\x9a\x01\xad\x02\x9a\xff\x9a\x01\xad\x02\x9e\xff\x9a\x01\xad\x02\ +\xa0\xff\xd7\x01\xad\x02\xa2\xff\xd7\x01\xad\x02\xa4\xff\x9a\x01\ +\xad\x02\xa6\xff\x9a\x01\xad\x02\xaa\xff\xae\x01\xad\x02\xac\xff\ +\x9a\x01\xad\x02\xae\xff\x9a\x01\xad\x02\xb0\xff\x9a\x01\xad\x02\ +\xb1\xff\xd7\x01\xad\x02\xb2\xffq\x01\xad\x02\xb3\xff\xd7\x01\ +\xad\x02\xb4\xffq\x01\xad\x02\xb5\x00)\x01\xad\x02\xb6\xff\ +\xae\x01\xad\x02\xb8\xff\xae\x01\xad\x02\xba\xff\xae\x01\xad\x02\ +\xbc\xff\xd7\x01\xad\x02\xbe\xff\xae\x01\xad\x02\xc0\xff\x9a\x01\ +\xad\x02\xc2\xff\x9a\x01\xad\x02\xc4\xff\x9a\x01\xad\x02\xc5\xff\ +\x9a\x01\xad\x02\xc6\xffq\x01\xad\x02\xc7\xff\x9a\x01\xad\x02\ +\xc8\xffq\x01\xad\x02\xcb\xff\xd7\x01\xad\x02\xcd\xff\x9a\x01\ +\xad\x02\xce\xff\x9a\x01\xad\x02\xcf\xff\x85\x01\xad\x02\xd1\xff\ +\x9a\x01\xad\x02\xd3\xff\x9a\x01\xad\x02\xd5\xff\x9a\x01\xad\x02\ +\xd7\xff\x9a\x01\xad\x02\xd9\xffq\x01\xad\x02\xdb\xffq\x01\ +\xad\x02\xdd\xffq\x01\xad\x02\xe0\xffq\x01\xad\x02\xe6\xff\ +\xd7\x01\xad\x02\xe8\xff\xd7\x01\xad\x02\xea\xff\xc3\x01\xad\x02\ +\xec\xff\x9a\x01\xad\x02\xee\xff\x9a\x01\xad\x02\xef\xff\xd7\x01\ +\xad\x02\xf0\xffq\x01\xad\x02\xf1\xff\xd7\x01\xad\x02\xf2\xff\ +q\x01\xad\x02\xf3\xff\xd7\x01\xad\x02\xf4\xffq\x01\xad\x02\ +\xf6\xff\xd7\x01\xad\x02\xf8\xff\xae\x01\xad\x02\xfa\xff\xae\x01\ +\xad\x02\xfc\xff\xae\x01\xad\x02\xfe\xff\x9a\x01\xad\x03\x00\xff\ +\x9a\x01\xad\x03\x02\xff\x9a\x01\xad\x03\x06\xff\xd7\x01\xad\x03\ +\x08\xff\xd7\x01\xad\x03\x09\xffq\x01\xad\x03\x0a\xffq\x01\ +\xad\x03\x0b\xffq\x01\xad\x03\x0c\xffq\x01\xad\x03\x0e\xff\ +\x9a\x01\xad\x03\x10\xff\x9a\x01\xad\x03\x11\xff\x9a\x01\xad\x03\ +\x12\xff\x85\x01\xad\x03\x14\xff\x9a\x01\xad\x03\x15\xff\xd7\x01\ +\xad\x03\x16\xffq\x01\xad\x03\x18\xff\xae\x01\xad\x03\x1a\xff\ +q\x01\xad\x03\x1b\xff\x9a\x01\xad\x03\x1c\xff\x85\x01\xae\x01\ +\xa3\x00\xe1\x01\xae\x02\xea\x00)\x01\xae\x03\x0e\xff\xd7\x01\ +\xae\x03\x10\xff\xd7\x01\xb0\x01\x9f\xff\xd7\x01\xb0\x01\xb8\xff\ +\xd7\x01\xb0\x01\xbb\xff\xd7\x01\xb0\x01\xbe\xff\xd7\x01\xb0\x01\ +\xc1\xff\xd7\x01\xb0\x01\xe1\xff\xd7\x01\xb0\x02l\xff\xd7\x01\ +\xb0\x02|\xff\xd7\x01\xb0\x02~\xff\xd7\x01\xb0\x02\x84\xff\ +\xd7\x01\xb0\x02\x86\xff\xd7\x01\xb0\x02\x88\xff\xd7\x01\xb0\x02\ +\x8a\xff\xd7\x01\xb0\x02\x8c\xff\xd7\x01\xb0\x02\xb1\xff\xd7\x01\ +\xb0\x02\xb3\xff\xd7\x01\xb0\x02\xbf\xff\xd7\x01\xb0\x02\xc0\xff\ +\xd7\x01\xb0\x02\xc1\xff\xd7\x01\xb0\x02\xc2\xff\xd7\x01\xb0\x02\ +\xc5\xff\x9a\x01\xb0\x02\xc7\xff\x9a\x01\xb0\x02\xd4\xff\xd7\x01\ +\xb0\x02\xd5\xff\xd7\x01\xb0\x02\xef\xff\xd7\x01\xb0\x02\xf1\xff\ +\xd7\x01\xb0\x02\xf3\xff\xd7\x01\xb0\x02\xfd\xff\xd7\x01\xb0\x02\ +\xfe\xff\xd7\x01\xb0\x03\x09\xff\xd7\x01\xb0\x03\x0b\xff\xd7\x01\ +\xb0\x03\x0e\xff\xd7\x01\xb0\x03\x10\xff\xd7\x01\xb0\x03\x15\xff\ +\xd7\x01\xb0\x03\x19\xff\xec\x01\xb1\x00\x0f\xff\xae\x01\xb1\x00\ +\x11\xff\xae\x01\xb1\x02\x08\xff\xae\x01\xb1\x02\x0c\xff\xae\x01\ +\xb1\x02\x80\xff\xec\x01\xb1\x02\x82\xff\xec\x01\xb1\x02\xb7\xff\ +\xec\x01\xb1\x02\xb9\xff\xec\x01\xb1\x03\x0d\xff\xd7\x01\xb1\x03\ +\x0f\xff\xd7\x01\xb4\x01\x9f\xff\xd7\x01\xb4\x01\xb8\xff\xd7\x01\ +\xb4\x01\xbb\xff\xd7\x01\xb4\x01\xbe\xff\xd7\x01\xb4\x01\xc1\xff\ +\xd7\x01\xb4\x01\xe1\xff\xd7\x01\xb4\x02l\xff\xd7\x01\xb4\x02\ +|\xff\xd7\x01\xb4\x02~\xff\xd7\x01\xb4\x02\x84\xff\xd7\x01\ +\xb4\x02\x86\xff\xd7\x01\xb4\x02\x88\xff\xd7\x01\xb4\x02\x8a\xff\ +\xd7\x01\xb4\x02\x8c\xff\xd7\x01\xb4\x02\xb1\xff\xd7\x01\xb4\x02\ +\xb3\xff\xd7\x01\xb4\x02\xbf\xff\xd7\x01\xb4\x02\xc0\xff\xd7\x01\ +\xb4\x02\xc1\xff\xd7\x01\xb4\x02\xc2\xff\xd7\x01\xb4\x02\xc5\xff\ +\x9a\x01\xb4\x02\xc7\xff\x9a\x01\xb4\x02\xd4\xff\xd7\x01\xb4\x02\ +\xd5\xff\xd7\x01\xb4\x02\xef\xff\xd7\x01\xb4\x02\xf1\xff\xd7\x01\ +\xb4\x02\xf3\xff\xd7\x01\xb4\x02\xfd\xff\xd7\x01\xb4\x02\xfe\xff\ +\xd7\x01\xb4\x03\x09\xff\xd7\x01\xb4\x03\x0b\xff\xd7\x01\xb4\x03\ +\x0e\xff\xd7\x01\xb4\x03\x10\xff\xd7\x01\xb4\x03\x15\xff\xd7\x01\ +\xb4\x03\x19\xff\xec\x01\xb8\x00\x0f\xff\xae\x01\xb8\x00\x11\xff\ +\xae\x01\xb8\x01\x9d\xff\xec\x01\xb8\x01\xa4\xff\xd7\x01\xb8\x01\ +\xa6\xff\xec\x01\xb8\x01\xa8\xff\xd7\x01\xb8\x01\xaa\xff\xd7\x01\ +\xb8\x01\xae\xff\xd7\x01\xb8\x01\xb0\xff\xd7\x01\xb8\x01\xb1\xff\ +\xec\x01\xb8\x01\xb5\xff\xd7\x01\xb8\x01\xbc\xff\xc3\x01\xb8\x01\ +\xbd\xff\xd7\x01\xb8\x01\xbf\xff\xd7\x01\xb8\x01\xc1\xff\xd7\x01\ +\xb8\x01\xc4\xff\xec\x01\xb8\x01\xc7\xff\xec\x01\xb8\x01\xce\xff\ +\xec\x01\xb8\x01\xd5\xff\xec\x01\xb8\x01\xf2\xff\xec\x01\xb8\x02\ +\x08\xff\xae\x01\xb8\x02\x0c\xff\xae\x01\xb8\x02r\xff\xd7\x01\ +\xb8\x02s\xff\xec\x01\xb8\x02z\xff\xec\x01\xb8\x02|\xff\ +\xd7\x01\xb8\x02\x80\xff\xec\x01\xb8\x02\x82\xff\xec\x01\xb8\x02\ +\x9f\xff\xd7\x01\xb8\x02\xa1\xff\xec\x01\xb8\x02\xa9\xff\xec\x01\ +\xb8\x02\xb5\xff\xc3\x01\xb8\x02\xb7\xff\xec\x01\xb8\x02\xb9\xff\ +\xec\x01\xb8\x02\xbb\xff\xd7\x01\xb8\x02\xbd\xff\xec\x01\xb8\x02\ +\xbf\xff\xd7\x01\xb8\x02\xc1\xff\xd7\x01\xb8\x02\xca\xff\xd7\x01\ +\xb8\x02\xce\xff\xd7\x01\xb8\x02\xcf\xff\xec\x01\xb8\x02\xd4\xff\ +\xd7\x01\xb8\x02\xd9\xff\xd7\x01\xb8\x02\xdb\xff\xd7\x01\xb8\x02\ +\xdd\xff\xd7\x01\xb8\x02\xe5\xff\xd7\x01\xb8\x02\xe7\xff\xec\x01\ +\xb8\x02\xf5\xff\xec\x01\xb8\x02\xf7\xff\xd7\x01\xb8\x02\xf9\xff\ +\xd7\x01\xb8\x02\xfb\xff\xd7\x01\xb8\x02\xfd\xff\xd7\x01\xb8\x03\ +\x05\xff\xd7\x01\xb8\x03\x07\xff\xd7\x01\xb8\x03\x0d\xff\xd7\x01\ +\xb8\x03\x0f\xff\xd7\x01\xb8\x03\x11\xff\xd7\x01\xb8\x03\x12\xff\ +\xec\x01\xb8\x03\x17\xff\xec\x01\xb8\x03\x1b\xff\xd7\x01\xb8\x03\ +\x1c\xff\xec\x01\xba\x00\x0f\xfe\xf6\x01\xba\x00\x11\xfe\xf6\x01\ +\xba\x01\xa4\xff\x85\x01\xba\x01\xaa\xff\x9a\x01\xba\x01\xae\xff\ +\x85\x01\xba\x01\xb0\xff\xd7\x01\xba\x01\xb5\xff\x85\x01\xba\x01\ +\xbf\xff\xd7\x01\xba\x01\xce\xff\x9a\x01\xba\x01\xd5\xff\x9a\x01\ +\xba\x01\xf2\xff\x9a\x01\xba\x02\x08\xfe\xf6\x01\xba\x02\x0c\xfe\ +\xf6\x01\xba\x02r\xff\x9a\x01\xba\x02s\xff\x9a\x01\xba\x02\ +v\xff\xec\x01\xba\x02\x9f\xff\xd7\x01\xba\x02\xbb\xff\xd7\x01\ +\xba\x02\xca\xff\xd7\x01\xba\x02\xce\xff\x85\x01\xba\x02\xcf\xff\ +\x9a\x01\xba\x02\xd9\xff\x9a\x01\xba\x02\xdb\xff\x9a\x01\xba\x02\ +\xdd\xff\x9a\x01\xba\x02\xe5\xff\xd7\x01\xba\x03\x05\xff\xd7\x01\ +\xba\x03\x07\xff\xd7\x01\xba\x03\x09\xff\xae\x01\xba\x03\x0b\xff\ +\xae\x01\xba\x03\x11\xff\x85\x01\xba\x03\x12\xff\x9a\x01\xba\x03\ +\x1b\xff\x85\x01\xba\x03\x1c\xff\x9a\x01\xbb\x01\x9f\xff\xd7\x01\ +\xbb\x01\xb8\xff\xd7\x01\xbb\x01\xbb\xff\xd7\x01\xbb\x01\xbe\xff\ +\xd7\x01\xbb\x01\xe1\xff\xd7\x01\xbb\x02l\xff\xd7\x01\xbb\x02\ +~\xff\xd7\x01\xbb\x02\x84\xff\xd7\x01\xbb\x02\x86\xff\xd7\x01\ +\xbb\x02\x88\xff\xd7\x01\xbb\x02\x8a\xff\xd7\x01\xbb\x02\x8c\xff\ +\xd7\x01\xbb\x02\xb1\xff\xd7\x01\xbb\x02\xb3\xff\xd7\x01\xbb\x02\ +\xc0\xff\xd7\x01\xbb\x02\xc2\xff\xd7\x01\xbb\x02\xc5\xff\xd7\x01\ +\xbb\x02\xc7\xff\xd7\x01\xbb\x02\xd5\xff\xd7\x01\xbb\x02\xef\xff\ +\xd7\x01\xbb\x02\xf1\xff\xd7\x01\xbb\x02\xf3\xff\xd7\x01\xbb\x02\ +\xfe\xff\xd7\x01\xbb\x03\x09\xff\xd7\x01\xbb\x03\x0b\xff\xd7\x01\ +\xbb\x03\x0e\xff\xd7\x01\xbb\x03\x10\xff\xd7\x01\xbb\x03\x15\xff\ +\xd7\x01\xbc\x00\x0f\xff\x85\x01\xbc\x00\x10\xff\xae\x01\xbc\x00\ +\x11\xff\x85\x01\xbc\x01\x9f\xff\xd7\x01\xbc\x01\xa4\xff\x9a\x01\ +\xbc\x01\xaa\xffq\x01\xbc\x01\xae\xff\x9a\x01\xbc\x01\xb5\xff\ +\x9a\x01\xbc\x01\xb8\xff\xd7\x01\xbc\x01\xbb\xff\xd7\x01\xbc\x01\ +\xbc\x00)\x01\xbc\x01\xbe\xff\xae\x01\xbc\x01\xcc\xff\x9a\x01\ +\xbc\x01\xcd\xff\x9a\x01\xbc\x01\xce\xff\x85\x01\xbc\x01\xcf\xff\ +q\x01\xbc\x01\xd0\xff\xd7\x01\xbc\x01\xd1\xff\xd7\x01\xbc\x01\ +\xd2\xff\x9a\x01\xbc\x01\xd3\xff\x9a\x01\xbc\x01\xd4\xff\x9a\x01\ +\xbc\x01\xd5\xff\x85\x01\xbc\x01\xd6\xff\x9a\x01\xbc\x01\xd7\xff\ +\x9a\x01\xbc\x01\xd8\xffq\x01\xbc\x01\xd9\xff\x9a\x01\xbc\x01\ +\xda\xff\x9a\x01\xbc\x01\xdb\xffq\x01\xbc\x01\xdc\xff\xae\x01\ +\xbc\x01\xdd\xff\xae\x01\xbc\x01\xde\xffq\x01\xbc\x01\xdf\xff\ +\xd7\x01\xbc\x01\xe0\xff\x9a\x01\xbc\x01\xe1\xff\x9a\x01\xbc\x01\ +\xe2\xff\x9a\x01\xbc\x01\xe3\xff\x9a\x01\xbc\x01\xe4\xff\xae\x01\ +\xbc\x01\xe5\xff\x9a\x01\xbc\x01\xe6\xff\x9a\x01\xbc\x01\xe7\xff\ +\xd7\x01\xbc\x01\xe8\xff\x9a\x01\xbc\x01\xe9\xff\xc3\x01\xbc\x01\ +\xea\xffq\x01\xbc\x01\xec\xff\x9a\x01\xbc\x01\xed\xffq\x01\ +\xbc\x01\xee\xff\x85\x01\xbc\x01\xf2\xff\x85\x01\xbc\x01\xf3\xff\ +\x9a\x01\xbc\x01\xf5\xff\x9a\x01\xbc\x01\xf6\xff\xae\x01\xbc\x01\ +\xf7\xff\x9a\x01\xbc\x01\xf9\xff\x9a\x01\xbc\x02\x02\xff\xae\x01\ +\xbc\x02\x03\xff\xae\x01\xbc\x02\x04\xff\xae\x01\xbc\x02\x08\xff\ +\x85\x01\xbc\x02\x0c\xff\x85\x01\xbc\x02j\xffq\x01\xbc\x02\ +k\xff\x9a\x01\xbc\x02l\xff\xd7\x01\xbc\x02m\xff\xd7\x01\ +\xbc\x02q\xff\x9a\x01\xbc\x02r\xffq\x01\xbc\x02s\xff\ +\x85\x01\xbc\x02u\xff\x9a\x01\xbc\x02w\xff\x9a\x01\xbc\x02\ +y\xff\x9a\x01\xbc\x02}\xff\x9a\x01\xbc\x02~\xff\xd7\x01\ +\xbc\x02\x7f\xffq\x01\xbc\x02\x81\xff\xd7\x01\xbc\x02\x83\xff\ +\xd7\x01\xbc\x02\x84\xff\xd7\x01\xbc\x02\x85\xffq\x01\xbc\x02\ +\x86\xff\xd7\x01\xbc\x02\x87\xffq\x01\xbc\x02\x88\xff\xd7\x01\ +\xbc\x02\x89\xffq\x01\xbc\x02\x8a\xff\xd7\x01\xbc\x02\x8b\xff\ +\xd7\x01\xbc\x02\x8c\xff\xd7\x01\xbc\x02\x8d\xffq\x01\xbc\x02\ +\x96\xff\x9a\x01\xbc\x02\x9a\xff\x9a\x01\xbc\x02\x9e\xff\x9a\x01\ +\xbc\x02\xa0\xff\xd7\x01\xbc\x02\xa2\xff\xd7\x01\xbc\x02\xa4\xff\ +\x9a\x01\xbc\x02\xa6\xff\x9a\x01\xbc\x02\xaa\xff\xae\x01\xbc\x02\ +\xac\xff\x9a\x01\xbc\x02\xae\xff\x9a\x01\xbc\x02\xb0\xff\x9a\x01\ +\xbc\x02\xb1\xff\xd7\x01\xbc\x02\xb2\xffq\x01\xbc\x02\xb3\xff\ +\xd7\x01\xbc\x02\xb4\xffq\x01\xbc\x02\xb5\x00)\x01\xbc\x02\ +\xb6\xff\xae\x01\xbc\x02\xb8\xff\xae\x01\xbc\x02\xba\xff\xae\x01\ +\xbc\x02\xbc\xff\xd7\x01\xbc\x02\xbe\xff\xae\x01\xbc\x02\xc0\xff\ +\x9a\x01\xbc\x02\xc2\xff\x9a\x01\xbc\x02\xc4\xff\x9a\x01\xbc\x02\ +\xc5\xff\x9a\x01\xbc\x02\xc6\xffq\x01\xbc\x02\xc7\xff\x9a\x01\ +\xbc\x02\xc8\xffq\x01\xbc\x02\xcb\xff\xd7\x01\xbc\x02\xcd\xff\ +\x9a\x01\xbc\x02\xce\xff\x9a\x01\xbc\x02\xcf\xff\x85\x01\xbc\x02\ +\xd1\xff\x9a\x01\xbc\x02\xd3\xff\x9a\x01\xbc\x02\xd5\xff\x9a\x01\ +\xbc\x02\xd7\xff\x9a\x01\xbc\x02\xd9\xffq\x01\xbc\x02\xdb\xff\ +q\x01\xbc\x02\xdd\xffq\x01\xbc\x02\xe0\xffq\x01\xbc\x02\ +\xe6\xff\xd7\x01\xbc\x02\xe8\xff\xd7\x01\xbc\x02\xea\xff\xc3\x01\ +\xbc\x02\xec\xff\x9a\x01\xbc\x02\xee\xff\x9a\x01\xbc\x02\xef\xff\ +\xd7\x01\xbc\x02\xf0\xffq\x01\xbc\x02\xf1\xff\xd7\x01\xbc\x02\ +\xf2\xffq\x01\xbc\x02\xf3\xff\xd7\x01\xbc\x02\xf4\xffq\x01\ +\xbc\x02\xf6\xff\xd7\x01\xbc\x02\xf8\xff\xae\x01\xbc\x02\xfa\xff\ +\xae\x01\xbc\x02\xfc\xff\xae\x01\xbc\x02\xfe\xff\x9a\x01\xbc\x03\ +\x00\xff\x9a\x01\xbc\x03\x02\xff\x9a\x01\xbc\x03\x06\xff\xd7\x01\ +\xbc\x03\x08\xff\xd7\x01\xbc\x03\x09\xffq\x01\xbc\x03\x0a\xff\ +q\x01\xbc\x03\x0b\xffq\x01\xbc\x03\x0c\xffq\x01\xbc\x03\ +\x0e\xff\x9a\x01\xbc\x03\x10\xff\x9a\x01\xbc\x03\x11\xff\x9a\x01\ +\xbc\x03\x12\xff\x85\x01\xbc\x03\x14\xff\x9a\x01\xbc\x03\x15\xff\ +\xd7\x01\xbc\x03\x16\xffq\x01\xbc\x03\x18\xff\xae\x01\xbc\x03\ +\x1a\xffq\x01\xbc\x03\x1b\xff\x9a\x01\xbc\x03\x1c\xff\x85\x01\ +\xbd\x00\x0f\xff\x85\x01\xbd\x00\x11\xff\x85\x01\xbd\x01\x9f\xff\ +\xec\x01\xbd\x01\xa4\xff\x9a\x01\xbd\x01\xaa\xffq\x01\xbd\x01\ +\xae\xff\x9a\x01\xbd\x01\xb5\xff\x9a\x01\xbd\x01\xb8\xff\xec\x01\ +\xbd\x01\xbb\xff\xec\x01\xbd\x01\xbe\xff\xc3\x01\xbd\x01\xc9\xff\ +\xec\x01\xbd\x01\xce\xff\xae\x01\xbd\x01\xcf\xff\xd7\x01\xbd\x01\ +\xd5\xff\xae\x01\xbd\x01\xd8\xff\xd7\x01\xbd\x01\xdb\xff\xd7\x01\ +\xbd\x01\xde\xff\xd7\x01\xbd\x01\xe1\xff\xd7\x01\xbd\x01\xea\xff\ +\xd7\x01\xbd\x01\xeb\x00f\x01\xbd\x01\xed\xff\xd7\x01\xbd\x01\ +\xee\xff\xec\x01\xbd\x01\xf2\xff\xae\x01\xbd\x01\xf4\x00f\x01\ +\xbd\x02\x08\xff\x85\x01\xbd\x02\x0c\xff\x85\x01\xbd\x02j\xff\ +\xd7\x01\xbd\x02l\xff\xec\x01\xbd\x02r\xffq\x01\xbd\x02\ +s\xff\xae\x01\xbd\x02~\xff\xec\x01\xbd\x02\x7f\xff\xd7\x01\ +\xbd\x02\x84\xff\xec\x01\xbd\x02\x85\xff\xd7\x01\xbd\x02\x86\xff\ +\xec\x01\xbd\x02\x87\xff\xd7\x01\xbd\x02\x88\xff\xec\x01\xbd\x02\ +\x89\xff\xd7\x01\xbd\x02\x8a\xff\xec\x01\xbd\x02\x8c\xff\xec\x01\ +\xbd\x02\x8d\xff\xd7\x01\xbd\x02\x98\x00f\x01\xbd\x02\xa8\x00\ +f\x01\xbd\x02\xb1\xff\xec\x01\xbd\x02\xb2\xff\xd7\x01\xbd\x02\ +\xb3\xff\xec\x01\xbd\x02\xb4\xff\xd7\x01\xbd\x02\xc0\xff\xd7\x01\ +\xbd\x02\xc2\xff\xd7\x01\xbd\x02\xc5\xff\xd7\x01\xbd\x02\xc6\xff\ +\xc3\x01\xbd\x02\xc7\xff\xd7\x01\xbd\x02\xc8\xff\xc3\x01\xbd\x02\ +\xce\xff\x9a\x01\xbd\x02\xcf\xff\xae\x01\xbd\x02\xd5\xff\xd7\x01\ +\xbd\x02\xd9\xffq\x01\xbd\x02\xdb\xffq\x01\xbd\x02\xdd\xff\ +q\x01\xbd\x02\xe0\xff\xd7\x01\xbd\x02\xef\xff\xec\x01\xbd\x02\ +\xf0\xff\xd7\x01\xbd\x02\xf1\xff\xec\x01\xbd\x02\xf2\xff\xd7\x01\ +\xbd\x02\xf3\xff\xec\x01\xbd\x02\xf4\xff\xd7\x01\xbd\x02\xfe\xff\ +\xd7\x01\xbd\x03\x09\xffq\x01\xbd\x03\x0a\xff\xd7\x01\xbd\x03\ +\x0b\xffq\x01\xbd\x03\x0c\xff\xd7\x01\xbd\x03\x11\xff\x9a\x01\ +\xbd\x03\x12\xff\xae\x01\xbd\x03\x15\xff\xec\x01\xbd\x03\x16\xff\ +\xd7\x01\xbd\x03\x1a\xff\xd7\x01\xbd\x03\x1b\xff\x9a\x01\xbd\x03\ +\x1c\xff\xae\x01\xbe\x00\x0f\xff\xae\x01\xbe\x00\x11\xff\xae\x01\ +\xbe\x01\x9d\xff\xd7\x01\xbe\x01\xa4\xff\xd7\x01\xbe\x01\xa6\xff\ +\xd7\x01\xbe\x01\xa8\xff\xc3\x01\xbe\x01\xaa\xff\xd7\x01\xbe\x01\ +\xae\xff\xd7\x01\xbe\x01\xb0\xff\xd7\x01\xbe\x01\xb1\xff\xd7\x01\ +\xbe\x01\xb5\xff\xd7\x01\xbe\x01\xbc\xff\xc3\x01\xbe\x01\xbd\xff\ +\xc3\x01\xbe\x01\xbf\xff\xd7\x01\xbe\x01\xc4\xff\xd7\x01\xbe\x01\ +\xc7\xff\xd7\x01\xbe\x01\xce\xff\xec\x01\xbe\x01\xd5\xff\xec\x01\ +\xbe\x01\xf2\xff\xec\x01\xbe\x02\x08\xff\xae\x01\xbe\x02\x0c\xff\ +\xae\x01\xbe\x02r\xff\xd7\x01\xbe\x02s\xff\xec\x01\xbe\x02\ +z\xff\xd7\x01\xbe\x02\x80\xff\xec\x01\xbe\x02\x82\xff\xec\x01\ +\xbe\x02\x9f\xff\xd7\x01\xbe\x02\xa1\xff\xd7\x01\xbe\x02\xa9\xff\ +\xd7\x01\xbe\x02\xb5\xff\xc3\x01\xbe\x02\xb7\xff\xc3\x01\xbe\x02\ +\xb9\xff\xc3\x01\xbe\x02\xbb\xff\xd7\x01\xbe\x02\xbd\xff\xd7\x01\ +\xbe\x02\xca\xff\xd7\x01\xbe\x02\xce\xff\xd7\x01\xbe\x02\xcf\xff\ +\xec\x01\xbe\x02\xd9\xff\xd7\x01\xbe\x02\xdb\xff\xd7\x01\xbe\x02\ +\xdd\xff\xd7\x01\xbe\x02\xe5\xff\xd7\x01\xbe\x02\xe7\xff\xd7\x01\ +\xbe\x02\xf5\xff\xd7\x01\xbe\x02\xf7\xff\xc3\x01\xbe\x02\xf9\xff\ +\xc3\x01\xbe\x02\xfb\xff\xc3\x01\xbe\x03\x05\xff\xd7\x01\xbe\x03\ +\x07\xff\xd7\x01\xbe\x03\x0d\xff\xd7\x01\xbe\x03\x0f\xff\xd7\x01\ +\xbe\x03\x11\xff\xd7\x01\xbe\x03\x12\xff\xec\x01\xbe\x03\x17\xff\ +\xd7\x01\xbe\x03\x1b\xff\xd7\x01\xbe\x03\x1c\xff\xec\x01\xbf\x01\ +\x9f\xff\xd7\x01\xbf\x01\xb8\xff\xd7\x01\xbf\x01\xbb\xff\xd7\x01\ +\xbf\x01\xbe\xff\xd7\x01\xbf\x01\xc1\xff\xd7\x01\xbf\x01\xe1\xff\ +\xd7\x01\xbf\x02l\xff\xd7\x01\xbf\x02|\xff\xd7\x01\xbf\x02\ +~\xff\xd7\x01\xbf\x02\x84\xff\xd7\x01\xbf\x02\x86\xff\xd7\x01\ +\xbf\x02\x88\xff\xd7\x01\xbf\x02\x8a\xff\xd7\x01\xbf\x02\x8c\xff\ +\xd7\x01\xbf\x02\xb1\xff\xd7\x01\xbf\x02\xb3\xff\xd7\x01\xbf\x02\ +\xbf\xff\xd7\x01\xbf\x02\xc0\xff\xd7\x01\xbf\x02\xc1\xff\xd7\x01\ +\xbf\x02\xc2\xff\xd7\x01\xbf\x02\xc5\xff\x9a\x01\xbf\x02\xc7\xff\ +\x9a\x01\xbf\x02\xd4\xff\xd7\x01\xbf\x02\xd5\xff\xd7\x01\xbf\x02\ +\xef\xff\xd7\x01\xbf\x02\xf1\xff\xd7\x01\xbf\x02\xf3\xff\xd7\x01\ +\xbf\x02\xfd\xff\xd7\x01\xbf\x02\xfe\xff\xd7\x01\xbf\x03\x09\xff\ +\xd7\x01\xbf\x03\x0b\xff\xd7\x01\xbf\x03\x0e\xff\xd7\x01\xbf\x03\ +\x10\xff\xd7\x01\xbf\x03\x15\xff\xd7\x01\xbf\x03\x19\xff\xec\x01\ +\xc0\x01\xa3\x00\xe1\x01\xc0\x02\xea\x00)\x01\xc0\x03\x0e\xff\ +\xd7\x01\xc0\x03\x10\xff\xd7\x01\xc3\x01\xa3\x00\xe1\x01\xc3\x02\ +\xea\x00)\x01\xc3\x03\x0e\xff\xd7\x01\xc3\x03\x10\xff\xd7\x01\ +\xc4\x00\x05\xff\xae\x01\xc4\x00\x0a\xff\xae\x01\xc4\x01\x9d\xff\ +\x85\x01\xc4\x01\xa6\xff\x85\x01\xc4\x01\xa8\xff\xd7\x01\xc4\x01\ +\xbc\xff\x9a\x01\xc4\x01\xbd\xff\xd7\x01\xc4\x01\xc1\xff\x9a\x01\ +\xc4\x01\xc4\xff\x85\x01\xc4\x01\xdc\xff\xd7\x01\xc4\x01\xdd\xff\ +\xd7\x01\xc4\x01\xe1\xff\xd7\x01\xc4\x01\xe4\xff\xd7\x01\xc4\x01\ +\xf6\xff\xd7\x01\xc4\x02\x07\xff\xae\x01\xc4\x02\x0b\xff\xae\x01\ +\xc4\x02n\xff\xae\x01\xc4\x02|\xff\x9a\x01\xc4\x02\x80\xff\ +\xae\x01\xc4\x02\x82\xff\xae\x01\xc4\x02\x97\xff\xae\x01\xc4\x02\ +\x9b\xff\xae\x01\xc4\x02\xa7\xff\xae\x01\xc4\x02\xa9\xff\x85\x01\ +\xc4\x02\xaa\xff\xd7\x01\xc4\x02\xb5\xff\x9a\x01\xc4\x02\xb6\xff\ +\xd7\x01\xc4\x02\xb7\xff\x9a\x01\xc4\x02\xb8\xff\xd7\x01\xc4\x02\ +\xb9\xff\x9a\x01\xc4\x02\xba\xff\xd7\x01\xc4\x02\xbd\xff\x85\x01\ +\xc4\x02\xbe\xff\xd7\x01\xc4\x02\xbf\xff\x9a\x01\xc4\x02\xc0\xff\ +\xd7\x01\xc4\x02\xc1\xff\x9a\x01\xc4\x02\xc2\xff\xd7\x01\xc4\x02\ +\xd4\xff\x9a\x01\xc4\x02\xd5\xff\xd7\x01\xc4\x02\xf7\xff\xd7\x01\ +\xc4\x02\xf8\xff\xd7\x01\xc4\x02\xf9\xff\xd7\x01\xc4\x02\xfa\xff\ +\xd7\x01\xc4\x02\xfb\xff\xd7\x01\xc4\x02\xfc\xff\xd7\x01\xc4\x02\ +\xfd\xff\x9a\x01\xc4\x02\xfe\xff\xd7\x01\xc4\x03\x03\xff\xae\x01\ +\xc4\x03\x0d\xff\x9a\x01\xc4\x03\x0e\xff\xc3\x01\xc4\x03\x0f\xff\ +\x9a\x01\xc4\x03\x10\xff\xc3\x01\xc4\x03\x17\xff\x85\x01\xc4\x03\ +\x18\xff\xd7\x01\xc6\x00\x05\xff\xae\x01\xc6\x00\x0a\xff\xae\x01\ +\xc6\x01\x9d\xff\x85\x01\xc6\x01\xa6\xff\x85\x01\xc6\x01\xa8\xff\ +\xd7\x01\xc6\x01\xbc\xff\x9a\x01\xc6\x01\xbd\xff\xd7\x01\xc6\x01\ +\xc1\xff\x9a\x01\xc6\x01\xc4\xff\x85\x01\xc6\x01\xdc\xff\xd7\x01\ +\xc6\x01\xdd\xff\xd7\x01\xc6\x01\xe1\xff\xd7\x01\xc6\x01\xe4\xff\ +\xd7\x01\xc6\x01\xf6\xff\xd7\x01\xc6\x02\x07\xff\xae\x01\xc6\x02\ +\x0b\xff\xae\x01\xc6\x02n\xff\xae\x01\xc6\x02|\xff\x9a\x01\ +\xc6\x02\x80\xff\xae\x01\xc6\x02\x82\xff\xae\x01\xc6\x02\x97\xff\ +\xae\x01\xc6\x02\x9b\xff\xae\x01\xc6\x02\xa7\xff\xae\x01\xc6\x02\ +\xa9\xff\x85\x01\xc6\x02\xaa\xff\xd7\x01\xc6\x02\xb5\xff\x9a\x01\ +\xc6\x02\xb6\xff\xd7\x01\xc6\x02\xb7\xff\x9a\x01\xc6\x02\xb8\xff\ +\xd7\x01\xc6\x02\xb9\xff\x9a\x01\xc6\x02\xba\xff\xd7\x01\xc6\x02\ +\xbd\xff\x85\x01\xc6\x02\xbe\xff\xd7\x01\xc6\x02\xbf\xff\x9a\x01\ +\xc6\x02\xc0\xff\xd7\x01\xc6\x02\xc1\xff\x9a\x01\xc6\x02\xc2\xff\ +\xd7\x01\xc6\x02\xd4\xff\x9a\x01\xc6\x02\xd5\xff\xd7\x01\xc6\x02\ +\xf7\xff\xd7\x01\xc6\x02\xf8\xff\xd7\x01\xc6\x02\xf9\xff\xd7\x01\ +\xc6\x02\xfa\xff\xd7\x01\xc6\x02\xfb\xff\xd7\x01\xc6\x02\xfc\xff\ +\xd7\x01\xc6\x02\xfd\xff\x9a\x01\xc6\x02\xfe\xff\xd7\x01\xc6\x03\ +\x03\xff\xae\x01\xc6\x03\x0d\xff\x9a\x01\xc6\x03\x0e\xff\xc3\x01\ +\xc6\x03\x0f\xff\x9a\x01\xc6\x03\x10\xff\xc3\x01\xc6\x03\x17\xff\ +\x85\x01\xc6\x03\x18\xff\xd7\x01\xc7\x00\x0f\xff\xae\x01\xc7\x00\ +\x11\xff\xae\x01\xc7\x01\x9d\xff\xec\x01\xc7\x01\xa4\xff\xd7\x01\ +\xc7\x01\xa6\xff\xec\x01\xc7\x01\xa8\xff\xd7\x01\xc7\x01\xaa\xff\ +\xd7\x01\xc7\x01\xae\xff\xd7\x01\xc7\x01\xb0\xff\xd7\x01\xc7\x01\ +\xb1\xff\xec\x01\xc7\x01\xb5\xff\xd7\x01\xc7\x01\xbc\xff\xc3\x01\ +\xc7\x01\xbd\xff\xd7\x01\xc7\x01\xbf\xff\xd7\x01\xc7\x01\xc1\xff\ +\xd7\x01\xc7\x01\xc4\xff\xec\x01\xc7\x01\xc7\xff\xec\x01\xc7\x01\ +\xce\xff\xec\x01\xc7\x01\xd5\xff\xec\x01\xc7\x01\xf2\xff\xec\x01\ +\xc7\x02\x08\xff\xae\x01\xc7\x02\x0c\xff\xae\x01\xc7\x02r\xff\ +\xd7\x01\xc7\x02s\xff\xec\x01\xc7\x02z\xff\xec\x01\xc7\x02\ +|\xff\xd7\x01\xc7\x02\x80\xff\xec\x01\xc7\x02\x82\xff\xec\x01\ +\xc7\x02\x9f\xff\xd7\x01\xc7\x02\xa1\xff\xec\x01\xc7\x02\xa9\xff\ +\xec\x01\xc7\x02\xb5\xff\xc3\x01\xc7\x02\xb7\xff\xec\x01\xc7\x02\ +\xb9\xff\xec\x01\xc7\x02\xbb\xff\xd7\x01\xc7\x02\xbd\xff\xec\x01\ +\xc7\x02\xbf\xff\xd7\x01\xc7\x02\xc1\xff\xd7\x01\xc7\x02\xca\xff\ +\xd7\x01\xc7\x02\xce\xff\xd7\x01\xc7\x02\xcf\xff\xec\x01\xc7\x02\ +\xd4\xff\xd7\x01\xc7\x02\xd9\xff\xd7\x01\xc7\x02\xdb\xff\xd7\x01\ +\xc7\x02\xdd\xff\xd7\x01\xc7\x02\xe5\xff\xd7\x01\xc7\x02\xe7\xff\ +\xec\x01\xc7\x02\xf5\xff\xec\x01\xc7\x02\xf7\xff\xd7\x01\xc7\x02\ +\xf9\xff\xd7\x01\xc7\x02\xfb\xff\xd7\x01\xc7\x02\xfd\xff\xd7\x01\ +\xc7\x03\x05\xff\xd7\x01\xc7\x03\x07\xff\xd7\x01\xc7\x03\x0d\xff\ +\xd7\x01\xc7\x03\x0f\xff\xd7\x01\xc7\x03\x11\xff\xd7\x01\xc7\x03\ +\x12\xff\xec\x01\xc7\x03\x17\xff\xec\x01\xc7\x03\x1b\xff\xd7\x01\ +\xc7\x03\x1c\xff\xec\x01\xc8\x00\x0f\xff\xae\x01\xc8\x00\x11\xff\ +\xae\x01\xc8\x01\x9d\xff\xec\x01\xc8\x01\xa4\xff\xd7\x01\xc8\x01\ +\xa6\xff\xec\x01\xc8\x01\xa8\xff\xd7\x01\xc8\x01\xaa\xff\xd7\x01\ +\xc8\x01\xae\xff\xd7\x01\xc8\x01\xb0\xff\xd7\x01\xc8\x01\xb1\xff\ +\xec\x01\xc8\x01\xb5\xff\xd7\x01\xc8\x01\xbc\xff\xc3\x01\xc8\x01\ +\xbd\xff\xd7\x01\xc8\x01\xbf\xff\xd7\x01\xc8\x01\xc1\xff\xd7\x01\ +\xc8\x01\xc4\xff\xec\x01\xc8\x01\xc7\xff\xec\x01\xc8\x01\xce\xff\ +\xec\x01\xc8\x01\xd5\xff\xec\x01\xc8\x01\xf2\xff\xec\x01\xc8\x02\ +\x08\xff\xae\x01\xc8\x02\x0c\xff\xae\x01\xc8\x02r\xff\xd7\x01\ +\xc8\x02s\xff\xec\x01\xc8\x02z\xff\xec\x01\xc8\x02|\xff\ +\xd7\x01\xc8\x02\x80\xff\xec\x01\xc8\x02\x82\xff\xec\x01\xc8\x02\ +\x9f\xff\xd7\x01\xc8\x02\xa1\xff\xec\x01\xc8\x02\xa9\xff\xec\x01\ +\xc8\x02\xb5\xff\xc3\x01\xc8\x02\xb7\xff\xec\x01\xc8\x02\xb9\xff\ +\xec\x01\xc8\x02\xbb\xff\xd7\x01\xc8\x02\xbd\xff\xec\x01\xc8\x02\ +\xbf\xff\xd7\x01\xc8\x02\xc1\xff\xd7\x01\xc8\x02\xca\xff\xd7\x01\ +\xc8\x02\xce\xff\xd7\x01\xc8\x02\xcf\xff\xec\x01\xc8\x02\xd4\xff\ +\xd7\x01\xc8\x02\xd9\xff\xd7\x01\xc8\x02\xdb\xff\xd7\x01\xc8\x02\ +\xdd\xff\xd7\x01\xc8\x02\xe5\xff\xd7\x01\xc8\x02\xe7\xff\xec\x01\ +\xc8\x02\xf5\xff\xec\x01\xc8\x02\xf7\xff\xd7\x01\xc8\x02\xf9\xff\ +\xd7\x01\xc8\x02\xfb\xff\xd7\x01\xc8\x02\xfd\xff\xd7\x01\xc8\x03\ +\x05\xff\xd7\x01\xc8\x03\x07\xff\xd7\x01\xc8\x03\x0d\xff\xd7\x01\ +\xc8\x03\x0f\xff\xd7\x01\xc8\x03\x11\xff\xd7\x01\xc8\x03\x12\xff\ +\xec\x01\xc8\x03\x17\xff\xec\x01\xc8\x03\x1b\xff\xd7\x01\xc8\x03\ +\x1c\xff\xec\x01\xca\x00\x05\xff\xec\x01\xca\x00\x0a\xff\xec\x01\ +\xca\x02\x07\xff\xec\x01\xca\x02\x0b\xff\xec\x01\xcc\x01\xe9\x00\ +)\x01\xcd\x00\x0f\xff\x9a\x01\xcd\x00\x10\xff\xd7\x01\xcd\x00\ +\x11\xff\x9a\x01\xcd\x01\xce\xff\xc3\x01\xcd\x01\xcf\xff\xec\x01\ +\xcd\x01\xd5\xff\xc3\x01\xcd\x01\xd8\xff\xec\x01\xcd\x01\xdb\xff\ +\xec\x01\xcd\x01\xde\xff\xec\x01\xcd\x01\xea\xff\xec\x01\xcd\x01\ +\xed\xff\xec\x01\xcd\x01\xf2\xff\xc3\x01\xcd\x02\x02\xff\xd7\x01\ +\xcd\x02\x03\xff\xd7\x01\xcd\x02\x04\xff\xd7\x01\xcd\x02\x08\xff\ +\x9a\x01\xcd\x02\x0c\xff\x9a\x01\xcd\x02j\xff\xec\x01\xcd\x02\ +s\xff\xc3\x01\xcd\x02\x7f\xff\xec\x01\xcd\x02\x85\xff\xec\x01\ +\xcd\x02\x87\xff\xec\x01\xcd\x02\x89\xff\xec\x01\xcd\x02\x8d\xff\ +\xec\x01\xcd\x02\xb2\xff\xec\x01\xcd\x02\xb4\xff\xec\x01\xcd\x02\ +\xcf\xff\xc3\x01\xcd\x02\xe0\xff\xec\x01\xcd\x02\xf0\xff\xec\x01\ +\xcd\x02\xf2\xff\xec\x01\xcd\x02\xf4\xff\xec\x01\xcd\x03\x0a\xff\ +\xec\x01\xcd\x03\x0c\xff\xec\x01\xcd\x03\x12\xff\xc3\x01\xcd\x03\ +\x16\xff\xec\x01\xcd\x03\x1a\xff\xec\x01\xcd\x03\x1c\xff\xc3\x01\ +\xce\x00\x05\xff\xec\x01\xce\x00\x0a\xff\xec\x01\xce\x02\x07\xff\ +\xec\x01\xce\x02\x0b\xff\xec\x01\xcf\x00\x05\xff\xec\x01\xcf\x00\ +\x0a\xff\xec\x01\xcf\x02\x07\xff\xec\x01\xcf\x02\x0b\xff\xec\x01\ +\xd0\x01\xcf\xff\xd7\x01\xd0\x01\xd8\xff\xd7\x01\xd0\x01\xdb\xff\ +\xd7\x01\xd0\x01\xde\xff\xd7\x01\xd0\x01\xe1\xff\xd7\x01\xd0\x01\ +\xea\xff\xd7\x01\xd0\x01\xed\xff\xd7\x01\xd0\x02j\xff\xd7\x01\ +\xd0\x02\x7f\xff\xd7\x01\xd0\x02\x85\xff\xd7\x01\xd0\x02\x87\xff\ +\xd7\x01\xd0\x02\x89\xff\xd7\x01\xd0\x02\x8d\xff\xd7\x01\xd0\x02\ +\xb2\xff\xd7\x01\xd0\x02\xb4\xff\xd7\x01\xd0\x02\xc0\xff\xd7\x01\ +\xd0\x02\xc2\xff\xd7\x01\xd0\x02\xc6\xff\xd7\x01\xd0\x02\xc8\xff\ +\xd7\x01\xd0\x02\xd5\xff\xd7\x01\xd0\x02\xe0\xff\xd7\x01\xd0\x02\ +\xf0\xff\xd7\x01\xd0\x02\xf2\xff\xd7\x01\xd0\x02\xf4\xff\xd7\x01\ +\xd0\x02\xfe\xff\xd7\x01\xd0\x03\x0a\xff\xd7\x01\xd0\x03\x0c\xff\ +\xd7\x01\xd0\x03\x16\xff\xd7\x01\xd0\x03\x1a\xff\xd7\x01\xd1\x01\ +\xe9\x00)\x01\xd4\x01\xcf\xff\xd7\x01\xd4\x01\xd8\xff\xd7\x01\ +\xd4\x01\xdb\xff\xd7\x01\xd4\x01\xde\xff\xd7\x01\xd4\x01\xe1\xff\ +\xd7\x01\xd4\x01\xea\xff\xd7\x01\xd4\x01\xed\xff\xd7\x01\xd4\x02\ +j\xff\xd7\x01\xd4\x02\x7f\xff\xd7\x01\xd4\x02\x85\xff\xd7\x01\ +\xd4\x02\x87\xff\xd7\x01\xd4\x02\x89\xff\xd7\x01\xd4\x02\x8d\xff\ +\xd7\x01\xd4\x02\xb2\xff\xd7\x01\xd4\x02\xb4\xff\xd7\x01\xd4\x02\ +\xc0\xff\xd7\x01\xd4\x02\xc2\xff\xd7\x01\xd4\x02\xc6\xff\xd7\x01\ +\xd4\x02\xc8\xff\xd7\x01\xd4\x02\xd5\xff\xd7\x01\xd4\x02\xe0\xff\ +\xd7\x01\xd4\x02\xf0\xff\xd7\x01\xd4\x02\xf2\xff\xd7\x01\xd4\x02\ +\xf4\xff\xd7\x01\xd4\x02\xfe\xff\xd7\x01\xd4\x03\x0a\xff\xd7\x01\ +\xd4\x03\x0c\xff\xd7\x01\xd4\x03\x16\xff\xd7\x01\xd4\x03\x1a\xff\ +\xd7\x01\xd8\x00\x05\xff\xec\x01\xd8\x00\x0a\xff\xec\x01\xd8\x01\ +\xd0\xff\xd7\x01\xd8\x01\xdc\xff\xec\x01\xd8\x01\xdd\xff\xec\x01\ +\xd8\x01\xdf\xff\xd7\x01\xd8\x01\xe1\xff\xec\x01\xd8\x01\xe4\xff\ +\xec\x01\xd8\x01\xf6\xff\xec\x01\xd8\x02\x07\xff\xec\x01\xd8\x02\ +\x0b\xff\xec\x01\xd8\x02\xa0\xff\xd7\x01\xd8\x02\xaa\xff\xec\x01\ +\xd8\x02\xb6\xff\xec\x01\xd8\x02\xbc\xff\xd7\x01\xd8\x02\xbe\xff\ +\xec\x01\xd8\x02\xc0\xff\xec\x01\xd8\x02\xc2\xff\xec\x01\xd8\x02\ +\xcb\xff\xd7\x01\xd8\x02\xd5\xff\xec\x01\xd8\x02\xe6\xff\xd7\x01\ +\xd8\x02\xf8\xff\xec\x01\xd8\x02\xfa\xff\xec\x01\xd8\x02\xfc\xff\ +\xec\x01\xd8\x02\xfe\xff\xec\x01\xd8\x03\x06\xff\xd7\x01\xd8\x03\ +\x08\xff\xd7\x01\xd8\x03\x0e\xff\xec\x01\xd8\x03\x10\xff\xec\x01\ +\xd8\x03\x18\xff\xec\x01\xda\x00\x05\xff\xec\x01\xda\x00\x0a\xff\ +\xec\x01\xda\x01\xd0\xff\xd7\x01\xda\x01\xdc\xff\xec\x01\xda\x01\ +\xdd\xff\xec\x01\xda\x01\xdf\xff\xd7\x01\xda\x01\xe1\xff\xec\x01\ +\xda\x01\xe4\xff\xec\x01\xda\x01\xf6\xff\xec\x01\xda\x02\x07\xff\ +\xec\x01\xda\x02\x0b\xff\xec\x01\xda\x02\xa0\xff\xd7\x01\xda\x02\ +\xaa\xff\xec\x01\xda\x02\xb6\xff\xec\x01\xda\x02\xbc\xff\xd7\x01\ +\xda\x02\xbe\xff\xec\x01\xda\x02\xc0\xff\xec\x01\xda\x02\xc2\xff\ +\xec\x01\xda\x02\xcb\xff\xd7\x01\xda\x02\xd5\xff\xec\x01\xda\x02\ +\xe6\xff\xd7\x01\xda\x02\xf8\xff\xec\x01\xda\x02\xfa\xff\xec\x01\ +\xda\x02\xfc\xff\xec\x01\xda\x02\xfe\xff\xec\x01\xda\x03\x06\xff\ +\xd7\x01\xda\x03\x08\xff\xd7\x01\xda\x03\x0e\xff\xec\x01\xda\x03\ +\x10\xff\xec\x01\xda\x03\x18\xff\xec\x01\xdc\x00\x0f\xff\x9a\x01\ +\xdc\x00\x10\xff\xd7\x01\xdc\x00\x11\xff\x9a\x01\xdc\x01\xce\xff\ +\xc3\x01\xdc\x01\xcf\xff\xec\x01\xdc\x01\xd5\xff\xc3\x01\xdc\x01\ +\xd8\xff\xec\x01\xdc\x01\xdb\xff\xec\x01\xdc\x01\xde\xff\xec\x01\ +\xdc\x01\xea\xff\xec\x01\xdc\x01\xed\xff\xec\x01\xdc\x01\xf2\xff\ +\xc3\x01\xdc\x02\x02\xff\xd7\x01\xdc\x02\x03\xff\xd7\x01\xdc\x02\ +\x04\xff\xd7\x01\xdc\x02\x08\xff\x9a\x01\xdc\x02\x0c\xff\x9a\x01\ +\xdc\x02j\xff\xec\x01\xdc\x02s\xff\xc3\x01\xdc\x02\x7f\xff\ +\xec\x01\xdc\x02\x85\xff\xec\x01\xdc\x02\x87\xff\xec\x01\xdc\x02\ +\x89\xff\xec\x01\xdc\x02\x8d\xff\xec\x01\xdc\x02\xb2\xff\xec\x01\ +\xdc\x02\xb4\xff\xec\x01\xdc\x02\xcf\xff\xc3\x01\xdc\x02\xe0\xff\ +\xec\x01\xdc\x02\xf0\xff\xec\x01\xdc\x02\xf2\xff\xec\x01\xdc\x02\ +\xf4\xff\xec\x01\xdc\x03\x0a\xff\xec\x01\xdc\x03\x0c\xff\xec\x01\ +\xdc\x03\x12\xff\xc3\x01\xdc\x03\x16\xff\xec\x01\xdc\x03\x1a\xff\ +\xec\x01\xdc\x03\x1c\xff\xc3\x01\xdd\x00\x0f\xff\xae\x01\xdd\x00\ +\x11\xff\xae\x01\xdd\x01\xce\xff\xd7\x01\xdd\x01\xd5\xff\xd7\x01\ +\xdd\x01\xf2\xff\xd7\x01\xdd\x02\x08\xff\xae\x01\xdd\x02\x0c\xff\ +\xae\x01\xdd\x02s\xff\xd7\x01\xdd\x02\xcf\xff\xd7\x01\xdd\x03\ +\x12\xff\xd7\x01\xdd\x03\x1c\xff\xd7\x01\xde\x00\x05\xff\xec\x01\ +\xde\x00\x0a\xff\xec\x01\xde\x01\xd0\xff\xd7\x01\xde\x01\xdc\xff\ +\xec\x01\xde\x01\xdd\xff\xec\x01\xde\x01\xdf\xff\xd7\x01\xde\x01\ +\xe1\xff\xec\x01\xde\x01\xe4\xff\xec\x01\xde\x01\xf6\xff\xec\x01\ +\xde\x02\x07\xff\xec\x01\xde\x02\x0b\xff\xec\x01\xde\x02\xa0\xff\ +\xd7\x01\xde\x02\xaa\xff\xec\x01\xde\x02\xb6\xff\xec\x01\xde\x02\ +\xbc\xff\xd7\x01\xde\x02\xbe\xff\xec\x01\xde\x02\xc0\xff\xec\x01\ +\xde\x02\xc2\xff\xec\x01\xde\x02\xcb\xff\xd7\x01\xde\x02\xd5\xff\ +\xec\x01\xde\x02\xe6\xff\xd7\x01\xde\x02\xf8\xff\xec\x01\xde\x02\ +\xfa\xff\xec\x01\xde\x02\xfc\xff\xec\x01\xde\x02\xfe\xff\xec\x01\ +\xde\x03\x06\xff\xd7\x01\xde\x03\x08\xff\xd7\x01\xde\x03\x0e\xff\ +\xec\x01\xde\x03\x10\xff\xec\x01\xde\x03\x18\xff\xec\x01\xdf\x01\ +\xcf\xff\xd7\x01\xdf\x01\xd8\xff\xd7\x01\xdf\x01\xdb\xff\xd7\x01\ +\xdf\x01\xde\xff\xd7\x01\xdf\x01\xe1\xff\xd7\x01\xdf\x01\xea\xff\ +\xd7\x01\xdf\x01\xed\xff\xd7\x01\xdf\x02j\xff\xd7\x01\xdf\x02\ +\x7f\xff\xd7\x01\xdf\x02\x85\xff\xd7\x01\xdf\x02\x87\xff\xd7\x01\ +\xdf\x02\x89\xff\xd7\x01\xdf\x02\x8d\xff\xd7\x01\xdf\x02\xb2\xff\ +\xd7\x01\xdf\x02\xb4\xff\xd7\x01\xdf\x02\xc0\xff\xd7\x01\xdf\x02\ +\xc2\xff\xd7\x01\xdf\x02\xc6\xff\xd7\x01\xdf\x02\xc8\xff\xd7\x01\ +\xdf\x02\xd5\xff\xd7\x01\xdf\x02\xe0\xff\xd7\x01\xdf\x02\xf0\xff\ +\xd7\x01\xdf\x02\xf2\xff\xd7\x01\xdf\x02\xf4\xff\xd7\x01\xdf\x02\ +\xfe\xff\xd7\x01\xdf\x03\x0a\xff\xd7\x01\xdf\x03\x0c\xff\xd7\x01\ +\xdf\x03\x16\xff\xd7\x01\xdf\x03\x1a\xff\xd7\x01\xe0\x00\x05\xff\ +\xec\x01\xe0\x00\x0a\xff\xec\x01\xe0\x02\x07\xff\xec\x01\xe0\x02\ +\x0b\xff\xec\x01\xe3\x00\x05\xff\xec\x01\xe3\x00\x0a\xff\xec\x01\ +\xe3\x02\x07\xff\xec\x01\xe3\x02\x0b\xff\xec\x01\xe4\x00\x05\xff\ +\x85\x01\xe4\x00\x0a\xff\x85\x01\xe4\x01\xd0\xff\xd7\x01\xe4\x01\ +\xdc\xff\x9a\x01\xe4\x01\xdd\xff\xc3\x01\xe4\x01\xdf\xff\xd7\x01\ +\xe4\x01\xe1\xff\xae\x01\xe4\x01\xe4\xff\x9a\x01\xe4\x01\xf6\xff\ +\xc3\x01\xe4\x02\x07\xff\x85\x01\xe4\x02\x0b\xff\x85\x01\xe4\x02\ +m\xff\xd7\x01\xe4\x02\x81\xff\xd7\x01\xe4\x02\x83\xff\xd7\x01\ +\xe4\x02\x8b\xff\xd7\x01\xe4\x02\xa0\xff\xd7\x01\xe4\x02\xaa\xff\ +\x9a\x01\xe4\x02\xb6\xff\x9a\x01\xe4\x02\xb8\xff\xc3\x01\xe4\x02\ +\xba\xff\xc3\x01\xe4\x02\xbc\xff\xd7\x01\xe4\x02\xbe\xff\x9a\x01\ +\xe4\x02\xc0\xff\xae\x01\xe4\x02\xc2\xff\xae\x01\xe4\x02\xc6\xff\ +\xd7\x01\xe4\x02\xc8\xff\xd7\x01\xe4\x02\xcb\xff\xd7\x01\xe4\x02\ +\xd5\xff\xae\x01\xe4\x02\xe6\xff\xd7\x01\xe4\x02\xea\xff\xd7\x01\ +\xe4\x02\xf8\xff\xc3\x01\xe4\x02\xfa\xff\xc3\x01\xe4\x02\xfc\xff\ +\xc3\x01\xe4\x02\xfe\xff\xae\x01\xe4\x03\x06\xff\xd7\x01\xe4\x03\ +\x08\xff\xd7\x01\xe4\x03\x0e\xff\x9a\x01\xe4\x03\x10\xff\x9a\x01\ +\xe4\x03\x18\xff\x9a\x01\xe6\x00\x05\xff\x85\x01\xe6\x00\x0a\xff\ +\x85\x01\xe6\x01\xd0\xff\xd7\x01\xe6\x01\xdc\xff\x9a\x01\xe6\x01\ +\xdd\xff\xc3\x01\xe6\x01\xdf\xff\xd7\x01\xe6\x01\xe1\xff\xae\x01\ +\xe6\x01\xe4\xff\x9a\x01\xe6\x01\xf6\xff\xc3\x01\xe6\x02\x07\xff\ +\x85\x01\xe6\x02\x0b\xff\x85\x01\xe6\x02m\xff\xd7\x01\xe6\x02\ +\x81\xff\xd7\x01\xe6\x02\x83\xff\xd7\x01\xe6\x02\x8b\xff\xd7\x01\ +\xe6\x02\xa0\xff\xd7\x01\xe6\x02\xaa\xff\x9a\x01\xe6\x02\xb6\xff\ +\x9a\x01\xe6\x02\xb8\xff\xc3\x01\xe6\x02\xba\xff\xc3\x01\xe6\x02\ +\xbc\xff\xd7\x01\xe6\x02\xbe\xff\x9a\x01\xe6\x02\xc0\xff\xae\x01\ +\xe6\x02\xc2\xff\xae\x01\xe6\x02\xc6\xff\xd7\x01\xe6\x02\xc8\xff\ +\xd7\x01\xe6\x02\xcb\xff\xd7\x01\xe6\x02\xd5\xff\xae\x01\xe6\x02\ +\xe6\xff\xd7\x01\xe6\x02\xea\xff\xd7\x01\xe6\x02\xf8\xff\xc3\x01\ +\xe6\x02\xfa\xff\xc3\x01\xe6\x02\xfc\xff\xc3\x01\xe6\x02\xfe\xff\ +\xae\x01\xe6\x03\x06\xff\xd7\x01\xe6\x03\x08\xff\xd7\x01\xe6\x03\ +\x0e\xff\x9a\x01\xe6\x03\x10\xff\x9a\x01\xe6\x03\x18\xff\x9a\x01\ +\xe7\x00\x05\xff\xec\x01\xe7\x00\x0a\xff\xec\x01\xe7\x01\xd0\xff\ +\xd7\x01\xe7\x01\xdc\xff\xec\x01\xe7\x01\xdd\xff\xec\x01\xe7\x01\ +\xdf\xff\xd7\x01\xe7\x01\xe1\xff\xec\x01\xe7\x01\xe4\xff\xec\x01\ +\xe7\x01\xf6\xff\xec\x01\xe7\x02\x07\xff\xec\x01\xe7\x02\x0b\xff\ +\xec\x01\xe7\x02\xa0\xff\xd7\x01\xe7\x02\xaa\xff\xec\x01\xe7\x02\ +\xb6\xff\xec\x01\xe7\x02\xbc\xff\xd7\x01\xe7\x02\xbe\xff\xec\x01\ +\xe7\x02\xc0\xff\xec\x01\xe7\x02\xc2\xff\xec\x01\xe7\x02\xcb\xff\ +\xd7\x01\xe7\x02\xd5\xff\xec\x01\xe7\x02\xe6\xff\xd7\x01\xe7\x02\ +\xf8\xff\xec\x01\xe7\x02\xfa\xff\xec\x01\xe7\x02\xfc\xff\xec\x01\ +\xe7\x02\xfe\xff\xec\x01\xe7\x03\x06\xff\xd7\x01\xe7\x03\x08\xff\ +\xd7\x01\xe7\x03\x0e\xff\xec\x01\xe7\x03\x10\xff\xec\x01\xe7\x03\ +\x18\xff\xec\x01\xe8\x00\x05\xff\xec\x01\xe8\x00\x0a\xff\xec\x01\ +\xe8\x01\xd0\xff\xd7\x01\xe8\x01\xdc\xff\xec\x01\xe8\x01\xdd\xff\ +\xec\x01\xe8\x01\xdf\xff\xd7\x01\xe8\x01\xe1\xff\xec\x01\xe8\x01\ +\xe4\xff\xec\x01\xe8\x01\xf6\xff\xec\x01\xe8\x02\x07\xff\xec\x01\ +\xe8\x02\x0b\xff\xec\x01\xe8\x02\xa0\xff\xd7\x01\xe8\x02\xaa\xff\ +\xec\x01\xe8\x02\xb6\xff\xec\x01\xe8\x02\xbc\xff\xd7\x01\xe8\x02\ +\xbe\xff\xec\x01\xe8\x02\xc0\xff\xec\x01\xe8\x02\xc2\xff\xec\x01\ +\xe8\x02\xcb\xff\xd7\x01\xe8\x02\xd5\xff\xec\x01\xe8\x02\xe6\xff\ +\xd7\x01\xe8\x02\xf8\xff\xec\x01\xe8\x02\xfa\xff\xec\x01\xe8\x02\ +\xfc\xff\xec\x01\xe8\x02\xfe\xff\xec\x01\xe8\x03\x06\xff\xd7\x01\ +\xe8\x03\x08\xff\xd7\x01\xe8\x03\x0e\xff\xec\x01\xe8\x03\x10\xff\ +\xec\x01\xe8\x03\x18\xff\xec\x01\xea\x00\x05\xff\xec\x01\xea\x00\ +\x0a\xff\xec\x01\xea\x02\x07\xff\xec\x01\xea\x02\x0b\xff\xec\x01\ +\xeb\x00\x05\xff\xec\x01\xeb\x00\x0a\xff\xec\x01\xeb\x02\x07\xff\ +\xec\x01\xeb\x02\x0b\xff\xec\x01\xeb\x03\x0e\xff\xd7\x01\xeb\x03\ +\x10\xff\xd7\x01\xec\x00\x0f\xff\x9a\x01\xec\x00\x10\xff\xd7\x01\ +\xec\x00\x11\xff\x9a\x01\xec\x01\xce\xff\xc3\x01\xec\x01\xcf\xff\ +\xec\x01\xec\x01\xd5\xff\xc3\x01\xec\x01\xd8\xff\xec\x01\xec\x01\ +\xdb\xff\xec\x01\xec\x01\xde\xff\xec\x01\xec\x01\xea\xff\xec\x01\ +\xec\x01\xed\xff\xec\x01\xec\x01\xf2\xff\xc3\x01\xec\x02\x02\xff\ +\xd7\x01\xec\x02\x03\xff\xd7\x01\xec\x02\x04\xff\xd7\x01\xec\x02\ +\x08\xff\x9a\x01\xec\x02\x0c\xff\x9a\x01\xec\x02j\xff\xec\x01\ +\xec\x02s\xff\xc3\x01\xec\x02\x7f\xff\xec\x01\xec\x02\x85\xff\ +\xec\x01\xec\x02\x87\xff\xec\x01\xec\x02\x89\xff\xec\x01\xec\x02\ +\x8d\xff\xec\x01\xec\x02\xb2\xff\xec\x01\xec\x02\xb4\xff\xec\x01\ +\xec\x02\xcf\xff\xc3\x01\xec\x02\xe0\xff\xec\x01\xec\x02\xf0\xff\ +\xec\x01\xec\x02\xf2\xff\xec\x01\xec\x02\xf4\xff\xec\x01\xec\x03\ +\x0a\xff\xec\x01\xec\x03\x0c\xff\xec\x01\xec\x03\x12\xff\xc3\x01\ +\xec\x03\x16\xff\xec\x01\xec\x03\x1a\xff\xec\x01\xec\x03\x1c\xff\ +\xc3\x01\xf2\x00\x05\xff\x85\x01\xf2\x00\x0a\xff\x85\x01\xf2\x01\ +\xd0\xff\xd7\x01\xf2\x01\xdc\xff\x9a\x01\xf2\x01\xdd\xff\xc3\x01\ +\xf2\x01\xdf\xff\xd7\x01\xf2\x01\xe1\xff\xae\x01\xf2\x01\xe4\xff\ +\x9a\x01\xf2\x01\xf6\xff\xc3\x01\xf2\x02\x07\xff\x85\x01\xf2\x02\ +\x0b\xff\x85\x01\xf2\x02m\xff\xd7\x01\xf2\x02\x81\xff\xd7\x01\ +\xf2\x02\x83\xff\xd7\x01\xf2\x02\x8b\xff\xd7\x01\xf2\x02\xa0\xff\ +\xd7\x01\xf2\x02\xaa\xff\x9a\x01\xf2\x02\xb6\xff\x9a\x01\xf2\x02\ +\xb8\xff\xc3\x01\xf2\x02\xba\xff\xc3\x01\xf2\x02\xbc\xff\xd7\x01\ +\xf2\x02\xbe\xff\x9a\x01\xf2\x02\xc0\xff\xae\x01\xf2\x02\xc2\xff\ +\xae\x01\xf2\x02\xc6\xff\xd7\x01\xf2\x02\xc8\xff\xd7\x01\xf2\x02\ +\xcb\xff\xd7\x01\xf2\x02\xd5\xff\xae\x01\xf2\x02\xe6\xff\xd7\x01\ +\xf2\x02\xea\xff\xd7\x01\xf2\x02\xf8\xff\xc3\x01\xf2\x02\xfa\xff\ +\xc3\x01\xf2\x02\xfc\xff\xc3\x01\xf2\x02\xfe\xff\xae\x01\xf2\x03\ +\x06\xff\xd7\x01\xf2\x03\x08\xff\xd7\x01\xf2\x03\x0e\xff\x9a\x01\ +\xf2\x03\x10\xff\x9a\x01\xf2\x03\x18\xff\x9a\x01\xf3\x00\x05\xff\ +\x85\x01\xf3\x00\x0a\xff\x85\x01\xf3\x01\xd0\xff\xd7\x01\xf3\x01\ +\xdc\xff\x9a\x01\xf3\x01\xdd\xff\xc3\x01\xf3\x01\xdf\xff\xd7\x01\ +\xf3\x01\xe1\xff\xae\x01\xf3\x01\xe4\xff\x9a\x01\xf3\x01\xf6\xff\ +\xc3\x01\xf3\x02\x07\xff\x85\x01\xf3\x02\x0b\xff\x85\x01\xf3\x02\ +m\xff\xd7\x01\xf3\x02\x81\xff\xd7\x01\xf3\x02\x83\xff\xd7\x01\ +\xf3\x02\x8b\xff\xd7\x01\xf3\x02\xa0\xff\xd7\x01\xf3\x02\xaa\xff\ +\x9a\x01\xf3\x02\xb6\xff\x9a\x01\xf3\x02\xb8\xff\xc3\x01\xf3\x02\ +\xba\xff\xc3\x01\xf3\x02\xbc\xff\xd7\x01\xf3\x02\xbe\xff\x9a\x01\ +\xf3\x02\xc0\xff\xae\x01\xf3\x02\xc2\xff\xae\x01\xf3\x02\xc6\xff\ +\xd7\x01\xf3\x02\xc8\xff\xd7\x01\xf3\x02\xcb\xff\xd7\x01\xf3\x02\ +\xd5\xff\xae\x01\xf3\x02\xe6\xff\xd7\x01\xf3\x02\xea\xff\xd7\x01\ +\xf3\x02\xf8\xff\xc3\x01\xf3\x02\xfa\xff\xc3\x01\xf3\x02\xfc\xff\ +\xc3\x01\xf3\x02\xfe\xff\xae\x01\xf3\x03\x06\xff\xd7\x01\xf3\x03\ +\x08\xff\xd7\x01\xf3\x03\x0e\xff\x9a\x01\xf3\x03\x10\xff\x9a\x01\ +\xf3\x03\x18\xff\x9a\x01\xf4\x00\x05\xff\xec\x01\xf4\x00\x0a\xff\ +\xec\x01\xf4\x02\x07\xff\xec\x01\xf4\x02\x0b\xff\xec\x01\xf4\x03\ +\x0e\xff\xd7\x01\xf4\x03\x10\xff\xd7\x01\xf5\x01\xcf\xff\xd7\x01\ +\xf5\x01\xd8\xff\xd7\x01\xf5\x01\xdb\xff\xd7\x01\xf5\x01\xde\xff\ +\xd7\x01\xf5\x01\xe1\xff\xd7\x01\xf5\x01\xea\xff\xd7\x01\xf5\x01\ +\xed\xff\xd7\x01\xf5\x02j\xff\xd7\x01\xf5\x02\x7f\xff\xd7\x01\ +\xf5\x02\x85\xff\xd7\x01\xf5\x02\x87\xff\xd7\x01\xf5\x02\x89\xff\ +\xd7\x01\xf5\x02\x8d\xff\xd7\x01\xf5\x02\xb2\xff\xd7\x01\xf5\x02\ +\xb4\xff\xd7\x01\xf5\x02\xc0\xff\xd7\x01\xf5\x02\xc2\xff\xd7\x01\ +\xf5\x02\xc6\xff\xd7\x01\xf5\x02\xc8\xff\xd7\x01\xf5\x02\xd5\xff\ +\xd7\x01\xf5\x02\xe0\xff\xd7\x01\xf5\x02\xf0\xff\xd7\x01\xf5\x02\ +\xf2\xff\xd7\x01\xf5\x02\xf4\xff\xd7\x01\xf5\x02\xfe\xff\xd7\x01\ +\xf5\x03\x0a\xff\xd7\x01\xf5\x03\x0c\xff\xd7\x01\xf5\x03\x16\xff\ +\xd7\x01\xf5\x03\x1a\xff\xd7\x01\xf6\x00\x0f\xff\xae\x01\xf6\x00\ +\x11\xff\xae\x01\xf6\x01\xce\xff\xd7\x01\xf6\x01\xd5\xff\xd7\x01\ +\xf6\x01\xf2\xff\xd7\x01\xf6\x02\x08\xff\xae\x01\xf6\x02\x0c\xff\ +\xae\x01\xf6\x02s\xff\xd7\x01\xf6\x02\xcf\xff\xd7\x01\xf6\x03\ +\x12\xff\xd7\x01\xf6\x03\x1c\xff\xd7\x01\xf8\x00\x0f\xff\x85\x01\ +\xf8\x00\x10\xff\xae\x01\xf8\x00\x11\xff\x85\x01\xf8\x01\x9f\xff\ +\xd7\x01\xf8\x01\xa4\xff\x9a\x01\xf8\x01\xaa\xffq\x01\xf8\x01\ +\xae\xff\x9a\x01\xf8\x01\xb5\xff\x9a\x01\xf8\x01\xb8\xff\xd7\x01\ +\xf8\x01\xbb\xff\xd7\x01\xf8\x01\xbc\x00)\x01\xf8\x01\xbe\xff\ +\xae\x01\xf8\x01\xcc\xff\x9a\x01\xf8\x01\xcd\xff\x9a\x01\xf8\x01\ +\xce\xff\x85\x01\xf8\x01\xcf\xffq\x01\xf8\x01\xd0\xff\xd7\x01\ +\xf8\x01\xd1\xff\xd7\x01\xf8\x01\xd2\xff\x9a\x01\xf8\x01\xd3\xff\ +\x9a\x01\xf8\x01\xd4\xff\x9a\x01\xf8\x01\xd5\xff\x85\x01\xf8\x01\ +\xd6\xff\x9a\x01\xf8\x01\xd7\xff\x9a\x01\xf8\x01\xd8\xffq\x01\ +\xf8\x01\xd9\xff\x9a\x01\xf8\x01\xda\xff\x9a\x01\xf8\x01\xdb\xff\ +q\x01\xf8\x01\xdc\xff\xae\x01\xf8\x01\xdd\xff\xae\x01\xf8\x01\ +\xde\xffq\x01\xf8\x01\xdf\xff\xd7\x01\xf8\x01\xe0\xff\x9a\x01\ +\xf8\x01\xe1\xff\x9a\x01\xf8\x01\xe2\xff\x9a\x01\xf8\x01\xe3\xff\ +\x9a\x01\xf8\x01\xe4\xff\xae\x01\xf8\x01\xe5\xff\x9a\x01\xf8\x01\ +\xe6\xff\x9a\x01\xf8\x01\xe7\xff\xd7\x01\xf8\x01\xe8\xff\x9a\x01\ +\xf8\x01\xe9\xff\xc3\x01\xf8\x01\xea\xffq\x01\xf8\x01\xec\xff\ +\x9a\x01\xf8\x01\xed\xffq\x01\xf8\x01\xee\xff\x85\x01\xf8\x01\ +\xf2\xff\x85\x01\xf8\x01\xf3\xff\x9a\x01\xf8\x01\xf5\xff\x9a\x01\ +\xf8\x01\xf6\xff\xae\x01\xf8\x01\xf7\xff\x9a\x01\xf8\x01\xf9\xff\ +\x9a\x01\xf8\x02\x02\xff\xae\x01\xf8\x02\x03\xff\xae\x01\xf8\x02\ +\x04\xff\xae\x01\xf8\x02\x08\xff\x85\x01\xf8\x02\x0c\xff\x85\x01\ +\xf8\x02j\xffq\x01\xf8\x02k\xff\x9a\x01\xf8\x02l\xff\ +\xd7\x01\xf8\x02m\xff\xd7\x01\xf8\x02q\xff\x9a\x01\xf8\x02\ +r\xffq\x01\xf8\x02s\xff\x85\x01\xf8\x02u\xff\x9a\x01\ +\xf8\x02w\xff\x9a\x01\xf8\x02y\xff\x9a\x01\xf8\x02}\xff\ +\x9a\x01\xf8\x02~\xff\xd7\x01\xf8\x02\x7f\xffq\x01\xf8\x02\ +\x81\xff\xd7\x01\xf8\x02\x83\xff\xd7\x01\xf8\x02\x84\xff\xd7\x01\ +\xf8\x02\x85\xffq\x01\xf8\x02\x86\xff\xd7\x01\xf8\x02\x87\xff\ +q\x01\xf8\x02\x88\xff\xd7\x01\xf8\x02\x89\xffq\x01\xf8\x02\ +\x8a\xff\xd7\x01\xf8\x02\x8b\xff\xd7\x01\xf8\x02\x8c\xff\xd7\x01\ +\xf8\x02\x8d\xffq\x01\xf8\x02\x96\xff\x9a\x01\xf8\x02\x9a\xff\ +\x9a\x01\xf8\x02\x9e\xff\x9a\x01\xf8\x02\xa0\xff\xd7\x01\xf8\x02\ +\xa2\xff\xd7\x01\xf8\x02\xa4\xff\x9a\x01\xf8\x02\xa6\xff\x9a\x01\ +\xf8\x02\xaa\xff\xae\x01\xf8\x02\xac\xff\x9a\x01\xf8\x02\xae\xff\ +\x9a\x01\xf8\x02\xb0\xff\x9a\x01\xf8\x02\xb1\xff\xd7\x01\xf8\x02\ +\xb2\xffq\x01\xf8\x02\xb3\xff\xd7\x01\xf8\x02\xb4\xffq\x01\ +\xf8\x02\xb5\x00)\x01\xf8\x02\xb6\xff\xae\x01\xf8\x02\xb8\xff\ +\xae\x01\xf8\x02\xba\xff\xae\x01\xf8\x02\xbc\xff\xd7\x01\xf8\x02\ +\xbe\xff\xae\x01\xf8\x02\xc0\xff\x9a\x01\xf8\x02\xc2\xff\x9a\x01\ +\xf8\x02\xc4\xff\x9a\x01\xf8\x02\xc5\xff\x9a\x01\xf8\x02\xc6\xff\ +q\x01\xf8\x02\xc7\xff\x9a\x01\xf8\x02\xc8\xffq\x01\xf8\x02\ +\xcb\xff\xd7\x01\xf8\x02\xcd\xff\x9a\x01\xf8\x02\xce\xff\x9a\x01\ +\xf8\x02\xcf\xff\x85\x01\xf8\x02\xd1\xff\x9a\x01\xf8\x02\xd3\xff\ +\x9a\x01\xf8\x02\xd5\xff\x9a\x01\xf8\x02\xd7\xff\x9a\x01\xf8\x02\ +\xd9\xffq\x01\xf8\x02\xdb\xffq\x01\xf8\x02\xdd\xffq\x01\ +\xf8\x02\xe0\xffq\x01\xf8\x02\xe6\xff\xd7\x01\xf8\x02\xe8\xff\ +\xd7\x01\xf8\x02\xea\xff\xc3\x01\xf8\x02\xec\xff\x9a\x01\xf8\x02\ +\xee\xff\x9a\x01\xf8\x02\xef\xff\xd7\x01\xf8\x02\xf0\xffq\x01\ +\xf8\x02\xf1\xff\xd7\x01\xf8\x02\xf2\xffq\x01\xf8\x02\xf3\xff\ +\xd7\x01\xf8\x02\xf4\xffq\x01\xf8\x02\xf6\xff\xd7\x01\xf8\x02\ +\xf8\xff\xae\x01\xf8\x02\xfa\xff\xae\x01\xf8\x02\xfc\xff\xae\x01\ +\xf8\x02\xfe\xff\x9a\x01\xf8\x03\x00\xff\x9a\x01\xf8\x03\x02\xff\ +\x9a\x01\xf8\x03\x06\xff\xd7\x01\xf8\x03\x08\xff\xd7\x01\xf8\x03\ +\x09\xffq\x01\xf8\x03\x0a\xffq\x01\xf8\x03\x0b\xffq\x01\ +\xf8\x03\x0c\xffq\x01\xf8\x03\x0e\xff\x9a\x01\xf8\x03\x10\xff\ +\x9a\x01\xf8\x03\x11\xff\x9a\x01\xf8\x03\x12\xff\x85\x01\xf8\x03\ +\x14\xff\x9a\x01\xf8\x03\x15\xff\xd7\x01\xf8\x03\x16\xffq\x01\ +\xf8\x03\x18\xff\xae\x01\xf8\x03\x1a\xffq\x01\xf8\x03\x1b\xff\ +\x9a\x01\xf8\x03\x1c\xff\x85\x01\xf9\x00\x0f\xff\x9a\x01\xf9\x00\ +\x10\xff\xd7\x01\xf9\x00\x11\xff\x9a\x01\xf9\x01\xce\xff\xc3\x01\ +\xf9\x01\xcf\xff\xec\x01\xf9\x01\xd5\xff\xc3\x01\xf9\x01\xd8\xff\ +\xec\x01\xf9\x01\xdb\xff\xec\x01\xf9\x01\xde\xff\xec\x01\xf9\x01\ +\xea\xff\xec\x01\xf9\x01\xed\xff\xec\x01\xf9\x01\xf2\xff\xc3\x01\ +\xf9\x02\x02\xff\xd7\x01\xf9\x02\x03\xff\xd7\x01\xf9\x02\x04\xff\ +\xd7\x01\xf9\x02\x08\xff\x9a\x01\xf9\x02\x0c\xff\x9a\x01\xf9\x02\ +j\xff\xec\x01\xf9\x02s\xff\xc3\x01\xf9\x02\x7f\xff\xec\x01\ +\xf9\x02\x85\xff\xec\x01\xf9\x02\x87\xff\xec\x01\xf9\x02\x89\xff\ +\xec\x01\xf9\x02\x8d\xff\xec\x01\xf9\x02\xb2\xff\xec\x01\xf9\x02\ +\xb4\xff\xec\x01\xf9\x02\xcf\xff\xc3\x01\xf9\x02\xe0\xff\xec\x01\ +\xf9\x02\xf0\xff\xec\x01\xf9\x02\xf2\xff\xec\x01\xf9\x02\xf4\xff\ +\xec\x01\xf9\x03\x0a\xff\xec\x01\xf9\x03\x0c\xff\xec\x01\xf9\x03\ +\x12\xff\xc3\x01\xf9\x03\x16\xff\xec\x01\xf9\x03\x1a\xff\xec\x01\ +\xf9\x03\x1c\xff\xc3\x01\xfa\x00\x0f\xff\x9a\x01\xfa\x00\x11\xff\ +\x9a\x01\xfa\x00\x22\x00)\x01\xfa\x00$\xff\xae\x01\xfa\x00\ +&\xff\xec\x01\xfa\x00*\xff\xec\x01\xfa\x002\xff\xec\x01\ +\xfa\x004\xff\xec\x01\xfa\x00D\xff\xd7\x01\xfa\x00F\xff\ +\xd7\x01\xfa\x00G\xff\xd7\x01\xfa\x00H\xff\xd7\x01\xfa\x00\ +J\xff\xec\x01\xfa\x00P\xff\xec\x01\xfa\x00Q\xff\xec\x01\ +\xfa\x00R\xff\xd7\x01\xfa\x00S\xff\xec\x01\xfa\x00T\xff\ +\xd7\x01\xfa\x00U\xff\xec\x01\xfa\x00V\xff\xec\x01\xfa\x00\ +X\xff\xec\x01\xfa\x00\x82\xff\xae\x01\xfa\x00\x83\xff\xae\x01\ +\xfa\x00\x84\xff\xae\x01\xfa\x00\x85\xff\xae\x01\xfa\x00\x86\xff\ +\xae\x01\xfa\x00\x87\xff\xae\x01\xfa\x00\x89\xff\xec\x01\xfa\x00\ +\x94\xff\xec\x01\xfa\x00\x95\xff\xec\x01\xfa\x00\x96\xff\xec\x01\ +\xfa\x00\x97\xff\xec\x01\xfa\x00\x98\xff\xec\x01\xfa\x00\x9a\xff\ +\xec\x01\xfa\x00\xa2\xff\xd7\x01\xfa\x00\xa3\xff\xd7\x01\xfa\x00\ +\xa4\xff\xd7\x01\xfa\x00\xa5\xff\xd7\x01\xfa\x00\xa6\xff\xd7\x01\ +\xfa\x00\xa7\xff\xd7\x01\xfa\x00\xa8\xff\xd7\x01\xfa\x00\xa9\xff\ +\xd7\x01\xfa\x00\xaa\xff\xd7\x01\xfa\x00\xab\xff\xd7\x01\xfa\x00\ +\xac\xff\xd7\x01\xfa\x00\xad\xff\xd7\x01\xfa\x00\xb4\xff\xd7\x01\ +\xfa\x00\xb5\xff\xd7\x01\xfa\x00\xb6\xff\xd7\x01\xfa\x00\xb7\xff\ +\xd7\x01\xfa\x00\xb8\xff\xd7\x01\xfa\x00\xba\xff\xd7\x01\xfa\x00\ +\xbb\xff\xec\x01\xfa\x00\xbc\xff\xec\x01\xfa\x00\xbd\xff\xec\x01\ +\xfa\x00\xbe\xff\xec\x01\xfa\x00\xc2\xff\xae\x01\xfa\x00\xc3\xff\ +\xd7\x01\xfa\x00\xc4\xff\xae\x01\xfa\x00\xc5\xff\xd7\x01\xfa\x00\ +\xc6\xff\xae\x01\xfa\x00\xc7\xff\xd7\x01\xfa\x00\xc8\xff\xec\x01\ +\xfa\x00\xc9\xff\xd7\x01\xfa\x00\xca\xff\xec\x01\xfa\x00\xcb\xff\ +\xd7\x01\xfa\x00\xcc\xff\xec\x01\xfa\x00\xcd\xff\xd7\x01\xfa\x00\ +\xce\xff\xec\x01\xfa\x00\xcf\xff\xd7\x01\xfa\x00\xd1\xff\xd7\x01\ +\xfa\x00\xd3\xff\xd7\x01\xfa\x00\xd5\xff\xd7\x01\xfa\x00\xd7\xff\ +\xd7\x01\xfa\x00\xd9\xff\xd7\x01\xfa\x00\xdb\xff\xd7\x01\xfa\x00\ +\xdd\xff\xd7\x01\xfa\x00\xde\xff\xec\x01\xfa\x00\xdf\xff\xec\x01\ +\xfa\x00\xe0\xff\xec\x01\xfa\x00\xe1\xff\xec\x01\xfa\x00\xe2\xff\ +\xec\x01\xfa\x00\xe3\xff\xec\x01\xfa\x00\xe4\xff\xec\x01\xfa\x00\ +\xe5\xff\xec\x01\xfa\x00\xfa\xff\xec\x01\xfa\x01\x06\xff\xec\x01\ +\xfa\x01\x08\xff\xec\x01\xfa\x01\x0d\xff\xec\x01\xfa\x01\x0e\xff\ +\xec\x01\xfa\x01\x0f\xff\xd7\x01\xfa\x01\x10\xff\xec\x01\xfa\x01\ +\x11\xff\xd7\x01\xfa\x01\x12\xff\xec\x01\xfa\x01\x13\xff\xd7\x01\ +\xfa\x01\x14\xff\xec\x01\xfa\x01\x15\xff\xd7\x01\xfa\x01\x17\xff\ +\xec\x01\xfa\x01\x19\xff\xec\x01\xfa\x01\x1d\xff\xec\x01\xfa\x01\ +!\xff\xec\x01\xfa\x01+\xff\xec\x01\xfa\x01-\xff\xec\x01\ +\xfa\x01/\xff\xec\x01\xfa\x011\xff\xec\x01\xfa\x013\xff\ +\xec\x01\xfa\x015\xff\xec\x01\xfa\x01C\xff\xae\x01\xfa\x01\ +D\xff\xd7\x01\xfa\x01F\xff\xd7\x01\xfa\x01G\xff\xec\x01\ +\xfa\x01H\xff\xd7\x01\xfa\x01J\xff\xec\x01\xfa\x02\x08\xff\ +\x9a\x01\xfa\x02\x0c\xff\x9a\x01\xfa\x02W\xff\xec\x01\xfa\x02\ +X\xff\xae\x01\xfa\x02Y\xff\xd7\x01\xfa\x02_\xff\xec\x01\ +\xfa\x02`\xff\xd7\x01\xfa\x02b\xff\xec\x01\xfa\x03\x1d\xff\ +\xae\x01\xfa\x03\x1e\xff\xd7\x01\xfa\x03\x1f\xff\xae\x01\xfa\x03\ + \xff\xd7\x01\xfa\x03!\xff\xae\x01\xfa\x03\x22\xff\xd7\x01\ +\xfa\x03#\xff\xae\x01\xfa\x03%\xff\xae\x01\xfa\x03&\xff\ +\xd7\x01\xfa\x03'\xff\xae\x01\xfa\x03(\xff\xd7\x01\xfa\x03\ +)\xff\xae\x01\xfa\x03*\xff\xd7\x01\xfa\x03+\xff\xae\x01\ +\xfa\x03,\xff\xd7\x01\xfa\x03-\xff\xae\x01\xfa\x03.\xff\ +\xd7\x01\xfa\x03/\xff\xae\x01\xfa\x030\xff\xd7\x01\xfa\x03\ +1\xff\xae\x01\xfa\x032\xff\xd7\x01\xfa\x033\xff\xae\x01\ +\xfa\x034\xff\xd7\x01\xfa\x036\xff\xd7\x01\xfa\x038\xff\ +\xd7\x01\xfa\x03:\xff\xd7\x01\xfa\x03<\xff\xd7\x01\xfa\x03\ +@\xff\xd7\x01\xfa\x03B\xff\xd7\x01\xfa\x03D\xff\xd7\x01\ +\xfa\x03I\xff\xec\x01\xfa\x03J\xff\xd7\x01\xfa\x03K\xff\ +\xec\x01\xfa\x03L\xff\xd7\x01\xfa\x03M\xff\xec\x01\xfa\x03\ +N\xff\xd7\x01\xfa\x03O\xff\xec\x01\xfa\x03Q\xff\xec\x01\ +\xfa\x03R\xff\xd7\x01\xfa\x03S\xff\xec\x01\xfa\x03T\xff\ +\xd7\x01\xfa\x03U\xff\xec\x01\xfa\x03V\xff\xd7\x01\xfa\x03\ +W\xff\xec\x01\xfa\x03X\xff\xd7\x01\xfa\x03Y\xff\xec\x01\ +\xfa\x03Z\xff\xd7\x01\xfa\x03[\xff\xec\x01\xfa\x03\x5c\xff\ +\xd7\x01\xfa\x03]\xff\xec\x01\xfa\x03^\xff\xd7\x01\xfa\x03\ +_\xff\xec\x01\xfa\x03`\xff\xd7\x01\xfa\x03b\xff\xec\x01\ +\xfa\x03d\xff\xec\x01\xfa\x03f\xff\xec\x01\xfa\x03h\xff\ +\xec\x01\xfa\x03j\xff\xec\x01\xfa\x03l\xff\xec\x01\xfa\x03\ +n\xff\xec\x01\xfb\x00\x05\x00R\x01\xfb\x00\x0a\x00R\x01\ +\xfb\x00\x0f\xff\xae\x01\xfb\x00\x11\xff\xae\x01\xfb\x00\x22\x00\ +)\x01\xfb\x02\x07\x00R\x01\xfb\x02\x08\xff\xae\x01\xfb\x02\ +\x0b\x00R\x01\xfb\x02\x0c\xff\xae\x01\xfc\x00\x0f\xff\x9a\x01\ +\xfc\x00\x11\xff\x9a\x01\xfc\x00\x22\x00)\x01\xfc\x00$\xff\ +\xae\x01\xfc\x00&\xff\xec\x01\xfc\x00*\xff\xec\x01\xfc\x00\ +2\xff\xec\x01\xfc\x004\xff\xec\x01\xfc\x00D\xff\xd7\x01\ +\xfc\x00F\xff\xd7\x01\xfc\x00G\xff\xd7\x01\xfc\x00H\xff\ +\xd7\x01\xfc\x00J\xff\xec\x01\xfc\x00P\xff\xec\x01\xfc\x00\ +Q\xff\xec\x01\xfc\x00R\xff\xd7\x01\xfc\x00S\xff\xec\x01\ +\xfc\x00T\xff\xd7\x01\xfc\x00U\xff\xec\x01\xfc\x00V\xff\ +\xec\x01\xfc\x00X\xff\xec\x01\xfc\x00\x82\xff\xae\x01\xfc\x00\ +\x83\xff\xae\x01\xfc\x00\x84\xff\xae\x01\xfc\x00\x85\xff\xae\x01\ +\xfc\x00\x86\xff\xae\x01\xfc\x00\x87\xff\xae\x01\xfc\x00\x89\xff\ +\xec\x01\xfc\x00\x94\xff\xec\x01\xfc\x00\x95\xff\xec\x01\xfc\x00\ +\x96\xff\xec\x01\xfc\x00\x97\xff\xec\x01\xfc\x00\x98\xff\xec\x01\ +\xfc\x00\x9a\xff\xec\x01\xfc\x00\xa2\xff\xd7\x01\xfc\x00\xa3\xff\ +\xd7\x01\xfc\x00\xa4\xff\xd7\x01\xfc\x00\xa5\xff\xd7\x01\xfc\x00\ +\xa6\xff\xd7\x01\xfc\x00\xa7\xff\xd7\x01\xfc\x00\xa8\xff\xd7\x01\ +\xfc\x00\xa9\xff\xd7\x01\xfc\x00\xaa\xff\xd7\x01\xfc\x00\xab\xff\ +\xd7\x01\xfc\x00\xac\xff\xd7\x01\xfc\x00\xad\xff\xd7\x01\xfc\x00\ +\xb4\xff\xd7\x01\xfc\x00\xb5\xff\xd7\x01\xfc\x00\xb6\xff\xd7\x01\ +\xfc\x00\xb7\xff\xd7\x01\xfc\x00\xb8\xff\xd7\x01\xfc\x00\xba\xff\ +\xd7\x01\xfc\x00\xbb\xff\xec\x01\xfc\x00\xbc\xff\xec\x01\xfc\x00\ +\xbd\xff\xec\x01\xfc\x00\xbe\xff\xec\x01\xfc\x00\xc2\xff\xae\x01\ +\xfc\x00\xc3\xff\xd7\x01\xfc\x00\xc4\xff\xae\x01\xfc\x00\xc5\xff\ +\xd7\x01\xfc\x00\xc6\xff\xae\x01\xfc\x00\xc7\xff\xd7\x01\xfc\x00\ +\xc8\xff\xec\x01\xfc\x00\xc9\xff\xd7\x01\xfc\x00\xca\xff\xec\x01\ +\xfc\x00\xcb\xff\xd7\x01\xfc\x00\xcc\xff\xec\x01\xfc\x00\xcd\xff\ +\xd7\x01\xfc\x00\xce\xff\xec\x01\xfc\x00\xcf\xff\xd7\x01\xfc\x00\ +\xd1\xff\xd7\x01\xfc\x00\xd3\xff\xd7\x01\xfc\x00\xd5\xff\xd7\x01\ +\xfc\x00\xd7\xff\xd7\x01\xfc\x00\xd9\xff\xd7\x01\xfc\x00\xdb\xff\ +\xd7\x01\xfc\x00\xdd\xff\xd7\x01\xfc\x00\xde\xff\xec\x01\xfc\x00\ +\xdf\xff\xec\x01\xfc\x00\xe0\xff\xec\x01\xfc\x00\xe1\xff\xec\x01\ +\xfc\x00\xe2\xff\xec\x01\xfc\x00\xe3\xff\xec\x01\xfc\x00\xe4\xff\ +\xec\x01\xfc\x00\xe5\xff\xec\x01\xfc\x00\xfa\xff\xec\x01\xfc\x01\ +\x06\xff\xec\x01\xfc\x01\x08\xff\xec\x01\xfc\x01\x0d\xff\xec\x01\ +\xfc\x01\x0e\xff\xec\x01\xfc\x01\x0f\xff\xd7\x01\xfc\x01\x10\xff\ +\xec\x01\xfc\x01\x11\xff\xd7\x01\xfc\x01\x12\xff\xec\x01\xfc\x01\ +\x13\xff\xd7\x01\xfc\x01\x14\xff\xec\x01\xfc\x01\x15\xff\xd7\x01\ +\xfc\x01\x17\xff\xec\x01\xfc\x01\x19\xff\xec\x01\xfc\x01\x1d\xff\ +\xec\x01\xfc\x01!\xff\xec\x01\xfc\x01+\xff\xec\x01\xfc\x01\ +-\xff\xec\x01\xfc\x01/\xff\xec\x01\xfc\x011\xff\xec\x01\ +\xfc\x013\xff\xec\x01\xfc\x015\xff\xec\x01\xfc\x01C\xff\ +\xae\x01\xfc\x01D\xff\xd7\x01\xfc\x01F\xff\xd7\x01\xfc\x01\ +G\xff\xec\x01\xfc\x01H\xff\xd7\x01\xfc\x01J\xff\xec\x01\ +\xfc\x02\x08\xff\x9a\x01\xfc\x02\x0c\xff\x9a\x01\xfc\x02W\xff\ +\xec\x01\xfc\x02X\xff\xae\x01\xfc\x02Y\xff\xd7\x01\xfc\x02\ +_\xff\xec\x01\xfc\x02`\xff\xd7\x01\xfc\x02b\xff\xec\x01\ +\xfc\x03\x1d\xff\xae\x01\xfc\x03\x1e\xff\xd7\x01\xfc\x03\x1f\xff\ +\xae\x01\xfc\x03 \xff\xd7\x01\xfc\x03!\xff\xae\x01\xfc\x03\ +\x22\xff\xd7\x01\xfc\x03#\xff\xae\x01\xfc\x03%\xff\xae\x01\ +\xfc\x03&\xff\xd7\x01\xfc\x03'\xff\xae\x01\xfc\x03(\xff\ +\xd7\x01\xfc\x03)\xff\xae\x01\xfc\x03*\xff\xd7\x01\xfc\x03\ ++\xff\xae\x01\xfc\x03,\xff\xd7\x01\xfc\x03-\xff\xae\x01\ +\xfc\x03.\xff\xd7\x01\xfc\x03/\xff\xae\x01\xfc\x030\xff\ +\xd7\x01\xfc\x031\xff\xae\x01\xfc\x032\xff\xd7\x01\xfc\x03\ +3\xff\xae\x01\xfc\x034\xff\xd7\x01\xfc\x036\xff\xd7\x01\ +\xfc\x038\xff\xd7\x01\xfc\x03:\xff\xd7\x01\xfc\x03<\xff\ +\xd7\x01\xfc\x03@\xff\xd7\x01\xfc\x03B\xff\xd7\x01\xfc\x03\ +D\xff\xd7\x01\xfc\x03I\xff\xec\x01\xfc\x03J\xff\xd7\x01\ +\xfc\x03K\xff\xec\x01\xfc\x03L\xff\xd7\x01\xfc\x03M\xff\ +\xec\x01\xfc\x03N\xff\xd7\x01\xfc\x03O\xff\xec\x01\xfc\x03\ +Q\xff\xec\x01\xfc\x03R\xff\xd7\x01\xfc\x03S\xff\xec\x01\ +\xfc\x03T\xff\xd7\x01\xfc\x03U\xff\xec\x01\xfc\x03V\xff\ +\xd7\x01\xfc\x03W\xff\xec\x01\xfc\x03X\xff\xd7\x01\xfc\x03\ +Y\xff\xec\x01\xfc\x03Z\xff\xd7\x01\xfc\x03[\xff\xec\x01\ +\xfc\x03\x5c\xff\xd7\x01\xfc\x03]\xff\xec\x01\xfc\x03^\xff\ +\xd7\x01\xfc\x03_\xff\xec\x01\xfc\x03`\xff\xd7\x01\xfc\x03\ +b\xff\xec\x01\xfc\x03d\xff\xec\x01\xfc\x03f\xff\xec\x01\ +\xfc\x03h\xff\xec\x01\xfc\x03j\xff\xec\x01\xfc\x03l\xff\ +\xec\x01\xfc\x03n\xff\xec\x01\xfd\x00\x05\x00R\x01\xfd\x00\ +\x0a\x00R\x01\xfd\x00\x0f\xff\xae\x01\xfd\x00\x11\xff\xae\x01\ +\xfd\x00\x22\x00)\x01\xfd\x02\x07\x00R\x01\xfd\x02\x08\xff\ +\xae\x01\xfd\x02\x0b\x00R\x01\xfd\x02\x0c\xff\xae\x01\xfe\x00\ +\x0f\xff\x9a\x01\xfe\x00\x11\xff\x9a\x01\xfe\x00\x22\x00)\x01\ +\xfe\x00$\xff\xae\x01\xfe\x00&\xff\xec\x01\xfe\x00*\xff\ +\xec\x01\xfe\x002\xff\xec\x01\xfe\x004\xff\xec\x01\xfe\x00\ +D\xff\xd7\x01\xfe\x00F\xff\xd7\x01\xfe\x00G\xff\xd7\x01\ +\xfe\x00H\xff\xd7\x01\xfe\x00J\xff\xec\x01\xfe\x00P\xff\ +\xec\x01\xfe\x00Q\xff\xec\x01\xfe\x00R\xff\xd7\x01\xfe\x00\ +S\xff\xec\x01\xfe\x00T\xff\xd7\x01\xfe\x00U\xff\xec\x01\ +\xfe\x00V\xff\xec\x01\xfe\x00X\xff\xec\x01\xfe\x00\x82\xff\ +\xae\x01\xfe\x00\x83\xff\xae\x01\xfe\x00\x84\xff\xae\x01\xfe\x00\ +\x85\xff\xae\x01\xfe\x00\x86\xff\xae\x01\xfe\x00\x87\xff\xae\x01\ +\xfe\x00\x89\xff\xec\x01\xfe\x00\x94\xff\xec\x01\xfe\x00\x95\xff\ +\xec\x01\xfe\x00\x96\xff\xec\x01\xfe\x00\x97\xff\xec\x01\xfe\x00\ +\x98\xff\xec\x01\xfe\x00\x9a\xff\xec\x01\xfe\x00\xa2\xff\xd7\x01\ +\xfe\x00\xa3\xff\xd7\x01\xfe\x00\xa4\xff\xd7\x01\xfe\x00\xa5\xff\ +\xd7\x01\xfe\x00\xa6\xff\xd7\x01\xfe\x00\xa7\xff\xd7\x01\xfe\x00\ +\xa8\xff\xd7\x01\xfe\x00\xa9\xff\xd7\x01\xfe\x00\xaa\xff\xd7\x01\ +\xfe\x00\xab\xff\xd7\x01\xfe\x00\xac\xff\xd7\x01\xfe\x00\xad\xff\ +\xd7\x01\xfe\x00\xb4\xff\xd7\x01\xfe\x00\xb5\xff\xd7\x01\xfe\x00\ +\xb6\xff\xd7\x01\xfe\x00\xb7\xff\xd7\x01\xfe\x00\xb8\xff\xd7\x01\ +\xfe\x00\xba\xff\xd7\x01\xfe\x00\xbb\xff\xec\x01\xfe\x00\xbc\xff\ +\xec\x01\xfe\x00\xbd\xff\xec\x01\xfe\x00\xbe\xff\xec\x01\xfe\x00\ +\xc2\xff\xae\x01\xfe\x00\xc3\xff\xd7\x01\xfe\x00\xc4\xff\xae\x01\ +\xfe\x00\xc5\xff\xd7\x01\xfe\x00\xc6\xff\xae\x01\xfe\x00\xc7\xff\ +\xd7\x01\xfe\x00\xc8\xff\xec\x01\xfe\x00\xc9\xff\xd7\x01\xfe\x00\ +\xca\xff\xec\x01\xfe\x00\xcb\xff\xd7\x01\xfe\x00\xcc\xff\xec\x01\ +\xfe\x00\xcd\xff\xd7\x01\xfe\x00\xce\xff\xec\x01\xfe\x00\xcf\xff\ +\xd7\x01\xfe\x00\xd1\xff\xd7\x01\xfe\x00\xd3\xff\xd7\x01\xfe\x00\ +\xd5\xff\xd7\x01\xfe\x00\xd7\xff\xd7\x01\xfe\x00\xd9\xff\xd7\x01\ +\xfe\x00\xdb\xff\xd7\x01\xfe\x00\xdd\xff\xd7\x01\xfe\x00\xde\xff\ +\xec\x01\xfe\x00\xdf\xff\xec\x01\xfe\x00\xe0\xff\xec\x01\xfe\x00\ +\xe1\xff\xec\x01\xfe\x00\xe2\xff\xec\x01\xfe\x00\xe3\xff\xec\x01\ +\xfe\x00\xe4\xff\xec\x01\xfe\x00\xe5\xff\xec\x01\xfe\x00\xfa\xff\ +\xec\x01\xfe\x01\x06\xff\xec\x01\xfe\x01\x08\xff\xec\x01\xfe\x01\ +\x0d\xff\xec\x01\xfe\x01\x0e\xff\xec\x01\xfe\x01\x0f\xff\xd7\x01\ +\xfe\x01\x10\xff\xec\x01\xfe\x01\x11\xff\xd7\x01\xfe\x01\x12\xff\ +\xec\x01\xfe\x01\x13\xff\xd7\x01\xfe\x01\x14\xff\xec\x01\xfe\x01\ +\x15\xff\xd7\x01\xfe\x01\x17\xff\xec\x01\xfe\x01\x19\xff\xec\x01\ +\xfe\x01\x1d\xff\xec\x01\xfe\x01!\xff\xec\x01\xfe\x01+\xff\ +\xec\x01\xfe\x01-\xff\xec\x01\xfe\x01/\xff\xec\x01\xfe\x01\ +1\xff\xec\x01\xfe\x013\xff\xec\x01\xfe\x015\xff\xec\x01\ +\xfe\x01C\xff\xae\x01\xfe\x01D\xff\xd7\x01\xfe\x01F\xff\ +\xd7\x01\xfe\x01G\xff\xec\x01\xfe\x01H\xff\xd7\x01\xfe\x01\ +J\xff\xec\x01\xfe\x02\x08\xff\x9a\x01\xfe\x02\x0c\xff\x9a\x01\ +\xfe\x02W\xff\xec\x01\xfe\x02X\xff\xae\x01\xfe\x02Y\xff\ +\xd7\x01\xfe\x02_\xff\xec\x01\xfe\x02`\xff\xd7\x01\xfe\x02\ +b\xff\xec\x01\xfe\x03\x1d\xff\xae\x01\xfe\x03\x1e\xff\xd7\x01\ +\xfe\x03\x1f\xff\xae\x01\xfe\x03 \xff\xd7\x01\xfe\x03!\xff\ +\xae\x01\xfe\x03\x22\xff\xd7\x01\xfe\x03#\xff\xae\x01\xfe\x03\ +%\xff\xae\x01\xfe\x03&\xff\xd7\x01\xfe\x03'\xff\xae\x01\ +\xfe\x03(\xff\xd7\x01\xfe\x03)\xff\xae\x01\xfe\x03*\xff\ +\xd7\x01\xfe\x03+\xff\xae\x01\xfe\x03,\xff\xd7\x01\xfe\x03\ +-\xff\xae\x01\xfe\x03.\xff\xd7\x01\xfe\x03/\xff\xae\x01\ +\xfe\x030\xff\xd7\x01\xfe\x031\xff\xae\x01\xfe\x032\xff\ +\xd7\x01\xfe\x033\xff\xae\x01\xfe\x034\xff\xd7\x01\xfe\x03\ +6\xff\xd7\x01\xfe\x038\xff\xd7\x01\xfe\x03:\xff\xd7\x01\ +\xfe\x03<\xff\xd7\x01\xfe\x03@\xff\xd7\x01\xfe\x03B\xff\ +\xd7\x01\xfe\x03D\xff\xd7\x01\xfe\x03I\xff\xec\x01\xfe\x03\ +J\xff\xd7\x01\xfe\x03K\xff\xec\x01\xfe\x03L\xff\xd7\x01\ +\xfe\x03M\xff\xec\x01\xfe\x03N\xff\xd7\x01\xfe\x03O\xff\ +\xec\x01\xfe\x03Q\xff\xec\x01\xfe\x03R\xff\xd7\x01\xfe\x03\ +S\xff\xec\x01\xfe\x03T\xff\xd7\x01\xfe\x03U\xff\xec\x01\ +\xfe\x03V\xff\xd7\x01\xfe\x03W\xff\xec\x01\xfe\x03X\xff\ +\xd7\x01\xfe\x03Y\xff\xec\x01\xfe\x03Z\xff\xd7\x01\xfe\x03\ +[\xff\xec\x01\xfe\x03\x5c\xff\xd7\x01\xfe\x03]\xff\xec\x01\ +\xfe\x03^\xff\xd7\x01\xfe\x03_\xff\xec\x01\xfe\x03`\xff\ +\xd7\x01\xfe\x03b\xff\xec\x01\xfe\x03d\xff\xec\x01\xfe\x03\ +f\xff\xec\x01\xfe\x03h\xff\xec\x01\xfe\x03j\xff\xec\x01\ +\xfe\x03l\xff\xec\x01\xfe\x03n\xff\xec\x01\xff\x00\x05\x00\ +R\x01\xff\x00\x0a\x00R\x01\xff\x00\x0f\xff\xae\x01\xff\x00\ +\x11\xff\xae\x01\xff\x00\x22\x00)\x01\xff\x02\x07\x00R\x01\ +\xff\x02\x08\xff\xae\x01\xff\x02\x0b\x00R\x01\xff\x02\x0c\xff\ +\xae\x02\x00\x00\x0f\xff\x85\x02\x00\x00\x11\xff\x85\x02\x00\x00\ +\x22\x00)\x02\x00\x00$\xff\x85\x02\x00\x00&\xff\xd7\x02\ +\x00\x00*\xff\xd7\x02\x00\x002\xff\xd7\x02\x00\x004\xff\ +\xd7\x02\x00\x00D\xff\x9a\x02\x00\x00F\xff\x9a\x02\x00\x00\ +G\xff\x9a\x02\x00\x00H\xff\x9a\x02\x00\x00J\xff\xd7\x02\ +\x00\x00P\xff\xc3\x02\x00\x00Q\xff\xc3\x02\x00\x00R\xff\ +\x9a\x02\x00\x00S\xff\xc3\x02\x00\x00T\xff\x9a\x02\x00\x00\ +U\xff\xc3\x02\x00\x00V\xff\xae\x02\x00\x00X\xff\xc3\x02\ +\x00\x00]\xff\xd7\x02\x00\x00\x82\xff\x85\x02\x00\x00\x83\xff\ +\x85\x02\x00\x00\x84\xff\x85\x02\x00\x00\x85\xff\x85\x02\x00\x00\ +\x86\xff\x85\x02\x00\x00\x87\xff\x85\x02\x00\x00\x89\xff\xd7\x02\ +\x00\x00\x94\xff\xd7\x02\x00\x00\x95\xff\xd7\x02\x00\x00\x96\xff\ +\xd7\x02\x00\x00\x97\xff\xd7\x02\x00\x00\x98\xff\xd7\x02\x00\x00\ +\x9a\xff\xd7\x02\x00\x00\xa2\xff\x9a\x02\x00\x00\xa3\xff\x9a\x02\ +\x00\x00\xa4\xff\x9a\x02\x00\x00\xa5\xff\x9a\x02\x00\x00\xa6\xff\ +\x9a\x02\x00\x00\xa7\xff\x9a\x02\x00\x00\xa8\xff\x9a\x02\x00\x00\ +\xa9\xff\x9a\x02\x00\x00\xaa\xff\x9a\x02\x00\x00\xab\xff\x9a\x02\ +\x00\x00\xac\xff\x9a\x02\x00\x00\xad\xff\x9a\x02\x00\x00\xb4\xff\ +\x9a\x02\x00\x00\xb5\xff\x9a\x02\x00\x00\xb6\xff\x9a\x02\x00\x00\ +\xb7\xff\x9a\x02\x00\x00\xb8\xff\x9a\x02\x00\x00\xba\xff\x9a\x02\ +\x00\x00\xbb\xff\xc3\x02\x00\x00\xbc\xff\xc3\x02\x00\x00\xbd\xff\ +\xc3\x02\x00\x00\xbe\xff\xc3\x02\x00\x00\xc2\xff\x85\x02\x00\x00\ +\xc3\xff\x9a\x02\x00\x00\xc4\xff\x85\x02\x00\x00\xc5\xff\x9a\x02\ +\x00\x00\xc6\xff\x85\x02\x00\x00\xc7\xff\x9a\x02\x00\x00\xc8\xff\ +\xd7\x02\x00\x00\xc9\xff\x9a\x02\x00\x00\xca\xff\xd7\x02\x00\x00\ +\xcb\xff\x9a\x02\x00\x00\xcc\xff\xd7\x02\x00\x00\xcd\xff\x9a\x02\ +\x00\x00\xce\xff\xd7\x02\x00\x00\xcf\xff\x9a\x02\x00\x00\xd1\xff\ +\x9a\x02\x00\x00\xd3\xff\x9a\x02\x00\x00\xd5\xff\x9a\x02\x00\x00\ +\xd7\xff\x9a\x02\x00\x00\xd9\xff\x9a\x02\x00\x00\xdb\xff\x9a\x02\ +\x00\x00\xdd\xff\x9a\x02\x00\x00\xde\xff\xd7\x02\x00\x00\xdf\xff\ +\xd7\x02\x00\x00\xe0\xff\xd7\x02\x00\x00\xe1\xff\xd7\x02\x00\x00\ +\xe2\xff\xd7\x02\x00\x00\xe3\xff\xd7\x02\x00\x00\xe4\xff\xd7\x02\ +\x00\x00\xe5\xff\xd7\x02\x00\x00\xfa\xff\xc3\x02\x00\x01\x06\xff\ +\xc3\x02\x00\x01\x08\xff\xc3\x02\x00\x01\x0d\xff\xc3\x02\x00\x01\ +\x0e\xff\xd7\x02\x00\x01\x0f\xff\x9a\x02\x00\x01\x10\xff\xd7\x02\ +\x00\x01\x11\xff\x9a\x02\x00\x01\x12\xff\xd7\x02\x00\x01\x13\xff\ +\x9a\x02\x00\x01\x14\xff\xd7\x02\x00\x01\x15\xff\x9a\x02\x00\x01\ +\x17\xff\xc3\x02\x00\x01\x19\xff\xc3\x02\x00\x01\x1d\xff\xae\x02\ +\x00\x01!\xff\xae\x02\x00\x01+\xff\xc3\x02\x00\x01-\xff\ +\xc3\x02\x00\x01/\xff\xc3\x02\x00\x011\xff\xc3\x02\x00\x01\ +3\xff\xc3\x02\x00\x015\xff\xc3\x02\x00\x01<\xff\xd7\x02\ +\x00\x01>\xff\xd7\x02\x00\x01@\xff\xd7\x02\x00\x01C\xff\ +\x85\x02\x00\x01D\xff\x9a\x02\x00\x01F\xff\x9a\x02\x00\x01\ +G\xff\xd7\x02\x00\x01H\xff\x9a\x02\x00\x01J\xff\xae\x02\ +\x00\x02\x08\xff\x85\x02\x00\x02\x0c\xff\x85\x02\x00\x02W\xff\ +\xc3\x02\x00\x02X\xff\x85\x02\x00\x02Y\xff\x9a\x02\x00\x02\ +_\xff\xd7\x02\x00\x02`\xff\x9a\x02\x00\x02b\xff\xc3\x02\ +\x00\x03\x1d\xff\x85\x02\x00\x03\x1e\xff\x9a\x02\x00\x03\x1f\xff\ +\x85\x02\x00\x03 \xff\x9a\x02\x00\x03!\xff\x85\x02\x00\x03\ +\x22\xff\x9a\x02\x00\x03#\xff\x85\x02\x00\x03%\xff\x85\x02\ +\x00\x03&\xff\x9a\x02\x00\x03'\xff\x85\x02\x00\x03(\xff\ +\x9a\x02\x00\x03)\xff\x85\x02\x00\x03*\xff\x9a\x02\x00\x03\ ++\xff\x85\x02\x00\x03,\xff\x9a\x02\x00\x03-\xff\x85\x02\ +\x00\x03.\xff\x9a\x02\x00\x03/\xff\x85\x02\x00\x030\xff\ +\x9a\x02\x00\x031\xff\x85\x02\x00\x032\xff\x9a\x02\x00\x03\ +3\xff\x85\x02\x00\x034\xff\x9a\x02\x00\x036\xff\x9a\x02\ +\x00\x038\xff\x9a\x02\x00\x03:\xff\x9a\x02\x00\x03<\xff\ +\x9a\x02\x00\x03@\xff\x9a\x02\x00\x03B\xff\x9a\x02\x00\x03\ +D\xff\x9a\x02\x00\x03I\xff\xd7\x02\x00\x03J\xff\x9a\x02\ +\x00\x03K\xff\xd7\x02\x00\x03L\xff\x9a\x02\x00\x03M\xff\ +\xd7\x02\x00\x03N\xff\x9a\x02\x00\x03O\xff\xd7\x02\x00\x03\ +Q\xff\xd7\x02\x00\x03R\xff\x9a\x02\x00\x03S\xff\xd7\x02\ +\x00\x03T\xff\x9a\x02\x00\x03U\xff\xd7\x02\x00\x03V\xff\ +\x9a\x02\x00\x03W\xff\xd7\x02\x00\x03X\xff\x9a\x02\x00\x03\ +Y\xff\xd7\x02\x00\x03Z\xff\x9a\x02\x00\x03[\xff\xd7\x02\ +\x00\x03\x5c\xff\x9a\x02\x00\x03]\xff\xd7\x02\x00\x03^\xff\ +\x9a\x02\x00\x03_\xff\xd7\x02\x00\x03`\xff\x9a\x02\x00\x03\ +b\xff\xc3\x02\x00\x03d\xff\xc3\x02\x00\x03f\xff\xc3\x02\ +\x00\x03h\xff\xc3\x02\x00\x03j\xff\xc3\x02\x00\x03l\xff\ +\xc3\x02\x00\x03n\xff\xc3\x02\x01\x00\x05\x00R\x02\x01\x00\ +\x0a\x00R\x02\x01\x00\x0f\xff\xae\x02\x01\x00\x11\xff\xae\x02\ +\x01\x00\x22\x00)\x02\x01\x02\x07\x00R\x02\x01\x02\x08\xff\ +\xae\x02\x01\x02\x0b\x00R\x02\x01\x02\x0c\xff\xae\x02\x02\x00\ +7\xff\xae\x02\x02\x01$\xff\xae\x02\x02\x01&\xff\xae\x02\ +\x02\x01q\xff\xae\x02\x02\x01\x9d\xff\xae\x02\x02\x01\xa6\xff\ +\xae\x02\x02\x01\xbc\xff\xae\x02\x02\x01\xc4\xff\xae\x02\x02\x01\ +\xdc\xff\xd7\x02\x02\x01\xe4\xff\xd7\x02\x02\x02\xa9\xff\xae\x02\ +\x02\x02\xaa\xff\xd7\x02\x02\x02\xb5\xff\xae\x02\x02\x02\xb6\xff\ +\xd7\x02\x02\x02\xbd\xff\xae\x02\x02\x02\xbe\xff\xd7\x02\x02\x03\ +\x17\xff\xae\x02\x02\x03\x18\xff\xd7\x02\x02\x03\x8f\xff\xae\x02\ +\x03\x007\xff\xae\x02\x03\x01$\xff\xae\x02\x03\x01&\xff\ +\xae\x02\x03\x01q\xff\xae\x02\x03\x01\x9d\xff\xae\x02\x03\x01\ +\xa6\xff\xae\x02\x03\x01\xbc\xff\xae\x02\x03\x01\xc4\xff\xae\x02\ +\x03\x01\xdc\xff\xd7\x02\x03\x01\xe4\xff\xd7\x02\x03\x02\xa9\xff\ +\xae\x02\x03\x02\xaa\xff\xd7\x02\x03\x02\xb5\xff\xae\x02\x03\x02\ +\xb6\xff\xd7\x02\x03\x02\xbd\xff\xae\x02\x03\x02\xbe\xff\xd7\x02\ +\x03\x03\x17\xff\xae\x02\x03\x03\x18\xff\xd7\x02\x03\x03\x8f\xff\ +\xae\x02\x04\x007\xff\xae\x02\x04\x01$\xff\xae\x02\x04\x01\ +&\xff\xae\x02\x04\x01q\xff\xae\x02\x04\x01\x9d\xff\xae\x02\ +\x04\x01\xa6\xff\xae\x02\x04\x01\xbc\xff\xae\x02\x04\x01\xc4\xff\ +\xae\x02\x04\x01\xdc\xff\xd7\x02\x04\x01\xe4\xff\xd7\x02\x04\x02\ +\xa9\xff\xae\x02\x04\x02\xaa\xff\xd7\x02\x04\x02\xb5\xff\xae\x02\ +\x04\x02\xb6\xff\xd7\x02\x04\x02\xbd\xff\xae\x02\x04\x02\xbe\xff\ +\xd7\x02\x04\x03\x17\xff\xae\x02\x04\x03\x18\xff\xd7\x02\x04\x03\ +\x8f\xff\xae\x02\x06\x00$\xffq\x02\x06\x007\x00)\x02\ +\x06\x009\x00)\x02\x06\x00:\x00)\x02\x06\x00<\x00\ +\x14\x02\x06\x00D\xff\xae\x02\x06\x00F\xff\x85\x02\x06\x00\ +G\xff\x85\x02\x06\x00H\xff\x85\x02\x06\x00J\xff\xc3\x02\ +\x06\x00P\xff\xc3\x02\x06\x00Q\xff\xc3\x02\x06\x00R\xff\ +\x85\x02\x06\x00S\xff\xc3\x02\x06\x00T\xff\x85\x02\x06\x00\ +U\xff\xc3\x02\x06\x00V\xff\xc3\x02\x06\x00X\xff\xc3\x02\ +\x06\x00\x82\xffq\x02\x06\x00\x83\xffq\x02\x06\x00\x84\xff\ +q\x02\x06\x00\x85\xffq\x02\x06\x00\x86\xffq\x02\x06\x00\ +\x87\xffq\x02\x06\x00\x9f\x00\x14\x02\x06\x00\xa2\xff\x85\x02\ +\x06\x00\xa3\xff\xae\x02\x06\x00\xa4\xff\xae\x02\x06\x00\xa5\xff\ +\xae\x02\x06\x00\xa6\xff\xae\x02\x06\x00\xa7\xff\xae\x02\x06\x00\ +\xa8\xff\xae\x02\x06\x00\xa9\xff\x85\x02\x06\x00\xaa\xff\x85\x02\ +\x06\x00\xab\xff\x85\x02\x06\x00\xac\xff\x85\x02\x06\x00\xad\xff\ +\x85\x02\x06\x00\xb4\xff\x85\x02\x06\x00\xb5\xff\x85\x02\x06\x00\ +\xb6\xff\x85\x02\x06\x00\xb7\xff\x85\x02\x06\x00\xb8\xff\x85\x02\ +\x06\x00\xba\xff\x85\x02\x06\x00\xbb\xff\xc3\x02\x06\x00\xbc\xff\ +\xc3\x02\x06\x00\xbd\xff\xc3\x02\x06\x00\xbe\xff\xc3\x02\x06\x00\ +\xc2\xffq\x02\x06\x00\xc3\xff\xae\x02\x06\x00\xc4\xffq\x02\ +\x06\x00\xc5\xff\xae\x02\x06\x00\xc6\xffq\x02\x06\x00\xc7\xff\ +\xae\x02\x06\x00\xc9\xff\x85\x02\x06\x00\xcb\xff\x85\x02\x06\x00\ +\xcd\xff\x85\x02\x06\x00\xcf\xff\x85\x02\x06\x00\xd1\xff\x85\x02\ +\x06\x00\xd3\xff\x85\x02\x06\x00\xd5\xff\x85\x02\x06\x00\xd7\xff\ +\x85\x02\x06\x00\xd9\xff\x85\x02\x06\x00\xdb\xff\x85\x02\x06\x00\ +\xdd\xff\x85\x02\x06\x00\xdf\xff\xc3\x02\x06\x00\xe1\xff\xc3\x02\ +\x06\x00\xe3\xff\xc3\x02\x06\x00\xe5\xff\xc3\x02\x06\x00\xfa\xff\ +\xc3\x02\x06\x01\x06\xff\xc3\x02\x06\x01\x08\xff\xc3\x02\x06\x01\ +\x0d\xff\xc3\x02\x06\x01\x0f\xff\x85\x02\x06\x01\x11\xff\x85\x02\ +\x06\x01\x13\xff\x85\x02\x06\x01\x15\xff\x85\x02\x06\x01\x17\xff\ +\xc3\x02\x06\x01\x19\xff\xc3\x02\x06\x01\x1d\xff\xc3\x02\x06\x01\ +!\xff\xc3\x02\x06\x01$\x00)\x02\x06\x01&\x00)\x02\ +\x06\x01+\xff\xc3\x02\x06\x01-\xff\xc3\x02\x06\x01/\xff\ +\xc3\x02\x06\x011\xff\xc3\x02\x06\x013\xff\xc3\x02\x06\x01\ +5\xff\xc3\x02\x06\x016\x00)\x02\x06\x018\x00\x14\x02\ +\x06\x01:\x00\x14\x02\x06\x01C\xffq\x02\x06\x01D\xff\ +\xae\x02\x06\x01F\xff\xae\x02\x06\x01H\xff\x85\x02\x06\x01\ +J\xff\xc3\x02\x06\x01V\xffq\x02\x06\x01_\xffq\x02\ +\x06\x01b\xffq\x02\x06\x01i\xffq\x02\x06\x01y\xff\ +\xae\x02\x06\x01z\xff\xd7\x02\x06\x01{\xff\xd7\x02\x06\x01\ +~\xff\xae\x02\x06\x01\x81\xff\xc3\x02\x06\x01\x82\xff\xd7\x02\ +\x06\x01\x83\xff\xd7\x02\x06\x01\x84\xff\xd7\x02\x06\x01\x87\xff\ +\xd7\x02\x06\x01\x89\xff\xd7\x02\x06\x01\x8c\xff\xae\x02\x06\x01\ +\x8e\xff\xc3\x02\x06\x01\x8f\xff\xae\x02\x06\x01\x90\xff\xae\x02\ +\x06\x01\x93\xff\xae\x02\x06\x01\x99\xff\xae\x02\x06\x01\xa4\xff\ +\x85\x02\x06\x01\xaa\xffq\x02\x06\x01\xae\xff\x85\x02\x06\x01\ +\xb5\xff\x85\x02\x06\x01\xca\xff\xd7\x02\x06\x01\xce\xffq\x02\ +\x06\x01\xcf\xff\x85\x02\x06\x01\xd5\xffq\x02\x06\x01\xd8\xff\ +\x85\x02\x06\x01\xdb\xff\x85\x02\x06\x01\xde\xff\x85\x02\x06\x01\ +\xea\xff\x85\x02\x06\x01\xed\xff\x85\x02\x06\x01\xee\xff\xc3\x02\ +\x06\x01\xf2\xffq\x02\x06\x01\xfa\x00)\x02\x06\x01\xfc\x00\ +)\x02\x06\x01\xfe\x00)\x02\x06\x02\x00\x00\x14\x02\x06\x02\ +W\xff\xc3\x02\x06\x02X\xffq\x02\x06\x02Y\xff\xae\x02\ +\x06\x02`\xff\x85\x02\x06\x02b\xff\xc3\x02\x06\x02j\xff\ +\x85\x02\x06\x02r\xffq\x02\x06\x02s\xffq\x02\x06\x02\ +}\xff\xec\x02\x06\x02\x7f\xff\x85\x02\x06\x02\x85\xff\x85\x02\ +\x06\x02\x87\xff\x85\x02\x06\x02\x89\xff\x85\x02\x06\x02\x8d\xff\ +\x85\x02\x06\x02\xb2\xff\x85\x02\x06\x02\xb4\xff\x85\x02\x06\x02\ +\xce\xff\x85\x02\x06\x02\xcf\xffq\x02\x06\x02\xd9\xffq\x02\ +\x06\x02\xda\xff\xd7\x02\x06\x02\xdb\xffq\x02\x06\x02\xdc\xff\ +\xd7\x02\x06\x02\xdd\xffq\x02\x06\x02\xde\xff\xd7\x02\x06\x02\ +\xe0\xff\x85\x02\x06\x02\xe2\xff\xd7\x02\x06\x02\xe4\xff\xd7\x02\ +\x06\x02\xf0\xff\x85\x02\x06\x02\xf2\xff\x85\x02\x06\x02\xf4\xff\ +\x85\x02\x06\x03\x09\xffq\x02\x06\x03\x0a\xff\x85\x02\x06\x03\ +\x0b\xffq\x02\x06\x03\x0c\xff\x85\x02\x06\x03\x11\xff\x85\x02\ +\x06\x03\x12\xffq\x02\x06\x03\x16\xff\x85\x02\x06\x03\x1a\xff\ +\x85\x02\x06\x03\x1b\xff\x85\x02\x06\x03\x1c\xffq\x02\x06\x03\ +\x1d\xffq\x02\x06\x03\x1e\xff\xae\x02\x06\x03\x1f\xffq\x02\ +\x06\x03 \xff\xae\x02\x06\x03!\xffq\x02\x06\x03\x22\xff\ +\xae\x02\x06\x03#\xffq\x02\x06\x03%\xffq\x02\x06\x03\ +&\xff\xae\x02\x06\x03'\xffq\x02\x06\x03(\xff\xae\x02\ +\x06\x03)\xffq\x02\x06\x03*\xff\xae\x02\x06\x03+\xff\ +q\x02\x06\x03,\xff\xae\x02\x06\x03-\xffq\x02\x06\x03\ +.\xff\xae\x02\x06\x03/\xffq\x02\x06\x030\xff\xae\x02\ +\x06\x031\xffq\x02\x06\x032\xff\xae\x02\x06\x033\xff\ +q\x02\x06\x034\xff\xae\x02\x06\x036\xff\x85\x02\x06\x03\ +8\xff\x85\x02\x06\x03:\xff\x85\x02\x06\x03<\xff\x85\x02\ +\x06\x03@\xff\x85\x02\x06\x03B\xff\x85\x02\x06\x03D\xff\ +\x85\x02\x06\x03J\xff\x85\x02\x06\x03L\xff\x85\x02\x06\x03\ +N\xff\x85\x02\x06\x03R\xff\x85\x02\x06\x03T\xff\x85\x02\ +\x06\x03V\xff\x85\x02\x06\x03X\xff\x85\x02\x06\x03Z\xff\ +\x85\x02\x06\x03\x5c\xff\x85\x02\x06\x03^\xff\x85\x02\x06\x03\ +`\xff\x85\x02\x06\x03b\xff\xc3\x02\x06\x03d\xff\xc3\x02\ +\x06\x03f\xff\xc3\x02\x06\x03h\xff\xc3\x02\x06\x03j\xff\ +\xc3\x02\x06\x03l\xff\xc3\x02\x06\x03n\xff\xc3\x02\x06\x03\ +o\x00\x14\x02\x06\x03q\x00\x14\x02\x06\x03s\x00\x14\x02\ +\x06\x03\x8f\x00)\x02\x07\x00$\xffq\x02\x07\x007\x00\ +)\x02\x07\x009\x00)\x02\x07\x00:\x00)\x02\x07\x00\ +<\x00\x14\x02\x07\x00D\xff\xae\x02\x07\x00F\xff\x85\x02\ +\x07\x00G\xff\x85\x02\x07\x00H\xff\x85\x02\x07\x00J\xff\ +\xc3\x02\x07\x00P\xff\xc3\x02\x07\x00Q\xff\xc3\x02\x07\x00\ +R\xff\x85\x02\x07\x00S\xff\xc3\x02\x07\x00T\xff\x85\x02\ +\x07\x00U\xff\xc3\x02\x07\x00V\xff\xc3\x02\x07\x00X\xff\ +\xc3\x02\x07\x00\x82\xffq\x02\x07\x00\x83\xffq\x02\x07\x00\ +\x84\xffq\x02\x07\x00\x85\xffq\x02\x07\x00\x86\xffq\x02\ +\x07\x00\x87\xffq\x02\x07\x00\x9f\x00\x14\x02\x07\x00\xa2\xff\ +\x85\x02\x07\x00\xa3\xff\xae\x02\x07\x00\xa4\xff\xae\x02\x07\x00\ +\xa5\xff\xae\x02\x07\x00\xa6\xff\xae\x02\x07\x00\xa7\xff\xae\x02\ +\x07\x00\xa8\xff\xae\x02\x07\x00\xa9\xff\x85\x02\x07\x00\xaa\xff\ +\x85\x02\x07\x00\xab\xff\x85\x02\x07\x00\xac\xff\x85\x02\x07\x00\ +\xad\xff\x85\x02\x07\x00\xb4\xff\x85\x02\x07\x00\xb5\xff\x85\x02\ +\x07\x00\xb6\xff\x85\x02\x07\x00\xb7\xff\x85\x02\x07\x00\xb8\xff\ +\x85\x02\x07\x00\xba\xff\x85\x02\x07\x00\xbb\xff\xc3\x02\x07\x00\ +\xbc\xff\xc3\x02\x07\x00\xbd\xff\xc3\x02\x07\x00\xbe\xff\xc3\x02\ +\x07\x00\xc2\xffq\x02\x07\x00\xc3\xff\xae\x02\x07\x00\xc4\xff\ +q\x02\x07\x00\xc5\xff\xae\x02\x07\x00\xc6\xffq\x02\x07\x00\ +\xc7\xff\xae\x02\x07\x00\xc9\xff\x85\x02\x07\x00\xcb\xff\x85\x02\ +\x07\x00\xcd\xff\x85\x02\x07\x00\xcf\xff\x85\x02\x07\x00\xd1\xff\ +\x85\x02\x07\x00\xd3\xff\x85\x02\x07\x00\xd5\xff\x85\x02\x07\x00\ +\xd7\xff\x85\x02\x07\x00\xd9\xff\x85\x02\x07\x00\xdb\xff\x85\x02\ +\x07\x00\xdd\xff\x85\x02\x07\x00\xdf\xff\xc3\x02\x07\x00\xe1\xff\ +\xc3\x02\x07\x00\xe3\xff\xc3\x02\x07\x00\xe5\xff\xc3\x02\x07\x00\ +\xfa\xff\xc3\x02\x07\x01\x06\xff\xc3\x02\x07\x01\x08\xff\xc3\x02\ +\x07\x01\x0d\xff\xc3\x02\x07\x01\x0f\xff\x85\x02\x07\x01\x11\xff\ +\x85\x02\x07\x01\x13\xff\x85\x02\x07\x01\x15\xff\x85\x02\x07\x01\ +\x17\xff\xc3\x02\x07\x01\x19\xff\xc3\x02\x07\x01\x1d\xff\xc3\x02\ +\x07\x01!\xff\xc3\x02\x07\x01$\x00)\x02\x07\x01&\x00\ +)\x02\x07\x01+\xff\xc3\x02\x07\x01-\xff\xc3\x02\x07\x01\ +/\xff\xc3\x02\x07\x011\xff\xc3\x02\x07\x013\xff\xc3\x02\ +\x07\x015\xff\xc3\x02\x07\x016\x00)\x02\x07\x018\x00\ +\x14\x02\x07\x01:\x00\x14\x02\x07\x01C\xffq\x02\x07\x01\ +D\xff\xae\x02\x07\x01F\xff\xae\x02\x07\x01H\xff\x85\x02\ +\x07\x01J\xff\xc3\x02\x07\x01V\xffq\x02\x07\x01_\xff\ +q\x02\x07\x01b\xffq\x02\x07\x01i\xffq\x02\x07\x01\ +y\xff\xae\x02\x07\x01z\xff\xd7\x02\x07\x01{\xff\xd7\x02\ +\x07\x01~\xff\xae\x02\x07\x01\x81\xff\xc3\x02\x07\x01\x82\xff\ +\xd7\x02\x07\x01\x83\xff\xd7\x02\x07\x01\x84\xff\xd7\x02\x07\x01\ +\x87\xff\xd7\x02\x07\x01\x89\xff\xd7\x02\x07\x01\x8c\xff\xae\x02\ +\x07\x01\x8e\xff\xc3\x02\x07\x01\x8f\xff\xae\x02\x07\x01\x90\xff\ +\xae\x02\x07\x01\x93\xff\xae\x02\x07\x01\x99\xff\xae\x02\x07\x01\ +\xa4\xff\x85\x02\x07\x01\xaa\xffq\x02\x07\x01\xae\xff\x85\x02\ +\x07\x01\xb5\xff\x85\x02\x07\x01\xca\xff\xd7\x02\x07\x01\xce\xff\ +q\x02\x07\x01\xcf\xff\x85\x02\x07\x01\xd5\xffq\x02\x07\x01\ +\xd8\xff\x85\x02\x07\x01\xdb\xff\x85\x02\x07\x01\xde\xff\x85\x02\ +\x07\x01\xea\xff\x85\x02\x07\x01\xed\xff\x85\x02\x07\x01\xee\xff\ +\xc3\x02\x07\x01\xf2\xffq\x02\x07\x01\xfa\x00)\x02\x07\x01\ +\xfc\x00)\x02\x07\x01\xfe\x00)\x02\x07\x02\x00\x00\x14\x02\ +\x07\x02W\xff\xc3\x02\x07\x02X\xffq\x02\x07\x02Y\xff\ +\xae\x02\x07\x02`\xff\x85\x02\x07\x02b\xff\xc3\x02\x07\x02\ +j\xff\x85\x02\x07\x02r\xffq\x02\x07\x02s\xffq\x02\ +\x07\x02}\xff\xec\x02\x07\x02\x7f\xff\x85\x02\x07\x02\x85\xff\ +\x85\x02\x07\x02\x87\xff\x85\x02\x07\x02\x89\xff\x85\x02\x07\x02\ +\x8d\xff\x85\x02\x07\x02\xb2\xff\x85\x02\x07\x02\xb4\xff\x85\x02\ +\x07\x02\xce\xff\x85\x02\x07\x02\xcf\xffq\x02\x07\x02\xd9\xff\ +q\x02\x07\x02\xda\xff\xd7\x02\x07\x02\xdb\xffq\x02\x07\x02\ +\xdc\xff\xd7\x02\x07\x02\xdd\xffq\x02\x07\x02\xde\xff\xd7\x02\ +\x07\x02\xe0\xff\x85\x02\x07\x02\xe2\xff\xd7\x02\x07\x02\xe4\xff\ +\xd7\x02\x07\x02\xf0\xff\x85\x02\x07\x02\xf2\xff\x85\x02\x07\x02\ +\xf4\xff\x85\x02\x07\x03\x09\xffq\x02\x07\x03\x0a\xff\x85\x02\ +\x07\x03\x0b\xffq\x02\x07\x03\x0c\xff\x85\x02\x07\x03\x11\xff\ +\x85\x02\x07\x03\x12\xffq\x02\x07\x03\x16\xff\x85\x02\x07\x03\ +\x1a\xff\x85\x02\x07\x03\x1b\xff\x85\x02\x07\x03\x1c\xffq\x02\ +\x07\x03\x1d\xffq\x02\x07\x03\x1e\xff\xae\x02\x07\x03\x1f\xff\ +q\x02\x07\x03 \xff\xae\x02\x07\x03!\xffq\x02\x07\x03\ +\x22\xff\xae\x02\x07\x03#\xffq\x02\x07\x03%\xffq\x02\ +\x07\x03&\xff\xae\x02\x07\x03'\xffq\x02\x07\x03(\xff\ +\xae\x02\x07\x03)\xffq\x02\x07\x03*\xff\xae\x02\x07\x03\ ++\xffq\x02\x07\x03,\xff\xae\x02\x07\x03-\xffq\x02\ +\x07\x03.\xff\xae\x02\x07\x03/\xffq\x02\x07\x030\xff\ +\xae\x02\x07\x031\xffq\x02\x07\x032\xff\xae\x02\x07\x03\ +3\xffq\x02\x07\x034\xff\xae\x02\x07\x036\xff\x85\x02\ +\x07\x038\xff\x85\x02\x07\x03:\xff\x85\x02\x07\x03<\xff\ +\x85\x02\x07\x03@\xff\x85\x02\x07\x03B\xff\x85\x02\x07\x03\ +D\xff\x85\x02\x07\x03J\xff\x85\x02\x07\x03L\xff\x85\x02\ +\x07\x03N\xff\x85\x02\x07\x03R\xff\x85\x02\x07\x03T\xff\ +\x85\x02\x07\x03V\xff\x85\x02\x07\x03X\xff\x85\x02\x07\x03\ +Z\xff\x85\x02\x07\x03\x5c\xff\x85\x02\x07\x03^\xff\x85\x02\ +\x07\x03`\xff\x85\x02\x07\x03b\xff\xc3\x02\x07\x03d\xff\ +\xc3\x02\x07\x03f\xff\xc3\x02\x07\x03h\xff\xc3\x02\x07\x03\ +j\xff\xc3\x02\x07\x03l\xff\xc3\x02\x07\x03n\xff\xc3\x02\ +\x07\x03o\x00\x14\x02\x07\x03q\x00\x14\x02\x07\x03s\x00\ +\x14\x02\x07\x03\x8f\x00)\x02\x08\x00&\xff\x9a\x02\x08\x00\ +*\xff\x9a\x02\x08\x002\xff\x9a\x02\x08\x004\xff\x9a\x02\ +\x08\x007\xffq\x02\x08\x008\xff\xd7\x02\x08\x009\xff\ +\x85\x02\x08\x00:\xff\x85\x02\x08\x00<\xff\x85\x02\x08\x00\ +\x89\xff\x9a\x02\x08\x00\x94\xff\x9a\x02\x08\x00\x95\xff\x9a\x02\ +\x08\x00\x96\xff\x9a\x02\x08\x00\x97\xff\x9a\x02\x08\x00\x98\xff\ +\x9a\x02\x08\x00\x9a\xff\x9a\x02\x08\x00\x9b\xff\xd7\x02\x08\x00\ +\x9c\xff\xd7\x02\x08\x00\x9d\xff\xd7\x02\x08\x00\x9e\xff\xd7\x02\ +\x08\x00\x9f\xff\x85\x02\x08\x00\xc8\xff\x9a\x02\x08\x00\xca\xff\ +\x9a\x02\x08\x00\xcc\xff\x9a\x02\x08\x00\xce\xff\x9a\x02\x08\x00\ +\xde\xff\x9a\x02\x08\x00\xe0\xff\x9a\x02\x08\x00\xe2\xff\x9a\x02\ +\x08\x00\xe4\xff\x9a\x02\x08\x01\x0e\xff\x9a\x02\x08\x01\x10\xff\ +\x9a\x02\x08\x01\x12\xff\x9a\x02\x08\x01\x14\xff\x9a\x02\x08\x01\ +$\xffq\x02\x08\x01&\xffq\x02\x08\x01*\xff\xd7\x02\ +\x08\x01,\xff\xd7\x02\x08\x01.\xff\xd7\x02\x08\x010\xff\ +\xd7\x02\x08\x012\xff\xd7\x02\x08\x014\xff\xd7\x02\x08\x01\ +6\xff\x85\x02\x08\x018\xff\x85\x02\x08\x01:\xff\x85\x02\ +\x08\x01G\xff\x9a\x02\x08\x01f\xff\xae\x02\x08\x01m\xff\ +\xae\x02\x08\x01q\xffq\x02\x08\x01r\xff\x85\x02\x08\x01\ +s\xff\x9a\x02\x08\x01u\xff\x85\x02\x08\x01x\xff\x85\x02\ +\x08\x01\x85\xff\xd7\x02\x08\x01\x9d\xffq\x02\x08\x01\x9f\xff\ +\x9a\x02\x08\x01\xa6\xffq\x02\x08\x01\xb8\xff\x9a\x02\x08\x01\ +\xbb\xff\x9a\x02\x08\x01\xbc\xffq\x02\x08\x01\xbe\xff\xae\x02\ +\x08\x01\xc1\xff\x5c\x02\x08\x01\xc4\xffq\x02\x08\x01\xdc\xff\ +\x9a\x02\x08\x01\xe1\xff\x85\x02\x08\x01\xe4\xff\x9a\x02\x08\x01\ +\xfa\xff\x85\x02\x08\x01\xfc\xff\x85\x02\x08\x01\xfe\xff\x85\x02\ +\x08\x02\x00\xff\x85\x02\x08\x02T\xff\x85\x02\x08\x02_\xff\ +\x9a\x02\x08\x02a\xff\xd7\x02\x08\x02l\xff\x9a\x02\x08\x02\ +|\xff\x5c\x02\x08\x02~\xff\x9a\x02\x08\x02\x80\xff\x85\x02\ +\x08\x02\x82\xff\x85\x02\x08\x02\x84\xff\x9a\x02\x08\x02\x86\xff\ +\x9a\x02\x08\x02\x88\xff\x9a\x02\x08\x02\x8a\xff\x9a\x02\x08\x02\ +\x8c\xff\x9a\x02\x08\x02\xa9\xffq\x02\x08\x02\xaa\xff\x9a\x02\ +\x08\x02\xb1\xff\x9a\x02\x08\x02\xb3\xff\x9a\x02\x08\x02\xb5\xff\ +q\x02\x08\x02\xb6\xff\x9a\x02\x08\x02\xb7\xff\x85\x02\x08\x02\ +\xb9\xff\x85\x02\x08\x02\xbd\xffq\x02\x08\x02\xbe\xff\x9a\x02\ +\x08\x02\xbf\xff\x5c\x02\x08\x02\xc0\xff\x85\x02\x08\x02\xc1\xff\ +\x5c\x02\x08\x02\xc2\xff\x85\x02\x08\x02\xc5\xff\x85\x02\x08\x02\ +\xc7\xff\x85\x02\x08\x02\xd4\xff\x5c\x02\x08\x02\xd5\xff\x85\x02\ +\x08\x02\xef\xff\x9a\x02\x08\x02\xf1\xff\x9a\x02\x08\x02\xf3\xff\ +\x9a\x02\x08\x02\xfd\xff\x5c\x02\x08\x02\xfe\xff\x85\x02\x08\x03\ +\x0d\xff\x85\x02\x08\x03\x0e\xff\x9a\x02\x08\x03\x0f\xff\x85\x02\ +\x08\x03\x10\xff\x9a\x02\x08\x03\x15\xff\x9a\x02\x08\x03\x17\xff\ +q\x02\x08\x03\x18\xff\x9a\x02\x08\x03I\xff\x9a\x02\x08\x03\ +K\xff\x9a\x02\x08\x03M\xff\x9a\x02\x08\x03O\xff\x9a\x02\ +\x08\x03Q\xff\x9a\x02\x08\x03S\xff\x9a\x02\x08\x03U\xff\ +\x9a\x02\x08\x03W\xff\x9a\x02\x08\x03Y\xff\x9a\x02\x08\x03\ +[\xff\x9a\x02\x08\x03]\xff\x9a\x02\x08\x03_\xff\x9a\x02\ +\x08\x03a\xff\xd7\x02\x08\x03c\xff\xd7\x02\x08\x03e\xff\ +\xd7\x02\x08\x03g\xff\xd7\x02\x08\x03i\xff\xd7\x02\x08\x03\ +k\xff\xd7\x02\x08\x03m\xff\xd7\x02\x08\x03o\xff\x85\x02\ +\x08\x03q\xff\x85\x02\x08\x03s\xff\x85\x02\x08\x03\x8f\xff\ +q\x02\x0a\x00$\xffq\x02\x0a\x007\x00)\x02\x0a\x00\ +9\x00)\x02\x0a\x00:\x00)\x02\x0a\x00<\x00\x14\x02\ +\x0a\x00D\xff\xae\x02\x0a\x00F\xff\x85\x02\x0a\x00G\xff\ +\x85\x02\x0a\x00H\xff\x85\x02\x0a\x00J\xff\xc3\x02\x0a\x00\ +P\xff\xc3\x02\x0a\x00Q\xff\xc3\x02\x0a\x00R\xff\x85\x02\ +\x0a\x00S\xff\xc3\x02\x0a\x00T\xff\x85\x02\x0a\x00U\xff\ +\xc3\x02\x0a\x00V\xff\xc3\x02\x0a\x00X\xff\xc3\x02\x0a\x00\ +\x82\xffq\x02\x0a\x00\x83\xffq\x02\x0a\x00\x84\xffq\x02\ +\x0a\x00\x85\xffq\x02\x0a\x00\x86\xffq\x02\x0a\x00\x87\xff\ +q\x02\x0a\x00\x9f\x00\x14\x02\x0a\x00\xa2\xff\x85\x02\x0a\x00\ +\xa3\xff\xae\x02\x0a\x00\xa4\xff\xae\x02\x0a\x00\xa5\xff\xae\x02\ +\x0a\x00\xa6\xff\xae\x02\x0a\x00\xa7\xff\xae\x02\x0a\x00\xa8\xff\ +\xae\x02\x0a\x00\xa9\xff\x85\x02\x0a\x00\xaa\xff\x85\x02\x0a\x00\ +\xab\xff\x85\x02\x0a\x00\xac\xff\x85\x02\x0a\x00\xad\xff\x85\x02\ +\x0a\x00\xb4\xff\x85\x02\x0a\x00\xb5\xff\x85\x02\x0a\x00\xb6\xff\ +\x85\x02\x0a\x00\xb7\xff\x85\x02\x0a\x00\xb8\xff\x85\x02\x0a\x00\ +\xba\xff\x85\x02\x0a\x00\xbb\xff\xc3\x02\x0a\x00\xbc\xff\xc3\x02\ +\x0a\x00\xbd\xff\xc3\x02\x0a\x00\xbe\xff\xc3\x02\x0a\x00\xc2\xff\ +q\x02\x0a\x00\xc3\xff\xae\x02\x0a\x00\xc4\xffq\x02\x0a\x00\ +\xc5\xff\xae\x02\x0a\x00\xc6\xffq\x02\x0a\x00\xc7\xff\xae\x02\ +\x0a\x00\xc9\xff\x85\x02\x0a\x00\xcb\xff\x85\x02\x0a\x00\xcd\xff\ +\x85\x02\x0a\x00\xcf\xff\x85\x02\x0a\x00\xd1\xff\x85\x02\x0a\x00\ +\xd3\xff\x85\x02\x0a\x00\xd5\xff\x85\x02\x0a\x00\xd7\xff\x85\x02\ +\x0a\x00\xd9\xff\x85\x02\x0a\x00\xdb\xff\x85\x02\x0a\x00\xdd\xff\ +\x85\x02\x0a\x00\xdf\xff\xc3\x02\x0a\x00\xe1\xff\xc3\x02\x0a\x00\ +\xe3\xff\xc3\x02\x0a\x00\xe5\xff\xc3\x02\x0a\x00\xfa\xff\xc3\x02\ +\x0a\x01\x06\xff\xc3\x02\x0a\x01\x08\xff\xc3\x02\x0a\x01\x0d\xff\ +\xc3\x02\x0a\x01\x0f\xff\x85\x02\x0a\x01\x11\xff\x85\x02\x0a\x01\ +\x13\xff\x85\x02\x0a\x01\x15\xff\x85\x02\x0a\x01\x17\xff\xc3\x02\ +\x0a\x01\x19\xff\xc3\x02\x0a\x01\x1d\xff\xc3\x02\x0a\x01!\xff\ +\xc3\x02\x0a\x01$\x00)\x02\x0a\x01&\x00)\x02\x0a\x01\ ++\xff\xc3\x02\x0a\x01-\xff\xc3\x02\x0a\x01/\xff\xc3\x02\ +\x0a\x011\xff\xc3\x02\x0a\x013\xff\xc3\x02\x0a\x015\xff\ +\xc3\x02\x0a\x016\x00)\x02\x0a\x018\x00\x14\x02\x0a\x01\ +:\x00\x14\x02\x0a\x01C\xffq\x02\x0a\x01D\xff\xae\x02\ +\x0a\x01F\xff\xae\x02\x0a\x01H\xff\x85\x02\x0a\x01J\xff\ +\xc3\x02\x0a\x01V\xffq\x02\x0a\x01_\xffq\x02\x0a\x01\ +b\xffq\x02\x0a\x01i\xffq\x02\x0a\x01y\xff\xae\x02\ +\x0a\x01z\xff\xd7\x02\x0a\x01{\xff\xd7\x02\x0a\x01~\xff\ +\xae\x02\x0a\x01\x81\xff\xc3\x02\x0a\x01\x82\xff\xd7\x02\x0a\x01\ +\x83\xff\xd7\x02\x0a\x01\x84\xff\xd7\x02\x0a\x01\x87\xff\xd7\x02\ +\x0a\x01\x89\xff\xd7\x02\x0a\x01\x8c\xff\xae\x02\x0a\x01\x8e\xff\ +\xc3\x02\x0a\x01\x8f\xff\xae\x02\x0a\x01\x90\xff\xae\x02\x0a\x01\ +\x93\xff\xae\x02\x0a\x01\x99\xff\xae\x02\x0a\x01\xa4\xff\x85\x02\ +\x0a\x01\xaa\xffq\x02\x0a\x01\xae\xff\x85\x02\x0a\x01\xb5\xff\ +\x85\x02\x0a\x01\xca\xff\xd7\x02\x0a\x01\xce\xffq\x02\x0a\x01\ +\xcf\xff\x85\x02\x0a\x01\xd5\xffq\x02\x0a\x01\xd8\xff\x85\x02\ +\x0a\x01\xdb\xff\x85\x02\x0a\x01\xde\xff\x85\x02\x0a\x01\xea\xff\ +\x85\x02\x0a\x01\xed\xff\x85\x02\x0a\x01\xee\xff\xc3\x02\x0a\x01\ +\xf2\xffq\x02\x0a\x01\xfa\x00)\x02\x0a\x01\xfc\x00)\x02\ +\x0a\x01\xfe\x00)\x02\x0a\x02\x00\x00\x14\x02\x0a\x02W\xff\ +\xc3\x02\x0a\x02X\xffq\x02\x0a\x02Y\xff\xae\x02\x0a\x02\ +`\xff\x85\x02\x0a\x02b\xff\xc3\x02\x0a\x02j\xff\x85\x02\ +\x0a\x02r\xffq\x02\x0a\x02s\xffq\x02\x0a\x02}\xff\ +\xec\x02\x0a\x02\x7f\xff\x85\x02\x0a\x02\x85\xff\x85\x02\x0a\x02\ +\x87\xff\x85\x02\x0a\x02\x89\xff\x85\x02\x0a\x02\x8d\xff\x85\x02\ +\x0a\x02\xb2\xff\x85\x02\x0a\x02\xb4\xff\x85\x02\x0a\x02\xce\xff\ +\x85\x02\x0a\x02\xcf\xffq\x02\x0a\x02\xd9\xffq\x02\x0a\x02\ +\xda\xff\xd7\x02\x0a\x02\xdb\xffq\x02\x0a\x02\xdc\xff\xd7\x02\ +\x0a\x02\xdd\xffq\x02\x0a\x02\xde\xff\xd7\x02\x0a\x02\xe0\xff\ +\x85\x02\x0a\x02\xe2\xff\xd7\x02\x0a\x02\xe4\xff\xd7\x02\x0a\x02\ +\xf0\xff\x85\x02\x0a\x02\xf2\xff\x85\x02\x0a\x02\xf4\xff\x85\x02\ +\x0a\x03\x09\xffq\x02\x0a\x03\x0a\xff\x85\x02\x0a\x03\x0b\xff\ +q\x02\x0a\x03\x0c\xff\x85\x02\x0a\x03\x11\xff\x85\x02\x0a\x03\ +\x12\xffq\x02\x0a\x03\x16\xff\x85\x02\x0a\x03\x1a\xff\x85\x02\ +\x0a\x03\x1b\xff\x85\x02\x0a\x03\x1c\xffq\x02\x0a\x03\x1d\xff\ +q\x02\x0a\x03\x1e\xff\xae\x02\x0a\x03\x1f\xffq\x02\x0a\x03\ + \xff\xae\x02\x0a\x03!\xffq\x02\x0a\x03\x22\xff\xae\x02\ +\x0a\x03#\xffq\x02\x0a\x03%\xffq\x02\x0a\x03&\xff\ +\xae\x02\x0a\x03'\xffq\x02\x0a\x03(\xff\xae\x02\x0a\x03\ +)\xffq\x02\x0a\x03*\xff\xae\x02\x0a\x03+\xffq\x02\ +\x0a\x03,\xff\xae\x02\x0a\x03-\xffq\x02\x0a\x03.\xff\ +\xae\x02\x0a\x03/\xffq\x02\x0a\x030\xff\xae\x02\x0a\x03\ +1\xffq\x02\x0a\x032\xff\xae\x02\x0a\x033\xffq\x02\ +\x0a\x034\xff\xae\x02\x0a\x036\xff\x85\x02\x0a\x038\xff\ +\x85\x02\x0a\x03:\xff\x85\x02\x0a\x03<\xff\x85\x02\x0a\x03\ +@\xff\x85\x02\x0a\x03B\xff\x85\x02\x0a\x03D\xff\x85\x02\ +\x0a\x03J\xff\x85\x02\x0a\x03L\xff\x85\x02\x0a\x03N\xff\ +\x85\x02\x0a\x03R\xff\x85\x02\x0a\x03T\xff\x85\x02\x0a\x03\ +V\xff\x85\x02\x0a\x03X\xff\x85\x02\x0a\x03Z\xff\x85\x02\ +\x0a\x03\x5c\xff\x85\x02\x0a\x03^\xff\x85\x02\x0a\x03`\xff\ +\x85\x02\x0a\x03b\xff\xc3\x02\x0a\x03d\xff\xc3\x02\x0a\x03\ +f\xff\xc3\x02\x0a\x03h\xff\xc3\x02\x0a\x03j\xff\xc3\x02\ +\x0a\x03l\xff\xc3\x02\x0a\x03n\xff\xc3\x02\x0a\x03o\x00\ +\x14\x02\x0a\x03q\x00\x14\x02\x0a\x03s\x00\x14\x02\x0a\x03\ +\x8f\x00)\x02\x0c\x00&\xff\x9a\x02\x0c\x00*\xff\x9a\x02\ +\x0c\x002\xff\x9a\x02\x0c\x004\xff\x9a\x02\x0c\x007\xff\ +q\x02\x0c\x008\xff\xd7\x02\x0c\x009\xff\x85\x02\x0c\x00\ +:\xff\x85\x02\x0c\x00<\xff\x85\x02\x0c\x00\x89\xff\x9a\x02\ +\x0c\x00\x94\xff\x9a\x02\x0c\x00\x95\xff\x9a\x02\x0c\x00\x96\xff\ +\x9a\x02\x0c\x00\x97\xff\x9a\x02\x0c\x00\x98\xff\x9a\x02\x0c\x00\ +\x9a\xff\x9a\x02\x0c\x00\x9b\xff\xd7\x02\x0c\x00\x9c\xff\xd7\x02\ +\x0c\x00\x9d\xff\xd7\x02\x0c\x00\x9e\xff\xd7\x02\x0c\x00\x9f\xff\ +\x85\x02\x0c\x00\xc8\xff\x9a\x02\x0c\x00\xca\xff\x9a\x02\x0c\x00\ +\xcc\xff\x9a\x02\x0c\x00\xce\xff\x9a\x02\x0c\x00\xde\xff\x9a\x02\ +\x0c\x00\xe0\xff\x9a\x02\x0c\x00\xe2\xff\x9a\x02\x0c\x00\xe4\xff\ +\x9a\x02\x0c\x01\x0e\xff\x9a\x02\x0c\x01\x10\xff\x9a\x02\x0c\x01\ +\x12\xff\x9a\x02\x0c\x01\x14\xff\x9a\x02\x0c\x01$\xffq\x02\ +\x0c\x01&\xffq\x02\x0c\x01*\xff\xd7\x02\x0c\x01,\xff\ +\xd7\x02\x0c\x01.\xff\xd7\x02\x0c\x010\xff\xd7\x02\x0c\x01\ +2\xff\xd7\x02\x0c\x014\xff\xd7\x02\x0c\x016\xff\x85\x02\ +\x0c\x018\xff\x85\x02\x0c\x01:\xff\x85\x02\x0c\x01G\xff\ +\x9a\x02\x0c\x01f\xff\xae\x02\x0c\x01m\xff\xae\x02\x0c\x01\ +q\xffq\x02\x0c\x01r\xff\x85\x02\x0c\x01s\xff\x9a\x02\ +\x0c\x01u\xff\x85\x02\x0c\x01x\xff\x85\x02\x0c\x01\x85\xff\ +\xd7\x02\x0c\x01\x9d\xffq\x02\x0c\x01\x9f\xff\x9a\x02\x0c\x01\ +\xa6\xffq\x02\x0c\x01\xb8\xff\x9a\x02\x0c\x01\xbb\xff\x9a\x02\ +\x0c\x01\xbc\xffq\x02\x0c\x01\xbe\xff\xae\x02\x0c\x01\xc1\xff\ +\x5c\x02\x0c\x01\xc4\xffq\x02\x0c\x01\xdc\xff\x9a\x02\x0c\x01\ +\xe1\xff\x85\x02\x0c\x01\xe4\xff\x9a\x02\x0c\x01\xfa\xff\x85\x02\ +\x0c\x01\xfc\xff\x85\x02\x0c\x01\xfe\xff\x85\x02\x0c\x02\x00\xff\ +\x85\x02\x0c\x02T\xff\x85\x02\x0c\x02_\xff\x9a\x02\x0c\x02\ +a\xff\xd7\x02\x0c\x02l\xff\x9a\x02\x0c\x02|\xff\x5c\x02\ +\x0c\x02~\xff\x9a\x02\x0c\x02\x80\xff\x85\x02\x0c\x02\x82\xff\ +\x85\x02\x0c\x02\x84\xff\x9a\x02\x0c\x02\x86\xff\x9a\x02\x0c\x02\ +\x88\xff\x9a\x02\x0c\x02\x8a\xff\x9a\x02\x0c\x02\x8c\xff\x9a\x02\ +\x0c\x02\xa9\xffq\x02\x0c\x02\xaa\xff\x9a\x02\x0c\x02\xb1\xff\ +\x9a\x02\x0c\x02\xb3\xff\x9a\x02\x0c\x02\xb5\xffq\x02\x0c\x02\ +\xb6\xff\x9a\x02\x0c\x02\xb7\xff\x85\x02\x0c\x02\xb9\xff\x85\x02\ +\x0c\x02\xbd\xffq\x02\x0c\x02\xbe\xff\x9a\x02\x0c\x02\xbf\xff\ +\x5c\x02\x0c\x02\xc0\xff\x85\x02\x0c\x02\xc1\xff\x5c\x02\x0c\x02\ +\xc2\xff\x85\x02\x0c\x02\xc5\xff\x85\x02\x0c\x02\xc7\xff\x85\x02\ +\x0c\x02\xd4\xff\x5c\x02\x0c\x02\xd5\xff\x85\x02\x0c\x02\xef\xff\ +\x9a\x02\x0c\x02\xf1\xff\x9a\x02\x0c\x02\xf3\xff\x9a\x02\x0c\x02\ +\xfd\xff\x5c\x02\x0c\x02\xfe\xff\x85\x02\x0c\x03\x0d\xff\x85\x02\ +\x0c\x03\x0e\xff\x9a\x02\x0c\x03\x0f\xff\x85\x02\x0c\x03\x10\xff\ +\x9a\x02\x0c\x03\x15\xff\x9a\x02\x0c\x03\x17\xffq\x02\x0c\x03\ +\x18\xff\x9a\x02\x0c\x03I\xff\x9a\x02\x0c\x03K\xff\x9a\x02\ +\x0c\x03M\xff\x9a\x02\x0c\x03O\xff\x9a\x02\x0c\x03Q\xff\ +\x9a\x02\x0c\x03S\xff\x9a\x02\x0c\x03U\xff\x9a\x02\x0c\x03\ +W\xff\x9a\x02\x0c\x03Y\xff\x9a\x02\x0c\x03[\xff\x9a\x02\ +\x0c\x03]\xff\x9a\x02\x0c\x03_\xff\x9a\x02\x0c\x03a\xff\ +\xd7\x02\x0c\x03c\xff\xd7\x02\x0c\x03e\xff\xd7\x02\x0c\x03\ +g\xff\xd7\x02\x0c\x03i\xff\xd7\x02\x0c\x03k\xff\xd7\x02\ +\x0c\x03m\xff\xd7\x02\x0c\x03o\xff\x85\x02\x0c\x03q\xff\ +\x85\x02\x0c\x03s\xff\x85\x02\x0c\x03\x8f\xffq\x02!\x01\ +q\xff\xd7\x02!\x01r\xff\xec\x02!\x01x\xff\xec\x02\ +!\x02T\xff\xec\x02S\x00\x0f\xff\xc3\x02S\x00\x11\xff\ +\xc3\x02S\x02\x08\xff\xc3\x02S\x02\x0c\xff\xc3\x02T\x00\ +\x0f\xff\x85\x02T\x00\x11\xff\x85\x02T\x01V\xff\x85\x02\ +T\x01_\xff\x85\x02T\x01b\xff\x85\x02T\x01f\xff\ +\xd7\x02T\x01i\xff\x85\x02T\x01m\xff\xd7\x02T\x01\ +s\xff\xc3\x02T\x01v\xff\xec\x02T\x01y\xff\x9a\x02\ +T\x01z\xff\xae\x02T\x01{\xff\xc3\x02T\x01|\xff\ +\xc3\x02T\x01}\xff\xc3\x02T\x01~\xff\x9a\x02T\x01\ +\x81\xff\xc3\x02T\x01\x82\xff\xae\x02T\x01\x84\xff\xc3\x02\ +T\x01\x86\xff\xc3\x02T\x01\x87\xff\xc3\x02T\x01\x89\xff\ +\xc3\x02T\x01\x8c\xff\x9a\x02T\x01\x8e\xff\x9a\x02T\x01\ +\x8f\xff\x9a\x02T\x01\x90\xff\x9a\x02T\x01\x92\xff\xc3\x02\ +T\x01\x93\xff\x9a\x02T\x01\x95\xff\xc3\x02T\x01\x96\xff\ +\xc3\x02T\x01\x98\xff\xc3\x02T\x01\x99\xff\x9a\x02T\x01\ +\x9a\xff\xc3\x02T\x01\x9b\xff\xc3\x02T\x02\x08\xff\x85\x02\ +T\x02\x0c\xff\x85\x02T\x02!\xff\xec\x02X\x00\x05\xff\ +q\x02X\x00\x0a\xffq\x02X\x00&\xff\xd7\x02X\x00\ +*\xff\xd7\x02X\x00-\x01\x0a\x02X\x002\xff\xd7\x02\ +X\x004\xff\xd7\x02X\x007\xffq\x02X\x009\xff\ +\xae\x02X\x00:\xff\xae\x02X\x00<\xff\x85\x02X\x00\ +\x89\xff\xd7\x02X\x00\x94\xff\xd7\x02X\x00\x95\xff\xd7\x02\ +X\x00\x96\xff\xd7\x02X\x00\x97\xff\xd7\x02X\x00\x98\xff\ +\xd7\x02X\x00\x9a\xff\xd7\x02X\x00\x9f\xff\x85\x02X\x00\ +\xc8\xff\xd7\x02X\x00\xca\xff\xd7\x02X\x00\xcc\xff\xd7\x02\ +X\x00\xce\xff\xd7\x02X\x00\xde\xff\xd7\x02X\x00\xe0\xff\ +\xd7\x02X\x00\xe2\xff\xd7\x02X\x00\xe4\xff\xd7\x02X\x01\ +\x0e\xff\xd7\x02X\x01\x10\xff\xd7\x02X\x01\x12\xff\xd7\x02\ +X\x01\x14\xff\xd7\x02X\x01$\xffq\x02X\x01&\xff\ +q\x02X\x016\xff\xae\x02X\x018\xff\x85\x02X\x01\ +:\xff\x85\x02X\x01G\xff\xd7\x02X\x01\xfa\xff\xae\x02\ +X\x01\xfc\xff\xae\x02X\x01\xfe\xff\xae\x02X\x02\x00\xff\ +\x85\x02X\x02\x07\xffq\x02X\x02\x0b\xffq\x02X\x02\ +_\xff\xd7\x02X\x03I\xff\xd7\x02X\x03K\xff\xd7\x02\ +X\x03M\xff\xd7\x02X\x03O\xff\xd7\x02X\x03Q\xff\ +\xd7\x02X\x03S\xff\xd7\x02X\x03U\xff\xd7\x02X\x03\ +W\xff\xd7\x02X\x03Y\xff\xd7\x02X\x03[\xff\xd7\x02\ +X\x03]\xff\xd7\x02X\x03_\xff\xd7\x02X\x03o\xff\ +\x85\x02X\x03q\xff\x85\x02X\x03s\xff\x85\x02X\x03\ +\x8f\xffq\x02Y\x00\x05\xff\xec\x02Y\x00\x0a\xff\xec\x02\ +Y\x02\x07\xff\xec\x02Y\x02\x0b\xff\xec\x02Z\x00\x0f\xff\ +\xae\x02Z\x00\x11\xff\xae\x02Z\x01V\xff\xd7\x02Z\x01\ +_\xff\xd7\x02Z\x01b\xff\xd7\x02Z\x01d\xff\xec\x02\ +Z\x01i\xff\xd7\x02Z\x01p\xff\xec\x02Z\x01q\xff\ +\xc3\x02Z\x01r\xff\xec\x02Z\x01t\xff\xd7\x02Z\x01\ +u\xff\xec\x02Z\x01x\xff\xec\x02Z\x01\x88\xff\xec\x02\ +Z\x02\x08\xff\xae\x02Z\x02\x0c\xff\xae\x02Z\x02T\xff\ +\xec\x02`\x00I\x00R\x02`\x00W\x00R\x02`\x00\ +Y\x00f\x02`\x00Z\x00f\x02`\x00[\x00f\x02\ +`\x00\x5c\x00f\x02`\x00\xbf\x00f\x02`\x01%\x00\ +R\x02`\x01'\x00R\x02`\x017\x00f\x02`\x01\ +\xfb\x00f\x02`\x01\xfd\x00f\x02`\x024\x00R\x02\ +`\x025\x00R\x02`\x02]\x00R\x02`\x02^\x00\ +R\x02`\x03p\x00f\x02`\x03\x8d\x00R\x02`\x03\ +\x90\x00R\x02b\x00I\x00f\x02b\x00W\x00f\x02\ +b\x00Y\x00f\x02b\x00Z\x00f\x02b\x00[\x00\ +f\x02b\x00\x5c\x00f\x02b\x00\xbf\x00f\x02b\x01\ +%\x00f\x02b\x01'\x00f\x02b\x017\x00f\x02\ +b\x01\xfb\x00f\x02b\x01\xfd\x00f\x02b\x024\x00\ +f\x02b\x025\x00f\x02b\x02]\x00f\x02b\x02\ +^\x00f\x02b\x03p\x00f\x02b\x03\x8d\x00f\x02\ +b\x03\x90\x00f\x02j\x00\x05\xff\xec\x02j\x00\x0a\xff\ +\xec\x02j\x02\x07\xff\xec\x02j\x02\x0b\xff\xec\x02l\x00\ +\x0f\xff\xae\x02l\x00\x11\xff\xae\x02l\x01\x9d\xff\xec\x02\ +l\x01\xa4\xff\xd7\x02l\x01\xa6\xff\xec\x02l\x01\xa8\xff\ +\xd7\x02l\x01\xaa\xff\xd7\x02l\x01\xae\xff\xd7\x02l\x01\ +\xb0\xff\xd7\x02l\x01\xb1\xff\xec\x02l\x01\xb5\xff\xd7\x02\ +l\x01\xbc\xff\xc3\x02l\x01\xbd\xff\xd7\x02l\x01\xbf\xff\ +\xd7\x02l\x01\xc1\xff\xd7\x02l\x01\xc4\xff\xec\x02l\x01\ +\xc7\xff\xec\x02l\x01\xce\xff\xec\x02l\x01\xd5\xff\xec\x02\ +l\x01\xf2\xff\xec\x02l\x02\x08\xff\xae\x02l\x02\x0c\xff\ +\xae\x02l\x02r\xff\xd7\x02l\x02s\xff\xec\x02l\x02\ +z\xff\xec\x02l\x02|\xff\xd7\x02l\x02\x80\xff\xec\x02\ +l\x02\x82\xff\xec\x02l\x02\x9f\xff\xd7\x02l\x02\xa1\xff\ +\xec\x02l\x02\xa9\xff\xec\x02l\x02\xb5\xff\xc3\x02l\x02\ +\xb7\xff\xec\x02l\x02\xb9\xff\xec\x02l\x02\xbb\xff\xd7\x02\ +l\x02\xbd\xff\xec\x02l\x02\xbf\xff\xd7\x02l\x02\xc1\xff\ +\xd7\x02l\x02\xca\xff\xd7\x02l\x02\xce\xff\xd7\x02l\x02\ +\xcf\xff\xec\x02l\x02\xd4\xff\xd7\x02l\x02\xd9\xff\xd7\x02\ +l\x02\xdb\xff\xd7\x02l\x02\xdd\xff\xd7\x02l\x02\xe5\xff\ +\xd7\x02l\x02\xe7\xff\xec\x02l\x02\xf5\xff\xec\x02l\x02\ +\xf7\xff\xd7\x02l\x02\xf9\xff\xd7\x02l\x02\xfb\xff\xd7\x02\ +l\x02\xfd\xff\xd7\x02l\x03\x05\xff\xd7\x02l\x03\x07\xff\ +\xd7\x02l\x03\x0d\xff\xd7\x02l\x03\x0f\xff\xd7\x02l\x03\ +\x11\xff\xd7\x02l\x03\x12\xff\xec\x02l\x03\x17\xff\xec\x02\ +l\x03\x1b\xff\xd7\x02l\x03\x1c\xff\xec\x02m\x00\x0f\xff\ +\xae\x02m\x00\x11\xff\xae\x02m\x01\xce\xff\xd7\x02m\x01\ +\xd5\xff\xd7\x02m\x01\xf2\xff\xd7\x02m\x02\x08\xff\xae\x02\ +m\x02\x0c\xff\xae\x02m\x02s\xff\xd7\x02m\x02\xcf\xff\ +\xd7\x02m\x03\x12\xff\xd7\x02m\x03\x1c\xff\xd7\x02n\x00\ +\x05\xff\xae\x02n\x00\x0a\xff\xae\x02n\x01\x9d\xff\xd7\x02\ +n\x01\xa6\xff\xd7\x02n\x01\xbc\xff\xae\x02n\x01\xc1\xff\ +\xae\x02n\x01\xc4\xff\xd7\x02n\x01\xdc\xff\xd7\x02n\x01\ +\xe4\xff\xd7\x02n\x02\x07\xff\xae\x02n\x02\x0b\xff\xae\x02\ +n\x02|\xff\xae\x02n\x02\x80\xff\xc3\x02n\x02\x82\xff\ +\xc3\x02n\x02\xa9\xff\xd7\x02n\x02\xaa\xff\xd7\x02n\x02\ +\xb5\xff\xae\x02n\x02\xb6\xff\xd7\x02n\x02\xb7\xff\xc3\x02\ +n\x02\xb9\xff\xc3\x02n\x02\xbd\xff\xd7\x02n\x02\xbe\xff\ +\xd7\x02n\x02\xbf\xff\xae\x02n\x02\xc1\xff\xae\x02n\x02\ +\xd4\xff\xae\x02n\x02\xfd\xff\xae\x02n\x03\x0d\xff\x9a\x02\ +n\x03\x0f\xff\x9a\x02n\x03\x17\xff\xd7\x02n\x03\x18\xff\ +\xd7\x02o\x00\x05\xff\x85\x02o\x00\x0a\xff\x85\x02o\x01\ +\xd0\xff\xd7\x02o\x01\xdc\xff\x9a\x02o\x01\xdd\xff\xc3\x02\ +o\x01\xdf\xff\xd7\x02o\x01\xe1\xff\xae\x02o\x01\xe4\xff\ +\x9a\x02o\x01\xf6\xff\xc3\x02o\x02\x07\xff\x85\x02o\x02\ +\x0b\xff\x85\x02o\x02m\xff\xd7\x02o\x02\x81\xff\xd7\x02\ +o\x02\x83\xff\xd7\x02o\x02\x8b\xff\xd7\x02o\x02\xa0\xff\ +\xd7\x02o\x02\xaa\xff\x9a\x02o\x02\xb6\xff\x9a\x02o\x02\ +\xb8\xff\xc3\x02o\x02\xba\xff\xc3\x02o\x02\xbc\xff\xd7\x02\ +o\x02\xbe\xff\x9a\x02o\x02\xc0\xff\xae\x02o\x02\xc2\xff\ +\xae\x02o\x02\xc6\xff\xd7\x02o\x02\xc8\xff\xd7\x02o\x02\ +\xcb\xff\xd7\x02o\x02\xd5\xff\xae\x02o\x02\xe6\xff\xd7\x02\ +o\x02\xea\xff\xd7\x02o\x02\xf8\xff\xc3\x02o\x02\xfa\xff\ +\xc3\x02o\x02\xfc\xff\xc3\x02o\x02\xfe\xff\xae\x02o\x03\ +\x06\xff\xd7\x02o\x03\x08\xff\xd7\x02o\x03\x0e\xff\x9a\x02\ +o\x03\x10\xff\x9a\x02o\x03\x18\xff\x9a\x02p\x01\x9f\xff\ +\xd7\x02p\x01\xb8\xff\xd7\x02p\x01\xbb\xff\xd7\x02p\x01\ +\xbe\xff\xd7\x02p\x01\xe1\xff\xd7\x02p\x02l\xff\xd7\x02\ +p\x02~\xff\xd7\x02p\x02\x84\xff\xd7\x02p\x02\x86\xff\ +\xd7\x02p\x02\x88\xff\xd7\x02p\x02\x8a\xff\xd7\x02p\x02\ +\x8c\xff\xd7\x02p\x02\xb1\xff\xd7\x02p\x02\xb3\xff\xd7\x02\ +p\x02\xc0\xff\xd7\x02p\x02\xc2\xff\xd7\x02p\x02\xc5\xff\ +\xd7\x02p\x02\xc7\xff\xd7\x02p\x02\xd5\xff\xd7\x02p\x02\ +\xef\xff\xd7\x02p\x02\xf1\xff\xd7\x02p\x02\xf3\xff\xd7\x02\ +p\x02\xfe\xff\xd7\x02p\x03\x09\xff\xd7\x02p\x03\x0b\xff\ +\xd7\x02p\x03\x0e\xff\xd7\x02p\x03\x10\xff\xd7\x02p\x03\ +\x15\xff\xd7\x02r\x00\x05\xffq\x02r\x00\x0a\xffq\x02\ +r\x01\x9d\xff\x9a\x02r\x01\xa6\xff\x9a\x02r\x01\xbc\xff\ +q\x02r\x01\xbe\xff\xd7\x02r\x01\xc1\xff\x9a\x02r\x01\ +\xc4\xff\x9a\x02r\x01\xdc\xff\xd7\x02r\x01\xe1\xff\xd7\x02\ +r\x01\xe4\xff\xd7\x02r\x02\x07\xffq\x02r\x02\x0b\xff\ +q\x02r\x02n\xff\xd7\x02r\x02|\xff\x9a\x02r\x02\ +\x80\xff\xae\x02r\x02\x82\xff\xae\x02r\x02\x97\xff\xd7\x02\ +r\x02\x9b\xff\xd7\x02r\x02\xa7\xff\xd7\x02r\x02\xa9\xff\ +\x9a\x02r\x02\xaa\xff\xd7\x02r\x02\xb5\xffq\x02r\x02\ +\xb6\xff\xd7\x02r\x02\xb7\xff\x85\x02r\x02\xb9\xff\x85\x02\ +r\x02\xbd\xff\x9a\x02r\x02\xbe\xff\xd7\x02r\x02\xbf\xff\ +\x9a\x02r\x02\xc0\xff\xd7\x02r\x02\xc1\xff\x9a\x02r\x02\ +\xc2\xff\xd7\x02r\x02\xc5\xff\x9a\x02r\x02\xc7\xff\x9a\x02\ +r\x02\xd4\xff\x9a\x02r\x02\xd5\xff\xd7\x02r\x02\xe1\xff\ +\xd7\x02r\x02\xe3\xff\xd7\x02r\x02\xfd\xff\x9a\x02r\x02\ +\xfe\xff\xd7\x02r\x03\x03\xff\xd7\x02r\x03\x0d\xffq\x02\ +r\x03\x0e\xff\xd7\x02r\x03\x0f\xffq\x02r\x03\x10\xff\ +\xd7\x02r\x03\x17\xff\x9a\x02r\x03\x18\xff\xd7\x02s\x00\ +\x05\xffq\x02s\x00\x0a\xffq\x02s\x01\xcf\xff\xd7\x02\ +s\x01\xd8\xff\xd7\x02s\x01\xdb\xff\xd7\x02s\x01\xdc\xff\ +\x9a\x02s\x01\xdd\xff\xc3\x02s\x01\xde\xff\xd7\x02s\x01\ +\xe1\xff\xc3\x02s\x01\xe4\xff\x9a\x02s\x01\xea\xff\xd7\x02\ +s\x01\xed\xff\xd7\x02s\x01\xf6\xff\xc3\x02s\x02\x07\xff\ +q\x02s\x02\x0b\xffq\x02s\x02j\xff\xd7\x02s\x02\ +m\xff\xd7\x02s\x02}\xff\xec\x02s\x02\x7f\xff\xd7\x02\ +s\x02\x81\xff\xd7\x02s\x02\x83\xff\xd7\x02s\x02\x85\xff\ +\xd7\x02s\x02\x87\xff\xd7\x02s\x02\x89\xff\xd7\x02s\x02\ +\x8b\xff\xd7\x02s\x02\x8d\xff\xd7\x02s\x02\xaa\xff\x9a\x02\ +s\x02\xb2\xff\xd7\x02s\x02\xb4\xff\xd7\x02s\x02\xb6\xff\ +\x9a\x02s\x02\xb8\xff\xd7\x02s\x02\xba\xff\xd7\x02s\x02\ +\xbe\xff\x9a\x02s\x02\xc0\xff\xc3\x02s\x02\xc2\xff\xc3\x02\ +s\x02\xc6\xff\xd7\x02s\x02\xc8\xff\xd7\x02s\x02\xd5\xff\ +\xc3\x02s\x02\xe0\xff\xd7\x02s\x02\xf0\xff\xd7\x02s\x02\ +\xf2\xff\xd7\x02s\x02\xf4\xff\xd7\x02s\x02\xf8\xff\xc3\x02\ +s\x02\xfa\xff\xc3\x02s\x02\xfc\xff\xc3\x02s\x02\xfe\xff\ +\xc3\x02s\x03\x0a\xff\xd7\x02s\x03\x0c\xff\xd7\x02s\x03\ +\x0e\xff\x85\x02s\x03\x10\xff\x85\x02s\x03\x16\xff\xd7\x02\ +s\x03\x18\xff\x9a\x02s\x03\x1a\xff\xd7\x02t\x00\x05\xff\ +q\x02t\x00\x0a\xffq\x02t\x01\x9d\xff\x9a\x02t\x01\ +\xa6\xff\x9a\x02t\x01\xbc\xffq\x02t\x01\xbe\xff\xd7\x02\ +t\x01\xc1\xff\x9a\x02t\x01\xc4\xff\x9a\x02t\x01\xdc\xff\ +\xd7\x02t\x01\xe1\xff\xd7\x02t\x01\xe4\xff\xd7\x02t\x02\ +\x07\xffq\x02t\x02\x0b\xffq\x02t\x02n\xff\xd7\x02\ +t\x02|\xff\x9a\x02t\x02\x80\xff\xae\x02t\x02\x82\xff\ +\xae\x02t\x02\x97\xff\xd7\x02t\x02\x9b\xff\xd7\x02t\x02\ +\xa7\xff\xd7\x02t\x02\xa9\xff\x9a\x02t\x02\xaa\xff\xd7\x02\ +t\x02\xb5\xffq\x02t\x02\xb6\xff\xd7\x02t\x02\xb7\xff\ +\x85\x02t\x02\xb9\xff\x85\x02t\x02\xbd\xff\x9a\x02t\x02\ +\xbe\xff\xd7\x02t\x02\xbf\xff\x9a\x02t\x02\xc0\xff\xd7\x02\ +t\x02\xc1\xff\x9a\x02t\x02\xc2\xff\xd7\x02t\x02\xc5\xff\ +\x9a\x02t\x02\xc7\xff\x9a\x02t\x02\xd4\xff\x9a\x02t\x02\ +\xd5\xff\xd7\x02t\x02\xe1\xff\xd7\x02t\x02\xe3\xff\xd7\x02\ +t\x02\xfd\xff\x9a\x02t\x02\xfe\xff\xd7\x02t\x03\x03\xff\ +\xd7\x02t\x03\x0d\xffq\x02t\x03\x0e\xff\xd7\x02t\x03\ +\x0f\xffq\x02t\x03\x10\xff\xd7\x02t\x03\x17\xff\x9a\x02\ +t\x03\x18\xff\xd7\x02u\x00\x05\xffq\x02u\x00\x0a\xff\ +q\x02u\x01\xcf\xff\xd7\x02u\x01\xd8\xff\xd7\x02u\x01\ +\xdb\xff\xd7\x02u\x01\xdc\xff\x9a\x02u\x01\xdd\xff\xc3\x02\ +u\x01\xde\xff\xd7\x02u\x01\xe1\xff\xc3\x02u\x01\xe4\xff\ +\x9a\x02u\x01\xea\xff\xd7\x02u\x01\xed\xff\xd7\x02u\x01\ +\xf6\xff\xc3\x02u\x02\x07\xffq\x02u\x02\x0b\xffq\x02\ +u\x02j\xff\xd7\x02u\x02m\xff\xd7\x02u\x02}\xff\ +\xec\x02u\x02\x7f\xff\xd7\x02u\x02\x81\xff\xd7\x02u\x02\ +\x83\xff\xd7\x02u\x02\x85\xff\xd7\x02u\x02\x87\xff\xd7\x02\ +u\x02\x89\xff\xd7\x02u\x02\x8b\xff\xd7\x02u\x02\x8d\xff\ +\xd7\x02u\x02\xaa\xff\x9a\x02u\x02\xb2\xff\xd7\x02u\x02\ +\xb4\xff\xd7\x02u\x02\xb6\xff\x9a\x02u\x02\xb8\xff\xd7\x02\ +u\x02\xba\xff\xd7\x02u\x02\xbe\xff\x9a\x02u\x02\xc0\xff\ +\xc3\x02u\x02\xc2\xff\xc3\x02u\x02\xc6\xff\xd7\x02u\x02\ +\xc8\xff\xd7\x02u\x02\xd5\xff\xc3\x02u\x02\xe0\xff\xd7\x02\ +u\x02\xf0\xff\xd7\x02u\x02\xf2\xff\xd7\x02u\x02\xf4\xff\ +\xd7\x02u\x02\xf8\xff\xc3\x02u\x02\xfa\xff\xc3\x02u\x02\ +\xfc\xff\xc3\x02u\x02\xfe\xff\xc3\x02u\x03\x0a\xff\xd7\x02\ +u\x03\x0c\xff\xd7\x02u\x03\x0e\xff\x85\x02u\x03\x10\xff\ +\x85\x02u\x03\x16\xff\xd7\x02u\x03\x18\xff\x9a\x02u\x03\ +\x1a\xff\xd7\x02v\x03\x0d\xff\xec\x02v\x03\x0f\xff\xec\x02\ +x\x03\x0d\xff\xec\x02x\x03\x0f\xff\xec\x02z\x00\x0f\xff\ +\xae\x02z\x00\x11\xff\xae\x02z\x02\x08\xff\xae\x02z\x02\ +\x0c\xff\xae\x02z\x02\x80\xff\xec\x02z\x02\x82\xff\xec\x02\ +z\x02\xb7\xff\xec\x02z\x02\xb9\xff\xec\x02z\x03\x0d\xff\ +\xd7\x02z\x03\x0f\xff\xd7\x02|\x00\x0f\xffq\x02|\x00\ +\x11\xffq\x02|\x01\xa4\xff\xc3\x02|\x01\xaa\xff\xae\x02\ +|\x01\xae\xff\xc3\x02|\x01\xb5\xff\xc3\x02|\x01\xce\xff\ +\xd7\x02|\x01\xd5\xff\xd7\x02|\x01\xf2\xff\xd7\x02|\x02\ +\x08\xffq\x02|\x02\x0c\xffq\x02|\x02r\xff\xae\x02\ +|\x02s\xff\xd7\x02|\x02\xce\xff\xc3\x02|\x02\xcf\xff\ +\xd7\x02|\x02\xd9\xff\xae\x02|\x02\xdb\xff\xae\x02|\x02\ +\xdd\xff\xae\x02|\x03\x09\xff\xae\x02|\x03\x0b\xff\xae\x02\ +|\x03\x11\xff\xc3\x02|\x03\x12\xff\xd7\x02|\x03\x1b\xff\ +\xc3\x02|\x03\x1c\xff\xd7\x02}\x00\x05\xff\xec\x02}\x00\ +\x0a\xff\xec\x02}\x01\xd0\xff\xd7\x02}\x01\xdc\xff\xec\x02\ +}\x01\xdd\xff\xec\x02}\x01\xdf\xff\xd7\x02}\x01\xe1\xff\ +\xec\x02}\x01\xe4\xff\xec\x02}\x01\xf6\xff\xec\x02}\x02\ +\x07\xff\xec\x02}\x02\x0b\xff\xec\x02}\x02\xa0\xff\xd7\x02\ +}\x02\xaa\xff\xec\x02}\x02\xb6\xff\xec\x02}\x02\xbc\xff\ +\xd7\x02}\x02\xbe\xff\xec\x02}\x02\xc0\xff\xec\x02}\x02\ +\xc2\xff\xec\x02}\x02\xcb\xff\xd7\x02}\x02\xd5\xff\xec\x02\ +}\x02\xe6\xff\xd7\x02}\x02\xf8\xff\xec\x02}\x02\xfa\xff\ +\xec\x02}\x02\xfc\xff\xec\x02}\x02\xfe\xff\xec\x02}\x03\ +\x06\xff\xd7\x02}\x03\x08\xff\xd7\x02}\x03\x0e\xff\xec\x02\ +}\x03\x10\xff\xec\x02}\x03\x18\xff\xec\x02~\x00\x0f\xff\ +\xae\x02~\x00\x11\xff\xae\x02~\x01\x9d\xff\xec\x02~\x01\ +\xa4\xff\xd7\x02~\x01\xa6\xff\xec\x02~\x01\xa8\xff\xd7\x02\ +~\x01\xaa\xff\xd7\x02~\x01\xae\xff\xd7\x02~\x01\xb0\xff\ +\xd7\x02~\x01\xb1\xff\xec\x02~\x01\xb5\xff\xd7\x02~\x01\ +\xbc\xff\xc3\x02~\x01\xbd\xff\xd7\x02~\x01\xbf\xff\xd7\x02\ +~\x01\xc1\xff\xd7\x02~\x01\xc4\xff\xec\x02~\x01\xc7\xff\ +\xec\x02~\x01\xce\xff\xec\x02~\x01\xd5\xff\xec\x02~\x01\ +\xf2\xff\xec\x02~\x02\x08\xff\xae\x02~\x02\x0c\xff\xae\x02\ +~\x02r\xff\xd7\x02~\x02s\xff\xec\x02~\x02z\xff\ +\xec\x02~\x02|\xff\xd7\x02~\x02\x80\xff\xec\x02~\x02\ +\x82\xff\xec\x02~\x02\x9f\xff\xd7\x02~\x02\xa1\xff\xec\x02\ +~\x02\xa9\xff\xec\x02~\x02\xb5\xff\xc3\x02~\x02\xb7\xff\ +\xec\x02~\x02\xb9\xff\xec\x02~\x02\xbb\xff\xd7\x02~\x02\ +\xbd\xff\xec\x02~\x02\xbf\xff\xd7\x02~\x02\xc1\xff\xd7\x02\ +~\x02\xca\xff\xd7\x02~\x02\xce\xff\xd7\x02~\x02\xcf\xff\ +\xec\x02~\x02\xd4\xff\xd7\x02~\x02\xd9\xff\xd7\x02~\x02\ +\xdb\xff\xd7\x02~\x02\xdd\xff\xd7\x02~\x02\xe5\xff\xd7\x02\ +~\x02\xe7\xff\xec\x02~\x02\xf5\xff\xec\x02~\x02\xf7\xff\ +\xd7\x02~\x02\xf9\xff\xd7\x02~\x02\xfb\xff\xd7\x02~\x02\ +\xfd\xff\xd7\x02~\x03\x05\xff\xd7\x02~\x03\x07\xff\xd7\x02\ +~\x03\x0d\xff\xd7\x02~\x03\x0f\xff\xd7\x02~\x03\x11\xff\ +\xd7\x02~\x03\x12\xff\xec\x02~\x03\x17\xff\xec\x02~\x03\ +\x1b\xff\xd7\x02~\x03\x1c\xff\xec\x02\x7f\x00\x05\xff\xec\x02\ +\x7f\x00\x0a\xff\xec\x02\x7f\x01\xd0\xff\xd7\x02\x7f\x01\xdc\xff\ +\xec\x02\x7f\x01\xdd\xff\xec\x02\x7f\x01\xdf\xff\xd7\x02\x7f\x01\ +\xe1\xff\xec\x02\x7f\x01\xe4\xff\xec\x02\x7f\x01\xf6\xff\xec\x02\ +\x7f\x02\x07\xff\xec\x02\x7f\x02\x0b\xff\xec\x02\x7f\x02\xa0\xff\ +\xd7\x02\x7f\x02\xaa\xff\xec\x02\x7f\x02\xb6\xff\xec\x02\x7f\x02\ +\xbc\xff\xd7\x02\x7f\x02\xbe\xff\xec\x02\x7f\x02\xc0\xff\xec\x02\ +\x7f\x02\xc2\xff\xec\x02\x7f\x02\xcb\xff\xd7\x02\x7f\x02\xd5\xff\ +\xec\x02\x7f\x02\xe6\xff\xd7\x02\x7f\x02\xf8\xff\xec\x02\x7f\x02\ +\xfa\xff\xec\x02\x7f\x02\xfc\xff\xec\x02\x7f\x02\xfe\xff\xec\x02\ +\x7f\x03\x06\xff\xd7\x02\x7f\x03\x08\xff\xd7\x02\x7f\x03\x0e\xff\ +\xec\x02\x7f\x03\x10\xff\xec\x02\x7f\x03\x18\xff\xec\x02\x80\x00\ +\x0f\xff\x85\x02\x80\x00\x11\xff\x85\x02\x80\x01\x9f\xff\xec\x02\ +\x80\x01\xa4\xff\x9a\x02\x80\x01\xaa\xffq\x02\x80\x01\xae\xff\ +\x9a\x02\x80\x01\xb5\xff\x9a\x02\x80\x01\xb8\xff\xec\x02\x80\x01\ +\xbb\xff\xec\x02\x80\x01\xbe\xff\xc3\x02\x80\x01\xc9\xff\xec\x02\ +\x80\x01\xce\xff\xae\x02\x80\x01\xcf\xff\xd7\x02\x80\x01\xd5\xff\ +\xae\x02\x80\x01\xd8\xff\xd7\x02\x80\x01\xdb\xff\xd7\x02\x80\x01\ +\xde\xff\xd7\x02\x80\x01\xe1\xff\xd7\x02\x80\x01\xea\xff\xd7\x02\ +\x80\x01\xeb\x00f\x02\x80\x01\xed\xff\xd7\x02\x80\x01\xee\xff\ +\xec\x02\x80\x01\xf2\xff\xae\x02\x80\x01\xf4\x00f\x02\x80\x02\ +\x08\xff\x85\x02\x80\x02\x0c\xff\x85\x02\x80\x02j\xff\xd7\x02\ +\x80\x02l\xff\xec\x02\x80\x02r\xffq\x02\x80\x02s\xff\ +\xae\x02\x80\x02~\xff\xec\x02\x80\x02\x7f\xff\xd7\x02\x80\x02\ +\x84\xff\xec\x02\x80\x02\x85\xff\xd7\x02\x80\x02\x86\xff\xec\x02\ +\x80\x02\x87\xff\xd7\x02\x80\x02\x88\xff\xec\x02\x80\x02\x89\xff\ +\xd7\x02\x80\x02\x8a\xff\xec\x02\x80\x02\x8c\xff\xec\x02\x80\x02\ +\x8d\xff\xd7\x02\x80\x02\x98\x00f\x02\x80\x02\xa8\x00f\x02\ +\x80\x02\xb1\xff\xec\x02\x80\x02\xb2\xff\xd7\x02\x80\x02\xb3\xff\ +\xec\x02\x80\x02\xb4\xff\xd7\x02\x80\x02\xc0\xff\xd7\x02\x80\x02\ +\xc2\xff\xd7\x02\x80\x02\xc5\xff\xd7\x02\x80\x02\xc6\xff\xc3\x02\ +\x80\x02\xc7\xff\xd7\x02\x80\x02\xc8\xff\xc3\x02\x80\x02\xce\xff\ +\x9a\x02\x80\x02\xcf\xff\xae\x02\x80\x02\xd5\xff\xd7\x02\x80\x02\ +\xd9\xffq\x02\x80\x02\xdb\xffq\x02\x80\x02\xdd\xffq\x02\ +\x80\x02\xe0\xff\xd7\x02\x80\x02\xef\xff\xec\x02\x80\x02\xf0\xff\ +\xd7\x02\x80\x02\xf1\xff\xec\x02\x80\x02\xf2\xff\xd7\x02\x80\x02\ +\xf3\xff\xec\x02\x80\x02\xf4\xff\xd7\x02\x80\x02\xfe\xff\xd7\x02\ +\x80\x03\x09\xffq\x02\x80\x03\x0a\xff\xd7\x02\x80\x03\x0b\xff\ +q\x02\x80\x03\x0c\xff\xd7\x02\x80\x03\x11\xff\x9a\x02\x80\x03\ +\x12\xff\xae\x02\x80\x03\x15\xff\xec\x02\x80\x03\x16\xff\xd7\x02\ +\x80\x03\x1a\xff\xd7\x02\x80\x03\x1b\xff\x9a\x02\x80\x03\x1c\xff\ +\xae\x02\x81\x00\x0f\xff\xae\x02\x81\x00\x11\xff\xae\x02\x81\x01\ +\xce\xff\xd7\x02\x81\x01\xd5\xff\xd7\x02\x81\x01\xf2\xff\xd7\x02\ +\x81\x02\x08\xff\xae\x02\x81\x02\x0c\xff\xae\x02\x81\x02s\xff\ +\xd7\x02\x81\x02\xcf\xff\xd7\x02\x81\x03\x12\xff\xd7\x02\x81\x03\ +\x1c\xff\xd7\x02\x82\x00\x0f\xff\x85\x02\x82\x00\x11\xff\x85\x02\ +\x82\x01\x9f\xff\xec\x02\x82\x01\xa4\xff\x9a\x02\x82\x01\xaa\xff\ +q\x02\x82\x01\xae\xff\x9a\x02\x82\x01\xb5\xff\x9a\x02\x82\x01\ +\xb8\xff\xec\x02\x82\x01\xbb\xff\xec\x02\x82\x01\xbe\xff\xc3\x02\ +\x82\x01\xc9\xff\xec\x02\x82\x01\xce\xff\xae\x02\x82\x01\xcf\xff\ +\xd7\x02\x82\x01\xd5\xff\xae\x02\x82\x01\xd8\xff\xd7\x02\x82\x01\ +\xdb\xff\xd7\x02\x82\x01\xde\xff\xd7\x02\x82\x01\xe1\xff\xd7\x02\ +\x82\x01\xea\xff\xd7\x02\x82\x01\xeb\x00f\x02\x82\x01\xed\xff\ +\xd7\x02\x82\x01\xee\xff\xec\x02\x82\x01\xf2\xff\xae\x02\x82\x01\ +\xf4\x00f\x02\x82\x02\x08\xff\x85\x02\x82\x02\x0c\xff\x85\x02\ +\x82\x02j\xff\xd7\x02\x82\x02l\xff\xec\x02\x82\x02r\xff\ +q\x02\x82\x02s\xff\xae\x02\x82\x02~\xff\xec\x02\x82\x02\ +\x7f\xff\xd7\x02\x82\x02\x84\xff\xec\x02\x82\x02\x85\xff\xd7\x02\ +\x82\x02\x86\xff\xec\x02\x82\x02\x87\xff\xd7\x02\x82\x02\x88\xff\ +\xec\x02\x82\x02\x89\xff\xd7\x02\x82\x02\x8a\xff\xec\x02\x82\x02\ +\x8c\xff\xec\x02\x82\x02\x8d\xff\xd7\x02\x82\x02\x98\x00f\x02\ +\x82\x02\xa8\x00f\x02\x82\x02\xb1\xff\xec\x02\x82\x02\xb2\xff\ +\xd7\x02\x82\x02\xb3\xff\xec\x02\x82\x02\xb4\xff\xd7\x02\x82\x02\ +\xc0\xff\xd7\x02\x82\x02\xc2\xff\xd7\x02\x82\x02\xc5\xff\xd7\x02\ +\x82\x02\xc6\xff\xc3\x02\x82\x02\xc7\xff\xd7\x02\x82\x02\xc8\xff\ +\xc3\x02\x82\x02\xce\xff\x9a\x02\x82\x02\xcf\xff\xae\x02\x82\x02\ +\xd5\xff\xd7\x02\x82\x02\xd9\xffq\x02\x82\x02\xdb\xffq\x02\ +\x82\x02\xdd\xffq\x02\x82\x02\xe0\xff\xd7\x02\x82\x02\xef\xff\ +\xec\x02\x82\x02\xf0\xff\xd7\x02\x82\x02\xf1\xff\xec\x02\x82\x02\ +\xf2\xff\xd7\x02\x82\x02\xf3\xff\xec\x02\x82\x02\xf4\xff\xd7\x02\ +\x82\x02\xfe\xff\xd7\x02\x82\x03\x09\xffq\x02\x82\x03\x0a\xff\ +\xd7\x02\x82\x03\x0b\xffq\x02\x82\x03\x0c\xff\xd7\x02\x82\x03\ +\x11\xff\x9a\x02\x82\x03\x12\xff\xae\x02\x82\x03\x15\xff\xec\x02\ +\x82\x03\x16\xff\xd7\x02\x82\x03\x1a\xff\xd7\x02\x82\x03\x1b\xff\ +\x9a\x02\x82\x03\x1c\xff\xae\x02\x83\x00\x0f\xff\xae\x02\x83\x00\ +\x11\xff\xae\x02\x83\x01\xce\xff\xd7\x02\x83\x01\xd5\xff\xd7\x02\ +\x83\x01\xf2\xff\xd7\x02\x83\x02\x08\xff\xae\x02\x83\x02\x0c\xff\ +\xae\x02\x83\x02s\xff\xd7\x02\x83\x02\xcf\xff\xd7\x02\x83\x03\ +\x12\xff\xd7\x02\x83\x03\x1c\xff\xd7\x02\x84\x00\x0f\xff\xae\x02\ +\x84\x00\x11\xff\xae\x02\x84\x01\xce\xff\xd7\x02\x84\x01\xd5\xff\ +\xd7\x02\x84\x01\xf2\xff\xd7\x02\x84\x02\x08\xff\xae\x02\x84\x02\ +\x0c\xff\xae\x02\x84\x02s\xff\xd7\x02\x84\x02\xcf\xff\xd7\x02\ +\x84\x03\x12\xff\xd7\x02\x84\x03\x1c\xff\xd7\x02\x85\x00\x0f\xff\ +\xae\x02\x85\x00\x11\xff\xae\x02\x85\x01\xce\xff\xd7\x02\x85\x01\ +\xd5\xff\xd7\x02\x85\x01\xf2\xff\xd7\x02\x85\x02\x08\xff\xae\x02\ +\x85\x02\x0c\xff\xae\x02\x85\x02s\xff\xd7\x02\x85\x02\xcf\xff\ +\xd7\x02\x85\x03\x12\xff\xd7\x02\x85\x03\x1c\xff\xd7\x02\x86\x00\ +\x0f\xff\xae\x02\x86\x00\x11\xff\xae\x02\x86\x01\x9d\xff\xec\x02\ +\x86\x01\xa4\xff\xd7\x02\x86\x01\xa6\xff\xec\x02\x86\x01\xa8\xff\ +\xd7\x02\x86\x01\xaa\xff\xd7\x02\x86\x01\xae\xff\xd7\x02\x86\x01\ +\xb0\xff\xd7\x02\x86\x01\xb1\xff\xec\x02\x86\x01\xb5\xff\xd7\x02\ +\x86\x01\xbc\xff\xc3\x02\x86\x01\xbd\xff\xd7\x02\x86\x01\xbf\xff\ +\xd7\x02\x86\x01\xc1\xff\xd7\x02\x86\x01\xc4\xff\xec\x02\x86\x01\ +\xc7\xff\xec\x02\x86\x01\xce\xff\xec\x02\x86\x01\xd5\xff\xec\x02\ +\x86\x01\xf2\xff\xec\x02\x86\x02\x08\xff\xae\x02\x86\x02\x0c\xff\ +\xae\x02\x86\x02r\xff\xd7\x02\x86\x02s\xff\xec\x02\x86\x02\ +z\xff\xec\x02\x86\x02|\xff\xd7\x02\x86\x02\x80\xff\xec\x02\ +\x86\x02\x82\xff\xec\x02\x86\x02\x9f\xff\xd7\x02\x86\x02\xa1\xff\ +\xec\x02\x86\x02\xa9\xff\xec\x02\x86\x02\xb5\xff\xc3\x02\x86\x02\ +\xb7\xff\xec\x02\x86\x02\xb9\xff\xec\x02\x86\x02\xbb\xff\xd7\x02\ +\x86\x02\xbd\xff\xec\x02\x86\x02\xbf\xff\xd7\x02\x86\x02\xc1\xff\ +\xd7\x02\x86\x02\xca\xff\xd7\x02\x86\x02\xce\xff\xd7\x02\x86\x02\ +\xcf\xff\xec\x02\x86\x02\xd4\xff\xd7\x02\x86\x02\xd9\xff\xd7\x02\ +\x86\x02\xdb\xff\xd7\x02\x86\x02\xdd\xff\xd7\x02\x86\x02\xe5\xff\ +\xd7\x02\x86\x02\xe7\xff\xec\x02\x86\x02\xf5\xff\xec\x02\x86\x02\ +\xf7\xff\xd7\x02\x86\x02\xf9\xff\xd7\x02\x86\x02\xfb\xff\xd7\x02\ +\x86\x02\xfd\xff\xd7\x02\x86\x03\x05\xff\xd7\x02\x86\x03\x07\xff\ +\xd7\x02\x86\x03\x0d\xff\xd7\x02\x86\x03\x0f\xff\xd7\x02\x86\x03\ +\x11\xff\xd7\x02\x86\x03\x12\xff\xec\x02\x86\x03\x17\xff\xec\x02\ +\x86\x03\x1b\xff\xd7\x02\x86\x03\x1c\xff\xec\x02\x87\x00\x05\xff\ +\xec\x02\x87\x00\x0a\xff\xec\x02\x87\x01\xd0\xff\xd7\x02\x87\x01\ +\xdc\xff\xec\x02\x87\x01\xdd\xff\xec\x02\x87\x01\xdf\xff\xd7\x02\ +\x87\x01\xe1\xff\xec\x02\x87\x01\xe4\xff\xec\x02\x87\x01\xf6\xff\ +\xec\x02\x87\x02\x07\xff\xec\x02\x87\x02\x0b\xff\xec\x02\x87\x02\ +\xa0\xff\xd7\x02\x87\x02\xaa\xff\xec\x02\x87\x02\xb6\xff\xec\x02\ +\x87\x02\xbc\xff\xd7\x02\x87\x02\xbe\xff\xec\x02\x87\x02\xc0\xff\ +\xec\x02\x87\x02\xc2\xff\xec\x02\x87\x02\xcb\xff\xd7\x02\x87\x02\ +\xd5\xff\xec\x02\x87\x02\xe6\xff\xd7\x02\x87\x02\xf8\xff\xec\x02\ +\x87\x02\xfa\xff\xec\x02\x87\x02\xfc\xff\xec\x02\x87\x02\xfe\xff\ +\xec\x02\x87\x03\x06\xff\xd7\x02\x87\x03\x08\xff\xd7\x02\x87\x03\ +\x0e\xff\xec\x02\x87\x03\x10\xff\xec\x02\x87\x03\x18\xff\xec\x02\ +\x88\x00\x0f\xff\xae\x02\x88\x00\x11\xff\xae\x02\x88\x01\x9d\xff\ +\xec\x02\x88\x01\xa4\xff\xd7\x02\x88\x01\xa6\xff\xec\x02\x88\x01\ +\xa8\xff\xd7\x02\x88\x01\xaa\xff\xd7\x02\x88\x01\xae\xff\xd7\x02\ +\x88\x01\xb0\xff\xd7\x02\x88\x01\xb1\xff\xec\x02\x88\x01\xb5\xff\ +\xd7\x02\x88\x01\xbc\xff\xc3\x02\x88\x01\xbd\xff\xd7\x02\x88\x01\ +\xbf\xff\xd7\x02\x88\x01\xc1\xff\xd7\x02\x88\x01\xc4\xff\xec\x02\ +\x88\x01\xc7\xff\xec\x02\x88\x01\xce\xff\xec\x02\x88\x01\xd5\xff\ +\xec\x02\x88\x01\xf2\xff\xec\x02\x88\x02\x08\xff\xae\x02\x88\x02\ +\x0c\xff\xae\x02\x88\x02r\xff\xd7\x02\x88\x02s\xff\xec\x02\ +\x88\x02z\xff\xec\x02\x88\x02|\xff\xd7\x02\x88\x02\x80\xff\ +\xec\x02\x88\x02\x82\xff\xec\x02\x88\x02\x9f\xff\xd7\x02\x88\x02\ +\xa1\xff\xec\x02\x88\x02\xa9\xff\xec\x02\x88\x02\xb5\xff\xc3\x02\ +\x88\x02\xb7\xff\xec\x02\x88\x02\xb9\xff\xec\x02\x88\x02\xbb\xff\ +\xd7\x02\x88\x02\xbd\xff\xec\x02\x88\x02\xbf\xff\xd7\x02\x88\x02\ +\xc1\xff\xd7\x02\x88\x02\xca\xff\xd7\x02\x88\x02\xce\xff\xd7\x02\ +\x88\x02\xcf\xff\xec\x02\x88\x02\xd4\xff\xd7\x02\x88\x02\xd9\xff\ +\xd7\x02\x88\x02\xdb\xff\xd7\x02\x88\x02\xdd\xff\xd7\x02\x88\x02\ +\xe5\xff\xd7\x02\x88\x02\xe7\xff\xec\x02\x88\x02\xf5\xff\xec\x02\ +\x88\x02\xf7\xff\xd7\x02\x88\x02\xf9\xff\xd7\x02\x88\x02\xfb\xff\ +\xd7\x02\x88\x02\xfd\xff\xd7\x02\x88\x03\x05\xff\xd7\x02\x88\x03\ +\x07\xff\xd7\x02\x88\x03\x0d\xff\xd7\x02\x88\x03\x0f\xff\xd7\x02\ +\x88\x03\x11\xff\xd7\x02\x88\x03\x12\xff\xec\x02\x88\x03\x17\xff\ +\xec\x02\x88\x03\x1b\xff\xd7\x02\x88\x03\x1c\xff\xec\x02\x89\x00\ +\x05\xff\xec\x02\x89\x00\x0a\xff\xec\x02\x89\x01\xd0\xff\xd7\x02\ +\x89\x01\xdc\xff\xec\x02\x89\x01\xdd\xff\xec\x02\x89\x01\xdf\xff\ +\xd7\x02\x89\x01\xe1\xff\xec\x02\x89\x01\xe4\xff\xec\x02\x89\x01\ +\xf6\xff\xec\x02\x89\x02\x07\xff\xec\x02\x89\x02\x0b\xff\xec\x02\ +\x89\x02\xa0\xff\xd7\x02\x89\x02\xaa\xff\xec\x02\x89\x02\xb6\xff\ +\xec\x02\x89\x02\xbc\xff\xd7\x02\x89\x02\xbe\xff\xec\x02\x89\x02\ +\xc0\xff\xec\x02\x89\x02\xc2\xff\xec\x02\x89\x02\xcb\xff\xd7\x02\ +\x89\x02\xd5\xff\xec\x02\x89\x02\xe6\xff\xd7\x02\x89\x02\xf8\xff\ +\xec\x02\x89\x02\xfa\xff\xec\x02\x89\x02\xfc\xff\xec\x02\x89\x02\ +\xfe\xff\xec\x02\x89\x03\x06\xff\xd7\x02\x89\x03\x08\xff\xd7\x02\ +\x89\x03\x0e\xff\xec\x02\x89\x03\x10\xff\xec\x02\x89\x03\x18\xff\ +\xec\x02\x8a\x00\x0f\xff\xae\x02\x8a\x00\x11\xff\xae\x02\x8a\x01\ +\x9d\xff\xec\x02\x8a\x01\xa4\xff\xd7\x02\x8a\x01\xa6\xff\xec\x02\ +\x8a\x01\xa8\xff\xd7\x02\x8a\x01\xaa\xff\xd7\x02\x8a\x01\xae\xff\ +\xd7\x02\x8a\x01\xb0\xff\xd7\x02\x8a\x01\xb1\xff\xec\x02\x8a\x01\ +\xb5\xff\xd7\x02\x8a\x01\xbc\xff\xc3\x02\x8a\x01\xbd\xff\xd7\x02\ +\x8a\x01\xbf\xff\xd7\x02\x8a\x01\xc1\xff\xd7\x02\x8a\x01\xc4\xff\ +\xec\x02\x8a\x01\xc7\xff\xec\x02\x8a\x01\xce\xff\xec\x02\x8a\x01\ +\xd5\xff\xec\x02\x8a\x01\xf2\xff\xec\x02\x8a\x02\x08\xff\xae\x02\ +\x8a\x02\x0c\xff\xae\x02\x8a\x02r\xff\xd7\x02\x8a\x02s\xff\ +\xec\x02\x8a\x02z\xff\xec\x02\x8a\x02|\xff\xd7\x02\x8a\x02\ +\x80\xff\xec\x02\x8a\x02\x82\xff\xec\x02\x8a\x02\x9f\xff\xd7\x02\ +\x8a\x02\xa1\xff\xec\x02\x8a\x02\xa9\xff\xec\x02\x8a\x02\xb5\xff\ +\xc3\x02\x8a\x02\xb7\xff\xec\x02\x8a\x02\xb9\xff\xec\x02\x8a\x02\ +\xbb\xff\xd7\x02\x8a\x02\xbd\xff\xec\x02\x8a\x02\xbf\xff\xd7\x02\ +\x8a\x02\xc1\xff\xd7\x02\x8a\x02\xca\xff\xd7\x02\x8a\x02\xce\xff\ +\xd7\x02\x8a\x02\xcf\xff\xec\x02\x8a\x02\xd4\xff\xd7\x02\x8a\x02\ +\xd9\xff\xd7\x02\x8a\x02\xdb\xff\xd7\x02\x8a\x02\xdd\xff\xd7\x02\ +\x8a\x02\xe5\xff\xd7\x02\x8a\x02\xe7\xff\xec\x02\x8a\x02\xf5\xff\ +\xec\x02\x8a\x02\xf7\xff\xd7\x02\x8a\x02\xf9\xff\xd7\x02\x8a\x02\ +\xfb\xff\xd7\x02\x8a\x02\xfd\xff\xd7\x02\x8a\x03\x05\xff\xd7\x02\ +\x8a\x03\x07\xff\xd7\x02\x8a\x03\x0d\xff\xd7\x02\x8a\x03\x0f\xff\ +\xd7\x02\x8a\x03\x11\xff\xd7\x02\x8a\x03\x12\xff\xec\x02\x8a\x03\ +\x17\xff\xec\x02\x8a\x03\x1b\xff\xd7\x02\x8a\x03\x1c\xff\xec\x02\ +\x8b\x00\x0f\xff\xae\x02\x8b\x00\x11\xff\xae\x02\x8b\x01\xce\xff\ +\xd7\x02\x8b\x01\xd5\xff\xd7\x02\x8b\x01\xf2\xff\xd7\x02\x8b\x02\ +\x08\xff\xae\x02\x8b\x02\x0c\xff\xae\x02\x8b\x02s\xff\xd7\x02\ +\x8b\x02\xcf\xff\xd7\x02\x8b\x03\x12\xff\xd7\x02\x8b\x03\x1c\xff\ +\xd7\x02\x8c\x01\x9f\xff\xd7\x02\x8c\x01\xb8\xff\xd7\x02\x8c\x01\ +\xbb\xff\xd7\x02\x8c\x01\xbe\xff\xd7\x02\x8c\x01\xe1\xff\xd7\x02\ +\x8c\x02l\xff\xd7\x02\x8c\x02~\xff\xd7\x02\x8c\x02\x84\xff\ +\xd7\x02\x8c\x02\x86\xff\xd7\x02\x8c\x02\x88\xff\xd7\x02\x8c\x02\ +\x8a\xff\xd7\x02\x8c\x02\x8c\xff\xd7\x02\x8c\x02\xb1\xff\xd7\x02\ +\x8c\x02\xb3\xff\xd7\x02\x8c\x02\xc0\xff\xd7\x02\x8c\x02\xc2\xff\ +\xd7\x02\x8c\x02\xc5\xff\xd7\x02\x8c\x02\xc7\xff\xd7\x02\x8c\x02\ +\xd5\xff\xd7\x02\x8c\x02\xef\xff\xd7\x02\x8c\x02\xf1\xff\xd7\x02\ +\x8c\x02\xf3\xff\xd7\x02\x8c\x02\xfe\xff\xd7\x02\x8c\x03\x09\xff\ +\xd7\x02\x8c\x03\x0b\xff\xd7\x02\x8c\x03\x0e\xff\xd7\x02\x8c\x03\ +\x10\xff\xd7\x02\x8c\x03\x15\xff\xd7\x02\x95\x01\xa3\x00\xe1\x02\ +\x95\x02\xea\x00)\x02\x95\x03\x0e\xff\xd7\x02\x95\x03\x10\xff\ +\xd7\x02\x96\x00\x05\xff\xec\x02\x96\x00\x0a\xff\xec\x02\x96\x02\ +\x07\xff\xec\x02\x96\x02\x0b\xff\xec\x02\x97\x00\x05\xff\xae\x02\ +\x97\x00\x0a\xff\xae\x02\x97\x01\x9d\xff\xd7\x02\x97\x01\xa6\xff\ +\xd7\x02\x97\x01\xbc\xff\xae\x02\x97\x01\xc1\xff\xae\x02\x97\x01\ +\xc4\xff\xd7\x02\x97\x01\xdc\xff\xd7\x02\x97\x01\xe4\xff\xd7\x02\ +\x97\x02\x07\xff\xae\x02\x97\x02\x0b\xff\xae\x02\x97\x02|\xff\ +\xae\x02\x97\x02\x80\xff\xc3\x02\x97\x02\x82\xff\xc3\x02\x97\x02\ +\xa9\xff\xd7\x02\x97\x02\xaa\xff\xd7\x02\x97\x02\xb5\xff\xae\x02\ +\x97\x02\xb6\xff\xd7\x02\x97\x02\xb7\xff\xc3\x02\x97\x02\xb9\xff\ +\xc3\x02\x97\x02\xbd\xff\xd7\x02\x97\x02\xbe\xff\xd7\x02\x97\x02\ +\xbf\xff\xae\x02\x97\x02\xc1\xff\xae\x02\x97\x02\xd4\xff\xae\x02\ +\x97\x02\xfd\xff\xae\x02\x97\x03\x0d\xff\x9a\x02\x97\x03\x0f\xff\ +\x9a\x02\x97\x03\x17\xff\xd7\x02\x97\x03\x18\xff\xd7\x02\x98\x00\ +\x05\xff\x85\x02\x98\x00\x0a\xff\x85\x02\x98\x01\xd0\xff\xd7\x02\ +\x98\x01\xdc\xff\x9a\x02\x98\x01\xdd\xff\xc3\x02\x98\x01\xdf\xff\ +\xd7\x02\x98\x01\xe1\xff\xae\x02\x98\x01\xe4\xff\x9a\x02\x98\x01\ +\xf6\xff\xc3\x02\x98\x02\x07\xff\x85\x02\x98\x02\x0b\xff\x85\x02\ +\x98\x02m\xff\xd7\x02\x98\x02\x81\xff\xd7\x02\x98\x02\x83\xff\ +\xd7\x02\x98\x02\x8b\xff\xd7\x02\x98\x02\xa0\xff\xd7\x02\x98\x02\ +\xaa\xff\x9a\x02\x98\x02\xb6\xff\x9a\x02\x98\x02\xb8\xff\xc3\x02\ +\x98\x02\xba\xff\xc3\x02\x98\x02\xbc\xff\xd7\x02\x98\x02\xbe\xff\ +\x9a\x02\x98\x02\xc0\xff\xae\x02\x98\x02\xc2\xff\xae\x02\x98\x02\ +\xc6\xff\xd7\x02\x98\x02\xc8\xff\xd7\x02\x98\x02\xcb\xff\xd7\x02\ +\x98\x02\xd5\xff\xae\x02\x98\x02\xe6\xff\xd7\x02\x98\x02\xea\xff\ +\xd7\x02\x98\x02\xf8\xff\xc3\x02\x98\x02\xfa\xff\xc3\x02\x98\x02\ +\xfc\xff\xc3\x02\x98\x02\xfe\xff\xae\x02\x98\x03\x06\xff\xd7\x02\ +\x98\x03\x08\xff\xd7\x02\x98\x03\x0e\xff\x9a\x02\x98\x03\x10\xff\ +\x9a\x02\x98\x03\x18\xff\x9a\x02\x99\x00\x0f\xfe\xf6\x02\x99\x00\ +\x11\xfe\xf6\x02\x99\x01\xa4\xff\x85\x02\x99\x01\xaa\xff\x9a\x02\ +\x99\x01\xae\xff\x85\x02\x99\x01\xb0\xff\xd7\x02\x99\x01\xb5\xff\ +\x85\x02\x99\x01\xbf\xff\xd7\x02\x99\x01\xce\xff\x9a\x02\x99\x01\ +\xd5\xff\x9a\x02\x99\x01\xf2\xff\x9a\x02\x99\x02\x08\xfe\xf6\x02\ +\x99\x02\x0c\xfe\xf6\x02\x99\x02r\xff\x9a\x02\x99\x02s\xff\ +\x9a\x02\x99\x02v\xff\xec\x02\x99\x02\x9f\xff\xd7\x02\x99\x02\ +\xbb\xff\xd7\x02\x99\x02\xca\xff\xd7\x02\x99\x02\xce\xff\x85\x02\ +\x99\x02\xcf\xff\x9a\x02\x99\x02\xd9\xff\x9a\x02\x99\x02\xdb\xff\ +\x9a\x02\x99\x02\xdd\xff\x9a\x02\x99\x02\xe5\xff\xd7\x02\x99\x03\ +\x05\xff\xd7\x02\x99\x03\x07\xff\xd7\x02\x99\x03\x09\xff\xae\x02\ +\x99\x03\x0b\xff\xae\x02\x99\x03\x11\xff\x85\x02\x99\x03\x12\xff\ +\x9a\x02\x99\x03\x1b\xff\x85\x02\x99\x03\x1c\xff\x9a\x02\x9a\x00\ +\x05\xff\xec\x02\x9a\x00\x0a\xff\xec\x02\x9a\x01\xd0\xff\xd7\x02\ +\x9a\x01\xdc\xff\xec\x02\x9a\x01\xdd\xff\xec\x02\x9a\x01\xdf\xff\ +\xd7\x02\x9a\x01\xe1\xff\xec\x02\x9a\x01\xe4\xff\xec\x02\x9a\x01\ +\xf6\xff\xec\x02\x9a\x02\x07\xff\xec\x02\x9a\x02\x0b\xff\xec\x02\ +\x9a\x02\xa0\xff\xd7\x02\x9a\x02\xaa\xff\xec\x02\x9a\x02\xb6\xff\ +\xec\x02\x9a\x02\xbc\xff\xd7\x02\x9a\x02\xbe\xff\xec\x02\x9a\x02\ +\xc0\xff\xec\x02\x9a\x02\xc2\xff\xec\x02\x9a\x02\xcb\xff\xd7\x02\ +\x9a\x02\xd5\xff\xec\x02\x9a\x02\xe6\xff\xd7\x02\x9a\x02\xf8\xff\ +\xec\x02\x9a\x02\xfa\xff\xec\x02\x9a\x02\xfc\xff\xec\x02\x9a\x02\ +\xfe\xff\xec\x02\x9a\x03\x06\xff\xd7\x02\x9a\x03\x08\xff\xd7\x02\ +\x9a\x03\x0e\xff\xec\x02\x9a\x03\x10\xff\xec\x02\x9a\x03\x18\xff\ +\xec\x02\x9b\x00\x0f\xff\x9a\x02\x9b\x00\x10\xff\xd7\x02\x9b\x00\ +\x11\xff\x9a\x02\x9b\x01\x9d\x00)\x02\x9b\x01\x9f\xff\xd7\x02\ +\x9b\x01\xa4\xff\xae\x02\x9b\x01\xa6\x00)\x02\x9b\x01\xaa\xff\ +\x85\x02\x9b\x01\xae\xff\xae\x02\x9b\x01\xb5\xff\xae\x02\x9b\x01\ +\xb8\xff\xd7\x02\x9b\x01\xbb\xff\xd7\x02\x9b\x01\xbc\x00)\x02\ +\x9b\x01\xbe\xff\xc3\x02\x9b\x01\xc4\x00)\x02\x9b\x01\xcc\xff\ +\xc3\x02\x9b\x01\xcd\xff\xc3\x02\x9b\x01\xce\xff\x9a\x02\x9b\x01\ +\xcf\xff\xae\x02\x9b\x01\xd0\xff\xd7\x02\x9b\x01\xd1\xff\xd7\x02\ +\x9b\x01\xd2\xff\xc3\x02\x9b\x01\xd3\xff\xc3\x02\x9b\x01\xd4\xff\ +\xc3\x02\x9b\x01\xd5\xff\x9a\x02\x9b\x01\xd6\xff\xc3\x02\x9b\x01\ +\xd7\xff\xc3\x02\x9b\x01\xd8\xff\xae\x02\x9b\x01\xd9\xff\xc3\x02\ +\x9b\x01\xda\xff\xc3\x02\x9b\x01\xdb\xff\xae\x02\x9b\x01\xde\xff\ +\xae\x02\x9b\x01\xdf\xff\xd7\x02\x9b\x01\xe0\xff\xc3\x02\x9b\x01\ +\xe1\xff\x9a\x02\x9b\x01\xe2\xff\xc3\x02\x9b\x01\xe3\xff\xc3\x02\ +\x9b\x01\xe5\xff\xc3\x02\x9b\x01\xe6\xff\xc3\x02\x9b\x01\xe7\xff\ +\xd7\x02\x9b\x01\xe8\xff\xc3\x02\x9b\x01\xea\xff\xae\x02\x9b\x01\ +\xeb\x00)\x02\x9b\x01\xec\xff\xc3\x02\x9b\x01\xed\xff\xae\x02\ +\x9b\x01\xee\xff\xc3\x02\x9b\x01\xf2\xff\x9a\x02\x9b\x01\xf3\xff\ +\xc3\x02\x9b\x01\xf4\x00)\x02\x9b\x01\xf5\xff\xc3\x02\x9b\x01\ +\xf7\xff\xc3\x02\x9b\x01\xf9\xff\xc3\x02\x9b\x02\x02\xff\xd7\x02\ +\x9b\x02\x03\xff\xd7\x02\x9b\x02\x04\xff\xd7\x02\x9b\x02\x08\xff\ +\x9a\x02\x9b\x02\x0c\xff\x9a\x02\x9b\x02j\xff\xae\x02\x9b\x02\ +k\xff\xc3\x02\x9b\x02l\xff\xd7\x02\x9b\x02q\xff\xc3\x02\ +\x9b\x02r\xff\x85\x02\x9b\x02s\xff\x9a\x02\x9b\x02u\xff\ +\xc3\x02\x9b\x02w\xff\xd7\x02\x9b\x02y\xff\xc3\x02\x9b\x02\ +}\xff\xc3\x02\x9b\x02~\xff\xd7\x02\x9b\x02\x7f\xff\xae\x02\ +\x9b\x02\x84\xff\xd7\x02\x9b\x02\x85\xff\xae\x02\x9b\x02\x86\xff\ +\xd7\x02\x9b\x02\x87\xff\xae\x02\x9b\x02\x88\xff\xd7\x02\x9b\x02\ +\x89\xff\xae\x02\x9b\x02\x8a\xff\xd7\x02\x9b\x02\x8c\xff\xd7\x02\ +\x9b\x02\x8d\xff\xae\x02\x9b\x02\x96\xff\xc3\x02\x9b\x02\x98\x00\ +)\x02\x9b\x02\x9a\xff\xc3\x02\x9b\x02\x9e\xff\xc3\x02\x9b\x02\ +\xa0\xff\xd7\x02\x9b\x02\xa2\xff\xd7\x02\x9b\x02\xa4\xff\xc3\x02\ +\x9b\x02\xa6\xff\xc3\x02\x9b\x02\xa8\x00)\x02\x9b\x02\xa9\x00\ +)\x02\x9b\x02\xac\xff\xc3\x02\x9b\x02\xae\xff\xc3\x02\x9b\x02\ +\xb0\xff\xc3\x02\x9b\x02\xb1\xff\xd7\x02\x9b\x02\xb2\xff\xae\x02\ +\x9b\x02\xb3\xff\xd7\x02\x9b\x02\xb4\xff\xae\x02\x9b\x02\xb5\x00\ +)\x02\x9b\x02\xbc\xff\xd7\x02\x9b\x02\xbd\x00)\x02\x9b\x02\ +\xc0\xff\x9a\x02\x9b\x02\xc2\xff\x9a\x02\x9b\x02\xc4\xff\xc3\x02\ +\x9b\x02\xc5\xff\xd7\x02\x9b\x02\xc6\xff\xc3\x02\x9b\x02\xc7\xff\ +\xd7\x02\x9b\x02\xc8\xff\xc3\x02\x9b\x02\xcb\xff\xd7\x02\x9b\x02\ +\xcd\xff\xc3\x02\x9b\x02\xce\xff\xae\x02\x9b\x02\xcf\xff\x9a\x02\ +\x9b\x02\xd1\xff\xc3\x02\x9b\x02\xd3\xff\xc3\x02\x9b\x02\xd5\xff\ +\x9a\x02\x9b\x02\xd7\xff\xc3\x02\x9b\x02\xd9\xff\x85\x02\x9b\x02\ +\xdb\xff\x85\x02\x9b\x02\xdd\xff\x85\x02\x9b\x02\xe0\xff\xae\x02\ +\x9b\x02\xe6\xff\xd7\x02\x9b\x02\xe8\xff\xd7\x02\x9b\x02\xec\xff\ +\xc3\x02\x9b\x02\xee\xff\xc3\x02\x9b\x02\xef\xff\xd7\x02\x9b\x02\ +\xf0\xff\xae\x02\x9b\x02\xf1\xff\xd7\x02\x9b\x02\xf2\xff\xae\x02\ +\x9b\x02\xf3\xff\xd7\x02\x9b\x02\xf4\xff\xae\x02\x9b\x02\xf6\xff\ +\xd7\x02\x9b\x02\xfe\xff\x9a\x02\x9b\x03\x00\xff\xc3\x02\x9b\x03\ +\x02\xff\xc3\x02\x9b\x03\x06\xff\xd7\x02\x9b\x03\x08\xff\xd7\x02\ +\x9b\x03\x09\xff\x9a\x02\x9b\x03\x0a\xff\xae\x02\x9b\x03\x0b\xff\ +\x9a\x02\x9b\x03\x0c\xff\xae\x02\x9b\x03\x0e\xff\xd7\x02\x9b\x03\ +\x10\xff\xd7\x02\x9b\x03\x11\xff\xae\x02\x9b\x03\x12\xff\x9a\x02\ +\x9b\x03\x14\xff\xc3\x02\x9b\x03\x15\xff\xd7\x02\x9b\x03\x16\xff\ +\xae\x02\x9b\x03\x17\x00)\x02\x9b\x03\x1a\xff\xae\x02\x9b\x03\ +\x1b\xff\xae\x02\x9b\x03\x1c\xff\x9a\x02\x9c\x00\x0f\xff\xc3\x02\ +\x9c\x00\x11\xff\xc3\x02\x9c\x01\xce\xff\xc3\x02\x9c\x01\xcf\xff\ +\xd7\x02\x9c\x01\xd5\xff\xc3\x02\x9c\x01\xd8\xff\xd7\x02\x9c\x01\ +\xdb\xff\xd7\x02\x9c\x01\xde\xff\xd7\x02\x9c\x01\xea\xff\xd7\x02\ +\x9c\x01\xed\xff\xd7\x02\x9c\x01\xf2\xff\xc3\x02\x9c\x02\x08\xff\ +\xc3\x02\x9c\x02\x0c\xff\xc3\x02\x9c\x02j\xff\xd7\x02\x9c\x02\ +s\xff\xc3\x02\x9c\x02\x7f\xff\xd7\x02\x9c\x02\x85\xff\xd7\x02\ +\x9c\x02\x87\xff\xd7\x02\x9c\x02\x89\xff\xd7\x02\x9c\x02\x8d\xff\ +\xd7\x02\x9c\x02\xb2\xff\xd7\x02\x9c\x02\xb4\xff\xd7\x02\x9c\x02\ +\xcf\xff\xc3\x02\x9c\x02\xe0\xff\xd7\x02\x9c\x02\xf0\xff\xd7\x02\ +\x9c\x02\xf2\xff\xd7\x02\x9c\x02\xf4\xff\xd7\x02\x9c\x03\x0a\xff\ +\xd7\x02\x9c\x03\x0c\xff\xd7\x02\x9c\x03\x12\xff\xc3\x02\x9c\x03\ +\x16\xff\xd7\x02\x9c\x03\x1a\xff\xd7\x02\x9c\x03\x1c\xff\xc3\x02\ +\x9d\x00\x05\xff\xc3\x02\x9d\x00\x0a\xff\xc3\x02\x9d\x01\x9d\xff\ +\xc3\x02\x9d\x01\xa3\x00f\x02\x9d\x01\xa6\xff\xc3\x02\x9d\x01\ +\xbc\xff\xc3\x02\x9d\x01\xc1\xff\xae\x02\x9d\x01\xc4\xff\xc3\x02\ +\x9d\x01\xdc\xff\xd7\x02\x9d\x01\xe1\xff\xd7\x02\x9d\x01\xe4\xff\ +\xd7\x02\x9d\x02\x07\xff\xc3\x02\x9d\x02\x0b\xff\xc3\x02\x9d\x02\ +|\xff\xae\x02\x9d\x02\x80\xff\xc3\x02\x9d\x02\x82\xff\xc3\x02\ +\x9d\x02\xa9\xff\xc3\x02\x9d\x02\xaa\xff\xd7\x02\x9d\x02\xb5\xff\ +\xc3\x02\x9d\x02\xb6\xff\xd7\x02\x9d\x02\xb7\xff\xd7\x02\x9d\x02\ +\xb9\xff\xd7\x02\x9d\x02\xbd\xff\xc3\x02\x9d\x02\xbe\xff\xd7\x02\ +\x9d\x02\xbf\xff\xae\x02\x9d\x02\xc0\xff\xd7\x02\x9d\x02\xc1\xff\ +\xae\x02\x9d\x02\xc2\xff\xd7\x02\x9d\x02\xd4\xff\xae\x02\x9d\x02\ +\xd5\xff\xd7\x02\x9d\x02\xfd\xff\xae\x02\x9d\x02\xfe\xff\xd7\x02\ +\x9d\x03\x0d\xff\xd7\x02\x9d\x03\x0e\xff\xc3\x02\x9d\x03\x0f\xff\ +\xd7\x02\x9d\x03\x10\xff\xc3\x02\x9d\x03\x17\xff\xc3\x02\x9d\x03\ +\x18\xff\xd7\x02\x9e\x00\x05\xff\xc3\x02\x9e\x00\x0a\xff\xc3\x02\ +\x9e\x02\x07\xff\xc3\x02\x9e\x02\x0b\xff\xc3\x02\x9e\x03\x0e\xff\ +\xd7\x02\x9e\x03\x10\xff\xd7\x02\x9f\x01\x9f\xff\xd7\x02\x9f\x01\ +\xa3\x00\xe1\x02\x9f\x01\xb8\xff\xd7\x02\x9f\x01\xbb\xff\xd7\x02\ +\x9f\x01\xbe\xff\xc3\x02\x9f\x01\xdc\xff\xd7\x02\x9f\x01\xe1\xff\ +\xae\x02\x9f\x01\xe4\xff\xd7\x02\x9f\x02l\xff\xd7\x02\x9f\x02\ +{\x00=\x02\x9f\x02}\xff\xec\x02\x9f\x02~\xff\xd7\x02\ +\x9f\x02\x84\xff\xd7\x02\x9f\x02\x86\xff\xd7\x02\x9f\x02\x88\xff\ +\xd7\x02\x9f\x02\x8a\xff\xd7\x02\x9f\x02\x8c\xff\xd7\x02\x9f\x02\ +\xaa\xff\xd7\x02\x9f\x02\xb1\xff\xd7\x02\x9f\x02\xb3\xff\xd7\x02\ +\x9f\x02\xb6\xff\xd7\x02\x9f\x02\xbe\xff\xd7\x02\x9f\x02\xc0\xff\ +\xae\x02\x9f\x02\xc2\xff\xae\x02\x9f\x02\xc5\xff\xc3\x02\x9f\x02\ +\xc6\xff\xd7\x02\x9f\x02\xc7\xff\xc3\x02\x9f\x02\xc8\xff\xd7\x02\ +\x9f\x02\xd5\xff\xae\x02\x9f\x02\xef\xff\xd7\x02\x9f\x02\xf1\xff\ +\xd7\x02\x9f\x02\xf3\xff\xd7\x02\x9f\x02\xfe\xff\xae\x02\x9f\x03\ +\x0e\xff\xd7\x02\x9f\x03\x10\xff\xd7\x02\x9f\x03\x15\xff\xd7\x02\ +\x9f\x03\x18\xff\xd7\x02\xa0\x01\xcf\xff\xec\x02\xa0\x01\xd8\xff\ +\xec\x02\xa0\x01\xdb\xff\xec\x02\xa0\x01\xde\xff\xec\x02\xa0\x01\ +\xe1\xff\xec\x02\xa0\x01\xea\xff\xec\x02\xa0\x01\xed\xff\xec\x02\ +\xa0\x02j\xff\xec\x02\xa0\x02\x7f\xff\xec\x02\xa0\x02\x85\xff\ +\xec\x02\xa0\x02\x87\xff\xec\x02\xa0\x02\x89\xff\xec\x02\xa0\x02\ +\x8d\xff\xec\x02\xa0\x02\xb2\xff\xec\x02\xa0\x02\xb4\xff\xec\x02\ +\xa0\x02\xc0\xff\xec\x02\xa0\x02\xc2\xff\xec\x02\xa0\x02\xd5\xff\ +\xec\x02\xa0\x02\xe0\xff\xec\x02\xa0\x02\xf0\xff\xec\x02\xa0\x02\ +\xf2\xff\xec\x02\xa0\x02\xf4\xff\xec\x02\xa0\x02\xfe\xff\xec\x02\ +\xa0\x03\x0a\xff\xec\x02\xa0\x03\x0c\xff\xec\x02\xa0\x03\x0e\xff\ +\xd7\x02\xa0\x03\x10\xff\xd7\x02\xa0\x03\x16\xff\xec\x02\xa0\x03\ +\x1a\xff\xec\x02\xa1\x00\x0f\xff\xae\x02\xa1\x00\x11\xff\xae\x02\ +\xa1\x02\x08\xff\xae\x02\xa1\x02\x0c\xff\xae\x02\xa1\x02\x80\xff\ +\xec\x02\xa1\x02\x82\xff\xec\x02\xa1\x02\xb7\xff\xec\x02\xa1\x02\ +\xb9\xff\xec\x02\xa1\x03\x0d\xff\xd7\x02\xa1\x03\x0f\xff\xd7\x02\ +\xa2\x01\xe9\x00)\x02\xa3\x01\x9f\xff\xd7\x02\xa3\x01\xa3\x00\ +\xe1\x02\xa3\x01\xb8\xff\xd7\x02\xa3\x01\xbb\xff\xd7\x02\xa3\x01\ +\xbe\xff\xc3\x02\xa3\x01\xdc\xff\xd7\x02\xa3\x01\xe1\xff\xae\x02\ +\xa3\x01\xe4\xff\xd7\x02\xa3\x02l\xff\xd7\x02\xa3\x02{\x00\ +=\x02\xa3\x02}\xff\xec\x02\xa3\x02~\xff\xd7\x02\xa3\x02\ +\x84\xff\xd7\x02\xa3\x02\x86\xff\xd7\x02\xa3\x02\x88\xff\xd7\x02\ +\xa3\x02\x8a\xff\xd7\x02\xa3\x02\x8c\xff\xd7\x02\xa3\x02\xaa\xff\ +\xd7\x02\xa3\x02\xb1\xff\xd7\x02\xa3\x02\xb3\xff\xd7\x02\xa3\x02\ +\xb6\xff\xd7\x02\xa3\x02\xbe\xff\xd7\x02\xa3\x02\xc0\xff\xae\x02\ +\xa3\x02\xc2\xff\xae\x02\xa3\x02\xc5\xff\xc3\x02\xa3\x02\xc6\xff\ +\xd7\x02\xa3\x02\xc7\xff\xc3\x02\xa3\x02\xc8\xff\xd7\x02\xa3\x02\ +\xd5\xff\xae\x02\xa3\x02\xef\xff\xd7\x02\xa3\x02\xf1\xff\xd7\x02\ +\xa3\x02\xf3\xff\xd7\x02\xa3\x02\xfe\xff\xae\x02\xa3\x03\x0e\xff\ +\xd7\x02\xa3\x03\x10\xff\xd7\x02\xa3\x03\x15\xff\xd7\x02\xa3\x03\ +\x18\xff\xd7\x02\xa4\x01\xcf\xff\xec\x02\xa4\x01\xd8\xff\xec\x02\ +\xa4\x01\xdb\xff\xec\x02\xa4\x01\xde\xff\xec\x02\xa4\x01\xe1\xff\ +\xec\x02\xa4\x01\xea\xff\xec\x02\xa4\x01\xed\xff\xec\x02\xa4\x02\ +j\xff\xec\x02\xa4\x02\x7f\xff\xec\x02\xa4\x02\x85\xff\xec\x02\ +\xa4\x02\x87\xff\xec\x02\xa4\x02\x89\xff\xec\x02\xa4\x02\x8d\xff\ +\xec\x02\xa4\x02\xb2\xff\xec\x02\xa4\x02\xb4\xff\xec\x02\xa4\x02\ +\xc0\xff\xec\x02\xa4\x02\xc2\xff\xec\x02\xa4\x02\xd5\xff\xec\x02\ +\xa4\x02\xe0\xff\xec\x02\xa4\x02\xf0\xff\xec\x02\xa4\x02\xf2\xff\ +\xec\x02\xa4\x02\xf4\xff\xec\x02\xa4\x02\xfe\xff\xec\x02\xa4\x03\ +\x0a\xff\xec\x02\xa4\x03\x0c\xff\xec\x02\xa4\x03\x0e\xff\xd7\x02\ +\xa4\x03\x10\xff\xd7\x02\xa4\x03\x16\xff\xec\x02\xa4\x03\x1a\xff\ +\xec\x02\xa5\x01\x9f\xff\xd7\x02\xa5\x01\xb8\xff\xd7\x02\xa5\x01\ +\xbb\xff\xd7\x02\xa5\x01\xbe\xff\xd7\x02\xa5\x01\xc1\xff\xd7\x02\ +\xa5\x01\xe1\xff\xd7\x02\xa5\x02l\xff\xd7\x02\xa5\x02|\xff\ +\xd7\x02\xa5\x02~\xff\xd7\x02\xa5\x02\x84\xff\xd7\x02\xa5\x02\ +\x86\xff\xd7\x02\xa5\x02\x88\xff\xd7\x02\xa5\x02\x8a\xff\xd7\x02\ +\xa5\x02\x8c\xff\xd7\x02\xa5\x02\xb1\xff\xd7\x02\xa5\x02\xb3\xff\ +\xd7\x02\xa5\x02\xbf\xff\xd7\x02\xa5\x02\xc0\xff\xd7\x02\xa5\x02\ +\xc1\xff\xd7\x02\xa5\x02\xc2\xff\xd7\x02\xa5\x02\xc5\xff\x9a\x02\ +\xa5\x02\xc7\xff\x9a\x02\xa5\x02\xd4\xff\xd7\x02\xa5\x02\xd5\xff\ +\xd7\x02\xa5\x02\xef\xff\xd7\x02\xa5\x02\xf1\xff\xd7\x02\xa5\x02\ +\xf3\xff\xd7\x02\xa5\x02\xfd\xff\xd7\x02\xa5\x02\xfe\xff\xd7\x02\ +\xa5\x03\x09\xff\xd7\x02\xa5\x03\x0b\xff\xd7\x02\xa5\x03\x0e\xff\ +\xd7\x02\xa5\x03\x10\xff\xd7\x02\xa5\x03\x15\xff\xd7\x02\xa5\x03\ +\x19\xff\xec\x02\xa6\x01\xcf\xff\xd7\x02\xa6\x01\xd8\xff\xd7\x02\ +\xa6\x01\xdb\xff\xd7\x02\xa6\x01\xde\xff\xd7\x02\xa6\x01\xe1\xff\ +\xd7\x02\xa6\x01\xea\xff\xd7\x02\xa6\x01\xed\xff\xd7\x02\xa6\x02\ +j\xff\xd7\x02\xa6\x02\x7f\xff\xd7\x02\xa6\x02\x85\xff\xd7\x02\ +\xa6\x02\x87\xff\xd7\x02\xa6\x02\x89\xff\xd7\x02\xa6\x02\x8d\xff\ +\xd7\x02\xa6\x02\xb2\xff\xd7\x02\xa6\x02\xb4\xff\xd7\x02\xa6\x02\ +\xc0\xff\xd7\x02\xa6\x02\xc2\xff\xd7\x02\xa6\x02\xc6\xff\xd7\x02\ +\xa6\x02\xc8\xff\xd7\x02\xa6\x02\xd5\xff\xd7\x02\xa6\x02\xe0\xff\ +\xd7\x02\xa6\x02\xf0\xff\xd7\x02\xa6\x02\xf2\xff\xd7\x02\xa6\x02\ +\xf4\xff\xd7\x02\xa6\x02\xfe\xff\xd7\x02\xa6\x03\x0a\xff\xd7\x02\ +\xa6\x03\x0c\xff\xd7\x02\xa6\x03\x16\xff\xd7\x02\xa6\x03\x1a\xff\ +\xd7\x02\xa7\x01\x9f\xff\xd7\x02\xa7\x01\xb8\xff\xd7\x02\xa7\x01\ +\xbb\xff\xd7\x02\xa7\x01\xbe\xff\xd7\x02\xa7\x01\xc1\xff\xd7\x02\ +\xa7\x01\xe1\xff\xd7\x02\xa7\x02l\xff\xd7\x02\xa7\x02|\xff\ +\xd7\x02\xa7\x02~\xff\xd7\x02\xa7\x02\x84\xff\xd7\x02\xa7\x02\ +\x86\xff\xd7\x02\xa7\x02\x88\xff\xd7\x02\xa7\x02\x8a\xff\xd7\x02\ +\xa7\x02\x8c\xff\xd7\x02\xa7\x02\xb1\xff\xd7\x02\xa7\x02\xb3\xff\ +\xd7\x02\xa7\x02\xbf\xff\xd7\x02\xa7\x02\xc0\xff\xd7\x02\xa7\x02\ +\xc1\xff\xd7\x02\xa7\x02\xc2\xff\xd7\x02\xa7\x02\xc5\xff\x9a\x02\ +\xa7\x02\xc7\xff\x9a\x02\xa7\x02\xd4\xff\xd7\x02\xa7\x02\xd5\xff\ +\xd7\x02\xa7\x02\xef\xff\xd7\x02\xa7\x02\xf1\xff\xd7\x02\xa7\x02\ +\xf3\xff\xd7\x02\xa7\x02\xfd\xff\xd7\x02\xa7\x02\xfe\xff\xd7\x02\ +\xa7\x03\x09\xff\xd7\x02\xa7\x03\x0b\xff\xd7\x02\xa7\x03\x0e\xff\ +\xd7\x02\xa7\x03\x10\xff\xd7\x02\xa7\x03\x15\xff\xd7\x02\xa7\x03\ +\x19\xff\xec\x02\xa8\x01\xcf\xff\xd7\x02\xa8\x01\xd8\xff\xd7\x02\ +\xa8\x01\xdb\xff\xd7\x02\xa8\x01\xde\xff\xd7\x02\xa8\x01\xe1\xff\ +\xd7\x02\xa8\x01\xea\xff\xd7\x02\xa8\x01\xed\xff\xd7\x02\xa8\x02\ +j\xff\xd7\x02\xa8\x02\x7f\xff\xd7\x02\xa8\x02\x85\xff\xd7\x02\ +\xa8\x02\x87\xff\xd7\x02\xa8\x02\x89\xff\xd7\x02\xa8\x02\x8d\xff\ +\xd7\x02\xa8\x02\xb2\xff\xd7\x02\xa8\x02\xb4\xff\xd7\x02\xa8\x02\ +\xc0\xff\xd7\x02\xa8\x02\xc2\xff\xd7\x02\xa8\x02\xc6\xff\xd7\x02\ +\xa8\x02\xc8\xff\xd7\x02\xa8\x02\xd5\xff\xd7\x02\xa8\x02\xe0\xff\ +\xd7\x02\xa8\x02\xf0\xff\xd7\x02\xa8\x02\xf2\xff\xd7\x02\xa8\x02\ +\xf4\xff\xd7\x02\xa8\x02\xfe\xff\xd7\x02\xa8\x03\x0a\xff\xd7\x02\ +\xa8\x03\x0c\xff\xd7\x02\xa8\x03\x16\xff\xd7\x02\xa8\x03\x1a\xff\ +\xd7\x02\xa9\x01\x9f\xff\xd7\x02\xa9\x01\xb8\xff\xd7\x02\xa9\x01\ +\xbb\xff\xd7\x02\xa9\x01\xbe\xff\xd7\x02\xa9\x01\xc1\xff\xd7\x02\ +\xa9\x01\xe1\xff\xd7\x02\xa9\x02l\xff\xd7\x02\xa9\x02|\xff\ +\xd7\x02\xa9\x02~\xff\xd7\x02\xa9\x02\x84\xff\xd7\x02\xa9\x02\ +\x86\xff\xd7\x02\xa9\x02\x88\xff\xd7\x02\xa9\x02\x8a\xff\xd7\x02\ +\xa9\x02\x8c\xff\xd7\x02\xa9\x02\xb1\xff\xd7\x02\xa9\x02\xb3\xff\ +\xd7\x02\xa9\x02\xbf\xff\xd7\x02\xa9\x02\xc0\xff\xd7\x02\xa9\x02\ +\xc1\xff\xd7\x02\xa9\x02\xc2\xff\xd7\x02\xa9\x02\xc5\xff\x9a\x02\ +\xa9\x02\xc7\xff\x9a\x02\xa9\x02\xd4\xff\xd7\x02\xa9\x02\xd5\xff\ +\xd7\x02\xa9\x02\xef\xff\xd7\x02\xa9\x02\xf1\xff\xd7\x02\xa9\x02\ +\xf3\xff\xd7\x02\xa9\x02\xfd\xff\xd7\x02\xa9\x02\xfe\xff\xd7\x02\ +\xa9\x03\x09\xff\xd7\x02\xa9\x03\x0b\xff\xd7\x02\xa9\x03\x0e\xff\ +\xd7\x02\xa9\x03\x10\xff\xd7\x02\xa9\x03\x15\xff\xd7\x02\xa9\x03\ +\x19\xff\xec\x02\xaa\x01\xcf\xff\xd7\x02\xaa\x01\xd8\xff\xd7\x02\ +\xaa\x01\xdb\xff\xd7\x02\xaa\x01\xde\xff\xd7\x02\xaa\x01\xe1\xff\ +\xd7\x02\xaa\x01\xea\xff\xd7\x02\xaa\x01\xed\xff\xd7\x02\xaa\x02\ +j\xff\xd7\x02\xaa\x02\x7f\xff\xd7\x02\xaa\x02\x85\xff\xd7\x02\ +\xaa\x02\x87\xff\xd7\x02\xaa\x02\x89\xff\xd7\x02\xaa\x02\x8d\xff\ +\xd7\x02\xaa\x02\xb2\xff\xd7\x02\xaa\x02\xb4\xff\xd7\x02\xaa\x02\ +\xc0\xff\xd7\x02\xaa\x02\xc2\xff\xd7\x02\xaa\x02\xc6\xff\xd7\x02\ +\xaa\x02\xc8\xff\xd7\x02\xaa\x02\xd5\xff\xd7\x02\xaa\x02\xe0\xff\ +\xd7\x02\xaa\x02\xf0\xff\xd7\x02\xaa\x02\xf2\xff\xd7\x02\xaa\x02\ +\xf4\xff\xd7\x02\xaa\x02\xfe\xff\xd7\x02\xaa\x03\x0a\xff\xd7\x02\ +\xaa\x03\x0c\xff\xd7\x02\xaa\x03\x16\xff\xd7\x02\xaa\x03\x1a\xff\ +\xd7\x02\xab\x01\xa3\x00\xe1\x02\xab\x02\xea\x00)\x02\xab\x03\ +\x0e\xff\xd7\x02\xab\x03\x10\xff\xd7\x02\xac\x00\x05\xff\xec\x02\ +\xac\x00\x0a\xff\xec\x02\xac\x02\x07\xff\xec\x02\xac\x02\x0b\xff\ +\xec\x02\xad\x00\x0f\xff\x9a\x02\xad\x00\x10\xff\xd7\x02\xad\x00\ +\x11\xff\x9a\x02\xad\x01\x9d\x00)\x02\xad\x01\x9f\xff\xd7\x02\ +\xad\x01\xa4\xff\xae\x02\xad\x01\xa6\x00)\x02\xad\x01\xaa\xff\ +\x85\x02\xad\x01\xae\xff\xae\x02\xad\x01\xb5\xff\xae\x02\xad\x01\ +\xb8\xff\xd7\x02\xad\x01\xbb\xff\xd7\x02\xad\x01\xbc\x00)\x02\ +\xad\x01\xbe\xff\xc3\x02\xad\x01\xc4\x00)\x02\xad\x01\xcc\xff\ +\xc3\x02\xad\x01\xcd\xff\xc3\x02\xad\x01\xce\xff\x9a\x02\xad\x01\ +\xcf\xff\xae\x02\xad\x01\xd0\xff\xd7\x02\xad\x01\xd1\xff\xd7\x02\ +\xad\x01\xd2\xff\xc3\x02\xad\x01\xd3\xff\xc3\x02\xad\x01\xd4\xff\ +\xc3\x02\xad\x01\xd5\xff\x9a\x02\xad\x01\xd6\xff\xc3\x02\xad\x01\ +\xd7\xff\xc3\x02\xad\x01\xd8\xff\xae\x02\xad\x01\xd9\xff\xc3\x02\ +\xad\x01\xda\xff\xc3\x02\xad\x01\xdb\xff\xae\x02\xad\x01\xde\xff\ +\xae\x02\xad\x01\xdf\xff\xd7\x02\xad\x01\xe0\xff\xc3\x02\xad\x01\ +\xe1\xff\x9a\x02\xad\x01\xe2\xff\xc3\x02\xad\x01\xe3\xff\xc3\x02\ +\xad\x01\xe5\xff\xc3\x02\xad\x01\xe6\xff\xc3\x02\xad\x01\xe7\xff\ +\xd7\x02\xad\x01\xe8\xff\xc3\x02\xad\x01\xea\xff\xae\x02\xad\x01\ +\xeb\x00)\x02\xad\x01\xec\xff\xc3\x02\xad\x01\xed\xff\xae\x02\ +\xad\x01\xee\xff\xc3\x02\xad\x01\xf2\xff\x9a\x02\xad\x01\xf3\xff\ +\xc3\x02\xad\x01\xf4\x00)\x02\xad\x01\xf5\xff\xc3\x02\xad\x01\ +\xf7\xff\xc3\x02\xad\x01\xf9\xff\xc3\x02\xad\x02\x02\xff\xd7\x02\ +\xad\x02\x03\xff\xd7\x02\xad\x02\x04\xff\xd7\x02\xad\x02\x08\xff\ +\x9a\x02\xad\x02\x0c\xff\x9a\x02\xad\x02j\xff\xae\x02\xad\x02\ +k\xff\xc3\x02\xad\x02l\xff\xd7\x02\xad\x02q\xff\xc3\x02\ +\xad\x02r\xff\x85\x02\xad\x02s\xff\x9a\x02\xad\x02u\xff\ +\xc3\x02\xad\x02w\xff\xd7\x02\xad\x02y\xff\xc3\x02\xad\x02\ +}\xff\xc3\x02\xad\x02~\xff\xd7\x02\xad\x02\x7f\xff\xae\x02\ +\xad\x02\x84\xff\xd7\x02\xad\x02\x85\xff\xae\x02\xad\x02\x86\xff\ +\xd7\x02\xad\x02\x87\xff\xae\x02\xad\x02\x88\xff\xd7\x02\xad\x02\ +\x89\xff\xae\x02\xad\x02\x8a\xff\xd7\x02\xad\x02\x8c\xff\xd7\x02\ +\xad\x02\x8d\xff\xae\x02\xad\x02\x96\xff\xc3\x02\xad\x02\x98\x00\ +)\x02\xad\x02\x9a\xff\xc3\x02\xad\x02\x9e\xff\xc3\x02\xad\x02\ +\xa0\xff\xd7\x02\xad\x02\xa2\xff\xd7\x02\xad\x02\xa4\xff\xc3\x02\ +\xad\x02\xa6\xff\xc3\x02\xad\x02\xa8\x00)\x02\xad\x02\xa9\x00\ +)\x02\xad\x02\xac\xff\xc3\x02\xad\x02\xae\xff\xc3\x02\xad\x02\ +\xb0\xff\xc3\x02\xad\x02\xb1\xff\xd7\x02\xad\x02\xb2\xff\xae\x02\ +\xad\x02\xb3\xff\xd7\x02\xad\x02\xb4\xff\xae\x02\xad\x02\xb5\x00\ +)\x02\xad\x02\xbc\xff\xd7\x02\xad\x02\xbd\x00)\x02\xad\x02\ +\xc0\xff\x9a\x02\xad\x02\xc2\xff\x9a\x02\xad\x02\xc4\xff\xc3\x02\ +\xad\x02\xc5\xff\xd7\x02\xad\x02\xc6\xff\xc3\x02\xad\x02\xc7\xff\ +\xd7\x02\xad\x02\xc8\xff\xc3\x02\xad\x02\xcb\xff\xd7\x02\xad\x02\ +\xcd\xff\xc3\x02\xad\x02\xce\xff\xae\x02\xad\x02\xcf\xff\x9a\x02\ +\xad\x02\xd1\xff\xc3\x02\xad\x02\xd3\xff\xc3\x02\xad\x02\xd5\xff\ +\x9a\x02\xad\x02\xd7\xff\xc3\x02\xad\x02\xd9\xff\x85\x02\xad\x02\ +\xdb\xff\x85\x02\xad\x02\xdd\xff\x85\x02\xad\x02\xe0\xff\xae\x02\ +\xad\x02\xe6\xff\xd7\x02\xad\x02\xe8\xff\xd7\x02\xad\x02\xec\xff\ +\xc3\x02\xad\x02\xee\xff\xc3\x02\xad\x02\xef\xff\xd7\x02\xad\x02\ +\xf0\xff\xae\x02\xad\x02\xf1\xff\xd7\x02\xad\x02\xf2\xff\xae\x02\ +\xad\x02\xf3\xff\xd7\x02\xad\x02\xf4\xff\xae\x02\xad\x02\xf6\xff\ +\xd7\x02\xad\x02\xfe\xff\x9a\x02\xad\x03\x00\xff\xc3\x02\xad\x03\ +\x02\xff\xc3\x02\xad\x03\x06\xff\xd7\x02\xad\x03\x08\xff\xd7\x02\ +\xad\x03\x09\xff\x9a\x02\xad\x03\x0a\xff\xae\x02\xad\x03\x0b\xff\ +\x9a\x02\xad\x03\x0c\xff\xae\x02\xad\x03\x0e\xff\xd7\x02\xad\x03\ +\x10\xff\xd7\x02\xad\x03\x11\xff\xae\x02\xad\x03\x12\xff\x9a\x02\ +\xad\x03\x14\xff\xc3\x02\xad\x03\x15\xff\xd7\x02\xad\x03\x16\xff\ +\xae\x02\xad\x03\x17\x00)\x02\xad\x03\x1a\xff\xae\x02\xad\x03\ +\x1b\xff\xae\x02\xad\x03\x1c\xff\x9a\x02\xae\x00\x0f\xff\x9a\x02\ +\xae\x00\x10\xff\xd7\x02\xae\x00\x11\xff\x9a\x02\xae\x01\xce\xff\ +\xc3\x02\xae\x01\xcf\xff\xec\x02\xae\x01\xd5\xff\xc3\x02\xae\x01\ +\xd8\xff\xec\x02\xae\x01\xdb\xff\xec\x02\xae\x01\xde\xff\xec\x02\ +\xae\x01\xea\xff\xec\x02\xae\x01\xed\xff\xec\x02\xae\x01\xf2\xff\ +\xc3\x02\xae\x02\x02\xff\xd7\x02\xae\x02\x03\xff\xd7\x02\xae\x02\ +\x04\xff\xd7\x02\xae\x02\x08\xff\x9a\x02\xae\x02\x0c\xff\x9a\x02\ +\xae\x02j\xff\xec\x02\xae\x02s\xff\xc3\x02\xae\x02\x7f\xff\ +\xec\x02\xae\x02\x85\xff\xec\x02\xae\x02\x87\xff\xec\x02\xae\x02\ +\x89\xff\xec\x02\xae\x02\x8d\xff\xec\x02\xae\x02\xb2\xff\xec\x02\ +\xae\x02\xb4\xff\xec\x02\xae\x02\xcf\xff\xc3\x02\xae\x02\xe0\xff\ +\xec\x02\xae\x02\xf0\xff\xec\x02\xae\x02\xf2\xff\xec\x02\xae\x02\ +\xf4\xff\xec\x02\xae\x03\x0a\xff\xec\x02\xae\x03\x0c\xff\xec\x02\ +\xae\x03\x12\xff\xc3\x02\xae\x03\x16\xff\xec\x02\xae\x03\x1a\xff\ +\xec\x02\xae\x03\x1c\xff\xc3\x02\xaf\x00\x05\xff\x5c\x02\xaf\x00\ +\x0a\xff\x5c\x02\xaf\x01\x9d\xff\x9a\x02\xaf\x01\xa3\x00f\x02\ +\xaf\x01\xa6\xff\x9a\x02\xaf\x01\xbc\xffH\x02\xaf\x01\xc1\xff\ +\x85\x02\xaf\x01\xc4\xff\x9a\x02\xaf\x01\xdc\xff\xae\x02\xaf\x01\ +\xe1\xff\xd7\x02\xaf\x01\xe4\xff\xae\x02\xaf\x02\x07\xff\x5c\x02\ +\xaf\x02\x0b\xff\x5c\x02\xaf\x02|\xff\x85\x02\xaf\x02\x80\xff\ +q\x02\xaf\x02\x82\xffq\x02\xaf\x02\xa9\xff\x9a\x02\xaf\x02\ +\xaa\xff\xae\x02\xaf\x02\xb5\xffH\x02\xaf\x02\xb6\xff\xae\x02\ +\xaf\x02\xb7\xff\x9a\x02\xaf\x02\xb9\xff\x9a\x02\xaf\x02\xbd\xff\ +\x9a\x02\xaf\x02\xbe\xff\xae\x02\xaf\x02\xbf\xff\x85\x02\xaf\x02\ +\xc0\xff\xd7\x02\xaf\x02\xc1\xff\x85\x02\xaf\x02\xc2\xff\xd7\x02\ +\xaf\x02\xc5\xff\xc3\x02\xaf\x02\xc6\xff\xd7\x02\xaf\x02\xc7\xff\ +\xc3\x02\xaf\x02\xc8\xff\xd7\x02\xaf\x02\xd4\xff\x85\x02\xaf\x02\ +\xd5\xff\xd7\x02\xaf\x02\xfd\xff\x85\x02\xaf\x02\xfe\xff\xd7\x02\ +\xaf\x03\x0d\xffH\x02\xaf\x03\x0e\xff\xae\x02\xaf\x03\x0f\xff\ +H\x02\xaf\x03\x10\xff\xae\x02\xaf\x03\x17\xff\x9a\x02\xaf\x03\ +\x18\xff\xae\x02\xb0\x00\x05\xffq\x02\xb0\x00\x0a\xffq\x02\ +\xb0\x01\xdc\xff\x9a\x02\xb0\x01\xe1\xff\xd7\x02\xb0\x01\xe4\xff\ +\x9a\x02\xb0\x02\x07\xffq\x02\xb0\x02\x0b\xffq\x02\xb0\x02\ +m\xff\xd7\x02\xb0\x02\x81\xff\xd7\x02\xb0\x02\x83\xff\xd7\x02\ +\xb0\x02\x8b\xff\xd7\x02\xb0\x02\xaa\xff\x9a\x02\xb0\x02\xb6\xff\ +\x9a\x02\xb0\x02\xb8\xff\xd7\x02\xb0\x02\xba\xff\xd7\x02\xb0\x02\ +\xbe\xff\x9a\x02\xb0\x02\xc0\xff\xd7\x02\xb0\x02\xc2\xff\xd7\x02\ +\xb0\x02\xc6\xff\xd7\x02\xb0\x02\xc8\xff\xd7\x02\xb0\x02\xd5\xff\ +\xd7\x02\xb0\x02\xfe\xff\xd7\x02\xb0\x03\x0e\xffq\x02\xb0\x03\ +\x10\xffq\x02\xb0\x03\x18\xff\x9a\x02\xb1\x01\x9d\xff\xd7\x02\ +\xb1\x01\xa6\xff\xd7\x02\xb1\x01\xbc\xff\xc3\x02\xb1\x01\xc4\xff\ +\xd7\x02\xb1\x02\x80\xff\xec\x02\xb1\x02\x82\xff\xec\x02\xb1\x02\ +\xa9\xff\xd7\x02\xb1\x02\xb5\xff\xc3\x02\xb1\x02\xb7\xff\xec\x02\ +\xb1\x02\xb9\xff\xec\x02\xb1\x02\xbd\xff\xd7\x02\xb1\x03\x0d\xff\ +\xd7\x02\xb1\x03\x0f\xff\xd7\x02\xb1\x03\x17\xff\xd7\x02\xb2\x00\ +\x05\xff\xec\x02\xb2\x00\x0a\xff\xec\x02\xb2\x01\xd0\xff\xd7\x02\ +\xb2\x01\xdc\xff\xec\x02\xb2\x01\xdd\xff\xec\x02\xb2\x01\xdf\xff\ +\xd7\x02\xb2\x01\xe1\xff\xec\x02\xb2\x01\xe4\xff\xec\x02\xb2\x01\ +\xf6\xff\xec\x02\xb2\x02\x07\xff\xec\x02\xb2\x02\x0b\xff\xec\x02\ +\xb2\x02\xa0\xff\xd7\x02\xb2\x02\xaa\xff\xec\x02\xb2\x02\xb6\xff\ +\xec\x02\xb2\x02\xbc\xff\xd7\x02\xb2\x02\xbe\xff\xec\x02\xb2\x02\ +\xc0\xff\xec\x02\xb2\x02\xc2\xff\xec\x02\xb2\x02\xcb\xff\xd7\x02\ +\xb2\x02\xd5\xff\xec\x02\xb2\x02\xe6\xff\xd7\x02\xb2\x02\xf8\xff\ +\xec\x02\xb2\x02\xfa\xff\xec\x02\xb2\x02\xfc\xff\xec\x02\xb2\x02\ +\xfe\xff\xec\x02\xb2\x03\x06\xff\xd7\x02\xb2\x03\x08\xff\xd7\x02\ +\xb2\x03\x0e\xff\xec\x02\xb2\x03\x10\xff\xec\x02\xb2\x03\x18\xff\ +\xec\x02\xb3\x01\x9f\xff\xd7\x02\xb3\x01\xb8\xff\xd7\x02\xb3\x01\ +\xbb\xff\xd7\x02\xb3\x01\xbe\xff\xd7\x02\xb3\x01\xe1\xff\xd7\x02\ +\xb3\x02l\xff\xd7\x02\xb3\x02~\xff\xd7\x02\xb3\x02\x84\xff\ +\xd7\x02\xb3\x02\x86\xff\xd7\x02\xb3\x02\x88\xff\xd7\x02\xb3\x02\ +\x8a\xff\xd7\x02\xb3\x02\x8c\xff\xd7\x02\xb3\x02\xb1\xff\xd7\x02\ +\xb3\x02\xb3\xff\xd7\x02\xb3\x02\xc0\xff\xd7\x02\xb3\x02\xc2\xff\ +\xd7\x02\xb3\x02\xc5\xff\xd7\x02\xb3\x02\xc7\xff\xd7\x02\xb3\x02\ +\xd5\xff\xd7\x02\xb3\x02\xef\xff\xd7\x02\xb3\x02\xf1\xff\xd7\x02\ +\xb3\x02\xf3\xff\xd7\x02\xb3\x02\xfe\xff\xd7\x02\xb3\x03\x09\xff\ +\xd7\x02\xb3\x03\x0b\xff\xd7\x02\xb3\x03\x0e\xff\xd7\x02\xb3\x03\ +\x10\xff\xd7\x02\xb3\x03\x15\xff\xd7\x02\xb5\x00\x0f\xff\x85\x02\ +\xb5\x00\x10\xff\xae\x02\xb5\x00\x11\xff\x85\x02\xb5\x01\x9f\xff\ +\xd7\x02\xb5\x01\xa4\xff\x9a\x02\xb5\x01\xaa\xffq\x02\xb5\x01\ +\xae\xff\x9a\x02\xb5\x01\xb5\xff\x9a\x02\xb5\x01\xb8\xff\xd7\x02\ +\xb5\x01\xbb\xff\xd7\x02\xb5\x01\xbc\x00)\x02\xb5\x01\xbe\xff\ +\xae\x02\xb5\x01\xcc\xff\x9a\x02\xb5\x01\xcd\xff\x9a\x02\xb5\x01\ +\xce\xff\x85\x02\xb5\x01\xcf\xffq\x02\xb5\x01\xd0\xff\xd7\x02\ +\xb5\x01\xd1\xff\xd7\x02\xb5\x01\xd2\xff\x9a\x02\xb5\x01\xd3\xff\ +\x9a\x02\xb5\x01\xd4\xff\x9a\x02\xb5\x01\xd5\xff\x85\x02\xb5\x01\ +\xd6\xff\x9a\x02\xb5\x01\xd7\xff\x9a\x02\xb5\x01\xd8\xffq\x02\ +\xb5\x01\xd9\xff\x9a\x02\xb5\x01\xda\xff\x9a\x02\xb5\x01\xdb\xff\ +q\x02\xb5\x01\xdc\xff\xae\x02\xb5\x01\xdd\xff\xae\x02\xb5\x01\ +\xde\xffq\x02\xb5\x01\xdf\xff\xd7\x02\xb5\x01\xe0\xff\x9a\x02\ +\xb5\x01\xe1\xff\x9a\x02\xb5\x01\xe2\xff\x9a\x02\xb5\x01\xe3\xff\ +\x9a\x02\xb5\x01\xe4\xff\xae\x02\xb5\x01\xe5\xff\x9a\x02\xb5\x01\ +\xe6\xff\x9a\x02\xb5\x01\xe7\xff\xd7\x02\xb5\x01\xe8\xff\x9a\x02\ +\xb5\x01\xe9\xff\xc3\x02\xb5\x01\xea\xffq\x02\xb5\x01\xec\xff\ +\x9a\x02\xb5\x01\xed\xffq\x02\xb5\x01\xee\xff\x85\x02\xb5\x01\ +\xf2\xff\x85\x02\xb5\x01\xf3\xff\x9a\x02\xb5\x01\xf5\xff\x9a\x02\ +\xb5\x01\xf6\xff\xae\x02\xb5\x01\xf7\xff\x9a\x02\xb5\x01\xf9\xff\ +\x9a\x02\xb5\x02\x02\xff\xae\x02\xb5\x02\x03\xff\xae\x02\xb5\x02\ +\x04\xff\xae\x02\xb5\x02\x08\xff\x85\x02\xb5\x02\x0c\xff\x85\x02\ +\xb5\x02j\xffq\x02\xb5\x02k\xff\x9a\x02\xb5\x02l\xff\ +\xd7\x02\xb5\x02m\xff\xd7\x02\xb5\x02q\xff\x9a\x02\xb5\x02\ +r\xffq\x02\xb5\x02s\xff\x85\x02\xb5\x02u\xff\x9a\x02\ +\xb5\x02w\xff\x9a\x02\xb5\x02y\xff\x9a\x02\xb5\x02}\xff\ +\x9a\x02\xb5\x02~\xff\xd7\x02\xb5\x02\x7f\xffq\x02\xb5\x02\ +\x81\xff\xd7\x02\xb5\x02\x83\xff\xd7\x02\xb5\x02\x84\xff\xd7\x02\ +\xb5\x02\x85\xffq\x02\xb5\x02\x86\xff\xd7\x02\xb5\x02\x87\xff\ +q\x02\xb5\x02\x88\xff\xd7\x02\xb5\x02\x89\xffq\x02\xb5\x02\ +\x8a\xff\xd7\x02\xb5\x02\x8b\xff\xd7\x02\xb5\x02\x8c\xff\xd7\x02\ +\xb5\x02\x8d\xffq\x02\xb5\x02\x96\xff\x9a\x02\xb5\x02\x9a\xff\ +\x9a\x02\xb5\x02\x9e\xff\x9a\x02\xb5\x02\xa0\xff\xd7\x02\xb5\x02\ +\xa2\xff\xd7\x02\xb5\x02\xa4\xff\x9a\x02\xb5\x02\xa6\xff\x9a\x02\ +\xb5\x02\xaa\xff\xae\x02\xb5\x02\xac\xff\x9a\x02\xb5\x02\xae\xff\ +\x9a\x02\xb5\x02\xb0\xff\x9a\x02\xb5\x02\xb1\xff\xd7\x02\xb5\x02\ +\xb2\xffq\x02\xb5\x02\xb3\xff\xd7\x02\xb5\x02\xb4\xffq\x02\ +\xb5\x02\xb5\x00)\x02\xb5\x02\xb6\xff\xae\x02\xb5\x02\xb8\xff\ +\xae\x02\xb5\x02\xba\xff\xae\x02\xb5\x02\xbc\xff\xd7\x02\xb5\x02\ +\xbe\xff\xae\x02\xb5\x02\xc0\xff\x9a\x02\xb5\x02\xc2\xff\x9a\x02\ +\xb5\x02\xc4\xff\x9a\x02\xb5\x02\xc5\xff\x9a\x02\xb5\x02\xc6\xff\ +q\x02\xb5\x02\xc7\xff\x9a\x02\xb5\x02\xc8\xffq\x02\xb5\x02\ +\xcb\xff\xd7\x02\xb5\x02\xcd\xff\x9a\x02\xb5\x02\xce\xff\x9a\x02\ +\xb5\x02\xcf\xff\x85\x02\xb5\x02\xd1\xff\x9a\x02\xb5\x02\xd3\xff\ +\x9a\x02\xb5\x02\xd5\xff\x9a\x02\xb5\x02\xd7\xff\x9a\x02\xb5\x02\ +\xd9\xffq\x02\xb5\x02\xdb\xffq\x02\xb5\x02\xdd\xffq\x02\ +\xb5\x02\xe0\xffq\x02\xb5\x02\xe6\xff\xd7\x02\xb5\x02\xe8\xff\ +\xd7\x02\xb5\x02\xea\xff\xc3\x02\xb5\x02\xec\xff\x9a\x02\xb5\x02\ +\xee\xff\x9a\x02\xb5\x02\xef\xff\xd7\x02\xb5\x02\xf0\xffq\x02\ +\xb5\x02\xf1\xff\xd7\x02\xb5\x02\xf2\xffq\x02\xb5\x02\xf3\xff\ +\xd7\x02\xb5\x02\xf4\xffq\x02\xb5\x02\xf6\xff\xd7\x02\xb5\x02\ +\xf8\xff\xae\x02\xb5\x02\xfa\xff\xae\x02\xb5\x02\xfc\xff\xae\x02\ +\xb5\x02\xfe\xff\x9a\x02\xb5\x03\x00\xff\x9a\x02\xb5\x03\x02\xff\ +\x9a\x02\xb5\x03\x06\xff\xd7\x02\xb5\x03\x08\xff\xd7\x02\xb5\x03\ +\x09\xffq\x02\xb5\x03\x0a\xffq\x02\xb5\x03\x0b\xffq\x02\ +\xb5\x03\x0c\xffq\x02\xb5\x03\x0e\xff\x9a\x02\xb5\x03\x10\xff\ +\x9a\x02\xb5\x03\x11\xff\x9a\x02\xb5\x03\x12\xff\x85\x02\xb5\x03\ +\x14\xff\x9a\x02\xb5\x03\x15\xff\xd7\x02\xb5\x03\x16\xffq\x02\ +\xb5\x03\x18\xff\xae\x02\xb5\x03\x1a\xffq\x02\xb5\x03\x1b\xff\ +\x9a\x02\xb5\x03\x1c\xff\x85\x02\xb6\x00\x0f\xff\x9a\x02\xb6\x00\ +\x10\xff\xd7\x02\xb6\x00\x11\xff\x9a\x02\xb6\x01\xce\xff\xc3\x02\ +\xb6\x01\xcf\xff\xec\x02\xb6\x01\xd5\xff\xc3\x02\xb6\x01\xd8\xff\ +\xec\x02\xb6\x01\xdb\xff\xec\x02\xb6\x01\xde\xff\xec\x02\xb6\x01\ +\xea\xff\xec\x02\xb6\x01\xed\xff\xec\x02\xb6\x01\xf2\xff\xc3\x02\ +\xb6\x02\x02\xff\xd7\x02\xb6\x02\x03\xff\xd7\x02\xb6\x02\x04\xff\ +\xd7\x02\xb6\x02\x08\xff\x9a\x02\xb6\x02\x0c\xff\x9a\x02\xb6\x02\ +j\xff\xec\x02\xb6\x02s\xff\xc3\x02\xb6\x02\x7f\xff\xec\x02\ +\xb6\x02\x85\xff\xec\x02\xb6\x02\x87\xff\xec\x02\xb6\x02\x89\xff\ +\xec\x02\xb6\x02\x8d\xff\xec\x02\xb6\x02\xb2\xff\xec\x02\xb6\x02\ +\xb4\xff\xec\x02\xb6\x02\xcf\xff\xc3\x02\xb6\x02\xe0\xff\xec\x02\ +\xb6\x02\xf0\xff\xec\x02\xb6\x02\xf2\xff\xec\x02\xb6\x02\xf4\xff\ +\xec\x02\xb6\x03\x0a\xff\xec\x02\xb6\x03\x0c\xff\xec\x02\xb6\x03\ +\x12\xff\xc3\x02\xb6\x03\x16\xff\xec\x02\xb6\x03\x1a\xff\xec\x02\ +\xb6\x03\x1c\xff\xc3\x02\xb7\x00\x0f\xff\x85\x02\xb7\x00\x11\xff\ +\x85\x02\xb7\x01\x9f\xff\xd7\x02\xb7\x01\xa4\xff\xae\x02\xb7\x01\ +\xaa\xff\x85\x02\xb7\x01\xae\xff\xae\x02\xb7\x01\xb5\xff\xae\x02\ +\xb7\x01\xb8\xff\xd7\x02\xb7\x01\xbb\xff\xd7\x02\xb7\x01\xbe\xff\ +\xc3\x02\xb7\x01\xca\xff\xae\x02\xb7\x01\xcc\xff\xc3\x02\xb7\x01\ +\xcd\xff\xc3\x02\xb7\x01\xce\xff\x9a\x02\xb7\x01\xcf\xff\x9a\x02\ +\xb7\x01\xd2\xff\xc3\x02\xb7\x01\xd3\xff\xc3\x02\xb7\x01\xd4\xff\ +\xc3\x02\xb7\x01\xd5\xff\x9a\x02\xb7\x01\xd6\xff\xc3\x02\xb7\x01\ +\xd7\xff\xc3\x02\xb7\x01\xd8\xff\x9a\x02\xb7\x01\xd9\xff\xc3\x02\ +\xb7\x01\xda\xff\xc3\x02\xb7\x01\xdb\xff\x9a\x02\xb7\x01\xde\xff\ +\x9a\x02\xb7\x01\xe0\xff\xc3\x02\xb7\x01\xe1\xff\xae\x02\xb7\x01\ +\xe2\xff\xc3\x02\xb7\x01\xe3\xff\xc3\x02\xb7\x01\xe5\xff\xc3\x02\ +\xb7\x01\xe6\xff\xc3\x02\xb7\x01\xe8\xff\xc3\x02\xb7\x01\xe9\xff\ +\xd7\x02\xb7\x01\xea\xff\x9a\x02\xb7\x01\xeb\x00)\x02\xb7\x01\ +\xec\xff\xc3\x02\xb7\x01\xed\xff\x9a\x02\xb7\x01\xee\xff\xae\x02\ +\xb7\x01\xf2\xff\x9a\x02\xb7\x01\xf3\xff\xc3\x02\xb7\x01\xf4\x00\ +)\x02\xb7\x01\xf5\xff\xc3\x02\xb7\x01\xf7\xff\xc3\x02\xb7\x01\ +\xf9\xff\xc3\x02\xb7\x02\x08\xff\x85\x02\xb7\x02\x0c\xff\x85\x02\ +\xb7\x02j\xff\x9a\x02\xb7\x02k\xff\xc3\x02\xb7\x02l\xff\ +\xd7\x02\xb7\x02q\xff\xc3\x02\xb7\x02r\xff\x85\x02\xb7\x02\ +s\xff\x9a\x02\xb7\x02u\xff\xc3\x02\xb7\x02w\xff\xd7\x02\ +\xb7\x02y\xff\xc3\x02\xb7\x02}\xff\xd7\x02\xb7\x02~\xff\ +\xd7\x02\xb7\x02\x7f\xff\x9a\x02\xb7\x02\x84\xff\xd7\x02\xb7\x02\ +\x85\xff\x9a\x02\xb7\x02\x86\xff\xd7\x02\xb7\x02\x87\xff\x9a\x02\ +\xb7\x02\x88\xff\xd7\x02\xb7\x02\x89\xff\x9a\x02\xb7\x02\x8a\xff\ +\xd7\x02\xb7\x02\x8c\xff\xd7\x02\xb7\x02\x8d\xff\x9a\x02\xb7\x02\ +\x96\xff\xc3\x02\xb7\x02\x98\x00)\x02\xb7\x02\x9a\xff\xc3\x02\ +\xb7\x02\x9e\xff\xc3\x02\xb7\x02\xa4\xff\xc3\x02\xb7\x02\xa6\xff\ +\xc3\x02\xb7\x02\xa8\x00)\x02\xb7\x02\xac\xff\xc3\x02\xb7\x02\ +\xae\xff\xc3\x02\xb7\x02\xb0\xff\xc3\x02\xb7\x02\xb1\xff\xd7\x02\ +\xb7\x02\xb2\xff\x9a\x02\xb7\x02\xb3\xff\xd7\x02\xb7\x02\xb4\xff\ +\x9a\x02\xb7\x02\xc0\xff\xae\x02\xb7\x02\xc2\xff\xae\x02\xb7\x02\ +\xc4\xff\xc3\x02\xb7\x02\xc6\xff\xae\x02\xb7\x02\xc8\xff\xae\x02\ +\xb7\x02\xcd\xff\xc3\x02\xb7\x02\xce\xff\xae\x02\xb7\x02\xcf\xff\ +\x9a\x02\xb7\x02\xd1\xff\xc3\x02\xb7\x02\xd3\xff\xc3\x02\xb7\x02\ +\xd5\xff\xae\x02\xb7\x02\xd7\xff\xc3\x02\xb7\x02\xd9\xff\x85\x02\ +\xb7\x02\xda\xff\xae\x02\xb7\x02\xdb\xff\x85\x02\xb7\x02\xdc\xff\ +\xae\x02\xb7\x02\xdd\xff\x85\x02\xb7\x02\xde\xff\xae\x02\xb7\x02\ +\xe0\xff\x9a\x02\xb7\x02\xe1\xff\xec\x02\xb7\x02\xe2\xff\xae\x02\ +\xb7\x02\xe3\xff\xec\x02\xb7\x02\xe4\xff\xae\x02\xb7\x02\xec\xff\ +\xc3\x02\xb7\x02\xee\xff\xc3\x02\xb7\x02\xef\xff\xd7\x02\xb7\x02\ +\xf0\xff\x9a\x02\xb7\x02\xf1\xff\xd7\x02\xb7\x02\xf2\xff\x9a\x02\ +\xb7\x02\xf3\xff\xd7\x02\xb7\x02\xf4\xff\x9a\x02\xb7\x02\xfe\xff\ +\xae\x02\xb7\x03\x00\xff\xc3\x02\xb7\x03\x02\xff\xc3\x02\xb7\x03\ +\x09\xff\xae\x02\xb7\x03\x0a\xff\x9a\x02\xb7\x03\x0b\xff\xae\x02\ +\xb7\x03\x0c\xff\x9a\x02\xb7\x03\x0e\xff\xd7\x02\xb7\x03\x10\xff\ +\xd7\x02\xb7\x03\x11\xff\xae\x02\xb7\x03\x12\xff\x9a\x02\xb7\x03\ +\x14\xff\xc3\x02\xb7\x03\x15\xff\xd7\x02\xb7\x03\x16\xff\x9a\x02\ +\xb7\x03\x19\xff\xec\x02\xb7\x03\x1a\xff\x9a\x02\xb7\x03\x1b\xff\ +\xae\x02\xb7\x03\x1c\xff\x9a\x02\xb8\x00\x0f\xff\xae\x02\xb8\x00\ +\x11\xff\xae\x02\xb8\x01\xce\xff\xec\x02\xb8\x01\xd5\xff\xec\x02\ +\xb8\x01\xf2\xff\xec\x02\xb8\x02\x08\xff\xae\x02\xb8\x02\x0c\xff\ +\xae\x02\xb8\x02s\xff\xec\x02\xb8\x02\xcf\xff\xec\x02\xb8\x03\ +\x12\xff\xec\x02\xb8\x03\x1c\xff\xec\x02\xb9\x00\x0f\xff\x85\x02\ +\xb9\x00\x11\xff\x85\x02\xb9\x01\x9f\xff\xd7\x02\xb9\x01\xa4\xff\ +\xae\x02\xb9\x01\xaa\xff\x85\x02\xb9\x01\xae\xff\xae\x02\xb9\x01\ +\xb5\xff\xae\x02\xb9\x01\xb8\xff\xd7\x02\xb9\x01\xbb\xff\xd7\x02\ +\xb9\x01\xbe\xff\xc3\x02\xb9\x01\xca\xff\xae\x02\xb9\x01\xcc\xff\ +\xc3\x02\xb9\x01\xcd\xff\xc3\x02\xb9\x01\xce\xff\x9a\x02\xb9\x01\ +\xcf\xff\x9a\x02\xb9\x01\xd2\xff\xc3\x02\xb9\x01\xd3\xff\xc3\x02\ +\xb9\x01\xd4\xff\xc3\x02\xb9\x01\xd5\xff\x9a\x02\xb9\x01\xd6\xff\ +\xc3\x02\xb9\x01\xd7\xff\xc3\x02\xb9\x01\xd8\xff\x9a\x02\xb9\x01\ +\xd9\xff\xc3\x02\xb9\x01\xda\xff\xc3\x02\xb9\x01\xdb\xff\x9a\x02\ +\xb9\x01\xde\xff\x9a\x02\xb9\x01\xe0\xff\xc3\x02\xb9\x01\xe1\xff\ +\xae\x02\xb9\x01\xe2\xff\xc3\x02\xb9\x01\xe3\xff\xc3\x02\xb9\x01\ +\xe5\xff\xc3\x02\xb9\x01\xe6\xff\xc3\x02\xb9\x01\xe8\xff\xc3\x02\ +\xb9\x01\xe9\xff\xd7\x02\xb9\x01\xea\xff\x9a\x02\xb9\x01\xeb\x00\ +)\x02\xb9\x01\xec\xff\xc3\x02\xb9\x01\xed\xff\x9a\x02\xb9\x01\ +\xee\xff\xae\x02\xb9\x01\xf2\xff\x9a\x02\xb9\x01\xf3\xff\xc3\x02\ +\xb9\x01\xf4\x00)\x02\xb9\x01\xf5\xff\xc3\x02\xb9\x01\xf7\xff\ +\xc3\x02\xb9\x01\xf9\xff\xc3\x02\xb9\x02\x08\xff\x85\x02\xb9\x02\ +\x0c\xff\x85\x02\xb9\x02j\xff\x9a\x02\xb9\x02k\xff\xc3\x02\ +\xb9\x02l\xff\xd7\x02\xb9\x02q\xff\xc3\x02\xb9\x02r\xff\ +\x85\x02\xb9\x02s\xff\x9a\x02\xb9\x02u\xff\xc3\x02\xb9\x02\ +w\xff\xd7\x02\xb9\x02y\xff\xc3\x02\xb9\x02}\xff\xd7\x02\ +\xb9\x02~\xff\xd7\x02\xb9\x02\x7f\xff\x9a\x02\xb9\x02\x84\xff\ +\xd7\x02\xb9\x02\x85\xff\x9a\x02\xb9\x02\x86\xff\xd7\x02\xb9\x02\ +\x87\xff\x9a\x02\xb9\x02\x88\xff\xd7\x02\xb9\x02\x89\xff\x9a\x02\ +\xb9\x02\x8a\xff\xd7\x02\xb9\x02\x8c\xff\xd7\x02\xb9\x02\x8d\xff\ +\x9a\x02\xb9\x02\x96\xff\xc3\x02\xb9\x02\x98\x00)\x02\xb9\x02\ +\x9a\xff\xc3\x02\xb9\x02\x9e\xff\xc3\x02\xb9\x02\xa4\xff\xc3\x02\ +\xb9\x02\xa6\xff\xc3\x02\xb9\x02\xa8\x00)\x02\xb9\x02\xac\xff\ +\xc3\x02\xb9\x02\xae\xff\xc3\x02\xb9\x02\xb0\xff\xc3\x02\xb9\x02\ +\xb1\xff\xd7\x02\xb9\x02\xb2\xff\x9a\x02\xb9\x02\xb3\xff\xd7\x02\ +\xb9\x02\xb4\xff\x9a\x02\xb9\x02\xc0\xff\xae\x02\xb9\x02\xc2\xff\ +\xae\x02\xb9\x02\xc4\xff\xc3\x02\xb9\x02\xc6\xff\xae\x02\xb9\x02\ +\xc8\xff\xae\x02\xb9\x02\xcd\xff\xc3\x02\xb9\x02\xce\xff\xae\x02\ +\xb9\x02\xcf\xff\x9a\x02\xb9\x02\xd1\xff\xc3\x02\xb9\x02\xd3\xff\ +\xc3\x02\xb9\x02\xd5\xff\xae\x02\xb9\x02\xd7\xff\xc3\x02\xb9\x02\ +\xd9\xff\x85\x02\xb9\x02\xda\xff\xae\x02\xb9\x02\xdb\xff\x85\x02\ +\xb9\x02\xdc\xff\xae\x02\xb9\x02\xdd\xff\x85\x02\xb9\x02\xde\xff\ +\xae\x02\xb9\x02\xe0\xff\x9a\x02\xb9\x02\xe1\xff\xec\x02\xb9\x02\ +\xe2\xff\xae\x02\xb9\x02\xe3\xff\xec\x02\xb9\x02\xe4\xff\xae\x02\ +\xb9\x02\xec\xff\xc3\x02\xb9\x02\xee\xff\xc3\x02\xb9\x02\xef\xff\ +\xd7\x02\xb9\x02\xf0\xff\x9a\x02\xb9\x02\xf1\xff\xd7\x02\xb9\x02\ +\xf2\xff\x9a\x02\xb9\x02\xf3\xff\xd7\x02\xb9\x02\xf4\xff\x9a\x02\ +\xb9\x02\xfe\xff\xae\x02\xb9\x03\x00\xff\xc3\x02\xb9\x03\x02\xff\ +\xc3\x02\xb9\x03\x09\xff\xae\x02\xb9\x03\x0a\xff\x9a\x02\xb9\x03\ +\x0b\xff\xae\x02\xb9\x03\x0c\xff\x9a\x02\xb9\x03\x0e\xff\xd7\x02\ +\xb9\x03\x10\xff\xd7\x02\xb9\x03\x11\xff\xae\x02\xb9\x03\x12\xff\ +\x9a\x02\xb9\x03\x14\xff\xc3\x02\xb9\x03\x15\xff\xd7\x02\xb9\x03\ +\x16\xff\x9a\x02\xb9\x03\x19\xff\xec\x02\xb9\x03\x1a\xff\x9a\x02\ +\xb9\x03\x1b\xff\xae\x02\xb9\x03\x1c\xff\x9a\x02\xba\x00\x0f\xff\ +\xae\x02\xba\x00\x11\xff\xae\x02\xba\x01\xce\xff\xec\x02\xba\x01\ +\xd5\xff\xec\x02\xba\x01\xf2\xff\xec\x02\xba\x02\x08\xff\xae\x02\ +\xba\x02\x0c\xff\xae\x02\xba\x02s\xff\xec\x02\xba\x02\xcf\xff\ +\xec\x02\xba\x03\x12\xff\xec\x02\xba\x03\x1c\xff\xec\x02\xbb\x01\ +\x9f\xff\xd7\x02\xbb\x01\xa3\x00\xe1\x02\xbb\x01\xb8\xff\xd7\x02\ +\xbb\x01\xbb\xff\xd7\x02\xbb\x01\xbe\xff\xc3\x02\xbb\x01\xdc\xff\ +\xd7\x02\xbb\x01\xe1\xff\xae\x02\xbb\x01\xe4\xff\xd7\x02\xbb\x02\ +l\xff\xd7\x02\xbb\x02{\x00=\x02\xbb\x02}\xff\xec\x02\ +\xbb\x02~\xff\xd7\x02\xbb\x02\x84\xff\xd7\x02\xbb\x02\x86\xff\ +\xd7\x02\xbb\x02\x88\xff\xd7\x02\xbb\x02\x8a\xff\xd7\x02\xbb\x02\ +\x8c\xff\xd7\x02\xbb\x02\xaa\xff\xd7\x02\xbb\x02\xb1\xff\xd7\x02\ +\xbb\x02\xb3\xff\xd7\x02\xbb\x02\xb6\xff\xd7\x02\xbb\x02\xbe\xff\ +\xd7\x02\xbb\x02\xc0\xff\xae\x02\xbb\x02\xc2\xff\xae\x02\xbb\x02\ +\xc5\xff\xc3\x02\xbb\x02\xc6\xff\xd7\x02\xbb\x02\xc7\xff\xc3\x02\ +\xbb\x02\xc8\xff\xd7\x02\xbb\x02\xd5\xff\xae\x02\xbb\x02\xef\xff\ +\xd7\x02\xbb\x02\xf1\xff\xd7\x02\xbb\x02\xf3\xff\xd7\x02\xbb\x02\ +\xfe\xff\xae\x02\xbb\x03\x0e\xff\xd7\x02\xbb\x03\x10\xff\xd7\x02\ +\xbb\x03\x15\xff\xd7\x02\xbb\x03\x18\xff\xd7\x02\xbc\x01\xcf\xff\ +\xec\x02\xbc\x01\xd8\xff\xec\x02\xbc\x01\xdb\xff\xec\x02\xbc\x01\ +\xde\xff\xec\x02\xbc\x01\xe1\xff\xec\x02\xbc\x01\xea\xff\xec\x02\ +\xbc\x01\xed\xff\xec\x02\xbc\x02j\xff\xec\x02\xbc\x02\x7f\xff\ +\xec\x02\xbc\x02\x85\xff\xec\x02\xbc\x02\x87\xff\xec\x02\xbc\x02\ +\x89\xff\xec\x02\xbc\x02\x8d\xff\xec\x02\xbc\x02\xb2\xff\xec\x02\ +\xbc\x02\xb4\xff\xec\x02\xbc\x02\xc0\xff\xec\x02\xbc\x02\xc2\xff\ +\xec\x02\xbc\x02\xd5\xff\xec\x02\xbc\x02\xe0\xff\xec\x02\xbc\x02\ +\xf0\xff\xec\x02\xbc\x02\xf2\xff\xec\x02\xbc\x02\xf4\xff\xec\x02\ +\xbc\x02\xfe\xff\xec\x02\xbc\x03\x0a\xff\xec\x02\xbc\x03\x0c\xff\ +\xec\x02\xbc\x03\x0e\xff\xd7\x02\xbc\x03\x10\xff\xd7\x02\xbc\x03\ +\x16\xff\xec\x02\xbc\x03\x1a\xff\xec\x02\xbd\x01\xa3\x00\xe1\x02\ +\xbd\x02\xea\x00)\x02\xbd\x03\x0e\xff\xd7\x02\xbd\x03\x10\xff\ +\xd7\x02\xbe\x00\x05\xff\xec\x02\xbe\x00\x0a\xff\xec\x02\xbe\x02\ +\x07\xff\xec\x02\xbe\x02\x0b\xff\xec\x02\xbf\x01\xa3\x00\xe1\x02\ +\xbf\x02\xea\x00)\x02\xbf\x03\x0e\xff\xd7\x02\xbf\x03\x10\xff\ +\xd7\x02\xc0\x00\x05\xff\xec\x02\xc0\x00\x0a\xff\xec\x02\xc0\x02\ +\x07\xff\xec\x02\xc0\x02\x0b\xff\xec\x02\xc3\x00\x05\xff\xc3\x02\ +\xc3\x00\x0a\xff\xc3\x02\xc3\x01\x9d\xff\xd7\x02\xc3\x01\xa6\xff\ +\xd7\x02\xc3\x01\xbc\xff\x85\x02\xc3\x01\xc1\xff\xae\x02\xc3\x01\ +\xc4\xff\xd7\x02\xc3\x01\xdc\xff\xd7\x02\xc3\x01\xdd\xff\xec\x02\ +\xc3\x01\xe1\xff\xec\x02\xc3\x01\xe4\xff\xd7\x02\xc3\x01\xf6\xff\ +\xec\x02\xc3\x02\x07\xff\xc3\x02\xc3\x02\x0b\xff\xc3\x02\xc3\x02\ +|\xff\xae\x02\xc3\x02\x80\xff\xc3\x02\xc3\x02\x82\xff\xc3\x02\ +\xc3\x02\xa9\xff\xd7\x02\xc3\x02\xaa\xff\xd7\x02\xc3\x02\xb5\xff\ +\x85\x02\xc3\x02\xb6\xff\xd7\x02\xc3\x02\xb7\xff\x9a\x02\xc3\x02\ +\xb9\xff\x9a\x02\xc3\x02\xbd\xff\xd7\x02\xc3\x02\xbe\xff\xd7\x02\ +\xc3\x02\xbf\xff\xae\x02\xc3\x02\xc0\xff\xec\x02\xc3\x02\xc1\xff\ +\xae\x02\xc3\x02\xc2\xff\xec\x02\xc3\x02\xd4\xff\xae\x02\xc3\x02\ +\xd5\xff\xec\x02\xc3\x02\xf8\xff\xec\x02\xc3\x02\xfa\xff\xec\x02\ +\xc3\x02\xfc\xff\xec\x02\xc3\x02\xfd\xff\xae\x02\xc3\x02\xfe\xff\ +\xec\x02\xc3\x03\x0d\xff\xae\x02\xc3\x03\x0e\xff\xd7\x02\xc3\x03\ +\x0f\xff\xae\x02\xc3\x03\x10\xff\xd7\x02\xc3\x03\x17\xff\xd7\x02\ +\xc3\x03\x18\xff\xd7\x02\xc4\x00\x05\xff\x9a\x02\xc4\x00\x0a\xff\ +\x9a\x02\xc4\x01\xdc\xff\xd7\x02\xc4\x01\xdd\xff\xd7\x02\xc4\x01\ +\xe4\xff\xd7\x02\xc4\x01\xf6\xff\xd7\x02\xc4\x02\x07\xff\x9a\x02\ +\xc4\x02\x0b\xff\x9a\x02\xc4\x02\xaa\xff\xd7\x02\xc4\x02\xb6\xff\ +\xd7\x02\xc4\x02\xb8\xff\xd7\x02\xc4\x02\xba\xff\xd7\x02\xc4\x02\ +\xbe\xff\xd7\x02\xc4\x02\xf8\xff\xd7\x02\xc4\x02\xfa\xff\xd7\x02\ +\xc4\x02\xfc\xff\xd7\x02\xc4\x03\x0e\xff\xae\x02\xc4\x03\x10\xff\ +\xae\x02\xc4\x03\x18\xff\xd7\x02\xc5\x01\xbc\xff\xd7\x02\xc5\x02\ +\x80\xff\xec\x02\xc5\x02\x82\xff\xec\x02\xc5\x02\xb5\xff\xd7\x02\ +\xc5\x02\xb7\xff\xec\x02\xc5\x02\xb9\xff\xec\x02\xc5\x03\x0d\xff\ +\xec\x02\xc5\x03\x0f\xff\xec\x02\xc6\x00\x05\xff\xec\x02\xc6\x00\ +\x0a\xff\xec\x02\xc6\x02\x07\xff\xec\x02\xc6\x02\x0b\xff\xec\x02\ +\xc7\x01\xbc\xff\xd7\x02\xc7\x02\x80\xff\xec\x02\xc7\x02\x82\xff\ +\xec\x02\xc7\x02\xb5\xff\xd7\x02\xc7\x02\xb7\xff\xec\x02\xc7\x02\ +\xb9\xff\xec\x02\xc7\x03\x0d\xff\xec\x02\xc7\x03\x0f\xff\xec\x02\ +\xc8\x00\x05\xff\xec\x02\xc8\x00\x0a\xff\xec\x02\xc8\x02\x07\xff\ +\xec\x02\xc8\x02\x0b\xff\xec\x02\xca\x01\x9f\xff\xd7\x02\xca\x01\ +\xb8\xff\xd7\x02\xca\x01\xbb\xff\xd7\x02\xca\x01\xbe\xff\xd7\x02\ +\xca\x01\xc1\xff\xd7\x02\xca\x01\xe1\xff\xd7\x02\xca\x02l\xff\ +\xd7\x02\xca\x02|\xff\xd7\x02\xca\x02~\xff\xd7\x02\xca\x02\ +\x84\xff\xd7\x02\xca\x02\x86\xff\xd7\x02\xca\x02\x88\xff\xd7\x02\ +\xca\x02\x8a\xff\xd7\x02\xca\x02\x8c\xff\xd7\x02\xca\x02\xb1\xff\ +\xd7\x02\xca\x02\xb3\xff\xd7\x02\xca\x02\xbf\xff\xd7\x02\xca\x02\ +\xc0\xff\xd7\x02\xca\x02\xc1\xff\xd7\x02\xca\x02\xc2\xff\xd7\x02\ +\xca\x02\xc5\xff\x9a\x02\xca\x02\xc7\xff\x9a\x02\xca\x02\xd4\xff\ +\xd7\x02\xca\x02\xd5\xff\xd7\x02\xca\x02\xef\xff\xd7\x02\xca\x02\ +\xf1\xff\xd7\x02\xca\x02\xf3\xff\xd7\x02\xca\x02\xfd\xff\xd7\x02\ +\xca\x02\xfe\xff\xd7\x02\xca\x03\x09\xff\xd7\x02\xca\x03\x0b\xff\ +\xd7\x02\xca\x03\x0e\xff\xd7\x02\xca\x03\x10\xff\xd7\x02\xca\x03\ +\x15\xff\xd7\x02\xca\x03\x19\xff\xec\x02\xcb\x01\xcf\xff\xd7\x02\ +\xcb\x01\xd8\xff\xd7\x02\xcb\x01\xdb\xff\xd7\x02\xcb\x01\xde\xff\ +\xd7\x02\xcb\x01\xe1\xff\xd7\x02\xcb\x01\xea\xff\xd7\x02\xcb\x01\ +\xed\xff\xd7\x02\xcb\x02j\xff\xd7\x02\xcb\x02\x7f\xff\xd7\x02\ +\xcb\x02\x85\xff\xd7\x02\xcb\x02\x87\xff\xd7\x02\xcb\x02\x89\xff\ +\xd7\x02\xcb\x02\x8d\xff\xd7\x02\xcb\x02\xb2\xff\xd7\x02\xcb\x02\ +\xb4\xff\xd7\x02\xcb\x02\xc0\xff\xd7\x02\xcb\x02\xc2\xff\xd7\x02\ +\xcb\x02\xc6\xff\xd7\x02\xcb\x02\xc8\xff\xd7\x02\xcb\x02\xd5\xff\ +\xd7\x02\xcb\x02\xe0\xff\xd7\x02\xcb\x02\xf0\xff\xd7\x02\xcb\x02\ +\xf2\xff\xd7\x02\xcb\x02\xf4\xff\xd7\x02\xcb\x02\xfe\xff\xd7\x02\ +\xcb\x03\x0a\xff\xd7\x02\xcb\x03\x0c\xff\xd7\x02\xcb\x03\x16\xff\ +\xd7\x02\xcb\x03\x1a\xff\xd7\x02\xcc\x00\x05\xff\xc3\x02\xcc\x00\ +\x0a\xff\xc3\x02\xcc\x01\xa3\x00f\x02\xcc\x01\xbc\xff\xd7\x02\ +\xcc\x01\xbe\xff\xd7\x02\xcc\x01\xc1\xff\xae\x02\xcc\x01\xdc\xff\ +\xc3\x02\xcc\x01\xe1\xff\xd7\x02\xcc\x01\xe4\xff\xc3\x02\xcc\x02\ +\x07\xff\xc3\x02\xcc\x02\x0b\xff\xc3\x02\xcc\x02m\xff\xec\x02\ +\xcc\x02|\xff\xae\x02\xcc\x02\x80\xff\xd7\x02\xcc\x02\x81\xff\ +\xec\x02\xcc\x02\x82\xff\xd7\x02\xcc\x02\x83\xff\xec\x02\xcc\x02\ +\x8b\xff\xec\x02\xcc\x02\xaa\xff\xc3\x02\xcc\x02\xb5\xff\xd7\x02\ +\xcc\x02\xb6\xff\xc3\x02\xcc\x02\xb7\xff\xd7\x02\xcc\x02\xb8\xff\ +\xec\x02\xcc\x02\xb9\xff\xd7\x02\xcc\x02\xba\xff\xec\x02\xcc\x02\ +\xbe\xff\xc3\x02\xcc\x02\xbf\xff\xae\x02\xcc\x02\xc0\xff\xd7\x02\ +\xcc\x02\xc1\xff\xae\x02\xcc\x02\xc2\xff\xd7\x02\xcc\x02\xc5\xff\ +\xc3\x02\xcc\x02\xc6\xff\xd7\x02\xcc\x02\xc7\xff\xc3\x02\xcc\x02\ +\xc8\xff\xd7\x02\xcc\x02\xd4\xff\xae\x02\xcc\x02\xd5\xff\xd7\x02\ +\xcc\x02\xfd\xff\xae\x02\xcc\x02\xfe\xff\xd7\x02\xcc\x03\x0d\xff\ +\xd7\x02\xcc\x03\x0e\xff\xc3\x02\xcc\x03\x0f\xff\xd7\x02\xcc\x03\ +\x10\xff\xc3\x02\xcc\x03\x18\xff\xc3\x02\xcd\x01\xe1\xff\xd7\x02\ +\xcd\x02\xc0\xff\xd7\x02\xcd\x02\xc2\xff\xd7\x02\xcd\x02\xd5\xff\ +\xd7\x02\xcd\x02\xfe\xff\xd7\x02\xce\x01\xa3\x00\xe1\x02\xce\x02\ +\xea\x00)\x02\xce\x03\x0e\xff\xd7\x02\xce\x03\x10\xff\xd7\x02\ +\xcf\x00\x05\xff\xec\x02\xcf\x00\x0a\xff\xec\x02\xcf\x02\x07\xff\ +\xec\x02\xcf\x02\x0b\xff\xec\x02\xd2\x01\xa3\x00\xe1\x02\xd2\x02\ +\xea\x00)\x02\xd2\x03\x0e\xff\xd7\x02\xd2\x03\x10\xff\xd7\x02\ +\xd3\x00\x05\xff\xec\x02\xd3\x00\x0a\xff\xec\x02\xd3\x02\x07\xff\ +\xec\x02\xd3\x02\x0b\xff\xec\x02\xd6\x01\xa3\x00\xe1\x02\xd6\x02\ +\xea\x00)\x02\xd6\x03\x0e\xff\xd7\x02\xd6\x03\x10\xff\xd7\x02\ +\xd7\x00\x05\xff\xec\x02\xd7\x00\x0a\xff\xec\x02\xd7\x02\x07\xff\ +\xec\x02\xd7\x02\x0b\xff\xec\x02\xd9\x00\x05\xffq\x02\xd9\x00\ +\x0a\xffq\x02\xd9\x01\x9d\xff\x9a\x02\xd9\x01\xa6\xff\x9a\x02\ +\xd9\x01\xbc\xffq\x02\xd9\x01\xbe\xff\xd7\x02\xd9\x01\xc1\xff\ +\x9a\x02\xd9\x01\xc4\xff\x9a\x02\xd9\x01\xdc\xff\xd7\x02\xd9\x01\ +\xe1\xff\xd7\x02\xd9\x01\xe4\xff\xd7\x02\xd9\x02\x07\xffq\x02\ +\xd9\x02\x0b\xffq\x02\xd9\x02n\xff\xd7\x02\xd9\x02|\xff\ +\x9a\x02\xd9\x02\x80\xff\xae\x02\xd9\x02\x82\xff\xae\x02\xd9\x02\ +\x97\xff\xd7\x02\xd9\x02\x9b\xff\xd7\x02\xd9\x02\xa7\xff\xd7\x02\ +\xd9\x02\xa9\xff\x9a\x02\xd9\x02\xaa\xff\xd7\x02\xd9\x02\xb5\xff\ +q\x02\xd9\x02\xb6\xff\xd7\x02\xd9\x02\xb7\xff\x85\x02\xd9\x02\ +\xb9\xff\x85\x02\xd9\x02\xbd\xff\x9a\x02\xd9\x02\xbe\xff\xd7\x02\ +\xd9\x02\xbf\xff\x9a\x02\xd9\x02\xc0\xff\xd7\x02\xd9\x02\xc1\xff\ +\x9a\x02\xd9\x02\xc2\xff\xd7\x02\xd9\x02\xc5\xff\x9a\x02\xd9\x02\ +\xc7\xff\x9a\x02\xd9\x02\xd4\xff\x9a\x02\xd9\x02\xd5\xff\xd7\x02\ +\xd9\x02\xe1\xff\xd7\x02\xd9\x02\xe3\xff\xd7\x02\xd9\x02\xfd\xff\ +\x9a\x02\xd9\x02\xfe\xff\xd7\x02\xd9\x03\x03\xff\xd7\x02\xd9\x03\ +\x0d\xffq\x02\xd9\x03\x0e\xff\xd7\x02\xd9\x03\x0f\xffq\x02\ +\xd9\x03\x10\xff\xd7\x02\xd9\x03\x17\xff\x9a\x02\xd9\x03\x18\xff\ +\xd7\x02\xda\x00\x05\xff\xec\x02\xda\x00\x0a\xff\xec\x02\xda\x02\ +\x07\xff\xec\x02\xda\x02\x0b\xff\xec\x02\xdb\x00\x05\xffq\x02\ +\xdb\x00\x0a\xffq\x02\xdb\x01\x9d\xff\x9a\x02\xdb\x01\xa6\xff\ +\x9a\x02\xdb\x01\xbc\xffq\x02\xdb\x01\xbe\xff\xd7\x02\xdb\x01\ +\xc1\xff\x9a\x02\xdb\x01\xc4\xff\x9a\x02\xdb\x01\xdc\xff\xd7\x02\ +\xdb\x01\xe1\xff\xd7\x02\xdb\x01\xe4\xff\xd7\x02\xdb\x02\x07\xff\ +q\x02\xdb\x02\x0b\xffq\x02\xdb\x02n\xff\xd7\x02\xdb\x02\ +|\xff\x9a\x02\xdb\x02\x80\xff\xae\x02\xdb\x02\x82\xff\xae\x02\ +\xdb\x02\x97\xff\xd7\x02\xdb\x02\x9b\xff\xd7\x02\xdb\x02\xa7\xff\ +\xd7\x02\xdb\x02\xa9\xff\x9a\x02\xdb\x02\xaa\xff\xd7\x02\xdb\x02\ +\xb5\xffq\x02\xdb\x02\xb6\xff\xd7\x02\xdb\x02\xb7\xff\x85\x02\ +\xdb\x02\xb9\xff\x85\x02\xdb\x02\xbd\xff\x9a\x02\xdb\x02\xbe\xff\ +\xd7\x02\xdb\x02\xbf\xff\x9a\x02\xdb\x02\xc0\xff\xd7\x02\xdb\x02\ +\xc1\xff\x9a\x02\xdb\x02\xc2\xff\xd7\x02\xdb\x02\xc5\xff\x9a\x02\ +\xdb\x02\xc7\xff\x9a\x02\xdb\x02\xd4\xff\x9a\x02\xdb\x02\xd5\xff\ +\xd7\x02\xdb\x02\xe1\xff\xd7\x02\xdb\x02\xe3\xff\xd7\x02\xdb\x02\ +\xfd\xff\x9a\x02\xdb\x02\xfe\xff\xd7\x02\xdb\x03\x03\xff\xd7\x02\ +\xdb\x03\x0d\xffq\x02\xdb\x03\x0e\xff\xd7\x02\xdb\x03\x0f\xff\ +q\x02\xdb\x03\x10\xff\xd7\x02\xdb\x03\x17\xff\x9a\x02\xdb\x03\ +\x18\xff\xd7\x02\xdc\x00\x05\xff\xec\x02\xdc\x00\x0a\xff\xec\x02\ +\xdc\x02\x07\xff\xec\x02\xdc\x02\x0b\xff\xec\x02\xde\x00\x05\xff\ +\xec\x02\xde\x00\x0a\xff\xec\x02\xde\x02\x07\xff\xec\x02\xde\x02\ +\x0b\xff\xec\x02\xe0\x00\x05\xff\xec\x02\xe0\x00\x0a\xff\xec\x02\ +\xe0\x02\x07\xff\xec\x02\xe0\x02\x0b\xff\xec\x02\xe1\x00\x0f\xff\ +\xae\x02\xe1\x00\x11\xff\xae\x02\xe1\x01\x9d\xff\xec\x02\xe1\x01\ +\xa4\xff\xd7\x02\xe1\x01\xa6\xff\xec\x02\xe1\x01\xa8\xff\xd7\x02\ +\xe1\x01\xaa\xff\xd7\x02\xe1\x01\xae\xff\xd7\x02\xe1\x01\xb0\xff\ +\xd7\x02\xe1\x01\xb1\xff\xec\x02\xe1\x01\xb5\xff\xd7\x02\xe1\x01\ +\xbc\xff\xc3\x02\xe1\x01\xbd\xff\xd7\x02\xe1\x01\xbf\xff\xd7\x02\ +\xe1\x01\xc1\xff\xd7\x02\xe1\x01\xc4\xff\xec\x02\xe1\x01\xc7\xff\ +\xec\x02\xe1\x01\xce\xff\xec\x02\xe1\x01\xd5\xff\xec\x02\xe1\x01\ +\xf2\xff\xec\x02\xe1\x02\x08\xff\xae\x02\xe1\x02\x0c\xff\xae\x02\ +\xe1\x02r\xff\xd7\x02\xe1\x02s\xff\xec\x02\xe1\x02z\xff\ +\xec\x02\xe1\x02|\xff\xd7\x02\xe1\x02\x80\xff\xec\x02\xe1\x02\ +\x82\xff\xec\x02\xe1\x02\x9f\xff\xd7\x02\xe1\x02\xa1\xff\xec\x02\ +\xe1\x02\xa9\xff\xec\x02\xe1\x02\xb5\xff\xc3\x02\xe1\x02\xb7\xff\ +\xec\x02\xe1\x02\xb9\xff\xec\x02\xe1\x02\xbb\xff\xd7\x02\xe1\x02\ +\xbd\xff\xec\x02\xe1\x02\xbf\xff\xd7\x02\xe1\x02\xc1\xff\xd7\x02\ +\xe1\x02\xca\xff\xd7\x02\xe1\x02\xce\xff\xd7\x02\xe1\x02\xcf\xff\ +\xec\x02\xe1\x02\xd4\xff\xd7\x02\xe1\x02\xd9\xff\xd7\x02\xe1\x02\ +\xdb\xff\xd7\x02\xe1\x02\xdd\xff\xd7\x02\xe1\x02\xe5\xff\xd7\x02\ +\xe1\x02\xe7\xff\xec\x02\xe1\x02\xf5\xff\xec\x02\xe1\x02\xf7\xff\ +\xd7\x02\xe1\x02\xf9\xff\xd7\x02\xe1\x02\xfb\xff\xd7\x02\xe1\x02\ +\xfd\xff\xd7\x02\xe1\x03\x05\xff\xd7\x02\xe1\x03\x07\xff\xd7\x02\ +\xe1\x03\x0d\xff\xd7\x02\xe1\x03\x0f\xff\xd7\x02\xe1\x03\x11\xff\ +\xd7\x02\xe1\x03\x12\xff\xec\x02\xe1\x03\x17\xff\xec\x02\xe1\x03\ +\x1b\xff\xd7\x02\xe1\x03\x1c\xff\xec\x02\xe2\x00\x05\xff\xec\x02\ +\xe2\x00\x0a\xff\xec\x02\xe2\x01\xd0\xff\xd7\x02\xe2\x01\xdc\xff\ +\xec\x02\xe2\x01\xdd\xff\xec\x02\xe2\x01\xdf\xff\xd7\x02\xe2\x01\ +\xe1\xff\xec\x02\xe2\x01\xe4\xff\xec\x02\xe2\x01\xf6\xff\xec\x02\ +\xe2\x02\x07\xff\xec\x02\xe2\x02\x0b\xff\xec\x02\xe2\x02\xa0\xff\ +\xd7\x02\xe2\x02\xaa\xff\xec\x02\xe2\x02\xb6\xff\xec\x02\xe2\x02\ +\xbc\xff\xd7\x02\xe2\x02\xbe\xff\xec\x02\xe2\x02\xc0\xff\xec\x02\ +\xe2\x02\xc2\xff\xec\x02\xe2\x02\xcb\xff\xd7\x02\xe2\x02\xd5\xff\ +\xec\x02\xe2\x02\xe6\xff\xd7\x02\xe2\x02\xf8\xff\xec\x02\xe2\x02\ +\xfa\xff\xec\x02\xe2\x02\xfc\xff\xec\x02\xe2\x02\xfe\xff\xec\x02\ +\xe2\x03\x06\xff\xd7\x02\xe2\x03\x08\xff\xd7\x02\xe2\x03\x0e\xff\ +\xec\x02\xe2\x03\x10\xff\xec\x02\xe2\x03\x18\xff\xec\x02\xe3\x00\ +\x0f\xff\xae\x02\xe3\x00\x11\xff\xae\x02\xe3\x01\x9d\xff\xec\x02\ +\xe3\x01\xa4\xff\xd7\x02\xe3\x01\xa6\xff\xec\x02\xe3\x01\xa8\xff\ +\xd7\x02\xe3\x01\xaa\xff\xd7\x02\xe3\x01\xae\xff\xd7\x02\xe3\x01\ +\xb0\xff\xd7\x02\xe3\x01\xb1\xff\xec\x02\xe3\x01\xb5\xff\xd7\x02\ +\xe3\x01\xbc\xff\xc3\x02\xe3\x01\xbd\xff\xd7\x02\xe3\x01\xbf\xff\ +\xd7\x02\xe3\x01\xc1\xff\xd7\x02\xe3\x01\xc4\xff\xec\x02\xe3\x01\ +\xc7\xff\xec\x02\xe3\x01\xce\xff\xec\x02\xe3\x01\xd5\xff\xec\x02\ +\xe3\x01\xf2\xff\xec\x02\xe3\x02\x08\xff\xae\x02\xe3\x02\x0c\xff\ +\xae\x02\xe3\x02r\xff\xd7\x02\xe3\x02s\xff\xec\x02\xe3\x02\ +z\xff\xec\x02\xe3\x02|\xff\xd7\x02\xe3\x02\x80\xff\xec\x02\ +\xe3\x02\x82\xff\xec\x02\xe3\x02\x9f\xff\xd7\x02\xe3\x02\xa1\xff\ +\xec\x02\xe3\x02\xa9\xff\xec\x02\xe3\x02\xb5\xff\xc3\x02\xe3\x02\ +\xb7\xff\xec\x02\xe3\x02\xb9\xff\xec\x02\xe3\x02\xbb\xff\xd7\x02\ +\xe3\x02\xbd\xff\xec\x02\xe3\x02\xbf\xff\xd7\x02\xe3\x02\xc1\xff\ +\xd7\x02\xe3\x02\xca\xff\xd7\x02\xe3\x02\xce\xff\xd7\x02\xe3\x02\ +\xcf\xff\xec\x02\xe3\x02\xd4\xff\xd7\x02\xe3\x02\xd9\xff\xd7\x02\ +\xe3\x02\xdb\xff\xd7\x02\xe3\x02\xdd\xff\xd7\x02\xe3\x02\xe5\xff\ +\xd7\x02\xe3\x02\xe7\xff\xec\x02\xe3\x02\xf5\xff\xec\x02\xe3\x02\ +\xf7\xff\xd7\x02\xe3\x02\xf9\xff\xd7\x02\xe3\x02\xfb\xff\xd7\x02\ +\xe3\x02\xfd\xff\xd7\x02\xe3\x03\x05\xff\xd7\x02\xe3\x03\x07\xff\ +\xd7\x02\xe3\x03\x0d\xff\xd7\x02\xe3\x03\x0f\xff\xd7\x02\xe3\x03\ +\x11\xff\xd7\x02\xe3\x03\x12\xff\xec\x02\xe3\x03\x17\xff\xec\x02\ +\xe3\x03\x1b\xff\xd7\x02\xe3\x03\x1c\xff\xec\x02\xe4\x00\x05\xff\ +\xec\x02\xe4\x00\x0a\xff\xec\x02\xe4\x01\xd0\xff\xd7\x02\xe4\x01\ +\xdc\xff\xec\x02\xe4\x01\xdd\xff\xec\x02\xe4\x01\xdf\xff\xd7\x02\ +\xe4\x01\xe1\xff\xec\x02\xe4\x01\xe4\xff\xec\x02\xe4\x01\xf6\xff\ +\xec\x02\xe4\x02\x07\xff\xec\x02\xe4\x02\x0b\xff\xec\x02\xe4\x02\ +\xa0\xff\xd7\x02\xe4\x02\xaa\xff\xec\x02\xe4\x02\xb6\xff\xec\x02\ +\xe4\x02\xbc\xff\xd7\x02\xe4\x02\xbe\xff\xec\x02\xe4\x02\xc0\xff\ +\xec\x02\xe4\x02\xc2\xff\xec\x02\xe4\x02\xcb\xff\xd7\x02\xe4\x02\ +\xd5\xff\xec\x02\xe4\x02\xe6\xff\xd7\x02\xe4\x02\xf8\xff\xec\x02\ +\xe4\x02\xfa\xff\xec\x02\xe4\x02\xfc\xff\xec\x02\xe4\x02\xfe\xff\ +\xec\x02\xe4\x03\x06\xff\xd7\x02\xe4\x03\x08\xff\xd7\x02\xe4\x03\ +\x0e\xff\xec\x02\xe4\x03\x10\xff\xec\x02\xe4\x03\x18\xff\xec\x02\ +\xe5\x01\x9f\xff\xd7\x02\xe5\x01\xb8\xff\xd7\x02\xe5\x01\xbb\xff\ +\xd7\x02\xe5\x01\xbe\xff\xd7\x02\xe5\x01\xc1\xff\xd7\x02\xe5\x01\ +\xe1\xff\xd7\x02\xe5\x02l\xff\xd7\x02\xe5\x02|\xff\xd7\x02\ +\xe5\x02~\xff\xd7\x02\xe5\x02\x84\xff\xd7\x02\xe5\x02\x86\xff\ +\xd7\x02\xe5\x02\x88\xff\xd7\x02\xe5\x02\x8a\xff\xd7\x02\xe5\x02\ +\x8c\xff\xd7\x02\xe5\x02\xb1\xff\xd7\x02\xe5\x02\xb3\xff\xd7\x02\ +\xe5\x02\xbf\xff\xd7\x02\xe5\x02\xc0\xff\xd7\x02\xe5\x02\xc1\xff\ +\xd7\x02\xe5\x02\xc2\xff\xd7\x02\xe5\x02\xc5\xff\x9a\x02\xe5\x02\ +\xc7\xff\x9a\x02\xe5\x02\xd4\xff\xd7\x02\xe5\x02\xd5\xff\xd7\x02\ +\xe5\x02\xef\xff\xd7\x02\xe5\x02\xf1\xff\xd7\x02\xe5\x02\xf3\xff\ +\xd7\x02\xe5\x02\xfd\xff\xd7\x02\xe5\x02\xfe\xff\xd7\x02\xe5\x03\ +\x09\xff\xd7\x02\xe5\x03\x0b\xff\xd7\x02\xe5\x03\x0e\xff\xd7\x02\ +\xe5\x03\x10\xff\xd7\x02\xe5\x03\x15\xff\xd7\x02\xe5\x03\x19\xff\ +\xec\x02\xe6\x01\xcf\xff\xd7\x02\xe6\x01\xd8\xff\xd7\x02\xe6\x01\ +\xdb\xff\xd7\x02\xe6\x01\xde\xff\xd7\x02\xe6\x01\xe1\xff\xd7\x02\ +\xe6\x01\xea\xff\xd7\x02\xe6\x01\xed\xff\xd7\x02\xe6\x02j\xff\ +\xd7\x02\xe6\x02\x7f\xff\xd7\x02\xe6\x02\x85\xff\xd7\x02\xe6\x02\ +\x87\xff\xd7\x02\xe6\x02\x89\xff\xd7\x02\xe6\x02\x8d\xff\xd7\x02\ +\xe6\x02\xb2\xff\xd7\x02\xe6\x02\xb4\xff\xd7\x02\xe6\x02\xc0\xff\ +\xd7\x02\xe6\x02\xc2\xff\xd7\x02\xe6\x02\xc6\xff\xd7\x02\xe6\x02\ +\xc8\xff\xd7\x02\xe6\x02\xd5\xff\xd7\x02\xe6\x02\xe0\xff\xd7\x02\ +\xe6\x02\xf0\xff\xd7\x02\xe6\x02\xf2\xff\xd7\x02\xe6\x02\xf4\xff\ +\xd7\x02\xe6\x02\xfe\xff\xd7\x02\xe6\x03\x0a\xff\xd7\x02\xe6\x03\ +\x0c\xff\xd7\x02\xe6\x03\x16\xff\xd7\x02\xe6\x03\x1a\xff\xd7\x02\ +\xe7\x00\x0f\xff\xae\x02\xe7\x00\x11\xff\xae\x02\xe7\x02\x08\xff\ +\xae\x02\xe7\x02\x0c\xff\xae\x02\xe7\x02\x80\xff\xec\x02\xe7\x02\ +\x82\xff\xec\x02\xe7\x02\xb7\xff\xec\x02\xe7\x02\xb9\xff\xec\x02\ +\xe7\x03\x0d\xff\xd7\x02\xe7\x03\x0f\xff\xd7\x02\xe8\x01\xe9\x00\ +)\x02\xe9\x00\x05\xff\xec\x02\xe9\x00\x0a\xff\xec\x02\xe9\x02\ +\x07\xff\xec\x02\xe9\x02\x0b\xff\xec\x02\xe9\x03\x0e\xff\xd7\x02\ +\xe9\x03\x10\xff\xd7\x02\xef\x00\x0f\xff\xae\x02\xef\x00\x11\xff\ +\xae\x02\xef\x01\x9d\xff\xec\x02\xef\x01\xa4\xff\xd7\x02\xef\x01\ +\xa6\xff\xec\x02\xef\x01\xa8\xff\xd7\x02\xef\x01\xaa\xff\xd7\x02\ +\xef\x01\xae\xff\xd7\x02\xef\x01\xb0\xff\xd7\x02\xef\x01\xb1\xff\ +\xec\x02\xef\x01\xb5\xff\xd7\x02\xef\x01\xbc\xff\xc3\x02\xef\x01\ +\xbd\xff\xd7\x02\xef\x01\xbf\xff\xd7\x02\xef\x01\xc1\xff\xd7\x02\ +\xef\x01\xc4\xff\xec\x02\xef\x01\xc7\xff\xec\x02\xef\x01\xce\xff\ +\xec\x02\xef\x01\xd5\xff\xec\x02\xef\x01\xf2\xff\xec\x02\xef\x02\ +\x08\xff\xae\x02\xef\x02\x0c\xff\xae\x02\xef\x02r\xff\xd7\x02\ +\xef\x02s\xff\xec\x02\xef\x02z\xff\xec\x02\xef\x02|\xff\ +\xd7\x02\xef\x02\x80\xff\xec\x02\xef\x02\x82\xff\xec\x02\xef\x02\ +\x9f\xff\xd7\x02\xef\x02\xa1\xff\xec\x02\xef\x02\xa9\xff\xec\x02\ +\xef\x02\xb5\xff\xc3\x02\xef\x02\xb7\xff\xec\x02\xef\x02\xb9\xff\ +\xec\x02\xef\x02\xbb\xff\xd7\x02\xef\x02\xbd\xff\xec\x02\xef\x02\ +\xbf\xff\xd7\x02\xef\x02\xc1\xff\xd7\x02\xef\x02\xca\xff\xd7\x02\ +\xef\x02\xce\xff\xd7\x02\xef\x02\xcf\xff\xec\x02\xef\x02\xd4\xff\ +\xd7\x02\xef\x02\xd9\xff\xd7\x02\xef\x02\xdb\xff\xd7\x02\xef\x02\ +\xdd\xff\xd7\x02\xef\x02\xe5\xff\xd7\x02\xef\x02\xe7\xff\xec\x02\ +\xef\x02\xf5\xff\xec\x02\xef\x02\xf7\xff\xd7\x02\xef\x02\xf9\xff\ +\xd7\x02\xef\x02\xfb\xff\xd7\x02\xef\x02\xfd\xff\xd7\x02\xef\x03\ +\x05\xff\xd7\x02\xef\x03\x07\xff\xd7\x02\xef\x03\x0d\xff\xd7\x02\ +\xef\x03\x0f\xff\xd7\x02\xef\x03\x11\xff\xd7\x02\xef\x03\x12\xff\ +\xec\x02\xef\x03\x17\xff\xec\x02\xef\x03\x1b\xff\xd7\x02\xef\x03\ +\x1c\xff\xec\x02\xf0\x00\x05\xff\xec\x02\xf0\x00\x0a\xff\xec\x02\ +\xf0\x01\xd0\xff\xd7\x02\xf0\x01\xdc\xff\xec\x02\xf0\x01\xdd\xff\ +\xec\x02\xf0\x01\xdf\xff\xd7\x02\xf0\x01\xe1\xff\xec\x02\xf0\x01\ +\xe4\xff\xec\x02\xf0\x01\xf6\xff\xec\x02\xf0\x02\x07\xff\xec\x02\ +\xf0\x02\x0b\xff\xec\x02\xf0\x02\xa0\xff\xd7\x02\xf0\x02\xaa\xff\ +\xec\x02\xf0\x02\xb6\xff\xec\x02\xf0\x02\xbc\xff\xd7\x02\xf0\x02\ +\xbe\xff\xec\x02\xf0\x02\xc0\xff\xec\x02\xf0\x02\xc2\xff\xec\x02\ +\xf0\x02\xcb\xff\xd7\x02\xf0\x02\xd5\xff\xec\x02\xf0\x02\xe6\xff\ +\xd7\x02\xf0\x02\xf8\xff\xec\x02\xf0\x02\xfa\xff\xec\x02\xf0\x02\ +\xfc\xff\xec\x02\xf0\x02\xfe\xff\xec\x02\xf0\x03\x06\xff\xd7\x02\ +\xf0\x03\x08\xff\xd7\x02\xf0\x03\x0e\xff\xec\x02\xf0\x03\x10\xff\ +\xec\x02\xf0\x03\x18\xff\xec\x02\xf1\x00\x0f\xff\xae\x02\xf1\x00\ +\x11\xff\xae\x02\xf1\x01\x9d\xff\xec\x02\xf1\x01\xa4\xff\xd7\x02\ +\xf1\x01\xa6\xff\xec\x02\xf1\x01\xa8\xff\xd7\x02\xf1\x01\xaa\xff\ +\xd7\x02\xf1\x01\xae\xff\xd7\x02\xf1\x01\xb0\xff\xd7\x02\xf1\x01\ +\xb1\xff\xec\x02\xf1\x01\xb5\xff\xd7\x02\xf1\x01\xbc\xff\xc3\x02\ +\xf1\x01\xbd\xff\xd7\x02\xf1\x01\xbf\xff\xd7\x02\xf1\x01\xc1\xff\ +\xd7\x02\xf1\x01\xc4\xff\xec\x02\xf1\x01\xc7\xff\xec\x02\xf1\x01\ +\xce\xff\xec\x02\xf1\x01\xd5\xff\xec\x02\xf1\x01\xf2\xff\xec\x02\ +\xf1\x02\x08\xff\xae\x02\xf1\x02\x0c\xff\xae\x02\xf1\x02r\xff\ +\xd7\x02\xf1\x02s\xff\xec\x02\xf1\x02z\xff\xec\x02\xf1\x02\ +|\xff\xd7\x02\xf1\x02\x80\xff\xec\x02\xf1\x02\x82\xff\xec\x02\ +\xf1\x02\x9f\xff\xd7\x02\xf1\x02\xa1\xff\xec\x02\xf1\x02\xa9\xff\ +\xec\x02\xf1\x02\xb5\xff\xc3\x02\xf1\x02\xb7\xff\xec\x02\xf1\x02\ +\xb9\xff\xec\x02\xf1\x02\xbb\xff\xd7\x02\xf1\x02\xbd\xff\xec\x02\ +\xf1\x02\xbf\xff\xd7\x02\xf1\x02\xc1\xff\xd7\x02\xf1\x02\xca\xff\ +\xd7\x02\xf1\x02\xce\xff\xd7\x02\xf1\x02\xcf\xff\xec\x02\xf1\x02\ +\xd4\xff\xd7\x02\xf1\x02\xd9\xff\xd7\x02\xf1\x02\xdb\xff\xd7\x02\ +\xf1\x02\xdd\xff\xd7\x02\xf1\x02\xe5\xff\xd7\x02\xf1\x02\xe7\xff\ +\xec\x02\xf1\x02\xf5\xff\xec\x02\xf1\x02\xf7\xff\xd7\x02\xf1\x02\ +\xf9\xff\xd7\x02\xf1\x02\xfb\xff\xd7\x02\xf1\x02\xfd\xff\xd7\x02\ +\xf1\x03\x05\xff\xd7\x02\xf1\x03\x07\xff\xd7\x02\xf1\x03\x0d\xff\ +\xd7\x02\xf1\x03\x0f\xff\xd7\x02\xf1\x03\x11\xff\xd7\x02\xf1\x03\ +\x12\xff\xec\x02\xf1\x03\x17\xff\xec\x02\xf1\x03\x1b\xff\xd7\x02\ +\xf1\x03\x1c\xff\xec\x02\xf2\x00\x05\xff\xec\x02\xf2\x00\x0a\xff\ +\xec\x02\xf2\x01\xd0\xff\xd7\x02\xf2\x01\xdc\xff\xec\x02\xf2\x01\ +\xdd\xff\xec\x02\xf2\x01\xdf\xff\xd7\x02\xf2\x01\xe1\xff\xec\x02\ +\xf2\x01\xe4\xff\xec\x02\xf2\x01\xf6\xff\xec\x02\xf2\x02\x07\xff\ +\xec\x02\xf2\x02\x0b\xff\xec\x02\xf2\x02\xa0\xff\xd7\x02\xf2\x02\ +\xaa\xff\xec\x02\xf2\x02\xb6\xff\xec\x02\xf2\x02\xbc\xff\xd7\x02\ +\xf2\x02\xbe\xff\xec\x02\xf2\x02\xc0\xff\xec\x02\xf2\x02\xc2\xff\ +\xec\x02\xf2\x02\xcb\xff\xd7\x02\xf2\x02\xd5\xff\xec\x02\xf2\x02\ +\xe6\xff\xd7\x02\xf2\x02\xf8\xff\xec\x02\xf2\x02\xfa\xff\xec\x02\ +\xf2\x02\xfc\xff\xec\x02\xf2\x02\xfe\xff\xec\x02\xf2\x03\x06\xff\ +\xd7\x02\xf2\x03\x08\xff\xd7\x02\xf2\x03\x0e\xff\xec\x02\xf2\x03\ +\x10\xff\xec\x02\xf2\x03\x18\xff\xec\x02\xf3\x00\x0f\xff\xae\x02\ +\xf3\x00\x11\xff\xae\x02\xf3\x01\x9d\xff\xec\x02\xf3\x01\xa4\xff\ +\xd7\x02\xf3\x01\xa6\xff\xec\x02\xf3\x01\xa8\xff\xd7\x02\xf3\x01\ +\xaa\xff\xd7\x02\xf3\x01\xae\xff\xd7\x02\xf3\x01\xb0\xff\xd7\x02\ +\xf3\x01\xb1\xff\xec\x02\xf3\x01\xb5\xff\xd7\x02\xf3\x01\xbc\xff\ +\xc3\x02\xf3\x01\xbd\xff\xd7\x02\xf3\x01\xbf\xff\xd7\x02\xf3\x01\ +\xc1\xff\xd7\x02\xf3\x01\xc4\xff\xec\x02\xf3\x01\xc7\xff\xec\x02\ +\xf3\x01\xce\xff\xec\x02\xf3\x01\xd5\xff\xec\x02\xf3\x01\xf2\xff\ +\xec\x02\xf3\x02\x08\xff\xae\x02\xf3\x02\x0c\xff\xae\x02\xf3\x02\ +r\xff\xd7\x02\xf3\x02s\xff\xec\x02\xf3\x02z\xff\xec\x02\ +\xf3\x02|\xff\xd7\x02\xf3\x02\x80\xff\xec\x02\xf3\x02\x82\xff\ +\xec\x02\xf3\x02\x9f\xff\xd7\x02\xf3\x02\xa1\xff\xec\x02\xf3\x02\ +\xa9\xff\xec\x02\xf3\x02\xb5\xff\xc3\x02\xf3\x02\xb7\xff\xec\x02\ +\xf3\x02\xb9\xff\xec\x02\xf3\x02\xbb\xff\xd7\x02\xf3\x02\xbd\xff\ +\xec\x02\xf3\x02\xbf\xff\xd7\x02\xf3\x02\xc1\xff\xd7\x02\xf3\x02\ +\xca\xff\xd7\x02\xf3\x02\xce\xff\xd7\x02\xf3\x02\xcf\xff\xec\x02\ +\xf3\x02\xd4\xff\xd7\x02\xf3\x02\xd9\xff\xd7\x02\xf3\x02\xdb\xff\ +\xd7\x02\xf3\x02\xdd\xff\xd7\x02\xf3\x02\xe5\xff\xd7\x02\xf3\x02\ +\xe7\xff\xec\x02\xf3\x02\xf5\xff\xec\x02\xf3\x02\xf7\xff\xd7\x02\ +\xf3\x02\xf9\xff\xd7\x02\xf3\x02\xfb\xff\xd7\x02\xf3\x02\xfd\xff\ +\xd7\x02\xf3\x03\x05\xff\xd7\x02\xf3\x03\x07\xff\xd7\x02\xf3\x03\ +\x0d\xff\xd7\x02\xf3\x03\x0f\xff\xd7\x02\xf3\x03\x11\xff\xd7\x02\ +\xf3\x03\x12\xff\xec\x02\xf3\x03\x17\xff\xec\x02\xf3\x03\x1b\xff\ +\xd7\x02\xf3\x03\x1c\xff\xec\x02\xf4\x00\x05\xff\xec\x02\xf4\x00\ +\x0a\xff\xec\x02\xf4\x01\xd0\xff\xd7\x02\xf4\x01\xdc\xff\xec\x02\ +\xf4\x01\xdd\xff\xec\x02\xf4\x01\xdf\xff\xd7\x02\xf4\x01\xe1\xff\ +\xec\x02\xf4\x01\xe4\xff\xec\x02\xf4\x01\xf6\xff\xec\x02\xf4\x02\ +\x07\xff\xec\x02\xf4\x02\x0b\xff\xec\x02\xf4\x02\xa0\xff\xd7\x02\ +\xf4\x02\xaa\xff\xec\x02\xf4\x02\xb6\xff\xec\x02\xf4\x02\xbc\xff\ +\xd7\x02\xf4\x02\xbe\xff\xec\x02\xf4\x02\xc0\xff\xec\x02\xf4\x02\ +\xc2\xff\xec\x02\xf4\x02\xcb\xff\xd7\x02\xf4\x02\xd5\xff\xec\x02\ +\xf4\x02\xe6\xff\xd7\x02\xf4\x02\xf8\xff\xec\x02\xf4\x02\xfa\xff\ +\xec\x02\xf4\x02\xfc\xff\xec\x02\xf4\x02\xfe\xff\xec\x02\xf4\x03\ +\x06\xff\xd7\x02\xf4\x03\x08\xff\xd7\x02\xf4\x03\x0e\xff\xec\x02\ +\xf4\x03\x10\xff\xec\x02\xf4\x03\x18\xff\xec\x02\xf5\x00\x0f\xff\ +\xae\x02\xf5\x00\x11\xff\xae\x02\xf5\x01\x9d\xff\xec\x02\xf5\x01\ +\xa4\xff\xd7\x02\xf5\x01\xa6\xff\xec\x02\xf5\x01\xa8\xff\xd7\x02\ +\xf5\x01\xaa\xff\xd7\x02\xf5\x01\xae\xff\xd7\x02\xf5\x01\xb0\xff\ +\xd7\x02\xf5\x01\xb1\xff\xec\x02\xf5\x01\xb5\xff\xd7\x02\xf5\x01\ +\xbc\xff\xc3\x02\xf5\x01\xbd\xff\xd7\x02\xf5\x01\xbf\xff\xd7\x02\ +\xf5\x01\xc1\xff\xd7\x02\xf5\x01\xc4\xff\xec\x02\xf5\x01\xc7\xff\ +\xec\x02\xf5\x01\xce\xff\xec\x02\xf5\x01\xd5\xff\xec\x02\xf5\x01\ +\xf2\xff\xec\x02\xf5\x02\x08\xff\xae\x02\xf5\x02\x0c\xff\xae\x02\ +\xf5\x02r\xff\xd7\x02\xf5\x02s\xff\xec\x02\xf5\x02z\xff\ +\xec\x02\xf5\x02|\xff\xd7\x02\xf5\x02\x80\xff\xec\x02\xf5\x02\ +\x82\xff\xec\x02\xf5\x02\x9f\xff\xd7\x02\xf5\x02\xa1\xff\xec\x02\ +\xf5\x02\xa9\xff\xec\x02\xf5\x02\xb5\xff\xc3\x02\xf5\x02\xb7\xff\ +\xec\x02\xf5\x02\xb9\xff\xec\x02\xf5\x02\xbb\xff\xd7\x02\xf5\x02\ +\xbd\xff\xec\x02\xf5\x02\xbf\xff\xd7\x02\xf5\x02\xc1\xff\xd7\x02\ +\xf5\x02\xca\xff\xd7\x02\xf5\x02\xce\xff\xd7\x02\xf5\x02\xcf\xff\ +\xec\x02\xf5\x02\xd4\xff\xd7\x02\xf5\x02\xd9\xff\xd7\x02\xf5\x02\ +\xdb\xff\xd7\x02\xf5\x02\xdd\xff\xd7\x02\xf5\x02\xe5\xff\xd7\x02\ +\xf5\x02\xe7\xff\xec\x02\xf5\x02\xf5\xff\xec\x02\xf5\x02\xf7\xff\ +\xd7\x02\xf5\x02\xf9\xff\xd7\x02\xf5\x02\xfb\xff\xd7\x02\xf5\x02\ +\xfd\xff\xd7\x02\xf5\x03\x05\xff\xd7\x02\xf5\x03\x07\xff\xd7\x02\ +\xf5\x03\x0d\xff\xd7\x02\xf5\x03\x0f\xff\xd7\x02\xf5\x03\x11\xff\ +\xd7\x02\xf5\x03\x12\xff\xec\x02\xf5\x03\x17\xff\xec\x02\xf5\x03\ +\x1b\xff\xd7\x02\xf5\x03\x1c\xff\xec\x02\xf6\x00\x05\xff\xec\x02\ +\xf6\x00\x0a\xff\xec\x02\xf6\x01\xd0\xff\xd7\x02\xf6\x01\xdc\xff\ +\xec\x02\xf6\x01\xdd\xff\xec\x02\xf6\x01\xdf\xff\xd7\x02\xf6\x01\ +\xe1\xff\xec\x02\xf6\x01\xe4\xff\xec\x02\xf6\x01\xf6\xff\xec\x02\ +\xf6\x02\x07\xff\xec\x02\xf6\x02\x0b\xff\xec\x02\xf6\x02\xa0\xff\ +\xd7\x02\xf6\x02\xaa\xff\xec\x02\xf6\x02\xb6\xff\xec\x02\xf6\x02\ +\xbc\xff\xd7\x02\xf6\x02\xbe\xff\xec\x02\xf6\x02\xc0\xff\xec\x02\ +\xf6\x02\xc2\xff\xec\x02\xf6\x02\xcb\xff\xd7\x02\xf6\x02\xd5\xff\ +\xec\x02\xf6\x02\xe6\xff\xd7\x02\xf6\x02\xf8\xff\xec\x02\xf6\x02\ +\xfa\xff\xec\x02\xf6\x02\xfc\xff\xec\x02\xf6\x02\xfe\xff\xec\x02\ +\xf6\x03\x06\xff\xd7\x02\xf6\x03\x08\xff\xd7\x02\xf6\x03\x0e\xff\ +\xec\x02\xf6\x03\x10\xff\xec\x02\xf6\x03\x18\xff\xec\x02\xf7\x00\ +\x0f\xff\x85\x02\xf7\x00\x11\xff\x85\x02\xf7\x01\x9f\xff\xec\x02\ +\xf7\x01\xa4\xff\x9a\x02\xf7\x01\xaa\xffq\x02\xf7\x01\xae\xff\ +\x9a\x02\xf7\x01\xb5\xff\x9a\x02\xf7\x01\xb8\xff\xec\x02\xf7\x01\ +\xbb\xff\xec\x02\xf7\x01\xbe\xff\xc3\x02\xf7\x01\xc9\xff\xec\x02\ +\xf7\x01\xce\xff\xae\x02\xf7\x01\xcf\xff\xd7\x02\xf7\x01\xd5\xff\ +\xae\x02\xf7\x01\xd8\xff\xd7\x02\xf7\x01\xdb\xff\xd7\x02\xf7\x01\ +\xde\xff\xd7\x02\xf7\x01\xe1\xff\xd7\x02\xf7\x01\xea\xff\xd7\x02\ +\xf7\x01\xeb\x00f\x02\xf7\x01\xed\xff\xd7\x02\xf7\x01\xee\xff\ +\xec\x02\xf7\x01\xf2\xff\xae\x02\xf7\x01\xf4\x00f\x02\xf7\x02\ +\x08\xff\x85\x02\xf7\x02\x0c\xff\x85\x02\xf7\x02j\xff\xd7\x02\ +\xf7\x02l\xff\xec\x02\xf7\x02r\xffq\x02\xf7\x02s\xff\ +\xae\x02\xf7\x02~\xff\xec\x02\xf7\x02\x7f\xff\xd7\x02\xf7\x02\ +\x84\xff\xec\x02\xf7\x02\x85\xff\xd7\x02\xf7\x02\x86\xff\xec\x02\ +\xf7\x02\x87\xff\xd7\x02\xf7\x02\x88\xff\xec\x02\xf7\x02\x89\xff\ +\xd7\x02\xf7\x02\x8a\xff\xec\x02\xf7\x02\x8c\xff\xec\x02\xf7\x02\ +\x8d\xff\xd7\x02\xf7\x02\x98\x00f\x02\xf7\x02\xa8\x00f\x02\ +\xf7\x02\xb1\xff\xec\x02\xf7\x02\xb2\xff\xd7\x02\xf7\x02\xb3\xff\ +\xec\x02\xf7\x02\xb4\xff\xd7\x02\xf7\x02\xc0\xff\xd7\x02\xf7\x02\ +\xc2\xff\xd7\x02\xf7\x02\xc5\xff\xd7\x02\xf7\x02\xc6\xff\xc3\x02\ +\xf7\x02\xc7\xff\xd7\x02\xf7\x02\xc8\xff\xc3\x02\xf7\x02\xce\xff\ +\x9a\x02\xf7\x02\xcf\xff\xae\x02\xf7\x02\xd5\xff\xd7\x02\xf7\x02\ +\xd9\xffq\x02\xf7\x02\xdb\xffq\x02\xf7\x02\xdd\xffq\x02\ +\xf7\x02\xe0\xff\xd7\x02\xf7\x02\xef\xff\xec\x02\xf7\x02\xf0\xff\ +\xd7\x02\xf7\x02\xf1\xff\xec\x02\xf7\x02\xf2\xff\xd7\x02\xf7\x02\ +\xf3\xff\xec\x02\xf7\x02\xf4\xff\xd7\x02\xf7\x02\xfe\xff\xd7\x02\ +\xf7\x03\x09\xffq\x02\xf7\x03\x0a\xff\xd7\x02\xf7\x03\x0b\xff\ +q\x02\xf7\x03\x0c\xff\xd7\x02\xf7\x03\x11\xff\x9a\x02\xf7\x03\ +\x12\xff\xae\x02\xf7\x03\x15\xff\xec\x02\xf7\x03\x16\xff\xd7\x02\ +\xf7\x03\x1a\xff\xd7\x02\xf7\x03\x1b\xff\x9a\x02\xf7\x03\x1c\xff\ +\xae\x02\xf8\x00\x0f\xff\xae\x02\xf8\x00\x11\xff\xae\x02\xf8\x01\ +\xce\xff\xd7\x02\xf8\x01\xd5\xff\xd7\x02\xf8\x01\xf2\xff\xd7\x02\ +\xf8\x02\x08\xff\xae\x02\xf8\x02\x0c\xff\xae\x02\xf8\x02s\xff\ +\xd7\x02\xf8\x02\xcf\xff\xd7\x02\xf8\x03\x12\xff\xd7\x02\xf8\x03\ +\x1c\xff\xd7\x02\xf9\x00\x0f\xff\x85\x02\xf9\x00\x11\xff\x85\x02\ +\xf9\x01\x9f\xff\xec\x02\xf9\x01\xa4\xff\x9a\x02\xf9\x01\xaa\xff\ +q\x02\xf9\x01\xae\xff\x9a\x02\xf9\x01\xb5\xff\x9a\x02\xf9\x01\ +\xb8\xff\xec\x02\xf9\x01\xbb\xff\xec\x02\xf9\x01\xbe\xff\xc3\x02\ +\xf9\x01\xc9\xff\xec\x02\xf9\x01\xce\xff\xae\x02\xf9\x01\xcf\xff\ +\xd7\x02\xf9\x01\xd5\xff\xae\x02\xf9\x01\xd8\xff\xd7\x02\xf9\x01\ +\xdb\xff\xd7\x02\xf9\x01\xde\xff\xd7\x02\xf9\x01\xe1\xff\xd7\x02\ +\xf9\x01\xea\xff\xd7\x02\xf9\x01\xeb\x00f\x02\xf9\x01\xed\xff\ +\xd7\x02\xf9\x01\xee\xff\xec\x02\xf9\x01\xf2\xff\xae\x02\xf9\x01\ +\xf4\x00f\x02\xf9\x02\x08\xff\x85\x02\xf9\x02\x0c\xff\x85\x02\ +\xf9\x02j\xff\xd7\x02\xf9\x02l\xff\xec\x02\xf9\x02r\xff\ +q\x02\xf9\x02s\xff\xae\x02\xf9\x02~\xff\xec\x02\xf9\x02\ +\x7f\xff\xd7\x02\xf9\x02\x84\xff\xec\x02\xf9\x02\x85\xff\xd7\x02\ +\xf9\x02\x86\xff\xec\x02\xf9\x02\x87\xff\xd7\x02\xf9\x02\x88\xff\ +\xec\x02\xf9\x02\x89\xff\xd7\x02\xf9\x02\x8a\xff\xec\x02\xf9\x02\ +\x8c\xff\xec\x02\xf9\x02\x8d\xff\xd7\x02\xf9\x02\x98\x00f\x02\ +\xf9\x02\xa8\x00f\x02\xf9\x02\xb1\xff\xec\x02\xf9\x02\xb2\xff\ +\xd7\x02\xf9\x02\xb3\xff\xec\x02\xf9\x02\xb4\xff\xd7\x02\xf9\x02\ +\xc0\xff\xd7\x02\xf9\x02\xc2\xff\xd7\x02\xf9\x02\xc5\xff\xd7\x02\ +\xf9\x02\xc6\xff\xc3\x02\xf9\x02\xc7\xff\xd7\x02\xf9\x02\xc8\xff\ +\xc3\x02\xf9\x02\xce\xff\x9a\x02\xf9\x02\xcf\xff\xae\x02\xf9\x02\ +\xd5\xff\xd7\x02\xf9\x02\xd9\xffq\x02\xf9\x02\xdb\xffq\x02\ +\xf9\x02\xdd\xffq\x02\xf9\x02\xe0\xff\xd7\x02\xf9\x02\xef\xff\ +\xec\x02\xf9\x02\xf0\xff\xd7\x02\xf9\x02\xf1\xff\xec\x02\xf9\x02\ +\xf2\xff\xd7\x02\xf9\x02\xf3\xff\xec\x02\xf9\x02\xf4\xff\xd7\x02\ +\xf9\x02\xfe\xff\xd7\x02\xf9\x03\x09\xffq\x02\xf9\x03\x0a\xff\ +\xd7\x02\xf9\x03\x0b\xffq\x02\xf9\x03\x0c\xff\xd7\x02\xf9\x03\ +\x11\xff\x9a\x02\xf9\x03\x12\xff\xae\x02\xf9\x03\x15\xff\xec\x02\ +\xf9\x03\x16\xff\xd7\x02\xf9\x03\x1a\xff\xd7\x02\xf9\x03\x1b\xff\ +\x9a\x02\xf9\x03\x1c\xff\xae\x02\xfa\x00\x0f\xff\xae\x02\xfa\x00\ +\x11\xff\xae\x02\xfa\x01\xce\xff\xd7\x02\xfa\x01\xd5\xff\xd7\x02\ +\xfa\x01\xf2\xff\xd7\x02\xfa\x02\x08\xff\xae\x02\xfa\x02\x0c\xff\ +\xae\x02\xfa\x02s\xff\xd7\x02\xfa\x02\xcf\xff\xd7\x02\xfa\x03\ +\x12\xff\xd7\x02\xfa\x03\x1c\xff\xd7\x02\xfb\x00\x0f\xff\x85\x02\ +\xfb\x00\x11\xff\x85\x02\xfb\x01\x9f\xff\xec\x02\xfb\x01\xa4\xff\ +\x9a\x02\xfb\x01\xaa\xffq\x02\xfb\x01\xae\xff\x9a\x02\xfb\x01\ +\xb5\xff\x9a\x02\xfb\x01\xb8\xff\xec\x02\xfb\x01\xbb\xff\xec\x02\ +\xfb\x01\xbe\xff\xc3\x02\xfb\x01\xc9\xff\xec\x02\xfb\x01\xce\xff\ +\xae\x02\xfb\x01\xcf\xff\xd7\x02\xfb\x01\xd5\xff\xae\x02\xfb\x01\ +\xd8\xff\xd7\x02\xfb\x01\xdb\xff\xd7\x02\xfb\x01\xde\xff\xd7\x02\ +\xfb\x01\xe1\xff\xd7\x02\xfb\x01\xea\xff\xd7\x02\xfb\x01\xeb\x00\ +f\x02\xfb\x01\xed\xff\xd7\x02\xfb\x01\xee\xff\xec\x02\xfb\x01\ +\xf2\xff\xae\x02\xfb\x01\xf4\x00f\x02\xfb\x02\x08\xff\x85\x02\ +\xfb\x02\x0c\xff\x85\x02\xfb\x02j\xff\xd7\x02\xfb\x02l\xff\ +\xec\x02\xfb\x02r\xffq\x02\xfb\x02s\xff\xae\x02\xfb\x02\ +~\xff\xec\x02\xfb\x02\x7f\xff\xd7\x02\xfb\x02\x84\xff\xec\x02\ +\xfb\x02\x85\xff\xd7\x02\xfb\x02\x86\xff\xec\x02\xfb\x02\x87\xff\ +\xd7\x02\xfb\x02\x88\xff\xec\x02\xfb\x02\x89\xff\xd7\x02\xfb\x02\ +\x8a\xff\xec\x02\xfb\x02\x8c\xff\xec\x02\xfb\x02\x8d\xff\xd7\x02\ +\xfb\x02\x98\x00f\x02\xfb\x02\xa8\x00f\x02\xfb\x02\xb1\xff\ +\xec\x02\xfb\x02\xb2\xff\xd7\x02\xfb\x02\xb3\xff\xec\x02\xfb\x02\ +\xb4\xff\xd7\x02\xfb\x02\xc0\xff\xd7\x02\xfb\x02\xc2\xff\xd7\x02\ +\xfb\x02\xc5\xff\xd7\x02\xfb\x02\xc6\xff\xc3\x02\xfb\x02\xc7\xff\ +\xd7\x02\xfb\x02\xc8\xff\xc3\x02\xfb\x02\xce\xff\x9a\x02\xfb\x02\ +\xcf\xff\xae\x02\xfb\x02\xd5\xff\xd7\x02\xfb\x02\xd9\xffq\x02\ +\xfb\x02\xdb\xffq\x02\xfb\x02\xdd\xffq\x02\xfb\x02\xe0\xff\ +\xd7\x02\xfb\x02\xef\xff\xec\x02\xfb\x02\xf0\xff\xd7\x02\xfb\x02\ +\xf1\xff\xec\x02\xfb\x02\xf2\xff\xd7\x02\xfb\x02\xf3\xff\xec\x02\ +\xfb\x02\xf4\xff\xd7\x02\xfb\x02\xfe\xff\xd7\x02\xfb\x03\x09\xff\ +q\x02\xfb\x03\x0a\xff\xd7\x02\xfb\x03\x0b\xffq\x02\xfb\x03\ +\x0c\xff\xd7\x02\xfb\x03\x11\xff\x9a\x02\xfb\x03\x12\xff\xae\x02\ +\xfb\x03\x15\xff\xec\x02\xfb\x03\x16\xff\xd7\x02\xfb\x03\x1a\xff\ +\xd7\x02\xfb\x03\x1b\xff\x9a\x02\xfb\x03\x1c\xff\xae\x02\xfc\x00\ +\x0f\xff\xae\x02\xfc\x00\x11\xff\xae\x02\xfc\x01\xce\xff\xd7\x02\ +\xfc\x01\xd5\xff\xd7\x02\xfc\x01\xf2\xff\xd7\x02\xfc\x02\x08\xff\ +\xae\x02\xfc\x02\x0c\xff\xae\x02\xfc\x02s\xff\xd7\x02\xfc\x02\ +\xcf\xff\xd7\x02\xfc\x03\x12\xff\xd7\x02\xfc\x03\x1c\xff\xd7\x02\ +\xff\x00\x0f\xff\x85\x02\xff\x00\x10\xff\xae\x02\xff\x00\x11\xff\ +\x85\x02\xff\x01\x9f\xff\xd7\x02\xff\x01\xa4\xff\x9a\x02\xff\x01\ +\xaa\xffq\x02\xff\x01\xae\xff\x9a\x02\xff\x01\xb5\xff\x9a\x02\ +\xff\x01\xb8\xff\xd7\x02\xff\x01\xbb\xff\xd7\x02\xff\x01\xbc\x00\ +)\x02\xff\x01\xbe\xff\xae\x02\xff\x01\xcc\xff\x9a\x02\xff\x01\ +\xcd\xff\x9a\x02\xff\x01\xce\xff\x85\x02\xff\x01\xcf\xffq\x02\ +\xff\x01\xd0\xff\xd7\x02\xff\x01\xd1\xff\xd7\x02\xff\x01\xd2\xff\ +\x9a\x02\xff\x01\xd3\xff\x9a\x02\xff\x01\xd4\xff\x9a\x02\xff\x01\ +\xd5\xff\x85\x02\xff\x01\xd6\xff\x9a\x02\xff\x01\xd7\xff\x9a\x02\ +\xff\x01\xd8\xffq\x02\xff\x01\xd9\xff\x9a\x02\xff\x01\xda\xff\ +\x9a\x02\xff\x01\xdb\xffq\x02\xff\x01\xdc\xff\xae\x02\xff\x01\ +\xdd\xff\xae\x02\xff\x01\xde\xffq\x02\xff\x01\xdf\xff\xd7\x02\ +\xff\x01\xe0\xff\x9a\x02\xff\x01\xe1\xff\x9a\x02\xff\x01\xe2\xff\ +\x9a\x02\xff\x01\xe3\xff\x9a\x02\xff\x01\xe4\xff\xae\x02\xff\x01\ +\xe5\xff\x9a\x02\xff\x01\xe6\xff\x9a\x02\xff\x01\xe7\xff\xd7\x02\ +\xff\x01\xe8\xff\x9a\x02\xff\x01\xe9\xff\xc3\x02\xff\x01\xea\xff\ +q\x02\xff\x01\xec\xff\x9a\x02\xff\x01\xed\xffq\x02\xff\x01\ +\xee\xff\x85\x02\xff\x01\xf2\xff\x85\x02\xff\x01\xf3\xff\x9a\x02\ +\xff\x01\xf5\xff\x9a\x02\xff\x01\xf6\xff\xae\x02\xff\x01\xf7\xff\ +\x9a\x02\xff\x01\xf9\xff\x9a\x02\xff\x02\x02\xff\xae\x02\xff\x02\ +\x03\xff\xae\x02\xff\x02\x04\xff\xae\x02\xff\x02\x08\xff\x85\x02\ +\xff\x02\x0c\xff\x85\x02\xff\x02j\xffq\x02\xff\x02k\xff\ +\x9a\x02\xff\x02l\xff\xd7\x02\xff\x02m\xff\xd7\x02\xff\x02\ +q\xff\x9a\x02\xff\x02r\xffq\x02\xff\x02s\xff\x85\x02\ +\xff\x02u\xff\x9a\x02\xff\x02w\xff\x9a\x02\xff\x02y\xff\ +\x9a\x02\xff\x02}\xff\x9a\x02\xff\x02~\xff\xd7\x02\xff\x02\ +\x7f\xffq\x02\xff\x02\x81\xff\xd7\x02\xff\x02\x83\xff\xd7\x02\ +\xff\x02\x84\xff\xd7\x02\xff\x02\x85\xffq\x02\xff\x02\x86\xff\ +\xd7\x02\xff\x02\x87\xffq\x02\xff\x02\x88\xff\xd7\x02\xff\x02\ +\x89\xffq\x02\xff\x02\x8a\xff\xd7\x02\xff\x02\x8b\xff\xd7\x02\ +\xff\x02\x8c\xff\xd7\x02\xff\x02\x8d\xffq\x02\xff\x02\x96\xff\ +\x9a\x02\xff\x02\x9a\xff\x9a\x02\xff\x02\x9e\xff\x9a\x02\xff\x02\ +\xa0\xff\xd7\x02\xff\x02\xa2\xff\xd7\x02\xff\x02\xa4\xff\x9a\x02\ +\xff\x02\xa6\xff\x9a\x02\xff\x02\xaa\xff\xae\x02\xff\x02\xac\xff\ +\x9a\x02\xff\x02\xae\xff\x9a\x02\xff\x02\xb0\xff\x9a\x02\xff\x02\ +\xb1\xff\xd7\x02\xff\x02\xb2\xffq\x02\xff\x02\xb3\xff\xd7\x02\ +\xff\x02\xb4\xffq\x02\xff\x02\xb5\x00)\x02\xff\x02\xb6\xff\ +\xae\x02\xff\x02\xb8\xff\xae\x02\xff\x02\xba\xff\xae\x02\xff\x02\ +\xbc\xff\xd7\x02\xff\x02\xbe\xff\xae\x02\xff\x02\xc0\xff\x9a\x02\ +\xff\x02\xc2\xff\x9a\x02\xff\x02\xc4\xff\x9a\x02\xff\x02\xc5\xff\ +\x9a\x02\xff\x02\xc6\xffq\x02\xff\x02\xc7\xff\x9a\x02\xff\x02\ +\xc8\xffq\x02\xff\x02\xcb\xff\xd7\x02\xff\x02\xcd\xff\x9a\x02\ +\xff\x02\xce\xff\x9a\x02\xff\x02\xcf\xff\x85\x02\xff\x02\xd1\xff\ +\x9a\x02\xff\x02\xd3\xff\x9a\x02\xff\x02\xd5\xff\x9a\x02\xff\x02\ +\xd7\xff\x9a\x02\xff\x02\xd9\xffq\x02\xff\x02\xdb\xffq\x02\ +\xff\x02\xdd\xffq\x02\xff\x02\xe0\xffq\x02\xff\x02\xe6\xff\ +\xd7\x02\xff\x02\xe8\xff\xd7\x02\xff\x02\xea\xff\xc3\x02\xff\x02\ +\xec\xff\x9a\x02\xff\x02\xee\xff\x9a\x02\xff\x02\xef\xff\xd7\x02\ +\xff\x02\xf0\xffq\x02\xff\x02\xf1\xff\xd7\x02\xff\x02\xf2\xff\ +q\x02\xff\x02\xf3\xff\xd7\x02\xff\x02\xf4\xffq\x02\xff\x02\ +\xf6\xff\xd7\x02\xff\x02\xf8\xff\xae\x02\xff\x02\xfa\xff\xae\x02\ +\xff\x02\xfc\xff\xae\x02\xff\x02\xfe\xff\x9a\x02\xff\x03\x00\xff\ +\x9a\x02\xff\x03\x02\xff\x9a\x02\xff\x03\x06\xff\xd7\x02\xff\x03\ +\x08\xff\xd7\x02\xff\x03\x09\xffq\x02\xff\x03\x0a\xffq\x02\ +\xff\x03\x0b\xffq\x02\xff\x03\x0c\xffq\x02\xff\x03\x0e\xff\ +\x9a\x02\xff\x03\x10\xff\x9a\x02\xff\x03\x11\xff\x9a\x02\xff\x03\ +\x12\xff\x85\x02\xff\x03\x14\xff\x9a\x02\xff\x03\x15\xff\xd7\x02\ +\xff\x03\x16\xffq\x02\xff\x03\x18\xff\xae\x02\xff\x03\x1a\xff\ +q\x02\xff\x03\x1b\xff\x9a\x02\xff\x03\x1c\xff\x85\x03\x00\x00\ +\x0f\xff\x9a\x03\x00\x00\x10\xff\xd7\x03\x00\x00\x11\xff\x9a\x03\ +\x00\x01\xce\xff\xc3\x03\x00\x01\xcf\xff\xec\x03\x00\x01\xd5\xff\ +\xc3\x03\x00\x01\xd8\xff\xec\x03\x00\x01\xdb\xff\xec\x03\x00\x01\ +\xde\xff\xec\x03\x00\x01\xea\xff\xec\x03\x00\x01\xed\xff\xec\x03\ +\x00\x01\xf2\xff\xc3\x03\x00\x02\x02\xff\xd7\x03\x00\x02\x03\xff\ +\xd7\x03\x00\x02\x04\xff\xd7\x03\x00\x02\x08\xff\x9a\x03\x00\x02\ +\x0c\xff\x9a\x03\x00\x02j\xff\xec\x03\x00\x02s\xff\xc3\x03\ +\x00\x02\x7f\xff\xec\x03\x00\x02\x85\xff\xec\x03\x00\x02\x87\xff\ +\xec\x03\x00\x02\x89\xff\xec\x03\x00\x02\x8d\xff\xec\x03\x00\x02\ +\xb2\xff\xec\x03\x00\x02\xb4\xff\xec\x03\x00\x02\xcf\xff\xc3\x03\ +\x00\x02\xe0\xff\xec\x03\x00\x02\xf0\xff\xec\x03\x00\x02\xf2\xff\ +\xec\x03\x00\x02\xf4\xff\xec\x03\x00\x03\x0a\xff\xec\x03\x00\x03\ +\x0c\xff\xec\x03\x00\x03\x12\xff\xc3\x03\x00\x03\x16\xff\xec\x03\ +\x00\x03\x1a\xff\xec\x03\x00\x03\x1c\xff\xc3\x03\x03\x00\x0f\xff\ +\x9a\x03\x03\x00\x10\xff\xd7\x03\x03\x00\x11\xff\x9a\x03\x03\x01\ +\x9d\x00)\x03\x03\x01\x9f\xff\xd7\x03\x03\x01\xa4\xff\xae\x03\ +\x03\x01\xa6\x00)\x03\x03\x01\xaa\xff\x85\x03\x03\x01\xae\xff\ +\xae\x03\x03\x01\xb5\xff\xae\x03\x03\x01\xb8\xff\xd7\x03\x03\x01\ +\xbb\xff\xd7\x03\x03\x01\xbc\x00)\x03\x03\x01\xbe\xff\xc3\x03\ +\x03\x01\xc4\x00)\x03\x03\x01\xcc\xff\xc3\x03\x03\x01\xcd\xff\ +\xc3\x03\x03\x01\xce\xff\x9a\x03\x03\x01\xcf\xff\xae\x03\x03\x01\ +\xd0\xff\xd7\x03\x03\x01\xd1\xff\xd7\x03\x03\x01\xd2\xff\xc3\x03\ +\x03\x01\xd3\xff\xc3\x03\x03\x01\xd4\xff\xc3\x03\x03\x01\xd5\xff\ +\x9a\x03\x03\x01\xd6\xff\xc3\x03\x03\x01\xd7\xff\xc3\x03\x03\x01\ +\xd8\xff\xae\x03\x03\x01\xd9\xff\xc3\x03\x03\x01\xda\xff\xc3\x03\ +\x03\x01\xdb\xff\xae\x03\x03\x01\xde\xff\xae\x03\x03\x01\xdf\xff\ +\xd7\x03\x03\x01\xe0\xff\xc3\x03\x03\x01\xe1\xff\x9a\x03\x03\x01\ +\xe2\xff\xc3\x03\x03\x01\xe3\xff\xc3\x03\x03\x01\xe5\xff\xc3\x03\ +\x03\x01\xe6\xff\xc3\x03\x03\x01\xe7\xff\xd7\x03\x03\x01\xe8\xff\ +\xc3\x03\x03\x01\xea\xff\xae\x03\x03\x01\xeb\x00)\x03\x03\x01\ +\xec\xff\xc3\x03\x03\x01\xed\xff\xae\x03\x03\x01\xee\xff\xc3\x03\ +\x03\x01\xf2\xff\x9a\x03\x03\x01\xf3\xff\xc3\x03\x03\x01\xf4\x00\ +)\x03\x03\x01\xf5\xff\xc3\x03\x03\x01\xf7\xff\xc3\x03\x03\x01\ +\xf9\xff\xc3\x03\x03\x02\x02\xff\xd7\x03\x03\x02\x03\xff\xd7\x03\ +\x03\x02\x04\xff\xd7\x03\x03\x02\x08\xff\x9a\x03\x03\x02\x0c\xff\ +\x9a\x03\x03\x02j\xff\xae\x03\x03\x02k\xff\xc3\x03\x03\x02\ +l\xff\xd7\x03\x03\x02q\xff\xc3\x03\x03\x02r\xff\x85\x03\ +\x03\x02s\xff\x9a\x03\x03\x02u\xff\xc3\x03\x03\x02w\xff\ +\xd7\x03\x03\x02y\xff\xc3\x03\x03\x02}\xff\xc3\x03\x03\x02\ +~\xff\xd7\x03\x03\x02\x7f\xff\xae\x03\x03\x02\x84\xff\xd7\x03\ +\x03\x02\x85\xff\xae\x03\x03\x02\x86\xff\xd7\x03\x03\x02\x87\xff\ +\xae\x03\x03\x02\x88\xff\xd7\x03\x03\x02\x89\xff\xae\x03\x03\x02\ +\x8a\xff\xd7\x03\x03\x02\x8c\xff\xd7\x03\x03\x02\x8d\xff\xae\x03\ +\x03\x02\x96\xff\xc3\x03\x03\x02\x98\x00)\x03\x03\x02\x9a\xff\ +\xc3\x03\x03\x02\x9e\xff\xc3\x03\x03\x02\xa0\xff\xd7\x03\x03\x02\ +\xa2\xff\xd7\x03\x03\x02\xa4\xff\xc3\x03\x03\x02\xa6\xff\xc3\x03\ +\x03\x02\xa8\x00)\x03\x03\x02\xa9\x00)\x03\x03\x02\xac\xff\ +\xc3\x03\x03\x02\xae\xff\xc3\x03\x03\x02\xb0\xff\xc3\x03\x03\x02\ +\xb1\xff\xd7\x03\x03\x02\xb2\xff\xae\x03\x03\x02\xb3\xff\xd7\x03\ +\x03\x02\xb4\xff\xae\x03\x03\x02\xb5\x00)\x03\x03\x02\xbc\xff\ +\xd7\x03\x03\x02\xbd\x00)\x03\x03\x02\xc0\xff\x9a\x03\x03\x02\ +\xc2\xff\x9a\x03\x03\x02\xc4\xff\xc3\x03\x03\x02\xc5\xff\xd7\x03\ +\x03\x02\xc6\xff\xc3\x03\x03\x02\xc7\xff\xd7\x03\x03\x02\xc8\xff\ +\xc3\x03\x03\x02\xcb\xff\xd7\x03\x03\x02\xcd\xff\xc3\x03\x03\x02\ +\xce\xff\xae\x03\x03\x02\xcf\xff\x9a\x03\x03\x02\xd1\xff\xc3\x03\ +\x03\x02\xd3\xff\xc3\x03\x03\x02\xd5\xff\x9a\x03\x03\x02\xd7\xff\ +\xc3\x03\x03\x02\xd9\xff\x85\x03\x03\x02\xdb\xff\x85\x03\x03\x02\ +\xdd\xff\x85\x03\x03\x02\xe0\xff\xae\x03\x03\x02\xe6\xff\xd7\x03\ +\x03\x02\xe8\xff\xd7\x03\x03\x02\xec\xff\xc3\x03\x03\x02\xee\xff\ +\xc3\x03\x03\x02\xef\xff\xd7\x03\x03\x02\xf0\xff\xae\x03\x03\x02\ +\xf1\xff\xd7\x03\x03\x02\xf2\xff\xae\x03\x03\x02\xf3\xff\xd7\x03\ +\x03\x02\xf4\xff\xae\x03\x03\x02\xf6\xff\xd7\x03\x03\x02\xfe\xff\ +\x9a\x03\x03\x03\x00\xff\xc3\x03\x03\x03\x02\xff\xc3\x03\x03\x03\ +\x06\xff\xd7\x03\x03\x03\x08\xff\xd7\x03\x03\x03\x09\xff\x9a\x03\ +\x03\x03\x0a\xff\xae\x03\x03\x03\x0b\xff\x9a\x03\x03\x03\x0c\xff\ +\xae\x03\x03\x03\x0e\xff\xd7\x03\x03\x03\x10\xff\xd7\x03\x03\x03\ +\x11\xff\xae\x03\x03\x03\x12\xff\x9a\x03\x03\x03\x14\xff\xc3\x03\ +\x03\x03\x15\xff\xd7\x03\x03\x03\x16\xff\xae\x03\x03\x03\x17\x00\ +)\x03\x03\x03\x1a\xff\xae\x03\x03\x03\x1b\xff\xae\x03\x03\x03\ +\x1c\xff\x9a\x03\x04\x00\x0f\xff\xc3\x03\x04\x00\x11\xff\xc3\x03\ +\x04\x01\xce\xff\xc3\x03\x04\x01\xcf\xff\xd7\x03\x04\x01\xd5\xff\ +\xc3\x03\x04\x01\xd8\xff\xd7\x03\x04\x01\xdb\xff\xd7\x03\x04\x01\ +\xde\xff\xd7\x03\x04\x01\xea\xff\xd7\x03\x04\x01\xed\xff\xd7\x03\ +\x04\x01\xf2\xff\xc3\x03\x04\x02\x08\xff\xc3\x03\x04\x02\x0c\xff\ +\xc3\x03\x04\x02j\xff\xd7\x03\x04\x02s\xff\xc3\x03\x04\x02\ +\x7f\xff\xd7\x03\x04\x02\x85\xff\xd7\x03\x04\x02\x87\xff\xd7\x03\ +\x04\x02\x89\xff\xd7\x03\x04\x02\x8d\xff\xd7\x03\x04\x02\xb2\xff\ +\xd7\x03\x04\x02\xb4\xff\xd7\x03\x04\x02\xcf\xff\xc3\x03\x04\x02\ +\xe0\xff\xd7\x03\x04\x02\xf0\xff\xd7\x03\x04\x02\xf2\xff\xd7\x03\ +\x04\x02\xf4\xff\xd7\x03\x04\x03\x0a\xff\xd7\x03\x04\x03\x0c\xff\ +\xd7\x03\x04\x03\x12\xff\xc3\x03\x04\x03\x16\xff\xd7\x03\x04\x03\ +\x1a\xff\xd7\x03\x04\x03\x1c\xff\xc3\x03\x05\x01\x9f\xff\xd7\x03\ +\x05\x01\xa3\x00\xe1\x03\x05\x01\xb8\xff\xd7\x03\x05\x01\xbb\xff\ +\xd7\x03\x05\x01\xbe\xff\xc3\x03\x05\x01\xdc\xff\xd7\x03\x05\x01\ +\xe1\xff\xae\x03\x05\x01\xe4\xff\xd7\x03\x05\x02l\xff\xd7\x03\ +\x05\x02{\x00=\x03\x05\x02}\xff\xec\x03\x05\x02~\xff\ +\xd7\x03\x05\x02\x84\xff\xd7\x03\x05\x02\x86\xff\xd7\x03\x05\x02\ +\x88\xff\xd7\x03\x05\x02\x8a\xff\xd7\x03\x05\x02\x8c\xff\xd7\x03\ +\x05\x02\xaa\xff\xd7\x03\x05\x02\xb1\xff\xd7\x03\x05\x02\xb3\xff\ +\xd7\x03\x05\x02\xb6\xff\xd7\x03\x05\x02\xbe\xff\xd7\x03\x05\x02\ +\xc0\xff\xae\x03\x05\x02\xc2\xff\xae\x03\x05\x02\xc5\xff\xc3\x03\ +\x05\x02\xc6\xff\xd7\x03\x05\x02\xc7\xff\xc3\x03\x05\x02\xc8\xff\ +\xd7\x03\x05\x02\xd5\xff\xae\x03\x05\x02\xef\xff\xd7\x03\x05\x02\ +\xf1\xff\xd7\x03\x05\x02\xf3\xff\xd7\x03\x05\x02\xfe\xff\xae\x03\ +\x05\x03\x0e\xff\xd7\x03\x05\x03\x10\xff\xd7\x03\x05\x03\x15\xff\ +\xd7\x03\x05\x03\x18\xff\xd7\x03\x06\x01\xcf\xff\xec\x03\x06\x01\ +\xd8\xff\xec\x03\x06\x01\xdb\xff\xec\x03\x06\x01\xde\xff\xec\x03\ +\x06\x01\xe1\xff\xec\x03\x06\x01\xea\xff\xec\x03\x06\x01\xed\xff\ +\xec\x03\x06\x02j\xff\xec\x03\x06\x02\x7f\xff\xec\x03\x06\x02\ +\x85\xff\xec\x03\x06\x02\x87\xff\xec\x03\x06\x02\x89\xff\xec\x03\ +\x06\x02\x8d\xff\xec\x03\x06\x02\xb2\xff\xec\x03\x06\x02\xb4\xff\ +\xec\x03\x06\x02\xc0\xff\xec\x03\x06\x02\xc2\xff\xec\x03\x06\x02\ +\xd5\xff\xec\x03\x06\x02\xe0\xff\xec\x03\x06\x02\xf0\xff\xec\x03\ +\x06\x02\xf2\xff\xec\x03\x06\x02\xf4\xff\xec\x03\x06\x02\xfe\xff\ +\xec\x03\x06\x03\x0a\xff\xec\x03\x06\x03\x0c\xff\xec\x03\x06\x03\ +\x0e\xff\xd7\x03\x06\x03\x10\xff\xd7\x03\x06\x03\x16\xff\xec\x03\ +\x06\x03\x1a\xff\xec\x03\x07\x01\x9f\xff\xd7\x03\x07\x01\xb8\xff\ +\xd7\x03\x07\x01\xbb\xff\xd7\x03\x07\x01\xbe\xff\xd7\x03\x07\x01\ +\xc1\xff\xd7\x03\x07\x01\xe1\xff\xd7\x03\x07\x02l\xff\xd7\x03\ +\x07\x02|\xff\xd7\x03\x07\x02~\xff\xd7\x03\x07\x02\x84\xff\ +\xd7\x03\x07\x02\x86\xff\xd7\x03\x07\x02\x88\xff\xd7\x03\x07\x02\ +\x8a\xff\xd7\x03\x07\x02\x8c\xff\xd7\x03\x07\x02\xb1\xff\xd7\x03\ +\x07\x02\xb3\xff\xd7\x03\x07\x02\xbf\xff\xd7\x03\x07\x02\xc0\xff\ +\xd7\x03\x07\x02\xc1\xff\xd7\x03\x07\x02\xc2\xff\xd7\x03\x07\x02\ +\xc5\xff\x9a\x03\x07\x02\xc7\xff\x9a\x03\x07\x02\xd4\xff\xd7\x03\ +\x07\x02\xd5\xff\xd7\x03\x07\x02\xef\xff\xd7\x03\x07\x02\xf1\xff\ +\xd7\x03\x07\x02\xf3\xff\xd7\x03\x07\x02\xfd\xff\xd7\x03\x07\x02\ +\xfe\xff\xd7\x03\x07\x03\x09\xff\xd7\x03\x07\x03\x0b\xff\xd7\x03\ +\x07\x03\x0e\xff\xd7\x03\x07\x03\x10\xff\xd7\x03\x07\x03\x15\xff\ +\xd7\x03\x07\x03\x19\xff\xec\x03\x08\x01\xcf\xff\xec\x03\x08\x01\ +\xd8\xff\xec\x03\x08\x01\xdb\xff\xec\x03\x08\x01\xde\xff\xec\x03\ +\x08\x01\xe1\xff\xec\x03\x08\x01\xea\xff\xec\x03\x08\x01\xed\xff\ +\xec\x03\x08\x02j\xff\xec\x03\x08\x02\x7f\xff\xec\x03\x08\x02\ +\x85\xff\xec\x03\x08\x02\x87\xff\xec\x03\x08\x02\x89\xff\xec\x03\ +\x08\x02\x8d\xff\xec\x03\x08\x02\xb2\xff\xec\x03\x08\x02\xb4\xff\ +\xec\x03\x08\x02\xc0\xff\xec\x03\x08\x02\xc2\xff\xec\x03\x08\x02\ +\xd5\xff\xec\x03\x08\x02\xe0\xff\xec\x03\x08\x02\xf0\xff\xec\x03\ +\x08\x02\xf2\xff\xec\x03\x08\x02\xf4\xff\xec\x03\x08\x02\xfe\xff\ +\xec\x03\x08\x03\x0a\xff\xec\x03\x08\x03\x0c\xff\xec\x03\x08\x03\ +\x0e\xff\xd7\x03\x08\x03\x10\xff\xd7\x03\x08\x03\x16\xff\xec\x03\ +\x08\x03\x1a\xff\xec\x03\x0b\x00\x05\xff\x9a\x03\x0b\x00\x0a\xff\ +\x9a\x03\x0b\x01\x9d\xff\xae\x03\x0b\x01\xa6\xff\xae\x03\x0b\x01\ +\xa8\xff\xc3\x03\x0b\x01\xaa\xff\xc3\x03\x0b\x01\xb0\xff\xc3\x03\ +\x0b\x01\xbc\xffq\x03\x0b\x01\xbd\xff\xc3\x03\x0b\x01\xbf\xff\ +\xc3\x03\x0b\x01\xc1\xff\xc3\x03\x0b\x01\xc4\xff\xae\x03\x0b\x01\ +\xd0\xff\xd7\x03\x0b\x01\xdc\xff\xc3\x03\x0b\x01\xdf\xff\xd7\x03\ +\x0b\x01\xe1\xff\xd7\x03\x0b\x01\xe4\xff\xc3\x03\x0b\x02\x07\xff\ +\x9a\x03\x0b\x02\x0b\xff\x9a\x03\x0b\x02r\xff\xc3\x03\x0b\x02\ +v\xff\xd7\x03\x0b\x02|\xff\xc3\x03\x0b\x02\x80\xff\xc3\x03\ +\x0b\x02\x82\xff\xc3\x03\x0b\x02\x9f\xff\xc3\x03\x0b\x02\xa0\xff\ +\xd7\x03\x0b\x02\xa9\xff\xae\x03\x0b\x02\xaa\xff\xc3\x03\x0b\x02\ +\xb5\xffq\x03\x0b\x02\xb6\xff\xc3\x03\x0b\x02\xb7\xff\xc3\x03\ +\x0b\x02\xb9\xff\xc3\x03\x0b\x02\xbb\xff\xc3\x03\x0b\x02\xbc\xff\ +\xd7\x03\x0b\x02\xbd\xff\xae\x03\x0b\x02\xbe\xff\xc3\x03\x0b\x02\ +\xbf\xff\xc3\x03\x0b\x02\xc0\xff\xd7\x03\x0b\x02\xc1\xff\xc3\x03\ +\x0b\x02\xc2\xff\xd7\x03\x0b\x02\xca\xff\xc3\x03\x0b\x02\xcb\xff\ +\xd7\x03\x0b\x02\xd4\xff\xc3\x03\x0b\x02\xd5\xff\xd7\x03\x0b\x02\ +\xd9\xff\xc3\x03\x0b\x02\xdb\xff\xc3\x03\x0b\x02\xdd\xff\xc3\x03\ +\x0b\x02\xe5\xff\xc3\x03\x0b\x02\xe6\xff\xd7\x03\x0b\x02\xf7\xff\ +\xc3\x03\x0b\x02\xf9\xff\xc3\x03\x0b\x02\xfb\xff\xc3\x03\x0b\x02\ +\xfd\xff\xc3\x03\x0b\x02\xfe\xff\xd7\x03\x0b\x03\x05\xff\xc3\x03\ +\x0b\x03\x06\xff\xd7\x03\x0b\x03\x07\xff\xc3\x03\x0b\x03\x08\xff\ +\xd7\x03\x0b\x03\x0d\xff\xd7\x03\x0b\x03\x0e\xff\xd7\x03\x0b\x03\ +\x0f\xff\xd7\x03\x0b\x03\x10\xff\xd7\x03\x0b\x03\x17\xff\xae\x03\ +\x0b\x03\x18\xff\xc3\x03\x0c\x00\x05\xff\x9a\x03\x0c\x00\x0a\xff\ +\x9a\x03\x0c\x01\xd0\xff\xd7\x03\x0c\x01\xdc\xff\xc3\x03\x0c\x01\ +\xdd\xff\xd7\x03\x0c\x01\xdf\xff\xd7\x03\x0c\x01\xe1\xff\xd7\x03\ +\x0c\x01\xe4\xff\xc3\x03\x0c\x01\xf6\xff\xd7\x03\x0c\x02\x07\xff\ +\x9a\x03\x0c\x02\x0b\xff\x9a\x03\x0c\x02\xa0\xff\xd7\x03\x0c\x02\ +\xaa\xff\xc3\x03\x0c\x02\xb6\xff\xc3\x03\x0c\x02\xbc\xff\xd7\x03\ +\x0c\x02\xbe\xff\xc3\x03\x0c\x02\xc0\xff\xd7\x03\x0c\x02\xc2\xff\ +\xd7\x03\x0c\x02\xcb\xff\xd7\x03\x0c\x02\xd5\xff\xd7\x03\x0c\x02\ +\xe6\xff\xd7\x03\x0c\x02\xf8\xff\xd7\x03\x0c\x02\xfa\xff\xd7\x03\ +\x0c\x02\xfc\xff\xd7\x03\x0c\x02\xfe\xff\xd7\x03\x0c\x03\x06\xff\ +\xd7\x03\x0c\x03\x08\xff\xd7\x03\x0c\x03\x0e\xff\x9a\x03\x0c\x03\ +\x10\xff\x9a\x03\x0c\x03\x18\xff\xc3\x03\x0d\x00\x05\xff\x9a\x03\ +\x0d\x00\x0a\xff\x9a\x03\x0d\x01\x9d\xff\xae\x03\x0d\x01\xa6\xff\ +\xae\x03\x0d\x01\xa8\xff\xc3\x03\x0d\x01\xaa\xff\xc3\x03\x0d\x01\ +\xb0\xff\xc3\x03\x0d\x01\xbc\xffq\x03\x0d\x01\xbd\xff\xc3\x03\ +\x0d\x01\xbf\xff\xc3\x03\x0d\x01\xc1\xff\xc3\x03\x0d\x01\xc4\xff\ +\xae\x03\x0d\x01\xd0\xff\xd7\x03\x0d\x01\xdc\xff\xc3\x03\x0d\x01\ +\xdf\xff\xd7\x03\x0d\x01\xe1\xff\xd7\x03\x0d\x01\xe4\xff\xc3\x03\ +\x0d\x02\x07\xff\x9a\x03\x0d\x02\x0b\xff\x9a\x03\x0d\x02r\xff\ +\xc3\x03\x0d\x02v\xff\xd7\x03\x0d\x02|\xff\xc3\x03\x0d\x02\ +\x80\xff\xc3\x03\x0d\x02\x82\xff\xc3\x03\x0d\x02\x9f\xff\xc3\x03\ +\x0d\x02\xa0\xff\xd7\x03\x0d\x02\xa9\xff\xae\x03\x0d\x02\xaa\xff\ +\xc3\x03\x0d\x02\xb5\xffq\x03\x0d\x02\xb6\xff\xc3\x03\x0d\x02\ +\xb7\xff\xc3\x03\x0d\x02\xb9\xff\xc3\x03\x0d\x02\xbb\xff\xc3\x03\ +\x0d\x02\xbc\xff\xd7\x03\x0d\x02\xbd\xff\xae\x03\x0d\x02\xbe\xff\ +\xc3\x03\x0d\x02\xbf\xff\xc3\x03\x0d\x02\xc0\xff\xd7\x03\x0d\x02\ +\xc1\xff\xc3\x03\x0d\x02\xc2\xff\xd7\x03\x0d\x02\xca\xff\xc3\x03\ +\x0d\x02\xcb\xff\xd7\x03\x0d\x02\xd4\xff\xc3\x03\x0d\x02\xd5\xff\ +\xd7\x03\x0d\x02\xd9\xff\xc3\x03\x0d\x02\xdb\xff\xc3\x03\x0d\x02\ +\xdd\xff\xc3\x03\x0d\x02\xe5\xff\xc3\x03\x0d\x02\xe6\xff\xd7\x03\ +\x0d\x02\xf7\xff\xc3\x03\x0d\x02\xf9\xff\xc3\x03\x0d\x02\xfb\xff\ +\xc3\x03\x0d\x02\xfd\xff\xc3\x03\x0d\x02\xfe\xff\xd7\x03\x0d\x03\ +\x05\xff\xc3\x03\x0d\x03\x06\xff\xd7\x03\x0d\x03\x07\xff\xc3\x03\ +\x0d\x03\x08\xff\xd7\x03\x0d\x03\x0d\xff\xd7\x03\x0d\x03\x0e\xff\ +\xd7\x03\x0d\x03\x0f\xff\xd7\x03\x0d\x03\x10\xff\xd7\x03\x0d\x03\ +\x17\xff\xae\x03\x0d\x03\x18\xff\xc3\x03\x0e\x00\x05\xff\x9a\x03\ +\x0e\x00\x0a\xff\x9a\x03\x0e\x01\xd0\xff\xd7\x03\x0e\x01\xdc\xff\ +\xc3\x03\x0e\x01\xdd\xff\xd7\x03\x0e\x01\xdf\xff\xd7\x03\x0e\x01\ +\xe1\xff\xd7\x03\x0e\x01\xe4\xff\xc3\x03\x0e\x01\xf6\xff\xd7\x03\ +\x0e\x02\x07\xff\x9a\x03\x0e\x02\x0b\xff\x9a\x03\x0e\x02\xa0\xff\ +\xd7\x03\x0e\x02\xaa\xff\xc3\x03\x0e\x02\xb6\xff\xc3\x03\x0e\x02\ +\xbc\xff\xd7\x03\x0e\x02\xbe\xff\xc3\x03\x0e\x02\xc0\xff\xd7\x03\ +\x0e\x02\xc2\xff\xd7\x03\x0e\x02\xcb\xff\xd7\x03\x0e\x02\xd5\xff\ +\xd7\x03\x0e\x02\xe6\xff\xd7\x03\x0e\x02\xf8\xff\xd7\x03\x0e\x02\ +\xfa\xff\xd7\x03\x0e\x02\xfc\xff\xd7\x03\x0e\x02\xfe\xff\xd7\x03\ +\x0e\x03\x06\xff\xd7\x03\x0e\x03\x08\xff\xd7\x03\x0e\x03\x0e\xff\ +\x9a\x03\x0e\x03\x10\xff\x9a\x03\x0e\x03\x18\xff\xc3\x03\x0f\x01\ +\xa3\x00\xe1\x03\x0f\x02\xea\x00)\x03\x0f\x03\x0e\xff\xd7\x03\ +\x0f\x03\x10\xff\xd7\x03\x10\x00\x05\xff\xec\x03\x10\x00\x0a\xff\ +\xec\x03\x10\x02\x07\xff\xec\x03\x10\x02\x0b\xff\xec\x03\x11\x00\ +\x05\xff\x9a\x03\x11\x00\x0a\xff\x9a\x03\x11\x01\x9d\xff\xae\x03\ +\x11\x01\xa6\xff\xae\x03\x11\x01\xa8\xff\xc3\x03\x11\x01\xaa\xff\ +\xc3\x03\x11\x01\xb0\xff\xc3\x03\x11\x01\xbc\xffq\x03\x11\x01\ +\xbd\xff\xc3\x03\x11\x01\xbf\xff\xc3\x03\x11\x01\xc1\xff\xc3\x03\ +\x11\x01\xc4\xff\xae\x03\x11\x01\xd0\xff\xd7\x03\x11\x01\xdc\xff\ +\xc3\x03\x11\x01\xdf\xff\xd7\x03\x11\x01\xe1\xff\xd7\x03\x11\x01\ +\xe4\xff\xc3\x03\x11\x02\x07\xff\x9a\x03\x11\x02\x0b\xff\x9a\x03\ +\x11\x02r\xff\xc3\x03\x11\x02v\xff\xd7\x03\x11\x02|\xff\ +\xc3\x03\x11\x02\x80\xff\xc3\x03\x11\x02\x82\xff\xc3\x03\x11\x02\ +\x9f\xff\xc3\x03\x11\x02\xa0\xff\xd7\x03\x11\x02\xa9\xff\xae\x03\ +\x11\x02\xaa\xff\xc3\x03\x11\x02\xb5\xffq\x03\x11\x02\xb6\xff\ +\xc3\x03\x11\x02\xb7\xff\xc3\x03\x11\x02\xb9\xff\xc3\x03\x11\x02\ +\xbb\xff\xc3\x03\x11\x02\xbc\xff\xd7\x03\x11\x02\xbd\xff\xae\x03\ +\x11\x02\xbe\xff\xc3\x03\x11\x02\xbf\xff\xc3\x03\x11\x02\xc0\xff\ +\xd7\x03\x11\x02\xc1\xff\xc3\x03\x11\x02\xc2\xff\xd7\x03\x11\x02\ +\xca\xff\xc3\x03\x11\x02\xcb\xff\xd7\x03\x11\x02\xd4\xff\xc3\x03\ +\x11\x02\xd5\xff\xd7\x03\x11\x02\xd9\xff\xc3\x03\x11\x02\xdb\xff\ +\xc3\x03\x11\x02\xdd\xff\xc3\x03\x11\x02\xe5\xff\xc3\x03\x11\x02\ +\xe6\xff\xd7\x03\x11\x02\xf7\xff\xc3\x03\x11\x02\xf9\xff\xc3\x03\ +\x11\x02\xfb\xff\xc3\x03\x11\x02\xfd\xff\xc3\x03\x11\x02\xfe\xff\ +\xd7\x03\x11\x03\x05\xff\xc3\x03\x11\x03\x06\xff\xd7\x03\x11\x03\ +\x07\xff\xc3\x03\x11\x03\x08\xff\xd7\x03\x11\x03\x0d\xff\xd7\x03\ +\x11\x03\x0e\xff\xd7\x03\x11\x03\x0f\xff\xd7\x03\x11\x03\x10\xff\ +\xd7\x03\x11\x03\x17\xff\xae\x03\x11\x03\x18\xff\xc3\x03\x12\x00\ +\x05\xff\x9a\x03\x12\x00\x0a\xff\x9a\x03\x12\x01\xd0\xff\xd7\x03\ +\x12\x01\xdc\xff\xc3\x03\x12\x01\xdd\xff\xd7\x03\x12\x01\xdf\xff\ +\xd7\x03\x12\x01\xe1\xff\xd7\x03\x12\x01\xe4\xff\xc3\x03\x12\x01\ +\xf6\xff\xd7\x03\x12\x02\x07\xff\x9a\x03\x12\x02\x0b\xff\x9a\x03\ +\x12\x02\xa0\xff\xd7\x03\x12\x02\xaa\xff\xc3\x03\x12\x02\xb6\xff\ +\xc3\x03\x12\x02\xbc\xff\xd7\x03\x12\x02\xbe\xff\xc3\x03\x12\x02\ +\xc0\xff\xd7\x03\x12\x02\xc2\xff\xd7\x03\x12\x02\xcb\xff\xd7\x03\ +\x12\x02\xd5\xff\xd7\x03\x12\x02\xe6\xff\xd7\x03\x12\x02\xf8\xff\ +\xd7\x03\x12\x02\xfa\xff\xd7\x03\x12\x02\xfc\xff\xd7\x03\x12\x02\ +\xfe\xff\xd7\x03\x12\x03\x06\xff\xd7\x03\x12\x03\x08\xff\xd7\x03\ +\x12\x03\x0e\xff\x9a\x03\x12\x03\x10\xff\x9a\x03\x12\x03\x18\xff\ +\xc3\x03\x13\x00\x05\xff\x9a\x03\x13\x00\x0a\xff\x9a\x03\x13\x01\ +\x9d\xff\xae\x03\x13\x01\xa6\xff\xae\x03\x13\x01\xa8\xff\xc3\x03\ +\x13\x01\xaa\xff\xc3\x03\x13\x01\xb0\xff\xc3\x03\x13\x01\xbc\xff\ +q\x03\x13\x01\xbd\xff\xc3\x03\x13\x01\xbf\xff\xc3\x03\x13\x01\ +\xc1\xff\xc3\x03\x13\x01\xc4\xff\xae\x03\x13\x01\xd0\xff\xd7\x03\ +\x13\x01\xdc\xff\xc3\x03\x13\x01\xdf\xff\xd7\x03\x13\x01\xe1\xff\ +\xd7\x03\x13\x01\xe4\xff\xc3\x03\x13\x02\x07\xff\x9a\x03\x13\x02\ +\x0b\xff\x9a\x03\x13\x02r\xff\xc3\x03\x13\x02v\xff\xd7\x03\ +\x13\x02|\xff\xc3\x03\x13\x02\x80\xff\xc3\x03\x13\x02\x82\xff\ +\xc3\x03\x13\x02\x9f\xff\xc3\x03\x13\x02\xa0\xff\xd7\x03\x13\x02\ +\xa9\xff\xae\x03\x13\x02\xaa\xff\xc3\x03\x13\x02\xb5\xffq\x03\ +\x13\x02\xb6\xff\xc3\x03\x13\x02\xb7\xff\xc3\x03\x13\x02\xb9\xff\ +\xc3\x03\x13\x02\xbb\xff\xc3\x03\x13\x02\xbc\xff\xd7\x03\x13\x02\ +\xbd\xff\xae\x03\x13\x02\xbe\xff\xc3\x03\x13\x02\xbf\xff\xc3\x03\ +\x13\x02\xc0\xff\xd7\x03\x13\x02\xc1\xff\xc3\x03\x13\x02\xc2\xff\ +\xd7\x03\x13\x02\xca\xff\xc3\x03\x13\x02\xcb\xff\xd7\x03\x13\x02\ +\xd4\xff\xc3\x03\x13\x02\xd5\xff\xd7\x03\x13\x02\xd9\xff\xc3\x03\ +\x13\x02\xdb\xff\xc3\x03\x13\x02\xdd\xff\xc3\x03\x13\x02\xe5\xff\ +\xc3\x03\x13\x02\xe6\xff\xd7\x03\x13\x02\xf7\xff\xc3\x03\x13\x02\ +\xf9\xff\xc3\x03\x13\x02\xfb\xff\xc3\x03\x13\x02\xfd\xff\xc3\x03\ +\x13\x02\xfe\xff\xd7\x03\x13\x03\x05\xff\xc3\x03\x13\x03\x06\xff\ +\xd7\x03\x13\x03\x07\xff\xc3\x03\x13\x03\x08\xff\xd7\x03\x13\x03\ +\x0d\xff\xd7\x03\x13\x03\x0e\xff\xd7\x03\x13\x03\x0f\xff\xd7\x03\ +\x13\x03\x10\xff\xd7\x03\x13\x03\x17\xff\xae\x03\x13\x03\x18\xff\ +\xc3\x03\x14\x00\x05\xff\x9a\x03\x14\x00\x0a\xff\x9a\x03\x14\x01\ +\xd0\xff\xd7\x03\x14\x01\xdc\xff\xc3\x03\x14\x01\xdd\xff\xd7\x03\ +\x14\x01\xdf\xff\xd7\x03\x14\x01\xe1\xff\xd7\x03\x14\x01\xe4\xff\ +\xc3\x03\x14\x01\xf6\xff\xd7\x03\x14\x02\x07\xff\x9a\x03\x14\x02\ +\x0b\xff\x9a\x03\x14\x02\xa0\xff\xd7\x03\x14\x02\xaa\xff\xc3\x03\ +\x14\x02\xb6\xff\xc3\x03\x14\x02\xbc\xff\xd7\x03\x14\x02\xbe\xff\ +\xc3\x03\x14\x02\xc0\xff\xd7\x03\x14\x02\xc2\xff\xd7\x03\x14\x02\ +\xcb\xff\xd7\x03\x14\x02\xd5\xff\xd7\x03\x14\x02\xe6\xff\xd7\x03\ +\x14\x02\xf8\xff\xd7\x03\x14\x02\xfa\xff\xd7\x03\x14\x02\xfc\xff\ +\xd7\x03\x14\x02\xfe\xff\xd7\x03\x14\x03\x06\xff\xd7\x03\x14\x03\ +\x08\xff\xd7\x03\x14\x03\x0e\xff\x9a\x03\x14\x03\x10\xff\x9a\x03\ +\x14\x03\x18\xff\xc3\x03\x15\x00\x0f\xff\xae\x03\x15\x00\x11\xff\ +\xae\x03\x15\x01\xaa\xff\xec\x03\x15\x01\xb0\xff\xd7\x03\x15\x01\ +\xbc\xff\xd7\x03\x15\x01\xbf\xff\xd7\x03\x15\x02\x08\xff\xae\x03\ +\x15\x02\x0c\xff\xae\x03\x15\x02r\xff\xec\x03\x15\x02\x80\xff\ +\xec\x03\x15\x02\x82\xff\xec\x03\x15\x02\x9f\xff\xd7\x03\x15\x02\ +\xb5\xff\xd7\x03\x15\x02\xb7\xff\xec\x03\x15\x02\xb9\xff\xec\x03\ +\x15\x02\xbb\xff\xd7\x03\x15\x02\xca\xff\xd7\x03\x15\x02\xd9\xff\ +\xec\x03\x15\x02\xdb\xff\xec\x03\x15\x02\xdd\xff\xec\x03\x15\x02\ +\xe5\xff\xd7\x03\x15\x03\x05\xff\xd7\x03\x15\x03\x07\xff\xd7\x03\ +\x16\x00\x05\xff\xd7\x03\x16\x00\x0a\xff\xd7\x03\x16\x01\xd0\xff\ +\xec\x03\x16\x01\xdd\xff\xec\x03\x16\x01\xdf\xff\xec\x03\x16\x01\ +\xf6\xff\xec\x03\x16\x02\x07\xff\xd7\x03\x16\x02\x0b\xff\xd7\x03\ +\x16\x02\xa0\xff\xec\x03\x16\x02\xbc\xff\xec\x03\x16\x02\xcb\xff\ +\xec\x03\x16\x02\xe6\xff\xec\x03\x16\x02\xf8\xff\xec\x03\x16\x02\ +\xfa\xff\xec\x03\x16\x02\xfc\xff\xec\x03\x16\x03\x06\xff\xec\x03\ +\x16\x03\x08\xff\xec\x03\x16\x03\x0e\xff\xd7\x03\x16\x03\x10\xff\ +\xd7\x03\x17\x00\x05\xff\xae\x03\x17\x00\x0a\xff\xae\x03\x17\x01\ +\x9d\xff\xc3\x03\x17\x01\xa6\xff\xc3\x03\x17\x01\xaa\xff\xd7\x03\ +\x17\x01\xb0\xff\xd7\x03\x17\x01\xbc\xff\xc3\x03\x17\x01\xbf\xff\ +\xd7\x03\x17\x01\xc1\xff\xd7\x03\x17\x01\xc4\xff\xc3\x03\x17\x01\ +\xdc\xff\xd7\x03\x17\x01\xe4\xff\xd7\x03\x17\x02\x07\xff\xae\x03\ +\x17\x02\x0b\xff\xae\x03\x17\x02r\xff\xd7\x03\x17\x02|\xff\ +\xd7\x03\x17\x02\x80\xff\xd7\x03\x17\x02\x82\xff\xd7\x03\x17\x02\ +\x9f\xff\xd7\x03\x17\x02\xa9\xff\xc3\x03\x17\x02\xaa\xff\xd7\x03\ +\x17\x02\xb5\xff\xc3\x03\x17\x02\xb6\xff\xd7\x03\x17\x02\xb7\xff\ +\xd7\x03\x17\x02\xb9\xff\xd7\x03\x17\x02\xbb\xff\xd7\x03\x17\x02\ +\xbd\xff\xc3\x03\x17\x02\xbe\xff\xd7\x03\x17\x02\xbf\xff\xd7\x03\ +\x17\x02\xc1\xff\xd7\x03\x17\x02\xca\xff\xd7\x03\x17\x02\xd4\xff\ +\xd7\x03\x17\x02\xd9\xff\xd7\x03\x17\x02\xdb\xff\xd7\x03\x17\x02\ +\xdd\xff\xd7\x03\x17\x02\xe5\xff\xd7\x03\x17\x02\xfd\xff\xd7\x03\ +\x17\x03\x05\xff\xd7\x03\x17\x03\x07\xff\xd7\x03\x17\x03\x0d\xff\ +\xd7\x03\x17\x03\x0f\xff\xd7\x03\x17\x03\x17\xff\xc3\x03\x17\x03\ +\x18\xff\xd7\x03\x18\x00\x05\xff\x9a\x03\x18\x00\x0a\xff\x9a\x03\ +\x18\x01\xd0\xff\xd7\x03\x18\x01\xdc\xff\xc3\x03\x18\x01\xdd\xff\ +\xd7\x03\x18\x01\xdf\xff\xd7\x03\x18\x01\xe1\xff\xd7\x03\x18\x01\ +\xe4\xff\xc3\x03\x18\x01\xf6\xff\xd7\x03\x18\x02\x07\xff\x9a\x03\ +\x18\x02\x0b\xff\x9a\x03\x18\x02\xa0\xff\xd7\x03\x18\x02\xaa\xff\ +\xc3\x03\x18\x02\xb6\xff\xc3\x03\x18\x02\xbc\xff\xd7\x03\x18\x02\ +\xbe\xff\xc3\x03\x18\x02\xc0\xff\xd7\x03\x18\x02\xc2\xff\xd7\x03\ +\x18\x02\xcb\xff\xd7\x03\x18\x02\xd5\xff\xd7\x03\x18\x02\xe6\xff\ +\xd7\x03\x18\x02\xf8\xff\xd7\x03\x18\x02\xfa\xff\xd7\x03\x18\x02\ +\xfc\xff\xd7\x03\x18\x02\xfe\xff\xd7\x03\x18\x03\x06\xff\xd7\x03\ +\x18\x03\x08\xff\xd7\x03\x18\x03\x0e\xff\x9a\x03\x18\x03\x10\xff\ +\x9a\x03\x18\x03\x18\xff\xc3\x03\x19\x01\xe1\xff\xd7\x03\x19\x02\ +\xc0\xff\xd7\x03\x19\x02\xc2\xff\xd7\x03\x19\x02\xd5\xff\xd7\x03\ +\x19\x02\xfe\xff\xd7\x03\x1b\x01\xa3\x00\xe1\x03\x1b\x02\xea\x00\ +)\x03\x1b\x03\x0e\xff\xd7\x03\x1b\x03\x10\xff\xd7\x03\x1c\x00\ +\x05\xff\xec\x03\x1c\x00\x0a\xff\xec\x03\x1c\x02\x07\xff\xec\x03\ +\x1c\x02\x0b\xff\xec\x03\x1d\x00\x05\xffq\x03\x1d\x00\x0a\xff\ +q\x03\x1d\x00&\xff\xd7\x03\x1d\x00*\xff\xd7\x03\x1d\x00\ +-\x01\x0a\x03\x1d\x002\xff\xd7\x03\x1d\x004\xff\xd7\x03\ +\x1d\x007\xffq\x03\x1d\x009\xff\xae\x03\x1d\x00:\xff\ +\xae\x03\x1d\x00<\xff\x85\x03\x1d\x00\x89\xff\xd7\x03\x1d\x00\ +\x94\xff\xd7\x03\x1d\x00\x95\xff\xd7\x03\x1d\x00\x96\xff\xd7\x03\ +\x1d\x00\x97\xff\xd7\x03\x1d\x00\x98\xff\xd7\x03\x1d\x00\x9a\xff\ +\xd7\x03\x1d\x00\x9f\xff\x85\x03\x1d\x00\xc8\xff\xd7\x03\x1d\x00\ +\xca\xff\xd7\x03\x1d\x00\xcc\xff\xd7\x03\x1d\x00\xce\xff\xd7\x03\ +\x1d\x00\xde\xff\xd7\x03\x1d\x00\xe0\xff\xd7\x03\x1d\x00\xe2\xff\ +\xd7\x03\x1d\x00\xe4\xff\xd7\x03\x1d\x01\x0e\xff\xd7\x03\x1d\x01\ +\x10\xff\xd7\x03\x1d\x01\x12\xff\xd7\x03\x1d\x01\x14\xff\xd7\x03\ +\x1d\x01$\xffq\x03\x1d\x01&\xffq\x03\x1d\x016\xff\ +\xae\x03\x1d\x018\xff\x85\x03\x1d\x01:\xff\x85\x03\x1d\x01\ +G\xff\xd7\x03\x1d\x01\xfa\xff\xae\x03\x1d\x01\xfc\xff\xae\x03\ +\x1d\x01\xfe\xff\xae\x03\x1d\x02\x00\xff\x85\x03\x1d\x02\x07\xff\ +q\x03\x1d\x02\x0b\xffq\x03\x1d\x02_\xff\xd7\x03\x1d\x03\ +I\xff\xd7\x03\x1d\x03K\xff\xd7\x03\x1d\x03M\xff\xd7\x03\ +\x1d\x03O\xff\xd7\x03\x1d\x03Q\xff\xd7\x03\x1d\x03S\xff\ +\xd7\x03\x1d\x03U\xff\xd7\x03\x1d\x03W\xff\xd7\x03\x1d\x03\ +Y\xff\xd7\x03\x1d\x03[\xff\xd7\x03\x1d\x03]\xff\xd7\x03\ +\x1d\x03_\xff\xd7\x03\x1d\x03o\xff\x85\x03\x1d\x03q\xff\ +\x85\x03\x1d\x03s\xff\x85\x03\x1d\x03\x8f\xffq\x03\x1e\x00\ +\x05\xff\xec\x03\x1e\x00\x0a\xff\xec\x03\x1e\x02\x07\xff\xec\x03\ +\x1e\x02\x0b\xff\xec\x03\x1f\x00\x05\xffq\x03\x1f\x00\x0a\xff\ +q\x03\x1f\x00&\xff\xd7\x03\x1f\x00*\xff\xd7\x03\x1f\x00\ +-\x01\x0a\x03\x1f\x002\xff\xd7\x03\x1f\x004\xff\xd7\x03\ +\x1f\x007\xffq\x03\x1f\x009\xff\xae\x03\x1f\x00:\xff\ +\xae\x03\x1f\x00<\xff\x85\x03\x1f\x00\x89\xff\xd7\x03\x1f\x00\ +\x94\xff\xd7\x03\x1f\x00\x95\xff\xd7\x03\x1f\x00\x96\xff\xd7\x03\ +\x1f\x00\x97\xff\xd7\x03\x1f\x00\x98\xff\xd7\x03\x1f\x00\x9a\xff\ +\xd7\x03\x1f\x00\x9f\xff\x85\x03\x1f\x00\xc8\xff\xd7\x03\x1f\x00\ +\xca\xff\xd7\x03\x1f\x00\xcc\xff\xd7\x03\x1f\x00\xce\xff\xd7\x03\ +\x1f\x00\xde\xff\xd7\x03\x1f\x00\xe0\xff\xd7\x03\x1f\x00\xe2\xff\ +\xd7\x03\x1f\x00\xe4\xff\xd7\x03\x1f\x01\x0e\xff\xd7\x03\x1f\x01\ +\x10\xff\xd7\x03\x1f\x01\x12\xff\xd7\x03\x1f\x01\x14\xff\xd7\x03\ +\x1f\x01$\xffq\x03\x1f\x01&\xffq\x03\x1f\x016\xff\ +\xae\x03\x1f\x018\xff\x85\x03\x1f\x01:\xff\x85\x03\x1f\x01\ +G\xff\xd7\x03\x1f\x01\xfa\xff\xae\x03\x1f\x01\xfc\xff\xae\x03\ +\x1f\x01\xfe\xff\xae\x03\x1f\x02\x00\xff\x85\x03\x1f\x02\x07\xff\ +q\x03\x1f\x02\x0b\xffq\x03\x1f\x02_\xff\xd7\x03\x1f\x03\ +I\xff\xd7\x03\x1f\x03K\xff\xd7\x03\x1f\x03M\xff\xd7\x03\ +\x1f\x03O\xff\xd7\x03\x1f\x03Q\xff\xd7\x03\x1f\x03S\xff\ +\xd7\x03\x1f\x03U\xff\xd7\x03\x1f\x03W\xff\xd7\x03\x1f\x03\ +Y\xff\xd7\x03\x1f\x03[\xff\xd7\x03\x1f\x03]\xff\xd7\x03\ +\x1f\x03_\xff\xd7\x03\x1f\x03o\xff\x85\x03\x1f\x03q\xff\ +\x85\x03\x1f\x03s\xff\x85\x03\x1f\x03\x8f\xffq\x03 \x00\ +\x05\xff\xec\x03 \x00\x0a\xff\xec\x03 \x02\x07\xff\xec\x03\ + \x02\x0b\xff\xec\x03!\x00\x05\xffq\x03!\x00\x0a\xff\ +q\x03!\x00&\xff\xd7\x03!\x00*\xff\xd7\x03!\x00\ +-\x01\x0a\x03!\x002\xff\xd7\x03!\x004\xff\xd7\x03\ +!\x007\xffq\x03!\x009\xff\xae\x03!\x00:\xff\ +\xae\x03!\x00<\xff\x85\x03!\x00\x89\xff\xd7\x03!\x00\ +\x94\xff\xd7\x03!\x00\x95\xff\xd7\x03!\x00\x96\xff\xd7\x03\ +!\x00\x97\xff\xd7\x03!\x00\x98\xff\xd7\x03!\x00\x9a\xff\ +\xd7\x03!\x00\x9f\xff\x85\x03!\x00\xc8\xff\xd7\x03!\x00\ +\xca\xff\xd7\x03!\x00\xcc\xff\xd7\x03!\x00\xce\xff\xd7\x03\ +!\x00\xde\xff\xd7\x03!\x00\xe0\xff\xd7\x03!\x00\xe2\xff\ +\xd7\x03!\x00\xe4\xff\xd7\x03!\x01\x0e\xff\xd7\x03!\x01\ +\x10\xff\xd7\x03!\x01\x12\xff\xd7\x03!\x01\x14\xff\xd7\x03\ +!\x01$\xffq\x03!\x01&\xffq\x03!\x016\xff\ +\xae\x03!\x018\xff\x85\x03!\x01:\xff\x85\x03!\x01\ +G\xff\xd7\x03!\x01\xfa\xff\xae\x03!\x01\xfc\xff\xae\x03\ +!\x01\xfe\xff\xae\x03!\x02\x00\xff\x85\x03!\x02\x07\xff\ +q\x03!\x02\x0b\xffq\x03!\x02_\xff\xd7\x03!\x03\ +I\xff\xd7\x03!\x03K\xff\xd7\x03!\x03M\xff\xd7\x03\ +!\x03O\xff\xd7\x03!\x03Q\xff\xd7\x03!\x03S\xff\ +\xd7\x03!\x03U\xff\xd7\x03!\x03W\xff\xd7\x03!\x03\ +Y\xff\xd7\x03!\x03[\xff\xd7\x03!\x03]\xff\xd7\x03\ +!\x03_\xff\xd7\x03!\x03o\xff\x85\x03!\x03q\xff\ +\x85\x03!\x03s\xff\x85\x03!\x03\x8f\xffq\x03\x22\x00\ +\x05\xff\xec\x03\x22\x00\x0a\xff\xec\x03\x22\x02\x07\xff\xec\x03\ +\x22\x02\x0b\xff\xec\x03#\x00\x05\xffq\x03#\x00\x0a\xff\ +q\x03#\x00&\xff\xd7\x03#\x00*\xff\xd7\x03#\x00\ +-\x01\x0a\x03#\x002\xff\xd7\x03#\x004\xff\xd7\x03\ +#\x007\xffq\x03#\x009\xff\xae\x03#\x00:\xff\ +\xae\x03#\x00<\xff\x85\x03#\x00\x89\xff\xd7\x03#\x00\ +\x94\xff\xd7\x03#\x00\x95\xff\xd7\x03#\x00\x96\xff\xd7\x03\ +#\x00\x97\xff\xd7\x03#\x00\x98\xff\xd7\x03#\x00\x9a\xff\ +\xd7\x03#\x00\x9f\xff\x85\x03#\x00\xc8\xff\xd7\x03#\x00\ +\xca\xff\xd7\x03#\x00\xcc\xff\xd7\x03#\x00\xce\xff\xd7\x03\ +#\x00\xde\xff\xd7\x03#\x00\xe0\xff\xd7\x03#\x00\xe2\xff\ +\xd7\x03#\x00\xe4\xff\xd7\x03#\x01\x0e\xff\xd7\x03#\x01\ +\x10\xff\xd7\x03#\x01\x12\xff\xd7\x03#\x01\x14\xff\xd7\x03\ +#\x01$\xffq\x03#\x01&\xffq\x03#\x016\xff\ +\xae\x03#\x018\xff\x85\x03#\x01:\xff\x85\x03#\x01\ +G\xff\xd7\x03#\x01\xfa\xff\xae\x03#\x01\xfc\xff\xae\x03\ +#\x01\xfe\xff\xae\x03#\x02\x00\xff\x85\x03#\x02\x07\xff\ +q\x03#\x02\x0b\xffq\x03#\x02_\xff\xd7\x03#\x03\ +I\xff\xd7\x03#\x03K\xff\xd7\x03#\x03M\xff\xd7\x03\ +#\x03O\xff\xd7\x03#\x03Q\xff\xd7\x03#\x03S\xff\ +\xd7\x03#\x03U\xff\xd7\x03#\x03W\xff\xd7\x03#\x03\ +Y\xff\xd7\x03#\x03[\xff\xd7\x03#\x03]\xff\xd7\x03\ +#\x03_\xff\xd7\x03#\x03o\xff\x85\x03#\x03q\xff\ +\x85\x03#\x03s\xff\x85\x03#\x03\x8f\xffq\x03$\x00\ +\x05\xff\xec\x03$\x00\x0a\xff\xec\x03$\x02\x07\xff\xec\x03\ +$\x02\x0b\xff\xec\x03%\x00\x05\xffq\x03%\x00\x0a\xff\ +q\x03%\x00&\xff\xd7\x03%\x00*\xff\xd7\x03%\x00\ +-\x01\x0a\x03%\x002\xff\xd7\x03%\x004\xff\xd7\x03\ +%\x007\xffq\x03%\x009\xff\xae\x03%\x00:\xff\ +\xae\x03%\x00<\xff\x85\x03%\x00\x89\xff\xd7\x03%\x00\ +\x94\xff\xd7\x03%\x00\x95\xff\xd7\x03%\x00\x96\xff\xd7\x03\ +%\x00\x97\xff\xd7\x03%\x00\x98\xff\xd7\x03%\x00\x9a\xff\ +\xd7\x03%\x00\x9f\xff\x85\x03%\x00\xc8\xff\xd7\x03%\x00\ +\xca\xff\xd7\x03%\x00\xcc\xff\xd7\x03%\x00\xce\xff\xd7\x03\ +%\x00\xde\xff\xd7\x03%\x00\xe0\xff\xd7\x03%\x00\xe2\xff\ +\xd7\x03%\x00\xe4\xff\xd7\x03%\x01\x0e\xff\xd7\x03%\x01\ +\x10\xff\xd7\x03%\x01\x12\xff\xd7\x03%\x01\x14\xff\xd7\x03\ +%\x01$\xffq\x03%\x01&\xffq\x03%\x016\xff\ +\xae\x03%\x018\xff\x85\x03%\x01:\xff\x85\x03%\x01\ +G\xff\xd7\x03%\x01\xfa\xff\xae\x03%\x01\xfc\xff\xae\x03\ +%\x01\xfe\xff\xae\x03%\x02\x00\xff\x85\x03%\x02\x07\xff\ +q\x03%\x02\x0b\xffq\x03%\x02_\xff\xd7\x03%\x03\ +I\xff\xd7\x03%\x03K\xff\xd7\x03%\x03M\xff\xd7\x03\ +%\x03O\xff\xd7\x03%\x03Q\xff\xd7\x03%\x03S\xff\ +\xd7\x03%\x03U\xff\xd7\x03%\x03W\xff\xd7\x03%\x03\ +Y\xff\xd7\x03%\x03[\xff\xd7\x03%\x03]\xff\xd7\x03\ +%\x03_\xff\xd7\x03%\x03o\xff\x85\x03%\x03q\xff\ +\x85\x03%\x03s\xff\x85\x03%\x03\x8f\xffq\x03&\x00\ +\x05\xff\xec\x03&\x00\x0a\xff\xec\x03&\x02\x07\xff\xec\x03\ +&\x02\x0b\xff\xec\x03'\x00\x05\xffq\x03'\x00\x0a\xff\ +q\x03'\x00&\xff\xd7\x03'\x00*\xff\xd7\x03'\x00\ +-\x01\x0a\x03'\x002\xff\xd7\x03'\x004\xff\xd7\x03\ +'\x007\xffq\x03'\x009\xff\xae\x03'\x00:\xff\ +\xae\x03'\x00<\xff\x85\x03'\x00\x89\xff\xd7\x03'\x00\ +\x94\xff\xd7\x03'\x00\x95\xff\xd7\x03'\x00\x96\xff\xd7\x03\ +'\x00\x97\xff\xd7\x03'\x00\x98\xff\xd7\x03'\x00\x9a\xff\ +\xd7\x03'\x00\x9f\xff\x85\x03'\x00\xc8\xff\xd7\x03'\x00\ +\xca\xff\xd7\x03'\x00\xcc\xff\xd7\x03'\x00\xce\xff\xd7\x03\ +'\x00\xde\xff\xd7\x03'\x00\xe0\xff\xd7\x03'\x00\xe2\xff\ +\xd7\x03'\x00\xe4\xff\xd7\x03'\x01\x0e\xff\xd7\x03'\x01\ +\x10\xff\xd7\x03'\x01\x12\xff\xd7\x03'\x01\x14\xff\xd7\x03\ +'\x01$\xffq\x03'\x01&\xffq\x03'\x016\xff\ +\xae\x03'\x018\xff\x85\x03'\x01:\xff\x85\x03'\x01\ +G\xff\xd7\x03'\x01\xfa\xff\xae\x03'\x01\xfc\xff\xae\x03\ +'\x01\xfe\xff\xae\x03'\x02\x00\xff\x85\x03'\x02\x07\xff\ +q\x03'\x02\x0b\xffq\x03'\x02_\xff\xd7\x03'\x03\ +I\xff\xd7\x03'\x03K\xff\xd7\x03'\x03M\xff\xd7\x03\ +'\x03O\xff\xd7\x03'\x03Q\xff\xd7\x03'\x03S\xff\ +\xd7\x03'\x03U\xff\xd7\x03'\x03W\xff\xd7\x03'\x03\ +Y\xff\xd7\x03'\x03[\xff\xd7\x03'\x03]\xff\xd7\x03\ +'\x03_\xff\xd7\x03'\x03o\xff\x85\x03'\x03q\xff\ +\x85\x03'\x03s\xff\x85\x03'\x03\x8f\xffq\x03(\x00\ +\x05\xff\xec\x03(\x00\x0a\xff\xec\x03(\x02\x07\xff\xec\x03\ +(\x02\x0b\xff\xec\x03)\x00\x05\xffq\x03)\x00\x0a\xff\ +q\x03)\x00&\xff\xd7\x03)\x00*\xff\xd7\x03)\x00\ +-\x01\x0a\x03)\x002\xff\xd7\x03)\x004\xff\xd7\x03\ +)\x007\xffq\x03)\x009\xff\xae\x03)\x00:\xff\ +\xae\x03)\x00<\xff\x85\x03)\x00\x89\xff\xd7\x03)\x00\ +\x94\xff\xd7\x03)\x00\x95\xff\xd7\x03)\x00\x96\xff\xd7\x03\ +)\x00\x97\xff\xd7\x03)\x00\x98\xff\xd7\x03)\x00\x9a\xff\ +\xd7\x03)\x00\x9f\xff\x85\x03)\x00\xc8\xff\xd7\x03)\x00\ +\xca\xff\xd7\x03)\x00\xcc\xff\xd7\x03)\x00\xce\xff\xd7\x03\ +)\x00\xde\xff\xd7\x03)\x00\xe0\xff\xd7\x03)\x00\xe2\xff\ +\xd7\x03)\x00\xe4\xff\xd7\x03)\x01\x0e\xff\xd7\x03)\x01\ +\x10\xff\xd7\x03)\x01\x12\xff\xd7\x03)\x01\x14\xff\xd7\x03\ +)\x01$\xffq\x03)\x01&\xffq\x03)\x016\xff\ +\xae\x03)\x018\xff\x85\x03)\x01:\xff\x85\x03)\x01\ +G\xff\xd7\x03)\x01\xfa\xff\xae\x03)\x01\xfc\xff\xae\x03\ +)\x01\xfe\xff\xae\x03)\x02\x00\xff\x85\x03)\x02\x07\xff\ +q\x03)\x02\x0b\xffq\x03)\x02_\xff\xd7\x03)\x03\ +I\xff\xd7\x03)\x03K\xff\xd7\x03)\x03M\xff\xd7\x03\ +)\x03O\xff\xd7\x03)\x03Q\xff\xd7\x03)\x03S\xff\ +\xd7\x03)\x03U\xff\xd7\x03)\x03W\xff\xd7\x03)\x03\ +Y\xff\xd7\x03)\x03[\xff\xd7\x03)\x03]\xff\xd7\x03\ +)\x03_\xff\xd7\x03)\x03o\xff\x85\x03)\x03q\xff\ +\x85\x03)\x03s\xff\x85\x03)\x03\x8f\xffq\x03*\x00\ +\x05\xff\xec\x03*\x00\x0a\xff\xec\x03*\x02\x07\xff\xec\x03\ +*\x02\x0b\xff\xec\x03+\x00\x05\xffq\x03+\x00\x0a\xff\ +q\x03+\x00&\xff\xd7\x03+\x00*\xff\xd7\x03+\x00\ +-\x01\x0a\x03+\x002\xff\xd7\x03+\x004\xff\xd7\x03\ ++\x007\xffq\x03+\x009\xff\xae\x03+\x00:\xff\ +\xae\x03+\x00<\xff\x85\x03+\x00\x89\xff\xd7\x03+\x00\ +\x94\xff\xd7\x03+\x00\x95\xff\xd7\x03+\x00\x96\xff\xd7\x03\ ++\x00\x97\xff\xd7\x03+\x00\x98\xff\xd7\x03+\x00\x9a\xff\ +\xd7\x03+\x00\x9f\xff\x85\x03+\x00\xc8\xff\xd7\x03+\x00\ +\xca\xff\xd7\x03+\x00\xcc\xff\xd7\x03+\x00\xce\xff\xd7\x03\ ++\x00\xde\xff\xd7\x03+\x00\xe0\xff\xd7\x03+\x00\xe2\xff\ +\xd7\x03+\x00\xe4\xff\xd7\x03+\x01\x0e\xff\xd7\x03+\x01\ +\x10\xff\xd7\x03+\x01\x12\xff\xd7\x03+\x01\x14\xff\xd7\x03\ ++\x01$\xffq\x03+\x01&\xffq\x03+\x016\xff\ +\xae\x03+\x018\xff\x85\x03+\x01:\xff\x85\x03+\x01\ +G\xff\xd7\x03+\x01\xfa\xff\xae\x03+\x01\xfc\xff\xae\x03\ ++\x01\xfe\xff\xae\x03+\x02\x00\xff\x85\x03+\x02\x07\xff\ +q\x03+\x02\x0b\xffq\x03+\x02_\xff\xd7\x03+\x03\ +I\xff\xd7\x03+\x03K\xff\xd7\x03+\x03M\xff\xd7\x03\ ++\x03O\xff\xd7\x03+\x03Q\xff\xd7\x03+\x03S\xff\ +\xd7\x03+\x03U\xff\xd7\x03+\x03W\xff\xd7\x03+\x03\ +Y\xff\xd7\x03+\x03[\xff\xd7\x03+\x03]\xff\xd7\x03\ ++\x03_\xff\xd7\x03+\x03o\xff\x85\x03+\x03q\xff\ +\x85\x03+\x03s\xff\x85\x03+\x03\x8f\xffq\x03,\x00\ +\x05\xff\xec\x03,\x00\x0a\xff\xec\x03,\x02\x07\xff\xec\x03\ +,\x02\x0b\xff\xec\x03-\x00\x05\xffq\x03-\x00\x0a\xff\ +q\x03-\x00&\xff\xd7\x03-\x00*\xff\xd7\x03-\x00\ +-\x01\x0a\x03-\x002\xff\xd7\x03-\x004\xff\xd7\x03\ +-\x007\xffq\x03-\x009\xff\xae\x03-\x00:\xff\ +\xae\x03-\x00<\xff\x85\x03-\x00\x89\xff\xd7\x03-\x00\ +\x94\xff\xd7\x03-\x00\x95\xff\xd7\x03-\x00\x96\xff\xd7\x03\ +-\x00\x97\xff\xd7\x03-\x00\x98\xff\xd7\x03-\x00\x9a\xff\ +\xd7\x03-\x00\x9f\xff\x85\x03-\x00\xc8\xff\xd7\x03-\x00\ +\xca\xff\xd7\x03-\x00\xcc\xff\xd7\x03-\x00\xce\xff\xd7\x03\ +-\x00\xde\xff\xd7\x03-\x00\xe0\xff\xd7\x03-\x00\xe2\xff\ +\xd7\x03-\x00\xe4\xff\xd7\x03-\x01\x0e\xff\xd7\x03-\x01\ +\x10\xff\xd7\x03-\x01\x12\xff\xd7\x03-\x01\x14\xff\xd7\x03\ +-\x01$\xffq\x03-\x01&\xffq\x03-\x016\xff\ +\xae\x03-\x018\xff\x85\x03-\x01:\xff\x85\x03-\x01\ +G\xff\xd7\x03-\x01\xfa\xff\xae\x03-\x01\xfc\xff\xae\x03\ +-\x01\xfe\xff\xae\x03-\x02\x00\xff\x85\x03-\x02\x07\xff\ +q\x03-\x02\x0b\xffq\x03-\x02_\xff\xd7\x03-\x03\ +I\xff\xd7\x03-\x03K\xff\xd7\x03-\x03M\xff\xd7\x03\ +-\x03O\xff\xd7\x03-\x03Q\xff\xd7\x03-\x03S\xff\ +\xd7\x03-\x03U\xff\xd7\x03-\x03W\xff\xd7\x03-\x03\ +Y\xff\xd7\x03-\x03[\xff\xd7\x03-\x03]\xff\xd7\x03\ +-\x03_\xff\xd7\x03-\x03o\xff\x85\x03-\x03q\xff\ +\x85\x03-\x03s\xff\x85\x03-\x03\x8f\xffq\x03.\x00\ +\x05\xff\xec\x03.\x00\x0a\xff\xec\x03.\x02\x07\xff\xec\x03\ +.\x02\x0b\xff\xec\x03/\x00\x05\xffq\x03/\x00\x0a\xff\ +q\x03/\x00&\xff\xd7\x03/\x00*\xff\xd7\x03/\x00\ +-\x01\x0a\x03/\x002\xff\xd7\x03/\x004\xff\xd7\x03\ +/\x007\xffq\x03/\x009\xff\xae\x03/\x00:\xff\ +\xae\x03/\x00<\xff\x85\x03/\x00\x89\xff\xd7\x03/\x00\ +\x94\xff\xd7\x03/\x00\x95\xff\xd7\x03/\x00\x96\xff\xd7\x03\ +/\x00\x97\xff\xd7\x03/\x00\x98\xff\xd7\x03/\x00\x9a\xff\ +\xd7\x03/\x00\x9f\xff\x85\x03/\x00\xc8\xff\xd7\x03/\x00\ +\xca\xff\xd7\x03/\x00\xcc\xff\xd7\x03/\x00\xce\xff\xd7\x03\ +/\x00\xde\xff\xd7\x03/\x00\xe0\xff\xd7\x03/\x00\xe2\xff\ +\xd7\x03/\x00\xe4\xff\xd7\x03/\x01\x0e\xff\xd7\x03/\x01\ +\x10\xff\xd7\x03/\x01\x12\xff\xd7\x03/\x01\x14\xff\xd7\x03\ +/\x01$\xffq\x03/\x01&\xffq\x03/\x016\xff\ +\xae\x03/\x018\xff\x85\x03/\x01:\xff\x85\x03/\x01\ +G\xff\xd7\x03/\x01\xfa\xff\xae\x03/\x01\xfc\xff\xae\x03\ +/\x01\xfe\xff\xae\x03/\x02\x00\xff\x85\x03/\x02\x07\xff\ +q\x03/\x02\x0b\xffq\x03/\x02_\xff\xd7\x03/\x03\ +I\xff\xd7\x03/\x03K\xff\xd7\x03/\x03M\xff\xd7\x03\ +/\x03O\xff\xd7\x03/\x03Q\xff\xd7\x03/\x03S\xff\ +\xd7\x03/\x03U\xff\xd7\x03/\x03W\xff\xd7\x03/\x03\ +Y\xff\xd7\x03/\x03[\xff\xd7\x03/\x03]\xff\xd7\x03\ +/\x03_\xff\xd7\x03/\x03o\xff\x85\x03/\x03q\xff\ +\x85\x03/\x03s\xff\x85\x03/\x03\x8f\xffq\x030\x00\ +\x05\xff\xec\x030\x00\x0a\xff\xec\x030\x02\x07\xff\xec\x03\ +0\x02\x0b\xff\xec\x031\x00\x05\xffq\x031\x00\x0a\xff\ +q\x031\x00&\xff\xd7\x031\x00*\xff\xd7\x031\x00\ +-\x01\x0a\x031\x002\xff\xd7\x031\x004\xff\xd7\x03\ +1\x007\xffq\x031\x009\xff\xae\x031\x00:\xff\ +\xae\x031\x00<\xff\x85\x031\x00\x89\xff\xd7\x031\x00\ +\x94\xff\xd7\x031\x00\x95\xff\xd7\x031\x00\x96\xff\xd7\x03\ +1\x00\x97\xff\xd7\x031\x00\x98\xff\xd7\x031\x00\x9a\xff\ +\xd7\x031\x00\x9f\xff\x85\x031\x00\xc8\xff\xd7\x031\x00\ +\xca\xff\xd7\x031\x00\xcc\xff\xd7\x031\x00\xce\xff\xd7\x03\ +1\x00\xde\xff\xd7\x031\x00\xe0\xff\xd7\x031\x00\xe2\xff\ +\xd7\x031\x00\xe4\xff\xd7\x031\x01\x0e\xff\xd7\x031\x01\ +\x10\xff\xd7\x031\x01\x12\xff\xd7\x031\x01\x14\xff\xd7\x03\ +1\x01$\xffq\x031\x01&\xffq\x031\x016\xff\ +\xae\x031\x018\xff\x85\x031\x01:\xff\x85\x031\x01\ +G\xff\xd7\x031\x01\xfa\xff\xae\x031\x01\xfc\xff\xae\x03\ +1\x01\xfe\xff\xae\x031\x02\x00\xff\x85\x031\x02\x07\xff\ +q\x031\x02\x0b\xffq\x031\x02_\xff\xd7\x031\x03\ +I\xff\xd7\x031\x03K\xff\xd7\x031\x03M\xff\xd7\x03\ +1\x03O\xff\xd7\x031\x03Q\xff\xd7\x031\x03S\xff\ +\xd7\x031\x03U\xff\xd7\x031\x03W\xff\xd7\x031\x03\ +Y\xff\xd7\x031\x03[\xff\xd7\x031\x03]\xff\xd7\x03\ +1\x03_\xff\xd7\x031\x03o\xff\x85\x031\x03q\xff\ +\x85\x031\x03s\xff\x85\x031\x03\x8f\xffq\x032\x00\ +\x05\xff\xec\x032\x00\x0a\xff\xec\x032\x02\x07\xff\xec\x03\ +2\x02\x0b\xff\xec\x033\x00\x05\xffq\x033\x00\x0a\xff\ +q\x033\x00&\xff\xd7\x033\x00*\xff\xd7\x033\x00\ +-\x01\x0a\x033\x002\xff\xd7\x033\x004\xff\xd7\x03\ +3\x007\xffq\x033\x009\xff\xae\x033\x00:\xff\ +\xae\x033\x00<\xff\x85\x033\x00\x89\xff\xd7\x033\x00\ +\x94\xff\xd7\x033\x00\x95\xff\xd7\x033\x00\x96\xff\xd7\x03\ +3\x00\x97\xff\xd7\x033\x00\x98\xff\xd7\x033\x00\x9a\xff\ +\xd7\x033\x00\x9f\xff\x85\x033\x00\xc8\xff\xd7\x033\x00\ +\xca\xff\xd7\x033\x00\xcc\xff\xd7\x033\x00\xce\xff\xd7\x03\ +3\x00\xde\xff\xd7\x033\x00\xe0\xff\xd7\x033\x00\xe2\xff\ +\xd7\x033\x00\xe4\xff\xd7\x033\x01\x0e\xff\xd7\x033\x01\ +\x10\xff\xd7\x033\x01\x12\xff\xd7\x033\x01\x14\xff\xd7\x03\ +3\x01$\xffq\x033\x01&\xffq\x033\x016\xff\ +\xae\x033\x018\xff\x85\x033\x01:\xff\x85\x033\x01\ +G\xff\xd7\x033\x01\xfa\xff\xae\x033\x01\xfc\xff\xae\x03\ +3\x01\xfe\xff\xae\x033\x02\x00\xff\x85\x033\x02\x07\xff\ +q\x033\x02\x0b\xffq\x033\x02_\xff\xd7\x033\x03\ +I\xff\xd7\x033\x03K\xff\xd7\x033\x03M\xff\xd7\x03\ +3\x03O\xff\xd7\x033\x03Q\xff\xd7\x033\x03S\xff\ +\xd7\x033\x03U\xff\xd7\x033\x03W\xff\xd7\x033\x03\ +Y\xff\xd7\x033\x03[\xff\xd7\x033\x03]\xff\xd7\x03\ +3\x03_\xff\xd7\x033\x03o\xff\x85\x033\x03q\xff\ +\x85\x033\x03s\xff\x85\x033\x03\x8f\xffq\x034\x00\ +\x05\xff\xec\x034\x00\x0a\xff\xec\x034\x02\x07\xff\xec\x03\ +4\x02\x0b\xff\xec\x035\x00-\x00{\x036\x00\x05\xff\ +\xec\x036\x00\x0a\xff\xec\x036\x00Y\xff\xd7\x036\x00\ +Z\xff\xd7\x036\x00[\xff\xd7\x036\x00\x5c\xff\xd7\x03\ +6\x00]\xff\xec\x036\x00\xbf\xff\xd7\x036\x017\xff\ +\xd7\x036\x01<\xff\xec\x036\x01>\xff\xec\x036\x01\ +@\xff\xec\x036\x01\xfb\xff\xd7\x036\x01\xfd\xff\xd7\x03\ +6\x02\x07\xff\xec\x036\x02\x0b\xff\xec\x036\x03p\xff\ +\xd7\x037\x00-\x00{\x038\x00\x05\xff\xec\x038\x00\ +\x0a\xff\xec\x038\x00Y\xff\xd7\x038\x00Z\xff\xd7\x03\ +8\x00[\xff\xd7\x038\x00\x5c\xff\xd7\x038\x00]\xff\ +\xec\x038\x00\xbf\xff\xd7\x038\x017\xff\xd7\x038\x01\ +<\xff\xec\x038\x01>\xff\xec\x038\x01@\xff\xec\x03\ +8\x01\xfb\xff\xd7\x038\x01\xfd\xff\xd7\x038\x02\x07\xff\ +\xec\x038\x02\x0b\xff\xec\x038\x03p\xff\xd7\x039\x00\ +-\x00{\x03:\x00\x05\xff\xec\x03:\x00\x0a\xff\xec\x03\ +:\x00Y\xff\xd7\x03:\x00Z\xff\xd7\x03:\x00[\xff\ +\xd7\x03:\x00\x5c\xff\xd7\x03:\x00]\xff\xec\x03:\x00\ +\xbf\xff\xd7\x03:\x017\xff\xd7\x03:\x01<\xff\xec\x03\ +:\x01>\xff\xec\x03:\x01@\xff\xec\x03:\x01\xfb\xff\ +\xd7\x03:\x01\xfd\xff\xd7\x03:\x02\x07\xff\xec\x03:\x02\ +\x0b\xff\xec\x03:\x03p\xff\xd7\x03;\x00-\x00{\x03\ +<\x00\x05\xff\xec\x03<\x00\x0a\xff\xec\x03<\x00Y\xff\ +\xd7\x03<\x00Z\xff\xd7\x03<\x00[\xff\xd7\x03<\x00\ +\x5c\xff\xd7\x03<\x00]\xff\xec\x03<\x00\xbf\xff\xd7\x03\ +<\x017\xff\xd7\x03<\x01<\xff\xec\x03<\x01>\xff\ +\xec\x03<\x01@\xff\xec\x03<\x01\xfb\xff\xd7\x03<\x01\ +\xfd\xff\xd7\x03<\x02\x07\xff\xec\x03<\x02\x0b\xff\xec\x03\ +<\x03p\xff\xd7\x03=\x00-\x00{\x03>\x00\x05\xff\ +\xec\x03>\x00\x0a\xff\xec\x03>\x00Y\xff\xd7\x03>\x00\ +Z\xff\xd7\x03>\x00[\xff\xd7\x03>\x00\x5c\xff\xd7\x03\ +>\x00]\xff\xec\x03>\x00\xbf\xff\xd7\x03>\x017\xff\ +\xd7\x03>\x01<\xff\xec\x03>\x01>\xff\xec\x03>\x01\ +@\xff\xec\x03>\x01\xfb\xff\xd7\x03>\x01\xfd\xff\xd7\x03\ +>\x02\x07\xff\xec\x03>\x02\x0b\xff\xec\x03>\x03p\xff\ +\xd7\x03?\x00-\x00{\x03@\x00\x05\xff\xec\x03@\x00\ +\x0a\xff\xec\x03@\x00Y\xff\xd7\x03@\x00Z\xff\xd7\x03\ +@\x00[\xff\xd7\x03@\x00\x5c\xff\xd7\x03@\x00]\xff\ +\xec\x03@\x00\xbf\xff\xd7\x03@\x017\xff\xd7\x03@\x01\ +<\xff\xec\x03@\x01>\xff\xec\x03@\x01@\xff\xec\x03\ +@\x01\xfb\xff\xd7\x03@\x01\xfd\xff\xd7\x03@\x02\x07\xff\ +\xec\x03@\x02\x0b\xff\xec\x03@\x03p\xff\xd7\x03A\x00\ +-\x00{\x03B\x00\x05\xff\xec\x03B\x00\x0a\xff\xec\x03\ +B\x00Y\xff\xd7\x03B\x00Z\xff\xd7\x03B\x00[\xff\ +\xd7\x03B\x00\x5c\xff\xd7\x03B\x00]\xff\xec\x03B\x00\ +\xbf\xff\xd7\x03B\x017\xff\xd7\x03B\x01<\xff\xec\x03\ +B\x01>\xff\xec\x03B\x01@\xff\xec\x03B\x01\xfb\xff\ +\xd7\x03B\x01\xfd\xff\xd7\x03B\x02\x07\xff\xec\x03B\x02\ +\x0b\xff\xec\x03B\x03p\xff\xd7\x03C\x00-\x00{\x03\ +D\x00\x05\xff\xec\x03D\x00\x0a\xff\xec\x03D\x00Y\xff\ +\xd7\x03D\x00Z\xff\xd7\x03D\x00[\xff\xd7\x03D\x00\ +\x5c\xff\xd7\x03D\x00]\xff\xec\x03D\x00\xbf\xff\xd7\x03\ +D\x017\xff\xd7\x03D\x01<\xff\xec\x03D\x01>\xff\ +\xec\x03D\x01@\xff\xec\x03D\x01\xfb\xff\xd7\x03D\x01\ +\xfd\xff\xd7\x03D\x02\x07\xff\xec\x03D\x02\x0b\xff\xec\x03\ +D\x03p\xff\xd7\x03I\x00\x0f\xff\xae\x03I\x00\x11\xff\ +\xae\x03I\x00$\xff\xd7\x03I\x007\xff\xc3\x03I\x00\ +9\xff\xec\x03I\x00:\xff\xec\x03I\x00;\xff\xd7\x03\ +I\x00<\xff\xec\x03I\x00=\xff\xec\x03I\x00\x82\xff\ +\xd7\x03I\x00\x83\xff\xd7\x03I\x00\x84\xff\xd7\x03I\x00\ +\x85\xff\xd7\x03I\x00\x86\xff\xd7\x03I\x00\x87\xff\xd7\x03\ +I\x00\x9f\xff\xec\x03I\x00\xc2\xff\xd7\x03I\x00\xc4\xff\ +\xd7\x03I\x00\xc6\xff\xd7\x03I\x01$\xff\xc3\x03I\x01\ +&\xff\xc3\x03I\x016\xff\xec\x03I\x018\xff\xec\x03\ +I\x01:\xff\xec\x03I\x01;\xff\xec\x03I\x01=\xff\ +\xec\x03I\x01?\xff\xec\x03I\x01C\xff\xd7\x03I\x01\ +\xa0\xff\xec\x03I\x01\xfa\xff\xec\x03I\x01\xfc\xff\xec\x03\ +I\x01\xfe\xff\xec\x03I\x02\x00\xff\xec\x03I\x02\x08\xff\ +\xae\x03I\x02\x0c\xff\xae\x03I\x02X\xff\xd7\x03I\x03\ +\x1d\xff\xd7\x03I\x03\x1f\xff\xd7\x03I\x03!\xff\xd7\x03\ +I\x03#\xff\xd7\x03I\x03%\xff\xd7\x03I\x03'\xff\ +\xd7\x03I\x03)\xff\xd7\x03I\x03+\xff\xd7\x03I\x03\ +-\xff\xd7\x03I\x03/\xff\xd7\x03I\x031\xff\xd7\x03\ +I\x033\xff\xd7\x03I\x03o\xff\xec\x03I\x03q\xff\ +\xec\x03I\x03s\xff\xec\x03I\x03\x8f\xff\xc3\x03J\x00\ +\x05\xff\xec\x03J\x00\x0a\xff\xec\x03J\x00Y\xff\xd7\x03\ +J\x00Z\xff\xd7\x03J\x00[\xff\xd7\x03J\x00\x5c\xff\ +\xd7\x03J\x00]\xff\xec\x03J\x00\xbf\xff\xd7\x03J\x01\ +7\xff\xd7\x03J\x01<\xff\xec\x03J\x01>\xff\xec\x03\ +J\x01@\xff\xec\x03J\x01\xfb\xff\xd7\x03J\x01\xfd\xff\ +\xd7\x03J\x02\x07\xff\xec\x03J\x02\x0b\xff\xec\x03J\x03\ +p\xff\xd7\x03K\x00\x0f\xff\xae\x03K\x00\x11\xff\xae\x03\ +K\x00$\xff\xd7\x03K\x007\xff\xc3\x03K\x009\xff\ +\xec\x03K\x00:\xff\xec\x03K\x00;\xff\xd7\x03K\x00\ +<\xff\xec\x03K\x00=\xff\xec\x03K\x00\x82\xff\xd7\x03\ +K\x00\x83\xff\xd7\x03K\x00\x84\xff\xd7\x03K\x00\x85\xff\ +\xd7\x03K\x00\x86\xff\xd7\x03K\x00\x87\xff\xd7\x03K\x00\ +\x9f\xff\xec\x03K\x00\xc2\xff\xd7\x03K\x00\xc4\xff\xd7\x03\ +K\x00\xc6\xff\xd7\x03K\x01$\xff\xc3\x03K\x01&\xff\ +\xc3\x03K\x016\xff\xec\x03K\x018\xff\xec\x03K\x01\ +:\xff\xec\x03K\x01;\xff\xec\x03K\x01=\xff\xec\x03\ +K\x01?\xff\xec\x03K\x01C\xff\xd7\x03K\x01\xa0\xff\ +\xec\x03K\x01\xfa\xff\xec\x03K\x01\xfc\xff\xec\x03K\x01\ +\xfe\xff\xec\x03K\x02\x00\xff\xec\x03K\x02\x08\xff\xae\x03\ +K\x02\x0c\xff\xae\x03K\x02X\xff\xd7\x03K\x03\x1d\xff\ +\xd7\x03K\x03\x1f\xff\xd7\x03K\x03!\xff\xd7\x03K\x03\ +#\xff\xd7\x03K\x03%\xff\xd7\x03K\x03'\xff\xd7\x03\ +K\x03)\xff\xd7\x03K\x03+\xff\xd7\x03K\x03-\xff\ +\xd7\x03K\x03/\xff\xd7\x03K\x031\xff\xd7\x03K\x03\ +3\xff\xd7\x03K\x03o\xff\xec\x03K\x03q\xff\xec\x03\ +K\x03s\xff\xec\x03K\x03\x8f\xff\xc3\x03L\x00\x05\xff\ +\xec\x03L\x00\x0a\xff\xec\x03L\x00Y\xff\xd7\x03L\x00\ +Z\xff\xd7\x03L\x00[\xff\xd7\x03L\x00\x5c\xff\xd7\x03\ +L\x00]\xff\xec\x03L\x00\xbf\xff\xd7\x03L\x017\xff\ +\xd7\x03L\x01<\xff\xec\x03L\x01>\xff\xec\x03L\x01\ +@\xff\xec\x03L\x01\xfb\xff\xd7\x03L\x01\xfd\xff\xd7\x03\ +L\x02\x07\xff\xec\x03L\x02\x0b\xff\xec\x03L\x03p\xff\ +\xd7\x03M\x00\x0f\xff\xae\x03M\x00\x11\xff\xae\x03M\x00\ +$\xff\xd7\x03M\x007\xff\xc3\x03M\x009\xff\xec\x03\ +M\x00:\xff\xec\x03M\x00;\xff\xd7\x03M\x00<\xff\ +\xec\x03M\x00=\xff\xec\x03M\x00\x82\xff\xd7\x03M\x00\ +\x83\xff\xd7\x03M\x00\x84\xff\xd7\x03M\x00\x85\xff\xd7\x03\ +M\x00\x86\xff\xd7\x03M\x00\x87\xff\xd7\x03M\x00\x9f\xff\ +\xec\x03M\x00\xc2\xff\xd7\x03M\x00\xc4\xff\xd7\x03M\x00\ +\xc6\xff\xd7\x03M\x01$\xff\xc3\x03M\x01&\xff\xc3\x03\ +M\x016\xff\xec\x03M\x018\xff\xec\x03M\x01:\xff\ +\xec\x03M\x01;\xff\xec\x03M\x01=\xff\xec\x03M\x01\ +?\xff\xec\x03M\x01C\xff\xd7\x03M\x01\xa0\xff\xec\x03\ +M\x01\xfa\xff\xec\x03M\x01\xfc\xff\xec\x03M\x01\xfe\xff\ +\xec\x03M\x02\x00\xff\xec\x03M\x02\x08\xff\xae\x03M\x02\ +\x0c\xff\xae\x03M\x02X\xff\xd7\x03M\x03\x1d\xff\xd7\x03\ +M\x03\x1f\xff\xd7\x03M\x03!\xff\xd7\x03M\x03#\xff\ +\xd7\x03M\x03%\xff\xd7\x03M\x03'\xff\xd7\x03M\x03\ +)\xff\xd7\x03M\x03+\xff\xd7\x03M\x03-\xff\xd7\x03\ +M\x03/\xff\xd7\x03M\x031\xff\xd7\x03M\x033\xff\ +\xd7\x03M\x03o\xff\xec\x03M\x03q\xff\xec\x03M\x03\ +s\xff\xec\x03M\x03\x8f\xff\xc3\x03O\x00\x0f\xff\xae\x03\ +O\x00\x11\xff\xae\x03O\x00$\xff\xd7\x03O\x007\xff\ +\xc3\x03O\x009\xff\xec\x03O\x00:\xff\xec\x03O\x00\ +;\xff\xd7\x03O\x00<\xff\xec\x03O\x00=\xff\xec\x03\ +O\x00\x82\xff\xd7\x03O\x00\x83\xff\xd7\x03O\x00\x84\xff\ +\xd7\x03O\x00\x85\xff\xd7\x03O\x00\x86\xff\xd7\x03O\x00\ +\x87\xff\xd7\x03O\x00\x9f\xff\xec\x03O\x00\xc2\xff\xd7\x03\ +O\x00\xc4\xff\xd7\x03O\x00\xc6\xff\xd7\x03O\x01$\xff\ +\xc3\x03O\x01&\xff\xc3\x03O\x016\xff\xec\x03O\x01\ +8\xff\xec\x03O\x01:\xff\xec\x03O\x01;\xff\xec\x03\ +O\x01=\xff\xec\x03O\x01?\xff\xec\x03O\x01C\xff\ +\xd7\x03O\x01\xa0\xff\xec\x03O\x01\xfa\xff\xec\x03O\x01\ +\xfc\xff\xec\x03O\x01\xfe\xff\xec\x03O\x02\x00\xff\xec\x03\ +O\x02\x08\xff\xae\x03O\x02\x0c\xff\xae\x03O\x02X\xff\ +\xd7\x03O\x03\x1d\xff\xd7\x03O\x03\x1f\xff\xd7\x03O\x03\ +!\xff\xd7\x03O\x03#\xff\xd7\x03O\x03%\xff\xd7\x03\ +O\x03'\xff\xd7\x03O\x03)\xff\xd7\x03O\x03+\xff\ +\xd7\x03O\x03-\xff\xd7\x03O\x03/\xff\xd7\x03O\x03\ +1\xff\xd7\x03O\x033\xff\xd7\x03O\x03o\xff\xec\x03\ +O\x03q\xff\xec\x03O\x03s\xff\xec\x03O\x03\x8f\xff\ +\xc3\x03Q\x00\x0f\xff\xae\x03Q\x00\x11\xff\xae\x03Q\x00\ +$\xff\xd7\x03Q\x007\xff\xc3\x03Q\x009\xff\xec\x03\ +Q\x00:\xff\xec\x03Q\x00;\xff\xd7\x03Q\x00<\xff\ +\xec\x03Q\x00=\xff\xec\x03Q\x00\x82\xff\xd7\x03Q\x00\ +\x83\xff\xd7\x03Q\x00\x84\xff\xd7\x03Q\x00\x85\xff\xd7\x03\ +Q\x00\x86\xff\xd7\x03Q\x00\x87\xff\xd7\x03Q\x00\x9f\xff\ +\xec\x03Q\x00\xc2\xff\xd7\x03Q\x00\xc4\xff\xd7\x03Q\x00\ +\xc6\xff\xd7\x03Q\x01$\xff\xc3\x03Q\x01&\xff\xc3\x03\ +Q\x016\xff\xec\x03Q\x018\xff\xec\x03Q\x01:\xff\ +\xec\x03Q\x01;\xff\xec\x03Q\x01=\xff\xec\x03Q\x01\ +?\xff\xec\x03Q\x01C\xff\xd7\x03Q\x01\xa0\xff\xec\x03\ +Q\x01\xfa\xff\xec\x03Q\x01\xfc\xff\xec\x03Q\x01\xfe\xff\ +\xec\x03Q\x02\x00\xff\xec\x03Q\x02\x08\xff\xae\x03Q\x02\ +\x0c\xff\xae\x03Q\x02X\xff\xd7\x03Q\x03\x1d\xff\xd7\x03\ +Q\x03\x1f\xff\xd7\x03Q\x03!\xff\xd7\x03Q\x03#\xff\ +\xd7\x03Q\x03%\xff\xd7\x03Q\x03'\xff\xd7\x03Q\x03\ +)\xff\xd7\x03Q\x03+\xff\xd7\x03Q\x03-\xff\xd7\x03\ +Q\x03/\xff\xd7\x03Q\x031\xff\xd7\x03Q\x033\xff\ +\xd7\x03Q\x03o\xff\xec\x03Q\x03q\xff\xec\x03Q\x03\ +s\xff\xec\x03Q\x03\x8f\xff\xc3\x03S\x00\x0f\xff\xae\x03\ +S\x00\x11\xff\xae\x03S\x00$\xff\xd7\x03S\x007\xff\ +\xc3\x03S\x009\xff\xec\x03S\x00:\xff\xec\x03S\x00\ +;\xff\xd7\x03S\x00<\xff\xec\x03S\x00=\xff\xec\x03\ +S\x00\x82\xff\xd7\x03S\x00\x83\xff\xd7\x03S\x00\x84\xff\ +\xd7\x03S\x00\x85\xff\xd7\x03S\x00\x86\xff\xd7\x03S\x00\ +\x87\xff\xd7\x03S\x00\x9f\xff\xec\x03S\x00\xc2\xff\xd7\x03\ +S\x00\xc4\xff\xd7\x03S\x00\xc6\xff\xd7\x03S\x01$\xff\ +\xc3\x03S\x01&\xff\xc3\x03S\x016\xff\xec\x03S\x01\ +8\xff\xec\x03S\x01:\xff\xec\x03S\x01;\xff\xec\x03\ +S\x01=\xff\xec\x03S\x01?\xff\xec\x03S\x01C\xff\ +\xd7\x03S\x01\xa0\xff\xec\x03S\x01\xfa\xff\xec\x03S\x01\ +\xfc\xff\xec\x03S\x01\xfe\xff\xec\x03S\x02\x00\xff\xec\x03\ +S\x02\x08\xff\xae\x03S\x02\x0c\xff\xae\x03S\x02X\xff\ +\xd7\x03S\x03\x1d\xff\xd7\x03S\x03\x1f\xff\xd7\x03S\x03\ +!\xff\xd7\x03S\x03#\xff\xd7\x03S\x03%\xff\xd7\x03\ +S\x03'\xff\xd7\x03S\x03)\xff\xd7\x03S\x03+\xff\ +\xd7\x03S\x03-\xff\xd7\x03S\x03/\xff\xd7\x03S\x03\ +1\xff\xd7\x03S\x033\xff\xd7\x03S\x03o\xff\xec\x03\ +S\x03q\xff\xec\x03S\x03s\xff\xec\x03S\x03\x8f\xff\ +\xc3\x03U\x00\x0f\xff\xae\x03U\x00\x11\xff\xae\x03U\x00\ +$\xff\xd7\x03U\x007\xff\xc3\x03U\x009\xff\xec\x03\ +U\x00:\xff\xec\x03U\x00;\xff\xd7\x03U\x00<\xff\ +\xec\x03U\x00=\xff\xec\x03U\x00\x82\xff\xd7\x03U\x00\ +\x83\xff\xd7\x03U\x00\x84\xff\xd7\x03U\x00\x85\xff\xd7\x03\ +U\x00\x86\xff\xd7\x03U\x00\x87\xff\xd7\x03U\x00\x9f\xff\ +\xec\x03U\x00\xc2\xff\xd7\x03U\x00\xc4\xff\xd7\x03U\x00\ +\xc6\xff\xd7\x03U\x01$\xff\xc3\x03U\x01&\xff\xc3\x03\ +U\x016\xff\xec\x03U\x018\xff\xec\x03U\x01:\xff\ +\xec\x03U\x01;\xff\xec\x03U\x01=\xff\xec\x03U\x01\ +?\xff\xec\x03U\x01C\xff\xd7\x03U\x01\xa0\xff\xec\x03\ +U\x01\xfa\xff\xec\x03U\x01\xfc\xff\xec\x03U\x01\xfe\xff\ +\xec\x03U\x02\x00\xff\xec\x03U\x02\x08\xff\xae\x03U\x02\ +\x0c\xff\xae\x03U\x02X\xff\xd7\x03U\x03\x1d\xff\xd7\x03\ +U\x03\x1f\xff\xd7\x03U\x03!\xff\xd7\x03U\x03#\xff\ +\xd7\x03U\x03%\xff\xd7\x03U\x03'\xff\xd7\x03U\x03\ +)\xff\xd7\x03U\x03+\xff\xd7\x03U\x03-\xff\xd7\x03\ +U\x03/\xff\xd7\x03U\x031\xff\xd7\x03U\x033\xff\ +\xd7\x03U\x03o\xff\xec\x03U\x03q\xff\xec\x03U\x03\ +s\xff\xec\x03U\x03\x8f\xff\xc3\x03X\x00I\x00R\x03\ +X\x00W\x00R\x03X\x00Y\x00f\x03X\x00Z\x00\ +f\x03X\x00[\x00f\x03X\x00\x5c\x00f\x03X\x00\ +\xbf\x00f\x03X\x01%\x00R\x03X\x01'\x00R\x03\ +X\x017\x00f\x03X\x01\xfb\x00f\x03X\x01\xfd\x00\ +f\x03X\x024\x00R\x03X\x025\x00R\x03X\x02\ +]\x00R\x03X\x02^\x00R\x03X\x03p\x00f\x03\ +X\x03\x8d\x00R\x03X\x03\x90\x00R\x03Z\x00I\x00\ +R\x03Z\x00W\x00R\x03Z\x00Y\x00f\x03Z\x00\ +Z\x00f\x03Z\x00[\x00f\x03Z\x00\x5c\x00f\x03\ +Z\x00\xbf\x00f\x03Z\x01%\x00R\x03Z\x01'\x00\ +R\x03Z\x017\x00f\x03Z\x01\xfb\x00f\x03Z\x01\ +\xfd\x00f\x03Z\x024\x00R\x03Z\x025\x00R\x03\ +Z\x02]\x00R\x03Z\x02^\x00R\x03Z\x03p\x00\ +f\x03Z\x03\x8d\x00R\x03Z\x03\x90\x00R\x03\x5c\x00\ +I\x00R\x03\x5c\x00W\x00R\x03\x5c\x00Y\x00f\x03\ +\x5c\x00Z\x00f\x03\x5c\x00[\x00f\x03\x5c\x00\x5c\x00\ +f\x03\x5c\x00\xbf\x00f\x03\x5c\x01%\x00R\x03\x5c\x01\ +'\x00R\x03\x5c\x017\x00f\x03\x5c\x01\xfb\x00f\x03\ +\x5c\x01\xfd\x00f\x03\x5c\x024\x00R\x03\x5c\x025\x00\ +R\x03\x5c\x02]\x00R\x03\x5c\x02^\x00R\x03\x5c\x03\ +p\x00f\x03\x5c\x03\x8d\x00R\x03\x5c\x03\x90\x00R\x03\ +^\x00I\x00R\x03^\x00W\x00R\x03^\x00Y\x00\ +f\x03^\x00Z\x00f\x03^\x00[\x00f\x03^\x00\ +\x5c\x00f\x03^\x00\xbf\x00f\x03^\x01%\x00R\x03\ +^\x01'\x00R\x03^\x017\x00f\x03^\x01\xfb\x00\ +f\x03^\x01\xfd\x00f\x03^\x024\x00R\x03^\x02\ +5\x00R\x03^\x02]\x00R\x03^\x02^\x00R\x03\ +^\x03p\x00f\x03^\x03\x8d\x00R\x03^\x03\x90\x00\ +R\x03`\x00I\x00R\x03`\x00W\x00R\x03`\x00\ +Y\x00f\x03`\x00Z\x00f\x03`\x00[\x00f\x03\ +`\x00\x5c\x00f\x03`\x00\xbf\x00f\x03`\x01%\x00\ +R\x03`\x01'\x00R\x03`\x017\x00f\x03`\x01\ +\xfb\x00f\x03`\x01\xfd\x00f\x03`\x024\x00R\x03\ +`\x025\x00R\x03`\x02]\x00R\x03`\x02^\x00\ +R\x03`\x03p\x00f\x03`\x03\x8d\x00R\x03`\x03\ +\x90\x00R\x03a\x00\x0f\xff\xd7\x03a\x00\x11\xff\xd7\x03\ +a\x00$\xff\xec\x03a\x00\x82\xff\xec\x03a\x00\x83\xff\ +\xec\x03a\x00\x84\xff\xec\x03a\x00\x85\xff\xec\x03a\x00\ +\x86\xff\xec\x03a\x00\x87\xff\xec\x03a\x00\xc2\xff\xec\x03\ +a\x00\xc4\xff\xec\x03a\x00\xc6\xff\xec\x03a\x01C\xff\ +\xec\x03a\x02\x08\xff\xd7\x03a\x02\x0c\xff\xd7\x03a\x02\ +X\xff\xec\x03a\x03\x1d\xff\xec\x03a\x03\x1f\xff\xec\x03\ +a\x03!\xff\xec\x03a\x03#\xff\xec\x03a\x03%\xff\ +\xec\x03a\x03'\xff\xec\x03a\x03)\xff\xec\x03a\x03\ ++\xff\xec\x03a\x03-\xff\xec\x03a\x03/\xff\xec\x03\ +a\x031\xff\xec\x03a\x033\xff\xec\x03f\x00I\x00\ +f\x03f\x00W\x00f\x03f\x00Y\x00f\x03f\x00\ +Z\x00f\x03f\x00[\x00f\x03f\x00\x5c\x00f\x03\ +f\x00\xbf\x00f\x03f\x01%\x00f\x03f\x01'\x00\ +f\x03f\x017\x00f\x03f\x01\xfb\x00f\x03f\x01\ +\xfd\x00f\x03f\x024\x00f\x03f\x025\x00f\x03\ +f\x02]\x00f\x03f\x02^\x00f\x03f\x03p\x00\ +f\x03f\x03\x8d\x00f\x03f\x03\x90\x00f\x03h\x00\ +I\x00f\x03h\x00W\x00f\x03h\x00Y\x00f\x03\ +h\x00Z\x00f\x03h\x00[\x00f\x03h\x00\x5c\x00\ +f\x03h\x00\xbf\x00f\x03h\x01%\x00f\x03h\x01\ +'\x00f\x03h\x017\x00f\x03h\x01\xfb\x00f\x03\ +h\x01\xfd\x00f\x03h\x024\x00f\x03h\x025\x00\ +f\x03h\x02]\x00f\x03h\x02^\x00f\x03h\x03\ +p\x00f\x03h\x03\x8d\x00f\x03h\x03\x90\x00f\x03\ +j\x00I\x00f\x03j\x00W\x00f\x03j\x00Y\x00\ +f\x03j\x00Z\x00f\x03j\x00[\x00f\x03j\x00\ +\x5c\x00f\x03j\x00\xbf\x00f\x03j\x01%\x00f\x03\ +j\x01'\x00f\x03j\x017\x00f\x03j\x01\xfb\x00\ +f\x03j\x01\xfd\x00f\x03j\x024\x00f\x03j\x02\ +5\x00f\x03j\x02]\x00f\x03j\x02^\x00f\x03\ +j\x03p\x00f\x03j\x03\x8d\x00f\x03j\x03\x90\x00\ +f\x03l\x00I\x00f\x03l\x00W\x00f\x03l\x00\ +Y\x00f\x03l\x00Z\x00f\x03l\x00[\x00f\x03\ +l\x00\x5c\x00f\x03l\x00\xbf\x00f\x03l\x01%\x00\ +f\x03l\x01'\x00f\x03l\x017\x00f\x03l\x01\ +\xfb\x00f\x03l\x01\xfd\x00f\x03l\x024\x00f\x03\ +l\x025\x00f\x03l\x02]\x00f\x03l\x02^\x00\ +f\x03l\x03p\x00f\x03l\x03\x8d\x00f\x03l\x03\ +\x90\x00f\x03n\x00I\x00f\x03n\x00W\x00f\x03\ +n\x00Y\x00f\x03n\x00Z\x00f\x03n\x00[\x00\ +f\x03n\x00\x5c\x00f\x03n\x00\xbf\x00f\x03n\x01\ +%\x00f\x03n\x01'\x00f\x03n\x017\x00f\x03\ +n\x01\xfb\x00f\x03n\x01\xfd\x00f\x03n\x024\x00\ +f\x03n\x025\x00f\x03n\x02]\x00f\x03n\x02\ +^\x00f\x03n\x03p\x00f\x03n\x03\x8d\x00f\x03\ +n\x03\x90\x00f\x03o\x00\x0f\xff\x85\x03o\x00\x11\xff\ +\x85\x03o\x00\x22\x00)\x03o\x00$\xff\x85\x03o\x00\ +&\xff\xd7\x03o\x00*\xff\xd7\x03o\x002\xff\xd7\x03\ +o\x004\xff\xd7\x03o\x00D\xff\x9a\x03o\x00F\xff\ +\x9a\x03o\x00G\xff\x9a\x03o\x00H\xff\x9a\x03o\x00\ +J\xff\xd7\x03o\x00P\xff\xc3\x03o\x00Q\xff\xc3\x03\ +o\x00R\xff\x9a\x03o\x00S\xff\xc3\x03o\x00T\xff\ +\x9a\x03o\x00U\xff\xc3\x03o\x00V\xff\xae\x03o\x00\ +X\xff\xc3\x03o\x00]\xff\xd7\x03o\x00\x82\xff\x85\x03\ +o\x00\x83\xff\x85\x03o\x00\x84\xff\x85\x03o\x00\x85\xff\ +\x85\x03o\x00\x86\xff\x85\x03o\x00\x87\xff\x85\x03o\x00\ +\x89\xff\xd7\x03o\x00\x94\xff\xd7\x03o\x00\x95\xff\xd7\x03\ +o\x00\x96\xff\xd7\x03o\x00\x97\xff\xd7\x03o\x00\x98\xff\ +\xd7\x03o\x00\x9a\xff\xd7\x03o\x00\xa2\xff\x9a\x03o\x00\ +\xa3\xff\x9a\x03o\x00\xa4\xff\x9a\x03o\x00\xa5\xff\x9a\x03\ +o\x00\xa6\xff\x9a\x03o\x00\xa7\xff\x9a\x03o\x00\xa8\xff\ +\x9a\x03o\x00\xa9\xff\x9a\x03o\x00\xaa\xff\x9a\x03o\x00\ +\xab\xff\x9a\x03o\x00\xac\xff\x9a\x03o\x00\xad\xff\x9a\x03\ +o\x00\xb4\xff\x9a\x03o\x00\xb5\xff\x9a\x03o\x00\xb6\xff\ +\x9a\x03o\x00\xb7\xff\x9a\x03o\x00\xb8\xff\x9a\x03o\x00\ +\xba\xff\x9a\x03o\x00\xbb\xff\xc3\x03o\x00\xbc\xff\xc3\x03\ +o\x00\xbd\xff\xc3\x03o\x00\xbe\xff\xc3\x03o\x00\xc2\xff\ +\x85\x03o\x00\xc3\xff\x9a\x03o\x00\xc4\xff\x85\x03o\x00\ +\xc5\xff\x9a\x03o\x00\xc6\xff\x85\x03o\x00\xc7\xff\x9a\x03\ +o\x00\xc8\xff\xd7\x03o\x00\xc9\xff\x9a\x03o\x00\xca\xff\ +\xd7\x03o\x00\xcb\xff\x9a\x03o\x00\xcc\xff\xd7\x03o\x00\ +\xcd\xff\x9a\x03o\x00\xce\xff\xd7\x03o\x00\xcf\xff\x9a\x03\ +o\x00\xd1\xff\x9a\x03o\x00\xd3\xff\x9a\x03o\x00\xd5\xff\ +\x9a\x03o\x00\xd7\xff\x9a\x03o\x00\xd9\xff\x9a\x03o\x00\ +\xdb\xff\x9a\x03o\x00\xdd\xff\x9a\x03o\x00\xde\xff\xd7\x03\ +o\x00\xdf\xff\xd7\x03o\x00\xe0\xff\xd7\x03o\x00\xe1\xff\ +\xd7\x03o\x00\xe2\xff\xd7\x03o\x00\xe3\xff\xd7\x03o\x00\ +\xe4\xff\xd7\x03o\x00\xe5\xff\xd7\x03o\x00\xfa\xff\xc3\x03\ +o\x01\x06\xff\xc3\x03o\x01\x08\xff\xc3\x03o\x01\x0d\xff\ +\xc3\x03o\x01\x0e\xff\xd7\x03o\x01\x0f\xff\x9a\x03o\x01\ +\x10\xff\xd7\x03o\x01\x11\xff\x9a\x03o\x01\x12\xff\xd7\x03\ +o\x01\x13\xff\x9a\x03o\x01\x14\xff\xd7\x03o\x01\x15\xff\ +\x9a\x03o\x01\x17\xff\xc3\x03o\x01\x19\xff\xc3\x03o\x01\ +\x1d\xff\xae\x03o\x01!\xff\xae\x03o\x01+\xff\xc3\x03\ +o\x01-\xff\xc3\x03o\x01/\xff\xc3\x03o\x011\xff\ +\xc3\x03o\x013\xff\xc3\x03o\x015\xff\xc3\x03o\x01\ +<\xff\xd7\x03o\x01>\xff\xd7\x03o\x01@\xff\xd7\x03\ +o\x01C\xff\x85\x03o\x01D\xff\x9a\x03o\x01F\xff\ +\x9a\x03o\x01G\xff\xd7\x03o\x01H\xff\x9a\x03o\x01\ +J\xff\xae\x03o\x02\x08\xff\x85\x03o\x02\x0c\xff\x85\x03\ +o\x02W\xff\xc3\x03o\x02X\xff\x85\x03o\x02Y\xff\ +\x9a\x03o\x02_\xff\xd7\x03o\x02`\xff\x9a\x03o\x02\ +b\xff\xc3\x03o\x03\x1d\xff\x85\x03o\x03\x1e\xff\x9a\x03\ +o\x03\x1f\xff\x85\x03o\x03 \xff\x9a\x03o\x03!\xff\ +\x85\x03o\x03\x22\xff\x9a\x03o\x03#\xff\x85\x03o\x03\ +%\xff\x85\x03o\x03&\xff\x9a\x03o\x03'\xff\x85\x03\ +o\x03(\xff\x9a\x03o\x03)\xff\x85\x03o\x03*\xff\ +\x9a\x03o\x03+\xff\x85\x03o\x03,\xff\x9a\x03o\x03\ +-\xff\x85\x03o\x03.\xff\x9a\x03o\x03/\xff\x85\x03\ +o\x030\xff\x9a\x03o\x031\xff\x85\x03o\x032\xff\ +\x9a\x03o\x033\xff\x85\x03o\x034\xff\x9a\x03o\x03\ +6\xff\x9a\x03o\x038\xff\x9a\x03o\x03:\xff\x9a\x03\ +o\x03<\xff\x9a\x03o\x03@\xff\x9a\x03o\x03B\xff\ +\x9a\x03o\x03D\xff\x9a\x03o\x03I\xff\xd7\x03o\x03\ +J\xff\x9a\x03o\x03K\xff\xd7\x03o\x03L\xff\x9a\x03\ +o\x03M\xff\xd7\x03o\x03N\xff\x9a\x03o\x03O\xff\ +\xd7\x03o\x03Q\xff\xd7\x03o\x03R\xff\x9a\x03o\x03\ +S\xff\xd7\x03o\x03T\xff\x9a\x03o\x03U\xff\xd7\x03\ +o\x03V\xff\x9a\x03o\x03W\xff\xd7\x03o\x03X\xff\ +\x9a\x03o\x03Y\xff\xd7\x03o\x03Z\xff\x9a\x03o\x03\ +[\xff\xd7\x03o\x03\x5c\xff\x9a\x03o\x03]\xff\xd7\x03\ +o\x03^\xff\x9a\x03o\x03_\xff\xd7\x03o\x03`\xff\ +\x9a\x03o\x03b\xff\xc3\x03o\x03d\xff\xc3\x03o\x03\ +f\xff\xc3\x03o\x03h\xff\xc3\x03o\x03j\xff\xc3\x03\ +o\x03l\xff\xc3\x03o\x03n\xff\xc3\x03p\x00\x05\x00\ +R\x03p\x00\x0a\x00R\x03p\x00\x0f\xff\xae\x03p\x00\ +\x11\xff\xae\x03p\x00\x22\x00)\x03p\x02\x07\x00R\x03\ +p\x02\x08\xff\xae\x03p\x02\x0b\x00R\x03p\x02\x0c\xff\ +\xae\x03q\x00\x0f\xff\x85\x03q\x00\x11\xff\x85\x03q\x00\ +\x22\x00)\x03q\x00$\xff\x85\x03q\x00&\xff\xd7\x03\ +q\x00*\xff\xd7\x03q\x002\xff\xd7\x03q\x004\xff\ +\xd7\x03q\x00D\xff\x9a\x03q\x00F\xff\x9a\x03q\x00\ +G\xff\x9a\x03q\x00H\xff\x9a\x03q\x00J\xff\xd7\x03\ +q\x00P\xff\xc3\x03q\x00Q\xff\xc3\x03q\x00R\xff\ +\x9a\x03q\x00S\xff\xc3\x03q\x00T\xff\x9a\x03q\x00\ +U\xff\xc3\x03q\x00V\xff\xae\x03q\x00X\xff\xc3\x03\ +q\x00]\xff\xd7\x03q\x00\x82\xff\x85\x03q\x00\x83\xff\ +\x85\x03q\x00\x84\xff\x85\x03q\x00\x85\xff\x85\x03q\x00\ +\x86\xff\x85\x03q\x00\x87\xff\x85\x03q\x00\x89\xff\xd7\x03\ +q\x00\x94\xff\xd7\x03q\x00\x95\xff\xd7\x03q\x00\x96\xff\ +\xd7\x03q\x00\x97\xff\xd7\x03q\x00\x98\xff\xd7\x03q\x00\ +\x9a\xff\xd7\x03q\x00\xa2\xff\x9a\x03q\x00\xa3\xff\x9a\x03\ +q\x00\xa4\xff\x9a\x03q\x00\xa5\xff\x9a\x03q\x00\xa6\xff\ +\x9a\x03q\x00\xa7\xff\x9a\x03q\x00\xa8\xff\x9a\x03q\x00\ +\xa9\xff\x9a\x03q\x00\xaa\xff\x9a\x03q\x00\xab\xff\x9a\x03\ +q\x00\xac\xff\x9a\x03q\x00\xad\xff\x9a\x03q\x00\xb4\xff\ +\x9a\x03q\x00\xb5\xff\x9a\x03q\x00\xb6\xff\x9a\x03q\x00\ +\xb7\xff\x9a\x03q\x00\xb8\xff\x9a\x03q\x00\xba\xff\x9a\x03\ +q\x00\xbb\xff\xc3\x03q\x00\xbc\xff\xc3\x03q\x00\xbd\xff\ +\xc3\x03q\x00\xbe\xff\xc3\x03q\x00\xc2\xff\x85\x03q\x00\ +\xc3\xff\x9a\x03q\x00\xc4\xff\x85\x03q\x00\xc5\xff\x9a\x03\ +q\x00\xc6\xff\x85\x03q\x00\xc7\xff\x9a\x03q\x00\xc8\xff\ +\xd7\x03q\x00\xc9\xff\x9a\x03q\x00\xca\xff\xd7\x03q\x00\ +\xcb\xff\x9a\x03q\x00\xcc\xff\xd7\x03q\x00\xcd\xff\x9a\x03\ +q\x00\xce\xff\xd7\x03q\x00\xcf\xff\x9a\x03q\x00\xd1\xff\ +\x9a\x03q\x00\xd3\xff\x9a\x03q\x00\xd5\xff\x9a\x03q\x00\ +\xd7\xff\x9a\x03q\x00\xd9\xff\x9a\x03q\x00\xdb\xff\x9a\x03\ +q\x00\xdd\xff\x9a\x03q\x00\xde\xff\xd7\x03q\x00\xdf\xff\ +\xd7\x03q\x00\xe0\xff\xd7\x03q\x00\xe1\xff\xd7\x03q\x00\ +\xe2\xff\xd7\x03q\x00\xe3\xff\xd7\x03q\x00\xe4\xff\xd7\x03\ +q\x00\xe5\xff\xd7\x03q\x00\xfa\xff\xc3\x03q\x01\x06\xff\ +\xc3\x03q\x01\x08\xff\xc3\x03q\x01\x0d\xff\xc3\x03q\x01\ +\x0e\xff\xd7\x03q\x01\x0f\xff\x9a\x03q\x01\x10\xff\xd7\x03\ +q\x01\x11\xff\x9a\x03q\x01\x12\xff\xd7\x03q\x01\x13\xff\ +\x9a\x03q\x01\x14\xff\xd7\x03q\x01\x15\xff\x9a\x03q\x01\ +\x17\xff\xc3\x03q\x01\x19\xff\xc3\x03q\x01\x1d\xff\xae\x03\ +q\x01!\xff\xae\x03q\x01+\xff\xc3\x03q\x01-\xff\ +\xc3\x03q\x01/\xff\xc3\x03q\x011\xff\xc3\x03q\x01\ +3\xff\xc3\x03q\x015\xff\xc3\x03q\x01<\xff\xd7\x03\ +q\x01>\xff\xd7\x03q\x01@\xff\xd7\x03q\x01C\xff\ +\x85\x03q\x01D\xff\x9a\x03q\x01F\xff\x9a\x03q\x01\ +G\xff\xd7\x03q\x01H\xff\x9a\x03q\x01J\xff\xae\x03\ +q\x02\x08\xff\x85\x03q\x02\x0c\xff\x85\x03q\x02W\xff\ +\xc3\x03q\x02X\xff\x85\x03q\x02Y\xff\x9a\x03q\x02\ +_\xff\xd7\x03q\x02`\xff\x9a\x03q\x02b\xff\xc3\x03\ +q\x03\x1d\xff\x85\x03q\x03\x1e\xff\x9a\x03q\x03\x1f\xff\ +\x85\x03q\x03 \xff\x9a\x03q\x03!\xff\x85\x03q\x03\ +\x22\xff\x9a\x03q\x03#\xff\x85\x03q\x03%\xff\x85\x03\ +q\x03&\xff\x9a\x03q\x03'\xff\x85\x03q\x03(\xff\ +\x9a\x03q\x03)\xff\x85\x03q\x03*\xff\x9a\x03q\x03\ ++\xff\x85\x03q\x03,\xff\x9a\x03q\x03-\xff\x85\x03\ +q\x03.\xff\x9a\x03q\x03/\xff\x85\x03q\x030\xff\ +\x9a\x03q\x031\xff\x85\x03q\x032\xff\x9a\x03q\x03\ +3\xff\x85\x03q\x034\xff\x9a\x03q\x036\xff\x9a\x03\ +q\x038\xff\x9a\x03q\x03:\xff\x9a\x03q\x03<\xff\ +\x9a\x03q\x03@\xff\x9a\x03q\x03B\xff\x9a\x03q\x03\ +D\xff\x9a\x03q\x03I\xff\xd7\x03q\x03J\xff\x9a\x03\ +q\x03K\xff\xd7\x03q\x03L\xff\x9a\x03q\x03M\xff\ +\xd7\x03q\x03N\xff\x9a\x03q\x03O\xff\xd7\x03q\x03\ +Q\xff\xd7\x03q\x03R\xff\x9a\x03q\x03S\xff\xd7\x03\ +q\x03T\xff\x9a\x03q\x03U\xff\xd7\x03q\x03V\xff\ +\x9a\x03q\x03W\xff\xd7\x03q\x03X\xff\x9a\x03q\x03\ +Y\xff\xd7\x03q\x03Z\xff\x9a\x03q\x03[\xff\xd7\x03\ +q\x03\x5c\xff\x9a\x03q\x03]\xff\xd7\x03q\x03^\xff\ +\x9a\x03q\x03_\xff\xd7\x03q\x03`\xff\x9a\x03q\x03\ +b\xff\xc3\x03q\x03d\xff\xc3\x03q\x03f\xff\xc3\x03\ +q\x03h\xff\xc3\x03q\x03j\xff\xc3\x03q\x03l\xff\ +\xc3\x03q\x03n\xff\xc3\x03r\x00\x05\x00R\x03r\x00\ +\x0a\x00R\x03r\x00\x0f\xff\xae\x03r\x00\x11\xff\xae\x03\ +r\x00\x22\x00)\x03r\x02\x07\x00R\x03r\x02\x08\xff\ +\xae\x03r\x02\x0b\x00R\x03r\x02\x0c\xff\xae\x03s\x00\ +\x0f\xff\x85\x03s\x00\x11\xff\x85\x03s\x00\x22\x00)\x03\ +s\x00$\xff\x85\x03s\x00&\xff\xd7\x03s\x00*\xff\ +\xd7\x03s\x002\xff\xd7\x03s\x004\xff\xd7\x03s\x00\ +D\xff\x9a\x03s\x00F\xff\x9a\x03s\x00G\xff\x9a\x03\ +s\x00H\xff\x9a\x03s\x00J\xff\xd7\x03s\x00P\xff\ +\xc3\x03s\x00Q\xff\xc3\x03s\x00R\xff\x9a\x03s\x00\ +S\xff\xc3\x03s\x00T\xff\x9a\x03s\x00U\xff\xc3\x03\ +s\x00V\xff\xae\x03s\x00X\xff\xc3\x03s\x00]\xff\ +\xd7\x03s\x00\x82\xff\x85\x03s\x00\x83\xff\x85\x03s\x00\ +\x84\xff\x85\x03s\x00\x85\xff\x85\x03s\x00\x86\xff\x85\x03\ +s\x00\x87\xff\x85\x03s\x00\x89\xff\xd7\x03s\x00\x94\xff\ +\xd7\x03s\x00\x95\xff\xd7\x03s\x00\x96\xff\xd7\x03s\x00\ +\x97\xff\xd7\x03s\x00\x98\xff\xd7\x03s\x00\x9a\xff\xd7\x03\ +s\x00\xa2\xff\x9a\x03s\x00\xa3\xff\x9a\x03s\x00\xa4\xff\ +\x9a\x03s\x00\xa5\xff\x9a\x03s\x00\xa6\xff\x9a\x03s\x00\ +\xa7\xff\x9a\x03s\x00\xa8\xff\x9a\x03s\x00\xa9\xff\x9a\x03\ +s\x00\xaa\xff\x9a\x03s\x00\xab\xff\x9a\x03s\x00\xac\xff\ +\x9a\x03s\x00\xad\xff\x9a\x03s\x00\xb4\xff\x9a\x03s\x00\ +\xb5\xff\x9a\x03s\x00\xb6\xff\x9a\x03s\x00\xb7\xff\x9a\x03\ +s\x00\xb8\xff\x9a\x03s\x00\xba\xff\x9a\x03s\x00\xbb\xff\ +\xc3\x03s\x00\xbc\xff\xc3\x03s\x00\xbd\xff\xc3\x03s\x00\ +\xbe\xff\xc3\x03s\x00\xc2\xff\x85\x03s\x00\xc3\xff\x9a\x03\ +s\x00\xc4\xff\x85\x03s\x00\xc5\xff\x9a\x03s\x00\xc6\xff\ +\x85\x03s\x00\xc7\xff\x9a\x03s\x00\xc8\xff\xd7\x03s\x00\ +\xc9\xff\x9a\x03s\x00\xca\xff\xd7\x03s\x00\xcb\xff\x9a\x03\ +s\x00\xcc\xff\xd7\x03s\x00\xcd\xff\x9a\x03s\x00\xce\xff\ +\xd7\x03s\x00\xcf\xff\x9a\x03s\x00\xd1\xff\x9a\x03s\x00\ +\xd3\xff\x9a\x03s\x00\xd5\xff\x9a\x03s\x00\xd7\xff\x9a\x03\ +s\x00\xd9\xff\x9a\x03s\x00\xdb\xff\x9a\x03s\x00\xdd\xff\ +\x9a\x03s\x00\xde\xff\xd7\x03s\x00\xdf\xff\xd7\x03s\x00\ +\xe0\xff\xd7\x03s\x00\xe1\xff\xd7\x03s\x00\xe2\xff\xd7\x03\ +s\x00\xe3\xff\xd7\x03s\x00\xe4\xff\xd7\x03s\x00\xe5\xff\ +\xd7\x03s\x00\xfa\xff\xc3\x03s\x01\x06\xff\xc3\x03s\x01\ +\x08\xff\xc3\x03s\x01\x0d\xff\xc3\x03s\x01\x0e\xff\xd7\x03\ +s\x01\x0f\xff\x9a\x03s\x01\x10\xff\xd7\x03s\x01\x11\xff\ +\x9a\x03s\x01\x12\xff\xd7\x03s\x01\x13\xff\x9a\x03s\x01\ +\x14\xff\xd7\x03s\x01\x15\xff\x9a\x03s\x01\x17\xff\xc3\x03\ +s\x01\x19\xff\xc3\x03s\x01\x1d\xff\xae\x03s\x01!\xff\ +\xae\x03s\x01+\xff\xc3\x03s\x01-\xff\xc3\x03s\x01\ +/\xff\xc3\x03s\x011\xff\xc3\x03s\x013\xff\xc3\x03\ +s\x015\xff\xc3\x03s\x01<\xff\xd7\x03s\x01>\xff\ +\xd7\x03s\x01@\xff\xd7\x03s\x01C\xff\x85\x03s\x01\ +D\xff\x9a\x03s\x01F\xff\x9a\x03s\x01G\xff\xd7\x03\ +s\x01H\xff\x9a\x03s\x01J\xff\xae\x03s\x02\x08\xff\ +\x85\x03s\x02\x0c\xff\x85\x03s\x02W\xff\xc3\x03s\x02\ +X\xff\x85\x03s\x02Y\xff\x9a\x03s\x02_\xff\xd7\x03\ +s\x02`\xff\x9a\x03s\x02b\xff\xc3\x03s\x03\x1d\xff\ +\x85\x03s\x03\x1e\xff\x9a\x03s\x03\x1f\xff\x85\x03s\x03\ + \xff\x9a\x03s\x03!\xff\x85\x03s\x03\x22\xff\x9a\x03\ +s\x03#\xff\x85\x03s\x03%\xff\x85\x03s\x03&\xff\ +\x9a\x03s\x03'\xff\x85\x03s\x03(\xff\x9a\x03s\x03\ +)\xff\x85\x03s\x03*\xff\x9a\x03s\x03+\xff\x85\x03\ +s\x03,\xff\x9a\x03s\x03-\xff\x85\x03s\x03.\xff\ +\x9a\x03s\x03/\xff\x85\x03s\x030\xff\x9a\x03s\x03\ +1\xff\x85\x03s\x032\xff\x9a\x03s\x033\xff\x85\x03\ +s\x034\xff\x9a\x03s\x036\xff\x9a\x03s\x038\xff\ +\x9a\x03s\x03:\xff\x9a\x03s\x03<\xff\x9a\x03s\x03\ +@\xff\x9a\x03s\x03B\xff\x9a\x03s\x03D\xff\x9a\x03\ +s\x03I\xff\xd7\x03s\x03J\xff\x9a\x03s\x03K\xff\ +\xd7\x03s\x03L\xff\x9a\x03s\x03M\xff\xd7\x03s\x03\ +N\xff\x9a\x03s\x03O\xff\xd7\x03s\x03Q\xff\xd7\x03\ +s\x03R\xff\x9a\x03s\x03S\xff\xd7\x03s\x03T\xff\ +\x9a\x03s\x03U\xff\xd7\x03s\x03V\xff\x9a\x03s\x03\ +W\xff\xd7\x03s\x03X\xff\x9a\x03s\x03Y\xff\xd7\x03\ +s\x03Z\xff\x9a\x03s\x03[\xff\xd7\x03s\x03\x5c\xff\ +\x9a\x03s\x03]\xff\xd7\x03s\x03^\xff\x9a\x03s\x03\ +_\xff\xd7\x03s\x03`\xff\x9a\x03s\x03b\xff\xc3\x03\ +s\x03d\xff\xc3\x03s\x03f\xff\xc3\x03s\x03h\xff\ +\xc3\x03s\x03j\xff\xc3\x03s\x03l\xff\xc3\x03s\x03\ +n\xff\xc3\x03t\x00\x05\x00R\x03t\x00\x0a\x00R\x03\ +t\x00\x0f\xff\xae\x03t\x00\x11\xff\xae\x03t\x00\x22\x00\ +)\x03t\x02\x07\x00R\x03t\x02\x08\xff\xae\x03t\x02\ +\x0b\x00R\x03t\x02\x0c\xff\xae\x03\x8d\x00\x05\x00{\x03\ +\x8d\x00\x0a\x00{\x03\x8d\x02\x07\x00{\x03\x8d\x02\x0b\x00\ +{\x03\x8f\x00\x0f\xff\x85\x03\x8f\x00\x10\xff\xae\x03\x8f\x00\ +\x11\xff\x85\x03\x8f\x00\x22\x00)\x03\x8f\x00$\xffq\x03\ +\x8f\x00&\xff\xd7\x03\x8f\x00*\xff\xd7\x03\x8f\x002\xff\ +\xd7\x03\x8f\x004\xff\xd7\x03\x8f\x007\x00)\x03\x8f\x00\ +D\xff\x5c\x03\x8f\x00F\xffq\x03\x8f\x00G\xffq\x03\ +\x8f\x00H\xffq\x03\x8f\x00J\xffq\x03\x8f\x00P\xff\ +\x9a\x03\x8f\x00Q\xff\x9a\x03\x8f\x00R\xffq\x03\x8f\x00\ +S\xff\x9a\x03\x8f\x00T\xffq\x03\x8f\x00U\xff\x9a\x03\ +\x8f\x00V\xff\x85\x03\x8f\x00X\xff\x9a\x03\x8f\x00Y\xff\ +\xd7\x03\x8f\x00Z\xff\xd7\x03\x8f\x00[\xff\xd7\x03\x8f\x00\ +\x5c\xff\xd7\x03\x8f\x00]\xff\xae\x03\x8f\x00\x82\xffq\x03\ +\x8f\x00\x83\xffq\x03\x8f\x00\x84\xffq\x03\x8f\x00\x85\xff\ +q\x03\x8f\x00\x86\xffq\x03\x8f\x00\x87\xffq\x03\x8f\x00\ +\x89\xff\xd7\x03\x8f\x00\x94\xff\xd7\x03\x8f\x00\x95\xff\xd7\x03\ +\x8f\x00\x96\xff\xd7\x03\x8f\x00\x97\xff\xd7\x03\x8f\x00\x98\xff\ +\xd7\x03\x8f\x00\x9a\xff\xd7\x03\x8f\x00\xa2\xffq\x03\x8f\x00\ +\xa3\xff\x5c\x03\x8f\x00\xa4\xff\x5c\x03\x8f\x00\xa5\xff\x5c\x03\ +\x8f\x00\xa6\xff\x5c\x03\x8f\x00\xa7\xff\x5c\x03\x8f\x00\xa8\xff\ +\x5c\x03\x8f\x00\xa9\xffq\x03\x8f\x00\xaa\xffq\x03\x8f\x00\ +\xab\xffq\x03\x8f\x00\xac\xffq\x03\x8f\x00\xad\xffq\x03\ +\x8f\x00\xb4\xffq\x03\x8f\x00\xb5\xffq\x03\x8f\x00\xb6\xff\ +q\x03\x8f\x00\xb7\xffq\x03\x8f\x00\xb8\xffq\x03\x8f\x00\ +\xba\xffq\x03\x8f\x00\xbb\xff\x9a\x03\x8f\x00\xbc\xff\x9a\x03\ +\x8f\x00\xbd\xff\x9a\x03\x8f\x00\xbe\xff\x9a\x03\x8f\x00\xbf\xff\ +\xd7\x03\x8f\x00\xc2\xffq\x03\x8f\x00\xc3\xff\x5c\x03\x8f\x00\ +\xc4\xffq\x03\x8f\x00\xc5\xff\x5c\x03\x8f\x00\xc6\xffq\x03\ +\x8f\x00\xc7\xff\x5c\x03\x8f\x00\xc8\xff\xd7\x03\x8f\x00\xc9\xff\ +q\x03\x8f\x00\xca\xff\xd7\x03\x8f\x00\xcb\xffq\x03\x8f\x00\ +\xcc\xff\xd7\x03\x8f\x00\xcd\xffq\x03\x8f\x00\xce\xff\xd7\x03\ +\x8f\x00\xcf\xffq\x03\x8f\x00\xd1\xffq\x03\x8f\x00\xd3\xff\ +q\x03\x8f\x00\xd5\xffq\x03\x8f\x00\xd7\xffq\x03\x8f\x00\ +\xd9\xffq\x03\x8f\x00\xdb\xffq\x03\x8f\x00\xdd\xffq\x03\ +\x8f\x00\xde\xff\xd7\x03\x8f\x00\xdf\xffq\x03\x8f\x00\xe0\xff\ +\xd7\x03\x8f\x00\xe1\xffq\x03\x8f\x00\xe2\xff\xd7\x03\x8f\x00\ +\xe3\xffq\x03\x8f\x00\xe4\xff\xd7\x03\x8f\x00\xe5\xffq\x03\ +\x8f\x00\xfa\xff\x9a\x03\x8f\x01\x06\xff\x9a\x03\x8f\x01\x08\xff\ +\x9a\x03\x8f\x01\x0d\xff\x9a\x03\x8f\x01\x0e\xff\xd7\x03\x8f\x01\ +\x0f\xffq\x03\x8f\x01\x10\xff\xd7\x03\x8f\x01\x11\xffq\x03\ +\x8f\x01\x12\xff\xd7\x03\x8f\x01\x13\xffq\x03\x8f\x01\x14\xff\ +\xd7\x03\x8f\x01\x15\xffq\x03\x8f\x01\x17\xff\x9a\x03\x8f\x01\ +\x19\xff\x9a\x03\x8f\x01\x1d\xff\x85\x03\x8f\x01!\xff\x85\x03\ +\x8f\x01$\x00)\x03\x8f\x01&\x00)\x03\x8f\x01+\xff\ +\x9a\x03\x8f\x01-\xff\x9a\x03\x8f\x01/\xff\x9a\x03\x8f\x01\ +1\xff\x9a\x03\x8f\x013\xff\x9a\x03\x8f\x015\xff\x9a\x03\ +\x8f\x017\xff\xd7\x03\x8f\x01<\xff\xae\x03\x8f\x01>\xff\ +\xae\x03\x8f\x01@\xff\xae\x03\x8f\x01C\xffq\x03\x8f\x01\ +D\xff\x5c\x03\x8f\x01F\xff\x5c\x03\x8f\x01G\xff\xd7\x03\ +\x8f\x01H\xffq\x03\x8f\x01J\xff\x85\x03\x8f\x01\xfb\xff\ +\xd7\x03\x8f\x01\xfd\xff\xd7\x03\x8f\x02\x02\xff\xae\x03\x8f\x02\ +\x03\xff\xae\x03\x8f\x02\x04\xff\xae\x03\x8f\x02\x08\xff\x85\x03\ +\x8f\x02\x0c\xff\x85\x03\x8f\x02W\xff\x9a\x03\x8f\x02X\xff\ +q\x03\x8f\x02Y\xff\x5c\x03\x8f\x02_\xff\xd7\x03\x8f\x02\ +`\xffq\x03\x8f\x02b\xff\x9a\x03\x8f\x03\x1d\xffq\x03\ +\x8f\x03\x1e\xff\x5c\x03\x8f\x03\x1f\xffq\x03\x8f\x03 \xff\ +\x5c\x03\x8f\x03!\xffq\x03\x8f\x03\x22\xff\x5c\x03\x8f\x03\ +#\xffq\x03\x8f\x03%\xffq\x03\x8f\x03&\xff\x5c\x03\ +\x8f\x03'\xffq\x03\x8f\x03(\xff\x5c\x03\x8f\x03)\xff\ +q\x03\x8f\x03*\xff\x5c\x03\x8f\x03+\xffq\x03\x8f\x03\ +,\xff\x5c\x03\x8f\x03-\xffq\x03\x8f\x03.\xff\x5c\x03\ +\x8f\x03/\xffq\x03\x8f\x030\xff\x5c\x03\x8f\x031\xff\ +q\x03\x8f\x032\xff\x5c\x03\x8f\x033\xffq\x03\x8f\x03\ +4\xff\x5c\x03\x8f\x036\xffq\x03\x8f\x038\xffq\x03\ +\x8f\x03:\xffq\x03\x8f\x03<\xffq\x03\x8f\x03@\xff\ +q\x03\x8f\x03B\xffq\x03\x8f\x03D\xffq\x03\x8f\x03\ +I\xff\xd7\x03\x8f\x03J\xffq\x03\x8f\x03K\xff\xd7\x03\ +\x8f\x03L\xffq\x03\x8f\x03M\xff\xd7\x03\x8f\x03N\xff\ +q\x03\x8f\x03O\xff\xd7\x03\x8f\x03Q\xff\xd7\x03\x8f\x03\ +R\xffq\x03\x8f\x03S\xff\xd7\x03\x8f\x03T\xffq\x03\ +\x8f\x03U\xff\xd7\x03\x8f\x03V\xffq\x03\x8f\x03W\xff\ +\xd7\x03\x8f\x03X\xffq\x03\x8f\x03Y\xff\xd7\x03\x8f\x03\ +Z\xffq\x03\x8f\x03[\xff\xd7\x03\x8f\x03\x5c\xffq\x03\ +\x8f\x03]\xff\xd7\x03\x8f\x03^\xffq\x03\x8f\x03_\xff\ +\xd7\x03\x8f\x03`\xffq\x03\x8f\x03b\xff\x9a\x03\x8f\x03\ +d\xff\x9a\x03\x8f\x03f\xff\x9a\x03\x8f\x03h\xff\x9a\x03\ +\x8f\x03j\xff\x9a\x03\x8f\x03l\xff\x9a\x03\x8f\x03n\xff\ +\x9a\x03\x8f\x03p\xff\xd7\x03\x8f\x03\x8f\x00)\x03\x90\x00\ +\x05\x00)\x03\x90\x00\x0a\x00)\x03\x90\x02\x07\x00)\x03\ +\x90\x02\x0b\x00)\x00\x00\x00\x00\x00\x1a\x01>\x00\x01\x00\ +\x00\x00\x00\x00\x00\x009\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x09\x009\x00\x01\x00\x00\x00\x00\x00\x02\x00\x0b\x00\ +B\x00\x01\x00\x00\x00\x00\x00\x03\x00*\x00M\x00\x01\x00\ +\x00\x00\x00\x00\x04\x00\x15\x00X\x00\x01\x00\x00\x00\x00\x00\ +\x05\x00\x0c\x00w\x00\x01\x00\x00\x00\x00\x00\x06\x00\x13\x00\ +\x83\x00\x01\x00\x00\x00\x00\x00\x07\x00R\x00\x96\x00\x01\x00\ +\x00\x00\x00\x00\x08\x00\x14\x00\xe8\x00\x01\x00\x00\x00\x00\x00\ +\x0b\x00\x1c\x00\xfc\x00\x01\x00\x00\x00\x00\x00\x0c\x00.\x01\ +\x18\x00\x01\x00\x00\x00\x00\x00\x0d\x00.\x01F\x00\x01\x00\ +\x00\x00\x00\x00\x0e\x00*\x01t\x00\x03\x00\x01\x04\x09\x00\ +\x00\x00r\x01\x9e\x00\x03\x00\x01\x04\x09\x00\x01\x00\x12\x02\ +\x10\x00\x03\x00\x01\x04\x09\x00\x02\x00\x16\x02\x22\x00\x03\x00\ +\x01\x04\x09\x00\x03\x00T\x028\x00\x03\x00\x01\x04\x09\x00\ +\x04\x00*\x02N\x00\x03\x00\x01\x04\x09\x00\x05\x00\x18\x02\ +\x8c\x00\x03\x00\x01\x04\x09\x00\x06\x00&\x02\xa4\x00\x03\x00\ +\x01\x04\x09\x00\x07\x00\xa4\x02\xca\x00\x03\x00\x01\x04\x09\x00\ +\x08\x00(\x03n\x00\x03\x00\x01\x04\x09\x00\x0b\x008\x03\ +\x96\x00\x03\x00\x01\x04\x09\x00\x0c\x00\x5c\x03\xce\x00\x03\x00\ +\x01\x04\x09\x00\x0d\x00\x5c\x04*\x00\x03\x00\x01\x04\x09\x00\ +\x0e\x00T\x04\x86Digitized d\ +ata copyright \xa9 \ +2010-2011, Googl\ +e Corporation.Op\ +en SansBold Ital\ +icAscender - Ope\ +n Sans Bold Ital\ +ic Build 100Vers\ +ion 1.10OpenSans\ +-BoldItalicOpen \ +Sans is a tradem\ +ark of Google an\ +d may be registe\ +red in certain j\ +urisdictions.Asc\ +ender Corporatio\ +nhttp://www.asce\ +ndercorp.com/htt\ +p://www.ascender\ +corp.com/typedes\ +igners.htmlLicen\ +sed under the Ap\ +ache License, Ve\ +rsion 2.0http://\ +www.apache.org/l\ +icenses/LICENSE-\ +2.0\x00D\x00i\x00g\x00i\x00t\x00i\x00\ +z\x00e\x00d\x00 \x00d\x00a\x00t\x00a\x00\ + \x00c\x00o\x00p\x00y\x00r\x00i\x00g\x00\ +h\x00t\x00 \x00\xa9\x00 \x002\x000\x001\x00\ +0\x00-\x002\x000\x001\x001\x00,\x00 \x00\ +G\x00o\x00o\x00g\x00l\x00e\x00 \x00C\x00\ +o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\x00\ +o\x00n\x00.\x00O\x00p\x00e\x00n\x00 \x00\ +S\x00a\x00n\x00s\x00B\x00o\x00l\x00d\x00\ + \x00I\x00t\x00a\x00l\x00i\x00c\x00A\x00\ +s\x00c\x00e\x00n\x00d\x00e\x00r\x00 \x00\ +-\x00 \x00O\x00p\x00e\x00n\x00 \x00S\x00\ +a\x00n\x00s\x00 \x00B\x00o\x00l\x00d\x00\ + \x00I\x00t\x00a\x00l\x00i\x00c\x00 \x00\ +B\x00u\x00i\x00l\x00d\x00 \x001\x000\x00\ +0\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\ + \x001\x00.\x001\x000\x00O\x00p\x00e\x00\ +n\x00S\x00a\x00n\x00s\x00-\x00B\x00o\x00\ +l\x00d\x00I\x00t\x00a\x00l\x00i\x00c\x00\ +O\x00p\x00e\x00n\x00 \x00S\x00a\x00n\x00\ +s\x00 \x00i\x00s\x00 \x00a\x00 \x00t\x00\ +r\x00a\x00d\x00e\x00m\x00a\x00r\x00k\x00\ + \x00o\x00f\x00 \x00G\x00o\x00o\x00g\x00\ +l\x00e\x00 \x00a\x00n\x00d\x00 \x00m\x00\ +a\x00y\x00 \x00b\x00e\x00 \x00r\x00e\x00\ +g\x00i\x00s\x00t\x00e\x00r\x00e\x00d\x00\ + \x00i\x00n\x00 \x00c\x00e\x00r\x00t\x00\ +a\x00i\x00n\x00 \x00j\x00u\x00r\x00i\x00\ +s\x00d\x00i\x00c\x00t\x00i\x00o\x00n\x00\ +s\x00.\x00A\x00s\x00c\x00e\x00n\x00d\x00\ +e\x00r\x00 \x00C\x00o\x00r\x00p\x00o\x00\ +r\x00a\x00t\x00i\x00o\x00n\x00h\x00t\x00\ +t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00\ +.\x00a\x00s\x00c\x00e\x00n\x00d\x00e\x00\ +r\x00c\x00o\x00r\x00p\x00.\x00c\x00o\x00\ +m\x00/\x00h\x00t\x00t\x00p\x00:\x00/\x00\ +/\x00w\x00w\x00w\x00.\x00a\x00s\x00c\x00\ +e\x00n\x00d\x00e\x00r\x00c\x00o\x00r\x00\ +p\x00.\x00c\x00o\x00m\x00/\x00t\x00y\x00\ +p\x00e\x00d\x00e\x00s\x00i\x00g\x00n\x00\ +e\x00r\x00s\x00.\x00h\x00t\x00m\x00l\x00\ +L\x00i\x00c\x00e\x00n\x00s\x00e\x00d\x00\ + \x00u\x00n\x00d\x00e\x00r\x00 \x00t\x00\ +h\x00e\x00 \x00A\x00p\x00a\x00c\x00h\x00\ +e\x00 \x00L\x00i\x00c\x00e\x00n\x00s\x00\ +e\x00,\x00 \x00V\x00e\x00r\x00s\x00i\x00\ +o\x00n\x00 \x002\x00.\x000\x00h\x00t\x00\ +t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00\ +.\x00a\x00p\x00a\x00c\x00h\x00e\x00.\x00\ +o\x00r\x00g\x00/\x00l\x00i\x00c\x00e\x00\ +n\x00s\x00e\x00s\x00/\x00L\x00I\x00C\x00\ +E\x00N\x00S\x00E\x00-\x002\x00.\x000\x00\ +\x02\x00\x00\xff\xf4\x00\x00\xfff\x00f\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\ +\xaa\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\ +\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\ +\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\ +\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\ +!\x01\x22\x01#\x01$\x01%\x01&\x01'\x01(\x01\ +)\x01*\x01+\x01,\x01-\x01.\x01/\x010\x01\ +1\x012\x013\x014\x015\x016\x017\x018\x01\ +9\x01:\x01;\x01<\x01=\x01>\x01?\x01@\x01\ +A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x01\ +I\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01\ +Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01\ +Y\x01Z\x01[\x01\x5c\x01]\x01^\x01_\x01`\x01\ +a\x01b\x01c\x01d\x01e\x01f\x01g\x01h\x01\ +i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01\ +q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01\ +y\x01z\x01{\x01|\x01}\x01~\x01\x7f\x01\x80\x01\ +\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\ +\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\ +\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\ +\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\ +\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\ +\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\ +\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\ +\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\ +\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\ +\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\ +\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\ +\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\ +\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\ +\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\ +\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\ +\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\ +\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\x07\x02\x08\x02\ +\x09\x02\x0a\x02\x0b\x02\x0c\x02\x0d\x02\x0e\x02\x0f\x02\x10\x02\ +\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\ +\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02\ +!\x02\x22\x02#\x02$\x02%\x02&\x02'\x02(\x02\ +)\x02*\x02+\x02,\x02-\x02.\x02/\x020\x02\ +1\x022\x023\x024\x025\x026\x027\x028\x02\ +9\x02:\x02;\x02<\x02=\x02>\x02?\x02@\x02\ +A\x02B\x02C\x02D\x02E\x02F\x02G\x02H\x02\ +I\x02J\x02K\x02L\x02M\x02N\x02O\x02P\x02\ +Q\x02R\x02S\x02T\x02U\x02V\x02W\x02X\x02\ +Y\x02Z\x02[\x02\x5c\x02]\x02^\x02_\x02`\x02\ +a\x02b\x02c\x02d\x02e\x02f\x02g\x02h\x02\ +i\x02j\x02k\x02l\x02m\x02n\x02o\x02p\x02\ +q\x02r\x02s\x02t\x02u\x02v\x02w\x02x\x02\ +y\x02z\x02{\x02|\x02}\x02~\x02\x7f\x02\x80\x02\ +\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\ +\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\ +\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\ +\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\ +\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\ +\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\ +\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\ +\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\ +\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\ +\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\ +\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\ +\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\ +\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\ +\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\ +\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\ +\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\ +\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\x07\x03\x08\x03\ +\x09\x03\x0a\x03\x0b\x03\x0c\x03\x0d\x03\x0e\x03\x0f\x03\x10\x03\ +\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\ +\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03\ +!\x03\x22\x03#\x03$\x03%\x03&\x03'\x03(\x03\ +)\x03*\x03+\x03,\x03-\x03.\x03/\x030\x03\ +1\x032\x033\x034\x035\x036\x037\x038\x03\ +9\x03:\x03;\x03<\x03=\x03>\x03?\x03@\x03\ +A\x03B\x03C\x03D\x03E\x03F\x03G\x03H\x03\ +I\x03J\x03K\x03L\x03M\x03N\x03O\x03P\x03\ +Q\x03R\x03S\x03T\x03U\x03V\x03W\x03X\x03\ +Y\x03Z\x03[\x03\x5c\x03]\x03^\x03_\x03`\x03\ +a\x03b\x03c\x03d\x03e\x03f\x03g\x03h\x03\ +i\x03j\x03k\x03l\x03m\x03n\x03o\x03p\x03\ +q\x03r\x03s\x03t\x03u\x03v\x03w\x03x\x03\ +y\x03z\x03{\x03|\x03}\x03~\x03\x7f\x03\x80\x03\ +\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\ +\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\ +\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\ +\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\ +\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\ +\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\ +\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\xb7\x03\xb8\x03\ +\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\xbf\x03\xc0\x03\ +\xc1\x03\xc2\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\xc7\x03\xc8\x03\ +\xc9\x03\xca\x03\xcb\x03\xcc\x03\xcd\x03\xce\x03\xcf\x03\xd0\x03\ +\xd1\x03\xd2\x03\xd3\x03\xd4\x03\xd5\x03\xd6\x03\xd7\x03\xd8\x03\ +\xd9\x03\xda\x03\xdb\x03\xdc\x03\xdd\x03\xde\x03\xdf\x03\xe0\x03\ +\xe1\x03\xe2\x03\xe3\x03\xe4\x03\xe5\x03\xe6\x03\xe7\x03\xe8\x03\ +\xe9\x03\xea\x03\xeb\x03\xec\x03\xed\x03\xee\x03\xef\x03\xf0\x03\ +\xf1\x03\xf2\x03\xf3\x03\xf4\x03\xf5\x03\xf6\x03\xf7\x03\xf8\x03\ +\xf9\x03\xfa\x03\xfb\x03\xfc\x03\xfd\x03\xfe\x03\xff\x04\x00\x04\ +\x01\x04\x02\x04\x03\x04\x04\x04\x05\x04\x06\x04\x07\x04\x08\x04\ +\x09\x04\x0a\x04\x0b\x04\x0c\x04\x0d\x04\x0e\x04\x0f\x04\x10\x04\ +\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x16\x04\x17\x04\x18\x04\ +\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\x1f\x04 \x04\ +!\x04\x22\x04#\x04$\x04%\x04&\x04'\x04(\x04\ +)\x04*\x04+\x04,\x04-\x04.\x04/\x040\x04\ +1\x042\x043\x044\x045\x046\x047\x048\x04\ +9\x04:\x04;\x04<\x04=\x04>\x04?\x04@\x04\ +A\x04B\x04C\x04D\x04E\x04F\x04G\x04H\x04\ +I\x04J\x04K\x04L\x04M\x04N\x04O\x04P\x04\ +Q\x04R\x04S\x04T\x04U\x04V\x04W\x04X\x04\ +Y\x04Z\x04[\x04\x5c\x04]\x04^\x04_\x04`\x04\ +a\x04b\x04c\x04d\x04e\x04f\x04g\x04h\x04\ +i\x04j\x04k\x04l\x04m\x04n\x04o\x04p\x04\ +q\x04r\x04s\x04t\x04u\x04v\x04w\x04x\x04\ +y\x04z\x04{\x04|\x04}\x04~\x04\x7f\x04\x80\x04\ +\x81\x04\x82\x04\x83\x04\x84\x04\x85\x04\x86\x04\x87\x04\x88\x04\ +\x89\x04\x8a\x04\x8b\x04\x8c\x04\x8d\x04\x8e\x04\x8f\x04\x90\x04\ +\x91\x04\x92\x04\x93\x04\x94\x04\x95\x04\x96\x04\x97\x04\x98\x04\ +\x99\x04\x9a\x04\x9b\x04\x9c\x04\x9d\x04\x9e\x04\x9f\x04\xa0\x04\ +\xa1\x04\xa2\x04\xa3\x04\xa4\x04\xa5\x04\xa6\x04\xa7\x04\xa8\x04\ +\xa9\x04\xaa\x04\xab\x07.notdef\x04nu\ +ll\x10nonmarkingret\ +urn\x05space\x06exclam\ +\x08quotedbl\x0anumber\ +sign\x06dollar\x07perc\ +ent\x09ampersand\x0bqu\ +otesingle\x09parenl\ +eft\x0aparenright\x08a\ +sterisk\x04plus\x05com\ +ma\x06hyphen\x06period\ +\x05slash\x04zero\x03one\x03\ +two\x05three\x04four\x04f\ +ive\x03six\x05seven\x05ei\ +ght\x04nine\x05colon\x09s\ +emicolon\x04less\x05eq\ +ual\x07greater\x08ques\ +tion\x02at\x01A\x01B\x01C\x01D\x01\ +E\x01F\x01G\x01H\x05I.alt\x01J\x01\ +K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01\ +S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x0b\ +bracketleft\x09back\ +slash\x0cbracketrig\ +ht\x0basciicircum\x0au\ +nderscore\x05grave\x01\ +a\x01b\x01c\x01d\x01e\x01f\x01g\x01h\x01\ +i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01\ +q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01\ +y\x01z\x09braceleft\x03ba\ +r\x0abraceright\x0aasc\ +iitilde\x10nonbreak\ +ingspace\x0aexclamd\ +own\x04cent\x08sterlin\ +g\x08currency\x03yen\x09b\ +rokenbar\x07section\ +\x08dieresis\x09copyri\ +ght\x0bordfeminine\x0d\ +guillemotleft\x0alo\ +gicalnot\x07uni00AD\ +\x0aregistered\x09over\ +score\x06degree\x09plu\ +sminus\x0btwosuperi\ +or\x0dthreesuperior\ +\x05acute\x02mu\x09paragr\ +aph\x0eperiodcenter\ +ed\x07cedilla\x0bonesu\ +perior\x0cordmascul\ +ine\x0eguillemotrig\ +ht\x0aonequarter\x07on\ +ehalf\x0dthreequart\ +ers\x0cquestiondown\ +\x06Agrave\x06Aacute\x0bA\ +circumflex\x06Atild\ +e\x09Adieresis\x05Arin\ +g\x02AE\x08Ccedilla\x06Eg\ +rave\x06Eacute\x0bEcir\ +cumflex\x09Edieresi\ +s\x0aIgrave.alt\x0aIac\ +ute.alt\x0fIcircumf\ +lex.alt\x0dIdieresi\ +s.alt\x03Eth\x06Ntilde\ +\x06Ograve\x06Oacute\x0bO\ +circumflex\x06Otild\ +e\x09Odieresis\x08mult\ +iply\x06Oslash\x06Ugra\ +ve\x06Uacute\x0bUcircu\ +mflex\x09Udieresis\x06\ +Yacute\x05Thorn\x0ager\ +mandbls\x06agrave\x06a\ +acute\x0bacircumfle\ +x\x06atilde\x09adieres\ +is\x05aring\x02ae\x08cced\ +illa\x06egrave\x06eacu\ +te\x0becircumflex\x09e\ +dieresis\x06igrave\x06\ +iacute\x0bicircumfl\ +ex\x09idieresis\x03eth\ +\x06ntilde\x06ograve\x06o\ +acute\x0bocircumfle\ +x\x06otilde\x09odieres\ +is\x06divide\x06oslash\ +\x06ugrave\x06uacute\x0bu\ +circumflex\x09udier\ +esis\x06yacute\x05thor\ +n\x09ydieresis\x07Amac\ +ron\x07amacron\x06Abre\ +ve\x06abreve\x07Aogone\ +k\x07aogonek\x06Cacute\ +\x06cacute\x0bCcircumf\ +lex\x0bccircumflex\x04\ +Cdot\x04cdot\x06Ccaron\ +\x06ccaron\x06Dcaron\x06d\ +caron\x06Dcroat\x06dcr\ +oat\x07Emacron\x07emac\ +ron\x06Ebreve\x06ebrev\ +e\x0aEdotaccent\x0aedo\ +taccent\x07Eogonek\x07\ +eogonek\x06Ecaron\x06e\ +caron\x0bGcircumfle\ +x\x0bgcircumflex\x06Gb\ +reve\x06gbreve\x04Gdot\ +\x04gdot\x0cGcommaacce\ +nt\x0cgcommaaccent\x0b\ +Hcircumflex\x0bhcir\ +cumflex\x04Hbar\x04hba\ +r\x0aItilde.alt\x06iti\ +lde\x0bImacron.alt\x07\ +imacron\x0aIbreve.a\ +lt\x06ibreve\x0bIogone\ +k.alt\x07iogonek\x0eId\ +otaccent.alt\x08dot\ +lessi\x06IJ.alt\x02ij\x0b\ +Jcircumflex\x0bjcir\ +cumflex\x0cKcommaac\ +cent\x0ckcommaaccen\ +t\x0ckgreenlandic\x06L\ +acute\x06lacute\x0cLco\ +mmaaccent\x0clcomma\ +accent\x06Lcaron\x06lc\ +aron\x04Ldot\x04ldot\x06L\ +slash\x06lslash\x06Nac\ +ute\x06nacute\x0cNcomm\ +aaccent\x0cncommaac\ +cent\x06Ncaron\x06ncar\ +on\x0bnapostrophe\x03E\ +ng\x03eng\x07Omacron\x07o\ +macron\x06Obreve\x06ob\ +reve\x0dOhungarumla\ +ut\x0dohungarumlaut\ +\x02OE\x02oe\x06Racute\x06ra\ +cute\x0cRcommaaccen\ +t\x0crcommaaccent\x06R\ +caron\x06rcaron\x06Sac\ +ute\x06sacute\x0bScirc\ +umflex\x0bscircumfl\ +ex\x08Scedilla\x08sced\ +illa\x06Scaron\x06scar\ +on\x0cTcommaaccent\x0c\ +tcommaaccent\x06Tca\ +ron\x06tcaron\x04Tbar\x04\ +tbar\x06Utilde\x06util\ +de\x07Umacron\x07umacr\ +on\x06Ubreve\x06ubreve\ +\x05Uring\x05uring\x0dUhu\ +ngarumlaut\x0duhung\ +arumlaut\x07Uogonek\ +\x07uogonek\x0bWcircum\ +flex\x0bwcircumflex\ +\x0bYcircumflex\x0byci\ +rcumflex\x09Ydieres\ +is\x06Zacute\x06zacute\ +\x0aZdotaccent\x0azdot\ +accent\x06Zcaron\x06zc\ +aron\x05longs\x06flori\ +n\x0aAringacute\x0aari\ +ngacute\x07AEacute\x07\ +aeacute\x0bOslashac\ +ute\x0boslashacute\x0c\ +Scommaaccent\x0csco\ +mmaaccent\x0acircum\ +flex\x05caron\x06macro\ +n\x05breve\x09dotaccen\ +t\x04ring\x06ogonek\x05ti\ +lde\x0chungarumlaut\ +\x05tonos\x0ddieresist\ +onos\x0aAlphatonos\x09\ +anoteleia\x0cEpsilo\ +ntonos\x08Etatonos\x0d\ +Iotatonos.alt\x0cOm\ +icrontonos\x0cUpsil\ +ontonos\x0aOmegaton\ +os\x11iotadieresist\ +onos\x05Alpha\x04Beta\x05\ +Gamma\x07uni0394\x07Ep\ +silon\x04Zeta\x03Eta\x05T\ +heta\x08Iota.alt\x05Ka\ +ppa\x06Lambda\x02Mu\x02Nu\ +\x02Xi\x07Omicron\x02Pi\x03R\ +ho\x05Sigma\x03Tau\x07Ups\ +ilon\x03Phi\x03Chi\x03Psi\ +\x07uni03A9\x10Iotadie\ +resis.alt\x0fUpsilo\ +ndieresis\x0aalphat\ +onos\x0cepsilontono\ +s\x08etatonos\x09iotat\ +onos\x14upsilondier\ +esistonos\x05alpha\x04\ +beta\x05gamma\x05delta\ +\x07epsilon\x04zeta\x03et\ +a\x05theta\x04iota\x05kap\ +pa\x06lambda\x07uni03B\ +C\x02nu\x02xi\x07omicron\x02\ +pi\x03rho\x06sigma1\x05si\ +gma\x03tau\x07upsilon\x03\ +phi\x03chi\x03psi\x05omeg\ +a\x0ciotadieresis\x0fu\ +psilondieresis\x0co\ +microntonos\x0cupsi\ +lontonos\x0aomegato\ +nos\x09afii10023\x09af\ +ii10051\x09afii1005\ +2\x09afii10053\x09afii\ +10054\x0dafii10055.\ +alt\x0dafii10056.al\ +t\x09afii10057\x09afii\ +10058\x09afii10059\x09\ +afii10060\x09afii10\ +061\x09afii10062\x09af\ +ii10145\x09afii1001\ +7\x09afii10018\x09afii\ +10019\x09afii10020\x09\ +afii10021\x09afii10\ +022\x09afii10024\x09af\ +ii10025\x09afii1002\ +6\x09afii10027\x09afii\ +10028\x09afii10029\x09\ +afii10030\x09afii10\ +031\x09afii10032\x09af\ +ii10033\x09afii1003\ +4\x09afii10035\x09afii\ +10036\x09afii10037\x09\ +afii10038\x09afii10\ +039\x09afii10040\x09af\ +ii10041\x09afii1004\ +2\x09afii10043\x09afii\ +10044\x09afii10045\x09\ +afii10046\x09afii10\ +047\x09afii10048\x09af\ +ii10049\x09afii1006\ +5\x09afii10066\x09afii\ +10067\x09afii10068\x09\ +afii10069\x09afii10\ +070\x09afii10072\x09af\ +ii10073\x09afii1007\ +4\x09afii10075\x09afii\ +10076\x09afii10077\x09\ +afii10078\x09afii10\ +079\x09afii10080\x09af\ +ii10081\x09afii1008\ +2\x09afii10083\x09afii\ +10084\x09afii10085\x09\ +afii10086\x09afii10\ +087\x09afii10088\x09af\ +ii10089\x09afii1009\ +0\x09afii10091\x09afii\ +10092\x09afii10093\x09\ +afii10094\x09afii10\ +095\x09afii10096\x09af\ +ii10097\x09afii1007\ +1\x09afii10099\x09afii\ +10100\x09afii10101\x09\ +afii10102\x09afii10\ +103\x09afii10104\x09af\ +ii10105\x09afii1010\ +6\x09afii10107\x09afii\ +10108\x09afii10109\x09\ +afii10110\x09afii10\ +193\x09afii10050\x09af\ +ii10098\x06Wgrave\x06w\ +grave\x06Wacute\x06wac\ +ute\x09Wdieresis\x09wd\ +ieresis\x06Ygrave\x06y\ +grave\x06endash\x06emd\ +ash\x09afii00208\x0dun\ +derscoredbl\x09quot\ +eleft\x0aquoteright\ +\x0equotesinglbase\x0d\ +quotereversed\x0cqu\ +otedblleft\x0dquote\ +dblright\x0cquotedb\ +lbase\x06dagger\x09dag\ +gerdbl\x06bullet\x08el\ +lipsis\x0bperthousa\ +nd\x06minute\x06second\ +\x0dguilsinglleft\x0eg\ +uilsinglright\x09ex\ +clamdbl\x08fraction\ +\x09nsuperior\x05franc\ +\x09afii08941\x06peset\ +a\x04Euro\x09afii61248\ +\x09afii61289\x09afii6\ +1352\x09trademark\x05O\ +mega\x09estimated\x09o\ +neeighth\x0cthreeei\ +ghths\x0bfiveeighth\ +s\x0cseveneighths\x0bp\ +artialdiff\x05Delta\ +\x07product\x09summati\ +on\x05minus\x07radical\ +\x08infinity\x08integr\ +al\x0bapproxequal\x08n\ +otequal\x09lessequa\ +l\x0cgreaterequal\x07l\ +ozenge\x07uniFB01\x07u\ +niFB02\x0dcyrillicb\ +reve\x08dotlessj\x10ca\ +roncommaaccent\x0bc\ +ommaaccent\x11comma\ +accentrotate\x0czer\ +osuperior\x0cfoursu\ +perior\x0cfivesuper\ +ior\x0bsixsuperior\x0d\ +sevensuperior\x0dei\ +ghtsuperior\x0cnine\ +superior\x07uni2000\ +\x07uni2001\x07uni2002\ +\x07uni2003\x07uni2004\ +\x07uni2005\x07uni2006\ +\x07uni2007\x07uni2008\ +\x07uni2009\x07uni200A\ +\x07uni200B\x07uniFEFF\ +\x07uniFFFC\x07uniFFFD\ +\x07uni01F0\x07uni02BC\ +\x07uni03D1\x07uni03D2\ +\x07uni03D6\x07uni1E3E\ +\x07uni1E3F\x07uni1E00\ +\x07uni1E01\x07uni1F4D\ +\x07uni02F3\x09dasiaox\ +ia\x07uniFB03\x07uniFB\ +04\x05Ohorn\x05ohorn\x05U\ +horn\x05uhorn\x07uni03\ +00\x07uni0301\x07uni03\ +03\x04hook\x08dotbelow\ +\x07uni0400\x07uni040D\ +\x07uni0450\x07uni045D\ +\x07uni0460\x07uni0461\ +\x07uni0462\x07uni0463\ +\x07uni0464\x07uni0465\ +\x07uni0466\x07uni0467\ +\x07uni0468\x07uni0469\ +\x07uni046A\x07uni046B\ +\x07uni046C\x07uni046D\ +\x07uni046E\x07uni046F\ +\x07uni0470\x07uni0471\ +\x07uni0472\x07uni0473\ +\x07uni0474\x07uni0475\ +\x07uni0476\x07uni0477\ +\x07uni0478\x07uni0479\ +\x07uni047A\x07uni047B\ +\x07uni047C\x07uni047D\ +\x07uni047E\x07uni047F\ +\x07uni0480\x07uni0481\ +\x07uni0482\x07uni0483\ +\x07uni0484\x07uni0485\ +\x07uni0486\x07uni0488\ +\x07uni0489\x07uni048A\ +\x07uni048B\x07uni048C\ +\x07uni048D\x07uni048E\ +\x07uni048F\x07uni0492\ +\x07uni0493\x07uni0494\ +\x07uni0495\x07uni0496\ +\x07uni0497\x07uni0498\ +\x07uni0499\x07uni049A\ +\x07uni049B\x07uni049C\ +\x07uni049D\x07uni049E\ +\x07uni049F\x07uni04A0\ +\x07uni04A1\x07uni04A2\ +\x07uni04A3\x07uni04A4\ +\x07uni04A5\x07uni04A6\ +\x07uni04A7\x07uni04A8\ +\x07uni04A9\x07uni04AA\ +\x07uni04AB\x07uni04AC\ +\x07uni04AD\x07uni04AE\ +\x07uni04AF\x07uni04B0\ +\x07uni04B1\x07uni04B2\ +\x07uni04B3\x07uni04B4\ +\x07uni04B5\x07uni04B6\ +\x07uni04B7\x07uni04B8\ +\x07uni04B9\x07uni04BA\ +\x07uni04BB\x07uni04BC\ +\x07uni04BD\x07uni04BE\ +\x07uni04BF\x0buni04C0\ +.alt\x07uni04C1\x07uni\ +04C2\x07uni04C3\x07uni\ +04C4\x07uni04C5\x07uni\ +04C6\x07uni04C7\x07uni\ +04C8\x07uni04C9\x07uni\ +04CA\x07uni04CB\x07uni\ +04CC\x07uni04CD\x07uni\ +04CE\x0buni04CF.alt\ +\x07uni04D0\x07uni04D1\ +\x07uni04D2\x07uni04D3\ +\x07uni04D4\x07uni04D5\ +\x07uni04D6\x07uni04D7\ +\x07uni04D8\x07uni04D9\ +\x07uni04DA\x07uni04DB\ +\x07uni04DC\x07uni04DD\ +\x07uni04DE\x07uni04DF\ +\x07uni04E0\x07uni04E1\ +\x07uni04E2\x07uni04E3\ +\x07uni04E4\x07uni04E5\ +\x07uni04E6\x07uni04E7\ +\x07uni04E8\x07uni04E9\ +\x07uni04EA\x07uni04EB\ +\x07uni04EC\x07uni04ED\ +\x07uni04EE\x07uni04EF\ +\x07uni04F0\x07uni04F1\ +\x07uni04F2\x07uni04F3\ +\x07uni04F4\x07uni04F5\ +\x07uni04F6\x07uni04F7\ +\x07uni04F8\x07uni04F9\ +\x07uni04FA\x07uni04FB\ +\x07uni04FC\x07uni04FD\ +\x07uni04FE\x07uni04FF\ +\x07uni0500\x07uni0501\ +\x07uni0502\x07uni0503\ +\x07uni0504\x07uni0505\ +\x07uni0506\x07uni0507\ +\x07uni0508\x07uni0509\ +\x07uni050A\x07uni050B\ +\x07uni050C\x07uni050D\ +\x07uni050E\x07uni050F\ +\x07uni0510\x07uni0511\ +\x07uni0512\x07uni0513\ +\x07uni1EA0\x07uni1EA1\ +\x07uni1EA2\x07uni1EA3\ +\x07uni1EA4\x07uni1EA5\ +\x07uni1EA6\x07uni1EA7\ +\x07uni1EA8\x07uni1EA9\ +\x07uni1EAA\x07uni1EAB\ +\x07uni1EAC\x07uni1EAD\ +\x07uni1EAE\x07uni1EAF\ +\x07uni1EB0\x07uni1EB1\ +\x07uni1EB2\x07uni1EB3\ +\x07uni1EB4\x07uni1EB5\ +\x07uni1EB6\x07uni1EB7\ +\x07uni1EB8\x07uni1EB9\ +\x07uni1EBA\x07uni1EBB\ +\x07uni1EBC\x07uni1EBD\ +\x07uni1EBE\x07uni1EBF\ +\x07uni1EC0\x07uni1EC1\ +\x07uni1EC2\x07uni1EC3\ +\x07uni1EC4\x07uni1EC5\ +\x07uni1EC6\x07uni1EC7\ +\x0buni1EC8.alt\x07uni\ +1EC9\x0buni1ECA.alt\ +\x07uni1ECB\x07uni1ECC\ +\x07uni1ECD\x07uni1ECE\ +\x07uni1ECF\x07uni1ED0\ +\x07uni1ED1\x07uni1ED2\ +\x07uni1ED3\x07uni1ED4\ +\x07uni1ED5\x07uni1ED6\ +\x07uni1ED7\x07uni1ED8\ +\x07uni1ED9\x07uni1EDA\ +\x07uni1EDB\x07uni1EDC\ +\x07uni1EDD\x07uni1EDE\ +\x07uni1EDF\x07uni1EE0\ +\x07uni1EE1\x07uni1EE2\ +\x07uni1EE3\x07uni1EE4\ +\x07uni1EE5\x07uni1EE6\ +\x07uni1EE7\x07uni1EE8\ +\x07uni1EE9\x07uni1EEA\ +\x07uni1EEB\x07uni1EEC\ +\x07uni1EED\x07uni1EEE\ +\x07uni1EEF\x07uni1EF0\ +\x07uni1EF1\x07uni1EF4\ +\x07uni1EF5\x07uni1EF6\ +\x07uni1EF7\x07uni1EF8\ +\x07uni1EF9\x07uni20AB\ +\x07uni030F\x13circumf\ +lexacutecomb\x13cir\ +cumflexgravecomb\ +\x12circumflexhookc\ +omb\x13circumflexti\ +ldecomb\x0ebreveacu\ +tecomb\x0ebrevegrav\ +ecomb\x0dbrevehookc\ +omb\x0ebrevetildeco\ +mb\x10cyrillichookl\ +eft\x11cyrillicbigh\ +ookUC\x11cyrillicbi\ +ghookLC\x08one.pnum\ +\x07zero.os\x06one.os\x06\ +two.os\x08three.os\x07\ +four.os\x07five.os\x06\ +six.os\x08seven.os\x08\ +eight.os\x07nine.os\ +\x02ff\x07uni2120\x08Tced\ +illa\x08tcedilla\x05g.\ +alt\x0fgcircumflex.\ +alt\x0agbreve.alt\x08g\ +dot.alt\x10gcommaac\ +cent.alt\x01I\x06Igrav\ +e\x06Iacute\x0bIcircum\ +flex\x09Idieresis\x06I\ +tilde\x07Imacron\x06Ib\ +reve\x07Iogonek\x0aIdo\ +taccent\x02IJ\x09Iotat\ +onos\x04Iota\x0cIotadi\ +eresis\x09afii10055\ +\x09afii10056\x07uni04\ +C0\x07uni04CF\x07uni1E\ +C8\x07uni1ECA\x00\x00\x01\x00\x02\x00\ +\x08\x00\x0a\xff\xff\x00\x0f\x00\x01\x00\x00\x00\x0c\x00\x00\x00\ +\x16\x00\x00\x00\x02\x00\x01\x00\x00\x03\xa9\x00\x01\x00\x04\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x004\x00\ +6\x00\x01latn\x00\x08\x00\x10\x00\x02MOL\ + \x00\x16ROM \x00\x1c\x00\x00\xff\xff\x00\x00\x00\ +\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\ +\x01\x00\x00\x00\x0a\x00n\x01\xe4\x00\x01latn\x00\ +\x08\x00\x10\x00\x02MOL \x00(ROM \x00\ +B\x00\x00\xff\xff\x00\x09\x00\x03\x00\x08\x00\x0b\x00\x00\x00\ +\x0e\x00\x11\x00\x14\x00\x17\x00\x1a\x00\x00\xff\xff\x00\x0a\x00\ +\x04\x00\x06\x00\x09\x00\x0c\x00\x01\x00\x0f\x00\x12\x00\x15\x00\ +\x18\x00\x1b\x00\x00\xff\xff\x00\x0a\x00\x05\x00\x07\x00\x0a\x00\ +\x0d\x00\x02\x00\x10\x00\x13\x00\x16\x00\x19\x00\x1c\x00\x1dl\ +iga\x00\xb0liga\x00\xb6liga\x00\ +\xbclnum\x00\xc2lnum\x00\xc8lnu\ +m\x00\xcelocl\x00\xd4locl\x00\xdao\ +num\x00\xe0onum\x00\xe8onum\x00\ +\xf0pnum\x00\xf8pnum\x00\xfepnu\ +m\x01\x04salt\x01\x0asalt\x01\x12s\ +alt\x01\x1ass01\x01\x22ss01\x01\ +*ss01\x012ss02\x01:ss0\ +2\x01@ss02\x01Fss03\x01Ls\ +s03\x01Rss03\x01Xtnum\x01\ +^tnum\x01ftnum\x01n\x00\x00\x00\ +\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\ +\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\ +\x07\x00\x00\x00\x01\x00\x08\x00\x00\x00\x01\x00\x08\x00\x00\x00\ +\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\ +\x02\x00\x02\x00\x03\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\ +\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\ +\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\ +\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\ +\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\ +\x05\x00\x06\x00\x0a\x00\x16\x00\x1e\x00&\x00.\x006\x00\ +>\x00F\x00N\x00V\x00^\x00\x01\x00\x00\x00\x01\x00\ +P\x00\x01\x00\x00\x00\x01\x00z\x00\x01\x00\x00\x00\x01\x00\ +\xaa\x00\x01\x00\x00\x00\x01\x00\xc6\x00\x01\x00\x00\x00\x01\x00\ +\xee\x00\x01\x00\x00\x00\x01\x00\xf4\x00\x01\x00\x00\x00\x01\x01\ +\x10\x00\x01\x00\x00\x00\x01\x01\x16\x00\x01\x00\x00\x00\x01\x01\ +2\x00\x04\x00\x00\x00\x01\x01H\x00\x02\x00\x10\x00\x05\x03\ +\x91\x03\x92\x03\x93\x03\x94\x03\x95\x00\x02\x00\x05\x00J\x00\ +J\x00\x00\x00\xdf\x00\xdf\x00\x01\x00\xe1\x00\xe1\x00\x02\x00\ +\xe3\x00\xe3\x00\x03\x00\xe5\x00\xe5\x00\x04\x00\x02\x00.\x00\ +\x14\x00,\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\xea\x00\xec\x00\ +\xee\x00\xf0\x00\xf2\x00\xf4\x01Z\x01g\x01w\x01\xa1\x01\ +\xa2\x02\xc9\x02\xd8\x03E\x03G\x00\x02\x00\x01\x03\x96\x03\ +\xa9\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\x84\x03\x85\x03\ +\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x00\x02\x00\ +\x01\x00\x13\x00\x1c\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\ +\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\ +\x84\x00\x02\x00\x03\x00\x13\x00\x13\x00\x00\x00\x15\x00\x1c\x00\ +\x01\x03\x82\x03\x82\x00\x09\x00\x02\x00\x08\x00\x01\x03\x82\x00\ +\x01\x00\x01\x00\x14\x00\x02\x00\x1a\x00\x0a\x00\x13\x00\x14\x00\ +\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\ +\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x08\x00\x01\x00\ +\x14\x00\x01\x00\x01\x03\x82\x00\x02\x00\x1a\x00\x0a\x00\x13\x03\ +\x82\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\ +\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\x0e\x00\ +\x04\x03\x8f\x03\x90\x01 \x01!\x00\x02\x00\x02\x01$\x01\ +%\x00\x00\x01I\x01J\x00\x02\x00\x01\x006\x00\x01\x00\ +\x08\x00\x05\x00\x0c\x00\x14\x00\x1c\x00\x22\x00(\x02^\x00\ +\x03\x00I\x00O\x02]\x00\x03\x00I\x00L\x03\x8d\x00\ +\x02\x00I\x025\x00\x02\x00O\x024\x00\x02\x00L\x00\ +\x01\x00\x01\x00I\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\ +\x00\x00\x01\x00\x00\x15^\x00\x00\x00\x14\x00\x00\x00\x00\x00\ +\x00\x15V0\x82\x15R\x06\x09*\x86H\x86\xf7\x0d\x01\ +\x07\x02\xa0\x82\x15C0\x82\x15?\x02\x01\x011\x0b0\ +\x09\x06\x05+\x0e\x03\x02\x1a\x05\x000a\x06\x0a+\x06\ +\x01\x04\x01\x827\x02\x01\x04\xa0S0Q0,\x06\x0a\ ++\x06\x01\x04\x01\x827\x02\x01\x1c\xa2\x1e\x80\x1c\x00<\ +\x00<\x00<\x00O\x00b\x00s\x00o\x00l\x00e\ +\x00t\x00e\x00>\x00>\x00>0!0\x09\x06\x05\ ++\x0e\x03\x02\x1a\x05\x00\x04\x14V\x0aD\xc0\xcaX\x13\ +T_\x1a\xb0\xa6)\xf92\xaf\x92\x1f\x7f\x17\xa0\x82\x11\ +]0\x82\x03z0\x82\x02b\xa0\x03\x02\x01\x02\x02\x10\ +8%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd5\ +0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000\ +S1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1+0)\x06\x03U\x04\x03\ +\x13\x22VeriSign Time \ +Stamping Service\ +s CA0\x1e\x17\x0d07061500\ +0000Z\x17\x0d120614235\ +959Z0\x5c1\x0b0\x09\x06\x03U\x04\x06\x13\ +\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVe\ +riSign, Inc.1402\ +\x06\x03U\x04\x03\x13+VeriSign \ +Time Stamping Se\ +rvices Signer - \ +G20\x81\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\ +\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xc4\ +\xb5\xf2R\x15\xbc\x88\x86`)\x16J[/K\x91k\ +\x87\x91\xf35TX5\xea\xd16^bMRQ4\ +q\xc2{f\x1d\x89\xc8\xdd*\xc4j\x0a\xf67\xd9\x98\ +t\x91\xf6\x92\xae\xb0\xb5v\x96\xf1\xa9JcEG.\ +k\x0b\x92NK+\x8c\xeeXJ\x8b\xd4\x07\xe4\x1a,\ +\xf8\x82\xaaX\xd9\xcdB\xf3-\xc0u\xde\x8d\xab\xc7\x8e\ +\x1d\x9alL\x08\x95\x1e\xde\xdb\xefg\xe1r\xc2I\xc2\ +\x9e`<\xe1\xe2\xbe\x16\xa3cxi\x14{\xad-\x02\ +\x03\x01\x00\x01\xa3\x81\xc40\x81\xc104\x06\x08+\x06\ +\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\x08+\x06\ +\x01\x05\x05\x070\x01\x86\x18http://o\ +csp.verisign.com\ +0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x020\x0003\ +\x06\x03U\x1d\x1f\x04,0*0(\xa0&\xa0$\x86\ +\x22http://crl.veri\ +sign.com/tss-ca.\ +crl0\x16\x06\x03U\x1d%\x01\x01\xff\x04\x0c0\ +\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\x06\x03U\ +\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x06\xc00\x1e\x06\x03U\ +\x1d\x11\x04\x170\x15\xa4\x130\x111\x0f0\x0d\x06\x03\ +U\x04\x03\x13\x06TSA1-20\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00P\ +\xc5K\xc8$\x80\xdf\xe4\x0d$\xc2\xde\x1a\xb1\xa1\x02\xa1\ +\xa6\x82-\x0c\x83\x15\x817\x0a\x82\x0e,\xb0Z\x17a\ +\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\x91\xb3V\x1a@\xa6\xeb\x92\ +\xbe89\xb0u6t:\x98O\xe47\xba\x99\x89\xca\ +\x95B\x1d\xb0\xb9\xc7\xa0\x8dW\xe0\xfa\xd5d\x04B5\ +N\x01\xd13\xa2\x17\xc8M\xaa'\xc7\xf2\xe1\x86L\x02\ +8M\x83x\xc6\xfcS\xe0\xeb\xe0\x06\x87\xdd\xa4\x96\x9e\ +^\x0c\x98\xe2\xa5\xbe\xbf\x82\x85\xc3`\xe1\xdf\xad(\xd8\ +\xc7\xa5Kd\xda\xc7\x1b[\xbd\xac9\x08\xd58\x22\xa1\ +3\x8b/\x8a\x9a\xeb\xbc\x07!?DA\x09\x07\xb5e\ +\x1c$\xbcH\xd3D\x80\xeb\xa1\xcf\xc9\x02\xb4\x14\xcfT\ +\xc7\x16\xa3\x80\x5c\xf9y>]r}\x88\x17\x9e,C\ +\xa2\xcaS\xce}=\xf6*:\xb8O\x94\x00\xa5m\x0a\ +\x83]\xf9^S\xf4\x18\xb3W\x0fp\xc3\xfb\xf5\xad\x95\ +\xa0\x0e\x17\xde\xc4\x16\x80`\xc9\x0f+n\x86\x04\xf1\xeb\ +\xf4x'\xd1\x05\xc5\xee4[^\xb9I2\xf230\ +\x82\x03\xc40\x82\x03-\xa0\x03\x02\x01\x02\x02\x10G\xbf\ +\x19\x95\xdf\x8dRFC\xf7\xdbmH\x0d1\xa40\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\x8b\ +1\x0b0\x09\x06\x03U\x04\x06\x13\x02ZA1\x150\ +\x13\x06\x03U\x04\x08\x13\x0cWestern \ +Cape1\x140\x12\x06\x03U\x04\x07\x13\x0bD\ +urbanville1\x0f0\x0d\x06\x03\ +U\x04\x0a\x13\x06Thawte1\x1d0\x1b\x06\ +\x03U\x04\x0b\x13\x14Thawte Cer\ +tification1\x1f0\x1d\x06\x03\ +U\x04\x03\x13\x16Thawte Time\ +stamping CA0\x1e\x17\x0d0\ +31204000000Z\x17\x0d13\ +1203235959Z0S1\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1+0)\x06\x03U\x04\x03\x13\x22Ve\ +riSign Time Stam\ +ping Services CA\ +0\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\ +\x00\xa9\xca\xb2\xa4\xcc\xcd \xaf\x0a}\x89\xac\x87u\xf0\ +\xb4N\xf1\xdf\xc1\x0f\xbfga\xbd\xa3d\x1c\xda\xbb\xf9\ +\xca3\xab\x840\x89X~\x8c\xdbk\xdd6\x9e\x0f\xbf\ +\xd1\xecx\xf2w\xa6~o<\xbf\x93\xaf\x0d\xbah\xf4\ +l\x94\xca\xbdR-\xabH=\xf5\xb6\xd5]_\x1b\x02\ +\x9f\xfa/k\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\x02\xe1\x7fL\ +R\xe3\x0e`\xec@\x1c~\xb9\x0d\xde?\xc7\xb4\xdf\x87\ +\xbd_zj1.\x03\x99\x81\x13\xa8G \xce1s\ +\x0dW-\xcdx43\x95\x12\x99\x12\xb9\xdeh/\xaa\ +\xe6\xe3\xc2\x8a\x8c*\xc3\x8b!\x87f\xbd\x83XWo\ +u\xbf<\xaa&\x87]\xca\x10\x15<\x9f\x84\xeaT\xc1\ +\x0an\xc4\xfe\xc5J\xdd\xb9\x07\x11\x97\x22|\xdb>'\ +\xd1\x1ex\xec\x9f1\xc9\xf1\xe6\x22\x19\xdb\xc4\xb3GC\ +\x9a\x1a_\xa0\x1e\x90\xe4^\xf5\xee|\xf1}\xabb\x01\ +\x8f\xf5M\x0b\xde\xd0\x22V\xa8\x95\xcd\xae\x88v\xae\xee\ +\xba\x0d\xf3\xe4M\xd9\xa0\xfbh\xa0\xae\x14;\xb3\x87\xc1\ +\xbb\x02\x03\x01\x00\x01\xa3\x81\xdb0\x81\xd804\x06\x08\ ++\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\x08\ ++\x06\x01\x05\x05\x070\x01\x86\x18http:/\ +/ocsp.verisign.c\ +om0\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\ +\x01\x01\xff\x02\x01\x000A\x06\x03U\x1d\x1f\x04:0\ +806\xa04\xa02\x860http://\ +crl.verisign.com\ +/ThawteTimestamp\ +ingCA.crl0\x13\x06\x03U\x1d%\ +\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\x0e\ +\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x060$\ +\x06\x03U\x1d\x11\x04\x1d0\x1b\xa4\x190\x171\x150\ +\x13\x06\x03U\x04\x03\x13\x0cTSA2048-\ +1-530\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x00\x03\x81\x81\x00Jk\xf9\xeaX\xc2D\x1c1\ +\x89y\x99+\x96\xbf\x82\xac\x01\xd6\x1cL\xcd\xb0\x8aX\ +n\xdf\x08)\xa3^\xc8\xca\x93\x13\xe7\x04R\x0d\xefG\ +'/\x008\xb0\xe4\xc9\x93N\x9a\xd4\x22b\x15\xf7?\ +7!Op1\x80\xf1\x8b8\x87\xb3\xe8\xe8\x97\x00\xfe\ +\xcfU\x96N$\xd2\xa9'Nz\xae\xb7aA\xf3*\ +\xce\xe7\xc9\xd9^\xdd\xbb+\x85>\xb5\x9d\xb5\xd9\xe1W\ +\xff\xbe\xb4\xc5~\xf5\xcf\x0c\x9e\xf0\x97\xfe+\xd3;R\ +\x1b\x1b8'\xf7?J0\x82\x04\xfc0\x82\x04e\xa0\ +\x03\x02\x01\x02\x02\x10eR&\xe1\xb2.\x18\xe1Y\x0f\ +)\x85\xac\x22\xe7\x5c0\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x000_1\x0b0\x09\x06\x03U\x04\x06\ +\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0eV\ +eriSign, Inc.170\ +5\x06\x03U\x04\x0b\x13.Class 3 \ +Public Primary C\ +ertification Aut\ +hority0\x1e\x17\x0d090521\ +000000Z\x17\x0d1905202\ +35959Z0\x81\xb61\x0b0\x09\x06\x03U\ +\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\ +\x0eVeriSign, Inc.1\ +\x1f0\x1d\x06\x03U\x04\x0b\x13\x16VeriSi\ +gn Trust Network\ +1;09\x06\x03U\x04\x0b\x132Terms\ + of use at https\ +://www.verisign.\ +com/rpa (c)09100\ +.\x06\x03U\x04\x03\x13'VeriSign\ + Class 3 Code Si\ +gning 2009-2 CA0\ +\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x01\ +\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\x82\x01\x01\x00\ +\xbeg\x1d\xb4`\xaa\x10IoV\x17|f\xc9^\x86\ +\x0d\xd5\xf1\xac\xa7q\x83\x8e\x8b\x89\xf8\x88\x04\x89\x15\x06\ +\xba-\x84!\x95\xe4\xd1\x9cPL\xfb\xd2\x22\xbd\xda\xf2\ +\xb25;\x1e\x8f\xc3\x09\xfb\xfc\x13.Z\xbf\x89|=\ +;%\x1e\xf6\xf3X{\x9c\xf4\x01\xb5\xc6\x0a\xb8\x80\xce\ +\xbe'tag'Mj\xe5\xec\x81aXy\xa3\xe0\ +\x17\x10\x12\x15'\xb0\xe1M4\x7f+G D\xb9\xde\ +f$f\x8a\xcdO\xba\x1f\xc58\xc8T\x90\xe1r\xf6\ +\x19fuj\xb9Ih\xcf8y\x0d\xaa0\xa8\xdb,\ +`H\x9e\xd7\xaa\x14\x01\xa9\x83\xd78\x9109\x13\x96\ +\x03:|@T\xb6\xad\xe0/\x1b\x83\xdc\xa8\x11R>\ +\x02\xb3\xd7+\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\xa9\xa6\x10P\ +\x0e4.M\xa7\xce\xc9^%\xd4\x8c\xbc\xf3n|)\ +\xbc\x01]\xfc1\x87Z\xd5\x8c\x85gX\x88\x19\xa0\xbf\ +5\xf0\xea+\xa3!\xe7\x90\xf6\x83\xe5\xa8\xed`x^\ +{`\x83\xfdW\x0b]A\x0dcT`\xd6C!\xef\ +\x02\x03\x01\x00\x01\xa3\x82\x01\xdb0\x82\x01\xd70\x12\x06\ +\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\ +\x000p\x06\x03U\x1d \x04i0g0e\x06\x0b\ +`\x86H\x01\x86\xf8E\x01\x07\x17\x030V0(\x06\ +\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps\ +://www.verisign.\ +com/cps0*\x06\x08+\x06\x01\x05\x05\ +\x07\x02\x020\x1e\x1a\x1chttps://w\ +ww.verisign.com/\ +rpa0\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\ +\x02\x01\x060m\x06\x08+\x06\x01\x05\x05\x07\x01\x0c\x04\ +a0_\xa1]\xa0[0Y0W0U\x16\x09i\ +mage/gif0!0\x1f0\x07\x06\x05\ ++\x0e\x03\x02\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\xac\x8d\x8ek\ +\xc3\xcf\x80j\xd4H\x18,{\x19.0%\x16#h\ +ttp://logo.veris\ +ign.com/vslogo.g\ +if0\x1d\x06\x03U\x1d%\x04\x160\x14\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\x05\x05\x07\x03\ +\x0304\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0\ +&0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18h\ +ttp://ocsp.veris\ +ign.com01\x06\x03U\x1d\x1f\x04*\ +0(0&\xa0$\xa0\x22\x86 http:/\ +/crl.verisign.co\ +m/pca3.crl0)\x06\x03U\x1d\ +\x11\x04\x220 \xa4\x1e0\x1c1\x1a0\x18\x06\x03U\ +\x04\x03\x13\x11Class3CA2048\ +-1-550\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\ +\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\ +\xa4\xa1\x1e\xf20\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x00\x03\x81\x81\x00\x8b\x03\xc0\xdd\x94\xd8A\xa2a\ +i\xb0\x15\xa8x\xc70\xc6\x90<~B\xf7$\xb6\xe4\ +\x83s\x17\x04\x7f\x04\x10\x9c\xa1\xe2\xfa\x81/\xeb\xc0\xca\ +D\xe7r\xe0P\xb6U\x10 \x83n\x96\x92\xe4\x9aQ\ +j\xb471\xdc\xa5-\xeb\x8c\x00\xc7\x1dO\xe7M2\ +\xba\x85\xf8N\xbe\xfagUe\xf0j\xbez\xcad8\ +\x1a\x10\x10xEv1\xf3\x86z\x03\x0f`\xc2\xb3]\ +\x9d\xf6\x8bfv\x82\x1bY\xe1\x83\xe5\xbdI\xa58V\ +\xe5\xdeAw\x0eX\x0f0\x82\x05\x130\x82\x03\xfb\xa0\ +\x03\x02\x01\x02\x02\x10f\xe3\xf0gy\xca\x15\x16mP\ +So\x88\x19\x1a\x830\x0d\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x01\x05\x05\x000\x81\xb61\x0b0\x09\x06\x03U\x04\ +\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0e\ +VeriSign, Inc.1\x1f\ +0\x1d\x06\x03U\x04\x0b\x13\x16VeriSig\ +n Trust Network1\ +;09\x06\x03U\x04\x0b\x132Terms \ +of use at https:\ +//www.verisign.c\ +om/rpa (c)09100.\ +\x06\x03U\x04\x03\x13'VeriSign \ +Class 3 Code Sig\ +ning 2009-2 CA0\x1e\ +\x17\x0d100729000000Z\x17\ +\x0d120808235959Z0\x81\ +\xd01\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x16\ +0\x14\x06\x03U\x04\x08\x13\x0dMassach\ +usetts1\x0f0\x0d\x06\x03U\x04\x07\x13\ +\x06Woburn1\x1e0\x1c\x06\x03U\x04\x0a\ +\x14\x15Monotype Imagi\ +ng Inc.1>0<\x06\x03U\x04\x0b\ +\x135Digital ID Cla\ +ss 3 - Microsoft\ + Software Valida\ +tion v21\x180\x16\x06\x03U\x04\x0b\ +\x14\x0fType Operation\ +s1\x1e0\x1c\x06\x03U\x04\x03\x14\x15Mono\ +type Imaging Inc\ +.0\x81\x9f0\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x94D\ +\xa0\x95i|U\x0d\xd0\xdb\x16\x8d25\x8aL3\xab\ +^ \xa1L\xd7*\x878\xd7\x98\xa5@\xf0\x19I\x0b\ +\x22\x1eSO\xc2C\xa6\xca\x8b\xa9V\xefnH\x06\xa8\ +\x05\x159\x1ec;$\x12\x90\xb9\x98\xcf\xca\x085}\ +r\xe3GW\xfdy\xcb\x8aJ\xe7@p-5c\x7f\ +\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\xd7\xa4\xa0\xdb\ +\x09\xf2\xa2\xf2{\xef\xcdu\xc1\xf7ePd\x22\x9d\xbd\ +}\xbc\xad\xb8K\xccXE\x0eM\xd1YLM\x02\x03\ +\x01\x00\x01\xa3\x82\x01\x830\x82\x01\x7f0\x09\x06\x03U\ +\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\ +\x04\x04\x03\x02\x07\x800D\x06\x03U\x1d\x1f\x04=0\ +;09\xa07\xa05\x863http://\ +csc3-2009-2-crl.\ +verisign.com/CSC\ +3-2009-2.crl0D\x06\x03\ +U\x1d \x04=0;09\x06\x0b`\x86H\x01\x86\ +\xf8E\x01\x07\x17\x030*0(\x06\x08+\x06\x01\x05\ +\x05\x07\x02\x01\x16\x1chttps://ww\ +w.verisign.com/r\ +pa0\x13\x06\x03U\x1d%\x04\x0c0\x0a\x06\x08+\ +\x06\x01\x05\x05\x07\x03\x030u\x06\x08+\x06\x01\x05\x05\ +\x07\x01\x01\x04i0g0$\x06\x08+\x06\x01\x05\x05\ +\x070\x01\x86\x18http://ocsp\ +.verisign.com0?\x06\ +\x08+\x06\x01\x05\x05\x070\x02\x863http:\ +//csc3-2009-2-ai\ +a.verisign.com/C\ +SC3-2009-2.cer0\x1f\ +\x06\x03U\x1d#\x04\x180\x16\x80\x14\x97\xd0k\xa8&\ +p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\xa1\x1e\xf20\ +\x11\x06\x09`\x86H\x01\x86\xf8B\x01\x01\x04\x04\x03\x02\ +\x04\x100\x16\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1b\ +\x04\x080\x06\x01\x01\x00\x01\x01\xff0\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00N\xe6\ +\x22\x87\xdfgA\x15\x17\xe2\xd2\xee~\x0e\xce\xc2\x99\xd6\ +c\xbd\xf0\xb5\x93\xe5jrb\xe1\xf5\xd2<8\xee\xa8\ +=\x08_\xbaG\x81\x82_[KI\xf4\x1d \xfa\x0f\ +\x93\x09\xd0\x1d\x19VD\x17\xa2\x88\xf3\xfb\x8d\x9d\xae\xf7\ +\x0d5\xde<\x0c\xacD\x94`E*\x9b\xfe\x9boL\ +;\xb14gp\x10\x86\xffZ9\x5cZ\xe3l\x82\xab\ +5|eK\xfd\x98m\xb5\x15\x94I\x9c\x88p\x10\xbe\ +=\xb1b\x95\xb4\xdb\xb4\xd4\xda\xe8\x9dA\x90~\xfe}\ +\xb9\xa4\x92\xebn\xf2\x22\x8a\xc6w6M\x8aZ\x0bS\ +\x051\xd3+(\xafR\xe1\x8dzk\xb5wD\xbd\x0c\ +\xad\xf4]%,\xe3\xcd\x8a0>K\x03\x9cy\xca\xa6\ +N\xae\x0b\xc2\xcc$\x07\x0b\xc1\x94\x82\xf6\x10\xf1\xba\x90\ +\xb6\x9b\x9a\xd8\x5c<\x13\xf1\xea\x02\x06\x18'M<\x89\ +o3\x8a\xd3\x86\xde\xe9X3u=\xeb\x93i\xe2D\ +oN\x00l\xcf\xd5\x85\xdaV\xa6\x9a\xa6?\xcbL!\ +h\x90\xf2`\xba\xe1\xe8\x06]9!\x132\xed1\x82\ +\x03g0\x82\x03c\x02\x01\x010\x81\xcb0\x81\xb61\ +\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\ +\x06\x03U\x04\x0a\x13\x0eVeriSign,\ + Inc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16\ +VeriSign Trust N\ +etwork1;09\x06\x03U\x04\x0b\x13\ +2Terms of use at\ + https://www.ver\ +isign.com/rpa (c\ +)09100.\x06\x03U\x04\x03\x13'Ve\ +riSign Class 3 C\ +ode Signing 2009\ +-2 CA\x02\x10f\xe3\xf0gy\xca\x15\x16m\ +PSo\x88\x19\x1a\x830\x09\x06\x05+\x0e\x03\x02\x1a\ +\x05\x00\xa0p0\x10\x06\x0a+\x06\x01\x04\x01\x827\x02\ +\x01\x0c1\x020\x000\x19\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x031\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\ +\x040\x1c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x0b1\ +\x0e0\x0c\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x150\ +#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\x16\x04\x14\ +\x99v\xbe:\x0b4\x99U\xc7\x89\x8d\x13\xb1&\x04\xd7\ +|x\x18\x890\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x01\x05\x00\x04\x81\x80\x1bm>\xa4?B\xbd\xc4*P\ +\xbc`\x13\xafz\xa3>\xa5G\x9a\xbe\x92^^\xfe\x86\ +\xcc\xfd\xc2\xfdwE\x1e\xc5\xc6\xc5\x95\xf5u\x0c\xeau\ +\xc3c~\x8a\x9d\x9a\xddE%\xc9\x12\xeeI\x0a,\xbd\ +]4\xad@\x86\xb7X\x9c\x1c\x88dV^P\x09\xfe\ +\xbd\x9e#\xd4aez\x5cU\x07>\x07\x9f\x85 \x0e\ +\x815`K\xed-\xea\x06s\xcc\x186\xfa\xde\xe0\xda\ +\xea\x0b\xdfM\x97\xbe\xd1\xf3\x04\xc7u\x92\x02\x95u\xc1\ +\xdf\xb8\x83\x05\xff\xaf\xa1\x82\x01\x7f0\x82\x01{\x06\x09\ +*\x86H\x86\xf7\x0d\x01\x09\x061\x82\x01l0\x82\x01\ +h\x02\x01\x010g0S1\x0b0\x09\x06\x03U\x04\ +\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\x13\x0e\ +VeriSign, Inc.1+\ +0)\x06\x03U\x04\x03\x13\x22VeriSig\ +n Time Stamping \ +Services CA\x02\x108%\xd7\ +\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\xd50\x09\x06\ +\x05+\x0e\x03\x02\x1a\x05\x00\xa0]0\x18\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x031\x0b\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x07\x010\x1c\x06\x09*\x86H\x86\xf7\x0d\x01\x09\ +\x051\x0f\x17\x0d11050516550\ +9Z0#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x041\ +\x16\x04\x14\x8d\xd9s\x0e\xc1\xc0\xcdz\x96\xfa\x11\xe9l\ +\xa6\xabS\xc3\x86\xaaR0\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x01\x05\x00\x04\x81\x80\x88\xc4<\x96\x91am\ +\xea\xf1\xc2\xb85\x82\xbe\xb80\xe6K/\xc2\x0e\x8c~\ +\x08m\xae9\xcf\x10\x82\x90\x902\xfbZ\xdc\x15\xee\xae\ +Cf\xb9\xccu\xe8\x0c\x8e\xc4<\x8d\xa4\x97;?K\ +F\x0b\xcdF\x19fZ\xa2\xaa\x00d\xbc\xdf\x9cX\x96\ +\x8c\xc6t\xb5\x03\xe8''\x17\xef$\x9c\xda\xff\xa5\xce\ +oH\xda\xd2v\xe7\xd8Z\xd88n\xe5\xcb\xa9\xbb\x10\ +\xa9\xa9d?\x12x5\xf8\xd4j4%\x8b\x98nW\ +\xe6HZ^\x950{\x84\xff\x00\x00\ +\x00\x03mP\ +\x00\ +\x01\x00\x00\x00\x13\x01\x00\x00\x04\x000DSIG\x92\ +\x18t:\x00\x03W\xdc\x00\x00\x15tGDEF\x00\ +&\x03\xaf\x00\x03S\xbc\x00\x00\x00\x1eGPOS\x0b\ +7\x0f7\x00\x03S\xdc\x00\x00\x008GSUB\x0e\ ++=\xb7\x00\x03T\x14\x00\x00\x03\xc6OS/2\xa2\ +u\xa1\x18\x00\x00\x01\xb8\x00\x00\x00`cmap)\ +\xab/h\x00\x00\x10\xb4\x00\x00\x04\x1acvt \x13\ +-\x1a\x94\x00\x00\x1d\xa8\x00\x00\x00\xaafpgm\xbb\ +s\xa4u\x00\x00\x14\xd0\x00\x00\x07\xe0gasp\x00\ +\x08\x00\x1b\x00\x03S\xb0\x00\x00\x00\x0cglyf\x1d\ +\x7f\xca\xf4\x00\x00%\xac\x00\x01K\xc4head\xf7\ +\xe1\xc7\x0e\x00\x00\x01<\x00\x00\x006hhea\x0e\ +)\x0aR\x00\x00\x01t\x00\x00\x00$hmtx$\ +\xd2\x06\x00\x00\x00\x02\x18\x00\x00\x0e\x9akernT\ ++\x09~\x00\x01qp\x00\x01\xb66loca\xb2\ +\xdb`+\x00\x00\x1eT\x00\x00\x07Vmaxp\x05\ +5\x02\x1f\x00\x00\x01\x98\x00\x00\x00 name\xbc\ +f{\x22\x00\x03'\xa8\x00\x00\x05\xdcpost\x02\ +C\xefl\x00\x03-\x84\x00\x00&+prep\xc8\ +\x09\xfck\x00\x00\x1c\xb0\x00\x00\x00\xf8\x00\x01\x00\x00\x00\ +\x01\x19\x9a:\xa99\xb3_\x0f<\xf5\x00\x09\x08\x00\x00\ +\x00\x00\x00\xc9B\x17\xa0\x00\x00\x00\x00\xc9\xe8J\xa1\xfb\ +\x0c\xfd\xa8\x0a\x8d\x08\x8d\x00\x01\x00\x09\x00\x02\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x08\x8d\xfd\xa8\x00\x00\x0a\x8d\xfb\ +\x0c\xfey\x0a\x8d\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x03\xa3\x00\x01\x00\x00\x03\xaa\x00\x8a\x00\ +\x16\x00X\x00\x05\x00\x02\x00\x10\x00/\x00\x5c\x00\x00\x01\ +\x00\x01\x0b\x00\x03\x00\x01\x00\x03\x05\x0f\x02\xbc\x00\x05\x00\ +\x08\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\ +\xd1\x00f\x01\xfc\x08\x02\x02\x0b\x08\x06\x03\x05\x04\x02\x02\ +\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\ +\x001ASC\x00 \x00 \xff\xfd\x06\x1f\xfe\x14\x00\ +\x84\x08\x8d\x02X \x00\x01\x9f\x00\x00\x00\x00\x04^\x05\ +\xb6\x00\x00\x00 \x00\x03\x04\xcd\x00\xc1\x00\x00\x00\x00\x04\ +\x14\x00\x00\x02\x14\x00\x00\x02J\x00u\x03\xc7\x00\x85\x05\ ++\x00-\x04\x91\x00X\x075\x00?\x06\x00\x00R\x02\ +!\x00\x85\x02\xb6\x00R\x02\xb6\x00=\x04\x5c\x00?\x04\ +\x91\x00X\x02R\x00?\x02\x93\x00=\x02H\x00u\x03\ +N\x00\x0e\x04\x91\x00J\x04\x91\x00y\x04\x91\x00N\x04\ +\x91\x00N\x04\x91\x00#\x04\x91\x00d\x04\x91\x00H\x04\ +\x91\x007\x04\x91\x00H\x04\x91\x00B\x02H\x00u\x02\ +R\x00?\x04\x91\x00X\x04\x91\x00X\x04\x91\x00X\x03\ +\xd1\x00\x06\x07-\x00f\x05\x85\x00\x00\x05`\x00\xb8\x05\ +\x19\x00w\x05\xec\x00\xb8\x04{\x00\xb8\x04d\x00\xb8\x05\ +\xcb\x00w\x06\x1f\x00\xb8\x03\x1d\x00B\x02\xa6\xffh\x05\ +P\x00\xb8\x04\x85\x00\xb8\x07\x8b\x00\xb8\x06\x81\x00\xb8\x06\ +^\x00w\x05\x06\x00\xb8\x06^\x00w\x05H\x00\xb8\x04\ +h\x00^\x04\xa2\x00)\x06\x0c\x00\xae\x053\x00\x00\x07\ +\xbc\x00\x00\x05V\x00\x00\x04\xfe\x00\x00\x04\xa2\x001\x02\ +\xa6\x00\x8f\x03N\x00\x0c\x02\xa6\x003\x04B\x00\x08\x03\ +J\xff\xfc\x04\xdb\x01L\x04\xd5\x00V\x05\x10\x00\xa0\x04\ +\x1d\x00\x5c\x05\x10\x00\x5c\x04\xba\x00\x5c\x03\x19\x00)\x04\ +\x85\x00\x06\x05B\x00\xa0\x02q\x00\x93\x02q\xff}\x04\ +\xf6\x00\xa0\x02q\x00\xa0\x07\xdb\x00\xa0\x05B\x00\xa0\x04\ +\xf4\x00\x5c\x05\x10\x00\xa0\x05\x10\x00\x5c\x03\xa2\x00\xa0\x03\ +\xfa\x00\x5c\x03y\x00/\x05B\x00\x9a\x04\x8d\x00\x00\x06\ +\xd9\x00\x14\x04\xa0\x00\x0a\x04\x8d\x00\x00\x03\xe7\x007\x03\ +'\x00\x1f\x04h\x01\xc7\x03'\x00R\x04\x91\x00X\x02\ +\x14\x00\x00\x02J\x00u\x04\x91\x00\x8f\x04\x91\x00R\x04\ +\x91\x00q\x04\x91\x00\x06\x04h\x01\xc7\x03\xe3\x00j\x04\ +\xdb\x01\x17\x06\xa8\x00d\x03\x10\x00/\x04\xec\x00R\x04\ +\x91\x00X\x02\x93\x00=\x06\xa8\x00d\x04\x00\xff\xfa\x03\ +m\x00\x5c\x04\x91\x00X\x03\x08\x00/\x03\x08\x00;\x04\ +\xdb\x01L\x05H\x00\xa0\x05=\x00q\x02H\x00u\x01\ +\xa4\xff\xdb\x03\x08\x00\x5c\x03\x1b\x009\x04\xec\x00R\x07\ +\x0c\x00.\x07\x0c\x00.\x07\x0c\x00Z\x03\xd1\x00=\x05\ +\x85\x00\x00\x05\x85\x00\x00\x05\x85\x00\x00\x05\x85\x00\x00\x05\ +\x85\x00\x00\x05\x85\x00\x00\x07\x9e\x00\x00\x05\x19\x00w\x04\ +{\x00\xb8\x04{\x00\xb8\x04{\x00\xaf\x04{\x00\xb8\x03\ +\x1d\x00*\x03\x1d\x00B\x03\x1d\xff\xdc\x03\x1d\x009\x05\ +\xec\x00/\x06\x81\x00\xb8\x06^\x00w\x06^\x00w\x06\ +^\x00w\x06^\x00w\x06^\x00w\x04\x91\x00\x81\x06\ +^\x00w\x06\x0c\x00\xae\x06\x0c\x00\xae\x06\x0c\x00\xae\x06\ +\x0c\x00\xae\x04\xfe\x00\x00\x05\x06\x00\xb8\x05\xb0\x00\xa0\x04\ +\xd5\x00V\x04\xd5\x00V\x04\xd5\x00V\x04\xd5\x00V\x04\ +\xd5\x00V\x04\xd5\x00V\x07V\x00V\x04\x1d\x00\x5c\x04\ +\xba\x00\x5c\x04\xba\x00\x5c\x04\xba\x00\x5c\x04\xba\x00\x5c\x02\ +q\xff\x9b\x02q\x00\x91\x02q\xff\x86\x02q\xff\xe3\x04\ +\xf4\x00\x5c\x05B\x00\xa0\x04\xf4\x00\x5c\x04\xf4\x00\x5c\x04\ +\xf4\x00\x5c\x04\xf4\x00\x5c\x04\xf4\x00\x5c\x04\x91\x00X\x04\ +\xf4\x00\x5c\x05B\x00\x9a\x05B\x00\x9a\x05B\x00\x9a\x05\ +B\x00\x9a\x04\x8d\x00\x00\x05\x10\x00\xa0\x04\x8d\x00\x00\x05\ +\x85\x00\x00\x04\xd5\x00V\x05\x85\x00\x00\x04\xd5\x00V\x05\ +\x85\x00\x00\x04\xd5\x00V\x05\x19\x00w\x04\x1d\x00\x5c\x05\ +\x19\x00w\x04\x1d\x00\x5c\x05\x19\x00w\x04\x1d\x00\x5c\x05\ +\x19\x00w\x04\x1d\x00\x5c\x05\xec\x00\xb8\x05\x10\x00\x5c\x05\ +\xec\x00/\x051\x00\x5c\x04{\x00\xb8\x04\xba\x00\x5c\x04\ +{\x00\xb8\x04\xba\x00\x5c\x04{\x00\xb8\x04\xba\x00\x5c\x04\ +{\x00\xb8\x04\xba\x00\x5c\x04{\x00\xaf\x04\xba\x00\x5c\x05\ +\xcb\x00w\x04\x85\x00\x06\x05\xcb\x00w\x04\x85\x00\x06\x05\ +\xcb\x00w\x04\x85\x00\x06\x05\xcb\x00w\x04\x85\x00\x06\x06\ +\x1f\x00\xb8\x05B\x00\xa0\x06\x1f\x00\x00\x05B\x00\x04\x03\ +\x1d\xff\xf1\x02q\xff\x9b\x03\x1d\x00?\x02q\xff\xe9\x03\ +\x1d\x00\x07\x02q\xff\xaf\x03\x1d\x00B\x02q\x00+\x03\ +\x1d\x00B\x02q\x00\xa0\x05\xc3\x00B\x04\xba\x00\x93\x02\ +\xa6\xffh\x02q\xff}\x05P\x00\xb8\x04\xf6\x00\xa0\x04\ +\xf6\x00\xa0\x04\x85\x00\xb8\x02q\x00\xa0\x04\x85\x00\xb8\x02\ +q\x00c\x04\x85\x00\xb8\x02q\x00\xa0\x04\x85\x00\xb8\x03\ +m\x00\xa0\x04\x85\x00\x02\x02\xa4\x00\x00\x06\x81\x00\xb8\x05\ +B\x00\xa0\x06\x81\x00\xb8\x05B\x00\xa0\x06\x81\x00\xb8\x05\ +B\x00\xa0\x06;\x00\x06\x06\x81\x00\xb8\x05B\x00\xa0\x06\ +^\x00w\x04\xf4\x00\x5c\x06^\x00w\x04\xf4\x00\x5c\x06\ +^\x00w\x04\xf4\x00\x5c\x07\xc9\x00w\x07\xd3\x00\x5c\x05\ +H\x00\xb8\x03\xa2\x00\xa0\x05H\x00\xb8\x03\xa2\x00c\x05\ +H\x00\xb8\x03\xa2\x00S\x04h\x00^\x03\xfa\x00\x5c\x04\ +h\x00^\x03\xfa\x00\x5c\x04h\x00^\x03\xfa\x00\x5c\x04\ +h\x00^\x03\xfa\x00\x5c\x04\xa2\x00)\x03y\x00/\x04\ +\xa2\x00)\x03y\x00/\x04\xa2\x00)\x03y\x00/\x06\ +\x0c\x00\xae\x05B\x00\x9a\x06\x0c\x00\xae\x05B\x00\x9a\x06\ +\x0c\x00\xae\x05B\x00\x9a\x06\x0c\x00\xae\x05B\x00\x9a\x06\ +\x0c\x00\xae\x05B\x00\x9a\x06\x0c\x00\xae\x05B\x00\x9a\x07\ +\xbc\x00\x00\x06\xd9\x00\x14\x04\xfe\x00\x00\x04\x8d\x00\x00\x04\ +\xfe\x00\x00\x04\xa2\x001\x03\xe7\x007\x04\xa2\x001\x03\ +\xe7\x007\x04\xa2\x001\x03\xe7\x007\x03\x10\x00\xa0\x04\ +\x91\x00\xc5\x05\x85\x00\x00\x04\xd5\x00V\x07\x9e\x00\x00\x07\ +V\x00V\x06^\x00w\x04\xf4\x00\x5c\x04h\x00^\x03\ +\xfa\x00\x5c\x04\xdb\x00\xba\x04\xdb\x00\xba\x04\xdb\x01\x1b\x04\ +\xdb\x00\xe3\x02q\x00\x93\x04\x9e\x01T\x01\xa6\x00\x0a\x04\ +\xdb\x00\xcf\x04\xb4\x00\x9c\x04\x9e\x01\xd7\x04\x9e\x00\xba\x05\ +\x85\xff\xc8\x02H\x00u\x05\x0a\xff\x9d\x06\xae\xff\x9d\x04\ +\x19\xff\x9d\x06\xb0\xff\xc6\x06\x1d\xff\x88\x06J\xff\xc6\x03\ +B\xff\xc9\x05\x85\x00\x00\x05`\x00\xb8\x04}\x00\xb8\x05\ +D\x009\x04{\x00\xb8\x04\xa2\x001\x06\x1f\x00\xb8\x06\ +^\x00w\x03\x1d\x00B\x05P\x00\xb8\x053\x00\x00\x07\ +\x8b\x00\xb8\x06\x81\x00\xb8\x04\x91\x00R\x06^\x00w\x05\ +\xf6\x00\xb8\x05\x06\x00\xb8\x04\xbe\x00N\x04\xa2\x00)\x04\ +\xfe\x00\x00\x06\xe1\x00\x5c\x05V\x00\x00\x07\x02\x00m\x06\ +J\x007\x03\x1d\x009\x04\xfe\x00\x00\x05-\x00\x5c\x04\ +q\x00N\x05B\x00\xa0\x03B\x00\xa0\x05)\x00\x8f\x05\ +-\x00\x5c\x05H\x00\xa0\x04\x8b\x00\x02\x04\xf4\x00\x5c\x04\ +q\x00N\x03\xfc\x00\x5c\x05B\x00\xa0\x04\xf2\x00\x5c\x03\ +B\x00\xa0\x04\xf6\x00\xa0\x04\xec\x00\x08\x05H\x00\xa0\x04\ +\xc3\x00\x06\x03\xfc\x00\x5c\x04\xf4\x00\x5c\x05\xe9\x00\x19\x04\ +\xf2\x00y\x03\xfc\x00\x5c\x059\x00\x5c\x04N\x00)\x05\ +)\x00\x8f\x06V\x00\x5c\x04\xbc\xff\xcf\x06\xb2\x00\x8f\x06\ +\xe7\x00m\x03B\x00\x0c\x05)\x00\x8f\x04\xf4\x00\x5c\x05\ +)\x00\x8f\x06\xe7\x00m\x04{\x00\xb8\x06q\x00)\x04\ +}\x00\xb8\x05j\x00w\x04h\x00^\x03\x1d\x00B\x03\ +\x1d\x009\x02\xa6\xffh\x07\xfe\x00\x10\x08\x04\x00\xb8\x06\ +q\x00)\x05`\x00\xb8\x059\x00\x00\x05\xf6\x00\xb8\x05\ +\x85\x00\x00\x05\x1b\x00\xb8\x05`\x00\xb8\x04}\x00\xb8\x06\ +\x1d\x00\x0a\x04{\x00\xb8\x07\x8b\x00\x00\x05/\x00^\x06\ +\x96\x00\xb8\x06\x96\x00\xb8\x05`\x00\xb8\x05\xf6\x00\x10\x07\ +\x8b\x00\xb8\x06\x1f\x00\xb8\x06^\x00w\x05\xf6\x00\xb8\x05\ +\x06\x00\xb8\x05\x19\x00w\x04\xa2\x00)\x059\x00\x00\x06\ +\xe1\x00\x5c\x05V\x00\x00\x06?\x00\xb8\x05\xd3\x00m\x08\ +\xa0\x00\xb8\x08\xe9\x00\xb8\x05\xd1\x00\x00\x07?\x00\xb8\x05\ +\x1b\x00\xb8\x05N\x00H\x08\x8f\x00\xb8\x05R\xff\xf6\x04\ +\xd5\x00V\x04\xfa\x00\x5c\x05\x1d\x00\xa0\x03\xd3\x00\xa0\x05\ +P\x00\x1d\x04\xba\x00\x5c\x06\xfc\x00\x00\x04q\x00N\x05\ +\xc3\x00\xa0\x05\xc3\x00\xa0\x04\xf4\x00\xa0\x05)\x00\x00\x06\ +\xc1\x00\xa0\x05L\x00\xa0\x04\xf4\x00\x5c\x057\x00\xa0\x05\ +\x10\x00\xa0\x04\x1d\x00\x5c\x04m\x00/\x04\x8d\x00\x00\x06\ +\x83\x00\x5c\x04\xa0\x00\x0a\x05\x81\x00\xa0\x05?\x00{\x07\ +\xc1\x00\xa0\x07\xe1\x00\xa0\x05\xae\x00\x00\x06\xcd\x00\xa0\x04\ +\xe9\x00\xa0\x04\x19\x00J\x07\x04\x00\xa0\x04\xbe\x00\x00\x04\ +\xba\x00\x5c\x05B\x00\x04\x03\xd3\x00\xa0\x041\x00\x5c\x03\ +\xfa\x00\x5c\x02q\x00\x93\x02q\xff\xe5\x02q\xff}\x07\ +\x1b\x00\x00\x07\x1b\x00\xa0\x05B\x00\x04\x04\xf4\x00\xa0\x04\ +\x8d\x00\x00\x05`\x00\xa0\x04\xa6\x00\xb8\x04\x19\x00\xa0\x07\ +\xbc\x00\x00\x06\xd9\x00\x14\x07\xbc\x00\x00\x06\xd9\x00\x14\x07\ +\xbc\x00\x00\x06\xd9\x00\x14\x04\xfe\x00\x00\x04\x8d\x00\x00\x04\ +\x00\x00R\x08\x00\x00R\x08\x00\x00R\x03J\xff\xfc\x01\ +\xbc\x00\x19\x01\xbc\x00\x19\x02T\x00?\x01\xba\x00\x19\x03\ +\x8f\x00\x19\x03\x8f\x00\x19\x04%\x00?\x04!\x00{\x04\ +5\x00{\x03\x02\x00b\x06\xd7\x00u\x0a?\x00?\x02\ +!\x00\x85\x03\xc7\x00\x85\x02\xf2\x00R\x02\xf2\x00R\x04\ +\x8f\x00u\x01\x0a\xfew\x03b\x00f\x04\x91\x00#\x04\ +\x91\x00R\x07#\x00\xb8\x04\x91\x00B\x06\x5c\x00?\x04\ +)\x00)\x089\x00\x87\x05\xfe\x00\x10\x06J\x007\x04\ +\xf4\x00f\x07\x0c\x00:\x07\x0c\x00;\x07\x0c\x00Z\x07\ +\x0c\x00C\x04\xa6\x00;\x05D\x009\x05\xee\x00\xa6\x05\ +\x0c\x00)\x04\x91\x00X\x04d\x00%\x05\xa8\x00q\x03\ +L\x00\x00\x04\x91\x00X\x04\x91\x00X\x04\x91\x00V\x04\ +\x91\x00X\x04\xaa\x00X\x05\x89\x00)\x05\x89\x00)\x04\ +\x9e\x00h\x02q\xff}\x04\x00\x01^\x04\x00\x01^\x04\ +\x00\x01N\x03\x08\x00)\x03\x08\x00\x0c\x03\x08\x00T\x03\ +\x08\x00-\x03\x08\x00;\x03\x08\x00-\x03\x08\x00+\x04\ +\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x02\ +\xaa\x00\x00\x02\x00\x00\x00\x01V\x00\x00\x04y\x00\x00\x02\ +H\x00\x00\x01\x9a\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x08\x00\x00T\x08\x00\x00T\x02q\xff}\x01\ +\xbc\x00\x19\x05\xdb\x00)\x05\x0c\x00\x00\x07\xfe\x003\x07\ +\x8b\x00\xb8\x07\xdb\x00\xa0\x05\x85\x00\x00\x04\xd5\x00V\x06\ +\xb0\xfer\x02\xaa\x00X\x02\x00\x00y\x08\xa0\x00)\x08\ +\xa0\x00)\x06\x9a\x00w\x05o\x00\x5c\x07\x14\x00\xae\x06\ +\x14\x00\x9a\x00\x00\xfc\x16\x00\x00\xfc\xd0\x00\x00\xfb\xe0\x00\ +\x00\xfc\xd9\x00\x00\xfc\xd9\x04{\x00\xb8\x06\x96\x00\xb8\x04\ +\xba\x00\x5c\x05\xc3\x00\xa0\x08\xb4\x00w\x07\x14\x00\x06\x05\ +b\x00\x00\x05L\x00\x00\x07\x9a\x00\xb8\x06f\x00\xa0\x05\ +\xd7\x00\x00\x05\x1f\x00\x00\x08\x0a\x00\xb8\x077\x00\xa0\x06\ +o\x00)\x04\xfc\x00\x14\x08\x96\x00\xb8\x07\x0a\x00\xa0\x05\ +\x0e\x00)\x04q\x00\x1f\x07\x02\x00m\x06\xb2\x00\x8f\x06\ +^\x00w\x04\xf4\x00\x5c\x05\xbc\x00\x00\x04\xd7\x00\x00\x05\ +\xbc\x00\x00\x04\xd7\x00\x00\x0a\x8d\x00w\x09)\x00\x5c\x06\ +\xb0\x00w\x05o\x00\x5c\x08\xb4\x00w\x07\x1f\x00\x5c\x08\ +\xb4\x00w\x07\x14\x00\x06\x05j\x00w\x041\x00\x5c\x04\ +\xdf\x00h\x04u\x00\xb4\x04\x9e\x00\xf4\x04\x9e\x01\xcd\x04\ +\x9e\x01\xcb\x07\xe9\x00)\x07\xa6\x00)\x07T\x00\xb8\x06\ +j\x00\xa0\x04\xee\x00/\x04\xe9\x00\x04\x05\x06\x00\xb8\x05\ +\x10\x00\xa0\x04y\x00/\x03\xee\x00\x04\x05\xdf\x00\xb8\x04\ +\xd1\x00\xa0\x08;\x00\x00\x07\x89\x00\x00\x05/\x00^\x04\ +q\x00N\x06\x0c\x00\xb8\x05R\x00\xa0\x05P\x00\xb8\x04\ +\xcb\x00\xa0\x05%\x00\x04\x04\xf6\x00\x04\x05\xdd\x00\x00\x05\ +\x8f\x00\x00\x06\xba\x00\xb8\x05\xf2\x00\xa0\x06\xac\x00\xb8\x06\ +\x10\x00\xa0\x09\x00\x00\xb8\x07\x1d\x00\xa0\x067\x00w\x05\ +?\x00\x5c\x05\x19\x00w\x04\x1d\x00\x5c\x04\xa2\x00)\x04\ +f\x00/\x04\xfe\x00\x00\x04\x98\x00\x00\x04\xfe\x00\x00\x04\ +\x98\x00\x00\x05\xf2\x00\x00\x05\x1f\x00\x0a\x07q\x00)\x06\ +T\x00/\x06o\x00m\x05\xcf\x00{\x05\xd3\x00m\x05\ +?\x00{\x05\xd3\x00\xb8\x05T\x00\xa0\x07\x96\x00\x00\x05\ +\xb8\x00\x00\x07\x96\x00\x00\x05\xb8\x00\x00\x03\x1d\x00B\x07\ +\x8b\x00\x00\x06\xfc\x00\x00\x06\x14\x00\xb8\x05J\x00\xa0\x06\ +\xb4\x00\x10\x05\xd1\x00\x00\x06\x1f\x00\xb8\x05L\x00\xa0\x06\ +\xdd\x00\xb8\x05\xf4\x00\xa0\x05\xd3\x00m\x05?\x00{\x08\ +J\x00\xb8\x07h\x00\xa0\x03\x1d\x00B\x05\x85\x00\x00\x04\ +\xd5\x00V\x05\x85\x00\x00\x04\xd5\x00V\x07\x9e\x00\x00\x07\ +V\x00V\x04{\x00v\x04\xba\x00\x5c\x06\x89\x00\xa4\x04\ +\xcf\x00\x5c\x06\x89\x00\xa4\x04\xcf\x00\x5c\x07\x8b\x00\x00\x06\ +\xfc\x00\x00\x05/\x00^\x04q\x00N\x04\xba\x009\x04\ +\xa6\x009\x06\x96\x00\xb8\x05\xc3\x00\xa0\x06\x96\x00\xb8\x05\ +\xc3\x00\xa0\x06^\x00w\x04\xf4\x00\x5c\x06^\x00w\x04\ +\xf4\x00\x5c\x06^\x00w\x04\xf4\x00\x5c\x05N\x00H\x04\ +\x19\x00J\x059\x00\x00\x04\x8d\x00\x00\x059\x00\x00\x04\ +\x8d\x00\x00\x059\x00\x00\x04\x8d\x00\x00\x05\xd3\x00m\x05\ +?\x00{\x04}\x00\xb8\x03\xd3\x00\xa0\x07?\x00\xb8\x06\ +\xcd\x00\xa0\x04y\x00/\x03\xee\x00\x04\x05\xdb\x00\x00\x05\ +)\x00\x0a\x05V\x00\x00\x04\xa0\x00\x0a\x05\x1b\x00\x5c\x05\ +\x10\x00\x5c\x07h\x00\x5c\x07b\x00\x5c\x07N\x00\x19\x06\ +\xf6\x009\x05\x9c\x00\x19\x05J\x00N\x08D\x00\x10\x07\ +{\x00\x00\x08X\x00\xb8\x07\x9e\x00\xa0\x06f\x00w\x05\ +N\x00\x5c\x06\x10\x00)\x05\xdf\x00/\x05/\x00X\x04\ +s\x00N\x06\x8b\x00\x10\x05\xcb\x00\x00\x05\x85\x00\x00\x04\ +\xd5\x00V\x05\x85\x00\x00\x04\xd5\x00V\x05\x85\x00\x00\x04\ +\xd5\x00V\x05\x85\x00\x00\x04\xd5\xff\xd3\x05\x85\x00\x00\x04\ +\xd5\x00V\x05\x85\x00\x00\x04\xd5\x00V\x05\x85\x00\x00\x04\ +\xd5\x00V\x05\x85\x00\x00\x04\xd5\x00V\x05\x85\x00\x00\x04\ +\xd5\x00V\x05\x85\x00\x00\x04\xd5\x00V\x05\x85\x00\x00\x04\ +\xd5\x00V\x05\x85\x00\x00\x04\xd5\x00V\x04{\x00\xb8\x04\ +\xba\x00\x5c\x04{\x00\xb8\x04\xba\x00\x5c\x04{\x00\xb8\x04\ +\xba\x00\x5c\x04{\x00\xb8\x04\xba\x00\x5c\x04{\xff\xcd\x04\ +\xba\xff\xdf\x04{\x00\xb8\x04\xba\x00\x5c\x04{\x00\xb8\x04\ +\xba\x00\x5c\x04{\x00\xab\x04\xba\x00\x5c\x03\x1d\x00B\x02\ +q\x00u\x03\x1d\x00B\x02q\x00\x91\x06^\x00w\x04\ +\xf4\x00\x5c\x06^\x00w\x04\xf4\x00\x5c\x06^\x00w\x04\ +\xf4\x00\x5c\x06^\x00w\x04\xf4\xff\xdf\x06^\x00w\x04\ +\xf4\x00\x5c\x06^\x00w\x04\xf4\x00\x5c\x06^\x00w\x04\ +\xf4\x00\x5c\x06\x9a\x00w\x05o\x00\x5c\x06\x9a\x00w\x05\ +o\x00\x5c\x06\x9a\x00w\x05o\x00\x5c\x06\x9a\x00w\x05\ +o\x00\x5c\x06\x9a\x00w\x05o\x00\x5c\x06\x0c\x00\xae\x05\ +B\x00\x9a\x06\x0c\x00\xae\x05B\x00\x9a\x07\x14\x00\xae\x06\ +\x14\x00\x9a\x07\x14\x00\xae\x06\x14\x00\x9a\x07\x14\x00\xae\x06\ +\x14\x00\x9a\x07\x14\x00\xae\x06\x14\x00\x9a\x07\x14\x00\xae\x06\ +\x14\x00\x9a\x04\xfe\x00\x00\x04\x8d\x00\x00\x04\xfe\x00\x00\x04\ +\x8d\x00\x00\x04\xfe\x00\x00\x04\x8d\x00\x00\x051\x00\x5c\x00\ +\x00\xfb\x7f\x00\x00\xfc-\x00\x00\xfb\x0c\x00\x00\xfc-\x00\ +\x00\xfc1\x00\x00\xfc1\x00\x00\xfc1\x00\x00\xfc1\x00\ +\x00\xfc1\x01\xa6\x00\x0a\x02V\x00\x10\x02V\x00\x10\x03\ +\xd9\x00-\x04\xdf\x00f\x03\xf0\x00=\x04\x91\x00B\x04\ +\x91\x00N\x04\x91\x00\x17\x04\x91\x00d\x04\x91\x00H\x04\ +\x91\x007\x04\x91\x00H\x04\x91\x00B\x061\x00)\x05\ +\xe1\x00R\x04\xa2\x00)\x03y\x00/\x05\x10\x00\x5c\x05\ +\x10\x00\x5c\x05\x10\x00\x5c\x05\x10\x00\x5c\x05\x10\x00\x5c\x02\ +\xa6\x00\xb8\x02\xa6\xff\xc6\x02\xa6\x00\xa7\x02\xa6\xff\xa0\x02\ +\xa6\xff\xfd\x02\xa6\xff\xb5\x02\xa6\x00\x03\x02\xa6\xff\xcb\x02\ +\xa6\x00n\x02\xa6\x00\xac\x05\xc3\x00\xb8\x04\x19\xff\x9d\x02\ +\xa6\x00\xb8\xff\xfd\x00\xb8\xff\xfd\x00\xb8\x00\xb8\x00\x8b\x00\ +\xac\x00\x00\x00\x00\x00\x01\x00\x03\x00\x01\x00\x00\x00\x0c\x00\ +\x04\x04\x0e\x00\x00\x00\xb0\x00\x80\x00\x06\x000\x00H\x00\ +I\x00~\x00\xcb\x00\xcf\x01'\x012\x01a\x01\x7f\x01\ +\x92\x01\xa1\x01\xb0\x01\xf0\x01\xff\x02\x1b\x027\x02\xbc\x02\ +\xc7\x02\xc9\x02\xdd\x02\xf3\x03\x01\x03\x03\x03\x09\x03\x0f\x03\ +#\x03\x8a\x03\x8c\x03\xa1\x03\xaa\x03\xce\x03\xd2\x03\xd6\x04\ +\x0d\x04O\x04_\x04\x86\x04\x91\x04\xbf\x04\xcf\x05\x13\x1e\ +\x01\x1e?\x1e\x85\x1e\xc7\x1e\xca\x1e\xf1\x1e\xf9\x1fM \ +\x0b \x15 \x1e \x22 & 0 3 : \ +< D p y \x7f \xa4 \xa7 \xac!\ +\x05!\x13!\x16! !\x22!&!.!^\x22\ +\x02\x22\x06\x22\x0f\x22\x12\x22\x1a\x22\x1e\x22+\x22H\x22\ +`\x22e%\xca\xfb\x04\xfe\xff\xff\xfd\xff\xff\x00\x00\x00\ + \x00I\x00J\x00\xa0\x00\xcc\x00\xd0\x01(\x013\x01\ +b\x01\x92\x01\xa0\x01\xaf\x01\xf0\x01\xfa\x02\x18\x027\x02\ +\xbc\x02\xc6\x02\xc9\x02\xd8\x02\xf3\x03\x00\x03\x03\x03\x09\x03\ +\x0f\x03#\x03\x84\x03\x8c\x03\x8e\x03\xa3\x03\xab\x03\xd1\x03\ +\xd6\x04\x00\x04\x0e\x04P\x04`\x04\x88\x04\x92\x04\xc0\x04\ +\xd0\x1e\x00\x1e>\x1e\x80\x1e\xa0\x1e\xc8\x1e\xcb\x1e\xf2\x1f\ +M \x00 \x13 \x17 & 0 2 \ +9 < D p t \x7f \xa3 \xa7 \ +\xab!\x05!\x13!\x16! !\x22!&!.!\ +[\x22\x02\x22\x06\x22\x0f\x22\x11\x22\x1a\x22\x1e\x22+\x22\ +H\x22`\x22d%\xca\xfb\x00\xfe\xff\xff\xfc\xff\xff\xff\ +\xe3\x00\x00\xff\xe3\xff\xc2\x00\x00\xff\xc2\x00\x00\xff\xc2\x00\ +\x00\xff\xb0\x00\xbf\x00\xb2\x00a\xffI\x00\x00\x00\x00\xff\ +\x96\xfe\x85\xfe\x84\xfev\xffh\xffc\xffb\xff]\x00\ +g\xffD\x00\x00\xfd\xcf\x00\x00\x00\x00\xfd\xcd\xfe\x82\xfe\ +\x7f\x00\x00\xfd\x9a\x00\x00\xfe\x0c\x00\x00\xfe\x09\x00\x00\xfe\ +\x09\xe4X\xe4\x18\xe3z\xe4}\x00\x00\xe4}\x00\x00\xe3\ +\x0d\xe2B\xe1\xef\xe1\xee\xe1\xed\xe1\xea\xe1\xe1\xe1\xe0\xe1\ +\xdb\xe1\xda\xe1\xd3\xe1\xcb\xe1\xc8\xe1\x99\xe1v\xe1t\x00\ +\x00\xe1\x18\xe1\x0b\xe1\x09\xe2n\xe0\xfe\xe0\xfb\xe0\xf4\xe0\ +\xc8\xe0%\xe0\x22\xe0\x1a\xe0\x19\xe0\x12\xe0\x0f\xe0\x03\xdf\ +\xe7\xdf\xd0\xdf\xcd\xdci\x00\x00\x03O\x02S\x00\x01\x00\ +\x00\x00\xae\x00\x00\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\ +\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\xe0\x00\x00\x00\xea\x01\x10\x00\x00\x00\x00\x00\ +\x00\x01\x18\x00\x00\x010\x00\x00\x01L\x00\x00\x01\x5c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01p\x00\x00\x01r\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01<\x00\x00\x00\x00\x00\x00\x03\ +\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x00\xeb\x03\x9c\x00\ +\xed\x03\x9d\x00\xef\x03\x9e\x00\xf1\x03\x9f\x00\xf3\x03\xa0\x03\ +\x8f\x03\x90\x01&\x01'\x01(\x01)\x01*\x01+\x01\ +,\x01-\x01.\x01/\x010\x011\x012\x013\x01\ +4\x015\x016\x017\x018\x019\x01:\x01;\x01\ +<\x01=\x01>\x01?\x01@\x01A\x01I\x01J\x01\ +$\x01%\x01T\x01U\x01V\x01W\x01X\x01Y\x03\ +\xa1\x01\x5c\x01]\x01^\x01_\x01`\x01a\x01b\x01\ +c\x01d\x01e\x01f\x03\xa2\x01h\x01i\x01j\x01\ +k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01\ +s\x01t\x01u\x01v\x03\xa3\x02h\x01\x9c\x01\x9d\x01\ +\x9e\x01\x9f\x01\xa0\x03\xa4\x03\xa5\x01\xa3\x01\xa4\x01\xa5\x01\ +\xa6\x01\xa7\x02i\x02j\x01\xea\x01\xeb\x01\xec\x01\xed\x01\ +\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x02\ +k\x01\xf6\x01\xf7\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\ +\x98\x02\x99\x02\x9a\x01\xf8\x01\xf9\x03\xa6\x02\xca\x02\xcb\x02\ +\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\ +\xd4\x02\xd5\x02\xd6\x02\xd7\x03\xa7\x03\xa8\x03F\x03\xa9\x02\ +\x00\x02\x01\x03o\x03p\x03q\x03r\x03s\x03t\x03\ +u\x02\x1c\x03\x8d\x024\x025\x02]\x02^\x00\x00@\ +G[ZYXUTSRQPONMLK\ +JIHGFEDCBA@?>=<;\ +:9876510/.-,('&%\ +$#\x22!\x1f\x18\x14\x11\x10\x0f\x0e\x0d\x0b\x0a\x09\x08\ +\x07\x06\x05\x04\x03\x02\x01\x00, \xb0\x01`E\xb0\x03\ +% \x11Fa#E#aH-, E\x18h\ +D-,E#F`\xb0 a \xb0F`\xb0\x04\ +&#HH-,E#F#a\xb0 ` \xb0\ +&a\xb0 a\xb0\x04&#HH-,E#F\ +`\xb0@a \xb0f`\xb0\x04&#HH-,\ +E#F#a\xb0@` \xb0&a\xb0@a\xb0\ +\x04&#HH-,\x01\x10 <\x00<-, \ +E# \xb0\xcdD# \xb8\x01ZQX# \xb0\ +\x8dD#Y \xb0\xedQX# \xb0MD#Y\ + \xb0\x04&QX# \xb0\x0dD#Y!!-\ +, E\x18hD \xb0\x01` E\xb0Fv\ +h\x8aE`D-,\x01\xb1\x0b\x0aC#Ce\x0a\ +-,\x00\xb1\x0a\x0bC#C\x0b-,\x00\xb0(#\ +p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\ +\x02\x00\x08\x0d-, E\xb0\x03%Ead\xb0P\ +QXED\x1b!!Y-,I\xb0\x0e#D-\ +, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\x07\ +Ce\x0a-, i\xb0@a\xb0\x00\x8b \xb1,\ +\xc0\x8a\x8c\xb8\x10\x00b`+\x0cd#da\x5cX\ +\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0\ +)#D\xb0)z\xe4\x18-,Ee\xb0,#D\ +E\xb0+#D-,KRXED\x1b!!Y\ +-,KQXED\x1b!!Y-,\x01\xb0\x05\ +%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\ +\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-\ +,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,\xb0\x02C\xb0\ +\x01RX!!!!!\x1bF#F`\x8a\x8aF\ +# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\ +\xb1\x0c\x0c\x8apE` \xb0\x00PX\xb0\x01a\xb8\ +\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:Y-\ +, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02\ +%F ha\xb0\x03%\xb0\x03%?#!8\x1b\ +!\x11Y-, E\xb0\x03%FPX\xb0\x02%\ +F ha\xb0\x03%\xb0\x03%?#!8\x1b!\ +\x11Y-,\x00\xb0\x07C\xb0\x06C\x0b-,!!\ +\x0cd#d\x8b\xb8@\x00b-,!\xb0\x80QX\ +\x0cd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\ +\xb0\x02`-,!\xb0\xc0QX\x0cd#d\x8b\xb8\ +\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\x0c\ +d#d\x8b\xb8@\x00b`#!-,KSX\ +\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\ +\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\ +\x8a\x12\x11 9/Y-,KSX \xb0\x03%\ +Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80\ +b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\ +\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\ +\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-\ +,E#E`#E`#E`#vh\x18\xb0\ +\x80b -,\xb0H+-, E\xb0\x00TX\ +\xb0@D E\xb0@aD\x1b!!Y-,E\ +\xb10/E#Ea`\xb0\x01`iD-,K\ +QX\xb0/#p\xb0\x14#B\x1b!!Y-,\ +KQX \xb0\x03%EiSXD\x1b!!Y\ +\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01\ +`iD-,\xb0/ED-,E# E\x8a\ +`D-,F#F`\x8a\x8aF# F\x8a`\ +\x8aa\xb8\xff\x80b# \x10#\x8a\xb1\x0c\x0c\x8ap\ +E` \xb0\x00PX\xb0\x01a\xb8\xff\x80\x8b\x1b\xb0\ +\x81\x8cYh:-,K#QX\xb9\x003\xff\xe0\ +\xb14 \x1b\xb33\x004\x00YDD-,\xb0\x16\ +CX\xb0\x03&E\x8aXdf\xb0\x1f`\x1bd\xb0\ + `f X\x1b!\xb0@Y\xb0\x01aY#X\ +eY\xb0)#D#\x10\xb0)\xe0\x1b!!!!\ +!Y-,\xb0\x02CTXKS#KQZX\ +8\x1b!!Y\x1b!!!!Y-,\xb0\x16C\ +X\xb0\x04%Ed\xb0 `f X\x1b!\xb0@\ +Y\xb0\x01a#X\x1beY\xb0)#D\xb0\x05%\ +\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\x04%\x10\xb0\x05\ +% F\xb0\x04%#B<\xb0\x04%\xb0\x07%\x08\ +\xb0\x07%\x10\xb0\x06% F\xb0\x04%\xb0\x01`#\ +B< X\x01\x1b\x00Y\xb0\x04%\x10\xb0\x05%\xb0\ +)\xe0\xb0) EeD\xb0\x07%\x10\xb0\x06%\xb0\ +)\xe0\xb0\x05%\xb0\x08%\x08 X\x02\x1b\x03Y\xb0\ +\x05%\xb0\x03%CH\xb0\x04%\xb0\x07%\x08\xb0\x06\ +%\xb0\x03%\xb0\x01`CH\x1b!Y!!!!\ +!!!-,\x02\xb0\x04% F\xb0\x04%#\ +B\xb0\x05%\x08\xb0\x03%EH!!!!-,\ +\x02\xb0\x03% \xb0\x04%\x08\xb0\x02%CH!!\ +!-,E# E\x18 \xb0\x00P X#e\ +#Y#h \xb0@PX!\xb0@Y#Xe\ +Y\x8a`D-,KS#KQZX E\x8a\ +`D\x1b!!Y-,KTX E\x8a`D\ +\x1b!!Y-,KS#KQZX8\x1b!\ +!Y-,\xb0\x00!KTX8\x1b!!Y-\ +,\xb0\x02CTX\xb0F+\x1b!!!!Y-\ +,\xb0\x02CTX\xb0G+\x1b!!!Y-,\ +\xb0\x02CTX\xb0H+\x1b!!!!Y-,\ +\xb0\x02CTX\xb0I+\x1b!!!Y-, \ +\x8a\x08#KS\x8aKQZX#8\x1b!!Y\ +-,\x00\xb0\x02%I\xb0\x00SX \xb0@8\x11\ +\x1b!Y-,\x01F#F`#Fa# \x10\ + F\x8aa\xb8\xff\x80b\x8a\xb1@@\x8apE`\ +h:-, \x8a#Id\x8a#SX<\x1b!\ +Y-,KRX}\x1bzY-,\xb0\x12\x00K\ +\x01KTB-,\xb1\x02\x00B\xb1#\x01\x88Q\xb1\ +@\x01\x88SZX\xb9\x10\x00\x00 \x88TX\xb2\x02\ +\x01\x02C`BY\xb1$\x01\x88QX\xb9 \x00\x00\ +@\x88TX\xb2\x02\x02\x02C`B\xb1$\x01\x88T\ +X\xb2\x02 \x02C`B\x00K\x01KRX\xb2\x02\ +\x08\x02C`BY\x1b\xb9@\x00\x00\x80\x88TX\xb2\ +\x02\x04\x02C`BY\xb9@\x00\x00\x80c\xb8\x01\x00\ +\x88TX\xb2\x02\x08\x02C`BY\xb9@\x00\x01\x00\ +c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C`BY\xb1\ +&\x01\x88QX\xb9@\x00\x02\x00c\xb8\x04\x00\x88T\ +X\xb2\x02@\x02C`BY\xb9@\x00\x04\x00c\xb8\ +\x08\x00\x88TX\xb2\x02\x80\x02C`BYYYY\ +YY\xb1\x00\x02CTX@\x0a\x05@\x08@\x09@\ +\x0c\x02\x0d\x02\x1b\xb1\x01\x02CTX\xb2\x05@\x08\xba\ +\x01\x00\x00\x09\x01\x00\xb3\x0c\x01\x0d\x01\x1b\xb1\x80\x02C\ +RX\xb2\x05@\x08\xb8\x01\x80\xb1\x09@\x1b\xb2\x05@\ +\x08\xba\x01\x80\x00\x09\x01@Y\xb9@\x00\x00\x80\x88U\ +\xb9@\x00\x02\x00c\xb8\x04\x00\x88UZX\xb3\x0c\x00\ +\x0d\x01\x1b\xb3\x0c\x00\x0d\x01YYYBBBBB\ +-,E\x18h#KQX# E d\xb0@\ +PX|Yh\x8a`YD-,\xb0\x00\x16\xb0\x02\ +%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02#>\xb1\x01\ +\x02\x06\x0c\xb0\x0a#eB\xb0\x0b#B\x01\xb0\x01#\ +?\x00\xb0\x02#?\xb1\x01\x02\x06\x0c\xb0\x06#eB\ +\xb0\x07#B\xb0\x01\x16\x01-,\xb0\x80\xb0\x02CP\ +\xb0\x01\xb0\x02CT[X!#\x10\xb0 \x1a\xc9\x1b\ +\x8a\x10\xedY-,\xb0Y+-,\x8a\x10\xe5-@\ +\x8b\x09!H U \x01\x03U\x1fH\x03U\x1e\x03\ +\xff\x1fPL\x16\x1fOMd\x1fNLd\x1f&4\ +\x10U%3$U\x19\x13\xff\x1f\x07\x04\xff\x1f\x06\x03\ +\xff\x1fML\x1e\x1fdL\x01LF\x0d\x1f\x133\x12\ +U\x05\x01\x03U\x043\x03U\x1f\x03\x01\x0f\x03?\x03\ +\xaf\x03\x03\x06KF\xcbF\xdbF\x03#3\x22U\x1c\ +3\x1bU\x163\x15U\x11\x01\x0fU\x103\x0fU\xaf\ +\x0f\xcf\x0f\x020\x0f\x01\x013\x00Uo\x00\x7f\x00\xaf\ +\x00\xef\x00\x04\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\x90\xb1\ +TS++K\xb8\x07\xffRK\xb0\x09P[\xb0\x01\ +\x88\xb0%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\xb0\x00\ +UZ[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\x1dK\ +\xb02SX\xb0 \x1dYK\xb0dSX\xb0\x10\x1d\ +\xb1\x16\x00BYss+ss+++++s\ +^st++++t++++++++\ ++++++\x18^\x06\x14\x00\x17\x00\x00\x05\xb6\x00\ +\x17\x00u\x05\xb6\x05\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x04^\x00\x17\x00{\x00\x00\xff\xec\x00\ +\x00\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\xfe\x14\xff\ +\xec\x00\x00\x05\xb6\x00\x15\xfc\x94\xff\xeb\xfe\x8f\xff\xe0\xfe\ +\xbc\xff\xec\x00\x12\xfeV\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\ +\x00\x00\x00\x00\xe5\x00\xf6\x01\x00\x01+\x00\xd3\x00\xb2\x01\ +\x02\x00\xf6\x01\x02\x00\xf6\x00\xed\x00\xdf\x00\xb2\x00\x00\x01\ +T\x00\x00\x00\x00\x00$\x00$\x00$\x00$\x00V\x00\ +z\x00\xef\x01z\x01\xe8\x02p\x02\x88\x02\xb5\x02\xe2\x03\ + \x03K\x03h\x03}\x03\x9e\x03\xbc\x03\xfe\x04+\x04\ +y\x04\xe1\x05*\x05\x85\x05\xe0\x06\x0a\x06}\x06\xd9\x07\ +\x11\x07H\x07q\x07\x97\x07\xc2\x08\x1e\x08\xae\x08\xf2\x09\ +R\x09\x94\x09\xcb\x0a\x06\x0a5\x0a\x8a\x0a\xbf\x0a\xf0\x0b\ +\x1b\x0bZ\x0by\x0b\xbf\x0b\xfa\x0c<\x0c{\x0c\xd1\x0d\ +$\x0d\x84\x0d\xaa\x0d\xdf\x0e\x11\x0em\x0e\xaf\x0e\xe3\x0f\ +\x18\x0f:\x0fX\x0fz\x0f\xa6\x0f\xbd\x0f\xe0\x10:\x10\ +\x8e\x10\xca\x11\x1d\x11s\x11\xb5\x12Q\x12\x8f\x12\xbb\x12\ +\xf8\x13?\x13V\x13\xb2\x13\xed\x140\x14\x85\x14\xdb\x15\ +\x0d\x15e\x15\xa7\x15\xe3\x16\x15\x16q\x16\xb6\x17\x05\x17\ +:\x17\x85\x17\x9c\x17\xeb\x18+\x18+\x18\x5c\x18\xab\x19\ +\x04\x19`\x19\xbe\x19\xe3\x1a`\x1a\x97\x1b\x10\x1bf\x1b\ +\xba\x1b\xd7\x1b\xdf\x1cm\x1c\x84\x1c\xba\x1c\xf4\x1d.\x1d\ +\x83\x1d\xa6\x1d\xef\x1e#\x1eD\x1e~\x1e\xab\x1e\xe1\x1f\ +5\x1fK\x1f`\x1fv\x1f\xd6\x1f\xe7\x1f\xf8 \x09 \ +\x1a , = \x9c \xa8 \xb9 \xca \xdb \ +\xed \xfe!\x0f! !2!\x82!\x93!\xa4!\ +\xb5!\xc6!\xd7!\xe9\x22\x19\x22v\x22\x87\x22\x98\x22\ +\xa9\x22\xbb\x22\xcc#\x0e#\x86#\x96#\xa6#\xb6#\ +\xc6#\xd7#\xe8$\x81$\x8d$\x9d$\xad$\xbd$\ +\xce$\xdf$\xf0%\x01%\x13%\x91%\xa1%\xb1%\ +\xc2%\xd2%\xe2%\xf3&4&\x92&\xa2&\xb3&\ +\xc3&\xd4&\xe4'>'O'`'p'\x81'\ +\x91'\x9d'\xa9'\xba'\xca'\xdb'\xeb'\xfc(\ +\x0d(\x1e(.(?(K(S(\xc0(\xd1(\ +\xe1(\xf2)\x02)\x13)$)0)<)M)\ +])n)~)\x8f)\x9f)\xb0)\xc1)\xcd)\ +\xdd)\xee*\x01*R*\xa7*\xb8*\xc9*\xda*\ +\xeb*\xfc+\x0d+\x18+#+4+K+W+\ +c+t+\x85+\x91+\x9c+\xe1+\xf2,\x05,\ +\x10,\x1c,-,9,E,Q,\x90,\xd0,\ +\xe1,\xf2,\xfe-\x09-\x1a-*-6-\x89-\ +\xd6-\xe7-\xf7.\x08.\x18.*.;.\xaa/\ +2/C/S/_/k/|/\x8c/\x9d/\ +\xad/\xbe/\xce/\xda/\xe6/\xf70\x070\x120\ +\x1d0.0?0~0\xd90\xea0\xfa1\x0b1\ +\x1b1,1<1N1_1q1\x831\x8f1\ +\x9b1\xac1\xbd1\xce1\xde1\xf02\x012\x112\ +\x22232D2T2~2\xcd3X3\xfc4\ +\x0d4\x1e4/4?4J4U4\x864\xb84\ +\xcf4\xfc5\x175M5u5\xb65\xed6\x0f6\ +Z6n6w6\x8c6\xa16\xb66\xca6\xdf6\ +\xf37\x067\x0e7\x16767>7F7N7\ +V7\xaf7\xb77\xbf7\xf67\xfe8\x068D8\ +L8q8y8\xc38\xcb8\xd39A9I9\ +\x999\xfd:\x0f:!:1:A:Q:b:\ +t:\xda;E;\x8c<\x04\x04>7>\xac>\xb4>\ +\xfc?H?\x92?\xde@\x19@W@\xbeA$A\ +vA\xd5A\xe7A\xf8B\x08B\x18B)B;B\ +\x95B\xa6B\xf7B\xffC\x07C\x19C!C\x86C\ +\xe0D&D7DHDzD\x82D\xc7D\xcfD\ +\xd7E(E0E\x84E\xe4F\x1bF,FaF\ +\x9fF\xa7F\xafF\xb7F\xbfF\xc7F\xcfF\xd7G\ +!G)G1GdG\x9dG\xd2H\x14H]H\ +\xabH\xe8I;I\x9dI\xf0I\xf8JZJ\xb7J\ +\xd6K\x22K*K}K\xdeL\x13L$L[L\ +\x97L\xe2M\x16M\x1eMDMLMTM{M\ +\x83M\xeaM\xf2N%N]N\x91N\xd2O\x17O\ +bO\x9dO\xe9PCP\x91P\xa2Q\x0fQ\x1fQ\ +mQuQ}Q\x8fQ\x97Q\xf3RIR\x9fR\ +\xb0R\xc0R\xf4S\x19S>SOS`SqS\ +\x82S\x94S\xa6S\xb7S\xc8S\xddS\xf2T\x07T\ ++TLTkT\x8aT\xabT\xe0U\x11UAU\ +\x86U\xf2V\x12V^V\xf9W\x01W\x09W7W\ +fWrW\x8fW\xc4X\x0fX\x84X\xffY\x83Y\ +\xfcZWZ\xcc[([0[\x86[\x9d[\xb4[\ +\xcb[\xe2\x5c>\x5cw\x5c\x9c\x5c\xde\x5c\xf3]$]\ +\x8c]\xc1]\xd7^(^`^\x96^\xd3^\xdf^\ +\xeb_\x15_?_a_\x83_\xa6_\xdc`\x1f`\ +p`\xbd`\xe4aLa\x99a\x99a\x99a\x99a\ +\x99a\x99a\x99a\x99a\x99a\x99a\x99a\x99a\ +\x99a\x99b\xecc\x5ccmcud\x01dKd\ +\xbed\xcfd\xe0d\xecd\xf8e\x04e:e\x7fe\ +\x8fe\x9fe\xfef`f\xb0g\x07g\x10g\x19g\ +\x22gNgdgug\x86g\x96g\xa6h)h\ +\x84h\xd8i(i\x8ei\xeej6j\x83j\xefk\ +\x5ck\xd6lOl\xe8m\x80n0n\xeen\xf6n\ +\xfeoSo\xa9o\xf4p$~P\xfc\xc0\x81\ +e~e\xfe\xb4:C\x01gH9CM_V\x5c\ +q\x85\xe0\xbf\x89\xc1TV\x9d]\x98\xba\xad\x91w\xc5\ +Y\xfe\xebu\xb8\x87\xfe\xffc\x83Vf=\x01J,\ +`\x02\x865=@;Xj0]\x00\x01\x00\x85\x03\ +\xa6\x01\x9c\x05\xb6\x00\x03\x00\x12\xb6\x00\x03\x03\x04\x02\x03\ +\x03\x00?\xcd\x11\x013\x11310\x01\x03#\x03\x01\ +\x9c)\xc5)\x05\xb6\xfd\xf0\x02\x10\x00\x00\x01\x00R\xfe\ +\xbc\x02y\x05\xb6\x00\x0d\x00 @\x0e\x0b\x0a\x0a\x03\x04\ +\x04\x00\x07\x07\x0f\x0b$\x03\x03\x00??\x11\x013\x11\ +33\x1133\x11310\x13\x10\x1273\x06\x02\ +\x15\x14\x12\x17#&\x02R\x9b\x92\xfa\x8d\x90\x93\x88\xf8\ +\x93\x9a\x021\x01\x09\x01\xce\xae\xc1\xfe2\xf4\xf5\xfe7\ +\xb9\xaa\x01\xc6\x00\x00\x01\x00=\xfe\xbc\x02d\x05\xb6\x00\ +\x0d\x00 @\x0e\x03\x04\x04\x0b\x0a\x0a\x00\x07\x07\x0e\x0a\ +\x03\x04$\x00??\x11\x013\x1133\x1133\x11\ +310\x01\x10\x02\x07#6\x1254\x02'3\x16\ +\x12\x02d\x9b\x92\xf8\x87\x94\x90\x8d\xfa\x93\x9a\x021\xfe\ +\xf9\xfe:\xa8\xb8\x01\xc9\xf6\xf4\x01\xce\xc1\xaf\xfe1\x00\ +\x01\x00?\x02V\x04\x1d\x06\x14\x00\x0e\x005@\x18\x09\ +\x0b\x0b\x05\x03\x03\x0d\x01\x07\x07\x10\x0f\x04\x0a\x0a\x07\x07\ +\x01\x0d\x0d\x06\x08\x0e\x00\x00?\xc429\x1133\x12\ +9\x113\x11\x12\x019\x11333\x1293\x129\ +10\x01\x03%\x17\x05\x13\x07\x03\x03'\x13%7\x05\ +\x03\x02\xb0)\x01u!\xfe\xac\xdf\xe3\x9c\x89\xec\xdd\xfe\ +\xae'\x01m)\x06\x14\xfe\x90h\xfc\x18\xfe\xd7y\x01\ +9\xfe\xc9w\x01)\x1a\xfah\x01p\x00\x01\x00X\x00\ +\xe3\x049\x04\xc5\x00\x0b\x00&@\x10\x08\x06\x09\x09\x03\ +\x01\x00\x00\x0c\x0d\x0b\x09\x00\x06\x04\x03\x00/333\ +22\x11\x12\x019\x11333\x113310\x01\ +!5!\x113\x11!\x15!\x11#\x01\xdb\xfe}\x01\ +\x83\xdb\x01\x83\xfe}\xdb\x02d\xdb\x01\x86\xfez\xdb\xfe\ +\x7f\x00\x01\x00?\xfe\xf8\x01\xcb\x00\xee\x00\x06\x00\x15\xb7\ +\x02\x03\x00\x05\x05\x07\x03\x05\x00/\xc6\x11\x013\x113\ +\xc2210%\x06\x03#\x127!\x01\xcb4|\xdc\ +A$\x01\x18\xd7\xca\xfe\xeb\x01\x0a\xec\x00\x01\x00=\x01\ +\xa8\x02V\x02\xa2\x00\x03\x00\x11\xb5\x03\x05\x00\x04\x00\x01\ +\x00/3\x11\x013\x11310\x135!\x15=\x02\ +\x19\x01\xa8\xfa\xfa\x00\x01\x00u\xff\xe5\x01\xd3\x019\x00\ +\x0b\x00\x16@\x0a\x06\x00\x00\x0c\x09\x03TY\x09\x13\x00\ +?+\x11\x013\x1131074632\x16\x15\ +\x14\x06#\x22&uZVS[\x5cRT\x5c\x8fT\ +VXRO[Y\x00\x00\x01\x00\x0e\x00\x00\x03D\x05\ +\xb6\x00\x03\x00\x1c@\x0c\x01\x02\x03\x00\x02\x00\x04\x05\x03\ +\x03\x02\x12\x00??\x11\x12\x0199\x113\x1131\ +0\x01\x01!\x01\x03D\xfd\xdf\xfe\xeb\x02!\x05\xb6\xfa\ +J\x05\xb6\x00\x02\x00J\xff\xec\x04H\x05\xcd\x00\x0b\x00\ +\x17\x00(@\x14\x0c\x06\x12\x00\x06\x00\x18\x19\x09\x15O\ +Y\x09\x07\x03\x0fOY\x03\x19\x00?+\x00\x18?+\ +\x11\x12\x0199\x113\x11310\x01\x10\x02!\x22\ +\x00\x11\x10\x12!2\x00\x01\x10\x16326\x11\x10&\ +#\x22\x06\x04H\xfb\xfe\xfb\xfd\xfe\xff\xfa\x01\x04\xfd\x01\ +\x03\xfd5]nl`akm^\x02\xdb\xfe\x81\xfe\ +\x90\x01|\x01s\x01\x83\x01o\xfe\x80\xfe\x8e\xfe\xf3\xe9\ +\xec\x01\x0a\x01\x0d\xeb\xeb\x00\x01\x00y\x00\x00\x03N\x05\ +\xb6\x00\x0a\x00*@\x13\x09\x04\x00\x00\x08\x01\x01\x0b\x0c\ +\x08\x07\x07\x01\x04\x04\x09\x06\x01\x18\x00??3\x11\x12\ +9\x113\x11\x12\x019\x1133\x129910!\ +!\x1177\x06\x07\x07'\x013\x03N\xfe\xcb\x03\x05\ +M\x1e\xa8\x95\x01\xd7\xfe\x03N\x8b\x98M\x18\x87\xba\x01\ +w\x00\x01\x00N\x00\x00\x04P\x05\xcb\x00\x1d\x00=@\ +\x1e\x1c\x0e\x01\x07\x00\x16\x01\x16\x1e\x1f\x16\x07\x07\x02\x0a\ +\x12\x0aNY\x12\x07\x02\x01\x1c\x01\x1cNY\x01\x18\x00\ +?+\x11\x12\x009\x18?+\x11\x12\x009\x113\x11\ +\x12\x0199\x1133\x113310!!5\x01\ +>\x0254&#\x22\x06\x07'>\x0232\x16\x16\ +\x15\x14\x06\x06\x07\x07\x15!\x04P\xfc\x02\x01o\xa3d\ +,aQU\xa0W\xa8l\x8e\xa8h\x89\xd2tG\x95\ +\xbc\xbc\x02}\xd7\x01s\xa7\x81n;XVNH\xc7\ +\x5cL)d\xb4te\xb1\xba\xac\xb1\x0e\x00\x00\x01\x00\ +N\xff\xec\x04B\x05\xcb\x00&\x00[@/\x22\x17\x0d\ +\x13\x13\x07\x03\x1c\x1c\x00\x00\x07\x0d\x07'(!\x1e$\ +\x1eOY\x03\x18\x17\x18\x17PY\x0c\x18\x01\x0d\x03\x18\ +\x18\x0a$\x07\x0d\x10\x0a\x10OY\x0a\x19\x00?+\x11\ +\x003\x18?\x129/_^]+\x11\x12\x009+\ +\x11\x003\x11\x12\x0199\x113\x113\x113\x113\ +\x11\x129910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04\ +!\x22'\x11\x16\x1632654&##53\ +2654#\x22\x06\x07'6!2\x04\x04\x17\xa6\ +\x96\xb1\xb6\xfe\xce\xfe\xe4\xee\xb8U\xccd\x99\x92\xa8\xb8\ +oq\xaa\x9d\xd0H\x95[\x8f\xc8\x01\x15\xe3\x01\x07\x04\ +o\x89\xc0$\x06\x16\xab\x91\xd3\xebO\x01\x07+6h\ +sgV\xedYl\xa60;\xd5\x90\xb8\x00\x00\x02\x00\ +#\x00\x00\x04q\x05\xb6\x00\x0a\x00\x13\x00F@\x22\x0f\ +\x07\x03\x09\x02\x02\x0b\x03\x03\x05\x00\x00\x15\x13\x05\x05\x14\ +\x06\x13\x01\x05\x13\x05PY\x09\x13\x13\x03\x0f\x07\x06\x03\ +\x18\x00??3\x129/3+\x11\x003\x129\x11\ +\x013\x113\x113\x11\x129\x1133\x113\x129\ +910\x01#\x11!\x11!5\x01!\x113!5\ +467#\x06\x07\x01\x04q\xb0\xfe\xd2\xfd\x90\x02\x81\ +\x01\x1d\xb0\xfe\x22\x0a\x03\x08%4\xfe\xf4\x01/\xfe\xd1\ +\x01/\xd7\x03\xb0\xfci\xf8>\xec\x13RN\xfek\x00\ +\x01\x00d\xff\xec\x045\x05\xb6\x00\x1b\x00V@+\x18\ +\x15\x15\x17\x03\x19\x14\x14\x0e\x08\x0e\x03\x08\x03\x1c\x1d\x14\ +\x13\x09\x13\x0c\x10\x00\x10OY\x19\x00\x00\x06\x15\x15\x18\ +NY\x15\x06\x06\x0cOY\x06\x19\x00?+\x00\x18?\ ++\x11\x12\x009\x18/3+\x11\x12\x0099\x113\ +\x11\x12\x0199\x113\x11\x129\x113\x1299\x11\ +310\x012\x16\x15\x14\x00!\x22'\x11\x16\x163\ + 54!\x22\x06\x07'\x13!\x11!\x0376\x02\ +f\xd4\xfb\xfe\xd2\xfe\xe7\xf4\x96O\xd2^\x01\x1b\xfe\xdb\ +5\x80({7\x03\x19\xfd\xf6\x1b#=\x03\xa6\xee\xcf\ +\xf5\xfe\xf8O\x01\x0b*5\xe8\xdd\x15\x0cB\x02\xe9\xfe\ +\xfa\xfe\xe1\x07\x0e\x00\x02\x00H\xff\xec\x04P\x05\xc7\x00\ +\x18\x00$\x00A@!\x06\x12\x0c\x0c\x22\x22\x00\x1c\x12\ +\x00\x12%&\x0f\x1fPY\x0f\x0f\x15\x03\x15\x19OY\ +\x15\x19\x03\x08OY\x03\x07\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x0199\x113\x113\x12\ +9\x11\x12910\x13\x10\x00!2\x17\x15&#\x22\ +\x06\x06\x073632\x16\x15\x14\x00#\x22&\x02\x05\ +2654&#\x22\x06\x15\x14\x16H\x01o\x01n\ +}GYW\x9f\xc9d\x09\x0dc\xda\xc4\xde\xfe\xf8\xea\ +\xa2\xf1\x83\x02\x10cjcd^\x85}\x02m\x01\xb2\ +\x01\xa8\x0f\xf7\x14`\xbc\xad\xaa\xf6\xd9\xea\xfe\xef\x96\x01\ + \xbf\x85{k{zQw\xa4\x00\x00\x01\x007\x00\ +\x00\x04P\x05\xb4\x00\x06\x00.@\x16\x06\x00\x00\x02\x01\ +\x01\x05\x02\x05\x07\x08\x05\x03\x02\x03\x02NY\x03\x06\x00\ +\x18\x00??+\x11\x12\x009\x11\x12\x0199\x113\ +\x11\x129\x113103\x01!\x11!\x15\x01\xe3\x02\ +%\xfd/\x04\x19\xfd\xd7\x04\xb0\x01\x04\xc2\xfb\x0e\x00\x00\ +\x03\x00H\xff\xec\x04J\x05\xc9\x00\x17\x00\x22\x00.\x00\ +S@)\x12\x06\x15,\x03\x03\x18\x09\x18&\x15\x15\x0f\ +\x1e\x1e\x09\x0f\x09/0\x06\x12\x12!!))\x0c\x00\ +\x0c\x1bQY\x0c\x19\x00#QY\x00\x07\x00?+\x00\ +\x18?+\x11\x12\x009\x113\x129\x113\x11\x12\x01\ +99\x113\x11\x129\x1132\x11\x129\x113\x12\ +9910\x012\x04\x15\x14\x06\x07\x16\x16\x15\x14\x04\ +#\x22$5467&&54$\x03\x14\x163\ +2654&'\x06\x13\x22\x06\x15\x14\x16\x1766\ +54&\x02J\xd2\x01\x01|\x8a\xa4\x8f\xfe\xe6\xe6\xf0\ +\xfe\xee\x85\x93}n\x01\x04\x13xhsrq\x7f\xd5\ +\xe2OaMebNd\x05\xc9\xbf\xa2p\xafEX\ +\xbfr\xb4\xdb\xcc\xbb}\xc2JO\xb4k\x9d\xc2\xfb\xbc\ +V`cQCuBb\x02\xccQD<_2.\ +`?EP\x00\x00\x02\x00B\xff\xec\x04J\x05\xc7\x00\ +\x19\x00%\x00?@ \x1d\x05\x13\x0c\x0c##\x00\x13\ +\x00&'\x10 PY\x10\x10\x03\x16\x16\x1aOY\x16\ +\x07\x03\x08PY\x03\x19\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x12\x0199\x113\x129\x11\x12\ +9210\x01\x10\x00!\x22'5\x163266\ +7#\x06\x06#\x22&54\x0032\x16\x12%\x22\ +\x06\x15\x14\x1632654&\x04J\xfe\x94\xfe\x8f\ +\x82CT\x5c\x9b\xc8j\x08\x0c:\x98r\xbf\xdc\x01\x0b\ +\xe6\xa2\xf3\x82\xfd\xef`lbd^\x86}\x03F\xfe\ +P\xfeV\x0e\xf8\x15[\xc3\xab^L\xf5\xda\xeb\x01\x11\ +\x98\xfe\xdf\xc1\x84|j|{Pw\xa4\x00\x00\x02\x00\ +u\xff\xe5\x01\xd3\x04s\x00\x0b\x00\x17\x00&@\x13\x12\ +\x06\x06\x0c\x00\x00\x18\x0f\x15TY\x0f\x10\x09\x03TY\ +\x09\x13\x00?+\x00\x18?+\x11\x013\x1133\x11\ +31074632\x16\x15\x14\x06#\x22&\x11\ +4632\x16\x15\x14\x06#\x22&uZVS[\ +\x5cRT\x5cZVS[]QT\x5c\x8fTVX\ +RO[Y\x03\x8bTVXRQYX\x00\x02\x00\ +?\xfe\xf8\x01\xd3\x04s\x00\x06\x00\x12\x00(@\x13\x0d\ +\x07\x07\x13\x03\x04\x06\x01\x06\x06\x13\x0a\x10TY\x0a\x10\ +\x04\x06\x00/\xc6?+\x11\x013\x113\x10\xc22\x11\ +3\x11310%\x17\x06\x03#\x127\x03463\ +2\x16\x15\x14\x06#\x22&\x01\xbc\x0f4|\xdcA$\ +/ZVS[]QT\x5c\xee\x17\xca\xfe\xeb\x01\x0a\ +\xec\x02\xdbTVXRQYX\x00\x00\x01\x00X\x00\ +\xcb\x049\x05\x00\x00\x06\x00'@\x10\x05\x01\x04\x00\x01\ +\x00\x07\x08\x04\x03\x03\x06\x00\x02\x01\x05\x00=/33\ +323\x113\x11\x12\x0199\x113\x11310\ +%\x015\x01\x15\x01\x01\x049\xfc\x1f\x03\xe1\xfdT\x02\ +\xac\xcb\x01\xb6\x8f\x01\xf0\xf0\xfe\xc3\xfe\xe7\x00\x00\x02\x00\ +X\x01\xa2\x049\x04\x00\x00\x03\x00\x07\x00$@\x11\x07\ +\x03\x03\x09\x04\x00\x08\x05P\x04`\x04\x02\x04\x04\x00\x01\ +\x00/33/]3\x11\x0132\x113\x1131\ +0\x135!\x15\x015!\x15X\x03\xe1\xfc\x1f\x03\xe1\ +\x03%\xdb\xdb\xfe}\xdb\xdb\x00\x00\x01\x00X\x00\xcb\x04\ +9\x05\x00\x00\x06\x00+@\x12\x02\x00\x01\x05\x00\x05\x07\ +\x08\x00\x06\x06\x01\x02\x03\x03\x05\x04\x01\x00=/33\ +3\x113\x113\x113\x11\x12\x0199\x113\x113\ +10\x13\x01\x015\x01\x15\x01X\x02\xac\xfdT\x03\xe1\ +\xfc\x1f\x01\xba\x01\x19\x01=\xf0\xfe\x10\x8f\xfeJ\x00\x00\ +\x02\x00\x06\xff\xe5\x03\xa0\x05\xcb\x00\x19\x00%\x00D@\ +\x22 \x1a\x1a\x19\x00\x00\x0d\x07\x07\x12\x0d\x12&'\x0f\ +\x00\x01\x09\x03\x00\x00##\x1dTY#\x13\x0f\x0aO\ +Y\x0f\x04\x00?+\x00\x18?+\x11\x003\x18/_\ +^]\x11\x12\x0199\x113\x11\x129\x1133\x11\ +310\x0154676654&#\x22\x07\ +'632\x16\x15\x14\x06\x07\x06\x06\x15\x15\x0146\ +32\x16\x15\x14\x06#\x22&\x01\x14RmiC`\ +V\x96\xc0m\xdf\xfa\xce\xf3d\x8c`3\xfe\xd7ZV\ +S[\x5cRT\x5c\x01\xe5J`\x8ePK^:A\ +Db\xdb}\xc6\xa5n\xa0dGJ<<\xfe\xaaT\ +VXRO[Y\x00\x00\x02\x00f\xfff\x06\xc7\x05\ +\xc9\x004\x00?\x00Y@+\x0799\x14\x14\x135\ +5\x0d;\x13(\x13\x0d\x03!\x19!-\x19\x00-\x00\ +@A\x16\x0877\x04\x0a=\x10\x0a\x10\x0a\x10*\x1d\ +1\x04$*\x00/3?3\x1299//\x113\ +\x1133\x1133\x11\x12\x0199\x113\x113\x11\ +\x12\x179\x113\x113\x11\x129\x113\x12910\ +\x01\x14\x06\x06#\x22&'#\x06#\x22&54\x00\ +32\x16\x17\x03\x1432654&&#\x22\x04\ +\x02\x15\x10\x00!267\x15\x06! \x00\x114\x12\ +$!2\x04\x12\x01\x1432677&#\x22\x06\ +\x06\xc7\x5c\xa8oJr\x19\x10l\xa7\xb1\xcc\x01\x0c\xd8\ +V\xcfC\x17L@L\x86\xf3\x9c\xca\xfe\xd6\x9f\x01'\ +\x01\x18j\xfe{\xd6\xfe\xfb\xfe\x84\xfeW\xd9\x01\x91\x01\ +\x05\xdc\x01Z\xbc\xfc\x00\xacZ^\x0a\x0d3@}\x8b\ +\x02\xf0\x90\xef\x88G:\x81\xd5\xb9\xd3\x01\x02!\x17\xfe\ +\x17\x8b\xbb\x97\xa1\xf7\x82\xa6\xfe\xc7\xcd\xfe\xec\xfe\xd9/\ +-\xc0[\x01\x90\x01d\xf7\x01\x93\xe5\xb4\xfe\xb4\xfe\xaa\ +\xd3\x7f\x8f\xdd\x0b\x9c\x00\x00\x02\x00\x00\x00\x00\x05\x85\x05\ +\xbc\x00\x07\x00\x0d\x00C@!\x02\x0d\x03\x08\x01\x00\x06\ +\x05\x0b\x0b\x03\x00\x00\x07\x07\x0f\x03\x04\x04\x0e\x0d\x02L\ +Y\x0d\x0d\x03\x0b\x05\x03\x00\x03\x12\x00?3?3\x12\ +9/+\x11\x013\x113\x113\x113\x11\x129\x11\ +33\x1299\x129910!\x03!\x03!\x01\ +!\x01\x01\x02&'\x06\x03\x047j\xfd\xebj\xfe\xb2\ +\x02\x04\x01{\x02\x06\xfd\xfe\x93%\x08!\x9c\x01\x5c\xfe\ +\xa4\x05\xbc\xfaD\x02`\x01\xd9|$\x80\xfe\x07\x00\x00\ +\x03\x00\xb8\x00\x00\x04\xf4\x05\xb6\x00\x0f\x00\x18\x00 \x00\ +V@,\x07\x14\x14\x04\x04\x1a\x1e\x0b\x0b\x22\x10\x1a\x1a\ +\x0f\x0f!\x08\x10\x19\x10\x19MY\x0c\x10\x01\x0d\x03\x10\ +\x10\x0f\x00\x0f\x1aLY\x0f\x12\x00\x18LY\x00\x03\x00\ +?+\x00\x18?+\x11\x12\x009\x18/_^]+\ +\x11\x12\x009\x11\x013\x113\x113\x113\x113\x12\ +9\x113\x12910\x13! \x04\x15\x14\x06\x07\x15\ +\x16\x16\x15\x14\x04#!\x0132654&##\ +\x11\x1132654!\xb8\x01\xc7\x017\x01\x19{\ +f\x8b{\xfe\xdf\xf8\xfd\xdd\x016\xb4~q{\x85\xa3\ +\xca\x80z\xfe\xfc\x05\xb6\xb1\xc1\x83\xa8\x11\x0a\x1f\xaa\x8d\ +\xc8\xe0\x03sNZTI\xfd\xc5\xfe\x83be\xb6\x00\ +\x01\x00w\xff\xec\x04\xd1\x05\xcb\x00\x16\x001@\x18\x07\ +\x13\x13\x18\x03\x0d\x0d\x17\x14\x00\x11\x00LY\x11\x04\x07\ +\x05\x0a\x05LY\x0a\x13\x00?+\x11\x003\x18?+\ +\x11\x003\x11\x013\x113\x113\x11310\x01\x22\ +\x02\x15\x10!27\x11\x06# \x00\x114\x12$3\ +2\x17\x07&&\x03%\xaf\xc0\x01o\x9a\xdb\xb4\xde\xfe\ +\xc1\xfe\xae\xa6\x017\xd1\xd5\xd7dR\xa6\x04\xc9\xfe\xf9\ +\xeb\xfe\x17M\xfe\xfcK\x01\x83\x01j\xe4\x01W\xb7g\ +\xfc':\x00\x02\x00\xb8\x00\x00\x05u\x05\xb6\x00\x08\x00\ +\x0f\x00(@\x14\x09\x00\x00\x11\x0d\x04\x04\x10\x05\x0cL\ +Y\x05\x03\x04\x0dLY\x04\x12\x00?+\x00\x18?+\ +\x11\x013\x113\x113\x11310\x01\x10\x00!!\ +\x11! \x00\x01\x10!#\x113 \x05u\xfee\xfe\ +|\xfeb\x01\xcb\x01f\x01\x8c\xfe\xbe\xfe`\xa5\x85\x01\ +\xc0\x02\xe9\xfe\x97\xfe\x80\x05\xb6\xfe\x86\xfe\xa5\x01\xd7\xfc\ +H\x00\x01\x00\xb8\x00\x00\x04\x02\x05\xb6\x00\x0b\x00E@\ +$\x08\x04\x00\x00\x0d\x06\x0a\x0a\x01\x01\x0c\x06\x09LY\ +\x0c\x06\x01\x0d\x03\x06\x06\x01\x02\x02\x05LY\x02\x03\x01\ +\x0aLY\x01\x12\x00?+\x00\x18?+\x11\x12\x009\ +\x18/_^]+\x11\x013\x113\x113\x113\x11\ +3310!!\x11!\x15!\x11!\x15!\x11!\ +\x04\x02\xfc\xb6\x03J\xfd\xec\x01\xef\xfe\x11\x02\x14\x05\xb6\ +\xfe\xfe\xbf\xfe\xfe\x87\x00\x00\x01\x00\xb8\x00\x00\x03\xfe\x05\ +\xb6\x00\x09\x004@\x1a\x08\x03\x03\x0b\x06\x00\x00\x01\x01\ +\x0a\x06\x09LY\x06\x06\x01\x02\x02\x05LY\x02\x03\x01\ +\x12\x00??+\x11\x12\x009\x18/+\x11\x013\x11\ +3\x113\x113\x11310!!\x11!\x15!\x11\ +!\x15!\x01\xe9\xfe\xcf\x03F\xfd\xeb\x01\xf0\xfe\x10\x05\ +\xb6\xfe\xfe\x87\xfd\x00\x01\x00w\xff\xec\x05'\x05\xcb\x00\ +\x1a\x00L@'\x1a\x18\x18\x02\x0e\x0d\x0d\x02\x02\x13\x1c\ +\x13\x08\x08\x1b\x0e\x10\x0b\x10LY\x00\x1aLY\x00\x00\ +\x05\x0b\x04\x18\x16\x05\x16LY\x02\x05\x13\x00?3+\ +\x11\x003\x18?\x129/++\x11\x003\x11\x013\ +\x113\x11\x129\x113\x113\x113\x11910\x01\ +!\x11\x06\x06# \x00\x11\x10\x00!2\x17\x07&#\ +\x22\x02\x15\x14\x16327\x11!\x02\xe3\x02D\x8d\xf9\ +\x82\xfe\xb5\xfe\xa3\x01\x95\x01g\xe1\xd1g\xa0\xad\xc9\xf2\ +\xc3\xbaad\xfe\xeb\x035\xfd\x0a.%\x01\x85\x01l\ +\x01b\x01\x8cZ\xf8P\xfe\xf2\xe4\xee\xfb\x14\x011\x00\ +\x01\x00\xb8\x00\x00\x05f\x05\xb6\x00\x0b\x007@\x1c\x09\ +\x01\x01\x00\x00\x0d\x08\x04\x04\x05\x05\x0c\x08\x03LYL\ +\x08\x01\x08\x08\x05\x0a\x06\x03\x01\x05\x12\x00?3?3\ +\x129/]+\x11\x013\x113\x113\x113\x113\ +\x11310!!\x11!\x11!\x11!\x11!\x11!\ +\x05f\xfe\xcb\xfd\xbd\xfe\xca\x016\x02C\x015\x02w\ +\xfd\x89\x05\xb6\xfd\xc3\x02=\x00\x00\x01\x00B\x00\x00\x02\ +\xdb\x05\xb6\x00\x0b\x002@\x17\x08\x00\x00\x0a\x0a\x03\x05\ +\x01\x01\x03\x03\x0c\x0d\x09\x04\x04\x06\x03\x0a\x03\x03\x01\x12\ +\x00?3\x113?3\x113\x11\x12\x019\x113\x11\ +3\x113\x113\x11310!!57\x11'5\ +!\x15\x07\x11\x17\x02\xdb\xfdg\xb2\xb2\x02\x99\xb2\xb2\xb0\ +R\x03\xb2R\xb0\xb0R\xfcNR\x00\x00\x01\xffh\xfe\ +R\x01\xee\x05\xb6\x00\x0d\x00\x1f@\x0e\x0b\x02\x08\x08\x0e\ +\x03\x05\x00\x05LY\x00\x09\x03\x00?\xc4+\x11\x003\ +\x11\x013\x113310\x13\x22'\x11\x16326\ +5\x11!\x11\x10\x02\x1fiNPBfX\x016\xea\ +\xfeR\x16\x01\x02\x14\x7f\x87\x05Z\xfa\xa8\xff\x00\xfe\xf4\ +\x00\x00\x01\x00\xb8\x00\x00\x05P\x05\xb6\x00\x0c\x00B@\ +\x1f\x0c\x02\x02\x0a\x0b\x0b\x01\x00\x00\x0e\x08\x03\x05\x05\x0d\ +\x0c\x02\x02\x03\x0b\x0b\x06\x03\x08\x08\x05\x06\x03\x01\x05\x12\ +\x00?3?\x129\x113\x113\x11\x129\x113\x11\ +\x013\x1132\x113\x1133\x1139\x1131\ +0!!\x01\x07\x11!\x11!\x117\x01!\x01\x05P\ +\xfe\xa0\xfe\x81\x83\xfe\xca\x016z\x01\x8c\x01X\xfe\x02\ +\x02h^\xfd\xf6\x05\xb6\xfdc\xac\x01\xf1\xfdy\x00\x00\ +\x01\x00\xb8\x00\x00\x04?\x05\xb6\x00\x05\x00\x1f@\x0e\x04\ +\x07\x03\x00\x00\x06\x01\x03\x00\x03LY\x00\x12\x00?+\ +\x00\x18?\x11\x013\x113\x113103\x11!\x11\ +!\x11\xb8\x016\x02Q\x05\xb6\xfbJ\xff\x00\x00\x01\x00\ +\xb8\x00\x00\x06\xd3\x05\xb6\x00\x14\x00:@\x1c\x14\x00\x09\ +\x0b\x09\x08\x03\x05\x0e\x0e\x0d\x0d\x16\x05\x06\x15\x12\x02\x09\ +\x02\x06\x0b\x07\x03\x0e\x00\x06\x12\x00?33?3\x12\ +99\x113\x11\x0132\x113\x113\x11\x12\x179\ +\x113310!\x01#\x12\x15\x11!\x11!\x013\ +\x01!\x11!\x1146\x13#\x01\x03#\xfe\xa0\x09\x13\ +\xfe\xeb\x01\xa6\x01Z\x06\x01o\x01\xa6\xfe\xdf\x03\x0c\x09\ +\xfe\x87\x04{\xfe\xa2u\xfdX\x05\xb6\xfb\xa2\x04^\xfa\ +J\x02\xb41\x80\x01\x14\xfb\x87\x00\x01\x00\xb8\x00\x00\x05\ +\xc9\x05\xb6\x00\x0f\x006@\x19\x0a\x00\x09\x01\x06\x0d\x0d\ +\x00\x00\x11\x03\x05\x06\x06\x07\x10\x0b\x03\x07\x0e\x08\x03\x01\ +\x07\x12\x00?3?3\x1299\x11\x0132\x113\ +9\x113\x113\x11\x1299\x12910!!\x01\ +#\x12\x15\x11!\x11!\x013\x025\x11!\x05\xc9\xfe\ +v\xfd\x84\x09\x13\xfe\xeb\x01\x87\x02{\x07\x0f\x01\x17\x04\ +R\xfe\xdb}\xfdP\x05\xb6\xfb\xb9\x01\x1dv\x02\xb4\x00\ +\x02\x00w\xff\xec\x05\xe7\x05\xcd\x00\x0b\x00\x15\x00(@\ +\x14\x11\x00\x00\x17\x0c\x06\x06\x16\x09\x13LY\x09\x04\x03\ +\x0fLY\x03\x13\x00?+\x00\x18?+\x11\x013\x11\ +3\x113\x11310\x01\x10\x00! \x00\x11\x10\x00\ +! \x00\x01\x14\x163 \x11\x10!\x22\x06\x05\xe7\xfe\ +\x98\xfe\xb0\xfe\xb0\xfe\x98\x01i\x01Q\x01Q\x01e\xfb\ +\xd5\xba\xb9\x01s\xfe\x8f\xb9\xbc\x02\xdd\xfe\x95\xfez\x01\ +\x86\x01m\x01m\x01\x81\xfe|\xfe\x94\xf5\xf8\x01\xed\x01\ +\xee\xf9\x00\x00\x02\x00\xb8\x00\x00\x04\xaa\x05\xb6\x00\x08\x00\ +\x13\x004@\x1a\x04\x09\x09\x15\x00\x0e\x0e\x0f\x0f\x14\x0d\ +\x00LY\x0d\x0d\x0f\x10\x10\x08LY\x10\x03\x0f\x12\x00\ +??+\x11\x12\x009\x18/+\x11\x013\x113\x11\ +3\x113\x11310\x0132654&##\ +\x05\x14\x04!#\x11!\x11! \x04\x01\xeef\x8f\x8e\ +w\x7f\x8d\x02\xbc\xfe\xd9\xfe\xf0\x85\xfe\xca\x01\xd3\x01\x0a\ +\x01\x15\x03\x06qlmh\xca\xec\xfa\xfd\xf8\x05\xb6\xe5\ +\x00\x00\x02\x00w\xfe\xa4\x05\xe7\x05\xcd\x00\x0f\x00\x19\x00\ +B@\x22\x06\x03\x05\x04\x04\x02\x03\x08\x04\x0a\x15\x00\x00\ +\x1b\x10\x0a\x0a\x1a\x03\x07\x0d\x0d\x17LY\x0d\x04\x07\x13\ +LY\x05\x07\x13\x00?\xc6+\x00\x18?+\x11\x12\x00\ +9\x11\x013\x113\x113\x113\x12\x179\x113\x11\ +310\x01\x10\x02\x07\x01!\x01# \x00\x11\x10\x00\ +! \x00\x01\x14\x163 \x11\x10!\x22\x06\x05\xe7\xb7\ +\xb1\x01`\xfes\xfe\xf4\x17\xfe\xb0\xfe\x98\x01i\x01Q\ +\x01Q\x01e\xfb\xd5\xba\xb9\x01s\xfe\x8f\xb9\xbc\x02\xdd\ +\xfe\xfe\xfe\xa3Q\xfew\x01H\x01\x86\x01m\x01m\x01\ +\x81\xfe|\xfe\x94\xf5\xf8\x01\xed\x01\xee\xf9\x00\x00\x02\x00\ +\xb8\x00\x00\x05H\x05\xb6\x00\x08\x00\x17\x00N@&\x13\ +\x17\x17\x04\x0a\x04\x10\x10\x0a\x16\x15\x19\x00\x0a\x0a\x0b\x0b\ +\x18\x13\x09\x0c\x00\x09MY\x00\x00\x0b\x0c\x0c\x08LY\ +\x0c\x03\x16\x0b\x12\x00?3?+\x11\x12\x009\x18/\ ++\x11\x12\x009\x11\x013\x113\x113\x10\x18\xc42\ +\x119\x113\x11\x129\x11310\x013265\ +4&##\x11\x11!\x11! \x04\x15\x14\x06\x07\x00\ +\x17!\x01\x01\xeed\x93\x8c\x8f\x96^\xfe\xca\x01\xaa\x01\ +*\x01\x1e\x8e\x82\x01Jd\xfe\xa8\xfe\xa3\x03-bi\ +hX\xfdy\xfd\xcf\x05\xb6\xd9\xdd\x81\xc99\xfe\x13\x90\ +\x021\x00\x00\x01\x00^\xff\xec\x04\x17\x05\xcb\x00'\x00\ +E@\x22\x1b\x1a\x1a!\x00!\x05\x14\x0c\x00\x14\x00(\ +)\x14!\x00\x0c!\x0c\x1e\x09\x17\x1eLY\x17\x04\x03\ +\x09LY\x03\x13\x00?+\x00\x18?+\x11\x12\x009\ +9\x113\x113\x11\x12\x0199\x113\x1133\x11\ +\x129\x11310\x01\x14\x04#\x22'\x11\x16\x163\ +2654&&'.\x0254$32\x16\x17\ +\x07&&#\x22\x06\x15\x14\x16\x16\x17\x16\x16\x04\x17\xfe\ +\xe3\xfe\xea\xb4\x94\xcdUfm0]\x8f\x86\x86P\x01\ +\x07\xe8r\xcfqdu\x99JX^&S\x9b\xcd\x98\ +\x01\x96\xc6\xe4X\x01 B6NM+C>D?\ +t\x9ag\xc2\xde61\xf10&RB)=9J\ +b\xc5\x00\x00\x01\x00)\x00\x00\x04y\x05\xb6\x00\x07\x00\ +&@\x12\x06\x00\x00\x03\x01\x01\x08\x09\x07\x03\x04\x03L\ +Y\x04\x03\x01\x12\x00??+\x11\x003\x11\x12\x019\ +\x1133\x11310!!\x11!\x11!\x11!\x02\ +\xec\xfe\xca\xfes\x04P\xfes\x04\xb4\x01\x02\xfe\xfe\x00\ +\x01\x00\xae\xff\xec\x05^\x05\xb6\x00\x12\x00%@\x11\x11\ +\x01\x01\x14\x0b\x08\x08\x13\x12\x09\x03\x05\x0eLY\x05\x13\ +\x00?+\x00\x18?3\x11\x013\x113\x113\x113\ +10\x01\x11\x14\x06\x04# \x005\x11!\x11\x14\x16\ +3265\x11\x05^\x91\xfe\xee\xbb\xfe\xe6\xfe\xc8\x01\ +5\x88\x9d\x98\x89\x05\xb6\xfcN\xa2\xf4\x82\x01!\xfb\x03\ +\xae\xfc\x81\xa9\x9e\x9f\xaa\x03}\x00\x01\x00\x00\x00\x00\x05\ +3\x05\xb6\x00\x0b\x00*@\x13\x03\x02\x09\x09\x05\x00\x01\ +\x01\x0d\x05\x04\x04\x0c\x00\x04\x03\x09\x03\x12\x00?3?\ +3\x11\x013\x113\x113\x113\x119\x11331\ +0\x01!\x01!\x01!\x01\x16\x16\x1767\x03\xfa\x01\ +9\xfe\x0f\xfe\xae\xfe\x10\x019\x01\x13\x171\x06\x0b@\ +\x05\xb6\xfaJ\x05\xb6\xfc\x9aM\xcd(\x5c\xe6\x00\x01\x00\ +\x00\x00\x00\x07\xbc\x05\xb6\x00\x1d\x00F@\x22\x0a\x09\x0f\ +\x14\x13\x05\x01\x00\x18\x18\x05\x0f\x03\x0c\x1c\x1c\x1d\x1d\x1f\ +\x0c\x0b\x0b\x1e\x1c\x13\x05\x0b\x03\x18\x0f\x0f\x01\x0a\x12\x00\ +?33\x113?333\x11\x013\x113\x113\ +\x113\x11\x12\x179\x1133\x1133\x11331\ +0!!\x03&\x02'\x06\x06\x07\x03!\x01!\x13\x16\ +\x17667\x13!\x13\x16\x16\x17667\x13!\x06\ +H\xfe\x9f\xc6\x0b5\x04\x060\x0d\xc5\xfe\xa0\xfe\x8b\x01\ +1\xbb1\x16\x06+\x13\xd5\x01%\xd5\x0e*\x0b\x0a,\ +\x12\xba\x011\x03\x00)\x01\x01,6\xef3\xfd\x02\x05\ +\xb6\xfc\xe2\xdd\xa29\xefB\x033\xfc\xcd7\xe2QN\ +\xe9H\x03\x1e\x00\x00\x01\x00\x00\x00\x00\x05V\x05\xb6\x00\ +\x0b\x00D@ \x0b\x05\x02\x08\x08\x07\x09\x07\x06\x09\x0a\ +\x06\x0a\x01\x00\x00\x0d\x03\x04\x0c\x0b\x08\x02\x05\x05\x04\x09\ +\x06\x03\x01\x04\x12\x00?3?3\x129\x11333\ +\x11\x0132\x113\x11399\x113\x113\x11\x12\ +9\x1133310!!\x01\x01!\x01\x01!\x01\ +\x01!\x01\x05V\xfe\x9e\xfe\xac\xfe\xac\xfe\xb4\x01\xe5\xfe\ +:\x01V\x01;\x015\x01N\xfe5\x02)\xfd\xd7\x02\ +\xf2\x02\xc4\xfd\xf2\x02\x0e\xfd+\x00\x01\x00\x00\x00\x00\x04\ +\xfe\x05\xb6\x00\x08\x006@\x19\x08\x07\x07\x05\x01\x02\x02\ +\x00\x04\x04\x05\x05\x09\x0a\x03\x06\x06\x00\x00\x05\x01\x07\x03\ +\x05\x12\x00??3\x129\x113\x113\x11\x12\x019\ +\x113\x1292\x113\x113\x11310\x01\x01!\ +\x01\x11!\x11\x01!\x02\x7f\x011\x01N\xfe\x1b\xfe\xcc\ +\xfe\x1b\x01P\x03\x5c\x02Z\xfc\x83\xfd\xc7\x02/\x03\x87\ +\x00\x00\x01\x001\x00\x00\x04q\x05\xb6\x00\x09\x00;@\ +\x1d\x08\x04\x01\x03\x07\x07\x00\x01\x00\x0a\x0b\x07\x04\x05\x05\ +\x04LY\x05\x03\x02\x01\x08\x01\x08LY\x01\x12\x00?\ ++\x11\x12\x009\x18?+\x11\x12\x009\x11\x12\x019\ +9\x113\x113\x113310!!5\x01!\x11\ +!\x15\x01!\x04q\xfb\xc0\x02\xbd\xfdV\x04\x1a\xfdD\ +\x02\xcf\xc9\x03\xed\x01\x00\xc8\xfc\x12\x00\x00\x01\x00\x8f\xfe\ +\xbc\x02s\x05\xb6\x00\x07\x00\x1e@\x0d\x06\x01\x01\x08\x04\ +\x00\x09\x05\x02\x03\x06\x01$\x00?3?3\x11\x013\ +2\x119\x11310\x01!\x11!\x15#\x113\x02\ +s\xfe\x1c\x01\xe4\xe0\xe0\xfe\xbc\x06\xfa\xd3\xfa\xac\x00\x00\ +\x01\x00\x0c\x00\x00\x03B\x05\xb6\x00\x03\x00\x1c@\x0c\x00\ +\x03\x03\x04\x02\x01\x01\x05\x03\x03\x02\x12\x00??\x11\x01\ +3\x113\x113\x11310\x01\x01!\x01\x01!\x02\ +!\xfe\xeb\xfd\xdf\x05\xb6\xfaJ\x05\xb6\x00\x01\x003\xfe\ +\xbc\x02\x17\x05\xb6\x00\x07\x00 @\x0e\x01\x06\x06\x09\x03\ +\x07\x07\x08\x00\x07$\x03\x04\x03\x00?3?3\x11\x01\ +3\x113\x129\x11310\x173\x11#5!\x11\ +!3\xdf\xdf\x01\xe4\xfe\x1cq\x05T\xd3\xf9\x06\x00\x00\ +\x01\x00\x08\x02\x08\x04=\x05\xbe\x00\x06\x00-@\x14\x02\ +\x01\x05\x05\x06\x04\x04\x03\x03\x08\x06\x00\x00\x00\x04\x04\x07\ +\x05\x02\x06\x00?3\x129/3\x012\x113\x113\ +\x113\x11\x129\x113310\x13\x013\x01#\x01\ +\x01\x08\x01\xb6\x90\x01\xef\xef\xfe\xbe\xfe\xe8\x02\x08\x03\xb6\ +\xfcJ\x02\x83\xfd}\x00\x00\x01\xff\xfc\xfe\xbc\x03N\xff\ +H\x00\x03\x00\x12\xb6\x00\x05\x01\x04\x02\x01$\x00?3\ +\x11\x013\x11310\x01!5!\x03N\xfc\xae\x03\ +R\xfe\xbc\x8c\x00\x00\x01\x01L\x04\xd9\x03\x8d\x06!\x00\ +\x08\x00\x1c@\x0b\x00\x07@\x03\x05\x05\x09\x0a\x05\x80\x00\ +\x00/\x1a\xdd\x11\x12\x019\x113\x1a\xca210\x01\ +&&'5!\x16\x17\x15\x02\xc3?\xf4D\x01V?\ +\xac\x04\xd9,\xc5B\x15e\xc8\x1b\x00\x00\x02\x00V\xff\ +\xec\x04;\x04u\x00\x18\x00\x22\x00J@&\x12\x0c\x08\ +\x0c\x02\x22\x22\x18\x18$\x1d\x08\x08#\x0c\x19KY\x0c\ +\x0c\x05\x14\x14\x0fFY\x14\x10\x02\x1f\x05\x1fFY\x05\ +\x16\x00\x15\x00??+\x11\x003\x18?+\x11\x12\x00\ +9\x18/+\x11\x013\x113\x113\x113\x1292\ +\x11\x12910!'#\x06\x06#\x22&546\ +7754#\x22\x07'632\x16\x15\x11\x01\x07\ +\x06\x06\x15\x143265\x03f;\x08M\xa3\x83\xa1\ +\xb9\xf9\xfb\xc2\xae\x86\xb5e\xc1\xeb\xe1\xf0\xfe\xd1v\x85\ +\x82\x94j\x7f\x98aK\xb8\xaa\xb2\xa9\x09\x061\xaaQ\ +\xcee\xc4\xc8\xfd\x17\x02\x06\x04\x04XZ\x81ze\x00\ +\x02\x00\xa0\xff\xec\x04\xb4\x06\x14\x00\x12\x00\x1f\x00B@\ +!\x1d\x03\x03!\x09\x10\x0b\x0e\x17\x17\x0b\x0b \x0c\x00\ +\x0b\x15\x09\x10\x06\x00\x06\x1aGY\x06\x16\x00\x13GY\ +\x00\x10\x00?+\x00\x18?+\x11\x12\x0099\x18?\ +?\x11\x013\x113\x113\x1299\x113\x1131\ +0\x012\x12\x11\x10\x02#\x22'#\x07#\x11!\x11\ +\x14\x0736\x17\x22\x06\x07\x15\x14\x1632654\ +&\x03\x0e\xc6\xe0\xe7\xc7\xc5p\x153\xe9\x011\x0c\x0c\ +kpqh\x02kt^op\x04s\xfe\xcb\xfe\xf3\ +\xfe\xeb\xfe\xd0\x8f{\x06\x14\xfe\x96E\x98\xa6\xf4\x8b\xa0\ +!\xb4\x9c\xad\xa5\xa5\xa5\x00\x01\x00\x5c\xff\xec\x03\xdd\x04\ +s\x00\x15\x00*@\x15\x13\x0d\x07\x07\x17\x0d\x02\x02\x16\ +\x05\x0bGY\x05\x10\x00\x0fGY\x00\x16\x00?+\x00\ +\x18?+\x11\x013\x113\x113\x11\x12910\x05\ + \x11\x10\x00!2\x17\x07&&#\x22\x11\x1032\ +67\x11\x06\x06\x02f\xfd\xf6\x01\x1c\x01\x09\xc2\x9aZ\ +H|>\xee\xeeX\x96KJ\x97\x14\x02=\x01\x1d\x01\ +-L\xec\x1d%\xfe\xae\xfe\xb8/2\xfe\xfb/$\x00\ +\x02\x00\x5c\xff\xec\x04q\x06\x14\x00\x12\x00\x1f\x00@@\ +!\x09\x16\x10\x03\x0b\x0b\x0e\x0e!\x1d\x03\x03 \x0f\x15\ +\x0c\x00\x11\x09\x00\x06\x06\x1aGY\x06\x10\x00\x13GY\ +\x00\x16\x00?+\x00\x18?+\x11\x12\x0099\x18?\ +?\x11\x013\x113\x113\x113\x12\x17910\x05\ +\x22\x02\x11\x10\x1232\x173&5\x11!\x11#'\ +#\x06'26754&#\x22\x06\x15\x14\x16\x02\ +\x02\xc5\xe1\xe5\xc9\xd3o\x0a\x17\x012\xea;\x0dhj\ +um\x05o}fqr\x14\x012\x01\x0f\x01\x13\x01\ +3\xa4}b\x01f\xf9\xec\x91\xa5\xf3\x88\xa3!\xb4\x9c\ +\xad\xa5\xa5\xa5\x00\x00\x02\x00\x5c\xff\xec\x04b\x04s\x00\ +\x06\x00\x1b\x00F@#\x03\x12\x04\x04\x19\x11\x11\x1d\x12\ +\x0a\x0a\x1c\x18\x15\x12\x03\x12JY\x03\x03\x07\x0d\x0d\x00\ +JY\x0d\x10\x07\x15FY\x07\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x009\x11\x013\x11\ +3\x113\x1133\x11\x12910\x01\x22\x06\x07!\ +&&\x03 \x00\x11\x10\x0032\x00\x15\x15!\x16\x16\ +3267\x15\x06\x06\x02oan\x08\x01\xac\x02r\ +6\xfe\xf2\xfe\xd0\x01\x19\xf8\xed\x01\x08\xfd/\x05\x90\x82\ +e\xb4bP\xb6\x03\x9a{qq{\xfcR\x01*\x01\ +\x11\x01\x19\x013\xfe\xf2\xee\x94\x82\x92*.\xec('\ +\x00\x00\x01\x00)\x00\x00\x03u\x06\x1f\x00\x15\x00<@\ +\x1e\x14\x02\x02\x07\x05\x03\x03\x16\x17\x0d\x00\x00\x17\x05\x01\ +\x14\x01FY\x07\x14\x0f\x0b\x10GY\x0b\x00\x03\x15\x00\ +??+\x00\x18?3+\x11\x003\x11\x013\x113\ +\x11\x129\x11333\x11310\x01!\x11!\x11\ +#5754632\x17\x07&#\x22\x06\x15\x15\ +!\x03\x0a\xfe\xf8\xfe\xcf\xa8\xa8\xbc\xcf\x9e{N\x5cN\ +A:\x01\x08\x03y\xfc\x87\x03y\x93RR\xbf\xb0/\ +\xe0\x1dM\xfe\xcf\x011\x05\x7f\x95\x95GO\xfb\x17\x04^\ +\x00\x00\x02\xff}\xfe\x14\x01\xdf\x06\x14\x00\x0d\x00\x16\x00\ +/@\x18\x12\x0b\x0b\x0e\x02\x08\x08\x17\x10\x15IY\x10\ +\x00\x09\x0f\x03\x05\x00\x05GY\x00\x1b\x00?+\x11\x00\ +3\x18??+\x11\x013\x11333\x11310\ +\x13\x22'5\x163265\x11!\x11\x14\x06\x034\ +32\x15\x14\x06#\x22FuTFIMG\x011\ +\xcep\xa6\xa6SS\xa6\xfe\x14\x19\xf0\x13VT\x04\xaa\ +\xfb)\xb2\xc1\x07k\x95\x95GO\x00\x00\x01\x00\xa0\x00\ +\x00\x04\xf6\x06\x14\x00\x0e\x00I@#\x04\x07\x07\x08\x02\ +\x03\x03\x06\x05\x05\x10\x0e\x0a\x0d\x0d\x08\x08\x0a\x0a\x0f\x0b\ +\x00\x04\x07\x07\x08\x08\x0e\x0e\x03\x06\x0a\x15\x03\x0f\x00?\ +?3\x129\x113\x119\x113?\x11\x013\x113\ +\x113\x11\x129\x113\x1133\x113\x129\x113\ +10\x017\x01!\x01\x01!\x01\x07\x11!\x11!\x11\ +\x07\x01\xc5\x85\x019\x01X\xfeD\x01\xd7\xfe\xa0\xfe\xbe\ +\x83\xfe\xcf\x011\x10\x02`\xaa\x01T\xfe\x1b\xfd\x87\x01\ +\xc5i\xfe\xa4\x06\x14\xfdJ\xfe\x00\x01\x00\xa0\x00\x00\x01\ +\xd1\x06\x14\x00\x03\x00\x13\xb7\x00\x01\x01\x04\x02\x00\x01\x15\ +\x00??\x11\x013\x11310!!\x11!\x01\xd1\ +\xfe\xcf\x011\x06\x14\x00\x00\x01\x00\xa0\x00\x00\x07B\x04\ +s\x00#\x00M@&\x14\x13\x13\x00\x00\x01\x01\x0a\x1c\ +\x1c\x1b\x1b%\x0d\x09\x09\x0a\x0a$\x13\x0d\x0d\x11 \x05\ +\x11\x05GY\x17\x11\x10\x0b\x0f\x1c\x01\x0a\x15\x00?3\ +3??3+\x11\x003\x129\x113\x11\x013\x11\ +3\x129\x113\x113\x11\x129\x113\x129\x113\ +10!!\x114&#\x22\x06\x15\x11!\x113\x17\ +36632\x1736632\x16\x15\x11!\x11\ +4&#\x22\x06\x15\x04\x89\xfe\xcfQWuj\xfe\xcf\ +\xe9)\x11-\xaan\xfbY\x1b-\xafn\xbe\xc3\xfe\xce\ +QWpo\x02\x8dyy\xac\xc5\xfd\xf2\x04^\x8fM\ +W\xa4NV\xc3\xd7\xfd'\x02\x8dyy\xa0\xae\x00\x00\ +\x01\x00\xa0\x00\x00\x04\xa8\x04s\x00\x14\x001@\x18\x01\ +\x00\x00\x16\x0d\x09\x09\x0a\x0a\x15\x0d\x05\x11\x11\x05GY\ +\x11\x10\x0b\x0f\x01\x0a\x15\x00?3??+\x11\x12\x00\ +9\x11\x013\x113\x129\x113\x11310!!\ +\x114&#\x22\x06\x15\x11!\x113\x173663\ +2\x16\x15\x04\xa8\xfe\xcfV^\x80r\xfe\xcf\xe9)\x11\ +3\xb3r\xc3\xca\x02\x8dyy\xab\xc6\xfd\xf2\x04^\x8f\ +QS\xd3\xc7\x00\x00\x02\x00\x5c\xff\xec\x04\x98\x04s\x00\ +\x0b\x00\x19\x00(@\x14\x06\x0c\x0c\x1b\x00\x13\x13\x1a\x16\ +\x09GY\x16\x10\x0f\x03GY\x0f\x16\x00?+\x00\x18\ +?+\x11\x013\x113\x113\x11310\x01\x14\x16\ +32654&#\x22\x06\x05\x10\x00!\x22&\x02\ +5\x10\x00!2\x16\x12\x01\x93m{zkl{z\ +l\x03\x05\xfe\xe0\xfe\xff\xa1\xf6\x84\x01\x1e\x01\x03\xa1\xf6\ +\x84\x021\xa6\xaa\xa9\xa7\xa6\xa6\xa5\xa7\xfe\xef\xfe\xcc\x8d\ +\x01\x08\xb0\x01\x12\x010\x8c\xfe\xfa\x00\x00\x02\x00\xa0\xfe\ +\x14\x04\xb4\x04s\x00\x13\x00\x1f\x00C@\x22\x18\x06\x06\ +\x07\x0a\x03\x03\x07\x1d\x10\x07\x10 !\x03\x0a\x00\x0d\x0d\ +\x14GY\x0d\x10\x08\x0f\x07\x1b\x00\x1bGY\x00\x16\x00\ +?+\x00\x18???+\x11\x12\x0099\x11\x12\x01\ +99\x113\x113\x113\x113\x11310\x05\x22\ +'#\x16\x15\x11!\x113\x173632\x12\x11\x14\ +\x02\x06\x03\x22\x06\x07\x15\x14\x1632\x114&\x03\x06\ +\xc5p\x10\x10\xfe\xcf\xf8+\x0ek\xd2\xc6\xe0i\xc2\xdd\ +qh\x02kt\xcde\x14\x8f\x8c\x16\xfe;\x06J\x91\ +\xa6\xfe\xce\xfe\xf0\xb3\xfe\xf8\x8a\x03\x93\x8b\xa0!\xb4\x9c\ +\x01R\xa5\xa5\x00\x00\x02\x00\x5c\xfe\x14\x04q\x04s\x00\ +\x0b\x00 \x00B@!\x16\x03\x1d\x03\x1a\x1a\x19\x19\x22\ +\x09\x0f\x0f!\x1a\x1b\x17\x0f\x1e\x16\x0c\x12\x12\x07GY\ +\x12\x10\x0c\x00GY\x0c\x16\x00?+\x00\x18?+\x11\ +\x12\x0099\x18??\x11\x013\x113\x113\x113\ +\x1299\x11310%26754&#\x22\ +\x11\x14\x16\x17\x22\x02\x11\x10\x1232\x16\x1737!\ +\x11!\x1147#\x06\x06\x02otl\x05o{\xd7\ +k\x04\xc6\xe0\xe5\xc7j\x9e<\x08\x1b\x01\x02\xfe\xce\x0d\ +\x0d1\xa2\xdb\x85\xa6%\xb4\x9c\xfe\xae\xa8\xa6\xef\x011\ +\x01\x10\x01\x12\x014PT\x8f\xf9\xb6\x01\xd5=kQ\ +T\x00\x01\x00\xa0\x00\x00\x03w\x04s\x00\x10\x00%@\ +\x11\x02\x12\x0d\x09\x09\x0a\x0a\x11\x0b\x0f\x0a\x15\x0d\x05\x05\ +\x00\x10\x00?2\x119??\x11\x013\x113\x129\ +\x11310\x012\x17\x03&#\x22\x06\x15\x11!\x11\ +3\x17366\x03\x10>)\x17%5\x92\xa3\xfe\xcf\ +\xe7-\x0f4\xb1\x04s\x09\xfe\xe2\x0a\x96\x87\xfd\xc7\x04\ +^\xbc^s\x00\x00\x01\x00\x5c\xff\xec\x03\xac\x04s\x00\ +%\x00?@\x1f\x06\x19\x14\x0c\x00\x00'\x1f\x14\x14&\ +\x00\x0c\x14\x1f\x0c\x1f\x0a\x1d\x17\x1dFY\x17\x10\x03\x0a\ +FY\x03\x16\x00?+\x00\x18?+\x11\x12\x0099\ +\x113\x113\x11\x013\x113\x113\x113\x1299\ +10\x01\x14\x06#\x22&'5\x16\x163254\ +&&'.\x0254632\x17\x07&&#\x22\ +\x15\x14\x16\x17\x1e\x02\x03\xac\xef\xeez\xacKU\xd5Q\ +\xa6,lZ\x81y7\xe7\xd4\xca\xbf\x5cT\x92L\x87\ +W\x93\x83z:\x01L\xac\xb4! \xfc(6`$\ +-9&6\x5cwW\x95\xa3X\xdc$.I)<\ +;5\x5cx\x00\x00\x01\x00/\xff\xec\x037\x05L\x00\ +\x15\x00=@\x1e\x0c\x08\x0f\x0f\x13\x13\x0a\x08\x02\x11\x08\ +\x11\x16\x17\x0a\x12\x0f\x12FY\x0d\x0c\x0f\x0f\x05\x00G\ +Y\x05\x16\x00?+\x00\x18?3\xc1+\x11\x003\x11\ +\x12\x0199\x113\x1133\x113\x11\x12910\ +%27\x15\x06#\x22&5\x11#5773\x15\ +!\x15!\x11\x14\x16\x02wPpr\xa6\xb7\xa7\x92\xa8\ +X\xc3\x019\xfe\xc7I\xdf#\xe33\xb9\xb9\x02\x1b\x81\ +f\xec\xee\xe5\xfd\xe5A>\x00\x00\x01\x00\x9a\xff\xec\x04\ +\xa2\x04^\x00\x14\x002@\x18\x02\x11\x11\x14\x14\x16\x0b\ +\x08\x08\x15\x12\x09\x0f\x02\x05\x0e\x05\x0eGY\x05\x16\x00\ +\x15\x00??+\x11\x12\x009\x18?3\x11\x013\x11\ +3\x113\x113\x12910!'#\x06\x06#\x22\ +&5\x11!\x11\x14\x163265\x11!\x11\x03\xb8\ +)\x101\xb4s\xc5\xc8\x011V^\x80r\x011\x8f\ +NU\xd3\xc6\x02\xd9\xfdsyy\xab\xc6\x02\x0e\xfb\xa2\ +\x00\x00\x01\x00\x00\x00\x00\x04\x8d\x04^\x00\x0b\x00,@\ +\x14\x0b\x00\x05\x05\x02\x09\x09\x0a\x0a\x0d\x02\x01\x01\x0c\x09\ +\x01\x0f\x05\x00\x15\x00?2?3\x11\x013\x113\x11\ +3\x113\x11\x129\x113310!\x01!\x13\x16\ +\x17367\x13!\x01\x01\xaa\xfeV\x01?\xd8$\x09\ +\x06\x05(\xd7\x01?\xfeV\x04^\xfd\x83yl`\x85\ +\x02}\xfb\xa2\x00\x00\x01\x00\x14\x00\x00\x06\xc5\x04^\x00\ +\x1d\x00J@$\x05\x04\x0a\x10\x0f\x03\x1d\x00\x17\x17\x03\ +\x0a\x03\x07\x1b\x1b\x1c\x1c\x1f\x07\x06\x06\x1e\x17\x0a\x0a\x03\ +\x05\x0f\x0f\x1b\x06\x0f\x00\x05\x15\x00?3?33\x11\ +\x1299\x113\x11\x013\x113\x113\x113\x11\x12\ +\x179\x1133\x1133\x113310!\x03\x03\ +#\x03!\x01!\x13\x16\x173677\x13!\x13\x1e\ +\x03\x173667\x13!\x01\x047Vt\x07\xcc\xfe\ +\xb8\xfe\xc2\x010\x81\x1f \x06\x04\x1f\x10\x8a\x01P\x83\ +\x04\x11\x10\x0d\x01\x06\x09.\x0a\x86\x01+\xfe\xbe\x01\x87\ +\x01\xee\xfc\x8b\x04^\xfe\x11\x85\xeaL\xa5U\x02\x18\xfd\ +\xe8\x16Va]\x1cH\xfb,\x01\xef\xfb\xa2\x00\x01\x00\ +\x0a\x00\x00\x04\x96\x04^\x00\x0b\x00L@$\x06\x05\x00\ +\x01\x09\x03\x03\x02\x04\x02\x01\x04\x05\x01\x05\x0b\x08\x07\x07\ +\x0d\x0a\x0b\x0b\x0c\x09\x06\x03\x00\x00\x01\x08\x0b\x15\x04\x01\ +\x0f\x00?3?3\x129\x11333\x11\x013\x11\ +3\x113\x113\x1299\x113\x113\x11\x129\x11\ +3\x129\x12910\x01\x01!\x13\x13!\x01\x01!\ +\x03\x03!\x01\x85\xfe\x98\x01Z\xd9\xdb\x01Z\xfe\x94\x01\ +}\xfe\xa5\xeb\xec\xfe\xa6\x02;\x02#\xfe\x9c\x01d\xfd\ +\xdd\xfd\xc5\x01\x7f\xfe\x81\x00\x01\x00\x00\xfe\x14\x04\x8d\x04\ +^\x00\x16\x00L@%\x0b\x14\x14\x10\x16\x16\x04\x04\x01\ +\x08\x08\x09\x09\x18\x10\x01\x00\x00\x17\x0b\x14\x14\x12\x04\x16\ +\x15\x10\x12\x0d\x12GY\x0d\x1b\x08\x00\x0f\x00?2?\ ++\x11\x003\x18?3\x129\x113\x11\x013\x113\ +3\x113\x113\x11\x129\x113\x11\x129\x1131\ +0\x11!\x13\x16\x17367\x13!\x01\x06\x06#\x22\ +'5\x1632677\x01N\xd3\x1b\x0a\x06\x0b \ +\xcf\x01G\xfe'A\xf1\xa1OL7AQy\x22\x12\ +\x04^\xfd\x8bRpg[\x02u\xfb\x13\xaf\xae\x11\xf2\ +\x0dcd7\x00\x00\x01\x007\x00\x00\x03\xaa\x04^\x00\ +\x09\x00=@\x1e\x03\x07\x04\x07\x01\x00\x00\x0b\x08\x01\x01\ +\x0a\x07\x04\x05\x05\x04FY\x05\x0f\x02\x08\x01\x01\x08F\ +Y\x01\x15\x00?+\x11\x12\x009\x18?+\x11\x12\x00\ +9\x11\x013\x113\x113\x11\x1299\x11310\ +!!5\x01!5!\x15\x01!\x03\xaa\xfc\x8d\x02\x06\ +\xfe\x19\x03B\xfe\x08\x02\x0a\xb4\x02\xc1\xe9\xc6\xfdQ\x00\ +\x01\x00\x1f\xfe\xbc\x02\xd5\x05\xb6\x00\x1f\x006@\x19\x03\ +\x14\x08\x1f\x1f\x11\x18\x18 \x0d\x1c\x1c!\x04\x03\x13\x13\ +\x0d\x1b\x1b\x1c$\x0d\x0c\x03\x00?3?3\x11\x129\ +\x1133\x11\x013\x113\x129\x1133\x1133\ +910\x014춯\x11463\ +\x15\x06\x06\x15\x11\x06\x07\x15\x16\x15\x15\x11\x14\x16\x17\x15\ +\x22&5\x01\x1f\x83}~\x82\xc2\xf4cK\x06\xe4\xea\ +Jd\xf4\xc2\x01\x0eW\x5c\xefXR\x08\x01>\x99}\ +\xe1\x03FD\xfe\xd5\xbc\x22\x0c#\xb1\x09\xfe\xd5DF\ +\x03\xe2}\x9a\x00\x00\x01\x01\xc7\xfe/\x02\xa2\x06\x0e\x00\ +\x03\x00\x14\xb7\x02\x03\x03\x04\x05\x03\x00\x00\x00?/\x11\ +\x12\x019\x11310\x013\x11#\x01\xc7\xdb\xdb\x06\ +\x0e\xf8!\x00\x01\x00R\xfe\xbc\x03\x08\x05\xb6\x00\x22\x00\ +6@\x19\x1f\x1a\x0d\x00\x00\x10\x08\x08$\x14\x04\x04#\ +\x1f\x1e\x0e\x0e\x14\x05\x14\x15\x03\x05\x04$\x00?3?\ +3\x11\x129\x1133\x11\x013\x113\x129\x113\ +3\x1133910\x05\x14\x06\x06#5665\ +\x1154675&'\x114&'52\x16\x16\ +\x15\x11\x15\x14\x163\x15\x22\x06\x15\x02\x08R\xbd\xa7c\ +Kvs\xe3\x06Jd\xa7\xbeQ{\x85}\x83-p\ +r5\xe2\x02DG\x01+\x0bVk\x11\x0c\x22\xbc\x01\ ++FD\x03\xe15sn\xfe\xc2\x0aTT\xefRa\ +\x00\x00\x01\x00X\x02'\x049\x03}\x00\x15\x007@\ +\x18\x06\x00\x11\x0b\x00\x0b\x03\x0f\x0f\x17\x03\x16\x0f\x0e\x0e\ +\x06\x04\x03\x03\x0b\x11\x11\x00\x06\x00/32}/3\ +3\x113\x113\x113\x11\x013\x113\x11\x1299\ +\x113\x11310\x01\x22\x06\x075632\x16\x17\ +\x163267\x15\x06#\x22&'&\x01B7}\ +6g\x99I\x81K\x81b5~6e\x9bBxZ\ +\x83\x02\xa0C6\xe7m 7@9\xe7m\x1a%\ +8\x00\x02\x00u\xfe\x8f\x01\xd3\x04^\x00\x03\x00\x0f\x00\ +&@\x12\x03\x0a\x0a\x02\x04\x04\x11\x10\x00\x07\x0d\x07T\ +Y\x0d\x0f\x03\x22\x00??+\x11\x003\x11\x12\x019\ +\x1133\x11310\x133\x13!\x01\x14\x06#\x22\ +&54632\x16\xa8\xf43\xfe\xa6\x01^ZV\ +S[]QT\x5c\x02^\xfc1\x05%TVXR\ +QYX\x00\x01\x00\x8f\xff\xec\x04\x10\x05\xcb\x00\x1b\x00\ +D@#\x11\x08\x1a\x1a\x05\x1b\x1b\x02\x17\x17\x0a\x02\x0a\ +\x1c\x1d\x19\x13OY\x08\x0eOY\x00\x05\x08\x19\x08\x19\ +\x08\x06\x1b\x19\x06\x07\x00??\x1299//\x129\ +9++\x11\x12\x0199\x113\x11\x129\x1133\ +\x113210%$\x11\x10\x12753\x15\x16\x17\ +\x07&&#\x22\x06\x15\x103267\x15\x06\x07\x15\ +#\x023\xfe\x5c\xd1\xd3\xb2\xa6\x85ZH|>yt\ +\xedR\x84d\x7f\x8a\xb2\xb0;\x01\xfa\x01\x05\x01\x1c\x1f\ +\xa6\x9e\x09A\xeb\x1d$\xa7\xab\xfe\xb9\x1f-\xfe=\x09\ +\xbc\x00\x01\x00R\x00\x00\x04j\x05\xcb\x00\x1d\x00X@\ +,\x0f\x12\x0b\x02\x09\x0d\x0d\x1a\x16\x16\x02\x18\x10\x18\x12\ +\x12\x10\x1e\x1f\x0c\x18\x19\x18QY\x09\x19\x19\x00\x13\x12\ +\x0f\x12\x0fNY\x12\x18\x00\x05OY\x00\x07\x00?+\ +\x00\x18?+\x11\x12\x009\x119\x18/3+\x11\x00\ +3\x11\x12\x0199\x113\x11\x1299\x1133\x11\ +3\x129\x12910\x012\x17\x07&#\x22\x06\x15\ +\x15!\x15!\x15\x14\x07!\x11!56655#\ +53546\x02\xbc\xc3\xc3]\x9dsNT\x01w\ +\xfe\x89\x97\x02\xce\xfb\xe8gM\xb2\xb2\xe5\x05\xcbR\xe6\ +@YS\xc1\xdb\x8f\xaaN\xfe\xfc\xf8,rd\x91\xdb\ +\xc3\xc9\xd9\x00\x02\x00q\x00\xfe\x04!\x04\xaa\x00\x1b\x00\ +'\x00<@\x22\x10\x0c\x13\x09\x05\x17\x1a\x02\x08\x00\x0e\ +\x0e\x22\x1c\x00\x1c\x1c()\x17\x13\x10\x1a\x02\x0c\x09\x05\ +\x08\x07\x15\x15\x1f\x07%\x00/3\xc62\x11\x12\x179\ +\x11\x12\x019\x113\x10\xc22\x11\x12\x17910\x13\ +47'7\x17632\x177\x17\x07\x16\x15\x14\x07\ +\x17\x07'\x06#\x22'\x07'7&7\x14\x1632\ +654&#\x22\x06\xbc6\x81\x93\x7f[ji[\ +\x7f\x96\x8155}\x92\x7f_esT}\x91\x7f6\ +\xcfmPQoqONo\x02\xd3f_\x7f\x93\x7f\ +57\x81\x8f\x81Ynk\x5c}\x91}33{\x91\ +}]hMonNPnp\x00\x00\x01\x00\x06\x00\ +\x00\x04\x89\x05\xb6\x00\x16\x00q@8\x0e\x12\x14\x12\x15\ +\x0d\x11\x11\x00\x09\x05\x03\x05\x02\x0a\x06\x06\x00\x00\x16\x01\ +\x01\x02\x02\x18\x16\x15\x15\x17\x06\x12\x13\x12RY\x00\x03\ +\x01\x03\x13\x0f\x0a\x0e\x0f\x0eRY\x07\x0f\x0f\x0c\x01\x15\ +\x06\x0c\x18\x00??3\x129/3+\x11\x003\x18\ +\x10\xc62\x11\x129+\x11\x003\x11\x013\x113\x11\ +3\x113\x11\x129\x113\x113\x1299\x113\x11\ +3\x113\x1299\x11310\x01\x01!\x013\x15\ +#\x153\x15#\x15!5#535#53\x01\ +!\x02H\x01\x08\x019\xfe\x81\xc3\xf6\xf6\xf6\xfe\xe1\xf7\ +\xf7\xf7\xbe\xfe\x87\x01<\x03\x5c\x02Z\xfd\x15\xb2\x8a\xb2\ +\xdd\xdd\xb2\x8a\xb2\x02\xeb\x00\x02\x01\xc7\xfe/\x02\xa2\x06\ +\x0e\x00\x03\x00\x07\x00#@\x0f\x02\x06\x06\x03\x07\x07\x08\ +\x09\x04\x03\x04\x03\x07\x00\x00\x00?/99//\x11\ +\x12\x019\x1133\x11310\x013\x11#\x113\ +\x11#\x01\xc7\xdb\xdb\xdb\xdb\x06\x0e\xfc\xd1\xfe\x7f\xfc\xd1\ +\x00\x00\x02\x00j\xff\xec\x03\x7f\x06)\x00-\x008\x00\ +U@*\x0a\x11\x17\x11\x05\x05.\x22\x00'\x1c\x1c3\ +\x17\x00\x179:\x0366\x13\x1911*\x13*\x0e\ +%\x1f%KY\x1f\x16\x08\x0eKY\x08\x01\x00?+\ +\x00\x18?+\x11\x12\x0099\x113\x113\x113\x11\ +3\x11\x12\x0199\x1133\x113\x11333\x11\ +3\x11\x12910\x13467&54632\ +\x17\x07&&#\x22\x06\x15\x14\x16\x17\x16\x16\x15\x14\x07\ +\x16\x16\x15\x14\x06#\x22'5\x16\x163254&\ +&'&&7\x14\x16\x17654&'\x06\x06y\ +H=\x85\xdf\xb6\xaa\xc1RD\x8dNQJcr\xa3\ +\x9a}>?\xef\xc9\xcb\x92Q\xc6F\xc2%ZP\xb7\ +\x8a\xdf\x82tNe\x85%5\x03%O\x83(T\x95\ +\x83\x9eT\xbe 3.01J-@\xa9m\xb1S\ +(iJ\x94\xafO\xcf)9u'03\x22J\x9d\ +\x8bCh.9YD^1\x0eO\x00\x02\x01\x17\x04\ +\xf8\x03\xc5\x06\x04\x00\x0b\x00\x17\x00 @\x0d\x12\x0c\x00\ +\x06\x00\x00\x18\x19\x0f\x03\x03\x15\x09\x00/33\x113\ +\x11\x12\x019\x113\x10\xcc210\x014632\ +\x16\x15\x14\x06#\x22&%4632\x16\x15\x14\x06\ +#\x22&\x01\x17K@BKLA@K\x01\x93Q\ +?^\x5c\x00\ +\x02\x00X\x00\x00\x049\x05\x02\x00\x0b\x00\x0f\x006@\ +\x18\x0f\x07\x07\x06\x0a\x0a\x0b\x0c\x01\x01\x03\x0b\x0b\x10\x11\ +\x0d\x0c\x0b\x09\x01\x01\x06\x04\x02\x00/333\x113\ +3/3\x11\x12\x019\x1133\x113\x113\x113\ +3\x11310\x01!5!\x113\x11!\x15!\x11\ +#\x015!\x15\x01\xdb\xfe}\x01\x83\xdb\x01\x83\xfe}\ +\xdb\xfe}\x03\xe1\x02\xa2\xdb\x01\x85\xfe{\xdb\xfe\x7f\xfe\ +\xdf\xdb\xdb\x00\x01\x00/\x02J\x02\xbe\x05\xcb\x00\x16\x00\ +(@\x12\x15\x0c\x01\x06\x00\x11\x01\x11\x17\x18\x09\x0e\x1f\ +\x02\x15\x15\x01 \x00?3\x129?3\x11\x12\x019\ +9\x1133\x113310\x01!57665\ +4&#\x22\x07'632\x16\x15\x14\x06\x07\x07!\ +\x02\xbe\xfdy\xe0f90(Qc{\x93\xbd\x89\x9e\ +^\x81i\x01`\x02J\xa8\xdbdY2&(X\x98\ +\x81\x85uU\x96u_\x00\x01\x00;\x029\x02\xb6\x05\ +\xc9\x00%\x00>@\x1d\x14\x0b\x02\x19\x19\x00\x00 \x06\ + \x0b\x10\x06\x0b\x06&'\x03\x14\x14\x15\x15\x09\x1c#\ +\x1f\x0e\x09!\x00?3?3\x129/3\x129\x11\ +\x12\x0199\x113\x113\x11\x129\x113\x113\x12\ +910\x01\x14\x07\x15\x16\x16\x15\x14\x06#\x22'5\ +\x163254&##532654&#\ +\x22\x06\x07'6632\x16\x02\x9a\xaa^h\xb0\xba\ +\x8f\x82\x94{\x8fXNp\x5cSQ23/T9\ +e>\x97g\x7f\xa2\x04\xe1\x8f7\x0d\x14nOy\x8b\ +F\xbeZk55\xa049&2&(\x8d/>\ +\x80\x00\x01\x01L\x04\xd9\x03\x8d\x06!\x00\x08\x00\x1c@\ +\x0b\x03\x04@\x08\x00\x00\x09\x0a\x04\x80\x00\x00/\x1a\xcd\ +\x11\x12\x019\x113\x1a\xc9210\x01567!\ +\x15\x06\x06\x07\x01L\xac?\x01V4\xfbG\x04\xd9\x1b\ +\xc8e\x154\xcd2\x00\x00\x01\x00\xa0\xfe\x14\x04\xa8\x04\ +^\x00\x18\x00?@\x1f\x0b\x06\x06\x09\x09\x1a\x12\x16\x00\ +\x15\x15\x16\x16\x19\x07\x17\x0f\x16\x1b\x12\x0c\x0f\x03\x0f\x03\ +GY\x0f\x16\x0a\x15\x00??+\x11\x12\x0099\x18\ +??3\x11\x013\x113\x113\x129\x113\x113\ +\x12910\x01\x14\x163265\x11!\x11#'\ +#\x06\x06#\x22&'\x17\x17\x11!\x11!\x01\xd1X\ +^~r\x011\xe7+\x0f*xX>h \x05\x05\ +\xfe\xcf\x011\x01\xd1yy\xad\xc4\x02\x0e\xfb\xa2\x96U\ +U.,U\x9d\xfe\xc0\x06J\x00\x01\x00q\xfe\xfc\x04\ +\x8f\x06\x14\x00\x0f\x00/@\x15\x0b\x10\x04\x05\x01\x00\x01\ +\x01\x10\x11\x08\x08\x01\x0e\x0e\x03MY\x0e\x05\x01\x00/\ +3/+\x11\x12\x009\x18/\x11\x12\x019\x113\x10\ +\xc42\x11910\x01#\x11#\x11#\x11\x06#\x22\ +&5\x1063!\x04\x8f\xa1\xa6\xa2>T\xd8\xcb\xda\ +\xe8\x02\x5c\xfe\xfc\x06P\xf9\xb0\x033\x12\xfa\xfb\x01\x04\ +\xfe\x00\x01\x00u\x02)\x01\xd3\x03}\x00\x0b\x00\x15@\ +\x09\x06\x00\x00\x0c\x03\x09TY\x03\x00/+\x11\x013\ +\x11310\x134632\x16\x15\x14\x06#\x22&\ +uZVS[]QT\x5c\x02\xd3TVXRQ\ +YX\x00\x00\x01\xff\xdb\xfe\x14\x01\xa2\x00\x00\x00\x12\x00\ +4@\x17\x10\x0d\x0d\x05\x05\x00\x0b\x0b\x13\x14\x10\x10\x0d\ +\x14\x0d\x13\x09\x0e\x06\x09\x09\x03\x1b\x00?3\x113/\ +\x11\x129\x11\x129|/\x11\x12\x019\x1133\x12\ +9\x11310\x05\x14\x06#\x22'5\x16\x1632\ +54'73\x07\x16\x16\x01\xa2\x97\x9eND\x1b[\ +\x19H\xa6N\xc1\x1bJX\xfa\x80r\x15\xa8\x07\x0e>\ +S\x19\x9a=\x18e\x00\x00\x01\x00\x5c\x02J\x02H\x05\ +\xb6\x00\x0a\x00*@\x13\x04\x09\x00\x00\x08\x01\x01\x0b\x0c\ +\x08\x07\x07\x01\x04\x04\x09\x1e\x01 \x00??3\x11\x12\ +9\x113\x11\x12\x019\x1133\x129910\x01\ +#\x1177\x06\x07\x07'%3\x02H\xee\x03\x05\x1b\ +0Nm\x01-\xbf\x02J\x01\xbep_$*=\x7f\ +\xeb\x00\x02\x009\x02\xf0\x02\xe1\x05\xc7\x00\x0b\x00\x17\x00\ +\x1f@\x0d\x0c\x06\x12\x00\x06\x00\x18\x19\x0f\x03\x15\x09\x1f\ +\x00?3\xc42\x11\x12\x0199\x113\x11310\ +\x01\x14\x06#\x22&54632\x16\x05\x14\x163\ +2654&#\x22\x06\x02\xe1\xb7\x9f\x99\xb9\xb3\xa3\ +\x98\xba\xfe#AHH??HHA\x04\x5c\xab\xc1\ +\xc5\xa7\xa9\xc2\xc5\xa6deeddcc\x00\x02\x00\ +R\x00^\x04\x9a\x04\x04\x00\x06\x00\x0d\x00Z@*\x0b\ +\x09\x09\x0a\x07\x08\x04\x02\x02\x03\x00\x05\x01\x08\x0c\x08\x08\ +\x0e\x0d\x06\x06\x03\x07\x00\x00\x0a\x03\x03\x04\x09\x02\x02\x08\ +\x01\x01\x05\x0e\x0b\x04\x04\x0c\x05\x00/33\x113\x11\ +\x129/33\x113\x129\x1133\x113\x113\ +\x113\x11\x013\x113\x10\xd62\xc123\x113\x10\ +\xc123\x11310\x01\x01'\x01\x017\x01\x05\x01\ +'\x01\x017\x01\x04\x9a\xfe\x8d\xdb\x01\x16\xfe\xea\xdb\x01\ +s\xfe\x06\xfe\x8d\xdb\x01\x16\xfe\xea\xdb\x01s\x02#\xfe\ +;w\x01\x5c\x01\x5cw\xfe9\x1a\xfe;w\x01\x5c\x01\ +\x5cw\xfe9\x00\xff\xff\x00.\x00\x00\x06\x92\x05\xb6\x00\ +&\x00{\xd2\x00\x00'\x02\x17\x02\xc9\x00\x00\x01\x07\x02\ +<\x03\x9c\xfd\xb7\x00\x09\xb3\x03\x02\x12\x18\x00?55\ +\x00\xff\xff\x00.\x00\x00\x06\xb4\x05\xb6\x00&\x00{\xd2\ +\x00\x00'\x02\x17\x02\xc9\x00\x00\x01\x07\x00t\x03\xf6\xfd\ +\xb7\x00\x07\xb2\x02\x10\x18\x00?5\x00\xff\xff\x00Z\x00\ +\x00\x06\xb0\x05\xc9\x00&\x00u\x1f\x00\x00'\x02\x17\x03\ +\x10\x00\x00\x01\x07\x02<\x03\xba\xfd\xb7\x00\x09\xb3\x03\x02\ +-\x18\x00?55\x00\x00\x02\x00=\xfey\x03\xd7\x04\ +^\x00\x1b\x00'\x00F@$\x22\x1c\x1c\x1b\x00\x00\x07\ +\x07\x14\x14\x0e(\x0e)\x00\x1b\x10\x1b\x02\x09\x03\x1b\x1b\ +%%\x1fTY%\x0f\x11\x0aOY\x11#\x00?+\ +\x00\x18?+\x11\x003\x18/_^]\x11\x013\x11\ +\x129\x113\x119\x1133\x11310\x01\x15\x14\ +\x06\x07\x06\x06\x15\x14\x163267\x17\x06\x06#\x22\ +&54676655\x01\x14\x06#\x22&5\ +4632\x16\x02\xc9Ylm9WYO\xb4`\ +fb\xf7j\xdc\xfba\x8f_5\x01(ZVS[\ +]QT\x5c\x02^Jb\x8eMNX?9J:\ +*\xdd8E\xc1\xa9l\x9eiFJ=;\x01VT\ +VXRQYX\x00\xff\xff\x00\x00\x00\x00\x05\x85\x07\ +s\x02&\x00$\x00\x00\x01\x07\x00C\x00\x06\x01R\x00\ +\x08\xb3\x02\x16\x05&\x00+5\xff\xff\x00\x00\x00\x00\x05\ +\x85\x07s\x02&\x00$\x00\x00\x01\x07\x00v\x00\xd1\x01\ +R\x00\x08\xb3\x02\x16\x05&\x00+5\xff\xff\x00\x00\x00\ +\x00\x05\x85\x07s\x02&\x00$\x00\x00\x01\x07\x01K\x00\ +V\x01R\x00\x08\xb3\x02\x1b\x05&\x00+5\xff\xff\x00\ +\x00\x00\x00\x05\x85\x07`\x02&\x00$\x00\x00\x01\x07\x01\ +R\x00V\x01R\x00\x08\xb3\x02\x12\x05&\x00+5\xff\ +\xff\x00\x00\x00\x00\x05\x85\x07V\x02&\x00$\x00\x00\x01\ +\x07\x00j\x00V\x01R\x00\x0a\xb4\x03\x02#\x05&\x00\ ++55\xff\xff\x00\x00\x00\x00\x05\x85\x07\x0a\x02&\x00\ +$\x00\x00\x01\x06\x01PuX\x00\x09\xb3\x03\x02#\x03\ +\x00?55\x00\x00\x02\x00\x00\x00\x00\x07%\x05\xb6\x00\ +\x0f\x00\x13\x00o@<\x06\x13\x03\x10\x13\x03\x11\x04\x11\ +\x01\x0a\x0e\x0e\x01\x01\x05\x0c\x08\x00\x00\x15\x04\x05\x05\x14\ +\x10\x03LY\x0a\x0dLY\x0c\x0a\x01\x0d\x03\x10\x0a\x10\ +\x0a\x01\x06\x13\x09\x06\x09LY\x06\x03\x04\x12\x01\x0eL\ +Y\x01\x12\x00?+\x00\x18??+\x11\x003\x11\x12\ +99\x18//_^]++\x11\x013\x113\x11\ +3\x1133\x129\x113\x113\x113\x11\x12\x179\ +\x11310!!\x11!\x03!\x01!\x15!\x11!\ +\x15!\x11!\x01!\x11#\x07%\xfc\x97\xfe\x15\x96\xfe\ +\xc5\x02\x8f\x04\x96\xfd\xcd\x02\x0e\xfd\xf2\x023\xfb\x1d\x01\ +z\x7f\x01\x5c\xfe\xa4\x05\xb6\xfe\xfe\xbf\xfe\xfe\x87\x01`\ +\x02N\x00\xff\xff\x00w\xfe\x14\x04\xd1\x05\xcb\x02&\x00\ +&\x00\x00\x00\x07\x00z\x02\x1d\x00\x00\xff\xff\x00\xb8\x00\ +\x00\x04\x02\x07s\x02&\x00(\x00\x00\x01\x07\x00C\xff\ +\xb7\x01R\x00\x08\xb3\x01\x14\x05&\x00+5\xff\xff\x00\ +\xb8\x00\x00\x04\x02\x07s\x02&\x00(\x00\x00\x01\x07\x00\ +v\x00\x5c\x01R\x00\x08\xb3\x01\x14\x05&\x00+5\xff\ +\xff\x00\xaf\x00\x00\x04\x14\x07s\x02&\x00(\x00\x00\x01\ +\x07\x01K\xff\xf5\x01R\x00\x08\xb3\x01\x19\x05&\x00+\ +5\xff\xff\x00\xb8\x00\x00\x04\x02\x07V\x02&\x00(\x00\ +\x00\x01\x07\x00j\xff\xf9\x01R\x00\x0a\xb4\x02\x01!\x05\ +&\x00+55\xff\xff\x00*\x00\x00\x02\xdb\x07s\x02\ +&\x00,\x00\x00\x01\x07\x00C\xfe\xde\x01R\x00\x08\xb3\ +\x01\x14\x05&\x00+5\xff\xff\x00B\x00\x00\x03.\x07\ +s\x02&\x00,\x00\x00\x01\x07\x00v\xff\xa1\x01R\x00\ +\x08\xb3\x01\x14\x05&\x00+5\xff\xff\xff\xdc\x00\x00\x03\ +A\x07s\x02&\x00,\x00\x00\x01\x07\x01K\xff\x22\x01\ +R\x00\x08\xb3\x01\x19\x05&\x00+5\xff\xff\x009\x00\ +\x00\x02\xe7\x07V\x02&\x00,\x00\x00\x01\x07\x00j\xff\ +\x22\x01R\x00\x0a\xb4\x02\x01!\x05&\x00+55\x00\ +\x02\x00/\x00\x00\x05u\x05\xb6\x00\x0c\x00\x18\x00H@\ +$\x0d\x06\x06\x1a\x14\x12\x16\x16\x0c\x01\x0a\x0a\x19\x15\x0c\ +\x00\x0cLY\x12\x00\x00\x0a\x02\x0a\x16LY\x0a\x12\x02\ +\x11LY\x02\x03\x00?+\x00\x18?+\x11\x12\x009\ +\x18/3+\x11\x003\x11\x013\x11333\x113\ +3\x113\x11310\x133\x11! \x00\x11\x10\x00\ +!!\x11#%4&##\x113\x15#\x113 \ +/\x89\x01\xcb\x01f\x01\x8c\xfee\xfe|\xfeb\x89\x04\ +\x04\xd0\xd2\xa3\xed\xed\x83\x01\xc2\x03R\x02d\xfe\x86\xfe\ +\xad\xfe\x97\xfe\x80\x02T\x8d\xe8\xef\xfe\x9a\xfe\xfe\xac\xff\ +\xff\x00\xb8\x00\x00\x05\xc9\x07`\x02&\x001\x00\x00\x01\ +\x07\x01R\x00\xd3\x01R\x00\x08\xb3\x01\x14\x05&\x00+\ +5\xff\xff\x00w\xff\xec\x05\xe7\x07s\x02&\x002\x00\ +\x00\x01\x07\x00C\x00u\x01R\x00\x08\xb3\x02\x1e\x05&\ +\x00+5\xff\xff\x00w\xff\xec\x05\xe7\x07s\x02&\x00\ +2\x00\x00\x01\x07\x00v\x01F\x01R\x00\x08\xb3\x02\x1e\ +\x05&\x00+5\xff\xff\x00w\xff\xec\x05\xe7\x07s\x02\ +&\x002\x00\x00\x01\x07\x01K\x00\xc3\x01R\x00\x08\xb3\ +\x02#\x05&\x00+5\xff\xff\x00w\xff\xec\x05\xe7\x07\ +`\x02&\x002\x00\x00\x01\x07\x01R\x00\xc3\x01R\x00\ +\x08\xb3\x02\x1a\x05&\x00+5\xff\xff\x00w\xff\xec\x05\ +\xe7\x07V\x02&\x002\x00\x00\x01\x07\x00j\x00\xc3\x01\ +R\x00\x0a\xb4\x03\x02+\x05&\x00+55\x00\x01\x00\ +\x81\x01\x0c\x04\x10\x04\x9a\x00\x0b\x00\x1d@\x0b\x06\x03\x00\ +\x09\x09\x0c\x0d\x09\x06\x03\x00\x00\x19/222\x11\x12\ +\x019\x1133310\x01\x017\x01\x01\x17\x01\x01\ +\x07\x01\x01'\x01\xac\xfe\xd5\x98\x01-\x011\x99\xfe\xcf\ +\x01-\x95\xfe\xcf\xfe\xd3\x96\x02\xd3\x01-\x9a\xfe\xd5\x01\ ++\x96\xfe\xcf\xfe\xd1\x98\x01-\xfe\xd5\x98\x00\x00\x03\x00\ +w\xff\xa6\x05\xe7\x06\x04\x00\x13\x00\x1b\x00\x22\x009@\ +\x1c\x17\x1f\x1c\x14\x14\x0a\x1c\x00\x0a\x00#$\x16\x1e!\ +\x19\x0d\x19LY\x0d\x04\x03!LY\x03\x13\x00?+\ +\x00\x18?+\x11\x12\x0099\x11\x12\x0199\x113\ +\x113\x11\x129910\x01\x10\x00!\x22'\x07'\ +7&\x11\x10\x00!2\x177\x17\x07\x16\x01\x14\x17\x01\ +&#\x22\x06\x054'\x01\x163 \x05\xe7\xfe\x98\xfe\ +\xb0\xc5\x8bZ\xa2Z\xc6\x01i\x01Q\xc6\x92T\xa0X\ +\xc2\xfb\xd58\x01\xfaTi\xb9\xbc\x02\xe63\xfe\x0cL\ +h\x01s\x02\xdd\xfe\x95\xfezA\x87l\x88\xc2\x01\x83\ +\x01m\x01\x81F}h\x83\xc2\xfe\x86\xbft\x02\xf4-\ +\xf9\xf5\xb4u\xfd\x11'\xff\xff\x00\xae\xff\xec\x05^\x07\ +s\x02&\x008\x00\x00\x01\x07\x00C\x00+\x01R\x00\ +\x08\xb3\x01\x1b\x05&\x00+5\xff\xff\x00\xae\xff\xec\x05\ +^\x07s\x02&\x008\x00\x00\x01\x07\x00v\x01\x0e\x01\ +R\x00\x08\xb3\x01\x1b\x05&\x00+5\xff\xff\x00\xae\xff\ +\xec\x05^\x07s\x02&\x008\x00\x00\x01\x07\x01K\x00\ +\x9a\x01R\x00\x08\xb3\x01 \x05&\x00+5\xff\xff\x00\ +\xae\xff\xec\x05^\x07V\x02&\x008\x00\x00\x01\x07\x00\ +j\x00\x9a\x01R\x00\x0a\xb4\x02\x01(\x05&\x00+5\ +5\xff\xff\x00\x00\x00\x00\x04\xfe\x07s\x02&\x00<\x00\ +\x00\x01\x07\x00v\x00\x81\x01R\x00\x08\xb3\x01\x11\x05&\ +\x00+5\x00\x02\x00\xb8\x00\x00\x04\xaa\x05\xb6\x00\x0c\x00\ +\x15\x006@\x1c\x11\x00\x00\x17\x0d\x09\x05\x05\x06\x06\x16\ +\x04\x0dMY\x09\x15MY\x04\x09\x04\x09\x06\x07\x03\x06\ +\x12\x00??\x1299//++\x11\x013\x113\ +\x1133\x113\x11310\x01\x14\x04!#\x11!\ +\x11!\x1532\x04\x0132654&##\x04\ +\xaa\xfe\xe3\xfe\xfa\x99\xfe\xca\x016\xb2\xfe\x01\x0c\xfdD\ +d\x91\x8e\x7f\x88|\x03\x02\xe5\xf8\xfe\xdb\x05\xb6\xe5\xee\ +\xfe\x7fdt\x82\xfe\xcf\x01\ +%\x01\x02\xf4\x01&\x04\xd9@aL:0*\x16\x1b\ +4([bzN\xac\xae\x1d\x22\xf2$2{)3\ +<*HwQ@j17P.^\xfe;\x08\x00\xfeyxHN\x8b\xa0!\ +\xb4\x9c\x01R\xa5\xa5\x00\xff\xff\x00\x00\xfe\x14\x04\x8d\x06\ +\x04\x02&\x00\x5c\x00\x00\x01\x06\x00j\xdc\x00\x00\x0a\xb4\ +\x02\x01,\x11&\x00+55\xff\xff\x00\x00\x00\x00\x05\ +\x85\x06\xfe\x02&\x00$\x00\x00\x01\x07\x01M\x00X\x01\ +R\x00\x08\xb3\x02\x11\x05&\x00+5\xff\xff\x00V\xff\ +\xec\x04;\x05\xac\x02&\x00D\x00\x00\x01\x06\x01M\x0a\ +\x00\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\x00\x00\x00\ +\x00\x05\x85\x07}\x02&\x00$\x00\x00\x01\x07\x01N\x00\ +V\x01R\x00\x08\xb3\x02\x11\x05&\x00+5\xff\xff\x00\ +V\xff\xec\x04;\x06+\x02&\x00D\x00\x00\x01\x06\x01\ +N\x0c\x00\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\x00\ +\x00\xfe\x14\x05\x85\x05\xbc\x02&\x00$\x00\x00\x00\x07\x01\ +Q\x03{\x00\x00\xff\xff\x00V\xfe\x14\x04L\x04u\x02\ +&\x00D\x00\x00\x00\x07\x01Q\x02\xac\x00\x00\xff\xff\x00\ +w\xff\xec\x04\xd1\x07s\x02&\x00&\x00\x00\x01\x07\x00\ +v\x01\x0a\x01R\x00\x08\xb3\x01\x1f\x05&\x00+5\xff\ +\xff\x00\x5c\xff\xec\x03\xfc\x06!\x02&\x00F\x00\x00\x01\ +\x06\x00vo\x00\x00\x08\xb3\x01\x1e\x11&\x00+5\xff\ +\xff\x00w\xff\xec\x04\xd1\x07s\x02&\x00&\x00\x00\x01\ +\x07\x01K\x00\xaa\x01R\x00\x08\xb3\x01$\x05&\x00+\ +5\xff\xff\x00\x5c\xff\xec\x04\x0e\x06!\x02&\x00F\x00\ +\x00\x01\x06\x01K\xef\x00\x00\x08\xb3\x01#\x11&\x00+\ +5\xff\xff\x00w\xff\xec\x04\xd1\x07f\x02&\x00&\x00\ +\x00\x01\x07\x01O\x01\xd9\x01R\x00\x08\xb3\x01\x1e\x05&\ +\x00+5\xff\xff\x00\x5c\xff\xec\x03\xdd\x06\x14\x02&\x00\ +F\x00\x00\x01\x07\x01O\x01;\x00\x00\x00\x08\xb3\x01\x1d\ +\x11&\x00+5\xff\xff\x00w\xff\xec\x04\xd1\x07s\x02\ +&\x00&\x00\x00\x01\x07\x01L\x00\xac\x01R\x00\x08\xb3\ +\x01\x1c\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x04\x1f\x06\ +!\x02&\x00F\x00\x00\x01\x06\x01L\x00\x00\x00\x08\xb3\ +\x01\x1b\x11&\x00+5\xff\xff\x00\xb8\x00\x00\x05u\x07\ +s\x02&\x00'\x00\x00\x01\x07\x01L\x00h\x01R\x00\ +\x08\xb3\x02\x15\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x06\ +%\x06\x14\x02&\x00G\x00\x00\x00\x07\x028\x03o\x00\ +\x00\xff\xff\x00/\x00\x00\x05u\x05\xb6\x02\x06\x00\x92\x00\ +\x00\x00\x02\x00\x5c\xff\xec\x05\x0c\x06\x14\x00\x1b\x00(\x00\ +`@1\x0e\x03\x1f\x0a\x17\x19\x10\x0c\x0c\x15\x13\x17\x17\ +*&\x03\x03)\x09\x1a\x06\x00\x06#GY\x16\x0e\x0f\ +\x0eJY\x13\x0f\x06\x0f\x06\x0f\x11\x18\x15\x11\x00\x00\x1c\ +GY\x00\x16\x00?+\x00\x18??\x1299//\ +\x113+\x11\x003+\x11\x12\x0099\x11\x013\x11\ +3\x113\x11333\x1133\x1299\x1291\ +0\x05\x22\x02\x11\x10\x1232\x16\x173&55!\ +5!5!\x153\x15#\x11#'#\x06'26\ +754&#\x22\x06\x15\x14\x16\x01\xf8\xc0\xdc\xc6\xe0\ +l\xa95\x0a\x17\xfe\xc5\x01;\x012\x9b\x9b\xf8@\x0c\ +hLni\x04e\x85oSd\x14\x01 \x01\x02\x01\ +\x1a\x01\x0dTP\x83e3\xc7\xa1\xa1\xc7\xfbT\x91\xa5\ +\xf3{\x96\x1c\xb0\x81\x8a\xa9\x95\x96\x00\xff\xff\x00\xb8\x00\ +\x00\x04\x02\x06\xfe\x02&\x00(\x00\x00\x01\x07\x01M\xff\ +\xf7\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\xff\x00\ +\x5c\xff\xec\x04b\x05\xac\x02&\x00H\x00\x00\x01\x06\x01\ +M\xfb\x00\x00\x08\xb3\x02\x1f\x11&\x00+5\xff\xff\x00\ +\xb8\x00\x00\x04\x02\x07}\x02&\x00(\x00\x00\x01\x07\x01\ +N\xff\xea\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\ +\xff\x00\x5c\xff\xec\x04b\x06+\x02&\x00H\x00\x00\x01\ +\x06\x01N\x00\x00\x00\x08\xb3\x02\x1f\x11&\x00+5\xff\ +\xff\x00\xb8\x00\x00\x04\x02\x07I\x02&\x00(\x00\x00\x01\ +\x07\x01O\x01/\x015\x00\x08\xb3\x01\x13\x05&\x00+\ +5\xff\xff\x00\x5c\xff\xec\x04b\x06\x14\x02&\x00H\x00\ +\x00\x01\x07\x01O\x01?\x00\x00\x00\x08\xb3\x02#\x11&\ +\x00+5\xff\xff\x00\xb8\xfe\x14\x04\x02\x05\xb6\x02&\x00\ +(\x00\x00\x00\x07\x01Q\x025\x00\x00\xff\xff\x00\x5c\xfe\ +(\x04b\x04s\x02&\x00H\x00\x00\x00\x07\x01Q\x02\ +?\x00\x14\xff\xff\x00\xaf\x00\x00\x04\x14\x07s\x02&\x00\ +(\x00\x00\x01\x07\x01L\xff\xf5\x01R\x00\x08\xb3\x01\x11\ +\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x04b\x06!\x02\ +&\x00H\x00\x00\x01\x06\x01L\x02\x00\x00\x08\xb3\x02!\ +\x11&\x00+5\xff\xff\x00w\xff\xec\x05'\x07s\x02\ +&\x00*\x00\x00\x01\x07\x01K\x00\xb8\x01R\x00\x08\xb3\ +\x01(\x05&\x00+5\xff\xff\x00\x06\xfe\x14\x04m\x06\ +!\x02&\x00J\x00\x00\x01\x06\x01K\xdc\x00\x00\x08\xb3\ +\x03N\x11&\x00+5\xff\xff\x00w\xff\xec\x05'\x07\ +}\x02&\x00*\x00\x00\x01\x07\x01N\x00\xbe\x01R\x00\ +\x08\xb3\x01\x1e\x05&\x00+5\xff\xff\x00\x06\xfe\x14\x04\ +m\x06+\x02&\x00J\x00\x00\x01\x06\x01N\xe2\x00\x00\ +\x08\xb3\x03D\x11&\x00+5\xff\xff\x00w\xff\xec\x05\ +'\x07f\x02&\x00*\x00\x00\x01\x07\x01O\x01\xfc\x01\ +R\x00\x08\xb3\x01\x22\x05&\x00+5\xff\xff\x00\x06\xfe\ +\x14\x04m\x06\x14\x02&\x00J\x00\x00\x01\x07\x01O\x01\ +\x08\x00\x00\x00\x08\xb3\x03H\x11&\x00+5\xff\xff\x00\ +w\xfe;\x05'\x05\xcb\x02&\x00*\x00\x00\x00\x07\x02\ +9\x01\x17\x00\x00\xff\xff\x00\x06\xfe\x14\x04m\x06!\x02\ +&\x00J\x00\x00\x01\x06\x02:Z\x00\x00\x08\xb3\x03E\ +\x11&\x00+5\xff\xff\x00\xb8\x00\x00\x05f\x07s\x02\ +&\x00+\x00\x00\x01\x07\x01K\x00\xa0\x01R\x00\x08\xb3\ +\x01\x19\x05&\x00+5\xff\xff\x00\xa0\x00\x00\x04\xa8\x07\ +\xaa\x02&\x00K\x00\x00\x01\x07\x01K\x005\x01\x89\x00\ +\x0b\xb4\x01##\x0a\x00\x00?\xde\x115\x00\x00\x02\x00\ +\x00\x00\x00\x06\x1f\x05\xb6\x00\x13\x00\x17\x00Q@(\x14\ +\x11\x05\x05\x02\x00\x04\x04\x19\x17\x10\x08\x08\x0d\x0b\x09\x09\ +\x18\x17\x07LY\x16\x03\x0b\x0b\x10\x00\x0c\x17\x0c\x17\x0c\ +\x09\x12\x0e\x03\x05\x09\x12\x00?3?3\x1299/\ +/\x11333\x1133+\x11\x013\x11333\ +\x1133\x113\x11333\x113310\x013\ +\x15#\x11!\x11!\x11!\x11#535!\x15!\ +5!\x015!\x15\x05f\xb9\xb9\xfe\xcb\xfd\xbd\xfe\xca\ +\xb8\xb8\x016\x02C\x015\xfe\xcb\xfd\xbd\x04\xf4\xc7\xfb\ +\xd3\x02w\xfd\x89\x04-\xc7\xc2\xc2\xc2\xfd\xc3\xb4\xb4\x00\ +\x01\x00\x04\x00\x00\x04\xa8\x06\x14\x00\x1c\x00T@*\x12\ +\x08\x01\x00\x00\x1e\x16\x09\x13\x10\x08\x08\x0d\x0b\x09\x09\x1d\ +\x16\x19\x04\x19\x04GY\x13\x0b\x0c\x0bJY\x10\x0c\x19\ +\x0c\x19\x0c\x09\x0e\x00\x01\x09\x15\x00?3?\x1299\ +//\x113+\x11\x003+\x11\x12\x009\x11\x013\ +\x11333\x1133\x129\x113\x113\x1291\ +0!!\x114#\x22\x06\x15\x11!\x11#535\ +!\x15!\x15!\x15\x14\x073632\x16\x15\x04\xa8\ +\xfe\xcf\xb4\x7fs\xfe\xcf\x9c\x9c\x011\x01;\xfe\xc5\x0e\ +\x12f\xde\xc5\xca\x02P\xf2\xaf\xc2\xfe/\x04\xac\xc7\xa1\ +\xa1\xc7\x12S\xb6\xa4\xd2\xc7\x00\xff\xff\xff\xf1\x00\x00\x03\ +.\x07`\x02&\x00,\x00\x00\x01\x07\x01R\xff\x22\x01\ +R\x00\x08\xb3\x01\x10\x05&\x00+5\xff\xff\xff\x9b\x00\ +\x00\x02\xd8\x06\x0e\x02&\x00\xf3\x00\x00\x01\x07\x01R\xfe\ +\xcc\x00\x00\x00\x08\xb3\x01\x08\x11&\x00+5\xff\xff\x00\ +?\x00\x00\x02\xe5\x06\xfe\x02&\x00,\x00\x00\x01\x07\x01\ +M\xff$\x01R\x00\x08\xb3\x01\x0f\x05&\x00+5\xff\ +\xff\xff\xe9\x00\x00\x02\x8f\x05\xac\x02&\x00\xf3\x00\x00\x01\ +\x07\x01M\xfe\xce\x00\x00\x00\x08\xb3\x01\x07\x11&\x00+\ +5\xff\xff\x00\x07\x00\x00\x03\x1a\x07}\x02&\x00,\x00\ +\x00\x01\x07\x01N\xff$\x01R\x00\x08\xb3\x01\x0f\x05&\ +\x00+5\xff\xff\xff\xaf\x00\x00\x02\xc2\x06+\x02&\x00\ +\xf3\x00\x00\x01\x07\x01N\xfe\xcc\x00\x00\x00\x08\xb3\x01\x07\ +\x11&\x00+5\xff\xff\x00B\xfe\x14\x02\xdb\x05\xb6\x02\ +&\x00,\x00\x00\x00\x06\x01Qw\x00\xff\xff\x00+\xfe\ +\x14\x01\xdf\x06\x14\x02&\x00L\x00\x00\x00\x06\x01Q!\ +\x00\xff\xff\x00B\x00\x00\x02\xdb\x07f\x02&\x00,\x00\ +\x00\x01\x07\x01O\x00T\x01R\x00\x08\xb3\x01\x13\x05&\ +\x00+5\x00\x01\x00\xa0\x00\x00\x01\xd1\x04^\x00\x03\x00\ +\x13\xb7\x00\x01\x01\x04\x02\x0f\x01\x15\x00??\x11\x013\ +\x11310!!\x11!\x01\xd1\xfe\xcf\x011\x04^\ +\x00\xff\xff\x00B\xfeR\x05\x0b\x05\xb6\x00&\x00,\x00\ +\x00\x00\x07\x00-\x03\x1d\x00\x00\xff\xff\x00\x93\xfe\x14\x04\ +)\x06\x14\x00&\x00L\x00\x00\x00\x07\x00M\x02J\x00\ +\x00\xff\xff\xffh\xfeR\x03\x09\x07s\x02&\x00-\x00\ +\x00\x01\x07\x01K\xfe\xea\x01R\x00\x08\xb3\x01\x1b\x05&\ +\x00+5\xff\xff\xff}\xfe\x14\x02\xe7\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01K\xfe\xc8\x00\x00\x00\x08\xb3\x01\x1b\ +\x11&\x00+5\xff\xff\x00\xb8\xfe;\x05P\x05\xb6\x02\ +&\x00.\x00\x00\x00\x07\x029\x00\x9c\x00\x00\xff\xff\x00\ +\xa0\xfe;\x04\xf6\x06\x14\x02&\x00N\x00\x00\x00\x06\x02\ +9u\x00\x00\x01\x00\xa0\x00\x00\x04\xf6\x04^\x00\x0f\x00\ +A@\x1f\x04\x07\x07\x08\x02\x03\x06\x05\x05\x11\x0d\x08\x08\ +\x0a\x0a\x10\x0b\x0f\x04\x07\x07\x08\x08\x0f\x0f\x03\x06\x0a\x15\ +\x03\x0f\x00??3\x129\x113\x119\x113?\x11\ +\x013\x113\x113\x113\x11332\x119\x113\ +10\x017\x01!\x01\x01!\x01\x07\x11!\x11!\x11\ +\x07\x07\x01\xcf\x8d\x01:\x01E\xfeH\x01\xd3\xfe\xa4\xfe\ +\xc6\x8f\xfe\xcf\x011\x03\x03\x02F\xaa\x01n\xfe\x00\xfd\ +\xa2\x01\xaaZ\xfe\xb0\x04^\xfe\xdb\xa1R\x00\xff\xff\x00\ +\xb8\x00\x00\x04?\x07s\x02&\x00/\x00\x00\x01\x07\x00\ +v\xff\xbf\x01R\x00\x08\xb3\x01\x0e\x05&\x00+5\xff\ +\xff\x00\xa0\x00\x00\x02\xf4\x07\xac\x02&\x00O\x00\x00\x01\ +\x07\x00v\xffg\x01\x8b\x00\x0b\xb4\x01\x0c\x0c\x02\x00\x00\ +?\xde\x115\x00\xff\xff\x00\xb8\xfe;\x04?\x05\xb6\x02\ +&\x00/\x00\x00\x00\x06\x029J\x00\xff\xff\x00c\xfe\ +;\x01\xd1\x06\x14\x02&\x00O\x00\x00\x00\x07\x029\xff\ +\x05\x00\x00\xff\xff\x00\xb8\x00\x00\x04?\x05\xb7\x02&\x00\ +/\x00\x00\x01\x07\x028\x01u\xff\xa3\x00\x07\xb2\x01\x09\ +\x03\x00?5\x00\xff\xff\x00\xa0\x00\x00\x03\x85\x06\x14\x02\ +&\x00O\x00\x00\x00\x07\x028\x00\xcf\x00\x00\xff\xff\x00\ +\xb8\x00\x00\x04?\x05\xb6\x02&\x00/\x00\x00\x00\x07\x01\ +O\x02/\xfdp\xff\xff\x00\xa0\x00\x00\x03\x97\x06\x14\x00\ +&\x00O\x00\x00\x00\x07\x01O\x01\xb8\xfd8\x00\x01\x00\ +\x02\x00\x00\x04?\x05\xb6\x00\x0d\x00E@!\x0c\x0f\x09\ +\x07\x0b\x0b\x04\x03\x00\x00\x0e\x07\x04\x08\x03\x03\x0a\x01\x09\ +\x02\x09\x08\x02\x08\x00\x05\x03\x00\x0bLY\x00\x12\x00?\ ++\x00\x18?\x1299\x113\x11\x12993\x11\x12\ +99\x11\x013\x11333\x1133\x11310\ +3\x11\x07'7\x11!\x117\x17\x05\x11!\x11\xb8E\ +q\xb6\x016\x8fu\xfe\xfc\x02Q\x01\xec)\xc4o\x02\ +\xc0\xfd\xfcX\xc4\x9e\xfeX\xff\x00\x00\x00\x01\x00\x00\x00\ +\x00\x02\xa4\x06\x14\x00\x0b\x00K@#\x03\x06\x02\x07\x00\ +\x09\x01\x01\x07\x02\x08\x08\x05\x02\x00\x04\x04\x09\x05\x05\x0c\ +\x0d\x08\x07\x02\x01\x07\x01\x07\x01\x05\x0a\x00\x05\x15\x00?\ +?\x1299//\x113\x113\x11\x12\x019\x113\ +3\x1133\x113\x11\x1299\x12\x0099\x11\x12\ +9910\x017\x17\x07\x11!\x11\x07'7\x11!\ +\x01\xe9Fu\xbb\xfe\xcfGq\xb8\x011\x03\xa2+\xc5\ +p\xfdh\x01\xdd+\xc5p\x03-\x00\xff\xff\x00\xb8\x00\ +\x00\x05\xc9\x07s\x02&\x001\x00\x00\x01\x07\x00v\x01\ +D\x01R\x00\x08\xb3\x01\x18\x05&\x00+5\xff\xff\x00\ +\xa0\x00\x00\x04\xa8\x06!\x02&\x00Q\x00\x00\x01\x07\x00\ +v\x00\xaa\x00\x00\x00\x08\xb3\x01\x1d\x11&\x00+5\xff\ +\xff\x00\xb8\xfe;\x05\xc9\x05\xb6\x02&\x001\x00\x00\x00\ +\x07\x029\x00\xf8\x00\x00\xff\xff\x00\xa0\xfe;\x04\xa8\x04\ +s\x02&\x00Q\x00\x00\x00\x06\x029u\x00\xff\xff\x00\ +\xb8\x00\x00\x05\xc9\x07s\x02&\x001\x00\x00\x01\x07\x01\ +L\x00\xee\x01R\x00\x08\xb3\x01\x15\x05&\x00+5\xff\ +\xff\x00\xa0\x00\x00\x04\xa8\x06!\x02&\x00Q\x00\x00\x01\ +\x06\x01LN\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\ +\xff\x00\x06\x00\x00\x05\xa2\x05\xb6\x00'\x00Q\x00\xfa\x00\ +\x00\x00\x06\x02\x07\xed\x00\x00\x01\x00\xb8\xfeR\x05\xc9\x05\ +\xb6\x00\x1a\x00H@#\x12\x08\x18\x10\x03\x0d\x15\x15\x18\ +\x18\x1c\x0a\x0d\x0d\x0e\x1b\x12\x0a\x0e\x16\x0f\x03\x18\x08\x08\ +\x0e\x12\x03\x05\x00\x05LY\x00'\x00?+\x11\x003\ +\x18?3\x113?3\x1299\x11\x0132\x119\ +\x113\x113\x11\x1299\x129910\x01\x22'\ +\x11\x163267\x01#\x12\x15\x11!\x11!\x013\ +'&5\x11!\x11\x14\x06\x03\xf8rS]Imv\ +\x09\xfc\xfe\x09\x13\xfe\xeb\x01\x87\x02{\x07\x08\x07\x01\x17\ +\xf1\xfeR\x16\x01\x02\x14[S\x04N\xfe\xdb}\xfdP\ +\x05\xb6\xfc\x85\x97m\x90\x01\xe7\xfaJ\xcf\xdf\x00\x01\x00\ +\xa0\xfe\x14\x04\xa8\x04s\x00\x1c\x00A@!\x02\x07\x07\ +\x1a\x1a\x1e\x12\x0e\x0e\x0f\x0f\x1d\x12\x0a\x16\x16\x0aGY\ +\x16\x10\x10\x0f\x0f\x15\x03\x05\x00\x05GY\x00\x1b\x00?\ ++\x11\x003\x18???+\x11\x12\x009\x11\x013\ +\x113\x129\x113\x113\x11910\x01\x22'5\ +\x16325\x114#\x22\x06\x15\x11!\x113\x173\ +6632\x16\x15\x11\x14\x06\x03=kM;<{\ +\xb4\x80r\xfe\xcf\xe9)\x132\xb0t\xc3\xca\xbc\xfe\x14\ +\x19\xf0\x13\xaa\x02\xf0\xdb\xab\xc6\xfd\xf2\x04^\x8fOU\ +\xd3\xc7\xfc\xae\xb3\xc0\x00\xff\xff\x00w\xff\xec\x05\xe7\x06\ +\xfe\x02&\x002\x00\x00\x01\x07\x01M\x00\xc3\x01R\x00\ +\x08\xb3\x02\x19\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x04\ +\x98\x05\xac\x02&\x00R\x00\x00\x01\x06\x01M\x0c\x00\x00\ +\x08\xb3\x02\x1d\x11&\x00+5\xff\xff\x00w\xff\xec\x05\ +\xe7\x07}\x02&\x002\x00\x00\x01\x07\x01N\x00\xc5\x01\ +R\x00\x08\xb3\x02\x19\x05&\x00+5\xff\xff\x00\x5c\xff\ +\xec\x04\x98\x06+\x02&\x00R\x00\x00\x01\x06\x01N\x0c\ +\x00\x00\x08\xb3\x02\x1d\x11&\x00+5\xff\xff\x00w\xff\ +\xec\x05\xe7\x07s\x02&\x002\x00\x00\x01\x07\x01S\x01\ +B\x01R\x00\x0a\xb4\x03\x02(\x05&\x00+55\xff\ +\xff\x00\x5c\xff\xec\x04\x98\x06!\x02&\x00R\x00\x00\x01\ +\x06\x01S{\x00\x00\x0a\xb4\x03\x02,\x11&\x00+5\ +5\x00\x02\x00w\xff\xec\x07P\x05\xcd\x00\x16\x00#\x00\ +e@6\x11\x15\x15\x0d\x01 \x07\x13\x0f\x00\x00%\ +\x1a\x07\x07$\x11\x14LY\x0c\x11\x01\x0d\x03\x11\x11\x01\ +\x0d\x0d\x10LY\x0d\x03\x0a\x17LY\x0a\x04\x04\x1dL\ +Y\x04\x12\x01\x15LY\x01\x12\x00?+\x00\x18?+\ +\x00\x18?+\x00\x18?+\x11\x12\x009\x18/_^\ +]+\x11\x013\x113\x113\x1133\x129\x113\ +33\x11310!!\x06\x06# \x00\x11\x10\x00\ +!2\x16\x17!\x15!\x11!\x15!\x11!\x01\x22\x06\ +\x15\x14\x163267\x11&&\x07P\xfc\x97&\x8e\ +-\xfe\xc1\xfe\xb0\x01S\x01>=\x84#\x03d\xfd\xcd\ +\x02\x0e\xfd\xf2\x023\xfb\xb8\xa6\xac\xac\xa4Az&#\ +\x85\x09\x0b\x01\x8a\x01i\x01k\x01\x83\x0e\x09\xfe\xfe\xbf\ +\xfe\xfe\x87\x03\xcb\xfb\xf3\xf4\xf9\x15\x12\x03\x8b\x13\x16\x00\ +\x03\x00\x5c\xff\xec\x07{\x04s\x00\x1f\x00+\x002\x00\ +p@:/0\x0e\x02\x15\x15&&\x0800\x1d\x14\ +\x144 \x08\x083\x1c\x15\x19/\x15JY//\x00\ +\x10\x10,JY\x10\x10\x02\x0e\x04\x0b\x0b)GY\x0b\ +\x10\x00\x19FY\x00\x04\x04#GY\x04\x16\x00?+\ +\x11\x003+\x00\x18?+\x11\x12\x0099\x18?+\ +\x11\x12\x009\x18/+\x11\x12\x009\x11\x013\x113\ +\x113\x1133\x11\x129\x113\x1299\x1191\ +0\x05 '\x06#\x22&\x025\x10\x00!2\x16\x17\ +632\x00\x15\x15!\x15\x16\x163267\x15\x06\ +\x06\x01\x14\x1632654&#\x22\x06%\x22\x06\ +\x07!&&\x05\xa6\xfe\xf1\x95\x8d\xfa\xa2\xf8\x85\x01\x1b\ +\x01\x02p\xc8G\x90\xef\xf4\x01\x10\xfd\x16\x07\x95\x85k\ +\xbadQ\xbd\xfbfm{zkl{zl\x03\xea\ +^|\x09\x01\xc2\x02u\x14\x9b\x9b\x8c\x01\x08\xb1\x01\x15\ +\x01-OM\x9c\xfe\xf2\xee\x94\x08\x7f\x8d*.\xec'\ +(\x02E\xa6\xaa\xa9\xa7\xa6\xa6\xa5\xc2syo}\xff\ +\xff\x00\xb8\x00\x00\x05H\x07s\x02&\x005\x00\x00\x01\ +\x07\x00v\x00\x91\x01R\x00\x08\xb3\x02 \x05&\x00+\ +5\xff\xff\x00\xa0\x00\x00\x03\x93\x06!\x02&\x00U\x00\ +\x00\x01\x06\x00v\x06\x00\x00\x08\xb3\x01\x19\x11&\x00+\ +5\xff\xff\x00\xb8\xfe;\x05H\x05\xb6\x02&\x005\x00\ +\x00\x00\x07\x029\x00\xb4\x00\x00\xff\xff\x00c\xfe;\x03\ +w\x04s\x02&\x00U\x00\x00\x00\x07\x029\xff\x05\x00\ +\x00\xff\xff\x00\xb8\x00\x00\x05H\x07s\x02&\x005\x00\ +\x00\x01\x07\x01L\x003\x01R\x00\x08\xb3\x02\x1d\x05&\ +\x00+5\xff\xff\x00S\x00\x00\x03\xb8\x06!\x02&\x00\ +U\x00\x00\x01\x06\x01L\x99\x00\x00\x08\xb3\x01\x16\x11&\ +\x00+5\xff\xff\x00^\xff\xec\x04\x17\x07s\x02&\x00\ +6\x00\x00\x01\x07\x00v\x00N\x01R\x00\x08\xb3\x010\ +\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x03\xac\x06!\x02\ +&\x00V\x00\x00\x01\x06\x00v\x0a\x00\x00\x08\xb3\x01.\ +\x11&\x00+5\xff\xff\x00^\xff\xec\x04\x17\x07s\x02\ +&\x006\x00\x00\x01\x07\x01K\xff\xea\x01R\x00\x08\xb3\ +\x015\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x03\xc2\x06\ +!\x02&\x00V\x00\x00\x01\x06\x01K\xa3\x00\x00\x08\xb3\ +\x013\x11&\x00+5\xff\xff\x00^\xfe\x14\x04\x17\x05\ +\xcb\x02&\x006\x00\x00\x00\x07\x00z\x01b\x00\x00\xff\ +\xff\x00\x5c\xfe\x14\x03\xac\x04s\x02&\x00V\x00\x00\x00\ +\x07\x00z\x01-\x00\x00\xff\xff\x00^\xff\xec\x04\x17\x07\ +s\x02&\x006\x00\x00\x01\x07\x01L\xff\xea\x01R\x00\ +\x08\xb3\x01-\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x03\ +\xcc\x06!\x02&\x00V\x00\x00\x01\x06\x01L\xad\x00\x00\ +\x08\xb3\x01+\x11&\x00+5\xff\xff\x00)\xfe;\x04\ +y\x05\xb6\x02&\x007\x00\x00\x00\x06\x029)\x00\xff\ +\xff\x00/\xfe;\x037\x05L\x02&\x00W\x00\x00\x00\ +\x06\x029\xce\x00\xff\xff\x00)\x00\x00\x04y\x07s\x02\ +&\x007\x00\x00\x01\x07\x01L\xff\xe6\x01R\x00\x08\xb3\ +\x01\x0d\x05&\x00+5\xff\xff\x00/\xff\xec\x03\xc4\x06\ +(\x02&\x00W\x00\x00\x01\x07\x028\x01\x0e\x00\x14\x00\ +\x07\xb2\x01\x19\x01\x00?5\x00\x00\x01\x00)\x00\x00\x04\ +y\x05\xb6\x00\x0f\x00F@#\x03\x0e\x07\x09\x07\x01\x09\ +\x0c\x00\x00\x05\x01\x01\x10\x11\x0b\x07\x08\x07LY\x0f\x03\ +\x04\x03LY\x0c\x04\x04\x01\x08\x03\x01\x12\x00??\x12\ +9/3+\x11\x003+\x11\x003\x11\x12\x019\x11\ +33\x1133\x113\x11\x129910!!\x11\ +#53\x11!\x11!\x11!\x113\x15#\x02\xec\xfe\ +\xca\xf8\xf8\xfes\x04P\xfes\xf7\xf7\x02T\xfe\x01b\ +\x01\x02\xfe\xfe\xfe\x9e\xfe\x00\x01\x00/\xff\xec\x037\x05\ +L\x00\x1e\x00]@/\x11\x09\x14\x14\x18\x1c\x1c\x09\x0b\ +\x1a\x0f\x16\x0f\x0d\x09\x02\x16\x09\x16\x1f \x0e\x17\x14\x17\ +FY\x1b\x0b\x0c\x0bJY\x18\x0c\x0c\x06\x12\x11\x14\x0f\ +\x06\x00GY\x06\x16\x00?+\x00\x18?3\xc1\x129\ +/3+\x11\x003+\x11\x003\x11\x12\x0199\x11\ +3\x1133\x11\x1299\x113\x1133\x11\x129\ +10%27\x15\x06\x06#\x22&55#53\ +5#5773\x15!\x15!\x15!\x15!\x15\x14\ +\x16\x02wPp4\x95I\xba\xaa\x7f\x7f\x92\xa8X\xc3\ +\x019\xfe\xc7\x01\x16\xfe\xeaI\xdf#\xe3\x19\x1a\xb6\xbc\ +\x94\xc6\xc1\x81f\xec\xee\xe5\xc1\xc6\x94A>\xff\xff\x00\ +\xae\xff\xec\x05^\x07`\x02&\x008\x00\x00\x01\x07\x01\ +R\x00\x9c\x01R\x00\x08\xb3\x01\x17\x05&\x00+5\xff\ +\xff\x00\x9a\xff\xec\x04\xa2\x06\x0e\x02&\x00X\x00\x00\x01\ +\x06\x01R1\x00\x00\x08\xb3\x01\x19\x11&\x00+5\xff\ +\xff\x00\xae\xff\xec\x05^\x06\xfe\x02&\x008\x00\x00\x01\ +\x07\x01M\x00\x9a\x01R\x00\x08\xb3\x01\x16\x05&\x00+\ +5\xff\xff\x00\x9a\xff\xec\x04\xa2\x05\xac\x02&\x00X\x00\ +\x00\x01\x06\x01M/\x00\x00\x08\xb3\x01\x18\x11&\x00+\ +5\xff\xff\x00\xae\xff\xec\x05^\x07}\x02&\x008\x00\ +\x00\x01\x07\x01N\x00\x9a\x01R\x00\x08\xb3\x01\x16\x05&\ +\x00+5\xff\xff\x00\x9a\xff\xec\x04\xa2\x06+\x02&\x00\ +X\x00\x00\x01\x06\x01N1\x00\x00\x08\xb3\x01\x18\x11&\ +\x00+5\xff\xff\x00\xae\xff\xec\x05^\x08\x04\x02&\x00\ +8\x00\x00\x01\x07\x01P\x00\xb8\x01R\x00\x0a\xb4\x02\x01\ +\x16\x05&\x00+55\xff\xff\x00\x9a\xff\xec\x04\xa2\x06\ +\xb2\x02&\x00X\x00\x00\x01\x06\x01PN\x00\x00\x0a\xb4\ +\x02\x01\x18\x11&\x00+55\xff\xff\x00\xae\xff\xec\x05\ +^\x07s\x02&\x008\x00\x00\x01\x07\x01S\x01\x1d\x01\ +R\x00\x0a\xb4\x02\x01%\x05&\x00+55\xff\xff\x00\ +\x9a\xff\xec\x04\xd5\x06!\x02&\x00X\x00\x00\x01\x07\x01\ +S\x00\xbc\x00\x00\x00\x0a\xb4\x02\x01'\x11&\x00+5\ +5\xff\xff\x00\xae\xfe\x14\x05^\x05\xb6\x02&\x008\x00\ +\x00\x00\x07\x01Q\x02H\x00\x00\xff\xff\x00\x9a\xfe\x14\x04\ +\xa2\x04^\x02&\x00X\x00\x00\x00\x07\x01Q\x02\xf8\x00\ +\x00\xff\xff\x00\x00\x00\x00\x07\xbc\x07s\x02&\x00:\x00\ +\x00\x01\x07\x01K\x01q\x01R\x00\x08\xb3\x01+\x05&\ +\x00+5\xff\xff\x00\x14\x00\x00\x06\xc5\x06!\x02&\x00\ +Z\x00\x00\x01\x07\x01K\x01\x00\x00\x00\x00\x08\xb3\x01+\ +\x11&\x00+5\xff\xff\x00\x00\x00\x00\x04\xfe\x07s\x02\ +&\x00<\x00\x00\x01\x07\x01K\x00\x14\x01R\x00\x08\xb3\ +\x01\x16\x05&\x00+5\xff\xff\x00\x00\xfe\x14\x04\x8d\x06\ +!\x02&\x00\x5c\x00\x00\x01\x06\x01K\xdc\x00\x00\x08\xb3\ +\x01$\x11&\x00+5\xff\xff\x00\x00\x00\x00\x04\xfe\x07\ +V\x02&\x00<\x00\x00\x01\x07\x00j\x00\x12\x01R\x00\ +\x0a\xb4\x02\x01\x1e\x05&\x00+55\xff\xff\x001\x00\ +\x00\x04q\x07s\x02&\x00=\x00\x00\x01\x07\x00v\x00\ +N\x01R\x00\x08\xb3\x01\x12\x05&\x00+5\xff\xff\x00\ +7\x00\x00\x03\xaa\x06!\x02&\x00]\x00\x00\x01\x06\x00\ +v\x14\x00\x00\x08\xb3\x01\x12\x11&\x00+5\xff\xff\x00\ +1\x00\x00\x04q\x07f\x02&\x00=\x00\x00\x01\x07\x01\ +O\x01\x17\x01R\x00\x08\xb3\x01\x11\x05&\x00+5\xff\ +\xff\x007\x00\x00\x03\xaa\x06\x14\x02&\x00]\x00\x00\x01\ +\x07\x01O\x00\xb6\x00\x00\x00\x08\xb3\x01\x11\x11&\x00+\ +5\xff\xff\x001\x00\x00\x04q\x07s\x02&\x00=\x00\ +\x00\x01\x07\x01L\xff\xf1\x01R\x00\x08\xb3\x01\x0f\x05&\ +\x00+5\xff\xff\x007\x00\x00\x03\xb8\x06!\x02&\x00\ +]\x00\x00\x01\x06\x01L\x99\x00\x00\x08\xb3\x01\x0f\x11&\ +\x00+5\x00\x01\x00\xa0\x00\x00\x03?\x06\x1f\x00\x0c\x00\ +\x22@\x10\x0a\x0e\x03\x04\x04\x0d\x0b\x00\x08\x00GY\x08\ +\x00\x04\x15\x00??+\x11\x003\x11\x013\x113\x11\ +310\x01\x22\x15\x11!\x114632\x17\x07&\ +\x02P\x7f\xfe\xcf\xbc\xcd\x9exG\x5c\x05-\x89\xfb\x5c\ +\x04\xb0\xbf\xb0/\xe0\x1d\x00\x01\x00\xc5\xfe\x14\x04/\x05\ +\xcb\x00\x1d\x00I@$\x1c\x14\x14\x1a\x00\x00\x0e\x0c\x05\ +\x0a\x0a\x1e\x1f\x0c\x1d\x1a\x1dFY\x0e\x1a\x1a\x12\x03\x12\ +\x17GY\x12\x03\x03\x08GY\x03\x1b\x00?+\x00\x18\ +\x10\xc4+\x11\x12\x009\x18/3+\x11\x003\x11\x12\ +\x019\x113333\x1133\x12910\x05\x14\ +\x06#\x22'5\x16325\x11#57546\ +32\x17\x07&#\x22\x15\x153\x15#\x02\xe9\xbc\xb0\ +kM;;}\xa8\xa8\xaf\xc2\x96pHR?m\xe4\ +\xe4y\xb1\xc2\x19\xf0\x13\xaa\x03q\x93RR\xbd\xb2/\ +\xe0\x1d\x89F\xe5\x00\x04\x00\x00\x00\x00\x05\x85\x07\xaa\x00\ +\x10\x00\x17\x00!\x00-\x00w@;\x11\x05\x04\x17\x06\ +\x14\x07\x1c\x1d\x18!\x18\x18\x0b\x00\x00\x22(@\x0b(\ +(\x09\x02\x09\x02\x14\x14\x07\x04\x04\x03\x03/\x07\x08\x08\ +.\x17\x06LY\x17\x17\x07\x02\x09\x09\x14+!\x0e\x1c\ +\x0e%\x00\x04\x07\x12\x00?3?3\xcc\x119\xce2\ +2\x113\x119/+\x11\x013\x113\x113\x113\ +\x11\x129\x1133\x11\x129\x113\x1a\x10\xca2\x11\ +\x129\x113\x10\xc92\x11\x1299\x119910\ +\x01\x14\x07\x01!\x03!\x03!\x01&54632\ +\x16\x03\x03&'\x06\x07\x03\x135667!\x15\x06\ +\x06\x07\x134&#\x22\x06\x15\x14\x17366\x03\xbe\ +/\x01\xf6\xfe\xb4j\xfd\xe9l\xfe\xb4\x01\xf4+\x88p\ +m\x901fV\x0e\x13DpL.j\x16\x01V\x17\ +\xb7l\x0f6**7V\x13&2\x05\xb6U>\xfa\ +\xdd\x01J\xfe\xb6\x05#:Wn\x80\x81\xfc-\x01!\ +\xe6EG\xc4\xfe\xbf\x04\x8b\x10*x\x1f\x0c\x1at7\ +\xfe\xdb-33-\x5c\x04\x023\x00\x00\x05\x00V\xff\ +\xec\x04;\x07\xaa\x00\x18\x00\x22\x00,\x008\x00D\x00\ +~@?'(#,##3--9?3?\ +?\x1d\x18\x12\x0c\x08\x0c\x02\x22\x22\x18\x18F\x1d\x08\x08\ +E,66'<0B\x14@\x0c\x19KY\x0c\x0c\ +\x05\x14\x14\x0fFY\x14\x10\x02\x1f\x05\x1fFY\x05\x16\ +\x00\x15\x00??+\x11\x003\x18?+\x11\x12\x009\ +\x18/+\x00\x1a\x18\x10\xdc2\xde\xcc3\x119\x11\x01\ +3\x113\x113\x113\x1292\x11\x129\x11\x129\ +\x113\x10\xca2\x11\x129\x113\x10\xc9210!\ +'#\x06\x06#\x22&5467754#\x22\ +\x07'632\x16\x15\x11\x01\x07\x06\x06\x15\x1432\ +65\x015667!\x15\x06\x06\x07\x13\x14\x06#\ +\x22&54632\x16\x074&#\x22\x06\x15\x14\ +\x16326\x03f;\x08M\xa3\x83\xa1\xb9\xf9\xfb\xc2\ +\xae\x86\xb5e\xc1\xeb\xe1\xf0\xfe\xd1v\x85\x82\x94j\x7f\ +\xfe\xcb.j\x16\x01V\x15\xa4\x80\xcf\x8epp\x88\x87\ +qn\x90\x9e6**710*6\x98aK\xb8\ +\xaa\xb2\xa9\x09\x061\xaaQ\xcee\xc4\xc8\xfd\x17\x02\x06\ +\x04\x04XZ\x81ze\x05/\x10*x\x1f\x0c\x18i\ +D\xfe\xc5l\x84\x80nl\x81\x84i-33--\ +44\x00\xff\xff\x00\x00\x00\x00\x07%\x07s\x02&\x00\ +\x88\x00\x00\x01\x07\x00v\x02\xa0\x01R\x00\x08\xb3\x02\x1c\ +\x05&\x00+5\xff\xff\x00V\xff\xec\x06\xfe\x06!\x02\ +&\x00\xa8\x00\x00\x01\x07\x00v\x01\xd1\x00\x00\x00\x08\xb3\ +\x03A\x11&\x00+5\xff\xff\x00w\xff\xa6\x05\xe7\x07\ +s\x02&\x00\x9a\x00\x00\x01\x07\x00v\x011\x01R\x00\ +\x08\xb3\x03+\x05&\x00+5\xff\xff\x00\x5c\xff\xb4\x04\ +\x98\x06!\x02&\x00\xba\x00\x00\x01\x06\x00v{\x00\x00\ +\x08\xb3\x03,\x11&\x00+5\xff\xff\x00^\xfe;\x04\ +\x17\x05\xcb\x02&\x006\x00\x00\x00\x06\x029\xfb\x00\xff\ +\xff\x00\x5c\xfe;\x03\xac\x04s\x02&\x00V\x00\x00\x00\ +\x06\x029\xc8\x00\x00\x01\x00\xba\x04\xd9\x04\x1f\x06!\x00\ +\x0d\x00*@\x12\x05\x04\x04\x02\x0c\x00\x00\x09\x08\x02\x02\ +\x0e\x0f\x02\x09\x80\x05\x00\x00/2\x1a\xcd2\x11\x12\x01\ +9\x11333\x113\x113\x11310\x01&'\ +\x06\x07#567!\x16\x16\x17\x15\x03T\x9dMN\ +\x97\xcb\xbdC\x01e\x1f\x99H\x04\xd9]SQ_\x1b\ +\xbdp4\xb3F\x1b\x00\x00\x01\x00\xba\x04\xd9\x04\x1f\x06\ +!\x00\x0e\x00*@\x12\x00\x0e\x0e\x0c\x09\x0a\x0a\x05\x04\ +\x0c\x0c\x0f\x10\x09\x00\x80\x0c\x05\x00/3\x1a\xcd2\x11\ +\x12\x019\x11333\x113\x113\x11310\x01\ +\x15\x06\x06\x07!&&'53\x16\x1767\x04\x1f\ +T\x8d\x1f\xfe\x9b\x1dlw\xcb\x93RT\x96\x06!\x1b\ +T\xa72/\x83{\x1b]SWY\x00\x01\x01\x1b\x04\ +\xd9\x03\xc1\x05\xac\x00\x03\x00\x13\xb6\x01\x00\x00\x04\x05\x00\ +\x03\x00/3\x11\x12\x019\x10\xc910\x01!\x15!\ +\x01\x1b\x02\xa6\xfdZ\x05\xac\xd3\x00\x01\x00\xe3\x04\xd9\x03\ +\xf6\x06+\x00\x0d\x00&@\x11\x00\x0d\x07@\x06\x07\x07\ +\x0e\x0f\x06o\x00\x01\x00\x80\x0b\x03\x00/3\x1a\xcd]\ +2\x11\x12\x019\x113\x1a\x10\xca210\x01\x06\x06\ +#\x22&'3\x1e\x02327\x03\xf6\x0c\xdc\xa6\xae\ +\xcf\x08\xaa\x04/UU\xce\x10\x06+\x9a\xb8\xb6\x9c/\ +6\x18}\x00\x01\x00\x93\x04\xe9\x01\xdf\x06\x14\x00\x08\x00\ +\x13\xb6\x04\x00\x00\x09\x0a\x02\x07\x00/3\x11\x12\x019\ +\x10\xc910\x13432\x15\x14\x06#\x22\x93\xa6\xa6\ +SS\xa6\x05\x7f\x95\x95GO\x00\x02\x01T\x04\xd7\x03\ +J\x06\xb2\x00\x0b\x00\x17\x00 @\x0f\x06\x12\x12\x19\x18\ +\x0f\x0f\x09\x1f\x09\x02\x09\x09\x15\x03\x00/33/]\ +3\x11\x12\x019\x11310\x01\x14\x06#\x22&5\ +4632\x16\x074&#\x22\x06\x15\x14\x1632\ +6\x03J\x8epp\x88\x87qn\x90\x9e6**6\ +00*6\x05\xc7l\x84\x80nl\x81\x84i-3\ +3--44\x00\x01\x00\x0a\xfe\x14\x01\xa0\x00\x00\x00\ +\x11\x00\x14\xb7\x06\x0b\x13\x12\x0e\x03\x08\x1b\x00?3/\ +\x11\x12\x019910\x17\x14\x16327\x15\x06#\ +\x22&54673\x06\x06\xdd-#7o\x15\x01- \xe4J\xec\x8b8\x01-\ +\x19\xc9l\x04\xd9\x1bU\xaf)\x155\xc86\x1b\xc0m\ +\x15+\xb7Q\x00\x00\x01\x01\xd7\x04\xd9\x03D\x06^\x00\ +\x08\x00\x1a@\x0a\x03\x04\x00\x07\x00\x00\x09\x0a\x04\x08\x00\ +/\xcd\x11\x12\x019\x113\x10\xc9210\x0166\ +7!\x15\x06\x07#\x01\xd7\x125\x0b\x01\x1bNm\xb2\ +\x04\xf86\xdcT\x18\xba\xb3\x00\x00\x03\x00\xba\x04\xf8\x03\ +\xe3\x06\xb4\x00\x0b\x00\x16\x00\x1f\x002@\x16\x00\x06\x1a\ +\x1c\x1f\x1e\x1f\x1f\x06\x11\x0c\x06\x0c !\x1f\x1b\x0e\x03\ +\x03\x14\x09\x00/33\x113\xcc9\x11\x12\x0199\ +\x113\x129\x113\x10\xc92\x11310\x1346\ +32\x16\x15\x14\x06#\x22&%432\x16\x15\x14\ +\x06#\x22&'667!\x15\x06\x07#\xbaG:\ +9JJ9:G\x02#\x839JJ9\x00+\x115\x00\xff\xff\x00u\x02'\x01\xd3\x03\ +{\x00\x07\x00\x11\x00\x00\x02B\xff\xff\xff\x9d\x00\x00\x04\ +\x91\x05\xf5\x00'\x00(\x00\x8f\x00\x00\x01\x07\x01T\xfd\ +\xc6\xff\x97\x00\x0d\xb7\x01\x0f2\x0f\x0f\x02\x02>\x00+\ +\x115\x00\xff\xff\xff\x9d\x00\x00\x05\xf5\x05\xf5\x00'\x00\ ++\x00\x8f\x00\x00\x01\x07\x01T\xfd\xc6\xff\x97\x00\x0d\xb7\ +\x01\x0f2\x0f\x0f\x06\x06>\x00+\x115\x00\xff\xff\xff\ +\x9d\x00\x00\x03\xd7\x05\xf5\x00'\x00,\x00\xfc\x00\x00\x01\ +\x07\x01T\xfd\xc6\xff\x97\x00\x0d\xb7\x01\x0f2\x0f\x0f\x06\ +\x06>\x00+\x115\x00\xff\xff\xff\xc6\xff\xec\x069\x05\ +\xf5\x00&\x002R\x00\x01\x07\x01T\xfd\xef\xff\x97\x00\ +\x0d\xb7\x02\x192\x19\x19\x09\x09>\x00+\x115\x00\xff\ +\xff\xff\x88\x00\x00\x06\x1d\x05\xf5\x00'\x00<\x01\x1f\x00\ +\x00\x01\x07\x01T\xfd\xb1\xff\x97\x00\x0d\xb7\x01\x0c2\x0c\ +\x0c\x08\x08>\x00+\x115\x00\xff\xff\xff\xc6\x00\x00\x06\ +l\x05\xf5\x00&\x01vZ\x00\x01\x07\x01T\xfd\xef\xff\ +\x97\x00\x0d\xb7\x01$2$$\x11\x11>\x00+\x115\ +\x00\xff\xff\xff\xc9\xff\xec\x03\x17\x06\xb4\x02&\x01\x86\x00\ +\x00\x01\x07\x01U\xff\x0f\x00\x00\x00\x0c\xb5\x03\x02\x01\x22\ +\x11&\x00+555\xff\xff\x00\x00\x00\x00\x05\x85\x05\ +\xbc\x02\x06\x00$\x00\x00\xff\xff\x00\xb8\x00\x00\x04\xf4\x05\ +\xb6\x02\x06\x00%\x00\x00\x00\x01\x00\xb8\x00\x00\x04T\x05\ +\xb6\x00\x05\x00\x1d@\x0e\x00\x07\x03\x04\x04\x06\x05\x02L\ +Y\x05\x03\x04\x12\x00??+\x11\x013\x113\x113\ +10\x01\x11!\x11!\x11\x04T\xfd\x9a\xfe\xca\x05\xb6\ +\xff\x00\xfbJ\x05\xb6\x00\xff\xff\x009\x00\x00\x05\x0a\x05\ +\xbc\x02\x06\x02(\x00\x00\xff\xff\x00\xb8\x00\x00\x04\x02\x05\ +\xb6\x02\x06\x00(\x00\x00\xff\xff\x001\x00\x00\x04q\x05\ +\xb6\x02\x06\x00=\x00\x00\xff\xff\x00\xb8\x00\x00\x05f\x05\ +\xb6\x02\x06\x00+\x00\x00\x00\x03\x00w\xff\xec\x05\xe7\x05\ +\xcd\x00\x03\x00\x0f\x00\x1b\x00G@%\x01\x16\x16\x04\x04\ +\x1d\x02\x10\x10\x0a\x0a\x1c\x03\x02LY\x0c\x03\x01\x0d\x03\ +\x03\x03\x07\x0d\x0d\x19LY\x0d\x04\x07\x13LY\x07\x13\ +\x00?+\x00\x18?+\x11\x12\x009\x18/_^]\ ++\x11\x013\x113\x113\x113\x113\x11310\ +\x01\x15!5\x05\x10\x00! \x00\x11\x10\x00! \x00\ +\x01\x14\x1632654&#\x22\x06\x043\xfd\xf8\ +\x03\xbc\xfe\x98\xfe\xb0\xfe\xb0\xfe\x98\x01i\x01Q\x01Q\ +\x01e\xfb\xcf\xbf\xba\xbd\xbc\xbc\xbb\xbb\xc0\x03f\xfe\xfe\ +\x89\xfe\x95\xfez\x01\x86\x01m\x01m\x01\x81\xfe|\xfe\ +\x94\xf2\xfb\xfb\xf2\xf2\xfc\xfb\x00\xff\xff\x00B\x00\x00\x02\ +\xdb\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00\xb8\x00\x00\x05\ +P\x05\xb6\x02\x06\x00.\x00\x00\x00\x01\x00\x00\x00\x00\x05\ +3\x05\xb6\x00\x0c\x00/@\x17\x07\x06\x00\x00\x04\x09\x09\ +\x08\x08\x0e\x04\x05\x05\x0d\x06\x00LY\x06\x03\x09\x05\x12\ +\x00?3?+\x11\x013\x113\x113\x113\x11\x12\ +9\x113310\x01\x06\x06\x07\x01!\x01!\x01!\ +\x01&&\x02\x9a\x0c3\x0d\xfe\xeb\xfe\xc7\x01\xf0\x01R\ +\x01\xf1\xfe\xc7\xfe\xef\x0a<\x04\xb2>\xde)\xfc\x93\x05\ +\xb6\xfaJ\x03o\x1d\xf0\xff\xff\x00\xb8\x00\x00\x06\xd3\x05\ +\xb6\x02\x06\x000\x00\x00\xff\xff\x00\xb8\x00\x00\x05\xc9\x05\ +\xb6\x02\x06\x001\x00\x00\x00\x03\x00R\x00\x00\x04?\x05\ +\xb6\x00\x03\x00\x07\x00\x0b\x00C@#\x06\x02\x08\x08\x0d\ +\x07\x03\x0a\x0a\x0c\x00\x03LY\x0c\x00\x01\x0d\x03\x00\x00\ +\x0a\x04\x0a\x0bLY\x0a\x12\x04\x07LY\x04\x03\x00?\ ++\x00\x18?+\x11\x12\x009\x18/_^]+\x11\ +\x013\x1133\x113\x113310\x13!\x15!\ +\x03!\x15!\x01\x11!\x11\xcd\x02\xf8\xfd\x08R\x03\x9c\ +\xfcd\x03\xc4\xfc\x13\x03w\xfe\x03=\xfe\xfcH\xff\x00\ +\x01\x00\x00\xff\xff\x00w\xff\xec\x05\xe7\x05\xcd\x02\x06\x00\ +2\x00\x00\x00\x01\x00\xb8\x00\x00\x05=\x05\xb6\x00\x07\x00\ +#@\x11\x01\x00\x00\x09\x04\x05\x05\x08\x06\x03LY\x06\ +\x03\x01\x05\x12\x00?3?+\x11\x013\x113\x113\ +\x11310!!\x11!\x11!\x11!\x05=\xfe\xcb\ +\xfd\xe6\xfe\xca\x04\x85\x04\xb4\xfbL\x05\xb6\x00\xff\xff\x00\ +\xb8\x00\x00\x04\xaa\x05\xb6\x02\x06\x003\x00\x00\x00\x01\x00\ +N\x00\x00\x04y\x05\xb6\x00\x0f\x00S@)\x02\x0a\x0a\ +\x06\x0b\x09\x04\x04\x06\x00\x0f\x0f\x11\x0b\x00\x00\x10\x09\x03\ +\x04\x0a\x02\x02\x07\x0d\x04\x07LY\x04\x03\x0b\x01\x00\x0d\ +\x00\x0dLY\x00\x12\x00?+\x11\x12\x0099\x18?\ ++\x11\x12\x009\x113\x1199\x11\x013\x113\x11\ +3\x11\x1299\x113\x11\x129\x1131035\ +\x01\x015!\x15!\x22'\x01\x0163!\x11N\x01\ +\xd7\xfe5\x03\xe3\xfeJ3\xb0\x01\xc6\xfe#\xf0-\x01\ +\xcf\xf4\x02\x0a\x01\xcb\xed\xfe\x0b\xfe=\xfd\xf4\x0c\xff\x00\ +\x00\xff\xff\x00)\x00\x00\x04y\x05\xb6\x02\x06\x007\x00\ +\x00\xff\xff\x00\x00\x00\x00\x04\xfe\x05\xb6\x02\x06\x00<\x00\ +\x00\x00\x03\x00\x5c\xff\xec\x06\x85\x05\xcb\x00\x08\x00\x22\x00\ ++\x00V@+\x17\x00\x22\x22+\x14\x09\x09\x0f\x04\x04\ +\x1c\x1c-'\x0f\x0f,\x00+\x0b+MY!\x0b\x08\ +$\x13$MY\x17\x13\x0b\x13\x0b\x13\x09\x15\x04\x09\x13\ +\x00??\x1299//\x113+\x11\x003\x113\ ++\x11\x003\x11\x013\x113\x113\x113\x11\x129\ +\x11333\x113310\x0132654&\ +##\x015#\x22$\x02546$335!\ +\x1532\x04\x16\x15\x14\x02\x04##\x15\x01#\x22\x06\ +\x15\x14\x1633\x03\xfc\x0e\xa1\xb7\xaa\x93)\xfe\xe9\x16\ +\xba\xfe\xe8\xa1\x8f\x01\x0e\xb75\x01\x175\xb6\x01\x0e\x90\ +\xa1\xfe\xe8\xba\x16\xfe\xe9)\x93\xaa\xb4\xa4\x0e\x01\xbc\xa9\ +\x93\x88\xa5\xfb\xc7\xe1\x83\x01\x06\xa0\x9b\xf9\x8d\xb4\xb4\x8d\ +\xf9\x9b\xa0\xfe\xfa\x83\xe1\x049\xa4\x89\x90\xac\xff\xff\x00\ +\x00\x00\x00\x05V\x05\xb6\x02\x06\x00;\x00\x00\x00\x01\x00\ +m\x00\x00\x06\x96\x05\xb6\x00\x1b\x00@@\x1f\x15\x05\x05\ +\x12\x06\x06\x0b\x19\x00\x00\x1d\x0e\x0b\x0b\x1c\x04\x08\x11\x08\ +MY\x15\x11\x11\x06\x1a\x13\x0c\x03\x06\x12\x00??3\ +3\x129/3+\x11\x003\x11\x013\x113\x113\ +\x113\x129\x1133\x11310\x01\x10\x00!#\ +\x11!\x11# \x00\x11\x11!\x11\x14\x1633\x11!\ +\x113265\x11!\x06\x96\xfe\xd6\xfe\xd33\xfe\xea\ +3\xfe\xcf\xfe\xdb\x01\x22\x96\xb2\x1f\x01\x16\x1f\xae\x9a\x01\ +#\x03\xd7\xfe\xe7\xfe\xf6\xfeL\x01\xb4\x01\x09\x01\x16\x01\ +\xe3\xfe!\x9d\x8c\x03\x08\xfc\xf8\x91\x94\x01\xe3\x00\x01\x00\ +7\x00\x00\x06\x12\x05\xcd\x00 \x00W@+\x0a\x07\x17\ +\x1a\x07\x1a\x0d\x1e\x19\x14\x14\x22\x08\x03\x0d\x0d!\x1b\x06\ +\x14\x1e\x1e\x0d\x03\x06\x03\x09\x00\x11\x00LY\x11\x04\x17\ +\x09\x08\x09LY\x1a\x08\x12\x00?3+\x11\x003\x18\ +?+\x11\x12\x0099\x1133\x113\x113\x11\x01\ +3\x1133\x113\x1133\x1299\x113\x113\ +10\x01\x22\x06\x15\x14\x16\x17\x11!\x11!&\x025\ +4\x12$3 \x00\x11\x14\x02\x07!\x11!\x116\x12\ +54&\x03%\xb5\xc4\x84\x86\xfd\x81\x01s\x98\xa5\xab\ +\x01<\xd1\x01?\x01y\xa6\x9b\x01v\xfd}\x8b\x84\xc5\ +\x04\xcb\xdc\xc8\xcb\xfdH\xfe\xe9\x01\x04]\x01A\xc6\xb8\ +\x01\x17\x96\xfe\xb2\xfe\xe7\xc6\xfe\xc4`\xfe\xfc\x01\x17H\ +\x01\x02\xc8\xc7\xdb\xff\xff\x009\x00\x00\x02\xe7\x07V\x02\ +&\x00,\x00\x00\x01\x07\x00j\xff\x22\x01R\x00\x0a\xb4\ +\x02\x01!\x05&\x00+55\xff\xff\x00\x00\x00\x00\x04\ +\xfe\x07V\x02&\x00<\x00\x00\x01\x07\x00j\x00\x14\x01\ +R\x00\x0a\xb4\x02\x01\x1e\x05&\x00+55\xff\xff\x00\ +\x5c\xff\xec\x05\x00\x06^\x02&\x01~\x00\x00\x01\x06\x01\ +T1\x00\x00\x08\xb3\x023\x11&\x00+5\xff\xff\x00\ +N\xff\xec\x04%\x06^\x02&\x01\x82\x00\x00\x01\x06\x01\ +T%\x00\x00\x08\xb3\x01/\x11&\x00+5\xff\xff\x00\ +\xa0\xfe\x14\x04\xa8\x06^\x02&\x01\x84\x00\x00\x01\x06\x01\ +Tw\x00\x00\x08\xb3\x01\x1d\x11&\x00+5\xff\xff\x00\ +\xa0\xff\xec\x03\x17\x06^\x02&\x01\x86\x00\x00\x01\x07\x01\ +T\xff\x0d\x00\x00\x00\x08\xb3\x01\x16\x11&\x00+5\xff\ +\xff\x00\x8f\xff\xee\x04\xbc\x06\xb4\x02&\x01\x92\x00\x00\x01\ +\x06\x01UD\x00\x00\x0c\xb5\x03\x02\x01*\x11&\x00+\ +555\x00\x02\x00\x5c\xff\xec\x05\x00\x04q\x00\x0b\x00\ +*\x00K@&)\x15\x03\x03\x22\x19\x1d\x1d,\x09\x0f\ +\x0f+\x18\x0f\x16\x12\x07\x12\x07GY\x12\x10%\x1fH\ +Y%)\x00\x0c\x0c\x00GY\x0c\x16\x00?+\x11\x12\ +\x0093+\x00\x18?+\x11\x12\x009\x18?\x11\x01\ +3\x113\x113\x11333\x129910%2\ +6754&#\x22\x11\x14\x16\x17\x22\x02\x11\x10\x12\ +32\x16\x173673\x06\x06\x15\x11\x14327\ +\x15\x06\x06#\x22&'#\x06\x02ovk\x04o{\ +\xd7k\x14\xcd\xe9\xf3\xdav\x992\x0f\x18+\xfc '\ +T \x1b\x10[\x1epv\x22\x15n\xdf\x8f\xb3\x0c\xb4\ +\x9c\xfe\xac\xa5\xa5\xf3\x010\x01\x0f\x01\x16\x010TT\ +^7a\xfbh\xfe\xc8v\x0a\xf0\x0a\x10MZ\xa7\x00\ +\x02\x00\xa0\xfe\x14\x05\x00\x06\x1f\x00\x14\x00)\x00X@\ +,\x22\x1e\x1e\x0a\x06''\x03\x03\x10\x0a\x0a+\x18\x10\ +\x10\x11\x11*\x11\x1b\x06\x22##\x22GY##\x0d\ +\x00\x0d\x1bGY\x0d\x16\x00\x15GY\x00\x00\x00?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x009\x18\ +?\x11\x013\x113\x113\x113\x11\x129\x113\x11\ +3\x113\x11910\x012\x04\x15\x14\x06\x07\x15\x16\ +\x16\x15\x14\x04#\x22'\x11!\x114$\x17\x22\x11\x11\ +\x16\x1632654&##532654\ +&\x02\xb6\xeb\x01\x0f\x98\x8d\xbc\xb9\xfe\xfb\xe4\xc8~\xfe\ +\xcf\x01\x18\xf6\xdd0\x8c<\x80|\x85\x7fH5cn\ +n\x06\x1f\xd0\xb9\x95\xad\x17\x06\x18\xc1\xae\xd2\xf2?\xfd\ +\xe9\x064\xe0\xf7\xee\xfe\xfa\xfc\xfa\x1f'|pns\ +\xf2mf\x5cd\x00\x01\x00\x02\xfe\x14\x04\x8b\x04^\x00\ +\x13\x00<@\x1c\x00\x01\x01\x04\x05\x04\x0a\x0a\x06\x0f\x0f\ +\x10\x10\x15\x06\x05\x05\x14\x12\x0a\x04\x04\x14\x0f\x05\x0f\x01\ +\x1b\x00??3\x113\x1133\x11\x013\x113\x11\ +3\x113\x11\x129\x113\x11\x129\x11310\x01\ +!4\x127\x01!\x13\x16\x16\x173667\x13!\ +\x01\x06\x02\x02\x8b\xfe\xbd8,\xfeV\x01=\xa4\x15B\ +\x0e\x06\x049\x1f\xa4\x01=\xfec-6\xfe\x14V\x01\ +\x1e\x84\x04R\xfe\x13>\xf2I,\xe5Y\x01\xfc\xfb\xb4\ +t\xfe\xe7\x00\x02\x00\x5c\xff\xec\x04\x98\x06\x1f\x00\x1d\x00\ +)\x00k@5\x00\x02\x11!!$\x1e\x1e\x15\x0f\x02\ +\x02\x08\x1b\x15\x15+$\x1b\x1b*\x15\x1e\x1b$\x1e$\ +!'\x18'GY\x00!!\x02\x0f\x0f\x11\x0c\x11\x05\ +\x18\x16\x09\x0c\x05\x0cFY\x05\x00\x00?+\x11\x003\ +\x18?\x129\x11\x129\x1132\x113+\x11\x12\x00\ +99\x113\x113\x11\x013\x113\x113\x11\x129\ +9\x113\x113\x11\x129\x113\x12910\x01&\ +54632\x16\x17\x07&&#\x22\x06\x15\x14\x16\ +\x17\x16\x16\x15\x10\x00!\x22$546\x014&'\ +\x06\x06\x15\x14\x16326\x01\xe5\xed\xf1\xd5o\xd1\x8d\ +y\x5c\xacXIJ\x8a\x8a\xb8\xad\xfe\xe6\xfe\xf7\xf4\xfe\ +\xdb\xc1\x02C_i{\x87xioz\x03\x96\x97\xbf\ +\x90\xa3-B\xd7-76.6iF^\xf6\xa0\xfe\ +\xfd\xfe\xef\xf8\xd2\xb6\xf0\xfe\x90]\x96:#\xb5~e\ +}\x88\x00\x00\x01\x00N\xff\xec\x04%\x04s\x00&\x00\ +b@2\x00\x1c\x14##\x16\x16\x10\x1d\x1c\x1c\x0b\x0b\ +(\x05\x10\x10'\x14&\x02&\x02JY\x0f&\x01\x0d\ +\x05&&\x0d\x19\x1d\x0a \x07\x19 FY\x19\x10\x0d\ +\x07FY\x0d\x16\x00?+\x00\x18?+\x11\x12\x009\ +9\x11\x129\x18/_^]+\x11\x12\x009\x11\x01\ +3\x113\x113\x113\x113\x129\x113\x113\x12\ +910\x01\x15#\x22\x06\x15\x14!267\x15\x06\ +! $54675&54632\x16\x17\ +\x07&&#\x22\x06\x15\x14\x163\x03H\xa8\x92\x93\x01\ +\x0cg\xdcY\xac\xfe\xfa\xfe\xf6\xfe\xe7\x80\x90\xd5\xfe\xea\ +s\xe9X^w\x8aMqn\x85\x8f\x02\xb0\xd3AH\ +}-)\xf4M\xa5\xa4k\x86\x1c\x0a1\xd1\x8d\x98.\ +&\xdd0\x1f26B7\x00\x00\x01\x00\x5c\xfe\x85\x03\ +\xf2\x06\x14\x00 \x00P@'\x0e\x15\x12\x15\x0b\x00\x02\ +\x03\x03\x06\x06\x00\x00\x22\x19\x0b\x0b!\x0b\x19\x19\x15\x1f\ +\x1f\x08\x08!\x15\x0e\x13\x12\x13\x12FY\x13\x00\x03\x22\ +\x00??+\x11\x12\x0099\x113\x113\x11\x129\ +\x113\x11\x013\x113\x113\x113\x113\x113\x11\ +\x1299\x11310\x05\x14\x07!6654&\ +'$\x114\x00%\x06\x06#!5!\x15\x06\x00\x02\ +\x15\x14\x1e\x02\x17\x16\x16\x03\xf2\x8a\xfe\xcdEOOf\ +\xfeH\x01\x06\x014\x1c\x8f3\xfe\xde\x03V\xc9\xfe\xf8\ +\x85'IgA\xa6\x9e%\x95\xc1]\x9b/ )\x13\ +M\x01~\xd1\x01\xa6\xfc\x07\x0a\xdf\xb6\xa7\xfe\xd6\xfe\xe7\ +\x93JZ5\x1c\x0d!}\x00\x00\x01\x00\xa0\xfe\x14\x04\ +\xa8\x04s\x00\x14\x002@\x19\x01\x00\x00\x16\x0d\x09\x09\ +\x0a\x0a\x15\x0d\x05\x11\x11\x05GY\x11\x10\x0b\x0f\x01\x1b\ +\x0a\x15\x00????+\x11\x12\x009\x11\x013\x11\ +3\x129\x113\x11310\x01!\x114&#\x22\ +\x06\x15\x11!\x113\x1736632\x16\x15\x04\xa8\ +\xfe\xcfV^\x80r\xfe\xcf\xe9)\x113\xb3r\xc3\xca\ +\xfe\x14\x04yyy\xab\xc6\xfd\xf2\x04^\x8fQS\xd3\ +\xc7\x00\x03\x00\x5c\xff\xec\x04\x96\x06+\x00\x0b\x00\x12\x00\ +\x19\x00?@ \x17\x0f\x0f\x00\x00\x1b\x16\x10\x10\x06\x06\ +\x1a\x16\x10FY\x16\x16\x03\x09\x09\x13FY\x09\x01\x03\ +\x0cFY\x03\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x013\x113\x113\x113\x113\x113\ +10\x01\x10\x00! \x00\x11\x10\x00! \x00\x012\ +67!\x16\x16\x13\x22\x06\x07!&&\x04\x96\xfe\xf3\ +\xfe\xee\xfe\xf7\xfe\xee\x01\x0c\x01\x0f\x01\x09\x01\x16\xfd\xe1\ +uk\x05\xfe7\x04iyln\x09\x01\xc6\x08i\x03\ +\x0c\xfek\xfeu\x01\x9b\x01\x85\x01\x97\x01\x88\xfei\xfc\ +5\xe9\xee\xeb\xec\x04\x85\xd5\xf6\xe6\xe5\x00\x01\x00\xa0\xff\ +\xec\x03\x17\x04^\x00\x0d\x00!@\x0f\x06\x01\x0f\x01\x0c\ +\x0c\x0e\x0d\x0f\x09\x04GY\x09\x16\x00?+\x00\x18?\ +\x11\x013\x113\x11\x12910\x01\x11\x14\x1632\ +7\x15\x06#\x22&5\x11\x01\xd1I#\xe33\xb9\xb9\x03\x00\xff\ +\xff\x00\xa0\x00\x00\x04\xf6\x04^\x02\x06\x00\xfa\x00\x00\x00\ +\x01\x00\x08\xff\xec\x04\xe1\x06!\x00\x22\x00b@2\x0d\ +\x03\x03\x07\x01\x01\x1e\x1e\x22\x1a\x1a\x10\x10\x22\x07\x14\x00\ +\x14$\x22\x00\x00#\x0d\x03\x1f\x01\x1a\x10\x10\x01\x03\x03\ +\x05\x14\x12\x18\x12HY\x18\x16\x0a\x05HY\x0a\x01\x00\ +\x15\x00??+\x00\x18?+\x11\x003\x12\x179\x11\ +3\x113\x113\x11\x013\x113\x113\x11\x129\x11\ +9\x113\x11\x129\x113\x11\x129\x113103\ +\x01'&&#\x22\x075632\x16\x16\x17\x01\x16\ +\x16327\x15\x06\x06#\x22&'\x02&'#\x06\ +\x07\x03\x08\x01\xd9#$\x5c_24OWs\xa3s\ +3\x01\x19%L7!$\x17r'n\x8c)r+\ +\x0d\x06.\x1e\xce\x04!\x5cZJ\x0d\xfc\x11F\x93\x8e\ +\xfc\xfchb\x0a\xec\x0c\x12lw\x01C\x854\x9aL\ +\xfe\x1b\x00\xff\xff\x00\xa0\xfe\x14\x04\xa8\x04^\x02\x06\x00\ +w\x00\x00\x00\x01\x00\x06\x00\x00\x04s\x04^\x00\x0d\x00\ +*@\x13\x0d\x0c\x03\x03\x01\x07\x07\x08\x08\x0f\x01\x00\x0e\ +\x03\x0d\x15\x07\x00\x0f\x00?2?9\x11\x0132\x11\ +3\x113\x11\x129\x113310\x13!\x13\x173\ +6\x12\x11!\x10\x02\x02\x07!\x06\x019\xdaE\x08s\ +f\x014X\xbf\xa0\xfe\xee\x04^\xfd\x94\xe4\x99\x01\x8c\ +\x01+\xff\x00\xfe\x8d\xfe\xb5\xa0\x00\x01\x00\x5c\xfe\x85\x03\ +\xf2\x06\x14\x00.\x00e@2%&&))#\x04\ +\x06\x09\x13\x13\x0c\x06\x18\x0f\x06\x0f\x00##0\x1c\x00\ +\x00/!++/\x03\x19\x16\x16\x19JY\x16\x16\x0d\ +&\x22\x10\x0c\x09\x0d\x09JY\x0d\x00\x00?+\x11\x00\ +33\x18?\x129/+\x11\x12\x009\x113\x113\ +\x11\x013\x113\x113\x11\x1299\x113\x1133\ +\x113\x129\x113\x113\x11310\x13467\ +5&5467\x06##5!\x15#\x22\x06\x15\ +\x14\x1633\x15#\x22\x06\x15\x14\x16\x16\x17\x16\x16\x15\ +\x14\x07!6654&'&&\x5c\x92\x89\xdb\x87\ +\x99\xcdC\x16\x03$K\xb9\xeb\x81\x93\xa6\xa8\xad\x9a/\ +a\x88\xa6\x9e\x8a\xfe\xcdEOOf\xd9\xdf\x01\xb6~\ +\xbf6\x0a4\xcak\x81%\x0d\xdf\xd2\x89u_R\xd2\ +{{GU5\x1b!}f\x95\xc1]\x9b/ )\ +\x13&\xda\xff\xff\x00\x5c\xff\xec\x04\x98\x04s\x02\x06\x00\ +R\x00\x00\x00\x01\x00\x19\xff\xec\x05\xa2\x04^\x00\x17\x00\ +B@!\x03\x15\x15\x09\x0c\x0d\x09\x0d\x13\x0f\x13\x19\x11\ +\x0f\x0f\x18\x14\x0b\x0f\x11\x0fFY\x11\x0f\x0d\x15\x06\x00\ +GY\x06\x16\x00?+\x00\x18??+\x11\x0033\ +\x11\x013\x113\x113\x11\x1299\x113\x113\x11\ +910%27\x15\x06\x06#\x22&5\x11!\x11\ +!\x11#57!\x15#\x11\x14\x16\x05\x14C?)\ +\x7f6\x96\x9d\xfe\xae\xfe\xcf\xe9\xb2\x04\xd7\xec6\xdb#\ +\xdb\x19\x1e\xa4\xa3\x02B\xfc\x8b\x03u\x83f\xe9\xfd\xca\ +31\x00\x00\x02\x00y\xfe\x14\x04\x96\x04s\x00\x11\x00\ +\x1e\x00/@\x18\x1c\x00\x00 \x16\x09\x09\x0a\x0a\x1f\x0e\ +\x12GY\x0e\x10\x0a\x1b\x03\x19GY\x03\x16\x00?+\ +\x00\x18??+\x11\x013\x113\x113\x113\x113\ +10\x01\x10\x02#\x22'#\x16\x15\x11!\x11\x10\x00\ +32\x16\x12%\x22\x06\x15\x11\x16\x1632654\ +&\x04\x96\xf5\xda\x9a\x7f\x12\x10\xfe\xcd\x01\x15\xff\x9b\xec\ +\x82\xfd\xf1qj+t#\xe33\xb9\xb9\x02\x1b\x7ff\xe5\x00\x00\x01\x00\ +\x8f\xff\xee\x04\xbc\x04^\x00\x15\x00-@\x15\x10\x0f\x0f\ +\x0c\x0c\x13\x13\x17\x06\x03\x03\x16\x0f\x04\x0f\x00\x09GY\ +\x00\x16\x00?+\x00\x18?3\x11\x013\x113\x113\ +\x113\x113\x11310\x05 \x02\x11\x11!\x11\x14\ +\x1632654&'!\x16\x16\x15\x10\x00\x02\x91\ +\xfe\xfd\xff\x012ir}r\x1c+\x013(\x1d\xfe\ +\xef\x12\x01\x03\x01\x0d\x02`\xfd\x96\x92\x81\xba\xcbk\xd6\ +\xb7\x9d\xedv\xfe\xc6\xfe\xca\x00\x00\x02\x00\x5c\xfe\x14\x05\ +\xfa\x04w\x00\x09\x00#\x00P@)\x07##\x17\x0a\ +\x0a\x0e\x00\x00\x1e\x1e%\x15\x0e\x0e$\x1b\x03FY\x1b\ +\x10\x0e\x15\x15\x12\x17\x12\x11\x10\x07\x17\x0b\x17FY\x22\ +\x0b\x16\x0a\x1b\x00??3+\x11\x003\x18?3\x11\ +\x129\x113?+\x11\x013\x113\x113\x113\x11\ +\x129\x1133\x11310\x014&#\x22\x06\x15\ +\x1166\x01\x11$\x0054\x127\x17\x06\x06\x15\x10\ +\x05\x114632\x00\x15\x14\x02\x04\x07\x11\x04\xd5^\ +Z9@\x89\xa8\xfd\xb4\xfe\xed\xfe\xe6nx\xddZJ\ +\x01\x0e\xd6\xba\xe1\x01\x00\x95\xfe\xf1\xb2\x02N\x9c\xa7O\ +a\xfd\xfa\x0c\xcc\xfca\x01\xe0\x1e\x01#\xf6\x9b\x01\x1f\ +\x92\x90z\xcfy\xfe\xea4\x02\x04\xb9\xd7\xfe\xdc\xfb\xab\ +\xfe\xfb\x9b\x11\xfe \x00\x00\x01\xff\xcf\xfe\x14\x04\xc9\x04\ +m\x00 \x00X@,\x15\x18\x18\x08\x05\x05\x1e\x06\x0f\ +\x07\x07\x22\x16\x17\x17\x1e\x1e!\x15\x08\x05\x18\x18\x06\x17\ +\x1b\x0e\x0c\x11\x0cHY\x11\x1b\x06\x0f\x1e\x1c\x00\x1cH\ +Y\x00\x10\x00?+\x11\x003\x18??+\x11\x003\ +\x18?\x129\x11333\x11\x013\x113\x113\x11\ +3\x1133\x119\x1133\x11310\x132\x16\ +\x16\x17\x17\x01!\x01\x13\x16\x16327\x15\x06#\x22\ +&'\x03\x01!\x01\x03&&#\x22\x0756\xf0Z\ +rP)J\x01\x17\x013\xfe9\xc3\x1cF=14\ +Un}\x9f4h\xfe\xc6\xfe\xbb\x01\xf6\x86\x19F8\ +8;r\x04m3q{\xdd\x01\xed\xfd\x06\xfe%@\ +5\x0d\xee\x1f\x87\x9e\x01F\xfd\x95\x03u\x01`F>\ +\x13\xf4\x1f\x00\x01\x00\x8f\xfe\x14\x06F\x06\x12\x00\x19\x00\ +A@ \x01\x0d\x0d\x18\x0e\x0e\x12\x04\x04\x09\x09\x1b\x15\ +\x12\x12\x1a\x19\x00\x06\x13\x0f\x01\x18\x0f\x18FY\x0c\x0f\ +\x16\x0e\x1b\x00??3+\x11\x003\x18?3?\x11\ +\x013\x113\x113\x113\x11\x129\x1133\x113\ +10\x01\x116654\x03!\x12\x11\x10\x00\x05\x11\ +!\x11$\x00\x11\x11!\x11\x14\x16\x17\x11\x03\xf0\xb0\x8d\ +P\x01\x1bN\xfe\xd3\xfe\xd7\xfe\xe5\xfe\xde\xfe\xdc\x01#\ +\x80\xa3\x06\x12\xfa\xc7\x11\xa5\xb3\xe0\x01<\xfe\xe7\xfe\xfa\ +\xfe\xee\xfe\xd2\x11\xfe&\x01\xda\x09\x01!\x01\x13\x023\ +\xfd\xc5\xad\x93\x0c\x05;\x00\x01\x00m\xff\xec\x06{\x04\ +^\x00'\x00?@\x1e\x04\x19\x19\x16\x16\x0a\x1f%%\ +)\x10\x0a\x0a(\x17\x17\x07!\x0d\x0f\x1c\x04\x13\x07\x13\ +FY\x00\x07\x16\x00?3+\x11\x0033\x18?3\ +\x129/\x11\x013\x113\x113\x113\x129\x113\ +\x12910\x05\x22&'#\x06\x06#\x22\x02\x114\ +\x127!\x02\x11\x14\x163265\x11!\x11\x14\x16\ +3265\x10\x03!\x16\x12\x15\x10\x02\x04\xb8z\x9c\ +)\x0a.\x9bw\xd6\xec0@\x01%}c`SL\ +\x01\x19LT^d}\x01%@1\xee\x14iin\ +d\x01.\x01\x05\x9a\x01\x04\xa1\xfe\xfa\xfe\xd1\xa4\xact\ +\x86\x01'\xfe\xd9\x87s\xa9\xa3\x013\x01\x06\xa2\xfe\xfe\ +\x9b\xfe\xf9\xfe\xd4\xff\xff\x00\x0c\xff\xec\x03\x17\x06\x04\x02\ +&\x01\x86\x00\x00\x01\x07\x00j\xfe\xf5\x00\x00\x00\x0a\xb4\ +\x02\x01#\x11&\x00+55\xff\xff\x00\x8f\xff\xee\x04\ +\xbc\x06\x04\x02&\x01\x92\x00\x00\x01\x06\x00j'\x00\x00\ +\x0a\xb4\x02\x01+\x11&\x00+55\xff\xff\x00\x5c\xff\ +\xec\x04\x98\x06^\x02&\x00R\x00\x00\x01\x06\x01TB\ +\x00\x00\x08\xb3\x02\x22\x11&\x00+5\xff\xff\x00\x8f\xff\ +\xee\x04\xbc\x06^\x02&\x01\x92\x00\x00\x01\x06\x01TN\ +\x00\x00\x08\xb3\x01\x1e\x11&\x00+5\xff\xff\x00m\xff\ +\xec\x06{\x06^\x02&\x01\x96\x00\x00\x01\x07\x01T\x01\ +5\x00\x00\x00\x08\xb3\x010\x11&\x00+5\xff\xff\x00\ +\xb8\x00\x00\x04\x02\x07V\x02&\x00(\x00\x00\x01\x07\x00\ +j\xff\xf1\x01R\x00\x0a\xb4\x02\x01!\x05&\x00+5\ +5\x00\x01\x00)\xff\xee\x06\x04\x05\xb6\x00\x1e\x00R@\ +*\x15\x17\x1c\x17\x02\x0f\x09\x0f\x10\x10\x12\x09\x09\x1c\x1c\ + \x12\x1f\x17\x0eLY\x17\x17\x10\x13\x16\x12\x13\x12L\ +Y\x13\x03\x10\x12\x00\x05MY\x00\x13\x00?+\x00\x18\ +??+\x11\x003\x11\x129\x18/+\x11\x013\x11\ +3\x113\x11\x129\x113\x11\x1292\x11\x1291\ +0\x05\x22'\x11\x163266554&#!\ +\x11!\x11!\x11!\x11!\x11!2\x16\x15\x15\x14\x06\ +\x04mtWcI62\x19S_\xfe\xb0\xfe\xcb\xfe\ +\x91\x04Z\xfeJ\x01\x5c\xe4\xf7\xcd\x12&\x01\x00+\x1f\ +D7\x7fYG\xfd^\x04\xb4\x01\x02\xfe\xfe\xfe\xf0\xce\ +\xbd\x81\xd1\xd9\x00\xff\xff\x00\xb8\x00\x00\x04T\x07s\x02\ +&\x01a\x00\x00\x01\x07\x00v\x00\x85\x01R\x00\x08\xb3\ +\x01\x0e\x05&\x00+5\x00\x01\x00w\xff\xec\x05#\x05\ +\xcb\x00\x1c\x00?@ \x05\x0c\x12\x19\x19\x1e\x03\x06\x06\ +\x12\x12\x1d\x03\x06LY\x03\x03\x0f\x16\x16\x00LY\x16\ +\x04\x0f\x09LY\x0f\x13\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x013\x113\x113\x113\x11\x12\ +9910\x01\x22\x06\x07!\x15!\x16\x16327\ +\x11\x06\x06# \x00\x114\x12$32\x16\x17\x07'\ +&\x03J\xaa\xd6\x0c\x02y\xfd\x85\x0d\xc9\xbc\xab\xf3j\ +\xcdz\xfe\xa8\xfe\x94\xb2\x01M\xe2\x82\xddloW\x8e\ +\x04\xc9\xbf\xaa\xfe\xb2\xc2M\xfe\xfc(#\x01\x83\x01j\ +\xe3\x01W\xb870\xfc%<\xff\xff\x00^\xff\xec\x04\ +\x17\x05\xcb\x02\x06\x006\x00\x00\xff\xff\x00B\x00\x00\x02\ +\xdb\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x009\x00\x00\x02\ +\xe7\x07V\x02&\x00,\x00\x00\x01\x07\x00j\xff\x22\x01\ +R\x00\x0a\xb4\x02\x01!\x05&\x00+55\xff\xff\xff\ +h\xfeR\x01\xee\x05\xb6\x02\x06\x00-\x00\x00\x00\x02\x00\ +\x10\xff\xea\x07\xa2\x05\xb6\x00\x1a\x00#\x00Q@*\x0a\ +\x19\x00\x1b\x1b\x08\x19\x08\x11\x1f\x1f\x04\x04%\x11$\x00\ +#LY\x00\x00\x08\x19\x19\x0aLY\x19\x03\x0f\x14L\ +Y\x0f\x13\x08\x1bLY\x08\x12\x00?+\x00\x18?+\ +\x00\x18?+\x11\x12\x009\x18/+\x11\x013\x113\ +\x113\x11\x1299\x113\x113\x11310\x013\ + \x04\x15\x14\x04!!\x11!\x07\x02\x02\x06'\x22'\ +5\x16326\x12\x12\x13!\x1132654&\ +##\x04\xfas\x01\x0e\x01'\xfe\xda\xfe\xe0\xfei\xfe\ +\xdd\x10>_\xb6\x9bT@:35>7[ \x03\ +X^\x8d\x83\x83\xa3H\x03\x85\xe8\xd4\xe4\xe5\x04\xb4\x86\ +\xfe\x01\xfec\xa8\x02\x16\xfe\x14a\x01\x07\x02W\x01\x0b\ +\xfbHefc[\x00\x00\x02\x00\xb8\x00\x00\x07\xa8\x05\ +\xb6\x00\x12\x00\x1b\x00R@*\x0f\x13\x13\x0c\x04\x04\x08\ +\x17\x17\x00\x00\x1d\x0b\x07\x07\x08\x08\x1c\x0b\x06LY\x0b\ +\x0f\x0f\x1bLY\x0f\x0f\x04\x0d\x09\x03\x08\x12\x04\x13L\ +Y\x04\x12\x00?+\x00\x18??3\x129/+\x00\ +\x18\x10\xc4+\x11\x013\x113\x113\x113\x113\x11\ +\x129\x1133\x11310\x01\x14\x04!!\x11!\ +\x11!\x11!\x11!\x11!\x113 \x04\x01326\ +54&##\x07\xa8\xfe\xda\xfe\xe0\xfei\xfe#\xfe\ +\xca\x016\x01\xdd\x015s\x01\x0e\x01'\xfdX^\x8d\ +\x84\x87\xa0H\x01\xc9\xe4\xe5\x02w\xfd\x89\x05\xb6\xfd\xc3\ +\x02=\xfd\xcf\xe8\xfeaefeY\x00\x01\x00)\x00\ +\x00\x06\x04\x05\xb6\x00\x13\x00F@#\x0c\x0e\x13\x0e\x06\ +\x06\x07\x07\x09\x00\x00\x13\x13\x15\x09\x14\x0e\x05LY\x0e\ +\x0e\x07\x0a\x0d\x09\x0a\x09LY\x0a\x03\x00\x07\x12\x00?\ +3?+\x11\x003\x11\x129\x18/+\x11\x013\x11\ +3\x113\x11\x129\x113\x113\x11\x12910!\ +\x114&#!\x11!\x11!\x11!\x11!\x11!2\ +\x16\x15\x11\x04\xcfFP\xfe\x94\xfe\xcb\xfe\x91\x04Z\xfe\ +J\x01\x81\xd0\xe6\x02\x02YG\xfd^\x04\xb4\x01\x02\xfe\ +\xfe\xfe\xf0\xd1\xba\xfd\xe7\xff\xff\x00\xb8\x00\x00\x05`\x07\ +s\x02&\x01\xb4\x00\x00\x01\x07\x00v\x00\xf8\x01R\x00\ +\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x00\x00\xff\xec\x05\ +9\x07\x91\x02&\x01\xbd\x00\x00\x01\x07\x026\x00^\x01\ +R\x00\x08\xb3\x01\x17\x05&\x00+5\x00\x01\x00\xb8\xfe\ +V\x05=\x05\xb6\x00\x0b\x002@\x18\x02\x03\x03\x05\x09\ +\x00\x00\x0d\x08\x05\x05\x0c\x0a\x06\x03\x05\x08LY\x01\x05\ +\x12\x03'\x00??3+\x00\x18?3\x11\x013\x11\ +3\x113\x113\x129\x11310!!\x11!\x11\ +!\x11!\x11!\x11!\x05=\xfeT\xfe\xd5\xfeR\x01\ +6\x02\x1a\x015\xfeV\x01\xaa\x05\xb6\xfbL\x04\xb4\xff\ +\xff\x00\x00\x00\x00\x05\x85\x05\xbc\x02\x06\x00$\x00\x00\x00\ +\x02\x00\xb8\x00\x00\x04\xbe\x05\xb6\x00\x0b\x00\x14\x00?@\ + \x0a\x00\x10\x04\x04\x16\x00\x0c\x0c\x07\x07\x15\x00\x14L\ +Y\x00\x00\x07\x08\x08\x0bLY\x08\x03\x07\x0cLY\x07\ +\x12\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\ +\x013\x113\x113\x113\x113\x12910\x013\ + \x04\x15\x10!!\x11!\x11!\x1132654\ +&##\x01\xeez\x01\x1e\x018\xfd\xa4\xfeV\x03\x9c\ +\xfd\x9ah\x9d\x92\x94\xb4O\x03\x85\xe8\xd4\xfe7\x05\xb6\ +\xff\x00\xfcHefeY\x00\xff\xff\x00\xb8\x00\x00\x04\ +\xf4\x05\xb6\x02\x06\x00%\x00\x00\xff\xff\x00\xb8\x00\x00\x04\ +T\x05\xb6\x02\x06\x01a\x00\x00\x00\x02\x00\x0a\xfeV\x05\ +\xf4\x05\xb6\x00\x0d\x00\x13\x00Q@(\x11\x01\x01\x04\x0d\ +\x04\x0e\x0e\x12\x0c\x12\x06\x06\x0d\x09\x08\x08\x15\x0c\x0d\x0d\ +\x14\x09\x0d'\x11\x06\x00\x0b\x00LY\x0b\x12\x04\x0eL\ +Y\x04\x03\x00?+\x00\x18?+\x11\x0033\x18?\ +3\x11\x013\x113\x113\x113\x129\x113\x11\x12\ +9\x113\x11\x129\x11310\x133\x12\x12\x13!\ +\x113\x11!\x11!\x11!\x01\x06\x02\x07!\x11\x0aq\ +\x91\xa8)\x03T\xc3\xfe\xd5\xfcl\xfe\xd5\x02\xc9 \x95\ +]\x02;\x01\x02\x01\x22\x02C\x01O\xfbL\xfdT\x01\ +\xaa\xfeV\x06^\xe5\xfe\x00\xcd\x03\xb2\xff\xff\x00\xb8\x00\ +\x00\x04\x02\x05\xb6\x02\x06\x00(\x00\x00\x00\x01\x00\x00\x00\ +\x00\x07\x8b\x05\xb6\x00\x11\x00T@(\x09\x06\x0d\x0d\x03\ +\x00\x0e\x0e\x11\x0a\x07\x08\x08\x0b\x0a\x0a\x13\x02\x01\x10\x11\ +\x11\x12\x0c\x06\x09\x09\x0f\x03\x00\x00\x01\x0e\x0b\x11\x12\x07\ +\x04\x01\x03\x00?33?33\x129\x11333\ +\x1133\x11\x013\x11332\x113\x1133\x11\ +3\x11\x129\x11333\x113310\x01\x01!\ +\x01\x11!\x11\x01!\x01\x01!\x01\x11!\x11\x01!\x02\ +\x08\xfe\x15\x01?\x01\xd9\x01!\x01\xd9\x01@\xfe\x14\x02\ +\x08\xfe\xb4\xfe\x17\xfe\xdf\xfe\x17\xfe\xb4\x02\xf8\x02\xbe\xfd\ +<\x02\xc4\xfd<\x02\xc4\xfdB\xfd\x08\x02\xe5\xfd\x1b\x02\ +\xe5\xfd\x1b\x00\x01\x00^\xff\xec\x04\xd7\x05\xcb\x00&\x00\ +J@%\x16\x04\x1b\x1b\x00\x0d\x00!\x12\x07\x07(!\ +'\x03\x17\x16\x17\x16MY\x17\x17\x0a$$\x1eMY\ +$\x04\x0a\x10MY\x0a\x13\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x009\x11\x013\x113\x11\ +3\x1299\x113\x113910\x01\x14\x06\x07\x15\ +\x16\x16\x15\x14\x04! '\x11\x16\x163 54&\ +##532654&#\x22\x07'6$3\ +2\x04\x04\xaa\xc8\xab\xc9\xd7\xfe\xb9\xfe\xdf\xfe\xbe\xc3^\ +\xfdn\x01q\xed\xe8\x89{\xe8\xd4\x85\x85\xce\xc0\x87}\ +\x01\x18\xab\xef\x01\x1d\x04`\x8d\xb8\x19\x06\x14\xb6\x92\xca\ +\xeaO\x01\x04-3\xd7ah\xf2XfKYw\xcf\ +SM\xc8\x00\x01\x00\xb8\x00\x00\x05\xdd\x05\xb6\x00\x0f\x00\ +,@\x14\x0e\x06\x02\x09\x09\x08\x08\x11\x02\x0f\x0f\x10\x04\ +\x0d\x09\x0f\x12\x06\x00\x03\x00?2?399\x11\x01\ +3\x113\x113\x113\x11\x129910\x13!\x11\ +\x07\x073\x01!\x11!\x114\x13#\x01!\xb8\x01\x17\ +\x04\x0a\x06\x02\xa3\x01s\xfe\xec\x12\x08\xfdZ\xfe\x8b\x05\ +\xb6\xfd>\xbd\xd7\x04V\xfaJ\x02\xbe\x8d\x01\x15\xfb\xa0\ +\x00\xff\xff\x00\xb8\x00\x00\x05\xdd\x07\x91\x02&\x01\xb2\x00\ +\x00\x01\x07\x026\x00\xfc\x01R\x00\x08\xb3\x01\x13\x05&\ +\x00+5\x00\x01\x00\xb8\x00\x00\x05`\x05\xb6\x00\x0a\x00\ +4@\x18\x08\x09\x09\x01\x00\x00\x0c\x0a\x07\x03\x03\x04\x0b\ +\x07\x02\x0a\x0a\x04\x08\x05\x03\x01\x04\x12\x00?3?3\ +\x129\x1133\x11\x0132\x1133\x113\x113\ +3\x11310!!\x01\x11!\x11!\x11\x01!\x01\ +\x05`\xfe\xa0\xfd\xee\xfe\xca\x016\x02\x0c\x01J\xfd\xeb\ +\x02\xe5\xfd\x1b\x05\xb6\xfd<\x02\xc4\xfdB\x00\x00\x01\x00\ +\x10\xff\xea\x05=\x05\xb6\x00\x13\x001@\x19\x03\x12\x12\ +\x0a\x01\x01\x00\x00\x15\x0a\x14\x12\x03LY\x12\x03\x08\x0d\ +LY\x08\x13\x01\x12\x00??+\x00\x18?+\x11\x01\ +3\x113\x113\x11\x129\x11310!!\x11!\ +\x07\x02\x02\x06'\x22'5\x16326\x12\x12\x13!\ +\x05=\xfe\xcb\xfe\x9a\x10>_\xb6\x9bT@:35\ +>7[ \x03\x9b\x04\xb4\x86\xfe\x01\xfec\xa8\x02\x16\ +\xfe\x14a\x01\x07\x02W\x01\x0b\xff\xff\x00\xb8\x00\x00\x06\ +\xd3\x05\xb6\x02\x06\x000\x00\x00\xff\xff\x00\xb8\x00\x00\x05\ +f\x05\xb6\x02\x06\x00+\x00\x00\xff\xff\x00w\xff\xec\x05\ +\xe7\x05\xcd\x02\x06\x002\x00\x00\xff\xff\x00\xb8\x00\x00\x05\ +=\x05\xb6\x02\x06\x01n\x00\x00\xff\xff\x00\xb8\x00\x00\x04\ +\xaa\x05\xb6\x02\x06\x003\x00\x00\xff\xff\x00w\xff\xec\x04\ +\xd1\x05\xcb\x02\x06\x00&\x00\x00\xff\xff\x00)\x00\x00\x04\ +y\x05\xb6\x02\x06\x007\x00\x00\x00\x01\x00\x00\xff\xec\x05\ +9\x05\xb6\x00\x13\x00E@!\x02\x0c\x0c\x07\x0d\x0d\x10\ +\x10\x0f\x13\x13\x07\x0e\x00\x00\x15\x0f\x0e\x0e\x14\x0d\x11\x11\ +\x05\x13\x0e\x03\x05\x0aLY\x05\x13\x00?+\x00\x18?\ +3\x129\x113\x11\x013\x113\x113\x11\x1293\ +\x11\x129\x113\x11\x129\x11310\x01\x01\x0e\x02\ +#\x22'\x11\x163267\x01!\x0137\x01\x05\ +9\xfe@\ +\x1e\x00\x0d\x0d\x01\x0c\x09\x09\x11\x07\x06\x06\x01\x04\x04\x10\ +\x0e\x02\x0a\x03\x04\x00\x0c\x09\x0cLY\x09\x12\x07'\x00\ +??+\x11\x0033\x18?33\x01/3\x113\ +3\x113\x113\x113\x129\x11310\x01!\x11\ +!\x113\x11!\x11!\x11!\x11!\x11!\x01\x04\xec\ +\x01\xc6\x015\xda\xfe\xd5\xf9\x22\x016\x01\xc6\x018\x03\ +\xb4\x01\x02\x04\xb4\xfb@\xfd`\x01\xaa\x05\xb6\xfbL\x04\ +\xb4\xfaJ\x00\x02\x00\x00\x00\x00\x05u\x05\xb6\x00\x0c\x00\ +\x15\x00A@!\x09\x0d\x0d\x04\x04\x06\x11\x11\x00\x00\x17\ +\x06\x16\x09\x15LY\x09\x09\x04\x07\x07\x06LY\x07\x03\ +\x04\x0dLY\x04\x12\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x013\x113\x113\x11\x129\x113\ +\x11310\x01\x14\x04!!\x11!\x11!\x113 \ +\x04\x0132654&##\x05u\xfe\xcf\xfe\xd5\ +\xfeV\xfe\x91\x02\xa4{\x01\x1e\x018\xfd/h\x9d\x92\ +\x94\xb3P\x01\xc9\xe4\xe5\x04\xb4\x01\x02\xfd\xcf\xe8\xfea\ +efeY\x00\x00\x03\x00\xb8\x00\x00\x06\x87\x05\xb6\x00\ +\x0a\x00\x13\x00\x17\x00A@ \x0f\x00\x00\x0b\x15\x14\x14\ +\x19\x07\x0b\x0b\x04\x04\x18\x15\x12\x07\x13LY\x07\x07\x04\ +\x16\x05\x03\x04\x0bLY\x04\x12\x00?+\x00\x18?3\ +\x129/+\x00\x18?\x11\x013\x113\x113\x113\ +\x113\x129\x11310\x01\x14\x04!!\x11!\x11\ +3 \x04\x0132654&##\x01!\x11!\ +\x04\xa0\xfe\xd1\xfe\xd7\xfep\x016d\x01\x19\x015\xfd\ +NQ\x99\x8e\x89\xacC\x04\x99\xfe\xcb\x015\x01\xc9\xe4\ +\xe5\x05\xb6\xfd\xcf\xe9\xfebeffX\xfdy\x05\xb6\ +\x00\x00\x02\x00\xb8\x00\x00\x04\xbe\x05\xb6\x00\x09\x00\x12\x00\ +2@\x19\x0e\x00\x00\x14\x06\x0a\x0a\x03\x03\x13\x06\x12L\ +Y\x06\x06\x03\x04\x03\x03\x0aLY\x03\x12\x00?+\x00\ +\x18?\x129/+\x11\x013\x113\x113\x113\x11\ +310\x01\x10!!\x11!\x113 \x04\x0132\ +654&##\x04\xbe\xfd\xa4\xfeV\x016z\x01\ +\x1e\x018\xfd0h\x9d\x92\x94\xb4O\x01\xc9\xfe7\x05\ +\xb6\xfd\xcf\xe8\xfeaefeY\x00\x00\x01\x00H\xff\ +\xec\x04\xd7\x05\xcb\x00\x19\x00I@&\x15\x04\x09\x17\x14\ +\x14\x09\x09\x1b\x0e\x04\x04\x1a\x16\x15LY\x0c\x16\x01\x0d\ +\x03\x16\x16\x0c\x06\x0c\x11LY\x0c\x13\x06\x00LY\x06\ +\x04\x00?+\x00\x18?+\x11\x12\x009\x18/_^\ +]+\x11\x013\x113\x113\x113\x113\x11\x129\ +10\x01\x22\x06\x07'63 \x00\x11\x10\x00!\x22\ +'\x11\x163267!5!&&\x02)c\xbf\ +]b\xe8\xff\x01E\x01c\xfe\x93\xfe\xa8\xed\xc3\xf3\xab\ +\xbf\xc9\x09\xfd\x86\x02x\x06\xc0\x04\xc98'\xfag\xfe\ +q\xfe\x9d\xfe\x96\xfe}K\x01\x04M\xba\xba\xfe\xaa\xbf\ +\x00\x00\x02\x00\xb8\xff\xec\x08\x19\x05\xcd\x00\x12\x00\x1d\x00\ +Q@+\x13\x0d\x06\x06\x09\x18\x00\x00\x1f\x0c\x08\x08\x09\ +\x09\x1e\x10\x1bLY\x10\x04\x0c\x07LY\x0c\x0c\x01\x0d\ +\x03\x0c\x0c\x09\x0a\x03\x09\x12\x03\x16LY\x03\x13\x00?\ ++\x00\x18??\x129/_^]+\x00\x18?+\ +\x11\x013\x113\x113\x113\x113\x129\x1133\ +10\x01\x10\x00! \x00\x03!\x11!\x11!\x11!\ +\x12\x00! \x00\x01\x14\x163 \x114&#\x22\x06\ +\x08\x19\xfe\xaf\xfe\xc5\xfe\xdf\xfe\xb4\x1a\xfe\xe8\xfe\xca\x01\ +6\x01\x1e\x22\x01I\x01\x18\x01<\x01N\xfc+\xa8\xa1\ +\x01L\xa5\xa3\xa4\xa9\x02\xdd\xfe\x98\xfew\x01M\x01>\ +\xfd\x89\x05\xb6\xfd\xc3\x01!\x013\xfex\xfe\x98\xf4\xf9\ +\x01\xed\xf4\xfa\xfa\x00\x02\xff\xf6\x00\x00\x04\x9a\x05\xb6\x00\ +\x0d\x00\x16\x00Q@(\x03\x00\x00\x12\x16\x16\x0c\x12\x06\ +\x06\x02\x0c\x0c\x0b\x0b\x18\x01\x02\x02\x17\x03\x09\x00\x15\x00\ +MY\x15\x15\x02\x09\x09\x0fLY\x09\x03\x0c\x02\x12\x00\ +?3?+\x11\x12\x009\x18/+\x11\x12\x009\x11\ +\x013\x113\x113\x113\x11\x129\x113\x113\x11\ +\x129\x11310\x01\x01!\x01&&54$!\ +!\x11!\x11\x11#\x22\x06\x15\x14\x1633\x02\xa4\xfe\ +\xaa\xfe\xa8\x01\xa0|\x84\x01\x1d\x01\x0b\x01\xdc\xfe\xca\x99\ +x\x84\x80\x84\x91\x021\xfd\xcf\x02\x832\xd1\x8e\xc9\xd9\ +\xfaJ\x021\x02\x87Vdap\x00\xff\xff\x00V\xff\ +\xec\x04;\x04u\x02\x06\x00D\x00\x00\x00\x02\x00\x5c\xff\ +\xec\x04\x9e\x06%\x00\x18\x00#\x00D@\x22\x1b\x06\x13\ +\x13%\x0c!!\x00\x00$\x0c\x1d\x10\x10\x1dFY\x10\ +\x10\x16\x05\x16\x19GY\x16\x16\x05\x06HY\x05\x01\x00\ +?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\x00\ +9\x11\x013\x113\x113\x113\x113310\x13\ +\x10\x00%6%\x13\x06\x05\x0e\x02\x0736632\ +\x16\x15\x10\x00! \x00\x052\x11\x10#\x22\x06\x06\x07\ +\x14\x16\x5c\x01%\x017\x97\x01,#\x82\xfe\xb5~|\ +=\x07\x0f5\xaed\xcf\xe6\xfe\xdd\xff\x00\xff\x00\xfe\xe1\ +\x021\xd9\xc46kY\x15\x82\x02\x9e\x01\x81\x01\x8f5\ +\x1a(\xfe\xf6\x0f1\x14P\x94{RX\xfd\xec\xfe\xf0\ +\xfe\xd3\x01ox\x01+\x01#2Q)\xcb\xd7\x00\x00\ +\x03\x00\xa0\x00\x00\x04\xcb\x04^\x00\x0f\x00\x18\x00 \x00\ +N@'\x03\x19\x19\x00\x00\x15\x10\x07\x07\x22\x1d\x15\x15\ +\x0b\x0b!\x03\x1d\x14\x1d\x14JY\x1d\x1d\x0b\x0c\x0c\x1c\ +JY\x0c\x0f\x0b\x15JY\x0b\x15\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x12\x009\x11\x013\x11\ +3\x113\x113\x113\x129\x113\x12910\x01\ +\x14\x06\x07\x15\x16\x16\x15\x14\x04#!\x11!2\x16\x01\ +4&##\x11326\x034#!\x15326\ +\x04\xa8qnw\x8b\xff\x00\xee\xfd\xc3\x02=\xe6\xe5\xfe\ +\xe7ff\xf2\xf8ae\x1c\xa2\xff\x00\xddad\x039\ +Z\x7f\x12\x08\x0e\x87c\xa3\xab\x04^\x95\xfd\x95B;\ +\xfe\xf8I\x02\x05f\xdd8\x00\x00\x01\x00\xa0\x00\x00\x03\ +\xa4\x04^\x00\x05\x00\x1d@\x0e\x00\x07\x03\x04\x04\x06\x05\ +\x02FY\x05\x0f\x04\x15\x00??+\x11\x013\x113\ +\x11310\x01\x15!\x11!\x11\x03\xa4\xfe-\xfe\xcf\ +\x04^\xe5\xfc\x87\x04^\x00\x02\x00\x1d\xfeo\x051\x04\ +^\x00\x05\x00\x13\x00I@%\x05\x0d\x0d\x10\x10\x02\x00\ +\x12\x02\x12\x0b\x07\x06\x06\x15\x0a\x0b\x0b\x14\x10\x02FY\ +\x10\x0f\x07\x0b#\x12\x05\x0c\x09\x0cFY\x09\x15\x00?\ ++\x11\x0033\x18?3?+\x11\x013\x113\x11\ +3\x113\x1299\x113\x113\x119\x11310\ +%\x11#\x06\x02\x07\x01!\x11!\x11!\x1136\x12\ +\x13!\x113\x03\x5c\xe5\x19WM\x03w\xfe\xee\xfd\x10\ +\xfe\xee^`\x82\x1a\x03\x16\xa4\xdf\x02\x9a\xba\xfe\xb2\x92\ +\xfd\x90\x01\x91\xfeo\x02p\x95\x01\xc6\x01$\xfc\x81\xff\ +\xff\x00\x5c\xff\xec\x04b\x04s\x02\x06\x00H\x00\x00\x00\ +\x01\x00\x00\x00\x00\x06\xfc\x04^\x00\x11\x00R@'\x06\ +\x03\x0a\x0a\x0f\x00\x0b\x0b\x07\x04\x05\x05\x08\x07\x07\x13\x11\ +\x10\x10\x0d\x0e\x12\x09\x03\x06\x06\x0c\x00\x0f\x0f\x0e\x04\x01\ +\x10\x0f\x0b\x08\x0e\x15\x00?33?33\x129\x11\ +333\x1133\x11\x01322\x113\x113\x11\ +33\x113\x119\x11333\x113310\x01\ +\x11!\x11\x01!\x01\x01!\x01\x11!\x11\x01!\x01\x01\ +!\x02\xf0\x01\x1c\x01\x8e\x01;\xfed\x01\xc3\xfe\xba\xfe\ +V\xfe\xe4\xfeV\xfe\xba\x01\xc3\xfed\x01;\x02?\x02\ +\x1f\xfd\xe1\x02\x1f\xfd\xe8\xfd\xba\x027\xfd\xc9\x027\xfd\ +\xc9\x02F\x02\x18\x00\x01\x00N\xff\xec\x04#\x04s\x00\ +(\x00L@&'\x0a\x13\x03\x03\x10\x0a\x10\x1c#\x16\ +\x16*\x1c)\x12('('JY((\x1a\x0d\x1a\ + FY\x1a\x16\x0d\x06FY\x0d\x10\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x12\x009\x11\x013\ +\x113\x113\x1299\x113\x113\x12910\x01\ +2654&#\x22\x06\x07'6632\x16\x15\ +\x14\x07\x15\x16\x16\x15\x14\x06\x06# '5\x16\x163\ +2654&##5\x01\xb6\xad\x91jzM\xc3\ +PZw\xe0\x8a\xd1\xfc\xdf\x89u\x84\xfa\xa9\xfe\xe8\x96\ +V\xcd`\x95\x94\x9c\xa2v\x02\xb08=66&!\ +\xd5-'\xa0\x89\xbd9\x0a\x22}ef\x9eVE\xfc\ +(.C>DA\xd3\x00\x01\x00\xa0\x00\x00\x05#\x04\ +^\x00\x0d\x00,@\x14\x0b\x04\x01\x08\x08\x06\x06\x0f\x01\ +\x0c\x0e\x03\x0a\x0c\x04\x0d\x0f\x07\x0c\x15\x00?3?3\ +\x1299\x11\x0132\x113\x113\x11\x12991\ +0\x01\x11\x14\x03\x01!\x11!\x1147\x01!\x11\x01\ +\xc7\x17\x02\x04\x01o\xfe\xd9\x14\xfd\xfe\xfe\x92\x04^\xfe\ +FF\xfe\xf0\x03\x10\xfb\xa2\x01\xbew\xd9\xfc\xf2\x04^\ +\x00\xff\xff\x00\xa0\x00\x00\x05#\x06?\x02&\x01\xd2\x00\ +\x00\x01\x07\x026\x00\x96\x00\x00\x00\x08\xb3\x01\x11\x11&\ +\x00+5\x00\x01\x00\xa0\x00\x00\x04\xf4\x04^\x00\x0a\x00\ +6@\x19\x04\x03\x03\x0c\x00\x01\x01\x0c\x0a\x02\x06\x06\x07\ +\x0b\x0a\x05\x02\x02\x07\x00\x08\x0f\x04\x07\x15\x00?3?\ +3\x129\x1133\x11\x0132\x1133\x113\x11\ +3\x113\x11310\x01!\x01\x01!\x01\x11!\x11\ +!\x11\x03}\x01P\xfeE\x01\xe2\xfe\xa6\xfe7\xfe\xcf\ +\x011\x04^\xfd\xe8\xfd\xba\x027\xfd\xc9\x04^\xfd\xe1\ +\x00\x00\x01\x00\x00\xff\xec\x04\x89\x04^\x00\x11\x005@\ +\x1b\x03\x10\x10\x0a\x01\x01\x00\x00\x13\x0a\x12\x10\x03FY\ +\x10\x0f\x0a\x0c\x07\x0cHY\x07\x16\x01\x15\x00??+\ +\x11\x003\x18?+\x11\x013\x113\x113\x11\x129\ +\x11310!!\x11!\x02\x02\x06#\x22'5\x16\ +326\x12\x13!\x04\x89\xfe\xcf\xfe\xe7 \x5c\x99|\ +jD119M=\x16\x03N\x03y\xfe\x89\xfe\x8f\ +\xa5 \xf4\x14\xa4\x01\x7f\x01O\x00\x01\x00\xa0\x00\x00\x06\ +!\x04^\x00\x18\x00:@\x1c\x07\x06\x13\x17\x13\x0f\x03\ +\x0c\x01\x01\x00\x00\x1a\x0c\x0d\x19\x02\x0b\x13\x0b\x0d\x17\x0e\ +\x0f\x07\x01\x0d\x15\x00?33?3\x1299\x113\ +\x11\x0132\x113\x113\x11\x12\x179\x11331\ +0!!\x11\x07\x06\x07\x03#\x03&''\x11!\x11\ +!\x13\x16\x16\x17>\x02\x13!\x06!\xfe\xe3\x106+\ +\xc6\xd9\xc9+1\x13\xfe\xe4\x01\xa4\xc0\x1e3\x09!%\ +,\xb1\x01\xa0\x03q>\xd3l\xfe\x0c\x01\xf8n\xc7D\ +\xfc\x8f\x04^\xfe#M\xc8G\x96\x83n\x01\xb2\x00\x00\ +\x01\x00\xa0\x00\x00\x04\xac\x04^\x00\x0b\x003@\x19\x02\ +\x06\x06\x05\x05\x0d\x01\x09\x09\x0a\x0a\x0c\x01\x08FY\x01\ +\x01\x0a\x03\x0b\x0f\x06\x0a\x15\x00?3?3\x129/\ ++\x11\x013\x113\x113\x113\x113\x11310\ +\x01\x11!\x11!\x11!\x11!\x11!\x11\x01\xd1\x01\xaa\ +\x011\xfe\xcf\xfeV\xfe\xcf\x04^\xfeR\x01\xae\xfb\xa2\ +\x01\xcd\xfe3\x04^\x00\xff\xff\x00\x5c\xff\xec\x04\x98\x04\ +s\x02\x06\x00R\x00\x00\x00\x01\x00\xa0\x00\x00\x04\x98\x04\ +^\x00\x07\x00#@\x11\x02\x01\x01\x09\x05\x06\x06\x08\x07\ +\x04FY\x07\x0f\x02\x06\x15\x00?3?+\x11\x013\ +\x113\x113\x11310\x01\x11!\x11!\x11!\x11\ +\x04\x98\xfe\xce\xfek\xfe\xcf\x04^\xfb\xa2\x03y\xfc\x87\ +\x04^\x00\xff\xff\x00\xa0\xfe\x14\x04\xb4\x04s\x02\x06\x00\ +S\x00\x00\xff\xff\x00\x5c\xff\xec\x03\xdd\x04s\x02\x06\x00\ +F\x00\x00\x00\x01\x00/\x00\x00\x04=\x04^\x00\x07\x00\ +(@\x13\x03\x04\x04\x06\x00\x00\x09\x06\x08\x02\x06\x07\x06\ +FY\x07\x0f\x04\x15\x00??+\x11\x003\x11\x013\ +\x113\x11\x129\x11310\x01\x15!\x11!\x11!\ +5\x04=\xfe\x92\xfe\xcf\xfe\x91\x04^\xe5\xfc\x87\x03y\ +\xe5\xff\xff\x00\x00\xfe\x14\x04\x8d\x04^\x02\x06\x00\x5c\x00\ +\x00\x00\x03\x00\x5c\xfe\x14\x06'\x06\x14\x00\x11\x00\x18\x00\ +\x1f\x00P@(\x1d\x00\x07\x07\x15\x0f\x08\x08\x19\x0c\x19\ +\x03\x03!\x12\x0c\x0c \x10\x00\x1c\x16\x0f\x16FY\x00\ +\x0f\x0f\x1d\x15\x09\x15FY\x06\x09\x15\x08\x1b\x00??\ +3+\x11\x003\x18?3+\x11\x003\x18?\x11\x01\ +3\x113\x113\x113\x11\x129\x11333\x113\ +310\x01\x04\x00\x15\x14\x00\x05\x11!\x11$\x005\ +4\x00%\x11!\x01\x14\x16\x17\x11\x06\x06\x054&'\ +\x1166\x03\xd1\x01\x18\x01>\xfe\xc6\xfe\xe4\xfe\xe5\xfe\ +\xe5\xfe\xc1\x014\x01&\x01\x1b\xfd\xc5\x9a\x86\x81\x9f\x03\ +X\x96\x87\x85\x98\x04d\x17\xfe\xd4\xf2\xf7\xfe\xd7\x17\xfe\ +\x1c\x01\xe4\x1a\x01/\xee\xfd\x01%\x13\x01\xb0\xfc\x1b\x8d\ +\xb1\x12\x02\xa0\x11\xb8\x87\x84\xb5\x13\xfdd\x12\xb2\x00\xff\ +\xff\x00\x0a\x00\x00\x04\x96\x04^\x02\x06\x00[\x00\x00\x00\ +\x01\x00\xa0\xfeo\x05d\x04^\x00\x0b\x004@\x19\x09\ +\x00\x00\x05\x03\x02\x02\x0d\x08\x05\x05\x0c\x0a\x06\x0f\x00\x08\ +\x05\x08FY\x05\x15\x03#\x00??+\x11\x003\x18\ +?3\x11\x013\x113\x113\x113\x129\x1131\ +0%3\x11!\x11!\x11!\x11!\x11!\x04\xc1\xa3\ +\xfe\xee\xfcN\x011\x01\xbe\x012\xdf\xfd\x90\x01\x91\x04\ +^\xfc\x87\x03y\x00\x01\x00{\x00\x00\x04\xa0\x04^\x00\ +\x12\x00-@\x16\x06\x0a\x0a\x09\x09\x14\x01\x11\x11\x13\x0e\ +\x03FY\x0e\x0e\x0a\x07\x12\x0f\x0a\x15\x00??3\x12\ +9/+\x11\x013\x113\x113\x113\x11310\ +\x01\x11\x143267\x11!\x11!\x11\x06\x06#\x22\ +&5\x11\x01\xac\x87X\x97M\x011\xfe\xcfj\xb6U\ +\xb7\xc8\x04^\xfeg\x92( \x01\xe3\xfb\xa2\x01\xbc8\ +.\xbb\xad\x01\xa0\x00\x01\x00\xa0\x00\x00\x07!\x04^\x00\ +\x0b\x005@\x19\x08\x05\x05\x01\x09\x09\x00\x00\x0d\x04\x01\ +\x01\x0c\x0a\x06\x02\x0f\x08\x04\x01\x04FY\x01\x15\x00?\ ++\x11\x003\x18?33\x11\x013\x113\x113\x11\ +3\x11\x129\x11310!!\x11!\x11!\x11!\ +\x11!\x11!\x07!\xf9\x7f\x011\x01w\x011\x01w\ +\x011\x04^\xfc\x87\x03y\xfc\x87\x03y\x00\x00\x02\x00\ +\xa0\xfeo\x07\xc5\x04^\x00\x0f\x00\x10\x00>@\x1e\x0c\ +\x09\x09\x0d\x08\x05\x05\x11\x03\x02\x02\x0d\x00\x00\x10\x0e\x0a\ +\x06\x0f\x0c\x00\x08\x05\x08FY\x05\x15\x03#\x00??\ ++\x11\x0033\x18?33\x01/3\x1133\x11\ +3\x113\x113\x129\x11310%3\x11!\x11\ +!\x11!\x11!\x11!\x11!\x11!\x13\x07!\xa4\xfe\ +\xed\xf9\xee\x011\x01w\x011\x01w\x011\xa0\xdf\xfd\ +\x90\x01\x91\x04^\xfc\x87\x03y\xfc\x87\x03y\xfb\xa2\x00\ +\x02\x00\x00\x00\x00\x05f\x04^\x00\x0b\x00\x13\x00A@\ +!\x01\x11\x11\x08\x08\x0a\x0c\x0c\x05\x05\x15\x0a\x14\x01\x10\ +JY\x01\x01\x08\x0b\x0b\x0aFY\x0b\x0f\x08\x11JY\ +\x08\x15\x00?+\x00\x18?+\x11\x12\x009\x18/+\ +\x11\x013\x113\x113\x11\x129\x113\x11310\ +\x01\x113 \x16\x15\x10!!\x11!5\x014&#\ +#\x1132\x02\x96\xd7\x01\x02\xf7\xfe\x13\xfd\xeb\xfe\x9c\ +\x045gh\xd0\xd4\xcb\x04^\xfeP\xa4\xa6\xfe\x9c\x03\ +y\xe5\xfd\x02A:\xfe\xf8\x00\x00\x03\x00\xa0\x00\x00\x06\ +-\x04^\x00\x0a\x00\x12\x00\x16\x00C@!\x0b\x04\x04\ +\x08\x14\x14\x13\x13\x18\x00\x10\x10\x08\x08\x17\x14\x15\x00\x0f\ +JY\x00\x00\x08\x15\x09\x0f\x08\x10JY\x08\x15\x00?\ ++\x00\x18?3\x129/+\x00\x18?\x11\x013\x11\ +3\x113\x113\x113\x11\x129\x11310\x013\ + \x16\x15\x14\x06#!\x11!\x014&##\x113\ +2\x05!\x11!\x01\xd1\x93\x01\x00\xf6\xf6\xf5\xfe1\x01\ +1\x01Xhg\x89\x8d\xcb\x03\x04\xfe\xcf\x011\x02\xae\ +\xa4\xa6\xb1\xb3\x04^\xfd\x02A:\xfe\xf8\xd3\x04^\x00\ +\x02\x00\xa0\x00\x00\x04\xa2\x04^\x00\x09\x00\x11\x002@\ +\x19\x0a\x04\x04\x13\x00\x0f\x0f\x07\x07\x12\x00\x0eJY\x00\ +\x00\x07\x08\x0f\x07\x0fJY\x07\x15\x00?+\x00\x18?\ +\x129/+\x11\x013\x113\x113\x113\x1131\ +0\x013 \x16\x15\x10!!\x11!\x014&##\ +\x1132\x01\xd1\xd7\x01\x02\xf8\xfe\x12\xfd\xec\x011\x01\ +\xa0hg\xd1\xd5\xcb\x02\xae\xa4\xa6\xfe\x9c\x04^\xfd\x02\ +A:\xfe\xf8\x00\x00\x01\x00J\xff\xec\x03\xbc\x04s\x00\ +\x19\x00?@ \x09\x02\x0b\x08\x08\x17\x17\x1b\x11\x02\x02\ +\x1a\x0a\x09JY\x0a\x0a\x00\x14\x14\x0eFY\x14\x10\x00\ +\x05FY\x00\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x013\x113\x113\x113\x113\x129\ +10\x05\x22'5\x163267!5!&&\ +#\x22\x07'663 \x00\x11\x10\x00\x01\xa2\xd2\x86\ +\xae\x99nx\x0a\xfeZ\x01\xa6\x08kdw\x8dVK\ +\xbd^\x01\x06\x01\x00\xfe\xf1\x14E\xeeP\x80\x80\xcb{\ +|?\xd1#-\xfe\xe4\xfe\xe4\xfe\xdc\xfe\xd5\x00\x02\x00\ +\xa0\xff\xec\x06\xa8\x04s\x00\x12\x00\x1e\x00I@&\x13\ +\x0d\x06\x06\x08\x19\x00\x00 \x0c\x08\x08\x09\x09\x1f\x10\x1c\ +GY\x10\x10\x0c\x07FY\x0c\x0c\x09\x0a\x0f\x09\x15\x03\ +\x16GY\x03\x16\x00?+\x00\x18??\x129/+\ +\x00\x18?+\x11\x013\x113\x113\x113\x113\x12\ +9\x113310\x01\x10\x00#\x22$'#\x11!\ +\x11!\x1136$32\x00\x01\x14\x163265\ +4&#\x22\x06\x06\xa8\xfe\xea\xf6\xdd\xfe\xf7\x1c\xc9\xfe\ +\xcf\x011\xcd\x1d\x01\x11\xd6\xed\x01\x19\xfd%bqo\ +bcpob\x021\xfe\xed\xfe\xce\xf8\xe9\xfe3\x04\ +^\xfeR\xd6\xed\xfe\xc9\xfe\xf5\xa7\xa9\xa9\xa7\xa7\xa5\xa6\ +\x00\x00\x02\x00\x00\x00\x00\x04\x1f\x04^\x00\x0d\x00\x16\x00\ +M@&\x0d\x02\x02\x12\x12\x0e\x05\x05\x0b\x01\x0b\x0a\x0a\ +\x18\x00\x01\x01\x17\x02\x0d\x11\x11\x0dJY\x11\x11\x01\x08\ +\x08\x14JY\x08\x0f\x0b\x01\x15\x00?3?+\x11\x12\ +\x009\x18/+\x11\x12\x009\x11\x013\x113\x113\ +\x113\x11\x129\x1132\x129\x11310!!\ +\x01&&5463!\x11!\x11#\x03\x14\x163\ +3\x11#\x22\x06\x01J\xfe\xb6\x01-lo\xf3\xd2\x02\ +\x08\xfe\xcf\xa8\xc9nY\xaa\xd1KU\x01\xba-\xaas\ +\xa2\xb8\xfb\xa2\x01\xa0\x01bFO\x01\x1aI\xff\xff\x00\ +\x5c\xff\xec\x04b\x06\x04\x02&\x00H\x00\x00\x01\x06\x00\ +j\x02\x00\x00\x0a\xb4\x03\x021\x11&\x00+55\x00\ +\x01\x00\x04\xfe\x14\x04\xa8\x06\x14\x00&\x00j@6\x19\ +\x1a$\x02\x0f\x07\x07$$(\x12'\x1d\x10\x1a\x17\x0f\ +\x0f\x14\x10\x10'\x1d\x0b \x0bGY\x1a\x12\x13\x12\ +JY\x17\x13 \x13 \x13\x10\x15\x00\x10\x15\x03\x05\x00\ +\x05GY\x00\x1b\x00?+\x11\x003\x18??\x129\ +9//\x113+\x11\x003+\x11\x12\x009\x11\x01\ +3\x1133\x1133\x129\x119\x113\x113\x11\ +\x129\x11\x12910\x01\x22'5\x16325\x11\ +4&#\x22\x06\x15\x11!\x11#535!\x15!\ +\x15!\x15\x14\x073632\x16\x15\x11\x14\x06\x03=\ +kM;<{^V\x7fs\xfe\xcf\x9c\x9c\x011\x01\ +;\xfe\xc5\x0e\x12f\xde\xc5\xca\xbc\xfe\x14\x19\xf0\x13\xaa\ +\x02\xb2nn\xaf\xc2\xfe/\x04\xac\xc7\xa1\xa1\xc7\x12S\ +\xb6\xa4\xd2\xc7\xfc\xeb\xb3\xc0\x00\xff\xff\x00\xa0\x00\x00\x03\ +\xaa\x06!\x02&\x01\xcd\x00\x00\x01\x06\x00v\x1d\x00\x00\ +\x08\xb3\x01\x0e\x11&\x00+5\x00\x01\x00\x5c\xff\xec\x03\ +\xf0\x04s\x00\x19\x00A@!\x18\x10\x11\x09\x08\x08\x1b\ +\x0e\x11\x11\x03\x03\x1a\x0e\x11JY\x0e\x0e\x00\x06\x06\x0b\ +FY\x06\x10\x00\x14FY\x00\x16\x00?+\x00\x18?\ ++\x11\x12\x009\x18/+\x11\x013\x113\x113\x11\ +3\x113\x129910\x05 \x00\x11\x10\x00!2\ +\x17\x07&#\x22\x06\x07!\x15!\x16\x163267\ +\x15\x06\x02\x8d\xfe\xea\xfe\xe5\x01\x0e\x01!\xb8\xadX\xaa\ +kis\x0f\x01\xa5\xfe[\x0engO\x9ff\x8e\x14\ +\x01#\x01\x1a\x01*\x01 J\xd9Az}\xcb\x83}\ +$,\xeaI\x00\xff\xff\x00\x5c\xff\xec\x03\xac\x04s\x02\ +\x06\x00V\x00\x00\xff\xff\x00\x93\x00\x00\x01\xdf\x06\x14\x02\ +\x06\x00L\x00\x00\xff\xff\xff\xe5\x00\x00\x02\x93\x06\x04\x02\ +&\x00\xf3\x00\x00\x01\x07\x00j\xfe\xce\x00\x00\x00\x0a\xb4\ +\x02\x01\x19\x11&\x00+55\xff\xff\xff}\xfe\x14\x01\ +\xdf\x06\x14\x02\x06\x00M\x00\x00\x00\x02\x00\x00\xff\xec\x06\ +\xd3\x04^\x00\x17\x00\x1f\x00Q@*\x02\x0f\x11\x1d\x1d\ +\x00\x0f\x00\x09\x18\x18\x15\x15!\x09 \x11\x1cJY\x11\ +\x11\x00\x0f\x0f\x02FY\x0f\x0f\x06\x0bHY\x06\x16\x00\ +\x1dJY\x00\x15\x00?+\x00\x18?+\x00\x18?+\ +\x11\x12\x009\x18/+\x11\x013\x113\x113\x11\x12\ +99\x113\x113\x11310!\x11#\x02\x02\x06\ +#\x22'5\x16326\x12\x13!\x1132\x16\x15\ +\x10!\x134&##\x1132\x03-\xee \x5c\x99\ +|jD119M=\x16\x03#\x8e\xf8\xef\xfe\x1f\ +\xb0ba\x81\x85\xbf\x03y\xfe\x89\xfe\x8f\xa5 \xf4\x14\ +\xa4\x01\x7f\x01O\xfeP\xa4\xa6\xfe\x9c\x01`A:\xfe\ +\xf8\x00\x02\x00\xa0\x00\x00\x06\xd3\x04^\x00\x11\x00\x19\x00\ +Q@)\x00\x17\x17\x0f\x07\x07\x0b\x12\x12\x04\x04\x1b\x0e\ +\x0a\x0a\x0b\x0b\x1a\x0e\x09FY\x0e\x00\x00\x16JY\x00\ +\x00\x07\x10\x0c\x0f\x07\x17JY\x0b\x07\x15\x00?3+\ +\x00\x18?3\x129/+\x00\x18\x10\xc5+\x11\x013\ +\x113\x113\x113\x113\x11\x129\x1133\x113\ +10\x0132\x16\x15\x10!!\x11!\x11!\x11!\ +\x11!\x11!\x014&##\x1132\x04^\x8e\xf8\ +\xef\xfe\x1f\xfe;\xfe\xa4\xfe\xcf\x011\x01\x5c\x011\x01\ +Dba\x81\x85\xbf\x02\xae\xa4\xa6\xfe\x9c\x01\xcd\xfe3\ +\x04^\xfeR\x01\xae\xfd\x02A:\xfe\xf8\x00\x00\x01\x00\ +\x04\x00\x00\x04\xa8\x06\x14\x00\x1c\x00V@+\x12\x13\x01\ +\x00\x00\x1e\x0b\x1d\x16\x09\x13\x10\x08\x08\x0d\x09\x09\x1d\x16\ +\x04\x19\x19\x04GY\x13\x0b\x0c\x0bJY\x10\x0c\x19\x0c\ +\x19\x0c\x09\x0e\x00\x01\x09\x15\x00?3?\x1299/\ +/\x113+\x11\x003+\x11\x12\x009\x11\x013\x11\ +33\x1133\x129\x119\x113\x113\x1291\ +0!!\x114#\x22\x06\x15\x11!\x11#535\ +!\x15!\x15!\x15\x14\x073632\x16\x15\x04\xa8\ +\xfe\xcf\xb4\x7fs\xfe\xcf\x9c\x9c\x011\x01;\xfe\xc5\x0e\ +\x12f\xde\xc5\xca\x02P\xf2\xaf\xc2\xfe/\x04\xac\xc7\xa1\ +\xa1\xc7\x12S\xb6\xa4\xd2\xc7\x00\xff\xff\x00\xa0\x00\x00\x04\ +\xf4\x06!\x02&\x01\xd4\x00\x00\x01\x07\x00v\x00\xae\x00\ +\x00\x00\x08\xb3\x01\x13\x11&\x00+5\xff\xff\x00\x00\xfe\ +\x14\x04\x8d\x06?\x02&\x00\x5c\x00\x00\x01\x06\x026\xfb\ +\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\x00\x01\x00\xa0\xfe\ +o\x04\xc1\x04^\x00\x0b\x006@\x1a\x09\x0a\x0a\x00\x04\ +\x04\x07\x07\x0d\x03\x00\x00\x0c\x0a#\x05\x01\x0f\x08\x00\x00\ +\x03FY\x00\x15\x00?+\x11\x003\x18?3?\x11\ +\x013\x113\x113\x113\x11\x129\x113103\ +\x11!\x11!\x11!\x11!\x11!\x11\xa0\x011\x01\xbe\ +\x012\xfex\xfe\xee\x04^\xfc\x87\x03y\xfb\xa2\xfeo\ +\x01\x91\x00\x00\x01\x00\xb8\x00\x00\x04}\x06\xec\x00\x07\x00\ +#@\x11\x03\x06\x06\x09\x00\x01\x01\x08\x02\x07LY\x04\ +\x02\x03\x01\x12\x00??\xc6+\x11\x013\x113\x113\ +\x11310!!\x11!\x11!\x11!\x01\xee\xfe\xca\ +\x02\xb9\x01\x0c\xfdq\x05\xb6\x016\xfd\xca\x00\x00\x01\x00\ +\xa0\x00\x00\x03\xcf\x05\x8f\x00\x07\x00#@\x11\x03\x06\x06\ +\x09\x00\x01\x01\x08\x02\x07FY\x04\x02\x0f\x01\x15\x00?\ +?\xc6+\x11\x013\x113\x113\x11310!!\ +\x11!\x11!\x11!\x01\xd1\xfe\xcf\x02\x1c\x01\x13\xfe\x02\ +\x04^\x011\xfd\xea\x00\xff\xff\x00\x00\x00\x00\x07\xbc\x07\ +s\x02&\x00:\x00\x00\x01\x07\x00C\x00\xfc\x01R\x00\ +\x08\xb3\x01&\x05&\x00+5\xff\xff\x00\x14\x00\x00\x06\ +\xc5\x06!\x02&\x00Z\x00\x00\x01\x07\x00C\x00\x87\x00\ +\x00\x00\x08\xb3\x01&\x11&\x00+5\xff\xff\x00\x00\x00\ +\x00\x07\xbc\x07s\x02&\x00:\x00\x00\x01\x07\x00v\x01\ +\xba\x01R\x00\x08\xb3\x01&\x05&\x00+5\xff\xff\x00\ +\x14\x00\x00\x06\xc5\x06!\x02&\x00Z\x00\x00\x01\x07\x00\ +v\x01d\x00\x00\x00\x08\xb3\x01&\x11&\x00+5\xff\ +\xff\x00\x00\x00\x00\x07\xbc\x07V\x02&\x00:\x00\x00\x01\ +\x07\x00j\x01o\x01R\x00\x0a\xb4\x02\x013\x05&\x00\ ++55\xff\xff\x00\x14\x00\x00\x06\xc5\x06\x04\x02&\x00\ +Z\x00\x00\x01\x07\x00j\x00\xfe\x00\x00\x00\x0a\xb4\x02\x01\ +3\x11&\x00+55\xff\xff\x00\x00\x00\x00\x04\xfe\x07\ +s\x02&\x00<\x00\x00\x01\x07\x00C\xff|\x01R\x00\ +\x08\xb3\x01\x11\x05&\x00+5\xff\xff\x00\x00\xfe\x14\x04\ +\x8d\x06!\x02&\x00\x5c\x00\x00\x01\x07\x00C\xffY\x00\ +\x00\x00\x08\xb3\x01\x1f\x11&\x00+5\x00\x01\x00R\x01\ +\xb4\x03\xae\x02\x9a\x00\x03\x00\x11\xb5\x02\x05\x00\x04\x00\x01\ +\x00/3\x11\x013\x11310\x135!\x15R\x03\ +\x5c\x01\xb4\xe6\xe6\x00\x01\x00R\x01\xb4\x07\xae\x02\x9a\x00\ +\x03\x00\x11\xb5\x02\x05\x00\x04\x00\x01\x00/3\x11\x013\ +\x11310\x135!\x15R\x07\x5c\x01\xb4\xe6\xe6\x00\ +\x01\x00R\x01\xb4\x07\xae\x02\x9a\x00\x03\x00\x11\xb5\x02\x05\ +\x00\x04\x00\x01\x00/3\x11\x013\x11310\x135\ +!\x15R\x07\x5c\x01\xb4\xe6\xe6\x00\x02\xff\xfc\xfe1\x03\ +N\xff\xd3\x00\x03\x00\x07\x00 @\x0d\x04\x00\x00\x09\x05\ +\x01\x01\x06\x05\x05\x08\x02\x01\x00/3\x129/3\x01\ +2\x113\x113\x11310\x01!5!5!5\ +!\x03N\xfc\xae\x03R\xfc\xae\x03R\xfe1\x8b\x8c\x8b\ +\x00\x00\x01\x00\x19\x03\xc1\x01\xa4\x05\xb6\x00\x07\x00\x19@\ +\x0a\x04\x05\x07\x01\x07\x07\x09\x00\x04\x03\x00?\xcd\x11\x01\ +3\x113\x10\xc2210\x13'6\x1273\x02\x07\ +'\x0e\x16e5\xdbB#\x03\xc1\x16[\x01\x13q\xfe\ +\xf5\xea\x00\x00\x01\x00\x19\x03\xc1\x01\xa4\x05\xb6\x00\x06\x00\ +\x17@\x09\x03\x04\x01\x06\x06\x07\x04\x06\x03\x00?\xc6\x11\ +\x013\x113\xc2210\x01\x17\x06\x03#\x127\x01\ +\x96\x0e2~\xdbE\x1f\x05\xb6\x16\xc5\xfe\xe6\x01(\xcd\ +\x00\x00\x01\x00?\xfe\xf8\x01\xcb\x00\xee\x00\x06\x00\x18@\ +\x09\x02\x03\x05\x00\x05\x05\x07\x03\x06\x00/\xcd\x11\x013\ +\x113\x10\xc2210%\x06\x03#\x127!\x01\xcb\ +4|\xdcA$\x01\x18\xd7\xca\xfe\xeb\x01\x0a\xec\x00\x00\ +\x01\x00\x19\x03\xc1\x01\xa4\x05\xb6\x00\x07\x00\x19@\x0a\x03\ +\x02\x00\x06\x00\x00\x09\x03\x07\x03\x00?\xcd\x11\x013\x11\ +3\x10\xc2210\x01\x16\x13#&\x02'7\x01?\ +%@\xdb;a\x14\x0e\x05\xb6\xf5\xff\x00\x7f\x01\x0bU\ +\x16\x00\x02\x00\x19\x03\xc1\x03w\x05\xb6\x00\x07\x00\x0f\x00\ +%@\x10\x0b\x0c\x08\x0e\x03\x04\x06\x00\x06\x06\x11\x07\x0f\ +\x03\x0b\x03\x00?3\xcd2\x11\x013\x113\x10\xc22\ +\xd42\xc2210\x016\x1273\x02\x07!%6\ +\x1273\x02\x07!\x01\xec\x16e5\xdbB#\xfe\xe8\ +\xfe\x1f\x16e5\xdbB#\xfe\xe8\x03\xd7[\x01\x13q\ +\xfe\xf5\xea\x16[\x01\x13q\xfe\xf5\xea\x00\x02\x00\x19\x03\ +\xc1\x03w\x05\xb6\x00\x06\x00\x0d\x00#@\x0f\x09\x0a\x07\ +\x0c\x02\x03\x00\x05\x05\x0e\x0a\x03\x0c\x05\x03\x00?3\xc6\ +2\x11\x013\x113\xc22\xd42\xc2210\x01\x06\ +\x03#\x127!\x05\x06\x03#\x127!\x01\xa42~\ +\xdbE\x1f\x01\x19\x01\xe12~\xdbE\x1f\x01\x18\x05\xa0\ +\xc5\xfe\xe6\x01(\xcd\x16\xc5\xfe\xe6\x01(\xcd\x00\x02\x00\ +?\xfe\xf8\x03\x9e\x00\xee\x00\x06\x00\x0d\x00\x22@\x0e\x09\ +\x0a\x07\x0c\x02\x03\x00\x05\x05\x0e\x0a\x03\x0c\x05\x00/3\ +\xc62\x11\x013\x113\xc22\xd42\xc2210%\ +\x06\x03#\x127!\x05\x06\x03#\x127!\x01\xcb4\ +|\xdcA$\x01\x18\x01\xe24|\xdcA$\x01\x18\xd7\ +\xca\xfe\xeb\x01\x0a\xec\x17\xca\xfe\xeb\x01\x0a\xec\x00\x01\x00\ +{\x00\x00\x03\xa6\x06\x14\x00\x0b\x00N@%\x07\x04\x0a\ +\x01\x04\x01\x03\x09\x02\x02\x08\x03\x03\x05\x00\x00\x0d\x05\x0c\ +\x0a\x07\x01\x04\x07\x04\x06\x00\x05\x05\x0b\x06\x06\x03\x08\x00\ +\x03\x12\x00??\x129/33\x113\x1299\x11\ +3\x113\x11\x013\x113\x11\x129\x1133\x113\ +\x1299\x113\x11310\x01%\x13!\x13\x055\ +\x05\x03!\x03%\x03\xa6\xfe\xb47\xfe\xea7\xfe\xc9\x01\ +77\x01\x167\x01L\x03\xa0\x1e\xfcB\x03\xbe\x1e\xf1\ +\x1e\x01\xa1\xfe_\x1e\x00\x00\x01\x00{\x00\x00\x03\xba\x06\ +\x14\x00\x15\x00}@>\x0e\x0b\x09\x06\x14\x11\x00\x03\x15\ +\x03\x06\x0a\x04\x05\x10\x04\x04\x0f\x05\x05\x07\x13\x02\x02\x17\ +\x0c\x07\x07\x16\x00\x09\x03\x06\x09\x06\x08\x02\x07\x07\x01\x08\ +\x11\x0e\x14\x0b\x0e\x0b\x0d\x13\x0c\x0c\x12\x0d\x08\x0d\x08\x0d\ +\x05\x0f\x00\x05\x12\x00??\x1299//\x1133\ +\x113\x1299\x113\x113\x1133\x113\x129\ +9\x113\x113\x11\x013\x113\x113\x113\x129\ +\x1133\x113\x12\x179\x11333\x11333\ +10\x01%\x15%\x13!\x13\x055\x05'7\x055\ +\x05\x03!\x03%\x15%\x17\x02o\x01K\xfe\xb57\xfe\ +\xe98\xfe\xb4\x01L//\xfe\xb4\x01L8\x01\x177\ +\x01K\xfe\xb5/\x02-\x1f\xf2\x1f\xfe\x87\x01y\x1f\xf2\ +\x1f\xe5\xd5\x1e\xf1\x1e\x01x\xfe\x88\x1e\xf1\x1e\xd5\x00\x00\ +\x01\x00b\x01\xae\x02\xa0\x04)\x00\x0b\x00\x13\xb6\x06\x00\ +\x00\x0c\x0d\x09\x03\x00/\xcd\x11\x12\x019\x11310\ +\x134632\x16\x15\x14\x06#\x22&b\x94\x8b\x89\ +\x96\x97\x88\x8a\x95\x02\xec\x9a\xa3\xa4\x99\x98\xa6\xa6\x00\x00\ +\x03\x00u\xff\xe5\x06b\x019\x00\x0b\x00\x17\x00#\x00\ +,@\x14\x1e\x18\x12\x0c\x00\x06\x00\x00$\x1b\x0f\x03\x09\ +\x03TY!\x15\x09\x13\x00?33+\x11\x0033\ +\x11\x013\x113\x18\x10\xd42\xc4210746\ +32\x16\x15\x14\x06#\x22&%4632\x16\x15\ +\x14\x06#\x22&%4632\x16\x15\x14\x06#\x22\ +&uZVS[\x5cRT\x5c\x02GZWS[\ +\x5cRU\x5c\x02HZVS[\x5cRT\x5c\x8fT\ +VXRO[YQTVXRO[YQT\ +VXRO[Y\x00\x00\x08\x00?\xff\xee\x0a\x00\x05\ +\xcb\x00\x09\x00\x14\x00\x18\x00\x22\x00-\x007\x00B\x00\ +C\x00d@1.>8388E\x16\x17\x17\x05\ +\x05\x0a\x10\x00\x10\x10D\x18\x15\x15\x19\x19)#\x1e#\ +#C5 @+1\x1c\x1c;&\x19\x18\x06\x17\ +\x18\x03\x0d\x07\x12\x07\x00?3\xc42???33\ +\x113\xc422\x113\x01/3\x113\x10\xc02\x12\ +9\x113\x113\x113\x10\xc02\x129\x113\x113\ +\x113\x10\xc0210\x01\x14\x163254#\x22\ +\x06\x05\x14\x06#\x22&5\x10!2\x16%\x01#\x01\ +\x13\x14\x163254#\x22\x06\x05\x14\x06#\x22&\ +5\x10!2\x16\x05\x14\x163254#\x22\x06\x05\ +\x14\x06#\x22&5\x10!2\x16\x01\x01;-2`\ +`2-\x01\xbb\xb2\xac\xa5\xb4\x01Y\xa9\xb5\x02\xb0\xfc\ +\xd5\xf0\x03+\x85-2``2-\x01\xbb\xb2\xac\xa5\ +\xb4\x01Y\xa9\xb5\x01P,2``2,\x01\xba\xb0\ +\xae\xa4\xb4\x01X\xa9\xb5\xfd5\x04\x00\x7f}\xfc\xfa{\ +}\xe6\xe7\xed\xe0\x01\xc9\xed\xd8\xfaJ\x05\xb6\xfc\x02\x7f\ +}\xfc\xfa{}\xe5\xe7\xed\xdf\x01\xc9\xed\xde\x7f}\xfc\ +\xfa{}\xe4\xe8\xed\xdf\x01\xc9\xed\xfdj\x00\xff\xff\x00\ +\x85\x03\xa6\x01\x9c\x05\xb6\x02\x06\x00\x0a\x00\x00\xff\xff\x00\ +\x85\x03\xa6\x03B\x05\xb6\x02\x06\x00\x05\x00\x00\x00\x01\x00\ +R\x00^\x02\xa0\x04\x04\x00\x06\x000@\x15\x03\x06\x02\ +\x04\x04\x01\x05\x05\x08\x06\x00\x03\x03\x02\x04\x04\x05\x05\x07\ +\x02\x01\x00/3\x129/3\x11\x129\x1133\x11\ +\x013\x1133\x113\xc1210\x13\x01\x17\x01\x01\ +\x07\x01R\x01s\xdb\xfe\xe9\x01\x17\xdb\xfe\x8d\x02=\x01\ +\xc7w\xfe\xa4\xfe\xa4w\x01\xc5\x00\x01\x00R\x00^\x02\ +\xa0\x04\x04\x00\x06\x000@\x15\x04\x02\x02\x03\x00\x05\x01\ +\x01\x07\x06\x00\x03\x03\x04\x02\x02\x01\x01\x07\x04\x05\x00/\ +3\x129/3\x11\x129\x1133\x11\x013\x113\ +\xc123\x11310\x01\x01'\x01\x017\x01\x02\xa0\ +\xfe\x8d\xdb\x01\x16\xfe\xea\xdb\x01s\x02#\xfe;w\x01\ +\x5c\x01\x5cw\xfe9\x00\xff\xff\x00u\xff\xe5\x04\x1b\x05\ +\xb6\x00'\x00\x04\x02H\x00\x00\x00\x06\x00\x04\x00\x00\x00\ +\x01\xfew\x00\x00\x02\x91\x05\xb6\x00\x03\x00\x1a@\x0b\x03\ +\x00\x02\x01\x02\x02\x04\x03\x03\x02\x12\x00??\x11\x013\ +\x113\x10\xc1210\x01\x01#\x01\x02\x91\xfc\xd5\xef\ +\x03+\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\x00f\x02\xfc\x03\ +\x0a\x05\xc7\x00\x12\x00*@\x13\x0c\x08\x08\x09\x00\x12\x09\ +\x12\x13\x14\x00\x09\x0c\x04\x04\x0f\x1f\x0a\x1e\x00??3\ +\x129\xc42\x11\x12\x0199\x113\x113\x1291\ +0\x01\x114&#\x22\x06\x15\x11#\x113\x1736\ +3 \x15\x11\x02D<9ZH\xc7\xa2\x1b\x0eI\x8e\ +\x01\x02\x02\xfc\x01\x91L@`q\xfe\xb4\x02\xbaTe\ +\xfa\xfe/\x00\x01\x00#\x00\x00\x04'\x05\xb6\x00\x11\x00\ +V@+\x02\x04\x10\x10\x0b\x0b\x13\x0e\x00\x04\x04\x09\x07\ +\x05\x05\x12\x03\x07\x08\x07RY\x00\x08\x08\x11\x05\x0e\x11\ +NY\x0e\x0e\x05\x0a\x0a\x0dNY\x0a\x06\x05\x18\x00?\ +?+\x11\x12\x009\x18/+\x11\x12\x009\x18/3\ ++\x11\x003\x11\x013\x11333\x1133\x113\ +\x113\x11\x12910\x01!\x15!\x11!\x11#5\ +3\x11!\x15!\x11!\x15!\x01\xe9\x01<\xfe\xc4\xfe\ +\xcf\x95\x95\x03o\xfd\xc2\x02\x19\xfd\xe7\x01\xb8\xb2\xfe\xfa\ +\x01\x06\xb2\x03\xfe\xfe\xfe\xb0\xfe\x00\x01\x00R\x00\x00\x04\ +j\x05\xcb\x00%\x00y@=\x14\x11\x17\x0c\x10\x10\x02\ +\x0e\x0a\x11\x11\x22\x1e\x1b\x03\x02\x1b\x02\x15 \x1c\x1c\x17\ +\x17\x15&'\x0d ! RY\x0a!\x1d\x11\x1c\x1d\ +\x1cRY\x0e\x1d\x1d\x00\x18\x17\x14\x17\x14NY\x17\x18\ +\x00\x06OY\x00\x07\x00?+\x00\x18?+\x11\x12\x00\ +9\x119\x18/3+\x11\x003\x18\x10\xc62+\x11\ +\x003\x11\x12\x0199\x113\x113\x1299\x113\ +\x11333\x1133\x129\x113\x11\x12910\ +\x012\x17\x07&&#\x22\x06\x15\x15!\x15!\x15!\ +\x15!\x06\x06\x07!\x11!5667#535\ +#53546\x02\xc1\xbe\xc3]N\x83EPL\ +\x01g\xfe\x99\x01g\xfe\x97\x05FJ\x02\xce\xfb\xe8d\ +K\x05\xb2\xb2\xb2\xb2\xe4\x05\xcbR\xe6\x1d#VVq\ +\xb0s\xb2Jl'\xfe\xfc\xf8*jU\xb2s\xb0s\ +\xce\xd4\x00\x00\x03\x00\xb8\xff\xec\x06\xe9\x05\xb6\x00\x08\x00\ +\x13\x00)\x00q@< \x1c#''\x1e\x1c%\x1c\ +\x16\x09\x16+\x04\x09\x09\x0f+\x00\x0e\x0e\x0f\x0f*\x19\ +\x14QY\x19\x19\x0d\x00NY\x1d&#&QY#\ +!PY #\x0d#\x0d#\x0f\x10\x10\x08NY\x10\ +\x06\x0f\x18\x00??+\x11\x12\x0099\x18//\x11\ +3++\x11\x003+\x00\x18?+\x11\x013\x113\ +\x113\x11\x129\x113\x113\x11\x1299\x1133\ +\x113\x12910\x0132654&##\x05\ +\x14\x04!#\x11!\x11! \x04\x0127\x15\x06#\ +\x22&5\x11#5773\x15!\x15!\x11\x14\x16\ +\x01\xd9B\x8b\x8d~\x88T\x02\x7f\xfe\xcf\xfe\xe75\xfe\ +\xdf\x01u\x01\x10\x01\x1b\x01\xf0NSa\x8a\xa3\x96\x92\ +\xa8X\x9a\x01\x10\xfe\xf0H\x03\x06humh\xca\xec\ +\xfa\xfd\xf8\x05\xb6\xe5\xfb\xfa#\xcf3\xa6\xad\x01>l\ +g\xeb\xed\xd1\xfe\xcdGD==DG>\xfdZ\xa7\xbe\xb6\ +\xadud7f@II\x8ctZO\x05\xb6\xfaJ\ +\x05\xb6\xfb\xa2\xac\xc0\xc4\xa8\xaa\xc1\xc7\xa4deed\ +dcc\x018\xb8\xaa\xb2\xb92\x9b)f_\xbe+\ +\xa4-\x00\x00\x02\x00)\xff\xee\x03\xdf\x05\xc9\x00\x1b\x00\ +$\x00F@ \x1c\x16\x16\x04\x22\x19\x19\x0f\x0c\x0b\x03\ +\x04\x0b\x04%&\x19\x22\x0f\x22\x0d\x1e\x1e\x13\x0d\x04\x0c\ +\x0c\x07\x13\x00\x07\x00/3/\x129/93\x113\ +\x11\x1299\x113\x11\x12\x0199\x113\x1133\ +3\x113\x129\x11310%2673\x06\x06\ +#\x22&55\x07567\x114632\x16\x15\ +\x14\x02\x07\x15\x14\x134#\x22\x06\x15\x1166\x02\x81\ +\x00+\x115\x00\x01\x00X\x00\x8f\x04\ +9\x05\x19\x00\x13\x00Z@-\x0d\x10\x11\x00\x04\x01\x0c\ +\x01\x0a\x07\x06\x03\x04\x02\x0b\x0b\x0c\x02\x0c\x04\x0e\x0e\x13\ +\x13\x15\x08\x04\x04\x14\x0c\x0b\x0b\x10\x07\x07\x0d\x0a\x02\x01\ +\x01\x00\x03\x03\x11\x06\x00/33\x1133\x113\xc4\ +22\x1132\x113\x11\x013\x113\x113\x113\ +\x11\x1299\x113\x11\x12\x1792\x11\x12\x1791\ +0\x01\x03'7#5!7!5!\x13\x17\x073\ +\x15!\x07!\x15\x021\x7f\xc9Y\xea\x01PP\xfe`\ +\x02\x04\x83\xc9\x5c\xed\xfe\xaeO\x01\xa1\x01\xa2\xfe\xedT\ +\xbf\xdb\xaa\xd9\x01\x19V\xc3\xd9\xaa\xdb\x00\x02\x00V\x00\ +\x00\x049\x05=\x00\x03\x00\x0a\x00:@\x1a\x08\x04\x04\ +\x03\x03\x0c\x09\x05\x05\x00\x00\x0b\x06\x05\x09\x09\x08\x0a\x08\ +\x07\x0a\x04\x04\x07\x01\x00\x00/2/9/3\x113\ +\x11\x129\x1133\x11\x013\x113\x113\x113\x11\ +3\x1131035!\x15\x13\x015\x01\x15\x01\x01\ +V\x03\xe1\x02\xfc\x1f\x03\xe1\xfdT\x02\xac\xdb\xdb\x01\x08\ +\x01\xb6\x90\x01\xef\xef\xfe\xc2\xfe\xe8\x00\x00\x02\x00X\x00\ +\x00\x049\x05=\x00\x03\x00\x0a\x006@\x18\x05\x09\x09\ +\x03\x03\x0c\x0a\x06\x00\x00\x0b\x09\x08\x05\x05\x04\x06\x04\x0a\ +\x0a\x06\x07\x01\x00\x00/2/39/3\x11\x129\ +\x1133\x11\x013\x1133\x113\x113\x1131\ +035!\x15\x09\x025\x01\x15\x01X\x03\xe1\xfc\x1f\ +\x02\xac\xfdT\x03\xe1\xfc\x1f\xdb\xdb\x01\xf8\x01\x18\x01>\ +\xef\xfe\x11\x90\xfeJ\x00\x00\x02\x00X\x00\x00\x04P\x05\ +\xc1\x00\x05\x00\x09\x00B@ \x05\x04\x07\x07\x02\x01\x09\ +\x09\x08\x06\x08\x03\x06\x00\x03\x00\x0a\x0b\x00\x06\x06\x03\x08\ +\x07\x08\x09\x03\x02\x05\x07\x02\x18\x00??\x12\x179\x11\ +33\x113\x11\x12\x0199\x113\x113\x11\x129\ +\x11333\x113310\x01\x01#\x01\x013\x13\ +\x03\x03\x13\x04P\xfe=r\xfe=\x01\xc3r\xbb\xf4\xf4\ +\xf4\x02\xdf\xfd!\x02\xdf\x02\xe2\xfd\x1e\x01\x9a\xfef\xfe\ +g\xff\xff\x00)\x00\x00\x04\xf8\x06\x1f\x00&\x00I\x00\ +\x00\x00\x07\x00L\x03\x19\x00\x00\xff\xff\x00)\x00\x00\x04\ +\xea\x06\x1f\x00&\x00I\x00\x00\x00\x07\x00O\x03\x19\x00\ +\x00\x00\x01\x00h\x04\xd9\x043\x06?\x00\x0d\x00\x1e@\ +\x0c\x00\x0d\x07\x06\x07\x07\x0e\x0f\x07\x00\x0a\x03\x00/3\ +\xcd2\x11\x12\x019\x113\x10\xca210\x01\x06\x06\ +#\x22&'!\x16\x163267\x043\x13\xf4\xe6\ +\xed\xe3\x0e\x01\x11\x07Ysec\x0b\x06?\xbb\xab\xa4\ +\xc2gS[_\x00\x01\xff}\xfe\x14\x01\xd1\x04^\x00\ +\x0d\x00!@\x0f\x0b\x02\x08\x08\x0e\x09\x0f\x03\x05\x00\x05\ +GY\x00\x1b\x00?+\x11\x003\x18?\x11\x013\x11\ +3310\x13\x22'5\x163265\x11!\x11\ +\x14\x06FuTFIMG\x011\xce\xfe\x14\x19\xf0\ +\x13VT\x04\xaa\xfb)\xb2\xc1\x00\x01\x01^\x04\xcd\x02\ +\xb6\x06\x14\x00\x08\x00\x1b@\x0b\x03\x04\x00\x07\x00\x00\x09\ +\x0a\x07\x03\x00\x00?\xc9\x11\x12\x019\x113\x10\xc92\ +10\x01667!\x15\x06\x07#\x01^\x0f'\x08\ +\x01\x1aPV\xb2\x04\xe71\xbc@\x14\xb0\x83\x00\x01\x01\ +^\xfe;\x02\xb6\xff\x83\x00\x08\x00\x1a@\x0a\x03\x04\x00\ +\x07\x00\x00\x09\x0a\x08\x04\x00/\xcd\x11\x12\x019\x113\ +\x10\xc9210\x01667!\x15\x06\x07#\x01^\ +\x0f'\x08\x01\x1aK[\xb2\xfeV1\xbc@\x14\xa8\x8c\ +\x00\x00\x01\x01N\x04\xd9\x02\xa6\x06!\x00\x08\x00\x1c@\ +\x0b\x03\x04\x00\x07\x00\x00\x09\x0a\x08\x80\x04\x00/\x1a\xcd\ +\x11\x12\x019\x113\x10\xc1210\x01\x06\x06\x07!\ +5673\x02\xa6\x0f'\x08\xfe\xe6NX\xb2\x06\x06\ +1\xbc@\x15\xaa\x89\x00\x00\x02\x00)\x025\x02\xdf\x05\ +\xcb\x00\x0b\x00\x15\x00 @\x0e\x00\x11\x06\x0c\x11\x0c\x16\ +\x17\x09\x13\x1f\x03\x0e!\x00?3?3\x11\x12\x019\ +9\x113\x11310\x01\x14\x1632654&\ +#\x22\x06\x05\x10!\x22&5\x10!2\x16\x01%-\ +12..21-\x01\xba\xfe\xa2\xa4\xb4\x01X\xa9\ +\xb5\x04\x00\x7f}|\x80\x7f{{}\xfe3\xed\xe0\x01\ +\xc9\xed\x00\x00\x02\x00\x0c\x02J\x02\xf6\x05\xbc\x00\x0a\x00\ +\x12\x00B@\x1f\x12\x05\x07\x0e\x02\x0b\x03\x03\x09\x00\x02\ +\x05\x02\x13\x14\x0e\x09\x07\x09\x06\x12\x01\x05\x05\x12\x12\x03\ +\x07\x1e\x03 \x00??\x129/3\x113\x1292\ +\x11\x129\x11\x12\x0199\x11333\x113\x129\ +9\x11310\x01#\x15#5!5\x013\x113\ +!547\x06\x06\x07\x07\x02\xf6}\xee\xfe\x81\x01\x81\ +\xec}\xfe\x95\x06\x095\x0f\x7f\x02\xe1\x97\x97\x9a\x02A\ +\xfd\xcd\xa4Vb\x1al\x17\xbf\x00\x01\x00T\x029\x02\ +\xcb\x05\xb6\x00\x1a\x00L@$\x18\x15\x15\x14\x17\x17\x03\ +\x13\x19\x19\x14\x14\x08\x0e\x0e\x03\x08\x03\x1b\x1c\x14\x13\x13\ +\x11\x0c\x11\x19\x00\x00\x06\x18\x15\x1e\x0c\x06!\x00?3\ +?3\x129/33\x11\x129\x113\x11\x12\x019\ +9\x113\x11\x129\x113\x129\x113\x11\x129\x11\ +310\x012\x16\x15\x14\x06#\x22'5\x16\x163\ +254&#\x22\x07'\x13!\x15!\x076\x01\x8d\ +\x8f\xaf\xbe\xb7\x9ed2\x857\xacWQ?8m%\ +\x02\x08\xfe\x9c\x108\x04\x7f\x95\x80\x91\xa04\xc0 *\ +\x83?@\x12+\x01\xb8\xb8\x87\x08\x00\x00\x02\x00-\x02\ +5\x02\xd9\x05\xd7\x00\x12\x00\x1d\x008@\x1a\x08\x09\x0c\ +\x09\x1b\x00\x1b\x06\x16\x00\x06\x00\x1e\x1f\x0c\x19\x19\x10\x10\ +\x03\x09\x08\x1f\x13\x03!\x00?3?3\x129/3\ +\x129\x11\x12\x0199\x113\x113\x11\x1299\x11\ +310\x01\x14\x06#\x22&5\x10%\x17\x06\x06\x07\ +36632\x16\x012654&#\x22\x15\x14\ +\x16\x02\xd9\xaf\x9b\x9e\xc4\x02#C\xaf\xb6\x1a\x0b\x1fY\ +Jt\x84\xfe\xa8;><9\x81D\x03m\x90\xa8\xbf\ +\x9d\x01\xa2\xa4\xa25\x84W+/\x8c\xfe\xf4G?6\ +DjBT\x00\x00\x01\x00;\x02J\x02\xd7\x05\xb6\x00\ +\x06\x00(@\x12\x06\x00\x00\x01\x02\x01\x05\x02\x05\x07\x08\ +\x05\x02\x02\x03\x1e\x00 \x00??3\x129\x11\x12\x01\ +99\x113\x11\x129\x11310\x13\x01!5!\ +\x15\x01\x9a\x01T\xfeM\x02\x9c\xfe\xbf\x02J\x02\xb4\xb8\ +\x95\xfd)\x00\x03\x00-\x025\x02\xdb\x05\xcb\x00\x17\x00\ +!\x00-\x00F@!\x13\x06\x15\x03\x15%\x03+%\ ++\x18\x1e\x18\x10\x1e\x0a\x10\x0a./\x06\x13\x13 \ +((\x1b\x0d!\x22\x00\x1f\x00?2?39\x113\ +\x129\x113\x11\x12\x0199\x113\x113\x11\x129\ +9\x113\x113\x11\x129910\x012\x16\x15\x14\ +\x06\x07\x1e\x02\x15\x14\x06#\x22&5467&5\ +46\x13\x14\x1632654'\x06\x13\x22\x06\x15\ +\x14\x16\x176654&\x01\x85\x8d\xa8CLKB\ +#\xbf\x97\xa1\xb7GW\x7f\xae\x14:9;<\x85e\ +u+-4&&2*\x05\xcbyi?d+*\ +=I,u\x95\x8cxAj.Y~hz\xfdn\ +-99-Q,,\x01\xa3/\x1d)2\x15\x132\ ++\x1d/\x00\x02\x00+\x029\x02\xd5\x05\xc9\x00\x16\x00\ +\x22\x002@\x17\x1a\x05\x11\x0b \x00\x11\x00#$\ +\x0b\x1d\x1d\x0e\x0e\x03\x17\x14\x1f\x08\x03!\x00?3?\ +3\x129/3\x129\x11\x12\x0199\x113\x113\ +\x129210\x01\x14\x06#\x22'5\x16326\ +7#\x06#\x22&54632\x16%\x22\x06\x15\ +\x14\x1632654&\x02\xd5\xf6\xe7I613\ +\x8c\x8b\x08\x08G~z\x8a\xb6\x94\xa4\xbc\xfe\xac5B\ +8;7FD\x043\xfe\xfc\x0f\xbc\x16p\x83b\x94\ +\x83\x89\xaa\xd5#GA7A?+CS\x00\x16\x00\ +T\xfe\x81\x07\xc1\x05\xee\x00\x05\x00\x0b\x00\x11\x00\x17\x00\ +\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00\ +;\x00?\x00C\x00G\x00S\x00[\x00k\x00t\x00\ +|\x00\x89\x01\x0b@\x87@<0\x05\x0f\x0fA=1\ +\x00\x0cNTcpp``ll\x80zggv\ +\x84vkkH\x84HX\x84\x87\x87XT\x03\x0c\x17\ +E)%\x0a\x14\x14D($\x09\x17\x0c\x17\x8a\x8b\x82\ +}}kduullvvkVKKkk\ +\x5c\x0cZQQ\x85t\x5c\x5c\x07\x12\x12\x0c-\x1d\x19\ +\x13\x0f\x0f\x0c\x16\x0d$1'2D=G>(A\ ++B\x09\x00\x00BA>=21\x0d\x08\x01,\x1c\ +\x18\x0c\x07\x0184 \x06\x04\x0495!\x01\x00/\ +3333\x113333\x113/333\x12\ +\x179\x113\x113\x113\x113\x113\x113\x113\ +\x113\x113\x113333\x113\x11\x129/3\ +33/3\x11\x129/3/3\x113\x119/\ +3\x129\x113/3\x11\x12\x0199\x11333\ +33\x113333\x11\x12\x179\x113\x113\x11\ +\x129\x113\x11\x129\x11332\x129\x113\x11\ +3\x113\x1133333\x11333310\ +\x13\x11!\x15#\x15%5!\x11#5\x01\x113\x15\ +3\x15!5353\x11!5!\x15!5!\x15\ +\x015!\x15\x01#\x113\x11#\x113\x015!\x15\ +\x01#\x113\x015!\x1535!\x15\x01#\x113\ +5#\x113\x01#\x113\x05\x14\x06#\x22&54\ +632\x16\x05\x143254#\x22%32\x16\ +\x15\x14\x06\x07\x15\x16\x16\x15\x14\x06##\x13326\ +54&##\x15\x1532654#\x01\x22'\ +5\x16325\x113\x11\x14\x06T\x01/\xc0\x05\xce\ +\x010m\xf9\x00o\xc0\x05\x0e\xc3m\xfdI\x01\x11\xfb\ +\xe1\x01\x0e\xfe\xf2\x01\x0e\x04\xb7mmmm\xfb\xc2\x01\ +\x10\xfc0oo\x02\xc0\x01\x10w\x01\x11\xfa\xa8oo\ +oo\x06\xfemm\xfb\x9f\x87\x7f\x7f\x87\x87\x7f~\x88\ +\xfes\x87\x87\x87\x87\x01\xe1\xacmp.,;0m\ +^\xcf{B.$*/;J1%Z\x01^4\ +\x1c+\x19V}i\x04\xbe\x010o\xc1\xc1o\xfe\xd0\ +\xc1\xf9\x02\x01/\xc2mm\xc2\xfe\xd1mmmm\x06\ +\xfeoo\xfa\xa8\x01\x0e\x02\x02\x01\x0f\xfa;mm\x01\ +\xa6\x01\x0e\x04Joooo\xfc/\x01\x10y\x01\x0f\ +\xfdh\x01\x10I\x91\x9c\x9c\x91\x92\x9b\x9a\x93\xc5\xc5\xc4\ +aCS1D\x08\x04\x0dD8QY\x01b\x22 \ +\x22\x1d\xe3\x9a+%J\xfe\xfa\x0af\x08V\x01\x92\xfe\ +r_c\x00\x03\x00T\xfe\xc1\x07\xaa\x06\x14\x00\x03\x00\ +\x1e\x00*\x00X@)\x12%\x1f\x1f\x04\x1e\x1e\x11\x17\ +\x17\x0b\x11\x0b\x03\x01\x03\x01+,\x1c\x06\x0b\x17\x06\x17\ +\x14\x1e\x1e((\x22\x12\x14\x14\x0e\x22\x0e\x22\x0e\x02\x00\ +\x00//99//\x113\x113\x113\x113/\ +\x1299\x113\x113\x11\x12\x0199\x11\x1299\ +\x113\x11\x129\x1133\x113210\x09\x03\x05\ +54676654&#\x22\x06\x07\x1763\ +2\x16\x15\x14\x06\x07\x06\x06\x15\x15\x03\x14\x16326\ +54&#\x22\x06\x03\xfe\x03\xac\xfcT\xfcV\x03\xeb\ +,AgI\xbb\xa5O\xbaGR\xa0Z?>1H\ +T;\x1bGFBIHCHE\x06\x14\xfcV\xfc\ +W\x03\xa9\xfb/2A1R~X\x87\x9a8*\xb2\ +P:/5K6DpJ;\xfe\xed?HI>\ +@IH\xff\xff\xff}\xfe\x14\x02\xe9\x06!\x02&\x02\ +7\x00\x00\x01\x07\x01L\xfe\xca\x00\x00\x00\x08\xb3\x01\x13\ +\x11&\x00+5\xff\xff\x00\x19\x03\xc1\x01\xa4\x05\xb6\x02\ +\x06\x02\x07\x00\x00\x00\x02\x00)\xff\xec\x05\x9e\x06)\x00\ +\x08\x006\x00v@=\x1f\x14\x14\x22\x1a\x114\x091\ +\x0b1\x03*\x00\x03\x03\x06\x06..(\x11(6\x0b\ +\x11\x0b78\x1c\x17GY\x1c\x1c4\x0e4\x00\x09*\ +\x00*FY\x00\x00\x0e11\x03FY1\x01\x0e%\ +FY\x0e\x16\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x003\x113\x11\x129\x18/+\x11\x12\x01\ +99\x1133\x11\x129\x113\x11\x179\x113\x11\ +\x1299\x11333\x11310\x01&&#\x22\ +\x06\x15\x14\x16\x05\x17\x15\x10\x00!\x22&5465\ +4&#\x22\x07'632\x16\x15\x14\x06\x15\x14\x16\ +32655'&$&54632\x00\x13\ +3\x15\x03\xdf\x16\x8be;F\xcf\x01\xf6\x02\xfe\xc3\xfe\ +\xce\xdb\xdb\x0c\x1b\x1c*0L\x95\x98Zg\x0fa\x5c\ +\x91\x93\x02\xe0\xfe\xc8\xa2\xe1\xc5\xf1\x01\x1c,\x92\x03\xdf\ +\xa9\xbc89r\x80\xe7+-\xfe\xae\xfe\x9c\xa5\xa65\ +i+*\x1c\x1d\xb6V^X?\x86GKO\xe6\xf7\ +\x1f!\x02t\xd1\x8c\xa1\xbf\xfe\xdb\xfe\xdb\xe5\x00\x01\x00\ +\x00\x00\x00\x05\x06\x05\xc3\x00\x15\x00F@\x22\x13\x10\x00\ +\x00\x15\x03\x03\x0c\x0c\x08\x08\x17\x15\x14\x14\x16\x10\x13\x13\ +\x00\x00\x12\x14\x03\x12\x12\x08\x0a\x05\x0aMY\x05\x04\x00\ +?+\x11\x003\x18??\x129\x113\x113\x11\x01\ +3\x113\x113\x113\x113\x11\x129\x11331\ +0\x01>\x0332\x17\x15&#\x22\x06\x07\x06\x02\x07\ +\x11!\x11\x01!\x02}>xhu_UB,\x19\ +(5\x1aC\xb66\xfe\xcc\xfe\x19\x01P\x03T\x88\xf5\ +\xb0B\x1b\xe5\x0c+'`\xfe\x9c\x8e\xfd\xd5\x02/\x03\ +\x87\x00\x02\x003\xff\xec\x07\xcb\x04^\x00\x14\x00(\x00\ +l@5\x0a\x18\x10\x17\x18\x17\x1a\x15\x1a\x08\x03##\ + \x08\x15\x15\x12\x08\x12\x0b\x0f\x0f*\x0d\x0b\x0b)\ +!!\x05\x0d\x18\x10\x0b\x0d\x0bFY\x0d\x0f\x03\x05&\ +\x1d\x05\x1dFY\x00\x05\x16\x00?3+\x11\x003\x12\ +9\x18?+\x11\x0033\x11\x129\x18/\x11\x013\ +\x113\x113\x11\x1299\x113\x11\x129\x113\x12\ +9\x113\x11\x1299\x113\x11310\x05\x22'\ +#\x06#\x22\x02547!57!\x15!\x16\x15\ +\x14\x02\x034'!\x06\x15\x14\x1632655!\ +\x15\x14\x16326\x05F\xedS\x0aR\xee\xdd\xe5?\ +\xfe\xfa\xae\x06\xea\xfe\xfe?\xe53@\xfc\xa0>\x5cg\ +TL\x01\x18LTg\x5c\x14\xd2\xd2\x01\x0e\xfc\xb2\xd1\ +\x7ff\xe5\xd1\xb2\xfc\xfe\xf2\x02\x10\xa9\xd4\xc9\xb0\x96\x91\ +s\x87\x89\x89\x87s\x90\xff\xff\x00\xb8\x00\x00\x06\xd3\x07\ +u\x02&\x000\x00\x00\x01\x07\x00v\x01\xc3\x01T\x00\ +\x08\xb3\x01\x1d\x05&\x00+5\xff\xff\x00\xa0\x00\x00\x07\ +B\x06!\x02&\x00P\x00\x00\x01\x07\x00v\x01\xee\x00\ +\x00\x00\x08\xb3\x01,\x11&\x00+5\xff\xff\x00\x00\xfd\ +\xa8\x05\x85\x05\xbc\x02&\x00$\x00\x00\x00\x07\x02[\x01\ +s\x00\x00\xff\xff\x00V\xfd\xa8\x04;\x04u\x02&\x00\ +D\x00\x00\x00\x07\x02[\x01\x00\x00\x00\xff\xff\xfer\xff\ +\xec\x069\x05\xcd\x00&\x002R\x00\x00\x07\x02\x5c\xfd\ +\xf9\x00\x00\x00\x02\x00X\xfd\xa8\x02N\xff\x83\x00\x0b\x00\ +\x17\x00 @\x0d\x0c\x00\x06\x06\x12\x12\x19\x0f\x09\x09\x18\ +\x15\x03\x00/3\x129/3\x11\x019\x113\x10\xcc\ +210\x01\x14\x06#\x22&54632\x16\x07\ +4&#\x22\x06\x15\x14\x16326\x02N\x8epp\ +\x88\x87qn\x90\x9e6**600*6\xfe\x98\ +l\x84\x80nl\x81\x84i-33--44\x00\ +\x02\x00y\x04h\x03+\x05\xc7\x00\x11\x00\x1a\x001@\ +\x16\x15\x16\x19\x1a\x0c\x04\x07\x00\x07\x07\x1b\x1c\x01\x07\x07\ +\x04\x0f\x1a\x04\x03\x15\x03\x00?\xc62\xd4\xc4\x119\x11\ +3\x11\x12\x019\x113\x10\xc29\xd02\xc1210\ +\x13467\x15\x06\x06\x15\x14\x1e\x02\x15\x14\x06#\x22\ +&\x05767!\x15\x06\x07#y\x98\x8dIE%\ +-%?BCJ\x01Z\x13*\x15\x01\x06*\xa5\x89\ +\x04\xf2Rp\x13J\x16%\x1d\x12\x12\x11\x1a\x1c%-\ +J'C\x93W\x14^\xd5\x00\xff\xff\x00)\x00\x00\x08\ +\x0e\x06\x1f\x00&\x00I\x00\x00\x00'\x00I\x03\x19\x00\ +\x00\x00\x07\x00L\x06/\x00\x00\xff\xff\x00)\x00\x00\x08\ +\x00\x06\x1f\x00&\x00I\x00\x00\x00'\x00I\x03\x19\x00\ +\x00\x00\x07\x00O\x06/\x00\x00\x00\x03\x00w\xff\xec\x06\ +\xd7\x06\x14\x00\x13\x00\x1d\x00\x1e\x00H@#\x0b\x12\x00\ +\x14\x06\x06\x1f\x0f\x0d\x0d\x19\x19\x00\x00\x1e\x12\x0b\x13\x0b\ +\x03\x09\x09\x1bLY\x0d@\x09\x04\x03\x17LY\x03\x13\ +\x00?+\x00\x18?\x1a\xce+\x11\x12\x0099\x113\ +\x01\x18/3\x113\x129\x113\x113\x113\x129\ +910\x01\x10\x00! \x00\x11\x10\x00! \x176\ +5!\x17\x06\x06\x07\x16\x05\x14\x163 \x11\x10!\x22\ +\x06\x01\x05\xe7\xfe\x98\xfe\xb0\xfe\xb0\xfe\x98\x01j\x01R\ +\x01Z\xb2]\x01-\x0e$\x8e{=\xfb\xd5\xba\xb9\x01\ +s\xfe\x8f\xb9\xbc\x04\xa2\x02\xdd\xfe\x95\xfez\x01\x86\x01\ +m\x01k\x01\x83\xcb=\xd5\x16\xb1\xc92\x9f\xd6\xf5\xf8\ +\x01\xed\x01\xee\xf9\xfc.\x00\x03\x00\x5c\xff\xec\x05\xcd\x05\ +\x06\x00\x16\x00\x22\x00#\x00H@#\x0d\x15\x00\x17\x07\ +\x07$\x11\x0f\x0f\x1d\x1d\x00\x00#\x15\x0d\x16\x0d\x03\x0a\ +\x0a GY\x0f@\x0a\x10\x03\x1aGY\x03\x16\x00?\ ++\x00\x18?\x1a\xce+\x11\x12\x0099\x113\x01\x18\ +/3\x113\x129\x113\x113\x113\x12991\ +0\x01\x10\x00!\x22&\x025\x10\x00!2\x16\x176\ +5!\x17\x0e\x02\x07\x16\x05\x14\x1632654&\ +#\x22\x06\x01\x04\x98\xfe\xe0\xfe\xff\xa1\xf6\x84\x01\x1e\x01\ +\x03p\xc8G\x95\x01-\x0f\x1bW\x8ei4\xfc\xfbm\ +{zkl{zl\x03a\x021\xfe\xef\xfe\xcc\x8d\ +\x01\x08\xb0\x01\x12\x010EE-\xf0\x16\x86\x9dk\x1a\ +}\x9a\xa6\xaa\xa9\xa7\xa6\xa6\xa5\xfd(\x00\x02\x00\xae\xff\ +\xec\x07)\x06\x14\x00\x1c\x00\x1d\x009@\x1b\x15\x12\x12\ +\x1e\x06\x04\x01\x01\x1b\x0b\x0b\x1d\x0a\x01\x01\x0f\x1c\x04@\ +\x13\x03\x0f\x18LY\x0f\x13\x00?+\x00\x18?\x1a\xce\ +3\x129/3\x01/3\x1133\x10\xc22\x113\ +\x11310\x01\x15665!\x17\x0e\x02\x07\x11\x14\ +\x06\x04# \x005\x11!\x11\x14\x163265\x11\ +\x01\x05^JF\x01-\x0e k\xb6\x8a\x91\xfe\xee\xbb\ +\xfe\xe6\xfe\xc8\x015\x8d\x98\x98\x89\x01\xe3\x05\xb6\xbc\x1a\ +\x96j\x16\x9a\xa7g\x14\xfd\xc2\xa2\xf4\x82\x01!\xfb\x03\ +\xae\xfci\x9c\x93\x99\x98\x03\x95\xfaJ\x00\x02\x00\x9a\xff\ +\xec\x06s\x05\x06\x00\x1e\x00\x1f\x00J@%\x0b\x08\x08\ + \x19\x17\x14@\x14\x02\x11\x11\x1e\x1e\x1f\x14\x1dKY\ +\x14\x14\x00\x17\x12\x09\x0f\x02\x0e\x05\x05\x0eGY\x05\x16\ +\x00\x15\x00??+\x11\x12\x009\x18?3\xc6\x129\ +/+\x01\x18/3\x113\x1293\x1a\x10\xca2\x11\ +3\x11310!'#\x06\x06#\x22&5\x11!\ +\x11\x14\x163265\x11!\x15665!\x17\x0e\ +\x02\x07\x113\x03\xb8)\x120\xb3s\xc5\xc8\x011V\ +^\x80r\x011GN\x01-\x0f l\xb7\x8e\xa0\x8f\ +MV\xd3\xc6\x02\xd9\xfdsyy\xab\xc6\x02\x0eu\x16\ +\x93t\x16\x9c\xa8f\x15\xfc\xcf\xff\xff\xfc\x16\x04\xd9\xfe\ +W\x06!\x00\x07\x00C\xfa\xca\x00\x00\xff\xff\xfc\xd0\x04\ +\xd9\xff\x11\x06!\x00\x07\x00v\xfb\x84\x00\x00\xff\xff\xfb\ +\xe0\x04\xd7\xff\x1d\x06\x0e\x00\x07\x01R\xfb\x11\x00\x00\x00\ +\x01\xfc\xd9\x04\xc3\xfe\xa0\x06\xa4\x00\x13\x00\x14\xb7\x05\x04\ +\x0d\x0b\x0b\x11\x02\x04\x00/\xc9\xcc2\x113\x1291\ +0\x01\x14\x07\x07#'6654&#\x22\x075\ +6632\x16\xfe\xa0\xa2\x0a\xae\x17K6*\x22A\ +J\x1ei)\x8c\x8b\x05\xcf\x9c)G\x93\x0c3% \ +\x22\x17\xa8\x0a\x0do\x00\x00\x01\xfc\xd9\xfeR\xfe%\xff\ +}\x00\x08\x00\x08\xb1\x07\x02\x00/\xc910\x0143\ +2\x15\x14\x06#\x22\xfc\xd9\xa6\xa6TR\xa6\xfe\xe7\x96\ +\x96GN\xff\xff\x00\xb8\x00\x00\x04\x02\x07s\x02&\x00\ +(\x00\x00\x01\x07\x00C\xffz\x01R\x00\x08\xb3\x01\x14\ +\x05&\x00+5\xff\xff\x00\xb8\x00\x00\x05\xdd\x07s\x02\ +&\x01\xb2\x00\x00\x01\x07\x00C\x00T\x01R\x00\x08\xb3\ +\x01\x18\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x04b\x06\ +!\x02&\x00H\x00\x00\x01\x06\x00C\xa9\x00\x00\x08\xb3\ +\x02$\x11&\x00+5\xff\xff\x00\xa0\x00\x00\x05#\x06\ +!\x02&\x01\xd2\x00\x00\x01\x06\x00C\x0c\x00\x00\x08\xb3\ +\x01\x16\x11&\x00+5\x00\x01\x00w\xff\xec\x08=\x05\ +\xc9\x002\x00b@1\x1d\x1c\x03\x04\x04\x10\x1c\x03+\ ++((\x1600\x0a\x0a4#\x16\x163))\x13\ +\x19\x03\x1d\x1d\x00 \x19 MY\x07\x19\x04\x10\x13-\ +&\x13&LY\x0d\x13\x13\x00?3+\x11\x003\x12\ +9\x18?3+\x11\x0033\x113\x11\x129\x18/\ +\x11\x013\x113\x113\x113\x11\x129\x113\x12\x17\ +9\x113\x11310\x01\x22\x06\x07'663 \ +\x00\x11\x10\x00!\x22&'\x06\x06# \x00\x11\x10\x00\ +!2\x16\x17\x07&&#\x22\x06\x15\x14\x12327\ +\x11!\x11\x1632\x1254&\x05\xfe'ZDl\ +@\xb0K\x01\x0c\x01)\xfe\xb8\xfe\xd6t\xb2MM\xae\ +t\xfe\xd7\xfe\xb7\x01)\x01\x0cJ\xafBlD[&\ +\x80\x8e\xba\xb0SU\x016Hl\xb0\xb8\x8f\x04\xd3!\ +-\xd71<\xfe\x8a\xfe\xad\xfe\x89\xfecHKKH\ +\x01\x9c\x01x\x01R\x01w:3\xd7-!\xf3\xe2\xfb\ +\xfe\xf7E\x01\x8c\xfetE\x01\x09\xfb\xe1\xf4\x00\x01\x00\ +\x06\x00\x00\x06\xc5\x04^\x00\x18\x00U@)\x18\x00\x05\ +\x05\x09\x02\x09\x17\x0a\x16\x16\x15\x0d\x0d\x0b\x0b\x0a\x0a\x11\ +\x01\x11\x12\x12\x1a\x02\x01\x01\x19\x17\x09\x0a\x0d\x16\x15\x0a\ +\x11\x01\x0f\x05\x00\x15\x00?2?33?3\x129\ +9\x11\x013\x113\x113\x113\x11\x129\x113\x11\ +9\x1133\x11\x1299\x11\x129\x113310\ +!\x01!\x13\x16\x17367\x13\x03!\x13\x1736\ +\x12\x11!\x10\x02\x07!\x03\x03\x01\x91\xfeu\x01@\xc2\ +!\x0c\x08\x10\x08g]\x014\ +\xc8\xd0\xfe\xee\xa4\xac\x04^\xfd\x7fd\x81S\x92\x01\x15\ +\x01l\xfd\x94\xe4\x9b\x01\x93\x01\x22\xfe\x90\xfd\xde\xcc\x01\ +}\xfe\x83\x00\x02\x00\x00\x00\x00\x05\x06\x06\x14\x00\x11\x00\ +\x1a\x00O@(\x11\x12\x16\x05\x05\x1c\x0f\x01\x12\x12\x0c\ +\x0a\x08\x08\x1b\x00\x0a\x0b\x0aMY\x0f\x0b\x01\x1aLY\ +\x0b\x01\x0b\x01\x08\x0d\x00\x08\x12LY\x08\x12\x00?+\ +\x00\x18?\x1299//+\x11\x003+\x11\x003\ +\x11\x013\x11333\x1133\x113\x113\x129\ +10\x01\x153 \x04\x15\x10!!\x11!5!5\ +!\x15!\x15\x0132654&##\x025{\ +\x01\x1e\x018\xfd\xa4\xfeV\xff\x00\x01\x00\x015\x01y\ +\xfe\x87i\x9d\x92\x94\xb4P\x04d\xdf\xe8\xd4\xfe7\x04\ +d\xe6\xca\xca\xe6\xfc\x9aefeY\x00\x02\x00\x00\x00\ +\x00\x05\x04\x05'\x00\x11\x00\x19\x00J@&\x11\x17\x12\ +\x05\x05\x1b\x0f\x01\x17\x17\x0c\x0a\x08\x08\x1a\x00\x0a\x0b\x0a\ +FY\x01\x16JY\x01\x01\x08\x0f\x0d\x0b\x0f\x08\x17J\ +Y\x08\x15\x00?+\x00\x18?\xc63\x129/++\ +\x11\x003\x11\x013\x11333\x1133\x113\x11\ +3\x12910\x01\x153 \x16\x15\x10!!\x11!\ +5!5!\x15!\x15\x134&##\x1132\x02\ +3\xd7\x01\x02\xf8\xfe\x13\xfd\xeb\xfe\xfe\x01\x02\x011\x01\ +g9hg\xd1\xd5\xcb\x03y\xcb\xa4\xa6\xfe\x9c\x03y\ +\xe5\xc9\xc9\xe5\xfd\xe7A:\xfe\xf8\x00\x00\x01\x00\xb8\xff\ +\xec\x07R\x05\xcb\x00\x22\x00U@,\x00\x08!\x01\x01\ +\x0e\x15\x0e\x1a\x10\x1a$\x14\x10\x10\x11\x11#\x18\x1eL\ +Y\x18\x04\x01\x0f\x14\x0fLY!\x14\x14\x11\x12\x03\x11\ +\x12\x0b\x04LY\x0b\x13\x00?+\x00\x18??\x129\ +/3+\x11\x003\x18?+\x11\x013\x113\x113\ +\x113\x11\x1299\x113\x1139910\x01!\ +\x16\x163267\x11\x06\x06# \x00\x03#\x11!\ +\x11!\x113\x12\x00!2\x17\x07&&#\x22\x06\x07\ +!\x06f\xfd\x9a\x0d\xd0\xaaa\xc1rh\xc9w\xfe\xc5\ +\xfe\x9d\x19\xce\xfe\xca\x016\xd7,\x01|\x01$\xe6\xdb\ +dZ\xb4W\xa3\xd0\x14\x02d\x02w\xb5\xd4(%\xfe\ +\xfc(#\x01N\x01=\xfd\x89\x05\xb6\xfd\xc3\x01\x18\x01\ +:g\xfc':\xae\xa2\x00\x01\x00\xa0\xff\xec\x06\x1d\x04\ +s\x00 \x00W@-\x17\x10\x1e\x16\x19\x19\x0a\x03\x03\ +\x05\x1e\x1e\x22\x09\x05\x05\x06\x06!\x0d\x13FY\x0d\x10\ +\x19\x04\x09\x04FY\x16\x09\x09\x06\x07\x0f\x06\x15\x00\x1c\ +FY\x00\x16\x00?+\x00\x18??\x129/3+\ +\x11\x003\x18?+\x11\x013\x113\x113\x113\x11\ +\x129\x1133\x113\x129910\x05\x22$'\ +#\x11!\x11!\x1136$32\x16\x17\x07&#\ +\x22\x06\x07!\x15!\x16\x16327\x15\x06\x04\xc5\xf0\ +\xfe\xf2\x19\xdd\xfe\xcf\x011\xdd\x18\x01\x01\xe9[\xbfM\ +V\x8dxdk\x08\x01\xa6\xfeZ\x09ts\x98\xb0\x88\ +\x14\xf2\xef\xfe3\x04^\xfeR\xe1\xe2,$\xd1?q\ +p\xe3\x80~P\xeeE\x00\x02\x00\x00\x00\x00\x05\xd7\x05\ +\xbc\x00\x0b\x00\x10\x00E@#\x0a\x09\x04\x03\x0c\x06\x07\ +\x01\x0d\x0e\x03\x0f\x00\x00\x0b\x0b\x12\x07\x08\x08\x11\x0c\x06\ +MY\x0c\x0c\x07\x0f\x09\x03\x04\x00\x07\x12\x00?33\ +?3\x129/+\x11\x013\x113\x113\x113\x11\ +\x12\x179\x1199222210!\x03#\x11\ +!\x11#\x03!\x01!\x01\x01!\x02'\x06\x04\xaa\xd1\ +d\xfe\xeff\xcf\xfe\xd1\x02-\x01{\x02/\xfcu\x01\ +9\x86\x13\x0b\x02w\xfd\x89\x02w\xfd\x89\x05\xbc\xfaD\ +\x03d\x01YE4\x00\x00\x02\x00\x00\x00\x00\x05\x1f\x04\ +^\x00\x0b\x00\x11\x00L@%\x0d\x00\x0b\x0c\x05\x09\x08\ +\x03\x02\x10\x10\x06\x0b\x0b\x0a\x0a\x13\x06\x07\x07\x12\x00\x05\ +\x0c\x05JY\x0c\x0c\x06\x10\x08\x0f\x0b\x03\x06\x15\x00?\ +33?3\x129/+\x11\x003\x11\x013\x113\ +\x113\x113\x11\x129\x11333399\x129\ +910\x01#\x11!\x11#\x03!\x01!\x01!\x01\ +!'&'\x06\x03bN\xfe\xf8P\x97\xfe\xdb\x01\xd7\ +\x01o\x01\xd9\xfe\xdb\xfe\x10\x01\x0d#H\x1d\x1a\x01\xa6\ +\xfeZ\x01\xa6\xfeZ\x04^\xfb\xa2\x02uP\x9cW]\ +\x00\x00\x02\x00\xb8\x00\x00\x08\x0a\x05\xbc\x00\x13\x00\x19\x00\ +t@9\x10\x09\x11\x08\x15\x01\x00\x14\x06\x07\x12\x11\x04\ +\x03\x18\x18\x00\x07\x07\x08\x08\x0b\x00\x13\x13\x1b\x0f\x0b\x0b\ +\x0c\x0c\x1a\x18\x11\x03\x15\x14\x14\x10\x06\x01\x09\x10\x09L\ +Y\x10\x10\x0c\x0d\x03\x08\x07\x04\x00\x0c\x12\x00?33\ +33?\x129/+\x11\x0033\x129\x113\x18\ +?3\x11\x013\x113\x113\x113\x113\x129/\ +3\x11\x129\x113333\x1299\x1299\x11\ +\x129910!\x03#\x11!\x11#\x03!\x13!\ +\x11!\x11!\x11!\x13!\x01\x01!'&'\x06\x06\ +\xdd\xd1d\xfe\xf0g\xcf\xfe\xd1\xf0\xfe\xcb\xfe\xca\x016\ +\x01\x97\xdb\x01{\x02/\xfcu\x0193\x5c\x0a\x0b\x02\ +w\xfd\x89\x02w\xfd\x89\x02w\xfd\x89\x05\xb6\xfd\xc3\x02\ +C\xfaD\x03d\x89\xee'4\x00\x02\x00\xa0\x00\x00\x07\ +7\x04^\x00\x13\x00\x18\x00x@;\x15\x00\x13\x14\x05\ +\x17\x06\x0f\x08\x10\x07\x11\x10\x03\x02\x17\x17\x13\x06\x13\x12\ +\x06\x07\x07\x0a\x12\x12\x1a\x0e\x0a\x0a\x0b\x0b\x19\x15\x14\x14\ +\x0f\x05\x00\x08\x0f\x08FY\x0f\x0f\x0b\x17\x10\x0f\x0c\x0f\ +\x13\x07\x06\x03\x0b\x15\x00?3333??3\x12\ +9/+\x11\x0033\x129\x113\x11\x013\x113\ +\x113\x113\x11\x129\x18/3\x113\x11\x129\x11\ +3333\x11\x1299\x11\x1299\x11991\ +0\x01#\x11!\x11#\x03!\x13!\x11!\x11!\x11\ +!\x13!\x01!\x013&'\x06\x05oB\xfe\xf8B\ +\xa6\xfe\xdc\xc2\xfe\xcd\xfe\xf8\x01\x08\x01\x91\xb7\x01n\x01\ +\xd9\xfe\xdb\xfe#\xea`\x17\x15\x01\xcb\xfe5\x01\xcb\xfe\ +5\x01\xcd\xfe3\x04^\xfeR\x01\xae\xfb\xa2\x02\x9a\xda\ +DI\x00\x00\x02\x00)\x00\x00\x06F\x05\xb6\x00\x19\x00\ +\x1c\x00\x84@B\x02\x17\x17\x19\x1c\x05\x05\x14\x00\x14\x1a\ +\x0b\x10\x10\x0e\x1b\x08\x08\x13\x0d\x13\x09\x04\x1a\x1a\x00\x0e\ +\x0d\x0d\x1e\x19\x00\x00\x1d\x08\x05\x05\x06\x1c\x06\x1cLY\ +\x0b\x10\x10\x02\x17\x17\x14\x12\x15\x04\x15MY\x1a\x09\x04\ +\x04\x06\x03\x14\x0e\x00\x12\x00?22?9/33\ ++\x11\x003\x129\x1133\x113+\x11\x12\x009\ +\x113\x11\x013\x113\x113\x113\x129\x1133\ +3\x11\x129\x113\x119\x113\x113\x11\x129\x11\ +3\x119\x113103\x13667\x015!\x15\ +\x01\x16\x16\x17\x13!\x03&&'\x11!\x11\x06\x06\x07\ +\x03\x01\x13!)\x98:\xa8\x84\xfe\x89\x05\x15\xfe\x81\x87\ +\xa89\x98\xfe\xc8{)TC\xfe\xcdGV({\x01\ +\xd7\xfe\xfe\x06\x01\xc5\xb3\xba$\x01\xd5\x8b\x8b\xfe+%\ +\xbf\xad\xfe;\x01\x81|d\x10\xfd\x8f\x02q\x10e{\ +\xfe\x7f\x03{\x019\x00\x00\x02\x00\x14\x00\x00\x04\xe7\x04\ +^\x00\x19\x00\x1c\x00\x84@B\x02\x17\x17\x19\x1c\x05\x05\ +\x14\x00\x14\x1a\x0b\x10\x10\x0e\x1b\x08\x08\x13\x0d\x13\x09\x04\ +\x1a\x1a\x00\x0e\x0d\x0d\x1e\x19\x00\x00\x1d\x08\x05\x05\x06\x1c\ +\x06\x1cJY\x0b\x10\x10\x02\x17\x17\x14\x12\x15\x04\x15J\ +Y\x1a\x09\x04\x04\x06\x0f\x14\x0e\x00\x15\x00?22?\ +9/33+\x11\x003\x129\x1133\x113+\ +\x11\x12\x009\x113\x11\x013\x113\x113\x113\x12\ +9\x11333\x11\x129\x113\x119\x113\x113\ +\x11\x129\x113\x119\x113103\x13667\ +\x015!\x15\x01\x16\x16\x17\x13!\x03&&'\x11!\ +\x11\x06\x06\x07\x03\x017!\x14u(}[\xfe\xdf\x04\ +4\xfe\xdbYy*t\xfe\xfe^\x1a8/\xfe\xf86\ +<\x17^\x01h\xb4\xfe\x9a\x01Z}\x90 \x01mj\ +j\xfe\x91 \x90{\xfe\xa6\x01'MB\x0b\xfe?\x01\ +\xc3\x0aDN\xfe\xd9\x02\xae\xe1\x00\x03\x00\xb8\x00\x00\x08\ +m\x05\xb6\x00\x1f\x00\x22\x00#\x00\xa9@V\x03\x1d\x1d\ +\x1a\x1f\x22\x0b\x0b\x00\x1a\x1a \x11\x16\x16\x19\x14!\x0e\ +\x0e\x13\x19\x19\x0f\x0a \x1f\x14\x14\x13\x1f\x00\x00\x13\ +%\x09\x05\x05\x06\x06$#%\x0e\x0b\x0b\x0c\x22\x0c\x22\ +LY\x02\x1d\x1d\x11\x16\x16\x14\x1b\x18\x0f\x18MY\x09\ +\x04LY\x09\x09\x07 \x0f\x0f\x06\x0c\x03\x07\x03\x14\x1a\ +\x00\x06\x12\x00?333??\x129/3\x129\ +/++\x11\x003\x129\x1133\x113+\x11\x12\ +\x009\x113\x01\x18\x10\xc4\x113\x113\x113\x113\ +2\x113\x113\x11\x129\x11333\x11\x129\x11\ +3\x11\x129\x113\x113\x11\x129\x113\x11\x129\ +\x11310!\x1367!\x11!\x11!\x11!\x01\ +5!\x15\x01\x16\x16\x17\x13!\x03&&'\x11!\x11\ +\x06\x06\x07\x03\x01\x13!\x01\x02P\x97,3\xfe\xa8\xfe\ +\xca\x016\x02C\xfe\xa6\x05\x15\xfe\x81\x87\xa89\x98\xfe\ +\xc8{)TC\xfe\xcdGV({\x01\xd7\xfe\xfe\x06\ +\xfd\xc5\x01\xc5\x7f3\xfd\x89\x05\xb6\xfd\xc3\x01\xb2\x8b\x8b\ +\xfe+%\xbf\xad\xfe;\x01\x81|d\x10\xfd\x8f\x02q\ +\x10e{\xfe\x7f\x03{\x019\xfbL\x00\x03\x00\xa0\x00\ +\x00\x06\xf6\x04^\x00\x1f\x00\x22\x00#\x00\xa8@U\x03\ +\x1d\x1d\x1f\x22\x0b\x0b\x1a\x00\x1a \x11\x16\x16\x14!\x0e\ +\x0e\x19\x13\x19\x0f\x0a \x1f\x14\x14\x13\x1f\x00\x00\x13\ +%\x09\x05\x05\x06\x06$#%\x0e\x0b\x0b\x0c\x22\x0c\x22\ +JY\x02\x1d\x1d\x11\x16\x16\x1a\x1b\x18\x0f\x18JY \ +\x09\x09\x04FY\x09\x09\x07\x0f\x0f\x06\x0c\x0f\x07\x0f\x1a\ +\x14\x00\x06\x15\x00?333??\x129/\x129\ +/+\x11\x003+\x11\x003\x129\x1133\x113\ ++\x11\x12\x009\x113\x01\x18\x10\xc4\x113\x113\x11\ +3\x1132\x113\x113\x11\x129\x11333\x11\ +\x129\x113\x119\x113\x113\x11\x129\x113\x11\ +9\x11310!\x1367!\x11!\x11!\x11!\ +\x015!\x15\x01\x16\x16\x17\x13!\x03&&'\x11!\ +\x11\x06\x06\x07\x03\x017!\x01\x02#u\x1d \xfe\xd3\ +\xfe\xf8\x01\x08\x01\xcf\xff\x00\x043\xfe\xdbYz)u\ +\xfe\xfe^\x17\x02\x03\xc3J0\x1a>]_\xa8\xb8\xb7\x9f\ +\xb8\xcb\xfe\xaf\xfe\xd8\x5cb)\x91Yh\x9a\x8c\x1e\x10\ +Z6\xb5\xef\xb2\xcd\xec\xff\xc3\xac\xed\xe8\x89{\xe8\xd4\ +\x85\x85\xcf\xbe\x88S\xb7w`\x83\xd16\x9bNWe\ +\x06\xf0\x11\x97\x0c\x9a\x22\xb8\x80\x8c\xb9\x19\x06\x14\xb7\x91\ +\xc9\xeb\x11')X\x05\x05)\xe5\x10\x19\x04\x04\xac\x93\ +\xad\x9c\x07\x04enah\xf2XfKYw\xcf6\ +L\x11w\x83\x1b(\x9bdN.\x00\x00\x01\x00\x1f\xfe\ +/\x04#\x05d\x00L\x00\xaa@Y4*\x0d99\ +\x0aGEECCI\x03\x07\x07I\x08IB\x03@\ +\x0a \x0a*0\x11\x11N?@@\x17**M?\ +\x02\x03\ +{H3\x226TJ~\x86ih\x81o\xfe\xdc\xfe\ +\xf1laKYUON0\x88\x1e\x11V4D\xb3\ +|\xb1\xb1\xe6\xed\x84\x84\x9c\xa2vp\xad\x91jzM\ +\xc3PZA\x7f>]W\xc49\x98RVc\x05d\ +\x10\x98\x0do\x22\x8da_{\x1c\x0a\x22}e\xa8\xb2\ +'44*\x05\x05)\xe5\x11\x18\x08\x99\x9a\xaf\xa5@\ +ADA\xd38=66&!\xd5\x18!\x0al_\ +\x1b)\x9afL-\x00\xff\xff\x00m\x00\x00\x06\x96\x05\ +\xb6\x02\x06\x01u\x00\x00\xff\xff\x00\x8f\xfe\x14\x06F\x06\ +\x12\x02\x06\x01\x95\x00\x00\x00\x03\x00w\xff\xec\x05\xe7\x05\ +\xcd\x00\x0b\x00\x12\x00\x19\x00?@ \x16\x17\x10\x0f\x0f\ +\x00\x00\x1b\x10\x06\x06\x1a\x16\x10LY\x16\x16\x03\x09\x09\ +\x13LY\x09\x04\x03\x0cLY\x03\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x013\x113\x113\ +\x113\x11\x129910\x01\x10\x00! \x00\x11\x10\ +\x00! \x00\x01267!\x16\x16\x13\x22\x06\x07!\ +&&\x05\xe7\xfe\x98\xfe\xb0\xfe\xb0\xfe\x98\x01i\x01Q\ +\x01Q\x01e\xfdH\xa3\xbd\x13\xfd\x18\x14\xb7\xac\x9e\xba\ +\x1b\x02\xe0\x19\xb7\x02\xdd\xfe\x95\xfez\x01\x86\x01m\x01\ +m\x01\x81\xfe|\xfc\xa7\xc0\xbd\xb4\xc9\x03\xdb\xae\xae\xa9\ +\xb3\x00\x03\x00\x5c\xff\xec\x04\x98\x04s\x00\x0d\x00\x14\x00\ +\x1b\x00?@ \x19\x11\x11\x00\x00\x1d\x18\x12\x12\x07\x07\ +\x1c\x18\x12JY\x18\x18\x03\x0a\x0a\x15GY\x0a\x10\x03\ +\x0eGY\x03\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x013\x113\x113\x113\x113\x113\ +10\x01\x10\x00!\x22&\x025\x10\x00!2\x16\x12\ +\x01267!\x16\x16\x13\x22\x06\x07!&&\x04\x98\ +\xfe\xe0\xfe\xff\xa1\xf6\x84\x01\x1e\x01\x03\xa1\xf6\x84\xfd\xe3\ +ap\x0e\xfe>\x0fndbp\x0f\x01\xc2\x0em\x02\ +1\xfe\xef\xfe\xcc\x8d\x01\x08\xb0\x01\x12\x010\x8c\xfe\xfa\ +\xfe\x00tttt\x02\x9cqppq\x00\x00\x01\x00\ +\x00\x00\x00\x05\xa6\x05\xc3\x00\x15\x00A@ \x05\x04\x0a\ +\x0a\x07\x0e\x0e\x02\x02\x13\x13\x17\x07\x06\x06\x16\x0e\x02\x02\ +\x05\x00\x11\x00LY\x11\x04\x06\x03\x0a\x05\x12\x00?3\ +??+\x11\x12\x009\x113\x11\x013\x113\x113\ +\x113\x113\x11\x129\x113310\x01\x22\x06\x07\ +\x01!\x01!\x01\x16\x1767\x13>\x0232\x17\x15\ +&\x05B.@*\xfe\x98\xfe\xae\xfe\x10\x019\x01!\ ++\x15\x116\xaa7\x5cxVtF3\x04\xc1Gv\ +\xfb\xfc\x05\xb6\xfcs\xa0\x8b\x80\xab\x02\x08\xab\x9cK'\ +\xf2\x17\x00\x00\x01\x00\x00\x00\x00\x04\xd1\x04f\x00\x16\x00\ +@@\x1f\x16\x15\x04\x04\x09\x01\x09\x13\x13\x0e\x0e\x18\x01\ +\x00\x00\x17\x09\x13\x13\x11\x04\x16\x15\x0c\x11GY\x0c\x0f\ +\x00\x0f\x00??+\x00\x18?3\x129\x113\x11\x01\ +3\x113\x113\x113\x113\x11\x129\x11331\ +0\x11!\x13\x16\x17367\x13>\x0232\x17\x15\ +&#\x22\x06\x07\x01!\x01?\xcd2\x08\x04\x0d,{\ +3LkULH+' 3\x15\xfe\xcc\xfe\xc9\x04\ +^\xfd\x8e\xa3Oo|\x01X\x8ej1\x1c\xec\x13,\ +7\xfc\xf2\xff\xff\x00\x00\x00\x00\x05\xa6\x07s\x02&\x02\ +\x80\x00\x00\x01\x07\x03v\x05'\x01R\x00\x0a\xb4\x02\x01\ +)\x05&\x00+55\xff\xff\x00\x00\x00\x00\x04\xd1\x06\ +!\x02&\x02\x81\x00\x00\x01\x07\x03v\x04\xcb\x00\x00\x00\ +\x0a\xb4\x02\x01*\x11&\x00+55\x00\x03\x00w\xfe\ +\x14\x0a\x8d\x05\xcd\x00\x16\x00\x22\x00.\x00k@7\x0b\ +\x14\x14\x10\x16\x16\x04\x04\x01\x08\x08\x09\x090)\x17\x17\ +\x10\x01\x000#\x1d\x1d/ ,LY \x04\x1a&\ +LY\x1a\x13\x0b\x14\x14\x12\x04\x16\x15\x10\x12\x0d\x12M\ +Y\x0d\x1b\x08\x00\x0f\x00?2?+\x11\x003\x18?\ +3\x129\x113?+\x00\x18?+\x11\x013\x113\ +\x18\x10\xc4222\x113\x113\x113\x11\x129\x11\ +3\x11\x129\x11310\x01!\x13\x16\x17367\ +\x13!\x01\x06\x06#\x22'5\x1632677\x01\ +\x10\x00! \x00\x11\x10\x00! \x00\x01\x10\x1632\ +6\x11\x10&#\x22\x06\x06\x00\x01N\xd3\x1b\x0a\x06\x0b\ + \xcf\x01G\xfe'A\xf1\xa1NM7AQy\x22\ +\x12\xfd\xda\xfe\xb6\xfe\xba\xfe\xbc\xfe\xb5\x01L\x01E\x01\ +C\x01K\xfc \xa4\xac\xad\xa3\xa1\xad\xaf\xa3\x04^\xfd\ +\x8bRpg[\x02u\xfb\x13\xaf\xae\x11\xf2\x0dcd\ +7\x02\xd5\xfe\x8d\xfe\x82\x01{\x01x\x01x\x01v\xfe\ +\x87\xfe\x89\xfe\xff\xec\xe5\x01\x08\x01\x05\xe9\xee\x00\x03\x00\ +\x5c\xfe\x14\x09)\x04s\x00\x16\x00\x22\x000\x00k@\ +7\x0b\x14\x14\x10\x16\x16\x04\x04\x01\x08\x08\x09\x092\x1d\ +##\x10\x01\x002\x17**1- GY-\x10\ +&\x1aGY&\x16\x0b\x14\x14\x12\x04\x16\x15\x10\x12\x0d\ +\x12GY\x0d\x1b\x08\x00\x0f\x00?2?+\x11\x003\ +\x18?3\x129\x113?+\x00\x18?+\x11\x013\ +\x113\x18\x10\xc4222\x113\x113\x113\x11\x12\ +9\x113\x11\x129\x11310\x01!\x13\x16\x173\ +67\x13!\x01\x06\x06#\x22'5\x163267\ +7\x01\x14\x1632654&#\x22\x06\x05\x10\x00\ +!\x22&\x025\x10\x00!2\x16\x12\x04\x9c\x01M\xd3\ +\x1a\x0b\x06\x0d\x1e\xcf\x01H\xfe'A\xf1\xa1MO9\ +@Qy\x22\x12\xfb;m{zkl{zl\x03\ +\x05\xfe\xe0\xfe\xff\xa1\xf6\x84\x01\x1e\x01\x03\xa1\xf6\x84\x04\ +^\xfd\x8bKwg[\x02u\xfb\x13\xaf\xae\x11\xf2\x0d\ +cd7\x02)\xa6\xaa\xa9\xa7\xa6\xa6\xa5\xa7\xfe\xef\xfe\ +\xcc\x8d\x01\x08\xb0\x01\x12\x010\x8c\xfe\xfa\x00\x00\x02\x00\ +w\xff\x83\x069\x061\x00\x15\x00(\x00P@*\x13\ +#\x1f\x19'\x0d\x06\x03\x03\x07\x07\x0a!!\x00\x00*\ +\x16\x0a\x0a)#'\x0d'LY\x13\x10@\x0d\x04\x1f\ +\x19\x07\x19LY\x05\x03\x07\x13\x00?3\xc9+\x11\x00\ +3\x18?\x1a\xc93+\x11\x003\x11\x013\x113\x11\ +3\x113\x11\x129\x113\x12\x17910\x01\x10\x00\ +\x05\x06#\x22'$\x00\x11\x10\x00%6632\x16\ +\x17\x04\x00\x01\x14\x16\x176632\x16\x17$\x11\x10\ +%\x06#\x22'\x04\x069\xfe\xd3\xfe\xe2#qv\x1d\ +\xfe\xe1\xfe\xcf\x01.\x01$\x10D=5H\x12\x01\x1f\ +\x011\xfb}\x8e\x8b\x16E0-E\x17\x01\x17\xfe\xed\ +'ff)\xfe\xeb\x02\xdd\xfe\xbf\xfe\x82(ss$\ +\x01\x7f\x01F\x01C\x01{&<2,B&\xfe\x84\ +\xfe\xbc\xc6\xf2%*\x1e\x1e*J\x01\x93\x01\x8eMK\ +KM\x00\x00\x02\x00\x5c\xff\x91\x05\x12\x04\xb4\x00\x15\x00\ ++\x00T@,\x03\x1e\x13\x0f\x18\x09\x06$$**\ +\x0c!!\x00\x00-\x16\x0c\x0c,'$*\x0f*F\ +Y\x13\x11@\x0f\x0f\x1e\x1b\x18\x09\x18FY\x06\x03\x09\ +\x15\x00?3\xc9+\x11\x0033\x18?\x1a\xc93+\ +\x11\x0033\x11\x013\x113\x113\x113\x11\x129\ +\x113\x12\x17910\x01\x14\x02\x07\x06\x06#\x22&\ +'&\x0254\x127632\x17\x16\x12\x05\x10\x17\ +6632\x16\x176654&'\x06\x06#\x22\ +&'\x06\x05\x12\xef\xe6\x09H69G\x09\xdf\xf2\xf3\ +\xe6\x13nj\x15\xe0\xfd\xfc\x81\x9e\x1399+>\x1a\ +SOPI\x11>=6D\x13\x96\x021\xeb\xfe\xe0\ +&5:;6'\x01%\xe3\xed\x01#!RR\x22\ +\xfe\xdb\xea\xfe\xf2>'+!3\x1f\xb1~\x82\xa5\x1d\ +/816A\x00\x03\x00w\xff\xec\x08=\x08\x8d\x00\ +1\x00G\x00Y\x00\xa0@PLO=\xfe\x8a\xfe\xad\xfe\x89\xfe\ +cGRKN\x01\x9c\x01x\x01R\x01w>/\xd7\ +-!\xf3\xe2\xf8\xfe\xf0pcen\x01\x12\xf6\xe1\xf4\ +\x03A\xc26)\x0d3;1bt6&-&\xfe\ +\xb3]\x8c\x07V\x0e:\x1e\x13\x12\x10\x1a\x1c5:Z\ +\x00\x00\x03\x00\x5c\xff\xec\x06\xc3\x07R\x00)\x00@\x00\ +R\x00\xa4@RDH54MH+AAHH\ +\x03#\x09\x08(\x13\x1d\x1e\x1e\x13\x08\x03\x0e\x18\x18#\ +#T\x0e\x03\x03S@,AHHEPEDD\ +\x06P,P,P15511;\x06@\x1d\x09\ +\x09\x1a\x0c\x06\x0cFY \x06\x10(\x00\x15\x13\x11@\ +\x00\x11FY&\x00\x16\x00?2+\x00\x1a\x10\xca3\ +\x129\x18?3+\x11\x0033\x113\x1a\x18\x10\xcc\ +2\x113/\x1299//\x11\x129/3\x11\x12\ +9\x113\x113\x11\x013\x113\x113\x113\x11\x12\ +\x179\x113\x113\x113\x11\x129\x113\x113\x10\ +\xd8\xca2\x12910\x05 \x00\x11\x10\x1232\x17\ +\x07&&#\x22\x11\x14\x16327\x163265\ +\x10#\x22\x06\x07'632\x12\x11\x10\x00!\x22'\ +\x06\x01\x15#\x22'&&#\x22\x06\x07#54>\ +\x0232\x1e\x023\x01\x14\x06\x0756654.\ +\x0254632\x16\x02f\xfe\xfe\xfe\xf8\xec\xf5\x95\ +|V?B%\xbawl\x92\x82\x82\x93mv\xba'\ +A>V|\x94\xf6\xec\xfe\xfa\xfe\xfb\xad|z\x02&\ +\x10\xb4\x88g2\x19.+\x0b\xb6\x22:fT:p\ +w\x85N\xfe\xfe\xb6\x7f2B%,%NGNT\ +\x14\x01)\x01&\x01\x1a\x01\x1e<\xd1\x1e\x0d\xfe\xaa\xb2\ +\xba\x87\x87\xbb\xb1\x01V\x0e\x1d\xd1<\xfe\xe2\xfe\xe6\xfe\ +\xdd\xfe\xd4pp\x06\xed\xc26)\x0d4;2Ee\ +>$&-&\xfe\xb2^\x8b\x06V\x0c;\x1f\x13\x12\ +\x10\x1a\x1c4:Y\x00\x00\x02\x00w\xff\xec\x08=\x07\ +B\x002\x00@\x00\x8f@H\x1d\x1c?<;47\ +88;\x03\x04\x04\x10;\x1c\x04++((\x160\ +0\x0a\x0aB#\x16\x16A4??@95=<\ +8<<@\x19@))\x13\x19\x03\x1d\x1d\x00 \x19\ + MY\x07\x19\x04\x10\x13-&\x13&LY\x0d\x13\ +\x13\x00?3+\x11\x003\x129\x18?3+\x11\x00\ +33\x113\x11\x129\x18/\x1a\x10\xce2\x113\x10\ +\xc922\x129\x113\x11\x013\x113\x113\x113\ +\x11\x129\x113\x12\x179\x113\x113\x10\xca2\x10\ +\xca2\x11310\x01\x22\x06\x07'663 \x00\ +\x11\x10\x00!\x22&'\x06\x06# \x00\x11\x10\x00!\ +2\x16\x17\x07&&#\x22\x06\x15\x14\x12327\x11\ +!\x11\x1632\x1254&\x03\x15\x07#'#\x07\ +#'#\x07#'5\x05\xfe'ZDX<\x9bP\ +\x01\x0c\x01)\xfe\xb8\xfe\xd6k\xb2TM\xb0t\xfe\xd7\ +\xfe\xb7\x01)\x01\x0cQ\x9a\xfe\x8a\xfe\ +\xad\xfe\x89\xfecGRKN\x01\x9c\x01x\x01R\x01\ +w>/\xd7-!\xf3\xe2\xfb\xfe\xf7J\x01\x87\xfe\x83\ +T\x01\x09\xfb\xe1\xf4\x02oY\xacgggg\xacY\ +\x00\x00\x02\x00\x06\x00\x00\x06\xc5\x05\xa4\x00\x1c\x00*\x00\ +\x87@A\x1b\x09\x1a\x0a)&%\x1e!\x22\x22%%\ +\x15\x02\x1c\x00\x06\x06\x09\x02\x09\x1b\x0a\x1a\x1a\x19\x11\x11\ +\x0b\x0b\x0a\x0a\x15\x01\x15\x16\x16,\x02\x01\x01+\x1e)\ +)&#\x1f''\x22&&*\x15\x0a\x01\x0f\x11\x1a\ +\x1a\x05\x00\x15\x00?22\x113?33\xce2\x11\ +33\x1133\x119\x113\x11\x013\x113\x113\ +\x113\x11\x129\x113\x119\x1133\x11\x1299\ +\x11\x129\x1133\x11\x129\x113\x10\xca2\x10\xca\ +2\x11\x12\x009910!\x01!\x13\x16\x1736\ +6\x13\x03!\x13\x1e\x03\x1736\x12\x11!\x10\x02\x07\ +!\x03\x03\x01\x15\x07#'#\x07#'#\x07#'\ +5\x01\xa0\xfef\x01@\xc2%\x0c\x06\x06\x12\xa5\x8b\x01\ +?\xc9\x07\x14\x13\x12\x05\x09j`\x014\xc7\xdf\xfe\xe3\ +\x85\x98\x02'R71\x9a171\x9a17P\x04\ +^\xfd\x83ov\x1b6\x01\x9c\x01u\xfd\x94\x17>?\ +;\x15\x97\x01\x8a\x01/\xfe\x8c\xfd\xff\xe9\x01\x81\xfe\x7f\ +\x05\xa4X\xacffff\xacX\x00\x00\x01\x00w\xfe\ +\x14\x05#\x05\xcb\x00\x17\x003@\x19\x17\x16\x16\x10\x09\ +\x09\x19\x10\x03\x03\x18\x17\x1b\x07\x0dLY\x07\x04\x00\x12\ +LY\x00\x13\x00?+\x00\x18?+\x00\x18?\x11\x01\ +3\x113\x113\x11\x129\x11310\x05 \x00\x11\ +4\x12$32\x17\x07&&#\x22\x02\x15\x10!2\ +67\x11!\x03Z\xfe\x99\xfe\x84\xb2\x01M\xe2\xe1\xea\ +e[\xb9Z\xc3\xd7\x01\x9e:\xb3N\xfe\xcb\x14\x01\x83\ +\x01j\xe3\x01W\xb8g\xfc':\xfe\xfa\xec\xfe\x17\x13\ +\x11\xfd\x02\x00\x01\x00\x5c\xfe\x14\x03\xf0\x04s\x00\x15\x00\ +3@\x19\x15\x14\x14\x08\x0e\x08\x17\x0e\x03\x03\x16\x15\x1b\ +\x06\x0bGY\x06\x10\x00\x11GY\x00\x16\x00?+\x00\ +\x18?+\x00\x18?\x11\x013\x113\x113\x11\x129\ +\x11310\x05&\x00\x11\x10\x00!2\x17\x07&#\ +\x22\x06\x15\x14\x16327\x11!\x02Z\xfc\xfe\xfe\x01\ +\x0e\x01!\xb8\xadX\xadh~r\x81w}\x83\xfe\xcf\ +\x10\x13\x01\x1f\x01\x07\x01*\x01 P\xe8B\xa9\xa9\x9c\ +\xac%\xfd\x0c\x00\x00\x01\x00h\xff\xfa\x04y\x05\x0a\x00\ +\x13\x00\x12\xb6\x07\x11\x14\x15\x0e\x04\x12\x00?/\x11\x12\ +\x019910\x01\x05\x07%\x03'\x13%7\x05\x13\ +%7\x05\x13\x17\x03\x05\x07%\x02L\x01\x1cG\xfe\xe3\ +\xb4\x81\xb4\xfe\xe5F\x01\x1f\xc6\xfe\xe4G\x01\x1d\xb6\x7f\ +\xb6\x01\x1fJ\xfe\xe5\x01\xb0\xa6{\xa4\xfe\xc7J\x01;\ +\xa4{\xa4\x01Z\xa4}\xa4\x019I\xfe\xc4\xa4{\xa4\ +\x00\x00\x01\x00\xb4\x04{\x03\xc5\x05\xcd\x00\x10\x00 @\ +\x0d\x09\x0d\x06\x00\x06\x06\x11\x12\x0b\x08\x08\x03\x00\x00/\ +\xc93\x10\xc8\x11\x12\x019\x113\x10\xc9210\x01\ +\x06\x06#\x22&543!632\x15\x14\x06#\ +\x01\x8b\x066083m\x01\xcb\x0abm69\x04\ +\xd9+3G8u^s9H\x00\x00\x01\x00\xf4\x04\ +\xd7\x04\x0c\x06\x14\x00\x15\x00\x1e@\x0c\x0a\x0b\x14\x16\x17\ +\x15\x14\x14\x0e\x0e\x05\x0b\x00/\xcc2\x129/3\x11\ +\x12\x019\xca210\x012>\x0232\x16\x16\x15\ +\x15#&&#\x22\x06\x07\x06##5\x01\x02N\x85\ +wp:in?\xb6\x0b+.\x1eIJ\x86\xb7\x10\ +\x05\x9c%-&6ua1;4\x18\x1e7\xc3\x00\ +\x01\x01\xcd\x04\xc3\x03\x04\x06X\x00\x11\x00$@\x0f\x0c\ +\x03\x08\x0f\x08\x08\x12\x13\x0f\x08\x08\x0b\x0b\x00\x0c\x00/\ +\xcc3\x119\x113\x11\x12\x019\x113\x10\xc891\ +0\x012\x16\x15\x14\x0e\x02\x15\x14\x16\x17\x15&&5\ +46\x02oGN%-%D1~\xb7U\x06X\ +:5\x1b\x1a\x11\x11\x13 :\x0cV\x06\x89`MY\ +\x00\x00\x01\x01\xcb\x04\xc3\x03\x02\x06X\x00\x11\x00$@\ +\x0f\x03\x0c\x07\x00\x07\x07\x12\x13\x00\x07\x07\x04\x0f\x04\x03\ +\x00/3\xcc\x119\x113\x11\x12\x019\x113\x10\xc8\ +910\x01\x14\x06\x0756654.\x0254\ +632\x16\x03\x02\xb6\x7f0E%-%NGN\ +T\x05\xb2^\x8b\x06V\x0b; \x13\x11\x11\x1a\x1b5\ +:Y\x00\x00\x08\x00)\xfe\xc1\x07\xc1\x05\x91\x00\x0c\x00\ +\x1a\x00(\x006\x00D\x00R\x00_\x00m\x00\x9a@\ +JP4,H,,\x18ck:\x1e&B&&\ +^\x03\x10\x18\x0b\x18\x18k^VkVnod^\ +WjgS``gIA;O7EE>L\ +LZ\x07-%\x1f3\x1b))\x2200\x14ZZ\ +gg\x07\x11\x17\x0d\x14\x04\x0a\x00\x07\x00/3\xca2\ +/3\xca2\x129/3\x11\x129/33\x113\ +\xca222\x11\x129/33\x113\xca222\ +\x113\x113\x10\xca222\x11\x12\x0199\x10\xc8\ +\x119\x113\x10\xc82\x119\x113\x10\xc82\x10\xc8\ +\x119\x113\x10\xc8210\x012\x16\x17#&&\ +#\x22\x06\x07#6\x132\x16\x17#&&#\x22\x06\ +\x07#66\x012\x16\x17#&&#\x22\x06\x07#\ +66!2\x16\x17#&&#\x22\x06\x07#66\ +\x012\x16\x17#&&#\x22\x06\x07#66!2\ +\x16\x17#&&#\x22\x06\x07#66\x012\x16\x17\ +#&&#\x22\x06\x07#6!2\x16\x17#&&\ +#\x22\x06\x07#66\x03\xe9]q\x07O\x05\x00\ +b@3\x1b/2),\x00\x06\x08\x0e!$6:\ +\x13:$\x0e\x06,2\x06\x1e\x16\x1e\x16?@ #\ +03\x18\x1e\x10\x167;(++;\x16\x1e3#\ +\x06\x06\x0c\x0e\x04\x06\x00/3/3\x12\x179\x113\ +\x113\x113\x113\x113\x113\x11\x12\x0199\x11\ +\x12\x1793\x113\x113\x113\x113\x113\x113\ +210\x05\x06\x06\x07#673\x036673\ +\x06\x07#\x01\x16\x16\x17\x15&'5\x05&&'5\ +\x16\x17\x15\x01\x17\x06\x07'766\x01'67\x17\ +\x07\x06\x037\x16\x17\x07'&\x01\x07&&'7\x17\ +\x16\x16\x04B\x11F$a5\x11\x8b\xd1\x13I\x1fa\ +4\x12\x8b\x02\xbcG\xc8A\xdd\x81\xfbZB\xbfO\xdd\ +\x81\x04\xecE\xb1xb\x02C\xbe\xfb\x03E\xb1xb\ +\x02\x9b\x98C{Lb\x11R\x04\xd7C\x1f\x82&b\ +\x11'Z1B\xbfO\xdd\x81\x04\xa6G\xc8A\xdc\x82\ +\xfe!\x13I\x1fa5\x11\x8b\xd1\x11F$a5\x11\ +\x8b\x02\xddDnXb\x10'X\xfa\xfcDnXb\ +\x10Y\x04\xeeF\xc6cb\x02\x8c\xfbxF2\xc34\ +b\x02E\xc2\x00\x00\x03\x00\xb8\xfeV\x07+\x07\x91\x00\ +\x13\x00!\x00\x22\x00[@-\x14!\x1b\x1a\x1b\x1b\x13\ +\x12\x06\x02\x0d\x02\x13\x13#\x0d\x08\x0c\x0b\x0b\x0a\x09\x09\ +\x08\x08\x22\x0d\x08LY\x0d\x04\x11\x00\x13\x12\x0b'!\ +\x1a\x1e\x17\x06\x00\x03\x00?2\xde2\xcd2??\x12\ +993+\x01\x18/3\x113\x10\xc12\x129\x11\ +3\x113\x113\x11\x1299\x129\x113\x10\xc22\ +10\x13!\x11\x07\x073\x01!\x11!\x03!\x13!\ +\x114\x13#\x01!\x01\x06\x06#\x22&'!\x16\x16\ +3267\x01\xb8\x01\x17\x04\x0a\x06\x02\xa3\x01s\x01\ +N\xb2\xfe\xa8\xbc\xfe\xec\x12\x08\xfdZ\xfe\x8b\x04w\x13\ +\xf4\xe6\xed\xe3\x0e\x01\x11\x07Ysce\x0b\x02{\x05\ +\xb6\xfd>\xbd\xd7\x04V\xfbT\xfdL\x01\xaa\x02\xbe\x8d\ +\x01\x15\xfb\xa0\x07\x91\xbb\xab\xa4\xc2gS[_\xf8o\ +\x00\x00\x03\x00\xa0\xfeo\x06N\x06?\x00\x11\x00 \x00\ +!\x00_@/ \x12\x19\x19\x1a\x1a\x10\x0f\x04\x01\x0b\ +\x01\x10\x10\x22\x0b\x06\x0a\x09\x09\x08\x07\x07\x06\x06! \ +\x19\x1d\x15@\x03\x0e\x0b\x04\x11\x0f\x10\x15\x0b\x06FY\ +\x0b\x15\x09#\x00??+\x00\x18??3\x1299\ +\x1a\xde2\xcd2\x01/3\x113\x10\xc12\x129\x11\ +3\x113\x113\x11\x1299\x129\x113\x10\xc02\ +10\x01\x11\x14\x03\x01!\x11!\x03!\x13!\x114\ +7\x01!\x11\x01\x06\x06#\x22&&'!\x16\x163\ +267\x01\x01\xc7\x17\x02\x04\x01o\x01+\x92\xfe\xde\ +\x89\xfe\xd9\x14\xfd\xfe\xfe\x92\x04)\x15\xf3\xe6\xa1\xcbg\ +\x0a\x01\x10\x09Yqgd\x08\x02\x0f\x04^\xfeFF\ +\xfe\xf0\x03\x10\xfc\x81\xfd\x90\x01\x91\x01\xbew\xd9\xfc\xf2\ +\x04^\x01\xe1\xbd\xa9J\x96\x86lN_[\xf9\xc1\x00\ +\x02\x00/\x00\x00\x04\xbe\x05\xb6\x00\x11\x00\x1a\x00N@\ +(\x02\x12\x16\x08\x08\x1c\x04\x00\x12\x12\x0f\x0d\x0b\x0b\x1b\ +\x04\x1aLY\x03\x0d\x0e\x0dLY\x00\x0e\x04\x0e\x04\x0e\ +\x0b\x10\x03\x0b\x12LY\x0b\x12\x00?+\x00\x18?\x12\ +99//\x113+\x11\x003+\x11\x013\x113\ +33\x1133\x113\x113\x12910\x01!\x15\ +!\x153 \x04\x15\x10!!\x11#535!\x11\ +32654&##\x01\xee\x01+\xfe\xd5z\x01\ +\x1e\x018\xfd\xa4\xfeV\x89\x89\x016h\x9d\x92\x94\xb4\ +O\x05\x1f\xfe\x9c\xe8\xd4\xfe7\x04!\xfe\x97\xfbHe\ +feY\x00\x02\x00\x04\x00\x00\x04\xa2\x06\x14\x00\x11\x00\ +\x19\x00P@)\x06\x17\x12\x0c\x0c\x1b\x08\x04\x17\x17\x11\ +\x01\x0f\x0f\x1a\x07\x11\x00\x11JY\x08\x16JY\x08\x08\ +\x04\x04\x00\x00\x0f\x02\x0f\x17JY\x0f\x15\x02\x00\x00?\ +?+\x11\x12\x009\x18/3\x119/++\x11\x00\ +3\x11\x013\x11333\x1133\x113\x113\x12\ +910\x1335!\x15!\x15!\x113 \x16\x15\ +\x10!!\x11#\x014&##\x1132\x04\x9c\x01\ +1\x01y\xfe\x87\xd7\x01\x02\xf8\xfe\x12\xfd\xec\x9c\x03m\ +hg\xd1\xd5\xcb\x055\xdf\xdf\xc6\xfe?\xa4\xa6\xfe\x9c\ +\x04o\xfc\xf1A:\xfe\xf8\x00\x00\x02\x00\xb8\x00\x00\x04\ +\xaa\x05\xb6\x00\x0f\x00\x1b\x00u@;\x03\x15\x04\x14\x06\ +\x12\x05\x13\x13\x14\x14\x10\x17\x17\x05\x04\x04\x0a\x00\x1d\x10\ +\x0a\x0a\x0b\x0b\x1c\x03\x06\x00\x09\x00\x17\x15\x12\x14\x10\x14\ +\x13\x17\x13\x1b\x10\x0c\x1bLY\x09\x10LY\x04\x05\x09\ +\x09\x0b\x0c\x03\x0b\x12\x00??\x129/\xca2++\ +\x11\x12\x0099\x113\x11\x1299\x113\x11\x129\ +9\x11\x013\x113\x113\x113\x119\x1132\x11\ +\x129\x113\x11\x1299\x11\x129910\x01\x14\ +\x06\x07\x17\x07'\x06##\x11!\x11! \x04\x013\ +7'7\x17654&##\x04\xaa_]X\x98\ +sVr\x85\xfe\xca\x01\xd3\x01\x0a\x01\x15\xfdD\x91\x17\ +:\x9aR)w\x7f\x8d\x03\xee\x81\xc9>}p\xa4\x15\ +\xfd\xf8\x05\xb6\xe5\xfe5\x02Rou5Zmh\x00\ +\x02\x00\xa0\xfe\x14\x04\xb4\x04s\x00\x17\x00(\x00\x81@\ +A\x16!\x15\x22\x13$\x14\x22##\x1c&&\x11\x15\ +\x14\x14\x11\x11*\x1c\x03\x0a\x06\x06\x07\x07)!$\x1f\ +##\x22\x16\x13\x00\x11\x11&\x22&\x1f\x18\x0e\x18G\ +Y\x0a\x03\x00\x0e\x10\x08\x0f\x07\x1b\x00\x1fGY\x14\x15\ +\x00\x16\x00?\xca2+\x00\x18???\x1299+\ +\x11\x12\x0099\x113\x11\x1299\x113\x11\x129\ +9\x11\x013\x113\x12992\x113\x119\x113\ +\x113\x11\x129\x113\x1299\x11\x129910\ +\x05\x22'#\x16\x15\x11!\x113\x1736632\ +\x12\x11\x10\x07\x17\x07'\x06\x03\x22\x06\x07\x15\x14\x163\ +37'7\x17654&\x03\x06\xc5p\x10\x10\xfe\ +\xcf\xf8+\x106\xa2c\xc6\xe0\x91^\x9el4\x97q\ +h\x02kt\x11\x12f\xa7R\x17e\x14\x8f\x8c\x16\xfe\ +;\x06J\x91SS\xfe\xce\xfe\xf0\xfe\xd1\xa0{v\x8b\ +\x10\x03\x93\x8b\xa0!\xb4\x9c\x02\x7f{dNl\xa5\xa5\ +\x00\x00\x01\x00/\x00\x00\x04P\x05\xb6\x00\x0d\x00A@\ + \x05\x07\x00\x00\x0f\x03\x07\x07\x0c\x0a\x08\x08\x0e\x06\x0a\ +\x0b\x0aLY\x03\x0b\x0b\x08\x0d\x0d\x02LY\x0d\x03\x08\ +\x12\x00??+\x11\x12\x009\x18/3+\x11\x003\ +\x11\x013\x11333\x113\x113\x11\x12910\ +\x01\x15!\x11!\x15!\x11!\x11#53\x11\x04P\ +\xfd\x9e\x01\x91\xfeo\xfe\xca\x89\x89\x05\xb6\xfe\xfe\x9a\xfe\ +\xfd\xac\x02T\xfe\x02d\x00\x01\x00\x04\x00\x00\x03\xbe\x04\ +^\x00\x0d\x00A@ \x05\x07\x00\x00\x0f\x03\x07\x07\x0c\ +\x0a\x08\x08\x0e\x06\x0a\x0b\x0aFY\x03\x0b\x0b\x08\x0d\x0d\ +\x02GY\x0d\x0f\x08\x15\x00??+\x11\x12\x009\x18\ +/3+\x11\x003\x11\x013\x11333\x113\x11\ +3\x11\x12910\x01\x15!\x15!\x15!\x11!\x11\ +#53\x11\x03\xbe\xfe\x00\x01L\xfe\xb4\xfe\xcf\x89\x89\ +\x04^\xf8\xd9\xeb\xfe^\x01\xa2\xeb\x01\xd1\x00\x00\x01\x00\ +\xb8\xfe\x00\x05y\x05\xb6\x00\x1e\x00U@+\x16\x03\x1c\ +\x1c\x07\x09\x0f\x0f \x09\x03\x03\x04\x04\x1f\x0f\x1c\x1c\x00\ +\x17\x19\x13\x19LY\x13\x1c\x0b\x00LY\x0b\x0b\x04\x05\ +\x05\x08LY\x05\x03\x04\x12\x00??+\x11\x12\x009\ +\x18/+\x00\x18?+\x11\x003\x129\x113\x11\x01\ +3\x113\x113\x113\x11\x1293\x11\x12910\ +\x01\x22\x07\x11!\x11!\x15!\x11632\x04\x12\x15\ +\x14\x02\x06#\x22&'\x11\x1632654&\x02\ +m5J\xfe\xca\x03\x98\xfd\x9ek\x95\xc1\x011\x99\x8b\ +\xfb\x99n\x8bJ\x81\x85\x8b\xa2\xe6\x02\x19\x0d\xfd\xf4\x05\ +\xb6\xfe\xfeo\x0c\xaa\xfe\xd1\xcd\xc3\xfe\xd7\xa1\x16\x19\x01\ +\x10/\xcd\xb0\xc4\xc8\x00\x00\x01\x00\xa0\xfe\x0a\x04\x89\x04\ +^\x00\x1d\x00Y@-\x16\x18\x00\x06\x13\x0d\x0d\x00\x00\ +\x1f\x18\x12\x12\x13\x13\x1e\x00\x0d\x0d\x0a\x0f\x1a\x0fHY\ +\x1a\x1a\x13\x14\x14\x17GY\x14\x0f\x13\x15\x07\x0a\x04\x0a\ +HY\x04\x1b\x00?+\x11\x003\x18??+\x11\x12\ +\x009\x18/+\x11\x12\x009\x113\x11\x013\x113\ +\x113\x113\x113\x11\x129\x11\x12910%\x14\ +\x02\x06#\x22'\x11\x16\x163265\x10!\x22\x07\ +\x11!\x11!\x15!\x15632\x16\x12\x04\x89z\xe0\ +\x93\x8er-y1t}\xfe\xc5*.\xfe\xcf\x031\ +\xfe\x00JK\x9e\xfb\x8aD\xb3\xfe\xfe\x853\x01\x07\x18\ +\x1e\xa3\x97\x011\x06\xfe\x8d\x04^\xf8\xf1\x0c\x8c\xfe\xfc\ +\x00\x00\x02\x00\x00\xfeV\x08\x12\x05\xb6\x00\x15\x00\x16\x00\ +n@6\x0a\x09\x09\x06\x11\x11\x03\x00\x12\x12\x16\x15\x02\ +\x01\x01\x14\x15\x15\x17\x0d\x0c\x0c\x16\x07\x08\x08\x0f\x16\x16\ +\x17\x0f\x0aLY\x0f\x15\x10\x06\x09\x09\x13\x03\x00\x00\x01\ +\x12\x15\x12\x0d'\x07\x04\x01\x03\x00?33??3\ +\x129\x11333\x1133\x113+\x11\x003\x01\ +\x18/33\x113\x113\x113\x113\x1133\x11\ +3\x11\x129\x11333\x1133\x11910\x01\ +\x01!\x01\x11!\x11\x01!\x01\x01!\x11!\x11#\x01\ +\x11!\x11\x01!!\x02\x08\xfe\x15\x01?\x01\xd9\x01!\ +\x01\xd9\x01@\xfe\x14\x01R\x01=\xfe\xd5\xa8\xfe\x17\xfe\ +\xdf\xfe\x17\xfe\xb4\x07\x8b\x02\xf8\x02\xbe\xfd<\x02\xc4\xfd\ +<\x02\xc4\xfdB\xfe\x12\xfdL\x01\xaa\x02\xe5\xfd\x1b\x02\ +\xe5\xfd\x1b\x00\x02\x00\x00\xfeo\x07X\x04^\x00\x15\x00\ +\x16\x00i@4\x07\x06\x15\x14\x14\x12\x06\x03\x0e\x0e\x13\ +\x00\x0f\x0f\x16\x11\x12\x12\x17\x0a\x09\x09\x16\x04\x05\x05\x0c\ +\x16\x0d\x03\x06\x06\x10\x00\x13\x13\x0f\x04\x01\x14\x0f\x0f\x12\ +\x15\x0c\x07FY\x0c\x15\x0a#\x00??+\x00\x18?\ +3?33\x129\x11333\x1133\x01/3\ +3\x113\x113\x113\x113\x113\x129\x1133\ +3\x1133\x113\x113\x11910\x01\x11!\x11\ +\x01!\x01\x01!\x11!\x11#\x01\x11!\x11\x01!\x01\ +\x01!\x01\x02\xf0\x01\x1c\x01\x8e\x01;\xfed\x01\x15\x01\ +\x0a\xfe\xee\x90\xfeV\xfe\xe4\xfeV\xfe\xba\x01\xc3\xfed\ +\x01;\x05\x9a\x02?\x02\x1f\xfd\xe1\x02\x1f\xfd\xe8\xfe\x99\ +\xfd\x90\x01\x91\x027\xfd\xc9\x027\xfd\xc9\x02F\x02\x18\ +\xfb\xa2\x00\xff\xff\x00^\xfe\x14\x04\xd7\x05\xcb\x02&\x01\ +\xb1\x00\x00\x00\x07\x03\x7f\x01\x9e\x00\x00\xff\xff\x00N\xfe\ +\x14\x04#\x04s\x02&\x01\xd1\x00\x00\x00\x07\x03\x7f\x01\ +1\x00\x00\x00\x02\x00\xb8\xfeV\x05\xe3\x05\xb6\x00\x0e\x00\ +\x0f\x00J@$\x00\x0f\x0e\x0e\x0b\x07\x07\x08\x10\x0c\x0d\ +\x0d\x0f\x03\x02\x02\x05\x0f\x0b\x06\x0e\x0e\x08\x0c\x09\x03\x05\ +\x00LY\x05\x0f\x08\x12\x03'\x00??33+\x00\ +\x18?3\x129\x1133\x01/33\x113\x113\ +\x113\x1132\x1133\x11\x12910\x01!\x11\ +!\x11#\x01\x11!\x11!\x11\x01!\x01\x01\x04\x9c\x01\ +G\xfe\xd5\xb8\xfd\xee\xfe\xca\x016\x02\x0c\x01J\xfd\xeb\ +\x021\x01\x0a\xfdL\x01\xaa\x02\xe5\xfd\x1b\x05\xb6\xfd<\ +\x02\xc4\xfdB\xfd\x08\x00\x00\x02\x00\xa0\xfeo\x055\x04\ +^\x00\x0e\x00\x0f\x00M@&\x03\x0f\x02\x02\x0e\x0a\x0a\ +\x0b\x10\x06\x05\x05\x0f\x00\x01\x01\x08\x0f\x0e\x09\x02\x02\x0b\ +\x00\x0c\x0f\x0b\x15\x0f\x08\x08\x03FY\x08\x15\x06#\x00\ +??+\x11\x003\x18??3\x129\x1133\x01\ +/33\x113\x113\x113\x1132\x1133\x11\ +\x12910\x01!\x01\x013\x11!\x11#\x01\x11!\ +\x11!\x11\x01\x03}\x01P\xfeE\x01)\xfa\xfe\xee\x89\ +\xfe7\xfe\xcf\x011\x03#\x04^\xfd\xe8\xfe\x99\xfd\x90\ +\x01\x91\x027\xfd\xc9\x04^\xfd\xe1\xfd\xc1\x00\x00\x01\x00\ +\xb8\x00\x00\x05P\x05\xb6\x00\x13\x00a@/\x0b\x07\x0c\ +\x06\x11\x10\x00\x0e\x00\x0c\x0d\x0d\x0f\x0b\x11\x11\x0e\x08\x00\ +\x00\x01\x10\x10\x0f\x0f\x15\x06\x01\x01\x03\x14\x0d\x0c\x0c\x04\ +\x01\x06\x09\x06\x13\x03\x03\x04\x03\x10\x03\x12\x00?3?\ +\x12\x179\x113\x113\x113\x11\x0132\x113\x11\ +3\x113\x11\x129\x11333\x113\x113\x113\ +\x0099\x11\x129\x11\x129910\x01\x07\x11!\ +\x11!\x1177\x113\x15\x01!\x01\x01!\x01\x15#\ +\x02j|\xfe\xca\x016z\x02\x86\x01\x04\x01X\xfe\x02\ +\x02\x02\xfe\xa0\xff\x00\x86\x02dZ\xfd\xf6\x05\xb6\xfdc\ +\xac\x02\x01b\xba\x01G\xfdy\xfc\xd1\x01\x9c\xde\x00\x00\ +\x01\x00\xa0\x00\x00\x04\xcb\x04^\x00\x12\x00U@)\x0c\ +\x0f\x0b\x10\x06\x03\x07\x02\x07\x08\x08\x0b\x0a\x0a\x14\x06\x0c\ +\x0c\x03\x0f\x10\x09\x02\x10\x10\x12\x12\x13\x10\x02\x09\x04\x09\ +\x0e\x03\x0b\x12\x15\x07\x00\x0f\x00?2?3\x179\x11\ +33\x11\x013\x113\x1133\x10\xca22\x113\ +\x113\x1133\x113\x11\x12\x0099\x11\x1299\ +10\x13!\x117\x113\x157!\x01\x01!\x03\x15\ +#\x11'\x11!\xa0\x01\x1cc\x91\xb8\x01<\xfeE\x01\ +\xe2\xfe\xba\xd7\x91a\xfe\xe4\x04^\xfd\xe1{\x01<\x81\ +\xe9\xfd\xe8\xfd\xba\x01\x0a\xb0\x01dy\xfd\xc9\x00\x01\x00\ +\x04\x00\x00\x05%\x05\xb6\x00\x14\x00`@/\x0c\x0f\x0f\ +\x0b\x08\x04\x10\x14\x01\x12\x12\x15\x0a\x0b\x0b\x0e\x0d\x0d\x16\ +\x0c\x0f\x0f\x10\x0b\x10\x08\x08\x02\x0e\x0e\x12\x07\x14\x00\x14\ +LY\x04\x00\x00\x02\x12\x12\x0b\x0a\x02\x03\x00?33\ +?\x129/3+\x11\x003\x113\x11\x129\x113\ +\x11\x129\x113\x11\x013\x1133\x113\x113\x11\ +33322\x119\x11310\x1335!\x15\ +3\x15#\x117\x01!\x01\x01!\x01\x07\x11!\x11#\ +\x04\x89\x016\x89\x89z\x01\x8c\x01X\xfe\x02\x02\x02\xfe\ +\xa0\xfe\x81\x83\xfe\xca\x89\x05/\x87\x87\xfe\xfe\xe8\xac\x01\ +\xf1\xfdy\xfc\xd1\x02h^\xfd\xf6\x041\x00\x00\x01\x00\ +\x04\x00\x00\x04\xf6\x06\x14\x00\x16\x00h@3\x0e\x11\x11\ +\x0d\x12\x06\x08\x0c\x0c\x0d\x0d\x10\x0f\x0f\x18\x09\x14\x08\x04\ +\x12\x12\x16\x01\x14\x14\x17\x0e\x11\x11\x12\x12\x09\x09\x0d\x10\ +\x14\x15\x07\x16\x00\x16JY\x04\x00\x00\x02\x0d\x0f\x02\x00\ +\x00??\x129/3+\x11\x003\x18?3\x129\ +\x113\x119\x113\x11\x013\x11333\x1133\ +\x129\x113\x1133\x113\x11\x129\x11\x129\x11\ +310\x1335!\x15!\x15!\x11\x0737\x01\ +!\x01\x01!\x01\x07\x11!\x11#\x04\x9c\x011\x01;\ +\xfe\xc5\x10\x04\x85\x019\x01X\xfeD\x01\xd7\xfe\xa0\xfe\ +\xbe\x83\xfe\xcf\x9c\x05s\xa1\xa1\xc7\xfe\xb2\xfe\xaa\x01T\ +\xfe\x1b\xfd\x87\x01\xc5i\xfe\xa4\x04\xac\x00\x02\x00\x00\x00\ +\x00\x05\xdd\x05\xb6\x00\x0e\x00\x0f\x00Q@'\x06\x09\x05\ +\x02\x0a\x0a\x0c\x0c\x0f\x11\x04\x05\x05\x08\x07\x07\x11\x00\x10\ +\x06\x09\x09\x0a\x05\x0a\x02\x02\x00\x08\x0c\x12\x05\x00\x00\x0e\ +LY\x00\x03\x00?+\x11\x003\x18?3\x129\x11\ +3\x11\x129\x113\x11\x013\x113\x1133\x113\ +\x10\xc42\x113\x113\x129910\x11!\x117\ +\x01!\x01\x01!\x01\x07\x11!\x11!\x13\x02{{\x01\ +\x8b\x01X\xfe\x02\x02\x02\xfe\xa0\xfe\x81\x83\xfe\xcb\xfe\xba\ +\x8d\x05\xb6\xfdc\xac\x01\xf1\xfdy\xfc\xd1\x02h^\xfd\ +\xf6\x04\xb4\xfbL\x00\x02\x00\x00\x00\x00\x05\x8f\x04^\x00\ +\x0c\x00\x0d\x00F@\x22\x07\x06\x03\x04\x04\x06\x06\x0f\x00\ +\x0e\x05\x02\x09\x09\x0a\x0a\x0d\x0f\x08\x02\x05\x05\x00\x07\x0a\ +\x15\x03\x0f\x00\x0cFY\x00\x0f\x00?+\x00\x18??\ +3\x129\x1133\x01\x10\xc42\x113\x1133\x11\ +3\x113\x113\x113\x11310\x11!\x11\x01!\ +\x01\x01!\x01\x11!\x11!\x13\x02\x81\x01\xac\x01;\xfe\ +F\x01\xe1\xfe\xbb\xfe7\xfe\xe3\xfe\x9c\xc4\x04^\xfd\xe1\ +\x02\x1f\xfd\xe8\xfd\xba\x027\xfd\xc9\x03y\xfc\x87\x00\x00\ +\x02\x00\xb8\xfeV\x06\x91\x05\xb6\x00\x0f\x00\x10\x00F@\ +#\x0c\x08\x08\x09\x09\x11\x0d\x05\x05\x00\x03\x02\x02\x00\x00\ +\x10\x0c\x07LY\x0c\x0c\x09\x0e\x0a\x03\x05\x00LY\x05\ +\x09\x12\x03'\x00??3+\x00\x18?3\x129/\ ++\x01\x18/3\x113\x113\x113\x113\x113\x11\ +3\x11310\x01!\x11!\x11!\x11!\x11!\x11\ +!\x11!\x11!\x13\x05f\x01+\xfe\xd5\xfe\xcb\xfd\xbd\ +\xfe\xca\x016\x02C\x015\xb9\x01\x0a\xfdL\x01\xaa\x02\ +w\xfd\x89\x05\xb6\xfd\xc3\x02=\xfaJ\x00\x02\x00\xa0\xfe\ +o\x05\xc1\x04^\x00\x0f\x00\x10\x00G@$\x01\x0d\x0d\ +\x0e\x0e\x11\x02\x0a\x0a\x05\x08\x07\x07\x05\x05\x10\x01\x0cF\ +Y\x01\x01\x0a\x03\x0f\x0f\x0e\x15\x0a\x05FY\x0a\x15\x08\ +#\x00??+\x00\x18??3\x129/+\x01\x18\ +/3\x113\x113\x113\x113\x113\x113\x113\ +10\x01\x11!\x11!\x11!\x11!\x11!\x11!\x11\ +!\x11\x01\x01\xd1\x01\xaa\x011\x01\x15\xfe\xed\xfe\xcd\xfe\ +V\xfe\xcf\x04\xac\x04^\xfeR\x01\xae\xfc\x81\xfd\x90\x01\ +\x91\x01\xcd\xfe3\x04^\xfb\xa2\x00\x02\x00\xb8\x00\x00\x06\ +\xac\x05\xb6\x00\x0d\x00\x0e\x00B@!\x00\x10\x0a\x06\x06\ +\x07\x07\x0f\x0b\x03\x03\x02\x02\x0e\x0a\x05LY\x0a\x0a\x07\ +\x0c\x0c\x01LY\x0c\x03\x08\x03\x03\x07\x12\x00?3?\ +?+\x11\x12\x009\x18/+\x01\x18/3\x113\x11\ +3\x113\x113\x113\x11310\x01!\x11!\x11\ +!\x11!\x11!\x11!\x11!\x03\x06\xac\xfe\xba\xfe\xcb\ +\xfd\xbd\xfe\xca\x016\x02C\x02{\x8d\x04\xb4\xfbL\x02\ +w\xfd\x89\x05\xb6\xfd\xc3\x02=\xfaJ\x00\x02\x00\xa0\x00\ +\x00\x06\x10\x04^\x00\x0d\x00\x0e\x00A@ \x05\x10\x01\ +\x0b\x0b\x0c\x0c\x0f\x02\x08\x08\x07\x07\x0e\x0d\x0f\x01\x0aF\ +Y\x01\x01\x03\x08\x0c\x15\x03\x06FY\x03\x0f\x00?+\ +\x00\x18?3\x129/+\x00\x18?\x01/3\x113\ +\x113\x113\x113\x113\x11310\x01\x11!\x11\ +!\x15!\x11!\x11!\x11!\x11\x01\x01\xd1\x01\xaa\x02\ +\x95\xfe\x9c\xfe\xcf\xfeV\xfe\xcf\x04\xac\x04^\xfeR\x01\ +\xae\xe5\xfc\x87\x01\xcd\xfe3\x04^\xfb\xa2\x00\x00\x01\x00\ +\xb8\xfe\x00\x08\x9a\x05\xb6\x00 \x00]@/\x0d\x13\x00\ +\x19\x19\x1a\x1a\x1e\x13\x13\x06\x06\x22\x1d\x1e\x1e!\x06\x13\ +\x13\x16\x10\x02\x16LY\x02\x02\x1e\x1f\x1f\x1cLY\x1f\ +\x03\x1a\x1e\x12\x0e\x10\x0a\x10LY\x0a\x1c\x00?+\x11\ +\x003\x18?3?+\x11\x12\x009\x18/+\x11\x12\ +\x009\x113\x11\x013\x113\x113\x113\x11\x129\ +\x113\x113\x12910\x01632\x04\x12\x15\x14\ +\x02\x06#\x22&'\x11\x1632654&#\x22\ +\x07\x11!\x11!\x11!\x11!\x05\x14s\xa6\xb9\x01\x22\ +\x92\x8b\xfb\x99m\x87P\x81\x85\x83\xaa\xd5\xe5:b\xfe\ +\xcb\xfe\x0f\xfe\xca\x04\x5c\x03#\x10\xab\xfe\xd3\xce\xc3\xfe\ +\xd7\xa1\x14\x1b\x01\x10/\xd5\xa8\xc4\xc8\x15\xfd\xfc\x04\xb4\ +\xfbL\x05\xb6\x00\x00\x01\x00\xa0\xfe\x0a\x06\xd5\x04^\x00\ +\x1e\x00]@/\x1a\x12\x12\x06\x13@\x13\x17\x0d\x0d\x00\ +\x00 \x16\x17\x17\x1f\x00\x0d\x0d\x11\x0a\x1b\x11HY\x1b\ +\x1b\x17\x18\x18\x15FY\x18\x0f\x13\x17\x15\x07\x0a\x04\x0a\ +HY\x04\x1b\x00?+\x11\x003\x18?3?+\x11\ +\x12\x009\x18/+\x11\x12\x009\x113\x11\x013\x11\ +3\x113\x113\x11\x129\x1a\x10\xca3\x11310\ +%\x14\x02\x06#\x22'\x11\x16\x1632654&\ +##\x11!\x11!\x11!\x11!\x1172\x16\x12\x06\ +\xd5y\xe0\x95\x8er-y1s\x7f\x9b\x96\x06\xfe\xcf\ +\xfe\x89\xfe\xcf\x03\xd9P\x97\xf1\x84D\xb3\xff\x00\x873\ +\x01\x07\x18\x1e\xa3\x97\x95\x9c\xfe\x87\x03y\xfc\x87\x04^\ +\xfe\x1f\x04\x8d\xfe\xfd\x00\x00\x02\x00w\xff\xac\x05\xfa\x05\ +\xcd\x00)\x004\x00z@? \x0c\x0322/*\ +/$$\x11\x17\x1c**\x08\x00\x006\x1c\x11\x115\ +$/\x00*/*,2',MY'\x10\x14\x1a\ +LY\x14\x04\x0c\x0e\x03\x03\x0522!\x1f\x0e\x1fL\ +Y\x0a\x05MY\x0a\x0e\x13\x00?\xc4++\x11\x003\ +3\x11\x129\x11\x129\x18?+\x00\x18?+\x11\x12\ +\x0099\x113\x113\x11\x013\x113\x113\x113\ +3\x11\x129\x129\x113\x11\x129\x113331\ +0\x01\x14\x06\x07\x16327\x15\x06#\x22'\x06#\ + \x00\x11\x10\x00!2\x16\x17\x07&# \x11\x14\x16\ +327&&54632\x16\x054#\x22\x06\ +\x15\x14\x16\x1766\x05\xcdbq.BLD>t\ +\xad\x91h\x92\xfe\xca\xfe\x9d\x01E\x01>8\x92.N\ +\x5cN\xfe\xb6\xc8\xb1\x19\x06?M\xc7\xbf\xbb\xd0\xfe\xeb\ +p7>8&=J\x02\xa6\x8f\xf7p\x10\x16\xf1\x19\ +b\x22\x01\x86\x01W\x01}\x01\x87\x19\x12\xf0\x1d\xfe\x04\ +\xe6\xfb\x04L\xf3}\xda\xe3\xf2\xdf\xe9{jz\xaf1\ +8\xb9\x00\x00\x02\x00\x5c\xff\xb8\x04\xfa\x04s\x00*\x00\ +3\x00\x8e@H\x22\x0c\x03220+0%%\x11\ ++\x18\x17\x17\x1d++\x08\x00\x005\x1d\x11\x114\x00\ ++%0+0.2(.FY((\x0e\x14\x14\ +\x1aGY\x14\x10\x0c\x0e\x03\x032\x052 \x22\x22 \ +\x0e GY\x07\x05\x0a\x05JY\x0a\x0e\x16\x00?\xc4\ ++\x11\x003+\x11\x003\x18/\x113\x11\x129\x11\ +\x129?+\x11\x12\x009\x18/+\x11\x12\x0099\ +\x113\x113\x11\x013\x113\x113\x1133\x11\x12\ +9\x113\x11\x129\x113\x11\x129\x113331\ +0\x01\x14\x06\x07\x16327\x15\x06#\x22'\x06#\ +\x22\x00\x11\x10\x0032\x16\x17\x07&#\x22\x06\x15\x14\ +\x16327&&54632\x16\x074&#\ +\x22\x15\x14\x176\x04\xddVN\x1c*;@HT\x93\ +\x7fb\x86\xed\xfe\xe5\x01\x11\xf9*y0CX8o\ +hol\x19\x0c*\x1d\xa6\xa5\x98\xb2\xf1,-ZL\ +g\x01\xfcv\xba4\x07\x11\xd3\x17V\x22\x017\x01\x08\ +\x01\x14\x014\x16\x13\xe4\x19\xa6\xb8\x98\xa8\x04O\x81M\ +\xa7\xb1\xb9\xa59H\x83~W@\x00\xff\xff\x00w\xfe\ +\x14\x04\xd1\x05\xcb\x02&\x00&\x00\x00\x00\x07\x03\x7f\x02\ +9\x00\x00\xff\xff\x00\x5c\xfe\x14\x03\xdd\x04s\x02&\x00\ +F\x00\x00\x00\x07\x03\x7f\x01\xa0\x00\x00\x00\x01\x00)\xfe\ +V\x04y\x05\xb6\x00\x0b\x006@\x1b\x03\x02\x02\x0a\x00\ +\x00\x07\x05\x05\x0c\x0d\x0b\x07\x08\x07LY\x08\x03\x05\x00\ +LY\x05\x12\x03'\x00??+\x00\x18?+\x11\x00\ +3\x11\x12\x019\x1133\x1133\x11310\x01\ +!\x11!\x11!\x11!\x11!\x11!\x02\xec\x01+\xfe\ +\xd5\xfe\xca\xfes\x04P\xfes\x01\x0a\xfdL\x01\xaa\x04\ +\xb4\x01\x02\xfe\xfe\x00\x01\x00/\xfeo\x04=\x04^\x00\ +\x0b\x00:@\x1d\x06\x05\x05\x03\x03\x08\x08\x0a\x01\x01\x0d\ +\x0a\x0c\x02\x0a\x0b\x0aFY\x0b\x0f\x08\x03FY\x08\x15\ +\x06#\x00??+\x00\x18?+\x11\x003\x11\x013\ +\x113\x11\x129\x113\x113\x11310\x01\x15!\ +\x11!\x11!\x11!\x11!5\x04=\xfe\x92\x01\x12\xfe\ +\xee\xfe\xcf\xfe\x91\x04^\xe5\xfdf\xfd\x90\x01\x91\x03y\ +\xe5\xff\xff\x00\x00\x00\x00\x04\xfe\x05\xb6\x02\x06\x00<\x00\ +\x00\x00\x01\x00\x00\xfe\x14\x04\x98\x04^\x00\x0e\x005@\ +\x19\x00\x0e\x0e\x01\x08\x08\x04\x0c\x0c\x0d\x0d\x10\x04\x03\x03\ +\x0f\x0c\x03\x0f\x0e\x08\x02\x15\x01\x1b\x00??33?\ +3\x11\x013\x113\x113\x113\x11\x129\x1133\ +\x11310\x01!\x11\x01!\x13\x16\x17\x17367\ +\x13!\x01\x02\xe5\xfe\xcd\xfeN\x01P\xb0\x1a\x1f\x0d\x0c\ +$\x22\xb2\x01N\xfeM\xfe\x14\x01\xec\x04^\xfe\x08I\ +\x8f<\xb4`\x01\xf8\xfb\xa2\x00\x00\x01\x00\x00\x00\x00\x04\ +\xfe\x05\xb6\x00\x10\x00^@.\x0b\x06\x0f\x02\x09\x0e\x0e\ +\x00\x08\x03\x03\x00\x00\x10\x01\x01\x02\x02\x12\x10\x0f\x0f\x11\ +\x07\x0b\x0c\x0bLY\x00\x0e\x0f\x0e\x03\x03\x04\x01\x04\x0c\ +\x0c\x09\x01\x0f\x03\x09\x12\x00??3\x129/3\x11\ +\x129\x113\x11\x129+\x11\x003\x11\x013\x113\ +\x113\x113\x11\x129\x113\x113\x113\x113\x11\ +\x129910\x01\x01!\x01\x15!\x11!\x11!\x11\ +!\x11!5\x01!\x02\x7f\x011\x01N\xfe\x1b\x01?\ +\xfe\xc1\xfe\xcc\xfe\xc1\x01?\xfe\x1b\x01P\x03\x5c\x02Z\ +\xfc\x83)\xfe\xfe\xfe\xf2\x01\x0e\x01\x02\x1f\x03\x87\x00\x00\ +\x01\x00\x00\xfe\x14\x04\x98\x04^\x00\x14\x00L@%\x03\ +\x14\x14\x0f\x04\x08\x08\x0f\x0f\x0a\x12\x12\x06\x01\x09\x13\x13\ +\x16\x0a\x09\x09\x15\x12\x09\x0f\x02\x06\x07\x06FY\x14\x0e\ +\x07\x15\x04\x1b\x00??33+\x11\x003\x18?3\ +\x11\x013\x113\x113\x11\x12993\x11\x129\x11\ +3\x113\x113\x11310!\x15!\x11!\x11!\ +5!\x01!\x13\x16\x17\x17367\x13!\x01\x04\x08\ +\xfe\xdd\xfe\xcd\xfe\xdd\x01#\xfeN\x01P\xb0\x1a\x1f\x0d\ +\x0c$\x22\xb2\x01N\xfeM\xe5\xfe\xf9\x01\x07\xe5\x04^\ +\xfe\x08I\x8f<\xb4`\x01\xf8\xfb\xa2\x00\x02\x00\x00\xfe\ +V\x05\xc9\x05\xb6\x00\x0f\x00\x10\x00^@.\x00\x10\x0f\ +\x0f\x09\x06\x0c\x0c\x0b\x0d\x0b\x0a\x0a\x0d\x0e\x0e\x0a\x10\x07\ +\x08\x11\x03\x02\x02\x05\x10\x0f\x0c\x06\x09\x09\x08\x0d\x0a\x03\ +\x10\x05\x05\x00LY\x05\x08\x12\x03'\x00??3+\ +\x11\x003\x18?3\x129\x11333\x01/33\ +\x113\x1132\x1199\x1132\x113\x11\x129\ +\x11333\x11\x12910\x01!\x11!\x11#\x01\ +\x01!\x01\x01!\x01\x01!\x01\x01\x04\xa4\x01%\xfe\xd5\ +\xaa\xfe\xac\xfe\xac\xfe\xb4\x01\xe5\xfe:\x01V\x01;\x01\ +5\x01N\xfe5\x01\xee\x01\x0a\xfdL\x01\xaa\x02)\xfd\ +\xd7\x02\xf2\x02\xc4\xfd\xf2\x02\x0e\xfd+\xfd\x1f\x00\x03\x00\ +\x0a\xfeo\x05\x02\x04^\x00\x0f\x00\x10\x00\x11\x00g@\ +3\x07\x10\x06\x06\x05\x00\x01\x0d\x03\x03\x04\x02\x02\x01\x04\ +\x05\x01\x05\x10\x0e\x0f\x0f\x12\x0a\x09\x0c\x09\x10\x10\x11\x0f\ +\x15\x0d\x06\x03\x00\x00\x01\x10\x0c\x0c\x07FY\x0c\x15\x0a\ +#\x04\x01\x0f\x00?3??+\x11\x003\x129\x11\ +333\x18?\x01/3\x1133\x113\x113\x11\ +3\x1299\x113\x113\x11\x129\x113\x129\x12\ +9\x11\x12910\x01\x01!\x13\x13!\x01\x13!\x11\ +!\x11#\x03\x03!!3\x01\x85\xfe\x98\x01Z\xd9\xdb\ +\x01Z\xfe\x94\xe7\x01\x02\xfe\xee\xb5\xeb\xec\xfe\xa6\x04\x8c\ +\x0a\x02;\x02#\xfe\x9c\x01d\xfd\xdd\xfe\xa4\xfd\x90\x01\ +\x91\x01\x7f\xfe\x81\x00\x01\x00)\xfeV\x07H\x05\xb6\x00\ +\x0f\x00K@%\x07\x00\x05\x08@\x08\x0b\x00\x0b\x02\x0e\ +\x0d\x0d\x11\x02\x10\x0e'\x0b\x0b\x00\x03\x06\x02\x03\x02L\ +Y\x09\x03\x03\x00\x07LY\x00\x12\x00?+\x00\x18?\ +3+\x11\x003\x11\x129\x18/?\x11\x013\x113\ +\x113\x1299\x113\x1a\x10\xca\x11310!\x11\ +!\x11!\x11!\x11!\x11!\x11!\x11!\x11\x01\x98\ +\xfe\x91\x04;\xfei\x02\x1a\x016\x01+\xfe\xd5\x04\xb4\ +\x01\x02\xfe\xfe\xfcN\x04\xb4\xfbT\xfdL\x01\xaa\x00\x00\ +\x01\x00/\xfeo\x067\x04^\x00\x0f\x00D@\x22\x03\ +\x0c\x01\x04\x04\x07\x0c\x07\x0e\x0a\x09\x09\x11\x0e\x10\x02\x0e\ +\x0f\x0eFY\x05\x0f\x0f\x07\x03\x0c\x03FY\x0c\x15\x0a\ +#\x00??+\x11\x003\x18?3+\x11\x003\x11\ +\x013\x113\x113\x1299\x113\x10\xc2\x1131\ +0\x01\x15!\x11!\x11!\x11!\x11!\x11!\x11#\ +5\x03\x85\xfe\xd9\x01\x96\x011\x01\x12\xfe\xee\xfc\x08\xfe\ +\x04^\xe5\xfdl\x03y\xfc\x81\xfd\x90\x01\x91\x03y\xe5\ +\x00\x00\x02\x00m\xfeV\x06F\x05\xb6\x00\x17\x00\x18\x00\ +@@ \x0f\x0c\x0c\x19\x15\x05\x05\x00\x03\x02\x02\x00\x00\ +\x18\x09\x12LY\x09\x09\x05\x16\x0d\x03\x05\x00LY\x05\ +\x12\x03'\x00??+\x00\x18?3\x129/+\x01\ +\x18/3\x113\x113\x113\x113\x113\x1131\ +0\x01!\x11!\x11!\x11\x06\x06#\x22&5\x11!\ +\x11\x14\x163267\x11!\x13\x05\x1b\x01+\xfe\xd5\ +\xfe\xca\x9a\xcd]\xd1\xe3\x015buR\xa3w\x016\ +\xb8\x01\x0a\xfdL\x01\xaa\x0254&\xc9\xb6\x02\x5c\xfd\ +\xfcjk!)\x02\x8f\xfaJ\x00\x02\x00{\xfeo\x05\ +\xb2\x04^\x00\x16\x00\x17\x00@@ \x01\x15\x15\x18\x06\ +\x0e\x0e\x09\x0c\x0b\x0b\x09\x09\x17\x12\x03FY\x12\x12\x0e\ +\x07\x16\x0f\x0e\x09FY\x0e\x15\x0c#\x00??+\x00\ +\x18?3\x129/+\x01\x18/3\x113\x113\x11\ +3\x113\x113\x11310\x01\x11\x143267\ +\x11!\x11!\x11!\x11!\x11\x06\x06#\x22&5\x11\ +\x01\x01\xac\x87X\x97M\x011\x01\x12\xfe\xee\xfe\xcfj\ +\xb6U\xb7\xc8\x04\xc4\x04^\xfeg\x92( \x01\xe3\xfc\ +\x81\xfd\x90\x01\x91\x01\xbc8.\xbb\xad\x01\xa0\xfb\xa2\x00\ +\x01\x00m\x00\x00\x05\x1b\x05\xb6\x00\x19\x00J@$\x0e\ +\x18\x18\x0b\x19\x19\x08\x10\x14\x14\x13\x13\x1b\x08\x05\x05\x1a\ +\x0c\x06\x0e\x0b\x02\x0bLY\x19\x17\x00\x02\x02\x06\x14\x12\ +\x11\x06\x03\x00?3?\x129/333+\x11\x00\ +3\x129\x11\x013\x113\x113\x113\x113\x129\ +\x1133\x11310\x01\x07#\x22&5\x11!\x11\ +\x14\x16\x17\x113\x1167\x11!\x11!\x11\x06\x07\x11\ +#\x02q((\xd1\xe3\x015bm\x85Y\x96\x016\ +\xfe\xca\x81n\x85\x01\xdd\x02\xc9\xb6\x02\x5c\xfd\xfcne\ +\x02\x01H\xfe\xc2\x0d3\x02\x8f\xfaJ\x025-\x18\xfe\ +\xbc\x00\x01\x00{\x00\x00\x04\xa0\x04^\x00\x19\x00J@\ +$\x0e\x18\x18\x0b\x19\x19\x08\x10\x14\x14\x13\x13\x1b\x08\x05\ +\x05\x1a\x0c\x06\x0e\x0b\x02\x0bFY\x19\x17\x00\x02\x02\x06\ +\x14\x15\x11\x06\x0f\x00?3?\x129/333+\ +\x11\x003\x129\x11\x013\x113\x113\x113\x113\ +\x129\x1133\x11310\x01\x06#\x22&5\x11\ +!\x11\x1433\x113\x1567\x11!\x11!\x11\x06\ +\x07\x15#\x02F\x193\xb7\xc8\x011\x87\x13}N^\ +\x011\xfe\xcfiC}\x01Z\x04\xbb\xad\x01\xa0\xfeg\ +\x92\x01\x00\xf1\x10)\x01\xe3\xfb\xa2\x01\xbc6\x13\xf2\x00\ +\x01\x00\xb8\x00\x00\x05f\x05\xb6\x00\x13\x00+@\x15\x0a\ +\x09\x09\x15\x02\x12\x12\x13\x13\x14\x05\x0eLY\x05\x05\x0a\ +\x13\x12\x00\x03\x00??39/+\x11\x013\x113\ +\x113\x113\x11310\x13!\x116632\x16\ +\x15\x11!\x114&#\x22\x06\x07\x11!\xb8\x016\x93\ +\xd6[\xce\xe6\xfe\xcbbuO\xa7v\xfe\xca\x05\xb6\xfd\ +\xcb3'\xc7\xb8\xfd\xa4\x02\x04jk *\xfdq\x00\ +\x01\x00\xa0\x00\x00\x04\xc5\x04^\x00\x11\x00-@\x16\x00\ +\x11\x11\x13\x0a\x06\x06\x07\x07\x12\x0d\x03FY\x0d\x0d\x07\ +\x08\x0f\x00\x07\x15\x00?3?\x129/+\x11\x013\ +\x113\x113\x113\x11310!\x114#\x22\x07\ +\x11!\x11!\x116632\x16\x15\x11\x03\x93\x87\x90\ +\xab\xfe\xcf\x011j\xb4W\xb7\xc8\x01\xa4\x87H\xfe\x1d\ +\x04^\xfeD8.\xbb\xad\xfe`\x00\x00\x02\x00\x00\xff\ +\xec\x06\xf2\x05\xcd\x00!\x00(\x00c@3%\x1f\x1f\ +\x17\x0a\x0a\x14&\x04\x1e\x1e*\x11\x14\x14\x0e\x0e) \ +$\x00\x22\x1a\x22LY%\x10\x16@\x0b\x16LY\x1f\ +\x0b\x09\x0b\x18\x03\x07\x1a\x04\x03\x00\x07\x00LY\x07\x13\ +\x00?+\x11\x003\x18?\x12\x179/3+\x00\x1a\ +\x10\xc83+\x11\x12\x0099\x11\x013\x113\x113\ +\x113\x1133\x129\x1133\x11310%2\ +$7\x11\x06\x04# \x00\x03#\x22&5473\ +\x06\x06\x15\x1433\x12\x00! \x00\x11\x15!\x16\x16\ +\x13\x22\x06\x07!4&\x04b\x8a\x01Ln}\xfe\xe3\ +\xac\xfe\xc2\xfe\x82\x1d?\xa3\xa55\xea\x08\x13`)%\ +\x01d\x01%\x01\x5c\x01[\xfb\xd5\x0d\xd2\x95\x9f\xc5\x0c\ +\x02\xe5\xb6\xee]D\xfe\xeaKB\x01U\x016\x8az\ +tY\x11H\x1eX\x01\x1c\x018\xfeu\xfe|G\xc1\ +\xc8\x03\xdd\xb3\x9f\xb0\xa2\x00\x02\x00\x00\xff\xec\x05`\x04\ +s\x00\x1e\x00%\x00g@5\x22\x08\x08\x00\x15\x15\x1c\ +#\x0f\x07\x07'\x1a\x1c\x1c\x17\x17&\x0e\x08$!\x09\ +!\x0b\x1f\x12\x0bFY\x08\x15\x00\x15JY\x22\x19@\ +\x00\x14\x00\x01\x03\x03\x12\x16\x03\x1fJY\x03\x10\x00?\ ++\x00\x18?\x12\x179/\x1a\xc83+\x11\x003+\ +\x11\x12\x0099\x113\x119\x11\x013\x113\x113\ +\x113\x1133\x129\x1133\x11310\x016\ +$32\x00\x15\x15!\x16\x163267\x15\x06\x06\ +# \x00' 5473\x06\x15\x143%\x22\x06\ +\x07!&&\x01N!\x01\x16\xdb\xf2\x01\x0e\xfd\x19\x05\ +\x95\x87j\xbbbN\xbe\x86\xfe\xfd\xfe\xcf\x13\xfe\xb8)\ +\xcd\x19`\x02%^|\x09\x01\xc3\x02w\x02\xae\xdb\xea\ +\xfe\xf3\xef\x94\x82\x92+-\xec'(\x01\x05\xf2\xe0`\ +E75N\xecsyp|\x00\x02\x00\x00\xfeV\x06\ +\xf2\x05\xcd\x00$\x00+\x00}@@#$$))\ +\x17\x01!\x03\x1f\x1f\x17(\x18\x18\x10\x03\x03\x0d\x17\x17\ +-\x0a\x0d\x0d\x07\x07,$''\x19%\x1b\x13%L\ +Y(\x09\x0f@\x04\x0fLY\x18\x04\x11\x04\x02\x03\x00\ +\x13\x04\x1e\x1b\x22\x1bMY\x00\x22\x13\x00?3+\x11\ +\x003\x18?\x12\x179/3+\x00\x1a\x10\xc83+\ +\x11\x12\x0099\x18?\x11\x013\x113\x113\x113\ +\x11\x129\x1133\x113\x113\x11\x1299\x113\ +\x119\x11310\x05&\x00\x03#\x22&547\ +3\x06\x06\x15\x1433\x12\x00! \x00\x11\x15!\x16\ +\x1632$7\x11\x06\x06\x07\x11!\x13\x22\x06\x07!\ +4&\x03\xbc\xf6\xfe\xdb\x1a?\xa3\xa55\xea\x08\x13`\ +)%\x01d\x01%\x01\x5c\x01[\xfb\xd5\x0d\xd2\xbc\x8a\ +\x01Lnm\xd6~\xfe\xd7\x7f\x9f\xc5\x0c\x02\xe5\xb6\x08\ +(\x01I\x01\x0e\x8aztY\x11H\x1eX\x01\x1c\x01\ +8\xfeu\xfe|G\xc1\xc8]D\xfe\xea@>\x09\xfe\ +d\x06u\xb3\x9f\xb0\xa2\x00\x02\x00\x00\xfeo\x05`\x04\ +s\x00 \x00'\x00\x82@C\x1f %%\x14\x01\ +\x1d\x03\x1c\x1c\x14$\x15\x15\x0d\x0d\x03\x03\x0a\x14\x14)\ +\x08\x0a\x0a\x05\x05( #\x1b\x15&#\x16#\x18!\ +\x1e\x18FY\x15\x03\x0d\x03JY$\x07@\x0d\x0e\x0d\ +\x02\x00\x04\x10\x1e\x15\x10!JY\x10\x10\x00?+\x00\ +\x18?\x12\x179/\x1a\xc83+\x11\x003+\x11\x12\ +\x0099\x113\x119\x18?\x11\x013\x113\x113\ +\x113\x11\x129\x113\x113\x113\x113\x11\x129\ +9\x113\x119\x11310\x05&&' 54\ +73\x06\x15\x14336$32\x00\x15\x15!\x16\ +\x163267\x15\x06\x07\x11!\x13\x22\x06\x07!&\ +&\x02\xdd\xb5\xd1\x0f\xfe\xb8)\xcd\x19`\x11!\x01\x16\ +\xdb\xf2\x01\x0e\xfd\x19\x05\x95\x87j\xbbb\x7f\xb2\xfe\xed\ +\x85^|\x09\x01\xc3\x02w\x02(\xf8\xc5\xe0`E7\ +5N\xdb\xea\xfe\xf3\xef\x94\x82\x92+-\xec?\x0c\xfe\ +\x7f\x05+syp|\xff\xff\x00B\x00\x00\x02\xdb\x05\ +\xb6\x02\x06\x00,\x00\x00\xff\xff\x00\x00\x00\x00\x07\x8b\x07\ +\x91\x02&\x01\xb0\x00\x00\x01\x07\x026\x01u\x01R\x00\ +\x08\xb3\x01\x15\x05&\x00+5\xff\xff\x00\x00\x00\x00\x06\ +\xfc\x06?\x02&\x01\xd0\x00\x00\x01\x07\x026\x01/\x00\ +\x00\x00\x08\xb3\x01\x15\x11&\x00+5\x00\x01\x00\xb8\xfe\ +\x00\x05\xae\x05\xb6\x00\x1f\x00X@,\x0d\x1f\x17\x1f\x1d\ +\x1d\x10\x09\x0a\x0a\x03\x10\x10!\x0b\x07\x03\x03\x04\x04 \ +\x18\x1a\x14\x1aLY\x14\x1c\x02\x00\x0b\x00MY\x07\x0b\ +\x0b\x04\x09\x05\x03\x04\x12\x00??3\x129/3+\ +\x11\x003\x18?+\x11\x003\x11\x013\x113\x113\ +3\x113\x11\x129\x113\x113\x1199\x1131\ +0\x01\x22\x07\x11!\x11!\x117\x01!\x0132\x04\ +\x12\x15\x14\x02\x06#\x22&'\x11\x1632654\ +&\x02\xa8Ko\xfe\xca\x016\x91\x01\x89\x01X\xfd\xbf\ +\x04\xc8\x01/\x94\x8b\xfb\x99n\x8bJ\x81\x85\x8e\x9f\xe2\ +\x02\x19\x19\xfe\x00\x05\xb6\xfd@\xcf\x01\xf1\xfdP\x9c\xfe\ +\xe4\xc1\xc3\xfe\xd7\xa1\x16\x19\x01\x10/\xcd\xb0\xc3\xc9\x00\ +\x01\x00\xa0\xfe\x0a\x04\xf8\x04^\x00\x1d\x00X@,\x19\ +\x1a\x1a\x00\x1c\x0f\x06\x0f\x14\x0d\x0d\x00\x00\x1f\x1b\x18\x14\ +\x14\x15\x15\x1e\x13\x10\x1b\x10GY\x18\x1b\x1b\x15\x19\x16\ +\x0f\x15\x15\x07\x0a\x04\x0aHY\x04\x1b\x00?+\x11\x00\ +3\x18??3\x129/3+\x11\x003\x11\x013\ +\x113\x1133\x113\x113\x11\x1299\x113\x11\ +9\x11310%\x14\x02\x06#\x22'\x11\x16\x163\ +2654&#\x22\x06\x07\x11!\x11!\x11\x01!\ +\x012\x00\x04\xf8y\xe0\x95\x8er-y1t~\x9e\ +\x992z\x1f\xfe\xcf\x011\x01\xb2\x01X\xfe'\xe5\x01\ +\x11D\xb3\xff\x00\x873\x01\x07\x18\x1e\xa5\x95\x94\x9d\x15\ +\x0c\xfe\xa8\x04^\xfe\x13\x01\xed\xfe\x0c\xfe\xdb\x00\x02\x00\ +\x10\xfeV\x06\x8b\x05\xb6\x00\x17\x00\x18\x00I@%\x03\ +\x12\x12\x0a\x01\x0a\x19\x00\x17\x17\x16\x15\x15\x01\x14\x14\x18\ +\x17'\x12\x03LY\x12\x03\x08\x0dLY\x08\x13\x01\x14\ +LY\x01\x12\x00?+\x00\x18?+\x00\x18?+\x00\ +\x18?\x01/3\x1133\x10\xc12\x129\x113\x11\ +\x129\x11310!!\x11!\x07\x02\x02\x06'\x22\ +'5\x16326\x12\x12\x13!\x11!\x03!\x01\x05\ +=\xfe\xcb\xfe\x9a\x10>_\xb6\x9bT@:35>\ +7[ \x03\x9b\x01N\xb2\xfe\xa8\x01u\x04\xb4\x86\xfe\ +\x01\xfec\xa8\x02\x16\xfe\x14a\x01\x07\x02W\x01\x0b\xfb\ +T\xfdL\x01\xaa\x00\x02\x00\x00\xfeo\x05\xb4\x04^\x00\ +\x15\x00\x16\x00N@(\x07\x14\x14\x0e\x05\x0e\x17\x05\x00\ +\x04\x03\x03\x02\x01\x01\x00\x00\x16\x14\x07FY\x14\x0f\x0e\ +\x10\x0b\x10HY\x0b\x15\x05\x00FY\x05\x15\x03#\x00\ +??+\x00\x18?+\x11\x003\x18?+\x01\x18/\ +3\x113\x10\xc12\x129\x113\x113\x11\x129\x11\ +310%!\x03!\x13!\x11!\x02\x02\x06#\x22\ +'5\x16326\x12\x13!\x13\x04\x89\x01+\x91\xfe\ +\xdd\x89\xfe\xcf\xfe\xe7 \x5c\x99|jD119M\ +=\x16\x03N\xa0\xdf\xfd\x90\x01\x91\x03y\xfe\x89\xfe\x8f\ +\xa5 \xf4\x14\xa4\x01\x7f\x01O\xfb\xa2\x00\x01\x00\xb8\xfe\ +\x00\x05f\x05\xb6\x00\x17\x00C@\x22\x06\x10\x15\x0d\x0d\ +\x00\x00\x19\x14\x10\x10\x11\x11\x18\x14\x0fLY\x14\x14\x11\ +\x16\x12\x03\x11\x12\x07\x0a\x04\x0aLY\x04\x1c\x00?+\ +\x11\x003\x18??3\x129/+\x11\x013\x113\ +\x113\x113\x113\x113\x12910%\x14\x02\x06\ +#\x22'\x11\x16\x163265\x11!\x11!\x11!\ +\x11!\x11!\x05f\x86\xf7\xa1\xbf\x85K\x84R~\x8e\ +\xfd\xbd\xfe\xca\x016\x02C\x015Z\xb1\xfe\xec\x95/\ +\x01\x10\x1a\x15\xc1\xac\x01\xfa\xfd\x89\x05\xb6\xfd\xc3\x02=\ +\x00\x00\x01\x00\xa0\xfe\x0a\x04\xac\x04^\x00\x16\x00E@\ +\x22\x06\x15\x15\x09\x09\x18\x0f\x01\x05\x01\x01\x02\x02\x17\x10\ +\x12\x0c\x12HY\x0c\x1b\x05\x00FY\x05\x05\x02\x07\x03\ +\x0f\x02\x15\x00??3\x129/+\x00\x18?+\x11\ +\x003\x11\x013\x113\x113\x18\x10\xc4\x113\x113\ +\x11310\x01\x11!\x11!\x11!\x11!\x11\x14\x00\ +#\x22&'\x11\x163267\x11\x01\xd1\xfe\xcf\x01\ +1\x01\xaa\x011\xfe\xf8\xe8Lv@prlo\x04\ +\x01\xcd\xfe3\x04^\xfeR\x01\xae\xfb\xb9\xf7\xfe\xea\x18\ + \x01\x06:\x94\x8d\x01\x9e\x00\x00\x02\x00\xb8\xfeV\x06\ +\xb4\x05\xb6\x00\x0f\x00\x10\x00L@&\x0c\x08\x08\x09\x09\ +\x11\x0d\x05\x05\x00\x04\x03\x03\x02\x01\x01\x00\x00\x10\x0c\x07\ +LY\x0c\x0c\x09\x0e\x0a\x03\x05\x00LY\x05\x09\x12\x03\ +'\x00??3+\x00\x18?3\x129/+\x01\x18\ +/3\x113\x10\xc12\x129\x113\x113\x113\x11\ +3\x11310\x01!\x03!\x13!\x11!\x11!\x11\ +!\x11!\x11!\x13\x05f\x01N\xb2\xfe\xa8\xbc\xfe\xcb\ +\xfd\xbd\xfe\xca\x016\x02C\x015\xb9\x01\x0a\xfdL\x01\ +\xaa\x02w\xfd\x89\x05\xb6\xfd\xc3\x02=\xfaJ\x00\x02\x00\ +\xa0\xfeo\x05\xd7\x04^\x00\x0f\x00\x10\x00M@'\x01\ +\x0d\x0d\x0e\x0e\x11\x02\x0a\x0a\x05\x09\x08\x08\x07\x06\x06\x05\ +\x05\x10\x01\x0cFY\x01\x01\x0a\x03\x0f\x0f\x0e\x15\x0a\x05\ +FY\x0a\x15\x08#\x00??+\x00\x18??3\x12\ +9/+\x01\x18/3\x113\x10\xc12\x129\x113\ +\x113\x113\x113\x11310\x01\x11!\x11!\x11\ +!\x03!\x13!\x11!\x11!\x11\x01\x01\xd1\x01\xaa\x01\ +1\x01+\x91\xfe\xdd\x89\xfe\xcf\xfeV\xfe\xcf\x04\xac\x04\ +^\xfeR\x01\xae\xfc\x81\xfd\x90\x01\x91\x01\xcd\xfe3\x04\ +^\xfb\xa2\x00\x01\x00m\xfeV\x05\x1b\x05\xb6\x00\x17\x00\ +=@\x1f\x02\x03\x03\x15\x05\x05\x00\x00\x19\x0f\x0c\x0c\x18\ +\x09\x12LY\x09\x09\x01\x16\x0d\x03\x03'\x01\x04LY\ +\x01\x12\x00?+\x00\x18??3\x129/+\x11\x01\ +3\x113\x113\x113\x1133\x11310!!\ +\x11!\x113\x11\x06\x06#\x22&5\x11!\x11\x14\x16\ +3267\x11!\x05\x1b\xfe\xfe\xfe\xd5\xf7\x9a\xcd]\ +\xd1\xe3\x015buR\xa3w\x016\xfeV\x02\xb4\x01\ ++4&\xc9\xb6\x02\x5c\xfd\xfcjk!)\x02\x8f\x00\ +\x01\x00{\xfeo\x04\xa0\x04^\x00\x16\x00=@\x1f\x0b\ +\x0c\x0c\x06\x0e\x0e\x09\x09\x18\x01\x15\x15\x17\x12\x03FY\ +\x12\x12\x0a\x07\x16\x0f\x0c#\x0a\x0dFY\x0a\x15\x00?\ ++\x00\x18??3\x129/+\x11\x013\x113\x11\ +3\x113\x1133\x11310\x01\x11\x14326\ +7\x11!\x11!\x11!\x1135\x06\x06#\x22&5\ +\x11\x01\xac\x87X\x97M\x011\xfe\xfc\xfe\xed\xe6j\xb6\ +U\xb7\xc8\x04^\xfeg\x92( \x01\xe3\xfb\xa2\xfeo\ +\x02p\xdd8.\xbb\xad\x01\xa0\x00\x02\x00\xb8\xfeV\x08\ +!\x05\xb6\x00\x18\x00\x19\x00T@*\x18\x00\x09\x0b\x09\ +\x08\x03\x05\x12\x05\x06\x06\x1a\x12\x0d\x11\x10\x10\x0f\x0e\x0e\ +\x0d\x0d\x19\x10'\x16\x02\x09\x02\x06\x0b\x07\x03\x12\x0dL\ +Y\x12\x00\x06\x12\x00?33+\x00\x18?3\x129\ +9\x113?\x01/3\x113\x10\xc12\x129\x113\ +\x113\x113\x11\x12\x179\x113310!\x01#\ +\x12\x15\x11!\x11!\x013\x01!\x11!\x03!\x13!\ +\x1146\x13#\x01!\x03#\xfe\xa0\x09\x13\xfe\xeb\x01\ +\xa6\x01Z\x06\x01o\x01\xa6\x01N\xb2\xfe\xa8\xbc\xfe\xdf\ +\x03\x0c\x09\xfe\x87\x03L\x04{\xfe\xa2u\xfdX\x05\xb6\ +\xfb\xa2\x04^\xfbT\xfdL\x01\xaa\x02\xb41\x80\x01\x14\ +\xfb\x87\x00\x00\x02\x00\xa0\xfeo\x07L\x04^\x00\x1c\x00\ +\x1d\x00U@+\x0b\x0a\x17\x1b\x17\x13\x03\x10\x05\x10\x11\ +\x11\x1e\x05\x00\x04\x03\x03\x02\x01\x01\x00\x00\x1d\x06\x0f\x17\ +\x0f\x05\x1b\x12\x0f\x0b\x11\x15\x05\x00FY\x05\x15\x03#\ +\x00??+\x00\x18?3?3\x1299\x113\x01\ +/3\x113\x10\xc12\x129\x113\x113\x113\x11\ +\x12\x179\x113310%!\x03!\x13!\x11\x07\ +\x06\x07\x03#\x03&''\x11!\x11!\x13\x16\x16\x17\ +>\x02\x13!\x13\x06!\x01+\x92\xfe\xde\x89\xfe\xe3\x10\ +6+\xc6\xd9\xc9+1\x13\xfe\xe4\x01\xa4\xc0\x1e3\x09\ +!%,\xb1\x01\xa0\xa0\xdf\xfd\x90\x01\x91\x03q>\xd3\ +l\xfe\x0c\x01\xf8n\xc7D\xfc\x8f\x04^\xfe#M\xc8\ +G\x96\x83n\x01\xb2\xfb\xa2\x00\xff\xff\x00B\x00\x00\x02\ +\xdb\x05\xb6\x02\x06\x00,\x00\x00\xff\xff\x00\x00\x00\x00\x05\ +\x85\x07\x91\x02&\x00$\x00\x00\x01\x07\x026\x00u\x01\ +R\x00\x08\xb3\x02\x11\x05&\x00+5\xff\xff\x00V\xff\ +\xec\x04\x5c\x06?\x02&\x00D\x00\x00\x01\x06\x026)\ +\x00\x00\x08\xb3\x02&\x11&\x00+5\xff\xff\x00\x00\x00\ +\x00\x05\x85\x07V\x02&\x00$\x00\x00\x01\x07\x00j\x00\ +V\x01R\x00\x0a\xb4\x03\x02#\x05&\x00+55\xff\ +\xff\x00V\xff\xec\x04;\x06\x04\x02&\x00D\x00\x00\x01\ +\x06\x00j\xfb\x00\x00\x0a\xb4\x03\x028\x11&\x00+5\ +5\xff\xff\x00\x00\x00\x00\x07%\x05\xb6\x02\x06\x00\x88\x00\ +\x00\xff\xff\x00V\xff\xec\x06\xfe\x04u\x02\x06\x00\xa8\x00\ +\x00\xff\xff\x00v\x00\x00\x04A\x07\x91\x02&\x00(\x00\ +\x00\x01\x07\x026\x00\x0e\x01R\x00\x08\xb3\x01\x0f\x05&\ +\x00+5\xff\xff\x00\x5c\xff\xec\x04b\x06?\x02&\x00\ +H\x00\x00\x01\x06\x026\x1d\x00\x00\x08\xb3\x02\x1f\x11&\ +\x00+5\x00\x02\x00\xa4\xff\xec\x06\x12\x05\xcd\x00\x14\x00\ +\x1b\x00=@\x1f\x18\x12\x12\x0a\x0a\x1d\x19\x03\x10\x10\x1c\ +\x11\x19LY\x11\x11\x0d\x07\x0d\x15LY\x0d\x13\x07\x00\ +LY\x07\x04\x00?+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x013\x1133\x113\x113\x11310\ +\x01\x22\x04\x07\x116$3 \x00\x11\x10\x00! \x00\ +\x115!&&\x03267!\x14\x16\x033\x94\xfe\ +\xc1p\x8b\x01\x17\xa3\x01Z\x01\x83\xfe\x94\xfe\xb4\xfe\xa8\ +\xfe\xa2\x04+\x0d\xd3\x95\xa3\xc3\x0b\xfd\x1a\xb4\x04\xcb[\ +G\x01\x0cSE\xfen\xfe\x9e\xfe\x9e\xfeu\x01\x87\x01\ +\x87H\xc0\xc9\xfc#\xb6\x9b\xaf\xa2\x00\x00\x02\x00\x5c\xff\ +\xec\x04w\x04s\x00\x06\x00\x1b\x00=@\x1f\x03\x12\x12\ +\x0a\x0a\x1d\x18\x04\x10\x10\x1c\x11\x04JY\x11\x11\x0d\x07\ +\x0d\x00JY\x0d\x16\x07\x15FY\x07\x10\x00?+\x00\ +\x18?+\x11\x12\x009\x18/+\x11\x013\x1133\ +\x113\x113\x11310%267!\x16\x16\x13\ + \x00\x11\x10\x00!\x22\x0055!&&#\x22\x06\ +\x07566\x02Zcv\x0a\xfe>\x02t<\x01\x14\ +\x016\xfe\xe5\xff\x00\xf1\xfe\xf1\x02\xe8\x05\x96\x86c\xb9\ +kX\xbe\xc5vun}\x03\xae\xfe\xd5\xfe\xef\xfe\xe9\ +\xfe\xcc\x01\x0b\xf0\x94\x82\x92&2\xec,$\xff\xff\x00\ +\xa4\xff\xec\x06\x12\x07V\x02&\x02\xe1\x00\x00\x01\x07\x00\ +j\x00\xee\x01R\x00\x0a\xb4\x03\x021\x05&\x00+5\ +5\xff\xff\x00\x5c\xff\xec\x04w\x06\x04\x02&\x02\xe2\x00\ +\x00\x01\x06\x00j\xff\x00\x00\x0a\xb4\x03\x021\x11&\x00\ ++55\xff\xff\x00\x00\x00\x00\x07\x8b\x07V\x02&\x01\ +\xb0\x00\x00\x01\x07\x00j\x01X\x01R\x00\x0a\xb4\x02\x01\ +'\x05&\x00+55\xff\xff\x00\x00\x00\x00\x06\xfc\x06\ +\x04\x02&\x01\xd0\x00\x00\x01\x07\x00j\x01\x10\x00\x00\x00\ +\x0a\xb4\x02\x01'\x11&\x00+55\xff\xff\x00^\xff\ +\xec\x04\xd7\x07V\x02&\x01\xb1\x00\x00\x01\x07\x00j\x00\ +-\x01R\x00\x0a\xb4\x02\x01<\x05&\x00+55\xff\ +\xff\x00N\xff\xec\x04#\x06\x04\x02&\x01\xd1\x00\x00\x01\ +\x06\x00j\xce\x00\x00\x0a\xb4\x02\x01>\x11&\x00+5\ +5\x00\x01\x009\xff\xec\x04j\x05\xb6\x00\x19\x00P@\ +(\x06\x19\x19\x01\x01\x05\x02\x05\x0e\x15\x09\x09\x1b\x0e\x1a\ +\x06\x00\x19\x00MY\x19\x19\x0c\x03\x0c\x12MY\x0c\x13\ +\x05\x03\x02\x03\x02LY\x03\x03\x00?+\x11\x12\x009\ +\x18?+\x11\x12\x009\x18/+\x11\x003\x11\x013\ +\x113\x113\x1299\x113\x119\x11310\x01\ +\x01!\x11!\x15\x01\x16\x04\x15\x14\x04! '\x11\x16\ +\x1632654&##\x01\x1b\x01h\xfd\xe7\x03\ +\xbf\xfeP\xf1\x01\x00\xfe\xbb\xfe\xd7\xfe\xfd\xc0]\xebh\ +\xa7\xa5\xd0\xcf{\x03Z\x01\x5c\x01\x00\xc6\xfed\x0a\xdc\ +\xc4\xd0\xeeO\x01\x07,5irf_\x00\x00\x01\x00\ +9\xfe\x14\x04V\x04^\x00\x1a\x00R@)\x06\x1a\x1a\ +\x01\x01\x05\x05\x02\x16\x09\x09\x1c\x0f\x02\x02\x1b\x00\x06\x1a\ +\x06FY\x1a\x1a\x0d\x03\x0d\x13GY\x0d\x1b\x05\x02\x03\ +\x03\x02FY\x03\x0f\x00?+\x11\x12\x009\x18?+\ +\x11\x12\x009\x18/+\x11\x003\x11\x013\x113\x11\ +3\x113\x129\x113\x119\x11310\x01\x01!\ +5!\x15\x01\x16\x16\x15\x14\x06\x04#\x22'\x11\x16\x16\ +32654&##\x01\x1b\x01\x95\xfd\xb2\x03\xc7\ +\xfeF\xed\xfa\x8f\xfe\xee\xc1\xfb\xc0\x5c\xe3e\x9e\xa6\xca\ +\xc6v\x01\xf6\x01\x7f\xe9\xc6\xfeb\x1a\xfe\xe0\x97\xdfx\ +P\x01\x06-3\x87\x7f\x8a\x83\xff\xff\x00\xb8\x00\x00\x05\ +\xdd\x06\xfe\x02&\x01\xb2\x00\x00\x01\x07\x01M\x00\xdb\x01\ +R\x00\x08\xb3\x01\x13\x05&\x00+5\xff\xff\x00\xa0\x00\ +\x00\x05#\x05\xac\x02&\x01\xd2\x00\x00\x01\x06\x01Mu\ +\x00\x00\x08\xb3\x01\x11\x11&\x00+5\xff\xff\x00\xb8\x00\ +\x00\x05\xdd\x07V\x02&\x01\xb2\x00\x00\x01\x07\x00j\x00\ +\xdd\x01R\x00\x0a\xb4\x02\x01%\x05&\x00+55\xff\ +\xff\x00\xa0\x00\x00\x05#\x06\x04\x02&\x01\xd2\x00\x00\x01\ +\x06\x00ju\x00\x00\x0a\xb4\x02\x01#\x11&\x00+5\ +5\xff\xff\x00w\xff\xec\x05\xe7\x07V\x02&\x002\x00\ +\x00\x01\x07\x00j\x00\xc3\x01R\x00\x0a\xb4\x03\x02+\x05\ +&\x00+55\xff\xff\x00\x5c\xff\xec\x04\x98\x06\x04\x02\ +&\x00R\x00\x00\x01\x06\x00j\x0e\x00\x00\x0a\xb4\x03\x02\ +/\x11&\x00+55\x00\x03\x00w\xff\xec\x05\xe7\x05\ +\xcd\x00\x0b\x00\x12\x00\x19\x00?@ \x16\x17\x10\x0f\x0f\ +\x00\x00\x1b\x10\x06\x06\x1a\x16\x10LY\x16\x16\x03\x09\x09\ +\x13LY\x09\x04\x03\x0cLY\x03\x13\x00?+\x00\x18\ +?+\x11\x12\x009\x18/+\x11\x013\x113\x113\ +\x113\x11\x129910\x01\x10\x00! \x00\x11\x10\ +\x00! \x00\x01267!\x16\x16\x13\x22\x06\x07!\ +&&\x05\xe7\xfe\x98\xfe\xb0\xfe\xb0\xfe\x98\x01i\x01Q\ +\x01Q\x01e\xfdH\xa3\xbd\x13\xfd\x18\x14\xb7\xac\x9e\xba\ +\x1b\x02\xe0\x19\xb7\x02\xdd\xfe\x95\xfez\x01\x86\x01m\x01\ +m\x01\x81\xfe|\xfc\xa7\xc0\xbd\xb4\xc9\x03\xdb\xae\xae\xa9\ +\xb3\x00\x03\x00\x5c\xff\xec\x04\x98\x04s\x00\x0d\x00\x14\x00\ +\x1b\x00?@ \x19\x11\x11\x00\x00\x1d\x18\x12\x12\x07\x07\ +\x1c\x18\x12JY\x18\x18\x03\x0a\x0a\x15GY\x0a\x10\x03\ +\x0eGY\x03\x16\x00?+\x00\x18?+\x11\x12\x009\ +\x18/+\x11\x013\x113\x113\x113\x113\x113\ +10\x01\x10\x00!\x22&\x025\x10\x00!2\x16\x12\ +\x01267!\x16\x16\x13\x22\x06\x07!&&\x04\x98\ +\xfe\xe0\xfe\xff\xa1\xf6\x84\x01\x1e\x01\x03\xa1\xf6\x84\xfd\xe3\ +ap\x0e\xfe>\x0fndbp\x0f\x01\xc2\x0em\x02\ +1\xfe\xef\xfe\xcc\x8d\x01\x08\xb0\x01\x12\x010\x8c\xfe\xfa\ +\xfe\x00tttt\x02\x9cqppq\x00\xff\xff\x00\ +w\xff\xec\x05\xe7\x07V\x02&\x02~\x00\x00\x01\x07\x00\ +j\x00\xc5\x01R\x00\x0a\xb4\x04\x03/\x05&\x00+5\ +5\xff\xff\x00\x5c\xff\xec\x04\x98\x06\x04\x02&\x02\x7f\x00\ +\x00\x01\x06\x00j\x0c\x00\x00\x0a\xb4\x04\x031\x11&\x00\ ++55\xff\xff\x00H\xff\xec\x04\xd7\x07V\x02&\x01\ +\xc7\x00\x00\x01\x07\x00j\x00#\x01R\x00\x0a\xb4\x02\x01\ +/\x05&\x00+55\xff\xff\x00J\xff\xec\x03\xbc\x06\ +\x04\x02&\x01\xe7\x00\x00\x01\x06\x00j\x97\x00\x00\x0a\xb4\ +\x02\x01/\x11&\x00+55\xff\xff\x00\x00\xff\xec\x05\ +9\x06\xfe\x02&\x01\xbd\x00\x00\x01\x07\x01M\x001\x01\ +R\x00\x08\xb3\x01\x17\x05&\x00+5\xff\xff\x00\x00\xfe\ +\x14\x04\x8d\x05\xac\x02&\x00\x5c\x00\x00\x01\x06\x01M\xdc\ +\x00\x00\x08\xb3\x01\x1a\x11&\x00+5\xff\xff\x00\x00\xff\ +\xec\x059\x07V\x02&\x01\xbd\x00\x00\x01\x07\x00j\x00\ +1\x01R\x00\x0a\xb4\x02\x01)\x05&\x00+55\xff\ +\xff\x00\x00\xfe\x14\x04\x8d\x06\x04\x02&\x00\x5c\x00\x00\x01\ +\x06\x00j\xdc\x00\x00\x0a\xb4\x02\x01,\x11&\x00+5\ +5\xff\xff\x00\x00\xff\xec\x059\x07s\x02&\x01\xbd\x00\ +\x00\x01\x07\x01S\x00\xb8\x01R\x00\x0a\xb4\x02\x01&\x05\ +&\x00+55\xff\xff\x00\x00\xfe\x14\x04\x8d\x06!\x02\ +&\x00\x5c\x00\x00\x01\x06\x01SR\x00\x00\x0a\xb4\x02\x01\ +)\x11&\x00+55\xff\xff\x00m\x00\x00\x05\x1b\x07\ +V\x02&\x01\xc1\x00\x00\x01\x07\x00j\x00V\x01R\x00\ +\x0a\xb4\x02\x01)\x05&\x00+55\xff\xff\x00{\x00\ +\x00\x04\xa0\x06\x04\x02&\x01\xe1\x00\x00\x01\x06\x00j#\ +\x00\x00\x0a\xb4\x02\x01(\x11&\x00+55\x00\x01\x00\ +\xb8\xfeV\x04T\x05\xb6\x00\x09\x00/@\x18\x01\x0b\x06\ +\x05\x05\x03\x03\x08\x08\x0a\x09\x02LY\x09\x03\x08\x03L\ +Y\x08\x12\x06'\x00??+\x00\x18?+\x11\x013\ +\x113\x113\x113\x11310\x01\x11!\x11!\x11\ +!\x11!\x11\x04T\xfd\x9a\x01+\xfe\xd5\xfe\xca\x05\xb6\ +\xff\x00\xfcT\xfdL\x01\xaa\x05\xb6\x00\x00\x01\x00\xa0\xfe\ +o\x03\xa4\x04^\x00\x09\x00/@\x18\x01\x0b\x06\x05\x05\ +\x03\x03\x08\x08\x0a\x09\x02FY\x09\x0f\x08\x03FY\x08\ +\x15\x06#\x00??+\x00\x18?+\x11\x013\x113\ +\x113\x113\x11310\x01\x15!\x11!\x11!\x11\ +!\x11\x03\xa4\xfe-\x01\x12\xfe\xee\xfe\xcf\x04^\xe5\xfd\ +f\xfd\x90\x01\x91\x04^\xff\xff\x00\xb8\x00\x00\x06\x87\x07\ +V\x02&\x01\xc5\x00\x00\x01\x07\x00j\x015\x01R\x00\ +\x0a\xb4\x04\x03-\x05&\x00+55\xff\xff\x00\xa0\x00\ +\x00\x06-\x06\x04\x02&\x01\xe5\x00\x00\x01\x07\x00j\x00\ +\xfa\x00\x00\x00\x0a\xb4\x04\x03,\x11&\x00+55\xff\ +\xff\x00/\xfe\x10\x04P\x05\xb6\x02&\x02\x9b\x00\x00\x01\ +\x07\x03\x80\x00\xec\x00\x00\x00\x0c\xb7\x01\x16\x00\x16\x16\x07\ +\x07>+\x115\xff\xff\x00\x04\xfe\x10\x03\xbe\x04^\x02\ +&\x02\x9c\x00\x00\x01\x07\x03\x81\x00\xbc\x00\x00\x00\x0c\xb7\ +\x01\x16\x00\x16\x16\x07\x07>+\x115\xff\xff\x00\x00\xfe\ +\x10\x05\xb2\x05\xb6\x00&\x00;\x00\x00\x01\x07\x03\x80\x03\ +\x89\x00\x00\x00\x0f\xb1\x01\x14\xb8\xff\xe6\xb4\x14\x14\x00\x01\ +>+\x115\x00\xff\xff\x00\x0a\xfe\x10\x05\x0c\x04^\x00\ +&\x00[\x00\x00\x01\x07\x03\x81\x02\xe3\x00\x00\x00\x0f\xb1\ +\x01\x14\xb8\xff\xfc\xb4\x14\x14\x07\x08>+\x115\x00\x00\ +\x01\x00\x00\x00\x00\x05V\x05\xb6\x00\x11\x00a@1\x10\ +\x0a\x0d\x0d\x07\x01\x04\x04\x05\x03\x05\x06\x03\x02\x02\x11\x09\ +\x06\x04\x0f\x0c\x0b\x0b\x13\x0e\x0f\x0f\x12\x04\x0d\x05\x0c\x0c\ +\x0f\x0a\x11\x00\x11LY\x07\x00\x00\x02\x0f\x12\x05\x02\x03\ +\x00?3?\x129/3+\x11\x003\x113\x11\x12\ +99\x11\x013\x113\x113\x113\x12\x179\x113\ +\x113\x11\x129\x11333\x113310\x13!\ +\x01!\x01\x01!\x01!\x15!\x01!\x01\x01!\x01!\ +q\x01)\xfe\x85\x01V\x01;\x015\x01N\xfe\x8b\x01\ +'\xfe\xd3\x01\x9e\xfe\x9e\xfe\xac\xfe\xac\xfe\xb4\x01\x8d\xfe\ +\xe4\x03h\x02N\xfd\xf2\x02\x0e\xfd\xb2\xfe\xfd\x96\x02)\ +\xfd\xd7\x02j\x00\x00\x01\x00\x0a\x00\x00\x04\x96\x04^\x00\ +\x11\x00i@5\x0a\x07\x07\x04\x06\x10\x01\x01\x02\x0d\x04\ +\x04\x03\x05\x05\x06\x03\x02\x02\x11\x09\x06\x04\x0f\x0c\x0b\x0b\ +\x13\x0e\x0f\x0f\x12\x04\x0d\x05\x0c\x0c\x0f\x0a\x11\x00\x11F\ +Y\x07\x00\x00\x02\x0f\x15\x05\x02\x0f\x00?3?\x129\ +/3+\x11\x003\x113\x11\x1299\x11\x013\x11\ +3\x113\x113\x12\x179\x113\x113\x11\x129\x11\ +3\x129\x113\x11\x129\x11310\x133\x01!\ +\x13\x13!\x013\x15#\x01!\x03\x03!\x01#f\xd7\ +\xfe\xe0\x01Z\xd9\xdb\x01Z\xfe\xdb\xd9\xd1\x01.\xfe\xa5\ +\xeb\xec\xfe\xa6\x01+\xcf\x02\xa8\x01\xb6\xfe\x9c\x01d\xfe\ +J\xe5\xfe=\x01\x7f\xfe\x81\x01\xc3\x00\x00\x02\x00\x5c\x00\ +\x00\x04b\x05\xb6\x00\x09\x00\x12\x004@\x1a\x04\x12\x12\ +\x07\x07\x14\x0e\x00\x00\x13\x03\x0bLY\x03\x03\x08\x05\x08\ +\x11LY\x08\x12\x05\x03\x00??+\x11\x12\x009\x18\ +/+\x11\x013\x113\x113\x113\x11310\x13\ +4$!3\x11!\x11! \x01#\x22\x06\x15\x14\x16\ +33\x5c\x018\x01\x1e{\x015\xfeV\xfd\xa4\x02\xd1\ +P\xb4\x93\x92\x9dh\x01\xc9\xd4\xe8\x021\xfaJ\x02\x87\ +Yefe\x00\xff\xff\x00\x5c\xff\xec\x04q\x06\x14\x02\ +\x06\x00G\x00\x00\x00\x02\x00\x5c\xff\xec\x06\xba\x05\xb6\x00\ +\x1b\x00&\x00S@)\x16\x07\x07\x04&&\x00\x0d\x0d\ +\x10\x10( \x00\x00'\x16\x19\x0a#\x19#LY\x0e\ +\x0e\x13\x03\x13\x19\x03\x1dLY\x03\x03\x05\x19\x13\x05\x03\ +\x00??\x129/+\x11\x003\x11\x129\x18/+\ +\x11\x003\x129\x11\x013\x113\x113\x113\x11\x12\ +9\x1133\x12910\x134$!3\x11!\x11\ +\x16\x163265\x11!\x11\x14\x06#\x22&'\x06\ +\x06#\x22&\x01#\x22\x06\x15\x14\x163265\x5c\ +\x01*\x01\x0bs\x015\x03OVZN\x011\xf0\xed\ +l\xc1'+\xae}\xe8\xef\x02\xa8H\x9d\x89][T\ +b\x01\xb6\xd8\xf7\x021\xfb\xb9BAfq\x01\x8d\xfe\ +-\xc3\xceN=?J\xeb\x01\xaeil`fA;\ +\x00\x00\x02\x00\x5c\xff\xec\x06\xc9\x06\x14\x00 \x00,\x00\ +W@-\x1e\x09$\x03\x0f\x0f\x0c\x0c\x03\x15\x15\x18\x18\ +.*\x03\x03-\x0d\x00\x16\x16\x1b\x1e\x09\x00\x06\x06(\ +GY\x06\x10\x1b\x12HY\x1b\x00\x00!GY\x00\x16\ +\x00?+\x11\x003+\x00\x18?+\x11\x12\x0099\ +\x129\x18/?\x11\x013\x113\x113\x113\x11\x12\ +9\x113\x12\x17910\x05\x22\x00\x11\x10\x1232\ +\x173&&5\x11!\x11\x14\x1632655!\ +\x11\x14\x06#\x22&'\x06\x06'26754&\ +#\x22\x11\x14\x16\x02^\xf7\xfe\xf5\xd9\xc3\xcbj\x0a\x07\ +\x0f\x011PXWK\x01-\xeb\xe8x\x98>.\xc4\ +Zof\x04jq\xc9b\x14\x01(\x01\x19\x01\x10\x01\ +6\xa4&\x8f*\x01f\xfbiKFfq\xf9\xfe\xc1\ +\xc4\xcd=L7R\xf3\x89\xa2!\xb6\x9a\xfe\xae\xa5\xa5\ +\x00\x00\x01\x00\x19\xff\xec\x06\xa0\x05\xcb\x00(\x00R@\ +)\x1a\x04\x1e\x1e\x00\x00\x17\x06\x06$\x0d\x10\x10*$\ +)\x03\x1b\x1a\x1b\x1aMY\x0e\x0e\x1b\x1b\x13&&!\ +MY&\x04\x13\x0aLY\x13\x13\x00?+\x00\x18?\ ++\x11\x12\x009\x18/3/+\x11\x12\x009\x11\x01\ +3\x113\x113\x129\x1133\x113\x11391\ +0\x01\x14\x06\x07\x15\x16\x16\x15\x14\x163265\x11\ +!\x11\x14\x06#\x22&54&##53 5\ +4&#\x22\x07'6!2\x04\x03\xf4\xa6\x96\xb1\xb6\ +SUYO\x011\xf0\xe9\xea\xf4\xc3\xb9\xaa\xaa\x01X\ +kq\x9c\x99\x9b\xc8\x01\x1f\xe6\x01\x0e\x04o\x89\xc0$\ +\x06\x16\xab\x91eYfq\x01\x8d\xfe-\xc5\xcc\xe4\xda\ +jm\xd9\xd1NXd\xce\x90\xbb\x00\x00\x01\x009\xff\ +\xec\x06\x5c\x04s\x00(\x00V@+'\x12\x03\x03\x10\ +\x10\x22\x16\x16\x0a\x1a\x1d\x1d*\x0a)\x13('('\ +JY\x09\x06(\x1b(\x1b \x0d \x17HY \x16\ +\x0d\x06FY\x0d\x10\x00?+\x00\x18?+\x11\x12\x00\ +99\x18//\x129+\x11\x12\x009\x11\x013\x11\ +3\x113\x129\x1133\x113\x113910\x01\ +2654&#\x22\x06\x07'6632\x16\x15\ +\x14\x07\x15\x16\x15\x1432655!\x11\x14\x06#\ +\x22&54&##5\x01\x93\x9e\x87erM\xb2\ +OZx\xd7\x84\xcb\xf2\xd1\xed\xa8WK\x01-\xeb\xe4\ +\xdd\xfc\x92\x88\x9a\x02\xb08=66%\x22\xd5.&\ +\xa0\x89\xbd9\x0a'\xbdzfq\xf9\xfe\xc1\xc5\xcc\x99\ +\x8def\xd3\x00\x00\x01\x00\x19\xfeV\x05s\x05\xcb\x00\ +\x1f\x00[@.\x12\x03\x16\x16\x00\x00\x1b\x0d\x08\x08\x0b\ +\x0b\x0a\x0a!\x1b \x07\x0e\x0e\x0d\x03\x13\x12\x13\x12M\ +Y\x13\x13\x0d\x1d\x1d\x18MY\x1d\x04\x0d\x08LY\x0d\ +\x12\x0b'\x00??+\x00\x18?+\x11\x12\x009\x18\ +/+\x11\x12\x009\x129\x113\x11\x013\x113\x11\ +3\x113\x113\x129\x113\x113910\x01\x14\ +\x06\x07\x15\x16\x16\x15\x15!\x11!\x11!\x114&#\ +#53 54#\x22\x07'6!2\x04\x04\x1d\ +\xa6\x96\xb1\xb6\x01+\xfe\xd5\xfe\xca\xd1\xc8\xb6\xb6\x01u\ +\xee\xa7\xa5\x9b\xd1\x01*\xf1\x01\x18\x04o\x89\xc0$\x06\ +\x16\xab\x91\xa0\xfdL\x01\xaa\x01\xaajm\xd9\xd1\xa6d\ +\xce\x90\xbb\x00\x01\x00N\xfeo\x05-\x04s\x00\x22\x00\ +]@/\x22\x03\x03\x10\x10\x0a\x1c\x17\x17\x1a\x1a\x19\x19\ +$\x0a#\x16\x1d\x1d\x1c\x12!\x22\x22!JY\x09\x06\ +\x22\x22\x1c\x0d\x1c\x17FY\x1c\x15\x1a#\x0d\x06FY\ +\x0d\x10\x00?+\x00\x18??+\x11\x12\x009\x18/\ +\x129+\x11\x12\x009\x119\x113\x11\x013\x113\ +\x113\x113\x113\x129\x113\x11910\x012\ +654&#\x22\x06\x07'6632\x16\x15\x14\ +\x07\x15\x16\x16\x15\x15!\x11!\x11!\x114&##\ +5\x01\xb2\xaa\x90jzM\xc3PZw\xe0\x8a\xd1\xfc\ +\xd1\x81o\x01\x12\xfe\xee\xfe\xd7\x99\xa1\xa4\x02\xb08=\ +66&!\xd5-'\xa0\x89\xbd9\x0a\x22}eg\ +\xfd\x90\x01\x91\x01FNI\xd3\x00\x01\x00\x10\xff\xea\x07\ +\x96\x05\xb6\x00!\x00D@!\x00\x0f\x11 \x0f \x06\ +\x19\x06\x09\x09#\x19\x22\x07\x07\x16 \x11LY \ +\x03\x03\x1b\x16\x1bLY\x0c\x16\x13\x00?3+\x11\x00\ +3\x18?+\x11\x12\x009\x18/\x11\x013\x113\x11\ +3\x11\x1299\x113\x11310\x01\x16\x1632\ +65\x11!\x11\x14\x06#\x22&5\x11!\x07\x02\x02\ +\x06'\x22'5\x16326\x12\x12\x13!\x05\x14\x02\ +OWZN\x012\xf0\xea\xeb\xf2\xfe\xc3\x10>_\xb6\ +\x9bT@:35>7[ \x03r\x01wHC\ +fq\x01\x8d\xfe-\xc5\xcc\xc8\xc3\x03=\x86\xfe\x01\xfe\ +c\xa8\x02\x16\xfe\x14a\x01\x07\x02W\x01\x0b\x00\x01\x00\ +\x00\xff\xec\x06\xe1\x04^\x00\x1f\x00D@!\x11\x1e\x00\ +\x0f\x1e\x0f\x18\x06\x06\x09\x09!\x18 \x07\x07\x15\x1e\x1e\ +\x11FY\x1e\x0f\x03\x1a\x15\x1aHY\x0c\x15\x16\x00?\ +3+\x11\x003\x18?+\x11\x12\x009\x18/\x11\x01\ +3\x113\x113\x11\x1299\x113\x11310\x01\ +\x14\x1632655!\x11\x14\x06#\x22&5\x11\ +#\x02\x02\x06#\x22'5\x16326\x12\x13!\x04\ +jPXWK\x01-\xeb\xe4\xeb\xee\xfa \x5c\x99|\ +jD119M=\x16\x03/\x01yJCfq\ +\xf9\xfe\xc1\xc5\xcc\xc8\xc5\x02\x00\xfe\x89\xfe\x8f\xa5 \xf4\ +\x14\xa4\x01\x7f\x01O\x00\x00\x01\x00\xb8\xff\xec\x07\xaa\x05\ +\xb6\x00\x19\x00Z@-\x17\x00\x0f\x0f\x13\x06\x06\x09\x09\ +\x1b\x16\x12\x12\x13\x13\x1a\x09\x06\x06\x0f\x00\x00\x18\x03\x18\ +\x14\x16\x11LY\x07\x16\x07\x16\x13\x14\x03\x13\x12\x0c\x03\ +LY\x0c\x13\x00?+\x00\x18??\x1299//\ ++\x11\x003\x11\x129\x1133\x113\x11\x013\x11\ +3\x113\x113\x113\x11\x129\x113310\x01\ +\x14\x163265\x11!\x11\x14\x06#\x22&'\x11\ +!\x11!\x11!\x11!\x11!\x05=IUUI\x01\ +1\xeb\xe4\xe6\xeb\x02\xfd\xe6\xfe\xca\x016\x02\x1a\x015\ +\x01}KFfq\x01\x8d\xfe-\xc4\xcd\xc8\xc1\x01\x02\ +\xfd\x89\x05\xb6\xfd\xc3\x02=\x00\x00\x01\x00\xa0\xff\xec\x07\ +\x04\x04^\x00\x19\x00Z@-\x05\x02\x14\x14\x18\x0b\x0b\ +\x0e\x0e\x1b\x01\x17\x17\x18\x18\x1a\x0e\x0b\x0b\x14\x05\x05\x03\ +\x08\x03\x19\x01\x16FY\x01\x0c\x01\x0c\x18\x19\x0f\x18\x15\ +\x11\x08HY\x11\x16\x00?+\x00\x18??\x1299\ +//+\x11\x003\x11\x129\x1133\x113\x11\x01\ +3\x113\x113\x113\x113\x11\x129\x11331\ +0\x01\x11!\x11!\x11\x16\x1632655!\x11\ +\x14\x06#\x22&'5!\x11!\x11\x01\xd1\x01\x95\x01\ +2\x02NQUI\x01-\xe9\xe2\xe7\xea\x02\xfek\xfe\ +\xcf\x04^\xfeR\x01\xae\xfd\x19HCfq\xf9\xfe\xc1\ +\xc6\xcb\xc9\xc2V\xfe3\x04^\x00\x01\x00w\xff\xec\x05\ +\xf0\x05\xcb\x00\x1d\x00@@!\x1d\x1c\x1c\x0e\x15\x02\x02\ +\x1f\x15\x08\x08\x1e\x0f\x12\x0c\x12LY\x00\x1dLY\x00\ +\x00\x05\x0c\x04\x05\x18LY\x05\x13\x00?+\x00\x18?\ +\x129/++\x11\x003\x11\x013\x113\x113\x11\ +\x1293\x11910\x01!\x15\x10\x00! \x00\x11\ +4\x12$3 \x17\x07&&#\x22\x02\x15\x14\x163\ +2655!\x035\x02\xbb\xfe\xaf\xfe\xbb\xfe\x9c\xfe\ +\x81\xaf\x01M\xe3\x01\x14\xe4kr\xbfh\xbd\xd7\xd9\xd3\ +\x9a\xae\xfe\x8b\x035{\xfe\x9a\xfe\x98\x01\x8a\x01g\xe5\ +\x01T\xb5k\xfa9*\xfe\xf8\xea\xeb\xfe\xa7\x97\x07\x00\ +\x01\x00\x5c\xff\xec\x04\xf2\x04s\x00\x19\x00@@!\x19\ +\x18\x18\x0c\x13\x02\x02\x1b\x13\x07\x07\x1a\x0d\x10\x0a\x10G\ +Y\x00\x19FY\x00\x00\x04\x0a\x10\x04\x15GY\x04\x16\ +\x00?+\x00\x18?\x129/++\x11\x003\x11\x01\ +3\x113\x113\x11\x1293\x11910\x01!\x15\ +\x10! \x00\x11\x10\x00!2\x17\x07&&#\x22\x06\ +\x15\x10!265!\x02\x96\x02\x5c\xfd\xbc\xfe\xe6\xfe\ +\xc8\x01E\x01,\xe2\xc4\x5cK\xb5H\xa3\x9b\x01\x15\x81\ +\x93\xfe\xdc\x02\x98]\xfd\xb1\x01*\x01\x11\x01\x1c\x010\ +V\xea#'\xa7\xb3\xfe\xbatc\x00\x00\x01\x00)\xff\ +\xec\x05b\x05\xb6\x00\x15\x00?@\x1f\x14\x00\x09\x00\x0f\ +\x0f\x11\x06\x06\x09\x09\x17\x11\x16\x15\x11\x12\x11LY\x07\ +\x07\x0c\x12\x03\x0c\x03LY\x0c\x13\x00?+\x00\x18?\ +\x129/+\x11\x003\x11\x013\x113\x113\x11\x12\ +9\x113\x11\x12910\x01\x14\x163265\x11\ +!\x11\x14\x06#\x22&5\x11!\x11!\x11!\x02\xec\ +KVXL\x011\xed\xe6\xeb\xee\xfes\x04P\xfes\ +\x01}KFfq\x01\x8d\xfe-\xc5\xcc\xcb\xbe\x03?\ +\x01\x02\xfe\xfe\x00\x00\x01\x00/\xff\xec\x05F\x04^\x00\ +\x15\x00?@\x1f\x01\x03\x0c\x03\x12\x12\x14\x09\x09\x0c\x0c\ +\x17\x14\x16\x02\x14\x15\x14FY\x0a\x0a\x0f\x15\x0f\x0f\x06\ +HY\x0f\x16\x00?+\x00\x18?\x129/+\x11\x00\ +3\x11\x013\x113\x113\x11\x129\x113\x11\x129\ +10\x01\x15!\x11\x14\x1632655!\x11\x14\ +\x06#\x22&'\x11!5\x04=\xfe\x92PXVL\ +\x01-\xeb\xe4\xe9\xee\x02\xfe\x91\x04^\xe5\xfe\x04KF\ +fq\xf9\xfe\xc1\xc5\xcc\xc7\xc4\x02\x02\xe5\x00\x00\x01\x00\ +X\xff\xec\x04\xd1\x05\xcb\x00(\x00R@)\x12\x1c\x16\ +\x07%\x0d\x0d\x00\x00\x22\x1d\x07\x07*\x16\x22\x22)%\ +\x13\x10\x10\x13MY\x10\x10\x1f\x04\x1f\x19LY\x1f\x13\ +\x04\x0aLY\x04\x04\x00?+\x00\x18?+\x11\x12\x00\ +9\x18/+\x11\x12\x009\x11\x013\x113\x113\x11\ +3\x129\x113\x113\x11\x129910\x1346\ +632\x04\x17\x07&#\x22\x06\x15\x14\x1633\x15\ +#\x22\x06\x15\x14\x1632$7\x11\x06! $5\ +4675&&\x85\x8a\xfa\x9f\xb0\x01\x03v\x87\xc0\ +\xce\x85\x85\xd5\xe8z\x89\xea\xeb\xa6\xaa\x80\x01\x09a\xc1\ +\xfe\xbf\xfe\xdf\xfe\xb6\xcc\xb7\x9f\xb7\x04`i\xa7[C\ +O\xe5wQKfX\xf2haga1/\xfe\xed\ +O\xea\xca\x92\xb7\x13\x06\x19\xb9\x00\x01\x00N\xff\xec\x04\ +%\x04s\x00$\x00N@'\x13!!\x16\x16\x10\x01\ +\x0b\x05\x1c\x1c&\x05\x10\x10%\x13$\x02$\x02JY\ +$$\x0d\x19\x19\x1fFY\x19\x10\x0d\x07FY\x0d\x16\ +\x00?+\x00\x18?+\x11\x12\x009\x18/+\x11\x12\ +\x009\x11\x013\x113\x113\x11\x1299\x129\x11\ +3\x11310\x01\x15#\x22\x06\x15\x14!267\ +\x15\x06! $54675&54$32\ +\x16\x17\x07&#\x22\x15\x14\x163\x03H\xa8\x92\x93\x01\ +\x00o\xe1X\xac\xfe\xfa\xfe\xf6\xfe\xe7\x80\x90\xd5\x01\x01\ +\xebo\xe6[R\xa9\xad\xe3\x85\x8f\x02\xb0\xd3DIy\ +.(\xf4M\xa5\xa4k\x86\x1c\x0a1\xd1\x8d\x98,(\ +\xd5GhB7\xff\xff\x00\x10\xfe\x10\x06b\x05\xb6\x00\ +&\x01\xb5\x00\x00\x01\x07\x03\x80\x049\x00\x00\x00\x0c\xb7\ +\x01\x1c\x00\x1c\x1c\x00\x00>+\x115\xff\xff\x00\x00\xfe\ +\x10\x05\xae\x04^\x00&\x01\xd5\x00\x00\x01\x07\x03\x81\x03\ +\x85\x00\x00\x00\x0c\xb7\x01\x1a\x00\x1a\x1a\x00\x00>+\x11\ +5\xff\xff\x00\x00\xfeR\x05\x85\x05\xbc\x02&\x00$\x00\ +\x00\x00\x07\x02g\x05D\x00\x00\xff\xff\x00V\xfeR\x04\ +;\x04u\x02&\x00D\x00\x00\x00\x07\x02g\x04\xc7\x00\ +\x00\xff\xff\x00\x00\x00\x00\x05\x85\x07\xf6\x02&\x00$\x00\ +\x00\x01\x07\x02f\x05#\x01R\x00\x08\xb3\x02\x12\x05&\ +\x00+5\xff\xff\x00V\xff\xec\x04;\x06\xa4\x02&\x00\ +D\x00\x00\x01\x07\x02f\x04\xcb\x00\x00\x00\x08\xb3\x02'\ +\x11&\x00+5\xff\xff\x00\x00\x00\x00\x05\x85\x07\xd1\x02\ +&\x00$\x00\x00\x01\x07\x03w\x05!\x01R\x00\x0a\xb4\ +\x03\x02\x14\x05&\x00+55\xff\xff\x00V\xff\xec\x04\ +\xfe\x06\x7f\x02&\x00D\x00\x00\x01\x07\x03w\x04\xc5\x00\ +\x00\x00\x0a\xb4\x03\x02)\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05\x85\x07\xd1\x02&\x00$\x00\x00\x01\x07\x03\ +x\x05\x1f\x01R\x00\x0a\xb4\x03\x02\x1b\x05&\x00+5\ +5\xff\xff\xff\xd3\xff\xec\x04;\x06\x7f\x02&\x00D\x00\ +\x00\x01\x07\x03x\x04\xc7\x00\x00\x00\x0a\xb4\x03\x020\x11\ +&\x00+55\xff\xff\x00\x00\x00\x00\x05\x85\x08J\x02\ +&\x00$\x00\x00\x01\x07\x03y\x05!\x01R\x00\x0a\xb4\ +\x03\x02'\x05&\x00+55\xff\xff\x00V\xff\xec\x04\ +\xa8\x06\xf8\x02&\x00D\x00\x00\x01\x07\x03y\x04\xc9\x00\ +\x00\x00\x0a\xb4\x03\x02<\x11&\x00+55\xff\xff\x00\ +\x00\x00\x00\x05\x85\x08b\x02&\x00$\x00\x00\x01\x07\x03\ +z\x05\x1d\x01R\x00\x0a\xb4\x03\x02,\x05&\x00+5\ +5\xff\xff\x00V\xff\xec\x04;\x07\x10\x02&\x00D\x00\ +\x00\x01\x07\x03z\x04\xc5\x00\x00\x00\x0a\xb4\x03\x02A\x11\ +&\x00+55\xff\xff\x00\x00\xfeR\x05\x85\x07s\x02\ +&\x00$\x00\x00\x00'\x01K\x00X\x01R\x01\x07\x02\ +g\x05D\x00\x00\x00\x0a\xb4\x02\x0e\x0e\x05&\x00+\x11\ +5\xff\xff\x00V\xfeR\x04;\x06 \x02&\x00D\x00\ +\x00\x00&\x01K\xfb\xff\x01\x07\x02g\x04\xd3\x00\x00\x00\ +\x0a\xb4\x02##\x11&\x00+\x115\xff\xff\x00\x00\x00\ +\x00\x05\x85\x08\x13\x02&\x00$\x00\x00\x01\x07\x03{\x05\ +)\x01R\x00\x0a\xb4\x03\x02\x19\x05&\x00+55\xff\ +\xff\x00V\xff\xec\x04;\x06\xc1\x02&\x00D\x00\x00\x01\ +\x07\x03{\x04\xcd\x00\x00\x00\x0a\xb4\x03\x02.\x11&\x00\ ++55\xff\xff\x00\x00\x00\x00\x05\x85\x08\x13\x02&\x00\ +$\x00\x00\x01\x07\x03|\x05'\x01R\x00\x0a\xb4\x03\x02\ + \x05&\x00+55\xff\xff\x00V\xff\xec\x04;\x06\ +\xc1\x02&\x00D\x00\x00\x01\x07\x03|\x04\xcb\x00\x00\x00\ +\x0a\xb4\x03\x025\x11&\x00+55\xff\xff\x00\x00\x00\ +\x00\x05\x85\x08X\x02&\x00$\x00\x00\x01\x07\x03}\x05\ +'\x01R\x00\x0a\xb4\x03\x02+\x05&\x00+55\xff\ +\xff\x00V\xff\xec\x04;\x07\x06\x02&\x00D\x00\x00\x01\ +\x07\x03}\x04\xcd\x00\x00\x00\x0a\xb4\x03\x02@\x11&\x00\ ++55\xff\xff\x00\x00\x00\x00\x05\x85\x08b\x02&\x00\ +$\x00\x00\x01\x07\x03~\x05'\x01R\x00\x0a\xb4\x03\x02\ +\x17\x05&\x00+55\xff\xff\x00V\xff\xec\x04;\x07\ +\x10\x02&\x00D\x00\x00\x01\x07\x03~\x04\xcd\x00\x00\x00\ +\x0a\xb4\x03\x02,\x11&\x00+55\x00\x04\x00\x00\xfe\ +R\x05\x85\x07}\x00\x07\x00\x0d\x00\x1b\x00$\x00\x00!\ +\x03!\x03!\x01!\x01\x01\x02&'\x06\x03\x01\x06\x06\ +#\x22&'3\x1e\x02327\x01432\x15\x14\ +\x06#\x22\x047j\xfd\xebj\xfe\xb2\x02\x04\x01{\x02\ +\x06\xfd\xfe\x93%\x08!\x9c\x02F\x0c\xdc\xa6\xae\xcf\x08\ +\xaa\x04/UU\xce\x10\xfe\x7f\xa6\xa6TR\xa6\x01\x5c\ +\xfe\xa4\x05\xbc\xfaD\x02`\x01\xd9|$\x80\xfe\x07\x05\ +\x1d\x9a\xb8\xb6\x9c/6\x18}\xf7j\x96\x96GN\xff\ +\xff\x00V\xfeR\x04;\x06+\x02&\x00D\x00\x00\x00\ +'\x02g\x04\xc9\x00\x00\x01\x06\x01N\xfb\x00\x00\x08\xb3\ +\x03/\x11&\x00+5\xff\xff\x00\xb8\xfeR\x04\x02\x05\ +\xb6\x02&\x00(\x00\x00\x00\x07\x02g\x04\xdb\x00\x00\xff\ +\xff\x00\x5c\xfeR\x04b\x04s\x02&\x00H\x00\x00\x00\ +\x07\x02g\x04\xdd\x00\x00\xff\xff\x00\xb8\x00\x00\x04\x02\x07\ +\xf6\x02&\x00(\x00\x00\x01\x07\x02f\x04\xc5\x01R\x00\ +\x08\xb3\x01\x10\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x04\ +b\x06\xa4\x02&\x00H\x00\x00\x01\x07\x02f\x04\xdb\x00\ +\x00\x00\x08\xb3\x02 \x11&\x00+5\xff\xff\x00\xb8\x00\ +\x00\x04\x02\x07`\x02&\x00(\x00\x00\x01\x07\x01R\xff\ +\xef\x01R\x00\x08\xb3\x01\x10\x05&\x00+5\xff\xff\x00\ +\x5c\xff\xec\x04b\x06\x0e\x02&\x00H\x00\x00\x01\x06\x01\ +R\xfb\x00\x00\x08\xb3\x02 \x11&\x00+5\xff\xff\x00\ +\xb8\x00\x00\x04\xf5\x07\xd1\x02&\x00(\x00\x00\x01\x07\x03\ +w\x04\xbc\x01R\x00\x0a\xb4\x02\x01\x12\x05&\x00+5\ +5\xff\xff\x00\x5c\xff\xec\x05\x04\x06\x7f\x02&\x00H\x00\ +\x00\x01\x07\x03w\x04\xcb\x00\x00\x00\x0a\xb4\x03\x02\x22\x11\ +&\x00+55\xff\xff\xff\xcd\x00\x00\x04\x02\x07\xd1\x02\ +&\x00(\x00\x00\x01\x07\x03x\x04\xc1\x01R\x00\x0a\xb4\ +\x02\x01\x19\x05&\x00+55\xff\xff\xff\xdf\xff\xec\x04\ +b\x06\x7f\x02&\x00H\x00\x00\x01\x07\x03x\x04\xd3\x00\ +\x00\x00\x0a\xb4\x03\x02)\x11&\x00+55\xff\xff\x00\ +\xb8\x00\x00\x04\x9b\x08J\x02&\x00(\x00\x00\x01\x07\x03\ +y\x04\xbc\x01R\x00\x0a\xb4\x02\x01%\x05&\x00+5\ +5\xff\xff\x00\x5c\xff\xec\x04\xaa\x06\xf8\x02&\x00H\x00\ +\x00\x01\x07\x03y\x04\xcb\x00\x00\x00\x0a\xb4\x03\x025\x11\ +&\x00+55\xff\xff\x00\xb8\x00\x00\x04\x02\x08b\x02\ +&\x00(\x00\x00\x01\x07\x03z\x04\xbc\x01R\x00\x0a\xb4\ +\x02\x01*\x05&\x00+55\xff\xff\x00\x5c\xff\xec\x04\ +b\x07\x10\x02&\x00H\x00\x00\x01\x07\x03z\x04\xcb\x00\ +\x00\x00\x0a\xb4\x03\x02:\x11&\x00+55\xff\xff\x00\ +\xab\xfeR\x04\x10\x07s\x02&\x00(\x00\x00\x00'\x01\ +K\xff\xf1\x01R\x01\x07\x02g\x04\xdb\x00\x00\x00\x08\xb3\ +\x01\x19\x05&\x00+5\xff\xff\x00\x5c\xfeT\x04b\x06\ +!\x02&\x00H\x00\x00\x00&\x01K\xf3\x00\x01\x07\x02\ +g\x04\xdd\x00\x02\x00\x08\xb3\x02)\x11&\x00+5\xff\ +\xff\x00B\x00\x00\x02\xdb\x07\xf6\x02&\x00,\x00\x00\x01\ +\x07\x02f\x03\xee\x01R\x00\x08\xb3\x01\x10\x05&\x00+\ +5\xff\xff\x00u\x00\x00\x02<\x06\xa4\x02&\x00\xf3\x00\ +\x00\x01\x07\x02f\x03\x9c\x00\x00\x00\x08\xb3\x01\x08\x11&\ +\x00+5\xff\xff\x00B\xfeR\x02\xdb\x05\xb6\x02&\x00\ +,\x00\x00\x00\x07\x02g\x04\x0e\x00\x00\xff\xff\x00\x91\xfe\ +R\x01\xdf\x06\x14\x02&\x00L\x00\x00\x00\x07\x02g\x03\ +\xb8\x00\x00\xff\xff\x00w\xfeR\x05\xe7\x05\xcd\x02&\x00\ +2\x00\x00\x00\x07\x02g\x05\xb0\x00\x00\xff\xff\x00\x5c\xfe\ +R\x04\x98\x04s\x02&\x00R\x00\x00\x00\x07\x02g\x04\ +\xf8\x00\x00\xff\xff\x00w\xff\xec\x05\xe7\x07\xf6\x02&\x00\ +2\x00\x00\x01\x07\x02f\x05\x91\x01R\x00\x08\xb3\x02\x1a\ +\x05&\x00+5\xff\xff\x00\x5c\xff\xec\x04\x98\x06\xa4\x02\ +&\x00R\x00\x00\x01\x07\x02f\x04\xdb\x00\x00\x00\x08\xb3\ +\x02\x1e\x11&\x00+5\xff\xff\x00w\xff\xec\x05\xe7\x07\ +\xd1\x02&\x002\x00\x00\x01\x07\x03w\x05\x85\x01R\x00\ +\x0a\xb4\x03\x02\x1c\x05&\x00+55\xff\xff\x00\x5c\xff\ +\xec\x05\x0a\x06\x7f\x02&\x00R\x00\x00\x01\x07\x03w\x04\ +\xd1\x00\x00\x00\x0a\xb4\x03\x02 \x11&\x00+55\xff\ +\xff\x00w\xff\xec\x05\xe7\x07\xd1\x02&\x002\x00\x00\x01\ +\x07\x03x\x05\x87\x01R\x00\x0a\xb4\x03\x02#\x05&\x00\ ++55\xff\xff\xff\xdf\xff\xec\x04\x98\x06\x7f\x02&\x00\ +R\x00\x00\x01\x07\x03x\x04\xd3\x00\x00\x00\x0a\xb4\x03\x02\ +'\x11&\x00+55\xff\xff\x00w\xff\xec\x05\xe7\x08\ +J\x02&\x002\x00\x00\x01\x07\x03y\x05\x85\x01R\x00\ +\x0a\xb4\x03\x02/\x05&\x00+55\xff\xff\x00\x5c\xff\ +\xec\x04\xb0\x06\xf8\x02&\x00R\x00\x00\x01\x07\x03y\x04\ +\xd1\x00\x00\x00\x0a\xb4\x03\x023\x11&\x00+55\xff\ +\xff\x00w\xff\xec\x05\xe7\x08b\x02&\x002\x00\x00\x01\ +\x07\x03z\x05\x87\x01R\x00\x0a\xb4\x03\x024\x05&\x00\ ++55\xff\xff\x00\x5c\xff\xec\x04\x98\x07\x10\x02&\x00\ +R\x00\x00\x01\x07\x03z\x04\xd5\x00\x00\x00\x0a\xb4\x03\x02\ +8\x11&\x00+55\xff\xff\x00w\xfeR\x05\xe7\x07\ +s\x02&\x002\x00\x00\x00'\x02g\x05\xb0\x00\x00\x01\ +\x07\x01K\x00\xc1\x01R\x00\x08\xb3\x03\x1f\x05&\x00+\ +5\xff\xff\x00\x5c\xfeR\x04\x98\x06!\x02&\x00R\x00\ +\x00\x00'\x02g\x04\xfc\x00\x00\x01\x06\x01K\x0c\x00\x00\ +\x08\xb3\x03#\x11&\x00+5\xff\xff\x00w\xff\xec\x06\ +\xd7\x07s\x02&\x02_\x00\x00\x01\x07\x00v\x01\x19\x01\ +R\x00\x08\xb3\x03\x1f\x05&\x00+5\xff\xff\x00\x5c\xff\ +\xec\x05\xcd\x06!\x02&\x02`\x00\x00\x01\x06\x00v}\ +\x00\x00\x08\xb3\x03$\x11&\x00+5\xff\xff\x00w\xff\ +\xec\x06\xd7\x07s\x02&\x02_\x00\x00\x01\x07\x00C\x00\ +d\x01R\x00\x08\xb3\x03'\x05&\x00+5\xff\xff\x00\ +\x5c\xff\xec\x05\xcd\x06!\x02&\x02`\x00\x00\x01\x06\x00\ +C\xa5\x00\x00\x08\xb3\x03,\x11&\x00+5\xff\xff\x00\ +w\xff\xec\x06\xd7\x07\xf6\x02&\x02_\x00\x00\x01\x07\x02\ +f\x05\xa6\x01R\x00\x08\xb3\x03\x22\x05&\x00+5\xff\ +\xff\x00\x5c\xff\xec\x05\xcd\x06\xa4\x02&\x02`\x00\x00\x01\ +\x07\x02f\x04\xe7\x00\x00\x00\x08\xb3\x03'\x11&\x00+\ +5\xff\xff\x00w\xff\xec\x06\xd7\x07`\x02&\x02_\x00\ +\x00\x01\x07\x01R\x00\xcb\x01R\x00\x08\xb3\x03\x22\x05&\ +\x00+5\xff\xff\x00\x5c\xff\xec\x05\xcd\x06\x0e\x02&\x02\ +`\x00\x00\x01\x06\x01R\x14\x00\x00\x08\xb3\x03'\x11&\ +\x00+5\xff\xff\x00w\xfeR\x06\xd7\x06\x14\x02&\x02\ +_\x00\x00\x00\x07\x02g\x05\xb2\x00\x00\xff\xff\x00\x5c\xfe\ +R\x05\xcd\x05\x06\x02&\x02`\x00\x00\x00\x07\x02g\x04\ +\xfe\x00\x00\xff\xff\x00\xae\xfeR\x05^\x05\xb6\x02&\x00\ +8\x00\x00\x00\x07\x02g\x05\x87\x00\x00\xff\xff\x00\x9a\xfe\ +R\x04\xa2\x04^\x02&\x00X\x00\x00\x00\x07\x02g\x05\ +\x1f\x00\x00\xff\xff\x00\xae\xff\xec\x05^\x07\xf6\x02&\x00\ +8\x00\x00\x01\x07\x02f\x05^\x01R\x00\x08\xb3\x01\x17\ +\x05&\x00+5\xff\xff\x00\x9a\xff\xec\x04\xa2\x06\xa4\x02\ +&\x00X\x00\x00\x01\x07\x02f\x04\xf8\x00\x00\x00\x08\xb3\ +\x01\x19\x11&\x00+5\xff\xff\x00\xae\xff\xec\x07)\x07\ +s\x02&\x02a\x00\x00\x01\x07\x00v\x01\x17\x01R\x00\ +\x08\xb3\x02&\x05&\x00+5\xff\xff\x00\x9a\xff\xec\x06\ +s\x06!\x02&\x02b\x00\x00\x01\x07\x00v\x00\xaa\x00\ +\x00\x00\x08\xb3\x02 \x11&\x00+5\xff\xff\x00\xae\xff\ +\xec\x07)\x07s\x02&\x02a\x00\x00\x01\x07\x00C\x00\ +\x14\x01R\x00\x08\xb3\x02&\x05&\x00+5\xff\xff\x00\ +\x9a\xff\xec\x06s\x06!\x02&\x02b\x00\x00\x01\x06\x00\ +C\xa3\x00\x00\x08\xb3\x02 \x11&\x00+5\xff\xff\x00\ +\xae\xff\xec\x07)\x07\xf6\x02&\x02a\x00\x00\x01\x07\x02\ +f\x05d\x01R\x00\x08\xb3\x02!\x05&\x00+5\xff\ +\xff\x00\x9a\xff\xec\x06s\x06\xa4\x02&\x02b\x00\x00\x01\ +\x07\x02f\x04\xfe\x00\x00\x00\x08\xb3\x02$\x11&\x00+\ +5\xff\xff\x00\xae\xff\xec\x07)\x07`\x02&\x02a\x00\ +\x00\x01\x07\x01R\x00\x9a\x01R\x00\x08\xb3\x02!\x05&\ +\x00+5\xff\xff\x00\x9a\xff\xec\x06s\x06\x0e\x02&\x02\ +b\x00\x00\x01\x06\x01R3\x00\x00\x08\xb3\x02#\x11&\ +\x00+5\xff\xff\x00\xae\xfeR\x07)\x06\x14\x02&\x02\ +a\x00\x00\x00\x07\x02g\x05}\x00\x00\xff\xff\x00\x9a\xfe\ +R\x06s\x05\x06\x02&\x02b\x00\x00\x00\x07\x02g\x05\ +\x17\x00\x00\xff\xff\x00\x00\xfeR\x04\xfe\x05\xb6\x02&\x00\ +<\x00\x00\x00\x07\x02g\x04\xfe\x00\x00\xff\xff\x00\x00\xfe\ +\x14\x04\x8d\x04^\x02&\x00\x5c\x00\x00\x00\x07\x02g\x06\ +V\x00\x00\xff\xff\x00\x00\x00\x00\x04\xfe\x07\xf6\x02&\x00\ +<\x00\x00\x01\x07\x02f\x04\xd9\x01R\x00\x08\xb3\x01\x0d\ +\x05&\x00+5\xff\xff\x00\x00\xfe\x14\x04\x8d\x06\xa4\x02\ +&\x00\x5c\x00\x00\x01\x07\x02f\x04\xa2\x00\x00\x00\x08\xb3\ +\x01\x1b\x11&\x00+5\xff\xff\x00\x00\x00\x00\x04\xfe\x07\ +`\x02&\x00<\x00\x00\x01\x07\x01R\x00\x12\x01R\x00\ +\x08\xb3\x01\x0d\x05&\x00+5\xff\xff\x00\x00\xfe\x14\x04\ +\x8d\x06\x0e\x02&\x00\x5c\x00\x00\x01\x06\x01R\xe0\x00\x00\ +\x08\xb3\x01\x1b\x11&\x00+5\xff\xff\x00\x5c\xfe\xbc\x05\ +\x0c\x06\x14\x02&\x00\xd3\x00\x00\x00\x07\x00B\x00\xd9\x00\ +\x00\x00\x02\xfb\x7f\x04\xd9\xfe\xe7\x06!\x00\x09\x00\x13\x00\ +\x10\xb6\x0e\x0f\x05\x01\x05\x0a\x00\x00/2\xcd]21\ +0\x01&&'5!\x16\x16\x17\x15!&&'5\ +!\x16\x16\x17\x15\xfeF>\xda\x22\x01-!d)\xfd\ +\xd1I\xd1\x1f\x01-!d)\x04\xd91\xcb7\x15H\ +\xad8\x1b9\xc82\x15H\xad8\x1b\x00\x02\xfc-\x04\ +\xd9\x009\x06\x7f\x00\x0d\x00\x15\x00\x17@\x0a\x10\x15\x15\ +\x03\x0f\x0a\x01\x0a\x06\x01\x00/3\xcd]29/\xcc\ +10\x03#&'\x06\x07#567!\x16\x16\x17\ +'673\x15\x06\x07#\xe9\xa2pcra\xa2p\ +g\x01;5\x87\x1cYU5\xf1C\xa0\x98\x04\xd9K\ +[eA\x1b\x82\x96N\xab\x1f\xc2[n\x15Yu\x00\ +\x02\xfb\x0c\x04\xd9\xff\x19\x06\x7f\x00\x0d\x00\x15\x00\x19@\ +\x0b\x13\x0f\x0f\x0d\x0d\x0a\x0f\x02\x01\x02\x08\x00/\xcd]\ +23\x119/\xcd10\x0167!\x16\x16\x17\x15\ +#&'\x06\x07#7#&'53\x16\x17\xfc/\ +pg\x01<1~(\xa2arji\xa2X\x97\xa4\ +@\xf26S\x04\xf4\x82\x96H\xa4,\x1bAe`F\ +\xc3wW\x15pY\x00\x00\x02\xfc-\x04\xd9\xff\xdf\x06\ +\xf8\x00\x12\x00 \x00%@\x11\x02\x05\x05\x04\x0d\x0b\x0b\ +\x10\x04\x04\x16\x0f\x1c\x01\x1c\x19\x14\x00/3\xcd]2\ +9/\xcc2\x113\x129\x11310\x03\x14\x07\x07\ +#'6654&#\x22\x075632\x16\x03\ +#&'\x06\x07#567!\x16\x16\x17!}\x06\ +\x7f\x0a7B%+#%\x16F^q\xc8\xa2pc\ +ra\xa2pg\x01;5\x87\x1c\x06`r\x19=t\ +\x02\x1f\x1d\x15\x1e\x0a\x7f\x06H\xfe)K[eA\x1b\ +\x82\x96N\xab\x1f\x00\x02\xfc1\x04\xd9\xff\x1b\x07\x10\x00\ +\x17\x00%\x00)@\x14\x11\x00\x00\x09\x09\x05!\x05\x0c\ +\x0c\x15\x1b\x0f!\x1f!\x02!\x1e\x19\x00/3\xdd]\ +2\xcc2/3\x11\x129/3/310\x01\x22\ +.\x02#\x22\x06\x07#6632\x1e\x02326\ +73\x06\x06\x13#&'\x06\x07#567!\x16\ +\x16\x17\xfe7$KHC\x1c(+\x0dq\x09kS\ +%MHB\x1a))\x0eq\x0cj\x93\x8e\x8dZS\ +\x95\x8d\xaaB\x01\x120\x80<\x06\x1f\x19\x1e\x19!1\ +o\x82\x1a\x1e\x1a$0t}\xfe\xbaGQJN\x1b\ +\xa4`E\x84;\x00\x02\xfc1\x04\xd9\xff\x06\x06\xc1\x00\ +\x07\x00\x15\x00\x19@\x0b\x07\x12\x12\x0b\x03\x15\x0f\x0e\x01\ +\x0e\x0b\x00/\xdd]2\xcc\x113\x11910\x016\ +73\x15\x06\x07#%\x06\x06#\x22&'3\x16\x16\ +3267\xfd7F/\xdd\x5cs\x83\x01\xcf\x0b\xc3\ +\xa0\xa5\xba\x08\x96\x08sXXr\x09\x05\xf8i`\x15\ +naN\x9e\xb4\xac\xa6WS^L\x00\x02\xfc1\x04\ +\xd9\xff\x06\x06\xc1\x00\x07\x00\x15\x00\x17@\x0a\x01\x0b\x05\ +\x0e\x0f\x15\x01\x15\x0b\x12\x00/3\xdd]2\xcc\x119\ +10\x01#&'53\x16\x17%\x16\x16326\ +73\x06\x06#\x22&'\xfe\x00\x83je\xdd/F\ +\xfe\xcb\x08rY[p\x08\x95\x09\xb9\xa4\xa1\xc3\x0b\x05\ +\xddUz\x15`i3K_WS\xa7\xab\xb3\x9f\x00\ +\x02\xfc1\x04\xd9\xff\x06\x07\x06\x00\x12\x00 \x00-@\ +\x16\x19\x0f \x01 \x1d\x03\x06\x06\x05\x0d\x0b\x0b\x0f\x10\ +\x01\x10\x05\x05\x16\x16\x1d\x00/3\x113/\xcc]2\ +\x113\x129\x113\x10\xcd]210\x01\x14\x06\x07\ +\x07#'6654#\x22\x075632\x16\x05\ +\x16\x1632673\x06\x06#\x22&'\xfe12\ +6\x06k\x0a3';5\x1d\x16FVd\xfe\x9a\x08\ +rY[p\x08\x95\x09\xb9\xa4\xa1\xc3\x0b\x06\x7f4A\ +\x12)n\x09\x18\x19)\x08h\x06C\x98K_WS\ +\xa7\xab\xb3\x9f\x00\x00\x02\xfc1\x04\xd9\xff\x06\x07\x10\x00\ +\x0c\x00$\x00+@\x17\x12\x19\x19\x22@\x09\x0dH\x22\ +\x16\x1e\x0d\x0d\x16\x05\x0f\x0c\x1f\x0c\x02\x0c\x03\x09\x00/\ +3\xdd]2\xc62/3\x10\xcc+2/310\ +\x01\x16\x163273\x06\x06#\x22&'%\x22.\ +\x02#\x22\x06\x07#6632\x1e\x023267\ +3\x06\x06\xfc\xcb\x07jb\xc5\x0e\x95\x09\xb8\xa5\xa3\xc1\ +\x0b\x02\x06$KHC\x1c+(\x0dq\x09b\x5c%\ +MHB\x1a))\x0eq\x0bh\x06\x02;F\x81\x92\ +\x97\x9f\x8a1\x19\x1e\x19$.dy\x1a\x1e\x1a$0\ +mp\x00\x00\x01\x00\x0a\xfe\x14\x01\xa0\x00\x00\x00\x12\x00\ ++@\x13\x04\x03\x03\x0d\x0d\x08\x00\x00\x14\x13\x08\x00\x00\ +\x03\x10\x10\x0b\x1b\x03\x00/?3\x11\x129\x113\x11\ +\x12\x019\x1133\x129\x11310\x174&'\ +3\x1e\x02\x15\x14\x06#\x22'5\x16326\xcdN\ +F\xb3OB#\x8apJR<7#-\xe34m\ +B\x0254\ +&#\x22\x06\x07'6632\x16\x15\x14\x06\x07\x07\ +\x15!\x04?\xfc\x03\x01p\x9dZ,PTT\xa0X\ +\xa1\x89\xeb\x87\xd7\xf2z\xb3\xbc\x02 \xcf\x01\x02mT\ +P03@MH\xc6wZ\xb0\xa0x\xb3{\x7f\x0e\ +\x00\x00\x01\x00N\xfe\xa8\x04B\x04\x87\x00&\x00V@\ +-\x17\x03\x1c\x1c\x00\x00\x22\x13\x07\x07(\x0c\x22\x22'\ +\x03\x18\x17\x18\x17PY\x0c\x18|\x18\x02\x0d\x03\x18\x18\ +\x0a$$\x1eOY$&\x0a\x10OY\x0a%\x00?\ ++\x00\x18?+\x11\x12\x009\x18/_^]+\x11\ +\x12\x009\x11\x013\x113\x113\x113\x129\x113\ +\x113910\x01\x14\x06\x07\x15\x16\x16\x15\x14\x04!\ +\x22'\x11\x16\x1632654&##532\ +654#\x22\x06\x07'6!2\x04\x04\x17\xa6\x96\ +\xb1\xb6\xfe\xce\xfe\xe4\xee\xb8U\xccd\x99\x92\xa8\xb8o\ +q\xaa\x9d\xd0H\x95[\x8f\xc8\x01\x15\xe3\x01\x07\x03+\ +\x89\xc0$\x06\x16\xab\x91\xd3\xebO\x01\x07+6hs\ +gV\xedYl\xa60;\xd5\x90\xb8\x00\x02\x00\x17\xfe\ +\xa8\x04y\x04s\x00\x0a\x00\x14\x00F@\x22\x0f\x07\x03\ +\x09\x02\x02\x0b\x03\x03\x05\x00\x00\x16\x14\x05\x05\x15\x06\x14\ +\x01\x05\x14\x05PY\x09\x14\x14\x03\x0f\x07\x10\x03%\x00\ +??3\x129/3+\x11\x003\x129\x11\x013\ +\x113\x113\x11\x129\x1133\x113\x12991\ +0%#\x11!\x11!5\x01!\x113!546\ +7#\x06\x06\x07\x03\x04y\xb0\xfe\xc4\xfd\x8a\x02\x95\x01\ +\x1d\xb0\xfe#\x08\x04\x08\x19V\x1d\xe9\x1b\xfe\x8d\x01s\ +\xcc\x03\x8c\xfc\x97\xdb2\xdb\x220\x86%\xfe\xd1\x00\x00\ +\x01\x00d\xfe\xa8\x045\x04r\x00\x1b\x00P@(\x18\ +\x15\x15\x17\x14\x0e\x03\x03\x1d\x13\x19\x19\x08\x14\x14\x1c\x14\ +\x13\x13\x10\x00\x10OY\x00\x00\x06\x15\x15\x18NY\x15\ +\x10\x06\x0cOY\x06%\x00?+\x00\x18?+\x11\x12\ +\x009\x18/+\x11\x003\x113\x11\x013\x1133\ +\x129\x113\x113\x1299\x11310\x012\x16\ +\x15\x14\x00!\x22'\x11\x16\x163 54!\x22\x06\ +\x07'\x13!\x11!\x0376\x02f\xd4\xfb\xfe\xd2\xfe\ +\xe7\xf4\x96O\xd2^\x01\x1b\xfe\xdb5\x80({7\x03\ +\x19\xfd\xf6\x1b#=\x02b\xee\xcf\xf5\xfe\xf8O\x01\x0b\ +*5\xe8\xdd\x15\x0cB\x02\xe9\xfe\xfa\xfe\xe1\x07\x0e\xff\ +\xff\x00H\xff\xec\x04P\x05\xc7\x02\x06\x00\x19\x00\x00\x00\ +\x01\x007\xfe\xbc\x04P\x04p\x00\x06\x00,@\x15\x06\ +\x00\x00\x02\x01\x05\x05\x08\x02\x07\x05\x03\x02\x03\x02NY\ +\x03\x10\x00$\x00??+\x11\x12\x009\x11\x013\x11\ +3\x113\x129\x11310\x13\x01!\x11!\x15\x01\ +\xe3\x02%\xfd/\x04\x19\xfd\xd7\xfe\xbc\x04\xb0\x01\x04\xc2\ +\xfb\x0e\x00\xff\xff\x00H\xff\xec\x04J\x05\xc9\x02\x06\x00\ +\x1b\x00\x00\x00\x02\x00B\xfe\xaa\x04J\x04\x85\x00\x19\x00\ +%\x00F@#\x1d\x05\x13\x0c\x0c##\x00\x13\x00&\ +'\x0c \x10\x10 PY\x10\x10\x03\x16\x16\x1aOY\ +\x16&\x03\x08PY\x03%\x00?+\x00\x18?+\x11\ +\x12\x009\x18/+\x11\x12\x009\x11\x12\x0199\x11\ +3\x129\x11\x129210\x01\x10\x00!\x22'5\ +\x1632667#\x06\x06#\x22&54\x003\ +2\x16\x12%\x22\x06\x15\x14\x1632654&\x04\ +J\xfe\x94\xfe\x8f\x82CT\x5c\x9b\xc8j\x08\x0c:\x98\ +r\xbf\xdc\x01\x0b\xe6\xa2\xf3\x82\xfd\xef`lbd^\ +\x86}\x02\x04\xfeP\xfeV\x0e\xf8\x15[\xc3\xab^L\ +\xf5\xda\xeb\x01\x11\x98\xfe\xdf\xc1\x84|j|{Pw\ +\xa4\xff\xff\x00)\x00\x00\x06\x8e\x06\x1f\x00&\x00I\x00\ +\x00\x00\x07\x00I\x03\x19\x00\x00\x00\x02\x00R\x02\xdd\x05\ +\x85\x05\xc1\x00#\x004\x00\x81@@\x1e\x05\x124$\ +,+,-\x030&(()\x18\x17\x17\x0b\x00)\ +200//)\x12\x03562&&,*$\ +$)\x12\x1e\x00\x0b\x1e\x0b\x1b\x06\x08\x08\x03\x030)\ +)*5\x18\x1b\x1b\x15\x15-*\x03\x00?33/\ +3\x113\x11\x129/33/3\x113\x1299\ +\x113\x113\x113/\x1299\x113\x11\x12\x01\x17\ +9\x113\x129\x10\xca22\x113\x113\x129\x11\ +\x179\x1133\x113310\x01\x14\x06#\x22'\ +5\x1632654&'.\x0254632\ +\x17\x07&&#\x22\x06\x15\x14\x16\x17\x16\x16\x01\x03#\ +\x17\x11#\x113\x13\x133\x11#\x117#\x03\x02\x19\ +\x8buoXsX-/#%lH'\x80r_\ +p48<'%-*JiF\x01\x87\xa6\x06\x04\ +\xa4\xf8\xa0\xaa\xef\xa8\x04\x06\xae\x03\xb2dq+\x906\ +'#\x1b&\x125\xff\xae\x007\x01@\xff\xae\x007\x01C\xffq\x00\ +7\x01D\xff\x5c\x007\x01F\xff\x5c\x007\x01G\xff\ +\xd7\x007\x01H\xffq\x007\x01J\xff\x85\x007\x01\ +\xfb\xff\xd7\x007\x01\xfd\xff\xd7\x007\x02\x02\xff\xae\x00\ +7\x02\x03\xff\xae\x007\x02\x04\xff\xae\x007\x02\x08\xff\ +\x85\x007\x02\x0c\xff\x85\x007\x02W\xff\x9a\x007\x02\ +X\xffq\x007\x02Y\xff\x5c\x007\x02_\xff\xd7\x00\ +7\x02`\xffq\x007\x02b\xff\x9a\x007\x03\x1d\xff\ +q\x007\x03\x1e\xff\x5c\x007\x03\x1f\xffq\x007\x03\ + \xff\x5c\x007\x03!\xffq\x007\x03\x22\xff\x5c\x00\ +7\x03#\xffq\x007\x03%\xffq\x007\x03&\xff\ +\x5c\x007\x03'\xffq\x007\x03(\xff\x5c\x007\x03\ +)\xffq\x007\x03*\xff\x5c\x007\x03+\xffq\x00\ +7\x03,\xff\x5c\x007\x03-\xffq\x007\x03.\xff\ +\x5c\x007\x03/\xffq\x007\x030\xff\x5c\x007\x03\ +1\xffq\x007\x032\xff\x5c\x007\x033\xffq\x00\ +7\x034\xff\x5c\x007\x036\xffq\x007\x038\xff\ +q\x007\x03:\xffq\x007\x03<\xffq\x007\x03\ +@\xffq\x007\x03B\xffq\x007\x03D\xffq\x00\ +7\x03I\xff\xd7\x007\x03J\xffq\x007\x03K\xff\ +\xd7\x007\x03L\xffq\x007\x03M\xff\xd7\x007\x03\ +N\xffq\x007\x03O\xff\xd7\x007\x03Q\xff\xd7\x00\ +7\x03R\xffq\x007\x03S\xff\xd7\x007\x03T\xff\ +q\x007\x03U\xff\xd7\x007\x03V\xffq\x007\x03\ +W\xff\xd7\x007\x03X\xffq\x007\x03Y\xff\xd7\x00\ +7\x03Z\xffq\x007\x03[\xff\xd7\x007\x03\x5c\xff\ +q\x007\x03]\xff\xd7\x007\x03^\xffq\x007\x03\ +_\xff\xd7\x007\x03`\xffq\x007\x03b\xff\x9a\x00\ +7\x03d\xff\x9a\x007\x03f\xff\x9a\x007\x03h\xff\ +\x9a\x007\x03j\xff\x9a\x007\x03l\xff\x9a\x007\x03\ +n\xff\x9a\x007\x03p\xff\xd7\x007\x03\x8f\x00)\x00\ +8\x00\x0f\xff\xd7\x008\x00\x11\xff\xd7\x008\x00$\xff\ +\xec\x008\x00\x82\xff\xec\x008\x00\x83\xff\xec\x008\x00\ +\x84\xff\xec\x008\x00\x85\xff\xec\x008\x00\x86\xff\xec\x00\ +8\x00\x87\xff\xec\x008\x00\xc2\xff\xec\x008\x00\xc4\xff\ +\xec\x008\x00\xc6\xff\xec\x008\x01C\xff\xec\x008\x02\ +\x08\xff\xd7\x008\x02\x0c\xff\xd7\x008\x02X\xff\xec\x00\ +8\x03\x1d\xff\xec\x008\x03\x1f\xff\xec\x008\x03!\xff\ +\xec\x008\x03#\xff\xec\x008\x03%\xff\xec\x008\x03\ +'\xff\xec\x008\x03)\xff\xec\x008\x03+\xff\xec\x00\ +8\x03-\xff\xec\x008\x03/\xff\xec\x008\x031\xff\ +\xec\x008\x033\xff\xec\x009\x00\x0f\xff\x9a\x009\x00\ +\x11\xff\x9a\x009\x00\x22\x00)\x009\x00$\xff\xae\x00\ +9\x00&\xff\xec\x009\x00*\xff\xec\x009\x002\xff\ +\xec\x009\x004\xff\xec\x009\x00D\xff\xd7\x009\x00\ +F\xff\xd7\x009\x00G\xff\xd7\x009\x00H\xff\xd7\x00\ +9\x00J\xff\xec\x009\x00P\xff\xec\x009\x00Q\xff\ +\xec\x009\x00R\xff\xd7\x009\x00S\xff\xec\x009\x00\ +T\xff\xd7\x009\x00U\xff\xec\x009\x00V\xff\xec\x00\ +9\x00X\xff\xec\x009\x00\x82\xff\xae\x009\x00\x83\xff\ +\xae\x009\x00\x84\xff\xae\x009\x00\x85\xff\xae\x009\x00\ +\x86\xff\xae\x009\x00\x87\xff\xae\x009\x00\x89\xff\xec\x00\ +9\x00\x94\xff\xec\x009\x00\x95\xff\xec\x009\x00\x96\xff\ +\xec\x009\x00\x97\xff\xec\x009\x00\x98\xff\xec\x009\x00\ +\x9a\xff\xec\x009\x00\xa2\xff\xd7\x009\x00\xa3\xff\xd7\x00\ +9\x00\xa4\xff\xd7\x009\x00\xa5\xff\xd7\x009\x00\xa6\xff\ +\xd7\x009\x00\xa7\xff\xd7\x009\x00\xa8\xff\xd7\x009\x00\ +\xa9\xff\xd7\x009\x00\xaa\xff\xd7\x009\x00\xab\xff\xd7\x00\ +9\x00\xac\xff\xd7\x009\x00\xad\xff\xd7\x009\x00\xb4\xff\ +\xd7\x009\x00\xb5\xff\xd7\x009\x00\xb6\xff\xd7\x009\x00\ +\xb7\xff\xd7\x009\x00\xb8\xff\xd7\x009\x00\xba\xff\xd7\x00\ +9\x00\xbb\xff\xec\x009\x00\xbc\xff\xec\x009\x00\xbd\xff\ +\xec\x009\x00\xbe\xff\xec\x009\x00\xc2\xff\xae\x009\x00\ +\xc3\xff\xd7\x009\x00\xc4\xff\xae\x009\x00\xc5\xff\xd7\x00\ +9\x00\xc6\xff\xae\x009\x00\xc7\xff\xd7\x009\x00\xc8\xff\ +\xec\x009\x00\xc9\xff\xd7\x009\x00\xca\xff\xec\x009\x00\ +\xcb\xff\xd7\x009\x00\xcc\xff\xec\x009\x00\xcd\xff\xd7\x00\ +9\x00\xce\xff\xec\x009\x00\xcf\xff\xd7\x009\x00\xd1\xff\ +\xd7\x009\x00\xd3\xff\xd7\x009\x00\xd5\xff\xd7\x009\x00\ +\xd7\xff\xd7\x009\x00\xd9\xff\xd7\x009\x00\xdb\xff\xd7\x00\ +9\x00\xdd\xff\xd7\x009\x00\xde\xff\xec\x009\x00\xdf\xff\ +\xec\x009\x00\xe0\xff\xec\x009\x00\xe1\xff\xec\x009\x00\ +\xe2\xff\xec\x009\x00\xe3\xff\xec\x009\x00\xe4\xff\xec\x00\ +9\x00\xe5\xff\xec\x009\x00\xfa\xff\xec\x009\x01\x06\xff\ +\xec\x009\x01\x08\xff\xec\x009\x01\x0d\xff\xec\x009\x01\ +\x0e\xff\xec\x009\x01\x0f\xff\xd7\x009\x01\x10\xff\xec\x00\ +9\x01\x11\xff\xd7\x009\x01\x12\xff\xec\x009\x01\x13\xff\ +\xd7\x009\x01\x14\xff\xec\x009\x01\x15\xff\xd7\x009\x01\ +\x17\xff\xec\x009\x01\x19\xff\xec\x009\x01\x1d\xff\xec\x00\ +9\x01!\xff\xec\x009\x01+\xff\xec\x009\x01-\xff\ +\xec\x009\x01/\xff\xec\x009\x011\xff\xec\x009\x01\ +3\xff\xec\x009\x015\xff\xec\x009\x01C\xff\xae\x00\ +9\x01D\xff\xd7\x009\x01F\xff\xd7\x009\x01G\xff\ +\xec\x009\x01H\xff\xd7\x009\x01J\xff\xec\x009\x02\ +\x08\xff\x9a\x009\x02\x0c\xff\x9a\x009\x02W\xff\xec\x00\ +9\x02X\xff\xae\x009\x02Y\xff\xd7\x009\x02_\xff\ +\xec\x009\x02`\xff\xd7\x009\x02b\xff\xec\x009\x03\ +\x1d\xff\xae\x009\x03\x1e\xff\xd7\x009\x03\x1f\xff\xae\x00\ +9\x03 \xff\xd7\x009\x03!\xff\xae\x009\x03\x22\xff\ +\xd7\x009\x03#\xff\xae\x009\x03%\xff\xae\x009\x03\ +&\xff\xd7\x009\x03'\xff\xae\x009\x03(\xff\xd7\x00\ +9\x03)\xff\xae\x009\x03*\xff\xd7\x009\x03+\xff\ +\xae\x009\x03,\xff\xd7\x009\x03-\xff\xae\x009\x03\ +.\xff\xd7\x009\x03/\xff\xae\x009\x030\xff\xd7\x00\ +9\x031\xff\xae\x009\x032\xff\xd7\x009\x033\xff\ +\xae\x009\x034\xff\xd7\x009\x036\xff\xd7\x009\x03\ +8\xff\xd7\x009\x03:\xff\xd7\x009\x03<\xff\xd7\x00\ +9\x03@\xff\xd7\x009\x03B\xff\xd7\x009\x03D\xff\ +\xd7\x009\x03I\xff\xec\x009\x03J\xff\xd7\x009\x03\ +K\xff\xec\x009\x03L\xff\xd7\x009\x03M\xff\xec\x00\ +9\x03N\xff\xd7\x009\x03O\xff\xec\x009\x03Q\xff\ +\xec\x009\x03R\xff\xd7\x009\x03S\xff\xec\x009\x03\ +T\xff\xd7\x009\x03U\xff\xec\x009\x03V\xff\xd7\x00\ +9\x03W\xff\xec\x009\x03X\xff\xd7\x009\x03Y\xff\ +\xec\x009\x03Z\xff\xd7\x009\x03[\xff\xec\x009\x03\ +\x5c\xff\xd7\x009\x03]\xff\xec\x009\x03^\xff\xd7\x00\ +9\x03_\xff\xec\x009\x03`\xff\xd7\x009\x03b\xff\ +\xec\x009\x03d\xff\xec\x009\x03f\xff\xec\x009\x03\ +h\xff\xec\x009\x03j\xff\xec\x009\x03l\xff\xec\x00\ +9\x03n\xff\xec\x00:\x00\x0f\xff\x9a\x00:\x00\x11\xff\ +\x9a\x00:\x00\x22\x00)\x00:\x00$\xff\xae\x00:\x00\ +&\xff\xec\x00:\x00*\xff\xec\x00:\x002\xff\xec\x00\ +:\x004\xff\xec\x00:\x00D\xff\xd7\x00:\x00F\xff\ +\xd7\x00:\x00G\xff\xd7\x00:\x00H\xff\xd7\x00:\x00\ +J\xff\xec\x00:\x00P\xff\xec\x00:\x00Q\xff\xec\x00\ +:\x00R\xff\xd7\x00:\x00S\xff\xec\x00:\x00T\xff\ +\xd7\x00:\x00U\xff\xec\x00:\x00V\xff\xec\x00:\x00\ +X\xff\xec\x00:\x00\x82\xff\xae\x00:\x00\x83\xff\xae\x00\ +:\x00\x84\xff\xae\x00:\x00\x85\xff\xae\x00:\x00\x86\xff\ +\xae\x00:\x00\x87\xff\xae\x00:\x00\x89\xff\xec\x00:\x00\ +\x94\xff\xec\x00:\x00\x95\xff\xec\x00:\x00\x96\xff\xec\x00\ +:\x00\x97\xff\xec\x00:\x00\x98\xff\xec\x00:\x00\x9a\xff\ +\xec\x00:\x00\xa2\xff\xd7\x00:\x00\xa3\xff\xd7\x00:\x00\ +\xa4\xff\xd7\x00:\x00\xa5\xff\xd7\x00:\x00\xa6\xff\xd7\x00\ +:\x00\xa7\xff\xd7\x00:\x00\xa8\xff\xd7\x00:\x00\xa9\xff\ +\xd7\x00:\x00\xaa\xff\xd7\x00:\x00\xab\xff\xd7\x00:\x00\ +\xac\xff\xd7\x00:\x00\xad\xff\xd7\x00:\x00\xb4\xff\xd7\x00\ +:\x00\xb5\xff\xd7\x00:\x00\xb6\xff\xd7\x00:\x00\xb7\xff\ +\xd7\x00:\x00\xb8\xff\xd7\x00:\x00\xba\xff\xd7\x00:\x00\ +\xbb\xff\xec\x00:\x00\xbc\xff\xec\x00:\x00\xbd\xff\xec\x00\ +:\x00\xbe\xff\xec\x00:\x00\xc2\xff\xae\x00:\x00\xc3\xff\ +\xd7\x00:\x00\xc4\xff\xae\x00:\x00\xc5\xff\xd7\x00:\x00\ +\xc6\xff\xae\x00:\x00\xc7\xff\xd7\x00:\x00\xc8\xff\xec\x00\ +:\x00\xc9\xff\xd7\x00:\x00\xca\xff\xec\x00:\x00\xcb\xff\ +\xd7\x00:\x00\xcc\xff\xec\x00:\x00\xcd\xff\xd7\x00:\x00\ +\xce\xff\xec\x00:\x00\xcf\xff\xd7\x00:\x00\xd1\xff\xd7\x00\ +:\x00\xd3\xff\xd7\x00:\x00\xd5\xff\xd7\x00:\x00\xd7\xff\ +\xd7\x00:\x00\xd9\xff\xd7\x00:\x00\xdb\xff\xd7\x00:\x00\ +\xdd\xff\xd7\x00:\x00\xde\xff\xec\x00:\x00\xdf\xff\xec\x00\ +:\x00\xe0\xff\xec\x00:\x00\xe1\xff\xec\x00:\x00\xe2\xff\ +\xec\x00:\x00\xe3\xff\xec\x00:\x00\xe4\xff\xec\x00:\x00\ +\xe5\xff\xec\x00:\x00\xfa\xff\xec\x00:\x01\x06\xff\xec\x00\ +:\x01\x08\xff\xec\x00:\x01\x0d\xff\xec\x00:\x01\x0e\xff\ +\xec\x00:\x01\x0f\xff\xd7\x00:\x01\x10\xff\xec\x00:\x01\ +\x11\xff\xd7\x00:\x01\x12\xff\xec\x00:\x01\x13\xff\xd7\x00\ +:\x01\x14\xff\xec\x00:\x01\x15\xff\xd7\x00:\x01\x17\xff\ +\xec\x00:\x01\x19\xff\xec\x00:\x01\x1d\xff\xec\x00:\x01\ +!\xff\xec\x00:\x01+\xff\xec\x00:\x01-\xff\xec\x00\ +:\x01/\xff\xec\x00:\x011\xff\xec\x00:\x013\xff\ +\xec\x00:\x015\xff\xec\x00:\x01C\xff\xae\x00:\x01\ +D\xff\xd7\x00:\x01F\xff\xd7\x00:\x01G\xff\xec\x00\ +:\x01H\xff\xd7\x00:\x01J\xff\xec\x00:\x02\x08\xff\ +\x9a\x00:\x02\x0c\xff\x9a\x00:\x02W\xff\xec\x00:\x02\ +X\xff\xae\x00:\x02Y\xff\xd7\x00:\x02_\xff\xec\x00\ +:\x02`\xff\xd7\x00:\x02b\xff\xec\x00:\x03\x1d\xff\ +\xae\x00:\x03\x1e\xff\xd7\x00:\x03\x1f\xff\xae\x00:\x03\ + \xff\xd7\x00:\x03!\xff\xae\x00:\x03\x22\xff\xd7\x00\ +:\x03#\xff\xae\x00:\x03%\xff\xae\x00:\x03&\xff\ +\xd7\x00:\x03'\xff\xae\x00:\x03(\xff\xd7\x00:\x03\ +)\xff\xae\x00:\x03*\xff\xd7\x00:\x03+\xff\xae\x00\ +:\x03,\xff\xd7\x00:\x03-\xff\xae\x00:\x03.\xff\ +\xd7\x00:\x03/\xff\xae\x00:\x030\xff\xd7\x00:\x03\ +1\xff\xae\x00:\x032\xff\xd7\x00:\x033\xff\xae\x00\ +:\x034\xff\xd7\x00:\x036\xff\xd7\x00:\x038\xff\ +\xd7\x00:\x03:\xff\xd7\x00:\x03<\xff\xd7\x00:\x03\ +@\xff\xd7\x00:\x03B\xff\xd7\x00:\x03D\xff\xd7\x00\ +:\x03I\xff\xec\x00:\x03J\xff\xd7\x00:\x03K\xff\ +\xec\x00:\x03L\xff\xd7\x00:\x03M\xff\xec\x00:\x03\ +N\xff\xd7\x00:\x03O\xff\xec\x00:\x03Q\xff\xec\x00\ +:\x03R\xff\xd7\x00:\x03S\xff\xec\x00:\x03T\xff\ +\xd7\x00:\x03U\xff\xec\x00:\x03V\xff\xd7\x00:\x03\ +W\xff\xec\x00:\x03X\xff\xd7\x00:\x03Y\xff\xec\x00\ +:\x03Z\xff\xd7\x00:\x03[\xff\xec\x00:\x03\x5c\xff\ +\xd7\x00:\x03]\xff\xec\x00:\x03^\xff\xd7\x00:\x03\ +_\xff\xec\x00:\x03`\xff\xd7\x00:\x03b\xff\xec\x00\ +:\x03d\xff\xec\x00:\x03f\xff\xec\x00:\x03h\xff\ +\xec\x00:\x03j\xff\xec\x00:\x03l\xff\xec\x00:\x03\ +n\xff\xec\x00;\x00&\xff\xd7\x00;\x00*\xff\xd7\x00\ +;\x002\xff\xd7\x00;\x004\xff\xd7\x00;\x00\x89\xff\ +\xd7\x00;\x00\x94\xff\xd7\x00;\x00\x95\xff\xd7\x00;\x00\ +\x96\xff\xd7\x00;\x00\x97\xff\xd7\x00;\x00\x98\xff\xd7\x00\ +;\x00\x9a\xff\xd7\x00;\x00\xc8\xff\xd7\x00;\x00\xca\xff\ +\xd7\x00;\x00\xcc\xff\xd7\x00;\x00\xce\xff\xd7\x00;\x00\ +\xde\xff\xd7\x00;\x00\xe0\xff\xd7\x00;\x00\xe2\xff\xd7\x00\ +;\x00\xe4\xff\xd7\x00;\x01\x0e\xff\xd7\x00;\x01\x10\xff\ +\xd7\x00;\x01\x12\xff\xd7\x00;\x01\x14\xff\xd7\x00;\x01\ +G\xff\xd7\x00;\x02_\xff\xd7\x00;\x03I\xff\xd7\x00\ +;\x03K\xff\xd7\x00;\x03M\xff\xd7\x00;\x03O\xff\ +\xd7\x00;\x03Q\xff\xd7\x00;\x03S\xff\xd7\x00;\x03\ +U\xff\xd7\x00;\x03W\xff\xd7\x00;\x03Y\xff\xd7\x00\ +;\x03[\xff\xd7\x00;\x03]\xff\xd7\x00;\x03_\xff\ +\xd7\x00<\x00\x0f\xff\x85\x00<\x00\x11\xff\x85\x00<\x00\ +\x22\x00)\x00<\x00$\xff\x85\x00<\x00&\xff\xd7\x00\ +<\x00*\xff\xd7\x00<\x002\xff\xd7\x00<\x004\xff\ +\xd7\x00<\x00D\xff\x9a\x00<\x00F\xff\x9a\x00<\x00\ +G\xff\x9a\x00<\x00H\xff\x9a\x00<\x00J\xff\xd7\x00\ +<\x00P\xff\xc3\x00<\x00Q\xff\xc3\x00<\x00R\xff\ +\x9a\x00<\x00S\xff\xc3\x00<\x00T\xff\x9a\x00<\x00\ +U\xff\xc3\x00<\x00V\xff\xae\x00<\x00X\xff\xc3\x00\ +<\x00]\xff\xd7\x00<\x00\x82\xff\x85\x00<\x00\x83\xff\ +\x85\x00<\x00\x84\xff\x85\x00<\x00\x85\xff\x85\x00<\x00\ +\x86\xff\x85\x00<\x00\x87\xff\x85\x00<\x00\x89\xff\xd7\x00\ +<\x00\x94\xff\xd7\x00<\x00\x95\xff\xd7\x00<\x00\x96\xff\ +\xd7\x00<\x00\x97\xff\xd7\x00<\x00\x98\xff\xd7\x00<\x00\ +\x9a\xff\xd7\x00<\x00\xa2\xff\x9a\x00<\x00\xa3\xff\x9a\x00\ +<\x00\xa4\xff\x9a\x00<\x00\xa5\xff\x9a\x00<\x00\xa6\xff\ +\x9a\x00<\x00\xa7\xff\x9a\x00<\x00\xa8\xff\x9a\x00<\x00\ +\xa9\xff\x9a\x00<\x00\xaa\xff\x9a\x00<\x00\xab\xff\x9a\x00\ +<\x00\xac\xff\x9a\x00<\x00\xad\xff\x9a\x00<\x00\xb4\xff\ +\x9a\x00<\x00\xb5\xff\x9a\x00<\x00\xb6\xff\x9a\x00<\x00\ +\xb7\xff\x9a\x00<\x00\xb8\xff\x9a\x00<\x00\xba\xff\x9a\x00\ +<\x00\xbb\xff\xc3\x00<\x00\xbc\xff\xc3\x00<\x00\xbd\xff\ +\xc3\x00<\x00\xbe\xff\xc3\x00<\x00\xc2\xff\x85\x00<\x00\ +\xc3\xff\x9a\x00<\x00\xc4\xff\x85\x00<\x00\xc5\xff\x9a\x00\ +<\x00\xc6\xff\x85\x00<\x00\xc7\xff\x9a\x00<\x00\xc8\xff\ +\xd7\x00<\x00\xc9\xff\x9a\x00<\x00\xca\xff\xd7\x00<\x00\ +\xcb\xff\x9a\x00<\x00\xcc\xff\xd7\x00<\x00\xcd\xff\x9a\x00\ +<\x00\xce\xff\xd7\x00<\x00\xcf\xff\x9a\x00<\x00\xd1\xff\ +\x9a\x00<\x00\xd3\xff\x9a\x00<\x00\xd5\xff\x9a\x00<\x00\ +\xd7\xff\x9a\x00<\x00\xd9\xff\x9a\x00<\x00\xdb\xff\x9a\x00\ +<\x00\xdd\xff\x9a\x00<\x00\xde\xff\xd7\x00<\x00\xdf\xff\ +\xd7\x00<\x00\xe0\xff\xd7\x00<\x00\xe1\xff\xd7\x00<\x00\ +\xe2\xff\xd7\x00<\x00\xe3\xff\xd7\x00<\x00\xe4\xff\xd7\x00\ +<\x00\xe5\xff\xd7\x00<\x00\xfa\xff\xc3\x00<\x01\x06\xff\ +\xc3\x00<\x01\x08\xff\xc3\x00<\x01\x0d\xff\xc3\x00<\x01\ +\x0e\xff\xd7\x00<\x01\x0f\xff\x9a\x00<\x01\x10\xff\xd7\x00\ +<\x01\x11\xff\x9a\x00<\x01\x12\xff\xd7\x00<\x01\x13\xff\ +\x9a\x00<\x01\x14\xff\xd7\x00<\x01\x15\xff\x9a\x00<\x01\ +\x17\xff\xc3\x00<\x01\x19\xff\xc3\x00<\x01\x1d\xff\xae\x00\ +<\x01!\xff\xae\x00<\x01+\xff\xc3\x00<\x01-\xff\ +\xc3\x00<\x01/\xff\xc3\x00<\x011\xff\xc3\x00<\x01\ +3\xff\xc3\x00<\x015\xff\xc3\x00<\x01<\xff\xd7\x00\ +<\x01>\xff\xd7\x00<\x01@\xff\xd7\x00<\x01C\xff\ +\x85\x00<\x01D\xff\x9a\x00<\x01F\xff\x9a\x00<\x01\ +G\xff\xd7\x00<\x01H\xff\x9a\x00<\x01J\xff\xae\x00\ +<\x02\x08\xff\x85\x00<\x02\x0c\xff\x85\x00<\x02W\xff\ +\xc3\x00<\x02X\xff\x85\x00<\x02Y\xff\x9a\x00<\x02\ +_\xff\xd7\x00<\x02`\xff\x9a\x00<\x02b\xff\xc3\x00\ +<\x03\x1d\xff\x85\x00<\x03\x1e\xff\x9a\x00<\x03\x1f\xff\ +\x85\x00<\x03 \xff\x9a\x00<\x03!\xff\x85\x00<\x03\ +\x22\xff\x9a\x00<\x03#\xff\x85\x00<\x03%\xff\x85\x00\ +<\x03&\xff\x9a\x00<\x03'\xff\x85\x00<\x03(\xff\ +\x9a\x00<\x03)\xff\x85\x00<\x03*\xff\x9a\x00<\x03\ ++\xff\x85\x00<\x03,\xff\x9a\x00<\x03-\xff\x85\x00\ +<\x03.\xff\x9a\x00<\x03/\xff\x85\x00<\x030\xff\ +\x9a\x00<\x031\xff\x85\x00<\x032\xff\x9a\x00<\x03\ +3\xff\x85\x00<\x034\xff\x9a\x00<\x036\xff\x9a\x00\ +<\x038\xff\x9a\x00<\x03:\xff\x9a\x00<\x03<\xff\ +\x9a\x00<\x03@\xff\x9a\x00<\x03B\xff\x9a\x00<\x03\ +D\xff\x9a\x00<\x03I\xff\xd7\x00<\x03J\xff\x9a\x00\ +<\x03K\xff\xd7\x00<\x03L\xff\x9a\x00<\x03M\xff\ +\xd7\x00<\x03N\xff\x9a\x00<\x03O\xff\xd7\x00<\x03\ +Q\xff\xd7\x00<\x03R\xff\x9a\x00<\x03S\xff\xd7\x00\ +<\x03T\xff\x9a\x00<\x03U\xff\xd7\x00<\x03V\xff\ +\x9a\x00<\x03W\xff\xd7\x00<\x03X\xff\x9a\x00<\x03\ +Y\xff\xd7\x00<\x03Z\xff\x9a\x00<\x03[\xff\xd7\x00\ +<\x03\x5c\xff\x9a\x00<\x03]\xff\xd7\x00<\x03^\xff\ +\x9a\x00<\x03_\xff\xd7\x00<\x03`\xff\x9a\x00<\x03\ +b\xff\xc3\x00<\x03d\xff\xc3\x00<\x03f\xff\xc3\x00\ +<\x03h\xff\xc3\x00<\x03j\xff\xc3\x00<\x03l\xff\ +\xc3\x00<\x03n\xff\xc3\x00=\x00&\xff\xec\x00=\x00\ +*\xff\xec\x00=\x002\xff\xec\x00=\x004\xff\xec\x00\ +=\x00\x89\xff\xec\x00=\x00\x94\xff\xec\x00=\x00\x95\xff\ +\xec\x00=\x00\x96\xff\xec\x00=\x00\x97\xff\xec\x00=\x00\ +\x98\xff\xec\x00=\x00\x9a\xff\xec\x00=\x00\xc8\xff\xec\x00\ +=\x00\xca\xff\xec\x00=\x00\xcc\xff\xec\x00=\x00\xce\xff\ +\xec\x00=\x00\xde\xff\xec\x00=\x00\xe0\xff\xec\x00=\x00\ +\xe2\xff\xec\x00=\x00\xe4\xff\xec\x00=\x01\x0e\xff\xec\x00\ +=\x01\x10\xff\xec\x00=\x01\x12\xff\xec\x00=\x01\x14\xff\ +\xec\x00=\x01G\xff\xec\x00=\x02_\xff\xec\x00=\x03\ +I\xff\xec\x00=\x03K\xff\xec\x00=\x03M\xff\xec\x00\ +=\x03O\xff\xec\x00=\x03Q\xff\xec\x00=\x03S\xff\ +\xec\x00=\x03U\xff\xec\x00=\x03W\xff\xec\x00=\x03\ +Y\xff\xec\x00=\x03[\xff\xec\x00=\x03]\xff\xec\x00\ +=\x03_\xff\xec\x00>\x00-\x00\xb8\x00D\x00\x05\xff\ +\xec\x00D\x00\x0a\xff\xec\x00D\x02\x07\xff\xec\x00D\x02\ +\x0b\xff\xec\x00E\x00\x05\xff\xec\x00E\x00\x0a\xff\xec\x00\ +E\x00Y\xff\xd7\x00E\x00Z\xff\xd7\x00E\x00[\xff\ +\xd7\x00E\x00\x5c\xff\xd7\x00E\x00]\xff\xec\x00E\x00\ +\xbf\xff\xd7\x00E\x017\xff\xd7\x00E\x01<\xff\xec\x00\ +E\x01>\xff\xec\x00E\x01@\xff\xec\x00E\x01\xfb\xff\ +\xd7\x00E\x01\xfd\xff\xd7\x00E\x02\x07\xff\xec\x00E\x02\ +\x0b\xff\xec\x00E\x03p\xff\xd7\x00F\x00\x05\x00)\x00\ +F\x00\x0a\x00)\x00F\x02\x07\x00)\x00F\x02\x0b\x00\ +)\x00H\x00\x05\xff\xec\x00H\x00\x0a\xff\xec\x00H\x00\ +Y\xff\xd7\x00H\x00Z\xff\xd7\x00H\x00[\xff\xd7\x00\ +H\x00\x5c\xff\xd7\x00H\x00]\xff\xec\x00H\x00\xbf\xff\ +\xd7\x00H\x017\xff\xd7\x00H\x01<\xff\xec\x00H\x01\ +>\xff\xec\x00H\x01@\xff\xec\x00H\x01\xfb\xff\xd7\x00\ +H\x01\xfd\xff\xd7\x00H\x02\x07\xff\xec\x00H\x02\x0b\xff\ +\xec\x00H\x03p\xff\xd7\x00I\x00\x05\x00{\x00I\x00\ +\x0a\x00{\x00I\x02\x07\x00{\x00I\x02\x0b\x00{\x00\ +K\x00\x05\xff\xec\x00K\x00\x0a\xff\xec\x00K\x02\x07\xff\ +\xec\x00K\x02\x0b\xff\xec\x00N\x00F\xff\xd7\x00N\x00\ +G\xff\xd7\x00N\x00H\xff\xd7\x00N\x00R\xff\xd7\x00\ +N\x00T\xff\xd7\x00N\x00\xa2\xff\xd7\x00N\x00\xa9\xff\ +\xd7\x00N\x00\xaa\xff\xd7\x00N\x00\xab\xff\xd7\x00N\x00\ +\xac\xff\xd7\x00N\x00\xad\xff\xd7\x00N\x00\xb4\xff\xd7\x00\ +N\x00\xb5\xff\xd7\x00N\x00\xb6\xff\xd7\x00N\x00\xb7\xff\ +\xd7\x00N\x00\xb8\xff\xd7\x00N\x00\xba\xff\xd7\x00N\x00\ +\xc9\xff\xd7\x00N\x00\xcb\xff\xd7\x00N\x00\xcd\xff\xd7\x00\ +N\x00\xcf\xff\xd7\x00N\x00\xd1\xff\xd7\x00N\x00\xd3\xff\ +\xd7\x00N\x00\xd5\xff\xd7\x00N\x00\xd7\xff\xd7\x00N\x00\ +\xd9\xff\xd7\x00N\x00\xdb\xff\xd7\x00N\x00\xdd\xff\xd7\x00\ +N\x01\x0f\xff\xd7\x00N\x01\x11\xff\xd7\x00N\x01\x13\xff\ +\xd7\x00N\x01\x15\xff\xd7\x00N\x01H\xff\xd7\x00N\x02\ +`\xff\xd7\x00N\x036\xff\xd7\x00N\x038\xff\xd7\x00\ +N\x03:\xff\xd7\x00N\x03<\xff\xd7\x00N\x03@\xff\ +\xd7\x00N\x03B\xff\xd7\x00N\x03D\xff\xd7\x00N\x03\ +J\xff\xd7\x00N\x03L\xff\xd7\x00N\x03N\xff\xd7\x00\ +N\x03R\xff\xd7\x00N\x03T\xff\xd7\x00N\x03V\xff\ +\xd7\x00N\x03X\xff\xd7\x00N\x03Z\xff\xd7\x00N\x03\ +\x5c\xff\xd7\x00N\x03^\xff\xd7\x00N\x03`\xff\xd7\x00\ +P\x00\x05\xff\xec\x00P\x00\x0a\xff\xec\x00P\x02\x07\xff\ +\xec\x00P\x02\x0b\xff\xec\x00Q\x00\x05\xff\xec\x00Q\x00\ +\x0a\xff\xec\x00Q\x02\x07\xff\xec\x00Q\x02\x0b\xff\xec\x00\ +R\x00\x05\xff\xec\x00R\x00\x0a\xff\xec\x00R\x00Y\xff\ +\xd7\x00R\x00Z\xff\xd7\x00R\x00[\xff\xd7\x00R\x00\ +\x5c\xff\xd7\x00R\x00]\xff\xec\x00R\x00\xbf\xff\xd7\x00\ +R\x017\xff\xd7\x00R\x01<\xff\xec\x00R\x01>\xff\ +\xec\x00R\x01@\xff\xec\x00R\x01\xfb\xff\xd7\x00R\x01\ +\xfd\xff\xd7\x00R\x02\x07\xff\xec\x00R\x02\x0b\xff\xec\x00\ +R\x03p\xff\xd7\x00S\x00\x05\xff\xec\x00S\x00\x0a\xff\ +\xec\x00S\x00Y\xff\xd7\x00S\x00Z\xff\xd7\x00S\x00\ +[\xff\xd7\x00S\x00\x5c\xff\xd7\x00S\x00]\xff\xec\x00\ +S\x00\xbf\xff\xd7\x00S\x017\xff\xd7\x00S\x01<\xff\ +\xec\x00S\x01>\xff\xec\x00S\x01@\xff\xec\x00S\x01\ +\xfb\xff\xd7\x00S\x01\xfd\xff\xd7\x00S\x02\x07\xff\xec\x00\ +S\x02\x0b\xff\xec\x00S\x03p\xff\xd7\x00U\x00\x05\x00\ +R\x00U\x00\x0a\x00R\x00U\x00D\xff\xd7\x00U\x00\ +F\xff\xd7\x00U\x00G\xff\xd7\x00U\x00H\xff\xd7\x00\ +U\x00J\xff\xec\x00U\x00R\xff\xd7\x00U\x00T\xff\ +\xd7\x00U\x00\xa2\xff\xd7\x00U\x00\xa3\xff\xd7\x00U\x00\ +\xa4\xff\xd7\x00U\x00\xa5\xff\xd7\x00U\x00\xa6\xff\xd7\x00\ +U\x00\xa7\xff\xd7\x00U\x00\xa8\xff\xd7\x00U\x00\xa9\xff\ +\xd7\x00U\x00\xaa\xff\xd7\x00U\x00\xab\xff\xd7\x00U\x00\ +\xac\xff\xd7\x00U\x00\xad\xff\xd7\x00U\x00\xb4\xff\xd7\x00\ +U\x00\xb5\xff\xd7\x00U\x00\xb6\xff\xd7\x00U\x00\xb7\xff\ +\xd7\x00U\x00\xb8\xff\xd7\x00U\x00\xba\xff\xd7\x00U\x00\ +\xc3\xff\xd7\x00U\x00\xc5\xff\xd7\x00U\x00\xc7\xff\xd7\x00\ +U\x00\xc9\xff\xd7\x00U\x00\xcb\xff\xd7\x00U\x00\xcd\xff\ +\xd7\x00U\x00\xcf\xff\xd7\x00U\x00\xd1\xff\xd7\x00U\x00\ +\xd3\xff\xd7\x00U\x00\xd5\xff\xd7\x00U\x00\xd7\xff\xd7\x00\ +U\x00\xd9\xff\xd7\x00U\x00\xdb\xff\xd7\x00U\x00\xdd\xff\ +\xd7\x00U\x00\xdf\xff\xec\x00U\x00\xe1\xff\xec\x00U\x00\ +\xe3\xff\xec\x00U\x00\xe5\xff\xec\x00U\x01\x0f\xff\xd7\x00\ +U\x01\x11\xff\xd7\x00U\x01\x13\xff\xd7\x00U\x01\x15\xff\ +\xd7\x00U\x01D\xff\xd7\x00U\x01F\xff\xd7\x00U\x01\ +H\xff\xd7\x00U\x02\x07\x00R\x00U\x02\x0b\x00R\x00\ +U\x02Y\xff\xd7\x00U\x02`\xff\xd7\x00U\x03\x1e\xff\ +\xd7\x00U\x03 \xff\xd7\x00U\x03\x22\xff\xd7\x00U\x03\ +&\xff\xd7\x00U\x03(\xff\xd7\x00U\x03*\xff\xd7\x00\ +U\x03,\xff\xd7\x00U\x03.\xff\xd7\x00U\x030\xff\ +\xd7\x00U\x032\xff\xd7\x00U\x034\xff\xd7\x00U\x03\ +6\xff\xd7\x00U\x038\xff\xd7\x00U\x03:\xff\xd7\x00\ +U\x03<\xff\xd7\x00U\x03@\xff\xd7\x00U\x03B\xff\ +\xd7\x00U\x03D\xff\xd7\x00U\x03J\xff\xd7\x00U\x03\ +L\xff\xd7\x00U\x03N\xff\xd7\x00U\x03R\xff\xd7\x00\ +U\x03T\xff\xd7\x00U\x03V\xff\xd7\x00U\x03X\xff\ +\xd7\x00U\x03Z\xff\xd7\x00U\x03\x5c\xff\xd7\x00U\x03\ +^\xff\xd7\x00U\x03`\xff\xd7\x00W\x00\x05\x00)\x00\ +W\x00\x0a\x00)\x00W\x02\x07\x00)\x00W\x02\x0b\x00\ +)\x00Y\x00\x05\x00R\x00Y\x00\x0a\x00R\x00Y\x00\ +\x0f\xff\xae\x00Y\x00\x11\xff\xae\x00Y\x00\x22\x00)\x00\ +Y\x02\x07\x00R\x00Y\x02\x08\xff\xae\x00Y\x02\x0b\x00\ +R\x00Y\x02\x0c\xff\xae\x00Z\x00\x05\x00R\x00Z\x00\ +\x0a\x00R\x00Z\x00\x0f\xff\xae\x00Z\x00\x11\xff\xae\x00\ +Z\x00\x22\x00)\x00Z\x02\x07\x00R\x00Z\x02\x08\xff\ +\xae\x00Z\x02\x0b\x00R\x00Z\x02\x0c\xff\xae\x00[\x00\ +F\xff\xd7\x00[\x00G\xff\xd7\x00[\x00H\xff\xd7\x00\ +[\x00R\xff\xd7\x00[\x00T\xff\xd7\x00[\x00\xa2\xff\ +\xd7\x00[\x00\xa9\xff\xd7\x00[\x00\xaa\xff\xd7\x00[\x00\ +\xab\xff\xd7\x00[\x00\xac\xff\xd7\x00[\x00\xad\xff\xd7\x00\ +[\x00\xb4\xff\xd7\x00[\x00\xb5\xff\xd7\x00[\x00\xb6\xff\ +\xd7\x00[\x00\xb7\xff\xd7\x00[\x00\xb8\xff\xd7\x00[\x00\ +\xba\xff\xd7\x00[\x00\xc9\xff\xd7\x00[\x00\xcb\xff\xd7\x00\ +[\x00\xcd\xff\xd7\x00[\x00\xcf\xff\xd7\x00[\x00\xd1\xff\ +\xd7\x00[\x00\xd3\xff\xd7\x00[\x00\xd5\xff\xd7\x00[\x00\ +\xd7\xff\xd7\x00[\x00\xd9\xff\xd7\x00[\x00\xdb\xff\xd7\x00\ +[\x00\xdd\xff\xd7\x00[\x01\x0f\xff\xd7\x00[\x01\x11\xff\ +\xd7\x00[\x01\x13\xff\xd7\x00[\x01\x15\xff\xd7\x00[\x01\ +H\xff\xd7\x00[\x02`\xff\xd7\x00[\x036\xff\xd7\x00\ +[\x038\xff\xd7\x00[\x03:\xff\xd7\x00[\x03<\xff\ +\xd7\x00[\x03@\xff\xd7\x00[\x03B\xff\xd7\x00[\x03\ +D\xff\xd7\x00[\x03J\xff\xd7\x00[\x03L\xff\xd7\x00\ +[\x03N\xff\xd7\x00[\x03R\xff\xd7\x00[\x03T\xff\ +\xd7\x00[\x03V\xff\xd7\x00[\x03X\xff\xd7\x00[\x03\ +Z\xff\xd7\x00[\x03\x5c\xff\xd7\x00[\x03^\xff\xd7\x00\ +[\x03`\xff\xd7\x00\x5c\x00\x05\x00R\x00\x5c\x00\x0a\x00\ +R\x00\x5c\x00\x0f\xff\xae\x00\x5c\x00\x11\xff\xae\x00\x5c\x00\ +\x22\x00)\x00\x5c\x02\x07\x00R\x00\x5c\x02\x08\xff\xae\x00\ +\x5c\x02\x0b\x00R\x00\x5c\x02\x0c\xff\xae\x00^\x00-\x00\ +\xb8\x00\x82\x00\x05\xffq\x00\x82\x00\x0a\xffq\x00\x82\x00\ +&\xff\xd7\x00\x82\x00*\xff\xd7\x00\x82\x00-\x01\x0a\x00\ +\x82\x002\xff\xd7\x00\x82\x004\xff\xd7\x00\x82\x007\xff\ +q\x00\x82\x009\xff\xae\x00\x82\x00:\xff\xae\x00\x82\x00\ +<\xff\x85\x00\x82\x00\x89\xff\xd7\x00\x82\x00\x94\xff\xd7\x00\ +\x82\x00\x95\xff\xd7\x00\x82\x00\x96\xff\xd7\x00\x82\x00\x97\xff\ +\xd7\x00\x82\x00\x98\xff\xd7\x00\x82\x00\x9a\xff\xd7\x00\x82\x00\ +\x9f\xff\x85\x00\x82\x00\xc8\xff\xd7\x00\x82\x00\xca\xff\xd7\x00\ +\x82\x00\xcc\xff\xd7\x00\x82\x00\xce\xff\xd7\x00\x82\x00\xde\xff\ +\xd7\x00\x82\x00\xe0\xff\xd7\x00\x82\x00\xe2\xff\xd7\x00\x82\x00\ +\xe4\xff\xd7\x00\x82\x01\x0e\xff\xd7\x00\x82\x01\x10\xff\xd7\x00\ +\x82\x01\x12\xff\xd7\x00\x82\x01\x14\xff\xd7\x00\x82\x01$\xff\ +q\x00\x82\x01&\xffq\x00\x82\x016\xff\xae\x00\x82\x01\ +8\xff\x85\x00\x82\x01:\xff\x85\x00\x82\x01G\xff\xd7\x00\ +\x82\x01\xfa\xff\xae\x00\x82\x01\xfc\xff\xae\x00\x82\x01\xfe\xff\ +\xae\x00\x82\x02\x00\xff\x85\x00\x82\x02\x07\xffq\x00\x82\x02\ +\x0b\xffq\x00\x82\x02_\xff\xd7\x00\x82\x03I\xff\xd7\x00\ +\x82\x03K\xff\xd7\x00\x82\x03M\xff\xd7\x00\x82\x03O\xff\ +\xd7\x00\x82\x03Q\xff\xd7\x00\x82\x03S\xff\xd7\x00\x82\x03\ +U\xff\xd7\x00\x82\x03W\xff\xd7\x00\x82\x03Y\xff\xd7\x00\ +\x82\x03[\xff\xd7\x00\x82\x03]\xff\xd7\x00\x82\x03_\xff\ +\xd7\x00\x82\x03o\xff\x85\x00\x82\x03q\xff\x85\x00\x82\x03\ +s\xff\x85\x00\x82\x03\x8f\xffq\x00\x83\x00\x05\xffq\x00\ +\x83\x00\x0a\xffq\x00\x83\x00&\xff\xd7\x00\x83\x00*\xff\ +\xd7\x00\x83\x00-\x01\x0a\x00\x83\x002\xff\xd7\x00\x83\x00\ +4\xff\xd7\x00\x83\x007\xffq\x00\x83\x009\xff\xae\x00\ +\x83\x00:\xff\xae\x00\x83\x00<\xff\x85\x00\x83\x00\x89\xff\ +\xd7\x00\x83\x00\x94\xff\xd7\x00\x83\x00\x95\xff\xd7\x00\x83\x00\ +\x96\xff\xd7\x00\x83\x00\x97\xff\xd7\x00\x83\x00\x98\xff\xd7\x00\ +\x83\x00\x9a\xff\xd7\x00\x83\x00\x9f\xff\x85\x00\x83\x00\xc8\xff\ +\xd7\x00\x83\x00\xca\xff\xd7\x00\x83\x00\xcc\xff\xd7\x00\x83\x00\ +\xce\xff\xd7\x00\x83\x00\xde\xff\xd7\x00\x83\x00\xe0\xff\xd7\x00\ +\x83\x00\xe2\xff\xd7\x00\x83\x00\xe4\xff\xd7\x00\x83\x01\x0e\xff\ +\xd7\x00\x83\x01\x10\xff\xd7\x00\x83\x01\x12\xff\xd7\x00\x83\x01\ +\x14\xff\xd7\x00\x83\x01$\xffq\x00\x83\x01&\xffq\x00\ +\x83\x016\xff\xae\x00\x83\x018\xff\x85\x00\x83\x01:\xff\ +\x85\x00\x83\x01G\xff\xd7\x00\x83\x01\xfa\xff\xae\x00\x83\x01\ +\xfc\xff\xae\x00\x83\x01\xfe\xff\xae\x00\x83\x02\x00\xff\x85\x00\ +\x83\x02\x07\xffq\x00\x83\x02\x0b\xffq\x00\x83\x02_\xff\ +\xd7\x00\x83\x03I\xff\xd7\x00\x83\x03K\xff\xd7\x00\x83\x03\ +M\xff\xd7\x00\x83\x03O\xff\xd7\x00\x83\x03Q\xff\xd7\x00\ +\x83\x03S\xff\xd7\x00\x83\x03U\xff\xd7\x00\x83\x03W\xff\ +\xd7\x00\x83\x03Y\xff\xd7\x00\x83\x03[\xff\xd7\x00\x83\x03\ +]\xff\xd7\x00\x83\x03_\xff\xd7\x00\x83\x03o\xff\x85\x00\ +\x83\x03q\xff\x85\x00\x83\x03s\xff\x85\x00\x83\x03\x8f\xff\ +q\x00\x84\x00\x05\xffq\x00\x84\x00\x0a\xffq\x00\x84\x00\ +&\xff\xd7\x00\x84\x00*\xff\xd7\x00\x84\x00-\x01\x0a\x00\ +\x84\x002\xff\xd7\x00\x84\x004\xff\xd7\x00\x84\x007\xff\ +q\x00\x84\x009\xff\xae\x00\x84\x00:\xff\xae\x00\x84\x00\ +<\xff\x85\x00\x84\x00\x89\xff\xd7\x00\x84\x00\x94\xff\xd7\x00\ +\x84\x00\x95\xff\xd7\x00\x84\x00\x96\xff\xd7\x00\x84\x00\x97\xff\ +\xd7\x00\x84\x00\x98\xff\xd7\x00\x84\x00\x9a\xff\xd7\x00\x84\x00\ +\x9f\xff\x85\x00\x84\x00\xc8\xff\xd7\x00\x84\x00\xca\xff\xd7\x00\ +\x84\x00\xcc\xff\xd7\x00\x84\x00\xce\xff\xd7\x00\x84\x00\xde\xff\ +\xd7\x00\x84\x00\xe0\xff\xd7\x00\x84\x00\xe2\xff\xd7\x00\x84\x00\ +\xe4\xff\xd7\x00\x84\x01\x0e\xff\xd7\x00\x84\x01\x10\xff\xd7\x00\ +\x84\x01\x12\xff\xd7\x00\x84\x01\x14\xff\xd7\x00\x84\x01$\xff\ +q\x00\x84\x01&\xffq\x00\x84\x016\xff\xae\x00\x84\x01\ +8\xff\x85\x00\x84\x01:\xff\x85\x00\x84\x01G\xff\xd7\x00\ +\x84\x01\xfa\xff\xae\x00\x84\x01\xfc\xff\xae\x00\x84\x01\xfe\xff\ +\xae\x00\x84\x02\x00\xff\x85\x00\x84\x02\x07\xffq\x00\x84\x02\ +\x0b\xffq\x00\x84\x02_\xff\xd7\x00\x84\x03I\xff\xd7\x00\ +\x84\x03K\xff\xd7\x00\x84\x03M\xff\xd7\x00\x84\x03O\xff\ +\xd7\x00\x84\x03Q\xff\xd7\x00\x84\x03S\xff\xd7\x00\x84\x03\ +U\xff\xd7\x00\x84\x03W\xff\xd7\x00\x84\x03Y\xff\xd7\x00\ +\x84\x03[\xff\xd7\x00\x84\x03]\xff\xd7\x00\x84\x03_\xff\ +\xd7\x00\x84\x03o\xff\x85\x00\x84\x03q\xff\x85\x00\x84\x03\ +s\xff\x85\x00\x84\x03\x8f\xffq\x00\x85\x00\x05\xffq\x00\ +\x85\x00\x0a\xffq\x00\x85\x00&\xff\xd7\x00\x85\x00*\xff\ +\xd7\x00\x85\x00-\x01\x0a\x00\x85\x002\xff\xd7\x00\x85\x00\ +4\xff\xd7\x00\x85\x007\xffq\x00\x85\x009\xff\xae\x00\ +\x85\x00:\xff\xae\x00\x85\x00<\xff\x85\x00\x85\x00\x89\xff\ +\xd7\x00\x85\x00\x94\xff\xd7\x00\x85\x00\x95\xff\xd7\x00\x85\x00\ +\x96\xff\xd7\x00\x85\x00\x97\xff\xd7\x00\x85\x00\x98\xff\xd7\x00\ +\x85\x00\x9a\xff\xd7\x00\x85\x00\x9f\xff\x85\x00\x85\x00\xc8\xff\ +\xd7\x00\x85\x00\xca\xff\xd7\x00\x85\x00\xcc\xff\xd7\x00\x85\x00\ +\xce\xff\xd7\x00\x85\x00\xde\xff\xd7\x00\x85\x00\xe0\xff\xd7\x00\ +\x85\x00\xe2\xff\xd7\x00\x85\x00\xe4\xff\xd7\x00\x85\x01\x0e\xff\ +\xd7\x00\x85\x01\x10\xff\xd7\x00\x85\x01\x12\xff\xd7\x00\x85\x01\ +\x14\xff\xd7\x00\x85\x01$\xffq\x00\x85\x01&\xffq\x00\ +\x85\x016\xff\xae\x00\x85\x018\xff\x85\x00\x85\x01:\xff\ +\x85\x00\x85\x01G\xff\xd7\x00\x85\x01\xfa\xff\xae\x00\x85\x01\ +\xfc\xff\xae\x00\x85\x01\xfe\xff\xae\x00\x85\x02\x00\xff\x85\x00\ +\x85\x02\x07\xffq\x00\x85\x02\x0b\xffq\x00\x85\x02_\xff\ +\xd7\x00\x85\x03I\xff\xd7\x00\x85\x03K\xff\xd7\x00\x85\x03\ +M\xff\xd7\x00\x85\x03O\xff\xd7\x00\x85\x03Q\xff\xd7\x00\ +\x85\x03S\xff\xd7\x00\x85\x03U\xff\xd7\x00\x85\x03W\xff\ +\xd7\x00\x85\x03Y\xff\xd7\x00\x85\x03[\xff\xd7\x00\x85\x03\ +]\xff\xd7\x00\x85\x03_\xff\xd7\x00\x85\x03o\xff\x85\x00\ +\x85\x03q\xff\x85\x00\x85\x03s\xff\x85\x00\x85\x03\x8f\xff\ +q\x00\x86\x00\x05\xffq\x00\x86\x00\x0a\xffq\x00\x86\x00\ +&\xff\xd7\x00\x86\x00*\xff\xd7\x00\x86\x00-\x01\x0a\x00\ +\x86\x002\xff\xd7\x00\x86\x004\xff\xd7\x00\x86\x007\xff\ +q\x00\x86\x009\xff\xae\x00\x86\x00:\xff\xae\x00\x86\x00\ +<\xff\x85\x00\x86\x00\x89\xff\xd7\x00\x86\x00\x94\xff\xd7\x00\ +\x86\x00\x95\xff\xd7\x00\x86\x00\x96\xff\xd7\x00\x86\x00\x97\xff\ +\xd7\x00\x86\x00\x98\xff\xd7\x00\x86\x00\x9a\xff\xd7\x00\x86\x00\ +\x9f\xff\x85\x00\x86\x00\xc8\xff\xd7\x00\x86\x00\xca\xff\xd7\x00\ +\x86\x00\xcc\xff\xd7\x00\x86\x00\xce\xff\xd7\x00\x86\x00\xde\xff\ +\xd7\x00\x86\x00\xe0\xff\xd7\x00\x86\x00\xe2\xff\xd7\x00\x86\x00\ +\xe4\xff\xd7\x00\x86\x01\x0e\xff\xd7\x00\x86\x01\x10\xff\xd7\x00\ +\x86\x01\x12\xff\xd7\x00\x86\x01\x14\xff\xd7\x00\x86\x01$\xff\ +q\x00\x86\x01&\xffq\x00\x86\x016\xff\xae\x00\x86\x01\ +8\xff\x85\x00\x86\x01:\xff\x85\x00\x86\x01G\xff\xd7\x00\ +\x86\x01\xfa\xff\xae\x00\x86\x01\xfc\xff\xae\x00\x86\x01\xfe\xff\ +\xae\x00\x86\x02\x00\xff\x85\x00\x86\x02\x07\xffq\x00\x86\x02\ +\x0b\xffq\x00\x86\x02_\xff\xd7\x00\x86\x03I\xff\xd7\x00\ +\x86\x03K\xff\xd7\x00\x86\x03M\xff\xd7\x00\x86\x03O\xff\ +\xd7\x00\x86\x03Q\xff\xd7\x00\x86\x03S\xff\xd7\x00\x86\x03\ +U\xff\xd7\x00\x86\x03W\xff\xd7\x00\x86\x03Y\xff\xd7\x00\ +\x86\x03[\xff\xd7\x00\x86\x03]\xff\xd7\x00\x86\x03_\xff\ +\xd7\x00\x86\x03o\xff\x85\x00\x86\x03q\xff\x85\x00\x86\x03\ +s\xff\x85\x00\x86\x03\x8f\xffq\x00\x87\x00\x05\xffq\x00\ +\x87\x00\x0a\xffq\x00\x87\x00&\xff\xd7\x00\x87\x00*\xff\ +\xd7\x00\x87\x00-\x01\x0a\x00\x87\x002\xff\xd7\x00\x87\x00\ +4\xff\xd7\x00\x87\x007\xffq\x00\x87\x009\xff\xae\x00\ +\x87\x00:\xff\xae\x00\x87\x00<\xff\x85\x00\x87\x00\x89\xff\ +\xd7\x00\x87\x00\x94\xff\xd7\x00\x87\x00\x95\xff\xd7\x00\x87\x00\ +\x96\xff\xd7\x00\x87\x00\x97\xff\xd7\x00\x87\x00\x98\xff\xd7\x00\ +\x87\x00\x9a\xff\xd7\x00\x87\x00\x9f\xff\x85\x00\x87\x00\xc8\xff\ +\xd7\x00\x87\x00\xca\xff\xd7\x00\x87\x00\xcc\xff\xd7\x00\x87\x00\ +\xce\xff\xd7\x00\x87\x00\xde\xff\xd7\x00\x87\x00\xe0\xff\xd7\x00\ +\x87\x00\xe2\xff\xd7\x00\x87\x00\xe4\xff\xd7\x00\x87\x01\x0e\xff\ +\xd7\x00\x87\x01\x10\xff\xd7\x00\x87\x01\x12\xff\xd7\x00\x87\x01\ +\x14\xff\xd7\x00\x87\x01$\xffq\x00\x87\x01&\xffq\x00\ +\x87\x016\xff\xae\x00\x87\x018\xff\x85\x00\x87\x01:\xff\ +\x85\x00\x87\x01G\xff\xd7\x00\x87\x01\xfa\xff\xae\x00\x87\x01\ +\xfc\xff\xae\x00\x87\x01\xfe\xff\xae\x00\x87\x02\x00\xff\x85\x00\ +\x87\x02\x07\xffq\x00\x87\x02\x0b\xffq\x00\x87\x02_\xff\ +\xd7\x00\x87\x03I\xff\xd7\x00\x87\x03K\xff\xd7\x00\x87\x03\ +M\xff\xd7\x00\x87\x03O\xff\xd7\x00\x87\x03Q\xff\xd7\x00\ +\x87\x03S\xff\xd7\x00\x87\x03U\xff\xd7\x00\x87\x03W\xff\ +\xd7\x00\x87\x03Y\xff\xd7\x00\x87\x03[\xff\xd7\x00\x87\x03\ +]\xff\xd7\x00\x87\x03_\xff\xd7\x00\x87\x03o\xff\x85\x00\ +\x87\x03q\xff\x85\x00\x87\x03s\xff\x85\x00\x87\x03\x8f\xff\ +q\x00\x88\x00-\x00{\x00\x89\x00&\xff\xd7\x00\x89\x00\ +*\xff\xd7\x00\x89\x002\xff\xd7\x00\x89\x004\xff\xd7\x00\ +\x89\x00\x89\xff\xd7\x00\x89\x00\x94\xff\xd7\x00\x89\x00\x95\xff\ +\xd7\x00\x89\x00\x96\xff\xd7\x00\x89\x00\x97\xff\xd7\x00\x89\x00\ +\x98\xff\xd7\x00\x89\x00\x9a\xff\xd7\x00\x89\x00\xc8\xff\xd7\x00\ +\x89\x00\xca\xff\xd7\x00\x89\x00\xcc\xff\xd7\x00\x89\x00\xce\xff\ +\xd7\x00\x89\x00\xde\xff\xd7\x00\x89\x00\xe0\xff\xd7\x00\x89\x00\ +\xe2\xff\xd7\x00\x89\x00\xe4\xff\xd7\x00\x89\x01\x0e\xff\xd7\x00\ +\x89\x01\x10\xff\xd7\x00\x89\x01\x12\xff\xd7\x00\x89\x01\x14\xff\ +\xd7\x00\x89\x01G\xff\xd7\x00\x89\x02_\xff\xd7\x00\x89\x03\ +I\xff\xd7\x00\x89\x03K\xff\xd7\x00\x89\x03M\xff\xd7\x00\ +\x89\x03O\xff\xd7\x00\x89\x03Q\xff\xd7\x00\x89\x03S\xff\ +\xd7\x00\x89\x03U\xff\xd7\x00\x89\x03W\xff\xd7\x00\x89\x03\ +Y\xff\xd7\x00\x89\x03[\xff\xd7\x00\x89\x03]\xff\xd7\x00\ +\x89\x03_\xff\xd7\x00\x8a\x00-\x00{\x00\x8b\x00-\x00\ +{\x00\x8c\x00-\x00{\x00\x8d\x00-\x00{\x00\x92\x00\ +\x0f\xff\xae\x00\x92\x00\x11\xff\xae\x00\x92\x00$\xff\xd7\x00\ +\x92\x007\xff\xc3\x00\x92\x009\xff\xec\x00\x92\x00:\xff\ +\xec\x00\x92\x00;\xff\xd7\x00\x92\x00<\xff\xec\x00\x92\x00\ +=\xff\xec\x00\x92\x00\x82\xff\xd7\x00\x92\x00\x83\xff\xd7\x00\ +\x92\x00\x84\xff\xd7\x00\x92\x00\x85\xff\xd7\x00\x92\x00\x86\xff\ +\xd7\x00\x92\x00\x87\xff\xd7\x00\x92\x00\x9f\xff\xec\x00\x92\x00\ +\xc2\xff\xd7\x00\x92\x00\xc4\xff\xd7\x00\x92\x00\xc6\xff\xd7\x00\ +\x92\x01$\xff\xc3\x00\x92\x01&\xff\xc3\x00\x92\x016\xff\ +\xec\x00\x92\x018\xff\xec\x00\x92\x01:\xff\xec\x00\x92\x01\ +;\xff\xec\x00\x92\x01=\xff\xec\x00\x92\x01?\xff\xec\x00\ +\x92\x01C\xff\xd7\x00\x92\x01\xa0\xff\xec\x00\x92\x01\xfa\xff\ +\xec\x00\x92\x01\xfc\xff\xec\x00\x92\x01\xfe\xff\xec\x00\x92\x02\ +\x00\xff\xec\x00\x92\x02\x08\xff\xae\x00\x92\x02\x0c\xff\xae\x00\ +\x92\x02X\xff\xd7\x00\x92\x03\x1d\xff\xd7\x00\x92\x03\x1f\xff\ +\xd7\x00\x92\x03!\xff\xd7\x00\x92\x03#\xff\xd7\x00\x92\x03\ +%\xff\xd7\x00\x92\x03'\xff\xd7\x00\x92\x03)\xff\xd7\x00\ +\x92\x03+\xff\xd7\x00\x92\x03-\xff\xd7\x00\x92\x03/\xff\ +\xd7\x00\x92\x031\xff\xd7\x00\x92\x033\xff\xd7\x00\x92\x03\ +o\xff\xec\x00\x92\x03q\xff\xec\x00\x92\x03s\xff\xec\x00\ +\x92\x03\x8f\xff\xc3\x00\x94\x00\x0f\xff\xae\x00\x94\x00\x11\xff\ +\xae\x00\x94\x00$\xff\xd7\x00\x94\x007\xff\xc3\x00\x94\x00\ +9\xff\xec\x00\x94\x00:\xff\xec\x00\x94\x00;\xff\xd7\x00\ +\x94\x00<\xff\xec\x00\x94\x00=\xff\xec\x00\x94\x00\x82\xff\ +\xd7\x00\x94\x00\x83\xff\xd7\x00\x94\x00\x84\xff\xd7\x00\x94\x00\ +\x85\xff\xd7\x00\x94\x00\x86\xff\xd7\x00\x94\x00\x87\xff\xd7\x00\ +\x94\x00\x9f\xff\xec\x00\x94\x00\xc2\xff\xd7\x00\x94\x00\xc4\xff\ +\xd7\x00\x94\x00\xc6\xff\xd7\x00\x94\x01$\xff\xc3\x00\x94\x01\ +&\xff\xc3\x00\x94\x016\xff\xec\x00\x94\x018\xff\xec\x00\ +\x94\x01:\xff\xec\x00\x94\x01;\xff\xec\x00\x94\x01=\xff\ +\xec\x00\x94\x01?\xff\xec\x00\x94\x01C\xff\xd7\x00\x94\x01\ +\xa0\xff\xec\x00\x94\x01\xfa\xff\xec\x00\x94\x01\xfc\xff\xec\x00\ +\x94\x01\xfe\xff\xec\x00\x94\x02\x00\xff\xec\x00\x94\x02\x08\xff\ +\xae\x00\x94\x02\x0c\xff\xae\x00\x94\x02X\xff\xd7\x00\x94\x03\ +\x1d\xff\xd7\x00\x94\x03\x1f\xff\xd7\x00\x94\x03!\xff\xd7\x00\ +\x94\x03#\xff\xd7\x00\x94\x03%\xff\xd7\x00\x94\x03'\xff\ +\xd7\x00\x94\x03)\xff\xd7\x00\x94\x03+\xff\xd7\x00\x94\x03\ +-\xff\xd7\x00\x94\x03/\xff\xd7\x00\x94\x031\xff\xd7\x00\ +\x94\x033\xff\xd7\x00\x94\x03o\xff\xec\x00\x94\x03q\xff\ +\xec\x00\x94\x03s\xff\xec\x00\x94\x03\x8f\xff\xc3\x00\x95\x00\ +\x0f\xff\xae\x00\x95\x00\x11\xff\xae\x00\x95\x00$\xff\xd7\x00\ +\x95\x007\xff\xc3\x00\x95\x009\xff\xec\x00\x95\x00:\xff\ +\xec\x00\x95\x00;\xff\xd7\x00\x95\x00<\xff\xec\x00\x95\x00\ +=\xff\xec\x00\x95\x00\x82\xff\xd7\x00\x95\x00\x83\xff\xd7\x00\ +\x95\x00\x84\xff\xd7\x00\x95\x00\x85\xff\xd7\x00\x95\x00\x86\xff\ +\xd7\x00\x95\x00\x87\xff\xd7\x00\x95\x00\x9f\xff\xec\x00\x95\x00\ +\xc2\xff\xd7\x00\x95\x00\xc4\xff\xd7\x00\x95\x00\xc6\xff\xd7\x00\ +\x95\x01$\xff\xc3\x00\x95\x01&\xff\xc3\x00\x95\x016\xff\ +\xec\x00\x95\x018\xff\xec\x00\x95\x01:\xff\xec\x00\x95\x01\ +;\xff\xec\x00\x95\x01=\xff\xec\x00\x95\x01?\xff\xec\x00\ +\x95\x01C\xff\xd7\x00\x95\x01\xa0\xff\xec\x00\x95\x01\xfa\xff\ +\xec\x00\x95\x01\xfc\xff\xec\x00\x95\x01\xfe\xff\xec\x00\x95\x02\ +\x00\xff\xec\x00\x95\x02\x08\xff\xae\x00\x95\x02\x0c\xff\xae\x00\ +\x95\x02X\xff\xd7\x00\x95\x03\x1d\xff\xd7\x00\x95\x03\x1f\xff\ +\xd7\x00\x95\x03!\xff\xd7\x00\x95\x03#\xff\xd7\x00\x95\x03\ +%\xff\xd7\x00\x95\x03'\xff\xd7\x00\x95\x03)\xff\xd7\x00\ +\x95\x03+\xff\xd7\x00\x95\x03-\xff\xd7\x00\x95\x03/\xff\ +\xd7\x00\x95\x031\xff\xd7\x00\x95\x033\xff\xd7\x00\x95\x03\ +o\xff\xec\x00\x95\x03q\xff\xec\x00\x95\x03s\xff\xec\x00\ +\x95\x03\x8f\xff\xc3\x00\x96\x00\x0f\xff\xae\x00\x96\x00\x11\xff\ +\xae\x00\x96\x00$\xff\xd7\x00\x96\x007\xff\xc3\x00\x96\x00\ +9\xff\xec\x00\x96\x00:\xff\xec\x00\x96\x00;\xff\xd7\x00\ +\x96\x00<\xff\xec\x00\x96\x00=\xff\xec\x00\x96\x00\x82\xff\ +\xd7\x00\x96\x00\x83\xff\xd7\x00\x96\x00\x84\xff\xd7\x00\x96\x00\ +\x85\xff\xd7\x00\x96\x00\x86\xff\xd7\x00\x96\x00\x87\xff\xd7\x00\ +\x96\x00\x9f\xff\xec\x00\x96\x00\xc2\xff\xd7\x00\x96\x00\xc4\xff\ +\xd7\x00\x96\x00\xc6\xff\xd7\x00\x96\x01$\xff\xc3\x00\x96\x01\ +&\xff\xc3\x00\x96\x016\xff\xec\x00\x96\x018\xff\xec\x00\ +\x96\x01:\xff\xec\x00\x96\x01;\xff\xec\x00\x96\x01=\xff\ +\xec\x00\x96\x01?\xff\xec\x00\x96\x01C\xff\xd7\x00\x96\x01\ +\xa0\xff\xec\x00\x96\x01\xfa\xff\xec\x00\x96\x01\xfc\xff\xec\x00\ +\x96\x01\xfe\xff\xec\x00\x96\x02\x00\xff\xec\x00\x96\x02\x08\xff\ +\xae\x00\x96\x02\x0c\xff\xae\x00\x96\x02X\xff\xd7\x00\x96\x03\ +\x1d\xff\xd7\x00\x96\x03\x1f\xff\xd7\x00\x96\x03!\xff\xd7\x00\ +\x96\x03#\xff\xd7\x00\x96\x03%\xff\xd7\x00\x96\x03'\xff\ +\xd7\x00\x96\x03)\xff\xd7\x00\x96\x03+\xff\xd7\x00\x96\x03\ +-\xff\xd7\x00\x96\x03/\xff\xd7\x00\x96\x031\xff\xd7\x00\ +\x96\x033\xff\xd7\x00\x96\x03o\xff\xec\x00\x96\x03q\xff\ +\xec\x00\x96\x03s\xff\xec\x00\x96\x03\x8f\xff\xc3\x00\x97\x00\ +\x0f\xff\xae\x00\x97\x00\x11\xff\xae\x00\x97\x00$\xff\xd7\x00\ +\x97\x007\xff\xc3\x00\x97\x009\xff\xec\x00\x97\x00:\xff\ +\xec\x00\x97\x00;\xff\xd7\x00\x97\x00<\xff\xec\x00\x97\x00\ +=\xff\xec\x00\x97\x00\x82\xff\xd7\x00\x97\x00\x83\xff\xd7\x00\ +\x97\x00\x84\xff\xd7\x00\x97\x00\x85\xff\xd7\x00\x97\x00\x86\xff\ +\xd7\x00\x97\x00\x87\xff\xd7\x00\x97\x00\x9f\xff\xec\x00\x97\x00\ +\xc2\xff\xd7\x00\x97\x00\xc4\xff\xd7\x00\x97\x00\xc6\xff\xd7\x00\ +\x97\x01$\xff\xc3\x00\x97\x01&\xff\xc3\x00\x97\x016\xff\ +\xec\x00\x97\x018\xff\xec\x00\x97\x01:\xff\xec\x00\x97\x01\ +;\xff\xec\x00\x97\x01=\xff\xec\x00\x97\x01?\xff\xec\x00\ +\x97\x01C\xff\xd7\x00\x97\x01\xa0\xff\xec\x00\x97\x01\xfa\xff\ +\xec\x00\x97\x01\xfc\xff\xec\x00\x97\x01\xfe\xff\xec\x00\x97\x02\ +\x00\xff\xec\x00\x97\x02\x08\xff\xae\x00\x97\x02\x0c\xff\xae\x00\ +\x97\x02X\xff\xd7\x00\x97\x03\x1d\xff\xd7\x00\x97\x03\x1f\xff\ +\xd7\x00\x97\x03!\xff\xd7\x00\x97\x03#\xff\xd7\x00\x97\x03\ +%\xff\xd7\x00\x97\x03'\xff\xd7\x00\x97\x03)\xff\xd7\x00\ +\x97\x03+\xff\xd7\x00\x97\x03-\xff\xd7\x00\x97\x03/\xff\ +\xd7\x00\x97\x031\xff\xd7\x00\x97\x033\xff\xd7\x00\x97\x03\ +o\xff\xec\x00\x97\x03q\xff\xec\x00\x97\x03s\xff\xec\x00\ +\x97\x03\x8f\xff\xc3\x00\x98\x00\x0f\xff\xae\x00\x98\x00\x11\xff\ +\xae\x00\x98\x00$\xff\xd7\x00\x98\x007\xff\xc3\x00\x98\x00\ +9\xff\xec\x00\x98\x00:\xff\xec\x00\x98\x00;\xff\xd7\x00\ +\x98\x00<\xff\xec\x00\x98\x00=\xff\xec\x00\x98\x00\x82\xff\ +\xd7\x00\x98\x00\x83\xff\xd7\x00\x98\x00\x84\xff\xd7\x00\x98\x00\ +\x85\xff\xd7\x00\x98\x00\x86\xff\xd7\x00\x98\x00\x87\xff\xd7\x00\ +\x98\x00\x9f\xff\xec\x00\x98\x00\xc2\xff\xd7\x00\x98\x00\xc4\xff\ +\xd7\x00\x98\x00\xc6\xff\xd7\x00\x98\x01$\xff\xc3\x00\x98\x01\ +&\xff\xc3\x00\x98\x016\xff\xec\x00\x98\x018\xff\xec\x00\ +\x98\x01:\xff\xec\x00\x98\x01;\xff\xec\x00\x98\x01=\xff\ +\xec\x00\x98\x01?\xff\xec\x00\x98\x01C\xff\xd7\x00\x98\x01\ +\xa0\xff\xec\x00\x98\x01\xfa\xff\xec\x00\x98\x01\xfc\xff\xec\x00\ +\x98\x01\xfe\xff\xec\x00\x98\x02\x00\xff\xec\x00\x98\x02\x08\xff\ +\xae\x00\x98\x02\x0c\xff\xae\x00\x98\x02X\xff\xd7\x00\x98\x03\ +\x1d\xff\xd7\x00\x98\x03\x1f\xff\xd7\x00\x98\x03!\xff\xd7\x00\ +\x98\x03#\xff\xd7\x00\x98\x03%\xff\xd7\x00\x98\x03'\xff\ +\xd7\x00\x98\x03)\xff\xd7\x00\x98\x03+\xff\xd7\x00\x98\x03\ +-\xff\xd7\x00\x98\x03/\xff\xd7\x00\x98\x031\xff\xd7\x00\ +\x98\x033\xff\xd7\x00\x98\x03o\xff\xec\x00\x98\x03q\xff\ +\xec\x00\x98\x03s\xff\xec\x00\x98\x03\x8f\xff\xc3\x00\x9a\x00\ +\x0f\xff\xae\x00\x9a\x00\x11\xff\xae\x00\x9a\x00$\xff\xd7\x00\ +\x9a\x007\xff\xc3\x00\x9a\x009\xff\xec\x00\x9a\x00:\xff\ +\xec\x00\x9a\x00;\xff\xd7\x00\x9a\x00<\xff\xec\x00\x9a\x00\ +=\xff\xec\x00\x9a\x00\x82\xff\xd7\x00\x9a\x00\x83\xff\xd7\x00\ +\x9a\x00\x84\xff\xd7\x00\x9a\x00\x85\xff\xd7\x00\x9a\x00\x86\xff\ +\xd7\x00\x9a\x00\x87\xff\xd7\x00\x9a\x00\x9f\xff\xec\x00\x9a\x00\ +\xc2\xff\xd7\x00\x9a\x00\xc4\xff\xd7\x00\x9a\x00\xc6\xff\xd7\x00\ +\x9a\x01$\xff\xc3\x00\x9a\x01&\xff\xc3\x00\x9a\x016\xff\ +\xec\x00\x9a\x018\xff\xec\x00\x9a\x01:\xff\xec\x00\x9a\x01\ +;\xff\xec\x00\x9a\x01=\xff\xec\x00\x9a\x01?\xff\xec\x00\ +\x9a\x01C\xff\xd7\x00\x9a\x01\xa0\xff\xec\x00\x9a\x01\xfa\xff\ +\xec\x00\x9a\x01\xfc\xff\xec\x00\x9a\x01\xfe\xff\xec\x00\x9a\x02\ +\x00\xff\xec\x00\x9a\x02\x08\xff\xae\x00\x9a\x02\x0c\xff\xae\x00\ +\x9a\x02X\xff\xd7\x00\x9a\x03\x1d\xff\xd7\x00\x9a\x03\x1f\xff\ +\xd7\x00\x9a\x03!\xff\xd7\x00\x9a\x03#\xff\xd7\x00\x9a\x03\ +%\xff\xd7\x00\x9a\x03'\xff\xd7\x00\x9a\x03)\xff\xd7\x00\ +\x9a\x03+\xff\xd7\x00\x9a\x03-\xff\xd7\x00\x9a\x03/\xff\ +\xd7\x00\x9a\x031\xff\xd7\x00\x9a\x033\xff\xd7\x00\x9a\x03\ +o\xff\xec\x00\x9a\x03q\xff\xec\x00\x9a\x03s\xff\xec\x00\ +\x9a\x03\x8f\xff\xc3\x00\x9b\x00\x0f\xff\xd7\x00\x9b\x00\x11\xff\ +\xd7\x00\x9b\x00$\xff\xec\x00\x9b\x00\x82\xff\xec\x00\x9b\x00\ +\x83\xff\xec\x00\x9b\x00\x84\xff\xec\x00\x9b\x00\x85\xff\xec\x00\ +\x9b\x00\x86\xff\xec\x00\x9b\x00\x87\xff\xec\x00\x9b\x00\xc2\xff\ +\xec\x00\x9b\x00\xc4\xff\xec\x00\x9b\x00\xc6\xff\xec\x00\x9b\x01\ +C\xff\xec\x00\x9b\x02\x08\xff\xd7\x00\x9b\x02\x0c\xff\xd7\x00\ +\x9b\x02X\xff\xec\x00\x9b\x03\x1d\xff\xec\x00\x9b\x03\x1f\xff\ +\xec\x00\x9b\x03!\xff\xec\x00\x9b\x03#\xff\xec\x00\x9b\x03\ +%\xff\xec\x00\x9b\x03'\xff\xec\x00\x9b\x03)\xff\xec\x00\ +\x9b\x03+\xff\xec\x00\x9b\x03-\xff\xec\x00\x9b\x03/\xff\ +\xec\x00\x9b\x031\xff\xec\x00\x9b\x033\xff\xec\x00\x9c\x00\ +\x0f\xff\xd7\x00\x9c\x00\x11\xff\xd7\x00\x9c\x00$\xff\xec\x00\ +\x9c\x00\x82\xff\xec\x00\x9c\x00\x83\xff\xec\x00\x9c\x00\x84\xff\ +\xec\x00\x9c\x00\x85\xff\xec\x00\x9c\x00\x86\xff\xec\x00\x9c\x00\ +\x87\xff\xec\x00\x9c\x00\xc2\xff\xec\x00\x9c\x00\xc4\xff\xec\x00\ +\x9c\x00\xc6\xff\xec\x00\x9c\x01C\xff\xec\x00\x9c\x02\x08\xff\ +\xd7\x00\x9c\x02\x0c\xff\xd7\x00\x9c\x02X\xff\xec\x00\x9c\x03\ +\x1d\xff\xec\x00\x9c\x03\x1f\xff\xec\x00\x9c\x03!\xff\xec\x00\ +\x9c\x03#\xff\xec\x00\x9c\x03%\xff\xec\x00\x9c\x03'\xff\ +\xec\x00\x9c\x03)\xff\xec\x00\x9c\x03+\xff\xec\x00\x9c\x03\ +-\xff\xec\x00\x9c\x03/\xff\xec\x00\x9c\x031\xff\xec\x00\ +\x9c\x033\xff\xec\x00\x9d\x00\x0f\xff\xd7\x00\x9d\x00\x11\xff\ +\xd7\x00\x9d\x00$\xff\xec\x00\x9d\x00\x82\xff\xec\x00\x9d\x00\ +\x83\xff\xec\x00\x9d\x00\x84\xff\xec\x00\x9d\x00\x85\xff\xec\x00\ +\x9d\x00\x86\xff\xec\x00\x9d\x00\x87\xff\xec\x00\x9d\x00\xc2\xff\ +\xec\x00\x9d\x00\xc4\xff\xec\x00\x9d\x00\xc6\xff\xec\x00\x9d\x01\ +C\xff\xec\x00\x9d\x02\x08\xff\xd7\x00\x9d\x02\x0c\xff\xd7\x00\ +\x9d\x02X\xff\xec\x00\x9d\x03\x1d\xff\xec\x00\x9d\x03\x1f\xff\ +\xec\x00\x9d\x03!\xff\xec\x00\x9d\x03#\xff\xec\x00\x9d\x03\ +%\xff\xec\x00\x9d\x03'\xff\xec\x00\x9d\x03)\xff\xec\x00\ +\x9d\x03+\xff\xec\x00\x9d\x03-\xff\xec\x00\x9d\x03/\xff\ +\xec\x00\x9d\x031\xff\xec\x00\x9d\x033\xff\xec\x00\x9e\x00\ +\x0f\xff\xd7\x00\x9e\x00\x11\xff\xd7\x00\x9e\x00$\xff\xec\x00\ +\x9e\x00\x82\xff\xec\x00\x9e\x00\x83\xff\xec\x00\x9e\x00\x84\xff\ +\xec\x00\x9e\x00\x85\xff\xec\x00\x9e\x00\x86\xff\xec\x00\x9e\x00\ +\x87\xff\xec\x00\x9e\x00\xc2\xff\xec\x00\x9e\x00\xc4\xff\xec\x00\ +\x9e\x00\xc6\xff\xec\x00\x9e\x01C\xff\xec\x00\x9e\x02\x08\xff\ +\xd7\x00\x9e\x02\x0c\xff\xd7\x00\x9e\x02X\xff\xec\x00\x9e\x03\ +\x1d\xff\xec\x00\x9e\x03\x1f\xff\xec\x00\x9e\x03!\xff\xec\x00\ +\x9e\x03#\xff\xec\x00\x9e\x03%\xff\xec\x00\x9e\x03'\xff\ +\xec\x00\x9e\x03)\xff\xec\x00\x9e\x03+\xff\xec\x00\x9e\x03\ +-\xff\xec\x00\x9e\x03/\xff\xec\x00\x9e\x031\xff\xec\x00\ +\x9e\x033\xff\xec\x00\x9f\x00\x0f\xff\x85\x00\x9f\x00\x11\xff\ +\x85\x00\x9f\x00\x22\x00)\x00\x9f\x00$\xff\x85\x00\x9f\x00\ +&\xff\xd7\x00\x9f\x00*\xff\xd7\x00\x9f\x002\xff\xd7\x00\ +\x9f\x004\xff\xd7\x00\x9f\x00D\xff\x9a\x00\x9f\x00F\xff\ +\x9a\x00\x9f\x00G\xff\x9a\x00\x9f\x00H\xff\x9a\x00\x9f\x00\ +J\xff\xd7\x00\x9f\x00P\xff\xc3\x00\x9f\x00Q\xff\xc3\x00\ +\x9f\x00R\xff\x9a\x00\x9f\x00S\xff\xc3\x00\x9f\x00T\xff\ +\x9a\x00\x9f\x00U\xff\xc3\x00\x9f\x00V\xff\xae\x00\x9f\x00\ +X\xff\xc3\x00\x9f\x00]\xff\xd7\x00\x9f\x00\x82\xff\x85\x00\ +\x9f\x00\x83\xff\x85\x00\x9f\x00\x84\xff\x85\x00\x9f\x00\x85\xff\ +\x85\x00\x9f\x00\x86\xff\x85\x00\x9f\x00\x87\xff\x85\x00\x9f\x00\ +\x89\xff\xd7\x00\x9f\x00\x94\xff\xd7\x00\x9f\x00\x95\xff\xd7\x00\ +\x9f\x00\x96\xff\xd7\x00\x9f\x00\x97\xff\xd7\x00\x9f\x00\x98\xff\ +\xd7\x00\x9f\x00\x9a\xff\xd7\x00\x9f\x00\xa2\xff\x9a\x00\x9f\x00\ +\xa3\xff\x9a\x00\x9f\x00\xa4\xff\x9a\x00\x9f\x00\xa5\xff\x9a\x00\ +\x9f\x00\xa6\xff\x9a\x00\x9f\x00\xa7\xff\x9a\x00\x9f\x00\xa8\xff\ +\x9a\x00\x9f\x00\xa9\xff\x9a\x00\x9f\x00\xaa\xff\x9a\x00\x9f\x00\ +\xab\xff\x9a\x00\x9f\x00\xac\xff\x9a\x00\x9f\x00\xad\xff\x9a\x00\ +\x9f\x00\xb4\xff\x9a\x00\x9f\x00\xb5\xff\x9a\x00\x9f\x00\xb6\xff\ +\x9a\x00\x9f\x00\xb7\xff\x9a\x00\x9f\x00\xb8\xff\x9a\x00\x9f\x00\ +\xba\xff\x9a\x00\x9f\x00\xbb\xff\xc3\x00\x9f\x00\xbc\xff\xc3\x00\ +\x9f\x00\xbd\xff\xc3\x00\x9f\x00\xbe\xff\xc3\x00\x9f\x00\xc2\xff\ +\x85\x00\x9f\x00\xc3\xff\x9a\x00\x9f\x00\xc4\xff\x85\x00\x9f\x00\ +\xc5\xff\x9a\x00\x9f\x00\xc6\xff\x85\x00\x9f\x00\xc7\xff\x9a\x00\ +\x9f\x00\xc8\xff\xd7\x00\x9f\x00\xc9\xff\x9a\x00\x9f\x00\xca\xff\ +\xd7\x00\x9f\x00\xcb\xff\x9a\x00\x9f\x00\xcc\xff\xd7\x00\x9f\x00\ +\xcd\xff\x9a\x00\x9f\x00\xce\xff\xd7\x00\x9f\x00\xcf\xff\x9a\x00\ +\x9f\x00\xd1\xff\x9a\x00\x9f\x00\xd3\xff\x9a\x00\x9f\x00\xd5\xff\ +\x9a\x00\x9f\x00\xd7\xff\x9a\x00\x9f\x00\xd9\xff\x9a\x00\x9f\x00\ +\xdb\xff\x9a\x00\x9f\x00\xdd\xff\x9a\x00\x9f\x00\xde\xff\xd7\x00\ +\x9f\x00\xdf\xff\xd7\x00\x9f\x00\xe0\xff\xd7\x00\x9f\x00\xe1\xff\ +\xd7\x00\x9f\x00\xe2\xff\xd7\x00\x9f\x00\xe3\xff\xd7\x00\x9f\x00\ +\xe4\xff\xd7\x00\x9f\x00\xe5\xff\xd7\x00\x9f\x00\xfa\xff\xc3\x00\ +\x9f\x01\x06\xff\xc3\x00\x9f\x01\x08\xff\xc3\x00\x9f\x01\x0d\xff\ +\xc3\x00\x9f\x01\x0e\xff\xd7\x00\x9f\x01\x0f\xff\x9a\x00\x9f\x01\ +\x10\xff\xd7\x00\x9f\x01\x11\xff\x9a\x00\x9f\x01\x12\xff\xd7\x00\ +\x9f\x01\x13\xff\x9a\x00\x9f\x01\x14\xff\xd7\x00\x9f\x01\x15\xff\ +\x9a\x00\x9f\x01\x17\xff\xc3\x00\x9f\x01\x19\xff\xc3\x00\x9f\x01\ +\x1d\xff\xae\x00\x9f\x01!\xff\xae\x00\x9f\x01+\xff\xc3\x00\ +\x9f\x01-\xff\xc3\x00\x9f\x01/\xff\xc3\x00\x9f\x011\xff\ +\xc3\x00\x9f\x013\xff\xc3\x00\x9f\x015\xff\xc3\x00\x9f\x01\ +<\xff\xd7\x00\x9f\x01>\xff\xd7\x00\x9f\x01@\xff\xd7\x00\ +\x9f\x01C\xff\x85\x00\x9f\x01D\xff\x9a\x00\x9f\x01F\xff\ +\x9a\x00\x9f\x01G\xff\xd7\x00\x9f\x01H\xff\x9a\x00\x9f\x01\ +J\xff\xae\x00\x9f\x02\x08\xff\x85\x00\x9f\x02\x0c\xff\x85\x00\ +\x9f\x02W\xff\xc3\x00\x9f\x02X\xff\x85\x00\x9f\x02Y\xff\ +\x9a\x00\x9f\x02_\xff\xd7\x00\x9f\x02`\xff\x9a\x00\x9f\x02\ +b\xff\xc3\x00\x9f\x03\x1d\xff\x85\x00\x9f\x03\x1e\xff\x9a\x00\ +\x9f\x03\x1f\xff\x85\x00\x9f\x03 \xff\x9a\x00\x9f\x03!\xff\ +\x85\x00\x9f\x03\x22\xff\x9a\x00\x9f\x03#\xff\x85\x00\x9f\x03\ +%\xff\x85\x00\x9f\x03&\xff\x9a\x00\x9f\x03'\xff\x85\x00\ +\x9f\x03(\xff\x9a\x00\x9f\x03)\xff\x85\x00\x9f\x03*\xff\ +\x9a\x00\x9f\x03+\xff\x85\x00\x9f\x03,\xff\x9a\x00\x9f\x03\ +-\xff\x85\x00\x9f\x03.\xff\x9a\x00\x9f\x03/\xff\x85\x00\ +\x9f\x030\xff\x9a\x00\x9f\x031\xff\x85\x00\x9f\x032\xff\ +\x9a\x00\x9f\x033\xff\x85\x00\x9f\x034\xff\x9a\x00\x9f\x03\ +6\xff\x9a\x00\x9f\x038\xff\x9a\x00\x9f\x03:\xff\x9a\x00\ +\x9f\x03<\xff\x9a\x00\x9f\x03@\xff\x9a\x00\x9f\x03B\xff\ +\x9a\x00\x9f\x03D\xff\x9a\x00\x9f\x03I\xff\xd7\x00\x9f\x03\ +J\xff\x9a\x00\x9f\x03K\xff\xd7\x00\x9f\x03L\xff\x9a\x00\ +\x9f\x03M\xff\xd7\x00\x9f\x03N\xff\x9a\x00\x9f\x03O\xff\ +\xd7\x00\x9f\x03Q\xff\xd7\x00\x9f\x03R\xff\x9a\x00\x9f\x03\ +S\xff\xd7\x00\x9f\x03T\xff\x9a\x00\x9f\x03U\xff\xd7\x00\ +\x9f\x03V\xff\x9a\x00\x9f\x03W\xff\xd7\x00\x9f\x03X\xff\ +\x9a\x00\x9f\x03Y\xff\xd7\x00\x9f\x03Z\xff\x9a\x00\x9f\x03\ +[\xff\xd7\x00\x9f\x03\x5c\xff\x9a\x00\x9f\x03]\xff\xd7\x00\ +\x9f\x03^\xff\x9a\x00\x9f\x03_\xff\xd7\x00\x9f\x03`\xff\ +\x9a\x00\x9f\x03b\xff\xc3\x00\x9f\x03d\xff\xc3\x00\x9f\x03\ +f\xff\xc3\x00\x9f\x03h\xff\xc3\x00\x9f\x03j\xff\xc3\x00\ +\x9f\x03l\xff\xc3\x00\x9f\x03n\xff\xc3\x00\xa0\x00\x0f\xfe\ +\xf6\x00\xa0\x00\x11\xfe\xf6\x00\xa0\x00$\xff\x9a\x00\xa0\x00\ +;\xff\xd7\x00\xa0\x00=\xff\xec\x00\xa0\x00\x82\xff\x9a\x00\ +\xa0\x00\x83\xff\x9a\x00\xa0\x00\x84\xff\x9a\x00\xa0\x00\x85\xff\ +\x9a\x00\xa0\x00\x86\xff\x9a\x00\xa0\x00\x87\xff\x9a\x00\xa0\x00\ +\xc2\xff\x9a\x00\xa0\x00\xc4\xff\x9a\x00\xa0\x00\xc6\xff\x9a\x00\ +\xa0\x01;\xff\xec\x00\xa0\x01=\xff\xec\x00\xa0\x01?\xff\ +\xec\x00\xa0\x01C\xff\x9a\x00\xa0\x02\x08\xfe\xf6\x00\xa0\x02\ +\x0c\xfe\xf6\x00\xa0\x02X\xff\x9a\x00\xa0\x03\x1d\xff\x9a\x00\ +\xa0\x03\x1f\xff\x9a\x00\xa0\x03!\xff\x9a\x00\xa0\x03#\xff\ +\x9a\x00\xa0\x03%\xff\x9a\x00\xa0\x03'\xff\x9a\x00\xa0\x03\ +)\xff\x9a\x00\xa0\x03+\xff\x9a\x00\xa0\x03-\xff\x9a\x00\ +\xa0\x03/\xff\x9a\x00\xa0\x031\xff\x9a\x00\xa0\x033\xff\ +\x9a\x00\xa2\x00\x05\xff\xec\x00\xa2\x00\x0a\xff\xec\x00\xa2\x02\ +\x07\xff\xec\x00\xa2\x02\x0b\xff\xec\x00\xa3\x00\x05\xff\xec\x00\ +\xa3\x00\x0a\xff\xec\x00\xa3\x02\x07\xff\xec\x00\xa3\x02\x0b\xff\ +\xec\x00\xa4\x00\x05\xff\xec\x00\xa4\x00\x0a\xff\xec\x00\xa4\x02\ +\x07\xff\xec\x00\xa4\x02\x0b\xff\xec\x00\xa5\x00\x05\xff\xec\x00\ +\xa5\x00\x0a\xff\xec\x00\xa5\x02\x07\xff\xec\x00\xa5\x02\x0b\xff\ +\xec\x00\xa6\x00\x05\xff\xec\x00\xa6\x00\x0a\xff\xec\x00\xa6\x02\ +\x07\xff\xec\x00\xa6\x02\x0b\xff\xec\x00\xa7\x00\x05\xff\xec\x00\ +\xa7\x00\x0a\xff\xec\x00\xa7\x02\x07\xff\xec\x00\xa7\x02\x0b\xff\ +\xec\x00\xaa\x00\x05\xff\xec\x00\xaa\x00\x0a\xff\xec\x00\xaa\x00\ +Y\xff\xd7\x00\xaa\x00Z\xff\xd7\x00\xaa\x00[\xff\xd7\x00\ +\xaa\x00\x5c\xff\xd7\x00\xaa\x00]\xff\xec\x00\xaa\x00\xbf\xff\ +\xd7\x00\xaa\x017\xff\xd7\x00\xaa\x01<\xff\xec\x00\xaa\x01\ +>\xff\xec\x00\xaa\x01@\xff\xec\x00\xaa\x01\xfb\xff\xd7\x00\ +\xaa\x01\xfd\xff\xd7\x00\xaa\x02\x07\xff\xec\x00\xaa\x02\x0b\xff\ +\xec\x00\xaa\x03p\xff\xd7\x00\xab\x00\x05\xff\xec\x00\xab\x00\ +\x0a\xff\xec\x00\xab\x00Y\xff\xd7\x00\xab\x00Z\xff\xd7\x00\ +\xab\x00[\xff\xd7\x00\xab\x00\x5c\xff\xd7\x00\xab\x00]\xff\ +\xec\x00\xab\x00\xbf\xff\xd7\x00\xab\x017\xff\xd7\x00\xab\x01\ +<\xff\xec\x00\xab\x01>\xff\xec\x00\xab\x01@\xff\xec\x00\ +\xab\x01\xfb\xff\xd7\x00\xab\x01\xfd\xff\xd7\x00\xab\x02\x07\xff\ +\xec\x00\xab\x02\x0b\xff\xec\x00\xab\x03p\xff\xd7\x00\xac\x00\ +\x05\xff\xec\x00\xac\x00\x0a\xff\xec\x00\xac\x00Y\xff\xd7\x00\ +\xac\x00Z\xff\xd7\x00\xac\x00[\xff\xd7\x00\xac\x00\x5c\xff\ +\xd7\x00\xac\x00]\xff\xec\x00\xac\x00\xbf\xff\xd7\x00\xac\x01\ +7\xff\xd7\x00\xac\x01<\xff\xec\x00\xac\x01>\xff\xec\x00\ +\xac\x01@\xff\xec\x00\xac\x01\xfb\xff\xd7\x00\xac\x01\xfd\xff\ +\xd7\x00\xac\x02\x07\xff\xec\x00\xac\x02\x0b\xff\xec\x00\xac\x03\ +p\xff\xd7\x00\xad\x00\x05\xff\xec\x00\xad\x00\x0a\xff\xec\x00\ +\xad\x00Y\xff\xd7\x00\xad\x00Z\xff\xd7\x00\xad\x00[\xff\ +\xd7\x00\xad\x00\x5c\xff\xd7\x00\xad\x00]\xff\xec\x00\xad\x00\ +\xbf\xff\xd7\x00\xad\x017\xff\xd7\x00\xad\x01<\xff\xec\x00\ +\xad\x01>\xff\xec\x00\xad\x01@\xff\xec\x00\xad\x01\xfb\xff\ +\xd7\x00\xad\x01\xfd\xff\xd7\x00\xad\x02\x07\xff\xec\x00\xad\x02\ +\x0b\xff\xec\x00\xad\x03p\xff\xd7\x00\xb2\x00\x05\xff\xec\x00\ +\xb2\x00\x0a\xff\xec\x00\xb2\x00Y\xff\xd7\x00\xb2\x00Z\xff\ +\xd7\x00\xb2\x00[\xff\xd7\x00\xb2\x00\x5c\xff\xd7\x00\xb2\x00\ +]\xff\xec\x00\xb2\x00\xbf\xff\xd7\x00\xb2\x017\xff\xd7\x00\ +\xb2\x01<\xff\xec\x00\xb2\x01>\xff\xec\x00\xb2\x01@\xff\ +\xec\x00\xb2\x01\xfb\xff\xd7\x00\xb2\x01\xfd\xff\xd7\x00\xb2\x02\ +\x07\xff\xec\x00\xb2\x02\x0b\xff\xec\x00\xb2\x03p\xff\xd7\x00\ +\xb4\x00\x05\xff\xec\x00\xb4\x00\x0a\xff\xec\x00\xb4\x00Y\xff\ +\xd7\x00\xb4\x00Z\xff\xd7\x00\xb4\x00[\xff\xd7\x00\xb4\x00\ +\x5c\xff\xd7\x00\xb4\x00]\xff\xec\x00\xb4\x00\xbf\xff\xd7\x00\ +\xb4\x017\xff\xd7\x00\xb4\x01<\xff\xec\x00\xb4\x01>\xff\ +\xec\x00\xb4\x01@\xff\xec\x00\xb4\x01\xfb\xff\xd7\x00\xb4\x01\ +\xfd\xff\xd7\x00\xb4\x02\x07\xff\xec\x00\xb4\x02\x0b\xff\xec\x00\ +\xb4\x03p\xff\xd7\x00\xb5\x00\x05\xff\xec\x00\xb5\x00\x0a\xff\ +\xec\x00\xb5\x00Y\xff\xd7\x00\xb5\x00Z\xff\xd7\x00\xb5\x00\ +[\xff\xd7\x00\xb5\x00\x5c\xff\xd7\x00\xb5\x00]\xff\xec\x00\ +\xb5\x00\xbf\xff\xd7\x00\xb5\x017\xff\xd7\x00\xb5\x01<\xff\ +\xec\x00\xb5\x01>\xff\xec\x00\xb5\x01@\xff\xec\x00\xb5\x01\ +\xfb\xff\xd7\x00\xb5\x01\xfd\xff\xd7\x00\xb5\x02\x07\xff\xec\x00\ +\xb5\x02\x0b\xff\xec\x00\xb5\x03p\xff\xd7\x00\xb6\x00\x05\xff\ +\xec\x00\xb6\x00\x0a\xff\xec\x00\xb6\x00Y\xff\xd7\x00\xb6\x00\ +Z\xff\xd7\x00\xb6\x00[\xff\xd7\x00\xb6\x00\x5c\xff\xd7\x00\ +\xb6\x00]\xff\xec\x00\xb6\x00\xbf\xff\xd7\x00\xb6\x017\xff\ +\xd7\x00\xb6\x01<\xff\xec\x00\xb6\x01>\xff\xec\x00\xb6\x01\ +@\xff\xec\x00\xb6\x01\xfb\xff\xd7\x00\xb6\x01\xfd\xff\xd7\x00\ +\xb6\x02\x07\xff\xec\x00\xb6\x02\x0b\xff\xec\x00\xb6\x03p\xff\ +\xd7\x00\xb8\x00\x05\xff\xd7\x00\xb8\x00\x0a\xff\xd7\x00\xb8\x02\ +\x07\xff\xd7\x00\xb8\x02\x0b\xff\xd7\x00\xba\x00\x05\xff\xec\x00\ +\xba\x00\x0a\xff\xec\x00\xba\x00Y\xff\xd7\x00\xba\x00Z\xff\ +\xd7\x00\xba\x00[\xff\xd7\x00\xba\x00\x5c\xff\xd7\x00\xba\x00\ +]\xff\xec\x00\xba\x00\xbf\xff\xd7\x00\xba\x017\xff\xd7\x00\ +\xba\x01<\xff\xec\x00\xba\x01>\xff\xec\x00\xba\x01@\xff\ +\xec\x00\xba\x01\xfb\xff\xd7\x00\xba\x01\xfd\xff\xd7\x00\xba\x02\ +\x07\xff\xec\x00\xba\x02\x0b\xff\xec\x00\xba\x03p\xff\xd7\x00\ +\xbf\x00\x05\x00R\x00\xbf\x00\x0a\x00R\x00\xbf\x00\x0f\xff\ +\xae\x00\xbf\x00\x11\xff\xae\x00\xbf\x00\x22\x00)\x00\xbf\x02\ +\x07\x00R\x00\xbf\x02\x08\xff\xae\x00\xbf\x02\x0b\x00R\x00\ +\xbf\x02\x0c\xff\xae\x00\xc0\x00\x05\xff\xec\x00\xc0\x00\x0a\xff\ +\xec\x00\xc0\x00Y\xff\xd7\x00\xc0\x00Z\xff\xd7\x00\xc0\x00\ +[\xff\xd7\x00\xc0\x00\x5c\xff\xd7\x00\xc0\x00]\xff\xec\x00\ +\xc0\x00\xbf\xff\xd7\x00\xc0\x017\xff\xd7\x00\xc0\x01<\xff\ +\xec\x00\xc0\x01>\xff\xec\x00\xc0\x01@\xff\xec\x00\xc0\x01\ +\xfb\xff\xd7\x00\xc0\x01\xfd\xff\xd7\x00\xc0\x02\x07\xff\xec\x00\ +\xc0\x02\x0b\xff\xec\x00\xc0\x03p\xff\xd7\x00\xc1\x00\x05\x00\ +R\x00\xc1\x00\x0a\x00R\x00\xc1\x00\x0f\xff\xae\x00\xc1\x00\ +\x11\xff\xae\x00\xc1\x00\x22\x00)\x00\xc1\x02\x07\x00R\x00\ +\xc1\x02\x08\xff\xae\x00\xc1\x02\x0b\x00R\x00\xc1\x02\x0c\xff\ +\xae\x00\xc2\x00\x05\xffq\x00\xc2\x00\x0a\xffq\x00\xc2\x00\ +&\xff\xd7\x00\xc2\x00*\xff\xd7\x00\xc2\x00-\x01\x0a\x00\ +\xc2\x002\xff\xd7\x00\xc2\x004\xff\xd7\x00\xc2\x007\xff\ +q\x00\xc2\x009\xff\xae\x00\xc2\x00:\xff\xae\x00\xc2\x00\ +<\xff\x85\x00\xc2\x00\x89\xff\xd7\x00\xc2\x00\x94\xff\xd7\x00\ +\xc2\x00\x95\xff\xd7\x00\xc2\x00\x96\xff\xd7\x00\xc2\x00\x97\xff\ +\xd7\x00\xc2\x00\x98\xff\xd7\x00\xc2\x00\x9a\xff\xd7\x00\xc2\x00\ +\x9f\xff\x85\x00\xc2\x00\xc8\xff\xd7\x00\xc2\x00\xca\xff\xd7\x00\ +\xc2\x00\xcc\xff\xd7\x00\xc2\x00\xce\xff\xd7\x00\xc2\x00\xde\xff\ +\xd7\x00\xc2\x00\xe0\xff\xd7\x00\xc2\x00\xe2\xff\xd7\x00\xc2\x00\ +\xe4\xff\xd7\x00\xc2\x01\x0e\xff\xd7\x00\xc2\x01\x10\xff\xd7\x00\ +\xc2\x01\x12\xff\xd7\x00\xc2\x01\x14\xff\xd7\x00\xc2\x01$\xff\ +q\x00\xc2\x01&\xffq\x00\xc2\x016\xff\xae\x00\xc2\x01\ +8\xff\x85\x00\xc2\x01:\xff\x85\x00\xc2\x01G\xff\xd7\x00\ +\xc2\x01\xfa\xff\xae\x00\xc2\x01\xfc\xff\xae\x00\xc2\x01\xfe\xff\ +\xae\x00\xc2\x02\x00\xff\x85\x00\xc2\x02\x07\xffq\x00\xc2\x02\ +\x0b\xffq\x00\xc2\x02_\xff\xd7\x00\xc2\x03I\xff\xd7\x00\ +\xc2\x03K\xff\xd7\x00\xc2\x03M\xff\xd7\x00\xc2\x03O\xff\ +\xd7\x00\xc2\x03Q\xff\xd7\x00\xc2\x03S\xff\xd7\x00\xc2\x03\ +U\xff\xd7\x00\xc2\x03W\xff\xd7\x00\xc2\x03Y\xff\xd7\x00\ +\xc2\x03[\xff\xd7\x00\xc2\x03]\xff\xd7\x00\xc2\x03_\xff\ +\xd7\x00\xc2\x03o\xff\x85\x00\xc2\x03q\xff\x85\x00\xc2\x03\ +s\xff\x85\x00\xc2\x03\x8f\xffq\x00\xc3\x00\x05\xff\xec\x00\ +\xc3\x00\x0a\xff\xec\x00\xc3\x02\x07\xff\xec\x00\xc3\x02\x0b\xff\ +\xec\x00\xc4\x00\x05\xffq\x00\xc4\x00\x0a\xffq\x00\xc4\x00\ +&\xff\xd7\x00\xc4\x00*\xff\xd7\x00\xc4\x00-\x01\x0a\x00\ +\xc4\x002\xff\xd7\x00\xc4\x004\xff\xd7\x00\xc4\x007\xff\ +q\x00\xc4\x009\xff\xae\x00\xc4\x00:\xff\xae\x00\xc4\x00\ +<\xff\x85\x00\xc4\x00\x89\xff\xd7\x00\xc4\x00\x94\xff\xd7\x00\ +\xc4\x00\x95\xff\xd7\x00\xc4\x00\x96\xff\xd7\x00\xc4\x00\x97\xff\ +\xd7\x00\xc4\x00\x98\xff\xd7\x00\xc4\x00\x9a\xff\xd7\x00\xc4\x00\ +\x9f\xff\x85\x00\xc4\x00\xc8\xff\xd7\x00\xc4\x00\xca\xff\xd7\x00\ +\xc4\x00\xcc\xff\xd7\x00\xc4\x00\xce\xff\xd7\x00\xc4\x00\xde\xff\ +\xd7\x00\xc4\x00\xe0\xff\xd7\x00\xc4\x00\xe2\xff\xd7\x00\xc4\x00\ +\xe4\xff\xd7\x00\xc4\x01\x0e\xff\xd7\x00\xc4\x01\x10\xff\xd7\x00\ +\xc4\x01\x12\xff\xd7\x00\xc4\x01\x14\xff\xd7\x00\xc4\x01$\xff\ +q\x00\xc4\x01&\xffq\x00\xc4\x016\xff\xae\x00\xc4\x01\ +8\xff\x85\x00\xc4\x01:\xff\x85\x00\xc4\x01G\xff\xd7\x00\ +\xc4\x01\xfa\xff\xae\x00\xc4\x01\xfc\xff\xae\x00\xc4\x01\xfe\xff\ +\xae\x00\xc4\x02\x00\xff\x85\x00\xc4\x02\x07\xffq\x00\xc4\x02\ +\x0b\xffq\x00\xc4\x02_\xff\xd7\x00\xc4\x03I\xff\xd7\x00\ +\xc4\x03K\xff\xd7\x00\xc4\x03M\xff\xd7\x00\xc4\x03O\xff\ +\xd7\x00\xc4\x03Q\xff\xd7\x00\xc4\x03S\xff\xd7\x00\xc4\x03\ +U\xff\xd7\x00\xc4\x03W\xff\xd7\x00\xc4\x03Y\xff\xd7\x00\ +\xc4\x03[\xff\xd7\x00\xc4\x03]\xff\xd7\x00\xc4\x03_\xff\ +\xd7\x00\xc4\x03o\xff\x85\x00\xc4\x03q\xff\x85\x00\xc4\x03\ +s\xff\x85\x00\xc4\x03\x8f\xffq\x00\xc5\x00\x05\xff\xec\x00\ +\xc5\x00\x0a\xff\xec\x00\xc5\x02\x07\xff\xec\x00\xc5\x02\x0b\xff\ +\xec\x00\xc6\x00\x05\xffq\x00\xc6\x00\x0a\xffq\x00\xc6\x00\ +&\xff\xd7\x00\xc6\x00*\xff\xd7\x00\xc6\x00-\x01\x0a\x00\ +\xc6\x002\xff\xd7\x00\xc6\x004\xff\xd7\x00\xc6\x007\xff\ +q\x00\xc6\x009\xff\xae\x00\xc6\x00:\xff\xae\x00\xc6\x00\ +<\xff\x85\x00\xc6\x00\x89\xff\xd7\x00\xc6\x00\x94\xff\xd7\x00\ +\xc6\x00\x95\xff\xd7\x00\xc6\x00\x96\xff\xd7\x00\xc6\x00\x97\xff\ +\xd7\x00\xc6\x00\x98\xff\xd7\x00\xc6\x00\x9a\xff\xd7\x00\xc6\x00\ +\x9f\xff\x85\x00\xc6\x00\xc8\xff\xd7\x00\xc6\x00\xca\xff\xd7\x00\ +\xc6\x00\xcc\xff\xd7\x00\xc6\x00\xce\xff\xd7\x00\xc6\x00\xde\xff\ +\xd7\x00\xc6\x00\xe0\xff\xd7\x00\xc6\x00\xe2\xff\xd7\x00\xc6\x00\ +\xe4\xff\xd7\x00\xc6\x01\x0e\xff\xd7\x00\xc6\x01\x10\xff\xd7\x00\ +\xc6\x01\x12\xff\xd7\x00\xc6\x01\x14\xff\xd7\x00\xc6\x01$\xff\ +q\x00\xc6\x01&\xffq\x00\xc6\x016\xff\xae\x00\xc6\x01\ +8\xff\x85\x00\xc6\x01:\xff\x85\x00\xc6\x01G\xff\xd7\x00\ +\xc6\x01\xfa\xff\xae\x00\xc6\x01\xfc\xff\xae\x00\xc6\x01\xfe\xff\ +\xae\x00\xc6\x02\x00\xff\x85\x00\xc6\x02\x07\xffq\x00\xc6\x02\ +\x0b\xffq\x00\xc6\x02_\xff\xd7\x00\xc6\x03I\xff\xd7\x00\ +\xc6\x03K\xff\xd7\x00\xc6\x03M\xff\xd7\x00\xc6\x03O\xff\ +\xd7\x00\xc6\x03Q\xff\xd7\x00\xc6\x03S\xff\xd7\x00\xc6\x03\ +U\xff\xd7\x00\xc6\x03W\xff\xd7\x00\xc6\x03Y\xff\xd7\x00\ +\xc6\x03[\xff\xd7\x00\xc6\x03]\xff\xd7\x00\xc6\x03_\xff\ +\xd7\x00\xc6\x03o\xff\x85\x00\xc6\x03q\xff\x85\x00\xc6\x03\ +s\xff\x85\x00\xc6\x03\x8f\xffq\x00\xc7\x00\x05\xff\xec\x00\ +\xc7\x00\x0a\xff\xec\x00\xc7\x02\x07\xff\xec\x00\xc7\x02\x0b\xff\ +\xec\x00\xc8\x00&\xff\xd7\x00\xc8\x00*\xff\xd7\x00\xc8\x00\ +2\xff\xd7\x00\xc8\x004\xff\xd7\x00\xc8\x00\x89\xff\xd7\x00\ +\xc8\x00\x94\xff\xd7\x00\xc8\x00\x95\xff\xd7\x00\xc8\x00\x96\xff\ +\xd7\x00\xc8\x00\x97\xff\xd7\x00\xc8\x00\x98\xff\xd7\x00\xc8\x00\ +\x9a\xff\xd7\x00\xc8\x00\xc8\xff\xd7\x00\xc8\x00\xca\xff\xd7\x00\ +\xc8\x00\xcc\xff\xd7\x00\xc8\x00\xce\xff\xd7\x00\xc8\x00\xde\xff\ +\xd7\x00\xc8\x00\xe0\xff\xd7\x00\xc8\x00\xe2\xff\xd7\x00\xc8\x00\ +\xe4\xff\xd7\x00\xc8\x01\x0e\xff\xd7\x00\xc8\x01\x10\xff\xd7\x00\ +\xc8\x01\x12\xff\xd7\x00\xc8\x01\x14\xff\xd7\x00\xc8\x01G\xff\ +\xd7\x00\xc8\x02_\xff\xd7\x00\xc8\x03I\xff\xd7\x00\xc8\x03\ +K\xff\xd7\x00\xc8\x03M\xff\xd7\x00\xc8\x03O\xff\xd7\x00\ +\xc8\x03Q\xff\xd7\x00\xc8\x03S\xff\xd7\x00\xc8\x03U\xff\ +\xd7\x00\xc8\x03W\xff\xd7\x00\xc8\x03Y\xff\xd7\x00\xc8\x03\ +[\xff\xd7\x00\xc8\x03]\xff\xd7\x00\xc8\x03_\xff\xd7\x00\ +\xca\x00&\xff\xd7\x00\xca\x00*\xff\xd7\x00\xca\x002\xff\ +\xd7\x00\xca\x004\xff\xd7\x00\xca\x00\x89\xff\xd7\x00\xca\x00\ +\x94\xff\xd7\x00\xca\x00\x95\xff\xd7\x00\xca\x00\x96\xff\xd7\x00\ +\xca\x00\x97\xff\xd7\x00\xca\x00\x98\xff\xd7\x00\xca\x00\x9a\xff\ +\xd7\x00\xca\x00\xc8\xff\xd7\x00\xca\x00\xca\xff\xd7\x00\xca\x00\ +\xcc\xff\xd7\x00\xca\x00\xce\xff\xd7\x00\xca\x00\xde\xff\xd7\x00\ +\xca\x00\xe0\xff\xd7\x00\xca\x00\xe2\xff\xd7\x00\xca\x00\xe4\xff\ +\xd7\x00\xca\x01\x0e\xff\xd7\x00\xca\x01\x10\xff\xd7\x00\xca\x01\ +\x12\xff\xd7\x00\xca\x01\x14\xff\xd7\x00\xca\x01G\xff\xd7\x00\ +\xca\x02_\xff\xd7\x00\xca\x03I\xff\xd7\x00\xca\x03K\xff\ +\xd7\x00\xca\x03M\xff\xd7\x00\xca\x03O\xff\xd7\x00\xca\x03\ +Q\xff\xd7\x00\xca\x03S\xff\xd7\x00\xca\x03U\xff\xd7\x00\ +\xca\x03W\xff\xd7\x00\xca\x03Y\xff\xd7\x00\xca\x03[\xff\ +\xd7\x00\xca\x03]\xff\xd7\x00\xca\x03_\xff\xd7\x00\xcc\x00\ +&\xff\xd7\x00\xcc\x00*\xff\xd7\x00\xcc\x002\xff\xd7\x00\ +\xcc\x004\xff\xd7\x00\xcc\x00\x89\xff\xd7\x00\xcc\x00\x94\xff\ +\xd7\x00\xcc\x00\x95\xff\xd7\x00\xcc\x00\x96\xff\xd7\x00\xcc\x00\ +\x97\xff\xd7\x00\xcc\x00\x98\xff\xd7\x00\xcc\x00\x9a\xff\xd7\x00\ +\xcc\x00\xc8\xff\xd7\x00\xcc\x00\xca\xff\xd7\x00\xcc\x00\xcc\xff\ +\xd7\x00\xcc\x00\xce\xff\xd7\x00\xcc\x00\xde\xff\xd7\x00\xcc\x00\ +\xe0\xff\xd7\x00\xcc\x00\xe2\xff\xd7\x00\xcc\x00\xe4\xff\xd7\x00\ +\xcc\x01\x0e\xff\xd7\x00\xcc\x01\x10\xff\xd7\x00\xcc\x01\x12\xff\ +\xd7\x00\xcc\x01\x14\xff\xd7\x00\xcc\x01G\xff\xd7\x00\xcc\x02\ +_\xff\xd7\x00\xcc\x03I\xff\xd7\x00\xcc\x03K\xff\xd7\x00\ +\xcc\x03M\xff\xd7\x00\xcc\x03O\xff\xd7\x00\xcc\x03Q\xff\ +\xd7\x00\xcc\x03S\xff\xd7\x00\xcc\x03U\xff\xd7\x00\xcc\x03\ +W\xff\xd7\x00\xcc\x03Y\xff\xd7\x00\xcc\x03[\xff\xd7\x00\ +\xcc\x03]\xff\xd7\x00\xcc\x03_\xff\xd7\x00\xce\x00&\xff\ +\xd7\x00\xce\x00*\xff\xd7\x00\xce\x002\xff\xd7\x00\xce\x00\ +4\xff\xd7\x00\xce\x00\x89\xff\xd7\x00\xce\x00\x94\xff\xd7\x00\ +\xce\x00\x95\xff\xd7\x00\xce\x00\x96\xff\xd7\x00\xce\x00\x97\xff\ +\xd7\x00\xce\x00\x98\xff\xd7\x00\xce\x00\x9a\xff\xd7\x00\xce\x00\ +\xc8\xff\xd7\x00\xce\x00\xca\xff\xd7\x00\xce\x00\xcc\xff\xd7\x00\ +\xce\x00\xce\xff\xd7\x00\xce\x00\xde\xff\xd7\x00\xce\x00\xe0\xff\ +\xd7\x00\xce\x00\xe2\xff\xd7\x00\xce\x00\xe4\xff\xd7\x00\xce\x01\ +\x0e\xff\xd7\x00\xce\x01\x10\xff\xd7\x00\xce\x01\x12\xff\xd7\x00\ +\xce\x01\x14\xff\xd7\x00\xce\x01G\xff\xd7\x00\xce\x02_\xff\ +\xd7\x00\xce\x03I\xff\xd7\x00\xce\x03K\xff\xd7\x00\xce\x03\ +M\xff\xd7\x00\xce\x03O\xff\xd7\x00\xce\x03Q\xff\xd7\x00\ +\xce\x03S\xff\xd7\x00\xce\x03U\xff\xd7\x00\xce\x03W\xff\ +\xd7\x00\xce\x03Y\xff\xd7\x00\xce\x03[\xff\xd7\x00\xce\x03\ +]\xff\xd7\x00\xce\x03_\xff\xd7\x00\xd0\x00\x0f\xff\xae\x00\ +\xd0\x00\x11\xff\xae\x00\xd0\x00$\xff\xd7\x00\xd0\x007\xff\ +\xc3\x00\xd0\x009\xff\xec\x00\xd0\x00:\xff\xec\x00\xd0\x00\ +;\xff\xd7\x00\xd0\x00<\xff\xec\x00\xd0\x00=\xff\xec\x00\ +\xd0\x00\x82\xff\xd7\x00\xd0\x00\x83\xff\xd7\x00\xd0\x00\x84\xff\ +\xd7\x00\xd0\x00\x85\xff\xd7\x00\xd0\x00\x86\xff\xd7\x00\xd0\x00\ +\x87\xff\xd7\x00\xd0\x00\x9f\xff\xec\x00\xd0\x00\xc2\xff\xd7\x00\ +\xd0\x00\xc4\xff\xd7\x00\xd0\x00\xc6\xff\xd7\x00\xd0\x01$\xff\ +\xc3\x00\xd0\x01&\xff\xc3\x00\xd0\x016\xff\xec\x00\xd0\x01\ +8\xff\xec\x00\xd0\x01:\xff\xec\x00\xd0\x01;\xff\xec\x00\ +\xd0\x01=\xff\xec\x00\xd0\x01?\xff\xec\x00\xd0\x01C\xff\ +\xd7\x00\xd0\x01\xa0\xff\xec\x00\xd0\x01\xfa\xff\xec\x00\xd0\x01\ +\xfc\xff\xec\x00\xd0\x01\xfe\xff\xec\x00\xd0\x02\x00\xff\xec\x00\ +\xd0\x02\x08\xff\xae\x00\xd0\x02\x0c\xff\xae\x00\xd0\x02X\xff\ +\xd7\x00\xd0\x03\x1d\xff\xd7\x00\xd0\x03\x1f\xff\xd7\x00\xd0\x03\ +!\xff\xd7\x00\xd0\x03#\xff\xd7\x00\xd0\x03%\xff\xd7\x00\ +\xd0\x03'\xff\xd7\x00\xd0\x03)\xff\xd7\x00\xd0\x03+\xff\ +\xd7\x00\xd0\x03-\xff\xd7\x00\xd0\x03/\xff\xd7\x00\xd0\x03\ +1\xff\xd7\x00\xd0\x033\xff\xd7\x00\xd0\x03o\xff\xec\x00\ +\xd0\x03q\xff\xec\x00\xd0\x03s\xff\xec\x00\xd0\x03\x8f\xff\ +\xc3\x00\xd1\x00\x05\x00R\x00\xd1\x00\x0a\x00R\x00\xd1\x00\ +\x0c\x00\x8f\x00\xd1\x00\x22\x00\xa4\x00\xd1\x00@\x00\x8f\x00\ +\xd1\x00E\x00=\x00\xd1\x00K\x00=\x00\xd1\x00N\x00\ +=\x00\xd1\x00O\x00=\x00\xd1\x00`\x00\x8f\x00\xd1\x00\ +\xe7\x00=\x00\xd1\x00\xe9\x00{\x00\xd1\x02\x07\x00R\x00\ +\xd1\x02\x0b\x00R\x00\xd2\x00\x0f\xff\xae\x00\xd2\x00\x11\xff\ +\xae\x00\xd2\x00$\xff\xd7\x00\xd2\x007\xff\xc3\x00\xd2\x00\ +9\xff\xec\x00\xd2\x00:\xff\xec\x00\xd2\x00;\xff\xd7\x00\ +\xd2\x00<\xff\xec\x00\xd2\x00=\xff\xec\x00\xd2\x00\x82\xff\ +\xd7\x00\xd2\x00\x83\xff\xd7\x00\xd2\x00\x84\xff\xd7\x00\xd2\x00\ +\x85\xff\xd7\x00\xd2\x00\x86\xff\xd7\x00\xd2\x00\x87\xff\xd7\x00\ +\xd2\x00\x9f\xff\xec\x00\xd2\x00\xc2\xff\xd7\x00\xd2\x00\xc4\xff\ +\xd7\x00\xd2\x00\xc6\xff\xd7\x00\xd2\x01$\xff\xc3\x00\xd2\x01\ +&\xff\xc3\x00\xd2\x016\xff\xec\x00\xd2\x018\xff\xec\x00\ +\xd2\x01:\xff\xec\x00\xd2\x01;\xff\xec\x00\xd2\x01=\xff\ +\xec\x00\xd2\x01?\xff\xec\x00\xd2\x01C\xff\xd7\x00\xd2\x01\ +\xa0\xff\xec\x00\xd2\x01\xfa\xff\xec\x00\xd2\x01\xfc\xff\xec\x00\ +\xd2\x01\xfe\xff\xec\x00\xd2\x02\x00\xff\xec\x00\xd2\x02\x08\xff\ +\xae\x00\xd2\x02\x0c\xff\xae\x00\xd2\x02X\xff\xd7\x00\xd2\x03\ +\x1d\xff\xd7\x00\xd2\x03\x1f\xff\xd7\x00\xd2\x03!\xff\xd7\x00\ +\xd2\x03#\xff\xd7\x00\xd2\x03%\xff\xd7\x00\xd2\x03'\xff\ +\xd7\x00\xd2\x03)\xff\xd7\x00\xd2\x03+\xff\xd7\x00\xd2\x03\ +-\xff\xd7\x00\xd2\x03/\xff\xd7\x00\xd2\x031\xff\xd7\x00\ +\xd2\x033\xff\xd7\x00\xd2\x03o\xff\xec\x00\xd2\x03q\xff\ +\xec\x00\xd2\x03s\xff\xec\x00\xd2\x03\x8f\xff\xc3\x00\xd4\x00\ +-\x00{\x00\xd5\x00\x05\xff\xec\x00\xd5\x00\x0a\xff\xec\x00\ +\xd5\x00Y\xff\xd7\x00\xd5\x00Z\xff\xd7\x00\xd5\x00[\xff\ +\xd7\x00\xd5\x00\x5c\xff\xd7\x00\xd5\x00]\xff\xec\x00\xd5\x00\ +\xbf\xff\xd7\x00\xd5\x017\xff\xd7\x00\xd5\x01<\xff\xec\x00\ +\xd5\x01>\xff\xec\x00\xd5\x01@\xff\xec\x00\xd5\x01\xfb\xff\ +\xd7\x00\xd5\x01\xfd\xff\xd7\x00\xd5\x02\x07\xff\xec\x00\xd5\x02\ +\x0b\xff\xec\x00\xd5\x03p\xff\xd7\x00\xd6\x00-\x00{\x00\ +\xd7\x00\x05\xff\xec\x00\xd7\x00\x0a\xff\xec\x00\xd7\x00Y\xff\ +\xd7\x00\xd7\x00Z\xff\xd7\x00\xd7\x00[\xff\xd7\x00\xd7\x00\ +\x5c\xff\xd7\x00\xd7\x00]\xff\xec\x00\xd7\x00\xbf\xff\xd7\x00\ +\xd7\x017\xff\xd7\x00\xd7\x01<\xff\xec\x00\xd7\x01>\xff\ +\xec\x00\xd7\x01@\xff\xec\x00\xd7\x01\xfb\xff\xd7\x00\xd7\x01\ +\xfd\xff\xd7\x00\xd7\x02\x07\xff\xec\x00\xd7\x02\x0b\xff\xec\x00\ +\xd7\x03p\xff\xd7\x00\xd8\x00-\x00{\x00\xd9\x00\x05\xff\ +\xec\x00\xd9\x00\x0a\xff\xec\x00\xd9\x00Y\xff\xd7\x00\xd9\x00\ +Z\xff\xd7\x00\xd9\x00[\xff\xd7\x00\xd9\x00\x5c\xff\xd7\x00\ +\xd9\x00]\xff\xec\x00\xd9\x00\xbf\xff\xd7\x00\xd9\x017\xff\ +\xd7\x00\xd9\x01<\xff\xec\x00\xd9\x01>\xff\xec\x00\xd9\x01\ +@\xff\xec\x00\xd9\x01\xfb\xff\xd7\x00\xd9\x01\xfd\xff\xd7\x00\ +\xd9\x02\x07\xff\xec\x00\xd9\x02\x0b\xff\xec\x00\xd9\x03p\xff\ +\xd7\x00\xda\x00-\x00{\x00\xdb\x00\x05\xff\xec\x00\xdb\x00\ +\x0a\xff\xec\x00\xdb\x00Y\xff\xd7\x00\xdb\x00Z\xff\xd7\x00\ +\xdb\x00[\xff\xd7\x00\xdb\x00\x5c\xff\xd7\x00\xdb\x00]\xff\ +\xec\x00\xdb\x00\xbf\xff\xd7\x00\xdb\x017\xff\xd7\x00\xdb\x01\ +<\xff\xec\x00\xdb\x01>\xff\xec\x00\xdb\x01@\xff\xec\x00\ +\xdb\x01\xfb\xff\xd7\x00\xdb\x01\xfd\xff\xd7\x00\xdb\x02\x07\xff\ +\xec\x00\xdb\x02\x0b\xff\xec\x00\xdb\x03p\xff\xd7\x00\xdc\x00\ +-\x00{\x00\xdd\x00\x05\xff\xec\x00\xdd\x00\x0a\xff\xec\x00\ +\xdd\x00Y\xff\xd7\x00\xdd\x00Z\xff\xd7\x00\xdd\x00[\xff\ +\xd7\x00\xdd\x00\x5c\xff\xd7\x00\xdd\x00]\xff\xec\x00\xdd\x00\ +\xbf\xff\xd7\x00\xdd\x017\xff\xd7\x00\xdd\x01<\xff\xec\x00\ +\xdd\x01>\xff\xec\x00\xdd\x01@\xff\xec\x00\xdd\x01\xfb\xff\ +\xd7\x00\xdd\x01\xfd\xff\xd7\x00\xdd\x02\x07\xff\xec\x00\xdd\x02\ +\x0b\xff\xec\x00\xdd\x03p\xff\xd7\x00\xe7\x00\x05\xff\xec\x00\ +\xe7\x00\x0a\xff\xec\x00\xe7\x02\x07\xff\xec\x00\xe7\x02\x0b\xff\ +\xec\x00\xf8\x00&\xff\xd7\x00\xf8\x00*\xff\xd7\x00\xf8\x00\ +2\xff\xd7\x00\xf8\x004\xff\xd7\x00\xf8\x00\x89\xff\xd7\x00\ +\xf8\x00\x94\xff\xd7\x00\xf8\x00\x95\xff\xd7\x00\xf8\x00\x96\xff\ +\xd7\x00\xf8\x00\x97\xff\xd7\x00\xf8\x00\x98\xff\xd7\x00\xf8\x00\ +\x9a\xff\xd7\x00\xf8\x00\xc8\xff\xd7\x00\xf8\x00\xca\xff\xd7\x00\ +\xf8\x00\xcc\xff\xd7\x00\xf8\x00\xce\xff\xd7\x00\xf8\x00\xde\xff\ +\xd7\x00\xf8\x00\xe0\xff\xd7\x00\xf8\x00\xe2\xff\xd7\x00\xf8\x00\ +\xe4\xff\xd7\x00\xf8\x01\x0e\xff\xd7\x00\xf8\x01\x10\xff\xd7\x00\ +\xf8\x01\x12\xff\xd7\x00\xf8\x01\x14\xff\xd7\x00\xf8\x01G\xff\ +\xd7\x00\xf8\x02_\xff\xd7\x00\xf8\x03I\xff\xd7\x00\xf8\x03\ +K\xff\xd7\x00\xf8\x03M\xff\xd7\x00\xf8\x03O\xff\xd7\x00\ +\xf8\x03Q\xff\xd7\x00\xf8\x03S\xff\xd7\x00\xf8\x03U\xff\ +\xd7\x00\xf8\x03W\xff\xd7\x00\xf8\x03Y\xff\xd7\x00\xf8\x03\ +[\xff\xd7\x00\xf8\x03]\xff\xd7\x00\xf8\x03_\xff\xd7\x00\ +\xf9\x00F\xff\xd7\x00\xf9\x00G\xff\xd7\x00\xf9\x00H\xff\ +\xd7\x00\xf9\x00R\xff\xd7\x00\xf9\x00T\xff\xd7\x00\xf9\x00\ +\xa2\xff\xd7\x00\xf9\x00\xa9\xff\xd7\x00\xf9\x00\xaa\xff\xd7\x00\ +\xf9\x00\xab\xff\xd7\x00\xf9\x00\xac\xff\xd7\x00\xf9\x00\xad\xff\ +\xd7\x00\xf9\x00\xb4\xff\xd7\x00\xf9\x00\xb5\xff\xd7\x00\xf9\x00\ +\xb6\xff\xd7\x00\xf9\x00\xb7\xff\xd7\x00\xf9\x00\xb8\xff\xd7\x00\ +\xf9\x00\xba\xff\xd7\x00\xf9\x00\xc9\xff\xd7\x00\xf9\x00\xcb\xff\ +\xd7\x00\xf9\x00\xcd\xff\xd7\x00\xf9\x00\xcf\xff\xd7\x00\xf9\x00\ +\xd1\xff\xd7\x00\xf9\x00\xd3\xff\xd7\x00\xf9\x00\xd5\xff\xd7\x00\ +\xf9\x00\xd7\xff\xd7\x00\xf9\x00\xd9\xff\xd7\x00\xf9\x00\xdb\xff\ +\xd7\x00\xf9\x00\xdd\xff\xd7\x00\xf9\x01\x0f\xff\xd7\x00\xf9\x01\ +\x11\xff\xd7\x00\xf9\x01\x13\xff\xd7\x00\xf9\x01\x15\xff\xd7\x00\ +\xf9\x01H\xff\xd7\x00\xf9\x02`\xff\xd7\x00\xf9\x036\xff\ +\xd7\x00\xf9\x038\xff\xd7\x00\xf9\x03:\xff\xd7\x00\xf9\x03\ +<\xff\xd7\x00\xf9\x03@\xff\xd7\x00\xf9\x03B\xff\xd7\x00\ +\xf9\x03D\xff\xd7\x00\xf9\x03J\xff\xd7\x00\xf9\x03L\xff\ +\xd7\x00\xf9\x03N\xff\xd7\x00\xf9\x03R\xff\xd7\x00\xf9\x03\ +T\xff\xd7\x00\xf9\x03V\xff\xd7\x00\xf9\x03X\xff\xd7\x00\ +\xf9\x03Z\xff\xd7\x00\xf9\x03\x5c\xff\xd7\x00\xf9\x03^\xff\ +\xd7\x00\xf9\x03`\xff\xd7\x00\xfa\x00F\xff\xd7\x00\xfa\x00\ +G\xff\xd7\x00\xfa\x00H\xff\xd7\x00\xfa\x00R\xff\xd7\x00\ +\xfa\x00T\xff\xd7\x00\xfa\x00\xa2\xff\xd7\x00\xfa\x00\xa9\xff\ +\xd7\x00\xfa\x00\xaa\xff\xd7\x00\xfa\x00\xab\xff\xd7\x00\xfa\x00\ +\xac\xff\xd7\x00\xfa\x00\xad\xff\xd7\x00\xfa\x00\xb4\xff\xd7\x00\ +\xfa\x00\xb5\xff\xd7\x00\xfa\x00\xb6\xff\xd7\x00\xfa\x00\xb7\xff\ +\xd7\x00\xfa\x00\xb8\xff\xd7\x00\xfa\x00\xba\xff\xd7\x00\xfa\x00\ +\xc9\xff\xd7\x00\xfa\x00\xcb\xff\xd7\x00\xfa\x00\xcd\xff\xd7\x00\ +\xfa\x00\xcf\xff\xd7\x00\xfa\x00\xd1\xff\xd7\x00\xfa\x00\xd3\xff\ +\xd7\x00\xfa\x00\xd5\xff\xd7\x00\xfa\x00\xd7\xff\xd7\x00\xfa\x00\ +\xd9\xff\xd7\x00\xfa\x00\xdb\xff\xd7\x00\xfa\x00\xdd\xff\xd7\x00\ +\xfa\x01\x0f\xff\xd7\x00\xfa\x01\x11\xff\xd7\x00\xfa\x01\x13\xff\ +\xd7\x00\xfa\x01\x15\xff\xd7\x00\xfa\x01H\xff\xd7\x00\xfa\x02\ +`\xff\xd7\x00\xfa\x036\xff\xd7\x00\xfa\x038\xff\xd7\x00\ +\xfa\x03:\xff\xd7\x00\xfa\x03<\xff\xd7\x00\xfa\x03@\xff\ +\xd7\x00\xfa\x03B\xff\xd7\x00\xfa\x03D\xff\xd7\x00\xfa\x03\ +J\xff\xd7\x00\xfa\x03L\xff\xd7\x00\xfa\x03N\xff\xd7\x00\ +\xfa\x03R\xff\xd7\x00\xfa\x03T\xff\xd7\x00\xfa\x03V\xff\ +\xd7\x00\xfa\x03X\xff\xd7\x00\xfa\x03Z\xff\xd7\x00\xfa\x03\ +\x5c\xff\xd7\x00\xfa\x03^\xff\xd7\x00\xfa\x03`\xff\xd7\x00\ +\xfb\x00\x05\xff\x5c\x00\xfb\x00\x0a\xff\x5c\x00\xfb\x00&\xff\ +\xd7\x00\xfb\x00*\xff\xd7\x00\xfb\x002\xff\xd7\x00\xfb\x00\ +4\xff\xd7\x00\xfb\x007\xff\xd7\x00\xfb\x008\xff\xec\x00\ +\xfb\x009\xff\xd7\x00\xfb\x00:\xff\xd7\x00\xfb\x00<\xff\ +\xc3\x00\xfb\x00\x89\xff\xd7\x00\xfb\x00\x94\xff\xd7\x00\xfb\x00\ +\x95\xff\xd7\x00\xfb\x00\x96\xff\xd7\x00\xfb\x00\x97\xff\xd7\x00\ +\xfb\x00\x98\xff\xd7\x00\xfb\x00\x9a\xff\xd7\x00\xfb\x00\x9b\xff\ +\xec\x00\xfb\x00\x9c\xff\xec\x00\xfb\x00\x9d\xff\xec\x00\xfb\x00\ +\x9e\xff\xec\x00\xfb\x00\x9f\xff\xc3\x00\xfb\x00\xc8\xff\xd7\x00\ +\xfb\x00\xca\xff\xd7\x00\xfb\x00\xcc\xff\xd7\x00\xfb\x00\xce\xff\ +\xd7\x00\xfb\x00\xde\xff\xd7\x00\xfb\x00\xe0\xff\xd7\x00\xfb\x00\ +\xe2\xff\xd7\x00\xfb\x00\xe4\xff\xd7\x00\xfb\x01\x0e\xff\xd7\x00\ +\xfb\x01\x10\xff\xd7\x00\xfb\x01\x12\xff\xd7\x00\xfb\x01\x14\xff\ +\xd7\x00\xfb\x01$\xff\xd7\x00\xfb\x01&\xff\xd7\x00\xfb\x01\ +*\xff\xec\x00\xfb\x01,\xff\xec\x00\xfb\x01.\xff\xec\x00\ +\xfb\x010\xff\xec\x00\xfb\x012\xff\xec\x00\xfb\x014\xff\ +\xec\x00\xfb\x016\xff\xd7\x00\xfb\x018\xff\xc3\x00\xfb\x01\ +:\xff\xc3\x00\xfb\x01G\xff\xd7\x00\xfb\x01\xfa\xff\xd7\x00\ +\xfb\x01\xfc\xff\xd7\x00\xfb\x01\xfe\xff\xd7\x00\xfb\x02\x00\xff\ +\xc3\x00\xfb\x02\x07\xff\x5c\x00\xfb\x02\x0b\xff\x5c\x00\xfb\x02\ +_\xff\xd7\x00\xfb\x02a\xff\xec\x00\xfb\x03I\xff\xd7\x00\ +\xfb\x03K\xff\xd7\x00\xfb\x03M\xff\xd7\x00\xfb\x03O\xff\ +\xd7\x00\xfb\x03Q\xff\xd7\x00\xfb\x03S\xff\xd7\x00\xfb\x03\ +U\xff\xd7\x00\xfb\x03W\xff\xd7\x00\xfb\x03Y\xff\xd7\x00\ +\xfb\x03[\xff\xd7\x00\xfb\x03]\xff\xd7\x00\xfb\x03_\xff\ +\xd7\x00\xfb\x03a\xff\xec\x00\xfb\x03c\xff\xec\x00\xfb\x03\ +e\xff\xec\x00\xfb\x03g\xff\xec\x00\xfb\x03i\xff\xec\x00\ +\xfb\x03k\xff\xec\x00\xfb\x03m\xff\xec\x00\xfb\x03o\xff\ +\xc3\x00\xfb\x03q\xff\xc3\x00\xfb\x03s\xff\xc3\x00\xfb\x03\ +\x8f\xff\xd7\x00\xfd\x00\x05\xff\x5c\x00\xfd\x00\x0a\xff\x5c\x00\ +\xfd\x00&\xff\xd7\x00\xfd\x00*\xff\xd7\x00\xfd\x002\xff\ +\xd7\x00\xfd\x004\xff\xd7\x00\xfd\x007\xff\xd7\x00\xfd\x00\ +8\xff\xec\x00\xfd\x009\xff\xd7\x00\xfd\x00:\xff\xd7\x00\ +\xfd\x00<\xff\xc3\x00\xfd\x00\x89\xff\xd7\x00\xfd\x00\x94\xff\ +\xd7\x00\xfd\x00\x95\xff\xd7\x00\xfd\x00\x96\xff\xd7\x00\xfd\x00\ +\x97\xff\xd7\x00\xfd\x00\x98\xff\xd7\x00\xfd\x00\x9a\xff\xd7\x00\ +\xfd\x00\x9b\xff\xec\x00\xfd\x00\x9c\xff\xec\x00\xfd\x00\x9d\xff\ +\xec\x00\xfd\x00\x9e\xff\xec\x00\xfd\x00\x9f\xff\xc3\x00\xfd\x00\ +\xc8\xff\xd7\x00\xfd\x00\xca\xff\xd7\x00\xfd\x00\xcc\xff\xd7\x00\ +\xfd\x00\xce\xff\xd7\x00\xfd\x00\xde\xff\xd7\x00\xfd\x00\xe0\xff\ +\xd7\x00\xfd\x00\xe2\xff\xd7\x00\xfd\x00\xe4\xff\xd7\x00\xfd\x01\ +\x0e\xff\xd7\x00\xfd\x01\x10\xff\xd7\x00\xfd\x01\x12\xff\xd7\x00\ +\xfd\x01\x14\xff\xd7\x00\xfd\x01$\xff\xd7\x00\xfd\x01&\xff\ +\xd7\x00\xfd\x01*\xff\xec\x00\xfd\x01,\xff\xec\x00\xfd\x01\ +.\xff\xec\x00\xfd\x010\xff\xec\x00\xfd\x012\xff\xec\x00\ +\xfd\x014\xff\xec\x00\xfd\x016\xff\xd7\x00\xfd\x018\xff\ +\xc3\x00\xfd\x01:\xff\xc3\x00\xfd\x01G\xff\xd7\x00\xfd\x01\ +\xfa\xff\xd7\x00\xfd\x01\xfc\xff\xd7\x00\xfd\x01\xfe\xff\xd7\x00\ +\xfd\x02\x00\xff\xc3\x00\xfd\x02\x07\xff\x5c\x00\xfd\x02\x0b\xff\ +\x5c\x00\xfd\x02_\xff\xd7\x00\xfd\x02a\xff\xec\x00\xfd\x03\ +I\xff\xd7\x00\xfd\x03K\xff\xd7\x00\xfd\x03M\xff\xd7\x00\ +\xfd\x03O\xff\xd7\x00\xfd\x03Q\xff\xd7\x00\xfd\x03S\xff\ +\xd7\x00\xfd\x03U\xff\xd7\x00\xfd\x03W\xff\xd7\x00\xfd\x03\ +Y\xff\xd7\x00\xfd\x03[\xff\xd7\x00\xfd\x03]\xff\xd7\x00\ +\xfd\x03_\xff\xd7\x00\xfd\x03a\xff\xec\x00\xfd\x03c\xff\ +\xec\x00\xfd\x03e\xff\xec\x00\xfd\x03g\xff\xec\x00\xfd\x03\ +i\xff\xec\x00\xfd\x03k\xff\xec\x00\xfd\x03m\xff\xec\x00\ +\xfd\x03o\xff\xc3\x00\xfd\x03q\xff\xc3\x00\xfd\x03s\xff\ +\xc3\x00\xfd\x03\x8f\xff\xd7\x00\xff\x00\x05\xff\x5c\x00\xff\x00\ +\x0a\xff\x5c\x00\xff\x00&\xff\xd7\x00\xff\x00*\xff\xd7\x00\ +\xff\x002\xff\xd7\x00\xff\x004\xff\xd7\x00\xff\x007\xff\ +\xd7\x00\xff\x008\xff\xec\x00\xff\x009\xff\xd7\x00\xff\x00\ +:\xff\xd7\x00\xff\x00<\xff\xc3\x00\xff\x00\x89\xff\xd7\x00\ +\xff\x00\x94\xff\xd7\x00\xff\x00\x95\xff\xd7\x00\xff\x00\x96\xff\ +\xd7\x00\xff\x00\x97\xff\xd7\x00\xff\x00\x98\xff\xd7\x00\xff\x00\ +\x9a\xff\xd7\x00\xff\x00\x9b\xff\xec\x00\xff\x00\x9c\xff\xec\x00\ +\xff\x00\x9d\xff\xec\x00\xff\x00\x9e\xff\xec\x00\xff\x00\x9f\xff\ +\xc3\x00\xff\x00\xc8\xff\xd7\x00\xff\x00\xca\xff\xd7\x00\xff\x00\ +\xcc\xff\xd7\x00\xff\x00\xce\xff\xd7\x00\xff\x00\xde\xff\xd7\x00\ +\xff\x00\xe0\xff\xd7\x00\xff\x00\xe2\xff\xd7\x00\xff\x00\xe4\xff\ +\xd7\x00\xff\x01\x0e\xff\xd7\x00\xff\x01\x10\xff\xd7\x00\xff\x01\ +\x12\xff\xd7\x00\xff\x01\x14\xff\xd7\x00\xff\x01$\xff\xd7\x00\ +\xff\x01&\xff\xd7\x00\xff\x01*\xff\xec\x00\xff\x01,\xff\ +\xec\x00\xff\x01.\xff\xec\x00\xff\x010\xff\xec\x00\xff\x01\ +2\xff\xec\x00\xff\x014\xff\xec\x00\xff\x016\xff\xd7\x00\ +\xff\x018\xff\xc3\x00\xff\x01:\xff\xc3\x00\xff\x01G\xff\ +\xd7\x00\xff\x01\xfa\xff\xd7\x00\xff\x01\xfc\xff\xd7\x00\xff\x01\ +\xfe\xff\xd7\x00\xff\x02\x00\xff\xc3\x00\xff\x02\x07\xff\x5c\x00\ +\xff\x02\x0b\xff\x5c\x00\xff\x02_\xff\xd7\x00\xff\x02a\xff\ +\xec\x00\xff\x03I\xff\xd7\x00\xff\x03K\xff\xd7\x00\xff\x03\ +M\xff\xd7\x00\xff\x03O\xff\xd7\x00\xff\x03Q\xff\xd7\x00\ +\xff\x03S\xff\xd7\x00\xff\x03U\xff\xd7\x00\xff\x03W\xff\ +\xd7\x00\xff\x03Y\xff\xd7\x00\xff\x03[\xff\xd7\x00\xff\x03\ +]\xff\xd7\x00\xff\x03_\xff\xd7\x00\xff\x03a\xff\xec\x00\ +\xff\x03c\xff\xec\x00\xff\x03e\xff\xec\x00\xff\x03g\xff\ +\xec\x00\xff\x03i\xff\xec\x00\xff\x03k\xff\xec\x00\xff\x03\ +m\xff\xec\x00\xff\x03o\xff\xc3\x00\xff\x03q\xff\xc3\x00\ +\xff\x03s\xff\xc3\x00\xff\x03\x8f\xff\xd7\x01\x00\x00\x05\x00\ +R\x01\x00\x00\x0a\x00R\x01\x00\x00\x0c\x00\x8f\x01\x00\x00\ +\x22\x00\x8f\x01\x00\x00@\x00\x8f\x01\x00\x00E\x00=\x01\ +\x00\x00K\x00=\x01\x00\x00N\x00=\x01\x00\x00O\x00\ +=\x01\x00\x00`\x00\x8f\x01\x00\x00\xe7\x00=\x01\x00\x00\ +\xe9\x00\x8f\x01\x00\x02\x07\x00R\x01\x00\x02\x0b\x00R\x01\ +\x01\x00\x05\xff\x5c\x01\x01\x00\x0a\xff\x5c\x01\x01\x00&\xff\ +\xd7\x01\x01\x00*\xff\xd7\x01\x01\x002\xff\xd7\x01\x01\x00\ +4\xff\xd7\x01\x01\x007\xff\xd7\x01\x01\x008\xff\xec\x01\ +\x01\x009\xff\xd7\x01\x01\x00:\xff\xd7\x01\x01\x00<\xff\ +\xc3\x01\x01\x00\x89\xff\xd7\x01\x01\x00\x94\xff\xd7\x01\x01\x00\ +\x95\xff\xd7\x01\x01\x00\x96\xff\xd7\x01\x01\x00\x97\xff\xd7\x01\ +\x01\x00\x98\xff\xd7\x01\x01\x00\x9a\xff\xd7\x01\x01\x00\x9b\xff\ +\xec\x01\x01\x00\x9c\xff\xec\x01\x01\x00\x9d\xff\xec\x01\x01\x00\ +\x9e\xff\xec\x01\x01\x00\x9f\xff\xc3\x01\x01\x00\xc8\xff\xd7\x01\ +\x01\x00\xca\xff\xd7\x01\x01\x00\xcc\xff\xd7\x01\x01\x00\xce\xff\ +\xd7\x01\x01\x00\xde\xff\xd7\x01\x01\x00\xe0\xff\xd7\x01\x01\x00\ +\xe2\xff\xd7\x01\x01\x00\xe4\xff\xd7\x01\x01\x01\x0e\xff\xd7\x01\ +\x01\x01\x10\xff\xd7\x01\x01\x01\x12\xff\xd7\x01\x01\x01\x14\xff\ +\xd7\x01\x01\x01$\xff\xd7\x01\x01\x01&\xff\xd7\x01\x01\x01\ +*\xff\xec\x01\x01\x01,\xff\xec\x01\x01\x01.\xff\xec\x01\ +\x01\x010\xff\xec\x01\x01\x012\xff\xec\x01\x01\x014\xff\ +\xec\x01\x01\x016\xff\xd7\x01\x01\x018\xff\xc3\x01\x01\x01\ +:\xff\xc3\x01\x01\x01G\xff\xd7\x01\x01\x01\xfa\xff\xd7\x01\ +\x01\x01\xfc\xff\xd7\x01\x01\x01\xfe\xff\xd7\x01\x01\x02\x00\xff\ +\xc3\x01\x01\x02\x07\xff\x5c\x01\x01\x02\x0b\xff\x5c\x01\x01\x02\ +_\xff\xd7\x01\x01\x02a\xff\xec\x01\x01\x03I\xff\xd7\x01\ +\x01\x03K\xff\xd7\x01\x01\x03M\xff\xd7\x01\x01\x03O\xff\ +\xd7\x01\x01\x03Q\xff\xd7\x01\x01\x03S\xff\xd7\x01\x01\x03\ +U\xff\xd7\x01\x01\x03W\xff\xd7\x01\x01\x03Y\xff\xd7\x01\ +\x01\x03[\xff\xd7\x01\x01\x03]\xff\xd7\x01\x01\x03_\xff\ +\xd7\x01\x01\x03a\xff\xec\x01\x01\x03c\xff\xec\x01\x01\x03\ +e\xff\xec\x01\x01\x03g\xff\xec\x01\x01\x03i\xff\xec\x01\ +\x01\x03k\xff\xec\x01\x01\x03m\xff\xec\x01\x01\x03o\xff\ +\xc3\x01\x01\x03q\xff\xc3\x01\x01\x03s\xff\xc3\x01\x01\x03\ +\x8f\xff\xd7\x01\x03\x00\x05\xff\x5c\x01\x03\x00\x0a\xff\x5c\x01\ +\x03\x00&\xff\xd7\x01\x03\x00*\xff\xd7\x01\x03\x002\xff\ +\xd7\x01\x03\x004\xff\xd7\x01\x03\x007\xff\xd7\x01\x03\x00\ +8\xff\xec\x01\x03\x009\xff\xd7\x01\x03\x00:\xff\xd7\x01\ +\x03\x00<\xff\xc3\x01\x03\x00\x89\xff\xd7\x01\x03\x00\x94\xff\ +\xd7\x01\x03\x00\x95\xff\xd7\x01\x03\x00\x96\xff\xd7\x01\x03\x00\ +\x97\xff\xd7\x01\x03\x00\x98\xff\xd7\x01\x03\x00\x9a\xff\xd7\x01\ +\x03\x00\x9b\xff\xec\x01\x03\x00\x9c\xff\xec\x01\x03\x00\x9d\xff\ +\xec\x01\x03\x00\x9e\xff\xec\x01\x03\x00\x9f\xff\xc3\x01\x03\x00\ +\xc8\xff\xd7\x01\x03\x00\xca\xff\xd7\x01\x03\x00\xcc\xff\xd7\x01\ +\x03\x00\xce\xff\xd7\x01\x03\x00\xde\xff\xd7\x01\x03\x00\xe0\xff\ +\xd7\x01\x03\x00\xe2\xff\xd7\x01\x03\x00\xe4\xff\xd7\x01\x03\x01\ +\x0e\xff\xd7\x01\x03\x01\x10\xff\xd7\x01\x03\x01\x12\xff\xd7\x01\ +\x03\x01\x14\xff\xd7\x01\x03\x01$\xff\xd7\x01\x03\x01&\xff\ +\xd7\x01\x03\x01*\xff\xec\x01\x03\x01,\xff\xec\x01\x03\x01\ +.\xff\xec\x01\x03\x010\xff\xec\x01\x03\x012\xff\xec\x01\ +\x03\x014\xff\xec\x01\x03\x016\xff\xd7\x01\x03\x018\xff\ +\xc3\x01\x03\x01:\xff\xc3\x01\x03\x01G\xff\xd7\x01\x03\x01\ +\xfa\xff\xd7\x01\x03\x01\xfc\xff\xd7\x01\x03\x01\xfe\xff\xd7\x01\ +\x03\x02\x00\xff\xc3\x01\x03\x02\x07\xff\x5c\x01\x03\x02\x0b\xff\ +\x5c\x01\x03\x02_\xff\xd7\x01\x03\x02a\xff\xec\x01\x03\x03\ +I\xff\xd7\x01\x03\x03K\xff\xd7\x01\x03\x03M\xff\xd7\x01\ +\x03\x03O\xff\xd7\x01\x03\x03Q\xff\xd7\x01\x03\x03S\xff\ +\xd7\x01\x03\x03U\xff\xd7\x01\x03\x03W\xff\xd7\x01\x03\x03\ +Y\xff\xd7\x01\x03\x03[\xff\xd7\x01\x03\x03]\xff\xd7\x01\ +\x03\x03_\xff\xd7\x01\x03\x03a\xff\xec\x01\x03\x03c\xff\ +\xec\x01\x03\x03e\xff\xec\x01\x03\x03g\xff\xec\x01\x03\x03\ +i\xff\xec\x01\x03\x03k\xff\xec\x01\x03\x03m\xff\xec\x01\ +\x03\x03o\xff\xc3\x01\x03\x03q\xff\xc3\x01\x03\x03s\xff\ +\xc3\x01\x03\x03\x8f\xff\xd7\x01\x08\x00\x05\xff\xec\x01\x08\x00\ +\x0a\xff\xec\x01\x08\x02\x07\xff\xec\x01\x08\x02\x0b\xff\xec\x01\ +\x0e\x00\x0f\xff\xae\x01\x0e\x00\x11\xff\xae\x01\x0e\x00$\xff\ +\xd7\x01\x0e\x007\xff\xc3\x01\x0e\x009\xff\xec\x01\x0e\x00\ +:\xff\xec\x01\x0e\x00;\xff\xd7\x01\x0e\x00<\xff\xec\x01\ +\x0e\x00=\xff\xec\x01\x0e\x00\x82\xff\xd7\x01\x0e\x00\x83\xff\ +\xd7\x01\x0e\x00\x84\xff\xd7\x01\x0e\x00\x85\xff\xd7\x01\x0e\x00\ +\x86\xff\xd7\x01\x0e\x00\x87\xff\xd7\x01\x0e\x00\x9f\xff\xec\x01\ +\x0e\x00\xc2\xff\xd7\x01\x0e\x00\xc4\xff\xd7\x01\x0e\x00\xc6\xff\ +\xd7\x01\x0e\x01$\xff\xc3\x01\x0e\x01&\xff\xc3\x01\x0e\x01\ +6\xff\xec\x01\x0e\x018\xff\xec\x01\x0e\x01:\xff\xec\x01\ +\x0e\x01;\xff\xec\x01\x0e\x01=\xff\xec\x01\x0e\x01?\xff\ +\xec\x01\x0e\x01C\xff\xd7\x01\x0e\x01\xa0\xff\xec\x01\x0e\x01\ +\xfa\xff\xec\x01\x0e\x01\xfc\xff\xec\x01\x0e\x01\xfe\xff\xec\x01\ +\x0e\x02\x00\xff\xec\x01\x0e\x02\x08\xff\xae\x01\x0e\x02\x0c\xff\ +\xae\x01\x0e\x02X\xff\xd7\x01\x0e\x03\x1d\xff\xd7\x01\x0e\x03\ +\x1f\xff\xd7\x01\x0e\x03!\xff\xd7\x01\x0e\x03#\xff\xd7\x01\ +\x0e\x03%\xff\xd7\x01\x0e\x03'\xff\xd7\x01\x0e\x03)\xff\ +\xd7\x01\x0e\x03+\xff\xd7\x01\x0e\x03-\xff\xd7\x01\x0e\x03\ +/\xff\xd7\x01\x0e\x031\xff\xd7\x01\x0e\x033\xff\xd7\x01\ +\x0e\x03o\xff\xec\x01\x0e\x03q\xff\xec\x01\x0e\x03s\xff\ +\xec\x01\x0e\x03\x8f\xff\xc3\x01\x10\x00\x0f\xff\xae\x01\x10\x00\ +\x11\xff\xae\x01\x10\x00$\xff\xd7\x01\x10\x007\xff\xc3\x01\ +\x10\x009\xff\xec\x01\x10\x00:\xff\xec\x01\x10\x00;\xff\ +\xd7\x01\x10\x00<\xff\xec\x01\x10\x00=\xff\xec\x01\x10\x00\ +\x82\xff\xd7\x01\x10\x00\x83\xff\xd7\x01\x10\x00\x84\xff\xd7\x01\ +\x10\x00\x85\xff\xd7\x01\x10\x00\x86\xff\xd7\x01\x10\x00\x87\xff\ +\xd7\x01\x10\x00\x9f\xff\xec\x01\x10\x00\xc2\xff\xd7\x01\x10\x00\ +\xc4\xff\xd7\x01\x10\x00\xc6\xff\xd7\x01\x10\x01$\xff\xc3\x01\ +\x10\x01&\xff\xc3\x01\x10\x016\xff\xec\x01\x10\x018\xff\ +\xec\x01\x10\x01:\xff\xec\x01\x10\x01;\xff\xec\x01\x10\x01\ +=\xff\xec\x01\x10\x01?\xff\xec\x01\x10\x01C\xff\xd7\x01\ +\x10\x01\xa0\xff\xec\x01\x10\x01\xfa\xff\xec\x01\x10\x01\xfc\xff\ +\xec\x01\x10\x01\xfe\xff\xec\x01\x10\x02\x00\xff\xec\x01\x10\x02\ +\x08\xff\xae\x01\x10\x02\x0c\xff\xae\x01\x10\x02X\xff\xd7\x01\ +\x10\x03\x1d\xff\xd7\x01\x10\x03\x1f\xff\xd7\x01\x10\x03!\xff\ +\xd7\x01\x10\x03#\xff\xd7\x01\x10\x03%\xff\xd7\x01\x10\x03\ +'\xff\xd7\x01\x10\x03)\xff\xd7\x01\x10\x03+\xff\xd7\x01\ +\x10\x03-\xff\xd7\x01\x10\x03/\xff\xd7\x01\x10\x031\xff\ +\xd7\x01\x10\x033\xff\xd7\x01\x10\x03o\xff\xec\x01\x10\x03\ +q\xff\xec\x01\x10\x03s\xff\xec\x01\x10\x03\x8f\xff\xc3\x01\ +\x12\x00\x0f\xff\xae\x01\x12\x00\x11\xff\xae\x01\x12\x00$\xff\ +\xd7\x01\x12\x007\xff\xc3\x01\x12\x009\xff\xec\x01\x12\x00\ +:\xff\xec\x01\x12\x00;\xff\xd7\x01\x12\x00<\xff\xec\x01\ +\x12\x00=\xff\xec\x01\x12\x00\x82\xff\xd7\x01\x12\x00\x83\xff\ +\xd7\x01\x12\x00\x84\xff\xd7\x01\x12\x00\x85\xff\xd7\x01\x12\x00\ +\x86\xff\xd7\x01\x12\x00\x87\xff\xd7\x01\x12\x00\x9f\xff\xec\x01\ +\x12\x00\xc2\xff\xd7\x01\x12\x00\xc4\xff\xd7\x01\x12\x00\xc6\xff\ +\xd7\x01\x12\x01$\xff\xc3\x01\x12\x01&\xff\xc3\x01\x12\x01\ +6\xff\xec\x01\x12\x018\xff\xec\x01\x12\x01:\xff\xec\x01\ +\x12\x01;\xff\xec\x01\x12\x01=\xff\xec\x01\x12\x01?\xff\ +\xec\x01\x12\x01C\xff\xd7\x01\x12\x01\xa0\xff\xec\x01\x12\x01\ +\xfa\xff\xec\x01\x12\x01\xfc\xff\xec\x01\x12\x01\xfe\xff\xec\x01\ +\x12\x02\x00\xff\xec\x01\x12\x02\x08\xff\xae\x01\x12\x02\x0c\xff\ +\xae\x01\x12\x02X\xff\xd7\x01\x12\x03\x1d\xff\xd7\x01\x12\x03\ +\x1f\xff\xd7\x01\x12\x03!\xff\xd7\x01\x12\x03#\xff\xd7\x01\ +\x12\x03%\xff\xd7\x01\x12\x03'\xff\xd7\x01\x12\x03)\xff\ +\xd7\x01\x12\x03+\xff\xd7\x01\x12\x03-\xff\xd7\x01\x12\x03\ +/\xff\xd7\x01\x12\x031\xff\xd7\x01\x12\x033\xff\xd7\x01\ +\x12\x03o\xff\xec\x01\x12\x03q\xff\xec\x01\x12\x03s\xff\ +\xec\x01\x12\x03\x8f\xff\xc3\x01\x14\x00-\x00{\x01\x17\x00\ +\x05\x00R\x01\x17\x00\x0a\x00R\x01\x17\x00D\xff\xd7\x01\ +\x17\x00F\xff\xd7\x01\x17\x00G\xff\xd7\x01\x17\x00H\xff\ +\xd7\x01\x17\x00J\xff\xec\x01\x17\x00R\xff\xd7\x01\x17\x00\ +T\xff\xd7\x01\x17\x00\xa2\xff\xd7\x01\x17\x00\xa3\xff\xd7\x01\ +\x17\x00\xa4\xff\xd7\x01\x17\x00\xa5\xff\xd7\x01\x17\x00\xa6\xff\ +\xd7\x01\x17\x00\xa7\xff\xd7\x01\x17\x00\xa8\xff\xd7\x01\x17\x00\ +\xa9\xff\xd7\x01\x17\x00\xaa\xff\xd7\x01\x17\x00\xab\xff\xd7\x01\ +\x17\x00\xac\xff\xd7\x01\x17\x00\xad\xff\xd7\x01\x17\x00\xb4\xff\ +\xd7\x01\x17\x00\xb5\xff\xd7\x01\x17\x00\xb6\xff\xd7\x01\x17\x00\ +\xb7\xff\xd7\x01\x17\x00\xb8\xff\xd7\x01\x17\x00\xba\xff\xd7\x01\ +\x17\x00\xc3\xff\xd7\x01\x17\x00\xc5\xff\xd7\x01\x17\x00\xc7\xff\ +\xd7\x01\x17\x00\xc9\xff\xd7\x01\x17\x00\xcb\xff\xd7\x01\x17\x00\ +\xcd\xff\xd7\x01\x17\x00\xcf\xff\xd7\x01\x17\x00\xd1\xff\xd7\x01\ +\x17\x00\xd3\xff\xd7\x01\x17\x00\xd5\xff\xd7\x01\x17\x00\xd7\xff\ +\xd7\x01\x17\x00\xd9\xff\xd7\x01\x17\x00\xdb\xff\xd7\x01\x17\x00\ +\xdd\xff\xd7\x01\x17\x00\xdf\xff\xec\x01\x17\x00\xe1\xff\xec\x01\ +\x17\x00\xe3\xff\xec\x01\x17\x00\xe5\xff\xec\x01\x17\x01\x0f\xff\ +\xd7\x01\x17\x01\x11\xff\xd7\x01\x17\x01\x13\xff\xd7\x01\x17\x01\ +\x15\xff\xd7\x01\x17\x01D\xff\xd7\x01\x17\x01F\xff\xd7\x01\ +\x17\x01H\xff\xd7\x01\x17\x02\x07\x00R\x01\x17\x02\x0b\x00\ +R\x01\x17\x02Y\xff\xd7\x01\x17\x02`\xff\xd7\x01\x17\x03\ +\x1e\xff\xd7\x01\x17\x03 \xff\xd7\x01\x17\x03\x22\xff\xd7\x01\ +\x17\x03&\xff\xd7\x01\x17\x03(\xff\xd7\x01\x17\x03*\xff\ +\xd7\x01\x17\x03,\xff\xd7\x01\x17\x03.\xff\xd7\x01\x17\x03\ +0\xff\xd7\x01\x17\x032\xff\xd7\x01\x17\x034\xff\xd7\x01\ +\x17\x036\xff\xd7\x01\x17\x038\xff\xd7\x01\x17\x03:\xff\ +\xd7\x01\x17\x03<\xff\xd7\x01\x17\x03@\xff\xd7\x01\x17\x03\ +B\xff\xd7\x01\x17\x03D\xff\xd7\x01\x17\x03J\xff\xd7\x01\ +\x17\x03L\xff\xd7\x01\x17\x03N\xff\xd7\x01\x17\x03R\xff\ +\xd7\x01\x17\x03T\xff\xd7\x01\x17\x03V\xff\xd7\x01\x17\x03\ +X\xff\xd7\x01\x17\x03Z\xff\xd7\x01\x17\x03\x5c\xff\xd7\x01\ +\x17\x03^\xff\xd7\x01\x17\x03`\xff\xd7\x01\x19\x00\x05\x00\ +R\x01\x19\x00\x0a\x00R\x01\x19\x00D\xff\xd7\x01\x19\x00\ +F\xff\xd7\x01\x19\x00G\xff\xd7\x01\x19\x00H\xff\xd7\x01\ +\x19\x00J\xff\xec\x01\x19\x00R\xff\xd7\x01\x19\x00T\xff\ +\xd7\x01\x19\x00\xa2\xff\xd7\x01\x19\x00\xa3\xff\xd7\x01\x19\x00\ +\xa4\xff\xd7\x01\x19\x00\xa5\xff\xd7\x01\x19\x00\xa6\xff\xd7\x01\ +\x19\x00\xa7\xff\xd7\x01\x19\x00\xa8\xff\xd7\x01\x19\x00\xa9\xff\ +\xd7\x01\x19\x00\xaa\xff\xd7\x01\x19\x00\xab\xff\xd7\x01\x19\x00\ +\xac\xff\xd7\x01\x19\x00\xad\xff\xd7\x01\x19\x00\xb4\xff\xd7\x01\ +\x19\x00\xb5\xff\xd7\x01\x19\x00\xb6\xff\xd7\x01\x19\x00\xb7\xff\ +\xd7\x01\x19\x00\xb8\xff\xd7\x01\x19\x00\xba\xff\xd7\x01\x19\x00\ +\xc3\xff\xd7\x01\x19\x00\xc5\xff\xd7\x01\x19\x00\xc7\xff\xd7\x01\ +\x19\x00\xc9\xff\xd7\x01\x19\x00\xcb\xff\xd7\x01\x19\x00\xcd\xff\ +\xd7\x01\x19\x00\xcf\xff\xd7\x01\x19\x00\xd1\xff\xd7\x01\x19\x00\ +\xd3\xff\xd7\x01\x19\x00\xd5\xff\xd7\x01\x19\x00\xd7\xff\xd7\x01\ +\x19\x00\xd9\xff\xd7\x01\x19\x00\xdb\xff\xd7\x01\x19\x00\xdd\xff\ +\xd7\x01\x19\x00\xdf\xff\xec\x01\x19\x00\xe1\xff\xec\x01\x19\x00\ +\xe3\xff\xec\x01\x19\x00\xe5\xff\xec\x01\x19\x01\x0f\xff\xd7\x01\ +\x19\x01\x11\xff\xd7\x01\x19\x01\x13\xff\xd7\x01\x19\x01\x15\xff\ +\xd7\x01\x19\x01D\xff\xd7\x01\x19\x01F\xff\xd7\x01\x19\x01\ +H\xff\xd7\x01\x19\x02\x07\x00R\x01\x19\x02\x0b\x00R\x01\ +\x19\x02Y\xff\xd7\x01\x19\x02`\xff\xd7\x01\x19\x03\x1e\xff\ +\xd7\x01\x19\x03 \xff\xd7\x01\x19\x03\x22\xff\xd7\x01\x19\x03\ +&\xff\xd7\x01\x19\x03(\xff\xd7\x01\x19\x03*\xff\xd7\x01\ +\x19\x03,\xff\xd7\x01\x19\x03.\xff\xd7\x01\x19\x030\xff\ +\xd7\x01\x19\x032\xff\xd7\x01\x19\x034\xff\xd7\x01\x19\x03\ +6\xff\xd7\x01\x19\x038\xff\xd7\x01\x19\x03:\xff\xd7\x01\ +\x19\x03<\xff\xd7\x01\x19\x03@\xff\xd7\x01\x19\x03B\xff\ +\xd7\x01\x19\x03D\xff\xd7\x01\x19\x03J\xff\xd7\x01\x19\x03\ +L\xff\xd7\x01\x19\x03N\xff\xd7\x01\x19\x03R\xff\xd7\x01\ +\x19\x03T\xff\xd7\x01\x19\x03V\xff\xd7\x01\x19\x03X\xff\ +\xd7\x01\x19\x03Z\xff\xd7\x01\x19\x03\x5c\xff\xd7\x01\x19\x03\ +^\xff\xd7\x01\x19\x03`\xff\xd7\x01\x1b\x00\x05\x00R\x01\ +\x1b\x00\x0a\x00R\x01\x1b\x00D\xff\xd7\x01\x1b\x00F\xff\ +\xd7\x01\x1b\x00G\xff\xd7\x01\x1b\x00H\xff\xd7\x01\x1b\x00\ +J\xff\xec\x01\x1b\x00R\xff\xd7\x01\x1b\x00T\xff\xd7\x01\ +\x1b\x00\xa2\xff\xd7\x01\x1b\x00\xa3\xff\xd7\x01\x1b\x00\xa4\xff\ +\xd7\x01\x1b\x00\xa5\xff\xd7\x01\x1b\x00\xa6\xff\xd7\x01\x1b\x00\ +\xa7\xff\xd7\x01\x1b\x00\xa8\xff\xd7\x01\x1b\x00\xa9\xff\xd7\x01\ +\x1b\x00\xaa\xff\xd7\x01\x1b\x00\xab\xff\xd7\x01\x1b\x00\xac\xff\ +\xd7\x01\x1b\x00\xad\xff\xd7\x01\x1b\x00\xb4\xff\xd7\x01\x1b\x00\ +\xb5\xff\xd7\x01\x1b\x00\xb6\xff\xd7\x01\x1b\x00\xb7\xff\xd7\x01\ +\x1b\x00\xb8\xff\xd7\x01\x1b\x00\xba\xff\xd7\x01\x1b\x00\xc3\xff\ +\xd7\x01\x1b\x00\xc5\xff\xd7\x01\x1b\x00\xc7\xff\xd7\x01\x1b\x00\ +\xc9\xff\xd7\x01\x1b\x00\xcb\xff\xd7\x01\x1b\x00\xcd\xff\xd7\x01\ +\x1b\x00\xcf\xff\xd7\x01\x1b\x00\xd1\xff\xd7\x01\x1b\x00\xd3\xff\ +\xd7\x01\x1b\x00\xd5\xff\xd7\x01\x1b\x00\xd7\xff\xd7\x01\x1b\x00\ +\xd9\xff\xd7\x01\x1b\x00\xdb\xff\xd7\x01\x1b\x00\xdd\xff\xd7\x01\ +\x1b\x00\xdf\xff\xec\x01\x1b\x00\xe1\xff\xec\x01\x1b\x00\xe3\xff\ +\xec\x01\x1b\x00\xe5\xff\xec\x01\x1b\x01\x0f\xff\xd7\x01\x1b\x01\ +\x11\xff\xd7\x01\x1b\x01\x13\xff\xd7\x01\x1b\x01\x15\xff\xd7\x01\ +\x1b\x01D\xff\xd7\x01\x1b\x01F\xff\xd7\x01\x1b\x01H\xff\ +\xd7\x01\x1b\x02\x07\x00R\x01\x1b\x02\x0b\x00R\x01\x1b\x02\ +Y\xff\xd7\x01\x1b\x02`\xff\xd7\x01\x1b\x03\x1e\xff\xd7\x01\ +\x1b\x03 \xff\xd7\x01\x1b\x03\x22\xff\xd7\x01\x1b\x03&\xff\ +\xd7\x01\x1b\x03(\xff\xd7\x01\x1b\x03*\xff\xd7\x01\x1b\x03\ +,\xff\xd7\x01\x1b\x03.\xff\xd7\x01\x1b\x030\xff\xd7\x01\ +\x1b\x032\xff\xd7\x01\x1b\x034\xff\xd7\x01\x1b\x036\xff\ +\xd7\x01\x1b\x038\xff\xd7\x01\x1b\x03:\xff\xd7\x01\x1b\x03\ +<\xff\xd7\x01\x1b\x03@\xff\xd7\x01\x1b\x03B\xff\xd7\x01\ +\x1b\x03D\xff\xd7\x01\x1b\x03J\xff\xd7\x01\x1b\x03L\xff\ +\xd7\x01\x1b\x03N\xff\xd7\x01\x1b\x03R\xff\xd7\x01\x1b\x03\ +T\xff\xd7\x01\x1b\x03V\xff\xd7\x01\x1b\x03X\xff\xd7\x01\ +\x1b\x03Z\xff\xd7\x01\x1b\x03\x5c\xff\xd7\x01\x1b\x03^\xff\ +\xd7\x01\x1b\x03`\xff\xd7\x01$\x00\x0f\xff\x85\x01$\x00\ +\x10\xff\xae\x01$\x00\x11\xff\x85\x01$\x00\x22\x00)\x01\ +$\x00$\xffq\x01$\x00&\xff\xd7\x01$\x00*\xff\ +\xd7\x01$\x002\xff\xd7\x01$\x004\xff\xd7\x01$\x00\ +7\x00)\x01$\x00D\xff\x5c\x01$\x00F\xffq\x01\ +$\x00G\xffq\x01$\x00H\xffq\x01$\x00J\xff\ +q\x01$\x00P\xff\x9a\x01$\x00Q\xff\x9a\x01$\x00\ +R\xffq\x01$\x00S\xff\x9a\x01$\x00T\xffq\x01\ +$\x00U\xff\x9a\x01$\x00V\xff\x85\x01$\x00X\xff\ +\x9a\x01$\x00Y\xff\xd7\x01$\x00Z\xff\xd7\x01$\x00\ +[\xff\xd7\x01$\x00\x5c\xff\xd7\x01$\x00]\xff\xae\x01\ +$\x00\x82\xffq\x01$\x00\x83\xffq\x01$\x00\x84\xff\ +q\x01$\x00\x85\xffq\x01$\x00\x86\xffq\x01$\x00\ +\x87\xffq\x01$\x00\x89\xff\xd7\x01$\x00\x94\xff\xd7\x01\ +$\x00\x95\xff\xd7\x01$\x00\x96\xff\xd7\x01$\x00\x97\xff\ +\xd7\x01$\x00\x98\xff\xd7\x01$\x00\x9a\xff\xd7\x01$\x00\ +\xa2\xffq\x01$\x00\xa3\xff\x5c\x01$\x00\xa4\xff\x5c\x01\ +$\x00\xa5\xff\x5c\x01$\x00\xa6\xff\x5c\x01$\x00\xa7\xff\ +\x5c\x01$\x00\xa8\xff\x5c\x01$\x00\xa9\xffq\x01$\x00\ +\xaa\xffq\x01$\x00\xab\xffq\x01$\x00\xac\xffq\x01\ +$\x00\xad\xffq\x01$\x00\xb4\xffq\x01$\x00\xb5\xff\ +q\x01$\x00\xb6\xffq\x01$\x00\xb7\xffq\x01$\x00\ +\xb8\xffq\x01$\x00\xba\xffq\x01$\x00\xbb\xff\x9a\x01\ +$\x00\xbc\xff\x9a\x01$\x00\xbd\xff\x9a\x01$\x00\xbe\xff\ +\x9a\x01$\x00\xbf\xff\xd7\x01$\x00\xc2\xffq\x01$\x00\ +\xc3\xff\x5c\x01$\x00\xc4\xffq\x01$\x00\xc5\xff\x5c\x01\ +$\x00\xc6\xffq\x01$\x00\xc7\xff\x5c\x01$\x00\xc8\xff\ +\xd7\x01$\x00\xc9\xffq\x01$\x00\xca\xff\xd7\x01$\x00\ +\xcb\xffq\x01$\x00\xcc\xff\xd7\x01$\x00\xcd\xffq\x01\ +$\x00\xce\xff\xd7\x01$\x00\xcf\xffq\x01$\x00\xd1\xff\ +q\x01$\x00\xd3\xffq\x01$\x00\xd5\xffq\x01$\x00\ +\xd7\xffq\x01$\x00\xd9\xffq\x01$\x00\xdb\xffq\x01\ +$\x00\xdd\xffq\x01$\x00\xde\xff\xd7\x01$\x00\xdf\xff\ +q\x01$\x00\xe0\xff\xd7\x01$\x00\xe1\xffq\x01$\x00\ +\xe2\xff\xd7\x01$\x00\xe3\xffq\x01$\x00\xe4\xff\xd7\x01\ +$\x00\xe5\xffq\x01$\x00\xfa\xff\x9a\x01$\x01\x06\xff\ +\x9a\x01$\x01\x08\xff\x9a\x01$\x01\x0d\xff\x9a\x01$\x01\ +\x0e\xff\xd7\x01$\x01\x0f\xffq\x01$\x01\x10\xff\xd7\x01\ +$\x01\x11\xffq\x01$\x01\x12\xff\xd7\x01$\x01\x13\xff\ +q\x01$\x01\x14\xff\xd7\x01$\x01\x15\xffq\x01$\x01\ +\x17\xff\x9a\x01$\x01\x19\xff\x9a\x01$\x01\x1d\xff\x85\x01\ +$\x01!\xff\x85\x01$\x01$\x00)\x01$\x01&\x00\ +)\x01$\x01+\xff\x9a\x01$\x01-\xff\x9a\x01$\x01\ +/\xff\x9a\x01$\x011\xff\x9a\x01$\x013\xff\x9a\x01\ +$\x015\xff\x9a\x01$\x017\xff\xd7\x01$\x01<\xff\ +\xae\x01$\x01>\xff\xae\x01$\x01@\xff\xae\x01$\x01\ +C\xffq\x01$\x01D\xff\x5c\x01$\x01F\xff\x5c\x01\ +$\x01G\xff\xd7\x01$\x01H\xffq\x01$\x01J\xff\ +\x85\x01$\x01\xfb\xff\xd7\x01$\x01\xfd\xff\xd7\x01$\x02\ +\x02\xff\xae\x01$\x02\x03\xff\xae\x01$\x02\x04\xff\xae\x01\ +$\x02\x08\xff\x85\x01$\x02\x0c\xff\x85\x01$\x02W\xff\ +\x9a\x01$\x02X\xffq\x01$\x02Y\xff\x5c\x01$\x02\ +_\xff\xd7\x01$\x02`\xffq\x01$\x02b\xff\x9a\x01\ +$\x03\x1d\xffq\x01$\x03\x1e\xff\x5c\x01$\x03\x1f\xff\ +q\x01$\x03 \xff\x5c\x01$\x03!\xffq\x01$\x03\ +\x22\xff\x5c\x01$\x03#\xffq\x01$\x03%\xffq\x01\ +$\x03&\xff\x5c\x01$\x03'\xffq\x01$\x03(\xff\ +\x5c\x01$\x03)\xffq\x01$\x03*\xff\x5c\x01$\x03\ ++\xffq\x01$\x03,\xff\x5c\x01$\x03-\xffq\x01\ +$\x03.\xff\x5c\x01$\x03/\xffq\x01$\x030\xff\ +\x5c\x01$\x031\xffq\x01$\x032\xff\x5c\x01$\x03\ +3\xffq\x01$\x034\xff\x5c\x01$\x036\xffq\x01\ +$\x038\xffq\x01$\x03:\xffq\x01$\x03<\xff\ +q\x01$\x03@\xffq\x01$\x03B\xffq\x01$\x03\ +D\xffq\x01$\x03I\xff\xd7\x01$\x03J\xffq\x01\ +$\x03K\xff\xd7\x01$\x03L\xffq\x01$\x03M\xff\ +\xd7\x01$\x03N\xffq\x01$\x03O\xff\xd7\x01$\x03\ +Q\xff\xd7\x01$\x03R\xffq\x01$\x03S\xff\xd7\x01\ +$\x03T\xffq\x01$\x03U\xff\xd7\x01$\x03V\xff\ +q\x01$\x03W\xff\xd7\x01$\x03X\xffq\x01$\x03\ +Y\xff\xd7\x01$\x03Z\xffq\x01$\x03[\xff\xd7\x01\ +$\x03\x5c\xffq\x01$\x03]\xff\xd7\x01$\x03^\xff\ +q\x01$\x03_\xff\xd7\x01$\x03`\xffq\x01$\x03\ +b\xff\x9a\x01$\x03d\xff\x9a\x01$\x03f\xff\x9a\x01\ +$\x03h\xff\x9a\x01$\x03j\xff\x9a\x01$\x03l\xff\ +\x9a\x01$\x03n\xff\x9a\x01$\x03p\xff\xd7\x01$\x03\ +\x8f\x00)\x01%\x00\x05\x00)\x01%\x00\x0a\x00)\x01\ +%\x02\x07\x00)\x01%\x02\x0b\x00)\x01&\x00\x0f\xff\ +\x85\x01&\x00\x10\xff\xae\x01&\x00\x11\xff\x85\x01&\x00\ +\x22\x00)\x01&\x00$\xffq\x01&\x00&\xff\xd7\x01\ +&\x00*\xff\xd7\x01&\x002\xff\xd7\x01&\x004\xff\ +\xd7\x01&\x007\x00)\x01&\x00D\xff\x5c\x01&\x00\ +F\xffq\x01&\x00G\xffq\x01&\x00H\xffq\x01\ +&\x00J\xffq\x01&\x00P\xff\x9a\x01&\x00Q\xff\ +\x9a\x01&\x00R\xffq\x01&\x00S\xff\x9a\x01&\x00\ +T\xffq\x01&\x00U\xff\x9a\x01&\x00V\xff\x85\x01\ +&\x00X\xff\x9a\x01&\x00Y\xff\xd7\x01&\x00Z\xff\ +\xd7\x01&\x00[\xff\xd7\x01&\x00\x5c\xff\xd7\x01&\x00\ +]\xff\xae\x01&\x00\x82\xffq\x01&\x00\x83\xffq\x01\ +&\x00\x84\xffq\x01&\x00\x85\xffq\x01&\x00\x86\xff\ +q\x01&\x00\x87\xffq\x01&\x00\x89\xff\xd7\x01&\x00\ +\x94\xff\xd7\x01&\x00\x95\xff\xd7\x01&\x00\x96\xff\xd7\x01\ +&\x00\x97\xff\xd7\x01&\x00\x98\xff\xd7\x01&\x00\x9a\xff\ +\xd7\x01&\x00\xa2\xffq\x01&\x00\xa3\xff\x5c\x01&\x00\ +\xa4\xff\x5c\x01&\x00\xa5\xff\x5c\x01&\x00\xa6\xff\x5c\x01\ +&\x00\xa7\xff\x5c\x01&\x00\xa8\xff\x5c\x01&\x00\xa9\xff\ +q\x01&\x00\xaa\xffq\x01&\x00\xab\xffq\x01&\x00\ +\xac\xffq\x01&\x00\xad\xffq\x01&\x00\xb4\xffq\x01\ +&\x00\xb5\xffq\x01&\x00\xb6\xffq\x01&\x00\xb7\xff\ +q\x01&\x00\xb8\xffq\x01&\x00\xba\xffq\x01&\x00\ +\xbb\xff\x9a\x01&\x00\xbc\xff\x9a\x01&\x00\xbd\xff\x9a\x01\ +&\x00\xbe\xff\x9a\x01&\x00\xbf\xff\xd7\x01&\x00\xc2\xff\ +q\x01&\x00\xc3\xff\x5c\x01&\x00\xc4\xffq\x01&\x00\ +\xc5\xff\x5c\x01&\x00\xc6\xffq\x01&\x00\xc7\xff\x5c\x01\ +&\x00\xc8\xff\xd7\x01&\x00\xc9\xffq\x01&\x00\xca\xff\ +\xd7\x01&\x00\xcb\xffq\x01&\x00\xcc\xff\xd7\x01&\x00\ +\xcd\xffq\x01&\x00\xce\xff\xd7\x01&\x00\xcf\xffq\x01\ +&\x00\xd1\xffq\x01&\x00\xd3\xffq\x01&\x00\xd5\xff\ +q\x01&\x00\xd7\xffq\x01&\x00\xd9\xffq\x01&\x00\ +\xdb\xffq\x01&\x00\xdd\xffq\x01&\x00\xde\xff\xd7\x01\ +&\x00\xdf\xffq\x01&\x00\xe0\xff\xd7\x01&\x00\xe1\xff\ +q\x01&\x00\xe2\xff\xd7\x01&\x00\xe3\xffq\x01&\x00\ +\xe4\xff\xd7\x01&\x00\xe5\xffq\x01&\x00\xfa\xff\x9a\x01\ +&\x01\x06\xff\x9a\x01&\x01\x08\xff\x9a\x01&\x01\x0d\xff\ +\x9a\x01&\x01\x0e\xff\xd7\x01&\x01\x0f\xffq\x01&\x01\ +\x10\xff\xd7\x01&\x01\x11\xffq\x01&\x01\x12\xff\xd7\x01\ +&\x01\x13\xffq\x01&\x01\x14\xff\xd7\x01&\x01\x15\xff\ +q\x01&\x01\x17\xff\x9a\x01&\x01\x19\xff\x9a\x01&\x01\ +\x1d\xff\x85\x01&\x01!\xff\x85\x01&\x01$\x00)\x01\ +&\x01&\x00)\x01&\x01+\xff\x9a\x01&\x01-\xff\ +\x9a\x01&\x01/\xff\x9a\x01&\x011\xff\x9a\x01&\x01\ +3\xff\x9a\x01&\x015\xff\x9a\x01&\x017\xff\xd7\x01\ +&\x01<\xff\xae\x01&\x01>\xff\xae\x01&\x01@\xff\ +\xae\x01&\x01C\xffq\x01&\x01D\xff\x5c\x01&\x01\ +F\xff\x5c\x01&\x01G\xff\xd7\x01&\x01H\xffq\x01\ +&\x01J\xff\x85\x01&\x01\xfb\xff\xd7\x01&\x01\xfd\xff\ +\xd7\x01&\x02\x02\xff\xae\x01&\x02\x03\xff\xae\x01&\x02\ +\x04\xff\xae\x01&\x02\x08\xff\x85\x01&\x02\x0c\xff\x85\x01\ +&\x02W\xff\x9a\x01&\x02X\xffq\x01&\x02Y\xff\ +\x5c\x01&\x02_\xff\xd7\x01&\x02`\xffq\x01&\x02\ +b\xff\x9a\x01&\x03\x1d\xffq\x01&\x03\x1e\xff\x5c\x01\ +&\x03\x1f\xffq\x01&\x03 \xff\x5c\x01&\x03!\xff\ +q\x01&\x03\x22\xff\x5c\x01&\x03#\xffq\x01&\x03\ +%\xffq\x01&\x03&\xff\x5c\x01&\x03'\xffq\x01\ +&\x03(\xff\x5c\x01&\x03)\xffq\x01&\x03*\xff\ +\x5c\x01&\x03+\xffq\x01&\x03,\xff\x5c\x01&\x03\ +-\xffq\x01&\x03.\xff\x5c\x01&\x03/\xffq\x01\ +&\x030\xff\x5c\x01&\x031\xffq\x01&\x032\xff\ +\x5c\x01&\x033\xffq\x01&\x034\xff\x5c\x01&\x03\ +6\xffq\x01&\x038\xffq\x01&\x03:\xffq\x01\ +&\x03<\xffq\x01&\x03@\xffq\x01&\x03B\xff\ +q\x01&\x03D\xffq\x01&\x03I\xff\xd7\x01&\x03\ +J\xffq\x01&\x03K\xff\xd7\x01&\x03L\xffq\x01\ +&\x03M\xff\xd7\x01&\x03N\xffq\x01&\x03O\xff\ +\xd7\x01&\x03Q\xff\xd7\x01&\x03R\xffq\x01&\x03\ +S\xff\xd7\x01&\x03T\xffq\x01&\x03U\xff\xd7\x01\ +&\x03V\xffq\x01&\x03W\xff\xd7\x01&\x03X\xff\ +q\x01&\x03Y\xff\xd7\x01&\x03Z\xffq\x01&\x03\ +[\xff\xd7\x01&\x03\x5c\xffq\x01&\x03]\xff\xd7\x01\ +&\x03^\xffq\x01&\x03_\xff\xd7\x01&\x03`\xff\ +q\x01&\x03b\xff\x9a\x01&\x03d\xff\x9a\x01&\x03\ +f\xff\x9a\x01&\x03h\xff\x9a\x01&\x03j\xff\x9a\x01\ +&\x03l\xff\x9a\x01&\x03n\xff\x9a\x01&\x03p\xff\ +\xd7\x01&\x03\x8f\x00)\x01'\x00\x05\x00)\x01'\x00\ +\x0a\x00)\x01'\x02\x07\x00)\x01'\x02\x0b\x00)\x01\ +(\x00\x0f\xff\x85\x01(\x00\x10\xff\xae\x01(\x00\x11\xff\ +\x85\x01(\x00\x22\x00)\x01(\x00$\xffq\x01(\x00\ +&\xff\xd7\x01(\x00*\xff\xd7\x01(\x002\xff\xd7\x01\ +(\x004\xff\xd7\x01(\x007\x00)\x01(\x00D\xff\ +\x5c\x01(\x00F\xffq\x01(\x00G\xffq\x01(\x00\ +H\xffq\x01(\x00J\xffq\x01(\x00P\xff\x9a\x01\ +(\x00Q\xff\x9a\x01(\x00R\xffq\x01(\x00S\xff\ +\x9a\x01(\x00T\xffq\x01(\x00U\xff\x9a\x01(\x00\ +V\xff\x85\x01(\x00X\xff\x9a\x01(\x00Y\xff\xd7\x01\ +(\x00Z\xff\xd7\x01(\x00[\xff\xd7\x01(\x00\x5c\xff\ +\xd7\x01(\x00]\xff\xae\x01(\x00\x82\xffq\x01(\x00\ +\x83\xffq\x01(\x00\x84\xffq\x01(\x00\x85\xffq\x01\ +(\x00\x86\xffq\x01(\x00\x87\xffq\x01(\x00\x89\xff\ +\xd7\x01(\x00\x94\xff\xd7\x01(\x00\x95\xff\xd7\x01(\x00\ +\x96\xff\xd7\x01(\x00\x97\xff\xd7\x01(\x00\x98\xff\xd7\x01\ +(\x00\x9a\xff\xd7\x01(\x00\xa2\xffq\x01(\x00\xa3\xff\ +\x5c\x01(\x00\xa4\xff\x5c\x01(\x00\xa5\xff\x5c\x01(\x00\ +\xa6\xff\x5c\x01(\x00\xa7\xff\x5c\x01(\x00\xa8\xff\x5c\x01\ +(\x00\xa9\xffq\x01(\x00\xaa\xffq\x01(\x00\xab\xff\ +q\x01(\x00\xac\xffq\x01(\x00\xad\xffq\x01(\x00\ +\xb4\xffq\x01(\x00\xb5\xffq\x01(\x00\xb6\xffq\x01\ +(\x00\xb7\xffq\x01(\x00\xb8\xffq\x01(\x00\xba\xff\ +q\x01(\x00\xbb\xff\x9a\x01(\x00\xbc\xff\x9a\x01(\x00\ +\xbd\xff\x9a\x01(\x00\xbe\xff\x9a\x01(\x00\xbf\xff\xd7\x01\ +(\x00\xc2\xffq\x01(\x00\xc3\xff\x5c\x01(\x00\xc4\xff\ +q\x01(\x00\xc5\xff\x5c\x01(\x00\xc6\xffq\x01(\x00\ +\xc7\xff\x5c\x01(\x00\xc8\xff\xd7\x01(\x00\xc9\xffq\x01\ +(\x00\xca\xff\xd7\x01(\x00\xcb\xffq\x01(\x00\xcc\xff\ +\xd7\x01(\x00\xcd\xffq\x01(\x00\xce\xff\xd7\x01(\x00\ +\xcf\xffq\x01(\x00\xd1\xffq\x01(\x00\xd3\xffq\x01\ +(\x00\xd5\xffq\x01(\x00\xd7\xffq\x01(\x00\xd9\xff\ +q\x01(\x00\xdb\xffq\x01(\x00\xdd\xffq\x01(\x00\ +\xde\xff\xd7\x01(\x00\xdf\xffq\x01(\x00\xe0\xff\xd7\x01\ +(\x00\xe1\xffq\x01(\x00\xe2\xff\xd7\x01(\x00\xe3\xff\ +q\x01(\x00\xe4\xff\xd7\x01(\x00\xe5\xffq\x01(\x00\ +\xfa\xff\x9a\x01(\x01\x06\xff\x9a\x01(\x01\x08\xff\x9a\x01\ +(\x01\x0d\xff\x9a\x01(\x01\x0e\xff\xd7\x01(\x01\x0f\xff\ +q\x01(\x01\x10\xff\xd7\x01(\x01\x11\xffq\x01(\x01\ +\x12\xff\xd7\x01(\x01\x13\xffq\x01(\x01\x14\xff\xd7\x01\ +(\x01\x15\xffq\x01(\x01\x17\xff\x9a\x01(\x01\x19\xff\ +\x9a\x01(\x01\x1d\xff\x85\x01(\x01!\xff\x85\x01(\x01\ +$\x00)\x01(\x01&\x00)\x01(\x01+\xff\x9a\x01\ +(\x01-\xff\x9a\x01(\x01/\xff\x9a\x01(\x011\xff\ +\x9a\x01(\x013\xff\x9a\x01(\x015\xff\x9a\x01(\x01\ +7\xff\xd7\x01(\x01<\xff\xae\x01(\x01>\xff\xae\x01\ +(\x01@\xff\xae\x01(\x01C\xffq\x01(\x01D\xff\ +\x5c\x01(\x01F\xff\x5c\x01(\x01G\xff\xd7\x01(\x01\ +H\xffq\x01(\x01J\xff\x85\x01(\x01\xfb\xff\xd7\x01\ +(\x01\xfd\xff\xd7\x01(\x02\x02\xff\xae\x01(\x02\x03\xff\ +\xae\x01(\x02\x04\xff\xae\x01(\x02\x08\xff\x85\x01(\x02\ +\x0c\xff\x85\x01(\x02W\xff\x9a\x01(\x02X\xffq\x01\ +(\x02Y\xff\x5c\x01(\x02_\xff\xd7\x01(\x02`\xff\ +q\x01(\x02b\xff\x9a\x01(\x03\x1d\xffq\x01(\x03\ +\x1e\xff\x5c\x01(\x03\x1f\xffq\x01(\x03 \xff\x5c\x01\ +(\x03!\xffq\x01(\x03\x22\xff\x5c\x01(\x03#\xff\ +q\x01(\x03%\xffq\x01(\x03&\xff\x5c\x01(\x03\ +'\xffq\x01(\x03(\xff\x5c\x01(\x03)\xffq\x01\ +(\x03*\xff\x5c\x01(\x03+\xffq\x01(\x03,\xff\ +\x5c\x01(\x03-\xffq\x01(\x03.\xff\x5c\x01(\x03\ +/\xffq\x01(\x030\xff\x5c\x01(\x031\xffq\x01\ +(\x032\xff\x5c\x01(\x033\xffq\x01(\x034\xff\ +\x5c\x01(\x036\xffq\x01(\x038\xffq\x01(\x03\ +:\xffq\x01(\x03<\xffq\x01(\x03@\xffq\x01\ +(\x03B\xffq\x01(\x03D\xffq\x01(\x03I\xff\ +\xd7\x01(\x03J\xffq\x01(\x03K\xff\xd7\x01(\x03\ +L\xffq\x01(\x03M\xff\xd7\x01(\x03N\xffq\x01\ +(\x03O\xff\xd7\x01(\x03Q\xff\xd7\x01(\x03R\xff\ +q\x01(\x03S\xff\xd7\x01(\x03T\xffq\x01(\x03\ +U\xff\xd7\x01(\x03V\xffq\x01(\x03W\xff\xd7\x01\ +(\x03X\xffq\x01(\x03Y\xff\xd7\x01(\x03Z\xff\ +q\x01(\x03[\xff\xd7\x01(\x03\x5c\xffq\x01(\x03\ +]\xff\xd7\x01(\x03^\xffq\x01(\x03_\xff\xd7\x01\ +(\x03`\xffq\x01(\x03b\xff\x9a\x01(\x03d\xff\ +\x9a\x01(\x03f\xff\x9a\x01(\x03h\xff\x9a\x01(\x03\ +j\xff\x9a\x01(\x03l\xff\x9a\x01(\x03n\xff\x9a\x01\ +(\x03p\xff\xd7\x01(\x03\x8f\x00)\x01*\x00\x0f\xff\ +\xd7\x01*\x00\x11\xff\xd7\x01*\x00$\xff\xec\x01*\x00\ +\x82\xff\xec\x01*\x00\x83\xff\xec\x01*\x00\x84\xff\xec\x01\ +*\x00\x85\xff\xec\x01*\x00\x86\xff\xec\x01*\x00\x87\xff\ +\xec\x01*\x00\xc2\xff\xec\x01*\x00\xc4\xff\xec\x01*\x00\ +\xc6\xff\xec\x01*\x01C\xff\xec\x01*\x02\x08\xff\xd7\x01\ +*\x02\x0c\xff\xd7\x01*\x02X\xff\xec\x01*\x03\x1d\xff\ +\xec\x01*\x03\x1f\xff\xec\x01*\x03!\xff\xec\x01*\x03\ +#\xff\xec\x01*\x03%\xff\xec\x01*\x03'\xff\xec\x01\ +*\x03)\xff\xec\x01*\x03+\xff\xec\x01*\x03-\xff\ +\xec\x01*\x03/\xff\xec\x01*\x031\xff\xec\x01*\x03\ +3\xff\xec\x01,\x00\x0f\xff\xd7\x01,\x00\x11\xff\xd7\x01\ +,\x00$\xff\xec\x01,\x00\x82\xff\xec\x01,\x00\x83\xff\ +\xec\x01,\x00\x84\xff\xec\x01,\x00\x85\xff\xec\x01,\x00\ +\x86\xff\xec\x01,\x00\x87\xff\xec\x01,\x00\xc2\xff\xec\x01\ +,\x00\xc4\xff\xec\x01,\x00\xc6\xff\xec\x01,\x01C\xff\ +\xec\x01,\x02\x08\xff\xd7\x01,\x02\x0c\xff\xd7\x01,\x02\ +X\xff\xec\x01,\x03\x1d\xff\xec\x01,\x03\x1f\xff\xec\x01\ +,\x03!\xff\xec\x01,\x03#\xff\xec\x01,\x03%\xff\ +\xec\x01,\x03'\xff\xec\x01,\x03)\xff\xec\x01,\x03\ ++\xff\xec\x01,\x03-\xff\xec\x01,\x03/\xff\xec\x01\ +,\x031\xff\xec\x01,\x033\xff\xec\x01.\x00\x0f\xff\ +\xd7\x01.\x00\x11\xff\xd7\x01.\x00$\xff\xec\x01.\x00\ +\x82\xff\xec\x01.\x00\x83\xff\xec\x01.\x00\x84\xff\xec\x01\ +.\x00\x85\xff\xec\x01.\x00\x86\xff\xec\x01.\x00\x87\xff\ +\xec\x01.\x00\xc2\xff\xec\x01.\x00\xc4\xff\xec\x01.\x00\ +\xc6\xff\xec\x01.\x01C\xff\xec\x01.\x02\x08\xff\xd7\x01\ +.\x02\x0c\xff\xd7\x01.\x02X\xff\xec\x01.\x03\x1d\xff\ +\xec\x01.\x03\x1f\xff\xec\x01.\x03!\xff\xec\x01.\x03\ +#\xff\xec\x01.\x03%\xff\xec\x01.\x03'\xff\xec\x01\ +.\x03)\xff\xec\x01.\x03+\xff\xec\x01.\x03-\xff\ +\xec\x01.\x03/\xff\xec\x01.\x031\xff\xec\x01.\x03\ +3\xff\xec\x010\x00\x0f\xff\xd7\x010\x00\x11\xff\xd7\x01\ +0\x00$\xff\xec\x010\x00\x82\xff\xec\x010\x00\x83\xff\ +\xec\x010\x00\x84\xff\xec\x010\x00\x85\xff\xec\x010\x00\ +\x86\xff\xec\x010\x00\x87\xff\xec\x010\x00\xc2\xff\xec\x01\ +0\x00\xc4\xff\xec\x010\x00\xc6\xff\xec\x010\x01C\xff\ +\xec\x010\x02\x08\xff\xd7\x010\x02\x0c\xff\xd7\x010\x02\ +X\xff\xec\x010\x03\x1d\xff\xec\x010\x03\x1f\xff\xec\x01\ +0\x03!\xff\xec\x010\x03#\xff\xec\x010\x03%\xff\ +\xec\x010\x03'\xff\xec\x010\x03)\xff\xec\x010\x03\ ++\xff\xec\x010\x03-\xff\xec\x010\x03/\xff\xec\x01\ +0\x031\xff\xec\x010\x033\xff\xec\x012\x00\x0f\xff\ +\xd7\x012\x00\x11\xff\xd7\x012\x00$\xff\xec\x012\x00\ +\x82\xff\xec\x012\x00\x83\xff\xec\x012\x00\x84\xff\xec\x01\ +2\x00\x85\xff\xec\x012\x00\x86\xff\xec\x012\x00\x87\xff\ +\xec\x012\x00\xc2\xff\xec\x012\x00\xc4\xff\xec\x012\x00\ +\xc6\xff\xec\x012\x01C\xff\xec\x012\x02\x08\xff\xd7\x01\ +2\x02\x0c\xff\xd7\x012\x02X\xff\xec\x012\x03\x1d\xff\ +\xec\x012\x03\x1f\xff\xec\x012\x03!\xff\xec\x012\x03\ +#\xff\xec\x012\x03%\xff\xec\x012\x03'\xff\xec\x01\ +2\x03)\xff\xec\x012\x03+\xff\xec\x012\x03-\xff\ +\xec\x012\x03/\xff\xec\x012\x031\xff\xec\x012\x03\ +3\xff\xec\x014\x00\x0f\xff\xd7\x014\x00\x11\xff\xd7\x01\ +4\x00$\xff\xec\x014\x00\x82\xff\xec\x014\x00\x83\xff\ +\xec\x014\x00\x84\xff\xec\x014\x00\x85\xff\xec\x014\x00\ +\x86\xff\xec\x014\x00\x87\xff\xec\x014\x00\xc2\xff\xec\x01\ +4\x00\xc4\xff\xec\x014\x00\xc6\xff\xec\x014\x01C\xff\ +\xec\x014\x02\x08\xff\xd7\x014\x02\x0c\xff\xd7\x014\x02\ +X\xff\xec\x014\x03\x1d\xff\xec\x014\x03\x1f\xff\xec\x01\ +4\x03!\xff\xec\x014\x03#\xff\xec\x014\x03%\xff\ +\xec\x014\x03'\xff\xec\x014\x03)\xff\xec\x014\x03\ ++\xff\xec\x014\x03-\xff\xec\x014\x03/\xff\xec\x01\ +4\x031\xff\xec\x014\x033\xff\xec\x016\x00\x0f\xff\ +\x9a\x016\x00\x11\xff\x9a\x016\x00\x22\x00)\x016\x00\ +$\xff\xae\x016\x00&\xff\xec\x016\x00*\xff\xec\x01\ +6\x002\xff\xec\x016\x004\xff\xec\x016\x00D\xff\ +\xd7\x016\x00F\xff\xd7\x016\x00G\xff\xd7\x016\x00\ +H\xff\xd7\x016\x00J\xff\xec\x016\x00P\xff\xec\x01\ +6\x00Q\xff\xec\x016\x00R\xff\xd7\x016\x00S\xff\ +\xec\x016\x00T\xff\xd7\x016\x00U\xff\xec\x016\x00\ +V\xff\xec\x016\x00X\xff\xec\x016\x00\x82\xff\xae\x01\ +6\x00\x83\xff\xae\x016\x00\x84\xff\xae\x016\x00\x85\xff\ +\xae\x016\x00\x86\xff\xae\x016\x00\x87\xff\xae\x016\x00\ +\x89\xff\xec\x016\x00\x94\xff\xec\x016\x00\x95\xff\xec\x01\ +6\x00\x96\xff\xec\x016\x00\x97\xff\xec\x016\x00\x98\xff\ +\xec\x016\x00\x9a\xff\xec\x016\x00\xa2\xff\xd7\x016\x00\ +\xa3\xff\xd7\x016\x00\xa4\xff\xd7\x016\x00\xa5\xff\xd7\x01\ +6\x00\xa6\xff\xd7\x016\x00\xa7\xff\xd7\x016\x00\xa8\xff\ +\xd7\x016\x00\xa9\xff\xd7\x016\x00\xaa\xff\xd7\x016\x00\ +\xab\xff\xd7\x016\x00\xac\xff\xd7\x016\x00\xad\xff\xd7\x01\ +6\x00\xb4\xff\xd7\x016\x00\xb5\xff\xd7\x016\x00\xb6\xff\ +\xd7\x016\x00\xb7\xff\xd7\x016\x00\xb8\xff\xd7\x016\x00\ +\xba\xff\xd7\x016\x00\xbb\xff\xec\x016\x00\xbc\xff\xec\x01\ +6\x00\xbd\xff\xec\x016\x00\xbe\xff\xec\x016\x00\xc2\xff\ +\xae\x016\x00\xc3\xff\xd7\x016\x00\xc4\xff\xae\x016\x00\ +\xc5\xff\xd7\x016\x00\xc6\xff\xae\x016\x00\xc7\xff\xd7\x01\ +6\x00\xc8\xff\xec\x016\x00\xc9\xff\xd7\x016\x00\xca\xff\ +\xec\x016\x00\xcb\xff\xd7\x016\x00\xcc\xff\xec\x016\x00\ +\xcd\xff\xd7\x016\x00\xce\xff\xec\x016\x00\xcf\xff\xd7\x01\ +6\x00\xd1\xff\xd7\x016\x00\xd3\xff\xd7\x016\x00\xd5\xff\ +\xd7\x016\x00\xd7\xff\xd7\x016\x00\xd9\xff\xd7\x016\x00\ +\xdb\xff\xd7\x016\x00\xdd\xff\xd7\x016\x00\xde\xff\xec\x01\ +6\x00\xdf\xff\xec\x016\x00\xe0\xff\xec\x016\x00\xe1\xff\ +\xec\x016\x00\xe2\xff\xec\x016\x00\xe3\xff\xec\x016\x00\ +\xe4\xff\xec\x016\x00\xe5\xff\xec\x016\x00\xfa\xff\xec\x01\ +6\x01\x06\xff\xec\x016\x01\x08\xff\xec\x016\x01\x0d\xff\ +\xec\x016\x01\x0e\xff\xec\x016\x01\x0f\xff\xd7\x016\x01\ +\x10\xff\xec\x016\x01\x11\xff\xd7\x016\x01\x12\xff\xec\x01\ +6\x01\x13\xff\xd7\x016\x01\x14\xff\xec\x016\x01\x15\xff\ +\xd7\x016\x01\x17\xff\xec\x016\x01\x19\xff\xec\x016\x01\ +\x1d\xff\xec\x016\x01!\xff\xec\x016\x01+\xff\xec\x01\ +6\x01-\xff\xec\x016\x01/\xff\xec\x016\x011\xff\ +\xec\x016\x013\xff\xec\x016\x015\xff\xec\x016\x01\ +C\xff\xae\x016\x01D\xff\xd7\x016\x01F\xff\xd7\x01\ +6\x01G\xff\xec\x016\x01H\xff\xd7\x016\x01J\xff\ +\xec\x016\x02\x08\xff\x9a\x016\x02\x0c\xff\x9a\x016\x02\ +W\xff\xec\x016\x02X\xff\xae\x016\x02Y\xff\xd7\x01\ +6\x02_\xff\xec\x016\x02`\xff\xd7\x016\x02b\xff\ +\xec\x016\x03\x1d\xff\xae\x016\x03\x1e\xff\xd7\x016\x03\ +\x1f\xff\xae\x016\x03 \xff\xd7\x016\x03!\xff\xae\x01\ +6\x03\x22\xff\xd7\x016\x03#\xff\xae\x016\x03%\xff\ +\xae\x016\x03&\xff\xd7\x016\x03'\xff\xae\x016\x03\ +(\xff\xd7\x016\x03)\xff\xae\x016\x03*\xff\xd7\x01\ +6\x03+\xff\xae\x016\x03,\xff\xd7\x016\x03-\xff\ +\xae\x016\x03.\xff\xd7\x016\x03/\xff\xae\x016\x03\ +0\xff\xd7\x016\x031\xff\xae\x016\x032\xff\xd7\x01\ +6\x033\xff\xae\x016\x034\xff\xd7\x016\x036\xff\ +\xd7\x016\x038\xff\xd7\x016\x03:\xff\xd7\x016\x03\ +<\xff\xd7\x016\x03@\xff\xd7\x016\x03B\xff\xd7\x01\ +6\x03D\xff\xd7\x016\x03I\xff\xec\x016\x03J\xff\ +\xd7\x016\x03K\xff\xec\x016\x03L\xff\xd7\x016\x03\ +M\xff\xec\x016\x03N\xff\xd7\x016\x03O\xff\xec\x01\ +6\x03Q\xff\xec\x016\x03R\xff\xd7\x016\x03S\xff\ +\xec\x016\x03T\xff\xd7\x016\x03U\xff\xec\x016\x03\ +V\xff\xd7\x016\x03W\xff\xec\x016\x03X\xff\xd7\x01\ +6\x03Y\xff\xec\x016\x03Z\xff\xd7\x016\x03[\xff\ +\xec\x016\x03\x5c\xff\xd7\x016\x03]\xff\xec\x016\x03\ +^\xff\xd7\x016\x03_\xff\xec\x016\x03`\xff\xd7\x01\ +6\x03b\xff\xec\x016\x03d\xff\xec\x016\x03f\xff\ +\xec\x016\x03h\xff\xec\x016\x03j\xff\xec\x016\x03\ +l\xff\xec\x016\x03n\xff\xec\x017\x00\x05\x00R\x01\ +7\x00\x0a\x00R\x017\x00\x0f\xff\xae\x017\x00\x11\xff\ +\xae\x017\x00\x22\x00)\x017\x02\x07\x00R\x017\x02\ +\x08\xff\xae\x017\x02\x0b\x00R\x017\x02\x0c\xff\xae\x01\ +8\x00\x0f\xff\x85\x018\x00\x11\xff\x85\x018\x00\x22\x00\ +)\x018\x00$\xff\x85\x018\x00&\xff\xd7\x018\x00\ +*\xff\xd7\x018\x002\xff\xd7\x018\x004\xff\xd7\x01\ +8\x00D\xff\x9a\x018\x00F\xff\x9a\x018\x00G\xff\ +\x9a\x018\x00H\xff\x9a\x018\x00J\xff\xd7\x018\x00\ +P\xff\xc3\x018\x00Q\xff\xc3\x018\x00R\xff\x9a\x01\ +8\x00S\xff\xc3\x018\x00T\xff\x9a\x018\x00U\xff\ +\xc3\x018\x00V\xff\xae\x018\x00X\xff\xc3\x018\x00\ +]\xff\xd7\x018\x00\x82\xff\x85\x018\x00\x83\xff\x85\x01\ +8\x00\x84\xff\x85\x018\x00\x85\xff\x85\x018\x00\x86\xff\ +\x85\x018\x00\x87\xff\x85\x018\x00\x89\xff\xd7\x018\x00\ +\x94\xff\xd7\x018\x00\x95\xff\xd7\x018\x00\x96\xff\xd7\x01\ +8\x00\x97\xff\xd7\x018\x00\x98\xff\xd7\x018\x00\x9a\xff\ +\xd7\x018\x00\xa2\xff\x9a\x018\x00\xa3\xff\x9a\x018\x00\ +\xa4\xff\x9a\x018\x00\xa5\xff\x9a\x018\x00\xa6\xff\x9a\x01\ +8\x00\xa7\xff\x9a\x018\x00\xa8\xff\x9a\x018\x00\xa9\xff\ +\x9a\x018\x00\xaa\xff\x9a\x018\x00\xab\xff\x9a\x018\x00\ +\xac\xff\x9a\x018\x00\xad\xff\x9a\x018\x00\xb4\xff\x9a\x01\ +8\x00\xb5\xff\x9a\x018\x00\xb6\xff\x9a\x018\x00\xb7\xff\ +\x9a\x018\x00\xb8\xff\x9a\x018\x00\xba\xff\x9a\x018\x00\ +\xbb\xff\xc3\x018\x00\xbc\xff\xc3\x018\x00\xbd\xff\xc3\x01\ +8\x00\xbe\xff\xc3\x018\x00\xc2\xff\x85\x018\x00\xc3\xff\ +\x9a\x018\x00\xc4\xff\x85\x018\x00\xc5\xff\x9a\x018\x00\ +\xc6\xff\x85\x018\x00\xc7\xff\x9a\x018\x00\xc8\xff\xd7\x01\ +8\x00\xc9\xff\x9a\x018\x00\xca\xff\xd7\x018\x00\xcb\xff\ +\x9a\x018\x00\xcc\xff\xd7\x018\x00\xcd\xff\x9a\x018\x00\ +\xce\xff\xd7\x018\x00\xcf\xff\x9a\x018\x00\xd1\xff\x9a\x01\ +8\x00\xd3\xff\x9a\x018\x00\xd5\xff\x9a\x018\x00\xd7\xff\ +\x9a\x018\x00\xd9\xff\x9a\x018\x00\xdb\xff\x9a\x018\x00\ +\xdd\xff\x9a\x018\x00\xde\xff\xd7\x018\x00\xdf\xff\xd7\x01\ +8\x00\xe0\xff\xd7\x018\x00\xe1\xff\xd7\x018\x00\xe2\xff\ +\xd7\x018\x00\xe3\xff\xd7\x018\x00\xe4\xff\xd7\x018\x00\ +\xe5\xff\xd7\x018\x00\xfa\xff\xc3\x018\x01\x06\xff\xc3\x01\ +8\x01\x08\xff\xc3\x018\x01\x0d\xff\xc3\x018\x01\x0e\xff\ +\xd7\x018\x01\x0f\xff\x9a\x018\x01\x10\xff\xd7\x018\x01\ +\x11\xff\x9a\x018\x01\x12\xff\xd7\x018\x01\x13\xff\x9a\x01\ +8\x01\x14\xff\xd7\x018\x01\x15\xff\x9a\x018\x01\x17\xff\ +\xc3\x018\x01\x19\xff\xc3\x018\x01\x1d\xff\xae\x018\x01\ +!\xff\xae\x018\x01+\xff\xc3\x018\x01-\xff\xc3\x01\ +8\x01/\xff\xc3\x018\x011\xff\xc3\x018\x013\xff\ +\xc3\x018\x015\xff\xc3\x018\x01<\xff\xd7\x018\x01\ +>\xff\xd7\x018\x01@\xff\xd7\x018\x01C\xff\x85\x01\ +8\x01D\xff\x9a\x018\x01F\xff\x9a\x018\x01G\xff\ +\xd7\x018\x01H\xff\x9a\x018\x01J\xff\xae\x018\x02\ +\x08\xff\x85\x018\x02\x0c\xff\x85\x018\x02W\xff\xc3\x01\ +8\x02X\xff\x85\x018\x02Y\xff\x9a\x018\x02_\xff\ +\xd7\x018\x02`\xff\x9a\x018\x02b\xff\xc3\x018\x03\ +\x1d\xff\x85\x018\x03\x1e\xff\x9a\x018\x03\x1f\xff\x85\x01\ +8\x03 \xff\x9a\x018\x03!\xff\x85\x018\x03\x22\xff\ +\x9a\x018\x03#\xff\x85\x018\x03%\xff\x85\x018\x03\ +&\xff\x9a\x018\x03'\xff\x85\x018\x03(\xff\x9a\x01\ +8\x03)\xff\x85\x018\x03*\xff\x9a\x018\x03+\xff\ +\x85\x018\x03,\xff\x9a\x018\x03-\xff\x85\x018\x03\ +.\xff\x9a\x018\x03/\xff\x85\x018\x030\xff\x9a\x01\ +8\x031\xff\x85\x018\x032\xff\x9a\x018\x033\xff\ +\x85\x018\x034\xff\x9a\x018\x036\xff\x9a\x018\x03\ +8\xff\x9a\x018\x03:\xff\x9a\x018\x03<\xff\x9a\x01\ +8\x03@\xff\x9a\x018\x03B\xff\x9a\x018\x03D\xff\ +\x9a\x018\x03I\xff\xd7\x018\x03J\xff\x9a\x018\x03\ +K\xff\xd7\x018\x03L\xff\x9a\x018\x03M\xff\xd7\x01\ +8\x03N\xff\x9a\x018\x03O\xff\xd7\x018\x03Q\xff\ +\xd7\x018\x03R\xff\x9a\x018\x03S\xff\xd7\x018\x03\ +T\xff\x9a\x018\x03U\xff\xd7\x018\x03V\xff\x9a\x01\ +8\x03W\xff\xd7\x018\x03X\xff\x9a\x018\x03Y\xff\ +\xd7\x018\x03Z\xff\x9a\x018\x03[\xff\xd7\x018\x03\ +\x5c\xff\x9a\x018\x03]\xff\xd7\x018\x03^\xff\x9a\x01\ +8\x03_\xff\xd7\x018\x03`\xff\x9a\x018\x03b\xff\ +\xc3\x018\x03d\xff\xc3\x018\x03f\xff\xc3\x018\x03\ +h\xff\xc3\x018\x03j\xff\xc3\x018\x03l\xff\xc3\x01\ +8\x03n\xff\xc3\x019\x00\x05\x00R\x019\x00\x0a\x00\ +R\x019\x00\x0f\xff\xae\x019\x00\x11\xff\xae\x019\x00\ +\x22\x00)\x019\x02\x07\x00R\x019\x02\x08\xff\xae\x01\ +9\x02\x0b\x00R\x019\x02\x0c\xff\xae\x01:\x00\x0f\xff\ +\x85\x01:\x00\x11\xff\x85\x01:\x00\x22\x00)\x01:\x00\ +$\xff\x85\x01:\x00&\xff\xd7\x01:\x00*\xff\xd7\x01\ +:\x002\xff\xd7\x01:\x004\xff\xd7\x01:\x00D\xff\ +\x9a\x01:\x00F\xff\x9a\x01:\x00G\xff\x9a\x01:\x00\ +H\xff\x9a\x01:\x00J\xff\xd7\x01:\x00P\xff\xc3\x01\ +:\x00Q\xff\xc3\x01:\x00R\xff\x9a\x01:\x00S\xff\ +\xc3\x01:\x00T\xff\x9a\x01:\x00U\xff\xc3\x01:\x00\ +V\xff\xae\x01:\x00X\xff\xc3\x01:\x00]\xff\xd7\x01\ +:\x00\x82\xff\x85\x01:\x00\x83\xff\x85\x01:\x00\x84\xff\ +\x85\x01:\x00\x85\xff\x85\x01:\x00\x86\xff\x85\x01:\x00\ +\x87\xff\x85\x01:\x00\x89\xff\xd7\x01:\x00\x94\xff\xd7\x01\ +:\x00\x95\xff\xd7\x01:\x00\x96\xff\xd7\x01:\x00\x97\xff\ +\xd7\x01:\x00\x98\xff\xd7\x01:\x00\x9a\xff\xd7\x01:\x00\ +\xa2\xff\x9a\x01:\x00\xa3\xff\x9a\x01:\x00\xa4\xff\x9a\x01\ +:\x00\xa5\xff\x9a\x01:\x00\xa6\xff\x9a\x01:\x00\xa7\xff\ +\x9a\x01:\x00\xa8\xff\x9a\x01:\x00\xa9\xff\x9a\x01:\x00\ +\xaa\xff\x9a\x01:\x00\xab\xff\x9a\x01:\x00\xac\xff\x9a\x01\ +:\x00\xad\xff\x9a\x01:\x00\xb4\xff\x9a\x01:\x00\xb5\xff\ +\x9a\x01:\x00\xb6\xff\x9a\x01:\x00\xb7\xff\x9a\x01:\x00\ +\xb8\xff\x9a\x01:\x00\xba\xff\x9a\x01:\x00\xbb\xff\xc3\x01\ +:\x00\xbc\xff\xc3\x01:\x00\xbd\xff\xc3\x01:\x00\xbe\xff\ +\xc3\x01:\x00\xc2\xff\x85\x01:\x00\xc3\xff\x9a\x01:\x00\ +\xc4\xff\x85\x01:\x00\xc5\xff\x9a\x01:\x00\xc6\xff\x85\x01\ +:\x00\xc7\xff\x9a\x01:\x00\xc8\xff\xd7\x01:\x00\xc9\xff\ +\x9a\x01:\x00\xca\xff\xd7\x01:\x00\xcb\xff\x9a\x01:\x00\ +\xcc\xff\xd7\x01:\x00\xcd\xff\x9a\x01:\x00\xce\xff\xd7\x01\ +:\x00\xcf\xff\x9a\x01:\x00\xd1\xff\x9a\x01:\x00\xd3\xff\ +\x9a\x01:\x00\xd5\xff\x9a\x01:\x00\xd7\xff\x9a\x01:\x00\ +\xd9\xff\x9a\x01:\x00\xdb\xff\x9a\x01:\x00\xdd\xff\x9a\x01\ +:\x00\xde\xff\xd7\x01:\x00\xdf\xff\xd7\x01:\x00\xe0\xff\ +\xd7\x01:\x00\xe1\xff\xd7\x01:\x00\xe2\xff\xd7\x01:\x00\ +\xe3\xff\xd7\x01:\x00\xe4\xff\xd7\x01:\x00\xe5\xff\xd7\x01\ +:\x00\xfa\xff\xc3\x01:\x01\x06\xff\xc3\x01:\x01\x08\xff\ +\xc3\x01:\x01\x0d\xff\xc3\x01:\x01\x0e\xff\xd7\x01:\x01\ +\x0f\xff\x9a\x01:\x01\x10\xff\xd7\x01:\x01\x11\xff\x9a\x01\ +:\x01\x12\xff\xd7\x01:\x01\x13\xff\x9a\x01:\x01\x14\xff\ +\xd7\x01:\x01\x15\xff\x9a\x01:\x01\x17\xff\xc3\x01:\x01\ +\x19\xff\xc3\x01:\x01\x1d\xff\xae\x01:\x01!\xff\xae\x01\ +:\x01+\xff\xc3\x01:\x01-\xff\xc3\x01:\x01/\xff\ +\xc3\x01:\x011\xff\xc3\x01:\x013\xff\xc3\x01:\x01\ +5\xff\xc3\x01:\x01<\xff\xd7\x01:\x01>\xff\xd7\x01\ +:\x01@\xff\xd7\x01:\x01C\xff\x85\x01:\x01D\xff\ +\x9a\x01:\x01F\xff\x9a\x01:\x01G\xff\xd7\x01:\x01\ +H\xff\x9a\x01:\x01J\xff\xae\x01:\x02\x08\xff\x85\x01\ +:\x02\x0c\xff\x85\x01:\x02W\xff\xc3\x01:\x02X\xff\ +\x85\x01:\x02Y\xff\x9a\x01:\x02_\xff\xd7\x01:\x02\ +`\xff\x9a\x01:\x02b\xff\xc3\x01:\x03\x1d\xff\x85\x01\ +:\x03\x1e\xff\x9a\x01:\x03\x1f\xff\x85\x01:\x03 \xff\ +\x9a\x01:\x03!\xff\x85\x01:\x03\x22\xff\x9a\x01:\x03\ +#\xff\x85\x01:\x03%\xff\x85\x01:\x03&\xff\x9a\x01\ +:\x03'\xff\x85\x01:\x03(\xff\x9a\x01:\x03)\xff\ +\x85\x01:\x03*\xff\x9a\x01:\x03+\xff\x85\x01:\x03\ +,\xff\x9a\x01:\x03-\xff\x85\x01:\x03.\xff\x9a\x01\ +:\x03/\xff\x85\x01:\x030\xff\x9a\x01:\x031\xff\ +\x85\x01:\x032\xff\x9a\x01:\x033\xff\x85\x01:\x03\ +4\xff\x9a\x01:\x036\xff\x9a\x01:\x038\xff\x9a\x01\ +:\x03:\xff\x9a\x01:\x03<\xff\x9a\x01:\x03@\xff\ +\x9a\x01:\x03B\xff\x9a\x01:\x03D\xff\x9a\x01:\x03\ +I\xff\xd7\x01:\x03J\xff\x9a\x01:\x03K\xff\xd7\x01\ +:\x03L\xff\x9a\x01:\x03M\xff\xd7\x01:\x03N\xff\ +\x9a\x01:\x03O\xff\xd7\x01:\x03Q\xff\xd7\x01:\x03\ +R\xff\x9a\x01:\x03S\xff\xd7\x01:\x03T\xff\x9a\x01\ +:\x03U\xff\xd7\x01:\x03V\xff\x9a\x01:\x03W\xff\ +\xd7\x01:\x03X\xff\x9a\x01:\x03Y\xff\xd7\x01:\x03\ +Z\xff\x9a\x01:\x03[\xff\xd7\x01:\x03\x5c\xff\x9a\x01\ +:\x03]\xff\xd7\x01:\x03^\xff\x9a\x01:\x03_\xff\ +\xd7\x01:\x03`\xff\x9a\x01:\x03b\xff\xc3\x01:\x03\ +d\xff\xc3\x01:\x03f\xff\xc3\x01:\x03h\xff\xc3\x01\ +:\x03j\xff\xc3\x01:\x03l\xff\xc3\x01:\x03n\xff\ +\xc3\x01;\x00&\xff\xec\x01;\x00*\xff\xec\x01;\x00\ +2\xff\xec\x01;\x004\xff\xec\x01;\x00\x89\xff\xec\x01\ +;\x00\x94\xff\xec\x01;\x00\x95\xff\xec\x01;\x00\x96\xff\ +\xec\x01;\x00\x97\xff\xec\x01;\x00\x98\xff\xec\x01;\x00\ +\x9a\xff\xec\x01;\x00\xc8\xff\xec\x01;\x00\xca\xff\xec\x01\ +;\x00\xcc\xff\xec\x01;\x00\xce\xff\xec\x01;\x00\xde\xff\ +\xec\x01;\x00\xe0\xff\xec\x01;\x00\xe2\xff\xec\x01;\x00\ +\xe4\xff\xec\x01;\x01\x0e\xff\xec\x01;\x01\x10\xff\xec\x01\ +;\x01\x12\xff\xec\x01;\x01\x14\xff\xec\x01;\x01G\xff\ +\xec\x01;\x02_\xff\xec\x01;\x03I\xff\xec\x01;\x03\ +K\xff\xec\x01;\x03M\xff\xec\x01;\x03O\xff\xec\x01\ +;\x03Q\xff\xec\x01;\x03S\xff\xec\x01;\x03U\xff\ +\xec\x01;\x03W\xff\xec\x01;\x03Y\xff\xec\x01;\x03\ +[\xff\xec\x01;\x03]\xff\xec\x01;\x03_\xff\xec\x01\ +=\x00&\xff\xec\x01=\x00*\xff\xec\x01=\x002\xff\ +\xec\x01=\x004\xff\xec\x01=\x00\x89\xff\xec\x01=\x00\ +\x94\xff\xec\x01=\x00\x95\xff\xec\x01=\x00\x96\xff\xec\x01\ +=\x00\x97\xff\xec\x01=\x00\x98\xff\xec\x01=\x00\x9a\xff\ +\xec\x01=\x00\xc8\xff\xec\x01=\x00\xca\xff\xec\x01=\x00\ +\xcc\xff\xec\x01=\x00\xce\xff\xec\x01=\x00\xde\xff\xec\x01\ +=\x00\xe0\xff\xec\x01=\x00\xe2\xff\xec\x01=\x00\xe4\xff\ +\xec\x01=\x01\x0e\xff\xec\x01=\x01\x10\xff\xec\x01=\x01\ +\x12\xff\xec\x01=\x01\x14\xff\xec\x01=\x01G\xff\xec\x01\ +=\x02_\xff\xec\x01=\x03I\xff\xec\x01=\x03K\xff\ +\xec\x01=\x03M\xff\xec\x01=\x03O\xff\xec\x01=\x03\ +Q\xff\xec\x01=\x03S\xff\xec\x01=\x03U\xff\xec\x01\ +=\x03W\xff\xec\x01=\x03Y\xff\xec\x01=\x03[\xff\ +\xec\x01=\x03]\xff\xec\x01=\x03_\xff\xec\x01?\x00\ +&\xff\xec\x01?\x00*\xff\xec\x01?\x002\xff\xec\x01\ +?\x004\xff\xec\x01?\x00\x89\xff\xec\x01?\x00\x94\xff\ +\xec\x01?\x00\x95\xff\xec\x01?\x00\x96\xff\xec\x01?\x00\ +\x97\xff\xec\x01?\x00\x98\xff\xec\x01?\x00\x9a\xff\xec\x01\ +?\x00\xc8\xff\xec\x01?\x00\xca\xff\xec\x01?\x00\xcc\xff\ +\xec\x01?\x00\xce\xff\xec\x01?\x00\xde\xff\xec\x01?\x00\ +\xe0\xff\xec\x01?\x00\xe2\xff\xec\x01?\x00\xe4\xff\xec\x01\ +?\x01\x0e\xff\xec\x01?\x01\x10\xff\xec\x01?\x01\x12\xff\ +\xec\x01?\x01\x14\xff\xec\x01?\x01G\xff\xec\x01?\x02\ +_\xff\xec\x01?\x03I\xff\xec\x01?\x03K\xff\xec\x01\ +?\x03M\xff\xec\x01?\x03O\xff\xec\x01?\x03Q\xff\ +\xec\x01?\x03S\xff\xec\x01?\x03U\xff\xec\x01?\x03\ +W\xff\xec\x01?\x03Y\xff\xec\x01?\x03[\xff\xec\x01\ +?\x03]\xff\xec\x01?\x03_\xff\xec\x01C\x00\x05\xff\ +q\x01C\x00\x0a\xffq\x01C\x00&\xff\xd7\x01C\x00\ +*\xff\xd7\x01C\x00-\x01\x0a\x01C\x002\xff\xd7\x01\ +C\x004\xff\xd7\x01C\x007\xffq\x01C\x009\xff\ +\xae\x01C\x00:\xff\xae\x01C\x00<\xff\x85\x01C\x00\ +\x89\xff\xd7\x01C\x00\x94\xff\xd7\x01C\x00\x95\xff\xd7\x01\ +C\x00\x96\xff\xd7\x01C\x00\x97\xff\xd7\x01C\x00\x98\xff\ +\xd7\x01C\x00\x9a\xff\xd7\x01C\x00\x9f\xff\x85\x01C\x00\ +\xc8\xff\xd7\x01C\x00\xca\xff\xd7\x01C\x00\xcc\xff\xd7\x01\ +C\x00\xce\xff\xd7\x01C\x00\xde\xff\xd7\x01C\x00\xe0\xff\ +\xd7\x01C\x00\xe2\xff\xd7\x01C\x00\xe4\xff\xd7\x01C\x01\ +\x0e\xff\xd7\x01C\x01\x10\xff\xd7\x01C\x01\x12\xff\xd7\x01\ +C\x01\x14\xff\xd7\x01C\x01$\xffq\x01C\x01&\xff\ +q\x01C\x016\xff\xae\x01C\x018\xff\x85\x01C\x01\ +:\xff\x85\x01C\x01G\xff\xd7\x01C\x01\xfa\xff\xae\x01\ +C\x01\xfc\xff\xae\x01C\x01\xfe\xff\xae\x01C\x02\x00\xff\ +\x85\x01C\x02\x07\xffq\x01C\x02\x0b\xffq\x01C\x02\ +_\xff\xd7\x01C\x03I\xff\xd7\x01C\x03K\xff\xd7\x01\ +C\x03M\xff\xd7\x01C\x03O\xff\xd7\x01C\x03Q\xff\ +\xd7\x01C\x03S\xff\xd7\x01C\x03U\xff\xd7\x01C\x03\ +W\xff\xd7\x01C\x03Y\xff\xd7\x01C\x03[\xff\xd7\x01\ +C\x03]\xff\xd7\x01C\x03_\xff\xd7\x01C\x03o\xff\ +\x85\x01C\x03q\xff\x85\x01C\x03s\xff\x85\x01C\x03\ +\x8f\xffq\x01D\x00\x05\xff\xec\x01D\x00\x0a\xff\xec\x01\ +D\x02\x07\xff\xec\x01D\x02\x0b\xff\xec\x01E\x00-\x00\ +{\x01G\x00\x0f\xff\xae\x01G\x00\x11\xff\xae\x01G\x00\ +$\xff\xd7\x01G\x007\xff\xc3\x01G\x009\xff\xec\x01\ +G\x00:\xff\xec\x01G\x00;\xff\xd7\x01G\x00<\xff\ +\xec\x01G\x00=\xff\xec\x01G\x00\x82\xff\xd7\x01G\x00\ +\x83\xff\xd7\x01G\x00\x84\xff\xd7\x01G\x00\x85\xff\xd7\x01\ +G\x00\x86\xff\xd7\x01G\x00\x87\xff\xd7\x01G\x00\x9f\xff\ +\xec\x01G\x00\xc2\xff\xd7\x01G\x00\xc4\xff\xd7\x01G\x00\ +\xc6\xff\xd7\x01G\x01$\xff\xc3\x01G\x01&\xff\xc3\x01\ +G\x016\xff\xec\x01G\x018\xff\xec\x01G\x01:\xff\ +\xec\x01G\x01;\xff\xec\x01G\x01=\xff\xec\x01G\x01\ +?\xff\xec\x01G\x01C\xff\xd7\x01G\x01\xa0\xff\xec\x01\ +G\x01\xfa\xff\xec\x01G\x01\xfc\xff\xec\x01G\x01\xfe\xff\ +\xec\x01G\x02\x00\xff\xec\x01G\x02\x08\xff\xae\x01G\x02\ +\x0c\xff\xae\x01G\x02X\xff\xd7\x01G\x03\x1d\xff\xd7\x01\ +G\x03\x1f\xff\xd7\x01G\x03!\xff\xd7\x01G\x03#\xff\ +\xd7\x01G\x03%\xff\xd7\x01G\x03'\xff\xd7\x01G\x03\ +)\xff\xd7\x01G\x03+\xff\xd7\x01G\x03-\xff\xd7\x01\ +G\x03/\xff\xd7\x01G\x031\xff\xd7\x01G\x033\xff\ +\xd7\x01G\x03o\xff\xec\x01G\x03q\xff\xec\x01G\x03\ +s\xff\xec\x01G\x03\x8f\xff\xc3\x01V\x00\x05\xffq\x01\ +V\x00\x0a\xffq\x01V\x01f\xff\xd7\x01V\x01m\xff\ +\xd7\x01V\x01q\xffq\x01V\x01r\xff\x85\x01V\x01\ +s\xff\xd7\x01V\x01u\xff\xae\x01V\x01x\xff\x85\x01\ +V\x02\x07\xffq\x01V\x02\x0b\xffq\x01V\x02T\xff\ +\x85\x01[\x00\x0f\xff\xae\x01[\x00\x11\xff\xae\x01[\x01\ +V\xff\xd7\x01[\x01_\xff\xd7\x01[\x01b\xff\xd7\x01\ +[\x01d\xff\xec\x01[\x01i\xff\xd7\x01[\x01p\xff\ +\xec\x01[\x01q\xff\xc3\x01[\x01r\xff\xec\x01[\x01\ +t\xff\xd7\x01[\x01u\xff\xec\x01[\x01x\xff\xec\x01\ +[\x01\x88\xff\xec\x01[\x02\x08\xff\xae\x01[\x02\x0c\xff\ +\xae\x01[\x02T\xff\xec\x01\x5c\x00\x0f\xff\x85\x01\x5c\x00\ +\x11\xff\x85\x01\x5c\x01V\xff\x85\x01\x5c\x01_\xff\x85\x01\ +\x5c\x01b\xff\x85\x01\x5c\x01f\xff\xd7\x01\x5c\x01i\xff\ +\x85\x01\x5c\x01m\xff\xd7\x01\x5c\x01s\xff\xc3\x01\x5c\x01\ +v\xff\xec\x01\x5c\x01y\xff\x9a\x01\x5c\x01z\xff\xae\x01\ +\x5c\x01{\xff\xc3\x01\x5c\x01|\xff\xc3\x01\x5c\x01}\xff\ +\xc3\x01\x5c\x01~\xff\x9a\x01\x5c\x01\x81\xff\xc3\x01\x5c\x01\ +\x82\xff\xae\x01\x5c\x01\x84\xff\xc3\x01\x5c\x01\x86\xff\xc3\x01\ +\x5c\x01\x87\xff\xc3\x01\x5c\x01\x89\xff\xc3\x01\x5c\x01\x8c\xff\ +\x9a\x01\x5c\x01\x8e\xff\x9a\x01\x5c\x01\x8f\xff\x9a\x01\x5c\x01\ +\x90\xff\x9a\x01\x5c\x01\x92\xff\xc3\x01\x5c\x01\x93\xff\x9a\x01\ +\x5c\x01\x95\xff\xc3\x01\x5c\x01\x96\xff\xc3\x01\x5c\x01\x98\xff\ +\xc3\x01\x5c\x01\x99\xff\x9a\x01\x5c\x01\x9a\xff\xc3\x01\x5c\x01\ +\x9b\xff\xc3\x01\x5c\x02\x08\xff\x85\x01\x5c\x02\x0c\xff\x85\x01\ +\x5c\x02!\xff\xec\x01]\x01q\xff\xd7\x01]\x01r\xff\ +\xec\x01]\x01x\xff\xec\x01]\x02T\xff\xec\x01^\x00\ +\x05\xff\xd7\x01^\x00\x0a\xff\xd7\x01^\x02\x07\xff\xd7\x01\ +^\x02\x0b\xff\xd7\x01_\x00\x05\xffq\x01_\x00\x0a\xff\ +q\x01_\x01f\xff\xd7\x01_\x01m\xff\xd7\x01_\x01\ +q\xffq\x01_\x01r\xff\x85\x01_\x01s\xff\xd7\x01\ +_\x01u\xff\xae\x01_\x01x\xff\x85\x01_\x02\x07\xff\ +q\x01_\x02\x0b\xffq\x01_\x02T\xff\x85\x01`\x00\ +\x0f\xff\xae\x01`\x00\x11\xff\xae\x01`\x01V\xff\xd7\x01\ +`\x01_\xff\xd7\x01`\x01b\xff\xd7\x01`\x01i\xff\ +\xd7\x01`\x01t\xff\xd7\x01`\x02\x08\xff\xae\x01`\x02\ +\x0c\xff\xae\x01a\x00\x0f\xff\x85\x01a\x00\x10\xff\xae\x01\ +a\x00\x11\xff\x85\x01a\x01V\xff\x5c\x01a\x01_\xff\ +\x5c\x01a\x01b\xff\x5c\x01a\x01f\xff\xc3\x01a\x01\ +i\xff\x5c\x01a\x01m\xff\xc3\x01a\x01s\xff\x9a\x01\ +a\x01v\xff\xc3\x01a\x01y\xffq\x01a\x01z\xff\ +\x9a\x01a\x01{\xff\x9a\x01a\x01|\xff\xae\x01a\x01\ +}\xff\x9a\x01a\x01~\xffq\x01a\x01\x80\xff\xd7\x01\ +a\x01\x81\xff\xc3\x01a\x01\x82\xff\x9a\x01a\x01\x84\xff\ +\x9a\x01a\x01\x86\xff\xae\x01a\x01\x87\xff\x9a\x01a\x01\ +\x89\xff\x9a\x01a\x01\x8a\xff\xd7\x01a\x01\x8c\xffq\x01\ +a\x01\x8e\xff\x9a\x01a\x01\x8f\xffq\x01a\x01\x90\xff\ +q\x01a\x01\x92\xff\x9a\x01a\x01\x93\xffq\x01a\x01\ +\x94\xff\xd7\x01a\x01\x95\xff\x9a\x01a\x01\x96\xff\x9a\x01\ +a\x01\x98\xff\x9a\x01a\x01\x99\xffq\x01a\x01\x9a\xff\ +\x9a\x01a\x01\x9b\xff\x9a\x01a\x02\x02\xff\xae\x01a\x02\ +\x03\xff\xae\x01a\x02\x04\xff\xae\x01a\x02\x08\xff\x85\x01\ +a\x02\x0c\xff\x85\x01a\x02!\xff\xc3\x01a\x02S\xff\ +\xd7\x01b\x00\x05\xffq\x01b\x00\x0a\xffq\x01b\x01\ +f\xff\xd7\x01b\x01m\xff\xd7\x01b\x01q\xffq\x01\ +b\x01r\xff\x85\x01b\x01s\xff\xd7\x01b\x01u\xff\ +\xae\x01b\x01x\xff\x85\x01b\x02\x07\xffq\x01b\x02\ +\x0b\xffq\x01b\x02T\xff\x85\x01d\x01f\xff\xec\x01\ +d\x01m\xff\xec\x01d\x01s\xff\xc3\x01f\x00\x0f\xff\ +\xae\x01f\x00\x11\xff\xae\x01f\x01V\xff\xd7\x01f\x01\ +_\xff\xd7\x01f\x01b\xff\xd7\x01f\x01d\xff\xec\x01\ +f\x01i\xff\xd7\x01f\x01p\xff\xec\x01f\x01q\xff\ +\xc3\x01f\x01r\xff\xec\x01f\x01t\xff\xd7\x01f\x01\ +u\xff\xec\x01f\x01x\xff\xec\x01f\x01\x88\xff\xec\x01\ +f\x02\x08\xff\xae\x01f\x02\x0c\xff\xae\x01f\x02T\xff\ +\xec\x01h\x01f\xff\xd7\x01h\x01m\xff\xd7\x01h\x01\ +s\xff\xc3\x01h\x01\x8d\xff\xec\x01h\x01\x91\xff\xec\x01\ +i\x00\x05\xffq\x01i\x00\x0a\xffq\x01i\x01f\xff\ +\xd7\x01i\x01m\xff\xd7\x01i\x01q\xffq\x01i\x01\ +r\xff\x85\x01i\x01s\xff\xd7\x01i\x01u\xff\xae\x01\ +i\x01x\xff\x85\x01i\x02\x07\xffq\x01i\x02\x0b\xff\ +q\x01i\x02T\xff\x85\x01m\x00\x0f\xff\xae\x01m\x00\ +\x11\xff\xae\x01m\x01V\xff\xd7\x01m\x01_\xff\xd7\x01\ +m\x01b\xff\xd7\x01m\x01d\xff\xec\x01m\x01i\xff\ +\xd7\x01m\x01p\xff\xec\x01m\x01q\xff\xc3\x01m\x01\ +r\xff\xec\x01m\x01t\xff\xd7\x01m\x01u\xff\xec\x01\ +m\x01x\xff\xec\x01m\x01\x88\xff\xec\x01m\x02\x08\xff\ +\xae\x01m\x02\x0c\xff\xae\x01m\x02T\xff\xec\x01o\x00\ +\x0f\xfe\xf6\x01o\x00\x11\xfe\xf6\x01o\x01V\xff\x9a\x01\ +o\x01_\xff\x9a\x01o\x01b\xff\x9a\x01o\x01d\xff\ +\xec\x01o\x01i\xff\x9a\x01o\x01t\xff\xd7\x01o\x01\ +\x88\xff\xd7\x01o\x02\x08\xfe\xf6\x01o\x02\x0c\xfe\xf6\x01\ +q\x00\x0f\xff\x85\x01q\x00\x10\xff\xae\x01q\x00\x11\xff\ +\x85\x01q\x01V\xff\x5c\x01q\x01_\xff\x5c\x01q\x01\ +b\xff\x5c\x01q\x01f\xff\xc3\x01q\x01i\xff\x5c\x01\ +q\x01m\xff\xc3\x01q\x01s\xff\x9a\x01q\x01v\xff\ +\xc3\x01q\x01y\xffq\x01q\x01z\xff\x9a\x01q\x01\ +{\xff\x9a\x01q\x01|\xff\xae\x01q\x01}\xff\x9a\x01\ +q\x01~\xffq\x01q\x01\x80\xff\xd7\x01q\x01\x81\xff\ +\xc3\x01q\x01\x82\xff\x9a\x01q\x01\x84\xff\x9a\x01q\x01\ +\x86\xff\xae\x01q\x01\x87\xff\x9a\x01q\x01\x89\xff\x9a\x01\ +q\x01\x8a\xff\xd7\x01q\x01\x8c\xffq\x01q\x01\x8e\xff\ +\x9a\x01q\x01\x8f\xffq\x01q\x01\x90\xffq\x01q\x01\ +\x92\xff\x9a\x01q\x01\x93\xffq\x01q\x01\x94\xff\xd7\x01\ +q\x01\x95\xff\x9a\x01q\x01\x96\xff\x9a\x01q\x01\x98\xff\ +\x9a\x01q\x01\x99\xffq\x01q\x01\x9a\xff\x9a\x01q\x01\ +\x9b\xff\x9a\x01q\x02\x02\xff\xae\x01q\x02\x03\xff\xae\x01\ +q\x02\x04\xff\xae\x01q\x02\x08\xff\x85\x01q\x02\x0c\xff\ +\x85\x01q\x02!\xff\xc3\x01q\x02S\xff\xd7\x01r\x00\ +\x0f\xff\x85\x01r\x00\x11\xff\x85\x01r\x01V\xff\x85\x01\ +r\x01_\xff\x85\x01r\x01b\xff\x85\x01r\x01f\xff\ +\xd7\x01r\x01i\xff\x85\x01r\x01m\xff\xd7\x01r\x01\ +s\xff\xc3\x01r\x01v\xff\xec\x01r\x01y\xff\x9a\x01\ +r\x01z\xff\xae\x01r\x01{\xff\xc3\x01r\x01|\xff\ +\xc3\x01r\x01}\xff\xc3\x01r\x01~\xff\x9a\x01r\x01\ +\x81\xff\xc3\x01r\x01\x82\xff\xae\x01r\x01\x84\xff\xc3\x01\ +r\x01\x86\xff\xc3\x01r\x01\x87\xff\xc3\x01r\x01\x89\xff\ +\xc3\x01r\x01\x8c\xff\x9a\x01r\x01\x8e\xff\x9a\x01r\x01\ +\x8f\xff\x9a\x01r\x01\x90\xff\x9a\x01r\x01\x92\xff\xc3\x01\ +r\x01\x93\xff\x9a\x01r\x01\x95\xff\xc3\x01r\x01\x96\xff\ +\xc3\x01r\x01\x98\xff\xc3\x01r\x01\x99\xff\x9a\x01r\x01\ +\x9a\xff\xc3\x01r\x01\x9b\xff\xc3\x01r\x02\x08\xff\x85\x01\ +r\x02\x0c\xff\x85\x01r\x02!\xff\xec\x01s\x00\x0f\xff\ +\x9a\x01s\x00\x11\xff\x9a\x01s\x01V\xff\xd7\x01s\x01\ +_\xff\xd7\x01s\x01b\xff\xd7\x01s\x01d\xff\xc3\x01\ +s\x01i\xff\xd7\x01s\x01p\xff\xec\x01s\x01q\xff\ +\xae\x01s\x01r\xff\xc3\x01s\x01t\xff\xec\x01s\x01\ +x\xff\xc3\x01s\x01\x88\xff\xec\x01s\x02\x08\xff\x9a\x01\ +s\x02\x0c\xff\x9a\x01s\x02T\xff\xc3\x01t\x01f\xff\ +\xd7\x01t\x01m\xff\xd7\x01t\x01s\xff\xc3\x01t\x01\ +\x8d\xff\xec\x01t\x01\x91\xff\xec\x01u\x00\x0f\xff\x85\x01\ +u\x00\x11\xff\x85\x01u\x01V\xff\xae\x01u\x01_\xff\ +\xae\x01u\x01b\xff\xae\x01u\x01f\xff\xec\x01u\x01\ +i\xff\xae\x01u\x01m\xff\xec\x01u\x02\x08\xff\x85\x01\ +u\x02\x0c\xff\x85\x01v\x01q\xff\xd7\x01v\x01r\xff\ +\xec\x01v\x01x\xff\xec\x01v\x02T\xff\xec\x01x\x00\ +\x0f\xff\x85\x01x\x00\x11\xff\x85\x01x\x01V\xff\x85\x01\ +x\x01_\xff\x85\x01x\x01b\xff\x85\x01x\x01f\xff\ +\xd7\x01x\x01i\xff\x85\x01x\x01m\xff\xd7\x01x\x01\ +s\xff\xc3\x01x\x01v\xff\xec\x01x\x01y\xff\x9a\x01\ +x\x01z\xff\xae\x01x\x01{\xff\xc3\x01x\x01|\xff\ +\xc3\x01x\x01}\xff\xc3\x01x\x01~\xff\x9a\x01x\x01\ +\x81\xff\xc3\x01x\x01\x82\xff\xae\x01x\x01\x84\xff\xc3\x01\ +x\x01\x86\xff\xc3\x01x\x01\x87\xff\xc3\x01x\x01\x89\xff\ +\xc3\x01x\x01\x8c\xff\x9a\x01x\x01\x8e\xff\x9a\x01x\x01\ +\x8f\xff\x9a\x01x\x01\x90\xff\x9a\x01x\x01\x92\xff\xc3\x01\ +x\x01\x93\xff\x9a\x01x\x01\x95\xff\xc3\x01x\x01\x96\xff\ +\xc3\x01x\x01\x98\xff\xc3\x01x\x01\x99\xff\x9a\x01x\x01\ +\x9a\xff\xc3\x01x\x01\x9b\xff\xc3\x01x\x02\x08\xff\x85\x01\ +x\x02\x0c\xff\x85\x01x\x02!\xff\xec\x01y\x01\x88\x00\ +)\x01{\x00\x05\xff\xec\x01{\x00\x0a\xff\xec\x01{\x02\ +\x07\xff\xec\x01{\x02\x0b\xff\xec\x01|\x00\x05\xff\xae\x01\ +|\x00\x0a\xff\xae\x01|\x01\x8d\xff\xec\x01|\x01\x91\xff\ +\xec\x01|\x02\x07\xff\xae\x01|\x02\x0b\xff\xae\x01~\x01\ +\x88\x00)\x01\x80\x00\x0f\xff\xae\x01\x80\x00\x11\xff\xae\x01\ +\x80\x01\x88\xff\xec\x01\x80\x02\x08\xff\xae\x01\x80\x02\x0c\xff\ +\xae\x01\x83\x00\x10\xff\x9a\x01\x83\x01y\xff\xd7\x01\x83\x01\ +~\xff\xd7\x01\x83\x01\x81\xff\xd7\x01\x83\x01\x8c\xff\xd7\x01\ +\x83\x01\x8d\xff\xd7\x01\x83\x01\x8f\xff\xd7\x01\x83\x01\x90\xff\ +\xd7\x01\x83\x01\x91\xff\xd7\x01\x83\x01\x93\xff\xd7\x01\x83\x01\ +\x99\xff\xd7\x01\x83\x02\x02\xff\x9a\x01\x83\x02\x03\xff\x9a\x01\ +\x83\x02\x04\xff\x9a\x01\x84\x00\x05\xff\xec\x01\x84\x00\x0a\xff\ +\xec\x01\x84\x02\x07\xff\xec\x01\x84\x02\x0b\xff\xec\x01\x85\x00\ +\x0f\xff\xd7\x01\x85\x00\x11\xff\xd7\x01\x85\x02\x08\xff\xd7\x01\ +\x85\x02\x0c\xff\xd7\x01\x86\x00\x05\xff\xae\x01\x86\x00\x0a\xff\ +\xae\x01\x86\x01\x8d\xff\xec\x01\x86\x01\x91\xff\xec\x01\x86\x02\ +\x07\xff\xae\x01\x86\x02\x0b\xff\xae\x01\x87\x01y\xff\xd7\x01\ +\x87\x01~\xff\xd7\x01\x87\x01\x8c\xff\xd7\x01\x87\x01\x8f\xff\ +\xd7\x01\x87\x01\x90\xff\xd7\x01\x87\x01\x93\xff\xd7\x01\x87\x01\ +\x99\xff\xd7\x01\x88\x00\x05\xff\x85\x01\x88\x00\x0a\xff\x85\x01\ +\x88\x01y\xff\xec\x01\x88\x01~\xff\xec\x01\x88\x01\x80\xff\ +\xd7\x01\x88\x01\x8a\xff\xd7\x01\x88\x01\x8c\xff\xec\x01\x88\x01\ +\x8d\xff\xd7\x01\x88\x01\x8f\xff\xec\x01\x88\x01\x90\xff\xec\x01\ +\x88\x01\x91\xff\xd7\x01\x88\x01\x93\xff\xec\x01\x88\x01\x99\xff\ +\xec\x01\x88\x02\x07\xff\x85\x01\x88\x02\x0b\xff\x85\x01\x8a\x00\ +\x0f\xff\xae\x01\x8a\x00\x11\xff\xae\x01\x8a\x01\x88\xff\xec\x01\ +\x8a\x02\x08\xff\xae\x01\x8a\x02\x0c\xff\xae\x01\x8c\x00\x05\xff\ +\xec\x01\x8c\x00\x0a\xff\xec\x01\x8c\x01\x80\xff\xd7\x01\x8c\x01\ +\x8a\xff\xd7\x01\x8c\x02\x07\xff\xec\x01\x8c\x02\x0b\xff\xec\x01\ +\x8e\x00\x05\xff\xec\x01\x8e\x00\x0a\xff\xec\x01\x8e\x01\x80\xff\ +\xd7\x01\x8e\x01\x8a\xff\xd7\x01\x8e\x02\x07\xff\xec\x01\x8e\x02\ +\x0b\xff\xec\x01\x90\x00\x0f\xff\xec\x01\x90\x00\x11\xff\xec\x01\ +\x90\x02\x08\xff\xec\x01\x90\x02\x0c\xff\xec\x01\x93\x00\x05\xff\ +\xec\x01\x93\x00\x0a\xff\xec\x01\x93\x01\x80\xff\xd7\x01\x93\x01\ +\x8a\xff\xd7\x01\x93\x02\x07\xff\xec\x01\x93\x02\x0b\xff\xec\x01\ +\x94\x00\x0f\xff\xc3\x01\x94\x00\x10\xff\xd7\x01\x94\x00\x11\xff\ +\xc3\x01\x94\x01y\xff\xd7\x01\x94\x01~\xff\xd7\x01\x94\x01\ +\x81\xff\xd7\x01\x94\x01\x8c\xff\xd7\x01\x94\x01\x8f\xff\xd7\x01\ +\x94\x01\x90\xff\xd7\x01\x94\x01\x93\xff\xd7\x01\x94\x01\x99\xff\ +\xd7\x01\x94\x02\x02\xff\xd7\x01\x94\x02\x03\xff\xd7\x01\x94\x02\ +\x04\xff\xd7\x01\x94\x02\x08\xff\xc3\x01\x94\x02\x0c\xff\xc3\x01\ +\x97\x00\x05\xff\xd7\x01\x97\x00\x0a\xff\xd7\x01\x97\x02\x07\xff\ +\xd7\x01\x97\x02\x0b\xff\xd7\x01\x99\x00\x05\xff\xec\x01\x99\x00\ +\x0a\xff\xec\x01\x99\x01\x80\xff\xd7\x01\x99\x01\x8a\xff\xd7\x01\ +\x99\x02\x07\xff\xec\x01\x99\x02\x0b\xff\xec\x01\x9d\x00\x05\xff\ +\xae\x01\x9d\x00\x0a\xff\xae\x01\x9d\x01\x9d\xff\x85\x01\x9d\x01\ +\xa6\xff\x85\x01\x9d\x01\xa8\xff\xd7\x01\x9d\x01\xbc\xff\x9a\x01\ +\x9d\x01\xbd\xff\xd7\x01\x9d\x01\xc1\xff\x9a\x01\x9d\x01\xc4\xff\ +\x85\x01\x9d\x01\xdc\xff\xd7\x01\x9d\x01\xdd\xff\xd7\x01\x9d\x01\ +\xe1\xff\xd7\x01\x9d\x01\xe4\xff\xd7\x01\x9d\x01\xf6\xff\xd7\x01\ +\x9d\x02\x07\xff\xae\x01\x9d\x02\x0b\xff\xae\x01\x9d\x02n\xff\ +\xae\x01\x9d\x02|\xff\x9a\x01\x9d\x02\x80\xff\xae\x01\x9d\x02\ +\x82\xff\xae\x01\x9d\x02\x97\xff\xae\x01\x9d\x02\x9b\xff\xae\x01\ +\x9d\x02\xa7\xff\xae\x01\x9d\x02\xa9\xff\x85\x01\x9d\x02\xaa\xff\ +\xd7\x01\x9d\x02\xb5\xff\x9a\x01\x9d\x02\xb6\xff\xd7\x01\x9d\x02\ +\xb7\xff\x9a\x01\x9d\x02\xb8\xff\xd7\x01\x9d\x02\xb9\xff\x9a\x01\ +\x9d\x02\xba\xff\xd7\x01\x9d\x02\xbd\xff\x85\x01\x9d\x02\xbe\xff\ +\xd7\x01\x9d\x02\xbf\xff\x9a\x01\x9d\x02\xc0\xff\xd7\x01\x9d\x02\ +\xc1\xff\x9a\x01\x9d\x02\xc2\xff\xd7\x01\x9d\x02\xd4\xff\x9a\x01\ +\x9d\x02\xd5\xff\xd7\x01\x9d\x02\xf7\xff\xd7\x01\x9d\x02\xf8\xff\ +\xd7\x01\x9d\x02\xf9\xff\xd7\x01\x9d\x02\xfa\xff\xd7\x01\x9d\x02\ +\xfb\xff\xd7\x01\x9d\x02\xfc\xff\xd7\x01\x9d\x02\xfd\xff\x9a\x01\ +\x9d\x02\xfe\xff\xd7\x01\x9d\x03\x03\xff\xae\x01\x9d\x03\x0d\xff\ +\x9a\x01\x9d\x03\x0e\xff\xc3\x01\x9d\x03\x0f\xff\x9a\x01\x9d\x03\ +\x10\xff\xc3\x01\x9d\x03\x17\xff\x85\x01\x9d\x03\x18\xff\xd7\x01\ +\x9e\x00\x0f\xff\x85\x01\x9e\x00\x10\xff\xae\x01\x9e\x00\x11\xff\ +\x85\x01\x9e\x01\x9f\xff\xd7\x01\x9e\x01\xa4\xff\x9a\x01\x9e\x01\ +\xaa\xffq\x01\x9e\x01\xae\xff\x9a\x01\x9e\x01\xb5\xff\x9a\x01\ +\x9e\x01\xb8\xff\xd7\x01\x9e\x01\xbb\xff\xd7\x01\x9e\x01\xbc\x00\ +)\x01\x9e\x01\xbe\xff\xae\x01\x9e\x01\xcc\xff\x9a\x01\x9e\x01\ +\xcd\xff\x9a\x01\x9e\x01\xce\xff\x85\x01\x9e\x01\xcf\xffq\x01\ +\x9e\x01\xd0\xff\xd7\x01\x9e\x01\xd1\xff\xd7\x01\x9e\x01\xd2\xff\ +\x9a\x01\x9e\x01\xd3\xff\x9a\x01\x9e\x01\xd4\xff\x9a\x01\x9e\x01\ +\xd5\xff\x85\x01\x9e\x01\xd6\xff\x9a\x01\x9e\x01\xd7\xff\x9a\x01\ +\x9e\x01\xd8\xffq\x01\x9e\x01\xd9\xff\x9a\x01\x9e\x01\xda\xff\ +\x9a\x01\x9e\x01\xdb\xffq\x01\x9e\x01\xdc\xff\xae\x01\x9e\x01\ +\xdd\xff\xae\x01\x9e\x01\xde\xffq\x01\x9e\x01\xdf\xff\xd7\x01\ +\x9e\x01\xe0\xff\x9a\x01\x9e\x01\xe1\xff\x9a\x01\x9e\x01\xe2\xff\ +\x9a\x01\x9e\x01\xe3\xff\x9a\x01\x9e\x01\xe4\xff\xae\x01\x9e\x01\ +\xe5\xff\x9a\x01\x9e\x01\xe6\xff\x9a\x01\x9e\x01\xe7\xff\xd7\x01\ +\x9e\x01\xe8\xff\x9a\x01\x9e\x01\xe9\xff\xc3\x01\x9e\x01\xea\xff\ +q\x01\x9e\x01\xec\xff\x9a\x01\x9e\x01\xed\xffq\x01\x9e\x01\ +\xee\xff\x85\x01\x9e\x01\xf2\xff\x85\x01\x9e\x01\xf3\xff\x9a\x01\ +\x9e\x01\xf5\xff\x9a\x01\x9e\x01\xf6\xff\xae\x01\x9e\x01\xf7\xff\ +\x9a\x01\x9e\x01\xf9\xff\x9a\x01\x9e\x02\x02\xff\xae\x01\x9e\x02\ +\x03\xff\xae\x01\x9e\x02\x04\xff\xae\x01\x9e\x02\x08\xff\x85\x01\ +\x9e\x02\x0c\xff\x85\x01\x9e\x02j\xffq\x01\x9e\x02k\xff\ +\x9a\x01\x9e\x02l\xff\xd7\x01\x9e\x02m\xff\xd7\x01\x9e\x02\ +q\xff\x9a\x01\x9e\x02r\xffq\x01\x9e\x02s\xff\x85\x01\ +\x9e\x02u\xff\x9a\x01\x9e\x02w\xff\x9a\x01\x9e\x02y\xff\ +\x9a\x01\x9e\x02}\xff\x9a\x01\x9e\x02~\xff\xd7\x01\x9e\x02\ +\x7f\xffq\x01\x9e\x02\x81\xff\xd7\x01\x9e\x02\x83\xff\xd7\x01\ +\x9e\x02\x84\xff\xd7\x01\x9e\x02\x85\xffq\x01\x9e\x02\x86\xff\ +\xd7\x01\x9e\x02\x87\xffq\x01\x9e\x02\x88\xff\xd7\x01\x9e\x02\ +\x89\xffq\x01\x9e\x02\x8a\xff\xd7\x01\x9e\x02\x8b\xff\xd7\x01\ +\x9e\x02\x8c\xff\xd7\x01\x9e\x02\x8d\xffq\x01\x9e\x02\x96\xff\ +\x9a\x01\x9e\x02\x9a\xff\x9a\x01\x9e\x02\x9e\xff\x9a\x01\x9e\x02\ +\xa0\xff\xd7\x01\x9e\x02\xa2\xff\xd7\x01\x9e\x02\xa4\xff\x9a\x01\ +\x9e\x02\xa6\xff\x9a\x01\x9e\x02\xaa\xff\xae\x01\x9e\x02\xac\xff\ +\x9a\x01\x9e\x02\xae\xff\x9a\x01\x9e\x02\xb0\xff\x9a\x01\x9e\x02\ +\xb1\xff\xd7\x01\x9e\x02\xb2\xffq\x01\x9e\x02\xb3\xff\xd7\x01\ +\x9e\x02\xb4\xffq\x01\x9e\x02\xb5\x00)\x01\x9e\x02\xb6\xff\ +\xae\x01\x9e\x02\xb8\xff\xae\x01\x9e\x02\xba\xff\xae\x01\x9e\x02\ +\xbc\xff\xd7\x01\x9e\x02\xbe\xff\xae\x01\x9e\x02\xc0\xff\x9a\x01\ +\x9e\x02\xc2\xff\x9a\x01\x9e\x02\xc4\xff\x9a\x01\x9e\x02\xc5\xff\ +\x9a\x01\x9e\x02\xc6\xffq\x01\x9e\x02\xc7\xff\x9a\x01\x9e\x02\ +\xc8\xffq\x01\x9e\x02\xcb\xff\xd7\x01\x9e\x02\xcd\xff\x9a\x01\ +\x9e\x02\xce\xff\x9a\x01\x9e\x02\xcf\xff\x85\x01\x9e\x02\xd1\xff\ +\x9a\x01\x9e\x02\xd3\xff\x9a\x01\x9e\x02\xd5\xff\x9a\x01\x9e\x02\ +\xd7\xff\x9a\x01\x9e\x02\xd9\xffq\x01\x9e\x02\xdb\xffq\x01\ +\x9e\x02\xdd\xffq\x01\x9e\x02\xe0\xffq\x01\x9e\x02\xe6\xff\ +\xd7\x01\x9e\x02\xe8\xff\xd7\x01\x9e\x02\xea\xff\xc3\x01\x9e\x02\ +\xec\xff\x9a\x01\x9e\x02\xee\xff\x9a\x01\x9e\x02\xef\xff\xd7\x01\ +\x9e\x02\xf0\xffq\x01\x9e\x02\xf1\xff\xd7\x01\x9e\x02\xf2\xff\ +q\x01\x9e\x02\xf3\xff\xd7\x01\x9e\x02\xf4\xffq\x01\x9e\x02\ +\xf6\xff\xd7\x01\x9e\x02\xf8\xff\xae\x01\x9e\x02\xfa\xff\xae\x01\ +\x9e\x02\xfc\xff\xae\x01\x9e\x02\xfe\xff\x9a\x01\x9e\x03\x00\xff\ +\x9a\x01\x9e\x03\x02\xff\x9a\x01\x9e\x03\x06\xff\xd7\x01\x9e\x03\ +\x08\xff\xd7\x01\x9e\x03\x09\xffq\x01\x9e\x03\x0a\xffq\x01\ +\x9e\x03\x0b\xffq\x01\x9e\x03\x0c\xffq\x01\x9e\x03\x0e\xff\ +\x9a\x01\x9e\x03\x10\xff\x9a\x01\x9e\x03\x11\xff\x9a\x01\x9e\x03\ +\x12\xff\x85\x01\x9e\x03\x14\xff\x9a\x01\x9e\x03\x15\xff\xd7\x01\ +\x9e\x03\x16\xffq\x01\x9e\x03\x18\xff\xae\x01\x9e\x03\x1a\xff\ +q\x01\x9e\x03\x1b\xff\x9a\x01\x9e\x03\x1c\xff\x85\x01\x9f\x01\ +\x9f\xff\xd7\x01\x9f\x01\xb8\xff\xd7\x01\x9f\x01\xbb\xff\xd7\x01\ +\x9f\x01\xbe\xff\xd7\x01\x9f\x01\xe1\xff\xd7\x01\x9f\x02l\xff\ +\xd7\x01\x9f\x02~\xff\xd7\x01\x9f\x02\x84\xff\xd7\x01\x9f\x02\ +\x86\xff\xd7\x01\x9f\x02\x88\xff\xd7\x01\x9f\x02\x8a\xff\xd7\x01\ +\x9f\x02\x8c\xff\xd7\x01\x9f\x02\xb1\xff\xd7\x01\x9f\x02\xb3\xff\ +\xd7\x01\x9f\x02\xc0\xff\xd7\x01\x9f\x02\xc2\xff\xd7\x01\x9f\x02\ +\xc5\xff\xd7\x01\x9f\x02\xc7\xff\xd7\x01\x9f\x02\xd5\xff\xd7\x01\ +\x9f\x02\xef\xff\xd7\x01\x9f\x02\xf1\xff\xd7\x01\x9f\x02\xf3\xff\ +\xd7\x01\x9f\x02\xfe\xff\xd7\x01\x9f\x03\x09\xff\xd7\x01\x9f\x03\ +\x0b\xff\xd7\x01\x9f\x03\x0e\xff\xd7\x01\x9f\x03\x10\xff\xd7\x01\ +\x9f\x03\x15\xff\xd7\x01\xa0\x03\x0e\xff\xd7\x01\xa0\x03\x10\xff\ +\xd7\x01\xa4\x00\x05\xff\xae\x01\xa4\x00\x0a\xff\xae\x01\xa4\x01\ +\x9d\xff\x85\x01\xa4\x01\xa6\xff\x85\x01\xa4\x01\xa8\xff\xd7\x01\ +\xa4\x01\xbc\xff\x9a\x01\xa4\x01\xbd\xff\xd7\x01\xa4\x01\xc1\xff\ +\x9a\x01\xa4\x01\xc4\xff\x85\x01\xa4\x01\xdc\xff\xd7\x01\xa4\x01\ +\xdd\xff\xd7\x01\xa4\x01\xe1\xff\xd7\x01\xa4\x01\xe4\xff\xd7\x01\ +\xa4\x01\xf6\xff\xd7\x01\xa4\x02\x07\xff\xae\x01\xa4\x02\x0b\xff\ +\xae\x01\xa4\x02n\xff\xae\x01\xa4\x02|\xff\x9a\x01\xa4\x02\ +\x80\xff\xae\x01\xa4\x02\x82\xff\xae\x01\xa4\x02\x97\xff\xae\x01\ +\xa4\x02\x9b\xff\xae\x01\xa4\x02\xa7\xff\xae\x01\xa4\x02\xa9\xff\ +\x85\x01\xa4\x02\xaa\xff\xd7\x01\xa4\x02\xb5\xff\x9a\x01\xa4\x02\ +\xb6\xff\xd7\x01\xa4\x02\xb7\xff\x9a\x01\xa4\x02\xb8\xff\xd7\x01\ +\xa4\x02\xb9\xff\x9a\x01\xa4\x02\xba\xff\xd7\x01\xa4\x02\xbd\xff\ +\x85\x01\xa4\x02\xbe\xff\xd7\x01\xa4\x02\xbf\xff\x9a\x01\xa4\x02\ +\xc0\xff\xd7\x01\xa4\x02\xc1\xff\x9a\x01\xa4\x02\xc2\xff\xd7\x01\ +\xa4\x02\xd4\xff\x9a\x01\xa4\x02\xd5\xff\xd7\x01\xa4\x02\xf7\xff\ +\xd7\x01\xa4\x02\xf8\xff\xd7\x01\xa4\x02\xf9\xff\xd7\x01\xa4\x02\ +\xfa\xff\xd7\x01\xa4\x02\xfb\xff\xd7\x01\xa4\x02\xfc\xff\xd7\x01\ +\xa4\x02\xfd\xff\x9a\x01\xa4\x02\xfe\xff\xd7\x01\xa4\x03\x03\xff\ +\xae\x01\xa4\x03\x0d\xff\x9a\x01\xa4\x03\x0e\xff\xc3\x01\xa4\x03\ +\x0f\xff\x9a\x01\xa4\x03\x10\xff\xc3\x01\xa4\x03\x17\xff\x85\x01\ +\xa4\x03\x18\xff\xd7\x01\xa5\x00\x05\xff\xae\x01\xa5\x00\x0a\xff\ +\xae\x01\xa5\x01\x9d\xff\x85\x01\xa5\x01\xa6\xff\x85\x01\xa5\x01\ +\xa8\xff\xd7\x01\xa5\x01\xbc\xff\x9a\x01\xa5\x01\xbd\xff\xd7\x01\ +\xa5\x01\xc1\xff\x9a\x01\xa5\x01\xc4\xff\x85\x01\xa5\x01\xdc\xff\ +\xd7\x01\xa5\x01\xdd\xff\xd7\x01\xa5\x01\xe1\xff\xd7\x01\xa5\x01\ +\xe4\xff\xd7\x01\xa5\x01\xf6\xff\xd7\x01\xa5\x02\x07\xff\xae\x01\ +\xa5\x02\x0b\xff\xae\x01\xa5\x02n\xff\xae\x01\xa5\x02|\xff\ +\x9a\x01\xa5\x02\x80\xff\xae\x01\xa5\x02\x82\xff\xae\x01\xa5\x02\ +\x97\xff\xae\x01\xa5\x02\x9b\xff\xae\x01\xa5\x02\xa7\xff\xae\x01\ +\xa5\x02\xa9\xff\x85\x01\xa5\x02\xaa\xff\xd7\x01\xa5\x02\xb5\xff\ +\x9a\x01\xa5\x02\xb6\xff\xd7\x01\xa5\x02\xb7\xff\x9a\x01\xa5\x02\ +\xb8\xff\xd7\x01\xa5\x02\xb9\xff\x9a\x01\xa5\x02\xba\xff\xd7\x01\ +\xa5\x02\xbd\xff\x85\x01\xa5\x02\xbe\xff\xd7\x01\xa5\x02\xbf\xff\ +\x9a\x01\xa5\x02\xc0\xff\xd7\x01\xa5\x02\xc1\xff\x9a\x01\xa5\x02\ +\xc2\xff\xd7\x01\xa5\x02\xd4\xff\x9a\x01\xa5\x02\xd5\xff\xd7\x01\ +\xa5\x02\xf7\xff\xd7\x01\xa5\x02\xf8\xff\xd7\x01\xa5\x02\xf9\xff\ +\xd7\x01\xa5\x02\xfa\xff\xd7\x01\xa5\x02\xfb\xff\xd7\x01\xa5\x02\ +\xfc\xff\xd7\x01\xa5\x02\xfd\xff\x9a\x01\xa5\x02\xfe\xff\xd7\x01\ +\xa5\x03\x03\xff\xae\x01\xa5\x03\x0d\xff\x9a\x01\xa5\x03\x0e\xff\ +\xc3\x01\xa5\x03\x0f\xff\x9a\x01\xa5\x03\x10\xff\xc3\x01\xa5\x03\ +\x17\xff\x85\x01\xa5\x03\x18\xff\xd7\x01\xa6\x00\x05\xff\xae\x01\ +\xa6\x00\x0a\xff\xae\x01\xa6\x01\x9d\xff\x85\x01\xa6\x01\xa6\xff\ +\x85\x01\xa6\x01\xa8\xff\xd7\x01\xa6\x01\xbc\xff\x9a\x01\xa6\x01\ +\xbd\xff\xd7\x01\xa6\x01\xc1\xff\x9a\x01\xa6\x01\xc4\xff\x85\x01\ +\xa6\x01\xdc\xff\xd7\x01\xa6\x01\xdd\xff\xd7\x01\xa6\x01\xe1\xff\ +\xd7\x01\xa6\x01\xe4\xff\xd7\x01\xa6\x01\xf6\xff\xd7\x01\xa6\x02\ +\x07\xff\xae\x01\xa6\x02\x0b\xff\xae\x01\xa6\x02n\xff\xae\x01\ +\xa6\x02|\xff\x9a\x01\xa6\x02\x80\xff\xae\x01\xa6\x02\x82\xff\ +\xae\x01\xa6\x02\x97\xff\xae\x01\xa6\x02\x9b\xff\xae\x01\xa6\x02\ +\xa7\xff\xae\x01\xa6\x02\xa9\xff\x85\x01\xa6\x02\xaa\xff\xd7\x01\ +\xa6\x02\xb5\xff\x9a\x01\xa6\x02\xb6\xff\xd7\x01\xa6\x02\xb7\xff\ +\x9a\x01\xa6\x02\xb8\xff\xd7\x01\xa6\x02\xb9\xff\x9a\x01\xa6\x02\ +\xba\xff\xd7\x01\xa6\x02\xbd\xff\x85\x01\xa6\x02\xbe\xff\xd7\x01\ +\xa6\x02\xbf\xff\x9a\x01\xa6\x02\xc0\xff\xd7\x01\xa6\x02\xc1\xff\ +\x9a\x01\xa6\x02\xc2\xff\xd7\x01\xa6\x02\xd4\xff\x9a\x01\xa6\x02\ +\xd5\xff\xd7\x01\xa6\x02\xf7\xff\xd7\x01\xa6\x02\xf8\xff\xd7\x01\ +\xa6\x02\xf9\xff\xd7\x01\xa6\x02\xfa\xff\xd7\x01\xa6\x02\xfb\xff\ +\xd7\x01\xa6\x02\xfc\xff\xd7\x01\xa6\x02\xfd\xff\x9a\x01\xa6\x02\ +\xfe\xff\xd7\x01\xa6\x03\x03\xff\xae\x01\xa6\x03\x0d\xff\x9a\x01\ +\xa6\x03\x0e\xff\xc3\x01\xa6\x03\x0f\xff\x9a\x01\xa6\x03\x10\xff\ +\xc3\x01\xa6\x03\x17\xff\x85\x01\xa6\x03\x18\xff\xd7\x01\xa7\x01\ +\x9f\xff\xd7\x01\xa7\x01\xb8\xff\xd7\x01\xa7\x01\xbb\xff\xd7\x01\ +\xa7\x01\xbe\xff\xd7\x01\xa7\x01\xc1\xff\xd7\x01\xa7\x01\xe1\xff\ +\xd7\x01\xa7\x02l\xff\xd7\x01\xa7\x02|\xff\xd7\x01\xa7\x02\ +~\xff\xd7\x01\xa7\x02\x84\xff\xd7\x01\xa7\x02\x86\xff\xd7\x01\ +\xa7\x02\x88\xff\xd7\x01\xa7\x02\x8a\xff\xd7\x01\xa7\x02\x8c\xff\ +\xd7\x01\xa7\x02\xb1\xff\xd7\x01\xa7\x02\xb3\xff\xd7\x01\xa7\x02\ +\xbf\xff\xd7\x01\xa7\x02\xc0\xff\xd7\x01\xa7\x02\xc1\xff\xd7\x01\ +\xa7\x02\xc2\xff\xd7\x01\xa7\x02\xc5\xff\x9a\x01\xa7\x02\xc7\xff\ +\x9a\x01\xa7\x02\xd4\xff\xd7\x01\xa7\x02\xd5\xff\xd7\x01\xa7\x02\ +\xef\xff\xd7\x01\xa7\x02\xf1\xff\xd7\x01\xa7\x02\xf3\xff\xd7\x01\ +\xa7\x02\xfd\xff\xd7\x01\xa7\x02\xfe\xff\xd7\x01\xa7\x03\x09\xff\ +\xd7\x01\xa7\x03\x0b\xff\xd7\x01\xa7\x03\x0e\xff\xd7\x01\xa7\x03\ +\x10\xff\xd7\x01\xa7\x03\x15\xff\xd7\x01\xa7\x03\x19\xff\xec\x01\ +\xa8\x00\x0f\xff\x85\x01\xa8\x00\x11\xff\x85\x01\xa8\x01\x9f\xff\ +\xec\x01\xa8\x01\xa4\xff\x9a\x01\xa8\x01\xaa\xffq\x01\xa8\x01\ +\xae\xff\x9a\x01\xa8\x01\xb5\xff\x9a\x01\xa8\x01\xb8\xff\xec\x01\ +\xa8\x01\xbb\xff\xec\x01\xa8\x01\xbe\xff\xc3\x01\xa8\x01\xc9\xff\ +\xec\x01\xa8\x01\xce\xff\xae\x01\xa8\x01\xcf\xff\xd7\x01\xa8\x01\ +\xd5\xff\xae\x01\xa8\x01\xd8\xff\xd7\x01\xa8\x01\xdb\xff\xd7\x01\ +\xa8\x01\xde\xff\xd7\x01\xa8\x01\xe1\xff\xd7\x01\xa8\x01\xea\xff\ +\xd7\x01\xa8\x01\xeb\x00f\x01\xa8\x01\xed\xff\xd7\x01\xa8\x01\ +\xee\xff\xec\x01\xa8\x01\xf2\xff\xae\x01\xa8\x01\xf4\x00f\x01\ +\xa8\x02\x08\xff\x85\x01\xa8\x02\x0c\xff\x85\x01\xa8\x02j\xff\ +\xd7\x01\xa8\x02l\xff\xec\x01\xa8\x02r\xffq\x01\xa8\x02\ +s\xff\xae\x01\xa8\x02~\xff\xec\x01\xa8\x02\x7f\xff\xd7\x01\ +\xa8\x02\x84\xff\xec\x01\xa8\x02\x85\xff\xd7\x01\xa8\x02\x86\xff\ +\xec\x01\xa8\x02\x87\xff\xd7\x01\xa8\x02\x88\xff\xec\x01\xa8\x02\ +\x89\xff\xd7\x01\xa8\x02\x8a\xff\xec\x01\xa8\x02\x8c\xff\xec\x01\ +\xa8\x02\x8d\xff\xd7\x01\xa8\x02\x98\x00f\x01\xa8\x02\xa8\x00\ +f\x01\xa8\x02\xb1\xff\xec\x01\xa8\x02\xb2\xff\xd7\x01\xa8\x02\ +\xb3\xff\xec\x01\xa8\x02\xb4\xff\xd7\x01\xa8\x02\xc0\xff\xd7\x01\ +\xa8\x02\xc2\xff\xd7\x01\xa8\x02\xc5\xff\xd7\x01\xa8\x02\xc6\xff\ +\xc3\x01\xa8\x02\xc7\xff\xd7\x01\xa8\x02\xc8\xff\xc3\x01\xa8\x02\ +\xce\xff\x9a\x01\xa8\x02\xcf\xff\xae\x01\xa8\x02\xd5\xff\xd7\x01\ +\xa8\x02\xd9\xffq\x01\xa8\x02\xdb\xffq\x01\xa8\x02\xdd\xff\ +q\x01\xa8\x02\xe0\xff\xd7\x01\xa8\x02\xef\xff\xec\x01\xa8\x02\ +\xf0\xff\xd7\x01\xa8\x02\xf1\xff\xec\x01\xa8\x02\xf2\xff\xd7\x01\ +\xa8\x02\xf3\xff\xec\x01\xa8\x02\xf4\xff\xd7\x01\xa8\x02\xfe\xff\ +\xd7\x01\xa8\x03\x09\xffq\x01\xa8\x03\x0a\xff\xd7\x01\xa8\x03\ +\x0b\xffq\x01\xa8\x03\x0c\xff\xd7\x01\xa8\x03\x11\xff\x9a\x01\ +\xa8\x03\x12\xff\xae\x01\xa8\x03\x15\xff\xec\x01\xa8\x03\x16\xff\ +\xd7\x01\xa8\x03\x1a\xff\xd7\x01\xa8\x03\x1b\xff\x9a\x01\xa8\x03\ +\x1c\xff\xae\x01\xaa\x00\x05\xffq\x01\xaa\x00\x0a\xffq\x01\ +\xaa\x01\x9d\xff\x9a\x01\xaa\x01\xa6\xff\x9a\x01\xaa\x01\xbc\xff\ +q\x01\xaa\x01\xbe\xff\xd7\x01\xaa\x01\xc1\xff\x9a\x01\xaa\x01\ +\xc4\xff\x9a\x01\xaa\x01\xdc\xff\xd7\x01\xaa\x01\xe1\xff\xd7\x01\ +\xaa\x01\xe4\xff\xd7\x01\xaa\x02\x07\xffq\x01\xaa\x02\x0b\xff\ +q\x01\xaa\x02n\xff\xd7\x01\xaa\x02|\xff\x9a\x01\xaa\x02\ +\x80\xff\xae\x01\xaa\x02\x82\xff\xae\x01\xaa\x02\x97\xff\xd7\x01\ +\xaa\x02\x9b\xff\xd7\x01\xaa\x02\xa7\xff\xd7\x01\xaa\x02\xa9\xff\ +\x9a\x01\xaa\x02\xaa\xff\xd7\x01\xaa\x02\xb5\xffq\x01\xaa\x02\ +\xb6\xff\xd7\x01\xaa\x02\xb7\xff\x85\x01\xaa\x02\xb9\xff\x85\x01\ +\xaa\x02\xbd\xff\x9a\x01\xaa\x02\xbe\xff\xd7\x01\xaa\x02\xbf\xff\ +\x9a\x01\xaa\x02\xc0\xff\xd7\x01\xaa\x02\xc1\xff\x9a\x01\xaa\x02\ +\xc2\xff\xd7\x01\xaa\x02\xc5\xff\x9a\x01\xaa\x02\xc7\xff\x9a\x01\ +\xaa\x02\xd4\xff\x9a\x01\xaa\x02\xd5\xff\xd7\x01\xaa\x02\xe1\xff\ +\xd7\x01\xaa\x02\xe3\xff\xd7\x01\xaa\x02\xfd\xff\x9a\x01\xaa\x02\ +\xfe\xff\xd7\x01\xaa\x03\x03\xff\xd7\x01\xaa\x03\x0d\xffq\x01\ +\xaa\x03\x0e\xff\xd7\x01\xaa\x03\x0f\xffq\x01\xaa\x03\x10\xff\ +\xd7\x01\xaa\x03\x17\xff\x9a\x01\xaa\x03\x18\xff\xd7\x01\xab\x00\ +\x05\xff\xd7\x01\xab\x00\x0a\xff\xd7\x01\xab\x01\xaa\xff\xec\x01\ +\xab\x01\xc1\xff\xd7\x01\xab\x02\x07\xff\xd7\x01\xab\x02\x0b\xff\ +\xd7\x01\xab\x02r\xff\xec\x01\xab\x02|\xff\xd7\x01\xab\x02\ +\xbf\xff\xd7\x01\xab\x02\xc1\xff\xd7\x01\xab\x02\xc5\xff\xd7\x01\ +\xab\x02\xc7\xff\xd7\x01\xab\x02\xd4\xff\xd7\x01\xab\x02\xd9\xff\ +\xec\x01\xab\x02\xdb\xff\xec\x01\xab\x02\xdd\xff\xec\x01\xab\x02\ +\xfd\xff\xd7\x01\xac\x00\x0f\xff\xae\x01\xac\x00\x11\xff\xae\x01\ +\xac\x02\x08\xff\xae\x01\xac\x02\x0c\xff\xae\x01\xac\x02\x80\xff\ +\xec\x01\xac\x02\x82\xff\xec\x01\xac\x02\xb7\xff\xec\x01\xac\x02\ +\xb9\xff\xec\x01\xac\x03\x0d\xff\xd7\x01\xac\x03\x0f\xff\xd7\x01\ +\xad\x00\x0f\xff\x85\x01\xad\x00\x10\xff\xae\x01\xad\x00\x11\xff\ +\x85\x01\xad\x01\x9f\xff\xd7\x01\xad\x01\xa4\xff\x9a\x01\xad\x01\ +\xaa\xffq\x01\xad\x01\xae\xff\x9a\x01\xad\x01\xb5\xff\x9a\x01\ +\xad\x01\xb8\xff\xd7\x01\xad\x01\xbb\xff\xd7\x01\xad\x01\xbc\x00\ +)\x01\xad\x01\xbe\xff\xae\x01\xad\x01\xcc\xff\x9a\x01\xad\x01\ +\xcd\xff\x9a\x01\xad\x01\xce\xff\x85\x01\xad\x01\xcf\xffq\x01\ +\xad\x01\xd0\xff\xd7\x01\xad\x01\xd1\xff\xd7\x01\xad\x01\xd2\xff\ +\x9a\x01\xad\x01\xd3\xff\x9a\x01\xad\x01\xd4\xff\x9a\x01\xad\x01\ +\xd5\xff\x85\x01\xad\x01\xd6\xff\x9a\x01\xad\x01\xd7\xff\x9a\x01\ +\xad\x01\xd8\xffq\x01\xad\x01\xd9\xff\x9a\x01\xad\x01\xda\xff\ +\x9a\x01\xad\x01\xdb\xffq\x01\xad\x01\xdc\xff\xae\x01\xad\x01\ +\xdd\xff\xae\x01\xad\x01\xde\xffq\x01\xad\x01\xdf\xff\xd7\x01\ +\xad\x01\xe0\xff\x9a\x01\xad\x01\xe1\xff\x9a\x01\xad\x01\xe2\xff\ +\x9a\x01\xad\x01\xe3\xff\x9a\x01\xad\x01\xe4\xff\xae\x01\xad\x01\ +\xe5\xff\x9a\x01\xad\x01\xe6\xff\x9a\x01\xad\x01\xe7\xff\xd7\x01\ +\xad\x01\xe8\xff\x9a\x01\xad\x01\xe9\xff\xc3\x01\xad\x01\xea\xff\ +q\x01\xad\x01\xec\xff\x9a\x01\xad\x01\xed\xffq\x01\xad\x01\ +\xee\xff\x85\x01\xad\x01\xf2\xff\x85\x01\xad\x01\xf3\xff\x9a\x01\ +\xad\x01\xf5\xff\x9a\x01\xad\x01\xf6\xff\xae\x01\xad\x01\xf7\xff\ +\x9a\x01\xad\x01\xf9\xff\x9a\x01\xad\x02\x02\xff\xae\x01\xad\x02\ +\x03\xff\xae\x01\xad\x02\x04\xff\xae\x01\xad\x02\x08\xff\x85\x01\ +\xad\x02\x0c\xff\x85\x01\xad\x02j\xffq\x01\xad\x02k\xff\ +\x9a\x01\xad\x02l\xff\xd7\x01\xad\x02m\xff\xd7\x01\xad\x02\ +q\xff\x9a\x01\xad\x02r\xffq\x01\xad\x02s\xff\x85\x01\ +\xad\x02u\xff\x9a\x01\xad\x02w\xff\x9a\x01\xad\x02y\xff\ +\x9a\x01\xad\x02}\xff\x9a\x01\xad\x02~\xff\xd7\x01\xad\x02\ +\x7f\xffq\x01\xad\x02\x81\xff\xd7\x01\xad\x02\x83\xff\xd7\x01\ +\xad\x02\x84\xff\xd7\x01\xad\x02\x85\xffq\x01\xad\x02\x86\xff\ +\xd7\x01\xad\x02\x87\xffq\x01\xad\x02\x88\xff\xd7\x01\xad\x02\ +\x89\xffq\x01\xad\x02\x8a\xff\xd7\x01\xad\x02\x8b\xff\xd7\x01\ +\xad\x02\x8c\xff\xd7\x01\xad\x02\x8d\xffq\x01\xad\x02\x96\xff\ +\x9a\x01\xad\x02\x9a\xff\x9a\x01\xad\x02\x9e\xff\x9a\x01\xad\x02\ +\xa0\xff\xd7\x01\xad\x02\xa2\xff\xd7\x01\xad\x02\xa4\xff\x9a\x01\ +\xad\x02\xa6\xff\x9a\x01\xad\x02\xaa\xff\xae\x01\xad\x02\xac\xff\ +\x9a\x01\xad\x02\xae\xff\x9a\x01\xad\x02\xb0\xff\x9a\x01\xad\x02\ +\xb1\xff\xd7\x01\xad\x02\xb2\xffq\x01\xad\x02\xb3\xff\xd7\x01\ +\xad\x02\xb4\xffq\x01\xad\x02\xb5\x00)\x01\xad\x02\xb6\xff\ +\xae\x01\xad\x02\xb8\xff\xae\x01\xad\x02\xba\xff\xae\x01\xad\x02\ +\xbc\xff\xd7\x01\xad\x02\xbe\xff\xae\x01\xad\x02\xc0\xff\x9a\x01\ +\xad\x02\xc2\xff\x9a\x01\xad\x02\xc4\xff\x9a\x01\xad\x02\xc5\xff\ +\x9a\x01\xad\x02\xc6\xffq\x01\xad\x02\xc7\xff\x9a\x01\xad\x02\ +\xc8\xffq\x01\xad\x02\xcb\xff\xd7\x01\xad\x02\xcd\xff\x9a\x01\ +\xad\x02\xce\xff\x9a\x01\xad\x02\xcf\xff\x85\x01\xad\x02\xd1\xff\ +\x9a\x01\xad\x02\xd3\xff\x9a\x01\xad\x02\xd5\xff\x9a\x01\xad\x02\ +\xd7\xff\x9a\x01\xad\x02\xd9\xffq\x01\xad\x02\xdb\xffq\x01\ +\xad\x02\xdd\xffq\x01\xad\x02\xe0\xffq\x01\xad\x02\xe6\xff\ +\xd7\x01\xad\x02\xe8\xff\xd7\x01\xad\x02\xea\xff\xc3\x01\xad\x02\ +\xec\xff\x9a\x01\xad\x02\xee\xff\x9a\x01\xad\x02\xef\xff\xd7\x01\ +\xad\x02\xf0\xffq\x01\xad\x02\xf1\xff\xd7\x01\xad\x02\xf2\xff\ +q\x01\xad\x02\xf3\xff\xd7\x01\xad\x02\xf4\xffq\x01\xad\x02\ +\xf6\xff\xd7\x01\xad\x02\xf8\xff\xae\x01\xad\x02\xfa\xff\xae\x01\ +\xad\x02\xfc\xff\xae\x01\xad\x02\xfe\xff\x9a\x01\xad\x03\x00\xff\ +\x9a\x01\xad\x03\x02\xff\x9a\x01\xad\x03\x06\xff\xd7\x01\xad\x03\ +\x08\xff\xd7\x01\xad\x03\x09\xffq\x01\xad\x03\x0a\xffq\x01\ +\xad\x03\x0b\xffq\x01\xad\x03\x0c\xffq\x01\xad\x03\x0e\xff\ +\x9a\x01\xad\x03\x10\xff\x9a\x01\xad\x03\x11\xff\x9a\x01\xad\x03\ +\x12\xff\x85\x01\xad\x03\x14\xff\x9a\x01\xad\x03\x15\xff\xd7\x01\ +\xad\x03\x16\xffq\x01\xad\x03\x18\xff\xae\x01\xad\x03\x1a\xff\ +q\x01\xad\x03\x1b\xff\x9a\x01\xad\x03\x1c\xff\x85\x01\xae\x01\ +\xa3\x00\xe1\x01\xae\x02\xea\x00)\x01\xae\x03\x0e\xff\xd7\x01\ +\xae\x03\x10\xff\xd7\x01\xb0\x01\x9f\xff\xd7\x01\xb0\x01\xb8\xff\ +\xd7\x01\xb0\x01\xbb\xff\xd7\x01\xb0\x01\xbe\xff\xd7\x01\xb0\x01\ +\xc1\xff\xd7\x01\xb0\x01\xe1\xff\xd7\x01\xb0\x02l\xff\xd7\x01\ +\xb0\x02|\xff\xd7\x01\xb0\x02~\xff\xd7\x01\xb0\x02\x84\xff\ +\xd7\x01\xb0\x02\x86\xff\xd7\x01\xb0\x02\x88\xff\xd7\x01\xb0\x02\ +\x8a\xff\xd7\x01\xb0\x02\x8c\xff\xd7\x01\xb0\x02\xb1\xff\xd7\x01\ +\xb0\x02\xb3\xff\xd7\x01\xb0\x02\xbf\xff\xd7\x01\xb0\x02\xc0\xff\ +\xd7\x01\xb0\x02\xc1\xff\xd7\x01\xb0\x02\xc2\xff\xd7\x01\xb0\x02\ +\xc5\xff\x9a\x01\xb0\x02\xc7\xff\x9a\x01\xb0\x02\xd4\xff\xd7\x01\ +\xb0\x02\xd5\xff\xd7\x01\xb0\x02\xef\xff\xd7\x01\xb0\x02\xf1\xff\ +\xd7\x01\xb0\x02\xf3\xff\xd7\x01\xb0\x02\xfd\xff\xd7\x01\xb0\x02\ +\xfe\xff\xd7\x01\xb0\x03\x09\xff\xd7\x01\xb0\x03\x0b\xff\xd7\x01\ +\xb0\x03\x0e\xff\xd7\x01\xb0\x03\x10\xff\xd7\x01\xb0\x03\x15\xff\ +\xd7\x01\xb0\x03\x19\xff\xec\x01\xb1\x00\x0f\xff\xae\x01\xb1\x00\ +\x11\xff\xae\x01\xb1\x02\x08\xff\xae\x01\xb1\x02\x0c\xff\xae\x01\ +\xb1\x02\x80\xff\xec\x01\xb1\x02\x82\xff\xec\x01\xb1\x02\xb7\xff\ +\xec\x01\xb1\x02\xb9\xff\xec\x01\xb1\x03\x0d\xff\xd7\x01\xb1\x03\ +\x0f\xff\xd7\x01\xb4\x01\x9f\xff\xd7\x01\xb4\x01\xb8\xff\xd7\x01\ +\xb4\x01\xbb\xff\xd7\x01\xb4\x01\xbe\xff\xd7\x01\xb4\x01\xc1\xff\ +\xd7\x01\xb4\x01\xe1\xff\xd7\x01\xb4\x02l\xff\xd7\x01\xb4\x02\ +|\xff\xd7\x01\xb4\x02~\xff\xd7\x01\xb4\x02\x84\xff\xd7\x01\ +\xb4\x02\x86\xff\xd7\x01\xb4\x02\x88\xff\xd7\x01\xb4\x02\x8a\xff\ +\xd7\x01\xb4\x02\x8c\xff\xd7\x01\xb4\x02\xb1\xff\xd7\x01\xb4\x02\ +\xb3\xff\xd7\x01\xb4\x02\xbf\xff\xd7\x01\xb4\x02\xc0\xff\xd7\x01\ +\xb4\x02\xc1\xff\xd7\x01\xb4\x02\xc2\xff\xd7\x01\xb4\x02\xc5\xff\ +\x9a\x01\xb4\x02\xc7\xff\x9a\x01\xb4\x02\xd4\xff\xd7\x01\xb4\x02\ +\xd5\xff\xd7\x01\xb4\x02\xef\xff\xd7\x01\xb4\x02\xf1\xff\xd7\x01\ +\xb4\x02\xf3\xff\xd7\x01\xb4\x02\xfd\xff\xd7\x01\xb4\x02\xfe\xff\ +\xd7\x01\xb4\x03\x09\xff\xd7\x01\xb4\x03\x0b\xff\xd7\x01\xb4\x03\ +\x0e\xff\xd7\x01\xb4\x03\x10\xff\xd7\x01\xb4\x03\x15\xff\xd7\x01\ +\xb4\x03\x19\xff\xec\x01\xb8\x00\x0f\xff\xae\x01\xb8\x00\x11\xff\ +\xae\x01\xb8\x01\x9d\xff\xec\x01\xb8\x01\xa4\xff\xd7\x01\xb8\x01\ +\xa6\xff\xec\x01\xb8\x01\xa8\xff\xd7\x01\xb8\x01\xaa\xff\xd7\x01\ +\xb8\x01\xae\xff\xd7\x01\xb8\x01\xb0\xff\xd7\x01\xb8\x01\xb1\xff\ +\xec\x01\xb8\x01\xb5\xff\xd7\x01\xb8\x01\xbc\xff\xc3\x01\xb8\x01\ +\xbd\xff\xd7\x01\xb8\x01\xbf\xff\xd7\x01\xb8\x01\xc1\xff\xd7\x01\ +\xb8\x01\xc4\xff\xec\x01\xb8\x01\xc7\xff\xec\x01\xb8\x01\xce\xff\ +\xec\x01\xb8\x01\xd5\xff\xec\x01\xb8\x01\xf2\xff\xec\x01\xb8\x02\ +\x08\xff\xae\x01\xb8\x02\x0c\xff\xae\x01\xb8\x02r\xff\xd7\x01\ +\xb8\x02s\xff\xec\x01\xb8\x02z\xff\xec\x01\xb8\x02|\xff\ +\xd7\x01\xb8\x02\x80\xff\xec\x01\xb8\x02\x82\xff\xec\x01\xb8\x02\ +\x9f\xff\xd7\x01\xb8\x02\xa1\xff\xec\x01\xb8\x02\xa9\xff\xec\x01\ +\xb8\x02\xb5\xff\xc3\x01\xb8\x02\xb7\xff\xec\x01\xb8\x02\xb9\xff\ +\xec\x01\xb8\x02\xbb\xff\xd7\x01\xb8\x02\xbd\xff\xec\x01\xb8\x02\ +\xbf\xff\xd7\x01\xb8\x02\xc1\xff\xd7\x01\xb8\x02\xca\xff\xd7\x01\ +\xb8\x02\xce\xff\xd7\x01\xb8\x02\xcf\xff\xec\x01\xb8\x02\xd4\xff\ +\xd7\x01\xb8\x02\xd9\xff\xd7\x01\xb8\x02\xdb\xff\xd7\x01\xb8\x02\ +\xdd\xff\xd7\x01\xb8\x02\xe5\xff\xd7\x01\xb8\x02\xe7\xff\xec\x01\ +\xb8\x02\xf5\xff\xec\x01\xb8\x02\xf7\xff\xd7\x01\xb8\x02\xf9\xff\ +\xd7\x01\xb8\x02\xfb\xff\xd7\x01\xb8\x02\xfd\xff\xd7\x01\xb8\x03\ +\x05\xff\xd7\x01\xb8\x03\x07\xff\xd7\x01\xb8\x03\x0d\xff\xd7\x01\ +\xb8\x03\x0f\xff\xd7\x01\xb8\x03\x11\xff\xd7\x01\xb8\x03\x12\xff\ +\xec\x01\xb8\x03\x17\xff\xec\x01\xb8\x03\x1b\xff\xd7\x01\xb8\x03\ +\x1c\xff\xec\x01\xba\x00\x0f\xfe\xf6\x01\xba\x00\x11\xfe\xf6\x01\ +\xba\x01\xa4\xff\x85\x01\xba\x01\xaa\xff\x9a\x01\xba\x01\xae\xff\ +\x85\x01\xba\x01\xb0\xff\xd7\x01\xba\x01\xb5\xff\x85\x01\xba\x01\ +\xbf\xff\xd7\x01\xba\x01\xce\xff\x9a\x01\xba\x01\xd5\xff\x9a\x01\ +\xba\x01\xf2\xff\x9a\x01\xba\x02\x08\xfe\xf6\x01\xba\x02\x0c\xfe\ +\xf6\x01\xba\x02r\xff\x9a\x01\xba\x02s\xff\x9a\x01\xba\x02\ +v\xff\xec\x01\xba\x02\x9f\xff\xd7\x01\xba\x02\xbb\xff\xd7\x01\ +\xba\x02\xca\xff\xd7\x01\xba\x02\xce\xff\x85\x01\xba\x02\xcf\xff\ +\x9a\x01\xba\x02\xd9\xff\x9a\x01\xba\x02\xdb\xff\x9a\x01\xba\x02\ +\xdd\xff\x9a\x01\xba\x02\xe5\xff\xd7\x01\xba\x03\x05\xff\xd7\x01\ +\xba\x03\x07\xff\xd7\x01\xba\x03\x09\xff\xae\x01\xba\x03\x0b\xff\ +\xae\x01\xba\x03\x11\xff\x85\x01\xba\x03\x12\xff\x9a\x01\xba\x03\ +\x1b\xff\x85\x01\xba\x03\x1c\xff\x9a\x01\xbb\x01\x9f\xff\xd7\x01\ +\xbb\x01\xb8\xff\xd7\x01\xbb\x01\xbb\xff\xd7\x01\xbb\x01\xbe\xff\ +\xd7\x01\xbb\x01\xe1\xff\xd7\x01\xbb\x02l\xff\xd7\x01\xbb\x02\ +~\xff\xd7\x01\xbb\x02\x84\xff\xd7\x01\xbb\x02\x86\xff\xd7\x01\ +\xbb\x02\x88\xff\xd7\x01\xbb\x02\x8a\xff\xd7\x01\xbb\x02\x8c\xff\ +\xd7\x01\xbb\x02\xb1\xff\xd7\x01\xbb\x02\xb3\xff\xd7\x01\xbb\x02\ +\xc0\xff\xd7\x01\xbb\x02\xc2\xff\xd7\x01\xbb\x02\xc5\xff\xd7\x01\ +\xbb\x02\xc7\xff\xd7\x01\xbb\x02\xd5\xff\xd7\x01\xbb\x02\xef\xff\ +\xd7\x01\xbb\x02\xf1\xff\xd7\x01\xbb\x02\xf3\xff\xd7\x01\xbb\x02\ +\xfe\xff\xd7\x01\xbb\x03\x09\xff\xd7\x01\xbb\x03\x0b\xff\xd7\x01\ +\xbb\x03\x0e\xff\xd7\x01\xbb\x03\x10\xff\xd7\x01\xbb\x03\x15\xff\ +\xd7\x01\xbc\x00\x0f\xff\x85\x01\xbc\x00\x10\xff\xae\x01\xbc\x00\ +\x11\xff\x85\x01\xbc\x01\x9f\xff\xd7\x01\xbc\x01\xa4\xff\x9a\x01\ +\xbc\x01\xaa\xffq\x01\xbc\x01\xae\xff\x9a\x01\xbc\x01\xb5\xff\ +\x9a\x01\xbc\x01\xb8\xff\xd7\x01\xbc\x01\xbb\xff\xd7\x01\xbc\x01\ +\xbc\x00)\x01\xbc\x01\xbe\xff\xae\x01\xbc\x01\xcc\xff\x9a\x01\ +\xbc\x01\xcd\xff\x9a\x01\xbc\x01\xce\xff\x85\x01\xbc\x01\xcf\xff\ +q\x01\xbc\x01\xd0\xff\xd7\x01\xbc\x01\xd1\xff\xd7\x01\xbc\x01\ +\xd2\xff\x9a\x01\xbc\x01\xd3\xff\x9a\x01\xbc\x01\xd4\xff\x9a\x01\ +\xbc\x01\xd5\xff\x85\x01\xbc\x01\xd6\xff\x9a\x01\xbc\x01\xd7\xff\ +\x9a\x01\xbc\x01\xd8\xffq\x01\xbc\x01\xd9\xff\x9a\x01\xbc\x01\ +\xda\xff\x9a\x01\xbc\x01\xdb\xffq\x01\xbc\x01\xdc\xff\xae\x01\ +\xbc\x01\xdd\xff\xae\x01\xbc\x01\xde\xffq\x01\xbc\x01\xdf\xff\ +\xd7\x01\xbc\x01\xe0\xff\x9a\x01\xbc\x01\xe1\xff\x9a\x01\xbc\x01\ +\xe2\xff\x9a\x01\xbc\x01\xe3\xff\x9a\x01\xbc\x01\xe4\xff\xae\x01\ +\xbc\x01\xe5\xff\x9a\x01\xbc\x01\xe6\xff\x9a\x01\xbc\x01\xe7\xff\ +\xd7\x01\xbc\x01\xe8\xff\x9a\x01\xbc\x01\xe9\xff\xc3\x01\xbc\x01\ +\xea\xffq\x01\xbc\x01\xec\xff\x9a\x01\xbc\x01\xed\xffq\x01\ +\xbc\x01\xee\xff\x85\x01\xbc\x01\xf2\xff\x85\x01\xbc\x01\xf3\xff\ +\x9a\x01\xbc\x01\xf5\xff\x9a\x01\xbc\x01\xf6\xff\xae\x01\xbc\x01\ +\xf7\xff\x9a\x01\xbc\x01\xf9\xff\x9a\x01\xbc\x02\x02\xff\xae\x01\ +\xbc\x02\x03\xff\xae\x01\xbc\x02\x04\xff\xae\x01\xbc\x02\x08\xff\ +\x85\x01\xbc\x02\x0c\xff\x85\x01\xbc\x02j\xffq\x01\xbc\x02\ +k\xff\x9a\x01\xbc\x02l\xff\xd7\x01\xbc\x02m\xff\xd7\x01\ +\xbc\x02q\xff\x9a\x01\xbc\x02r\xffq\x01\xbc\x02s\xff\ +\x85\x01\xbc\x02u\xff\x9a\x01\xbc\x02w\xff\x9a\x01\xbc\x02\ +y\xff\x9a\x01\xbc\x02}\xff\x9a\x01\xbc\x02~\xff\xd7\x01\ +\xbc\x02\x7f\xffq\x01\xbc\x02\x81\xff\xd7\x01\xbc\x02\x83\xff\ +\xd7\x01\xbc\x02\x84\xff\xd7\x01\xbc\x02\x85\xffq\x01\xbc\x02\ +\x86\xff\xd7\x01\xbc\x02\x87\xffq\x01\xbc\x02\x88\xff\xd7\x01\ +\xbc\x02\x89\xffq\x01\xbc\x02\x8a\xff\xd7\x01\xbc\x02\x8b\xff\ +\xd7\x01\xbc\x02\x8c\xff\xd7\x01\xbc\x02\x8d\xffq\x01\xbc\x02\ +\x96\xff\x9a\x01\xbc\x02\x9a\xff\x9a\x01\xbc\x02\x9e\xff\x9a\x01\ +\xbc\x02\xa0\xff\xd7\x01\xbc\x02\xa2\xff\xd7\x01\xbc\x02\xa4\xff\ +\x9a\x01\xbc\x02\xa6\xff\x9a\x01\xbc\x02\xaa\xff\xae\x01\xbc\x02\ +\xac\xff\x9a\x01\xbc\x02\xae\xff\x9a\x01\xbc\x02\xb0\xff\x9a\x01\ +\xbc\x02\xb1\xff\xd7\x01\xbc\x02\xb2\xffq\x01\xbc\x02\xb3\xff\ +\xd7\x01\xbc\x02\xb4\xffq\x01\xbc\x02\xb5\x00)\x01\xbc\x02\ +\xb6\xff\xae\x01\xbc\x02\xb8\xff\xae\x01\xbc\x02\xba\xff\xae\x01\ +\xbc\x02\xbc\xff\xd7\x01\xbc\x02\xbe\xff\xae\x01\xbc\x02\xc0\xff\ +\x9a\x01\xbc\x02\xc2\xff\x9a\x01\xbc\x02\xc4\xff\x9a\x01\xbc\x02\ +\xc5\xff\x9a\x01\xbc\x02\xc6\xffq\x01\xbc\x02\xc7\xff\x9a\x01\ +\xbc\x02\xc8\xffq\x01\xbc\x02\xcb\xff\xd7\x01\xbc\x02\xcd\xff\ +\x9a\x01\xbc\x02\xce\xff\x9a\x01\xbc\x02\xcf\xff\x85\x01\xbc\x02\ +\xd1\xff\x9a\x01\xbc\x02\xd3\xff\x9a\x01\xbc\x02\xd5\xff\x9a\x01\ +\xbc\x02\xd7\xff\x9a\x01\xbc\x02\xd9\xffq\x01\xbc\x02\xdb\xff\ +q\x01\xbc\x02\xdd\xffq\x01\xbc\x02\xe0\xffq\x01\xbc\x02\ +\xe6\xff\xd7\x01\xbc\x02\xe8\xff\xd7\x01\xbc\x02\xea\xff\xc3\x01\ +\xbc\x02\xec\xff\x9a\x01\xbc\x02\xee\xff\x9a\x01\xbc\x02\xef\xff\ +\xd7\x01\xbc\x02\xf0\xffq\x01\xbc\x02\xf1\xff\xd7\x01\xbc\x02\ +\xf2\xffq\x01\xbc\x02\xf3\xff\xd7\x01\xbc\x02\xf4\xffq\x01\ +\xbc\x02\xf6\xff\xd7\x01\xbc\x02\xf8\xff\xae\x01\xbc\x02\xfa\xff\ +\xae\x01\xbc\x02\xfc\xff\xae\x01\xbc\x02\xfe\xff\x9a\x01\xbc\x03\ +\x00\xff\x9a\x01\xbc\x03\x02\xff\x9a\x01\xbc\x03\x06\xff\xd7\x01\ +\xbc\x03\x08\xff\xd7\x01\xbc\x03\x09\xffq\x01\xbc\x03\x0a\xff\ +q\x01\xbc\x03\x0b\xffq\x01\xbc\x03\x0c\xffq\x01\xbc\x03\ +\x0e\xff\x9a\x01\xbc\x03\x10\xff\x9a\x01\xbc\x03\x11\xff\x9a\x01\ +\xbc\x03\x12\xff\x85\x01\xbc\x03\x14\xff\x9a\x01\xbc\x03\x15\xff\ +\xd7\x01\xbc\x03\x16\xffq\x01\xbc\x03\x18\xff\xae\x01\xbc\x03\ +\x1a\xffq\x01\xbc\x03\x1b\xff\x9a\x01\xbc\x03\x1c\xff\x85\x01\ +\xbd\x00\x0f\xff\x85\x01\xbd\x00\x11\xff\x85\x01\xbd\x01\x9f\xff\ +\xec\x01\xbd\x01\xa4\xff\x9a\x01\xbd\x01\xaa\xffq\x01\xbd\x01\ +\xae\xff\x9a\x01\xbd\x01\xb5\xff\x9a\x01\xbd\x01\xb8\xff\xec\x01\ +\xbd\x01\xbb\xff\xec\x01\xbd\x01\xbe\xff\xc3\x01\xbd\x01\xc9\xff\ +\xec\x01\xbd\x01\xce\xff\xae\x01\xbd\x01\xcf\xff\xd7\x01\xbd\x01\ +\xd5\xff\xae\x01\xbd\x01\xd8\xff\xd7\x01\xbd\x01\xdb\xff\xd7\x01\ +\xbd\x01\xde\xff\xd7\x01\xbd\x01\xe1\xff\xd7\x01\xbd\x01\xea\xff\ +\xd7\x01\xbd\x01\xeb\x00f\x01\xbd\x01\xed\xff\xd7\x01\xbd\x01\ +\xee\xff\xec\x01\xbd\x01\xf2\xff\xae\x01\xbd\x01\xf4\x00f\x01\ +\xbd\x02\x08\xff\x85\x01\xbd\x02\x0c\xff\x85\x01\xbd\x02j\xff\ +\xd7\x01\xbd\x02l\xff\xec\x01\xbd\x02r\xffq\x01\xbd\x02\ +s\xff\xae\x01\xbd\x02~\xff\xec\x01\xbd\x02\x7f\xff\xd7\x01\ +\xbd\x02\x84\xff\xec\x01\xbd\x02\x85\xff\xd7\x01\xbd\x02\x86\xff\ +\xec\x01\xbd\x02\x87\xff\xd7\x01\xbd\x02\x88\xff\xec\x01\xbd\x02\ +\x89\xff\xd7\x01\xbd\x02\x8a\xff\xec\x01\xbd\x02\x8c\xff\xec\x01\ +\xbd\x02\x8d\xff\xd7\x01\xbd\x02\x98\x00f\x01\xbd\x02\xa8\x00\ +f\x01\xbd\x02\xb1\xff\xec\x01\xbd\x02\xb2\xff\xd7\x01\xbd\x02\ +\xb3\xff\xec\x01\xbd\x02\xb4\xff\xd7\x01\xbd\x02\xc0\xff\xd7\x01\ +\xbd\x02\xc2\xff\xd7\x01\xbd\x02\xc5\xff\xd7\x01\xbd\x02\xc6\xff\ +\xc3\x01\xbd\x02\xc7\xff\xd7\x01\xbd\x02\xc8\xff\xc3\x01\xbd\x02\ +\xce\xff\x9a\x01\xbd\x02\xcf\xff\xae\x01\xbd\x02\xd5\xff\xd7\x01\ +\xbd\x02\xd9\xffq\x01\xbd\x02\xdb\xffq\x01\xbd\x02\xdd\xff\ +q\x01\xbd\x02\xe0\xff\xd7\x01\xbd\x02\xef\xff\xec\x01\xbd\x02\ +\xf0\xff\xd7\x01\xbd\x02\xf1\xff\xec\x01\xbd\x02\xf2\xff\xd7\x01\ +\xbd\x02\xf3\xff\xec\x01\xbd\x02\xf4\xff\xd7\x01\xbd\x02\xfe\xff\ +\xd7\x01\xbd\x03\x09\xffq\x01\xbd\x03\x0a\xff\xd7\x01\xbd\x03\ +\x0b\xffq\x01\xbd\x03\x0c\xff\xd7\x01\xbd\x03\x11\xff\x9a\x01\ +\xbd\x03\x12\xff\xae\x01\xbd\x03\x15\xff\xec\x01\xbd\x03\x16\xff\ +\xd7\x01\xbd\x03\x1a\xff\xd7\x01\xbd\x03\x1b\xff\x9a\x01\xbd\x03\ +\x1c\xff\xae\x01\xbe\x00\x0f\xff\xae\x01\xbe\x00\x11\xff\xae\x01\ +\xbe\x01\x9d\xff\xd7\x01\xbe\x01\xa4\xff\xd7\x01\xbe\x01\xa6\xff\ +\xd7\x01\xbe\x01\xa8\xff\xc3\x01\xbe\x01\xaa\xff\xd7\x01\xbe\x01\ +\xae\xff\xd7\x01\xbe\x01\xb0\xff\xd7\x01\xbe\x01\xb1\xff\xd7\x01\ +\xbe\x01\xb5\xff\xd7\x01\xbe\x01\xbc\xff\xc3\x01\xbe\x01\xbd\xff\ +\xc3\x01\xbe\x01\xbf\xff\xd7\x01\xbe\x01\xc4\xff\xd7\x01\xbe\x01\ +\xc7\xff\xd7\x01\xbe\x01\xce\xff\xec\x01\xbe\x01\xd5\xff\xec\x01\ +\xbe\x01\xf2\xff\xec\x01\xbe\x02\x08\xff\xae\x01\xbe\x02\x0c\xff\ +\xae\x01\xbe\x02r\xff\xd7\x01\xbe\x02s\xff\xec\x01\xbe\x02\ +z\xff\xd7\x01\xbe\x02\x80\xff\xec\x01\xbe\x02\x82\xff\xec\x01\ +\xbe\x02\x9f\xff\xd7\x01\xbe\x02\xa1\xff\xd7\x01\xbe\x02\xa9\xff\ +\xd7\x01\xbe\x02\xb5\xff\xc3\x01\xbe\x02\xb7\xff\xc3\x01\xbe\x02\ +\xb9\xff\xc3\x01\xbe\x02\xbb\xff\xd7\x01\xbe\x02\xbd\xff\xd7\x01\ +\xbe\x02\xca\xff\xd7\x01\xbe\x02\xce\xff\xd7\x01\xbe\x02\xcf\xff\ +\xec\x01\xbe\x02\xd9\xff\xd7\x01\xbe\x02\xdb\xff\xd7\x01\xbe\x02\ +\xdd\xff\xd7\x01\xbe\x02\xe5\xff\xd7\x01\xbe\x02\xe7\xff\xd7\x01\ +\xbe\x02\xf5\xff\xd7\x01\xbe\x02\xf7\xff\xc3\x01\xbe\x02\xf9\xff\ +\xc3\x01\xbe\x02\xfb\xff\xc3\x01\xbe\x03\x05\xff\xd7\x01\xbe\x03\ +\x07\xff\xd7\x01\xbe\x03\x0d\xff\xd7\x01\xbe\x03\x0f\xff\xd7\x01\ +\xbe\x03\x11\xff\xd7\x01\xbe\x03\x12\xff\xec\x01\xbe\x03\x17\xff\ +\xd7\x01\xbe\x03\x1b\xff\xd7\x01\xbe\x03\x1c\xff\xec\x01\xbf\x01\ +\x9f\xff\xd7\x01\xbf\x01\xb8\xff\xd7\x01\xbf\x01\xbb\xff\xd7\x01\ +\xbf\x01\xbe\xff\xd7\x01\xbf\x01\xc1\xff\xd7\x01\xbf\x01\xe1\xff\ +\xd7\x01\xbf\x02l\xff\xd7\x01\xbf\x02|\xff\xd7\x01\xbf\x02\ +~\xff\xd7\x01\xbf\x02\x84\xff\xd7\x01\xbf\x02\x86\xff\xd7\x01\ +\xbf\x02\x88\xff\xd7\x01\xbf\x02\x8a\xff\xd7\x01\xbf\x02\x8c\xff\ +\xd7\x01\xbf\x02\xb1\xff\xd7\x01\xbf\x02\xb3\xff\xd7\x01\xbf\x02\ +\xbf\xff\xd7\x01\xbf\x02\xc0\xff\xd7\x01\xbf\x02\xc1\xff\xd7\x01\ +\xbf\x02\xc2\xff\xd7\x01\xbf\x02\xc5\xff\x9a\x01\xbf\x02\xc7\xff\ +\x9a\x01\xbf\x02\xd4\xff\xd7\x01\xbf\x02\xd5\xff\xd7\x01\xbf\x02\ +\xef\xff\xd7\x01\xbf\x02\xf1\xff\xd7\x01\xbf\x02\xf3\xff\xd7\x01\ +\xbf\x02\xfd\xff\xd7\x01\xbf\x02\xfe\xff\xd7\x01\xbf\x03\x09\xff\ +\xd7\x01\xbf\x03\x0b\xff\xd7\x01\xbf\x03\x0e\xff\xd7\x01\xbf\x03\ +\x10\xff\xd7\x01\xbf\x03\x15\xff\xd7\x01\xbf\x03\x19\xff\xec\x01\ +\xc0\x01\xa3\x00\xe1\x01\xc0\x02\xea\x00)\x01\xc0\x03\x0e\xff\ +\xd7\x01\xc0\x03\x10\xff\xd7\x01\xc3\x01\xa3\x00\xe1\x01\xc3\x02\ +\xea\x00)\x01\xc3\x03\x0e\xff\xd7\x01\xc3\x03\x10\xff\xd7\x01\ +\xc4\x00\x05\xff\xae\x01\xc4\x00\x0a\xff\xae\x01\xc4\x01\x9d\xff\ +\x85\x01\xc4\x01\xa6\xff\x85\x01\xc4\x01\xa8\xff\xd7\x01\xc4\x01\ +\xbc\xff\x9a\x01\xc4\x01\xbd\xff\xd7\x01\xc4\x01\xc1\xff\x9a\x01\ +\xc4\x01\xc4\xff\x85\x01\xc4\x01\xdc\xff\xd7\x01\xc4\x01\xdd\xff\ +\xd7\x01\xc4\x01\xe1\xff\xd7\x01\xc4\x01\xe4\xff\xd7\x01\xc4\x01\ +\xf6\xff\xd7\x01\xc4\x02\x07\xff\xae\x01\xc4\x02\x0b\xff\xae\x01\ +\xc4\x02n\xff\xae\x01\xc4\x02|\xff\x9a\x01\xc4\x02\x80\xff\ +\xae\x01\xc4\x02\x82\xff\xae\x01\xc4\x02\x97\xff\xae\x01\xc4\x02\ +\x9b\xff\xae\x01\xc4\x02\xa7\xff\xae\x01\xc4\x02\xa9\xff\x85\x01\ +\xc4\x02\xaa\xff\xd7\x01\xc4\x02\xb5\xff\x9a\x01\xc4\x02\xb6\xff\ +\xd7\x01\xc4\x02\xb7\xff\x9a\x01\xc4\x02\xb8\xff\xd7\x01\xc4\x02\ +\xb9\xff\x9a\x01\xc4\x02\xba\xff\xd7\x01\xc4\x02\xbd\xff\x85\x01\ +\xc4\x02\xbe\xff\xd7\x01\xc4\x02\xbf\xff\x9a\x01\xc4\x02\xc0\xff\ +\xd7\x01\xc4\x02\xc1\xff\x9a\x01\xc4\x02\xc2\xff\xd7\x01\xc4\x02\ +\xd4\xff\x9a\x01\xc4\x02\xd5\xff\xd7\x01\xc4\x02\xf7\xff\xd7\x01\ +\xc4\x02\xf8\xff\xd7\x01\xc4\x02\xf9\xff\xd7\x01\xc4\x02\xfa\xff\ +\xd7\x01\xc4\x02\xfb\xff\xd7\x01\xc4\x02\xfc\xff\xd7\x01\xc4\x02\ +\xfd\xff\x9a\x01\xc4\x02\xfe\xff\xd7\x01\xc4\x03\x03\xff\xae\x01\ +\xc4\x03\x0d\xff\x9a\x01\xc4\x03\x0e\xff\xc3\x01\xc4\x03\x0f\xff\ +\x9a\x01\xc4\x03\x10\xff\xc3\x01\xc4\x03\x17\xff\x85\x01\xc4\x03\ +\x18\xff\xd7\x01\xc6\x00\x05\xff\xae\x01\xc6\x00\x0a\xff\xae\x01\ +\xc6\x01\x9d\xff\x85\x01\xc6\x01\xa6\xff\x85\x01\xc6\x01\xa8\xff\ +\xd7\x01\xc6\x01\xbc\xff\x9a\x01\xc6\x01\xbd\xff\xd7\x01\xc6\x01\ +\xc1\xff\x9a\x01\xc6\x01\xc4\xff\x85\x01\xc6\x01\xdc\xff\xd7\x01\ +\xc6\x01\xdd\xff\xd7\x01\xc6\x01\xe1\xff\xd7\x01\xc6\x01\xe4\xff\ +\xd7\x01\xc6\x01\xf6\xff\xd7\x01\xc6\x02\x07\xff\xae\x01\xc6\x02\ +\x0b\xff\xae\x01\xc6\x02n\xff\xae\x01\xc6\x02|\xff\x9a\x01\ +\xc6\x02\x80\xff\xae\x01\xc6\x02\x82\xff\xae\x01\xc6\x02\x97\xff\ +\xae\x01\xc6\x02\x9b\xff\xae\x01\xc6\x02\xa7\xff\xae\x01\xc6\x02\ +\xa9\xff\x85\x01\xc6\x02\xaa\xff\xd7\x01\xc6\x02\xb5\xff\x9a\x01\ +\xc6\x02\xb6\xff\xd7\x01\xc6\x02\xb7\xff\x9a\x01\xc6\x02\xb8\xff\ +\xd7\x01\xc6\x02\xb9\xff\x9a\x01\xc6\x02\xba\xff\xd7\x01\xc6\x02\ +\xbd\xff\x85\x01\xc6\x02\xbe\xff\xd7\x01\xc6\x02\xbf\xff\x9a\x01\ +\xc6\x02\xc0\xff\xd7\x01\xc6\x02\xc1\xff\x9a\x01\xc6\x02\xc2\xff\ +\xd7\x01\xc6\x02\xd4\xff\x9a\x01\xc6\x02\xd5\xff\xd7\x01\xc6\x02\ +\xf7\xff\xd7\x01\xc6\x02\xf8\xff\xd7\x01\xc6\x02\xf9\xff\xd7\x01\ +\xc6\x02\xfa\xff\xd7\x01\xc6\x02\xfb\xff\xd7\x01\xc6\x02\xfc\xff\ +\xd7\x01\xc6\x02\xfd\xff\x9a\x01\xc6\x02\xfe\xff\xd7\x01\xc6\x03\ +\x03\xff\xae\x01\xc6\x03\x0d\xff\x9a\x01\xc6\x03\x0e\xff\xc3\x01\ +\xc6\x03\x0f\xff\x9a\x01\xc6\x03\x10\xff\xc3\x01\xc6\x03\x17\xff\ +\x85\x01\xc6\x03\x18\xff\xd7\x01\xc7\x00\x0f\xff\xae\x01\xc7\x00\ +\x11\xff\xae\x01\xc7\x01\x9d\xff\xec\x01\xc7\x01\xa4\xff\xd7\x01\ +\xc7\x01\xa6\xff\xec\x01\xc7\x01\xa8\xff\xd7\x01\xc7\x01\xaa\xff\ +\xd7\x01\xc7\x01\xae\xff\xd7\x01\xc7\x01\xb0\xff\xd7\x01\xc7\x01\ +\xb1\xff\xec\x01\xc7\x01\xb5\xff\xd7\x01\xc7\x01\xbc\xff\xc3\x01\ +\xc7\x01\xbd\xff\xd7\x01\xc7\x01\xbf\xff\xd7\x01\xc7\x01\xc1\xff\ +\xd7\x01\xc7\x01\xc4\xff\xec\x01\xc7\x01\xc7\xff\xec\x01\xc7\x01\ +\xce\xff\xec\x01\xc7\x01\xd5\xff\xec\x01\xc7\x01\xf2\xff\xec\x01\ +\xc7\x02\x08\xff\xae\x01\xc7\x02\x0c\xff\xae\x01\xc7\x02r\xff\ +\xd7\x01\xc7\x02s\xff\xec\x01\xc7\x02z\xff\xec\x01\xc7\x02\ +|\xff\xd7\x01\xc7\x02\x80\xff\xec\x01\xc7\x02\x82\xff\xec\x01\ +\xc7\x02\x9f\xff\xd7\x01\xc7\x02\xa1\xff\xec\x01\xc7\x02\xa9\xff\ +\xec\x01\xc7\x02\xb5\xff\xc3\x01\xc7\x02\xb7\xff\xec\x01\xc7\x02\ +\xb9\xff\xec\x01\xc7\x02\xbb\xff\xd7\x01\xc7\x02\xbd\xff\xec\x01\ +\xc7\x02\xbf\xff\xd7\x01\xc7\x02\xc1\xff\xd7\x01\xc7\x02\xca\xff\ +\xd7\x01\xc7\x02\xce\xff\xd7\x01\xc7\x02\xcf\xff\xec\x01\xc7\x02\ +\xd4\xff\xd7\x01\xc7\x02\xd9\xff\xd7\x01\xc7\x02\xdb\xff\xd7\x01\ +\xc7\x02\xdd\xff\xd7\x01\xc7\x02\xe5\xff\xd7\x01\xc7\x02\xe7\xff\ +\xec\x01\xc7\x02\xf5\xff\xec\x01\xc7\x02\xf7\xff\xd7\x01\xc7\x02\ +\xf9\xff\xd7\x01\xc7\x02\xfb\xff\xd7\x01\xc7\x02\xfd\xff\xd7\x01\ +\xc7\x03\x05\xff\xd7\x01\xc7\x03\x07\xff\xd7\x01\xc7\x03\x0d\xff\ +\xd7\x01\xc7\x03\x0f\xff\xd7\x01\xc7\x03\x11\xff\xd7\x01\xc7\x03\ +\x12\xff\xec\x01\xc7\x03\x17\xff\xec\x01\xc7\x03\x1b\xff\xd7\x01\ +\xc7\x03\x1c\xff\xec\x01\xc8\x00\x0f\xff\xae\x01\xc8\x00\x11\xff\ +\xae\x01\xc8\x01\x9d\xff\xec\x01\xc8\x01\xa4\xff\xd7\x01\xc8\x01\ +\xa6\xff\xec\x01\xc8\x01\xa8\xff\xd7\x01\xc8\x01\xaa\xff\xd7\x01\ +\xc8\x01\xae\xff\xd7\x01\xc8\x01\xb0\xff\xd7\x01\xc8\x01\xb1\xff\ +\xec\x01\xc8\x01\xb5\xff\xd7\x01\xc8\x01\xbc\xff\xc3\x01\xc8\x01\ +\xbd\xff\xd7\x01\xc8\x01\xbf\xff\xd7\x01\xc8\x01\xc1\xff\xd7\x01\ +\xc8\x01\xc4\xff\xec\x01\xc8\x01\xc7\xff\xec\x01\xc8\x01\xce\xff\ +\xec\x01\xc8\x01\xd5\xff\xec\x01\xc8\x01\xf2\xff\xec\x01\xc8\x02\ +\x08\xff\xae\x01\xc8\x02\x0c\xff\xae\x01\xc8\x02r\xff\xd7\x01\ +\xc8\x02s\xff\xec\x01\xc8\x02z\xff\xec\x01\xc8\x02|\xff\ +\xd7\x01\xc8\x02\x80\xff\xec\x01\xc8\x02\x82\xff\xec\x01\xc8\x02\ +\x9f\xff\xd7\x01\xc8\x02\xa1\xff\xec\x01\xc8\x02\xa9\xff\xec\x01\ +\xc8\x02\xb5\xff\xc3\x01\xc8\x02\xb7\xff\xec\x01\xc8\x02\xb9\xff\ +\xec\x01\xc8\x02\xbb\xff\xd7\x01\xc8\x02\xbd\xff\xec\x01\xc8\x02\ +\xbf\xff\xd7\x01\xc8\x02\xc1\xff\xd7\x01\xc8\x02\xca\xff\xd7\x01\ +\xc8\x02\xce\xff\xd7\x01\xc8\x02\xcf\xff\xec\x01\xc8\x02\xd4\xff\ +\xd7\x01\xc8\x02\xd9\xff\xd7\x01\xc8\x02\xdb\xff\xd7\x01\xc8\x02\ +\xdd\xff\xd7\x01\xc8\x02\xe5\xff\xd7\x01\xc8\x02\xe7\xff\xec\x01\ +\xc8\x02\xf5\xff\xec\x01\xc8\x02\xf7\xff\xd7\x01\xc8\x02\xf9\xff\ +\xd7\x01\xc8\x02\xfb\xff\xd7\x01\xc8\x02\xfd\xff\xd7\x01\xc8\x03\ +\x05\xff\xd7\x01\xc8\x03\x07\xff\xd7\x01\xc8\x03\x0d\xff\xd7\x01\ +\xc8\x03\x0f\xff\xd7\x01\xc8\x03\x11\xff\xd7\x01\xc8\x03\x12\xff\ +\xec\x01\xc8\x03\x17\xff\xec\x01\xc8\x03\x1b\xff\xd7\x01\xc8\x03\ +\x1c\xff\xec\x01\xca\x00\x05\xff\xec\x01\xca\x00\x0a\xff\xec\x01\ +\xca\x02\x07\xff\xec\x01\xca\x02\x0b\xff\xec\x01\xcc\x01\xe9\x00\ +)\x01\xcd\x00\x0f\xff\x9a\x01\xcd\x00\x10\xff\xd7\x01\xcd\x00\ +\x11\xff\x9a\x01\xcd\x01\xce\xff\xc3\x01\xcd\x01\xcf\xff\xec\x01\ +\xcd\x01\xd5\xff\xc3\x01\xcd\x01\xd8\xff\xec\x01\xcd\x01\xdb\xff\ +\xec\x01\xcd\x01\xde\xff\xec\x01\xcd\x01\xea\xff\xec\x01\xcd\x01\ +\xed\xff\xec\x01\xcd\x01\xf2\xff\xc3\x01\xcd\x02\x02\xff\xd7\x01\ +\xcd\x02\x03\xff\xd7\x01\xcd\x02\x04\xff\xd7\x01\xcd\x02\x08\xff\ +\x9a\x01\xcd\x02\x0c\xff\x9a\x01\xcd\x02j\xff\xec\x01\xcd\x02\ +s\xff\xc3\x01\xcd\x02\x7f\xff\xec\x01\xcd\x02\x85\xff\xec\x01\ +\xcd\x02\x87\xff\xec\x01\xcd\x02\x89\xff\xec\x01\xcd\x02\x8d\xff\ +\xec\x01\xcd\x02\xb2\xff\xec\x01\xcd\x02\xb4\xff\xec\x01\xcd\x02\ +\xcf\xff\xc3\x01\xcd\x02\xe0\xff\xec\x01\xcd\x02\xf0\xff\xec\x01\ +\xcd\x02\xf2\xff\xec\x01\xcd\x02\xf4\xff\xec\x01\xcd\x03\x0a\xff\ +\xec\x01\xcd\x03\x0c\xff\xec\x01\xcd\x03\x12\xff\xc3\x01\xcd\x03\ +\x16\xff\xec\x01\xcd\x03\x1a\xff\xec\x01\xcd\x03\x1c\xff\xc3\x01\ +\xce\x00\x05\xff\xec\x01\xce\x00\x0a\xff\xec\x01\xce\x02\x07\xff\ +\xec\x01\xce\x02\x0b\xff\xec\x01\xcf\x00\x05\xff\xec\x01\xcf\x00\ +\x0a\xff\xec\x01\xcf\x02\x07\xff\xec\x01\xcf\x02\x0b\xff\xec\x01\ +\xd0\x01\xcf\xff\xd7\x01\xd0\x01\xd8\xff\xd7\x01\xd0\x01\xdb\xff\ +\xd7\x01\xd0\x01\xde\xff\xd7\x01\xd0\x01\xe1\xff\xd7\x01\xd0\x01\ +\xea\xff\xd7\x01\xd0\x01\xed\xff\xd7\x01\xd0\x02j\xff\xd7\x01\ +\xd0\x02\x7f\xff\xd7\x01\xd0\x02\x85\xff\xd7\x01\xd0\x02\x87\xff\ +\xd7\x01\xd0\x02\x89\xff\xd7\x01\xd0\x02\x8d\xff\xd7\x01\xd0\x02\ +\xb2\xff\xd7\x01\xd0\x02\xb4\xff\xd7\x01\xd0\x02\xc0\xff\xd7\x01\ +\xd0\x02\xc2\xff\xd7\x01\xd0\x02\xc6\xff\xd7\x01\xd0\x02\xc8\xff\ +\xd7\x01\xd0\x02\xd5\xff\xd7\x01\xd0\x02\xe0\xff\xd7\x01\xd0\x02\ +\xf0\xff\xd7\x01\xd0\x02\xf2\xff\xd7\x01\xd0\x02\xf4\xff\xd7\x01\ +\xd0\x02\xfe\xff\xd7\x01\xd0\x03\x0a\xff\xd7\x01\xd0\x03\x0c\xff\ +\xd7\x01\xd0\x03\x16\xff\xd7\x01\xd0\x03\x1a\xff\xd7\x01\xd1\x01\ +\xe9\x00)\x01\xd4\x01\xcf\xff\xd7\x01\xd4\x01\xd8\xff\xd7\x01\ +\xd4\x01\xdb\xff\xd7\x01\xd4\x01\xde\xff\xd7\x01\xd4\x01\xe1\xff\ +\xd7\x01\xd4\x01\xea\xff\xd7\x01\xd4\x01\xed\xff\xd7\x01\xd4\x02\ +j\xff\xd7\x01\xd4\x02\x7f\xff\xd7\x01\xd4\x02\x85\xff\xd7\x01\ +\xd4\x02\x87\xff\xd7\x01\xd4\x02\x89\xff\xd7\x01\xd4\x02\x8d\xff\ +\xd7\x01\xd4\x02\xb2\xff\xd7\x01\xd4\x02\xb4\xff\xd7\x01\xd4\x02\ +\xc0\xff\xd7\x01\xd4\x02\xc2\xff\xd7\x01\xd4\x02\xc6\xff\xd7\x01\ +\xd4\x02\xc8\xff\xd7\x01\xd4\x02\xd5\xff\xd7\x01\xd4\x02\xe0\xff\ +\xd7\x01\xd4\x02\xf0\xff\xd7\x01\xd4\x02\xf2\xff\xd7\x01\xd4\x02\ +\xf4\xff\xd7\x01\xd4\x02\xfe\xff\xd7\x01\xd4\x03\x0a\xff\xd7\x01\ +\xd4\x03\x0c\xff\xd7\x01\xd4\x03\x16\xff\xd7\x01\xd4\x03\x1a\xff\ +\xd7\x01\xd8\x00\x05\xff\xec\x01\xd8\x00\x0a\xff\xec\x01\xd8\x01\ +\xd0\xff\xd7\x01\xd8\x01\xdc\xff\xec\x01\xd8\x01\xdd\xff\xec\x01\ +\xd8\x01\xdf\xff\xd7\x01\xd8\x01\xe1\xff\xec\x01\xd8\x01\xe4\xff\ +\xec\x01\xd8\x01\xf6\xff\xec\x01\xd8\x02\x07\xff\xec\x01\xd8\x02\ +\x0b\xff\xec\x01\xd8\x02\xa0\xff\xd7\x01\xd8\x02\xaa\xff\xec\x01\ +\xd8\x02\xb6\xff\xec\x01\xd8\x02\xbc\xff\xd7\x01\xd8\x02\xbe\xff\ +\xec\x01\xd8\x02\xc0\xff\xec\x01\xd8\x02\xc2\xff\xec\x01\xd8\x02\ +\xcb\xff\xd7\x01\xd8\x02\xd5\xff\xec\x01\xd8\x02\xe6\xff\xd7\x01\ +\xd8\x02\xf8\xff\xec\x01\xd8\x02\xfa\xff\xec\x01\xd8\x02\xfc\xff\ +\xec\x01\xd8\x02\xfe\xff\xec\x01\xd8\x03\x06\xff\xd7\x01\xd8\x03\ +\x08\xff\xd7\x01\xd8\x03\x0e\xff\xec\x01\xd8\x03\x10\xff\xec\x01\ +\xd8\x03\x18\xff\xec\x01\xda\x00\x05\xff\xec\x01\xda\x00\x0a\xff\ +\xec\x01\xda\x01\xd0\xff\xd7\x01\xda\x01\xdc\xff\xec\x01\xda\x01\ +\xdd\xff\xec\x01\xda\x01\xdf\xff\xd7\x01\xda\x01\xe1\xff\xec\x01\ +\xda\x01\xe4\xff\xec\x01\xda\x01\xf6\xff\xec\x01\xda\x02\x07\xff\ +\xec\x01\xda\x02\x0b\xff\xec\x01\xda\x02\xa0\xff\xd7\x01\xda\x02\ +\xaa\xff\xec\x01\xda\x02\xb6\xff\xec\x01\xda\x02\xbc\xff\xd7\x01\ +\xda\x02\xbe\xff\xec\x01\xda\x02\xc0\xff\xec\x01\xda\x02\xc2\xff\ +\xec\x01\xda\x02\xcb\xff\xd7\x01\xda\x02\xd5\xff\xec\x01\xda\x02\ +\xe6\xff\xd7\x01\xda\x02\xf8\xff\xec\x01\xda\x02\xfa\xff\xec\x01\ +\xda\x02\xfc\xff\xec\x01\xda\x02\xfe\xff\xec\x01\xda\x03\x06\xff\ +\xd7\x01\xda\x03\x08\xff\xd7\x01\xda\x03\x0e\xff\xec\x01\xda\x03\ +\x10\xff\xec\x01\xda\x03\x18\xff\xec\x01\xdc\x00\x0f\xff\x9a\x01\ +\xdc\x00\x10\xff\xd7\x01\xdc\x00\x11\xff\x9a\x01\xdc\x01\xce\xff\ +\xc3\x01\xdc\x01\xcf\xff\xec\x01\xdc\x01\xd5\xff\xc3\x01\xdc\x01\ +\xd8\xff\xec\x01\xdc\x01\xdb\xff\xec\x01\xdc\x01\xde\xff\xec\x01\ +\xdc\x01\xea\xff\xec\x01\xdc\x01\xed\xff\xec\x01\xdc\x01\xf2\xff\ +\xc3\x01\xdc\x02\x02\xff\xd7\x01\xdc\x02\x03\xff\xd7\x01\xdc\x02\ +\x04\xff\xd7\x01\xdc\x02\x08\xff\x9a\x01\xdc\x02\x0c\xff\x9a\x01\ +\xdc\x02j\xff\xec\x01\xdc\x02s\xff\xc3\x01\xdc\x02\x7f\xff\ +\xec\x01\xdc\x02\x85\xff\xec\x01\xdc\x02\x87\xff\xec\x01\xdc\x02\ +\x89\xff\xec\x01\xdc\x02\x8d\xff\xec\x01\xdc\x02\xb2\xff\xec\x01\ +\xdc\x02\xb4\xff\xec\x01\xdc\x02\xcf\xff\xc3\x01\xdc\x02\xe0\xff\ +\xec\x01\xdc\x02\xf0\xff\xec\x01\xdc\x02\xf2\xff\xec\x01\xdc\x02\ +\xf4\xff\xec\x01\xdc\x03\x0a\xff\xec\x01\xdc\x03\x0c\xff\xec\x01\ +\xdc\x03\x12\xff\xc3\x01\xdc\x03\x16\xff\xec\x01\xdc\x03\x1a\xff\ +\xec\x01\xdc\x03\x1c\xff\xc3\x01\xdd\x00\x0f\xff\xae\x01\xdd\x00\ +\x11\xff\xae\x01\xdd\x01\xce\xff\xd7\x01\xdd\x01\xd5\xff\xd7\x01\ +\xdd\x01\xf2\xff\xd7\x01\xdd\x02\x08\xff\xae\x01\xdd\x02\x0c\xff\ +\xae\x01\xdd\x02s\xff\xd7\x01\xdd\x02\xcf\xff\xd7\x01\xdd\x03\ +\x12\xff\xd7\x01\xdd\x03\x1c\xff\xd7\x01\xde\x00\x05\xff\xec\x01\ +\xde\x00\x0a\xff\xec\x01\xde\x01\xd0\xff\xd7\x01\xde\x01\xdc\xff\ +\xec\x01\xde\x01\xdd\xff\xec\x01\xde\x01\xdf\xff\xd7\x01\xde\x01\ +\xe1\xff\xec\x01\xde\x01\xe4\xff\xec\x01\xde\x01\xf6\xff\xec\x01\ +\xde\x02\x07\xff\xec\x01\xde\x02\x0b\xff\xec\x01\xde\x02\xa0\xff\ +\xd7\x01\xde\x02\xaa\xff\xec\x01\xde\x02\xb6\xff\xec\x01\xde\x02\ +\xbc\xff\xd7\x01\xde\x02\xbe\xff\xec\x01\xde\x02\xc0\xff\xec\x01\ +\xde\x02\xc2\xff\xec\x01\xde\x02\xcb\xff\xd7\x01\xde\x02\xd5\xff\ +\xec\x01\xde\x02\xe6\xff\xd7\x01\xde\x02\xf8\xff\xec\x01\xde\x02\ +\xfa\xff\xec\x01\xde\x02\xfc\xff\xec\x01\xde\x02\xfe\xff\xec\x01\ +\xde\x03\x06\xff\xd7\x01\xde\x03\x08\xff\xd7\x01\xde\x03\x0e\xff\ +\xec\x01\xde\x03\x10\xff\xec\x01\xde\x03\x18\xff\xec\x01\xdf\x01\ +\xcf\xff\xd7\x01\xdf\x01\xd8\xff\xd7\x01\xdf\x01\xdb\xff\xd7\x01\ +\xdf\x01\xde\xff\xd7\x01\xdf\x01\xe1\xff\xd7\x01\xdf\x01\xea\xff\ +\xd7\x01\xdf\x01\xed\xff\xd7\x01\xdf\x02j\xff\xd7\x01\xdf\x02\ +\x7f\xff\xd7\x01\xdf\x02\x85\xff\xd7\x01\xdf\x02\x87\xff\xd7\x01\ +\xdf\x02\x89\xff\xd7\x01\xdf\x02\x8d\xff\xd7\x01\xdf\x02\xb2\xff\ +\xd7\x01\xdf\x02\xb4\xff\xd7\x01\xdf\x02\xc0\xff\xd7\x01\xdf\x02\ +\xc2\xff\xd7\x01\xdf\x02\xc6\xff\xd7\x01\xdf\x02\xc8\xff\xd7\x01\ +\xdf\x02\xd5\xff\xd7\x01\xdf\x02\xe0\xff\xd7\x01\xdf\x02\xf0\xff\ +\xd7\x01\xdf\x02\xf2\xff\xd7\x01\xdf\x02\xf4\xff\xd7\x01\xdf\x02\ +\xfe\xff\xd7\x01\xdf\x03\x0a\xff\xd7\x01\xdf\x03\x0c\xff\xd7\x01\ +\xdf\x03\x16\xff\xd7\x01\xdf\x03\x1a\xff\xd7\x01\xe0\x00\x05\xff\ +\xec\x01\xe0\x00\x0a\xff\xec\x01\xe0\x02\x07\xff\xec\x01\xe0\x02\ +\x0b\xff\xec\x01\xe3\x00\x05\xff\xec\x01\xe3\x00\x0a\xff\xec\x01\ +\xe3\x02\x07\xff\xec\x01\xe3\x02\x0b\xff\xec\x01\xe4\x00\x05\xff\ +\x85\x01\xe4\x00\x0a\xff\x85\x01\xe4\x01\xd0\xff\xd7\x01\xe4\x01\ +\xdc\xff\x9a\x01\xe4\x01\xdd\xff\xc3\x01\xe4\x01\xdf\xff\xd7\x01\ +\xe4\x01\xe1\xff\xae\x01\xe4\x01\xe4\xff\x9a\x01\xe4\x01\xf6\xff\ +\xc3\x01\xe4\x02\x07\xff\x85\x01\xe4\x02\x0b\xff\x85\x01\xe4\x02\ +m\xff\xd7\x01\xe4\x02\x81\xff\xd7\x01\xe4\x02\x83\xff\xd7\x01\ +\xe4\x02\x8b\xff\xd7\x01\xe4\x02\xa0\xff\xd7\x01\xe4\x02\xaa\xff\ +\x9a\x01\xe4\x02\xb6\xff\x9a\x01\xe4\x02\xb8\xff\xc3\x01\xe4\x02\ +\xba\xff\xc3\x01\xe4\x02\xbc\xff\xd7\x01\xe4\x02\xbe\xff\x9a\x01\ +\xe4\x02\xc0\xff\xae\x01\xe4\x02\xc2\xff\xae\x01\xe4\x02\xc6\xff\ +\xd7\x01\xe4\x02\xc8\xff\xd7\x01\xe4\x02\xcb\xff\xd7\x01\xe4\x02\ +\xd5\xff\xae\x01\xe4\x02\xe6\xff\xd7\x01\xe4\x02\xea\xff\xd7\x01\ +\xe4\x02\xf8\xff\xc3\x01\xe4\x02\xfa\xff\xc3\x01\xe4\x02\xfc\xff\ +\xc3\x01\xe4\x02\xfe\xff\xae\x01\xe4\x03\x06\xff\xd7\x01\xe4\x03\ +\x08\xff\xd7\x01\xe4\x03\x0e\xff\x9a\x01\xe4\x03\x10\xff\x9a\x01\ +\xe4\x03\x18\xff\x9a\x01\xe6\x00\x05\xff\x85\x01\xe6\x00\x0a\xff\ +\x85\x01\xe6\x01\xd0\xff\xd7\x01\xe6\x01\xdc\xff\x9a\x01\xe6\x01\ +\xdd\xff\xc3\x01\xe6\x01\xdf\xff\xd7\x01\xe6\x01\xe1\xff\xae\x01\ +\xe6\x01\xe4\xff\x9a\x01\xe6\x01\xf6\xff\xc3\x01\xe6\x02\x07\xff\ +\x85\x01\xe6\x02\x0b\xff\x85\x01\xe6\x02m\xff\xd7\x01\xe6\x02\ +\x81\xff\xd7\x01\xe6\x02\x83\xff\xd7\x01\xe6\x02\x8b\xff\xd7\x01\ +\xe6\x02\xa0\xff\xd7\x01\xe6\x02\xaa\xff\x9a\x01\xe6\x02\xb6\xff\ +\x9a\x01\xe6\x02\xb8\xff\xc3\x01\xe6\x02\xba\xff\xc3\x01\xe6\x02\ +\xbc\xff\xd7\x01\xe6\x02\xbe\xff\x9a\x01\xe6\x02\xc0\xff\xae\x01\ +\xe6\x02\xc2\xff\xae\x01\xe6\x02\xc6\xff\xd7\x01\xe6\x02\xc8\xff\ +\xd7\x01\xe6\x02\xcb\xff\xd7\x01\xe6\x02\xd5\xff\xae\x01\xe6\x02\ +\xe6\xff\xd7\x01\xe6\x02\xea\xff\xd7\x01\xe6\x02\xf8\xff\xc3\x01\ +\xe6\x02\xfa\xff\xc3\x01\xe6\x02\xfc\xff\xc3\x01\xe6\x02\xfe\xff\ +\xae\x01\xe6\x03\x06\xff\xd7\x01\xe6\x03\x08\xff\xd7\x01\xe6\x03\ +\x0e\xff\x9a\x01\xe6\x03\x10\xff\x9a\x01\xe6\x03\x18\xff\x9a\x01\ +\xe7\x00\x05\xff\xec\x01\xe7\x00\x0a\xff\xec\x01\xe7\x01\xd0\xff\ +\xd7\x01\xe7\x01\xdc\xff\xec\x01\xe7\x01\xdd\xff\xec\x01\xe7\x01\ +\xdf\xff\xd7\x01\xe7\x01\xe1\xff\xec\x01\xe7\x01\xe4\xff\xec\x01\ +\xe7\x01\xf6\xff\xec\x01\xe7\x02\x07\xff\xec\x01\xe7\x02\x0b\xff\ +\xec\x01\xe7\x02\xa0\xff\xd7\x01\xe7\x02\xaa\xff\xec\x01\xe7\x02\ +\xb6\xff\xec\x01\xe7\x02\xbc\xff\xd7\x01\xe7\x02\xbe\xff\xec\x01\ +\xe7\x02\xc0\xff\xec\x01\xe7\x02\xc2\xff\xec\x01\xe7\x02\xcb\xff\ +\xd7\x01\xe7\x02\xd5\xff\xec\x01\xe7\x02\xe6\xff\xd7\x01\xe7\x02\ +\xf8\xff\xec\x01\xe7\x02\xfa\xff\xec\x01\xe7\x02\xfc\xff\xec\x01\ +\xe7\x02\xfe\xff\xec\x01\xe7\x03\x06\xff\xd7\x01\xe7\x03\x08\xff\ +\xd7\x01\xe7\x03\x0e\xff\xec\x01\xe7\x03\x10\xff\xec\x01\xe7\x03\ +\x18\xff\xec\x01\xe8\x00\x05\xff\xec\x01\xe8\x00\x0a\xff\xec\x01\ +\xe8\x01\xd0\xff\xd7\x01\xe8\x01\xdc\xff\xec\x01\xe8\x01\xdd\xff\ +\xec\x01\xe8\x01\xdf\xff\xd7\x01\xe8\x01\xe1\xff\xec\x01\xe8\x01\ +\xe4\xff\xec\x01\xe8\x01\xf6\xff\xec\x01\xe8\x02\x07\xff\xec\x01\ +\xe8\x02\x0b\xff\xec\x01\xe8\x02\xa0\xff\xd7\x01\xe8\x02\xaa\xff\ +\xec\x01\xe8\x02\xb6\xff\xec\x01\xe8\x02\xbc\xff\xd7\x01\xe8\x02\ +\xbe\xff\xec\x01\xe8\x02\xc0\xff\xec\x01\xe8\x02\xc2\xff\xec\x01\ +\xe8\x02\xcb\xff\xd7\x01\xe8\x02\xd5\xff\xec\x01\xe8\x02\xe6\xff\ +\xd7\x01\xe8\x02\xf8\xff\xec\x01\xe8\x02\xfa\xff\xec\x01\xe8\x02\ +\xfc\xff\xec\x01\xe8\x02\xfe\xff\xec\x01\xe8\x03\x06\xff\xd7\x01\ +\xe8\x03\x08\xff\xd7\x01\xe8\x03\x0e\xff\xec\x01\xe8\x03\x10\xff\ +\xec\x01\xe8\x03\x18\xff\xec\x01\xea\x00\x05\xff\xec\x01\xea\x00\ +\x0a\xff\xec\x01\xea\x02\x07\xff\xec\x01\xea\x02\x0b\xff\xec\x01\ +\xeb\x00\x05\xff\xec\x01\xeb\x00\x0a\xff\xec\x01\xeb\x02\x07\xff\ +\xec\x01\xeb\x02\x0b\xff\xec\x01\xeb\x03\x0e\xff\xd7\x01\xeb\x03\ +\x10\xff\xd7\x01\xec\x00\x0f\xff\x9a\x01\xec\x00\x10\xff\xd7\x01\ +\xec\x00\x11\xff\x9a\x01\xec\x01\xce\xff\xc3\x01\xec\x01\xcf\xff\ +\xec\x01\xec\x01\xd5\xff\xc3\x01\xec\x01\xd8\xff\xec\x01\xec\x01\ +\xdb\xff\xec\x01\xec\x01\xde\xff\xec\x01\xec\x01\xea\xff\xec\x01\ +\xec\x01\xed\xff\xec\x01\xec\x01\xf2\xff\xc3\x01\xec\x02\x02\xff\ +\xd7\x01\xec\x02\x03\xff\xd7\x01\xec\x02\x04\xff\xd7\x01\xec\x02\ +\x08\xff\x9a\x01\xec\x02\x0c\xff\x9a\x01\xec\x02j\xff\xec\x01\ +\xec\x02s\xff\xc3\x01\xec\x02\x7f\xff\xec\x01\xec\x02\x85\xff\ +\xec\x01\xec\x02\x87\xff\xec\x01\xec\x02\x89\xff\xec\x01\xec\x02\ +\x8d\xff\xec\x01\xec\x02\xb2\xff\xec\x01\xec\x02\xb4\xff\xec\x01\ +\xec\x02\xcf\xff\xc3\x01\xec\x02\xe0\xff\xec\x01\xec\x02\xf0\xff\ +\xec\x01\xec\x02\xf2\xff\xec\x01\xec\x02\xf4\xff\xec\x01\xec\x03\ +\x0a\xff\xec\x01\xec\x03\x0c\xff\xec\x01\xec\x03\x12\xff\xc3\x01\ +\xec\x03\x16\xff\xec\x01\xec\x03\x1a\xff\xec\x01\xec\x03\x1c\xff\ +\xc3\x01\xf2\x00\x05\xff\x85\x01\xf2\x00\x0a\xff\x85\x01\xf2\x01\ +\xd0\xff\xd7\x01\xf2\x01\xdc\xff\x9a\x01\xf2\x01\xdd\xff\xc3\x01\ +\xf2\x01\xdf\xff\xd7\x01\xf2\x01\xe1\xff\xae\x01\xf2\x01\xe4\xff\ +\x9a\x01\xf2\x01\xf6\xff\xc3\x01\xf2\x02\x07\xff\x85\x01\xf2\x02\ +\x0b\xff\x85\x01\xf2\x02m\xff\xd7\x01\xf2\x02\x81\xff\xd7\x01\ +\xf2\x02\x83\xff\xd7\x01\xf2\x02\x8b\xff\xd7\x01\xf2\x02\xa0\xff\ +\xd7\x01\xf2\x02\xaa\xff\x9a\x01\xf2\x02\xb6\xff\x9a\x01\xf2\x02\ +\xb8\xff\xc3\x01\xf2\x02\xba\xff\xc3\x01\xf2\x02\xbc\xff\xd7\x01\ +\xf2\x02\xbe\xff\x9a\x01\xf2\x02\xc0\xff\xae\x01\xf2\x02\xc2\xff\ +\xae\x01\xf2\x02\xc6\xff\xd7\x01\xf2\x02\xc8\xff\xd7\x01\xf2\x02\ +\xcb\xff\xd7\x01\xf2\x02\xd5\xff\xae\x01\xf2\x02\xe6\xff\xd7\x01\ +\xf2\x02\xea\xff\xd7\x01\xf2\x02\xf8\xff\xc3\x01\xf2\x02\xfa\xff\ +\xc3\x01\xf2\x02\xfc\xff\xc3\x01\xf2\x02\xfe\xff\xae\x01\xf2\x03\ +\x06\xff\xd7\x01\xf2\x03\x08\xff\xd7\x01\xf2\x03\x0e\xff\x9a\x01\ +\xf2\x03\x10\xff\x9a\x01\xf2\x03\x18\xff\x9a\x01\xf3\x00\x05\xff\ +\x85\x01\xf3\x00\x0a\xff\x85\x01\xf3\x01\xd0\xff\xd7\x01\xf3\x01\ +\xdc\xff\x9a\x01\xf3\x01\xdd\xff\xc3\x01\xf3\x01\xdf\xff\xd7\x01\ +\xf3\x01\xe1\xff\xae\x01\xf3\x01\xe4\xff\x9a\x01\xf3\x01\xf6\xff\ +\xc3\x01\xf3\x02\x07\xff\x85\x01\xf3\x02\x0b\xff\x85\x01\xf3\x02\ +m\xff\xd7\x01\xf3\x02\x81\xff\xd7\x01\xf3\x02\x83\xff\xd7\x01\ +\xf3\x02\x8b\xff\xd7\x01\xf3\x02\xa0\xff\xd7\x01\xf3\x02\xaa\xff\ +\x9a\x01\xf3\x02\xb6\xff\x9a\x01\xf3\x02\xb8\xff\xc3\x01\xf3\x02\ +\xba\xff\xc3\x01\xf3\x02\xbc\xff\xd7\x01\xf3\x02\xbe\xff\x9a\x01\ +\xf3\x02\xc0\xff\xae\x01\xf3\x02\xc2\xff\xae\x01\xf3\x02\xc6\xff\ +\xd7\x01\xf3\x02\xc8\xff\xd7\x01\xf3\x02\xcb\xff\xd7\x01\xf3\x02\ +\xd5\xff\xae\x01\xf3\x02\xe6\xff\xd7\x01\xf3\x02\xea\xff\xd7\x01\ +\xf3\x02\xf8\xff\xc3\x01\xf3\x02\xfa\xff\xc3\x01\xf3\x02\xfc\xff\ +\xc3\x01\xf3\x02\xfe\xff\xae\x01\xf3\x03\x06\xff\xd7\x01\xf3\x03\ +\x08\xff\xd7\x01\xf3\x03\x0e\xff\x9a\x01\xf3\x03\x10\xff\x9a\x01\ +\xf3\x03\x18\xff\x9a\x01\xf4\x00\x05\xff\xec\x01\xf4\x00\x0a\xff\ +\xec\x01\xf4\x02\x07\xff\xec\x01\xf4\x02\x0b\xff\xec\x01\xf4\x03\ +\x0e\xff\xd7\x01\xf4\x03\x10\xff\xd7\x01\xf5\x01\xcf\xff\xd7\x01\ +\xf5\x01\xd8\xff\xd7\x01\xf5\x01\xdb\xff\xd7\x01\xf5\x01\xde\xff\ +\xd7\x01\xf5\x01\xe1\xff\xd7\x01\xf5\x01\xea\xff\xd7\x01\xf5\x01\ +\xed\xff\xd7\x01\xf5\x02j\xff\xd7\x01\xf5\x02\x7f\xff\xd7\x01\ +\xf5\x02\x85\xff\xd7\x01\xf5\x02\x87\xff\xd7\x01\xf5\x02\x89\xff\ +\xd7\x01\xf5\x02\x8d\xff\xd7\x01\xf5\x02\xb2\xff\xd7\x01\xf5\x02\ +\xb4\xff\xd7\x01\xf5\x02\xc0\xff\xd7\x01\xf5\x02\xc2\xff\xd7\x01\ +\xf5\x02\xc6\xff\xd7\x01\xf5\x02\xc8\xff\xd7\x01\xf5\x02\xd5\xff\ +\xd7\x01\xf5\x02\xe0\xff\xd7\x01\xf5\x02\xf0\xff\xd7\x01\xf5\x02\ +\xf2\xff\xd7\x01\xf5\x02\xf4\xff\xd7\x01\xf5\x02\xfe\xff\xd7\x01\ +\xf5\x03\x0a\xff\xd7\x01\xf5\x03\x0c\xff\xd7\x01\xf5\x03\x16\xff\ +\xd7\x01\xf5\x03\x1a\xff\xd7\x01\xf6\x00\x0f\xff\xae\x01\xf6\x00\ +\x11\xff\xae\x01\xf6\x01\xce\xff\xd7\x01\xf6\x01\xd5\xff\xd7\x01\ +\xf6\x01\xf2\xff\xd7\x01\xf6\x02\x08\xff\xae\x01\xf6\x02\x0c\xff\ +\xae\x01\xf6\x02s\xff\xd7\x01\xf6\x02\xcf\xff\xd7\x01\xf6\x03\ +\x12\xff\xd7\x01\xf6\x03\x1c\xff\xd7\x01\xf8\x00\x0f\xff\x85\x01\ +\xf8\x00\x10\xff\xae\x01\xf8\x00\x11\xff\x85\x01\xf8\x01\x9f\xff\ +\xd7\x01\xf8\x01\xa4\xff\x9a\x01\xf8\x01\xaa\xffq\x01\xf8\x01\ +\xae\xff\x9a\x01\xf8\x01\xb5\xff\x9a\x01\xf8\x01\xb8\xff\xd7\x01\ +\xf8\x01\xbb\xff\xd7\x01\xf8\x01\xbc\x00)\x01\xf8\x01\xbe\xff\ +\xae\x01\xf8\x01\xcc\xff\x9a\x01\xf8\x01\xcd\xff\x9a\x01\xf8\x01\ +\xce\xff\x85\x01\xf8\x01\xcf\xffq\x01\xf8\x01\xd0\xff\xd7\x01\ +\xf8\x01\xd1\xff\xd7\x01\xf8\x01\xd2\xff\x9a\x01\xf8\x01\xd3\xff\ +\x9a\x01\xf8\x01\xd4\xff\x9a\x01\xf8\x01\xd5\xff\x85\x01\xf8\x01\ +\xd6\xff\x9a\x01\xf8\x01\xd7\xff\x9a\x01\xf8\x01\xd8\xffq\x01\ +\xf8\x01\xd9\xff\x9a\x01\xf8\x01\xda\xff\x9a\x01\xf8\x01\xdb\xff\ +q\x01\xf8\x01\xdc\xff\xae\x01\xf8\x01\xdd\xff\xae\x01\xf8\x01\ +\xde\xffq\x01\xf8\x01\xdf\xff\xd7\x01\xf8\x01\xe0\xff\x9a\x01\ +\xf8\x01\xe1\xff\x9a\x01\xf8\x01\xe2\xff\x9a\x01\xf8\x01\xe3\xff\ +\x9a\x01\xf8\x01\xe4\xff\xae\x01\xf8\x01\xe5\xff\x9a\x01\xf8\x01\ +\xe6\xff\x9a\x01\xf8\x01\xe7\xff\xd7\x01\xf8\x01\xe8\xff\x9a\x01\ +\xf8\x01\xe9\xff\xc3\x01\xf8\x01\xea\xffq\x01\xf8\x01\xec\xff\ +\x9a\x01\xf8\x01\xed\xffq\x01\xf8\x01\xee\xff\x85\x01\xf8\x01\ +\xf2\xff\x85\x01\xf8\x01\xf3\xff\x9a\x01\xf8\x01\xf5\xff\x9a\x01\ +\xf8\x01\xf6\xff\xae\x01\xf8\x01\xf7\xff\x9a\x01\xf8\x01\xf9\xff\ +\x9a\x01\xf8\x02\x02\xff\xae\x01\xf8\x02\x03\xff\xae\x01\xf8\x02\ +\x04\xff\xae\x01\xf8\x02\x08\xff\x85\x01\xf8\x02\x0c\xff\x85\x01\ +\xf8\x02j\xffq\x01\xf8\x02k\xff\x9a\x01\xf8\x02l\xff\ +\xd7\x01\xf8\x02m\xff\xd7\x01\xf8\x02q\xff\x9a\x01\xf8\x02\ +r\xffq\x01\xf8\x02s\xff\x85\x01\xf8\x02u\xff\x9a\x01\ +\xf8\x02w\xff\x9a\x01\xf8\x02y\xff\x9a\x01\xf8\x02}\xff\ +\x9a\x01\xf8\x02~\xff\xd7\x01\xf8\x02\x7f\xffq\x01\xf8\x02\ +\x81\xff\xd7\x01\xf8\x02\x83\xff\xd7\x01\xf8\x02\x84\xff\xd7\x01\ +\xf8\x02\x85\xffq\x01\xf8\x02\x86\xff\xd7\x01\xf8\x02\x87\xff\ +q\x01\xf8\x02\x88\xff\xd7\x01\xf8\x02\x89\xffq\x01\xf8\x02\ +\x8a\xff\xd7\x01\xf8\x02\x8b\xff\xd7\x01\xf8\x02\x8c\xff\xd7\x01\ +\xf8\x02\x8d\xffq\x01\xf8\x02\x96\xff\x9a\x01\xf8\x02\x9a\xff\ +\x9a\x01\xf8\x02\x9e\xff\x9a\x01\xf8\x02\xa0\xff\xd7\x01\xf8\x02\ +\xa2\xff\xd7\x01\xf8\x02\xa4\xff\x9a\x01\xf8\x02\xa6\xff\x9a\x01\ +\xf8\x02\xaa\xff\xae\x01\xf8\x02\xac\xff\x9a\x01\xf8\x02\xae\xff\ +\x9a\x01\xf8\x02\xb0\xff\x9a\x01\xf8\x02\xb1\xff\xd7\x01\xf8\x02\ +\xb2\xffq\x01\xf8\x02\xb3\xff\xd7\x01\xf8\x02\xb4\xffq\x01\ +\xf8\x02\xb5\x00)\x01\xf8\x02\xb6\xff\xae\x01\xf8\x02\xb8\xff\ +\xae\x01\xf8\x02\xba\xff\xae\x01\xf8\x02\xbc\xff\xd7\x01\xf8\x02\ +\xbe\xff\xae\x01\xf8\x02\xc0\xff\x9a\x01\xf8\x02\xc2\xff\x9a\x01\ +\xf8\x02\xc4\xff\x9a\x01\xf8\x02\xc5\xff\x9a\x01\xf8\x02\xc6\xff\ +q\x01\xf8\x02\xc7\xff\x9a\x01\xf8\x02\xc8\xffq\x01\xf8\x02\ +\xcb\xff\xd7\x01\xf8\x02\xcd\xff\x9a\x01\xf8\x02\xce\xff\x9a\x01\ +\xf8\x02\xcf\xff\x85\x01\xf8\x02\xd1\xff\x9a\x01\xf8\x02\xd3\xff\ +\x9a\x01\xf8\x02\xd5\xff\x9a\x01\xf8\x02\xd7\xff\x9a\x01\xf8\x02\ +\xd9\xffq\x01\xf8\x02\xdb\xffq\x01\xf8\x02\xdd\xffq\x01\ +\xf8\x02\xe0\xffq\x01\xf8\x02\xe6\xff\xd7\x01\xf8\x02\xe8\xff\ +\xd7\x01\xf8\x02\xea\xff\xc3\x01\xf8\x02\xec\xff\x9a\x01\xf8\x02\ +\xee\xff\x9a\x01\xf8\x02\xef\xff\xd7\x01\xf8\x02\xf0\xffq\x01\ +\xf8\x02\xf1\xff\xd7\x01\xf8\x02\xf2\xffq\x01\xf8\x02\xf3\xff\ +\xd7\x01\xf8\x02\xf4\xffq\x01\xf8\x02\xf6\xff\xd7\x01\xf8\x02\ +\xf8\xff\xae\x01\xf8\x02\xfa\xff\xae\x01\xf8\x02\xfc\xff\xae\x01\ +\xf8\x02\xfe\xff\x9a\x01\xf8\x03\x00\xff\x9a\x01\xf8\x03\x02\xff\ +\x9a\x01\xf8\x03\x06\xff\xd7\x01\xf8\x03\x08\xff\xd7\x01\xf8\x03\ +\x09\xffq\x01\xf8\x03\x0a\xffq\x01\xf8\x03\x0b\xffq\x01\ +\xf8\x03\x0c\xffq\x01\xf8\x03\x0e\xff\x9a\x01\xf8\x03\x10\xff\ +\x9a\x01\xf8\x03\x11\xff\x9a\x01\xf8\x03\x12\xff\x85\x01\xf8\x03\ +\x14\xff\x9a\x01\xf8\x03\x15\xff\xd7\x01\xf8\x03\x16\xffq\x01\ +\xf8\x03\x18\xff\xae\x01\xf8\x03\x1a\xffq\x01\xf8\x03\x1b\xff\ +\x9a\x01\xf8\x03\x1c\xff\x85\x01\xf9\x00\x0f\xff\x9a\x01\xf9\x00\ +\x10\xff\xd7\x01\xf9\x00\x11\xff\x9a\x01\xf9\x01\xce\xff\xc3\x01\ +\xf9\x01\xcf\xff\xec\x01\xf9\x01\xd5\xff\xc3\x01\xf9\x01\xd8\xff\ +\xec\x01\xf9\x01\xdb\xff\xec\x01\xf9\x01\xde\xff\xec\x01\xf9\x01\ +\xea\xff\xec\x01\xf9\x01\xed\xff\xec\x01\xf9\x01\xf2\xff\xc3\x01\ +\xf9\x02\x02\xff\xd7\x01\xf9\x02\x03\xff\xd7\x01\xf9\x02\x04\xff\ +\xd7\x01\xf9\x02\x08\xff\x9a\x01\xf9\x02\x0c\xff\x9a\x01\xf9\x02\ +j\xff\xec\x01\xf9\x02s\xff\xc3\x01\xf9\x02\x7f\xff\xec\x01\ +\xf9\x02\x85\xff\xec\x01\xf9\x02\x87\xff\xec\x01\xf9\x02\x89\xff\ +\xec\x01\xf9\x02\x8d\xff\xec\x01\xf9\x02\xb2\xff\xec\x01\xf9\x02\ +\xb4\xff\xec\x01\xf9\x02\xcf\xff\xc3\x01\xf9\x02\xe0\xff\xec\x01\ +\xf9\x02\xf0\xff\xec\x01\xf9\x02\xf2\xff\xec\x01\xf9\x02\xf4\xff\ +\xec\x01\xf9\x03\x0a\xff\xec\x01\xf9\x03\x0c\xff\xec\x01\xf9\x03\ +\x12\xff\xc3\x01\xf9\x03\x16\xff\xec\x01\xf9\x03\x1a\xff\xec\x01\ +\xf9\x03\x1c\xff\xc3\x01\xfa\x00\x0f\xff\x9a\x01\xfa\x00\x11\xff\ +\x9a\x01\xfa\x00\x22\x00)\x01\xfa\x00$\xff\xae\x01\xfa\x00\ +&\xff\xec\x01\xfa\x00*\xff\xec\x01\xfa\x002\xff\xec\x01\ +\xfa\x004\xff\xec\x01\xfa\x00D\xff\xd7\x01\xfa\x00F\xff\ +\xd7\x01\xfa\x00G\xff\xd7\x01\xfa\x00H\xff\xd7\x01\xfa\x00\ +J\xff\xec\x01\xfa\x00P\xff\xec\x01\xfa\x00Q\xff\xec\x01\ +\xfa\x00R\xff\xd7\x01\xfa\x00S\xff\xec\x01\xfa\x00T\xff\ +\xd7\x01\xfa\x00U\xff\xec\x01\xfa\x00V\xff\xec\x01\xfa\x00\ +X\xff\xec\x01\xfa\x00\x82\xff\xae\x01\xfa\x00\x83\xff\xae\x01\ +\xfa\x00\x84\xff\xae\x01\xfa\x00\x85\xff\xae\x01\xfa\x00\x86\xff\ +\xae\x01\xfa\x00\x87\xff\xae\x01\xfa\x00\x89\xff\xec\x01\xfa\x00\ +\x94\xff\xec\x01\xfa\x00\x95\xff\xec\x01\xfa\x00\x96\xff\xec\x01\ +\xfa\x00\x97\xff\xec\x01\xfa\x00\x98\xff\xec\x01\xfa\x00\x9a\xff\ +\xec\x01\xfa\x00\xa2\xff\xd7\x01\xfa\x00\xa3\xff\xd7\x01\xfa\x00\ +\xa4\xff\xd7\x01\xfa\x00\xa5\xff\xd7\x01\xfa\x00\xa6\xff\xd7\x01\ +\xfa\x00\xa7\xff\xd7\x01\xfa\x00\xa8\xff\xd7\x01\xfa\x00\xa9\xff\ +\xd7\x01\xfa\x00\xaa\xff\xd7\x01\xfa\x00\xab\xff\xd7\x01\xfa\x00\ +\xac\xff\xd7\x01\xfa\x00\xad\xff\xd7\x01\xfa\x00\xb4\xff\xd7\x01\ +\xfa\x00\xb5\xff\xd7\x01\xfa\x00\xb6\xff\xd7\x01\xfa\x00\xb7\xff\ +\xd7\x01\xfa\x00\xb8\xff\xd7\x01\xfa\x00\xba\xff\xd7\x01\xfa\x00\ +\xbb\xff\xec\x01\xfa\x00\xbc\xff\xec\x01\xfa\x00\xbd\xff\xec\x01\ +\xfa\x00\xbe\xff\xec\x01\xfa\x00\xc2\xff\xae\x01\xfa\x00\xc3\xff\ +\xd7\x01\xfa\x00\xc4\xff\xae\x01\xfa\x00\xc5\xff\xd7\x01\xfa\x00\ +\xc6\xff\xae\x01\xfa\x00\xc7\xff\xd7\x01\xfa\x00\xc8\xff\xec\x01\ +\xfa\x00\xc9\xff\xd7\x01\xfa\x00\xca\xff\xec\x01\xfa\x00\xcb\xff\ +\xd7\x01\xfa\x00\xcc\xff\xec\x01\xfa\x00\xcd\xff\xd7\x01\xfa\x00\ +\xce\xff\xec\x01\xfa\x00\xcf\xff\xd7\x01\xfa\x00\xd1\xff\xd7\x01\ +\xfa\x00\xd3\xff\xd7\x01\xfa\x00\xd5\xff\xd7\x01\xfa\x00\xd7\xff\ +\xd7\x01\xfa\x00\xd9\xff\xd7\x01\xfa\x00\xdb\xff\xd7\x01\xfa\x00\ +\xdd\xff\xd7\x01\xfa\x00\xde\xff\xec\x01\xfa\x00\xdf\xff\xec\x01\ +\xfa\x00\xe0\xff\xec\x01\xfa\x00\xe1\xff\xec\x01\xfa\x00\xe2\xff\ +\xec\x01\xfa\x00\xe3\xff\xec\x01\xfa\x00\xe4\xff\xec\x01\xfa\x00\ +\xe5\xff\xec\x01\xfa\x00\xfa\xff\xec\x01\xfa\x01\x06\xff\xec\x01\ +\xfa\x01\x08\xff\xec\x01\xfa\x01\x0d\xff\xec\x01\xfa\x01\x0e\xff\ +\xec\x01\xfa\x01\x0f\xff\xd7\x01\xfa\x01\x10\xff\xec\x01\xfa\x01\ +\x11\xff\xd7\x01\xfa\x01\x12\xff\xec\x01\xfa\x01\x13\xff\xd7\x01\ +\xfa\x01\x14\xff\xec\x01\xfa\x01\x15\xff\xd7\x01\xfa\x01\x17\xff\ +\xec\x01\xfa\x01\x19\xff\xec\x01\xfa\x01\x1d\xff\xec\x01\xfa\x01\ +!\xff\xec\x01\xfa\x01+\xff\xec\x01\xfa\x01-\xff\xec\x01\ +\xfa\x01/\xff\xec\x01\xfa\x011\xff\xec\x01\xfa\x013\xff\ +\xec\x01\xfa\x015\xff\xec\x01\xfa\x01C\xff\xae\x01\xfa\x01\ +D\xff\xd7\x01\xfa\x01F\xff\xd7\x01\xfa\x01G\xff\xec\x01\ +\xfa\x01H\xff\xd7\x01\xfa\x01J\xff\xec\x01\xfa\x02\x08\xff\ +\x9a\x01\xfa\x02\x0c\xff\x9a\x01\xfa\x02W\xff\xec\x01\xfa\x02\ +X\xff\xae\x01\xfa\x02Y\xff\xd7\x01\xfa\x02_\xff\xec\x01\ +\xfa\x02`\xff\xd7\x01\xfa\x02b\xff\xec\x01\xfa\x03\x1d\xff\ +\xae\x01\xfa\x03\x1e\xff\xd7\x01\xfa\x03\x1f\xff\xae\x01\xfa\x03\ + \xff\xd7\x01\xfa\x03!\xff\xae\x01\xfa\x03\x22\xff\xd7\x01\ +\xfa\x03#\xff\xae\x01\xfa\x03%\xff\xae\x01\xfa\x03&\xff\ +\xd7\x01\xfa\x03'\xff\xae\x01\xfa\x03(\xff\xd7\x01\xfa\x03\ +)\xff\xae\x01\xfa\x03*\xff\xd7\x01\xfa\x03+\xff\xae\x01\ +\xfa\x03,\xff\xd7\x01\xfa\x03-\xff\xae\x01\xfa\x03.\xff\ +\xd7\x01\xfa\x03/\xff\xae\x01\xfa\x030\xff\xd7\x01\xfa\x03\ +1\xff\xae\x01\xfa\x032\xff\xd7\x01\xfa\x033\xff\xae\x01\ +\xfa\x034\xff\xd7\x01\xfa\x036\xff\xd7\x01\xfa\x038\xff\ +\xd7\x01\xfa\x03:\xff\xd7\x01\xfa\x03<\xff\xd7\x01\xfa\x03\ +@\xff\xd7\x01\xfa\x03B\xff\xd7\x01\xfa\x03D\xff\xd7\x01\ +\xfa\x03I\xff\xec\x01\xfa\x03J\xff\xd7\x01\xfa\x03K\xff\ +\xec\x01\xfa\x03L\xff\xd7\x01\xfa\x03M\xff\xec\x01\xfa\x03\ +N\xff\xd7\x01\xfa\x03O\xff\xec\x01\xfa\x03Q\xff\xec\x01\ +\xfa\x03R\xff\xd7\x01\xfa\x03S\xff\xec\x01\xfa\x03T\xff\ +\xd7\x01\xfa\x03U\xff\xec\x01\xfa\x03V\xff\xd7\x01\xfa\x03\ +W\xff\xec\x01\xfa\x03X\xff\xd7\x01\xfa\x03Y\xff\xec\x01\ +\xfa\x03Z\xff\xd7\x01\xfa\x03[\xff\xec\x01\xfa\x03\x5c\xff\ +\xd7\x01\xfa\x03]\xff\xec\x01\xfa\x03^\xff\xd7\x01\xfa\x03\ +_\xff\xec\x01\xfa\x03`\xff\xd7\x01\xfa\x03b\xff\xec\x01\ +\xfa\x03d\xff\xec\x01\xfa\x03f\xff\xec\x01\xfa\x03h\xff\ +\xec\x01\xfa\x03j\xff\xec\x01\xfa\x03l\xff\xec\x01\xfa\x03\ +n\xff\xec\x01\xfb\x00\x05\x00R\x01\xfb\x00\x0a\x00R\x01\ +\xfb\x00\x0f\xff\xae\x01\xfb\x00\x11\xff\xae\x01\xfb\x00\x22\x00\ +)\x01\xfb\x02\x07\x00R\x01\xfb\x02\x08\xff\xae\x01\xfb\x02\ +\x0b\x00R\x01\xfb\x02\x0c\xff\xae\x01\xfc\x00\x0f\xff\x9a\x01\ +\xfc\x00\x11\xff\x9a\x01\xfc\x00\x22\x00)\x01\xfc\x00$\xff\ +\xae\x01\xfc\x00&\xff\xec\x01\xfc\x00*\xff\xec\x01\xfc\x00\ +2\xff\xec\x01\xfc\x004\xff\xec\x01\xfc\x00D\xff\xd7\x01\ +\xfc\x00F\xff\xd7\x01\xfc\x00G\xff\xd7\x01\xfc\x00H\xff\ +\xd7\x01\xfc\x00J\xff\xec\x01\xfc\x00P\xff\xec\x01\xfc\x00\ +Q\xff\xec\x01\xfc\x00R\xff\xd7\x01\xfc\x00S\xff\xec\x01\ +\xfc\x00T\xff\xd7\x01\xfc\x00U\xff\xec\x01\xfc\x00V\xff\ +\xec\x01\xfc\x00X\xff\xec\x01\xfc\x00\x82\xff\xae\x01\xfc\x00\ +\x83\xff\xae\x01\xfc\x00\x84\xff\xae\x01\xfc\x00\x85\xff\xae\x01\ +\xfc\x00\x86\xff\xae\x01\xfc\x00\x87\xff\xae\x01\xfc\x00\x89\xff\ +\xec\x01\xfc\x00\x94\xff\xec\x01\xfc\x00\x95\xff\xec\x01\xfc\x00\ +\x96\xff\xec\x01\xfc\x00\x97\xff\xec\x01\xfc\x00\x98\xff\xec\x01\ +\xfc\x00\x9a\xff\xec\x01\xfc\x00\xa2\xff\xd7\x01\xfc\x00\xa3\xff\ +\xd7\x01\xfc\x00\xa4\xff\xd7\x01\xfc\x00\xa5\xff\xd7\x01\xfc\x00\ +\xa6\xff\xd7\x01\xfc\x00\xa7\xff\xd7\x01\xfc\x00\xa8\xff\xd7\x01\ +\xfc\x00\xa9\xff\xd7\x01\xfc\x00\xaa\xff\xd7\x01\xfc\x00\xab\xff\ +\xd7\x01\xfc\x00\xac\xff\xd7\x01\xfc\x00\xad\xff\xd7\x01\xfc\x00\ +\xb4\xff\xd7\x01\xfc\x00\xb5\xff\xd7\x01\xfc\x00\xb6\xff\xd7\x01\ +\xfc\x00\xb7\xff\xd7\x01\xfc\x00\xb8\xff\xd7\x01\xfc\x00\xba\xff\ +\xd7\x01\xfc\x00\xbb\xff\xec\x01\xfc\x00\xbc\xff\xec\x01\xfc\x00\ +\xbd\xff\xec\x01\xfc\x00\xbe\xff\xec\x01\xfc\x00\xc2\xff\xae\x01\ +\xfc\x00\xc3\xff\xd7\x01\xfc\x00\xc4\xff\xae\x01\xfc\x00\xc5\xff\ +\xd7\x01\xfc\x00\xc6\xff\xae\x01\xfc\x00\xc7\xff\xd7\x01\xfc\x00\ +\xc8\xff\xec\x01\xfc\x00\xc9\xff\xd7\x01\xfc\x00\xca\xff\xec\x01\ +\xfc\x00\xcb\xff\xd7\x01\xfc\x00\xcc\xff\xec\x01\xfc\x00\xcd\xff\ +\xd7\x01\xfc\x00\xce\xff\xec\x01\xfc\x00\xcf\xff\xd7\x01\xfc\x00\ +\xd1\xff\xd7\x01\xfc\x00\xd3\xff\xd7\x01\xfc\x00\xd5\xff\xd7\x01\ +\xfc\x00\xd7\xff\xd7\x01\xfc\x00\xd9\xff\xd7\x01\xfc\x00\xdb\xff\ +\xd7\x01\xfc\x00\xdd\xff\xd7\x01\xfc\x00\xde\xff\xec\x01\xfc\x00\ +\xdf\xff\xec\x01\xfc\x00\xe0\xff\xec\x01\xfc\x00\xe1\xff\xec\x01\ +\xfc\x00\xe2\xff\xec\x01\xfc\x00\xe3\xff\xec\x01\xfc\x00\xe4\xff\ +\xec\x01\xfc\x00\xe5\xff\xec\x01\xfc\x00\xfa\xff\xec\x01\xfc\x01\ +\x06\xff\xec\x01\xfc\x01\x08\xff\xec\x01\xfc\x01\x0d\xff\xec\x01\ +\xfc\x01\x0e\xff\xec\x01\xfc\x01\x0f\xff\xd7\x01\xfc\x01\x10\xff\ +\xec\x01\xfc\x01\x11\xff\xd7\x01\xfc\x01\x12\xff\xec\x01\xfc\x01\ +\x13\xff\xd7\x01\xfc\x01\x14\xff\xec\x01\xfc\x01\x15\xff\xd7\x01\ +\xfc\x01\x17\xff\xec\x01\xfc\x01\x19\xff\xec\x01\xfc\x01\x1d\xff\ +\xec\x01\xfc\x01!\xff\xec\x01\xfc\x01+\xff\xec\x01\xfc\x01\ +-\xff\xec\x01\xfc\x01/\xff\xec\x01\xfc\x011\xff\xec\x01\ +\xfc\x013\xff\xec\x01\xfc\x015\xff\xec\x01\xfc\x01C\xff\ +\xae\x01\xfc\x01D\xff\xd7\x01\xfc\x01F\xff\xd7\x01\xfc\x01\ +G\xff\xec\x01\xfc\x01H\xff\xd7\x01\xfc\x01J\xff\xec\x01\ +\xfc\x02\x08\xff\x9a\x01\xfc\x02\x0c\xff\x9a\x01\xfc\x02W\xff\ +\xec\x01\xfc\x02X\xff\xae\x01\xfc\x02Y\xff\xd7\x01\xfc\x02\ +_\xff\xec\x01\xfc\x02`\xff\xd7\x01\xfc\x02b\xff\xec\x01\ +\xfc\x03\x1d\xff\xae\x01\xfc\x03\x1e\xff\xd7\x01\xfc\x03\x1f\xff\ +\xae\x01\xfc\x03 \xff\xd7\x01\xfc\x03!\xff\xae\x01\xfc\x03\ +\x22\xff\xd7\x01\xfc\x03#\xff\xae\x01\xfc\x03%\xff\xae\x01\ +\xfc\x03&\xff\xd7\x01\xfc\x03'\xff\xae\x01\xfc\x03(\xff\ +\xd7\x01\xfc\x03)\xff\xae\x01\xfc\x03*\xff\xd7\x01\xfc\x03\ ++\xff\xae\x01\xfc\x03,\xff\xd7\x01\xfc\x03-\xff\xae\x01\ +\xfc\x03.\xff\xd7\x01\xfc\x03/\xff\xae\x01\xfc\x030\xff\ +\xd7\x01\xfc\x031\xff\xae\x01\xfc\x032\xff\xd7\x01\xfc\x03\ +3\xff\xae\x01\xfc\x034\xff\xd7\x01\xfc\x036\xff\xd7\x01\ +\xfc\x038\xff\xd7\x01\xfc\x03:\xff\xd7\x01\xfc\x03<\xff\ +\xd7\x01\xfc\x03@\xff\xd7\x01\xfc\x03B\xff\xd7\x01\xfc\x03\ +D\xff\xd7\x01\xfc\x03I\xff\xec\x01\xfc\x03J\xff\xd7\x01\ +\xfc\x03K\xff\xec\x01\xfc\x03L\xff\xd7\x01\xfc\x03M\xff\ +\xec\x01\xfc\x03N\xff\xd7\x01\xfc\x03O\xff\xec\x01\xfc\x03\ +Q\xff\xec\x01\xfc\x03R\xff\xd7\x01\xfc\x03S\xff\xec\x01\ +\xfc\x03T\xff\xd7\x01\xfc\x03U\xff\xec\x01\xfc\x03V\xff\ +\xd7\x01\xfc\x03W\xff\xec\x01\xfc\x03X\xff\xd7\x01\xfc\x03\ +Y\xff\xec\x01\xfc\x03Z\xff\xd7\x01\xfc\x03[\xff\xec\x01\ +\xfc\x03\x5c\xff\xd7\x01\xfc\x03]\xff\xec\x01\xfc\x03^\xff\ +\xd7\x01\xfc\x03_\xff\xec\x01\xfc\x03`\xff\xd7\x01\xfc\x03\ +b\xff\xec\x01\xfc\x03d\xff\xec\x01\xfc\x03f\xff\xec\x01\ +\xfc\x03h\xff\xec\x01\xfc\x03j\xff\xec\x01\xfc\x03l\xff\ +\xec\x01\xfc\x03n\xff\xec\x01\xfd\x00\x05\x00R\x01\xfd\x00\ +\x0a\x00R\x01\xfd\x00\x0f\xff\xae\x01\xfd\x00\x11\xff\xae\x01\ +\xfd\x00\x22\x00)\x01\xfd\x02\x07\x00R\x01\xfd\x02\x08\xff\ +\xae\x01\xfd\x02\x0b\x00R\x01\xfd\x02\x0c\xff\xae\x01\xfe\x00\ +\x0f\xff\x9a\x01\xfe\x00\x11\xff\x9a\x01\xfe\x00\x22\x00)\x01\ +\xfe\x00$\xff\xae\x01\xfe\x00&\xff\xec\x01\xfe\x00*\xff\ +\xec\x01\xfe\x002\xff\xec\x01\xfe\x004\xff\xec\x01\xfe\x00\ +D\xff\xd7\x01\xfe\x00F\xff\xd7\x01\xfe\x00G\xff\xd7\x01\ +\xfe\x00H\xff\xd7\x01\xfe\x00J\xff\xec\x01\xfe\x00P\xff\ +\xec\x01\xfe\x00Q\xff\xec\x01\xfe\x00R\xff\xd7\x01\xfe\x00\ +S\xff\xec\x01\xfe\x00T\xff\xd7\x01\xfe\x00U\xff\xec\x01\ +\xfe\x00V\xff\xec\x01\xfe\x00X\xff\xec\x01\xfe\x00\x82\xff\ +\xae\x01\xfe\x00\x83\xff\xae\x01\xfe\x00\x84\xff\xae\x01\xfe\x00\ +\x85\xff\xae\x01\xfe\x00\x86\xff\xae\x01\xfe\x00\x87\xff\xae\x01\ +\xfe\x00\x89\xff\xec\x01\xfe\x00\x94\xff\xec\x01\xfe\x00\x95\xff\ +\xec\x01\xfe\x00\x96\xff\xec\x01\xfe\x00\x97\xff\xec\x01\xfe\x00\ +\x98\xff\xec\x01\xfe\x00\x9a\xff\xec\x01\xfe\x00\xa2\xff\xd7\x01\ +\xfe\x00\xa3\xff\xd7\x01\xfe\x00\xa4\xff\xd7\x01\xfe\x00\xa5\xff\ +\xd7\x01\xfe\x00\xa6\xff\xd7\x01\xfe\x00\xa7\xff\xd7\x01\xfe\x00\ +\xa8\xff\xd7\x01\xfe\x00\xa9\xff\xd7\x01\xfe\x00\xaa\xff\xd7\x01\ +\xfe\x00\xab\xff\xd7\x01\xfe\x00\xac\xff\xd7\x01\xfe\x00\xad\xff\ +\xd7\x01\xfe\x00\xb4\xff\xd7\x01\xfe\x00\xb5\xff\xd7\x01\xfe\x00\ +\xb6\xff\xd7\x01\xfe\x00\xb7\xff\xd7\x01\xfe\x00\xb8\xff\xd7\x01\ +\xfe\x00\xba\xff\xd7\x01\xfe\x00\xbb\xff\xec\x01\xfe\x00\xbc\xff\ +\xec\x01\xfe\x00\xbd\xff\xec\x01\xfe\x00\xbe\xff\xec\x01\xfe\x00\ +\xc2\xff\xae\x01\xfe\x00\xc3\xff\xd7\x01\xfe\x00\xc4\xff\xae\x01\ +\xfe\x00\xc5\xff\xd7\x01\xfe\x00\xc6\xff\xae\x01\xfe\x00\xc7\xff\ +\xd7\x01\xfe\x00\xc8\xff\xec\x01\xfe\x00\xc9\xff\xd7\x01\xfe\x00\ +\xca\xff\xec\x01\xfe\x00\xcb\xff\xd7\x01\xfe\x00\xcc\xff\xec\x01\ +\xfe\x00\xcd\xff\xd7\x01\xfe\x00\xce\xff\xec\x01\xfe\x00\xcf\xff\ +\xd7\x01\xfe\x00\xd1\xff\xd7\x01\xfe\x00\xd3\xff\xd7\x01\xfe\x00\ +\xd5\xff\xd7\x01\xfe\x00\xd7\xff\xd7\x01\xfe\x00\xd9\xff\xd7\x01\ +\xfe\x00\xdb\xff\xd7\x01\xfe\x00\xdd\xff\xd7\x01\xfe\x00\xde\xff\ +\xec\x01\xfe\x00\xdf\xff\xec\x01\xfe\x00\xe0\xff\xec\x01\xfe\x00\ +\xe1\xff\xec\x01\xfe\x00\xe2\xff\xec\x01\xfe\x00\xe3\xff\xec\x01\ +\xfe\x00\xe4\xff\xec\x01\xfe\x00\xe5\xff\xec\x01\xfe\x00\xfa\xff\ +\xec\x01\xfe\x01\x06\xff\xec\x01\xfe\x01\x08\xff\xec\x01\xfe\x01\ +\x0d\xff\xec\x01\xfe\x01\x0e\xff\xec\x01\xfe\x01\x0f\xff\xd7\x01\ +\xfe\x01\x10\xff\xec\x01\xfe\x01\x11\xff\xd7\x01\xfe\x01\x12\xff\ +\xec\x01\xfe\x01\x13\xff\xd7\x01\xfe\x01\x14\xff\xec\x01\xfe\x01\ +\x15\xff\xd7\x01\xfe\x01\x17\xff\xec\x01\xfe\x01\x19\xff\xec\x01\ +\xfe\x01\x1d\xff\xec\x01\xfe\x01!\xff\xec\x01\xfe\x01+\xff\ +\xec\x01\xfe\x01-\xff\xec\x01\xfe\x01/\xff\xec\x01\xfe\x01\ +1\xff\xec\x01\xfe\x013\xff\xec\x01\xfe\x015\xff\xec\x01\ +\xfe\x01C\xff\xae\x01\xfe\x01D\xff\xd7\x01\xfe\x01F\xff\ +\xd7\x01\xfe\x01G\xff\xec\x01\xfe\x01H\xff\xd7\x01\xfe\x01\ +J\xff\xec\x01\xfe\x02\x08\xff\x9a\x01\xfe\x02\x0c\xff\x9a\x01\ +\xfe\x02W\xff\xec\x01\xfe\x02X\xff\xae\x01\xfe\x02Y\xff\ +\xd7\x01\xfe\x02_\xff\xec\x01\xfe\x02`\xff\xd7\x01\xfe\x02\ +b\xff\xec\x01\xfe\x03\x1d\xff\xae\x01\xfe\x03\x1e\xff\xd7\x01\ +\xfe\x03\x1f\xff\xae\x01\xfe\x03 \xff\xd7\x01\xfe\x03!\xff\ +\xae\x01\xfe\x03\x22\xff\xd7\x01\xfe\x03#\xff\xae\x01\xfe\x03\ +%\xff\xae\x01\xfe\x03&\xff\xd7\x01\xfe\x03'\xff\xae\x01\ +\xfe\x03(\xff\xd7\x01\xfe\x03)\xff\xae\x01\xfe\x03*\xff\ +\xd7\x01\xfe\x03+\xff\xae\x01\xfe\x03,\xff\xd7\x01\xfe\x03\ +-\xff\xae\x01\xfe\x03.\xff\xd7\x01\xfe\x03/\xff\xae\x01\ +\xfe\x030\xff\xd7\x01\xfe\x031\xff\xae\x01\xfe\x032\xff\ +\xd7\x01\xfe\x033\xff\xae\x01\xfe\x034\xff\xd7\x01\xfe\x03\ +6\xff\xd7\x01\xfe\x038\xff\xd7\x01\xfe\x03:\xff\xd7\x01\ +\xfe\x03<\xff\xd7\x01\xfe\x03@\xff\xd7\x01\xfe\x03B\xff\ +\xd7\x01\xfe\x03D\xff\xd7\x01\xfe\x03I\xff\xec\x01\xfe\x03\ +J\xff\xd7\x01\xfe\x03K\xff\xec\x01\xfe\x03L\xff\xd7\x01\ +\xfe\x03M\xff\xec\x01\xfe\x03N\xff\xd7\x01\xfe\x03O\xff\ +\xec\x01\xfe\x03Q\xff\xec\x01\xfe\x03R\xff\xd7\x01\xfe\x03\ +S\xff\xec\x01\xfe\x03T\xff\xd7\x01\xfe\x03U\xff\xec\x01\ +\xfe\x03V\xff\xd7\x01\xfe\x03W\xff\xec\x01\xfe\x03X\xff\ +\xd7\x01\xfe\x03Y\xff\xec\x01\xfe\x03Z\xff\xd7\x01\xfe\x03\ +[\xff\xec\x01\xfe\x03\x5c\xff\xd7\x01\xfe\x03]\xff\xec\x01\ +\xfe\x03^\xff\xd7\x01\xfe\x03_\xff\xec\x01\xfe\x03`\xff\ +\xd7\x01\xfe\x03b\xff\xec\x01\xfe\x03d\xff\xec\x01\xfe\x03\ +f\xff\xec\x01\xfe\x03h\xff\xec\x01\xfe\x03j\xff\xec\x01\ +\xfe\x03l\xff\xec\x01\xfe\x03n\xff\xec\x01\xff\x00\x05\x00\ +R\x01\xff\x00\x0a\x00R\x01\xff\x00\x0f\xff\xae\x01\xff\x00\ +\x11\xff\xae\x01\xff\x00\x22\x00)\x01\xff\x02\x07\x00R\x01\ +\xff\x02\x08\xff\xae\x01\xff\x02\x0b\x00R\x01\xff\x02\x0c\xff\ +\xae\x02\x00\x00\x0f\xff\x85\x02\x00\x00\x11\xff\x85\x02\x00\x00\ +\x22\x00)\x02\x00\x00$\xff\x85\x02\x00\x00&\xff\xd7\x02\ +\x00\x00*\xff\xd7\x02\x00\x002\xff\xd7\x02\x00\x004\xff\ +\xd7\x02\x00\x00D\xff\x9a\x02\x00\x00F\xff\x9a\x02\x00\x00\ +G\xff\x9a\x02\x00\x00H\xff\x9a\x02\x00\x00J\xff\xd7\x02\ +\x00\x00P\xff\xc3\x02\x00\x00Q\xff\xc3\x02\x00\x00R\xff\ +\x9a\x02\x00\x00S\xff\xc3\x02\x00\x00T\xff\x9a\x02\x00\x00\ +U\xff\xc3\x02\x00\x00V\xff\xae\x02\x00\x00X\xff\xc3\x02\ +\x00\x00]\xff\xd7\x02\x00\x00\x82\xff\x85\x02\x00\x00\x83\xff\ +\x85\x02\x00\x00\x84\xff\x85\x02\x00\x00\x85\xff\x85\x02\x00\x00\ +\x86\xff\x85\x02\x00\x00\x87\xff\x85\x02\x00\x00\x89\xff\xd7\x02\ +\x00\x00\x94\xff\xd7\x02\x00\x00\x95\xff\xd7\x02\x00\x00\x96\xff\ +\xd7\x02\x00\x00\x97\xff\xd7\x02\x00\x00\x98\xff\xd7\x02\x00\x00\ +\x9a\xff\xd7\x02\x00\x00\xa2\xff\x9a\x02\x00\x00\xa3\xff\x9a\x02\ +\x00\x00\xa4\xff\x9a\x02\x00\x00\xa5\xff\x9a\x02\x00\x00\xa6\xff\ +\x9a\x02\x00\x00\xa7\xff\x9a\x02\x00\x00\xa8\xff\x9a\x02\x00\x00\ +\xa9\xff\x9a\x02\x00\x00\xaa\xff\x9a\x02\x00\x00\xab\xff\x9a\x02\ +\x00\x00\xac\xff\x9a\x02\x00\x00\xad\xff\x9a\x02\x00\x00\xb4\xff\ +\x9a\x02\x00\x00\xb5\xff\x9a\x02\x00\x00\xb6\xff\x9a\x02\x00\x00\ +\xb7\xff\x9a\x02\x00\x00\xb8\xff\x9a\x02\x00\x00\xba\xff\x9a\x02\ +\x00\x00\xbb\xff\xc3\x02\x00\x00\xbc\xff\xc3\x02\x00\x00\xbd\xff\ +\xc3\x02\x00\x00\xbe\xff\xc3\x02\x00\x00\xc2\xff\x85\x02\x00\x00\ +\xc3\xff\x9a\x02\x00\x00\xc4\xff\x85\x02\x00\x00\xc5\xff\x9a\x02\ +\x00\x00\xc6\xff\x85\x02\x00\x00\xc7\xff\x9a\x02\x00\x00\xc8\xff\ +\xd7\x02\x00\x00\xc9\xff\x9a\x02\x00\x00\xca\xff\xd7\x02\x00\x00\ +\xcb\xff\x9a\x02\x00\x00\xcc\xff\xd7\x02\x00\x00\xcd\xff\x9a\x02\ +\x00\x00\xce\xff\xd7\x02\x00\x00\xcf\xff\x9a\x02\x00\x00\xd1\xff\ +\x9a\x02\x00\x00\xd3\xff\x9a\x02\x00\x00\xd5\xff\x9a\x02\x00\x00\ +\xd7\xff\x9a\x02\x00\x00\xd9\xff\x9a\x02\x00\x00\xdb\xff\x9a\x02\ +\x00\x00\xdd\xff\x9a\x02\x00\x00\xde\xff\xd7\x02\x00\x00\xdf\xff\ +\xd7\x02\x00\x00\xe0\xff\xd7\x02\x00\x00\xe1\xff\xd7\x02\x00\x00\ +\xe2\xff\xd7\x02\x00\x00\xe3\xff\xd7\x02\x00\x00\xe4\xff\xd7\x02\ +\x00\x00\xe5\xff\xd7\x02\x00\x00\xfa\xff\xc3\x02\x00\x01\x06\xff\ +\xc3\x02\x00\x01\x08\xff\xc3\x02\x00\x01\x0d\xff\xc3\x02\x00\x01\ +\x0e\xff\xd7\x02\x00\x01\x0f\xff\x9a\x02\x00\x01\x10\xff\xd7\x02\ +\x00\x01\x11\xff\x9a\x02\x00\x01\x12\xff\xd7\x02\x00\x01\x13\xff\ +\x9a\x02\x00\x01\x14\xff\xd7\x02\x00\x01\x15\xff\x9a\x02\x00\x01\ +\x17\xff\xc3\x02\x00\x01\x19\xff\xc3\x02\x00\x01\x1d\xff\xae\x02\ +\x00\x01!\xff\xae\x02\x00\x01+\xff\xc3\x02\x00\x01-\xff\ +\xc3\x02\x00\x01/\xff\xc3\x02\x00\x011\xff\xc3\x02\x00\x01\ +3\xff\xc3\x02\x00\x015\xff\xc3\x02\x00\x01<\xff\xd7\x02\ +\x00\x01>\xff\xd7\x02\x00\x01@\xff\xd7\x02\x00\x01C\xff\ +\x85\x02\x00\x01D\xff\x9a\x02\x00\x01F\xff\x9a\x02\x00\x01\ +G\xff\xd7\x02\x00\x01H\xff\x9a\x02\x00\x01J\xff\xae\x02\ +\x00\x02\x08\xff\x85\x02\x00\x02\x0c\xff\x85\x02\x00\x02W\xff\ +\xc3\x02\x00\x02X\xff\x85\x02\x00\x02Y\xff\x9a\x02\x00\x02\ +_\xff\xd7\x02\x00\x02`\xff\x9a\x02\x00\x02b\xff\xc3\x02\ +\x00\x03\x1d\xff\x85\x02\x00\x03\x1e\xff\x9a\x02\x00\x03\x1f\xff\ +\x85\x02\x00\x03 \xff\x9a\x02\x00\x03!\xff\x85\x02\x00\x03\ +\x22\xff\x9a\x02\x00\x03#\xff\x85\x02\x00\x03%\xff\x85\x02\ +\x00\x03&\xff\x9a\x02\x00\x03'\xff\x85\x02\x00\x03(\xff\ +\x9a\x02\x00\x03)\xff\x85\x02\x00\x03*\xff\x9a\x02\x00\x03\ ++\xff\x85\x02\x00\x03,\xff\x9a\x02\x00\x03-\xff\x85\x02\ +\x00\x03.\xff\x9a\x02\x00\x03/\xff\x85\x02\x00\x030\xff\ +\x9a\x02\x00\x031\xff\x85\x02\x00\x032\xff\x9a\x02\x00\x03\ +3\xff\x85\x02\x00\x034\xff\x9a\x02\x00\x036\xff\x9a\x02\ +\x00\x038\xff\x9a\x02\x00\x03:\xff\x9a\x02\x00\x03<\xff\ +\x9a\x02\x00\x03@\xff\x9a\x02\x00\x03B\xff\x9a\x02\x00\x03\ +D\xff\x9a\x02\x00\x03I\xff\xd7\x02\x00\x03J\xff\x9a\x02\ +\x00\x03K\xff\xd7\x02\x00\x03L\xff\x9a\x02\x00\x03M\xff\ +\xd7\x02\x00\x03N\xff\x9a\x02\x00\x03O\xff\xd7\x02\x00\x03\ +Q\xff\xd7\x02\x00\x03R\xff\x9a\x02\x00\x03S\xff\xd7\x02\ +\x00\x03T\xff\x9a\x02\x00\x03U\xff\xd7\x02\x00\x03V\xff\ +\x9a\x02\x00\x03W\xff\xd7\x02\x00\x03X\xff\x9a\x02\x00\x03\ +Y\xff\xd7\x02\x00\x03Z\xff\x9a\x02\x00\x03[\xff\xd7\x02\ +\x00\x03\x5c\xff\x9a\x02\x00\x03]\xff\xd7\x02\x00\x03^\xff\ +\x9a\x02\x00\x03_\xff\xd7\x02\x00\x03`\xff\x9a\x02\x00\x03\ +b\xff\xc3\x02\x00\x03d\xff\xc3\x02\x00\x03f\xff\xc3\x02\ +\x00\x03h\xff\xc3\x02\x00\x03j\xff\xc3\x02\x00\x03l\xff\ +\xc3\x02\x00\x03n\xff\xc3\x02\x01\x00\x05\x00R\x02\x01\x00\ +\x0a\x00R\x02\x01\x00\x0f\xff\xae\x02\x01\x00\x11\xff\xae\x02\ +\x01\x00\x22\x00)\x02\x01\x02\x07\x00R\x02\x01\x02\x08\xff\ +\xae\x02\x01\x02\x0b\x00R\x02\x01\x02\x0c\xff\xae\x02\x02\x00\ +7\xff\xae\x02\x02\x01$\xff\xae\x02\x02\x01&\xff\xae\x02\ +\x02\x01q\xff\xae\x02\x02\x01\x9d\xff\xae\x02\x02\x01\xa6\xff\ +\xae\x02\x02\x01\xbc\xff\xae\x02\x02\x01\xc4\xff\xae\x02\x02\x01\ +\xdc\xff\xd7\x02\x02\x01\xe4\xff\xd7\x02\x02\x02\xa9\xff\xae\x02\ +\x02\x02\xaa\xff\xd7\x02\x02\x02\xb5\xff\xae\x02\x02\x02\xb6\xff\ +\xd7\x02\x02\x02\xbd\xff\xae\x02\x02\x02\xbe\xff\xd7\x02\x02\x03\ +\x17\xff\xae\x02\x02\x03\x18\xff\xd7\x02\x02\x03\x8f\xff\xae\x02\ +\x03\x007\xff\xae\x02\x03\x01$\xff\xae\x02\x03\x01&\xff\ +\xae\x02\x03\x01q\xff\xae\x02\x03\x01\x9d\xff\xae\x02\x03\x01\ +\xa6\xff\xae\x02\x03\x01\xbc\xff\xae\x02\x03\x01\xc4\xff\xae\x02\ +\x03\x01\xdc\xff\xd7\x02\x03\x01\xe4\xff\xd7\x02\x03\x02\xa9\xff\ +\xae\x02\x03\x02\xaa\xff\xd7\x02\x03\x02\xb5\xff\xae\x02\x03\x02\ +\xb6\xff\xd7\x02\x03\x02\xbd\xff\xae\x02\x03\x02\xbe\xff\xd7\x02\ +\x03\x03\x17\xff\xae\x02\x03\x03\x18\xff\xd7\x02\x03\x03\x8f\xff\ +\xae\x02\x04\x007\xff\xae\x02\x04\x01$\xff\xae\x02\x04\x01\ +&\xff\xae\x02\x04\x01q\xff\xae\x02\x04\x01\x9d\xff\xae\x02\ +\x04\x01\xa6\xff\xae\x02\x04\x01\xbc\xff\xae\x02\x04\x01\xc4\xff\ +\xae\x02\x04\x01\xdc\xff\xd7\x02\x04\x01\xe4\xff\xd7\x02\x04\x02\ +\xa9\xff\xae\x02\x04\x02\xaa\xff\xd7\x02\x04\x02\xb5\xff\xae\x02\ +\x04\x02\xb6\xff\xd7\x02\x04\x02\xbd\xff\xae\x02\x04\x02\xbe\xff\ +\xd7\x02\x04\x03\x17\xff\xae\x02\x04\x03\x18\xff\xd7\x02\x04\x03\ +\x8f\xff\xae\x02\x06\x00$\xffq\x02\x06\x007\x00)\x02\ +\x06\x009\x00)\x02\x06\x00:\x00)\x02\x06\x00<\x00\ +\x14\x02\x06\x00D\xff\xae\x02\x06\x00F\xff\x85\x02\x06\x00\ +G\xff\x85\x02\x06\x00H\xff\x85\x02\x06\x00J\xff\xc3\x02\ +\x06\x00P\xff\xc3\x02\x06\x00Q\xff\xc3\x02\x06\x00R\xff\ +\x85\x02\x06\x00S\xff\xc3\x02\x06\x00T\xff\x85\x02\x06\x00\ +U\xff\xc3\x02\x06\x00V\xff\xc3\x02\x06\x00X\xff\xc3\x02\ +\x06\x00\x82\xffq\x02\x06\x00\x83\xffq\x02\x06\x00\x84\xff\ +q\x02\x06\x00\x85\xffq\x02\x06\x00\x86\xffq\x02\x06\x00\ +\x87\xffq\x02\x06\x00\x9f\x00\x14\x02\x06\x00\xa2\xff\x85\x02\ +\x06\x00\xa3\xff\xae\x02\x06\x00\xa4\xff\xae\x02\x06\x00\xa5\xff\ +\xae\x02\x06\x00\xa6\xff\xae\x02\x06\x00\xa7\xff\xae\x02\x06\x00\ +\xa8\xff\xae\x02\x06\x00\xa9\xff\x85\x02\x06\x00\xaa\xff\x85\x02\ +\x06\x00\xab\xff\x85\x02\x06\x00\xac\xff\x85\x02\x06\x00\xad\xff\ +\x85\x02\x06\x00\xb4\xff\x85\x02\x06\x00\xb5\xff\x85\x02\x06\x00\ +\xb6\xff\x85\x02\x06\x00\xb7\xff\x85\x02\x06\x00\xb8\xff\x85\x02\ +\x06\x00\xba\xff\x85\x02\x06\x00\xbb\xff\xc3\x02\x06\x00\xbc\xff\ +\xc3\x02\x06\x00\xbd\xff\xc3\x02\x06\x00\xbe\xff\xc3\x02\x06\x00\ +\xc2\xffq\x02\x06\x00\xc3\xff\xae\x02\x06\x00\xc4\xffq\x02\ +\x06\x00\xc5\xff\xae\x02\x06\x00\xc6\xffq\x02\x06\x00\xc7\xff\ +\xae\x02\x06\x00\xc9\xff\x85\x02\x06\x00\xcb\xff\x85\x02\x06\x00\ +\xcd\xff\x85\x02\x06\x00\xcf\xff\x85\x02\x06\x00\xd1\xff\x85\x02\ +\x06\x00\xd3\xff\x85\x02\x06\x00\xd5\xff\x85\x02\x06\x00\xd7\xff\ +\x85\x02\x06\x00\xd9\xff\x85\x02\x06\x00\xdb\xff\x85\x02\x06\x00\ +\xdd\xff\x85\x02\x06\x00\xdf\xff\xc3\x02\x06\x00\xe1\xff\xc3\x02\ +\x06\x00\xe3\xff\xc3\x02\x06\x00\xe5\xff\xc3\x02\x06\x00\xfa\xff\ +\xc3\x02\x06\x01\x06\xff\xc3\x02\x06\x01\x08\xff\xc3\x02\x06\x01\ +\x0d\xff\xc3\x02\x06\x01\x0f\xff\x85\x02\x06\x01\x11\xff\x85\x02\ +\x06\x01\x13\xff\x85\x02\x06\x01\x15\xff\x85\x02\x06\x01\x17\xff\ +\xc3\x02\x06\x01\x19\xff\xc3\x02\x06\x01\x1d\xff\xc3\x02\x06\x01\ +!\xff\xc3\x02\x06\x01$\x00)\x02\x06\x01&\x00)\x02\ +\x06\x01+\xff\xc3\x02\x06\x01-\xff\xc3\x02\x06\x01/\xff\ +\xc3\x02\x06\x011\xff\xc3\x02\x06\x013\xff\xc3\x02\x06\x01\ +5\xff\xc3\x02\x06\x016\x00)\x02\x06\x018\x00\x14\x02\ +\x06\x01:\x00\x14\x02\x06\x01C\xffq\x02\x06\x01D\xff\ +\xae\x02\x06\x01F\xff\xae\x02\x06\x01H\xff\x85\x02\x06\x01\ +J\xff\xc3\x02\x06\x01V\xffq\x02\x06\x01_\xffq\x02\ +\x06\x01b\xffq\x02\x06\x01i\xffq\x02\x06\x01y\xff\ +\xae\x02\x06\x01z\xff\xd7\x02\x06\x01{\xff\xd7\x02\x06\x01\ +~\xff\xae\x02\x06\x01\x81\xff\xc3\x02\x06\x01\x82\xff\xd7\x02\ +\x06\x01\x83\xff\xd7\x02\x06\x01\x84\xff\xd7\x02\x06\x01\x87\xff\ +\xd7\x02\x06\x01\x89\xff\xd7\x02\x06\x01\x8c\xff\xae\x02\x06\x01\ +\x8e\xff\xc3\x02\x06\x01\x8f\xff\xae\x02\x06\x01\x90\xff\xae\x02\ +\x06\x01\x93\xff\xae\x02\x06\x01\x99\xff\xae\x02\x06\x01\xa4\xff\ +\x85\x02\x06\x01\xaa\xffq\x02\x06\x01\xae\xff\x85\x02\x06\x01\ +\xb5\xff\x85\x02\x06\x01\xca\xff\xd7\x02\x06\x01\xce\xffq\x02\ +\x06\x01\xcf\xff\x85\x02\x06\x01\xd5\xffq\x02\x06\x01\xd8\xff\ +\x85\x02\x06\x01\xdb\xff\x85\x02\x06\x01\xde\xff\x85\x02\x06\x01\ +\xea\xff\x85\x02\x06\x01\xed\xff\x85\x02\x06\x01\xee\xff\xc3\x02\ +\x06\x01\xf2\xffq\x02\x06\x01\xfa\x00)\x02\x06\x01\xfc\x00\ +)\x02\x06\x01\xfe\x00)\x02\x06\x02\x00\x00\x14\x02\x06\x02\ +W\xff\xc3\x02\x06\x02X\xffq\x02\x06\x02Y\xff\xae\x02\ +\x06\x02`\xff\x85\x02\x06\x02b\xff\xc3\x02\x06\x02j\xff\ +\x85\x02\x06\x02r\xffq\x02\x06\x02s\xffq\x02\x06\x02\ +}\xff\xec\x02\x06\x02\x7f\xff\x85\x02\x06\x02\x85\xff\x85\x02\ +\x06\x02\x87\xff\x85\x02\x06\x02\x89\xff\x85\x02\x06\x02\x8d\xff\ +\x85\x02\x06\x02\xb2\xff\x85\x02\x06\x02\xb4\xff\x85\x02\x06\x02\ +\xce\xff\x85\x02\x06\x02\xcf\xffq\x02\x06\x02\xd9\xffq\x02\ +\x06\x02\xda\xff\xd7\x02\x06\x02\xdb\xffq\x02\x06\x02\xdc\xff\ +\xd7\x02\x06\x02\xdd\xffq\x02\x06\x02\xde\xff\xd7\x02\x06\x02\ +\xe0\xff\x85\x02\x06\x02\xe2\xff\xd7\x02\x06\x02\xe4\xff\xd7\x02\ +\x06\x02\xf0\xff\x85\x02\x06\x02\xf2\xff\x85\x02\x06\x02\xf4\xff\ +\x85\x02\x06\x03\x09\xffq\x02\x06\x03\x0a\xff\x85\x02\x06\x03\ +\x0b\xffq\x02\x06\x03\x0c\xff\x85\x02\x06\x03\x11\xff\x85\x02\ +\x06\x03\x12\xffq\x02\x06\x03\x16\xff\x85\x02\x06\x03\x1a\xff\ +\x85\x02\x06\x03\x1b\xff\x85\x02\x06\x03\x1c\xffq\x02\x06\x03\ +\x1d\xffq\x02\x06\x03\x1e\xff\xae\x02\x06\x03\x1f\xffq\x02\ +\x06\x03 \xff\xae\x02\x06\x03!\xffq\x02\x06\x03\x22\xff\ +\xae\x02\x06\x03#\xffq\x02\x06\x03%\xffq\x02\x06\x03\ +&\xff\xae\x02\x06\x03'\xffq\x02\x06\x03(\xff\xae\x02\ +\x06\x03)\xffq\x02\x06\x03*\xff\xae\x02\x06\x03+\xff\ +q\x02\x06\x03,\xff\xae\x02\x06\x03-\xffq\x02\x06\x03\ +.\xff\xae\x02\x06\x03/\xffq\x02\x06\x030\xff\xae\x02\ +\x06\x031\xffq\x02\x06\x032\xff\xae\x02\x06\x033\xff\ +q\x02\x06\x034\xff\xae\x02\x06\x036\xff\x85\x02\x06\x03\ +8\xff\x85\x02\x06\x03:\xff\x85\x02\x06\x03<\xff\x85\x02\ +\x06\x03@\xff\x85\x02\x06\x03B\xff\x85\x02\x06\x03D\xff\ +\x85\x02\x06\x03J\xff\x85\x02\x06\x03L\xff\x85\x02\x06\x03\ +N\xff\x85\x02\x06\x03R\xff\x85\x02\x06\x03T\xff\x85\x02\ +\x06\x03V\xff\x85\x02\x06\x03X\xff\x85\x02\x06\x03Z\xff\ +\x85\x02\x06\x03\x5c\xff\x85\x02\x06\x03^\xff\x85\x02\x06\x03\ +`\xff\x85\x02\x06\x03b\xff\xc3\x02\x06\x03d\xff\xc3\x02\ +\x06\x03f\xff\xc3\x02\x06\x03h\xff\xc3\x02\x06\x03j\xff\ +\xc3\x02\x06\x03l\xff\xc3\x02\x06\x03n\xff\xc3\x02\x06\x03\ +o\x00\x14\x02\x06\x03q\x00\x14\x02\x06\x03s\x00\x14\x02\ +\x06\x03\x8f\x00)\x02\x07\x00$\xffq\x02\x07\x007\x00\ +)\x02\x07\x009\x00)\x02\x07\x00:\x00)\x02\x07\x00\ +<\x00\x14\x02\x07\x00D\xff\xae\x02\x07\x00F\xff\x85\x02\ +\x07\x00G\xff\x85\x02\x07\x00H\xff\x85\x02\x07\x00J\xff\ +\xc3\x02\x07\x00P\xff\xc3\x02\x07\x00Q\xff\xc3\x02\x07\x00\ +R\xff\x85\x02\x07\x00S\xff\xc3\x02\x07\x00T\xff\x85\x02\ +\x07\x00U\xff\xc3\x02\x07\x00V\xff\xc3\x02\x07\x00X\xff\ +\xc3\x02\x07\x00\x82\xffq\x02\x07\x00\x83\xffq\x02\x07\x00\ +\x84\xffq\x02\x07\x00\x85\xffq\x02\x07\x00\x86\xffq\x02\ +\x07\x00\x87\xffq\x02\x07\x00\x9f\x00\x14\x02\x07\x00\xa2\xff\ +\x85\x02\x07\x00\xa3\xff\xae\x02\x07\x00\xa4\xff\xae\x02\x07\x00\ +\xa5\xff\xae\x02\x07\x00\xa6\xff\xae\x02\x07\x00\xa7\xff\xae\x02\ +\x07\x00\xa8\xff\xae\x02\x07\x00\xa9\xff\x85\x02\x07\x00\xaa\xff\ +\x85\x02\x07\x00\xab\xff\x85\x02\x07\x00\xac\xff\x85\x02\x07\x00\ +\xad\xff\x85\x02\x07\x00\xb4\xff\x85\x02\x07\x00\xb5\xff\x85\x02\ +\x07\x00\xb6\xff\x85\x02\x07\x00\xb7\xff\x85\x02\x07\x00\xb8\xff\ +\x85\x02\x07\x00\xba\xff\x85\x02\x07\x00\xbb\xff\xc3\x02\x07\x00\ +\xbc\xff\xc3\x02\x07\x00\xbd\xff\xc3\x02\x07\x00\xbe\xff\xc3\x02\ +\x07\x00\xc2\xffq\x02\x07\x00\xc3\xff\xae\x02\x07\x00\xc4\xff\ +q\x02\x07\x00\xc5\xff\xae\x02\x07\x00\xc6\xffq\x02\x07\x00\ +\xc7\xff\xae\x02\x07\x00\xc9\xff\x85\x02\x07\x00\xcb\xff\x85\x02\ +\x07\x00\xcd\xff\x85\x02\x07\x00\xcf\xff\x85\x02\x07\x00\xd1\xff\ +\x85\x02\x07\x00\xd3\xff\x85\x02\x07\x00\xd5\xff\x85\x02\x07\x00\ +\xd7\xff\x85\x02\x07\x00\xd9\xff\x85\x02\x07\x00\xdb\xff\x85\x02\ +\x07\x00\xdd\xff\x85\x02\x07\x00\xdf\xff\xc3\x02\x07\x00\xe1\xff\ +\xc3\x02\x07\x00\xe3\xff\xc3\x02\x07\x00\xe5\xff\xc3\x02\x07\x00\ +\xfa\xff\xc3\x02\x07\x01\x06\xff\xc3\x02\x07\x01\x08\xff\xc3\x02\ +\x07\x01\x0d\xff\xc3\x02\x07\x01\x0f\xff\x85\x02\x07\x01\x11\xff\ +\x85\x02\x07\x01\x13\xff\x85\x02\x07\x01\x15\xff\x85\x02\x07\x01\ +\x17\xff\xc3\x02\x07\x01\x19\xff\xc3\x02\x07\x01\x1d\xff\xc3\x02\ +\x07\x01!\xff\xc3\x02\x07\x01$\x00)\x02\x07\x01&\x00\ +)\x02\x07\x01+\xff\xc3\x02\x07\x01-\xff\xc3\x02\x07\x01\ +/\xff\xc3\x02\x07\x011\xff\xc3\x02\x07\x013\xff\xc3\x02\ +\x07\x015\xff\xc3\x02\x07\x016\x00)\x02\x07\x018\x00\ +\x14\x02\x07\x01:\x00\x14\x02\x07\x01C\xffq\x02\x07\x01\ +D\xff\xae\x02\x07\x01F\xff\xae\x02\x07\x01H\xff\x85\x02\ +\x07\x01J\xff\xc3\x02\x07\x01V\xffq\x02\x07\x01_\xff\ +q\x02\x07\x01b\xffq\x02\x07\x01i\xffq\x02\x07\x01\ +y\xff\xae\x02\x07\x01z\xff\xd7\x02\x07\x01{\xff\xd7\x02\ +\x07\x01~\xff\xae\x02\x07\x01\x81\xff\xc3\x02\x07\x01\x82\xff\ +\xd7\x02\x07\x01\x83\xff\xd7\x02\x07\x01\x84\xff\xd7\x02\x07\x01\ +\x87\xff\xd7\x02\x07\x01\x89\xff\xd7\x02\x07\x01\x8c\xff\xae\x02\ +\x07\x01\x8e\xff\xc3\x02\x07\x01\x8f\xff\xae\x02\x07\x01\x90\xff\ +\xae\x02\x07\x01\x93\xff\xae\x02\x07\x01\x99\xff\xae\x02\x07\x01\ +\xa4\xff\x85\x02\x07\x01\xaa\xffq\x02\x07\x01\xae\xff\x85\x02\ +\x07\x01\xb5\xff\x85\x02\x07\x01\xca\xff\xd7\x02\x07\x01\xce\xff\ +q\x02\x07\x01\xcf\xff\x85\x02\x07\x01\xd5\xffq\x02\x07\x01\ +\xd8\xff\x85\x02\x07\x01\xdb\xff\x85\x02\x07\x01\xde\xff\x85\x02\ +\x07\x01\xea\xff\x85\x02\x07\x01\xed\xff\x85\x02\x07\x01\xee\xff\ +\xc3\x02\x07\x01\xf2\xffq\x02\x07\x01\xfa\x00)\x02\x07\x01\ +\xfc\x00)\x02\x07\x01\xfe\x00)\x02\x07\x02\x00\x00\x14\x02\ +\x07\x02W\xff\xc3\x02\x07\x02X\xffq\x02\x07\x02Y\xff\ +\xae\x02\x07\x02`\xff\x85\x02\x07\x02b\xff\xc3\x02\x07\x02\ +j\xff\x85\x02\x07\x02r\xffq\x02\x07\x02s\xffq\x02\ +\x07\x02}\xff\xec\x02\x07\x02\x7f\xff\x85\x02\x07\x02\x85\xff\ +\x85\x02\x07\x02\x87\xff\x85\x02\x07\x02\x89\xff\x85\x02\x07\x02\ +\x8d\xff\x85\x02\x07\x02\xb2\xff\x85\x02\x07\x02\xb4\xff\x85\x02\ +\x07\x02\xce\xff\x85\x02\x07\x02\xcf\xffq\x02\x07\x02\xd9\xff\ +q\x02\x07\x02\xda\xff\xd7\x02\x07\x02\xdb\xffq\x02\x07\x02\ +\xdc\xff\xd7\x02\x07\x02\xdd\xffq\x02\x07\x02\xde\xff\xd7\x02\ +\x07\x02\xe0\xff\x85\x02\x07\x02\xe2\xff\xd7\x02\x07\x02\xe4\xff\ +\xd7\x02\x07\x02\xf0\xff\x85\x02\x07\x02\xf2\xff\x85\x02\x07\x02\ +\xf4\xff\x85\x02\x07\x03\x09\xffq\x02\x07\x03\x0a\xff\x85\x02\ +\x07\x03\x0b\xffq\x02\x07\x03\x0c\xff\x85\x02\x07\x03\x11\xff\ +\x85\x02\x07\x03\x12\xffq\x02\x07\x03\x16\xff\x85\x02\x07\x03\ +\x1a\xff\x85\x02\x07\x03\x1b\xff\x85\x02\x07\x03\x1c\xffq\x02\ +\x07\x03\x1d\xffq\x02\x07\x03\x1e\xff\xae\x02\x07\x03\x1f\xff\ +q\x02\x07\x03 \xff\xae\x02\x07\x03!\xffq\x02\x07\x03\ +\x22\xff\xae\x02\x07\x03#\xffq\x02\x07\x03%\xffq\x02\ +\x07\x03&\xff\xae\x02\x07\x03'\xffq\x02\x07\x03(\xff\ +\xae\x02\x07\x03)\xffq\x02\x07\x03*\xff\xae\x02\x07\x03\ ++\xffq\x02\x07\x03,\xff\xae\x02\x07\x03-\xffq\x02\ +\x07\x03.\xff\xae\x02\x07\x03/\xffq\x02\x07\x030\xff\ +\xae\x02\x07\x031\xffq\x02\x07\x032\xff\xae\x02\x07\x03\ +3\xffq\x02\x07\x034\xff\xae\x02\x07\x036\xff\x85\x02\ +\x07\x038\xff\x85\x02\x07\x03:\xff\x85\x02\x07\x03<\xff\ +\x85\x02\x07\x03@\xff\x85\x02\x07\x03B\xff\x85\x02\x07\x03\ +D\xff\x85\x02\x07\x03J\xff\x85\x02\x07\x03L\xff\x85\x02\ +\x07\x03N\xff\x85\x02\x07\x03R\xff\x85\x02\x07\x03T\xff\ +\x85\x02\x07\x03V\xff\x85\x02\x07\x03X\xff\x85\x02\x07\x03\ +Z\xff\x85\x02\x07\x03\x5c\xff\x85\x02\x07\x03^\xff\x85\x02\ +\x07\x03`\xff\x85\x02\x07\x03b\xff\xc3\x02\x07\x03d\xff\ +\xc3\x02\x07\x03f\xff\xc3\x02\x07\x03h\xff\xc3\x02\x07\x03\ +j\xff\xc3\x02\x07\x03l\xff\xc3\x02\x07\x03n\xff\xc3\x02\ +\x07\x03o\x00\x14\x02\x07\x03q\x00\x14\x02\x07\x03s\x00\ +\x14\x02\x07\x03\x8f\x00)\x02\x08\x00&\xff\x9a\x02\x08\x00\ +*\xff\x9a\x02\x08\x002\xff\x9a\x02\x08\x004\xff\x9a\x02\ +\x08\x007\xffq\x02\x08\x008\xff\xd7\x02\x08\x009\xff\ +\x85\x02\x08\x00:\xff\x85\x02\x08\x00<\xff\x85\x02\x08\x00\ +\x89\xff\x9a\x02\x08\x00\x94\xff\x9a\x02\x08\x00\x95\xff\x9a\x02\ +\x08\x00\x96\xff\x9a\x02\x08\x00\x97\xff\x9a\x02\x08\x00\x98\xff\ +\x9a\x02\x08\x00\x9a\xff\x9a\x02\x08\x00\x9b\xff\xd7\x02\x08\x00\ +\x9c\xff\xd7\x02\x08\x00\x9d\xff\xd7\x02\x08\x00\x9e\xff\xd7\x02\ +\x08\x00\x9f\xff\x85\x02\x08\x00\xc8\xff\x9a\x02\x08\x00\xca\xff\ +\x9a\x02\x08\x00\xcc\xff\x9a\x02\x08\x00\xce\xff\x9a\x02\x08\x00\ +\xde\xff\x9a\x02\x08\x00\xe0\xff\x9a\x02\x08\x00\xe2\xff\x9a\x02\ +\x08\x00\xe4\xff\x9a\x02\x08\x01\x0e\xff\x9a\x02\x08\x01\x10\xff\ +\x9a\x02\x08\x01\x12\xff\x9a\x02\x08\x01\x14\xff\x9a\x02\x08\x01\ +$\xffq\x02\x08\x01&\xffq\x02\x08\x01*\xff\xd7\x02\ +\x08\x01,\xff\xd7\x02\x08\x01.\xff\xd7\x02\x08\x010\xff\ +\xd7\x02\x08\x012\xff\xd7\x02\x08\x014\xff\xd7\x02\x08\x01\ +6\xff\x85\x02\x08\x018\xff\x85\x02\x08\x01:\xff\x85\x02\ +\x08\x01G\xff\x9a\x02\x08\x01f\xff\xae\x02\x08\x01m\xff\ +\xae\x02\x08\x01q\xffq\x02\x08\x01r\xff\x85\x02\x08\x01\ +s\xff\x9a\x02\x08\x01u\xff\x85\x02\x08\x01x\xff\x85\x02\ +\x08\x01\x85\xff\xd7\x02\x08\x01\x9d\xffq\x02\x08\x01\x9f\xff\ +\x9a\x02\x08\x01\xa6\xffq\x02\x08\x01\xb8\xff\x9a\x02\x08\x01\ +\xbb\xff\x9a\x02\x08\x01\xbc\xffq\x02\x08\x01\xbe\xff\xae\x02\ +\x08\x01\xc1\xff\x5c\x02\x08\x01\xc4\xffq\x02\x08\x01\xdc\xff\ +\x9a\x02\x08\x01\xe1\xff\x85\x02\x08\x01\xe4\xff\x9a\x02\x08\x01\ +\xfa\xff\x85\x02\x08\x01\xfc\xff\x85\x02\x08\x01\xfe\xff\x85\x02\ +\x08\x02\x00\xff\x85\x02\x08\x02T\xff\x85\x02\x08\x02_\xff\ +\x9a\x02\x08\x02a\xff\xd7\x02\x08\x02l\xff\x9a\x02\x08\x02\ +|\xff\x5c\x02\x08\x02~\xff\x9a\x02\x08\x02\x80\xff\x85\x02\ +\x08\x02\x82\xff\x85\x02\x08\x02\x84\xff\x9a\x02\x08\x02\x86\xff\ +\x9a\x02\x08\x02\x88\xff\x9a\x02\x08\x02\x8a\xff\x9a\x02\x08\x02\ +\x8c\xff\x9a\x02\x08\x02\xa9\xffq\x02\x08\x02\xaa\xff\x9a\x02\ +\x08\x02\xb1\xff\x9a\x02\x08\x02\xb3\xff\x9a\x02\x08\x02\xb5\xff\ +q\x02\x08\x02\xb6\xff\x9a\x02\x08\x02\xb7\xff\x85\x02\x08\x02\ +\xb9\xff\x85\x02\x08\x02\xbd\xffq\x02\x08\x02\xbe\xff\x9a\x02\ +\x08\x02\xbf\xff\x5c\x02\x08\x02\xc0\xff\x85\x02\x08\x02\xc1\xff\ +\x5c\x02\x08\x02\xc2\xff\x85\x02\x08\x02\xc5\xff\x85\x02\x08\x02\ +\xc7\xff\x85\x02\x08\x02\xd4\xff\x5c\x02\x08\x02\xd5\xff\x85\x02\ +\x08\x02\xef\xff\x9a\x02\x08\x02\xf1\xff\x9a\x02\x08\x02\xf3\xff\ +\x9a\x02\x08\x02\xfd\xff\x5c\x02\x08\x02\xfe\xff\x85\x02\x08\x03\ +\x0d\xff\x85\x02\x08\x03\x0e\xff\x9a\x02\x08\x03\x0f\xff\x85\x02\ +\x08\x03\x10\xff\x9a\x02\x08\x03\x15\xff\x9a\x02\x08\x03\x17\xff\ +q\x02\x08\x03\x18\xff\x9a\x02\x08\x03I\xff\x9a\x02\x08\x03\ +K\xff\x9a\x02\x08\x03M\xff\x9a\x02\x08\x03O\xff\x9a\x02\ +\x08\x03Q\xff\x9a\x02\x08\x03S\xff\x9a\x02\x08\x03U\xff\ +\x9a\x02\x08\x03W\xff\x9a\x02\x08\x03Y\xff\x9a\x02\x08\x03\ +[\xff\x9a\x02\x08\x03]\xff\x9a\x02\x08\x03_\xff\x9a\x02\ +\x08\x03a\xff\xd7\x02\x08\x03c\xff\xd7\x02\x08\x03e\xff\ +\xd7\x02\x08\x03g\xff\xd7\x02\x08\x03i\xff\xd7\x02\x08\x03\ +k\xff\xd7\x02\x08\x03m\xff\xd7\x02\x08\x03o\xff\x85\x02\ +\x08\x03q\xff\x85\x02\x08\x03s\xff\x85\x02\x08\x03\x8f\xff\ +q\x02\x0a\x00$\xffq\x02\x0a\x007\x00)\x02\x0a\x00\ +9\x00)\x02\x0a\x00:\x00)\x02\x0a\x00<\x00\x14\x02\ +\x0a\x00D\xff\xae\x02\x0a\x00F\xff\x85\x02\x0a\x00G\xff\ +\x85\x02\x0a\x00H\xff\x85\x02\x0a\x00J\xff\xc3\x02\x0a\x00\ +P\xff\xc3\x02\x0a\x00Q\xff\xc3\x02\x0a\x00R\xff\x85\x02\ +\x0a\x00S\xff\xc3\x02\x0a\x00T\xff\x85\x02\x0a\x00U\xff\ +\xc3\x02\x0a\x00V\xff\xc3\x02\x0a\x00X\xff\xc3\x02\x0a\x00\ +\x82\xffq\x02\x0a\x00\x83\xffq\x02\x0a\x00\x84\xffq\x02\ +\x0a\x00\x85\xffq\x02\x0a\x00\x86\xffq\x02\x0a\x00\x87\xff\ +q\x02\x0a\x00\x9f\x00\x14\x02\x0a\x00\xa2\xff\x85\x02\x0a\x00\ +\xa3\xff\xae\x02\x0a\x00\xa4\xff\xae\x02\x0a\x00\xa5\xff\xae\x02\ +\x0a\x00\xa6\xff\xae\x02\x0a\x00\xa7\xff\xae\x02\x0a\x00\xa8\xff\ +\xae\x02\x0a\x00\xa9\xff\x85\x02\x0a\x00\xaa\xff\x85\x02\x0a\x00\ +\xab\xff\x85\x02\x0a\x00\xac\xff\x85\x02\x0a\x00\xad\xff\x85\x02\ +\x0a\x00\xb4\xff\x85\x02\x0a\x00\xb5\xff\x85\x02\x0a\x00\xb6\xff\ +\x85\x02\x0a\x00\xb7\xff\x85\x02\x0a\x00\xb8\xff\x85\x02\x0a\x00\ +\xba\xff\x85\x02\x0a\x00\xbb\xff\xc3\x02\x0a\x00\xbc\xff\xc3\x02\ +\x0a\x00\xbd\xff\xc3\x02\x0a\x00\xbe\xff\xc3\x02\x0a\x00\xc2\xff\ +q\x02\x0a\x00\xc3\xff\xae\x02\x0a\x00\xc4\xffq\x02\x0a\x00\ +\xc5\xff\xae\x02\x0a\x00\xc6\xffq\x02\x0a\x00\xc7\xff\xae\x02\ +\x0a\x00\xc9\xff\x85\x02\x0a\x00\xcb\xff\x85\x02\x0a\x00\xcd\xff\ +\x85\x02\x0a\x00\xcf\xff\x85\x02\x0a\x00\xd1\xff\x85\x02\x0a\x00\ +\xd3\xff\x85\x02\x0a\x00\xd5\xff\x85\x02\x0a\x00\xd7\xff\x85\x02\ +\x0a\x00\xd9\xff\x85\x02\x0a\x00\xdb\xff\x85\x02\x0a\x00\xdd\xff\ +\x85\x02\x0a\x00\xdf\xff\xc3\x02\x0a\x00\xe1\xff\xc3\x02\x0a\x00\ +\xe3\xff\xc3\x02\x0a\x00\xe5\xff\xc3\x02\x0a\x00\xfa\xff\xc3\x02\ +\x0a\x01\x06\xff\xc3\x02\x0a\x01\x08\xff\xc3\x02\x0a\x01\x0d\xff\ +\xc3\x02\x0a\x01\x0f\xff\x85\x02\x0a\x01\x11\xff\x85\x02\x0a\x01\ +\x13\xff\x85\x02\x0a\x01\x15\xff\x85\x02\x0a\x01\x17\xff\xc3\x02\ +\x0a\x01\x19\xff\xc3\x02\x0a\x01\x1d\xff\xc3\x02\x0a\x01!\xff\ +\xc3\x02\x0a\x01$\x00)\x02\x0a\x01&\x00)\x02\x0a\x01\ ++\xff\xc3\x02\x0a\x01-\xff\xc3\x02\x0a\x01/\xff\xc3\x02\ +\x0a\x011\xff\xc3\x02\x0a\x013\xff\xc3\x02\x0a\x015\xff\ +\xc3\x02\x0a\x016\x00)\x02\x0a\x018\x00\x14\x02\x0a\x01\ +:\x00\x14\x02\x0a\x01C\xffq\x02\x0a\x01D\xff\xae\x02\ +\x0a\x01F\xff\xae\x02\x0a\x01H\xff\x85\x02\x0a\x01J\xff\ +\xc3\x02\x0a\x01V\xffq\x02\x0a\x01_\xffq\x02\x0a\x01\ +b\xffq\x02\x0a\x01i\xffq\x02\x0a\x01y\xff\xae\x02\ +\x0a\x01z\xff\xd7\x02\x0a\x01{\xff\xd7\x02\x0a\x01~\xff\ +\xae\x02\x0a\x01\x81\xff\xc3\x02\x0a\x01\x82\xff\xd7\x02\x0a\x01\ +\x83\xff\xd7\x02\x0a\x01\x84\xff\xd7\x02\x0a\x01\x87\xff\xd7\x02\ +\x0a\x01\x89\xff\xd7\x02\x0a\x01\x8c\xff\xae\x02\x0a\x01\x8e\xff\ +\xc3\x02\x0a\x01\x8f\xff\xae\x02\x0a\x01\x90\xff\xae\x02\x0a\x01\ +\x93\xff\xae\x02\x0a\x01\x99\xff\xae\x02\x0a\x01\xa4\xff\x85\x02\ +\x0a\x01\xaa\xffq\x02\x0a\x01\xae\xff\x85\x02\x0a\x01\xb5\xff\ +\x85\x02\x0a\x01\xca\xff\xd7\x02\x0a\x01\xce\xffq\x02\x0a\x01\ +\xcf\xff\x85\x02\x0a\x01\xd5\xffq\x02\x0a\x01\xd8\xff\x85\x02\ +\x0a\x01\xdb\xff\x85\x02\x0a\x01\xde\xff\x85\x02\x0a\x01\xea\xff\ +\x85\x02\x0a\x01\xed\xff\x85\x02\x0a\x01\xee\xff\xc3\x02\x0a\x01\ +\xf2\xffq\x02\x0a\x01\xfa\x00)\x02\x0a\x01\xfc\x00)\x02\ +\x0a\x01\xfe\x00)\x02\x0a\x02\x00\x00\x14\x02\x0a\x02W\xff\ +\xc3\x02\x0a\x02X\xffq\x02\x0a\x02Y\xff\xae\x02\x0a\x02\ +`\xff\x85\x02\x0a\x02b\xff\xc3\x02\x0a\x02j\xff\x85\x02\ +\x0a\x02r\xffq\x02\x0a\x02s\xffq\x02\x0a\x02}\xff\ +\xec\x02\x0a\x02\x7f\xff\x85\x02\x0a\x02\x85\xff\x85\x02\x0a\x02\ +\x87\xff\x85\x02\x0a\x02\x89\xff\x85\x02\x0a\x02\x8d\xff\x85\x02\ +\x0a\x02\xb2\xff\x85\x02\x0a\x02\xb4\xff\x85\x02\x0a\x02\xce\xff\ +\x85\x02\x0a\x02\xcf\xffq\x02\x0a\x02\xd9\xffq\x02\x0a\x02\ +\xda\xff\xd7\x02\x0a\x02\xdb\xffq\x02\x0a\x02\xdc\xff\xd7\x02\ +\x0a\x02\xdd\xffq\x02\x0a\x02\xde\xff\xd7\x02\x0a\x02\xe0\xff\ +\x85\x02\x0a\x02\xe2\xff\xd7\x02\x0a\x02\xe4\xff\xd7\x02\x0a\x02\ +\xf0\xff\x85\x02\x0a\x02\xf2\xff\x85\x02\x0a\x02\xf4\xff\x85\x02\ +\x0a\x03\x09\xffq\x02\x0a\x03\x0a\xff\x85\x02\x0a\x03\x0b\xff\ +q\x02\x0a\x03\x0c\xff\x85\x02\x0a\x03\x11\xff\x85\x02\x0a\x03\ +\x12\xffq\x02\x0a\x03\x16\xff\x85\x02\x0a\x03\x1a\xff\x85\x02\ +\x0a\x03\x1b\xff\x85\x02\x0a\x03\x1c\xffq\x02\x0a\x03\x1d\xff\ +q\x02\x0a\x03\x1e\xff\xae\x02\x0a\x03\x1f\xffq\x02\x0a\x03\ + \xff\xae\x02\x0a\x03!\xffq\x02\x0a\x03\x22\xff\xae\x02\ +\x0a\x03#\xffq\x02\x0a\x03%\xffq\x02\x0a\x03&\xff\ +\xae\x02\x0a\x03'\xffq\x02\x0a\x03(\xff\xae\x02\x0a\x03\ +)\xffq\x02\x0a\x03*\xff\xae\x02\x0a\x03+\xffq\x02\ +\x0a\x03,\xff\xae\x02\x0a\x03-\xffq\x02\x0a\x03.\xff\ +\xae\x02\x0a\x03/\xffq\x02\x0a\x030\xff\xae\x02\x0a\x03\ +1\xffq\x02\x0a\x032\xff\xae\x02\x0a\x033\xffq\x02\ +\x0a\x034\xff\xae\x02\x0a\x036\xff\x85\x02\x0a\x038\xff\ +\x85\x02\x0a\x03:\xff\x85\x02\x0a\x03<\xff\x85\x02\x0a\x03\ +@\xff\x85\x02\x0a\x03B\xff\x85\x02\x0a\x03D\xff\x85\x02\ +\x0a\x03J\xff\x85\x02\x0a\x03L\xff\x85\x02\x0a\x03N\xff\ +\x85\x02\x0a\x03R\xff\x85\x02\x0a\x03T\xff\x85\x02\x0a\x03\ +V\xff\x85\x02\x0a\x03X\xff\x85\x02\x0a\x03Z\xff\x85\x02\ +\x0a\x03\x5c\xff\x85\x02\x0a\x03^\xff\x85\x02\x0a\x03`\xff\ +\x85\x02\x0a\x03b\xff\xc3\x02\x0a\x03d\xff\xc3\x02\x0a\x03\ +f\xff\xc3\x02\x0a\x03h\xff\xc3\x02\x0a\x03j\xff\xc3\x02\ +\x0a\x03l\xff\xc3\x02\x0a\x03n\xff\xc3\x02\x0a\x03o\x00\ +\x14\x02\x0a\x03q\x00\x14\x02\x0a\x03s\x00\x14\x02\x0a\x03\ +\x8f\x00)\x02\x0c\x00&\xff\x9a\x02\x0c\x00*\xff\x9a\x02\ +\x0c\x002\xff\x9a\x02\x0c\x004\xff\x9a\x02\x0c\x007\xff\ +q\x02\x0c\x008\xff\xd7\x02\x0c\x009\xff\x85\x02\x0c\x00\ +:\xff\x85\x02\x0c\x00<\xff\x85\x02\x0c\x00\x89\xff\x9a\x02\ +\x0c\x00\x94\xff\x9a\x02\x0c\x00\x95\xff\x9a\x02\x0c\x00\x96\xff\ +\x9a\x02\x0c\x00\x97\xff\x9a\x02\x0c\x00\x98\xff\x9a\x02\x0c\x00\ +\x9a\xff\x9a\x02\x0c\x00\x9b\xff\xd7\x02\x0c\x00\x9c\xff\xd7\x02\ +\x0c\x00\x9d\xff\xd7\x02\x0c\x00\x9e\xff\xd7\x02\x0c\x00\x9f\xff\ +\x85\x02\x0c\x00\xc8\xff\x9a\x02\x0c\x00\xca\xff\x9a\x02\x0c\x00\ +\xcc\xff\x9a\x02\x0c\x00\xce\xff\x9a\x02\x0c\x00\xde\xff\x9a\x02\ +\x0c\x00\xe0\xff\x9a\x02\x0c\x00\xe2\xff\x9a\x02\x0c\x00\xe4\xff\ +\x9a\x02\x0c\x01\x0e\xff\x9a\x02\x0c\x01\x10\xff\x9a\x02\x0c\x01\ +\x12\xff\x9a\x02\x0c\x01\x14\xff\x9a\x02\x0c\x01$\xffq\x02\ +\x0c\x01&\xffq\x02\x0c\x01*\xff\xd7\x02\x0c\x01,\xff\ +\xd7\x02\x0c\x01.\xff\xd7\x02\x0c\x010\xff\xd7\x02\x0c\x01\ +2\xff\xd7\x02\x0c\x014\xff\xd7\x02\x0c\x016\xff\x85\x02\ +\x0c\x018\xff\x85\x02\x0c\x01:\xff\x85\x02\x0c\x01G\xff\ +\x9a\x02\x0c\x01f\xff\xae\x02\x0c\x01m\xff\xae\x02\x0c\x01\ +q\xffq\x02\x0c\x01r\xff\x85\x02\x0c\x01s\xff\x9a\x02\ +\x0c\x01u\xff\x85\x02\x0c\x01x\xff\x85\x02\x0c\x01\x85\xff\ +\xd7\x02\x0c\x01\x9d\xffq\x02\x0c\x01\x9f\xff\x9a\x02\x0c\x01\ +\xa6\xffq\x02\x0c\x01\xb8\xff\x9a\x02\x0c\x01\xbb\xff\x9a\x02\ +\x0c\x01\xbc\xffq\x02\x0c\x01\xbe\xff\xae\x02\x0c\x01\xc1\xff\ +\x5c\x02\x0c\x01\xc4\xffq\x02\x0c\x01\xdc\xff\x9a\x02\x0c\x01\ +\xe1\xff\x85\x02\x0c\x01\xe4\xff\x9a\x02\x0c\x01\xfa\xff\x85\x02\ +\x0c\x01\xfc\xff\x85\x02\x0c\x01\xfe\xff\x85\x02\x0c\x02\x00\xff\ +\x85\x02\x0c\x02T\xff\x85\x02\x0c\x02_\xff\x9a\x02\x0c\x02\ +a\xff\xd7\x02\x0c\x02l\xff\x9a\x02\x0c\x02|\xff\x5c\x02\ +\x0c\x02~\xff\x9a\x02\x0c\x02\x80\xff\x85\x02\x0c\x02\x82\xff\ +\x85\x02\x0c\x02\x84\xff\x9a\x02\x0c\x02\x86\xff\x9a\x02\x0c\x02\ +\x88\xff\x9a\x02\x0c\x02\x8a\xff\x9a\x02\x0c\x02\x8c\xff\x9a\x02\ +\x0c\x02\xa9\xffq\x02\x0c\x02\xaa\xff\x9a\x02\x0c\x02\xb1\xff\ +\x9a\x02\x0c\x02\xb3\xff\x9a\x02\x0c\x02\xb5\xffq\x02\x0c\x02\ +\xb6\xff\x9a\x02\x0c\x02\xb7\xff\x85\x02\x0c\x02\xb9\xff\x85\x02\ +\x0c\x02\xbd\xffq\x02\x0c\x02\xbe\xff\x9a\x02\x0c\x02\xbf\xff\ +\x5c\x02\x0c\x02\xc0\xff\x85\x02\x0c\x02\xc1\xff\x5c\x02\x0c\x02\ +\xc2\xff\x85\x02\x0c\x02\xc5\xff\x85\x02\x0c\x02\xc7\xff\x85\x02\ +\x0c\x02\xd4\xff\x5c\x02\x0c\x02\xd5\xff\x85\x02\x0c\x02\xef\xff\ +\x9a\x02\x0c\x02\xf1\xff\x9a\x02\x0c\x02\xf3\xff\x9a\x02\x0c\x02\ +\xfd\xff\x5c\x02\x0c\x02\xfe\xff\x85\x02\x0c\x03\x0d\xff\x85\x02\ +\x0c\x03\x0e\xff\x9a\x02\x0c\x03\x0f\xff\x85\x02\x0c\x03\x10\xff\ +\x9a\x02\x0c\x03\x15\xff\x9a\x02\x0c\x03\x17\xffq\x02\x0c\x03\ +\x18\xff\x9a\x02\x0c\x03I\xff\x9a\x02\x0c\x03K\xff\x9a\x02\ +\x0c\x03M\xff\x9a\x02\x0c\x03O\xff\x9a\x02\x0c\x03Q\xff\ +\x9a\x02\x0c\x03S\xff\x9a\x02\x0c\x03U\xff\x9a\x02\x0c\x03\ +W\xff\x9a\x02\x0c\x03Y\xff\x9a\x02\x0c\x03[\xff\x9a\x02\ +\x0c\x03]\xff\x9a\x02\x0c\x03_\xff\x9a\x02\x0c\x03a\xff\ +\xd7\x02\x0c\x03c\xff\xd7\x02\x0c\x03e\xff\xd7\x02\x0c\x03\ +g\xff\xd7\x02\x0c\x03i\xff\xd7\x02\x0c\x03k\xff\xd7\x02\ +\x0c\x03m\xff\xd7\x02\x0c\x03o\xff\x85\x02\x0c\x03q\xff\ +\x85\x02\x0c\x03s\xff\x85\x02\x0c\x03\x8f\xffq\x02!\x01\ +q\xff\xd7\x02!\x01r\xff\xec\x02!\x01x\xff\xec\x02\ +!\x02T\xff\xec\x02S\x00\x0f\xff\xc3\x02S\x00\x11\xff\ +\xc3\x02S\x02\x08\xff\xc3\x02S\x02\x0c\xff\xc3\x02T\x00\ +\x0f\xff\x85\x02T\x00\x11\xff\x85\x02T\x01V\xff\x85\x02\ +T\x01_\xff\x85\x02T\x01b\xff\x85\x02T\x01f\xff\ +\xd7\x02T\x01i\xff\x85\x02T\x01m\xff\xd7\x02T\x01\ +s\xff\xc3\x02T\x01v\xff\xec\x02T\x01y\xff\x9a\x02\ +T\x01z\xff\xae\x02T\x01{\xff\xc3\x02T\x01|\xff\ +\xc3\x02T\x01}\xff\xc3\x02T\x01~\xff\x9a\x02T\x01\ +\x81\xff\xc3\x02T\x01\x82\xff\xae\x02T\x01\x84\xff\xc3\x02\ +T\x01\x86\xff\xc3\x02T\x01\x87\xff\xc3\x02T\x01\x89\xff\ +\xc3\x02T\x01\x8c\xff\x9a\x02T\x01\x8e\xff\x9a\x02T\x01\ +\x8f\xff\x9a\x02T\x01\x90\xff\x9a\x02T\x01\x92\xff\xc3\x02\ +T\x01\x93\xff\x9a\x02T\x01\x95\xff\xc3\x02T\x01\x96\xff\ +\xc3\x02T\x01\x98\xff\xc3\x02T\x01\x99\xff\x9a\x02T\x01\ +\x9a\xff\xc3\x02T\x01\x9b\xff\xc3\x02T\x02\x08\xff\x85\x02\ +T\x02\x0c\xff\x85\x02T\x02!\xff\xec\x02X\x00\x05\xff\ +q\x02X\x00\x0a\xffq\x02X\x00&\xff\xd7\x02X\x00\ +*\xff\xd7\x02X\x00-\x01\x0a\x02X\x002\xff\xd7\x02\ +X\x004\xff\xd7\x02X\x007\xffq\x02X\x009\xff\ +\xae\x02X\x00:\xff\xae\x02X\x00<\xff\x85\x02X\x00\ +\x89\xff\xd7\x02X\x00\x94\xff\xd7\x02X\x00\x95\xff\xd7\x02\ +X\x00\x96\xff\xd7\x02X\x00\x97\xff\xd7\x02X\x00\x98\xff\ +\xd7\x02X\x00\x9a\xff\xd7\x02X\x00\x9f\xff\x85\x02X\x00\ +\xc8\xff\xd7\x02X\x00\xca\xff\xd7\x02X\x00\xcc\xff\xd7\x02\ +X\x00\xce\xff\xd7\x02X\x00\xde\xff\xd7\x02X\x00\xe0\xff\ +\xd7\x02X\x00\xe2\xff\xd7\x02X\x00\xe4\xff\xd7\x02X\x01\ +\x0e\xff\xd7\x02X\x01\x10\xff\xd7\x02X\x01\x12\xff\xd7\x02\ +X\x01\x14\xff\xd7\x02X\x01$\xffq\x02X\x01&\xff\ +q\x02X\x016\xff\xae\x02X\x018\xff\x85\x02X\x01\ +:\xff\x85\x02X\x01G\xff\xd7\x02X\x01\xfa\xff\xae\x02\ +X\x01\xfc\xff\xae\x02X\x01\xfe\xff\xae\x02X\x02\x00\xff\ +\x85\x02X\x02\x07\xffq\x02X\x02\x0b\xffq\x02X\x02\ +_\xff\xd7\x02X\x03I\xff\xd7\x02X\x03K\xff\xd7\x02\ +X\x03M\xff\xd7\x02X\x03O\xff\xd7\x02X\x03Q\xff\ +\xd7\x02X\x03S\xff\xd7\x02X\x03U\xff\xd7\x02X\x03\ +W\xff\xd7\x02X\x03Y\xff\xd7\x02X\x03[\xff\xd7\x02\ +X\x03]\xff\xd7\x02X\x03_\xff\xd7\x02X\x03o\xff\ +\x85\x02X\x03q\xff\x85\x02X\x03s\xff\x85\x02X\x03\ +\x8f\xffq\x02Y\x00\x05\xff\xec\x02Y\x00\x0a\xff\xec\x02\ +Y\x02\x07\xff\xec\x02Y\x02\x0b\xff\xec\x02Z\x00\x0f\xff\ +\xae\x02Z\x00\x11\xff\xae\x02Z\x01V\xff\xd7\x02Z\x01\ +_\xff\xd7\x02Z\x01b\xff\xd7\x02Z\x01d\xff\xec\x02\ +Z\x01i\xff\xd7\x02Z\x01p\xff\xec\x02Z\x01q\xff\ +\xc3\x02Z\x01r\xff\xec\x02Z\x01t\xff\xd7\x02Z\x01\ +u\xff\xec\x02Z\x01x\xff\xec\x02Z\x01\x88\xff\xec\x02\ +Z\x02\x08\xff\xae\x02Z\x02\x0c\xff\xae\x02Z\x02T\xff\ +\xec\x02`\x00I\x00R\x02`\x00W\x00R\x02`\x00\ +Y\x00f\x02`\x00Z\x00f\x02`\x00[\x00f\x02\ +`\x00\x5c\x00f\x02`\x00\xbf\x00f\x02`\x01%\x00\ +R\x02`\x01'\x00R\x02`\x017\x00f\x02`\x01\ +\xfb\x00f\x02`\x01\xfd\x00f\x02`\x024\x00R\x02\ +`\x025\x00R\x02`\x02]\x00R\x02`\x02^\x00\ +R\x02`\x03p\x00f\x02`\x03\x8d\x00R\x02`\x03\ +\x90\x00R\x02b\x00I\x00f\x02b\x00W\x00f\x02\ +b\x00Y\x00f\x02b\x00Z\x00f\x02b\x00[\x00\ +f\x02b\x00\x5c\x00f\x02b\x00\xbf\x00f\x02b\x01\ +%\x00f\x02b\x01'\x00f\x02b\x017\x00f\x02\ +b\x01\xfb\x00f\x02b\x01\xfd\x00f\x02b\x024\x00\ +f\x02b\x025\x00f\x02b\x02]\x00f\x02b\x02\ +^\x00f\x02b\x03p\x00f\x02b\x03\x8d\x00f\x02\ +b\x03\x90\x00f\x02j\x00\x05\xff\xec\x02j\x00\x0a\xff\ +\xec\x02j\x02\x07\xff\xec\x02j\x02\x0b\xff\xec\x02l\x00\ +\x0f\xff\xae\x02l\x00\x11\xff\xae\x02l\x01\x9d\xff\xec\x02\ +l\x01\xa4\xff\xd7\x02l\x01\xa6\xff\xec\x02l\x01\xa8\xff\ +\xd7\x02l\x01\xaa\xff\xd7\x02l\x01\xae\xff\xd7\x02l\x01\ +\xb0\xff\xd7\x02l\x01\xb1\xff\xec\x02l\x01\xb5\xff\xd7\x02\ +l\x01\xbc\xff\xc3\x02l\x01\xbd\xff\xd7\x02l\x01\xbf\xff\ +\xd7\x02l\x01\xc1\xff\xd7\x02l\x01\xc4\xff\xec\x02l\x01\ +\xc7\xff\xec\x02l\x01\xce\xff\xec\x02l\x01\xd5\xff\xec\x02\ +l\x01\xf2\xff\xec\x02l\x02\x08\xff\xae\x02l\x02\x0c\xff\ +\xae\x02l\x02r\xff\xd7\x02l\x02s\xff\xec\x02l\x02\ +z\xff\xec\x02l\x02|\xff\xd7\x02l\x02\x80\xff\xec\x02\ +l\x02\x82\xff\xec\x02l\x02\x9f\xff\xd7\x02l\x02\xa1\xff\ +\xec\x02l\x02\xa9\xff\xec\x02l\x02\xb5\xff\xc3\x02l\x02\ +\xb7\xff\xec\x02l\x02\xb9\xff\xec\x02l\x02\xbb\xff\xd7\x02\ +l\x02\xbd\xff\xec\x02l\x02\xbf\xff\xd7\x02l\x02\xc1\xff\ +\xd7\x02l\x02\xca\xff\xd7\x02l\x02\xce\xff\xd7\x02l\x02\ +\xcf\xff\xec\x02l\x02\xd4\xff\xd7\x02l\x02\xd9\xff\xd7\x02\ +l\x02\xdb\xff\xd7\x02l\x02\xdd\xff\xd7\x02l\x02\xe5\xff\ +\xd7\x02l\x02\xe7\xff\xec\x02l\x02\xf5\xff\xec\x02l\x02\ +\xf7\xff\xd7\x02l\x02\xf9\xff\xd7\x02l\x02\xfb\xff\xd7\x02\ +l\x02\xfd\xff\xd7\x02l\x03\x05\xff\xd7\x02l\x03\x07\xff\ +\xd7\x02l\x03\x0d\xff\xd7\x02l\x03\x0f\xff\xd7\x02l\x03\ +\x11\xff\xd7\x02l\x03\x12\xff\xec\x02l\x03\x17\xff\xec\x02\ +l\x03\x1b\xff\xd7\x02l\x03\x1c\xff\xec\x02m\x00\x0f\xff\ +\xae\x02m\x00\x11\xff\xae\x02m\x01\xce\xff\xd7\x02m\x01\ +\xd5\xff\xd7\x02m\x01\xf2\xff\xd7\x02m\x02\x08\xff\xae\x02\ +m\x02\x0c\xff\xae\x02m\x02s\xff\xd7\x02m\x02\xcf\xff\ +\xd7\x02m\x03\x12\xff\xd7\x02m\x03\x1c\xff\xd7\x02n\x00\ +\x05\xff\xae\x02n\x00\x0a\xff\xae\x02n\x01\x9d\xff\xd7\x02\ +n\x01\xa6\xff\xd7\x02n\x01\xbc\xff\xae\x02n\x01\xc1\xff\ +\xae\x02n\x01\xc4\xff\xd7\x02n\x01\xdc\xff\xd7\x02n\x01\ +\xe4\xff\xd7\x02n\x02\x07\xff\xae\x02n\x02\x0b\xff\xae\x02\ +n\x02|\xff\xae\x02n\x02\x80\xff\xc3\x02n\x02\x82\xff\ +\xc3\x02n\x02\xa9\xff\xd7\x02n\x02\xaa\xff\xd7\x02n\x02\ +\xb5\xff\xae\x02n\x02\xb6\xff\xd7\x02n\x02\xb7\xff\xc3\x02\ +n\x02\xb9\xff\xc3\x02n\x02\xbd\xff\xd7\x02n\x02\xbe\xff\ +\xd7\x02n\x02\xbf\xff\xae\x02n\x02\xc1\xff\xae\x02n\x02\ +\xd4\xff\xae\x02n\x02\xfd\xff\xae\x02n\x03\x0d\xff\x9a\x02\ +n\x03\x0f\xff\x9a\x02n\x03\x17\xff\xd7\x02n\x03\x18\xff\ +\xd7\x02o\x00\x05\xff\x85\x02o\x00\x0a\xff\x85\x02o\x01\ +\xd0\xff\xd7\x02o\x01\xdc\xff\x9a\x02o\x01\xdd\xff\xc3\x02\ +o\x01\xdf\xff\xd7\x02o\x01\xe1\xff\xae\x02o\x01\xe4\xff\ +\x9a\x02o\x01\xf6\xff\xc3\x02o\x02\x07\xff\x85\x02o\x02\ +\x0b\xff\x85\x02o\x02m\xff\xd7\x02o\x02\x81\xff\xd7\x02\ +o\x02\x83\xff\xd7\x02o\x02\x8b\xff\xd7\x02o\x02\xa0\xff\ +\xd7\x02o\x02\xaa\xff\x9a\x02o\x02\xb6\xff\x9a\x02o\x02\ +\xb8\xff\xc3\x02o\x02\xba\xff\xc3\x02o\x02\xbc\xff\xd7\x02\ +o\x02\xbe\xff\x9a\x02o\x02\xc0\xff\xae\x02o\x02\xc2\xff\ +\xae\x02o\x02\xc6\xff\xd7\x02o\x02\xc8\xff\xd7\x02o\x02\ +\xcb\xff\xd7\x02o\x02\xd5\xff\xae\x02o\x02\xe6\xff\xd7\x02\ +o\x02\xea\xff\xd7\x02o\x02\xf8\xff\xc3\x02o\x02\xfa\xff\ +\xc3\x02o\x02\xfc\xff\xc3\x02o\x02\xfe\xff\xae\x02o\x03\ +\x06\xff\xd7\x02o\x03\x08\xff\xd7\x02o\x03\x0e\xff\x9a\x02\ +o\x03\x10\xff\x9a\x02o\x03\x18\xff\x9a\x02p\x01\x9f\xff\ +\xd7\x02p\x01\xb8\xff\xd7\x02p\x01\xbb\xff\xd7\x02p\x01\ +\xbe\xff\xd7\x02p\x01\xe1\xff\xd7\x02p\x02l\xff\xd7\x02\ +p\x02~\xff\xd7\x02p\x02\x84\xff\xd7\x02p\x02\x86\xff\ +\xd7\x02p\x02\x88\xff\xd7\x02p\x02\x8a\xff\xd7\x02p\x02\ +\x8c\xff\xd7\x02p\x02\xb1\xff\xd7\x02p\x02\xb3\xff\xd7\x02\ +p\x02\xc0\xff\xd7\x02p\x02\xc2\xff\xd7\x02p\x02\xc5\xff\ +\xd7\x02p\x02\xc7\xff\xd7\x02p\x02\xd5\xff\xd7\x02p\x02\ +\xef\xff\xd7\x02p\x02\xf1\xff\xd7\x02p\x02\xf3\xff\xd7\x02\ +p\x02\xfe\xff\xd7\x02p\x03\x09\xff\xd7\x02p\x03\x0b\xff\ +\xd7\x02p\x03\x0e\xff\xd7\x02p\x03\x10\xff\xd7\x02p\x03\ +\x15\xff\xd7\x02r\x00\x05\xffq\x02r\x00\x0a\xffq\x02\ +r\x01\x9d\xff\x9a\x02r\x01\xa6\xff\x9a\x02r\x01\xbc\xff\ +q\x02r\x01\xbe\xff\xd7\x02r\x01\xc1\xff\x9a\x02r\x01\ +\xc4\xff\x9a\x02r\x01\xdc\xff\xd7\x02r\x01\xe1\xff\xd7\x02\ +r\x01\xe4\xff\xd7\x02r\x02\x07\xffq\x02r\x02\x0b\xff\ +q\x02r\x02n\xff\xd7\x02r\x02|\xff\x9a\x02r\x02\ +\x80\xff\xae\x02r\x02\x82\xff\xae\x02r\x02\x97\xff\xd7\x02\ +r\x02\x9b\xff\xd7\x02r\x02\xa7\xff\xd7\x02r\x02\xa9\xff\ +\x9a\x02r\x02\xaa\xff\xd7\x02r\x02\xb5\xffq\x02r\x02\ +\xb6\xff\xd7\x02r\x02\xb7\xff\x85\x02r\x02\xb9\xff\x85\x02\ +r\x02\xbd\xff\x9a\x02r\x02\xbe\xff\xd7\x02r\x02\xbf\xff\ +\x9a\x02r\x02\xc0\xff\xd7\x02r\x02\xc1\xff\x9a\x02r\x02\ +\xc2\xff\xd7\x02r\x02\xc5\xff\x9a\x02r\x02\xc7\xff\x9a\x02\ +r\x02\xd4\xff\x9a\x02r\x02\xd5\xff\xd7\x02r\x02\xe1\xff\ +\xd7\x02r\x02\xe3\xff\xd7\x02r\x02\xfd\xff\x9a\x02r\x02\ +\xfe\xff\xd7\x02r\x03\x03\xff\xd7\x02r\x03\x0d\xffq\x02\ +r\x03\x0e\xff\xd7\x02r\x03\x0f\xffq\x02r\x03\x10\xff\ +\xd7\x02r\x03\x17\xff\x9a\x02r\x03\x18\xff\xd7\x02s\x00\ +\x05\xffq\x02s\x00\x0a\xffq\x02s\x01\xcf\xff\xd7\x02\ +s\x01\xd8\xff\xd7\x02s\x01\xdb\xff\xd7\x02s\x01\xdc\xff\ +\x9a\x02s\x01\xdd\xff\xc3\x02s\x01\xde\xff\xd7\x02s\x01\ +\xe1\xff\xc3\x02s\x01\xe4\xff\x9a\x02s\x01\xea\xff\xd7\x02\ +s\x01\xed\xff\xd7\x02s\x01\xf6\xff\xc3\x02s\x02\x07\xff\ +q\x02s\x02\x0b\xffq\x02s\x02j\xff\xd7\x02s\x02\ +m\xff\xd7\x02s\x02}\xff\xec\x02s\x02\x7f\xff\xd7\x02\ +s\x02\x81\xff\xd7\x02s\x02\x83\xff\xd7\x02s\x02\x85\xff\ +\xd7\x02s\x02\x87\xff\xd7\x02s\x02\x89\xff\xd7\x02s\x02\ +\x8b\xff\xd7\x02s\x02\x8d\xff\xd7\x02s\x02\xaa\xff\x9a\x02\ +s\x02\xb2\xff\xd7\x02s\x02\xb4\xff\xd7\x02s\x02\xb6\xff\ +\x9a\x02s\x02\xb8\xff\xd7\x02s\x02\xba\xff\xd7\x02s\x02\ +\xbe\xff\x9a\x02s\x02\xc0\xff\xc3\x02s\x02\xc2\xff\xc3\x02\ +s\x02\xc6\xff\xd7\x02s\x02\xc8\xff\xd7\x02s\x02\xd5\xff\ +\xc3\x02s\x02\xe0\xff\xd7\x02s\x02\xf0\xff\xd7\x02s\x02\ +\xf2\xff\xd7\x02s\x02\xf4\xff\xd7\x02s\x02\xf8\xff\xc3\x02\ +s\x02\xfa\xff\xc3\x02s\x02\xfc\xff\xc3\x02s\x02\xfe\xff\ +\xc3\x02s\x03\x0a\xff\xd7\x02s\x03\x0c\xff\xd7\x02s\x03\ +\x0e\xff\x85\x02s\x03\x10\xff\x85\x02s\x03\x16\xff\xd7\x02\ +s\x03\x18\xff\x9a\x02s\x03\x1a\xff\xd7\x02t\x00\x05\xff\ +q\x02t\x00\x0a\xffq\x02t\x01\x9d\xff\x9a\x02t\x01\ +\xa6\xff\x9a\x02t\x01\xbc\xffq\x02t\x01\xbe\xff\xd7\x02\ +t\x01\xc1\xff\x9a\x02t\x01\xc4\xff\x9a\x02t\x01\xdc\xff\ +\xd7\x02t\x01\xe1\xff\xd7\x02t\x01\xe4\xff\xd7\x02t\x02\ +\x07\xffq\x02t\x02\x0b\xffq\x02t\x02n\xff\xd7\x02\ +t\x02|\xff\x9a\x02t\x02\x80\xff\xae\x02t\x02\x82\xff\ +\xae\x02t\x02\x97\xff\xd7\x02t\x02\x9b\xff\xd7\x02t\x02\ +\xa7\xff\xd7\x02t\x02\xa9\xff\x9a\x02t\x02\xaa\xff\xd7\x02\ +t\x02\xb5\xffq\x02t\x02\xb6\xff\xd7\x02t\x02\xb7\xff\ +\x85\x02t\x02\xb9\xff\x85\x02t\x02\xbd\xff\x9a\x02t\x02\ +\xbe\xff\xd7\x02t\x02\xbf\xff\x9a\x02t\x02\xc0\xff\xd7\x02\ +t\x02\xc1\xff\x9a\x02t\x02\xc2\xff\xd7\x02t\x02\xc5\xff\ +\x9a\x02t\x02\xc7\xff\x9a\x02t\x02\xd4\xff\x9a\x02t\x02\ +\xd5\xff\xd7\x02t\x02\xe1\xff\xd7\x02t\x02\xe3\xff\xd7\x02\ +t\x02\xfd\xff\x9a\x02t\x02\xfe\xff\xd7\x02t\x03\x03\xff\ +\xd7\x02t\x03\x0d\xffq\x02t\x03\x0e\xff\xd7\x02t\x03\ +\x0f\xffq\x02t\x03\x10\xff\xd7\x02t\x03\x17\xff\x9a\x02\ +t\x03\x18\xff\xd7\x02u\x00\x05\xffq\x02u\x00\x0a\xff\ +q\x02u\x01\xcf\xff\xd7\x02u\x01\xd8\xff\xd7\x02u\x01\ +\xdb\xff\xd7\x02u\x01\xdc\xff\x9a\x02u\x01\xdd\xff\xc3\x02\ +u\x01\xde\xff\xd7\x02u\x01\xe1\xff\xc3\x02u\x01\xe4\xff\ +\x9a\x02u\x01\xea\xff\xd7\x02u\x01\xed\xff\xd7\x02u\x01\ +\xf6\xff\xc3\x02u\x02\x07\xffq\x02u\x02\x0b\xffq\x02\ +u\x02j\xff\xd7\x02u\x02m\xff\xd7\x02u\x02}\xff\ +\xec\x02u\x02\x7f\xff\xd7\x02u\x02\x81\xff\xd7\x02u\x02\ +\x83\xff\xd7\x02u\x02\x85\xff\xd7\x02u\x02\x87\xff\xd7\x02\ +u\x02\x89\xff\xd7\x02u\x02\x8b\xff\xd7\x02u\x02\x8d\xff\ +\xd7\x02u\x02\xaa\xff\x9a\x02u\x02\xb2\xff\xd7\x02u\x02\ +\xb4\xff\xd7\x02u\x02\xb6\xff\x9a\x02u\x02\xb8\xff\xd7\x02\ +u\x02\xba\xff\xd7\x02u\x02\xbe\xff\x9a\x02u\x02\xc0\xff\ +\xc3\x02u\x02\xc2\xff\xc3\x02u\x02\xc6\xff\xd7\x02u\x02\ +\xc8\xff\xd7\x02u\x02\xd5\xff\xc3\x02u\x02\xe0\xff\xd7\x02\ +u\x02\xf0\xff\xd7\x02u\x02\xf2\xff\xd7\x02u\x02\xf4\xff\ +\xd7\x02u\x02\xf8\xff\xc3\x02u\x02\xfa\xff\xc3\x02u\x02\ +\xfc\xff\xc3\x02u\x02\xfe\xff\xc3\x02u\x03\x0a\xff\xd7\x02\ +u\x03\x0c\xff\xd7\x02u\x03\x0e\xff\x85\x02u\x03\x10\xff\ +\x85\x02u\x03\x16\xff\xd7\x02u\x03\x18\xff\x9a\x02u\x03\ +\x1a\xff\xd7\x02v\x03\x0d\xff\xec\x02v\x03\x0f\xff\xec\x02\ +x\x03\x0d\xff\xec\x02x\x03\x0f\xff\xec\x02z\x00\x0f\xff\ +\xae\x02z\x00\x11\xff\xae\x02z\x02\x08\xff\xae\x02z\x02\ +\x0c\xff\xae\x02z\x02\x80\xff\xec\x02z\x02\x82\xff\xec\x02\ +z\x02\xb7\xff\xec\x02z\x02\xb9\xff\xec\x02z\x03\x0d\xff\ +\xd7\x02z\x03\x0f\xff\xd7\x02|\x00\x0f\xffq\x02|\x00\ +\x11\xffq\x02|\x01\xa4\xff\xc3\x02|\x01\xaa\xff\xae\x02\ +|\x01\xae\xff\xc3\x02|\x01\xb5\xff\xc3\x02|\x01\xce\xff\ +\xd7\x02|\x01\xd5\xff\xd7\x02|\x01\xf2\xff\xd7\x02|\x02\ +\x08\xffq\x02|\x02\x0c\xffq\x02|\x02r\xff\xae\x02\ +|\x02s\xff\xd7\x02|\x02\xce\xff\xc3\x02|\x02\xcf\xff\ +\xd7\x02|\x02\xd9\xff\xae\x02|\x02\xdb\xff\xae\x02|\x02\ +\xdd\xff\xae\x02|\x03\x09\xff\xae\x02|\x03\x0b\xff\xae\x02\ +|\x03\x11\xff\xc3\x02|\x03\x12\xff\xd7\x02|\x03\x1b\xff\ +\xc3\x02|\x03\x1c\xff\xd7\x02}\x00\x05\xff\xec\x02}\x00\ +\x0a\xff\xec\x02}\x01\xd0\xff\xd7\x02}\x01\xdc\xff\xec\x02\ +}\x01\xdd\xff\xec\x02}\x01\xdf\xff\xd7\x02}\x01\xe1\xff\ +\xec\x02}\x01\xe4\xff\xec\x02}\x01\xf6\xff\xec\x02}\x02\ +\x07\xff\xec\x02}\x02\x0b\xff\xec\x02}\x02\xa0\xff\xd7\x02\ +}\x02\xaa\xff\xec\x02}\x02\xb6\xff\xec\x02}\x02\xbc\xff\ +\xd7\x02}\x02\xbe\xff\xec\x02}\x02\xc0\xff\xec\x02}\x02\ +\xc2\xff\xec\x02}\x02\xcb\xff\xd7\x02}\x02\xd5\xff\xec\x02\ +}\x02\xe6\xff\xd7\x02}\x02\xf8\xff\xec\x02}\x02\xfa\xff\ +\xec\x02}\x02\xfc\xff\xec\x02}\x02\xfe\xff\xec\x02}\x03\ +\x06\xff\xd7\x02}\x03\x08\xff\xd7\x02}\x03\x0e\xff\xec\x02\ +}\x03\x10\xff\xec\x02}\x03\x18\xff\xec\x02~\x00\x0f\xff\ +\xae\x02~\x00\x11\xff\xae\x02~\x01\x9d\xff\xec\x02~\x01\ +\xa4\xff\xd7\x02~\x01\xa6\xff\xec\x02~\x01\xa8\xff\xd7\x02\ +~\x01\xaa\xff\xd7\x02~\x01\xae\xff\xd7\x02~\x01\xb0\xff\ +\xd7\x02~\x01\xb1\xff\xec\x02~\x01\xb5\xff\xd7\x02~\x01\ +\xbc\xff\xc3\x02~\x01\xbd\xff\xd7\x02~\x01\xbf\xff\xd7\x02\ +~\x01\xc1\xff\xd7\x02~\x01\xc4\xff\xec\x02~\x01\xc7\xff\ +\xec\x02~\x01\xce\xff\xec\x02~\x01\xd5\xff\xec\x02~\x01\ +\xf2\xff\xec\x02~\x02\x08\xff\xae\x02~\x02\x0c\xff\xae\x02\ +~\x02r\xff\xd7\x02~\x02s\xff\xec\x02~\x02z\xff\ +\xec\x02~\x02|\xff\xd7\x02~\x02\x80\xff\xec\x02~\x02\ +\x82\xff\xec\x02~\x02\x9f\xff\xd7\x02~\x02\xa1\xff\xec\x02\ +~\x02\xa9\xff\xec\x02~\x02\xb5\xff\xc3\x02~\x02\xb7\xff\ +\xec\x02~\x02\xb9\xff\xec\x02~\x02\xbb\xff\xd7\x02~\x02\ +\xbd\xff\xec\x02~\x02\xbf\xff\xd7\x02~\x02\xc1\xff\xd7\x02\ +~\x02\xca\xff\xd7\x02~\x02\xce\xff\xd7\x02~\x02\xcf\xff\ +\xec\x02~\x02\xd4\xff\xd7\x02~\x02\xd9\xff\xd7\x02~\x02\ +\xdb\xff\xd7\x02~\x02\xdd\xff\xd7\x02~\x02\xe5\xff\xd7\x02\ +~\x02\xe7\xff\xec\x02~\x02\xf5\xff\xec\x02~\x02\xf7\xff\ +\xd7\x02~\x02\xf9\xff\xd7\x02~\x02\xfb\xff\xd7\x02~\x02\ +\xfd\xff\xd7\x02~\x03\x05\xff\xd7\x02~\x03\x07\xff\xd7\x02\ +~\x03\x0d\xff\xd7\x02~\x03\x0f\xff\xd7\x02~\x03\x11\xff\ +\xd7\x02~\x03\x12\xff\xec\x02~\x03\x17\xff\xec\x02~\x03\ +\x1b\xff\xd7\x02~\x03\x1c\xff\xec\x02\x7f\x00\x05\xff\xec\x02\ +\x7f\x00\x0a\xff\xec\x02\x7f\x01\xd0\xff\xd7\x02\x7f\x01\xdc\xff\ +\xec\x02\x7f\x01\xdd\xff\xec\x02\x7f\x01\xdf\xff\xd7\x02\x7f\x01\ +\xe1\xff\xec\x02\x7f\x01\xe4\xff\xec\x02\x7f\x01\xf6\xff\xec\x02\ +\x7f\x02\x07\xff\xec\x02\x7f\x02\x0b\xff\xec\x02\x7f\x02\xa0\xff\ +\xd7\x02\x7f\x02\xaa\xff\xec\x02\x7f\x02\xb6\xff\xec\x02\x7f\x02\ +\xbc\xff\xd7\x02\x7f\x02\xbe\xff\xec\x02\x7f\x02\xc0\xff\xec\x02\ +\x7f\x02\xc2\xff\xec\x02\x7f\x02\xcb\xff\xd7\x02\x7f\x02\xd5\xff\ +\xec\x02\x7f\x02\xe6\xff\xd7\x02\x7f\x02\xf8\xff\xec\x02\x7f\x02\ +\xfa\xff\xec\x02\x7f\x02\xfc\xff\xec\x02\x7f\x02\xfe\xff\xec\x02\ +\x7f\x03\x06\xff\xd7\x02\x7f\x03\x08\xff\xd7\x02\x7f\x03\x0e\xff\ +\xec\x02\x7f\x03\x10\xff\xec\x02\x7f\x03\x18\xff\xec\x02\x80\x00\ +\x0f\xff\x85\x02\x80\x00\x11\xff\x85\x02\x80\x01\x9f\xff\xec\x02\ +\x80\x01\xa4\xff\x9a\x02\x80\x01\xaa\xffq\x02\x80\x01\xae\xff\ +\x9a\x02\x80\x01\xb5\xff\x9a\x02\x80\x01\xb8\xff\xec\x02\x80\x01\ +\xbb\xff\xec\x02\x80\x01\xbe\xff\xc3\x02\x80\x01\xc9\xff\xec\x02\ +\x80\x01\xce\xff\xae\x02\x80\x01\xcf\xff\xd7\x02\x80\x01\xd5\xff\ +\xae\x02\x80\x01\xd8\xff\xd7\x02\x80\x01\xdb\xff\xd7\x02\x80\x01\ +\xde\xff\xd7\x02\x80\x01\xe1\xff\xd7\x02\x80\x01\xea\xff\xd7\x02\ +\x80\x01\xeb\x00f\x02\x80\x01\xed\xff\xd7\x02\x80\x01\xee\xff\ +\xec\x02\x80\x01\xf2\xff\xae\x02\x80\x01\xf4\x00f\x02\x80\x02\ +\x08\xff\x85\x02\x80\x02\x0c\xff\x85\x02\x80\x02j\xff\xd7\x02\ +\x80\x02l\xff\xec\x02\x80\x02r\xffq\x02\x80\x02s\xff\ +\xae\x02\x80\x02~\xff\xec\x02\x80\x02\x7f\xff\xd7\x02\x80\x02\ +\x84\xff\xec\x02\x80\x02\x85\xff\xd7\x02\x80\x02\x86\xff\xec\x02\ +\x80\x02\x87\xff\xd7\x02\x80\x02\x88\xff\xec\x02\x80\x02\x89\xff\ +\xd7\x02\x80\x02\x8a\xff\xec\x02\x80\x02\x8c\xff\xec\x02\x80\x02\ +\x8d\xff\xd7\x02\x80\x02\x98\x00f\x02\x80\x02\xa8\x00f\x02\ +\x80\x02\xb1\xff\xec\x02\x80\x02\xb2\xff\xd7\x02\x80\x02\xb3\xff\ +\xec\x02\x80\x02\xb4\xff\xd7\x02\x80\x02\xc0\xff\xd7\x02\x80\x02\ +\xc2\xff\xd7\x02\x80\x02\xc5\xff\xd7\x02\x80\x02\xc6\xff\xc3\x02\ +\x80\x02\xc7\xff\xd7\x02\x80\x02\xc8\xff\xc3\x02\x80\x02\xce\xff\ +\x9a\x02\x80\x02\xcf\xff\xae\x02\x80\x02\xd5\xff\xd7\x02\x80\x02\ +\xd9\xffq\x02\x80\x02\xdb\xffq\x02\x80\x02\xdd\xffq\x02\ +\x80\x02\xe0\xff\xd7\x02\x80\x02\xef\xff\xec\x02\x80\x02\xf0\xff\ +\xd7\x02\x80\x02\xf1\xff\xec\x02\x80\x02\xf2\xff\xd7\x02\x80\x02\ +\xf3\xff\xec\x02\x80\x02\xf4\xff\xd7\x02\x80\x02\xfe\xff\xd7\x02\ +\x80\x03\x09\xffq\x02\x80\x03\x0a\xff\xd7\x02\x80\x03\x0b\xff\ +q\x02\x80\x03\x0c\xff\xd7\x02\x80\x03\x11\xff\x9a\x02\x80\x03\ +\x12\xff\xae\x02\x80\x03\x15\xff\xec\x02\x80\x03\x16\xff\xd7\x02\ +\x80\x03\x1a\xff\xd7\x02\x80\x03\x1b\xff\x9a\x02\x80\x03\x1c\xff\ +\xae\x02\x81\x00\x0f\xff\xae\x02\x81\x00\x11\xff\xae\x02\x81\x01\ +\xce\xff\xd7\x02\x81\x01\xd5\xff\xd7\x02\x81\x01\xf2\xff\xd7\x02\ +\x81\x02\x08\xff\xae\x02\x81\x02\x0c\xff\xae\x02\x81\x02s\xff\ +\xd7\x02\x81\x02\xcf\xff\xd7\x02\x81\x03\x12\xff\xd7\x02\x81\x03\ +\x1c\xff\xd7\x02\x82\x00\x0f\xff\x85\x02\x82\x00\x11\xff\x85\x02\ +\x82\x01\x9f\xff\xec\x02\x82\x01\xa4\xff\x9a\x02\x82\x01\xaa\xff\ +q\x02\x82\x01\xae\xff\x9a\x02\x82\x01\xb5\xff\x9a\x02\x82\x01\ +\xb8\xff\xec\x02\x82\x01\xbb\xff\xec\x02\x82\x01\xbe\xff\xc3\x02\ +\x82\x01\xc9\xff\xec\x02\x82\x01\xce\xff\xae\x02\x82\x01\xcf\xff\ +\xd7\x02\x82\x01\xd5\xff\xae\x02\x82\x01\xd8\xff\xd7\x02\x82\x01\ +\xdb\xff\xd7\x02\x82\x01\xde\xff\xd7\x02\x82\x01\xe1\xff\xd7\x02\ +\x82\x01\xea\xff\xd7\x02\x82\x01\xeb\x00f\x02\x82\x01\xed\xff\ +\xd7\x02\x82\x01\xee\xff\xec\x02\x82\x01\xf2\xff\xae\x02\x82\x01\ +\xf4\x00f\x02\x82\x02\x08\xff\x85\x02\x82\x02\x0c\xff\x85\x02\ +\x82\x02j\xff\xd7\x02\x82\x02l\xff\xec\x02\x82\x02r\xff\ +q\x02\x82\x02s\xff\xae\x02\x82\x02~\xff\xec\x02\x82\x02\ +\x7f\xff\xd7\x02\x82\x02\x84\xff\xec\x02\x82\x02\x85\xff\xd7\x02\ +\x82\x02\x86\xff\xec\x02\x82\x02\x87\xff\xd7\x02\x82\x02\x88\xff\ +\xec\x02\x82\x02\x89\xff\xd7\x02\x82\x02\x8a\xff\xec\x02\x82\x02\ +\x8c\xff\xec\x02\x82\x02\x8d\xff\xd7\x02\x82\x02\x98\x00f\x02\ +\x82\x02\xa8\x00f\x02\x82\x02\xb1\xff\xec\x02\x82\x02\xb2\xff\ +\xd7\x02\x82\x02\xb3\xff\xec\x02\x82\x02\xb4\xff\xd7\x02\x82\x02\ +\xc0\xff\xd7\x02\x82\x02\xc2\xff\xd7\x02\x82\x02\xc5\xff\xd7\x02\ +\x82\x02\xc6\xff\xc3\x02\x82\x02\xc7\xff\xd7\x02\x82\x02\xc8\xff\ +\xc3\x02\x82\x02\xce\xff\x9a\x02\x82\x02\xcf\xff\xae\x02\x82\x02\ +\xd5\xff\xd7\x02\x82\x02\xd9\xffq\x02\x82\x02\xdb\xffq\x02\ +\x82\x02\xdd\xffq\x02\x82\x02\xe0\xff\xd7\x02\x82\x02\xef\xff\ +\xec\x02\x82\x02\xf0\xff\xd7\x02\x82\x02\xf1\xff\xec\x02\x82\x02\ +\xf2\xff\xd7\x02\x82\x02\xf3\xff\xec\x02\x82\x02\xf4\xff\xd7\x02\ +\x82\x02\xfe\xff\xd7\x02\x82\x03\x09\xffq\x02\x82\x03\x0a\xff\ +\xd7\x02\x82\x03\x0b\xffq\x02\x82\x03\x0c\xff\xd7\x02\x82\x03\ +\x11\xff\x9a\x02\x82\x03\x12\xff\xae\x02\x82\x03\x15\xff\xec\x02\ +\x82\x03\x16\xff\xd7\x02\x82\x03\x1a\xff\xd7\x02\x82\x03\x1b\xff\ +\x9a\x02\x82\x03\x1c\xff\xae\x02\x83\x00\x0f\xff\xae\x02\x83\x00\ +\x11\xff\xae\x02\x83\x01\xce\xff\xd7\x02\x83\x01\xd5\xff\xd7\x02\ +\x83\x01\xf2\xff\xd7\x02\x83\x02\x08\xff\xae\x02\x83\x02\x0c\xff\ +\xae\x02\x83\x02s\xff\xd7\x02\x83\x02\xcf\xff\xd7\x02\x83\x03\ +\x12\xff\xd7\x02\x83\x03\x1c\xff\xd7\x02\x84\x00\x0f\xff\xae\x02\ +\x84\x00\x11\xff\xae\x02\x84\x01\xce\xff\xd7\x02\x84\x01\xd5\xff\ +\xd7\x02\x84\x01\xf2\xff\xd7\x02\x84\x02\x08\xff\xae\x02\x84\x02\ +\x0c\xff\xae\x02\x84\x02s\xff\xd7\x02\x84\x02\xcf\xff\xd7\x02\ +\x84\x03\x12\xff\xd7\x02\x84\x03\x1c\xff\xd7\x02\x85\x00\x0f\xff\ +\xae\x02\x85\x00\x11\xff\xae\x02\x85\x01\xce\xff\xd7\x02\x85\x01\ +\xd5\xff\xd7\x02\x85\x01\xf2\xff\xd7\x02\x85\x02\x08\xff\xae\x02\ +\x85\x02\x0c\xff\xae\x02\x85\x02s\xff\xd7\x02\x85\x02\xcf\xff\ +\xd7\x02\x85\x03\x12\xff\xd7\x02\x85\x03\x1c\xff\xd7\x02\x86\x00\ +\x0f\xff\xae\x02\x86\x00\x11\xff\xae\x02\x86\x01\x9d\xff\xec\x02\ +\x86\x01\xa4\xff\xd7\x02\x86\x01\xa6\xff\xec\x02\x86\x01\xa8\xff\ +\xd7\x02\x86\x01\xaa\xff\xd7\x02\x86\x01\xae\xff\xd7\x02\x86\x01\ +\xb0\xff\xd7\x02\x86\x01\xb1\xff\xec\x02\x86\x01\xb5\xff\xd7\x02\ +\x86\x01\xbc\xff\xc3\x02\x86\x01\xbd\xff\xd7\x02\x86\x01\xbf\xff\ +\xd7\x02\x86\x01\xc1\xff\xd7\x02\x86\x01\xc4\xff\xec\x02\x86\x01\ +\xc7\xff\xec\x02\x86\x01\xce\xff\xec\x02\x86\x01\xd5\xff\xec\x02\ +\x86\x01\xf2\xff\xec\x02\x86\x02\x08\xff\xae\x02\x86\x02\x0c\xff\ +\xae\x02\x86\x02r\xff\xd7\x02\x86\x02s\xff\xec\x02\x86\x02\ +z\xff\xec\x02\x86\x02|\xff\xd7\x02\x86\x02\x80\xff\xec\x02\ +\x86\x02\x82\xff\xec\x02\x86\x02\x9f\xff\xd7\x02\x86\x02\xa1\xff\ +\xec\x02\x86\x02\xa9\xff\xec\x02\x86\x02\xb5\xff\xc3\x02\x86\x02\ +\xb7\xff\xec\x02\x86\x02\xb9\xff\xec\x02\x86\x02\xbb\xff\xd7\x02\ +\x86\x02\xbd\xff\xec\x02\x86\x02\xbf\xff\xd7\x02\x86\x02\xc1\xff\ +\xd7\x02\x86\x02\xca\xff\xd7\x02\x86\x02\xce\xff\xd7\x02\x86\x02\ +\xcf\xff\xec\x02\x86\x02\xd4\xff\xd7\x02\x86\x02\xd9\xff\xd7\x02\ +\x86\x02\xdb\xff\xd7\x02\x86\x02\xdd\xff\xd7\x02\x86\x02\xe5\xff\ +\xd7\x02\x86\x02\xe7\xff\xec\x02\x86\x02\xf5\xff\xec\x02\x86\x02\ +\xf7\xff\xd7\x02\x86\x02\xf9\xff\xd7\x02\x86\x02\xfb\xff\xd7\x02\ +\x86\x02\xfd\xff\xd7\x02\x86\x03\x05\xff\xd7\x02\x86\x03\x07\xff\ +\xd7\x02\x86\x03\x0d\xff\xd7\x02\x86\x03\x0f\xff\xd7\x02\x86\x03\ +\x11\xff\xd7\x02\x86\x03\x12\xff\xec\x02\x86\x03\x17\xff\xec\x02\ +\x86\x03\x1b\xff\xd7\x02\x86\x03\x1c\xff\xec\x02\x87\x00\x05\xff\ +\xec\x02\x87\x00\x0a\xff\xec\x02\x87\x01\xd0\xff\xd7\x02\x87\x01\ +\xdc\xff\xec\x02\x87\x01\xdd\xff\xec\x02\x87\x01\xdf\xff\xd7\x02\ +\x87\x01\xe1\xff\xec\x02\x87\x01\xe4\xff\xec\x02\x87\x01\xf6\xff\ +\xec\x02\x87\x02\x07\xff\xec\x02\x87\x02\x0b\xff\xec\x02\x87\x02\ +\xa0\xff\xd7\x02\x87\x02\xaa\xff\xec\x02\x87\x02\xb6\xff\xec\x02\ +\x87\x02\xbc\xff\xd7\x02\x87\x02\xbe\xff\xec\x02\x87\x02\xc0\xff\ +\xec\x02\x87\x02\xc2\xff\xec\x02\x87\x02\xcb\xff\xd7\x02\x87\x02\ +\xd5\xff\xec\x02\x87\x02\xe6\xff\xd7\x02\x87\x02\xf8\xff\xec\x02\ +\x87\x02\xfa\xff\xec\x02\x87\x02\xfc\xff\xec\x02\x87\x02\xfe\xff\ +\xec\x02\x87\x03\x06\xff\xd7\x02\x87\x03\x08\xff\xd7\x02\x87\x03\ +\x0e\xff\xec\x02\x87\x03\x10\xff\xec\x02\x87\x03\x18\xff\xec\x02\ +\x88\x00\x0f\xff\xae\x02\x88\x00\x11\xff\xae\x02\x88\x01\x9d\xff\ +\xec\x02\x88\x01\xa4\xff\xd7\x02\x88\x01\xa6\xff\xec\x02\x88\x01\ +\xa8\xff\xd7\x02\x88\x01\xaa\xff\xd7\x02\x88\x01\xae\xff\xd7\x02\ +\x88\x01\xb0\xff\xd7\x02\x88\x01\xb1\xff\xec\x02\x88\x01\xb5\xff\ +\xd7\x02\x88\x01\xbc\xff\xc3\x02\x88\x01\xbd\xff\xd7\x02\x88\x01\ +\xbf\xff\xd7\x02\x88\x01\xc1\xff\xd7\x02\x88\x01\xc4\xff\xec\x02\ +\x88\x01\xc7\xff\xec\x02\x88\x01\xce\xff\xec\x02\x88\x01\xd5\xff\ +\xec\x02\x88\x01\xf2\xff\xec\x02\x88\x02\x08\xff\xae\x02\x88\x02\ +\x0c\xff\xae\x02\x88\x02r\xff\xd7\x02\x88\x02s\xff\xec\x02\ +\x88\x02z\xff\xec\x02\x88\x02|\xff\xd7\x02\x88\x02\x80\xff\ +\xec\x02\x88\x02\x82\xff\xec\x02\x88\x02\x9f\xff\xd7\x02\x88\x02\ +\xa1\xff\xec\x02\x88\x02\xa9\xff\xec\x02\x88\x02\xb5\xff\xc3\x02\ +\x88\x02\xb7\xff\xec\x02\x88\x02\xb9\xff\xec\x02\x88\x02\xbb\xff\ +\xd7\x02\x88\x02\xbd\xff\xec\x02\x88\x02\xbf\xff\xd7\x02\x88\x02\ +\xc1\xff\xd7\x02\x88\x02\xca\xff\xd7\x02\x88\x02\xce\xff\xd7\x02\ +\x88\x02\xcf\xff\xec\x02\x88\x02\xd4\xff\xd7\x02\x88\x02\xd9\xff\ +\xd7\x02\x88\x02\xdb\xff\xd7\x02\x88\x02\xdd\xff\xd7\x02\x88\x02\ +\xe5\xff\xd7\x02\x88\x02\xe7\xff\xec\x02\x88\x02\xf5\xff\xec\x02\ +\x88\x02\xf7\xff\xd7\x02\x88\x02\xf9\xff\xd7\x02\x88\x02\xfb\xff\ +\xd7\x02\x88\x02\xfd\xff\xd7\x02\x88\x03\x05\xff\xd7\x02\x88\x03\ +\x07\xff\xd7\x02\x88\x03\x0d\xff\xd7\x02\x88\x03\x0f\xff\xd7\x02\ +\x88\x03\x11\xff\xd7\x02\x88\x03\x12\xff\xec\x02\x88\x03\x17\xff\ +\xec\x02\x88\x03\x1b\xff\xd7\x02\x88\x03\x1c\xff\xec\x02\x89\x00\ +\x05\xff\xec\x02\x89\x00\x0a\xff\xec\x02\x89\x01\xd0\xff\xd7\x02\ +\x89\x01\xdc\xff\xec\x02\x89\x01\xdd\xff\xec\x02\x89\x01\xdf\xff\ +\xd7\x02\x89\x01\xe1\xff\xec\x02\x89\x01\xe4\xff\xec\x02\x89\x01\ +\xf6\xff\xec\x02\x89\x02\x07\xff\xec\x02\x89\x02\x0b\xff\xec\x02\ +\x89\x02\xa0\xff\xd7\x02\x89\x02\xaa\xff\xec\x02\x89\x02\xb6\xff\ +\xec\x02\x89\x02\xbc\xff\xd7\x02\x89\x02\xbe\xff\xec\x02\x89\x02\ +\xc0\xff\xec\x02\x89\x02\xc2\xff\xec\x02\x89\x02\xcb\xff\xd7\x02\ +\x89\x02\xd5\xff\xec\x02\x89\x02\xe6\xff\xd7\x02\x89\x02\xf8\xff\ +\xec\x02\x89\x02\xfa\xff\xec\x02\x89\x02\xfc\xff\xec\x02\x89\x02\ +\xfe\xff\xec\x02\x89\x03\x06\xff\xd7\x02\x89\x03\x08\xff\xd7\x02\ +\x89\x03\x0e\xff\xec\x02\x89\x03\x10\xff\xec\x02\x89\x03\x18\xff\ +\xec\x02\x8a\x00\x0f\xff\xae\x02\x8a\x00\x11\xff\xae\x02\x8a\x01\ +\x9d\xff\xec\x02\x8a\x01\xa4\xff\xd7\x02\x8a\x01\xa6\xff\xec\x02\ +\x8a\x01\xa8\xff\xd7\x02\x8a\x01\xaa\xff\xd7\x02\x8a\x01\xae\xff\ +\xd7\x02\x8a\x01\xb0\xff\xd7\x02\x8a\x01\xb1\xff\xec\x02\x8a\x01\ +\xb5\xff\xd7\x02\x8a\x01\xbc\xff\xc3\x02\x8a\x01\xbd\xff\xd7\x02\ +\x8a\x01\xbf\xff\xd7\x02\x8a\x01\xc1\xff\xd7\x02\x8a\x01\xc4\xff\ +\xec\x02\x8a\x01\xc7\xff\xec\x02\x8a\x01\xce\xff\xec\x02\x8a\x01\ +\xd5\xff\xec\x02\x8a\x01\xf2\xff\xec\x02\x8a\x02\x08\xff\xae\x02\ +\x8a\x02\x0c\xff\xae\x02\x8a\x02r\xff\xd7\x02\x8a\x02s\xff\ +\xec\x02\x8a\x02z\xff\xec\x02\x8a\x02|\xff\xd7\x02\x8a\x02\ +\x80\xff\xec\x02\x8a\x02\x82\xff\xec\x02\x8a\x02\x9f\xff\xd7\x02\ +\x8a\x02\xa1\xff\xec\x02\x8a\x02\xa9\xff\xec\x02\x8a\x02\xb5\xff\ +\xc3\x02\x8a\x02\xb7\xff\xec\x02\x8a\x02\xb9\xff\xec\x02\x8a\x02\ +\xbb\xff\xd7\x02\x8a\x02\xbd\xff\xec\x02\x8a\x02\xbf\xff\xd7\x02\ +\x8a\x02\xc1\xff\xd7\x02\x8a\x02\xca\xff\xd7\x02\x8a\x02\xce\xff\ +\xd7\x02\x8a\x02\xcf\xff\xec\x02\x8a\x02\xd4\xff\xd7\x02\x8a\x02\ +\xd9\xff\xd7\x02\x8a\x02\xdb\xff\xd7\x02\x8a\x02\xdd\xff\xd7\x02\ +\x8a\x02\xe5\xff\xd7\x02\x8a\x02\xe7\xff\xec\x02\x8a\x02\xf5\xff\ +\xec\x02\x8a\x02\xf7\xff\xd7\x02\x8a\x02\xf9\xff\xd7\x02\x8a\x02\ +\xfb\xff\xd7\x02\x8a\x02\xfd\xff\xd7\x02\x8a\x03\x05\xff\xd7\x02\ +\x8a\x03\x07\xff\xd7\x02\x8a\x03\x0d\xff\xd7\x02\x8a\x03\x0f\xff\ +\xd7\x02\x8a\x03\x11\xff\xd7\x02\x8a\x03\x12\xff\xec\x02\x8a\x03\ +\x17\xff\xec\x02\x8a\x03\x1b\xff\xd7\x02\x8a\x03\x1c\xff\xec\x02\ +\x8b\x00\x0f\xff\xae\x02\x8b\x00\x11\xff\xae\x02\x8b\x01\xce\xff\ +\xd7\x02\x8b\x01\xd5\xff\xd7\x02\x8b\x01\xf2\xff\xd7\x02\x8b\x02\ +\x08\xff\xae\x02\x8b\x02\x0c\xff\xae\x02\x8b\x02s\xff\xd7\x02\ +\x8b\x02\xcf\xff\xd7\x02\x8b\x03\x12\xff\xd7\x02\x8b\x03\x1c\xff\ +\xd7\x02\x8c\x01\x9f\xff\xd7\x02\x8c\x01\xb8\xff\xd7\x02\x8c\x01\ +\xbb\xff\xd7\x02\x8c\x01\xbe\xff\xd7\x02\x8c\x01\xe1\xff\xd7\x02\ +\x8c\x02l\xff\xd7\x02\x8c\x02~\xff\xd7\x02\x8c\x02\x84\xff\ +\xd7\x02\x8c\x02\x86\xff\xd7\x02\x8c\x02\x88\xff\xd7\x02\x8c\x02\ +\x8a\xff\xd7\x02\x8c\x02\x8c\xff\xd7\x02\x8c\x02\xb1\xff\xd7\x02\ +\x8c\x02\xb3\xff\xd7\x02\x8c\x02\xc0\xff\xd7\x02\x8c\x02\xc2\xff\ +\xd7\x02\x8c\x02\xc5\xff\xd7\x02\x8c\x02\xc7\xff\xd7\x02\x8c\x02\ +\xd5\xff\xd7\x02\x8c\x02\xef\xff\xd7\x02\x8c\x02\xf1\xff\xd7\x02\ +\x8c\x02\xf3\xff\xd7\x02\x8c\x02\xfe\xff\xd7\x02\x8c\x03\x09\xff\ +\xd7\x02\x8c\x03\x0b\xff\xd7\x02\x8c\x03\x0e\xff\xd7\x02\x8c\x03\ +\x10\xff\xd7\x02\x8c\x03\x15\xff\xd7\x02\x95\x01\xa3\x00\xe1\x02\ +\x95\x02\xea\x00)\x02\x95\x03\x0e\xff\xd7\x02\x95\x03\x10\xff\ +\xd7\x02\x96\x00\x05\xff\xec\x02\x96\x00\x0a\xff\xec\x02\x96\x02\ +\x07\xff\xec\x02\x96\x02\x0b\xff\xec\x02\x97\x00\x05\xff\xae\x02\ +\x97\x00\x0a\xff\xae\x02\x97\x01\x9d\xff\xd7\x02\x97\x01\xa6\xff\ +\xd7\x02\x97\x01\xbc\xff\xae\x02\x97\x01\xc1\xff\xae\x02\x97\x01\ +\xc4\xff\xd7\x02\x97\x01\xdc\xff\xd7\x02\x97\x01\xe4\xff\xd7\x02\ +\x97\x02\x07\xff\xae\x02\x97\x02\x0b\xff\xae\x02\x97\x02|\xff\ +\xae\x02\x97\x02\x80\xff\xc3\x02\x97\x02\x82\xff\xc3\x02\x97\x02\ +\xa9\xff\xd7\x02\x97\x02\xaa\xff\xd7\x02\x97\x02\xb5\xff\xae\x02\ +\x97\x02\xb6\xff\xd7\x02\x97\x02\xb7\xff\xc3\x02\x97\x02\xb9\xff\ +\xc3\x02\x97\x02\xbd\xff\xd7\x02\x97\x02\xbe\xff\xd7\x02\x97\x02\ +\xbf\xff\xae\x02\x97\x02\xc1\xff\xae\x02\x97\x02\xd4\xff\xae\x02\ +\x97\x02\xfd\xff\xae\x02\x97\x03\x0d\xff\x9a\x02\x97\x03\x0f\xff\ +\x9a\x02\x97\x03\x17\xff\xd7\x02\x97\x03\x18\xff\xd7\x02\x98\x00\ +\x05\xff\x85\x02\x98\x00\x0a\xff\x85\x02\x98\x01\xd0\xff\xd7\x02\ +\x98\x01\xdc\xff\x9a\x02\x98\x01\xdd\xff\xc3\x02\x98\x01\xdf\xff\ +\xd7\x02\x98\x01\xe1\xff\xae\x02\x98\x01\xe4\xff\x9a\x02\x98\x01\ +\xf6\xff\xc3\x02\x98\x02\x07\xff\x85\x02\x98\x02\x0b\xff\x85\x02\ +\x98\x02m\xff\xd7\x02\x98\x02\x81\xff\xd7\x02\x98\x02\x83\xff\ +\xd7\x02\x98\x02\x8b\xff\xd7\x02\x98\x02\xa0\xff\xd7\x02\x98\x02\ +\xaa\xff\x9a\x02\x98\x02\xb6\xff\x9a\x02\x98\x02\xb8\xff\xc3\x02\ +\x98\x02\xba\xff\xc3\x02\x98\x02\xbc\xff\xd7\x02\x98\x02\xbe\xff\ +\x9a\x02\x98\x02\xc0\xff\xae\x02\x98\x02\xc2\xff\xae\x02\x98\x02\ +\xc6\xff\xd7\x02\x98\x02\xc8\xff\xd7\x02\x98\x02\xcb\xff\xd7\x02\ +\x98\x02\xd5\xff\xae\x02\x98\x02\xe6\xff\xd7\x02\x98\x02\xea\xff\ +\xd7\x02\x98\x02\xf8\xff\xc3\x02\x98\x02\xfa\xff\xc3\x02\x98\x02\ +\xfc\xff\xc3\x02\x98\x02\xfe\xff\xae\x02\x98\x03\x06\xff\xd7\x02\ +\x98\x03\x08\xff\xd7\x02\x98\x03\x0e\xff\x9a\x02\x98\x03\x10\xff\ +\x9a\x02\x98\x03\x18\xff\x9a\x02\x99\x00\x0f\xfe\xf6\x02\x99\x00\ +\x11\xfe\xf6\x02\x99\x01\xa4\xff\x85\x02\x99\x01\xaa\xff\x9a\x02\ +\x99\x01\xae\xff\x85\x02\x99\x01\xb0\xff\xd7\x02\x99\x01\xb5\xff\ +\x85\x02\x99\x01\xbf\xff\xd7\x02\x99\x01\xce\xff\x9a\x02\x99\x01\ +\xd5\xff\x9a\x02\x99\x01\xf2\xff\x9a\x02\x99\x02\x08\xfe\xf6\x02\ +\x99\x02\x0c\xfe\xf6\x02\x99\x02r\xff\x9a\x02\x99\x02s\xff\ +\x9a\x02\x99\x02v\xff\xec\x02\x99\x02\x9f\xff\xd7\x02\x99\x02\ +\xbb\xff\xd7\x02\x99\x02\xca\xff\xd7\x02\x99\x02\xce\xff\x85\x02\ +\x99\x02\xcf\xff\x9a\x02\x99\x02\xd9\xff\x9a\x02\x99\x02\xdb\xff\ +\x9a\x02\x99\x02\xdd\xff\x9a\x02\x99\x02\xe5\xff\xd7\x02\x99\x03\ +\x05\xff\xd7\x02\x99\x03\x07\xff\xd7\x02\x99\x03\x09\xff\xae\x02\ +\x99\x03\x0b\xff\xae\x02\x99\x03\x11\xff\x85\x02\x99\x03\x12\xff\ +\x9a\x02\x99\x03\x1b\xff\x85\x02\x99\x03\x1c\xff\x9a\x02\x9a\x00\ +\x05\xff\xec\x02\x9a\x00\x0a\xff\xec\x02\x9a\x01\xd0\xff\xd7\x02\ +\x9a\x01\xdc\xff\xec\x02\x9a\x01\xdd\xff\xec\x02\x9a\x01\xdf\xff\ +\xd7\x02\x9a\x01\xe1\xff\xec\x02\x9a\x01\xe4\xff\xec\x02\x9a\x01\ +\xf6\xff\xec\x02\x9a\x02\x07\xff\xec\x02\x9a\x02\x0b\xff\xec\x02\ +\x9a\x02\xa0\xff\xd7\x02\x9a\x02\xaa\xff\xec\x02\x9a\x02\xb6\xff\ +\xec\x02\x9a\x02\xbc\xff\xd7\x02\x9a\x02\xbe\xff\xec\x02\x9a\x02\ +\xc0\xff\xec\x02\x9a\x02\xc2\xff\xec\x02\x9a\x02\xcb\xff\xd7\x02\ +\x9a\x02\xd5\xff\xec\x02\x9a\x02\xe6\xff\xd7\x02\x9a\x02\xf8\xff\ +\xec\x02\x9a\x02\xfa\xff\xec\x02\x9a\x02\xfc\xff\xec\x02\x9a\x02\ +\xfe\xff\xec\x02\x9a\x03\x06\xff\xd7\x02\x9a\x03\x08\xff\xd7\x02\ +\x9a\x03\x0e\xff\xec\x02\x9a\x03\x10\xff\xec\x02\x9a\x03\x18\xff\ +\xec\x02\x9b\x00\x0f\xff\x9a\x02\x9b\x00\x10\xff\xd7\x02\x9b\x00\ +\x11\xff\x9a\x02\x9b\x01\x9d\x00)\x02\x9b\x01\x9f\xff\xd7\x02\ +\x9b\x01\xa4\xff\xae\x02\x9b\x01\xa6\x00)\x02\x9b\x01\xaa\xff\ +\x85\x02\x9b\x01\xae\xff\xae\x02\x9b\x01\xb5\xff\xae\x02\x9b\x01\ +\xb8\xff\xd7\x02\x9b\x01\xbb\xff\xd7\x02\x9b\x01\xbc\x00)\x02\ +\x9b\x01\xbe\xff\xc3\x02\x9b\x01\xc4\x00)\x02\x9b\x01\xcc\xff\ +\xc3\x02\x9b\x01\xcd\xff\xc3\x02\x9b\x01\xce\xff\x9a\x02\x9b\x01\ +\xcf\xff\xae\x02\x9b\x01\xd0\xff\xd7\x02\x9b\x01\xd1\xff\xd7\x02\ +\x9b\x01\xd2\xff\xc3\x02\x9b\x01\xd3\xff\xc3\x02\x9b\x01\xd4\xff\ +\xc3\x02\x9b\x01\xd5\xff\x9a\x02\x9b\x01\xd6\xff\xc3\x02\x9b\x01\ +\xd7\xff\xc3\x02\x9b\x01\xd8\xff\xae\x02\x9b\x01\xd9\xff\xc3\x02\ +\x9b\x01\xda\xff\xc3\x02\x9b\x01\xdb\xff\xae\x02\x9b\x01\xde\xff\ +\xae\x02\x9b\x01\xdf\xff\xd7\x02\x9b\x01\xe0\xff\xc3\x02\x9b\x01\ +\xe1\xff\x9a\x02\x9b\x01\xe2\xff\xc3\x02\x9b\x01\xe3\xff\xc3\x02\ +\x9b\x01\xe5\xff\xc3\x02\x9b\x01\xe6\xff\xc3\x02\x9b\x01\xe7\xff\ +\xd7\x02\x9b\x01\xe8\xff\xc3\x02\x9b\x01\xea\xff\xae\x02\x9b\x01\ +\xeb\x00)\x02\x9b\x01\xec\xff\xc3\x02\x9b\x01\xed\xff\xae\x02\ +\x9b\x01\xee\xff\xc3\x02\x9b\x01\xf2\xff\x9a\x02\x9b\x01\xf3\xff\ +\xc3\x02\x9b\x01\xf4\x00)\x02\x9b\x01\xf5\xff\xc3\x02\x9b\x01\ +\xf7\xff\xc3\x02\x9b\x01\xf9\xff\xc3\x02\x9b\x02\x02\xff\xd7\x02\ +\x9b\x02\x03\xff\xd7\x02\x9b\x02\x04\xff\xd7\x02\x9b\x02\x08\xff\ +\x9a\x02\x9b\x02\x0c\xff\x9a\x02\x9b\x02j\xff\xae\x02\x9b\x02\ +k\xff\xc3\x02\x9b\x02l\xff\xd7\x02\x9b\x02q\xff\xc3\x02\ +\x9b\x02r\xff\x85\x02\x9b\x02s\xff\x9a\x02\x9b\x02u\xff\ +\xc3\x02\x9b\x02w\xff\xd7\x02\x9b\x02y\xff\xc3\x02\x9b\x02\ +}\xff\xc3\x02\x9b\x02~\xff\xd7\x02\x9b\x02\x7f\xff\xae\x02\ +\x9b\x02\x84\xff\xd7\x02\x9b\x02\x85\xff\xae\x02\x9b\x02\x86\xff\ +\xd7\x02\x9b\x02\x87\xff\xae\x02\x9b\x02\x88\xff\xd7\x02\x9b\x02\ +\x89\xff\xae\x02\x9b\x02\x8a\xff\xd7\x02\x9b\x02\x8c\xff\xd7\x02\ +\x9b\x02\x8d\xff\xae\x02\x9b\x02\x96\xff\xc3\x02\x9b\x02\x98\x00\ +)\x02\x9b\x02\x9a\xff\xc3\x02\x9b\x02\x9e\xff\xc3\x02\x9b\x02\ +\xa0\xff\xd7\x02\x9b\x02\xa2\xff\xd7\x02\x9b\x02\xa4\xff\xc3\x02\ +\x9b\x02\xa6\xff\xc3\x02\x9b\x02\xa8\x00)\x02\x9b\x02\xa9\x00\ +)\x02\x9b\x02\xac\xff\xc3\x02\x9b\x02\xae\xff\xc3\x02\x9b\x02\ +\xb0\xff\xc3\x02\x9b\x02\xb1\xff\xd7\x02\x9b\x02\xb2\xff\xae\x02\ +\x9b\x02\xb3\xff\xd7\x02\x9b\x02\xb4\xff\xae\x02\x9b\x02\xb5\x00\ +)\x02\x9b\x02\xbc\xff\xd7\x02\x9b\x02\xbd\x00)\x02\x9b\x02\ +\xc0\xff\x9a\x02\x9b\x02\xc2\xff\x9a\x02\x9b\x02\xc4\xff\xc3\x02\ +\x9b\x02\xc5\xff\xd7\x02\x9b\x02\xc6\xff\xc3\x02\x9b\x02\xc7\xff\ +\xd7\x02\x9b\x02\xc8\xff\xc3\x02\x9b\x02\xcb\xff\xd7\x02\x9b\x02\ +\xcd\xff\xc3\x02\x9b\x02\xce\xff\xae\x02\x9b\x02\xcf\xff\x9a\x02\ +\x9b\x02\xd1\xff\xc3\x02\x9b\x02\xd3\xff\xc3\x02\x9b\x02\xd5\xff\ +\x9a\x02\x9b\x02\xd7\xff\xc3\x02\x9b\x02\xd9\xff\x85\x02\x9b\x02\ +\xdb\xff\x85\x02\x9b\x02\xdd\xff\x85\x02\x9b\x02\xe0\xff\xae\x02\ +\x9b\x02\xe6\xff\xd7\x02\x9b\x02\xe8\xff\xd7\x02\x9b\x02\xec\xff\ +\xc3\x02\x9b\x02\xee\xff\xc3\x02\x9b\x02\xef\xff\xd7\x02\x9b\x02\ +\xf0\xff\xae\x02\x9b\x02\xf1\xff\xd7\x02\x9b\x02\xf2\xff\xae\x02\ +\x9b\x02\xf3\xff\xd7\x02\x9b\x02\xf4\xff\xae\x02\x9b\x02\xf6\xff\ +\xd7\x02\x9b\x02\xfe\xff\x9a\x02\x9b\x03\x00\xff\xc3\x02\x9b\x03\ +\x02\xff\xc3\x02\x9b\x03\x06\xff\xd7\x02\x9b\x03\x08\xff\xd7\x02\ +\x9b\x03\x09\xff\x9a\x02\x9b\x03\x0a\xff\xae\x02\x9b\x03\x0b\xff\ +\x9a\x02\x9b\x03\x0c\xff\xae\x02\x9b\x03\x0e\xff\xd7\x02\x9b\x03\ +\x10\xff\xd7\x02\x9b\x03\x11\xff\xae\x02\x9b\x03\x12\xff\x9a\x02\ +\x9b\x03\x14\xff\xc3\x02\x9b\x03\x15\xff\xd7\x02\x9b\x03\x16\xff\ +\xae\x02\x9b\x03\x17\x00)\x02\x9b\x03\x1a\xff\xae\x02\x9b\x03\ +\x1b\xff\xae\x02\x9b\x03\x1c\xff\x9a\x02\x9c\x00\x0f\xff\xc3\x02\ +\x9c\x00\x11\xff\xc3\x02\x9c\x01\xce\xff\xc3\x02\x9c\x01\xcf\xff\ +\xd7\x02\x9c\x01\xd5\xff\xc3\x02\x9c\x01\xd8\xff\xd7\x02\x9c\x01\ +\xdb\xff\xd7\x02\x9c\x01\xde\xff\xd7\x02\x9c\x01\xea\xff\xd7\x02\ +\x9c\x01\xed\xff\xd7\x02\x9c\x01\xf2\xff\xc3\x02\x9c\x02\x08\xff\ +\xc3\x02\x9c\x02\x0c\xff\xc3\x02\x9c\x02j\xff\xd7\x02\x9c\x02\ +s\xff\xc3\x02\x9c\x02\x7f\xff\xd7\x02\x9c\x02\x85\xff\xd7\x02\ +\x9c\x02\x87\xff\xd7\x02\x9c\x02\x89\xff\xd7\x02\x9c\x02\x8d\xff\ +\xd7\x02\x9c\x02\xb2\xff\xd7\x02\x9c\x02\xb4\xff\xd7\x02\x9c\x02\ +\xcf\xff\xc3\x02\x9c\x02\xe0\xff\xd7\x02\x9c\x02\xf0\xff\xd7\x02\ +\x9c\x02\xf2\xff\xd7\x02\x9c\x02\xf4\xff\xd7\x02\x9c\x03\x0a\xff\ +\xd7\x02\x9c\x03\x0c\xff\xd7\x02\x9c\x03\x12\xff\xc3\x02\x9c\x03\ +\x16\xff\xd7\x02\x9c\x03\x1a\xff\xd7\x02\x9c\x03\x1c\xff\xc3\x02\ +\x9d\x00\x05\xff\xc3\x02\x9d\x00\x0a\xff\xc3\x02\x9d\x01\x9d\xff\ +\xc3\x02\x9d\x01\xa3\x00f\x02\x9d\x01\xa6\xff\xc3\x02\x9d\x01\ +\xbc\xff\xc3\x02\x9d\x01\xc1\xff\xae\x02\x9d\x01\xc4\xff\xc3\x02\ +\x9d\x01\xdc\xff\xd7\x02\x9d\x01\xe1\xff\xd7\x02\x9d\x01\xe4\xff\ +\xd7\x02\x9d\x02\x07\xff\xc3\x02\x9d\x02\x0b\xff\xc3\x02\x9d\x02\ +|\xff\xae\x02\x9d\x02\x80\xff\xc3\x02\x9d\x02\x82\xff\xc3\x02\ +\x9d\x02\xa9\xff\xc3\x02\x9d\x02\xaa\xff\xd7\x02\x9d\x02\xb5\xff\ +\xc3\x02\x9d\x02\xb6\xff\xd7\x02\x9d\x02\xb7\xff\xd7\x02\x9d\x02\ +\xb9\xff\xd7\x02\x9d\x02\xbd\xff\xc3\x02\x9d\x02\xbe\xff\xd7\x02\ +\x9d\x02\xbf\xff\xae\x02\x9d\x02\xc0\xff\xd7\x02\x9d\x02\xc1\xff\ +\xae\x02\x9d\x02\xc2\xff\xd7\x02\x9d\x02\xd4\xff\xae\x02\x9d\x02\ +\xd5\xff\xd7\x02\x9d\x02\xfd\xff\xae\x02\x9d\x02\xfe\xff\xd7\x02\ +\x9d\x03\x0d\xff\xd7\x02\x9d\x03\x0e\xff\xc3\x02\x9d\x03\x0f\xff\ +\xd7\x02\x9d\x03\x10\xff\xc3\x02\x9d\x03\x17\xff\xc3\x02\x9d\x03\ +\x18\xff\xd7\x02\x9e\x00\x05\xff\xc3\x02\x9e\x00\x0a\xff\xc3\x02\ +\x9e\x02\x07\xff\xc3\x02\x9e\x02\x0b\xff\xc3\x02\x9e\x03\x0e\xff\ +\xd7\x02\x9e\x03\x10\xff\xd7\x02\x9f\x01\x9f\xff\xd7\x02\x9f\x01\ +\xa3\x00\xe1\x02\x9f\x01\xb8\xff\xd7\x02\x9f\x01\xbb\xff\xd7\x02\ +\x9f\x01\xbe\xff\xc3\x02\x9f\x01\xdc\xff\xd7\x02\x9f\x01\xe1\xff\ +\xae\x02\x9f\x01\xe4\xff\xd7\x02\x9f\x02l\xff\xd7\x02\x9f\x02\ +{\x00=\x02\x9f\x02}\xff\xec\x02\x9f\x02~\xff\xd7\x02\ +\x9f\x02\x84\xff\xd7\x02\x9f\x02\x86\xff\xd7\x02\x9f\x02\x88\xff\ +\xd7\x02\x9f\x02\x8a\xff\xd7\x02\x9f\x02\x8c\xff\xd7\x02\x9f\x02\ +\xaa\xff\xd7\x02\x9f\x02\xb1\xff\xd7\x02\x9f\x02\xb3\xff\xd7\x02\ +\x9f\x02\xb6\xff\xd7\x02\x9f\x02\xbe\xff\xd7\x02\x9f\x02\xc0\xff\ +\xae\x02\x9f\x02\xc2\xff\xae\x02\x9f\x02\xc5\xff\xc3\x02\x9f\x02\ +\xc6\xff\xd7\x02\x9f\x02\xc7\xff\xc3\x02\x9f\x02\xc8\xff\xd7\x02\ +\x9f\x02\xd5\xff\xae\x02\x9f\x02\xef\xff\xd7\x02\x9f\x02\xf1\xff\ +\xd7\x02\x9f\x02\xf3\xff\xd7\x02\x9f\x02\xfe\xff\xae\x02\x9f\x03\ +\x0e\xff\xd7\x02\x9f\x03\x10\xff\xd7\x02\x9f\x03\x15\xff\xd7\x02\ +\x9f\x03\x18\xff\xd7\x02\xa0\x01\xcf\xff\xec\x02\xa0\x01\xd8\xff\ +\xec\x02\xa0\x01\xdb\xff\xec\x02\xa0\x01\xde\xff\xec\x02\xa0\x01\ +\xe1\xff\xec\x02\xa0\x01\xea\xff\xec\x02\xa0\x01\xed\xff\xec\x02\ +\xa0\x02j\xff\xec\x02\xa0\x02\x7f\xff\xec\x02\xa0\x02\x85\xff\ +\xec\x02\xa0\x02\x87\xff\xec\x02\xa0\x02\x89\xff\xec\x02\xa0\x02\ +\x8d\xff\xec\x02\xa0\x02\xb2\xff\xec\x02\xa0\x02\xb4\xff\xec\x02\ +\xa0\x02\xc0\xff\xec\x02\xa0\x02\xc2\xff\xec\x02\xa0\x02\xd5\xff\ +\xec\x02\xa0\x02\xe0\xff\xec\x02\xa0\x02\xf0\xff\xec\x02\xa0\x02\ +\xf2\xff\xec\x02\xa0\x02\xf4\xff\xec\x02\xa0\x02\xfe\xff\xec\x02\ +\xa0\x03\x0a\xff\xec\x02\xa0\x03\x0c\xff\xec\x02\xa0\x03\x0e\xff\ +\xd7\x02\xa0\x03\x10\xff\xd7\x02\xa0\x03\x16\xff\xec\x02\xa0\x03\ +\x1a\xff\xec\x02\xa1\x00\x0f\xff\xae\x02\xa1\x00\x11\xff\xae\x02\ +\xa1\x02\x08\xff\xae\x02\xa1\x02\x0c\xff\xae\x02\xa1\x02\x80\xff\ +\xec\x02\xa1\x02\x82\xff\xec\x02\xa1\x02\xb7\xff\xec\x02\xa1\x02\ +\xb9\xff\xec\x02\xa1\x03\x0d\xff\xd7\x02\xa1\x03\x0f\xff\xd7\x02\ +\xa2\x01\xe9\x00)\x02\xa3\x01\x9f\xff\xd7\x02\xa3\x01\xa3\x00\ +\xe1\x02\xa3\x01\xb8\xff\xd7\x02\xa3\x01\xbb\xff\xd7\x02\xa3\x01\ +\xbe\xff\xc3\x02\xa3\x01\xdc\xff\xd7\x02\xa3\x01\xe1\xff\xae\x02\ +\xa3\x01\xe4\xff\xd7\x02\xa3\x02l\xff\xd7\x02\xa3\x02{\x00\ +=\x02\xa3\x02}\xff\xec\x02\xa3\x02~\xff\xd7\x02\xa3\x02\ +\x84\xff\xd7\x02\xa3\x02\x86\xff\xd7\x02\xa3\x02\x88\xff\xd7\x02\ +\xa3\x02\x8a\xff\xd7\x02\xa3\x02\x8c\xff\xd7\x02\xa3\x02\xaa\xff\ +\xd7\x02\xa3\x02\xb1\xff\xd7\x02\xa3\x02\xb3\xff\xd7\x02\xa3\x02\ +\xb6\xff\xd7\x02\xa3\x02\xbe\xff\xd7\x02\xa3\x02\xc0\xff\xae\x02\ +\xa3\x02\xc2\xff\xae\x02\xa3\x02\xc5\xff\xc3\x02\xa3\x02\xc6\xff\ +\xd7\x02\xa3\x02\xc7\xff\xc3\x02\xa3\x02\xc8\xff\xd7\x02\xa3\x02\ +\xd5\xff\xae\x02\xa3\x02\xef\xff\xd7\x02\xa3\x02\xf1\xff\xd7\x02\ +\xa3\x02\xf3\xff\xd7\x02\xa3\x02\xfe\xff\xae\x02\xa3\x03\x0e\xff\ +\xd7\x02\xa3\x03\x10\xff\xd7\x02\xa3\x03\x15\xff\xd7\x02\xa3\x03\ +\x18\xff\xd7\x02\xa4\x01\xcf\xff\xec\x02\xa4\x01\xd8\xff\xec\x02\ +\xa4\x01\xdb\xff\xec\x02\xa4\x01\xde\xff\xec\x02\xa4\x01\xe1\xff\ +\xec\x02\xa4\x01\xea\xff\xec\x02\xa4\x01\xed\xff\xec\x02\xa4\x02\ +j\xff\xec\x02\xa4\x02\x7f\xff\xec\x02\xa4\x02\x85\xff\xec\x02\ +\xa4\x02\x87\xff\xec\x02\xa4\x02\x89\xff\xec\x02\xa4\x02\x8d\xff\ +\xec\x02\xa4\x02\xb2\xff\xec\x02\xa4\x02\xb4\xff\xec\x02\xa4\x02\ +\xc0\xff\xec\x02\xa4\x02\xc2\xff\xec\x02\xa4\x02\xd5\xff\xec\x02\ +\xa4\x02\xe0\xff\xec\x02\xa4\x02\xf0\xff\xec\x02\xa4\x02\xf2\xff\ +\xec\x02\xa4\x02\xf4\xff\xec\x02\xa4\x02\xfe\xff\xec\x02\xa4\x03\ +\x0a\xff\xec\x02\xa4\x03\x0c\xff\xec\x02\xa4\x03\x0e\xff\xd7\x02\ +\xa4\x03\x10\xff\xd7\x02\xa4\x03\x16\xff\xec\x02\xa4\x03\x1a\xff\ +\xec\x02\xa5\x01\x9f\xff\xd7\x02\xa5\x01\xb8\xff\xd7\x02\xa5\x01\ +\xbb\xff\xd7\x02\xa5\x01\xbe\xff\xd7\x02\xa5\x01\xc1\xff\xd7\x02\ +\xa5\x01\xe1\xff\xd7\x02\xa5\x02l\xff\xd7\x02\xa5\x02|\xff\ +\xd7\x02\xa5\x02~\xff\xd7\x02\xa5\x02\x84\xff\xd7\x02\xa5\x02\ +\x86\xff\xd7\x02\xa5\x02\x88\xff\xd7\x02\xa5\x02\x8a\xff\xd7\x02\ +\xa5\x02\x8c\xff\xd7\x02\xa5\x02\xb1\xff\xd7\x02\xa5\x02\xb3\xff\ +\xd7\x02\xa5\x02\xbf\xff\xd7\x02\xa5\x02\xc0\xff\xd7\x02\xa5\x02\ +\xc1\xff\xd7\x02\xa5\x02\xc2\xff\xd7\x02\xa5\x02\xc5\xff\x9a\x02\ +\xa5\x02\xc7\xff\x9a\x02\xa5\x02\xd4\xff\xd7\x02\xa5\x02\xd5\xff\ +\xd7\x02\xa5\x02\xef\xff\xd7\x02\xa5\x02\xf1\xff\xd7\x02\xa5\x02\ +\xf3\xff\xd7\x02\xa5\x02\xfd\xff\xd7\x02\xa5\x02\xfe\xff\xd7\x02\ +\xa5\x03\x09\xff\xd7\x02\xa5\x03\x0b\xff\xd7\x02\xa5\x03\x0e\xff\ +\xd7\x02\xa5\x03\x10\xff\xd7\x02\xa5\x03\x15\xff\xd7\x02\xa5\x03\ +\x19\xff\xec\x02\xa6\x01\xcf\xff\xd7\x02\xa6\x01\xd8\xff\xd7\x02\ +\xa6\x01\xdb\xff\xd7\x02\xa6\x01\xde\xff\xd7\x02\xa6\x01\xe1\xff\ +\xd7\x02\xa6\x01\xea\xff\xd7\x02\xa6\x01\xed\xff\xd7\x02\xa6\x02\ +j\xff\xd7\x02\xa6\x02\x7f\xff\xd7\x02\xa6\x02\x85\xff\xd7\x02\ +\xa6\x02\x87\xff\xd7\x02\xa6\x02\x89\xff\xd7\x02\xa6\x02\x8d\xff\ +\xd7\x02\xa6\x02\xb2\xff\xd7\x02\xa6\x02\xb4\xff\xd7\x02\xa6\x02\ +\xc0\xff\xd7\x02\xa6\x02\xc2\xff\xd7\x02\xa6\x02\xc6\xff\xd7\x02\ +\xa6\x02\xc8\xff\xd7\x02\xa6\x02\xd5\xff\xd7\x02\xa6\x02\xe0\xff\ +\xd7\x02\xa6\x02\xf0\xff\xd7\x02\xa6\x02\xf2\xff\xd7\x02\xa6\x02\ +\xf4\xff\xd7\x02\xa6\x02\xfe\xff\xd7\x02\xa6\x03\x0a\xff\xd7\x02\ +\xa6\x03\x0c\xff\xd7\x02\xa6\x03\x16\xff\xd7\x02\xa6\x03\x1a\xff\ +\xd7\x02\xa7\x01\x9f\xff\xd7\x02\xa7\x01\xb8\xff\xd7\x02\xa7\x01\ +\xbb\xff\xd7\x02\xa7\x01\xbe\xff\xd7\x02\xa7\x01\xc1\xff\xd7\x02\ +\xa7\x01\xe1\xff\xd7\x02\xa7\x02l\xff\xd7\x02\xa7\x02|\xff\ +\xd7\x02\xa7\x02~\xff\xd7\x02\xa7\x02\x84\xff\xd7\x02\xa7\x02\ +\x86\xff\xd7\x02\xa7\x02\x88\xff\xd7\x02\xa7\x02\x8a\xff\xd7\x02\ +\xa7\x02\x8c\xff\xd7\x02\xa7\x02\xb1\xff\xd7\x02\xa7\x02\xb3\xff\ +\xd7\x02\xa7\x02\xbf\xff\xd7\x02\xa7\x02\xc0\xff\xd7\x02\xa7\x02\ +\xc1\xff\xd7\x02\xa7\x02\xc2\xff\xd7\x02\xa7\x02\xc5\xff\x9a\x02\ +\xa7\x02\xc7\xff\x9a\x02\xa7\x02\xd4\xff\xd7\x02\xa7\x02\xd5\xff\ +\xd7\x02\xa7\x02\xef\xff\xd7\x02\xa7\x02\xf1\xff\xd7\x02\xa7\x02\ +\xf3\xff\xd7\x02\xa7\x02\xfd\xff\xd7\x02\xa7\x02\xfe\xff\xd7\x02\ +\xa7\x03\x09\xff\xd7\x02\xa7\x03\x0b\xff\xd7\x02\xa7\x03\x0e\xff\ +\xd7\x02\xa7\x03\x10\xff\xd7\x02\xa7\x03\x15\xff\xd7\x02\xa7\x03\ +\x19\xff\xec\x02\xa8\x01\xcf\xff\xd7\x02\xa8\x01\xd8\xff\xd7\x02\ +\xa8\x01\xdb\xff\xd7\x02\xa8\x01\xde\xff\xd7\x02\xa8\x01\xe1\xff\ +\xd7\x02\xa8\x01\xea\xff\xd7\x02\xa8\x01\xed\xff\xd7\x02\xa8\x02\ +j\xff\xd7\x02\xa8\x02\x7f\xff\xd7\x02\xa8\x02\x85\xff\xd7\x02\ +\xa8\x02\x87\xff\xd7\x02\xa8\x02\x89\xff\xd7\x02\xa8\x02\x8d\xff\ +\xd7\x02\xa8\x02\xb2\xff\xd7\x02\xa8\x02\xb4\xff\xd7\x02\xa8\x02\ +\xc0\xff\xd7\x02\xa8\x02\xc2\xff\xd7\x02\xa8\x02\xc6\xff\xd7\x02\ +\xa8\x02\xc8\xff\xd7\x02\xa8\x02\xd5\xff\xd7\x02\xa8\x02\xe0\xff\ +\xd7\x02\xa8\x02\xf0\xff\xd7\x02\xa8\x02\xf2\xff\xd7\x02\xa8\x02\ +\xf4\xff\xd7\x02\xa8\x02\xfe\xff\xd7\x02\xa8\x03\x0a\xff\xd7\x02\ +\xa8\x03\x0c\xff\xd7\x02\xa8\x03\x16\xff\xd7\x02\xa8\x03\x1a\xff\ +\xd7\x02\xa9\x01\x9f\xff\xd7\x02\xa9\x01\xb8\xff\xd7\x02\xa9\x01\ +\xbb\xff\xd7\x02\xa9\x01\xbe\xff\xd7\x02\xa9\x01\xc1\xff\xd7\x02\ +\xa9\x01\xe1\xff\xd7\x02\xa9\x02l\xff\xd7\x02\xa9\x02|\xff\ +\xd7\x02\xa9\x02~\xff\xd7\x02\xa9\x02\x84\xff\xd7\x02\xa9\x02\ +\x86\xff\xd7\x02\xa9\x02\x88\xff\xd7\x02\xa9\x02\x8a\xff\xd7\x02\ +\xa9\x02\x8c\xff\xd7\x02\xa9\x02\xb1\xff\xd7\x02\xa9\x02\xb3\xff\ +\xd7\x02\xa9\x02\xbf\xff\xd7\x02\xa9\x02\xc0\xff\xd7\x02\xa9\x02\ +\xc1\xff\xd7\x02\xa9\x02\xc2\xff\xd7\x02\xa9\x02\xc5\xff\x9a\x02\ +\xa9\x02\xc7\xff\x9a\x02\xa9\x02\xd4\xff\xd7\x02\xa9\x02\xd5\xff\ +\xd7\x02\xa9\x02\xef\xff\xd7\x02\xa9\x02\xf1\xff\xd7\x02\xa9\x02\ +\xf3\xff\xd7\x02\xa9\x02\xfd\xff\xd7\x02\xa9\x02\xfe\xff\xd7\x02\ +\xa9\x03\x09\xff\xd7\x02\xa9\x03\x0b\xff\xd7\x02\xa9\x03\x0e\xff\ +\xd7\x02\xa9\x03\x10\xff\xd7\x02\xa9\x03\x15\xff\xd7\x02\xa9\x03\ +\x19\xff\xec\x02\xaa\x01\xcf\xff\xd7\x02\xaa\x01\xd8\xff\xd7\x02\ +\xaa\x01\xdb\xff\xd7\x02\xaa\x01\xde\xff\xd7\x02\xaa\x01\xe1\xff\ +\xd7\x02\xaa\x01\xea\xff\xd7\x02\xaa\x01\xed\xff\xd7\x02\xaa\x02\ +j\xff\xd7\x02\xaa\x02\x7f\xff\xd7\x02\xaa\x02\x85\xff\xd7\x02\ +\xaa\x02\x87\xff\xd7\x02\xaa\x02\x89\xff\xd7\x02\xaa\x02\x8d\xff\ +\xd7\x02\xaa\x02\xb2\xff\xd7\x02\xaa\x02\xb4\xff\xd7\x02\xaa\x02\ +\xc0\xff\xd7\x02\xaa\x02\xc2\xff\xd7\x02\xaa\x02\xc6\xff\xd7\x02\ +\xaa\x02\xc8\xff\xd7\x02\xaa\x02\xd5\xff\xd7\x02\xaa\x02\xe0\xff\ +\xd7\x02\xaa\x02\xf0\xff\xd7\x02\xaa\x02\xf2\xff\xd7\x02\xaa\x02\ +\xf4\xff\xd7\x02\xaa\x02\xfe\xff\xd7\x02\xaa\x03\x0a\xff\xd7\x02\ +\xaa\x03\x0c\xff\xd7\x02\xaa\x03\x16\xff\xd7\x02\xaa\x03\x1a\xff\ +\xd7\x02\xab\x01\xa3\x00\xe1\x02\xab\x02\xea\x00)\x02\xab\x03\ +\x0e\xff\xd7\x02\xab\x03\x10\xff\xd7\x02\xac\x00\x05\xff\xec\x02\ +\xac\x00\x0a\xff\xec\x02\xac\x02\x07\xff\xec\x02\xac\x02\x0b\xff\ +\xec\x02\xad\x00\x0f\xff\x9a\x02\xad\x00\x10\xff\xd7\x02\xad\x00\ +\x11\xff\x9a\x02\xad\x01\x9d\x00)\x02\xad\x01\x9f\xff\xd7\x02\ +\xad\x01\xa4\xff\xae\x02\xad\x01\xa6\x00)\x02\xad\x01\xaa\xff\ +\x85\x02\xad\x01\xae\xff\xae\x02\xad\x01\xb5\xff\xae\x02\xad\x01\ +\xb8\xff\xd7\x02\xad\x01\xbb\xff\xd7\x02\xad\x01\xbc\x00)\x02\ +\xad\x01\xbe\xff\xc3\x02\xad\x01\xc4\x00)\x02\xad\x01\xcc\xff\ +\xc3\x02\xad\x01\xcd\xff\xc3\x02\xad\x01\xce\xff\x9a\x02\xad\x01\ +\xcf\xff\xae\x02\xad\x01\xd0\xff\xd7\x02\xad\x01\xd1\xff\xd7\x02\ +\xad\x01\xd2\xff\xc3\x02\xad\x01\xd3\xff\xc3\x02\xad\x01\xd4\xff\ +\xc3\x02\xad\x01\xd5\xff\x9a\x02\xad\x01\xd6\xff\xc3\x02\xad\x01\ +\xd7\xff\xc3\x02\xad\x01\xd8\xff\xae\x02\xad\x01\xd9\xff\xc3\x02\ +\xad\x01\xda\xff\xc3\x02\xad\x01\xdb\xff\xae\x02\xad\x01\xde\xff\ +\xae\x02\xad\x01\xdf\xff\xd7\x02\xad\x01\xe0\xff\xc3\x02\xad\x01\ +\xe1\xff\x9a\x02\xad\x01\xe2\xff\xc3\x02\xad\x01\xe3\xff\xc3\x02\ +\xad\x01\xe5\xff\xc3\x02\xad\x01\xe6\xff\xc3\x02\xad\x01\xe7\xff\ +\xd7\x02\xad\x01\xe8\xff\xc3\x02\xad\x01\xea\xff\xae\x02\xad\x01\ +\xeb\x00)\x02\xad\x01\xec\xff\xc3\x02\xad\x01\xed\xff\xae\x02\ +\xad\x01\xee\xff\xc3\x02\xad\x01\xf2\xff\x9a\x02\xad\x01\xf3\xff\ +\xc3\x02\xad\x01\xf4\x00)\x02\xad\x01\xf5\xff\xc3\x02\xad\x01\ +\xf7\xff\xc3\x02\xad\x01\xf9\xff\xc3\x02\xad\x02\x02\xff\xd7\x02\ +\xad\x02\x03\xff\xd7\x02\xad\x02\x04\xff\xd7\x02\xad\x02\x08\xff\ +\x9a\x02\xad\x02\x0c\xff\x9a\x02\xad\x02j\xff\xae\x02\xad\x02\ +k\xff\xc3\x02\xad\x02l\xff\xd7\x02\xad\x02q\xff\xc3\x02\ +\xad\x02r\xff\x85\x02\xad\x02s\xff\x9a\x02\xad\x02u\xff\ +\xc3\x02\xad\x02w\xff\xd7\x02\xad\x02y\xff\xc3\x02\xad\x02\ +}\xff\xc3\x02\xad\x02~\xff\xd7\x02\xad\x02\x7f\xff\xae\x02\ +\xad\x02\x84\xff\xd7\x02\xad\x02\x85\xff\xae\x02\xad\x02\x86\xff\ +\xd7\x02\xad\x02\x87\xff\xae\x02\xad\x02\x88\xff\xd7\x02\xad\x02\ +\x89\xff\xae\x02\xad\x02\x8a\xff\xd7\x02\xad\x02\x8c\xff\xd7\x02\ +\xad\x02\x8d\xff\xae\x02\xad\x02\x96\xff\xc3\x02\xad\x02\x98\x00\ +)\x02\xad\x02\x9a\xff\xc3\x02\xad\x02\x9e\xff\xc3\x02\xad\x02\ +\xa0\xff\xd7\x02\xad\x02\xa2\xff\xd7\x02\xad\x02\xa4\xff\xc3\x02\ +\xad\x02\xa6\xff\xc3\x02\xad\x02\xa8\x00)\x02\xad\x02\xa9\x00\ +)\x02\xad\x02\xac\xff\xc3\x02\xad\x02\xae\xff\xc3\x02\xad\x02\ +\xb0\xff\xc3\x02\xad\x02\xb1\xff\xd7\x02\xad\x02\xb2\xff\xae\x02\ +\xad\x02\xb3\xff\xd7\x02\xad\x02\xb4\xff\xae\x02\xad\x02\xb5\x00\ +)\x02\xad\x02\xbc\xff\xd7\x02\xad\x02\xbd\x00)\x02\xad\x02\ +\xc0\xff\x9a\x02\xad\x02\xc2\xff\x9a\x02\xad\x02\xc4\xff\xc3\x02\ +\xad\x02\xc5\xff\xd7\x02\xad\x02\xc6\xff\xc3\x02\xad\x02\xc7\xff\ +\xd7\x02\xad\x02\xc8\xff\xc3\x02\xad\x02\xcb\xff\xd7\x02\xad\x02\ +\xcd\xff\xc3\x02\xad\x02\xce\xff\xae\x02\xad\x02\xcf\xff\x9a\x02\ +\xad\x02\xd1\xff\xc3\x02\xad\x02\xd3\xff\xc3\x02\xad\x02\xd5\xff\ +\x9a\x02\xad\x02\xd7\xff\xc3\x02\xad\x02\xd9\xff\x85\x02\xad\x02\ +\xdb\xff\x85\x02\xad\x02\xdd\xff\x85\x02\xad\x02\xe0\xff\xae\x02\ +\xad\x02\xe6\xff\xd7\x02\xad\x02\xe8\xff\xd7\x02\xad\x02\xec\xff\ +\xc3\x02\xad\x02\xee\xff\xc3\x02\xad\x02\xef\xff\xd7\x02\xad\x02\ +\xf0\xff\xae\x02\xad\x02\xf1\xff\xd7\x02\xad\x02\xf2\xff\xae\x02\ +\xad\x02\xf3\xff\xd7\x02\xad\x02\xf4\xff\xae\x02\xad\x02\xf6\xff\ +\xd7\x02\xad\x02\xfe\xff\x9a\x02\xad\x03\x00\xff\xc3\x02\xad\x03\ +\x02\xff\xc3\x02\xad\x03\x06\xff\xd7\x02\xad\x03\x08\xff\xd7\x02\ +\xad\x03\x09\xff\x9a\x02\xad\x03\x0a\xff\xae\x02\xad\x03\x0b\xff\ +\x9a\x02\xad\x03\x0c\xff\xae\x02\xad\x03\x0e\xff\xd7\x02\xad\x03\ +\x10\xff\xd7\x02\xad\x03\x11\xff\xae\x02\xad\x03\x12\xff\x9a\x02\ +\xad\x03\x14\xff\xc3\x02\xad\x03\x15\xff\xd7\x02\xad\x03\x16\xff\ +\xae\x02\xad\x03\x17\x00)\x02\xad\x03\x1a\xff\xae\x02\xad\x03\ +\x1b\xff\xae\x02\xad\x03\x1c\xff\x9a\x02\xae\x00\x0f\xff\x9a\x02\ +\xae\x00\x10\xff\xd7\x02\xae\x00\x11\xff\x9a\x02\xae\x01\xce\xff\ +\xc3\x02\xae\x01\xcf\xff\xec\x02\xae\x01\xd5\xff\xc3\x02\xae\x01\ +\xd8\xff\xec\x02\xae\x01\xdb\xff\xec\x02\xae\x01\xde\xff\xec\x02\ +\xae\x01\xea\xff\xec\x02\xae\x01\xed\xff\xec\x02\xae\x01\xf2\xff\ +\xc3\x02\xae\x02\x02\xff\xd7\x02\xae\x02\x03\xff\xd7\x02\xae\x02\ +\x04\xff\xd7\x02\xae\x02\x08\xff\x9a\x02\xae\x02\x0c\xff\x9a\x02\ +\xae\x02j\xff\xec\x02\xae\x02s\xff\xc3\x02\xae\x02\x7f\xff\ +\xec\x02\xae\x02\x85\xff\xec\x02\xae\x02\x87\xff\xec\x02\xae\x02\ +\x89\xff\xec\x02\xae\x02\x8d\xff\xec\x02\xae\x02\xb2\xff\xec\x02\ +\xae\x02\xb4\xff\xec\x02\xae\x02\xcf\xff\xc3\x02\xae\x02\xe0\xff\ +\xec\x02\xae\x02\xf0\xff\xec\x02\xae\x02\xf2\xff\xec\x02\xae\x02\ +\xf4\xff\xec\x02\xae\x03\x0a\xff\xec\x02\xae\x03\x0c\xff\xec\x02\ +\xae\x03\x12\xff\xc3\x02\xae\x03\x16\xff\xec\x02\xae\x03\x1a\xff\ +\xec\x02\xae\x03\x1c\xff\xc3\x02\xaf\x00\x05\xff\x5c\x02\xaf\x00\ +\x0a\xff\x5c\x02\xaf\x01\x9d\xff\x9a\x02\xaf\x01\xa3\x00f\x02\ +\xaf\x01\xa6\xff\x9a\x02\xaf\x01\xbc\xffH\x02\xaf\x01\xc1\xff\ +\x85\x02\xaf\x01\xc4\xff\x9a\x02\xaf\x01\xdc\xff\xae\x02\xaf\x01\ +\xe1\xff\xd7\x02\xaf\x01\xe4\xff\xae\x02\xaf\x02\x07\xff\x5c\x02\ +\xaf\x02\x0b\xff\x5c\x02\xaf\x02|\xff\x85\x02\xaf\x02\x80\xff\ +q\x02\xaf\x02\x82\xffq\x02\xaf\x02\xa9\xff\x9a\x02\xaf\x02\ +\xaa\xff\xae\x02\xaf\x02\xb5\xffH\x02\xaf\x02\xb6\xff\xae\x02\ +\xaf\x02\xb7\xff\x9a\x02\xaf\x02\xb9\xff\x9a\x02\xaf\x02\xbd\xff\ +\x9a\x02\xaf\x02\xbe\xff\xae\x02\xaf\x02\xbf\xff\x85\x02\xaf\x02\ +\xc0\xff\xd7\x02\xaf\x02\xc1\xff\x85\x02\xaf\x02\xc2\xff\xd7\x02\ +\xaf\x02\xc5\xff\xc3\x02\xaf\x02\xc6\xff\xd7\x02\xaf\x02\xc7\xff\ +\xc3\x02\xaf\x02\xc8\xff\xd7\x02\xaf\x02\xd4\xff\x85\x02\xaf\x02\ +\xd5\xff\xd7\x02\xaf\x02\xfd\xff\x85\x02\xaf\x02\xfe\xff\xd7\x02\ +\xaf\x03\x0d\xffH\x02\xaf\x03\x0e\xff\xae\x02\xaf\x03\x0f\xff\ +H\x02\xaf\x03\x10\xff\xae\x02\xaf\x03\x17\xff\x9a\x02\xaf\x03\ +\x18\xff\xae\x02\xb0\x00\x05\xffq\x02\xb0\x00\x0a\xffq\x02\ +\xb0\x01\xdc\xff\x9a\x02\xb0\x01\xe1\xff\xd7\x02\xb0\x01\xe4\xff\ +\x9a\x02\xb0\x02\x07\xffq\x02\xb0\x02\x0b\xffq\x02\xb0\x02\ +m\xff\xd7\x02\xb0\x02\x81\xff\xd7\x02\xb0\x02\x83\xff\xd7\x02\ +\xb0\x02\x8b\xff\xd7\x02\xb0\x02\xaa\xff\x9a\x02\xb0\x02\xb6\xff\ +\x9a\x02\xb0\x02\xb8\xff\xd7\x02\xb0\x02\xba\xff\xd7\x02\xb0\x02\ +\xbe\xff\x9a\x02\xb0\x02\xc0\xff\xd7\x02\xb0\x02\xc2\xff\xd7\x02\ +\xb0\x02\xc6\xff\xd7\x02\xb0\x02\xc8\xff\xd7\x02\xb0\x02\xd5\xff\ +\xd7\x02\xb0\x02\xfe\xff\xd7\x02\xb0\x03\x0e\xffq\x02\xb0\x03\ +\x10\xffq\x02\xb0\x03\x18\xff\x9a\x02\xb1\x01\x9d\xff\xd7\x02\ +\xb1\x01\xa6\xff\xd7\x02\xb1\x01\xbc\xff\xc3\x02\xb1\x01\xc4\xff\ +\xd7\x02\xb1\x02\x80\xff\xec\x02\xb1\x02\x82\xff\xec\x02\xb1\x02\ +\xa9\xff\xd7\x02\xb1\x02\xb5\xff\xc3\x02\xb1\x02\xb7\xff\xec\x02\ +\xb1\x02\xb9\xff\xec\x02\xb1\x02\xbd\xff\xd7\x02\xb1\x03\x0d\xff\ +\xd7\x02\xb1\x03\x0f\xff\xd7\x02\xb1\x03\x17\xff\xd7\x02\xb2\x00\ +\x05\xff\xec\x02\xb2\x00\x0a\xff\xec\x02\xb2\x01\xd0\xff\xd7\x02\ +\xb2\x01\xdc\xff\xec\x02\xb2\x01\xdd\xff\xec\x02\xb2\x01\xdf\xff\ +\xd7\x02\xb2\x01\xe1\xff\xec\x02\xb2\x01\xe4\xff\xec\x02\xb2\x01\ +\xf6\xff\xec\x02\xb2\x02\x07\xff\xec\x02\xb2\x02\x0b\xff\xec\x02\ +\xb2\x02\xa0\xff\xd7\x02\xb2\x02\xaa\xff\xec\x02\xb2\x02\xb6\xff\ +\xec\x02\xb2\x02\xbc\xff\xd7\x02\xb2\x02\xbe\xff\xec\x02\xb2\x02\ +\xc0\xff\xec\x02\xb2\x02\xc2\xff\xec\x02\xb2\x02\xcb\xff\xd7\x02\ +\xb2\x02\xd5\xff\xec\x02\xb2\x02\xe6\xff\xd7\x02\xb2\x02\xf8\xff\ +\xec\x02\xb2\x02\xfa\xff\xec\x02\xb2\x02\xfc\xff\xec\x02\xb2\x02\ +\xfe\xff\xec\x02\xb2\x03\x06\xff\xd7\x02\xb2\x03\x08\xff\xd7\x02\ +\xb2\x03\x0e\xff\xec\x02\xb2\x03\x10\xff\xec\x02\xb2\x03\x18\xff\ +\xec\x02\xb3\x01\x9f\xff\xd7\x02\xb3\x01\xb8\xff\xd7\x02\xb3\x01\ +\xbb\xff\xd7\x02\xb3\x01\xbe\xff\xd7\x02\xb3\x01\xe1\xff\xd7\x02\ +\xb3\x02l\xff\xd7\x02\xb3\x02~\xff\xd7\x02\xb3\x02\x84\xff\ +\xd7\x02\xb3\x02\x86\xff\xd7\x02\xb3\x02\x88\xff\xd7\x02\xb3\x02\ +\x8a\xff\xd7\x02\xb3\x02\x8c\xff\xd7\x02\xb3\x02\xb1\xff\xd7\x02\ +\xb3\x02\xb3\xff\xd7\x02\xb3\x02\xc0\xff\xd7\x02\xb3\x02\xc2\xff\ +\xd7\x02\xb3\x02\xc5\xff\xd7\x02\xb3\x02\xc7\xff\xd7\x02\xb3\x02\ +\xd5\xff\xd7\x02\xb3\x02\xef\xff\xd7\x02\xb3\x02\xf1\xff\xd7\x02\ +\xb3\x02\xf3\xff\xd7\x02\xb3\x02\xfe\xff\xd7\x02\xb3\x03\x09\xff\ +\xd7\x02\xb3\x03\x0b\xff\xd7\x02\xb3\x03\x0e\xff\xd7\x02\xb3\x03\ +\x10\xff\xd7\x02\xb3\x03\x15\xff\xd7\x02\xb5\x00\x0f\xff\x85\x02\ +\xb5\x00\x10\xff\xae\x02\xb5\x00\x11\xff\x85\x02\xb5\x01\x9f\xff\ +\xd7\x02\xb5\x01\xa4\xff\x9a\x02\xb5\x01\xaa\xffq\x02\xb5\x01\ +\xae\xff\x9a\x02\xb5\x01\xb5\xff\x9a\x02\xb5\x01\xb8\xff\xd7\x02\ +\xb5\x01\xbb\xff\xd7\x02\xb5\x01\xbc\x00)\x02\xb5\x01\xbe\xff\ +\xae\x02\xb5\x01\xcc\xff\x9a\x02\xb5\x01\xcd\xff\x9a\x02\xb5\x01\ +\xce\xff\x85\x02\xb5\x01\xcf\xffq\x02\xb5\x01\xd0\xff\xd7\x02\ +\xb5\x01\xd1\xff\xd7\x02\xb5\x01\xd2\xff\x9a\x02\xb5\x01\xd3\xff\ +\x9a\x02\xb5\x01\xd4\xff\x9a\x02\xb5\x01\xd5\xff\x85\x02\xb5\x01\ +\xd6\xff\x9a\x02\xb5\x01\xd7\xff\x9a\x02\xb5\x01\xd8\xffq\x02\ +\xb5\x01\xd9\xff\x9a\x02\xb5\x01\xda\xff\x9a\x02\xb5\x01\xdb\xff\ +q\x02\xb5\x01\xdc\xff\xae\x02\xb5\x01\xdd\xff\xae\x02\xb5\x01\ +\xde\xffq\x02\xb5\x01\xdf\xff\xd7\x02\xb5\x01\xe0\xff\x9a\x02\ +\xb5\x01\xe1\xff\x9a\x02\xb5\x01\xe2\xff\x9a\x02\xb5\x01\xe3\xff\ +\x9a\x02\xb5\x01\xe4\xff\xae\x02\xb5\x01\xe5\xff\x9a\x02\xb5\x01\ +\xe6\xff\x9a\x02\xb5\x01\xe7\xff\xd7\x02\xb5\x01\xe8\xff\x9a\x02\ +\xb5\x01\xe9\xff\xc3\x02\xb5\x01\xea\xffq\x02\xb5\x01\xec\xff\ +\x9a\x02\xb5\x01\xed\xffq\x02\xb5\x01\xee\xff\x85\x02\xb5\x01\ +\xf2\xff\x85\x02\xb5\x01\xf3\xff\x9a\x02\xb5\x01\xf5\xff\x9a\x02\ +\xb5\x01\xf6\xff\xae\x02\xb5\x01\xf7\xff\x9a\x02\xb5\x01\xf9\xff\ +\x9a\x02\xb5\x02\x02\xff\xae\x02\xb5\x02\x03\xff\xae\x02\xb5\x02\ +\x04\xff\xae\x02\xb5\x02\x08\xff\x85\x02\xb5\x02\x0c\xff\x85\x02\ +\xb5\x02j\xffq\x02\xb5\x02k\xff\x9a\x02\xb5\x02l\xff\ +\xd7\x02\xb5\x02m\xff\xd7\x02\xb5\x02q\xff\x9a\x02\xb5\x02\ +r\xffq\x02\xb5\x02s\xff\x85\x02\xb5\x02u\xff\x9a\x02\ +\xb5\x02w\xff\x9a\x02\xb5\x02y\xff\x9a\x02\xb5\x02}\xff\ +\x9a\x02\xb5\x02~\xff\xd7\x02\xb5\x02\x7f\xffq\x02\xb5\x02\ +\x81\xff\xd7\x02\xb5\x02\x83\xff\xd7\x02\xb5\x02\x84\xff\xd7\x02\ +\xb5\x02\x85\xffq\x02\xb5\x02\x86\xff\xd7\x02\xb5\x02\x87\xff\ +q\x02\xb5\x02\x88\xff\xd7\x02\xb5\x02\x89\xffq\x02\xb5\x02\ +\x8a\xff\xd7\x02\xb5\x02\x8b\xff\xd7\x02\xb5\x02\x8c\xff\xd7\x02\ +\xb5\x02\x8d\xffq\x02\xb5\x02\x96\xff\x9a\x02\xb5\x02\x9a\xff\ +\x9a\x02\xb5\x02\x9e\xff\x9a\x02\xb5\x02\xa0\xff\xd7\x02\xb5\x02\ +\xa2\xff\xd7\x02\xb5\x02\xa4\xff\x9a\x02\xb5\x02\xa6\xff\x9a\x02\ +\xb5\x02\xaa\xff\xae\x02\xb5\x02\xac\xff\x9a\x02\xb5\x02\xae\xff\ +\x9a\x02\xb5\x02\xb0\xff\x9a\x02\xb5\x02\xb1\xff\xd7\x02\xb5\x02\ +\xb2\xffq\x02\xb5\x02\xb3\xff\xd7\x02\xb5\x02\xb4\xffq\x02\ +\xb5\x02\xb5\x00)\x02\xb5\x02\xb6\xff\xae\x02\xb5\x02\xb8\xff\ +\xae\x02\xb5\x02\xba\xff\xae\x02\xb5\x02\xbc\xff\xd7\x02\xb5\x02\ +\xbe\xff\xae\x02\xb5\x02\xc0\xff\x9a\x02\xb5\x02\xc2\xff\x9a\x02\ +\xb5\x02\xc4\xff\x9a\x02\xb5\x02\xc5\xff\x9a\x02\xb5\x02\xc6\xff\ +q\x02\xb5\x02\xc7\xff\x9a\x02\xb5\x02\xc8\xffq\x02\xb5\x02\ +\xcb\xff\xd7\x02\xb5\x02\xcd\xff\x9a\x02\xb5\x02\xce\xff\x9a\x02\ +\xb5\x02\xcf\xff\x85\x02\xb5\x02\xd1\xff\x9a\x02\xb5\x02\xd3\xff\ +\x9a\x02\xb5\x02\xd5\xff\x9a\x02\xb5\x02\xd7\xff\x9a\x02\xb5\x02\ +\xd9\xffq\x02\xb5\x02\xdb\xffq\x02\xb5\x02\xdd\xffq\x02\ +\xb5\x02\xe0\xffq\x02\xb5\x02\xe6\xff\xd7\x02\xb5\x02\xe8\xff\ +\xd7\x02\xb5\x02\xea\xff\xc3\x02\xb5\x02\xec\xff\x9a\x02\xb5\x02\ +\xee\xff\x9a\x02\xb5\x02\xef\xff\xd7\x02\xb5\x02\xf0\xffq\x02\ +\xb5\x02\xf1\xff\xd7\x02\xb5\x02\xf2\xffq\x02\xb5\x02\xf3\xff\ +\xd7\x02\xb5\x02\xf4\xffq\x02\xb5\x02\xf6\xff\xd7\x02\xb5\x02\ +\xf8\xff\xae\x02\xb5\x02\xfa\xff\xae\x02\xb5\x02\xfc\xff\xae\x02\ +\xb5\x02\xfe\xff\x9a\x02\xb5\x03\x00\xff\x9a\x02\xb5\x03\x02\xff\ +\x9a\x02\xb5\x03\x06\xff\xd7\x02\xb5\x03\x08\xff\xd7\x02\xb5\x03\ +\x09\xffq\x02\xb5\x03\x0a\xffq\x02\xb5\x03\x0b\xffq\x02\ +\xb5\x03\x0c\xffq\x02\xb5\x03\x0e\xff\x9a\x02\xb5\x03\x10\xff\ +\x9a\x02\xb5\x03\x11\xff\x9a\x02\xb5\x03\x12\xff\x85\x02\xb5\x03\ +\x14\xff\x9a\x02\xb5\x03\x15\xff\xd7\x02\xb5\x03\x16\xffq\x02\ +\xb5\x03\x18\xff\xae\x02\xb5\x03\x1a\xffq\x02\xb5\x03\x1b\xff\ +\x9a\x02\xb5\x03\x1c\xff\x85\x02\xb6\x00\x0f\xff\x9a\x02\xb6\x00\ +\x10\xff\xd7\x02\xb6\x00\x11\xff\x9a\x02\xb6\x01\xce\xff\xc3\x02\ +\xb6\x01\xcf\xff\xec\x02\xb6\x01\xd5\xff\xc3\x02\xb6\x01\xd8\xff\ +\xec\x02\xb6\x01\xdb\xff\xec\x02\xb6\x01\xde\xff\xec\x02\xb6\x01\ +\xea\xff\xec\x02\xb6\x01\xed\xff\xec\x02\xb6\x01\xf2\xff\xc3\x02\ +\xb6\x02\x02\xff\xd7\x02\xb6\x02\x03\xff\xd7\x02\xb6\x02\x04\xff\ +\xd7\x02\xb6\x02\x08\xff\x9a\x02\xb6\x02\x0c\xff\x9a\x02\xb6\x02\ +j\xff\xec\x02\xb6\x02s\xff\xc3\x02\xb6\x02\x7f\xff\xec\x02\ +\xb6\x02\x85\xff\xec\x02\xb6\x02\x87\xff\xec\x02\xb6\x02\x89\xff\ +\xec\x02\xb6\x02\x8d\xff\xec\x02\xb6\x02\xb2\xff\xec\x02\xb6\x02\ +\xb4\xff\xec\x02\xb6\x02\xcf\xff\xc3\x02\xb6\x02\xe0\xff\xec\x02\ +\xb6\x02\xf0\xff\xec\x02\xb6\x02\xf2\xff\xec\x02\xb6\x02\xf4\xff\ +\xec\x02\xb6\x03\x0a\xff\xec\x02\xb6\x03\x0c\xff\xec\x02\xb6\x03\ +\x12\xff\xc3\x02\xb6\x03\x16\xff\xec\x02\xb6\x03\x1a\xff\xec\x02\ +\xb6\x03\x1c\xff\xc3\x02\xb7\x00\x0f\xff\x85\x02\xb7\x00\x11\xff\ +\x85\x02\xb7\x01\x9f\xff\xd7\x02\xb7\x01\xa4\xff\xae\x02\xb7\x01\ +\xaa\xff\x85\x02\xb7\x01\xae\xff\xae\x02\xb7\x01\xb5\xff\xae\x02\ +\xb7\x01\xb8\xff\xd7\x02\xb7\x01\xbb\xff\xd7\x02\xb7\x01\xbe\xff\ +\xc3\x02\xb7\x01\xca\xff\xae\x02\xb7\x01\xcc\xff\xc3\x02\xb7\x01\ +\xcd\xff\xc3\x02\xb7\x01\xce\xff\x9a\x02\xb7\x01\xcf\xff\x9a\x02\ +\xb7\x01\xd2\xff\xc3\x02\xb7\x01\xd3\xff\xc3\x02\xb7\x01\xd4\xff\ +\xc3\x02\xb7\x01\xd5\xff\x9a\x02\xb7\x01\xd6\xff\xc3\x02\xb7\x01\ +\xd7\xff\xc3\x02\xb7\x01\xd8\xff\x9a\x02\xb7\x01\xd9\xff\xc3\x02\ +\xb7\x01\xda\xff\xc3\x02\xb7\x01\xdb\xff\x9a\x02\xb7\x01\xde\xff\ +\x9a\x02\xb7\x01\xe0\xff\xc3\x02\xb7\x01\xe1\xff\xae\x02\xb7\x01\ +\xe2\xff\xc3\x02\xb7\x01\xe3\xff\xc3\x02\xb7\x01\xe5\xff\xc3\x02\ +\xb7\x01\xe6\xff\xc3\x02\xb7\x01\xe8\xff\xc3\x02\xb7\x01\xe9\xff\ +\xd7\x02\xb7\x01\xea\xff\x9a\x02\xb7\x01\xeb\x00)\x02\xb7\x01\ +\xec\xff\xc3\x02\xb7\x01\xed\xff\x9a\x02\xb7\x01\xee\xff\xae\x02\ +\xb7\x01\xf2\xff\x9a\x02\xb7\x01\xf3\xff\xc3\x02\xb7\x01\xf4\x00\ +)\x02\xb7\x01\xf5\xff\xc3\x02\xb7\x01\xf7\xff\xc3\x02\xb7\x01\ +\xf9\xff\xc3\x02\xb7\x02\x08\xff\x85\x02\xb7\x02\x0c\xff\x85\x02\ +\xb7\x02j\xff\x9a\x02\xb7\x02k\xff\xc3\x02\xb7\x02l\xff\ +\xd7\x02\xb7\x02q\xff\xc3\x02\xb7\x02r\xff\x85\x02\xb7\x02\ +s\xff\x9a\x02\xb7\x02u\xff\xc3\x02\xb7\x02w\xff\xd7\x02\ +\xb7\x02y\xff\xc3\x02\xb7\x02}\xff\xd7\x02\xb7\x02~\xff\ +\xd7\x02\xb7\x02\x7f\xff\x9a\x02\xb7\x02\x84\xff\xd7\x02\xb7\x02\ +\x85\xff\x9a\x02\xb7\x02\x86\xff\xd7\x02\xb7\x02\x87\xff\x9a\x02\ +\xb7\x02\x88\xff\xd7\x02\xb7\x02\x89\xff\x9a\x02\xb7\x02\x8a\xff\ +\xd7\x02\xb7\x02\x8c\xff\xd7\x02\xb7\x02\x8d\xff\x9a\x02\xb7\x02\ +\x96\xff\xc3\x02\xb7\x02\x98\x00)\x02\xb7\x02\x9a\xff\xc3\x02\ +\xb7\x02\x9e\xff\xc3\x02\xb7\x02\xa4\xff\xc3\x02\xb7\x02\xa6\xff\ +\xc3\x02\xb7\x02\xa8\x00)\x02\xb7\x02\xac\xff\xc3\x02\xb7\x02\ +\xae\xff\xc3\x02\xb7\x02\xb0\xff\xc3\x02\xb7\x02\xb1\xff\xd7\x02\ +\xb7\x02\xb2\xff\x9a\x02\xb7\x02\xb3\xff\xd7\x02\xb7\x02\xb4\xff\ +\x9a\x02\xb7\x02\xc0\xff\xae\x02\xb7\x02\xc2\xff\xae\x02\xb7\x02\ +\xc4\xff\xc3\x02\xb7\x02\xc6\xff\xae\x02\xb7\x02\xc8\xff\xae\x02\ +\xb7\x02\xcd\xff\xc3\x02\xb7\x02\xce\xff\xae\x02\xb7\x02\xcf\xff\ +\x9a\x02\xb7\x02\xd1\xff\xc3\x02\xb7\x02\xd3\xff\xc3\x02\xb7\x02\ +\xd5\xff\xae\x02\xb7\x02\xd7\xff\xc3\x02\xb7\x02\xd9\xff\x85\x02\ +\xb7\x02\xda\xff\xae\x02\xb7\x02\xdb\xff\x85\x02\xb7\x02\xdc\xff\ +\xae\x02\xb7\x02\xdd\xff\x85\x02\xb7\x02\xde\xff\xae\x02\xb7\x02\ +\xe0\xff\x9a\x02\xb7\x02\xe1\xff\xec\x02\xb7\x02\xe2\xff\xae\x02\ +\xb7\x02\xe3\xff\xec\x02\xb7\x02\xe4\xff\xae\x02\xb7\x02\xec\xff\ +\xc3\x02\xb7\x02\xee\xff\xc3\x02\xb7\x02\xef\xff\xd7\x02\xb7\x02\ +\xf0\xff\x9a\x02\xb7\x02\xf1\xff\xd7\x02\xb7\x02\xf2\xff\x9a\x02\ +\xb7\x02\xf3\xff\xd7\x02\xb7\x02\xf4\xff\x9a\x02\xb7\x02\xfe\xff\ +\xae\x02\xb7\x03\x00\xff\xc3\x02\xb7\x03\x02\xff\xc3\x02\xb7\x03\ +\x09\xff\xae\x02\xb7\x03\x0a\xff\x9a\x02\xb7\x03\x0b\xff\xae\x02\ +\xb7\x03\x0c\xff\x9a\x02\xb7\x03\x0e\xff\xd7\x02\xb7\x03\x10\xff\ +\xd7\x02\xb7\x03\x11\xff\xae\x02\xb7\x03\x12\xff\x9a\x02\xb7\x03\ +\x14\xff\xc3\x02\xb7\x03\x15\xff\xd7\x02\xb7\x03\x16\xff\x9a\x02\ +\xb7\x03\x19\xff\xec\x02\xb7\x03\x1a\xff\x9a\x02\xb7\x03\x1b\xff\ +\xae\x02\xb7\x03\x1c\xff\x9a\x02\xb8\x00\x0f\xff\xae\x02\xb8\x00\ +\x11\xff\xae\x02\xb8\x01\xce\xff\xec\x02\xb8\x01\xd5\xff\xec\x02\ +\xb8\x01\xf2\xff\xec\x02\xb8\x02\x08\xff\xae\x02\xb8\x02\x0c\xff\ +\xae\x02\xb8\x02s\xff\xec\x02\xb8\x02\xcf\xff\xec\x02\xb8\x03\ +\x12\xff\xec\x02\xb8\x03\x1c\xff\xec\x02\xb9\x00\x0f\xff\x85\x02\ +\xb9\x00\x11\xff\x85\x02\xb9\x01\x9f\xff\xd7\x02\xb9\x01\xa4\xff\ +\xae\x02\xb9\x01\xaa\xff\x85\x02\xb9\x01\xae\xff\xae\x02\xb9\x01\ +\xb5\xff\xae\x02\xb9\x01\xb8\xff\xd7\x02\xb9\x01\xbb\xff\xd7\x02\ +\xb9\x01\xbe\xff\xc3\x02\xb9\x01\xca\xff\xae\x02\xb9\x01\xcc\xff\ +\xc3\x02\xb9\x01\xcd\xff\xc3\x02\xb9\x01\xce\xff\x9a\x02\xb9\x01\ +\xcf\xff\x9a\x02\xb9\x01\xd2\xff\xc3\x02\xb9\x01\xd3\xff\xc3\x02\ +\xb9\x01\xd4\xff\xc3\x02\xb9\x01\xd5\xff\x9a\x02\xb9\x01\xd6\xff\ +\xc3\x02\xb9\x01\xd7\xff\xc3\x02\xb9\x01\xd8\xff\x9a\x02\xb9\x01\ +\xd9\xff\xc3\x02\xb9\x01\xda\xff\xc3\x02\xb9\x01\xdb\xff\x9a\x02\ +\xb9\x01\xde\xff\x9a\x02\xb9\x01\xe0\xff\xc3\x02\xb9\x01\xe1\xff\ +\xae\x02\xb9\x01\xe2\xff\xc3\x02\xb9\x01\xe3\xff\xc3\x02\xb9\x01\ +\xe5\xff\xc3\x02\xb9\x01\xe6\xff\xc3\x02\xb9\x01\xe8\xff\xc3\x02\ +\xb9\x01\xe9\xff\xd7\x02\xb9\x01\xea\xff\x9a\x02\xb9\x01\xeb\x00\ +)\x02\xb9\x01\xec\xff\xc3\x02\xb9\x01\xed\xff\x9a\x02\xb9\x01\ +\xee\xff\xae\x02\xb9\x01\xf2\xff\x9a\x02\xb9\x01\xf3\xff\xc3\x02\ +\xb9\x01\xf4\x00)\x02\xb9\x01\xf5\xff\xc3\x02\xb9\x01\xf7\xff\ +\xc3\x02\xb9\x01\xf9\xff\xc3\x02\xb9\x02\x08\xff\x85\x02\xb9\x02\ +\x0c\xff\x85\x02\xb9\x02j\xff\x9a\x02\xb9\x02k\xff\xc3\x02\ +\xb9\x02l\xff\xd7\x02\xb9\x02q\xff\xc3\x02\xb9\x02r\xff\ +\x85\x02\xb9\x02s\xff\x9a\x02\xb9\x02u\xff\xc3\x02\xb9\x02\ +w\xff\xd7\x02\xb9\x02y\xff\xc3\x02\xb9\x02}\xff\xd7\x02\ +\xb9\x02~\xff\xd7\x02\xb9\x02\x7f\xff\x9a\x02\xb9\x02\x84\xff\ +\xd7\x02\xb9\x02\x85\xff\x9a\x02\xb9\x02\x86\xff\xd7\x02\xb9\x02\ +\x87\xff\x9a\x02\xb9\x02\x88\xff\xd7\x02\xb9\x02\x89\xff\x9a\x02\ +\xb9\x02\x8a\xff\xd7\x02\xb9\x02\x8c\xff\xd7\x02\xb9\x02\x8d\xff\ +\x9a\x02\xb9\x02\x96\xff\xc3\x02\xb9\x02\x98\x00)\x02\xb9\x02\ +\x9a\xff\xc3\x02\xb9\x02\x9e\xff\xc3\x02\xb9\x02\xa4\xff\xc3\x02\ +\xb9\x02\xa6\xff\xc3\x02\xb9\x02\xa8\x00)\x02\xb9\x02\xac\xff\ +\xc3\x02\xb9\x02\xae\xff\xc3\x02\xb9\x02\xb0\xff\xc3\x02\xb9\x02\ +\xb1\xff\xd7\x02\xb9\x02\xb2\xff\x9a\x02\xb9\x02\xb3\xff\xd7\x02\ +\xb9\x02\xb4\xff\x9a\x02\xb9\x02\xc0\xff\xae\x02\xb9\x02\xc2\xff\ +\xae\x02\xb9\x02\xc4\xff\xc3\x02\xb9\x02\xc6\xff\xae\x02\xb9\x02\ +\xc8\xff\xae\x02\xb9\x02\xcd\xff\xc3\x02\xb9\x02\xce\xff\xae\x02\ +\xb9\x02\xcf\xff\x9a\x02\xb9\x02\xd1\xff\xc3\x02\xb9\x02\xd3\xff\ +\xc3\x02\xb9\x02\xd5\xff\xae\x02\xb9\x02\xd7\xff\xc3\x02\xb9\x02\ +\xd9\xff\x85\x02\xb9\x02\xda\xff\xae\x02\xb9\x02\xdb\xff\x85\x02\ +\xb9\x02\xdc\xff\xae\x02\xb9\x02\xdd\xff\x85\x02\xb9\x02\xde\xff\ +\xae\x02\xb9\x02\xe0\xff\x9a\x02\xb9\x02\xe1\xff\xec\x02\xb9\x02\ +\xe2\xff\xae\x02\xb9\x02\xe3\xff\xec\x02\xb9\x02\xe4\xff\xae\x02\ +\xb9\x02\xec\xff\xc3\x02\xb9\x02\xee\xff\xc3\x02\xb9\x02\xef\xff\ +\xd7\x02\xb9\x02\xf0\xff\x9a\x02\xb9\x02\xf1\xff\xd7\x02\xb9\x02\ +\xf2\xff\x9a\x02\xb9\x02\xf3\xff\xd7\x02\xb9\x02\xf4\xff\x9a\x02\ +\xb9\x02\xfe\xff\xae\x02\xb9\x03\x00\xff\xc3\x02\xb9\x03\x02\xff\ +\xc3\x02\xb9\x03\x09\xff\xae\x02\xb9\x03\x0a\xff\x9a\x02\xb9\x03\ +\x0b\xff\xae\x02\xb9\x03\x0c\xff\x9a\x02\xb9\x03\x0e\xff\xd7\x02\ +\xb9\x03\x10\xff\xd7\x02\xb9\x03\x11\xff\xae\x02\xb9\x03\x12\xff\ +\x9a\x02\xb9\x03\x14\xff\xc3\x02\xb9\x03\x15\xff\xd7\x02\xb9\x03\ +\x16\xff\x9a\x02\xb9\x03\x19\xff\xec\x02\xb9\x03\x1a\xff\x9a\x02\ +\xb9\x03\x1b\xff\xae\x02\xb9\x03\x1c\xff\x9a\x02\xba\x00\x0f\xff\ +\xae\x02\xba\x00\x11\xff\xae\x02\xba\x01\xce\xff\xec\x02\xba\x01\ +\xd5\xff\xec\x02\xba\x01\xf2\xff\xec\x02\xba\x02\x08\xff\xae\x02\ +\xba\x02\x0c\xff\xae\x02\xba\x02s\xff\xec\x02\xba\x02\xcf\xff\ +\xec\x02\xba\x03\x12\xff\xec\x02\xba\x03\x1c\xff\xec\x02\xbb\x01\ +\x9f\xff\xd7\x02\xbb\x01\xa3\x00\xe1\x02\xbb\x01\xb8\xff\xd7\x02\ +\xbb\x01\xbb\xff\xd7\x02\xbb\x01\xbe\xff\xc3\x02\xbb\x01\xdc\xff\ +\xd7\x02\xbb\x01\xe1\xff\xae\x02\xbb\x01\xe4\xff\xd7\x02\xbb\x02\ +l\xff\xd7\x02\xbb\x02{\x00=\x02\xbb\x02}\xff\xec\x02\ +\xbb\x02~\xff\xd7\x02\xbb\x02\x84\xff\xd7\x02\xbb\x02\x86\xff\ +\xd7\x02\xbb\x02\x88\xff\xd7\x02\xbb\x02\x8a\xff\xd7\x02\xbb\x02\ +\x8c\xff\xd7\x02\xbb\x02\xaa\xff\xd7\x02\xbb\x02\xb1\xff\xd7\x02\ +\xbb\x02\xb3\xff\xd7\x02\xbb\x02\xb6\xff\xd7\x02\xbb\x02\xbe\xff\ +\xd7\x02\xbb\x02\xc0\xff\xae\x02\xbb\x02\xc2\xff\xae\x02\xbb\x02\ +\xc5\xff\xc3\x02\xbb\x02\xc6\xff\xd7\x02\xbb\x02\xc7\xff\xc3\x02\ +\xbb\x02\xc8\xff\xd7\x02\xbb\x02\xd5\xff\xae\x02\xbb\x02\xef\xff\ +\xd7\x02\xbb\x02\xf1\xff\xd7\x02\xbb\x02\xf3\xff\xd7\x02\xbb\x02\ +\xfe\xff\xae\x02\xbb\x03\x0e\xff\xd7\x02\xbb\x03\x10\xff\xd7\x02\ +\xbb\x03\x15\xff\xd7\x02\xbb\x03\x18\xff\xd7\x02\xbc\x01\xcf\xff\ +\xec\x02\xbc\x01\xd8\xff\xec\x02\xbc\x01\xdb\xff\xec\x02\xbc\x01\ +\xde\xff\xec\x02\xbc\x01\xe1\xff\xec\x02\xbc\x01\xea\xff\xec\x02\ +\xbc\x01\xed\xff\xec\x02\xbc\x02j\xff\xec\x02\xbc\x02\x7f\xff\ +\xec\x02\xbc\x02\x85\xff\xec\x02\xbc\x02\x87\xff\xec\x02\xbc\x02\ +\x89\xff\xec\x02\xbc\x02\x8d\xff\xec\x02\xbc\x02\xb2\xff\xec\x02\ +\xbc\x02\xb4\xff\xec\x02\xbc\x02\xc0\xff\xec\x02\xbc\x02\xc2\xff\ +\xec\x02\xbc\x02\xd5\xff\xec\x02\xbc\x02\xe0\xff\xec\x02\xbc\x02\ +\xf0\xff\xec\x02\xbc\x02\xf2\xff\xec\x02\xbc\x02\xf4\xff\xec\x02\ +\xbc\x02\xfe\xff\xec\x02\xbc\x03\x0a\xff\xec\x02\xbc\x03\x0c\xff\ +\xec\x02\xbc\x03\x0e\xff\xd7\x02\xbc\x03\x10\xff\xd7\x02\xbc\x03\ +\x16\xff\xec\x02\xbc\x03\x1a\xff\xec\x02\xbd\x01\xa3\x00\xe1\x02\ +\xbd\x02\xea\x00)\x02\xbd\x03\x0e\xff\xd7\x02\xbd\x03\x10\xff\ +\xd7\x02\xbe\x00\x05\xff\xec\x02\xbe\x00\x0a\xff\xec\x02\xbe\x02\ +\x07\xff\xec\x02\xbe\x02\x0b\xff\xec\x02\xbf\x01\xa3\x00\xe1\x02\ +\xbf\x02\xea\x00)\x02\xbf\x03\x0e\xff\xd7\x02\xbf\x03\x10\xff\ +\xd7\x02\xc0\x00\x05\xff\xec\x02\xc0\x00\x0a\xff\xec\x02\xc0\x02\ +\x07\xff\xec\x02\xc0\x02\x0b\xff\xec\x02\xc3\x00\x05\xff\xc3\x02\ +\xc3\x00\x0a\xff\xc3\x02\xc3\x01\x9d\xff\xd7\x02\xc3\x01\xa6\xff\ +\xd7\x02\xc3\x01\xbc\xff\x85\x02\xc3\x01\xc1\xff\xae\x02\xc3\x01\ +\xc4\xff\xd7\x02\xc3\x01\xdc\xff\xd7\x02\xc3\x01\xdd\xff\xec\x02\ +\xc3\x01\xe1\xff\xec\x02\xc3\x01\xe4\xff\xd7\x02\xc3\x01\xf6\xff\ +\xec\x02\xc3\x02\x07\xff\xc3\x02\xc3\x02\x0b\xff\xc3\x02\xc3\x02\ +|\xff\xae\x02\xc3\x02\x80\xff\xc3\x02\xc3\x02\x82\xff\xc3\x02\ +\xc3\x02\xa9\xff\xd7\x02\xc3\x02\xaa\xff\xd7\x02\xc3\x02\xb5\xff\ +\x85\x02\xc3\x02\xb6\xff\xd7\x02\xc3\x02\xb7\xff\x9a\x02\xc3\x02\ +\xb9\xff\x9a\x02\xc3\x02\xbd\xff\xd7\x02\xc3\x02\xbe\xff\xd7\x02\ +\xc3\x02\xbf\xff\xae\x02\xc3\x02\xc0\xff\xec\x02\xc3\x02\xc1\xff\ +\xae\x02\xc3\x02\xc2\xff\xec\x02\xc3\x02\xd4\xff\xae\x02\xc3\x02\ +\xd5\xff\xec\x02\xc3\x02\xf8\xff\xec\x02\xc3\x02\xfa\xff\xec\x02\ +\xc3\x02\xfc\xff\xec\x02\xc3\x02\xfd\xff\xae\x02\xc3\x02\xfe\xff\ +\xec\x02\xc3\x03\x0d\xff\xae\x02\xc3\x03\x0e\xff\xd7\x02\xc3\x03\ +\x0f\xff\xae\x02\xc3\x03\x10\xff\xd7\x02\xc3\x03\x17\xff\xd7\x02\ +\xc3\x03\x18\xff\xd7\x02\xc4\x00\x05\xff\x9a\x02\xc4\x00\x0a\xff\ +\x9a\x02\xc4\x01\xdc\xff\xd7\x02\xc4\x01\xdd\xff\xd7\x02\xc4\x01\ +\xe4\xff\xd7\x02\xc4\x01\xf6\xff\xd7\x02\xc4\x02\x07\xff\x9a\x02\ +\xc4\x02\x0b\xff\x9a\x02\xc4\x02\xaa\xff\xd7\x02\xc4\x02\xb6\xff\ +\xd7\x02\xc4\x02\xb8\xff\xd7\x02\xc4\x02\xba\xff\xd7\x02\xc4\x02\ +\xbe\xff\xd7\x02\xc4\x02\xf8\xff\xd7\x02\xc4\x02\xfa\xff\xd7\x02\ +\xc4\x02\xfc\xff\xd7\x02\xc4\x03\x0e\xff\xae\x02\xc4\x03\x10\xff\ +\xae\x02\xc4\x03\x18\xff\xd7\x02\xc5\x01\xbc\xff\xd7\x02\xc5\x02\ +\x80\xff\xec\x02\xc5\x02\x82\xff\xec\x02\xc5\x02\xb5\xff\xd7\x02\ +\xc5\x02\xb7\xff\xec\x02\xc5\x02\xb9\xff\xec\x02\xc5\x03\x0d\xff\ +\xec\x02\xc5\x03\x0f\xff\xec\x02\xc6\x00\x05\xff\xec\x02\xc6\x00\ +\x0a\xff\xec\x02\xc6\x02\x07\xff\xec\x02\xc6\x02\x0b\xff\xec\x02\ +\xc7\x01\xbc\xff\xd7\x02\xc7\x02\x80\xff\xec\x02\xc7\x02\x82\xff\ +\xec\x02\xc7\x02\xb5\xff\xd7\x02\xc7\x02\xb7\xff\xec\x02\xc7\x02\ +\xb9\xff\xec\x02\xc7\x03\x0d\xff\xec\x02\xc7\x03\x0f\xff\xec\x02\ +\xc8\x00\x05\xff\xec\x02\xc8\x00\x0a\xff\xec\x02\xc8\x02\x07\xff\ +\xec\x02\xc8\x02\x0b\xff\xec\x02\xca\x01\x9f\xff\xd7\x02\xca\x01\ +\xb8\xff\xd7\x02\xca\x01\xbb\xff\xd7\x02\xca\x01\xbe\xff\xd7\x02\ +\xca\x01\xc1\xff\xd7\x02\xca\x01\xe1\xff\xd7\x02\xca\x02l\xff\ +\xd7\x02\xca\x02|\xff\xd7\x02\xca\x02~\xff\xd7\x02\xca\x02\ +\x84\xff\xd7\x02\xca\x02\x86\xff\xd7\x02\xca\x02\x88\xff\xd7\x02\ +\xca\x02\x8a\xff\xd7\x02\xca\x02\x8c\xff\xd7\x02\xca\x02\xb1\xff\ +\xd7\x02\xca\x02\xb3\xff\xd7\x02\xca\x02\xbf\xff\xd7\x02\xca\x02\ +\xc0\xff\xd7\x02\xca\x02\xc1\xff\xd7\x02\xca\x02\xc2\xff\xd7\x02\ +\xca\x02\xc5\xff\x9a\x02\xca\x02\xc7\xff\x9a\x02\xca\x02\xd4\xff\ +\xd7\x02\xca\x02\xd5\xff\xd7\x02\xca\x02\xef\xff\xd7\x02\xca\x02\ +\xf1\xff\xd7\x02\xca\x02\xf3\xff\xd7\x02\xca\x02\xfd\xff\xd7\x02\ +\xca\x02\xfe\xff\xd7\x02\xca\x03\x09\xff\xd7\x02\xca\x03\x0b\xff\ +\xd7\x02\xca\x03\x0e\xff\xd7\x02\xca\x03\x10\xff\xd7\x02\xca\x03\ +\x15\xff\xd7\x02\xca\x03\x19\xff\xec\x02\xcb\x01\xcf\xff\xd7\x02\ +\xcb\x01\xd8\xff\xd7\x02\xcb\x01\xdb\xff\xd7\x02\xcb\x01\xde\xff\ +\xd7\x02\xcb\x01\xe1\xff\xd7\x02\xcb\x01\xea\xff\xd7\x02\xcb\x01\ +\xed\xff\xd7\x02\xcb\x02j\xff\xd7\x02\xcb\x02\x7f\xff\xd7\x02\ +\xcb\x02\x85\xff\xd7\x02\xcb\x02\x87\xff\xd7\x02\xcb\x02\x89\xff\ +\xd7\x02\xcb\x02\x8d\xff\xd7\x02\xcb\x02\xb2\xff\xd7\x02\xcb\x02\ +\xb4\xff\xd7\x02\xcb\x02\xc0\xff\xd7\x02\xcb\x02\xc2\xff\xd7\x02\ +\xcb\x02\xc6\xff\xd7\x02\xcb\x02\xc8\xff\xd7\x02\xcb\x02\xd5\xff\ +\xd7\x02\xcb\x02\xe0\xff\xd7\x02\xcb\x02\xf0\xff\xd7\x02\xcb\x02\ +\xf2\xff\xd7\x02\xcb\x02\xf4\xff\xd7\x02\xcb\x02\xfe\xff\xd7\x02\ +\xcb\x03\x0a\xff\xd7\x02\xcb\x03\x0c\xff\xd7\x02\xcb\x03\x16\xff\ +\xd7\x02\xcb\x03\x1a\xff\xd7\x02\xcc\x00\x05\xff\xc3\x02\xcc\x00\ +\x0a\xff\xc3\x02\xcc\x01\xa3\x00f\x02\xcc\x01\xbc\xff\xd7\x02\ +\xcc\x01\xbe\xff\xd7\x02\xcc\x01\xc1\xff\xae\x02\xcc\x01\xdc\xff\ +\xc3\x02\xcc\x01\xe1\xff\xd7\x02\xcc\x01\xe4\xff\xc3\x02\xcc\x02\ +\x07\xff\xc3\x02\xcc\x02\x0b\xff\xc3\x02\xcc\x02m\xff\xec\x02\ +\xcc\x02|\xff\xae\x02\xcc\x02\x80\xff\xd7\x02\xcc\x02\x81\xff\ +\xec\x02\xcc\x02\x82\xff\xd7\x02\xcc\x02\x83\xff\xec\x02\xcc\x02\ +\x8b\xff\xec\x02\xcc\x02\xaa\xff\xc3\x02\xcc\x02\xb5\xff\xd7\x02\ +\xcc\x02\xb6\xff\xc3\x02\xcc\x02\xb7\xff\xd7\x02\xcc\x02\xb8\xff\ +\xec\x02\xcc\x02\xb9\xff\xd7\x02\xcc\x02\xba\xff\xec\x02\xcc\x02\ +\xbe\xff\xc3\x02\xcc\x02\xbf\xff\xae\x02\xcc\x02\xc0\xff\xd7\x02\ +\xcc\x02\xc1\xff\xae\x02\xcc\x02\xc2\xff\xd7\x02\xcc\x02\xc5\xff\ +\xc3\x02\xcc\x02\xc6\xff\xd7\x02\xcc\x02\xc7\xff\xc3\x02\xcc\x02\ +\xc8\xff\xd7\x02\xcc\x02\xd4\xff\xae\x02\xcc\x02\xd5\xff\xd7\x02\ +\xcc\x02\xfd\xff\xae\x02\xcc\x02\xfe\xff\xd7\x02\xcc\x03\x0d\xff\ +\xd7\x02\xcc\x03\x0e\xff\xc3\x02\xcc\x03\x0f\xff\xd7\x02\xcc\x03\ +\x10\xff\xc3\x02\xcc\x03\x18\xff\xc3\x02\xcd\x01\xe1\xff\xd7\x02\ +\xcd\x02\xc0\xff\xd7\x02\xcd\x02\xc2\xff\xd7\x02\xcd\x02\xd5\xff\ +\xd7\x02\xcd\x02\xfe\xff\xd7\x02\xce\x01\xa3\x00\xe1\x02\xce\x02\ +\xea\x00)\x02\xce\x03\x0e\xff\xd7\x02\xce\x03\x10\xff\xd7\x02\ +\xcf\x00\x05\xff\xec\x02\xcf\x00\x0a\xff\xec\x02\xcf\x02\x07\xff\ +\xec\x02\xcf\x02\x0b\xff\xec\x02\xd2\x01\xa3\x00\xe1\x02\xd2\x02\ +\xea\x00)\x02\xd2\x03\x0e\xff\xd7\x02\xd2\x03\x10\xff\xd7\x02\ +\xd3\x00\x05\xff\xec\x02\xd3\x00\x0a\xff\xec\x02\xd3\x02\x07\xff\ +\xec\x02\xd3\x02\x0b\xff\xec\x02\xd6\x01\xa3\x00\xe1\x02\xd6\x02\ +\xea\x00)\x02\xd6\x03\x0e\xff\xd7\x02\xd6\x03\x10\xff\xd7\x02\ +\xd7\x00\x05\xff\xec\x02\xd7\x00\x0a\xff\xec\x02\xd7\x02\x07\xff\ +\xec\x02\xd7\x02\x0b\xff\xec\x02\xd9\x00\x05\xffq\x02\xd9\x00\ +\x0a\xffq\x02\xd9\x01\x9d\xff\x9a\x02\xd9\x01\xa6\xff\x9a\x02\ +\xd9\x01\xbc\xffq\x02\xd9\x01\xbe\xff\xd7\x02\xd9\x01\xc1\xff\ +\x9a\x02\xd9\x01\xc4\xff\x9a\x02\xd9\x01\xdc\xff\xd7\x02\xd9\x01\ +\xe1\xff\xd7\x02\xd9\x01\xe4\xff\xd7\x02\xd9\x02\x07\xffq\x02\ +\xd9\x02\x0b\xffq\x02\xd9\x02n\xff\xd7\x02\xd9\x02|\xff\ +\x9a\x02\xd9\x02\x80\xff\xae\x02\xd9\x02\x82\xff\xae\x02\xd9\x02\ +\x97\xff\xd7\x02\xd9\x02\x9b\xff\xd7\x02\xd9\x02\xa7\xff\xd7\x02\ +\xd9\x02\xa9\xff\x9a\x02\xd9\x02\xaa\xff\xd7\x02\xd9\x02\xb5\xff\ +q\x02\xd9\x02\xb6\xff\xd7\x02\xd9\x02\xb7\xff\x85\x02\xd9\x02\ +\xb9\xff\x85\x02\xd9\x02\xbd\xff\x9a\x02\xd9\x02\xbe\xff\xd7\x02\ +\xd9\x02\xbf\xff\x9a\x02\xd9\x02\xc0\xff\xd7\x02\xd9\x02\xc1\xff\ +\x9a\x02\xd9\x02\xc2\xff\xd7\x02\xd9\x02\xc5\xff\x9a\x02\xd9\x02\ +\xc7\xff\x9a\x02\xd9\x02\xd4\xff\x9a\x02\xd9\x02\xd5\xff\xd7\x02\ +\xd9\x02\xe1\xff\xd7\x02\xd9\x02\xe3\xff\xd7\x02\xd9\x02\xfd\xff\ +\x9a\x02\xd9\x02\xfe\xff\xd7\x02\xd9\x03\x03\xff\xd7\x02\xd9\x03\ +\x0d\xffq\x02\xd9\x03\x0e\xff\xd7\x02\xd9\x03\x0f\xffq\x02\ +\xd9\x03\x10\xff\xd7\x02\xd9\x03\x17\xff\x9a\x02\xd9\x03\x18\xff\ +\xd7\x02\xda\x00\x05\xff\xec\x02\xda\x00\x0a\xff\xec\x02\xda\x02\ +\x07\xff\xec\x02\xda\x02\x0b\xff\xec\x02\xdb\x00\x05\xffq\x02\ +\xdb\x00\x0a\xffq\x02\xdb\x01\x9d\xff\x9a\x02\xdb\x01\xa6\xff\ +\x9a\x02\xdb\x01\xbc\xffq\x02\xdb\x01\xbe\xff\xd7\x02\xdb\x01\ +\xc1\xff\x9a\x02\xdb\x01\xc4\xff\x9a\x02\xdb\x01\xdc\xff\xd7\x02\ +\xdb\x01\xe1\xff\xd7\x02\xdb\x01\xe4\xff\xd7\x02\xdb\x02\x07\xff\ +q\x02\xdb\x02\x0b\xffq\x02\xdb\x02n\xff\xd7\x02\xdb\x02\ +|\xff\x9a\x02\xdb\x02\x80\xff\xae\x02\xdb\x02\x82\xff\xae\x02\ +\xdb\x02\x97\xff\xd7\x02\xdb\x02\x9b\xff\xd7\x02\xdb\x02\xa7\xff\ +\xd7\x02\xdb\x02\xa9\xff\x9a\x02\xdb\x02\xaa\xff\xd7\x02\xdb\x02\ +\xb5\xffq\x02\xdb\x02\xb6\xff\xd7\x02\xdb\x02\xb7\xff\x85\x02\ +\xdb\x02\xb9\xff\x85\x02\xdb\x02\xbd\xff\x9a\x02\xdb\x02\xbe\xff\ +\xd7\x02\xdb\x02\xbf\xff\x9a\x02\xdb\x02\xc0\xff\xd7\x02\xdb\x02\ +\xc1\xff\x9a\x02\xdb\x02\xc2\xff\xd7\x02\xdb\x02\xc5\xff\x9a\x02\ +\xdb\x02\xc7\xff\x9a\x02\xdb\x02\xd4\xff\x9a\x02\xdb\x02\xd5\xff\ +\xd7\x02\xdb\x02\xe1\xff\xd7\x02\xdb\x02\xe3\xff\xd7\x02\xdb\x02\ +\xfd\xff\x9a\x02\xdb\x02\xfe\xff\xd7\x02\xdb\x03\x03\xff\xd7\x02\ +\xdb\x03\x0d\xffq\x02\xdb\x03\x0e\xff\xd7\x02\xdb\x03\x0f\xff\ +q\x02\xdb\x03\x10\xff\xd7\x02\xdb\x03\x17\xff\x9a\x02\xdb\x03\ +\x18\xff\xd7\x02\xdc\x00\x05\xff\xec\x02\xdc\x00\x0a\xff\xec\x02\ +\xdc\x02\x07\xff\xec\x02\xdc\x02\x0b\xff\xec\x02\xde\x00\x05\xff\ +\xec\x02\xde\x00\x0a\xff\xec\x02\xde\x02\x07\xff\xec\x02\xde\x02\ +\x0b\xff\xec\x02\xe0\x00\x05\xff\xec\x02\xe0\x00\x0a\xff\xec\x02\ +\xe0\x02\x07\xff\xec\x02\xe0\x02\x0b\xff\xec\x02\xe1\x00\x0f\xff\ +\xae\x02\xe1\x00\x11\xff\xae\x02\xe1\x01\x9d\xff\xec\x02\xe1\x01\ +\xa4\xff\xd7\x02\xe1\x01\xa6\xff\xec\x02\xe1\x01\xa8\xff\xd7\x02\ +\xe1\x01\xaa\xff\xd7\x02\xe1\x01\xae\xff\xd7\x02\xe1\x01\xb0\xff\ +\xd7\x02\xe1\x01\xb1\xff\xec\x02\xe1\x01\xb5\xff\xd7\x02\xe1\x01\ +\xbc\xff\xc3\x02\xe1\x01\xbd\xff\xd7\x02\xe1\x01\xbf\xff\xd7\x02\ +\xe1\x01\xc1\xff\xd7\x02\xe1\x01\xc4\xff\xec\x02\xe1\x01\xc7\xff\ +\xec\x02\xe1\x01\xce\xff\xec\x02\xe1\x01\xd5\xff\xec\x02\xe1\x01\ +\xf2\xff\xec\x02\xe1\x02\x08\xff\xae\x02\xe1\x02\x0c\xff\xae\x02\ +\xe1\x02r\xff\xd7\x02\xe1\x02s\xff\xec\x02\xe1\x02z\xff\ +\xec\x02\xe1\x02|\xff\xd7\x02\xe1\x02\x80\xff\xec\x02\xe1\x02\ +\x82\xff\xec\x02\xe1\x02\x9f\xff\xd7\x02\xe1\x02\xa1\xff\xec\x02\ +\xe1\x02\xa9\xff\xec\x02\xe1\x02\xb5\xff\xc3\x02\xe1\x02\xb7\xff\ +\xec\x02\xe1\x02\xb9\xff\xec\x02\xe1\x02\xbb\xff\xd7\x02\xe1\x02\ +\xbd\xff\xec\x02\xe1\x02\xbf\xff\xd7\x02\xe1\x02\xc1\xff\xd7\x02\ +\xe1\x02\xca\xff\xd7\x02\xe1\x02\xce\xff\xd7\x02\xe1\x02\xcf\xff\ +\xec\x02\xe1\x02\xd4\xff\xd7\x02\xe1\x02\xd9\xff\xd7\x02\xe1\x02\ +\xdb\xff\xd7\x02\xe1\x02\xdd\xff\xd7\x02\xe1\x02\xe5\xff\xd7\x02\ +\xe1\x02\xe7\xff\xec\x02\xe1\x02\xf5\xff\xec\x02\xe1\x02\xf7\xff\ +\xd7\x02\xe1\x02\xf9\xff\xd7\x02\xe1\x02\xfb\xff\xd7\x02\xe1\x02\ +\xfd\xff\xd7\x02\xe1\x03\x05\xff\xd7\x02\xe1\x03\x07\xff\xd7\x02\ +\xe1\x03\x0d\xff\xd7\x02\xe1\x03\x0f\xff\xd7\x02\xe1\x03\x11\xff\ +\xd7\x02\xe1\x03\x12\xff\xec\x02\xe1\x03\x17\xff\xec\x02\xe1\x03\ +\x1b\xff\xd7\x02\xe1\x03\x1c\xff\xec\x02\xe2\x00\x05\xff\xec\x02\ +\xe2\x00\x0a\xff\xec\x02\xe2\x01\xd0\xff\xd7\x02\xe2\x01\xdc\xff\ +\xec\x02\xe2\x01\xdd\xff\xec\x02\xe2\x01\xdf\xff\xd7\x02\xe2\x01\ +\xe1\xff\xec\x02\xe2\x01\xe4\xff\xec\x02\xe2\x01\xf6\xff\xec\x02\ +\xe2\x02\x07\xff\xec\x02\xe2\x02\x0b\xff\xec\x02\xe2\x02\xa0\xff\ +\xd7\x02\xe2\x02\xaa\xff\xec\x02\xe2\x02\xb6\xff\xec\x02\xe2\x02\ +\xbc\xff\xd7\x02\xe2\x02\xbe\xff\xec\x02\xe2\x02\xc0\xff\xec\x02\ +\xe2\x02\xc2\xff\xec\x02\xe2\x02\xcb\xff\xd7\x02\xe2\x02\xd5\xff\ +\xec\x02\xe2\x02\xe6\xff\xd7\x02\xe2\x02\xf8\xff\xec\x02\xe2\x02\ +\xfa\xff\xec\x02\xe2\x02\xfc\xff\xec\x02\xe2\x02\xfe\xff\xec\x02\ +\xe2\x03\x06\xff\xd7\x02\xe2\x03\x08\xff\xd7\x02\xe2\x03\x0e\xff\ +\xec\x02\xe2\x03\x10\xff\xec\x02\xe2\x03\x18\xff\xec\x02\xe3\x00\ +\x0f\xff\xae\x02\xe3\x00\x11\xff\xae\x02\xe3\x01\x9d\xff\xec\x02\ +\xe3\x01\xa4\xff\xd7\x02\xe3\x01\xa6\xff\xec\x02\xe3\x01\xa8\xff\ +\xd7\x02\xe3\x01\xaa\xff\xd7\x02\xe3\x01\xae\xff\xd7\x02\xe3\x01\ +\xb0\xff\xd7\x02\xe3\x01\xb1\xff\xec\x02\xe3\x01\xb5\xff\xd7\x02\ +\xe3\x01\xbc\xff\xc3\x02\xe3\x01\xbd\xff\xd7\x02\xe3\x01\xbf\xff\ +\xd7\x02\xe3\x01\xc1\xff\xd7\x02\xe3\x01\xc4\xff\xec\x02\xe3\x01\ +\xc7\xff\xec\x02\xe3\x01\xce\xff\xec\x02\xe3\x01\xd5\xff\xec\x02\ +\xe3\x01\xf2\xff\xec\x02\xe3\x02\x08\xff\xae\x02\xe3\x02\x0c\xff\ +\xae\x02\xe3\x02r\xff\xd7\x02\xe3\x02s\xff\xec\x02\xe3\x02\ +z\xff\xec\x02\xe3\x02|\xff\xd7\x02\xe3\x02\x80\xff\xec\x02\ +\xe3\x02\x82\xff\xec\x02\xe3\x02\x9f\xff\xd7\x02\xe3\x02\xa1\xff\ +\xec\x02\xe3\x02\xa9\xff\xec\x02\xe3\x02\xb5\xff\xc3\x02\xe3\x02\ +\xb7\xff\xec\x02\xe3\x02\xb9\xff\xec\x02\xe3\x02\xbb\xff\xd7\x02\ +\xe3\x02\xbd\xff\xec\x02\xe3\x02\xbf\xff\xd7\x02\xe3\x02\xc1\xff\ +\xd7\x02\xe3\x02\xca\xff\xd7\x02\xe3\x02\xce\xff\xd7\x02\xe3\x02\ +\xcf\xff\xec\x02\xe3\x02\xd4\xff\xd7\x02\xe3\x02\xd9\xff\xd7\x02\ +\xe3\x02\xdb\xff\xd7\x02\xe3\x02\xdd\xff\xd7\x02\xe3\x02\xe5\xff\ +\xd7\x02\xe3\x02\xe7\xff\xec\x02\xe3\x02\xf5\xff\xec\x02\xe3\x02\ +\xf7\xff\xd7\x02\xe3\x02\xf9\xff\xd7\x02\xe3\x02\xfb\xff\xd7\x02\ +\xe3\x02\xfd\xff\xd7\x02\xe3\x03\x05\xff\xd7\x02\xe3\x03\x07\xff\ +\xd7\x02\xe3\x03\x0d\xff\xd7\x02\xe3\x03\x0f\xff\xd7\x02\xe3\x03\ +\x11\xff\xd7\x02\xe3\x03\x12\xff\xec\x02\xe3\x03\x17\xff\xec\x02\ +\xe3\x03\x1b\xff\xd7\x02\xe3\x03\x1c\xff\xec\x02\xe4\x00\x05\xff\ +\xec\x02\xe4\x00\x0a\xff\xec\x02\xe4\x01\xd0\xff\xd7\x02\xe4\x01\ +\xdc\xff\xec\x02\xe4\x01\xdd\xff\xec\x02\xe4\x01\xdf\xff\xd7\x02\ +\xe4\x01\xe1\xff\xec\x02\xe4\x01\xe4\xff\xec\x02\xe4\x01\xf6\xff\ +\xec\x02\xe4\x02\x07\xff\xec\x02\xe4\x02\x0b\xff\xec\x02\xe4\x02\ +\xa0\xff\xd7\x02\xe4\x02\xaa\xff\xec\x02\xe4\x02\xb6\xff\xec\x02\ +\xe4\x02\xbc\xff\xd7\x02\xe4\x02\xbe\xff\xec\x02\xe4\x02\xc0\xff\ +\xec\x02\xe4\x02\xc2\xff\xec\x02\xe4\x02\xcb\xff\xd7\x02\xe4\x02\ +\xd5\xff\xec\x02\xe4\x02\xe6\xff\xd7\x02\xe4\x02\xf8\xff\xec\x02\ +\xe4\x02\xfa\xff\xec\x02\xe4\x02\xfc\xff\xec\x02\xe4\x02\xfe\xff\ +\xec\x02\xe4\x03\x06\xff\xd7\x02\xe4\x03\x08\xff\xd7\x02\xe4\x03\ +\x0e\xff\xec\x02\xe4\x03\x10\xff\xec\x02\xe4\x03\x18\xff\xec\x02\ +\xe5\x01\x9f\xff\xd7\x02\xe5\x01\xb8\xff\xd7\x02\xe5\x01\xbb\xff\ +\xd7\x02\xe5\x01\xbe\xff\xd7\x02\xe5\x01\xc1\xff\xd7\x02\xe5\x01\ +\xe1\xff\xd7\x02\xe5\x02l\xff\xd7\x02\xe5\x02|\xff\xd7\x02\ +\xe5\x02~\xff\xd7\x02\xe5\x02\x84\xff\xd7\x02\xe5\x02\x86\xff\ +\xd7\x02\xe5\x02\x88\xff\xd7\x02\xe5\x02\x8a\xff\xd7\x02\xe5\x02\ +\x8c\xff\xd7\x02\xe5\x02\xb1\xff\xd7\x02\xe5\x02\xb3\xff\xd7\x02\ +\xe5\x02\xbf\xff\xd7\x02\xe5\x02\xc0\xff\xd7\x02\xe5\x02\xc1\xff\ +\xd7\x02\xe5\x02\xc2\xff\xd7\x02\xe5\x02\xc5\xff\x9a\x02\xe5\x02\ +\xc7\xff\x9a\x02\xe5\x02\xd4\xff\xd7\x02\xe5\x02\xd5\xff\xd7\x02\ +\xe5\x02\xef\xff\xd7\x02\xe5\x02\xf1\xff\xd7\x02\xe5\x02\xf3\xff\ +\xd7\x02\xe5\x02\xfd\xff\xd7\x02\xe5\x02\xfe\xff\xd7\x02\xe5\x03\ +\x09\xff\xd7\x02\xe5\x03\x0b\xff\xd7\x02\xe5\x03\x0e\xff\xd7\x02\ +\xe5\x03\x10\xff\xd7\x02\xe5\x03\x15\xff\xd7\x02\xe5\x03\x19\xff\ +\xec\x02\xe6\x01\xcf\xff\xd7\x02\xe6\x01\xd8\xff\xd7\x02\xe6\x01\ +\xdb\xff\xd7\x02\xe6\x01\xde\xff\xd7\x02\xe6\x01\xe1\xff\xd7\x02\ +\xe6\x01\xea\xff\xd7\x02\xe6\x01\xed\xff\xd7\x02\xe6\x02j\xff\ +\xd7\x02\xe6\x02\x7f\xff\xd7\x02\xe6\x02\x85\xff\xd7\x02\xe6\x02\ +\x87\xff\xd7\x02\xe6\x02\x89\xff\xd7\x02\xe6\x02\x8d\xff\xd7\x02\ +\xe6\x02\xb2\xff\xd7\x02\xe6\x02\xb4\xff\xd7\x02\xe6\x02\xc0\xff\ +\xd7\x02\xe6\x02\xc2\xff\xd7\x02\xe6\x02\xc6\xff\xd7\x02\xe6\x02\ +\xc8\xff\xd7\x02\xe6\x02\xd5\xff\xd7\x02\xe6\x02\xe0\xff\xd7\x02\ +\xe6\x02\xf0\xff\xd7\x02\xe6\x02\xf2\xff\xd7\x02\xe6\x02\xf4\xff\ +\xd7\x02\xe6\x02\xfe\xff\xd7\x02\xe6\x03\x0a\xff\xd7\x02\xe6\x03\ +\x0c\xff\xd7\x02\xe6\x03\x16\xff\xd7\x02\xe6\x03\x1a\xff\xd7\x02\ +\xe7\x00\x0f\xff\xae\x02\xe7\x00\x11\xff\xae\x02\xe7\x02\x08\xff\ +\xae\x02\xe7\x02\x0c\xff\xae\x02\xe7\x02\x80\xff\xec\x02\xe7\x02\ +\x82\xff\xec\x02\xe7\x02\xb7\xff\xec\x02\xe7\x02\xb9\xff\xec\x02\ +\xe7\x03\x0d\xff\xd7\x02\xe7\x03\x0f\xff\xd7\x02\xe8\x01\xe9\x00\ +)\x02\xe9\x00\x05\xff\xec\x02\xe9\x00\x0a\xff\xec\x02\xe9\x02\ +\x07\xff\xec\x02\xe9\x02\x0b\xff\xec\x02\xe9\x03\x0e\xff\xd7\x02\ +\xe9\x03\x10\xff\xd7\x02\xef\x00\x0f\xff\xae\x02\xef\x00\x11\xff\ +\xae\x02\xef\x01\x9d\xff\xec\x02\xef\x01\xa4\xff\xd7\x02\xef\x01\ +\xa6\xff\xec\x02\xef\x01\xa8\xff\xd7\x02\xef\x01\xaa\xff\xd7\x02\ +\xef\x01\xae\xff\xd7\x02\xef\x01\xb0\xff\xd7\x02\xef\x01\xb1\xff\ +\xec\x02\xef\x01\xb5\xff\xd7\x02\xef\x01\xbc\xff\xc3\x02\xef\x01\ +\xbd\xff\xd7\x02\xef\x01\xbf\xff\xd7\x02\xef\x01\xc1\xff\xd7\x02\ +\xef\x01\xc4\xff\xec\x02\xef\x01\xc7\xff\xec\x02\xef\x01\xce\xff\ +\xec\x02\xef\x01\xd5\xff\xec\x02\xef\x01\xf2\xff\xec\x02\xef\x02\ +\x08\xff\xae\x02\xef\x02\x0c\xff\xae\x02\xef\x02r\xff\xd7\x02\ +\xef\x02s\xff\xec\x02\xef\x02z\xff\xec\x02\xef\x02|\xff\ +\xd7\x02\xef\x02\x80\xff\xec\x02\xef\x02\x82\xff\xec\x02\xef\x02\ +\x9f\xff\xd7\x02\xef\x02\xa1\xff\xec\x02\xef\x02\xa9\xff\xec\x02\ +\xef\x02\xb5\xff\xc3\x02\xef\x02\xb7\xff\xec\x02\xef\x02\xb9\xff\ +\xec\x02\xef\x02\xbb\xff\xd7\x02\xef\x02\xbd\xff\xec\x02\xef\x02\ +\xbf\xff\xd7\x02\xef\x02\xc1\xff\xd7\x02\xef\x02\xca\xff\xd7\x02\ +\xef\x02\xce\xff\xd7\x02\xef\x02\xcf\xff\xec\x02\xef\x02\xd4\xff\ +\xd7\x02\xef\x02\xd9\xff\xd7\x02\xef\x02\xdb\xff\xd7\x02\xef\x02\ +\xdd\xff\xd7\x02\xef\x02\xe5\xff\xd7\x02\xef\x02\xe7\xff\xec\x02\ +\xef\x02\xf5\xff\xec\x02\xef\x02\xf7\xff\xd7\x02\xef\x02\xf9\xff\ +\xd7\x02\xef\x02\xfb\xff\xd7\x02\xef\x02\xfd\xff\xd7\x02\xef\x03\ +\x05\xff\xd7\x02\xef\x03\x07\xff\xd7\x02\xef\x03\x0d\xff\xd7\x02\ +\xef\x03\x0f\xff\xd7\x02\xef\x03\x11\xff\xd7\x02\xef\x03\x12\xff\ +\xec\x02\xef\x03\x17\xff\xec\x02\xef\x03\x1b\xff\xd7\x02\xef\x03\ +\x1c\xff\xec\x02\xf0\x00\x05\xff\xec\x02\xf0\x00\x0a\xff\xec\x02\ +\xf0\x01\xd0\xff\xd7\x02\xf0\x01\xdc\xff\xec\x02\xf0\x01\xdd\xff\ +\xec\x02\xf0\x01\xdf\xff\xd7\x02\xf0\x01\xe1\xff\xec\x02\xf0\x01\ +\xe4\xff\xec\x02\xf0\x01\xf6\xff\xec\x02\xf0\x02\x07\xff\xec\x02\ +\xf0\x02\x0b\xff\xec\x02\xf0\x02\xa0\xff\xd7\x02\xf0\x02\xaa\xff\ +\xec\x02\xf0\x02\xb6\xff\xec\x02\xf0\x02\xbc\xff\xd7\x02\xf0\x02\ +\xbe\xff\xec\x02\xf0\x02\xc0\xff\xec\x02\xf0\x02\xc2\xff\xec\x02\ +\xf0\x02\xcb\xff\xd7\x02\xf0\x02\xd5\xff\xec\x02\xf0\x02\xe6\xff\ +\xd7\x02\xf0\x02\xf8\xff\xec\x02\xf0\x02\xfa\xff\xec\x02\xf0\x02\ +\xfc\xff\xec\x02\xf0\x02\xfe\xff\xec\x02\xf0\x03\x06\xff\xd7\x02\ +\xf0\x03\x08\xff\xd7\x02\xf0\x03\x0e\xff\xec\x02\xf0\x03\x10\xff\ +\xec\x02\xf0\x03\x18\xff\xec\x02\xf1\x00\x0f\xff\xae\x02\xf1\x00\ +\x11\xff\xae\x02\xf1\x01\x9d\xff\xec\x02\xf1\x01\xa4\xff\xd7\x02\ +\xf1\x01\xa6\xff\xec\x02\xf1\x01\xa8\xff\xd7\x02\xf1\x01\xaa\xff\ +\xd7\x02\xf1\x01\xae\xff\xd7\x02\xf1\x01\xb0\xff\xd7\x02\xf1\x01\ +\xb1\xff\xec\x02\xf1\x01\xb5\xff\xd7\x02\xf1\x01\xbc\xff\xc3\x02\ +\xf1\x01\xbd\xff\xd7\x02\xf1\x01\xbf\xff\xd7\x02\xf1\x01\xc1\xff\ +\xd7\x02\xf1\x01\xc4\xff\xec\x02\xf1\x01\xc7\xff\xec\x02\xf1\x01\ +\xce\xff\xec\x02\xf1\x01\xd5\xff\xec\x02\xf1\x01\xf2\xff\xec\x02\ +\xf1\x02\x08\xff\xae\x02\xf1\x02\x0c\xff\xae\x02\xf1\x02r\xff\ +\xd7\x02\xf1\x02s\xff\xec\x02\xf1\x02z\xff\xec\x02\xf1\x02\ +|\xff\xd7\x02\xf1\x02\x80\xff\xec\x02\xf1\x02\x82\xff\xec\x02\ +\xf1\x02\x9f\xff\xd7\x02\xf1\x02\xa1\xff\xec\x02\xf1\x02\xa9\xff\ +\xec\x02\xf1\x02\xb5\xff\xc3\x02\xf1\x02\xb7\xff\xec\x02\xf1\x02\ +\xb9\xff\xec\x02\xf1\x02\xbb\xff\xd7\x02\xf1\x02\xbd\xff\xec\x02\ +\xf1\x02\xbf\xff\xd7\x02\xf1\x02\xc1\xff\xd7\x02\xf1\x02\xca\xff\ +\xd7\x02\xf1\x02\xce\xff\xd7\x02\xf1\x02\xcf\xff\xec\x02\xf1\x02\ +\xd4\xff\xd7\x02\xf1\x02\xd9\xff\xd7\x02\xf1\x02\xdb\xff\xd7\x02\ +\xf1\x02\xdd\xff\xd7\x02\xf1\x02\xe5\xff\xd7\x02\xf1\x02\xe7\xff\ +\xec\x02\xf1\x02\xf5\xff\xec\x02\xf1\x02\xf7\xff\xd7\x02\xf1\x02\ +\xf9\xff\xd7\x02\xf1\x02\xfb\xff\xd7\x02\xf1\x02\xfd\xff\xd7\x02\ +\xf1\x03\x05\xff\xd7\x02\xf1\x03\x07\xff\xd7\x02\xf1\x03\x0d\xff\ +\xd7\x02\xf1\x03\x0f\xff\xd7\x02\xf1\x03\x11\xff\xd7\x02\xf1\x03\ +\x12\xff\xec\x02\xf1\x03\x17\xff\xec\x02\xf1\x03\x1b\xff\xd7\x02\ +\xf1\x03\x1c\xff\xec\x02\xf2\x00\x05\xff\xec\x02\xf2\x00\x0a\xff\ +\xec\x02\xf2\x01\xd0\xff\xd7\x02\xf2\x01\xdc\xff\xec\x02\xf2\x01\ +\xdd\xff\xec\x02\xf2\x01\xdf\xff\xd7\x02\xf2\x01\xe1\xff\xec\x02\ +\xf2\x01\xe4\xff\xec\x02\xf2\x01\xf6\xff\xec\x02\xf2\x02\x07\xff\ +\xec\x02\xf2\x02\x0b\xff\xec\x02\xf2\x02\xa0\xff\xd7\x02\xf2\x02\ +\xaa\xff\xec\x02\xf2\x02\xb6\xff\xec\x02\xf2\x02\xbc\xff\xd7\x02\ +\xf2\x02\xbe\xff\xec\x02\xf2\x02\xc0\xff\xec\x02\xf2\x02\xc2\xff\ +\xec\x02\xf2\x02\xcb\xff\xd7\x02\xf2\x02\xd5\xff\xec\x02\xf2\x02\ +\xe6\xff\xd7\x02\xf2\x02\xf8\xff\xec\x02\xf2\x02\xfa\xff\xec\x02\ +\xf2\x02\xfc\xff\xec\x02\xf2\x02\xfe\xff\xec\x02\xf2\x03\x06\xff\ +\xd7\x02\xf2\x03\x08\xff\xd7\x02\xf2\x03\x0e\xff\xec\x02\xf2\x03\ +\x10\xff\xec\x02\xf2\x03\x18\xff\xec\x02\xf3\x00\x0f\xff\xae\x02\ +\xf3\x00\x11\xff\xae\x02\xf3\x01\x9d\xff\xec\x02\xf3\x01\xa4\xff\ +\xd7\x02\xf3\x01\xa6\xff\xec\x02\xf3\x01\xa8\xff\xd7\x02\xf3\x01\ +\xaa\xff\xd7\x02\xf3\x01\xae\xff\xd7\x02\xf3\x01\xb0\xff\xd7\x02\ +\xf3\x01\xb1\xff\xec\x02\xf3\x01\xb5\xff\xd7\x02\xf3\x01\xbc\xff\ +\xc3\x02\xf3\x01\xbd\xff\xd7\x02\xf3\x01\xbf\xff\xd7\x02\xf3\x01\ +\xc1\xff\xd7\x02\xf3\x01\xc4\xff\xec\x02\xf3\x01\xc7\xff\xec\x02\ +\xf3\x01\xce\xff\xec\x02\xf3\x01\xd5\xff\xec\x02\xf3\x01\xf2\xff\ +\xec\x02\xf3\x02\x08\xff\xae\x02\xf3\x02\x0c\xff\xae\x02\xf3\x02\ +r\xff\xd7\x02\xf3\x02s\xff\xec\x02\xf3\x02z\xff\xec\x02\ +\xf3\x02|\xff\xd7\x02\xf3\x02\x80\xff\xec\x02\xf3\x02\x82\xff\ +\xec\x02\xf3\x02\x9f\xff\xd7\x02\xf3\x02\xa1\xff\xec\x02\xf3\x02\ +\xa9\xff\xec\x02\xf3\x02\xb5\xff\xc3\x02\xf3\x02\xb7\xff\xec\x02\ +\xf3\x02\xb9\xff\xec\x02\xf3\x02\xbb\xff\xd7\x02\xf3\x02\xbd\xff\ +\xec\x02\xf3\x02\xbf\xff\xd7\x02\xf3\x02\xc1\xff\xd7\x02\xf3\x02\ +\xca\xff\xd7\x02\xf3\x02\xce\xff\xd7\x02\xf3\x02\xcf\xff\xec\x02\ +\xf3\x02\xd4\xff\xd7\x02\xf3\x02\xd9\xff\xd7\x02\xf3\x02\xdb\xff\ +\xd7\x02\xf3\x02\xdd\xff\xd7\x02\xf3\x02\xe5\xff\xd7\x02\xf3\x02\ +\xe7\xff\xec\x02\xf3\x02\xf5\xff\xec\x02\xf3\x02\xf7\xff\xd7\x02\ +\xf3\x02\xf9\xff\xd7\x02\xf3\x02\xfb\xff\xd7\x02\xf3\x02\xfd\xff\ +\xd7\x02\xf3\x03\x05\xff\xd7\x02\xf3\x03\x07\xff\xd7\x02\xf3\x03\ +\x0d\xff\xd7\x02\xf3\x03\x0f\xff\xd7\x02\xf3\x03\x11\xff\xd7\x02\ +\xf3\x03\x12\xff\xec\x02\xf3\x03\x17\xff\xec\x02\xf3\x03\x1b\xff\ +\xd7\x02\xf3\x03\x1c\xff\xec\x02\xf4\x00\x05\xff\xec\x02\xf4\x00\ +\x0a\xff\xec\x02\xf4\x01\xd0\xff\xd7\x02\xf4\x01\xdc\xff\xec\x02\ +\xf4\x01\xdd\xff\xec\x02\xf4\x01\xdf\xff\xd7\x02\xf4\x01\xe1\xff\ +\xec\x02\xf4\x01\xe4\xff\xec\x02\xf4\x01\xf6\xff\xec\x02\xf4\x02\ +\x07\xff\xec\x02\xf4\x02\x0b\xff\xec\x02\xf4\x02\xa0\xff\xd7\x02\ +\xf4\x02\xaa\xff\xec\x02\xf4\x02\xb6\xff\xec\x02\xf4\x02\xbc\xff\ +\xd7\x02\xf4\x02\xbe\xff\xec\x02\xf4\x02\xc0\xff\xec\x02\xf4\x02\ +\xc2\xff\xec\x02\xf4\x02\xcb\xff\xd7\x02\xf4\x02\xd5\xff\xec\x02\ +\xf4\x02\xe6\xff\xd7\x02\xf4\x02\xf8\xff\xec\x02\xf4\x02\xfa\xff\ +\xec\x02\xf4\x02\xfc\xff\xec\x02\xf4\x02\xfe\xff\xec\x02\xf4\x03\ +\x06\xff\xd7\x02\xf4\x03\x08\xff\xd7\x02\xf4\x03\x0e\xff\xec\x02\ +\xf4\x03\x10\xff\xec\x02\xf4\x03\x18\xff\xec\x02\xf5\x00\x0f\xff\ +\xae\x02\xf5\x00\x11\xff\xae\x02\xf5\x01\x9d\xff\xec\x02\xf5\x01\ +\xa4\xff\xd7\x02\xf5\x01\xa6\xff\xec\x02\xf5\x01\xa8\xff\xd7\x02\ +\xf5\x01\xaa\xff\xd7\x02\xf5\x01\xae\xff\xd7\x02\xf5\x01\xb0\xff\ +\xd7\x02\xf5\x01\xb1\xff\xec\x02\xf5\x01\xb5\xff\xd7\x02\xf5\x01\ +\xbc\xff\xc3\x02\xf5\x01\xbd\xff\xd7\x02\xf5\x01\xbf\xff\xd7\x02\ +\xf5\x01\xc1\xff\xd7\x02\xf5\x01\xc4\xff\xec\x02\xf5\x01\xc7\xff\ +\xec\x02\xf5\x01\xce\xff\xec\x02\xf5\x01\xd5\xff\xec\x02\xf5\x01\ +\xf2\xff\xec\x02\xf5\x02\x08\xff\xae\x02\xf5\x02\x0c\xff\xae\x02\ +\xf5\x02r\xff\xd7\x02\xf5\x02s\xff\xec\x02\xf5\x02z\xff\ +\xec\x02\xf5\x02|\xff\xd7\x02\xf5\x02\x80\xff\xec\x02\xf5\x02\ +\x82\xff\xec\x02\xf5\x02\x9f\xff\xd7\x02\xf5\x02\xa1\xff\xec\x02\ +\xf5\x02\xa9\xff\xec\x02\xf5\x02\xb5\xff\xc3\x02\xf5\x02\xb7\xff\ +\xec\x02\xf5\x02\xb9\xff\xec\x02\xf5\x02\xbb\xff\xd7\x02\xf5\x02\ +\xbd\xff\xec\x02\xf5\x02\xbf\xff\xd7\x02\xf5\x02\xc1\xff\xd7\x02\ +\xf5\x02\xca\xff\xd7\x02\xf5\x02\xce\xff\xd7\x02\xf5\x02\xcf\xff\ +\xec\x02\xf5\x02\xd4\xff\xd7\x02\xf5\x02\xd9\xff\xd7\x02\xf5\x02\ +\xdb\xff\xd7\x02\xf5\x02\xdd\xff\xd7\x02\xf5\x02\xe5\xff\xd7\x02\ +\xf5\x02\xe7\xff\xec\x02\xf5\x02\xf5\xff\xec\x02\xf5\x02\xf7\xff\ +\xd7\x02\xf5\x02\xf9\xff\xd7\x02\xf5\x02\xfb\xff\xd7\x02\xf5\x02\ +\xfd\xff\xd7\x02\xf5\x03\x05\xff\xd7\x02\xf5\x03\x07\xff\xd7\x02\ +\xf5\x03\x0d\xff\xd7\x02\xf5\x03\x0f\xff\xd7\x02\xf5\x03\x11\xff\ +\xd7\x02\xf5\x03\x12\xff\xec\x02\xf5\x03\x17\xff\xec\x02\xf5\x03\ +\x1b\xff\xd7\x02\xf5\x03\x1c\xff\xec\x02\xf6\x00\x05\xff\xec\x02\ +\xf6\x00\x0a\xff\xec\x02\xf6\x01\xd0\xff\xd7\x02\xf6\x01\xdc\xff\ +\xec\x02\xf6\x01\xdd\xff\xec\x02\xf6\x01\xdf\xff\xd7\x02\xf6\x01\ +\xe1\xff\xec\x02\xf6\x01\xe4\xff\xec\x02\xf6\x01\xf6\xff\xec\x02\ +\xf6\x02\x07\xff\xec\x02\xf6\x02\x0b\xff\xec\x02\xf6\x02\xa0\xff\ +\xd7\x02\xf6\x02\xaa\xff\xec\x02\xf6\x02\xb6\xff\xec\x02\xf6\x02\ +\xbc\xff\xd7\x02\xf6\x02\xbe\xff\xec\x02\xf6\x02\xc0\xff\xec\x02\ +\xf6\x02\xc2\xff\xec\x02\xf6\x02\xcb\xff\xd7\x02\xf6\x02\xd5\xff\ +\xec\x02\xf6\x02\xe6\xff\xd7\x02\xf6\x02\xf8\xff\xec\x02\xf6\x02\ +\xfa\xff\xec\x02\xf6\x02\xfc\xff\xec\x02\xf6\x02\xfe\xff\xec\x02\ +\xf6\x03\x06\xff\xd7\x02\xf6\x03\x08\xff\xd7\x02\xf6\x03\x0e\xff\ +\xec\x02\xf6\x03\x10\xff\xec\x02\xf6\x03\x18\xff\xec\x02\xf7\x00\ +\x0f\xff\x85\x02\xf7\x00\x11\xff\x85\x02\xf7\x01\x9f\xff\xec\x02\ +\xf7\x01\xa4\xff\x9a\x02\xf7\x01\xaa\xffq\x02\xf7\x01\xae\xff\ +\x9a\x02\xf7\x01\xb5\xff\x9a\x02\xf7\x01\xb8\xff\xec\x02\xf7\x01\ +\xbb\xff\xec\x02\xf7\x01\xbe\xff\xc3\x02\xf7\x01\xc9\xff\xec\x02\ +\xf7\x01\xce\xff\xae\x02\xf7\x01\xcf\xff\xd7\x02\xf7\x01\xd5\xff\ +\xae\x02\xf7\x01\xd8\xff\xd7\x02\xf7\x01\xdb\xff\xd7\x02\xf7\x01\ +\xde\xff\xd7\x02\xf7\x01\xe1\xff\xd7\x02\xf7\x01\xea\xff\xd7\x02\ +\xf7\x01\xeb\x00f\x02\xf7\x01\xed\xff\xd7\x02\xf7\x01\xee\xff\ +\xec\x02\xf7\x01\xf2\xff\xae\x02\xf7\x01\xf4\x00f\x02\xf7\x02\ +\x08\xff\x85\x02\xf7\x02\x0c\xff\x85\x02\xf7\x02j\xff\xd7\x02\ +\xf7\x02l\xff\xec\x02\xf7\x02r\xffq\x02\xf7\x02s\xff\ +\xae\x02\xf7\x02~\xff\xec\x02\xf7\x02\x7f\xff\xd7\x02\xf7\x02\ +\x84\xff\xec\x02\xf7\x02\x85\xff\xd7\x02\xf7\x02\x86\xff\xec\x02\ +\xf7\x02\x87\xff\xd7\x02\xf7\x02\x88\xff\xec\x02\xf7\x02\x89\xff\ +\xd7\x02\xf7\x02\x8a\xff\xec\x02\xf7\x02\x8c\xff\xec\x02\xf7\x02\ +\x8d\xff\xd7\x02\xf7\x02\x98\x00f\x02\xf7\x02\xa8\x00f\x02\ +\xf7\x02\xb1\xff\xec\x02\xf7\x02\xb2\xff\xd7\x02\xf7\x02\xb3\xff\ +\xec\x02\xf7\x02\xb4\xff\xd7\x02\xf7\x02\xc0\xff\xd7\x02\xf7\x02\ +\xc2\xff\xd7\x02\xf7\x02\xc5\xff\xd7\x02\xf7\x02\xc6\xff\xc3\x02\ +\xf7\x02\xc7\xff\xd7\x02\xf7\x02\xc8\xff\xc3\x02\xf7\x02\xce\xff\ +\x9a\x02\xf7\x02\xcf\xff\xae\x02\xf7\x02\xd5\xff\xd7\x02\xf7\x02\ +\xd9\xffq\x02\xf7\x02\xdb\xffq\x02\xf7\x02\xdd\xffq\x02\ +\xf7\x02\xe0\xff\xd7\x02\xf7\x02\xef\xff\xec\x02\xf7\x02\xf0\xff\ +\xd7\x02\xf7\x02\xf1\xff\xec\x02\xf7\x02\xf2\xff\xd7\x02\xf7\x02\ +\xf3\xff\xec\x02\xf7\x02\xf4\xff\xd7\x02\xf7\x02\xfe\xff\xd7\x02\ +\xf7\x03\x09\xffq\x02\xf7\x03\x0a\xff\xd7\x02\xf7\x03\x0b\xff\ +q\x02\xf7\x03\x0c\xff\xd7\x02\xf7\x03\x11\xff\x9a\x02\xf7\x03\ +\x12\xff\xae\x02\xf7\x03\x15\xff\xec\x02\xf7\x03\x16\xff\xd7\x02\ +\xf7\x03\x1a\xff\xd7\x02\xf7\x03\x1b\xff\x9a\x02\xf7\x03\x1c\xff\ +\xae\x02\xf8\x00\x0f\xff\xae\x02\xf8\x00\x11\xff\xae\x02\xf8\x01\ +\xce\xff\xd7\x02\xf8\x01\xd5\xff\xd7\x02\xf8\x01\xf2\xff\xd7\x02\ +\xf8\x02\x08\xff\xae\x02\xf8\x02\x0c\xff\xae\x02\xf8\x02s\xff\ +\xd7\x02\xf8\x02\xcf\xff\xd7\x02\xf8\x03\x12\xff\xd7\x02\xf8\x03\ +\x1c\xff\xd7\x02\xf9\x00\x0f\xff\x85\x02\xf9\x00\x11\xff\x85\x02\ +\xf9\x01\x9f\xff\xec\x02\xf9\x01\xa4\xff\x9a\x02\xf9\x01\xaa\xff\ +q\x02\xf9\x01\xae\xff\x9a\x02\xf9\x01\xb5\xff\x9a\x02\xf9\x01\ +\xb8\xff\xec\x02\xf9\x01\xbb\xff\xec\x02\xf9\x01\xbe\xff\xc3\x02\ +\xf9\x01\xc9\xff\xec\x02\xf9\x01\xce\xff\xae\x02\xf9\x01\xcf\xff\ +\xd7\x02\xf9\x01\xd5\xff\xae\x02\xf9\x01\xd8\xff\xd7\x02\xf9\x01\ +\xdb\xff\xd7\x02\xf9\x01\xde\xff\xd7\x02\xf9\x01\xe1\xff\xd7\x02\ +\xf9\x01\xea\xff\xd7\x02\xf9\x01\xeb\x00f\x02\xf9\x01\xed\xff\ +\xd7\x02\xf9\x01\xee\xff\xec\x02\xf9\x01\xf2\xff\xae\x02\xf9\x01\ +\xf4\x00f\x02\xf9\x02\x08\xff\x85\x02\xf9\x02\x0c\xff\x85\x02\ +\xf9\x02j\xff\xd7\x02\xf9\x02l\xff\xec\x02\xf9\x02r\xff\ +q\x02\xf9\x02s\xff\xae\x02\xf9\x02~\xff\xec\x02\xf9\x02\ +\x7f\xff\xd7\x02\xf9\x02\x84\xff\xec\x02\xf9\x02\x85\xff\xd7\x02\ +\xf9\x02\x86\xff\xec\x02\xf9\x02\x87\xff\xd7\x02\xf9\x02\x88\xff\ +\xec\x02\xf9\x02\x89\xff\xd7\x02\xf9\x02\x8a\xff\xec\x02\xf9\x02\ +\x8c\xff\xec\x02\xf9\x02\x8d\xff\xd7\x02\xf9\x02\x98\x00f\x02\ +\xf9\x02\xa8\x00f\x02\xf9\x02\xb1\xff\xec\x02\xf9\x02\xb2\xff\ +\xd7\x02\xf9\x02\xb3\xff\xec\x02\xf9\x02\xb4\xff\xd7\x02\xf9\x02\ +\xc0\xff\xd7\x02\xf9\x02\xc2\xff\xd7\x02\xf9\x02\xc5\xff\xd7\x02\ +\xf9\x02\xc6\xff\xc3\x02\xf9\x02\xc7\xff\xd7\x02\xf9\x02\xc8\xff\ +\xc3\x02\xf9\x02\xce\xff\x9a\x02\xf9\x02\xcf\xff\xae\x02\xf9\x02\ +\xd5\xff\xd7\x02\xf9\x02\xd9\xffq\x02\xf9\x02\xdb\xffq\x02\ +\xf9\x02\xdd\xffq\x02\xf9\x02\xe0\xff\xd7\x02\xf9\x02\xef\xff\ +\xec\x02\xf9\x02\xf0\xff\xd7\x02\xf9\x02\xf1\xff\xec\x02\xf9\x02\ +\xf2\xff\xd7\x02\xf9\x02\xf3\xff\xec\x02\xf9\x02\xf4\xff\xd7\x02\ +\xf9\x02\xfe\xff\xd7\x02\xf9\x03\x09\xffq\x02\xf9\x03\x0a\xff\ +\xd7\x02\xf9\x03\x0b\xffq\x02\xf9\x03\x0c\xff\xd7\x02\xf9\x03\ +\x11\xff\x9a\x02\xf9\x03\x12\xff\xae\x02\xf9\x03\x15\xff\xec\x02\ +\xf9\x03\x16\xff\xd7\x02\xf9\x03\x1a\xff\xd7\x02\xf9\x03\x1b\xff\ +\x9a\x02\xf9\x03\x1c\xff\xae\x02\xfa\x00\x0f\xff\xae\x02\xfa\x00\ +\x11\xff\xae\x02\xfa\x01\xce\xff\xd7\x02\xfa\x01\xd5\xff\xd7\x02\ +\xfa\x01\xf2\xff\xd7\x02\xfa\x02\x08\xff\xae\x02\xfa\x02\x0c\xff\ +\xae\x02\xfa\x02s\xff\xd7\x02\xfa\x02\xcf\xff\xd7\x02\xfa\x03\ +\x12\xff\xd7\x02\xfa\x03\x1c\xff\xd7\x02\xfb\x00\x0f\xff\x85\x02\ +\xfb\x00\x11\xff\x85\x02\xfb\x01\x9f\xff\xec\x02\xfb\x01\xa4\xff\ +\x9a\x02\xfb\x01\xaa\xffq\x02\xfb\x01\xae\xff\x9a\x02\xfb\x01\ +\xb5\xff\x9a\x02\xfb\x01\xb8\xff\xec\x02\xfb\x01\xbb\xff\xec\x02\ +\xfb\x01\xbe\xff\xc3\x02\xfb\x01\xc9\xff\xec\x02\xfb\x01\xce\xff\ +\xae\x02\xfb\x01\xcf\xff\xd7\x02\xfb\x01\xd5\xff\xae\x02\xfb\x01\ +\xd8\xff\xd7\x02\xfb\x01\xdb\xff\xd7\x02\xfb\x01\xde\xff\xd7\x02\ +\xfb\x01\xe1\xff\xd7\x02\xfb\x01\xea\xff\xd7\x02\xfb\x01\xeb\x00\ +f\x02\xfb\x01\xed\xff\xd7\x02\xfb\x01\xee\xff\xec\x02\xfb\x01\ +\xf2\xff\xae\x02\xfb\x01\xf4\x00f\x02\xfb\x02\x08\xff\x85\x02\ +\xfb\x02\x0c\xff\x85\x02\xfb\x02j\xff\xd7\x02\xfb\x02l\xff\ +\xec\x02\xfb\x02r\xffq\x02\xfb\x02s\xff\xae\x02\xfb\x02\ +~\xff\xec\x02\xfb\x02\x7f\xff\xd7\x02\xfb\x02\x84\xff\xec\x02\ +\xfb\x02\x85\xff\xd7\x02\xfb\x02\x86\xff\xec\x02\xfb\x02\x87\xff\ +\xd7\x02\xfb\x02\x88\xff\xec\x02\xfb\x02\x89\xff\xd7\x02\xfb\x02\ +\x8a\xff\xec\x02\xfb\x02\x8c\xff\xec\x02\xfb\x02\x8d\xff\xd7\x02\ +\xfb\x02\x98\x00f\x02\xfb\x02\xa8\x00f\x02\xfb\x02\xb1\xff\ +\xec\x02\xfb\x02\xb2\xff\xd7\x02\xfb\x02\xb3\xff\xec\x02\xfb\x02\ +\xb4\xff\xd7\x02\xfb\x02\xc0\xff\xd7\x02\xfb\x02\xc2\xff\xd7\x02\ +\xfb\x02\xc5\xff\xd7\x02\xfb\x02\xc6\xff\xc3\x02\xfb\x02\xc7\xff\ +\xd7\x02\xfb\x02\xc8\xff\xc3\x02\xfb\x02\xce\xff\x9a\x02\xfb\x02\ +\xcf\xff\xae\x02\xfb\x02\xd5\xff\xd7\x02\xfb\x02\xd9\xffq\x02\ +\xfb\x02\xdb\xffq\x02\xfb\x02\xdd\xffq\x02\xfb\x02\xe0\xff\ +\xd7\x02\xfb\x02\xef\xff\xec\x02\xfb\x02\xf0\xff\xd7\x02\xfb\x02\ +\xf1\xff\xec\x02\xfb\x02\xf2\xff\xd7\x02\xfb\x02\xf3\xff\xec\x02\ +\xfb\x02\xf4\xff\xd7\x02\xfb\x02\xfe\xff\xd7\x02\xfb\x03\x09\xff\ +q\x02\xfb\x03\x0a\xff\xd7\x02\xfb\x03\x0b\xffq\x02\xfb\x03\ +\x0c\xff\xd7\x02\xfb\x03\x11\xff\x9a\x02\xfb\x03\x12\xff\xae\x02\ +\xfb\x03\x15\xff\xec\x02\xfb\x03\x16\xff\xd7\x02\xfb\x03\x1a\xff\ +\xd7\x02\xfb\x03\x1b\xff\x9a\x02\xfb\x03\x1c\xff\xae\x02\xfc\x00\ +\x0f\xff\xae\x02\xfc\x00\x11\xff\xae\x02\xfc\x01\xce\xff\xd7\x02\ +\xfc\x01\xd5\xff\xd7\x02\xfc\x01\xf2\xff\xd7\x02\xfc\x02\x08\xff\ +\xae\x02\xfc\x02\x0c\xff\xae\x02\xfc\x02s\xff\xd7\x02\xfc\x02\ +\xcf\xff\xd7\x02\xfc\x03\x12\xff\xd7\x02\xfc\x03\x1c\xff\xd7\x02\ +\xff\x00\x0f\xff\x85\x02\xff\x00\x10\xff\xae\x02\xff\x00\x11\xff\ +\x85\x02\xff\x01\x9f\xff\xd7\x02\xff\x01\xa4\xff\x9a\x02\xff\x01\ +\xaa\xffq\x02\xff\x01\xae\xff\x9a\x02\xff\x01\xb5\xff\x9a\x02\ +\xff\x01\xb8\xff\xd7\x02\xff\x01\xbb\xff\xd7\x02\xff\x01\xbc\x00\ +)\x02\xff\x01\xbe\xff\xae\x02\xff\x01\xcc\xff\x9a\x02\xff\x01\ +\xcd\xff\x9a\x02\xff\x01\xce\xff\x85\x02\xff\x01\xcf\xffq\x02\ +\xff\x01\xd0\xff\xd7\x02\xff\x01\xd1\xff\xd7\x02\xff\x01\xd2\xff\ +\x9a\x02\xff\x01\xd3\xff\x9a\x02\xff\x01\xd4\xff\x9a\x02\xff\x01\ +\xd5\xff\x85\x02\xff\x01\xd6\xff\x9a\x02\xff\x01\xd7\xff\x9a\x02\ +\xff\x01\xd8\xffq\x02\xff\x01\xd9\xff\x9a\x02\xff\x01\xda\xff\ +\x9a\x02\xff\x01\xdb\xffq\x02\xff\x01\xdc\xff\xae\x02\xff\x01\ +\xdd\xff\xae\x02\xff\x01\xde\xffq\x02\xff\x01\xdf\xff\xd7\x02\ +\xff\x01\xe0\xff\x9a\x02\xff\x01\xe1\xff\x9a\x02\xff\x01\xe2\xff\ +\x9a\x02\xff\x01\xe3\xff\x9a\x02\xff\x01\xe4\xff\xae\x02\xff\x01\ +\xe5\xff\x9a\x02\xff\x01\xe6\xff\x9a\x02\xff\x01\xe7\xff\xd7\x02\ +\xff\x01\xe8\xff\x9a\x02\xff\x01\xe9\xff\xc3\x02\xff\x01\xea\xff\ +q\x02\xff\x01\xec\xff\x9a\x02\xff\x01\xed\xffq\x02\xff\x01\ +\xee\xff\x85\x02\xff\x01\xf2\xff\x85\x02\xff\x01\xf3\xff\x9a\x02\ +\xff\x01\xf5\xff\x9a\x02\xff\x01\xf6\xff\xae\x02\xff\x01\xf7\xff\ +\x9a\x02\xff\x01\xf9\xff\x9a\x02\xff\x02\x02\xff\xae\x02\xff\x02\ +\x03\xff\xae\x02\xff\x02\x04\xff\xae\x02\xff\x02\x08\xff\x85\x02\ +\xff\x02\x0c\xff\x85\x02\xff\x02j\xffq\x02\xff\x02k\xff\ +\x9a\x02\xff\x02l\xff\xd7\x02\xff\x02m\xff\xd7\x02\xff\x02\ +q\xff\x9a\x02\xff\x02r\xffq\x02\xff\x02s\xff\x85\x02\ +\xff\x02u\xff\x9a\x02\xff\x02w\xff\x9a\x02\xff\x02y\xff\ +\x9a\x02\xff\x02}\xff\x9a\x02\xff\x02~\xff\xd7\x02\xff\x02\ +\x7f\xffq\x02\xff\x02\x81\xff\xd7\x02\xff\x02\x83\xff\xd7\x02\ +\xff\x02\x84\xff\xd7\x02\xff\x02\x85\xffq\x02\xff\x02\x86\xff\ +\xd7\x02\xff\x02\x87\xffq\x02\xff\x02\x88\xff\xd7\x02\xff\x02\ +\x89\xffq\x02\xff\x02\x8a\xff\xd7\x02\xff\x02\x8b\xff\xd7\x02\ +\xff\x02\x8c\xff\xd7\x02\xff\x02\x8d\xffq\x02\xff\x02\x96\xff\ +\x9a\x02\xff\x02\x9a\xff\x9a\x02\xff\x02\x9e\xff\x9a\x02\xff\x02\ +\xa0\xff\xd7\x02\xff\x02\xa2\xff\xd7\x02\xff\x02\xa4\xff\x9a\x02\ +\xff\x02\xa6\xff\x9a\x02\xff\x02\xaa\xff\xae\x02\xff\x02\xac\xff\ +\x9a\x02\xff\x02\xae\xff\x9a\x02\xff\x02\xb0\xff\x9a\x02\xff\x02\ +\xb1\xff\xd7\x02\xff\x02\xb2\xffq\x02\xff\x02\xb3\xff\xd7\x02\ +\xff\x02\xb4\xffq\x02\xff\x02\xb5\x00)\x02\xff\x02\xb6\xff\ +\xae\x02\xff\x02\xb8\xff\xae\x02\xff\x02\xba\xff\xae\x02\xff\x02\ +\xbc\xff\xd7\x02\xff\x02\xbe\xff\xae\x02\xff\x02\xc0\xff\x9a\x02\ +\xff\x02\xc2\xff\x9a\x02\xff\x02\xc4\xff\x9a\x02\xff\x02\xc5\xff\ +\x9a\x02\xff\x02\xc6\xffq\x02\xff\x02\xc7\xff\x9a\x02\xff\x02\ +\xc8\xffq\x02\xff\x02\xcb\xff\xd7\x02\xff\x02\xcd\xff\x9a\x02\ +\xff\x02\xce\xff\x9a\x02\xff\x02\xcf\xff\x85\x02\xff\x02\xd1\xff\ +\x9a\x02\xff\x02\xd3\xff\x9a\x02\xff\x02\xd5\xff\x9a\x02\xff\x02\ +\xd7\xff\x9a\x02\xff\x02\xd9\xffq\x02\xff\x02\xdb\xffq\x02\ +\xff\x02\xdd\xffq\x02\xff\x02\xe0\xffq\x02\xff\x02\xe6\xff\ +\xd7\x02\xff\x02\xe8\xff\xd7\x02\xff\x02\xea\xff\xc3\x02\xff\x02\ +\xec\xff\x9a\x02\xff\x02\xee\xff\x9a\x02\xff\x02\xef\xff\xd7\x02\ +\xff\x02\xf0\xffq\x02\xff\x02\xf1\xff\xd7\x02\xff\x02\xf2\xff\ +q\x02\xff\x02\xf3\xff\xd7\x02\xff\x02\xf4\xffq\x02\xff\x02\ +\xf6\xff\xd7\x02\xff\x02\xf8\xff\xae\x02\xff\x02\xfa\xff\xae\x02\ +\xff\x02\xfc\xff\xae\x02\xff\x02\xfe\xff\x9a\x02\xff\x03\x00\xff\ +\x9a\x02\xff\x03\x02\xff\x9a\x02\xff\x03\x06\xff\xd7\x02\xff\x03\ +\x08\xff\xd7\x02\xff\x03\x09\xffq\x02\xff\x03\x0a\xffq\x02\ +\xff\x03\x0b\xffq\x02\xff\x03\x0c\xffq\x02\xff\x03\x0e\xff\ +\x9a\x02\xff\x03\x10\xff\x9a\x02\xff\x03\x11\xff\x9a\x02\xff\x03\ +\x12\xff\x85\x02\xff\x03\x14\xff\x9a\x02\xff\x03\x15\xff\xd7\x02\ +\xff\x03\x16\xffq\x02\xff\x03\x18\xff\xae\x02\xff\x03\x1a\xff\ +q\x02\xff\x03\x1b\xff\x9a\x02\xff\x03\x1c\xff\x85\x03\x00\x00\ +\x0f\xff\x9a\x03\x00\x00\x10\xff\xd7\x03\x00\x00\x11\xff\x9a\x03\ +\x00\x01\xce\xff\xc3\x03\x00\x01\xcf\xff\xec\x03\x00\x01\xd5\xff\ +\xc3\x03\x00\x01\xd8\xff\xec\x03\x00\x01\xdb\xff\xec\x03\x00\x01\ +\xde\xff\xec\x03\x00\x01\xea\xff\xec\x03\x00\x01\xed\xff\xec\x03\ +\x00\x01\xf2\xff\xc3\x03\x00\x02\x02\xff\xd7\x03\x00\x02\x03\xff\ +\xd7\x03\x00\x02\x04\xff\xd7\x03\x00\x02\x08\xff\x9a\x03\x00\x02\ +\x0c\xff\x9a\x03\x00\x02j\xff\xec\x03\x00\x02s\xff\xc3\x03\ +\x00\x02\x7f\xff\xec\x03\x00\x02\x85\xff\xec\x03\x00\x02\x87\xff\ +\xec\x03\x00\x02\x89\xff\xec\x03\x00\x02\x8d\xff\xec\x03\x00\x02\ +\xb2\xff\xec\x03\x00\x02\xb4\xff\xec\x03\x00\x02\xcf\xff\xc3\x03\ +\x00\x02\xe0\xff\xec\x03\x00\x02\xf0\xff\xec\x03\x00\x02\xf2\xff\ +\xec\x03\x00\x02\xf4\xff\xec\x03\x00\x03\x0a\xff\xec\x03\x00\x03\ +\x0c\xff\xec\x03\x00\x03\x12\xff\xc3\x03\x00\x03\x16\xff\xec\x03\ +\x00\x03\x1a\xff\xec\x03\x00\x03\x1c\xff\xc3\x03\x03\x00\x0f\xff\ +\x9a\x03\x03\x00\x10\xff\xd7\x03\x03\x00\x11\xff\x9a\x03\x03\x01\ +\x9d\x00)\x03\x03\x01\x9f\xff\xd7\x03\x03\x01\xa4\xff\xae\x03\ +\x03\x01\xa6\x00)\x03\x03\x01\xaa\xff\x85\x03\x03\x01\xae\xff\ +\xae\x03\x03\x01\xb5\xff\xae\x03\x03\x01\xb8\xff\xd7\x03\x03\x01\ +\xbb\xff\xd7\x03\x03\x01\xbc\x00)\x03\x03\x01\xbe\xff\xc3\x03\ +\x03\x01\xc4\x00)\x03\x03\x01\xcc\xff\xc3\x03\x03\x01\xcd\xff\ +\xc3\x03\x03\x01\xce\xff\x9a\x03\x03\x01\xcf\xff\xae\x03\x03\x01\ +\xd0\xff\xd7\x03\x03\x01\xd1\xff\xd7\x03\x03\x01\xd2\xff\xc3\x03\ +\x03\x01\xd3\xff\xc3\x03\x03\x01\xd4\xff\xc3\x03\x03\x01\xd5\xff\ +\x9a\x03\x03\x01\xd6\xff\xc3\x03\x03\x01\xd7\xff\xc3\x03\x03\x01\ +\xd8\xff\xae\x03\x03\x01\xd9\xff\xc3\x03\x03\x01\xda\xff\xc3\x03\ +\x03\x01\xdb\xff\xae\x03\x03\x01\xde\xff\xae\x03\x03\x01\xdf\xff\ +\xd7\x03\x03\x01\xe0\xff\xc3\x03\x03\x01\xe1\xff\x9a\x03\x03\x01\ +\xe2\xff\xc3\x03\x03\x01\xe3\xff\xc3\x03\x03\x01\xe5\xff\xc3\x03\ +\x03\x01\xe6\xff\xc3\x03\x03\x01\xe7\xff\xd7\x03\x03\x01\xe8\xff\ +\xc3\x03\x03\x01\xea\xff\xae\x03\x03\x01\xeb\x00)\x03\x03\x01\ +\xec\xff\xc3\x03\x03\x01\xed\xff\xae\x03\x03\x01\xee\xff\xc3\x03\ +\x03\x01\xf2\xff\x9a\x03\x03\x01\xf3\xff\xc3\x03\x03\x01\xf4\x00\ +)\x03\x03\x01\xf5\xff\xc3\x03\x03\x01\xf7\xff\xc3\x03\x03\x01\ +\xf9\xff\xc3\x03\x03\x02\x02\xff\xd7\x03\x03\x02\x03\xff\xd7\x03\ +\x03\x02\x04\xff\xd7\x03\x03\x02\x08\xff\x9a\x03\x03\x02\x0c\xff\ +\x9a\x03\x03\x02j\xff\xae\x03\x03\x02k\xff\xc3\x03\x03\x02\ +l\xff\xd7\x03\x03\x02q\xff\xc3\x03\x03\x02r\xff\x85\x03\ +\x03\x02s\xff\x9a\x03\x03\x02u\xff\xc3\x03\x03\x02w\xff\ +\xd7\x03\x03\x02y\xff\xc3\x03\x03\x02}\xff\xc3\x03\x03\x02\ +~\xff\xd7\x03\x03\x02\x7f\xff\xae\x03\x03\x02\x84\xff\xd7\x03\ +\x03\x02\x85\xff\xae\x03\x03\x02\x86\xff\xd7\x03\x03\x02\x87\xff\ +\xae\x03\x03\x02\x88\xff\xd7\x03\x03\x02\x89\xff\xae\x03\x03\x02\ +\x8a\xff\xd7\x03\x03\x02\x8c\xff\xd7\x03\x03\x02\x8d\xff\xae\x03\ +\x03\x02\x96\xff\xc3\x03\x03\x02\x98\x00)\x03\x03\x02\x9a\xff\ +\xc3\x03\x03\x02\x9e\xff\xc3\x03\x03\x02\xa0\xff\xd7\x03\x03\x02\ +\xa2\xff\xd7\x03\x03\x02\xa4\xff\xc3\x03\x03\x02\xa6\xff\xc3\x03\ +\x03\x02\xa8\x00)\x03\x03\x02\xa9\x00)\x03\x03\x02\xac\xff\ +\xc3\x03\x03\x02\xae\xff\xc3\x03\x03\x02\xb0\xff\xc3\x03\x03\x02\ +\xb1\xff\xd7\x03\x03\x02\xb2\xff\xae\x03\x03\x02\xb3\xff\xd7\x03\ +\x03\x02\xb4\xff\xae\x03\x03\x02\xb5\x00)\x03\x03\x02\xbc\xff\ +\xd7\x03\x03\x02\xbd\x00)\x03\x03\x02\xc0\xff\x9a\x03\x03\x02\ +\xc2\xff\x9a\x03\x03\x02\xc4\xff\xc3\x03\x03\x02\xc5\xff\xd7\x03\ +\x03\x02\xc6\xff\xc3\x03\x03\x02\xc7\xff\xd7\x03\x03\x02\xc8\xff\ +\xc3\x03\x03\x02\xcb\xff\xd7\x03\x03\x02\xcd\xff\xc3\x03\x03\x02\ +\xce\xff\xae\x03\x03\x02\xcf\xff\x9a\x03\x03\x02\xd1\xff\xc3\x03\ +\x03\x02\xd3\xff\xc3\x03\x03\x02\xd5\xff\x9a\x03\x03\x02\xd7\xff\ +\xc3\x03\x03\x02\xd9\xff\x85\x03\x03\x02\xdb\xff\x85\x03\x03\x02\ +\xdd\xff\x85\x03\x03\x02\xe0\xff\xae\x03\x03\x02\xe6\xff\xd7\x03\ +\x03\x02\xe8\xff\xd7\x03\x03\x02\xec\xff\xc3\x03\x03\x02\xee\xff\ +\xc3\x03\x03\x02\xef\xff\xd7\x03\x03\x02\xf0\xff\xae\x03\x03\x02\ +\xf1\xff\xd7\x03\x03\x02\xf2\xff\xae\x03\x03\x02\xf3\xff\xd7\x03\ +\x03\x02\xf4\xff\xae\x03\x03\x02\xf6\xff\xd7\x03\x03\x02\xfe\xff\ +\x9a\x03\x03\x03\x00\xff\xc3\x03\x03\x03\x02\xff\xc3\x03\x03\x03\ +\x06\xff\xd7\x03\x03\x03\x08\xff\xd7\x03\x03\x03\x09\xff\x9a\x03\ +\x03\x03\x0a\xff\xae\x03\x03\x03\x0b\xff\x9a\x03\x03\x03\x0c\xff\ +\xae\x03\x03\x03\x0e\xff\xd7\x03\x03\x03\x10\xff\xd7\x03\x03\x03\ +\x11\xff\xae\x03\x03\x03\x12\xff\x9a\x03\x03\x03\x14\xff\xc3\x03\ +\x03\x03\x15\xff\xd7\x03\x03\x03\x16\xff\xae\x03\x03\x03\x17\x00\ +)\x03\x03\x03\x1a\xff\xae\x03\x03\x03\x1b\xff\xae\x03\x03\x03\ +\x1c\xff\x9a\x03\x04\x00\x0f\xff\xc3\x03\x04\x00\x11\xff\xc3\x03\ +\x04\x01\xce\xff\xc3\x03\x04\x01\xcf\xff\xd7\x03\x04\x01\xd5\xff\ +\xc3\x03\x04\x01\xd8\xff\xd7\x03\x04\x01\xdb\xff\xd7\x03\x04\x01\ +\xde\xff\xd7\x03\x04\x01\xea\xff\xd7\x03\x04\x01\xed\xff\xd7\x03\ +\x04\x01\xf2\xff\xc3\x03\x04\x02\x08\xff\xc3\x03\x04\x02\x0c\xff\ +\xc3\x03\x04\x02j\xff\xd7\x03\x04\x02s\xff\xc3\x03\x04\x02\ +\x7f\xff\xd7\x03\x04\x02\x85\xff\xd7\x03\x04\x02\x87\xff\xd7\x03\ +\x04\x02\x89\xff\xd7\x03\x04\x02\x8d\xff\xd7\x03\x04\x02\xb2\xff\ +\xd7\x03\x04\x02\xb4\xff\xd7\x03\x04\x02\xcf\xff\xc3\x03\x04\x02\ +\xe0\xff\xd7\x03\x04\x02\xf0\xff\xd7\x03\x04\x02\xf2\xff\xd7\x03\ +\x04\x02\xf4\xff\xd7\x03\x04\x03\x0a\xff\xd7\x03\x04\x03\x0c\xff\ +\xd7\x03\x04\x03\x12\xff\xc3\x03\x04\x03\x16\xff\xd7\x03\x04\x03\ +\x1a\xff\xd7\x03\x04\x03\x1c\xff\xc3\x03\x05\x01\x9f\xff\xd7\x03\ +\x05\x01\xa3\x00\xe1\x03\x05\x01\xb8\xff\xd7\x03\x05\x01\xbb\xff\ +\xd7\x03\x05\x01\xbe\xff\xc3\x03\x05\x01\xdc\xff\xd7\x03\x05\x01\ +\xe1\xff\xae\x03\x05\x01\xe4\xff\xd7\x03\x05\x02l\xff\xd7\x03\ +\x05\x02{\x00=\x03\x05\x02}\xff\xec\x03\x05\x02~\xff\ +\xd7\x03\x05\x02\x84\xff\xd7\x03\x05\x02\x86\xff\xd7\x03\x05\x02\ +\x88\xff\xd7\x03\x05\x02\x8a\xff\xd7\x03\x05\x02\x8c\xff\xd7\x03\ +\x05\x02\xaa\xff\xd7\x03\x05\x02\xb1\xff\xd7\x03\x05\x02\xb3\xff\ +\xd7\x03\x05\x02\xb6\xff\xd7\x03\x05\x02\xbe\xff\xd7\x03\x05\x02\ +\xc0\xff\xae\x03\x05\x02\xc2\xff\xae\x03\x05\x02\xc5\xff\xc3\x03\ +\x05\x02\xc6\xff\xd7\x03\x05\x02\xc7\xff\xc3\x03\x05\x02\xc8\xff\ +\xd7\x03\x05\x02\xd5\xff\xae\x03\x05\x02\xef\xff\xd7\x03\x05\x02\ +\xf1\xff\xd7\x03\x05\x02\xf3\xff\xd7\x03\x05\x02\xfe\xff\xae\x03\ +\x05\x03\x0e\xff\xd7\x03\x05\x03\x10\xff\xd7\x03\x05\x03\x15\xff\ +\xd7\x03\x05\x03\x18\xff\xd7\x03\x06\x01\xcf\xff\xec\x03\x06\x01\ +\xd8\xff\xec\x03\x06\x01\xdb\xff\xec\x03\x06\x01\xde\xff\xec\x03\ +\x06\x01\xe1\xff\xec\x03\x06\x01\xea\xff\xec\x03\x06\x01\xed\xff\ +\xec\x03\x06\x02j\xff\xec\x03\x06\x02\x7f\xff\xec\x03\x06\x02\ +\x85\xff\xec\x03\x06\x02\x87\xff\xec\x03\x06\x02\x89\xff\xec\x03\ +\x06\x02\x8d\xff\xec\x03\x06\x02\xb2\xff\xec\x03\x06\x02\xb4\xff\ +\xec\x03\x06\x02\xc0\xff\xec\x03\x06\x02\xc2\xff\xec\x03\x06\x02\ +\xd5\xff\xec\x03\x06\x02\xe0\xff\xec\x03\x06\x02\xf0\xff\xec\x03\ +\x06\x02\xf2\xff\xec\x03\x06\x02\xf4\xff\xec\x03\x06\x02\xfe\xff\ +\xec\x03\x06\x03\x0a\xff\xec\x03\x06\x03\x0c\xff\xec\x03\x06\x03\ +\x0e\xff\xd7\x03\x06\x03\x10\xff\xd7\x03\x06\x03\x16\xff\xec\x03\ +\x06\x03\x1a\xff\xec\x03\x07\x01\x9f\xff\xd7\x03\x07\x01\xb8\xff\ +\xd7\x03\x07\x01\xbb\xff\xd7\x03\x07\x01\xbe\xff\xd7\x03\x07\x01\ +\xc1\xff\xd7\x03\x07\x01\xe1\xff\xd7\x03\x07\x02l\xff\xd7\x03\ +\x07\x02|\xff\xd7\x03\x07\x02~\xff\xd7\x03\x07\x02\x84\xff\ +\xd7\x03\x07\x02\x86\xff\xd7\x03\x07\x02\x88\xff\xd7\x03\x07\x02\ +\x8a\xff\xd7\x03\x07\x02\x8c\xff\xd7\x03\x07\x02\xb1\xff\xd7\x03\ +\x07\x02\xb3\xff\xd7\x03\x07\x02\xbf\xff\xd7\x03\x07\x02\xc0\xff\ +\xd7\x03\x07\x02\xc1\xff\xd7\x03\x07\x02\xc2\xff\xd7\x03\x07\x02\ +\xc5\xff\x9a\x03\x07\x02\xc7\xff\x9a\x03\x07\x02\xd4\xff\xd7\x03\ +\x07\x02\xd5\xff\xd7\x03\x07\x02\xef\xff\xd7\x03\x07\x02\xf1\xff\ +\xd7\x03\x07\x02\xf3\xff\xd7\x03\x07\x02\xfd\xff\xd7\x03\x07\x02\ +\xfe\xff\xd7\x03\x07\x03\x09\xff\xd7\x03\x07\x03\x0b\xff\xd7\x03\ +\x07\x03\x0e\xff\xd7\x03\x07\x03\x10\xff\xd7\x03\x07\x03\x15\xff\ +\xd7\x03\x07\x03\x19\xff\xec\x03\x08\x01\xcf\xff\xec\x03\x08\x01\ +\xd8\xff\xec\x03\x08\x01\xdb\xff\xec\x03\x08\x01\xde\xff\xec\x03\ +\x08\x01\xe1\xff\xec\x03\x08\x01\xea\xff\xec\x03\x08\x01\xed\xff\ +\xec\x03\x08\x02j\xff\xec\x03\x08\x02\x7f\xff\xec\x03\x08\x02\ +\x85\xff\xec\x03\x08\x02\x87\xff\xec\x03\x08\x02\x89\xff\xec\x03\ +\x08\x02\x8d\xff\xec\x03\x08\x02\xb2\xff\xec\x03\x08\x02\xb4\xff\ +\xec\x03\x08\x02\xc0\xff\xec\x03\x08\x02\xc2\xff\xec\x03\x08\x02\ +\xd5\xff\xec\x03\x08\x02\xe0\xff\xec\x03\x08\x02\xf0\xff\xec\x03\ +\x08\x02\xf2\xff\xec\x03\x08\x02\xf4\xff\xec\x03\x08\x02\xfe\xff\ +\xec\x03\x08\x03\x0a\xff\xec\x03\x08\x03\x0c\xff\xec\x03\x08\x03\ +\x0e\xff\xd7\x03\x08\x03\x10\xff\xd7\x03\x08\x03\x16\xff\xec\x03\ +\x08\x03\x1a\xff\xec\x03\x0b\x00\x05\xff\x9a\x03\x0b\x00\x0a\xff\ +\x9a\x03\x0b\x01\x9d\xff\xae\x03\x0b\x01\xa6\xff\xae\x03\x0b\x01\ +\xa8\xff\xc3\x03\x0b\x01\xaa\xff\xc3\x03\x0b\x01\xb0\xff\xc3\x03\ +\x0b\x01\xbc\xffq\x03\x0b\x01\xbd\xff\xc3\x03\x0b\x01\xbf\xff\ +\xc3\x03\x0b\x01\xc1\xff\xc3\x03\x0b\x01\xc4\xff\xae\x03\x0b\x01\ +\xd0\xff\xd7\x03\x0b\x01\xdc\xff\xc3\x03\x0b\x01\xdf\xff\xd7\x03\ +\x0b\x01\xe1\xff\xd7\x03\x0b\x01\xe4\xff\xc3\x03\x0b\x02\x07\xff\ +\x9a\x03\x0b\x02\x0b\xff\x9a\x03\x0b\x02r\xff\xc3\x03\x0b\x02\ +v\xff\xd7\x03\x0b\x02|\xff\xc3\x03\x0b\x02\x80\xff\xc3\x03\ +\x0b\x02\x82\xff\xc3\x03\x0b\x02\x9f\xff\xc3\x03\x0b\x02\xa0\xff\ +\xd7\x03\x0b\x02\xa9\xff\xae\x03\x0b\x02\xaa\xff\xc3\x03\x0b\x02\ +\xb5\xffq\x03\x0b\x02\xb6\xff\xc3\x03\x0b\x02\xb7\xff\xc3\x03\ +\x0b\x02\xb9\xff\xc3\x03\x0b\x02\xbb\xff\xc3\x03\x0b\x02\xbc\xff\ +\xd7\x03\x0b\x02\xbd\xff\xae\x03\x0b\x02\xbe\xff\xc3\x03\x0b\x02\ +\xbf\xff\xc3\x03\x0b\x02\xc0\xff\xd7\x03\x0b\x02\xc1\xff\xc3\x03\ +\x0b\x02\xc2\xff\xd7\x03\x0b\x02\xca\xff\xc3\x03\x0b\x02\xcb\xff\ +\xd7\x03\x0b\x02\xd4\xff\xc3\x03\x0b\x02\xd5\xff\xd7\x03\x0b\x02\ +\xd9\xff\xc3\x03\x0b\x02\xdb\xff\xc3\x03\x0b\x02\xdd\xff\xc3\x03\ +\x0b\x02\xe5\xff\xc3\x03\x0b\x02\xe6\xff\xd7\x03\x0b\x02\xf7\xff\ +\xc3\x03\x0b\x02\xf9\xff\xc3\x03\x0b\x02\xfb\xff\xc3\x03\x0b\x02\ +\xfd\xff\xc3\x03\x0b\x02\xfe\xff\xd7\x03\x0b\x03\x05\xff\xc3\x03\ +\x0b\x03\x06\xff\xd7\x03\x0b\x03\x07\xff\xc3\x03\x0b\x03\x08\xff\ +\xd7\x03\x0b\x03\x0d\xff\xd7\x03\x0b\x03\x0e\xff\xd7\x03\x0b\x03\ +\x0f\xff\xd7\x03\x0b\x03\x10\xff\xd7\x03\x0b\x03\x17\xff\xae\x03\ +\x0b\x03\x18\xff\xc3\x03\x0c\x00\x05\xff\x9a\x03\x0c\x00\x0a\xff\ +\x9a\x03\x0c\x01\xd0\xff\xd7\x03\x0c\x01\xdc\xff\xc3\x03\x0c\x01\ +\xdd\xff\xd7\x03\x0c\x01\xdf\xff\xd7\x03\x0c\x01\xe1\xff\xd7\x03\ +\x0c\x01\xe4\xff\xc3\x03\x0c\x01\xf6\xff\xd7\x03\x0c\x02\x07\xff\ +\x9a\x03\x0c\x02\x0b\xff\x9a\x03\x0c\x02\xa0\xff\xd7\x03\x0c\x02\ +\xaa\xff\xc3\x03\x0c\x02\xb6\xff\xc3\x03\x0c\x02\xbc\xff\xd7\x03\ +\x0c\x02\xbe\xff\xc3\x03\x0c\x02\xc0\xff\xd7\x03\x0c\x02\xc2\xff\ +\xd7\x03\x0c\x02\xcb\xff\xd7\x03\x0c\x02\xd5\xff\xd7\x03\x0c\x02\ +\xe6\xff\xd7\x03\x0c\x02\xf8\xff\xd7\x03\x0c\x02\xfa\xff\xd7\x03\ +\x0c\x02\xfc\xff\xd7\x03\x0c\x02\xfe\xff\xd7\x03\x0c\x03\x06\xff\ +\xd7\x03\x0c\x03\x08\xff\xd7\x03\x0c\x03\x0e\xff\x9a\x03\x0c\x03\ +\x10\xff\x9a\x03\x0c\x03\x18\xff\xc3\x03\x0d\x00\x05\xff\x9a\x03\ +\x0d\x00\x0a\xff\x9a\x03\x0d\x01\x9d\xff\xae\x03\x0d\x01\xa6\xff\ +\xae\x03\x0d\x01\xa8\xff\xc3\x03\x0d\x01\xaa\xff\xc3\x03\x0d\x01\ +\xb0\xff\xc3\x03\x0d\x01\xbc\xffq\x03\x0d\x01\xbd\xff\xc3\x03\ +\x0d\x01\xbf\xff\xc3\x03\x0d\x01\xc1\xff\xc3\x03\x0d\x01\xc4\xff\ +\xae\x03\x0d\x01\xd0\xff\xd7\x03\x0d\x01\xdc\xff\xc3\x03\x0d\x01\ +\xdf\xff\xd7\x03\x0d\x01\xe1\xff\xd7\x03\x0d\x01\xe4\xff\xc3\x03\ +\x0d\x02\x07\xff\x9a\x03\x0d\x02\x0b\xff\x9a\x03\x0d\x02r\xff\ +\xc3\x03\x0d\x02v\xff\xd7\x03\x0d\x02|\xff\xc3\x03\x0d\x02\ +\x80\xff\xc3\x03\x0d\x02\x82\xff\xc3\x03\x0d\x02\x9f\xff\xc3\x03\ +\x0d\x02\xa0\xff\xd7\x03\x0d\x02\xa9\xff\xae\x03\x0d\x02\xaa\xff\ +\xc3\x03\x0d\x02\xb5\xffq\x03\x0d\x02\xb6\xff\xc3\x03\x0d\x02\ +\xb7\xff\xc3\x03\x0d\x02\xb9\xff\xc3\x03\x0d\x02\xbb\xff\xc3\x03\ +\x0d\x02\xbc\xff\xd7\x03\x0d\x02\xbd\xff\xae\x03\x0d\x02\xbe\xff\ +\xc3\x03\x0d\x02\xbf\xff\xc3\x03\x0d\x02\xc0\xff\xd7\x03\x0d\x02\ +\xc1\xff\xc3\x03\x0d\x02\xc2\xff\xd7\x03\x0d\x02\xca\xff\xc3\x03\ +\x0d\x02\xcb\xff\xd7\x03\x0d\x02\xd4\xff\xc3\x03\x0d\x02\xd5\xff\ +\xd7\x03\x0d\x02\xd9\xff\xc3\x03\x0d\x02\xdb\xff\xc3\x03\x0d\x02\ +\xdd\xff\xc3\x03\x0d\x02\xe5\xff\xc3\x03\x0d\x02\xe6\xff\xd7\x03\ +\x0d\x02\xf7\xff\xc3\x03\x0d\x02\xf9\xff\xc3\x03\x0d\x02\xfb\xff\ +\xc3\x03\x0d\x02\xfd\xff\xc3\x03\x0d\x02\xfe\xff\xd7\x03\x0d\x03\ +\x05\xff\xc3\x03\x0d\x03\x06\xff\xd7\x03\x0d\x03\x07\xff\xc3\x03\ +\x0d\x03\x08\xff\xd7\x03\x0d\x03\x0d\xff\xd7\x03\x0d\x03\x0e\xff\ +\xd7\x03\x0d\x03\x0f\xff\xd7\x03\x0d\x03\x10\xff\xd7\x03\x0d\x03\ +\x17\xff\xae\x03\x0d\x03\x18\xff\xc3\x03\x0e\x00\x05\xff\x9a\x03\ +\x0e\x00\x0a\xff\x9a\x03\x0e\x01\xd0\xff\xd7\x03\x0e\x01\xdc\xff\ +\xc3\x03\x0e\x01\xdd\xff\xd7\x03\x0e\x01\xdf\xff\xd7\x03\x0e\x01\ +\xe1\xff\xd7\x03\x0e\x01\xe4\xff\xc3\x03\x0e\x01\xf6\xff\xd7\x03\ +\x0e\x02\x07\xff\x9a\x03\x0e\x02\x0b\xff\x9a\x03\x0e\x02\xa0\xff\ +\xd7\x03\x0e\x02\xaa\xff\xc3\x03\x0e\x02\xb6\xff\xc3\x03\x0e\x02\ +\xbc\xff\xd7\x03\x0e\x02\xbe\xff\xc3\x03\x0e\x02\xc0\xff\xd7\x03\ +\x0e\x02\xc2\xff\xd7\x03\x0e\x02\xcb\xff\xd7\x03\x0e\x02\xd5\xff\ +\xd7\x03\x0e\x02\xe6\xff\xd7\x03\x0e\x02\xf8\xff\xd7\x03\x0e\x02\ +\xfa\xff\xd7\x03\x0e\x02\xfc\xff\xd7\x03\x0e\x02\xfe\xff\xd7\x03\ +\x0e\x03\x06\xff\xd7\x03\x0e\x03\x08\xff\xd7\x03\x0e\x03\x0e\xff\ +\x9a\x03\x0e\x03\x10\xff\x9a\x03\x0e\x03\x18\xff\xc3\x03\x0f\x01\ +\xa3\x00\xe1\x03\x0f\x02\xea\x00)\x03\x0f\x03\x0e\xff\xd7\x03\ +\x0f\x03\x10\xff\xd7\x03\x10\x00\x05\xff\xec\x03\x10\x00\x0a\xff\ +\xec\x03\x10\x02\x07\xff\xec\x03\x10\x02\x0b\xff\xec\x03\x11\x00\ +\x05\xff\x9a\x03\x11\x00\x0a\xff\x9a\x03\x11\x01\x9d\xff\xae\x03\ +\x11\x01\xa6\xff\xae\x03\x11\x01\xa8\xff\xc3\x03\x11\x01\xaa\xff\ +\xc3\x03\x11\x01\xb0\xff\xc3\x03\x11\x01\xbc\xffq\x03\x11\x01\ +\xbd\xff\xc3\x03\x11\x01\xbf\xff\xc3\x03\x11\x01\xc1\xff\xc3\x03\ +\x11\x01\xc4\xff\xae\x03\x11\x01\xd0\xff\xd7\x03\x11\x01\xdc\xff\ +\xc3\x03\x11\x01\xdf\xff\xd7\x03\x11\x01\xe1\xff\xd7\x03\x11\x01\ +\xe4\xff\xc3\x03\x11\x02\x07\xff\x9a\x03\x11\x02\x0b\xff\x9a\x03\ +\x11\x02r\xff\xc3\x03\x11\x02v\xff\xd7\x03\x11\x02|\xff\ +\xc3\x03\x11\x02\x80\xff\xc3\x03\x11\x02\x82\xff\xc3\x03\x11\x02\ +\x9f\xff\xc3\x03\x11\x02\xa0\xff\xd7\x03\x11\x02\xa9\xff\xae\x03\ +\x11\x02\xaa\xff\xc3\x03\x11\x02\xb5\xffq\x03\x11\x02\xb6\xff\ +\xc3\x03\x11\x02\xb7\xff\xc3\x03\x11\x02\xb9\xff\xc3\x03\x11\x02\ +\xbb\xff\xc3\x03\x11\x02\xbc\xff\xd7\x03\x11\x02\xbd\xff\xae\x03\ +\x11\x02\xbe\xff\xc3\x03\x11\x02\xbf\xff\xc3\x03\x11\x02\xc0\xff\ +\xd7\x03\x11\x02\xc1\xff\xc3\x03\x11\x02\xc2\xff\xd7\x03\x11\x02\ +\xca\xff\xc3\x03\x11\x02\xcb\xff\xd7\x03\x11\x02\xd4\xff\xc3\x03\ +\x11\x02\xd5\xff\xd7\x03\x11\x02\xd9\xff\xc3\x03\x11\x02\xdb\xff\ +\xc3\x03\x11\x02\xdd\xff\xc3\x03\x11\x02\xe5\xff\xc3\x03\x11\x02\ +\xe6\xff\xd7\x03\x11\x02\xf7\xff\xc3\x03\x11\x02\xf9\xff\xc3\x03\ +\x11\x02\xfb\xff\xc3\x03\x11\x02\xfd\xff\xc3\x03\x11\x02\xfe\xff\ +\xd7\x03\x11\x03\x05\xff\xc3\x03\x11\x03\x06\xff\xd7\x03\x11\x03\ +\x07\xff\xc3\x03\x11\x03\x08\xff\xd7\x03\x11\x03\x0d\xff\xd7\x03\ +\x11\x03\x0e\xff\xd7\x03\x11\x03\x0f\xff\xd7\x03\x11\x03\x10\xff\ +\xd7\x03\x11\x03\x17\xff\xae\x03\x11\x03\x18\xff\xc3\x03\x12\x00\ +\x05\xff\x9a\x03\x12\x00\x0a\xff\x9a\x03\x12\x01\xd0\xff\xd7\x03\ +\x12\x01\xdc\xff\xc3\x03\x12\x01\xdd\xff\xd7\x03\x12\x01\xdf\xff\ +\xd7\x03\x12\x01\xe1\xff\xd7\x03\x12\x01\xe4\xff\xc3\x03\x12\x01\ +\xf6\xff\xd7\x03\x12\x02\x07\xff\x9a\x03\x12\x02\x0b\xff\x9a\x03\ +\x12\x02\xa0\xff\xd7\x03\x12\x02\xaa\xff\xc3\x03\x12\x02\xb6\xff\ +\xc3\x03\x12\x02\xbc\xff\xd7\x03\x12\x02\xbe\xff\xc3\x03\x12\x02\ +\xc0\xff\xd7\x03\x12\x02\xc2\xff\xd7\x03\x12\x02\xcb\xff\xd7\x03\ +\x12\x02\xd5\xff\xd7\x03\x12\x02\xe6\xff\xd7\x03\x12\x02\xf8\xff\ +\xd7\x03\x12\x02\xfa\xff\xd7\x03\x12\x02\xfc\xff\xd7\x03\x12\x02\ +\xfe\xff\xd7\x03\x12\x03\x06\xff\xd7\x03\x12\x03\x08\xff\xd7\x03\ +\x12\x03\x0e\xff\x9a\x03\x12\x03\x10\xff\x9a\x03\x12\x03\x18\xff\ +\xc3\x03\x13\x00\x05\xff\x9a\x03\x13\x00\x0a\xff\x9a\x03\x13\x01\ +\x9d\xff\xae\x03\x13\x01\xa6\xff\xae\x03\x13\x01\xa8\xff\xc3\x03\ +\x13\x01\xaa\xff\xc3\x03\x13\x01\xb0\xff\xc3\x03\x13\x01\xbc\xff\ +q\x03\x13\x01\xbd\xff\xc3\x03\x13\x01\xbf\xff\xc3\x03\x13\x01\ +\xc1\xff\xc3\x03\x13\x01\xc4\xff\xae\x03\x13\x01\xd0\xff\xd7\x03\ +\x13\x01\xdc\xff\xc3\x03\x13\x01\xdf\xff\xd7\x03\x13\x01\xe1\xff\ +\xd7\x03\x13\x01\xe4\xff\xc3\x03\x13\x02\x07\xff\x9a\x03\x13\x02\ +\x0b\xff\x9a\x03\x13\x02r\xff\xc3\x03\x13\x02v\xff\xd7\x03\ +\x13\x02|\xff\xc3\x03\x13\x02\x80\xff\xc3\x03\x13\x02\x82\xff\ +\xc3\x03\x13\x02\x9f\xff\xc3\x03\x13\x02\xa0\xff\xd7\x03\x13\x02\ +\xa9\xff\xae\x03\x13\x02\xaa\xff\xc3\x03\x13\x02\xb5\xffq\x03\ +\x13\x02\xb6\xff\xc3\x03\x13\x02\xb7\xff\xc3\x03\x13\x02\xb9\xff\ +\xc3\x03\x13\x02\xbb\xff\xc3\x03\x13\x02\xbc\xff\xd7\x03\x13\x02\ +\xbd\xff\xae\x03\x13\x02\xbe\xff\xc3\x03\x13\x02\xbf\xff\xc3\x03\ +\x13\x02\xc0\xff\xd7\x03\x13\x02\xc1\xff\xc3\x03\x13\x02\xc2\xff\ +\xd7\x03\x13\x02\xca\xff\xc3\x03\x13\x02\xcb\xff\xd7\x03\x13\x02\ +\xd4\xff\xc3\x03\x13\x02\xd5\xff\xd7\x03\x13\x02\xd9\xff\xc3\x03\ +\x13\x02\xdb\xff\xc3\x03\x13\x02\xdd\xff\xc3\x03\x13\x02\xe5\xff\ +\xc3\x03\x13\x02\xe6\xff\xd7\x03\x13\x02\xf7\xff\xc3\x03\x13\x02\ +\xf9\xff\xc3\x03\x13\x02\xfb\xff\xc3\x03\x13\x02\xfd\xff\xc3\x03\ +\x13\x02\xfe\xff\xd7\x03\x13\x03\x05\xff\xc3\x03\x13\x03\x06\xff\ +\xd7\x03\x13\x03\x07\xff\xc3\x03\x13\x03\x08\xff\xd7\x03\x13\x03\ +\x0d\xff\xd7\x03\x13\x03\x0e\xff\xd7\x03\x13\x03\x0f\xff\xd7\x03\ +\x13\x03\x10\xff\xd7\x03\x13\x03\x17\xff\xae\x03\x13\x03\x18\xff\ +\xc3\x03\x14\x00\x05\xff\x9a\x03\x14\x00\x0a\xff\x9a\x03\x14\x01\ +\xd0\xff\xd7\x03\x14\x01\xdc\xff\xc3\x03\x14\x01\xdd\xff\xd7\x03\ +\x14\x01\xdf\xff\xd7\x03\x14\x01\xe1\xff\xd7\x03\x14\x01\xe4\xff\ +\xc3\x03\x14\x01\xf6\xff\xd7\x03\x14\x02\x07\xff\x9a\x03\x14\x02\ +\x0b\xff\x9a\x03\x14\x02\xa0\xff\xd7\x03\x14\x02\xaa\xff\xc3\x03\ +\x14\x02\xb6\xff\xc3\x03\x14\x02\xbc\xff\xd7\x03\x14\x02\xbe\xff\ +\xc3\x03\x14\x02\xc0\xff\xd7\x03\x14\x02\xc2\xff\xd7\x03\x14\x02\ +\xcb\xff\xd7\x03\x14\x02\xd5\xff\xd7\x03\x14\x02\xe6\xff\xd7\x03\ +\x14\x02\xf8\xff\xd7\x03\x14\x02\xfa\xff\xd7\x03\x14\x02\xfc\xff\ +\xd7\x03\x14\x02\xfe\xff\xd7\x03\x14\x03\x06\xff\xd7\x03\x14\x03\ +\x08\xff\xd7\x03\x14\x03\x0e\xff\x9a\x03\x14\x03\x10\xff\x9a\x03\ +\x14\x03\x18\xff\xc3\x03\x15\x00\x0f\xff\xae\x03\x15\x00\x11\xff\ +\xae\x03\x15\x01\xaa\xff\xec\x03\x15\x01\xb0\xff\xd7\x03\x15\x01\ +\xbc\xff\xd7\x03\x15\x01\xbf\xff\xd7\x03\x15\x02\x08\xff\xae\x03\ +\x15\x02\x0c\xff\xae\x03\x15\x02r\xff\xec\x03\x15\x02\x80\xff\ +\xec\x03\x15\x02\x82\xff\xec\x03\x15\x02\x9f\xff\xd7\x03\x15\x02\ +\xb5\xff\xd7\x03\x15\x02\xb7\xff\xec\x03\x15\x02\xb9\xff\xec\x03\ +\x15\x02\xbb\xff\xd7\x03\x15\x02\xca\xff\xd7\x03\x15\x02\xd9\xff\ +\xec\x03\x15\x02\xdb\xff\xec\x03\x15\x02\xdd\xff\xec\x03\x15\x02\ +\xe5\xff\xd7\x03\x15\x03\x05\xff\xd7\x03\x15\x03\x07\xff\xd7\x03\ +\x16\x00\x05\xff\xd7\x03\x16\x00\x0a\xff\xd7\x03\x16\x01\xd0\xff\ +\xec\x03\x16\x01\xdd\xff\xec\x03\x16\x01\xdf\xff\xec\x03\x16\x01\ +\xf6\xff\xec\x03\x16\x02\x07\xff\xd7\x03\x16\x02\x0b\xff\xd7\x03\ +\x16\x02\xa0\xff\xec\x03\x16\x02\xbc\xff\xec\x03\x16\x02\xcb\xff\ +\xec\x03\x16\x02\xe6\xff\xec\x03\x16\x02\xf8\xff\xec\x03\x16\x02\ +\xfa\xff\xec\x03\x16\x02\xfc\xff\xec\x03\x16\x03\x06\xff\xec\x03\ +\x16\x03\x08\xff\xec\x03\x16\x03\x0e\xff\xd7\x03\x16\x03\x10\xff\ +\xd7\x03\x17\x00\x05\xff\xae\x03\x17\x00\x0a\xff\xae\x03\x17\x01\ +\x9d\xff\xc3\x03\x17\x01\xa6\xff\xc3\x03\x17\x01\xaa\xff\xd7\x03\ +\x17\x01\xb0\xff\xd7\x03\x17\x01\xbc\xff\xc3\x03\x17\x01\xbf\xff\ +\xd7\x03\x17\x01\xc1\xff\xd7\x03\x17\x01\xc4\xff\xc3\x03\x17\x01\ +\xdc\xff\xd7\x03\x17\x01\xe4\xff\xd7\x03\x17\x02\x07\xff\xae\x03\ +\x17\x02\x0b\xff\xae\x03\x17\x02r\xff\xd7\x03\x17\x02|\xff\ +\xd7\x03\x17\x02\x80\xff\xd7\x03\x17\x02\x82\xff\xd7\x03\x17\x02\ +\x9f\xff\xd7\x03\x17\x02\xa9\xff\xc3\x03\x17\x02\xaa\xff\xd7\x03\ +\x17\x02\xb5\xff\xc3\x03\x17\x02\xb6\xff\xd7\x03\x17\x02\xb7\xff\ +\xd7\x03\x17\x02\xb9\xff\xd7\x03\x17\x02\xbb\xff\xd7\x03\x17\x02\ +\xbd\xff\xc3\x03\x17\x02\xbe\xff\xd7\x03\x17\x02\xbf\xff\xd7\x03\ +\x17\x02\xc1\xff\xd7\x03\x17\x02\xca\xff\xd7\x03\x17\x02\xd4\xff\ +\xd7\x03\x17\x02\xd9\xff\xd7\x03\x17\x02\xdb\xff\xd7\x03\x17\x02\ +\xdd\xff\xd7\x03\x17\x02\xe5\xff\xd7\x03\x17\x02\xfd\xff\xd7\x03\ +\x17\x03\x05\xff\xd7\x03\x17\x03\x07\xff\xd7\x03\x17\x03\x0d\xff\ +\xd7\x03\x17\x03\x0f\xff\xd7\x03\x17\x03\x17\xff\xc3\x03\x17\x03\ +\x18\xff\xd7\x03\x18\x00\x05\xff\x9a\x03\x18\x00\x0a\xff\x9a\x03\ +\x18\x01\xd0\xff\xd7\x03\x18\x01\xdc\xff\xc3\x03\x18\x01\xdd\xff\ +\xd7\x03\x18\x01\xdf\xff\xd7\x03\x18\x01\xe1\xff\xd7\x03\x18\x01\ +\xe4\xff\xc3\x03\x18\x01\xf6\xff\xd7\x03\x18\x02\x07\xff\x9a\x03\ +\x18\x02\x0b\xff\x9a\x03\x18\x02\xa0\xff\xd7\x03\x18\x02\xaa\xff\ +\xc3\x03\x18\x02\xb6\xff\xc3\x03\x18\x02\xbc\xff\xd7\x03\x18\x02\ +\xbe\xff\xc3\x03\x18\x02\xc0\xff\xd7\x03\x18\x02\xc2\xff\xd7\x03\ +\x18\x02\xcb\xff\xd7\x03\x18\x02\xd5\xff\xd7\x03\x18\x02\xe6\xff\ +\xd7\x03\x18\x02\xf8\xff\xd7\x03\x18\x02\xfa\xff\xd7\x03\x18\x02\ +\xfc\xff\xd7\x03\x18\x02\xfe\xff\xd7\x03\x18\x03\x06\xff\xd7\x03\ +\x18\x03\x08\xff\xd7\x03\x18\x03\x0e\xff\x9a\x03\x18\x03\x10\xff\ +\x9a\x03\x18\x03\x18\xff\xc3\x03\x19\x01\xe1\xff\xd7\x03\x19\x02\ +\xc0\xff\xd7\x03\x19\x02\xc2\xff\xd7\x03\x19\x02\xd5\xff\xd7\x03\ +\x19\x02\xfe\xff\xd7\x03\x1b\x01\xa3\x00\xe1\x03\x1b\x02\xea\x00\ +)\x03\x1b\x03\x0e\xff\xd7\x03\x1b\x03\x10\xff\xd7\x03\x1c\x00\ +\x05\xff\xec\x03\x1c\x00\x0a\xff\xec\x03\x1c\x02\x07\xff\xec\x03\ +\x1c\x02\x0b\xff\xec\x03\x1d\x00\x05\xffq\x03\x1d\x00\x0a\xff\ +q\x03\x1d\x00&\xff\xd7\x03\x1d\x00*\xff\xd7\x03\x1d\x00\ +-\x01\x0a\x03\x1d\x002\xff\xd7\x03\x1d\x004\xff\xd7\x03\ +\x1d\x007\xffq\x03\x1d\x009\xff\xae\x03\x1d\x00:\xff\ +\xae\x03\x1d\x00<\xff\x85\x03\x1d\x00\x89\xff\xd7\x03\x1d\x00\ +\x94\xff\xd7\x03\x1d\x00\x95\xff\xd7\x03\x1d\x00\x96\xff\xd7\x03\ +\x1d\x00\x97\xff\xd7\x03\x1d\x00\x98\xff\xd7\x03\x1d\x00\x9a\xff\ +\xd7\x03\x1d\x00\x9f\xff\x85\x03\x1d\x00\xc8\xff\xd7\x03\x1d\x00\ +\xca\xff\xd7\x03\x1d\x00\xcc\xff\xd7\x03\x1d\x00\xce\xff\xd7\x03\ +\x1d\x00\xde\xff\xd7\x03\x1d\x00\xe0\xff\xd7\x03\x1d\x00\xe2\xff\ +\xd7\x03\x1d\x00\xe4\xff\xd7\x03\x1d\x01\x0e\xff\xd7\x03\x1d\x01\ +\x10\xff\xd7\x03\x1d\x01\x12\xff\xd7\x03\x1d\x01\x14\xff\xd7\x03\ +\x1d\x01$\xffq\x03\x1d\x01&\xffq\x03\x1d\x016\xff\ +\xae\x03\x1d\x018\xff\x85\x03\x1d\x01:\xff\x85\x03\x1d\x01\ +G\xff\xd7\x03\x1d\x01\xfa\xff\xae\x03\x1d\x01\xfc\xff\xae\x03\ +\x1d\x01\xfe\xff\xae\x03\x1d\x02\x00\xff\x85\x03\x1d\x02\x07\xff\ +q\x03\x1d\x02\x0b\xffq\x03\x1d\x02_\xff\xd7\x03\x1d\x03\ +I\xff\xd7\x03\x1d\x03K\xff\xd7\x03\x1d\x03M\xff\xd7\x03\ +\x1d\x03O\xff\xd7\x03\x1d\x03Q\xff\xd7\x03\x1d\x03S\xff\ +\xd7\x03\x1d\x03U\xff\xd7\x03\x1d\x03W\xff\xd7\x03\x1d\x03\ +Y\xff\xd7\x03\x1d\x03[\xff\xd7\x03\x1d\x03]\xff\xd7\x03\ +\x1d\x03_\xff\xd7\x03\x1d\x03o\xff\x85\x03\x1d\x03q\xff\ +\x85\x03\x1d\x03s\xff\x85\x03\x1d\x03\x8f\xffq\x03\x1e\x00\ +\x05\xff\xec\x03\x1e\x00\x0a\xff\xec\x03\x1e\x02\x07\xff\xec\x03\ +\x1e\x02\x0b\xff\xec\x03\x1f\x00\x05\xffq\x03\x1f\x00\x0a\xff\ +q\x03\x1f\x00&\xff\xd7\x03\x1f\x00*\xff\xd7\x03\x1f\x00\ +-\x01\x0a\x03\x1f\x002\xff\xd7\x03\x1f\x004\xff\xd7\x03\ +\x1f\x007\xffq\x03\x1f\x009\xff\xae\x03\x1f\x00:\xff\ +\xae\x03\x1f\x00<\xff\x85\x03\x1f\x00\x89\xff\xd7\x03\x1f\x00\ +\x94\xff\xd7\x03\x1f\x00\x95\xff\xd7\x03\x1f\x00\x96\xff\xd7\x03\ +\x1f\x00\x97\xff\xd7\x03\x1f\x00\x98\xff\xd7\x03\x1f\x00\x9a\xff\ +\xd7\x03\x1f\x00\x9f\xff\x85\x03\x1f\x00\xc8\xff\xd7\x03\x1f\x00\ +\xca\xff\xd7\x03\x1f\x00\xcc\xff\xd7\x03\x1f\x00\xce\xff\xd7\x03\ +\x1f\x00\xde\xff\xd7\x03\x1f\x00\xe0\xff\xd7\x03\x1f\x00\xe2\xff\ +\xd7\x03\x1f\x00\xe4\xff\xd7\x03\x1f\x01\x0e\xff\xd7\x03\x1f\x01\ +\x10\xff\xd7\x03\x1f\x01\x12\xff\xd7\x03\x1f\x01\x14\xff\xd7\x03\ +\x1f\x01$\xffq\x03\x1f\x01&\xffq\x03\x1f\x016\xff\ +\xae\x03\x1f\x018\xff\x85\x03\x1f\x01:\xff\x85\x03\x1f\x01\ +G\xff\xd7\x03\x1f\x01\xfa\xff\xae\x03\x1f\x01\xfc\xff\xae\x03\ +\x1f\x01\xfe\xff\xae\x03\x1f\x02\x00\xff\x85\x03\x1f\x02\x07\xff\ +q\x03\x1f\x02\x0b\xffq\x03\x1f\x02_\xff\xd7\x03\x1f\x03\ +I\xff\xd7\x03\x1f\x03K\xff\xd7\x03\x1f\x03M\xff\xd7\x03\ +\x1f\x03O\xff\xd7\x03\x1f\x03Q\xff\xd7\x03\x1f\x03S\xff\ +\xd7\x03\x1f\x03U\xff\xd7\x03\x1f\x03W\xff\xd7\x03\x1f\x03\ +Y\xff\xd7\x03\x1f\x03[\xff\xd7\x03\x1f\x03]\xff\xd7\x03\ +\x1f\x03_\xff\xd7\x03\x1f\x03o\xff\x85\x03\x1f\x03q\xff\ +\x85\x03\x1f\x03s\xff\x85\x03\x1f\x03\x8f\xffq\x03 \x00\ +\x05\xff\xec\x03 \x00\x0a\xff\xec\x03 \x02\x07\xff\xec\x03\ + \x02\x0b\xff\xec\x03!\x00\x05\xffq\x03!\x00\x0a\xff\ +q\x03!\x00&\xff\xd7\x03!\x00*\xff\xd7\x03!\x00\ +-\x01\x0a\x03!\x002\xff\xd7\x03!\x004\xff\xd7\x03\ +!\x007\xffq\x03!\x009\xff\xae\x03!\x00:\xff\ +\xae\x03!\x00<\xff\x85\x03!\x00\x89\xff\xd7\x03!\x00\ +\x94\xff\xd7\x03!\x00\x95\xff\xd7\x03!\x00\x96\xff\xd7\x03\ +!\x00\x97\xff\xd7\x03!\x00\x98\xff\xd7\x03!\x00\x9a\xff\ +\xd7\x03!\x00\x9f\xff\x85\x03!\x00\xc8\xff\xd7\x03!\x00\ +\xca\xff\xd7\x03!\x00\xcc\xff\xd7\x03!\x00\xce\xff\xd7\x03\ +!\x00\xde\xff\xd7\x03!\x00\xe0\xff\xd7\x03!\x00\xe2\xff\ +\xd7\x03!\x00\xe4\xff\xd7\x03!\x01\x0e\xff\xd7\x03!\x01\ +\x10\xff\xd7\x03!\x01\x12\xff\xd7\x03!\x01\x14\xff\xd7\x03\ +!\x01$\xffq\x03!\x01&\xffq\x03!\x016\xff\ +\xae\x03!\x018\xff\x85\x03!\x01:\xff\x85\x03!\x01\ +G\xff\xd7\x03!\x01\xfa\xff\xae\x03!\x01\xfc\xff\xae\x03\ +!\x01\xfe\xff\xae\x03!\x02\x00\xff\x85\x03!\x02\x07\xff\ +q\x03!\x02\x0b\xffq\x03!\x02_\xff\xd7\x03!\x03\ +I\xff\xd7\x03!\x03K\xff\xd7\x03!\x03M\xff\xd7\x03\ +!\x03O\xff\xd7\x03!\x03Q\xff\xd7\x03!\x03S\xff\ +\xd7\x03!\x03U\xff\xd7\x03!\x03W\xff\xd7\x03!\x03\ +Y\xff\xd7\x03!\x03[\xff\xd7\x03!\x03]\xff\xd7\x03\ +!\x03_\xff\xd7\x03!\x03o\xff\x85\x03!\x03q\xff\ +\x85\x03!\x03s\xff\x85\x03!\x03\x8f\xffq\x03\x22\x00\ +\x05\xff\xec\x03\x22\x00\x0a\xff\xec\x03\x22\x02\x07\xff\xec\x03\ +\x22\x02\x0b\xff\xec\x03#\x00\x05\xffq\x03#\x00\x0a\xff\ +q\x03#\x00&\xff\xd7\x03#\x00*\xff\xd7\x03#\x00\ +-\x01\x0a\x03#\x002\xff\xd7\x03#\x004\xff\xd7\x03\ +#\x007\xffq\x03#\x009\xff\xae\x03#\x00:\xff\ +\xae\x03#\x00<\xff\x85\x03#\x00\x89\xff\xd7\x03#\x00\ +\x94\xff\xd7\x03#\x00\x95\xff\xd7\x03#\x00\x96\xff\xd7\x03\ +#\x00\x97\xff\xd7\x03#\x00\x98\xff\xd7\x03#\x00\x9a\xff\ +\xd7\x03#\x00\x9f\xff\x85\x03#\x00\xc8\xff\xd7\x03#\x00\ +\xca\xff\xd7\x03#\x00\xcc\xff\xd7\x03#\x00\xce\xff\xd7\x03\ +#\x00\xde\xff\xd7\x03#\x00\xe0\xff\xd7\x03#\x00\xe2\xff\ +\xd7\x03#\x00\xe4\xff\xd7\x03#\x01\x0e\xff\xd7\x03#\x01\ +\x10\xff\xd7\x03#\x01\x12\xff\xd7\x03#\x01\x14\xff\xd7\x03\ +#\x01$\xffq\x03#\x01&\xffq\x03#\x016\xff\ +\xae\x03#\x018\xff\x85\x03#\x01:\xff\x85\x03#\x01\ +G\xff\xd7\x03#\x01\xfa\xff\xae\x03#\x01\xfc\xff\xae\x03\ +#\x01\xfe\xff\xae\x03#\x02\x00\xff\x85\x03#\x02\x07\xff\ +q\x03#\x02\x0b\xffq\x03#\x02_\xff\xd7\x03#\x03\ +I\xff\xd7\x03#\x03K\xff\xd7\x03#\x03M\xff\xd7\x03\ +#\x03O\xff\xd7\x03#\x03Q\xff\xd7\x03#\x03S\xff\ +\xd7\x03#\x03U\xff\xd7\x03#\x03W\xff\xd7\x03#\x03\ +Y\xff\xd7\x03#\x03[\xff\xd7\x03#\x03]\xff\xd7\x03\ +#\x03_\xff\xd7\x03#\x03o\xff\x85\x03#\x03q\xff\ +\x85\x03#\x03s\xff\x85\x03#\x03\x8f\xffq\x03$\x00\ +\x05\xff\xec\x03$\x00\x0a\xff\xec\x03$\x02\x07\xff\xec\x03\ +$\x02\x0b\xff\xec\x03%\x00\x05\xffq\x03%\x00\x0a\xff\ +q\x03%\x00&\xff\xd7\x03%\x00*\xff\xd7\x03%\x00\ +-\x01\x0a\x03%\x002\xff\xd7\x03%\x004\xff\xd7\x03\ +%\x007\xffq\x03%\x009\xff\xae\x03%\x00:\xff\ +\xae\x03%\x00<\xff\x85\x03%\x00\x89\xff\xd7\x03%\x00\ +\x94\xff\xd7\x03%\x00\x95\xff\xd7\x03%\x00\x96\xff\xd7\x03\ +%\x00\x97\xff\xd7\x03%\x00\x98\xff\xd7\x03%\x00\x9a\xff\ +\xd7\x03%\x00\x9f\xff\x85\x03%\x00\xc8\xff\xd7\x03%\x00\ +\xca\xff\xd7\x03%\x00\xcc\xff\xd7\x03%\x00\xce\xff\xd7\x03\ +%\x00\xde\xff\xd7\x03%\x00\xe0\xff\xd7\x03%\x00\xe2\xff\ +\xd7\x03%\x00\xe4\xff\xd7\x03%\x01\x0e\xff\xd7\x03%\x01\ +\x10\xff\xd7\x03%\x01\x12\xff\xd7\x03%\x01\x14\xff\xd7\x03\ +%\x01$\xffq\x03%\x01&\xffq\x03%\x016\xff\ +\xae\x03%\x018\xff\x85\x03%\x01:\xff\x85\x03%\x01\ +G\xff\xd7\x03%\x01\xfa\xff\xae\x03%\x01\xfc\xff\xae\x03\ +%\x01\xfe\xff\xae\x03%\x02\x00\xff\x85\x03%\x02\x07\xff\ +q\x03%\x02\x0b\xffq\x03%\x02_\xff\xd7\x03%\x03\ +I\xff\xd7\x03%\x03K\xff\xd7\x03%\x03M\xff\xd7\x03\ +%\x03O\xff\xd7\x03%\x03Q\xff\xd7\x03%\x03S\xff\ +\xd7\x03%\x03U\xff\xd7\x03%\x03W\xff\xd7\x03%\x03\ +Y\xff\xd7\x03%\x03[\xff\xd7\x03%\x03]\xff\xd7\x03\ +%\x03_\xff\xd7\x03%\x03o\xff\x85\x03%\x03q\xff\ +\x85\x03%\x03s\xff\x85\x03%\x03\x8f\xffq\x03&\x00\ +\x05\xff\xec\x03&\x00\x0a\xff\xec\x03&\x02\x07\xff\xec\x03\ +&\x02\x0b\xff\xec\x03'\x00\x05\xffq\x03'\x00\x0a\xff\ +q\x03'\x00&\xff\xd7\x03'\x00*\xff\xd7\x03'\x00\ +-\x01\x0a\x03'\x002\xff\xd7\x03'\x004\xff\xd7\x03\ +'\x007\xffq\x03'\x009\xff\xae\x03'\x00:\xff\ +\xae\x03'\x00<\xff\x85\x03'\x00\x89\xff\xd7\x03'\x00\ +\x94\xff\xd7\x03'\x00\x95\xff\xd7\x03'\x00\x96\xff\xd7\x03\ +'\x00\x97\xff\xd7\x03'\x00\x98\xff\xd7\x03'\x00\x9a\xff\ +\xd7\x03'\x00\x9f\xff\x85\x03'\x00\xc8\xff\xd7\x03'\x00\ +\xca\xff\xd7\x03'\x00\xcc\xff\xd7\x03'\x00\xce\xff\xd7\x03\ +'\x00\xde\xff\xd7\x03'\x00\xe0\xff\xd7\x03'\x00\xe2\xff\ +\xd7\x03'\x00\xe4\xff\xd7\x03'\x01\x0e\xff\xd7\x03'\x01\ +\x10\xff\xd7\x03'\x01\x12\xff\xd7\x03'\x01\x14\xff\xd7\x03\ +'\x01$\xffq\x03'\x01&\xffq\x03'\x016\xff\ +\xae\x03'\x018\xff\x85\x03'\x01:\xff\x85\x03'\x01\ +G\xff\xd7\x03'\x01\xfa\xff\xae\x03'\x01\xfc\xff\xae\x03\ +'\x01\xfe\xff\xae\x03'\x02\x00\xff\x85\x03'\x02\x07\xff\ +q\x03'\x02\x0b\xffq\x03'\x02_\xff\xd7\x03'\x03\ +I\xff\xd7\x03'\x03K\xff\xd7\x03'\x03M\xff\xd7\x03\ +'\x03O\xff\xd7\x03'\x03Q\xff\xd7\x03'\x03S\xff\ +\xd7\x03'\x03U\xff\xd7\x03'\x03W\xff\xd7\x03'\x03\ +Y\xff\xd7\x03'\x03[\xff\xd7\x03'\x03]\xff\xd7\x03\ +'\x03_\xff\xd7\x03'\x03o\xff\x85\x03'\x03q\xff\ +\x85\x03'\x03s\xff\x85\x03'\x03\x8f\xffq\x03(\x00\ +\x05\xff\xec\x03(\x00\x0a\xff\xec\x03(\x02\x07\xff\xec\x03\ +(\x02\x0b\xff\xec\x03)\x00\x05\xffq\x03)\x00\x0a\xff\ +q\x03)\x00&\xff\xd7\x03)\x00*\xff\xd7\x03)\x00\ +-\x01\x0a\x03)\x002\xff\xd7\x03)\x004\xff\xd7\x03\ +)\x007\xffq\x03)\x009\xff\xae\x03)\x00:\xff\ +\xae\x03)\x00<\xff\x85\x03)\x00\x89\xff\xd7\x03)\x00\ +\x94\xff\xd7\x03)\x00\x95\xff\xd7\x03)\x00\x96\xff\xd7\x03\ +)\x00\x97\xff\xd7\x03)\x00\x98\xff\xd7\x03)\x00\x9a\xff\ +\xd7\x03)\x00\x9f\xff\x85\x03)\x00\xc8\xff\xd7\x03)\x00\ +\xca\xff\xd7\x03)\x00\xcc\xff\xd7\x03)\x00\xce\xff\xd7\x03\ +)\x00\xde\xff\xd7\x03)\x00\xe0\xff\xd7\x03)\x00\xe2\xff\ +\xd7\x03)\x00\xe4\xff\xd7\x03)\x01\x0e\xff\xd7\x03)\x01\ +\x10\xff\xd7\x03)\x01\x12\xff\xd7\x03)\x01\x14\xff\xd7\x03\ +)\x01$\xffq\x03)\x01&\xffq\x03)\x016\xff\ +\xae\x03)\x018\xff\x85\x03)\x01:\xff\x85\x03)\x01\ +G\xff\xd7\x03)\x01\xfa\xff\xae\x03)\x01\xfc\xff\xae\x03\ +)\x01\xfe\xff\xae\x03)\x02\x00\xff\x85\x03)\x02\x07\xff\ +q\x03)\x02\x0b\xffq\x03)\x02_\xff\xd7\x03)\x03\ +I\xff\xd7\x03)\x03K\xff\xd7\x03)\x03M\xff\xd7\x03\ +)\x03O\xff\xd7\x03)\x03Q\xff\xd7\x03)\x03S\xff\ +\xd7\x03)\x03U\xff\xd7\x03)\x03W\xff\xd7\x03)\x03\ +Y\xff\xd7\x03)\x03[\xff\xd7\x03)\x03]\xff\xd7\x03\ +)\x03_\xff\xd7\x03)\x03o\xff\x85\x03)\x03q\xff\ +\x85\x03)\x03s\xff\x85\x03)\x03\x8f\xffq\x03*\x00\ +\x05\xff\xec\x03*\x00\x0a\xff\xec\x03*\x02\x07\xff\xec\x03\ +*\x02\x0b\xff\xec\x03+\x00\x05\xffq\x03+\x00\x0a\xff\ +q\x03+\x00&\xff\xd7\x03+\x00*\xff\xd7\x03+\x00\ +-\x01\x0a\x03+\x002\xff\xd7\x03+\x004\xff\xd7\x03\ ++\x007\xffq\x03+\x009\xff\xae\x03+\x00:\xff\ +\xae\x03+\x00<\xff\x85\x03+\x00\x89\xff\xd7\x03+\x00\ +\x94\xff\xd7\x03+\x00\x95\xff\xd7\x03+\x00\x96\xff\xd7\x03\ ++\x00\x97\xff\xd7\x03+\x00\x98\xff\xd7\x03+\x00\x9a\xff\ +\xd7\x03+\x00\x9f\xff\x85\x03+\x00\xc8\xff\xd7\x03+\x00\ +\xca\xff\xd7\x03+\x00\xcc\xff\xd7\x03+\x00\xce\xff\xd7\x03\ ++\x00\xde\xff\xd7\x03+\x00\xe0\xff\xd7\x03+\x00\xe2\xff\ +\xd7\x03+\x00\xe4\xff\xd7\x03+\x01\x0e\xff\xd7\x03+\x01\ +\x10\xff\xd7\x03+\x01\x12\xff\xd7\x03+\x01\x14\xff\xd7\x03\ ++\x01$\xffq\x03+\x01&\xffq\x03+\x016\xff\ +\xae\x03+\x018\xff\x85\x03+\x01:\xff\x85\x03+\x01\ +G\xff\xd7\x03+\x01\xfa\xff\xae\x03+\x01\xfc\xff\xae\x03\ ++\x01\xfe\xff\xae\x03+\x02\x00\xff\x85\x03+\x02\x07\xff\ +q\x03+\x02\x0b\xffq\x03+\x02_\xff\xd7\x03+\x03\ +I\xff\xd7\x03+\x03K\xff\xd7\x03+\x03M\xff\xd7\x03\ ++\x03O\xff\xd7\x03+\x03Q\xff\xd7\x03+\x03S\xff\ +\xd7\x03+\x03U\xff\xd7\x03+\x03W\xff\xd7\x03+\x03\ +Y\xff\xd7\x03+\x03[\xff\xd7\x03+\x03]\xff\xd7\x03\ ++\x03_\xff\xd7\x03+\x03o\xff\x85\x03+\x03q\xff\ +\x85\x03+\x03s\xff\x85\x03+\x03\x8f\xffq\x03,\x00\ +\x05\xff\xec\x03,\x00\x0a\xff\xec\x03,\x02\x07\xff\xec\x03\ +,\x02\x0b\xff\xec\x03-\x00\x05\xffq\x03-\x00\x0a\xff\ +q\x03-\x00&\xff\xd7\x03-\x00*\xff\xd7\x03-\x00\ +-\x01\x0a\x03-\x002\xff\xd7\x03-\x004\xff\xd7\x03\ +-\x007\xffq\x03-\x009\xff\xae\x03-\x00:\xff\ +\xae\x03-\x00<\xff\x85\x03-\x00\x89\xff\xd7\x03-\x00\ +\x94\xff\xd7\x03-\x00\x95\xff\xd7\x03-\x00\x96\xff\xd7\x03\ +-\x00\x97\xff\xd7\x03-\x00\x98\xff\xd7\x03-\x00\x9a\xff\ +\xd7\x03-\x00\x9f\xff\x85\x03-\x00\xc8\xff\xd7\x03-\x00\ +\xca\xff\xd7\x03-\x00\xcc\xff\xd7\x03-\x00\xce\xff\xd7\x03\ +-\x00\xde\xff\xd7\x03-\x00\xe0\xff\xd7\x03-\x00\xe2\xff\ +\xd7\x03-\x00\xe4\xff\xd7\x03-\x01\x0e\xff\xd7\x03-\x01\ +\x10\xff\xd7\x03-\x01\x12\xff\xd7\x03-\x01\x14\xff\xd7\x03\ +-\x01$\xffq\x03-\x01&\xffq\x03-\x016\xff\ +\xae\x03-\x018\xff\x85\x03-\x01:\xff\x85\x03-\x01\ +G\xff\xd7\x03-\x01\xfa\xff\xae\x03-\x01\xfc\xff\xae\x03\ +-\x01\xfe\xff\xae\x03-\x02\x00\xff\x85\x03-\x02\x07\xff\ +q\x03-\x02\x0b\xffq\x03-\x02_\xff\xd7\x03-\x03\ +I\xff\xd7\x03-\x03K\xff\xd7\x03-\x03M\xff\xd7\x03\ +-\x03O\xff\xd7\x03-\x03Q\xff\xd7\x03-\x03S\xff\ +\xd7\x03-\x03U\xff\xd7\x03-\x03W\xff\xd7\x03-\x03\ +Y\xff\xd7\x03-\x03[\xff\xd7\x03-\x03]\xff\xd7\x03\ +-\x03_\xff\xd7\x03-\x03o\xff\x85\x03-\x03q\xff\ +\x85\x03-\x03s\xff\x85\x03-\x03\x8f\xffq\x03.\x00\ +\x05\xff\xec\x03.\x00\x0a\xff\xec\x03.\x02\x07\xff\xec\x03\ +.\x02\x0b\xff\xec\x03/\x00\x05\xffq\x03/\x00\x0a\xff\ +q\x03/\x00&\xff\xd7\x03/\x00*\xff\xd7\x03/\x00\ +-\x01\x0a\x03/\x002\xff\xd7\x03/\x004\xff\xd7\x03\ +/\x007\xffq\x03/\x009\xff\xae\x03/\x00:\xff\ +\xae\x03/\x00<\xff\x85\x03/\x00\x89\xff\xd7\x03/\x00\ +\x94\xff\xd7\x03/\x00\x95\xff\xd7\x03/\x00\x96\xff\xd7\x03\ +/\x00\x97\xff\xd7\x03/\x00\x98\xff\xd7\x03/\x00\x9a\xff\ +\xd7\x03/\x00\x9f\xff\x85\x03/\x00\xc8\xff\xd7\x03/\x00\ +\xca\xff\xd7\x03/\x00\xcc\xff\xd7\x03/\x00\xce\xff\xd7\x03\ +/\x00\xde\xff\xd7\x03/\x00\xe0\xff\xd7\x03/\x00\xe2\xff\ +\xd7\x03/\x00\xe4\xff\xd7\x03/\x01\x0e\xff\xd7\x03/\x01\ +\x10\xff\xd7\x03/\x01\x12\xff\xd7\x03/\x01\x14\xff\xd7\x03\ +/\x01$\xffq\x03/\x01&\xffq\x03/\x016\xff\ +\xae\x03/\x018\xff\x85\x03/\x01:\xff\x85\x03/\x01\ +G\xff\xd7\x03/\x01\xfa\xff\xae\x03/\x01\xfc\xff\xae\x03\ +/\x01\xfe\xff\xae\x03/\x02\x00\xff\x85\x03/\x02\x07\xff\ +q\x03/\x02\x0b\xffq\x03/\x02_\xff\xd7\x03/\x03\ +I\xff\xd7\x03/\x03K\xff\xd7\x03/\x03M\xff\xd7\x03\ +/\x03O\xff\xd7\x03/\x03Q\xff\xd7\x03/\x03S\xff\ +\xd7\x03/\x03U\xff\xd7\x03/\x03W\xff\xd7\x03/\x03\ +Y\xff\xd7\x03/\x03[\xff\xd7\x03/\x03]\xff\xd7\x03\ +/\x03_\xff\xd7\x03/\x03o\xff\x85\x03/\x03q\xff\ +\x85\x03/\x03s\xff\x85\x03/\x03\x8f\xffq\x030\x00\ +\x05\xff\xec\x030\x00\x0a\xff\xec\x030\x02\x07\xff\xec\x03\ +0\x02\x0b\xff\xec\x031\x00\x05\xffq\x031\x00\x0a\xff\ +q\x031\x00&\xff\xd7\x031\x00*\xff\xd7\x031\x00\ +-\x01\x0a\x031\x002\xff\xd7\x031\x004\xff\xd7\x03\ +1\x007\xffq\x031\x009\xff\xae\x031\x00:\xff\ +\xae\x031\x00<\xff\x85\x031\x00\x89\xff\xd7\x031\x00\ +\x94\xff\xd7\x031\x00\x95\xff\xd7\x031\x00\x96\xff\xd7\x03\ +1\x00\x97\xff\xd7\x031\x00\x98\xff\xd7\x031\x00\x9a\xff\ +\xd7\x031\x00\x9f\xff\x85\x031\x00\xc8\xff\xd7\x031\x00\ +\xca\xff\xd7\x031\x00\xcc\xff\xd7\x031\x00\xce\xff\xd7\x03\ +1\x00\xde\xff\xd7\x031\x00\xe0\xff\xd7\x031\x00\xe2\xff\ +\xd7\x031\x00\xe4\xff\xd7\x031\x01\x0e\xff\xd7\x031\x01\ +\x10\xff\xd7\x031\x01\x12\xff\xd7\x031\x01\x14\xff\xd7\x03\ +1\x01$\xffq\x031\x01&\xffq\x031\x016\xff\ +\xae\x031\x018\xff\x85\x031\x01:\xff\x85\x031\x01\ +G\xff\xd7\x031\x01\xfa\xff\xae\x031\x01\xfc\xff\xae\x03\ +1\x01\xfe\xff\xae\x031\x02\x00\xff\x85\x031\x02\x07\xff\ +q\x031\x02\x0b\xffq\x031\x02_\xff\xd7\x031\x03\ +I\xff\xd7\x031\x03K\xff\xd7\x031\x03M\xff\xd7\x03\ +1\x03O\xff\xd7\x031\x03Q\xff\xd7\x031\x03S\xff\ +\xd7\x031\x03U\xff\xd7\x031\x03W\xff\xd7\x031\x03\ +Y\xff\xd7\x031\x03[\xff\xd7\x031\x03]\xff\xd7\x03\ +1\x03_\xff\xd7\x031\x03o\xff\x85\x031\x03q\xff\ +\x85\x031\x03s\xff\x85\x031\x03\x8f\xffq\x032\x00\ +\x05\xff\xec\x032\x00\x0a\xff\xec\x032\x02\x07\xff\xec\x03\ +2\x02\x0b\xff\xec\x033\x00\x05\xffq\x033\x00\x0a\xff\ +q\x033\x00&\xff\xd7\x033\x00*\xff\xd7\x033\x00\ +-\x01\x0a\x033\x002\xff\xd7\x033\x004\xff\xd7\x03\ +3\x007\xffq\x033\x009\xff\xae\x033\x00:\xff\ +\xae\x033\x00<\xff\x85\x033\x00\x89\xff\xd7\x033\x00\ +\x94\xff\xd7\x033\x00\x95\xff\xd7\x033\x00\x96\xff\xd7\x03\ +3\x00\x97\xff\xd7\x033\x00\x98\xff\xd7\x033\x00\x9a\xff\ +\xd7\x033\x00\x9f\xff\x85\x033\x00\xc8\xff\xd7\x033\x00\ +\xca\xff\xd7\x033\x00\xcc\xff\xd7\x033\x00\xce\xff\xd7\x03\ +3\x00\xde\xff\xd7\x033\x00\xe0\xff\xd7\x033\x00\xe2\xff\ +\xd7\x033\x00\xe4\xff\xd7\x033\x01\x0e\xff\xd7\x033\x01\ +\x10\xff\xd7\x033\x01\x12\xff\xd7\x033\x01\x14\xff\xd7\x03\ +3\x01$\xffq\x033\x01&\xffq\x033\x016\xff\ +\xae\x033\x018\xff\x85\x033\x01:\xff\x85\x033\x01\ +G\xff\xd7\x033\x01\xfa\xff\xae\x033\x01\xfc\xff\xae\x03\ +3\x01\xfe\xff\xae\x033\x02\x00\xff\x85\x033\x02\x07\xff\ +q\x033\x02\x0b\xffq\x033\x02_\xff\xd7\x033\x03\ +I\xff\xd7\x033\x03K\xff\xd7\x033\x03M\xff\xd7\x03\ +3\x03O\xff\xd7\x033\x03Q\xff\xd7\x033\x03S\xff\ +\xd7\x033\x03U\xff\xd7\x033\x03W\xff\xd7\x033\x03\ +Y\xff\xd7\x033\x03[\xff\xd7\x033\x03]\xff\xd7\x03\ +3\x03_\xff\xd7\x033\x03o\xff\x85\x033\x03q\xff\ +\x85\x033\x03s\xff\x85\x033\x03\x8f\xffq\x034\x00\ +\x05\xff\xec\x034\x00\x0a\xff\xec\x034\x02\x07\xff\xec\x03\ +4\x02\x0b\xff\xec\x035\x00-\x00{\x036\x00\x05\xff\ +\xec\x036\x00\x0a\xff\xec\x036\x00Y\xff\xd7\x036\x00\ +Z\xff\xd7\x036\x00[\xff\xd7\x036\x00\x5c\xff\xd7\x03\ +6\x00]\xff\xec\x036\x00\xbf\xff\xd7\x036\x017\xff\ +\xd7\x036\x01<\xff\xec\x036\x01>\xff\xec\x036\x01\ +@\xff\xec\x036\x01\xfb\xff\xd7\x036\x01\xfd\xff\xd7\x03\ +6\x02\x07\xff\xec\x036\x02\x0b\xff\xec\x036\x03p\xff\ +\xd7\x037\x00-\x00{\x038\x00\x05\xff\xec\x038\x00\ +\x0a\xff\xec\x038\x00Y\xff\xd7\x038\x00Z\xff\xd7\x03\ +8\x00[\xff\xd7\x038\x00\x5c\xff\xd7\x038\x00]\xff\ +\xec\x038\x00\xbf\xff\xd7\x038\x017\xff\xd7\x038\x01\ +<\xff\xec\x038\x01>\xff\xec\x038\x01@\xff\xec\x03\ +8\x01\xfb\xff\xd7\x038\x01\xfd\xff\xd7\x038\x02\x07\xff\ +\xec\x038\x02\x0b\xff\xec\x038\x03p\xff\xd7\x039\x00\ +-\x00{\x03:\x00\x05\xff\xec\x03:\x00\x0a\xff\xec\x03\ +:\x00Y\xff\xd7\x03:\x00Z\xff\xd7\x03:\x00[\xff\ +\xd7\x03:\x00\x5c\xff\xd7\x03:\x00]\xff\xec\x03:\x00\ +\xbf\xff\xd7\x03:\x017\xff\xd7\x03:\x01<\xff\xec\x03\ +:\x01>\xff\xec\x03:\x01@\xff\xec\x03:\x01\xfb\xff\ +\xd7\x03:\x01\xfd\xff\xd7\x03:\x02\x07\xff\xec\x03:\x02\ +\x0b\xff\xec\x03:\x03p\xff\xd7\x03;\x00-\x00{\x03\ +<\x00\x05\xff\xec\x03<\x00\x0a\xff\xec\x03<\x00Y\xff\ +\xd7\x03<\x00Z\xff\xd7\x03<\x00[\xff\xd7\x03<\x00\ +\x5c\xff\xd7\x03<\x00]\xff\xec\x03<\x00\xbf\xff\xd7\x03\ +<\x017\xff\xd7\x03<\x01<\xff\xec\x03<\x01>\xff\ +\xec\x03<\x01@\xff\xec\x03<\x01\xfb\xff\xd7\x03<\x01\ +\xfd\xff\xd7\x03<\x02\x07\xff\xec\x03<\x02\x0b\xff\xec\x03\ +<\x03p\xff\xd7\x03=\x00-\x00{\x03>\x00\x05\xff\ +\xec\x03>\x00\x0a\xff\xec\x03>\x00Y\xff\xd7\x03>\x00\ +Z\xff\xd7\x03>\x00[\xff\xd7\x03>\x00\x5c\xff\xd7\x03\ +>\x00]\xff\xec\x03>\x00\xbf\xff\xd7\x03>\x017\xff\ +\xd7\x03>\x01<\xff\xec\x03>\x01>\xff\xec\x03>\x01\ +@\xff\xec\x03>\x01\xfb\xff\xd7\x03>\x01\xfd\xff\xd7\x03\ +>\x02\x07\xff\xec\x03>\x02\x0b\xff\xec\x03>\x03p\xff\ +\xd7\x03?\x00-\x00{\x03@\x00\x05\xff\xec\x03@\x00\ +\x0a\xff\xec\x03@\x00Y\xff\xd7\x03@\x00Z\xff\xd7\x03\ +@\x00[\xff\xd7\x03@\x00\x5c\xff\xd7\x03@\x00]\xff\ +\xec\x03@\x00\xbf\xff\xd7\x03@\x017\xff\xd7\x03@\x01\ +<\xff\xec\x03@\x01>\xff\xec\x03@\x01@\xff\xec\x03\ +@\x01\xfb\xff\xd7\x03@\x01\xfd\xff\xd7\x03@\x02\x07\xff\ +\xec\x03@\x02\x0b\xff\xec\x03@\x03p\xff\xd7\x03A\x00\ +-\x00{\x03B\x00\x05\xff\xec\x03B\x00\x0a\xff\xec\x03\ +B\x00Y\xff\xd7\x03B\x00Z\xff\xd7\x03B\x00[\xff\ +\xd7\x03B\x00\x5c\xff\xd7\x03B\x00]\xff\xec\x03B\x00\ +\xbf\xff\xd7\x03B\x017\xff\xd7\x03B\x01<\xff\xec\x03\ +B\x01>\xff\xec\x03B\x01@\xff\xec\x03B\x01\xfb\xff\ +\xd7\x03B\x01\xfd\xff\xd7\x03B\x02\x07\xff\xec\x03B\x02\ +\x0b\xff\xec\x03B\x03p\xff\xd7\x03C\x00-\x00{\x03\ +D\x00\x05\xff\xec\x03D\x00\x0a\xff\xec\x03D\x00Y\xff\ +\xd7\x03D\x00Z\xff\xd7\x03D\x00[\xff\xd7\x03D\x00\ +\x5c\xff\xd7\x03D\x00]\xff\xec\x03D\x00\xbf\xff\xd7\x03\ +D\x017\xff\xd7\x03D\x01<\xff\xec\x03D\x01>\xff\ +\xec\x03D\x01@\xff\xec\x03D\x01\xfb\xff\xd7\x03D\x01\ +\xfd\xff\xd7\x03D\x02\x07\xff\xec\x03D\x02\x0b\xff\xec\x03\ +D\x03p\xff\xd7\x03I\x00\x0f\xff\xae\x03I\x00\x11\xff\ +\xae\x03I\x00$\xff\xd7\x03I\x007\xff\xc3\x03I\x00\ +9\xff\xec\x03I\x00:\xff\xec\x03I\x00;\xff\xd7\x03\ +I\x00<\xff\xec\x03I\x00=\xff\xec\x03I\x00\x82\xff\ +\xd7\x03I\x00\x83\xff\xd7\x03I\x00\x84\xff\xd7\x03I\x00\ +\x85\xff\xd7\x03I\x00\x86\xff\xd7\x03I\x00\x87\xff\xd7\x03\ +I\x00\x9f\xff\xec\x03I\x00\xc2\xff\xd7\x03I\x00\xc4\xff\ +\xd7\x03I\x00\xc6\xff\xd7\x03I\x01$\xff\xc3\x03I\x01\ +&\xff\xc3\x03I\x016\xff\xec\x03I\x018\xff\xec\x03\ +I\x01:\xff\xec\x03I\x01;\xff\xec\x03I\x01=\xff\ +\xec\x03I\x01?\xff\xec\x03I\x01C\xff\xd7\x03I\x01\ +\xa0\xff\xec\x03I\x01\xfa\xff\xec\x03I\x01\xfc\xff\xec\x03\ +I\x01\xfe\xff\xec\x03I\x02\x00\xff\xec\x03I\x02\x08\xff\ +\xae\x03I\x02\x0c\xff\xae\x03I\x02X\xff\xd7\x03I\x03\ +\x1d\xff\xd7\x03I\x03\x1f\xff\xd7\x03I\x03!\xff\xd7\x03\ +I\x03#\xff\xd7\x03I\x03%\xff\xd7\x03I\x03'\xff\ +\xd7\x03I\x03)\xff\xd7\x03I\x03+\xff\xd7\x03I\x03\ +-\xff\xd7\x03I\x03/\xff\xd7\x03I\x031\xff\xd7\x03\ +I\x033\xff\xd7\x03I\x03o\xff\xec\x03I\x03q\xff\ +\xec\x03I\x03s\xff\xec\x03I\x03\x8f\xff\xc3\x03J\x00\ +\x05\xff\xec\x03J\x00\x0a\xff\xec\x03J\x00Y\xff\xd7\x03\ +J\x00Z\xff\xd7\x03J\x00[\xff\xd7\x03J\x00\x5c\xff\ +\xd7\x03J\x00]\xff\xec\x03J\x00\xbf\xff\xd7\x03J\x01\ +7\xff\xd7\x03J\x01<\xff\xec\x03J\x01>\xff\xec\x03\ +J\x01@\xff\xec\x03J\x01\xfb\xff\xd7\x03J\x01\xfd\xff\ +\xd7\x03J\x02\x07\xff\xec\x03J\x02\x0b\xff\xec\x03J\x03\ +p\xff\xd7\x03K\x00\x0f\xff\xae\x03K\x00\x11\xff\xae\x03\ +K\x00$\xff\xd7\x03K\x007\xff\xc3\x03K\x009\xff\ +\xec\x03K\x00:\xff\xec\x03K\x00;\xff\xd7\x03K\x00\ +<\xff\xec\x03K\x00=\xff\xec\x03K\x00\x82\xff\xd7\x03\ +K\x00\x83\xff\xd7\x03K\x00\x84\xff\xd7\x03K\x00\x85\xff\ +\xd7\x03K\x00\x86\xff\xd7\x03K\x00\x87\xff\xd7\x03K\x00\ +\x9f\xff\xec\x03K\x00\xc2\xff\xd7\x03K\x00\xc4\xff\xd7\x03\ +K\x00\xc6\xff\xd7\x03K\x01$\xff\xc3\x03K\x01&\xff\ +\xc3\x03K\x016\xff\xec\x03K\x018\xff\xec\x03K\x01\ +:\xff\xec\x03K\x01;\xff\xec\x03K\x01=\xff\xec\x03\ +K\x01?\xff\xec\x03K\x01C\xff\xd7\x03K\x01\xa0\xff\ +\xec\x03K\x01\xfa\xff\xec\x03K\x01\xfc\xff\xec\x03K\x01\ +\xfe\xff\xec\x03K\x02\x00\xff\xec\x03K\x02\x08\xff\xae\x03\ +K\x02\x0c\xff\xae\x03K\x02X\xff\xd7\x03K\x03\x1d\xff\ +\xd7\x03K\x03\x1f\xff\xd7\x03K\x03!\xff\xd7\x03K\x03\ +#\xff\xd7\x03K\x03%\xff\xd7\x03K\x03'\xff\xd7\x03\ +K\x03)\xff\xd7\x03K\x03+\xff\xd7\x03K\x03-\xff\ +\xd7\x03K\x03/\xff\xd7\x03K\x031\xff\xd7\x03K\x03\ +3\xff\xd7\x03K\x03o\xff\xec\x03K\x03q\xff\xec\x03\ +K\x03s\xff\xec\x03K\x03\x8f\xff\xc3\x03L\x00\x05\xff\ +\xec\x03L\x00\x0a\xff\xec\x03L\x00Y\xff\xd7\x03L\x00\ +Z\xff\xd7\x03L\x00[\xff\xd7\x03L\x00\x5c\xff\xd7\x03\ +L\x00]\xff\xec\x03L\x00\xbf\xff\xd7\x03L\x017\xff\ +\xd7\x03L\x01<\xff\xec\x03L\x01>\xff\xec\x03L\x01\ +@\xff\xec\x03L\x01\xfb\xff\xd7\x03L\x01\xfd\xff\xd7\x03\ +L\x02\x07\xff\xec\x03L\x02\x0b\xff\xec\x03L\x03p\xff\ +\xd7\x03M\x00\x0f\xff\xae\x03M\x00\x11\xff\xae\x03M\x00\ +$\xff\xd7\x03M\x007\xff\xc3\x03M\x009\xff\xec\x03\ +M\x00:\xff\xec\x03M\x00;\xff\xd7\x03M\x00<\xff\ +\xec\x03M\x00=\xff\xec\x03M\x00\x82\xff\xd7\x03M\x00\ +\x83\xff\xd7\x03M\x00\x84\xff\xd7\x03M\x00\x85\xff\xd7\x03\ +M\x00\x86\xff\xd7\x03M\x00\x87\xff\xd7\x03M\x00\x9f\xff\ +\xec\x03M\x00\xc2\xff\xd7\x03M\x00\xc4\xff\xd7\x03M\x00\ +\xc6\xff\xd7\x03M\x01$\xff\xc3\x03M\x01&\xff\xc3\x03\ +M\x016\xff\xec\x03M\x018\xff\xec\x03M\x01:\xff\ +\xec\x03M\x01;\xff\xec\x03M\x01=\xff\xec\x03M\x01\ +?\xff\xec\x03M\x01C\xff\xd7\x03M\x01\xa0\xff\xec\x03\ +M\x01\xfa\xff\xec\x03M\x01\xfc\xff\xec\x03M\x01\xfe\xff\ +\xec\x03M\x02\x00\xff\xec\x03M\x02\x08\xff\xae\x03M\x02\ +\x0c\xff\xae\x03M\x02X\xff\xd7\x03M\x03\x1d\xff\xd7\x03\ +M\x03\x1f\xff\xd7\x03M\x03!\xff\xd7\x03M\x03#\xff\ +\xd7\x03M\x03%\xff\xd7\x03M\x03'\xff\xd7\x03M\x03\ +)\xff\xd7\x03M\x03+\xff\xd7\x03M\x03-\xff\xd7\x03\ +M\x03/\xff\xd7\x03M\x031\xff\xd7\x03M\x033\xff\ +\xd7\x03M\x03o\xff\xec\x03M\x03q\xff\xec\x03M\x03\ +s\xff\xec\x03M\x03\x8f\xff\xc3\x03O\x00\x0f\xff\xae\x03\ +O\x00\x11\xff\xae\x03O\x00$\xff\xd7\x03O\x007\xff\ +\xc3\x03O\x009\xff\xec\x03O\x00:\xff\xec\x03O\x00\ +;\xff\xd7\x03O\x00<\xff\xec\x03O\x00=\xff\xec\x03\ +O\x00\x82\xff\xd7\x03O\x00\x83\xff\xd7\x03O\x00\x84\xff\ +\xd7\x03O\x00\x85\xff\xd7\x03O\x00\x86\xff\xd7\x03O\x00\ +\x87\xff\xd7\x03O\x00\x9f\xff\xec\x03O\x00\xc2\xff\xd7\x03\ +O\x00\xc4\xff\xd7\x03O\x00\xc6\xff\xd7\x03O\x01$\xff\ +\xc3\x03O\x01&\xff\xc3\x03O\x016\xff\xec\x03O\x01\ +8\xff\xec\x03O\x01:\xff\xec\x03O\x01;\xff\xec\x03\ +O\x01=\xff\xec\x03O\x01?\xff\xec\x03O\x01C\xff\ +\xd7\x03O\x01\xa0\xff\xec\x03O\x01\xfa\xff\xec\x03O\x01\ +\xfc\xff\xec\x03O\x01\xfe\xff\xec\x03O\x02\x00\xff\xec\x03\ +O\x02\x08\xff\xae\x03O\x02\x0c\xff\xae\x03O\x02X\xff\ +\xd7\x03O\x03\x1d\xff\xd7\x03O\x03\x1f\xff\xd7\x03O\x03\ +!\xff\xd7\x03O\x03#\xff\xd7\x03O\x03%\xff\xd7\x03\ +O\x03'\xff\xd7\x03O\x03)\xff\xd7\x03O\x03+\xff\ +\xd7\x03O\x03-\xff\xd7\x03O\x03/\xff\xd7\x03O\x03\ +1\xff\xd7\x03O\x033\xff\xd7\x03O\x03o\xff\xec\x03\ +O\x03q\xff\xec\x03O\x03s\xff\xec\x03O\x03\x8f\xff\ +\xc3\x03Q\x00\x0f\xff\xae\x03Q\x00\x11\xff\xae\x03Q\x00\ +$\xff\xd7\x03Q\x007\xff\xc3\x03Q\x009\xff\xec\x03\ +Q\x00:\xff\xec\x03Q\x00;\xff\xd7\x03Q\x00<\xff\ +\xec\x03Q\x00=\xff\xec\x03Q\x00\x82\xff\xd7\x03Q\x00\ +\x83\xff\xd7\x03Q\x00\x84\xff\xd7\x03Q\x00\x85\xff\xd7\x03\ +Q\x00\x86\xff\xd7\x03Q\x00\x87\xff\xd7\x03Q\x00\x9f\xff\ +\xec\x03Q\x00\xc2\xff\xd7\x03Q\x00\xc4\xff\xd7\x03Q\x00\ +\xc6\xff\xd7\x03Q\x01$\xff\xc3\x03Q\x01&\xff\xc3\x03\ +Q\x016\xff\xec\x03Q\x018\xff\xec\x03Q\x01:\xff\ +\xec\x03Q\x01;\xff\xec\x03Q\x01=\xff\xec\x03Q\x01\ +?\xff\xec\x03Q\x01C\xff\xd7\x03Q\x01\xa0\xff\xec\x03\ +Q\x01\xfa\xff\xec\x03Q\x01\xfc\xff\xec\x03Q\x01\xfe\xff\ +\xec\x03Q\x02\x00\xff\xec\x03Q\x02\x08\xff\xae\x03Q\x02\ +\x0c\xff\xae\x03Q\x02X\xff\xd7\x03Q\x03\x1d\xff\xd7\x03\ +Q\x03\x1f\xff\xd7\x03Q\x03!\xff\xd7\x03Q\x03#\xff\ +\xd7\x03Q\x03%\xff\xd7\x03Q\x03'\xff\xd7\x03Q\x03\ +)\xff\xd7\x03Q\x03+\xff\xd7\x03Q\x03-\xff\xd7\x03\ +Q\x03/\xff\xd7\x03Q\x031\xff\xd7\x03Q\x033\xff\ +\xd7\x03Q\x03o\xff\xec\x03Q\x03q\xff\xec\x03Q\x03\ +s\xff\xec\x03Q\x03\x8f\xff\xc3\x03S\x00\x0f\xff\xae\x03\ +S\x00\x11\xff\xae\x03S\x00$\xff\xd7\x03S\x007\xff\ +\xc3\x03S\x009\xff\xec\x03S\x00:\xff\xec\x03S\x00\ +;\xff\xd7\x03S\x00<\xff\xec\x03S\x00=\xff\xec\x03\ +S\x00\x82\xff\xd7\x03S\x00\x83\xff\xd7\x03S\x00\x84\xff\ +\xd7\x03S\x00\x85\xff\xd7\x03S\x00\x86\xff\xd7\x03S\x00\ +\x87\xff\xd7\x03S\x00\x9f\xff\xec\x03S\x00\xc2\xff\xd7\x03\ +S\x00\xc4\xff\xd7\x03S\x00\xc6\xff\xd7\x03S\x01$\xff\ +\xc3\x03S\x01&\xff\xc3\x03S\x016\xff\xec\x03S\x01\ +8\xff\xec\x03S\x01:\xff\xec\x03S\x01;\xff\xec\x03\ +S\x01=\xff\xec\x03S\x01?\xff\xec\x03S\x01C\xff\ +\xd7\x03S\x01\xa0\xff\xec\x03S\x01\xfa\xff\xec\x03S\x01\ +\xfc\xff\xec\x03S\x01\xfe\xff\xec\x03S\x02\x00\xff\xec\x03\ +S\x02\x08\xff\xae\x03S\x02\x0c\xff\xae\x03S\x02X\xff\ +\xd7\x03S\x03\x1d\xff\xd7\x03S\x03\x1f\xff\xd7\x03S\x03\ +!\xff\xd7\x03S\x03#\xff\xd7\x03S\x03%\xff\xd7\x03\ +S\x03'\xff\xd7\x03S\x03)\xff\xd7\x03S\x03+\xff\ +\xd7\x03S\x03-\xff\xd7\x03S\x03/\xff\xd7\x03S\x03\ +1\xff\xd7\x03S\x033\xff\xd7\x03S\x03o\xff\xec\x03\ +S\x03q\xff\xec\x03S\x03s\xff\xec\x03S\x03\x8f\xff\ +\xc3\x03U\x00\x0f\xff\xae\x03U\x00\x11\xff\xae\x03U\x00\ +$\xff\xd7\x03U\x007\xff\xc3\x03U\x009\xff\xec\x03\ +U\x00:\xff\xec\x03U\x00;\xff\xd7\x03U\x00<\xff\ +\xec\x03U\x00=\xff\xec\x03U\x00\x82\xff\xd7\x03U\x00\ +\x83\xff\xd7\x03U\x00\x84\xff\xd7\x03U\x00\x85\xff\xd7\x03\ +U\x00\x86\xff\xd7\x03U\x00\x87\xff\xd7\x03U\x00\x9f\xff\ +\xec\x03U\x00\xc2\xff\xd7\x03U\x00\xc4\xff\xd7\x03U\x00\ +\xc6\xff\xd7\x03U\x01$\xff\xc3\x03U\x01&\xff\xc3\x03\ +U\x016\xff\xec\x03U\x018\xff\xec\x03U\x01:\xff\ +\xec\x03U\x01;\xff\xec\x03U\x01=\xff\xec\x03U\x01\ +?\xff\xec\x03U\x01C\xff\xd7\x03U\x01\xa0\xff\xec\x03\ +U\x01\xfa\xff\xec\x03U\x01\xfc\xff\xec\x03U\x01\xfe\xff\ +\xec\x03U\x02\x00\xff\xec\x03U\x02\x08\xff\xae\x03U\x02\ +\x0c\xff\xae\x03U\x02X\xff\xd7\x03U\x03\x1d\xff\xd7\x03\ +U\x03\x1f\xff\xd7\x03U\x03!\xff\xd7\x03U\x03#\xff\ +\xd7\x03U\x03%\xff\xd7\x03U\x03'\xff\xd7\x03U\x03\ +)\xff\xd7\x03U\x03+\xff\xd7\x03U\x03-\xff\xd7\x03\ +U\x03/\xff\xd7\x03U\x031\xff\xd7\x03U\x033\xff\ +\xd7\x03U\x03o\xff\xec\x03U\x03q\xff\xec\x03U\x03\ +s\xff\xec\x03U\x03\x8f\xff\xc3\x03X\x00I\x00R\x03\ +X\x00W\x00R\x03X\x00Y\x00f\x03X\x00Z\x00\ +f\x03X\x00[\x00f\x03X\x00\x5c\x00f\x03X\x00\ +\xbf\x00f\x03X\x01%\x00R\x03X\x01'\x00R\x03\ +X\x017\x00f\x03X\x01\xfb\x00f\x03X\x01\xfd\x00\ +f\x03X\x024\x00R\x03X\x025\x00R\x03X\x02\ +]\x00R\x03X\x02^\x00R\x03X\x03p\x00f\x03\ +X\x03\x8d\x00R\x03X\x03\x90\x00R\x03Z\x00I\x00\ +R\x03Z\x00W\x00R\x03Z\x00Y\x00f\x03Z\x00\ +Z\x00f\x03Z\x00[\x00f\x03Z\x00\x5c\x00f\x03\ +Z\x00\xbf\x00f\x03Z\x01%\x00R\x03Z\x01'\x00\ +R\x03Z\x017\x00f\x03Z\x01\xfb\x00f\x03Z\x01\ +\xfd\x00f\x03Z\x024\x00R\x03Z\x025\x00R\x03\ +Z\x02]\x00R\x03Z\x02^\x00R\x03Z\x03p\x00\ +f\x03Z\x03\x8d\x00R\x03Z\x03\x90\x00R\x03\x5c\x00\ +I\x00R\x03\x5c\x00W\x00R\x03\x5c\x00Y\x00f\x03\ +\x5c\x00Z\x00f\x03\x5c\x00[\x00f\x03\x5c\x00\x5c\x00\ +f\x03\x5c\x00\xbf\x00f\x03\x5c\x01%\x00R\x03\x5c\x01\ +'\x00R\x03\x5c\x017\x00f\x03\x5c\x01\xfb\x00f\x03\ +\x5c\x01\xfd\x00f\x03\x5c\x024\x00R\x03\x5c\x025\x00\ +R\x03\x5c\x02]\x00R\x03\x5c\x02^\x00R\x03\x5c\x03\ +p\x00f\x03\x5c\x03\x8d\x00R\x03\x5c\x03\x90\x00R\x03\ +^\x00I\x00R\x03^\x00W\x00R\x03^\x00Y\x00\ +f\x03^\x00Z\x00f\x03^\x00[\x00f\x03^\x00\ +\x5c\x00f\x03^\x00\xbf\x00f\x03^\x01%\x00R\x03\ +^\x01'\x00R\x03^\x017\x00f\x03^\x01\xfb\x00\ +f\x03^\x01\xfd\x00f\x03^\x024\x00R\x03^\x02\ +5\x00R\x03^\x02]\x00R\x03^\x02^\x00R\x03\ +^\x03p\x00f\x03^\x03\x8d\x00R\x03^\x03\x90\x00\ +R\x03`\x00I\x00R\x03`\x00W\x00R\x03`\x00\ +Y\x00f\x03`\x00Z\x00f\x03`\x00[\x00f\x03\ +`\x00\x5c\x00f\x03`\x00\xbf\x00f\x03`\x01%\x00\ +R\x03`\x01'\x00R\x03`\x017\x00f\x03`\x01\ +\xfb\x00f\x03`\x01\xfd\x00f\x03`\x024\x00R\x03\ +`\x025\x00R\x03`\x02]\x00R\x03`\x02^\x00\ +R\x03`\x03p\x00f\x03`\x03\x8d\x00R\x03`\x03\ +\x90\x00R\x03a\x00\x0f\xff\xd7\x03a\x00\x11\xff\xd7\x03\ +a\x00$\xff\xec\x03a\x00\x82\xff\xec\x03a\x00\x83\xff\ +\xec\x03a\x00\x84\xff\xec\x03a\x00\x85\xff\xec\x03a\x00\ +\x86\xff\xec\x03a\x00\x87\xff\xec\x03a\x00\xc2\xff\xec\x03\ +a\x00\xc4\xff\xec\x03a\x00\xc6\xff\xec\x03a\x01C\xff\ +\xec\x03a\x02\x08\xff\xd7\x03a\x02\x0c\xff\xd7\x03a\x02\ +X\xff\xec\x03a\x03\x1d\xff\xec\x03a\x03\x1f\xff\xec\x03\ +a\x03!\xff\xec\x03a\x03#\xff\xec\x03a\x03%\xff\ +\xec\x03a\x03'\xff\xec\x03a\x03)\xff\xec\x03a\x03\ ++\xff\xec\x03a\x03-\xff\xec\x03a\x03/\xff\xec\x03\ +a\x031\xff\xec\x03a\x033\xff\xec\x03f\x00I\x00\ +f\x03f\x00W\x00f\x03f\x00Y\x00f\x03f\x00\ +Z\x00f\x03f\x00[\x00f\x03f\x00\x5c\x00f\x03\ +f\x00\xbf\x00f\x03f\x01%\x00f\x03f\x01'\x00\ +f\x03f\x017\x00f\x03f\x01\xfb\x00f\x03f\x01\ +\xfd\x00f\x03f\x024\x00f\x03f\x025\x00f\x03\ +f\x02]\x00f\x03f\x02^\x00f\x03f\x03p\x00\ +f\x03f\x03\x8d\x00f\x03f\x03\x90\x00f\x03h\x00\ +I\x00f\x03h\x00W\x00f\x03h\x00Y\x00f\x03\ +h\x00Z\x00f\x03h\x00[\x00f\x03h\x00\x5c\x00\ +f\x03h\x00\xbf\x00f\x03h\x01%\x00f\x03h\x01\ +'\x00f\x03h\x017\x00f\x03h\x01\xfb\x00f\x03\ +h\x01\xfd\x00f\x03h\x024\x00f\x03h\x025\x00\ +f\x03h\x02]\x00f\x03h\x02^\x00f\x03h\x03\ +p\x00f\x03h\x03\x8d\x00f\x03h\x03\x90\x00f\x03\ +j\x00I\x00f\x03j\x00W\x00f\x03j\x00Y\x00\ +f\x03j\x00Z\x00f\x03j\x00[\x00f\x03j\x00\ +\x5c\x00f\x03j\x00\xbf\x00f\x03j\x01%\x00f\x03\ +j\x01'\x00f\x03j\x017\x00f\x03j\x01\xfb\x00\ +f\x03j\x01\xfd\x00f\x03j\x024\x00f\x03j\x02\ +5\x00f\x03j\x02]\x00f\x03j\x02^\x00f\x03\ +j\x03p\x00f\x03j\x03\x8d\x00f\x03j\x03\x90\x00\ +f\x03l\x00I\x00f\x03l\x00W\x00f\x03l\x00\ +Y\x00f\x03l\x00Z\x00f\x03l\x00[\x00f\x03\ +l\x00\x5c\x00f\x03l\x00\xbf\x00f\x03l\x01%\x00\ +f\x03l\x01'\x00f\x03l\x017\x00f\x03l\x01\ +\xfb\x00f\x03l\x01\xfd\x00f\x03l\x024\x00f\x03\ +l\x025\x00f\x03l\x02]\x00f\x03l\x02^\x00\ +f\x03l\x03p\x00f\x03l\x03\x8d\x00f\x03l\x03\ +\x90\x00f\x03n\x00I\x00f\x03n\x00W\x00f\x03\ +n\x00Y\x00f\x03n\x00Z\x00f\x03n\x00[\x00\ +f\x03n\x00\x5c\x00f\x03n\x00\xbf\x00f\x03n\x01\ +%\x00f\x03n\x01'\x00f\x03n\x017\x00f\x03\ +n\x01\xfb\x00f\x03n\x01\xfd\x00f\x03n\x024\x00\ +f\x03n\x025\x00f\x03n\x02]\x00f\x03n\x02\ +^\x00f\x03n\x03p\x00f\x03n\x03\x8d\x00f\x03\ +n\x03\x90\x00f\x03o\x00\x0f\xff\x85\x03o\x00\x11\xff\ +\x85\x03o\x00\x22\x00)\x03o\x00$\xff\x85\x03o\x00\ +&\xff\xd7\x03o\x00*\xff\xd7\x03o\x002\xff\xd7\x03\ +o\x004\xff\xd7\x03o\x00D\xff\x9a\x03o\x00F\xff\ +\x9a\x03o\x00G\xff\x9a\x03o\x00H\xff\x9a\x03o\x00\ +J\xff\xd7\x03o\x00P\xff\xc3\x03o\x00Q\xff\xc3\x03\ +o\x00R\xff\x9a\x03o\x00S\xff\xc3\x03o\x00T\xff\ +\x9a\x03o\x00U\xff\xc3\x03o\x00V\xff\xae\x03o\x00\ +X\xff\xc3\x03o\x00]\xff\xd7\x03o\x00\x82\xff\x85\x03\ +o\x00\x83\xff\x85\x03o\x00\x84\xff\x85\x03o\x00\x85\xff\ +\x85\x03o\x00\x86\xff\x85\x03o\x00\x87\xff\x85\x03o\x00\ +\x89\xff\xd7\x03o\x00\x94\xff\xd7\x03o\x00\x95\xff\xd7\x03\ +o\x00\x96\xff\xd7\x03o\x00\x97\xff\xd7\x03o\x00\x98\xff\ +\xd7\x03o\x00\x9a\xff\xd7\x03o\x00\xa2\xff\x9a\x03o\x00\ +\xa3\xff\x9a\x03o\x00\xa4\xff\x9a\x03o\x00\xa5\xff\x9a\x03\ +o\x00\xa6\xff\x9a\x03o\x00\xa7\xff\x9a\x03o\x00\xa8\xff\ +\x9a\x03o\x00\xa9\xff\x9a\x03o\x00\xaa\xff\x9a\x03o\x00\ +\xab\xff\x9a\x03o\x00\xac\xff\x9a\x03o\x00\xad\xff\x9a\x03\ +o\x00\xb4\xff\x9a\x03o\x00\xb5\xff\x9a\x03o\x00\xb6\xff\ +\x9a\x03o\x00\xb7\xff\x9a\x03o\x00\xb8\xff\x9a\x03o\x00\ +\xba\xff\x9a\x03o\x00\xbb\xff\xc3\x03o\x00\xbc\xff\xc3\x03\ +o\x00\xbd\xff\xc3\x03o\x00\xbe\xff\xc3\x03o\x00\xc2\xff\ +\x85\x03o\x00\xc3\xff\x9a\x03o\x00\xc4\xff\x85\x03o\x00\ +\xc5\xff\x9a\x03o\x00\xc6\xff\x85\x03o\x00\xc7\xff\x9a\x03\ +o\x00\xc8\xff\xd7\x03o\x00\xc9\xff\x9a\x03o\x00\xca\xff\ +\xd7\x03o\x00\xcb\xff\x9a\x03o\x00\xcc\xff\xd7\x03o\x00\ +\xcd\xff\x9a\x03o\x00\xce\xff\xd7\x03o\x00\xcf\xff\x9a\x03\ +o\x00\xd1\xff\x9a\x03o\x00\xd3\xff\x9a\x03o\x00\xd5\xff\ +\x9a\x03o\x00\xd7\xff\x9a\x03o\x00\xd9\xff\x9a\x03o\x00\ +\xdb\xff\x9a\x03o\x00\xdd\xff\x9a\x03o\x00\xde\xff\xd7\x03\ +o\x00\xdf\xff\xd7\x03o\x00\xe0\xff\xd7\x03o\x00\xe1\xff\ +\xd7\x03o\x00\xe2\xff\xd7\x03o\x00\xe3\xff\xd7\x03o\x00\ +\xe4\xff\xd7\x03o\x00\xe5\xff\xd7\x03o\x00\xfa\xff\xc3\x03\ +o\x01\x06\xff\xc3\x03o\x01\x08\xff\xc3\x03o\x01\x0d\xff\ +\xc3\x03o\x01\x0e\xff\xd7\x03o\x01\x0f\xff\x9a\x03o\x01\ +\x10\xff\xd7\x03o\x01\x11\xff\x9a\x03o\x01\x12\xff\xd7\x03\ +o\x01\x13\xff\x9a\x03o\x01\x14\xff\xd7\x03o\x01\x15\xff\ +\x9a\x03o\x01\x17\xff\xc3\x03o\x01\x19\xff\xc3\x03o\x01\ +\x1d\xff\xae\x03o\x01!\xff\xae\x03o\x01+\xff\xc3\x03\ +o\x01-\xff\xc3\x03o\x01/\xff\xc3\x03o\x011\xff\ +\xc3\x03o\x013\xff\xc3\x03o\x015\xff\xc3\x03o\x01\ +<\xff\xd7\x03o\x01>\xff\xd7\x03o\x01@\xff\xd7\x03\ +o\x01C\xff\x85\x03o\x01D\xff\x9a\x03o\x01F\xff\ +\x9a\x03o\x01G\xff\xd7\x03o\x01H\xff\x9a\x03o\x01\ +J\xff\xae\x03o\x02\x08\xff\x85\x03o\x02\x0c\xff\x85\x03\ +o\x02W\xff\xc3\x03o\x02X\xff\x85\x03o\x02Y\xff\ +\x9a\x03o\x02_\xff\xd7\x03o\x02`\xff\x9a\x03o\x02\ +b\xff\xc3\x03o\x03\x1d\xff\x85\x03o\x03\x1e\xff\x9a\x03\ +o\x03\x1f\xff\x85\x03o\x03 \xff\x9a\x03o\x03!\xff\ +\x85\x03o\x03\x22\xff\x9a\x03o\x03#\xff\x85\x03o\x03\ +%\xff\x85\x03o\x03&\xff\x9a\x03o\x03'\xff\x85\x03\ +o\x03(\xff\x9a\x03o\x03)\xff\x85\x03o\x03*\xff\ +\x9a\x03o\x03+\xff\x85\x03o\x03,\xff\x9a\x03o\x03\ +-\xff\x85\x03o\x03.\xff\x9a\x03o\x03/\xff\x85\x03\ +o\x030\xff\x9a\x03o\x031\xff\x85\x03o\x032\xff\ +\x9a\x03o\x033\xff\x85\x03o\x034\xff\x9a\x03o\x03\ +6\xff\x9a\x03o\x038\xff\x9a\x03o\x03:\xff\x9a\x03\ +o\x03<\xff\x9a\x03o\x03@\xff\x9a\x03o\x03B\xff\ +\x9a\x03o\x03D\xff\x9a\x03o\x03I\xff\xd7\x03o\x03\ +J\xff\x9a\x03o\x03K\xff\xd7\x03o\x03L\xff\x9a\x03\ +o\x03M\xff\xd7\x03o\x03N\xff\x9a\x03o\x03O\xff\ +\xd7\x03o\x03Q\xff\xd7\x03o\x03R\xff\x9a\x03o\x03\ +S\xff\xd7\x03o\x03T\xff\x9a\x03o\x03U\xff\xd7\x03\ +o\x03V\xff\x9a\x03o\x03W\xff\xd7\x03o\x03X\xff\ +\x9a\x03o\x03Y\xff\xd7\x03o\x03Z\xff\x9a\x03o\x03\ +[\xff\xd7\x03o\x03\x5c\xff\x9a\x03o\x03]\xff\xd7\x03\ +o\x03^\xff\x9a\x03o\x03_\xff\xd7\x03o\x03`\xff\ +\x9a\x03o\x03b\xff\xc3\x03o\x03d\xff\xc3\x03o\x03\ +f\xff\xc3\x03o\x03h\xff\xc3\x03o\x03j\xff\xc3\x03\ +o\x03l\xff\xc3\x03o\x03n\xff\xc3\x03p\x00\x05\x00\ +R\x03p\x00\x0a\x00R\x03p\x00\x0f\xff\xae\x03p\x00\ +\x11\xff\xae\x03p\x00\x22\x00)\x03p\x02\x07\x00R\x03\ +p\x02\x08\xff\xae\x03p\x02\x0b\x00R\x03p\x02\x0c\xff\ +\xae\x03q\x00\x0f\xff\x85\x03q\x00\x11\xff\x85\x03q\x00\ +\x22\x00)\x03q\x00$\xff\x85\x03q\x00&\xff\xd7\x03\ +q\x00*\xff\xd7\x03q\x002\xff\xd7\x03q\x004\xff\ +\xd7\x03q\x00D\xff\x9a\x03q\x00F\xff\x9a\x03q\x00\ +G\xff\x9a\x03q\x00H\xff\x9a\x03q\x00J\xff\xd7\x03\ +q\x00P\xff\xc3\x03q\x00Q\xff\xc3\x03q\x00R\xff\ +\x9a\x03q\x00S\xff\xc3\x03q\x00T\xff\x9a\x03q\x00\ +U\xff\xc3\x03q\x00V\xff\xae\x03q\x00X\xff\xc3\x03\ +q\x00]\xff\xd7\x03q\x00\x82\xff\x85\x03q\x00\x83\xff\ +\x85\x03q\x00\x84\xff\x85\x03q\x00\x85\xff\x85\x03q\x00\ +\x86\xff\x85\x03q\x00\x87\xff\x85\x03q\x00\x89\xff\xd7\x03\ +q\x00\x94\xff\xd7\x03q\x00\x95\xff\xd7\x03q\x00\x96\xff\ +\xd7\x03q\x00\x97\xff\xd7\x03q\x00\x98\xff\xd7\x03q\x00\ +\x9a\xff\xd7\x03q\x00\xa2\xff\x9a\x03q\x00\xa3\xff\x9a\x03\ +q\x00\xa4\xff\x9a\x03q\x00\xa5\xff\x9a\x03q\x00\xa6\xff\ +\x9a\x03q\x00\xa7\xff\x9a\x03q\x00\xa8\xff\x9a\x03q\x00\ +\xa9\xff\x9a\x03q\x00\xaa\xff\x9a\x03q\x00\xab\xff\x9a\x03\ +q\x00\xac\xff\x9a\x03q\x00\xad\xff\x9a\x03q\x00\xb4\xff\ +\x9a\x03q\x00\xb5\xff\x9a\x03q\x00\xb6\xff\x9a\x03q\x00\ +\xb7\xff\x9a\x03q\x00\xb8\xff\x9a\x03q\x00\xba\xff\x9a\x03\ +q\x00\xbb\xff\xc3\x03q\x00\xbc\xff\xc3\x03q\x00\xbd\xff\ +\xc3\x03q\x00\xbe\xff\xc3\x03q\x00\xc2\xff\x85\x03q\x00\ +\xc3\xff\x9a\x03q\x00\xc4\xff\x85\x03q\x00\xc5\xff\x9a\x03\ +q\x00\xc6\xff\x85\x03q\x00\xc7\xff\x9a\x03q\x00\xc8\xff\ +\xd7\x03q\x00\xc9\xff\x9a\x03q\x00\xca\xff\xd7\x03q\x00\ +\xcb\xff\x9a\x03q\x00\xcc\xff\xd7\x03q\x00\xcd\xff\x9a\x03\ +q\x00\xce\xff\xd7\x03q\x00\xcf\xff\x9a\x03q\x00\xd1\xff\ +\x9a\x03q\x00\xd3\xff\x9a\x03q\x00\xd5\xff\x9a\x03q\x00\ +\xd7\xff\x9a\x03q\x00\xd9\xff\x9a\x03q\x00\xdb\xff\x9a\x03\ +q\x00\xdd\xff\x9a\x03q\x00\xde\xff\xd7\x03q\x00\xdf\xff\ +\xd7\x03q\x00\xe0\xff\xd7\x03q\x00\xe1\xff\xd7\x03q\x00\ +\xe2\xff\xd7\x03q\x00\xe3\xff\xd7\x03q\x00\xe4\xff\xd7\x03\ +q\x00\xe5\xff\xd7\x03q\x00\xfa\xff\xc3\x03q\x01\x06\xff\ +\xc3\x03q\x01\x08\xff\xc3\x03q\x01\x0d\xff\xc3\x03q\x01\ +\x0e\xff\xd7\x03q\x01\x0f\xff\x9a\x03q\x01\x10\xff\xd7\x03\ +q\x01\x11\xff\x9a\x03q\x01\x12\xff\xd7\x03q\x01\x13\xff\ +\x9a\x03q\x01\x14\xff\xd7\x03q\x01\x15\xff\x9a\x03q\x01\ +\x17\xff\xc3\x03q\x01\x19\xff\xc3\x03q\x01\x1d\xff\xae\x03\ +q\x01!\xff\xae\x03q\x01+\xff\xc3\x03q\x01-\xff\ +\xc3\x03q\x01/\xff\xc3\x03q\x011\xff\xc3\x03q\x01\ +3\xff\xc3\x03q\x015\xff\xc3\x03q\x01<\xff\xd7\x03\ +q\x01>\xff\xd7\x03q\x01@\xff\xd7\x03q\x01C\xff\ +\x85\x03q\x01D\xff\x9a\x03q\x01F\xff\x9a\x03q\x01\ +G\xff\xd7\x03q\x01H\xff\x9a\x03q\x01J\xff\xae\x03\ +q\x02\x08\xff\x85\x03q\x02\x0c\xff\x85\x03q\x02W\xff\ +\xc3\x03q\x02X\xff\x85\x03q\x02Y\xff\x9a\x03q\x02\ +_\xff\xd7\x03q\x02`\xff\x9a\x03q\x02b\xff\xc3\x03\ +q\x03\x1d\xff\x85\x03q\x03\x1e\xff\x9a\x03q\x03\x1f\xff\ +\x85\x03q\x03 \xff\x9a\x03q\x03!\xff\x85\x03q\x03\ +\x22\xff\x9a\x03q\x03#\xff\x85\x03q\x03%\xff\x85\x03\ +q\x03&\xff\x9a\x03q\x03'\xff\x85\x03q\x03(\xff\ +\x9a\x03q\x03)\xff\x85\x03q\x03*\xff\x9a\x03q\x03\ ++\xff\x85\x03q\x03,\xff\x9a\x03q\x03-\xff\x85\x03\ +q\x03.\xff\x9a\x03q\x03/\xff\x85\x03q\x030\xff\ +\x9a\x03q\x031\xff\x85\x03q\x032\xff\x9a\x03q\x03\ +3\xff\x85\x03q\x034\xff\x9a\x03q\x036\xff\x9a\x03\ +q\x038\xff\x9a\x03q\x03:\xff\x9a\x03q\x03<\xff\ +\x9a\x03q\x03@\xff\x9a\x03q\x03B\xff\x9a\x03q\x03\ +D\xff\x9a\x03q\x03I\xff\xd7\x03q\x03J\xff\x9a\x03\ +q\x03K\xff\xd7\x03q\x03L\xff\x9a\x03q\x03M\xff\ +\xd7\x03q\x03N\xff\x9a\x03q\x03O\xff\xd7\x03q\x03\ +Q\xff\xd7\x03q\x03R\xff\x9a\x03q\x03S\xff\xd7\x03\ +q\x03T\xff\x9a\x03q\x03U\xff\xd7\x03q\x03V\xff\ +\x9a\x03q\x03W\xff\xd7\x03q\x03X\xff\x9a\x03q\x03\ +Y\xff\xd7\x03q\x03Z\xff\x9a\x03q\x03[\xff\xd7\x03\ +q\x03\x5c\xff\x9a\x03q\x03]\xff\xd7\x03q\x03^\xff\ +\x9a\x03q\x03_\xff\xd7\x03q\x03`\xff\x9a\x03q\x03\ +b\xff\xc3\x03q\x03d\xff\xc3\x03q\x03f\xff\xc3\x03\ +q\x03h\xff\xc3\x03q\x03j\xff\xc3\x03q\x03l\xff\ +\xc3\x03q\x03n\xff\xc3\x03r\x00\x05\x00R\x03r\x00\ +\x0a\x00R\x03r\x00\x0f\xff\xae\x03r\x00\x11\xff\xae\x03\ +r\x00\x22\x00)\x03r\x02\x07\x00R\x03r\x02\x08\xff\ +\xae\x03r\x02\x0b\x00R\x03r\x02\x0c\xff\xae\x03s\x00\ +\x0f\xff\x85\x03s\x00\x11\xff\x85\x03s\x00\x22\x00)\x03\ +s\x00$\xff\x85\x03s\x00&\xff\xd7\x03s\x00*\xff\ +\xd7\x03s\x002\xff\xd7\x03s\x004\xff\xd7\x03s\x00\ +D\xff\x9a\x03s\x00F\xff\x9a\x03s\x00G\xff\x9a\x03\ +s\x00H\xff\x9a\x03s\x00J\xff\xd7\x03s\x00P\xff\ +\xc3\x03s\x00Q\xff\xc3\x03s\x00R\xff\x9a\x03s\x00\ +S\xff\xc3\x03s\x00T\xff\x9a\x03s\x00U\xff\xc3\x03\ +s\x00V\xff\xae\x03s\x00X\xff\xc3\x03s\x00]\xff\ +\xd7\x03s\x00\x82\xff\x85\x03s\x00\x83\xff\x85\x03s\x00\ +\x84\xff\x85\x03s\x00\x85\xff\x85\x03s\x00\x86\xff\x85\x03\ +s\x00\x87\xff\x85\x03s\x00\x89\xff\xd7\x03s\x00\x94\xff\ +\xd7\x03s\x00\x95\xff\xd7\x03s\x00\x96\xff\xd7\x03s\x00\ +\x97\xff\xd7\x03s\x00\x98\xff\xd7\x03s\x00\x9a\xff\xd7\x03\ +s\x00\xa2\xff\x9a\x03s\x00\xa3\xff\x9a\x03s\x00\xa4\xff\ +\x9a\x03s\x00\xa5\xff\x9a\x03s\x00\xa6\xff\x9a\x03s\x00\ +\xa7\xff\x9a\x03s\x00\xa8\xff\x9a\x03s\x00\xa9\xff\x9a\x03\ +s\x00\xaa\xff\x9a\x03s\x00\xab\xff\x9a\x03s\x00\xac\xff\ +\x9a\x03s\x00\xad\xff\x9a\x03s\x00\xb4\xff\x9a\x03s\x00\ +\xb5\xff\x9a\x03s\x00\xb6\xff\x9a\x03s\x00\xb7\xff\x9a\x03\ +s\x00\xb8\xff\x9a\x03s\x00\xba\xff\x9a\x03s\x00\xbb\xff\ +\xc3\x03s\x00\xbc\xff\xc3\x03s\x00\xbd\xff\xc3\x03s\x00\ +\xbe\xff\xc3\x03s\x00\xc2\xff\x85\x03s\x00\xc3\xff\x9a\x03\ +s\x00\xc4\xff\x85\x03s\x00\xc5\xff\x9a\x03s\x00\xc6\xff\ +\x85\x03s\x00\xc7\xff\x9a\x03s\x00\xc8\xff\xd7\x03s\x00\ +\xc9\xff\x9a\x03s\x00\xca\xff\xd7\x03s\x00\xcb\xff\x9a\x03\ +s\x00\xcc\xff\xd7\x03s\x00\xcd\xff\x9a\x03s\x00\xce\xff\ +\xd7\x03s\x00\xcf\xff\x9a\x03s\x00\xd1\xff\x9a\x03s\x00\ +\xd3\xff\x9a\x03s\x00\xd5\xff\x9a\x03s\x00\xd7\xff\x9a\x03\ +s\x00\xd9\xff\x9a\x03s\x00\xdb\xff\x9a\x03s\x00\xdd\xff\ +\x9a\x03s\x00\xde\xff\xd7\x03s\x00\xdf\xff\xd7\x03s\x00\ +\xe0\xff\xd7\x03s\x00\xe1\xff\xd7\x03s\x00\xe2\xff\xd7\x03\ +s\x00\xe3\xff\xd7\x03s\x00\xe4\xff\xd7\x03s\x00\xe5\xff\ +\xd7\x03s\x00\xfa\xff\xc3\x03s\x01\x06\xff\xc3\x03s\x01\ +\x08\xff\xc3\x03s\x01\x0d\xff\xc3\x03s\x01\x0e\xff\xd7\x03\ +s\x01\x0f\xff\x9a\x03s\x01\x10\xff\xd7\x03s\x01\x11\xff\ +\x9a\x03s\x01\x12\xff\xd7\x03s\x01\x13\xff\x9a\x03s\x01\ +\x14\xff\xd7\x03s\x01\x15\xff\x9a\x03s\x01\x17\xff\xc3\x03\ +s\x01\x19\xff\xc3\x03s\x01\x1d\xff\xae\x03s\x01!\xff\ +\xae\x03s\x01+\xff\xc3\x03s\x01-\xff\xc3\x03s\x01\ +/\xff\xc3\x03s\x011\xff\xc3\x03s\x013\xff\xc3\x03\ +s\x015\xff\xc3\x03s\x01<\xff\xd7\x03s\x01>\xff\ +\xd7\x03s\x01@\xff\xd7\x03s\x01C\xff\x85\x03s\x01\ +D\xff\x9a\x03s\x01F\xff\x9a\x03s\x01G\xff\xd7\x03\ +s\x01H\xff\x9a\x03s\x01J\xff\xae\x03s\x02\x08\xff\ +\x85\x03s\x02\x0c\xff\x85\x03s\x02W\xff\xc3\x03s\x02\ +X\xff\x85\x03s\x02Y\xff\x9a\x03s\x02_\xff\xd7\x03\ +s\x02`\xff\x9a\x03s\x02b\xff\xc3\x03s\x03\x1d\xff\ +\x85\x03s\x03\x1e\xff\x9a\x03s\x03\x1f\xff\x85\x03s\x03\ + \xff\x9a\x03s\x03!\xff\x85\x03s\x03\x22\xff\x9a\x03\ +s\x03#\xff\x85\x03s\x03%\xff\x85\x03s\x03&\xff\ +\x9a\x03s\x03'\xff\x85\x03s\x03(\xff\x9a\x03s\x03\ +)\xff\x85\x03s\x03*\xff\x9a\x03s\x03+\xff\x85\x03\ +s\x03,\xff\x9a\x03s\x03-\xff\x85\x03s\x03.\xff\ +\x9a\x03s\x03/\xff\x85\x03s\x030\xff\x9a\x03s\x03\ +1\xff\x85\x03s\x032\xff\x9a\x03s\x033\xff\x85\x03\ +s\x034\xff\x9a\x03s\x036\xff\x9a\x03s\x038\xff\ +\x9a\x03s\x03:\xff\x9a\x03s\x03<\xff\x9a\x03s\x03\ +@\xff\x9a\x03s\x03B\xff\x9a\x03s\x03D\xff\x9a\x03\ +s\x03I\xff\xd7\x03s\x03J\xff\x9a\x03s\x03K\xff\ +\xd7\x03s\x03L\xff\x9a\x03s\x03M\xff\xd7\x03s\x03\ +N\xff\x9a\x03s\x03O\xff\xd7\x03s\x03Q\xff\xd7\x03\ +s\x03R\xff\x9a\x03s\x03S\xff\xd7\x03s\x03T\xff\ +\x9a\x03s\x03U\xff\xd7\x03s\x03V\xff\x9a\x03s\x03\ +W\xff\xd7\x03s\x03X\xff\x9a\x03s\x03Y\xff\xd7\x03\ +s\x03Z\xff\x9a\x03s\x03[\xff\xd7\x03s\x03\x5c\xff\ +\x9a\x03s\x03]\xff\xd7\x03s\x03^\xff\x9a\x03s\x03\ +_\xff\xd7\x03s\x03`\xff\x9a\x03s\x03b\xff\xc3\x03\ +s\x03d\xff\xc3\x03s\x03f\xff\xc3\x03s\x03h\xff\ +\xc3\x03s\x03j\xff\xc3\x03s\x03l\xff\xc3\x03s\x03\ +n\xff\xc3\x03t\x00\x05\x00R\x03t\x00\x0a\x00R\x03\ +t\x00\x0f\xff\xae\x03t\x00\x11\xff\xae\x03t\x00\x22\x00\ +)\x03t\x02\x07\x00R\x03t\x02\x08\xff\xae\x03t\x02\ +\x0b\x00R\x03t\x02\x0c\xff\xae\x03\x8d\x00\x05\x00{\x03\ +\x8d\x00\x0a\x00{\x03\x8d\x02\x07\x00{\x03\x8d\x02\x0b\x00\ +{\x03\x8f\x00\x0f\xff\x85\x03\x8f\x00\x10\xff\xae\x03\x8f\x00\ +\x11\xff\x85\x03\x8f\x00\x22\x00)\x03\x8f\x00$\xffq\x03\ +\x8f\x00&\xff\xd7\x03\x8f\x00*\xff\xd7\x03\x8f\x002\xff\ +\xd7\x03\x8f\x004\xff\xd7\x03\x8f\x007\x00)\x03\x8f\x00\ +D\xff\x5c\x03\x8f\x00F\xffq\x03\x8f\x00G\xffq\x03\ +\x8f\x00H\xffq\x03\x8f\x00J\xffq\x03\x8f\x00P\xff\ +\x9a\x03\x8f\x00Q\xff\x9a\x03\x8f\x00R\xffq\x03\x8f\x00\ +S\xff\x9a\x03\x8f\x00T\xffq\x03\x8f\x00U\xff\x9a\x03\ +\x8f\x00V\xff\x85\x03\x8f\x00X\xff\x9a\x03\x8f\x00Y\xff\ +\xd7\x03\x8f\x00Z\xff\xd7\x03\x8f\x00[\xff\xd7\x03\x8f\x00\ +\x5c\xff\xd7\x03\x8f\x00]\xff\xae\x03\x8f\x00\x82\xffq\x03\ +\x8f\x00\x83\xffq\x03\x8f\x00\x84\xffq\x03\x8f\x00\x85\xff\ +q\x03\x8f\x00\x86\xffq\x03\x8f\x00\x87\xffq\x03\x8f\x00\ +\x89\xff\xd7\x03\x8f\x00\x94\xff\xd7\x03\x8f\x00\x95\xff\xd7\x03\ +\x8f\x00\x96\xff\xd7\x03\x8f\x00\x97\xff\xd7\x03\x8f\x00\x98\xff\ +\xd7\x03\x8f\x00\x9a\xff\xd7\x03\x8f\x00\xa2\xffq\x03\x8f\x00\ +\xa3\xff\x5c\x03\x8f\x00\xa4\xff\x5c\x03\x8f\x00\xa5\xff\x5c\x03\ +\x8f\x00\xa6\xff\x5c\x03\x8f\x00\xa7\xff\x5c\x03\x8f\x00\xa8\xff\ +\x5c\x03\x8f\x00\xa9\xffq\x03\x8f\x00\xaa\xffq\x03\x8f\x00\ +\xab\xffq\x03\x8f\x00\xac\xffq\x03\x8f\x00\xad\xffq\x03\ +\x8f\x00\xb4\xffq\x03\x8f\x00\xb5\xffq\x03\x8f\x00\xb6\xff\ +q\x03\x8f\x00\xb7\xffq\x03\x8f\x00\xb8\xffq\x03\x8f\x00\ +\xba\xffq\x03\x8f\x00\xbb\xff\x9a\x03\x8f\x00\xbc\xff\x9a\x03\ +\x8f\x00\xbd\xff\x9a\x03\x8f\x00\xbe\xff\x9a\x03\x8f\x00\xbf\xff\ +\xd7\x03\x8f\x00\xc2\xffq\x03\x8f\x00\xc3\xff\x5c\x03\x8f\x00\ +\xc4\xffq\x03\x8f\x00\xc5\xff\x5c\x03\x8f\x00\xc6\xffq\x03\ +\x8f\x00\xc7\xff\x5c\x03\x8f\x00\xc8\xff\xd7\x03\x8f\x00\xc9\xff\ +q\x03\x8f\x00\xca\xff\xd7\x03\x8f\x00\xcb\xffq\x03\x8f\x00\ +\xcc\xff\xd7\x03\x8f\x00\xcd\xffq\x03\x8f\x00\xce\xff\xd7\x03\ +\x8f\x00\xcf\xffq\x03\x8f\x00\xd1\xffq\x03\x8f\x00\xd3\xff\ +q\x03\x8f\x00\xd5\xffq\x03\x8f\x00\xd7\xffq\x03\x8f\x00\ +\xd9\xffq\x03\x8f\x00\xdb\xffq\x03\x8f\x00\xdd\xffq\x03\ +\x8f\x00\xde\xff\xd7\x03\x8f\x00\xdf\xffq\x03\x8f\x00\xe0\xff\ +\xd7\x03\x8f\x00\xe1\xffq\x03\x8f\x00\xe2\xff\xd7\x03\x8f\x00\ +\xe3\xffq\x03\x8f\x00\xe4\xff\xd7\x03\x8f\x00\xe5\xffq\x03\ +\x8f\x00\xfa\xff\x9a\x03\x8f\x01\x06\xff\x9a\x03\x8f\x01\x08\xff\ +\x9a\x03\x8f\x01\x0d\xff\x9a\x03\x8f\x01\x0e\xff\xd7\x03\x8f\x01\ +\x0f\xffq\x03\x8f\x01\x10\xff\xd7\x03\x8f\x01\x11\xffq\x03\ +\x8f\x01\x12\xff\xd7\x03\x8f\x01\x13\xffq\x03\x8f\x01\x14\xff\ +\xd7\x03\x8f\x01\x15\xffq\x03\x8f\x01\x17\xff\x9a\x03\x8f\x01\ +\x19\xff\x9a\x03\x8f\x01\x1d\xff\x85\x03\x8f\x01!\xff\x85\x03\ +\x8f\x01$\x00)\x03\x8f\x01&\x00)\x03\x8f\x01+\xff\ +\x9a\x03\x8f\x01-\xff\x9a\x03\x8f\x01/\xff\x9a\x03\x8f\x01\ +1\xff\x9a\x03\x8f\x013\xff\x9a\x03\x8f\x015\xff\x9a\x03\ +\x8f\x017\xff\xd7\x03\x8f\x01<\xff\xae\x03\x8f\x01>\xff\ +\xae\x03\x8f\x01@\xff\xae\x03\x8f\x01C\xffq\x03\x8f\x01\ +D\xff\x5c\x03\x8f\x01F\xff\x5c\x03\x8f\x01G\xff\xd7\x03\ +\x8f\x01H\xffq\x03\x8f\x01J\xff\x85\x03\x8f\x01\xfb\xff\ +\xd7\x03\x8f\x01\xfd\xff\xd7\x03\x8f\x02\x02\xff\xae\x03\x8f\x02\ +\x03\xff\xae\x03\x8f\x02\x04\xff\xae\x03\x8f\x02\x08\xff\x85\x03\ +\x8f\x02\x0c\xff\x85\x03\x8f\x02W\xff\x9a\x03\x8f\x02X\xff\ +q\x03\x8f\x02Y\xff\x5c\x03\x8f\x02_\xff\xd7\x03\x8f\x02\ +`\xffq\x03\x8f\x02b\xff\x9a\x03\x8f\x03\x1d\xffq\x03\ +\x8f\x03\x1e\xff\x5c\x03\x8f\x03\x1f\xffq\x03\x8f\x03 \xff\ +\x5c\x03\x8f\x03!\xffq\x03\x8f\x03\x22\xff\x5c\x03\x8f\x03\ +#\xffq\x03\x8f\x03%\xffq\x03\x8f\x03&\xff\x5c\x03\ +\x8f\x03'\xffq\x03\x8f\x03(\xff\x5c\x03\x8f\x03)\xff\ +q\x03\x8f\x03*\xff\x5c\x03\x8f\x03+\xffq\x03\x8f\x03\ +,\xff\x5c\x03\x8f\x03-\xffq\x03\x8f\x03.\xff\x5c\x03\ +\x8f\x03/\xffq\x03\x8f\x030\xff\x5c\x03\x8f\x031\xff\ +q\x03\x8f\x032\xff\x5c\x03\x8f\x033\xffq\x03\x8f\x03\ +4\xff\x5c\x03\x8f\x036\xffq\x03\x8f\x038\xffq\x03\ +\x8f\x03:\xffq\x03\x8f\x03<\xffq\x03\x8f\x03@\xff\ +q\x03\x8f\x03B\xffq\x03\x8f\x03D\xffq\x03\x8f\x03\ +I\xff\xd7\x03\x8f\x03J\xffq\x03\x8f\x03K\xff\xd7\x03\ +\x8f\x03L\xffq\x03\x8f\x03M\xff\xd7\x03\x8f\x03N\xff\ +q\x03\x8f\x03O\xff\xd7\x03\x8f\x03Q\xff\xd7\x03\x8f\x03\ +R\xffq\x03\x8f\x03S\xff\xd7\x03\x8f\x03T\xffq\x03\ +\x8f\x03U\xff\xd7\x03\x8f\x03V\xffq\x03\x8f\x03W\xff\ +\xd7\x03\x8f\x03X\xffq\x03\x8f\x03Y\xff\xd7\x03\x8f\x03\ +Z\xffq\x03\x8f\x03[\xff\xd7\x03\x8f\x03\x5c\xffq\x03\ +\x8f\x03]\xff\xd7\x03\x8f\x03^\xffq\x03\x8f\x03_\xff\ +\xd7\x03\x8f\x03`\xffq\x03\x8f\x03b\xff\x9a\x03\x8f\x03\ +d\xff\x9a\x03\x8f\x03f\xff\x9a\x03\x8f\x03h\xff\x9a\x03\ +\x8f\x03j\xff\x9a\x03\x8f\x03l\xff\x9a\x03\x8f\x03n\xff\ +\x9a\x03\x8f\x03p\xff\xd7\x03\x8f\x03\x8f\x00)\x03\x90\x00\ +\x05\x00)\x03\x90\x00\x0a\x00)\x03\x90\x02\x07\x00)\x03\ +\x90\x02\x0b\x00)\x00\x00\x00\x00\x00\x1a\x01>\x00\x01\x00\ +\x00\x00\x00\x00\x00\x009\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x09\x009\x00\x01\x00\x00\x00\x00\x00\x02\x00\x04\x00\ +B\x00\x01\x00\x00\x00\x00\x00\x03\x00#\x00F\x00\x01\x00\ +\x00\x00\x00\x00\x04\x00\x0e\x00Q\x00\x01\x00\x00\x00\x00\x00\ +\x05\x00\x0c\x00i\x00\x01\x00\x00\x00\x00\x00\x06\x00\x0d\x00\ +u\x00\x01\x00\x00\x00\x00\x00\x07\x00R\x00\x82\x00\x01\x00\ +\x00\x00\x00\x00\x08\x00\x14\x00\xd4\x00\x01\x00\x00\x00\x00\x00\ +\x0b\x00\x1c\x00\xe8\x00\x01\x00\x00\x00\x00\x00\x0c\x00.\x01\ +\x04\x00\x01\x00\x00\x00\x00\x00\x0d\x00.\x012\x00\x01\x00\ +\x00\x00\x00\x00\x0e\x00*\x01`\x00\x03\x00\x01\x04\x09\x00\ +\x00\x00r\x01\x8a\x00\x03\x00\x01\x04\x09\x00\x01\x00\x12\x01\ +\xfc\x00\x03\x00\x01\x04\x09\x00\x02\x00\x08\x02\x0e\x00\x03\x00\ +\x01\x04\x09\x00\x03\x00F\x02\x16\x00\x03\x00\x01\x04\x09\x00\ +\x04\x00\x1c\x02,\x00\x03\x00\x01\x04\x09\x00\x05\x00\x18\x02\ +\x5c\x00\x03\x00\x01\x04\x09\x00\x06\x00\x1a\x02t\x00\x03\x00\ +\x01\x04\x09\x00\x07\x00\xa4\x02\x8e\x00\x03\x00\x01\x04\x09\x00\ +\x08\x00(\x032\x00\x03\x00\x01\x04\x09\x00\x0b\x008\x03\ +Z\x00\x03\x00\x01\x04\x09\x00\x0c\x00\x5c\x03\x92\x00\x03\x00\ +\x01\x04\x09\x00\x0d\x00\x5c\x03\xee\x00\x03\x00\x01\x04\x09\x00\ +\x0e\x00T\x04JDigitized d\ +ata copyright \xa9 \ +2010-2011, Googl\ +e Corporation.Op\ +en SansBoldAscen\ +der - Open Sans \ +Bold Build 100Ve\ +rsion 1.10OpenSa\ +ns-BoldOpen Sans\ + is a trademark \ +of Google and ma\ +y be registered \ +in certain juris\ +dictions.Ascende\ +r Corporationhtt\ +p://www.ascender\ +corp.com/http://\ +www.ascendercorp\ +.com/typedesigne\ +rs.htmlLicensed \ +under the Apache\ + License, Versio\ +n 2.0http://www.\ +apache.org/licen\ +ses/LICENSE-2.0\x00\ +D\x00i\x00g\x00i\x00t\x00i\x00z\x00e\x00\ +d\x00 \x00d\x00a\x00t\x00a\x00 \x00c\x00\ +o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00\ + \x00\xa9\x00 \x002\x000\x001\x000\x00-\x00\ +2\x000\x001\x001\x00,\x00 \x00G\x00o\x00\ +o\x00g\x00l\x00e\x00 \x00C\x00o\x00r\x00\ +p\x00o\x00r\x00a\x00t\x00i\x00o\x00n\x00\ +.\x00O\x00p\x00e\x00n\x00 \x00S\x00a\x00\ +n\x00s\x00B\x00o\x00l\x00d\x00A\x00s\x00\ +c\x00e\x00n\x00d\x00e\x00r\x00 \x00-\x00\ + \x00O\x00p\x00e\x00n\x00 \x00S\x00a\x00\ +n\x00s\x00 \x00B\x00o\x00l\x00d\x00 \x00\ +B\x00u\x00i\x00l\x00d\x00 \x001\x000\x00\ +0\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\ + \x001\x00.\x001\x000\x00O\x00p\x00e\x00\ +n\x00S\x00a\x00n\x00s\x00-\x00B\x00o\x00\ +l\x00d\x00O\x00p\x00e\x00n\x00 \x00S\x00\ +a\x00n\x00s\x00 \x00i\x00s\x00 \x00a\x00\ + \x00t\x00r\x00a\x00d\x00e\x00m\x00a\x00\ +r\x00k\x00 \x00o\x00f\x00 \x00G\x00o\x00\ +o\x00g\x00l\x00e\x00 \x00a\x00n\x00d\x00\ + \x00m\x00a\x00y\x00 \x00b\x00e\x00 \x00\ +r\x00e\x00g\x00i\x00s\x00t\x00e\x00r\x00\ +e\x00d\x00 \x00i\x00n\x00 \x00c\x00e\x00\ +r\x00t\x00a\x00i\x00n\x00 \x00j\x00u\x00\ +r\x00i\x00s\x00d\x00i\x00c\x00t\x00i\x00\ +o\x00n\x00s\x00.\x00A\x00s\x00c\x00e\x00\ +n\x00d\x00e\x00r\x00 \x00C\x00o\x00r\x00\ +p\x00o\x00r\x00a\x00t\x00i\x00o\x00n\x00\ +h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\x00\ +w\x00w\x00.\x00a\x00s\x00c\x00e\x00n\x00\ +d\x00e\x00r\x00c\x00o\x00r\x00p\x00.\x00\ +c\x00o\x00m\x00/\x00h\x00t\x00t\x00p\x00\ +:\x00/\x00/\x00w\x00w\x00w\x00.\x00a\x00\ +s\x00c\x00e\x00n\x00d\x00e\x00r\x00c\x00\ +o\x00r\x00p\x00.\x00c\x00o\x00m\x00/\x00\ +t\x00y\x00p\x00e\x00d\x00e\x00s\x00i\x00\ +g\x00n\x00e\x00r\x00s\x00.\x00h\x00t\x00\ +m\x00l\x00L\x00i\x00c\x00e\x00n\x00s\x00\ +e\x00d\x00 \x00u\x00n\x00d\x00e\x00r\x00\ + \x00t\x00h\x00e\x00 \x00A\x00p\x00a\x00\ +c\x00h\x00e\x00 \x00L\x00i\x00c\x00e\x00\ +n\x00s\x00e\x00,\x00 \x00V\x00e\x00r\x00\ +s\x00i\x00o\x00n\x00 \x002\x00.\x000\x00\ +h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\x00\ +w\x00w\x00.\x00a\x00p\x00a\x00c\x00h\x00\ +e\x00.\x00o\x00r\x00g\x00/\x00l\x00i\x00\ +c\x00e\x00n\x00s\x00e\x00s\x00/\x00L\x00\ +I\x00C\x00E\x00N\x00S\x00E\x00-\x002\x00\ +.\x000\x00\x02\x00\x00\x00\x00\x00\x00\xfff\x00f\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x03\xaa\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\ +\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x0e\x01\ +\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\ +\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\ +\x1f\x01 \x01!\x01\x22\x01#\x01$\x01%\x01&\x01\ +'\x01(\x01)\x01*\x01+\x01,\x01-\x01.\x01\ +/\x010\x011\x012\x013\x014\x015\x016\x01\ +7\x018\x019\x01:\x01;\x01<\x01=\x01>\x01\ +?\x01@\x01A\x01B\x01C\x01D\x01E\x01F\x01\ +G\x01H\x01I\x01J\x01K\x01L\x01M\x01N\x01\ +O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01\ +W\x01X\x01Y\x01Z\x01[\x01\x5c\x01]\x01^\x01\ +_\x01`\x01a\x01b\x01c\x01d\x01e\x01f\x01\ +g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01\ +o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01\ +w\x01x\x01y\x01z\x01{\x01|\x01}\x01~\x01\ +\x7f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\ +\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\ +\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\ +\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\ +\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\ +\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\ +\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\ +\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\ +\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\ +\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\ +\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\ +\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\ +\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\ +\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\ +\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\ +\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\ +\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\ +\x07\x02\x08\x02\x09\x02\x0a\x02\x0b\x02\x0c\x02\x0d\x02\x0e\x02\ +\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\ +\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\ +\x1f\x02 \x02!\x02\x22\x02#\x02$\x02%\x02&\x02\ +'\x02(\x02)\x02*\x02+\x02,\x02-\x02.\x02\ +/\x020\x021\x022\x023\x024\x025\x026\x02\ +7\x028\x029\x02:\x02;\x02<\x02=\x02>\x02\ +?\x02@\x02A\x02B\x02C\x02D\x02E\x02F\x02\ +G\x02H\x02I\x02J\x02K\x02L\x02M\x02N\x02\ +O\x02P\x02Q\x02R\x02S\x02T\x02U\x02V\x02\ +W\x02X\x02Y\x02Z\x02[\x02\x5c\x02]\x02^\x02\ +_\x02`\x02a\x02b\x02c\x02d\x02e\x02f\x02\ +g\x02h\x02i\x02j\x02k\x02l\x02m\x02n\x02\ +o\x02p\x02q\x02r\x02s\x02t\x02u\x02v\x02\ +w\x02x\x02y\x02z\x02{\x02|\x02}\x02~\x02\ +\x7f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\ +\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\ +\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\ +\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\ +\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\ +\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\ +\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\ +\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\ +\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\ +\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\ +\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\ +\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\ +\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\ +\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\ +\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\ +\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\ +\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\ +\x07\x03\x08\x03\x09\x03\x0a\x03\x0b\x03\x0c\x03\x0d\x03\x0e\x03\ +\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\ +\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\ +\x1f\x03 \x03!\x03\x22\x03#\x03$\x03%\x03&\x03\ +'\x03(\x03)\x03*\x03+\x03,\x03-\x03.\x03\ +/\x030\x031\x032\x033\x034\x035\x036\x03\ +7\x038\x039\x03:\x03;\x03<\x03=\x03>\x03\ +?\x03@\x03A\x03B\x03C\x03D\x03E\x03F\x03\ +G\x03H\x03I\x03J\x03K\x03L\x03M\x03N\x03\ +O\x03P\x03Q\x03R\x03S\x03T\x03U\x03V\x03\ +W\x03X\x03Y\x03Z\x03[\x03\x5c\x03]\x03^\x03\ +_\x03`\x03a\x03b\x03c\x03d\x03e\x03f\x03\ +g\x03h\x03i\x03j\x03k\x03l\x03m\x03n\x03\ +o\x03p\x03q\x03r\x03s\x03t\x03u\x03v\x03\ +w\x03x\x03y\x03z\x03{\x03|\x03}\x03~\x03\ +\x7f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\ +\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\ +\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\ +\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\ +\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\ +\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\ +\xaf\x03\xb0\x03\xb1\x03\xb2\x03\xb3\x03\xb4\x03\xb5\x03\xb6\x03\ +\xb7\x03\xb8\x03\xb9\x03\xba\x03\xbb\x03\xbc\x03\xbd\x03\xbe\x03\ +\xbf\x03\xc0\x03\xc1\x03\xc2\x03\xc3\x03\xc4\x03\xc5\x03\xc6\x03\ +\xc7\x03\xc8\x03\xc9\x03\xca\x03\xcb\x03\xcc\x03\xcd\x03\xce\x03\ +\xcf\x03\xd0\x03\xd1\x03\xd2\x03\xd3\x03\xd4\x03\xd5\x03\xd6\x03\ +\xd7\x03\xd8\x03\xd9\x03\xda\x03\xdb\x03\xdc\x03\xdd\x03\xde\x03\ +\xdf\x03\xe0\x03\xe1\x03\xe2\x03\xe3\x03\xe4\x03\xe5\x03\xe6\x03\ +\xe7\x03\xe8\x03\xe9\x03\xea\x03\xeb\x03\xec\x03\xed\x03\xee\x03\ +\xef\x03\xf0\x03\xf1\x03\xf2\x03\xf3\x03\xf4\x03\xf5\x03\xf6\x03\ +\xf7\x03\xf8\x03\xf9\x03\xfa\x03\xfb\x03\xfc\x03\xfd\x03\xfe\x03\ +\xff\x04\x00\x04\x01\x04\x02\x04\x03\x04\x04\x04\x05\x04\x06\x04\ +\x07\x04\x08\x04\x09\x04\x0a\x04\x0b\x04\x0c\x04\x0d\x04\x0e\x04\ +\x0f\x04\x10\x04\x11\x04\x12\x04\x13\x04\x14\x04\x15\x04\x16\x04\ +\x17\x04\x18\x04\x19\x04\x1a\x04\x1b\x04\x1c\x04\x1d\x04\x1e\x04\ +\x1f\x04 \x04!\x04\x22\x04#\x04$\x04%\x04&\x04\ +'\x04(\x04)\x04*\x04+\x04,\x04-\x04.\x04\ +/\x040\x041\x042\x043\x044\x045\x046\x04\ +7\x048\x049\x04:\x04;\x04<\x04=\x04>\x04\ +?\x04@\x04A\x04B\x04C\x04D\x04E\x04F\x04\ +G\x04H\x04I\x04J\x04K\x04L\x04M\x04N\x04\ +O\x04P\x04Q\x04R\x04S\x04T\x04U\x04V\x04\ +W\x04X\x04Y\x04Z\x04[\x04\x5c\x04]\x04^\x04\ +_\x04`\x04a\x04b\x04c\x04d\x04e\x04f\x04\ +g\x04h\x04i\x04j\x04k\x04l\x04m\x04n\x04\ +o\x04p\x04q\x04r\x04s\x04t\x04u\x04v\x04\ +w\x04x\x04y\x04z\x04{\x04|\x04}\x04~\x04\ +\x7f\x04\x80\x04\x81\x04\x82\x04\x83\x04\x84\x04\x85\x04\x86\x04\ +\x87\x04\x88\x04\x89\x04\x8a\x04\x8b\x04\x8c\x04\x8d\x04\x8e\x04\ +\x8f\x04\x90\x04\x91\x04\x92\x04\x93\x04\x94\x04\x95\x04\x96\x04\ +\x97\x04\x98\x04\x99\x04\x9a\x04\x9b\x04\x9c\x04\x9d\x04\x9e\x04\ +\x9f\x04\xa0\x04\xa1\x04\xa2\x04\xa3\x04\xa4\x04\xa5\x04\xa6\x04\ +\xa7\x04\xa8\x04\xa9\x04\xaa\x04\xab\x07.notde\ +f\x04null\x10nonmarkin\ +greturn\x05space\x06ex\ +clam\x08quotedbl\x0anu\ +mbersign\x06dollar\x07\ +percent\x09ampersan\ +d\x0bquotesingle\x09pa\ +renleft\x0aparenrig\ +ht\x08asterisk\x04plus\ +\x05comma\x06hyphen\x06pe\ +riod\x05slash\x04zero\x03\ +one\x03two\x05three\x04fo\ +ur\x04five\x03six\x05seve\ +n\x05eight\x04nine\x05col\ +on\x09semicolon\x04les\ +s\x05equal\x07greater\x08\ +question\x02at\x01A\x01B\x01\ +C\x01D\x01E\x01F\x01G\x01H\x05I.al\ +t\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01\ +Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01\ +Y\x01Z\x0bbracketleft\x09\ +backslash\x0cbracke\ +tright\x0basciicirc\ +um\x0aunderscore\x05gr\ +ave\x01a\x01b\x01c\x01d\x01e\x01f\x01\ +g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01\ +o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01\ +w\x01x\x01y\x01z\x09bracelef\ +t\x03bar\x0abraceright\ +\x0aasciitilde\x10nonb\ +reakingspace\x0aexc\ +lamdown\x04cent\x08ste\ +rling\x08currency\x03y\ +en\x09brokenbar\x07sec\ +tion\x08dieresis\x09co\ +pyright\x0bordfemin\ +ine\x0dguillemotlef\ +t\x0alogicalnot\x07uni\ +00AD\x0aregistered\x09\ +overscore\x06degree\ +\x09plusminus\x0btwosu\ +perior\x0dthreesupe\ +rior\x05acute\x02mu\x09pa\ +ragraph\x0eperiodce\ +ntered\x07cedilla\x0bo\ +nesuperior\x0cordma\ +sculine\x0eguillemo\ +tright\x0aonequarte\ +r\x07onehalf\x0dthreeq\ +uarters\x0cquestion\ +down\x06Agrave\x06Aacu\ +te\x0bAcircumflex\x06A\ +tilde\x09Adieresis\x05\ +Aring\x02AE\x08Ccedill\ +a\x06Egrave\x06Eacute\x0b\ +Ecircumflex\x09Edie\ +resis\x0aIgrave.alt\ +\x0aIacute.alt\x0fIcir\ +cumflex.alt\x0dIdie\ +resis.alt\x03Eth\x06Nt\ +ilde\x06Ograve\x06Oacu\ +te\x0bOcircumflex\x06O\ +tilde\x09Odieresis\x08\ +multiply\x06Oslash\x06\ +Ugrave\x06Uacute\x0bUc\ +ircumflex\x09Udiere\ +sis\x06Yacute\x05Thorn\ +\x0agermandbls\x06agra\ +ve\x06aacute\x0bacircu\ +mflex\x06atilde\x09adi\ +eresis\x05aring\x02ae\x08\ +ccedilla\x06egrave\x06\ +eacute\x0becircumfl\ +ex\x09edieresis\x06igr\ +ave\x06iacute\x0bicirc\ +umflex\x09idieresis\ +\x03eth\x06ntilde\x06ogra\ +ve\x06oacute\x0bocircu\ +mflex\x06otilde\x09odi\ +eresis\x06divide\x06os\ +lash\x06ugrave\x06uacu\ +te\x0bucircumflex\x09u\ +dieresis\x06yacute\x05\ +thorn\x09ydieresis\x07\ +Amacron\x07amacron\x06\ +Abreve\x06abreve\x07Ao\ +gonek\x07aogonek\x06Ca\ +cute\x06cacute\x0bCcir\ +cumflex\x0bccircumf\ +lex\x04Cdot\x04cdot\x06Cc\ +aron\x06ccaron\x06Dcar\ +on\x06dcaron\x06Dcroat\ +\x06dcroat\x07Emacron\x07\ +emacron\x06Ebreve\x06e\ +breve\x0aEdotaccent\ +\x0aedotaccent\x07Eogo\ +nek\x07eogonek\x06Ecar\ +on\x06ecaron\x0bGcircu\ +mflex\x0bgcircumfle\ +x\x06Gbreve\x06gbreve\x04\ +Gdot\x04gdot\x0cGcomma\ +accent\x0cgcommaacc\ +ent\x0bHcircumflex\x0b\ +hcircumflex\x04Hbar\ +\x04hbar\x0aItilde.alt\ +\x06itilde\x0bImacron.\ +alt\x07imacron\x0aIbre\ +ve.alt\x06ibreve\x0bIo\ +gonek.alt\x07iogone\ +k\x0eIdotaccent.alt\ +\x08dotlessi\x06IJ.alt\ +\x02ij\x0bJcircumflex\x0b\ +jcircumflex\x0cKcom\ +maaccent\x0ckcommaa\ +ccent\x0ckgreenland\ +ic\x06Lacute\x06lacute\ +\x0cLcommaaccent\x0clc\ +ommaaccent\x06Lcaro\ +n\x06lcaron\x04Ldot\x04ld\ +ot\x06Lslash\x06lslash\ +\x06Nacute\x06nacute\x0cN\ +commaaccent\x0cncom\ +maaccent\x06Ncaron\x06\ +ncaron\x0bnapostrop\ +he\x03Eng\x03eng\x07Omacr\ +on\x07omacron\x06Obrev\ +e\x06obreve\x0dOhungar\ +umlaut\x0dohungarum\ +laut\x02OE\x02oe\x06Racut\ +e\x06racute\x0cRcommaa\ +ccent\x0crcommaacce\ +nt\x06Rcaron\x06rcaron\ +\x06Sacute\x06sacute\x0bS\ +circumflex\x0bscirc\ +umflex\x08Scedilla\x08\ +scedilla\x06Scaron\x06\ +scaron\x0cTcommaacc\ +ent\x0ctcommaaccent\ +\x06Tcaron\x06tcaron\x04T\ +bar\x04tbar\x06Utilde\x06\ +utilde\x07Umacron\x07u\ +macron\x06Ubreve\x06ub\ +reve\x05Uring\x05uring\ +\x0dUhungarumlaut\x0du\ +hungarumlaut\x07Uog\ +onek\x07uogonek\x0bWci\ +rcumflex\x0bwcircum\ +flex\x0bYcircumflex\ +\x0bycircumflex\x09Ydi\ +eresis\x06Zacute\x06za\ +cute\x0aZdotaccent\x0a\ +zdotaccent\x06Zcaro\ +n\x06zcaron\x05longs\x06f\ +lorin\x0aAringacute\ +\x0aaringacute\x07AEac\ +ute\x07aeacute\x0bOsla\ +shacute\x0boslashac\ +ute\x0cScommaaccent\ +\x0cscommaaccent\x0aci\ +rcumflex\x05caron\x06m\ +acron\x05breve\x09dota\ +ccent\x04ring\x06ogone\ +k\x05tilde\x0chungarum\ +laut\x05tonos\x0ddiere\ +sistonos\x0aAlphato\ +nos\x09anoteleia\x0cEp\ +silontonos\x08Etato\ +nos\x0dIotatonos.al\ +t\x0cOmicrontonos\x0cU\ +psilontonos\x0aOmeg\ +atonos\x11iotadiere\ +sistonos\x05Alpha\x04B\ +eta\x05Gamma\x07uni039\ +4\x07Epsilon\x04Zeta\x03E\ +ta\x05Theta\x08Iota.al\ +t\x05Kappa\x06Lambda\x02M\ +u\x02Nu\x02Xi\x07Omicron\x02\ +Pi\x03Rho\x05Sigma\x03Tau\ +\x07Upsilon\x03Phi\x03Chi\ +\x03Psi\x07uni03A9\x10Iot\ +adieresis.alt\x0fUp\ +silondieresis\x0aal\ +phatonos\x0cepsilon\ +tonos\x08etatonos\x09i\ +otatonos\x14upsilon\ +dieresistonos\x05al\ +pha\x04beta\x05gamma\x05d\ +elta\x07epsilon\x04zet\ +a\x03eta\x05theta\x04iota\ +\x05kappa\x06lambda\x07un\ +i03BC\x02nu\x02xi\x07omic\ +ron\x02pi\x03rho\x06sigma\ +1\x05sigma\x03tau\x07upsi\ +lon\x03phi\x03chi\x03psi\x05\ +omega\x0ciotadieres\ +is\x0fupsilondieres\ +is\x0comicrontonos\x0c\ +upsilontonos\x0aome\ +gatonos\x09afii1002\ +3\x09afii10051\x09afii\ +10052\x09afii10053\x09\ +afii10054\x0dafii10\ +055.alt\x0dafii1005\ +6.alt\x09afii10057\x09\ +afii10058\x09afii10\ +059\x09afii10060\x09af\ +ii10061\x09afii1006\ +2\x09afii10145\x09afii\ +10017\x09afii10018\x09\ +afii10019\x09afii10\ +020\x09afii10021\x09af\ +ii10022\x09afii1002\ +4\x09afii10025\x09afii\ +10026\x09afii10027\x09\ +afii10028\x09afii10\ +029\x09afii10030\x09af\ +ii10031\x09afii1003\ +2\x09afii10033\x09afii\ +10034\x09afii10035\x09\ +afii10036\x09afii10\ +037\x09afii10038\x09af\ +ii10039\x09afii1004\ +0\x09afii10041\x09afii\ +10042\x09afii10043\x09\ +afii10044\x09afii10\ +045\x09afii10046\x09af\ +ii10047\x09afii1004\ +8\x09afii10049\x09afii\ +10065\x09afii10066\x09\ +afii10067\x09afii10\ +068\x09afii10069\x09af\ +ii10070\x09afii1007\ +2\x09afii10073\x09afii\ +10074\x09afii10075\x09\ +afii10076\x09afii10\ +077\x09afii10078\x09af\ +ii10079\x09afii1008\ +0\x09afii10081\x09afii\ +10082\x09afii10083\x09\ +afii10084\x09afii10\ +085\x09afii10086\x09af\ +ii10087\x09afii1008\ +8\x09afii10089\x09afii\ +10090\x09afii10091\x09\ +afii10092\x09afii10\ +093\x09afii10094\x09af\ +ii10095\x09afii1009\ +6\x09afii10097\x09afii\ +10071\x09afii10099\x09\ +afii10100\x09afii10\ +101\x09afii10102\x09af\ +ii10103\x09afii1010\ +4\x09afii10105\x09afii\ +10106\x09afii10107\x09\ +afii10108\x09afii10\ +109\x09afii10110\x09af\ +ii10193\x09afii1005\ +0\x09afii10098\x06Wgra\ +ve\x06wgrave\x06Wacute\ +\x06wacute\x09Wdieresi\ +s\x09wdieresis\x06Ygra\ +ve\x06ygrave\x06endash\ +\x06emdash\x09afii0020\ +8\x0dunderscoredbl\x09\ +quoteleft\x0aquoter\ +ight\x0equotesinglb\ +ase\x0dquotereverse\ +d\x0cquotedblleft\x0dq\ +uotedblright\x0cquo\ +tedblbase\x06dagger\ +\x09daggerdbl\x06bulle\ +t\x08ellipsis\x0bperth\ +ousand\x06minute\x06se\ +cond\x0dguilsinglle\ +ft\x0eguilsinglrigh\ +t\x09exclamdbl\x08frac\ +tion\x09nsuperior\x05f\ +ranc\x09afii08941\x06p\ +eseta\x04Euro\x09afii6\ +1248\x09afii61289\x09a\ +fii61352\x09tradema\ +rk\x05Omega\x09estimat\ +ed\x09oneeighth\x0cthr\ +eeeighths\x0bfiveei\ +ghths\x0cseveneight\ +hs\x0bpartialdiff\x05D\ +elta\x07product\x09sum\ +mation\x05minus\x07rad\ +ical\x08infinity\x08in\ +tegral\x0bapproxequ\ +al\x08notequal\x09less\ +equal\x0cgreaterequ\ +al\x07lozenge\x07uniFB\ +01\x07uniFB02\x0dcyril\ +licbreve\x08dotless\ +j\x10caroncommaacce\ +nt\x0bcommaaccent\x11c\ +ommaaccentrotate\ +\x0czerosuperior\x0cfo\ +ursuperior\x0cfives\ +uperior\x0bsixsuper\ +ior\x0dsevensuperio\ +r\x0deightsuperior\x0c\ +ninesuperior\x07uni\ +2000\x07uni2001\x07uni\ +2002\x07uni2003\x07uni\ +2004\x07uni2005\x07uni\ +2006\x07uni2007\x07uni\ +2008\x07uni2009\x07uni\ +200A\x07uni200B\x07uni\ +FEFF\x07uniFFFC\x07uni\ +FFFD\x07uni01F0\x07uni\ +02BC\x07uni03D1\x07uni\ +03D2\x07uni03D6\x07uni\ +1E3E\x07uni1E3F\x07uni\ +1E00\x07uni1E01\x07uni\ +1F4D\x07uni02F3\x09das\ +iaoxia\x07uniFB03\x07u\ +niFB04\x05Ohorn\x05oho\ +rn\x05Uhorn\x05uhorn\x07u\ +ni0300\x07uni0301\x07u\ +ni0303\x04hook\x08dotb\ +elow\x07uni0400\x07uni\ +040D\x07uni0450\x07uni\ +045D\x07uni0460\x07uni\ +0461\x07uni0462\x07uni\ +0463\x07uni0464\x07uni\ +0465\x07uni0466\x07uni\ +0467\x07uni0468\x07uni\ +0469\x07uni046A\x07uni\ +046B\x07uni046C\x07uni\ +046D\x07uni046E\x07uni\ +046F\x07uni0470\x07uni\ +0471\x07uni0472\x07uni\ +0473\x07uni0474\x07uni\ +0475\x07uni0476\x07uni\ +0477\x07uni0478\x07uni\ +0479\x07uni047A\x07uni\ +047B\x07uni047C\x07uni\ +047D\x07uni047E\x07uni\ +047F\x07uni0480\x07uni\ +0481\x07uni0482\x07uni\ +0483\x07uni0484\x07uni\ +0485\x07uni0486\x07uni\ +0488\x07uni0489\x07uni\ +048A\x07uni048B\x07uni\ +048C\x07uni048D\x07uni\ +048E\x07uni048F\x07uni\ +0492\x07uni0493\x07uni\ +0494\x07uni0495\x07uni\ +0496\x07uni0497\x07uni\ +0498\x07uni0499\x07uni\ +049A\x07uni049B\x07uni\ +049C\x07uni049D\x07uni\ +049E\x07uni049F\x07uni\ +04A0\x07uni04A1\x07uni\ +04A2\x07uni04A3\x07uni\ +04A4\x07uni04A5\x07uni\ +04A6\x07uni04A7\x07uni\ +04A8\x07uni04A9\x07uni\ +04AA\x07uni04AB\x07uni\ +04AC\x07uni04AD\x07uni\ +04AE\x07uni04AF\x07uni\ +04B0\x07uni04B1\x07uni\ +04B2\x07uni04B3\x07uni\ +04B4\x07uni04B5\x07uni\ +04B6\x07uni04B7\x07uni\ +04B8\x07uni04B9\x07uni\ +04BA\x07uni04BB\x07uni\ +04BC\x07uni04BD\x07uni\ +04BE\x07uni04BF\x0buni\ +04C0.alt\x07uni04C1\ +\x07uni04C2\x07uni04C3\ +\x07uni04C4\x07uni04C5\ +\x07uni04C6\x07uni04C7\ +\x07uni04C8\x07uni04C9\ +\x07uni04CA\x07uni04CB\ +\x07uni04CC\x07uni04CD\ +\x07uni04CE\x0buni04CF\ +.alt\x07uni04D0\x07uni\ +04D1\x07uni04D2\x07uni\ +04D3\x07uni04D4\x07uni\ +04D5\x07uni04D6\x07uni\ +04D7\x07uni04D8\x07uni\ +04D9\x07uni04DA\x07uni\ +04DB\x07uni04DC\x07uni\ +04DD\x07uni04DE\x07uni\ +04DF\x07uni04E0\x07uni\ +04E1\x07uni04E2\x07uni\ +04E3\x07uni04E4\x07uni\ +04E5\x07uni04E6\x07uni\ +04E7\x07uni04E8\x07uni\ +04E9\x07uni04EA\x07uni\ +04EB\x07uni04EC\x07uni\ +04ED\x07uni04EE\x07uni\ +04EF\x07uni04F0\x07uni\ +04F1\x07uni04F2\x07uni\ +04F3\x07uni04F4\x07uni\ +04F5\x07uni04F6\x07uni\ +04F7\x07uni04F8\x07uni\ +04F9\x07uni04FA\x07uni\ +04FB\x07uni04FC\x07uni\ +04FD\x07uni04FE\x07uni\ +04FF\x07uni0500\x07uni\ +0501\x07uni0502\x07uni\ +0503\x07uni0504\x07uni\ +0505\x07uni0506\x07uni\ +0507\x07uni0508\x07uni\ +0509\x07uni050A\x07uni\ +050B\x07uni050C\x07uni\ +050D\x07uni050E\x07uni\ +050F\x07uni0510\x07uni\ +0511\x07uni0512\x07uni\ +0513\x07uni1EA0\x07uni\ +1EA1\x07uni1EA2\x07uni\ +1EA3\x07uni1EA4\x07uni\ +1EA5\x07uni1EA6\x07uni\ +1EA7\x07uni1EA8\x07uni\ +1EA9\x07uni1EAA\x07uni\ +1EAB\x07uni1EAC\x07uni\ +1EAD\x07uni1EAE\x07uni\ +1EAF\x07uni1EB0\x07uni\ +1EB1\x07uni1EB2\x07uni\ +1EB3\x07uni1EB4\x07uni\ +1EB5\x07uni1EB6\x07uni\ +1EB7\x07uni1EB8\x07uni\ +1EB9\x07uni1EBA\x07uni\ +1EBB\x07uni1EBC\x07uni\ +1EBD\x07uni1EBE\x07uni\ +1EBF\x07uni1EC0\x07uni\ +1EC1\x07uni1EC2\x07uni\ +1EC3\x07uni1EC4\x07uni\ +1EC5\x07uni1EC6\x07uni\ +1EC7\x0buni1EC8.alt\ +\x07uni1EC9\x0buni1ECA\ +.alt\x07uni1ECB\x07uni\ +1ECC\x07uni1ECD\x07uni\ +1ECE\x07uni1ECF\x07uni\ +1ED0\x07uni1ED1\x07uni\ +1ED2\x07uni1ED3\x07uni\ +1ED4\x07uni1ED5\x07uni\ +1ED6\x07uni1ED7\x07uni\ +1ED8\x07uni1ED9\x07uni\ +1EDA\x07uni1EDB\x07uni\ +1EDC\x07uni1EDD\x07uni\ +1EDE\x07uni1EDF\x07uni\ +1EE0\x07uni1EE1\x07uni\ +1EE2\x07uni1EE3\x07uni\ +1EE4\x07uni1EE5\x07uni\ +1EE6\x07uni1EE7\x07uni\ +1EE8\x07uni1EE9\x07uni\ +1EEA\x07uni1EEB\x07uni\ +1EEC\x07uni1EED\x07uni\ +1EEE\x07uni1EEF\x07uni\ +1EF0\x07uni1EF1\x07uni\ +1EF4\x07uni1EF5\x07uni\ +1EF6\x07uni1EF7\x07uni\ +1EF8\x07uni1EF9\x07uni\ +20AB\x07uni030F\x13cir\ +cumflexacutecomb\ +\x13circumflexgrave\ +comb\x12circumflexh\ +ookcomb\x13circumfl\ +extildecomb\x0ebrev\ +eacutecomb\x0ebreve\ +gravecomb\x0dbreveh\ +ookcomb\x0ebrevetil\ +decomb\x10cyrillich\ +ookleft\x11cyrillic\ +bighookUC\x11cyrill\ +icbighookLC\x08one.\ +pnum\x07zero.os\x06one\ +.os\x06two.os\x08three\ +.os\x07four.os\x07five\ +.os\x06six.os\x08seven\ +.os\x08eight.os\x07nin\ +e.os\x02ff\x07uni2120\x08\ +Tcedilla\x08tcedill\ +a\x05g.alt\x0fgcircumf\ +lex.alt\x0agbreve.a\ +lt\x08gdot.alt\x10gcom\ +maaccent.alt\x01I\x06I\ +grave\x06Iacute\x0bIci\ +rcumflex\x09Idieres\ +is\x06Itilde\x07Imacro\ +n\x06Ibreve\x07Iogonek\ +\x0aIdotaccent\x02IJ\x09I\ +otatonos\x04Iota\x0cIo\ +tadieresis\x09afii1\ +0055\x09afii10056\x07u\ +ni04C0\x07uni04CF\x07u\ +ni1EC8\x07uni1ECA\x00\x00\ +\x01\x00\x02\x00\x08\x00\x0a\xff\xff\x00\x0f\x00\x01\x00\x00\x00\ +\x0c\x00\x00\x00\x16\x00\x00\x00\x02\x00\x01\x00\x00\x03\xa9\x00\ +\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x0a\x004\x006\x00\x01latn\x00\x08\x00\x10\x00\ +\x02MOL \x00\x16ROM \x00\x1c\x00\x00\xff\ +\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x0a\x00n\x01\xe4\x00\x01l\ +atn\x00\x08\x00\x10\x00\x02MOL \x00(R\ +OM \x00B\x00\x00\xff\xff\x00\x09\x00\x03\x00\x08\x00\ +\x0b\x00\x00\x00\x0e\x00\x11\x00\x14\x00\x17\x00\x1a\x00\x00\xff\ +\xff\x00\x0a\x00\x04\x00\x06\x00\x09\x00\x0c\x00\x01\x00\x0f\x00\ +\x12\x00\x15\x00\x18\x00\x1b\x00\x00\xff\xff\x00\x0a\x00\x05\x00\ +\x07\x00\x0a\x00\x0d\x00\x02\x00\x10\x00\x13\x00\x16\x00\x19\x00\ +\x1c\x00\x1dliga\x00\xb0liga\x00\xb6l\ +iga\x00\xbclnum\x00\xc2lnum\x00\ +\xc8lnum\x00\xcelocl\x00\xd4loc\ +l\x00\xdaonum\x00\xe0onum\x00\xe8o\ +num\x00\xf0pnum\x00\xf8pnum\x00\ +\xfepnum\x01\x04salt\x01\x0asal\ +t\x01\x12salt\x01\x1ass01\x01\x22s\ +s01\x01*ss01\x012ss02\x01\ +:ss02\x01@ss02\x01Fss0\ +3\x01Lss03\x01Rss03\x01Xt\ +num\x01^tnum\x01ftnum\x01\ +n\x00\x00\x00\x01\x00\x09\x00\x00\x00\x01\x00\x09\x00\x00\x00\ +\x01\x00\x09\x00\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x07\x00\ +\x00\x00\x01\x00\x07\x00\x00\x00\x01\x00\x08\x00\x00\x00\x01\x00\ +\x08\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x02\x00\x02\x00\ +\x03\x00\x00\x00\x02\x00\x02\x00\x03\x00\x00\x00\x01\x00\x04\x00\ +\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x04\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\ +\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x01\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x00\x00\x02\x00\x05\x00\x06\x00\ +\x00\x00\x02\x00\x05\x00\x06\x00\x0a\x00\x16\x00\x1e\x00&\x00\ +.\x006\x00>\x00F\x00N\x00V\x00^\x00\x01\x00\ +\x00\x00\x01\x00P\x00\x01\x00\x00\x00\x01\x00z\x00\x01\x00\ +\x00\x00\x01\x00\xaa\x00\x01\x00\x00\x00\x01\x00\xc6\x00\x01\x00\ +\x00\x00\x01\x00\xee\x00\x01\x00\x00\x00\x01\x00\xf4\x00\x01\x00\ +\x00\x00\x01\x01\x10\x00\x01\x00\x00\x00\x01\x01\x16\x00\x01\x00\ +\x00\x00\x01\x012\x00\x04\x00\x00\x00\x01\x01H\x00\x02\x00\ +\x10\x00\x05\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x00\x02\x00\ +\x05\x00J\x00J\x00\x00\x00\xdf\x00\xdf\x00\x01\x00\xe1\x00\ +\xe1\x00\x02\x00\xe3\x00\xe3\x00\x03\x00\xe5\x00\xe5\x00\x04\x00\ +\x02\x00.\x00\x14\x00,\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\ +\xea\x00\xec\x00\xee\x00\xf0\x00\xf2\x00\xf4\x01Z\x01g\x01\ +w\x01\xa1\x01\xa2\x02\xc9\x02\xd8\x03E\x03G\x00\x02\x00\ +\x01\x03\x96\x03\xa9\x00\x00\x00\x02\x00\x1a\x00\x0a\x03\x83\x03\ +\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\ +\x8c\x00\x02\x00\x01\x00\x13\x00\x1c\x00\x00\x00\x02\x00\x1a\x00\ +\x0a\x03\x83\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\ +\x8b\x03\x8c\x03\x84\x00\x02\x00\x03\x00\x13\x00\x13\x00\x00\x00\ +\x15\x00\x1c\x00\x01\x03\x82\x03\x82\x00\x09\x00\x02\x00\x08\x00\ +\x01\x03\x82\x00\x01\x00\x01\x00\x14\x00\x02\x00\x1a\x00\x0a\x00\ +\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\ +\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\x02\x00\ +\x08\x00\x01\x00\x14\x00\x01\x00\x01\x03\x82\x00\x02\x00\x1a\x00\ +\x0a\x00\x13\x03\x82\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\ +\x1a\x00\x1b\x00\x1c\x00\x02\x00\x01\x03\x83\x03\x8c\x00\x00\x00\ +\x02\x00\x0e\x00\x04\x03\x8f\x03\x90\x01 \x01!\x00\x02\x00\ +\x02\x01$\x01%\x00\x00\x01I\x01J\x00\x02\x00\x01\x00\ +6\x00\x01\x00\x08\x00\x05\x00\x0c\x00\x14\x00\x1c\x00\x22\x00\ +(\x02^\x00\x03\x00I\x00O\x02]\x00\x03\x00I\x00\ +L\x03\x8d\x00\x02\x00I\x025\x00\x02\x00O\x024\x00\ +\x02\x00L\x00\x01\x00\x01\x00I\x00\x00\x00\x00\x00\x01\x00\ +\x01\x00\x01\x00\x00\x00\x01\x00\x00\x15^\x00\x00\x00\x14\x00\ +\x00\x00\x00\x00\x00\x15V0\x82\x15R\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x07\x02\xa0\x82\x15C0\x82\x15?\x02\x01\ +\x011\x0b0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x000a\ +\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x04\xa0S0Q\ +0,\x06\x0a+\x06\x01\x04\x01\x827\x02\x01\x1c\xa2\x1e\ +\x80\x1c\x00<\x00<\x00<\x00O\x00b\x00s\x00o\ +\x00l\x00e\x00t\x00e\x00>\x00>\x00>0!\ +0\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x1fiV\ +\x93\x9e\xc5\xcb\xb1\x81\xc5H\xdc\xea,\xf1[\xa6\xf0\xaf\ + \xa0\x82\x11]0\x82\x03z0\x82\x02b\xa0\x03\x02\ +\x01\x02\x02\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\ +\xb5\xd6Z\xd50\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\ +\x05\x05\x000S1\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x170\x15\x06\x03U\x04\x0a\x13\x0eVer\ +iSign, Inc.1+0)\x06\ +\x03U\x04\x03\x13\x22VeriSign T\ +ime Stamping Ser\ +vices CA0\x1e\x17\x0d0706\ +15000000Z\x17\x0d12061\ +4235959Z0\x5c1\x0b0\x09\x06\x03\ +U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\x0a\ +\x13\x0eVeriSign, Inc.\ +1402\x06\x03U\x04\x03\x13+VeriS\ +ign Time Stampin\ +g Services Signe\ +r - G20\x81\x9f0\x0d\x06\x09*\x86H\ +\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\ +\x81\x81\x00\xc4\xb5\xf2R\x15\xbc\x88\x86`)\x16J[\ +/K\x91k\x87\x91\xf35TX5\xea\xd16^b\ +MRQ4q\xc2{f\x1d\x89\xc8\xdd*\xc4j\x0a\ +\xf67\xd9\x98t\x91\xf6\x92\xae\xb0\xb5v\x96\xf1\xa9J\ +cEG.k\x0b\x92NK+\x8c\xeeXJ\x8b\xd4\ +\x07\xe4\x1a,\xf8\x82\xaaX\xd9\xcdB\xf3-\xc0u\xde\ +\x8d\xab\xc7\x8e\x1d\x9alL\x08\x95\x1e\xde\xdb\xefg\xe1\ +r\xc2I\xc2\x9e`<\xe1\xe2\xbe\x16\xa3cxi\x14\ +{\xad-\x02\x03\x01\x00\x01\xa3\x81\xc40\x81\xc104\ +\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\ +\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18http\ +://ocsp.verisign\ +.com0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x02\ +0\x0003\x06\x03U\x1d\x1f\x04,0*0(\xa0\ +&\xa0$\x86\x22http://crl.\ +verisign.com/tss\ +-ca.crl0\x16\x06\x03U\x1d%\x01\x01\ +\xff\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x080\ +\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x06\xc00\ +\x1e\x06\x03U\x1d\x11\x04\x170\x15\xa4\x130\x111\x0f\ +0\x0d\x06\x03U\x04\x03\x13\x06TSA1-20\ +\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\ +\x01\x01\x00P\xc5K\xc8$\x80\xdf\xe4\x0d$\xc2\xde\x1a\ +\xb1\xa1\x02\xa1\xa6\x82-\x0c\x83\x15\x817\x0a\x82\x0e,\ +\xb0Z\x17a\xb5\xd8\x05\xfe\x88\xdb\xf1\x91\x91\xb3V\x1a\ +@\xa6\xeb\x92\xbe89\xb0u6t:\x98O\xe47\ +\xba\x99\x89\xca\x95B\x1d\xb0\xb9\xc7\xa0\x8dW\xe0\xfa\xd5\ +d\x04B5N\x01\xd13\xa2\x17\xc8M\xaa'\xc7\xf2\ +\xe1\x86L\x028M\x83x\xc6\xfcS\xe0\xeb\xe0\x06\x87\ +\xdd\xa4\x96\x9e^\x0c\x98\xe2\xa5\xbe\xbf\x82\x85\xc3`\xe1\ +\xdf\xad(\xd8\xc7\xa5Kd\xda\xc7\x1b[\xbd\xac9\x08\ +\xd58\x22\xa13\x8b/\x8a\x9a\xeb\xbc\x07!?DA\ +\x09\x07\xb5e\x1c$\xbcH\xd3D\x80\xeb\xa1\xcf\xc9\x02\ +\xb4\x14\xcfT\xc7\x16\xa3\x80\x5c\xf9y>]r}\x88\ +\x17\x9e,C\xa2\xcaS\xce}=\xf6*:\xb8O\x94\ +\x00\xa5m\x0a\x83]\xf9^S\xf4\x18\xb3W\x0fp\xc3\ +\xfb\xf5\xad\x95\xa0\x0e\x17\xde\xc4\x16\x80`\xc9\x0f+n\ +\x86\x04\xf1\xeb\xf4x'\xd1\x05\xc5\xee4[^\xb9I\ +2\xf230\x82\x03\xc40\x82\x03-\xa0\x03\x02\x01\x02\ +\x02\x10G\xbf\x19\x95\xdf\x8dRFC\xf7\xdbmH\x0d\ +1\xa40\x0d\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\ +\x000\x81\x8b1\x0b0\x09\x06\x03U\x04\x06\x13\x02Z\ +A1\x150\x13\x06\x03U\x04\x08\x13\x0cWest\ +ern Cape1\x140\x12\x06\x03U\x04\ +\x07\x13\x0bDurbanville1\x0f\ +0\x0d\x06\x03U\x04\x0a\x13\x06Thawte1\ +\x1d0\x1b\x06\x03U\x04\x0b\x13\x14Thawte\ + Certification1\x1f\ +0\x1d\x06\x03U\x04\x03\x13\x16Thawte \ +Timestamping CA0\ +\x1e\x17\x0d031204000000Z\ +\x17\x0d131203235959Z0\ +S1\x0b0\x09\x06\x03U\x04\x06\x13\x02US1\x17\ +0\x15\x06\x03U\x04\x0a\x13\x0eVeriSig\ +n, Inc.1+0)\x06\x03U\x04\x03\ +\x13\x22VeriSign Time \ +Stamping Service\ +s CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\ +\x02\x82\x01\x01\x00\xa9\xca\xb2\xa4\xcc\xcd \xaf\x0a}\x89\ +\xac\x87u\xf0\xb4N\xf1\xdf\xc1\x0f\xbfga\xbd\xa3d\ +\x1c\xda\xbb\xf9\xca3\xab\x840\x89X~\x8c\xdbk\xdd\ +6\x9e\x0f\xbf\xd1\xecx\xf2w\xa6~o<\xbf\x93\xaf\ +\x0d\xbah\xf4l\x94\xca\xbdR-\xabH=\xf5\xb6\xd5\ +]_\x1b\x02\x9f\xfa/k\x1e\xa4\xf7\xa3\x9a\xa6\x1a\xc8\ +\x02\xe1\x7fLR\xe3\x0e`\xec@\x1c~\xb9\x0d\xde?\ +\xc7\xb4\xdf\x87\xbd_zj1.\x03\x99\x81\x13\xa8G\ + \xce1s\x0dW-\xcdx43\x95\x12\x99\x12\xb9\ +\xdeh/\xaa\xe6\xe3\xc2\x8a\x8c*\xc3\x8b!\x87f\xbd\ +\x83XWou\xbf<\xaa&\x87]\xca\x10\x15<\x9f\ +\x84\xeaT\xc1\x0an\xc4\xfe\xc5J\xdd\xb9\x07\x11\x97\x22\ +|\xdb>'\xd1\x1ex\xec\x9f1\xc9\xf1\xe6\x22\x19\xdb\ +\xc4\xb3GC\x9a\x1a_\xa0\x1e\x90\xe4^\xf5\xee|\xf1\ +}\xabb\x01\x8f\xf5M\x0b\xde\xd0\x22V\xa8\x95\xcd\xae\ +\x88v\xae\xee\xba\x0d\xf3\xe4M\xd9\xa0\xfbh\xa0\xae\x14\ +;\xb3\x87\xc1\xbb\x02\x03\x01\x00\x01\xa3\x81\xdb0\x81\xd8\ +04\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&\ +0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18ht\ +tp://ocsp.verisi\ +gn.com0\x12\x06\x03U\x1d\x13\x01\x01\xff\ +\x04\x080\x06\x01\x01\xff\x02\x01\x000A\x06\x03U\x1d\ +\x1f\x04:0806\xa04\xa02\x860htt\ +p://crl.verisign\ +.com/ThawteTimes\ +tampingCA.crl0\x13\x06\ +\x03U\x1d%\x04\x0c0\x0a\x06\x08+\x06\x01\x05\x05\x07\ +\x03\x080\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\ +\x01\x060$\x06\x03U\x1d\x11\x04\x1d0\x1b\xa4\x190\ +\x171\x150\x13\x06\x03U\x04\x03\x13\x0cTSA2\ +048-1-530\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00Jk\xf9\xeaX\ +\xc2D\x1c1\x89y\x99+\x96\xbf\x82\xac\x01\xd6\x1cL\ +\xcd\xb0\x8aXn\xdf\x08)\xa3^\xc8\xca\x93\x13\xe7\x04\ +R\x0d\xefG'/\x008\xb0\xe4\xc9\x93N\x9a\xd4\x22\ +b\x15\xf7?7!Op1\x80\xf1\x8b8\x87\xb3\xe8\ +\xe8\x97\x00\xfe\xcfU\x96N$\xd2\xa9'Nz\xae\xb7\ +aA\xf3*\xce\xe7\xc9\xd9^\xdd\xbb+\x85>\xb5\x9d\ +\xb5\xd9\xe1W\xff\xbe\xb4\xc5~\xf5\xcf\x0c\x9e\xf0\x97\xfe\ ++\xd3;R\x1b\x1b8'\xf7?J0\x82\x04\xfc0\ +\x82\x04e\xa0\x03\x02\x01\x02\x02\x10eR&\xe1\xb2.\ +\x18\xe1Y\x0f)\x85\xac\x22\xe7\x5c0\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000_1\x0b0\x09\x06\ +\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\x04\ +\x0a\x13\x0eVeriSign, Inc\ +.1705\x06\x03U\x04\x0b\x13.Clas\ +s 3 Public Prima\ +ry Certification\ + Authority0\x1e\x17\x0d09\ +0521000000Z\x17\x0d190\ +520235959Z0\x81\xb61\x0b0\ +\x09\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03\ +U\x04\x0a\x13\x0eVeriSign, I\ +nc.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ve\ +riSign Trust Net\ +work1;09\x06\x03U\x04\x0b\x132T\ +erms of use at h\ +ttps://www.veris\ +ign.com/rpa (c)0\ +9100.\x06\x03U\x04\x03\x13'Veri\ +Sign Class 3 Cod\ +e Signing 2009-2\ + CA0\x82\x01\x220\x0d\x06\x09*\x86H\x86\xf7\ +\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\x0a\x02\ +\x82\x01\x01\x00\xbeg\x1d\xb4`\xaa\x10IoV\x17|\ +f\xc9^\x86\x0d\xd5\xf1\xac\xa7q\x83\x8e\x8b\x89\xf8\x88\ +\x04\x89\x15\x06\xba-\x84!\x95\xe4\xd1\x9cPL\xfb\xd2\ +\x22\xbd\xda\xf2\xb25;\x1e\x8f\xc3\x09\xfb\xfc\x13.Z\ +\xbf\x89|=;%\x1e\xf6\xf3X{\x9c\xf4\x01\xb5\xc6\ +\x0a\xb8\x80\xce\xbe'tag'Mj\xe5\xec\x81a\ +Xy\xa3\xe0\x17\x10\x12\x15'\xb0\xe1M4\x7f+G\ + D\xb9\xdef$f\x8a\xcdO\xba\x1f\xc58\xc8T\ +\x90\xe1r\xf6\x19fuj\xb9Ih\xcf8y\x0d\xaa\ +0\xa8\xdb,`H\x9e\xd7\xaa\x14\x01\xa9\x83\xd78\x91\ +09\x13\x96\x03:|@T\xb6\xad\xe0/\x1b\x83\xdc\ +\xa8\x11R>\x02\xb3\xd7+\xfd!\xb6\xa7\x5c\xa3\x0f\x0b\ +\xa9\xa6\x10P\x0e4.M\xa7\xce\xc9^%\xd4\x8c\xbc\ +\xf3n|)\xbc\x01]\xfc1\x87Z\xd5\x8c\x85gX\ +\x88\x19\xa0\xbf5\xf0\xea+\xa3!\xe7\x90\xf6\x83\xe5\xa8\ +\xed`x^{`\x83\xfdW\x0b]A\x0dcT`\ +\xd6C!\xef\x02\x03\x01\x00\x01\xa3\x82\x01\xdb0\x82\x01\ +\xd70\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\ +\x01\xff\x02\x01\x000p\x06\x03U\x1d \x04i0g\ +0e\x06\x0b`\x86H\x01\x86\xf8E\x01\x07\x17\x030\ +V0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1ch\ +ttps://www.veris\ +ign.com/cps0*\x06\x08+\ +\x06\x01\x05\x05\x07\x02\x020\x1e\x1a\x1chttps\ +://www.verisign.\ +com/rpa0\x0e\x06\x03U\x1d\x0f\x01\x01\ +\xff\x04\x04\x03\x02\x01\x060m\x06\x08+\x06\x01\x05\x05\ +\x07\x01\x0c\x04a0_\xa1]\xa0[0Y0W0\ +U\x16\x09image/gif0!0\x1f\ +0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14\x8f\xe5\xd3\x1a\x86\ +\xac\x8d\x8ek\xc3\xcf\x80j\xd4H\x18,{\x19.0\ +%\x16#http://logo.v\ +erisign.com/vslo\ +go.gif0\x1d\x06\x03U\x1d%\x04\x160\ +\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\ +\x05\x05\x07\x03\x0304\x06\x08+\x06\x01\x05\x05\x07\x01\ +\x01\x04(0&0$\x06\x08+\x06\x01\x05\x05\x070\ +\x01\x86\x18http://ocsp.v\ +erisign.com01\x06\x03U\ +\x1d\x1f\x04*0(0&\xa0$\xa0\x22\x86 ht\ +tp://crl.verisig\ +n.com/pca3.crl0)\ +\x06\x03U\x1d\x11\x04\x220 \xa4\x1e0\x1c1\x1a0\ +\x18\x06\x03U\x04\x03\x13\x11Class3CA\ +2048-1-550\x1d\x06\x03U\x1d\x0e\ +\x04\x16\x04\x14\x97\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08\ +-\xc45\x9b\xa4\xa1\x1e\xf20\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00\x8b\x03\xc0\xdd\x94\ +\xd8A\xa2ai\xb0\x15\xa8x\xc70\xc6\x90<~B\ +\xf7$\xb6\xe4\x83s\x17\x04\x7f\x04\x10\x9c\xa1\xe2\xfa\x81\ +/\xeb\xc0\xcaD\xe7r\xe0P\xb6U\x10 \x83n\x96\ +\x92\xe4\x9aQj\xb471\xdc\xa5-\xeb\x8c\x00\xc7\x1d\ +O\xe7M2\xba\x85\xf8N\xbe\xfagUe\xf0j\xbe\ +z\xcad8\x1a\x10\x10xEv1\xf3\x86z\x03\x0f\ +`\xc2\xb3]\x9d\xf6\x8bfv\x82\x1bY\xe1\x83\xe5\xbd\ +I\xa58V\xe5\xdeAw\x0eX\x0f0\x82\x05\x130\ +\x82\x03\xfb\xa0\x03\x02\x01\x02\x02\x10f\xe3\xf0gy\xca\ +\x15\x16mPSo\x88\x19\x1a\x830\x0d\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x01\x05\x05\x000\x81\xb61\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1\x1f0\x1d\x06\x03U\x04\x0b\x13\x16Ver\ +iSign Trust Netw\ +ork1;09\x06\x03U\x04\x0b\x132Te\ +rms of use at ht\ +tps://www.verisi\ +gn.com/rpa (c)09\ +100.\x06\x03U\x04\x03\x13'VeriS\ +ign Class 3 Code\ + Signing 2009-2 \ +CA0\x1e\x17\x0d1007290000\ +00Z\x17\x0d12080823595\ +9Z0\x81\xd01\x0b0\x09\x06\x03U\x04\x06\x13\x02\ +US1\x160\x14\x06\x03U\x04\x08\x13\x0dMas\ +sachusetts1\x0f0\x0d\x06\x03\ +U\x04\x07\x13\x06Woburn1\x1e0\x1c\x06\ +\x03U\x04\x0a\x14\x15Monotype I\ +maging Inc.1>0<\x06\ +\x03U\x04\x0b\x135Digital ID\ + Class 3 - Micro\ +soft Software Va\ +lidation v21\x180\x16\x06\ +\x03U\x04\x0b\x14\x0fType Opera\ +tions1\x1e0\x1c\x06\x03U\x04\x03\x14\x15\ +Monotype Imaging\ + Inc.0\x81\x9f0\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\ +\x81\x00\x94D\xa0\x95i|U\x0d\xd0\xdb\x16\x8d25\ +\x8aL3\xab^ \xa1L\xd7*\x878\xd7\x98\xa5@\ +\xf0\x19I\x0b\x22\x1eSO\xc2C\xa6\xca\x8b\xa9V\xef\ +nH\x06\xa8\x05\x159\x1ec;$\x12\x90\xb9\x98\xcf\ +\xca\x085}r\xe3GW\xfdy\xcb\x8aJ\xe7@p\ +-5c\x7f\xae\x80\xcf\xc4\xaf\xd8\xfb\xf7\xc9\xfc\x89\xd8\ +\xd7\xa4\xa0\xdb\x09\xf2\xa2\xf2{\xef\xcdu\xc1\xf7eP\ +d\x22\x9d\xbd}\xbc\xad\xb8K\xccXE\x0eM\xd1Y\ +LM\x02\x03\x01\x00\x01\xa3\x82\x01\x830\x82\x01\x7f0\ +\x09\x06\x03U\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\ +\x0f\x01\x01\xff\x04\x04\x03\x02\x07\x800D\x06\x03U\x1d\ +\x1f\x04=0;09\xa07\xa05\x863htt\ +p://csc3-2009-2-\ +crl.verisign.com\ +/CSC3-2009-2.crl\ +0D\x06\x03U\x1d \x04=0;09\x06\x0b`\ +\x86H\x01\x86\xf8E\x01\x07\x17\x030*0(\x06\x08\ ++\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps:\ +//www.verisign.c\ +om/rpa0\x13\x06\x03U\x1d%\x04\x0c0\ +\x0a\x06\x08+\x06\x01\x05\x05\x07\x03\x030u\x06\x08+\ +\x06\x01\x05\x05\x07\x01\x01\x04i0g0$\x06\x08+\ +\x06\x01\x05\x05\x070\x01\x86\x18http://\ +ocsp.verisign.co\ +m0?\x06\x08+\x06\x01\x05\x05\x070\x02\x863h\ +ttp://csc3-2009-\ +2-aia.verisign.c\ +om/CSC3-2009-2.c\ +er0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\x97\ +\xd0k\xa8&p\xc8\xa1?\x94\x1f\x08-\xc45\x9b\xa4\ +\xa1\x1e\xf20\x11\x06\x09`\x86H\x01\x86\xf8B\x01\x01\ +\x04\x04\x03\x02\x04\x100\x16\x06\x0a+\x06\x01\x04\x01\x82\ +7\x02\x01\x1b\x04\x080\x06\x01\x01\x00\x01\x01\xff0\x0d\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\ +\x01\x00N\xe6\x22\x87\xdfgA\x15\x17\xe2\xd2\xee~\x0e\ +\xce\xc2\x99\xd6c\xbd\xf0\xb5\x93\xe5jrb\xe1\xf5\xd2\ +<8\xee\xa8=\x08_\xbaG\x81\x82_[KI\xf4\ +\x1d \xfa\x0f\x93\x09\xd0\x1d\x19VD\x17\xa2\x88\xf3\xfb\ +\x8d\x9d\xae\xf7\x0d5\xde<\x0c\xacD\x94`E*\x9b\ +\xfe\x9boL;\xb14gp\x10\x86\xffZ9\x5cZ\ +\xe3l\x82\xab5|eK\xfd\x98m\xb5\x15\x94I\x9c\ +\x88p\x10\xbe=\xb1b\x95\xb4\xdb\xb4\xd4\xda\xe8\x9dA\ +\x90~\xfe}\xb9\xa4\x92\xebn\xf2\x22\x8a\xc6w6M\ +\x8aZ\x0bS\x051\xd3+(\xafR\xe1\x8dzk\xb5\ +wD\xbd\x0c\xad\xf4]%,\xe3\xcd\x8a0>K\x03\ +\x9cy\xca\xa6N\xae\x0b\xc2\xcc$\x07\x0b\xc1\x94\x82\xf6\ +\x10\xf1\xba\x90\xb6\x9b\x9a\xd8\x5c<\x13\xf1\xea\x02\x06\x18\ +'M<\x89o3\x8a\xd3\x86\xde\xe9X3u=\xeb\ +\x93i\xe2DoN\x00l\xcf\xd5\x85\xdaV\xa6\x9a\xa6\ +?\xcbL!h\x90\xf2`\xba\xe1\xe8\x06]9!\x13\ +2\xed1\x82\x03g0\x82\x03c\x02\x01\x010\x81\xcb\ +0\x81\xb61\x0b0\x09\x06\x03U\x04\x06\x13\x02US\ +1\x170\x15\x06\x03U\x04\x0a\x13\x0eVeriS\ +ign, Inc.1\x1f0\x1d\x06\x03U\ +\x04\x0b\x13\x16VeriSign Tru\ +st Network1;09\x06\x03\ +U\x04\x0b\x132Terms of us\ +e at https://www\ +.verisign.com/rp\ +a (c)09100.\x06\x03U\x04\x03\ +\x13'VeriSign Class\ + 3 Code Signing \ +2009-2 CA\x02\x10f\xe3\xf0gy\ +\xca\x15\x16mPSo\x88\x19\x1a\x830\x09\x06\x05+\ +\x0e\x03\x02\x1a\x05\x00\xa0p0\x10\x06\x0a+\x06\x01\x04\ +\x01\x827\x02\x01\x0c1\x020\x000\x19\x06\x09*\x86\ +H\x86\xf7\x0d\x01\x09\x031\x0c\x06\x0a+\x06\x01\x04\x01\ +\x827\x02\x01\x040\x1c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x0b1\x0e0\x0c\x06\x0a+\x06\x01\x04\x01\x827\ +\x02\x01\x150#\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x04\ +1\x16\x04\x14\xf979\xb1:\x13Sz3\xc7\x0fk\ +H9\x0c\x940\x07\xceL0\x0d\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80}4\xf1n[A\ +\x8fx0\x5c\x02b25[\xd1v\x09\x0a\xa6K\xce\ +H\x08\xdb5zk\x93\xeb\xe9&%\xb0b3\x15\x9e\ +\x95\xc2\xb4U}/\x9e\xcc\x91\x03N\x81\xc8\x8bv\xff\ +\x89j\x1e\xe6\xa5\xb9\x8b\x9d\x9f\xa3\xf8i\x87\xa2\x08\x86\ +\xea7\xcf\xb1V\x0c\x8c(~\xea\x87\xf6\x86D\xe4T\ +u\xcf\x9a/g\xaaO\xfd \x0c\xf5\xec!\xae\xf1\xa9\ +\xdc\x1c\xb4O:\xd8\xbc\xf6>U,\xbe:\x01\xff&\ +lDO\xb6\x8f\x99w( \x15\xa1\x82\x01\x7f0\x82\ +\x01{\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x061\x82\x01\ +l0\x82\x01h\x02\x01\x010g0S1\x0b0\x09\ +\x06\x03U\x04\x06\x13\x02US1\x170\x15\x06\x03U\ +\x04\x0a\x13\x0eVeriSign, In\ +c.1+0)\x06\x03U\x04\x03\x13\x22Ver\ +iSign Time Stamp\ +ing Services CA\x02\ +\x108%\xd7\xfa\xf8a\xaf\x9e\xf4\x90\xe7&\xb5\xd6Z\ +\xd50\x09\x06\x05+\x0e\x03\x02\x1a\x05\x00\xa0]0\x18\ +\x06\x09*\x86H\x86\xf7\x0d\x01\x09\x031\x0b\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x07\x010\x1c\x06\x09*\x86H\x86\ +\xf7\x0d\x01\x09\x051\x0f\x17\x0d1105051\ +65508Z0#\x06\x09*\x86H\x86\xf7\x0d\ +\x01\x09\x041\x16\x04\x14\xf1\xa4\x9f\x93\xe1\x90\x0b\xd3\xda\ +A{l\xcb\xa8\xed\x91\xdf\x90\xf3`0\x0d\x06\x09*\ +\x86H\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81\x80\x90\x91\x13\ +\x8b\x1ab=\xe8\x02D\x8f\x95\xac\x99\xce\x17\xaai\x9b\ +\xc6?=\xba\x12\xd5\xa4\xd6Z\x0c\xa4\xde\x9d\x1e\x08'\ +W\x90\x82\xd7\x04B\xca\x85\x84\xbd\x8b\x9am\x93o*\ +\xf5s^sz\xea\xd7-A\xe5\x95\xe7\xd7\xc8&F\ +\x04x\x1b\xb5\xd5\xd3\x82\xb8k\xf5V\xf4G\xfb\xa6}\ +\xf6\xd6|\xb6\xf2\x12\x95\x08`\xb8A\xaa_-\x05\xf0\ +\xaa\xf9`E4\xf7\x01Q\x0eV\x10\xc8\xc4\xc1\xe0\x7f\ +\xc0 2\x07\xc1\xe5\x05gSgu\xa7\x9f\x00\x00\ +" + +qt_resource_name = b"\ +\x00\x09\ +\x08\x8d\xf4S\ +\x00A\ +\x00z\x00Q\x00t\x00F\x00o\x00n\x00t\x00s\ +\x00\x07\ +\x0ap)\xc8\ +\x00S\ +\x00p\x00i\x00n\x00B\x00o\x00x\ +\x00\x0a\ +\x07\xa3\xadR\ +\x00B\ +\x00r\x00e\x00a\x00d\x00c\x00r\x00u\x00m\x00b\ +\x00\x0b\ +\x08*X\xe2\ +\x00A\ +\x00s\x00s\x00e\x00t\x00E\x00d\x00i\x00t\x00o\x00r\ +\x00\x11\ +\x09Y\xcdW\ +\x00C\ +\x00o\x00l\x00o\x00r\x00P\x00i\x00c\x00k\x00e\x00r\x00D\x00i\x00a\x00l\x00o\x00g\ +\ +\x00\x05\ +\x00I\x88\xb3\ +\x00C\ +\x00a\x00r\x00d\x00s\ +\x00\x0e\ +\x08v\x1b\x13\ +\x00A\ +\x00z\x00Q\x00t\x00C\x00o\x00m\x00p\x00o\x00n\x00e\x00n\x00t\x00s\ +\x00\x07\ +\x0d\x83,\x19\ +\x00G\ +\x00a\x00l\x00l\x00e\x00r\x00y\ +\x00\x0a\ +\x02\xc6\xb3\xc4\ +\x00s\ +\x00t\x00y\x00l\x00e\x00s\x00h\x00e\x00e\x00t\ +\x00\x07\ +\x0a\xc9\xa6\x13\ +\x00C\ +\x00u\x00r\x00s\x00o\x00r\x00s\ +\x00\x08\ +\x08\xba\xc4\xa7\ +\x00T\ +\x00r\x00e\x00e\x00V\x00i\x00e\x00w\ +\x00\x06\ +\x04\xbb\x0bb\ +\x00E\ +\x00d\x00i\x00t\x00o\x00r\ +\x00\x05\ +\x00Z\xc0%\ +\x00S\ +\x00t\x00y\x00l\x00e\ +\x00\x17\ +\x02I\x08\x03\ +\x00N\ +\x00e\x00w\x00E\x00d\x00i\x00t\x00o\x00r\x00S\x00t\x00y\x00l\x00e\x00s\x00h\x00e\ +\x00e\x00t\x00.\x00q\x00s\x00s\ +\x00#\ +\x05\x7fE\xfe\ +\x00E\ +\x00d\x00i\x00t\x00o\x00r\x00S\x00t\x00y\x00l\x00e\x00s\x00h\x00e\x00e\x00t\x00V\ +\x00a\x00r\x00i\x00a\x00b\x00l\x00e\x00s\x00_\x00D\x00a\x00r\x00k\x00.\x00j\x00s\ +\x00o\x00n\ +\x00\x0e\ +\x0d\xa7\x8b'\ +\x00o\ +\x00p\x00e\x00n\x00_\x00s\x00m\x00a\x00l\x00l\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x06\xc1T\x07\ +\x00o\ +\x00p\x00e\x00n\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x09\xba\x1c\x07\ +\x00c\ +\x00l\x00o\x00s\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x0b\xfd\x12\x07\ +\x00d\ +\x00e\x00f\x00a\x00u\x00l\x00t\x00-\x00i\x00c\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x0f8H\xa7\ +\x00f\ +\x00o\x00l\x00d\x00e\x00r\x00-\x00i\x00c\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x07A;\x07\ +\x00c\ +\x00l\x00o\x00s\x00e\x00d\x00_\x00s\x00m\x00a\x00l\x00l\x00.\x00s\x00v\x00g\ +\x00\x0b\ +\x0ak\x9ag\ +\x00P\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x03\ +\x00\x00p7\ +\x00i\ +\x00m\x00g\ +\x00\x17\ +\x0e\xc1 '\ +\x00s\ +\x00t\x00y\x00l\x00e\x00d\x00s\x00l\x00i\x00d\x00e\x00r\x00-\x00h\x00a\x00n\x00d\ +\x00l\x00e\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x0a\xc0\xc8g\ +\x00r\ +\x00a\x00d\x00i\x00o\x00-\x00h\x00o\x00v\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x1a\ +\x04\x1a\x91g\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00d\x00o\x00w\x00n\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x0d\xa8\xea\x87\ +\x00W\ +\x00i\x00n\x00d\x00o\x00w\x00S\x00h\x00a\x00d\x00o\x00w\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x08\xec\xc8\xa7\ +\x00t\ +\x00o\x00o\x00l\x00b\x00a\x00r\x00_\x00c\x00o\x00m\x00b\x00o\x00_\x00a\x00r\x00r\ +\x00o\x00w\x00s\x00.\x00p\x00n\x00g\ +\x00\x14\ +\x0f@\xc6\x87\ +\x00d\ +\x00o\x00u\x00b\x00l\x00e\x00_\x00t\x00r\x00i\x00a\x00n\x00g\x00l\x00e\x00s\x00.\ +\x00p\x00n\x00g\ +\x00\x0d\ +\x08\xe8G\xa7\ +\x00s\ +\x00e\x00p\x00a\x00r\x00a\x00t\x00o\x00r\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0a\xc8\xfa\xa7\ +\x00f\ +\x00i\x00l\x00t\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x05\ +\x006\x9bb\ +\x003\ +\x002\x00x\x003\x002\ +\x00\x15\ +\x07\xdb\x9b\xe7\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00q\x00u\x00e\x00s\x00t\x00i\x00o\x00n\ +\x00.\x00p\x00n\x00g\ +\x00\x0e\ +\x03.8g\ +\x00m\ +\x00e\x00n\x00u\x00-\x00c\x00h\x00e\x00c\x00k\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x0f0/'\ +\x00i\ +\x00n\x00d\x00i\x00c\x00a\x00t\x00o\x00r\x00-\x00a\x00r\x00r\x00o\x00w\x00-\x00d\ +\x00o\x00w\x00n\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x08\xb9\x91\x07\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00d\x00i\x00v\x00i\x00d\x00e\x00r\x00.\ +\x00p\x00n\x00g\ +\x00\x16\ +\x04]O\xe7\ +\x00r\ +\x00o\x00u\x00n\x00d\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00s\x00m\x00a\x00l\ +\x00l\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0a\xc8\xf7'\ +\x00f\ +\x00i\x00l\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x0b\xda0\xa7\ +\x00b\ +\x00r\x00a\x00n\x00c\x00h\x00_\x00c\x00l\x00o\x00s\x00e\x00d\x00.\x00p\x00n\x00g\ +\ +\x00\x12\ +\x0bN\xa6\xa7\ +\x00c\ +\x00o\x00m\x00b\x00o\x00-\x00t\x00r\x00i\x00s\x00t\x00a\x00t\x00e\x00.\x00p\x00n\ +\x00g\ +\x00\x0d\ +\x05\x9a_\xe7\ +\x00t\ +\x00r\x00i\x00a\x00n\x00g\x00l\x00e\x002\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x05\x8b\xf9\xa7\ +\x00v\ +\x00e\x00r\x00t\x00i\x00c\x00a\x00l\x00_\x00a\x00r\x00r\x00o\x00w\x00s\x00.\x00p\ +\x00n\x00g\ +\x00\x16\ +\x08\xb7-G\ +\x00r\ +\x00o\x00u\x00n\x00d\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00h\x00o\x00v\x00e\ +\x00r\x00.\x00p\x00n\x00g\ +\x00!\ +\x02N\x81\x87\ +\x00d\ +\x00o\x00c\x00k\x00W\x00i\x00d\x00g\x00e\x00t\x00S\x00e\x00p\x00a\x00r\x00a\x00t\ +\x00o\x00r\x00D\x00o\x00t\x00s\x00_\x00h\x00o\x00r\x00i\x00z\x00.\x00p\x00n\x00g\ +\ +\x00\x12\ +\x02\xc0\xa9\xa7\ +\x00q\ +\x00u\x00e\x00s\x00t\x00i\x00o\x00n\x00_\x00s\x00m\x00a\x00l\x00l\x00.\x00p\x00n\ +\x00g\ +\x00\x0c\ +\x03v\xc2\x07\ +\x00q\ +\x00u\x00e\x00s\x00t\x00i\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x14\ +\x0d\xa1:\xc7\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00i\x00n\x00v\x00a\x00l\x00i\x00d\x00.\ +\x00p\x00n\x00g\ +\x00 \ +\x0c#lG\ +\x00d\ +\x00o\x00c\x00k\x00W\x00i\x00d\x00g\x00e\x00t\x00S\x00e\x00p\x00a\x00r\x00a\x00t\ +\x00o\x00r\x00D\x00o\x00t\x00s\x00_\x00v\x00e\x00r\x00t\x00.\x00p\x00n\x00g\ +\x00\x1a\ +\x0b\x12\xe2\xa7\ +\x00s\ +\x00l\x00i\x00d\x00e\x00r\x00-\x00h\x00a\x00n\x00d\x00l\x00e\x00-\x00d\x00i\x00s\ +\x00a\x00b\x00l\x00e\x00d\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x01J5\xc7\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00c\x00l\x00e\x00a\x00r\x00.\x00p\x00n\ +\x00g\ +\x00\x12\ +\x0b\xc8\xb8\xc7\ +\x00r\ +\x00a\x00d\x00i\x00o\x00-\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00p\x00n\ +\x00g\ +\x00\x1e\ +\x0eBT\xa7\ +\x00t\ +\x00o\x00o\x00l\x00b\x00a\x00r\x00_\x00c\x00o\x00m\x00b\x00o\x00_\x00b\x00o\x00r\ +\x00d\x00e\x00r\x00_\x00i\x00m\x00a\x00g\x00e\x00.\x00p\x00n\x00g\ +\x00$\ +\x0f\xa7\xaa\x87\ +\x00s\ +\x00l\x00i\x00d\x00e\x00r\x00-\x00s\x00u\x00b\x00p\x00a\x00g\x00e\x00-\x00g\x00r\ +\x00o\x00o\x00v\x00e\x00-\x00s\x00h\x00a\x00d\x00o\x00w\x00-\x001\x008\x005\x00.\ +\x00p\x00n\x00g\ +\x00\x14\ +\x0fO\xaf'\ +\x00r\ +\x00a\x00d\x00i\x00o\x00-\x00u\x00n\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00.\ +\x00p\x00n\x00g\ +\x00\x10\ +\x03\xcf\x9b'\ +\x00h\ +\x00i\x00d\x00d\x00e\x00n\x00-\x00i\x00c\x00o\x00n\x00s\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x03\x89\xb3g\ +\x00f\ +\x00i\x00l\x00t\x00e\x00r\x00_\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00.\x00p\ +\x00n\x00g\ +\x00\x0f\ +\x06S%\xa7\ +\x00b\ +\x00r\x00a\x00n\x00c\x00h\x00_\x00o\x00p\x00e\x00n\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x08\xd7\xc8g\ +\x00s\ +\x00e\x00p\x00a\x00r\x00a\x00t\x00o\x00r\x00_\x00h\x00o\x00r\x00i\x00z\x00.\x00p\ +\x00n\x00g\ +\x00\x0d\ +\x05\x9f_\xe7\ +\x00t\ +\x00r\x00i\x00a\x00n\x00g\x00l\x00e\x001\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0ak\xa9\xa7\ +\x00h\ +\x00o\x00r\x00i\x00z\x00o\x00n\x00t\x00a\x00l\x00_\x00a\x00r\x00r\x00o\x00w\x00s\ +\x00.\x00p\x00n\x00g\ +\x00\x16\ +\x08\xd8\x5c\x87\ +\x00r\ +\x00o\x00u\x00n\x00d\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00p\x00r\x00e\x00s\ +\x00s\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x09\xa0\xdbg\ +\x00s\ +\x00e\x00a\x00r\x00c\x00h\x00-\x00d\x00a\x00r\x00k\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x0d\x18&g\ +\x00c\ +\x00l\x00o\x00s\x00e\x00_\x00s\x00m\x00a\x00l\x00l\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x06\x98\x8e\xa7\ +\x00c\ +\x00l\x00o\x00s\x00e\x00.\x00s\x00v\x00g\ +\x00\x1c\ +\x04M\xd8\xc7\ +\x00r\ +\x00o\x00u\x00n\x00d\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00s\x00m\x00a\x00l\ +\x00l\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x03-\x8a\x87\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00i\x00n\x00f\x00o\x00r\x00m\x00a\x00t\ +\x00i\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x19\ +\x0e<\x0f'\ +\x00t\ +\x00o\x00o\x00l\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00m\x00e\x00n\x00u\x00b\x00u\ +\x00t\x00t\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x07\ +\x03]\xe0\xa7\ +\x00l\ +\x00o\x00g\x00g\x00i\x00n\x00g\ +\x00\x12\ +\x0d\x99\xc0\xa7\ +\x00r\ +\x00a\x00d\x00i\x00o\x00-\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00.\x00p\x00n\ +\x00g\ +\x00\x11\ +\x0b|\xa1g\ +\x00t\ +\x00a\x00b\x00l\x00e\x00_\x00w\x00a\x00r\x00n\x00i\x00n\x00g\x00.\x00p\x00n\x00g\ +\ +\x00\x0a\ +\x08\x94m\xc7\ +\x00s\ +\x00e\x00a\x00r\x00c\x00h\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x0e\x8e\x9b\xc7\ +\x00t\ +\x00o\x00o\x00l\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00b\x00u\x00t\x00t\x00o\x00n\ +\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x0b\xf1\x0b\xc7\ +\x00t\ +\x00a\x00b\x00l\x00e\x00_\x00d\x00e\x00b\x00u\x00g\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x0dxv\xa7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00t\x00e\x00a\x00r\x00.\x00p\x00n\x00g\ +\ +\x00\x12\ +\x088\xe1\x07\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00v\x00a\x00l\x00i\x00d\x00.\x00p\x00n\ +\x00g\ +\x00\x09\ +\x06k\xbds\ +\x00d\ +\x00r\x00o\x00p\x00d\x00o\x00w\x00n\x00s\ +\x00\x17\ +\x0e\x08s\xe7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00d\x00o\ +\x00w\x00n\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x0cXY'\ +\x00m\ +\x00e\x00n\x00u\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x08\x94`G\ +\x00s\ +\x00e\x00a\x00r\x00c\x00h\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x07\xe8a5\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00m\x00e\x00n\x00u\ +\x00\x11\ +\x02k!g\ +\x00s\ +\x00l\x00i\x00d\x00e\x00r\x00-\x00h\x00a\x00n\x00d\x00l\x00e\x00.\x00p\x00n\x00g\ +\ +\x00\x16\ +\x0e\xd7d\x87\ +\x00t\ +\x00a\x00g\x00_\x00v\x00i\x00s\x00i\x00b\x00i\x00l\x00i\x00t\x00y\x00_\x00o\x00f\ +\x00f\x00.\x00s\x00v\x00g\ +\x00$\ +\x08X\x8a\x87\ +\x00s\ +\x00l\x00i\x00d\x00e\x00r\x00-\x00a\x00d\x00d\x00p\x00a\x00g\x00e\x00-\x00g\x00r\ +\x00o\x00o\x00v\x00e\x00-\x00s\x00h\x00a\x00d\x00o\x00w\x00-\x001\x008\x005\x00.\ +\x00p\x00n\x00g\ +\x00\x16\ +\x0d\x8a\x8b\xa7\ +\x00i\ +\x00n\x00d\x00i\x00c\x00a\x00t\x00o\x00r\x00-\x00a\x00r\x00r\x00o\x00w\x00-\x00u\ +\x00p\x00.\x00s\x00v\x00g\ +\x00\x22\ +\x02\xd9\xe8'\ +\x00t\ +\x00o\x00o\x00l\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00m\x00e\x00n\x00u\x00b\x00u\ +\x00t\x00t\x00o\x00n\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00p\x00n\ +\x00g\ +\x00\x0b\ +\x00\xb0\xf5\xa7\ +\x00l\ +\x00o\x00a\x00d\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x16\ +\x04\x19@'\ +\x00t\ +\x00o\x00o\x00l\x00b\x00a\x00r\x00_\x00t\x00e\x00a\x00r\x00_\x00h\x00o\x00r\x00i\ +\x00z\x00.\x00p\x00n\x00g\ +\x00\x17\ +\x05\xc1\x16\xa7\ +\x00l\ +\x00y\x00_\x00a\x00p\x00p\x00l\x00i\x00c\x00a\x00t\x00i\x00o\x00n\x00_\x00i\x00c\ +\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x05\ +\x004\xdbF\ +\x001\ +\x006\x00x\x001\x006\ +\x00\x0c\ +\x0b\xa2\x18\x07\ +\x00l\ +\x00o\x00c\x00k\x00_\x00o\x00f\x00f\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x00\xb2\xb7\xe2\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\ +\x00\x08\ +\x0c3W\x07\ +\x00h\ +\x00e\x00l\x00p\x00.\x00s\x00v\x00g\ +\x00\x1c\ +\x04.\xa9\x07\ +\x00r\ +\x00o\x00u\x00n\x00d\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00s\x00m\x00a\x00l\ +\x00l\x00_\x00p\x00r\x00e\x00s\x00s\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x09\xdc}\x07\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00.\x00p\x00n\x00g\ +\x00\x04\ +\x00\x05\x9cP\ +\x00U\ +\x00I\x002\x000\ +\x00\x10\ +\x0e\x8b\x03\x87\ +\x00t\ +\x00o\x00o\x00l\x00b\x00a\x00r\x00_\x00t\x00e\x00a\x00r\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x0245'\ +\x00r\ +\x00o\x00u\x00n\x00d\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x09F)\xe7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00c\x00l\x00o\x00s\x00e\x00.\x00p\x00n\ +\x00g\ +\x00\x11\ +\x06H\x16\xc7\ +\x00m\ +\x00e\x00n\x00u\x00_\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00.\x00p\x00n\x00g\ +\ +\x00\x11\ +\x0b\x9a\xc0\xc7\ +\x00t\ +\x00a\x00b\x00l\x00e\x00_\x00s\x00u\x00c\x00c\x00e\x00s\x00s\x00.\x00p\x00n\x00g\ +\ +\x00\x0f\ +\x00Y1\xf6\ +\x00i\ +\x00n\x00_\x00p\x00r\x00o\x00g\x00r\x00e\x00s\x00s\x00.\x00g\x00i\x00f\ +\x00\x1a\ +\x04\x1b\xb9g\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00d\x00o\x00w\x00n\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x06\xc7\xee\xe7\ +\x00l\ +\x00o\x00c\x00k\x00_\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x09\xd5=\x07\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x0f\xeb\xefg\ +\x00t\ +\x00o\x00o\x00l\x00b\x00a\x00r\x00_\x00d\x00i\x00v\x00i\x00d\x00e\x00r\x00.\x00p\ +\x00n\x00g\ +\x00\x11\ +\x04m\x0e\xc7\ +\x00c\ +\x00o\x00m\x00b\x00o\x00-\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00.\x00p\x00n\x00g\ +\ +\x00\x05\ +\x005\xbbT\ +\x002\ +\x004\x00x\x002\x004\ +\x00\x0f\ +\x0b2\x07\x87\ +\x00t\ +\x00a\x00b\x00l\x00e\x00_\x00e\x00r\x00r\x00o\x00r\x00.\x00p\x00n\x00g\ +\x00\x1a\ +\x0f0\xa5\xa7\ +\x00t\ +\x00o\x00o\x00l\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00b\x00u\x00t\x00t\x00o\x00n\ +\x00_\x00d\x00o\x00w\x00n\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x05\x9d_\xe7\ +\x00t\ +\x00r\x00i\x00a\x00n\x00g\x00l\x00e\x003\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x03\x10\xb9'\ +\x00t\ +\x00a\x00g\x00_\x00v\x00i\x00s\x00i\x00b\x00i\x00l\x00i\x00t\x00y\x00_\x00o\x00n\ +\x00.\x00s\x00v\x00g\ +\x00\x11\ +\x08\x88\xc1\x07\ +\x00c\ +\x00o\x00l\x00u\x00m\x00n\x00-\x00r\x00e\x00s\x00i\x00z\x00e\x00.\x00p\x00n\x00g\ +\ +\x00\x0b\ +\x0b\xbf7\xe7\ +\x00c\ +\x00l\x00o\x00s\x00e\x00_\x00x\x00.\x00s\x00v\x00g\ +\x00\x1a\ +\x0eO\xdaG\ +\x00D\ +\x00e\x00l\x00e\x00t\x00e\x00_\x00n\x00a\x00m\x00e\x00d\x00_\x00s\x00e\x00l\x00e\ +\x00c\x00t\x00i\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x0f\xb8\xe2g\ +\x00T\ +\x00r\x00a\x00n\x00s\x00l\x00a\x00t\x00e\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0c\x9c\x06\xa7\ +\x00l\ +\x00a\x00y\x00e\x00r\x00s\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x09j\xc2G\ +\x00O\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00h\x00e\x00i\x00g\x00h\x00t\x00.\x00p\x00n\x00g\ +\ +\x00\x08\ +\x08\xf7^\x87\ +\x00G\ +\x00r\x00i\x00d\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x04\xbb\x1b\x07\ +\x00a\ +\x00d\x00d\x00_\x00l\x00i\x00n\x00k\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x04H\x8ag\ +\x00T\ +\x00e\x00x\x00t\x00u\x00r\x00e\x00_\x00b\x00r\x00o\x00w\x00s\x00e\x00r\x00.\x00p\ +\x00n\x00g\ +\x00\x0f\ +\x08\x96\xd8\x07\ +\x00r\ +\x00e\x00m\x00o\x00v\x00e\x00_\x00l\x00i\x00n\x00k\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x06Y\xe8\x07\ +\x00L\ +\x00I\x00g\x00h\x00t\x00i\x00n\x00g\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x01\xe7\x02\xa7\ +\x00S\ +\x00u\x00b\x00s\x00t\x00a\x00n\x00c\x00e\x00.\x00p\x00n\x00g\ +\x00\x06\ +\x05\xdcWG\ +\x00X\ +\x00Y\x00.\x00p\x00n\x00g\ +\x00\x17\ +\x0c\xac\xce'\ +\x00R\ +\x00e\x00s\x00e\x00t\x00_\x00p\x00h\x00y\x00s\x00i\x00c\x00s\x00_\x00s\x00t\x00a\ +\x00t\x00e\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x08\xc9\x13\xa7\ +\x00T\ +\x00r\x00a\x00c\x00k\x00v\x00i\x00e\x00w\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x05\x0e\x0eG\ +\x00M\ +\x00a\x00t\x00e\x00r\x00i\x00a\x00l\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x01(/'\ +\x00L\ +\x00O\x00D\x00_\x00g\x00e\x00n\x00e\x00r\x00a\x00t\x00o\x00r\x00.\x00p\x00n\x00g\ +\ +\x00\x08\ +\x02\x8c]\xa7\ +\x00P\ +\x00l\x00a\x00y\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0f\x11\xbcG\ +\x00Y\ +\x00_\x00a\x00x\x00i\x00s\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x0f\xf3\x13'\ +\x00D\ +\x00a\x00t\x00a\x00b\x00a\x00s\x00e\x00_\x00v\x00i\x00e\x00w\x00.\x00p\x00n\x00g\ +\ +\x00\x13\ +\x0d\xb8v\xa7\ +\x00A\ +\x00l\x00i\x00g\x00n\x00_\x00t\x00o\x00_\x00O\x00b\x00j\x00e\x00c\x00t\x00.\x00p\ +\x00n\x00g\ +\x00\x0c\ +\x08\xf9b\xa7\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00.\x00p\x00n\x00g\ +\x00\x09\ +\x08(\xe4g\ +\x00S\ +\x00c\x00a\x00l\x00e\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x08\x90`G\ +\x00S\ +\x00e\x00a\x00r\x00c\x00h\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x0f7\xd5\xc7\ +\x00T\ +\x00e\x00r\x00r\x00a\x00i\x00n\x00_\x00T\x00e\x00x\x00t\x00u\x00r\x00e\x00.\x00p\ +\x00n\x00g\ +\x00\x10\ +\x02r\x82\xa7\ +\x00l\ +\x00a\x00y\x00e\x00r\x00_\x00e\x00d\x00i\x00t\x00o\x00r\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x01\xd3\xf5g\ +\x00O\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00l\x00i\x00s\x00t\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x0c#&\x07\ +\x00M\ +\x00e\x00a\x00s\x00u\x00r\x00e\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0b\xaco\x07\ +\x00S\ +\x00e\x00l\x00e\x00c\x00t\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x07t\xc4G\ +\x00T\ +\x00e\x00r\x00r\x00a\x00i\x00n\x00.\x00p\x00n\x00g\ +\x00\x09\ +\x0b\x02\xc6'\ +\x00A\ +\x00u\x00d\x00i\x00o\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0ep\xee'\ +\x00G\ +\x00e\x00t\x00_\x00p\x00h\x00y\x00s\x00i\x00c\x00s\x00_\x00s\x00t\x00a\x00t\x00e\ +\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x05w]'\ +\x00L\ +\x00o\x00a\x00d\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x0by\xb7\xc7\ +\x00M\ +\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x0e\x8c\x09\xc7\ +\x00F\ +\x00o\x00l\x00l\x00o\x00w\x00_\x00t\x00e\x00r\x00r\x00a\x00i\x00n\x00.\x00p\x00n\ +\x00g\ +\x00\x0b\ +\x06\xc3\xbc\x07\ +\x00X\ +\x00Y\x00_\x00c\x00o\x00p\x00y\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x0e\x94\xef\xa7\ +\x00s\ +\x00e\x00l\x00e\x00c\x00t\x00_\x00o\x00b\x00j\x00e\x00c\x00t\x00.\x00p\x00n\x00g\ +\ +\x00\x0a\ +\x0f\x11\x9cG\ +\x00X\ +\x00_\x00a\x00x\x00i\x00s\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x04\xd2YG\ +\x00i\ +\x00n\x00f\x00o\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x09BR\x87\ +\x00U\ +\x00n\x00f\x00r\x00e\x00e\x00z\x00e\x00_\x00a\x00l\x00l\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x07\x97e\xa7\ +\x00S\ +\x00e\x00a\x00r\x00c\x00h\x00_\x00m\x00o\x00r\x00e\x00.\x00p\x00n\x00g\ +\x00\x09\ +\x0e(\xc7\xc7\ +\x00A\ +\x00n\x00g\x00l\x00e\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x0c\x0b\xd1\x87\ +\x00H\ +\x00e\x00l\x00p\x00e\x00r\x00s\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x0c\x94\xdd\xa7\ +\x00A\ +\x00s\x00s\x00e\x00t\x00_\x00B\x00r\x00o\x00w\x00s\x00e\x00r\x00.\x00p\x00n\x00g\ +\ +\x00\x08\ +\x04\xb2X\xc7\ +\x00u\ +\x00n\x00d\x00o\x00.\x00p\x00n\x00g\ +\x00\x19\ +\x07\x09\xdb\x87\ +\x00O\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00f\x00o\x00l\x00l\x00o\x00w\x00_\x00t\x00e\x00r\ +\x00r\x00a\x00i\x00n\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x0ddj\xc7\ +\x00S\ +\x00e\x00l\x00e\x00c\x00t\x00_\x00t\x00e\x00r\x00r\x00a\x00i\x00n\x00.\x00p\x00n\ +\x00g\ +\x00\x0a\ +\x03i\x0f\xa7\ +\x00d\ +\x00e\x00p\x00l\x00o\x00y\x00.\x00p\x00n\x00g\ +\x00\x07\ +\x01\x94W\xe7\ +\x00L\ +\x00U\x00A\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x0d\xe9\x8b'\ +\x00T\ +\x00i\x00m\x00e\x00_\x00o\x00f\x00_\x00D\x00a\x00y\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x02)\xeb\xe7\ +\x00V\ +\x00e\x00r\x00t\x00e\x00x\x00_\x00s\x00n\x00a\x00p\x00p\x00i\x00n\x00g\x00.\x00p\ +\x00n\x00g\ +\x00\x0a\ +\x0f\x0a\x5cG\ +\x00Z\ +\x00_\x00a\x00x\x00i\x00s\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x01\x01C\x07\ +\x00A\ +\x00l\x00i\x00g\x00n\x00_\x00t\x00o\x00_\x00g\x00r\x00i\x00d\x00.\x00p\x00n\x00g\ +\ +\x00\x08\ +\x08\xc8\x5cg\ +\x00S\ +\x00a\x00v\x00e\x00.\x00p\x00n\x00g\ +\x00\x1b\ +\x00\x8f\xf2g\ +\x00A\ +\x00l\x00i\x00g\x00n\x00_\x00o\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00_\x00s\ +\x00u\x00r\x00f\x00a\x00c\x00e\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x06\xc8]\xc7\ +\x00M\ +\x00o\x00v\x00e\x00.\x00p\x00n\x00g\ +\x00(\ +\x019ig\ +\x00S\ +\x00i\x00m\x00u\x00l\x00a\x00t\x00e\x00_\x00P\x00h\x00y\x00s\x00i\x00c\x00s\x00_\ +\x00o\x00n\x00_\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00_\x00o\x00b\x00j\x00e\ +\x00c\x00t\x00s\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x0d\xc5\x5c\x07\ +\x00X\ +\x00Y\x002\x00_\x00c\x00o\x00p\x00y\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0d\x11\xe6'\ +\x00F\ +\x00r\x00e\x00e\x00z\x00e\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x0b\xb2\x5cG\ +\x00R\ +\x00e\x00d\x00o\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x0b-\xda\xc7\ +\x00G\ +\x00e\x00p\x00e\x00t\x00t\x00o\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x08\x8e '\ +\x00U\ +\x00I\x00_\x00e\x00d\x00i\x00t\x00o\x00r\x00.\x00p\x00n\x00g\ +\x00\x1b\ +\x07Z?\xc7\ +\x00c\ +\x00o\x00m\x00b\x00o\x00b\x00o\x00x\x00-\x00a\x00r\x00r\x00o\x00w\x00-\x00d\x00i\ +\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x01\xcb\x85\x87\ +\x00p\ +\x00i\x00c\x00k\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x0d\xd53G\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00.\x00s\x00v\x00g\ +\x00\x1c\ +\x00\xb2\x08\x87\ +\x00b\ +\x00r\x00o\x00w\x00s\x00e\x00-\x00e\x00d\x00i\x00t\x00-\x00s\x00e\x00l\x00e\x00c\ +\x00t\x00-\x00f\x00i\x00l\x00e\x00s\x00.\x00s\x00v\x00g\ +\x00\x19\ +\x04\xa9L\x87\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00p\x00o\x00p\x00o\x00u\x00t\x00-\x00s\ +\x00m\x00a\x00l\x00l\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x03\xaa\x0d'\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00e\x00r\x00r\x00o\x00r\x00.\x00s\x00v\ +\x00g\ +\x00\x18\ +\x0a!\xbb\x87\ +\x00o\ +\x00p\x00e\x00n\x00-\x00i\x00n\x00-\x00i\x00n\x00t\x00e\x00r\x00n\x00a\x00l\x00-\ +\x00a\x00p\x00p\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x04\xd2P\xc7\ +\x00I\ +\x00n\x00f\x00o\x00.\x00s\x00v\x00g\ +\x00\x19\ +\x09\xef\x09\x07\ +\x00s\ +\x00p\x00i\x00n\x00b\x00o\x00x\x00-\x00c\x00u\x00r\x00s\x00o\x00r\x00-\x00s\x00c\ +\x00r\x00o\x00l\x00l\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x0eH\xf9G\ +\x00m\ +\x00e\x00n\x00u\x00-\x00c\x00e\x00n\x00t\x00e\x00r\x00e\x00d\x00.\x00s\x00v\x00g\ +\ +\x00\x0c\ +\x03\xc9\xb6\xd8\ +\x00t\ +\x00o\x00g\x00g\x00l\x00e\x00s\x00w\x00i\x00t\x00c\x00h\ +\x00\x12\ +\x01(\xce\xa7\ +\x00c\ +\x00o\x00m\x00b\x00o\x00b\x00o\x00x\x00-\x00a\x00r\x00r\x00o\x00w\x00.\x00s\x00v\ +\x00g\ +\x00\x14\ +\x0a\xbd\xbf\x87\ +\x00a\ +\x00l\x00p\x00h\x00a\x00-\x00b\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x00.\ +\x00p\x00n\x00g\ +\x00\x0d\ +\x0b]\x1f\x07\ +\x00c\ +\x00h\x00e\x00c\x00k\x00m\x00a\x00r\x00k\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x0e\xba\x14H\ +\x00c\ +\x00h\x00e\x00c\x00k\x00b\x00o\x00x\ +\x00\x12\ +\x09?\xea\x07\ +\x00c\ +\x00h\x00e\x00c\x00k\x00m\x00a\x00r\x00k\x00-\x00m\x00e\x00n\x00u\x00.\x00s\x00v\ +\x00g\ +\x00\x14\ +\x0c\xfeA\x87\ +\x00s\ +\x00p\x00i\x00n\x00b\x00o\x00x\x00-\x00u\x00p\x00-\x00a\x00r\x00r\x00o\x00w\x00.\ +\x00p\x00n\x00g\ +\x00\x11\ +\x0c\xf7\x01g\ +\x00i\ +\x00n\x00d\x00e\x00t\x00e\x00r\x00m\x00i\x00n\x00a\x00t\x00e\x00.\x00s\x00v\x00g\ +\ +\x00\x0a\ +\x00E\xae'\ +\x00a\ +\x00d\x00d\x00-\x001\x006\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x0e\xdf\x10'\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00r\x00e\x00s\x00t\x00o\x00r\x00e\x00.\ +\x00s\x00v\x00g\ +\x00\x0b\ +\x05lM^\ +\x00r\ +\x00a\x00d\x00i\x00o\x00b\x00u\x00t\x00t\x00o\x00n\ +\x00\x0b\ +\x0c\x0b\xdc\x07\ +\x00H\ +\x00e\x00l\x00p\x00e\x00r\x00s\x00.\x00s\x00v\x00g\ +\x00\x1b\ +\x09\x81c'\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00c\x00l\x00o\x00s\x00e\x00-\x00d\x00i\ +\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0d\ +\x05\xcc\xcfg\ +\x00d\ +\x00e\x00l\x00e\x00t\x00e\x00-\x001\x006\x00.\x00s\x00v\x00g\ +\x00\x1a\ +\x01{\xb1\xe7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00r\x00e\x00s\x00t\x00o\x00r\x00e\x00-\ +\x00h\x00o\x00v\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x0aC\x1b\xc7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00p\x00o\x00p\x00o\x00u\x00t\x00.\x00s\ +\x00v\x00g\ +\x00\x12\ +\x0f\x01\xc9\x07\ +\x00m\ +\x00e\x00n\x00u\x00-\x00i\x00n\x00d\x00i\x00c\x00a\x00t\x00o\x00r\x00.\x00s\x00v\ +\x00g\ +\x00\x07\ +\x0bZ \x87\ +\x00d\ +\x00o\x00c\x00k\x00i\x00n\x00g\ +\x00\x12\ +\x09`\xe4g\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00c\x00l\x00o\x00s\x00e\x00.\x00s\x00v\ +\x00g\ +\x00\x08\ +\x06\x88TG\ +\x00m\ +\x00o\x00r\x00e\x00.\x00s\x00v\x00g\ +\x00\x11\ +\x01\x0c\x8eg\ +\x00t\ +\x00e\x00a\x00r\x00-\x00v\x00e\x00r\x00t\x00i\x00c\x00a\x00l\x00.\x00s\x00v\x00g\ +\ +\x00\x19\ +\x0b\xd9\x04\xe7\ +\x00d\ +\x00r\x00o\x00p\x00d\x00o\x00w\x00n\x00-\x00b\x00u\x00t\x00t\x00o\x00n\x00-\x00a\ +\x00r\x00r\x00o\x00w\x00.\x00s\x00v\x00g\ +\x00\x07\ +\x0bf(b\ +\x00t\ +\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00\x16\ +\x09O\xd1g\ +\x00s\ +\x00p\x00i\x00n\x00b\x00o\x00x\x00-\x00d\x00o\x00w\x00n\x00-\x00a\x00r\x00r\x00o\ +\x00w\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x0c[8g\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00c\x00l\x00o\x00s\x00e\x00.\x00s\x00v\ +\x00g\ +\x00\x07\ +\x09\xe7\xb6\x03\ +\x00s\ +\x00h\x00a\x00d\x00o\x00w\x00s\ +\x00\x19\ +\x08C\xa6'\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00p\x00o\x00p\x00o\x00u\x00t\x00-\x00h\ +\x00o\x00v\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x0b\x85U\x87\ +\x00t\ +\x00e\x00a\x00r\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x0d\xdcsG\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00-\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x06\xd4\xfb\xe7\ +\x00b\ +\x00r\x00o\x00w\x00s\x00e\x00-\x00e\x00d\x00i\x00t\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x0c\xa5['\ +\x00m\ +\x00e\x00n\x00u\x00-\x00s\x00h\x00a\x00d\x00o\x00w\x00@\x002\x00x\x00.\x00p\x00n\ +\x00g\ +\x00\x0f\ +\x00b\xa4\xa7\ +\x00m\ +\x00e\x00n\x00u\x00-\x00s\x00h\x00a\x00d\x00o\x00w\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x08\xf9o'\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00\x0c\ +\x06\x19\xe5\x87\ +\x00L\ +\x00i\x00g\x00h\x00t\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x08(\xe9\xe7\ +\x00S\ +\x00c\x00a\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x0f7\xd8G\ +\x00T\ +\x00e\x00r\x00r\x00a\x00i\x00n\x00_\x00T\x00e\x00x\x00t\x00u\x00r\x00e\x00.\x00s\ +\x00v\x00g\ +\x00\x0b\ +\x0c#+\x87\ +\x00M\ +\x00e\x00a\x00s\x00u\x00r\x00e\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x01\xd3\xf8\xe7\ +\x00O\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00l\x00i\x00s\x00t\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x0b\xacb\x87\ +\x00S\ +\x00e\x00l\x00e\x00c\x00t\x00.\x00s\x00v\x00g\ +\x00\x0b\ +\x07t\xc9\xc7\ +\x00T\ +\x00e\x00r\x00r\x00a\x00i\x00n\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x0b\x02\xcb\xa7\ +\x00A\ +\x00u\x00d\x00i\x00o\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x0ep\xe3\xa7\ +\x00G\ +\x00e\x00t\x00_\x00p\x00h\x00y\x00s\x00i\x00c\x00s\x00_\x00s\x00t\x00a\x00t\x00e\ +\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x05wP\xa7\ +\x00L\ +\x00o\x00a\x00d\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x0e\x8c\x04G\ +\x00F\ +\x00o\x00l\x00l\x00o\x00w\x00_\x00t\x00e\x00r\x00r\x00a\x00i\x00n\x00.\x00s\x00v\ +\x00g\ +\x00\x0d\ +\x0d= G\ +\x00D\ +\x00e\x00b\x00u\x00g\x00g\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x01\xbd1\x87\ +\x00L\ +\x00o\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x11\ +\x0e\x94\xe2'\ +\x00s\ +\x00e\x00l\x00e\x00c\x00t\x00_\x00o\x00b\x00j\x00e\x00c\x00t\x00.\x00s\x00v\x00g\ +\ +\x00\x0c\ +\x0a=1\x87\ +\x00U\ +\x00n\x00l\x00o\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x0f\x11\x91\xc7\ +\x00X\ +\x00_\x00a\x00x\x00i\x00s\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x0e(\xcaG\ +\x00A\ +\x00n\x00g\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x03e\x02'\ +\x00D\ +\x00e\x00p\x00l\x00o\x00y\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x04\xb2UG\ +\x00u\ +\x00n\x00d\x00o\x00.\x00s\x00v\x00g\ +\x00\x19\ +\x07\x09\xd6\x07\ +\x00O\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00f\x00o\x00l\x00l\x00o\x00w\x00_\x00t\x00e\x00r\ +\x00r\x00a\x00i\x00n\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x0ddgG\ +\x00S\ +\x00e\x00l\x00e\x00c\x00t\x00_\x00t\x00e\x00r\x00r\x00a\x00i\x00n\x00.\x00s\x00v\ +\x00g\ +\x00\x0f\ +\x02D\xa1\xc7\ +\x00E\ +\x00n\x00v\x00i\x00r\x00o\x00n\x00m\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ +\x00\x07\ +\x01\x94Zg\ +\x00L\ +\x00U\x00A\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x02)\xe6g\ +\x00V\ +\x00e\x00r\x00t\x00e\x00x\x00_\x00s\x00n\x00a\x00p\x00p\x00i\x00n\x00g\x00.\x00s\ +\x00v\x00g\ +\x00\x0a\ +\x0f\x0aQ\xc7\ +\x00Z\ +\x00_\x00a\x00x\x00i\x00s\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x08\xc8Q\xe7\ +\x00S\ +\x00a\x00v\x00e\x00.\x00s\x00v\x00g\ +\x00\x11\ +\x01\x01N\x87\ +\x00A\ +\x00l\x00i\x00g\x00n\x00_\x00t\x00o\x00_\x00g\x00r\x00i\x00d\x00.\x00s\x00v\x00g\ +\ +\x00(\ +\x019d\xe7\ +\x00S\ +\x00i\x00m\x00u\x00l\x00a\x00t\x00e\x00_\x00P\x00h\x00y\x00s\x00i\x00c\x00s\x00_\ +\x00o\x00n\x00_\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00_\x00o\x00b\x00j\x00e\ +\x00c\x00t\x00s\x00.\x00s\x00v\x00g\ +\x00\x1b\ +\x00\x8f\xff\xe7\ +\x00A\ +\x00l\x00i\x00g\x00n\x00_\x00o\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00_\x00s\ +\x00u\x00r\x00f\x00a\x00c\x00e\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x06\xc8PG\ +\x00M\ +\x00o\x00v\x00e\x00.\x00s\x00v\x00g\ +\x00\x0c\ +\x0d\xc5Q\x87\ +\x00X\ +\x00Y\x002\x00_\x00c\x00o\x00p\x00y\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x0b\xb2Q\xc7\ +\x00R\ +\x00e\x00d\x00o\x00.\x00s\x00v\x00g\ +\x00\x0d\ +\x02\x06\xe6\xe7\ +\x00F\ +\x00l\x00o\x00w\x00g\x00r\x00a\x00p\x00h\x00.\x00s\x00v\x00g\ +\x00\x0d\ +\x0f\xb8\xef\xe7\ +\x00T\ +\x00r\x00a\x00n\x00s\x00l\x00a\x00t\x00e\x00.\x00s\x00v\x00g\ +\x00\x11\ +\x09j\xcf\xc7\ +\x00O\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00h\x00e\x00i\x00g\x00h\x00t\x00.\x00s\x00v\x00g\ +\ +\x00\x08\ +\x08\xf7S\x07\ +\x00G\ +\x00r\x00i\x00d\x00.\x00s\x00v\x00g\ +\x00\x0c\ +\x04\xbb\x16\x87\ +\x00a\ +\x00d\x00d\x00_\x00l\x00i\x00n\x00k\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x08\x96\xd5\x87\ +\x00r\ +\x00e\x00m\x00o\x00v\x00e\x00_\x00l\x00i\x00n\x00k\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x0c\xac\xc3\xa7\ +\x00R\ +\x00e\x00s\x00e\x00t\x00_\x00p\x00h\x00y\x00s\x00i\x00c\x00s\x00_\x00s\x00t\x00a\ +\x00t\x00e\x00.\x00s\x00v\x00g\ +\x00\x0c\ +\x05\x0e\x03\xc7\ +\x00M\ +\x00a\x00t\x00e\x00r\x00i\x00a\x00l\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x02\x8cP'\ +\x00P\ +\x00l\x00a\x00y\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x0f\x11\xb1\xc7\ +\x00Y\ +\x00_\x00a\x00x\x00i\x00s\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x0d\xb8{'\ +\x00A\ +\x00l\x00i\x00g\x00n\x00_\x00t\x00o\x00_\x00O\x00b\x00j\x00e\x00c\x00t\x00.\x00s\ +\x00v\x00g\ +\x00\x11\ +\x0f\xf3\x1e\xa7\ +\x00D\ +\x00a\x00t\x00a\x00b\x00a\x00s\x00e\x00_\x00v\x00i\x00e\x00w\x00.\x00s\x00v\x00g\ +\ +\x00\x0d\ +\x0e\xd2p\xc7\ +\x00t\ +\x00a\x00b\x00s\x00_\x00i\x00c\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x0b\ +\x01d\x8d\x87\ +\x00c\ +\x00h\x00e\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0d\ +\x09$\x8d\xe7\ +\x00u\ +\x00n\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x0f>,\xc7\ +\x00c\ +\x00h\x00e\x00c\x00k\x00e\x00d\x00-\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\ +\x00s\x00v\x00g\ +\x00\x13\ +\x08\x8f\x8e\x07\ +\x00u\ +\x00n\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00-\x00f\x00o\x00c\x00u\x00s\x00.\x00s\ +\x00v\x00g\ +\x00\x16\ +\x0f0<\xc7\ +\x00u\ +\x00n\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00-\x00d\x00i\x00s\x00a\x00b\x00l\x00e\ +\x00d\x00.\x00s\x00v\x00g\ +\x00\x11\ +\x08\x0f\x8e\xe7\ +\x00c\ +\x00h\x00e\x00c\x00k\x00e\x00d\x00-\x00f\x00o\x00c\x00u\x00s\x00.\x00s\x00v\x00g\ +\ +\x00\x10\ +\x05\xcb\x07\xa7\ +\x00o\ +\x00f\x00f\x00-\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0c\ +\x04\x08 g\ +\x00o\ +\x00n\x00-\x00f\x00o\x00c\x00u\x00s\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x05\xd7\xad\xa7\ +\x00o\ +\x00n\x00-\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0d\ +\x01X!\xa7\ +\x00o\ +\x00f\x00f\x00-\x00f\x00o\x00c\x00u\x00s\x00.\x00s\x00v\x00g\ +\x00\x1d\ +\x03\xae\x00\xc7\ +\x00p\ +\x00a\x00r\x00t\x00i\x00a\x00l\x00-\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00-\ +\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x06\ +\x07aZ\xc7\ +\x00o\ +\x00n\x00.\x00s\x00v\x00g\ +\x00\x07\ +\x05\xc9Z'\ +\x00o\ +\x00f\x00f\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x01\xd4\xe9\x07\ +\x00p\ +\x00a\x00r\x00t\x00i\x00a\x00l\x00-\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00.\ +\x00s\x00v\x00g\ +\x00\x1a\ +\x09oG\xe7\ +\x00p\ +\x00a\x00r\x00t\x00i\x00a\x00l\x00-\x00s\x00e\x00l\x00e\x00c\x00t\x00e\x00d\x00-\ +\x00f\x00o\x00c\x00u\x00s\x00.\x00s\x00v\x00g\ +\x00\x1b\ +\x0fk\xbd'\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x0eW\x14\xe7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00h\x00o\ +\x00v\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x17\ +\x03\xa7s\xc7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00d\x00a\ +\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00 \ +\x0fc\x01G\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00h\x00o\x00v\x00e\x00r\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x0e8e'\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00p\x00r\ +\x00e\x00s\x00s\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x03H\x94g\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00h\x00o\ +\x00v\x00e\x00r\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x1b\ +\x0f\x0c\xcc\xe7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00p\x00r\x00e\x00s\x00s\x00.\x00p\x00n\x00g\ +\x00 \ +\x03n\xafg\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00p\x00r\x00e\x00s\x00s\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x1b\ +\x0fy='\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x1a\ +\x0d\xb9\x91G\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00 \ +\x03p\xffg\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00p\x00r\x00e\x00s\x00s\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00 \ +\x0fe\xd1G\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00h\x00o\x00v\x00e\x00r\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x0fM:G\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00p\x00r\ +\x00e\x00s\x00s\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x1a\ +\x0d\xb8\xb9G\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00d\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x1b\ +\x0f\x1aL\xe7\ +\x00t\ +\x00i\x00t\x00l\x00e\x00b\x00a\x00r\x00_\x00m\x00i\x00n\x00i\x00m\x00i\x00z\x00e\ +\x00_\x00p\x00r\x00e\x00s\x00s\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x09\x06&G\ +\x00S\ +\x00e\x00a\x00r\x00c\x00h\x002\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x00\xeaE\xa7\ +\x00S\ +\x00e\x00a\x00r\x00c\x00h\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x00\xb5\xa4\x07\ +\x00S\ +\x00e\x00a\x00r\x00c\x00h\x00_\x00m\x00o\x00r\x00e\x00@\x002\x00x\x00.\x00p\x00n\ +\x00g\ +\x00\x0b\ +\x03{\xcd'\ +\x00i\ +\x00n\x00f\x00o\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x0e\ +\x0b\xf6\xd6\x07\ +\x00H\ +\x00e\x00l\x00p\x00e\x00r\x00s\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x07\x9b^'\ +\x00M\ +\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x002\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x05\xb3~g\ +\x00l\ +\x00i\x00n\x00e\x00e\x00d\x00i\x00t\x00-\x00c\x00l\x00e\x00a\x00r\x00@\x002\x00x\ +\x00.\x00p\x00n\x00g\ +\x00\x09\ +\x06\x98\x83'\ +\x00c\ +\x00l\x00o\x00s\x00e\x00.\x00p\x00n\x00g\ +\x00\x0e\ +\x0a\xcd\x98G\ +\x00r\ +\x00e\x00s\x00t\x00o\x00r\x00e\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x0fF\xee\x07\ +\x00m\ +\x00i\x00n\x00i\x00m\x00i\x00z\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\ +\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x0fy\xb7\xc7\ +\x00m\ +\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x09\x92\xa6g\ +\x00m\ +\x00i\x00n\x00i\x00m\x00i\x00z\x00e\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0b\x07=\xc7\ +\x00c\ +\x00l\x00o\x00s\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00@\x002\x00x\ +\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0d\xc5\x9a\x87\ +\x00m\ +\x00i\x00n\x00i\x00m\x00i\x00z\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\ +\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x0e\xdd\x84g\ +\x00c\ +\x00l\x00o\x00s\x00e\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x0d\x92\xb8G\ +\x00m\ +\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x0c\x83\xee\x07\ +\x00m\ +\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\ +\x00@\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x14\ +\x0b{\xe6\xc7\ +\x00r\ +\x00e\x00s\x00t\x00o\x00r\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\ +\x00p\x00n\x00g\ +\x00\x15\ +\x05\xc5\xa6\xc7\ +\x00m\ +\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\ +\x00.\x00p\x00n\x00g\ +\x00\x17\ +\x08\x829\xc7\ +\x00r\ +\x00e\x00s\x00t\x00o\x00r\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00@\ +\x002\x00x\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x03[\xde\x87\ +\x00c\ +\x00l\x00o\x00s\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00p\x00n\ +\x00g\ +\x00\x0b\ +\x06y\xc2'\ +\x00r\ +\x00e\x00s\x00t\x00o\x00r\x00e\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x0f\x88\xf7\xc7\ +\x00m\ +\x00i\x00n\x00i\x00m\x00i\x00z\x00e\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x0f\xf3\xaa'\ +\x00b\ +\x00i\x00g\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00d\x00o\x00w\x00n\x00.\x00p\x00n\ +\x00g\ +\x00\x0e\ +\x04\xa2\xfc\xa7\ +\x00d\ +\x00o\x00w\x00n\x00_\x00a\x00r\x00r\x00o\x00w\x00.\x00p\x00n\x00g\ +\x00\x17\ +\x0c\xabQ\x07\ +\x00d\ +\x00o\x00w\x00n\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00d\x00i\x00s\x00a\x00b\x00l\ +\x00e\x00d\x00.\x00p\x00n\x00g\ +\x00\x11\ +\x02$\xea'\ +\x00d\ +\x00o\x00u\x00b\x00l\x00e\x00_\x00a\x00r\x00r\x00o\x00w\x00s\x00.\x00p\x00n\x00g\ +\ +\x00\x1a\ +\x0ez\xf3\x87\ +\x00d\ +\x00o\x00u\x00b\x00l\x00e\x00_\x00a\x00r\x00r\x00o\x00w\x00s\x00_\x00d\x00i\x00s\ +\x00a\x00b\x00l\x00e\x00d\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x02\xc4U\x07\ +\x00b\ +\x00i\x00g\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00l\x00e\x00f\x00t\x00.\x00p\x00n\ +\x00g\ +\x00\x14\ +\x0d\xda\x84'\ +\x00b\ +\x00l\x00a\x00c\x00k\x00_\x00d\x00o\x00w\x00n\x00_\x00a\x00r\x00r\x00o\x00w\x00.\ +\x00p\x00n\x00g\ +\x00\x09\ +\x02\xf7\xa3\xc7\ +\x00v\ +\x00a\x00l\x00i\x00d\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x0e\x22\xd3G\ +\x00a\ +\x00d\x00d\x00-\x00f\x00i\x00l\x00t\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x05\xc5\xfe\x87\ +\x00w\ +\x00a\x00r\x00n\x00i\x00n\x00g\x00-\x00y\x00e\x00l\x00l\x00o\x00w\x00.\x00s\x00v\ +\x00g\ +\x00\x09\ +\x09\xba\x8f\xa7\ +\x00d\ +\x00e\x00b\x00u\x00g\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x09e\x83\xe7\ +\x00e\ +\x00r\x00r\x00o\x00r\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x09\xc7\xabG\ +\x00r\ +\x00e\x00s\x00e\x00t\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x06\xb2\xea\xa7\ +\x00i\ +\x00n\x00f\x00o\x00r\x00m\x00a\x00t\x00i\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x0e\xfd\xd2\x07\ +\x00p\ +\x00r\x00o\x00c\x00e\x00s\x00s\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x0b\ +\x00\xb5Hg\ +\x00w\ +\x00a\x00r\x00n\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x0b\ +\x00\xa7\xd3\xa7\ +\x00p\ +\x00e\x00n\x00d\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x06|W\x87\ +\x00c\ +\x00o\x00p\x00y\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x0d!\x0fg\ +\x00A\ +\x00s\x00s\x00e\x00t\x00_\x00F\x00i\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00\x0c\ +\x0f\xdf,\xc7\ +\x00S\ +\x00e\x00t\x00t\x00i\x00n\x00g\x00s\x00.\x00s\x00v\x00g\ +\x00\x07\ +\x07\xa7ZG\ +\x00A\ +\x00d\x00d\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x03\x90\xdc\xe7\ +\x00A\ +\x00s\x00s\x00e\x00t\x00_\x00F\x00o\x00l\x00d\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x05\xb6\x96\x07\ +\x00F\ +\x00o\x00l\x00d\x00e\x00r\x00-\x00s\x00m\x00a\x00l\x00l\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x02\xa34g\ +\x00G\ +\x00o\x00t\x00o\x00-\x00p\x00r\x00e\x00v\x00i\x00o\x00u\x00s\x00-\x00l\x00e\x00v\ +\x00e\x00l\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x0a\xcc\xf6\x87\ +\x00F\ +\x00o\x00l\x00d\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x0c\xfcL\x07\ +\x00G\ +\x00o\x00t\x00o\x00-\x00n\x00e\x00x\x00t\x00-\x00l\x00e\x00v\x00e\x00l\x00.\x00s\ +\x00v\x00g\ +\x00\x10\ +\x05\x9e\x13g\ +\x00S\ +\x00e\x00l\x00e\x00c\x00t\x00-\x00F\x00i\x00l\x00e\x00s\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x0c\xb1\x02\x87\ +\x00D\ +\x00e\x00l\x00e\x00t\x00e\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x08\xafw\x87\ +\x00R\ +\x00o\x00t\x00a\x00t\x00e\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x0c\x8dj\xa7\ +\x00C\ +\x00a\x00m\x00e\x00r\x00a\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x09:\xccg\ +\x00G\ +\x00r\x00i\x00d\x00-\x00l\x00a\x00r\x00g\x00e\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x09\xc1\xdd\x07\ +\x00G\ +\x00r\x00i\x00d\x00-\x00s\x00m\x00a\x00l\x00l\x00.\x00s\x00v\x00g\ +\x00\x07\ +\x0d\xfa\xdc\x13\ +\x00W\ +\x00i\x00d\x00g\x00e\x00t\x00s\ +\x00\x17\ +\x0b\xff\xb9\xe9\ +\x00D\ +\x00o\x00c\x00k\x00B\x00a\x00r\x00B\x00u\x00t\x00t\x00o\x00n\x00C\x00o\x00n\x00f\ +\x00i\x00g\x00.\x00i\x00n\x00i\ +\x00\x0f\ +\x0dg\x00#\ +\x00R\ +\x00a\x00d\x00i\x00o\x00B\x00u\x00t\x00t\x00o\x00n\x00.\x00q\x00s\x00s\ +\x00\x14\ +\x0fU\xc2\xe9\ +\x00B\ +\x00r\x00o\x00w\x00s\x00e\x00E\x00d\x00i\x00t\x00C\x00o\x00n\x00f\x00i\x00g\x00.\ +\x00i\x00n\x00i\ +\x00\x0e\ +\x05\x0b.i\ +\x00T\ +\x00e\x00x\x00t\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\x00i\ +\x00\x0e\ +\x04\xd3\xae\xc3\ +\x00C\ +\x00o\x00l\x00o\x00r\x00L\x00a\x00b\x00e\x00l\x00.\x00q\x00s\x00s\ +\x00\x08\ +\x0c\xf7S\xe3\ +\x00T\ +\x00e\x00x\x00t\x00.\x00q\x00s\x00s\ +\x00\x15\ +\x00\xd4\xf6\x09\ +\x00D\ +\x00r\x00a\x00g\x00A\x00n\x00d\x00D\x00r\x00o\x00p\x00C\x00o\x00n\x00f\x00i\x00g\ +\x00.\x00i\x00n\x00i\ +\x00\x15\ +\x06*k\x89\ +\x00B\ +\x00r\x00e\x00a\x00d\x00C\x00r\x00u\x00m\x00b\x00s\x00C\x00o\x00n\x00f\x00i\x00g\ +\x00.\x00i\x00n\x00i\ +\x00\x13\ +\x0a\x8d\xad)\ +\x00T\ +\x00a\x00b\x00l\x00e\x00V\x00i\x00e\x00w\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\ +\x00n\x00i\ +\x00\x0f\ +\x05f-\x03\ +\x00B\ +\x00r\x00e\x00a\x00d\x00C\x00r\x00u\x00m\x00b\x00s\x00.\x00q\x00s\x00s\ +\x00\x0a\ +\x0a\xce\x1dC\ +\x00S\ +\x00l\x00i\x00d\x00e\x00r\x00.\x00q\x00s\x00s\ +\x00\x0e\ +\x0d\xeb\x12\xa9\ +\x00C\ +\x00a\x00r\x00d\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\x00i\ +\x00\x11\ +\x0c\x9a\x9c\xe9\ +\x00T\ +\x00o\x00o\x00l\x00B\x00a\x00r\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\x00i\ +\ +\x00\x0c\ +\x03\xe4=\x83\ +\x00T\ +\x00i\x00t\x00l\x00e\x00B\x00a\x00r\x00.\x00q\x00s\x00s\ +\x00\x0b\ +\x07\xfbg\x02\ +\x00C\ +\x00o\x00l\x00o\x00r\x00P\x00i\x00c\x00k\x00e\x00r\ +\x00\x11\ +\x0fKDi\ +\x00S\ +\x00p\x00i\x00n\x00B\x00o\x00x\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\x00i\ +\ +\x00\x0b\ +\x08\x22\xd3\x83\ +\x00M\ +\x00e\x00n\x00u\x00B\x00a\x00r\x00.\x00q\x00s\x00s\ +\x00\x15\ +\x063\xb5\xe9\ +\x00R\ +\x00a\x00d\x00i\x00o\x00B\x00u\x00t\x00t\x00o\x00n\x00C\x00o\x00n\x00f\x00i\x00g\ +\x00.\x00i\x00n\x00i\ +\x00\x13\ +\x0e\xb8\xf8\xa9\ +\x00T\ +\x00a\x00b\x00W\x00i\x00d\x00g\x00e\x00t\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\ +\x00n\x00i\ +\x00\x0c\ +\x00V+C\ +\x00C\ +\x00h\x00e\x00c\x00k\x00B\x00o\x00x\x00.\x00q\x00s\x00s\ +\x00\x12\ +\x0c\xbc\x80\x09\ +\x00C\ +\x00o\x00m\x00b\x00o\x00B\x00o\x00x\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\ +\x00i\ +\x00\x0b\ +\x0b\xb5\x94\x83\ +\x00T\ +\x00o\x00o\x00l\x00T\x00i\x00p\x00.\x00q\x00s\x00s\ +\x00\x0e\ +\x04M0)\ +\x00M\ +\x00e\x00n\x00u\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\x00i\ +\x00\x12\ +\x0d\xe0a\xe3\ +\x00B\ +\x00a\x00s\x00e\x00S\x00t\x00y\x00l\x00e\x00S\x00h\x00e\x00e\x00t\x00.\x00q\x00s\ +\x00s\ +\x00\x17\ +\x00\xb6\xeec\ +\x00A\ +\x00s\x00s\x00e\x00t\x00F\x00o\x00l\x00d\x00e\x00r\x00L\x00i\x00s\x00t\x00V\x00i\ +\x00e\x00w\x00.\x00q\x00s\x00s\ +\x00\x0c\ +\x01\x8b9\xc3\ +\x00S\ +\x00p\x00l\x00i\x00t\x00t\x00e\x00r\x00.\x00q\x00s\x00s\ +\x00\x1b\ +\x0e\xaaV\xc3\ +\x00W\ +\x00i\x00n\x00d\x00o\x00w\x00D\x00e\x00c\x00o\x00r\x00a\x00t\x00i\x00o\x00n\x00W\ +\x00r\x00a\x00p\x00p\x00e\x00r\x00.\x00q\x00s\x00s\ +\x00\x0c\ +\x01g\xcb\xc3\ +\x00L\ +\x00i\x00n\x00e\x00E\x00d\x00i\x00t\x00.\x00q\x00s\x00s\ +\x00\x10\ +\x09e\x8b)\ +\x00S\ +\x00l\x00i\x00d\x00e\x00r\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\x00i\ +\x00\x22\ +\x0d\xe2\xb7i\ +\x00A\ +\x00s\x00s\x00e\x00t\x00F\x00o\x00l\x00d\x00e\x00r\x00T\x00h\x00u\x00m\x00b\x00n\ +\x00a\x00i\x00l\x00V\x00i\x00e\x00w\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\ +\x00i\ +\x00\x14\ +\x0f\x9d\xf7i\ +\x00E\ +\x00y\x00e\x00d\x00r\x00o\x00p\x00p\x00e\x00r\x00C\x00o\x00n\x00f\x00i\x00g\x00.\ +\x00i\x00n\x00i\ +\x00\x0d\ +\x0b\xd7\x9f\xc3\ +\x00S\ +\x00c\x00r\x00o\x00l\x00l\x00B\x00a\x00r\x00.\x00q\x00s\x00s\ +\x00\x12\ +\x05\x90k\xc9\ +\x00T\ +\x00r\x00e\x00e\x00V\x00i\x00e\x00w\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\ +\x00i\ +\x00\x15\ +\x0aV\xb1\x89\ +\x00P\ +\x00r\x00o\x00g\x00r\x00e\x00s\x00s\x00B\x00a\x00r\x00C\x00o\x00n\x00f\x00i\x00g\ +\x00.\x00i\x00n\x00i\ +\x00\x0d\ +\x09(\xe6\x83\ +\x00T\ +\x00a\x00b\x00W\x00i\x00d\x00g\x00e\x00t\x00.\x00q\x00s\x00s\ +\x00\x12\ +\x04\xdc\x1c\xe3\ +\x00S\ +\x00e\x00g\x00m\x00e\x00n\x00t\x00C\x00o\x00n\x00t\x00r\x00o\x00l\x00.\x00q\x00s\ +\x00s\ +\x00\x1b\ +\x04\xa3k\x83\ +\x00R\ +\x00e\x00f\x00l\x00e\x00c\x00t\x00e\x00d\x00P\x00r\x00o\x00p\x00e\x00r\x00t\x00y\ +\x00E\x00d\x00i\x00t\x00o\x00r\x00.\x00q\x00s\x00s\ +\x00\x0d\ +\x0b<\x0cC\ +\x00T\ +\x00a\x00b\x00l\x00e\x00V\x00i\x00e\x00w\x00.\x00q\x00s\x00s\ +\x00\x13\ +\x07Js\xe9\ +\x00S\ +\x00t\x00a\x00t\x00u\x00s\x00B\x00a\x00r\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\ +\x00n\x00i\ +\x00\x15\ +\x02\xediI\ +\x00C\ +\x00o\x00l\x00o\x00r\x00P\x00i\x00c\x00k\x00e\x00r\x00C\x00o\x00n\x00f\x00i\x00g\ +\x00.\x00i\x00n\x00i\ +\x00\x14\ +\x09\xd1\xdd\xc9\ +\x00P\ +\x00u\x00s\x00h\x00B\x00u\x00t\x00t\x00o\x00n\x00C\x00o\x00n\x00f\x00i\x00g\x00.\ +\x00i\x00n\x00i\ +\x00\x12\ +\x0e*>\x09\ +\x00L\ +\x00i\x00n\x00e\x00E\x00d\x00i\x00t\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\ +\x00i\ +\x00\x14\ +\x06\x8c(C\ +\x00S\ +\x00t\x00y\x00l\x00e\x00d\x00D\x00o\x00c\x00k\x00W\x00i\x00d\x00g\x00e\x00t\x00.\ +\x00q\x00s\x00s\ +\x00\x12\ +\x0b*J\x89\ +\x00T\ +\x00i\x00t\x00l\x00e\x00B\x00a\x00r\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\ +\x00i\ +\x00\x0f\ +\x03U\x92\x03\ +\x00P\ +\x00r\x00o\x00g\x00r\x00e\x00s\x00s\x00B\x00a\x00r\x00.\x00q\x00s\x00s\ +\x00\x1a\ +\x0d\x02\xab#\ +\x00T\ +\x00a\x00b\x00W\x00i\x00d\x00g\x00e\x00t\x00A\x00c\x00t\x00i\x00o\x00n\x00T\x00o\ +\x00o\x00l\x00B\x00a\x00r\x00.\x00q\x00s\x00s\ +\x00\x0b\ +\x083\x94\xa3\ +\x00T\ +\x00o\x00o\x00l\x00B\x00a\x00r\x00.\x00q\x00s\x00s\ +\x00\x0e\ +\x09\xday\xa3\ +\x00B\ +\x00r\x00o\x00w\x00s\x00e\x00E\x00d\x00i\x00t\x00.\x00q\x00s\x00s\ +\x00\x1e\ +\x0d\xd3\x06)\ +\x00F\ +\x00i\x00l\x00t\x00e\x00r\x00e\x00d\x00S\x00e\x00a\x00r\x00c\x00h\x00W\x00i\x00d\ +\x00g\x00e\x00t\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\x00i\ +\x00\x0b\ +\x09\xdf\xb8\xe3\ +\x00S\ +\x00p\x00i\x00n\x00B\x00o\x00x\x00.\x00q\x00s\x00s\ +\x00\x08\ +\x08\x87Q\x83\ +\x00C\ +\x00a\x00r\x00d\x00.\x00q\x00s\x00s\ +\x00\x0f\ +\x06\x87\xb1#\ +\x00Q\ +\x00D\x00o\x00c\x00k\x00W\x00i\x00d\x00g\x00e\x00t\x00.\x00q\x00s\x00s\ +\x00\x0f\ +\x02\xaa\xea\xe3\ +\x00V\ +\x00e\x00c\x00t\x00o\x00r\x00I\x00n\x00p\x00u\x00t\x00.\x00q\x00s\x00s\ +\x00\x0f\ +\x07\x0a\xaec\ +\x00C\ +\x00o\x00l\x00o\x00r\x00P\x00i\x00c\x00k\x00e\x00r\x00.\x00q\x00s\x00s\ +\x00\x13\ +\x0bR\x86)\ +\x00S\ +\x00c\x00r\x00o\x00l\x00l\x00B\x00a\x00r\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\ +\x00n\x00i\ +\x00\x14\ +\x03\xc1\xd7\x89\ +\x00T\ +\x00o\x00o\x00l\x00B\x00u\x00t\x00t\x00o\x00n\x00C\x00o\x00n\x00f\x00i\x00g\x00.\ +\x00i\x00n\x00i\ +\x00\x0c\ +\x00'*\xc3\ +\x00C\ +\x00o\x00m\x00b\x00o\x00B\x00o\x00x\x00.\x00q\x00s\x00s\ +\x00\x18\ +\x08\x9b_\xc3\ +\x00F\ +\x00i\x00l\x00t\x00e\x00r\x00e\x00d\x00S\x00e\x00a\x00r\x00c\x00h\x00W\x00i\x00d\ +\x00g\x00e\x00t\x00.\x00q\x00s\x00s\ +\x00\x0e\ +\x02\x98t#\ +\x00P\ +\x00u\x00s\x00h\x00B\x00u\x00t\x00t\x00o\x00n\x00.\x00q\x00s\x00s\ +\x00\x08\ +\x0cXR\xc3\ +\x00M\ +\x00e\x00n\x00u\x00.\x00q\x00s\x00s\ +\x00\x12\ +\x0c^\x7f\x09\ +\x00C\ +\x00h\x00e\x00c\x00k\x00B\x00o\x00x\x00C\x00o\x00n\x00f\x00i\x00g\x00.\x00i\x00n\ +\x00i\ +\x00\x15\ +\x08E\x17\xe9\ +\x00P\ +\x00a\x00l\x00e\x00t\x00t\x00e\x00V\x00i\x00e\x00w\x00C\x00o\x00n\x00f\x00i\x00g\ +\x00.\x00i\x00n\x00i\ +\x00\x0e\ +\x0d\x8cG\x87\ +\x00e\ +\x00r\x00r\x00o\x00r\x00_\x00i\x00c\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x12\ +\x07\xa3G\xc7\ +\x00l\ +\x00i\x00s\x00t\x00-\x00a\x00d\x00d\x00-\x00s\x00m\x00a\x00l\x00l\x00.\x00p\x00n\ +\x00g\ +\x00\x0e\ +\x07\xf9\xa7\xc7\ +\x00c\ +\x00a\x00r\x00e\x00t\x00-\x00d\x00o\x00w\x00n\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x04\x99\x80'\ +\x00g\ +\x00r\x00o\x00u\x00p\x00_\x00o\x00p\x00e\x00n\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x0f\x0fU\xc7\ +\x00e\ +\x00r\x00r\x00o\x00r\x00-\x00c\x00o\x00n\x00c\x00l\x00i\x00c\x00t\x00-\x00s\x00t\ +\x00a\x00t\x00e\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x06\x8f\x22\xa7\ +\x00t\ +\x00o\x00o\x00l\x00_\x00f\x00i\x00l\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0bik\xa7\ +\x00s\ +\x00h\x00a\x00d\x00o\x00w\x00.\x00p\x00n\x00g\ +\x00\x0e\ +\x0f\xc9<\xe7\ +\x00e\ +\x00d\x00i\x00t\x00-\x00a\x00s\x00s\x00e\x00t\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x03-k\xe7\ +\x00c\ +\x00a\x00r\x00e\x00t\x00-\x00r\x00i\x00g\x00h\x00t\x00-\x00d\x00i\x00s\x00a\x00b\ +\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x11\ +\x0e{\xb6'\ +\x00n\ +\x00e\x00w\x00_\x00d\x00a\x00t\x00a\x00_\x00i\x00t\x00e\x00m\x00.\x00p\x00n\x00g\ +\ +\x00\x16\ +\x0d\xd4\x0aG\ +\x00c\ +\x00r\x00o\x00s\x00s\x00-\x00c\x00i\x00r\x00c\x00l\x00e\x00-\x00s\x00m\x00a\x00l\ +\x00l\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x0e\xa1e\x87\ +\x00B\ +\x00r\x00o\x00w\x00s\x00e\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x00\xdcc\x87\ +\x00t\ +\x00o\x00o\x00l\x00_\x00c\x00a\x00n\x00c\x00e\x00l\x00_\x00h\x00o\x00v\x00e\x00r\ +\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x0b]\x12\x87\ +\x00c\ +\x00h\x00e\x00c\x00k\x00m\x00a\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x02\x1a\xecg\ +\x00m\ +\x00e\x00n\x00u\x00_\x00i\x00c\x00o\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x09\x18\xd5\x07\ +\x00t\ +\x00r\x00a\x00s\x00h\x00-\x00s\x00m\x00a\x00l\x00l\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x09\x8c\x85\x07\ +\x00B\ +\x00r\x00o\x00w\x00s\x00e\x00_\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x0c3Z\x87\ +\x00h\ +\x00e\x00l\x00p\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x00\xb5E\xe7\ +\x00w\ +\x00a\x00r\x00n\x00i\x00n\x00g\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x05\xf5\x92G\ +\x00t\ +\x00o\x00o\x00l\x00_\x00c\x00a\x00n\x00c\x00e\x00l\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x01\xabfG\ +\x00d\ +\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00_\x00h\x00e\x00a\x00d\x00e\x00r\x00.\x00p\ +\x00n\x00g\ +\x00\x0a\ +\x09\xca\x1b\xa7\ +\x00s\ +\x00p\x00a\x00c\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x0c\ +\x02\x1a\xe1\xe7\ +\x00m\ +\x00e\x00n\x00u\x00_\x00i\x00c\x00o\x00.\x00p\x00n\x00g\ +\x00\x0e\ +\x04\xa9\xf2'\ +\x00h\ +\x00e\x00l\x00p\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\xa15g\ +\x00c\ +\x00h\x00a\x00n\x00g\x00e\x00d\x00_\x00d\x00a\x00t\x00a\x00_\x00i\x00t\x00e\x00m\ +\x00.\x00p\x00n\x00g\ +\x00\x17\ +\x0aw\x8b\x87\ +\x00c\ +\x00a\x00r\x00e\x00t\x00-\x00d\x00o\x00w\x00n\x00-\x00d\x00i\x00s\x00a\x00b\x00l\ +\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x0cL\x01G\ +\x00p\ +\x00o\x00i\x00n\x00t\x00_\x00h\x00a\x00n\x00d\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x0fU\x06'\ +\x00r\ +\x00e\x00c\x00t\x00a\x00n\x00g\x00l\x00e\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x01g\xb4'\ +\x00g\ +\x00r\x00o\x00u\x00p\x00_\x00c\x00l\x00o\x00s\x00e\x00d\x00.\x00p\x00n\x00g\ +\x00\x19\ +\x0a\x14\x80\xc7\ +\x00t\ +\x00o\x00o\x00l\x00_\x00c\x00a\x00n\x00c\x00e\x00l\x00_\x00h\x00i\x00g\x00h\x00l\ +\x00i\x00g\x00h\x00t\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x1d\x9c\x07\ +\x00r\ +\x00e\x00m\x00o\x00v\x00e\x00d\x00_\x00d\x00a\x00t\x00a\x00_\x00i\x00t\x00e\x00m\ +\x00.\x00p\x00n\x00g\ +\x00\x0e\ +\x0fO-\xc7\ +\x00s\ +\x00l\x00i\x00c\x00e\x00_\x00i\x00t\x00e\x00m\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x0cxm\x07\ +\x00c\ +\x00a\x00r\x00e\x00t\x00-\x00r\x00i\x00g\x00h\x00t\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x00s\xc8G\ +\x00e\ +\x00y\x00e\x00_\x00d\x00r\x00o\x00p\x00p\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x0dbig\ +\x00c\ +\x00r\x00o\x00s\x00s\x00-\x00s\x00m\x00a\x00l\x00l\x00.\x00p\x00n\x00g\ +\x00\x07\ +\x06\x82\xcb\x05\ +\x00P\ +\x00a\x00l\x00e\x00t\x00t\x00e\ +\x00\x09\ +\x03f|4\ +\x00C\ +\x00o\x00l\x00o\x00r\x00G\x00r\x00i\x00d\ +\x00\x0b\ +\x0b\x04\x9d\x04\ +\x00P\ +\x00a\x00l\x00e\x00t\x00t\x00e\x00C\x00a\x00r\x00d\ +\x00\x08\ +\x06\xc1Y\x87\ +\x00o\ +\x00p\x00e\x00n\x00.\x00p\x00n\x00g\ +\x00\x0a\ +\x09\xba\x11\x87\ +\x00c\ +\x00l\x00o\x00s\x00e\x00d\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x059\x0d\x87\ +\x00e\ +\x00y\x00e\x00d\x00r\x00o\x00p\x00p\x00e\x00r\x00-\x00n\x00o\x00r\x00m\x00a\x00l\ +\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x02\x0b\x98\xa7\ +\x00t\ +\x00o\x00g\x00g\x00l\x00e\x00-\x00n\x00o\x00r\x00m\x00a\x00l\x00-\x00o\x00n\x00.\ +\x00s\x00v\x00g\ +\x00\x0e\ +\x07\x97\xe3\x87\ +\x00a\ +\x00d\x00d\x00-\x00n\x00o\x00r\x00m\x00a\x00l\x00.\x00p\x00n\x00g\ +\x00\x14\ +\x00\x1f)\x07\ +\x00d\ +\x00e\x00f\x00a\x00u\x00l\x00t\x00_\x00d\x00o\x00c\x00u\x00m\x00e\x00n\x00t\x00.\ +\x00s\x00v\x00g\ +\x00\x0d\ +\x09\xdf\x12\x07\ +\x00L\ +\x00i\x00s\x00t\x00_\x00V\x00i\x00e\x00w\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x03\x87J\xa7\ +\x00N\ +\x00e\x00x\x00t\x00_\x00l\x00e\x00v\x00e\x00l\x00_\x00a\x00r\x00r\x00o\x00w\x00.\ +\x00s\x00v\x00g\ +\x00\x0f\ +\x05\x109'\ +\x00d\ +\x00o\x00t\x00-\x00d\x00o\x00t\x00-\x00d\x00o\x00t\x00.\x00s\x00v\x00g\ +\x00\x16\ +\x01.\xc1\xc7\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00l\x00e\x00f\x00t\x00-\x00d\x00e\x00f\x00a\x00u\x00l\ +\x00t\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x08h0\x87\ +\x00d\ +\x00o\x00w\x00a\x00r\x00d\x00_\x00a\x00r\x00r\x00o\x00w\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x04\xa5\x1fg\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00r\x00i\x00g\x00h\x00t\x00-\x00d\x00e\x00f\x00a\x00u\ +\x00l\x00t\x00.\x00s\x00v\x00g\ +\x00\x1d\ +\x05\x9doG\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00r\x00i\x00g\x00h\x00t\x00-\x00d\x00e\x00f\x00a\x00u\ +\x00l\x00t\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x1c\ +\x0e\x82\xd2\x07\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00l\x00e\x00f\x00t\x00-\x00d\x00e\x00f\x00a\x00u\x00l\ +\x00t\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x1a\ +\x05~\xaf\x87\ +\x00d\ +\x00o\x00t\x00-\x00d\x00o\x00t\x00-\x00d\x00o\x00t\x00_\x00w\x00i\x00t\x00h\x00_\ +\x00a\x00r\x00r\x00o\x00w\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x01\x1f\xf5g\ +\x00a\ +\x00r\x00r\x00o\x00w\x00R\x00i\x00g\x00h\x00t\x00H\x00o\x00v\x00e\x00r\x00.\x00s\ +\x00v\x00g\ +\x00\x15\ +\x00!\x00\xe7\ +\x00f\ +\x00o\x00c\x00u\x00s\x00e\x00d\x00B\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\ +\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x04\xf6\xd1\xe7\ +\x00a\ +\x00r\x00r\x00o\x00w\x00L\x00e\x00f\x00t\x00F\x00o\x00c\x00u\x00s\x00e\x00d\x00.\ +\x00s\x00v\x00g\ +\x00\x16\ +\x04\xd0e\xe7\ +\x00d\ +\x00r\x00a\x00g\x00g\x00i\x00n\x00g\x00B\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\ +\x00d\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x0e6B\x07\ +\x00s\ +\x00c\x00r\x00o\x00l\x00l\x00I\x00c\x00o\x00n\x00R\x00i\x00g\x00h\x00t\x00M\x00a\ +\x00x\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x03\x1c\x94\xe7\ +\x00a\ +\x00r\x00r\x00o\x00w\x00R\x00i\x00g\x00h\x00t\x00F\x00o\x00c\x00u\x00s\x00e\x00d\ +\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x0d-\x9aG\ +\x00a\ +\x00r\x00r\x00o\x00w\x00L\x00e\x00f\x00t\x00M\x00i\x00n\x00R\x00e\x00a\x00c\x00h\ +\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x01}g'\ +\x00a\ +\x00r\x00r\x00o\x00w\x00R\x00i\x00g\x00h\x00t\x00M\x00i\x00n\x00R\x00e\x00a\x00c\ +\x00h\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x0c\xf4\x82'\ +\x00a\ +\x00r\x00r\x00o\x00w\x00L\x00e\x00f\x00t\x00D\x00e\x00c\x00r\x00e\x00a\x00s\x00i\ +\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x00\xa4\x7f\x07\ +\x00a\ +\x00r\x00r\x00o\x00w\x00R\x00i\x00g\x00h\x00t\x00D\x00e\x00c\x00r\x00e\x00a\x00s\ +\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x04\x06\xa4\xc7\ +\x00s\ +\x00c\x00r\x00o\x00l\x00l\x00I\x00c\x00o\x00n\x00R\x00i\x00g\x00h\x00t\x00.\x00s\ +\x00v\x00g\ +\x00\x12\ +\x04HDg\ +\x00s\ +\x00c\x00r\x00o\x00l\x00l\x00I\x00c\x00o\x00n\x00L\x00e\x00f\x00t\x00.\x00s\x00v\ +\x00g\ +\x00\x17\ +\x06\xf4\x82\x87\ +\x00a\ +\x00r\x00r\x00o\x00w\x00L\x00e\x00f\x00t\x00I\x00n\x00c\x00r\x00e\x00a\x00s\x00i\ +\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x02\xa4}\xc7\ +\x00a\ +\x00r\x00r\x00o\x00w\x00R\x00i\x00g\x00h\x00t\x00I\x00n\x00c\x00r\x00e\x00a\x00s\ +\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x08\xbdg'\ +\x00a\ +\x00r\x00r\x00o\x00w\x00R\x00i\x00g\x00h\x00t\x00M\x00a\x00x\x00R\x00e\x00a\x00c\ +\x00h\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x03\xff\xaf\xc7\ +\x00m\ +\x00i\x00n\x00R\x00e\x00a\x00c\x00h\x00e\x00d\x00B\x00a\x00c\x00k\x00g\x00r\x00o\ +\x00u\x00n\x00d\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x04?\x9e\x07\ +\x00s\ +\x00c\x00r\x00o\x00l\x00l\x00I\x00c\x00o\x00n\x00L\x00e\x00f\x00t\x00M\x00a\x00x\ +\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x03\x98\x1f'\ +\x00a\ +\x00r\x00r\x00o\x00w\x00L\x00e\x00f\x00t\x00H\x00o\x00v\x00e\x00r\x00.\x00s\x00v\ +\x00g\ +\x00\x13\ +\x0a\xb7\x91g\ +\x00h\ +\x00o\x00v\x00e\x00r\x00B\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x00.\x00s\ +\x00v\x00g\ +\x00\x18\ +\x04\xb8\xaf\xc7\ +\x00m\ +\x00a\x00x\x00R\x00e\x00a\x00c\x00h\x00e\x00d\x00B\x00a\x00c\x00k\x00g\x00r\x00o\ +\x00u\x00n\x00d\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x0c\xed\x9ag\ +\x00a\ +\x00r\x00r\x00o\x00w\x00L\x00e\x00f\x00t\x00M\x00a\x00x\x00R\x00e\x00a\x00c\x00h\ +\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x16\ +\x06^\xcbG\ +\x00i\ +\x00n\x00c\x00r\x00e\x00a\x00s\x00e\x00B\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\ +\x00d\x00.\x00s\x00v\x00g\ +\x00\x16\ +\x061\x1a'\ +\x00a\ +\x00r\x00r\x00o\x00w\x00R\x00i\x00g\x00h\x00t\x00D\x00r\x00a\x00g\x00g\x00i\x00n\ +\x00g\x00.\x00s\x00v\x00g\ +\x00\x16\ +\x06S\xb3G\ +\x00d\ +\x00e\x00c\x00r\x00e\x00a\x00s\x00e\x00B\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\ +\x00d\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x0c\x8dJ\xc7\ +\x00a\ +\x00r\x00r\x00o\x00w\x00L\x00e\x00f\x00t\x00D\x00r\x00a\x00g\x00g\x00i\x00n\x00g\ +\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x0d\xed\xd0'\ +\x00s\ +\x00c\x00r\x00o\x00l\x00l\x00I\x00c\x00o\x00n\x00D\x00e\x00f\x00a\x00u\x00l\x00t\ +\x00.\x00s\x00v\x00g\ +\x00\x05\ +\x00Me\xb3\ +\x00F\ +\x00o\x00n\x00t\x00s\ +\x00\x09\ +\x0cD<\x93\ +\x00O\ +\x00p\x00e\x00n\x00_\x00S\x00a\x00n\x00s\ +\x00\x12\ +\x00\xc0\x10&\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00L\x00i\x00g\x00h\x00t\x00.\x00t\x00t\ +\x00f\ +\x00\x13\ +\x01\x82\xa8\x06\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00I\x00t\x00a\x00l\x00i\x00c\x00.\x00t\ +\x00t\x00f\ +\x00\x18\ +\x03j\xdf\xa6\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00L\x00i\x00g\x00h\x00t\x00I\x00t\x00a\ +\x00l\x00i\x00c\x00.\x00t\x00t\x00f\ +\x00\x16\ +\x05\xaa>\xe6\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00E\x00x\x00t\x00r\x00a\x00B\x00o\x00l\ +\x00d\x00.\x00t\x00t\x00f\ +\x00\x1c\ +\x09\xbe\x85&\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00E\x00x\x00t\x00r\x00a\x00B\x00o\x00l\ +\x00d\x00I\x00t\x00a\x00l\x00i\x00c\x00.\x00t\x00t\x00f\ +\x00\x15\ +\x03\xf0\x82f\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00S\x00e\x00m\x00i\x00b\x00o\x00l\x00d\ +\x00.\x00t\x00t\x00f\ +\x00\x14\ +\x05\xda\x5c\xc6\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00.\ +\x00t\x00t\x00f\ +\x00\x1b\ +\x05\x0b\xfc&\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00S\x00e\x00m\x00i\x00b\x00o\x00l\x00d\ +\x00I\x00t\x00a\x00l\x00i\x00c\x00.\x00t\x00t\x00f\ +\x00\x17\ +\x01\x02\xa8\x06\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00B\x00o\x00l\x00d\x00I\x00t\x00a\x00l\ +\x00i\x00c\x00.\x00t\x00t\x00f\ +\x00\x11\ +\x09\xf4(f\ +\x00O\ +\x00p\x00e\x00n\x00S\x00a\x00n\x00s\x00-\x00B\x00o\x00l\x00d\x00.\x00t\x00t\x00f\ +\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x8a\x00\x02\x00\x00\x00\x01\x00\x00\x02^\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\xd0\x00\x02\x00\x00\x00\x01\x00\x00\x00\xa3\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x01\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\xa0\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00,\x00\x02\x00\x00\x00\x01\x00\x00\x00\x94\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00F\x00\x02\x00\x00\x00\x01\x00\x00\x00\x93\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x9a\x00\x02\x00\x00\x00\x02\x00\x00\x00T\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00H\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\xfe\x00\x02\x00\x00\x00\x06\x00\x00\x00B\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00b\x00\x02\x00\x00\x00\x03\x00\x00\x00:\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x18\x00\x02\x00\x00\x00\x1a\x00\x00\x00 \ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\xea\x00\x02\x00\x00\x00\x01\x00\x00\x00\x1f\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\xbc\x00\x02\x00\x00\x00\x12\x00\x00\x00\x0d\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x002R\x00\x00\x00\x00\x00\x01\x00\x07\xec`\ +\x00\x00\x01v\xf3\x0e%N\ +\x00\x002\x06\x00\x00\x00\x00\x00\x01\x00\x07\xe4.\ +\x00\x00\x01v\xf3\x0e%#\ +\x00\x002\xcc\x00\x00\x00\x00\x00\x01\x00\x07\xf8\x15\ +\x00\x00\x01v\xf3\x0e%U\ +\x00\x002,\x00\x00\x00\x00\x00\x01\x00\x07\xe7W\ +\x00\x00\x01v\xf3\x0e%L\ +\x00\x00#\xe2\x00\x00\x00\x00\x00\x01\x00\x07\xfbn\ +\x00\x00\x01v\xf3\x0e%R\ +\x00\x001\xf2\x00\x00\x00\x00\x00\x01\x00\x07\xe1\xc4\ +\x00\x00\x01v\xf3\x0e% \ +\x00\x00 \x0e\x00\x00\x00\x00\x00\x01\x00\x08\x08\xcd\ +\x00\x00\x01v\xf3\x0e%T\ +\x00\x003\x0c\x00\x00\x00\x00\x00\x01\x00\x08\x03\xf9\ +\x00\x00\x01v\xf3\x0e%R\ +\x00\x00#\x12\x00\x00\x00\x00\x00\x01\x00\x07\xd5^\ +\x00\x00\x01v\xf3\x0e%S\ +\x00\x003@\x00\x00\x00\x00\x00\x01\x00\x08\x10?\ +\x00\x00\x01v\xf3\x0e%O\ +\x00\x003b\x00\x00\x00\x00\x00\x01\x00\x08\x13(\ +\x00\x00\x01v\xf3\x0e%O\ +\x00\x002\x86\x00\x00\x00\x00\x00\x01\x00\x07\xf2\x9c\ +\x00\x00\x01v\xf3\x0e%L\ +\x00\x00 \xc8\x00\x00\x00\x00\x00\x01\x00\x07\xefW\ +\x00\x00\x01v\xf3\x0e%#\ +\x00\x003&\x00\x00\x00\x00\x00\x01\x00\x08\x0c$\ +\x00\x00\x01v\xf3\x0e%+\ +\x00\x002\xf2\x00\x00\x00\x00\x00\x01\x00\x08\x00\xcd\ +\x00\x00\x01v\xf3\x0e%K\ +\x00\x002\xa0\x00\x00\x00\x00\x00\x01\x00\x07\xf5&\ +\x00\x00\x01v\xf3\x0e%M\ +\x00\x001\xb2\x00\x00\x00\x00\x00\x01\x00\x07\xd8\xaf\ +\x00\x00\x01v\xf3\x0e%\x22\ +\x00\x001\xd4\x00\x00\x00\x00\x00\x01\x00\x07\xda\xe7\ +\x00\x00\x01v\xf3\x0e%U\ +\x00\x00\x02x\x00\x00\x00\x00\x00\x01\x00\x00C.\ +\x00\x00\x01v\xf3\x0e%J\ +\x00\x00Ep\x00\x00\x00\x00\x00\x01\x00\x0a\xa5\x8a\ +\x00\x00\x01v\xf3\x0e%i\ +\x00\x00G\x04\x00\x00\x00\x00\x00\x01\x00\x0a\xc6y\ +\x00\x00\x01v\xf3\x0e%n\ +\x00\x00ED\x00\x00\x00\x00\x00\x01\x00\x0a\xa2\x9e\ +\x00\x00\x01v\xf3\x0e%q\ +\x00\x00F\x9a\x00\x00\x00\x00\x00\x01\x00\x0a\xc0\x97\ +\x00\x00\x01v\xf3\x0e%Y\ +\x00\x00G\xc4\x00\x00\x00\x00\x00\x01\x00\x0a\xdeV\ +\x00\x00\x01v\xf3\x0e%r\ +\x00\x00F6\x00\x00\x00\x00\x00\x01\x00\x0a\xba\xb7\ +\x00\x00\x01v\xf3\x0e%o\ +\x00\x00H\x9a\x00\x00\x00\x00\x00\x01\x00\x0a\xf2\x13\ +\x00\x00\x01v\xf3\x0e%p\ +\x00\x00H0\x00\x00\x00\x00\x00\x01\x00\x0a\xe4>\ +\x00\x00\x01v\xf3\x0e%g\ +\x00\x00G:\x00\x00\x00\x00\x00\x01\x00\x0a\xc9k\ +\x00\x00\x01v\xf3\x0e%d\ +\x00\x00Hf\x00\x00\x00\x00\x00\x01\x00\x0a\xe9\x15\ +\x00\x00\x01v\xf3\x0e%[\ +\x00\x00Gf\x00\x00\x00\x00\x00\x01\x00\x0a\xd2?\ +\x00\x00\x01v\xf3\x0e%Z\ +\x00\x00H\xf0\x00\x00\x00\x00\x00\x01\x00\x0a\xf9C\ +\x00\x00\x01v\xf3\x0e%f\ +\x00\x00E\xce\x00\x00\x00\x00\x00\x01\x00\x0a\xac\xbe\ +\x00\x00\x01v\xf3\x0e%h\ +\x00\x00E\xa0\x00\x00\x00\x00\x00\x01\x00\x0a\xa9\xd4\ +\x00\x00\x01v\xf3\x0e%o\ +\x00\x00I\x8c\x00\x00\x00\x00\x00\x01\x00\x0b\x05u\ +\x00\x00\x01v\xf3\x0e%l\ +\x00\x00I\xbe\x00\x00\x00\x00\x00\x01\x00\x0b\x08\x85\ +\x00\x00\x01v\xf3\x0e%h\ +\x00\x00IZ\x00\x00\x00\x00\x00\x01\x00\x0b\x00\x87\ +\x00\x00\x01v\xf3\x0e%k\ +\x00\x00G\x90\x00\x00\x00\x00\x00\x01\x00\x0a\xdbj\ +\x00\x00\x01v\xf3\x0e%q\ +\x00\x00G\xfa\x00\x00\x00\x00\x00\x01\x00\x0a\xe1H\ +\x00\x00\x01v\xf3\x0e%W\ +\x00\x00H\xc4\x00\x00\x00\x00\x00\x01\x00\x0a\xf4\xf9\ +\x00\x00\x01v\xf3\x0e%j\ +\x00\x00I\xf0\x00\x00\x00\x00\x00\x01\x00\x0b\x0dR\ +\x00\x00\x01v\xf3\x0e%k\ +\x00\x00I&\x00\x00\x00\x00\x00\x01\x00\x0a\xfd\x97\ +\x00\x00\x01v\xf3\x0e%V\ +\x00\x00F\xd0\x00\x00\x00\x00\x00\x01\x00\x0a\xc3\x8d\ +\x00\x00\x01v\xf3\x0e%m\ +\x00\x00Ff\x00\x00\x00\x00\x00\x01\x00\x0a\xbd\xa7\ +\x00\x00\x01v\xf3\x0e%X\ +\x00\x00J \x00\x00\x00\x00\x00\x01\x00\x0b\x10\x5c\ +\x00\x00\x01v\xf3\x0e%Y\ +\x00\x00F\x00\x00\x00\x00\x00\x00\x01\x00\x0a\xb1f\ +\x00\x00\x01v\xf3\x0e%e\ +\x00\x00B|\x00\x02\x00\x00\x00\x02\x00\x00\x00@\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00Bh\x00\x02\x00\x00\x00\x01\x00\x00\x00?\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00B\x94\x00\x02\x00\x00\x00\x02\x00\x00\x00=\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00B\xb0\x00\x00\x00\x00\x00\x01\x00\x0a_\xb9\ +\x00\x00\x01v\xf3\x13\xd2\x16\ +\x00\x00B\xc6\x00\x00\x00\x00\x00\x01\x00\x0a`\xd0\ +\x00\x00\x01v\xf3\x13\xd2\x04\ +\x00\x00C>\x00\x00\x00\x00\x00\x01\x00\x0ar\x09\ +\x00\x00\x01v\xf3\x13\xd1\xfa\ +\x00\x00C\x10\x00\x00\x00\x00\x00\x01\x00\x0ahU\ +\x00\x00\x01v\xf3\x0e%\x84\ +\x00\x00B\xe0\x00\x00\x00\x00\x00\x01\x00\x0ab\x08\ +\x00\x00\x01v\xf3\x0e%\x83\ +\x00\x00\x01\xd8\x00\x00\x00\x00\x00\x01\x00\x005\x9a\ +\x00\x00\x01v\xf3\x0e%v\ +\x00\x00\x02R\x00\x00\x00\x00\x00\x01\x00\x00@\x9a\ +\x00\x00\x01v\xf3\x0e%t\ +\x00\x00\x01\xee\x00\x00\x00\x00\x00\x01\x00\x007\xa4\ +\x00\x00\x01v\xf3\x0e%s\ +\x00\x00\x02\x08\x00\x00\x00\x00\x00\x01\x00\x009\x86\ +\x00\x00\x01v\xf3\x0e%u\ +\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x003\x1c\ +\x00\x00\x01v\xf3\x0e%w\ +\x00\x00\x02.\x00\x00\x00\x00\x00\x01\x00\x00=\x92\ +\x00\x00\x01v\xf3\x0e%u\ +\x00\x00JP\x00\x02\x00\x00\x00\x01\x00\x00\x00I\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00J`\x00\x02\x00\x00\x00\x0a\x00\x00\x00J\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00Jx\x00\x00\x00\x00\x00\x01\x00\x0b\x18\xe7\ +\x00\x00\x01v\xf3\x13\xb1\xc0\ +\x00\x00L\x0e\x00\x00\x00\x00\x00\x01\x00%\x96\x13\ +\x00\x00\x01v\xf3\x13\xc2\x9e\ +\x00\x00J\xa2\x00\x00\x00\x00\x00\x01\x00\x0e}\xb7\ +\x00\x00\x01v\xf3\x13\xc2\xc0\ +\x00\x00J\xce\x00\x00\x00\x00\x00\x01\x00\x11\xbd[\ +\x00\x00\x01v\xf3\x13\xc2\x82\ +\x00\x00Kt\x00\x00\x00\x00\x00\x01\x00\x1b\xa5\x13\ +\x00\x00\x01v\xf3\x13\xb1\xe7\ +\x00\x00K\xd2\x00\x00\x00\x00\x00\x01\x00\x22V\xbb\ +\x00\x00\x01v\xf3\x13\xc2\xdd\ +\x00\x00K\x04\x00\x00\x00\x00\x00\x01\x00\x14\xfd\xe7\ +\x00\x00\x01v\xf3\x13\xaf\xfc\ +\x00\x00K\xa4\x00\x00\x00\x00\x00\x01\x00\x1f\x05\xa7\ +\x00\x00\x01v\xf3\x13\xb3+\ +\x00\x00K6\x00\x00\x00\x00\x00\x01\x00\x18cc\ +\x00\x00\x01v\xf3\x13\xc2x\ +\x00\x00LB\x00\x00\x00\x00\x00\x01\x00(\xd7C\ +\x00\x00\x01v\xf3\x13\xb1\x9b\ +\x00\x003\x98\x00\x00\x00\x00\x00\x01\x00\x08\x16\xe3\ +\x00\x00\x01v\xf3\x0e#T\ +\x00\x003\x84\x00\x02\x00\x00\x00<\x00\x00\x00V\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x11\ +\x00\x00\x01v\xf3\x0e#\xe3\ +\x00\x007\x16\x00\x00\x00\x00\x00\x01\x00\x08R4\ +\x00\x00\x01v\xf3\x0e#\xca\ +\x00\x004x\x00\x00\x00\x00\x00\x01\x00\x08,/\ +\x00\x00\x01v\xf3\x0e$\x1b\ +\x00\x007\xa4\x00\x00\x00\x00\x00\x01\x00\x08[\xea\ +\x00\x00\x01v\xf3\x0e$1\ +\x00\x007J\x00\x00\x00\x00\x00\x01\x00\x08Vw\ +\x00\x00\x01v\xf3\x0e$o\ +\x00\x00<\xb6\x00\x00\x00\x00\x00\x01\x00\x08\xdf,\ +\x00\x00\x01we\x98\xa6\x12\ +\x00\x00;\xc0\x00\x00\x00\x00\x00\x01\x00\x08\xc29\ +\x00\x00\x01v\xf3\x0e$\x95\ +\x00\x009\xac\x00\x00\x00\x00\x00\x01\x00\x08\x90a\ +\x00\x00\x01w\xe0\xa0T\xc0\ +\x00\x00:\x8c\x00\x00\x00\x00\x00\x01\x00\x08\x99@\ +\x00\x00\x01v\xf3\x0e$A\ +\x00\x00<4\x00\x00\x00\x00\x00\x01\x00\x08\xca|\ +\x00\x00\x01v\xf3\x0e$\x8f\ +\x00\x005\x8c\x00\x01\x00\x00\x00\x01\x00\x085\x0b\ +\x00\x00\x01we\x98\xa6\x14\ +\x00\x006\xca\x00\x00\x00\x00\x00\x01\x00\x08D\xd9\ +\x00\x00\x01v\xf3\x0e$6\ +\x00\x009$\x00\x00\x00\x00\x00\x01\x00\x08\x82\xd5\ +\x00\x00\x01v\xf3\x0e$P\ +\x00\x004@\x00\x00\x00\x00\x00\x01\x00\x08\x1db\ +\x00\x00\x01v\xf3\x0e#\xe5\ +\x00\x008\xfa\x00\x00\x00\x00\x00\x01\x00\x08z\xbf\ +\x00\x00\x01v\xf3\x0e$X\ +\x00\x004\x1e\x00\x00\x00\x00\x00\x01\x00\x08\x1dD\ +\x00\x00\x01v\xf3\x0e$\x89\ +\x00\x005\x04\x00\x00\x00\x00\x00\x01\x00\x08-\xe7\ +\x00\x00\x01v\xf3\x0e#\xd6\ +\x00\x008\x80\x00\x00\x00\x00\x00\x01\x00\x08nb\ +\x00\x00\x01v\xf3\x0e$\x92\ +\x00\x004\xa8\x00\x00\x00\x00\x00\x01\x00\x08->\ +\x00\x00\x01v\xf3\x0e#\xd6\ +\x00\x006\x0a\x00\x00\x00\x00\x00\x01\x00\x08<\xaf\ +\x00\x00\x01v\xf3\x0e$O\ +\x00\x00;\x9c\x00\x00\x00\x00\x00\x01\x00\x08\xbd\xd1\ +\x00\x00\x01v\xf3\x0e$L\ +\x00\x00:4\x00\x00\x00\x00\x00\x01\x00\x08\x94}\ +\x00\x00\x01v\xf3\x0e$r\ +\x00\x00;\xe4\x00\x01\x00\x00\x00\x01\x00\x08\xc6n\ +\x00\x00\x01x3\xe1\xbc\x1a\ +\x00\x009\x80\x00\x00\x00\x00\x00\x01\x00\x08\x90]\ +\x00\x00\x01v\xf3\x0e$q\ +\x00\x005\xaa\x00\x02\x00\x00\x00\x01\x00\x00\x00\x92\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x005\xee\x00\x00\x00\x00\x00\x01\x00\x088\xca\ +\x00\x00\x01v\xf3\x0e$6\ +\x00\x00:\xea\x00\x00\x00\x00\x00\x01\x00\x08\x9d\xba\ +\x00\x00\x01v\xf3\x0e$\x8d\ +\x00\x00;\x86\x00\x01\x00\x00\x00\x01\x00\x08\xb7\xe6\ +\x00\x00\x01v\xf3\x0e#\xdc\ +\x00\x00<\x80\x00\x00\x00\x00\x00\x01\x00\x08\xd72\ +\x00\x00\x01v\xf3\x0e$ \ +\x00\x008\xda\x00\x00\x00\x00\x00\x01\x00\x08n\xae\ +\x00\x00\x01x3\xe1\xbc\x1c\ +\x00\x007\xc2\x00\x00\x00\x00\x00\x01\x00\x08a\x15\ +\x00\x00\x01v\xf3\x0e$c\ +\x00\x009\xdc\x00\x00\x00\x00\x00\x01\x00\x08\x90\xc9\ +\x00\x00\x01v\xf3\x0e$F\ +\x00\x00;\x06\x00\x00\x00\x00\x00\x01\x00\x08\xa9\x92\ +\x00\x00\x01v\xf3\x0e#\xd9\ +\x00\x00;j\x00\x01\x00\x00\x00\x01\x00\x08\xb3\xac\ +\x00\x00\x01v\xf3\x0e$m\ +\x00\x008\xaa\x00\x00\x00\x00\x00\x01\x00\x08n\x9e\ +\x00\x00\x01v\xf3\x0e$B\ +\x00\x004\xd8\x00\x00\x00\x00\x00\x01\x00\x08-i\ +\x00\x00\x01v\xf3\x0e${\ +\x00\x005(\x00\x00\x00\x00\x00\x01\x00\x081\xaa\ +\x00\x00\x01v\xf3\x0e$`\ +\x00\x00:b\x00\x00\x00\x00\x00\x01\x00\x08\x98\x85\ +\x00\x00\x01v\xf3\x0e$\x8a\ +\x00\x009`\x00\x00\x00\x00\x00\x01\x00\x08\x86\x13\ +\x00\x00\x01v\xf3\x0e$z\ +\x00\x00<\x08\x00\x00\x00\x00\x00\x01\x00\x08\xcak\ +\x00\x00\x01v\xf3\x0e$T\ +\x00\x006\xae\x00\x00\x00\x00\x00\x01\x00\x08A\xd4\ +\x00\x00\x01we\x98\xa6\x15\ +\x00\x008`\x00\x00\x00\x00\x00\x01\x00\x08e\xa5\ +\x00\x00\x01w^\xee\x88Z\ +\x00\x00<\xd8\x00\x00\x00\x00\x00\x01\x00\x08\xe7Z\ +\x00\x00\x01we\x98\xa6\x11\ +\x00\x00<\xee\x00\x00\x00\x00\x00\x01\x00\x08\xed\xb9\ +\x00\x00\x01v\xf3\x0e#\xe3\ +\x00\x005d\x00\x00\x00\x00\x00\x01\x00\x085\x07\ +\x00\x00\x01v\xf3\x0e$\x8d\ +\x00\x006\x84\x00\x00\x00\x00\x00\x01\x00\x08A\xd0\ +\x00\x00\x01v\xf3\x0e$\x19\ +\x00\x004b\x00\x00\x00\x00\x00\x01\x00\x08!\xa5\ +\x00\x00\x01we\x98\xa6\x13\ +\x00\x00:\xb0\x00\x01\x00\x00\x00\x01\x00\x08\x9c\xe7\ +\x00\x00\x01v\xf3\x0e$w\ +\x00\x003\xcc\x00\x00\x00\x00\x00\x01\x00\x08\x16\xe7\ +\x00\x00\x01v\xf3\x0e$N\ +\x00\x00;(\x00\x00\x00\x00\x00\x01\x00\x08\xb3\xa8\ +\x00\x00\x01v\xf3\x0e$ \ +\x00\x006\xec\x00\x00\x00\x00\x00\x01\x00\x08D\xdd\ +\x00\x00\x01w\xe0\xa0T\xbc\ +\x00\x007\xe8\x00\x00\x00\x00\x00\x01\x00\x08c\x0f\ +\x00\x00\x01v\xf3\x0e#\xd2\ +\x00\x005B\x00\x00\x00\x00\x00\x01\x00\x084\xb6\ +\x00\x00\x01v\xf3\x0e#\xdd\ +\x00\x00:\x0a\x00\x00\x00\x00\x00\x01\x00\x08\x94y\ +\x00\x00\x01v\xf3\x0e$1\ +\x00\x007h\x00\x00\x00\x00\x00\x01\x00\x08Y|\ +\x00\x00\x01v\xf3\x0e$\x95\ +\x00\x006:\x00\x00\x00\x00\x00\x01\x00\x08<\xb3\ +\x00\x00\x01v\xf3\x0e$x\ +\x00\x005\xc6\x00\x00\x00\x00\x00\x01\x00\x088\xb4\ +\x00\x00\x01v\xf3\x0e$n\ +\x00\x003\xf0\x00\x00\x00\x00\x00\x01\x00\x08\x1d\x12\ +\x00\x00\x01v\xf3\x0e#\xda\ +\x00\x0082\x00\x00\x00\x00\x00\x01\x00\x08e}\ +\x00\x00\x01v\xf3\x0e$\x1f\ +\x00\x00=\x18\x00\x00\x00\x00\x00\x01\x00\x08\xed\xbd\ +\x00\x00\x01v\xf3\x0e$\x13\ +\x00\x00C`\x00\x00\x00\x00\x00\x01\x00\x0as;\ +\x00\x00\x01v\xf3\x0e%!\ +\x00\x00\x02\x94\x00\x02\x00\x00\x00\x01\x00\x00\x00\x95\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x0e\x86\x00\x02\x00\x00\x00\x01\x00\x00\x00\x96\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00,\x00\x02\x00\x00\x00\x09\x00\x00\x00\x97\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00D\x00\x00\x00\x00\x00\x00\x01\x00\x0a\x81S\ +\x00\x00\x01v\xf3\x0e%&\ +\x00\x00C\xae\x00\x00\x00\x00\x00\x01\x00\x0az\xc5\ +\x00\x00\x01v\xf3\x0e%%\ +\x00\x00DX\x00\x00\x00\x00\x00\x01\x00\x0a\x8ae\ +\x00\x00\x01v\xf3\x0e%'\ +\x00\x00C\xdc\x00\x00\x00\x00\x00\x01\x00\x0a}\xeb\ +\x00\x00\x01v\xf3\x0e%)\ +\x00\x00E\x0a\x00\x00\x00\x00\x00\x01\x00\x0a\x97a\ +\x00\x00\x01v\xf3\x0e%*\ +\x00\x00D\x8c\x00\x00\x00\x00\x00\x01\x00\x0a\x8e\x9b\ +\x00\x00\x01v\xf3\x0e%(\ +\x00\x00D2\x00\x00\x00\x00\x00\x01\x00\x0a\x85\xe3\ +\x00\x00\x01v\xf3\x0e%*\ +\x00\x00C\x8e\x00\x00\x00\x00\x00\x01\x00\x0av'\ +\x00\x00\x01v\xf3\x0e%$\ +\x00\x00D\xcc\x00\x00\x00\x00\x00\x01\x00\x0a\x92\xd1\ +\x00\x00\x01v\xf3\x0e%'\ +\x00\x00\x01&\x00\x02\x00\x00\x00\x02\x00\x00\x00\xa1\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x016\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01v\xf3\x0eE\x0d\ +\x00\x00\x01j\x00\x00\x00\x00\x00\x01\x00\x00*&\ +\x00\x00\x01v\xf3\x0eE\x0c\ +\x00\x00\x02\x94\x00\x02\x00\x00\x00Z\x00\x00\x00\xa4\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x0e\x86\x00\x02\x00\x00\x00)\x00\x00\x01\xf0\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x0d\xbe\x00\x02\x00\x00\x00D\x00\x00\x01\xac\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x10X\x00\x02\x00\x00\x00=\x00\x00\x01o\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x03\xf6\x00\x02\x00\x00\x00=\x00\x00\x012\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x0fZ\x00\x00\x00\x00\x00\x01\x00\x00\xe8\xfc\ +\x00\x00\x01v\xf3\x13\xcf\xdd\ +\x00\x00\x0d<\x00\x00\x00\x00\x00\x01\x00\x00\xcc\xb0\ +\x00\x00\x01v\xf3\x0e%\xfd\ +\x00\x00\x0d\xec\x00\x02\x00\x00\x00\x12\x00\x00\x01 \ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x00\x81+\ +\x00\x00\x01v\xf3\x13\xd2\x1f\ +\x00\x00\x0e\xba\x00\x00\x00\x00\x00\x01\x00\x00\xe1\x8c\ +\x00\x00\x01v\xf3\x13\xd0\x12\ +\x00\x00\x05\xd8\x00\x00\x00\x00\x00\x01\x00\x00{J\ +\x00\x00\x01v\xf3\x13\xd25\ +\x00\x00\x0c\x18\x00\x00\x00\x00\x00\x01\x00\x00\xbd\xb9\ +\x00\x00\x01v\xf3\x13\xd2\x00\ +\x00\x00\x06 \x00\x00\x00\x00\x00\x01\x00\x00|\x0d\ +\x00\x00\x01v\xf3\x13\xd2Y\ +\x00\x00\x0c\xf2\x00\x00\x00\x00\x00\x01\x00\x00\xcbp\ +\x00\x00\x01v\xf3\x13\xd3`\ +\x00\x00\x10\xe6\x00\x00\x00\x00\x00\x01\x00\x03^\x06\ +\x00\x00\x01v\xf3\x0e&A\ +\x00\x00\x09\xea\x00\x00\x00\x00\x00\x01\x00\x00\xa2H\ +\x00\x00\x01v\xf3\x13\xd0'\ +\x00\x00\x046\x00\x00\x00\x00\x00\x01\x00\x00e\x92\ +\x00\x00\x01v\xf3\x13\xcf\xea\ +\x00\x00\x0aX\x00\x02\x00\x00\x00\x0b\x00\x00\x01\x15\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x06J\x00\x00\x00\x00\x00\x01\x00\x00|\xd4\ +\x00\x00\x01v\xf3\x13\xd2(\ +\x00\x00\x08N\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xd0\ +\x00\x00\x01v\xf3\x13\xd2$\ +\x00\x00\x08(\x00\x00\x00\x00\x00\x01\x00\x00\x87\xb5\ +\x00\x00\x01v\xf3\x0e%\xf2\ +\x00\x00\x0dX\x00\x00\x00\x00\x00\x01\x00\x00\xd0@\ +\x00\x00\x01v\xf3\x13\xd3\xb2\ +\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x5cY\ +\x00\x00\x01v\xf3\x13\xd2%\ +\x00\x00\x0f~\x00\x00\x00\x00\x00\x01\x00\x03QL\ +\x00\x00\x01v\xf3\x13\xd1\x89\ +\x00\x00\x0e\x18\x00\x00\x00\x00\x00\x01\x00\x00\xdd\x93\ +\x00\x00\x01v\xf3\x13\xd0\x1e\ +\x00\x00\x09\xac\x00\x00\x00\x00\x00\x01\x00\x00\x9f\x91\ +\x00\x00\x01v\xf3\x13\xd0\x1a\ +\x00\x00\x04\xbc\x00\x00\x00\x00\x00\x01\x00\x00o\x03\ +\x00\x00\x01v\xf3\x13\xd0\x17\ +\x00\x00\x100\x00\x00\x00\x00\x00\x01\x00\x03X\x11\ +\x00\x00\x01v\xf3\x13\xd0K\ +\x00\x00\x05z\x00\x00\x00\x00\x00\x01\x00\x00w0\ +\x00\x00\x01v\xf3\x13\xd3\xae\ +\x00\x00\x05Z\x00\x00\x00\x00\x00\x01\x00\x00vR\ +\x00\x00\x01v\xf3\x13\xd3\x8b\ +\x00\x00\x10\xc6\x00\x00\x00\x00\x00\x01\x00\x03]%\ +\x00\x00\x01v\xf3\x13\xd3\x85\ +\x00\x00\x08\xca\x00\x00\x00\x00\x00\x01\x00\x00\x8d\xf5\ +\x00\x00\x01v\xf3\x13\xd3\x9d\ +\x00\x00\x0d\x8a\x00\x00\x00\x00\x00\x01\x00\x00\xd0\xe3\ +\x00\x00\x01v\xf3\x13\xcf\xef\ +\x00\x00\x0f\x0a\x00\x00\x00\x00\x00\x01\x00\x00\xe6K\ +\x00\x00\x01v\xf3\x13\xd2\x1e\ +\x00\x00\x08z\x00\x00\x00\x00\x00\x01\x00\x00\x8c\xd7\ +\x00\x00\x01v\xf3\x13\xd2G\ +\x00\x00\x0b~\x00\x02\x00\x00\x00\x07\x00\x00\x01\x0e\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x09\x94\x00\x00\x00\x00\x00\x01\x00\x00\x9b\xcb\ +\x00\x00\x01v\xf3\x0e%\xda\ +\x00\x00\x0f\xb8\x00\x00\x00\x00\x00\x01\x00\x03R\xc5\ +\x00\x00\x01v\xf3\x0e%\xfe\ +\x00\x00\x04\x06\x00\x00\x00\x00\x00\x01\x00\x00cl\ +\x00\x00\x01v\xf3\x13\xd0/\ +\x00\x00\x0b\xfa\x00\x02\x00\x00\x00\x10\x00\x00\x00\xfe\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x0bT\x00\x00\x00\x00\x00\x01\x00\x00\xb3\x85\ +\x00\x00\x01v\xf3\x13\xd0O\ +\x00\x00\x0cr\x00\x00\x00\x00\x00\x01\x00\x00\xc7\x10\ +\x00\x00\x01v\xf3\x13\xd0I\ +\x00\x00\x11\x16\x00\x00\x00\x00\x00\x01\x00\x03d<\ +\x00\x00\x01v\xf3\x13\xcf\xda\ +\x00\x00\x0b\xe0\x00\x01\x00\x00\x00\x01\x00\x00\xb7\xdc\ +\x00\x00\x01v\xf3\x13\xcf\xbe\ +\x00\x00\x0a\xbe\x00\x00\x00\x00\x00\x01\x00\x00\xa9\xa9\ +\x00\x00\x01v\xf3\x0e&5\ +\x00\x00\x05\xa6\x00\x00\x00\x00\x00\x01\x00\x00w\xbc\ +\x00\x00\x01v\xf3\x13\xd0\x18\ +\x00\x00\x04\x8e\x00\x00\x00\x00\x00\x01\x00\x00n\xa7\ +\x00\x00\x01v\xf3\x13\xd2a\ +\x00\x00\x08\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x8d\x87\ +\x00\x00\x01v\xf3\x13\xd2g\ +\x00\x00\x09\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x8fS\ +\x00\x00\x01v\xf3\x13\xd01\ +\x00\x00\x03\xbc\x00\x00\x00\x00\x00\x01\x00\x00b;\ +\x00\x00\x01v\xf3\x13\xd2_\ +\x00\x00\x03X\x00\x00\x00\x00\x00\x01\x00\x00_\xf8\ +\x00\x00\x01v\xf3\x13\xd3i\ +\x00\x00\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x00\xe5E\ +\x00\x00\x01v\xf3\x13\xd2 \ +\x00\x00\x09L\x00\x00\x00\x00\x00\x01\x00\x00\x92\xcc\ +\x00\x00\x01v\xf3\x0e&3\ +\x00\x00\x0f\xd4\x00\x00\x00\x00\x00\x01\x00\x03W>\ +\x00\x00\x01v\xf3\x13\xd2l\ +\x00\x00\x0eV\x00\x00\x00\x00\x00\x01\x00\x00\xe05\ +\x00\x00\x01v\xf3\x13\xd2.\ +\x00\x00\x08\xea\x00\x00\x00\x00\x00\x01\x00\x00\x8e\xc3\ +\x00\x00\x01v\xf3\x13\xd2\x5c\ +\x00\x00\x02\xd4\x00\x00\x00\x00\x00\x01\x00\x00Y\xec\ +\x00\x00\x01v\xf3\x13\xd0\x1c\ +\x00\x00\x04\xee\x00\x00\x00\x00\x00\x01\x00\x00q\xda\ +\x00\x00\x01v\xf3\x13\xd2\x11\ +\x00\x00\x03\xdc\x00\x00\x00\x00\x00\x01\x00\x00b\x97\ +\x00\x00\x01v\xf3\x0e%\xee\ +\x00\x00\x06\xdc\x00\x00\x00\x00\x00\x01\x00\x00\x80 \ +\x00\x00\x01v\xf3\x13\xd2\x18\ +\x00\x00\x10h\x00\x00\x00\x00\x00\x01\x00\x03Y\x97\ +\x00\x00\x01v\xf3\x13\xd0E\ +\x00\x00\x050\x00\x00\x00\x00\x00\x01\x00\x00u\x85\ +\x00\x00\x01v\xf3\x13\xd2;\ +\x00\x00\x0a\x96\x00\x00\x00\x00\x00\x01\x00\x00\xa7\x8d\ +\x00\x00\x01v\xf3\x13\xd0(\ +\x00\x00\x0f2\x00\x00\x00\x00\x00\x01\x00\x00\xe7P\ +\x00\x00\x01v\xf3\x13\xd0Q\ +\x00\x00\x0d\xce\x00\x00\x00\x00\x00\x01\x00\x00\xd5\x82\ +\x00\x00\x01v\xf3\x0e%\xfd\ +\x00\x00\x11>\x00\x00\x00\x00\x00\x01\x00\x03i(\ +\x00\x00\x01v\xf3\x0e%\xdb\ +\x00\x00\x07@\x00\x00\x00\x00\x00\x01\x00\x00\x821\ +\x00\x00\x01v\xf3\x13\xd0A\ +\x00\x00\x05\x08\x00\x00\x00\x00\x00\x01\x00\x00s\x1c\ +\x00\x00\x01v\xf3\x13\xd0,\ +\x00\x00\x0b\x08\x00\x00\x00\x00\x00\x01\x00\x00\xb0\xd5\ +\x00\x00\x01v\xf3\x13\xd00\ +\x00\x00\x06\x96\x00\x00\x00\x00\x00\x01\x00\x00\x7fc\ +\x00\x00\x01v\xf3\x13\xd28\ +\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x01\x00\x00\xda\xda\ +\x00\x00\x01v\xf3\x0e%\xf1\ +\x00\x00\x0b\xca\x00\x00\x00\x00\x00\x01\x00\x00\xb6\xb1\ +\x00\x00\x01v\xf3\x13\xd1\xfc\ +\x00\x00\x09p\x00\x00\x00\x00\x00\x01\x00\x00\x98\x03\ +\x00\x00\x01x3\xe1\xbc\x1e\ +\x00\x00\x0b,\x00\x00\x00\x00\x00\x01\x00\x00\xb2\xfb\ +\x00\x00\x01v\xf3\x13\xd2b\ +\x00\x00\x0c\xc0\x00\x00\x00\x00\x00\x01\x00\x00\xc8\x9a\ +\x00\x00\x01v\xf3\x0e%\xf6\ +\x00\x00\x0al\x00\x00\x00\x00\x00\x01\x00\x00\xa5v\ +\x00\x00\x01v\xf3\x13\xd07\ +\x00\x00\x06h\x00\x00\x00\x00\x00\x01\x00\x00}\xb7\ +\x00\x00\x01v\xf3\x13\xd0D\ +\x00\x00\x032\x00\x00\x00\x00\x00\x01\x00\x00]M\ +\x00\x00\x01v\xf3\x13\xd0\x16\ +\x00\x00\x0b\x96\x00\x00\x00\x00\x00\x01\x00\x00\xb51\ +\x00\x00\x01v\xf3\x13\xd1\x85\ +\x00\x00\x0a \x00\x00\x00\x00\x00\x01\x00\x00\xa4d\ +\x00\x00\x01v\xf3\x13\xd3y\ +\x00\x00\x07j\x00\x00\x00\x00\x00\x01\x00\x00\x83\xde\ +\x00\x00\x01v\xf3\x13\xd3\x82\ +\x00\x00\x0e\x94\x00\x00\x00\x00\x00\x01\x00\x00\xe1\x02\ +\x00\x00\x01v\xf3\x13\xd3\xbc\ +\x00\x00\x0a\xd8\x00\x00\x00\x00\x00\x01\x00\x00\xae\xde\ +\x00\x00\x01v\xf3\x13\xd3\x13\ +\x00\x00\x02\xa0\x00\x00\x00\x00\x00\x01\x00\x00W\xd2\ +\x00\x00\x01v\xf3\x13\xd0-\ +\x00\x00\x0c@\x00\x00\x00\x00\x00\x01\x00\x00\xbe\xed\ +\x00\x00\x01v\xf3\x0e&@\ +\x00\x00\x04X\x00\x00\x00\x00\x00\x01\x00\x00ku\ +\x00\x00\x01v\xf3\x0e%\xf5\ +\x00\x00\x10\x8c\x00\x00\x00\x00\x00\x01\x00\x03[C\ +\x00\x00\x01v\xf3\x13\xd3\x19\ +\x00\x00\x03\x8e\x00\x00\x00\x00\x00\x01\x00\x00a\x16\ +\x00\x00\x01v\xf3\x13\xd2\x10\ +\x00\x00\x07\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x86\x81\ +\x00\x00\x01v\xf3\x13\xd1\xfe\ +\x00\x00\x07\xac\x00\x00\x00\x00\x00\x01\x00\x00\x84\xc1\ +\x00\x00\x01v\xf3\x13\xd0:\ +\x00\x00\x10\x04\x00\x00\x00\x00\x00\x01\x00\x03W\xb4\ +\x00\x00\x01v\xf3\x13\xd3\xba\ +\x00\x00.\xd4\x00\x00\x00\x00\x00\x01\x00\x06\xdb]\ +\x00\x00\x01v\xf3\x13\xd0L\ +\x00\x00.p\x00\x00\x00\x00\x00\x01\x00\x06\xd8v\ +\x00\x00\x01v\xf3\x13\xd1\xe0\ +\x00\x00.\xfe\x00\x00\x00\x00\x00\x01\x00\x06\xdc\xe6\ +\x00\x00\x01v\xf3\x13\xd3,\ +\x00\x00,\xb8\x00\x00\x00\x00\x00\x01\x00\x06\xc8\x08\ +\x00\x00\x01v\xf3\x13\xd1\xe2\ +\x00\x00.\xa0\x00\x00\x00\x00\x00\x01\x00\x06\xd9\xd2\ +\x00\x00\x01v\xf3\x13\xd3*\ +\x00\x00-F\x00\x00\x00\x00\x00\x01\x00\x06\xcd\xcf\ +\x00\x00\x01v\xf3\x13\xd1\xee\ +\x00\x00,\xd0\x00\x00\x00\x00\x00\x01\x00\x06\xc9\x87\ +\x00\x00\x01v\xf3\x13\xd3\x9f\ +\x00\x00-j\x00\x00\x00\x00\x00\x01\x00\x06\xcf/\ +\x00\x00\x01v\xf3\x13\xd06\ +\x00\x00.B\x00\x00\x00\x00\x00\x01\x00\x06\xd6\xed\ +\x00\x00\x01v\xf3\x13\xd0M\ +\x00\x00.\x0c\x00\x00\x00\x00\x00\x01\x00\x06\xd5}\ +\x00\x00\x01v\xf3\x13\xd1\xdc\ +\x00\x00-\xe8\x00\x00\x00\x00\x00\x01\x00\x06\xd4\x0d\ +\x00\x00\x01v\xf3\x13\xd1\xeb\ +\x00\x00-\x9a\x00\x00\x00\x00\x00\x01\x00\x06\xd1\x11\ +\x00\x00\x01v\xf3\x13\xd3G\ +\x00\x00-\xca\x00\x00\x00\x00\x00\x01\x00\x06\xd2b\ +\x00\x00\x01v\xf3\x13\xd0S\ +\x00\x00,\xf2\x00\x00\x00\x00\x00\x01\x00\x06\xcb\x12\ +\x00\x00\x01v\xf3\x13\xd36\ +\x00\x00-(\x00\x00\x00\x00\x00\x01\x00\x06\xccs\ +\x00\x00\x01v\xf3\x13\xd1\xf1\ +\x00\x00/\x1a\x00\x00\x00\x00\x00\x01\x00\x06\xde_\ +\x00\x00\x01v\xf3\x13\xd1\xe5\ +\x00\x00/\xb8\x00\x00\x00\x00\x00\x01\x00\x06\xe1\xdd\ +\x00\x00\x01v\xf3\x13\xd27\ +\x00\x000\x1a\x00\x00\x00\x00\x00\x01\x00\x06\xe3}\ +\x00\x00\x01v\xf3\x13\xd2,\ +\x00\x00/b\x00\x00\x00\x00\x00\x01\x00\x06\xe0s\ +\x00\x00\x01v\xf3\x13\xd2U\ +\x00\x00/\x84\x00\x00\x00\x00\x00\x01\x00\x06\xe1#\ +\x00\x00\x01v\xf3\x13\xd2W\ +\x00\x000D\x00\x00\x00\x00\x00\x01\x00\x06\xe4V\ +\x00\x00\x01v\xf3\x13\xd2]\ +\x00\x00/\xe0\x00\x00\x00\x00\x00\x01\x00\x06\xe2\xa0\ +\x00\x00\x01v\xf3\x13\xd2'\ +\x00\x00/8\x00\x00\x00\x00\x00\x01\x00\x06\xdf\xb0\ +\x00\x00\x01v\xf3\x13\xd21\ +\x00\x001\x80\x00\x00\x00\x00\x00\x01\x00\x07\x0a\xad\ +\x00\x00\x01v\xf3\x0e&\x12\ +\x00\x001d\x00\x00\x00\x00\x00\x01\x00\x07\x06\xca\ +\x00\x00\x01v\xf3\x0e&\x1d\ +\x00\x000r\x00\x00\x00\x00\x00\x01\x00\x06\xe4\xfd\ +\x00\x00\x01v\xf3\x0e&\x1a\ +\x00\x000\xac\x00\x00\x00\x00\x00\x01\x00\x06\xeb\xaf\ +\x00\x00\x01v\xf3\x0e&\x1a\ +\x00\x001\x9c\x00\x00\x00\x00\x00\x01\x00\x07\x0f\xc3\ +\x00\x00\x01v\xf3\x0e&\x04\ +\x00\x001\x1e\x00\x00\x00\x00\x00\x01\x00\x06\xfe \ +\x00\x00\x01v\xf3\x0e&\x0d\ +\x00\x000\xee\x00\x00\x00\x00\x00\x01\x00\x06\xf5\xbc\ +\x00\x00\x01v\xf3\x0e&\x0c\ +\x00\x000\xd6\x00\x00\x00\x00\x00\x01\x00\x06\xf1\xeb\ +\x00\x00\x01v\xf3\x0e&\x0b\ +\x00\x001\x06\x00\x00\x00\x00\x00\x01\x00\x06\xf9u\ +\x00\x00\x01v\xf3\x0e&\x19\ +\x00\x000\x8a\x00\x00\x00\x00\x00\x01\x00\x06\xe8\xb5\ +\x00\x00\x01v\xf3\x0e&\x03\ +\x00\x001B\x00\x00\x00\x00\x00\x01\x00\x07\x02\xef\ +\x00\x00\x01v\xf3\x0e&\x18\ +\x00\x00)J\x00\x00\x00\x00\x00\x01\x00\x06\x1d\xeb\ +\x00\x00\x01v\xf3\x13\xcf\xdb\ +\x00\x00)\xc6\x00\x00\x00\x00\x00\x01\x00\x06$'\ +\x00\x00\x01v\xf3\x13\xcf\xf1\ +\x00\x00*\x82\x00\x00\x00\x00\x00\x01\x00\x06*7\ +\x00\x00\x01v\xf3\x13\xd1\xf7\ +\x00\x00(\x9a\x00\x00\x00\x00\x00\x01\x00\x06\x10\x97\ +\x00\x00\x01v\xf3\x13\xd0\x14\ +\x00\x00\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x06\x1a\xf3\ +\x00\x00\x01v\xf3\x13\xd2\x0e\ +\x00\x00\x0f\xd4\x00\x00\x00\x00\x00\x01\x00\x06\x0e9\ +\x00\x00\x01v\xf3\x13\xd2Z\ +\x00\x00\x0eV\x00\x00\x00\x00\x00\x01\x00\x06\x158\ +\x00\x00\x01v\xf3\x13\xd2\x1c\ +\x00\x00+N\x00\x00\x00\x00\x00\x01\x00\x060\xf4\ +\x00\x00\x01v\xf3\x13\xcf\xfc\ +\x00\x00*H\x00\x00\x00\x00\x00\x01\x00\x06)\xc3\ +\x00\x00\x01v\xf3\x13\xd2d\ +\x00\x00)\x14\x00\x00\x00\x00\x00\x01\x00\x06\x1c9\ +\x00\x00\x01v\xf3\x13\xd08\ +\x00\x00(d\x00\x00\x00\x00\x00\x01\x00\x06\x0e\xe5\ +\x00\x00\x01v\xf3\x13\xd0H\ +\x00\x00)\x8a\x00\x00\x00\x00\x00\x01\x00\x06\x22\x99\ +\x00\x00\x01v\xf3\x13\xd0B\ +\x00\x00+\x88\x00\x00\x00\x00\x00\x01\x00\x065\x89\ +\x00\x00\x01v\xf3\x13\xd2\x1a\ +\x00\x00+\x0e\x00\x00\x00\x00\x00\x01\x00\x06,G\ +\x00\x00\x01v\xf3\x13\xcf\xec\ +\x00\x00(\xce\x00\x00\x00\x00\x00\x01\x00\x06\x16N\ +\x00\x00\x01v\xf3\x13\xd0\x0a\ +\x00\x00*\xc8\x00\x00\x00\x00\x00\x01\x00\x06+\x7f\ +\x00\x00\x01v\xf3\x13\xd23\ +\x00\x00((\x00\x00\x00\x00\x00\x01\x00\x06\x0c\xe5\ +\x00\x00\x01v\xf3\x13\xd1\xf9\ +\x00\x00*\x0c\x00\x00\x00\x00\x00\x01\x00\x06(\xd1\ +\x00\x00\x01v\xf3\x13\xd2\x22\ +\x00\x00\x18\x0e\x00\x00\x00\x00\x00\x01\x00\x07\xbdr\ +\x00\x00\x01v\xf3\x13\xceM\ +\x00\x00\x17\xd0\x00\x00\x00\x00\x00\x01\x00\x07\xb9,\ +\x00\x00\x01v\xf3\x13\xce<\ +\x00\x00\x13<\x00\x00\x00\x00\x00\x01\x00\x07Gn\ +\x00\x00\x01v\xf3\x13\xca\x22\ +\x00\x00\x18`\x00\x00\x00\x00\x00\x01\x00\x07\xc1F\ +\x00\x00\x01v\xf3\x13\xca\x17\ +\x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x07\x934\ +\x00\x00\x01v\xf3\x13\xc8\xdf\ +\x00\x00\x17R\x00\x00\x00\x00\x00\x01\x00\x07\xae\xde\ +\x00\x00\x01v\xf3\x13\xcef\ +\x00\x00\x14\x8a\x00\x00\x00\x00\x00\x01\x00\x07f\xef\ +\x00\x00\x01v\xf3\x13\xcfT\ +\x00\x00\x12\x98\x00\x00\x00\x00\x00\x01\x00\x072\xa5\ +\x00\x00\x01v\xf3\x13\xca$\ +\x00\x00\x17\x8a\x00\x00\x00\x00\x00\x01\x00\x07\xb4\x03\ +\x00\x00\x01v\xf3\x13\xce\x1b\ +\x00\x00\x14d\x00\x00\x00\x00\x00\x01\x00\x07bL\ +\x00\x00\x01v\xf3\x13\xca\x1b\ +\x00\x00\x13d\x00\x00\x00\x00\x00\x01\x00\x07K\xd9\ +\x00\x00\x01v\xf3\x13\xce\xc3\ +\x00\x00\x178\x00\x00\x00\x00\x00\x01\x00\x07\xach\ +\x00\x00\x01v\xf3\x13\xce+\ +\x00\x00\x12*\x00\x00\x00\x00\x00\x01\x00\x07'=\ +\x00\x00\x01v\xf3\x13\xca[\ +\x00\x00\x16\xc0\x00\x00\x00\x00\x00\x01\x00\x07\xa3z\ +\x00\x00\x01v\xf3\x13\xce!\ +\x00\x00\x12\x0c\x00\x00\x00\x00\x00\x01\x00\x07#W\ +\x00\x00\x01v\xf3\x13\xcaO\ +\x00\x00\x16\x04\x00\x00\x00\x00\x00\x01\x00\x07\x8b\x8e\ +\x00\x00\x01v\xf3\x13\xc7\xe4\ +\x00\x00\x13\x1e\x00\x00\x00\x00\x00\x01\x00\x07B\x05\ +\x00\x00\x01v\xf3\x13\xc9\x91\ +\x00\x00\x15H\x00\x00\x00\x00\x00\x01\x00\x07yz\ +\x00\x00\x01v\xf3\x13\xce\xd3\ +\x00\x00\x12\xb8\x00\x00\x00\x00\x00\x01\x00\x077$\ +\x00\x00\x01v\xf3\x13\xcaR\ +\x00\x00\x12z\x00\x00\x00\x00\x00\x01\x00\x07.\x90\ +\x00\x00\x01v\xf3\x13\xca:\ +\x00\x00\x15\xa6\x00\x00\x00\x00\x00\x01\x00\x07\x7f\xb7\ +\x00\x00\x01v\xf3\x13\xcaj\ +\x00\x00\x18J\x00\x00\x00\x00\x00\x01\x00\x07\xbfq\ +\x00\x00\x01v\xf3\x13\xceh\ +\x00\x00\x16\xd6\x00\x00\x00\x00\x00\x01\x00\x07\xa61\ +\x00\x00\x01v\xf3\x13\xcaP\ +\x00\x00\x14\xe4\x00\x00\x00\x00\x00\x01\x00\x07mz\ +\x00\x00\x01v\xf3\x13\xce:\ +\x00\x00\x16@\x00\x00\x00\x00\x00\x01\x00\x07\x94\xe1\ +\x00\x00\x01v\xf3\x13\xc7\xb1\ +\x00\x00\x14\x06\x00\x00\x00\x00\x00\x01\x00\x07YZ\ +\x00\x00\x01v\xf3\x13\xce'\ +\x00\x00\x19 \x00\x00\x00\x00\x00\x01\x00\x07\xd3\x7f\ +\x00\x00\x01v\xf3\x13\xcei\ +\x00\x00\x14\x1e\x00\x00\x00\x00\x00\x01\x00\x07[\xeb\ +\x00\x00\x01v\xf3\x13\xc7\xf2\ +\x00\x00\x12V\x00\x00\x00\x00\x00\x01\x00\x07*\x82\ +\x00\x00\x01v\xf3\x13\xca;\ +\x00\x00\x17\xf8\x00\x00\x00\x00\x00\x01\x00\x07\xbb\xe3\ +\x00\x00\x01v\xf3\x13\xce\xc6\ +\x00\x00\x12\xfe\x00\x00\x00\x00\x00\x01\x00\x07@g\ +\x00\x00\x01v\xf3\x13\xce\xc8\ +\x00\x00\x11\xf6\x00\x00\x00\x00\x00\x01\x00\x07\x22l\ +\x00\x00\x01v\xf3\x13\xce\xe9\ +\x00\x00\x13\xe8\x00\x00\x00\x00\x00\x01\x00\x07T\x10\ +\x00\x00\x01v\xf3\x13\xc9\xb7\ +\x00\x00\x16\x1a\x00\x00\x00\x00\x00\x01\x00\x07\x8fb\ +\x00\x00\x01v\xf3\x13\xcaE\ +\x00\x00\x11\xce\x00\x00\x00\x00\x00\x01\x00\x07\x1c\xa8\ +\x00\x00\x01v\xf3\x13\xc9N\ +\x00\x00\x15\x00\x00\x00\x00\x00\x00\x01\x00\x07p\x08\ +\x00\x00\x01v\xf3\x13\xcaA\ +\x00\x00\x19\x04\x00\x00\x00\x00\x00\x01\x00\x07\xd0\x5c\ +\x00\x00\x01v\xf3\x13\xca`\ +\x00\x00\x15^\x00\x00\x00\x00\x00\x01\x00\x07z\xee\ +\x00\x00\x01v\xf3\x13\xce\xe6\ +\x00\x00\x14\xca\x00\x00\x00\x00\x00\x01\x00\x07j\x9b\ +\x00\x00\x01v\xf3\x13\xcaf\ +\x00\x00\x18\xee\x00\x00\x00\x00\x00\x01\x00\x07\xcd\xad\ +\x00\x00\x01v\xf3\x13\xce.\ +\x00\x00\x16|\x00\x00\x00\x00\x00\x01\x00\x07\x9b\xfe\ +\x00\x00\x01v\xf3\x13\xc7\xb7\ +\x00\x00\x14\xae\x00\x00\x00\x00\x00\x01\x00\x07g\xb7\ +\x00\x00\x01v\xf3\x13\xcc<\ +\x00\x00\x16\x98\x00\x00\x00\x00\x00\x01\x00\x07\xa0$\ +\x00\x00\x01v\xf3\x13\xcaV\ +\x00\x00\x11\xb4\x00\x00\x00\x00\x00\x01\x00\x07\x18\xf7\ +\x00\x00\x01v\xf3\x13\xcaL\ +\x00\x00\x12\xca\x00\x00\x00\x00\x00\x01\x00\x07:}\ +\x00\x00\x01v\xf3\x13\xc9\x8e\ +\x00\x00\x18\xd4\x00\x00\x00\x00\x00\x01\x00\x07\xc9o\ +\x00\x00\x01v\xf3\x13\xca)\ +\x00\x00\x17\x0e\x00\x00\x00\x00\x00\x01\x00\x07\xa9\xba\ +\x00\x00\x01v\xf3\x13\xce$\ +\x00\x00\x13\xbc\x00\x00\x00\x00\x00\x01\x00\x07Q\xd7\ +\x00\x00\x01v\xf3\x13\xceH\ +\x00\x00\x18\xb6\x00\x00\x00\x00\x00\x01\x00\x07\xc6\xa7\ +\x00\x00\x01v\xf3\x13\xcai\ +\x00\x00\x17f\x00\x00\x00\x00\x00\x01\x00\x07\xb0\xcd\ +\x00\x00\x01v\xf3\x13\xcab\ +\x00\x00\x16d\x00\x00\x00\x00\x00\x01\x00\x07\x98\x97\ +\x00\x00\x01v\xf3\x13\xcaU\ +\x00\x00\x11Z\x00\x00\x00\x00\x00\x01\x00\x07\x13\xbf\ +\x00\x00\x01v\xf3\x13\xcee\ +\x00\x00\x15\x18\x00\x00\x00\x00\x00\x01\x00\x07s\xfe\ +\x00\x00\x01v\xf3\x13\xc9\x8a\ +\x00\x00\x15|\x00\x00\x00\x00\x00\x01\x00\x07|Q\ +\x00\x00\x01v\xf3\x13\xcaY\ +\x00\x00\x15\xc2\x00\x00\x00\x00\x00\x01\x00\x07\x82\x7f\ +\x00\x00\x01v\xf3\x13\xc9\xba\ +\x00\x00\x17\xb6\x00\x00\x00\x00\x00\x01\x00\x07\xb6\xc0\ +\x00\x00\x01v\xf3\x13\xce@\ +\x00\x00\x15\xea\x00\x00\x00\x00\x00\x01\x00\x07\x88\xac\ +\x00\x00\x01v\xf3\x13\xce\x11\ +\x00\x00\x13z\x00\x00\x00\x00\x00\x01\x00\x07M\xcc\ +\x00\x00\x01v\xf3\x13\xceB\ +\x00\x00\x148\x00\x00\x00\x00\x00\x01\x00\x07_1\ +\x00\x00\x01v\xf3\x13\xcad\ +\x00\x00\x11\x94\x00\x00\x00\x00\x00\x01\x00\x07\x15\xc4\ +\x00\x00\x01v\xf3\x13\xcaa\ +\x00\x00\x13\x94\x00\x00\x00\x00\x00\x01\x00\x07P\x19\ +\x00\x00\x01v\xf3\x13\xce\xc0\ +\x00\x00\x18\x0e\x00\x00\x00\x00\x00\x01\x00\x03\xf6\xeb\ +\x00\x00\x01v\xf3\x13\xc8\xad\ +\x00\x00\x17\xd0\x00\x00\x00\x00\x00\x01\x00\x03\xf2\xbd\ +\x00\x00\x01v\xf3\x13\xc8\x02\ +\x00\x00\x13<\x00\x00\x00\x00\x00\x01\x00\x03\x95\x16\ +\x00\x00\x01v\xf3\x13\xc7\xb9\ +\x00\x00\x18`\x00\x00\x00\x00\x00\x01\x00\x03\xfaG\ +\x00\x00\x01v\xf3\x13\xc7\xac\ +\x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x03\xd3\xdd\ +\x00\x00\x01v\xf3\x13\xce\xe4\ +\x00\x00\x17R\x00\x00\x00\x00\x00\x01\x00\x03\xe9\xdf\ +\x00\x00\x01v\xf3\x13\xc8\xa5\ +\x00\x00\x14\x8a\x00\x00\x00\x00\x00\x01\x00\x03\xaf\x99\ +\x00\x00\x01v\xf3\x13\xc9L\ +\x00\x00\x12\x98\x00\x00\x00\x00\x00\x01\x00\x03\x84d\ +\x00\x00\x01v\xf3\x13\xc7\xba\ +\x00\x00\x17\x8a\x00\x00\x00\x00\x00\x01\x00\x03\xee%\ +\x00\x00\x01v\xf3\x13\xce>\ +\x00\x00\x14d\x00\x00\x00\x00\x00\x01\x00\x03\xab\xb4\ +\x00\x00\x01v\xf3\x13\xcaM\ +\x00\x00\x13d\x00\x00\x00\x00\x00\x01\x00\x03\x98\xa8\ +\x00\x00\x01v\xf3\x13\xc8\xec\ +\x00\x00\x178\x00\x00\x00\x00\x00\x01\x00\x03\xe81\ +\x00\x00\x01v\xf3\x13\xce\xcd\ +\x00\x00\x12*\x00\x00\x00\x00\x00\x01\x00\x03z\xc0\ +\x00\x00\x01v\xf3\x13\xc7\xf6\ +\x00\x00\x16\xc0\x00\x00\x00\x00\x00\x01\x00\x03\xe1\x03\ +\x00\x00\x01v\xf3\x13\xcf\x15\ +\x00\x00\x12\x0c\x00\x00\x00\x00\x00\x01\x00\x03w\xa9\ +\x00\x00\x01v\xf3\x13\xcc?\ +\x00\x00\x16\x04\x00\x00\x00\x00\x00\x01\x00\x03\xcdK\ +\x00\x00\x01v\xf3\x13\xca\x5c\ +\x00\x00\x13\x1e\x00\x00\x00\x00\x00\x01\x00\x03\x90\x9d\ +\x00\x00\x01v\xf3\x13\xc7\xe0\ +\x00\x00\x15H\x00\x00\x00\x00\x00\x01\x00\x03\xbe,\ +\x00\x00\x01v\xf3\x13\xc9\x08\ +\x00\x00\x12\xb8\x00\x00\x00\x00\x00\x01\x00\x03\x88\x16\ +\x00\x00\x01v\xf3\x13\xce\x15\ +\x00\x00\x12z\x00\x00\x00\x00\x00\x01\x00\x03\x81\x0b\ +\x00\x00\x01v\xf3\x13\xc7\xee\ +\x00\x00\x15\xa6\x00\x00\x00\x00\x00\x01\x00\x03\xc3\x82\ +\x00\x00\x01v\xf3\x13\xceL\ +\x00\x00\x18J\x00\x00\x00\x00\x00\x01\x00\x03\xf8\x9c\ +\x00\x00\x01v\xf3\x13\xc8\xb4\ +\x00\x00\x16\xd6\x00\x00\x00\x00\x00\x01\x00\x03\xe3P\ +\x00\x00\x01v\xf3\x13\xc7\xfe\ +\x00\x00\x14\xe4\x00\x00\x00\x00\x00\x01\x00\x03\xb5\x18\ +\x00\x00\x01v\xf3\x13\xc8\x7f\ +\x00\x00\x16@\x00\x00\x00\x00\x00\x01\x00\x03\xd5P\ +\x00\x00\x01v\xf3\x13\xc7\xea\ +\x00\x00\x14\x06\x00\x00\x00\x00\x00\x01\x00\x03\xa4J\ +\x00\x00\x01v\xf3\x13\xc87\ +\x00\x00\x19 \x00\x00\x00\x00\x00\x01\x00\x04\x08\xef\ +\x00\x00\x01v\xf3\x13\xc8\xf5\ +\x00\x00\x14\x1e\x00\x00\x00\x00\x00\x01\x00\x03\xa6\xa1\ +\x00\x00\x01v\xf3\x13\xc8\x15\ +\x00\x00\x12V\x00\x00\x00\x00\x00\x01\x00\x03}\x9e\ +\x00\x00\x01v\xf3\x13\xcaS\ +\x00\x00\x17\xf8\x00\x00\x00\x00\x00\x01\x00\x03\xf5a\ +\x00\x00\x01v\xf3\x13\xc8\xf2\ +\x00\x00\x12\xfe\x00\x00\x00\x00\x00\x01\x00\x03\x8f=\ +\x00\x00\x01v\xf3\x13\xc9\x0a\ +\x00\x00\x11\xf6\x00\x00\x00\x00\x00\x01\x00\x03v\xd2\ +\x00\x00\x01v\xf3\x13\xc9A\ +\x00\x00\x13\xe8\x00\x00\x00\x00\x00\x01\x00\x03\xa0\x1f\ +\x00\x00\x01v\xf3\x13\xcaC\ +\x00\x00\x16\x1a\x00\x00\x00\x00\x00\x01\x00\x03\xd0\x88\ +\x00\x00\x01v\xf3\x13\xcaX\ +\x00\x00\x11\xce\x00\x00\x00\x00\x00\x01\x00\x03r\xbb\ +\x00\x00\x01v\xf3\x13\xc7\xb3\ +\x00\x00\x15\x00\x00\x00\x00\x00\x00\x01\x00\x03\xb7B\ +\x00\x00\x01v\xf3\x13\xc7\xf7\ +\x00\x00\x19\x04\x00\x00\x00\x00\x00\x01\x00\x04\x06f\ +\x00\x00\x01v\xf3\x13\xc8\x1a\ +\x00\x00\x15^\x00\x00\x00\x00\x00\x01\x00\x03\xbf\x95\ +\x00\x00\x01v\xf3\x13\xc9\x07\ +\x00\x00\x14\xca\x00\x00\x00\x00\x00\x01\x00\x03\xb2\xb9\ +\x00\x00\x01v\xf3\x13\xc8%\ +\x00\x00\x18\xee\x00\x00\x00\x00\x00\x01\x00\x04\x04\x1f\ +\x00\x00\x01v\xf3\x13\xc8\x87\ +\x00\x00\x16|\x00\x00\x00\x00\x00\x01\x00\x03\xda\xd6\ +\x00\x00\x01v\xf3\x13\xc7\xe6\ +\x00\x00\x14\xae\x00\x00\x00\x00\x00\x01\x00\x03\xb0\x5c\ +\x00\x00\x01v\xf3\x13\xc86\ +\x00\x00\x16\x98\x00\x00\x00\x00\x00\x01\x00\x03\xdeb\ +\x00\x00\x01v\xf3\x13\xc8\x19\ +\x00\x00\x11\xb4\x00\x00\x00\x00\x00\x01\x00\x03o\xa3\ +\x00\x00\x01v\xf3\x13\xcag\ +\x00\x00\x12\xca\x00\x00\x00\x00\x00\x01\x00\x03\x8b%\ +\x00\x00\x01v\xf3\x13\xc7\xce\ +\x00\x00\x18\xd4\x00\x00\x00\x00\x00\x01\x00\x04\x01\x1d\ +\x00\x00\x01v\xf3\x13\xc7\xfb\ +\x00\x00\x17\x0e\x00\x00\x00\x00\x00\x01\x00\x03\xe6\x06\ +\x00\x00\x01v\xf3\x13\xc8\x82\ +\x00\x00\x13\xbc\x00\x00\x00\x00\x00\x01\x00\x03\x9e%\ +\x00\x00\x01v\xf3\x13\xc8\x9e\ +\x00\x00\x18\xb6\x00\x00\x00\x00\x00\x01\x00\x03\xfe\x0e\ +\x00\x00\x01v\xf3\x13\xce\x18\ +\x00\x00\x17f\x00\x00\x00\x00\x00\x01\x00\x03\xeb\x9e\ +\x00\x00\x01v\xf3\x13\xc8\x12\ +\x00\x00\x16d\x00\x00\x00\x00\x00\x01\x00\x03\xd8\x9d\ +\x00\x00\x01v\xf3\x13\xc88\ +\x00\x00\x11Z\x00\x00\x00\x00\x00\x01\x00\x03ke\ +\x00\x00\x01v\xf3\x13\xc8\xe1\ +\x00\x00\x15\x18\x00\x00\x00\x00\x00\x01\x00\x03\xbab\ +\x00\x00\x01v\xf3\x13\xc7\xbb\ +\x00\x00\x15|\x00\x00\x00\x00\x00\x01\x00\x03\xc0\xe9\ +\x00\x00\x01v\xf3\x13\xc8\x06\ +\x00\x00\x15\xc2\x00\x00\x00\x00\x00\x01\x00\x03\xc5\xcf\ +\x00\x00\x01v\xf3\x13\xca'\ +\x00\x00\x17\xb6\x00\x00\x00\x00\x00\x01\x00\x03\xf0\x89\ +\x00\x00\x01v\xf3\x13\xceW\ +\x00\x00\x15\xea\x00\x00\x00\x00\x00\x01\x00\x03\xca0\ +\x00\x00\x01v\xf3\x13\xcae\ +\x00\x00\x13z\x00\x00\x00\x00\x00\x01\x00\x03\x9aS\ +\x00\x00\x01v\xf3\x13\xceU\ +\x00\x00\x148\x00\x00\x00\x00\x00\x01\x00\x03\xa9\x1f\ +\x00\x00\x01v\xf3\x13\xc8\x05\ +\x00\x00\x11\x94\x00\x00\x00\x00\x00\x01\x00\x03m\x1d\ +\x00\x00\x01v\xf3\x13\xc8\x1b\ +\x00\x00\x13\x94\x00\x00\x00\x00\x00\x01\x00\x03\x9c\x8e\ +\x00\x00\x01v\xf3\x13\xc8\xf0\ +\x00\x00\x18\x0e\x00\x00\x00\x00\x00\x01\x00\x06Zg\ +\x00\x00\x01v\xf3\x13\xc3\x84\ +\x00\x00,\x00\x00\x00\x00\x00\x00\x01\x00\x06gB\ +\x00\x00\x01v\xf3\x13\xc7\xae\ +\x00\x00+\xe0\x00\x00\x00\x00\x00\x01\x00\x06E\x9c\ +\x00\x00\x01v\xf3\x13\xc7\xf0\ +\x00\x00\x17\xd0\x00\x00\x00\x00\x00\x01\x00\x06u}\ +\x00\x00\x01v\xf3\x13\xc3|\ +\x00\x00\x13<\x00\x00\x00\x00\x00\x01\x00\x06\x88n\ +\x00\x00\x01v\xf3\x13\xc8\x01\ +\x00\x00\x18`\x00\x00\x00\x00\x00\x01\x00\x06\x8e\xa6\ +\x00\x00\x01v\xf3\x13\xc8\x08\ +\x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x06X\xfc\ +\x00\x00\x01v\xf3\x13\xc9\x05\ +\x00\x00\x17R\x00\x00\x00\x00\x00\x01\x00\x06N1\ +\x00\x00\x01v\xf3\x13\xc8\xdc\ +\x00\x00\x14\x8a\x00\x00\x00\x00\x00\x01\x00\x066\xa3\ +\x00\x00\x01v\xf3\x13\xc9D\ +\x00\x00\x12\x98\x00\x00\x00\x00\x00\x01\x00\x06=\xa0\ +\x00\x00\x01v\xf3\x13\xc7\xff\ +\x00\x00\x17\x8a\x00\x00\x00\x00\x00\x01\x00\x06sH\ +\x00\x00\x01v\xf3\x13\xc8L\ +\x00\x00\x14d\x00\x00\x00\x00\x00\x01\x00\x06\x93\xf7\ +\x00\x00\x01v\xf3\x13\xc8\x1f\ +\x00\x00\x13d\x00\x00\x00\x00\x00\x01\x00\x06\xac\x97\ +\x00\x00\x01v\xf3\x13\xc9C\ +\x00\x00\x178\x00\x00\x00\x00\x00\x01\x00\x06b\xcc\ +\x00\x00\x01v\xf3\x13\xc8\xf4\ +\x00\x00,*\x00\x00\x00\x00\x00\x01\x00\x06}7\ +\x00\x00\x01v\xf3\x13\xc7\xe2\ +\x00\x00\x12*\x00\x00\x00\x00\x00\x01\x00\x06\xa4>\ +\x00\x00\x01v\xf3\x13\xc8\x9f\ +\x00\x00\x16\xc0\x00\x00\x00\x00\x00\x01\x00\x06\xc1K\ +\x00\x00\x01v\xf3\x13\xc8\xa7\ +\x00\x00\x12\x0c\x00\x00\x00\x00\x00\x01\x00\x06\x99=\ +\x00\x00\x01v\xf3\x13\xc8!\ +\x00\x00\x16\x04\x00\x00\x00\x00\x00\x01\x00\x06\x8c\x12\ +\x00\x00\x01v\xf3\x13\xc8\x18\ +\x00\x00\x13\x1e\x00\x00\x00\x00\x00\x01\x00\x06\xc3-\ +\x00\x00\x01v\xf3\x13\xc7\xed\ +\x00\x00\x15H\x00\x00\x00\x00\x00\x01\x00\x06j\xf8\ +\x00\x00\x01v\xf3\x13\xc8\xf6\ +\x00\x00,\x88\x00\x00\x00\x00\x00\x01\x00\x06\xc6[\ +\x00\x00\x01v\xf3\x13\xc8\xdd\ +\x00\x00\x12\xb8\x00\x00\x00\x00\x00\x01\x00\x06\xa8B\ +\x00\x00\x01v\xf3\x13\xc8\x96\ +\x00\x00\x12z\x00\x00\x00\x00\x00\x01\x00\x069,\ +\x00\x00\x01v\xf3\x13\xc8\x85\ +\x00\x00\x15\xa6\x00\x00\x00\x00\x00\x01\x00\x06\xaf\xde\ +\x00\x00\x01v\xf3\x13\xc8\x95\ +\x00\x00\x18J\x00\x00\x00\x00\x00\x01\x00\x06\x9b\xa6\ +\x00\x00\x01v\xf3\x13\xc8\xee\ +\x00\x00\x16\xd6\x00\x00\x00\x00\x00\x01\x00\x06\xa6?\ +\x00\x00\x01v\xf3\x13\xc8\x9c\ +\x00\x00\x14\xe4\x00\x00\x00\x00\x00\x01\x00\x06[\xdc\ +\x00\x00\x01v\xf3\x13\xc8\xa2\ +\x00\x00\x16@\x00\x00\x00\x00\x00\x01\x00\x06\xaa`\ +\x00\x00\x01v\xf3\x13\xc8|\ +\x00\x00,h\x00\x00\x00\x00\x00\x01\x00\x06\xb8\xf0\ +\x00\x00\x01v\xf3\x13\xc9\x1d\ +\x00\x00\x14\x06\x00\x00\x00\x00\x00\x01\x00\x06\xbdd\ +\x00\x00\x01v\xf3\x13\xc8\x9b\ +\x00\x00\x19 \x00\x00\x00\x00\x00\x01\x00\x06e\xee\ +\x00\x00\x01v\xf3\x13\xc8\xf8\ +\x00\x00\x14\x1e\x00\x00\x00\x00\x00\x01\x00\x06\xad\xbb\ +\x00\x00\x01v\xf3\x13\xc8\x98\ +\x00\x00\x12V\x00\x00\x00\x00\x00\x01\x00\x06`8\ +\x00\x00\x01v\xf3\x13\xc8\x10\ +\x00\x00\x17\xf8\x00\x00\x00\x00\x00\x01\x00\x06UH\ +\x00\x00\x01v\xf3\x13\xc9\x1f\ +\x00\x00\x12\xfe\x00\x00\x00\x00\x00\x01\x00\x06\x8b\x19\ +\x00\x00\x01v\xf3\x13\xc9F\ +\x00\x00\x11\xf6\x00\x00\x00\x00\x00\x01\x00\x06\x98p\ +\x00\x00\x01v\xf3\x13\xc9\x1b\ +\x00\x00\x13\xe8\x00\x00\x00\x00\x00\x01\x00\x06H\xe2\ +\x00\x00\x01v\xf3\x13\xc7\xf4\ +\x00\x00+\xc4\x00\x00\x00\x00\x00\x01\x00\x06C\x8e\ +\x00\x00\x01v\xf3\x13\xc8\x99\ +\x00\x00\x16\x1a\x00\x00\x00\x00\x00\x01\x00\x06]\xa5\ +\x00\x00\x01v\xf3\x13\xc8\x13\ +\x00\x00\x11\xce\x00\x00\x00\x00\x00\x01\x00\x06\x9d7\ +\x00\x00\x01v\xf3\x13\xc7\xe8\ +\x00\x00\x15\x00\x00\x00\x00\x00\x00\x01\x00\x06\x91N\ +\x00\x00\x01v\xf3\x13\xc3l\ +\x00\x00\x19\x04\x00\x00\x00\x00\x00\x01\x00\x06;{\ +\x00\x00\x01v\xf3\x13\xc8\x8c\ +\x00\x00\x15^\x00\x00\x00\x00\x00\x01\x00\x06w\x8d\ +\x00\x00\x01v\xf3\x13\xc9\x1a\ +\x00\x00\x14\xca\x00\x00\x00\x00\x00\x01\x00\x06\x851\ +\x00\x00\x01v\xf3\x13\xc8\xa0\ +\x00\x00\x18\xee\x00\x00\x00\x00\x00\x01\x00\x06\xbfj\ +\x00\x00\x01v\xf3\x13\xc8\xa8\ +\x00\x00,F\x00\x00\x00\x00\x00\x01\x00\x06\x81\x0b\ +\x00\x00\x01v\xf3\x13\xc7\xb6\ +\x00\x00\x16|\x00\x00\x00\x00\x00\x01\x00\x06@\xc9\ +\x00\x00\x01v\xf3\x13\xc7\xf8\ +\x00\x00\x14\xae\x00\x00\x00\x00\x00\x01\x00\x06\xb4\x1d\ +\x00\x00\x01v\xf3\x13\xc8\xb0\ +\x00\x00\x16\x98\x00\x00\x00\x00\x00\x01\x00\x06\xa0\x94\ +\x00\x00\x01v\xf3\x13\xc3o\ +\x00\x00\x11\xb4\x00\x00\x00\x00\x00\x01\x00\x06V\x93\ +\x00\x00\x01v\xf3\x13\xc8 \ +\x00\x00\x12\xca\x00\x00\x00\x00\x00\x01\x00\x06\xb5\xd9\ +\x00\x00\x01v\xf3\x13\xc7\xfa\ +\x00\x00\x18\xd4\x00\x00\x00\x00\x00\x01\x00\x06x\xd1\ +\x00\x00\x01v\xf3\x13\xc3m\ +\x00\x00\x17\x0e\x00\x00\x00\x00\x00\x01\x00\x06\xbb\x9c\ +\x00\x00\x01v\xf3\x13\xc8\xab\ +\x00\x00\x13\xbc\x00\x00\x00\x00\x00\x01\x00\x06\xa2\x8b\ +\x00\x00\x01v\xf3\x13\xc3\x81\ +\x00\x00\x18\xb6\x00\x00\x00\x00\x00\x01\x00\x06lH\ +\x00\x00\x01v\xf3\x13\xc8\x17\ +\x00\x00\x17f\x00\x00\x00\x00\x00\x01\x00\x06L\x0b\ +\x00\x00\x01v\xf3\x13\xc8\x89\ +\x00\x00\x16d\x00\x00\x00\x00\x00\x01\x00\x067`\ +\x00\x00\x01v\xf3\x13\xc3z\ +\x00\x00\x11Z\x00\x00\x00\x00\x00\x01\x00\x06\xba-\ +\x00\x00\x01v\xf3\x13\xc7\xa7\ +\x00\x00\x15\x18\x00\x00\x00\x00\x00\x01\x00\x06pw\ +\x00\x00\x01v\xf3\x13\xc7\xfc\ +\x00\x00\x15|\x00\x00\x00\x00\x00\x01\x00\x06\x96`\ +\x00\x00\x01v\xf3\x13\xc3x\ +\x00\x00\x15\xc2\x00\x00\x00\x00\x00\x01\x00\x06O\xd0\ +\x00\x00\x01v\xf3\x13\xc7\xec\ +\x00\x00\x17\xb6\x00\x00\x00\x00\x00\x01\x00\x06dE\ +\x00\x00\x01v\xf3\x13\xc8\xb2\ +\x00\x00\x15\xea\x00\x00\x00\x00\x00\x01\x00\x06z\xd8\ +\x00\x00\x01v\xf3\x13\xc8$\ +\x00\x00\x13z\x00\x00\x00\x00\x00\x01\x00\x06n\xbd\ +\x00\x00\x01v\xf3\x13\xc8\xb1\ +\x00\x00\x148\x00\x00\x00\x00\x00\x01\x00\x06\xb1\xf8\ +\x00\x00\x01v\xf3\x13\xc8\x8f\ +\x00\x00\x11\x94\x00\x00\x00\x00\x00\x01\x00\x06S\x1d\ +\x00\x00\x01v\xf3\x13\xc8O\ +\x00\x00\x13\x94\x00\x00\x00\x00\x00\x01\x00\x06\x87\x1c\ +\x00\x00\x01v\xf3\x13\xc3\x82\ +\x00\x00\x1c>\x00\x00\x00\x00\x00\x01\x00\x04@X\ +\x00\x00\x01v\xf3\x0e%x\ +\x00\x00\x19\xc6\x00\x00\x00\x00\x00\x01\x00\x04\x15\x9a\ +\x00\x00\x01v\xf3\x0e%y\ +\x00\x00\x1d\xfe\x00\x00\x00\x00\x00\x01\x00\x04`\x84\ +\x00\x00\x01v\xf3\x0e%\x99\ +\x00\x00\x1b0\x00\x00\x00\x00\x00\x01\x00\x041\xf1\ +\x00\x00\x01v\xf3\x0e%\x87\ +\x00\x00\x1d\x1a\x00\x00\x00\x00\x00\x01\x00\x04O\xab\ +\x00\x00\x01v\xf3\x0e%\xa3\ +\x00\x00\x19|\x00\x00\x00\x00\x00\x01\x00\x04\x0dG\ +\x00\x00\x01v\xf3\x0e%\x90\ +\x00\x00\x1a<\x00\x00\x00\x00\x00\x01\x00\x04\x1e\xc5\ +\x00\x00\x01v\xf3\x0e%\x8d\ +\x00\x00\x1b\x12\x00\x02\x00\x00\x00\x06\x00\x00\x02X\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x01\x00\x04\x18\x9c\ +\x00\x00\x01v\xf3\x0e%\xa1\ +\x00\x00\x1a\x9c\x00\x00\x00\x00\x00\x01\x00\x04'\xbe\ +\x00\x00\x01v\xf3\x0e%Q\ +\x00\x00\x1c\x86\x00\x02\x00\x00\x00\x06\x00\x00\x02R\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x1c\xfa\x00\x00\x00\x00\x00\x01\x00\x04L}\ +\x00\x00\x01v\xf3\x0e%\x87\ +\x00\x00\x1d\xe8\x00\x00\x00\x00\x00\x01\x00\x04]R\ +\x00\x00\x01v\xf3\x0e%\x8f\ +\x00\x00\x1f`\x00\x00\x00\x00\x00\x01\x00\x04wM\ +\x00\x00\x01v\xf3\x0e%z\ +\x00\x00\x19@\x00\x00\x00\x00\x00\x01\x00\x04\x0ay\ +\x00\x00\x01v\xf3\x0e%\x86\ +\x00\x00\x1e\xe2\x00\x00\x00\x00\x00\x01\x00\x04l\x92\ +\x00\x00\x01v\xf3\x0e%\xa1\ +\x00\x00\x1b\xbe\x00\x00\x00\x00\x00\x01\x00\x04:\x96\ +\x00\x00\x01v\xf3\x0e%\x81\ +\x00\x00\x1er\x00\x00\x00\x00\x00\x01\x00\x04g\xc5\ +\x00\x00\x01v\xf3\x13\xd04\ +\x00\x00\x1d\xbe\x00\x00\x00\x00\x00\x01\x00\x04Y\xbd\ +\x00\x00\x01v\xf3\x0e%\x9a\ +\x00\x00\x1c\xbe\x00\x00\x00\x00\x00\x01\x00\x04I\xb1\ +\x00\x00\x01v\xf3\x0e%\x8b\ +\x00\x00\x1e\xce\x00\x02\x00\x00\x00\x02\x00\x00\x02P\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x1a\xb2\x00\x00\x00\x00\x00\x01\x00\x04*\x95\ +\x00\x00\x01v\xf3\x13\xd0\x11\ +\x00\x00\x1af\x00\x00\x00\x00\x00\x01\x00\x04#\xce\ +\x00\x00\x01v\xf3\x0e%\x8f\ +\x00\x00\x1dT\x00\x00\x00\x00\x00\x01\x00\x04R\xf0\ +\x00\x00\x01v\xf3\x0e%\xa2\ +\x00\x00\x1bZ\x00\x00\x00\x00\x00\x01\x00\x044\xbf\ +\x00\x00\x01v\xf3\x13\xd2*\ +\x00\x00\x03\xdc\x00\x00\x00\x00\x00\x01\x00\x047\xe1\ +\x00\x00\x01v\xf3\x0e%\x8a\ +\x00\x00\x1d\xaa\x00\x02\x00\x00\x00\x01\x00\x00\x02O\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x1b\x88\x00\x00\x00\x00\x00\x01\x00\x045\x92\ +\x00\x00\x01v\xf3\x0e%\x82\ +\x00\x00\x1e^\x00\x02\x00\x00\x00-\x00\x00\x02\x22\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x1f\x1a\x00\x00\x00\x00\x00\x01\x00\x04p\x97\ +\x00\x00\x01v\xf3\x0e%\x9a\ +\x00\x00\x1e&\x00\x00\x00\x00\x00\x01\x00\x04d\xf7\ +\x00\x00\x01v\xf3\x0e%\x89\ +\x00\x00\x1c\xa2\x00\x00\x00\x00\x00\x01\x00\x04E\xfd\ +\x00\x00\x01v\xf3\x0e%P\ +\x00\x00\x1e\xa4\x00\x00\x00\x00\x00\x01\x00\x04i\xc6\ +\x00\x00\x01v\xf3\x0e%\x8c\ +\x00\x00\x1c\x16\x00\x00\x00\x00\x00\x01\x00\x04=\xd6\ +\x00\x00\x01v\xf3\x0e%\x8a\ +\x00\x00\x1b\xe8\x00\x00\x00\x00\x00\x01\x00\x04=k\ +\x00\x00\x01v\xf3\x13\xd2h\ +\x00\x00\x19\x96\x00\x00\x00\x00\x00\x01\x00\x04\x13\x0e\ +\x00\x00\x01v\xf3\x0e%\xa0\ +\x00\x00\x1f0\x00\x00\x00\x00\x00\x01\x00\x04t\x9e\ +\x00\x00\x01v\xf3\x0e%\x9b\ +\x00\x00\x1a\xea\x00\x00\x00\x00\x00\x01\x00\x04.\x83\ +\x00\x00\x01v\xf3\x0e%\x8d\ +\x00\x00\x1b\xa8\x00\x02\x00\x00\x00\x09\x00\x00\x02\x19\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x1cX\x00\x00\x00\x00\x00\x01\x00\x04B\xc4\ +\x00\x00\x01v\xf3\x0e%\xa4\ +\x00\x00\x1d\x80\x00\x00\x00\x00\x00\x01\x00\x04V\xe9\ +\x00\x00\x01v\xf3\x0e%\x8e\ +\x00\x00':\x00\x00\x00\x00\x00\x01\x00\x05\xe3\xe3\ +\x00\x00\x01v\xf3\x0e%{\ +\x00\x00'\xc0\x00\x00\x00\x00\x00\x01\x00\x05\xf1\x11\ +\x00\x00\x01v\xf3\x0e%\x81\ +\x00\x00'Z\x00\x00\x00\x00\x00\x01\x00\x05\xe7B\ +\x00\x00\x01v\xf3\x0e%\x7f\ +\x00\x00&\xf8\x00\x00\x00\x00\x00\x01\x00\x05\xdcF\ +\x00\x00\x01v\xf3\x0e%~\ +\x00\x00'\xac\x00\x00\x00\x00\x00\x01\x00\x05\xed\xb2\ +\x00\x00\x01v\xf3\x0e%|\ +\x00\x00&\xd2\x00\x00\x00\x00\x00\x01\x00\x05\xd8\xc2\ +\x00\x00\x01v\xf3\x0e%{\ +\x00\x00'\x16\x00\x00\x00\x00\x00\x01\x00\x05\xe0C\ +\x00\x00\x01v\xf3\x0e%}\ +\x00\x00'\x9a\x00\x00\x00\x00\x00\x01\x00\x05\xea(\ +\x00\x00\x01v\xf3\x0e%~\ +\x00\x00'\xee\x00\x00\x00\x00\x00\x01\x00\x05\xf3\xf7\ +\x00\x00\x01v\xf3\x0e%\x80\ +\x00\x00#\xa6\x00\x00\x00\x00\x00\x01\x00\x05U\xbe\ +\x00\x00\x01v\xf3\x0e%\xaa\ +\x00\x00#(\x00\x00\x00\x00\x00\x01\x00\x055!\ +\x00\x00\x01v\xf3\x0e%\xb7\ +\x00\x00#P\x00\x00\x00\x00\x00\x01\x00\x05;\x15\ +\x00\x00\x01v\xf3\x0e%\xcd\ +\x00\x00\x22\xb8\x00\x00\x00\x00\x00\x01\x00\x05\x19\xd0\ +\x00\x00\x01v\xf3\x0e%\xc0\ +\x00\x00!p\x00\x00\x00\x00\x00\x01\x00\x04\xe2\xb3\ +\x00\x00\x01v\xf3\x0e%\xc1\ +\x00\x00 n\x00\x00\x00\x00\x00\x01\x00\x04\x9aW\ +\x00\x00\x01v\xf3\x0e%\xc7\ +\x00\x00$,\x00\x00\x00\x00\x00\x01\x00\x05g\x84\ +\x00\x00\x01v\xf3\x0e%\xbc\ +\x00\x00\x22\xcc\x00\x00\x00\x00\x00\x01\x00\x05%y\ +\x00\x00\x01v\xf3\x0e%\xd1\ +\x00\x00\x22\x94\x00\x00\x00\x00\x00\x01\x00\x05\x156\ +\x00\x00\x01v\xf3\x0e%\xbb\ +\x00\x00%>\x00\x00\x00\x00\x00\x01\x00\x05\xb2\xea\ +\x00\x00\x01v\xf3\x0e%\xc7\ +\x00\x00\x22\x02\x00\x00\x00\x00\x00\x01\x00\x04\xfd\xd0\ +\x00\x00\x01v\xf3\x0e%\xbb\ +\x00\x00\x22\x1c\x00\x00\x00\x00\x00\x01\x00\x05\x00\x92\ +\x00\x00\x01v\xf3\x0e%\xd7\ +\x00\x00$\xaa\x00\x00\x00\x00\x00\x01\x00\x05\x84#\ +\x00\x00\x01v\xf3\x0e%\xd4\ +\x00\x00% \x00\x00\x00\x00\x00\x01\x00\x05\xa6\xf9\ +\x00\x00\x01v\xf3\x0e%\xc3\ +\x00\x00!\x10\x00\x00\x00\x00\x00\x01\x00\x04\xd4\x85\ +\x00\x00\x01v\xf3\x0e%\xc1\ +\x00\x00\x1f\xf0\x00\x00\x00\x00\x00\x01\x00\x04\x89\xe6\ +\x00\x00\x01v\xf3\x0e%\xc1\ +\x00\x00#\xe2\x00\x00\x00\x00\x00\x01\x00\x05X\xd8\ +\x00\x00\x01v\xf3\x0e%\xc4\ +\x00\x00\x222\x00\x00\x00\x00\x00\x01\x00\x05\x06/\ +\x00\x00\x01v\xf3\x0e%\xc5\ +\x00\x00 \xac\x00\x00\x00\x00\x00\x01\x00\x04\xa1E\ +\x00\x00\x01v\xf3\x0e%\xce\ +\x00\x00 \x0e\x00\x00\x00\x00\x00\x01\x00\x04\x8f~\ +\x00\x00\x01v\xf3\x0e%\xca\ +\x00\x00$\xc8\x00\x00\x00\x00\x00\x01\x00\x05\x88\x03\ +\x00\x00\x01v\xf3\x0e%\xd5\ +\x00\x00#\x12\x00\x00\x00\x00\x00\x01\x00\x05/L\ +\x00\x00\x01v\xf3\x0e%\xca\ +\x00\x00$\x94\x00\x00\x00\x00\x00\x01\x00\x05\x80h\ +\x00\x00\x01v\xf3\x0e%\xbe\ +\x00\x00\x1f\xd2\x00\x00\x00\x00\x00\x01\x00\x04\x80\xb1\ +\x00\x00\x01v\xf3\x0e%\xd4\ +\x00\x00$l\x00\x00\x00\x00\x00\x01\x00\x05t\x85\ +\x00\x00\x01v\xf3\x0e%\xc6\ +\x00\x00!\xb2\x00\x00\x00\x00\x00\x01\x00\x04\xf2:\ +\x00\x00\x01v\xf3\x0e%\xcf\ +\x00\x00 \xc8\x00\x00\x00\x00\x00\x01\x00\x04\xa4C\ +\x00\x00\x01v\xf3\x0e%\xb8\ +\x00\x00 \x92\x00\x00\x00\x00\x00\x01\x00\x04\x9e\x89\ +\x00\x00\x01v\xf3\x0e%\xcc\ +\x00\x00$\x16\x00\x00\x00\x00\x00\x01\x00\x05b\x01\ +\x00\x00\x01v\xf3\x0e%\xc9\ +\x00\x00 R\x00\x00\x00\x00\x00\x01\x00\x04\x95\x11\ +\x00\x00\x01v\xf3\x0e%\xc4\ +\x00\x00$\xec\x00\x00\x00\x00\x00\x01\x00\x05\x8c\xf4\ +\x00\x00\x01v\xf3\x0e%\xca\ +\x00\x00!P\x00\x00\x00\x00\x00\x01\x00\x04\xdcK\ +\x00\x00\x01v\xf3\x0e%\xba\ +\x00\x00\x22j\x00\x00\x00\x00\x00\x01\x00\x05\x10\xd4\ +\x00\x00\x01v\xf3\x0e%\xcc\ +\x00\x00%n\x00\x00\x00\x00\x00\x01\x00\x05\xb7\xff\ +\x00\x00\x01v\xf3\x0e%\xaa\ +\x00\x00#\xf8\x00\x00\x00\x00\x00\x01\x00\x05]\xef\ +\x00\x00\x01v\xf3\x0e%\xd1\ +\x00\x00!\xea\x00\x00\x00\x00\x00\x01\x00\x04\xf8\xd9\ +\x00\x00\x01v\xf3\x0e%\xb7\ +\x00\x00 \xe0\x00\x00\x00\x00\x00\x01\x00\x04\xb3\xa9\ +\x00\x00\x01v\xf3\x0e%\xbe\ +\x00\x00!&\x00\x00\x00\x00\x00\x01\x00\x04\xd8\x15\ +\x00\x00\x01v\xf3\x0e%\xbd\ +\x00\x00!\x8a\x00\x00\x00\x00\x00\x01\x00\x04\xe5\x99\ +\x00\x00\x01v\xf3\x0e%\xd6\ +\x00\x00\x22\xf8\x00\x00\x00\x00\x00\x01\x00\x05,\xd0\ +\x00\x00\x01v\xf3\x0e%\xd3\ +\x00\x00!\xd0\x00\x00\x00\x00\x00\x01\x00\x04\xf61\ +\x00\x00\x01v\xf3\x0e%\xd1\ +\x00\x00%T\x00\x00\x00\x00\x00\x01\x00\x05\xb5\x8a\ +\x00\x00\x01v\xf3\x0e%\xd2\ +\x00\x00 &\x00\x01\x00\x00\x00\x01\x00\x04\x92\xd7\ +\x00\x00\x01v\xf3\x0e%\xcf\ +\x00\x00$L\x00\x00\x00\x00\x00\x01\x00\x05o\x96\ +\x00\x00\x01v\xf3\x0e%\xcf\ +\x00\x00%\x9a\x00\x00\x00\x00\x00\x01\x00\x05\xbe*\ +\x00\x00\x01v\xf3\x0e%\xb9\ +\x00\x00%\xc2\x00\x00\x00\x00\x00\x01\x00\x05\xc4v\ +\x00\x00\x01v\xf3\x0e%\x88\ +\x00\x00\x1f\xae\x00\x00\x00\x00\x00\x01\x00\x04~\xb0\ +\x00\x00\x01v\xf3\x13\xd03\ +\x00\x00\x1f\x84\x00\x00\x00\x00\x00\x01\x00\x04z\xba\ +\x00\x00\x01v\xf3\x13\xd0\x0c\ +\x00\x00%\xe2\x00\x00\x00\x00\x00\x01\x00\x05\xc8\xee\ +\x00\x00\x01v\xf3\x0e%\x93\ +\x00\x00&\xaa\x00\x00\x00\x00\x00\x01\x00\x05\xd6/\ +\x00\x00\x01v\xf3\x0e%\x92\ +\x00\x00&L\x00\x00\x00\x00\x00\x01\x00\x05\xd0\x9e\ +\x00\x00\x01v\xf3\x0e%\x94\ +\x00\x00%\xfe\x00\x00\x00\x00\x00\x01\x00\x05\xcb\xa1\ +\x00\x00\x01v\xf3\x0e%\x95\ +\x00\x00&x\x00\x00\x00\x00\x00\x01\x00\x05\xd3=\ +\x00\x00\x01v\xf3\x0e%\x93\ +\x00\x00&\x1e\x00\x00\x00\x00\x00\x01\x00\x05\xce\x0f\ +\x00\x00\x01v\xf3\x0e%\x91\ +\x00\x00%\xe2\x00\x00\x00\x00\x00\x01\x00\x05\xf7\xd3\ +\x00\x00\x01v\xf3\x0e%\xa6\ +\x00\x00&\xaa\x00\x00\x00\x00\x00\x01\x00\x06\x09-\ +\x00\x00\x01v\xf3\x0e%\xa5\ +\x00\x00&L\x00\x00\x00\x00\x00\x01\x00\x06\x01\xfc\ +\x00\x00\x01v\xf3\x0e%\xa8\ +\x00\x00%\xfe\x00\x00\x00\x00\x00\x01\x00\x05\xfb$\ +\x00\x00\x01v\xf3\x0e%\xa9\ +\x00\x00&x\x00\x00\x00\x00\x00\x01\x00\x06\x05\xa7\ +\x00\x00\x01v\xf3\x0e%\xa7\ +\x00\x00&\x1e\x00\x00\x00\x00\x00\x01\x00\x05\xfe\x95\ +\x00\x00\x01v\xf3\x0e%\xa5\ +\x00\x00\x02\x94\x00\x02\x00\x00\x00\x01\x00\x00\x02_\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x0e\x86\x00\x02\x00\x00\x00\x01\x00\x00\x02`\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x8a\x00\x02\x00\x00\x00'\x00\x00\x02a\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00B \x00\x00\x00\x00\x00\x01\x00\x0a]\x0a\ +\x00\x00\x01v\xf3\x13\xce\xc9\ +\x00\x00?\xe0\x00\x00\x00\x00\x00\x01\x00\x09:\x1e\ +\x00\x00\x01v\xf3\x13\xd0 \ +\x00\x001d\x00\x00\x00\x00\x00\x01\x00\x09\x15\x5c\ +\x00\x00\x01v\xf3\x0e%I\ +\x00\x00?\x18\x00\x00\x00\x00\x00\x01\x00\x09(7\ +\x00\x00\x01v\xf3\x13\xcf\xdf\ +\x00\x00AL\x00\x00\x00\x00\x00\x01\x00\x0aQ\x1b\ +\x00\x00\x01v\xf3\x13\xcf\x98\ +\x00\x00@ \x00\x00\x00\x00\x00\x01\x00\x09A\x80\ +\x00\x00\x01v\xf3\x13\xc9\x95\ +\x00\x00@f\x00\x00\x00\x00\x00\x01\x00\x0a>m\ +\x00\x00\x01v\xf3\x13\xca,\ +\x00\x00?h\x00\x00\x00\x00\x00\x01\x00\x09.v\ +\x00\x00\x01v\xf3\x0e%=\ +\x00\x00>n\x00\x00\x00\x00\x00\x01\x00\x09\x1d\x1c\ +\x00\x00\x01v\xf3\x0e%1\ +\x00\x00=\xb6\x00\x00\x00\x00\x00\x01\x00\x08\xf65\ +\x00\x00\x01v\xf3\x13\xcf\xa8\ +\x00\x00@\x84\x00\x00\x00\x00\x00\x01\x00\x0aB\xb3\ +\x00\x00\x01v\xf3\x13\xce\xe7\ +\x00\x00?\xfc\x00\x00\x00\x00\x00\x01\x00\x09<\xad\ +\x00\x00\x01v\xf3\x13\xcf\xe5\ +\x00\x00>\x0e\x00\x00\x00\x00\x00\x01\x00\x08\xfe\x92\ +\x00\x00\x01v\xf3\x13\xcf\xab\ +\x00\x00,\xb8\x00\x00\x00\x00\x00\x01\x00\x0aN\xe8\ +\x00\x00\x01v\xf3\x13\xce\xcf\ +\x00\x00=j\x00\x00\x00\x00\x00\x01\x00\x08\xf2\xd4\ +\x00\x00\x01v\xf3\x13\xce\xf5\ +\x00\x00=\x94\x00\x00\x00\x00\x00\x01\x00\x08\xf3\xa5\ +\x00\x00\x01v\xf3\x0e%0\ +\x00\x00\x0b\xe0\x00\x00\x00\x00\x00\x01\x00\x0aL\xd3\ +\x00\x00\x01v\xf3\x13\xceX\ +\x00\x00?\x86\x00\x00\x00\x00\x00\x01\x00\x093)\ +\x00\x00\x01v\xf3\x13\xd0<\ +\x00\x00?\xaa\x00\x00\x00\x00\x00\x01\x00\x094\xf5\ +\x00\x00\x01v\xf3\x13\xca<\ +\x00\x00@L\x00\x00\x00\x00\x00\x01\x00\x0a=\xd1\ +\x00\x00\x01v\xf3\x13\xd2j\ +\x00\x00Ar\x00\x00\x00\x00\x00\x01\x00\x0aQ\xa8\ +\x00\x00\x01v\xf3\x13\xcf\xf3\ +\x00\x00@\xd6\x00\x00\x00\x00\x00\x01\x00\x0aF7\ +\x00\x00\x01v\xf3\x0e%/\ +\x00\x00?H\x00\x00\x00\x00\x00\x01\x00\x09-\x90\ +\x00\x00\x01v\xf3\x13\xcf\x13\ +\x00\x00>2\x00\x01\x00\x00\x00\x01\x00\x09\x0b:\ +\x00\x00\x01v\xf3\x13\xca\x1e\ +\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x01\x00\x09\x0ep\ +\x00\x00\x01v\xf3\x0e%:\ +\x00\x00?\xca\x00\x00\x00\x00\x00\x01\x00\x098\xef\ +\x00\x00\x01v\xf3\x13\xcf\x17\ +\x00\x00A\x0a\x00\x00\x00\x00\x00\x01\x00\x0aH\xd8\ +\x00\x00\x01v\xf3\x13\xcaG\ +\x00\x00A\xfc\x00\x00\x00\x00\x00\x01\x00\x0aZ|\ +\x00\x00\x01v\xf3\x0e%1\ +\x00\x00BD\x00\x00\x00\x00\x00\x01\x00\x0a^\x85\ +\x00\x00\x01v\xf3\x13\xce\xea\ +\x00\x00=H\x00\x00\x00\x00\x00\x01\x00\x08\xee+\ +\x00\x00\x01v\xf3\x13\xc9\xbc\ +\x00\x00>\xcc\x00\x00\x00\x00\x00\x01\x00\x09\x22]\ +\x00\x00\x01v\xf3\x13\xcel\ +\x00\x00A\xaa\x00\x00\x00\x00\x00\x01\x00\x0aU\xfb\ +\x00\x00\x01v\xf3\x13\xceD\ +\x00\x00>\xa4\x00\x00\x00\x00\x00\x01\x00\x09\x1f\xbb\ +\x00\x00\x01v\xf3\x13\xce6\ +\x00\x00@\xa6\x00\x00\x00\x00\x00\x01\x00\x0aC\xa4\ +\x00\x00\x01v\xf3\x13\xce1\ +\x00\x00>\xfe\x00\x00\x00\x00\x00\x01\x00\x09$;\ +\x00\x00\x01v\xf3\x13\xca1\ +\x00\x00=\xd8\x00\x00\x00\x00\x00\x01\x00\x08\xf6\xb2\ +\x00\x00\x01v\xf3\x0e%7\ +\x00\x00A\xda\x00\x00\x00\x00\x00\x01\x00\x0aXI\ +\x00\x00\x01v\xf3\x13\xceJ\ +\x00\x00A,\x00\x00\x00\x00\x00\x01\x00\x0aPr\ +\x00\x00\x01v\xf3\x13\xcf\x96\ +\x00\x00>L\x00\x00\x00\x00\x00\x01\x00\x09\x0c\x92\ +\x00\x00\x01v\xf3\x13\xcen\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/base_style_sheet.qss b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/base_style_sheet.qss new file mode 100644 index 0000000000..c23c3d90bd --- /dev/null +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/base_style_sheet.qss @@ -0,0 +1,370 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +* +{ + background-color: transparent; + color: white; + font-family: "Open Sans"; + font-size: 12px; +} + +QMainWindow, +QDialog, +QDockWidget +{ + color: #cccccc; + background-color: #444444; +} + +QLineEdit, +QComboBox +{ + background-color: #CCCCCC; + color: black; + font-family: "Open Sans"; + border-radius: 2px; + border-width: 0px; + border-color: #e9e9e9; + font-size: 12px; + line-height: 16px; +} + +QToolTip +{ + color: black; +} + +QFrame#SeparatorLine +{ + color: #2d2d2d; +} + +/* QComboBox */ +QComboBox +{ + height: 16px; + padding-left: 4px; + margin: 1px; + font-size: 12px; + background-color: #CCCCCC; +} + +QComboBox:hover +{ + margin: 0px; + border-width: 1px; + border-style: solid; + border-radius: 3px; + border-color: rgba(0, 0, 0, 50); +} + +QComboBox:disabled +{ + background-color: #666666; + color: #999999; +} + +QComboBox::drop-down +{ + border-width: 0; +} + +QComboBox::down-arrow +{ + width: 16px; + height: 16px; + margin-right: 4px; + image: url(":/stylesheet/img/UI20/combobox-arrow.svg"); +} + +/* Popup */ +QComboBox QAbstractItemView +{ + background-color: #222222; + padding: 0px; + outline: none; /* Disable focus rect */ + show-decoration-selected: 1; +} + +QComboBox QAbstractItemView::item +{ + color: #FFFFFF; +} + +QComboBox QAbstractItemView::item:selected +{ + background-color: #444444; +} + +QComboBox QAbstractItemView::item:disabled +{ + color: #555555; +} + +/* QPushButton */ +QPushButton +{ + border: 1px solid #3D000000; + border-radius: 4px; + color: #ffffff; + font-family: "Open Sans"; + font-size: 12px; +} + +QPushButton:hover, +QPushButton:pressed +{ + color: #FFFFFF; +} + +QPushButton:disabled +{ + border: 1px solid #3D000000; + color: #999999; +} + +QPushButton#Primary +{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #0095F2, stop:1 #0073BB); +} + +QPushButton#Primary:hover +{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #44BAFF, stop:1 #4AB2F8); + border: 1px solid #00A1C9; +} + +QPushButton#Primary:pressed +{ + background-color: #0073BB; + border: 1px solid #00A1C9; +} + +QPushButton#Primary:disabled +{ + background-color: #7092A7; +} + +QPushButton#Secondary +{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #777777, stop:1 #666666); +} + +QPushButton#Secondary:hover +{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #888888, stop:1 #777777); + border: 1px solid #FFFFFF; +} + +QPushButton#Secondary:pressed +{ + background-color: #444444; + border: 1px solid #FFFFFF; +} + +QPushButton#Secondary:disabled +{ + background-color: #666666; +} + +QPushButton:flat +{ + border: none; + background-color: transparent; +} + +/* QTableView & QTreeView */ +QTableView +{ + qproperty-showGrid: false; +} + +QTableView, +QTreeView +{ + alternate-background-color: rgb(77, 77, 77); + background-color: transparent; + selection-background-color: rgb(101, 101, 101); + selection-color: #ffffff; + show-decoration-selected: 1; + border: 1px solid #10ffffff; +} + +QTableView QHeaderView::down-arrow, +QTreeView QHeaderView::down-arrow +{ + width: 12px; + height: 12px; + margin-right: 4px; + image: url(":/stylesheet/img/indicator-arrow-down.svg"); +} + +QTableView QHeaderView::up-arrow, +QTreeView QHeaderView::up-arrow +{ + margin-right: 4px; + image: url(":/stylesheet/img/indicator-arrow-up.svg"); +} + +QTableView::item, +QTreeView::item +{ + height: 24px; + border: none; + margin: 4px; +} + +QTableView::item:selected, +QTreeView::branch:selected, +QTreeView::item:selected +{ + background: rgb(101, 101, 101); +} + +QTableView::item:hover, +QTreeView::branch:hover, +QTreeView::item:hover +{ + background: rgb(90, 90, 90); +} + +QTableView QHeaderView::section, +QTreeView QHeaderView::section +{ + height: 24px; + + background: #2d2d2d; + border: none; + + font-size: 13px; + font-style: normal; + + padding-left: 7px; +} + +QTableView QHeaderView::section::first, +QTreeView QHeaderView::section::first +{ + border-right: 0.5px solid white; +} + +QTableView QHeaderView::section::last, +QTreeView QHeaderView::section::last +{ + border-left: 0.5px solid white; +} + +QTableView QHeaderView::section::middle, +QTreeView QHeaderView::section::middle +{ + border-right: 0.5px solid white; + border-left: 0.5px solid white; +} + +QTreeView::indicator +{ + margin: 0px; + width: 16px; + height: 16px; + margin-left: -3px; +} + +QTreeView::branch:open:has-children +{ + image: url(:/TreeView/open.svg); + padding: 10px 4px; +} + +QTreeView::branch:closed:has-children +{ + image: url(:/TreeView/closed.svg); + padding: 8px 6px; +} + +/* QScrollBar */ +QScrollBar +{ + border: 2px solid rgba(50, 50, 50, 70%); + background: none; + margin: 0px; +} + +QScrollBar:vertical +{ + width: 8px; +} + +QScrollBar:horizontal +{ + height: 8px; +} + +QScrollBar::handle +{ + border: 0px solid #000000; + border-radius: 2px; + background-color: rgba(136, 136, 136, 64%); +} + +QScrollBar::handle:vertical { + min-height: 32px; +} + +QScrollBar::handle:horizontal { + min-width: 32px; +} + +QScrollBar::add-line, +QScrollBar::sub-line +{ + border: none; + background: none; + color: none; +} + +QScrollBar::add-line:horizontal, +QScrollBar::sub-line:horizontal +{ + width: 0px; +} + +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical +{ + height: 0px; +} + +/* scrollbar hovered */ + +QScrollBar:hover +{ + border: 1px solid rgba(136, 136, 136, 64%); + background-color: rgba(255, 255, 255, 12%); + margin: 0px; +} + +QScrollBar::handle:hover +{ + border-radius: 3px; + background-color: #999999; +} + +/* NotificationFrame */ +QFrame#NotificationFrame +{ + background-color: transparent; + border: 1px solid #E57829; + border-radius: 2px; + margin: 4px; + padding: 4px; +} diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py index 740cd5b274..5442ef87a7 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py @@ -14,7 +14,7 @@ from unittest import TestCase from unittest.mock import (call, MagicMock, patch) from controller.view_edit_controller import ViewEditController -from model import constants +from model import (constants, notification_label_text) from model.basic_resource_attributes import (BasicResourceAttributes, BasicResourceAttributesBuilder,) from model.resource_mapping_attributes import (ResourceMappingAttributes, ResourceMappingAttributesStatus) from view.view_edit_page import ViewEditPageConstants @@ -77,8 +77,6 @@ class TestViewEditController(TestCase): assert actual_resource.region == self._expected_resource.region def test_setup_with_expected_state_and_behavior_connected(self) -> None: - self._mocked_view_edit_page.set_notification_page_text.assert_called_once_with( - ViewEditPageConstants.NOTIFICATION_SELECT_CONFIG_FILE_TEXT) self._mocked_view_edit_page.set_current_main_view_index.assert_called_once_with( ViewEditPageConstants.NOTIFICATION_PAGE_INDEX) self._mocked_view_edit_page.set_config_files.assert_called_once_with( @@ -102,9 +100,9 @@ class TestViewEditController(TestCase): self._test_view_edit_controller._filter_based_on_search_text) self._mocked_view_edit_page.cancel_button.clicked.connect.assert_called_once_with( self._test_view_edit_controller._cancel) - self._mocked_view_edit_page.notification_prompt_create_new_button.clicked.connect.assert_called_once_with( + self._mocked_view_edit_page.create_new_button.clicked.connect.assert_called_once_with( self._test_view_edit_controller._create_new_config_file) - self._mocked_view_edit_page.notification_prompt_rescan_button.clicked.connect.assert_called_once_with( + self._mocked_view_edit_page.rescan_button.clicked.connect.assert_called_once_with( self._test_view_edit_controller._rescan_config_directory) def test_page_config_file_combobox_nothing_happen_when_index_is_default_value(self) -> None: @@ -278,7 +276,7 @@ class TestViewEditController(TestCase): mocked_call_args[0]() # triggering config_location_button connected function mock_file_dialog.getExistingDirectory.assert_called_once() self._mocked_view_edit_page.set_notification_page_text.assert_called_with( - ViewEditPageConstants.NOTIFICATION_LOADING_TEXT) + notification_label_text.NOTIFICATION_LOADING_MESSAGE) self._mocked_view_edit_page.set_current_main_view_index.assert_called_with( ViewEditPageConstants.NOTIFICATION_PAGE_INDEX) self._mocked_table_view.reset_view.assert_called_once() @@ -305,8 +303,8 @@ class TestViewEditController(TestCase): expected_new_config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) assert self._mocked_configuration_manager.configuration.config_files == [] self._mocked_view_edit_page.set_config_files.assert_called_with([]) - self._mocked_view_edit_page.set_notification_page_text.assert_called_with( - ViewEditPageConstants.NOTIFICATION_SELECT_CONFIG_FILE_TEXT) + self._mocked_view_edit_page.set_notification_page_text.assert_called_once_with( + notification_label_text.NOTIFICATION_LOADING_MESSAGE) @patch("controller.view_edit_controller.ThreadManager") @patch("controller.view_edit_controller.QFileDialog") @@ -327,8 +325,8 @@ class TestViewEditController(TestCase): expected_new_config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) assert self._mocked_configuration_manager.configuration.config_files == [] self._mocked_view_edit_page.set_config_files.assert_called_with([]) - self._mocked_view_edit_page.set_notification_page_text.assert_called_with( - ViewEditPageConstants.NOTIFICATION_SELECT_CONFIG_FILE_TEXT) + self._mocked_view_edit_page.set_notification_page_text.assert_called_once_with( + notification_label_text.NOTIFICATION_LOADING_MESSAGE) @patch("controller.view_edit_controller.ThreadManager") @patch("controller.view_edit_controller.QFileDialog") @@ -350,8 +348,8 @@ class TestViewEditController(TestCase): expected_new_config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) assert self._mocked_configuration_manager.configuration.config_files == expected_new_config_files self._mocked_view_edit_page.set_config_files.assert_called_with(expected_new_config_files) - self._mocked_view_edit_page.set_notification_page_text.assert_called_with( - ViewEditPageConstants.NOTIFICATION_SELECT_CONFIG_FILE_TEXT) + self._mocked_view_edit_page.set_notification_page_text.assert_called_once_with( + notification_label_text.NOTIFICATION_LOADING_MESSAGE) def test_page_add_row_button_expected_resource_gets_loaded_into_model(self) -> None: mocked_call_args: call = self._mocked_view_edit_page.add_row_button.clicked.connect.call_args[0] @@ -479,7 +477,7 @@ class TestViewEditController(TestCase): expected_config_files: List[str] = ["dummyfile"] mock_file_utils.find_files_with_suffix_under_directory.return_value = expected_config_files mocked_call_args: call = \ - self._mocked_view_edit_page.notification_prompt_create_new_button.clicked.connect.call_args[0] + self._mocked_view_edit_page.create_new_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering create_new_button connected function mock_file_utils.join_path.assert_called_once() @@ -494,7 +492,7 @@ class TestViewEditController(TestCase): expected_config_files: List[str] = ["dummyfile"] mock_json_utils.create_empty_resource_mapping_file.side_effect = IOError("dummy IO error") mocked_call_args: call = \ - self._mocked_view_edit_page.notification_prompt_create_new_button.clicked.connect.call_args[0] + self._mocked_view_edit_page.create_new_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering create_new_button connected function mock_file_utils.join_path.assert_called_once() @@ -507,7 +505,7 @@ class TestViewEditController(TestCase): self, mock_file_utils: MagicMock) -> None: mock_file_utils.find_files_with_suffix_under_directory.side_effect = FileNotFoundError("dummy error") mocked_call_args: call = \ - self._mocked_view_edit_page.notification_prompt_rescan_button.clicked.connect.call_args[0] + self._mocked_view_edit_page.rescan_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering rescan_button connected function mock_file_utils.find_files_with_suffix_under_directory.assert_called_once() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py index 6071da9885..70c45f3622 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py @@ -59,6 +59,13 @@ class TestFileUtils(TestCase): self._mock_path.cwd.assert_called_once() assert actual_path_name == TestFileUtils._expected_path_name + def test_get_parent_directory_path_return_expected_path_name(self) -> None: + self._mock_path.return_value.parent = TestFileUtils._expected_path_name + + actual_path_name: str = file_utils.get_parent_directory_path("dummy") + self._mock_path.assert_called_once() + assert actual_path_name == TestFileUtils._expected_path_name + def test_find_files_with_suffix_under_directory_return_expected_file_name(self) -> None: mocked_path: MagicMock = self._mock_path.return_value mocked_matched_path: MagicMock = MagicMock() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py index 987108e2d6..a320f2ac1b 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py @@ -28,6 +28,10 @@ def get_current_directory_path() -> str: return str(pathlib.Path.cwd()) +def get_parent_directory_path(file_path: str) -> str: + return pathlib.Path(file_path).parent + + def find_files_with_suffix_under_directory(dir_path: str, suffix: str) -> List[str]: results: List[str] = [] paths: List[pathlib.Path] = \ diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py index 1d32ca3b5c..f5ac5bf436 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py @@ -9,146 +9,54 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ -from PySide2.QtCore import (QRect, QSize, Qt) -from PySide2.QtGui import QFont +from PySide2.QtGui import (QIcon, QPixmap) from PySide2.QtWidgets import (QFrame, QHBoxLayout, QLabel, QLayout, QLineEdit, QPushButton, - QSizePolicy, QVBoxLayout, QWidget) + QSizePolicy, QWidget) -from model import view_size_constants +class SearchFilterLineEdit(QLineEdit): + """SearchFilterLineEdit is composed of search icon and search text input""" + def __init__(self, parent, placeholder_text: str) -> None: + super().__init__(parent) -class SearchFilterWidget(object): - """SearchFilterWidget is composed of search icon and search text input""" - def __init__(self, parent, placeholder_text: str, label_rect: QRect, input_width: int) -> None: - super().__init__() - - # TODO: unicode set up for now, will replace with icon - self._search_filter_label: QLabel = QLabel(parent) - self._search_filter_label.setObjectName("SearchTextLabel") - self._search_filter_label.setText("🔎") - font: QFont = self._search_filter_label.font() - font.setPointSize(view_size_constants.ICON_FRONT_SIZE) # temp value, will remove once replace with icon - self._search_filter_label.setFont(font) - self._search_filter_label.setGeometry(label_rect) - - # TODO: revise this front end to be user friendly - self._search_filter_input: QLineEdit = QLineEdit(parent) - self._search_filter_input.setObjectName("SearchTextInput") - self._search_filter_input.setPlaceholderText(placeholder_text) - self._search_filter_input.setGeometry(label_rect.x() + label_rect.width(), - label_rect.y(), input_width, label_rect.height()) - self._search_filter_input.home(True) - self._search_filter_input.deselect() - - @property - def search_filter_input(self) -> QLineEdit: - return self._search_filter_input + search_icon: QIcon = QIcon(":/stylesheet/img/search-dark.svg") + self.addAction(search_icon, QLineEdit.LeadingPosition) + self.setPlaceholderText(placeholder_text) + self.home(True) + self.deselect() class NotificationFrame(QFrame): - def __init__(self, parent: QWidget, title: str = "", - icon_size: int = view_size_constants.ICON_FRONT_SIZE, - cancel_size: int = view_size_constants.INTERACTION_COMPONENT_HEIGHT) -> None: + """NotificationFrame is composed of information icon, notification title and close icon""" + def __init__(self, parent: QWidget, pixmap: QPixmap, title: str, closeable: bool) -> None: super().__init__(parent) - self.setObjectName("AzQtComponents--CardNotification") + self.setObjectName("NotificationFrame") self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)) self.setFrameStyle(QFrame.StyledPanel | QFrame.Plain) - header_frame: QFrame = QFrame(self) - header_frame.setObjectName("HeaderFrame") - header_frame.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)) - - # TODO: unicode set up for now, will replace with icon - icon_label: QLabel = QLabel(header_frame) - icon_label.setObjectName("Icon") - icon_label.setText("🛈") - font: QFont = icon_label.font() - font.setPointSize(icon_size) - icon_label.setFont(font) + icon_label: QLabel = QLabel(self) + icon_label.setPixmap(pixmap) - self._title_label: QLabel = QLabel(title, header_frame) + self._title_label: QLabel = QLabel(title, self) self._title_label.setObjectName("Title") - self._title_label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) + self._title_label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)) self._title_label.setWordWrap(True) - cancel_button: QPushButton = QPushButton("CancelButton", header_frame) - cancel_button.setText("🗙") - font: QFont = cancel_button.font() - font.setPointSize(icon_size) - cancel_button.setFont(font) - cancel_button.setMaximumSize(cancel_size, cancel_size) - cancel_button.clicked.connect(self.hide) - - header_layout: QHBoxLayout = QHBoxLayout(header_frame) + header_layout: QHBoxLayout = QHBoxLayout(self) header_layout.setSizeConstraint(QLayout.SetMinimumSize) header_layout.setContentsMargins(0, 0, 0, 0) header_layout.addWidget(icon_label) header_layout.addWidget(self._title_label) - header_layout.addWidget(cancel_button) - header_frame.setLayout(header_layout) + if closeable: + cancel_button: QPushButton = QPushButton(self) + cancel_button.setIcon(QIcon(":/stylesheet/img/close.svg")) + cancel_button.setFlat(True) + cancel_button.clicked.connect(self.hide) + header_layout.addWidget(cancel_button) + self.setLayout(header_layout) - feature_layout: QVBoxLayout = QVBoxLayout(self) - feature_layout.setSizeConstraint(QLayout.SetMinimumSize) - feature_layout.setContentsMargins(0, 0, 0, 0) - feature_layout.addWidget(header_frame) - - self.setVisible(False) - - def hide(self) -> None: - self._title_label.setText("") self.setVisible(False) def set_text(self, text: str) -> None: self._title_label.setText(text) - self.setVisible(True) - - -class NotificationPrompt(QWidget): - def __init__(self, parent: QWidget, prompt_rect: QRect, button_size: QSize) -> None: - super().__init__(parent) - self.setObjectName("NotificationPrompt") - self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) - self.setGeometry(prompt_rect) - - notification_prompt_label: QLabel = \ - QLabel("Unable to locate a resource mapping config file. " - "We can either make this file for you or you can rescan your directory") - notification_prompt_label.setObjectName("NotificationPromptLabel") - notification_prompt_label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) - notification_prompt_label.setWordWrap(True) - notification_prompt_label.setAlignment(Qt.AlignCenter) - - notification_prompt_interactions: QWidget = QWidget(self) - notification_prompt_interactions.setObjectName("NotificationInteractions") - notification_prompt_interactions.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) - - self._create_new_button: QPushButton = QPushButton("Create New", notification_prompt_interactions) - self._create_new_button.setObjectName("CreateNewButton") - self._create_new_button.setMaximumSize(button_size) - - self._rescan_button: QPushButton = QPushButton("Rescan", notification_prompt_interactions) - self._rescan_button.setObjectName("RescanButton") - self._rescan_button.setMaximumSize(button_size) - - notification_prompt_interactions_layout: QHBoxLayout = QHBoxLayout(notification_prompt_interactions) - notification_prompt_interactions_layout.addWidget(self._create_new_button) - notification_prompt_interactions_layout.addWidget(self._rescan_button) - notification_prompt_interactions.setLayout(notification_prompt_interactions_layout) - - feature_layout: QVBoxLayout = QVBoxLayout(self) - feature_layout.addWidget(notification_prompt_label) - feature_layout.addWidget(notification_prompt_interactions) - - self.setVisible(False) - - @property - def create_new_button(self) -> QPushButton: - return self._create_new_button - - @property - def rescan_button(self) -> QPushButton: - return self._rescan_button - - def set_visible(self, enabled: bool) -> None: - self.setVisible(enabled) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/configuration_page.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/configuration_page.py deleted file mode 100755 index 6d1ec18591..0000000000 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/configuration_page.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -from typing import List -from PySide2.QtCore import (QItemSelectionModel, QModelIndex, QRect, Qt) -from PySide2.QtWidgets import (QAbstractItemView, QComboBox, QCommandLinkButton, QHeaderView, QLabel, QLineEdit, - QPushButton, QSizePolicy, QStackedWidget, QTreeView, QVBoxLayout, QWidget) - -from model import constants -from model.resource_proxy_model import ResourceProxyModel -from model.resource_tree_model import (ResourceTreeConstants, ResourceTreeModel, ResourceTreeNode) -from view.common_view_components import SearchFilterWidget - - -class ConfigurationPage(QWidget): - """ - Configuration page, which includes all related Qt widgets to interact for - searching and importing resources - """ - def __init__(self) -> None: - super().__init__() - self.setObjectName("configurationPage") - - self._page_vertical_layout: QVBoxLayout = QVBoxLayout(self) - self._page_vertical_layout.setObjectName("pageVerticalLayout") - self._page_vertical_layout.setGeometry(QRect(10, 20, 900, 560)) - - self._notification_group: QWidget = QWidget(self) - self._notification_label: QLabel = QLabel(self._notification_group) - size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) - size_policy.setHeightForWidth(self._notification_label.sizePolicy().hasHeightForWidth()) - self._notification_label.setObjectName("notificationLabel") - self._notification_label.setText("Please select the root folder of your resource mapping config files") - - self._page_vertical_layout.addWidget(self._notification_group) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py index fb3225fcf4..004eeb1f6b 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py @@ -10,14 +10,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ from typing import List -from PySide2.QtCore import (QItemSelectionModel, QModelIndex, QRect, Qt) -from PySide2.QtWidgets import (QAbstractItemView, QComboBox, QHeaderView, QLabel, QLineEdit, - QPushButton, QStackedWidget, QTreeView, QVBoxLayout, QWidget) +from PySide2.QtCore import (QItemSelectionModel, QModelIndex) +from PySide2.QtGui import (QFont, QIcon, QPixmap) +from PySide2.QtWidgets import (QAbstractItemView, QComboBox, QFrame, QHBoxLayout, QHeaderView, QLabel, QLayout, + QLineEdit, QPushButton, QSizePolicy, QSpacerItem, QStackedWidget, QTreeView, + QVBoxLayout, QWidget) from model import (constants, notification_label_text, view_size_constants) from model.resource_proxy_model import ResourceProxyModel from model.resource_tree_model import (ResourceTreeConstants, ResourceTreeModel, ResourceTreeNode) -from view.common_view_components import (NotificationFrame, SearchFilterWidget) +from view.common_view_components import (NotificationFrame, SearchFilterLineEdit) class ImportResourcesPageConstants(object): @@ -88,7 +90,6 @@ class ImportResourcesPage(QWidget): """ def __init__(self) -> None: super().__init__() - self.setObjectName("ImportResourcePage") self.setGeometry(0, 0, view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_HEIGHT) @@ -96,17 +97,19 @@ class ImportResourcesPage(QWidget): self._search_version: str = "" page_vertical_layout: QVBoxLayout = QVBoxLayout(self) - page_vertical_layout.setObjectName("PageVerticalLayout") - page_vertical_layout.setSpacing(0) - page_vertical_layout.setContentsMargins(view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, - view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM, - view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, - view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM) + page_vertical_layout.setSizeConstraint(QLayout.SetMinimumSize) + page_vertical_layout.setMargin(0) self._setup_header_area() page_vertical_layout.addWidget(self._header_area) - - self._notification_frame: NotificationFrame = NotificationFrame(self) + header_area_separator: QFrame = QFrame(self) + header_area_separator.setObjectName("SeparatorLine") + header_area_separator.setFrameShape(QFrame.HLine) + header_area_separator.setLineWidth(view_size_constants.HEADER_AREA_SEPARATOR_WIDTH) + page_vertical_layout.addWidget(header_area_separator) + + self._notification_frame: NotificationFrame = \ + NotificationFrame(self, QPixmap(":/stylesheet/img/logging/information.svg"), "", True) page_vertical_layout.addWidget(self._notification_frame) self._setup_search_area() @@ -117,116 +120,158 @@ class ImportResourcesPage(QWidget): def _setup_header_area(self) -> None: self._header_area: QWidget = QWidget(self) - self._header_area.setObjectName("HeaderArea") + self._header_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self._header_area.setMinimumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.IMPORT_RESOURCES_PAGE_HEADER_AREA_HEIGHT) + header_area_layout: QHBoxLayout = QHBoxLayout(self._header_area) + header_area_layout.setSizeConstraint(QLayout.SetMinimumSize) + header_area_layout.setContentsMargins( + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM + view_size_constants.IMPORT_RESOURCES_PAGE_MARGIN_TOPBOTTOM, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM) + self._back_button: QPushButton = QPushButton(self._header_area) - self._back_button.setObjectName("BackButton") - self._back_button.setText("Back") - self._back_button.setGeometry(0, 0, - view_size_constants.BACK_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._back_button.setObjectName("Secondary") + self._back_button.setText(f" {notification_label_text.IMPORT_RESOURCES_PAGE_BACK_TEXT}") + self._back_button.setIcon(QIcon(":/Breadcrumb/img/UI20/Breadcrumb/arrow_left-default.svg")) + self._back_button.setFlat(True) + self._back_button.setMinimumSize(view_size_constants.BACK_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + header_area_layout.addWidget(self._back_button) + + header_area_spacer: QSpacerItem = QSpacerItem(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT, + QSizePolicy.Expanding, QSizePolicy.Minimum) + header_area_layout.addItem(header_area_spacer) def _setup_search_area(self) -> None: self._search_area: QWidget = QWidget(self) - self._search_area.setObjectName("SearchArea") + self._search_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self._search_area.setMinimumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.IMPORT_RESOURCES_PAGE_SEARCH_AREA_HEIGHT) + search_area_layout: QHBoxLayout = QHBoxLayout(self._search_area) + search_area_layout.setSizeConstraint(QLayout.SetMinimumSize) + search_area_layout.setContentsMargins(view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.IMPORT_RESOURCES_PAGE_MARGIN_TOPBOTTOM, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.IMPORT_RESOURCES_PAGE_MARGIN_TOPBOTTOM) + + self._setup_typed_resources_search_group() + search_area_layout.addWidget(self._typed_resources_search_group) + + self._setup_cfn_stacks_search_group() + search_area_layout.addWidget(self._cfn_stacks_search_group) + + search_area_spacer: QSpacerItem = QSpacerItem(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT, + QSizePolicy.Expanding, QSizePolicy.Minimum) + search_area_layout.addItem(search_area_spacer) + + self._search_filter_line_edit: SearchFilterLineEdit = SearchFilterLineEdit( + self._search_area, notification_label_text.IMPORT_RESOURCES_PAGE_SEARCH_PLACEHOLDER_TEXT) + self._search_filter_line_edit.setMinimumSize( + view_size_constants.IMPORT_RESOURCES_PAGE_SEARCH_FILTER_WIDGET_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + search_area_layout.addWidget(self._search_filter_line_edit) + + def _setup_typed_resources_search_group(self) -> None: self._typed_resources_search_group: QWidget = QWidget(self._search_area) - self._typed_resources_search_group.setObjectName("ResourceTypeSearchGroup") + typed_resources_search_group_layout: QHBoxLayout = QHBoxLayout(self._typed_resources_search_group) + typed_resources_search_group_layout.setSizeConstraint(QLayout.SetMinimumSize) + typed_resources_search_group_layout.setContentsMargins(0, 0, 0, 0) typed_resources_label: QLabel = QLabel(self._typed_resources_search_group) - typed_resources_label.setObjectName("ResourceTypeLabel") - typed_resources_label.setText("AWS Resource Type") - typed_resources_label.setGeometry(view_size_constants.TYPED_RESOURCES_LABEL_X, - view_size_constants.IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.TYPED_RESOURCES_LABEL_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) - + typed_resources_label.setText(notification_label_text.IMPORT_RESOURCES_PAGE_AWS_SEARCH_TYPE_TEXT) + typed_resources_label_font: QFont = QFont() + typed_resources_label_font.setBold(True) + typed_resources_label.setFont(typed_resources_label_font) + typed_resources_label.setMinimumSize(view_size_constants.TYPED_RESOURCES_LABEL_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + typed_resources_search_group_layout.addWidget(typed_resources_label) + self._typed_resources_combobox: QComboBox = QComboBox(self._typed_resources_search_group) - self._typed_resources_combobox.setObjectName("ResourceTypeCombobox") self._typed_resources_combobox.setLineEdit(QLineEdit()) - self._typed_resources_combobox.lineEdit().setPlaceholderText("Please select") + self._typed_resources_combobox.lineEdit().setPlaceholderText( + notification_label_text.IMPORT_RESOURCES_PAGE_AWS_SEARCH_TYPE_PLACEHOLDER_TEXT) self._typed_resources_combobox.lineEdit().setReadOnly(True) - self._typed_resources_combobox.setGeometry(view_size_constants.TYPED_RESOURCES_COMBOBOX_X, - view_size_constants.IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.TYPED_RESOURCES_COMBOBOX_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._typed_resources_combobox.setMinimumSize(view_size_constants.TYPED_RESOURCES_COMBOBOX_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) self._typed_resources_combobox.addItems(constants.AWS_RESOURCE_TYPES) self._typed_resources_combobox.setCurrentIndex(-1) - + typed_resources_search_group_layout.addWidget(self._typed_resources_combobox) + + typed_resources_search_group_separator_label: QLabel = QLabel(self._typed_resources_search_group) + typed_resources_search_group_separator_label.setPixmap(QPixmap(":/stylesheet/img/separator.png")) + typed_resources_search_group_layout.addWidget(typed_resources_search_group_separator_label) + self._typed_resources_search_button: QPushButton = QPushButton(self._typed_resources_search_group) - self._typed_resources_search_button.setObjectName("ResourceTypeSearchButton") - self._typed_resources_search_button.setText("Search") - self._typed_resources_search_button.setGeometry(view_size_constants.TYPED_RESOURCES_SEARCH_BUTTON_X, - view_size_constants.IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.SEARCH_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) - + self._typed_resources_search_button.setObjectName("Secondary") + self._typed_resources_search_button.setText(notification_label_text.IMPORT_RESOURCES_PAGE_SEARCH_TEXT) + self._typed_resources_search_button.setMinimumSize(view_size_constants.SEARCH_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + typed_resources_search_group_layout.addWidget(self._typed_resources_search_button) + self._typed_resources_import_button = QPushButton(self._typed_resources_search_group) - self._typed_resources_import_button.setObjectName("ResourceTypeImportButton") - self._typed_resources_import_button.setText("Import") - self._typed_resources_import_button.setGeometry(view_size_constants.TYPED_RESOURCES_IMPORT_BUTTON_X, - view_size_constants.IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.IMPORT_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._typed_resources_import_button.setObjectName("Primary") + self._typed_resources_import_button.setText(notification_label_text.IMPORT_RESOURCES_PAGE_IMPORT_TEXT) + self._typed_resources_import_button.setMinimumSize(view_size_constants.IMPORT_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + typed_resources_search_group_layout.addWidget(self._typed_resources_import_button) + self._typed_resources_search_group.setVisible(False) + def _setup_cfn_stacks_search_group(self) -> None: self._cfn_stacks_search_group: QWidget = QWidget(self._search_area) - self._cfn_stacks_search_group.setObjectName("CfnSearchGroup") + cfn_stacks_search_group_layout: QHBoxLayout = QHBoxLayout(self._cfn_stacks_search_group) + cfn_stacks_search_group_layout.setSizeConstraint(QLayout.SetMinimumSize) + cfn_stacks_search_group_layout.setContentsMargins(0, 0, 0, 0) self._cfn_stacks_search_button: QPushButton = QPushButton(self._cfn_stacks_search_group) - self._cfn_stacks_search_button.setObjectName("CfnSearchButton") - self._cfn_stacks_search_button.setText("Search") - self._cfn_stacks_search_button.setGeometry(view_size_constants.CFN_STACKS_SEARCH_BUTTON_X, - view_size_constants.IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.SEARCH_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._cfn_stacks_search_button.setObjectName("Secondary") + self._cfn_stacks_search_button.setText(notification_label_text.IMPORT_RESOURCES_PAGE_SEARCH_TEXT) + self._cfn_stacks_search_button.setMinimumSize(view_size_constants.SEARCH_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + cfn_stacks_search_group_layout.addWidget(self._cfn_stacks_search_button) self._cfn_stacks_import_button: QPushButton = QPushButton(self._cfn_stacks_search_group) - self._cfn_stacks_import_button.setObjectName("CfnImportButton") - self._cfn_stacks_import_button.setText("Import") - self._cfn_stacks_import_button.setGeometry(view_size_constants.CFN_STACKS_IMPORT_BUTTON_X, - view_size_constants.IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.IMPORT_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._cfn_stacks_import_button.setObjectName("Primary") + self._cfn_stacks_import_button.setText(notification_label_text.IMPORT_RESOURCES_PAGE_IMPORT_TEXT) + self._cfn_stacks_import_button.setMinimumSize(view_size_constants.IMPORT_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + cfn_stacks_search_group_layout.addWidget(self._cfn_stacks_import_button) self._cfn_stacks_search_group.setVisible(False) - self._search_filter_widget: SearchFilterWidget = \ - SearchFilterWidget(self._search_area, notification_label_text.IMPORT_RESOURCES_PAGE_SEARCH_PLACEHOLDER_TEXT, - QRect(view_size_constants.IMPORT_RESOURCES_PAGE_SEARCH_FILTER_WIDGET_X, - view_size_constants.IMPORT_RESOURCES_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.INTERACTION_COMPONENT_HEIGHT, - view_size_constants.INTERACTION_COMPONENT_HEIGHT), - view_size_constants.IMPORT_RESOURCES_PAGE_SEARCH_FILTER_WIDGET_WIDTH) - def _setup_view_area(self) -> None: self._stacked_pages: QStackedWidget = QStackedWidget(self) - self._stacked_pages.setObjectName("StackedPages") + self._stacked_pages.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self._stacked_pages.setMaximumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.IMPORT_RESOURCES_PAGE_VIEW_AREA_HEIGHT) + self._stacked_pages.setContentsMargins(view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, 0, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, 0) + + notification_page_frame: QFrame = \ + NotificationFrame(self, QPixmap(":/stylesheet/img/32x32/info.png"), + notification_label_text.NOTIFICATION_LOADING_MESSAGE, False) + notification_page_frame.setFixedSize( + (view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH + - 2 * view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT), + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + notification_page_frame.setVisible(True) - notification_page: QWidget = QWidget() - notification_page.setObjectName("NotificationPage") - notification_page_label = QLabel(notification_page) - notification_page_label.setObjectName("NotificationLabel") - notification_page_label.setText("Loading ...") - notification_page_label.setGeometry(0, 0, - view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) - notification_page_label.setAlignment(Qt.AlignCenter) - - self._stacked_pages.addWidget(notification_page) + self._stacked_pages.addWidget(notification_page_frame) + + tree_view_page: QWidget = QWidget(self) + tree_view_vertical_layout: QVBoxLayout = QVBoxLayout(tree_view_page) + tree_view_vertical_layout.setSizeConstraint(QLayout.SetMinimumSize) + tree_view_vertical_layout.setContentsMargins(0, 0, 0, 0) - tree_view_page: QWidget = QWidget() - tree_view_page.setObjectName("TreeViewPage") self._tree_view: ResourceTreeView = ResourceTreeView(True, tree_view_page) - self._tree_view.setObjectName("TreeView") - self._tree_view.setGeometry(view_size_constants.IMPORT_RESOURCES_PAGE_TREE_VIEW_X, 0, - view_size_constants.IMPORT_RESOURCES_PAGE_TREE_VIEW_WIDTH, - view_size_constants.IMPORT_RESOURCES_PAGE_TREE_VIEW_HEIGHT) + self._tree_view.setAlternatingRowColors(True) + self._tree_view.setMaximumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, + view_size_constants.IMPORT_RESOURCES_PAGE_TREE_VIEW_HEIGHT) self._tree_view.setSelectionMode(QAbstractItemView.ExtendedSelection) self._tree_view.setSortingEnabled(True) @@ -234,6 +279,12 @@ class ImportResourcesPage(QWidget): header.setSectionResizeMode(ResourceTreeConstants.TREE_NAME_OR_ID_COLUMN_INDEX, QHeaderView.Stretch) header.setMaximumSectionSize(view_size_constants.RESOURCE_STACK_HEADER_CELL_MAXIMUM) header.setMinimumSectionSize(view_size_constants.RESOURCE_STACK_HEADER_CELL_MINIMUM) + tree_view_vertical_layout.addWidget(self._tree_view) + + tree_view_spacer: QSpacerItem = QSpacerItem(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, + view_size_constants.IMPORT_RESOURCES_PAGE_FOOTER_AREA_HEIGHT, + QSizePolicy.Expanding, QSizePolicy.Fixed) + tree_view_vertical_layout.addItem(tree_view_spacer) self._stacked_pages.addWidget(tree_view_page) self._stacked_pages.setCurrentIndex(1) @@ -268,7 +319,7 @@ class ImportResourcesPage(QWidget): @property def search_filter_input(self) -> QLineEdit: - return self._search_filter_widget.search_filter_input + return self._search_filter_line_edit @property def search_version(self) -> str: @@ -294,7 +345,8 @@ class ImportResourcesPage(QWidget): self._stacked_pages.setCurrentIndex(index) def hide_notification_frame(self) -> None: - self._notification_frame.hide() + self._notification_frame.setVisible(False) def set_notification_frame_text(self, text: str) -> None: self._notification_frame.set_text(text) + self._notification_frame.setVisible(True) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py index 925841231a..cb082b428b 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py @@ -9,35 +9,33 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ -from typing import List -from PySide2.QtCore import (QAbstractItemModel, QModelIndex, QObject, QRect, QSize, Qt) -from PySide2.QtGui import (QFont, QFontMetrics) -from PySide2.QtWidgets import (QAbstractItemDelegate, QAbstractItemView, QComboBox, QHeaderView, QLabel, QLineEdit, - QPushButton, QStackedWidget, QStyledItemDelegate, QStyleOptionViewItem, - QTableView, QVBoxLayout, QWidget) +from typing import (Dict, List) +from PySide2.QtCore import (QAbstractItemModel, QModelIndex, QObject, Qt) +from PySide2.QtGui import (QIcon, QFont, QFontMetrics, QPainter, QPixmap) +from PySide2.QtWidgets import (QAbstractItemDelegate, QAbstractItemView, QComboBox, QFrame, QHeaderView, QHBoxLayout, + QLabel, QLayout, QLineEdit, QPushButton, QSizePolicy, QSpacerItem, QStackedWidget, + QStyledItemDelegate, QStyleOptionViewItem, QTableView, QVBoxLayout, QWidget) from model import (constants, notification_label_text, view_size_constants) +from model.resource_mapping_attributes import ResourceMappingAttributesStatus from model.resource_proxy_model import ResourceProxyModel from model.resource_table_model import (ResourceTableConstants, ResourceTableModel) -from view.common_view_components import (NotificationFrame, NotificationPrompt, SearchFilterWidget) +from view.common_view_components import (NotificationFrame, SearchFilterLineEdit) class ViewEditPageConstants(object): NOTIFICATION_PAGE_INDEX = 0 TABLE_VIEW_PAGE_INDEX = 1 - NOTIFICATION_LOADING_TEXT: str = "Loading..." - NOTIFICATION_SELECT_CONFIG_FILE_TEXT: str = "Please select the Config file you would like to view and modify..." - class ComboboxItemDelegate(QStyledItemDelegate): """ Custom item delegate to present individual item as a combobox while editing """ - def __init__(self, parent: QObject, combobox_values: List[str]) -> None: + def __init__(self, parent: QObject) -> None: super(ComboboxItemDelegate, self).__init__(parent) - self._combobox_values: List[str] = combobox_values + self._combobox_values: List[str] = constants.AWS_RESOURCE_REGIONS def createEditor(self, parent: QWidget, option: QStyleOptionViewItem, index: QModelIndex) -> QWidget: """QStyledItemDelegate override""" @@ -67,6 +65,29 @@ class ComboboxItemDelegate(QStyledItemDelegate): self.closeEditor.emit(editor, QAbstractItemDelegate.NoHint) +class ImageDelegate(QStyledItemDelegate): + """ + Image delegate to draw image in table cell + """ + def __init__(self, parent: QObject) -> None: + super(ImageDelegate, self).__init__(parent) + self._icons: Dict[str, QIcon] = \ + {ResourceMappingAttributesStatus.SUCCESS_STATUS_VALUE: QIcon(":/stylesheet/img/table_success.png"), + ResourceMappingAttributesStatus.MODIFIED_STATUS_VALUE: QIcon(":/stylesheet/img/table_warning.png"), + ResourceMappingAttributesStatus.FAILURE_STATUS_VALUE: QIcon(":/stylesheet/img/table_error.png")} + + def get_icon(self, index: QModelIndex) -> QIcon: + current_text: str = index.data() + if current_text in self._icons.keys(): + return self._icons[current_text] + return None + + def paint(self, painter: QPainter, option: QStyleOptionViewItem, index: QModelIndex): + icon: QIcon = self.get_icon(index) + if icon: + icon.paint(painter, option.rect, Qt.AlignCenter) + + class ResourceTableView(QTableView): """ Custom QTableView, which maintains custom resource table model to show @@ -79,7 +100,9 @@ class ResourceTableView(QTableView): self.setModel(self._resource_proxy_model) self.setItemDelegateForColumn(ResourceTableConstants.TABLE_REGION_COLUMN_INDEX, - ComboboxItemDelegate(self, constants.AWS_RESOURCE_REGIONS)) + ComboboxItemDelegate(self)) + self.setItemDelegateForColumn(ResourceTableConstants.TABLE_STATE_COLUMN_INDEX, + ImageDelegate(self)) @property def resource_proxy_model(self) -> ResourceProxyModel: @@ -103,23 +126,24 @@ class ViewEditPage(QWidget): """ def __init__(self) -> None: super().__init__() - self.setObjectName("ViewEditPage") self.setGeometry(0, 0, view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_HEIGHT) page_vertical_layout: QVBoxLayout = QVBoxLayout(self) - page_vertical_layout.setObjectName("PageVerticalLayout") - page_vertical_layout.setSpacing(0) - page_vertical_layout.setContentsMargins(view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, - view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM, - view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, - view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM) + page_vertical_layout.setSizeConstraint(QLayout.SetMinimumSize) + page_vertical_layout.setMargin(0) self._setup_header_area() page_vertical_layout.addWidget(self._header_area) - - self._notification_frame: NotificationFrame = NotificationFrame(self) + header_area_separator: QFrame = QFrame(self) + header_area_separator.setObjectName("SeparatorLine") + header_area_separator.setFrameShape(QFrame.HLine) + header_area_separator.setLineWidth(view_size_constants.HEADER_AREA_SEPARATOR_WIDTH) + page_vertical_layout.addWidget(header_area_separator) + + self._notification_frame: NotificationFrame = \ + NotificationFrame(self, QPixmap(":/stylesheet/img/logging/information.svg"), "", True) page_vertical_layout.addWidget(self._notification_frame) self._setup_center_area() @@ -130,151 +154,152 @@ class ViewEditPage(QWidget): def _setup_header_area(self) -> None: self._header_area: QWidget = QWidget(self) - self._header_area.setObjectName("HeaderArea") + self._header_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self._header_area.setMinimumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, - view_size_constants.VIEW_EDIT_PAGE_HEADER_FOOTER_AREA_HEIGHT) - + view_size_constants.VIEW_EDIT_PAGE_HEADER_AREA_HEIGHT) + + header_area_layout: QHBoxLayout = QHBoxLayout(self._header_area) + header_area_layout.setSizeConstraint(QLayout.SetMinimumSize) + header_area_layout.setContentsMargins( + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM + view_size_constants.VIEW_EDIT_PAGE_MARGIN_TOPBOTTOM, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM) + config_file_label: QLabel = QLabel(self._header_area) - config_file_label.setObjectName("ConfigFileLabel") - config_file_label.setText("Config File:") - config_file_label.setGeometry(view_size_constants.CONFIG_FILE_LABEL_X, - view_size_constants.VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.CONFIG_FILE_LABEL_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + config_file_label.setText(notification_label_text.VIEW_EDIT_PAGE_CONFIG_FILE_TEXT) + config_file_label_font: QFont = QFont() + config_file_label_font.setBold(True) + config_file_label.setFont(config_file_label_font) + config_file_label.setMinimumSize(view_size_constants.CONFIG_FILE_LABEL_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + header_area_layout.addWidget(config_file_label) self._config_file_combobox: QComboBox = QComboBox(self._header_area) - self._config_file_combobox.setObjectName("ConfigFileCombobox") self._config_file_combobox.setLineEdit(QLineEdit()) - self._config_file_combobox.lineEdit().setPlaceholderText(f"Found 0 config file") + self._config_file_combobox.lineEdit().setPlaceholderText( + notification_label_text.VIEW_EDIT_PAGE_CONFIG_FILES_PLACEHOLDER_TEXT.format(0)) self._config_file_combobox.lineEdit().setReadOnly(True) - self._config_file_combobox.setGeometry(view_size_constants.CONFIG_FILE_COMBOBOX_X, - view_size_constants.VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.CONFIG_FILE_COMBOBOX_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._config_file_combobox.setMinimumSize(view_size_constants.CONFIG_FILE_COMBOBOX_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) self._config_file_combobox.setCurrentIndex(-1) + header_area_layout.addWidget(self._config_file_combobox) + + header_area_spacer: QSpacerItem = QSpacerItem(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT, + QSizePolicy.Expanding, QSizePolicy.Minimum) + header_area_layout.addItem(header_area_spacer) config_location_label: QLabel = QLabel(self._header_area) - config_location_label.setObjectName("ConfigLocationLabel") - config_location_label.setText("Config Location:") - config_location_label.setGeometry(view_size_constants.CONFIG_LOCATION_LABEL_X, - view_size_constants.VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.CONFIG_LOCATION_LABEL_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + config_location_label.setText(notification_label_text.VIEW_EDIT_PAGE_CONFIG_LOCATION_TEXT) + config_location_label_font: QFont = QFont() + config_location_label_font.setBold(True) + config_location_label.setFont(config_location_label_font) + config_location_label.setMinimumSize(view_size_constants.CONFIG_LOCATION_LABEL_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + header_area_layout.addWidget(config_location_label) self._config_location_text: QLabel = QLabel(self._header_area) - self._config_location_text.setObjectName("ConfigLocationText") - self._config_location_text.setToolTip("None config directory given") - self._config_location_text.setGeometry(view_size_constants.CONFIG_LOCATION_TEXT_X, - view_size_constants.VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.CONFIG_LOCATION_TEXT_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._config_location_text.setMinimumSize(view_size_constants.CONFIG_LOCATION_TEXT_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + header_area_layout.addWidget(self._config_location_text) - # TODO: unicode set up for now, will replace with icon self._config_location_button: QPushButton = QPushButton(self._header_area) - self._config_location_button.setObjectName("ConfigLocationButton") - self._config_location_button.setText("📂") - font: QFont = self._config_location_button.font() - font.setPointSize(view_size_constants.ICON_FRONT_SIZE) - self._config_location_button.setFont(font) - self._config_location_button.setGeometry(view_size_constants.CONFIG_LOCATION_BUTTON_X, - view_size_constants.VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.INTERACTION_COMPONENT_HEIGHT, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._config_location_button.setIcon(QIcon(":/Gallery/Folder.svg")) + self._config_location_button.setFlat(True) + self._config_location_button.setMinimumSize(view_size_constants.INTERACTION_COMPONENT_HEIGHT, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + header_area_layout.addWidget(self._config_location_button) def _setup_center_area(self) -> None: self._stacked_pages: QStackedWidget = QStackedWidget(self) - self._stacked_pages.setObjectName("StackedPages") + self._stacked_pages.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self._stacked_pages.setMaximumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.VIEW_EDIT_PAGE_CENTER_AREA_HEIGHT) + self._stacked_pages.setContentsMargins(view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, 0, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, 0) self._setup_notification_page() - self._stacked_pages.addWidget(self._notification_page) + self._stacked_pages.addWidget(self._notification_page_frame) self._setup_table_view_page() self._stacked_pages.addWidget(self._table_view_page) def _setup_notification_page(self) -> None: - self._notification_page: QWidget = QWidget() - self._notification_page.setObjectName("NotificationPage") - - self._notification_page_label: QLabel = QLabel(self._notification_page) - self._notification_page_label.setObjectName("NotificationLabel") - self._notification_page_label.setText("Loading ...") - self._notification_page_label.setGeometry(0, 0, - view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) - self._notification_page_label.setAlignment(Qt.AlignCenter) - - self._notification_page_prompt: QWidget = \ - NotificationPrompt(self._notification_page, - QRect(0, 0, - view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, - view_size_constants.NOTIFICATION_PAGE_PROMPT_HEIGHT), - QSize(view_size_constants.NOTIFICATION_PAGE_PROMPT_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT)) + self._notification_page_frame: QFrame = \ + NotificationFrame(self, QPixmap(":/stylesheet/img/32x32/info.png"), + notification_label_text.NOTIFICATION_LOADING_MESSAGE, False) + self._notification_page_frame.setFixedSize( + (view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH + - 2 * view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT), + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._notification_page_frame.setVisible(True) def _setup_table_view_page(self) -> None: - self._table_view_page: QWidget = QWidget() - self._table_view_page.setObjectName("TableViewPage") - + self._table_view_page: QWidget = QWidget(self) table_view_vertical_layout: QVBoxLayout = QVBoxLayout(self._table_view_page) - table_view_vertical_layout.setObjectName("TableViewVerticalLayout") - table_view_vertical_layout.setSpacing(0) + table_view_vertical_layout.setSizeConstraint(QLayout.SetMinimumSize) table_view_vertical_layout.setContentsMargins(0, 0, 0, 0) interaction_area: QWidget = QWidget(self._table_view_page) - interaction_area.setObjectName("InteractionArea") + interaction_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) interaction_area.setMinimumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.TABLE_VIEW_PAGE_INTERACTION_AREA_HEIGHT) + interaction_area_layout: QHBoxLayout = QHBoxLayout(interaction_area) + interaction_area_layout.setSizeConstraint(QLayout.SetMinimumSize) + interaction_area_layout.setContentsMargins(0, view_size_constants.VIEW_EDIT_PAGE_MARGIN_TOPBOTTOM, + 0, view_size_constants.VIEW_EDIT_PAGE_MARGIN_TOPBOTTOM) + self._add_row_button: QPushButton = QPushButton(interaction_area) - self._add_row_button.setObjectName("AddRowButton") - self._add_row_button.setText("Add Row") - self._add_row_button.setGeometry(view_size_constants.ADD_ROW_BUTTON_X, 0, - view_size_constants.ADD_ROW_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._add_row_button.setObjectName("Primary") + self._add_row_button.setText(notification_label_text.VIEW_EDIT_PAGE_ADD_ROW_TEXT) + self._add_row_button.setMinimumSize(view_size_constants.ADD_ROW_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + interaction_area_layout.addWidget(self._add_row_button) self._delete_row_button: QPushButton = QPushButton(interaction_area) - self._delete_row_button.setObjectName("DeleteRowButton") - self._delete_row_button.setText("Delete Row") - self._delete_row_button.setGeometry(view_size_constants.DELETE_ROW_BUTTON_X, 0, - view_size_constants.DELETE_ROW_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._delete_row_button.setObjectName("Primary") + self._delete_row_button.setText(notification_label_text.VIEW_EDIT_PAGE_DELETE_ROW_TEXT) + self._delete_row_button.setMinimumSize(view_size_constants.DELETE_ROW_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + interaction_area_layout.addWidget(self._delete_row_button) - self._import_resources_label: QLabel = QLabel(interaction_area) - self._import_resources_label.setObjectName("ImportResourcesLabel") - self._import_resources_label.setText("Import") - self._import_resources_label.setGeometry(view_size_constants.IMPORT_RESOURCES_LABEL_X, 0, - view_size_constants.IMPORT_RESOURCES_LABEL_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + interaction_area_separator_label: QLabel = QLabel(interaction_area) + interaction_area_separator_label.setPixmap(QPixmap(":/stylesheet/img/separator.png")) + interaction_area_layout.addWidget(interaction_area_separator_label) self._import_resources_combobox: QComboBox = QComboBox(interaction_area) - self._import_resources_combobox.setObjectName("ImportResourcesCombobox") self._import_resources_combobox.setLineEdit(QLineEdit()) - self._import_resources_combobox.lineEdit().setPlaceholderText("Please Select") + self._import_resources_combobox.lineEdit().setPlaceholderText( + notification_label_text.VIEW_EDIT_PAGE_IMPORT_RESOURCES_PLACEHOLDER_TEXT) self._import_resources_combobox.lineEdit().setReadOnly(True) - self._import_resources_combobox.setGeometry(view_size_constants.IMPORT_RESOURCES_COMBOBOX_X, 0, - view_size_constants.IMPORT_RESOURCES_COMBOBOX_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._import_resources_combobox.setMinimumSize(view_size_constants.IMPORT_RESOURCES_COMBOBOX_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) self._import_resources_combobox.addItem(constants.SEARCH_TYPED_RESOURCES_VERSION) self._import_resources_combobox.addItem(constants.SEARCH_CFN_STACKS_VERSION) self._import_resources_combobox.setCurrentIndex(-1) - - self._search_filter_widget: SearchFilterWidget = \ - SearchFilterWidget(interaction_area, notification_label_text.VIEW_EDIT_PAGE_SEARCH_PLACEHOLDER_TEXT, - QRect(view_size_constants.TABLE_VIEW_PAGE_SEARCH_FILTER_WIDGET_X, 0, - view_size_constants.INTERACTION_COMPONENT_HEIGHT, - view_size_constants.INTERACTION_COMPONENT_HEIGHT), - view_size_constants.TABLE_VIEW_PAGE_SEARCH_FILTER_WIDGET_WIDTH) - + interaction_area_layout.addWidget(self._import_resources_combobox) + + interaction_area_spacer: QSpacerItem = QSpacerItem( + view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.INTERACTION_COMPONENT_HEIGHT, + QSizePolicy.Expanding, QSizePolicy.Minimum) + interaction_area_layout.addItem(interaction_area_spacer) + + self._search_filter_line_edit: SearchFilterLineEdit = \ + SearchFilterLineEdit(interaction_area, notification_label_text.VIEW_EDIT_PAGE_SEARCH_PLACEHOLDER_TEXT) + self._search_filter_line_edit.setMinimumSize(view_size_constants.TABLE_VIEW_PAGE_SEARCH_FILTER_WIDGET_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + interaction_area_layout.addWidget(self._search_filter_line_edit) table_view_vertical_layout.addWidget(interaction_area) self._table_view: ResourceTableView = ResourceTableView(self._table_view_page) - self._table_view.setObjectName("TableView") + self._table_view.setAlternatingRowColors(True) self._table_view.setMaximumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.TABLE_VIEW_PAGE_TABLE_VIEW_AREA_HEIGHT) self._table_view.setSelectionBehavior(QAbstractItemView.SelectRows) self._table_view.setSortingEnabled(True) + self._table_view.verticalHeader().hide() horizontal_header: QHeaderView = self._table_view.horizontalHeader() horizontal_header.setSectionResizeMode(ResourceTableConstants.TABLE_STATE_COLUMN_INDEX, @@ -296,25 +321,50 @@ class ViewEditPage(QWidget): def _setup_footer_area(self) -> None: self._footer_area: QWidget = QWidget(self) - self._footer_area.setObjectName("FooterArea") + self._footer_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self._footer_area.setMinimumSize(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, - view_size_constants.VIEW_EDIT_PAGE_HEADER_FOOTER_AREA_HEIGHT) - + view_size_constants.VIEW_EDIT_PAGE_FOOTER_AREA_HEIGHT) + + footer_area_layout: QHBoxLayout = QHBoxLayout(self._footer_area) + footer_area_layout.setSizeConstraint(QLayout.SetMinimumSize) + footer_area_layout.setContentsMargins( + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM) + + footer_area_spacer: QSpacerItem = QSpacerItem(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT, + QSizePolicy.Expanding, QSizePolicy.Minimum) + footer_area_layout.addItem(footer_area_spacer) + self._save_changes_button: QPushButton = QPushButton(self._footer_area) - self._save_changes_button.setObjectName("SaveChangesButton") - self._save_changes_button.setText("Save Changes") - self._save_changes_button.setGeometry(view_size_constants.SAVE_CHANGES_BUTTON_X, - view_size_constants.VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.SAVE_CHANGES_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) - + self._save_changes_button.setObjectName("Primary") + self._save_changes_button.setText(notification_label_text.VIEW_EDIT_PAGE_SAVE_CHANGES_TEXT) + self._save_changes_button.setMinimumSize(view_size_constants.SAVE_CHANGES_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + footer_area_layout.addWidget(self._save_changes_button) + + self._create_new_button: QPushButton = QPushButton(self._footer_area) + self._create_new_button.setObjectName("Primary") + self._create_new_button.setText(notification_label_text.VIEW_EDIT_PAGE_CREATE_NEW_TEXT) + self._create_new_button.setMinimumSize(view_size_constants.CREATE_NEW_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + footer_area_layout.addWidget(self._create_new_button) + + self._rescan_button: QPushButton = QPushButton(self._footer_area) + self._rescan_button.setObjectName("Secondary") + self._rescan_button.setText(notification_label_text.VIEW_EDIT_PAGE_RESCAN_TEXT) + self._rescan_button.setMinimumSize(view_size_constants.RESCAN_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + footer_area_layout.addWidget(self._rescan_button) + self._cancel_button: QPushButton = QPushButton(self._footer_area) - self._cancel_button.setObjectName("CancelButton") - self._cancel_button.setText("Cancel") - self._cancel_button.setGeometry(view_size_constants.CANCEL_BUTTON_X, - view_size_constants.VIEW_EDIT_PAGE_WIDGET_SUBCOMPONENT_Y, - view_size_constants.CANCEL_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) + self._cancel_button.setObjectName("Secondary") + self._cancel_button.setText(notification_label_text.VIEW_EDIT_PAGE_CANCEL_TEXT) + self._cancel_button.setMinimumSize(view_size_constants.CANCEL_BUTTON_WIDTH, + view_size_constants.INTERACTION_COMPONENT_HEIGHT) + footer_area_layout.addWidget(self._cancel_button) @property def add_row_button(self) -> QPushButton: @@ -350,15 +400,15 @@ class ViewEditPage(QWidget): @property def search_filter_input(self) -> QLineEdit: - return self._search_filter_widget.search_filter_input + return self._search_filter_line_edit @property - def notification_prompt_create_new_button(self) -> QPushButton: - return self._notification_page_prompt.create_new_button + def create_new_button(self) -> QPushButton: + return self._create_new_button @property - def notification_prompt_rescan_button(self) -> QPushButton: - return self._notification_page_prompt.rescan_button + def rescan_button(self) -> QPushButton: + return self._rescan_button def set_current_main_view_index(self, index: int) -> None: """Switch main view page based on given index""" @@ -381,15 +431,18 @@ class ViewEditPage(QWidget): self._config_file_combobox.setItemData(config_index, config_file, Qt.ToolTipRole) config_index += 1 - self._config_file_combobox.lineEdit().setPlaceholderText(f"Found {len(config_files)} config files") + self._config_file_combobox.lineEdit().setPlaceholderText( + notification_label_text.VIEW_EDIT_PAGE_CONFIG_FILES_PLACEHOLDER_TEXT.format(len(config_files))) self._config_file_combobox.setCurrentIndex(-1) if config_files: - self._notification_page_label.setVisible(True) - self._notification_page_prompt.set_visible(False) + self._notification_page_frame.set_text(notification_label_text.VIEW_EDIT_PAGE_SELECT_CONFIG_FILE_MESSAGE) + self._create_new_button.setVisible(False) + self._rescan_button.setVisible(False) else: - self._notification_page_label.setVisible(False) - self._notification_page_prompt.set_visible(True) + self._notification_page_frame.set_text(notification_label_text.VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE) + self._create_new_button.setVisible(True) + self._rescan_button.setVisible(True) self._config_file_combobox.blockSignals(False) @@ -403,13 +456,14 @@ class ViewEditPage(QWidget): self._config_location_text.setToolTip(config_location) def set_notification_page_text(self, text: str) -> None: - self._notification_page_label.setText(text) + self._notification_page_frame.set_text(text) def hide_notification_frame(self) -> None: - self._notification_frame.hide() + self._notification_frame.setVisible(False) def set_notification_frame_text(self, text: str) -> None: self._notification_frame.set_text(text) + self._notification_frame.setVisible(True) def set_table_view_page_interactions_enabled(self, enabled: bool) -> None: self._table_view_page.setEnabled(enabled) diff --git a/Gems/AWSCore/cdk/README.md b/Gems/AWSCore/cdk/README.md index ad4e957c20..c49155a422 100644 --- a/Gems/AWSCore/cdk/README.md +++ b/Gems/AWSCore/cdk/README.md @@ -11,7 +11,7 @@ The `cdk.json` file tells the CDK Toolkit how to execute your app. This project is set up like a standard Python project. The initialization process also creates a virtualenv within this project, stored under the `.env` directory. To create the virtualenv it assumes that there is a `python3` -(or `python` for Windows) executable in your path with access to the `venv` +(or `python` for Windows) (Python 3.7+) executable in your path with access to the `venv` package. If for any reason the automatic creation of the virtualenv fails, you can create the virtualenv manually. @@ -21,7 +21,7 @@ the prerequisites for CDK development. To manually create a virtualenv on MacOS and Linux: ``` -$ python3 -m venv .env +$ python -m venv .env ``` Once the virtualenv is created, you can use the following step to activate your virtualenv. diff --git a/Gems/AWSCore/cdk/architecture.png b/Gems/AWSCore/cdk/architecture.png new file mode 100644 index 0000000000..1d671763c7 --- /dev/null +++ b/Gems/AWSCore/cdk/architecture.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2027a80fce90e2497b1bc675592d3d9e50b00ecdbb375608f79287dbc83fc427 +size 37530 diff --git a/Gems/AWSCore/cdk/cdk.json b/Gems/AWSCore/cdk/cdk.json index 552b09fc19..72938e41b3 100644 --- a/Gems/AWSCore/cdk/cdk.json +++ b/Gems/AWSCore/cdk/cdk.json @@ -1,5 +1,5 @@ { - "app": "python3 app.py", + "app": "python app.py", "context": { "@aws-cdk/core:enableStackNameDuplicates": "true", "aws-cdk:enableDiffNoFail": "true", diff --git a/Gems/AWSCore/cdk/core/core_stack.py b/Gems/AWSCore/cdk/core/core_stack.py index ce0b886e58..7bf8676987 100755 --- a/Gems/AWSCore/cdk/core/core_stack.py +++ b/Gems/AWSCore/cdk/core/core_stack.py @@ -26,7 +26,7 @@ class CoreStack(core.Stack): Defines common resource project and group(s) to use in project """ - # Resource groups cannot start with 'AWS' or 'aws' so preprend this prefix + # Resource groups cannot start with 'AWS' or 'aws' so add this prefix RESOURCE_GROUP_PREFIX = 'O3D' def __init__(self, scope: core.Construct, id_: str, project_name: str, feature_name: str, **kwargs) -> None: diff --git a/Gems/AWSCore/cdk/example/dynamodb_table_seeder.py b/Gems/AWSCore/cdk/example/dynamodb_table_seeder.py index 13e9d6958c..18191bc746 100755 --- a/Gems/AWSCore/cdk/example/dynamodb_table_seeder.py +++ b/Gems/AWSCore/cdk/example/dynamodb_table_seeder.py @@ -23,7 +23,7 @@ import boto3 from boto3.dynamodb.table import TableResource from botocore.exceptions import ClientError -logging.basicConfig(stream=sys.stdout, format="%(asctime)s %(process)d %(levelname)s %(message)s") +logging.basicConfig(stream=sys.stdout, format="%(asctime)s %(process)d %(message)s") logger = logging.getLogger() logger.setLevel(logging.INFO) diff --git a/Gems/AWSMetrics/Code/CMakeLists.txt b/Gems/AWSMetrics/Code/CMakeLists.txt index c9f7d2fecb..ffa9ac0408 100644 --- a/Gems/AWSMetrics/Code/CMakeLists.txt +++ b/Gems/AWSMetrics/Code/CMakeLists.txt @@ -29,7 +29,6 @@ ly_add_target( ly_add_target( NAME AWSMetrics ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} NAMESPACE Gem - OUTPUT_NAME Gem.AWSMetrics.cc6fc7a18fc047039a369a26100fcbbe.0.1.0 FILES_CMAKE awsmetrics_shared_files.cmake INCLUDE_DIRECTORIES diff --git a/Gems/AWSMetrics/Code/Include/Private/AWSMetricsConstant.h b/Gems/AWSMetrics/Code/Include/Private/AWSMetricsConstant.h new file mode 100644 index 0000000000..27c23b36ab --- /dev/null +++ b/Gems/AWSMetrics/Code/Include/Private/AWSMetricsConstant.h @@ -0,0 +1,97 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +namespace AWSMetrics +{ + //! Default metrics attribute keys + static constexpr char AwsMetricsAttributeKeyClientId[] = "application_id"; + static constexpr char AwsMetricsAttributeKeyEventId[] = "event_id"; + static constexpr char AwsMetricsAttributeKeyEventName[] = "event_name"; + static constexpr char AwsMetricsAttributeKeyEventType[] = "event_type"; + static constexpr char AwsMetricsAttributeKeyEventSource[] = "event_source"; + static constexpr char AwsMetricsAttributeKeyEventTimestamp[] = "event_timestamp"; + + static constexpr char AwsMetricsAttributeKeyEventData[] = "event_data"; + + //! Service API request and response object keys + static constexpr char AwsMetricsSuccessResponseRecordKeyErrorCode[] = "error_code"; + static constexpr char AwsMetricsSuccessResponseRecordKeyResult[] = "result"; + static constexpr char AwsMetricsSuccessResponseKeyFailedRecordCount[] = "failed_record_count"; + static constexpr char AwsMetricsSuccessResponseKeyEvents[] = "events"; + static constexpr char AwsMetricsSuccessResponseKeyTotal[] = "total"; + static constexpr char AwsMetricsErrorKeyMessage[] = "message"; + static constexpr char AwsMetricsErrorKeyType[] = "type"; + static constexpr char AwsMetricsRequestParameterKeyEvents[] = "events"; + + static constexpr char AwsMetricsSuccessResponseRecordResult[] = "Ok"; + + //! Service API limits + //! https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html + static constexpr int AwsMetricsMaxRestApiPayloadSizeInMb = 10; + //! https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html + static constexpr int AwsMetricsMaxKinesisBatchedRecordCount = 500; + + //! Metrics event JSON schema + static constexpr const char AwsMetricsEventJsonSchema[] = + R"({ + "$schema": "http://json-schema.org/draft-04/schema", + "title": "AWSMetrics API Event Schema", + "description": "Metrics Event sent to the service API", + "type": "object", + "additionalProperties": false, + "properties": { + "application_id": { + "type": "string", + "pattern": "^[0-9-.]+-\\{[0-9A-F]{8}-[0-9A-F]{4}-[1-5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\\}$", + "description": "Identifier for the application that generated the event." + }, + "event_id": { + "type": "string", + "pattern": "^\\{[0-9A-F]{8}-[0-9A-F]{4}-[1-5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\\}$", + "description": "A random UUID that uniquely identifies an event." + }, + "event_type": { + "type": "string", + "pattern": "^[A-Za-z0-9-_.]+$", + "description": "Identifies the type of event." + }, + "event_name": { + "type": "string", + "pattern": "^[A-Za-z0-9-_.]+$", + "description": "Name of the event that occurred." + }, + "event_timestamp": { + "type": "string", + "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2})\\:(\\d{2})\\:(\\d{2})Z$", + "description": "Timestamp of the event in the UTC ISO8601 format." + }, + "event_version": { + "type": "string", + "pattern": "^[A-Za-z0-9-_.]+$", + "description": "An API version for this event format." + }, + "event_source": { + "type": "string", + "pattern": "^[A-Za-z0-9-_.]+$", + "description": "Source of the event." + }, + "event_data": { + "type": "object", + "description": "Custom metrics attributes defined by this event." + } + }, + "required": [ "application_id", "event_id", "event_name", "event_timestamp" ] + })"; + +} diff --git a/Gems/AWSMetrics/Code/Include/Private/AWSMetricsModule.h b/Gems/AWSMetrics/Code/Include/Private/AWSMetricsModule.h new file mode 100644 index 0000000000..fd8ff2e9a2 --- /dev/null +++ b/Gems/AWSMetrics/Code/Include/Private/AWSMetricsModule.h @@ -0,0 +1,33 @@ +/* +* All or portions of this file Copyright(c) Amazon.com, Inc.or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +*/ + +#pragma once + +#include + +namespace AWSMetrics +{ + class AWSMetricsModule + : public AZ::Module + { + public: + AZ_RTTI(AWSMetricsModule, "{A36566F3-E144-4188-A7E0-BAB45BCEA55F}", AZ::Module); + AZ_CLASS_ALLOCATOR(AWSMetricsModule, AZ::SystemAllocator, 0); + + AWSMetricsModule(); + ~AWSMetricsModule() override = default; + /** + * Add required SystemComponents to the SystemEntity. + */ + virtual AZ::ComponentTypeList GetRequiredSystemComponents() const override; + }; +} + diff --git a/Gems/AWSMetrics/Code/Include/Private/ClientConfiguration.h b/Gems/AWSMetrics/Code/Include/Private/ClientConfiguration.h index 251bc8e6c5..df486a46c1 100644 --- a/Gems/AWSMetrics/Code/Include/Private/ClientConfiguration.h +++ b/Gems/AWSMetrics/Code/Include/Private/ClientConfiguration.h @@ -15,8 +15,8 @@ namespace AWSMetrics { - constexpr char metricsDir[] = "@user@/AWSMetrics/"; - constexpr char metricsFileName[] = "metrics.json"; + constexpr char AwsMetricsLocalFileDir[] = "@user@/AWSMetrics/"; + constexpr char AwsMetricsLocalFileName[] = "metrics.json"; //! ClientConfiguration is used to retrieve and store client settings from a local configuration JSON file. class ClientConfiguration diff --git a/Gems/AWSMetrics/Code/Include/Private/MetricsManager.h b/Gems/AWSMetrics/Code/Include/Private/MetricsManager.h index 394d6ac333..28c8c3d762 100644 --- a/Gems/AWSMetrics/Code/Include/Private/MetricsManager.h +++ b/Gems/AWSMetrics/Code/Include/Private/MetricsManager.h @@ -32,7 +32,7 @@ namespace AWSMetrics class MetricsManager { public: - static const unsigned int desiredMaxWorkers = 2; + static const unsigned int DesiredMaxWorkers = 2; MetricsManager(); ~MetricsManager(); diff --git a/Gems/AWSMetrics/Code/Include/Private/MetricsQueue.h b/Gems/AWSMetrics/Code/Include/Private/MetricsQueue.h index d4af7929ac..87c8720e5d 100644 --- a/Gems/AWSMetrics/Code/Include/Private/MetricsQueue.h +++ b/Gems/AWSMetrics/Code/Include/Private/MetricsQueue.h @@ -71,8 +71,6 @@ namespace AWSMetrics //! @return Whether the metrics queue is created successfully. bool ReadFromJson(const AZStd::string& filePath); - bool ReadFromString(const AZStd::string& string); - private: bool ReadFromJsonDocument(rapidjson::Document& doc); diff --git a/Gems/AWSMetrics/Code/Include/Public/AWSMetricsConstant.h b/Gems/AWSMetrics/Code/Include/Public/AWSMetricsConstant.h deleted file mode 100644 index df9ba1f3ce..0000000000 --- a/Gems/AWSMetrics/Code/Include/Public/AWSMetricsConstant.h +++ /dev/null @@ -1,97 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -namespace AWSMetrics -{ - //! Default metrics attribute keys - static constexpr char METRICS_ATTRIBUTE_KEY_CLIENT_ID[] = "application_id"; - static constexpr char METRICS_ATTRIBUTE_KEY_EVENT_ID[] = "event_id"; - static constexpr char METRICS_ATTRIBUTE_KEY_EVENT_NAME[] = "event_name"; - static constexpr char METRICS_ATTRIBUTE_KEY_EVENT_TYPE[] = "event_type"; - static constexpr char METRICS_ATTRIBUTE_KEY_EVENT_SOURCE[] = "event_source"; - static constexpr char METRICS_ATTRIBUTE_KEY_EVENT_TIMESTAMP[] = "event_timestamp"; - - static constexpr char METRICS_ATTRIBUTE_KEY_EVENT_DATA[] = "event_data"; - - //! Service API request and response object keys - static constexpr char SUCCESS_RESPONSE_RECORD_KEY_ERROR_CODE[] = "error_code"; - static constexpr char SUCCESS_RESPONSE_RECORD_KEY_RESULT[] = "result"; - static constexpr char SUCCESS_RESPONSE_KEY_FAILED_RECORD_COUNT[] = "failed_record_count"; - static constexpr char SUCCESS_RESPONSE_KEY_EVENTS[] = "events"; - static constexpr char SUCCESS_RESPONSE_KEY_TOTAL[] = "total"; - static constexpr char ERROR_KEY_MESSAGE[] = "message"; - static constexpr char ERROR_KEY_TYPE[] = "type"; - static constexpr char REQUEST_PARAMETER_KEY_EVENTS[] = "events"; - - static constexpr char SUCCESS_RESPONSE_RECORD_RESULT[] = "Ok"; - - //! Service API limits - //! https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html - static constexpr int MAX_REST_API_PAYLOAD_SIZE_IN_MB = 10; - //! https://docs.aws.amazon.com/firehose/latest/APIReference/API_PutRecordBatch.html - static constexpr int MAX_FIREHOSE_BATCHED_RECORDS_COUNT = 500; - - //! Metrics event JSON schema - static constexpr const char METRICS_EVENT_JSON_SCHEMA[] = - R"({ - "$schema": "http://json-schema.org/draft-04/schema", - "title": "AWSMetrics API Event Schema", - "description": "Metrics Event sent to the service API", - "type": "object", - "additionalProperties": false, - "properties": { - "application_id": { - "type": "string", - "pattern": "^[0-9-.]+-\\{[0-9A-F]{8}-[0-9A-F]{4}-[1-5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\\}$", - "description": "Identifier for the application that generated the event." - }, - "event_id": { - "type": "string", - "pattern": "^\\{[0-9A-F]{8}-[0-9A-F]{4}-[1-5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\\}$", - "description": "A random UUID that uniquely identifies an event." - }, - "event_type": { - "type": "string", - "pattern": "^[A-Za-z0-9-_.]+$", - "description": "Identifies the type of event." - }, - "event_name": { - "type": "string", - "pattern": "^[A-Za-z0-9-_.]+$", - "description": "Name of the event that occurred." - }, - "event_timestamp": { - "type": "string", - "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2})\\:(\\d{2})\\:(\\d{2})Z$", - "description": "Timestamp of the event in the UTC ISO8601 format." - }, - "event_version": { - "type": "string", - "pattern": "^[A-Za-z0-9-_.]+$", - "description": "An API version for this event format." - }, - "event_source": { - "type": "string", - "pattern": "^[A-Za-z0-9-_.]+$", - "description": "Source of the event." - }, - "event_data": { - "type": "object", - "description": "Custom metrics attributes defined by this event." - } - }, - "required": [ "application_id", "event_id", "event_name", "event_timestamp" ] - })"; - -} diff --git a/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp b/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp index bc9326f0e4..4967202483 100644 --- a/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp +++ b/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp @@ -9,36 +9,24 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +#include + #include #include namespace AWSMetrics { - class AWSMetricsModule - : public AZ::Module + AWSMetricsModule::AWSMetricsModule() + : AZ::Module() { - public: - AZ_RTTI(AWSMetricsModule, "{A36566F3-E144-4188-A7E0-BAB45BCEA55F}", AZ::Module); - - AWSMetricsModule() - : AZ::Module() - { - // Push results of [MyComponent]::CreateDescriptor() into m_descriptors here. - m_descriptors.insert(m_descriptors.end(), { - AWSMetricsSystemComponent::CreateDescriptor() - }); - } + // Push results of [MyComponent]::CreateDescriptor() into m_descriptors here. + m_descriptors.insert(m_descriptors.end(), {AWSMetricsSystemComponent::CreateDescriptor()}); + } - /** - * Add required SystemComponents to the SystemEntity. - */ - AZ::ComponentTypeList GetRequiredSystemComponents() const - { - return AZ::ComponentTypeList{ - azrtti_typeid() - }; - } - }; + AZ::ComponentTypeList AWSMetricsModule::GetRequiredSystemComponents() const + { + return AZ::ComponentTypeList{azrtti_typeid()}; + } } // DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM diff --git a/Gems/AWSMetrics/Code/Source/AWSMetricsServiceApi.cpp b/Gems/AWSMetrics/Code/Source/AWSMetricsServiceApi.cpp index 0b2ff9ef57..16e9436b5b 100644 --- a/Gems/AWSMetrics/Code/Source/AWSMetricsServiceApi.cpp +++ b/Gems/AWSMetrics/Code/Source/AWSMetricsServiceApi.cpp @@ -21,29 +21,29 @@ namespace AWSMetrics { bool MetricsEventSuccessResponseRecord::OnJsonKey(const char* key, AWSCore::JsonReader& reader) { - if (strcmp(key, SUCCESS_RESPONSE_RECORD_KEY_ERROR_CODE) == 0) return reader.Accept(errorCode); + if (strcmp(key, AwsMetricsSuccessResponseRecordKeyErrorCode) == 0) return reader.Accept(errorCode); - if (strcmp(key, SUCCESS_RESPONSE_RECORD_KEY_RESULT) == 0) return reader.Accept(result); + if (strcmp(key, AwsMetricsSuccessResponseRecordKeyResult) == 0) return reader.Accept(result); return reader.Ignore(); } bool MetricsEventSuccessResponse::OnJsonKey(const char* key, AWSCore::JsonReader& reader) { - if (strcmp(key, SUCCESS_RESPONSE_KEY_FAILED_RECORD_COUNT) == 0) return reader.Accept(failedRecordCount); + if (strcmp(key, AwsMetricsSuccessResponseKeyFailedRecordCount) == 0) return reader.Accept(failedRecordCount); - if (strcmp(key, SUCCESS_RESPONSE_KEY_EVENTS) == 0) return reader.Accept(events); + if (strcmp(key, AwsMetricsSuccessResponseKeyEvents) == 0) return reader.Accept(events); - if (strcmp(key, SUCCESS_RESPONSE_KEY_TOTAL) == 0) return reader.Accept(total); + if (strcmp(key, AwsMetricsSuccessResponseKeyTotal) == 0) return reader.Accept(total); return reader.Ignore(); } bool Error::OnJsonKey(const char* key, AWSCore::JsonReader& reader) { - if (strcmp(key, ERROR_KEY_MESSAGE) == 0) return reader.Accept(message); + if (strcmp(key, AwsMetricsErrorKeyMessage) == 0) return reader.Accept(message); - if (strcmp(key, ERROR_KEY_TYPE) == 0) return reader.Accept(type); + if (strcmp(key, AwsMetricsErrorKeyType) == 0) return reader.Accept(type); return reader.Ignore(); } @@ -63,7 +63,7 @@ namespace AWSMetrics ok = ok && writer.StartObject(); - ok = ok && writer.Key(REQUEST_PARAMETER_KEY_EVENTS); + ok = ok && writer.Key(AwsMetricsRequestParameterKeyEvents); ok = ok && data.SerializeToJson(writer); ok = ok && writer.EndObject(); diff --git a/Gems/AWSMetrics/Code/Source/AWSMetricsSystemComponent.cpp b/Gems/AWSMetrics/Code/Source/AWSMetricsSystemComponent.cpp index 1a7b9e2231..96ca57d00e 100644 --- a/Gems/AWSMetrics/Code/Source/AWSMetricsSystemComponent.cpp +++ b/Gems/AWSMetrics/Code/Source/AWSMetricsSystemComponent.cpp @@ -145,10 +145,10 @@ namespace AWSMetrics const GlobalStatistics& stats = m_metricsManager->GetGlobalStatistics(); - AZ_Printf("AWSMetrics", "Total number of metrics events sent to the backend: %u", stats.m_numEvents.load()); - AZ_Printf("AWSMetrics", "Total number of metrics events sent to the backend successfully: %u", stats.m_numSuccesses.load()); - AZ_Printf("AWSMetrics", "Total size of metrics events sent to the backend successfully: %u bytes", stats.m_sendSizeInBytes.load()); - AZ_Printf("AWSMetrics", "Total number of metrics events failed to be processed by the backend: %u", stats.m_numErrors.load()); + AZ_Printf("AWSMetrics", "Total number of metrics events sent to the backend/local file: %u", stats.m_numEvents.load()); + AZ_Printf("AWSMetrics", "Total number of metrics events sent to the backend/local file successfully: %u", stats.m_numSuccesses.load()); + AZ_Printf("AWSMetrics", "Total size of metrics events sent to the backend/local file successfully: %u bytes", stats.m_sendSizeInBytes.load()); + AZ_Printf("AWSMetrics", "Total number of metrics events failed to be sent to the backend/local file: %u", stats.m_numErrors.load()); AZ_Printf("AWSMetrics", "Total number of metrics events which failed the JSON schema validation or reached the maximum number of retries : %u", stats.m_numDropped.load()); } diff --git a/Gems/AWSMetrics/Code/Source/ClientConfiguration.cpp b/Gems/AWSMetrics/Code/Source/ClientConfiguration.cpp index 27b4178df9..626b91669d 100644 --- a/Gems/AWSMetrics/Code/Source/ClientConfiguration.cpp +++ b/Gems/AWSMetrics/Code/Source/ClientConfiguration.cpp @@ -78,14 +78,14 @@ namespace AWSMetrics } char resolvedPath[AZ_MAX_PATH_LEN] = { 0 }; - if (!fileIO->ResolvePath(metricsDir, resolvedPath, AZ_MAX_PATH_LEN)) + if (!fileIO->ResolvePath(AwsMetricsLocalFileDir, resolvedPath, AZ_MAX_PATH_LEN)) { AZ_Error("AWSMetrics", false, "Failed to resolve the metrics file directory"); return false; } m_metricsDir = resolvedPath; - if (!AzFramework::StringFunc::Path::Join(resolvedPath, metricsFileName, m_metricsFilePath)) + if (!AzFramework::StringFunc::Path::Join(resolvedPath, AwsMetricsLocalFileName, m_metricsFilePath)) { AZ_Error("AWSMetrics", false, "Failed to construct the metrics file path"); return false; diff --git a/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp b/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp index 80ebea5dc3..fa0f6db9aa 100644 --- a/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp +++ b/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp @@ -26,8 +26,8 @@ namespace AWSMetrics AZStd::string IdentityProvider::GetEngineVersion() { - static constexpr const char* ENGINE_CONFIG_FILE_PATH = "@root@/engine.json"; - static constexpr const char* ENGINE_VERSION_JSON_KEY = "LumberyardVersion"; + static constexpr const char* EngineConfigFilePath = "@root@/engine.json"; + static constexpr const char* EngineVersionJsonKey = "LumberyardVersion"; AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetDirectInstance(); if (!fileIO) @@ -37,7 +37,7 @@ namespace AWSMetrics } char resolvedPath[AZ_MAX_PATH_LEN] = { 0 }; - if (!fileIO->ResolvePath(ENGINE_CONFIG_FILE_PATH, resolvedPath, AZ_MAX_PATH_LEN)) + if (!fileIO->ResolvePath(EngineConfigFilePath, resolvedPath, AZ_MAX_PATH_LEN)) { AZ_Error("AWSMetrics", false, "Failed to resolve the engine config file directory"); return ""; @@ -52,7 +52,7 @@ namespace AWSMetrics } rapidjson_ly::Document& jsonDoc = readOutcome.GetValue(); - auto memberIt = jsonDoc.FindMember(ENGINE_VERSION_JSON_KEY); + auto memberIt = jsonDoc.FindMember(EngineVersionJsonKey); if (memberIt != jsonDoc.MemberEnd()) { return memberIt->value.GetString(); diff --git a/Gems/AWSMetrics/Code/Source/MetricsAttribute.cpp b/Gems/AWSMetrics/Code/Source/MetricsAttribute.cpp index 349e0319ce..356f0abca8 100644 --- a/Gems/AWSMetrics/Code/Source/MetricsAttribute.cpp +++ b/Gems/AWSMetrics/Code/Source/MetricsAttribute.cpp @@ -53,9 +53,9 @@ namespace AWSMetrics { static const AZStd::array DefaultAttributeNames = { - METRICS_ATTRIBUTE_KEY_CLIENT_ID, METRICS_ATTRIBUTE_KEY_EVENT_ID, - METRICS_ATTRIBUTE_KEY_EVENT_NAME, METRICS_ATTRIBUTE_KEY_EVENT_TYPE, - METRICS_ATTRIBUTE_KEY_EVENT_SOURCE, METRICS_ATTRIBUTE_KEY_EVENT_TIMESTAMP + AwsMetricsAttributeKeyClientId, AwsMetricsAttributeKeyEventId, + AwsMetricsAttributeKeyEventName, AwsMetricsAttributeKeyEventType, + AwsMetricsAttributeKeyEventSource, AwsMetricsAttributeKeyEventTimestamp }; m_isDefault = AZStd::find(DefaultAttributeNames.begin(), DefaultAttributeNames.end(), name) != DefaultAttributeNames.end(); diff --git a/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp b/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp index e9f5f39578..f2754b0d47 100644 --- a/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp +++ b/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp @@ -92,7 +92,7 @@ namespace AWSMetrics if (customAttributes.size() > 0) { // Wrap up the cutom event attributes in a separate event_data field - ok = ok && writer.Key(METRICS_ATTRIBUTE_KEY_EVENT_DATA); + ok = ok && writer.Key(AwsMetricsAttributeKeyEventData); ok = ok && writer.StartObject(); for (const auto& attr : customAttributes) { @@ -117,7 +117,7 @@ namespace AWSMetrics int attributeIndex = 0; for (auto it = metricsObjVal.MemberBegin(); it != metricsObjVal.MemberEnd(); ++it, ++attributeIndex) { - if (strcmp(it->name.GetString(), METRICS_ATTRIBUTE_KEY_EVENT_DATA) == 0) + if (strcmp(it->name.GetString(), AwsMetricsAttributeKeyEventData) == 0) { // The event_data field contains a flat json dictionary. // Read the JSON value of this field to add all the custom metrics attributes. @@ -161,7 +161,7 @@ namespace AWSMetrics } rapidjson::Document jsonSchemaDocument; - if (jsonSchemaDocument.Parse(METRICS_EVENT_JSON_SCHEMA).HasParseError()) + if (jsonSchemaDocument.Parse(AwsMetricsEventJsonSchema).HasParseError()) { AZ_Error("AWSMetrics", false, "Invalid metrics event json schema."); return false; diff --git a/Gems/AWSMetrics/Code/Source/MetricsEventBuilder.cpp b/Gems/AWSMetrics/Code/Source/MetricsEventBuilder.cpp index dc6cc0c42f..d01fccfd08 100644 --- a/Gems/AWSMetrics/Code/Source/MetricsEventBuilder.cpp +++ b/Gems/AWSMetrics/Code/Source/MetricsEventBuilder.cpp @@ -41,19 +41,19 @@ namespace AWSMetrics void MetricsEventBuilder::AddClientIdAttribute(const AZStd::string& clientId) { - m_currentMetricsEvent.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_CLIENT_ID, clientId)); + m_currentMetricsEvent.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyClientId, clientId)); } void MetricsEventBuilder::AddEventIdAttribute() { AZ::Uuid eventId = AZ::Uuid::Create(); - m_currentMetricsEvent.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_ID, eventId.ToString())); + m_currentMetricsEvent.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventId, eventId.ToString())); } void MetricsEventBuilder::AddSourceAttribute(const AZStd::string& eventSourceOverride) { AZStd::string eventSource = eventSourceOverride.empty() ? DefaultMetricsSource : eventSourceOverride; - m_currentMetricsEvent.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_SOURCE, eventSource)); + m_currentMetricsEvent.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventSource, eventSource)); } void MetricsEventBuilder::AddTimestampAttribute() @@ -64,7 +64,7 @@ namespace AWSMetrics char buffer[50]; strftime(buffer, sizeof(buffer), "%FT%TZ", gmtime(&now)); - m_currentMetricsEvent.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_TIMESTAMP, AZStd::string(buffer))); + m_currentMetricsEvent.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventTimestamp, AZStd::string(buffer))); } MetricsEventBuilder& MetricsEventBuilder::AddMetricsAttributes(const AZStd::vector& attributes) diff --git a/Gems/AWSMetrics/Code/Source/MetricsManager.cpp b/Gems/AWSMetrics/Code/Source/MetricsManager.cpp index 04e8f03f94..2f4f1fb5e5 100644 --- a/Gems/AWSMetrics/Code/Source/MetricsManager.cpp +++ b/Gems/AWSMetrics/Code/Source/MetricsManager.cpp @@ -84,7 +84,7 @@ namespace AWSMetrics void MetricsManager::SetupJobContext() { // Avoid using the default job context since we will do blocking IO instead of CPU/memory intensive work - unsigned int numWorkerThreads = AZ::GetMin(desiredMaxWorkers, AZStd::thread::hardware_concurrency()); + unsigned int numWorkerThreads = AZ::GetMin(DesiredMaxWorkers, AZStd::thread::hardware_concurrency()); AZ::JobManagerDesc jobDesc; AZ::JobManagerThreadDesc threadDesc; @@ -147,13 +147,13 @@ namespace AWSMetrics else { // Constant used to convert size limit from MB to Bytes. - static constexpr int MB_TO_BYTES = 1000000; + static constexpr int MbToBytes = 1000000; while (metricsQueue->GetNumMetrics() > 0) { // Break the metrics queue by the payload and records count limits. Make one or more service API requests to send all the buffered metrics. MetricsQueue metricsEventsToProcess; - metricsQueue->PopBufferedEventsByServiceLimits(metricsEventsToProcess, MAX_REST_API_PAYLOAD_SIZE_IN_MB * MB_TO_BYTES, MAX_FIREHOSE_BATCHED_RECORDS_COUNT); + metricsQueue->PopBufferedEventsByServiceLimits(metricsEventsToProcess, AwsMetricsMaxRestApiPayloadSizeInMb * MbToBytes, AwsMetricsMaxKinesisBatchedRecordCount); SendMetricsToServiceApiAsync(metricsEventsToProcess); } @@ -179,7 +179,7 @@ namespace AWSMetrics for (int index = 0; index < numMetricsEventsInRequest; ++index) { ServiceAPI::MetricsEventSuccessResponseRecord responseRecord; - responseRecord.result = SUCCESS_RESPONSE_RECORD_RESULT; + responseRecord.result = AwsMetricsSuccessResponseRecordResult; responseRecords.emplace_back(responseRecord); } @@ -244,7 +244,7 @@ namespace AWSMetrics { MetricsEvent metricsEvent = metricsEventsInRequest[index]; - if (responseRecords.size() > 0 && responseRecords[index].result == SUCCESS_RESPONSE_RECORD_RESULT) + if (responseRecords.size() > 0 && responseRecords[index].result == AwsMetricsSuccessResponseRecordResult) { // The metrics event is sent to the backend successfully. if (metricsEvent.GetNumFailures() == 0) @@ -304,8 +304,6 @@ namespace AWSMetrics AZ::Outcome MetricsManager::SendMetricsToFile(AZStd::shared_ptr metricsQueue) { - AZStd::string serializedPayload = metricsQueue->SerializeToJson(); - AZStd::lock_guard lock(m_metricsFileMutex); AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetDirectInstance(); @@ -330,7 +328,10 @@ namespace AWSMetrics return AZ::Failure(AZStd::string{ "Failed to create metrics directory" }); } - existingMetricsEvents.ReadFromString(serializedPayload); + // Append a copy of the metrics queue in the request to the existing metrics events and keep the original submission order. + // Do not modify the metrics queue in the request directly for identifying the metrics events for retry on failure. + MetricsQueue metricsEventsInRequest = *metricsQueue; + existingMetricsEvents.AppendMetrics(metricsEventsInRequest); AZStd::string serializedMetrics = existingMetricsEvents.SerializeToJson(); AZ::IO::HandleType fileHandle; diff --git a/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp b/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp index f43426ae52..ff22d40956 100644 --- a/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp +++ b/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp @@ -234,16 +234,4 @@ namespace AWSMetrics return true; } - - bool MetricsQueue::ReadFromString(const AZStd::string& string) - { - auto result = AzFramework::FileFunc::ReadJsonFromString(string); - if (!result.IsSuccess() || !ReadFromJsonDocument(result.GetValue())) - { - AZ_Error("AWSMetrics", false, "The provided JSON string is invalid."); - return false; - } - - return true; - } } diff --git a/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp b/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp index e83774a62e..8b37402cb0 100644 --- a/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp +++ b/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp @@ -51,8 +51,8 @@ namespace AWSMetrics EXPECT_CALL(JsonReader, Accept(responseRecord.errorCode)).Times(1); EXPECT_CALL(JsonReader, Ignore()).Times(1); - responseRecord.OnJsonKey(SUCCESS_RESPONSE_RECORD_KEY_RESULT, JsonReader); - responseRecord.OnJsonKey(SUCCESS_RESPONSE_RECORD_KEY_ERROR_CODE, JsonReader); + responseRecord.OnJsonKey(AwsMetricsSuccessResponseRecordKeyResult, JsonReader); + responseRecord.OnJsonKey(AwsMetricsSuccessResponseRecordKeyErrorCode, JsonReader); responseRecord.OnJsonKey("other", JsonReader); } @@ -72,9 +72,9 @@ namespace AWSMetrics EXPECT_CALL(JsonReader, Accept(::testing::An())).Times(1); EXPECT_CALL(JsonReader, Ignore()).Times(1); - response.OnJsonKey(SUCCESS_RESPONSE_KEY_FAILED_RECORD_COUNT, JsonReader); - response.OnJsonKey(SUCCESS_RESPONSE_KEY_TOTAL, JsonReader); - response.OnJsonKey(SUCCESS_RESPONSE_KEY_EVENTS, JsonReader); + response.OnJsonKey(AwsMetricsSuccessResponseKeyFailedRecordCount, JsonReader); + response.OnJsonKey(AwsMetricsSuccessResponseKeyTotal, JsonReader); + response.OnJsonKey(AwsMetricsSuccessResponseKeyEvents, JsonReader); response.OnJsonKey("other", JsonReader); } @@ -88,8 +88,8 @@ namespace AWSMetrics EXPECT_CALL(JsonReader, Accept(error.type)).Times(1); EXPECT_CALL(JsonReader, Ignore()).Times(1); - error.OnJsonKey(ERROR_KEY_MESSAGE, JsonReader); - error.OnJsonKey(ERROR_KEY_TYPE, JsonReader); + error.OnJsonKey(AwsMetricsErrorKeyMessage, JsonReader); + error.OnJsonKey(AwsMetricsErrorKeyType, JsonReader); error.OnJsonKey("other", JsonReader); } @@ -107,6 +107,6 @@ namespace AWSMetrics AZStd::string bodyString; std::istreambuf_iterator eos; bodyString = AZStd::string{ std::istreambuf_iterator(*bodyContent), eos }; - EXPECT_TRUE(bodyString.find(AZStd::string::format("{\"%s\":[{\"event_timestamp\":", REQUEST_PARAMETER_KEY_EVENTS)) != AZStd::string::npos); + EXPECT_TRUE(bodyString.find(AZStd::string::format("{\"%s\":[{\"event_timestamp\":", AwsMetricsRequestParameterKeyEvents)) != AZStd::string::npos); } } diff --git a/Gems/AWSMetrics/Code/Tests/MetricsAttributeTest.cpp b/Gems/AWSMetrics/Code/Tests/MetricsAttributeTest.cpp index bb9d41aeb5..1aef2840d7 100644 --- a/Gems/AWSMetrics/Code/Tests/MetricsAttributeTest.cpp +++ b/Gems/AWSMetrics/Code/Tests/MetricsAttributeTest.cpp @@ -21,21 +21,21 @@ namespace AWSMetrics : public UnitTest::ScopedAllocatorSetupFixture { public: - const AZStd::string attrName = "name"; - const AZStd::string strValue = "value"; - const int intValue = 0; - const double doubleValue = 0.01; + const AZStd::string AttrName = "name"; + const AZStd::string StrValue = "value"; + const int IntValue = 0; + const double DoubleValue = 0.01; }; TEST_F(MetricsAttributeTest, SetAttributeName_DefaultConstructor_Success) { MetricsAttribute attribute; - attribute.SetName(attrName.c_str()); + attribute.SetName(AttrName.c_str()); - ASSERT_EQ(attribute.GetName(), attrName); + ASSERT_EQ(attribute.GetName(), AttrName); ASSERT_FALSE(attribute.IsDefault()); - attribute.SetName(METRICS_ATTRIBUTE_KEY_EVENT_NAME); + attribute.SetName(AwsMetricsAttributeKeyEventName); ASSERT_TRUE(attribute.IsDefault()); } @@ -43,26 +43,26 @@ namespace AWSMetrics { MetricsAttribute attribute; - attribute.SetVal(strValue); - ASSERT_EQ(AZStd::get(attribute.GetVal()), strValue); + attribute.SetVal(StrValue); + ASSERT_EQ(AZStd::get(attribute.GetVal()), StrValue); - attribute.SetVal(intValue); - ASSERT_EQ(AZStd::get(attribute.GetVal()), intValue); + attribute.SetVal(IntValue); + ASSERT_EQ(AZStd::get(attribute.GetVal()), IntValue); - attribute.SetVal(doubleValue); - ASSERT_EQ(AZStd::get(attribute.GetVal()), doubleValue); + attribute.SetVal(DoubleValue); + ASSERT_EQ(AZStd::get(attribute.GetVal()), DoubleValue); } TEST_F(MetricsAttributeTest, GetSizeInBytes_SupportedAttributeTypes_Success) { - MetricsAttribute strAttr(attrName, strValue); - ASSERT_EQ(strAttr.GetSizeInBytes(), sizeof(char) * (attrName.size() + strValue.size())); + MetricsAttribute strAttr(AttrName, StrValue); + ASSERT_EQ(strAttr.GetSizeInBytes(), sizeof(char) * (AttrName.size() + StrValue.size())); - MetricsAttribute intAttr(attrName, intValue); - ASSERT_EQ(intAttr.GetSizeInBytes(), sizeof(char) * attrName.size() + sizeof(int)); + MetricsAttribute intAttr(AttrName, IntValue); + ASSERT_EQ(intAttr.GetSizeInBytes(), sizeof(char) * AttrName.size() + sizeof(int)); - MetricsAttribute doubleAttr(attrName, doubleValue); - ASSERT_EQ(doubleAttr.GetSizeInBytes(), sizeof(char) * attrName.size() + sizeof(double)); + MetricsAttribute doubleAttr(AttrName, DoubleValue); + ASSERT_EQ(doubleAttr.GetSizeInBytes(), sizeof(char) * AttrName.size() + sizeof(double)); } TEST_F(MetricsAttributeTest, SerializeToJson_SupportedAttributeTypes_Success) @@ -74,15 +74,15 @@ namespace AWSMetrics AWSCore::JsonWriter doubleWriter{ jsonStream }; MetricsAttribute attribute; - attribute.SetName(attrName.c_str()); + attribute.SetName(AttrName.c_str()); - attribute.SetVal(strValue); + attribute.SetVal(StrValue); ASSERT_TRUE(attribute.SerializeToJson(strWriter)); - attribute.SetVal(intValue); + attribute.SetVal(IntValue); ASSERT_TRUE(attribute.SerializeToJson(intWriter)); - attribute.SetVal(doubleValue); + attribute.SetVal(DoubleValue); ASSERT_TRUE(attribute.SerializeToJson(doubleWriter)); } @@ -91,13 +91,13 @@ namespace AWSMetrics MetricsAttribute attribute; rapidjson::Value nameVal(rapidjson::kStringType); - nameVal.SetString(rapidjson::StringRef(attrName.c_str())); + nameVal.SetString(rapidjson::StringRef(AttrName.c_str())); rapidjson::Value strVal(rapidjson::kStringType); - nameVal.SetString(rapidjson::StringRef(strValue.c_str())); + nameVal.SetString(rapidjson::StringRef(StrValue.c_str())); rapidjson::Value intVal(rapidjson::kNumberType); - intVal.SetInt(intValue); + intVal.SetInt(IntValue); rapidjson::Value doubleVal(rapidjson::kNumberType); - doubleVal.SetDouble(doubleValue); + doubleVal.SetDouble(DoubleValue); ASSERT_TRUE(attribute.ReadFromJson(nameVal, strVal)); ASSERT_EQ(attribute.GetName(), nameVal.GetString()); @@ -115,7 +115,7 @@ namespace AWSMetrics MetricsAttribute attribute; rapidjson::Value nameVal(rapidjson::kStringType); - nameVal.SetString(rapidjson::StringRef(attrName.c_str())); + nameVal.SetString(rapidjson::StringRef(AttrName.c_str())); rapidjson::Value arrayVal(rapidjson::kArrayType); ASSERT_FALSE(attribute.ReadFromJson(nameVal, arrayVal)); diff --git a/Gems/AWSMetrics/Code/Tests/MetricsEventBuilderTest.cpp b/Gems/AWSMetrics/Code/Tests/MetricsEventBuilderTest.cpp index bddc4155c2..a17eaf3df8 100644 --- a/Gems/AWSMetrics/Code/Tests/MetricsEventBuilderTest.cpp +++ b/Gems/AWSMetrics/Code/Tests/MetricsEventBuilderTest.cpp @@ -21,11 +21,11 @@ namespace AWSMetrics { public: //! Default attributes include client id, timestamp, event id and event source. - const int numDefaultMetrics = 4; - const int numProvidedMetrics = 10; - const AZStd::string attrName = "name"; - const AZStd::string attrValue = "value"; - const AZStd::string fakeClientId = "FakeClientId"; + const int NumDefaultMetrics = 4; + const int NumProvidedMetrics = 10; + const AZStd::string AttrName = "name"; + const AZStd::string AttrValue = "value"; + const AZStd::string FakeClientId = "fakeClientId"; void SetUp() override { @@ -45,23 +45,23 @@ namespace AWSMetrics TEST_F(MetricsEventBuilderTest, BuildMetricsEvent_DefaultAttributes_Success) { - MetricsEvent metricsEvent = m_metricsEventBuilder->AddDefaultMetricsAttributes(fakeClientId).Build(); + MetricsEvent metricsEvent = m_metricsEventBuilder->AddDefaultMetricsAttributes(FakeClientId).Build(); - ASSERT_EQ(metricsEvent.GetNumAttributes(), numDefaultMetrics); + ASSERT_EQ(metricsEvent.GetNumAttributes(), NumDefaultMetrics); } TEST_F(MetricsEventBuilderTest, BuildMetricsEvent_ProvidedAttributes_Success) { AZStd::vector metricsAttributes; - for (int index = 0; index < numProvidedMetrics; ++index) + for (int index = 0; index < NumProvidedMetrics; ++index) { - metricsAttributes.emplace_back(MetricsAttribute(AZStd::string::format("%s%i", attrName.c_str(), index), attrValue)); + metricsAttributes.emplace_back(MetricsAttribute(AZStd::string::format("%s%i", AttrName.c_str(), index), AttrValue)); } MetricsEvent metricsEvent = m_metricsEventBuilder->AddMetricsAttributes(metricsAttributes).Build(); // Timestamp attribute will be added during creation automatically. - ASSERT_EQ(metricsEvent.GetNumAttributes(), numProvidedMetrics + 1); + ASSERT_EQ(metricsEvent.GetNumAttributes(), NumProvidedMetrics + 1); } TEST_F(MetricsEventBuilderTest, BuildMetricsEvent_SetMetricsPriority_Success) diff --git a/Gems/AWSMetrics/Code/Tests/MetricsEventTest.cpp b/Gems/AWSMetrics/Code/Tests/MetricsEventTest.cpp index 6e23cde77c..5bffee0c8f 100644 --- a/Gems/AWSMetrics/Code/Tests/MetricsEventTest.cpp +++ b/Gems/AWSMetrics/Code/Tests/MetricsEventTest.cpp @@ -21,31 +21,31 @@ namespace AWSMetrics : public UnitTest::ScopedAllocatorSetupFixture { public: - static constexpr int NUM_TEST_METRICS = 10; - static const char* const ATTR_NAME; - static const char* const ATTR_VALUE; + static constexpr int NumTestMetrics = 10; + static const char* const AttrName; + static const char* const AttrValue; AZStd::vector GetRequiredMetricsAttributes() { AZStd::vector result; - result.emplace_back(MetricsAttribute(METRICS_ATTRIBUTE_KEY_CLIENT_ID, "0.0.0.0-{00000000-0000-1000-A000-000000000000}")); - result.emplace_back(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_ID, "{00000000-0000-1000-A000-000000000000}")); - result.emplace_back(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, "test_event")); - result.emplace_back(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_TIMESTAMP, "0000-00-00T00:00:00Z")); + result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyClientId, "0.0.0.0-{00000000-0000-1000-A000-000000000000}")); + result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyEventId, "{00000000-0000-1000-A000-000000000000}")); + result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyEventName, "test_event")); + result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyEventTimestamp, "0000-00-00T00:00:00Z")); return AZStd::move(result); } }; - const char* const MetricsEventTest::ATTR_NAME = "name"; - const char* const MetricsEventTest::ATTR_VALUE = "value"; + const char* const MetricsEventTest::AttrName = "name"; + const char* const MetricsEventTest::AttrValue = "value"; TEST_F(MetricsEventTest, AddAttribute_SingleAttribute_Success) { MetricsEvent metrics; int numAttributes = metrics.GetNumAttributes(); - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); ASSERT_EQ(metrics.GetNumAttributes(), numAttributes + 1); } @@ -55,9 +55,9 @@ namespace AWSMetrics MetricsEvent metrics; int numAttributes = metrics.GetNumAttributes(); - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); AZ_TEST_START_TRACE_SUPPRESSION; - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); AZ_TEST_STOP_TRACE_SUPPRESSION(1); ASSERT_EQ(metrics.GetNumAttributes(), numAttributes + 1); @@ -79,20 +79,20 @@ namespace AWSMetrics { MetricsEvent metrics; AZStd::vector attributes; - for (int index = 0; index < NUM_TEST_METRICS; ++index) + for (int index = 0; index < NumTestMetrics; ++index) { - attributes.emplace_back(MetricsAttribute(AZStd::string::format("%s%i", ATTR_NAME, index), ATTR_VALUE)); + attributes.emplace_back(MetricsAttribute(AZStd::string::format("%s%i", AttrName, index), AttrValue)); } metrics.AddAttributes(attributes); - ASSERT_EQ(metrics.GetNumAttributes(), NUM_TEST_METRICS); + ASSERT_EQ(metrics.GetNumAttributes(), NumTestMetrics); } TEST_F(MetricsEventTest, GetSizeInBytes_SingleAttribute_Success) { MetricsEvent metrics; - MetricsAttribute attribute(ATTR_NAME, ATTR_VALUE); + MetricsAttribute attribute(AttrName, AttrValue); metrics.AddAttribute(attribute); ASSERT_EQ(metrics.GetSizeInBytes(), attribute.GetSizeInBytes()); @@ -101,8 +101,8 @@ namespace AWSMetrics TEST_F(MetricsEventTest, SerializeToJson_DefaultAndCustomAttributes_Success) { MetricsEvent metrics; - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); - metrics.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); + metrics.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue)); std::ostream stream(nullptr); AWSCore::JsonOutputStream jsonStream{ stream }; @@ -117,11 +117,11 @@ namespace AWSMetrics rapidjson::Document doc; rapidjson::Value metricsObjVal(rapidjson::kObjectType); - metricsObjVal.AddMember(rapidjson::StringRef(METRICS_ATTRIBUTE_KEY_EVENT_NAME), rapidjson::StringRef(ATTR_VALUE), doc.GetAllocator()); + metricsObjVal.AddMember(rapidjson::StringRef(AwsMetricsAttributeKeyEventName), rapidjson::StringRef(AttrValue), doc.GetAllocator()); rapidjson::Value customEventDataObjVal(rapidjson::kObjectType); - customEventDataObjVal.AddMember(rapidjson::StringRef(ATTR_NAME), rapidjson::StringRef(ATTR_VALUE), doc.GetAllocator()); - metricsObjVal.AddMember(rapidjson::Value(METRICS_ATTRIBUTE_KEY_EVENT_DATA, doc.GetAllocator()).Move(), + customEventDataObjVal.AddMember(rapidjson::StringRef(AttrName), rapidjson::StringRef(AttrValue), doc.GetAllocator()); + metricsObjVal.AddMember(rapidjson::Value(AwsMetricsAttributeKeyEventData, doc.GetAllocator()).Move(), customEventDataObjVal.Move(), doc.GetAllocator()); ASSERT_TRUE(metrics.ReadFromJson(metricsObjVal)); @@ -146,10 +146,10 @@ namespace AWSMetrics rapidjson::Document doc; rapidjson::Value metricsObjVal(rapidjson::kObjectType); - metricsObjVal.AddMember(rapidjson::StringRef(METRICS_ATTRIBUTE_KEY_EVENT_NAME), rapidjson::StringRef(ATTR_VALUE), doc.GetAllocator()); + metricsObjVal.AddMember(rapidjson::StringRef(AwsMetricsAttributeKeyEventName), rapidjson::StringRef(AttrValue), doc.GetAllocator()); rapidjson::Value customEventDataVal(rapidjson::kNumberType); - metricsObjVal.AddMember(rapidjson::Value(METRICS_ATTRIBUTE_KEY_EVENT_DATA, doc.GetAllocator()).Move(), + metricsObjVal.AddMember(rapidjson::Value(AwsMetricsAttributeKeyEventData, doc.GetAllocator()).Move(), customEventDataVal.Move(), doc.GetAllocator()); AZ_TEST_START_TRACE_SUPPRESSION; diff --git a/Gems/AWSMetrics/Code/Tests/MetricsManagerTest.cpp b/Gems/AWSMetrics/Code/Tests/MetricsManagerTest.cpp index 86c4e3fcd5..82385b8bdd 100644 --- a/Gems/AWSMetrics/Code/Tests/MetricsManagerTest.cpp +++ b/Gems/AWSMetrics/Code/Tests/MetricsManagerTest.cpp @@ -122,16 +122,16 @@ namespace AWSMetrics { public: // Size for each test metrics event will be 180 bytes. - static constexpr int TEST_METRICS_EVENT_SIZE_IN_BYTES = 180; - static constexpr int MB_TO_BYTES = 1000000; - static constexpr int DEFAULT_FLUSH_PERIOD_IN_SECONDS = 1; - static constexpr int MAX_NUM_METRICS_EVENTS = 10; + static constexpr int TestMetricsEventSizeInBytes = 180; + static constexpr int MbToBytes = 1000000; + static constexpr int DefaultFlushPeriodInSeconds = 1; + static constexpr int MaxNumMetricsEvents = 10; - static constexpr int SLEEP_TIME_FOR_PROCESSING_IN_MS = 100; + static constexpr int SleepTimeForProcessingInMs = 100; // Timeout for metrics events processing in milliseconds. - static constexpr int TIMEOUT_FOR_PROCESSING_IN_MS = DEFAULT_FLUSH_PERIOD_IN_SECONDS * MAX_NUM_METRICS_EVENTS * 1000; + static constexpr int TimeoutForProcessingInMs = DefaultFlushPeriodInSeconds * MaxNumMetricsEvents * 1000; - static const char* const ATTR_VALUE; + static const char* const AttrValue; void SetUp() override { @@ -139,7 +139,7 @@ namespace AWSMetrics AWSMetricsRequestBus::Handler::BusConnect(); m_metricsManager = AZStd::make_unique(); - AZStd::string configFilePath = CreateClientConfigFile(true, (double) TEST_METRICS_EVENT_SIZE_IN_BYTES / MB_TO_BYTES * 2, DEFAULT_FLUSH_PERIOD_IN_SECONDS, 0); + AZStd::string configFilePath = CreateClientConfigFile(true, (double) TestMetricsEventSizeInBytes / MbToBytes * 2, DefaultFlushPeriodInSeconds, 0); m_metricsManager->Init(configFilePath); RemoveFile(m_metricsManager->GetMetricsFilePath()); @@ -213,10 +213,10 @@ namespace AWSMetrics int processingTime = 0; int numTotalRequests = 0; - while (processingTime < TIMEOUT_FOR_PROCESSING_IN_MS) + while (processingTime < TimeoutForProcessingInMs) { - AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(SLEEP_TIME_FOR_PROCESSING_IN_MS)); - processingTime += SLEEP_TIME_FOR_PROCESSING_IN_MS; + AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(SleepTimeForProcessingInMs)); + processingTime += SleepTimeForProcessingInMs; const GlobalStatistics& currentStats = m_metricsManager->GetGlobalStatistics(); currentNumProcessedEvents = currentStats.m_numEvents; @@ -241,14 +241,14 @@ namespace AWSMetrics AZ::IO::FileIOBase* m_fileIOMock; }; - const char* const MetricsManagerTest::ATTR_VALUE = "value"; + const char* const MetricsManagerTest::AttrValue = "value"; TEST_F(MetricsManagerTest, SubmitMetrics_MaxFlushPeriod_SendToLocalFile) { m_metricsManager->StartMetrics(); AZStd::vector metricsAttributes; - metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE))); + metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue))); bool result = false; AWSMetricsRequestBus::BroadcastResult(result, &AWSMetricsRequests::SubmitMetrics, metricsAttributes, 0, "", true); @@ -265,12 +265,12 @@ namespace AWSMetrics TEST_F(MetricsManagerTest, SubmitMetrics_MaxQueueSize_SendToLocalFile) { // Reset the config file to change the max queue size and set a flush period larger than the timeout. - ResetClientConfig(true, 0.0, (TIMEOUT_FOR_PROCESSING_IN_MS + 1), 0); + ResetClientConfig(true, 0.0, (TimeoutForProcessingInMs + 1), 0); m_metricsManager->StartMetrics(); AZStd::vector metricsAttributes; - metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE))); + metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue))); bool result = false; AWSMetricsRequestBus::BroadcastResult(result, &AWSMetricsRequests::SubmitMetrics, metricsAttributes, 0, "", true); @@ -290,12 +290,12 @@ namespace AWSMetrics AZStd::vector producers; - for (int index = 0; index < MAX_NUM_METRICS_EVENTS; ++index) + for (int index = 0; index < MaxNumMetricsEvents; ++index) { producers.emplace_back(AZStd::thread([this, index]() { AZStd::vector metricsAttributes; - metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE))); + metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue))); bool result = false; // Submit metrics with or without buffer @@ -311,12 +311,12 @@ namespace AWSMetrics // Flush the metrics queue to send all the remaining buffered metrics AWSMetricsRequestBus::Broadcast(&AWSMetricsRequests::FlushMetrics); - WaitForProcessing(MAX_NUM_METRICS_EVENTS); + WaitForProcessing(MaxNumMetricsEvents); const GlobalStatistics& stats = m_metricsManager->GetGlobalStatistics(); - EXPECT_EQ(stats.m_numEvents, MAX_NUM_METRICS_EVENTS); - EXPECT_EQ(stats.m_numSuccesses, MAX_NUM_METRICS_EVENTS); + EXPECT_EQ(stats.m_numEvents, MaxNumMetricsEvents); + EXPECT_EQ(stats.m_numSuccesses, MaxNumMetricsEvents); EXPECT_EQ(stats.m_numErrors, 0); - EXPECT_EQ(stats.m_sendSizeInBytes, TEST_METRICS_EVENT_SIZE_IN_BYTES * MAX_NUM_METRICS_EVENTS); + EXPECT_EQ(stats.m_sendSizeInBytes, TestMetricsEventSizeInBytes * MaxNumMetricsEvents); m_metricsManager->ShutdownMetrics(); } @@ -342,7 +342,7 @@ namespace AWSMetrics AZ::IO::FileIOBase::SetInstance(nullptr); AZStd::vector metricsAttributes; - metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE))); + metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue))); bool result = false; AWSMetricsRequestBus::BroadcastResult(result, &AWSMetricsRequests::SubmitMetrics, metricsAttributes, 0, "", false); @@ -355,20 +355,20 @@ namespace AWSMetrics TEST_F(MetricsManagerTest, FlushMetrics_NonEmptyQueue_Success) { - for (int index = 0; index < MAX_NUM_METRICS_EVENTS; ++index) + for (int index = 0; index < MaxNumMetricsEvents; ++index) { AZStd::vector metricsAttributes; - metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE))); + metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue))); bool result = false; AWSMetricsRequestBus::BroadcastResult(result, &AWSMetricsRequests::SubmitMetrics, metricsAttributes, 0, "", true); ASSERT_TRUE(result); } - ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), MAX_NUM_METRICS_EVENTS); + ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), MaxNumMetricsEvents); AWSMetricsRequestBus::Broadcast(&AWSMetricsRequests::FlushMetrics); - WaitForProcessing(MAX_NUM_METRICS_EVENTS); + WaitForProcessing(MaxNumMetricsEvents); ASSERT_EQ(m_notifications.m_numSuccessNotification, 1); ASSERT_EQ(m_notifications.m_numFailureNotification, 0); ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), 0); @@ -383,7 +383,7 @@ namespace AWSMetrics m_metricsManager->UpdateOfflineRecordingStatus(true); AZStd::vector metricsAttributes; - metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE))); + metricsAttributes.emplace_back(AZStd::move(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue))); bool result = false; AWSMetricsRequestBus::BroadcastResult(result, &AWSMetricsRequests::SubmitMetrics, metricsAttributes, 0, "", false); @@ -404,12 +404,12 @@ namespace AWSMetrics //! Wait for either timeout or the local metrics events are re-added to the buffer. int processingTime = 0; - while (processingTime < TIMEOUT_FOR_PROCESSING_IN_MS && m_localFileIO->Exists(m_metricsManager->GetMetricsFilePath())) + while (processingTime < TimeoutForProcessingInMs && m_localFileIO->Exists(m_metricsManager->GetMetricsFilePath())) { - AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(SLEEP_TIME_FOR_PROCESSING_IN_MS)); - processingTime += SLEEP_TIME_FOR_PROCESSING_IN_MS; + AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(SleepTimeForProcessingInMs)); + processingTime += SleepTimeForProcessingInMs; } - + ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), 1); ASSERT_FALSE(m_localFileIO->Exists(m_metricsManager->GetMetricsFilePath())); @@ -419,15 +419,15 @@ namespace AWSMetrics TEST_F(MetricsManagerTest, OnResponseReceived_WithResponseRecords_RetryFailedMetrics) { // Reset the config file to change the max queue size setting. - ResetClientConfig(false, (double)TEST_METRICS_EVENT_SIZE_IN_BYTES * (MAX_NUM_METRICS_EVENTS + 1) / MB_TO_BYTES, - DEFAULT_FLUSH_PERIOD_IN_SECONDS, 1); + ResetClientConfig(false, (double)TestMetricsEventSizeInBytes * (MaxNumMetricsEvents + 1) / MbToBytes, + DefaultFlushPeriodInSeconds, 1); MetricsQueue metricsEvents; ServiceAPI::MetricsEventSuccessResponsePropertyEvents responseRecords; - for (int index = 0; index < MAX_NUM_METRICS_EVENTS; ++index) + for (int index = 0; index < MaxNumMetricsEvents; ++index) { MetricsEvent newEvent; - newEvent.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE)); + newEvent.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue)); metricsEvents.AddMetrics(newEvent); @@ -446,28 +446,28 @@ namespace AWSMetrics m_metricsManager->OnResponseReceived(metricsEvents, responseRecords); const GlobalStatistics& stats = m_metricsManager->GetGlobalStatistics(); - EXPECT_EQ(stats.m_numEvents, MAX_NUM_METRICS_EVENTS); - EXPECT_EQ(stats.m_numSuccesses, MAX_NUM_METRICS_EVENTS / 2); - EXPECT_EQ(stats.m_numErrors, MAX_NUM_METRICS_EVENTS / 2); + EXPECT_EQ(stats.m_numEvents, MaxNumMetricsEvents); + EXPECT_EQ(stats.m_numSuccesses, MaxNumMetricsEvents / 2); + EXPECT_EQ(stats.m_numErrors, MaxNumMetricsEvents / 2); EXPECT_EQ(stats.m_numDropped, 0); - int metricsEventSize = sizeof(METRICS_ATTRIBUTE_KEY_EVENT_NAME) - 1 + strlen(ATTR_VALUE); - EXPECT_EQ(stats.m_sendSizeInBytes, metricsEventSize * MAX_NUM_METRICS_EVENTS / 2); + int metricsEventSize = sizeof(AwsMetricsAttributeKeyEventName) - 1 + strlen(AttrValue); + EXPECT_EQ(stats.m_sendSizeInBytes, metricsEventSize * MaxNumMetricsEvents / 2); - ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), MAX_NUM_METRICS_EVENTS / 2); + ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), MaxNumMetricsEvents / 2); } TEST_F(MetricsManagerTest, OnResponseReceived_NoResponseRecords_RetryAllMetrics) { // Reset the config file to change the max queue size setting. - ResetClientConfig(false, (double)TEST_METRICS_EVENT_SIZE_IN_BYTES * (MAX_NUM_METRICS_EVENTS + 1) / MB_TO_BYTES, - DEFAULT_FLUSH_PERIOD_IN_SECONDS, 1); + ResetClientConfig(false, (double)TestMetricsEventSizeInBytes * (MaxNumMetricsEvents + 1) / MbToBytes, + DefaultFlushPeriodInSeconds, 1); MetricsQueue metricsEvents; - for (int index = 0; index < MAX_NUM_METRICS_EVENTS; ++index) + for (int index = 0; index < MaxNumMetricsEvents; ++index) { MetricsEvent newEvent; - newEvent.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE)); + newEvent.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue)); metricsEvents.AddMetrics(newEvent); } @@ -475,22 +475,22 @@ namespace AWSMetrics m_metricsManager->OnResponseReceived(metricsEvents); const GlobalStatistics& stats = m_metricsManager->GetGlobalStatistics(); - EXPECT_EQ(stats.m_numEvents, MAX_NUM_METRICS_EVENTS); + EXPECT_EQ(stats.m_numEvents, MaxNumMetricsEvents); EXPECT_EQ(stats.m_numSuccesses, 0); EXPECT_EQ(stats.m_sendSizeInBytes, 0); EXPECT_EQ(stats.m_numDropped, 0); - ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), MAX_NUM_METRICS_EVENTS); + ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), MaxNumMetricsEvents); } TEST_F(MetricsManagerTest, OnResponseReceived_MaxNumRetires_DropMetrics) { // Reset the config file to change the max queue size setting. - ResetClientConfig(false, (double)TEST_METRICS_EVENT_SIZE_IN_BYTES * (MAX_NUM_METRICS_EVENTS + 1) / MB_TO_BYTES, - DEFAULT_FLUSH_PERIOD_IN_SECONDS, 1); + ResetClientConfig(false, (double)TestMetricsEventSizeInBytes * (MaxNumMetricsEvents + 1) / MbToBytes, + DefaultFlushPeriodInSeconds, 1); MetricsQueue metricsEvents; - for (int index = 0; index < MAX_NUM_METRICS_EVENTS; ++index) + for (int index = 0; index < MaxNumMetricsEvents; ++index) { MetricsEvent newMetricsEvent; @@ -510,7 +510,7 @@ namespace AWSMetrics // have been retried for multiple times and we do not increase the total number of errors in this case. EXPECT_EQ(stats.m_numErrors, 0); EXPECT_EQ(stats.m_sendSizeInBytes, 0); - EXPECT_EQ(stats.m_numDropped, MAX_NUM_METRICS_EVENTS); + EXPECT_EQ(stats.m_numDropped, MaxNumMetricsEvents); ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), 0); } @@ -518,11 +518,11 @@ namespace AWSMetrics TEST_F(MetricsManagerTest, PushMetricsForRetries_NoRetry_DropMetrics) { // Reset the config file to change the max queue size setting. - ResetClientConfig(false, (double)TEST_METRICS_EVENT_SIZE_IN_BYTES * (MAX_NUM_METRICS_EVENTS + 1) / MB_TO_BYTES, - DEFAULT_FLUSH_PERIOD_IN_SECONDS, 0); + ResetClientConfig(false, (double)TestMetricsEventSizeInBytes * (MaxNumMetricsEvents + 1) / MbToBytes, + DefaultFlushPeriodInSeconds, 0); MetricsQueue metricsEvents; - for (int index = 0; index < MAX_NUM_METRICS_EVENTS; ++index) + for (int index = 0; index < MaxNumMetricsEvents; ++index) { metricsEvents.AddMetrics(MetricsEvent()); } @@ -530,11 +530,11 @@ namespace AWSMetrics m_metricsManager->OnResponseReceived(metricsEvents); const GlobalStatistics& stats = m_metricsManager->GetGlobalStatistics(); - EXPECT_EQ(stats.m_numEvents, MAX_NUM_METRICS_EVENTS); + EXPECT_EQ(stats.m_numEvents, MaxNumMetricsEvents); EXPECT_EQ(stats.m_numSuccesses, 0); - EXPECT_EQ(stats.m_numErrors, MAX_NUM_METRICS_EVENTS); + EXPECT_EQ(stats.m_numErrors, MaxNumMetricsEvents); EXPECT_EQ(stats.m_sendSizeInBytes, 0); - EXPECT_EQ(stats.m_numDropped, MAX_NUM_METRICS_EVENTS); + EXPECT_EQ(stats.m_numDropped, MaxNumMetricsEvents); ASSERT_EQ(m_metricsManager->GetNumBufferedMetrics(), 0); } @@ -544,7 +544,7 @@ namespace AWSMetrics { public: const double DEFAULT_MAX_QUEUE_SIZE_IN_MB = 0.0004; - const int DEFAULT_FLUSH_PERIOD_IN_SECONDS = 1; + const int DefaultFlushPeriodInSeconds = 1; const int DEFAULT_MAX_NUM_RETRIES = 1; void SetUp() override @@ -559,18 +559,18 @@ namespace AWSMetrics TEST_F(ClientConfigurationTest, ResetClientConfiguration_ValidConfigurationFile_Success) { - AZStd::string configFilePath = CreateClientConfigFile(true, DEFAULT_MAX_QUEUE_SIZE_IN_MB, DEFAULT_FLUSH_PERIOD_IN_SECONDS, DEFAULT_MAX_NUM_RETRIES); + AZStd::string configFilePath = CreateClientConfigFile(true, DEFAULT_MAX_QUEUE_SIZE_IN_MB, DefaultFlushPeriodInSeconds, DEFAULT_MAX_NUM_RETRIES); ASSERT_TRUE(m_clientConfiguration->ResetClientConfiguration(configFilePath)); ASSERT_TRUE(m_clientConfiguration->OfflineRecordingEnabled()); ASSERT_EQ(m_clientConfiguration->GetMaxQueueSizeInBytes(), DEFAULT_MAX_QUEUE_SIZE_IN_MB * 1000000); - ASSERT_EQ(m_clientConfiguration->GetQueueFlushPeriodInSeconds(), DEFAULT_FLUSH_PERIOD_IN_SECONDS); + ASSERT_EQ(m_clientConfiguration->GetQueueFlushPeriodInSeconds(), DefaultFlushPeriodInSeconds); ASSERT_EQ(m_clientConfiguration->GetMaxNumRetries(), DEFAULT_MAX_NUM_RETRIES); char resolvedPath[AZ_MAX_PATH_LEN] = { 0 }; - ASSERT_TRUE(m_localFileIO->ResolvePath(metricsDir, resolvedPath, AZ_MAX_PATH_LEN)); + ASSERT_TRUE(m_localFileIO->ResolvePath(AwsMetricsLocalFileDir, resolvedPath, AZ_MAX_PATH_LEN)); AZStd::string expectedMetricsFilePath; - ASSERT_TRUE(AzFramework::StringFunc::Path::Join(resolvedPath, metricsFileName, expectedMetricsFilePath)); + ASSERT_TRUE(AzFramework::StringFunc::Path::Join(resolvedPath, AwsMetricsLocalFileName, expectedMetricsFilePath)); ASSERT_EQ(strcmp(m_clientConfiguration->GetMetricsFileDir(), resolvedPath), 0); ASSERT_EQ(m_clientConfiguration->GetMetricsFileFullPath(), expectedMetricsFilePath); diff --git a/Gems/AWSMetrics/Code/Tests/MetricsQueueTest.cpp b/Gems/AWSMetrics/Code/Tests/MetricsQueueTest.cpp index 63ec087e90..a395039454 100644 --- a/Gems/AWSMetrics/Code/Tests/MetricsQueueTest.cpp +++ b/Gems/AWSMetrics/Code/Tests/MetricsQueueTest.cpp @@ -25,9 +25,9 @@ namespace AWSMetrics : public AWSMetricsGemAllocatorFixture { public: - const int NUM_TEST_METRICS = 10; - const AZStd::string ATTR_NAME = "name"; - const AZStd::string ATTR_VALUE = "value"; + const int NumTestMetrics = 10; + const AZStd::string AttrName = "name"; + const AZStd::string AttrValue = "value"; }; TEST_F(MetricsQueueTest, AddMetrics_SingleMetrics_Success) @@ -46,14 +46,14 @@ namespace AWSMetrics int numMetrics = queue.GetNumMetrics(); MetricsQueue anotherQueue; - for (int index = 0; index < NUM_TEST_METRICS; ++index) + for (int index = 0; index < NumTestMetrics; ++index) { anotherQueue.AddMetrics(MetricsEvent()); } queue.AppendMetrics(anotherQueue); - ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NUM_TEST_METRICS); + ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NumTestMetrics); } TEST_F(MetricsQueueTest, AppendMetrics_NoneEmptyQueue_Success) @@ -63,14 +63,14 @@ namespace AWSMetrics int numMetrics = queue.GetNumMetrics(); MetricsQueue anotherQueue; - for (int index = 0; index < NUM_TEST_METRICS; ++index) + for (int index = 0; index < NumTestMetrics; ++index) { anotherQueue.AddMetrics(MetricsEvent()); } queue.AppendMetrics(anotherQueue); - ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NUM_TEST_METRICS); + ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NumTestMetrics); } TEST_F(MetricsQueueTest, PushMetricsToFront_EmptyQueue_Success) @@ -79,43 +79,43 @@ namespace AWSMetrics int numMetrics = queue.GetNumMetrics(); MetricsQueue anotherQueue; - for (int index = 0; index < NUM_TEST_METRICS; ++index) + for (int index = 0; index < NumTestMetrics; ++index) { anotherQueue.AddMetrics(MetricsEvent()); } queue.PushMetricsToFront(anotherQueue); - ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NUM_TEST_METRICS); + ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NumTestMetrics); } TEST_F(MetricsQueueTest, PushMetricsToFront_NoneEmptyQueue_Success) { MetricsQueue queue; MetricsEvent metrics; - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); queue.AddMetrics(metrics); int numMetrics = queue.GetNumMetrics(); MetricsQueue anotherQueue; - for (int index = 0; index < NUM_TEST_METRICS; ++index) + for (int index = 0; index < NumTestMetrics; ++index) { anotherQueue.AddMetrics(MetricsEvent()); } queue.PushMetricsToFront(anotherQueue); - ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NUM_TEST_METRICS); - ASSERT_EQ(queue[NUM_TEST_METRICS].GetNumAttributes(), 1); + ASSERT_EQ(queue.GetNumMetrics(), numMetrics + NumTestMetrics); + ASSERT_EQ(queue[NumTestMetrics].GetNumAttributes(), 1); } TEST_F(MetricsQueueTest, FilterMetricsByPriority_ReachMaxCapacity_FilterOutLowerPriorityMetrics) { MetricsQueue queue; - for (int index = 0; index < NUM_TEST_METRICS; ++index) + for (int index = 0; index < NumTestMetrics; ++index) { MetricsEvent metrics; - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); metrics.SetEventPriority(index % 2); // Use the number of failures to check the order of metrics events later. @@ -128,10 +128,10 @@ namespace AWSMetrics queue.AddMetrics(metrics); } - int maxCapacity = queue[0].GetSizeInBytes() * NUM_TEST_METRICS / 2; + int maxCapacity = queue[0].GetSizeInBytes() * NumTestMetrics / 2; - ASSERT_EQ(queue.FilterMetricsByPriority(maxCapacity), NUM_TEST_METRICS / 2); - ASSERT_EQ(queue.GetNumMetrics(), NUM_TEST_METRICS / 2); + ASSERT_EQ(queue.FilterMetricsByPriority(maxCapacity), NumTestMetrics / 2); + ASSERT_EQ(queue.GetNumMetrics(), NumTestMetrics / 2); for (int index = 0; index < queue.GetNumMetrics(); ++index) { @@ -149,11 +149,11 @@ namespace AWSMetrics TEST_F(MetricsQueueTest, ClearMetrics_NoneEmptyQueue_Success) { MetricsQueue queue; - for (int index = 0; index < NUM_TEST_METRICS; ++index) + for (int index = 0; index < NumTestMetrics; ++index) { queue.AddMetrics(MetricsEvent()); } - ASSERT_EQ(queue.GetNumMetrics(), NUM_TEST_METRICS); + ASSERT_EQ(queue.GetNumMetrics(), NumTestMetrics); queue.ClearMetrics(); @@ -164,12 +164,12 @@ namespace AWSMetrics { MetricsQueue queue; MetricsEvent metrics; - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); - metrics.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); + metrics.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue)); queue.AddMetrics(metrics); AZStd::string serializedQueue = AZStd::string::format("[{\"%s\":\"%s\",\"%s\":{\"%s\":\"%s\"}}]", - METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE.c_str(), METRICS_ATTRIBUTE_KEY_EVENT_DATA, ATTR_NAME.c_str(), ATTR_VALUE.c_str()); + AwsMetricsAttributeKeyEventName, AttrValue.c_str(), AwsMetricsAttributeKeyEventData, AttrName.c_str(), AttrValue.c_str()); ASSERT_EQ(queue.SerializeToJson(), serializedQueue); } @@ -177,8 +177,8 @@ namespace AWSMetrics { MetricsQueue queue; MetricsEvent metrics; - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); - metrics.AddAttribute(MetricsAttribute(METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); + metrics.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue)); queue.AddMetrics(metrics); std::ostream stream(nullptr); @@ -194,7 +194,7 @@ namespace AWSMetrics AZStd::string testFilePath = GetDefaultTestFilePath(); AZStd::string serializedQueue = AZStd::string::format("[{\"%s\":\"%s\",\"%s\":{\"%s\":\"%s\"}}]", - METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE.c_str(), METRICS_ATTRIBUTE_KEY_EVENT_DATA, ATTR_NAME.c_str(), ATTR_VALUE.c_str()); + AwsMetricsAttributeKeyEventName, AttrValue.c_str(), AwsMetricsAttributeKeyEventData, AttrName.c_str(), AttrValue.c_str()); ASSERT_TRUE(CreateFile(testFilePath, serializedQueue)); ASSERT_TRUE(queue.ReadFromJson(testFilePath)); @@ -220,7 +220,7 @@ namespace AWSMetrics AZStd::string testFilePath = GetDefaultTestFilePath(); AZStd::string serializedQueue = AZStd::string::format("{\"%s\":\"%s\",\"%s\":{\"%s\":\"%s\"}}", - METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE.c_str(), METRICS_ATTRIBUTE_KEY_EVENT_DATA, ATTR_NAME.c_str(), ATTR_VALUE.c_str()); + AwsMetricsAttributeKeyEventName, AttrValue.c_str(), AwsMetricsAttributeKeyEventData, AttrName.c_str(), AttrValue.c_str()); ASSERT_TRUE(CreateFile(testFilePath, serializedQueue)); AZ_TEST_START_TRACE_SUPPRESSION; @@ -230,62 +230,37 @@ namespace AWSMetrics ASSERT_TRUE(RemoveFile(testFilePath)); } - TEST_F(MetricsQueueTest, ReadFromString_DefaultandCustomMetricsAttributes_Success) - { - MetricsQueue queue; - - AZStd::string serializedQueue = AZStd::string::format( - "[{\"%s\":\"%s\",\"%s\":{\"%s\":\"%s\"}}]", METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE.c_str(), - METRICS_ATTRIBUTE_KEY_EVENT_DATA, ATTR_NAME.c_str(), ATTR_VALUE.c_str()); - - ASSERT_TRUE(queue.ReadFromString(serializedQueue)); - ASSERT_EQ(queue.GetNumMetrics(), 1); - } - - TEST_F(MetricsQueueTest, ReadFromString_InvalidJsonFormat_Fail) - { - MetricsQueue queue; - - AZStd::string serializedQueue = AZStd::string::format( - "{\"%s\":\"%s\",\"%s\":{\"%s\":\"%s\"}}", METRICS_ATTRIBUTE_KEY_EVENT_NAME, ATTR_VALUE.c_str(), - METRICS_ATTRIBUTE_KEY_EVENT_DATA, ATTR_NAME.c_str(), ATTR_VALUE.c_str()); - - AZ_TEST_START_TRACE_SUPPRESSION; - ASSERT_FALSE(queue.ReadFromString(serializedQueue)); - AZ_TEST_STOP_TRACE_SUPPRESSION(1); - } - TEST_F(MetricsQueueTest, PopBufferedEventsByServiceLimits_QueueSizeExceedsLimits_BufferedEventsAddedToNewQueue) { MetricsEvent metrics; - metrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); + metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); int sizeOfEachMetrics = metrics.GetSizeInBytes(); MetricsQueue queue; queue.AddMetrics(metrics); - for (int index = 0; index < NUM_TEST_METRICS - 1; ++index) + for (int index = 0; index < NumTestMetrics - 1; ++index) { MetricsEvent newMetrics; - newMetrics.AddAttribute(MetricsAttribute(ATTR_NAME, ATTR_VALUE)); + newMetrics.AddAttribute(MetricsAttribute(AttrName, AttrValue)); queue.AddMetrics(newMetrics); } MetricsQueue anotherQueue; // Payload size limit is hit. - queue.PopBufferedEventsByServiceLimits(anotherQueue, sizeOfEachMetrics, NUM_TEST_METRICS + 1); + queue.PopBufferedEventsByServiceLimits(anotherQueue, sizeOfEachMetrics, NumTestMetrics + 1); - ASSERT_EQ(queue.GetNumMetrics(), NUM_TEST_METRICS - 1); - ASSERT_EQ(queue.GetSizeInBytes(), sizeOfEachMetrics * (NUM_TEST_METRICS - 1)); + ASSERT_EQ(queue.GetNumMetrics(), NumTestMetrics - 1); + ASSERT_EQ(queue.GetSizeInBytes(), sizeOfEachMetrics * (NumTestMetrics - 1)); ASSERT_EQ(anotherQueue.GetNumMetrics(), 1); ASSERT_EQ(anotherQueue.GetSizeInBytes(), sizeOfEachMetrics); // Records count limit is hit. - queue.PopBufferedEventsByServiceLimits(anotherQueue, sizeOfEachMetrics * NUM_TEST_METRICS, 1); + queue.PopBufferedEventsByServiceLimits(anotherQueue, sizeOfEachMetrics * NumTestMetrics, 1); - ASSERT_EQ(queue.GetNumMetrics(), NUM_TEST_METRICS - 2); - ASSERT_EQ(queue.GetSizeInBytes(), sizeOfEachMetrics * (NUM_TEST_METRICS - 2)); + ASSERT_EQ(queue.GetNumMetrics(), NumTestMetrics - 2); + ASSERT_EQ(queue.GetSizeInBytes(), sizeOfEachMetrics * (NumTestMetrics - 2)); ASSERT_EQ(anotherQueue.GetNumMetrics(), 2); ASSERT_EQ(anotherQueue.GetSizeInBytes(), sizeOfEachMetrics * 2); } diff --git a/Gems/AWSMetrics/Code/awsmetrics_files.cmake b/Gems/AWSMetrics/Code/awsmetrics_files.cmake index 14343e70e9..3341c2d5d6 100644 --- a/Gems/AWSMetrics/Code/awsmetrics_files.cmake +++ b/Gems/AWSMetrics/Code/awsmetrics_files.cmake @@ -11,7 +11,7 @@ set(FILES Include/Public/AWSMetricsBus.h - Include/Public/AWSMetricsConstant.h + Include/Private/AWSMetricsConstant.h Include/Private/AWSMetricsServiceApi.h Include/Private/AWSMetricsSystemComponent.h Include/Private/ClientConfiguration.h diff --git a/Gems/AWSMetrics/Code/awsmetrics_shared_files.cmake b/Gems/AWSMetrics/Code/awsmetrics_shared_files.cmake index 7ea3552923..bae6de2664 100644 --- a/Gems/AWSMetrics/Code/awsmetrics_shared_files.cmake +++ b/Gems/AWSMetrics/Code/awsmetrics_shared_files.cmake @@ -10,5 +10,6 @@ # set(FILES + Include/Private/AWSMetricsModule.h Source/AWSMetricsModule.cpp ) diff --git a/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py b/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py index 787d6c4e08..a3ab99fccf 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py @@ -113,8 +113,7 @@ class DataIngestion: apigateway_role = iam.Role( self._stack, - id="ApiGatewayRole", - role_name=f'{self._stack.stack_name}-ApiGatewayRole', + id=f'{self._stack.stack_name}-ApiGatewayRole', assumed_by=iam.ServicePrincipal( service="apigateway.amazonaws.com" ), diff --git a/Gems/AWSMetrics/cdk/requirements.txt b/Gems/AWSMetrics/cdk/requirements.txt index 63f790761c..8ba9866347 100644 --- a/Gems/AWSMetrics/cdk/requirements.txt +++ b/Gems/AWSMetrics/cdk/requirements.txt @@ -8,4 +8,4 @@ aws-cdk.aws_kinesisanalytics>=1.91.0 aws-cdk.aws_kinesisfirehose>=1.91.0 aws-cdk.aws_s3>=1.91.0 aws-cdk.aws_glue>=1.91.0 -aws-cdk.aws_athena>=1.91.0 \ No newline at end of file +aws-cdk.aws_athena>=1.91.0 diff --git a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Findispctexcomp.cmake b/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Findispctexcomp.cmake deleted file mode 100644 index 8bbd5fde1b..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Findispctexcomp.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME ispctexcomp - VERSION 1.0.0 - 3RDPARTY_ROOT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../External/ISPCTextureCompressor - INCLUDE_DIRECTORIES win_x64/include -) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Platform/Windows/ispctexcomp_windows.cmake b/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Platform/Windows/ispctexcomp_windows.cmake deleted file mode 100644 index 5bee31eac8..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Platform/Windows/ispctexcomp_windows.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(ISPCTEXCOMP_LIBS ${BASE_PATH}/win_x64/lib/ispc_texcomp.lib) - -set(ISPCTEXCOMP_RUNTIME_DEPENDENCIES ${BASE_PATH}/win_x64/bin/ispc_texcomp.dll) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Platform/Windows/ispctexturecompressor_windows.json b/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Platform/Windows/ispctexturecompressor_windows.json deleted file mode 100644 index 853ac27d8c..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/Platform/Windows/ispctexturecompressor_windows.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "platform": { - "win_x64_vs2017": { - "includes": [ - "win_x64/include" - ], - "importlibpath": [ - "win_x64/lib" - ], - "sharedlibpath": [ - "win_x64/bin" - ], - "import": [ - "ispc_texcomp.lib" - ], - "shared": [ - "ispc_texcomp.dll" - ] - }, - "win_x64_vs2019": "@win_x64_vs2017" - } -} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/ispctexturecompressor.json b/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/ispctexturecompressor.json deleted file mode 100644 index 1652b24ba5..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/ispctexturecompressor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "ispctexturecompressor", - "source": "@GEM@/External/ISPCTextureCompressor/1.0.0", - "description": "ISPC Texture Compressor", - "defines": [], - "lib_required": "True", - "shared_required": "True" -} - diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt b/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt index 7068f7235a..7815dbf195 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt @@ -69,7 +69,6 @@ ly_add_target( 3rdParty::PVRTexTool 3rdParty::squish-ccr 3rdParty::tiff - 3rdParty::ispctexcomp 3rdParty::ilmbase Legacy::CryCommon AZ::AzFramework diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Windows/platform_windows.cmake b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Windows/platform_windows.cmake index 4d5680a30d..f85051d7d3 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Windows/platform_windows.cmake +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Windows/platform_windows.cmake @@ -8,3 +8,12 @@ # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # + +# windows requires the 3rd Party ISPCTexComp library. + +ly_associate_package(PACKAGE_NAME ISPCTexComp-2021.3-rev1-windows TARGETS ISPCTexComp PACKAGE_HASH 324fb051a549bc96571530e63c01e18a4c860db45317734d86276fe27a45f6dd) + +set(LY_BUILD_DEPENDENCIES + PUBLIC + 3rdParty::ISPCTexComp + ) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp index 706d60dee7..085411a802 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp @@ -784,7 +784,7 @@ namespace UnitTest { //source image AZStd::string inputFile; - inputFile = "../SamplesProject/Objects/ParticleAssets/ShowRoom/showroom_pipe_blue_001_ddna.tif"; + inputFile = "../AutomatedTesting/Objects/ParticleAssets/ShowRoom/showroom_pipe_blue_001_ddna.tif"; IImageObjectPtr srcImage(LoadImageFromFile(inputFile)); ImageToProcess imageToProcess(srcImage); @@ -1006,7 +1006,7 @@ namespace UnitTest TEST_F(ImageProcessingTest, DISABLED_TestLoadDdsImage) { IImageObjectPtr originImage, alphaImage; - AZStd::string inputFolder = "../SamplesProject/Cache/pc/engineassets/texturemsg/"; + AZStd::string inputFolder = "../AutomatedTesting/Cache/pc/engineassets/texturemsg/"; AZStd::string inputFile; inputFile = "E:/Javelin_NWLYDev/dev/Cache/Assets/pc/assets/textures/blend_maps/moss/jav_moss_ddn.dds"; diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/bin/ispc_texcomp.dll b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/bin/ispc_texcomp.dll deleted file mode 100644 index e6fcde0d5e..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/bin/ispc_texcomp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e23d3e16fc73176ba58667b3752597890dc4c00560fd32d66aa1a5346334a32f -size 1546240 diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/ispc_texcomp.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/ispc_texcomp.h deleted file mode 100644 index 1dbee34a6f..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/ispc_texcomp.h +++ /dev/null @@ -1,122 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2016-2019, Intel 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. -//////////////////////////////////////////////////////////////////////////////// - -#include - -struct rgba_surface -{ - uint8_t* ptr; - int32_t width; - int32_t height; - int32_t stride; // in bytes -}; - -struct bc7_enc_settings -{ - bool mode_selection[4]; - int refineIterations[8]; - - bool skip_mode2; - int fastSkipTreshold_mode1; - int fastSkipTreshold_mode3; - int fastSkipTreshold_mode7; - - int mode45_channel0; - int refineIterations_channel; - - int channels; -}; - -struct bc6h_enc_settings -{ - bool slow_mode; - bool fast_mode; - int refineIterations_1p; - int refineIterations_2p; - int fastSkipTreshold; -}; - -struct etc_enc_settings -{ - int fastSkipTreshold; -}; - -struct astc_enc_settings -{ - int block_width; - int block_height; - int channels; - - int fastSkipTreshold; - int refineIterations; -}; - -// profiles for RGB data (alpha channel will be ignored) -extern "C" void GetProfile_ultrafast(bc7_enc_settings* settings); -extern "C" void GetProfile_veryfast(bc7_enc_settings* settings); -extern "C" void GetProfile_fast(bc7_enc_settings* settings); -extern "C" void GetProfile_basic(bc7_enc_settings* settings); -extern "C" void GetProfile_slow(bc7_enc_settings* settings); - -// profiles for RGBA inputs -extern "C" void GetProfile_alpha_ultrafast(bc7_enc_settings* settings); -extern "C" void GetProfile_alpha_veryfast(bc7_enc_settings* settings); -extern "C" void GetProfile_alpha_fast(bc7_enc_settings* settings); -extern "C" void GetProfile_alpha_basic(bc7_enc_settings* settings); -extern "C" void GetProfile_alpha_slow(bc7_enc_settings* settings); - -// profiles for BC6H (RGB HDR) -extern "C" void GetProfile_bc6h_veryfast(bc6h_enc_settings* settings); -extern "C" void GetProfile_bc6h_fast(bc6h_enc_settings* settings); -extern "C" void GetProfile_bc6h_basic(bc6h_enc_settings* settings); -extern "C" void GetProfile_bc6h_slow(bc6h_enc_settings* settings); -extern "C" void GetProfile_bc6h_veryslow(bc6h_enc_settings* settings); - -// profiles for ETC -extern "C" void GetProfile_etc_slow(etc_enc_settings* settings); - -// profiles for ASTC -extern "C" void GetProfile_astc_fast(astc_enc_settings* settings, int block_width, int block_height); -extern "C" void GetProfile_astc_alpha_fast(astc_enc_settings* settings, int block_width, int block_height); -extern "C" void GetProfile_astc_alpha_slow(astc_enc_settings* settings, int block_width, int block_height); - -// helper function to replicate border pixels for the desired block sizes (bpp = 32 or 64) -extern "C" void ReplicateBorders(rgba_surface* dst_slice, const rgba_surface* src_tex, int x, int y, int bpp); - -/* -Notes: - - input width and height need to be a multiple of block size - - LDR input is 32 bit/pixel (sRGB), HDR is 64 bit/pixel (half float) - - dst buffer must be allocated with enough space for the compressed texture: - - 8 bytes/block for BC1/ETC1, - - 16 bytes/block for BC3/BC6H/BC7/ASTC - - the blocks are stored in raster scan order (natural CPU texture layout) - - use the GetProfile_* functions to select various speed/quality tradeoffs - - the RGB profiles are slightly faster as they ignore the alpha channel -*/ - -extern "C" void CompressBlocksBC1(const rgba_surface* src, uint8_t* dst); -extern "C" void CompressBlocksBC3(const rgba_surface* src, uint8_t* dst); -extern "C" void CompressBlocksBC6H(const rgba_surface* src, uint8_t* dst, bc6h_enc_settings* settings); -extern "C" void CompressBlocksBC7(const rgba_surface* src, uint8_t* dst, bc7_enc_settings* settings); -extern "C" void CompressBlocksETC1(const rgba_surface* src, uint8_t* dst, etc_enc_settings* settings); -extern "C" void CompressBlocksASTC(const rgba_surface* src, uint8_t* dst, astc_enc_settings* settings); diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc.h deleted file mode 100644 index 250154fc57..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc.h +++ /dev/null @@ -1,111 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_context__ -#define __ISPC_STRUCT_astc_enc_context__ -struct astc_enc_context { - int32_t width; - int32_t height; - int32_t channels; - bool dual_plane; - int32_t partitions; - int32_t color_endpoint_pairs; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_settings__ -#define __ISPC_STRUCT_astc_enc_settings__ -struct astc_enc_settings { - int32_t block_width; - int32_t block_height; - int32_t channels; - int32_t fastSkipTreshold; - int32_t refineIterations; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_block__ -#define __ISPC_STRUCT_astc_block__ -struct astc_block { - int32_t width; - int32_t height; - bool dual_plane; - int32_t weight_range; - uint8_t weights[64]; - int32_t color_component_selector; - int32_t partitions; - int32_t partition_id; - int32_t color_endpoint_pairs; - int32_t channels; - int32_t color_endpoint_modes[4]; - int32_t endpoint_range; - uint8_t endpoints[18]; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void astc_encode_ispc(struct rgba_surface * src, float * block_scores, uint8_t * dst, uint64_t * list, struct astc_enc_context * list_context, struct astc_enc_settings * settings); - extern void astc_rank_ispc(struct rgba_surface * src, int32_t xx, int32_t yy, uint32_t * mode_buffer, struct astc_enc_settings * settings); - extern int32_t get_programCount(); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_avx.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_avx.h deleted file mode 100644 index 47ad2a2c07..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_avx.h +++ /dev/null @@ -1,96 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_context__ -#define __ISPC_STRUCT_astc_enc_context__ -struct astc_enc_context { - int32_t width; - int32_t height; - int32_t channels; - bool dual_plane; - int32_t partitions; - int32_t color_endpoint_pairs; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_settings__ -#define __ISPC_STRUCT_astc_enc_settings__ -struct astc_enc_settings { - int32_t block_width; - int32_t block_height; - int32_t channels; - int32_t fastSkipTreshold; - int32_t refineIterations; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_block__ -#define __ISPC_STRUCT_astc_block__ -struct astc_block { - int32_t width; - int32_t height; - bool dual_plane; - int32_t weight_range; - uint8_t weights[64]; - int32_t color_component_selector; - int32_t partitions; - int32_t partition_id; - int32_t color_endpoint_pairs; - int32_t channels; - int32_t color_endpoint_modes[4]; - int32_t endpoint_range; - uint8_t endpoints[18]; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void astc_encode_ispc(struct rgba_surface * src, float * block_scores, uint8_t * dst, uint64_t * list, struct astc_enc_context * list_context, struct astc_enc_settings * settings); - extern void astc_rank_ispc(struct rgba_surface * src, int32_t xx, int32_t yy, uint32_t * mode_buffer, struct astc_enc_settings * settings); - extern int32_t get_programCount(); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_avx2.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_avx2.h deleted file mode 100644 index 47ad2a2c07..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_avx2.h +++ /dev/null @@ -1,96 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_context__ -#define __ISPC_STRUCT_astc_enc_context__ -struct astc_enc_context { - int32_t width; - int32_t height; - int32_t channels; - bool dual_plane; - int32_t partitions; - int32_t color_endpoint_pairs; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_settings__ -#define __ISPC_STRUCT_astc_enc_settings__ -struct astc_enc_settings { - int32_t block_width; - int32_t block_height; - int32_t channels; - int32_t fastSkipTreshold; - int32_t refineIterations; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_block__ -#define __ISPC_STRUCT_astc_block__ -struct astc_block { - int32_t width; - int32_t height; - bool dual_plane; - int32_t weight_range; - uint8_t weights[64]; - int32_t color_component_selector; - int32_t partitions; - int32_t partition_id; - int32_t color_endpoint_pairs; - int32_t channels; - int32_t color_endpoint_modes[4]; - int32_t endpoint_range; - uint8_t endpoints[18]; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void astc_encode_ispc(struct rgba_surface * src, float * block_scores, uint8_t * dst, uint64_t * list, struct astc_enc_context * list_context, struct astc_enc_settings * settings); - extern void astc_rank_ispc(struct rgba_surface * src, int32_t xx, int32_t yy, uint32_t * mode_buffer, struct astc_enc_settings * settings); - extern int32_t get_programCount(); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_sse2.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_sse2.h deleted file mode 100644 index 47ad2a2c07..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_sse2.h +++ /dev/null @@ -1,96 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_context__ -#define __ISPC_STRUCT_astc_enc_context__ -struct astc_enc_context { - int32_t width; - int32_t height; - int32_t channels; - bool dual_plane; - int32_t partitions; - int32_t color_endpoint_pairs; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_settings__ -#define __ISPC_STRUCT_astc_enc_settings__ -struct astc_enc_settings { - int32_t block_width; - int32_t block_height; - int32_t channels; - int32_t fastSkipTreshold; - int32_t refineIterations; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_block__ -#define __ISPC_STRUCT_astc_block__ -struct astc_block { - int32_t width; - int32_t height; - bool dual_plane; - int32_t weight_range; - uint8_t weights[64]; - int32_t color_component_selector; - int32_t partitions; - int32_t partition_id; - int32_t color_endpoint_pairs; - int32_t channels; - int32_t color_endpoint_modes[4]; - int32_t endpoint_range; - uint8_t endpoints[18]; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void astc_encode_ispc(struct rgba_surface * src, float * block_scores, uint8_t * dst, uint64_t * list, struct astc_enc_context * list_context, struct astc_enc_settings * settings); - extern void astc_rank_ispc(struct rgba_surface * src, int32_t xx, int32_t yy, uint32_t * mode_buffer, struct astc_enc_settings * settings); - extern int32_t get_programCount(); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_sse4.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_sse4.h deleted file mode 100644 index 47ad2a2c07..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_astc_ispc_sse4.h +++ /dev/null @@ -1,96 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_context__ -#define __ISPC_STRUCT_astc_enc_context__ -struct astc_enc_context { - int32_t width; - int32_t height; - int32_t channels; - bool dual_plane; - int32_t partitions; - int32_t color_endpoint_pairs; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_enc_settings__ -#define __ISPC_STRUCT_astc_enc_settings__ -struct astc_enc_settings { - int32_t block_width; - int32_t block_height; - int32_t channels; - int32_t fastSkipTreshold; - int32_t refineIterations; -}; -#endif - -#ifndef __ISPC_STRUCT_astc_block__ -#define __ISPC_STRUCT_astc_block__ -struct astc_block { - int32_t width; - int32_t height; - bool dual_plane; - int32_t weight_range; - uint8_t weights[64]; - int32_t color_component_selector; - int32_t partitions; - int32_t partition_id; - int32_t color_endpoint_pairs; - int32_t channels; - int32_t color_endpoint_modes[4]; - int32_t endpoint_range; - uint8_t endpoints[18]; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void astc_encode_ispc(struct rgba_surface * src, float * block_scores, uint8_t * dst, uint64_t * list, struct astc_enc_context * list_context, struct astc_enc_settings * settings); - extern void astc_rank_ispc(struct rgba_surface * src, int32_t xx, int32_t yy, uint32_t * mode_buffer, struct astc_enc_settings * settings); - extern int32_t get_programCount(); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc.h deleted file mode 100644 index 1dab508f81..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc.h +++ /dev/null @@ -1,104 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_bc6h_enc_settings__ -#define __ISPC_STRUCT_bc6h_enc_settings__ -struct bc6h_enc_settings { - bool slow_mode; - bool fast_mode; - int32_t refineIterations_1p; - int32_t refineIterations_2p; - int32_t fastSkipTreshold; -}; -#endif - -#ifndef __ISPC_STRUCT_bc7_enc_settings__ -#define __ISPC_STRUCT_bc7_enc_settings__ -struct bc7_enc_settings { - bool mode_selection[4]; - int32_t refineIterations[8]; - bool skip_mode2; - int32_t fastSkipTreshold_mode1; - int32_t fastSkipTreshold_mode3; - int32_t fastSkipTreshold_mode7; - int32_t mode45_channel0; - int32_t refineIterations_channel; - int32_t channels; -}; -#endif - -#ifndef __ISPC_STRUCT_etc_enc_settings__ -#define __ISPC_STRUCT_etc_enc_settings__ -struct etc_enc_settings { - int32_t fastSkipTreshold; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void CompressBlocksBC1_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC3_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC6H_ispc(struct rgba_surface * src, uint8_t * dst, struct bc6h_enc_settings * settings); - extern void CompressBlocksBC7_ispc(struct rgba_surface * src, uint8_t * dst, struct bc7_enc_settings * settings); - extern void CompressBlocksETC1_ispc(struct rgba_surface * src, uint8_t * dst, struct etc_enc_settings * settings); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_avx.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_avx.h deleted file mode 100644 index b8c26b6c0b..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_avx.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_bc6h_enc_settings__ -#define __ISPC_STRUCT_bc6h_enc_settings__ -struct bc6h_enc_settings { - bool slow_mode; - bool fast_mode; - int32_t refineIterations_1p; - int32_t refineIterations_2p; - int32_t fastSkipTreshold; -}; -#endif - -#ifndef __ISPC_STRUCT_bc7_enc_settings__ -#define __ISPC_STRUCT_bc7_enc_settings__ -struct bc7_enc_settings { - bool mode_selection[4]; - int32_t refineIterations[8]; - bool skip_mode2; - int32_t fastSkipTreshold_mode1; - int32_t fastSkipTreshold_mode3; - int32_t fastSkipTreshold_mode7; - int32_t mode45_channel0; - int32_t refineIterations_channel; - int32_t channels; -}; -#endif - -#ifndef __ISPC_STRUCT_etc_enc_settings__ -#define __ISPC_STRUCT_etc_enc_settings__ -struct etc_enc_settings { - int32_t fastSkipTreshold; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void CompressBlocksBC1_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC3_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC6H_ispc(struct rgba_surface * src, uint8_t * dst, struct bc6h_enc_settings * settings); - extern void CompressBlocksBC7_ispc(struct rgba_surface * src, uint8_t * dst, struct bc7_enc_settings * settings); - extern void CompressBlocksETC1_ispc(struct rgba_surface * src, uint8_t * dst, struct etc_enc_settings * settings); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_avx2.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_avx2.h deleted file mode 100644 index b8c26b6c0b..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_avx2.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_bc6h_enc_settings__ -#define __ISPC_STRUCT_bc6h_enc_settings__ -struct bc6h_enc_settings { - bool slow_mode; - bool fast_mode; - int32_t refineIterations_1p; - int32_t refineIterations_2p; - int32_t fastSkipTreshold; -}; -#endif - -#ifndef __ISPC_STRUCT_bc7_enc_settings__ -#define __ISPC_STRUCT_bc7_enc_settings__ -struct bc7_enc_settings { - bool mode_selection[4]; - int32_t refineIterations[8]; - bool skip_mode2; - int32_t fastSkipTreshold_mode1; - int32_t fastSkipTreshold_mode3; - int32_t fastSkipTreshold_mode7; - int32_t mode45_channel0; - int32_t refineIterations_channel; - int32_t channels; -}; -#endif - -#ifndef __ISPC_STRUCT_etc_enc_settings__ -#define __ISPC_STRUCT_etc_enc_settings__ -struct etc_enc_settings { - int32_t fastSkipTreshold; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void CompressBlocksBC1_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC3_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC6H_ispc(struct rgba_surface * src, uint8_t * dst, struct bc6h_enc_settings * settings); - extern void CompressBlocksBC7_ispc(struct rgba_surface * src, uint8_t * dst, struct bc7_enc_settings * settings); - extern void CompressBlocksETC1_ispc(struct rgba_surface * src, uint8_t * dst, struct etc_enc_settings * settings); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_sse2.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_sse2.h deleted file mode 100644 index b8c26b6c0b..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_sse2.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_bc6h_enc_settings__ -#define __ISPC_STRUCT_bc6h_enc_settings__ -struct bc6h_enc_settings { - bool slow_mode; - bool fast_mode; - int32_t refineIterations_1p; - int32_t refineIterations_2p; - int32_t fastSkipTreshold; -}; -#endif - -#ifndef __ISPC_STRUCT_bc7_enc_settings__ -#define __ISPC_STRUCT_bc7_enc_settings__ -struct bc7_enc_settings { - bool mode_selection[4]; - int32_t refineIterations[8]; - bool skip_mode2; - int32_t fastSkipTreshold_mode1; - int32_t fastSkipTreshold_mode3; - int32_t fastSkipTreshold_mode7; - int32_t mode45_channel0; - int32_t refineIterations_channel; - int32_t channels; -}; -#endif - -#ifndef __ISPC_STRUCT_etc_enc_settings__ -#define __ISPC_STRUCT_etc_enc_settings__ -struct etc_enc_settings { - int32_t fastSkipTreshold; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void CompressBlocksBC1_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC3_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC6H_ispc(struct rgba_surface * src, uint8_t * dst, struct bc6h_enc_settings * settings); - extern void CompressBlocksBC7_ispc(struct rgba_surface * src, uint8_t * dst, struct bc7_enc_settings * settings); - extern void CompressBlocksETC1_ispc(struct rgba_surface * src, uint8_t * dst, struct etc_enc_settings * settings); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_sse4.h b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_sse4.h deleted file mode 100644 index b8c26b6c0b..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/include/ISPC/kernel_ispc_sse4.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// (Header automatically generated by the ispc compiler.) -// DO NOT EDIT THIS FILE. -// - -#pragma once -#include - - - -#ifdef __cplusplus -namespace ispc { /* namespace */ -#endif // __cplusplus - -#ifndef __ISPC_ALIGN__ -#if defined(__clang__) || !defined(_MSC_VER) -// Clang, GCC, ICC -#define __ISPC_ALIGN__(s) __attribute__((aligned(s))) -#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s) -#else -// Visual Studio -#define __ISPC_ALIGN__(s) __declspec(align(s)) -#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct -#endif -#endif - -#ifndef __ISPC_STRUCT_rgba_surface__ -#define __ISPC_STRUCT_rgba_surface__ -struct rgba_surface { - uint8_t * ptr; - int32_t width; - int32_t height; - int32_t stride; -}; -#endif - -#ifndef __ISPC_STRUCT_bc6h_enc_settings__ -#define __ISPC_STRUCT_bc6h_enc_settings__ -struct bc6h_enc_settings { - bool slow_mode; - bool fast_mode; - int32_t refineIterations_1p; - int32_t refineIterations_2p; - int32_t fastSkipTreshold; -}; -#endif - -#ifndef __ISPC_STRUCT_bc7_enc_settings__ -#define __ISPC_STRUCT_bc7_enc_settings__ -struct bc7_enc_settings { - bool mode_selection[4]; - int32_t refineIterations[8]; - bool skip_mode2; - int32_t fastSkipTreshold_mode1; - int32_t fastSkipTreshold_mode3; - int32_t fastSkipTreshold_mode7; - int32_t mode45_channel0; - int32_t refineIterations_channel; - int32_t channels; -}; -#endif - -#ifndef __ISPC_STRUCT_etc_enc_settings__ -#define __ISPC_STRUCT_etc_enc_settings__ -struct etc_enc_settings { - int32_t fastSkipTreshold; -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Functions exported from ispc code -/////////////////////////////////////////////////////////////////////////// -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -extern "C" { -#endif // __cplusplus - extern void CompressBlocksBC1_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC3_ispc(struct rgba_surface * src, uint8_t * dst); - extern void CompressBlocksBC6H_ispc(struct rgba_surface * src, uint8_t * dst, struct bc6h_enc_settings * settings); - extern void CompressBlocksBC7_ispc(struct rgba_surface * src, uint8_t * dst, struct bc7_enc_settings * settings); - extern void CompressBlocksETC1_ispc(struct rgba_surface * src, uint8_t * dst, struct etc_enc_settings * settings); -#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C ) -} /* end extern C */ -#endif // __cplusplus - - -#ifdef __cplusplus -} /* namespace */ -#endif // __cplusplus diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/kernel.ispc b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/kernel.ispc deleted file mode 100644 index 1e1096caf7..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/kernel.ispc +++ /dev/null @@ -1,3686 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2016, Intel 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. -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////// -// generic helpers - -inline void swap_ints(int u[], int v[], uniform int n) -{ - for (uniform int i=0; i>bits; // (perf warning expected) -} - -/////////////////////////////////////////////////////////// -// BC1/BC7 shared - -struct rgba_surface -{ - uint8* ptr; - int width, height, stride; -}; - -inline void load_block_interleaved(float block[48], uniform rgba_surface* uniform src, int xx, uniform int yy) -{ - for (uniform int y = 0; y<4; y++) - for (uniform int x = 0; x<4; x++) - { - uniform unsigned int32* uniform src_ptr = (unsigned int32*)&src->ptr[(yy * 4 + y)*src->stride]; - unsigned int32 rgba = gather_uint(src_ptr, xx * 4 + x); - - block[16 * 0 + y * 4 + x] = (int)((rgba >> 0) & 255); - block[16 * 1 + y * 4 + x] = (int)((rgba >> 8) & 255); - block[16 * 2 + y * 4 + x] = (int)((rgba >> 16) & 255); - } -} - -inline void load_block_interleaved_rgba(float block[64], uniform rgba_surface* uniform src, int xx, uniform int yy) -{ - for (uniform int y=0; y<4; y++) - for (uniform int x=0; x<4; x++) - { - uniform unsigned int32* uniform src_ptr = (unsigned int32*)&src->ptr[(yy*4+y)*src->stride]; - unsigned int32 rgba = gather_uint(src_ptr, xx*4+x); - - block[16*0+y*4+x] = (int)((rgba>> 0)&255); - block[16*1+y*4+x] = (int)((rgba>> 8)&255); - block[16*2+y*4+x] = (int)((rgba>>16)&255); - block[16*3+y*4+x] = (int)((rgba>>24)&255); - } -} - -inline void load_block_interleaved_16bit(float block[48], uniform rgba_surface* uniform src, int xx, uniform int yy) -{ - for (uniform int y = 0; y<4; y++) - for (uniform int x = 0; x<4; x++) - { - uniform unsigned int32* uniform src_ptr_r = (unsigned int32*)&src->ptr[(yy * 4 + y)*src->stride + 0]; - uniform unsigned int32* uniform src_ptr_g = (unsigned int32*)&src->ptr[(yy * 4 + y)*src->stride + 2]; - uniform unsigned int32* uniform src_ptr_b = (unsigned int32*)&src->ptr[(yy * 4 + y)*src->stride + 4]; - unsigned int32 xr = gather_uint(src_ptr_r, (xx * 4 + x) * 2); - unsigned int32 xg = gather_uint(src_ptr_g, (xx * 4 + x) * 2); - unsigned int32 xb = gather_uint(src_ptr_b, (xx * 4 + x) * 2); - - block[16 * 0 + y * 4 + x] = (int)(xr & 0xFFFF); - block[16 * 1 + y * 4 + x] = (int)(xg & 0xFFFF); - block[16 * 2 + y * 4 + x] = (int)(xb & 0xFFFF); - block[16 * 3 + y * 4 + x] = 0; - } -} - -inline void store_data(uniform uint8 dst[], int width, int xx, uniform int yy, uint32 data[], int data_size) -{ - for (uniform int k=0; k> 8)) >> 8; -} - -inline unsigned int16 stb__As16Bit(int r, int g, int b) -{ - return (stb__Mul8Bit(r,31) << 11) + (stb__Mul8Bit(g,63) << 5) + stb__Mul8Bit(b,31); -} - -inline unsigned int16 enc_rgb565(float c[3]) -{ - return stb__As16Bit((int)c[0], (int)c[1], (int)c[2]); -} - -inline void dec_rgb565(float c[3], int p) -{ - int c2 = (p>>0)&31; - int c1 = (p>>5)&63; - int c0 = (p>>11)&31; - - c[0] = (c0<<3)+(c0>>2); - c[1] = (c1<<2)+(c1>>4); - c[2] = (c2<<3)+(c2>>2); -} - -inline void pick_endpoints_dc(int c0[3], int c1[3], int block[48], int iaxis[3]) -{ - for (uniform int p=0; p<3; p++) - for (uniform int y=0; y<4; y++) - for (uniform int x=0; x<4; x++) - { - c0[p] += block[p*16+y*4+x]; - } - - for (uniform int p=0; p<3; p++) - c0[p] >>= 4; -} - -inline void pick_endpoints(float c0[3], float c1[3], float block[48], float axis[3], float dc[3]) -{ - float min_dot = 256*256; - float max_dot = 0; - - for (uniform int y=0; y<4; y++) - for (uniform int x=0; x<4; x++) - { - float dot = 0; - for (uniform int p=0; p<3; p++) - dot += (block[p*16+y*4+x]-dc[p])*axis[p]; - - min_dot = min(min_dot, dot); - max_dot = max(max_dot, dot); - } - - if (max_dot-min_dot < 1f) - { - min_dot -= 0.5f; - max_dot += 0.5f; - } - - float norm_sq = 0; - for (uniform int p=0; p<3; p++) - norm_sq += axis[p]*axis[p]; - - float rnorm_sq = rcp(norm_sq); - for (uniform int p=0; p<3; p++) - { - c0[p] = clamp(dc[p]+min_dot*rnorm_sq*axis[p], 0, 255); - c1[p] = clamp(dc[p]+max_dot*rnorm_sq*axis[p], 0, 255); - } -} - -inline uint32 fast_quant(float block[48], int p0, int p1) -{ - float c0[3]; - float c1[3]; - dec_rgb565(c0, p0); - dec_rgb565(c1, p1); - - float dir[3]; - for (uniform int p=0; p<3; p++) dir[p] = c1[p]-c0[p]; - - float sq_norm = 0; - for (uniform int p=0; p<3; p++) sq_norm += sq(dir[p]); - - float rsq_norm = rcp(sq_norm); - - for (uniform int p=0; p<3; p++) dir[p] *= rsq_norm*3; - - float bias = 0.5; - for (uniform int p=0; p<3; p++) bias -= c0[p]*dir[p]; - - uint32 bits = 0; - uint32 scaler = 1; - for (uniform int k=0; k<16; k++) - { - float dot = 0; - for (uniform int p=0; p<3; p++) - dot += block[k+p*16]*dir[p]; - - int q = clamp((int)(dot+bias), 0, 3); - - //bits += q<<(k*2); - bits += q*scaler; - scaler *= 4; - } - - return bits; -} - -inline void compute_covar_dc(float covar[6], float dc[3], float block[48]) -{ - for (uniform int i=0; i<6; i++) covar[i] = 0; - for (uniform int p=0; p<3; p++) dc[p] = 0; - - for (uniform int k=0; k<16; k++) - { - for (uniform int p=0; p<3; p++) - dc[p] += block[k+p*16]; - } - - for (uniform int p=0; p<3; p++) dc[p] /= 16; - - for (uniform int k=0; k<16; k++) - { - float rgb[3]; - for (uniform int p=0; p<3; p++) - rgb[p] = block[k+p*16]-dc[p]; - - covar[0] += rgb[0]*rgb[0]; - covar[1] += rgb[0]*rgb[1]; - covar[2] += rgb[0]*rgb[2]; - - covar[3] += rgb[1]*rgb[1]; - covar[4] += rgb[1]*rgb[2]; - - covar[5] += rgb[2]*rgb[2]; - } -} - -// ugly, but makes BC1 compression 20% faster overall -inline void compute_covar_dc_ugly(float covar[6], float dc[3], float block[48]) -{ - for (uniform int p=0; p<3; p++) - { - float acc = 0; - for (uniform int k=0; k<16; k++) - acc += block[k+p*16]; - dc[p] = acc/16; - } - - float covar0 = 0f; - float covar1 = 0f; - float covar2 = 0f; - float covar3 = 0f; - float covar4 = 0f; - float covar5 = 0f; - - for (uniform int k=0; k<16; k++) - { - float rgb0, rgb1, rgb2; - rgb0 = block[k+0*16]-dc[0]; - rgb1 = block[k+1*16]-dc[1]; - rgb2 = block[k+2*16]-dc[2]; - - covar0 += rgb0*rgb0; - covar1 += rgb0*rgb1; - covar2 += rgb0*rgb2; - - covar3 += rgb1*rgb1; - covar4 += rgb1*rgb2; - - covar5 += rgb2*rgb2; - } - - covar[0] = covar0; - covar[1] = covar1; - covar[2] = covar2; - covar[3] = covar3; - covar[4] = covar4; - covar[5] = covar5; -} - -inline void bc1_refine(int pe[2], float block[48], unsigned int32 bits, float dc[3]) -{ - float c0[3]; - float c1[3]; - - if ((bits ^ (bits*4)) < 4) - { - // single color - for (uniform int p=0; p<3; p++) - { - c0[p] = dc[p]; - c1[p] = dc[p]; - } - } - else - { - float Atb1[3] = {0,0,0}; - float sum_q = 0; - float sum_qq = 0; - unsigned int32 shifted_bits = bits; - - for (uniform int k=0; k<16; k++) - { - float q = (int)(shifted_bits&3); - shifted_bits >>= 2; - - float x = 3-q; - float y = q; - - sum_q += q; - sum_qq += q*q; - - for (uniform int p=0; p<3; p++) Atb1[p] += x*block[k+p*16]; - } - - float sum[3]; - float Atb2[3]; - - for (uniform int p=0; p<3; p++) - { - sum[p] = dc[p]*16; - Atb2[p] = 3*sum[p]-Atb1[p]; - } - - float Cxx = 16*sq(3)-2*3*sum_q+sum_qq; - float Cyy = sum_qq; - float Cxy = 3*sum_q-sum_qq; - float scale = 3f * rcp(Cxx*Cyy - Cxy*Cxy); - - for (uniform int p=0; p<3; p++) - { - c0[p] = (Atb1[p]*Cyy - Atb2[p]*Cxy)*scale; - c1[p] = (Atb2[p]*Cxx - Atb1[p]*Cxy)*scale; - - c0[p] = clamp(c0[p], 0, 255); - c1[p] = clamp(c1[p], 0, 255); - } - } - - pe[0] = enc_rgb565(c0); - pe[1] = enc_rgb565(c1); -} - -inline uint32 fix_qbits(uint32 qbits) -{ - uniform const uint32 mask_01b = 0x55555555; - uniform const uint32 mask_10b = 0xAAAAAAAA; - - uint32 qbits0 = qbits&mask_01b; - uint32 qbits1 = qbits&mask_10b; - qbits = (qbits1>>1) + (qbits1 ^ (qbits0<<1)); - - return qbits; -} - -inline void CompressBlockBC1_core(float block[48], uint32 data[2]) -{ - uniform const int powerIterations = 4; - uniform const int refineIterations = 1; - - float covar[6]; - float dc[3]; - compute_covar_dc_ugly(covar, dc, block); - - float eps = 0.001; - covar[0] += eps; - covar[3] += eps; - covar[5] += eps; - - float axis[3]; - compute_axis3(axis, covar, powerIterations); - - float c0[3]; - float c1[3]; - pick_endpoints(c0, c1, block, axis, dc); - - int p[2]; - p[0] = enc_rgb565(c0); - p[1] = enc_rgb565(c1); - if (p[0] 0) q++; - if (q==8) q = 1; - - qblock[k/8] |= q << ((k%8)*3); - } - - // (could be improved by refinement) - - data[0] = clamp((int)ep[0], 0, 255)*256+clamp((int)ep[1], 0, 255); - data[0] |= qblock[0]<<16; - data[1] = qblock[0]>>16; - data[1] |= qblock[1]<<8; -} - -inline void CompressBlockBC1(uniform rgba_surface src[], int xx, uniform int yy, uniform uint8 dst[]) -{ - float block[48]; - uint32 data[2]; - - load_block_interleaved(block, src, xx, yy); - - CompressBlockBC1_core(block, data); - - store_data(dst, src->width, xx, yy, data, 2); -} - -inline void CompressBlockBC3(uniform rgba_surface src[], int xx, uniform int yy, uniform uint8 dst[]) -{ - float block[64]; - uint32 data[4]; - - load_block_interleaved_rgba(block, src, xx, yy); - - CompressBlockBC3_alpha(&block[48], &data[0]); - CompressBlockBC1_core(block, &data[2]); - - store_data(dst, src->width, xx, yy, data, 4); -} - -export void CompressBlocksBC1_ispc(uniform rgba_surface src[], uniform uint8 dst[]) -{ - for (uniform int yy = 0; yyheight/4; yy++) - foreach (xx = 0 ... src->width/4) - { - CompressBlockBC1(src, xx, yy, dst); - } -} - -export void CompressBlocksBC3_ispc(uniform rgba_surface src[], uniform uint8 dst[]) -{ - for (uniform int yy = 0; yyheight/4; yy++) - foreach (xx = 0 ... src->width/4) - { - CompressBlockBC3(src, xx, yy, dst); - } -} - -/////////////////////////////////////////////////////////// -// BC7 encoding - -struct bc7_enc_settings -{ - bool mode_selection[4]; - int refineIterations[8]; - - bool skip_mode2; - int fastSkipTreshold_mode1; - int fastSkipTreshold_mode3; - int fastSkipTreshold_mode7; - - int mode45_channel0; - int refineIterations_channel; - - int channels; -}; - -struct bc7_enc_state -{ - float block[64]; - - float opaque_err; // error for coding alpha=255 - float best_err; - uint32 best_data[5]; // 4, +1 margin for skips - - // settings - uniform bool mode_selection[4]; - uniform int refineIterations[8]; - - uniform bool skip_mode2; - uniform int fastSkipTreshold_mode1; - uniform int fastSkipTreshold_mode3; - uniform int fastSkipTreshold_mode7; - - uniform int mode45_channel0; - uniform int refineIterations_channel; - - uniform int channels; -}; - -struct mode45_parameters -{ - int qep[8]; - uint32 qblock[2]; - int aqep[2]; - uint32 aqblock[2]; - int rotation; - int swap; -}; - -void bc7_code_mode01237(uint32 data[5], int qep[6], uint32 qblock[2], int part_id, uniform int mode); -void bc7_code_mode45(uint32 data[5], mode45_parameters params[], uniform int mode); -void bc7_code_mode6(uint32 data[5], int qep[8], uint32 qblock[2]); - -/////////////////////////// -// BC7 format data - -inline uniform const int* uniform get_unquant_table(uniform int bits) -{ - assert(bits>=2 && bits<=4); // invalid bit size - - static uniform const int unquant_table_2bits[] = { 0, 21, 43, 64 }; - static uniform const int unquant_table_3bits[] = { 0, 9, 18, 27, 37, 46, 55, 64 }; - static uniform const int unquant_table_4bits[] = { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; - - uniform const int* uniform unquant_tables[] = {unquant_table_2bits, unquant_table_3bits, unquant_table_4bits}; - - return unquant_tables[bits-2]; -} - -inline uint32 get_pattern(int part_id) -{ - static uniform const uint32 pattern_table[] = { - 0x50505050u, 0x40404040u, 0x54545454u, 0x54505040u, 0x50404000u, 0x55545450u, 0x55545040u, 0x54504000u, - 0x50400000u, 0x55555450u, 0x55544000u, 0x54400000u, 0x55555440u, 0x55550000u, 0x55555500u, 0x55000000u, - 0x55150100u, 0x00004054u, 0x15010000u, 0x00405054u, 0x00004050u, 0x15050100u, 0x05010000u, 0x40505054u, - 0x00404050u, 0x05010100u, 0x14141414u, 0x05141450u, 0x01155440u, 0x00555500u, 0x15014054u, 0x05414150u, - 0x44444444u, 0x55005500u, 0x11441144u, 0x05055050u, 0x05500550u, 0x11114444u, 0x41144114u, 0x44111144u, - 0x15055054u, 0x01055040u, 0x05041050u, 0x05455150u, 0x14414114u, 0x50050550u, 0x41411414u, 0x00141400u, - 0x00041504u, 0x00105410u, 0x10541000u, 0x04150400u, 0x50410514u, 0x41051450u, 0x05415014u, 0x14054150u, - 0x41050514u, 0x41505014u, 0x40011554u, 0x54150140u, 0x50505500u, 0x00555050u, 0x15151010u, 0x54540404u, - 0xAA685050u, 0x6A5A5040u, 0x5A5A4200u, 0x5450A0A8u, 0xA5A50000u, 0xA0A05050u, 0x5555A0A0u, 0x5A5A5050u, - 0xAA550000u, 0xAA555500u, 0xAAAA5500u, 0x90909090u, 0x94949494u, 0xA4A4A4A4u, 0xA9A59450u, 0x2A0A4250u, - 0xA5945040u, 0x0A425054u, 0xA5A5A500u, 0x55A0A0A0u, 0xA8A85454u, 0x6A6A4040u, 0xA4A45000u, 0x1A1A0500u, - 0x0050A4A4u, 0xAAA59090u, 0x14696914u, 0x69691400u, 0xA08585A0u, 0xAA821414u, 0x50A4A450u, 0x6A5A0200u, - 0xA9A58000u, 0x5090A0A8u, 0xA8A09050u, 0x24242424u, 0x00AA5500u, 0x24924924u, 0x24499224u, 0x50A50A50u, - 0x500AA550u, 0xAAAA4444u, 0x66660000u, 0xA5A0A5A0u, 0x50A050A0u, 0x69286928u, 0x44AAAA44u, 0x66666600u, - 0xAA444444u, 0x54A854A8u, 0x95809580u, 0x96969600u, 0xA85454A8u, 0x80959580u, 0xAA141414u, 0x96960000u, - 0xAAAA1414u, 0xA05050A0u, 0xA0A5A5A0u, 0x96000000u, 0x40804080u, 0xA9A8A9A8u, 0xAAAAAA44u, 0x2A4A5254u - }; - - return gather_uint(pattern_table, part_id); -} - -inline int get_pattern_mask(int part_id, int j) -{ - static uniform const uint32 pattern_mask_table[] = { - 0xCCCC3333u, 0x88887777u, 0xEEEE1111u, 0xECC81337u, 0xC880377Fu, 0xFEEC0113u, 0xFEC80137u, 0xEC80137Fu, - 0xC80037FFu, 0xFFEC0013u, 0xFE80017Fu, 0xE80017FFu, 0xFFE80017u, 0xFF0000FFu, 0xFFF0000Fu, 0xF0000FFFu, - 0xF71008EFu, 0x008EFF71u, 0x71008EFFu, 0x08CEF731u, 0x008CFF73u, 0x73108CEFu, 0x3100CEFFu, 0x8CCE7331u, - 0x088CF773u, 0x3110CEEFu, 0x66669999u, 0x366CC993u, 0x17E8E817u, 0x0FF0F00Fu, 0x718E8E71u, 0x399CC663u, - 0xAAAA5555u, 0xF0F00F0Fu, 0x5A5AA5A5u, 0x33CCCC33u, 0x3C3CC3C3u, 0x55AAAA55u, 0x96966969u, 0xA55A5AA5u, - 0x73CE8C31u, 0x13C8EC37u, 0x324CCDB3u, 0x3BDCC423u, 0x69969669u, 0xC33C3CC3u, 0x99666699u, 0x0660F99Fu, - 0x0272FD8Du, 0x04E4FB1Bu, 0x4E40B1BFu, 0x2720D8DFu, 0xC93636C9u, 0x936C6C93u, 0x39C6C639u, 0x639C9C63u, - 0x93366CC9u, 0x9CC66339u, 0x817E7E81u, 0xE71818E7u, 0xCCF0330Fu, 0x0FCCF033u, 0x774488BBu, 0xEE2211DDu, - 0x08CC0133u, 0x8CC80037u, 0xCC80006Fu, 0xEC001331u, 0x330000FFu, 0x00CC3333u, 0xFF000033u, 0xCCCC0033u, - 0x0F0000FFu, 0x0FF0000Fu, 0x00F0000Fu, 0x44443333u, 0x66661111u, 0x22221111u, 0x136C0013u, 0x008C8C63u, - 0x36C80137u, 0x08CEC631u, 0x3330000Fu, 0xF0000333u, 0x00EE1111u, 0x88880077u, 0x22C0113Fu, 0x443088CFu, - 0x0C22F311u, 0x03440033u, 0x69969009u, 0x9960009Fu, 0x03303443u, 0x00660699u, 0xC22C3113u, 0x8C0000EFu, - 0x1300007Fu, 0xC4003331u, 0x004C1333u, 0x22229999u, 0x00F0F00Fu, 0x24929249u, 0x29429429u, 0xC30C30C3u, - 0xC03C3C03u, 0x00AA0055u, 0xAA0000FFu, 0x30300303u, 0xC0C03333u, 0x90900909u, 0xA00A5005u, 0xAAA0000Fu, - 0x0AAA0555u, 0xE0E01111u, 0x70700707u, 0x6660000Fu, 0x0EE01111u, 0x07707007u, 0x06660999u, 0x660000FFu, - 0x00660099u, 0x0CC03333u, 0x03303003u, 0x60000FFFu, 0x80807777u, 0x10100101u, 0x000A0005u, 0x08CE8421u - }; - - uint32 mask_packed = gather_uint(pattern_mask_table, part_id); - int mask0 = mask_packed&0xFFFF; - int mask1 = mask_packed>>16; - - int mask = (j==2) ? (~mask0)&(~mask1) : ( (j==0) ? mask0 : mask1 ); - return mask; -} - -inline void get_skips(int skips[3], int part_id) -{ - static uniform const int skip_table[] = { - 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, - 0xf0u, 0x20u, 0x80u, 0x20u, 0x20u, 0x80u, 0x80u, 0xf0u, 0x20u, 0x80u, 0x20u, 0x20u, 0x80u, 0x80u, 0x20u, 0x20u, - 0xf0u, 0xf0u, 0x60u, 0x80u, 0x20u, 0x80u, 0xf0u, 0xf0u, 0x20u, 0x80u, 0x20u, 0x20u, 0x20u, 0xf0u, 0xf0u, 0x60u, - 0x60u, 0x20u, 0x60u, 0x80u, 0xf0u, 0xf0u, 0x20u, 0x20u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0x20u, 0x20u, 0xf0u, - 0x3fu, 0x38u, 0xf8u, 0xf3u, 0x8fu, 0x3fu, 0xf3u, 0xf8u, 0x8fu, 0x8fu, 0x6fu, 0x6fu, 0x6fu, 0x5fu, 0x3fu, 0x38u, - 0x3fu, 0x38u, 0x8fu, 0xf3u, 0x3fu, 0x38u, 0x6fu, 0xa8u, 0x53u, 0x8fu, 0x86u, 0x6au, 0x8fu, 0x5fu, 0xfau, 0xf8u, - 0x8fu, 0xf3u, 0x3fu, 0x5au, 0x6au, 0xa8u, 0x89u, 0xfau, 0xf6u, 0x3fu, 0xf8u, 0x5fu, 0xf3u, 0xf6u, 0xf6u, 0xf8u, - 0x3fu, 0xf3u, 0x5fu, 0x5fu, 0x5fu, 0x8fu, 0x5fu, 0xafu, 0x5fu, 0xafu, 0x8fu, 0xdfu, 0xf3u, 0xcfu, 0x3fu, 0x38u - }; - - int skip_packed = gather_int(skip_table, part_id); - skips[0] = 0; - skips[1] = skip_packed>>4; - skips[2] = skip_packed&15; -} - -/////////////////////////// -// PCA helpers - -inline void compute_stats_masked(float stats[15], float block[64], int mask, uniform int channels) -{ - for (uniform int i=0; i<15; i++) stats[i] = 0; - - int mask_shifted = mask<<1; - for (uniform int k=0; k<16; k++) - { - mask_shifted >>= 1; - //if ((mask_shifted&1) == 0) continue; - int flag = (mask_shifted&1); - - float rgba[4]; - for (uniform int p=0; p>= 1; - if ((mask_shifted&1) == 0) continue; - - float dot = 0; - for (uniform int p=0; p= 4); - int vv = v<<(8-bits); - return vv + shift_right(vv, bits); -} - -void ep_quant0367(int qep[], float ep[], uniform int mode, uniform int channels) -{ - uniform int bits = 7; - if (mode == 0) bits = 4; - if (mode == 7) bits = 5; - - uniform int levels = 1 << bits; - uniform int levels2 = levels*2-1; - - for (uniform int i=0; i<2; i++) - { - int qep_b[8]; - - for (uniform int b=0; b<2; b++) - for (uniform int p=0; p<4; p++) - { - int v = (int)((ep[i*4+p]/255f*levels2-b)/2+0.5)*2+b; - qep_b[b*4+p] = clamp(v, b, levels2-1+b); - } - - float ep_b[8]; - for (uniform int j=0; j<8; j++) - ep_b[j] = qep_b[j]; - - if (mode==0) - for (uniform int j=0; j<8; j++) - ep_b[j] = unpack_to_byte(qep_b[j], 5); - - float err0 = 0f; - float err1 = 0f; - for (uniform int p=0; p>= 2; - - float proj = 0; - float div = 0; - for (uniform int p=0; p=0 && best_q<=levels-1); - - qblock[k/8] += ((uint32)best_q) << 4*(k%8); - total_err += best_err; - } - - return total_err; -} - -/////////////////////////// -// LS endpoint refinement - -void opt_endpoints(float ep[], float block[64], uniform int bits, uint32 qblock[2], int mask, uniform int channels) -{ - uniform int levels = 1 << bits; - - float Atb1[4] = {0,0,0,0}; - float sum_q = 0; - float sum_qq = 0; - float sum[5] = {0,0,0,0,0}; - - int mask_shifted = mask<<1; - for (uniform int k1=0; k1<2; k1++) - { - uint32 qbits_shifted = qblock[k1]; - for (uniform int k2=0; k2<8; k2++) - { - uniform int k = k1*8+k2; - float q = (int)(qbits_shifted&15); - qbits_shifted >>= 4; - - mask_shifted >>= 1; - if ((mask_shifted&1) == 0) continue; - - int x = (levels-1)-q; - int y = q; - - sum_q += q; - sum_qq += q*q; - - sum[4] += 1; - for (uniform int p=0; pblock, part_id, mode); - - if (errrefineIterations[mode]; - for (uniform int _=0; _block, bits, best_qblock, mask, channels); - } - - int qep[24]; - uint32 qblock[2]; - - ep_quant_dequant(qep, ep, mode, channels); - - uint32 pattern = get_pattern(best_part_id); - float err = block_quant(qblock, state->block, bits, ep, pattern, channels); - - if (erropaque_err; // take into account alpha channel - - if (best_errbest_err) - { - state->best_err = best_err; - bc7_code_mode01237(state->best_data, best_qep, best_qblock, best_part_id, mode); - } -} - -void partial_sort_list(int list[], uniform int length, uniform int partial_count) -{ - for (uniform int k=0; k list[i]) - { - best_value = list[i]; - best_idx = i; - } - } - - // swap - scatter_int(list, best_idx, list[k]); - list[k] = best_value; - } -} - -void bc7_enc_mode02(bc7_enc_state state[]) -{ - int part_list[64]; - for (uniform int part=0; part<64; part++) - part_list[part] = part; - - bc7_enc_mode01237(state, 0, part_list, 16); - if (!state->skip_mode2) bc7_enc_mode01237(state, 2, part_list, 64); // usually not worth the time -} - -void bc7_enc_mode13(bc7_enc_state state[]) -{ - if (state->fastSkipTreshold_mode1 == 0 && state->fastSkipTreshold_mode3 == 0) return; - - float full_stats[15]; - compute_stats_masked(full_stats, state->block, -1, 3); - - int part_list[64]; - for (uniform int part=0; part<64; part++) - { - int mask = get_pattern_mask(part+0, 0); - float bound12 = block_pca_bound_split(state->block, mask, full_stats, 3); - int bound = (int)(bound12); - part_list[part] = part+bound*64; - } - - partial_sort_list(part_list, 64, max(state->fastSkipTreshold_mode1, state->fastSkipTreshold_mode3)); - bc7_enc_mode01237(state, 1, part_list, state->fastSkipTreshold_mode1); - bc7_enc_mode01237(state, 3, part_list, state->fastSkipTreshold_mode3); -} - -void bc7_enc_mode7(bc7_enc_state state[]) -{ - if (state->fastSkipTreshold_mode7 == 0) return; - - float full_stats[15]; - compute_stats_masked(full_stats, state->block, -1, state->channels); - - int part_list[64]; - for (uniform int part=0; part<64; part++) - { - int mask = get_pattern_mask(part+0, 0); - float bound12 = block_pca_bound_split(state->block, mask, full_stats, state->channels); - int bound = (int)(bound12); - part_list[part] = part+bound*64; - } - - partial_sort_list(part_list, 64, state->fastSkipTreshold_mode7); - bc7_enc_mode01237(state, 7, part_list, state->fastSkipTreshold_mode7); -} - -void channel_quant_dequant(int qep[2], float ep[2], uniform int epbits) -{ - int elevels = (1<>= 4; - - int x = (levels-1)-q; - int y = q; - - sum_q += q; - sum_qq += q*q; - - sum += block[k]; - Atb1 += x*block[k]; - } - } - - float Atb2 = (levels-1)*sum-Atb1; - - float Cxx = 16*sq(levels-1)-2*(levels-1)*sum_q+sum_qq; - float Cyy = sum_qq; - float Cxy = (levels-1)*sum_q-sum_qq; - float scale = (levels-1) / (Cxx*Cyy - Cxy*Cxy); - - ep[0] = (Atb1*Cyy - Atb2*Cxy)*scale; - ep[1] = (Atb2*Cxx - Atb1*Cxy)*scale; - - ep[0] = clamp(ep[0], 0, 255); - ep[1] = clamp(ep[1], 0, 255); - - if (abs(Cxx*Cyy - Cxy*Cxy) < 0.001) - { - ep[0] = sum/16; - ep[1] = ep[0]; - } -} - -float channel_opt_quant(uint32 qblock[2], float block[16], uniform int bits, float ep[]) -{ - uniform const int* uniform unquant_table = get_unquant_table(bits); - int levels = (1<refineIterations_channel; - for (uniform int i=0; iblock[k+p*16]; - - if (rotation < 3) - { - // apply channel rotation - if (state->channels == 4) block[k+rotation*16] = state->block[k+3*16]; - if (state->channels == 3) block[k+rotation*16] = 255; - } - } - - float ep[8]; - block_segment(ep, block, -1, 3); - - int qep[8]; - ep_quant_dequant(qep, ep, mode, 3); - - uint32 qblock[2]; - float err = block_quant(qblock, block, bits, ep, 0, 3); - - // refine - uniform int refineIterations = state->refineIterations[mode]; - for (uniform int i=0; iblock[rotation*16], abits, aepbits); - - if (err<*best_err) - { - - swap_ints(best_candidate->qep, qep, 8); - swap_uints(best_candidate->qblock, qblock, 2); - swap_ints(best_candidate->aqep, aqep, 2); - swap_uints(best_candidate->aqblock, aqblock, 2); - best_candidate->rotation = rotation; - best_candidate->swap = swap; - *best_err = err; - } -} - -void bc7_enc_mode45(bc7_enc_state state[]) -{ - mode45_parameters best_candidate; - float best_err = state->best_err; - - memset(&best_candidate, 0, sizeof(mode45_parameters)); - - uniform int channel0 = state->mode45_channel0; - for (uniform int p=channel0; pchannels; p++) - { - bc7_enc_mode45_candidate(state, &best_candidate, &best_err, 4, p, 0); - bc7_enc_mode45_candidate(state, &best_candidate, &best_err, 4, p, 1); - } - - // mode 4 - if (best_errbest_err) - { - state->best_err = best_err; - bc7_code_mode45(state->best_data, &best_candidate, 4); - } - - for (uniform int p=channel0; pchannels; p++) - { - bc7_enc_mode45_candidate(state, &best_candidate, &best_err, 5, p, 0); - } - - // mode 5 - if (best_errbest_err) - { - state->best_err = best_err; - bc7_code_mode45(state->best_data, &best_candidate, 5); - } -} - -void bc7_enc_mode6(bc7_enc_state state[]) -{ - uniform int mode = 6; - uniform int bits = 4; - float ep[8]; - block_segment(ep, state->block, -1, state->channels); - - if (state->channels == 3) - { - ep[3] = ep[7] = 255; - } - - int qep[8]; - ep_quant_dequant(qep, ep, mode, state->channels); - - uint32 qblock[2]; - float err = block_quant(qblock, state->block, bits, ep, 0, state->channels); - - // refine - uniform int refineIterations = state->refineIterations[mode]; - for (uniform int i=0; iblock, bits, qblock, -1, state->channels); - ep_quant_dequant(qep, ep, mode, state->channels); - err = block_quant(qblock, state->block, bits, ep, 0, state->channels); - } - - if (errbest_err) - { - state->best_err = err; - bc7_code_mode6(state->best_data, qep, qblock); - } -} - -////////////////////////// -// BC7 bitstream coding - -void bc7_code_apply_swap_mode456(int qep[], uniform int channels, uint32 qblock[2], uniform int bits) -{ - uniform int levels = 1 << bits; - if ((qblock[0]&15)>=levels/2) - { - swap_ints(&qep[0], &qep[channels], channels); - - for (uniform int k=0; k<2; k++) - qblock[k] = (uint32)(0x11111111*(levels-1)) - qblock[k]; - } - - assert((qblock[0]&15) < levels/2); -} - -int bc7_code_apply_swap_mode01237(int qep[], uint32 qblock[2], uniform int mode, int part_id) -{ - uniform int bits = 2; if (mode == 0 || mode == 1) bits = 3; - uniform int pairs = 2; if (mode == 0 || mode == 2) pairs = 3; - - int flips = 0; - uniform int levels = 1 << bits; - int skips[3]; - get_skips(skips, part_id); - - for (uniform int j=0; j>((k0%8)*4))&15; - int q = ((gather_uint(qblock, k0>>3)<<(28-(k0&7)*4))>>28); - - if (q>=levels/2) - { - swap_ints(&qep[8*j], &qep[8*j+4], 4); - uint32 pmask = get_pattern_mask(part_id, j); - flips |= pmask; - } - } - - return flips; -} - -void put_bits(uint32 data[5], uniform int* uniform pos, uniform int bits, int v) -{ - assert(v32) - { - data[*pos/32+1] |= shift_right(v, 32-*pos%32); - } - *pos += bits; -} - -inline void data_shl_1bit_from(uint32 data[5], int from) -{ - if (from < 96) - { - assert(from > 64+10); - - uint32 shifted = (data[2]>>1) | (data[3]<<31); - uint32 mask = (pow2(from-64)-1)>>1; - data[2] = (mask&data[2]) | (~mask&shifted); - data[3] = (data[3]>>1) | (data[4]<<31); - data[4] = data[4]>>1; - } - else if (from < 128) - { - uint32 shifted = (data[3]>>1) | (data[4]<<31); - uint32 mask = (pow2(from-96)-1)>>1; - data[3] = (mask&data[3]) | (~mask&shifted); - data[4] = data[4]>>1; - } -} - -void bc7_code_qblock(uint32 data[5], uniform int* uniform pPos, uint32 qblock[2], uniform int bits, int flips) -{ - uniform int levels = 1 << bits; - int flips_shifted = flips; - for (uniform int k1=0; k1<2; k1++) - { - uint32 qbits_shifted = qblock[k1]; - for (uniform int k2=0; k2<8; k2++) - { - int q = qbits_shifted&15; - if ((flips_shifted&1)>0) q = (levels-1)-q; - - if (k1==0 && k2==0) put_bits(data, pPos, bits-1, q); - else put_bits(data, pPos, bits , q); - qbits_shifted >>= 4; - flips_shifted >>= 1; - } - } -} - -void bc7_code_adjust_skip_mode01237(uint32 data[5], uniform int mode, int part_id) -{ - uniform int bits = 2; if (mode == 0 || mode == 1) bits = 3; - uniform int pairs = 2; if (mode == 0 || mode == 2) pairs = 3; - - int skips[3]; - get_skips(skips, part_id); - - if (pairs>2 && skips[1] < skips[2]) - { - int t = skips[1]; skips[1] = skips[2]; skips[2] = t; - } - - for (uniform int j=1; j>1); - } - else if (mode == 1) - { - put_bits(data, &pos, 6, qep[j*4+0+p]>>1); - } - else if (mode == 2) - { - put_bits(data, &pos, 5, qep[j*4+0+p]); - } - else if (mode == 3) - { - put_bits(data, &pos, 7, qep[j*4+0+p]>>1); - } - else if (mode == 7) - { - put_bits(data, &pos, 5, qep[j*4+0+p]>>1); - } - else - { - assert(false); - } - } - - // p bits - if (mode == 1) - for (uniform int j=0; j<2; j++) - { - put_bits(data, &pos, 1, qep[j*8]&1); - } - - if (mode == 0 || mode == 3 || mode == 7) - for (uniform int j=0; jqep, qep, 8); - swap_uints(params->qblock, qblock, 2); - swap_ints(params->aqep, aqep, 2); - swap_uints(params->aqblock, aqblock, 2); - int rotation = params->rotation; - int swap = params->swap; - - uniform int bits = 2; - uniform int abits = 2; if (mode==4) abits = 3; - uniform int epbits = 7; if (mode==4) epbits = 5; - uniform int aepbits = 8; if (mode==4) aepbits = 6; - - if (!swap) - { - bc7_code_apply_swap_mode456(qep, 4, qblock, bits); - bc7_code_apply_swap_mode456(aqep, 1, aqblock, abits); - } - else - { - swap_uints(qblock, aqblock, 2); - bc7_code_apply_swap_mode456(aqep, 1, qblock, bits); - bc7_code_apply_swap_mode456(qep, 4, aqblock, abits); - } - - for (uniform int k=0; k<5; k++) data[k] = 0; - uniform int pos = 0; - - // mode 4-5 - put_bits(data, &pos, mode+1, 1<>1); - put_bits(data, &pos, 7, qep[4+p]>>1); - } - - // p bits - put_bits(data, &pos, 1, qep[0]&1); - put_bits(data, &pos, 1, qep[4]&1); - - // quantized values - bc7_code_qblock(data, &pos, qblock, 4, 0); -} - - -////////////////////////// -// BC7 core - -inline void CompressBlockBC7_core(bc7_enc_state state[]) -{ - if (state->mode_selection[0]) bc7_enc_mode02(state); - if (state->mode_selection[1]) bc7_enc_mode13(state); - if (state->mode_selection[1]) bc7_enc_mode7(state); - if (state->mode_selection[2]) bc7_enc_mode45(state); - if (state->mode_selection[3]) bc7_enc_mode6(state); -} - -void bc7_enc_copy_settings(bc7_enc_state state[], uniform bc7_enc_settings settings[]) -{ - state->channels = settings->channels; - - // mode02 - state->mode_selection[0] = settings->mode_selection[0]; - state->skip_mode2 = settings->skip_mode2; - - state->refineIterations[0] = settings->refineIterations[0]; - state->refineIterations[2] = settings->refineIterations[2]; - - // mode137 - state->mode_selection[1] = settings->mode_selection[1]; - state->fastSkipTreshold_mode1 = settings->fastSkipTreshold_mode1; - state->fastSkipTreshold_mode3 = settings->fastSkipTreshold_mode3; - state->fastSkipTreshold_mode7 = settings->fastSkipTreshold_mode7; - - state->refineIterations[1] = settings->refineIterations[1]; - state->refineIterations[3] = settings->refineIterations[3]; - state->refineIterations[7] = settings->refineIterations[7]; - - // mode45 - state->mode_selection[2] = settings->mode_selection[2]; - - state->mode45_channel0 = settings->mode45_channel0; - state->refineIterations_channel = settings->refineIterations_channel; - state->refineIterations[4] = settings->refineIterations[4]; - state->refineIterations[5] = settings->refineIterations[5]; - - // mode6 - state->mode_selection[3] = settings->mode_selection[3]; - - state->refineIterations[6] = settings->refineIterations[6]; -} - -inline void CompressBlockBC7(uniform rgba_surface src[], int xx, uniform int yy, uniform uint8 dst[], - uniform bc7_enc_settings settings[]) -{ - bc7_enc_state _state; - varying bc7_enc_state* uniform state = &_state; - - bc7_enc_copy_settings(state, settings); - load_block_interleaved_rgba(state->block, src, xx, yy); - state->best_err = 1e99; - state->opaque_err = compute_opaque_err(state->block, state->channels); - - CompressBlockBC7_core(state); - - store_data(dst, src->width, xx, yy, state->best_data, 4); -} - -export void CompressBlocksBC7_ispc(uniform rgba_surface src[], uniform uint8 dst[], uniform bc7_enc_settings settings[]) -{ - for (uniform int yy = 0; yyheight/4; yy++) - foreach (xx = 0 ... src->width/4) - { - CompressBlockBC7(src, xx, yy, dst, settings); - } -} - -/////////////////////////////////////////////////////////// -// BC6H encoding - -struct bc6h_enc_settings -{ - bool slow_mode; - bool fast_mode; - int refineIterations_1p; - int refineIterations_2p; - int fastSkipTreshold; -}; - -struct bc6h_enc_state -{ - float block[64]; - - float best_err; - uint32 best_data[5]; // 4, +1 margin for skips - - float rgb_bounds[6]; - float max_span; - int max_span_idx; - - int mode; - int epb; - int qbounds[8]; - - // settings - uniform bool slow_mode; - uniform bool fast_mode; - uniform int refineIterations_1p; - uniform int refineIterations_2p; - uniform int fastSkipTreshold; -}; - -void bc6h_code_2p(uint32 data[5], int pqep[], uint32 qblock[2], int part_id, int mode); -void bc6h_code_1p(uint32 data[5], int qep[8], uint32 qblock[2], int mode); - -/////////////////////////// -// BC6H format data - -inline uniform int get_mode_prefix(uniform int mode) -{ - static uniform const int mode_prefix_table[] = - { - 0, 1, 2, 6, 10, 14, 18, 22, 26, 30, 3, 7, 11, 15 - }; - - return mode_prefix_table[mode]; -} - -inline uniform float get_span(uniform int mode) -{ - static uniform const float span_table[] = - { - 0.9 * 0xFFFF / 64, // (0) 4 / 10 - 0.9 * 0xFFFF / 4, // (1) 5 / 7 - 0.8 * 0xFFFF / 256, // (2) 3 / 11 - -1, -1, - 0.9 * 0xFFFF / 32, // (5) 4 / 9 - 0.9 * 0xFFFF / 16, // (6) 4 / 8 - -1, -1, - 0xFFFF, // (9) absolute - 0xFFFF, // (10) absolute - 0.95 * 0xFFFF / 8, // (11) 8 / 11 - 0.95 * 0xFFFF / 32, // (12) 7 / 12 - 6, // (13) 3 / 16 - }; - - uniform int span = span_table[mode]; - assert(span > 0); - return span; -} - -inline uniform int get_mode_bits(uniform int mode) -{ - static uniform const int mode_bits_table[] = - { - 10, 7, 11, -1, -1, - 9, 8, -1, -1, 6, - 10, 11, 12, 16, - }; - - uniform int mode_bits = mode_bits_table[mode]; - assert(mode_bits > 0); - return mode_bits; -} - -/////////////////////////// -// endpoint quantization - -inline int unpack_to_uf16(uint32 v, int bits) -{ - if (bits >= 15) return v; - if (v == 0) return 0; - if (v == (1<epb; - ep_quant_bc6h(qep, ep, bits, pairs); - - for (uniform int i = 0; i < 2 * pairs; i++) - for (uniform int p = 0; p < 3; p++) - { - qep[i * 4 + p] = clamp(qep[i * 4 + p], state->qbounds[p], state->qbounds[4 + p]); - } - - ep_dequant_bc6h(ep, qep, bits, pairs); - -} - -////////////////////////// -// parameter estimation - -float bc6h_enc_2p_part_fast(bc6h_enc_state state[], int qep[16], uint32 qblock[2], int part_id) -{ - uint32 pattern = get_pattern(part_id); - uniform int bits = 3; - uniform int pairs = 2; - uniform int channels = 3; - - float ep[16]; - for (uniform int j = 0; jblock, mask, channels); - } - - ep_quant_dequant_bc6h(state, qep, ep, 2); - - float total_err = block_quant(qblock, state->block, bits, ep, pattern, channels); - return total_err; - -} - -void bc6h_enc_2p_list(bc6h_enc_state state[], int part_list[], uniform int part_count) -{ - if (part_count == 0) return; - uniform int bits = 3; - uniform int pairs = 2; - uniform int channels = 3; - - int best_qep[24]; - uint32 best_qblock[2]; - int best_part_id = -1; - float best_err = 1e99; - - for (uniform int part = 0; partrefineIterations_2p; - for (uniform int _ = 0; _block, bits, best_qblock, mask, channels); - } - - int qep[24]; - uint32 qblock[2]; - ep_quant_dequant_bc6h(state, qep, ep, 2); - - uint32 pattern = get_pattern(best_part_id); - float err = block_quant(qblock, state->block, bits, ep, pattern, channels); - - if (errbest_err) - { - state->best_err = best_err; - bc6h_code_2p(state->best_data, best_qep, best_qblock, best_part_id, state->mode); - } -} - -void bc6h_enc_2p(bc6h_enc_state state[]) -{ - float full_stats[15]; - compute_stats_masked(full_stats, state->block, -1, 3); - - int part_list[32]; - for (uniform int part = 0; part < 32; part++) - { - int mask = get_pattern_mask(part, 0); - float bound12 = block_pca_bound_split(state->block, mask, full_stats, 3); - int bound = (int)(bound12); - part_list[part] = part + bound * 64; - } - - partial_sort_list(part_list, 32, state->fastSkipTreshold); - bc6h_enc_2p_list(state, part_list, state->fastSkipTreshold); -} - -void bc6h_enc_1p(bc6h_enc_state state[]) -{ - float ep[8]; - block_segment_core(ep, state->block, -1, 3); - - int qep[8]; - ep_quant_dequant_bc6h(state, qep, ep, 1); - - uint32 qblock[2]; - float err = block_quant(qblock, state->block, 4, ep, 0, 3); - - // refine - uniform int refineIterations = state->refineIterations_1p; - for (uniform int i = 0; iblock, 4, qblock, -1, 3); - ep_quant_dequant_bc6h(state, qep, ep, 1); - err = block_quant(qblock, state->block, 4, ep, 0, 3); - } - - if (err < state->best_err) - { - state->best_err = err; - bc6h_code_1p(state->best_data, qep, qblock, state->mode); - } -} - -inline void compute_qbounds(bc6h_enc_state state[], float rgb_span[3]) -{ - float bounds[8]; - for (uniform int p = 0; p < 3; p++) - { - float middle = (state->rgb_bounds[p] + state->rgb_bounds[3 + p]) / 2; - - bounds[ p] = middle - rgb_span[p] / 2; - bounds[4+p] = middle + rgb_span[p] / 2; - } - - ep_quant_bc6h(state->qbounds, bounds, state->epb, 1); -} - -void compute_qbounds(bc6h_enc_state state[], float span) -{ - float rgb_span[3] = { span, span, span }; - compute_qbounds(state, rgb_span); -} - -void compute_qbounds2(bc6h_enc_state state[], float span, int max_span_idx) -{ - float rgb_span[3] = { span, span, span }; - for (uniform int p = 0; p < 3; p++) - { - rgb_span[p] *= (p == max_span_idx) ? 2 : 1; - } - compute_qbounds(state, rgb_span); -} - -void bc6h_test_mode(bc6h_enc_state state[], uniform int mode, uniform bool enc, uniform float margin) -{ - uniform int mode_bits = get_mode_bits(mode); - uniform float span = get_span(mode); - float max_span = state->max_span; - int max_span_idx = state->max_span_idx; - - if (max_span * margin > span) return; - - if (mode >= 10) - { - state->epb = mode_bits; - state->mode = mode; - - compute_qbounds(state, span); - if (enc) bc6h_enc_1p(state); - } - else if (mode <= 1 || mode == 5 || mode == 9) - { - state->epb = mode_bits; - state->mode = mode; - - compute_qbounds(state, span); - if (enc) bc6h_enc_2p(state); - } - else - { - state->epb = mode_bits; - state->mode = mode + max_span_idx; - - compute_qbounds2(state, span, max_span_idx); - if (enc) bc6h_enc_2p(state); - } -} - -////////////////////////// -// BC6H bitstream coding - -int bit_at(int v, uniform int pos) -{ - return (v >> pos) & 1; -} - -uint32 reverse_bits(uint32 v, uniform int bits) -{ - if (bits == 2) - { - return (v >> 1) + (v & 1) * 2; - } - if (bits == 6) - { - v = (v & 0x5555) * 2 + ((v >> 1) & 0x5555); - return (v >> 4) + ((v >> 2) & 3) * 4 + (v & 3) * 16; - } - else - { - assert(false); - } -} - -void bc6h_pack(uint32 packed[], int qep[], int mode) -{ - if (mode == 0) - { - int pred_qep[16]; - for (uniform int p = 0; p < 3; p++) - { - pred_qep[ p] = qep[p]; - pred_qep[ 4 + p] = (qep[ 4 + p] - qep[p]) & 31; - pred_qep[ 8 + p] = (qep[ 8 + p] - qep[p]) & 31; - pred_qep[12 + p] = (qep[12 + p] - qep[p]) & 31; - } - - for (uniform int i = 1; i < 4; i++) - for (uniform int p = 0; p < 3; p++) - { - assert( qep[i * 4 + p] - qep[p] <= 15); - assert(-16 <= qep[i * 4 + p] - qep[p]); - } - - /* - g2[4], b2[4], b3[4], - r0[9:0], - g0[9:0], - b0[9:0], - r1[4:0], g3[4], g2[3:0], - g1[4:0], b3[0], g3[3:0], - b1[4:0], b3[1], b2[3:0], - r2[4:0], b3[2], - r3[4:0], b3[3] - */ - - uint32 pqep[10]; - - pqep[4] = pred_qep[4] + (pred_qep[ 8 + 1] & 15) * 64; - pqep[5] = pred_qep[5] + (pred_qep[12 + 1] & 15) * 64; - pqep[6] = pred_qep[6] + (pred_qep[ 8 + 2] & 15) * 64; - - pqep[4] += bit_at(pred_qep[12 + 1], 4) << 5; - pqep[5] += bit_at(pred_qep[12 + 2], 0) << 5; - pqep[6] += bit_at(pred_qep[12 + 2], 1) << 5; - - pqep[8] = pred_qep[ 8] + bit_at(pred_qep[12 + 2], 2) * 32; - pqep[9] = pred_qep[12] + bit_at(pred_qep[12 + 2], 3) * 32; - - packed[0] = get_mode_prefix(0); - packed[0] += bit_at(pred_qep[ 8 + 1], 4) << 2; - packed[0] += bit_at(pred_qep[ 8 + 2], 4) << 3; - packed[0] += bit_at(pred_qep[12 + 2], 4) << 4; - - packed[1] = (pred_qep[2] << 20) + (pred_qep[1] << 10) + pred_qep[0]; - packed[2] = (pqep[6] << 20) + (pqep[5] << 10) + pqep[4]; - packed[3] = (pqep[9] << 6) + pqep[8]; - } - else if (mode == 1) - { - int pred_qep[16]; - for (uniform int p = 0; p < 3; p++) - { - pred_qep[ p] = qep[p]; - pred_qep[ 4 + p] = (qep[ 4 + p] - qep[p]) & 63; - pred_qep[ 8 + p] = (qep[ 8 + p] - qep[p]) & 63; - pred_qep[12 + p] = (qep[12 + p] - qep[p]) & 63; - } - - for (uniform int i = 1; i < 4; i++) - for (uniform int p = 0; p < 3; p++) - { - assert( qep[i * 4 + p] - qep[p] <= 31); - assert(-32 <= qep[i * 4 + p] - qep[p]); - } - - /* - g2[5], g3[4], g3[5], - r0[6:0], b3[0], b3[1], b2[4], - g0[6:0], b2[5], b3[2], g2[4], - b0[6:0], b3[3], b3[5], b3[4], - r1[5:0], g2[3:0], - g1[5:0], g3[3:0], - b1[5:0], b2[3:0], - r2[5:0], - r3[5:0] - */ - - uint32 pqep[8]; - - pqep[0] = pred_qep[0]; - pqep[0] += bit_at(pred_qep[12 + 2], 0) << 7; - pqep[0] += bit_at(pred_qep[12 + 2], 1) << 8; - pqep[0] += bit_at(pred_qep[ 8 + 2], 4) << 9; - - pqep[1] = pred_qep[1]; - pqep[1] += bit_at(pred_qep[ 8 + 2], 5) << 7; - pqep[1] += bit_at(pred_qep[12 + 2], 2) << 8; - pqep[1] += bit_at(pred_qep[ 8 + 1], 4) << 9; - - pqep[2] = pred_qep[2]; - pqep[2] += bit_at(pred_qep[12 + 2], 3) << 7; - pqep[2] += bit_at(pred_qep[12 + 2], 5) << 8; - pqep[2] += bit_at(pred_qep[12 + 2], 4) << 9; - - pqep[4] = pred_qep[4] + (pred_qep[ 8 + 1] & 15) * 64; - pqep[5] = pred_qep[5] + (pred_qep[12 + 1] & 15) * 64; - pqep[6] = pred_qep[6] + (pred_qep[ 8 + 2] & 15) * 64; - - packed[0] = get_mode_prefix(1); - packed[0] += bit_at(pred_qep[ 8 + 1], 5) << 2; - packed[0] += bit_at(pred_qep[12 + 1], 4) << 3; - packed[0] += bit_at(pred_qep[12 + 1], 5) << 4; - - packed[1] = (pqep[2] << 20) + (pqep[1] << 10) + pqep[0]; - packed[2] = (pqep[6] << 20) + (pqep[5] << 10) + pqep[4]; - packed[3] = (pred_qep[12] << 6) + pred_qep[8]; - } - else if (mode == 2 || mode == 3 || mode == 4) - { - /* - r0[9:0], g0[9:0], b0[9:0], - r1[3:0], xx[y], xx[y], g2[3:0], - g1[3:0], xx[y], xx[y], g3[3:0], - b1[3:0], xx[y], xx[y], b2[3:0], - r2[3:0], xx[y], xx[y], - r3[3:0], xx[y], xx[y] - */ - - int dqep[16]; - for (uniform int p = 0; p < 3; p++) - { - int mask = 15; - if (p == mode - 2) mask = 31; - dqep[p] = qep[p]; - dqep[ 4 + p] = (qep[ 4 + p] - qep[p]) & mask; - dqep[ 8 + p] = (qep[ 8 + p] - qep[p]) & mask; - dqep[12 + p] = (qep[12 + p] - qep[p]) & mask; - } - - for (uniform int i = 1; i < 4; i++) - for (uniform int p = 0; p < 3; p++) - { - int bits = 4; - if (p == mode - 2) bits = 5; - assert( qep[i * 4 + p] - qep[p] <= (1<> 10) * 512; - pqep[5] = dqep[5] + (dqep[1] >> 10) * 512; - pqep[6] = dqep[6] + (dqep[2] >> 10) * 512; - - packed[0] = get_mode_prefix(11); - packed[1] = (pqep[2] << 20) + (pqep[1] << 10) + pqep[0]; - packed[2] = (pqep[6] << 20) + (pqep[5] << 10) + pqep[4]; - } - else if (mode == 12) - { - int dqep[8]; - for (uniform int p = 0; p < 3; p++) - { - dqep[p] = qep[p]; - dqep[4 + p] = (qep[4 + p] - qep[p]) & 255; - } - - for (uniform int i = 1; i < 2; i++) - for (uniform int p = 0; p < 3; p++) - { - assert( qep[i * 4 + p] - qep[p] <= 127); - assert(-128 <= qep[i * 4 + p] - qep[p]); - } - - /* - r0[9:0], g0[9:0], b0[9:0], - r1[7:0], r0[10:11], - g1[7:0], g0[10:11], - b1[7:0], b0[10:11] - */ - - uint32 pqep[8]; - - pqep[0] = dqep[0] & 1023; - pqep[1] = dqep[1] & 1023; - pqep[2] = dqep[2] & 1023; - - pqep[4] = dqep[4] + reverse_bits(dqep[0] >> 10, 2) * 256; - pqep[5] = dqep[5] + reverse_bits(dqep[1] >> 10, 2) * 256; - pqep[6] = dqep[6] + reverse_bits(dqep[2] >> 10, 2) * 256; - - packed[0] = get_mode_prefix(12); - packed[1] = (pqep[2] << 20) + (pqep[1] << 10) + pqep[0]; - packed[2] = (pqep[6] << 20) + (pqep[5] << 10) + pqep[4]; - } - else if (mode == 13) - { - int dqep[8]; - for (uniform int p = 0; p < 3; p++) - { - dqep[p] = qep[p]; - dqep[4 + p] = (qep[4 + p] - qep[p]) & 15; - } - - for (uniform int i = 1; i < 2; i++) - for (uniform int p = 0; p < 3; p++) - { - assert( qep[i * 4 + p] - qep[p] <= 7); - assert(-8 <= qep[i * 4 + p] - qep[p]); - } - - /* - r0[9:0], g0[9:0], b0[9:0], - r1[3:0], r0[10:15], - g1[3:0], g0[10:15], - b1[3:0], b0[10:15] - */ - - uint32 pqep[8]; - - pqep[0] = dqep[0] & 1023; - pqep[1] = dqep[1] & 1023; - pqep[2] = dqep[2] & 1023; - - pqep[4] = dqep[4] + reverse_bits(dqep[0] >> 10, 6) * 16; - pqep[5] = dqep[5] + reverse_bits(dqep[1] >> 10, 6) * 16; - pqep[6] = dqep[6] + reverse_bits(dqep[2] >> 10, 6) * 16; - - packed[0] = get_mode_prefix(13); - packed[1] = (pqep[2] << 20) + (pqep[1] << 10) + pqep[0]; - packed[2] = (pqep[6] << 20) + (pqep[5] << 10) + pqep[4]; - } - else - { - assert(false); - } -} - -void bc6h_code_2p(uint32 data[5], int qep[], uint32 qblock[2], int part_id, int mode) -{ - uniform int bits = 3; - uniform int pairs = 2; - uniform int channels = 3; - - int flips = bc7_code_apply_swap_mode01237(qep, qblock, 1, part_id); - - for (uniform int k=0; k<5; k++) data[k] = 0; - uniform int pos = 0; - - uint32 packed[4]; - bc6h_pack(packed, qep, mode); - - // mode - put_bits(data, &pos, 5, packed[0]); - - // endpoints - put_bits(data, &pos, 30, packed[1]); - put_bits(data, &pos, 30, packed[2]); - put_bits(data, &pos, 12, packed[3]); - - // partition - put_bits(data, &pos, 5, part_id); - - // quantized values - bc7_code_qblock(data, &pos, qblock, bits, flips); - bc7_code_adjust_skip_mode01237(data, 1, part_id); -} - -void bc6h_code_1p(uint32 data[5], int qep[8], uint32 qblock[2], int mode) -{ - bc7_code_apply_swap_mode456(qep, 4, qblock, 4); - - for (uniform int k = 0; k<5; k++) data[k] = 0; - uniform int pos = 0; - - uint32 packed[4]; - bc6h_pack(packed, qep, mode); - - // mode - put_bits(data, &pos, 5, packed[0]); - - // endpoints - put_bits(data, &pos, 30, packed[1]); - put_bits(data, &pos, 30, packed[2]); - - // quantized values - bc7_code_qblock(data, &pos, qblock, 4, 0); -} - -////////////////////////// -// BC6H core - -void bc6h_setup(bc6h_enc_state state[]) -{ - for (uniform int p = 0; p < 3; p++) - { - state->rgb_bounds[p ] = 0xFFFF; - state->rgb_bounds[3+p] = 0; - } - - // uf16 conversion, min/max - for (uniform int p = 0; p < 3; p++) - for (uniform int k = 0; k < 16; k++) - { - state->block[p * 16 + k] = (state->block[p * 16 + k] / 31) * 64; - - state->rgb_bounds[p ] = min(state->rgb_bounds[p ], state->block[p * 16 + k]); - state->rgb_bounds[3+p] = max(state->rgb_bounds[3+p], state->block[p * 16 + k]); - } - - state->max_span = 0; - state->max_span_idx = 0; - - float rgb_span[0] = { 0, 0, 0 }; - for (uniform int p = 0; p < 3; p++) - { - rgb_span[p] = state->rgb_bounds[3+p] - state->rgb_bounds[p]; - if (rgb_span[p] > state->max_span) - { - state->max_span_idx = p; - state->max_span = rgb_span[p]; - } - } -} - -inline void CompressBlockBC6H_core(bc6h_enc_state state[]) -{ - bc6h_setup(state); - - if (state->slow_mode) - { - bc6h_test_mode(state, 0, true, 0); - bc6h_test_mode(state, 1, true, 0); - bc6h_test_mode(state, 2, true, 0); - bc6h_test_mode(state, 5, true, 0); - bc6h_test_mode(state, 6, true, 0); - bc6h_test_mode(state, 9, true, 0); - bc6h_test_mode(state, 10, true, 0); - bc6h_test_mode(state, 11, true, 0); - bc6h_test_mode(state, 12, true, 0); - bc6h_test_mode(state, 13, true, 0); - } - else - { - if (state->fastSkipTreshold > 0) - { - bc6h_test_mode(state, 9, false, 0); - if (state->fast_mode) bc6h_test_mode(state, 1, false, 1); - bc6h_test_mode(state, 6, false, 1 / 1.2); - bc6h_test_mode(state, 5, false, 1 / 1.2); - bc6h_test_mode(state, 0, false, 1 / 1.2); - bc6h_test_mode(state, 2, false, 1); - - bc6h_enc_2p(state); - if (!state->fast_mode) bc6h_test_mode(state, 1, true, 0); - } - - bc6h_test_mode(state, 10, false, 0); - bc6h_test_mode(state, 11, false, 1); - bc6h_test_mode(state, 12, false, 1); - bc6h_test_mode(state, 13, false, 1); - bc6h_enc_1p(state); - } -} - -void bc6h_enc_copy_settings(bc6h_enc_state state[], uniform bc6h_enc_settings settings[]) -{ - state->slow_mode = settings->slow_mode; - state->fast_mode = settings->fast_mode; - state->fastSkipTreshold = settings->fastSkipTreshold; - state->refineIterations_1p = settings->refineIterations_1p; - state->refineIterations_2p = settings->refineIterations_2p; -} - -inline void CompressBlockBC6H(uniform rgba_surface src[], int xx, uniform int yy, uniform uint8 dst[], uniform bc6h_enc_settings settings[]) -{ - bc6h_enc_state _state; - varying bc6h_enc_state* uniform state = &_state; - - bc6h_enc_copy_settings(state, settings); - load_block_interleaved_16bit(state->block, src, xx, yy); - state->best_err = 1e99; - - CompressBlockBC6H_core(state); - - store_data(dst, src->width, xx, yy, state->best_data, 4); -} - -export void CompressBlocksBC6H_ispc(uniform rgba_surface src[], uniform uint8 dst[], uniform bc6h_enc_settings settings[]) -{ - for (uniform int yy = 0; yyheight / 4; yy++) - foreach(xx = 0 ... src->width / 4) - { - CompressBlockBC6H(src, xx, yy, dst, settings); - } -} - -/////////////////////////////////////////////////////////// -// ETC encoding - -struct etc_enc_settings -{ - int fastSkipTreshold; -}; - -struct etc_enc_state -{ - float block[64]; - int prev_qcenter[3]; - - float best_err; - uint32 best_data[2]; - - uniform bool diff; - - // settings - uniform int fastSkipTreshold; -}; - -inline uniform int get_etc1_dY(uniform int table, uniform int q) -{ - static uniform const int etc_codeword_table[8][4] = - { - { -8, -2, 2, 8 }, - { -17, -5, 5, 17 }, - { -29, -9, 9, 29 }, - { -42, -13, 13, 42 }, - { -60, -18, 18, 60 }, - { -80, -24, 24, 80 }, - { -106, -33, 33, 106 }, - { -183, -47, 47, 183 }, - }; - - return etc_codeword_table[table][q]; -} - -uniform int remap_q[] = { 2, 3, 1, 0 }; - -int get_remap2_q(int x) -{ - x -= 2; - if (x < 0) x = 1 - x; - return x; -} - -int extend_4to8bits(int value) -{ - return (value << 4) | value; -} - -int extend_5to8bits(int value) -{ - return (value << 3) | (value >> 2); -} - -int quantize_4bits(float value) -{ - return clamp((value / 255.0f) * 15 + 0.5, 0, 15); -} - -int quantize_5bits(float value) -{ - return clamp((value / 255.0f) * 31 + 0.5, 0, 31); -} - -void center_quant_dequant(int qcenter[3], float center[3], uniform bool diff, int prev_qcenter[3]) -{ - if (diff) - { - for (uniform int p = 0; p < 3; p++) - { - qcenter[p] = quantize_5bits(center[p]); - - if (prev_qcenter[0] >= 0) - { - if (qcenter[p] - prev_qcenter[p] > 3) qcenter[p] = prev_qcenter[p] + 3; - if (qcenter[p] - prev_qcenter[p] < -4) qcenter[p] = prev_qcenter[p] - 4; - } - - center[p] = extend_5to8bits(qcenter[p]); - } - } - else - { - for (uniform int p = 0; p < 3; p++) - { - qcenter[p] = quantize_4bits(center[p]); - center[p] = extend_4to8bits(qcenter[p]); - } - } -} - -float quantize_pixels_etc1_half(uint32 qblock[1], float block[48], float center[3], uniform int table) -{ - float total_err = 0; - uint32 bits = 0; - - for (uniform int y = 0; y < 2; y++) - for (uniform int x = 0; x < 4; x++) - { - float best_err = sq(255) * 3; - int best_q = -1; - - for (uniform int q = 0; q < 4; q++) - { - int dY = get_etc1_dY(table, remap_q[q]); - - float err = 0; - for (int p = 0; p < 3; p++) - err += sq(block[16 * p + y*4+x] - clamp(center[p] + dY, 0, 255)); - - if (err < best_err) - { - best_err = err; - best_q = q; - } - } - - assert(best_q >= 0); - - bits |= (best_q & 1) << (x * 4 + y); - bits |= (best_q >> 1) << (x * 4 + y + 16); - total_err += best_err; - } - - qblock[0] = bits; - return total_err; -} - -float compress_etc1_half_1(uint32 out_qbits[1], int out_table[1], int out_qcenter[3], - float half_pixels[], uniform bool diff, int prev_qcenter[3]) -{ - float dc[3]; - - for (uniform int p = 0; p<3; p++) dc[p] = 0; - - for (uniform int k = 0; k<8; k++) - { - for (uniform int p = 0; p<3; p++) - dc[p] += half_pixels[k + p * 16]; - } - - float best_error = sq(255) * 3 * 8.0f; - int best_table = -1; - int best_qcenter[3]; - uint32 best_qbits; - - for (uniform int table_level = 0; table_level < 8; table_level++) - { - float center[3]; - int qcenter[3]; - uint32 qbits; - - for (uniform int p = 0; p < 3; p++) center[p] = dc[p] / 8 - get_etc1_dY(table_level, 2); - center_quant_dequant(qcenter, center, diff, prev_qcenter); - - float err = quantize_pixels_etc1_half(&qbits, half_pixels, center, table_level); - - if (err < best_error) - { - best_error = err; - best_table = table_level; - best_qbits = qbits; - for (uniform int p = 0; p < 3; p++) best_qcenter[p] = qcenter[p]; - } - } - - out_table[0] = best_table; - out_qbits[0] = best_qbits; - for (uniform int p = 0; p < 3; p++) out_qcenter[p] = best_qcenter[p]; - return best_error; -} - -float optimize_center(float colors[4][10], uniform int p, uniform int table_level) -{ - float best_center = 0; - for (uniform int q = 0; q < 4; q++) - { - best_center += (colors[q][7 + p] - get_etc1_dY(table_level, q)) * colors[q][3]; - } - best_center /= 8; - - float best_err = 0; - for (uniform int q = 0; q < 4; q++) - { - float dY = get_etc1_dY(table_level, q); - best_err += sq(clamp(best_center + dY, 0, 255) - colors[q][7 + p]) * colors[q][3]; - } - - for (uniform int branch = 0; branch < 4; branch++) - { - float new_center = 0; - float sum = 0; - for (uniform int q = 0; q < 4; q++) - { - if (branch <= 1 && q <= branch) continue; - if (branch >= 2 && q >= branch) continue; - new_center += (colors[q][7 + p] - get_etc1_dY(table_level, q)) * colors[q][3]; - sum += colors[q][3]; - } - - new_center /= sum; - - float err = 0; - for (uniform int q = 0; q < 4; q++) - { - float dY = get_etc1_dY(table_level, q); - err += sq(clamp(new_center + dY, 0, 255) - colors[q][7 + p]) * colors[q][3]; - } - - if (err < best_err) - { - best_err = err; - best_center = new_center; - } - } - - return best_center; -} - -float compress_etc1_half_7(uint32 out_qbits[1], int out_table[1], int out_qcenter[3], - float half_pixels[], etc_enc_state state[]) -{ - int err_list[165]; - int y_sorted_inv[8]; - float y_sorted[8]; - - { - int y_sorted_idx[8]; - for (uniform int k = 0; k < 8; k++) - { - float value = 0; - for (uniform int p = 0; p < 3; p++) - value += half_pixels[k + p * 16]; - - y_sorted_idx[k] = (((int)value) << 4) + k; - } - - partial_sort_list(y_sorted_idx, 8, 8); - - for (uniform int k = 0; k < 8; k++) - y_sorted_inv[k] = ((y_sorted_idx[k] & 0xF) << 4) + k; - - for (uniform int k = 0; k < 8; k++) - y_sorted[k] = (y_sorted_idx[k] >> 4) / 3.0f; - - partial_sort_list(y_sorted_inv, 8, 8); - } - - uniform int idx = -1; - for (uniform int level1 = 0; level1 <= 8; level1++) - for (uniform int level2 = level1; level2 <= 8; level2++) - for (uniform int level3 = level2; level3 <= 8; level3++) - { - idx++; - assert(idx < 165); - - float sum[4]; - float sum_sq[4]; - float count[4]; - float inv_count[4]; - - for (uniform int q = 0; q < 4; q++) - { - sum[q] = 0; - sum_sq[q] = 0; - count[q] = 0; - inv_count[q] = 0; - } - - for (uniform int k = 0; k < 8; k++) - { - uniform int q = 0; - if (k >= level1) q = 1; - if (k >= level2) q = 2; - if (k >= level3) q = 3; - - sum[q] += y_sorted[k]; - sum_sq[q] += sq(y_sorted[k]); - count[q] += 1; - } - - for (uniform int q = 0; q < 4; q++) - { - if (count[q] > 0) inv_count[q] = 1 / count[q]; - } - - float base_err = 0; - for (uniform int q = 0; q < 4; q++) base_err += sum_sq[q] - sq(sum[q]) * inv_count[q]; - - float t_err = sq(256) * 8; - for (uniform int table_level = 0; table_level < 8; table_level++) - { - float center = 0; - for (uniform int q = 0; q < 4; q++) center += sum[q] - get_etc1_dY(table_level, q) * count[q]; - center /= 8; - - float err = base_err; - for (uniform int q = 0; q < 4; q++) - { - err += sq(center + get_etc1_dY(table_level, q) - sum[q] * inv_count[q])*count[q]; - } - - t_err = min(t_err, err); - } - - int packed = (level1 * 16 + level2) * 16 + level3; - - err_list[idx] = (((int)t_err) << 12) + packed; - } - - partial_sort_list(err_list, 165, state->fastSkipTreshold); - - float best_error = sq(255) * 3 * 8.0f; - int best_table = -1; - int best_qcenter[3]; - uint32 best_qbits; - - for (uniform int i = 0; i < state->fastSkipTreshold; i++) - { - int packed = err_list[i] & 0xFFF; - int level1 = (packed >> 8) & 0xF; - int level2 = (packed >> 4) & 0xF; - int level3 = (packed >> 0) & 0xF; - - float colors[4][10]; - - for (uniform int p = 0; p < 7; p++) - for (uniform int q = 0; q < 4; q++) colors[q][p] = 0; - - uint32 qbits = 0; - for (uniform int kk = 0; kk < 8; kk++) - { - int k = y_sorted_inv[kk] & 0xF; - - int qq = 0; - if (k >= level1) qq = 1; - if (k >= level2) qq = 2; - if (k >= level3) qq = 3; - - uniform int xx = kk & 3; - uniform int yy = kk >> 2; - - int qqq = get_remap2_q(qq); - qbits |= (qqq & 1) << (yy + xx * 4); - qbits |= (qqq >> 1) << (16 + yy + xx * 4); - - float qvec[4]; - for (uniform int q = 0; q < 4; q++) - { - qvec[q] = q == qq ? 1.0 : 0.0; - colors[q][3] += qvec[q]; - } - - for (uniform int p = 0; p < 3; p++) - { - float value = half_pixels[16 * p + kk]; - for (uniform int q = 0; q < 4; q++) - { - colors[q][p] += value * qvec[q]; - colors[q][4 + p] += sq(value) * qvec[q]; - } - } - } - - float base_err = 0; - for (uniform int q = 0; q < 4; q++) - { - if (colors[q][3] > 0) - for (uniform int p = 0; p < 3; p++) - { - colors[q][7 + p] = colors[q][p] / colors[q][3]; - base_err += colors[q][4 + p] - sq(colors[q][7 + p])*colors[q][3]; - } - } - - for (uniform int table_level = 0; table_level < 8; table_level++) - { - float center[3]; - int qcenter[3]; - - for (uniform int p = 0; p < 3; p++) - { - center[p] = optimize_center(colors, p, table_level); - } - - center_quant_dequant(qcenter, center, state->diff, state->prev_qcenter); - - float err = base_err; - for (uniform int q = 0; q < 4; q++) - { - int dY = get_etc1_dY(table_level, q); - for (uniform int p = 0; p < 3; p++) - err += sq(clamp(center[p] + dY, 0, 255) - colors[q][7 + p])*colors[q][3]; - } - - if (err < best_error) - { - best_error = err; - best_table = table_level; - best_qbits = qbits; - for (uniform int p = 0; p < 3; p++) best_qcenter[p] = qcenter[p]; - } - } - } - - out_table[0] = best_table; - out_qbits[0] = best_qbits; - for (uniform int p = 0; p < 3; p++) out_qcenter[p] = best_qcenter[p]; - return best_error; -} - -float compress_etc1_half(uint32 qbits[1], int table[1], int qcenter[3], float half_pixels[], etc_enc_state state[]) -{ - float err = compress_etc1_half_7(qbits, table, qcenter, half_pixels, state); - - for (uniform int p = 0; p < 3; p++) - state->prev_qcenter[p] = qcenter[p]; - - return err; -} - -////////////////////////// -// ETC1 core - -inline uint32 bswap32(uint32 v) -{ - uint32 r = 0; - r += ((v >> 24) & 255) << 0; - r += ((v >> 16) & 255) << 8; - r += ((v >> 8) & 255) << 16; - r += ((v >> 0) & 255) << 24; - return r; -} - -void etc_pack(uint32 data[], uint32 qbits[2], int tables[2], int qcenters[2][3], uniform int diff, uniform int flip) -{ - for (uniform int k = 0; k < 2; k++) data[k] = 0; - uniform int pos = 0; - - if (diff == 0) - { - put_bits(data, &pos, 4, qcenters[1][0]); - put_bits(data, &pos, 4, qcenters[0][0]); - - put_bits(data, &pos, 4, qcenters[1][1]); - put_bits(data, &pos, 4, qcenters[0][1]); - - put_bits(data, &pos, 4, qcenters[1][2]); - put_bits(data, &pos, 4, qcenters[0][2]); - } - else - { - put_bits(data, &pos, 3, (qcenters[1][0] - qcenters[0][0]) & 7); - put_bits(data, &pos, 5, qcenters[0][0]); - - put_bits(data, &pos, 3, (qcenters[1][1] - qcenters[0][1]) & 7); - put_bits(data, &pos, 5, qcenters[0][1]); - - put_bits(data, &pos, 3, (qcenters[1][2] - qcenters[0][2]) & 7); - put_bits(data, &pos, 5, qcenters[0][2]); - } - - put_bits(data, &pos, 1, flip); - put_bits(data, &pos, 1, diff); - put_bits(data, &pos, 3, tables[1]); - put_bits(data, &pos, 3, tables[0]); - - uint32 all_qbits_flipped = (qbits[1] << 2) | qbits[0]; - uint32 all_qbits = 0; - - if (flip != 0) all_qbits = all_qbits_flipped; - - if (flip == 0) - for (uniform int k = 0; k < 2; k++) - for (uniform int y = 0; y < 4; y++) - for (uniform int x = 0; x < 4; x++) - { - int bit = (all_qbits_flipped >> (k * 16 + x * 4 + y)) & 1; - all_qbits += bit << (k * 16 + y * 4 + x); - } - - data[1] = bswap32(all_qbits); -} - -inline void CompressBlockETC1_core(etc_enc_state state[]) -{ - float flipped_block[48]; - - for (uniform int y = 0; y < 4; y++) - for (uniform int x = 0; x < 4; x++) - for (uniform int p = 0; p < 3; p++) - { - flipped_block[16 * p + x * 4 + y] = state->block[16 * p + y * 4 + x]; - } - - for (uniform int flip = 0; flip < 2; flip++) - for (uniform int diff = 1; diff >= 0; diff--) - { - state->diff = diff == 1; - state->prev_qcenter[0] = -1; - - varying float * uniform pixels = state->block; - if (flip == 0) pixels = flipped_block; - - uint32 qbits[2]; - int tables[2]; - int qcenters[2][3]; - - float err = 0; - err += compress_etc1_half(&qbits[0], &tables[0], qcenters[0], &pixels[0], state); - err += compress_etc1_half(&qbits[1], &tables[1], qcenters[1], &pixels[8], state); - - if (err < state->best_err) - { - state->best_err = err; - etc_pack(state->best_data, qbits, tables, qcenters, diff, flip); - } - } -} - -void etc_enc_copy_settings(etc_enc_state state[], uniform etc_enc_settings settings[]) -{ - state->fastSkipTreshold = settings->fastSkipTreshold; -} - -inline void CompressBlockETC1(uniform rgba_surface src[], int xx, uniform int yy, uniform uint8 dst[], uniform etc_enc_settings settings[]) -{ - etc_enc_state _state; - varying etc_enc_state* uniform state = &_state; - - etc_enc_copy_settings(state, settings); - load_block_interleaved(state->block, src, xx, yy); - state->best_err = 1e99; - - CompressBlockETC1_core(state); - - store_data(dst, src->width, xx, yy, state->best_data, 2); -} - -export void CompressBlocksETC1_ispc(uniform rgba_surface src[], uniform uint8 dst[], uniform etc_enc_settings settings[]) -{ - for (uniform int yy = 0; yyheight / 4; yy++) - foreach(xx = 0 ... src->width / 4) - { - CompressBlockETC1(src, xx, yy, dst, settings); - } -} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/kernel_astc.ispc b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/kernel_astc.ispc deleted file mode 100644 index e1411054f6..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/kernel_astc.ispc +++ /dev/null @@ -1,2202 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2016, Intel 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. -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -typedef int8 int8_t; -typedef int32 int32_t; -typedef int64 int64_t; - -typedef unsigned int8 uint8_t; -typedef unsigned int32 uint32_t; -typedef unsigned int64 uint64_t; - -/////////////////////////// -// generic helpers - -void swap(float& a, float& b) -{ - int t = a; - a = b; b = t; -} - -void swap(int& a, int& b) -{ - int t = a; - a = b; b = t; -} - -void swap(uint32_t& a, uint32_t& b) -{ - uint32_t t = a; - a = b; b = t; -} - -void swap(uint8_t& a, uint8_t& b) -{ - uint8_t t = a; - a = b; b = t; -} - -inline float sq(float v) -{ - return v*v; -} - -inline float clamp(float v, int a, int b) -{ - return clamp(v, (float)a, (float)b); -} - -inline float dot3(float a[3], float b[3]) -{ - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -} - -inline float dot4(float a[4], float b[4]) -{ - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// the following helpers isolate performance warnings - -inline uint32_t gather_uint(const uniform uint32_t* const uniform ptr, int idx) -{ - return ptr[idx]; // (perf warning expected) -} - -inline float gather_float(uniform float* uniform ptr, int idx) -{ - return ptr[idx]; // (perf warning expected) -} - -inline float gather_float(varying float* uniform ptr, int idx) -{ - return ptr[idx]; // (perf warning expected) -} - -inline void scatter_uint(uniform uint32_t* ptr, int idx, uint32_t value) -{ - ptr[idx] = value; // (perf warning expected) -} - -inline void scatter_float(uniform float* uniform ptr, int idx, float value) -{ - ptr[idx] = value; // (perf warning expected) -} - -inline void scatter_float(varying float* uniform ptr, int idx, float value) -{ - ptr[idx] = value; // (perf warning expected) -} - -/////////////////////////////////////////////////////////// -// ASTC shared functions - -struct rgba_surface -{ - uint8_t* ptr; - int width, height, stride; -}; - -inline void set_pixel(float pixels[], uniform int p, uniform int x, uniform int y, float value); - -inline void load_block_interleaved(float pixels[], uniform rgba_surface src[], int xx, int yy, uniform int width, uniform int height) -{ - uniform int pitch = width * height; - for (uniform int y = 0; y < height; y++) - for (uniform int x = 0; x < width; x++) - { - uint32_t rgba = gather_uint((uint32_t*)src->ptr, ((yy * height + y)*src->stride + (xx * width + x) * 4)/4); - - set_pixel(pixels, 0, x, y, (int)((rgba >> 0) & 255)); - set_pixel(pixels, 1, x, y, (int)((rgba >> 8) & 255)); - set_pixel(pixels, 2, x, y, (int)((rgba >> 16) & 255)); - set_pixel(pixels, 3, x, y, (int)((rgba >> 24) & 255)); - } -} - -struct astc_enc_settings -{ - int block_width; - int block_height; - int channels; - - int fastSkipTreshold; - int refineIterations; -}; - -export uniform int get_programCount() -{ - return programCount; -} - -inline float get_pixel(float pixels[], uniform int p, uniform int x, uniform int y) -{ - uniform static const int ystride = 8; - uniform static const int pstride = 64; - - return pixels[pstride * p + ystride * y + x]; -} - -inline void set_pixel(float pixels[], uniform int p, uniform int x, uniform int y, float value) -{ - uniform static const int ystride = 8; - uniform static const int pstride = 64; - - pixels[pstride * p + ystride * y + x] = value; -} - -struct pixel_set -{ - varying float* uniform pixels; - - uniform int width; - uniform int height; -}; - -inline void clear_alpha(float pixels[], uniform int width, uniform int height) -{ - for (uniform int y = 0; y < height; y++) - for (uniform int x = 0; x < width; x++) - { - set_pixel(pixels, 3, x, y, 255); - } -} - -void rotate_plane(pixel_set block[], int p) -{ - uniform int pitch = block->height * block->width; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float r = get_pixel(block->pixels, 0, x, y); - float g = get_pixel(block->pixels, 1, x, y); - float b = get_pixel(block->pixels, 2, x, y); - float a = get_pixel(block->pixels, 3, x, y); - - if (p == 0) swap(a, r); - if (p == 1) swap(a, g); - if (p == 2) swap(a, b); - - set_pixel(block->pixels, 0, x, y, r); - set_pixel(block->pixels, 1, x, y, g); - set_pixel(block->pixels, 2, x, y, b); - set_pixel(block->pixels, 3, x, y, a); - } -} - -inline void compute_moments(float stats[15], pixel_set block[], uniform int channels) -{ - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float rgba[4]; - for (uniform int p = 0; p < channels; p++) rgba[p] = get_pixel(block->pixels, p, x, y); - - stats[10] += rgba[0]; - stats[11] += rgba[1]; - stats[12] += rgba[2]; - - stats[0] += rgba[0] * rgba[0]; - stats[1] += rgba[0] * rgba[1]; - stats[2] += rgba[0] * rgba[2]; - - stats[4] += rgba[1] * rgba[1]; - stats[5] += rgba[1] * rgba[2]; - - stats[7] += rgba[2] * rgba[2]; - - if (channels == 4) - { - stats[13] += rgba[3]; - - stats[3] += rgba[0] * rgba[3]; - stats[6] += rgba[1] * rgba[3]; - stats[8] += rgba[2] * rgba[3]; - stats[9] += rgba[3] * rgba[3]; - } - } - - stats[14] += block->height * block->width; -} - -inline void covar_from_stats(float covar[10], float stats[15], uniform int channels) -{ - covar[0] = stats[0] - stats[10 + 0] * stats[10 + 0] / stats[14]; - covar[1] = stats[1] - stats[10 + 0] * stats[10 + 1] / stats[14]; - covar[2] = stats[2] - stats[10 + 0] * stats[10 + 2] / stats[14]; - - covar[4] = stats[4] - stats[10 + 1] * stats[10 + 1] / stats[14]; - covar[5] = stats[5] - stats[10 + 1] * stats[10 + 2] / stats[14]; - - covar[7] = stats[7] - stats[10 + 2] * stats[10 + 2] / stats[14]; - - if (channels == 4) - { - covar[3] = stats[3] - stats[10 + 0] * stats[10 + 3] / stats[14]; - covar[6] = stats[6] - stats[10 + 1] * stats[10 + 3] / stats[14]; - covar[8] = stats[8] - stats[10 + 2] * stats[10 + 3] / stats[14]; - covar[9] = stats[9] - stats[10 + 3] * stats[10 + 3] / stats[14]; - } -} - -inline void compute_covar_dc(float covar[], float dc[], pixel_set block[], bool zero_based, uniform int channels) -{ - float stats[15] = { 0 }; - compute_moments(stats, block, channels); - - if (zero_based) - for (uniform int p = 0; p < 4; p++) stats[10 + p] = 0; - - covar_from_stats(covar, stats, channels); - for (uniform int p = 0; p < channels; p++) dc[p] = stats[10 + p] / stats[14]; -} - -inline void ssymv3(float a[4], float covar[10], float b[4]) -{ - a[0] = covar[0] * b[0] + covar[1] * b[1] + covar[2] * b[2]; - a[1] = covar[1] * b[0] + covar[4] * b[1] + covar[5] * b[2]; - a[2] = covar[2] * b[0] + covar[5] * b[1] + covar[7] * b[2]; -} - -inline void ssymv4(float a[4], float covar[10], float b[4]) -{ - a[0] = covar[0] * b[0] + covar[1] * b[1] + covar[2] * b[2] + covar[3] * b[3]; - a[1] = covar[1] * b[0] + covar[4] * b[1] + covar[5] * b[2] + covar[6] * b[3]; - a[2] = covar[2] * b[0] + covar[5] * b[1] + covar[7] * b[2] + covar[8] * b[3]; - a[3] = covar[3] * b[0] + covar[6] * b[1] + covar[8] * b[2] + covar[9] * b[3]; -} - -inline void compute_axis(float axis[4], float covar[10], uniform const int powerIterations, uniform int channels) -{ - float vec[4] = { 1, 1, 1, 1 }; - - for (uniform int i = 0; i < powerIterations; i++) - { - if (channels == 3) ssymv3(axis, covar, vec); - if (channels == 4) ssymv4(axis, covar, vec); - for (uniform int p = 0; p < channels; p++) vec[p] = axis[p]; - - if (i % 2 == 1) // renormalize every other iteration - { - float norm_sq = 0; - for (uniform int p = 0; p < channels; p++) - norm_sq += axis[p] * axis[p]; - - float rnorm = rsqrt(norm_sq); - for (uniform int p = 0; p < channels; p++) vec[p] *= rnorm; - } - } - - for (uniform int p = 0; p < channels; p++) axis[p] = vec[p]; -} - -void compute_pca_endpoints(float ep[8], pixel_set block[], bool zero_based, uniform int channels) -{ - float dc[4]; - float cov[10]; - compute_covar_dc(cov, dc, block, zero_based, channels); - - uniform int powerIterations = 10; - - float eps = sq(0.001) * 1000; - cov[0] += eps; - cov[4] += eps; - cov[7] += eps; - cov[9] += eps; - - float dir[4]; - compute_axis(dir, cov, powerIterations, channels); - - float ext[2] = { 1000, -1000 }; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float proj = 0; - for (uniform int p = 0; p < channels; p++) proj += (get_pixel(block->pixels, p, x, y) - dc[p]) * dir[p]; - - ext[0] = min(ext[0], proj); - ext[1] = max(ext[1], proj); - } - - if (ext[1] - 1.0f < ext[0]) - { - ext[1] += 0.5f; - ext[0] -= 0.5f; - } - - for (uniform int i = 0; i < 2; i++) - for (uniform int p = 0; p < channels; p++) - { - ep[p * 2 + i] = dc[p] + dir[p] * ext[i]; - } -} - -uniform static const int range_table[][3] = -{ - //2^ 3^ 5^ - { 1, 0, 0 }, // 0..1 - { 0, 1, 0 }, // 0..2 - { 2, 0, 0 }, // 0..3 - - { 0, 0, 1 }, // 0..4 - { 1, 1, 0 }, // 0..5 - { 3, 0, 0 }, // 0..7 - - { 1, 0, 1 }, // 0..9 - { 2, 1, 0 }, // 0..11 - { 4, 0, 0 }, // 0..15 - - { 2, 0, 1 }, // 0..19 - { 3, 1, 0 }, // 0..23 - { 5, 0, 0 }, // 0..31 - - { 3, 0, 1 }, // 0..39 - { 4, 1, 0 }, // 0..47 - { 6, 0, 0 }, // 0..63 - - { 4, 0, 1 }, // 0..79 - { 5, 1, 0 }, // 0..95 - { 7, 0, 0 }, // 0..127 - - { 5, 0, 1 }, // 0..159 - { 6, 1, 0 }, // 0..191 - { 8, 0, 0 }, // 0..255 -}; - -uniform int get_levels(uniform int range) -{ - return (1 + 2 * range_table[range][1] + 4 * range_table[range][2]) << range_table[range][0]; -} - -struct range_values -{ - int levels_m; - int levels_m_rcp; - int levels_e; - int levels; -}; - -void fill_range_values(range_values values[], int _range[]) -{ - int range = *_range; - int range_div3 = (range * 21846) >> 16; - int range_mod3 = range - range_div3 * 3; - - int levels_m = max(2, 5 - range_mod3 * 2); - int levels_e = max(0, range_mod3 + range_div3 - 1); - if (range == 0) levels_m = 2; - - int levels_m_rcp = 0x10000 / 2 + 1; - if (levels_m == 3) levels_m_rcp = 0x10000 / 3 + 1; - if (levels_m == 5) levels_m_rcp = 0x10000 / 5 + 1; - - values->levels_e = levels_e; - values->levels_m = levels_m; - values->levels_m_rcp = levels_m_rcp; - - values->levels = levels_m << levels_e; -} - -range_values get_range_values(int range) -{ - range_values values; - fill_range_values(&values, &range); - return values; -} - -int get_levels(int range) -{ - int range_div3 = (range * 21846) >> 16; - int range_mod3 = range - range_div3 * 3; - - int levels_m = max(2, 5 - range_mod3 * 2); - int levels_e = range_mod3 + range_div3 - 1; - - return (levels_m << (levels_e + 1)) >> 1; -} - -uniform float get_sq_rcp_levels(uniform int range) -{ - uniform static const float table[] = - { - 1.000000, 0.250000, 0.111111, - 0.062500, 0.040000, 0.020408, - 0.012346, 0.008264, 0.004444, - 0.002770, 0.001890, 0.001041, - 0.000657, 0.000453, 0.000252, - 0.000160, 0.000111, 0.000062, - 0.000040, 0.000027, 0.000015, - }; - - return table[range]; -} - -/////////////////////////////////////////////////////////// -// ASTC candidate ranking - -struct astc_rank_state -{ - float pixels[256]; - - float pca_error[2][5]; - float alpha_error[2][5]; - float sq_norm[2][5]; - float scale_error[7][7]; // 2x2 to 8x8 - - float best_scores[64]; - uint32_t best_modes[64]; - - // settings - uniform int block_width; - uniform int block_height; - uniform int pitch; - - uniform int fastSkipTreshold; -}; - -struct astc_mode -{ - int width; - int height; - bool dual_plane; - int weight_range; - int color_component_selector; - int partitions; - int partition_id; - int color_endpoint_pairs; - int color_endpoint_modes[2]; - int endpoint_range; -}; - -void dct_4(float values[], uniform int stride) -{ - uniform static const float scale[] = { 0.5, 0.707106769 }; - uniform static const float c[5] = { 1, 0.923879533, 0.707106769, 0.382683432, 0 }; - - float data[4]; - for (uniform int i = 0; i < 2; i++) - { - float a = values[stride * i]; - float b = values[stride * (3 - i)]; - data[0 + i] = a + b; - data[2 + i] = a - b; - } - - for (uniform int i = 0; i < 4; i++) - { - float acc = 0; - varying float* uniform input = &data[(i % 2) * 2]; - for (uniform int j = 0; j < 2; j++) - { - uniform int e = (2 * j + 1)*i; - e = e % (4 * 4); - uniform float w = 1; - if (e>8) { e = 16 - e; } - if (e>4) { w = -1; e = 8 - e; } - w *= c[e]; - acc += w * input[j]; - } - - values[stride * i] = acc * scale[i > 0]; - } -} - -void dct_6(float values[], uniform int stride) -{ - uniform static const float scale[] = { 0.408248290, 0.577350269 }; - uniform static const float c[7] = - { 1, 0.965925813, 0.866025388, 0.707106769, 0.500000000, 0.258819044, 0 }; - - float data[6]; - for (uniform int i = 0; i < 3; i++) - { - float a = values[stride * i]; - float b = values[stride * (5 - i)]; - data[0 + i] = a + b; - data[3 + i] = a - b; - } - - for (uniform int i = 0; i < 6; i++) - { - float acc = 0; - varying float* uniform input = &data[(i % 2) * 3]; - for (uniform int j = 0; j < 3; j++) - { - uniform int e = (2 * j + 1)*i; - e = e % (4 * 6); - uniform float w = 1; - if (e>12) { e = 24 - e; } - if (e>6) { w = -1; e = 12 - e; } - w *= c[e]; - acc += w * input[j]; - } - - values[stride * i] = acc * scale[i > 0]; - } -} - -void dct_n(float values[], uniform int stride, uniform int n) -{ - uniform static const float pi = 3.14159265358979323846; - - assert(n <= 16); - uniform float c[16 + 1]; - for (uniform int i = 0; i <= n; i++) - c[i] = cos((i / (4.0 * n) * 2 * pi)); - - uniform float scale[] = { 1 / sqrt(1.0*n), 1 / sqrt(n / 2.0), }; - - float data[16]; - for (uniform int i = 0; i < n; i++) - data[i] = values[stride * i]; - - for (uniform int i = 0; i < n; i++) - { - float acc = 0; - for (uniform int j = 0; j < n; j++) - { - uniform int e = (2 * j + 1)*i; - e = e % (4 * n); - float w = 1; - if (e > 2 * n) { e = 4 * n - e; } - if (e > n) { w = -1; e = 2 * n - e; } - assert(e <= n); - w *= c[e]; - acc += w * data[j]; - } - - values[stride * i] = acc * scale[i > 0]; - } -} - -void dct(float values[], uniform int stride, uniform int n) -{ - if (false) {} - else if (n == 8) dct_n(values, stride, 8); - else if (n == 6) dct_6(values, stride); - else if (n == 5) dct_n(values, stride, 5); - else if (n == 4) dct_4(values, stride); - else - { - assert(false); - } -} - -void compute_dct_inplace(pixel_set block[], uniform int channels) -{ - uniform static const int stride = 8; - uniform static const int pitch = 64; - - for (uniform int p = 0; p < channels; p++) - { - for (uniform int y = 0; y < block->height; y++) - dct(&block->pixels[pitch * p + y * stride], 1, block->width); - - for (uniform int x = 0; x < block->width; x++) - dct(&block->pixels[pitch * p + x], stride, block->height); - } -} - -void compute_metrics(astc_rank_state state[]) -{ - float temp_pixels[256]; - pixel_set _pset; varying pixel_set* uniform pset = &_pset; - pset->pixels = temp_pixels; - pset->width = state->block_width; - pset->height = state->block_height; - - for (uniform int p = 0; p < 4; p++) - for (uniform int y = 0; y < state->block_height; y++) - for (uniform int x = 0; x < state->block_width; x++) - { - float value = get_pixel(state->pixels, p, x, y); - set_pixel(pset->pixels, p, x, y, value); - } - - for (uniform int i = 0; i < 2; i++) - { - bool zero_based = (i == 1); - float endpoints[8]; - compute_pca_endpoints(endpoints, pset, zero_based, 4); - - float base[4], dir[4]; - for (int p = 0; p < 4; p++) dir[p] = endpoints[p * 2 + 1] - endpoints[p * 2]; - for (int p = 0; p < 4; p++) base[p] = endpoints[p * 2]; - float sq_norm = dot4(dir, dir) + 0.00001; - - float pca_error = 0; - float alpha_error = 0; - float pca_alpha_error = 0; - for (uniform int y = 0; y < state->block_height; y++) - for (uniform int x = 0; x < state->block_width; x++) - { - float pixel[4]; - for (uniform int p = 0; p < 4; p++) pixel[p] = get_pixel(pset->pixels, p, x, y) - base[p]; - float proj = dot4(pixel, dir) / sq_norm; - for (uniform int p = 0; p < 3; p++) pca_error += sq(get_pixel(pset->pixels, p, x, y) - (proj * dir[p] + base[p])); - pca_alpha_error += sq(get_pixel(pset->pixels, 3, x, y) - (proj * dir[3] + base[3])); - alpha_error += sq(get_pixel(pset->pixels, 3, x, y) - 255); - } - - state->pca_error[i][0] = pca_error + pca_alpha_error; - state->alpha_error[i][0] = alpha_error - pca_alpha_error; - state->sq_norm[i][0] = sq_norm; - } - - for (uniform int i = 0; i < 2; i++) - for (uniform int c = 1; c < 5; c++) - { - rotate_plane(pset, c - 1); - - bool zero_based = (i == 1); - float endpoints[8]; - compute_pca_endpoints(endpoints, pset, zero_based, 3); - - float base[3], dir[3]; - for (int p = 0; p < 3; p++) dir[p] = endpoints[p * 2 + 1] - endpoints[p * 2]; - for (int p = 0; p < 3; p++) base[p] = endpoints[p * 2]; - float sq_norm = dot3(dir, dir) + 0.00001; - - float pca_error = 0; - float alpha_error = 0; - float pca_alpha_error = 0; - float ext[2] = { 1000, -1000 }; - for (uniform int y = 0; y < state->block_height; y++) - for (uniform int x = 0; x < state->block_width; x++) - { - float pixel[3]; - for (uniform int p = 0; p < 3; p++) pixel[p] = get_pixel(pset->pixels, p, x, y) - base[p]; - float proj = dot3(pixel, dir) / sq_norm; - for (uniform int p = 0; p < 3; p++) - { - if (p == c - 1) - { - pca_alpha_error += sq(get_pixel(pset->pixels, p, x, y) - (proj * dir[p] + base[p])); - alpha_error += sq(get_pixel(pset->pixels, p, x, y) - 255); - } - else - { - pca_error += sq(get_pixel(pset->pixels, p, x, y) - (proj * dir[p] + base[p])); - } - } - - float value = get_pixel(pset->pixels, 3, x, y); - ext[0] = min(ext[0], value); - ext[1] = max(ext[1], value); - } - - state->pca_error[i][c] = pca_error + pca_alpha_error; - state->alpha_error[i][c] = alpha_error - pca_alpha_error; - state->sq_norm[i][c] = sq_norm + sq(ext[1] - ext[0]); - - // rotate back - rotate_plane(pset, c - 1); - } - - compute_dct_inplace(pset, 4); - - for (uniform int h = 2; h <= state->block_height; h++) - for (uniform int w = 2; w <= state->block_width; w++) - { - uniform int stride = 8; - uniform int pitch = 64; - - float sq_sum = 0; - - for (uniform int y = 0; y < state->block_height; y++) - for (uniform int x = 0; x < state->block_width; x++) - { - if (y < h && x < w) continue; - - for (uniform int p = 0; p < 4; p++) - sq_sum += sq(pset->pixels[pitch * p + stride * y + x]); - } - - state->scale_error[h - 2][w - 2] = sq_sum; - } -} - -float estimate_error(astc_rank_state state[], uniform astc_mode mode[]) -{ - uniform int c = 0; - if (mode->dual_plane) c = 1 + mode->color_component_selector; - - float scale_error = state->scale_error[mode->height - 2][mode->width - 2]; - - uniform bool zero_based = (mode->color_endpoint_modes[0] % 4) == 2; - float pca_error = state->pca_error[zero_based][c]; - float sq_norm = state->sq_norm[zero_based][c]; - - if (mode->color_endpoint_modes[0] <= 8) pca_error += state->alpha_error[zero_based][c]; - - uniform float sq_rcp_w_levels = get_sq_rcp_levels(mode->weight_range); - uniform float sq_rcp_ep_levels = get_sq_rcp_levels(mode->endpoint_range); - float quant_error = 0; - - quant_error += 2 * sq_norm * sq_rcp_w_levels; - quant_error += 9000 * (state->block_height * state->block_width) * sq_rcp_ep_levels; - - float error = 0; - error += scale_error; - error += pca_error; - error += quant_error; - - return error; -} - -void insert_element(astc_rank_state state[], float error, uint32_t packed_mode, float threshold_error[]) -{ - float max_error = 0; - - for (uniform int k = 0; k < state->fastSkipTreshold; k++) - { - if (state->best_scores[k] > error) - { - swap(state->best_scores[k], error); - swap(state->best_modes[k], packed_mode); - } - - max_error = max(max_error, state->best_scores[k]); - } - - *threshold_error = max_error; -} - -uniform static const int packed_modes_count = 3334; -uniform static const uint32_t packed_modes[3334] = -{ - 0x0006D400, 0x0016D340, 0x0026D380, 0x0036CDC0, 0x00469400, 0x00569401, 0x00668702, 0x00769440, - 0x00868D41, 0x00969480, 0x00A68D81, 0x00B693C0, 0x00C688C1, 0x00D4D400, 0x00E4D401, 0x00F4C702, - 0x0104D440, 0x0114CD41, 0x0124D480, 0x0134CD81, 0x0144D3C0, 0x0154C8C1, 0x01667400, 0x01767401, - 0x01867302, 0x01966803, 0x01A67440, 0x01B67341, 0x01C66B42, 0x01D66443, 0x01E67480, 0x01F67381, - 0x02066B82, 0x02166483, 0x022674C0, 0x02366DC1, 0x024667C2, 0x0253D400, 0x0263D401, 0x0273D302, - 0x0283C803, 0x0293D440, 0x02A3D341, 0x02B3CB42, 0x02C3C443, 0x02D3D480, 0x02E3D381, 0x02F3CB82, - 0x0303C483, 0x0313D4C0, 0x0323CDC1, 0x0333C7C2, 0x03465400, 0x03565401, 0x03665402, 0x03765403, - 0x03865004, 0x03964705, 0x03A65440, 0x03B65441, 0x03C65342, 0x03D64E43, 0x03E64944, 0x03F65480, - 0x04065481, 0x04165382, 0x04264E83, 0x04364984, 0x044654C0, 0x045652C1, 0x04664DC2, 0x047649C3, - 0x048646C4, 0x049E5400, 0x04AE5240, 0x04BE5280, 0x04CE4DC0, 0x04DE5410, 0x04EE5250, 0x04FE5290, - 0x050E4DD0, 0x051E5420, 0x052E5260, 0x053E52A0, 0x054E4DE0, 0x055E52B0, 0x056E4DF0, 0x0572D400, - 0x0582D401, 0x0592D402, 0x05A2D403, 0x05B2D004, 0x05C2C705, 0x05D2D440, 0x05E2D441, 0x05F2D342, - 0x0602CE43, 0x0612C944, 0x0622D480, 0x0632D481, 0x0642D382, 0x0652CE83, 0x0662C984, 0x0672D4C0, - 0x0682D2C1, 0x0692CDC2, 0x06A2C9C3, 0x06B2C6C4, 0x06CAD400, 0x06DAD240, 0x06EAD280, 0x06FACDC0, - 0x070AD410, 0x071AD250, 0x072AD290, 0x073ACDD0, 0x074AD420, 0x075AD260, 0x076AD2A0, 0x077ACDE0, - 0x078AD2B0, 0x079ACDF0, 0x07A63400, 0x07B63401, 0x07C63402, 0x07D63403, 0x07E63404, 0x07F63405, - 0x08063306, 0x08162E07, 0x08262708, 0x08363440, 0x08463441, 0x08563442, 0x08663443, 0x08763444, - 0x08862F45, 0x08962B46, 0x08A62847, 0x08B63480, 0x08C63481, 0x08D63482, 0x08E63483, 0x08F63484, - 0x09062F85, 0x09162B86, 0x09262887, 0x093634C0, 0x094634C1, 0x095633C2, 0x096630C3, 0x09762EC4, - 0x09862AC5, 0x099627C6, 0x09A625C7, 0x09BE3400, 0x09CE3401, 0x09DE2502, 0x09EE3440, 0x09FE2C41, - 0x0A0E3480, 0x0A1E2C81, 0x0A2E33C0, 0x0A3E28C1, 0x0A4E3410, 0x0A5E3411, 0x0A6E2512, 0x0A7E3450, - 0x0A8E2C51, 0x0A9E3490, 0x0AAE2C91, 0x0ABE33D0, 0x0ACE28D1, 0x0ADE3420, 0x0AEE3421, 0x0AFE2522, - 0x0B0E3460, 0x0B1E2C61, 0x0B2E34A0, 0x0B3E2CA1, 0x0B4E33E0, 0x0B5E28E1, 0x0B6E34B0, 0x0B7E2CB1, - 0x0B8E33F0, 0x0B9E28F1, 0x0BA1D400, 0x0BB1D401, 0x0BC1D402, 0x0BD1D403, 0x0BE1D404, 0x0BF1D405, - 0x0C01D306, 0x0C11CE07, 0x0C21C708, 0x0C31D440, 0x0C41D441, 0x0C51D442, 0x0C61D443, 0x0C71D444, - 0x0C81CF45, 0x0C91CB46, 0x0CA1C847, 0x0CB1D480, 0x0CC1D481, 0x0CD1D482, 0x0CE1D483, 0x0CF1D484, - 0x0D01CF85, 0x0D11CB86, 0x0D21C887, 0x0D31D4C0, 0x0D41D4C1, 0x0D51D3C2, 0x0D61D0C3, 0x0D71CEC4, - 0x0D81CAC5, 0x0D91C7C6, 0x0DA1C5C7, 0x0DB9D400, 0x0DC9D401, 0x0DD9C502, 0x0DE9D440, 0x0DF9CC41, - 0x0E09D480, 0x0E19CC81, 0x0E29D3C0, 0x0E39C8C1, 0x0E49D410, 0x0E59D411, 0x0E69C512, 0x0E79D450, - 0x0E89CC51, 0x0E99D490, 0x0EA9CC91, 0x0EB9D3D0, 0x0EC9C8D1, 0x0ED9D420, 0x0EE9D421, 0x0EF9C522, - 0x0F09D460, 0x0F19CC61, 0x0F29D4A0, 0x0F39CCA1, 0x0F49D3E0, 0x0F59C8E1, 0x0F69D4B0, 0x0F79CCB1, - 0x0F89D3F0, 0x0F99C8F1, 0x0FA61401, 0x0FB61402, 0x0FC61403, 0x0FD61404, 0x0FE61405, 0x0FF61406, - 0x10061407, 0x10161408, 0x10261409, 0x1036140A, 0x1046130B, 0x10561441, 0x10661442, 0x10761443, - 0x10861444, 0x10961445, 0x10A61446, 0x10B61447, 0x10C61348, 0x10D61049, 0x10E60E4A, 0x10F60B4B, - 0x11061481, 0x11161482, 0x11261483, 0x11361484, 0x11461485, 0x11561486, 0x11661487, 0x11761388, - 0x11861089, 0x11960E8A, 0x11A60B8B, 0x11B614C1, 0x11C614C2, 0x11D614C3, 0x11E614C4, 0x11F613C5, - 0x120611C6, 0x121610C7, 0x12260DC8, 0x12360BC9, 0x12460ACA, 0x125607CB, 0x126E1400, 0x127E1401, - 0x128E1402, 0x129E1403, 0x12AE0E04, 0x12BE0505, 0x12CE1440, 0x12DE1441, 0x12EE1242, 0x12FE0D43, - 0x130E0844, 0x131E1480, 0x132E1481, 0x133E1282, 0x134E0D83, 0x135E0884, 0x136E14C0, 0x137E11C1, - 0x138E0DC2, 0x139E08C3, 0x13AE05C4, 0x13BE1410, 0x13CE1411, 0x13DE1412, 0x13EE1413, 0x13FE0E14, - 0x140E0515, 0x141E1450, 0x142E1451, 0x143E1252, 0x144E0D53, 0x145E0854, 0x146E1490, 0x147E1491, - 0x148E1292, 0x149E0D93, 0x14AE0894, 0x14BE14D0, 0x14CE11D1, 0x14DE0DD2, 0x14EE08D3, 0x14FE05D4, - 0x150E1420, 0x151E1421, 0x152E1422, 0x153E1423, 0x154E0E24, 0x155E0525, 0x156E1460, 0x157E1461, - 0x158E1262, 0x159E0D63, 0x15AE0864, 0x15BE14A0, 0x15CE14A1, 0x15DE12A2, 0x15EE0DA3, 0x15FE08A4, - 0x160E14E0, 0x161E11E1, 0x162E0DE2, 0x163E08E3, 0x164E05E4, 0x165E14B0, 0x166E14B1, 0x167E12B2, - 0x168E0DB3, 0x169E08B4, 0x16AE14F0, 0x16BE11F1, 0x16CE0DF2, 0x16DE08F3, 0x16EE05F4, 0x16F0D401, - 0x1700D402, 0x1710D403, 0x1720D404, 0x1730D405, 0x1740D406, 0x1750D407, 0x1760D408, 0x1770D409, - 0x1780D40A, 0x1790D30B, 0x17A0D441, 0x17B0D442, 0x17C0D443, 0x17D0D444, 0x17E0D445, 0x17F0D446, - 0x1800D447, 0x1810D348, 0x1820D049, 0x1830CE4A, 0x1840CB4B, 0x1850D481, 0x1860D482, 0x1870D483, - 0x1880D484, 0x1890D485, 0x18A0D486, 0x18B0D487, 0x18C0D388, 0x18D0D089, 0x18E0CE8A, 0x18F0CB8B, - 0x1900D4C1, 0x1910D4C2, 0x1920D4C3, 0x1930D4C4, 0x1940D3C5, 0x1950D1C6, 0x1960D0C7, 0x1970CDC8, - 0x1980CBC9, 0x1990CACA, 0x19A0C7CB, 0x19B8D400, 0x19C8D401, 0x19D8D402, 0x19E8D403, 0x19F8CE04, - 0x1A08C505, 0x1A18D440, 0x1A28D441, 0x1A38D242, 0x1A48CD43, 0x1A58C844, 0x1A68D480, 0x1A78D481, - 0x1A88D282, 0x1A98CD83, 0x1AA8C884, 0x1AB8D4C0, 0x1AC8D1C1, 0x1AD8CDC2, 0x1AE8C8C3, 0x1AF8C5C4, - 0x1B08D410, 0x1B18D411, 0x1B28D412, 0x1B38D413, 0x1B48CE14, 0x1B58C515, 0x1B68D450, 0x1B78D451, - 0x1B88D252, 0x1B98CD53, 0x1BA8C854, 0x1BB8D490, 0x1BC8D491, 0x1BD8D292, 0x1BE8CD93, 0x1BF8C894, - 0x1C08D4D0, 0x1C18D1D1, 0x1C28CDD2, 0x1C38C8D3, 0x1C48C5D4, 0x1C58D420, 0x1C68D421, 0x1C78D422, - 0x1C88D423, 0x1C98CE24, 0x1CA8C525, 0x1CB8D460, 0x1CC8D461, 0x1CD8D262, 0x1CE8CD63, 0x1CF8C864, - 0x1D08D4A0, 0x1D18D4A1, 0x1D28D2A2, 0x1D38CDA3, 0x1D48C8A4, 0x1D58D4E0, 0x1D68D1E1, 0x1D78CDE2, - 0x1D88C8E3, 0x1D98C5E4, 0x1DA8D4B0, 0x1DB8D4B1, 0x1DC8D2B2, 0x1DD8CDB3, 0x1DE8C8B4, 0x1DF8D4F0, - 0x1E08D1F1, 0x1E18CDF2, 0x1E28C8F3, 0x1E38C5F4, 0x1E449400, 0x1E549401, 0x1E649402, 0x1E749003, - 0x1E848804, 0x1E949440, 0x1EA49441, 0x1EB48F42, 0x1EC48943, 0x1ED48444, 0x1EE49480, 0x1EF49481, - 0x1F048F82, 0x1F148983, 0x1F248484, 0x1F3494C0, 0x1F4490C1, 0x1F548AC2, 0x1F6486C3, 0x1F747400, - 0x1F847401, 0x1F947402, 0x1FA47403, 0x1FB47404, 0x1FC46B05, 0x1FD47440, 0x1FE47441, 0x1FF47442, - 0x20047043, 0x20146C44, 0x20246645, 0x20347480, 0x20447481, 0x20547482, 0x20647083, 0x20746C84, - 0x20846685, 0x209474C0, 0x20A473C1, 0x20B46FC2, 0x20C46BC3, 0x20D468C4, 0x20E464C5, 0x20FC7400, - 0x210C6501, 0x211C7440, 0x212C7480, 0x213C6EC0, 0x214C7410, 0x215C6511, 0x216C7450, 0x217C7490, - 0x218C6ED0, 0x219C7420, 0x21AC6521, 0x21BC7460, 0x21CC74A0, 0x21DC6EE0, 0x21EC74B0, 0x21FC6EF0, - 0x22039400, 0x22139401, 0x22239402, 0x22339403, 0x22439404, 0x22538B05, 0x22639440, 0x22739441, - 0x22839442, 0x22939043, 0x22A38C44, 0x22B38645, 0x22C39480, 0x22D39481, 0x22E39482, 0x22F39083, - 0x23038C84, 0x23138685, 0x232394C0, 0x233393C1, 0x23438FC2, 0x23538BC3, 0x236388C4, 0x237384C5, - 0x238B9400, 0x239B8501, 0x23AB9440, 0x23BB9480, 0x23CB8EC0, 0x23DB9410, 0x23EB8511, 0x23FB9450, - 0x240B9490, 0x241B8ED0, 0x242B9420, 0x243B8521, 0x244B9460, 0x245B94A0, 0x246B8EE0, 0x247B94B0, - 0x248B8EF0, 0x24937400, 0x24A37401, 0x24B37402, 0x24C37403, 0x24D37404, 0x24E37405, 0x24F37006, - 0x25036B07, 0x25137440, 0x25237441, 0x25337442, 0x25437443, 0x25537344, 0x25636E45, 0x25736946, - 0x25836647, 0x25937480, 0x25A37481, 0x25B37482, 0x25C37483, 0x25D37384, 0x25E36E85, 0x25F36986, - 0x26036687, 0x261374C0, 0x262374C1, 0x263373C2, 0x26436FC3, 0x26536DC4, 0x266369C5, 0x267366C6, - 0x268364C7, 0x269B7400, 0x26AB7101, 0x26BB7440, 0x26CB6A41, 0x26DB7480, 0x26EB6A81, 0x26FB72C0, - 0x270B67C1, 0x271B7410, 0x272B7111, 0x273B7450, 0x274B6A51, 0x275B7490, 0x276B6A91, 0x277B72D0, - 0x278B67D1, 0x279B7420, 0x27AB7121, 0x27BB7460, 0x27CB6A61, 0x27DB74A0, 0x27EB6AA1, 0x27FB72E0, - 0x280B67E1, 0x281B74B0, 0x282B6AB1, 0x283B72F0, 0x284B67F1, 0x28545400, 0x28645401, 0x28745402, - 0x28845403, 0x28945404, 0x28A45405, 0x28B45306, 0x28C44E07, 0x28D44708, 0x28E45440, 0x28F45441, - 0x29045442, 0x29145443, 0x29245444, 0x29344F45, 0x29444B46, 0x29544847, 0x29645480, 0x29745481, - 0x29845482, 0x29945483, 0x29A45484, 0x29B44F85, 0x29C44B86, 0x29D44887, 0x29E454C0, 0x29F454C1, - 0x2A0453C2, 0x2A1450C3, 0x2A244EC4, 0x2A344AC5, 0x2A4447C6, 0x2A5445C7, 0x2A6C5400, 0x2A7C5401, - 0x2A8C4502, 0x2A9C5440, 0x2AAC4C41, 0x2ABC5480, 0x2ACC4C81, 0x2ADC53C0, 0x2AEC48C1, 0x2AFC5410, - 0x2B0C5411, 0x2B1C4512, 0x2B2C5450, 0x2B3C4C51, 0x2B4C5490, 0x2B5C4C91, 0x2B6C53D0, 0x2B7C48D1, - 0x2B8C5420, 0x2B9C5421, 0x2BAC4522, 0x2BBC5460, 0x2BCC4C61, 0x2BDC54A0, 0x2BEC4CA1, 0x2BFC53E0, - 0x2C0C48E1, 0x2C1C54B0, 0x2C2C4CB1, 0x2C3C53F0, 0x2C4C48F1, 0x2C529400, 0x2C629401, 0x2C729402, - 0x2C829403, 0x2C929404, 0x2CA29405, 0x2CB29306, 0x2CC28E07, 0x2CD28708, 0x2CE29440, 0x2CF29441, - 0x2D029442, 0x2D129443, 0x2D229444, 0x2D328F45, 0x2D428B46, 0x2D528847, 0x2D629480, 0x2D729481, - 0x2D829482, 0x2D929483, 0x2DA29484, 0x2DB28F85, 0x2DC28B86, 0x2DD28887, 0x2DE294C0, 0x2DF294C1, - 0x2E0293C2, 0x2E1290C3, 0x2E228EC4, 0x2E328AC5, 0x2E4287C6, 0x2E5285C7, 0x2E6A9400, 0x2E7A9401, - 0x2E8A8502, 0x2E9A9440, 0x2EAA8C41, 0x2EBA9480, 0x2ECA8C81, 0x2EDA93C0, 0x2EEA88C1, 0x2EFA9410, - 0x2F0A9411, 0x2F1A8512, 0x2F2A9450, 0x2F3A8C51, 0x2F4A9490, 0x2F5A8C91, 0x2F6A93D0, 0x2F7A88D1, - 0x2F8A9420, 0x2F9A9421, 0x2FAA8522, 0x2FBA9460, 0x2FCA8C61, 0x2FDA94A0, 0x2FEA8CA1, 0x2FFA93E0, - 0x300A88E1, 0x301A94B0, 0x302A8CB1, 0x303A93F0, 0x304A88F1, 0x30535401, 0x30635402, 0x30735403, - 0x30835404, 0x30935405, 0x30A35406, 0x30B35407, 0x30C35308, 0x30D34E09, 0x30E34A0A, 0x30F35441, - 0x31035442, 0x31135443, 0x31235444, 0x31335445, 0x31435246, 0x31534F47, 0x31634B48, 0x31734849, - 0x3183454A, 0x31935481, 0x31A35482, 0x31B35483, 0x31C35484, 0x31D35485, 0x31E35286, 0x31F34F87, - 0x32034B88, 0x32134889, 0x3223458A, 0x323354C1, 0x324354C2, 0x325354C3, 0x326352C4, 0x32734FC5, - 0x32834CC6, 0x32934AC7, 0x32A347C8, 0x32B345C9, 0x32CB5400, 0x32DB5401, 0x32EB5102, 0x32FB4703, - 0x330B5440, 0x331B5241, 0x332B4A42, 0x333B5480, 0x334B5281, 0x335B4A82, 0x336B54C0, 0x337B4DC1, - 0x338B47C2, 0x339B5410, 0x33AB5411, 0x33BB5112, 0x33CB4713, 0x33DB5450, 0x33EB5251, 0x33FB4A52, - 0x340B5490, 0x341B5291, 0x342B4A92, 0x343B54D0, 0x344B4DD1, 0x345B47D2, 0x346B5420, 0x347B5421, - 0x348B5122, 0x349B4723, 0x34AB5460, 0x34BB5261, 0x34CB4A62, 0x34DB54A0, 0x34EB52A1, 0x34FB4AA2, - 0x350B54E0, 0x351B4DE1, 0x352B47E2, 0x353B54B0, 0x354B52B1, 0x355B4AB2, 0x356B54F0, 0x357B4DF1, - 0x358B47F2, 0x35927401, 0x35A27402, 0x35B27403, 0x35C27404, 0x35D27405, 0x35E27406, 0x35F27407, - 0x36027308, 0x36126E09, 0x36226A0A, 0x36327441, 0x36427442, 0x36527443, 0x36627444, 0x36727445, - 0x36827246, 0x36926F47, 0x36A26B48, 0x36B26849, 0x36C2654A, 0x36D27481, 0x36E27482, 0x36F27483, - 0x37027484, 0x37127485, 0x37227286, 0x37326F87, 0x37426B88, 0x37526889, 0x3762658A, 0x377274C1, - 0x378274C2, 0x379274C3, 0x37A272C4, 0x37B26FC5, 0x37C26CC6, 0x37D26AC7, 0x37E267C8, 0x37F265C9, - 0x380A7400, 0x381A7401, 0x382A7102, 0x383A6703, 0x384A7440, 0x385A7241, 0x386A6A42, 0x387A7480, - 0x388A7281, 0x389A6A82, 0x38AA74C0, 0x38BA6DC1, 0x38CA67C2, 0x38DA7410, 0x38EA7411, 0x38FA7112, - 0x390A6713, 0x391A7450, 0x392A7251, 0x393A6A52, 0x394A7490, 0x395A7291, 0x396A6A92, 0x397A74D0, - 0x398A6DD1, 0x399A67D2, 0x39AA7420, 0x39BA7421, 0x39CA7122, 0x39DA6723, 0x39EA7460, 0x39FA7261, - 0x3A0A6A62, 0x3A1A74A0, 0x3A2A72A1, 0x3A3A6AA2, 0x3A4A74E0, 0x3A5A6DE1, 0x3A6A67E2, 0x3A7A74B0, - 0x3A8A72B1, 0x3A9A6AB2, 0x3AAA74F0, 0x3ABA6DF1, 0x3ACA67F2, 0x3AD25401, 0x3AE25402, 0x3AF25403, - 0x3B025404, 0x3B125405, 0x3B225406, 0x3B325407, 0x3B425408, 0x3B525409, 0x3B62540A, 0x3B72530B, - 0x3B825441, 0x3B925442, 0x3BA25443, 0x3BB25444, 0x3BC25445, 0x3BD25446, 0x3BE25447, 0x3BF25348, - 0x3C025049, 0x3C124E4A, 0x3C224B4B, 0x3C325481, 0x3C425482, 0x3C525483, 0x3C625484, 0x3C725485, - 0x3C825486, 0x3C925487, 0x3CA25388, 0x3CB25089, 0x3CC24E8A, 0x3CD24B8B, 0x3CE254C1, 0x3CF254C2, - 0x3D0254C3, 0x3D1254C4, 0x3D2253C5, 0x3D3251C6, 0x3D4250C7, 0x3D524DC8, 0x3D624BC9, 0x3D724ACA, - 0x3D8247CB, 0x3D9A5400, 0x3DAA5401, 0x3DBA5402, 0x3DCA5403, 0x3DDA4E04, 0x3DEA4505, 0x3DFA5440, - 0x3E0A5441, 0x3E1A5242, 0x3E2A4D43, 0x3E3A4844, 0x3E4A5480, 0x3E5A5481, 0x3E6A5282, 0x3E7A4D83, - 0x3E8A4884, 0x3E9A54C0, 0x3EAA51C1, 0x3EBA4DC2, 0x3ECA48C3, 0x3EDA45C4, 0x3EEA5410, 0x3EFA5411, - 0x3F0A5412, 0x3F1A5413, 0x3F2A4E14, 0x3F3A4515, 0x3F4A5450, 0x3F5A5451, 0x3F6A5252, 0x3F7A4D53, - 0x3F8A4854, 0x3F9A5490, 0x3FAA5491, 0x3FBA5292, 0x3FCA4D93, 0x3FDA4894, 0x3FEA54D0, 0x3FFA51D1, - 0x400A4DD2, 0x401A48D3, 0x402A45D4, 0x403A5420, 0x404A5421, 0x405A5422, 0x406A5423, 0x407A4E24, - 0x408A4525, 0x409A5460, 0x40AA5461, 0x40BA5262, 0x40CA4D63, 0x40DA4864, 0x40EA54A0, 0x40FA54A1, - 0x410A52A2, 0x411A4DA3, 0x412A48A4, 0x413A54E0, 0x414A51E1, 0x415A4DE2, 0x416A48E3, 0x417A45E4, - 0x418A54B0, 0x419A54B1, 0x41AA52B2, 0x41BA4DB3, 0x41CA48B4, 0x41DA54F0, 0x41EA51F1, 0x41FA4DF2, - 0x420A48F3, 0x421A45F4, 0x42243401, 0x42343402, 0x42443403, 0x42543404, 0x42643405, 0x42743406, - 0x42843407, 0x42943408, 0x42A43409, 0x42B4310A, 0x42C42B0B, 0x42D43441, 0x42E43442, 0x42F43443, - 0x43043444, 0x43143445, 0x43243446, 0x43343347, 0x43442F48, 0x43542C49, 0x43642A4A, 0x4374264B, - 0x43843481, 0x43943482, 0x43A43483, 0x43B43484, 0x43C43485, 0x43D43486, 0x43E43387, 0x43F42F88, - 0x44042C89, 0x44142A8A, 0x4424268B, 0x443434C1, 0x444434C2, 0x445434C3, 0x446434C4, 0x447431C5, - 0x44842FC6, 0x44942DC7, 0x44A42AC8, 0x44B428C9, 0x44C426CA, 0x44D424CB, 0x44EC3400, 0x44FC3401, - 0x450C3402, 0x451C2E03, 0x452C2704, 0x453C3440, 0x454C3441, 0x455C2E42, 0x456C2843, 0x457C3480, - 0x458C3481, 0x459C2E82, 0x45AC2883, 0x45BC34C0, 0x45CC2FC1, 0x45DC2AC2, 0x45EC25C3, 0x45FC3410, - 0x460C3411, 0x461C3412, 0x462C2E13, 0x463C2714, 0x464C3450, 0x465C3451, 0x466C2E52, 0x467C2853, - 0x468C3490, 0x469C3491, 0x46AC2E92, 0x46BC2893, 0x46CC34D0, 0x46DC2FD1, 0x46EC2AD2, 0x46FC25D3, - 0x470C3420, 0x471C3421, 0x472C3422, 0x473C2E23, 0x474C2724, 0x475C3460, 0x476C3461, 0x477C2E62, - 0x478C2863, 0x479C34A0, 0x47AC34A1, 0x47BC2EA2, 0x47CC28A3, 0x47DC34E0, 0x47EC2FE1, 0x47FC2AE2, - 0x480C25E3, 0x481C34B0, 0x482C34B1, 0x483C2EB2, 0x484C28B3, 0x485C34F0, 0x486C2FF1, 0x487C2AF2, - 0x488C25F3, 0x48919401, 0x48A19402, 0x48B19403, 0x48C19404, 0x48D19405, 0x48E19406, 0x48F19407, - 0x49019408, 0x49119409, 0x4921910A, 0x49318B0B, 0x49419441, 0x49519442, 0x49619443, 0x49719444, - 0x49819445, 0x49919446, 0x49A19347, 0x49B18F48, 0x49C18C49, 0x49D18A4A, 0x49E1864B, 0x49F19481, - 0x4A019482, 0x4A119483, 0x4A219484, 0x4A319485, 0x4A419486, 0x4A519387, 0x4A618F88, 0x4A718C89, - 0x4A818A8A, 0x4A91868B, 0x4AA194C1, 0x4AB194C2, 0x4AC194C3, 0x4AD194C4, 0x4AE191C5, 0x4AF18FC6, - 0x4B018DC7, 0x4B118AC8, 0x4B2188C9, 0x4B3186CA, 0x4B4184CB, 0x4B599400, 0x4B699401, 0x4B799402, - 0x4B898E03, 0x4B998704, 0x4BA99440, 0x4BB99441, 0x4BC98E42, 0x4BD98843, 0x4BE99480, 0x4BF99481, - 0x4C098E82, 0x4C198883, 0x4C2994C0, 0x4C398FC1, 0x4C498AC2, 0x4C5985C3, 0x4C699410, 0x4C799411, - 0x4C899412, 0x4C998E13, 0x4CA98714, 0x4CB99450, 0x4CC99451, 0x4CD98E52, 0x4CE98853, 0x4CF99490, - 0x4D099491, 0x4D198E92, 0x4D298893, 0x4D3994D0, 0x4D498FD1, 0x4D598AD2, 0x4D6985D3, 0x4D799420, - 0x4D899421, 0x4D999422, 0x4DA98E23, 0x4DB98724, 0x4DC99460, 0x4DD99461, 0x4DE98E62, 0x4DF98863, - 0x4E0994A0, 0x4E1994A1, 0x4E298EA2, 0x4E3988A3, 0x4E4994E0, 0x4E598FE1, 0x4E698AE2, 0x4E7985E3, - 0x4E8994B0, 0x4E9994B1, 0x4EA98EB2, 0x4EB988B3, 0x4EC994F0, 0x4ED98FF1, 0x4EE98AF2, 0x4EF985F3, - 0x4F033401, 0x4F133402, 0x4F233403, 0x4F333404, 0x4F433405, 0x4F533406, 0x4F633407, 0x4F733408, - 0x4F833409, 0x4F93340A, 0x4FA3340B, 0x4FB33441, 0x4FC33442, 0x4FD33443, 0x4FE33444, 0x4FF33445, - 0x50033446, 0x50133447, 0x50233448, 0x50333349, 0x5043314A, 0x50532E4B, 0x50633481, 0x50733482, - 0x50833483, 0x50933484, 0x50A33485, 0x50B33486, 0x50C33487, 0x50D33488, 0x50E33389, 0x50F3318A, - 0x51032E8B, 0x511334C1, 0x512334C2, 0x513334C3, 0x514334C4, 0x515334C5, 0x516333C6, 0x517331C7, - 0x51832FC8, 0x51932DC9, 0x51A32BCA, 0x51B329CB, 0x51CB3400, 0x51DB3401, 0x51EB3402, 0x51FB3403, - 0x520B3304, 0x521B2A05, 0x522B3440, 0x523B3441, 0x524B3442, 0x525B2F43, 0x526B2B44, 0x527B2545, - 0x528B3480, 0x529B3481, 0x52AB3482, 0x52BB2F83, 0x52CB2B84, 0x52DB2585, 0x52EB34C0, 0x52FB33C1, - 0x530B2EC2, 0x531B2AC3, 0x532B27C4, 0x533B3410, 0x534B3411, 0x535B3412, 0x536B3413, 0x537B3314, - 0x538B2A15, 0x539B3450, 0x53AB3451, 0x53BB3452, 0x53CB2F53, 0x53DB2B54, 0x53EB2555, 0x53FB3490, - 0x540B3491, 0x541B3492, 0x542B2F93, 0x543B2B94, 0x544B2595, 0x545B34D0, 0x546B33D1, 0x547B2ED2, - 0x548B2AD3, 0x549B27D4, 0x54AB3420, 0x54BB3421, 0x54CB3422, 0x54DB3423, 0x54EB3324, 0x54FB2A25, - 0x550B3460, 0x551B3461, 0x552B3462, 0x553B2F63, 0x554B2B64, 0x555B2565, 0x556B34A0, 0x557B34A1, - 0x558B34A2, 0x559B2FA3, 0x55AB2BA4, 0x55BB25A5, 0x55CB34E0, 0x55DB33E1, 0x55EB2EE2, 0x55FB2AE3, - 0x560B27E4, 0x561B34B0, 0x562B34B1, 0x563B34B2, 0x564B2FB3, 0x565B2BB4, 0x566B25B5, 0x567B34F0, - 0x568B33F1, 0x569B2EF2, 0x56AB2AF3, 0x56BB27F4, 0x56C17401, 0x56D17402, 0x56E17403, 0x56F17404, - 0x57017405, 0x57117406, 0x57217407, 0x57317408, 0x57417409, 0x5751740A, 0x5761740B, 0x57717441, - 0x57817442, 0x57917443, 0x57A17444, 0x57B17445, 0x57C17446, 0x57D17447, 0x57E17448, 0x57F17349, - 0x5801714A, 0x58116E4B, 0x58217481, 0x58317482, 0x58417483, 0x58517484, 0x58617485, 0x58717486, - 0x58817487, 0x58917488, 0x58A17389, 0x58B1718A, 0x58C16E8B, 0x58D174C1, 0x58E174C2, 0x58F174C3, - 0x590174C4, 0x591174C5, 0x592173C6, 0x593171C7, 0x59416FC8, 0x59516DC9, 0x59616BCA, 0x597169CB, - 0x59897400, 0x59997401, 0x59A97402, 0x59B97403, 0x59C97304, 0x59D96A05, 0x59E97440, 0x59F97441, - 0x5A097442, 0x5A196F43, 0x5A296B44, 0x5A396545, 0x5A497480, 0x5A597481, 0x5A697482, 0x5A796F83, - 0x5A896B84, 0x5A996585, 0x5AA974C0, 0x5AB973C1, 0x5AC96EC2, 0x5AD96AC3, 0x5AE967C4, 0x5AF97410, - 0x5B097411, 0x5B197412, 0x5B297413, 0x5B397314, 0x5B496A15, 0x5B597450, 0x5B697451, 0x5B797452, - 0x5B896F53, 0x5B996B54, 0x5BA96555, 0x5BB97490, 0x5BC97491, 0x5BD97492, 0x5BE96F93, 0x5BF96B94, - 0x5C096595, 0x5C1974D0, 0x5C2973D1, 0x5C396ED2, 0x5C496AD3, 0x5C5967D4, 0x5C697420, 0x5C797421, - 0x5C897422, 0x5C997423, 0x5CA97324, 0x5CB96A25, 0x5CC97460, 0x5CD97461, 0x5CE97462, 0x5CF96F63, - 0x5D096B64, 0x5D196565, 0x5D2974A0, 0x5D3974A1, 0x5D4974A2, 0x5D596FA3, 0x5D696BA4, 0x5D7965A5, - 0x5D8974E0, 0x5D9973E1, 0x5DA96EE2, 0x5DB96AE3, 0x5DC967E4, 0x5DD974B0, 0x5DE974B1, 0x5DF974B2, - 0x5E096FB3, 0x5E196BB4, 0x5E2965B5, 0x5E3974F0, 0x5E4973F1, 0x5E596EF2, 0x5E696AF3, 0x5E7967F4, - 0x5E823402, 0x5E923403, 0x5EA23404, 0x5EB23405, 0x5EC23406, 0x5ED23407, 0x5EE23408, 0x5EF23409, - 0x5F02340A, 0x5F12340B, 0x5F223442, 0x5F323443, 0x5F423444, 0x5F523445, 0x5F623446, 0x5F723447, - 0x5F823448, 0x5F923449, 0x5FA2344A, 0x5FB2344B, 0x5FC23482, 0x5FD23483, 0x5FE23484, 0x5FF23485, - 0x60023486, 0x60123487, 0x60223488, 0x60323489, 0x6042348A, 0x6052348B, 0x606234C2, 0x607234C3, - 0x608234C4, 0x609234C5, 0x60A234C6, 0x60B234C7, 0x60C233C8, 0x60D232C9, 0x60E230CA, 0x60F22FCB, - 0x610A3400, 0x611A3401, 0x612A3402, 0x613A3403, 0x614A3404, 0x615A3405, 0x616A3106, 0x617A2C07, - 0x618A2508, 0x619A3440, 0x61AA3441, 0x61BA3442, 0x61CA3443, 0x61DA3344, 0x61EA2E45, 0x61FA2A46, - 0x620A2747, 0x621A3480, 0x622A3481, 0x623A3482, 0x624A3483, 0x625A3384, 0x626A2E85, 0x627A2A86, - 0x628A2787, 0x629A34C0, 0x62AA34C1, 0x62BA33C2, 0x62CA30C3, 0x62DA2DC4, 0x62EA2AC5, 0x62FA27C6, - 0x630A24C7, 0x631A3410, 0x632A3411, 0x633A3412, 0x634A3413, 0x635A3414, 0x636A3415, 0x637A3116, - 0x638A2C17, 0x639A2518, 0x63AA3450, 0x63BA3451, 0x63CA3452, 0x63DA3453, 0x63EA3354, 0x63FA2E55, - 0x640A2A56, 0x641A2757, 0x642A3490, 0x643A3491, 0x644A3492, 0x645A3493, 0x646A3394, 0x647A2E95, - 0x648A2A96, 0x649A2797, 0x64AA34D0, 0x64BA34D1, 0x64CA33D2, 0x64DA30D3, 0x64EA2DD4, 0x64FA2AD5, - 0x650A27D6, 0x651A24D7, 0x652A3420, 0x653A3421, 0x654A3422, 0x655A3423, 0x656A3424, 0x657A3425, - 0x658A3126, 0x659A2C27, 0x65AA2528, 0x65BA3460, 0x65CA3461, 0x65DA3462, 0x65EA3463, 0x65FA3364, - 0x660A2E65, 0x661A2A66, 0x662A2767, 0x663A34A0, 0x664A34A1, 0x665A34A2, 0x666A34A3, 0x667A33A4, - 0x668A2EA5, 0x669A2AA6, 0x66AA27A7, 0x66BA34E0, 0x66CA34E1, 0x66DA33E2, 0x66EA30E3, 0x66FA2DE4, - 0x670A2AE5, 0x671A27E6, 0x672A24E7, 0x673A34B0, 0x674A34B1, 0x675A34B2, 0x676A34B3, 0x677A33B4, - 0x678A2EB5, 0x679A2AB6, 0x67AA27B7, 0x67BA34F0, 0x67CA34F1, 0x67DA33F2, 0x67EA30F3, 0x67FA2DF4, - 0x680A2AF5, 0x681A27F6, 0x682A24F7, 0x68315402, 0x68415403, 0x68515404, 0x68615405, 0x68715406, - 0x68815407, 0x68915408, 0x68A15409, 0x68B1540A, 0x68C1540B, 0x68D15442, 0x68E15443, 0x68F15444, - 0x69015445, 0x69115446, 0x69215447, 0x69315448, 0x69415449, 0x6951544A, 0x6961544B, 0x69715482, - 0x69815483, 0x69915484, 0x69A15485, 0x69B15486, 0x69C15487, 0x69D15488, 0x69E15489, 0x69F1548A, - 0x6A01548B, 0x6A1154C2, 0x6A2154C3, 0x6A3154C4, 0x6A4154C5, 0x6A5154C6, 0x6A6154C7, 0x6A7153C8, - 0x6A8152C9, 0x6A9150CA, 0x6AA14FCB, 0x6AB95400, 0x6AC95401, 0x6AD95402, 0x6AE95403, 0x6AF95404, - 0x6B095405, 0x6B195106, 0x6B294C07, 0x6B394508, 0x6B495440, 0x6B595441, 0x6B695442, 0x6B795443, - 0x6B895344, 0x6B994E45, 0x6BA94A46, 0x6BB94747, 0x6BC95480, 0x6BD95481, 0x6BE95482, 0x6BF95483, - 0x6C095384, 0x6C194E85, 0x6C294A86, 0x6C394787, 0x6C4954C0, 0x6C5954C1, 0x6C6953C2, 0x6C7950C3, - 0x6C894DC4, 0x6C994AC5, 0x6CA947C6, 0x6CB944C7, 0x6CC95410, 0x6CD95411, 0x6CE95412, 0x6CF95413, - 0x6D095414, 0x6D195415, 0x6D295116, 0x6D394C17, 0x6D494518, 0x6D595450, 0x6D695451, 0x6D795452, - 0x6D895453, 0x6D995354, 0x6DA94E55, 0x6DB94A56, 0x6DC94757, 0x6DD95490, 0x6DE95491, 0x6DF95492, - 0x6E095493, 0x6E195394, 0x6E294E95, 0x6E394A96, 0x6E494797, 0x6E5954D0, 0x6E6954D1, 0x6E7953D2, - 0x6E8950D3, 0x6E994DD4, 0x6EA94AD5, 0x6EB947D6, 0x6EC944D7, 0x6ED95420, 0x6EE95421, 0x6EF95422, - 0x6F095423, 0x6F195424, 0x6F295425, 0x6F395126, 0x6F494C27, 0x6F594528, 0x6F695460, 0x6F795461, - 0x6F895462, 0x6F995463, 0x6FA95364, 0x6FB94E65, 0x6FC94A66, 0x6FD94767, 0x6FE954A0, 0x6FF954A1, - 0x700954A2, 0x701954A3, 0x702953A4, 0x70394EA5, 0x70494AA6, 0x705947A7, 0x706954E0, 0x707954E1, - 0x708953E2, 0x709950E3, 0x70A94DE4, 0x70B94AE5, 0x70C947E6, 0x70D944E7, 0x70E954B0, 0x70F954B1, - 0x710954B2, 0x711954B3, 0x712953B4, 0x71394EB5, 0x71494AB6, 0x715947B7, 0x716954F0, 0x717954F1, - 0x718953F2, 0x719950F3, 0x71A94DF4, 0x71B94AF5, 0x71C947F6, 0x71D944F7, 0x71E13404, 0x71F13405, - 0x72013406, 0x72113407, 0x72213408, 0x72313409, 0x7241340A, 0x7251340B, 0x72613444, 0x72713445, - 0x72813446, 0x72913447, 0x72A13448, 0x72B13449, 0x72C1344A, 0x72D1344B, 0x72E13484, 0x72F13485, - 0x73013486, 0x73113487, 0x73213488, 0x73313489, 0x7341348A, 0x7351348B, 0x736134C4, 0x737134C5, - 0x738134C6, 0x739134C7, 0x73A134C8, 0x73B134C9, 0x73C134CA, 0x73D134CB, 0x73E93401, 0x73F93402, - 0x74093403, 0x74193404, 0x74293405, 0x74393406, 0x74493407, 0x74593408, 0x74693309, 0x74792F0A, - 0x74892A0B, 0x74993441, 0x74A93442, 0x74B93443, 0x74C93444, 0x74D93445, 0x74E93446, 0x74F93247, - 0x75092E48, 0x75192B49, 0x7529294A, 0x7539254B, 0x75493481, 0x75593482, 0x75693483, 0x75793484, - 0x75893485, 0x75993486, 0x75A93287, 0x75B92E88, 0x75C92B89, 0x75D9298A, 0x75E9258B, 0x75F934C1, - 0x760934C2, 0x761934C3, 0x762933C4, 0x763930C5, 0x76492EC6, 0x76592CC7, 0x76692AC8, 0x767927C9, - 0x768925CA, 0x76993411, 0x76A93412, 0x76B93413, 0x76C93414, 0x76D93415, 0x76E93416, 0x76F93417, - 0x77093418, 0x77193319, 0x77292F1A, 0x77392A1B, 0x77493451, 0x77593452, 0x77693453, 0x77793454, - 0x77893455, 0x77993456, 0x77A93257, 0x77B92E58, 0x77C92B59, 0x77D9295A, 0x77E9255B, 0x77F93491, - 0x78093492, 0x78193493, 0x78293494, 0x78393495, 0x78493496, 0x78593297, 0x78692E98, 0x78792B99, - 0x7889299A, 0x7899259B, 0x78A934D1, 0x78B934D2, 0x78C934D3, 0x78D933D4, 0x78E930D5, 0x78F92ED6, - 0x79092CD7, 0x79192AD8, 0x792927D9, 0x793925DA, 0x79493421, 0x79593422, 0x79693423, 0x79793424, - 0x79893425, 0x79993426, 0x79A93427, 0x79B93428, 0x79C93329, 0x79D92F2A, 0x79E92A2B, 0x79F93461, - 0x7A093462, 0x7A193463, 0x7A293464, 0x7A393465, 0x7A493466, 0x7A593267, 0x7A692E68, 0x7A792B69, - 0x7A89296A, 0x7A99256B, 0x7AA934A1, 0x7AB934A2, 0x7AC934A3, 0x7AD934A4, 0x7AE934A5, 0x7AF934A6, - 0x7B0932A7, 0x7B192EA8, 0x7B292BA9, 0x7B3929AA, 0x7B4925AB, 0x7B5934E1, 0x7B6934E2, 0x7B7934E3, - 0x7B8933E4, 0x7B9930E5, 0x7BA92EE6, 0x7BB92CE7, 0x7BC92AE8, 0x7BD927E9, 0x7BE925EA, 0x7BF934B1, - 0x7C0934B2, 0x7C1934B3, 0x7C2934B4, 0x7C3934B5, 0x7C4934B6, 0x7C5932B7, 0x7C692EB8, 0x7C792BB9, - 0x7C8929BA, 0x7C9925BB, 0x7CA934F1, 0x7CB934F2, 0x7CC934F3, 0x7CD933F4, 0x7CE930F5, 0x7CF92EF6, - 0x7D092CF7, 0x7D192AF8, 0x7D2927F9, 0x7D3925FA, 0x7D441402, 0x7D541403, 0x7D641404, 0x7D741405, - 0x7D841406, 0x7D941407, 0x7DA41408, 0x7DB41409, 0x7DC4140A, 0x7DD4140B, 0x7DE41442, 0x7DF41443, - 0x7E041444, 0x7E141445, 0x7E241446, 0x7E341447, 0x7E441448, 0x7E541449, 0x7E64144A, 0x7E74144B, - 0x7E841482, 0x7E941483, 0x7EA41484, 0x7EB41485, 0x7EC41486, 0x7ED41487, 0x7EE41488, 0x7EF41489, - 0x7F04148A, 0x7F14148B, 0x7F2414C2, 0x7F3414C3, 0x7F4414C4, 0x7F5414C5, 0x7F6414C6, 0x7F7414C7, - 0x7F8413C8, 0x7F9412C9, 0x7FA410CA, 0x7FB40FCB, 0x7FCC1400, 0x7FDC1401, 0x7FEC1402, 0x7FFC1403, - 0x800C1404, 0x801C1405, 0x802C1106, 0x803C0C07, 0x804C0508, 0x805C1440, 0x806C1441, 0x807C1442, - 0x808C1443, 0x809C1344, 0x80AC0E45, 0x80BC0A46, 0x80CC0747, 0x80DC1480, 0x80EC1481, 0x80FC1482, - 0x810C1483, 0x811C1384, 0x812C0E85, 0x813C0A86, 0x814C0787, 0x815C14C0, 0x816C14C1, 0x817C13C2, - 0x818C10C3, 0x819C0DC4, 0x81AC0AC5, 0x81BC07C6, 0x81CC04C7, 0x81DC1410, 0x81EC1411, 0x81FC1412, - 0x820C1413, 0x821C1414, 0x822C1415, 0x823C1116, 0x824C0C17, 0x825C0518, 0x826C1450, 0x827C1451, - 0x828C1452, 0x829C1453, 0x82AC1354, 0x82BC0E55, 0x82CC0A56, 0x82DC0757, 0x82EC1490, 0x82FC1491, - 0x830C1492, 0x831C1493, 0x832C1394, 0x833C0E95, 0x834C0A96, 0x835C0797, 0x836C14D0, 0x837C14D1, - 0x838C13D2, 0x839C10D3, 0x83AC0DD4, 0x83BC0AD5, 0x83CC07D6, 0x83DC04D7, 0x83EC1420, 0x83FC1421, - 0x840C1422, 0x841C1423, 0x842C1424, 0x843C1425, 0x844C1126, 0x845C0C27, 0x846C0528, 0x847C1460, - 0x848C1461, 0x849C1462, 0x84AC1463, 0x84BC1364, 0x84CC0E65, 0x84DC0A66, 0x84EC0767, 0x84FC14A0, - 0x850C14A1, 0x851C14A2, 0x852C14A3, 0x853C13A4, 0x854C0EA5, 0x855C0AA6, 0x856C07A7, 0x857C14E0, - 0x858C14E1, 0x859C13E2, 0x85AC10E3, 0x85BC0DE4, 0x85CC0AE5, 0x85DC07E6, 0x85EC04E7, 0x85FC14B0, - 0x860C14B1, 0x861C14B2, 0x862C14B3, 0x863C13B4, 0x864C0EB5, 0x865C0AB6, 0x866C07B7, 0x867C14F0, - 0x868C14F1, 0x869C13F2, 0x86AC10F3, 0x86BC0DF4, 0x86CC0AF5, 0x86DC07F6, 0x86EC04F7, 0x86F09402, - 0x87009403, 0x87109404, 0x87209405, 0x87309406, 0x87409407, 0x87509408, 0x87609409, 0x8770940A, - 0x8780940B, 0x87909442, 0x87A09443, 0x87B09444, 0x87C09445, 0x87D09446, 0x87E09447, 0x87F09448, - 0x88009449, 0x8810944A, 0x8820944B, 0x88309482, 0x88409483, 0x88509484, 0x88609485, 0x88709486, - 0x88809487, 0x88909488, 0x88A09489, 0x88B0948A, 0x88C0948B, 0x88D094C2, 0x88E094C3, 0x88F094C4, - 0x890094C5, 0x891094C6, 0x892094C7, 0x893093C8, 0x894092C9, 0x895090CA, 0x89608FCB, 0x89789400, - 0x89889401, 0x89989402, 0x89A89403, 0x89B89404, 0x89C89405, 0x89D89106, 0x89E88C07, 0x89F88508, - 0x8A089440, 0x8A189441, 0x8A289442, 0x8A389443, 0x8A489344, 0x8A588E45, 0x8A688A46, 0x8A788747, - 0x8A889480, 0x8A989481, 0x8AA89482, 0x8AB89483, 0x8AC89384, 0x8AD88E85, 0x8AE88A86, 0x8AF88787, - 0x8B0894C0, 0x8B1894C1, 0x8B2893C2, 0x8B3890C3, 0x8B488DC4, 0x8B588AC5, 0x8B6887C6, 0x8B7884C7, - 0x8B889410, 0x8B989411, 0x8BA89412, 0x8BB89413, 0x8BC89414, 0x8BD89415, 0x8BE89116, 0x8BF88C17, - 0x8C088518, 0x8C189450, 0x8C289451, 0x8C389452, 0x8C489453, 0x8C589354, 0x8C688E55, 0x8C788A56, - 0x8C888757, 0x8C989490, 0x8CA89491, 0x8CB89492, 0x8CC89493, 0x8CD89394, 0x8CE88E95, 0x8CF88A96, - 0x8D088797, 0x8D1894D0, 0x8D2894D1, 0x8D3893D2, 0x8D4890D3, 0x8D588DD4, 0x8D688AD5, 0x8D7887D6, - 0x8D8884D7, 0x8D989420, 0x8DA89421, 0x8DB89422, 0x8DC89423, 0x8DD89424, 0x8DE89425, 0x8DF89126, - 0x8E088C27, 0x8E188528, 0x8E289460, 0x8E389461, 0x8E489462, 0x8E589463, 0x8E689364, 0x8E788E65, - 0x8E888A66, 0x8E988767, 0x8EA894A0, 0x8EB894A1, 0x8EC894A2, 0x8ED894A3, 0x8EE893A4, 0x8EF88EA5, - 0x8F088AA6, 0x8F1887A7, 0x8F2894E0, 0x8F3894E1, 0x8F4893E2, 0x8F5890E3, 0x8F688DE4, 0x8F788AE5, - 0x8F8887E6, 0x8F9884E7, 0x8FA894B0, 0x8FB894B1, 0x8FC894B2, 0x8FD894B3, 0x8FE893B4, 0x8FF88EB5, - 0x90088AB6, 0x901887B7, 0x902894F0, 0x903894F1, 0x904893F2, 0x905890F3, 0x90688DF4, 0x90788AF5, - 0x908887F6, 0x909884F7, 0x90A31403, 0x90B31404, 0x90C31405, 0x90D31406, 0x90E31407, 0x90F31408, - 0x91031409, 0x9113140A, 0x9123140B, 0x91331443, 0x91431444, 0x91531445, 0x91631446, 0x91731447, - 0x91831448, 0x91931449, 0x91A3144A, 0x91B3144B, 0x91C31483, 0x91D31484, 0x91E31485, 0x91F31486, - 0x92031487, 0x92131488, 0x92231489, 0x9233148A, 0x9243148B, 0x925314C3, 0x926314C4, 0x927314C5, - 0x928314C6, 0x929314C7, 0x92A314C8, 0x92B314C9, 0x92C314CA, 0x92D313CB, 0x92EB1401, 0x92FB1402, - 0x930B1403, 0x931B1404, 0x932B1405, 0x933B1406, 0x934B1407, 0x935B1108, 0x936B0C09, 0x937B080A, - 0x938B1441, 0x939B1442, 0x93AB1443, 0x93BB1444, 0x93CB1445, 0x93DB1146, 0x93EB0E47, 0x93FB0A48, - 0x940B0749, 0x941B044A, 0x942B1481, 0x943B1482, 0x944B1483, 0x945B1484, 0x946B1485, 0x947B1186, - 0x948B0E87, 0x949B0A88, 0x94AB0789, 0x94BB048A, 0x94CB14C1, 0x94DB14C2, 0x94EB13C3, 0x94FB11C4, - 0x950B0EC5, 0x951B0BC6, 0x952B0AC7, 0x953B07C8, 0x954B04C9, 0x955B1411, 0x956B1412, 0x957B1413, - 0x958B1414, 0x959B1415, 0x95AB1416, 0x95BB1417, 0x95CB1118, 0x95DB0C19, 0x95EB081A, 0x95FB1451, - 0x960B1452, 0x961B1453, 0x962B1454, 0x963B1455, 0x964B1156, 0x965B0E57, 0x966B0A58, 0x967B0759, - 0x968B045A, 0x969B1491, 0x96AB1492, 0x96BB1493, 0x96CB1494, 0x96DB1495, 0x96EB1196, 0x96FB0E97, - 0x970B0A98, 0x971B0799, 0x972B049A, 0x973B14D1, 0x974B14D2, 0x975B13D3, 0x976B11D4, 0x977B0ED5, - 0x978B0BD6, 0x979B0AD7, 0x97AB07D8, 0x97BB04D9, 0x97CB1421, 0x97DB1422, 0x97EB1423, 0x97FB1424, - 0x980B1425, 0x981B1426, 0x982B1427, 0x983B1128, 0x984B0C29, 0x985B082A, 0x986B1461, 0x987B1462, - 0x988B1463, 0x989B1464, 0x98AB1465, 0x98BB1166, 0x98CB0E67, 0x98DB0A68, 0x98EB0769, 0x98FB046A, - 0x990B14A1, 0x991B14A2, 0x992B14A3, 0x993B14A4, 0x994B14A5, 0x995B11A6, 0x996B0EA7, 0x997B0AA8, - 0x998B07A9, 0x999B04AA, 0x99AB14E1, 0x99BB14E2, 0x99CB13E3, 0x99DB11E4, 0x99EB0EE5, 0x99FB0BE6, - 0x9A0B0AE7, 0x9A1B07E8, 0x9A2B04E9, 0x9A3B14B1, 0x9A4B14B2, 0x9A5B14B3, 0x9A6B14B4, 0x9A7B14B5, - 0x9A8B11B6, 0x9A9B0EB7, 0x9AAB0AB8, 0x9ABB07B9, 0x9ACB04BA, 0x9ADB14F1, 0x9AEB14F2, 0x9AFB13F3, - 0x9B0B11F4, 0x9B1B0EF5, 0x9B2B0BF6, 0x9B3B0AF7, 0x9B4B07F8, 0x9B5B04F9, 0x9B607403, 0x9B707404, - 0x9B807405, 0x9B907406, 0x9BA07407, 0x9BB07408, 0x9BC07409, 0x9BD0740A, 0x9BE0740B, 0x9BF07443, - 0x9C007444, 0x9C107445, 0x9C207446, 0x9C307447, 0x9C407448, 0x9C507449, 0x9C60744A, 0x9C70744B, - 0x9C807483, 0x9C907484, 0x9CA07485, 0x9CB07486, 0x9CC07487, 0x9CD07488, 0x9CE07489, 0x9CF0748A, - 0x9D00748B, 0x9D1074C3, 0x9D2074C4, 0x9D3074C5, 0x9D4074C6, 0x9D5074C7, 0x9D6074C8, 0x9D7074C9, - 0x9D8074CA, 0x9D9073CB, 0x9DA87401, 0x9DB87402, 0x9DC87403, 0x9DD87404, 0x9DE87405, 0x9DF87406, - 0x9E087407, 0x9E187108, 0x9E286C09, 0x9E38680A, 0x9E487441, 0x9E587442, 0x9E687443, 0x9E787444, - 0x9E887445, 0x9E987146, 0x9EA86E47, 0x9EB86A48, 0x9EC86749, 0x9ED8644A, 0x9EE87481, 0x9EF87482, - 0x9F087483, 0x9F187484, 0x9F287485, 0x9F387186, 0x9F486E87, 0x9F586A88, 0x9F686789, 0x9F78648A, - 0x9F8874C1, 0x9F9874C2, 0x9FA873C3, 0x9FB871C4, 0x9FC86EC5, 0x9FD86BC6, 0x9FE86AC7, 0x9FF867C8, - 0xA00864C9, 0xA0187411, 0xA0287412, 0xA0387413, 0xA0487414, 0xA0587415, 0xA0687416, 0xA0787417, - 0xA0887118, 0xA0986C19, 0xA0A8681A, 0xA0B87451, 0xA0C87452, 0xA0D87453, 0xA0E87454, 0xA0F87455, - 0xA1087156, 0xA1186E57, 0xA1286A58, 0xA1386759, 0xA148645A, 0xA1587491, 0xA1687492, 0xA1787493, - 0xA1887494, 0xA1987495, 0xA1A87196, 0xA1B86E97, 0xA1C86A98, 0xA1D86799, 0xA1E8649A, 0xA1F874D1, - 0xA20874D2, 0xA21873D3, 0xA22871D4, 0xA2386ED5, 0xA2486BD6, 0xA2586AD7, 0xA26867D8, 0xA27864D9, - 0xA2887421, 0xA2987422, 0xA2A87423, 0xA2B87424, 0xA2C87425, 0xA2D87426, 0xA2E87427, 0xA2F87128, - 0xA3086C29, 0xA318682A, 0xA3287461, 0xA3387462, 0xA3487463, 0xA3587464, 0xA3687465, 0xA3787166, - 0xA3886E67, 0xA3986A68, 0xA3A86769, 0xA3B8646A, 0xA3C874A1, 0xA3D874A2, 0xA3E874A3, 0xA3F874A4, - 0xA40874A5, 0xA41871A6, 0xA4286EA7, 0xA4386AA8, 0xA44867A9, 0xA45864AA, 0xA46874E1, 0xA47874E2, - 0xA48873E3, 0xA49871E4, 0xA4A86EE5, 0xA4B86BE6, 0xA4C86AE7, 0xA4D867E8, 0xA4E864E9, 0xA4F874B1, - 0xA50874B2, 0xA51874B3, 0xA52874B4, 0xA53874B5, 0xA54871B6, 0xA5586EB7, 0xA5686AB8, 0xA57867B9, - 0xA58864BA, 0xA59874F1, 0xA5A874F2, 0xA5B873F3, 0xA5C871F4, 0xA5D86EF5, 0xA5E86BF6, 0xA5F86AF7, - 0xA60867F8, 0xA61864F9, 0xA6221405, 0xA6321406, 0xA6421407, 0xA6521408, 0xA6621409, 0xA672140A, - 0xA682140B, 0xA6921445, 0xA6A21446, 0xA6B21447, 0xA6C21448, 0xA6D21449, 0xA6E2144A, 0xA6F2144B, - 0xA7021485, 0xA7121486, 0xA7221487, 0xA7321488, 0xA7421489, 0xA752148A, 0xA762148B, 0xA77214C5, - 0xA78214C6, 0xA79214C7, 0xA7A214C8, 0xA7B214C9, 0xA7C214CA, 0xA7D214CB, 0xA7EA1401, 0xA7FA1402, - 0xA80A1403, 0xA81A1404, 0xA82A1405, 0xA83A1406, 0xA84A1407, 0xA85A1408, 0xA86A1409, 0xA87A140A, - 0xA88A110B, 0xA89A1441, 0xA8AA1442, 0xA8BA1443, 0xA8CA1444, 0xA8DA1445, 0xA8EA1446, 0xA8FA1447, - 0xA90A1248, 0xA91A0F49, 0xA92A0D4A, 0xA93A0A4B, 0xA94A1481, 0xA95A1482, 0xA96A1483, 0xA97A1484, - 0xA98A1485, 0xA99A1486, 0xA9AA1487, 0xA9BA1288, 0xA9CA0F89, 0xA9DA0D8A, 0xA9EA0A8B, 0xA9FA14C1, - 0xAA0A14C2, 0xAA1A14C3, 0xAA2A14C4, 0xAA3A13C5, 0xAA4A10C6, 0xAA5A0FC7, 0xAA6A0DC8, 0xAA7A0AC9, - 0xAA8A09CA, 0xAA9A07CB, 0xAAAA1411, 0xAABA1412, 0xAACA1413, 0xAADA1414, 0xAAEA1415, 0xAAFA1416, - 0xAB0A1417, 0xAB1A1418, 0xAB2A1419, 0xAB3A141A, 0xAB4A111B, 0xAB5A1451, 0xAB6A1452, 0xAB7A1453, - 0xAB8A1454, 0xAB9A1455, 0xABAA1456, 0xABBA1457, 0xABCA1258, 0xABDA0F59, 0xABEA0D5A, 0xABFA0A5B, - 0xAC0A1491, 0xAC1A1492, 0xAC2A1493, 0xAC3A1494, 0xAC4A1495, 0xAC5A1496, 0xAC6A1497, 0xAC7A1298, - 0xAC8A0F99, 0xAC9A0D9A, 0xACAA0A9B, 0xACBA14D1, 0xACCA14D2, 0xACDA14D3, 0xACEA14D4, 0xACFA13D5, - 0xAD0A10D6, 0xAD1A0FD7, 0xAD2A0DD8, 0xAD3A0AD9, 0xAD4A09DA, 0xAD5A07DB, 0xAD6A1421, 0xAD7A1422, - 0xAD8A1423, 0xAD9A1424, 0xADAA1425, 0xADBA1426, 0xADCA1427, 0xADDA1428, 0xADEA1429, 0xADFA142A, - 0xAE0A112B, 0xAE1A1461, 0xAE2A1462, 0xAE3A1463, 0xAE4A1464, 0xAE5A1465, 0xAE6A1466, 0xAE7A1467, - 0xAE8A1268, 0xAE9A0F69, 0xAEAA0D6A, 0xAEBA0A6B, 0xAECA14A1, 0xAEDA14A2, 0xAEEA14A3, 0xAEFA14A4, - 0xAF0A14A5, 0xAF1A14A6, 0xAF2A14A7, 0xAF3A12A8, 0xAF4A0FA9, 0xAF5A0DAA, 0xAF6A0AAB, 0xAF7A14E1, - 0xAF8A14E2, 0xAF9A14E3, 0xAFAA14E4, 0xAFBA13E5, 0xAFCA10E6, 0xAFDA0FE7, 0xAFEA0DE8, 0xAFFA0AE9, - 0xB00A09EA, 0xB01A07EB, 0xB02A14B1, 0xB03A14B2, 0xB04A14B3, 0xB05A14B4, 0xB06A14B5, 0xB07A14B6, - 0xB08A14B7, 0xB09A12B8, 0xB0AA0FB9, 0xB0BA0DBA, 0xB0CA0ABB, 0xB0DA14F1, 0xB0EA14F2, 0xB0FA14F3, - 0xB10A14F4, 0xB11A13F5, 0xB12A10F6, 0xB13A0FF7, 0xB14A0DF8, 0xB15A0AF9, 0xB16A09FA, 0xB17A07FB, - 0xB1805405, 0xB1905406, 0xB1A05407, 0xB1B05408, 0xB1C05409, 0xB1D0540A, 0xB1E0540B, 0xB1F05445, - 0xB2005446, 0xB2105447, 0xB2205448, 0xB2305449, 0xB240544A, 0xB250544B, 0xB2605485, 0xB2705486, - 0xB2805487, 0xB2905488, 0xB2A05489, 0xB2B0548A, 0xB2C0548B, 0xB2D054C5, 0xB2E054C6, 0xB2F054C7, - 0xB30054C8, 0xB31054C9, 0xB32054CA, 0xB33054CB, 0xB3485401, 0xB3585402, 0xB3685403, 0xB3785404, - 0xB3885405, 0xB3985406, 0xB3A85407, 0xB3B85408, 0xB3C85409, 0xB3D8540A, 0xB3E8510B, 0xB3F85441, - 0xB4085442, 0xB4185443, 0xB4285444, 0xB4385445, 0xB4485446, 0xB4585447, 0xB4685248, 0xB4784F49, - 0xB4884D4A, 0xB4984A4B, 0xB4A85481, 0xB4B85482, 0xB4C85483, 0xB4D85484, 0xB4E85485, 0xB4F85486, - 0xB5085487, 0xB5185288, 0xB5284F89, 0xB5384D8A, 0xB5484A8B, 0xB55854C1, 0xB56854C2, 0xB57854C3, - 0xB58854C4, 0xB59853C5, 0xB5A850C6, 0xB5B84FC7, 0xB5C84DC8, 0xB5D84AC9, 0xB5E849CA, 0xB5F847CB, - 0xB6085411, 0xB6185412, 0xB6285413, 0xB6385414, 0xB6485415, 0xB6585416, 0xB6685417, 0xB6785418, - 0xB6885419, 0xB698541A, 0xB6A8511B, 0xB6B85451, 0xB6C85452, 0xB6D85453, 0xB6E85454, 0xB6F85455, - 0xB7085456, 0xB7185457, 0xB7285258, 0xB7384F59, 0xB7484D5A, 0xB7584A5B, 0xB7685491, 0xB7785492, - 0xB7885493, 0xB7985494, 0xB7A85495, 0xB7B85496, 0xB7C85497, 0xB7D85298, 0xB7E84F99, 0xB7F84D9A, - 0xB8084A9B, 0xB81854D1, 0xB82854D2, 0xB83854D3, 0xB84854D4, 0xB85853D5, 0xB86850D6, 0xB8784FD7, - 0xB8884DD8, 0xB8984AD9, 0xB8A849DA, 0xB8B847DB, 0xB8C85421, 0xB8D85422, 0xB8E85423, 0xB8F85424, - 0xB9085425, 0xB9185426, 0xB9285427, 0xB9385428, 0xB9485429, 0xB958542A, 0xB968512B, 0xB9785461, - 0xB9885462, 0xB9985463, 0xB9A85464, 0xB9B85465, 0xB9C85466, 0xB9D85467, 0xB9E85268, 0xB9F84F69, - 0xBA084D6A, 0xBA184A6B, 0xBA2854A1, 0xBA3854A2, 0xBA4854A3, 0xBA5854A4, 0xBA6854A5, 0xBA7854A6, - 0xBA8854A7, 0xBA9852A8, 0xBAA84FA9, 0xBAB84DAA, 0xBAC84AAB, 0xBAD854E1, 0xBAE854E2, 0xBAF854E3, - 0xBB0854E4, 0xBB1853E5, 0xBB2850E6, 0xBB384FE7, 0xBB484DE8, 0xBB584AE9, 0xBB6849EA, 0xBB7847EB, - 0xBB8854B1, 0xBB9854B2, 0xBBA854B3, 0xBBB854B4, 0xBBC854B5, 0xBBD854B6, 0xBBE854B7, 0xBBF852B8, - 0xBC084FB9, 0xBC184DBA, 0xBC284ABB, 0xBC3854F1, 0xBC4854F2, 0xBC5854F3, 0xBC6854F4, 0xBC7853F5, - 0xBC8850F6, 0xBC984FF7, 0xBCA84DF8, 0xBCB84AF9, 0xBCC849FA, 0xBCD847FB, 0xBCE11408, 0xBCF11409, - 0xBD01140A, 0xBD11140B, 0xBD211448, 0xBD311449, 0xBD41144A, 0xBD51144B, 0xBD611488, 0xBD711489, - 0xBD81148A, 0xBD91148B, 0xBDA114C8, 0xBDB114C9, 0xBDC114CA, 0xBDD114CB, 0xBDE91402, 0xBDF91403, - 0xBE091404, 0xBE191405, 0xBE291406, 0xBE391407, 0xBE491408, 0xBE591409, 0xBE69140A, 0xBE79140B, - 0xBE891442, 0xBE991443, 0xBEA91444, 0xBEB91445, 0xBEC91446, 0xBED91447, 0xBEE91448, 0xBEF91449, - 0xBF09144A, 0xBF19144B, 0xBF291482, 0xBF391483, 0xBF491484, 0xBF591485, 0xBF691486, 0xBF791487, - 0xBF891488, 0xBF991489, 0xBFA9148A, 0xBFB9148B, 0xBFC914C2, 0xBFD914C3, 0xBFE914C4, 0xBFF914C5, - 0xC00914C6, 0xC01914C7, 0xC02913C8, 0xC03911C9, 0xC04910CA, 0xC0590ECB, 0xC0691412, 0xC0791413, - 0xC0891414, 0xC0991415, 0xC0A91416, 0xC0B91417, 0xC0C91418, 0xC0D91419, 0xC0E9141A, 0xC0F9141B, - 0xC1091452, 0xC1191453, 0xC1291454, 0xC1391455, 0xC1491456, 0xC1591457, 0xC1691458, 0xC1791459, - 0xC189145A, 0xC199145B, 0xC1A91492, 0xC1B91493, 0xC1C91494, 0xC1D91495, 0xC1E91496, 0xC1F91497, - 0xC2091498, 0xC2191499, 0xC229149A, 0xC239149B, 0xC24914D2, 0xC25914D3, 0xC26914D4, 0xC27914D5, - 0xC28914D6, 0xC29914D7, 0xC2A913D8, 0xC2B911D9, 0xC2C910DA, 0xC2D90EDB, 0xC2E91422, 0xC2F91423, - 0xC3091424, 0xC3191425, 0xC3291426, 0xC3391427, 0xC3491428, 0xC3591429, 0xC369142A, 0xC379142B, - 0xC3891462, 0xC3991463, 0xC3A91464, 0xC3B91465, 0xC3C91466, 0xC3D91467, 0xC3E91468, 0xC3F91469, - 0xC409146A, 0xC419146B, 0xC42914A2, 0xC43914A3, 0xC44914A4, 0xC45914A5, 0xC46914A6, 0xC47914A7, - 0xC48914A8, 0xC49914A9, 0xC4A914AA, 0xC4B914AB, 0xC4C914E2, 0xC4D914E3, 0xC4E914E4, 0xC4F914E5, - 0xC50914E6, 0xC51914E7, 0xC52913E8, 0xC53911E9, 0xC54910EA, 0xC5590EEB, 0xC56914B2, 0xC57914B3, - 0xC58914B4, 0xC59914B5, 0xC5A914B6, 0xC5B914B7, 0xC5C914B8, 0xC5D914B9, 0xC5E914BA, 0xC5F914BB, - 0xC60914F2, 0xC61914F3, 0xC62914F4, 0xC63914F5, 0xC64914F6, 0xC65914F7, 0xC66913F8, 0xC67911F9, - 0xC68910FA, 0xC6990EFB, 0xC6A03408, 0xC6B03409, 0xC6C0340A, 0xC6D0340B, 0xC6E03448, 0xC6F03449, - 0xC700344A, 0xC710344B, 0xC7203488, 0xC7303489, 0xC740348A, 0xC750348B, 0xC76034C8, 0xC77034C9, - 0xC78034CA, 0xC79034CB, 0xC7A83402, 0xC7B83403, 0xC7C83404, 0xC7D83405, 0xC7E83406, 0xC7F83407, - 0xC8083408, 0xC8183409, 0xC828340A, 0xC838340B, 0xC8483442, 0xC8583443, 0xC8683444, 0xC8783445, - 0xC8883446, 0xC8983447, 0xC8A83448, 0xC8B83449, 0xC8C8344A, 0xC8D8344B, 0xC8E83482, 0xC8F83483, - 0xC9083484, 0xC9183485, 0xC9283486, 0xC9383487, 0xC9483488, 0xC9583489, 0xC968348A, 0xC978348B, - 0xC98834C2, 0xC99834C3, 0xC9A834C4, 0xC9B834C5, 0xC9C834C6, 0xC9D834C7, 0xC9E833C8, 0xC9F831C9, - 0xCA0830CA, 0xCA182ECB, 0xCA283412, 0xCA383413, 0xCA483414, 0xCA583415, 0xCA683416, 0xCA783417, - 0xCA883418, 0xCA983419, 0xCAA8341A, 0xCAB8341B, 0xCAC83452, 0xCAD83453, 0xCAE83454, 0xCAF83455, - 0xCB083456, 0xCB183457, 0xCB283458, 0xCB383459, 0xCB48345A, 0xCB58345B, 0xCB683492, 0xCB783493, - 0xCB883494, 0xCB983495, 0xCBA83496, 0xCBB83497, 0xCBC83498, 0xCBD83499, 0xCBE8349A, 0xCBF8349B, - 0xCC0834D2, 0xCC1834D3, 0xCC2834D4, 0xCC3834D5, 0xCC4834D6, 0xCC5834D7, 0xCC6833D8, 0xCC7831D9, - 0xCC8830DA, 0xCC982EDB, 0xCCA83422, 0xCCB83423, 0xCCC83424, 0xCCD83425, 0xCCE83426, 0xCCF83427, - 0xCD083428, 0xCD183429, 0xCD28342A, 0xCD38342B, 0xCD483462, 0xCD583463, 0xCD683464, 0xCD783465, - 0xCD883466, 0xCD983467, 0xCDA83468, 0xCDB83469, 0xCDC8346A, 0xCDD8346B, 0xCDE834A2, 0xCDF834A3, - 0xCE0834A4, 0xCE1834A5, 0xCE2834A6, 0xCE3834A7, 0xCE4834A8, 0xCE5834A9, 0xCE6834AA, 0xCE7834AB, - 0xCE8834E2, 0xCE9834E3, 0xCEA834E4, 0xCEB834E5, 0xCEC834E6, 0xCED834E7, 0xCEE833E8, 0xCEF831E9, - 0xCF0830EA, 0xCF182EEB, 0xCF2834B2, 0xCF3834B3, 0xCF4834B4, 0xCF5834B5, 0xCF6834B6, 0xCF7834B7, - 0xCF8834B8, 0xCF9834B9, 0xCFA834BA, 0xCFB834BB, 0xCFC834F2, 0xCFD834F3, 0xCFE834F4, 0xCFF834F5, - 0xD00834F6, 0xD01834F7, 0xD02833F8, 0xD03831F9, 0xD04830FA, 0xD0582EFB, -}; - -uniform int get_bits(uniform uint32_t value, uniform int from, uniform int to) -{ - return (value >> from) & ((1 << (to + 1 - from)) - 1); -} - -void load_mode_parameters(uniform astc_mode* uniform mode, uniform uint32_t packed_mode) -{ - mode->width = 2 + get_bits(packed_mode, 13, 15); // 2..8 <= 2^3 - mode->height = 2 + get_bits(packed_mode, 16, 18); // 2..8 <= 2^3 - mode->dual_plane = get_bits(packed_mode, 19, 19); // 0 or 1 - mode->partitions = 1; - - mode->weight_range = get_bits(packed_mode, 0, 3); // 0..11 <= 2^4 - mode->color_component_selector = get_bits(packed_mode, 4, 5); // 0..2 <= 2^2 - mode->partition_id = 0; - mode->color_endpoint_modes[0] = get_bits(packed_mode, 6, 7) * 2 + 6; // 6 or 8 - mode->color_endpoint_pairs = 1 + (mode->color_endpoint_modes[0] / 4); - mode->endpoint_range = get_bits(packed_mode, 8, 12); // 0..20 <= 2^5 -} - -export void astc_rank_ispc(uniform rgba_surface src[], uniform int xx, uniform int yy, uniform uint32_t mode_buffer[], uniform astc_enc_settings settings[]) -{ - int tex_width = src->width / settings->block_width; - if (xx + programIndex >= tex_width) return; - - astc_rank_state _state; - varying astc_rank_state* uniform state = &_state; - - state->block_width = settings->block_width; - state->block_height = settings->block_height; - state->fastSkipTreshold = settings->fastSkipTreshold; - - assert(state->fastSkipTreshold <= 64); - - load_block_interleaved(state->pixels, src, xx + programIndex, yy, state->block_width, state->block_height); - if (settings->channels == 3) clear_alpha(state->pixels, state->block_width, state->block_height); - - compute_metrics(state); - - float threshold_error = 0; - int count = -1; - - for (uniform int id = 0; id < packed_modes_count; id++) - { - uniform uint32_t packed_mode = packed_modes[id]; - - uniform astc_mode _mode; - uniform astc_mode* uniform mode = &_mode; - load_mode_parameters(mode, packed_mode); - - if (mode->height > state->block_height) continue; - if (mode->width > state->block_width) continue; - - if (settings->channels == 3 && mode->color_endpoint_modes[0] > 8) continue; - - float error = estimate_error(state, mode); - count += 1; - - if (count < state->fastSkipTreshold) - { - state->best_modes[count] = packed_mode; - state->best_scores[count] = error; - - threshold_error = max(threshold_error, error); - } - else if (error < threshold_error) - { - insert_element(state, error, packed_mode, &threshold_error); - } - } - - assert(count >= 0); - - for (uniform int i = 0; i < state->fastSkipTreshold; i++) - { - mode_buffer[programCount * i + programIndex] = state->best_modes[i]; - } -} - -/////////////////////////////////////////////////////////// -// ASTC candidate encoding - -struct astc_block -{ - uniform int width; - uniform int height; - uniform bool dual_plane; - int weight_range; - uint8_t weights[64]; - int color_component_selector; - - uniform int partitions; - int partition_id; - uniform int color_endpoint_pairs; - uniform int channels; - int color_endpoint_modes[4]; - int endpoint_range; - uint8_t endpoints[18]; -}; - -struct astc_enc_state -{ - float pixels[256]; - float scaled_pixels[256]; - uint32_t data[4]; - - // settings - uniform int block_width; - uniform int block_height; - uniform int pitch; - - uniform int refineIterations; -}; - -struct astc_enc_context -{ - // uniform parameters - int width; - int height; - int channels; - bool dual_plane; - int partitions; - int color_endpoint_pairs; -}; - -uniform static const float filter_data[309] = -{ - 0.688356,-0.188356, 0.414384, 0.085616, 0.085616, 0.414384,-0.188356, 0.688356, - 0.955516,-0.227273, 0.044484, 0.142349, 0.727273,-0.142349,-0.142349, 0.727273, - 0.142349, 0.044484,-0.227273, 0.955516, 0.600000,-0.200000, 0.400000, 0.000000, - 0.200000, 0.200000, 0.000000, 0.400000,-0.200000, 0.600000, 0.828571,-0.142857, - 0.028571, 0.342857, 0.285714,-0.057143,-0.142857, 0.714286,-0.142857,-0.057143, - 0.285714, 0.342857, 0.028571,-0.142857, 0.828571, 0.985714,-0.252381, 0.080952, - -0.014286, 0.057143, 1.009524,-0.323810, 0.057143,-0.085714, 0.485714, 0.485714, - -0.085714, 0.057143,-0.323810, 1.009524, 0.057143,-0.014286, 0.080952,-0.252381, - 0.985714, 0.510753,-0.177419, 0.381720,-0.048387, 0.252688, 0.080645, 0.080645, - 0.252688,-0.048387, 0.381720,-0.177419, 0.510753, 0.754228,-0.194882, 0.052858, - 0.398312, 0.147638,-0.040044,-0.016924, 0.547244,-0.148431,-0.148431, 0.547244, - -0.016924,-0.040044, 0.147638, 0.398312, 0.052858,-0.194882, 0.754228, 0.921235, - -0.216677, 0.063615,-0.013072, 0.210040, 0.577804,-0.169641, 0.034858,-0.164122, - 0.798726,-0.053828, 0.011061, 0.011061,-0.053828, 0.798726,-0.164122, 0.034858, - -0.169641, 0.577804, 0.210040,-0.013072, 0.063615,-0.216677, 0.921235, 0.996932, - -0.209923, 0.069231,-0.020846, 0.003068, 0.016362, 1.119589,-0.369231, 0.111180, - -0.016362,-0.035452, 0.240891, 0.800000,-0.240891, 0.035452, 0.035452,-0.240891, - 0.800000, 0.240891,-0.035452,-0.016362, 0.111180,-0.369231, 1.119589, 0.016362, - 0.003068,-0.020846, 0.069231,-0.209923, 0.996932, 0.415909,-0.165909, 0.343182, - -0.093182, 0.234091, 0.015909, 0.161364, 0.088636, 0.088636, 0.161364, 0.015909, - 0.234091,-0.093182, 0.343182,-0.165909, 0.415909, 0.653807,-0.172170, 0.058458, - 0.395689, 0.040094,-0.013613, 0.189195, 0.209906,-0.071270,-0.068923, 0.422170, - -0.143341,-0.143341, 0.422170,-0.068923,-0.071270, 0.209906, 0.189195,-0.013613, - 0.040094, 0.395689, 0.058458,-0.172170, 0.653807, 0.805363,-0.204713, 0.061406, - -0.016387, 0.363455, 0.220460,-0.066129, 0.017647,-0.078453, 0.645632,-0.193664, - 0.051682,-0.121551, 0.455481, 0.081527,-0.021756,-0.021756, 0.081527, 0.455481, - -0.121551, 0.051682,-0.193664, 0.645632,-0.078453, 0.017647,-0.066129, 0.220460, - 0.363455,-0.016387, 0.061406,-0.204713, 0.805363, 0.881593,-0.204539, 0.075065, - -0.021559, 0.004453, 0.270644, 0.467517,-0.171576, 0.049278,-0.010179,-0.169588, - 0.821023,-0.159819, 0.045902,-0.009481,-0.012311, 0.059603, 0.756331,-0.217226, - 0.044870, 0.044870,-0.217226, 0.756331, 0.059603,-0.012311,-0.009481, 0.045902, - -0.159819, 0.821023,-0.169588,-0.010179, 0.049278,-0.171576, 0.467517, 0.270644, - 0.004453,-0.021559, 0.075065,-0.204539, 0.881593, 0.967275,-0.287351, 0.076902, - -0.018670, 0.005432,-0.000959, 0.104719, 0.919524,-0.246087, 0.059743,-0.017382, - 0.003067,-0.127990, 0.653915, 0.300773,-0.073019, 0.021245,-0.003749, 0.064956, - -0.331864, 1.007366,-0.105833, 0.030792,-0.005434,-0.006723, 0.034349,-0.104266, - 0.996397,-0.289905, 0.051160,-0.005112, 0.026120,-0.079287, 0.323158, 0.571013, - -0.100767, 0.003834,-0.019590, 0.059465,-0.242368, 0.905074, 0.075575,-0.000959, - 0.004898,-0.014866, 0.060592,-0.226268, 0.981106, -}; - -uniform static const int filterbank[5][5] = -{ - { 0, 8, -1, -1, -1 }, - { 20, 30, 45, -1, -1 }, - { 65, 77, 95, 119, -1 }, - { -1, -1, -1, -1, -1 }, - { 149, 165, 189, 221, 261 }, -}; - -void scale_pixels(astc_enc_state state[], uniform astc_enc_context ctx[]) -{ - uniform int channels = ctx->channels; - uniform const float* uniform yfilter = &filter_data[filterbank[state->block_height - 4][ctx->height - 2]]; - uniform const float* uniform xfilter = &filter_data[filterbank[state->block_width - 4][ctx->width - 2]]; - - for (uniform int y = 0; y < ctx->height; y++) - { - float line[8][4]; - - if (state->block_height == ctx->height) - { - for (uniform int x = 0; x < state->block_width; x++) - for (uniform int p = 0; p < channels; p++) - line[x][p] = get_pixel(state->pixels, p, x, y); - } - else - for (uniform int x = 0; x < state->block_width; x++) - { - uniform int n = ctx->height; - - for (uniform int p = 0; p < channels; p++) line[x][p] = 0; - - for (uniform int k = 0; k < state->block_height; k++) - for (uniform int p = 0; p < channels; p++) - line[x][p] += yfilter[k * n + y] * get_pixel(state->pixels, p, x, k); - } - - if (state->block_width == ctx->width) - { - for (uniform int x = 0; x < ctx->width; x++) - for (uniform int p = 0; p < channels; p++) - set_pixel(state->scaled_pixels, p, x, y, clamp(line[x][p], 0, 255)); - } - else - for (uniform int x = 0; x < ctx->width; x++) - { - uniform int n = ctx->width; - - float value[4] = { 0, 0, 0, 0 }; - - for (uniform int k = 0; k < state->block_width; k++) - for (uniform int p = 0; p < channels; p++) - value[p] += xfilter[k * n + x] * line[k][p]; - - for (uniform int p = 0; p < channels; p++) - set_pixel(state->scaled_pixels, p, x, y, clamp(value[p], 0, 255)); - } - } -} - -inline int clamp_unorm8(int value) -{ - if (value < 0) return 0; - if (value > 255) return 255; - return value; -} - -inline void apply_blue_contract(int& r, int& g, int& b) -{ - r = (r + b) >> 1; - g = (g + b) >> 1; -} - -void decode_endpoints(float endpoints[8], uint8_t coded_endpoints[], int mode) -{ - if ((mode % 4) == 2) - { - int v0 = coded_endpoints[0]; - int v1 = coded_endpoints[1]; - int v2 = coded_endpoints[2]; - int v3 = coded_endpoints[3]; - int v4 = coded_endpoints[4]; - int v5 = coded_endpoints[5]; - - endpoints[0] = (v0 * v3) >> 8; - endpoints[1] = (v1 * v3) >> 8; - endpoints[2] = (v2 * v3) >> 8; - endpoints[3] = 0xFF; - - endpoints[4] = v0; - endpoints[5] = v1; - endpoints[6] = v2; - endpoints[7] = 0xFF; - - if (mode > 8) - { - endpoints[3] = clamp_unorm8(v4); - endpoints[7] = clamp_unorm8(v5); - } - } - - if ((mode % 4) == 0) - { - int v0 = coded_endpoints[0]; - int v1 = coded_endpoints[1]; - int v2 = coded_endpoints[2]; - int v3 = coded_endpoints[3]; - int v4 = coded_endpoints[4]; - int v5 = coded_endpoints[5]; - int v6 = coded_endpoints[6]; - int v7 = coded_endpoints[7]; - - bool swap_endpoints = v1 + v3 + v5 < v0 + v2 + v4; - - if (swap_endpoints) - { - swap(v0, v1); - swap(v2, v3); - swap(v4, v5); - swap(v6, v7); - - apply_blue_contract(v0, v2, v4); - apply_blue_contract(v1, v3, v5); - } - - endpoints[0] = clamp_unorm8(v0); - endpoints[1] = clamp_unorm8(v2); - endpoints[2] = clamp_unorm8(v4); - endpoints[3] = 0xFF; - - endpoints[4] = clamp_unorm8(v1); - endpoints[5] = clamp_unorm8(v3); - endpoints[6] = clamp_unorm8(v5); - endpoints[7] = 0xFF; - - if (mode > 8) - { - endpoints[3] = clamp_unorm8(v6); - endpoints[7] = clamp_unorm8(v7); - } - } -} - -void dequant_decode_endpoints(float endpoints[8], uint8_t block_endpoints[], int mode, int range) -{ - int levels = get_levels(range); - int num_cem_pairs = 1 + mode / 4; - - uint8_t dequant_endpoints[8]; - for (uniform int k = 0; k < 2 * num_cem_pairs; k++) - { - dequant_endpoints[k] = (int)(((int)block_endpoints[k]) * 255.0f / (levels - 1) + 0.5); - } - - decode_endpoints(endpoints, dequant_endpoints, mode); -} - -bool compare_endpoints(uint8_t endpoints[8], astc_block block[]) -{ - int sum = 0; - for (uniform int p = 0; p < 3; p++) - { - sum += endpoints[p * 2 + 0]; - sum -= endpoints[p * 2 + 1]; - } - - if (-2 <= sum && sum <= 2) - { - // avoid being too close so we don't need proper rounding - for (uniform int p = 0; p < 3; p++) - { - if (sum<=0) - endpoints[p * 2 + 0] = clamp(endpoints[p * 2 + 0] - 1, 0, get_levels(block->endpoint_range) - 1); - if (sum>0) - endpoints[p * 2 + 1] = clamp(endpoints[p * 2 + 1] - 1, 0, get_levels(block->endpoint_range) - 1); - } - - sum = 0; - for (uniform int p = 0; p < 3; p++) - { - sum += endpoints[p * 2 + 0]; - sum -= endpoints[p * 2 + 1]; - } - } - - return sum > 0; -} - -void reorder_endpoints(uint8_t endpoints[8], astc_block block[], bool blue_contract) -{ - if (compare_endpoints(endpoints, block) == !blue_contract) - for (uniform int p = 0; p < 4; p++) swap(endpoints[p * 2], endpoints[p * 2 + 1]); -} - -inline int quant_endpoint(float value, int levels) -{ - return clamp(value / 255.0f * (levels - 1) + 0.5, 0, levels - 1); -} - -void quantize_endpoints_scale(astc_block block[], float endpoints[4]) -{ - int ep_levels = get_levels(block->endpoint_range); - - float near[3]; - float far[3]; - for (uniform int p = 0; p < 3; p++) - { - near[p] = endpoints[p * 2 + 0]; - far[p] = endpoints[p * 2 + 1]; - } - - for (uniform int p = 0; p < 3; p++) - block->endpoints[p] = quant_endpoint(far[p], ep_levels); - - float sq_norm = dot3(far, far) + 0.00001; - float scale = dot3(far, near) / sq_norm; - - block->endpoints[3] = quant_endpoint(scale * 256, ep_levels); - - if (block->color_endpoint_modes[0] > 8) - { - block->endpoints[4] = quant_endpoint(endpoints[3 * 2 + 0], ep_levels); - block->endpoints[5] = quant_endpoint(endpoints[3 * 2 + 1], ep_levels); - } -} - -void quantize_endpoints_pair(astc_block block[], float endpoints[6]) -{ - int ep_levels = get_levels(block->endpoint_range); - - bool blue_contract = true; - - float blue_compressed[6]; - for (uniform int i = 0; i < 2; i++) - { - blue_compressed[i + 0] = endpoints[i + 0] * 2 - endpoints[i + 4]; - blue_compressed[i + 2] = endpoints[i + 2] * 2 - endpoints[i + 4]; - blue_compressed[i + 4] = endpoints[i + 4]; - - if (blue_compressed[i + 0] < 0) blue_contract = false; - if (blue_compressed[i + 0] > 255) blue_contract = false; - if (blue_compressed[i + 2] < 0) blue_contract = false; - if (blue_compressed[i + 2] > 255) blue_contract = false; - } - - if (blue_contract) - { - for (uniform int p = 0; p < 3; p++) - { - block->endpoints[p * 2 + 0] = quant_endpoint(blue_compressed[p * 2 + 0], ep_levels); - block->endpoints[p * 2 + 1] = quant_endpoint(blue_compressed[p * 2 + 1], ep_levels); - } - } - else - { - for (uniform int p = 0; p < 3; p++) - { - block->endpoints[p * 2 + 0] = quant_endpoint(endpoints[p * 2 + 0], ep_levels); - block->endpoints[p * 2 + 1] = quant_endpoint(endpoints[p * 2 + 1], ep_levels); - } - } - - if (block->color_endpoint_modes[0] > 8) - { - block->endpoints[6] = quant_endpoint(endpoints[3 * 2 + 0], ep_levels); - block->endpoints[7] = quant_endpoint(endpoints[3 * 2 + 1], ep_levels); - } - - reorder_endpoints(block->endpoints, block, blue_contract); -} - -void quantize_endpoints(astc_block block[], float endpoints[]) -{ - bool zero_based = (block->color_endpoint_modes[0] % 4) == 2; - - if (zero_based) - { - quantize_endpoints_scale(block, endpoints); - } - else - { - quantize_endpoints_pair(block, endpoints); - } -} - -void opt_weights(float scaled_pixels[], astc_block block[]) -{ - uniform int channels = 4; - if (block->dual_plane) channels = 3; - - float rec_endpoints[8]; - dequant_decode_endpoints(rec_endpoints, block->endpoints, block->color_endpoint_modes[0], block->endpoint_range); - - int w_levels = get_levels(block->weight_range); - - float dir[4]; dir[3] = 0; - for (uniform int p = 0; p < channels; p++) dir[p] = rec_endpoints[4 + p] - rec_endpoints[0 + p]; - float sq_norm = dot4(dir, dir) + 0.00001; - for (uniform int p = 0; p < channels; p++) dir[p] *= (w_levels - 1) / sq_norm; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float pixel[4]; pixel[3] = 0; - for (uniform int p = 0; p < channels; p++) pixel[p] = get_pixel(scaled_pixels, p, x, y) - rec_endpoints[0 + p]; - - int q = clamp(dot4(pixel, dir) + 0.5, 0, w_levels - 1); - - block->weights[y * block->width + x] = q; - } -} - -void sgesv2(float A[4], float x[2], float b[2]) -{ - float inv_det = 1.0f / (A[0] * A[3] - A[1] * A[2]); - x[0] = (b[0] * +A[3] + b[1] * -A[2])*inv_det; - x[1] = (b[0] * -A[1] + b[1] * +A[0])*inv_det; -} - -void ls_refine_scale(float endpoints[4], float scaled_pixels[], astc_block block[]) -{ - int levels = get_levels(block->weight_range); - float levels_rcp = 1.0f / (levels - 1); - - float sum_w = 0; - float sum_ww = 0; - float sum_d = 0; - float sum_wd = 0; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float w = (int)block->weights[y * block->width + x] * levels_rcp; - float d = 0; - - for (uniform int p = 0; p < 3; p++) d += sq(get_pixel(scaled_pixels, p, x, y)); - d = sqrt(d+0.01f); - - sum_w += w; - sum_ww += w*w; - sum_d += d; - sum_wd += w*d; - } - - float sum_1 = 1.0f * block->height * block->width; - - float C[4] = { sum_1, sum_w, sum_w, sum_ww }; - float b[2] = { sum_d, sum_wd }; - float xx[2]; - - sgesv2(C, xx, b); - - float scale = xx[0] / (xx[1] + xx[0]); - - if (xx[1] + xx[0] < 1) scale = 1; - if (scale > 0.9999) scale = 0.9999; - if (scale < 0) scale = 0; - - float sum_zz = 0; - float sum_zp[3] = { 0, 0, 0 }; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float w = (int)block->weights[y * block->width + x] * levels_rcp; - float z = scale + (1 - scale)*w; - - sum_zz += z * z; - for (uniform int p = 0; p < 3; p++) sum_zp[p] += z * get_pixel(scaled_pixels, p, x, y); - } - - for (uniform int p = 0; p < 3; p++) endpoints[2 * p + 0] = scale * sum_zp[p] / sum_zz; - for (uniform int p = 0; p < 3; p++) endpoints[2 * p + 1] = sum_zp[p] / sum_zz; - - if (block->channels == 4) - { - float Atb1 = 0; - float sum_q = 0; - float sum_qq = 0; - float sum[2] = { 0, 0 }; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - int q = block->weights[y * block->width + x]; - int z = (levels - 1) - q; - - sum_q += q; - sum_qq += q*q; - - sum[1] += 1; - sum[0] += get_pixel(scaled_pixels, 3, x, y); - Atb1 += z * get_pixel(scaled_pixels, 3, x, y); - } - - float Atb2 = (levels - 1)*sum[0] - Atb1; - - float Cxx = sum[1] * sq(levels - 1) - 2 * (levels - 1)*sum_q + sum_qq; - float Cyy = sum_qq; - float Cxy = (levels - 1)*sum_q - sum_qq; - float scale = 1.0f / (Cxx*Cyy - Cxy*Cxy); - - float ep[8]; - ep[0 + 3] = (levels - 1)*(Atb1 * Cyy - Atb2 * Cxy)*scale; - ep[4 + 3] = (levels - 1)*(Atb2 * Cxx - Atb1 * Cxy)*scale; - - if (abs(Cxx*Cyy - Cxy*Cxy) < 0.001) - { - ep[0 + 3] = sum[0] / sum[1]; - ep[4 + 3] = ep[0 + 3]; - } - - endpoints[6 + 0] = ep[0 + 3]; - endpoints[6 + 1] = ep[4 + 3]; - } -} - -void ls_refine_pair(float endpoints[6], float scaled_pixels[], astc_block block[]) -{ - uniform int channels = block->channels; - int levels = get_levels(block->weight_range); - - float Atb1[4] = { 0, 0, 0, 0 }; - float sum_q = 0; - float sum_qq = 0; - float sum[5] = { 0, 0, 0, 0, 0 }; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - int q = block->weights[y * block->width + x]; - - int z = (levels - 1) - q; - - sum_q += q; - sum_qq += q*q; - - sum[4] += 1; - for (uniform int p = 0; p < channels; p++) sum[p] += get_pixel(scaled_pixels, p, x, y); - for (uniform int p = 0; p < channels; p++) Atb1[p] += z * get_pixel(scaled_pixels, p, x, y); - } - - float Atb2[4]; - for (uniform int p = 0; p < channels; p++) - { - Atb2[p] = (levels - 1)*sum[p] - Atb1[p]; - } - - float Cxx = sum[4] * sq(levels - 1) - 2 * (levels - 1)*sum_q + sum_qq; - float Cyy = sum_qq; - float Cxy = (levels - 1)*sum_q - sum_qq; - float scale = 1.0f / (Cxx*Cyy - Cxy*Cxy); - - float ep[8]; - for (uniform int p = 0; p < channels; p++) - { - ep[0 + p] = (levels - 1)*(Atb1[p] * Cyy - Atb2[p] * Cxy)*scale; - ep[4 + p] = (levels - 1)*(Atb2[p] * Cxx - Atb1[p] * Cxy)*scale; - } - - if (abs(Cxx*Cyy - Cxy*Cxy) < 0.001) - { - // flatten - for (int p = 0; p < channels; p++) - { - ep[0 + p] = sum[p] / sum[4]; - ep[4 + p] = ep[0 + p]; - } - } - - for (uniform int p = 0; p < channels; p++) - { - endpoints[2 * p + 0] = ep[0 + p]; - endpoints[2 * p + 1] = ep[4 + p]; - } -} - -void ls_refine(float endpoints[], float scaled_pixels[], astc_block block[]) -{ - if (block->color_endpoint_modes[0] % 4 == 2) - { - ls_refine_scale(endpoints, scaled_pixels, block); - } - else - { - ls_refine_pair(endpoints, scaled_pixels, block); - } -} - -float optimize_alt_plane(uint8_t alt_weights[], float scaled_pixels[], astc_block block[]) -{ - int ccs = block->color_component_selector; - - float ext[2] = { 1000, -1000 }; - - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float value = get_pixel(scaled_pixels, 3, x, y); - ext[0] = min(ext[0], value); - ext[1] = max(ext[1], value); - } - - block->endpoints[3 * 2 + 0] = 0; - block->endpoints[3 * 2 + 1] = 255; - - float _rec_endpoints[8]; - dequant_decode_endpoints(_rec_endpoints, block->endpoints, block->color_endpoint_modes[0], block->endpoint_range); - - float endpoints[8]; - for (int p = 0; p < 3; p++) - { - endpoints[p * 2 + 0] = _rec_endpoints[0 + p]; - endpoints[p * 2 + 1] = _rec_endpoints[4 + p]; - } - - endpoints[3 * 2 + 0] = gather_float(endpoints, ccs * 2 + 0); - endpoints[3 * 2 + 1] = gather_float(endpoints, ccs * 2 + 1); - - scatter_float(endpoints, ccs * 2 + 0, ext[0]); - scatter_float(endpoints, ccs * 2 + 1, ext[1]); - - quantize_endpoints(block, endpoints); - - float rec_endpoints[8]; - dequant_decode_endpoints(rec_endpoints, block->endpoints, block->color_endpoint_modes[0], block->endpoint_range); - - float base = gather_float(rec_endpoints, 0 + ccs); - float dir = gather_float(rec_endpoints, 4 + ccs) - base; - float sq_norm = sq(dir) + 0.00001; - - int w_levels = get_levels(block->weight_range); - dir *= (w_levels - 1) / sq_norm; - - float err = 0; - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - float value = get_pixel(scaled_pixels, 3, x, y) - base; - - int q = clamp(value * dir + 0.5, 0, w_levels - 1); - - alt_weights[y * block->width + x] = q; - } - - if (dir < 0) - for (uniform int y = 0; y < block->height; y++) - for (uniform int x = 0; x < block->width; x++) - { - int q = block->weights[y * block->width + x]; - - block->weights[y * block->width + x] = w_levels - 1 - q; - } - - return err; -} - -void optimize_block(float scaled_pixels[], astc_block block[], astc_enc_state state[]) -{ - pixel_set pset; - pset.pixels = scaled_pixels; - pset.width = block->width; - pset.height = block->height; - - float ep[8]; - bool zero_based = (block->color_endpoint_modes[0] % 4) == 2; - compute_pca_endpoints(ep, &pset, zero_based, 4); - - quantize_endpoints(block, ep); - opt_weights(scaled_pixels, block); - - for (uniform int i = 0; i < state->refineIterations; i++) - { - ls_refine(ep, scaled_pixels, block); - quantize_endpoints(block, ep); - opt_weights(scaled_pixels, block); - } - - if (block->dual_plane) - { - uint8_t alt_weights[64]; - optimize_alt_plane(alt_weights, scaled_pixels, block); - - uint8_t block_weights[64]; - for (uniform int i = 0; i < block->width * block->height; i++) - { - block_weights[i] = block->weights[i]; - } - - for (uniform int i = 0; i < block->width * block->height; i++) - { - block->weights[i * 2 + 0] = block_weights[i]; - block->weights[i * 2 + 1] = alt_weights[i]; - } - } -} - -float measure_error(astc_block block[], astc_enc_state state[]) -{ - uniform int pitch = state->block_height * state->block_width; - assert(pitch <= 64); - - // dequant values - uniform int num_weights = block->width * block->height * (block->dual_plane ? 2 : 1); - - range_values weight_range_values = get_range_values(block->weight_range); - - int block_weights[64]; - for (int i = 0; i < num_weights; i++) - { - block_weights[i] = ((int)block->weights[i] * 64.0f / (weight_range_values.levels - 1) + 0.5); - } - - float rgba_endpoints[8]; - dequant_decode_endpoints(rgba_endpoints, block->endpoints, block->color_endpoint_modes[0], block->endpoint_range); - - uniform int stride = block->width; - uniform int Ds = (1024 + state->block_width / 2) / (state->block_width - 1); - uniform int Dt = (1024 + state->block_height / 2) / (state->block_height - 1); - - uint8_t main_weights[64]; - uint8_t alt_weights[64]; - - for (uniform int i = 0; i < num_weights; i++) main_weights[i] = block_weights[i]; - - if (block->dual_plane) - for (uniform int i = 0; i < num_weights/2; i++) - { - main_weights[i] = block_weights[i * 2 + 0]; - alt_weights[i] = block_weights[i * 2 + 1]; - } - - float sq_error = 0; - - for (uniform int y = 0; y < state->block_height; y++) - for (uniform int x = 0; x < state->block_width; x++) - { - uniform int gs = (x * Ds * (block->width - 1) + 32) >> 6; - uniform int gt = (y * Dt * (block->height - 1) + 32) >> 6; - - uniform int js = gs >> 4; - uniform int jt = gt >> 4; - - uniform int fs = gs & 0x0F; - uniform int ft = gt & 0x0F; - uniform int w11 = ((fs*ft + 8) >> 4); - - int filled_weight = 0; - int alt_filled_weight = 0; - - { - int acc = 0; - acc += main_weights[stride * (jt + 0) + js + 0] * (16 - ft - fs + w11); - acc += main_weights[stride * (jt + 0) + js + 1] * (fs - w11); - acc += main_weights[stride * (jt + 1) + js + 0] * (ft - w11); - acc += main_weights[stride * (jt + 1) + js + 1] * w11; - filled_weight = (acc + 8) >> 4; - } - - if (block->dual_plane) - { - int acc = 0; - acc += alt_weights[stride * (jt + 0) + js + 0] * (16 - ft - fs + w11); - acc += alt_weights[stride * (jt + 0) + js + 1] * (fs - w11); - acc += alt_weights[stride * (jt + 1) + js + 0] * (ft - w11); - acc += alt_weights[stride * (jt + 1) + js + 1] * w11; - alt_filled_weight = (acc + 8) >> 4; - } - - for (uniform int p = 0; p < block->channels; p++) - { - int C0 = rgba_endpoints[0 + p] * 256 + 128; - int C1 = rgba_endpoints[4 + p] * 256 + 128; - int w = filled_weight; - - if (block->dual_plane && block->color_component_selector == p) - { - w = alt_filled_weight; - } - - int C = (C0 * (64 - w) + C1 * w + 32) / 64; - - float diff = (C >> 8) - get_pixel(state->pixels, p, x, y); - sq_error += diff * diff; - } - } - - return sq_error; -} - -int code_value(int value, range_values range) -{ - int coded = value; - - if (range.levels_m != 2 && range.levels > 5) - { - int value2 = value; - if (value >= range.levels / 2) value2 = (range.levels - 1) - value; - int q = (value2 * range.levels_m_rcp) >> 16; - int r = value2 - q * range.levels_m; - coded = q + r * (1 << (range.levels_e - 1)); - coded = coded * 2 + ((value >= range.levels / 2) ? 1 : 0); - } - - return coded; -} - -void code_block(astc_block block[]) -{ - uniform int num_weights = block->width * block->height * (block->dual_plane ? 2 : 1); - - range_values weight_range_values = get_range_values(block->weight_range); - for (uniform int i = 0; i < num_weights; i++) - { - block->weights[i] = code_value(block->weights[i], weight_range_values); - } - - range_values endpoint_range_values = get_range_values(block->endpoint_range); - for (uniform int i = 0; i < 2 * block->color_endpoint_pairs; i++) - { - block->endpoints[i] = code_value(block->endpoints[i], endpoint_range_values); - } -} - -extern "C" void pack_block_c(uniform uint32_t data[4], uniform astc_block block[]); - -void pack_block(astc_block block[], astc_enc_state state[]) -{ - code_block(block); - - foreach_active (instance) - { - uniform astc_block ublock; - - ublock.width = block->width; - ublock.height = block->height; - ublock.dual_plane = block->dual_plane; - ublock.partitions = block->partitions; - ublock.color_endpoint_pairs = block->color_endpoint_pairs; - - ublock.weight_range = extract(block->weight_range, instance); - ublock.color_component_selector = extract(block->color_component_selector, instance); - ublock.partition_id = extract(block->partition_id, instance); - ublock.endpoint_range = extract(block->endpoint_range, instance); - ublock.color_endpoint_modes[0] = extract(block->color_endpoint_modes[0], instance); - - uniform int num_weights = block->width * block->height * (block->dual_plane ? 2 : 1); - for (uniform int i = 0; i < num_weights; i++) - ublock.weights[i] = extract(block->weights[i], instance); - - for (uniform int i = 0; i < 8; i++) - ublock.endpoints[i] = extract(block->endpoints[i], instance); - - uniform uint32_t data[4]; - pack_block_c(data, &ublock); - - for (uniform int i = 0; i < 4; i++) state->data[i] = insert(state->data[i], instance, data[i]); - } -} - -int get_bits(uint32_t value, uniform int from, uniform int to) -{ - return (value >> from) & ((1 << (to + 1 - from)) - 1); -} - -void load_block_parameters(astc_block block[], uint32_t mode, uniform astc_enc_context ctx[]) -{ - // uniform parameters - block->width = ctx->width; - block->height = ctx->height; - block->dual_plane = ctx->dual_plane; - block->partitions = ctx->partitions; - block->color_endpoint_pairs = ctx->color_endpoint_pairs; - block->channels = ctx->channels; - - // varying parameters - block->weight_range = get_bits(mode, 0, 3); // 0..11 <= 2^4 - block->color_component_selector = get_bits(mode, 4, 5); // 0..2 <= 2^2 - block->partition_id = 0; - block->color_endpoint_modes[0] = get_bits(mode, 6, 7) * 2 + 6; // 6, 8, 10 or 12 - block->endpoint_range = get_bits(mode, 8, 12); // 0..20 <= 2^5 -} - -export void astc_encode_ispc(uniform rgba_surface src[], uniform float block_scores[], uniform uint8_t dst[], uniform uint64_t list[], uniform astc_enc_context list_context[], uniform astc_enc_settings settings[]) -{ - uint64_t entry = list[programIndex]; - uint32_t offset = entry >> 32; - uint32_t mode = (entry & 0xFFFFFFFF); - if (mode == 0) return; - int yy = offset >> 16; - int xx = offset & 0xFFFF; - - int tex_width = src->width / settings->block_width; - - astc_enc_state _state; - varying astc_enc_state* uniform state = &_state; - - state->block_width = settings->block_width; - state->block_height = settings->block_height; - state->refineIterations = settings->refineIterations; - - load_block_interleaved(state->pixels, src, xx, yy, state->block_width, state->block_height); - - astc_block _block; - varying astc_block* uniform block = &_block; - - load_block_parameters(block, mode, list_context); - - scale_pixels(state, list_context); - if (block->channels == 3) clear_alpha(state->scaled_pixels, block->width, block->height); - - if (block->dual_plane) - { - pixel_set pset; - pset.pixels = state->scaled_pixels; - pset.width = block->width; - pset.height = block->height; - - rotate_plane(&pset, block->color_component_selector); - } - - optimize_block(state->scaled_pixels, block, state); - float error = measure_error(block, state); - - if (error < gather_float(block_scores, yy * tex_width + xx)) - { - pack_block(block, state); - - scatter_float(block_scores, yy * tex_width + xx, error); - - for (uniform int i = 0; i < 4; i++) - scatter_uint((uint32_t*)dst, (yy * tex_width + xx) * 4 + i, state->data[i]); - } -} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/lib/ispc_texcomp.lib b/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/lib/ispc_texcomp.lib deleted file mode 100644 index d81240c798..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/ISPCTextureCompressor/1.0.0/win_x64/lib/ispc_texcomp.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cfef8964d6723c26e4a6c4a4e46278a6e2a5bccefc3185750c824358e471dd2 -size 7666 diff --git a/Gems/Atom/Asset/Shader/Code/AZSL/Platform/Mac/Null/AzslcHeader.azsli b/Gems/Atom/Asset/Shader/Code/AZSL/Platform/Mac/Null/AzslcHeader.azsli new file mode 100644 index 0000000000..58b7672e1a --- /dev/null +++ b/Gems/Atom/Asset/Shader/Code/AZSL/Platform/Mac/Null/AzslcHeader.azsli @@ -0,0 +1,16 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +/* +* The shader build pipeline has 2 preprocess stages. The first one happens +* after appending this header and pre-processing with mcpp ahead of azslc. +*/ diff --git a/Gems/Atom/Asset/Shader/Code/AZSL/Platform/Windows/Null/AzslcHeader.azsli b/Gems/Atom/Asset/Shader/Code/AZSL/Platform/Windows/Null/AzslcHeader.azsli new file mode 100644 index 0000000000..58b7672e1a --- /dev/null +++ b/Gems/Atom/Asset/Shader/Code/AZSL/Platform/Windows/Null/AzslcHeader.azsli @@ -0,0 +1,16 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +/* +* The shader build pipeline has 2 preprocess stages. The first one happens +* after appending this header and pre-processing with mcpp ahead of azslc. +*/ diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp index 961af6e8fe..0a85d463e5 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp @@ -102,7 +102,7 @@ namespace AZ // Register Shader Resource Group Layout Builder AssetBuilderSDK::AssetBuilderDesc srgLayoutBuilderDescriptor; srgLayoutBuilderDescriptor.m_name = "Shader Resource Group Layout Builder"; - srgLayoutBuilderDescriptor.m_version = 50; // ATOM-14918 (probably don't need to bump this one but just playing it safe) + srgLayoutBuilderDescriptor.m_version = 51; // SPEC-6065 srgLayoutBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.azsl", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); srgLayoutBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.azsli", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); srgLayoutBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(AZStd::string::format("*.%s", SrgLayoutBuilder::MergedPartialSrgsExtension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); @@ -117,7 +117,7 @@ namespace AZ // Register Shader Asset Builder AssetBuilderSDK::AssetBuilderDesc shaderAssetBuilderDescriptor; shaderAssetBuilderDescriptor.m_name = "Shader Asset Builder"; - shaderAssetBuilderDescriptor.m_version = 95; // LKG Merge + shaderAssetBuilderDescriptor.m_version = 96; // SPEC-6065 // .shader file changes trigger rebuilds shaderAssetBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern( AZStd::string::format("*.%s", RPI::ShaderSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); shaderAssetBuilderDescriptor.m_busId = azrtti_typeid(); @@ -132,7 +132,7 @@ namespace AZ shaderVariantAssetBuilderDescriptor.m_name = "Shader Variant Asset Builder"; // Both "Shader Variant Asset Builder" and "Shader Asset Builder" produce ShaderVariantAsset products. If you update // ShaderVariantAsset you will need to update BOTH version numbers, not just "Shader Variant Asset Builder". - shaderVariantAssetBuilderDescriptor.m_version = 16; // LKG Merge + shaderVariantAssetBuilderDescriptor.m_version = 17; // SPEC-6065 shaderVariantAssetBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(AZStd::string::format("*.%s", RPI::ShaderVariantListSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); shaderVariantAssetBuilderDescriptor.m_busId = azrtti_typeid(); shaderVariantAssetBuilderDescriptor.m_createJobFunction = AZStd::bind(&ShaderVariantAssetBuilder::CreateJobs, &m_shaderVariantAssetBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp index c9933dc98a..9a84b39189 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp @@ -568,6 +568,26 @@ namespace AZ Outcome ObtainBuildArtifactsFromAzslBuilder([[maybe_unused]] const char* builderName, const AZStd::string& sourceFullPath, RHI::APIType apiType, const AZStd::string& platform) { AzslSubProducts::Paths products; + + // platform id from identifier + AzFramework::PlatformId platformId = AzFramework::PlatformId::PC; + if (platform == "pc") + { + platformId = AzFramework::PlatformId::PC; + } + else if (platform == "osx_gl") + { + platformId = AzFramework::PlatformId::OSX; + } + else if (platform == "es3") + { + platformId = AzFramework::PlatformId::ES3; + } + else if (platform == "ios") + { + platformId = AzFramework::PlatformId::IOS; + } + for (RPI::ShaderAssetSubId sub : AzslSubProducts::SubList) { uint32_t assetSubId = MakeAzslBuildProductSubId(sub, apiType); @@ -582,25 +602,6 @@ namespace AZ AZStd::string assetPath; Data::AssetCatalogRequestBus::BroadcastResult(assetPath, &Data::AssetCatalogRequests::GetAssetPathById, assetId); - // platform id from identifier - AzFramework::PlatformId platformId = AzFramework::PlatformId::PC; - if (platform == "pc") - { - platformId = AzFramework::PlatformId::PC; - } - if (platform == "osx_gl") - { - platformId = AzFramework::PlatformId::OSX; - } - else if (platform == "es3") - { - platformId = AzFramework::PlatformId::ES3; - } - else if (platform == "ios") - { - platformId = AzFramework::PlatformId::IOS; - } - // get the root: AZStd::string assetRoot = AzToolsFramework::PlatformAddressedAssetCatalog::GetAssetRootForPlatform(platformId); // join diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h index 42cad593a6..d6926d0086 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h @@ -96,7 +96,7 @@ namespace AZ //! This is meant to be used at this stage: //! //! .azsl source -> common header prepend -> preprocess -> azslc -> dxc -> cross - //! ↑here↑ + //! ^here^ AZStd::string DumpPreprocessedCode( const char* BuilderName, const AZStd::string& preprocessedCode, @@ -109,7 +109,7 @@ namespace AZ //! This is meant to be used at this stage: //! //! .azsl source -> common header prepend -> preprocess -> azslc -> dxc -> cross - //! ↑here↑ + //! ^here^ AZStd::string DumpAzslPrependedCode( const char* BuilderName, const AZStd::string& nonPreprocessedYetAzslSource, diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp index 738163a844..f91bb4d25d 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp @@ -162,6 +162,7 @@ namespace AZ AZStd::string expectedHigherPrecedenceFileFullPath; AzFramework::StringFunc::Path::Join(gameProjectPath, RPI::ShaderVariantTreeAsset::CommonSubFolder, expectedHigherPrecedenceFileFullPath, false /* handle directory overlap? */, false /* be case insensitive? */); AzFramework::StringFunc::Path::Join(expectedHigherPrecedenceFileFullPath.c_str(), shaderProductFileRelativePath.c_str(), expectedHigherPrecedenceFileFullPath, false /* handle directory overlap? */, false /* be case insensitive? */); + AzFramework::StringFunc::Path::ReplaceExtension(expectedHigherPrecedenceFileFullPath, AZ::RPI::ShaderVariantAsset::Extension); AzFramework::StringFunc::Path::Normalize(expectedHigherPrecedenceFileFullPath); AZStd::string normalizedShaderVariantListFileFullPath = shaderVariantListFileFullPath; @@ -469,6 +470,12 @@ namespace AZ AZStd::string previousLoopApiName; for (RHI::ShaderPlatformInterface* shaderPlatformInterface : platformInterfaces) { + // Null backend is special and does not require any processing. + if (shaderPlatformInterface->GetAPIUniqueIndex() == static_cast(AZ::RHI::APIIndex::Null)) + { + continue; + } + if (shaderSourceDescriptor.IsRhiBackendDisabled(shaderPlatformInterface->GetAPIName())) { // Gracefully do nothing and continue with the next shaderPlatformInterface. @@ -647,6 +654,12 @@ namespace AZ // Generate shaders for each of those ShaderPlatformInterfaces. for (RHI::ShaderPlatformInterface* shaderPlatformInterface : platformInterfaces) { + // Null backend is special and does not require any processing. + if (shaderPlatformInterface->GetAPIUniqueIndex() == static_cast(AZ::RHI::APIIndex::Null)) + { + continue; + } + AZ_TraceContext("ShaderPlatformInterface", shaderPlatformInterface->GetAPIName().GetCStr()); if (shaderSourceDescriptor.IsRhiBackendDisabled(shaderPlatformInterface->GetAPIName())) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/platform_builders_mac.cmake b/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/platform_builders_mac.cmake index cb19cfcc2a..d75af3eb17 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/platform_builders_mac.cmake +++ b/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/platform_builders_mac.cmake @@ -28,6 +28,14 @@ ly_add_target_files( Builders/ShaderHeaders/Platform/Windows/Vulkan ) +ly_add_target_files( + TARGETS Atom_Asset_Shader.Builders + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/AZSL/Platform/Windows/Null/AzslcHeader.azsli + OUTPUT_SUBDIRECTORY + Builders/ShaderHeaders/Platform/Windows/Null +) + ly_add_target_files( TARGETS Atom_Asset_Shader.Builders FILES @@ -37,6 +45,14 @@ ly_add_target_files( Builders/ShaderHeaders/Platform/Mac/Metal ) +ly_add_target_files( + TARGETS Atom_Asset_Shader.Builders + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/AZSL/Platform/Mac/Null/AzslcHeader.azsli + OUTPUT_SUBDIRECTORY + Builders/ShaderHeaders/Platform/Mac/Null +) + ly_add_target_files( TARGETS Atom_Asset_Shader.Builders FILES diff --git a/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/platform_builders_windows.cmake b/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/platform_builders_windows.cmake index e6aa95f7f2..37df33fb65 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/platform_builders_windows.cmake +++ b/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/platform_builders_windows.cmake @@ -28,6 +28,14 @@ ly_add_target_files( Builders/ShaderHeaders/Platform/Windows/Vulkan ) +ly_add_target_files( + TARGETS Atom_Asset_Shader.Builders + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/AZSL/Platform/Windows/Null/AzslcHeader.azsli + OUTPUT_SUBDIRECTORY + Builders/ShaderHeaders/Platform/Windows/Null +) + ly_add_target_files( TARGETS Atom_Asset_Shader.Builders FILES @@ -37,6 +45,14 @@ ly_add_target_files( Builders/ShaderHeaders/Platform/Mac/Metal ) +ly_add_target_files( + TARGETS Atom_Asset_Shader.Builders + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/AZSL/Platform/Mac/Null/AzslcHeader.azsli + OUTPUT_SUBDIRECTORY + Builders/ShaderHeaders/Platform/Mac/Null +) + ly_add_target_files( TARGETS Atom_Asset_Shader.Builders FILES diff --git a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp index f11631b8b0..f4825bca5b 100644 --- a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp +++ b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp @@ -288,15 +288,12 @@ namespace AZ bool BootstrapSystemComponent::EnsureDefaultRenderPipelineInstalledForScene(AZ::RPI::ScenePtr scene, AZ::RPI::ViewportContextPtr viewportContext) { - // Create a render pipeline from the specified asset for the window context and add the pipeline to the scene + // Create a render pipeline from the specified asset for the window context and add the pipeline to the scene. + // When running with no Asset Processor (for example in release), CompileAssetSync will return AssetStatus_Unknown. AzFramework::AssetSystem::AssetStatus status = AzFramework::AssetSystem::AssetStatus_Unknown; AzFramework::AssetSystemRequestBus::BroadcastResult( status, &AzFramework::AssetSystemRequestBus::Events::CompileAssetSync, m_defaultPipelineAssetPath); - AZ_Error("RPISystem", status == AzFramework::AssetSystem::AssetStatus_Compiled, "Could not compile the default render pipeline at '%s'", m_defaultPipelineAssetPath.c_str()); - if (status != AzFramework::AssetSystem::AssetStatus_Compiled) - { - return false; - } + AZ_Assert(status == AzFramework::AssetSystem::AssetStatus_Compiled || status == AzFramework::AssetSystem::AssetStatus_Unknown, "Could not compile the default render pipeline at '%s'", m_defaultPipelineAssetPath.c_str()); Data::Asset pipelineAsset = RPI::AssetUtils::LoadAssetByProductPath(m_defaultPipelineAssetPath.c_str(), RPI::AssetUtils::TraceLevel::Error); RPI::RenderPipelineDescriptor renderPipelineDescriptor = *RPI::GetDataFromAnyAsset(pipelineAsset); diff --git a/Gems/Atom/Component/DebugCamera/Code/Source/Module.cpp b/Gems/Atom/Component/DebugCamera/Code/Source/Module.cpp index 170b626701..1dc6bcca15 100644 --- a/Gems/Atom/Component/DebugCamera/Code/Source/Module.cpp +++ b/Gems/Atom/Component/DebugCamera/Code/Source/Module.cpp @@ -30,6 +30,7 @@ namespace AZ CameraModule() { m_descriptors.insert(m_descriptors.end(), { + CameraControllerComponent::CreateDescriptor(), ArcBallControllerComponent::CreateDescriptor(), CameraComponent::CreateDescriptor(), NoClipControllerComponent::CreateDescriptor(), diff --git a/Gems/Atom/Component/DebugCamera/Code/Source/NoClipControllerComponent.cpp b/Gems/Atom/Component/DebugCamera/Code/Source/NoClipControllerComponent.cpp index a5c54bf46d..37bb3fa66c 100644 --- a/Gems/Atom/Component/DebugCamera/Code/Source/NoClipControllerComponent.cpp +++ b/Gems/Atom/Component/DebugCamera/Code/Source/NoClipControllerComponent.cpp @@ -52,6 +52,8 @@ namespace AZ void NoClipControllerComponent::Reflect(AZ::ReflectContext* reflection) { + NoClipControllerProperties::Reflect(reflection); + if (auto* serializeContext = azrtti_cast(reflection)) { serializeContext->Class() diff --git a/Gems/Atom/Feature/Common/3rdParty/Findlux_core.cmake b/Gems/Atom/Feature/Common/3rdParty/Findlux_core.cmake deleted file mode 100644 index 7baf56c1d4..0000000000 --- a/Gems/Atom/Feature/Common/3rdParty/Findlux_core.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME lux_core - VERSION - 3RDPARTY_ROOT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../External/LuxCore2.2 - INCLUDE_DIRECTORIES include -) diff --git a/Gems/Atom/Feature/Common/3rdParty/Platform/Windows/lux_core_windows.cmake b/Gems/Atom/Feature/Common/3rdParty/Platform/Windows/lux_core_windows.cmake deleted file mode 100644 index 0fc4422bb9..0000000000 --- a/Gems/Atom/Feature/Common/3rdParty/Platform/Windows/lux_core_windows.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LUX_CORE_LIBS ${BASE_PATH}/win64/lib/luxcore.lib) - -set(LUX_CORE_RUNTIME_DEPENDENCIES - ${BASE_PATH}/win64/dll/embree3.dll - ${BASE_PATH}/win64/dll/luxcore.dll - ${BASE_PATH}/win64/dll/OpenImageDenoise.dll - #${BASE_PATH}/win64/dll/OpenImageIO.dll ### ATOM-5988 This dll is 1.8 and currently conflicts with Windows version of full SDK of OpenImageIO 2.1 - ${BASE_PATH}/win64/dll/tbb.dll - ${BASE_PATH}/win64/dll/tbbmalloc.dll -) diff --git a/Gems/Atom/Feature/Common/3rdParty/imgui_atom.json b/Gems/Atom/Feature/Common/3rdParty/imgui_atom.json deleted file mode 100644 index 9de6b2281d..0000000000 --- a/Gems/Atom/Feature/Common/3rdParty/imgui_atom.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "imgui_atom", - "source": "@GEM@/External/ImGui", - "description": "ImGui", - "defines": [], - "lib_required": "False", - "includes": [""] -} - diff --git a/Gems/Atom/Feature/Common/3rdParty/lux_core.json b/Gems/Atom/Feature/Common/3rdParty/lux_core.json deleted file mode 100644 index 0cba224808..0000000000 --- a/Gems/Atom/Feature/Common/3rdParty/lux_core.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "lux_core", - "source": "@GEM@/External/LuxCore2.2", - "description": "LuxCore", - "includes": ["include"], - "defines": [], - "lib_required": "True", - "shared_required": "True", - "platform" : { - "win_x64_vs2017": { - "sharedlibpath": [ - "win64/dll" - ], - "importlibpath": [ - "win64/lib" - ], - "import": [ - "luxcore.lib" - ], - "shared": [ - "embree3.dll", - "luxcore.dll", - "OpenImageDenoise.dll", - "OpenImageIO.dll", - "tbb.dll", - "tbbmalloc.dll" - ] - }, - "win_x64_vs2019": "@win_x64_vs2017" - } -} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset index fce2874f8f..0a470c74dc 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset @@ -3,52 +3,48 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Goegap", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { - "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}", - "subId": 1000 + "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}", + "subId": 3000 }, - "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage" + "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { - "guid": "{3FD09945-D0F2-55C8-B9AF-B2Fd421FE3BE}", + "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}", "subId": 2000 }, "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}", + "subId": 1000 + }, + "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { - "guid": "{3FD09945-D0F2-55C8-B9AF-B2Fd421FE3BE}", + "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}", "subId": 3000 }, "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.3499999940395355, "lights": [ { "direction": [ - 0.372, - 0.572, - -0.728 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 + 0.3720000088214874, + 0.5720000267028809, + -0.7279999852180481 ], "intensity": 15.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.3499999940395355 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap_alt.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap_alt.lightingpreset.azasset deleted file mode 100644 index f66552a04e..0000000000 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Goegap (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{3FD09945-D0F2-55C8-B9AF-B2Fd421FE3BE}", - "subId": 3000 - }, - "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{3FD09945-D0F2-55C8-B9AF-B2Fd421FE3BE}", - "subId": 2000 - }, - "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{3FD09945-D0F2-55C8-B9AF-B2Fd421FE3BE}", - "subId": 3000 - }, - "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - 0.372, - 0.572, - -0.728 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 15.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.10000000149011612 - } -} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset index 8addc7409f..d5e5cc8ea1 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Artist Workshop", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{D2B747EE-85B8-5766-8AA0-CCB6AFF81BA2}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm.exr.streamingimage" + "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{D2B747EE-85B8-5766-8AA0-CCB6AFF81BA2}", + "subId": 1000 + }, + "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{D2B747EE-85B8-5766-8AA0-CCB6AFF81BA2}", "subId": 3000 }, "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.3499999940395355, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ 1.0, -0.20000000298023225 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.3499999940395355 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop_alt.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop_alt.lightingpreset.azasset deleted file mode 100644 index 1c6198f1d4..0000000000 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Artist Workshop (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{D2B747EE-85B8-5766-8AA0-CCB6AFF81BA2}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{D2B747EE-85B8-5766-8AA0-CCB6AFF81BA2}", - "subId": 2000 - }, - "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{D2B747EE-85B8-5766-8AA0-CCB6AFF81BA2}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/artist_workshop_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - 0.5, - 1.0, - -0.20000000298023225 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.10000000149011612 - } -} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset index e1a928dfdf..cdeaface6e 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Blau River", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{442FFD57-9ED2-51A5-B627-764AE2A2161F}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm.exr.streamingimage" + "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{442FFD57-9ED2-51A5-B627-764AE2A2161F}", + "subId": 1000 + }, + "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{442FFD57-9ED2-51A5-B627-764AE2A2161F}", "subId": 3000 }, "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.3499999940395355, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ 0.4000000059604645, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.3499999940395355 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river_alt.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river_alt.lightingpreset.azasset deleted file mode 100644 index 53847677a3..0000000000 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Blau River (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{442FFD57-9ED2-51A5-B627-764AE2A2161F}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{442FFD57-9ED2-51A5-B627-764AE2A2161F}", - "subId": 2000 - }, - "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{442FFD57-9ED2-51A5-B627-764AE2A2161F}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/blau_river_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - 0.4000000059604645, - 0.4000000059604645, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.15000000596046449 - } -} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset index c29e343446..fb93d91a2f 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Blouberg Sunrise 1", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{10853039-DC8A-558A-B27E-4433A6386731}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm.exr.streamingimage" + "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{10853039-DC8A-558A-B27E-4433A6386731}", + "subId": 1000 + }, + "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{10853039-DC8A-558A-B27E-4433A6386731}", "subId": 3000 }, "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.15000000596046449, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ -0.699999988079071, -0.25 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.15000000596046449 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1_alt.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1_alt.lightingpreset.azasset deleted file mode 100644 index 8c974580cb..0000000000 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Blouberg Sunrise 1 (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{10853039-DC8A-558A-B27E-4433A6386731}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{10853039-DC8A-558A-B27E-4433A6386731}", - "subId": 2000 - }, - "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{10853039-DC8A-558A-B27E-4433A6386731}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/blouberg_sunrise_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - -0.25, - -0.699999988079071, - -0.25 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.15000000596046449 - } -} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset index 427b123760..b659b89e66 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Champagne Castle 1", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{40D2CCBC-1372-59E5-BF36-D2EA46C10195}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm.exr.streamingimage" + "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{40D2CCBC-1372-59E5-BF36-D2EA46C10195}", + "subId": 1000 + }, + "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{40D2CCBC-1372-59E5-BF36-D2EA46C10195}", "subId": 3000 }, "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.3499999940395355, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ 0.25, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.3499999940395355 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1_alt.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1_alt.lightingpreset.azasset deleted file mode 100644 index 07ce0ba267..0000000000 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Champagne Castle 1 (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{40D2CCBC-1372-59E5-BF36-D2EA46C10195}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{40D2CCBC-1372-59E5-BF36-D2EA46C10195}", - "subId": 2000 - }, - "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{40D2CCBC-1372-59E5-BF36-D2EA46C10195}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/champagne_castle_1_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - -0.10000000149011612, - 0.25, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.25 - } -} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset index 6d84f0ac04..e7e694cef1 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Kloetzle Blei", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{8C964DCA-0737-5EA1-B333-EF1D2F281431}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm.exr.streamingimage" + "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{8C964DCA-0737-5EA1-B333-EF1D2F281431}", + "subId": 1000 + }, + "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{8C964DCA-0737-5EA1-B333-EF1D2F281431}", "subId": 3000 }, "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.3499999940395355, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ -0.15000000596046449, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.3499999940395355 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei_alt.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei_alt.lightingpreset.azasset deleted file mode 100644 index 0d19e67746..0000000000 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Kloetzle Blei (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{8C964DCA-0737-5EA1-B333-EF1D2F281431}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{8C964DCA-0737-5EA1-B333-EF1D2F281431}", - "subId": 2000 - }, - "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{8C964DCA-0737-5EA1-B333-EF1D2F281431}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/kloetzle_blei_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - -0.15000000596046449, - -0.15000000596046449, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.3499999940395355 - } -} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset index c290bb462e..68fa1ea655 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Palermo Sidewalk", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{097EDE05-7CED-553F-B76D-EDBB2E8AB442}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm.exr.streamingimage" + "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{097EDE05-7CED-553F-B76D-EDBB2E8AB442}", + "subId": 1000 + }, + "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{097EDE05-7CED-553F-B76D-EDBB2E8AB442}", "subId": 3000 }, "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.25, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ 0.15000000596046449, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.25 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk_alt.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk_alt.lightingpreset.azasset deleted file mode 100644 index 08a8bfce82..0000000000 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Palermo Sidewalk (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{097EDE05-7CED-553F-B76D-EDBB2E8AB442}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{097EDE05-7CED-553F-B76D-EDBB2E8AB442}", - "subId": 2000 - }, - "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{097EDE05-7CED-553F-B76D-EDBB2E8AB442}", - "subId": 3000 - }, - "assetHint": "lightingpresets/lowcontrast/palermo_sidewalk_4k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - -0.15000000596046449, - 0.15000000596046449, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.20000000298023225 - } -} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype index 591e390516..e95c82e435 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype @@ -211,7 +211,7 @@ "description": "Base color texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_baseColorMapUvIndex" @@ -267,7 +267,7 @@ "description": "Metallic texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_metallicMapUvIndex" @@ -311,7 +311,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_roughnessMapUvIndex" @@ -422,7 +422,7 @@ "description": "Specular reflection texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_specularF0MapUvIndex" @@ -487,7 +487,7 @@ "description": "Strength factor texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_clearCoatInfluenceMapUvIndex" @@ -529,7 +529,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_clearCoatRoughnessMapUvIndex" @@ -571,7 +571,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_clearCoatNormalMapUvIndex" @@ -615,7 +615,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_normalMapUvIndex" @@ -692,7 +692,7 @@ "description": "Opacity texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_opacityMapUvIndex" @@ -1214,7 +1214,7 @@ "description": "Which UV set to use for sampling the detail blend mask", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_detail_blendMask_uvIndex" @@ -1226,7 +1226,7 @@ "description": "Which UV set to use for detail map texture sampling", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_detail_allMapsUvIndex" @@ -2093,7 +2093,7 @@ } ], "uvNameMap": { - "UV0": "Base", - "UV1": "Packed" + "UV0": "Tiled", + "UV1": "Unwrapped" } } diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl index 6d8e1735fb..81601860ed 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl @@ -34,8 +34,7 @@ struct VSInput struct VSDepthOutput { - // "centroid" is needed for SV_DepthLessEqual to compile - linear centroid float4 m_position : SV_Position; + float4 m_position : SV_Position; float2 m_uv[UvSetCount] : UV1; // only used for parallax depth calculation @@ -69,7 +68,7 @@ VSDepthOutput MainVS(VSInput IN) struct PSDepthOutput { - float m_depth : SV_DepthLessEqual; + float m_depth : SV_Depth; }; PSDepthOutput MainPS(VSDepthOutput IN, bool isFrontFace : SV_IsFrontFace) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl index a6ef8080a6..ff8b4b7778 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl @@ -55,8 +55,7 @@ struct VSInput struct VSOutput { // Base fields (required by the template azsli file)... - // "centroid" is needed for SV_DepthLessEqual to compile - linear centroid float4 m_position : SV_Position; + float4 m_position : SV_Position; float3 m_normal: NORMAL; float3 m_tangent : TANGENT; float3 m_bitangent : BITANGENT; @@ -80,8 +79,14 @@ VSOutput EnhancedPbr_ForwardPassVS(VSInput IN) // By design, only UV0 is allowed to apply transforms. OUT.m_uv[0] = mul(MaterialSrg::m_uvMatrix, float3(IN.m_uv0, 1.0)).xy; OUT.m_uv[1] = IN.m_uv1; + + // As seen above our standard practice is to only transform the first UV as that's the one we expect to be used for + // tiling. But for detail maps you could actually use either UV stream for tiling. There is no concern about applying + // the same transform to both UV sets because the detail map feature forces the same UV set to be used for all detail maps. + // Note we might be able to combine these into a single UV similar to what Skin.materialtype does, + // but we would need to address how it works with the parallax code below that indexes into the m_detailUV array. OUT.m_detailUv[0] = mul(MaterialSrg::m_detailUvMatrix, float3(IN.m_uv0, 1.0)).xy; - OUT.m_detailUv[1] = IN.m_uv1; + OUT.m_detailUv[1] = mul(MaterialSrg::m_detailUvMatrix, float3(IN.m_uv1, 1.0)).xy; PbrVsHelper(IN, OUT, worldPosition, o_parallax_feature_enabled && o_parallax_enablePixelDepthOffset); @@ -98,7 +103,8 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float if ((o_parallax_feature_enabled && !o_enableSubsurfaceScattering && MaterialSrg::m_parallaxUvIndex != 0) || (o_normal_useTexture && MaterialSrg::m_normalMapUvIndex != 0) - || (o_clearCoat_enabled && o_clearCoat_normal_useTexture && MaterialSrg::m_clearCoatNormalMapUvIndex != 0)) + || (o_clearCoat_enabled && o_clearCoat_normal_useTexture && MaterialSrg::m_clearCoatNormalMapUvIndex != 0) + || (o_detail_normal_useTexture && MaterialSrg::m_detail_allMapsUvIndex != 0)) { // Generate the tangent/bitangent for UV[1+] const int startIndex = 1; @@ -162,14 +168,13 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float // ------- Normal ------- float2 normalUv = IN.m_uv[MaterialSrg::m_normalMapUvIndex]; - float3x3 uvMatrix = MaterialSrg::m_normalMapUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); - float3x3 detailUvMatrix = MaterialSrg::m_normalMapUvIndex == 0 ? MaterialSrg::m_detailUvMatrix : CreateIdentity3x3(); + float3x3 uvMatrix = MaterialSrg::m_normalMapUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); // By design, only UV0 is allowed to apply transforms. float detailLayerNormalFactor = MaterialSrg::m_detail_normal_factor * detailLayerBlendFactor; float3 normal = GetDetailedNormalInputWS( isFrontFace, IN.m_normal, - tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], MaterialSrg::m_normalMap, MaterialSrg::m_sampler, normalUv, MaterialSrg::m_normalFactor, MaterialSrg::m_flipNormalX, MaterialSrg::m_flipNormalY, uvMatrix, o_normal_useTexture, - tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], MaterialSrg::m_detail_normal_texture, MaterialSrg::m_sampler, detailUv, detailLayerNormalFactor, MaterialSrg::m_detail_normal_flipX, MaterialSrg::m_detail_normal_flipY, detailUvMatrix, o_detail_normal_useTexture); + tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], MaterialSrg::m_normalMap, MaterialSrg::m_sampler, normalUv, MaterialSrg::m_normalFactor, MaterialSrg::m_flipNormalX, MaterialSrg::m_flipNormalY, uvMatrix, o_normal_useTexture, + tangents[MaterialSrg::m_detail_allMapsUvIndex], bitangents[MaterialSrg::m_detail_allMapsUvIndex], MaterialSrg::m_detail_normal_texture, MaterialSrg::m_sampler, detailUv, detailLayerNormalFactor, MaterialSrg::m_detail_normal_flipX, MaterialSrg::m_detail_normal_flipY, MaterialSrg::m_detailUvMatrix, o_detail_normal_useTexture); //--------------------- Base Color ---------------------- diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl index 665f9a106d..e051a238bd 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl @@ -35,8 +35,7 @@ struct VertexInput struct VertexOutput { - // "centroid" is needed for SV_DepthLessEqual to compile - linear centroid float4 m_position : SV_Position; + float4 m_position : SV_Position; float2 m_uv[UvSetCount] : UV1; // only used for parallax depth calculation @@ -70,7 +69,7 @@ VertexOutput MainVS(VertexInput IN) struct PSDepthOutput { - float m_depth : SV_DepthGreaterEqual; + float m_depth : SV_Depth; }; PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsInput.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsInput.azsli index 252064e5fe..cef98362ac 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsInput.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/DetailMapsInput.azsli @@ -57,20 +57,27 @@ float GetDetailLayerBlendFactor(Texture2D detailLayerBlendMask, sampler detailLa return detailLayerBlendFactor; } -float3 ApplyNormalMapOverlayTS(bool applyOverlay, float3 mainNormalTS, Texture2D overlayNormalMap, sampler mapSampler, float2 uv, bool flipNormalX, bool flipNormalY, float3x3 normalUvMatrix, float factor) +//! Sample a normal map and apply it as an overlay on top of another normal map. +//! @return a new normal vector in the same tangent space as mainNormalTS. +float3 ApplyNormalMapOverlayTS(bool applyOverlay, float3 vertexNormalWS, float3 mainNormalTS, float3 mainTangent, float3 mainBitangent, + Texture2D overlayNormalMap, sampler overlayMapSampler, float2 overlayUv, bool flipOverlayNormalX, bool flipOverlayNormalY, float overlayFactor, + float3 overlayTangent, float3 overlayBitangen, float3x3 overlayNormalUvMatrix) { if(applyOverlay) { - // Get overlay normal in tangent space - float3 overlayNormalTS = GetNormalInputTS(overlayNormalMap, mapSampler, uv, flipNormalX, flipNormalY, normalUvMatrix, true, factor); + // Get overlay normal in its local tangent space + float3 overlayNormalTS = GetNormalInputTS(overlayNormalMap, overlayMapSampler, overlayUv, flipOverlayNormalX, flipOverlayNormalY, overlayNormalUvMatrix, true, overlayFactor); - // [GFX TODO][ATOM-14591]: This will only work if the normal maps all use the same UV stream. We would need to add support for having them in different UV streams. - // Often the main map will be in an unwrapped UV space and the detail map will be in a tiled UV space. + // [GFX TODO][ATOM-15111]: Find a more efficient way to do this. + + // Convert the overlay normal from its local tangent space into the main normal's tangent space. + float3 overlayNormalWS = TangentSpaceToWorld(overlayNormalTS, vertexNormalWS, overlayTangent, overlayBitangen); + float3 overlayNormalInMainTS = WorldSpaceToTangent(overlayNormalWS, vertexNormalWS, mainTangent, mainBitangent); // Combine normals in tangent space - float3 normal = ReorientTangentSpaceNormal(mainNormalTS, overlayNormalTS); + float3 normalInMainTS = ReorientTangentSpaceNormal(mainNormalTS, overlayNormalInMainTS); - return normal; + return normalInMainTS; } else { @@ -78,21 +85,25 @@ float3 ApplyNormalMapOverlayTS(bool applyOverlay, float3 mainNormalTS, Texture2D } } -float3 ApplyNormalMapOverlayWS(bool applyOverlay, float3 vertexNormal, float3 tangent, float3 bitangent, float3 mainNormalTS, Texture2D overlayNormalMap, sampler mapSampler, float2 uv, float factor, bool flipNormalX, bool flipNormalY, float3x3 normalUvMatrix) +//! Sample a normal map and apply it as an overlay on top of another normal map. +//! @return a new normal vector in world space. +float3 ApplyNormalMapOverlayWS(bool applyOverlay, float3 vertexNormalWS, float3 mainNormalTS, float3 mainTangent, float3 mainBitangent, + Texture2D overlayNormalMap, sampler overlayMapSampler, float2 overlayUv, bool flipOverlayNormalX, bool flipOverlayNormalY, float overlayFactor, + float3 overlayTangent, float3 overlayBitangen, float3x3 overlayNormalUvMatrix) { if(applyOverlay) { - float3 normalTS = ApplyNormalMapOverlayTS(applyOverlay, mainNormalTS, overlayNormalMap, mapSampler, uv, flipNormalX, flipNormalY, normalUvMatrix, factor); - float3 normalWS = normalize( TangentSpaceToWorld(normalTS, vertexNormal, tangent, bitangent) ); + float3 normalTS = ApplyNormalMapOverlayTS(applyOverlay, vertexNormalWS, mainNormalTS, mainTangent, mainBitangent, overlayNormalMap, overlayMapSampler, overlayUv, flipOverlayNormalX, flipOverlayNormalY, overlayFactor, overlayTangent, overlayBitangen, overlayNormalUvMatrix); + float3 normalWS = normalize( TangentSpaceToWorld(normalTS, vertexNormalWS, mainTangent, mainBitangent) ); return normalWS; } else { - return normalize( TangentSpaceToWorld(mainNormalTS, vertexNormal, tangent, bitangent) ); + return normalize( TangentSpaceToWorld(mainNormalTS, vertexNormalWS, mainTangent, mainBitangent) ); } } -float3 GetDetailedNormalInputWS(bool isFrontFace, float3 vertexNormal, +float3 GetDetailedNormalInputWS(bool isFrontFace, float3 vertexNormalWS, float3 mainTangent, float3 mainBitangent, Texture2D mainNormalMap, sampler mainSampler, float2 mainUv, float mainNormalFactor, bool flipMainNormalX, bool flipMainNormalY, float3x3 mainNormalUvMatrix, bool useMainNormalMap, float3 detailTangent, float3 detailBitangent, Texture2D detailNormalMap, sampler detailSampler, float2 detailUv, float detailNormalFactor, bool flipDetailNormalX, bool flipDetailNormalY, float3x3 detailNormalUvMatrix, bool useDetailNormalMap) { @@ -101,19 +112,19 @@ float3 GetDetailedNormalInputWS(bool isFrontFace, float3 vertexNormal, if(useDetailNormalMap) { // Get normal in tangent space - float3 normalTS = GetNormalInputTS(mainNormalMap, mainSampler, mainUv, flipMainNormalX, flipMainNormalY, + float3 mainNormalTS = GetNormalInputTS(mainNormalMap, mainSampler, mainUv, flipMainNormalX, flipMainNormalY, mainNormalUvMatrix, useMainNormalMap, mainNormalFactor); bool applyOverlay = true; - normal = ApplyNormalMapOverlayWS(applyOverlay, vertexNormal, detailTangent, detailBitangent, - normalTS, detailNormalMap, detailSampler, detailUv, detailNormalFactor, flipDetailNormalX, flipDetailNormalY, detailNormalUvMatrix); + normal = ApplyNormalMapOverlayWS(applyOverlay, vertexNormalWS, mainNormalTS, mainTangent, mainBitangent, + detailNormalMap, detailSampler, detailUv, flipDetailNormalX, flipDetailNormalY, detailNormalFactor, detailTangent, detailBitangent, detailNormalUvMatrix); AdjustBackFaceNormal(normal, isFrontFace); } else { - // TODO: Re-order these parameters to match GetDetailedNormalInputWS - normal = GetNormalInputWS(mainNormalMap, mainSampler, mainUv, flipMainNormalX, flipMainNormalY, isFrontFace, vertexNormal, + // TODO: Re-order these parameters to match GetDetailedNormalInputWS + normal = GetNormalInputWS(mainNormalMap, mainSampler, mainUv, flipMainNormalX, flipMainNormalY, isFrontFace, vertexNormalWS, mainTangent, mainBitangent, mainNormalUvMatrix, useMainNormalMap, mainNormalFactor); } diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/NormalInput.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/NormalInput.azsli index 37b6ab1a0b..c41275fc54 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/NormalInput.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/NormalInput.azsli @@ -30,7 +30,10 @@ bool prefix##m_flipNormalY; #define COMMON_OPTIONS_NORMAL(prefix) \ option bool prefix##o_normal_useTexture; -float4 SampleNormal(Texture2D map, sampler mapSampler, float2 uv) +//! Samples the normal map and returns the XY values of the normal. +//! (Z must be reconstructed assuming length=1; this is handled by the various utility functions that take float2 in TangentSpace.azsli). +//! The returned XY values will be in the range [-1,1]. +float2 SampleNormalXY(Texture2D map, sampler mapSampler, float2 uv) { float4 sampledValue = map.Sample(mapSampler, uv); @@ -40,13 +43,16 @@ float4 SampleNormal(Texture2D map, sampler mapSampler, float2 uv) sampledValue = (sampledValue * 2) - 1; #endif - return sampledValue; + return sampledValue.xy; } -// Samples the normal map values and flips X/Y if requested -float2 SampleNormal(Texture2D map, sampler mapSampler, float2 uv, bool flipX, bool flipY) +//! Samples the normal map and returns the XY values of the normal. +//! (Z must be reconstructed assuming length=1; this is handled by the various utility functions that take float2 in TangentSpace.azsli). +//! The returned XY values will be in the range [-1,1]. +//! Also flips X and/or Y if requested. +float2 SampleNormalXY(Texture2D map, sampler mapSampler, float2 uv, bool flipX, bool flipY) { - float2 sampledValue = SampleNormal(map, mapSampler, uv).rg; + float2 sampledValue = SampleNormalXY(map, mapSampler, uv); // [GFX TODO][ATOM-2404] For some reason, the image build pipeline swaps the R and G channels if(flipX) @@ -73,7 +79,7 @@ float3 GetNormalInputWS(Texture2D map, sampler mapSampler, float2 uv, bool flipX { if (useTexture) { - float2 sampledValue = SampleNormal(map, mapSampler, uv, flipX, flipY); + float2 sampledValue = SampleNormalXY(map, mapSampler, uv, flipX, flipY); normal = GetWorldSpaceNormal(sampledValue, normal, tangent, bitangent, uvMatrix, normalStrength); } else @@ -90,7 +96,7 @@ float3 GetNormalInputTS(Texture2D map, sampler mapSampler, float2 uv, bool flipX { if (useTexture) { - float2 sampledValue = SampleNormal(map, mapSampler, uv, flipX, flipY); + float2 sampledValue = SampleNormalXY(map, mapSampler, uv, flipX, flipY); return GetTangentSpaceNormal(sampledValue, uvMatrix, normalStrength); } else diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl index ace01e9397..aa8ae3a010 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl @@ -62,8 +62,8 @@ struct VSInput float3 m_bitangent : BITANGENT; // Extended fields (only referenced in this azsl file)... - float2 m_uv0_unwrapped : UV0; - float2 m_uv1_tiled : UV1; + float2 m_uv0_tiled : UV0; + float2 m_uv1_unwrapped : UV1; // This gets set automatically by the system at runtime only if it's available. // There is a soft naming convention that associates this with o_blendMask_isBound, which will be set to true whenever m_optional_blendMask is available. @@ -75,8 +75,7 @@ struct VSInput struct VSOutput { // Base fields (required by the template azsli file)... - // "centroid" is needed for SV_DepthLessEqual to compile - linear centroid float4 m_position : SV_Position; + float4 m_position : SV_Position; float3 m_normal: NORMAL; float3 m_tangent : TANGENT; float3 m_bitangent : BITANGENT; @@ -99,18 +98,22 @@ VSOutput SkinVS(VSInput IN) float3 worldPosition = mul(ObjectSrg::GetWorldMatrix(), float4(IN.m_position, 1.0)).xyz; - // UV0 is for unwrapped UVs. The main textures in a skin material will almost always use this UV set. - OUT.m_uv[0] = IN.m_uv0_unwrapped; - - // UV1 is for tiled UVs. This will almost always be used exclusively with the detail layer, but it is still available + // UV0 is for tiled UVs. This will almost always be used exclusively with the detail layer, but it is still available // for the main layer to use if needed. Unlike StandardPBR etc, we don't provide a transform for this stream on the main layer, // because it will usually be used for the detail layer which has its own dedicated transform. If a use does case come up, we // could consider adding the main layer UV transform back in. - OUT.m_uv[1] = IN.m_uv1_tiled; + // Note, even though the "unwrapped" stream is considered the main stream from a material perspective (it is the default), we + // still use UV0 for "tiled" because UV0 has pre-generated tangent vectors which is important for detail maps, which usually + // use the "tiled" stream, and need better quality tangents because of the high frequency. + OUT.m_uv[0] = IN.m_uv0_tiled; + + // UV1 is for unwrapped UVs. The main textures in a skin material will almost always use this UV set. + OUT.m_uv[1] = IN.m_uv1_unwrapped; + // The detail layer has a dedicated UV transform which we apply here. The detail layer does have the option of using // either UV0 or UV1, in either case we apply the transform. - OUT.m_detailUv = MaterialSrg::m_detail_allMapsUvIndex == 0 ? IN.m_uv0_unwrapped : IN.m_uv1_tiled; + OUT.m_detailUv = MaterialSrg::m_detail_allMapsUvIndex == 0 ? IN.m_uv0_tiled : IN.m_uv1_unwrapped; OUT.m_detailUv = mul(MaterialSrg::m_detailUvMatrix, float3(OUT.m_detailUv, 1.0)).xy; if(o_blendMask_isBound) @@ -145,7 +148,7 @@ float2 ApplyNormalWrinkleMap(bool shouldApply, float2 baseNormalSample, Texture2 { if (shouldApply) { - float2 sampledValue = SampleNormal(map, mapSampler, uv, flipX, flipY); + float2 sampledValue = SampleNormalXY(map, mapSampler, uv, flipX, flipY); return lerp(baseNormalSample, sampledValue, factor); } else @@ -195,10 +198,10 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) // Since the wrinkle normal maps should all be in the same tangent space as the main normal map, we should be able to blend the raw normal map // texture values before doing all the tangent space transforms, so we only have to do the transforms once, for better performance. - float2 normalMapSample = float2(0.5,0.5); + float2 normalMapSample = float2(0.0,0.0); if(o_normal_useTexture) { - normalMapSample = SampleNormal(MaterialSrg::m_normalMap, MaterialSrg::m_sampler, normalUv, MaterialSrg::m_flipNormalX, MaterialSrg::m_flipNormalY); + normalMapSample = SampleNormalXY(MaterialSrg::m_normalMap, MaterialSrg::m_sampler, normalUv, MaterialSrg::m_flipNormalX, MaterialSrg::m_flipNormalY); } if(o_wrinkleLayers_enabled && o_blendMask_isBound && o_wrinkleLayers_normal_enabled) { @@ -214,9 +217,9 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) float3 normalTS = GetTangentSpaceNormal(normalMapSample, uvMatrix, MaterialSrg::m_normalFactor); bool applyOverlay = true; - normalWS = ApplyNormalMapOverlayWS(applyOverlay, IN.m_normal, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], - normalTS, MaterialSrg::m_detail_normal_texture, MaterialSrg::m_sampler, IN.m_detailUv, detailLayerNormalFactor, - MaterialSrg::m_detail_normal_flipX, MaterialSrg::m_detail_normal_flipY, MaterialSrg::m_detailUvMatrix); + normalWS = ApplyNormalMapOverlayWS(applyOverlay, IN.m_normal, normalTS, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], + MaterialSrg::m_detail_normal_texture, MaterialSrg::m_sampler, IN.m_detailUv, MaterialSrg::m_detail_normal_flipX, MaterialSrg::m_detail_normal_flipY, + detailLayerNormalFactor, tangents[MaterialSrg::m_detail_allMapsUvIndex], bitangents[MaterialSrg::m_detail_allMapsUvIndex], MaterialSrg::m_detailUvMatrix); } else { diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype index a5c20eb9fd..5912bc1484 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype @@ -171,7 +171,7 @@ "description": "Base color texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_baseColorMapUvIndex" @@ -214,7 +214,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_roughnessMapUvIndex" @@ -293,7 +293,7 @@ "description": "Specular reflection texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_specularF0MapUvIndex" @@ -341,7 +341,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_normalMapUvIndex" @@ -408,7 +408,7 @@ "description": "Ambient occlusion texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_ambientOcclusionMapUvIndex" @@ -476,7 +476,7 @@ "description": "Influence map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_subsurfaceScatteringInfluenceMapUvIndex" @@ -555,7 +555,7 @@ "description": "Thickness map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_transmissionThicknessMapUvIndex" @@ -760,7 +760,7 @@ "description": "Which UV set to use for sampling the detail blend mask", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_detail_blendMask_uvIndex" @@ -772,7 +772,7 @@ "description": "Which UV set to use for detail map texture sampling", "type": "Enum", "enumIsUv": true, - "defaultValue": "Packed", + "defaultValue": "Unwrapped", "connection": { "type": "ShaderInput", "id": "m_detail_allMapsUvIndex" @@ -1052,7 +1052,7 @@ } ], "uvNameMap": { - "UV0": "Packed", - "UV1": "Base" + "UV0": "Tiled", + "UV1": "Unwrapped" } } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype index 42e66dcc72..3b40d80b67 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype @@ -334,7 +334,7 @@ "description": "Blend Mask UV set.", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_blendMaskUvIndex" @@ -355,7 +355,7 @@ "description": "UV set that supports parallax mapping.", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_parallaxUvIndex" @@ -451,7 +451,7 @@ "description": "Opacity texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_opacityMapUvIndex" @@ -589,7 +589,7 @@ "description": "Influence map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_subsurfaceScatteringInfluenceMapUvIndex" @@ -668,7 +668,7 @@ "description": "Thickness map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_transmissionThicknessMapUvIndex" @@ -788,7 +788,7 @@ "description": "Base color texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_baseColorMapUvIndex" @@ -844,7 +844,7 @@ "description": "Metallic texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_metallicMapUvIndex" @@ -875,7 +875,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_roughnessMapUvIndex" @@ -961,7 +961,7 @@ "description": "Specular reflection texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_specularF0MapUvIndex" @@ -992,7 +992,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_normalMapUvIndex" @@ -1078,7 +1078,7 @@ "description": "Strength factor texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_clearCoatInfluenceMapUvIndex" @@ -1120,7 +1120,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_clearCoatRoughnessMapUvIndex" @@ -1162,7 +1162,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_clearCoatNormalMapUvIndex" @@ -1193,7 +1193,7 @@ "description": "Ambient occlusion texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_ambientOcclusionMapUvIndex" @@ -1274,7 +1274,7 @@ "description": "Emissive texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer1_m_emissiveMapUvIndex" @@ -1439,7 +1439,7 @@ "description": "Base color texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_baseColorMapUvIndex" @@ -1495,7 +1495,7 @@ "description": "Metallic texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_metallicMapUvIndex" @@ -1526,7 +1526,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_roughnessMapUvIndex" @@ -1612,7 +1612,7 @@ "description": "Specular reflection texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_specularF0MapUvIndex" @@ -1643,7 +1643,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_normalMapUvIndex" @@ -1729,7 +1729,7 @@ "description": "Strength factor texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_clearCoatInfluenceMapUvIndex" @@ -1771,7 +1771,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_clearCoatRoughnessMapUvIndex" @@ -1813,7 +1813,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_clearCoatNormalMapUvIndex" @@ -1844,7 +1844,7 @@ "description": "Ambient occlusion texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_ambientOcclusionMapUvIndex" @@ -1925,7 +1925,7 @@ "description": "Emissive texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer2_m_emissiveMapUvIndex" @@ -2090,7 +2090,7 @@ "description": "Base color texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_baseColorMapUvIndex" @@ -2146,7 +2146,7 @@ "description": "Metallic texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_metallicMapUvIndex" @@ -2177,7 +2177,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_roughnessMapUvIndex" @@ -2263,7 +2263,7 @@ "description": "Specular reflection texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_specularF0MapUvIndex" @@ -2294,7 +2294,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_normalMapUvIndex" @@ -2380,7 +2380,7 @@ "description": "Strength factor texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_clearCoatInfluenceMapUvIndex" @@ -2422,7 +2422,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_clearCoatRoughnessMapUvIndex" @@ -2464,7 +2464,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_clearCoatNormalMapUvIndex" @@ -2495,7 +2495,7 @@ "description": "Ambient occlusion texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_ambientOcclusionMapUvIndex" @@ -2576,7 +2576,7 @@ "description": "Emissive texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_layer3_m_emissiveMapUvIndex" @@ -3206,8 +3206,8 @@ } ], "uvNameMap": { - "UV0": "Base", - "UV1": "Packed" + "UV0": "Tiled", + "UV1": "Unwrapped" } } diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl index 225a1d1798..074b9dce26 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.azsl @@ -47,8 +47,7 @@ struct VSInput struct VSDepthOutput { - // "centroid" is needed for SV_DepthLessEqual to compile - linear centroid float4 m_position : SV_Position; + float4 m_position : SV_Position; float2 m_uv[UvSetCount] : UV1; // only used for parallax depth calculation @@ -95,7 +94,7 @@ VSDepthOutput MainVS(VSInput IN) struct PSDepthOutput { - float m_depth : SV_DepthLessEqual; + float m_depth : SV_Depth; }; PSDepthOutput MainPS(VSDepthOutput IN, bool isFrontFace : SV_IsFrontFace) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl index f4ab768bb2..04407adf7d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl @@ -70,8 +70,7 @@ struct VSInput struct VSOutput { // Base fields (required by the template azsli file)... - // "centroid" is needed for SV_DepthLessEqual to compile - linear centroid float4 m_position : SV_Position; + float4 m_position : SV_Position; float3 m_normal: NORMAL; float3 m_tangent : TANGENT; float3 m_bitangent : BITANGENT; diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl index 7334e99386..fa7d12f1fb 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl @@ -47,8 +47,7 @@ struct VertexInput struct VertexOutput { - // "centroid" is needed for SV_DepthLessEqual to compile - linear centroid float4 m_position : SV_Position; + float4 m_position : SV_Position; float2 m_uv[UvSetCount] : UV1; // only used for parallax depth calculation @@ -94,7 +93,7 @@ VertexOutput MainVS(VertexInput IN) struct PSDepthOutput { - float m_depth : SV_DepthLessEqual; + float m_depth : SV_Depth; }; PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype index 8c48b2f10e..9750d09538 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype @@ -203,7 +203,7 @@ "description": "Base color texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_baseColorMapUvIndex" @@ -259,7 +259,7 @@ "description": "Metallic texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_metallicMapUvIndex" @@ -290,7 +290,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_roughnessMapUvIndex" @@ -376,7 +376,7 @@ "description": "Specular reflection texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_specularF0MapUvIndex" @@ -438,7 +438,7 @@ "description": "Strength factor texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_clearCoatInfluenceMapUvIndex" @@ -480,7 +480,7 @@ "description": "Roughness texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_clearCoatRoughnessMapUvIndex" @@ -522,7 +522,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_clearCoatNormalMapUvIndex" @@ -553,7 +553,7 @@ "description": "Normal texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_normalMapUvIndex" @@ -636,7 +636,7 @@ "description": "Opacity texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_opacityMapUvIndex" @@ -748,7 +748,7 @@ "description": "Ambient occlusion texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_ambientOcclusionMapUvIndex" @@ -829,7 +829,7 @@ "description": "Emissive texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_emissiveMapUvIndex" @@ -860,7 +860,7 @@ "description": "Depth texture map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_parallaxUvIndex" @@ -974,7 +974,7 @@ "description": "Influence map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_subsurfaceScatteringInfluenceMapUvIndex" @@ -1053,7 +1053,7 @@ "description": "Thickness map UV set", "type": "Enum", "enumIsUv": true, - "defaultValue": "Base", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", "id": "m_transmissionThicknessMapUvIndex" @@ -1340,8 +1340,8 @@ } ], "uvNameMap": { - "UV0": "Base", - "UV1": "Packed" + "UV0": "Tiled", + "UV1": "Unwrapped" } } diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl index 88cbd448e2..2e64f5102a 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl @@ -34,7 +34,7 @@ struct VSInput struct VSDepthOutput { - // "centroid" is needed for SV_DepthLessEqual to compile + // "centroid" is needed for SV_Depth to compile linear centroid float4 m_position : SV_Position; float2 m_uv[UvSetCount] : UV1; @@ -69,7 +69,7 @@ VSDepthOutput MainVS(VSInput IN) struct PSDepthOutput { - float m_depth : SV_DepthLessEqual; + float m_depth : SV_Depth; }; PSDepthOutput MainPS(VSDepthOutput IN, bool isFrontFace : SV_IsFrontFace) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl index e2ba46ccfd..22e3da4572 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl @@ -54,7 +54,7 @@ struct VSInput struct VSOutput { // Base fields (required by the template azsli file)... - // "centroid" is needed for SV_DepthLessEqual to compile + // "centroid" is needed for SV_Depth to compile linear centroid float4 m_position : SV_Position; float3 m_normal: NORMAL; float3 m_tangent : TANGENT; @@ -133,8 +133,10 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float float alpha = GetAlphaInputAndClip(MaterialSrg::m_baseColorMap, MaterialSrg::m_opacityMap, baseColorUv, opacityUv, MaterialSrg::m_sampler, MaterialSrg::m_opacityFactor, o_opacity_source); // ------- Normal ------- + float2 normalUv = IN.m_uv[MaterialSrg::m_normalMapUvIndex]; - float3x3 uvMatrix = MaterialSrg::m_normalMapUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); + float3x3 uvMatrix = MaterialSrg::m_normalMapUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); // By design, only UV0 is allowed to apply transforms. + float3 normalWS = GetNormalInputWS(MaterialSrg::m_normalMap, MaterialSrg::m_sampler, normalUv, MaterialSrg::m_flipNormalX, MaterialSrg::m_flipNormalY, isFrontFace, IN.m_normal, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], uvMatrix, o_normal_useTexture, MaterialSrg::m_normalFactor); diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl index da6486619d..520c4cc580 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl @@ -35,7 +35,7 @@ struct VertexInput struct VertexOutput { - // "centroid" is needed for SV_DepthLessEqual to compile + // "centroid" is needed for SV_Depth to compile linear centroid float4 m_position : SV_Position; float2 m_uv[UvSetCount] : UV1; @@ -70,7 +70,7 @@ VertexOutput MainVS(VertexInput IN) struct PSDepthOutput { - float m_depth : SV_DepthGreaterEqual; + float m_depth : SV_Depth; }; PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass b/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass index 83d9816b9d..ca4e38c5ff 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass @@ -23,30 +23,6 @@ "LoadAction": "Clear" } } - ], - "ImageAttachments": [ - { - "Name": "OutputAttachment", - "SizeSource": { - "Source": { - "Pass": "Parent", - "Attachment": "SwapChainOutput" - } - }, - "FormatSource": { - "Pass": "Parent", - "Attachment": "SwapChainOutput" - } - } - ], - "Connections": [ - { - "LocalSlot": "Output", - "AttachmentRef": { - "Pass": "This", - "Attachment": "OutputAttachment" - } - } ] } } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass index b9cb6adb3e..7222b0fb24 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass @@ -53,7 +53,21 @@ "ShaderAsset": { "FilePath": "Shaders/PostProcessing/MSAAResolveCustom.shader" }, - "PipelineViewTag": "MainCamera" + "PipelineViewTag": "MainCamera", + "ShaderDataMappings": { + "UintMappings": [ + { + "Name": "enableNeighborClamping", + "Value": 0 + } + ], + "FloatMappings": [ + { + "Name": "maxNeighborContrast", + "Value": 2.0 + } + ] + } } } } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass index 1b469007a2..9877d736a8 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass @@ -281,7 +281,7 @@ }, { "Name": "MSAAResolveSpecularPass", - "TemplateName": "MSAAResolveColorTemplate", + "TemplateName": "MSAAResolveCustomTemplate", "Connections": [ { "LocalSlot": "Input", @@ -290,7 +290,28 @@ "Attachment": "SpecularInputOutput" } } - ] + ], + "PassData": { + "$type": "FullscreenTrianglePassData", + "ShaderAsset": { + "FilePath": "Shaders/PostProcessing/MSAAResolveCustom.shader" + }, + "PipelineViewTag": "MainCamera", + "ShaderDataMappings": { + "UintMappings": [ + { + "Name": "enableNeighborClamping", + "Value": 1 + } + ], + "FloatMappings": [ + { + "Name": "maxNeighborContrast", + "Value": 1.5 + } + ] + } + } }, { "Name": "MSAAResolveScatterDistancePass", diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli index 880499ca1d..4185b08571 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli @@ -32,5 +32,5 @@ struct ForwardPassOutputWithDepth float4 m_normal : SV_Target4; float4 m_clearCoatNormal : SV_Target5; float3 m_scatterDistance : SV_Target6; - float m_depth : SV_DepthLessEqual; + float m_depth : SV_Depth; }; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli index d97409cead..7350743e27 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli @@ -200,7 +200,7 @@ void ApplyQuadLight(ViewSrg::QuadLight light, float3 dirToCamera, Surface surfac float roughnessAdjustment = lerp(0.0, solidAngle, pow(rough, 1.5)); // Decrease intensity when the light position doesn't line up well with the dominant reflection direction. float3 dominantDir = GetSpecularDominantDirection(surface.normal, reflectionDir, rough); - roughnessAdjustment *= dot(dirToLight, dominantDir) * INV_PI; // INV_PI is here to make brightness match ground truth result more accurately for nearby lights. + roughnessAdjustment *= max(0.0f, dot(dirToLight, dominantDir)) * INV_PI; // INV_PI is here to make brightness match ground truth result more accurately for nearby lights. // Smooth surfaces need to increase light intensity with distance to maintain constant perceptual // intensity depending on the solid angle of the light. float solidAngleCoverage = solidAngle / (2.0 * PI); // Adjust solid angle to 0-1 range of how much of the hemisphere is covered. diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ParallaxMapping.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ParallaxMapping.azsli index 22c4e3581f..8a6b5c479a 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ParallaxMapping.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ParallaxMapping.azsli @@ -223,7 +223,7 @@ float3 GetParallaxOffset( float depthFactor, float3x3 uvMatrix) { // Tangent space eye vector - float3 dirToCameraTS = normalize(WorldToTangent(dirToCameraWS, normalWS, tangentWS, bitangentWS)); + float3 dirToCameraTS = normalize(WorldSpaceToTangent(dirToCameraWS, normalWS, tangentWS, bitangentWS)); // uv transform matrix in 3d, ignore translation float4x4 uv3DTransform; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetSRG.azsli b/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetSRG.azsli index bc2a971a5e..6baa0ed474 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetSRG.azsli +++ b/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetSRG.azsli @@ -19,6 +19,8 @@ ShaderResourceGroup MorphTargetPassSrg : SRG_PerPass RWBuffer m_accumulatedDeltas; } +// This class represents the data that is passed to the morph target compute shader of an individual delta +// See MorphTargetDelta.h for the corresponding cpu struct struct MorphTargetDelta { // The index of the vertex being modified by this delta diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl index af753fced7..119bb7552d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl @@ -15,11 +15,34 @@ #include #include +// --- NOTES --- +// +// This shader performs a custom MSAA resolve by applying tonemapping logic to each sub-pixel before they are average +// This yields more accurate/less aliased results (see https://mynameismjp.wordpress.com/2012/10/24/msaa-overview/) +// Additionally, aliasing can be further reduced by applying neighborhood lumanince clamping. This will clamp luminace +// values of sampled sub-pixels based on how bright neighboring sub-pixels are. + #define PROVISIONAL_TONEMAP_GAMMA 2.2f +// Tonemapping strategy +#define REINHARD_TONEMAPPING_STRATEGY 0 +#define LOG_TONEMAPPING_STRATEGY 1 +#define TONEMAPPING_STRATEGY LOG_TONEMAPPING_STRATEGY + +// Neighbor clamping strategy +#define CLAMP_NEIGHBOR_MAX_LUMINANCE 0 +#define CLAMP_NEIGHBOR_AVERAGE_LUMINANCE 1 +#define CLAMPING_STRATEGY CLAMP_NEIGHBOR_MAX_LUMINANCE + ShaderResourceGroup PassSrg : SRG_PerPass { - Texture2DMS m_albedoMap; + Texture2DMS inputTexture; + + // Whether to use neighborhood clamping to reduce aliasing + uint enableNeighborClamping; + + // Maximum factor by which a sub-pixel can exceed the luminance of it's neighboring sub-pixels + float maxNeighborContrast; } float3 ApplyProvisionalTonemap(float3 color) @@ -38,12 +61,33 @@ float3 ApplyInverseProvisionalTonemap(float3 color) float3 ConvertLighting(float3 color) { +#if TONEMAPPING_STRATEGY == LOG_TONEMAPPING_STRATEGY + + return log(color); + +#elif TONEMAPPING_STRATEGY == REINHARD_TONEMAPPING_STRATEGY + return ApplyProvisionalTonemap(color); + +#endif } float3 ConvertBack(float3 color) { +#if TONEMAPPING_STRATEGY == LOG_TONEMAPPING_STRATEGY + + return exp(color); + +#elif TONEMAPPING_STRATEGY == REINHARD_TONEMAPPING_STRATEGY + return ApplyInverseProvisionalTonemap(color); + +#endif +} + +float CalcLuminance(float3 color) +{ + return dot(color, float3(0.299f, 0.587f, 0.114f)); } struct PSOutput @@ -59,21 +103,84 @@ PSOutput MainPS(VSOutput IN) uint height = 0; uint numberOfSamples = 0; - PassSrg::m_albedoMap.GetDimensions(width, height, numberOfSamples); + PassSrg::inputTexture.GetDimensions(width, height, numberOfSamples); - float3 albedo = float3(0, 0, 0); + // The brightest luminance value of all neighbor sub-pixels + float brightestNeighborLuminance = 0.0f; - // Just average the samples equally + // The average luminance of all neighbor sub-pixels + float averageNeighborLuminance = 0.0f; + + int2 coord = int2(width * IN.m_texCoord.x, height * IN.m_texCoord.y); + + if(PassSrg::enableNeighborClamping) + { + // Get average + brightest neighborhood sub-pixel luminance value + for (uint i = 0; i < numberOfSamples; ++i) + { + float3 sampleColor00 = PassSrg::inputTexture.Load(int2(coord.x + 1, coord.y + 1), i).rgb; + float luminance00 = CalcLuminance(sampleColor00); + brightestNeighborLuminance = max(brightestNeighborLuminance, luminance00); + averageNeighborLuminance += luminance00; + + float3 sampleColor01 = PassSrg::inputTexture.Load(int2(coord.x + 1, coord.y - 1), i).rgb; + float luminance01 = CalcLuminance(sampleColor01); + brightestNeighborLuminance = max(brightestNeighborLuminance, luminance01); + averageNeighborLuminance += luminance01; + + float3 sampleColor10 = PassSrg::inputTexture.Load(int2(coord.x - 1, coord.y + 1), i).rgb; + float luminance10 = CalcLuminance(sampleColor10); + brightestNeighborLuminance = max(brightestNeighborLuminance, luminance10); + averageNeighborLuminance += luminance10; + + float3 sampleColor11 = PassSrg::inputTexture.Load(int2(coord.x - 1, coord.y - 1), i).rgb; + float luminance11 = CalcLuminance(sampleColor11); + brightestNeighborLuminance = max(brightestNeighborLuminance, luminance11); + averageNeighborLuminance += luminance11; + } + + // Normalize sum + averageNeighborLuminance = averageNeighborLuminance / (4.0f * float(numberOfSamples)); + } + + float3 color = float3(0, 0, 0); + + // Accumulate sub-pixels for (uint i = 0; i < numberOfSamples; ++i) { - float3 sampleColor = PassSrg::m_albedoMap.Load(int2(width * IN.m_texCoord.x, height * IN.m_texCoord.y), i).rgb; + // Get sub-pixel i + float3 sampleColor = PassSrg::inputTexture.Load(coord, i).rgb; + + if(PassSrg::enableNeighborClamping) + { + float sampleLuminance = CalcLuminance(sampleColor); + + #if CLAMPING_STRATEGY == CLAMP_NEIGHBOR_MAX_LUMINANCE + + float lumFactor = PassSrg::maxNeighborContrast * brightestNeighborLuminance / sampleLuminance; + + #elif CLAMPING_STRATEGY == CLAMP_NEIGHBOR_AVERAGE_LUMINANCE + + float lumFactor = PassSrg::maxNeighborContrast * averageNeighborLuminance / sampleLuminance; + + #endif + + sampleColor *= min(1.0f, lumFactor); + } + + // Apply tonemapping strategy sampleColor = ConvertLighting(sampleColor); - albedo += sampleColor; + + // Accumulate sample + color += sampleColor; } - albedo = albedo / float(numberOfSamples); - albedo = ConvertBack(albedo); + // Sample normalization and inverse tone mapping + color = color / float(numberOfSamples); + + // Apply inverse tonemapping st + color = ConvertBack(color); - OUT.m_color = float4(albedo, 1.0); + OUT.m_color = float4(color, 1.0); return OUT; } \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl index 719085a692..f12a5ebf9c 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl @@ -157,7 +157,10 @@ PSOutput MainPS(VSOutput input) float exposureFactor = pow(2.0, SceneSrg::m_cubemapExposure); color *= exposureFactor; } - + + // Clamp lower bounds of sky to prevent zero or negative values, which can leads to NaNs in other shaders like SMAA + color = max(0.000001f, color); + PSOutput OUT; OUT.m_specular = float4(color, 1.0); OUT.m_reflection = float4(color, 1.0); diff --git a/Gems/Atom/Feature/Common/Code/3rdParty/ACES/ACES/Aces.cpp b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/ACES/Aces.cpp new file mode 100644 index 0000000000..5e139ff466 --- /dev/null +++ b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/ACES/Aces.cpp @@ -0,0 +1,292 @@ +// ACES code derived from the nVidia HDR Display Demo Project +// (https://developer.nvidia.com/high-dynamic-range-display-development) +// ----------------------------------------------------------------------------- +// Copyright(c) 2016, NVIDIA CORPORATION.All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met : +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and / or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// ----------------------------------------------------------------------------- +// License Terms for Academy Color Encoding System Components +// +// Academy Color Encoding System (ACES) software and tools are provided by the +// Academy under the following terms and conditions: A worldwide, royalty-free, +// non-exclusive right to copy, modify, create derivatives, and use, in source and +// binary forms, is hereby granted, subject to acceptance of this license. +// +// Copyright © 2015 Academy of Motion Picture Arts and Sciences (A.M.P.A.S.). +// Portions contributed by others as indicated. All rights reserved. +// +// Performance of any of the aforementioned acts indicates acceptance to be bound +// by the following terms and conditions: +// +// * Copies of source code, in whole or in part, must retain the above copyright +// notice, this list of conditions and the Disclaimer of Warranty. +// * Use in binary form must retain the above copyright notice, this list of +// conditions and the Disclaimer of Warranty in the documentation and/or other +// materials provided with the distribution. +// * Nothing in this license shall be deemed to grant any rights to trademarks, +// copyrights, patents, trade secrets or any other intellectual property of +// A.M.P.A.S. or any contributors, except as expressly stated herein. +// * Neither the name "A.M.P.A.S." nor the name of any other contributors to this +// software may be used to endorse or promote products derivative of or based on +// this software without express prior written permission of A.M.P.A.S. or the +// contributors, as appropriate. +// +// This license shall be construed pursuant to the laws of the State of California, +// and any disputes related thereto shall be subject to the jurisdiction of the +// courts therein. +// +// Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +// AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL A.M.P.A.S., OR ANY +// CONTRIBUTORS OR DISTRIBUTORS, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, RESITUTIONARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////////// +// WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, THE ACADEMY SPECIFICALLY +// DISCLAIMS ANY REPRESENTATIONS OR WARRANTIES WHATSOEVER RELATED TO PATENT OR +// OTHER INTELLECTUAL PROPERTY RIGHTS IN THE ACADEMY COLOR ENCODING SYSTEM, OR +// APPLICATIONS THEREOF, HELD BY PARTIES OTHER THAN A.M.P.A.S.,WHETHER DISCLOSED OR +// UNDISCLOSED. +// +// ----------------------------------------------------------------------------- +// Modifications copyright Amazon.com, Inc. or its affiliates. +// + +// +// ACES implementation +// This implementation is partially ported from NVIDIA HDR sample. +// https://developer.nvidia.com/high-dynamic-range-display-development +// + +#include + +namespace AZ +{ + namespace Render + { + SegmentedSplineParamsC9 GetAcesODTParameters(OutputDeviceTransformType odtType) + { + // ACES reference values for ODT + // https://github.com/ampas/aces-dev/blob/master/transforms/ctl/lib/ACESlib.Tonescales.ctl + static const SegmentedSplineParamsC9 ODT_48nits = + { + // coefs + { + Vector4(-1.69896996, 0.515438676, 0, 0), + Vector4(-1.69896996, 0.847043753, 0, 0), + Vector4(-1.47790003, 1.1358, 0, 0), + Vector4(-1.22909999, 1.38020003, 0, 0), + Vector4(-0.864799976, 1.51970005, 0, 0), + Vector4(-0.448000014, 1.59850001, 0, 0), + Vector4(0.00517999986, 1.64670002, 0, 0), + Vector4(0.451108038, 1.67460918, 0, 0), + Vector4(0.911374450, 1.68787336, 0, 0), + Vector4(0.911374450, 1.68787336, 0, 0) + }, + { 0.0028798957, 0.02 }, // minPoint + { 4.79999924, 4.80000019 }, // midPoint + { 1005.71912, 48.0 }, // maxPoint + 0.0, // slopeLow + 0.04 // slopeHigh + }; + static const SegmentedSplineParamsC9 ODT_1000nits = + { + // coefs + { + Vector4(-4.9706219331, 0.8089132070, 0, 0), + Vector4(-3.0293780669, 1.1910867930, 0, 0), + Vector4(-2.1262, 1.5683, 0, 0), + Vector4(-1.5105, 1.9483, 0, 0), + Vector4(-1.0578, 2.3083, 0, 0), + Vector4(-0.4668, 2.6384, 0, 0), + Vector4(0.11938, 2.8595, 0, 0), + Vector4(0.7088134201, 2.9872608805, 0, 0), + Vector4(1.2911865799, 3.0127391195, 0, 0), + Vector4(1.2911865799, 3.0127391195, 0, 0) + }, + { 0.000141798664, 0.00499999989 }, // minPoint + { 4.79999924, 10.0 }, // midPoint + { 4505.08252, 1000.0 }, // maxPoint + 0.0, // slopeLow + 0.0599999987 // slopeHigh + }; + static const SegmentedSplineParamsC9 ODT_2000nits = + { + // coefs + { + Vector4(-4.9706219331, 0.8019952042, 0, 0), + Vector4(-3.0293780669, 1.1980047958, 0, 0), + Vector4(-2.1262, 1.5943000000, 0, 0), + Vector4(-1.5105, 1.9973000000, 0, 0), + Vector4(-1.0578, 2.3783000000, 0, 0), + Vector4(-0.4668, 2.7684000000, 0, 0), + Vector4(0.11938, 3.0515000000, 0, 0), + Vector4(0.7088134201, 3.2746293562, 0, 0), + Vector4(1.2911865799, 3.3274306351, 0, 0), + Vector4(1.2911865799, 3.3274306351, 0, 0) + }, + { 0.000141798664, 0.00499999989 }, // minPoint + { 4.79999924, 10.0 }, // midPoint + { 5771.86377, 2000.0 }, // maxPoint + 0.0, // slopeLow + 0.119999997 // slopeHigh + }; + static const SegmentedSplineParamsC9 ODT_4000nits = + { + // coefs + { + Vector4(-4.9706219331, 0.7973186613, 0, 0), + Vector4(-3.0293780669, 1.2026813387, 0, 0), + Vector4(-2.1262, 1.6093000000, 0, 0), + Vector4(-1.5105, 2.0108000000, 0, 0), + Vector4(-1.0578, 2.4148000000, 0, 0), + Vector4(-0.4668, 2.8179000000, 0, 0), + Vector4(0.11938, 3.1725000000, 0, 0), + Vector4(0.7088134201, 3.5344995451, 0, 0), + Vector4(1.2911865799, 3.6696204376, 0, 0), + Vector4(1.2911865799, 3.6696204376 , 0, 0) + }, + { 0.000141798664, 0.00499999989 }, // minPoint + { 4.79999924, 10.0 }, // midPoint + { 6824.36279, 4000.0 }, // maxPoint + 0.0, // slopeLow + 0.300000023 // slopeHigh + }; + + AZ_Assert(static_cast(odtType) < static_cast(NumOutputDeviceTransformTypes), "Invalid ODT type specified."); + switch(odtType) + { + case OutputDeviceTransformType_48Nits: + return ODT_48nits; + break; + case OutputDeviceTransformType_1000Nits: + return ODT_1000nits; + break; + case OutputDeviceTransformType_2000Nits: + return ODT_2000nits; + break; + case OutputDeviceTransformType_4000Nits: + return ODT_4000nits; + break; + default: + AZ_Assert(false, "Invalid ODT type specified."); + break; + } + return ODT_48nits; + } + + ShaperParams GetAcesShaperParameters(OutputDeviceTransformType odtType) + { + AZ_Assert(static_cast(odtType) < static_cast(NumOutputDeviceTransformTypes), "Invalid ODT type specified."); + + ShaperParams shaperParams; + + // These values represent and low and high end of the dynamic range in terms of stops from middle grey (0.18) + float lowerDynamicRangeInStops; + float higherDynamicRangeInStops; + const float MIDDLE_GREY = 0.18f; + + switch (odtType) + { + case OutputDeviceTransformType_48Nits: + lowerDynamicRangeInStops = -6.5f; + higherDynamicRangeInStops = 6.5f; + break; + case OutputDeviceTransformType_1000Nits: + lowerDynamicRangeInStops = -12.f; + higherDynamicRangeInStops = 10.f; + break; + case OutputDeviceTransformType_2000Nits: + lowerDynamicRangeInStops = -12.f; + higherDynamicRangeInStops = 11.f; + break; + case OutputDeviceTransformType_4000Nits: + lowerDynamicRangeInStops = -12.f; + higherDynamicRangeInStops = 12.f; + break; + default: + AZ_Assert(false, "Invalid output device transform type."); + return shaperParams; + break; + } + + float logMin = log2(MIDDLE_GREY * exp2(lowerDynamicRangeInStops)); + float logMax = log2(MIDDLE_GREY * exp2(higherDynamicRangeInStops)); + shaperParams.scale = 1.0f / (logMax - logMin); + shaperParams.bias = -shaperParams.scale * logMin; + shaperParams.type = ShaperType::Log2; + return shaperParams; + } + + Matrix3x3 GetColorConvertionMatrix(ColorConvertionMatrixType type) + { + static const Matrix3x3 ColorConvertionMatrices[] = + { + // XYZ to rec709 + Matrix3x3::CreateFromRows( + Vector3(3.24096942f, -1.53738296f, -0.49861076f), + Vector3(-0.96924388f, 1.87596786f, 0.04155510f), + Vector3(0.05563002f, -0.20397684f, 1.05697131f) + ), + // rec709 to XYZ + Matrix3x3::CreateFromRows( + Vector3(0.41239089f, 0.35758430f, 0.18048084f), + Vector3(0.21263906f, 0.71516860f, 0.07219233f), + Vector3(0.01933082f, 0.11919472f, 0.95053232f) + ), + // XYZ to bt2020 + Matrix3x3::CreateFromRows( + Vector3(1.71665096f, -0.35567081f, -0.25336623f), + Vector3(-0.66668433f, 1.61648130f, 0.01576854f), + Vector3(0.01763985f, -0.04277061f, 0.94210327f) + ), + // bt2020 to XYZ + Matrix3x3::CreateFromRows( + Vector3(0.63695812f, 0.14461692f, 0.16888094f), + Vector3(0.26270023f, 0.67799807f, 0.05930171f), + Vector3(0.00000000f, 0.02807269f, 1.06098485f) + ) + }; + + AZ_Assert(static_cast(type) < static_cast(NumColorConvertionMatrixTypes), "Invalid color convertion matrix type specified."); + + if (type < NumColorConvertionMatrixTypes) + { + return ColorConvertionMatrices[type]; + } + else + { + return ColorConvertionMatrices[0]; + } + } + + } // namespace Render +} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/3rdParty/ACES/ACES/Aces.h b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/ACES/Aces.h new file mode 100644 index 0000000000..472ef160be --- /dev/null +++ b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/ACES/Aces.h @@ -0,0 +1,180 @@ +// ACES code derived from the nVidia HDR Display Demo Project +// (https://developer.nvidia.com/high-dynamic-range-display-development) +// ----------------------------------------------------------------------------- +// Copyright(c) 2016, NVIDIA CORPORATION.All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met : +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and / or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// ----------------------------------------------------------------------------- +// License Terms for Academy Color Encoding System Components +// +// Academy Color Encoding System (ACES) software and tools are provided by the +// Academy under the following terms and conditions: A worldwide, royalty-free, +// non-exclusive right to copy, modify, create derivatives, and use, in source and +// binary forms, is hereby granted, subject to acceptance of this license. +// +// Copyright © 2015 Academy of Motion Picture Arts and Sciences (A.M.P.A.S.). +// Portions contributed by others as indicated. All rights reserved. +// +// Performance of any of the aforementioned acts indicates acceptance to be bound +// by the following terms and conditions: +// +// * Copies of source code, in whole or in part, must retain the above copyright +// notice, this list of conditions and the Disclaimer of Warranty. +// * Use in binary form must retain the above copyright notice, this list of +// conditions and the Disclaimer of Warranty in the documentation and/or other +// materials provided with the distribution. +// * Nothing in this license shall be deemed to grant any rights to trademarks, +// copyrights, patents, trade secrets or any other intellectual property of +// A.M.P.A.S. or any contributors, except as expressly stated herein. +// * Neither the name "A.M.P.A.S." nor the name of any other contributors to this +// software may be used to endorse or promote products derivative of or based on +// this software without express prior written permission of A.M.P.A.S. or the +// contributors, as appropriate. +// +// This license shall be construed pursuant to the laws of the State of California, +// and any disputes related thereto shall be subject to the jurisdiction of the +// courts therein. +// +// Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +// AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL A.M.P.A.S., OR ANY +// CONTRIBUTORS OR DISTRIBUTORS, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, RESITUTIONARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////////// +// WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, THE ACADEMY SPECIFICALLY +// DISCLAIMS ANY REPRESENTATIONS OR WARRANTIES WHATSOEVER RELATED TO PATENT OR +// OTHER INTELLECTUAL PROPERTY RIGHTS IN THE ACADEMY COLOR ENCODING SYSTEM, OR +// APPLICATIONS THEREOF, HELD BY PARTIES OTHER THAN A.M.P.A.S.,WHETHER DISCLOSED OR +// UNDISCLOSED. +// +// ----------------------------------------------------------------------------- +// Modifications copyright Amazon.com, Inc. or its affiliates. +// + +// +// ACES implementation +// This implementation is partially ported from NVIDIA HDR sample. +// + +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + namespace Render + { + struct SegmentedSplineParamsC9 + { + Vector4 coefs[10]; // coefs for B-spline between minPoint and midPoint (units of log luminance) + float minPoint[2]; // {luminance, luminance} linear extension below this + float midPoint[2]; // {luminance, luminance} + float maxPoint[2]; // {luminance, luminance} linear extension above this + float slopeLow; // log-log slope of low linear extension + float slopeHigh; // log-log slope of high linear extension + }; + + enum OutputDeviceTransformType + { + OutputDeviceTransformType_48Nits = 0, + OutputDeviceTransformType_1000Nits = 1, + OutputDeviceTransformType_2000Nits = 2, + OutputDeviceTransformType_4000Nits = 3, + NumOutputDeviceTransformTypes + }; + + enum ColorConvertionMatrixType + { + XYZ_To_Rec709 = 0, + Rec709_To_XYZ, + XYZ_To_Bt2020, + Bt2020_To_XYZ, + NumColorConvertionMatrixTypes + }; + + enum ShaperType + { + Linear = 0, + Log2 = 1, + NumShaperTypes + }; + + struct ShaperParams + { + ShaperType type = ShaperType::Linear; + float bias = 0.f; + float scale = 1.f; + }; + + enum class DisplayMapperOperationType : uint32_t + { + Aces = 0, + AcesLut, + Passthrough, + GammaSRGB, + Reinhard, + Invalid + }; + + enum class ShaperPresetType + { + None = 0, + Log2_48_nits, + Log2_1000_nits, + Log2_2000_nits, + Log2_4000_nits + }; + + enum class ToneMapperType + { + None = 0, + Reinhard + }; + + enum class TransferFunctionType + { + None = 0, + Gamma22 = 1, + PerceptualQuantizer = 2 + }; + + SegmentedSplineParamsC9 GetAcesODTParameters(OutputDeviceTransformType odtType); + ShaperParams GetAcesShaperParameters(OutputDeviceTransformType odtType); + Matrix3x3 GetColorConvertionMatrix(ColorConvertionMatrixType type); + + } // namespace Render + + AZ_TYPE_INFO_SPECIALIZE(Render::DisplayMapperOperationType, "{41CA80B1-9E0D-41FB-A235-9638D2A905A5}"); +} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/3rdParty/ACES/LICENSE.txt b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/LICENSE.txt new file mode 100644 index 0000000000..7b7868694b --- /dev/null +++ b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/LICENSE.txt @@ -0,0 +1,79 @@ +ACES code derived from the nVidia HDR Display Demo Project +(https://developer.nvidia.com/high-dynamic-range-display-development) +----------------------------------------------------------------------------- +Copyright(c) 2016, NVIDIA CORPORATION.All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met : + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and / or other materials provided with the distribution. + * Neither the name of NVIDIA CORPORATION nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +License Terms for Academy Color Encoding System Components + +Academy Color Encoding System (ACES) software and tools are provided by the +Academy under the following terms and conditions: A worldwide, royalty-free, +non-exclusive right to copy, modify, create derivatives, and use, in source and +binary forms, is hereby granted, subject to acceptance of this license. + +Copyright © 2013 Academy of Motion Picture Arts and Sciences (A.M.P.A.S.). +Portions contributed by others as indicated. All rights reserved. + +Performance of any of the aforementioned acts indicates acceptance to be bound +by the following terms and conditions: + +* Copies of source code, in whole or in part, must retain the above copyright +notice, this list of conditions and the Disclaimer of Warranty. + +* Use in binary form must retain the above copyright notice, this list of +conditions and the Disclaimer of Warranty in the documentation and/or other +materials provided with the distribution. + +* Nothing in this license shall be deemed to grant any rights to trademarks, +copyrights, patents, trade secrets or any other intellectual property of +A.M.P.A.S. or any contributors, except as expressly stated herein. + +* Neither the name "A.M.P.A.S." nor the name of any other contributors to this +software may be used to endorse or promote products derivative of or based on +this software without express prior written permission of A.M.P.A.S. or the +contributors, as appropriate. + +This license shall be construed pursuant to the laws of the State of +California, and any disputes related thereto shall be subject to the +jurisdiction of the courts therein. + +Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL A.M.P.A.S., OR ANY +CONTRIBUTORS OR DISTRIBUTORS, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, RESITUTIONARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, THE ACADEMY SPECIFICALLY +DISCLAIMS ANY REPRESENTATIONS OR WARRANTIES WHATSOEVER RELATED TO PATENT OR +OTHER INTELLECTUAL PROPERTY RIGHTS IN THE ACADEMY COLOR ENCODING SYSTEM, OR +APPLICATIONS THEREOF, HELD BY PARTIES OTHER THAN A.M.P.A.S.,WHETHER DISCLOSED OR +UNDISCLOSED. \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Code/3rdParty/ACES/PackageInfo.json b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/PackageInfo.json new file mode 100644 index 0000000000..145419f337 --- /dev/null +++ b/Gems/Atom/Feature/Common/Code/3rdParty/ACES/PackageInfo.json @@ -0,0 +1,6 @@ +{ + "PackageName" : "ACES", + "URL" : "https://developer.nvidia.com/high-dynamic-range-display-development", + "License" : "custom", + "LicenseFile" : "LICENSE.txt" +} diff --git a/Gems/Atom/Feature/Common/Code/CMakeLists.txt b/Gems/Atom/Feature/Common/Code/CMakeLists.txt index cd1bf4f31a..199463c7b4 100644 --- a/Gems/Atom/Feature/Common/Code/CMakeLists.txt +++ b/Gems/Atom/Feature/Common/Code/CMakeLists.txt @@ -30,6 +30,7 @@ ly_add_target( PUBLIC Include Source + 3rdParty/ACES ../External/ImGui COMPILE_DEFINITIONS PRIVATE diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ACES/Aces.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ACES/Aces.h deleted file mode 100644 index 3f6cf41842..0000000000 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ACES/Aces.h +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright(c) 2016, NVIDIA CORPORATION.All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met : -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and / or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Modifications copyright Amazon.com, Inc. or its affiliates. -// - -// -// ACES implementation -// This implementation is partially ported from NVIDIA HDR sample. -// - -#pragma once - -#include -#include -#include -#include - -namespace AZ -{ - namespace Render - { - struct SegmentedSplineParamsC9 - { - Vector4 coefs[10]; // coefs for B-spline between minPoint and midPoint (units of log luminance) - float minPoint[2]; // {luminance, luminance} linear extension below this - float midPoint[2]; // {luminance, luminance} - float maxPoint[2]; // {luminance, luminance} linear extension above this - float slopeLow; // log-log slope of low linear extension - float slopeHigh; // log-log slope of high linear extension - }; - - enum OutputDeviceTransformType - { - OutputDeviceTransformType_48Nits = 0, - OutputDeviceTransformType_1000Nits = 1, - OutputDeviceTransformType_2000Nits = 2, - OutputDeviceTransformType_4000Nits = 3, - NumOutputDeviceTransformTypes - }; - - enum ColorConvertionMatrixType - { - XYZ_To_Rec709 = 0, - Rec709_To_XYZ, - XYZ_To_Bt2020, - Bt2020_To_XYZ, - NumColorConvertionMatrixTypes - }; - - enum ShaperType - { - Linear = 0, - Log2 = 1, - NumShaperTypes - }; - - struct ShaperParams - { - ShaperType type = ShaperType::Linear; - float bias = 0.f; - float scale = 1.f; - }; - - enum class DisplayMapperOperationType : uint32_t - { - Aces = 0, - AcesLut, - Passthrough, - GammaSRGB, - Reinhard, - Invalid - }; - - enum class ShaperPresetType - { - None = 0, - Log2_48_nits, - Log2_1000_nits, - Log2_2000_nits, - Log2_4000_nits - }; - - enum class ToneMapperType - { - None = 0, - Reinhard - }; - - enum class TransferFunctionType - { - None = 0, - Gamma22 = 1, - PerceptualQuantizer = 2 - }; - - SegmentedSplineParamsC9 GetAcesODTParameters(OutputDeviceTransformType odtType); - ShaperParams GetAcesShaperParameters(OutputDeviceTransformType odtType); - Matrix3x3 GetColorConvertionMatrix(ColorConvertionMatrixType type); - - } // namespace Render - - AZ_TYPE_INFO_SPECIALIZE(Render::DisplayMapperOperationType, "{41CA80B1-9E0D-41FB-A235-9638D2A905A5}"); -} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ACES/AcesDisplayMapperFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ACES/AcesDisplayMapperFeatureProcessor.h index 132da2e8ae..a89653c359 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ACES/AcesDisplayMapperFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ACES/AcesDisplayMapperFeatureProcessor.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h index 03036ffc4a..35d2fcf603 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperConfigurationDescriptor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperConfigurationDescriptor.h index 1d7e5fc567..b645df4f6f 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperConfigurationDescriptor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperConfigurationDescriptor.h @@ -12,7 +12,7 @@ #pragma once -#include +#include #include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h index 8e3e78934a..b266eab14b 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ImageBasedLights/ImageBasedLightFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ImageBasedLights/ImageBasedLightFeatureProcessor.h index a6d6f618aa..49fd45571a 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ImageBasedLights/ImageBasedLightFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ImageBasedLights/ImageBasedLightFeatureProcessor.h @@ -65,10 +65,10 @@ namespace AZ static bool ValidateIsCubemap(Data::Instance image); Data::Instance m_sceneSrg; - RHI::ShaderInputImageIndex m_specularEnvMapIndex; - RHI::ShaderInputImageIndex m_diffuseEnvMapIndex; - RHI::ShaderInputConstantIndex m_iblExposureConstantIndex; - RHI::ShaderInputConstantIndex m_iblOrientationConstantIndex; + RHI::ShaderInputNameIndex m_specularEnvMapIndex = "m_specularEnvMap"; + RHI::ShaderInputNameIndex m_diffuseEnvMapIndex = "m_diffuseEnvMap"; + RHI::ShaderInputNameIndex m_iblExposureConstantIndex = "m_iblExposure"; + RHI::ShaderInputNameIndex m_iblOrientationConstantIndex = "m_iblOrientation"; Data::Instance m_specular; Data::Instance m_diffuse; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h index 844fbb6525..a595471813 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h @@ -139,6 +139,7 @@ namespace AZ MeshHandle CloneMesh(const MeshHandle& meshHandle) override; Data::Instance GetModel(const MeshHandle& meshHandle) const override; + void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const Data::Instance& material) override; void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const MaterialAssignmentMap& materials) override; const MaterialAssignmentMap& GetMaterialAssignmentMap(const MeshHandle& meshHandle) const override; void ConnectModelChangeEventHandler(const MeshHandle& meshHandle, ModelChangedEvent::Handler& handler) override; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h index d9889d0de9..77e3467fb9 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h @@ -52,6 +52,9 @@ namespace AZ //! Gets the underlying RPI::Model instance for a meshHandle. May be null if the model has not loaded. virtual Data::Instance GetModel(const MeshHandle& meshHandle) const = 0; + //! Sets the MaterialAssignmentMap for a meshHandle, using just a single material for the DefaultMaterialAssignmentId. + //! Note if there is already a material assignment map, this will replace the entire map with just a single material. + virtual void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const Data::Instance& material) = 0; //! Sets the MaterialAssignmentMap for a meshHandle. virtual void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const MaterialAssignmentMap& materials) = 0; //! Gets the MaterialAssignmentMap for a meshHandle. diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/MorphTargets/MorphTargetInputBuffers.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/MorphTargets/MorphTargetInputBuffers.h index 96ee8e7f4f..8e5d91198f 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/MorphTargets/MorphTargetInputBuffers.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/MorphTargets/MorphTargetInputBuffers.h @@ -47,12 +47,12 @@ namespace AZ { public: AZ_CLASS_ALLOCATOR(MorphTargetInputBuffers, AZ::SystemAllocator, 0); - MorphTargetInputBuffers(uint32_t vertexCount, const AZStd::vector& vertexDeltas, const AZStd::string& bufferNamePrefix); + MorphTargetInputBuffers(const RPI::BufferAssetView& bufferAssetView, const AZStd::string& bufferNamePrefix); //! Set the buffer views and vertex count on the given SRG void SetBufferViewsOnShaderResourceGroup(const Data::Instance& perInstanceSRG); private: - Data::Instance m_vertexDeltas; + RHI::Ptr m_vertexDeltaBufferView; }; struct MorphTargetMetaData diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/PostProcess/LookModification/LookModificationSettingsInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/PostProcess/LookModification/LookModificationSettingsInterface.h index ab8fde0355..7a6c7cd7fa 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/PostProcess/LookModification/LookModificationSettingsInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/PostProcess/LookModification/LookModificationSettingsInterface.h @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshInputBuffers.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshInputBuffers.h index 6a3c840c48..6970e92da6 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshInputBuffers.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshInputBuffers.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -111,15 +112,13 @@ namespace AZ const AZStd::vector& GetSubMeshProperties() const; //! Add a single morph target that can be applied to an instance of this skinned mesh - //! @param minWeight The minimum weight. Used in combination with the min/max deltas to determine the maximum value this morph could possibly offset a vertex. - //! @param maxWeight The maximum weight. Used in combination with the min/max deltas to determine the maximum value this morph could possibly offset a vertex. - //! @param minDelta The minimum value of all the deltas. Used for decoding the deltas. - //! @param maxDelta The maximum value of all the deltas. Used for decoding the deltas. - //! @param vertexCount The total number of vertices that are deformed. - //! @param vertexNumbers The indices of the vertices that are deformed, since the morph target can deform a sparse set of vertices. - //! @param deltas The encoded deltas, stored as a raw buffer of 4 byte components. - //! @param bufferNamePrefix A prefix that can be used to identify this morph target when creating names for the buffers. - void AddMorphTarget(float minWeight, float maxWeight, float minDelta, float maxDelta, uint32_t vertexCount, const AZStd::vector& deltas, const AZStd::string& bufferNamePrefix); + //! Creates a view into the larger morph target buffer to be used for applying an individual morph + //! @param metaAsset The metadata that has info such as the min/max weight, offset, and vertex count for the morph + //! @param morphBufferAsset The the combined buffer that has all the deltas for all morph targets in the model lod + //! @param bufferNamePrefix A prefix that can be used to identify this morph target when creating the view into the morph target buffer. + //! @param minWeight The minimum weight that might be applied to this morph target. It's possible for the weight of a morph target to be outside the 0-1 range. Defaults to 0 + //! @param maxWeight The maximum weight that might be applied to this morph target. It's possible for the weight of a morph target to be outside the 0-1 range. Defaults to 1 + void AddMorphTarget(const RPI::MorphTargetMetaAsset::MorphTarget& metaAsset, const Data::Asset& morphBufferAsset, const AZStd::string& bufferNamePrefix, float minWeight, float maxWeight); //! Get the MetaDatas for all the morph targets that can be applied to an instance of this skinned mesh const AZStd::vector& GetMorphTargetMetaDatas() const; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h index 06617ed20f..07dbd94490 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h @@ -88,6 +88,10 @@ namespace AZ FrameCaptureOutputResult DdsFrameCaptureOutput( const AZStd::string& outputFilePath, const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult); + //! Writes out content of ReadbackResult in the Ppm image format. + FrameCaptureOutputResult PpmFrameCaptureOutput( + const AZStd::string& outputFilePath, const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult); + } // namespace Render AZ_TYPE_INFO_SPECIALIZE(Render::FrameCaptureResult, "{F0B013CE-DFAE-4743-B123-EB1EE1705E03}"); diff --git a/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h index c0c2a2b13d..6fc1ac0e30 100644 --- a/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h @@ -33,7 +33,8 @@ namespace UnitTest MOCK_METHOD2(ConnectModelChangeEventHandler, void(const MeshHandle&, ModelChangedEvent::Handler&)); MOCK_METHOD2(SetTransform, void(const MeshHandle&, const AZ::Transform&)); MOCK_METHOD2(SetExcludeFromReflectionCubeMaps, void(const MeshHandle&, bool)); - MOCK_METHOD2(SetMaterialAssignmentMap, void (const MeshHandle&, const AZ::Render::MaterialAssignmentMap&)); + MOCK_METHOD2(SetMaterialAssignmentMap, void(const MeshHandle&, const AZ::Data::Instance&)); + MOCK_METHOD2(SetMaterialAssignmentMap, void(const MeshHandle&, const AZ::Render::MaterialAssignmentMap&)); MOCK_METHOD1(GetTransform, AZ::Transform (const MeshHandle&)); MOCK_METHOD2(SetSortKey, void (const MeshHandle&, AZ::RHI::DrawItemSortKey)); MOCK_METHOD1(GetSortKey, AZ::RHI::DrawItemSortKey(const MeshHandle&)); diff --git a/Gems/Atom/Feature/Common/Code/Source/ACES/Aces.cpp b/Gems/Atom/Feature/Common/Code/Source/ACES/Aces.cpp deleted file mode 100644 index 999daefa4b..0000000000 --- a/Gems/Atom/Feature/Common/Code/Source/ACES/Aces.cpp +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright(c) 2016, NVIDIA CORPORATION.All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met : -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and / or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Modifications copyright Amazon.com, Inc. or its affiliates. -// - -// -// ACES implementation -// This implementation is partially ported from NVIDIA HDR sample. -// https://developer.nvidia.com/high-dynamic-range-display-development -// - -#include - -namespace AZ -{ - namespace Render - { - SegmentedSplineParamsC9 GetAcesODTParameters(OutputDeviceTransformType odtType) - { - // ACES reference values for ODT - // https://github.com/ampas/aces-dev/blob/master/transforms/ctl/lib/ACESlib.Tonescales.ctl - static const SegmentedSplineParamsC9 ODT_48nits = - { - // coefs - { - Vector4(-1.69896996, 0.515438676, 0, 0), - Vector4(-1.69896996, 0.847043753, 0, 0), - Vector4(-1.47790003, 1.1358, 0, 0), - Vector4(-1.22909999, 1.38020003, 0, 0), - Vector4(-0.864799976, 1.51970005, 0, 0), - Vector4(-0.448000014, 1.59850001, 0, 0), - Vector4(0.00517999986, 1.64670002, 0, 0), - Vector4(0.451108038, 1.67460918, 0, 0), - Vector4(0.911374450, 1.68787336, 0, 0), - Vector4(0.911374450, 1.68787336, 0, 0) - }, - { 0.0028798957, 0.02 }, // minPoint - { 4.79999924, 4.80000019 }, // midPoint - { 1005.71912, 48.0 }, // maxPoint - 0.0, // slopeLow - 0.04 // slopeHigh - }; - static const SegmentedSplineParamsC9 ODT_1000nits = - { - // coefs - { - Vector4(-4.9706219331, 0.8089132070, 0, 0), - Vector4(-3.0293780669, 1.1910867930, 0, 0), - Vector4(-2.1262, 1.5683, 0, 0), - Vector4(-1.5105, 1.9483, 0, 0), - Vector4(-1.0578, 2.3083, 0, 0), - Vector4(-0.4668, 2.6384, 0, 0), - Vector4(0.11938, 2.8595, 0, 0), - Vector4(0.7088134201, 2.9872608805, 0, 0), - Vector4(1.2911865799, 3.0127391195, 0, 0), - Vector4(1.2911865799, 3.0127391195, 0, 0) - }, - { 0.000141798664, 0.00499999989 }, // minPoint - { 4.79999924, 10.0 }, // midPoint - { 4505.08252, 1000.0 }, // maxPoint - 0.0, // slopeLow - 0.0599999987 // slopeHigh - }; - static const SegmentedSplineParamsC9 ODT_2000nits = - { - // coefs - { - Vector4(-4.9706219331, 0.8019952042, 0, 0), - Vector4(-3.0293780669, 1.1980047958, 0, 0), - Vector4(-2.1262, 1.5943000000, 0, 0), - Vector4(-1.5105, 1.9973000000, 0, 0), - Vector4(-1.0578, 2.3783000000, 0, 0), - Vector4(-0.4668, 2.7684000000, 0, 0), - Vector4(0.11938, 3.0515000000, 0, 0), - Vector4(0.7088134201, 3.2746293562, 0, 0), - Vector4(1.2911865799, 3.3274306351, 0, 0), - Vector4(1.2911865799, 3.3274306351, 0, 0) - }, - { 0.000141798664, 0.00499999989 }, // minPoint - { 4.79999924, 10.0 }, // midPoint - { 5771.86377, 2000.0 }, // maxPoint - 0.0, // slopeLow - 0.119999997 // slopeHigh - }; - static const SegmentedSplineParamsC9 ODT_4000nits = - { - // coefs - { - Vector4(-4.9706219331, 0.7973186613, 0, 0), - Vector4(-3.0293780669, 1.2026813387, 0, 0), - Vector4(-2.1262, 1.6093000000, 0, 0), - Vector4(-1.5105, 2.0108000000, 0, 0), - Vector4(-1.0578, 2.4148000000, 0, 0), - Vector4(-0.4668, 2.8179000000, 0, 0), - Vector4(0.11938, 3.1725000000, 0, 0), - Vector4(0.7088134201, 3.5344995451, 0, 0), - Vector4(1.2911865799, 3.6696204376, 0, 0), - Vector4(1.2911865799, 3.6696204376 , 0, 0) - }, - { 0.000141798664, 0.00499999989 }, // minPoint - { 4.79999924, 10.0 }, // midPoint - { 6824.36279, 4000.0 }, // maxPoint - 0.0, // slopeLow - 0.300000023 // slopeHigh - }; - - AZ_Assert(static_cast(odtType) < static_cast(NumOutputDeviceTransformTypes), "Invalid ODT type specified."); - switch(odtType) - { - case OutputDeviceTransformType_48Nits: - return ODT_48nits; - break; - case OutputDeviceTransformType_1000Nits: - return ODT_1000nits; - break; - case OutputDeviceTransformType_2000Nits: - return ODT_2000nits; - break; - case OutputDeviceTransformType_4000Nits: - return ODT_4000nits; - break; - default: - AZ_Assert(false, "Invalid ODT type specified."); - break; - } - return ODT_48nits; - } - - ShaperParams GetAcesShaperParameters(OutputDeviceTransformType odtType) - { - AZ_Assert(static_cast(odtType) < static_cast(NumOutputDeviceTransformTypes), "Invalid ODT type specified."); - - ShaperParams shaperParams; - - // These values represent and low and high end of the dynamic range in terms of stops from middle grey (0.18) - float lowerDynamicRangeInStops; - float higherDynamicRangeInStops; - const float MIDDLE_GREY = 0.18f; - - switch (odtType) - { - case OutputDeviceTransformType_48Nits: - lowerDynamicRangeInStops = -6.5f; - higherDynamicRangeInStops = 6.5f; - break; - case OutputDeviceTransformType_1000Nits: - lowerDynamicRangeInStops = -12.f; - higherDynamicRangeInStops = 10.f; - break; - case OutputDeviceTransformType_2000Nits: - lowerDynamicRangeInStops = -12.f; - higherDynamicRangeInStops = 11.f; - break; - case OutputDeviceTransformType_4000Nits: - lowerDynamicRangeInStops = -12.f; - higherDynamicRangeInStops = 12.f; - break; - default: - AZ_Assert(false, "Invalid output device transform type."); - return shaperParams; - break; - } - - float logMin = log2(MIDDLE_GREY * exp2(lowerDynamicRangeInStops)); - float logMax = log2(MIDDLE_GREY * exp2(higherDynamicRangeInStops)); - shaperParams.scale = 1.0f / (logMax - logMin); - shaperParams.bias = -shaperParams.scale * logMin; - shaperParams.type = ShaperType::Log2; - return shaperParams; - } - - Matrix3x3 GetColorConvertionMatrix(ColorConvertionMatrixType type) - { - static const Matrix3x3 ColorConvertionMatrices[] = - { - // XYZ to rec709 - Matrix3x3::CreateFromRows( - Vector3(3.24096942f, -1.53738296f, -0.49861076f), - Vector3(-0.96924388f, 1.87596786f, 0.04155510f), - Vector3(0.05563002f, -0.20397684f, 1.05697131f) - ), - // rec709 to XYZ - Matrix3x3::CreateFromRows( - Vector3(0.41239089f, 0.35758430f, 0.18048084f), - Vector3(0.21263906f, 0.71516860f, 0.07219233f), - Vector3(0.01933082f, 0.11919472f, 0.95053232f) - ), - // XYZ to bt2020 - Matrix3x3::CreateFromRows( - Vector3(1.71665096f, -0.35567081f, -0.25336623f), - Vector3(-0.66668433f, 1.61648130f, 0.01576854f), - Vector3(0.01763985f, -0.04277061f, 0.94210327f) - ), - // bt2020 to XYZ - Matrix3x3::CreateFromRows( - Vector3(0.63695812f, 0.14461692f, 0.16888094f), - Vector3(0.26270023f, 0.67799807f, 0.05930171f), - Vector3(0.00000000f, 0.02807269f, 1.06098485f) - ) - }; - - AZ_Assert(static_cast(type) < static_cast(NumColorConvertionMatrixTypes), "Invalid color convertion matrix type specified."); - - if (type < NumColorConvertionMatrixTypes) - { - return ColorConvertionMatrices[type]; - } - else - { - return ColorConvertionMatrices[0]; - } - } - - } // namespace Render -} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/ACES/AcesDisplayMapperFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/ACES/AcesDisplayMapperFeatureProcessor.cpp index de6ea53075..4cb0410d76 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ACES/AcesDisplayMapperFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ACES/AcesDisplayMapperFeatureProcessor.cpp @@ -11,7 +11,7 @@ */ #include -#include +#include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.cpp index 0f9b411420..d11a503280 100644 --- a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.cpp @@ -173,10 +173,12 @@ namespace AZ if (useManualViewProjectionOverride) { srg->SetConstant(m_shaderData.m_viewProjectionOverrideIndex, bufferData->m_viewProjOverrides[primitive.m_viewProjOverrideIndex]); + m_shaderData.m_viewProjectionOverrideIndex.AssertValid(); } if (primitive.m_primitiveType == PrimitiveType_PointList) { srg->SetConstant(m_shaderData.m_pointSizeIndex, aznumeric_cast(primitive.m_width)); + m_shaderData.m_pointSizeIndex.AssertValid(); } pipelineState->UpdateSrgVariantFallback(srg); srg->Compile(); @@ -284,9 +286,12 @@ namespace AZ auto* mappedData = reinterpret_cast(mapResponse.m_data); - memcpy(mappedData, source, sourceSize); + if (mappedData) + { + memcpy(mappedData, source, sourceSize); - m_hostPool->UnmapBuffer(*buffer); + m_hostPool->UnmapBuffer(*buffer); + } } } @@ -413,6 +418,11 @@ namespace AZ const char* auxGeomWorldShaderFilePath = "Shaders/auxgeom/auxgeomworld.azshader"; m_shader = RPI::LoadShader(auxGeomWorldShaderFilePath); + if (!m_shader) + { + AZ_Error("DynamicPrimitiveProcessor", false, "Failed to get shader"); + return; + } // Get the per-object SRG and store the indices of the data we need to set per object m_shaderData.m_perDrawSrgAsset = m_shader->FindShaderResourceGroupAsset(Name{ "PerDrawSrg" }); @@ -424,13 +434,8 @@ namespace AZ const RHI::ShaderResourceGroupLayout* shaderResourceGroupLayout = m_shaderData.m_perDrawSrgAsset->GetLayout(); - static const char* const viewProjectionOverride("m_viewProjectionOverride"); - static const char* const PointSize("m_pointSize"); - m_shaderData.m_viewProjectionOverrideIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(Name(viewProjectionOverride)); - AZ_Error("DynamicPrimitiveProcessor", m_shaderData.m_viewProjectionOverrideIndex.IsValid(), "Failed to find shader input constant %s.", viewProjectionOverride); - - m_shaderData.m_pointSizeIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(Name(PointSize)); - AZ_Error("DynamicPrimitiveProcessor", m_shaderData.m_pointSizeIndex.IsValid(), "Failed to find shader input constant %s.", PointSize); + m_shaderData.m_viewProjectionOverrideIndex.Reset(); + m_shaderData.m_pointSizeIndex.Reset(); // Remember the draw list tag m_shaderData.m_drawListTag = m_shader->GetDrawListTag(); diff --git a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.h b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.h index fa87b6e3d9..a23cad7962 100644 --- a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/DynamicPrimitiveProcessor.h @@ -104,8 +104,8 @@ namespace AZ Data::Instance m_defaultSRG; // default SRG for draws not overriding the view projection matrix AZ::RHI::DrawListTag m_drawListTag; // The draw list tag from our shader variant (determines which views primitives are in and which pass) - AZ::RHI::ShaderInputConstantIndex m_viewProjectionOverrideIndex; - AZ::RHI::ShaderInputConstantIndex m_pointSizeIndex; + AZ::RHI::ShaderInputNameIndex m_viewProjectionOverrideIndex = "m_viewProjectionOverride"; + AZ::RHI::ShaderInputNameIndex m_pointSizeIndex = "m_pointSize"; }; struct PipelineStateOptions diff --git a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.cpp index 6d0c948b12..793bf08dbe 100644 --- a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.cpp @@ -34,15 +34,6 @@ namespace AZ { namespace Render { - namespace ShaderInputs - { - static const char* const Color("m_color"); - static const char* const ModelToWorld("m_modelToWorld"); - static const char* const NormalMatrix("m_normalMatrix"); - static const char* const ViewProjectionOverride("m_viewProjectionOverride"); - static const char* const PointSize("m_pointSize"); - } - namespace { static const char* const ShapePerspectiveTypeViewProjection = "ViewProjectionMode::ViewProjection"; @@ -1199,7 +1190,7 @@ namespace AZ if (result != AZ::RHI::ResultCode::Success) { - AZ_Error("FixedShapeProcessor", false, "Failed to initialize shape index buffer with error code: %d", result); + AZ_Error( "FixedShapeProcessor", false, "Failed to initialize shape index buffer with error code: %d", result); return false; } @@ -1389,23 +1380,6 @@ namespace AZ AZ_Error("FixedShapeProcessor", false, "Shader resource group asset is not loaded"); return; } - - const RHI::ShaderResourceGroupLayout* shaderResourceGroupLayout = shaderData.m_perObjectSrgAsset->GetLayout(); - - shaderData.m_colorIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(Name(ShaderInputs::Color)); - AZ_Error("FixedShapeProcessor", shaderData.m_colorIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::Color); - - shaderData.m_modelToWorldIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(Name(ShaderInputs::ModelToWorld)); - AZ_Error("FixedShapeProcessor", shaderData.m_modelToWorldIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::ModelToWorld); - - shaderData.m_normalMatrixIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(Name(ShaderInputs::NormalMatrix)); - // Not all srg's have this index, don't error out - - shaderData.m_viewProjectionOverrideIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(Name(ShaderInputs::ViewProjectionOverride)); - AZ_Error("FixedShapeProcessor", shaderData.m_viewProjectionOverrideIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::ViewProjectionOverride); - - shaderData.m_pointSizeIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(Name(ShaderInputs::PointSize)); - AZ_Error("FixedShapeProcessor", shaderData.m_pointSizeIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::PointSize); shaderData.m_drawListTag = shader->GetDrawListTag(); } @@ -1628,13 +1602,18 @@ namespace AZ srg->Compile(); m_processSrgs.push_back(srg); + if (m_shapes[shape.m_shapeType].m_lodBuffers.size() > 0) + { + uint32_t indexCount = GetShapeIndexCount(shape.m_shapeType, drawStyle, lodIndex); + auto& indexBufferView = GetShapeIndexBufferView(shape.m_shapeType, drawStyle, lodIndex); + auto& streamBufferViews = GetShapeStreamBufferViews(shape.m_shapeType, lodIndex, drawStyle); + auto& drawListTag = shaderData.m_drawListTag; - uint32_t indexCount = GetShapeIndexCount(shape.m_shapeType, drawStyle, lodIndex); - auto& indexBufferView = GetShapeIndexBufferView(shape.m_shapeType, drawStyle, lodIndex); - auto& streamBufferViews = GetShapeStreamBufferViews(shape.m_shapeType, lodIndex, drawStyle); - auto& drawListTag = shaderData.m_drawListTag; - - return BuildDrawPacket(drawPacketBuilder, srg, indexCount, indexBufferView, streamBufferViews, drawListTag, pipelineState->GetRHIPipelineState(), sortKey); + return BuildDrawPacket( + drawPacketBuilder, srg, indexCount, indexBufferView, streamBufferViews, drawListTag, + pipelineState->GetRHIPipelineState(), sortKey); + } + return nullptr; } const AZ::RHI::IndexBufferView& FixedShapeProcessor::GetBoxIndexBufferView(int drawStyle) const diff --git a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.h b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.h index 450a510d2b..3e898b47c2 100644 --- a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/FixedShapeProcessor.h @@ -246,11 +246,11 @@ namespace AZ { AZ::Data::Asset m_perObjectSrgAsset; AZ::RHI::DrawListTag m_drawListTag; - AZ::RHI::ShaderInputConstantIndex m_colorIndex; - AZ::RHI::ShaderInputConstantIndex m_modelToWorldIndex; - AZ::RHI::ShaderInputConstantIndex m_normalMatrixIndex; - AZ::RHI::ShaderInputConstantIndex m_viewProjectionOverrideIndex; - AZ::RHI::ShaderInputConstantIndex m_pointSizeIndex; + AZ::RHI::ShaderInputNameIndex m_colorIndex = "m_color"; + AZ::RHI::ShaderInputNameIndex m_modelToWorldIndex = "m_modelToWorld"; + AZ::RHI::ShaderInputNameIndex m_normalMatrixIndex = "m_normalMatrix"; + AZ::RHI::ShaderInputNameIndex m_viewProjectionOverrideIndex = "m_viewProjectionOverride"; + AZ::RHI::ShaderInputNameIndex m_pointSizeIndex = "m_pointSize"; }; ShaderData m_perObjectShaderData[ShapeLightingStyle_Count]; ShaderData& GetShaderDataForDrawStyle(int drawStyle) {return m_perObjectShaderData[drawStyle == DrawStyle_Shaded];} diff --git a/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.cpp b/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.cpp index f84e925437..3ebb6b370c 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.cpp @@ -32,20 +32,8 @@ namespace AZ { } - void CheckerboardColorResolvePass::Init() - { - m_constantsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(AZ::Name("m_constants")); - AZ_Assert(m_constantsIndex.IsValid(), "Unable to find m_constants in shader"); - m_initialized = true; - } - void CheckerboardColorResolvePass::FrameBeginInternal(FramePrepareParams params) { - if (!m_initialized) - { - Init(); - } - // Import input attachments since some of them might be from last frame auto attachmentDatabase = params.m_frameGraphBuilder->GetAttachmentDatabase(); for (const RPI::PassAttachmentBinding& binding : m_attachmentBindings) diff --git a/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.h b/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.h index d0a6aead0a..8cb15d5f49 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardColorResolvePass.h @@ -58,16 +58,12 @@ namespace AZ // Scope producer functions... void CompileResources(const RHI::FrameGraphCompileContext& context) override; - // one time initialization - void Init(); - private: CheckerboardColorResolvePass() = delete; explicit CheckerboardColorResolvePass(const RPI::PassDescriptor& descriptor); - AZ::RHI::ShaderInputConstantIndex m_constantsIndex; + RHI::ShaderInputNameIndex m_constantsIndex = "m_constants"; - bool m_initialized = false; Matrix4x4 m_prevClipToWorld; uint8_t m_frameOffset = 0; DebugRenderType m_debugRenderType = DebugRenderType::None; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp index 2bd15177e8..2f4ab96f31 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp @@ -158,7 +158,7 @@ namespace AZ m_lightBufferHandler = GpuBufferHandler(desc); - m_shadowIndexDirectionalLightIndex = viewSrgLayout->FindShaderInputConstantIndex(Name("m_shadowIndexDirectionalLight")); + m_shadowIndexDirectionalLightIndex.Reset(); m_auxGeomFeatureProcessor = GetParentScene()->GetFeatureProcessor(); diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h index b46ca1966b..48a9b15dab 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h @@ -352,7 +352,7 @@ namespace AZ AZStd::unordered_map m_shadowBufferHandlers; AZStd::unordered_map> m_shadowData; - RHI::ShaderInputConstantIndex m_shadowIndexDirectionalLightIndex; + RHI::ShaderInputNameIndex m_shadowIndexDirectionalLightIndex = "m_shadowIndexDirectionalLight"; AZStd::unordered_map> m_renderPipelineIdsForPersistentView; AZStd::unordered_map m_cameraViewNames; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp index 748183e621..adc90bcb5a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp @@ -116,33 +116,18 @@ namespace AZ LightCullingPass::LightCullingPass(const RPI::PassDescriptor& descriptor) : RPI::ComputePass(descriptor) { - m_lightdata[eLightTypes_Point].m_lightCountNameInShader = AZ::Name("m_pointLightCount"); - m_lightdata[eLightTypes_Point].lightBufferNameInShader = AZ::Name("m_pointLights"); - m_lightdata[eLightTypes_Spot].m_lightCountNameInShader = AZ::Name("m_spotLightCount"); - m_lightdata[eLightTypes_Spot].lightBufferNameInShader = AZ::Name("m_spotLights"); - m_lightdata[eLightTypes_Disk].m_lightCountNameInShader = AZ::Name("m_diskLightCount"); - m_lightdata[eLightTypes_Disk].lightBufferNameInShader = AZ::Name("m_diskLights"); - m_lightdata[eLightTypes_Capsule].m_lightCountNameInShader = AZ::Name("m_capsuleLightCount"); - m_lightdata[eLightTypes_Capsule].lightBufferNameInShader = AZ::Name("m_capsuleLights"); - m_lightdata[eLightTypes_Quad].m_lightCountNameInShader = AZ::Name("m_quadLightCount"); - m_lightdata[eLightTypes_Quad].lightBufferNameInShader = AZ::Name("m_quadLights"); - m_lightdata[eLightTypes_Decal].m_lightCountNameInShader = AZ::Name("m_decalCount"); - m_lightdata[eLightTypes_Decal].lightBufferNameInShader = AZ::Name("m_decals"); - } - - void LightCullingPass::Init() - { - CacheSrgIndices(); - m_initialized = true; - } - - void LightCullingPass::SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) - { - if (!m_initialized) - { - Init(); - } - ComputePass::SetupFrameGraphDependencies(frameGraph); + m_lightdata[eLightTypes_Point].m_lightCountIndex = Name("m_pointLightCount"); + m_lightdata[eLightTypes_Point].m_lightBufferIndex = Name("m_pointLights"); + m_lightdata[eLightTypes_Spot].m_lightCountIndex = Name("m_spotLightCount"); + m_lightdata[eLightTypes_Spot].m_lightBufferIndex = Name("m_spotLights"); + m_lightdata[eLightTypes_Disk].m_lightCountIndex = Name("m_diskLightCount"); + m_lightdata[eLightTypes_Disk].m_lightBufferIndex = Name("m_diskLights"); + m_lightdata[eLightTypes_Capsule].m_lightCountIndex = Name("m_capsuleLightCount"); + m_lightdata[eLightTypes_Capsule].m_lightBufferIndex = Name("m_capsuleLights"); + m_lightdata[eLightTypes_Quad].m_lightCountIndex = Name("m_quadLightCount"); + m_lightdata[eLightTypes_Quad].m_lightBufferIndex = Name("m_quadLights"); + m_lightdata[eLightTypes_Decal].m_lightCountIndex = Name("m_decalCount"); + m_lightdata[eLightTypes_Decal].m_lightBufferIndex = Name("m_decals"); } void LightCullingPass::CompileResources(const RHI::FrameGraphCompileContext& context) @@ -192,9 +177,10 @@ namespace AZ void LightCullingPass::SetLightBuffersToSRG() { - for (const auto& elem : m_lightdata) + for (auto& elem : m_lightdata) { m_shaderResourceGroup->SetBuffer(elem.m_lightBufferIndex, elem.m_lightBuffer.get()); + elem.m_lightBufferIndex.AssertValid(); } } @@ -207,9 +193,10 @@ namespace AZ void LightCullingPass::SetLightsCountToSRG() { - for (const auto& elem : m_lightdata) + for (auto& elem : m_lightdata) { m_shaderResourceGroup->SetConstant(elem.m_lightCountIndex, elem.m_lightCount); + elem.m_lightCountIndex.AssertValid(); } } @@ -312,37 +299,6 @@ namespace AZ m_lightdata[eLightTypes_Decal].m_lightCount = decalFP->GetDecalCount(); } - void LightCullingPass::CacheSrgIndices() - { - CacheConstantData(); - CacheLightCounts(); - CacheLightBuffer(); - } - - void LightCullingPass::CacheConstantData() - { - m_constantDataIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(AZ::Name("m_constantData")); - AZ_Assert(m_constantDataIndex.IsValid(), "Unable to find m_constantData in shader"); - } - - void LightCullingPass::CacheLightCounts() - { - for (auto& elem : m_lightdata) - { - elem.m_lightCountIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(elem.m_lightCountNameInShader); - AZ_Assert(elem.m_lightCountIndex.IsValid(), "Unable to find variable name in shader") - } - } - - void LightCullingPass::CacheLightBuffer() - { - for (auto& elem : m_lightdata) - { - elem.m_lightBufferIndex = m_shaderResourceGroup->FindShaderInputBufferIndex(elem.lightBufferNameInShader); - AZ_Assert(elem.m_lightBufferIndex.IsValid(), "Unable to find lightbuffer in shader") - } - } - float LightCullingPass::CreateTraceValues(const AZ::Vector2& unprojection) { RHI::Size numTiles = GetTileDataBufferResolution(); diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h index 06a7e247d7..7dd68e279b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h @@ -53,17 +53,9 @@ namespace AZ void BuildAttachmentsInternal() override; // Scope producer functions... - void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; void CompileResources(const RHI::FrameGraphCompileContext& context) override; void BuildCommandListInternal(const RHI::FrameGraphExecuteContext& context) override; - void Init(); - - void CacheSrgIndices(); - void CacheLightCounts(); - void CacheConstantData(); - void CacheLightBuffer(); - void SetLightBuffersToSRG(); void SetLightsCountToSRG(); void SetConstantdataToSRG(); @@ -83,12 +75,9 @@ namespace AZ AZ::RHI::Size GetTileDataBufferResolution(); struct LightTypeData { - AZ::Name m_lightCountNameInShader; - AZ::Name lightBufferNameInShader; - - Data::Instance m_lightBuffer; - AZ::RHI::ShaderInputBufferIndex m_lightBufferIndex; - AZ::RHI::ShaderInputConstantIndex m_lightCountIndex; + Data::Instance m_lightBuffer; + AZ::RHI::ShaderInputNameIndex m_lightBufferIndex; + AZ::RHI::ShaderInputNameIndex m_lightCountIndex; int m_lightCount = 0; }; @@ -105,7 +94,7 @@ namespace AZ AZStd::array m_lightdata; - AZ::RHI::ShaderInputConstantIndex m_constantDataIndex; + AZ::RHI::ShaderInputNameIndex m_constantDataIndex = "m_constantData"; bool m_initialized = false; Data::Instance m_lightList; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.cpp index da126d8236..e651f512d2 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.cpp @@ -38,7 +38,6 @@ namespace AZ , m_msaaMode4xName("MsaaMode::Msaa4x") , m_msaaMode8xName("MsaaMode::Msaa8x") , m_msaaOptionName("o_msaaMode") - , m_constantDataName("m_constantData") { } @@ -171,8 +170,6 @@ namespace AZ void LightCullingTilePreparePass::BuildAttachmentsInternal() { ChooseShaderVariant(); - m_constantDataIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(m_constantDataName); - AZ_Assert(m_constantDataIndex.IsValid(), "m_constantData not found in shader"); } void LightCullingTilePreparePass::OnShaderReinitialized(const AZ::RPI::Shader&) diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.h index a6ffaedba7..efba105912 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingTilePreparePass.h @@ -73,7 +73,8 @@ namespace AZ const AZ::RPI::ShaderVariant& CreateShaderVariant(); void CreatePipelineStateFromShaderVariant(const RPI::ShaderVariant& shaderVariant); void SetConstantData(); - AZ::RHI::ShaderInputConstantIndex m_constantDataIndex; + + AZ::RHI::ShaderInputNameIndex m_constantDataIndex = "m_constantData"; // The shader variant (for choosing the different MSAA version) is sent to the RHI via the PipelineState AZ::RHI::ConstPtr m_msaaPipelineState; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/ShadowmapPass.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/ShadowmapPass.cpp index 413396801d..087a73a94d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/ShadowmapPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/ShadowmapPass.cpp @@ -42,7 +42,7 @@ namespace AZ passConnection.m_localSlot = Name{ "SkinnedMeshes" }; passConnection.m_attachmentRef.m_pass = Name{ "Parent" }; passConnection.m_attachmentRef.m_attachment = Name{ "SkinnedMeshes" }; - childRequest.m_inputConnections.emplace_back(passConnection); + childRequest.m_connections.emplace_back(passConnection); // Get the template AZStd::shared_ptr childTemplate = RPI::PassSystemInterface::Get()->GetPassTemplate(childRequest.m_templateName); @@ -77,8 +77,8 @@ namespace AZ skinnedMeshSlot.m_slotType = RPI::PassSlotType::Input; skinnedMeshSlot.m_scopeAttachmentUsage = RHI::ScopeAttachmentUsage::InputAssembly; - m_childTemplate->m_outputConnections.resize(1); - RPI::PassConnection& connection = m_childTemplate->m_outputConnections[0]; + m_childTemplate->m_connections.resize(1); + RPI::PassConnection& connection = m_childTemplate->m_connections[0]; connection.m_localSlot = Name{ "Shadowmap" }; connection.m_attachmentRef.m_pass = Name{ "Parent" }; connection.m_attachmentRef.m_attachment = Name{ "Shadowmap" }; diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp index 9fb0f744b5..b2103739ba 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp @@ -11,7 +11,7 @@ */ #include -#include +#include #include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp index 251e245e36..1de92c42f6 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp @@ -11,7 +11,7 @@ */ #include -#include +#include #include #include #include @@ -239,8 +239,8 @@ namespace AZ outSlot.m_scopeAttachmentUsage = RHI::ScopeAttachmentUsage::RenderTarget; outSlot.m_loadStoreAction.m_loadAction = RHI::AttachmentLoadAction::DontCare; - passTemplate->m_outputConnections.resize(1); - RPI::PassConnection& outConnection = passTemplate->m_outputConnections[0]; + passTemplate->m_connections.resize(1); + RPI::PassConnection& outConnection = passTemplate->m_connections[0]; if (renderToOwnedImage) { // If rendering to it's own image attachment diff --git a/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp b/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp index f85598bb79..f1c41576ef 100644 --- a/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp @@ -50,6 +50,28 @@ namespace AZ : FrameCaptureOutputResult{FrameCaptureResult::InternalError, outcome.GetError().m_message}; } + FrameCaptureOutputResult PpmFrameCaptureOutput( + const AZStd::string& outputFilePath, const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult) + { + // write the read back result of the image attachment to a buffer + const AZStd::vector outBuffer = Utils::PpmFile::CreatePpmFromImageBuffer( + *readbackResult.m_dataBuffer.get(), readbackResult.m_imageDescriptor.m_size, readbackResult.m_imageDescriptor.m_format); + + // write the buffer to a ppm file + if (IO::FileIOStream fileStream(outputFilePath.c_str(), IO::OpenMode::ModeWrite | IO::OpenMode::ModeCreatePath); + fileStream.IsOpen()) + { + fileStream.Write(outBuffer.size(), outBuffer.data()); + fileStream.Close(); + + return FrameCaptureOutputResult{FrameCaptureResult::Success, AZStd::nullopt}; + } + + return FrameCaptureOutputResult{ + FrameCaptureResult::FileWriteError, + AZStd::string::format("Failed to open file %s for writing", outputFilePath.c_str())}; + } + class FrameCaptureNotificationBusHandler final : public FrameCaptureNotificationBus::Handler , public AZ::BehaviorEBusHandler @@ -376,29 +398,17 @@ namespace AZ if (extension == "ppm") { - if (readbackResult.m_imageDescriptor.m_format == RHI::Format::R8G8B8A8_UNORM || readbackResult.m_imageDescriptor.m_format == RHI::Format::B8G8R8A8_UNORM) + if (readbackResult.m_imageDescriptor.m_format == RHI::Format::R8G8B8A8_UNORM || + readbackResult.m_imageDescriptor.m_format == RHI::Format::B8G8R8A8_UNORM) { - const AZStd::vector outBuffer = Utils::PpmFile::CreatePpmFromImageBuffer(*readbackResult.m_dataBuffer.get(), - readbackResult.m_imageDescriptor.m_size, readbackResult.m_imageDescriptor.m_format); - - IO::FileIOStream fileStream(m_outputFilePath.c_str(), IO::OpenMode::ModeWrite | IO::OpenMode::ModeCreatePath); - - if (fileStream.IsOpen()) - { - fileStream.Write(outBuffer.size(), outBuffer.data()); - fileStream.Close(); - m_result = FrameCaptureResult::Success; - } - else - { - m_latestCaptureInfo = AZStd::string::format("Failed to open file %s for writing", m_outputFilePath.c_str()); - m_result = FrameCaptureResult::FileWriteError; - } + const auto ppmFrameCapture = PpmFrameCaptureOutput(m_outputFilePath, readbackResult); + m_result = ppmFrameCapture.m_result; + m_latestCaptureInfo = ppmFrameCapture.m_errorMessage.value_or(""); } else { - m_latestCaptureInfo = AZStd::string::format("Can't save image with format %s to a ppm file", - RHI::ToString(readbackResult.m_imageDescriptor.m_format)); + m_latestCaptureInfo = AZStd::string::format( + "Can't save image with format %s to a ppm file", RHI::ToString(readbackResult.m_imageDescriptor.m_format)); m_result = FrameCaptureResult::UnsupportedFormat; } } diff --git a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp index f9390cdb97..2628eb9dc4 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp @@ -46,12 +46,6 @@ namespace AZ static const char* ImguiShaderFilePath = "Shaders/imgui/imgui.azshader"; } - namespace ShaderInputs - { - static const char* const FontImage("FontImage"); - static const char* const ProjectionMatrix("m_projectionMatrix"); - } - class ImguiContextScope { public: @@ -489,12 +483,6 @@ namespace AZ AZ_Error(PassName, false, "Failed to create shader resource group"); return; } - - m_fontImageIndex = m_resourceGroup->FindShaderInputImageIndex(Name(ShaderInputs::FontImage)); - AZ_Error(PassName, m_fontImageIndex.IsValid(), "Failed to find shader input image %s.", ShaderInputs::FontImage); - - m_projectionMatrixIndex = m_resourceGroup->FindShaderInputConstantIndex(Name(ShaderInputs::ProjectionMatrix)); - AZ_Error(PassName, m_projectionMatrixIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::ProjectionMatrix); } // Find or create font atlas @@ -661,6 +649,11 @@ namespace AZ auto vertexBuffer = RPI::DynamicDrawInterface::Get()->GetDynamicBuffer(totalVtxBufferSize); auto indexBuffer = RPI::DynamicDrawInterface::Get()->GetDynamicBuffer(totalIdxBufferSize); + if (!vertexBuffer || !indexBuffer) + { + return 0; + } + ImDrawIdx* indexBufferData = static_cast(indexBuffer->GetBufferAddress()); ImDrawVert* vertexBufferData = static_cast(vertexBuffer->GetBufferAddress()); diff --git a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h index 74c0318129..c8be0d7ee6 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h @@ -121,8 +121,8 @@ namespace AZ Data::Instance m_shader; Data::Instance m_resourceGroup; - RHI::ShaderInputImageIndex m_fontImageIndex; - RHI::ShaderInputConstantIndex m_projectionMatrixIndex; + RHI::ShaderInputNameIndex m_fontImageIndex = "FontImage"; + RHI::ShaderInputNameIndex m_projectionMatrixIndex = "m_projectionMatrix"; RHI::Viewport m_viewportState; RHI::IndexBufferView m_indexBufferView; diff --git a/Gems/Atom/Feature/Common/Code/Source/ImageBasedLights/ImageBasedLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/ImageBasedLights/ImageBasedLightFeatureProcessor.cpp index 80e7ab22b7..5db5bb2934 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ImageBasedLights/ImageBasedLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ImageBasedLights/ImageBasedLightFeatureProcessor.cpp @@ -37,12 +37,6 @@ namespace AZ { m_sceneSrg = GetParentScene()->GetShaderResourceGroup(); - // Find SRG index for global IBL - m_specularEnvMapIndex = m_sceneSrg->FindShaderInputImageIndex(Name{"m_specularEnvMap"}); - m_diffuseEnvMapIndex = m_sceneSrg->FindShaderInputImageIndex(Name{"m_diffuseEnvMap"}); - m_iblExposureConstantIndex = m_sceneSrg->FindShaderInputConstantIndex(Name{"m_iblExposure"}); - m_iblOrientationConstantIndex = m_sceneSrg->FindShaderInputConstantIndex(Name{"m_iblOrientation"}); - // Load default specular and diffuse cubemaps // These are assigned when Global IBL is disabled or removed from the scene to prevent a Vulkan TDR. // [GFX-TODO][ATOM-4181] This can be removed after Vulkan is changed to automatically handle this issue. @@ -51,9 +45,10 @@ namespace AZ void ImageBasedLightFeatureProcessor::Deactivate() { - m_iblExposureConstantIndex = {}; - m_diffuseEnvMapIndex = {}; - m_specularEnvMapIndex = {}; + m_iblOrientationConstantIndex.Reset(); + m_iblExposureConstantIndex.Reset(); + m_diffuseEnvMapIndex.Reset(); + m_specularEnvMapIndex.Reset(); m_sceneSrg = {}; } diff --git a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp index 08e0399f04..1f5b8ecc65 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp @@ -216,6 +216,15 @@ namespace AZ return meshHandle.IsValid() ? meshHandle->m_model : nullptr; } + void MeshFeatureProcessor::SetMaterialAssignmentMap(const MeshHandle& meshHandle, const Data::Instance& material) + { + Render::MaterialAssignmentMap materials; + Render::MaterialAssignment& defaultMaterial = materials[AZ::Render::DefaultMaterialAssignmentId]; + defaultMaterial.m_materialInstance = material; + + return SetMaterialAssignmentMap(meshHandle, materials); + } + void MeshFeatureProcessor::SetMaterialAssignmentMap(const MeshHandle& meshHandle, const MaterialAssignmentMap& materials) { if (meshHandle.IsValid()) @@ -507,14 +516,9 @@ namespace AZ if (m_shaderResourceGroup) { // Set object Id once since it never changes - Name objectId{ "m_objectId" }; - RHI::ShaderInputConstantIndex objectIdIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(objectId); - AZ_Warning("MeshFeatureProcessor", objectIdIndex.IsValid(), "Failed to find shader input constant %s.", objectId.GetCStr()); - - if (objectIdIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(objectIdIndex, m_objectId.GetIndex()); - } + RHI::ShaderInputNameIndex objectIdIndex = "m_objectId"; + m_shaderResourceGroup->SetConstant(objectIdIndex, m_objectId.GetIndex()); + objectIdIndex.AssertValid(); } if (m_rayTracingEnabled) @@ -886,27 +890,33 @@ namespace AZ if (m_useForwardPassIblSpecular) { - // retrieve probe constant structure index - AZ::RHI::ShaderInputConstantIndex m_reflectionProbeDataIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData")); - AZ_Error("MeshDataInstance", m_reflectionProbeDataIndex.IsValid(), "Failed to find ReflectionProbeData constant index"); + // retrieve probe constant indices + AZ::RHI::ShaderInputConstantIndex posConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_aabbPos")); + AZ_Error("MeshDataInstance", posConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index"); + + AZ::RHI::ShaderInputConstantIndex outerAabbMinConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_outerAabbMin")); + AZ_Error("MeshDataInstance", outerAabbMinConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index"); + + AZ::RHI::ShaderInputConstantIndex outerAabbMaxConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_outerAabbMax")); + AZ_Error("MeshDataInstance", outerAabbMaxConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index"); + + AZ::RHI::ShaderInputConstantIndex innerAabbMinConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_innerAabbMin")); + AZ_Error("MeshDataInstance", innerAabbMinConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index"); + + AZ::RHI::ShaderInputConstantIndex innerAabbMaxConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_innerAabbMax")); + AZ_Error("MeshDataInstance", innerAabbMaxConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index"); + + AZ::RHI::ShaderInputConstantIndex useReflectionProbeConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_useReflectionProbe")); + AZ_Error("MeshDataInstance", useReflectionProbeConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index"); + + AZ::RHI::ShaderInputConstantIndex useParallaxCorrectionConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_useParallaxCorrection")); + AZ_Error("MeshDataInstance", useParallaxCorrectionConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index"); // retrieve probe cubemap index Name reflectionCubeMapImageName = Name("m_reflectionProbeCubeMap"); RHI::ShaderInputImageIndex reflectionCubeMapImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(reflectionCubeMapImageName); AZ_Error("MeshDataInstance", reflectionCubeMapImageIndex.IsValid(), "Failed to find shader image index [%s]", reflectionCubeMapImageName.GetCStr()); - // must match the struct in DefaultObjectSrg.azsli - struct ReflectionProbeData - { - Vector3 m_aabbPos = Vector3(0.0f); - Vector3 m_outerAabbMin = Vector3(0.0f); - Vector3 m_outerAabbMax = Vector3(0.0f); - Vector3 m_innerAabbMin = Vector3(0.0f); - Vector3 m_innerAabbMax = Vector3(0.0f); - bool m_useReflectionProbe = false; - bool m_useParallaxCorrection = false; - } reflectionProbeData{}; - // retrieve the list of probes that contain the centerpoint of the mesh TransformServiceFeatureProcessor* transformServiceFeatureProcessor = m_scene->GetFeatureProcessor(); Transform transform = transformServiceFeatureProcessor->GetTransformForId(m_objectId); @@ -915,20 +925,22 @@ namespace AZ ReflectionProbeFeatureProcessor::ReflectionProbeVector reflectionProbes; reflectionProbeFeatureProcessor->FindReflectionProbes(transform.GetTranslation(), reflectionProbes); - if (!reflectionProbes.empty()) + if (!reflectionProbes.empty() && reflectionProbes[0]) { - reflectionProbeData.m_aabbPos = reflectionProbes[0]->GetPosition(); - reflectionProbeData.m_outerAabbMin = reflectionProbes[0]->GetOuterAabbWs().GetMin(); - reflectionProbeData.m_outerAabbMax = reflectionProbes[0]->GetOuterAabbWs().GetMax(); - reflectionProbeData.m_innerAabbMin = reflectionProbes[0]->GetInnerAabbWs().GetMin(); - reflectionProbeData.m_innerAabbMax = reflectionProbes[0]->GetInnerAabbWs().GetMax(); - reflectionProbeData.m_useReflectionProbe = true; - reflectionProbeData.m_useParallaxCorrection = reflectionProbes[0]->GetUseParallaxCorrection(); + m_shaderResourceGroup->SetConstant(posConstantIndex, reflectionProbes[0]->GetPosition()); + m_shaderResourceGroup->SetConstant(outerAabbMinConstantIndex, reflectionProbes[0]->GetOuterAabbWs().GetMin()); + m_shaderResourceGroup->SetConstant(outerAabbMaxConstantIndex, reflectionProbes[0]->GetOuterAabbWs().GetMax()); + m_shaderResourceGroup->SetConstant(innerAabbMinConstantIndex, reflectionProbes[0]->GetInnerAabbWs().GetMin()); + m_shaderResourceGroup->SetConstant(innerAabbMaxConstantIndex, reflectionProbes[0]->GetInnerAabbWs().GetMax()); + m_shaderResourceGroup->SetConstant(useReflectionProbeConstantIndex, true); + m_shaderResourceGroup->SetConstant(useParallaxCorrectionConstantIndex, reflectionProbes[0]->GetUseParallaxCorrection()); m_shaderResourceGroup->SetImage(reflectionCubeMapImageIndex, reflectionProbes[0]->GetCubeMapImage()); } - - m_shaderResourceGroup->SetConstant(m_reflectionProbeDataIndex, reflectionProbeData); + else + { + m_shaderResourceGroup->SetConstant(useReflectionProbeConstantIndex, false); + } } m_shaderResourceGroup->Compile(); diff --git a/Gems/Atom/Feature/Common/Code/Source/MorphTargets/MorphTargetInputBuffers.cpp b/Gems/Atom/Feature/Common/Code/Source/MorphTargets/MorphTargetInputBuffers.cpp index beb0f55f21..9a898f4693 100644 --- a/Gems/Atom/Feature/Common/Code/Source/MorphTargets/MorphTargetInputBuffers.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/MorphTargets/MorphTargetInputBuffers.cpp @@ -28,20 +28,18 @@ namespace AZ { namespace Render { - MorphTargetInputBuffers::MorphTargetInputBuffers(uint32_t vertexCount, const AZStd::vector& vertexDeltas, const AZStd::string& bufferNamePrefix) + MorphTargetInputBuffers::MorphTargetInputBuffers(const RPI::BufferAssetView& bufferAssetView, const AZStd::string& bufferNamePrefix) { - // There are four bytes per element in vertexDeltas - size_t deltaBufferSizeInBytes = vertexDeltas.size() * sizeof(uint32_t); - size_t deltaElementSizeInBytes = deltaBufferSizeInBytes / vertexCount; - AZ_Assert(deltaElementSizeInBytes % 16 == 0, "MorphTargetInputBuffers - Morph target deltas must be 16 byte aligned for structured buffers."); - RHI::BufferViewDescriptor deltaBufferViewDescriptor = RHI::BufferViewDescriptor::CreateStructured(0, vertexCount, deltaElementSizeInBytes); - - // Use the user-specified buffer name if it exits, or a default one otherwise. - const char* bufferName = !bufferNamePrefix.empty() ? bufferNamePrefix.c_str() : "MorphTargetDeltaBuffer"; - - // Create the actual buffer - Data::Asset bufferAsset = CreateBufferAsset(vertexDeltas.data(), deltaBufferViewDescriptor, RHI::BufferBindFlags::ShaderRead, SkinnedMeshVertexStreamPropertyInterface::Get()->GetInputStreamResourcePool(), bufferName); - m_vertexDeltas = RPI::Buffer::FindOrCreate(bufferAsset); + auto buffer = RPI::Buffer::FindOrCreate(bufferAssetView.GetBufferAsset()); + + AZ::RHI::Ptr bufferView = RHI::Factory::Get().CreateBufferView(); + { + bufferView->SetName(Name(bufferNamePrefix + "MorphTargetVertexDeltaView")); + RHI::ResultCode resultCode = bufferView->Init(*buffer->GetRHIBuffer(), bufferAssetView.GetBufferViewDescriptor()); + AZ_Error("MorphTargetInputBuffers", resultCode == RHI::ResultCode::Success, "Failed to initialize buffer view for morph target."); + } + + m_vertexDeltaBufferView = bufferView; } void MorphTargetInputBuffers::SetBufferViewsOnShaderResourceGroup(const Data::Instance& perInstanceSRG) @@ -50,7 +48,7 @@ namespace AZ RHI::ShaderInputBufferIndex srgIndex = perInstanceSRG->FindShaderInputBufferIndex(Name{ "m_vertexDeltas" }); AZ_Error("MorphTargetInputBuffers", srgIndex.IsValid(), "Failed to find shader input index for 'm_positionDeltas' in the skinning compute shader per-instance SRG."); - bool success = perInstanceSRG->SetBufferView(srgIndex, m_vertexDeltas->GetBufferView()); + bool success = perInstanceSRG->SetBufferView(srgIndex, m_vertexDeltaBufferView.get()); AZ_Error("MorphTargetInputBuffers", success, "Failed to bind buffer view for vertex deltas"); } } // namespace Render diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.cpp index 57464ff6ac..bad6afbc16 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.cpp @@ -66,11 +66,6 @@ namespace AZ auto viewSrg = GetDefaultViewSrg(); AZ_Assert(viewSrg, "DepthOfFieldSettings : Failed to get the default render pipeline's default viewSrg."); - m_cameraParametersIndex = viewSrg->FindShaderInputConstantIndex(Name("m_dof.m_cameraParameters")); - m_pencilMapTexcoordToCocRadiusIndex = viewSrg->FindShaderInputConstantIndex(Name("m_dof.m_pencilMapTexcoordToCocRadius")); - m_pencilMapFocusPointTexcoordUIndex = viewSrg->FindShaderInputConstantIndex(Name("m_dof.m_pencilMapFocusPointTexcoordU")); - m_cocToScreenRatioIndex = viewSrg->FindShaderInputConstantIndex(Name("m_dof.m_cocToScreenRatio")); - m_passListWithHashOfDivisionNumber.Insert(Name("FrontblurDivision2"), AZ::RHI::Handle(2)); m_passListWithHashOfDivisionNumber.Insert(Name("BackblurDivision2"), AZ::RHI::Handle(2)); m_passListWithHashOfDivisionNumber.Insert(Name("MaskDivision2"), AZ::RHI::Handle(2)); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.h b/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.h index 4800e907df..eeb1726cfb 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcess/DepthOfField/DepthOfFieldSettings.h @@ -122,10 +122,10 @@ namespace AZ void UpdateBlendFactor(); void UpdateAutoFocusDepth(bool enabled); - AZ::RHI::ShaderInputConstantIndex m_cameraParametersIndex; - AZ::RHI::ShaderInputConstantIndex m_pencilMapTexcoordToCocRadiusIndex; - AZ::RHI::ShaderInputConstantIndex m_pencilMapFocusPointTexcoordUIndex; - AZ::RHI::ShaderInputConstantIndex m_cocToScreenRatioIndex; + AZ::RHI::ShaderInputNameIndex m_cameraParametersIndex = "m_dof.m_cameraParameters"; + AZ::RHI::ShaderInputNameIndex m_pencilMapTexcoordToCocRadiusIndex = "m_dof.m_pencilMapTexcoordToCocRadius"; + AZ::RHI::ShaderInputNameIndex m_pencilMapFocusPointTexcoordUIndex = "m_dof.m_pencilMapFocusPointTexcoordU"; + AZ::RHI::ShaderInputNameIndex m_cocToScreenRatioIndex = "m_dof.m_cocToScreenRatio"; AZ::RHI::NameIdReflectionMap> m_passListWithHashOfDivisionNumber; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.cpp index e2713ea1e2..a5bfbe149a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.cpp @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.h b/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.h index b67a8c145e..05ee9c8540 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcess/LookModification/LookModificationSettings.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include namespace AZ { diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp index 065e02752e..667371891f 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp @@ -108,36 +108,8 @@ namespace AZ void BlendColorGradingLutsPass::Init() { - AZ_Assert(m_shaderResourceGroup != nullptr, "BlendColorGradingLutsPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - if (m_shaderResourceGroup != nullptr) - { - m_shaderInputBlendedLutImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_blendedLut" }); - m_shaderInputBlendedLutDimensionsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_blendedLutDimensions" }); - m_shaderInputBlendedLutShaperTypeIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_blendedLutShaperType" }); - m_shaderInputBlendededLutShaperBiasIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_blendedLutShaperBias" }); - m_shaderInputBlendededLutShaperScaleIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_blendedLutShaperScale" }); - - m_shaderInputSourceLut1ImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_sourceLut1" }); - m_shaderInputSourceLut1ShaperTypeIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_sourceLut1ShaperType" }); - m_shaderInputSourceLut1ShaperBiasIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_sourceLut1ShaperBias" }); - m_shaderInputSourceLut1ShaperScaleIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_sourceLut1ShaperScale" }); - - m_shaderInputSourceLut2ImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_sourceLut2" }); - m_shaderInputSourceLut2ShaperTypeIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_sourceLut2ShaperType" }); - m_shaderInputSourceLut2ShaperBiasIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_sourceLut2ShaperBias" }); - m_shaderInputSourceLut2ShaperScaleIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_sourceLut2ShaperScale" }); - - m_shaderInputWeight0Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_weight0" }); - m_shaderInputWeight1Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_weight1" }); - m_shaderInputWeight2Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_weight2" }); - m_shaderInputWeight3Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_weight3" }); - m_shaderInputWeight4Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_weight4" }); - } - - m_flags.m_initialized = true; - InitializeShaderVariant(); + m_flags.m_initialized = true; } void BlendColorGradingLutsPass::SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h index b6b671d3a0..c131a3cb38 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h @@ -78,37 +78,37 @@ namespace AZ const AZ::Name m_numSourceLutsShaderVariantOptionName; bool m_needToUpdateShaderVariant = false; - RHI::ShaderInputImageIndex m_shaderInputBlendedLutImageIndex; - RHI::ShaderInputConstantIndex m_shaderInputBlendedLutDimensionsIndex; - RHI::ShaderInputConstantIndex m_shaderInputBlendedLutShaperTypeIndex; - RHI::ShaderInputConstantIndex m_shaderInputBlendededLutShaperBiasIndex; - RHI::ShaderInputConstantIndex m_shaderInputBlendededLutShaperScaleIndex; - - RHI::ShaderInputImageIndex m_shaderInputSourceLut1ImageIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut1ShaperTypeIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut1ShaperBiasIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut1ShaperScaleIndex; - - RHI::ShaderInputImageIndex m_shaderInputSourceLut2ImageIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut2ShaperTypeIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut2ShaperBiasIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut2ShaperScaleIndex; - - RHI::ShaderInputImageIndex m_shaderInputSourceLut3ImageIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut3ShaperTypeIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut3ShaperBiasIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut3ShaperScaleIndex; - - RHI::ShaderInputImageIndex m_shaderInputSourceLut4ImageIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut4ShaperTypeIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut4ShaperBiasIndex; - RHI::ShaderInputConstantIndex m_shaderInputSourceLut4ShaperScaleIndex; - - RHI::ShaderInputConstantIndex m_shaderInputWeight0Index; - RHI::ShaderInputConstantIndex m_shaderInputWeight1Index; - RHI::ShaderInputConstantIndex m_shaderInputWeight2Index; - RHI::ShaderInputConstantIndex m_shaderInputWeight3Index; - RHI::ShaderInputConstantIndex m_shaderInputWeight4Index; + RHI::ShaderInputNameIndex m_shaderInputBlendedLutImageIndex = "m_blendedLut"; + RHI::ShaderInputNameIndex m_shaderInputBlendedLutDimensionsIndex = "m_blendedLutDimensions"; + RHI::ShaderInputNameIndex m_shaderInputBlendedLutShaperTypeIndex = "m_blendedLutShaperType"; + RHI::ShaderInputNameIndex m_shaderInputBlendededLutShaperBiasIndex = "m_blendedLutShaperBias"; + RHI::ShaderInputNameIndex m_shaderInputBlendededLutShaperScaleIndex = "m_blendedLutShaperScale"; + + RHI::ShaderInputNameIndex m_shaderInputSourceLut1ImageIndex = "m_sourceLut1"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut1ShaperTypeIndex = "m_sourceLut1ShaperType"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut1ShaperBiasIndex = "m_sourceLut1ShaperBias"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut1ShaperScaleIndex = "m_sourceLut1ShaperScale"; + + RHI::ShaderInputNameIndex m_shaderInputSourceLut2ImageIndex = "m_sourceLut2"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut2ShaperTypeIndex = "m_sourceLut2ShaperType"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut2ShaperBiasIndex = "m_sourceLut2ShaperBias"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut2ShaperScaleIndex = "m_sourceLut2ShaperScale"; + + RHI::ShaderInputNameIndex m_shaderInputSourceLut3ImageIndex = "m_sourceLut3"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut3ShaperTypeIndex = "m_sourceLut3ShaperType"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut3ShaperBiasIndex = "m_sourceLut3ShaperBias"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut3ShaperScaleIndex = "m_sourceLut3ShaperScale"; + + RHI::ShaderInputNameIndex m_shaderInputSourceLut4ImageIndex = "m_sourceLut4"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut4ShaperTypeIndex = "m_sourceLut4ShaperType"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut4ShaperBiasIndex = "m_sourceLut4ShaperBias"; + RHI::ShaderInputNameIndex m_shaderInputSourceLut4ShaperScaleIndex = "m_sourceLut4ShaperScale"; + + RHI::ShaderInputNameIndex m_shaderInputWeight0Index = "m_weight0"; + RHI::ShaderInputNameIndex m_shaderInputWeight1Index = "m_weight1"; + RHI::ShaderInputNameIndex m_shaderInputWeight2Index = "m_weight2"; + RHI::ShaderInputNameIndex m_shaderInputWeight3Index = "m_weight3"; + RHI::ShaderInputNameIndex m_shaderInputWeight4Index = "m_weight4"; AZ::Render::DisplayMapperParameters m_displayMapperParameters = {}; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.cpp index 31550a3cc2..1878c468f4 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.cpp @@ -424,31 +424,7 @@ namespace AZ BloomBlurChildPass::BloomBlurChildPass(const RPI::PassDescriptor& descriptor) : ComputePass(descriptor) - { - Name name = Name{ "m_offsets" }; - m_offsetsInputIndex = m_shaderResourceGroup->FindShaderInputBufferIndex(name); - AZ_Error("PassSystem", m_offsetsInputIndex.IsValid(), "[BloomBlurChildPass '%s']: Failed to find shader input buffer %s.", - name.GetCStr()); - - name = Name{ "m_weights" }; - m_weightsInputIndex = m_shaderResourceGroup->FindShaderInputBufferIndex(name); - AZ_Error("PassSystem", m_weightsInputIndex.IsValid(), "[BloomBlurChildPass '%s']: Failed to find shader input buffer %s.", - name.GetCStr()); - - FindShaderConstantInputIndex(m_kernelRadiusInputIndex, "m_kernelRadius"); - FindShaderConstantInputIndex(m_directionInputIndex, "m_direction"); - FindShaderConstantInputIndex(m_mipLevelInputIndex, "m_mipLevel"); - FindShaderConstantInputIndex(m_sourceImageSizeInputIndex, "m_sourceImageSize"); - FindShaderConstantInputIndex(m_sourceImageTexelSizeInputIndex, "m_sourceImageTexelSize"); - } - - void BloomBlurChildPass::FindShaderConstantInputIndex(AZ::RHI::ShaderInputConstantIndex& index, const char* nameStr) - { - Name name(nameStr); - index = m_shaderResourceGroup->FindShaderInputConstantIndex(name); - AZ_Error("PassSystem", index.IsValid(), "[BloomBlurChildPass '%s']: Failed to find shader input constant %s.", - name.GetCStr()); - } + { } void BloomBlurChildPass::UpdateParameters( Data::Instance offsetBuffer, diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.h index 4c26495ac9..e87d831382 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomBlurPass.h @@ -122,17 +122,15 @@ namespace AZ // Pass Behaviour Overrides... void FrameBeginInternal(FramePrepareParams params) override; - void FindShaderConstantInputIndex(AZ::RHI::ShaderInputConstantIndex& index, const char* name); - // output texture vertical dimension required by compute shader - AZ::RHI::ShaderInputBufferIndex m_offsetsInputIndex; - AZ::RHI::ShaderInputBufferIndex m_weightsInputIndex; - - AZ::RHI::ShaderInputConstantIndex m_kernelRadiusInputIndex; - AZ::RHI::ShaderInputConstantIndex m_directionInputIndex; - AZ::RHI::ShaderInputConstantIndex m_sourceImageSizeInputIndex; - AZ::RHI::ShaderInputConstantIndex m_sourceImageTexelSizeInputIndex; - AZ::RHI::ShaderInputConstantIndex m_mipLevelInputIndex; + RHI::ShaderInputNameIndex m_offsetsInputIndex = "m_offsets"; + RHI::ShaderInputNameIndex m_weightsInputIndex = "m_weights"; + + RHI::ShaderInputNameIndex m_kernelRadiusInputIndex = "m_kernelRadius"; + RHI::ShaderInputNameIndex m_directionInputIndex = "m_direction"; + RHI::ShaderInputNameIndex m_sourceImageSizeInputIndex = "m_sourceImageSize"; + RHI::ShaderInputNameIndex m_sourceImageTexelSizeInputIndex = "m_sourceImageTexelSize"; + RHI::ShaderInputNameIndex m_mipLevelInputIndex = "m_mipLevel"; Data::Instance m_offsetBuffer; Data::Instance m_weightBuffer; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.cpp index 1acc0e5110..fbb020cbf3 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.cpp @@ -237,23 +237,7 @@ namespace AZ BloomCompositeChildPass::BloomCompositeChildPass(const RPI::PassDescriptor& descriptor) : ComputePass(descriptor) - { - FindShaderConstantInputIndex(m_intensityInputIndex, "m_intensity"); - FindShaderConstantInputIndex(m_sourceImageSizeInputIndex, "m_sourceImageSize"); - FindShaderConstantInputIndex(m_sourceImageTexelSizeInputIndex, "m_sourceImageTexelSize"); - FindShaderConstantInputIndex(m_targetImageSizeInputIndex, "m_targetImageSize"); - FindShaderConstantInputIndex(m_sourceMipLevelInputIndex, "m_sourceMipLevel"); - FindShaderConstantInputIndex(m_enableBicubicInputIndex, "m_enableBicubic"); - FindShaderConstantInputIndex(m_tintInputIndex, "m_tint"); - } - - void BloomCompositeChildPass::FindShaderConstantInputIndex(AZ::RHI::ShaderInputConstantIndex& index, const char* nameStr) - { - Name name(nameStr); - index = m_shaderResourceGroup->FindShaderInputConstantIndex(name); - AZ_Error("PassSystem", index.IsValid(), "[BloomCompositeChildPass '%s']: Failed to find shader input constant %s.", - name.GetCStr()); - } + { } void BloomCompositeChildPass::UpdateParameters(uint32_t sourceMip, uint32_t sourceImageWidth, uint32_t sourceImageHeight, uint32_t targetImageWidth, uint32_t targetImageHeight, bool enableBicubic, Vector3 tint, float intensity) { diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.h index 42cee7ce1d..86d897ae7d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomCompositePass.h @@ -98,15 +98,13 @@ namespace AZ // Pass Behaviour Overrides... void FrameBeginInternal(FramePrepareParams params) override; - void FindShaderConstantInputIndex(AZ::RHI::ShaderInputConstantIndex& index, const char* name); - - AZ::RHI::ShaderInputConstantIndex m_intensityInputIndex; - AZ::RHI::ShaderInputConstantIndex m_sourceImageSizeInputIndex; - AZ::RHI::ShaderInputConstantIndex m_sourceImageTexelSizeInputIndex; - AZ::RHI::ShaderInputConstantIndex m_targetImageSizeInputIndex; - AZ::RHI::ShaderInputConstantIndex m_sourceMipLevelInputIndex; - AZ::RHI::ShaderInputConstantIndex m_enableBicubicInputIndex; - AZ::RHI::ShaderInputConstantIndex m_tintInputIndex; + RHI::ShaderInputNameIndex m_intensityInputIndex = "m_intensity"; + RHI::ShaderInputNameIndex m_sourceImageSizeInputIndex = "m_sourceImageSize"; + RHI::ShaderInputNameIndex m_sourceImageTexelSizeInputIndex = "m_sourceImageTexelSize"; + RHI::ShaderInputNameIndex m_targetImageSizeInputIndex = "m_targetImageSize"; + RHI::ShaderInputNameIndex m_sourceMipLevelInputIndex = "m_sourceMipLevel"; + RHI::ShaderInputNameIndex m_enableBicubicInputIndex = "m_enableBicubic"; + RHI::ShaderInputNameIndex m_tintInputIndex = "m_tint"; uint32_t m_targetImageWidth; uint32_t m_targetImageHeight; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.cpp index bd754e7b83..e4fde5c928 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.cpp @@ -45,18 +45,7 @@ namespace AZ BloomDownsamplePass::BloomDownsamplePass(const RPI::PassDescriptor& descriptor) : ComputePass(descriptor) - { - FindShaderConstantInputIndex(m_sourceImageTexelSizeInputIndex, "m_sourceImageTexelSize"); - FindShaderConstantInputIndex(m_thresholdConstantsInputIndex, "m_thresholdConstants"); - } - - void BloomDownsamplePass::FindShaderConstantInputIndex(AZ::RHI::ShaderInputConstantIndex& index, const char* nameStr) - { - Name name(nameStr); - index = m_shaderResourceGroup->FindShaderInputConstantIndex(name); - AZ_Error("PassSystem", index.IsValid(), "[BloomBlurChildPass '%s']: Failed to find shader input constant %s.", - name.GetCStr()); - } + { } void BloomDownsamplePass::BuildOutAttachmentBinding() { diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.h index 5204d87f09..824f703417 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BloomDownsamplePass.h @@ -42,11 +42,10 @@ namespace AZ void BuildOutAttachmentBinding(); AZ::Vector4 CalThresholdConstants(); - void FindShaderConstantInputIndex(AZ::RHI::ShaderInputConstantIndex& index, const char* nameStr); // output texture vertical dimension required by compute shader - AZ::RHI::ShaderInputConstantIndex m_sourceImageTexelSizeInputIndex; - AZ::RHI::ShaderInputConstantIndex m_thresholdConstantsInputIndex; + AZ::RHI::ShaderInputNameIndex m_sourceImageTexelSizeInputIndex = "m_sourceImageTexelSize"; + AZ::RHI::ShaderInputNameIndex m_thresholdConstantsInputIndex = "m_thresholdConstants"; float m_threshold = AZ::Render::Bloom::DefaultThreshold; float m_knee = AZ::Render::Bloom::DefaultKnee; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp index e32cdcfe14..e51bca5fde 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp @@ -47,15 +47,10 @@ namespace AZ { FullscreenTrianglePass::Init(); - AZ_Assert(m_shaderResourceGroup, "DepthOfFieldBokehBlurPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - if (m_shaderResourceGroup) - { - m_sampleNumberIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_sampleNumber")); - m_radiusMinIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_radiusMin")); - m_radiusMaxIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_radiusMax")); - m_sampleTexcoordsRadiusIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_sampleTexcoordsRadius")); - } + m_sampleNumberIndex.Reset(); + m_radiusMinIndex.Reset(); + m_radiusMaxIndex.Reset(); + m_sampleTexcoordsRadiusIndex.Reset(); InitializeShaderVariant(); } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h index cac649de69..688138fff0 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h @@ -48,10 +48,10 @@ namespace AZ void UpdateCurrentShaderVariant(); // SRG binding indices... - AZ::RHI::ShaderInputConstantIndex m_sampleNumberIndex; - AZ::RHI::ShaderInputConstantIndex m_radiusMinIndex; - AZ::RHI::ShaderInputConstantIndex m_radiusMaxIndex; - AZ::RHI::ShaderInputConstantIndex m_sampleTexcoordsRadiusIndex; + RHI::ShaderInputNameIndex m_sampleNumberIndex = "m_sampleNumber"; + RHI::ShaderInputNameIndex m_radiusMinIndex = "m_radiusMin"; + RHI::ShaderInputNameIndex m_radiusMaxIndex = "m_radiusMax"; + RHI::ShaderInputNameIndex m_sampleTexcoordsRadiusIndex = "m_sampleTexcoordsRadius"; // maximum number of samples. // Sampled in the order of 6, 12, 18, 24 from the center to the periphery. diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp index 2af1258312..30c92963d0 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp @@ -44,17 +44,12 @@ namespace AZ { FullscreenTrianglePass::Init(); - AZ_Assert(m_shaderResourceGroup, "DepthOfFieldCompositePass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - if (m_shaderResourceGroup) - { - m_backBlendFactorDivision2Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_backBlendFactorDivision2")); - m_backBlendFactorDivision4Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_backBlendFactorDivision4")); - m_backBlendFactorDivision8Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_backBlendFactorDivision8")); - m_frontBlendFactorDivision2Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_frontBlendFactorDivision2")); - m_frontBlendFactorDivision4Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_frontBlendFactorDivision4")); - m_frontBlendFactorDivision8Index = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_frontBlendFactorDivision8")); - } + m_backBlendFactorDivision2Index.Reset(); + m_backBlendFactorDivision4Index.Reset(); + m_backBlendFactorDivision8Index.Reset(); + m_frontBlendFactorDivision2Index.Reset(); + m_frontBlendFactorDivision4Index.Reset(); + m_frontBlendFactorDivision8Index.Reset(); InitializeShaderVariant(); } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h index b061c2b5e0..fe4d60e679 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h @@ -54,12 +54,12 @@ namespace AZ bool m_enabledDebugColoring = false; // SRG binding indices... - AZ::RHI::ShaderInputConstantIndex m_backBlendFactorDivision2Index; - AZ::RHI::ShaderInputConstantIndex m_backBlendFactorDivision4Index; - AZ::RHI::ShaderInputConstantIndex m_backBlendFactorDivision8Index; - AZ::RHI::ShaderInputConstantIndex m_frontBlendFactorDivision2Index; - AZ::RHI::ShaderInputConstantIndex m_frontBlendFactorDivision4Index; - AZ::RHI::ShaderInputConstantIndex m_frontBlendFactorDivision8Index; + RHI::ShaderInputNameIndex m_backBlendFactorDivision2Index = "m_backBlendFactorDivision2"; + RHI::ShaderInputNameIndex m_backBlendFactorDivision4Index = "m_backBlendFactorDivision4"; + RHI::ShaderInputNameIndex m_backBlendFactorDivision8Index = "m_backBlendFactorDivision8"; + RHI::ShaderInputNameIndex m_frontBlendFactorDivision2Index = "m_frontBlendFactorDivision2"; + RHI::ShaderInputNameIndex m_frontBlendFactorDivision4Index = "m_frontBlendFactorDivision4"; + RHI::ShaderInputNameIndex m_frontBlendFactorDivision8Index = "m_frontBlendFactorDivision8"; // scale / offset to convert DofFactor to blend ratio for back buffer. AZStd::array m_backBlendFactorDivision2 = { { 0.0f, 0.0f } }; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp index c7dd33f56f..3f9c09c88c 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp @@ -37,15 +37,10 @@ namespace AZ { FullscreenTrianglePass::Init(); - AZ_Assert(m_shaderResourceGroup, "DepthOfFieldMaskPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - if (m_shaderResourceGroup) - { - m_blendFactorIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_blendFactor")); - m_inputResolutionInverseIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_inputResolutionInverse")); - m_radiusMinIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_radiusMin")); - m_radiusMaxIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_radiusMax")); - } + m_blendFactorIndex.Reset(); + m_inputResolutionInverseIndex.Reset(); + m_radiusMinIndex.Reset(); + m_radiusMaxIndex.Reset(); } void DepthOfFieldMaskPass::FrameBeginInternal(FramePrepareParams params) diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h index ecd8d22398..09bb08a22c 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h @@ -44,10 +44,10 @@ namespace AZ virtual void Init() override; // SRG binding indices... - AZ::RHI::ShaderInputConstantIndex m_blendFactorIndex; - AZ::RHI::ShaderInputConstantIndex m_inputResolutionInverseIndex; - AZ::RHI::ShaderInputConstantIndex m_radiusMinIndex; - AZ::RHI::ShaderInputConstantIndex m_radiusMaxIndex; + RHI::ShaderInputNameIndex m_blendFactorIndex = "m_blendFactor"; + RHI::ShaderInputNameIndex m_inputResolutionInverseIndex = "m_inputResolutionInverse"; + RHI::ShaderInputNameIndex m_radiusMinIndex = "m_radiusMin"; + RHI::ShaderInputNameIndex m_radiusMaxIndex = "m_radiusMax"; AZStd::array m_blendFactor = {{0.0f, 0.0f}}; AZStd::array m_inputResolutionInverse = {{0.0f, 0.0f}}; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.cpp index 4fad287109..e7ac891198 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.cpp @@ -28,25 +28,6 @@ namespace AZ { } - void DepthOfFieldWriteFocusDepthFromGpuPass::Init() - { - AZ_Assert(m_shaderResourceGroup != nullptr, "%s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - m_autoFocusScreenPositionIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_autoFocusScreenPosition")); - m_autoFocusDataBufferIndex = m_shaderResourceGroup->FindShaderInputBufferIndex(Name{"m_outputFocusDepth"}); - } - - void DepthOfFieldWriteFocusDepthFromGpuPass::FrameBeginInternal(FramePrepareParams params) - { - if (!m_initialized) - { - Init(); - m_initialized = true; - } - - ComputePass::FrameBeginInternal(params); - } - void DepthOfFieldWriteFocusDepthFromGpuPass::SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) { AZ_Assert(m_bufferRef != nullptr, "%s has a null buffer when calling Prepare.", GetPathName().GetCStr()); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.h index eb118381f1..592ab64c01 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldWriteFocusDepthFromGpuPass.h @@ -38,15 +38,13 @@ namespace AZ private: DepthOfFieldWriteFocusDepthFromGpuPass(const RPI::PassDescriptor& descriptor); - void Init(); // SRG binding indices... - RHI::ShaderInputBufferIndex m_autoFocusDataBufferIndex; - RHI::ShaderInputConstantIndex m_autoFocusScreenPositionIndex; + RHI::ShaderInputNameIndex m_autoFocusDataBufferIndex = "m_outputFocusDepth"; + RHI::ShaderInputNameIndex m_autoFocusScreenPositionIndex = "m_autoFocusScreenPosition"; RPI::Ptr m_bufferRef = nullptr; AZ::Vector2 m_autoFocusScreenPosition{ 0.0f, 0.0f }; - bool m_initialized = false; // Scope producer functions... void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; @@ -54,7 +52,6 @@ namespace AZ // Pass overrides void BuildAttachmentsInternal() override; - void FrameBeginInternal(FramePrepareParams params) override; }; } // namespace Render } // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.cpp index b77f5c5b27..8bbc0ecc70 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.cpp @@ -29,12 +29,7 @@ namespace AZ DepthUpsamplePass::DepthUpsamplePass(const RPI::PassDescriptor& descriptor) : RPI::ComputePass(descriptor) - { - if (m_shaderResourceGroup) - { - m_constantsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_constants")); - } - } + { } void DepthUpsamplePass::FrameBeginInternal(FramePrepareParams params) { @@ -83,10 +78,7 @@ namespace AZ SetTargetThreadCounts(targetThreadCountX, targetThreadCountY, 1); - if (m_constantsIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_constantsIndex, upsampleConstants); - } + m_shaderResourceGroup->SetConstant(m_constantsIndex, upsampleConstants); RPI::ComputePass::FrameBeginInternal(params); } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.h index 131fdf8b36..2dd66c95cd 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthUpsamplePass.h @@ -40,7 +40,7 @@ namespace AZ DepthUpsamplePass(const RPI::PassDescriptor& descriptor); // SRG binding indices... - AZ::RHI::ShaderInputConstantIndex m_constantsIndex; + AZ::RHI::ShaderInputNameIndex m_constantsIndex = "m_constants"; }; } // namespace Render diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.cpp index efabd95d0c..ce2e309583 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.cpp @@ -52,10 +52,6 @@ namespace AZ FastDepthAwareBlurHorPass::FastDepthAwareBlurHorPass(const RPI::PassDescriptor& descriptor) : RPI::ComputePass(descriptor) { - if (m_shaderResourceGroup) - { - m_constantsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_constants")); - } // Though this is a fullscreen pass, the algorithm used makes each thread output 3 blurred pixels, so // it's not a 1-to-1 ratio and requires custom calculation of target thread counts m_isFullscreenPass = false; @@ -78,10 +74,7 @@ namespace AZ m_passConstants.InitializeFromSize(size); - if (m_constantsIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_constantsIndex, m_passConstants); - } + m_shaderResourceGroup->SetConstant(m_constantsIndex, m_passConstants); // The algorithm has each thread output three pixels in the blur direction u32 targetThreadCountX = (size.m_width + 2) / 3; @@ -101,10 +94,6 @@ namespace AZ FastDepthAwareBlurVerPass::FastDepthAwareBlurVerPass(const RPI::PassDescriptor& descriptor) : RPI::ComputePass(descriptor) { - if (m_shaderResourceGroup) - { - m_constantsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_constants")); - } // Though this is a fullscreen pass, the algorithm used makes each thread output 3 blurred pixels, so // it's not a 1-to-1 ratio and requires custom calculation of target thread counts m_isFullscreenPass = false; @@ -127,10 +116,7 @@ namespace AZ m_passConstants.InitializeFromSize(size); - if (m_constantsIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_constantsIndex, m_passConstants); - } + m_shaderResourceGroup->SetConstant(m_constantsIndex, m_passConstants); // The algorithm has each thread output three pixels in the blur direction u32 targetThreadCountY = (size.m_height + 2) / 3; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.h index d6e51ae422..c5013ff626 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/FastDepthAwareBlurPasses.h @@ -77,7 +77,7 @@ namespace AZ FastDepthAwareBlurHorPass(const RPI::PassDescriptor& descriptor); // SRG binding indices... - AZ::RHI::ShaderInputConstantIndex m_constantsIndex; + AZ::RHI::ShaderInputNameIndex m_constantsIndex = "m_constants"; FastDepthAwareBlurPassConstants m_passConstants; }; @@ -106,7 +106,7 @@ namespace AZ FastDepthAwareBlurVerPass(const RPI::PassDescriptor& descriptor); // SRG binding indices... - AZ::RHI::ShaderInputConstantIndex m_constantsIndex; + AZ::RHI::ShaderInputNameIndex m_constantsIndex = "m_constants"; FastDepthAwareBlurPassConstants m_passConstants; }; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp index 078ca2efe6..aff01d5bf1 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp @@ -52,16 +52,10 @@ namespace AZ { FullscreenTrianglePass::Init(); - AZ_Assert(m_shaderResourceGroup != nullptr, "LookModificationCompositePass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - if (m_shaderResourceGroup != nullptr) - { - m_shaderColorGradingLutImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_gradingLut" }); - - m_shaderColorGradingShaperTypeIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_shaperType" }); - m_shaderColorGradingShaperBiasIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_shaperBias" }); - m_shaderColorGradingShaperScaleIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_shaperScale" }); - } + m_shaderColorGradingLutImageIndex.Reset(); + m_shaderColorGradingShaperTypeIndex.Reset(); + m_shaderColorGradingShaperBiasIndex.Reset(); + m_shaderColorGradingShaperScaleIndex.Reset(); InitializeShaderVariant(); } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h index 1c6c2aee4c..fb6c968436 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h @@ -65,8 +65,6 @@ namespace AZ //! Pass behavior overrides void FrameBeginInternal(FramePrepareParams params) final; - RHI::ShaderInputConstantIndex m_exposureControlEnabledFlagIndex; - private: void InitializeShaderVariant(); void UpdateCurrentShaderVariant(); @@ -89,11 +87,10 @@ namespace AZ const AZ::Name m_colorGradingShaderVariantOptionName; bool m_needToUpdateShaderVariant = true; - RHI::ShaderInputImageIndex m_shaderColorGradingLutImageIndex; - - RHI::ShaderInputConstantIndex m_shaderColorGradingShaperTypeIndex; - RHI::ShaderInputConstantIndex m_shaderColorGradingShaperBiasIndex; - RHI::ShaderInputConstantIndex m_shaderColorGradingShaperScaleIndex; + RHI::ShaderInputNameIndex m_shaderColorGradingLutImageIndex = "m_gradingLut"; + RHI::ShaderInputNameIndex m_shaderColorGradingShaperTypeIndex = "m_shaperType"; + RHI::ShaderInputNameIndex m_shaderColorGradingShaperBiasIndex = "m_shaperBias"; + RHI::ShaderInputNameIndex m_shaderColorGradingShaperScaleIndex = "m_shaperScale"; }; } // namespace Render } // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationTransformPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationTransformPass.h index 690b745c51..5102015e82 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationTransformPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationTransformPass.h @@ -52,8 +52,6 @@ namespace AZ //! Pass overrides ... void FrameBeginInternal(FramePrepareParams params) override; - RHI::ShaderInputConstantIndex m_exposureControlEnabledFlagIndex; - void BuildAttachmentsInternal() override; private: diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp index ff85be415d..39d9e51c86 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp @@ -103,12 +103,12 @@ namespace AZ m_areaTexture = AZ::RPI::LoadStreamingTexture(PathToSMAAAreaTexture); m_searchTexture = AZ::RPI::LoadStreamingTexture(PathToSMAASearchTexture); - m_areaTextureShaderInputIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_areaTexture" }); - m_searchTextureShaderInputIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_searchTexture" }); - m_renderTargetMetricsShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_renderTargetMetrics" }); - m_maxSearchStepsShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_maxSearchSteps" }); - m_maxSearchStepsDiagonalShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_maxSearchStepsDiagonal" }); - m_cornerRoundingShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_cornerRounding" }); + m_areaTextureShaderInputIndex.Reset(); + m_searchTextureShaderInputIndex.Reset(); + m_renderTargetMetricsShaderInputIndex.Reset(); + m_maxSearchStepsShaderInputIndex.Reset(); + m_maxSearchStepsDiagonalShaderInputIndex.Reset(); + m_cornerRoundingShaderInputIndex.Reset(); } void SMAABlendingWeightCalculationPass::UpdateSRG() diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h index 3c0f0180c0..b968a9c2d9 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h @@ -52,12 +52,12 @@ namespace AZ AZ::Data::Instance m_areaTexture; AZ::Data::Instance m_searchTexture; - RHI::ShaderInputImageIndex m_areaTextureShaderInputIndex; - RHI::ShaderInputImageIndex m_searchTextureShaderInputIndex; - RHI::ShaderInputConstantIndex m_renderTargetMetricsShaderInputIndex; - RHI::ShaderInputConstantIndex m_maxSearchStepsShaderInputIndex; - RHI::ShaderInputConstantIndex m_maxSearchStepsDiagonalShaderInputIndex; - RHI::ShaderInputConstantIndex m_cornerRoundingShaderInputIndex; + RHI::ShaderInputNameIndex m_areaTextureShaderInputIndex = "m_areaTexture"; + RHI::ShaderInputNameIndex m_searchTextureShaderInputIndex = "m_searchTexture"; + RHI::ShaderInputNameIndex m_renderTargetMetricsShaderInputIndex = "m_renderTargetMetrics"; + RHI::ShaderInputNameIndex m_maxSearchStepsShaderInputIndex = "m_maxSearchSteps"; + RHI::ShaderInputNameIndex m_maxSearchStepsDiagonalShaderInputIndex = "m_maxSearchStepsDiagonal"; + RHI::ShaderInputNameIndex m_cornerRoundingShaderInputIndex = "m_cornerRounding"; const AZ::Name m_enableDiagonalDetectionFeatureOptionName; const AZ::Name m_enableCornerDetectionFeatureOptionName; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp index 9a7ec6b195..68485f3280 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp @@ -52,15 +52,13 @@ namespace AZ { SMAABasePass::Init(); - AZ_Assert(m_shaderResourceGroup != nullptr, "SMAAEdgeDetectionPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - m_renderTargetMetricsShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_renderTargetMetrics" }); - m_chromaThresholdShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_chromaThreshold" }); - m_depthThresholdShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_depthThreshold" }); - m_localContrastAdaptationFactorShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_localContrastAdaptationFactor" }); - m_predicationThresholdShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_predicationThreshold" }); - m_predicationScaleShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_predicationScale" }); - m_predicationStrengthShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_predicationStrength" }); + m_renderTargetMetricsShaderInputIndex.Reset(); + m_chromaThresholdShaderInputIndex.Reset(); + m_depthThresholdShaderInputIndex.Reset(); + m_localContrastAdaptationFactorShaderInputIndex.Reset(); + m_predicationThresholdShaderInputIndex.Reset(); + m_predicationScaleShaderInputIndex.Reset(); + m_predicationStrengthShaderInputIndex.Reset(); } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h index 588e8524a2..f8302c55ca 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h @@ -51,13 +51,13 @@ namespace AZ void UpdateSRG() override; void GetCurrentShaderOption(AZ::RPI::ShaderOptionGroup& shaderOption) const override; - RHI::ShaderInputConstantIndex m_renderTargetMetricsShaderInputIndex; - RHI::ShaderInputConstantIndex m_chromaThresholdShaderInputIndex; - RHI::ShaderInputConstantIndex m_depthThresholdShaderInputIndex; - RHI::ShaderInputConstantIndex m_localContrastAdaptationFactorShaderInputIndex; - RHI::ShaderInputConstantIndex m_predicationThresholdShaderInputIndex; - RHI::ShaderInputConstantIndex m_predicationScaleShaderInputIndex; - RHI::ShaderInputConstantIndex m_predicationStrengthShaderInputIndex; + RHI::ShaderInputNameIndex m_renderTargetMetricsShaderInputIndex = "m_renderTargetMetrics"; + RHI::ShaderInputNameIndex m_chromaThresholdShaderInputIndex = "m_chromaThreshold"; + RHI::ShaderInputNameIndex m_depthThresholdShaderInputIndex = "m_depthThreshold"; + RHI::ShaderInputNameIndex m_localContrastAdaptationFactorShaderInputIndex = "m_localContrastAdaptationFactor"; + RHI::ShaderInputNameIndex m_predicationThresholdShaderInputIndex = "m_predicationThreshold"; + RHI::ShaderInputNameIndex m_predicationScaleShaderInputIndex = "m_predicationScale"; + RHI::ShaderInputNameIndex m_predicationStrengthShaderInputIndex = "m_predicationStrength"; const AZ::Name m_enablePredicationFeatureOptionName; const AZ::Name m_edgeDetectionModeOptionName; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp index 89bdc064c6..777e4d7d95 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp @@ -50,10 +50,7 @@ namespace AZ void SMAANeighborhoodBlendingPass::Init() { SMAABasePass::Init(); - - AZ_Assert(m_shaderResourceGroup != nullptr, "SMAANeighborhoodBlendingPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); - - m_renderTargetMetricsShaderInputIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_renderTargetMetrics" }); + m_renderTargetMetricsShaderInputIndex.Reset(); } void SMAANeighborhoodBlendingPass::UpdateSRG() diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h index 2651184430..86386a0545 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h @@ -43,7 +43,7 @@ namespace AZ void UpdateSRG() override; void GetCurrentShaderOption(AZ::RPI::ShaderOptionGroup& shaderOption) const override; - RHI::ShaderInputConstantIndex m_renderTargetMetricsShaderInputIndex; + RHI::ShaderInputNameIndex m_renderTargetMetricsShaderInputIndex = "m_renderTargetMetrics"; const AZ::Name m_blendingOutputModeOptionName; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.cpp index 2d971ff836..68472115ce 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.cpp @@ -106,12 +106,7 @@ namespace AZ SsaoComputePass::SsaoComputePass(const RPI::PassDescriptor& descriptor) : RPI::ComputePass(descriptor) - { - if (m_shaderResourceGroup) - { - m_constantsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_constants")); - } - } + { } void SsaoComputePass::FrameBeginInternal(FramePrepareParams params) { @@ -175,10 +170,7 @@ namespace AZ ssaoConstants.m_halfPixelSize[0] = 0.5f * ssaoConstants.m_pixelSize[0]; ssaoConstants.m_halfPixelSize[1] = 0.5f * ssaoConstants.m_pixelSize[1]; - if (m_constantsIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_constantsIndex, ssaoConstants); - } + m_shaderResourceGroup->SetConstant(m_constantsIndex, ssaoConstants); RPI::ComputePass::FrameBeginInternal(params); } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.h index 129de7d2c1..9abd04e306 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SsaoPasses.h @@ -72,7 +72,7 @@ namespace AZ SsaoComputePass(const RPI::PassDescriptor& descriptor); // SRG binding indices... - AZ::RHI::ShaderInputConstantIndex m_constantsIndex; + AZ::RHI::ShaderInputNameIndex m_constantsIndex = "m_constants"; }; } // namespace Render } // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.cpp index b99e7d0f88..abeb072612 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.cpp @@ -38,32 +38,7 @@ namespace AZ SubsurfaceScatteringPass::SubsurfaceScatteringPass(const PassDescriptor& descriptor) : ComputePass(descriptor) - { - bool succeed = false; - - succeed = FindShaderInputConstantIndexByName(m_screenSizeInputIndex, Name{ "m_screenSize" }); - - if (!succeed) - { - AZ_Error("PassSystem", false, "[SubsurfaceScatteringPass '%s']: Initialization failed"); - } - } - - bool SubsurfaceScatteringPass::FindShaderInputConstantIndexByName(AZ::RHI::ShaderInputConstantIndex& index, AZ::Name name) - { - index = m_shaderResourceGroup->FindShaderInputConstantIndex(name); - - if (index.IsValid()) - { - return true; - } - else - { - AZ_Error("PassSystem", false, "[SubsurfaceScatteringPass '%s']: Failed to find shader input constant %s in per pass srg of compute shader.", - name.GetCStr()); - return false; - } - } + { } void SubsurfaceScatteringPass::FrameBeginInternal(FramePrepareParams params) { diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.h index 361b1066df..a0763be74b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SubsurfaceScatteringPass.h @@ -39,10 +39,8 @@ namespace AZ void FrameBeginInternal(FramePrepareParams params) override; - bool FindShaderInputConstantIndexByName(AZ::RHI::ShaderInputConstantIndex& index, AZ::Name name); - // output texture vertical dimension required by compute shader - AZ::RHI::ShaderInputConstantIndex m_screenSizeInputIndex; + AZ::RHI::ShaderInputNameIndex m_screenSizeInputIndex = "m_screenSize"; }; } // namespace RPI diff --git a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp index 732651a917..51303436ee 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp @@ -30,10 +30,28 @@ namespace AZ ReflectionProbe::~ReflectionProbe() { + Data::AssetBus::MultiHandler::BusDisconnect(); m_scene->GetCullingSystem()->UnregisterCullable(m_cullable); m_meshFeatureProcessor->ReleaseMesh(m_visualizationMeshHandle); } + void ReflectionProbe::OnAssetReady(Data::Asset asset) + { + if (m_visualizationMaterialAsset.GetId() == asset.GetId()) + { + m_visualizationMaterialAsset = asset; + Data::AssetBus::MultiHandler::BusDisconnect(asset.GetId()); + + m_meshFeatureProcessor->SetMaterialAssignmentMap(m_visualizationMeshHandle, AZ::RPI::Material::FindOrCreate(m_visualizationMaterialAsset)); + } + } + + void ReflectionProbe::OnAssetError(Data::Asset asset) + { + AZ_Error("ReflectionProbe", false, "Failed to load ReflectionProbe dependency asset %s", asset.ToString().c_str()); + Data::AssetBus::MultiHandler::BusDisconnect(asset.GetId()); + } + void ReflectionProbe::Init(RPI::Scene* scene, ReflectionRenderData* reflectionRenderData) { AZ_Assert(scene, "ReflectionProbe::Init called with a null Scene pointer"); @@ -44,19 +62,25 @@ namespace AZ // load visualization sphere model and material m_meshFeatureProcessor = m_scene->GetFeatureProcessor(); + // We don't have to pre-load this asset before passing it to MeshFeatureProcessor, because the MeshFeatureProcessor will handle the async-load for us. m_visualizationModelAsset = AZ::RPI::AssetUtils::GetAssetByProductPath( "Models/ReflectionProbeSphere.azmodel", AZ::RPI::AssetUtils::TraceLevel::Assert); - m_visualizationMaterialAsset = AZ::RPI::AssetUtils::GetAssetByProductPath( - "Materials/ReflectionProbe/ReflectionProbeVisualization.azmaterial", - AZ::RPI::AssetUtils::TraceLevel::Assert); - - m_visualizationMeshHandle = m_meshFeatureProcessor->AcquireMesh(m_visualizationModelAsset, AZ::RPI::Material::FindOrCreate(m_visualizationMaterialAsset)); + m_visualizationMeshHandle = m_meshFeatureProcessor->AcquireMesh(m_visualizationModelAsset); m_meshFeatureProcessor->SetExcludeFromReflectionCubeMaps(m_visualizationMeshHandle, true); m_meshFeatureProcessor->SetRayTracingEnabled(m_visualizationMeshHandle, false); m_meshFeatureProcessor->SetTransform(m_visualizationMeshHandle, AZ::Transform::CreateIdentity()); + // We have to pre-load this asset before creating a Material instance because the InstanceDatabase will attempt a blocking load which could deadlock, + // particularly when slices are involved. + // Note that m_visualizationMeshHandle had to be set up first, because AssetBus BusConnect() might call ReflectionProbe::OnAssetReady() immediately on this callstack. + m_visualizationMaterialAsset = AZ::RPI::AssetUtils::GetAssetByProductPath( + "Materials/ReflectionProbe/ReflectionProbeVisualization.azmaterial", + AZ::RPI::AssetUtils::TraceLevel::Assert); + m_visualizationMaterialAsset.QueueLoad(); + Data::AssetBus::MultiHandler::BusConnect(m_visualizationMaterialAsset.GetId()); + // reflection render Srgs m_stencilSrg = RPI::ShaderResourceGroup::Create(m_reflectionRenderData->m_stencilSrgAsset); AZ_Error("ReflectionProbeFeatureProcessor", m_stencilSrg.get(), "Failed to create stencil shader resource group"); @@ -181,6 +205,7 @@ namespace AZ } } + void ReflectionProbe::SetTransform(const AZ::Transform& transform) { m_position = transform.GetTranslation(); diff --git a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.h b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.h index 1236e0fa31..22645a4ed3 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.h +++ b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.h @@ -65,7 +65,8 @@ namespace AZ }; // ReflectionProbe manages all aspects of a single probe, including rendering, visualization, and cubemap generation - class ReflectionProbe final + class ReflectionProbe final : + public AZ::Data::AssetBus::MultiHandler { public: ReflectionProbe() = default; @@ -114,6 +115,10 @@ namespace AZ void UpdateCulling(); + // AZ::Data::AssetBus::Handler overrides... + void OnAssetReady(Data::Asset asset) override; + void OnAssetError(Data::Asset asset) override; + // scene RPI::Scene* m_scene = nullptr; diff --git a/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp b/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp index a3f415c8a7..cb57d2519d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp @@ -54,16 +54,9 @@ namespace AZ { if (m_updateSrg) { - RHI::ShaderInputConstantIndex constantIndex; - - constantIndex = m_shaderResourceGroup->GetLayout()->FindShaderInputConstantIndex(AZ::Name("m_imageWidth")); - m_shaderResourceGroup->SetConstant(constantIndex, m_imageSize.m_width); - - constantIndex = m_shaderResourceGroup->GetLayout()->FindShaderInputConstantIndex(AZ::Name("m_imageHeight")); - m_shaderResourceGroup->SetConstant(constantIndex, m_imageSize.m_height); - - constantIndex = m_shaderResourceGroup->GetLayout()->FindShaderInputConstantIndex(AZ::Name("m_outputScale")); - m_shaderResourceGroup->SetConstant(constantIndex, m_outputScale); + m_shaderResourceGroup->SetConstant(m_imageWidthIndex, m_imageSize.m_width); + m_shaderResourceGroup->SetConstant(m_imageHeightIndex, m_imageSize.m_height); + m_shaderResourceGroup->SetConstant(m_outputScaleIndex, m_outputScale); m_updateSrg = false; } diff --git a/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.h b/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.h index 98544a434d..9eea0ce5dc 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.h @@ -48,6 +48,10 @@ namespace AZ void FrameBeginInternal(FramePrepareParams params) override; void CompileResources(const RHI::FrameGraphCompileContext& context) override; + RHI::ShaderInputNameIndex m_imageWidthIndex = "m_imageWidth"; + RHI::ShaderInputNameIndex m_imageHeightIndex = "m_imageHeight"; + RHI::ShaderInputNameIndex m_outputScaleIndex = "m_outputScale"; + bool m_updateSrg = false; PassType m_passType; uint32_t m_mipLevel = 0; diff --git a/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshInputBuffers.cpp b/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshInputBuffers.cpp index 6701d32452..4bd3d35554 100644 --- a/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshInputBuffers.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshInputBuffers.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include #include @@ -189,10 +191,12 @@ namespace AZ } } - void SkinnedMeshInputLod::AddMorphTarget(float minWeight, float maxWeight, float minDelta, float maxDelta, uint32_t vertexCount, const AZStd::vector& deltas, const AZStd::string& bufferNamePrefix) + void SkinnedMeshInputLod::AddMorphTarget(const RPI::MorphTargetMetaAsset::MorphTarget& morphTarget, const Data::Asset& morphBufferAsset, const AZStd::string& bufferNamePrefix, float minWeight = 0.0f, float maxWeight = 1.0f) { - m_morphTargetMetaDatas.push_back(MorphTargetMetaData{ minWeight, maxWeight, minDelta, maxDelta, vertexCount }); - m_morphTargetInputBuffers.push_back(aznew MorphTargetInputBuffers{ vertexCount, deltas, bufferNamePrefix }); + m_morphTargetMetaDatas.push_back(MorphTargetMetaData{ minWeight, maxWeight, morphTarget.m_minPositionDelta, morphTarget.m_maxPositionDelta, morphTarget.m_numVertices, morphTarget.m_startIndex }); + RHI::BufferViewDescriptor morphView = RHI::BufferViewDescriptor::CreateStructured(morphTarget.m_startIndex, morphTarget.m_numVertices, sizeof(RPI::PackedCompressedMorphTargetDelta)); + RPI::BufferAssetView morphTargetDeltaView{ morphBufferAsset, morphView }; + m_morphTargetInputBuffers.push_back(aznew MorphTargetInputBuffers{ morphTargetDeltaView, bufferNamePrefix }); } diff --git a/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshRenderProxy.cpp b/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshRenderProxy.cpp index e34707671e..90c54dfc10 100644 --- a/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshRenderProxy.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/SkinnedMesh/SkinnedMeshRenderProxy.cpp @@ -40,6 +40,10 @@ namespace AZ bool SkinnedMeshRenderProxy::Init(const RPI::Scene& scene, SkinnedMeshFeatureProcessor* featureProcessor) { AZ_TRACE_METHOD(); + if(!m_instance->m_model) + { + return false; + } const size_t modelLodCount = m_instance->m_model->GetLodCount(); m_featureProcessor = featureProcessor; diff --git a/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.cpp index c4c83fc51a..058e243fb7 100644 --- a/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.cpp @@ -82,21 +82,18 @@ namespace AZ // Find the relevant indices in the scene srg m_sceneSrg = GetParentScene()->GetShaderResourceGroup(); - m_skyboxEnableIndex = m_sceneSrg->FindShaderInputConstantIndex(Name("m_enable")); - m_physicalSkyBufferIndex = m_sceneSrg->FindShaderInputBufferIndex(Name("m_physicalSkyData")); - m_physicalSkyIndex = m_sceneSrg->FindShaderInputConstantIndex(Name("m_physicalSky")); - m_cubemapIndex = m_sceneSrg->FindShaderInputImageIndex(Name("m_skyboxCubemap")); - m_cubemapRotationMatrixIndex = m_sceneSrg->FindShaderInputConstantIndex(Name("m_cubemapRotationMatrix")); - m_cubemapExposureIndex = m_sceneSrg->FindShaderInputConstantIndex(Name("m_cubemapExposure")); - - AZ_Error(FeatureProcessorName, m_skyboxEnableIndex.IsValid(), "Unable to find m_enable in scene shader resource group."); - AZ_Error(FeatureProcessorName, m_physicalSkyBufferIndex.IsValid(), "Unable to find m_physicalSkyData in scene shader resource group."); - AZ_Error(FeatureProcessorName, m_physicalSkyIndex.IsValid(), "Unable to find m_useCubemap in scene shader resource group."); - AZ_Error(FeatureProcessorName, m_cubemapIndex.IsValid(), "Unable to find m_skyboxCubemap in scene shader resource group."); - AZ_Error(FeatureProcessorName, m_cubemapRotationMatrixIndex.IsValid(), "Unable to find m_cubemapRotationMatrix in scene shader resource group."); - AZ_Error(FeatureProcessorName, m_cubemapExposureIndex.IsValid(), "Unable to find m_cubemapExposure in scene shader resource group."); - - m_sceneSrg->SetBufferView(m_physicalSkyBufferIndex, m_buffer->GetBufferView()); + + m_skyboxEnableIndex.Reset(); + m_physicalSkyBufferIndex.Reset(); + m_physicalSkyIndex.Reset(); + m_cubemapIndex.Reset(); + m_cubemapRotationMatrixIndex.Reset(); + m_cubemapExposureIndex.Reset(); + + if (m_buffer) + { + m_sceneSrg->SetBufferView(m_physicalSkyBufferIndex, m_buffer->GetBufferView()); + } } void SkyBoxFeatureProcessor::Deactivate() @@ -154,8 +151,10 @@ namespace AZ AZ::Vector4 artistParams = AZ::Vector4(m_skyIntensity.GetIntensity(), m_sunIntensity.GetIntensity(), 0.0f, 0.0f); artistParams.StoreToFloat4(m_physicalSkyData.m_physicalSkyAndSunIntensity.data()); - m_buffer->UpdateData(&m_physicalSkyData, sizeof(PhysicalSkyData)); - + if (m_buffer) + { + m_buffer->UpdateData(&m_physicalSkyData, sizeof(PhysicalSkyData)); + } m_skyNeedUpdate = false; m_sunNeedUpdate = false; m_mapBuffer = false; diff --git a/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.h index 795a89df58..ab019cfd9b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/SkyBox/SkyBoxFeatureProcessor.h @@ -139,14 +139,12 @@ namespace AZ Data::Instance m_buffer; PhysicalSkyData m_physicalSkyData; - RHI::ShaderInputConstantIndex m_skyboxEnableIndex; - - RHI::ShaderInputBufferIndex m_physicalSkyBufferIndex; - RHI::ShaderInputConstantIndex m_physicalSkyIndex; - - RHI::ShaderInputImageIndex m_cubemapIndex; - RHI::ShaderInputConstantIndex m_cubemapRotationMatrixIndex; - RHI::ShaderInputConstantIndex m_cubemapExposureIndex; + RHI::ShaderInputNameIndex m_skyboxEnableIndex = "m_enable"; + RHI::ShaderInputNameIndex m_physicalSkyBufferIndex = "m_physicalSkyData"; + RHI::ShaderInputNameIndex m_physicalSkyIndex = "m_physicalSky"; + RHI::ShaderInputNameIndex m_cubemapIndex = "m_skyboxCubemap"; + RHI::ShaderInputNameIndex m_cubemapRotationMatrixIndex = "m_cubemapRotationMatrix"; + RHI::ShaderInputNameIndex m_cubemapExposureIndex = "m_cubemapExposure"; bool m_skyNeedUpdate = true; bool m_sunNeedUpdate = true; diff --git a/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake b/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake index a5f5dd4da3..954a418ac0 100644 --- a/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake +++ b/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake @@ -10,7 +10,7 @@ # set(FILES - Include/Atom/Feature/ACES/Aces.h + 3rdParty/ACES/ACES/Aces.h Include/Atom/Feature/ACES/AcesDisplayMapperFeatureProcessor.h Include/Atom/Feature/Automation/AtomAutomationBus.h Include/Atom/Feature/AuxGeom/AuxGeomFeatureProcessor.h @@ -53,7 +53,7 @@ set(FILES Source/ProfilingCaptureSystemComponent.cpp Source/ProfilingCaptureSystemComponent.h Source/RenderCommon.h - Source/ACES/Aces.cpp + 3rdParty/ACES/ACES/Aces.cpp Source/ACES/AcesDisplayMapperFeatureProcessor.cpp Source/AuxGeom/AuxGeomBase.h Source/AuxGeom/AuxGeomFeatureProcessor.cpp diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxcore/cfg.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxcore/cfg.h deleted file mode 100644 index 190fdee6bb..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxcore/cfg.h +++ /dev/null @@ -1,27 +0,0 @@ -/*************************************************************************** - * Copyright 1998-2017 by authors (see AUTHORS.txt) * - * * - * This file is part of LuxCoreRender. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -#ifndef _LUXCORE_CFG_H -#define _LUXCORE_CFG_H - -// The configured options and settings for LuxCore - -#define LUXCORE_VERSION_MAJOR "2" -#define LUXCORE_VERSION_MINOR "2" - -#endif /* _LUXCORE_CFG_H */ diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxcore/luxcore.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxcore/luxcore.h deleted file mode 100644 index 6038e7d4fd..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxcore/luxcore.h +++ /dev/null @@ -1,1272 +0,0 @@ -/*************************************************************************** - * Copyright 1998-2018 by authors (see AUTHORS.txt) * - * * - * This file is part of LuxCoreRender. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -/*! - * \file - * - * \brief LuxCore is the LuxCoreRender C++/Python API. - * \author Bucciarelli David et al. - * \version 2.0 - * \date October 2013 - * - */ - -/*! - * \mainpage - * \section intro Introduction - * LuxCore is the LuxCoreRender C++/Python API. It can be used to create and - * render scenes. It includes the support for advanced new features like editing - * materials, lights, geometry, interactive rendering and more. - */ - -#ifndef _LUXCORE_H -#define _LUXCORE_H - -#include -#include -#include - -#include -#include -#include -#include - -/*! \mainpage LuxCore - * - * \section intro_sec Introduction - * - * LuxCore is the LuxCoreRender C++ API. - */ - -/*! - * \namespace luxcore - * - * \brief The LuxCore classes are defined within this namespace. - */ -namespace luxcore { - -CPP_EXPORT CPP_API void (*LuxCore_LogHandler)(const char *msg); // LuxCore Log Handler - -#define LC_LOG(a) { if (luxcore::LuxCore_LogHandler) { std::stringstream _LUXCORE_LOG_LOCAL_SS; _LUXCORE_LOG_LOCAL_SS << a; luxcore::LuxCore_LogHandler(_LUXCORE_LOG_LOCAL_SS.str().c_str()); } } - -/*! - * \brief Initializes LuxCore API. This function is thread safe. - * - * \param LogHandler is a pointer to a function receiving all LuxCore log - * messages. If it is NULL, the default handler will be used. - */ -CPP_EXPORT CPP_API void Init(void (*LogHandler)(const char *) = NULL); - -/*! - * \brief This function can be called if you want to update the log handler. - * - * \param LogHandler is a pointer to a function receiving all LuxCore log - * messages. If it is NULL, there will no printed information. - */ -CPP_EXPORT CPP_API void SetLogHandler(void (*LogHandler)(const char *) = NULL); - -/*! - * \brief Parses a scene described using LuxRender SDL (Scene Description Language). - * - * \param fileName is the name of the file to parse. - * \param renderConfig is where the rendering configuration properties are returned. - * \param scene is where the scene properties are returned. - */ -CPP_EXPORT CPP_API void ParseLXS(const std::string &fileName, luxrays::Properties &renderConfig, luxrays::Properties &scene); - -/*! - * \brief File the OpenCL kernel cache with entries - * - * \param config defines how to fill the cache. The supported properties are: - * kernelcachefill.renderengine.types, kernelcachefill.sampler.types, - * kernelcachefill.camera.types, kernelcachefill.geometry.types, kernelcachefill.light.types, - * kernelcachefill.material.types, kernelcachefill.texture.types. They can be used to - * define the list of types to use, for instance with a - * Property("kernelcachefill.renderengine.types")("PATHOCL", "TILEPATHOCL", "RTPATHOCL"). - */ -CPP_EXPORT CPP_API void KernelCacheFill(const luxrays::Properties &config, void (*ProgressHandler)(const size_t, const size_t) = NULL); - -/*! - * \brief Return a list of properties describing the features available. The - * properties currently supported are: - * - version.number\n - * The LuxCore version. As string with "major.minor" version format. - * - compile.LUXRAYS_DISABLE_OPENCL\n - * true or false if the sources has been compiled with LUXRAYS_DISABLE_OPENCL and - * OpenCL rendering engines are available or not. - * - compile.LUXCORE_DISABLE_EMBREE_BVH_BUILDER\n - * true or false if the sources has been compiled with LUXCORE_DISABLE_EMBREE_BVH_BUILDER and - * Embree BVH builder is used for OpenCL or not. This is now always false. - */ -CPP_EXPORT CPP_API luxrays::Properties GetPlatformDesc(); - -/*! - * \brief Return the list of OpenCL devices available. For instance: - * - opencl.device.0.name = "GeForce GTX 980" - * - opencl.device.0.type = "OPENCL_GPU" - * - opencl.device.0.units = 16 - * - opencl.device.0.nativevectorwidthfloat = 1 - * - opencl.device.0.maxmemory = 4294770688 - * - opencl.device.0.maxmemoryallocsize = 1073692672 - * - opencl.device.1.name = "Hawaii" - * - opencl.device.1.type = "OPENCL_GPU" - * - opencl.device.1.units = 44 - * - opencl.device.1.nativevectorwidthfloat = 1 - * - opencl.device.1.maxmemory = 3888119808 - * - opencl.device.1.maxmemoryallocsize = 2847670272 - * - opencl.device.2.name = "Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz" - * - opencl.device.2.type = "OPENCL_CPU" - * - opencl.device.2.units = 12 - * - opencl.device.2.nativevectorwidthfloat = 8 - * - opencl.device.2.maxmemory = 16765145088 - * - opencl.device.2.maxmemoryallocsize = 4191286272 - */ -CPP_EXPORT CPP_API luxrays::Properties GetOpenCLDeviceDescs(); - -/*! - * \brief Clear the list of places where to look for files. - */ -CPP_EXPORT CPP_API void ClearFileNameResolverPaths(); - -/*! - * \brief Add a path to the list of places where to look for files. - */ -CPP_EXPORT CPP_API void AddFileNameResolverPath(const std::string &path); - -/*! - * \brief Return the list of places where to look for files. - */ -CPP_EXPORT CPP_API std::vector GetFileNameResolverPaths(); - -class RenderSession; -class RenderState; - -/*! - * \brief Film stores all the outputs of a rendering. It can be obtained - * from a RenderSession or as stand alone object loaded from a file. - */ -CPP_EXPORT class CPP_API Film { -public: - /*! - * \brief Types of Film channel available. - */ - typedef enum { - // This list must be aligned with slg::FilmOutputs::FilmOutputType - OUTPUT_RGB, - OUTPUT_RGBA, - OUTPUT_RGB_IMAGEPIPELINE, - OUTPUT_RGBA_IMAGEPIPELINE, - OUTPUT_ALPHA, - OUTPUT_DEPTH, - OUTPUT_POSITION, - OUTPUT_GEOMETRY_NORMAL, - OUTPUT_SHADING_NORMAL, - OUTPUT_MATERIAL_ID, - OUTPUT_DIRECT_DIFFUSE, - OUTPUT_DIRECT_GLOSSY, - OUTPUT_EMISSION, - OUTPUT_INDIRECT_DIFFUSE, - OUTPUT_INDIRECT_GLOSSY, - OUTPUT_INDIRECT_SPECULAR, - OUTPUT_MATERIAL_ID_MASK, - OUTPUT_DIRECT_SHADOW_MASK, - OUTPUT_INDIRECT_SHADOW_MASK, - OUTPUT_RADIANCE_GROUP, - OUTPUT_UV, - OUTPUT_RAYCOUNT, - OUTPUT_BY_MATERIAL_ID, - OUTPUT_IRRADIANCE, - OUTPUT_OBJECT_ID, - OUTPUT_OBJECT_ID_MASK , - OUTPUT_BY_OBJECT_ID, - OUTPUT_SAMPLECOUNT, - OUTPUT_CONVERGENCE, - OUTPUT_SERIALIZED_FILM, - OUTPUT_MATERIAL_ID_COLOR, - OUTPUT_ALBEDO, - OUTPUT_AVG_SHADING_NORMAL, - OUTPUT_NOISE - } FilmOutputType; - - /*! - * \brief Types of Film channel available. - */ - typedef enum { - // This list must be aligned with slg::Film::FilmChannelType - CHANNEL_RADIANCE_PER_PIXEL_NORMALIZED = 1 << 0, - CHANNEL_RADIANCE_PER_SCREEN_NORMALIZED = 1 << 1, - CHANNEL_ALPHA = 1 << 2, - CHANNEL_IMAGEPIPELINE = 1 << 3, - CHANNEL_DEPTH = 1 << 4, - CHANNEL_POSITION = 1 << 5, - CHANNEL_GEOMETRY_NORMAL = 1 << 6, - CHANNEL_SHADING_NORMAL = 1 << 7, - CHANNEL_MATERIAL_ID = 1 << 8, - CHANNEL_DIRECT_DIFFUSE = 1 << 9, - CHANNEL_DIRECT_GLOSSY = 1 << 10, - CHANNEL_EMISSION = 1 << 11, - CHANNEL_INDIRECT_DIFFUSE = 1 << 12, - CHANNEL_INDIRECT_GLOSSY = 1 << 13, - CHANNEL_INDIRECT_SPECULAR = 1 << 14, - CHANNEL_MATERIAL_ID_MASK = 1 << 15, - CHANNEL_DIRECT_SHADOW_MASK = 1 << 16, - CHANNEL_INDIRECT_SHADOW_MASK = 1 << 17, - CHANNEL_UV = 1 << 18, - CHANNEL_RAYCOUNT = 1 << 19, - CHANNEL_BY_MATERIAL_ID = 1 << 20, - CHANNEL_IRRADIANCE = 1 << 21, - CHANNEL_OBJECT_ID = 1 << 22, - CHANNEL_OBJECT_ID_MASK = 1 << 23, - CHANNEL_BY_OBJECT_ID = 1 << 24, - CHANNEL_SAMPLECOUNT = 1 << 25, - CHANNEL_CONVERGENCE = 1 << 26, - CHANNEL_MATERIAL_ID_COLOR = 1 << 27, - CHANNEL_ALBEDO = 1 << 28, - CHANNEL_AVG_SHADING_NORMAL = 1 << 29, - CHANNEL_NOISE = 1 << 30 - } FilmChannelType; - - virtual ~Film(); - - /*! - * \brief Loads a stand alone Film (i.e. not connected to a rendering session) - * from a file. - * - * \param fileName is the name of the file with the serialized film to read. - */ - static Film *Create(const std::string &fileName); - /*! - * \brief Create a stand alone Film (i.e. not connected to a rendering session) - * from the properties. - * - * \param props defining the film. - * \param hasPixelNormalizedChannel if the film must have CHANNEL_RADIANCE_PER_PIXEL_NORMALIZED. - * Required by all render engines. - * \param hasScreenNormalizedChannel if the film must have CHANNEL_RADIANCE_PER_SCREEN_NORMALIZED. - * Required by BIDIRCPU and LIGHTCPU render engines. - * - */ - static Film *Create(const luxrays::Properties &props, - const bool hasPixelNormalizedChannel, - const bool hasScreenNormalizedChannel); - - /*! - * \brief Returns the Film width. - * - * \return the Film width. - */ - virtual unsigned int GetWidth() const = 0; - /*! - * \brief Returns the Film height. - * - * \return the Film width. - */ - virtual unsigned int GetHeight() const = 0; - /*! - * \brief Returns a list of statistics related to the film. Mostly useful - * for stand alone films. - * - * \return a Properties container with the statistics. - */ - virtual luxrays::Properties GetStats() const = 0; - /*! - * \brief Returns the Film average luminance. It can be used to - * estimate a good value for variance clamping. - * - * \param imagePipelineIndex the index of the image pipeline radiance group scale to use. - * - * \return the Film average luminance. - */ - virtual float GetFilmY(const unsigned int imagePipelineIndex = 0) const = 0; - /*! - * \brief Clear the film. - */ - virtual void Clear() = 0; - /*! - * \brief Add a film. - * - * \param film the film to add. - * - */ - virtual void AddFilm(const Film &film) = 0; - /*! - * \brief Add a film. - * - * \param film the film to add. - * \param srcOffsetX the X offset of the region of the film to add. - * \param srcOffsetY the y offset of the region of the film to add. - * \param srcWidth the width of the region of the film to add. - * \param srcHeight the height of the region of the film to add. - * \param dstOffsetX the X offset of the destination film. - * \param dstOffsetY the Y offset of the destination film. - * - */ - virtual void AddFilm(const Film &film, - const unsigned int srcOffsetX, const unsigned int srcOffsetY, - const unsigned int srcWidth, const unsigned int srcHeight, - const unsigned int dstOffsetX, const unsigned int dstOffsetY) = 0; - /*! - * \brief Saves all Film output channels defined in the current - * RenderSession. This method can not be used with a standalone film. - */ - virtual void SaveOutputs() const = 0; - - /*! - * \brief Saves the specified Film output channels. - * - * \param fileName is the name of the file where to save the output channel. - * \param type is the Film output channel to use. It must be one - * of the enabled channels. - * \param props can include some additional information defined by the - * following property: - * "id" for the ID of MATERIAL_ID_MASK, - * "id" for the index of RADIANCE_GROUP, - * "id" for the ID of BY_MATERIAL_ID. - * "id" for the ID of OBJECT_ID_MASK, - * "id" for the ID of BY_OBJECT_ID. - */ - virtual void SaveOutput(const std::string &fileName, const FilmOutputType type, const luxrays::Properties &props) const = 0; - - /*! - * \brief Serializes a Film in a file. - * - * \param fileName is the name of the file where to serialize the film. - */ - virtual void SaveFilm(const std::string &fileName) const = 0; - - /*! - * \brief Returns the total sample count. - * - * \return the total sample count. - */ - virtual double GetTotalSampleCount() const = 0; - /*! - * \brief Returns the size (in float or unsigned int) of a Film output channel. - * - * \param type is the Film output channel to use. - * - * \return the size (in float or unsigned int) of a Film output channel. - */ - virtual size_t GetOutputSize(const FilmOutputType type) const = 0; - /*! - * \brief Returns if a film channel output is available. - * - * \param type is the Film output channel to use. - * - * \return true if the output is available, false otherwise. - */ - virtual bool HasOutput(const FilmOutputType type) const = 0; - /*! - * \brief Returns the number of output channels of the passed type. - * - * \param type is the Film output channel to use. - * - * \return the number of output channels. Returns 0 if the output channel is not available. - */ - virtual unsigned int GetOutputCount(const FilmOutputType type) const = 0; - /*! - * \brief Returns the number of radiance groups. - * - * \return the number of radiance groups. - */ - virtual unsigned int GetRadianceGroupCount() const = 0; - /*! - * \brief Fills the buffer with a Film output channel. - * - * \param type is the Film output channel to use. It must be one - * of the enabled channels in RenderConfig. The supported template types are - * float and unsigned int. - * \param buffer is the place where the data will be copied. - * \param index of the buffer to use. Usually 0, however, for instance, - * if more than one light group is used, select the group to return. - */ - template void GetOutput(const FilmOutputType type, T *buffer, const unsigned int index = 0, - const bool executeImagePipeline = true) { - throw std::runtime_error("Called Film::GetOutput() with wrong type"); - } - /*! - * \brief Returns if a film channel is available. - * - * \param type is the Film channel to use. - * - * \return true if the output is available, false otherwise. - */ - virtual bool HasChannel(const FilmChannelType type) const = 0; - /*! - * \brief Returns the number of channels of the passed type. - * - * \param type is the Film channel to use. - * - * \return the number of channels. Returns 0 if the channel is not available. - */ - virtual unsigned int GetChannelCount(const FilmChannelType type) const = 0; - /*! - * \brief Returns a pointer to the type of channel requested. The channel is - * not normalized (if it has a weight channel). - * - * \param type is the Film output channel to return. It must be one - * of the enabled channels in RenderConfig. The supported template types are - * float and unsigned int. - * \param index of the buffer to use. Usually 0, however, for instance, - * if more than one light group is used, select the group to return. - * - * \return a pointer to the requested raw buffer. - */ - template const T *GetChannel(const FilmChannelType type, const unsigned int index = 0, - const bool executeImagePipeline = true) { - throw std::runtime_error("Called Film::GetChannel() with wrong type"); - } - /*! - * \brief Sets configuration Properties with new values. This method can be - * used only when the Film is not in use by a RenderSession. Image pipeline - * and radiance scale values can be redefined with this method. - * - * \param props are the Properties to set. - */ - virtual void Parse(const luxrays::Properties &props) = 0; - /*! - * \brief Delete all image pipelines and goes the default image - * pipeline (AutoLinearToneMap + GammaCorrectionPlugin). This method can - * be used with a stand alone film or with a session film. - * - */ - virtual void DeleteAllImagePipelines() = 0; - - /*! - * \brief Execute the an image pipeline. - * - * \param index is the index of the image pipeline to run. - * - */ - virtual void ExecuteImagePipeline(const unsigned int index) = 0; - /*! - * \brief Asynchronously execute an image pipeline. Only one image pipeline - * can be executed asynchronously at time. - * - * \param index is the index of the image pipeline to run. - * - */ - virtual void AsyncExecuteImagePipeline(const unsigned int index) = 0; - /*! - * \brief wait for the end of the asynchronously execution of an image pipeline. - * - */ - virtual void WaitAsyncExecuteImagePipeline() = 0; - /*! - * \brief wait for the end of the asynchronously execution of an image pipeline. - * - * \return if the execution of an asynchronously image pipeline has terminated. - */ - virtual bool HasDoneAsyncExecuteImagePipeline() = 0; - -protected: - virtual void GetOutputFloat(const FilmOutputType type, float *buffer, const unsigned int index, - const bool executeImagePipeline = true) = 0; - virtual void GetOutputUInt(const FilmOutputType type, unsigned int *buffer, const unsigned int index, - const bool executeImagePipeline = true) = 0; - - virtual const float *GetChannelFloat(const FilmChannelType type, const unsigned int index, - const bool executeImagePipeline = true) = 0; - virtual const unsigned int *GetChannelUInt(const FilmChannelType type, const unsigned int index, - const bool executeImagePipeline = true) = 0; -}; - -template<> CPP_API void Film::GetOutput(const FilmOutputType type, float *buffer, - const unsigned int index, const bool executeImagePipeline); -template<> CPP_API void Film::GetOutput(const FilmOutputType type, unsigned int *buffer, - const unsigned int index, const bool executeImagePipeline); -template<> CPP_API const float *Film::GetChannel(const FilmChannelType type, - const unsigned int index, const bool executeImagePipeline); -template<> CPP_API const unsigned int *Film::GetChannel(const FilmChannelType type, - const unsigned int index, const bool executeImagePipeline); - -class Scene; - -/*! - * \brief Camera stores camera definitions. - */ -CPP_EXPORT class CPP_API Camera { -public: - /*! - * \brief Types of cameras. - */ - typedef enum { - // This list must be aligned with slg::Camera::CameraType - PERSPECTIVE, - ORTHOGRAPHIC, - STEREO, - ENVIRONMENT - } CameraType; - - virtual ~Camera(); - - /*! - * \brief Returns the camera type. - * - * \return a camera type. - */ - virtual const CameraType GetType() const = 0; - /*! - * \brief Translates by vector t. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param t is the translation vector. - */ - virtual void Translate(const float x, const float y, const float z) const = 0; - /*! - * \brief Translates left by t. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param t is the translation distance. - */ - virtual void TranslateLeft(const float t) const = 0; - /*! - * \brief Translates right by t. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param t is the translation distance. - */ - virtual void TranslateRight(const float t) const = 0; - /*! - * \brief Translates forward by t. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param t is the translation distance. - */ - virtual void TranslateForward(const float t) const = 0; - /*! - * \brief Translates backward by t. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param t is the translation distance. - */ - virtual void TranslateBackward(const float t) const = 0; - - /*! - * \brief Rotates by angle around the axis. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param angle is the rotation angle. - * \param axis is the rotation axis. - */ - virtual void Rotate(const float angle, const float x, const float y, const float z) const = 0; - /*! - * \brief Rotates left by angle. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param angle is the rotation angle. - */ - virtual void RotateLeft(const float angle) const = 0; - /*! - * \brief Rotates right by angle. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param angle is the rotation angle. - */ - virtual void RotateRight(const float angle) const = 0; - /*! - * \brief Rotates up by angle. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param angle is the rotation angle. - */ - virtual void RotateUp(const float angle) const = 0; - /*! - * \brief Rotates down by angle. This method can be used only when - * the Scene is not in use by a RenderSession. - * - * \param angle is the rotation angle. - */ - virtual void RotateDown(const float angle) const = 0; -}; - -/*! - * \brief Scene stores textures, materials and objects definitions. - */ -CPP_EXPORT class CPP_API Scene { -public: - /*! - * \brief Types of image map channel selection. - */ - typedef enum { - // This list must be aligned with slg::ImageMapStorage::ChannelSelectionType - DEFAULT, - RED, - GREEN, - BLUE, - ALPHA, - MEAN, - WEIGHTED_MEAN, - RGB - } ChannelSelectionType; - /*! - * \brief Types of image map wrap mode. - */ - typedef enum { - // This list must be aligned with slg::ImageMapStorage::WrapType - REPEAT, - BLACK, - WHITE, - CLAMP - } WrapType; - /*! - * \brief Types of strands tessellation. - */ - typedef enum { - // This list must be aligned with slg::StrendsShape::TessellationType - TESSEL_RIBBON, - TESSEL_RIBBON_ADAPTIVE, - TESSEL_SOLID, - TESSEL_SOLID_ADAPTIVE - } StrandsTessellationType; - - /*! - * \brief Create a new empty Scene. - * - * \param imageScale defines the scale used for storing any kind of image in memory. - */ - static Scene *Create(const float imageScale = 1.f); - /*! - * \brief Creates a new Scene as defined by props. - * - * \param props are the Properties used to build the new Scene. - * \param imageScale defines the scale used for storing any kind of image in memory. - */ - static Scene *Create(const luxrays::Properties &props, const float imageScale = 1.f); - /*! - * \brief Creates a new Scene as defined in fileName file. - * - * \param fileName is the name of the file with the scene description to read. It - * can be a text SDL file or a serialized binary file. The extension for the - * binary format must be ".bsc". - * \param imageScale defines the scale used for storing any kind of image in - * memory. This parameter has no effect when loading binary serialized binary - * file. - */ - static Scene *Create(const std::string &fileName, const float imageScale = 1.f); - - virtual ~Scene(); - - /*! - * \brief Returns the bounding box of the complete scene (as minimum and - * maximum point). It is available only during the rendering (i.e. after a - * RenderSession::Start()). - */ - virtual void GetBBox(float min[3], float max[3]) const = 0; - /*! - * \brief Returns the Camera of the scene. - * - * \return a reference to the Camera of this Scene. It is available only - * during the rendering (i.e. after a RenderSession::Start()). - */ - virtual const Camera &GetCamera() const = 0; - /*! - * \brief Defines an image map (to be later used in textures, infinite lights, etc.). - * The memory allocated for pixels array is NOT freed by the Scene class nor - * is used after the execution of this method. The types supported are - * "unsigned char", "unsigned short" (as a place holder for half type) and "float". - * - * \param imgMapName is the name of the defined image map. - * \param pixels is a pointer to an array of image map pixels. - * \param gamma is the gamma correction value of the image. - * \param channels is the number of data used for each pixel (1 or 3). - * \param width is the width of the image map. - * \param height is the height of the image map. - */ - template void DefineImageMap(const std::string &imgMapName, - T *pixels, const float gamma, const unsigned int channels, - const unsigned int width, const unsigned int height, - ChannelSelectionType selectionType = DEFAULT, - WrapType wrapType = REPEAT) { - throw std::runtime_error("Called Scene::DefineImageMap() with wrong type"); - } - /*! - * \brief Check if an image map with the given name has been defined. - * - * \param imgMapName is the name to check. - * - * \return true if the image map has been defined, false otherwise. - */ - virtual bool IsImageMapDefined(const std::string &imgMapName) const = 0; - /*! - * \brief Sets if the Scene class destructor will delete the arrays - * pointed to by the defined meshes. - * - * \param v defines if the Scene class destructor will delete the mesh data. - */ - virtual void SetDeleteMeshData(const bool v) = 0; - /*! - * \brief Sets the applied transformation matrix for a normal - * mesh (i.e. not instanced or motion blurred). - * - * \param meshName is the name of the mesh to use. - * \param appliedTransMat is the transformation 4x4 matrix to use. - */ - virtual void SetMeshAppliedTransformation(const std::string &meshName, - const float *appliedTransMat) = 0; - /*! - * \brief Defines a mesh (to be later used in one or more scene objects). The - * memory allocated for the ExtTriangleMesh is always freed by the Scene class, - * however freeing of memory for the vertices, triangle indices, etc. depends - * on the setting of SetDeleteMeshData(). - * NOTE: vertices and triangles buffers MUST be allocated with - * Scene::AllocVerticesBuffer() and Scene::AllocTrianglesBuffer(). - * - * \param meshName is the name of the defined mesh. - * \param plyNbVerts is the number of mesh vertices. - * \param plyNbTris is the number of mesh triangles. - * \param p is a pointer to an array of vertices. Embree accelerator has - * a very special requirement. The 4 bytes after the z-coordinate of the - * last vertex have to be readable memory, thus padding is required. - * \param vi is a pointer to an array of triangles. - * \param n is a pointer to an array of normals. It can be NULL. - * \param uv is a pointer to an array of UV coordinates. It can be NULL. - * \param cols is a pointer to an array of vertices colors. It can be NULL. - * \param alphas is a pointer to an array of vertices alphas. It can be NULL. - */ - virtual void DefineMesh(const std::string &meshName, - const long plyNbVerts, const long plyNbTris, - float *p, unsigned int *vi, float *n, float *uv, - float *cols, float *alphas) = 0; - /*! - * \brief Save a previously defined mesh to file system in PLY or BPY format. - * - * \param meshName is the name of the defined mesh to be saved. - * \param fileName is the name of the file where to save the mesh. If it has - * the extension ".ply", the text PLY format will be used. If it has - * the extension ".bpy", the text PLY format will be used. - */ - virtual void SaveMesh(const std::string &meshName, const std::string &fileName) = 0; - /*! - * \brief Defines a mesh (to be later used in one or more scene objects) starting - * from the strands/hairs definition included in strandsFile. - * - * \param shapeName is the name of the defined shape. - * \param strandsFile includes all information about the strands . - * \param tesselType is the tessellation used to transform the strands in a triangle mesh. - * \param adaptiveMaxDepth is maximum number of subdivisions for adaptive tessellation. - * \param adaptiveError is the error threshold for adaptive tessellation. - * \param solidSideCount is the number of sides for solid tessellation. - * \param solidCapBottom is a flag to set if strands has to have a bottom cap. - * \param solidCapTop is a flag to set if strands has to have a top cap. - * \param useCameraPosition is a flag to set if ribbon tessellation has to - * be faced toward the camera. - */ - virtual void DefineStrands(const std::string &shapeName, const luxrays::cyHairFile &strandsFile, - const StrandsTessellationType tesselType, - const unsigned int adaptiveMaxDepth, const float adaptiveError, - const unsigned int solidSideCount, const bool solidCapBottom, const bool solidCapTop, - const bool useCameraPosition) = 0; - /*! - * \brief Check if a mesh with the given name has been defined. - * - * \param meshName is the name to check. - * - * \return true if the mesh has been defined, false otherwise. - */ - virtual bool IsMeshDefined(const std::string &meshName) const = 0; - /*! - * \brief Check if a texture with the given name has been defined. - * - * \param texName is the name to check. - * - * \return true if the texture has been defined, false otherwise. - */ - virtual bool IsTextureDefined(const std::string &texName) const = 0; - /*! - * \brief Check if a material with the given name has been defined. - * - * \param matName is the name to check. - * - * \return true if the material has been defined, false otherwise. - */ - virtual bool IsMaterialDefined(const std::string &matName) const = 0; - /*! - * \brief Returns the number of light sources in the Scene. - * - * \return the number of light sources in the Scene. - */ - virtual const unsigned int GetLightCount() const = 0; - /*! - * \brief Returns the number of objects in the Scene. - * - * \return the number of objects in the Scene. - */ - virtual const unsigned int GetObjectCount() const = 0; - - /*! - * \brief Edits or creates camera, textures, materials and/or objects - * based on the Properties defined. If the scene is in use by a - * RenderSession, it must be called between a RenderSession::BeginSceneEdit() - * and RenderSession::EndSceneEdit(). - * - * \param props are the Properties with the definition of camera, textures, - * materials and/or objects. - */ - virtual void Parse(const luxrays::Properties &props) = 0; - - /*! - * \brief Duplicate an object in an instance using the passed transformation. - * - * \param srcObjName is the name of the object to duplicate. - * \param dstObjName is the name of the object to create. - * \param transMat is the transformation 4x4 matrix to use. - * \param objectID is object ID that will be assigned to the duplicate. - * If the ID is 0xffffffff (the Null index), the object ID of - * the source object will be copied. - */ - virtual void DuplicateObject(const std::string &srcObjName, const std::string &dstObjName, - const float *transMat, const unsigned int objectID = 0xffffffff) = 0; - /*! - * \brief Duplicate an object multiple times in instances using the passed - * transformations. Mostly useful for fast creating many copies of the same - * object (for instance for particles). - * - * \param srcObjName is the name of the object to duplicate. - * \param dstObjNamePrefix is the prefix of the names of the object to create. The - * number of the copy will be appended. - * \param count is the number of the object to create. - * \param transMat is an array of transformation 4x4 matrices to use. - * \param objectIDs is an array of object IDs that will be assigned to the duplicates. - * If NULL is passed, the object ID of the source object will be copied to all duplicates. - */ - virtual void DuplicateObject(const std::string &srcObjName, const std::string &dstObjNamePrefix, - const unsigned int count, const float *transMat, const unsigned int *objectIDs = NULL) = 0; - /*! - * \brief Duplicate an object in a motion blur instance using the passed transformation. - * - * \param srcObjName is the name of the object to duplicate. - * \param dstObjName is the name of the object to create. - * \param steps is the number of motion blur steps. - * \param times is an array of times to use - * \param transMat is an array of the transformation 4x4 matrix to use. - * \param objectID is object ID that will be assigned to the duplicate. - * If the ID is 0xffffffff (the Null index), the object ID of - * the source object will be copied. - */ - virtual void DuplicateObject(const std::string &srcObjName, const std::string &dstObjName, - const unsigned int steps, const float *times, const float *transMat, - const unsigned int objectID = 0xffffffff) = 0; - /*! - * \brief Duplicate an object multiple times in a motion blur instance using - * the passed transformations. Mostly useful for fast creating many copies of - * the same object (for instance for particles). - * - * \param srcObjName is the name of the object to duplicate. - * \param dstObjNamePrefix is the name of the object to create. - * \param dstObjNamePrefix is the prefix of the names of the object to create. The - * number of the copy will be appended. - * \param count is the number of the object to create. - * \param steps is the number of motion blur steps. - * \param times is an array of times to use - * \param transMat is an array of the transformation 4x4 matrix to use. - * \param objectIDs is an array of object IDs that will be assigned to the duplicates. - * If NULL is passed, the object ID of the source object will be copied to all duplicates. - */ - virtual void DuplicateObject(const std::string &srcObjName, const std::string &dstObjNamePrefix, - const unsigned int count, const unsigned int steps, const float *times, - const float *transMat, const unsigned int *objectIDs = NULL) = 0; - /*! - * \brief Apply a transformation to an object - * - * \param objName is the name of the object to transform. - * \param transMat is the transformation 4x4 matrix to apply. - */ - virtual void UpdateObjectTransformation(const std::string &objName, const float *transMat) = 0; - /*! - * \brief Apply a new material to an object - * - * \param objName is the name of the object to apply the material to. - * \param matName is the new material name. - */ - virtual void UpdateObjectMaterial(const std::string &objName, const std::string &matName) = 0; - - /*! - * \brief Deletes an object from the scene. - * - * \param objName is the name of the object to delete. - */ - virtual void DeleteObject(const std::string &objName) = 0; - - /*! - * \brief Deletes a light from the scene. - * - * \param lightName is the name of the object to delete. Note: to delete - * area lights, use DeleteObject(). - */ - virtual void DeleteLight(const std::string &lightName) = 0; - - /*! - * \brief Removes all unused image maps. - */ - virtual void RemoveUnusedImageMaps() = 0; - /*! - * \brief Removes all unused textures. - */ - virtual void RemoveUnusedTextures() = 0; - /*! - * \brief Removes all unused materials. - */ - virtual void RemoveUnusedMaterials() = 0; - /*! - * \brief Removes all unused meshes. - */ - virtual void RemoveUnusedMeshes() = 0; - - /*! - * \brief Returns all the Properties required to define this Scene. - * - * \return a reference to the Properties of this Scene. - */ - virtual const luxrays::Properties &ToProperties() const = 0; - /*! - * \brief Serializes a Scene in a file. - * - * \param fileName is the name of the file where to serialize the scene. - */ - virtual void Save(const std::string &fileName) const = 0; - - /*! - * \brief This must be used to allocate Mesh vertices buffer. - */ - static float *AllocVerticesBuffer(const unsigned int meshVertCount); - /*! - * \brief This must be used to allocate Mesh triangles buffer. - */ - static unsigned int *AllocTrianglesBuffer(const unsigned int meshTriCount); - -protected: - virtual void DefineImageMapUChar(const std::string &imgMapName, - unsigned char *pixels, const float gamma, const unsigned int channels, - const unsigned int width, const unsigned int height, - ChannelSelectionType selectionType, WrapType wrapType) = 0; - virtual void DefineImageMapHalf(const std::string &imgMapName, - unsigned short *pixels, const float gamma, const unsigned int channels, - const unsigned int width, const unsigned int height, - ChannelSelectionType selectionType, WrapType wrapType) = 0; - virtual void DefineImageMapFloat(const std::string &imgMapName, - float *pixels, const float gamma, const unsigned int channels, - const unsigned int width, const unsigned int height, - ChannelSelectionType selectionType, WrapType wrapType) = 0; -}; - -template<> void CPP_API Scene::DefineImageMap(const std::string &imgMapName, - unsigned char *pixels, const float gamma, const unsigned int channels, - const unsigned int width, const unsigned int height, - Scene::ChannelSelectionType selectionType, Scene::WrapType wrapType); -template<> void CPP_API Scene::DefineImageMap(const std::string &imgMapName, - unsigned short *pixels, const float gamma, const unsigned int channels, - const unsigned int width, const unsigned int height, - Scene::ChannelSelectionType selectionType, Scene::WrapType wrapType); -template<> void CPP_API Scene::DefineImageMap(const std::string &imgMapName, - float *pixels, const float gamma, const unsigned int channels, - const unsigned int width, const unsigned int height, - Scene::ChannelSelectionType selectionType, Scene::WrapType wrapType); - -/*! - * \brief RenderConfig stores all the configuration settings used to render a - * scene. - */ -CPP_EXPORT class CPP_API RenderConfig { -public: - /*! - * \brief Create a new RenderConfig using the provided Properties and - * (optional) Scene. - * - * \param props are the Properties used to build the new RenderConfig. - * \param scene is the Scene used to build the new RenderConfig. If specified, - * the Scene will not be deleted by the destructor. If NULL, the Scene will be - * read from the file specified in the "scene.file" Property and deleted by - * the destructor. - */ - static RenderConfig *Create(const luxrays::Properties &props, Scene *scene = NULL); - /*! - * \brief Create a new RenderConfig using the provided binary file. - * - * \param fileName is the binary file used to build the new - * RenderConfig. The extension for the binary format must be ".bcf". - */ - static RenderConfig *Create(const std::string &fileName); - /*! - * \brief Create a new RenderConfig using the provided resume binary file. - * - * \param fileName is the binary file used to build the new - * RenderConfig. The extension for the binary format must be ".rsm". - * \param startState the pointer to the render state will be returned here. - * \param startFilm the pointer to the film will be returned here. - */ - static RenderConfig *Create(const std::string &fileName, RenderState **startState, Film **startFilm); - - virtual ~RenderConfig(); - - /*! - * \brief Returns a reference to the Properties used to create the RenderConfig. - * - * \return the RenderConfig properties. - */ - virtual const luxrays::Properties &GetProperties() const = 0; - /*! - * \brief Returns the Property with the given name or the default value if it - * has not been defined. - * - * \return the Property with the given name. - */ - virtual const luxrays::Property GetProperty(const std::string &name) const = 0; - - /*! - * \brief Returns a reference to all Properties (including default values) - * defining the RenderConfig. - * - * \return the RenderConfig properties. - */ - virtual const luxrays::Properties &ToProperties() const = 0; - - /*! - * \brief Returns a reference to the Scene used in the RenderConfig. - * - * \return the reference to the RenderConfig Scene. - */ - virtual Scene &GetScene() const = 0; - - /*! - * \brief Sets configuration Properties with new values. This method can be - * used only when the RenderConfig is not in use by a RenderSession. - * - * \param props are the Properties to set. - */ - virtual void Parse(const luxrays::Properties &props) = 0; - /*! - * \brief Deletes any configuration Property starting with the given prefix. - * This method can be used only when the RenderConfig is not in use by a - * RenderSession. - * - * \param prefix is the prefix of the Properties to delete. - */ - virtual void Delete(const std::string &prefix) = 0; - - /*! - * \brief Return the configured Film width, height, sub-region width, height, - * and if sub-region is enabled. - * - * \param filmFullWidth is where the configured Film width is returned if the - * pointer is not NULL. - * \param filmFullHeight is where the configured Film height is returned if the - * pointer is not NULL. - * \param filmSubRegion is an array of 4 values with the horizontal - * (followed by the vertical) begin and end of the Film region to - * render (in pixels). - * - * \return true if there is a sub-region to render, false otherwise. - */ - virtual bool GetFilmSize(unsigned int *filmFullWidth, unsigned int *filmFullHeight, - unsigned int *filmSubRegion) const = 0; - - /*! - * \brief Delete the scene passed to the constructor when the class - * destructor is invoked. - */ - virtual void DeleteSceneOnExit() = 0; - - /*! - * \brief Save all the scene related information (the LuxCore RenderConfig, - * and Scene) in a file. - */ - virtual void Save(const std::string &fileName) const = 0; - /*! - * \brief Save all the scene related information (the LuxCore RenderConfig, - * and Scene) in a directory using text format for the SDL. This performs the - * same work of FILESAVER render engine. - */ - virtual void Export(const std::string &dirName) const = 0; - - /*! - * \brief Returns a Properties container with all default values. - * - * \return the default Properties. - */ - static const luxrays::Properties &GetDefaultProperties(); -}; - -/*! - * \brief RenderState is used to resume a rendering from a previous saved point. - */ -CPP_EXPORT class CPP_API RenderState { -public: - /*! - * \brief Creates a new RenderState from a file. - * - * \param fileName id the file name of the render state file to load. - */ - static RenderState *Create(const std::string &fileName); - virtual ~RenderState(); - - /*! - * \brief Serializes a RenderState in a file. - * - * \param fileName is the name of the file where to serialize the render state. - */ - virtual void Save(const std::string &fileName) const = 0; -}; - -/*! - * \brief RenderSession executes a rendering based on the RenderConfig provided. - */ -CPP_EXPORT class CPP_API RenderSession { -public: - /*! - * \brief Creates a new RenderSession using the provided RenderConfig. - * - * \param config is the RenderConfig used to create the rendering session. The - * RenderConfig is not deleted by the destructor. - * \param startState is the optional RenderState to use to resume rendering. The - * memory for RenderState is freed by RenderSession. - * \param startFilm is the optional Film to use to resume rendering. The - * memory for Film is freed by RenderSession. - */ - static RenderSession *Create(const RenderConfig *config, RenderState *startState = NULL, Film *startFilm = NULL); - - /*! - * \brief Creates a new RenderSession using the provided RenderConfig. - * - * \param config is the RenderConfig used to create the rendering session. The - * RenderConfig is not deleted by the destructor. - * \param startStateFileName is the file name of a RenderState to use to resume rendering. - * \param startFilmFileName is the file name of a Film to use to resume rendering. - */ - static RenderSession *Create(const RenderConfig *config, const std::string &startStateFileName, const std::string &startFilmFileName); - - virtual ~RenderSession(); - - /*! - * \brief Returns a reference to the RenderingConfig used to create this - * RenderSession. - * - * \return a reference to the RenderingConfig. - */ - virtual const RenderConfig &GetRenderConfig() const = 0; - - /*! - * \brief Returns a pointer to the current RenderState. The session must be - * paused. - * - * \return a pointer to the RenderState. - */ - virtual RenderState *GetRenderState() = 0; - - /*! - * \brief Starts the rendering. - */ - virtual void Start() = 0; - /*! - * \brief Stops the rendering. - */ - virtual void Stop() = 0; - - /*! - * \brief It can be used to check if the session has been started. - */ - virtual bool IsStarted() const = 0; - - /*! - * \brief Stops the rendering and allows to edit the Scene. - */ - virtual void BeginSceneEdit() = 0; - /*! - * \brief Ends the Scene editing and start the rendering again. - */ - virtual void EndSceneEdit() = 0; - - /*! - * \brief It can be used to check if the session is in scene editing mode. - */ - virtual bool IsInSceneEdit() const = 0; - - /*! - * \brief Pause the rendering. - */ - virtual void Pause() = 0; - - /*! - * \brief Resume the rendering. - */ - virtual void Resume() = 0; - - /*! - * \brief It can be used to check if the session is in scene editing mode. - */ - virtual bool IsInPause() const = 0; - - /*! - * \brief It can be used to check if the rendering is over. - */ - virtual bool HasDone() const = 0; - - /*! - * \brief Used to wait for the end of the rendering. - */ - virtual void WaitForDone() const = 0; - - /*! - * \brief Used to wait for the next frame with real-time render engines like - * RTPATHOCL. It does nothing with other render engines. - */ - virtual void WaitNewFrame() = 0; - - /*! - * \brief Returns a reference to a Film with the output of the rendering. - * - * \return the reference to the Film. - */ - virtual Film &GetFilm() = 0; - - /*! - * \brief Updates the statistics. - * This function perform also all periodic checks and tasks (like saving - * the film outputs, etc.). - */ - virtual void UpdateStats() = 0; - /*! - * \brief Returns a list of statistics related to the ongoing rendering. The - * returned Properties is granted to have content only after the first call - * to the UpdateStats method. - * - * \return a Properties container with the statistics. - */ - virtual const luxrays::Properties &GetStats() const = 0; - - /*! - * \brief Dynamic edit the definition of RenderConfig properties. - * - * \param props are the Properties with the definition of: film.imagepipeline(s).* - * (including radiance channel scales), film.outputs.*, film.width or film.height. - */ - virtual void Parse(const luxrays::Properties &props) = 0; - - /*! - * \brief Save all the rendering related information (the LuxCore RenderConfig, - * Scene, RenderState and Film) in a file for a later restart. The resume - * file extension must be ".rsm". - * - * \param fileName is the binary file used to save. - */ - virtual void SaveResumeFile(const std::string &fileName) = 0; -}; - -} - -#endif /* _LUXCORE_H */ diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/cyhair/cyHairFile.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/cyhair/cyHairFile.h deleted file mode 100644 index c516aeb8a0..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/cyhair/cyHairFile.h +++ /dev/null @@ -1,428 +0,0 @@ -// cyCodeBase by Cem Yuksel -// [www.cemyuksel.com] -//------------------------------------------------------------------------------- -/// -/// \file cyHairFile.h -/// \author Cem Yuksel -/// \version 1.0 -/// \date April 4, 2007 -/// -/// \brief class for HAIR file type -/// -/// Extended with a couple of additional features for LuxRender project. -/// -//------------------------------------------------------------------------------- - -// NOTE: this file is included in LuxCore so any external dependency must be -// avoided here - -#ifndef _CY_HAIR_FILE_H_INCLUDED_ -#define _CY_HAIR_FILE_H_INCLUDED_ - -//------------------------------------------------------------------------------- - -#include -#include -#include - -#include - -namespace luxrays { - -//------------------------------------------------------------------------------- - -#define CY_HAIR_FILE_SEGMENTS_BIT 1 -#define CY_HAIR_FILE_POINTS_BIT 2 -#define CY_HAIR_FILE_THICKNESS_BIT 4 -#define CY_HAIR_FILE_TRANSPARENCY_BIT 8 -#define CY_HAIR_FILE_COLORS_BIT 16 -#define CY_HAIR_FILE_UVS_BIT 32 - -#define CY_HAIR_FILE_INFO_SIZE 88 - -// File read errors -#define CY_HAIR_FILE_ERROR_CANT_OPEN_FILE -1 -#define CY_HAIR_FILE_ERROR_CANT_READ_HEADER -2 -#define CY_HAIR_FILE_ERROR_WRONG_SIGNATURE -3 -#define CY_HAIR_FILE_ERROR_READING_SEGMENTS -4 -#define CY_HAIR_FILE_ERROR_READING_POINTS -5 -#define CY_HAIR_FILE_ERROR_READING_THICKNESS -6 -#define CY_HAIR_FILE_ERROR_READING_TRANSPARENCY -7 -#define CY_HAIR_FILE_ERROR_READING_COLORS -8 -#define CY_HAIR_FILE_ERROR_READING_UVS -9 - -//------------------------------------------------------------------------------- - -/// Hair file header -struct cyHairFileHeader -{ - char signature[4]; ///< This should be "HAIR" - unsigned int hair_count; ///< number of hair strands - unsigned int point_count; ///< total number of points of all strands - unsigned int arrays; ///< bit array of data in the file - - unsigned int d_segments; ///< default number of segments of each strand - float d_thickness; ///< default thickness of hair strands - float d_transparency; ///< default transparency of hair strands - float d_color[3]; ///< default color of hair strands - - char info[CY_HAIR_FILE_INFO_SIZE]; ///< information about the file -}; - -//------------------------------------------------------------------------------- - -/// HAIR file class -CPP_EXPORT class CPP_API cyHairFile -{ -public: - cyHairFile() : segments(NULL), points(NULL), thickness(NULL), transparency(NULL), colors(NULL), uvs(NULL) { Initialize(); } - ~cyHairFile() { Initialize(); } - - - ////////////////////////////////////////////////////////////////////////// - ///@name Constant Data Access Methods - - const cyHairFileHeader& GetHeader() const { return header; } ///< Use this method to access header data. - const unsigned short* GetSegmentsArray() const { return segments; } ///< Returns segments array (segment count for each hair strand). - const float* GetPointsArray() const { return points; } ///< Returns points array (xyz coordinates of each hair point). - const float* GetThicknessArray() const { return thickness; } ///< Returns thickness array (thickness at each hair point}. - const float* GetTransparencyArray() const { return transparency; } ///< Returns transparency array (transparency at each hair point). - const float* GetColorsArray() const { return colors; } ///< Returns colors array (rgb color at each hair point). - const float* GetUVsArray() const { return uvs; } ///< Returns uvs array (uv at each hair point). - - - ////////////////////////////////////////////////////////////////////////// - ///@name Data Access Methods - - unsigned short* GetSegmentsArray() { return segments; } ///< Returns segments array (segment count for each hair strand). - float* GetPointsArray() { return points; } ///< Returns points array (xyz coordinates of each hair point). - float* GetThicknessArray() { return thickness; } ///< Returns thickness array (thickness at each hair point}. - float* GetTransparencyArray() { return transparency; } ///< Returns transparency array (transparency at each hair point). - float* GetColorsArray() { return colors; } ///< Returns colors array (rgb color at each hair point). - float* GetUVsArray() { return uvs; } ///< Returns uvs array (uv at each hair point). - - - ////////////////////////////////////////////////////////////////////////// - ///@name Methods for Setting Array Sizes - - /// Deletes all arrays and initializes the header data. - void Initialize() - { - if ( segments ) delete [] segments; - if ( points ) delete [] points; - if ( colors ) delete [] colors; - if ( thickness ) delete [] thickness; - if ( transparency ) delete [] transparency; - if ( uvs ) delete [] uvs; - header.signature[0] = 'H'; - header.signature[1] = 'A'; - header.signature[2] = 'I'; - header.signature[3] = 'R'; - header.hair_count = 0; - header.point_count = 0; - header.arrays = 0; // no arrays - header.d_segments = 0; - header.d_thickness = 1.0f; - header.d_transparency = 0.0f; - header.d_color[0] = 1.0f; - header.d_color[1] = 1.0f; - header.d_color[2] = 1.0f; - memset( header.info, '\0', CY_HAIR_FILE_INFO_SIZE ); - } - - /// Sets the hair count, re-allocates segments array if necessary. - void SetHairCount( int count ) - { - header.hair_count = count; - if ( segments ) { - delete [] segments; - segments = new unsigned short[ header.hair_count ]; - } - } - - // Sets the point count, re-allocates points, thickness, transparency, and colors arrays if necessary. - void SetPointCount( int count ) - { - header.point_count = count; - if ( points ) { - delete [] points; - points = new float[ header.point_count*3 ]; - } - if ( thickness ) { - delete [] thickness; - thickness = new float[ header.point_count ]; - } - if ( transparency ) { - delete [] transparency; - transparency = new float[ header.point_count ]; - } - if ( colors ) { - delete [] colors; - colors = new float[ header.point_count*3 ]; - } - if ( uvs ) { - delete [] uvs; - uvs = new float[ header.point_count*2 ]; - } - } - - /// Use this function to allocate/delete arrays. - /// Before you call this method set hair count and point count. - /// Note that a valid HAIR file should always have points array. - void SetArrays( int array_types ) - { - header.arrays = array_types; - if ( header.arrays & CY_HAIR_FILE_SEGMENTS_BIT && !segments ) segments = new unsigned short[header.hair_count]; - if ( ! (header.arrays & CY_HAIR_FILE_SEGMENTS_BIT) && segments ) { delete [] segments; segments=NULL; } - if ( header.arrays & CY_HAIR_FILE_POINTS_BIT && !points ) points = new float[header.point_count*3]; - if ( ! (header.arrays & CY_HAIR_FILE_POINTS_BIT) && points ) { delete [] points; points=NULL; } - if ( header.arrays & CY_HAIR_FILE_THICKNESS_BIT && !thickness ) thickness = new float[header.point_count]; - if ( ! (header.arrays & CY_HAIR_FILE_THICKNESS_BIT) && thickness ) { delete [] thickness; thickness=NULL; } - if ( header.arrays & CY_HAIR_FILE_TRANSPARENCY_BIT && !transparency ) transparency = new float[header.point_count]; - if ( ! (header.arrays & CY_HAIR_FILE_TRANSPARENCY_BIT) && transparency ) { delete [] transparency; transparency=NULL; } - if ( header.arrays & CY_HAIR_FILE_COLORS_BIT && !colors ) colors = new float[header.point_count*3]; - if ( ! (header.arrays & CY_HAIR_FILE_COLORS_BIT) && colors ) { delete [] colors; colors=NULL; } - if ( header.arrays & CY_HAIR_FILE_UVS_BIT && !uvs ) uvs = new float[header.point_count*2]; - if ( ! (header.arrays & CY_HAIR_FILE_UVS_BIT) && uvs ) { delete [] uvs; uvs=NULL; } - } - - /// Sets default number of segments for all hair strands, which is used if segments array does not exist. - void SetDefaultSegmentCount( int s ) { header.d_segments = s; } - - /// Sets default hair strand thickness, which is used if thickness array does not exist. - void SetDefaultThickness( float t ) { header.d_thickness = t; } - - /// Sets default hair strand transparency, which is used if transparency array does not exist. - void SetDefaultTransparency( float t ) { header.d_transparency = t; } - - /// Sets default hair color, which is used if color array does not exist. - void SetDefaultColor( float r, float g, float b ) { header.d_color[0]=r; header.d_color[1]=g; header.d_color[2]=b; } - - ////////////////////////////////////////////////////////////////////////// - ///@name Load and Save Methods - - /// Loads hair data from the given HAIR file. - int LoadFromFile( const char *filename ) - { - Initialize(); - - FILE *fp; - fopen_s(&fp, filename, "rb" ); - if ( fp == NULL ) return CY_HAIR_FILE_ERROR_CANT_OPEN_FILE; - - // read the header - size_t headread = fread( &header, sizeof(cyHairFileHeader), 1, fp ); - - #define _CY_FAILED_RETURN(errorno) { Initialize(); fclose( fp ); return errorno; } - - - // Check if header is correctly read - if ( headread < 1 ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_CANT_READ_HEADER); - - // Check if this is a hair file - if ( strncmp( header.signature, "HAIR", 4) != 0 ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_WRONG_SIGNATURE); - - // Read segments array - if ( header.arrays & CY_HAIR_FILE_SEGMENTS_BIT ) { - segments = new unsigned short[ header.hair_count ]; - size_t readcount = fread( segments, sizeof(unsigned short), header.hair_count, fp ); - if ( readcount < header.hair_count ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_READING_SEGMENTS); - } - - // Read points array - if ( header.arrays & CY_HAIR_FILE_POINTS_BIT ) { - points = new float[ header.point_count*3 ]; - size_t readcount = fread( points, sizeof(float), header.point_count*3, fp ); - if ( readcount < header.point_count*3 ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_READING_POINTS); - } - - // Read thickness array - if ( header.arrays & CY_HAIR_FILE_THICKNESS_BIT ) { - thickness = new float[ header.point_count ]; - size_t readcount = fread( thickness, sizeof(float), header.point_count, fp ); - if ( readcount < header.point_count ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_READING_THICKNESS); - } - - // Read transparency array - if ( header.arrays & CY_HAIR_FILE_TRANSPARENCY_BIT ) { - transparency = new float[ header.point_count ]; - size_t readcount = fread( transparency, sizeof(float), header.point_count, fp ); - if ( readcount < header.point_count ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_READING_TRANSPARENCY); - } - - // Read colors array - if ( header.arrays & CY_HAIR_FILE_COLORS_BIT ) { - colors = new float[ header.point_count*3 ]; - size_t readcount = fread( colors, sizeof(float), header.point_count*3, fp ); - if ( readcount < header.point_count*3 ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_READING_COLORS); - } - - // Read UVs array - if ( header.arrays & CY_HAIR_FILE_UVS_BIT ) { - uvs = new float[ header.point_count*2 ]; - size_t readcount = fread( uvs, sizeof(float), header.point_count*2, fp ); - if ( readcount < header.point_count*2 ) _CY_FAILED_RETURN(CY_HAIR_FILE_ERROR_READING_UVS); - } - - fclose( fp ); - - return header.hair_count; - } - - /// Saves hair data to the given HAIR file. - int SaveToFile( const char *filename ) const - { - FILE *fp; - fopen_s( &fp, filename, "wb" ); - if ( fp == NULL ) return -1; - - // Write header - fwrite( &header, sizeof(cyHairFileHeader), 1, fp ); - - // Write arrays - if ( header.arrays & CY_HAIR_FILE_SEGMENTS_BIT ) fwrite( segments, sizeof(unsigned short), header.hair_count, fp ); - if ( header.arrays & CY_HAIR_FILE_POINTS_BIT ) fwrite( points, sizeof(float), header.point_count*3, fp ); - if ( header.arrays & CY_HAIR_FILE_THICKNESS_BIT ) fwrite( thickness, sizeof(float), header.point_count, fp ); - if ( header.arrays & CY_HAIR_FILE_TRANSPARENCY_BIT ) fwrite( transparency, sizeof(float), header.point_count, fp ); - if ( header.arrays & CY_HAIR_FILE_COLORS_BIT ) fwrite( colors, sizeof(float), header.point_count*3, fp ); - if ( header.arrays & CY_HAIR_FILE_UVS_BIT ) fwrite( uvs, sizeof(float), header.point_count*2, fp ); - - fclose( fp ); - - return header.hair_count; - } - - - ////////////////////////////////////////////////////////////////////////// - ///@name Other Methods - - /// Fills the given direction array with normalized directions using the points array. - /// Call this function if you need strand directions for shading. - /// The given array dir should be allocated as an array of size 3 times point count. - /// Returns point count, returns zero if fails. - int FillDirectionArray( float *dir ) - { - if ( dir==NULL || header.point_count<=0 || points==NULL ) return 0; - - int p = 0; // point index - for ( unsigned int i=0; i 1 ) { - // direction at point1 - float len0, len1; - ComputeDirection( &dir[(p+1)*3], len0, len1, &points[p*3], &points[(p+1)*3], &points[(p+2)*3] ); - - // direction at point0 - float d0[3]; - d0[0] = points[(p+1)*3] - dir[(p+1)*3] *len0*0.3333f - points[p*3]; - d0[1] = points[(p+1)*3+1] - dir[(p+1)*3+1]*len0*0.3333f - points[p*3+1]; - d0[2] = points[(p+1)*3+2] - dir[(p+1)*3+2]*len0*0.3333f - points[p*3+2]; - float d0lensq = d0[0]*d0[0] + d0[1]*d0[1] + d0[2]*d0[2]; - float d0len = ( d0lensq > 0 ) ? (float) sqrt(d0lensq) : 1.0f; - dir[p*3] = d0[0] / d0len; - dir[p*3+1] = d0[1] / d0len; - dir[p*3+2] = d0[2] / d0len; - - // We computed the first 2 points - p += 2; - - // Compute the direction for the rest - for ( int t=2; t 0 ) ? (float) sqrt(d0lensq) : 1.0f; - dir[p*3] = d0[0] / d0len; - dir[p*3+1] = d0[1] / d0len; - dir[p*3+2] = d0[2] / d0len; - p++; - - } else if ( s > 0 ) { - // if it has a single segment - float d0[3]; - d0[0] = points[(p+1)*3] - points[p*3]; - d0[1] = points[(p+1)*3+1] - points[p*3+1]; - d0[2] = points[(p+1)*3+2] - points[p*3+2]; - float d0lensq = d0[0]*d0[0] + d0[1]*d0[1] + d0[2]*d0[2]; - float d0len = ( d0lensq > 0 ) ? (float) sqrt(d0lensq) : 1.0f; - dir[p*3] = d0[0] / d0len; - dir[p*3+1] = d0[1] / d0len; - dir[p*3+2] = d0[2] / d0len; - dir[(p+1)*3] = dir[p*3]; - dir[(p+1)*3+1] = dir[p*3+1]; - dir[(p+1)*3+2] = dir[p*3+2]; - p += 2; - } - //*/ - } - return p; - } - - -private: - ////////////////////////////////////////////////////////////////////////// - ///@name Private Variables and Methods - - cyHairFileHeader header; - unsigned short *segments; - float *points; - float *thickness; - float *transparency; - float *colors; - float *uvs; - - // Given point before (p0) and after (p2), computes the direction (d) at p1. - float ComputeDirection( float *d, float &d0len, float &d1len, const float *p0, const float *p1, const float *p2 ) - { - // line from p0 to p1 - float d0[3]; - d0[0] = p1[0] - p0[0]; - d0[1] = p1[1] - p0[1]; - d0[2] = p1[2] - p0[2]; - float d0lensq = d0[0]*d0[0] + d0[1]*d0[1] + d0[2]*d0[2]; - d0len = ( d0lensq > 0 ) ? (float) sqrt(d0lensq) : 1.0f; - - // line from p1 to p2 - float d1[3]; - d1[0] = p2[0] - p1[0]; - d1[1] = p2[1] - p1[1]; - d1[2] = p2[2] - p1[2]; - float d1lensq = d1[0]*d1[0] + d1[1]*d1[1] + d1[2]*d1[2]; - d1len = ( d1lensq > 0 ) ? (float) sqrt(d1lensq) : 1.0f; - - // make sure that d0 and d1 has the same length - d0[0] *= d1len / d0len; - d0[1] *= d1len / d0len; - d0[2] *= d1len / d0len; - - // direction at p1 - d[0] = d0[0] + d1[0]; - d[1] = d0[1] + d1[1]; - d[2] = d0[2] + d1[2]; - float dlensq = d[0]*d[0] + d[1]*d[1] + d[2]*d[2]; - float dlen = ( dlensq > 0 ) ? (float) sqrt(dlensq) : 1.0f; - d[0] /= dlen; - d[1] /= dlen; - d[2] /= dlen; - - return d0len; - } -}; - -//------------------------------------------------------------------------------- - -namespace cy { - typedef cyHairFileHeader HairFileHeader; - typedef cyHairFile HairFile; -} - -//------------------------------------------------------------------------------- - -} - -#endif diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/exportdefs.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/exportdefs.h deleted file mode 100644 index 98b66c29b3..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/exportdefs.h +++ /dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - * Copyright 1998-2018 by authors (see AUTHORS.txt) * - * * - * This file is part of LuxCoreRender. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -// NOTE: this file is included in LuxCore so any external dependency must be -// avoided here - -#ifndef _LUXRAYSEXPORT_DEFS_H -#define _LUXRAYSEXPORT_DEFS_H - -// The following ifdef block is the standard way of creating macros which make exporting -// from a DLL simpler. All files within this DLL are compiled with the CPP_API_EXPORTS -// symbol defined on the command line. this symbol should not be defined on any project -// that uses this DLL. This way any other project whose source files include this file see -// CPP_API functions as being imported from a DLL, whereas this DLL sees symbols -// defined with this macro as being exported. -#ifdef WIN32 -#ifdef LUXCORE_DLL - #ifdef CPP_API_EXPORTS - #define CPP_API __declspec(dllexport) - #else - #define CPP_API __declspec(dllimport) - #endif -#else - #define CPP_API -#endif -#else // linux/osx - #ifdef CPP_API_EXPORTS - #define CPP_API __attribute__ ((visibility ("default"))) - #else - #define CPP_API - #endif -#endif - -#if (defined(__apple_build_version__) && ((__clang_major__ == 5) && (__clang_minor__ >= 1) || ((__clang_major__ == 6) && (__clang_minor__ < 1)))) - #define CPP_EXPORT extern "C" -#else - #define CPP_EXPORT extern "C++" -#endif - -#endif // _LUXRAYSEXPORT_DEFS_H diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/ocl.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/ocl.h deleted file mode 100644 index 006ae3ed0a..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/ocl.h +++ /dev/null @@ -1,41 +0,0 @@ -/*************************************************************************** - * Copyright 1998-2018 by authors (see AUTHORS.txt) * - * * - * This file is part of LuxCoreRender. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -// NOTE: this file is included in LuxCore so any external dependency must be -// avoided here - -#ifndef _LUXRAYS_OPENCL_H -#define _LUXRAYS_OPENCL_H - -#include - -#if !defined(LUXRAYS_DISABLE_OPENCL) - -// To avoid reference to OpenCL 1.2 symbols in cl.hpp file -#define CL_USE_DEPRECATED_OPENCL_1_1_APIS -#define __CL_ENABLE_EXCEPTIONS - -#if defined(__APPLE__) -#include -#else -#include -#endif - -#endif - -#endif /* _LUXRAYS_OPENCL_H */ diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/oclerror.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/oclerror.h deleted file mode 100644 index d361f74e18..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/oclerror.h +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - * Copyright 1998-2018 by authors (see AUTHORS.txt) * - * * - * This file is part of LuxCoreRender. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -// NOTE: this file is included in LuxCore so any external dependency must be -// avoided here - -#ifndef _LUXRAYS_OPENCLERROR_H -#define _LUXRAYS_OPENCLERROR_H - -#include "luxrays/utils/exportdefs.h" -#include "luxrays/utils/ocl.h" - -#if !defined(LUXRAYS_DISABLE_OPENCL) - -namespace luxrays { - -// Same utility function - -CPP_EXPORT CPP_API std::string oclErrorString(cl_int error); - -} - -#endif - -#endif /* _LUXRAYS_OPENCLERROR_H */ diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/properties.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/properties.h deleted file mode 100644 index 409e8f9a07..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/properties.h +++ /dev/null @@ -1,736 +0,0 @@ -/*************************************************************************** - * Copyright 1998-2018 by authors (see AUTHORS.txt) * - * * - * This file is part of LuxCoreRender. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -// NOTE: this file is included in LuxCore so any external dependency must be -// avoided here - -#ifndef _LUXRAYS_PROPERTIES_H -#define _LUXRAYS_PROPERTIES_H - -#include -#include -#include -#include -#include -#include - -#include - -namespace luxrays { - -//------------------------------------------------------------------------------ -// Blob class -//------------------------------------------------------------------------------ - -CPP_EXPORT class CPP_API Blob { -public: - Blob(const Blob &blob); - Blob(const char *data, const size_t size); - Blob(const std::string &base64Data); - ~Blob(); - - const char *GetData() const { return data; } - size_t GetSize() const { return size; } - - std::string ToString() const; - - Blob &operator=(const Blob &blob); - -private: - char *data; - size_t size; -}; - -CPP_EXPORT CPP_API std::ostream &operator<<(std::ostream &os, const Blob &blob); - -//------------------------------------------------------------------------------ -// Property class -//------------------------------------------------------------------------------ - -/*! - * \brief Value that can be stored in a Property. - * - * The current list of allowed data types is: - * - bool - * - int - * - unsigned int - * - float - * - double - * - unsigned long long - * - string - * - Blob - */ - -// I was using boost::variant for PropertyValue in the past but I want to avoid -// Boost requirement for application using LuxCore API - -CPP_EXPORT class CPP_API PropertyValue { -public: - typedef enum { - NONE_VAL, - BOOL_VAL, - INT_VAL, - UINT_VAL, - FLOAT_VAL, - DOUBLE_VAL, - ULONGLONG_VAL, - STRING_VAL, - BLOB_VAL - } DataType; - - PropertyValue(); - PropertyValue(const PropertyValue &propVal); - PropertyValue(const bool val); - PropertyValue(const int val); - PropertyValue(const unsigned int val); - PropertyValue(const float val); - PropertyValue(const double val); - PropertyValue(const unsigned long long val); - PropertyValue(const std::string &val); - PropertyValue(const Blob &val); - ~PropertyValue(); - - template T Get() const; - - DataType GetValueType() const; - - PropertyValue &operator=(const PropertyValue &propVal); - -private: - static void Copy(const PropertyValue &prop0Val, PropertyValue &prop1Val); - - DataType dataType; - - union { - bool boolVal; - int intVal; - unsigned int uintVal; - float floatVal; - double doubleVal; - unsigned long long ulonglongVal; - std::string *stringVal; - Blob *blobVal; - } data; -}; - -// Get<>() basic types specializations -template<> CPP_API bool PropertyValue::Get() const; -template<> CPP_API int PropertyValue::Get() const; -template<> CPP_API unsigned int PropertyValue::Get() const; -template<> CPP_API float PropertyValue::Get() const; -template<> CPP_API double PropertyValue::Get() const; -template<> CPP_API unsigned long long PropertyValue::Get() const; -template<> CPP_API std::string PropertyValue::Get() const; -template<> CPP_API const Blob &PropertyValue::Get() const; - -/*! - * \brief A vector of values that can be stored in a Property. - */ -typedef std::vector PropertyValues; - -/*! - * \brief A generic container for values. - * - * A Property is a container associating a vector of values to a string name. The - * vector of values can include items with different data types. Check - * \ref PropertyValue for a list of allowed types. - */ -CPP_EXPORT class CPP_API Property { -public: - /*! - * \brief Constructs a new empty property. - * - * Constructs a new empty property where the property name is initialized to - * the empty string (i.e. "") and the vector of values is empty too. - */ - Property(); - /*! - * \brief Constructs a new empty property with a given name. - * - * Constructs a new empty property where the property name is initialized - * to \p propName and the vector of values is empty too. - * - * \param propName is the name of the new property. - */ - Property(const std::string &propName); - /*! - * \brief Constructs a new property with a given name and value. - * - * Constructs a new property where the property name is initialized to - * \p propName and the vector of values has one single element with the value - * of \p val. - * - * \param propName is the name of the new property. - * \param val is the value of the new property. - */ - Property(const std::string &propName, const PropertyValue &val); - /*! - * \brief Constructs a new property with a given name and values. - * - * Constructs a new property where the property name is initialized to - * \p propName and the vector of values is initialize with the values - * of \p vals. - * - * \param propName is the name of the new property. - * \param vals is the value of the new property. - */ - Property(const std::string &propName, const PropertyValues &vals); - ~Property(); - - /*! - * \brief Returns the name of a property. - * - * \return the name of the property - */ - const std::string &GetName() const { return name; } - /*! - * \brief Return a new property with a prefix added to the name. - * - * \param prefix is the string to add to the name. - * - * \return a new property. - */ - Property AddedNamePrefix(const std::string &prefix) const { - Property newProp(prefix + name); - newProp.values.insert(newProp.values.begin(), values.begin(), values.end()); - - return newProp; - } - /*! - * \brief Return a new property with a new name. - * - * \param prefix is the string to use for the new name. - * - * \return a new property. - */ - Property Renamed(const std::string &newName) const { - Property newProp(newName); - newProp.values.insert(newProp.values.begin(), values.begin(), values.end()); - - return newProp; - } - /*! - * \brief Returns the number of values associated to this property. - * - * \return the number of values in this property. - */ - size_t GetSize() const { return values.size(); } - /*! - * \brief Removes any values associated to the property. - * - * \return a reference to the modified property. - */ - Property &Clear(); - /*! - * \brief Returns the value at the specified position. - * - * \param index is the position of the value to return. - * - * \return the value at specified position (casted or translated to the type - * required). - * - * \throws std::runtime_error if the index is out of bound. - */ - template T Get(const unsigned int index) const { - if (index >= values.size()) - throw std::runtime_error("Out of bound error for property: " + name); - - return values[index].Get(); - } - /*! - * \brief Returns the type of the value at the specified position. - * - * \param index is the position of the value. - * - * \return the type information of the value at specified position. - * - * \throws std::runtime_error if the index is out of bound. - */ - const PropertyValue::DataType GetValueType(const unsigned int index) const { - if (index >= values.size()) - throw std::runtime_error("Out of bound error for property: " + name); - - return values[index].GetValueType(); - } - /*! - * \brief Parses all values as a representation of the specified type. - * - * The current list of supported data types is: - * - bool - * - int - * - unsigned int - * - float - * - double - * - unsigned longlong - * - string - * - Blob - * - * \return the value at first position (casted or translated to the type - * required). - * - * \throws std::runtime_error if the property has the wrong number of values - * for the specified data type. - */ - template T Get() const { - throw std::runtime_error("Unsupported data type in property: " + name); - } - /*! - * \brief Sets the value at the specified position. - * - * \param index is the position of the value to set. - * \param val is the new value to set. - * - * \return a reference to the modified property. - * - * \throws std::runtime_error if the index is out of bound. - */ - template Property &Set(const unsigned int index, const T &val) { - if (index >= values.size()) - throw std::runtime_error("Out of bound error for property: " + name); - - values[index] = val; - - return *this; - } - /*! - * \brief Adds an item at the end of the list of values associated with the - * property. - * - * \param val is the value to append. - * - * \return a reference to the modified property. - */ - template Property &Add(const T &val) { - values.push_back(val); - return *this; - } - /*! - * \brief Returns a string with all values associated to the property. - * - * \return a string with all values. - */ - std::string GetValuesString() const; - /*! - * \brief Initialize the property from a string (ex. "a.b.c = 1 2") - */ - void FromString(std::string &s); - /*! - * \brief Returns a string with the name of the property followed by " = " - * and by all values associated to the property. - * - * \return a string with the name and all values. - */ - std::string ToString() const; - /*! - * \brief Adds a value to a property. - * - * It can be used to write expressions like: - * - * > Property("test1.prop1")("aa") - * - * \param val0 is the value to assign. - * - * \return a reference to the modified property. - */ - template Property &operator()(const T0 &val0) { - return Add(val0); - } - /*! - * \brief Adds a value to a property. - * - * It can be used to write expressions like: - * - * > Property("test1.prop1")(1.f, 2.f) - * - * \param val0 is the value to assign as first item. - * \param val1 is the value to assign as second item. - * - * \return a reference to the modified property. - */ - template Property &operator()(const T0 &val0, const T1 &val1) { - return Add(val0).Add(val1); - } - /*! - * \brief Adds a value to a property. - * - * It can be used to write expressions like: - * - * > Property("test1.prop1")(1.f, 2.f, 3.f) - * - * \param val0 is the value to assign as first item. - * \param val1 is the value to assign as second item. - * \param val2 is the value to assign as third item. - * - * \return a reference to the modified property. - */ - template Property &operator()(const T0 &val0, const T1 &val1, const T2 &val2) { - return Add(val0).Add(val1).Add(val2); - } - /*! - * \brief Adds a value to a property. - * - * It can be used to write expressions like: - * - * > Property("test1.prop1")(1.f, 2.f, 3.f, 4.f) - * - * \param val0 is the value to assign as first item. - * \param val1 is the value to assign as second item. - * \param val2 is the value to assign as third item. - * \param val3 is the value to assign as forth item. - * - * \return a reference to the modified property. - */ - template Property &operator()(const T0 &val0, const T1 &val1, const T2 &val2, const T3 &val3) { - return Add(val0).Add(val1).Add(val2).Add(val3); - } - /*! - * \brief Adds a vector of values to a property. - * - * \param vals is the value to assign. - * - * \return a reference to the modified property. - */ - template Property &operator()(const std::vector &vals) { - for (size_t i = 0; i < vals.size(); ++i) - values.push_back(vals[i]); - - return *this; - } - /*! - * \brief Initializes a property with (only) the given value. - * - * \return a reference to the modified property. - */ - template Property &operator=(const T &val) { - values.clear(); - return Add(val); - } - - /*! - * \brief Required to work around the problem of char* to bool conversion - * (instead of char* to string). - */ - Property &Add(const char *val) { - values.push_back(std::string(val)); - return *this; - } - /*! - * \brief Required to work around the problem of char* to bool conversion - * (instead of char* to string). - */ - Property &Add(char *val) { - values.push_back(std::string(val)); - return *this; - } - Property &operator()(const char *val) { - return Add(std::string(val)); - } - /*! - * \brief Required to work around the problem of char* to bool conversion - * (instead of char* to string). - */ - Property &operator()(char *val) { - return Add(std::string(val)); - } - /*! - * \brief Required to work around the problem of char* to bool conversion - * (instead of char* to string). - */ - Property &operator=(const char *val) { - values.clear(); - return Add(std::string(val)); - } - /*! - * \brief Required to work around the problem of char* to bool conversion - * (instead of char* to string). - */ - Property &operator=(char *val) { - values.clear(); - return Add(std::string(val)); - } - - static unsigned int CountFields(const std::string &name); - static std::string ExtractField(const std::string &name, const unsigned int index); - static std::string ExtractPrefix(const std::string &name, const unsigned int count); - static std::string PopPrefix(const std::string &name); - -private: - std::string name; - PropertyValues values; -}; - -// Get<>() basic types specializations -template<> CPP_API bool Property::Get() const; -template<> CPP_API int Property::Get() const; -template<> CPP_API unsigned int Property::Get() const; -template<> CPP_API float Property::Get() const; -template<> CPP_API double Property::Get() const; -template<> CPP_API unsigned long long Property::Get() const; -template<> CPP_API std::string Property::Get() const; -template<> CPP_API const Blob &Property::Get() const; - -inline std::ostream &operator<<(std::ostream &os, const Property &p) { - os << p.ToString(); - - return os; -} - -//------------------------------------------------------------------------------ -// Properties class -//------------------------------------------------------------------------------ - -/*! - * \brief A container for multiple Property. - * - * Properties is a container for instances of Property class. It keeps also - * track of the insertion order. - */ -CPP_EXPORT class CPP_API Properties { -public: - Properties() { } - /*! - * \brief Sets the list of Property from a text file . - * - * \param fileName is the name of the file to read. - */ - Properties(const std::string &fileName); - ~Properties() { } - - /*! - * \brief Returns the number of Property in this container. - * - * \return the number of Property. - */ - unsigned int GetSize() const; - - // The following 2 methods perform the same action - - /*! - * \brief Sets a single Property. - * - * \param prop is the Property to set. - * - * \return a reference to the modified properties. - */ - Properties &Set(const Property &prop); - /*! - * \brief Sets a single Property. - * - * \param prop is the Property to set. - * - * \return a reference to the modified properties. - */ - Properties &operator<<(const Property &prop); - /*! - * \brief Sets the list of Property. - * - * \param prop is the list of Property to set. - * - * \return a reference to the modified properties. - */ - Properties &Set(const Properties &prop); - /*! - * \brief Sets the list of Property. - * - * \param props is the list of Property to set. - * - * \return a reference to the modified properties. - */ - Properties &operator<<(const Properties &props); - /*! - * \brief Sets the list of Property while adding a prefix to all names. - * - * \param props is the list of Property to set. - * - * \return a reference to the modified properties. - */ - Properties &Set(const Properties &props, const std::string &prefix); - /*! - * \brief Sets the list of Property coming from a stream. - * - * \param stream is the input stream to read. - * - * \return a reference to the modified properties. - */ - Properties &SetFromStream(std::istream &stream); - /*! - * \brief Sets the list of Property coming from a file. - * - * \param fileName is the name of the file to read. - * - * \return a reference to the modified properties. - */ - Properties &SetFromFile(const std::string &fileName); - /*! - * \brief Sets the list of Property coming from a std::string. - * - * \param propDefinitions is the list of Property to add in text format. - * - * \return a reference to the modified properties. - */ - Properties &SetFromString(const std::string &propDefinitions); - - /*! - * \brief Save all properties to a file - * - * \param fileName of the file to create. - */ - void Save(const std::string &fileName); - - /*! - * \brief Removes all Property from the container. - * - * \return a reference to the modified properties. - */ - Properties &Clear(); - - /*! - * \brief Returns all Property names defined. - * - * \return a reference to all Property names defined. - */ - const std::vector &GetAllNames() const; - /*! - * \brief Returns all Property names that start with a specific prefix. - * - * This method is used to iterate over all properties. - * - * \param prefix of the Property names to return. - * - * \return a vector of Property names. - */ - std::vector GetAllNames(const std::string &prefix) const; - /*! - * \brief Returns all Property unique names that match the passed regular - * expression. - * - * \param regularExpression to use for the pattern matching. - * - * \return a vector of Property names. - */ - std::vector GetAllNamesRE(const std::string ®ularExpression) const; - /*! - * \brief Returns all Property unique names that start with a specific prefix. - * - * For instance, given the the following names: - * - test.prop1.subprop1 - * - test.prop1.subprop2 - * - test.prop2.subprop1 - * - * GetAllUniqueSubNames("test") will return: - * - test.prop1 - * - test.prop2 - * - * \param prefix of the Property names to return. - * - * \return a vector of Property names. - */ - std::vector GetAllUniqueSubNames(const std::string &prefix) const; - /*! - * \brief Returns if there are at least a Property starting for specific prefix. - * - * \param prefix of the Property to look for. - * - * \return true if there is at least on Property starting for the prefix. - */ - bool HaveNames(const std::string &prefix) const; - /*! - * \brief Returns all a copy of all Property with a name starting with a specific prefix. - * - * \param prefix of the Property names to use. - * - * \return a copy of all Property matching the prefix. - */ - bool HaveNamesRE(const std::string ®ularExpression) const; - /*! - * \brief Returns a copy of all Property with a name matching the passed - * regular expression. - * - * \param regularExpression to use for the pattern matching. - * - * \return a copy of all Property matching the prefix. - */ - Properties GetAllProperties(const std::string &prefix) const; - /*! - * \brief Returns a property. - * - * \param propName is the name of the Property to return. - * - * \return a Property. - * - * \throws std::runtime_error if the Property doesn't exist. - */ - const Property &Get(const std::string &propName) const; - /*! - * \brief Returns a Property with the same name of the passed Property if - * it has been defined or the passed Property itself (i.e. the default values). - * - * \param defaultProp has the Property to look for and the default values in - * case it has not been defined. - * - * \return a Property. - */ - const Property &Get(const Property &defaultProp) const; - - /*! - * \brief Returns if a Property with the given name has been defined. - * - * \param propName is the name of the Property to check. - * - * \return if defined or not. - */ - bool IsDefined(const std::string &propName) const; - - /*! - * \brief Deletes a Property with the given name. - * - * \param propName is the name of the Property to delete. - */ - void Delete(const std::string &propName); - /*! - * \brief Deletes all listed Property. - * - * \param propNames is the list of the Property to delete. - */ - void DeleteAll(const std::vector &propNames); - - /*! - * \brief Converts all Properties in a string. - * - * \return a string with the definition of all properties. - */ - std::string ToString() const; - -private: - // This vector is used, among other things, to keep track of the insertion order - std::vector names; - std::map props; -}; - -CPP_EXPORT CPP_API Properties operator<<(const Property &prop0, const Property &prop1); -CPP_EXPORT CPP_API Properties operator<<(const Property &prop0, const Properties &props); - -inline std::ostream &operator<<(std::ostream &os, const Properties &p) { - os << p.ToString(); - - return os; -} - -} - -#endif /* _LUXRAYS_PROPERTIES_H */ diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/utils.h b/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/utils.h deleted file mode 100644 index dbc6f9e7bd..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/include/luxrays/utils/utils.h +++ /dev/null @@ -1,349 +0,0 @@ -/*************************************************************************** - * Copyright 1998-2018 by authors (see AUTHORS.txt) * - * * - * This file is part of LuxCoreRender. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* - * See the License for the specific language governing permissions and * - * limitations under the License. * - ***************************************************************************/ - -// NOTE: this file is included in LuxCore so any external dependency must be -// avoided here - -#ifndef _LUXRAYS_UTILS_H -#define _LUXRAYS_UTILS_H - -#include -#include -#include - -#if defined (__linux__) -#include -#endif - -#if (defined(WIN32) && defined(_MSC_VER) && _MSC_VER < 1800) -#include -#define isnan(a) _isnan(a) -#define isinf(f) (!_finite((f))) -#else -#define isnan(a) std::isnan(a) -#define isinf(f) std::isinf(f) -#endif - -#if defined(WIN32) -#define isnanf(a) _isnan(a) -#endif - -#if defined(__APPLE__) -#include -#endif - -#if !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__FreeBSD__) -# include // for _alloca, memalign -# if !defined(WIN32) || defined(__CYGWIN__) -# include -# else -# define memalign(a,b) _aligned_malloc(b, a) -# define alloca _alloca -# endif -#else -# include -# if defined(__APPLE__) -# define memalign(a,b) valloc(b) -# elif defined(__OpenBSD__) || defined(__FreeBSD__) -# define memalign(a,b) malloc(b) -# endif -#endif - -#include - -#if defined(__linux__) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__OpenBSD__) || defined(__FreeBSD__) -#include -#include -#elif defined (WIN32) -#include -#else -#error "Unsupported Platform !!!" -#endif - -#ifndef M_PI -#define M_PI 3.14159265358979323846f -#endif - -#ifndef INFINITY -#define INFINITY (std::numeric_limits::infinity()) -#endif - -#ifndef INV_PI -#define INV_PI 0.31830988618379067154f -#endif - -#ifndef INV_TWOPI -#define INV_TWOPI 0.15915494309189533577f -#endif - -typedef unsigned char u_char; -typedef unsigned short u_short; -typedef unsigned int u_int; -typedef unsigned long u_long; -typedef unsigned long long u_longlong; - -namespace luxrays { - -inline double WallClockTime() { -#if defined(__linux__) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__OpenBSD__) || defined(__FreeBSD__) - struct timeval t; - gettimeofday(&t, NULL); - - return t.tv_sec + t.tv_usec / 1000000.0; -#elif defined (WIN32) - return GetTickCount() / 1000.0; -#else -#error "Unsupported Platform !!!" -#endif -} - -template inline T Lerp(float t, T v1, T v2) { - // Linear interpolation - return v1 + t * (v2 - v1); -} - -template inline T Cerp(float t, T v0, T v1, T v2, T v3) { - // Cubic interpolation - return v1 + .5f * - t * (v2 - v0 + - t * (2.f * v0 - 5.f * v1 + 4.f * v2 - v3 + - t * (3.f * (v1 - v2) + v3 - v0))); -} - -template inline T Clamp(T val, T low, T high) { - return val > low ? (val < high ? val : high) : low; -} - -template inline void Swap(T &a, T &b) { - const T tmp = a; - a = b; - b = tmp; -} - -template inline T Max(T a, T b) { - return a > b ? a : b; -} - -template inline T Min(T a, T b) { - return a < b ? a : b; -} - -inline float Sgn(float a) { - return a < 0.f ? -1.f : 1.f; -} - -inline int Sgn(int a) { - return a < 0 ? -1 : 1; -} - -template inline T Sqr(T a) { - return a * a; -} - -inline int Round2Int(double val) { - return static_cast(val > 0. ? val + .5 : val - .5); -} - -inline int Round2Int(float val) { - return static_cast(val > 0.f ? val + .5f : val - .5f); -} - -inline unsigned int Round2UInt(double val) { - return static_cast(val > 0. ? val + .5 : 0.); -} - -inline unsigned int Round2UInt(float val) { - return static_cast(val > 0.f ? val + .5f : 0.f); -} - -template inline T Mod(T a, T b) { - if (b == 0) - b = 1; - - a %= b; - if (a < 0) - a += b; - - return a; -} - -inline float Radians(float deg) { - return (M_PI / 180.f) * deg; -} - -inline float Degrees(float rad) { - return (180.f / M_PI) * rad; -} - -inline float Log2(float x) { - return logf(x) / logf(2.f); -} - -inline int Log2Int(float v) { - return Round2Int(Log2(v)); -} - -inline bool IsPowerOf2(int v) { - return (v & (v - 1)) == 0; -} - -inline bool IsPowerOf2(unsigned int v) { - return (v & (v - 1)) == 0; -} - -template inline T RoundUp(const T a, const T b) { - const unsigned int r = a % b; - if (r == 0) - return a; - else - return a + b - r; -} - -template inline T RoundUpPow2(T v) { - v--; - - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - - return v+1; -} - -inline unsigned int RoundUpPow2(unsigned int v) { - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return v+1; -} - -template inline int Float2Int(T val) { - return static_cast(val); -} - -template inline unsigned int Float2UInt(T val) { - return val >= 0 ? static_cast(val) : 0; -} - -inline int Floor2Int(double val) { - return static_cast(floor(val)); -} - -inline int Floor2Int(float val) { - return static_cast(floorf(val)); -} - -inline unsigned int Floor2UInt(double val) { - return val > 0. ? static_cast(floor(val)) : 0; -} - -inline unsigned int Floor2UInt(float val) { - return val > 0.f ? static_cast(floorf(val)) : 0; -} - -inline int Ceil2Int(double val) { - return static_cast(ceil(val)); -} - -inline int Ceil2Int(float val) { - return static_cast(ceilf(val)); -} - -inline unsigned int Ceil2UInt(double val) { - return val > 0. ? static_cast(ceil(val)) : 0; -} - -inline unsigned int Ceil2UInt(float val) { - return val > 0.f ? static_cast(ceilf(val)) : 0; -} - -inline bool Quadratic(float A, float B, float C, float *t0, float *t1) { - // Find quadratic discriminant - float discrim = B * B - 4.f * A * C; - if (discrim < 0.f) - return false; - float rootDiscrim = sqrtf(discrim); - // Compute quadratic _t_ values - float q; - if (B < 0) - q = -.5f * (B - rootDiscrim); - else - q = -.5f * (B + rootDiscrim); - *t0 = q / A; - *t1 = C / q; - if (*t0 > *t1) - Swap(*t0, *t1); - return true; -} - -inline float SmoothStep(float min, float max, float value) { - float v = Clamp((value - min) / (max - min), 0.f, 1.f); - return v * v * (-2.f * v + 3.f); -} - -template int SignOf(T x) -{ - return (x > 0) - (x < 0); -} - -template inline std::string ToString(const T &t) { - std::ostringstream ss; - ss << t; - return ss.str(); -} - -inline std::string ToString(const float t) { - std::ostringstream ss; - ss << std::setprecision(std::numeric_limits::digits10 + 1) << t; - return ss.str(); -} - -inline std::string ToMemString(const size_t size) { - return (size < 10000 ? (ToString(size) + "bytes") : (ToString(size / 1024) + "Kbytes")); -} - -inline unsigned int UIntLog2(unsigned int value) { - unsigned int l = 0; - while (value >>= 1) l++; - return l; -} - -// Remap a value that is in sourceRange into targetRange. -template T inline Remap(const T value, - const T sourceMin, const T sourceMax, - const T targetMin, const T targetMax) { - if (sourceMin == sourceMax) - return sourceMin; - - return (value - sourceMin) - * (targetMax - targetMin) - / (sourceMax - sourceMin) - + targetMin; -} - -inline bool IsValid(float a) { - return !isnan(a) && !isinf(a) && (a >= 0.f); -} - -} - -#endif /* _LUXRAYS_UTILS_H */ diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/OpenImageDenoise.dll b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/OpenImageDenoise.dll deleted file mode 100644 index 9cd511fdbf..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/OpenImageDenoise.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d22d353a08f795b5b755dc96e6114b81e78b23b9273ff9879296ad479f8594f8 -size 38060832 diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/OpenImageIO.dll b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/OpenImageIO.dll deleted file mode 100644 index c681967189..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/OpenImageIO.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf10c2f45a73bf720d2678d8107477d549da1e95fd5386ea4934b16430e94945 -size 12634112 diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/embree3.dll b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/embree3.dll deleted file mode 100644 index 79e09fe44f..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/embree3.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a3dc95174a9d6109bc9f02ab6d10eec97ffc7151a401b19a5777abb501ce5ab -size 29051592 diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/luxcore.dll b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/luxcore.dll deleted file mode 100644 index dd0b1130ea..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/luxcore.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6bd67542b409ccf0800ab57cb0b5319ea4bb6e008355192d92b1762352b02e4 -size 13316608 diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/luxcoreui.exe b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/luxcoreui.exe deleted file mode 100644 index 1d5a3137ec..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/luxcoreui.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40c9ab1c7bcbf5715d0eb77621294e49ec141eec3a87ec4969d950926405559c -size 1169408 diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/tbb.dll b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/tbb.dll deleted file mode 100644 index c5436682a1..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/tbb.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:124655daa4bdb627222278b69727a20945ce44bc6680f393df1750b6b58ec7c8 -size 433024 diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/tbbmalloc.dll b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/tbbmalloc.dll deleted file mode 100644 index fcaef15302..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/dll/tbbmalloc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88b5b6fbf2fbb9d8b7617f5cd0d017e42e2b46a5c777c6e6f2656102f81fe398 -size 263040 diff --git a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/lib/luxcore.lib b/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/lib/luxcore.lib deleted file mode 100644 index 146e735865..0000000000 --- a/Gems/Atom/Feature/Common/External/LuxCore2.2/win64/lib/luxcore.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39f866e497b87cafdadeb6f4e58cb9689eccf3e37fe57e5417b2a6e8d0d7c84b -size 5657344 diff --git a/Gems/Atom/RHI/CMakeLists.txt b/Gems/Atom/RHI/CMakeLists.txt index 8486c52a11..de93a47072 100644 --- a/Gems/Atom/RHI/CMakeLists.txt +++ b/Gems/Atom/RHI/CMakeLists.txt @@ -13,3 +13,4 @@ add_subdirectory(Code) add_subdirectory(DX12) add_subdirectory(Metal) add_subdirectory(Vulkan) +add_subdirectory(Null) diff --git a/Gems/Atom/RHI/Code/CMakeLists.txt b/Gems/Atom/RHI/Code/CMakeLists.txt index 00c53f1ac6..b99e33e4c2 100644 --- a/Gems/Atom/RHI/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Code/CMakeLists.txt @@ -62,6 +62,7 @@ ly_add_target( PRIVATE AZ::AzCore AZ::AzFramework + AZ::AtomCore Gem::Atom_RHI.Public ) diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Base.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Base.h index 080e203e5f..c7f9db30f7 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Base.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Base.h @@ -18,6 +18,7 @@ #include #include + namespace UnitTest { class RHITestFixture; @@ -92,6 +93,14 @@ namespace AZ using MessageOutcome = AZ::Outcome; + enum class APIIndex : uint32_t + { + Null = 0, + DX12, + Vulkan, + Metal, + }; + using APIType = Crc32; enum class DrawListSortType : uint8_t diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ShaderInputNameIndex.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ShaderInputNameIndex.h new file mode 100644 index 0000000000..5e8d8efce8 --- /dev/null +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ShaderInputNameIndex.h @@ -0,0 +1,115 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +#include +#include + +namespace AZ +{ + class ReflectContext; + + namespace RHI + { + class ShaderResourceGroupLayout; + + //! Utility class to manage looking up indices via Names + //! Users can initialize this class with the Name used to lookup the index and + //! then use this class as an index. Under the hood, the code will initialize + //! the index if it's not already initialized before using it. + struct ShaderInputNameIndex + { + AZ_TYPE_INFO(ShaderInputNameIndex, "{1A9A92A7-9289-45E1-9EFE-D08257EF2BF1}"); + static void Reflect(AZ::ReflectContext* context); + + ShaderInputNameIndex() = default; + ShaderInputNameIndex(Name name); + ShaderInputNameIndex(const char* name); + + void operator =(Name name); + void operator =(const char* name); + + // Functions for looking up the index of the given name... + void FindBufferIndex(const ShaderResourceGroupLayout* srgLayout); + void FindImageIndex(const ShaderResourceGroupLayout* srgLayout); + void FindSamplerIndex(const ShaderResourceGroupLayout* srgLayout); + void FindConstantIndex(const ShaderResourceGroupLayout* srgLayout); + + // Functions that will validate the index and try to find it if it is not initialized... + bool ValidateOrFindBufferIndex(const ShaderResourceGroupLayout* srgLayout); + bool ValidateOrFindImageIndex(const ShaderResourceGroupLayout* srgLayout); + bool ValidateOrFindSamplerIndex(const ShaderResourceGroupLayout* srgLayout); + bool ValidateOrFindConstantIndex(const ShaderResourceGroupLayout* srgLayout); + + // Functions for retrieving the index... + ShaderInputBufferIndex GetBufferIndex() const; + ShaderInputImageIndex GetImageIndex() const; + ShaderInputConstantIndex GetConstantIndex() const; + ShaderInputSamplerIndex GetSamplerIndex() const; + ShaderInputStaticSamplerIndex GetStaticSamplerIndex() const; + + // Invalidates all members except the name + // Call this if you want to keep the name but want the index to be recalculated on next use + void Reset(); + + // Checks and asserts... + bool HasName() const; + void AssertHasName() const; + bool IsValid() const; + void AssertValid() const; + bool IsInitialized() const; + void AssetInialized() const; + + private: + + enum class IndexType : u32 + { + // Shader input indices + ShaderBuffer = 0, + ShaderImage, + ShaderSampler, + ShaderConstant, + + Count, + InvalidIndex = Count + }; + + // Asserts name, assigns input type and sets initialization flag to true + void Initialize(IndexType indexType); + + // Asserts index is valid and returns it + u32 GetIndex() const; + + // Template getter with static_cast<> for improved readability in other functions + template + T GetIndexAs() const; + + // The Name used to lookup the index + Name m_name; + + // The cached index + Handle<> m_index; + + struct + { + // Whether the class has already used the name to lookup the index + // This avoids repeated lookups if the lookup returns an invalid index + u32 m_initialized : 1; + + // The index type, used for validation and error catching + IndexType m_inputType : 8; + }; + }; + } +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/RHIUtils.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/RHIUtils.h index 660ad80409..c1a5a993d1 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/RHIUtils.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/RHIUtils.h @@ -13,8 +13,6 @@ // RHIUtils is for dumping common functionality that is used in several places across the RHI -#include - #include #include #include @@ -38,6 +36,13 @@ namespace AZ //! Checks the format against the list of supported formats and returns //! the nearest match, with a warning if the exact format is not supported Format ValidateFormat(Format format, const char* location, const AZStd::vector& formatFallbacks, FormatCapabilities requestedCapabilities = FormatCapabilities::None); + + //! Returns the command line value associated with the option if it exists. + //! If multiple values exist it will return the last one + AZStd::string GetCommandLineValue(const AZStd::string& commandLineOption); + + //! Returns if the current bakcend is a null renderer + bool IsNullRenderer(); } } diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupData.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupData.h index c79863e408..4cd5ad466a 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupData.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupData.h @@ -64,28 +64,22 @@ namespace AZ ShaderInputConstantIndex FindShaderInputConstantIndex(const Name& name) const; //! Sets one image view for the given shader input index. - bool SetImageView(ShaderInputImageIndex inputIndex, const ImageView* imageView); bool SetImageView(ShaderInputImageIndex inputIndex, const ImageView* imageView, uint32_t arrayIndex); //! Sets an array of image view for the given shader input index. - bool SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::array_view imageViews); - bool SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex); + bool SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex = 0); //! Sets one buffer view for the given shader input index. - bool SetBufferView(ShaderInputBufferIndex inputIndex, const BufferView* bufferView); - bool SetBufferView(ShaderInputBufferIndex inputIndex, const BufferView* bufferView, uint32_t arrayIndex); + bool SetBufferView(ShaderInputBufferIndex inputIndex, const BufferView* bufferView, uint32_t arrayIndex = 0); //! Sets an array of image view for the given shader input index. - bool SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews); - bool SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex); + bool SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex = 0); //! Sets one sampler for the given shader input index, using the bindingIndex as the key. - bool SetSampler(ShaderInputSamplerIndex inputIndex, const SamplerState& sampler); - bool SetSampler(ShaderInputSamplerIndex inputIndex, const SamplerState& sampler, uint32_t arrayIndex); + bool SetSampler(ShaderInputSamplerIndex inputIndex, const SamplerState& sampler, uint32_t arrayIndex = 0); //! Sets an array of samplers for the given shader input index. - bool SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers); - bool SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers, uint32_t arrayIndex); + bool SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers, uint32_t arrayIndex = 0); //! Assigns constant data for the given constant shader input index. bool SetConstantRaw(ShaderInputConstantIndex inputIndex, const void* bytes, uint32_t byteCount); diff --git a/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryManagerSystemComponent.cpp b/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryManagerSystemComponent.cpp index e57e6fee5b..eee377d8ab 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryManagerSystemComponent.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryManagerSystemComponent.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -125,11 +126,7 @@ namespace AZ Factory* FactoryManagerSystemComponent::GetFactoryFromCommandLine() { - // Command line usage: "Game.exe -rhi=name" (e.g. Game.exe -rhi=dx12) - const AzFramework::CommandLine* commandLine = nullptr; - AzFramework::ApplicationRequests::Bus::BroadcastResult(commandLine, &AzFramework::ApplicationRequests::GetApplicationCommandLine); - const char* paramName = "rhi"; - AZStd::string cmdLineFactory = commandLine->GetSwitchValue(paramName, 0); + AZStd::string cmdLineFactory = RHI::GetCommandLineValue("rhi"); if (!cmdLineFactory.empty()) { RHI::APIType cmdLineFactoryType(cmdLineFactory.c_str()); diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ShaderInputNameIndex.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ShaderInputNameIndex.cpp new file mode 100644 index 0000000000..7ede565828 --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ShaderInputNameIndex.cpp @@ -0,0 +1,235 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +namespace AZ +{ + namespace RHI + { + // --- Constructors, assignment and reflection --- + + ShaderInputNameIndex::ShaderInputNameIndex(Name name) + { + *this = name; + } + + ShaderInputNameIndex::ShaderInputNameIndex(const char* name) + { + *this = name; + } + + void ShaderInputNameIndex::operator=(Name name) + { + Reset(); + m_name = name; + } + + void ShaderInputNameIndex::operator=(const char* name) + { + Reset(); + m_name = Name(name); + } + + void ShaderInputNameIndex::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + // Only serialize the Name field since the rest of the members are derived from the name at runtime + serializeContext->Class() + ->Version(0) + ->Field("Name", &ShaderInputNameIndex::m_name); + } + } + + // --- Functions for initializing the index --- + + void ShaderInputNameIndex::Initialize(IndexType indexType) + { + AssertHasName(); + m_initialized = true; + m_inputType = indexType; + } + + void ShaderInputNameIndex::FindBufferIndex(const ShaderResourceGroupLayout* srgLayout) + { + Initialize(IndexType::ShaderBuffer); + m_index = Handle<>(srgLayout->FindShaderInputBufferIndex(m_name).GetIndex()); + } + + void ShaderInputNameIndex::FindImageIndex(const ShaderResourceGroupLayout* srgLayout) + { + Initialize(IndexType::ShaderImage); + m_index = Handle<>(srgLayout->FindShaderInputImageIndex(m_name).GetIndex()); + } + + void ShaderInputNameIndex::FindSamplerIndex(const ShaderResourceGroupLayout* srgLayout) + { + Initialize(IndexType::ShaderSampler); + m_index = Handle<>(srgLayout->FindShaderInputSamplerIndex(m_name).GetIndex()); + } + + void ShaderInputNameIndex::FindConstantIndex(const ShaderResourceGroupLayout* srgLayout) + { + Initialize(IndexType::ShaderConstant); + m_index = Handle<>(srgLayout->FindShaderInputConstantIndex(m_name).GetIndex()); + } + + // --- Functions for checking if the index is initialized and retrieving it if not + + bool ShaderInputNameIndex::ValidateOrFindBufferIndex(const ShaderResourceGroupLayout* srgLayout) + { + if (IsValid()) // 99% use case, check this first for a quick early out + { + return true; + } + if (!m_initialized) + { + FindBufferIndex(srgLayout); + return IsValid(); + } + return false; + } + + bool ShaderInputNameIndex::ValidateOrFindImageIndex(const ShaderResourceGroupLayout* srgLayout) + { + if (IsValid()) // 99% use case, check this first for a quick early out + { + return true; + } + if (!m_initialized) + { + FindImageIndex(srgLayout); + return IsValid(); + } + return false; + } + + bool ShaderInputNameIndex::ValidateOrFindSamplerIndex(const ShaderResourceGroupLayout* srgLayout) + { + if (IsValid()) // 99% use case, check this first for a quick early out + { + return true; + } + if (!m_initialized) + { + FindSamplerIndex(srgLayout); + return IsValid(); + } + return false; + } + + bool ShaderInputNameIndex::ValidateOrFindConstantIndex(const ShaderResourceGroupLayout* srgLayout) + { + if (IsValid()) // 99% use case, check this first for a quick early out + { + return true; + } + if (!m_initialized) + { + FindConstantIndex(srgLayout); + return IsValid(); + } + return false; + } + + // --- Index getters with assertions --- + + u32 ShaderInputNameIndex::GetIndex() const + { + AssertValid(); + return m_index.GetIndex(); + } + + template + T ShaderInputNameIndex::GetIndexAs() const + { + return static_cast(GetIndex()); + } + + ShaderInputBufferIndex ShaderInputNameIndex::GetBufferIndex() const + { + AZ_Assert(m_inputType == IndexType::ShaderBuffer, "ShaderInputNameIndex [%s] being cast as BufferIndex but is not of Buffer type!", m_name.GetCStr()); + return GetIndexAs(); + } + + ShaderInputImageIndex ShaderInputNameIndex::GetImageIndex() const + { + AZ_Assert(m_inputType == IndexType::ShaderImage, "ShaderInputNameIndex [%s] being cast as ImageIndex but is not of Image type!", m_name.GetCStr()); + return GetIndexAs(); + } + + ShaderInputSamplerIndex ShaderInputNameIndex::GetSamplerIndex() const + { + AZ_Assert(m_inputType == IndexType::ShaderSampler, "ShaderInputNameIndex [%s] being cast as SamplerIndex but is not of Sampler type!", m_name.GetCStr()); + return GetIndexAs(); + } + + ShaderInputConstantIndex ShaderInputNameIndex::GetConstantIndex() const + { + AZ_Assert(m_inputType == IndexType::ShaderConstant, "ShaderInputNameIndex [%s] being cast as ConstantIndex but is not of Constant type!", m_name.GetCStr()); + return GetIndexAs(); + } + + ShaderInputStaticSamplerIndex ShaderInputNameIndex::GetStaticSamplerIndex() const + { + AZ_Assert(m_inputType == IndexType::ShaderSampler, "ShaderInputNameIndex [%s] being cast as SamplerIndex but is not of Sampler type!", m_name.GetCStr()); + return GetIndexAs(); + } + + // --- Reset & Clear --- + + void ShaderInputNameIndex::Reset() + { + m_index.Reset(); + m_initialized = false; + m_inputType = IndexType::InvalidIndex; + } + + // --- Checks and asserts --- + + bool ShaderInputNameIndex::HasName() const + { + return !m_name.IsEmpty(); + } + + void ShaderInputNameIndex::AssertHasName() const + { + AZ_Assert(HasName(), "ShaderInputNameIndex does not have a valid Name. Please initialize with a valid Name."); + } + + bool ShaderInputNameIndex::IsValid() const + { + return m_index.IsValid(); + } + + void ShaderInputNameIndex::AssertValid() const + { + AZ_Assert(IsValid(), "ShaderInputNameIndex [%s] does not have a valid index. Please initialize with the Shader Resource Group.", m_name.GetCStr()); + } + + bool ShaderInputNameIndex::IsInitialized() const + { + return m_initialized; + } + + void ShaderInputNameIndex::AssetInialized() const + { + AZ_Assert(IsInitialized(), "ShaderInputNameIndex [%s] has not been initialized. Please initialize with the Shader Resource Group.", m_name.GetCStr()); + + } + + } +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/BufferPoolBase.cpp b/Gems/Atom/RHI/Code/Source/RHI/BufferPoolBase.cpp index 64334bcea0..7992325706 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/BufferPoolBase.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/BufferPoolBase.cpp @@ -10,6 +10,7 @@ * */ #include +#include namespace AZ { @@ -29,6 +30,12 @@ namespace AZ { if (Validation::IsEnabled()) { + // No need for validation for a null renderer + if (IsNullRenderer()) + { + return; + } + if (!isDataValid) { AZ_Warning("BufferPoolBase", false, "Failed to map buffer '%s'.", buffer.GetName().GetCStr()); @@ -42,6 +49,12 @@ namespace AZ { if (Validation::IsEnabled()) { + // No need for validation for a null renderer + if (IsNullRenderer()) + { + return true; + } + if (--buffer.m_mapRefCount == -1) { AZ_Error("BufferPoolBase", false, "Buffer '%s' was unmapped more times than it was mapped.", buffer.GetName().GetCStr()); diff --git a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompiler.cpp b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompiler.cpp index c7bf204ece..b7ebeef24d 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompiler.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompiler.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -631,7 +632,7 @@ namespace AZ case Action::DeactivateBuffer: { - AZ_Assert(!allocateResources || transientBuffers[attachmentIndex], "Buffer is not active: %s", transientBufferGraphAttachments[attachmentIndex]->GetId().GetCStr()); + AZ_Assert(!allocateResources || transientBuffers[attachmentIndex] || IsNullRenderer(), "Buffer is not active: %s", transientBufferGraphAttachments[attachmentIndex]->GetId().GetCStr()); BufferFrameAttachment* bufferFrameAttachment = transientBufferGraphAttachments[attachmentIndex]; transientAttachmentPool.DeactivateBuffer(bufferFrameAttachment->GetId()); transientBuffers[attachmentIndex] = nullptr; @@ -640,7 +641,7 @@ namespace AZ case Action::DeactivateImage: { - AZ_Assert(!allocateResources || transientImages[attachmentIndex], "Image is not active: %s", transientImageGraphAttachments[attachmentIndex]->GetId().GetCStr()); + AZ_Assert(!allocateResources || transientImages[attachmentIndex] || IsNullRenderer(), "Image is not active: %s", transientImageGraphAttachments[attachmentIndex]->GetId().GetCStr()); ImageFrameAttachment* imageFrameAttachment = transientImageGraphAttachments[attachmentIndex]; transientAttachmentPool.DeactivateImage(imageFrameAttachment->GetId()); transientImages[attachmentIndex] = nullptr; @@ -657,7 +658,7 @@ namespace AZ descriptor.m_bufferDescriptor = bufferFrameAttachment->GetBufferDescriptor(); Buffer* buffer = transientAttachmentPool.ActivateBuffer(descriptor); - if (allocateResources) + if (allocateResources && buffer) { bufferFrameAttachment->SetResource(buffer); transientBuffers[attachmentIndex] = buffer; @@ -685,7 +686,7 @@ namespace AZ } Image* image = transientAttachmentPool.ActivateImage(descriptor); - if (allocateResources) + if (allocateResources && image) { imageFrameAttachment->SetResource(image); transientImages[attachmentIndex] = image; @@ -778,6 +779,10 @@ namespace AZ { Image* image = imageAttachment->GetImage(); + if (!image) + { + continue; + } // Iterates through every usage of the image, pulls image views // from image's cache or local cache, and assigns them to the scope attachments. for (ImageScopeAttachment* node = imageAttachment->GetFirstScopeAttachment(); node != nullptr; node = node->GetNext()) @@ -805,7 +810,12 @@ namespace AZ for (BufferFrameAttachment* bufferAttachment : attachmentDatabase.GetBufferAttachments()) { Buffer* buffer = bufferAttachment->GetBuffer(); - + + if (!buffer) + { + continue; + } + // Iterates through every usage of the buffer attachment, pulls buffer views // from the cache within the buffer, and assigns them to the scope attachments. for (BufferScopeAttachment* node = bufferAttachment->GetFirstScopeAttachment(); node != nullptr; node = node->GetNext()) diff --git a/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp b/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp index a35ef48d05..067090e909 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -124,15 +125,7 @@ namespace AZ return nullptr; } - // Command line set up to search for forcing adapter argument - const AzFramework::CommandLine* commandLine = nullptr; - AzFramework::ApplicationRequests::Bus::BroadcastResult(commandLine, &AzFramework::ApplicationRequests::GetApplicationCommandLine); - - AZStd::string preferredUserAdapterName; - if (commandLine) - { - preferredUserAdapterName = commandLine->GetSwitchValue("forceAdapter", 0); - } + AZStd::string preferredUserAdapterName = RHI::GetCommandLineValue("forceAdapter"); RHI::PhysicalDevice* preferredUserDevice{}; RHI::PhysicalDevice* preferredVendorDevice{}; diff --git a/Gems/Atom/RHI/Code/Source/RHI/RHIUtils.cpp b/Gems/Atom/RHI/Code/Source/RHI/RHIUtils.cpp index 9a8dd49a55..1dff226e6f 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/RHIUtils.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/RHIUtils.cpp @@ -12,6 +12,9 @@ #include #include +#include +#include +#include namespace AZ { @@ -102,6 +105,26 @@ namespace AZ } return originalFormat; } + + bool IsNullRenderer() + { + return RHI::Factory::Get().GetAPIUniqueIndex() == static_cast(APIIndex::Null); + } + AZStd::string GetCommandLineValue(const AZStd::string& commandLineOption) + { + const AzFramework::CommandLine* commandLine = nullptr; + AzFramework::ApplicationRequests::Bus::BroadcastResult(commandLine, &AzFramework::ApplicationRequests::GetApplicationCommandLine); + + AZStd::string commandLineValue; + if (commandLine) + { + if (size_t switchCount = commandLine->GetNumSwitchValues(commandLineOption); switchCount > 0) + { + commandLineValue = commandLine->GetSwitchValue(commandLineOption, switchCount - 1); + } + } + return commandLineValue; + } } } diff --git a/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupData.cpp b/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupData.cpp index 22c5f5c844..ab9d4c7ae5 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupData.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupData.cpp @@ -293,23 +293,12 @@ namespace AZ return m_shaderResourceGroupLayout->FindShaderInputConstantIndex(name); } - bool ShaderResourceGroupData::SetImageView(ShaderInputImageIndex inputIndex, const ImageView* imageView) - { - AZStd::array imageViews = {{imageView}}; - return SetImageViewArray(inputIndex, imageViews); - } - - bool ShaderResourceGroupData::SetImageView(ShaderInputImageIndex inputIndex, const ImageView* imageView, uint32_t arrayIndex) + bool ShaderResourceGroupData::SetImageView(ShaderInputImageIndex inputIndex, const ImageView* imageView, uint32_t arrayIndex = 0) { AZStd::array imageViews = {{imageView}}; return SetImageViewArray(inputIndex, imageViews, arrayIndex); } - bool ShaderResourceGroupData::SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::array_view imageViews) - { - return SetImageViewArray(inputIndex, imageViews, 0); - } - bool ShaderResourceGroupData::SetImageViewArray(ShaderInputImageIndex inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex) { if (GetLayout()->ValidateAccess(inputIndex, static_cast(arrayIndex + imageViews.size() - 1))) @@ -330,23 +319,12 @@ namespace AZ return false; } - bool ShaderResourceGroupData::SetBufferView(ShaderInputBufferIndex inputIndex, const BufferView* bufferView) - { - AZStd::array bufferViews = {{bufferView}}; - return SetBufferViewArray(inputIndex, bufferViews, 0); - } - bool ShaderResourceGroupData::SetBufferView(ShaderInputBufferIndex inputIndex, const BufferView* bufferView, uint32_t arrayIndex) { AZStd::array bufferViews = {{bufferView}}; return SetBufferViewArray(inputIndex, bufferViews, arrayIndex); } - bool ShaderResourceGroupData::SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews) - { - return SetBufferViewArray(inputIndex, bufferViews, 0); - } - bool ShaderResourceGroupData::SetBufferViewArray(ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex) { if (GetLayout()->ValidateAccess(inputIndex, static_cast(arrayIndex + bufferViews.size() - 1))) @@ -367,21 +345,11 @@ namespace AZ return false; } - bool ShaderResourceGroupData::SetSampler(ShaderInputSamplerIndex inputIndex, const SamplerState& sampler) - { - return SetSamplerArray(inputIndex, AZStd::array_view(&sampler, 1), 0); - } - bool ShaderResourceGroupData::SetSampler(ShaderInputSamplerIndex inputIndex, const SamplerState& sampler, uint32_t arrayIndex) { return SetSamplerArray(inputIndex, AZStd::array_view(&sampler, 1), arrayIndex); } - bool ShaderResourceGroupData::SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers) - { - return SetSamplerArray(inputIndex, samplers, 0); - } - bool ShaderResourceGroupData::SetSamplerArray(ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers, uint32_t arrayIndex) { if (GetLayout()->ValidateAccess(inputIndex, static_cast(arrayIndex + samplers.size() - 1))) @@ -414,7 +382,7 @@ namespace AZ bool ShaderResourceGroupData::SetConstantData(const void* bytes, uint32_t byteOffset, uint32_t byteCount) { return m_constantsData.SetConstantData(bytes, byteOffset, byteCount); - } + } const RHI::ConstPtr& ShaderResourceGroupData::GetImageView(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex) const { diff --git a/Gems/Atom/RHI/Code/Source/RHI/ValidationLayer.cpp b/Gems/Atom/RHI/Code/Source/RHI/ValidationLayer.cpp index b6ae153476..718974859c 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/ValidationLayer.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/ValidationLayer.cpp @@ -11,10 +11,11 @@ */ #include -#include +#include #include #include + namespace AZ { namespace RHI @@ -26,9 +27,10 @@ namespace AZ ValidationMode mode = ValidationMode::Disabled; const AzFramework::CommandLine* commandLine = nullptr; AzFramework::ApplicationRequests::Bus::BroadcastResult(commandLine, &AzFramework::ApplicationRequests::GetApplicationCommandLine); - if (commandLine && commandLine->HasSwitch(ValidationCommandLineOption)) + if (commandLine) { - auto validationValue = commandLine->GetSwitchValue(ValidationCommandLineOption, 0); + AZStd::string validationValue = RHI::GetCommandLineValue(ValidationCommandLineOption); + if (AzFramework::StringFunc::Equal(validationValue.c_str(), "disable")) { mode = ValidationMode::Disabled; diff --git a/Gems/Atom/RHI/Code/atom_rhi_reflect_files.cmake b/Gems/Atom/RHI/Code/atom_rhi_reflect_files.cmake index 9d431322ae..97152fa192 100644 --- a/Gems/Atom/RHI/Code/atom_rhi_reflect_files.cmake +++ b/Gems/Atom/RHI/Code/atom_rhi_reflect_files.cmake @@ -133,4 +133,6 @@ set(FILES Include/Atom/RHI.Reflect/ImageEnums.h Include/Atom/RHI.Reflect/PlatformLimitsDescriptor.h Source/RHI.Reflect/PlatformLimitsDescriptor.cpp + Include/Atom/RHI.Reflect/ShaderInputNameIndex.h + Source/RHI.Reflect/ShaderInputNameIndex.cpp ) diff --git a/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/Base.h b/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/Base.h index ccfc1783ea..450754f2b2 100644 --- a/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/Base.h +++ b/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/Base.h @@ -19,6 +19,6 @@ namespace AZ namespace DX12 { //! For details go to AZ::RHI::Factory::GetAPIUniqueIndex - static constexpr uint32_t APIUniqueIndex = 0; + static constexpr uint32_t APIUniqueIndex = static_cast(RHI::APIIndex::DX12); } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermathGpuCrashTracker_Windows.cpp b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermathGpuCrashTracker_Windows.cpp index a69aa0ce02..4cc263542d 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermathGpuCrashTracker_Windows.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermathGpuCrashTracker_Windows.cpp @@ -89,10 +89,12 @@ void GpuCrashTracker::OnDescription(PFN_GFSDK_Aftermath_AddGpuCrashDumpDescripti return; } + char executableFolder[AZ::IO::MaxPathLength]; // Add some basic description about the crash. This is called after the GPU crash happens, but before // the actual GPU crash dump callback. The provided data is included in the crash dump and can be // retrieved using GFSDK_Aftermath_GpuCrashDump_GetDescription(). - AZ::ComponentApplicationBus::BroadcastResult(executableFolder, &AZ::ComponentApplicationBus::Events::GetExecutableFolder); + AZ::Utils::GetExecutableDirectory(executableFolder, AZ::IO::MaxPathLength); + AZ::IO::FixedMaxPath fileAbsolutePath{executableFolder}; fileAbsolutePath /= AZ::Utils::GetProjectName(); addDescription(GFSDK_Aftermath_GpuCrashDumpDescriptionKey_ApplicationName, fileAbsolutePath.c_str()); diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/ShaderStageFunction.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/ShaderStageFunction.cpp index 1f58e17c8f..3519c0b0f6 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/ShaderStageFunction.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/ShaderStageFunction.cpp @@ -62,7 +62,6 @@ namespace AZ return RHI::ResultCode::InvalidArgument; } - // [GFX_TODO][bethelz]: Move byte code hashing from RPI branch here. HashValue64 hash = HashValue64{ 0 }; for (const ShaderByteCode& byteCode : m_byteCodes) { @@ -72,8 +71,6 @@ namespace AZ } } SetHash(hash); - //![GFX_TODO] - return RHI::ResultCode::Success; } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandListPool.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandListPool.cpp index 736d1c75a9..d43129a626 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandListPool.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandListPool.cpp @@ -69,9 +69,8 @@ namespace AZ return true; } - void CommandListFactory::ShutdownObject(CommandList& commandList, bool isPoolShutdown) + void CommandListFactory::ShutdownObject(CommandList& commandList, [[maybe_unused]] bool isPoolShutdown) { - (void)isPoolShutdown; commandList.Shutdown(); } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroupPool.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroupPool.cpp index 5d20235683..6687ac42fa 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroupPool.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroupPool.cpp @@ -141,7 +141,7 @@ namespace AZ if (!group.m_viewsDescriptorTable.IsValid()) { - AZ_Error("ShaderResourceGroupPool", false, "Descriptor context failed to allocate view descriptor table, most likely out of memory."); + AZ_Error("ShaderResourceGroupPool", false, "Descriptor context failed to allocate view descriptor table. Try increasing the limits specified in platformlimits.azasset file for dx12"); return RHI::ResultCode::OutOfMemory; } @@ -160,7 +160,7 @@ namespace AZ if (!group.m_samplersDescriptorTable.IsValid()) { - AZ_Error("ShaderResourceGroupPool", false, "Descriptor context failed to allocate sampler descriptor table, most likely out of memory."); + AZ_Error("ShaderResourceGroupPool", false, "Descriptor context failed to allocate sampler descriptor table. Try increasing the limits specified in platformlimits.azasset file for dx12."); return RHI::ResultCode::OutOfMemory; } diff --git a/Gems/Atom/RHI/Metal/Code/CMakeLists.txt b/Gems/Atom/RHI/Metal/Code/CMakeLists.txt index e658a66257..b5704e0ccf 100644 --- a/Gems/Atom/RHI/Metal/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Metal/Code/CMakeLists.txt @@ -35,7 +35,6 @@ if(NOT PAL_TRAIT_ATOM_RHI_METAL_SUPPORTED) if(PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_target( NAME Atom_RHI_Metal.Builders GEM_MODULE - NAMESPACE Gem FILES_CMAKE Source/Platform/${PAL_PLATFORM_NAME}/platform_builders_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake diff --git a/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/Base.h b/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/Base.h index 3f0fb6d077..516e0fccfe 100644 --- a/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/Base.h +++ b/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/Base.h @@ -22,6 +22,6 @@ namespace AZ static const RHI::APIType RHIType(APINameString); //! For details go to AZ::RHI::Factory::GetAPIUniqueIndex - static constexpr uint32_t APIUniqueIndex = 0; + static constexpr uint32_t APIUniqueIndex = static_cast(RHI::APIIndex::Metal); } } diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp index 9b8e0e2d58..b2219754aa 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp @@ -309,7 +309,7 @@ namespace AZ args.m_destinationFolder = tempFolder.c_str(); const auto dxcInputFile = RHI::PrependFile(args); - if (BuildHasDebugInfo()) + if (BuildHasDebugInfo(shaderCompilerArguments)) { // dump intermediate "true final HLSL" file (shadername.metal.shadersource.prepend) byProducts.m_intermediatePaths.insert(dxcInputFile); @@ -330,7 +330,7 @@ namespace AZ AZ_Error(MetalShaderPlatformName, false, "DXC failed to create the spirv file"); return false; } - if (BuildHasDebugInfo()) + if (BuildHasDebugInfo(shaderCompilerArguments)) { byProducts.m_intermediatePaths.insert(shaderSpirvOutputFile); // the spirv spit by DXC } @@ -367,7 +367,7 @@ namespace AZ bool finalizeShaderResult = UpdateCompiledShader(outFileStream, MetalShaderPlatformName, shaderMSLOutputFile.data(), sourceMetalShader); AZ_Assert(finalizeShaderResult, "Final compiled shader was not created. Check if %s was created", shaderMSLOutputFile.c_str()); - if (BuildHasDebugInfo()) + if (BuildHasDebugInfo(shaderCompilerArguments)) { byProducts.m_intermediatePaths.emplace(AZStd::move(shaderMSLOutputFile)); // .msl metal out of sv-cross } diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI.Reflect/ShaderStageFunction.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI.Reflect/ShaderStageFunction.cpp index 878ca0f78e..118038aec5 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI.Reflect/ShaderStageFunction.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI.Reflect/ShaderStageFunction.cpp @@ -84,12 +84,9 @@ namespace AZ return RHI::ResultCode::InvalidArgument; } - // [GFX_TODO][bethelz]: Move source code hashing from RPI branch here. HashValue64 hash = HashValue64{ 0 }; - hash = TypeHash64(reinterpret_cast(m_sourceCode.data()), m_sourceCode.size(), hash); SetHash(hash); - //![GFX_TODO] return RHI::ResultCode::Success; } diff --git a/Gems/Atom/RHI/Null/CMakeLists.txt b/Gems/Atom/RHI/Null/CMakeLists.txt new file mode 100644 index 0000000000..20a680bce9 --- /dev/null +++ b/Gems/Atom/RHI/Null/CMakeLists.txt @@ -0,0 +1,12 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +add_subdirectory(Code) diff --git a/Gems/Atom/RHI/Null/Code/CMakeLists.txt b/Gems/Atom/RHI/Null/Code/CMakeLists.txt new file mode 100644 index 0000000000..cd9f54804b --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/CMakeLists.txt @@ -0,0 +1,106 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +ly_get_list_relative_pal_filename(pal_include_dir ${CMAKE_CURRENT_LIST_DIR}/Include/Platform/${PAL_PLATFORM_NAME}) +ly_get_list_relative_pal_filename(pal_source_dir ${CMAKE_CURRENT_LIST_DIR}/Source/Platform/${PAL_PLATFORM_NAME}) + + +ly_add_target( + NAME Atom_RHI_Null.Reflect STATIC + NAMESPACE Gem + FILES_CMAKE + atom_rhi_null_reflect_common_files.cmake + INCLUDE_DIRECTORIES + PUBLIC + Include + ${pal_include_dir} + BUILD_DEPENDENCIES + PRIVATE + AZ::AzCore + Gem::Atom_RHI.Reflect +) + +ly_add_target( + NAME Atom_RHI_Null.Private.Static STATIC + NAMESPACE Gem + FILES_CMAKE + atom_rhi_null_common_files.cmake + atom_rhi_null_private_common_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + . + Source + ${pal_source_dir} + PUBLIC + Include + ${pal_include_dir} + BUILD_DEPENDENCIES + PUBLIC + AZ::AzCore + AZ::AzFramework + AZ::AtomCore + Gem::Atom_RHI.Public +) + +ly_add_target( + NAME Atom_RHI_Null.Private ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} + NAMESPACE Gem + FILES_CMAKE + atom_rhi_null_private_common_shared_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + . + Source + ${pal_source_dir} + BUILD_DEPENDENCIES + PRIVATE + Gem::Atom_RHI_Null.Reflect + Gem::Atom_RHI_Null.Private.Static +) + +if (PAL_TRAIT_BUILD_HOST_TOOLS) + + ly_add_target( + NAME Atom_RHI_Null.Builders.Static STATIC + NAMESPACE Gem + FILES_CMAKE + atom_rhi_null_builders_common_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + . + Source + ${pal_source_dir} + PUBLIC + Include + BUILD_DEPENDENCIES + PRIVATE + AZ::AssetBuilderSDK + Gem::Atom_RHI.Edit + Gem::Atom_RHI.Reflect + Gem::Atom_RHI_Null.Reflect + ) + + ly_add_target( + NAME Atom_RHI_Null.Builders MODULE + NAMESPACE Gem + FILES_CMAKE + atom_rhi_null_builders_shared_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + Source + BUILD_DEPENDENCIES + PRIVATE + AZ::AssetBuilderSDK + Gem::Atom_RHI.Edit + Gem::Atom_RHI.Reflect + Gem::Atom_RHI_Null.Builders.Static + ) +endif() \ No newline at end of file diff --git a/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/Base.h b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/Base.h new file mode 100644 index 0000000000..0d54959e1a --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/Base.h @@ -0,0 +1,27 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + static constexpr const char* APINameString = "null"; + static const RHI::APIType RHIType(APINameString); + + //! For details go to AZ::RHI::Factory::GetAPIUniqueIndex + static constexpr uint32_t APIUniqueIndex = static_cast(RHI::APIIndex::Null); + } +} diff --git a/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/PipelineLayoutDescriptor.h b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/PipelineLayoutDescriptor.h new file mode 100644 index 0000000000..67fc99315e --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/PipelineLayoutDescriptor.h @@ -0,0 +1,47 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + class ReflectContext; + + namespace Null + { + class PipelineLayoutDescriptor final + : public RHI::PipelineLayoutDescriptor + { + using Base = RHI::PipelineLayoutDescriptor; + public: + AZ_RTTI(PipelineLayoutDescriptor, "{1A456415-2028-42E5-A771-61A0E41CF39D}", Base); + AZ_CLASS_ALLOCATOR(PipelineLayoutDescriptor, AZ::SystemAllocator, 0); + static void Reflect(AZ::ReflectContext* context); + + static RHI::Ptr Create(); + + private: + + PipelineLayoutDescriptor() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::PipelineLayoutDescriptor overrides + void ResetInternal() override; + HashValue64 GetHashInternal(HashValue64 seed) const override; + ////////////////////////////////////////////////////////////////////////// + + AZ_SERIALIZE_FRIEND(); + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/ReflectSystemComponent.h b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/ReflectSystemComponent.h new file mode 100644 index 0000000000..da56091233 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/ReflectSystemComponent.h @@ -0,0 +1,37 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + class ReflectContext; + + namespace Null + { + class ReflectSystemComponent + : public AZ::Component + { + public: + ReflectSystemComponent() = default; + virtual ~ReflectSystemComponent() = default; + AZ_COMPONENT(ReflectSystemComponent, "{E1870694-B44A-4908-B1A4-F8AD70C6E990}"); + + static void Reflect(AZ::ReflectContext* context); + + private: + void Activate() override {} + void Deactivate() override {} + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/ShaderStageFunction.h b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/ShaderStageFunction.h new file mode 100644 index 0000000000..c0eecdd815 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Atom/RHI.Reflect/Null/ShaderStageFunction.h @@ -0,0 +1,48 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class ShaderStageFunction + : public RHI::ShaderStageFunction + { + public: + AZ_RTTI(ShaderStageFunction, "{BA5D7597-6CFF-4521-B438-BEAD638E5FF8}", RHI::ShaderStageFunction); + AZ_CLASS_ALLOCATOR(ShaderStageFunction, AZ::SystemAllocator, 0); + + static void Reflect(AZ::ReflectContext* context); + + static RHI::Ptr Create(RHI::ShaderStage shaderStage); + + private: + /// Default constructor for serialization. Assumes shader stage is bound by data. + ShaderStageFunction() = default; + /// Used for manual construction. Shader stage must be provided. + ShaderStageFunction(RHI::ShaderStage shaderStage); + AZ_SERIALIZE_FRIEND(); + + /////////////////////////////////////////////////////////////////// + // RHI::ShaderStageFunction + RHI::ResultCode FinalizeInternal() override; + /////////////////////////////////////////////////////////////////// + + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Include/Platform/Android/Atom_RHI_Null_precompiled_Platform.h b/Gems/Atom/RHI/Null/Code/Include/Platform/Android/Atom_RHI_Null_precompiled_Platform.h new file mode 100644 index 0000000000..f42f05ee79 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Platform/Android/Atom_RHI_Null_precompiled_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + + diff --git a/Gems/Atom/RHI/Null/Code/Include/Platform/Linux/Atom_RHI_Null_precompiled_Platform.h b/Gems/Atom/RHI/Null/Code/Include/Platform/Linux/Atom_RHI_Null_precompiled_Platform.h new file mode 100644 index 0000000000..f42f05ee79 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Platform/Linux/Atom_RHI_Null_precompiled_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + + diff --git a/Gems/Atom/RHI/Null/Code/Include/Platform/Mac/Atom_RHI_Null_precompiled_Platform.h b/Gems/Atom/RHI/Null/Code/Include/Platform/Mac/Atom_RHI_Null_precompiled_Platform.h new file mode 100644 index 0000000000..f42f05ee79 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Platform/Mac/Atom_RHI_Null_precompiled_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + + diff --git a/Gems/Atom/RHI/Null/Code/Include/Platform/Windows/Atom_RHI_Null_precompiled_Platform.h b/Gems/Atom/RHI/Null/Code/Include/Platform/Windows/Atom_RHI_Null_precompiled_Platform.h new file mode 100644 index 0000000000..f42f05ee79 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Platform/Windows/Atom_RHI_Null_precompiled_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + + diff --git a/Gems/Atom/RHI/Null/Code/Include/Platform/iOS/Atom_RHI_Null_precompiled_Platform.h b/Gems/Atom/RHI/Null/Code/Include/Platform/iOS/Atom_RHI_Null_precompiled_Platform.h new file mode 100644 index 0000000000..f42f05ee79 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Include/Platform/iOS/Atom_RHI_Null_precompiled_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + + diff --git a/Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.cpp b/Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.cpp new file mode 100644 index 0000000000..56bdaca01b --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.cpp @@ -0,0 +1,12 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" diff --git a/Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h b/Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h new file mode 100644 index 0000000000..441f72acff --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h @@ -0,0 +1,15 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Android/Null_Traits_Android.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Android/Null_Traits_Android.h new file mode 100644 index 0000000000..ccdbe83813 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Android/Null_Traits_Android.h @@ -0,0 +1,13 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Android/Null_Traits_Platform.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Android/Null_Traits_Platform.h new file mode 100644 index 0000000000..33aca9d7f1 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Android/Null_Traits_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp b/Gems/Atom/RHI/Null/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp new file mode 100644 index 0000000000..1ac4c2487f --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp @@ -0,0 +1,11 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp b/Gems/Atom/RHI/Null/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp new file mode 100644 index 0000000000..4b26cfabc2 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp @@ -0,0 +1,37 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + class PlatformModule + : public AZ::Module + { + public: + AZ_RTTI(PlatformModule, "{feed05ac-e346-436a-bf70-7689c9f2c393}", Module); + + PlatformModule() = default; + ~PlatformModule() override = default; + + AZ::ComponentTypeList GetRequiredSystemComponents() const override + { + return AZ::ComponentTypeList(); + } + }; + } +} + +AZ_DECLARE_MODULE_CLASS(Gem_Atom_RHI_Null_Private, AZ::Null::PlatformModule) diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Linux/Null_Traits_Linux.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Linux/Null_Traits_Linux.h new file mode 100644 index 0000000000..ccdbe83813 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Linux/Null_Traits_Linux.h @@ -0,0 +1,13 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Linux/Null_Traits_Platform.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Linux/Null_Traits_Platform.h new file mode 100644 index 0000000000..09aed5ed9d --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Linux/Null_Traits_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Mac/Null_Traits_Mac.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Mac/Null_Traits_Mac.h new file mode 100644 index 0000000000..ccdbe83813 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Mac/Null_Traits_Mac.h @@ -0,0 +1,13 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Mac/Null_Traits_Platform.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Mac/Null_Traits_Platform.h new file mode 100644 index 0000000000..2ae640973d --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Mac/Null_Traits_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Windows/Null_Traits_Platform.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Windows/Null_Traits_Platform.h new file mode 100644 index 0000000000..def57126ac --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Windows/Null_Traits_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/Windows/Null_Traits_Windows.h b/Gems/Atom/RHI/Null/Code/Source/Platform/Windows/Null_Traits_Windows.h new file mode 100644 index 0000000000..7d9a58a823 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/Windows/Null_Traits_Windows.h @@ -0,0 +1,12 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/iOS/Null_Traits_Platform.h b/Gems/Atom/RHI/Null/Code/Source/Platform/iOS/Null_Traits_Platform.h new file mode 100644 index 0000000000..db4e16611e --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/iOS/Null_Traits_Platform.h @@ -0,0 +1,14 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include diff --git a/Gems/Atom/RHI/Null/Code/Source/Platform/iOS/Null_Traits_iOS.h b/Gems/Atom/RHI/Null/Code/Source/Platform/iOS/Null_Traits_iOS.h new file mode 100644 index 0000000000..ccdbe83813 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/Platform/iOS/Null_Traits_iOS.h @@ -0,0 +1,13 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/BuilderModule.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/BuilderModule.cpp new file mode 100644 index 0000000000..4e7aba2ebd --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/BuilderModule.cpp @@ -0,0 +1,50 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + //! Exposes Null RHI Building components to the Asset Processor. + class BuilderModule final + : public AZ::Module + { + public: + AZ_RTTI(BuilderModule, "{1D3566CB-9F75-4FCA-BBAD-09BC374F9171}", AZ::Module); + + BuilderModule() + { + m_descriptors.insert(m_descriptors.end(), { + ShaderPlatformInterfaceSystemComponent::CreateDescriptor() + }); + } + + AZ::ComponentTypeList GetRequiredSystemComponents() const override + { + return + { + azrtti_typeid(), + }; + } + }; + } // namespace Null +} // namespace AZ + +// DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM +// The first parameter should be GemName_GemIdLower +// The second should be the fully qualified name of the class above +AZ_DECLARE_MODULE_CLASS(Gem_Atom_RHI_Null_Builders, AZ::Null::BuilderModule); diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp new file mode 100644 index 0000000000..35ee5a7ec0 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp @@ -0,0 +1,127 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +*/ + + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + + static const char* WindowsAzslShaderHeader = "Builders/ShaderHeaders/Platform/Windows/Null/AzslcHeader.azsli"; + static const char* MacAzslShaderHeader = "Builders/ShaderHeaders/Platform/Mac/Null/AzslcHeader.azsli"; + + ShaderPlatformInterface::ShaderPlatformInterface(uint32_t apiUniqueIndex) + : RHI::ShaderPlatformInterface(apiUniqueIndex) + { + } + + RHI::APIType ShaderPlatformInterface::GetAPIType() const + { + return Null::RHIType; + } + + AZ::Name ShaderPlatformInterface::GetAPIName() const + { + return m_apiName; + } + + RHI::Ptr ShaderPlatformInterface::CreatePipelineLayoutDescriptor() + { + return AZ::Null::PipelineLayoutDescriptor::Create(); + } + + bool ShaderPlatformInterface::BuildPipelineLayoutDescriptor( + [[maybe_unused]] RHI::Ptr pipelineLayoutDescriptorBase, + [[maybe_unused]] const ShaderResourceGroupInfoList& srgInfoList, + [[maybe_unused]] const RootConstantsInfo& rootConstantsInfo, + [[maybe_unused]] const RHI::ShaderCompilerArguments& shaderCompilerArguments) + { + PipelineLayoutDescriptor* pipelineLayoutDescriptor = azrtti_cast(pipelineLayoutDescriptorBase.get()); + AZ_Assert(pipelineLayoutDescriptor, "PipelineLayoutDescriptor should have been created by now"); + return pipelineLayoutDescriptor->Finalize() == RHI::ResultCode::Success; + } + + RHI::Ptr ShaderPlatformInterface::CreateShaderStageFunction(const StageDescriptor& stageDescriptor) + { + RHI::Ptr newShaderStageFunction = ShaderStageFunction::Create(RHI::ToRHIShaderStage(stageDescriptor.m_stageType)); + newShaderStageFunction->Finalize(); + return newShaderStageFunction; + } + + bool ShaderPlatformInterface::IsShaderStageForRaster(RHI::ShaderHardwareStage shaderStageType) const + { + bool hasRasterProgram = false; + + hasRasterProgram |= shaderStageType == RHI::ShaderHardwareStage::Vertex; + hasRasterProgram |= shaderStageType == RHI::ShaderHardwareStage::Fragment; + + return hasRasterProgram; + } + + bool ShaderPlatformInterface::IsShaderStageForCompute(RHI::ShaderHardwareStage shaderStageType) const + { + return (shaderStageType == RHI::ShaderHardwareStage::Compute); + } + + bool ShaderPlatformInterface::IsShaderStageForRayTracing(RHI::ShaderHardwareStage shaderStageType) const + { + return (shaderStageType == RHI::ShaderHardwareStage::RayTracing); + } + + AZStd::string ShaderPlatformInterface::GetAzslCompilerParameters(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const + { + return shaderCompilerArguments.MakeAdditionalAzslcCommandLineString() + " --use-spaces --namespace=dx --root-const=128"; + } + + AZStd::string ShaderPlatformInterface::GetAzslCompilerWarningParameters(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const + { + return shaderCompilerArguments.MakeAdditionalAzslcWarningCommandLineString(); + } + + bool ShaderPlatformInterface::BuildHasDebugInfo([[maybe_unused]] const RHI::ShaderCompilerArguments& shaderCompilerArguments) const + { + return ""; + } + + const char* ShaderPlatformInterface::GetAzslHeader([[maybe_unused]] const AssetBuilderSDK::PlatformInfo& platform) const + { + if (platform.m_identifier == "pc") + { + return WindowsAzslShaderHeader; + } + else if (platform.m_identifier == "osx_gl") + { + return MacAzslShaderHeader; + } + else + { + return WindowsAzslShaderHeader; + } + } + + bool ShaderPlatformInterface::CompilePlatformInternal( + [[maybe_unused]] const AssetBuilderSDK::PlatformInfo& platform, [[maybe_unused]] const AZStd::string& shaderSourcePath, + [[maybe_unused]] const AZStd::string& functionName, [[maybe_unused]] RHI::ShaderHardwareStage shaderStage, + [[maybe_unused]] const AZStd::string& tempFolderPath, [[maybe_unused]] StageDescriptor& outputDescriptor, + [[maybe_unused]] const RHI::ShaderCompilerArguments& shaderCompilerArguments) const + { + outputDescriptor.m_stageType = shaderStage; + return true; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.h b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.h new file mode 100644 index 0000000000..f61d1ad33c --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.h @@ -0,0 +1,57 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +*/ + +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class ShaderPlatformInterface : + public RHI::ShaderPlatformInterface + { + public: + explicit ShaderPlatformInterface(uint32_t apiUniqueIndex); + + ////////////////////////////////////////////////////////////////////////// + // RHI::ShaderPlatformInterface + RHI::APIType GetAPIType() const override; + AZ::Name GetAPIName() const override; + RHI::Ptr CreatePipelineLayoutDescriptor() override; + RHI::Ptr CreateShaderStageFunction(const StageDescriptor& stageDescriptor) override; + bool IsShaderStageForRaster(RHI::ShaderHardwareStage shaderStageType) const override; + bool IsShaderStageForCompute(RHI::ShaderHardwareStage shaderStageType) const override; + bool IsShaderStageForRayTracing(RHI::ShaderHardwareStage shaderStageType) const override; + bool CompilePlatformInternal( + const AssetBuilderSDK::PlatformInfo& platform, const AZStd::string& shaderSourcePath, const AZStd::string& functionName, + RHI::ShaderHardwareStage shaderStage, const AZStd::string& tempFolderPath, StageDescriptor& outputDescriptor, + const RHI::ShaderCompilerArguments& shaderCompilerArguments) const override; + AZStd::string GetAzslCompilerWarningParameters(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const; + bool BuildHasDebugInfo(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const override; + const char* GetAzslHeader(const AssetBuilderSDK::PlatformInfo& platform) const override; + bool BuildPipelineLayoutDescriptor( + RHI::Ptr pipelineLayoutDescriptor, + const ShaderResourceGroupInfoList& srgInfoList, + const RootConstantsInfo& rootConstantsInfo, + const RHI::ShaderCompilerArguments& shaderCompilerArguments) override; + AZStd::string GetAzslCompilerParameters(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const override; + ////////////////////////////////////////////////////////////////////////// + + private: + ShaderPlatformInterface() = delete; + + const Name m_apiName{APINameString}; + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.cpp new file mode 100644 index 0000000000..ebe9744abe --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.cpp @@ -0,0 +1,58 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + void ShaderPlatformInterfaceSystemComponent::Reflect(AZ::ReflectContext* context) + { + if (SerializeContext* serialize = azrtti_cast(context)) + { + serialize->Class() + ->Version(0) + ->Attribute(Edit::Attributes::SystemComponentTags, AZStd::vector({ AssetBuilderSDK::ComponentTags::AssetBuilder })) + ; + } + } + + void ShaderPlatformInterfaceSystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + dependent.push_back(AZ_CRC("AzslShaderBuilderService", 0x09315a40)); + } + + void ShaderPlatformInterfaceSystemComponent::Activate() + { + m_shaderPlatformInterface = AZStd::make_unique(APIUniqueIndex); + RHI::ShaderPlatformInterfaceRegisterBus::Broadcast( + &RHI::ShaderPlatformInterfaceRegister::RegisterShaderPlatformHandler, + m_shaderPlatformInterface.get()); + } + + void ShaderPlatformInterfaceSystemComponent::Deactivate() + { + RHI::ShaderPlatformInterfaceRegisterBus::Broadcast( + &RHI::ShaderPlatformInterfaceRegister::UnregisterShaderPlatformHandler, + m_shaderPlatformInterface.get()); + m_shaderPlatformInterface = nullptr; + } + + } // namespace Null +} // namespace AZ diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h new file mode 100644 index 0000000000..debb0994ec --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h @@ -0,0 +1,46 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class ShaderPlatformInterfaceSystemComponent final + : public AZ::Component + { + public: + AZ_COMPONENT(ShaderPlatformInterfaceSystemComponent, "{CC4C6744-2D8F-461C-AC86-6C1563BC2552}"); + static void Reflect(AZ::ReflectContext* context); + + ShaderPlatformInterfaceSystemComponent() = default; + ~ShaderPlatformInterfaceSystemComponent() override = default; + + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); + + // AZ::Component + void Activate() override; + void Deactivate() override; + + private: + ShaderPlatformInterfaceSystemComponent(const ShaderPlatformInterfaceSystemComponent&) = delete; + + AZStd::unique_ptr m_shaderPlatformInterface; + }; + } // namespace Null +} // namespace AZ diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/PipelineLayoutDescriptor.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/PipelineLayoutDescriptor.cpp new file mode 100644 index 0000000000..0f7781c08d --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/PipelineLayoutDescriptor.cpp @@ -0,0 +1,43 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include +#include +#include + +namespace AZ +{ + namespace Null + { + void PipelineLayoutDescriptor::Reflect(AZ::ReflectContext* context) + { + if (SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(4); + } + } + + RHI::Ptr PipelineLayoutDescriptor::Create() + { + return aznew PipelineLayoutDescriptor(); + } + + void PipelineLayoutDescriptor::ResetInternal() + { + } + + HashValue64 PipelineLayoutDescriptor::GetHashInternal(HashValue64 seed) const + { + return seed; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/ReflectSystemComponent.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/ReflectSystemComponent.cpp new file mode 100644 index 0000000000..7b67501a3e --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/ReflectSystemComponent.cpp @@ -0,0 +1,33 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include + +namespace AZ +{ + namespace Null + { + void ReflectSystemComponent::Reflect(AZ::ReflectContext* context) + { + if (SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1); + } + + PipelineLayoutDescriptor::Reflect(context); + ShaderStageFunction::Reflect(context); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/ShaderStageFunction.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/ShaderStageFunction.cpp new file mode 100644 index 0000000000..9dfe84332b --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Reflect/ShaderStageFunction.cpp @@ -0,0 +1,45 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include + +namespace AZ +{ + namespace Null + { + void ShaderStageFunction::Reflect(ReflectContext* context) + { + if (SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class()->Version(1); + } + } + + ShaderStageFunction::ShaderStageFunction(RHI::ShaderStage shaderStage) + : RHI::ShaderStageFunction(shaderStage) + {} + + RHI::Ptr ShaderStageFunction::Create(RHI::ShaderStage shaderStage) + { + return aznew ShaderStageFunction(shaderStage); + } + + RHI::ResultCode ShaderStageFunction::FinalizeInternal() + { + //Attach a dummy hash so it does not trigger validation checks + SetHash(HashValue64{1}); + return RHI::ResultCode::Success; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/AliasedHeap.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/AliasedHeap.cpp new file mode 100644 index 0000000000..b38d62c583 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/AliasedHeap.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr AliasedHeap::Create() + { + return aznew AliasedHeap; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/AliasedHeap.h b/Gems/Atom/RHI/Null/Code/Source/RHI/AliasedHeap.h new file mode 100644 index 0000000000..c1a2f2b29c --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/AliasedHeap.h @@ -0,0 +1,43 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + + +namespace AZ +{ + namespace Null + { + class AliasedHeap final + : public RHI::AliasedHeap + { + using Base = RHI::AliasedHeap; + public: + AZ_CLASS_ALLOCATOR(AliasedHeap, AZ::SystemAllocator, 0); + AZ_RTTI(AliasedHeap, "{F83E0C8A-5421-4E90-9B7A-7FB127B2E7E4}", Base); + + static RHI::Ptr Create(); + private: + AliasedHeap() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::AliasedHeap + AZStd::unique_ptr CreateBarrierTrackerInternal() override { return nullptr;} + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::AliasedHeapDescriptor& descriptor) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitImageInternal([[maybe_unused]] const RHI::ImageInitRequest& request, [[maybe_unused]] size_t heapOffset) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitBufferInternal([[maybe_unused]] const RHI::BufferInitRequest& request, [[maybe_unused]] size_t heapOffset) override { return RHI::ResultCode::Success;} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Buffer.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/Buffer.cpp new file mode 100644 index 0000000000..b248d3d603 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Buffer.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr Buffer::Create() + { + return aznew Buffer(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Buffer.h b/Gems/Atom/RHI/Null/Code/Source/RHI/Buffer.h new file mode 100644 index 0000000000..7b1645758e --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Buffer.h @@ -0,0 +1,42 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class Buffer final + : public RHI::Buffer + { + using Base = RHI::Buffer; + public: + AZ_CLASS_ALLOCATOR(Buffer, AZ::ThreadPoolAllocator, 0); + AZ_RTTI(Buffer, "{4D9739D8-8C42-4C3D-8253-C8500EBA2D84}", Base); + ~Buffer() = default; + + static RHI::Ptr Create(); + + private: + Buffer() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::Resource + void ReportMemoryUsage([[maybe_unused]] RHI::MemoryStatisticsBuilder& builder) const override {} + ////////////////////////////////////////////////////////////////////////// + + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/BufferPool.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferPool.cpp new file mode 100644 index 0000000000..628a601e20 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferPool.cpp @@ -0,0 +1,30 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr BufferPool::Create() + { + return aznew BufferPool(); + } + + void BufferPool::OnFrameEnd() + { + Base::OnFrameEnd(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/BufferPool.h b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferPool.h new file mode 100644 index 0000000000..c09c4314a5 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferPool.h @@ -0,0 +1,54 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class BufferPool final + : public RHI::BufferPool + { + using Base = RHI::BufferPool; + public: + AZ_RTTI(BufferPool, "{5F02ECA6-135C-4C96-895E-514E273EEFC2}", Base); + AZ_CLASS_ALLOCATOR(BufferPool, AZ::SystemAllocator, 0); + virtual ~BufferPool() = default; + + static RHI::Ptr Create(); + + private: + BufferPool() = default; + + ////////////////////////////////////////////////////////////////////////// + // FrameSchedulerEventBus::Handler + void OnFrameEnd() override; + ////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + // RHI::BufferPool + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::BufferPoolDescriptor& descriptor) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + RHI::ResultCode InitBufferInternal([[maybe_unused]] RHI::Buffer& buffer, [[maybe_unused]] const RHI::BufferDescriptor& rhiDescriptor) override{ return RHI::ResultCode::Success;} + void ShutdownResourceInternal([[maybe_unused]] RHI::Resource& resource) override {} + RHI::ResultCode OrphanBufferInternal([[maybe_unused]] RHI::Buffer& buffer) override { return RHI::ResultCode::Success;} + RHI::ResultCode MapBufferInternal([[maybe_unused]] const RHI::BufferMapRequest& mapRequest, [[maybe_unused]] RHI::BufferMapResponse& response) override { return RHI::ResultCode::Unimplemented;} + void UnmapBufferInternal([[maybe_unused]] RHI::Buffer& buffer) override {} + RHI::ResultCode StreamBufferInternal([[maybe_unused]] const RHI::BufferStreamRequest& request) override { return RHI::ResultCode::Success;} + ////////////////////////////////////////////////////////////////////////// + + }; + + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/BufferView.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferView.cpp new file mode 100644 index 0000000000..79404a0f0c --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferView.cpp @@ -0,0 +1,25 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + + +namespace AZ +{ + namespace Null + { + RHI::Ptr BufferView::Create() + { + return aznew BufferView(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/BufferView.h b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferView.h new file mode 100644 index 0000000000..fa2a4be868 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/BufferView.h @@ -0,0 +1,43 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class BufferView final + : public RHI::BufferView + { + using Base = RHI::BufferView; + public: + AZ_CLASS_ALLOCATOR(BufferView, AZ::ThreadPoolAllocator, 0); + AZ_RTTI(BufferView, "{FE5E5E22-FC6C-4BDF-BD9B-427072C3C43F}", Base); + + static RHI::Ptr Create(); + + private: + BufferView() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::BufferView + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::Resource& resourceBase) override { return RHI::ResultCode::Success;} + RHI::ResultCode InvalidateInternal() override { return RHI::ResultCode::Success;} + void ShutdownInternal() override{}; + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/CommandList.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandList.cpp new file mode 100644 index 0000000000..a4c4e4ec73 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandList.cpp @@ -0,0 +1,29 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr CommandList::Create() + { + return aznew CommandList(); + } + + void CommandList::Shutdown() + { + DeviceObject::Shutdown(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/CommandList.h b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandList.h new file mode 100644 index 0000000000..9f52aaa535 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandList.h @@ -0,0 +1,56 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class CommandList final + : public RHI::CommandList + , public RHI::DeviceObject + { + using Base = RHI::CommandList; + public: + AZ_CLASS_ALLOCATOR(CommandList, AZ::SystemAllocator, 0); + AZ_RTTI(CommandList, "{265B877D-21DC-48FF-9D82-AA30C3E16422}", Base); + + static RHI::Ptr Create(); + + ////////////////////////////////////////////////////////////////////////// + // RHI::CommandList + void SetViewports([[maybe_unused]] const RHI::Viewport* viewports, [[maybe_unused]] uint32_t count) override {} + void SetScissors([[maybe_unused]] const RHI::Scissor* scissors, [[maybe_unused]] uint32_t count) override {} + void SetShaderResourceGroupForDraw([[maybe_unused]] const RHI::ShaderResourceGroup& shaderResourceGroup) override {} + void SetShaderResourceGroupForDispatch([[maybe_unused]] const RHI::ShaderResourceGroup& shaderResourceGroup) override {} + void Submit([[maybe_unused]] const RHI::DrawItem& drawItem) override {} + void Submit([[maybe_unused]] const RHI::CopyItem& copyItem) override {} + void Submit([[maybe_unused]] const RHI::DispatchItem& dispatchItem) override {} + void Submit([[maybe_unused]] const RHI::DispatchRaysItem& dispatchRaysItem) override {} + void BeginPredication([[maybe_unused]] const RHI::Buffer& buffer, [[maybe_unused]] uint64_t offset, [[maybe_unused]] RHI::PredicationOp operation) override {} + void EndPredication() override {} + void BuildBottomLevelAccelerationStructure([[maybe_unused]] const RHI::RayTracingBlas& rayTracingBlas) override {} + void BuildTopLevelAccelerationStructure([[maybe_unused]] const RHI::RayTracingTlas& rayTracingTlas) override {} + ///////////////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // RHI::DeviceObject + void Shutdown() override; + /////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/CommandQueue.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandQueue.cpp new file mode 100644 index 0000000000..bb0945a71f --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandQueue.cpp @@ -0,0 +1,25 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + + +namespace AZ +{ + namespace Null + { + RHI::Ptr CommandQueue::Create() + { + return aznew CommandQueue(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/CommandQueue.h b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandQueue.h new file mode 100644 index 0000000000..b8749d3041 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/CommandQueue.h @@ -0,0 +1,51 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + + +namespace AZ +{ + namespace Null + { + class CommandQueue final + : public RHI::CommandQueue + { + using Base = RHI::CommandQueue; + public: + AZ_CLASS_ALLOCATOR(CommandQueue, AZ::SystemAllocator, 0); + AZ_RTTI(CommandQueue, "{5835D7F8-B991-44F2-8EE9-533C3B33B8AB}", Base); + + using Descriptor = RHI::CommandQueueDescriptor; + static RHI::Ptr Create(); + + ////////////////////////////////////////////////////////////////////////// + // RHI::CommandQueue + void ExecuteWork([[maybe_unused]] const RHI::ExecuteWorkRequest& request) override {} + void WaitForIdle() override {} + ////////////////////////////////////////////////////////////////////////// + + private: + CommandQueue() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::CommandQueue + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::CommandQueueDescriptor& descriptor) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + void* GetNativeQueue() override { return nullptr;} + ////////////////////////////////////////////////////////////////////////// + + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Device.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/Device.cpp new file mode 100644 index 0000000000..829b4aeae7 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Device.cpp @@ -0,0 +1,29 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr Device::Create() + { + return aznew Device(); + } + + void Device::FillFormatsCapabilitiesInternal(FormatCapabilitiesList& formatsCapabilities) + { + formatsCapabilities.fill(static_cast(~0)); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Device.h b/Gems/Atom/RHI/Null/Code/Source/RHI/Device.h new file mode 100644 index 0000000000..9969204866 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Device.h @@ -0,0 +1,54 @@ + +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class Device final + : public RHI::Device + { + using Base = RHI::Device; + public: + AZ_CLASS_ALLOCATOR(Device, AZ::SystemAllocator, 0); + AZ_RTTI(Device, "{F2AAE1EA-6B35-4870-9C73-8CD7EDC149A8}", Base); + + static RHI::Ptr Create(); + + private: + Device() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::Device + RHI::ResultCode InitInternal([[maybe_unused]] RHI::PhysicalDevice& physicalDevice) override { return RHI::ResultCode::Success;} + RHI::ResultCode PostInitInternal([[maybe_unused]] const RHI::DeviceDescriptor& params) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + void CompileMemoryStatisticsInternal([[maybe_unused]] RHI::MemoryStatisticsBuilder& builder) override {} + void UpdateCpuTimingStatisticsInternal([[maybe_unused]] RHI::CpuTimingStatistics& cpuTimingStatistics) const override {} + void BeginFrameInternal() override {} + void EndFrameInternal() override {} + void WaitForIdleInternal() override {} + AZStd::chrono::microseconds GpuTimestampToMicroseconds([[maybe_unused]] uint64_t gpuTimestamp, [[maybe_unused]] RHI::HardwareQueueClass queueClass) const override { return AZStd::chrono::microseconds();} + void FillFormatsCapabilitiesInternal([[maybe_unused]] FormatCapabilitiesList& formatsCapabilities) override; + void PreShutdown() override {} + RHI::ResourceMemoryRequirements GetResourceMemoryRequirements([[maybe_unused]] const RHI::ImageDescriptor& descriptor) override { return RHI::ResourceMemoryRequirements();} + RHI::ResourceMemoryRequirements GetResourceMemoryRequirements([[maybe_unused]] const RHI::BufferDescriptor& descriptor) override { return RHI::ResourceMemoryRequirements();} + ////////////////////////////////////////////////////////////////////////// + }; + } +} + + diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphCompiler.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphCompiler.cpp new file mode 100644 index 0000000000..0de10e8c0d --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphCompiler.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr FrameGraphCompiler::Create() + { + return aznew FrameGraphCompiler(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphCompiler.h b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphCompiler.h new file mode 100644 index 0000000000..6e3f959142 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphCompiler.h @@ -0,0 +1,41 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class FrameGraphCompiler final + : public RHI::FrameGraphCompiler + { + using Base = RHI::FrameGraphCompiler; + public: + AZ_CLASS_ALLOCATOR(FrameGraphCompiler, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + FrameGraphCompiler() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::FrameGraphCompiler + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + RHI::MessageOutcome CompileInternal([[maybe_unused]] const RHI::FrameGraphCompileRequest& request) override { return AZ::Success();} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphExecuter.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphExecuter.cpp new file mode 100644 index 0000000000..9d020b5c2f --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphExecuter.cpp @@ -0,0 +1,24 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr FrameGraphExecuter::Create() + { + return aznew FrameGraphExecuter(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphExecuter.h b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphExecuter.h new file mode 100644 index 0000000000..34f610e9d7 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/FrameGraphExecuter.h @@ -0,0 +1,44 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class FrameGraphExecuter final + : public RHI::FrameGraphExecuter + { + using Base = RHI::FrameGraphExecuter; + public: + AZ_CLASS_ALLOCATOR(FrameGraphExecuter, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + + ////////////////////////////////////////////////////////////////////////// + // RHI::FrameGraphExecuter + RHI::ResultCode InitInternal([[maybe_unused]] const RHI::FrameGraphExecuterDescriptor& descriptor) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + void BeginInternal([[maybe_unused]] const RHI::FrameGraph& frameGraph) override {} + void ExecuteGroupInternal([[maybe_unused]] RHI::FrameGraphExecuteGroup& group) override {} + void EndInternal() override {} + /////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Image.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/Image.cpp new file mode 100644 index 0000000000..cfa358f456 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Image.cpp @@ -0,0 +1,24 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr Image::Create() + { + return aznew Image(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Image.h b/Gems/Atom/RHI/Null/Code/Source/RHI/Image.h new file mode 100644 index 0000000000..c81f9895bb --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Image.h @@ -0,0 +1,51 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class Image final + : public RHI::Image + { + using Base = RHI::Image; + public: + AZ_CLASS_ALLOCATOR(Image, AZ::ThreadPoolAllocator, 0); + AZ_RTTI(Image, "{2AA22D3F-521B-4058-92F2-CEBBD2891D6C}", Base); + ~Image() = default; + + static RHI::Ptr Create(); + + private: + Image() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::Object + void SetNameInternal([[maybe_unused]] const AZStd::string_view& name) override {} + ////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + // RHI::Image + void GetSubresourceLayoutsInternal( + [[maybe_unused]] const RHI::ImageSubresourceRange& subresourceRange, + [[maybe_unused]] RHI::ImageSubresourceLayoutPlaced* subresourceLayouts, + [[maybe_unused]] size_t* totalSizeInBytes) const override + { + } + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ImagePool.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/ImagePool.cpp new file mode 100644 index 0000000000..be303fe223 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ImagePool.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr ImagePool::Create() + { + return aznew ImagePool(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ImagePool.h b/Gems/Atom/RHI/Null/Code/Source/RHI/ImagePool.h new file mode 100644 index 0000000000..c6e3e1a816 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ImagePool.h @@ -0,0 +1,42 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class ImagePool final + : public RHI::ImagePool + { + using Base = RHI::ImagePool; + public: + AZ_CLASS_ALLOCATOR(ImagePool, AZ::SystemAllocator, 0); + AZ_RTTI(ImagePool, "{40DC04EA-890C-4D99-9F9C-DEC0038D7451}", RHI::ImagePool); + + static RHI::Ptr Create(); + + private: + ImagePool() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::ImagePool + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device&, [[maybe_unused]] const RHI::ImagePoolDescriptor&) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitImageInternal([[maybe_unused]] const RHI::ImageInitRequest& request) override { return RHI::ResultCode::Success;} + RHI::ResultCode UpdateImageContentsInternal([[maybe_unused]] const RHI::ImageUpdateRequest& request) override { return RHI::ResultCode::Success;} + void ShutdownResourceInternal([[maybe_unused]] RHI::Resource& resourceBase) override {} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ImageView.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/ImageView.cpp new file mode 100644 index 0000000000..4cb8bbb5b7 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ImageView.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr ImageView::Create() + { + return aznew ImageView(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ImageView.h b/Gems/Atom/RHI/Null/Code/Source/RHI/ImageView.h new file mode 100644 index 0000000000..c693f5f849 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ImageView.h @@ -0,0 +1,44 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class Image; + + class ImageView final + : public RHI::ImageView + { + using Base = RHI::ImageView; + public: + AZ_CLASS_ALLOCATOR(ImageView, AZ::ThreadPoolAllocator, 0); + AZ_RTTI(ImageView, "{4960F7E4-1B2D-4F35-97B3-7B21A5E1C516}", Base); + + static RHI::Ptr Create(); + + private: + ImageView() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::ImageView + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::Resource& resourceBase) override { return RHI::ResultCode::Success;} + RHI::ResultCode InvalidateInternal() override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Module.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/Module.cpp new file mode 100644 index 0000000000..3a4a0435b2 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Module.cpp @@ -0,0 +1,48 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class PlatformModule + : public AZ::Module + { + public: + AZ_RTTI(PlatformModule, "{D4755E9B-D504-4C72-BD39-AD1903B1E13F}", Module); + + PlatformModule() + { + m_descriptors.insert(m_descriptors.end(), { + ReflectSystemComponent::CreateDescriptor(), + SystemComponent::CreateDescriptor() + }); + } + ~PlatformModule() override = default; + + AZ::ComponentTypeList GetRequiredSystemComponents() const override + { + return + { + azrtti_typeid() + }; + } + }; + } +} + +AZ_DECLARE_MODULE_CLASS(Gem_Atom_RHI_Null_Private, AZ::Null::PlatformModule) diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/PhysicalDevice.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/PhysicalDevice.cpp new file mode 100644 index 0000000000..50a54783f1 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/PhysicalDevice.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::PhysicalDeviceList PhysicalDevice::Enumerate() + { + return RHI::PhysicalDeviceList{aznew PhysicalDevice}; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/PhysicalDevice.h b/Gems/Atom/RHI/Null/Code/Source/RHI/PhysicalDevice.h new file mode 100644 index 0000000000..04fe0fc858 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/PhysicalDevice.h @@ -0,0 +1,33 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class PhysicalDevice final + : public RHI::PhysicalDevice + { + using Base = RHI::PhysicalDevice; + public: + AZ_CLASS_ALLOCATOR(PhysicalDevice, AZ::SystemAllocator, 0); + AZ_RTTI(PhysicalDevice, "{BE6A13AB-4D5D-4B2C-8869-7EEF11462287}", Base); + PhysicalDevice() = default; + ~PhysicalDevice() = default; + + static RHI::PhysicalDeviceList Enumerate(); + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineLibrary.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineLibrary.cpp new file mode 100644 index 0000000000..9d70d034ac --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineLibrary.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr PipelineLibrary::Create() + { + return aznew PipelineLibrary; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineLibrary.h b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineLibrary.h new file mode 100644 index 0000000000..9edd082d74 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineLibrary.h @@ -0,0 +1,42 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class PipelineLibrary final + : public RHI::PipelineLibrary + { + public: + AZ_CLASS_ALLOCATOR(PipelineLibrary, AZ::SystemAllocator, 0); + AZ_DISABLE_COPY_MOVE(PipelineLibrary); + + static RHI::Ptr Create(); + + private: + PipelineLibrary() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::PipelineLibrary + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::PipelineLibraryData* serializedData) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + RHI::ResultCode MergeIntoInternal([[maybe_unused]] AZStd::array_view libraries) override { return RHI::ResultCode::Success;} + RHI::ConstPtr GetSerializedDataInternal() const override { return nullptr;} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineState.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineState.cpp new file mode 100644 index 0000000000..fb698a61fe --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineState.cpp @@ -0,0 +1,24 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr PipelineState::Create() + { + return aznew PipelineState; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineState.h b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineState.h new file mode 100644 index 0000000000..e9aca6aeae --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/PipelineState.h @@ -0,0 +1,40 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class PipelineState final + : public RHI::PipelineState + { + public: + AZ_CLASS_ALLOCATOR(PipelineState, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + PipelineState() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::PipelineState + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::PipelineStateDescriptorForDraw& descriptor, [[maybe_unused]] RHI::PipelineLibrary* pipelineLibrary) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::PipelineStateDescriptorForDispatch& descriptor, [[maybe_unused]] RHI::PipelineLibrary* pipelineLibrary) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::PipelineStateDescriptorForRayTracing& descriptor, [[maybe_unused]] RHI::PipelineLibrary* pipelineLibrary) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Query.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/Query.cpp new file mode 100644 index 0000000000..3a6050c8ff --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Query.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr Query::Create() + { + return aznew Query(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Query.h b/Gems/Atom/RHI/Null/Code/Source/RHI/Query.h new file mode 100644 index 0000000000..73d01dadf8 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Query.h @@ -0,0 +1,44 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class Query final + : public RHI::Query + { + friend class QueryPool; + using Base = RHI::Query; + public: + AZ_CLASS_ALLOCATOR(Query, AZ::ThreadPoolAllocator, 0); + AZ_RTTI(Query, "{2DD0558E-F422-4268-8C1F-9900818A7B5A}", Base); + ~Query() = default; + + static RHI::Ptr Create(); + + private: + Query() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::Query + RHI::ResultCode BeginInternal([[maybe_unused]] RHI::CommandList& commandList, [[maybe_unused]] RHI::QueryControlFlags flags) override { return RHI::ResultCode::Success;} + RHI::ResultCode EndInternal([[maybe_unused]] RHI::CommandList& commandList) override { return RHI::ResultCode::Success;} + RHI::ResultCode WriteTimestampInternal([[maybe_unused]] RHI::CommandList& commandList) override { return RHI::ResultCode::Success;} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/QueryPool.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/QueryPool.cpp new file mode 100644 index 0000000000..a7eae94d33 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/QueryPool.cpp @@ -0,0 +1,29 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr QueryPool::Create() + { + return aznew QueryPool(); + } + + void QueryPool::OnFrameEnd() + { + Base::OnFrameEnd(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/QueryPool.h b/Gems/Atom/RHI/Null/Code/Source/RHI/QueryPool.h new file mode 100644 index 0000000000..cb5d15b4ed --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/QueryPool.h @@ -0,0 +1,47 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class QueryPool final + : public RHI::QueryPool + { + using Base = RHI::QueryPool; + public: + AZ_RTTI(QueryPool, "{C4057417-0B50-4F7C-9FFA-CB66E937AD6E}", Base); + AZ_CLASS_ALLOCATOR(QueryPool, AZ::SystemAllocator, 0); + virtual ~QueryPool() = default; + + static RHI::Ptr Create(); + + private: + QueryPool() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::QueryPool + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::QueryPoolDescriptor& descriptor) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitQueryInternal([[maybe_unused]] RHI::Query& query) override { return RHI::ResultCode::Success;} + RHI::ResultCode GetResultsInternal([[maybe_unused]] uint32_t startIndex, [[maybe_unused]] uint32_t queryCount, [[maybe_unused]] uint64_t* results, [[maybe_unused]] uint32_t resultsCount, [[maybe_unused]] RHI::QueryResultFlagBits flags) override { return RHI::ResultCode::Success;} + ////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + // FrameEventBus::Handler + void OnFrameEnd() override; + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBlas.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBlas.cpp new file mode 100644 index 0000000000..ad52756c2c --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBlas.cpp @@ -0,0 +1,25 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + + +namespace AZ +{ + namespace Null + { + RHI::Ptr RayTracingBlas::Create() + { + return aznew RayTracingBlas; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBlas.h b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBlas.h new file mode 100644 index 0000000000..b27b7fcc1c --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBlas.h @@ -0,0 +1,43 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class Buffer; + + class RayTracingBlas final + : public RHI::RayTracingBlas + { + public: + AZ_CLASS_ALLOCATOR(RayTracingBlas, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + // RHI::RayTracingBlas overrides... + virtual bool IsValid() const override { return true; } + + private: + RayTracingBlas() = default; + + // RHI::RayTracingBlas overrides... + RHI::ResultCode CreateBuffersInternal([[maybe_unused]] RHI::Device& deviceBase, [[maybe_unused]] const RHI::RayTracingBlasDescriptor* descriptor, [[maybe_unused]] const RHI::RayTracingBufferPools& rayTracingBufferPools) override {return RHI::ResultCode::Success;} + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBufferPools.h b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBufferPools.h new file mode 100644 index 0000000000..9b43de28bb --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingBufferPools.h @@ -0,0 +1,33 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Null + { + class RayTracingBufferPools final + : public RHI::RayTracingBufferPools + { + public: + AZ_CLASS_ALLOCATOR(RayTracingBufferPools, AZ::SystemAllocator, 0); + + static RHI::Ptr Create() { return aznew RayTracingBufferPools; } + + private: + RayTracingBufferPools() = default; + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingPipelineState.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingPipelineState.cpp new file mode 100644 index 0000000000..069922474b --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingPipelineState.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr RayTracingPipelineState::Create() + { + return aznew RayTracingPipelineState; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingPipelineState.h b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingPipelineState.h new file mode 100644 index 0000000000..12f5af958e --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingPipelineState.h @@ -0,0 +1,40 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class RayTracingPipelineState final + : public RHI::RayTracingPipelineState + { + public: + AZ_CLASS_ALLOCATOR(RayTracingPipelineState, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + RayTracingPipelineState() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::PipelineState + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& deviceBase, [[maybe_unused]] const RHI::RayTracingPipelineStateDescriptor* descriptor) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingShaderTable.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingShaderTable.cpp new file mode 100644 index 0000000000..0153adf23e --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingShaderTable.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr RayTracingShaderTable::Create() + { + return aznew RayTracingShaderTable; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingShaderTable.h b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingShaderTable.h new file mode 100644 index 0000000000..f36242ff22 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingShaderTable.h @@ -0,0 +1,41 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include + + +namespace AZ +{ + namespace Null + { + class Buffer; + + class RayTracingShaderTable final + : public RHI::RayTracingShaderTable + { + public: + AZ_CLASS_ALLOCATOR(RayTracingShaderTable, AZ::SystemAllocator, 0); + static RHI::Ptr Create(); + + private: + RayTracingShaderTable() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::PipelineState + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& deviceBase, [[maybe_unused]] const RHI::RayTracingShaderTableDescriptor* descriptor, [[maybe_unused]] const RHI::RayTracingBufferPools& bufferPools) override {return RHI::ResultCode::Success;} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingTlas.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingTlas.cpp new file mode 100644 index 0000000000..4692c68992 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingTlas.cpp @@ -0,0 +1,25 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr RayTracingTlas::Create() + { + return aznew RayTracingTlas; + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingTlas.h b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingTlas.h new file mode 100644 index 0000000000..0c5496e643 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/RayTracingTlas.h @@ -0,0 +1,43 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class Buffer; + + class RayTracingTlas final + : public RHI::RayTracingTlas + { + public: + AZ_CLASS_ALLOCATOR(RayTracingTlas, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + // RHI::RayTracingTlas overrides... + virtual const RHI::Ptr GetTlasBuffer() const override { return nullptr; } + + private: + RayTracingTlas() = default; + + // RHI::RayTracingTlas overrides + RHI::ResultCode CreateBuffersInternal([[maybe_unused]] RHI::Device& deviceBase, [[maybe_unused]] const RHI::RayTracingTlasDescriptor* descriptor, [[maybe_unused]] const RHI::RayTracingBufferPools& rayTracingBufferPools) override {return RHI::ResultCode::Success;} + + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Scope.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/Scope.cpp new file mode 100644 index 0000000000..f633e4a525 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Scope.cpp @@ -0,0 +1,24 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr Scope::Create() + { + return aznew Scope(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Scope.h b/Gems/Atom/RHI/Null/Code/Source/RHI/Scope.h new file mode 100644 index 0000000000..2122f0a279 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Scope.h @@ -0,0 +1,42 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class Scope final + : public RHI::Scope + { + using Base = RHI::Scope; + public: + AZ_RTTI(Scope, "{2F46C8DD-08CB-427C-8EE7-7D00F140A22F}", Base); + AZ_CLASS_ALLOCATOR(Scope, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + Scope() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::Scope + void DeactivateInternal() override {} + void CompileInternal([[maybe_unused]] RHI::Device& device) override {} + void AddQueryPoolUse([[maybe_unused]] RHI::Ptr queryPool, [[maybe_unused]] const RHI::Interval& interval, [[maybe_unused]] RHI::ScopeAttachmentAccess access) override {} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroup.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroup.cpp new file mode 100644 index 0000000000..b3e47395d1 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroup.cpp @@ -0,0 +1,24 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr ShaderResourceGroup::Create() + { + return aznew ShaderResourceGroup(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroup.h b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroup.h new file mode 100644 index 0000000000..9d2d70fc88 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroup.h @@ -0,0 +1,33 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class ShaderResourceGroup final + : public RHI::ShaderResourceGroup + { + using Base = RHI::ShaderResourceGroup; + public: + AZ_CLASS_ALLOCATOR(ShaderResourceGroup, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + ShaderResourceGroup() = default; + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroupPool.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroupPool.cpp new file mode 100644 index 0000000000..124c70e75e --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroupPool.cpp @@ -0,0 +1,39 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr ShaderResourceGroupPool::Create() + { + return aznew ShaderResourceGroupPool(); + } + + void ShaderResourceGroupPool::OnFrameEnd() + { + Base::OnFrameEnd(); + } + + void ShaderResourceGroupPool::ShutdownInternal() + { + Base::ShutdownInternal(); + } + + void ShaderResourceGroupPool::ShutdownResourceInternal(RHI::Resource& resourceBase) + { + Base::ShutdownResourceInternal(resourceBase); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroupPool.h b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroupPool.h new file mode 100644 index 0000000000..0ab273e1f0 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/ShaderResourceGroupPool.h @@ -0,0 +1,47 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class ShaderResourceGroupPool final + : public RHI::ShaderResourceGroupPool + { + using Base = RHI::ShaderResourceGroupPool; + public: + AZ_CLASS_ALLOCATOR(ShaderResourceGroupPool, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + ShaderResourceGroupPool() = default; + + ////////////////////////////////////////////////////////////////////////// + // Platform API + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& deviceBase, [[maybe_unused]] const RHI::ShaderResourceGroupPoolDescriptor& descriptor) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitGroupInternal([[maybe_unused]] RHI::ShaderResourceGroup& groupBase) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override; + RHI::ResultCode CompileGroupInternal([[maybe_unused]] RHI::ShaderResourceGroup& groupBase, [[maybe_unused]] const RHI::ShaderResourceGroupData& groupData) override { return RHI::ResultCode::Success;} + void ShutdownResourceInternal([[maybe_unused]] RHI::Resource& resourceBase) override; + ////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + // FrameSchedulerEventBus::Handler + void OnFrameEnd() override; + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/StreamingImagePool.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/StreamingImagePool.cpp new file mode 100644 index 0000000000..b8cd7a64d7 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/StreamingImagePool.cpp @@ -0,0 +1,24 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr StreamingImagePool::Create() + { + return aznew StreamingImagePool(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/StreamingImagePool.h b/Gems/Atom/RHI/Null/Code/Source/RHI/StreamingImagePool.h new file mode 100644 index 0000000000..e806e8d2b5 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/StreamingImagePool.h @@ -0,0 +1,49 @@ + +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class StreamingImagePool final + : public RHI::StreamingImagePool + { + using Base = RHI::StreamingImagePool; + public: + AZ_CLASS_ALLOCATOR(StreamingImagePool, AZ::SystemAllocator, 0); + AZ_RTTI(StreamingImagePool, "{15688218-739F-40B2-9753-70AD2A432C3A}", Base); + static RHI::Ptr Create(); + + private: + StreamingImagePool() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::StreamingImagePool + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& deviceBase, [[maybe_unused]] const RHI::StreamingImagePoolDescriptor& descriptor) override { return RHI::ResultCode::Success;} + RHI::ResultCode InitImageInternal([[maybe_unused]] const RHI::StreamingImageInitRequest& request) override { return RHI::ResultCode::Success;} + RHI::ResultCode ExpandImageInternal([[maybe_unused]] const RHI::StreamingImageExpandRequest& request) override { return RHI::ResultCode::Success;} + RHI::ResultCode TrimImageInternal([[maybe_unused]] RHI::Image& image, [[maybe_unused]] uint32_t targetMipLevel) override { return RHI::ResultCode::Success;} + ////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + // RHI::ResourcePool + void ShutdownInternal() override {} + void ShutdownResourceInternal([[maybe_unused]] RHI::Resource& resourceBase) override {} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/SwapChain.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/SwapChain.cpp new file mode 100644 index 0000000000..880defd8ad --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/SwapChain.cpp @@ -0,0 +1,25 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include + + +namespace AZ +{ + namespace Null + { + RHI::Ptr SwapChain::Create() + { + return aznew SwapChain(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/SwapChain.h b/Gems/Atom/RHI/Null/Code/Source/RHI/SwapChain.h new file mode 100644 index 0000000000..3ac61771ef --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/SwapChain.h @@ -0,0 +1,44 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class SwapChain + : public RHI::SwapChain + { + using Base = RHI::SwapChain; + public: + AZ_RTTI(SwapChain, "{FD1CC898-684A-46A5-92C3-519CD8E490D7}", Base); + AZ_CLASS_ALLOCATOR(SwapChain, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + SwapChain() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::SwapChain + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& deviceBase, [[maybe_unused]] const RHI::SwapChainDescriptor& descriptor, [[maybe_unused]] RHI::SwapChainDimensions* nativeDimensions) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + uint32_t PresentInternal() override {return 0;} + RHI::ResultCode InitImageInternal([[maybe_unused]] const InitImageRequest& request) override { return RHI::ResultCode::Success;} + void ShutdownResourceInternal([[maybe_unused]] RHI::Resource& resourceBase) override {} + RHI::ResultCode ResizeInternal([[maybe_unused]] const RHI::SwapChainDimensions& dimensions, [[maybe_unused]] RHI::SwapChainDimensions* nativeDimensions) override { return RHI::ResultCode::Success;} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.cpp new file mode 100644 index 0000000000..f5d54b1341 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.cpp @@ -0,0 +1,234 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#include "Atom_RHI_Null_precompiled.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + void SystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(RHI::Factory::GetPlatformService()); + } + + void SystemComponent::GetRequiredServices(ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(RHI::Factory::GetManagerComponentService()); + } + + void SystemComponent::Reflect(AZ::ReflectContext* context) + { + if (SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1); + } + } + + void SystemComponent::Activate() + { + RHI::FactoryManagerBus::Broadcast(&RHI::FactoryManagerRequest::RegisterFactory, this); + } + + void SystemComponent::Deactivate() + { + RHI::FactoryManagerBus::Broadcast(&RHI::FactoryManagerRequest::UnregisterFactory, this); + } + + Name SystemComponent::GetName() + { + return m_apiName; + } + + RHI::APIType SystemComponent::GetType() + { + return Null::RHIType; + } + + RHI::APIPriority SystemComponent::GetDefaultPriority() + { + return RHI::APILowPriority; + } + + RHI::PhysicalDeviceList SystemComponent::EnumeratePhysicalDevices() + { + return PhysicalDevice::Enumerate(); + } + + RHI::Ptr SystemComponent::CreateSwapChain() + { + return SwapChain::Create(); + } + + RHI::Ptr SystemComponent::CreateFence() + { + return nullptr; + } + + RHI::Ptr SystemComponent::CreateBuffer() + { + return Buffer::Create(); + } + + RHI::Ptr SystemComponent::CreateBufferView() + { + return BufferView::Create(); + } + + RHI::Ptr SystemComponent::CreateBufferPool() + { + return BufferPool::Create(); + } + + RHI::Ptr SystemComponent::CreateDevice() + { + return Device::Create(); + } + + RHI::Ptr SystemComponent::CreateImage() + { + return Image::Create(); + } + + RHI::Ptr SystemComponent::CreateImageView() + { + return ImageView::Create(); + } + + RHI::Ptr SystemComponent::CreateImagePool() + { + return ImagePool::Create(); + } + + RHI::Ptr SystemComponent::CreateStreamingImagePool() + { + return StreamingImagePool::Create(); + } + + RHI::Ptr SystemComponent::CreateShaderResourceGroup() + { + return ShaderResourceGroup::Create(); + } + + RHI::Ptr SystemComponent::CreateShaderResourceGroupPool() + { + return ShaderResourceGroupPool::Create(); + } + + RHI::Ptr SystemComponent::CreatePipelineLibrary() + { + return PipelineLibrary::Create(); + } + + RHI::Ptr SystemComponent::CreatePipelineState() + { + return PipelineState::Create(); + } + + RHI::Ptr SystemComponent::CreateFrameGraphCompiler() + { + return FrameGraphCompiler::Create(); + } + + RHI::Ptr SystemComponent::CreateFrameGraphExecuter() + { + return FrameGraphExecuter::Create(); + } + + RHI::Ptr SystemComponent::CreateTransientAttachmentPool() + { + return TransientAttachmentPool::Create(); + } + + RHI::Ptr SystemComponent::CreateScope() + { + return Scope::Create(); + } + + RHI::Ptr SystemComponent::CreateQueryPool() + { + return QueryPool::Create(); + } + + RHI::Ptr SystemComponent::CreateQuery() + { + return Query::Create(); + } + + RHI::Ptr SystemComponent::CreateIndirectBufferSignature() + { + return RHI::Ptr(); + } + + RHI::Ptr SystemComponent::CreateIndirectBufferWriter() + { + return RHI::Ptr(); + } + RHI::Ptr SystemComponent::CreateRayTracingBufferPools() + { + return RayTracingBufferPools::Create(); + } + + RHI::Ptr SystemComponent::CreateRayTracingBlas() + { + return RayTracingBlas::Create(); + } + + RHI::Ptr SystemComponent::CreateRayTracingTlas() + { + return RayTracingTlas::Create(); + } + + RHI::Ptr SystemComponent::CreateRayTracingPipelineState() + { + return RayTracingPipelineState::Create(); + } + + RHI::Ptr SystemComponent::CreateRayTracingShaderTable() + { + return RayTracingShaderTable::Create(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.h b/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.h new file mode 100644 index 0000000000..205326c0ac --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.h @@ -0,0 +1,85 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + class SystemComponent + : public AZ::Component + , public RHI::Factory + { + public: + AZ_COMPONENT(SystemComponent, "{0A6A246A-CB5B-4F59-99D5-629B7F1C44DD}") + + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetRequiredServices(ComponentDescriptor::DependencyArrayType& required); + static void Reflect(AZ::ReflectContext* context); + + SystemComponent() = default; + virtual ~SystemComponent() = default; + + ////////////////////////////////////////////////////////////////////////// + // AZ::Component + void Activate() override; + void Deactivate() override; + ////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // RHI::Factory + Name GetName() override; + RHI::APIType GetType() override; + RHI::APIPriority GetDefaultPriority() override; + uint32_t GetAPIUniqueIndex() const override { return APIUniqueIndex; } + RHI::PhysicalDeviceList EnumeratePhysicalDevices() override; + RHI::Ptr CreateBuffer() override; + RHI::Ptr CreateBufferPool() override; + RHI::Ptr CreateBufferView() override; + RHI::Ptr CreateDevice() override; + RHI::Ptr CreateFence() override; + RHI::Ptr CreateFrameGraphCompiler() override; + RHI::Ptr CreateFrameGraphExecuter() override; + RHI::Ptr CreateImage() override; + RHI::Ptr CreateImagePool() override; + RHI::Ptr CreateImageView() override; + RHI::Ptr CreateStreamingImagePool() override; + RHI::Ptr CreatePipelineLibrary() override; + RHI::Ptr CreatePipelineState() override; + RHI::Ptr CreateScope() override; + RHI::Ptr CreateShaderResourceGroup() override; + RHI::Ptr CreateShaderResourceGroupPool() override; + RHI::Ptr CreateSwapChain() override; + RHI::Ptr CreateTransientAttachmentPool() override; + RHI::Ptr CreateQueryPool() override; + RHI::Ptr CreateQuery() override; + RHI::Ptr CreateIndirectBufferSignature() override; + RHI::Ptr CreateIndirectBufferWriter() override; + RHI::Ptr CreateRayTracingBufferPools() override; + RHI::Ptr CreateRayTracingBlas() override; + RHI::Ptr CreateRayTracingTlas() override; + RHI::Ptr CreateRayTracingPipelineState() override; + RHI::Ptr CreateRayTracingShaderTable() override; + /////////////////////////////////////////////////////////////////// + + private: + RHI::Ptr m_device; + + const Name m_apiName{APINameString}; + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/TransientAttachmentPool.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/TransientAttachmentPool.cpp new file mode 100644 index 0000000000..49f146a626 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/TransientAttachmentPool.cpp @@ -0,0 +1,31 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Null_precompiled.h" + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace Null + { + RHI::Ptr TransientAttachmentPool::Create() + { + return aznew TransientAttachmentPool(); + } + } +} + diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/TransientAttachmentPool.h b/Gems/Atom/RHI/Null/Code/Source/RHI/TransientAttachmentPool.h new file mode 100644 index 0000000000..9bb9ede237 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/TransientAttachmentPool.h @@ -0,0 +1,46 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class TransientAttachmentPool final + : public RHI::TransientAttachmentPool + { + using Base = RHI::TransientAttachmentPool; + public: + AZ_CLASS_ALLOCATOR(TransientAttachmentPool, AZ::SystemAllocator, 0); + AZ_RTTI(TransientAttachmentPool, "{37FCCF38-52D0-46E4-B4D1-1CB2B063422D}", Base); + + static RHI::Ptr Create(); + + private: + TransientAttachmentPool() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::TransientAttachmentPool + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] const RHI::TransientAttachmentPoolDescriptor& descriptor) override { return RHI::ResultCode::Success;} + void BeginInternal([[maybe_unused]] const RHI::TransientAttachmentPoolCompileFlags flags, [[maybe_unused]] const RHI::TransientAttachmentStatistics::MemoryUsage* memoryHint) override {} + void EndInternal() override {} + RHI::Image* ActivateImage([[maybe_unused]] const RHI::TransientImageDescriptor& descriptor) override { return nullptr;} + RHI::Buffer* ActivateBuffer([[maybe_unused]] const RHI::TransientBufferDescriptor& descriptor) override { return nullptr;} + void DeactivateBuffer([[maybe_unused]] const RHI::AttachmentId& attachmentId) override {} + void DeactivateImage([[maybe_unused]] const RHI::AttachmentId& attachmentId) override {} + void ShutdownInternal() override {} + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_builders_common_files.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_builders_common_files.cmake new file mode 100644 index 0000000000..2f92897848 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_builders_common_files.cmake @@ -0,0 +1,17 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h + Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.cpp + Source/RHI.Builders/ShaderPlatformInterface.h + Source/RHI.Builders/ShaderPlatformInterface.cpp +) diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_builders_shared_files.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_builders_shared_files.cmake new file mode 100644 index 0000000000..300a6c040a --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_builders_shared_files.cmake @@ -0,0 +1,13 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates +# or its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root +# of this distribution (the "License"). All use of this software is governed by +# the License, or, if provided, by the license below or the license +# accompanying this file. Do not remove or modify any license notices. This +# file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF +# ANY KIND, either express or implied. +# + +set(FILES Source/RHI.Builders/BuilderModule.cpp) diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake new file mode 100644 index 0000000000..f0f7fd03de --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake @@ -0,0 +1,15 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + Source/Atom_RHI_Null_precompiled.cpp + Source/Atom_RHI_Null_precompiled.h +) diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_files.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_files.cmake new file mode 100644 index 0000000000..e5c2c32660 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_files.cmake @@ -0,0 +1,70 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + Source/RHI/AliasedHeap.cpp + Source/RHI/AliasedHeap.h + Source/RHI/Buffer.cpp + Source/RHI/Buffer.h + Source/RHI/BufferView.cpp + Source/RHI/BufferView.h + Source/RHI/BufferPool.cpp + Source/RHI/BufferPool.h + Source/RHI/CommandList.cpp + Source/RHI/CommandList.h + Source/RHI/CommandQueue.cpp + Source/RHI/CommandQueue.h + Source/RHI/Device.cpp + Source/RHI/Device.h + Source/RHI/FrameGraphCompiler.cpp + Source/RHI/FrameGraphCompiler.h + Source/RHI/FrameGraphExecuter.cpp + Source/RHI/FrameGraphExecuter.h + Source/RHI/Image.cpp + Source/RHI/Image.h + Source/RHI/ImagePool.cpp + Source/RHI/ImagePool.h + Source/RHI/ImageView.cpp + Source/RHI/ImageView.h + Source/RHI/PhysicalDevice.cpp + Source/RHI/PhysicalDevice.h + Source/RHI/PipelineState.cpp + Source/RHI/PipelineState.h + Source/RHI/PipelineLibrary.cpp + Source/RHI/PipelineLibrary.h + Source/RHI/Query.cpp + Source/RHI/Query.h + Source/RHI/QueryPool.cpp + Source/RHI/QueryPool.h + Source/RHI/Scope.cpp + Source/RHI/Scope.h + Source/RHI/ShaderResourceGroup.cpp + Source/RHI/ShaderResourceGroup.h + Source/RHI/ShaderResourceGroupPool.cpp + Source/RHI/ShaderResourceGroupPool.h + Source/RHI/StreamingImagePool.cpp + Source/RHI/StreamingImagePool.h + Source/RHI/SwapChain.cpp + Source/RHI/SwapChain.h + Source/RHI/SystemComponent.cpp + Source/RHI/SystemComponent.h + Source/RHI/TransientAttachmentPool.cpp + Source/RHI/TransientAttachmentPool.h + Source/RHI/RayTracingBufferPools.h + Source/RHI/RayTracingBlas.cpp + Source/RHI/RayTracingBlas.h + Source/RHI/RayTracingTlas.cpp + Source/RHI/RayTracingTlas.h + Source/RHI/RayTracingPipelineState.cpp + Source/RHI/RayTracingPipelineState.h + Source/RHI/RayTracingShaderTable.cpp + Source/RHI/RayTracingShaderTable.h +) diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_shared_files.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_shared_files.cmake new file mode 100644 index 0000000000..a8a3b455bb --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_shared_files.cmake @@ -0,0 +1,14 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + Source/RHI/Module.cpp +) diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_reflect_common_files.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_reflect_common_files.cmake new file mode 100644 index 0000000000..487e1a1e3a --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_reflect_common_files.cmake @@ -0,0 +1,20 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + Include/Atom/RHI.Reflect/Null/Base.h + Include/Atom/RHI.Reflect/Null/PipelineLayoutDescriptor.h + Source/RHI.Reflect/PipelineLayoutDescriptor.cpp + Include/Atom/RHI.Reflect/Null/ReflectSystemComponent.h + Source/RHI.Reflect/ReflectSystemComponent.cpp + Include/Atom/RHI.Reflect/Null/ShaderStageFunction.h + Source/RHI.Reflect/ShaderStageFunction.cpp +) diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_stub_module.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_stub_module.cmake new file mode 100644 index 0000000000..f6efae5251 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_stub_module.cmake @@ -0,0 +1,14 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp +) diff --git a/Gems/Atom/RHI/Null/gem.json b/Gems/Atom/RHI/Null/gem.json new file mode 100644 index 0000000000..7327b6af77 --- /dev/null +++ b/Gems/Atom/RHI/Null/gem.json @@ -0,0 +1,26 @@ +{ + "gem_name": "Atom_RHI_Null", + "GemFormatVersion": 4, + "Uuid": "1f64c07a7d2f4722a3969fcf3be34d30", + "Name": "Atom_RHI_Null", + "DisplayName": "Atom RHI.Null", + "Version": "0.1.0", + "Summary": "The Null backend for the Atom Render Hardware Interface", + "Tags": ["Atom", "RHI", "Null"], + "LinkType": "Dynamic", + "IconPath": "preview.png", + "Modules": [ + { + "Name": "Private", + "Type": "GameModule" + }, + { + "Name": "Reflect", + "Type": "StaticLib" + }, + { + "Name": "Builders", + "Type": "EditorModule" + } + ] +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/Base.h b/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/Base.h index 231bbdd9a7..a7b2318a9e 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/Base.h +++ b/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/Base.h @@ -22,7 +22,7 @@ namespace AZ static const RHI::APIType RHIType(APINameString); //! For details go to AZ::RHI::Factory::GetAPIUniqueIndex - static constexpr uint32_t APIUniqueIndex = 1; + static constexpr uint32_t APIUniqueIndex = static_cast(RHI::APIIndex::Vulkan); } } diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderStageFunction.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderStageFunction.cpp index a6e0fc610d..077d2521de 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderStageFunction.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderStageFunction.cpp @@ -73,7 +73,6 @@ namespace AZ return RHI::ResultCode::InvalidArgument; } - // [GFX_TODO][bethelz]: Move byte code hashing from RPI branch here. HashValue64 hash = HashValue64{ 0 }; for (const ShaderByteCode& byteCode : m_byteCodes) { @@ -83,7 +82,6 @@ namespace AZ } } SetHash(hash); - //![GFX_TODO] return RHI::ResultCode::Success; } diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLayout.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLayout.h index f6cac0a587..8af703fefb 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLayout.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLayout.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include diff --git a/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/Math.azsli b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/Math.azsli index b4fd6fca2d..077a2676d2 100644 --- a/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/Math.azsli +++ b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/Math.azsli @@ -201,3 +201,27 @@ float PerspectiveDepthToLinear(float clipDepth, float3 coefficients) { return coefficients.x * (coefficients.z / (coefficients.y * clipDepth + coefficients.z) - 1.); } + +// ---------- Random number generators ----------- +// George Marsaglia's Xorshift RNGs +// https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf +uint Xorshift(in uint value) +{ + value ^= value << 13; + value ^= value >> 17; + value ^= value << 5; + return value; +} + +uint NextRandomUint(inout uint seed) +{ + seed = Xorshift(seed); + return seed; +} + +// Returns a random float with range [0, 1) +float NextRandomFloatUniform(inout uint seed) +{ + seed = Xorshift(seed); + return (float)seed / 4294967295.0f; +} \ No newline at end of file diff --git a/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/TangentSpace.azsli b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/TangentSpace.azsli index b6c22edeb3..13e3c652db 100644 --- a/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/TangentSpace.azsli +++ b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/TangentSpace.azsli @@ -21,7 +21,7 @@ float3 TangentSpaceToWorld(float3 vectorTS, float3 normalWS, float3 tangentWS, f } //! Utility function to convert vector from world space to tangent space -float3 WorldToTangent(float3 vectorWS, float3 normalWS, float3 tangentWS, float3 bitangentWS) +float3 WorldSpaceToTangent(float3 vectorWS, float3 normalWS, float3 tangentWS, float3 bitangentWS) { float a = dot(tangentWS, vectorWS); float b = dot(bitangentWS, vectorWS); diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h index f299de01a5..c082e20332 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h @@ -255,6 +255,7 @@ namespace AZ AZStd::concurrency_checker m_cullDataConcurrencyCheck; + AZStd::mutex m_mutex; }; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h index 87b9b59ebc..3393f6af5c 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h @@ -60,9 +60,15 @@ namespace AZ }; // Required initialization functions + //! Initialize this context with the input shader/shader asset with only one shader variant + //! DynamicDrawContext initialized with this function can't use other variant later (AddShaderVariant and SetShaderVariant). + void InitShaderWithVariant(Data::Asset shaderAsset, const ShaderOptionList* optionAndValues); + void InitShaderWithVariant(Data::Instance shader, const ShaderOptionList* optionAndValues); + //! Initialize this context with the input shader/shader asset. - void InitShader(Data::Asset shaderAsset, const ShaderOptionList* optionAndValues = nullptr); - void InitShader(Data::Instance shader, const ShaderOptionList* optionAndValues = nullptr); + //! DynamicDrawContext initialized with this function may use shader variant later (AddShaderVariant and SetShaderVariant). + void InitShader(Data::Asset shaderAsset); + void InitShader(Data::Instance shader); // Optional initialization functions //! Initialize input stream layout with vertex channel information @@ -87,6 +93,11 @@ namespace AZ //! Return if some draw state options change are enabled. bool HasDrawStateOptions(DrawStateOptions options); + //! Tell DynamicDrawContext it will use the shader variant specified by ShaderOptionList. + //! The returned ShaderVariantId can be used via SetShaderVariant() before making any draw calls. + //! Note, if the DynamicDrawContext was initialized with default shader variant, it won't return a valid variant Id. + ShaderVariantId UseShaderVariant(const ShaderOptionList& optionAndValues); + // States which can be changed for this DyanimcDrawContext //! Set DepthState if DrawStateOptions::DepthState option is enabled @@ -99,6 +110,9 @@ namespace AZ void SetTarget0BlendState(RHI::TargetBlendState blendState); //! Set PrimitiveType if DrawStateOptions::PrimitiveType option is enabled void SetPrimitiveType(RHI::PrimitiveTopology topology); + //! Set the shader variant as the current variant which is used for any following draw calls. + //! Note, SetShaderVariant() needs to be called before NewDrawSrg() if a draw srg is used in following draw calls. + void SetShaderVariant(ShaderVariantId shaderVariantId); //! Setup scissor for following draws which are added to this DynamicDrawContext //! Note: it won't effect any draws submitted out of this DynamicDrawContext @@ -138,6 +152,9 @@ namespace AZ //! return whether the vertex data size is valid bool IsVertexSizeValid(uint32_t vertexSize); + + //! Get the shader which is associated with this DynamicDrawContext + const Data::Instance& GetShader() const; private: DynamicDrawContext() = default; @@ -213,6 +230,12 @@ namespace AZ AZStd::vector m_cachedDrawItems; + // Flags if this DynamicDrawContext can change shader variants + bool m_supportShaderVariants = false; + ShaderVariantId m_currentShaderVariantId; + + Data::Instance m_shader; + // This variable is used to see if the context is initialized. // You can only add draw calls when the context is initialized. bool m_initialized = false; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h index b9dad098c7..ae249a5f45 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h @@ -294,7 +294,7 @@ namespace AZ // --- Template related setup --- // Process a PassConnection to connect two PassAttachmentBindings - void ProcessConnection(const PassConnection& connection); + void ProcessConnection(const PassConnection& connection, uint32_t slotTypeMask = 0xFFFFFFFF); // --- Validation and Error Functions --- @@ -435,12 +435,15 @@ namespace AZ // --- Template related setup --- - // Generates slots from source PassTemplate - void CreateSlotsFromTemplate(); + // Generates bindings from source PassTemplate + void CreateBindingsFromTemplate(); // Generates attachments from source PassTemplate void CreateAttachmentsFromTemplate(); + // Generates attachments from source PassRequest + void CreateAttachmentsFromRequest(); + // Uses FrameGraphAttachmentInterface to create transient attachments for the pass void CreateTransientAttachments(RHI::FrameGraphAttachmentInterface attachmentDatabase); @@ -448,6 +451,10 @@ namespace AZ template Ptr CreateAttachmentFromDesc(const AttachmentDescType& desc); + // Overrides an existing attachment if matching name is found, otherwise creates and adds new attachment + template + void OverrideOrAddAttachment(const AttachmentDescType& desc); + // Updates a binding on this pass using the binding it is connected to. // This sets the binding's attachment pointer to the connected binding's attachment void UpdateConnectedBinding(PassAttachmentBinding& binding); @@ -461,9 +468,15 @@ namespace AZ // Sets up inputs from the list of PassConnections in PassRequest void SetupInputsFromRequest(); + // Sets up outputs from the list of PassConnections in PassRequest + void SetupOutputsFromRequest(); + // Sets up explicitly declared dependencies on other passes declared in the PassRequest void SetupPassDependencies(); + // Sets up inputs from the list of PassConnections in PassTemplate + void SetupInputsFromTemplate(); + // Sets up outputs from the list of PassConnections in PassTemplate void SetupOutputsFromTemplate(); diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Specific/SelectorPass.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Specific/SelectorPass.h new file mode 100644 index 0000000000..fe0ce231eb --- /dev/null +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Specific/SelectorPass.h @@ -0,0 +1,59 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include + +namespace AZ +{ + namespace RPI + { + //! A pass provide the ability to pass through input attachments to output attachments + //! For example, it can choose one of the input attachments as output atachments. + class SelectorPass final + : public Pass + { + public: + AZ_RTTI(SelectorPass, "{A6BCB7A5-EF09-4863-BC8C-C84655067984}", Pass); + AZ_CLASS_ALLOCATOR(SelectorPass, SystemAllocator, 0); + + static Ptr Create(const PassDescriptor& descriptor); + ~SelectorPass() = default; + + //! Connect the attachment from the inputSlot to the specified outputSlot + void Connect(const AZ::Name& inputSlot, const AZ::Name& outputSlot); + void Connect(uint32_t inputSlotIndex, uint32_t outputSlotIndex); + + protected: + SelectorPass(const PassDescriptor& descriptor); + + // Pass behavior overrides + void BuildAttachmentsInternal() final; + + // the input slot index each output slot connect to + AZStd::vector m_connections; + }; + + } // namespace RPI +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/PipelineState.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/PipelineState.h index ad3651d1be..f0fa39d20f 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/PipelineState.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/PipelineState.h @@ -73,6 +73,9 @@ namespace AZ const RHI::PipelineStateDescriptorForDraw& ConstDescriptor() const; + //! Get the shader which is associated with this PipelineState + const Data::Instance& GetShader() const; + //! Setup the shader variant fallback key to a shader resource group if the shader variant is not ready //! Return true if the srg was modified. bool UpdateSrgVariantFallback(Data::Instance& srg) const; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/ShaderResourceGroup.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/ShaderResourceGroup.h index 2df62b7f88..632cc7b4d7 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/ShaderResourceGroup.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/ShaderResourceGroup.h @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -93,116 +94,134 @@ namespace AZ bool HasShaderVariantKeyFallbackEntry() const; /// Sets one RPI image for the given shader input index. - bool SetImage(RHI::ShaderInputImageIndex inputIndex, const Data::Instance& image); - bool SetImage(RHI::ShaderInputImageIndex inputIndex, const Data::Instance& image, uint32_t arrayIndex); + bool SetImage(RHI::ShaderInputNameIndex& inputIndex, const Data::Instance& image, uint32_t arrayIndex = 0); + bool SetImage(RHI::ShaderInputImageIndex inputIndex, const Data::Instance& image, uint32_t arrayIndex = 0); /// Sets multiple RPI images for the given shader input index. - bool SetImageArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view> images); - bool SetImageArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view> images, uint32_t arrayIndex); + bool SetImageArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view> images, uint32_t arrayIndex = 0); + bool SetImageArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view> images, uint32_t arrayIndex = 0); /// Returns a single RPI image associated with the image shader input index and array offset. - const Data::Instance& GetImage(RHI::ShaderInputImageIndex inputIndex) const; - const Data::Instance& GetImage(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex) const; + const Data::Instance& GetImage(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex = 0) const; + const Data::Instance& GetImage(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex = 0) const; /// Returns an array of RPI images associated with the image shader input index. + AZStd::array_view> GetImageArray(RHI::ShaderInputNameIndex& inputIndex) const; AZStd::array_view> GetImageArray(RHI::ShaderInputImageIndex inputIndex) const; ////////////////////////////////////////////////////////////////////////// // Methods for assignment / access of RPI Buffer types. /// Sets one RPI buffer for the given shader input index. - bool SetBuffer(RHI::ShaderInputBufferIndex inputIndex, const Data::Instance& buffer); - bool SetBuffer(RHI::ShaderInputBufferIndex inputIndex, const Data::Instance& buffer, uint32_t arrayIndex); + bool SetBuffer(RHI::ShaderInputNameIndex& inputIndex, const Data::Instance& buffer, uint32_t arrayIndex = 0); + bool SetBuffer(RHI::ShaderInputBufferIndex inputIndex, const Data::Instance& buffer, uint32_t arrayIndex = 0); /// Sets multiple RPI buffers for the given shader input index. - bool SetBufferArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view> buffers); - bool SetBufferArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view> buffers, uint32_t arrayIndex); + bool SetBufferArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view> buffers, uint32_t arrayIndex = 0); + bool SetBufferArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view> buffers, uint32_t arrayIndex = 0); /// Returns a single RPI buffer associated with the buffer shader input index and array offset. - const Data::Instance& GetBuffer(RHI::ShaderInputBufferIndex inputIndex) const; - const Data::Instance& GetBuffer(RHI::ShaderInputBufferIndex inputIndex, uint32_t arrayIndex) const; + const Data::Instance& GetBuffer(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex = 0) const; + const Data::Instance& GetBuffer(RHI::ShaderInputBufferIndex inputIndex, uint32_t arrayIndex = 0) const; /// Returns an array of RPI buffers associated with the buffer shader input index. + AZStd::array_view> GetBufferArray(RHI::ShaderInputNameIndex& inputIndex) const; AZStd::array_view> GetBufferArray(RHI::ShaderInputBufferIndex inputIndex) const; ////////////////////////////////////////////////////////////////////////// // Methods for assignment / access of RHI Image types. /// Sets one image view for the given shader input index. - bool SetImageView(RHI::ShaderInputImageIndex inputIndex, const RHI::ImageView* imageView); - bool SetImageView(RHI::ShaderInputImageIndex inputIndex, const RHI::ImageView* imageView, uint32_t arrayIndex); + bool SetImageView(RHI::ShaderInputNameIndex& inputIndex, const RHI::ImageView* imageView, uint32_t arrayIndex = 0); + bool SetImageView(RHI::ShaderInputImageIndex inputIndex, const RHI::ImageView* imageView, uint32_t arrayIndex = 0); /// Sets an array of image view for the given shader input index. - bool SetImageViewArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view imageViews); - bool SetImageViewArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex); + bool SetImageViewArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex = 0); + bool SetImageViewArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex = 0); /// Returns a single image view associated with the image shader input index and array offset. - const RHI::ConstPtr& GetImageView(RHI::ShaderInputImageIndex inputIndex) const; - const RHI::ConstPtr& GetImageView(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex) const; + const RHI::ConstPtr& GetImageView(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex = 0) const; + const RHI::ConstPtr& GetImageView(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex = 0) const; /// Returns an array of image views associated with the given image shader input index. + AZStd::array_view> GetImageViewArray(RHI::ShaderInputNameIndex& inputIndex) const; AZStd::array_view> GetImageViewArray(RHI::ShaderInputImageIndex inputIndex) const; ////////////////////////////////////////////////////////////////////////// // Methods for assignment / access of RHI Buffer types. /// Sets one buffer view for the given shader input index. - bool SetBufferView(RHI::ShaderInputBufferIndex inputIndex, const RHI::BufferView* bufferView); - bool SetBufferView(RHI::ShaderInputBufferIndex inputIndex, const RHI::BufferView* bufferView, uint32_t arrayIndex); + bool SetBufferView(RHI::ShaderInputNameIndex& inputIndex, const RHI::BufferView* bufferView, uint32_t arrayIndex = 0); + bool SetBufferView(RHI::ShaderInputBufferIndex inputIndex, const RHI::BufferView* bufferView, uint32_t arrayIndex = 0); /// Sets an array of buffer view for the given shader input index. - bool SetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews); - bool SetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex); + bool SetBufferViewArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex = 0); + bool SetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex = 0); /// Returns a single buffer view associated with the buffer shader input index and array offset. - const RHI::ConstPtr& GetBufferView(RHI::ShaderInputBufferIndex inputIndex) const; - const RHI::ConstPtr& GetBufferView(RHI::ShaderInputBufferIndex inputIndex, uint32_t arrayIndex) const; + const RHI::ConstPtr& GetBufferView(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex = 0) const; + const RHI::ConstPtr& GetBufferView(RHI::ShaderInputBufferIndex inputIndex, uint32_t arrayIndex = 0) const; /// Returns an array of buffer views associated with the given buffer shader input index. + AZStd::array_view> GetBufferViewArray(RHI::ShaderInputNameIndex& inputIndex) const; AZStd::array_view> GetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex) const; ////////////////////////////////////////////////////////////////////////// // Methods for assignment / access of RHI Sampler types. /// Sets one sampler for the given shader input index, using the bindingIndex as the key. - bool SetSampler(RHI::ShaderInputSamplerIndex inputIndex, const RHI::SamplerState& sampler); - bool SetSampler(RHI::ShaderInputSamplerIndex inputIndex, const RHI::SamplerState& sampler, uint32_t arrayIndex); + bool SetSampler(RHI::ShaderInputNameIndex& inputIndex, const RHI::SamplerState& sampler, uint32_t arrayIndex = 0); + bool SetSampler(RHI::ShaderInputSamplerIndex inputIndex, const RHI::SamplerState& sampler, uint32_t arrayIndex = 0); /// Sets an array of samplers for the given shader input index. - bool SetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers); - bool SetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers, uint32_t arrayIndex); + bool SetSamplerArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view samplers, uint32_t arrayIndex = 0); + bool SetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers, uint32_t arrayIndex = 0); /// Returns a single sampler associated with the sampler shader input index and array offset. + const RHI::SamplerState& GetSampler(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex) const; const RHI::SamplerState& GetSampler(RHI::ShaderInputSamplerIndex inputIndex, uint32_t arrayIndex) const; /// Returns an array of samplers associated with the sampler shader input index. + AZStd::array_view GetSamplerArray(RHI::ShaderInputNameIndex& inputIndex) const; AZStd::array_view GetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex) const; ////////////////////////////////////////////////////////////////////////// // Methods for assignment / access SRG constants. /// Assigns constant data for the given constant shader input index. + bool SetConstantRaw(RHI::ShaderInputNameIndex& inputIndex, const void* bytes, uint32_t byteCount); bool SetConstantRaw(RHI::ShaderInputConstantIndex inputIndex, const void* bytes, uint32_t byteCount); + bool SetConstantRaw(RHI::ShaderInputNameIndex& inputIndex, const void* bytes, uint32_t byteOffset, uint32_t byteCount); bool SetConstantRaw(RHI::ShaderInputConstantIndex inputIndex, const void* bytes, uint32_t byteOffset, uint32_t byteCount); /// Assigns a value of type T to the constant shader input. template + bool SetConstant(RHI::ShaderInputNameIndex& inputIndex, const T& value); + template bool SetConstant(RHI::ShaderInputConstantIndex inputIndex, const T& value); /// Assigns the specified number of rows from a Matrix template + bool SetConstantMatrixRows(RHI::ShaderInputNameIndex& inputIndex, const T& value, uint32_t rowCount); + template bool SetConstantMatrixRows(RHI::ShaderInputConstantIndex inputIndex, const T& value, uint32_t rowCount); /// Assigns a value of type T to the constant shader input, at an array offset. template + bool SetConstant(RHI::ShaderInputNameIndex& inputIndex, const T& value, uint32_t arrayIndex); + template bool SetConstant(RHI::ShaderInputConstantIndex inputIndex, const T& value, uint32_t arrayIndex); /// Assigns an array of type T to the constant shader input. template + bool SetConstantArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view values); + template bool SetConstantArray(RHI::ShaderInputConstantIndex inputIndex, AZStd::array_view values); /// Assigns an array of type T to the constant shader input. template + bool SetConstantArray(RHI::ShaderInputNameIndex& inputIndex, const AZStd::array& values); + template bool SetConstantArray(RHI::ShaderInputConstantIndex inputIndex, const AZStd::array& values); /// Assigns an array of shader data mappings of type T @@ -219,6 +238,8 @@ namespace AZ * If the strides do not match, an empty array is returned. */ template + AZStd::array_view GetConstantArray(RHI::ShaderInputNameIndex& inputIndex) const; + template AZStd::array_view GetConstantArray(RHI::ShaderInputConstantIndex inputIndex) const; /** @@ -226,6 +247,8 @@ namespace AZ * must match the size of T exactly. Otherwise, an empty instance is returned. */ template + T GetConstant(RHI::ShaderInputNameIndex& inputIndex) const; + template T GetConstant(RHI::ShaderInputConstantIndex inputIndex) const; /** @@ -234,9 +257,12 @@ namespace AZ * array of type T. Otherwise, an empty instance is returned. */ template + T GetConstant(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex) const; + template T GetConstant(RHI::ShaderInputConstantIndex inputIndex, uint32_t arrayIndex) const; /// Returns constant data for the given shader input index as an array of bytes. + AZStd::array_view GetConstantRaw(RHI::ShaderInputNameIndex& inputIndex) const; AZStd::array_view GetConstantRaw(RHI::ShaderInputConstantIndex inputIndex) const; private: @@ -301,41 +327,112 @@ namespace AZ { return m_data.SetConstant(inputIndex, value); } - + + template + bool ShaderResourceGroup::SetConstant(RHI::ShaderInputNameIndex& inputIndex, const T& value) + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return SetConstant(inputIndex.GetConstantIndex(), value); + } + return false; + } + template bool ShaderResourceGroup::SetConstantMatrixRows(RHI::ShaderInputConstantIndex inputIndex, const T& value, uint32_t rowCount) { return m_data.SetConstantMatrixRows(inputIndex, value, rowCount); } + template + bool ShaderResourceGroup::SetConstantMatrixRows(RHI::ShaderInputNameIndex& inputIndex, const T& value, uint32_t rowCount) + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return SetConstantMatrixRows(inputIndex.GetConstantIndex(), value, rowCount); + } + return false; + } + template bool ShaderResourceGroup::SetConstant(RHI::ShaderInputConstantIndex inputIndex, const T& value, uint32_t arrayIndex) { return m_data.SetConstant(inputIndex, value, arrayIndex); } + template + bool ShaderResourceGroup::SetConstant(RHI::ShaderInputNameIndex& inputIndex, const T& value, uint32_t arrayIndex) + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return SetConstant(inputIndex.GetConstantIndex(), value, arrayIndex); + } + return false; + } + template bool ShaderResourceGroup::SetConstantArray(RHI::ShaderInputConstantIndex inputIndex, AZStd::array_view values) { return m_data.SetConstantArray(inputIndex, values); } + template + bool ShaderResourceGroup::SetConstantArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view values) + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return SetConstantArray(inputIndex.GetConstantIndex(), values); + } + return false; + } + template bool ShaderResourceGroup::SetConstantArray(RHI::ShaderInputConstantIndex inputIndex, const AZStd::array& values) { return SetConstantArray(inputIndex, AZStd::array_view(values)); } + template + bool ShaderResourceGroup::SetConstantArray(RHI::ShaderInputNameIndex& inputIndex, const AZStd::array& values) + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return SetConstantArray(inputIndex.GetConstantIndex(), AZStd::array_view(values)); + } + return false; + } + template AZStd::array_view ShaderResourceGroup::GetConstantArray(RHI::ShaderInputConstantIndex inputIndex) const { return m_data.GetConstantArray(inputIndex); } + template + AZStd::array_view ShaderResourceGroup::GetConstantArray(RHI::ShaderInputNameIndex& inputIndex) const + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return GetConstantArray(inputIndex.GetConstantIndex()); + } + return false; + } + template T ShaderResourceGroup::GetConstant(RHI::ShaderInputConstantIndex inputIndex) const { return m_data.GetConstant(inputIndex); } + + template + T ShaderResourceGroup::GetConstant(RHI::ShaderInputNameIndex& inputIndex) const + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return GetConstant(inputIndex.GetConstantIndex()); + } + return false; + } + } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h index 12c6c092c9..ba652a2b94 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h @@ -139,17 +139,16 @@ namespace AZ PassesByDrawList* m_passesByDrawList = nullptr; // Indies of constants in default view srg - RHI::ShaderInputConstantIndex m_viewProjectionMatrixConstantIndex; - RHI::ShaderInputConstantIndex m_worldPositionConstantIndex; - RHI::ShaderInputConstantIndex m_viewMatrixConstantIndex; - RHI::ShaderInputConstantIndex m_projectionMatrixConstantIndex; - RHI::ShaderInputConstantIndex m_viewMatrixInverseConstantIndex; - RHI::ShaderInputConstantIndex m_projectionMatrixInverseConstantIndex; - RHI::ShaderInputConstantIndex m_zConstantsConstantIndex; - RHI::ShaderInputConstantIndex m_clipToWorldMatrixConstantIndex; - RHI::ShaderInputConstantIndex m_worldToClipPrevMatrixConstantIndex; - RHI::ShaderInputConstantIndex m_unprojectionConstantsIndex; - + RHI::ShaderInputNameIndex m_viewProjectionMatrixConstantIndex = "m_viewProjectionMatrix"; + RHI::ShaderInputNameIndex m_worldPositionConstantIndex = "m_worldPosition"; + RHI::ShaderInputNameIndex m_viewMatrixConstantIndex = "m_viewMatrix"; + RHI::ShaderInputNameIndex m_viewMatrixInverseConstantIndex = "m_viewMatrixInverse"; + RHI::ShaderInputNameIndex m_projectionMatrixConstantIndex = "m_projectionMatrix"; + RHI::ShaderInputNameIndex m_projectionMatrixInverseConstantIndex = "m_projectionMatrixInverse"; + RHI::ShaderInputNameIndex m_clipToWorldMatrixConstantIndex = "m_viewProjectionInverseMatrix"; + RHI::ShaderInputNameIndex m_worldToClipPrevMatrixConstantIndex = "m_viewProjectionPrevMatrix"; + RHI::ShaderInputNameIndex m_zConstantsConstantIndex = "m_nearZ_farZ_farZTimesNearZ_farZMinusNearZ"; + RHI::ShaderInputNameIndex m_unprojectionConstantsIndex = "m_unprojectionConstants"; // The context containing draw lists associated with the view. RHI::DrawListContext m_drawListContext; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h index 3830080a96..24922fbe98 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h @@ -93,6 +93,10 @@ namespace AZ //! Notifies consumers when the projection matrix has changed. void ConnectProjectionMatrixChangedHandler(MatrixChangedEvent::Handler& handler); + using SceneChangedEvent = AZ::Event; + //! Notifies consumers when the render scene has changed. + void ConnectSceneChangedHandler(SceneChangedEvent::Handler& handler); + // ViewportRequestBus interface //! Gets the current camera's view matrix. const AZ::Matrix4x4& GetCameraViewMatrix() const override; @@ -120,6 +124,7 @@ namespace AZ SizeChangedEvent m_sizeChangedEvent; MatrixChangedEvent m_viewMatrixChangedEvent; MatrixChangedEvent m_projectionMatrixChangedEvent; + SceneChangedEvent m_sceneChangedEvent; ViewportContextManager* m_manager; RenderPipelinePtr m_currentPipeline; Name m_name; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h index ff4746104d..03d62a5436 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h @@ -79,10 +79,11 @@ namespace AZ //! The View must be declared a camera by having the View::UsageFlags::UsageCamera usage flag set. //! This View will be registered as the context's pipeline's default view until the top of the camera stack changes. virtual void PushView(const Name& contextName, ViewPtr view) = 0; - //! Pops a camera off of the stack for a given context name. + //! Pops a camera off of the stack for a given context name. Returns true if the camera was successfully removed + //! or false if the camera wasn't removed, either because it wasn't found or its removal was not allowed. //! @note The default camera for a given viewport may not be removed from the view stack. //! You must push an additional camera to override the default view instead. - virtual void PopView(const Name& contextName, ViewPtr view) = 0; + virtual bool PopView(const Name& contextName, ViewPtr view) = 0; //! Gets the view currently registered to a given context, assuming the context exists. //! This will be null if there is no registered ViewportContext and no views have been pushed for this context name. virtual ViewPtr GetCurrentView(const Name& contextName) const = 0; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextManager.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextManager.h index 7b90bea3f3..b4a21839f4 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextManager.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextManager.h @@ -42,7 +42,7 @@ namespace AZ AZ::Name GetDefaultViewportContextName() const override; void PushView(const Name& contextName, ViewPtr view) override; - void PopView(const Name& contextName, ViewPtr view) override; + bool PopView(const Name& contextName, ViewPtr view) override; ViewPtr GetCurrentView(const Name& contextName) const override; private: diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelKdTree.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelKdTree.h index 6a4e881875..f23c890243 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelKdTree.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelKdTree.h @@ -29,6 +29,9 @@ namespace AZ { public: + using TriangleIndices = AZStd::tuple; + using ObjectIdTriangleIndices = AZStd::tuple; + ModelKdTree() = default; bool Build(const ModelAsset* model); @@ -43,11 +46,13 @@ namespace AZ eSA_Invalid }; - AZStd::array_view GetPositionsBuffer(const ModelLodAsset::Mesh& mesh); + static AZStd::array_view GetPositionsBuffer(const ModelLodAsset::Mesh& mesh); + + static AZStd::array_view GetIndexBuffer(const ModelLodAsset::Mesh& mesh); private: - void BuildRecursively(ModelKdTreeNode* pNode, const AZ::Aabb& boundbox, AZStd::vector& indices); + void BuildRecursively(ModelKdTreeNode* pNode, const AZ::Aabb& boundbox, AZStd::vector& indices); bool RayIntersectionRecursively(ModelKdTreeNode* pNode, const AZ::Vector3& raySrc, const AZ::Vector3& rayDir, float& distance) const; void GetPenetratedBoxesRecursively(ModelKdTreeNode* pNode, const AZ::Vector3& raySrc, const AZ::Vector3& rayDir, AZStd::vector& outBoxes); void ConstructMeshList(const ModelAsset* model, const AZ::Transform& matParent); @@ -67,30 +72,19 @@ namespace AZ struct SSplitInfo { AZ::Aabb m_aboveBoundbox; - AZStd::vector m_aboveIndices; + AZStd::vector m_aboveIndices; AZ::Aabb m_belowBoundbox; - AZStd::vector m_belowIndices; + AZStd::vector m_belowIndices; }; - bool SplitNode(const AZ::Aabb& boundbox, const AZStd::vector& indices, ModelKdTree::ESplitAxis splitAxis, float splitPos, SSplitInfo& outInfo); + bool SplitNode(const AZ::Aabb& boundbox, const AZStd::vector& indices, ModelKdTree::ESplitAxis splitAxis, float splitPos, SSplitInfo& outInfo); - AZ::Name m_positionName{ "POSITION" }; - - static ESplitAxis SearchForBestSplitAxis(const AZ::Aabb& aabb, float& splitPosition); + static AZStd::tuple SearchForBestSplitAxis(const AZ::Aabb& aabb); }; class ModelKdTreeNode { public: - ModelKdTreeNode() = default; - - ~ModelKdTreeNode() - { - for (auto& child : m_children) - { - child.reset(); - } - } AZ::u32 GetVertexBufferSize() const { return aznumeric_cast(m_vertexIndices.size()); @@ -105,19 +99,7 @@ namespace AZ } ModelKdTree::ESplitAxis GetSplitAxis() const { - if (m_splitAxis == 0) - { - return ModelKdTree::eSA_X; - } - if (m_splitAxis == 1) - { - return ModelKdTree::eSA_Y; - } - if (m_splitAxis == 2) - { - return ModelKdTree::eSA_Z; - } - return ModelKdTree::eSA_Invalid; + return m_splitAxis; } void SetSplitAxis(const ModelKdTree::ESplitAxis& axis) { @@ -151,43 +133,26 @@ namespace AZ { m_boundBox = aabb; } - void SetVertexIndexBuffer(AZStd::vector&& vertexInfos) + void SetVertexIndexBuffer(AZStd::vector>&& vertexInfos) { m_vertexIndices.swap(vertexInfos); } - AZ::u32 GetVertexIndex(AZ::u32 nIndex) const + ModelKdTree::TriangleIndices GetVertexIndex(AZ::u32 nIndex) const { - if (GetVertexBufferSize() == 1) - { - return m_oneIndex & 0x00FFFFFF; - } - - return m_vertexIndices[nIndex] & 0x00FFFFFF; + return AZStd::get<1>(m_vertexIndices[nIndex]); } - AZ::u32 GetObjIndex(AZ::u32 nIndex) const + AZ::u8 GetObjIndex(AZ::u32 nIndex) const { - if (GetVertexBufferSize() == 1) - { - return (m_oneIndex & 0xFF000000) >> 24; - } - - return (m_vertexIndices[nIndex] & 0xFF000000) >> 24; + return AZStd::get<0>(m_vertexIndices[nIndex]); } private: - union - { - float m_splitPos; // Interior - AZ::u32 m_oneIndex; // Leaf - }; - - AZStd::vector m_vertexIndices; // Leaf : high 8bits - object index, low 24bits - vertex index - - AZ::u32 m_splitAxis; // Interior; - AZ::Aabb m_boundBox; // Both - - AZStd::unique_ptr m_children[2] = {}; // Interior + AZ::Aabb m_boundBox{}; // Both + AZStd::vector> m_vertexIndices; + AZStd::array, 2> m_children{}; // Interior + float m_splitPos{}; // Interior + ModelKdTree::ESplitAxis m_splitAxis = ModelKdTree::eSA_Invalid; // Interior; }; } } diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/MorphTargetDelta.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/MorphTargetDelta.h new file mode 100644 index 0000000000..6d3a6805ef --- /dev/null +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/MorphTargetDelta.h @@ -0,0 +1,67 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace AZ::RPI +{ + //! This class represents the data that is passed to the morph target compute shader for an individual delta + //! See MorphTargetSRG.azsli for the corresponding shader struct + //! It is 16-byte aligned to work with structured buffers + //! Because AZSL does not support 16 or 8 bit integer types, the data is packed into 32 bit unsigned ints + struct PackedCompressedMorphTargetDelta + { + // The index of the vertex being modified by this delta + uint32_t m_morphedVertexIndex; + // 16 bits per component for position deltas + uint32_t m_positionXY; + // Position z plus 8 bits per component for normal deltas + uint32_t m_positionZNormalXY; + // Normal z plus 8 bits per component for tangent deltas + uint32_t m_normalZTangentXYZ; + // 8 bit padding plus 8 bits per component for bitangent deltas + uint32_t m_padBitangentXYZ; + // Explicit padding so the struct is 16 byte aligned for structured buffers + uint32_t m_pad[3]; + }; + + //! A morph target delta that is compressed, but split into individual components + //! It is not intended to be sent to the GPU, so it is not explicitly padded for alignment + struct CompressedMorphTargetDelta + { + // 32 bit indices + uint32_t m_morphedVertexIndex; + + // 16 bits per component for position deltas + uint16_t m_positionX; + uint16_t m_positionY; + uint16_t m_positionZ; + + // 8 bits per component for normal, tangent, and bitangent deltas + uint8_t m_normalX; + uint8_t m_normalY; + uint8_t m_normalZ; + + uint8_t m_tangentX; + uint8_t m_tangentY; + uint8_t m_tangentZ; + + uint8_t m_bitangentX; + uint8_t m_bitangentY; + uint8_t m_bitangentZ; + }; + + PackedCompressedMorphTargetDelta PackMorphTargetDelta(const CompressedMorphTargetDelta& compressedDelta); + CompressedMorphTargetDelta UnpackMorphTargetDelta(const PackedCompressedMorphTargetDelta& packedDelta); +} // namespace AZ::RPI diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassRequest.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassRequest.h index 5cea68017f..6e86bc0b6e 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassRequest.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassRequest.h @@ -52,11 +52,24 @@ namespace AZ //! Names of Passes that this Pass should execute after AZStd::vector m_executeAfterPasses; - //! Names of Passes that this Pass shoudl execute before + //! Names of Passes that this Pass should execute before AZStd::vector m_executeBeforePasses; - //! The attachments to be used as inputs to the instantiated Pass - PassConnectionList m_inputConnections; + //! Connections for the instantiated Pass + //! Most of the time these will be input connections that point to outputs of other passes + //! Cases where you would want to specify output connections are to connect to image or + //! buffer attachment overrides in the lists below + PassConnectionList m_connections; + + //! List of descriptors for the image attachments the PassRequest will create + //! If the pass template already specifies an attachment with the same name, + //! the PassRequest will override that attachment + PassImageAttachmentDescList m_imageAttachmentOverrides; + + //! List of descriptors for the buffer attachments the PassRequest will create + //! If the pass template already specifies an attachment with the same name, + //! the PassRequest will override that attachment + PassBufferAttachmentDescList m_bufferAttachmentOverrides; //! Optional data to be used during pass initialization AZStd::shared_ptr m_passData = nullptr; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassTemplate.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassTemplate.h index c862ed3c90..8e2ec357ea 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassTemplate.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Pass/PassTemplate.h @@ -77,10 +77,11 @@ namespace AZ //! Lists of inputs, outputs and input/outputs PassSlotList m_slots; - //! Connections for the Pass's outputs. Input connections are specified by PassRequests. - //! Output connections will often point to attachments owned by the pass, whereas input - //! connections will be hooked up to other passes. - PassConnectionList m_outputConnections; + //! Connections for the Pass. + //! Most of the time these will be output connections (which often point to attachments owned by the pass), + //! since input connections should be specified by the PassRequest (inputs are generally hooked up to other passes). + //! Cases where you would want to specify input connections on the PassTemplate are images imported as assets. + PassConnectionList m_connections; //! Fallback connections for the Pass's outputs. These connections will hook up to inputs //! of the pass and provide a fallback attachment for when the pass is disabled. diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Shader/IShaderVariantFinder.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Shader/IShaderVariantFinder.h index 1404ffb960..75a1ba7339 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Shader/IShaderVariantFinder.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Shader/IShaderVariantFinder.h @@ -96,6 +96,7 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// // EBusTraits overrides static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; + using MutexType = AZStd::recursive_mutex; typedef Data::AssetId BusIdType; // The AssetId of the shader asset. ////////////////////////////////////////////////////////////////////////// diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp index d5b082f4fe..b921cceaad 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -36,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +45,7 @@ #include #include #include +#include #include /** @@ -84,7 +87,7 @@ namespace const AZ::RHI::Format SkinWeightFormat = AZ::RHI::Format::R32_FLOAT; // Single-component, 32-bit floating point per weight // Morph targets - const char* ShaderSemanticName_MorphTargetVertexIndices = "MORPHTARGET_VERTEXINDICES"; + const char* ShaderSemanticName_MorphTargetDeltas = "MORPHTARGET_VERTEXDELTAS"; const AZ::RHI::Format MorphTargetVertexIndexFormat = AZ::RHI::Format::R32_UINT; // Single-component, 32-bit integer as vertex index const char* ShaderSemanticName_MorphTargetPositionDeltas = "MORPHTARGET_POSITIONDELTAS"; const AZ::RHI::Format MorphTargetPositionDeltaFormat = AZ::RHI::Format::R16_UINT; // 16-bit integer per compressed position delta component @@ -105,7 +108,7 @@ namespace AZ if (auto* serialize = azrtti_cast(context)) { serialize->Class() - ->Version(24); // [ATOM-14876] + ->Version(25); // [ATOM-14876] } } @@ -303,7 +306,8 @@ namespace AZ sourceMesh.m_name = meshName; const auto node = sceneGraph.Find(meshPath); - sourceMesh.m_worldTransform = GetWorldTransform(sceneGraph, node); + sourceMesh.m_worldTransform = AZ::SceneAPI::Utilities::DetermineWorldTransform(scene, node, context.m_group.GetRuleContainerConst()); + auto sibling = sceneGraph.GetNodeChild(node); AddToMeshContent(viewIt.second, sourceMesh); @@ -712,6 +716,22 @@ namespace AZ colorSet.reserve(vertexCount * ColorFloatsPerVert); } + if (!sourceMesh.m_skinData.empty()) + { + // Skinned meshes require that positions, normals, tangents, bitangents, all exist and have the same number + // of total elements. Pad buffers with missing data to make them align with positions and normals + if (!sourceMesh.m_meshTangents) + { + tangents.resize(vertexCount * TangentFloatsPerVert, 1.0f); + AZ_Warning(s_builderName, false, "Mesh '%s' is missing tangents and no defaults were generated. Skinned meshes require tangents. Dummy tangents will be inserted, which may result in rendering artifacts.", sourceMesh.m_name.GetCStr()); + } + if (!sourceMesh.m_meshBitangents) + { + bitangents.resize(vertexCount * BitangentFloatsPerVert, 1.0f); + AZ_Warning(s_builderName, false, "Mesh '%s' is missing bitangents and no defaults were generated. Skinned meshes require bitangents. Dummy bitangents will be inserted, which may result in rendering artifacts.", sourceMesh.m_name.GetCStr()); + } + } + for (const auto& itr : oldToNewIndices) { // We use the 'old' index as that properly indexes @@ -950,7 +970,7 @@ namespace AZ } template - void ModelAssetBuilderComponent::ValidateStreamSize(size_t expectedVertexCount, const AZStd::vector& bufferData, AZ::RHI::Format format, const char* streamName) const + void ModelAssetBuilderComponent::ValidateStreamSize([[maybe_unused]] size_t expectedVertexCount, const AZStd::vector& bufferData, AZ::RHI::Format format, [[maybe_unused]] const char* streamName) const { size_t actualVertexCount = (bufferData.size() * sizeof(T)) / RHI::GetFormatSize(format); AZ_Error(s_builderName, expectedVertexCount == actualVertexCount, "VertexStream '%s' does not match the expected vertex count. This typically means multiple sub-meshes have mis-matched vertex stream layouts (such as one having more uv sets than the other) but are assigned the same material in the dcc tool so they were merged.", streamName); @@ -1056,36 +1076,10 @@ namespace AZ meshView.m_skinWeightsView = RHI::BufferViewDescriptor::CreateTyped(0, numSkinInfluences, SkinWeightFormat); } - if (!mesh.m_morphTargetVertexData.m_vertexIndices.empty()) + if (!mesh.m_morphTargetVertexData.empty()) { - ProductMeshView::MorphTargetVertexDataView& mtDataView = meshView.m_morphTargetVertexDataView; - - const size_t numTotalVertices = mesh.m_morphTargetVertexData.m_vertexIndices.size(); - mtDataView.m_vertexIndexView = RHI::BufferViewDescriptor::CreateStructured(0, numTotalVertices, sizeof(uint32_t)); - - AZ_Assert(3 * numTotalVertices == mesh.m_morphTargetVertexData.m_positionDeltas.size(), - "Number compressed position deltas (%d) incorrect, should be (%d).", mesh.m_morphTargetVertexData.m_positionDeltas.size(), 3 * numTotalVertices); - mtDataView.m_positionDeltaView = RHI::BufferViewDescriptor::CreateTyped(0, numTotalVertices * 3, MorphTargetPositionDeltaFormat); - - AZ_Assert(3 * numTotalVertices == mesh.m_morphTargetVertexData.m_normalDeltas.size(), - "Number compressed normal deltas (%d) incorrect, should be (%d).", mesh.m_morphTargetVertexData.m_normalDeltas.size(), 3 * numTotalVertices); - mtDataView.m_normalDeltaView = RHI::BufferViewDescriptor::CreateTyped(0, numTotalVertices * 3, MorphTargetNormalDeltaFormat); - } - - if (!mesh.m_morphTargetVertexData.m_vertexIndices.empty()) - { - ProductMeshView::MorphTargetVertexDataView& mtDataView = meshView.m_morphTargetVertexDataView; - - const size_t numTotalVertices = mesh.m_morphTargetVertexData.m_vertexIndices.size(); - mtDataView.m_vertexIndexView = RHI::BufferViewDescriptor::CreateTyped(0, numTotalVertices, MorphTargetVertexIndexFormat); - - AZ_Assert(3 * numTotalVertices == mesh.m_morphTargetVertexData.m_positionDeltas.size(), - "Number compressed position deltas (%d) incorrect, should be (%d).", mesh.m_morphTargetVertexData.m_positionDeltas.size(), 3 * numTotalVertices); - mtDataView.m_positionDeltaView = RHI::BufferViewDescriptor::CreateTyped(0, numTotalVertices * 3, MorphTargetPositionDeltaFormat); - - AZ_Assert(3 * numTotalVertices == mesh.m_morphTargetVertexData.m_normalDeltas.size(), - "Number compressed normal deltas (%d) incorrect, should be (%d).", mesh.m_morphTargetVertexData.m_normalDeltas.size(), 3 * numTotalVertices); - mtDataView.m_normalDeltaView = RHI::BufferViewDescriptor::CreateTyped(0, numTotalVertices * 3, MorphTargetNormalDeltaFormat); + const size_t numTotalVertices = mesh.m_morphTargetVertexData.size(); + meshView.m_morphTargetVertexDataView = RHI::BufferViewDescriptor::CreateStructured(0, numTotalVertices, sizeof(PackedCompressedMorphTargetDelta)); } meshView.m_materialUid = mesh.m_materialUid; @@ -1229,15 +1223,12 @@ namespace AZ lodBufferInfo.m_skinInfluencesCount += numNewSkinInfluences; } - if (!mesh.m_morphTargetVertexData.m_vertexIndices.empty()) + if (!mesh.m_morphTargetVertexData.empty()) { const size_t numPrevVertexDeltas = lodBufferInfo.m_morphTargetVertexDeltaCount; - const size_t numNewVertexDeltas = mesh.m_morphTargetVertexData.m_vertexIndices.size(); + const size_t numNewVertexDeltas = mesh.m_morphTargetVertexData.size(); - ProductMeshView::MorphTargetVertexDataView& mtDataView = meshView.m_morphTargetVertexDataView; - mtDataView.m_vertexIndexView = RHI::BufferViewDescriptor::CreateTyped(/*elementOffset=*/numPrevVertexDeltas, numNewVertexDeltas, MorphTargetVertexIndexFormat); - mtDataView.m_positionDeltaView = RHI::BufferViewDescriptor::CreateTyped(/*elementOffset=*/numPrevVertexDeltas * 3, numNewVertexDeltas * 3, MorphTargetPositionDeltaFormat); - mtDataView.m_normalDeltaView = RHI::BufferViewDescriptor::CreateTyped(/*elementOffset=*/numPrevVertexDeltas * 3, numNewVertexDeltas * 3, MorphTargetNormalDeltaFormat); + meshView.m_morphTargetVertexDataView = RHI::BufferViewDescriptor::CreateStructured(/*elementOffset=*/numPrevVertexDeltas, numNewVertexDeltas, sizeof(PackedCompressedMorphTargetDelta)); lodBufferInfo.m_morphTargetVertexDeltaCount += numNewVertexDeltas; } @@ -1427,25 +1418,39 @@ namespace AZ mergedMesh.m_skinWeights.end(), mesh.m_skinWeights.begin(), mesh.m_skinWeights.end()); } - if (!mesh.m_morphTargetVertexData.m_vertexIndices.empty()) + if (!mesh.m_morphTargetVertexData.empty()) { - const auto& sourceIndices = mesh.m_morphTargetVertexData.m_vertexIndices; - auto& mergedIndices = mergedMesh.m_morphTargetVertexData.m_vertexIndices; - mergedIndices.insert(mergedIndices.end(), sourceIndices.begin(), sourceIndices.end()); - - const auto& sourcePosDeltas = mesh.m_morphTargetVertexData.m_positionDeltas; - auto& mergedPosDeltas = mergedMesh.m_morphTargetVertexData.m_positionDeltas; - mergedPosDeltas.insert(mergedPosDeltas.end(), sourcePosDeltas.begin(), sourcePosDeltas.end()); - - const auto& sourceNormalDeltas = mesh.m_morphTargetVertexData.m_normalDeltas; - auto& mergedNormalDeltas = mergedMesh.m_morphTargetVertexData.m_normalDeltas; - mergedNormalDeltas.insert(mergedNormalDeltas.end(), sourceNormalDeltas.begin(), sourceNormalDeltas.end()); + const auto& sourceMorphTargetData = mesh.m_morphTargetVertexData; + auto& mergedMorphTargetData = mergedMesh.m_morphTargetVertexData; + mergedMorphTargetData.insert(mergedMorphTargetData.end(), sourceMorphTargetData.begin(), sourceMorphTargetData.end()); } } return mergedMesh; } + template + bool ModelAssetBuilderComponent::BuildStructuredStreamBuffer( + AZStd::vector& outStreamBuffers, + const AZStd::vector& bufferData, + const RHI::ShaderSemantic& semantic, + const AZ::Name& customStreamName) + { + AZStd::string bufferName = semantic.ToString(); + size_t elementCount = bufferData.size(); + size_t elementSize = sizeof(T); + Outcome> bufferOutcome = CreateStructuredBufferAsset(bufferData.data(), elementCount, elementSize, bufferName); + + if (!bufferOutcome.IsSuccess()) + { + AZ_Error(s_builderName, false, "Failed to build %s stream", semantic.ToString().data()); + return false; + } + + outStreamBuffers.push_back({ semantic, customStreamName, {bufferOutcome.GetValue(), bufferOutcome.GetValue()->GetBufferViewDescriptor()} }); + return true; + }; + template bool ModelAssetBuilderComponent::BuildRawStreamBuffer( AZStd::vector& outStreamBuffers, @@ -1468,7 +1473,7 @@ namespace AZ }; template - bool ModelAssetBuilderComponent::BuildStreamBuffer( + bool ModelAssetBuilderComponent::BuildTypedStreamBuffer( AZStd::vector& outStreamBuffers, const AZStd::vector& bufferData, AZ::RHI::Format format, @@ -1546,19 +1551,19 @@ namespace AZ } // Build various stream buffers ... - if (!BuildStreamBuffer(outStreamBuffers, positions, PositionFormat, RHI::ShaderSemantic{"POSITION"})) + if (!BuildTypedStreamBuffer(outStreamBuffers, positions, PositionFormat, RHI::ShaderSemantic{"POSITION"})) { return false; } - if (!BuildStreamBuffer(outStreamBuffers, normals, NormalFormat, RHI::ShaderSemantic{"NORMAL"})) + if (!BuildTypedStreamBuffer(outStreamBuffers, normals, NormalFormat, RHI::ShaderSemantic{"NORMAL"})) { return false; } if (!tangents.empty()) { - if (!BuildStreamBuffer(outStreamBuffers, tangents, TangentFormat, RHI::ShaderSemantic{"TANGENT"})) + if (!BuildTypedStreamBuffer(outStreamBuffers, tangents, TangentFormat, RHI::ShaderSemantic{"TANGENT"})) { return false; } @@ -1566,7 +1571,7 @@ namespace AZ if (!bitangents.empty()) { - if (!BuildStreamBuffer(outStreamBuffers, bitangents, BitangentFormat, RHI::ShaderSemantic{"BITANGENT"})) + if (!BuildTypedStreamBuffer(outStreamBuffers, bitangents, BitangentFormat, RHI::ShaderSemantic{"BITANGENT"})) { return false; } @@ -1574,7 +1579,7 @@ namespace AZ for (size_t i = 0; i < uvSets.size(); ++i) { - if (!BuildStreamBuffer(outStreamBuffers, uvSets[i], UVFormat, RHI::ShaderSemantic{"UV", i}, uvCustomNames[i])) + if (!BuildTypedStreamBuffer(outStreamBuffers, uvSets[i], UVFormat, RHI::ShaderSemantic{"UV", i}, uvCustomNames[i])) { return false; } @@ -1582,7 +1587,7 @@ namespace AZ for (size_t i = 0; i < colorSets.size(); ++i) { - if (!BuildStreamBuffer(outStreamBuffers, colorSets[i], ColorFormat, RHI::ShaderSemantic{"COLOR", i}, colorCustomNames[i])) + if (!BuildTypedStreamBuffer(outStreamBuffers, colorSets[i], ColorFormat, RHI::ShaderSemantic{"COLOR", i}, colorCustomNames[i])) { return false; } @@ -1610,29 +1615,11 @@ namespace AZ } // Morph target buffers - const AZStd::vector& mtVertexIndices = lodBufferContent.m_morphTargetVertexData.m_vertexIndices; - if (!mtVertexIndices.empty()) + const AZStd::vector& morphTargetVertexDeltas = lodBufferContent.m_morphTargetVertexData; + if (!morphTargetVertexDeltas.empty()) { - // Vertex indices - const size_t numTotalVertices = mtVertexIndices.size(); - if (!BuildStreamBuffer(numTotalVertices, outStreamBuffers, mtVertexIndices, - MorphTargetVertexIndexFormat, RHI::ShaderSemantic{ShaderSemanticName_MorphTargetVertexIndices})) - { - return false; - } - - // Position deltas - const AZStd::vector& mtPositionDeltas = lodBufferContent.m_morphTargetVertexData.m_positionDeltas; - if (!BuildStreamBuffer(numTotalVertices * 3, outStreamBuffers, mtPositionDeltas, - MorphTargetPositionDeltaFormat, RHI::ShaderSemantic{ShaderSemanticName_MorphTargetPositionDeltas})) - { - return false; - } - - // Normal deltas - const AZStd::vector& mtNormalDeltas = lodBufferContent.m_morphTargetVertexData.m_normalDeltas; - if (!BuildStreamBuffer(numTotalVertices * 3, outStreamBuffers, mtNormalDeltas, - MorphTargetNormalDeltaFormat, RHI::ShaderSemantic{ShaderSemanticName_MorphTargetNormalDeltas})) + if (!BuildStructuredStreamBuffer(outStreamBuffers, morphTargetVertexDeltas, + RHI::ShaderSemantic{ ShaderSemanticName_MorphTargetDeltas })) { return false; } @@ -1762,22 +1749,10 @@ namespace AZ } // Set morph target buffers - if (meshView.m_morphTargetVertexDataView.m_vertexIndexView.m_elementCount > 0) + if (meshView.m_morphTargetVertexDataView.m_elementCount > 0) { - if (!SetMeshStreamBufferById(RHI::ShaderSemantic{ShaderSemanticName_MorphTargetVertexIndices}, AZ::Name(), - meshView.m_morphTargetVertexDataView.m_vertexIndexView, lodStreamBuffers, lodAssetCreator)) - { - return false; - } - - if (!SetMeshStreamBufferById(RHI::ShaderSemantic{ShaderSemanticName_MorphTargetPositionDeltas}, AZ::Name(), - meshView.m_morphTargetVertexDataView.m_positionDeltaView, lodStreamBuffers, lodAssetCreator)) - { - return false; - } - - if (!SetMeshStreamBufferById(RHI::ShaderSemantic{ShaderSemanticName_MorphTargetNormalDeltas}, AZ::Name(), - meshView.m_morphTargetVertexDataView.m_normalDeltaView, lodStreamBuffers, lodAssetCreator)) + if (!SetMeshStreamBufferById(RHI::ShaderSemantic{ShaderSemanticName_MorphTargetDeltas}, AZ::Name(), + meshView.m_morphTargetVertexDataView, lodStreamBuffers, lodAssetCreator)) { return false; } @@ -1797,6 +1772,15 @@ namespace AZ return CreateBufferAsset(data, bufferViewDescriptor, bufferName); } + Outcome> ModelAssetBuilderComponent::CreateStructuredBufferAsset( + const void* data, const size_t elementCount, const size_t elementSize, const AZStd::string& bufferName) + { + RHI::BufferViewDescriptor bufferViewDescriptor = + RHI::BufferViewDescriptor::CreateStructured(0, static_cast(elementCount), static_cast(elementSize)); + + return CreateBufferAsset(data, bufferViewDescriptor, bufferName); + } + Outcome> ModelAssetBuilderComponent::CreateRawBufferAsset( const void* data, const size_t totalSizeInBytes, const AZStd::string& bufferName) { diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.h b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.h index 48c56b9f69..93914a83f2 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.h +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.h @@ -48,6 +48,7 @@ namespace AZ class Stream; class ModelLodAssetCreator; class BufferAssetCreator; + struct PackedCompressedMorphTargetDelta; //! Component responsible for building Atom's AzModel from SceneAPI input. @@ -117,14 +118,7 @@ namespace AZ AZStd::vector m_skinWeights; // Morph targets - struct MorphTargetVertexData - { - AZStd::vector m_vertexIndices; - AZStd::vector m_uncompressedPositionDeltas; - AZStd::vector m_positionDeltas; - AZStd::vector m_normalDeltas; - }; - MorphTargetVertexData m_morphTargetVertexData; + AZStd::vector m_morphTargetVertexData; MaterialUid m_materialUid; bool CanBeMerged() const { return true; } @@ -173,16 +167,11 @@ namespace AZ AZStd::vector m_colorCustomNames; RHI::BufferViewDescriptor m_tangentView; RHI::BufferViewDescriptor m_bitangentView; + RHI::BufferViewDescriptor m_skinJointIndicesView; RHI::BufferViewDescriptor m_skinWeightsView; - struct MorphTargetVertexDataView - { - RHI::BufferViewDescriptor m_vertexIndexView; - RHI::BufferViewDescriptor m_positionDeltaView; - RHI::BufferViewDescriptor m_normalDeltaView; - }; - MorphTargetVertexDataView m_morphTargetVertexDataView; + RHI::BufferViewDescriptor m_morphTargetVertexDataView; MaterialUid m_materialUid; }; @@ -236,6 +225,14 @@ namespace AZ const ProductMeshContentList& productMeshList, IndicesOperation indicesOp); + //! Create stream buffer asset with a structured view descriptor from the given data and add it to the out stream buffers + template + bool BuildStructuredStreamBuffer( + AZStd::vector& outStreamBuffers, + const AZStd::vector& bufferData, + const RHI::ShaderSemantic& semantic, + const AZ::Name& uvCustomName = AZ::Name()); + //! Create stream buffer asset with a raw view descriptor from the given data and add it to the out stream buffers. template bool BuildRawStreamBuffer( @@ -244,15 +241,16 @@ namespace AZ const RHI::ShaderSemantic& semantic, const AZ::Name& uvCustomName = AZ::Name()); - //! Create stream buffer asset from the given data and add it to the out stream buffers. + //! Create stream buffer asset with a typed view descriptor from the given data and add it to the out stream buffers. template - bool BuildStreamBuffer( + bool BuildTypedStreamBuffer( AZStd::vector& outStreamBuffers, const AZStd::vector& bufferData, AZ::RHI::Format format, const RHI::ShaderSemantic& semantic, const AZ::Name& uvCustomName = AZ::Name()); + //! Create stream buffer asset with a typed view descriptor from the given data and add it to the out stream buffers. template bool BuildStreamBuffer( size_t vertexCount, @@ -297,6 +295,10 @@ namespace AZ Outcome> CreateTypedBufferAsset( const void* data, const size_t elementCount, RHI::Format format, const AZStd::string& bufferName); + //! Takes in a pointer to data and a size in bytes and creates a BufferAsset. + Outcome> CreateStructuredBufferAsset( + const void* data, const size_t elementCount, const size_t elementSize, const AZStd::string& bufferName); + //! Takes in a pointer to data and a size in bytes and creates a BufferAsset. Outcome> CreateRawBufferAsset( const void* data, const size_t totalSizeInBytes, const AZStd::string& bufferName); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp index 440f588f93..acd9477458 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -161,11 +162,7 @@ namespace AZ::RPI const uint32_t numFaces = blendShapeData->GetFaceCount(); - ModelAssetBuilderComponent::ProductMeshContent::MorphTargetVertexData& morphTargetVertexData = productMesh.m_morphTargetVertexData; - AZStd::vector& vertexIndices = morphTargetVertexData.m_vertexIndices; - AZStd::vector& uncompressedPositionDeltas = morphTargetVertexData.m_uncompressedPositionDeltas; - AZStd::vector& positionDeltas = morphTargetVertexData.m_positionDeltas; - AZStd::vector& normalDeltas = morphTargetVertexData.m_normalDeltas; + AZStd::vector& packedCompressedMorphTargetVertexData = productMesh.m_morphTargetVertexData; MorphTargetMetaAsset::MorphTarget metaData; metaData.m_meshNodeName = sourceMesh.m_name.GetStringView(); @@ -176,13 +173,21 @@ namespace AZ::RPI AZ_Assert(blendShapeData->GetVertexCount() == sourceMesh.m_meshData->GetVertexCount(), "Blend shape (%s) contains more/less vertices (%d) than the neutral mesh (%d).", blendShapeName.c_str(), numVertices, sourceMesh.m_meshData->GetVertexCount()); - metaData.m_startIndex = aznumeric_caster(vertexIndices.size()); + + // The start index is after any previously added deltas + metaData.m_startIndex = aznumeric_caster(packedCompressedMorphTargetVertexData.size()); // Multiply normal by inverse transpose to avoid incorrect values produced by non-uniformly scaled transforms. DataTypes::MatrixType globalTransformN = globalTransform.GetInverseFull().GetTranspose(); globalTransformN.SetTranslation(AZ::Vector3::CreateZero()); + AZStd::vector uncompressedPositionDeltas; + uncompressedPositionDeltas.reserve(numVertices); + + AZStd::vector compressedDeltas; + compressedDeltas.reserve(numVertices); + uint32_t numMorphedVertices = 0; for (uint32_t vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex) { @@ -197,14 +202,20 @@ namespace AZ::RPI // Check if the vertex positions are different. if (!targetPosition.IsClose(neutralPosition, tolerance)) { - vertexIndices.emplace_back(vertexIndex + vertexOffset); + // Add a new delta numMorphedVertices++; + compressedDeltas.emplace_back(RPI::CompressedMorphTargetDelta{}); + RPI::CompressedMorphTargetDelta& currentDelta = compressedDeltas.back(); + + // Set the morphed index + currentDelta.m_morphedVertexIndex = vertexIndex + vertexOffset; const AZ::Vector3 deltaPosition = targetPosition - neutralPosition; deltaPositionAabb.AddPoint(deltaPosition); - uncompressedPositionDeltas.emplace_back(deltaPosition.GetX()); - uncompressedPositionDeltas.emplace_back(deltaPosition.GetY()); - uncompressedPositionDeltas.emplace_back(deltaPosition.GetZ()); + + // We can't compress the positions until they've all been gathered so we know the min/max, + // so keep track of the uncompressed positions for now + uncompressedPositionDeltas.emplace_back(deltaPosition); // Normal { @@ -219,16 +230,30 @@ namespace AZ::RPI const AZ::Vector3 deltaNormal = targetNormal - neutralNormal; - normalDeltas.emplace_back(Compress(deltaNormal.GetX(), -2.0f, 2.0f)); - normalDeltas.emplace_back(Compress(deltaNormal.GetY(), -2.0f, 2.0f)); - normalDeltas.emplace_back(Compress(deltaNormal.GetZ(), -2.0f, 2.0f)); + currentDelta.m_normalX = Compress(deltaNormal.GetX(), -2.0f, 2.0f); + currentDelta.m_normalY = Compress(deltaNormal.GetY(), -2.0f, 2.0f); + currentDelta.m_normalZ = Compress(deltaNormal.GetZ(), -2.0f, 2.0f); + } + + // Tangent + { + // Insert zero-delta until morphed tangents are supported in SceneAPI + currentDelta.m_tangentX = Compress(0.0f, -2.0f, 2.0f); + currentDelta.m_tangentY = Compress(0.0f, -2.0f, 2.0f); + currentDelta.m_tangentZ = Compress(0.0f, -2.0f, 2.0f); + } + + // Bitangent + { + // Insert zero-delta until morphed bitangents are supported in SceneAPI + currentDelta.m_bitangentX = Compress(0.0f, -2.0f, 2.0f); + currentDelta.m_bitangentY = Compress(0.0f, -2.0f, 2.0f); + currentDelta.m_bitangentZ = Compress(0.0f, -2.0f, 2.0f); } } } metaData.m_numVertices = numMorphedVertices; - AZ_Assert((vertexIndices.size() - metaData.m_startIndex) == numMorphedVertices, "Vertex index range (%d) in morph target meta data does not match number of morphed vertices (%d).", - vertexIndices.size() - metaData.m_startIndex, numMorphedVertices); const float morphedVerticesRatio = numMorphedVertices / static_cast(numVertices); AZ_Printf(ModelAssetBuilderComponent::s_builderName, "'%s' morphs %.1f%% of the vertices.", blendShapeName.c_str(), morphedVerticesRatio * 100.0f); @@ -253,15 +278,26 @@ namespace AZ::RPI metaAssetCreator.AddMorphTarget(metaData); + AZ_Assert(uncompressedPositionDeltas.size() == compressedDeltas.size(), "Number of uncompressed (%d) and compressed position delta components (%d) do not match.", + uncompressedPositionDeltas.size(), compressedDeltas.size()); + // Compress the position deltas. (Only the newly added ones from this morph target) - for (size_t i = metaData.m_startIndex * 3; i < uncompressedPositionDeltas.size(); i++) + for (size_t i = 0; i < uncompressedPositionDeltas.size(); i++) + { + compressedDeltas[i].m_positionX = Compress(uncompressedPositionDeltas[i].GetX(), metaData.m_minPositionDelta, metaData.m_maxPositionDelta); + compressedDeltas[i].m_positionY = Compress(uncompressedPositionDeltas[i].GetY(), metaData.m_minPositionDelta, metaData.m_maxPositionDelta); + compressedDeltas[i].m_positionZ = Compress(uncompressedPositionDeltas[i].GetZ(), metaData.m_minPositionDelta, metaData.m_maxPositionDelta); + } + + // Now that we have all our compressed deltas, they need to be packed + // the way the shader expects to read them and added to the product mesh + packedCompressedMorphTargetVertexData.reserve(packedCompressedMorphTargetVertexData.size() + compressedDeltas.size()); + for (size_t i = 0; i < compressedDeltas.size(); ++i) { - positionDeltas.emplace_back(Compress(uncompressedPositionDeltas[i], metaData.m_minPositionDelta, metaData.m_maxPositionDelta)); + packedCompressedMorphTargetVertexData.emplace_back(RPI::PackMorphTargetDelta(compressedDeltas[i])); } - AZ_Assert(uncompressedPositionDeltas.size() == positionDeltas.size(), "Number of uncompressed (%d) and compressed position delta components (%d) do not match.", - uncompressedPositionDeltas.size(), positionDeltas.size()); - AZ_Assert(positionDeltas.size() == normalDeltas.size(), "Number of position deltas needs to match the number of normal deltas."); - AZ_Assert((positionDeltas.size() / 3) == vertexIndices.size(), "Position delta component count needs to be three times the number of vertex indices."); + AZ_Assert((packedCompressedMorphTargetVertexData.size() - metaData.m_startIndex) == numMorphedVertices, "Vertex index range (%d) in morph target meta data does not match number of morphed vertices (%d).", + packedCompressedMorphTargetVertexData.size() - metaData.m_startIndex, numMorphedVertices); } } // namespace AZ::RPI diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp index e33eb1e9e7..7bfcc588f1 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp @@ -172,7 +172,8 @@ namespace AZ return RHI::ResultCode::Success; } - AZ_Error("Buffer", false, "Buffer::Init() failed to initialize RHI buffer. Error code: %d", static_cast(resultCode)); + // ResultCode::Unimplemented is used by Null Renderer and hence is a valid use case + AZ_Error("Buffer", resultCode == AZ::RHI::ResultCode::Unimplemented, "Buffer::Init() failed to initialize RHI buffer. Error code: %d", static_cast(resultCode)); return resultCode; } @@ -235,6 +236,11 @@ namespace AZ { return response.m_data; } + else if (result == RHI::ResultCode::Unimplemented) + { + // ResultCode::Unimplemented is used by Null Renderer and hence is a valid use case + return nullptr; + } else { AZ_Error("RPI::Buffer", false, "Failed to update RHI buffer. Error code: %d", result); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp index 97c325de02..e05dc6f506 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp @@ -239,16 +239,18 @@ namespace AZ void CullingSystem::RegisterOrUpdateCullable(Cullable& cullable) { - m_cullDataConcurrencyCheck.soft_lock(); + // [GFX TODO][ATOM-15036] Remove lock from CullingSystem visibility updates + m_mutex.lock(); AZ::Interface::Get()->InsertOrUpdateEntry(cullable.m_cullData.m_visibilityEntry); - m_cullDataConcurrencyCheck.soft_unlock(); + m_mutex.unlock(); } void CullingSystem::UnregisterCullable(Cullable& cullable) { - m_cullDataConcurrencyCheck.soft_lock(); + // [GFX TODO][ATOM-15036] Remove lock from CullingSystem visibility updates + m_mutex.lock(); AZ::Interface::Get()->RemoveEntry(cullable.m_cullData.m_visibilityEntry); - m_cullDataConcurrencyCheck.soft_unlock(); + m_mutex.unlock(); } uint32_t CullingSystem::GetNumCullables() const diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicBufferAllocator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicBufferAllocator.cpp index 84f6608d1d..e4599901a9 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicBufferAllocator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicBufferAllocator.cpp @@ -65,6 +65,12 @@ namespace AZ { uint32_t allocatePosition = 0; + //m_ringBufferStartAddress can be null for Null back end + if (!m_ringBufferStartAddress) + { + return nullptr; + } + if (size > m_ringBufferSize) { AZ_WarningOnce("RPI", !m_enableAllocationWarning, "DynamicBufferAllocator::Allocate: try to allocate buffer which size is larger than the ring buffer size"); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp index 1401cb9a73..5117c3d9dd 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp @@ -95,13 +95,25 @@ namespace AZ } - void DynamicDrawContext::InitShader(Data::Asset shaderAsset, const ShaderOptionList* optionAndValues) + void DynamicDrawContext::InitShader(Data::Asset shaderAsset) { Data::Instance shader = Shader::FindOrCreate(shaderAsset); - InitShader(shader, optionAndValues); + InitShader(shader); } - void DynamicDrawContext::InitShader(Data::Instance shader, const ShaderOptionList* optionAndValues) + void DynamicDrawContext::InitShader(Data::Instance shader) + { + InitShaderWithVariant(shader, nullptr); + m_supportShaderVariants = true; + } + + void DynamicDrawContext::InitShaderWithVariant(Data::Asset shaderAsset, const ShaderOptionList* optionAndValues) + { + Data::Instance shader = Shader::FindOrCreate(shaderAsset); + InitShaderWithVariant(shader, optionAndValues); + } + + void DynamicDrawContext::InitShaderWithVariant(Data::Instance shader, const ShaderOptionList* optionAndValues) { AZ_Assert(!m_initialized, "Can't call InitShader after context was initialized (EndInit was called)"); @@ -111,6 +123,9 @@ namespace AZ return; } + m_supportShaderVariants = false; + m_shader = shader; + m_pipelineState = aznew RPI::PipelineStateForDraw; m_pipelineState->Init(shader, optionAndValues); @@ -200,6 +215,30 @@ namespace AZ return m_initialized; } + ShaderVariantId DynamicDrawContext::UseShaderVariant(const ShaderOptionList& optionAndValues) + { + AZ_Assert(m_initialized && m_supportShaderVariants, "DynamicDrawContext is not initialized or unable to support shader variants. " + "Check if it was initialized with InitShaderWithVariant"); + + ShaderVariantId variantId; + + if (!m_supportShaderVariants) + { + return variantId; + } + + RPI::ShaderOptionGroup shaderOptionGroup = m_shader->CreateShaderOptionGroup(); + shaderOptionGroup.SetUnspecifiedToDefaultValues(); + + for (const auto& optionAndValue : optionAndValues) + { + shaderOptionGroup.SetValue(optionAndValue.first, optionAndValue.second); + } + + variantId = shaderOptionGroup.GetShaderVariantId(); + return variantId; + } + void DynamicDrawContext::AddDrawStateOptions(DrawStateOptions options) { AZ_Assert(!m_initialized, "Can't call AddDrawStateOptions after context was initialized (EndInit was called)"); @@ -314,6 +353,13 @@ namespace AZ m_useViewport = false; } + void DynamicDrawContext::SetShaderVariant(ShaderVariantId shaderVariantId) + { + AZ_Assert( m_initialized && m_supportShaderVariants, "DynamicDrawContext is not initialized or unable to support shader variants. " + "Check if it was initialized with InitShaderWithVariant"); + m_currentShaderVariantId = shaderVariantId; + } + void DynamicDrawContext::DrawIndexed(void* vertexData, uint32_t vertexCount, void* indexData, uint32_t indexCount, RHI::IndexFormat indexFormat, Data::Instance < ShaderResourceGroup> drawSrg) { if (!m_initialized) @@ -492,10 +538,19 @@ namespace AZ } auto drawSrg = AZ::RPI::ShaderResourceGroup::Create(m_drawSrgAsset); - // set fallback value for shader variant + // Set fallback value for shader variant if draw srg contains constant for shader variant fallback if (m_hasShaderVariantKeyFallbackEntry) { - m_pipelineState->UpdateSrgVariantFallback(drawSrg); + // If the dynamic draw context support multiple shader variants, it uses m_currentShaderVariantId to setup srg shader variant fallback key + if (m_supportShaderVariants) + { + drawSrg->SetShaderVariantKeyFallbackValue(m_currentShaderVariantId.m_key); + } + // otherwise use the m_pipelineState to config the fallback + else + { + m_pipelineState->UpdateSrgVariantFallback(drawSrg); + } } return drawSrg; @@ -516,6 +571,11 @@ namespace AZ return m_drawListTag; } + const Data::Instance& DynamicDrawContext::GetShader() const + { + return m_shader; + } + void DynamicDrawContext::SubmitDrawData(ViewPtr view) { if (!m_initialized) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp index 15ebf856ab..5ecf293efe 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp @@ -18,6 +18,8 @@ #include #include +#include +#include #include #include @@ -372,7 +374,7 @@ namespace AZ // --- PassTemplate related functions --- - void Pass::CreateSlotsFromTemplate() + void Pass::CreateBindingsFromTemplate() { if (m_template) { @@ -391,6 +393,11 @@ namespace AZ void Pass::AttachBufferToSlot(const Name& slot, Data::Instance buffer) { + if (!buffer) + { + return; + } + PassAttachmentBinding* localBinding = FindAttachmentBinding(slot); if (!localBinding) { @@ -453,7 +460,7 @@ namespace AZ localBinding->m_originalAttachment = attachment; } - void Pass::ProcessConnection(const PassConnection& connection) + void Pass::ProcessConnection(const PassConnection& connection, uint32_t slotTypeMask) { // Get the input from this pass that forms one end of the connection PassAttachmentBinding* localBinding = FindAttachmentBinding(connection.m_localSlot); @@ -465,6 +472,12 @@ namespace AZ return; } + uint32_t bindingMask = (1 << uint32_t(localBinding->m_slotType)); + if (!(bindingMask & slotTypeMask)) + { + return; + } + Name connectedPassName = connection.m_attachmentRef.m_pass; Name connectedSlotName = connection.m_attachmentRef.m_attachment; Ptr connectedPass; @@ -706,13 +719,52 @@ namespace AZ return attachment; } + template + void Pass::OverrideOrAddAttachment(const AttachmentDescType& desc) + { + bool overrideAttachment = false; + + // Search existing attachments + for (size_t i = 0; i < m_ownedAttachments.size(); ++i) + { + // If we find one with the same name + if (m_ownedAttachments[i]->m_name == desc.m_name) + { + // Override it + m_ownedAttachments[i] = CreateAttachmentFromDesc(desc); + overrideAttachment = true; + break; + } + } + + // If we didn't override any attachments + if (!overrideAttachment) + { + // Create a new one + m_ownedAttachments.emplace_back(CreateAttachmentFromDesc(desc)); + } + } + void Pass::SetupInputsFromRequest() { if (m_flags.m_createdByPassRequest) { - for (const PassConnection& connection : m_request.m_inputConnections) + const uint32_t slotTypeMask = (1 << uint32_t(PassSlotType::Input)) | (1 << uint32_t(PassSlotType::InputOutput)); + for (const PassConnection& connection : m_request.m_connections) + { + ProcessConnection(connection, slotTypeMask); + } + } + } + + void Pass::SetupOutputsFromRequest() + { + if (m_flags.m_createdByPassRequest) + { + const uint32_t slotTypeMask = (1 << uint32_t(PassSlotType::Output)); + for (const PassConnection& connection : m_request.m_connections) { - ProcessConnection(connection); + ProcessConnection(connection, slotTypeMask); } } } @@ -753,13 +805,26 @@ namespace AZ } } + void Pass::SetupInputsFromTemplate() + { + if (m_template) + { + const uint32_t slotTypeMask = (1 << uint32_t(PassSlotType::Input)) | (1 << uint32_t(PassSlotType::InputOutput)); + for (const PassConnection& outputConnection : m_template->m_connections) + { + ProcessConnection(outputConnection, slotTypeMask); + } + } + } + void Pass::SetupOutputsFromTemplate() { if (m_template) { - for (const PassConnection& outputConnection : m_template->m_outputConnections) + const uint32_t slotTypeMask = (1 << uint32_t(PassSlotType::Output)); + for (const PassConnection& outputConnection : m_template->m_connections) { - ProcessConnection(outputConnection); + ProcessConnection(outputConnection, slotTypeMask); } for (const PassFallbackConnection& fallbackConnection : m_template->m_fallbackConnections) { @@ -785,6 +850,23 @@ namespace AZ } } + void Pass::CreateAttachmentsFromRequest() + { + if (m_flags.m_createdByPassRequest) + { + // Create image attachments + for (const PassImageAttachmentDesc& desc : m_request.m_imageAttachmentOverrides) + { + OverrideOrAddAttachment(desc); + } + // Create buffer attachments + for (const PassBufferAttachmentDesc& desc : m_request.m_bufferAttachmentOverrides) + { + OverrideOrAddAttachment(desc); + } + } + } + // --- Attachment and Binding related functions --- void Pass::StoreImportedAttachmentReferences() @@ -991,15 +1073,26 @@ namespace AZ AZ_RPI_BREAK_ON_TARGET_PASS; - CreateSlotsFromTemplate(); + // Bindings, inputs and attachments + CreateBindingsFromTemplate(); SetupInputsFromRequest(); SetupPassDependencies(); CreateAttachmentsFromTemplate(); + CreateAttachmentsFromRequest(); + SetupInputsFromTemplate(); + + // Custom pass behavior BuildAttachmentsInternal(); + + // Outputs SetupOutputsFromTemplate(); + SetupOutputsFromRequest(); + + // Update UpdateConnectedBindings(); UpdateOwnedAttachments(); UpdateAttachmentUsageIndices(); + m_flags.m_isBuildingAttachments = false; } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassFactory.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassFactory.cpp index 783a81d791..6a2e756403 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassFactory.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassFactory.cpp @@ -23,8 +23,9 @@ #include #include #include -#include #include +#include +#include #include #include @@ -69,6 +70,7 @@ namespace AZ AddPassCreator(Name("DownsampleMipChainPass"), &DownsampleMipChainPass::Create); AddPassCreator(Name("EnvironmentCubeMapPass"), &EnvironmentCubeMapPass::Create); AddPassCreator(Name("RenderToTexturePass"), &RenderToTexturePass::Create); + AddPassCreator(Name("SelectorPass"), &SelectorPass::Create); } PassFactory::CreatorIndex PassFactory::FindCreatorIndex(Name passClassName) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassUtils.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassUtils.cpp index a1858b6fe9..52af4a8193 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassUtils.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassUtils.cpp @@ -45,22 +45,22 @@ namespace AZ { bool success = true; - // Apply mappings from PassRequest + // Apply mappings from PassTemplate const RenderPassData* passData = nullptr; - if (descriptor.m_passRequest != nullptr) + if (descriptor.m_passTemplate != nullptr) { - passData = azrtti_cast(descriptor.m_passRequest->m_passData.get()); + passData = azrtti_cast(descriptor.m_passTemplate->m_passData.get()); if (passData) { success = shaderResourceGroup->ApplyDataMappings(passData->m_mappings); } } - // Apply mappings from PassTemplate + // Apply mappings from PassRequest passData = nullptr; - if (descriptor.m_passTemplate != nullptr) + if (descriptor.m_passRequest != nullptr) { - passData = azrtti_cast(descriptor.m_passTemplate->m_passData.get()); + passData = azrtti_cast(descriptor.m_passRequest->m_passData.get()); if (passData) { success = success && shaderResourceGroup->ApplyDataMappings(passData->m_mappings); @@ -80,4 +80,4 @@ namespace AZ } // namespace PassUtils } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.cpp index d58c8f4248..5ba43f9f7e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.cpp @@ -58,7 +58,7 @@ namespace AZ childInputConnection.m_localSlot = "Output"; childInputConnection.m_attachmentRef.m_pass = "Parent"; childInputConnection.m_attachmentRef.m_attachment = "CubeMapOutput"; - childRequest.m_inputConnections.emplace_back(childInputConnection); + childRequest.m_connections.emplace_back(childInputConnection); PassSystemInterface* passSystem = PassSystemInterface::Get(); m_childPass = passSystem->CreatePassFromRequest(&childRequest); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/SelectorPass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/SelectorPass.cpp new file mode 100644 index 0000000000..8e8c67393d --- /dev/null +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/SelectorPass.cpp @@ -0,0 +1,120 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include + + +namespace AZ +{ + namespace RPI + { + Ptr SelectorPass::Create(const PassDescriptor& descriptor) + { + Ptr pass = aznew SelectorPass(descriptor); + return pass; + } + + SelectorPass::SelectorPass(const PassDescriptor& descriptor) + : Pass(descriptor) + { + uint32_t outputSlotCount = 0; + for (const PassSlot& slot : m_template->m_slots) + { + if (slot.m_slotType == PassSlotType::Output) + { + outputSlotCount++; + } + } + m_connections.resize(outputSlotCount); + + // Maybe move this default mapping to pass data. + uint32_t inputIndex = 0; + for (auto& connection : m_connections) + { + connection = inputIndex++; + } + } + + void SelectorPass::BuildAttachmentsInternal() + { + // Update output connections based on m_connections + // This need to be done after BuildAttachment is finished + for (uint32_t outputSlotIndex = 0; outputSlotIndex < m_connections.size(); outputSlotIndex++) + { + PassAttachmentBinding& outputBinding = GetOutputBinding(outputSlotIndex); + PassAttachmentBinding& inputBinding = GetInputBinding(m_connections[outputSlotIndex]); + outputBinding.m_attachment = inputBinding.m_attachment; + } + } + + void SelectorPass::Connect(uint32_t inputSlotIndex, uint32_t outputSlotIndex) + { + if (outputSlotIndex >= m_connections.size()) + { + AZ_Assert(false, "outputSlotIndex %d doesn't exist", outputSlotIndex); + return; + } + if (inputSlotIndex >= GetInputCount()) + { + AZ_Assert(false, "inputSlotIndex %d doesn't exist", inputSlotIndex); + return; + } + + m_connections[outputSlotIndex] = inputSlotIndex; + + // Queue to rebuild attachment connections + QueueForBuildAttachments(); + } + + void SelectorPass::Connect(const AZ::Name& inputSlot, const AZ::Name& outputSlot) + { + // Check whether both inputSlot or outputSlot are valid + uint32_t outputIdx, inputIdx; + for (outputIdx = 0; outputIdx < GetOutputCount(); ++outputIdx) + { + const PassAttachmentBinding& binding = GetOutputBinding(outputIdx); + if (outputSlot == binding.m_name) + { + break; + } + } + + if (outputIdx == GetOutputCount()) + { + AZ_Assert(false, "Can't find output slot %s", outputSlot.GetCStr()); + return; + } + + for (inputIdx = 0; inputIdx < GetInputCount(); ++inputIdx) + { + const PassAttachmentBinding& binding = GetInputBinding(inputIdx); + if (inputSlot == binding.m_name) + { + break; + } + } + + if (inputIdx == GetInputCount()) + { + AZ_Assert(false, "Can't find input slot %s", inputSlot.GetCStr()); + return; + } + + // Add connection to the map + m_connections[outputIdx] = inputIdx; + + // Queue to rebuild attachment connections + QueueForBuildAttachments(); + } + + } // namespace RPI +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/SwapChainPass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/SwapChainPass.cpp index 83ae615856..5bcec87df0 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/SwapChainPass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Specific/SwapChainPass.cpp @@ -40,7 +40,7 @@ namespace AZ childInputConnection.m_localSlot = "SwapChainOutput"; childInputConnection.m_attachmentRef.m_pass = "Parent"; childInputConnection.m_attachmentRef.m_attachment = "SwapChainOutput"; - childRequest.m_inputConnections.emplace_back(childInputConnection); + childRequest.m_connections.emplace_back(childInputConnection); m_childPass = passSystem->CreatePassFromRequest(&childRequest); AZ_Assert(m_childPass, "SwapChain child pass is invalid: check your passs pipeline, run configuration and your AssetProcessor set project (project_path)"); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/PipelineState.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/PipelineState.cpp index ef89afc891..545e71e117 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/PipelineState.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/PipelineState.cpp @@ -69,7 +69,7 @@ namespace AZ { RPI::ShaderOptionGroup shaderOptionGroup = shader->CreateShaderOptionGroup(); shaderOptionGroup.SetUnspecifiedToDefaultValues(); - for (auto optionAndValue : *optionAndValues) + for (const auto& optionAndValue : *optionAndValues) { shaderOptionGroup.SetValue(optionAndValue.first, optionAndValue.second); } @@ -211,6 +211,11 @@ namespace AZ return m_descriptor; } + const Data::Instance& PipelineStateForDraw::GetShader() const + { + return m_shader; + } + bool PipelineStateForDraw::UpdateSrgVariantFallback(Data::Instance& srg) const { if (m_isShaderVariantReady) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderResourceGroup.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderResourceGroup.cpp index 68c2fc7944..81a10c739e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderResourceGroup.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderResourceGroup.cpp @@ -152,13 +152,16 @@ namespace AZ bool ShaderResourceGroup::HasShaderVariantKeyFallbackEntry() const { - return GetLayout()->HasShaderVariantKeyFallbackEntry(); + return GetLayout()->HasShaderVariantKeyFallbackEntry(); } - - bool ShaderResourceGroup::SetImage(RHI::ShaderInputImageIndex inputIndex, const Data::Instance& image) + bool ShaderResourceGroup::SetImage(RHI::ShaderInputNameIndex& inputIndex, const Data::Instance& image, uint32_t arrayIndex) { - return SetImage(inputIndex, image, 0); + if (inputIndex.ValidateOrFindImageIndex(GetLayout())) + { + return SetImage(inputIndex.GetImageIndex(), image, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetImage(RHI::ShaderInputImageIndex inputIndex, const Data::Instance& image, uint32_t arrayIndex) @@ -178,9 +181,13 @@ namespace AZ return false; } - bool ShaderResourceGroup::SetImageArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view> images) + bool ShaderResourceGroup::SetImageArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view> images, uint32_t arrayIndex) { - return SetImageArray(inputIndex, images, 0); + if (inputIndex.ValidateOrFindImageIndex(GetLayout())) + { + return SetImageArray(inputIndex.GetImageIndex(), images, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetImageArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view> images, uint32_t arrayIndex) @@ -197,9 +204,13 @@ namespace AZ return false; } - const Data::Instance& ShaderResourceGroup::GetImage(RHI::ShaderInputImageIndex inputIndex) const + const Data::Instance& ShaderResourceGroup::GetImage(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex) const { - return GetImage(inputIndex, 0); + if (inputIndex.ValidateOrFindImageIndex(GetLayout())) + { + return GetImage(inputIndex.GetImageIndex(), arrayIndex); + } + return s_nullImage; } const Data::Instance& ShaderResourceGroup::GetImage(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex) const @@ -212,6 +223,15 @@ namespace AZ return s_nullImage; } + AZStd::array_view> ShaderResourceGroup::GetImageArray(RHI::ShaderInputNameIndex& inputIndex) const + { + if (inputIndex.ValidateOrFindImageIndex(GetLayout())) + { + return GetImageArray(inputIndex.GetImageIndex()); + } + return {}; + } + AZStd::array_view> ShaderResourceGroup::GetImageArray(RHI::ShaderInputImageIndex inputIndex) const { if (m_layout->ValidateAccess(inputIndex, 0)) @@ -222,9 +242,13 @@ namespace AZ return {}; } - bool ShaderResourceGroup::SetImageView(RHI::ShaderInputImageIndex inputIndex, const RHI::ImageView* imageView) + bool ShaderResourceGroup::SetImageView(RHI::ShaderInputNameIndex& inputIndex, const RHI::ImageView* imageView, uint32_t arrayIndex) { - return SetImageView(inputIndex, imageView, 0); + if (inputIndex.ValidateOrFindImageIndex(GetLayout())) + { + return SetImageView(inputIndex.GetImageIndex(), imageView, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetImageView(RHI::ShaderInputImageIndex inputIndex, const RHI::ImageView* imageView, uint32_t arrayIndex) @@ -241,9 +265,13 @@ namespace AZ return false; } - bool ShaderResourceGroup::SetImageViewArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view imageViews) + bool ShaderResourceGroup::SetImageViewArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex) { - return SetImageViewArray(inputIndex, imageViews, 0); + if (inputIndex.ValidateOrFindImageIndex(GetLayout())) + { + return SetImageViewArray(inputIndex.GetImageIndex(), imageViews, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetImageViewArray(RHI::ShaderInputImageIndex inputIndex, AZStd::array_view imageViews, uint32_t arrayIndex) @@ -260,9 +288,13 @@ namespace AZ return false; } - bool ShaderResourceGroup::SetBufferView(RHI::ShaderInputBufferIndex inputIndex, const RHI::BufferView* bufferView) + bool ShaderResourceGroup::SetBufferView(RHI::ShaderInputNameIndex& inputIndex, const RHI::BufferView* bufferView, uint32_t arrayIndex) { - return SetBufferView(inputIndex, bufferView, 0); + if (inputIndex.ValidateOrFindBufferIndex(GetLayout())) + { + return SetBufferView(inputIndex.GetBufferIndex(), bufferView, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetBufferView(RHI::ShaderInputBufferIndex inputIndex, const RHI::BufferView* bufferView, uint32_t arrayIndex) @@ -279,9 +311,13 @@ namespace AZ return false; } - bool ShaderResourceGroup::SetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews) + bool ShaderResourceGroup::SetBufferViewArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex) { - return SetBufferViewArray(inputIndex, bufferViews, 0); + if (inputIndex.ValidateOrFindBufferIndex(GetLayout())) + { + return SetBufferViewArray(inputIndex.GetBufferIndex(), bufferViews, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view bufferViews, uint32_t arrayIndex) @@ -298,9 +334,13 @@ namespace AZ return false; } - bool ShaderResourceGroup::SetSampler(RHI::ShaderInputSamplerIndex inputIndex, const RHI::SamplerState& sampler) + bool ShaderResourceGroup::SetSampler(RHI::ShaderInputNameIndex& inputIndex, const RHI::SamplerState& sampler, uint32_t arrayIndex) { - return m_data.SetSampler(inputIndex, sampler); + if (inputIndex.ValidateOrFindSamplerIndex(GetLayout())) + { + return SetSampler(inputIndex.GetSamplerIndex(), sampler, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetSampler(RHI::ShaderInputSamplerIndex inputIndex, const RHI::SamplerState& sampler, uint32_t arrayIndex) @@ -308,9 +348,13 @@ namespace AZ return m_data.SetSampler(inputIndex, sampler, arrayIndex); } - bool ShaderResourceGroup::SetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers) + bool ShaderResourceGroup::SetSamplerArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view samplers, uint32_t arrayIndex) { - return m_data.SetSamplerArray(inputIndex, samplers); + if (inputIndex.ValidateOrFindSamplerIndex(GetLayout())) + { + return SetSamplerArray(inputIndex.GetSamplerIndex(), samplers, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex, AZStd::array_view samplers, uint32_t arrayIndex) @@ -318,11 +362,29 @@ namespace AZ return m_data.SetSamplerArray(inputIndex, samplers, arrayIndex); } + bool ShaderResourceGroup::SetConstantRaw(RHI::ShaderInputNameIndex& inputIndex, const void* bytes, uint32_t byteCount) + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return SetConstantRaw(inputIndex.GetConstantIndex(), bytes, byteCount); + } + return false; + } + bool ShaderResourceGroup::SetConstantRaw(RHI::ShaderInputConstantIndex inputIndex, const void* bytes, uint32_t byteCount) { return m_data.SetConstantRaw(inputIndex, bytes, byteCount); } + bool ShaderResourceGroup::SetConstantRaw(RHI::ShaderInputNameIndex& inputIndex, const void* bytes, uint32_t byteOffset, uint32_t byteCount) + { + if (inputIndex.ValidateOrFindConstantIndex(GetLayout())) + { + return SetConstantRaw(inputIndex.GetConstantIndex(), bytes, byteOffset, byteCount); + } + return false; + } + bool ShaderResourceGroup::SetConstantRaw(RHI::ShaderInputConstantIndex inputIndex, const void* bytes, uint32_t byteOffset, uint32_t byteCount) { return m_data.SetConstantRaw(inputIndex, bytes, byteOffset, byteCount); @@ -344,9 +406,10 @@ namespace AZ return success; } - const RHI::ConstPtr& ShaderResourceGroup::GetImageView(RHI::ShaderInputImageIndex inputIndex) const + const RHI::ConstPtr& ShaderResourceGroup::GetImageView(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex) const { - return m_data.GetImageView(inputIndex, 0); + inputIndex.ValidateOrFindImageIndex(GetLayout()); + return GetImageView(inputIndex.GetImageIndex(), arrayIndex); } const RHI::ConstPtr& ShaderResourceGroup::GetImageView(RHI::ShaderInputImageIndex inputIndex, uint32_t arrayIndex) const @@ -354,14 +417,21 @@ namespace AZ return m_data.GetImageView(inputIndex, arrayIndex); } + AZStd::array_view> ShaderResourceGroup::GetImageViewArray(RHI::ShaderInputNameIndex& inputIndex) const + { + inputIndex.ValidateOrFindImageIndex(GetLayout()); + return GetImageViewArray(inputIndex.GetImageIndex()); + } + AZStd::array_view> ShaderResourceGroup::GetImageViewArray(RHI::ShaderInputImageIndex inputIndex) const { return m_data.GetImageViewArray(inputIndex); } - const RHI::ConstPtr& ShaderResourceGroup::GetBufferView(RHI::ShaderInputBufferIndex inputIndex) const + const RHI::ConstPtr& ShaderResourceGroup::GetBufferView(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex) const { - return m_data.GetBufferView(inputIndex, 0); + inputIndex.ValidateOrFindBufferIndex(GetLayout()); + return GetBufferView(inputIndex.GetBufferIndex(), arrayIndex); } const RHI::ConstPtr& ShaderResourceGroup::GetBufferView(RHI::ShaderInputBufferIndex inputIndex, uint32_t arrayIndex) const @@ -369,14 +439,24 @@ namespace AZ return m_data.GetBufferView(inputIndex, arrayIndex); } + AZStd::array_view> ShaderResourceGroup::GetBufferViewArray(RHI::ShaderInputNameIndex& inputIndex) const + { + inputIndex.ValidateOrFindBufferIndex(GetLayout()); + return GetBufferViewArray(inputIndex.GetBufferIndex()); + } + AZStd::array_view> ShaderResourceGroup::GetBufferViewArray(RHI::ShaderInputBufferIndex inputIndex) const { return m_data.GetBufferViewArray(inputIndex); } - bool ShaderResourceGroup::SetBuffer(RHI::ShaderInputBufferIndex inputIndex, const Data::Instance& buffer) + bool ShaderResourceGroup::SetBuffer(RHI::ShaderInputNameIndex& inputIndex, const Data::Instance& buffer, uint32_t arrayIndex) { - return SetBuffer(inputIndex, buffer, 0); + if (inputIndex.ValidateOrFindBufferIndex(GetLayout())) + { + return SetBuffer(inputIndex.GetBufferIndex(), buffer, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetBuffer(RHI::ShaderInputBufferIndex inputIndex, const Data::Instance& buffer, uint32_t arrayIndex) @@ -396,9 +476,13 @@ namespace AZ return false; } - bool ShaderResourceGroup::SetBufferArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view> buffers) + bool ShaderResourceGroup::SetBufferArray(RHI::ShaderInputNameIndex& inputIndex, AZStd::array_view> buffers, uint32_t arrayIndex) { - return SetBufferArray(inputIndex, buffers, 0); + if (inputIndex.ValidateOrFindBufferIndex(GetLayout())) + { + return SetBufferArray(inputIndex.GetBufferIndex(), buffers, arrayIndex); + } + return false; } bool ShaderResourceGroup::SetBufferArray(RHI::ShaderInputBufferIndex inputIndex, AZStd::array_view> buffers, uint32_t arrayIndex) @@ -415,9 +499,13 @@ namespace AZ return false; } - const Data::Instance& ShaderResourceGroup::GetBuffer(RHI::ShaderInputBufferIndex inputIndex) const + const Data::Instance& ShaderResourceGroup::GetBuffer(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex) const { - return GetBuffer(inputIndex, 0); + if (inputIndex.ValidateOrFindBufferIndex(GetLayout())) + { + return GetBuffer(inputIndex.GetBufferIndex(), arrayIndex); + } + return s_nullBuffer; } const Data::Instance& ShaderResourceGroup::GetBuffer(RHI::ShaderInputBufferIndex inputIndex, uint32_t arrayIndex) const @@ -430,6 +518,15 @@ namespace AZ return s_nullBuffer; } + AZStd::array_view> ShaderResourceGroup::GetBufferArray(RHI::ShaderInputNameIndex& inputIndex) const + { + if (inputIndex.ValidateOrFindBufferIndex(GetLayout())) + { + return GetBufferArray(inputIndex.GetBufferIndex()); + } + return {}; + } + AZStd::array_view> ShaderResourceGroup::GetBufferArray(RHI::ShaderInputBufferIndex inputIndex) const { if (m_layout->ValidateAccess(inputIndex, 0)) @@ -440,19 +537,38 @@ namespace AZ return {}; } + const RHI::SamplerState& ShaderResourceGroup::GetSampler(RHI::ShaderInputNameIndex& inputIndex, uint32_t arrayIndex) const + { + inputIndex.ValidateOrFindSamplerIndex(GetLayout()); + return GetSampler(inputIndex.GetSamplerIndex(), arrayIndex); + } + const RHI::SamplerState& ShaderResourceGroup::GetSampler(RHI::ShaderInputSamplerIndex inputIndex, uint32_t arrayIndex) const { return m_data.GetSampler(inputIndex, arrayIndex); } + AZStd::array_view ShaderResourceGroup::GetSamplerArray(RHI::ShaderInputNameIndex& inputIndex) const + { + inputIndex.ValidateOrFindSamplerIndex(GetLayout()); + return GetSamplerArray(inputIndex.GetSamplerIndex()); + } + AZStd::array_view ShaderResourceGroup::GetSamplerArray(RHI::ShaderInputSamplerIndex inputIndex) const { return m_data.GetSamplerArray(inputIndex); } + AZStd::array_view ShaderResourceGroup::GetConstantRaw(RHI::ShaderInputNameIndex& inputIndex) const + { + inputIndex.ValidateOrFindConstantIndex(GetLayout()); + return GetConstantRaw(inputIndex.GetConstantIndex()); + } + AZStd::array_view ShaderResourceGroup::GetConstantRaw(RHI::ShaderInputConstantIndex inputIndex) const { return m_data.GetConstantRaw(inputIndex); } + } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index fbfc2da286..4fe9843534 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -50,20 +50,6 @@ namespace AZ if (viewSrgAsset.IsReady()) { m_shaderResourceGroup = ShaderResourceGroup::Create(viewSrgAsset); - - if (m_shaderResourceGroup) - { - m_viewProjectionMatrixConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_viewProjectionMatrix" }); - m_worldPositionConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_worldPosition" }); - m_viewMatrixConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_viewMatrix" }); - m_viewMatrixInverseConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_viewMatrixInverse" }); - m_projectionMatrixConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_projectionMatrix" }); - m_projectionMatrixInverseConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_projectionMatrixInverse" }); - m_clipToWorldMatrixConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_viewProjectionInverseMatrix" }); - m_worldToClipPrevMatrixConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_viewProjectionPrevMatrix" }); - m_zConstantsConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_nearZ_farZ_farZTimesNearZ_farZMinusNearZ" }); - m_unprojectionConstantsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_unprojectionConstants" }); - } } } @@ -348,42 +334,15 @@ namespace AZ return; } - if (m_worldPositionConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_worldPositionConstantIndex, m_position); - } - if (m_viewProjectionMatrixConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_viewProjectionMatrixConstantIndex, m_worldToClipMatrix); - } - if (m_viewMatrixConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_viewMatrixConstantIndex, m_worldToViewMatrix); - } - if (m_viewMatrixInverseConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_viewMatrixInverseConstantIndex, m_worldToViewMatrix.GetInverseFull()); - } - if (m_projectionMatrixConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_projectionMatrixConstantIndex, m_viewToClipMatrix); - } - if (m_projectionMatrixInverseConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_projectionMatrixInverseConstantIndex, m_viewToClipMatrix.GetInverseFull()); - } - if (m_zConstantsConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_zConstantsConstantIndex, m_nearZ_farZ_farZTimesNearZ_farZMinusNearZ); - } - if (m_clipToWorldMatrixConstantIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_clipToWorldMatrixConstantIndex, m_clipToWorldMatrix); - } - if (m_unprojectionConstantsIndex.IsValid()) - { - m_shaderResourceGroup->SetConstant(m_unprojectionConstantsIndex, m_unprojectionConstants); - } + m_shaderResourceGroup->SetConstant(m_worldPositionConstantIndex, m_position); + m_shaderResourceGroup->SetConstant(m_viewProjectionMatrixConstantIndex, m_worldToClipMatrix); + m_shaderResourceGroup->SetConstant(m_viewMatrixConstantIndex, m_worldToViewMatrix); + m_shaderResourceGroup->SetConstant(m_viewMatrixInverseConstantIndex, m_worldToViewMatrix.GetInverseFull()); + m_shaderResourceGroup->SetConstant(m_projectionMatrixConstantIndex, m_viewToClipMatrix); + m_shaderResourceGroup->SetConstant(m_projectionMatrixInverseConstantIndex, m_viewToClipMatrix.GetInverseFull()); + m_shaderResourceGroup->SetConstant(m_zConstantsConstantIndex, m_nearZ_farZ_farZTimesNearZ_farZMinusNearZ); + m_shaderResourceGroup->SetConstant(m_clipToWorldMatrixConstantIndex, m_clipToWorldMatrix); + m_shaderResourceGroup->SetConstant(m_unprojectionConstantsIndex, m_unprojectionConstants); m_shaderResourceGroup->Compile(); m_needBuildSrg = false; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp index 243b95b704..88c1215a08 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp @@ -95,6 +95,8 @@ namespace AZ m_currentPipeline.reset(); UpdatePipelineView(); } + + m_sceneChangedEvent.Signal(scene); } void ViewportContext::RenderTick() @@ -140,6 +142,11 @@ namespace AZ handler.Connect(m_projectionMatrixChangedEvent); } + void ViewportContext::ConnectSceneChangedHandler(SceneChangedEvent::Handler& handler) + { + handler.Connect(m_sceneChangedEvent); + } + const AZ::Matrix4x4& ViewportContext::GetCameraViewMatrix() const { return GetDefaultView()->GetWorldToViewMatrix(); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp index 3eec6ea00d..8ab6339015 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp @@ -197,13 +197,19 @@ namespace AZ AZ_Assert((view->GetUsageFlags() & View::UsageFlags::UsageCamera) != 0, "Attempted to register a non-camera view to context \"%s\", ensure the view is flagged with UsageCamera", context.GetCStr()); ViewPtrStack& associatedViews = GetOrCreateViewStackForContext(context); + if (auto it = AZStd::find(associatedViews.begin(), associatedViews.end(), view); it != associatedViews.end()) + { + // Remove from its existing position, if any, before re-adding below + associatedViews.erase(it); + } + associatedViews.push_back(view); } UpdateViewForContext(context); } - void ViewportContextManager::PopView(const Name& context, ViewPtr view) + bool ViewportContextManager::PopView(const Name& context, ViewPtr view) { { AZStd::lock_guard lock(m_containerMutex); @@ -211,25 +217,24 @@ namespace AZ auto viewStackIt = m_viewportViews.find(context); if (viewStackIt == m_viewportViews.end()) { - AZ_Assert(false, "Attempted to pop a view for context \"%s\" with no stack!", context.GetCStr()); - return; + return false; } ViewPtrStack& associatedViews = viewStackIt->second; if (view == associatedViews[0]) { AZ_Assert(false, "Attempted to pop the root view for context \"%s\"", context.GetCStr()); - return; + return false; } auto viewIt = AZStd::find(associatedViews.begin(), associatedViews.end(), view); if (viewIt == associatedViews.end()) { - AZ_Assert(false, "View to pop not found in context \"%s\"", context.GetCStr()); - return; + return false; } associatedViews.erase(viewIt); } UpdateViewForContext(context); + return true; } ViewPtr ViewportContextManager::GetCurrentView(const Name& context) const diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelKdTree.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelKdTree.cpp index 05b45adc58..82c8fc803a 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelKdTree.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelKdTree.cpp @@ -10,6 +10,7 @@ * */ +#include #include #include @@ -17,33 +18,24 @@ namespace AZ { namespace RPI { - ModelKdTree::ESplitAxis ModelKdTree::SearchForBestSplitAxis(const AZ::Aabb& aabb, float& splitPosition) + AZStd::tuple ModelKdTree::SearchForBestSplitAxis(const AZ::Aabb& aabb) { const float xsize = aabb.GetXExtent(); const float ysize = aabb.GetYExtent(); const float zsize = aabb.GetZExtent(); - ModelKdTree::ESplitAxis axis; if (xsize >= ysize && xsize >= zsize) { - axis = ModelKdTree::eSA_X; - splitPosition = aabb.GetMin().GetX() + xsize * 0.5f; + return {ModelKdTree::eSA_X, aabb.GetMin().GetX() + xsize * 0.5f}; } - else if (ysize >= zsize && ysize >= xsize) + if (ysize >= zsize && ysize >= xsize) { - axis = ModelKdTree::eSA_Y; - splitPosition = aabb.GetMin().GetY() + ysize * 0.5f; + return {ModelKdTree::eSA_Y, aabb.GetMin().GetY() + ysize * 0.5f}; } - else - { - axis = ModelKdTree::eSA_Z; - splitPosition = aabb.GetMin().GetZ() + zsize * 0.5f; - } - - return axis; + return {ModelKdTree::eSA_Z, aabb.GetMin().GetZ() + zsize * 0.5f}; } - bool ModelKdTree::SplitNode(const AZ::Aabb& boundbox, const AZStd::vector& indices, ModelKdTree::ESplitAxis splitAxis, float splitPos, SSplitInfo& outInfo) + bool ModelKdTree::SplitNode(const AZ::Aabb& boundbox, const AZStd::vector& indices, ModelKdTree::ESplitAxis splitAxis, float splitPos, SSplitInfo& outInfo) { if (splitAxis != ModelKdTree::eSA_X && splitAxis != ModelKdTree::eSA_Y && splitAxis != ModelKdTree::eSA_Z) { @@ -68,47 +60,35 @@ namespace AZ outInfo.m_aboveIndices.reserve(iIndexSize); outInfo.m_belowIndices.reserve(iIndexSize); - AZStd::array triangleVertex; - for (AZ::u32 i = 0; i <= iIndexSize - 3; i += 3) + for (const auto& [nObjIndex, triangleIndices] : indices) { - const AZ::u32 nObjIndex = (indices[i] & 0xFF000000) >> 24; // asuming that all 3 verices belong to the same triangle from the same object - const AZ::u32 nVertexIndices[3] = { indices[i] & 0xFFFFFF, indices[i + 1] & 0xFFFFFF, indices[i + 2] & 0xFFFFFF }; + const auto& [first, second, third] = triangleIndices; const AZStd::array_view& positionBuffer = m_meshes[nObjIndex].m_vertexData; - if (positionBuffer.empty() == false) - { - for (AZStd::size_t triangleVertexIndex = 0; triangleVertexIndex < triangleVertex.size(); ++triangleVertexIndex) - { - triangleVertex[triangleVertexIndex].Set(const_cast(positionBuffer.data() + 3 * nVertexIndices[triangleVertexIndex])); - } - } - else + if (positionBuffer.empty()) { continue; } - if (triangleVertex[0].GetElement(splitAxis) < splitPos || triangleVertex[1].GetElement(splitAxis) < splitPos || triangleVertex[2].GetElement(splitAxis) < splitPos) + // If the split axis is Y, this uses a Vector3 to store the Y positions of each vertex in the triangle. + const AZStd::array triangleVerticesValuesForThisSplitAxis { + positionBuffer[first * 3 + splitAxis], positionBuffer[second * 3 + splitAxis], positionBuffer[third * 3 + splitAxis] + }; + + if (AZStd::any_of(begin(triangleVerticesValuesForThisSplitAxis), end(triangleVerticesValuesForThisSplitAxis), [splitPos](const float value) { return value < splitPos; })) { - outInfo.m_aboveIndices.push_back(indices[i + 0]); - outInfo.m_aboveIndices.push_back(indices[i + 1]); - outInfo.m_aboveIndices.push_back(indices[i + 2]); + outInfo.m_aboveIndices.emplace_back(nObjIndex, triangleIndices); } - if (triangleVertex[0].GetElement(splitAxis) >= splitPos || triangleVertex[1].GetElement(splitAxis) >= splitPos || triangleVertex[2].GetElement(splitAxis) >= splitPos) + if (AZStd::any_of(begin(triangleVerticesValuesForThisSplitAxis), end(triangleVerticesValuesForThisSplitAxis), [splitPos](const float value) { return value >= splitPos; })) { - outInfo.m_belowIndices.push_back(indices[i + 0]); - outInfo.m_belowIndices.push_back(indices[i + 1]); - outInfo.m_belowIndices.push_back(indices[i + 2]); + outInfo.m_belowIndices.emplace_back(nObjIndex, triangleIndices); } } - if (indices.size() == outInfo.m_aboveIndices.size() || indices.size() == outInfo.m_belowIndices.size()) - { - // triangles are too close to cut any further - return false; - } - - return true; + // If either the top or bottom contain all the input indices, the triangles are too close to cut any + // further and the split failed + return indices.size() != outInfo.m_aboveIndices.size() && indices.size() != outInfo.m_belowIndices.size(); } bool ModelKdTree::Build(const ModelAsset* model) @@ -120,34 +100,32 @@ namespace AZ ConstructMeshList(model, AZ::Transform::CreateIdentity()); - AZ::Aabb entireBoundBox; - entireBoundBox.SetNull(); + AZ::Aabb entireBoundBox = AZ::Aabb::CreateNull(); // indices with object ids - AZStd::vector indices; + AZStd::vector indices; - int totalSizeNeed = 0; - for (const MeshData& data : m_meshes) + const size_t totalSizeNeed = AZStd::accumulate(begin(m_meshes), end(m_meshes), size_t{0}, [](const size_t current, const MeshData& data) { - totalSizeNeed += data.m_mesh->GetVertexCount(); - } + return current + data.m_mesh->GetVertexCount(); + }); indices.reserve(totalSizeNeed); - AZ::Vector3 vertex; - - for (AZ::u32 meshIndex = 0, meshCount = aznumeric_cast(m_meshes.size()); meshIndex < meshCount; ++meshIndex) + for (AZ::u8 meshIndex = 0, meshCount = aznumeric_caster(m_meshes.size()); meshIndex < meshCount; ++meshIndex) { - AZStd::array_view positionBuffer = m_meshes[meshIndex].m_vertexData; - if (positionBuffer.empty() == false) + const AZStd::array_view positionBuffer = m_meshes[meshIndex].m_vertexData; + for (size_t positionIndex = 0; positionIndex < positionBuffer.size(); positionIndex += 3) { - const int nVertexCount = m_meshes[meshIndex].m_mesh->GetVertexCount(); - for (int k = 0; k < nVertexCount; ++k) - { - vertex.Set(const_cast((positionBuffer.data() + 3 * k))); + entireBoundBox.AddPoint({positionBuffer[positionIndex], positionBuffer[positionIndex + 1], positionBuffer[positionIndex + 2]}); + } - entireBoundBox.AddPoint(vertex); - indices.push_back((meshIndex << 24) | k); - } + // The view returned by GetIndexBuffer returns a tuple, in order to read + // 3 values at a time from the raw index buffer. It uses a reinterpret_cast to accomplish this. The + // cast results in the order of the indices being reversed, which is why they are read [third, second, + // first] here. + for (const auto& [thirdIndex, secondIndex, firstIndex] : GetIndexBuffer(*m_meshes[meshIndex].m_mesh)) + { + indices.emplace_back(meshIndex, TriangleIndices{firstIndex, secondIndex, thirdIndex}); } } @@ -160,18 +138,34 @@ namespace AZ AZStd::array_view ModelKdTree::GetPositionsBuffer(const ModelLodAsset::Mesh& mesh) { - const AZStd::array_view positionRawBuffer = mesh.GetSemanticBuffer(m_positionName); - if (positionRawBuffer.empty() == false) + const BufferAssetView* positionBufferAssetView = mesh.GetSemanticBufferAssetView(AZ::Name{"POSITION"}); + if (positionBufferAssetView) { - AZStd::array_view floatBuffer(reinterpret_cast(positionRawBuffer.data()), positionRawBuffer.size() / 12); - return floatBuffer; + const AZStd::array_view positionRawBuffer = positionBufferAssetView->GetBufferAsset()->GetBuffer(); + const auto size = positionBufferAssetView->GetBufferViewDescriptor().m_elementSize; + return { + reinterpret_cast(positionRawBuffer.data() + positionBufferAssetView->GetBufferViewDescriptor().m_elementOffset * size), + positionBufferAssetView->GetBufferViewDescriptor().m_elementCount * size / sizeof(float) + }; } AZ_Warning("ModelKdTree", false, "Could not find position buffers in a mesh"); return {}; } - void ModelKdTree::BuildRecursively(ModelKdTreeNode* pNode, const AZ::Aabb& boundbox, AZStd::vector& indices) + AZStd::array_view ModelKdTree::GetIndexBuffer(const ModelLodAsset::Mesh& mesh) + { + const BufferAssetView& indexBufferAssetView = mesh.GetIndexBufferAssetView(); + const AZStd::array_view indexRawBuffer = indexBufferAssetView.GetBufferAsset()->GetBuffer(); + const auto size = indexBufferAssetView.GetBufferViewDescriptor().m_elementSize; + static_assert(sizeof(TriangleIndices) == 3 * sizeof(uint32_t)); + return { + reinterpret_cast(indexRawBuffer.data() + indexBufferAssetView.GetBufferViewDescriptor().m_elementOffset * size), + indexBufferAssetView.GetBufferViewDescriptor().m_elementCount * size / sizeof(TriangleIndices) + }; + } + + void ModelKdTree::BuildRecursively(ModelKdTreeNode* pNode, const AZ::Aabb& boundbox, AZStd::vector& indices) { pNode->SetBoundBox(boundbox); @@ -181,8 +175,7 @@ namespace AZ return; } - float splitPos(0); - const ESplitAxis splitAxis = SearchForBestSplitAxis(boundbox, splitPos); + const auto [splitAxis, splitPos] = SearchForBestSplitAxis(boundbox); pNode->SetSplitAxis(splitAxis); pNode->SetSplitPos(splitPos); @@ -208,20 +201,23 @@ namespace AZ void ModelKdTree::ConstructMeshList(const ModelAsset* model, [[maybe_unused]] const AZ::Transform& matParent) { - if (model == nullptr) + if (model == nullptr || model->GetLodAssets().empty()) { return; } - if (model->GetLodAssets().empty() == false) + if (ModelLodAsset* lodAssetPtr = model->GetLodAssets()[0].Get()) { - if (ModelLodAsset* loadAssetPtr = model->GetLodAssets()[0].Get()) - { - for (const ModelLodAsset::Mesh& data : loadAssetPtr->GetMeshes()) - { - m_meshes.push_back({ &data, GetPositionsBuffer(data) }); - } - } + AZ_Warning("ModelKdTree", lodAssetPtr->GetMeshes().size() <= std::numeric_limits::max() + 1, + "KdTree generation doesn't support models with greater than 256 meshes. RayIntersection results will be incorrect " + "unless the meshes are merged or broken up into multiple models"); + const size_t size = AZStd::min(lodAssetPtr->GetMeshes().size(), std::numeric_limits::max() + 1); + m_meshes.reserve(size); + AZStd::transform( + lodAssetPtr->GetMeshes().begin(), AZStd::next(lodAssetPtr->GetMeshes().begin(), size), + AZStd::back_inserter(m_meshes), + [](const auto& mesh) { return MeshData{&mesh, GetPositionsBuffer(mesh)}; } + ); } } @@ -261,25 +257,24 @@ namespace AZ const float maxDist(FLT_MAX); float nearestDist = maxDist; - for (AZ::u32 i = 0; i <= nVBuffSize - 3; i += 3) + for (AZ::u32 i = 0; i < nVBuffSize; ++i) { - const AZ::u32 nVertexIndex = pNode->GetVertexIndex(i); + const auto& [first, second, third] = pNode->GetVertexIndex(i); const AZ::u32 nObjIndex = pNode->GetObjIndex(i); AZStd::array_view positionBuffer = m_meshes[nObjIndex].m_vertexData; - AZStd::array trianglePoints; - if (positionBuffer.empty() == false) - { - trianglePoints[0].Set(const_cast(positionBuffer.data() + 3 * nVertexIndex)); - trianglePoints[1].Set(const_cast(positionBuffer.data() + 3 * pNode->GetVertexIndex(i + 1))); - trianglePoints[2].Set(const_cast(positionBuffer.data() + 3 * pNode->GetVertexIndex(i + 2))); - } - else + if (positionBuffer.empty()) { continue; } + const AZStd::array trianglePoints { + AZ::Vector3{positionBuffer[first * 3 + 0], positionBuffer[first * 3 + 1], positionBuffer[first * 3 + 2]}, + AZ::Vector3{positionBuffer[second * 3 + 0], positionBuffer[second * 3 + 1], positionBuffer[second * 3 + 2]}, + AZ::Vector3{positionBuffer[third * 3 + 0], positionBuffer[third * 3 + 1], positionBuffer[third * 3 + 2]}, + }; + const AZ::Vector3 rayEnd = raySrc + rayDir * distance; if (AZ::Intersect::IntersectSegmentTriangleCCW(raySrc, rayEnd, trianglePoints[0], trianglePoints[1], trianglePoints[2], diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/MorphTargetDelta.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/MorphTargetDelta.cpp new file mode 100644 index 0000000000..287f7892c7 --- /dev/null +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/MorphTargetDelta.cpp @@ -0,0 +1,82 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +namespace AZ::RPI +{ + static_assert(sizeof(PackedCompressedMorphTargetDelta) == 32, "The morph target compute shader expects a structured buffer that is exactly 32 bytes per element. If you change MorphTargetDelta, be sure to update MorphTargetSRG.azsli"); + + PackedCompressedMorphTargetDelta PackMorphTargetDelta(const CompressedMorphTargetDelta& compressedDelta) + { + PackedCompressedMorphTargetDelta packedDelta{ 0,0,0,0,0,{0,0,0} }; + packedDelta.m_morphedVertexIndex = compressedDelta.m_morphedVertexIndex; + + // Position x is in the most significant 16 bits, y is in the least significant 16 bits + packedDelta.m_positionXY |= (static_cast(compressedDelta.m_positionX) << 16); + packedDelta.m_positionXY |= static_cast(compressedDelta.m_positionY); + + // Position z is in the most significant 16 bits + packedDelta.m_positionZNormalXY |= static_cast(compressedDelta.m_positionZ) << 16; + + // Normal x and y are in the least significant 16 bits (8 bits per channel) + packedDelta.m_positionZNormalXY |= static_cast(compressedDelta.m_normalX) << 8; + packedDelta.m_positionZNormalXY |= static_cast(compressedDelta.m_normalY); + + // Normal z is in the most significant 8 bits + packedDelta.m_normalZTangentXYZ |= static_cast(compressedDelta.m_normalZ) << 24; + + // Tangent x, y, and z are in the least significant 24 bits (8 bits per channel) + packedDelta.m_normalZTangentXYZ |= static_cast(compressedDelta.m_tangentX) << 16; + packedDelta.m_normalZTangentXYZ |= static_cast(compressedDelta.m_tangentY) << 8; + packedDelta.m_normalZTangentXYZ |= static_cast(compressedDelta.m_tangentZ); + + // Bitangents are in the least significant 24 bits (8 bits per channel) + packedDelta.m_padBitangentXYZ |= static_cast(compressedDelta.m_bitangentX) << 16; + packedDelta.m_padBitangentXYZ |= static_cast(compressedDelta.m_bitangentY) << 8; + packedDelta.m_padBitangentXYZ |= static_cast(compressedDelta.m_bitangentZ); + + return packedDelta; + } + + CompressedMorphTargetDelta UnpackMorphTargetDelta(const PackedCompressedMorphTargetDelta& packedDelta) + { + CompressedMorphTargetDelta compressedDelta; + compressedDelta.m_morphedVertexIndex = packedDelta.m_morphedVertexIndex; + + // Position x is in the most significant 16 bits, y is in the least significant 16 bits + compressedDelta.m_positionX = packedDelta.m_positionXY >> 16; + compressedDelta.m_positionY = packedDelta.m_positionXY & 0x0000FFFF; + + // Position z is in the most significant 16 bits + compressedDelta.m_positionZ = packedDelta.m_positionZNormalXY >> 16; + + // Normal x and y are in the least significant 16 bits (8 bits per channel) + compressedDelta.m_normalX = (packedDelta.m_positionZNormalXY >> 8) & 0x000000FF; + compressedDelta.m_normalY = packedDelta.m_positionZNormalXY & 0x000000FF; + + // Normal z is in the most significant 8 bits + compressedDelta.m_normalZ = packedDelta.m_normalZTangentXYZ >> 24; + + // Tangent x, y, and z are in the least significant 24 bits (8 bits per channel) + compressedDelta.m_tangentX = (packedDelta.m_normalZTangentXYZ >> 16) & 0x000000FF; + compressedDelta.m_tangentY = (packedDelta.m_normalZTangentXYZ >> 8 ) & 0x000000FF; + compressedDelta.m_tangentZ = packedDelta.m_normalZTangentXYZ & 0x000000FF; + + // Bitangents are in the least significant 24 bits (8 bits per channel) + compressedDelta.m_bitangentX = (packedDelta.m_padBitangentXYZ >> 16) & 0x000000FF; + compressedDelta.m_bitangentY = (packedDelta.m_padBitangentXYZ >> 8 ) & 0x000000FF; + compressedDelta.m_bitangentZ = packedDelta.m_padBitangentXYZ & 0x000000FF; + + return compressedDelta; + } +} // namespace AZ::RPI diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassRequest.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassRequest.cpp index db437635a7..79fecfa43f 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassRequest.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassRequest.cpp @@ -21,21 +21,23 @@ namespace AZ if (auto* serializeContext = azrtti_cast(context)) { serializeContext->Class() - ->Version(2) + ->Version(3) ->Field("Name", &PassRequest::m_passName) ->Field("TemplateName", &PassRequest::m_templateName) - ->Field("Connections", &PassRequest::m_inputConnections) + ->Field("Connections", &PassRequest::m_connections) ->Field("PassData", &PassRequest::m_passData) ->Field("Enabled", &PassRequest::m_passEnabled) ->Field("ExecuteAfter", &PassRequest::m_executeAfterPasses) ->Field("ExecuteBefore", &PassRequest::m_executeBeforePasses) + ->Field("ImageAttachments", &PassRequest::m_imageAttachmentOverrides) + ->Field("BufferAttachments", &PassRequest::m_bufferAttachmentOverrides) ; } } void PassRequest::AddInputConnection(PassConnection inputConnection) { - m_inputConnections.push_back(inputConnection); + m_connections.push_back(inputConnection); } } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassTemplate.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassTemplate.cpp index 758e1b0529..9b6c8c02ac 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassTemplate.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Pass/PassTemplate.cpp @@ -30,7 +30,7 @@ namespace AZ ->Field("Slots", &PassTemplate::m_slots) ->Field("ImageAttachments", &PassTemplate::m_imageAttachments) ->Field("BufferAttachments", &PassTemplate::m_bufferAttachments) - ->Field("Connections", &PassTemplate::m_outputConnections) + ->Field("Connections", &PassTemplate::m_connections) ->Field("FallbackConnections", &PassTemplate::m_fallbackConnections) ->Field("PassRequests", &PassTemplate::m_passRequests) ->Field("PassData", &PassTemplate::m_passData) @@ -71,7 +71,7 @@ namespace AZ void PassTemplate::AddOutputConnection(PassConnection connection) { - m_outputConnections.push_back(connection); + m_connections.push_back(connection); } void PassTemplate::AddImageAttachment(PassImageAttachmentDesc imageAttachment) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp index 38c4a7b8af..fa791537e7 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp @@ -338,7 +338,7 @@ namespace AZ } else { - AZ_Assert(false, "Could not find shader for API %s in shader %s", RHI::Factory::Get().GetName().GetCStr(), GetName().GetCStr()); + AZ_Error("ShaderAsset", false, "Could not find shader for API %s in shader %s", RHI::Factory::Get().GetName().GetCStr(), GetName().GetCStr()); return false; } } diff --git a/Gems/Atom/RPI/Code/Tests/Model/ModelTests.cpp b/Gems/Atom/RPI/Code/Tests/Model/ModelTests.cpp index c26a39e7f1..7764187b8a 100644 --- a/Gems/Atom/RPI/Code/Tests/Model/ModelTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Model/ModelTests.cpp @@ -14,9 +14,11 @@ #include #include #include +#include #include #include +#include #include #include @@ -27,6 +29,60 @@ namespace UnitTest { + AZ::Data::Asset BuildTestBuffer(const uint32_t elementCount, const uint32_t elementSize) + { + using namespace AZ; + + const uint32_t bufferSize = elementCount * elementSize; + + AZStd::vector bufferData; + bufferData.resize(bufferSize); + + //The actual data doesn't matter + for (uint32_t i = 0; i < bufferData.size(); ++i) + { + bufferData[i] = i; + } + + Data::Asset bufferPoolAsset; + + { + auto bufferPoolDesc = AZStd::make_unique(); + bufferPoolDesc->m_bindFlags = RHI::BufferBindFlags::InputAssembly; + bufferPoolDesc->m_heapMemoryLevel = RHI::HeapMemoryLevel::Host; + + RPI::ResourcePoolAssetCreator creator; + creator.Begin(Uuid::CreateRandom()); + creator.SetPoolDescriptor(AZStd::move(bufferPoolDesc)); + creator.SetPoolName("TestPool"); + EXPECT_TRUE(creator.End(bufferPoolAsset)); + } + + Data::Asset asset; + + { + RHI::BufferDescriptor bufferDescriptor; + bufferDescriptor.m_bindFlags = RHI::BufferBindFlags::InputAssembly; + bufferDescriptor.m_byteCount = bufferSize; + + RHI::BufferViewDescriptor bufferViewDescriptor = + RHI::BufferViewDescriptor::CreateStructured(0, elementCount, elementSize); + + RPI::BufferAssetCreator creator; + + creator.Begin(AZ::Uuid::CreateRandom()); + creator.SetPoolAsset(bufferPoolAsset); + creator.SetBuffer(bufferData.data(), bufferDescriptor.m_byteCount, bufferDescriptor); + creator.SetBufferViewDescriptor(bufferViewDescriptor); + + EXPECT_TRUE(creator.End(asset)); + EXPECT_TRUE(asset.IsReady()); + EXPECT_NE(asset.Get(), nullptr); + } + + return asset; + } + class ModelTests : public RPITestFixture { @@ -82,60 +138,6 @@ namespace UnitTest return true; } - AZ::Data::Asset BuildTestBuffer(const uint32_t elementCount, const uint32_t elementSize) - { - using namespace AZ; - - const uint32_t bufferSize = elementCount * elementSize; - - AZStd::vector bufferData; - bufferData.resize(bufferSize); - - //The actual data doesn't matter - for (uint32_t i = 0; i < bufferData.size(); ++i) - { - bufferData[i] = i; - } - - Data::Asset bufferPoolAsset; - - { - auto bufferPoolDesc = AZStd::make_unique(); - bufferPoolDesc->m_bindFlags = RHI::BufferBindFlags::InputAssembly; - bufferPoolDesc->m_heapMemoryLevel = RHI::HeapMemoryLevel::Host; - - RPI::ResourcePoolAssetCreator creator; - creator.Begin(Uuid::CreateRandom()); - creator.SetPoolDescriptor(AZStd::move(bufferPoolDesc)); - creator.SetPoolName("TestPool"); - EXPECT_TRUE(creator.End(bufferPoolAsset)); - } - - Data::Asset asset; - - { - RHI::BufferDescriptor bufferDescriptor; - bufferDescriptor.m_bindFlags = RHI::BufferBindFlags::InputAssembly; - bufferDescriptor.m_byteCount = bufferSize; - - RHI::BufferViewDescriptor bufferViewDescriptor = - RHI::BufferViewDescriptor::CreateStructured(0, elementCount, elementSize); - - RPI::BufferAssetCreator creator; - - creator.Begin(AZ::Uuid::CreateRandom()); - creator.SetPoolAsset(bufferPoolAsset); - creator.SetBuffer(bufferData.data(), bufferDescriptor.m_byteCount, bufferDescriptor); - creator.SetBufferViewDescriptor(bufferViewDescriptor); - - EXPECT_TRUE(creator.End(asset)); - EXPECT_TRUE(asset.IsReady()); - EXPECT_NE(asset.Get(), nullptr); - } - - return asset; - } - AZ::Data::Asset BuildTestLod(const uint32_t sharedMeshCount, const uint32_t separateMeshCount, ExpectedLod& expectedLod) { using namespace AZ; @@ -915,4 +917,167 @@ namespace UnitTest creator.EndMesh(); } } -} // namespace UnitTest + + // This class creates a Model with one LOD, whose mesh contains 2 planes. Plane 1 is in the XY plane at Z=-0.5, and + // plane 2 is in the XY plane at Z=0.5. The two planes each have 9 quads which have been triangulated. It only has + // a position and index buffer. + // + // -0.33 + // -1 0.33 1 + // 0.5 *---*---*---* + // \ / \ / \ / \ + // *---*---*---* + // \ / \ / \ / \ + // -0.5 *- *---*---*---* + // \ \ / \ / \ / \ + // *- *---*---*---* + // \ \ \ \ + // *---*---*---* + // \ / \ / \ / \ + // *---*---*---* + class TwoSeparatedPlanesMesh + { + public: + TwoSeparatedPlanesMesh() + { + using namespace AZ; + + RPI::ModelLodAssetCreator lodCreator; + lodCreator.Begin(Data::AssetId(AZ::Uuid::CreateRandom())); + + lodCreator.BeginMesh(); + lodCreator.SetMeshAabb(Aabb::CreateFromMinMax({-1.0f, -1.0f, -0.5f}, {1.0f, 1.0f, 0.5f})); + lodCreator.SetMeshMaterialAsset( + AZ::Data::Asset(AZ::Data::AssetId(AZ::Uuid::CreateRandom(), 0), + AZ::AzTypeInfo::Uuid(), "") + ); + + { + AZ::Data::Asset indexBuffer = BuildTestBuffer(s_indexes.size(), sizeof(uint32_t)); + AZStd::copy(s_indexes.begin(), s_indexes.end(), reinterpret_cast(const_cast(indexBuffer->GetBuffer().data()))); + lodCreator.SetMeshIndexBuffer({ + indexBuffer, + RHI::BufferViewDescriptor::CreateStructured(0, s_indexes.size(), sizeof(uint32_t)) + }); + } + + { + AZ::Data::Asset positionBuffer = BuildTestBuffer(s_positions.size() / 3, sizeof(float) * 3); + AZStd::copy(s_positions.begin(), s_positions.end(), reinterpret_cast(const_cast(positionBuffer->GetBuffer().data()))); + lodCreator.AddMeshStreamBuffer( + AZ::RHI::ShaderSemantic(AZ::Name("POSITION")), + AZ::Name(), + { + positionBuffer, + RHI::BufferViewDescriptor::CreateStructured(0, s_positions.size() / 3, sizeof(float) * 3) + } + ); + } + lodCreator.EndMesh(); + + Data::Asset lodAsset; + lodCreator.End(lodAsset); + + RPI::ModelAssetCreator modelCreator; + modelCreator.Begin(Data::AssetId(AZ::Uuid::CreateRandom())); + modelCreator.SetName("TestModel"); + modelCreator.AddLodAsset(AZStd::move(lodAsset)); + modelCreator.End(m_modelAsset); + } + + [[nodiscard]] AZ::Data::Asset GetModel() const + { + return m_modelAsset; + } + + private: + AZ::Data::Asset m_modelAsset; + + static constexpr AZStd::array s_positions{ + -1.0f, -0.333f, -0.5f, -0.333f, -1.0f, -0.5f, -0.333f, -0.333f, -0.5f, 0.333f, -0.333f, -0.5f, 1.0f, -1.0f, -0.5f, + 1.0f, -0.333f, -0.5f, 0.333f, -1.0f, -0.5f, 0.333f, 1.0f, -0.5f, 1.0f, 0.333f, -0.5f, 1.0f, 1.0f, -0.5f, + 0.333f, 0.333f, -0.5f, -0.333f, 1.0f, -0.5f, -0.333f, 0.333f, -0.5f, -1.0f, 1.0f, -0.5f, -1.0f, 0.333f, -0.5f, + -1.0f, -0.333f, 0.5f, -0.333f, -1.0f, 0.5f, -0.333f, -0.333f, 0.5f, 0.333f, -0.333f, 0.5f, 1.0f, -1.0f, 0.5f, + 1.0f, -0.333f, 0.5f, -0.333f, -0.333f, 0.5f, 0.333f, -1.0f, 0.5f, 0.333f, -0.333f, 0.5f, 0.333f, 1.0f, 0.5f, + 1.0f, 0.333f, 0.5f, 1.0f, 1.0f, 0.5f, 0.333f, 0.333f, 0.5f, 1.0f, -0.333f, 0.5f, -0.333f, 1.0f, 0.5f, + -0.333f, 0.333f, 0.5f, 0.333f, -0.333f, 0.5f, 0.333f, 0.333f, 0.5f, -1.0f, 1.0f, 0.5f, -0.333f, 0.333f, 0.5f, + -1.0f, 0.333f, 0.5f, -1.0f, -1.0f, -0.5f, -1.0f, -1.0f, 0.5f, 0.333f, -0.333f, 0.5f, 0.333f, -1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, 0.333f, -1.0f, 0.5f, 0.333f, 0.333f, 0.5f, 0.333f, -0.333f, 0.5f, 1.0f, -0.333f, 0.5f, + -0.333f, 0.333f, 0.5f, -0.333f, -0.333f, 0.5f, 0.333f, -0.333f, 0.5f, + }; + static constexpr AZStd::array s_indexes{ + uint32_t{0}, 1, 2, 3, 4, 5, 2, 6, 3, 7, 8, 9, 10, 5, 8, 11, 10, 7, 12, 3, 10, 13, 12, 11, 14, 2, 12, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 25, 29, 27, 24, 30, 31, 32, 33, 34, 29, 35, 17, 34, + 0, 36, 1, 3, 6, 4, 2, 1, 6, 7, 10, 8, 10, 3, 5, 11, 12, 10, 12, 2, 3, 13, 14, 12, 14, 0, 2, + 15, 37, 16, 38, 39, 40, 17, 16, 41, 24, 27, 25, 42, 43, 44, 29, 34, 27, 45, 46, 47, 33, 35, 34, 35, 15, 17, + }; + + // Ensure that the index buffer references all the positions in the position buffer + static constexpr inline auto minmaxElement = AZStd::minmax_element(begin(s_indexes), end(s_indexes)); + static_assert(*minmaxElement.second == (s_positions.size() / 3) - 1); + }; + + struct KdTreeIntersectParams + { + float xpos; + float ypos; + float zpos; + float expectedDistance; + bool expectedShouldIntersect; + + friend std::ostream& operator<<(std::ostream& os, const KdTreeIntersectParams& param) + { + return os + << "xpos:" << param.xpos + << ", ypos:" << param.ypos + << ", zpos:" << param.zpos + << ", dist:" << param.expectedDistance + << ", shouldIntersect:" << param.expectedShouldIntersect; + } + }; + + class KdTreeIntersectsFixture + : public ModelTests + , public ::testing::WithParamInterface + { + }; + + TEST_P(KdTreeIntersectsFixture, KdTreeIntersects) + { + TwoSeparatedPlanesMesh mesh; + + AZ::RPI::ModelKdTree kdTree; + ASSERT_TRUE(kdTree.Build(mesh.GetModel().Get())); + + float distance = AZStd::numeric_limits::max(); + EXPECT_THAT(kdTree.RayIntersection(AZ::Vector3(GetParam().xpos, GetParam().ypos, GetParam().zpos), AZ::Vector3::CreateAxisZ(-1.0f), distance), testing::Eq(GetParam().expectedShouldIntersect)); + EXPECT_THAT(distance, testing::FloatEq(GetParam().expectedDistance)); + } + + static constexpr inline AZStd::array intersectTestData{ + KdTreeIntersectParams{ -0.1f, 0.0f, 1.0f, 0.5f, true }, + KdTreeIntersectParams{ 0.0f, 0.0f, 1.0f, 0.5f, true }, + KdTreeIntersectParams{ 0.1f, 0.0f, 1.0f, 0.5f, true }, + + // Test the center of each triangle + KdTreeIntersectParams{-0.111f, -0.111f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{-0.111f, -0.778f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{-0.111f, 0.555f, 1.0f, 0.5f, true}, // Should intersect triangle with indices {29, 34, 27} and {11, 12, 10} + KdTreeIntersectParams{-0.555f, -0.555f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{-0.555f, 0.111f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{-0.555f, 0.778f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{-0.778f, -0.111f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{-0.778f, -0.778f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{-0.778f, 0.555f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.111f, -0.555f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.111f, 0.111f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.111f, 0.778f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.555f, -0.111f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.555f, -0.778f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.555f, 0.555f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.778f, -0.555f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.778f, 0.111f, 1.0f, 0.5f, true}, + KdTreeIntersectParams{0.778f, 0.778f, 1.0f, 0.5f, true}, + }; + INSTANTIATE_TEST_CASE_P(KdTreeIntersectsPlane, KdTreeIntersectsFixture, ::testing::ValuesIn(intersectTestData)); +} // namespace UnitTest diff --git a/Gems/Atom/RPI/Code/Tests/Pass/PassTests.cpp b/Gems/Atom/RPI/Code/Tests/Pass/PassTests.cpp index 92706185ba..96a21f8c9b 100644 --- a/Gems/Atom/RPI/Code/Tests/Pass/PassTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Pass/PassTests.cpp @@ -368,7 +368,7 @@ namespace UnitTest AZ_TEST_START_TRACE_SUPPRESSION; // Set the connection's local slot name to a garbage value - m_data->m_parentPass.m_passRequests[3].m_inputConnections[1].m_localSlot = "NonExistantName"; + m_data->m_parentPass.m_passRequests[3].m_connections[1].m_localSlot = "NonExistantName"; m_data->AddPassTemplatesToLibrary(); Ptr parentPass = m_passSystem->CreatePassFromTemplate(Name("ParentPass"), Name("ParentPass")); @@ -381,7 +381,7 @@ namespace UnitTest EXPECT_FALSE(validationResults.IsValid()); EXPECT_EQ(1, validationResults.m_passesWithErrors.size()); - AZ_TEST_STOP_TRACE_SUPPRESSION(1); + AZ_TEST_STOP_TRACE_SUPPRESSION(2); } // Tests that validation correctly fails when connection's target slot name is set to a garbage value @@ -390,7 +390,7 @@ namespace UnitTest AZ_TEST_START_TRACE_SUPPRESSION; // Set the connection's target slot name to a garbage value - m_data->m_parentPass.m_passRequests[3].m_inputConnections[1].m_attachmentRef.m_attachment = "NonExistantName"; + m_data->m_parentPass.m_passRequests[3].m_connections[1].m_attachmentRef.m_attachment = "NonExistantName"; m_data->AddPassTemplatesToLibrary(); Ptr parentPass = m_passSystem->CreatePassFromTemplate(Name("ParentPass"), Name("ParentPass")); @@ -414,7 +414,7 @@ namespace UnitTest AZ_TEST_START_TRACE_SUPPRESSION; // Set the connection's target pass name to a garbage value - m_data->m_parentPass.m_passRequests[3].m_inputConnections[1].m_attachmentRef.m_pass = "NonExistantName"; + m_data->m_parentPass.m_passRequests[3].m_connections[1].m_attachmentRef.m_pass = "NonExistantName"; m_data->AddPassTemplatesToLibrary(); Ptr parentPass = m_passSystem->CreatePassFromTemplate(Name("ParentPass"), Name("ParentPass")); @@ -438,7 +438,7 @@ namespace UnitTest AZ_TEST_START_TRACE_SUPPRESSION; // Set one of the inputs to be connected to another input, which is invalid - m_data->m_parentPass.m_passRequests[3].m_inputConnections[1].m_attachmentRef.m_attachment = "LightListInput"; + m_data->m_parentPass.m_passRequests[3].m_connections[1].m_attachmentRef.m_attachment = "LightListInput"; m_data->AddPassTemplatesToLibrary(); Ptr parentPass = m_passSystem->CreatePassFromTemplate(Name("ParentPass"), Name("ParentPass")); @@ -462,7 +462,7 @@ namespace UnitTest AZ_TEST_START_TRACE_SUPPRESSION; // Set parent output to be connect to child input, which is invalid - m_data->m_parentPass.m_outputConnections[0].m_attachmentRef.m_attachment = "LightingInput"; + m_data->m_parentPass.m_connections[0].m_attachmentRef.m_attachment = "LightingInput"; m_data->AddPassTemplatesToLibrary(); Ptr parentPass = m_passSystem->CreatePassFromTemplate(Name("ParentPass"), Name("ParentPass")); diff --git a/Gems/Atom/RPI/Code/atom_rpi_public_files.cmake b/Gems/Atom/RPI/Code/atom_rpi_public_files.cmake index b0037879bb..71c3190a2e 100644 --- a/Gems/Atom/RPI/Code/atom_rpi_public_files.cmake +++ b/Gems/Atom/RPI/Code/atom_rpi_public_files.cmake @@ -78,6 +78,7 @@ set(FILES Include/Atom/RPI.Public/Pass/Specific/ImageAttachmentPreviewPass.h Include/Atom/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.h Include/Atom/RPI.Public/Pass/Specific/RenderToTexturePass.h + Include/Atom/RPI.Public/Pass/Specific/SelectorPass.h Include/Atom/RPI.Public/Pass/Specific/SwapChainPass.h Include/Atom/RPI.Public/Shader/Shader.h Include/Atom/RPI.Public/Shader/ShaderReloadNotificationBus.h @@ -151,6 +152,7 @@ set(FILES Source/RPI.Public/Pass/Specific/ImageAttachmentPreviewPass.cpp Source/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.cpp Source/RPI.Public/Pass/Specific/RenderToTexturePass.cpp + Source/RPI.Public/Pass/Specific/SelectorPass.cpp Source/RPI.Public/Pass/Specific/SwapChainPass.cpp Source/RPI.Public/Shader/Shader.cpp Source/RPI.Public/Shader/ShaderVariant.cpp diff --git a/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake b/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake index 2a466417b0..d1db00aa34 100644 --- a/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake +++ b/Gems/Atom/RPI/Code/atom_rpi_reflect_files.cmake @@ -27,6 +27,7 @@ set(FILES Include/Atom/RPI.Reflect/Model/ModelLodIndex.h Include/Atom/RPI.Reflect/Model/ModelAssetCreator.h Include/Atom/RPI.Reflect/Model/ModelLodAssetCreator.h + Include/Atom/RPI.Reflect/Model/MorphTargetDelta.h Include/Atom/RPI.Reflect/Model/MorphTargetMetaAsset.h Include/Atom/RPI.Reflect/Model/MorphTargetMetaAssetCreator.h Include/Atom/RPI.Reflect/Model/SkinMetaAsset.h @@ -108,6 +109,7 @@ set(FILES Source/RPI.Reflect/Model/ModelLodAsset.cpp Source/RPI.Reflect/Model/ModelAssetCreator.cpp Source/RPI.Reflect/Model/ModelLodAssetCreator.cpp + Source/RPI.Reflect/Model/MorphTargetDelta.cpp Source/RPI.Reflect/Model/MorphTargetMetaAsset.cpp Source/RPI.Reflect/Model/MorphTargetMetaAssetCreator.cpp Source/RPI.Reflect/Model/SkinMetaAsset.cpp diff --git a/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset index 8d2d26505a..3f453d128b 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Beach Parking", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { - "guid": "{3CA875D6-27A7-5CB4-B302-AEDF0D3C38BA}", - "subId": 1000 + "guid": "{4CF4C63C-B317-5E0B-B523-44167A02F81E}", + "subId": 3000 }, - "assetHint": "testdata/lightingpresets/beach_parking_2k_skyboxcm.exr.streamingimage" + "assetHint": "testdata/lightingpresets/beach_parking_1k_iblglobalcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "testdata/lightingpresets/beach_parking_1k_iblglobalcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{3CA875D6-27A7-5CB4-B302-AEDF0D3C38BA}", + "subId": 1000 + }, + "assetHint": "testdata/lightingpresets/beach_parking_2k_skyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{4CF4C63C-B317-5E0B-B523-44167A02F81E}", "subId": 3000 }, "assetHint": "testdata/lightingpresets/beach_parking_1k_iblglobalcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.30000001192092898, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ 0.699999988079071, -0.4000000059604645 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.30000001192092898 + ] } -} +} \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/LightingPresets/beach_parking_alt.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/beach_parking_alt.lightingpreset.azasset deleted file mode 100644 index 15b78f2337..0000000000 --- a/Gems/Atom/TestData/TestData/LightingPresets/beach_parking_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Beach Parking (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{4CF4C63C-B317-5E0B-B523-44167A02F81E}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/beach_parking_1k_iblglobalcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{4CF4C63C-B317-5E0B-B523-44167A02F81E}", - "subId": 2000 - }, - "assetHint": "testdata/lightingpresets/beach_parking_1k_iblglobalcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{4CF4C63C-B317-5E0B-B523-44167A02F81E}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/beach_parking_1k_iblglobalcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - 1.0, - 0.699999988079071, - -0.4000000059604645 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.15000000596046449 - } -} diff --git a/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset index 980e39e4e3..e11c395c73 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Greenwich Park", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { - "guid": "{FCADE311-31AC-5B7F-AA7E-E229363787E8}", - "subId": 1000 + "guid": "{774DB244-5F01-50DF-8D62-FE9298357F87}", + "subId": 3000 }, - "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_skyboxcm.exr.streamingimage" + "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_cm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_cm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{FCADE311-31AC-5B7F-AA7E-E229363787E8}", + "subId": 1000 + }, + "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_skyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{774DB244-5F01-50DF-8D62-FE9298357F87}", "subId": 3000 }, "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_cm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.3499999940395355, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ -0.15000000596046449, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.3499999940395355 + ] } } \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park_alt.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park_alt.lightingpreset.azasset deleted file mode 100644 index 7ec0085d07..0000000000 --- a/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Greenwich Park (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{774DB244-5F01-50DF-8D62-FE9298357F87}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_cm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{774DB244-5F01-50DF-8D62-FE9298357F87}", - "subId": 2000 - }, - "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_cm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{774DB244-5F01-50DF-8D62-FE9298357F87}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/greenwich_park_03_2k_cm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - -0.15000000596046449, - -0.15000000596046449, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.25 - } -} diff --git a/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset index 5c3f610376..d0c9cabb4b 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Misty Pines", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{2DF63061-F85C-5F41-A6DC-0CF52C63B63B}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm.exr.streamingimage" + "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{2DF63061-F85C-5F41-A6DC-0CF52C63B63B}", + "subId": 1000 + }, + "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{2DF63061-F85C-5F41-A6DC-0CF52C63B63B}", "subId": 3000 }, "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.3499999940395355, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ 0.15000000596046449, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.3499999940395355 + ] } } \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/LightingPresets/misty_pines_alt.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/misty_pines_alt.lightingpreset.azasset deleted file mode 100644 index 012c3cf647..0000000000 --- a/Gems/Atom/TestData/TestData/LightingPresets/misty_pines_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Misty Pines (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{2DF63061-F85C-5F41-A6DC-0CF52C63B63B}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{2DF63061-F85C-5F41-A6DC-0CF52C63B63B}", - "subId": 2000 - }, - "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{2DF63061-F85C-5F41-A6DC-0CF52C63B63B}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/misty_pines_2k_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - -0.15000000596046449, - 0.15000000596046449, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.20000000298023225 - } -} diff --git a/Gems/Atom/TestData/TestData/LightingPresets/urban_street_02_alt.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/urban_street_02_alt.lightingpreset.azasset deleted file mode 100644 index 90d05c97de..0000000000 --- a/Gems/Atom/TestData/TestData/LightingPresets/urban_street_02_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Urban Street 02 (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{D433ABA1-55D1-5F5F-80EB-C2DF0383D605}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/urban_street_02_512p_ibldiffusecm.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{3E0EDB16-C65C-5A22-B6DE-63FDC907C65F}", - "subId": 2000 - }, - "assetHint": "testdata/lightingpresets/urban_street_02_1k_iblspecularcm.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{D433ABA1-55D1-5F5F-80EB-C2DF0383D605}", - "subId": 3000 - }, - "assetHint": "testdata/lightingpresets/urban_street_02_512p_ibldiffusecm.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - 0.15000000596046449, - 0.15000000596046449, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.20000000298023225 - } -} diff --git a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material index 76aa30b960..d4f3321314 100644 --- a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material +++ b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material @@ -23,12 +23,13 @@ "normalDetailFlipY": true, "normalDetailMap": "TestData/Textures/cc0/Concrete019_1K_Normal.jpg", "normalDetailStrength": 0.25999999046325686, - "textureMapUv": "Base" + "textureMapUv": "Tiled" }, "detailUV": { "scale": 5.0 }, "normal": { + "flipY": true, "textureMap": "Objects/Lucy/Lucy_normal.tif" }, "subsurfaceScattering": { diff --git a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material index de5949b22f..4c4e30cb09 100644 --- a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material +++ b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material @@ -22,7 +22,7 @@ "normalDetailFlipY": true, "normalDetailMap": "TestData/Textures/cc0/Concrete019_1K_Normal.jpg", "normalDetailStrength": 1.5, - "textureMapUv": "Base" + "textureMapUv": "Tiled" }, "detailUV": { "scale": 5.0 diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material index 7f4b907540..3b5bed1c13 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material @@ -12,16 +12,16 @@ 1.0 ], "textureMap": "TestData/Textures/checker8x8_512.png", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "clearCoat": { "enable": true, "influenceMap": "TestData/Textures/checker8x8_512.png", - "influenceMapUv": "Packed", + "influenceMapUv": "Unwrapped", "normalMap": "TestData/Textures/test_dome_normal.tiff", - "normalMapUv": "Packed", + "normalMapUv": "Unwrapped", "roughnessMap": "TestData/Textures/checker8x8_512.png", - "roughnessMapUv": "Packed", + "roughnessMapUv": "Unwrapped", "useInfluenceMap": false, "useRoughnessMap": false }, diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material index ef4f4528e1..87eb47d51d 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material @@ -6,20 +6,20 @@ "properties": { "baseColor": { "textureMap": "Objects/Lucy/Lucy_brass_baseColor.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "metallic": { "textureMap": "Objects/Lucy/Lucy_brass_metalness.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "normal": { "flipY": true, "textureMap": "Objects/Lucy/Lucy_normal.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "roughness": { "textureMap": "Objects/Lucy/Lucy_brass_roughness.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" } } } \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material index fb7d81a807..4a77d1c707 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material @@ -6,12 +6,12 @@ "properties": { "baseColor": { "textureMap": "Objects/Lucy/Lucy_brass_baseColor.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "detailLayerGroup": { "baseColorDetailMap": "TestData/Textures/cc0/Concrete019_1K_Color.jpg", "blendDetailMask": "Objects/Lucy/Lucy_ao.tif", - "blendDetailMaskUv": "Packed", + "blendDetailMaskUv": "Unwrapped", "enableBaseColor": true, "enableDetailLayer": true, "enableNormals": true, @@ -23,16 +23,16 @@ }, "metallic": { "textureMap": "Objects/Lucy/Lucy_brass_metalness.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "normal": { "flipY": true, "textureMap": "Objects/Lucy/Lucy_normal.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "roughness": { "textureMap": "Objects/Lucy/Lucy_brass_roughness.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" } } } \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material index 8a21b81b37..14b72a47db 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material @@ -7,7 +7,7 @@ "detailLayerGroup": { "baseColorDetailBlend": 1.0, "blendDetailMask": "TestData/Textures/checker8x8_flip_512.png", - "blendDetailMaskUv": "Packed" + "blendDetailMaskUv": "Unwrapped" } } } \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material index 21c23e15fd..807aac9664 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material @@ -6,7 +6,7 @@ "properties": { "detailLayerGroup": { "blendDetailMask": "TestData/Textures/checker8x8_gray_512.png", - "blendDetailMaskUv": "Packed" + "blendDetailMaskUv": "Unwrapped" } } } \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material index 3dcfc82d68..54516f4320 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material @@ -6,7 +6,7 @@ "properties": { "baseColor": { "textureMap": "Objects/Lucy/Lucy_brass_baseColor.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "detailLayerGroup": { "baseColorDetailMap": "TestData/Textures/cc0/Concrete019_1K_Color.jpg", @@ -22,16 +22,16 @@ }, "metallic": { "textureMap": "Objects/Lucy/Lucy_brass_metalness.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "normal": { "flipY": true, "textureMap": "Objects/Lucy/Lucy_normal.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" }, "roughness": { "textureMap": "Objects/Lucy/Lucy_brass_roughness.tif", - "textureMapUv": "Packed" + "textureMapUv": "Unwrapped" } } } \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/test.lightingpreset.azasset b/Gems/Atom/TestData/TestData/test.lightingpreset.azasset index 34078c0163..70e8379858 100644 --- a/Gems/Atom/TestData/TestData/test.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/test.lightingpreset.azasset @@ -3,9 +3,8 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Dark Test Lighting", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", "subId": 3000 @@ -19,13 +18,20 @@ }, "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { "assetId": { "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", "subId": 3000 }, "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" }, + "alternateSkyboxImageAsset": { + "assetId": { + "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", + "subId": 1000 + }, + "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm.exr.streamingimage" + }, "iblExposure": -3.0, "skyboxExposure": -2.0, "lights": [ @@ -35,20 +41,11 @@ -0.20000000298023225, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], "intensity": 10.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.5 + ] } -} +} \ No newline at end of file diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorGroupHeaderWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorGroupHeaderWidget.cpp index ac81f1a152..2928d745c1 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorGroupHeaderWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorGroupHeaderWidget.cpp @@ -27,8 +27,10 @@ namespace AtomToolsFramework { AzQtComponents::Text::addPrimaryStyle(this); AzQtComponents::Text::addLabelStyle(this); - setStyleSheet("background-color: rgb(35, 35, 35)"); - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + setStyleSheet("background-color: #333333; border-style: solid; border-color: #1B1B1B; border-width: 1px; border-left: none; border-right: none;"); + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + setFixedHeight(24); + setMargin(0); } void InspectorGroupHeaderWidget::SetExpanded(bool expanded) diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp index b1a46ff0e9..9fe3c8093c 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp @@ -36,8 +36,7 @@ namespace AtomToolsFramework { qDeleteAll(m_ui->m_propertyContent->children()); m_layout = new QVBoxLayout(m_ui->m_propertyContent); - // 5 pixels added on the right to fix occlusion by the scrollbar. Remove after switching to UI 2.0. - m_layout->setContentsMargins(0, 0, 5, 0); + m_layout->setContentsMargins(0, 0, 0, 0); m_layout->setSpacing(0); } diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset index 8cf1f88e23..b1c162f315 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset @@ -3,14 +3,13 @@ "Version": 1, "ClassName": "AZ::Render::LightingPreset", "ClassData": { - "autoSelect": false, "displayName": "Daytime Hotel Interior", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{720DF96E-6A6E-552F-AC82-835BB4888FE3}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm.exr.streamingimage" + "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +18,21 @@ }, "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{720DF96E-6A6E-552F-AC82-835BB4888FE3}", + "subId": 1000 + }, + "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{720DF96E-6A6E-552F-AC82-835BB4888FE3}", "subId": 3000 }, "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.30000001192092898, "lights": [ { "direction": [ @@ -35,20 +40,10 @@ 1.0, -0.25 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.30000001192092898 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room_alt.lightingpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room_alt.lightingpreset.azasset deleted file mode 100644 index d0ec7df742..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Daytime Hotel Interior (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{720DF96E-6A6E-552F-AC82-835BB4888FE3}", - "subId": 3000 - }, - "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{720DF96E-6A6E-552F-AC82-835BB4888FE3}", - "subId": 2000 - }, - "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{720DF96E-6A6E-552F-AC82-835BB4888FE3}", - "subId": 3000 - }, - "assetHint": "materialeditor/lightingpresets/lythwood_room_4k_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - 1.0, - 1.0, - -0.25 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.20000000298023225 - } -} \ No newline at end of file diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset index 80f04bf1f3..2f425b7b09 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset @@ -5,12 +5,12 @@ "ClassData": { "autoSelect": true, "displayName": "Neutral Urban", - "skyboxImageAsset": { + "iblDiffuseImageAsset": { "assetId": { "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", - "subId": 1000 + "subId": 3000 }, - "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm.exr.streamingimage" + "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" }, "iblSpecularImageAsset": { "assetId": { @@ -19,15 +19,21 @@ }, "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_iblspecular.exr.streamingimage" }, - "iblDiffuseImageAsset": { + "skyboxImageAsset": { + "assetId": { + "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", + "subId": 1000 + }, + "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm.exr.streamingimage" + }, + "alternateSkyboxImageAsset": { "assetId": { "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", "subId": 3000 }, "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, + "shadowCatcherOpacity": 0.25, "lights": [ { "direction": [ @@ -35,20 +41,10 @@ -0.15000000596046449, -1.0 ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, "shadowCascadeCount": 4, "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false + "shadowmapSize": "Size2048" } - ], - "shadowCatcherOpacity": 0.25 + ] } } \ No newline at end of file diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban_alt.lightingpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban_alt.lightingpreset.azasset deleted file mode 100644 index edc535573d..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban_alt.lightingpreset.azasset +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "AZ::Render::LightingPreset", - "ClassData": { - "autoSelect": false, - "displayName": "Neutral Urban (Alt)", - "skyboxImageAsset": { - "assetId": { - "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", - "subId": 3000 - }, - "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblSpecularImageAsset": { - "assetId": { - "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", - "subId": 2000 - }, - "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_iblspecular.exr.streamingimage" - }, - "iblDiffuseImageAsset": { - "assetId": { - "guid": "{AA144B9D-68F6-5191-9DD1-211B8D72802C}", - "subId": 3000 - }, - "assetHint": "materialeditor/lightingpresets/konzerthaus_latlong_iblskyboxcm_ibldiffuse.exr.streamingimage" - }, - "iblExposure": 0.0, - "skyboxExposure": 0.0, - "lights": [ - { - "direction": [ - 0.15000000596046449, - -0.15000000596046449, - -1.0 - ], - "color": [ - 1.0, - 1.0, - 1.0, - 1.0 - ], - "intensity": 1.0, - "shadowCascadeCount": 4, - "shadowRatioLogarithmUniform": 1.0, - "shadowFarClipDistance": 20.0, - "shadowmapSize": "Size2048", - "enableShadowDebugColoring": false - } - ], - "shadowCatcherOpacity": 0.15000000596046449 - } -} \ No newline at end of file diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/Materials/basic_grey.material b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/Materials/basic_grey.material new file mode 100644 index 0000000000..0b890db4c6 --- /dev/null +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/Materials/basic_grey.material @@ -0,0 +1,32 @@ +{ + "materialType": "Materials/Types/StandardPBR.materialtype", + "propertyLayoutVersion": 1, + "properties": { + "baseColor": { + "color": [ 0.18, 0.18, 0.18 ], + "factor": 1.0, + "useTexture": false, + "textureMap": "" + }, + "metallic": { + "factor": 0.0, + "useTexture": false, + "textureMap": "" + }, + "roughness": { + "factor": 1.0, + "useTexture": false, + "textureMap": "" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": false, + "textureMap": "" + } + } +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.fbx index 1960858efb..d5ded37f32 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c20311f6c144df79bf50ec34d1e2549d4777db55f7d260a614fa4cdefb0febc8 -size 232768 +oid sha256:620be514958df58a8fba11b286f1c5b3bc814333d60a2a7d446df7a60a7f373a +size 232704 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.fbx index 1baff5d514..e280a0eb45 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bbd129c71039a5f534308209177e29c14c4eb987e5e0ba5a355807a9b84dffea -size 42992 +oid sha256:665dbc9994637538257d9db7fd7b0428d49d51a58ef8e7789c2faa3767e6fa26 +size 42864 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.fbx index 3c0c7c5cf0..0763322c23 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:678f981fa53257a6929d9922a06e0f96cbff0752f26011f3c5d7ed128d2ba724 -size 166528 +oid sha256:ae659b468dec57978fb70be5b1e541cb09c8c42b81a04cb0db2fc51f54fddcdd +size 166352 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.fbx index daee537949..e6567bc60e 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2de37b2334f21784cc399bf0378ddada4bc727061177c726a9d1d69bbda94433 -size 412464 +oid sha256:33daa7008f4942fbd9cf7c3552adce29e4993ef31b15de965ed54bb30e372386 +size 414848 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.fbx index 3ca8ed8d17..483be7351a 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d361d14ec7a9797907a1eb3a1714dcbe578cbe12c48a8847587820f185b32042 -size 173168 +oid sha256:36a483660a00fb104e3c7550703de1206ec0c7f7080387765e75837311a48c2f +size 173056 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.fbx index b8101032dc..cca11e213b 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a768115119a897dd42eb0c4428e7ef06213f94f739fc98e8786fea5a0cdea7ed -size 30784 +oid sha256:9c9e212ad50c78cd759156f4f47bf5c9fe61149472648dfd467341895f6ed914 +size 30656 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.fbx index a7762e04b6..0dad35a505 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91d85001a7d12da1fcfe4e32703cc6694ef0e8328936e836ceb333791968eaa9 -size 104240 +oid sha256:d5bfec31ebd8274809e071e2cedf63a4933563ecf51b7b4cc03e9eda5ce6c848 +size 104160 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.fbx index 37cff07ca6..d16c98530c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47256719050c06a0f74e3f5dbdf252fe30a8a990a1536120c137805f0e45a599 -size 29953424 +oid sha256:ec4187f51a4b598fc075f48dd7edb7728b14b285a95530228428a8c3f43c25fc +size 10931856 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.fbx index 9b8a713549..dfbbe52152 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dbfb8fe6bf9c43643cac7fb20443e5c8e9c19d6506e37f18dc16cf8ca77272a5 -size 33536 +oid sha256:703969f5dabf3a6ad5bcf26eca132558ba1e4eef7d0531b1108bce4bb3a9ad8f +size 33408 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.fbx index e45657bbe7..181be66fd8 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a53841ca60ad8ed16e485c026592ea7ea46e4f4ea9edce34356b39afb8d95882 -size 55312 +oid sha256:28605d80c87a76a07cd40a052330f86aff31576450131f080ae28b63d3cd117d +size 54912 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.fbx index b5e9d5b5e6..400109030d 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc1e4a4a55e3f621d056a70f967604c939f2ada53f6e0f9dfe646198932a8461 -size 83808 +oid sha256:91e64822552c58775c3e051cd11b11ae5ac35471614dfcdc51612fb65877d56c +size 83680 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.fbx index 61cb02b161..eb02c68394 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eeb9923c34d0cb1bc27bb1a2fb5ea3dd7d9e098163ffced166b4ffffc2a680a1 -size 103600 +oid sha256:838830c99f344f5b68e5e85c9bc52751350caf48e662c9c2b767ab77039bbd8f +size 103472 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.fbx index 09ef4e5b33..0de8228098 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2fc450c62b2ac29e6389e1ed0a6a2d0f73012523df7c85c93a9b7a7a618c891d -size 97776 +oid sha256:963b315ba0d4e5024f177db17207a83a9b638200b43b5093f2512490131d6e8e +size 97632 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.fbx index a53d07b171..caf6dcbe8f 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3b8ecab6f2456b69079263b15b34985526427c7837c449cd658a2ff49f57a09 -size 2479024 +oid sha256:6e63a55a35c749a16a03e10a1f53a48bd426c61db80151de080235b14cf6b70d +size 2479344 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.fbx b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.fbx index 2682ece5ef..30f75b5ca5 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.fbx +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.fbx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0357e7669e8a58ebbaf399c37d8618f17b720a3084d4c3d794b89d99e3c20e8b -size 461376 +oid sha256:87b6f04d0a04499dd2c15885eac0cb5b741995c754fbf4e6b4339676ef69001a +size 461232 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/Primitives.ma b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/Primitives.ma index a36c73a70e..53e24958dd 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/Primitives.ma +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/Primitives.ma @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:559d77b38701879963e43f8279c1d8c3202e19de038337de9a6183c16e829ca6 -size 5661241 +oid sha256:5e7af3745483bd3e7f79a41420dbaa7545965594e838a7e1c3c10e3285a7d63b +size 7643121 diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/ShaderBall.ma b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/ShaderBall.ma index d979dff2cd..f3ca873592 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/ShaderBall.ma +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/WIP/ShaderBall.ma @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:41523a807e5fab31061fb4229c859fad2c125f9726803972524a3f2245b520bd -size 11398023 +oid sha256:997e84d92af486acb0e960ddd65ea95e8f088b15b8affcd5dce16257ddb1159c +size 11397337 diff --git a/Gems/Atom/Tools/MaterialEditor/workspace.mel b/Gems/Atom/Tools/MaterialEditor/workspace.mel new file mode 100644 index 0000000000..73f4023568 --- /dev/null +++ b/Gems/Atom/Tools/MaterialEditor/workspace.mel @@ -0,0 +1,88 @@ +//Maya 2020 Project Definition + +workspace -fr "fluidCache" ""; +workspace -fr "JT_ATF" ""; +workspace -fr "images" "Assets/Textures"; +workspace -fr "offlineEdit" ".maya_data/scenes/edits"; +workspace -fr "STEP_ATF Export" ""; +workspace -fr "furShadowMap" ""; +workspace -fr "SVG" ""; +workspace -fr "scripts" "Maya/Scripts"; +workspace -fr "DAE_FBX" ""; +workspace -fr "shaders" "Maya/Shaders"; +workspace -fr "NX_ATF" ""; +workspace -fr "CATIAV5_ATF Export" ""; +workspace -fr "furFiles" ""; +workspace -fr "OBJ" ".maya_data/obj"; +workspace -fr "PARASOLID_ATF Export" ""; +workspace -fr "FBX export" "Assets/Objects"; +workspace -fr "furEqualMap" ""; +workspace -fr "textures" "Assets/textures"; +workspace -fr "BIF" ""; +workspace -fr "lights" ".maya_data/renderData/shaders"; +workspace -fr "DAE_FBX export" ""; +workspace -fr "aliasWire" ".maya_data/data"; +workspace -fr "CATIAV5_ATF" ""; +workspace -fr "SAT_ATF Export" ""; +workspace -fr "movie" ".maya_data/movies"; +workspace -fr "ASS Export" ""; +workspace -fr "mayaAscii" ""; +workspace -fr "move" ".maya_data"; +workspace -fr "autoSave" ".maya_data/autoSave"; +workspace -fr "NX_ATF Export" ""; +workspace -fr "sound" ".maya_data/sound"; +workspace -fr "mayaBinary" ""; +workspace -fr "timeEditor" ""; +workspace -fr "RIBexport" ".maya_data/data"; +workspace -fr "DWG_ATF" ""; +workspace -fr "mentalray" ".maya_data/renderData/mentalray"; +workspace -fr "JT_ATF Export" ""; +workspace -fr "iprImages" ".maya_data/renderData/iprImages"; +workspace -fr "FBX" "Assets/Objects"; +workspace -fr "renderData" ".maya_data/renderData"; +workspace -fr "CATIAV4_ATF" ""; +workspace -fr "fileCache" ""; +workspace -fr "Fbx" "Objects"; +workspace -fr "eps" ""; +workspace -fr "IGESexport" ".maya_data/data"; +workspace -fr "3dPaintTextures" ".maya_data/3dPaintTextures"; +workspace -fr "DXF_ATF Export" ""; +workspace -fr "mel" ".maya_data/mel"; +workspace -fr "translatorData" ""; +workspace -fr "IGES" ".maya_data/data"; +workspace -fr "particles" ".maya_data/particles"; +workspace -fr "DXFexport" ".maya_data/data"; +workspace -fr "DXF_ATF" ""; +workspace -fr "scene" "Assets/Objects"; +workspace -fr "renderScenes" ".maya_data/renderScenes"; +workspace -fr "SAT_ATF" ""; +workspace -fr "PROE_ATF" ""; +workspace -fr "WIRE_ATF Export" ""; +workspace -fr "sourceImages" "ArtSource/Images"; +workspace -fr "RIB" ".maya_data/data"; +workspace -fr "furImages" ""; +workspace -fr "clips" ".maya_data/clips"; +workspace -fr "Adobe(R) Illustrator(R)" ".maya_data/data"; +workspace -fr "animExport" ".maya_data/data"; +workspace -fr "mentalRay" ".maya_data/mentalRay"; +workspace -fr "STEP_ATF" ""; +workspace -fr "DWG_ATF Export" ""; +workspace -fr "depth" ".maya_data/renderData/depth"; +workspace -fr "sceneAssembly" ""; +workspace -fr "IGES_ATF Export" ""; +workspace -fr "teClipExports" ""; +workspace -fr "IGES_ATF" ""; +workspace -fr "PARASOLID_ATF" ""; +workspace -fr "ASS" ""; +workspace -fr "Substance" ".maya_data/data"; +workspace -fr "audio" ".maya_data/sound"; +workspace -fr "EPS" ".maya_data/data"; +workspace -fr "Alembic" "Assets/Objects"; +workspace -fr "diskCache" ".maya_data/cache"; +workspace -fr "illustrator" ""; +workspace -fr "WIRE_ATF" ""; +workspace -fr "templates" "ArtSource/SceneTemplates"; +workspace -fr "animImport" ".maya_data/data"; +workspace -fr "OBJexport" "Assets/Objects"; +workspace -fr "furAttrMap" ""; +workspace -fr "DXF" ".maya_data/data"; diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocument.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocument.cpp index dc2440ac05..bb47017575 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocument.cpp +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocument.cpp @@ -102,14 +102,15 @@ namespace ShaderManagementConsole bool result = false; AZ::Data::AssetInfo sourceAssetInfo; AZStd::string watchFolder; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, - m_absolutePath.c_str(), sourceAssetInfo, watchFolder); + AzToolsFramework::AssetSystemRequestBus::BroadcastResult( + result, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, m_absolutePath.c_str(), sourceAssetInfo, + watchFolder); if (!result) { return AZ::Failure(AZStd::string::format("Could not find source data: '%s'.", m_absolutePath.c_str())); } - m_relativePath = sourceAssetInfo.m_relativePath; + m_relativePath = m_shaderVariantListSourceData.m_shaderFilePath; if (!AzFramework::StringFunc::Path::Normalize(m_relativePath)) { return AZ::Failure(AZStd::string::format("Shader path could not be normalized: '%s'.", m_relativePath.c_str())); @@ -117,7 +118,6 @@ namespace ShaderManagementConsole AZStd::string shaderPath = m_relativePath; AzFramework::StringFunc::Path::ReplaceExtension(shaderPath, AZ::RPI::ShaderAsset::Extension); - m_shaderAsset = AZ::RPI::AssetUtils::LoadAssetByProductPath(shaderPath.c_str()); if (!m_shaderAsset) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Scripts/GenerateShaderVariantListForMaterials.py b/Gems/Atom/Tools/ShaderManagementConsole/Scripts/GenerateShaderVariantListForMaterials.py index 40423e6019..0576789145 100755 --- a/Gems/Atom/Tools/ShaderManagementConsole/Scripts/GenerateShaderVariantListForMaterials.py +++ b/Gems/Atom/Tools/ShaderManagementConsole/Scripts/GenerateShaderVariantListForMaterials.py @@ -20,6 +20,23 @@ import azlmbr.paths import azlmbr.shadermanagementconsole import azlmbr.shader import collections +from PySide2 import QtWidgets + +PROJECT_SHADER_VARIANTS_FOLDER = "ShaderVariants" + +def prompt_message_box(text, informativeText = None, qButtons = QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No|QtWidgets.QMessageBox.Cancel): + msgBox = QtWidgets.QMessageBox() + msgBox.setText(text) + if informativeText: + msgBox.setInformativeText(informativeText) + msgBox.setStandardButtons(qButtons) + + return msgBox.exec() + +def clean_existing_shadervariantlist_files(filePaths): + for file in filePaths: + if os.path.exists(file): + os.remove(file) def main(): print("==== Begin shader variant script ==========================================================") @@ -49,7 +66,16 @@ def main(): shaderAssetInfo.relativePath ) - # TODO: [ATOM-14868] Add UI prompts in shader management console script once PySide2 is available + response = prompt_message_box( + "Generating .shadervariantlist File", + "This process may take a while. Would you like to save the generated .shadervariantlist file in the project folder? " \ + "Otherwise, it will be saved in the same location as the .shader file." + ) + is_save_in_project_folder = False + if response == QtWidgets.QMessageBox.Yes: + is_save_in_project_folder = True + elif response == QtWidgets.QMessageBox.Cancel: + return # This loop collects all uniquely-identified shader items used by the materials based on its shader variant id. shaderVariantIds = [] @@ -76,10 +102,9 @@ def main(): shaderVariantIds.append(shaderVariantId) shaderVariantListShaderOptionGroups.append(shaderItem.GetShaderOptionGroup()) - # Generate the shader variant list data by collecting shader option name-value pairs. - _, shaderFileName = os.path.split(filename) + # Generate the shader variant list data by collecting shader option name-value pairs.s shaderVariantList = azlmbr.shader.ShaderVariantListSourceData () - shaderVariantList.shaderFilePath = shaderFileName + shaderVariantList.shaderFilePath = shaderAssetInfo.relativePath shaderVariants = [] stableId = 1 for shaderOptionGroup in shaderVariantListShaderOptionGroups: @@ -104,9 +129,23 @@ def main(): shaderVariantList.shaderVariants = shaderVariants - # Save the shader variant list file + # clean previously generated shader variant list file so they don't clash. + pre, ext = os.path.splitext(shaderAssetInfo.relativePath) + projectShaderVariantListFilePath = os.path.join(azlmbr.paths.devassets, PROJECT_SHADER_VARIANTS_FOLDER, f'{pre}.shadervariantlist') + pre, ext = os.path.splitext(filename) - shaderVariantListFilePath = f'{pre}.shadervariantlist' + defaultShaderVariantListFilePath = f'{pre}.shadervariantlist' + + clean_existing_shadervariantlist_files([ + projectShaderVariantListFilePath + ]) + # Save the shader variant list file + if is_save_in_project_folder: + shaderVariantListFilePath = projectShaderVariantListFilePath + else: + shaderVariantListFilePath = defaultShaderVariantListFilePath + + print(f"Saving .shadervariantlist file into: {shaderVariantListFilePath}") azlmbr.shader.SaveShaderVariantListSourceData(shaderVariantListFilePath, shaderVariantList) # Open the document in shader management console diff --git a/Gems/Atom/Utils/Code/CMakeLists.txt b/Gems/Atom/Utils/Code/CMakeLists.txt index 9a5695e38e..ecab11d0fc 100644 --- a/Gems/Atom/Utils/Code/CMakeLists.txt +++ b/Gems/Atom/Utils/Code/CMakeLists.txt @@ -9,6 +9,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) + ly_add_target( NAME Atom_Utils.Static STATIC NAMESPACE Gem @@ -36,6 +38,8 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) NAMESPACE Gem FILES_CMAKE atom_utils_tests_files.cmake + PLATFORM_INCLUDE_FILES + ${pal_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}.cmake INCLUDE_DIRECTORIES PRIVATE Tests diff --git a/Gems/Atom/Utils/Code/Platform/Android/platform_android.cmake b/Gems/Atom/Utils/Code/Platform/Android/platform_android.cmake new file mode 100644 index 0000000000..4d5680a30d --- /dev/null +++ b/Gems/Atom/Utils/Code/Platform/Android/platform_android.cmake @@ -0,0 +1,10 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# diff --git a/Gems/Atom/Utils/Code/Platform/Linux/platform_linux.cmake b/Gems/Atom/Utils/Code/Platform/Linux/platform_linux.cmake new file mode 100644 index 0000000000..4d5680a30d --- /dev/null +++ b/Gems/Atom/Utils/Code/Platform/Linux/platform_linux.cmake @@ -0,0 +1,10 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# diff --git a/Gems/Atom/Utils/Code/Platform/Mac/platform_mac.cmake b/Gems/Atom/Utils/Code/Platform/Mac/platform_mac.cmake new file mode 100644 index 0000000000..4d5680a30d --- /dev/null +++ b/Gems/Atom/Utils/Code/Platform/Mac/platform_mac.cmake @@ -0,0 +1,10 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# diff --git a/Gems/Atom/Utils/Code/Platform/Windows/platform_windows.cmake b/Gems/Atom/Utils/Code/Platform/Windows/platform_windows.cmake new file mode 100644 index 0000000000..d0c82daa29 --- /dev/null +++ b/Gems/Atom/Utils/Code/Platform/Windows/platform_windows.cmake @@ -0,0 +1,15 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(LY_BUILD_DEPENDENCIES + PRIVATE + 3rdParty::OpenImageIO +) \ No newline at end of file diff --git a/Gems/Atom/Utils/Code/Platform/iOS/platform_ios.cmake b/Gems/Atom/Utils/Code/Platform/iOS/platform_ios.cmake new file mode 100644 index 0000000000..4d5680a30d --- /dev/null +++ b/Gems/Atom/Utils/Code/Platform/iOS/platform_ios.cmake @@ -0,0 +1,10 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# diff --git a/Gems/AtomContent/Sponza/Assets/Textures/background_1k_metallic.png b/Gems/AtomContent/Sponza/Assets/Textures/background_1k_metallic.png index efab266b88..c7bceabff2 100644 --- a/Gems/AtomContent/Sponza/Assets/Textures/background_1k_metallic.png +++ b/Gems/AtomContent/Sponza/Assets/Textures/background_1k_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aed4a6f49a3e18de16ffa9794591eb5f8590f116db2b863a297a0a1b9b6f93b0 -size 464225 +oid sha256:f482b7b57d180c6df76b750d05547151731fc6c61d2b9674f3b9daa5ab0ac225 +size 440844 diff --git a/Gems/AtomContent/Sponza/Assets/objects/lightBlocker_lambert1.material b/Gems/AtomContent/Sponza/Assets/objects/lightBlocker_lambert1.material new file mode 100644 index 0000000000..dba44f7b49 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/lightBlocker_lambert1.material @@ -0,0 +1,19 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "emissive": { + "color": [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + "opacity": { + "factor": 1.0 + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_arch.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_arch.material new file mode 100644 index 0000000000..8f5edb6968 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_arch.material @@ -0,0 +1,36 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/arch_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/arch_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/arch_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "factor": 0.050999999046325687, + "pdo": true, + "quality": "High", + "textureMap": "Textures/arch_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/arch_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_background.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_background.material new file mode 100644 index 0000000000..5ba48a758e --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_background.material @@ -0,0 +1,37 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/background_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/background_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/background_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.03099999949336052, + "pdo": true, + "quality": "High", + "textureMap": "Textures/background_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/background_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_bricks.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_bricks.material new file mode 100644 index 0000000000..c32beebd5c --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_bricks.material @@ -0,0 +1,37 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/bricks_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/bricks_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/bricks_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.03500000014901161, + "pdo": true, + "quality": "High", + "textureMap": "Textures/bricks_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/bricks_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_ceiling.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_ceiling.material new file mode 100644 index 0000000000..cbccd8ed88 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_ceiling.material @@ -0,0 +1,20 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/ceiling_1k_basecolor.png" + }, + "opacity": { + "factor": 1.0 + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_chain.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_chain.material new file mode 100644 index 0000000000..cdb28a8a6f --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_chain.material @@ -0,0 +1,32 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/chain_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/chain_alpha.png" + }, + "normal": { + "textureMap": "Textures/chain_normal.jpg" + }, + "opacity": { + "alphaSource": "Split", + "factor": 1.0, + "mode": "Cutout", + "textureMap": "Textures/chain_alpha.png" + }, + "roughness": { + "factor": 0.4000000059604645 + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columna.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columna.material new file mode 100644 index 0000000000..1889e33313 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columna.material @@ -0,0 +1,37 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/columnA_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/columnA_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/columnA_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.017000000923871995, + "pdo": true, + "quality": "High", + "textureMap": "Textures/columnA_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/columnA_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnb.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnb.material new file mode 100644 index 0000000000..095afc0ab1 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnb.material @@ -0,0 +1,36 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/columnB_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/columnB_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/columnB_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "enable": true, + "factor": 0.020999999716877939, + "pdo": true, + "quality": "High", + "textureMap": "Textures/columnB_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/columnB_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnc.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnc.material new file mode 100644 index 0000000000..e78cb485cc --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnc.material @@ -0,0 +1,37 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/columnC_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/columnC_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/columnC_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.014000000432133675, + "pdo": true, + "quality": "High", + "textureMap": "Textures/columnC_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/columnC_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainblue.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainblue.material new file mode 100644 index 0000000000..62942faa87 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainblue.material @@ -0,0 +1,29 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/curtainBlue_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/curtain_metallic.png" + }, + "normal": { + "textureMap": "Textures/curtain_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "roughness": { + "textureMap": "Textures/curtain_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtaingreen.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtaingreen.material new file mode 100644 index 0000000000..3284cfa837 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtaingreen.material @@ -0,0 +1,29 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/curtainGreen_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/curtain_metallic.png" + }, + "normal": { + "textureMap": "Textures/curtain_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "roughness": { + "textureMap": "Textures/curtain_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainred.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainred.material new file mode 100644 index 0000000000..d07cf6d172 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainred.material @@ -0,0 +1,29 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/curtainRed_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/curtain_metallic.png" + }, + "normal": { + "textureMap": "Textures/curtain_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "roughness": { + "textureMap": "Textures/curtain_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_details.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_details.material new file mode 100644 index 0000000000..fc5f5761d8 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_details.material @@ -0,0 +1,36 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/details_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/details_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/details_1k_normal.png" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.02500000037252903, + "pdo": true, + "textureMap": "Textures/details_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/details_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricblue.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricblue.material new file mode 100644 index 0000000000..3a555c0824 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricblue.material @@ -0,0 +1,29 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/fabricBlue_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/fabric_metallic.png" + }, + "normal": { + "textureMap": "Textures/fabric_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "roughness": { + "textureMap": "Textures/fabric_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricgreen.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricgreen.material new file mode 100644 index 0000000000..6a95d0d275 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricgreen.material @@ -0,0 +1,29 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/fabricGreen_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/fabric_metallic.png" + }, + "normal": { + "textureMap": "Textures/fabric_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "roughness": { + "textureMap": "Textures/fabric_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricred.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricred.material new file mode 100644 index 0000000000..2558c86819 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricred.material @@ -0,0 +1,29 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/fabricRed_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/fabric_metallic.png" + }, + "normal": { + "textureMap": "Textures/fabric_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "roughness": { + "textureMap": "Textures/fabric_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_flagpole.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_flagpole.material new file mode 100644 index 0000000000..c13baae474 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_flagpole.material @@ -0,0 +1,37 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/flagpole_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/flagpole_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/flagpole_1k_normal.png" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.014000000432133675, + "pdo": true, + "quality": "High", + "textureMap": "Textures/flagpole_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/flagpole_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_floor.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_floor.material new file mode 100644 index 0000000000..cb4affe1cf --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_floor.material @@ -0,0 +1,33 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/floor_1k_basecolor.png" + }, + "normal": { + "textureMap": "Textures/floor_1k_normal.png" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.012000000104308129, + "pdo": true, + "textureMap": "Textures/floor_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/floor_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_leaf.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_leaf.material new file mode 100644 index 0000000000..bb226d14cb --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_leaf.material @@ -0,0 +1,33 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/thorn_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/thorn_metallic.png" + }, + "normal": { + "textureMap": "Textures/thorn_normal.jpg" + }, + "opacity": { + "factor": 0.5699999928474426, + "mode": "Cutout" + }, + "parallax": { + "textureMap": "Textures/thorn_height.png" + }, + "roughness": { + "textureMap": "Textures/thorn_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_lion.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_lion.material new file mode 100644 index 0000000000..4b47e1b7a1 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_lion.material @@ -0,0 +1,36 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/lion_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/lion_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/lion_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.023000000044703485, + "pdo": true, + "textureMap": "Textures/lion_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/lion_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_roof.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_roof.material new file mode 100644 index 0000000000..3b245b251f --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_roof.material @@ -0,0 +1,38 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/roof_1k_basecolor.png" + }, + "metallic": { + "factor": 0.009999999776482582, + "useTexture": false + }, + "normal": { + "textureMap": "Textures/roof_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.019999999552965165, + "pdo": true, + "quality": "High", + "textureMap": "Textures/roof_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/roof_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vase.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vase.material new file mode 100644 index 0000000000..e471de4ab9 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vase.material @@ -0,0 +1,37 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/vase_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/vase_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/vase_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.027000000700354577, + "pdo": true, + "quality": "High", + "textureMap": "Textures/vase_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/vase_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vasehanging.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vasehanging.material new file mode 100644 index 0000000000..6bb8a205d1 --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vasehanging.material @@ -0,0 +1,37 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/vaseHanging_1k_basecolor.png" + }, + "metallic": { + "textureMap": "Textures/vaseHanging_1k_metallic.png" + }, + "normal": { + "textureMap": "Textures/vaseHanging_1k_normal.png" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.04600000008940697, + "pdo": true, + "quality": "High", + "textureMap": "Textures/vaseHanging_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/vaseHanging_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseplant.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseplant.material new file mode 100644 index 0000000000..0fe458b4ac --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseplant.material @@ -0,0 +1,21 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/vasePlant_1k_basecolor.png" + }, + "opacity": { + "factor": 0.8399999737739563, + "mode": "Cutout" + } + } +} \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseround.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseround.material new file mode 100644 index 0000000000..d2ef595c0d --- /dev/null +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseround.material @@ -0,0 +1,34 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "textureMap": "Textures/vaseRound_1k_basecolor.png" + }, + "normal": { + "textureMap": "Textures/vaseRound_1k_normal.jpg" + }, + "opacity": { + "factor": 1.0 + }, + "parallax": { + "algorithm": "POM", + "enable": true, + "factor": 0.019999999552965165, + "pdo": true, + "quality": "High", + "textureMap": "Textures/vaseRound_1k_height.png" + }, + "roughness": { + "textureMap": "Textures/vaseRound_1k_roughness.png" + } + } +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.azsl b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.azsl index aeb36607d6..bd01a8a707 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.azsl +++ b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.azsl @@ -27,11 +27,29 @@ option bool o_srgbWrite; option enum class Modulate { None, Alpha, AlphaAndColor } o_modulate; // Each vertex can select one or two of the 16 textures bound +// We use an array of textures and a bitmask that indicates whether to use clamp +// sampler (bit set) or wrap. The nth bit has the correct sampler value for the nth texture ShaderResourceGroup InstanceSrg : SRG_PerDraw { row_major float4x4 m_worldToProj; + uint m_isClamp; Texture2D m_texture[16]; - Sampler m_sampler[16]; + + Sampler m_wrapSampler + { + MaxAnisotropy = 16; + AddressU = Wrap; + AddressV = Wrap; + AddressW = Wrap; + }; + + Sampler m_clampSampler + { + MaxAnisotropy = 16; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; + }; }; struct VSInput @@ -74,9 +92,14 @@ struct PSOutput float4 SampleTriangleTexture(int texIndex, float2 uv) { - // We use an array of textures and an array of samplers. The nth sampler has the correct sampler state - // for the nth texture. - return InstanceSrg::m_texture[texIndex].Sample(InstanceSrg::m_sampler[texIndex], uv); + if ((InstanceSrg::m_isClamp & (1 << texIndex)) != 0) + { + return InstanceSrg::m_texture[texIndex].Sample(InstanceSrg::m_clampSampler, uv); + } + else + { + return InstanceSrg::m_texture[texIndex].Sample(InstanceSrg::m_wrapSampler, uv); + } } PSOutput MainPS(VSOutput IN) diff --git a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.shader b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.shader index fbf0269823..9fd3e76813 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.shader +++ b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/LyShineUI.shader @@ -15,7 +15,7 @@ "BlendState" : { "Enable" : true, - "BlendSource" : "One", + "BlendSource" : "AlphaSource", "BlendDest" : "AlphaSourceInverse", "BlendOp" : "Add" }, diff --git a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl index a9b8de6d05..154927cf27 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl +++ b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl @@ -11,6 +11,9 @@ */ #include + +// Indicates whether the sampler should use Wrap or Clamp +option bool o_clamp; // Indicates whether to use color channels from the texture or only the alpha channel option bool o_useColorChannels; @@ -19,7 +22,22 @@ ShaderResourceGroup InstanceSrg : SRG_PerDraw { row_major float4x4 m_worldToProj; Texture2D m_texture; - Sampler m_sampler; + + Sampler m_wrapSampler + { + MaxAnisotropy = 16; + AddressU = Wrap; + AddressV = Wrap; + AddressW = Wrap; + }; + + Sampler m_clampSampler + { + MaxAnisotropy = 16; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; + }; }; struct VSInput @@ -59,7 +77,14 @@ PSOutput MainPS(VSOutput IN) float4 tex; - tex = InstanceSrg::m_texture.Sample(InstanceSrg::m_sampler, IN.m_uv); + if (o_clamp) + { + tex = InstanceSrg::m_texture.Sample(InstanceSrg::m_clampSampler, IN.m_uv); + } + else + { + tex = InstanceSrg::m_texture.Sample(InstanceSrg::m_wrapSampler, IN.m_uv); + } if (!o_useColorChannels) { @@ -78,5 +103,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.a = opacity; return OUT; -}; - +}; \ No newline at end of file diff --git a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist index 210618cf12..04a55021b2 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist +++ b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist @@ -1,9 +1,24 @@ { - "Shader" : "SimpleTextured.shader", - "Variants" : [ + "Shader": "SimpleTextured.shader", + "Variants": [ { "StableId": 1, "Options": { + "o_clamp": "true", + "o_useColorChannels": "false" + } + }, + { + "StableId": 2, + "Options": { + "o_clamp": "true", + "o_useColorChannels": "true" + } + }, + { + "StableId": 3, + "Options": { + "o_clamp": "false", "o_useColorChannels": "true" } } diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp index d3515874ac..ec7aa17151 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp @@ -77,8 +77,15 @@ namespace AZ ResetRenderState(); m_viewportId = viewportContextPtr->GetId(); m_defaultInstance = false; - RPI::Scene* scene = viewportContextPtr->GetRenderScene().get(); - InitInternal(scene, viewportContextPtr); + auto setupScene = [this](RPI::ScenePtr scene) + { + auto viewportContextManager = AZ::Interface::Get(); + AZ::RPI::ViewportContextPtr viewportContextPtr = viewportContextManager->GetViewportContextById(m_viewportId); + InitInternal(scene.get(), viewportContextPtr); + }; + setupScene(viewportContextPtr->GetRenderScene()); + m_sceneChangeHandler = AZ::RPI::ViewportContext::SceneChangedEvent::Handler(setupScene); + viewportContextPtr->ConnectSceneChangedHandler(m_sceneChangeHandler); } AtomDebugDisplayViewportInterface::AtomDebugDisplayViewportInterface(uint32_t defaultInstanceAddress) @@ -92,6 +99,7 @@ namespace AZ void AtomDebugDisplayViewportInterface::InitInternal(RPI::Scene* scene, AZ::RPI::ViewportContextPtr viewportContextPtr) { + AzFramework::DebugDisplayRequestBus::Handler::BusDisconnect(m_viewportId); if (!scene) { m_auxGeomPtr = nullptr; diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h index de430faf53..48091ea8d8 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h @@ -231,6 +231,8 @@ namespace AZ::AtomBridge AZ::RPI::AuxGeomDrawPtr m_auxGeomPtr; bool m_defaultInstance = false; // only true for drawing to a particular viewport. What would 2D drawing mean in a scene with several windows? AzFramework::ViewportId m_viewportId = AzFramework::InvalidViewportId; // Address this instance answers on. + AZ::RPI::ViewportContext::SceneChangedEvent::Handler + m_sceneChangeHandler; }; // this is duplicated from Cry_Math.h, GetBasisVectors. diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h index f79a65b9e1..4f87334b46 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h @@ -166,7 +166,6 @@ namespace AZ struct FontShaderData { AZ::RHI::ShaderInputImageIndex m_imageInputIndex; - AZ::RHI::ShaderInputSamplerIndex m_samplerInputIndex; AZ::RHI::ShaderInputConstantIndex m_viewProjInputIndex; }; @@ -212,6 +211,8 @@ namespace AZ FontEffect* AddEffect(const char* effectName); FontEffect* GetDefaultEffect(); + AZ::Data::Instance GetFontImage() { return m_fontStreamingImage; } + private: virtual ~FFont(); bool InitFont(); diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp b/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp index b6d02e5daf..81ffc435da 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp +++ b/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp @@ -94,7 +94,10 @@ bool AZ::FFont::InitFont() m_dynamicDraw = RPI::DynamicDrawInterface::Get()->CreateDynamicDrawContext(m_viewportContext->GetRenderScene().get()); Data::Instance shader = AZ::RPI::LoadShader(shaderFilepath); - m_dynamicDraw->InitShader(shader); + AZ::RPI::ShaderOptionList shaderOptions; + shaderOptions.push_back(AZ::RPI::ShaderOption(AZ::Name("o_useColorChannels"), AZ::Name("false"))); + shaderOptions.push_back(AZ::RPI::ShaderOption(AZ::Name("o_clamp"), AZ::Name("true"))); + m_dynamicDraw->InitShaderWithVariant(shader, &shaderOptions); m_dynamicDraw->InitVertexFormat({{"POSITION", RHI::Format::R32G32B32_FLOAT}, {"COLOR", RHI::Format::R8G8B8A8_UNORM}, {"TEXCOORD0", RHI::Format::R32G32_FLOAT}}); m_dynamicDraw->EndInit(); @@ -109,10 +112,6 @@ bool AZ::FFont::InitFont() m_fontShaderData.m_viewProjInputIndex = layout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::WorldToProjIndexName)); AZ_Error("AtomFont::FFont", m_fontShaderData.m_viewProjInputIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::WorldToProjIndexName); - m_fontShaderData.m_samplerInputIndex = layout->FindShaderInputSamplerIndex(AZ::Name(ShaderInputs::SamplerIndexName)); - AZ_Error( - "AtomFont::FFont", m_fontShaderData.m_samplerInputIndex.IsValid(), "Failed to find shader input constant %s.", - ShaderInputs::SamplerIndexName); // Create cpu memory to cache the font draw data before submit m_vertexBuffer = new SVF_P3F_C4B_T2F[MaxVerts]; @@ -380,13 +379,6 @@ void AZ::FFont::DrawStringUInternal(float x, float y, float z, const char* str, auto drawSrg = m_dynamicDraw->NewDrawSrg(); drawSrg->SetConstant(m_fontShaderData.m_viewProjInputIndex, modelViewProjMat); drawSrg->SetImageView(m_fontShaderData.m_imageInputIndex, m_fontStreamingImage->GetImageView()); - AZ::RHI::SamplerState samplerState; - samplerState.m_anisotropyEnable = true; - samplerState.m_anisotropyMax = 16; - samplerState.m_addressU = RHI::AddressMode::Clamp; - samplerState.m_addressV = RHI::AddressMode::Clamp; - samplerState.m_addressW = RHI::AddressMode::Clamp; - drawSrg->SetSampler(m_fontShaderData.m_samplerInputIndex, samplerState); drawSrg->Compile(); m_dynamicDraw->DrawIndexed(m_vertexBuffer, m_vertexCount, m_indexBuffer, m_indexCount, RHI::IndexFormat::Uint16, drawSrg); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationBus.h index 8b4d1172f7..6b3b1f69e4 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationBus.h @@ -13,7 +13,7 @@ #pragma once #include -#include +#include #include namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationComponentConfig.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationComponentConfig.h index 4f7f24313f..caf419a036 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationComponentConfig.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/PostProcess/LookModification/LookModificationComponentConfig.h @@ -13,7 +13,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp index 8c85dde6db..4f299e89b6 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ namespace AZ } EditorCommonFeaturesSystemComponent::EditorCommonFeaturesSystemComponent() = default; + EditorCommonFeaturesSystemComponent::~EditorCommonFeaturesSystemComponent() = default; //! Main system component for the Atom Common Feature Gem's editor/tools module. @@ -84,49 +86,67 @@ namespace AZ void EditorCommonFeaturesSystemComponent::Activate() { + m_renderer = AZStd::make_unique(); + m_previewerFactory = AZStd::make_unique (); m_skinnedMeshDebugDisplay = AZStd::make_unique(); AzToolsFramework::EditorLevelNotificationBus::Handler::BusConnect(); + AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusConnect(); + AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect(); } void EditorCommonFeaturesSystemComponent::Deactivate() { AzToolsFramework::EditorLevelNotificationBus::Handler::BusDisconnect(); + AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect(); + AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusDisconnect(); + m_skinnedMeshDebugDisplay.reset(); + m_previewerFactory.reset(); + m_renderer.reset(); } void EditorCommonFeaturesSystemComponent::OnNewLevelCreated() { - AZ::Data::AssetCatalogRequestBus::BroadcastResult(m_levelDefaultSliceAssetId, &AZ::Data::AssetCatalogRequests::GetAssetIdByPath, m_atomLevelDefaultAssetPath.c_str(), azrtti_typeid(), false); + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); - if (m_levelDefaultSliceAssetId.IsValid()) + if (!isPrefabSystemEnabled) { - AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().GetAsset( - m_levelDefaultSliceAssetId, - AZ::Data::AssetLoadBehavior::Default); + AZ::Data::AssetCatalogRequestBus::BroadcastResult( + m_levelDefaultSliceAssetId, &AZ::Data::AssetCatalogRequests::GetAssetIdByPath, m_atomLevelDefaultAssetPath.c_str(), + azrtti_typeid(), false); - asset.BlockUntilLoadComplete(); - - if (asset) + if (m_levelDefaultSliceAssetId.IsValid()) { - AZ::Vector3 cameraPosition = AZ::Vector3::CreateZero(); - bool activeCameraFound = false; - Camera::EditorCameraRequestBus::BroadcastResult(activeCameraFound, &Camera::EditorCameraRequestBus::Events::GetActiveCameraPosition, cameraPosition); + AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().GetAsset( + m_levelDefaultSliceAssetId, AZ::Data::AssetLoadBehavior::Default); - if (activeCameraFound) - { - AZ::Transform worldTransform = AZ::Transform::CreateTranslation(cameraPosition); + asset.BlockUntilLoadComplete(); - AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusConnect(); + if (asset) + { + AZ::Vector3 cameraPosition = AZ::Vector3::CreateZero(); + bool activeCameraFound = false; + Camera::EditorCameraRequestBus::BroadcastResult( + activeCameraFound, &Camera::EditorCameraRequestBus::Events::GetActiveCameraPosition, cameraPosition); - if (IEditor* editor = GetLegacyEditor(); - !editor->IsUndoSuspended()) + if (activeCameraFound) { - editor->SuspendUndo(); - } + AZ::Transform worldTransform = AZ::Transform::CreateTranslation(cameraPosition); + + AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusConnect(); + + if (IEditor* editor = GetLegacyEditor(); !editor->IsUndoSuspended()) + { + editor->SuspendUndo(); + } - AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Broadcast( - &AzToolsFramework::SliceEditorEntityOwnershipServiceRequests::InstantiateEditorSlice, asset, worldTransform); + AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Broadcast( + &AzToolsFramework::SliceEditorEntityOwnershipServiceRequests::InstantiateEditorSlice, asset, + worldTransform); + } } } } @@ -165,7 +185,6 @@ namespace AZ } } - void EditorCommonFeaturesSystemComponent::OnSliceInstantiationFailed(const AZ::Data::AssetId& sliceAssetId, const AzFramework::SliceInstantiationTicket& /*ticket*/) { if (m_levelDefaultSliceAssetId == sliceAssetId) @@ -175,5 +194,16 @@ namespace AZ AZ_Warning("EditorCommonFeaturesSystemComponent", false, "Failed to instantiate default Atom environment slice."); } } + + const AzToolsFramework::AssetBrowser::PreviewerFactory* EditorCommonFeaturesSystemComponent::GetPreviewerFactory( + const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const + { + return m_previewerFactory->IsEntrySupported(entry) ? m_previewerFactory.get() : nullptr; + } + + void EditorCommonFeaturesSystemComponent::OnApplicationAboutToStop() + { + m_renderer.reset(); + } } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.h index 5f43937cf0..aaac4dd730 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.h @@ -13,8 +13,12 @@ #include #include +#include #include #include +#include +#include +#include namespace AZ { @@ -27,6 +31,8 @@ namespace AZ : public AZ::Component , public AzToolsFramework::EditorLevelNotificationBus::Handler , public AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler + , public AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler + , public AzFramework::ApplicationLifecycleEvents::Bus::Handler { public: AZ_COMPONENT(EditorCommonFeaturesSystemComponent, "{D73D77CF-D5AF-428B-909B-324E96D3DEF5}"); @@ -54,12 +60,21 @@ namespace AZ void OnSliceInstantiated(const AZ::Data::AssetId&, AZ::SliceComponent::SliceInstanceAddress&, const AzFramework::SliceInstantiationTicket&) override; void OnSliceInstantiationFailed(const AZ::Data::AssetId&, const AzFramework::SliceInstantiationTicket&) override; + // AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler overrides... + const AzToolsFramework::AssetBrowser::PreviewerFactory* GetPreviewerFactory(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const override; + + // AzFramework::ApplicationLifecycleEvents overrides... + void OnApplicationAboutToStop() override; + private: AZStd::unique_ptr m_skinnedMeshDebugDisplay; AZ::Data::AssetId m_levelDefaultSliceAssetId; AZStd::string m_atomLevelDefaultAssetPath{ "LevelAssets/default.slice" }; float m_envProbeHeight{ 200.0f }; + + AZStd::unique_ptr m_renderer; + AZStd::unique_ptr m_previewerFactory; }; } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.cpp index af81d0e8bb..c2f9c896af 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.cpp @@ -83,16 +83,21 @@ namespace AZ m_entityId = entityId; m_dirty = true; + RPI::ScenePtr scene = RPI::RPISystemInterface::Get()->GetDefaultScene(); + if (scene) + { + AZ::RPI::SceneNotificationBus::Handler::BusConnect(scene->GetId()); + } + GridComponentRequestBus::Handler::BusConnect(m_entityId); AZ::TransformNotificationBus::Handler::BusConnect(m_entityId); - AZ::TickBus::Handler::BusConnect(); } void GridComponentController::Deactivate() { - AZ::TickBus::Handler::BusDisconnect(); AZ::TransformNotificationBus::Handler::BusDisconnect(); GridComponentRequestBus::Handler::BusDisconnect(); + AZ::RPI::SceneNotificationBus::Handler::BusDisconnect(); m_entityId = EntityId(EntityId::InvalidEntityId); } @@ -171,11 +176,8 @@ namespace AZ return m_configuration.m_secondaryColor; } - void GridComponentController::OnTick(float deltaTime, AZ::ScriptTimePoint time) + void GridComponentController::OnBeginPrepareRender() { - AZ_UNUSED(time); - AZ_UNUSED(deltaTime); - auto* auxGeomFP = AZ::RPI::Scene::GetFeatureProcessorForEntity(m_entityId); if (auto auxGeom = auxGeomFP->GetDrawQueue()) { diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.h index 226fbc31a7..afba6d8327 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Grid/GridComponentController.h @@ -13,10 +13,10 @@ #pragma once #include -#include #include #include #include +#include namespace AZ { @@ -25,8 +25,8 @@ namespace AZ //! Controls behavior and rendering of a wireframe grid class GridComponentController final : public GridComponentRequestBus::Handler - , public AZ::TickBus::Handler , public AZ::TransformNotificationBus::Handler + , public AZ::RPI::SceneNotificationBus::Handler { public: friend class EditorGridComponent; @@ -64,12 +64,12 @@ namespace AZ void SetSecondaryColor(const AZ::Color& gridSecondaryColor) override; AZ::Color GetSecondaryColor() const override; - // AZ::TickBus::Handler overrides ... - void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; - //! AZ::TransformNotificationBus::Handler overrides ... void OnTransformChanged(const Transform& local, const Transform& world) override; + // AZ::RPI::SceneNotificationBus::Handler overrides ... + void OnBeginPrepareRender() override; + void BuildGrid(); EntityId m_entityId; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.cpp index 0371e9633c..65a09db94c 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.cpp @@ -11,32 +11,26 @@ */ #include +#include + #include +#include #include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT #include -#include -#include -#include #include #include +#include +#include +#include #include #include -#include +#include #include AZ_POP_DISABLE_WARNING @@ -102,28 +96,6 @@ namespace AZ return exportPath; } - // Returns message text based on the item state - QString GetExportItemStatusMessage(const ExportItem& exportItem) - { - QFileInfo fileInfo(exportItem.m_exportPath.c_str()); - if (!exportItem.m_enabled) - { - return QString("Do not generate a new material."); - } - - if (fileInfo == QFileInfo()) - { - return QString("A valid material file path is required."); - } - - if (fileInfo.exists()) - { - return QString("\"%1\" will be replaced in the designated folder.").arg(fileInfo.fileName()); - } - - return QString("\"%1\" will be generated in the designated folder.").arg(fileInfo.fileName()); - } - bool OpenExportDialog(ExportItemsContainer& exportItems) { QWidget* activeWindow = nullptr; @@ -133,11 +105,10 @@ namespace AZ QDialog dialog(activeWindow); dialog.setWindowTitle("Generate Source Materials"); - const QStringList headerLabels = { "Enable", "Material Slot", "Material Filename", "Status" }; - const int EnableColumn = 0; - const int MaterialColumn = 1; - const int FileColumn = 2; - const int StatusColumn = 3; + const QStringList headerLabels = { "Material Slot", "Material Filename", "Overwrite" }; + const int MaterialSlotColumn = 0; + const int MaterialFileColumn = 1; + const int OverwriteFileColumn = 2; // Create a table widget that will be filled with all of the data and options for each exported material QTableWidget* tableWidget = new QTableWidget(&dialog); @@ -153,8 +124,10 @@ namespace AZ tableWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); // Force the table to stretch its header to fill the entire width of the dialog - tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - tableWidget->horizontalHeader()->setStretchLastSection(true); + tableWidget->horizontalHeader()->setSectionResizeMode(MaterialSlotColumn, QHeaderView::ResizeToContents); + tableWidget->horizontalHeader()->setSectionResizeMode(MaterialFileColumn, QHeaderView::Stretch); + tableWidget->horizontalHeader()->setSectionResizeMode(OverwriteFileColumn, QHeaderView::ResizeToContents); + tableWidget->horizontalHeader()->setStretchLastSection(false); // Hide row numbers tableWidget->verticalHeader()->setVisible(false); @@ -166,46 +139,55 @@ namespace AZ // Configuring initial settings based on whether or not the target file already exists exportItem.m_exportPath = fileInfo.absoluteFilePath().toUtf8().constData(); + exportItem.m_exists = fileInfo.exists(); + exportItem.m_overwrite = false; // Populate the table with data for every column - tableWidget->setItem(row, EnableColumn, new QTableWidgetItem(exportItem.m_enabled)); - tableWidget->setItem(row, MaterialColumn, new QTableWidgetItem(GetLabelByAssetId(exportItem.m_assetId).c_str())); - tableWidget->setItem(row, FileColumn, new QTableWidgetItem(fileInfo.fileName())); + tableWidget->setItem(row, MaterialSlotColumn, new QTableWidgetItem()); + tableWidget->setItem(row, MaterialFileColumn, new QTableWidgetItem()); + tableWidget->setItem(row, OverwriteFileColumn, new QTableWidgetItem()); // Create a check box for toggling the enabled state of this item - QWidget* enableCheckBoxParent = new QWidget(tableWidget); - QCheckBox* enableCheckBox = new QCheckBox(enableCheckBoxParent); - enableCheckBox->setChecked(exportItem.m_enabled); - - // Center checkbox in cell - QHBoxLayout* enableCheckBoxLayout = new QHBoxLayout(enableCheckBoxParent); - enableCheckBoxLayout->setAlignment(Qt::AlignCenter); - enableCheckBoxLayout->addWidget(enableCheckBox); - enableCheckBoxParent->setLayout(enableCheckBoxLayout); - - tableWidget->setCellWidget(row, EnableColumn, enableCheckBoxParent); + QCheckBox* materialSlotCheckBox = new QCheckBox(tableWidget); + materialSlotCheckBox->setChecked(exportItem.m_enabled); + materialSlotCheckBox->setText(GetLabelByAssetId(exportItem.m_assetId).c_str()); + tableWidget->setCellWidget(row, MaterialSlotColumn, materialSlotCheckBox); // Create a file picker widget for selecting the save path for the exported material - AzQtComponents::BrowseEdit* fileWidget = new AzQtComponents::BrowseEdit(tableWidget); - fileWidget->setLineEditReadOnly(true); - fileWidget->setClearButtonEnabled(false); - fileWidget->setText(fileInfo.fileName()); - tableWidget->setCellWidget(row, FileColumn, fileWidget); - - // The status widget will be used to inform the user of issues and outcomes from selected settings - QLabel* statusWidget = new QLabel(tableWidget); - statusWidget->setText(GetExportItemStatusMessage(exportItem)); - tableWidget->setCellWidget(row, StatusColumn, statusWidget); + AzQtComponents::BrowseEdit* materialFileWidget = new AzQtComponents::BrowseEdit(tableWidget); + materialFileWidget->setLineEditReadOnly(true); + materialFileWidget->setClearButtonEnabled(false); + materialFileWidget->setEnabled(exportItem.m_enabled); + materialFileWidget->setText(fileInfo.fileName()); + tableWidget->setCellWidget(row, MaterialFileColumn, materialFileWidget); + + // Create a check box for toggling the overwrite state of this item + QWidget* overwriteCheckBoxContainer = new QWidget(tableWidget); + QCheckBox* overwriteCheckBox = new QCheckBox(overwriteCheckBoxContainer); + overwriteCheckBox->setChecked(exportItem.m_overwrite); + overwriteCheckBox->setEnabled(exportItem.m_enabled && exportItem.m_exists); + + overwriteCheckBoxContainer->setLayout(new QHBoxLayout(overwriteCheckBoxContainer)); + overwriteCheckBoxContainer->layout()->addWidget(overwriteCheckBox); + overwriteCheckBoxContainer->layout()->setAlignment(Qt::AlignCenter); + overwriteCheckBoxContainer->layout()->setContentsMargins(0, 0, 0, 0); + + tableWidget->setCellWidget(row, OverwriteFileColumn, overwriteCheckBoxContainer); // Whenever the selection is updated, automatically apply the change to the export item - QObject::connect(enableCheckBox, &QCheckBox::stateChanged, enableCheckBox, [&dialog, &exportItem, enableCheckBox, fileWidget, statusWidget]([[maybe_unused]] int state) { - exportItem.m_enabled = enableCheckBox->isChecked(); - fileWidget->setEnabled(exportItem.m_enabled); - statusWidget->setText(GetExportItemStatusMessage(exportItem)); + QObject::connect(materialSlotCheckBox, &QCheckBox::stateChanged, materialSlotCheckBox, [&]([[maybe_unused]] int state) { + exportItem.m_enabled = materialSlotCheckBox->isChecked(); + materialFileWidget->setEnabled(exportItem.m_enabled); + overwriteCheckBox->setEnabled(exportItem.m_enabled && exportItem.m_exists); + }); + + // Whenever the overwrite check box is updated, automatically apply the change to the export item + QObject::connect(overwriteCheckBox, &QCheckBox::stateChanged, overwriteCheckBox, [&]([[maybe_unused]] int state) { + exportItem.m_overwrite = overwriteCheckBox->isChecked(); }); // Whenever the browse button is clicked, open a save file dialog in the same location as the current export file setting - QObject::connect(fileWidget, &AzQtComponents::BrowseEdit::attachedButtonTriggered, fileWidget, [&dialog, &exportItem, enableCheckBox, fileWidget, statusWidget]() { + QObject::connect(materialFileWidget, &AzQtComponents::BrowseEdit::attachedButtonTriggered, materialFileWidget, [&]() { QFileInfo fileInfo = QFileDialog::getSaveFileName(&dialog, QString("Select Material Filename"), exportItem.m_exportPath.c_str(), @@ -213,21 +195,24 @@ namespace AZ nullptr, QFileDialog::DontConfirmOverwrite); - if (fileInfo != QFileInfo()) + // Only update the export data if a valid path and filename was selected + if (!fileInfo.absoluteFilePath().isEmpty()) { - // Only update the export data if a valid path and filename was selected exportItem.m_exportPath = fileInfo.absoluteFilePath().toUtf8().constData(); - + exportItem.m_exists = fileInfo.exists(); + exportItem.m_overwrite = fileInfo.exists(); +\ // Update the controls to display the new state - fileWidget->setText(fileInfo.fileName()); - statusWidget->setText(GetExportItemStatusMessage(exportItem)); + materialFileWidget->setText(fileInfo.fileName()); + overwriteCheckBox->setChecked(exportItem.m_overwrite); + overwriteCheckBox->setEnabled(exportItem.m_enabled && exportItem.m_exists); } }); ++row; } - tableWidget->sortItems(MaterialColumn); + tableWidget->sortItems(MaterialSlotColumn); // Create the bottom row of the dialog with action buttons for exporting or canceling the operation QWidget* buttonRow = new QWidget(&dialog); @@ -245,7 +230,8 @@ namespace AZ buttonLayout->addWidget(cancelButton); // Create a heading label for the top of the dialog - QLabel* labelWidget = new QLabel("Select the material slots that you want to generate new source materials for. Edit the material file name and location using the file picker.", &dialog); + QLabel* labelWidget = new QLabel("\nSelect the material slots that you want to generate new source materials for. Edit the material file name and location using the file picker.\n", &dialog); + labelWidget->setWordWrap(true); QVBoxLayout* dialogLayout = new QVBoxLayout(&dialog); dialogLayout->addWidget(labelWidget); @@ -257,7 +243,7 @@ namespace AZ // Temporarily settng fixed size because dialog.show/exec invokes WindowDecorationWrapper::showEvent. // This forces the dialog to be centered and sized based on the layout of content. // Resizing the dialog after show will not be centered and moving the dialog programatically doesn't m0ve the custmk frame. - dialog.setFixedSize(1000, 200); + dialog.setFixedSize(500, 200); dialog.show(); // Removing fixed size to allow drag resizing @@ -275,78 +261,25 @@ namespace AZ return false; } - // Load the originating product asset from which the new source has set will be generated - auto materialAssetOutcome = AZ::RPI::AssetUtils::LoadAsset(exportItem.m_assetId); - if (!materialAssetOutcome) + if (exportItem.m_exists && !exportItem.m_overwrite) { - AZ_Error("AZ::Render::EditorMaterialComponentExporter", false, "Failed to load initial material asset while attempting to export: %s", exportItem.m_exportPath.c_str()); - return false; - } - - AZ::Data::Asset materialAsset = materialAssetOutcome.GetValue(); - AZ::Data::Asset materialTypeAsset = materialAsset->GetMaterialTypeAsset(); - - // We need a valid path to the material type source data because it's required for to get the property layout and assign to the new material - const AZStd::string& materialTypePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(materialTypeAsset.GetId()); - if (materialTypePath.empty()) - { - AZ_Error("AZ::Render::EditorMaterialComponentExporter", false, "Failed to locate source material type asset while attempting to export: %s", exportItem.m_exportPath.c_str()); - return false; + return true; } - // Getting the source info for the material type file to make sure that it exists - // We also need to watch folder to generate a relative asset path for the material type - bool result = false; - AZ::Data::AssetInfo info; - AZStd::string watchFolder; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, materialTypePath.c_str(), info, watchFolder); - if (!result) + EditorMaterialComponentUtil::MaterialEditData editData; + if (!EditorMaterialComponentUtil::LoadMaterialEditDataFromAssetId(exportItem.m_assetId, editData)) { - AZ_Error("AZ::Render::EditorMaterialComponentExporter", false, "Failed to get source file info and asset path while attempting to export: %s", exportItem.m_exportPath.c_str()); + AZ_Warning("AZ::Render::EditorMaterialComponentExporter", false, "Failed to load material data."); return false; } - // At this point, we should be ready to attempt to load the material type data - auto materialTypeOutcome = AZ::RPI::MaterialUtils::LoadMaterialTypeSourceData(materialTypePath); - if (!materialTypeOutcome.IsSuccess()) + if (!EditorMaterialComponentUtil::SaveSourceMaterialFromEditData(exportItem.m_exportPath, editData)) { - AZ_Error("AZ::Render::EditorMaterialComponentExporter", false, "Failed to load material type source data: %s", materialTypePath.c_str()); + AZ_Warning("AZ::Render::EditorMaterialComponentExporter", false, "Failed to save material data."); return false; } - AZ::RPI::MaterialTypeSourceData materialTypeSourceData = materialTypeOutcome.GetValue(); - - // Construct the material source data object that will be exported - AZ::RPI::MaterialSourceData exportData; - exportData.m_propertyLayoutVersion = materialTypeSourceData.m_propertyLayout.m_version; - - // Converting the absolute material type app to an asset relative path - exportData.m_materialType = materialTypePath; - AzFramework::ApplicationRequests::Bus::Broadcast(&AzFramework::ApplicationRequests::Bus::Events::MakePathRelative, exportData.m_materialType, watchFolder.c_str()); - - // Copy all of the properties from the material asset to the source data that will be exported - result = true; - materialTypeSourceData.EnumerateProperties([&materialAsset, &materialTypeSourceData, &exportData, &exportItem, &result](const AZStd::string& groupNameId, const AZStd::string& propertyNameId, const auto& propertyDefinition) { - const AZ::RPI::MaterialPropertyId propertyId(groupNameId, propertyNameId); - const AZ::RPI::MaterialPropertyIndex propertyIndex = materialAsset->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyId.GetFullName()); - AZ::RPI::MaterialPropertyValue propertyValue = materialAsset->GetPropertyValues()[propertyIndex.GetIndex()]; - - if (!materialTypeSourceData.ConvertPropertyValueToSourceDataFormat(propertyDefinition, propertyValue)) - { - AZ_Error("AZ::Render::EditorMaterialComponentExporter", false, "Failed to export: %s", exportItem.m_exportPath.c_str()); - result = false; - return false; - } - - if (propertyDefinition.m_value == propertyValue) - { - return true; - } - - exportData.m_properties[groupNameId][propertyDefinition.m_nameId].m_value = propertyValue; - return true; - }); - return result && AZ::RPI::JsonUtils::SaveObjectToFile(exportItem.m_exportPath, exportData); + return true; } } // namespace EditorMaterialComponentExporter } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.h index e7a0279d0a..a9482382ef 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentExporter.h @@ -32,6 +32,8 @@ namespace AZ struct ExportItem { bool m_enabled = true; + bool m_exists = false; + bool m_overwrite = false; AZ::Data::AssetId m_assetId; AZStd::string m_exportPath; }; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp index 6981177ab9..d2400f52a3 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp @@ -11,32 +11,39 @@ */ #include -#include -#include -#include + #include #include #include #include -#include -#include #include -#include -#include -#include #include - +#include #include #include - +#include +#include +#include +#include #include +#include +#include +#include +#include +#include + +#include AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT #include #include -#include +#include #include +#include +#include +#include #include +#include AZ_POP_DISABLE_WARNING namespace AZ @@ -45,8 +52,11 @@ namespace AZ { namespace EditorMaterialComponentInspector { - MaterialPropertyInspector::MaterialPropertyInspector(const AZ::Data::AssetId& assetId, PropertyChangedCallback propertyChangedCallback, QWidget* parent) + MaterialPropertyInspector::MaterialPropertyInspector( + const AZStd::string& slotName, const AZ::Data::AssetId& assetId, PropertyChangedCallback propertyChangedCallback, + QWidget* parent) : AtomToolsFramework::InspectorWidget(parent) + , m_slotName(slotName) , m_materialAssetId(assetId) , m_propertyChangedCallback(propertyChangedCallback) { @@ -59,65 +69,25 @@ namespace AZ bool MaterialPropertyInspector::LoadMaterial() { - if (!m_materialAssetId.IsValid()) + if (!EditorMaterialComponentUtil::LoadMaterialEditDataFromAssetId(m_materialAssetId, m_editData)) { - AZ_Warning("AZ::Render::EditorMaterialComponentInspector", false, "Attempted to load material data for invalid asset id."); + AZ_Warning("AZ::Render::EditorMaterialComponentInspector", false, "Failed to load material data."); return false; } - // Load the originating product asset from which the new source has set will be generated - auto materialAssetOutcome = AZ::RPI::AssetUtils::LoadAsset(m_materialAssetId); - if (!materialAssetOutcome) - { - AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Failed to load material asset: %s", m_materialAssetId.ToString().c_str()); - return false; - } - - m_materialAsset = materialAssetOutcome.GetValue(); - m_materialTypeAsset = m_materialAsset->GetMaterialTypeAsset(); - m_parentMaterialAsset = {}; - // The material instance is still needed for functor execution - m_materialInstance = AZ::RPI::Material::Create(m_materialAsset); + m_materialInstance = AZ::RPI::Material::Create(m_editData.m_materialAsset); if (!m_materialInstance) { AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Material instance could not be created."); return false; } - // We need a valid path to the material type source data because it's required for to get the property layout and assign to the new material - const AZStd::string& materialTypePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(m_materialTypeAsset.GetId()); - if (materialTypePath.empty()) - { - AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Failed to locate source material type asset: %s", m_materialAssetId.ToString().c_str()); - return false; - } - - // Getting the source info for the material type file to make sure that it exists - // We also need to watch folder to generate a relative asset path for the material type - bool result = false; - AZ::Data::AssetInfo info; - AZStd::string watchFolder; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, materialTypePath.c_str(), info, watchFolder); - if (!result) - { - AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Failed to get source file info and asset path: %s", materialTypePath.c_str()); - return false; - } - - // At this point, we should be ready to attempt to load the material type data - auto materialTypeOutcome = AZ::RPI::MaterialUtils::LoadMaterialTypeSourceData(materialTypePath); - if (!materialTypeOutcome.IsSuccess()) - { - AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Failed to load material type source data: %s", materialTypePath.c_str()); - return false; - } - m_materialTypeSourceData = materialTypeOutcome.GetValue(); - // Get a list of all the editor functors to be used for property editor states - auto propertyLayout = m_materialAsset->GetMaterialPropertiesLayout(); - const AZ::RPI::MaterialFunctorSourceData::EditorContext editorContext = AZ::RPI::MaterialFunctorSourceData::EditorContext(materialTypePath, propertyLayout); - for (AZ::RPI::Ptr functorData : m_materialTypeSourceData.m_materialFunctorSourceData) + auto propertyLayout = m_editData.m_materialAsset->GetMaterialPropertiesLayout(); + const AZ::RPI::MaterialFunctorSourceData::EditorContext editorContext = + AZ::RPI::MaterialFunctorSourceData::EditorContext(m_editData.m_materialTypeSourcePath, propertyLayout); + for (AZ::RPI::Ptr functorData : m_editData.m_materialTypeSourceData.m_materialFunctorSourceData) { AZ::RPI::MaterialFunctorSourceData::FunctorResult createResult = functorData->CreateFunctor(editorContext); @@ -131,7 +101,7 @@ namespace AZ } else { - AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Material functors were not created: '%s'.", materialTypePath.c_str()); + AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Material functors were not created: '%s'.", m_editData.m_materialTypeSourcePath.c_str()); } } @@ -153,40 +123,61 @@ namespace AZ const AZStd::string& groupNameId = "Details"; const AZStd::string& groupDisplayName = "Details"; const AZStd::string& groupDescription = ""; - auto& group = m_groups[groupNameId]; - AtomToolsFramework::DynamicPropertyConfig propertyConfig; - propertyConfig.m_dataType = AtomToolsFramework::DynamicPropertyType::Asset; - propertyConfig.m_id = "details.materialType"; - propertyConfig.m_nameId = "materialType"; - propertyConfig.m_displayName = "Material Type"; - propertyConfig.m_description = propertyConfig.m_displayName; - propertyConfig.m_defaultValue = AZStd::any(m_materialAsset->GetMaterialTypeAsset()); - propertyConfig.m_originalValue = propertyConfig.m_defaultValue; - propertyConfig.m_parentValue = propertyConfig.m_defaultValue; - propertyConfig.m_readOnly = true; - group.m_properties.emplace_back(propertyConfig); - - propertyConfig = {}; - propertyConfig.m_dataType = AtomToolsFramework::DynamicPropertyType::Asset; - propertyConfig.m_id = "details.parentMaterial"; - propertyConfig.m_nameId = "parentMaterial"; - propertyConfig.m_displayName = "Parent Material"; - propertyConfig.m_description = propertyConfig.m_displayName; - propertyConfig.m_defaultValue = AZStd::any(m_parentMaterialAsset); - propertyConfig.m_originalValue = propertyConfig.m_defaultValue; - propertyConfig.m_parentValue = propertyConfig.m_defaultValue; - propertyConfig.m_readOnly = true; - group.m_properties.emplace_back(propertyConfig); + auto propertyGroupContainer = new QWidget(this); + propertyGroupContainer->setLayout(new QHBoxLayout()); + + AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey = + MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, m_editData.m_materialAssetId); + auto thumbnailWidget = new AzToolsFramework::Thumbnailer::ThumbnailWidget(this); + thumbnailWidget->setFixedSize(QSize(120, 120)); + thumbnailWidget->setVisible(true); + thumbnailWidget->SetThumbnailKey(thumbnailKey, AzToolsFramework::Thumbnailer::ThumbnailContext::DefaultContext); + propertyGroupContainer->layout()->addWidget(thumbnailWidget); + + auto materialInfoWidget = new QLabel(this); + QSizePolicy sizePolicy1(QSizePolicy::Ignored, QSizePolicy::Preferred); + sizePolicy1.setHorizontalStretch(0); + sizePolicy1.setVerticalStretch(0); + sizePolicy1.setHeightForWidth(materialInfoWidget->sizePolicy().hasHeightForWidth()); + materialInfoWidget->setSizePolicy(sizePolicy1); + materialInfoWidget->setMinimumSize(QSize(0, 0)); + materialInfoWidget->setMaximumSize(QSize(16777215, 16777215)); + materialInfoWidget->setTextFormat(Qt::AutoText); + materialInfoWidget->setScaledContents(false); + materialInfoWidget->setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignTop); + materialInfoWidget->setWordWrap(true); + + QFileInfo materialFileInfo(AZ::RPI::AssetUtils::GetProductPathByAssetId(m_editData.m_materialAsset.GetId()).c_str()); + QFileInfo materialSourceFileInfo(m_editData.m_materialSourcePath.c_str()); + QFileInfo materialTypeSourceFileInfo(m_editData.m_materialTypeSourcePath.c_str()); + QFileInfo materialParentSourceFileInfo(AZ::RPI::AssetUtils::GetSourcePathByAssetId(m_editData.m_materialParentAsset.GetId()).c_str()); + + QString materialInfo; + materialInfo += tr(""); + materialInfo += tr("").arg(m_slotName.c_str()); + if (!materialFileInfo.fileName().isEmpty()) + { + materialInfo += tr("").arg(materialFileInfo.fileName()); + } + if (!materialTypeSourceFileInfo.fileName().isEmpty()) + { + materialInfo += tr("").arg(materialTypeSourceFileInfo.fileName()); + } + if (!materialSourceFileInfo.fileName().isEmpty()) + { + materialInfo += tr("").arg(materialSourceFileInfo.fileName()); + } + if (!materialParentSourceFileInfo.fileName().isEmpty()) + { + materialInfo += tr("").arg(materialParentSourceFileInfo.fileName()); + } + materialInfo += tr("
Material Slot %1
Material %1
Material Type %1
Material Source %1
Material Parent %1
"); + materialInfoWidget->setText(materialInfo); - // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties - auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget(&group, &group, group.TYPEINFO_Uuid(), this, this, - [this](const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target) { - AZ_UNUSED(source); - const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(target); - return property && AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); - }); - AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); + propertyGroupContainer->layout()->addWidget(materialInfoWidget); + + AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupContainer); } void MaterialPropertyInspector::AddUvNamesGroup() @@ -196,7 +187,7 @@ namespace AZ const AZStd::string groupDescription = "UV set names in this material, which can be renamed to match those in the model."; auto& group = m_groups[groupNameId]; - const RPI::MaterialUvNameMap& uvNameMap = m_materialAsset->GetMaterialTypeAsset()->GetUvNameMap(); + const RPI::MaterialUvNameMap& uvNameMap = m_editData.m_materialAsset->GetMaterialTypeAsset()->GetUvNameMap(); group.m_properties.reserve(uvNameMap.size()); for (const RPI::UvNamePair& uvNamePair : uvNameMap) @@ -237,14 +228,14 @@ namespace AZ AddUvNamesGroup(); // Copy all of the properties from the material asset to the source data that will be exported - for (const auto& groupDefinition : m_materialTypeSourceData.GetGroupDefinitionsInDisplayOrder()) + for (const auto& groupDefinition : m_editData.m_materialTypeSourceData.GetGroupDefinitionsInDisplayOrder()) { const AZStd::string& groupNameId = groupDefinition.m_nameId; const AZStd::string& groupDisplayName = !groupDefinition.m_displayName.empty() ? groupDefinition.m_displayName : groupNameId; const AZStd::string& groupDescription = !groupDefinition.m_description.empty() ? groupDefinition.m_description : groupDisplayName; auto& group = m_groups[groupNameId]; - const auto& propertyLayout = m_materialTypeSourceData.m_propertyLayout; + const auto& propertyLayout = m_editData.m_materialTypeSourceData.m_propertyLayout; const auto& propertyListItr = propertyLayout.m_properties.find(groupNameId); if (propertyListItr != propertyLayout.m_properties.end()) { @@ -255,10 +246,10 @@ namespace AZ AtomToolsFramework::ConvertToPropertyConfig(propertyConfig, propertyDefinition); propertyConfig.m_id = AZ::RPI::MaterialPropertyId(groupNameId, propertyDefinition.m_nameId).GetFullName(); - const auto& propertyIndex = m_materialAsset->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyConfig.m_id); - propertyConfig.m_defaultValue = AtomToolsFramework::ConvertToEditableType(m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]); - propertyConfig.m_parentValue = AtomToolsFramework::ConvertToEditableType(m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]); - propertyConfig.m_originalValue = AtomToolsFramework::ConvertToEditableType(m_materialAsset->GetPropertyValues()[propertyIndex.GetIndex()]); + const auto& propertyIndex = m_editData.m_materialAsset->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyConfig.m_id); + propertyConfig.m_defaultValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]); + propertyConfig.m_parentValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]); + propertyConfig.m_originalValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialAsset->GetPropertyValues()[propertyIndex.GetIndex()]); group.m_properties.emplace_back(propertyConfig); } } @@ -283,7 +274,7 @@ namespace AZ { if (m_propertyChangedCallback) { - m_propertyChangedCallback(m_materialPropertyOverrideMap); + m_propertyChangedCallback(m_editData.m_materialPropertyOverrideMap); } } @@ -365,15 +356,15 @@ namespace AZ void MaterialPropertyInspector::SetOverrides(const MaterialPropertyOverrideMap& propertyOverrideMap) { - m_materialPropertyOverrideMap = propertyOverrideMap; + m_editData.m_materialPropertyOverrideMap = propertyOverrideMap; for (auto& group : m_groups) { for (auto& property : group.second.m_properties) { const AtomToolsFramework::DynamicPropertyConfig& propertyConfig = property.GetConfig(); - const auto overrideItr = m_materialPropertyOverrideMap.find(propertyConfig.m_id); - const auto& editValue = overrideItr != m_materialPropertyOverrideMap.end() ? overrideItr->second : propertyConfig.m_originalValue; + const auto overrideItr = m_editData.m_materialPropertyOverrideMap.find(propertyConfig.m_id); + const auto& editValue = overrideItr != m_editData.m_materialPropertyOverrideMap.end() ? overrideItr->second : propertyConfig.m_originalValue; // This first converts to an acceptable runtime type in case the value came from script const auto propertyIndex = m_materialInstance->FindPropertyIndex(property.GetId()); @@ -400,6 +391,82 @@ namespace AZ RebuildAll(); } + bool MaterialPropertyInspector::SaveMaterial() const + { + const QString defaultPath = AtomToolsFramework::GetUniqueFileInfo( + QString(AZ::IO::FileIOBase::GetInstance()->GetAlias("@devassets@")) + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "Materials" + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + + AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); + + const QString saveFilePath = AtomToolsFramework::GetSaveFileInfo(defaultPath).absoluteFilePath(); + if (saveFilePath.isEmpty()) + { + return false; + } + + if (!EditorMaterialComponentUtil::SaveSourceMaterialFromEditData(saveFilePath.toUtf8().constData(), m_editData)) + { + AZ_Warning("AZ::Render::EditorMaterialComponentInspector", false, "Failed to save material data."); + return false; + } + + return true; + } + + bool MaterialPropertyInspector::SaveMaterialToSource() const + { + const QString saveFilePath = AtomToolsFramework::GetSaveFileInfo(m_editData.m_materialSourcePath.c_str()).absoluteFilePath(); + if (saveFilePath.isEmpty()) + { + return false; + } + + if (!EditorMaterialComponentUtil::SaveSourceMaterialFromEditData(saveFilePath.toUtf8().constData(), m_editData)) + { + AZ_Warning("AZ::Render::EditorMaterialComponentInspector", false, "Failed to save material data."); + return false; + } + + return true; + } + + bool MaterialPropertyInspector::HasMaterialSource() const + { + return !m_editData.m_materialSourcePath.empty() && + AZ::StringFunc::Path::IsExtension(m_editData.m_materialSourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension); + } + + bool MaterialPropertyInspector::HasMaterialParentSource() const + { + return !m_editData.m_materialParentSourcePath.empty() && + AZ::StringFunc::Path::IsExtension( + m_editData.m_materialParentSourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension); + } + + void MaterialPropertyInspector::OpenMaterialSourceInEditor() const + { + if (HasMaterialSource()) + { + EditorMaterialSystemComponentRequestBus::Broadcast( + &EditorMaterialSystemComponentRequestBus::Events::OpenInMaterialEditor, m_editData.m_materialSourcePath); + } + } + + void MaterialPropertyInspector::OpenMaterialParentSourceInEditor() const + { + if (HasMaterialParentSource()) + { + EditorMaterialSystemComponentRequestBus::Broadcast( + &EditorMaterialSystemComponentRequestBus::Events::OpenInMaterialEditor, m_editData.m_materialParentSourcePath); + } + } + + const EditorMaterialComponentUtil::MaterialEditData& MaterialPropertyInspector::GetEditData() const + { + return m_editData; + } + void MaterialPropertyInspector::BeforePropertyModified(AzToolsFramework::InstanceDataNode* pNode) { // For some reason the reflected property editor notifications are not symmetrical @@ -422,7 +489,7 @@ namespace AZ { if (m_activeProperty == property) { - m_materialPropertyOverrideMap[m_activeProperty->GetId()] = m_activeProperty->GetValue(); + m_editData.m_materialPropertyOverrideMap[m_activeProperty->GetId()] = m_activeProperty->GetValue(); UpdateMaterialInstanceProperty(*m_activeProperty); RunPropertyChangedCallback(); } @@ -438,7 +505,7 @@ namespace AZ { if (m_activeProperty == property) { - m_materialPropertyOverrideMap[m_activeProperty->GetId()] = m_activeProperty->GetValue(); + m_editData.m_materialPropertyOverrideMap[m_activeProperty->GetId()] = m_activeProperty->GetValue(); UpdateMaterialInstanceProperty(*m_activeProperty); RunPropertyChangedCallback(); RunEditorMaterialFunctors(); @@ -447,7 +514,9 @@ namespace AZ } } - bool OpenInspectorDialog(const AZ::Data::AssetId& assetId, MaterialPropertyOverrideMap propertyOverrideMap, PropertyChangedCallback propertyChangedCallback) + bool OpenInspectorDialog( + const AZStd::string& slotName, const AZ::Data::AssetId& assetId, MaterialPropertyOverrideMap propertyOverrideMap, + PropertyChangedCallback propertyChangedCallback) { QWidget* activeWindow = nullptr; AzToolsFramework::EditorWindowRequestBus::BroadcastResult(activeWindow, &AzToolsFramework::EditorWindowRequests::GetAppMainWindow); @@ -456,7 +525,7 @@ namespace AZ QDialog dialog(activeWindow); dialog.setWindowTitle("Material Inspector"); - MaterialPropertyInspector* inspector = new MaterialPropertyInspector(assetId, propertyChangedCallback, &dialog); + MaterialPropertyInspector* inspector = new MaterialPropertyInspector(slotName, assetId, propertyChangedCallback, &dialog); if (!inspector->LoadMaterial()) { return false; @@ -465,48 +534,47 @@ namespace AZ inspector->Populate(); inspector->SetOverrides(propertyOverrideMap); - // Create the bottom row of the dialog with action buttons for exporting or canceling the operation - QWidget* buttonRow = new QWidget(&dialog); - buttonRow->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - - QPushButton* revertButton = new QPushButton("Revert", buttonRow); - QObject::connect(revertButton, &QPushButton::clicked, revertButton, [inspector, propertyOverrideMap] { - inspector->SetOverrides(propertyOverrideMap); - }); - - QPushButton* clearButton = new QPushButton("Clear", buttonRow); - QObject::connect(clearButton, &QPushButton::clicked, clearButton, [inspector] { - inspector->SetOverrides(MaterialPropertyOverrideMap()); - }); - - QPushButton* confirmButton = new QPushButton("Confirm", buttonRow); - QObject::connect(confirmButton, &QPushButton::clicked, confirmButton, [&dialog] { - dialog.accept(); - }); - - QPushButton* cancelButton = new QPushButton("Cancel", buttonRow); - QObject::connect(cancelButton, &QPushButton::clicked, cancelButton, [inspector, propertyOverrideMap, &dialog] { - inspector->SetOverrides(propertyOverrideMap); - dialog.reject(); - }); - - QHBoxLayout* buttonLayout = new QHBoxLayout(buttonRow); - buttonLayout->addStretch(); - buttonLayout->addWidget(revertButton); - buttonLayout->addWidget(clearButton); - buttonLayout->addWidget(confirmButton); - buttonLayout->addWidget(cancelButton); + // Create the menu bottom row with actions for exporting or canceling the operation + QToolButton* menuButton = new QToolButton(&dialog); + menuButton->setAutoRaise(true); + menuButton->setIcon(QIcon(":/Cards/img/UI20/Cards/menu_ico.svg")); + menuButton->setVisible(true); + QObject::connect(menuButton, &QToolButton::clicked, &dialog, [&]() { + QAction* action = nullptr; + + QMenu menu(&dialog); + action = menu.addAction("Clear Overrides", [&] { inspector->SetOverrides(MaterialPropertyOverrideMap()); }); + action = menu.addAction("Revert Changes", [&] { inspector->SetOverrides(propertyOverrideMap); }); + + menu.addSeparator(); + action = menu.addAction("Confirm Changes", [&] { dialog.accept(); }); + action = menu.addAction("Cancel Changes", [&] { dialog.reject(); }); + + menu.addSeparator(); + action = menu.addAction("Save Material", [&] { inspector->SaveMaterial(); }); + action = menu.addAction("Save Material To Source", [&] { inspector->SaveMaterialToSource(); }); + action->setEnabled(inspector->HasMaterialSource()); + + menu.addSeparator(); + action = menu.addAction("Open Source Material In Editor", [&] { inspector->OpenMaterialSourceInEditor(); }); + action->setEnabled(inspector->HasMaterialSource()); + action = menu.addAction("Open Parent Material In Editor", [&] { inspector->OpenMaterialParentSourceInEditor(); }); + action->setEnabled(inspector->HasMaterialParentSource()); + menu.exec(QCursor::pos()); + }); + + QObject::connect(&dialog, &QDialog::rejected, &dialog, [&] { inspector->SetOverrides(propertyOverrideMap); }); QVBoxLayout* dialogLayout = new QVBoxLayout(&dialog); + dialogLayout->addWidget(menuButton); dialogLayout->addWidget(inspector); - dialogLayout->addWidget(buttonRow); dialog.setLayout(dialogLayout); // Forcing the initial dialog size to accomodate typical content. // Temporarily settng fixed size because dialog.show/exec invokes WindowDecorationWrapper::showEvent. // This forces the dialog to be centered and sized based on the layout of content. // Resizing the dialog after show will not be centered and moving the dialog programatically doesn't m0ve the custmk frame. - dialog.setFixedSize(300, 600); + dialog.setFixedSize(500, 800); dialog.show(); // Removing fixed size to allow drag resizing diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h index a0d43cdba3..d3cc1901c2 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h @@ -13,19 +13,15 @@ #pragma once #if !defined(Q_MOC_RUN) -#include -#include +#include +#include #include -#include -#include -#include -#include - #include +#include +#include +#include #include - -#include -#include +#include #endif namespace AZ @@ -44,7 +40,9 @@ namespace AZ public: AZ_CLASS_ALLOCATOR(MaterialPropertyInspector, AZ::SystemAllocator, 0); - explicit MaterialPropertyInspector(const AZ::Data::AssetId& assetId, PropertyChangedCallback propertyChangedCallback, QWidget* parent = nullptr); + explicit MaterialPropertyInspector( + const AZStd::string& slotName, const AZ::Data::AssetId& assetId, PropertyChangedCallback propertyChangedCallback, + QWidget* parent = nullptr); ~MaterialPropertyInspector() override; bool LoadMaterial(); @@ -56,6 +54,14 @@ namespace AZ void SetOverrides(const MaterialPropertyOverrideMap& propertyOverrideMap); + bool SaveMaterial() const; + bool SaveMaterialToSource() const; + bool HasMaterialSource() const; + bool HasMaterialParentSource() const; + void OpenMaterialSourceInEditor() const; + void OpenMaterialParentSourceInEditor() const; + const EditorMaterialComponentUtil::MaterialEditData& GetEditData() const; + private: // AzToolsFramework::IPropertyEditorNotify overrides... @@ -76,20 +82,19 @@ namespace AZ // Tracking the property that is actively being edited in the inspector const AtomToolsFramework::DynamicProperty* m_activeProperty = {}; + AZStd::string m_slotName; AZ::Data::AssetId m_materialAssetId = {}; - MaterialPropertyOverrideMap m_materialPropertyOverrideMap = {}; + EditorMaterialComponentUtil::MaterialEditData m_editData; PropertyChangedCallback m_propertyChangedCallback = {}; - AZ::Data::Asset m_materialAsset = {}; - AZ::Data::Asset m_materialTypeAsset = {}; - AZ::Data::Asset m_parentMaterialAsset = {}; AZ::Data::Instance m_materialInstance = {}; - AZ::RPI::MaterialTypeSourceData m_materialTypeSourceData; AZStd::vector> m_editorFunctors = {}; AZ::RPI::MaterialPropertyFlags m_dirtyPropertyFlags = {}; AZStd::unordered_map m_groups = {}; }; - bool OpenInspectorDialog(const AZ::Data::AssetId& assetId, MaterialPropertyOverrideMap propertyOverrideMap, PropertyChangedCallback propertyChangedCallback); + bool OpenInspectorDialog( + const AZStd::string& slotName, const AZ::Data::AssetId& assetId, MaterialPropertyOverrideMap propertyOverrideMap, + PropertyChangedCallback propertyChangedCallback); } // namespace EditorMaterialComponentInspector } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp index 97b44451fe..1a41594b5a 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp @@ -242,7 +242,7 @@ namespace AZ if (m_materialAsset.GetId().IsValid()) { - if (EditorMaterialComponentInspector::OpenInspectorDialog(m_materialAsset.GetId(), m_propertyOverrides, applyPropertyChangedCallback)) + if (EditorMaterialComponentInspector::OpenInspectorDialog(GetLabel(), m_materialAsset.GetId(), m_propertyOverrides, applyPropertyChangedCallback)) { OnMaterialChanged(); } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentUtil.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentUtil.cpp new file mode 100644 index 0000000000..6fad752bc2 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentUtil.cpp @@ -0,0 +1,176 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace Render + { + namespace EditorMaterialComponentUtil + { + bool LoadMaterialEditDataFromAssetId(const AZ::Data::AssetId& assetId, MaterialEditData& editData) + { + editData = MaterialEditData(); + + if (!assetId.IsValid()) + { + AZ_Warning("AZ::Render::EditorMaterialComponentUtil", false, "Attempted to load material data for invalid asset id."); + return false; + } + + editData.m_materialAssetId = assetId; + + // Load the originating product asset from which the new source has set will be generated + auto materialAssetOutcome = AZ::RPI::AssetUtils::LoadAsset(editData.m_materialAssetId); + if (!materialAssetOutcome) + { + AZ_Error("AZ::Render::EditorMaterialComponentUtil", false, "Failed to load material asset: %s", editData.m_materialAssetId.ToString().c_str()); + return false; + } + + editData.m_materialAsset = materialAssetOutcome.GetValue(); + editData.m_materialTypeAsset = editData.m_materialAsset->GetMaterialTypeAsset(); + editData.m_materialParentAsset = {}; + + editData.m_materialSourcePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(editData.m_materialAsset.GetId()); + if (AzFramework::StringFunc::Path::IsExtension( + editData.m_materialSourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension)) + { + if (!AZ::RPI::JsonUtils::LoadObjectFromFile(editData.m_materialSourcePath, editData.m_materialSourceData)) + { + AZ_Error("AZ::Render::EditorMaterialComponentUtil", false, "Material source data could not be loaded: '%s'.", editData.m_materialSourcePath.c_str()); + return false; + } + } + + if (!editData.m_materialSourceData.m_parentMaterial.empty()) + { + // There is a parent for this material + auto parentMaterialResult = AZ::RPI::AssetUtils::LoadAsset(editData.m_materialSourcePath, editData.m_materialSourceData.m_parentMaterial); + if (!parentMaterialResult) + { + AZ_Error("AZ::Render::EditorMaterialComponentUtil", false, "Parent material asset could not be loaded: '%s'.", editData.m_materialSourceData.m_parentMaterial.c_str()); + return false; + } + + editData.m_materialParentAsset = parentMaterialResult.GetValue(); + editData.m_materialParentSourcePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(editData.m_materialParentAsset.GetId()); + } + + // We need a valid path to the material type source data to get the property layout and assign to the new material + editData.m_materialTypeSourcePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(editData.m_materialTypeAsset.GetId()); + if (editData.m_materialTypeSourcePath.empty()) + { + AZ_Error("AZ::Render::EditorMaterialComponentUtil", false, "Failed to locate source material type asset: %s", editData.m_materialAssetId.ToString().c_str()); + return false; + } + + // Load the material type source data + auto materialTypeOutcome = AZ::RPI::MaterialUtils::LoadMaterialTypeSourceData(editData.m_materialTypeSourcePath); + if (!materialTypeOutcome.IsSuccess()) + { + AZ_Error("AZ::Render::EditorMaterialComponentUtil", false, "Failed to load material type source data: %s", editData.m_materialTypeSourcePath.c_str()); + return false; + } + editData.m_materialTypeSourceData = materialTypeOutcome.GetValue(); + return true; + } + + bool SaveSourceMaterialFromEditData(const AZStd::string& path, const MaterialEditData& editData) + { + // Getting the source info for the material type file to make sure that it exists + // We also need to watch folder to generate a relative asset path for the material type + bool result = false; + AZ::Data::AssetInfo info; + AZStd::string watchFolder; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult( + result, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, + editData.m_materialTypeSourcePath.c_str(), info, watchFolder); + if (!result) + { + AZ_Error("AZ::Render::EditorMaterialComponentUtil", false, "Failed to get source file info and asset path while attempting to export: %s", path.c_str()); + return false; + } + + // Construct the material source data object that will be exported + AZ::RPI::MaterialSourceData exportData; + exportData.m_propertyLayoutVersion = editData.m_materialTypeSourceData.m_propertyLayout.m_version; + + // Converting absolute material paths to asset relative paths + exportData.m_materialType = editData.m_materialTypeSourcePath; + AzFramework::ApplicationRequests::Bus::Broadcast( + &AzFramework::ApplicationRequests::Bus::Events::MakePathRelative, exportData.m_materialType, watchFolder.c_str()); + + exportData.m_parentMaterial = editData.m_materialParentSourcePath; + AzFramework::ApplicationRequests::Bus::Broadcast( + &AzFramework::ApplicationRequests::Bus::Events::MakePathRelative, exportData.m_parentMaterial, watchFolder.c_str()); + + // Copy all of the properties from the material asset to the source data that will be exported + result = true; + editData.m_materialTypeSourceData.EnumerateProperties([&](const AZStd::string& groupNameId, const AZStd::string& propertyNameId, const auto& propertyDefinition) { + const AZ::RPI::MaterialPropertyId propertyId(groupNameId, propertyNameId); + const AZ::RPI::MaterialPropertyIndex propertyIndex = + editData.m_materialAsset->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyId.GetFullName()); + + AZ::RPI::MaterialPropertyValue propertyValue = editData.m_materialAsset->GetPropertyValues()[propertyIndex.GetIndex()]; + + AZ::RPI::MaterialPropertyValue propertyValueDefault = propertyDefinition.m_value; + if (editData.m_materialParentAsset.IsReady()) + { + propertyValueDefault = editData.m_materialParentAsset->GetPropertyValues()[propertyIndex.GetIndex()]; + } + + // Check for and apply any property overrides before saving property values + auto propertyOverrideItr = editData.m_materialPropertyOverrideMap.find(propertyId.GetFullName()); + if(propertyOverrideItr != editData.m_materialPropertyOverrideMap.end()) + { + propertyValue = AZ::RPI::MaterialPropertyValue::FromAny(propertyOverrideItr->second); + } + + if (!editData.m_materialTypeSourceData.ConvertPropertyValueToSourceDataFormat(propertyDefinition, propertyValue)) + { + AZ_Error("AZ::Render::EditorMaterialComponentUtil", false, "Failed to export: %s", path.c_str()); + result = false; + return false; + } + + // Don't export values if they are the same as the material type or parent + if (propertyValueDefault == propertyValue) + { + return true; + } + + exportData.m_properties[groupNameId][propertyDefinition.m_nameId].m_value = propertyValue; + return true; + }); + + return result && AZ::RPI::JsonUtils::SaveObjectToFile(path, exportData); + } + } // namespace EditorMaterialComponentUtil + } // namespace Render +} // namespace AZ + +//#include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentUtil.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentUtil.h new file mode 100644 index 0000000000..bc097e1248 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentUtil.h @@ -0,0 +1,47 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace Render + { + namespace EditorMaterialComponentUtil + { + struct MaterialEditData + { + AZ::Data::AssetId m_materialAssetId = {}; + AZ::Data::Asset m_materialAsset = {}; + AZ::Data::Asset m_materialTypeAsset = {}; + AZ::Data::Asset m_materialParentAsset = {}; + AZ::RPI::MaterialSourceData m_materialSourceData; + AZ::RPI::MaterialTypeSourceData m_materialTypeSourceData; + AZStd::string m_materialSourcePath; + AZStd::string m_materialTypeSourcePath; + AZStd::string m_materialParentSourcePath; + MaterialPropertyOverrideMap m_materialPropertyOverrideMap = {}; + }; + + bool LoadMaterialEditDataFromAssetId(const AZ::Data::AssetId& assetId, MaterialEditData& editData); + bool SaveSourceMaterialFromEditData(const AZStd::string& path, const MaterialEditData& editData); + } // namespace EditorMaterialComponentUtil + } // namespace Render +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp index d1d260b455..82f65b205d 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp @@ -25,7 +25,7 @@ #include -#include +#include // Disables warning messages triggered by the Qt library // 4251: class needs to have dll-interface to be used by clients of class @@ -95,8 +95,6 @@ namespace AZ { AzFramework::TargetManagerClient::Bus::Handler::BusConnect(); EditorMaterialSystemComponentRequestBus::Handler::BusConnect(); - m_materialPreviewerFactory = AZStd::make_unique (); - AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusConnect(); AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect(); AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusConnect(); AzToolsFramework::EditorMenuNotificationBus::Handler::BusConnect(); @@ -108,11 +106,9 @@ namespace AZ { AzFramework::TargetManagerClient::Bus::Handler::BusDisconnect(); EditorMaterialSystemComponentRequestBus::Handler::BusDisconnect(); - AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusDisconnect(); AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect(); AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); AzToolsFramework::EditorMenuNotificationBus::Handler::BusDisconnect(); - m_materialPreviewerFactory.reset(); TeardownThumbnails(); @@ -157,16 +153,11 @@ namespace AZ } } - const AzToolsFramework::AssetBrowser::PreviewerFactory* EditorMaterialSystemComponent::GetPreviewerFactory(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const - { - return m_materialPreviewerFactory->IsEntrySupported(entry) ? m_materialPreviewerFactory.get() : nullptr; - } - void EditorMaterialSystemComponent::OnApplicationAboutToStop() { TeardownThumbnails(); } - + void EditorMaterialSystemComponent::OnPopulateToolMenuItems() { if (!m_openMaterialEditorAction) @@ -198,7 +189,7 @@ namespace AZ using namespace LyIntegration; ThumbnailerRequestsBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, - MAKE_TCACHE(MaterialThumbnailCache), + MAKE_TCACHE(Thumbnails::MaterialThumbnailCache), ThumbnailContext::DefaultContext); } @@ -208,7 +199,7 @@ namespace AZ using namespace LyIntegration; ThumbnailerRequestsBus::Broadcast(&ThumbnailerRequests::UnregisterThumbnailProvider, - MaterialThumbnailCache::ProviderName, + Thumbnails::MaterialThumbnailCache::ProviderName, ThumbnailContext::DefaultContext); } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h index cffd3ee48a..de065f679e 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h @@ -16,16 +16,12 @@ #include #include -#include #include #include #include #include -#include -#include - namespace AZ { namespace Render @@ -35,7 +31,6 @@ namespace AZ : public AZ::Component , private EditorMaterialSystemComponentRequestBus::Handler , private AzFramework::TargetManagerClient::Bus::Handler - , private AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler , private AzFramework::ApplicationLifecycleEvents::Bus::Handler , public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler , public AzToolsFramework::EditorMenuNotificationBus::Handler @@ -63,10 +58,7 @@ namespace AZ //! AzFramework::TargetManagerClient::Bus::Handler overrides... void TargetJoinedNetwork(AzFramework::TargetInfo info) override; void TargetLeftNetwork(AzFramework::TargetInfo info) override; - - // AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler overrides... - const AzToolsFramework::AssetBrowser::PreviewerFactory* GetPreviewerFactory(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const override; - + // AzFramework::ApplicationLifecycleEvents overrides... void OnApplicationAboutToStop() override; @@ -83,8 +75,6 @@ namespace AZ // Material Editor target for interprocess communication with MaterialEditor AzFramework::TargetInfo m_materialEditorTarget; - AZStd::unique_ptr m_materialPreviewerFactory; - QAction* m_openMaterialEditorAction = nullptr; }; } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp index ecb0527a47..4db11eaa44 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp @@ -67,6 +67,11 @@ namespace AZ incompatible.push_back(AZ_CRC("MaterialProviderService", 0x64849a6b)); } + void MaterialComponentController::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(AZ_CRC("MaterialReceiverService", 0x0d1a6a74)); + } + MaterialComponentController::MaterialComponentController(const MaterialComponentConfig& config) : m_configuration(config) { diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h index 6ba6abeac2..32c095aeda 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h @@ -38,6 +38,7 @@ namespace AZ static void Reflect(ReflectContext* context); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); MaterialComponentController() = default; MaterialComponentController(const MaterialComponentConfig& config); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialThumbnail.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialThumbnail.cpp new file mode 100644 index 0000000000..21f592db4a --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialThumbnail.cpp @@ -0,0 +1,116 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + const int MaterialThumbnailSize = 200; + + ////////////////////////////////////////////////////////////////////////// + // MaterialThumbnail + ////////////////////////////////////////////////////////////////////////// + MaterialThumbnail::MaterialThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize) + : Thumbnail(key, thumbnailSize) + { + m_assetId = GetAssetId(key, RPI::MaterialAsset::RTTI_Type()); + if (!m_assetId.IsValid()) + { + AZ_Error("MaterialThumbnail", false, "Failed to find matching assetId for the thumbnailKey."); + m_state = State::Failed; + return; + } + + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusConnect(key); + AzFramework::AssetCatalogEventBus::Handler::BusConnect(); + } + + void MaterialThumbnail::LoadThread() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::QueueEvent( + RPI::MaterialAsset::RTTI_Type(), + &AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail, + m_key, + m_thumbnailSize); + // wait for response from thumbnail renderer + m_renderWait.acquire(); + } + + MaterialThumbnail::~MaterialThumbnail() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusDisconnect(); + AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); + } + + void MaterialThumbnail::ThumbnailRendered(QPixmap& thumbnailImage) + { + m_pixmap = thumbnailImage; + m_renderWait.release(); + } + + void MaterialThumbnail::ThumbnailFailedToRender() + { + m_state = State::Failed; + m_renderWait.release(); + } + + void MaterialThumbnail::OnCatalogAssetChanged([[maybe_unused]] const AZ::Data::AssetId& assetId) + { + if (m_assetId == assetId && + m_state == State::Ready) + { + m_state = State::Unloaded; + Load(); + } + } + + ////////////////////////////////////////////////////////////////////////// + // MaterialThumbnailCache + ////////////////////////////////////////////////////////////////////////// + MaterialThumbnailCache::MaterialThumbnailCache() + : ThumbnailCache() + { + } + + MaterialThumbnailCache::~MaterialThumbnailCache() = default; + + int MaterialThumbnailCache::GetPriority() const + { + // Material thumbnails override default source thumbnails, so carry higher priority + return 1; + } + + const char* MaterialThumbnailCache::GetProviderName() const + { + return ProviderName; + } + + bool MaterialThumbnailCache::IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const + { + return + GetAssetId(key, RPI::MaterialAsset::RTTI_Type()).IsValid() && + // in case it's a source fbx, it will contain both material and model products + // model thumbnails are handled by MeshThumbnail + !GetAssetId(key, RPI::ModelAsset::RTTI_Type()).IsValid(); + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + +#include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialThumbnail.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialThumbnail.h new file mode 100644 index 0000000000..249426dfe8 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialThumbnail.h @@ -0,0 +1,77 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#if !defined(Q_MOC_RUN) +#include +#include +#include +#include +#include +#endif + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + /** + * Custom material or model thumbnail that detects when an asset changes and updates the thumbnail + */ + class MaterialThumbnail + : public AzToolsFramework::Thumbnailer::Thumbnail + , public AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler + , private AzFramework::AssetCatalogEventBus::Handler + { + Q_OBJECT + public: + MaterialThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize); + ~MaterialThumbnail() override; + + //! AzToolsFramework::ThumbnailerRendererNotificationBus::Handler overrides... + void ThumbnailRendered(QPixmap& thumbnailImage) override; + void ThumbnailFailedToRender() override; + + protected: + void LoadThread() override; + + private: + // AzFramework::AssetCatalogEventBus::Handler interface overrides... + void OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) override; + + AZStd::binary_semaphore m_renderWait; + Data::AssetId m_assetId; + }; + + /** + * Cache configuration for large material thumbnails + */ + class MaterialThumbnailCache + : public AzToolsFramework::Thumbnailer::ThumbnailCache + { + public: + MaterialThumbnailCache(); + ~MaterialThumbnailCache() override; + + int GetPriority() const override; + const char* GetProviderName() const override; + + static constexpr const char* ProviderName = "Material Thumbnails"; + + protected: + bool IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const override; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.cpp deleted file mode 100644 index 1436ad255f..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -// Disables warning messages triggered by the Qt library -// 4251: class needs to have dll-interface to be used by clients of class -// 4800: forcing value to bool 'true' or 'false' (performance warning) -AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") -#include -#include -#include -AZ_POP_DISABLE_WARNING - -namespace AZ -{ - namespace LyIntegration - { - static constexpr int CharWidth = 6; - - MaterialPreviewer::MaterialPreviewer(QWidget* parent) - : Previewer(parent) - , m_ui(new Ui::MaterialPreviewerClass()) - { - m_ui->setupUi(this); - } - - MaterialPreviewer::~MaterialPreviewer() - { - } - - void MaterialPreviewer::Display(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) - { - using namespace AzToolsFramework::AssetBrowser; - - if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) - { - const auto source = azrtti_cast(entry); - if (source->GetChildCount() > 0) - { - const auto product = azrtti_cast(source->GetChild(0)); - if (product) - { - DisplayInternal(product); - } - } - } - else if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Product) - { - const auto product = azrtti_cast(entry); - DisplayInternal(product); - } - } - - const QString& MaterialPreviewer::GetName() const - { - return m_name; - } - - void MaterialPreviewer::resizeEvent([[maybe_unused]] QResizeEvent* event) - { - m_ui->m_materialPreviewWidget->setMaximumHeight(m_ui->m_materialPreviewWidget->width()); - - UpdateFileInfo(); - } - - void MaterialPreviewer::DisplayInternal(const AzToolsFramework::AssetBrowser::ProductAssetBrowserEntry* product) - { - using namespace AzToolsFramework; - using namespace Thumbnailer; - - if (product->GetAssetId() == m_assetId) - { - return; - } - - m_assetId = product->GetAssetId(); - m_fileInfo = QString::fromUtf8(product->GetParent()->GetName().c_str()); - - bool result = false; - AZ::Data::AssetInfo assetInfo; - AZ::Data::AssetType assetType; - AZStd::string rootFilePath; - const AZStd::string platformName = ""; // Empty for default - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystemRequestBus::Events::GetAssetInfoById, - m_assetId, assetType, platformName, assetInfo, rootFilePath); - - if (!result) - { - return; - } - - AZStd::string fullSourcePath = AZStd::string::format("%s/%s", rootFilePath.c_str(), assetInfo.m_relativePath.c_str()); - SharedThumbnailKey thumbnailKey = MAKE_TKEY(AzToolsFramework::AssetBrowser::SourceThumbnailKey, fullSourcePath.c_str()); - m_ui->m_materialPreviewWidget->SetThumbnailKey(thumbnailKey, Thumbnailer::ThumbnailContext::DefaultContext); - - UpdateFileInfo(); - } - - void MaterialPreviewer::UpdateFileInfo() const - { - m_ui->m_fileInfoLabel->setText(WordWrap(m_fileInfo, m_ui->m_fileInfoLabel->width() / CharWidth)); - } - - QString MaterialPreviewer::WordWrap(const QString& string, int maxLength) - { - QString result; - int length = 0; - - for (const QChar& c : string) - { - if (c == '\n') - { - length = 0; - } - else if (length > maxLength) - { - result.append('\n'); - length = 0; - } - else - { - length++; - } - result.append(c); - } - return result; - } - } // namespace LyIntegration -} // namespace AZ - -#include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.h deleted file mode 100644 index da1a5dca3a..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#if !defined(Q_MOC_RUN) -#include -#include -#include - -AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT -#include -#include -AZ_POP_DISABLE_WARNING -#endif - -namespace Ui -{ - class MaterialPreviewerClass; -} - -namespace AzToolsFramework -{ - namespace AssetBrowser - { - class ProductAssetBrowserEntry; - class SourceAssetBrowserEntry; - class AssetBrowserEntry; - } -} - -class QResizeEvent; - -namespace AZ -{ - namespace LyIntegration - { - class MaterialPreviewer final - : public AzToolsFramework::AssetBrowser::Previewer - { - Q_OBJECT - public: - AZ_CLASS_ALLOCATOR(MaterialPreviewer, AZ::SystemAllocator, 0); - - explicit MaterialPreviewer(QWidget* parent = nullptr); - ~MaterialPreviewer(); - - // AzToolsFramework::AssetBrowser::Previewer overrides... - void Clear() const override {} - void Display(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) override; - const QString& GetName() const override; - - protected: - void resizeEvent(QResizeEvent* event) override; - - private: - void DisplayInternal(const AzToolsFramework::AssetBrowser::ProductAssetBrowserEntry* product); - void UpdateFileInfo() const; - - // QLabel word wrap does not break long words such as filenames, so manual word wrap needed - static QString WordWrap(const QString& string, int maxLength); - - QScopedPointer m_ui; - Data::AssetId m_assetId; - QString m_fileInfo; - QString m_name = "MaterialPreviewer"; - }; - } // namespace LyIntegration -} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.ui b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.ui deleted file mode 100644 index e8a7ada8c5..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewer.ui +++ /dev/null @@ -1,128 +0,0 @@ - - - MaterialPreviewerClass - - - - 0 - 0 - 266 - 399 - - - - - 0 - 0 - - - - - 100 - 100 - - - - Preview - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - 0 - 0 - - - - false - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - File Info - - - Qt::AutoText - - - false - - - Qt::AlignHCenter|Qt::AlignTop - - - true - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 0 - - - - - - - - - AzToolsFramework::Thumbnailer::ThumbnailWidget - QWidget -
AzToolsFramework/Thumbnails/ThumbnailWidget.h
- 1 -
-
- - -
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewerFactory.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewerFactory.cpp deleted file mode 100644 index b7def35dc0..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewerFactory.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include - -#include -#include - -#include -#include - -namespace AZ -{ - namespace LyIntegration - { - AzToolsFramework::AssetBrowser::Previewer* MaterialPreviewerFactory::CreatePreviewer(QWidget* parent) const - { - return new MaterialPreviewer(parent); - } - - bool MaterialPreviewerFactory::IsEntrySupported(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const - { - using namespace AzToolsFramework::AssetBrowser; - - switch (entry->GetEntryType()) - { - case AssetBrowserEntry::AssetEntryType::Source: - { - const auto source = azrtti_cast(entry); - return source->GetPrimaryAssetType() == RPI::MaterialAsset::RTTI_Type(); - } - case AssetBrowserEntry::AssetEntryType::Product: - const auto product = azrtti_cast(entry); - return product->GetAssetType() == RPI::MaterialAsset::RTTI_Type(); - } - return false; - } - - const QString& MaterialPreviewerFactory::GetName() const - { - return m_name; - } - } // namespace LyIntegration -} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewerFactory.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewerFactory.h deleted file mode 100644 index 867aff043b..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Preview/MaterialPreviewerFactory.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include - -AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT -#include -AZ_POP_DISABLE_WARNING - -namespace AZ -{ - namespace LyIntegration - { - class MaterialPreviewerFactory final - : public AzToolsFramework::AssetBrowser::PreviewerFactory - { - public: - AZ_CLASS_ALLOCATOR(MaterialPreviewerFactory, AZ::SystemAllocator, 0); - - MaterialPreviewerFactory() = default; - ~MaterialPreviewerFactory() = default; - - // AzToolsFramework::AssetBrowser::PreviewerFactory overrides... - AzToolsFramework::AssetBrowser::Previewer* CreatePreviewer(QWidget* parent = nullptr) const override; - bool IsEntrySupported(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const override; - const QString& GetName() const override; - - private: - QString m_name = "MaterialPreviewer"; - }; - } // namespace LyIntegration -} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnail.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnail.cpp deleted file mode 100644 index 5c861a062d..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnail.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include - -#include -#include - -#include - -#include - - -namespace AZ -{ - namespace LyIntegration - { - using namespace AzToolsFramework::Thumbnailer; - using namespace AzToolsFramework::AssetBrowser; - - const int MaterialThumbnailSize = 200; - - ////////////////////////////////////////////////////////////////////////// - // MaterialThumbnail - ////////////////////////////////////////////////////////////////////////// - MaterialThumbnail::MaterialThumbnail(SharedThumbnailKey key, int thumbnailSize) - : Thumbnail(key, thumbnailSize) - { - const SourceThumbnailKey* sourceThumbnailKey = azrtti_cast(m_key.data()); - if (!sourceThumbnailKey) - { - AZ_Error("MaterialThumbnail", sourceThumbnailKey, "Incorrect key type, excpected SourceThumbnailKey"); - m_state = State::Failed; - return; - } - - Data::AssetInfo assetInfo; - AZStd::string watchFolder; - bool hasResult = false; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(hasResult, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, - sourceThumbnailKey->GetFileName().c_str(), assetInfo, watchFolder); - - if (!hasResult) - { - AZ_Error("MaterialThumbnail", hasResult, "AssetInfo for %s could not be found", sourceThumbnailKey->GetFileName().c_str()); - m_state = State::Failed; - return; - } - - m_assetType = AZ::AzTypeInfo::Uuid(); - m_assetId = assetInfo.m_assetId; - - ThumbnailerRendererNotificationBus::Handler::BusConnect(m_assetId); - AzFramework::AssetCatalogEventBus::Handler::BusConnect(); - } - - void MaterialThumbnail::LoadThread() - { - ThumbnailerRendererRequestBus::QueueEvent(m_assetType, &ThumbnailerRendererRequests::RenderThumbnail, m_assetId, m_thumbnailSize); - // wait for response from thumbnail renderer - m_renderWait.acquire(); - } - - MaterialThumbnail::~MaterialThumbnail() - { - ThumbnailerRendererNotificationBus::Handler::BusDisconnect(m_assetId); - AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); - } - - void MaterialThumbnail::ThumbnailRendered(QPixmap& thumbnailImage) - { - m_pixmap = thumbnailImage; - m_renderWait.release(); - } - - void MaterialThumbnail::ThumbnailFailedToRender() - { - m_state = State::Failed; - m_renderWait.release(); - } - - void MaterialThumbnail::OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) - { - if (m_assetId == assetId && - m_state == State::Ready) - { - m_state = State::Unloaded; - Load(); - } - } - - ////////////////////////////////////////////////////////////////////////// - // MaterialThumbnailCache - ////////////////////////////////////////////////////////////////////////// - MaterialThumbnailCache::MaterialThumbnailCache() - : ThumbnailCache() - , m_renderer(AZStd::make_unique()) - { - } - - MaterialThumbnailCache::~MaterialThumbnailCache() = default; - - int MaterialThumbnailCache::GetPriority() const - { - // Material thumbnails override default source thumbnails, so carry higher priority - return 1; - } - - const char* MaterialThumbnailCache::GetProviderName() const - { - return ProviderName; - } - - bool MaterialThumbnailCache::IsSupportedThumbnail(SharedThumbnailKey key) const - { - auto sourceKey = azrtti_cast(key.data()); - return sourceKey && sourceKey->GetExtension() == ".material"; - } - } // namespace LyIntegration -} // namespace AZ - -#include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnail.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnail.h deleted file mode 100644 index 4ef1af59f0..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnail.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#if !defined(Q_MOC_RUN) -#include -#include - -#include -#include -#include - -#include -#endif - -namespace AZ -{ - namespace LyIntegration - { - /** - * Custom material thumbnail that detects when a material asset changes and updates the thumbnail - */ - class MaterialThumbnail - : public AzToolsFramework::Thumbnailer::Thumbnail - , public AzToolsFramework::ThumbnailerRendererNotificationBus::Handler - , private AzFramework::AssetCatalogEventBus::Handler - { - Q_OBJECT - public: - MaterialThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize); - ~MaterialThumbnail() override; - - //! AzToolsFramework::ThumbnailerRendererNotificationBus::Handler overrides... - void ThumbnailRendered(QPixmap& thumbnailImage) override; - void ThumbnailFailedToRender() override; - - protected: - void LoadThread() override; - - private: - // AzFramework::AssetCatalogEventBus::Handler interface overrides... - void OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) override; - - Data::AssetId m_assetId; - Data::AssetType m_assetType; - AZStd::binary_semaphore m_renderWait; - }; - - - /** - * Cache configuration for large material thumbnails - */ - class MaterialThumbnailCache - : public AzToolsFramework::Thumbnailer::ThumbnailCache - { - public: - MaterialThumbnailCache(); - ~MaterialThumbnailCache() override; - - int GetPriority() const override; - const char* GetProviderName() const override; - - static constexpr const char* ProviderName = "Material Thumbnails"; - - protected: - bool IsSupportedThumbnail(AzToolsFramework::SharedThumbnailKey key) const override; - - private: - AZStd::unique_ptr m_renderer; - }; - } // namespace LyIntegration -} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnailRenderer.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnailRenderer.cpp deleted file mode 100644 index c2ac376656..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnailRenderer.cpp +++ /dev/null @@ -1,359 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "Atom/Feature/Utils/FrameCaptureBus.h" -#include "Atom/Feature/SkyBox/SkyBoxFeatureProcessorInterface.h" - -namespace AZ -{ - namespace LyIntegration - { - using namespace AzToolsFramework::Thumbnailer; - - static constexpr const char* ModelPath = "materialeditor/viewportmodels/quadsphere.azmodel"; - static constexpr const char* LightingPresetPath = "lightingpresets/default.lightingpreset.azasset"; - static constexpr float AspectRatio = 1.0f; - static constexpr float NearDist = 0.1f; - static constexpr float FarDist = 100.0f; - - MaterialThumbnailRenderer::MaterialThumbnailRenderer() - { - m_entityContext = AZStd::make_unique(); - m_entityContext->InitContext(); - - Data::AssetType materialAssetType = AzTypeInfo::Uuid(); - ThumbnailerRendererRequestBus::Handler::BusConnect(materialAssetType); - SystemTickBus::Handler::BusConnect(); - - m_shouldPullNextAsset = true; - } - - MaterialThumbnailRenderer::~MaterialThumbnailRenderer() - { - ThumbnailerRendererRequestBus::Handler::BusDisconnect(); - SystemTickBus::Handler::BusDisconnect(); - AZ::Data::AssetBus::Handler::BusDisconnect(); - Render::MaterialComponentNotificationBus::Handler::BusDisconnect(); - m_materialAssetToRender.Release(); - - if (m_initialized) - { - Render::FrameCaptureNotificationBus::Handler::BusDisconnect(); - TickBus::Handler::BusDisconnect(); - - if (m_modelEntity) - { - AzFramework::EntityContextRequestBus::Event(m_entityContext->GetContextId(), - &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_modelEntity); - m_modelEntity = nullptr; - } - - m_frameworkScene->UnsetSubsystem(); - - m_scene->Deactivate(); - m_scene->RemoveRenderPipeline(m_renderPipeline->GetId()); - RPI::RPISystemInterface::Get()->UnregisterScene(m_scene); - bool sceneRemovedSuccessfully = false; - AzFramework::SceneSystemRequestBus::BroadcastResult(sceneRemovedSuccessfully, &AzFramework::SceneSystemRequests::RemoveScene, m_sceneName); - m_scene = nullptr; - m_renderPipeline = nullptr; - } - } - - bool MaterialThumbnailRenderer::Installed() const - { - return true; - } - - void MaterialThumbnailRenderer::OnSystemTick() - { - ThumbnailerRendererRequestBus::ExecuteQueuedEvents(); - } - - void MaterialThumbnailRenderer::OnTick(float deltaTime, AZ::ScriptTimePoint time) - { - m_deltaTime = deltaTime; - m_simulateTime = time.GetSeconds(); - - if (m_shouldPullNextAsset && !m_assetIdQueue.empty()) - { - m_shouldPullNextAsset = false; - - const auto assetId = m_assetIdQueue.front(); - m_assetIdQueue.pop(); - - m_materialAssetToRender.Release(); - AZ::Data::AssetBus::Handler::BusDisconnect(); - - if (assetId.IsValid()) - { - m_materialAssetToRender.Create(assetId); - m_materialAssetToRender.QueueLoad(); - AZ::Data::AssetBus::Handler::BusConnect(assetId); - } - } - else if (m_readyToCapture) - { - m_renderPipeline->AddToRenderTickOnce(); - - RPI::AttachmentReadback::CallbackFunction readbackCallback = [&](const RPI::AttachmentReadback::ReadbackResult& result) - { - uchar* data = result.m_dataBuffer.get()->data(); - QImage image(data, result.m_imageDescriptor.m_size.m_width, result.m_imageDescriptor.m_size.m_height, QImage::Format_RGBA8888); - QPixmap pixmap; - pixmap.convertFromImage(image); - ThumbnailerRendererNotificationBus::Event(m_materialAssetToRender.GetId(), - &ThumbnailerRendererNotifications::ThumbnailRendered, pixmap); - }; - - Render::FrameCaptureNotificationBus::Handler::BusConnect(); - bool startedCapture = false; - Render::FrameCaptureRequestBus::BroadcastResult( - startedCapture, - &Render::FrameCaptureRequestBus::Events::CapturePassAttachmentWithCallback, - m_passHierarchy, AZStd::string("Output"), readbackCallback); - // Reset the capture flag the capture requst was successful. Otherwise try capture it again next tick. - if (startedCapture) - { - m_readyToCapture = false; - } - } - } - - void MaterialThumbnailRenderer::OnAssetReady(AZ::Data::Asset asset) - { - m_materialAssetToRender = asset; - AZ::Data::AssetBus::Handler::BusDisconnect(); - - Render::MaterialComponentRequestBus::Event(m_modelEntity->GetId(), - &Render::MaterialComponentRequestBus::Events::SetDefaultMaterialOverride, - m_materialAssetToRender.GetId()); - - // listen to material override finished notification. - Render::MaterialComponentNotificationBus::Handler::BusConnect(m_modelEntity->GetId()); - } - - void MaterialThumbnailRenderer::OnAssetError(AZ::Data::Asset asset) - { - OnAssetCanceled(asset.GetId()); - } - - void MaterialThumbnailRenderer::OnAssetCanceled([[maybe_unused]] AZ::Data::AssetId assetId) - { - m_readyToCapture = false; - m_shouldPullNextAsset = true; - m_materialAssetToRender.Release(); - AZ::Data::AssetBus::Handler::BusDisconnect(); - } - - void MaterialThumbnailRenderer::OnCaptureFinished([[maybe_unused]] Render::FrameCaptureResult result, [[maybe_unused]] const AZStd::string& info) - { - m_shouldPullNextAsset = true; - m_renderPipeline->RemoveFromRenderTick(); - Render::FrameCaptureNotificationBus::Handler::BusDisconnect(); - if (m_assetIdQueue.empty()) - { - TickBus::Handler::BusDisconnect(); - } - } - - void MaterialThumbnailRenderer::Init() - { - using namespace Data; - - // Create and register a scene with minimum required feature processors - RPI::SceneDescriptor sceneDesc; - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::TransformServiceFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::MeshFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::PointLightFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::SpotLightFeatureProcessor"); - // There is currently a bug where having multiple DirectionalLightFeatureProcessors active can result in shadow flickering [ATOM-13568] - // as well as continually rebuilding MeshDrawPackets [ATOM-13633]. Lets just disable the directional light FP for now. - // Possibly re-enable with [GFX TODO][ATOM-13639] - // sceneDesc.m_featureProcessorNames.push_back("AZ::Render::DirectionalLightFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::DiskLightFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::CapsuleLightFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::QuadLightFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::DecalTextureArrayFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::ImageBasedLightFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::PostProcessFeatureProcessor"); - sceneDesc.m_featureProcessorNames.push_back("AZ::Render::SkyBoxFeatureProcessor"); - m_scene = RPI::Scene::CreateScene(sceneDesc); - - // Setup scene srg modification callback (to push per-frame values to the shaders) - RPI::ShaderResourceGroupCallback callback = [this](RPI::ShaderResourceGroup* srg) - { - if (srg == nullptr) - { - return; - } - bool needCompile = false; - RHI::ShaderInputConstantIndex timeIndex = srg->FindShaderInputConstantIndex(Name{ "m_time" }); - if (timeIndex.IsValid()) - { - srg->SetConstant(timeIndex, (float)m_simulateTime); - needCompile = true; - } - RHI::ShaderInputConstantIndex deltaTimeIndex = srg->FindShaderInputConstantIndex(Name{ "m_deltaTime" }); - if (deltaTimeIndex.IsValid()) - { - srg->SetConstant(deltaTimeIndex, m_deltaTime); - needCompile = true; - } - - if (needCompile) - { - srg->Compile(); - } - }; - m_scene->SetShaderResourceGroupCallback(callback); - - // Bind m_defaultScene to the GameEntityContext's AzFramework::Scene - Outcome createSceneOutcome; - AzFramework::SceneSystemRequestBus::BroadcastResult(createSceneOutcome, &AzFramework::SceneSystemRequests::CreateScene, - m_sceneName); - AZ_Assert(createSceneOutcome, createSceneOutcome.GetError().c_str()); // This should never happen unless scene creation has changed. - createSceneOutcome.GetValue()->SetSubsystem(m_scene.get()); - m_frameworkScene = createSceneOutcome.GetValue(); - m_frameworkScene->SetSubsystem(m_scene.get()); - - m_entityContext->InitContext(); - - bool success = false; - AzFramework::SceneSystemRequestBus::BroadcastResult(success, &AzFramework::SceneSystemRequests::SetSceneForEntityContextId, - m_entityContext->GetContextId(), m_frameworkScene); - AZ_Assert(success, "Unable to set entity context on AzFramework::Scene: %s", m_sceneName.c_str()); - - // Create a render pipeline from the specified asset for the window context and add the pipeline to the scene - RPI::RenderPipelineDescriptor pipelineDesc; - pipelineDesc.m_mainViewTagName = "MainCamera"; - pipelineDesc.m_name = m_pipelineName; - pipelineDesc.m_rootPassTemplate = "MainPipelineRenderToTexture"; - // We have to set the samples to 4 to match the pipeline passes' setting, otherwise it may lead to device lost issue - // [GFX TODO] [ATOM-13551] Default value sand validation required to prevent pipeline crash and device lost - pipelineDesc.m_renderSettings.m_multisampleState.m_samples = 4; - m_renderPipeline = RPI::RenderPipeline::CreateRenderPipeline(pipelineDesc); - m_scene->AddRenderPipeline(m_renderPipeline); - m_scene->Activate(); - RPI::RPISystemInterface::Get()->RegisterScene(m_scene); - m_passHierarchy.push_back(m_pipelineName); - m_passHierarchy.push_back("CopyToSwapChain"); - - // Connect camera to pipeline's default view after camera entity activated - Name viewName = Name("MainCamera"); - m_view = RPI::View::CreateView(viewName, RPI::View::UsageCamera); - m_transform = Transform::CreateFromQuaternionAndTranslation(Quaternion::CreateIdentity(), Vector3::CreateZero()); - m_view->SetCameraTransform(Matrix3x4::CreateFromTransform(m_transform)); - - Matrix4x4 viewToClipMatrix; - MakePerspectiveFovMatrixRH(viewToClipMatrix, - Constants::HalfPi, - AspectRatio, - NearDist, - FarDist, true); - m_view->SetViewToClipMatrix(viewToClipMatrix); - - m_renderPipeline->SetDefaultView(m_view); - - // Create lighting preset - m_lightingPresetAsset = AZ::RPI::AssetUtils::LoadAssetByProductPath(LightingPresetPath); - if (m_lightingPresetAsset.IsReady()) - { - auto preset = m_lightingPresetAsset->GetDataAs(); - if (preset) - { - auto iblFeatureProcessor = m_scene->GetFeatureProcessor(); - auto postProcessFeatureProcessor = m_scene->GetFeatureProcessor(); - auto exposureControlSettingInterface = postProcessFeatureProcessor->GetOrCreateSettingsInterface(AZ::EntityId())->GetOrCreateExposureControlSettingsInterface(); - auto directionalLightFeatureProcessor = m_scene->GetFeatureProcessor(); - auto skyboxFeatureProcessor = m_scene->GetFeatureProcessor(); - skyboxFeatureProcessor->Enable(true); - skyboxFeatureProcessor->SetSkyboxMode(AZ::Render::SkyBoxMode::Cubemap); - - Camera::Configuration cameraConfig; - cameraConfig.m_fovRadians = Constants::HalfPi; - cameraConfig.m_nearClipDistance = NearDist; - cameraConfig.m_farClipDistance = FarDist; - cameraConfig.m_frustumWidth = 100.0f; - cameraConfig.m_frustumHeight = 100.0f; - - AZStd::vector lightHandles; - - preset->ApplyLightingPreset( - iblFeatureProcessor, - skyboxFeatureProcessor, - exposureControlSettingInterface, - directionalLightFeatureProcessor, - cameraConfig, - lightHandles); - } - } - - // Create preview model - AzFramework::EntityContextRequestBus::EventResult(m_modelEntity, m_entityContext->GetContextId(), - &AzFramework::EntityContextRequestBus::Events::CreateEntity, "PreviewModel"); - m_modelEntity->CreateComponent(Render::MeshComponentTypeId); - m_modelEntity->CreateComponent(Render::MaterialComponentTypeId); - m_modelEntity->CreateComponent(azrtti_typeid()); - m_modelEntity->Init(); - m_modelEntity->Activate(); - TransformBus::Event(m_modelEntity->GetId(), &TransformBus::Events::SetLocalTM, - Transform::CreateTranslation(Vector3(0, 0.8f, -0.5f))); - - Render::MeshComponentRequestBus::Event(m_modelEntity->GetId(), &Render::MeshComponentRequestBus::Events::SetModelAssetPath, ModelPath); - } - - void MaterialThumbnailRenderer::RenderThumbnail(Data::AssetId assetId, [[maybe_unused]] int thumbnailSize) - { - if (!m_initialized) - { - Init(); - m_initialized = true; - } - - if (m_assetIdQueue.empty()) - { - m_shouldPullNextAsset = true; - TickBus::Handler::BusConnect(); - } - - m_assetIdQueue.emplace(assetId); - } - - void MaterialThumbnailRenderer::OnMaterialsUpdated([[maybe_unused]] const Render::MaterialAssignmentMap& materials) - { - m_readyToCapture = true; - Render::MaterialComponentNotificationBus::Handler::BusDisconnect(); - } - - } // namespace LyIntegration -} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnailRenderer.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnailRenderer.h deleted file mode 100644 index 9f77282f7b..0000000000 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/Thumbnails/MaterialThumbnailRenderer.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include - -#include -#include - -#include -#include -#include - -#include - -#include -#include -#include - -// Disables warning messages triggered by the Qt library -// 4251: class needs to have dll-interface to be used by clients of class -// 4800: forcing value to bool 'true' or 'false' (performance warning) -AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") -#include -AZ_POP_DISABLE_WARNING - -namespace AZ -{ - namespace LyIntegration - { - //! Provides custom rendering of material thumbnails - class MaterialThumbnailRenderer - : public AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler - , public SystemTickBus::Handler - , public TickBus::Handler - , public AZ::Data::AssetBus::Handler - , public Render::FrameCaptureNotificationBus::Handler - , public Render::MaterialComponentNotificationBus::Handler - { - public: - AZ_CLASS_ALLOCATOR(MaterialThumbnailRenderer, AZ::SystemAllocator, 0) - - MaterialThumbnailRenderer(); - ~MaterialThumbnailRenderer(); - - bool Installed() const override; - - //! ThumbnailerRendererRequestsBus::Handler interface overrides... - void RenderThumbnail(AZ::Data::AssetId assetId, int thumbnailSize) override; - - //! SystemTickBus::Handler interface overrides... - void OnSystemTick() override; - - //! AZ::TickBus::Handler interface overrides... - void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; - - // AZ::Data::AssetBus::Handler - void OnAssetReady(AZ::Data::Asset asset) override; - void OnAssetError(AZ::Data::Asset asset) override; - void OnAssetCanceled(AZ::Data::AssetId assetId) override; - - //! Render::FrameCaptureNotificationBus::Handler overrides... - void OnCaptureFinished(Render::FrameCaptureResult result, const AZStd::string& info) override; - - private: - // MaterialComponentNotificationBus::Handler overrides... - void OnMaterialsUpdated(const Render::MaterialAssignmentMap& materials) override; - - void Init(); - - RPI::ScenePtr m_scene; - AZStd::string m_sceneName = "Material Thumbnail Scene"; - AZStd::string m_pipelineName = "Material Thumbnail Pipeline"; - AzFramework::Scene* m_frameworkScene = nullptr; - RPI::RenderPipelinePtr m_renderPipeline; - AZStd::unique_ptr m_entityContext; - AZStd::vector m_passHierarchy; - - AZ::Data::Asset m_lightingPresetAsset; - - RPI::ViewPtr m_view = nullptr; - Entity* m_modelEntity = nullptr; - Transform m_transform; - - //! Ready to process next request, this value is accessed from different threads. - AZStd::atomic m_shouldPullNextAsset; - //! Is renderer initialized. Initialization is only performed once the first thumbnail request is submitted. - bool m_initialized = false; - //! It takes an extra frame to load a mesh and apply material, this variable is set to true once we are ready to render pipeline to texture. - bool m_readyToCapture = false; - - //! Incoming thumbnail requests are appended to this queue and processed one at a time in OnTick function. - AZStd::queue m_assetIdQueue; - //! Current material asset being rendered. - Data::Asset m_materialAssetToRender; - - double m_simulateTime = 0.0f; - float m_deltaTime = 0.0f; - }; - } // namespace LyIntegration -} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp index a3557ff72e..0afe96588f 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp @@ -198,5 +198,14 @@ namespace AZ AzToolsFramework::Refresh_EntireTree); } + AZ::u32 EditorMeshComponent::OnConfigurationChanged() + { + // temp variable is needed to hold reference to m_modelAsset while it's being loaded. + // Otherwise it gets released in Deactivate function, and instantly re-activating the component + // places it in a bad state, which happens in OnConfigurationChanged base function. + // This is a bug with AssetManager [LYN-2249] + auto temp = m_controller.m_configuration.m_modelAsset; + return BaseClass::OnConfigurationChanged(); + } } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.h index 78461ca2d3..1acaa6fdf8 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.h @@ -64,6 +64,8 @@ namespace AZ // MeshComponentNotificationBus overrides ... void OnModelReady(const Data::Asset& modelAsset, const Data::Instance& model) override; + AZ::u32 OnConfigurationChanged() override; + AZ::Crc32 AddEditorMaterialComponent(); bool HasEditorMaterialComponent() const; AZ::u32 GetEditorMaterialComponentVisibility() const; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshSystemComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshSystemComponent.cpp new file mode 100644 index 0000000000..de4e7a3bc4 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshSystemComponent.cpp @@ -0,0 +1,101 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace Render + { + //! Main system component for the Atom Common Feature Gem's editor/tools module. + void EditorMeshSystemComponent::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serialize = azrtti_cast(context)) + { + serialize->Class() + ->Version(0); + + if (AZ::EditContext* ec = serialize->GetEditContext()) + { + ec->Class("EditorMeshSystemComponent", "System component that sets up necessary logic related to EditorMeshComponent..") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System")) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ; + } + } + } + + void EditorMeshSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC_CE("EditorMeshSystem")); + } + + void EditorMeshSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) + { + incompatible.push_back(AZ_CRC_CE("EditorMeshSystem")); + } + + void EditorMeshSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(AZ_CRC_CE("ThumbnailerService")); + } + + void EditorMeshSystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + AZ_UNUSED(dependent); + } + + void EditorMeshSystemComponent::Activate() + { + AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect(); + SetupThumbnails(); + } + + void EditorMeshSystemComponent::Deactivate() + { + TeardownThumbnails(); + AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect(); + } + + void EditorMeshSystemComponent::OnApplicationAboutToStop() + { + TeardownThumbnails(); + } + + void EditorMeshSystemComponent::SetupThumbnails() + { + using namespace AzToolsFramework::Thumbnailer; + using namespace LyIntegration; + + ThumbnailerRequestsBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, + MAKE_TCACHE(Thumbnails::MeshThumbnailCache), + ThumbnailContext::DefaultContext); + } + + void EditorMeshSystemComponent::TeardownThumbnails() + { + using namespace AzToolsFramework::Thumbnailer; + using namespace LyIntegration; + + ThumbnailerRequestsBus::Broadcast(&ThumbnailerRequests::UnregisterThumbnailProvider, + Thumbnails::MeshThumbnailCache::ProviderName, + ThumbnailContext::DefaultContext); + } + } // namespace Render +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshSystemComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshSystemComponent.h new file mode 100644 index 0000000000..429afddbdc --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshSystemComponent.h @@ -0,0 +1,49 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#include +#include + +namespace AZ +{ + namespace Render + { + //! System component that sets up necessary logic related to EditorMeshComponent. + class EditorMeshSystemComponent + : public AZ::Component + , private AzFramework::ApplicationLifecycleEvents::Bus::Handler + { + public: + AZ_COMPONENT(EditorMeshSystemComponent, "{4D332E3D-C4FC-410B-A915-8E234CBDD4EC}"); + + static void Reflect(AZ::ReflectContext* context); + + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); + + protected: + // AZ::Component interface overrides... + void Activate() override; + void Deactivate() override; + + private: + // AzFramework::ApplicationLifecycleEvents overrides... + void OnApplicationAboutToStop() override; + + void SetupThumbnails(); + void TeardownThumbnails(); + }; + } // namespace Render +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp index 2d54d17612..db64d26a54 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp @@ -124,7 +124,6 @@ namespace AZ void MeshComponentController::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) { - dependent.push_back(AZ_CRC("MaterialProviderService", 0x64849a6b)); dependent.push_back(AZ_CRC("TransformService", 0x8ee22c50)); } @@ -181,12 +180,14 @@ namespace AZ m_meshFeatureProcessor = RPI::Scene::GetFeatureProcessorForEntity(m_entityId); AZ_Error("MeshComponentController", m_meshFeatureProcessor, "Unable to find a MeshFeatureProcessorInterface on the entityId."); - RegisterModel(); MeshComponentRequestBus::Handler::BusConnect(m_entityId); TransformNotificationBus::Handler::BusConnect(m_entityId); MaterialReceiverRequestBus::Handler::BusConnect(m_entityId); MaterialComponentNotificationBus::Handler::BusConnect(m_entityId); AzFramework::BoundsRequestBus::Handler::BusConnect(m_entityId); + + //Buses must be connected before RegisterModel in case requests are made as a result of HandleModelChange + RegisterModel(); } void MeshComponentController::Deactivate() @@ -196,6 +197,7 @@ namespace AZ TransformNotificationBus::Handler::BusDisconnect(); MaterialReceiverRequestBus::Handler::BusDisconnect(); MaterialComponentNotificationBus::Handler::BusDisconnect(); + UnregisterModel(); m_meshFeatureProcessor = nullptr; @@ -229,7 +231,8 @@ namespace AZ AZStd::unordered_set MeshComponentController::GetModelUvNames() const { - return GetModel()->GetUvNames(); + const Data::Instance model = GetModel(); + return model ? model->GetUvNames() : AZStd::unordered_set(); } void MeshComponentController::OnMaterialsUpdated([[maybe_unused]] const MaterialAssignmentMap& materials) @@ -263,16 +266,16 @@ namespace AZ m_meshHandle = m_meshFeatureProcessor->AcquireMesh(m_configuration.m_modelAsset, materials); m_meshFeatureProcessor->ConnectModelChangeEventHandler(m_meshHandle, m_changeEventHandler); - // [GFX TODO] This should happen automatically. m_changeEventHandler should be passed to AcquireMesh - // If the model instance or asset already exists, announce a model change to let others know it's loaded. - HandleModelChange(m_meshFeatureProcessor->GetModel(m_meshHandle)); - const AZ::Transform& transform = m_transformInterface ? m_transformInterface->GetWorldTM() : Transform::Identity(); m_meshFeatureProcessor->SetTransform(m_meshHandle, transform); m_meshFeatureProcessor->SetSortKey(m_meshHandle, m_configuration.m_sortKey); m_meshFeatureProcessor->SetLodOverride(m_meshHandle, m_configuration.m_lodOverride); m_meshFeatureProcessor->SetExcludeFromReflectionCubeMaps(m_meshHandle, m_configuration.m_excludeFromReflectionCubeMaps); m_meshFeatureProcessor->SetUseForwardPassIblSpecular(m_meshHandle, m_configuration.m_useForwardPassIblSpecular); + + // [GFX TODO] This should happen automatically. m_changeEventHandler should be passed to AcquireMesh + // If the model instance or asset already exists, announce a model change to let others know it's loaded. + HandleModelChange(m_meshFeatureProcessor->GetModel(m_meshHandle)); } } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshThumbnail.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshThumbnail.cpp new file mode 100644 index 0000000000..315eb2a892 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshThumbnail.cpp @@ -0,0 +1,113 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + const int MeshThumbnailSize = 200; + + ////////////////////////////////////////////////////////////////////////// + // MeshThumbnail + ////////////////////////////////////////////////////////////////////////// + MeshThumbnail::MeshThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize) + : Thumbnail(key, thumbnailSize) + { + m_assetId = GetAssetId(key, RPI::ModelAsset::RTTI_Type()); + if (!m_assetId.IsValid()) + { + AZ_Error("MeshThumbnail", false, "Failed to find matching assetId for the thumbnailKey."); + m_state = State::Failed; + return; + } + + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusConnect(key); + AzFramework::AssetCatalogEventBus::Handler::BusConnect(); + } + + void MeshThumbnail::LoadThread() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::QueueEvent( + RPI::ModelAsset::RTTI_Type(), + &AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail, + m_key, + m_thumbnailSize); + // wait for response from thumbnail renderer + m_renderWait.acquire(); + } + + MeshThumbnail::~MeshThumbnail() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusDisconnect(); + AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); + } + + void MeshThumbnail::ThumbnailRendered(QPixmap& thumbnailImage) + { + m_pixmap = thumbnailImage; + m_renderWait.release(); + } + + void MeshThumbnail::ThumbnailFailedToRender() + { + m_state = State::Failed; + m_renderWait.release(); + } + + void MeshThumbnail::OnCatalogAssetChanged([[maybe_unused]] const AZ::Data::AssetId& assetId) + { + if (m_assetId == assetId && + m_state == State::Ready) + { + m_state = State::Unloaded; + Load(); + } + } + + ////////////////////////////////////////////////////////////////////////// + // MeshThumbnailCache + ////////////////////////////////////////////////////////////////////////// + MeshThumbnailCache::MeshThumbnailCache() + : ThumbnailCache() + { + } + + MeshThumbnailCache::~MeshThumbnailCache() = default; + + int MeshThumbnailCache::GetPriority() const + { + // Material thumbnails override default source thumbnails, so carry higher priority + return 1; + } + + const char* MeshThumbnailCache::GetProviderName() const + { + return ProviderName; + } + + bool MeshThumbnailCache::IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const + { + return GetAssetId(key, RPI::ModelAsset::RTTI_Type()).IsValid(); + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + +#include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshThumbnail.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshThumbnail.h new file mode 100644 index 0000000000..68c7825aaa --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshThumbnail.h @@ -0,0 +1,76 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#if !defined(Q_MOC_RUN) +#include +#include +#include +#include +#endif + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + /** + * Custom material or model thumbnail that detects when an asset changes and updates the thumbnail + */ + class MeshThumbnail + : public AzToolsFramework::Thumbnailer::Thumbnail + , public AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler + , private AzFramework::AssetCatalogEventBus::Handler + { + Q_OBJECT + public: + MeshThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize); + ~MeshThumbnail() override; + + //! AzToolsFramework::ThumbnailerRendererNotificationBus::Handler overrides... + void ThumbnailRendered(QPixmap& thumbnailImage) override; + void ThumbnailFailedToRender() override; + + protected: + void LoadThread() override; + + private: + // AzFramework::AssetCatalogEventBus::Handler interface overrides... + void OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) override; + + AZStd::binary_semaphore m_renderWait; + Data::AssetId m_assetId; + }; + + /** + * Cache configuration for large material thumbnails + */ + class MeshThumbnailCache + : public AzToolsFramework::Thumbnailer::ThumbnailCache + { + public: + MeshThumbnailCache(); + ~MeshThumbnailCache() override; + + int GetPriority() const override; + const char* GetProviderName() const override; + + static constexpr const char* ProviderName = "Mesh Thumbnails"; + + protected: + bool IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const override; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Module.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Module.cpp index 60747f9454..a2cc8ad89c 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Module.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Module.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -131,6 +132,7 @@ namespace AZ EditorImageBasedLightComponent::CreateDescriptor(), EditorMaterialComponent::CreateDescriptor(), EditorMaterialSystemComponent::CreateDescriptor(), + EditorMeshSystemComponent::CreateDescriptor(), EditorMeshComponent::CreateDescriptor(), EditorPhysicalSkyComponent::CreateDescriptor(), EditorPointLightComponent::CreateDescriptor(), @@ -153,6 +155,7 @@ namespace AZ azrtti_typeid(), #ifdef ATOMLYINTEGRATION_FEATURE_COMMON_EDITOR azrtti_typeid(), + azrtti_typeid(), azrtti_typeid(), azrtti_typeid(), #endif diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentConfig.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentConfig.cpp index cd17e510e0..93ed346535 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentConfig.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentConfig.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include namespace AZ { diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.cpp index 9756f7a72e..fd9efeed56 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.cpp @@ -14,7 +14,7 @@ #include -#include +#include #include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.h index e42223ae40..e5620c66f2 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/LookModification/LookModificationComponentController.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.cpp new file mode 100644 index 0000000000..20588bfea6 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.cpp @@ -0,0 +1,80 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include +#include + +#include +#include + +// Disables warning messages triggered by the Qt library +// 4251: class needs to have dll-interface to be used by clients of class +// 4800: forcing value to bool 'true' or 'false' (performance warning) +AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") +#include +#include +#include +AZ_POP_DISABLE_WARNING + +namespace AZ +{ + namespace LyIntegration + { + static constexpr int CharWidth = 6; + + CommonPreviewer::CommonPreviewer(QWidget* parent) + : Previewer(parent) + , m_ui(new Ui::CommonPreviewerClass()) + { + m_ui->setupUi(this); + } + + CommonPreviewer::~CommonPreviewer() + { + } + + void CommonPreviewer::Display(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) + { + using namespace AzToolsFramework::AssetBrowser; + using namespace AzToolsFramework::Thumbnailer; + + auto thumbnailKey = entry->GetThumbnailKey(); + m_ui->m_previewWidget->SetThumbnailKey(thumbnailKey, ThumbnailContext::DefaultContext); + m_fileInfo = QString::fromUtf8(entry->GetName().c_str()); + UpdateFileInfo(); + } + + const QString& CommonPreviewer::GetName() const + { + return m_name; + } + + void CommonPreviewer::resizeEvent([[maybe_unused]] QResizeEvent* event) + { + m_ui->m_previewWidget->setMaximumHeight(m_ui->m_previewWidget->width()); + + UpdateFileInfo(); + } + + void CommonPreviewer::UpdateFileInfo() const + { + m_ui->m_fileInfoLabel->setText(Thumbnails::WordWrap(m_fileInfo, m_ui->m_fileInfoLabel->width() / CharWidth)); + } + } // namespace LyIntegration +} // namespace AZ + +#include diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.h new file mode 100644 index 0000000000..e755433c96 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.h @@ -0,0 +1,72 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#if !defined(Q_MOC_RUN) +#include +#include +#include + +AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT +#include +#include +AZ_POP_DISABLE_WARNING +#endif + +namespace Ui +{ + class CommonPreviewerClass; +} + +namespace AzToolsFramework +{ + namespace AssetBrowser + { + class ProductAssetBrowserEntry; + class SourceAssetBrowserEntry; + class AssetBrowserEntry; + } +} + +class QResizeEvent; + +namespace AZ +{ + namespace LyIntegration + { + class CommonPreviewer final + : public AzToolsFramework::AssetBrowser::Previewer + { + Q_OBJECT + public: + AZ_CLASS_ALLOCATOR(CommonPreviewer, AZ::SystemAllocator, 0); + + explicit CommonPreviewer(QWidget* parent = nullptr); + ~CommonPreviewer(); + + // AzToolsFramework::AssetBrowser::Previewer overrides... + void Clear() const override {} + void Display(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) override; + const QString& GetName() const override; + + protected: + void resizeEvent(QResizeEvent* event) override; + + private: + void UpdateFileInfo() const; + + QScopedPointer m_ui; + QString m_fileInfo; + QString m_name = "CommonPreviewer"; + }; + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.ui b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.ui new file mode 100644 index 0000000000..f97dde0a1f --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewer.ui @@ -0,0 +1,128 @@ + + + CommonPreviewerClass + + + + 0 + 0 + 266 + 399 + + + + + 0 + 0 + + + + + 100 + 100 + + + + Preview + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + 0 + 0 + + + + false + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + File Info + + + Qt::AutoText + + + false + + + Qt::AlignHCenter|Qt::AlignTop + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 0 + + + + + + + + + AzToolsFramework::Thumbnailer::ThumbnailWidget + QWidget +
AzToolsFramework/Thumbnails/ThumbnailWidget.h
+ 1 +
+
+ + +
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewerFactory.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewerFactory.cpp new file mode 100644 index 0000000000..4038a648fa --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewerFactory.cpp @@ -0,0 +1,41 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + AzToolsFramework::AssetBrowser::Previewer* CommonPreviewerFactory::CreatePreviewer(QWidget* parent) const + { + return new CommonPreviewer(parent); + } + + bool CommonPreviewerFactory::IsEntrySupported(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const + { + return + Thumbnails::GetAssetId(entry->GetThumbnailKey(), RPI::MaterialAsset::RTTI_Type()).IsValid() || + Thumbnails::GetAssetId(entry->GetThumbnailKey(), RPI::ModelAsset::RTTI_Type()).IsValid(); + } + + const QString& CommonPreviewerFactory::GetName() const + { + return m_name; + } + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewerFactory.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewerFactory.h new file mode 100644 index 0000000000..dbbc74054b --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Preview/CommonPreviewerFactory.h @@ -0,0 +1,43 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include + +AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT +#include +AZ_POP_DISABLE_WARNING + +namespace AZ +{ + namespace LyIntegration + { + class CommonPreviewerFactory final + : public AzToolsFramework::AssetBrowser::PreviewerFactory + { + public: + AZ_CLASS_ALLOCATOR(CommonPreviewerFactory, AZ::SystemAllocator, 0); + + CommonPreviewerFactory() = default; + ~CommonPreviewerFactory() = default; + + // AzToolsFramework::AssetBrowser::PreviewerFactory overrides... + AzToolsFramework::AssetBrowser::Previewer* CreatePreviewer(QWidget* parent = nullptr) const override; + bool IsEntrySupported(const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const override; + const QString& GetName() const override; + + private: + QString m_name = "CommonPreviewer"; + }; + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/CommonThumbnailRenderer.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/CommonThumbnailRenderer.cpp new file mode 100644 index 0000000000..6dff92c170 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/CommonThumbnailRenderer.cpp @@ -0,0 +1,95 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + CommonThumbnailRenderer::CommonThumbnailRenderer() + : m_data(new ThumbnailRendererData) + { + // CommonThumbnailRenderer supports both models and materials, but we connect on materialAssetType + // since MaterialOrModelThumbnail dispatches event on materialAssetType address too + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::MultiHandler::BusConnect(RPI::MaterialAsset::RTTI_Type()); + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::MultiHandler::BusConnect(RPI::ModelAsset::RTTI_Type()); + SystemTickBus::Handler::BusConnect(); + + m_steps[Step::Initialize] = AZStd::make_shared(this); + m_steps[Step::FindThumbnailToRender] = AZStd::make_shared(this); + m_steps[Step::WaitForAssetsToLoad] = AZStd::make_shared(this); + m_steps[Step::Capture] = AZStd::make_shared(this); + m_steps[Step::ReleaseResources] = AZStd::make_shared(this); + } + + CommonThumbnailRenderer::~CommonThumbnailRenderer() + { + if (m_currentStep != Step::None) + { + CommonThumbnailRenderer::SetStep(Step::ReleaseResources); + } + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::MultiHandler::BusDisconnect(); + SystemTickBus::Handler::BusDisconnect(); + } + + void CommonThumbnailRenderer::SetStep(Step step) + { + if (m_currentStep != Step::None) + { + m_steps[m_currentStep]->Stop(); + } + m_currentStep = step; + m_steps[m_currentStep]->Start(); + } + + Step CommonThumbnailRenderer::GetStep() const + { + return m_currentStep; + } + + bool CommonThumbnailRenderer::Installed() const + { + return true; + } + + void CommonThumbnailRenderer::OnSystemTick() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::ExecuteQueuedEvents(); + } + + AZStd::shared_ptr CommonThumbnailRenderer::GetData() const + { + return m_data; + } + + void CommonThumbnailRenderer::RenderThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, [[maybe_unused]] int thumbnailSize) + { + m_data->m_thumbnailQueue.push(thumbnailKey); + if (m_currentStep == Step::None) + { + SetStep(Step::Initialize); + } + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/CommonThumbnailRenderer.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/CommonThumbnailRenderer.h new file mode 100644 index 0000000000..50e73f4391 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/CommonThumbnailRenderer.h @@ -0,0 +1,66 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include + +// Disables warning messages triggered by the Qt library +// 4251: class needs to have dll-interface to be used by clients of class +// 4800: forcing value to bool 'true' or 'false' (performance warning) +AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") +#include +AZ_POP_DISABLE_WARNING + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + class ThumbnailRendererStep; + + //! Provides custom rendering of material and model thumbnails + class CommonThumbnailRenderer + : private AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::MultiHandler + , private SystemTickBus::Handler + , public ThumbnailRendererContext + { + public: + AZ_CLASS_ALLOCATOR(CommonThumbnailRenderer, AZ::SystemAllocator, 0) + + CommonThumbnailRenderer(); + ~CommonThumbnailRenderer(); + + //! ThumbnailRendererContext overrides... + void SetStep(Step step) override; + Step GetStep() const override; + AZStd::shared_ptr GetData() const override; + + private: + //! ThumbnailerRendererRequestsBus::Handler interface overrides... + void RenderThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, int thumbnailSize) override; + bool Installed() const override; + + //! SystemTickBus::Handler interface overrides... + void OnSystemTick() override; + + AZStd::unordered_map> m_steps; + Step m_currentStep = Step::None; + AZStd::shared_ptr m_data; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererContext.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererContext.h new file mode 100644 index 0000000000..6cc0b0a264 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererContext.h @@ -0,0 +1,46 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + struct ThumbnailRendererData; + + enum class Step + { + None, + Initialize, + FindThumbnailToRender, + WaitForAssetsToLoad, + Capture, + ReleaseResources + }; + + //! An interface for ThumbnailRendererSteps to communicate with thumbnail renderer + class ThumbnailRendererContext + { + public: + virtual void SetStep(Step step) = 0; + virtual Step GetStep() const = 0; + virtual AZStd::shared_ptr GetData() const = 0; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererData.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererData.h new file mode 100644 index 0000000000..0bf3d3684f --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererData.h @@ -0,0 +1,75 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include "Atom/RPI.Reflect/Model/ModelAsset.h" + +#include +#include +#include +#include +#include +#include + +namespace AzFramework +{ + class Scene; +} + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + //! ThumbnailRendererData encapsulates all data used by thumbnail renderer and caches assets + struct ThumbnailRendererData final + { + static constexpr const char* LightingPresetPath = "lightingpresets/default.lightingpreset.azasset"; + static constexpr const char* DefaultModelPath = "materialeditor/viewportmodels/quadsphere.azmodel"; + static constexpr const char* DefaultMaterialPath = "materials/basic_grey.azmaterial"; + + RPI::ScenePtr m_scene; + AZStd::string m_sceneName = "Material Thumbnail Scene"; + AZStd::string m_pipelineName = "Material Thumbnail Pipeline"; + AzFramework::Scene* m_frameworkScene = nullptr; + RPI::RenderPipelinePtr m_renderPipeline; + AZStd::unique_ptr m_entityContext; + AZStd::vector m_passHierarchy; + + RPI::ViewPtr m_view = nullptr; + Entity* m_modelEntity = nullptr; + + double m_simulateTime = 0.0f; + float m_deltaTime = 0.0f; + + //! Incoming thumbnail requests are appended to this queue and processed one at a time in OnTick function. + AZStd::queue m_thumbnailQueue; + //! Current thumbnail key being rendered. + AzToolsFramework::Thumbnailer::SharedThumbnailKey m_thumbnailKeyRendered; + + Data::Asset m_lightingPresetAsset; + + Data::Asset m_defaultModelAsset; + //! Model asset about to be rendered + Data::Asset m_modelAsset; + + Data::Asset m_defaultMaterialAsset; + //! Material asset about to be rendered + Data::Asset m_materialAsset; + + AZStd::unordered_set m_assetsToLoad; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp new file mode 100644 index 0000000000..f3c74629c2 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp @@ -0,0 +1,121 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + CaptureStep::CaptureStep(ThumbnailRendererContext* context) + : ThumbnailRendererStep(context) + { + } + + void CaptureStep::Start() + { + Render::MaterialComponentRequestBus::Event( + m_context->GetData()->m_modelEntity->GetId(), + &Render::MaterialComponentRequestBus::Events::SetDefaultMaterialOverride, + m_context->GetData()->m_materialAsset.GetId()); + Render::MeshComponentRequestBus::Event( + m_context->GetData()->m_modelEntity->GetId(), + &Render::MeshComponentRequestBus::Events::SetModelAsset, + m_context->GetData()->m_modelAsset); + RepositionCamera(); + m_readyToCapture = true; + m_ticksToCapture = 1; + TickBus::Handler::BusConnect(); + } + + void CaptureStep::Stop() + { + m_context->GetData()->m_renderPipeline->RemoveFromRenderTick(); + TickBus::Handler::BusDisconnect(); + Render::FrameCaptureNotificationBus::Handler::BusDisconnect(); + } + + void CaptureStep::RepositionCamera() const + { + // Get bounding sphere of the model asset and estimate how far the camera needs to be see all of it + const Aabb& aabb = m_context->GetData()->m_modelAsset->GetAabb(); + Vector3 modelCenter; + float radius; + aabb.GetAsSphere(modelCenter, radius); + + float distance = StartingDistanceMultiplier * + GetMax(GetMax(aabb.GetExtents().GetX(), aabb.GetExtents().GetY()), aabb.GetExtents().GetZ()) + + DepthNear; + const Quaternion cameraRotation = Quaternion::CreateFromAxisAngle(Vector3::CreateAxisZ(), StartingRotationAngle); + Vector3 cameraPosition(modelCenter.GetX(), modelCenter.GetY() - distance, modelCenter.GetZ()); + cameraPosition = cameraRotation.TransformVector(cameraPosition); + auto cameraTransform = Transform::CreateFromQuaternionAndTranslation(cameraRotation, cameraPosition); + m_context->GetData()->m_view->SetCameraTransform(Matrix3x4::CreateFromTransform(cameraTransform)); + } + + void CaptureStep::OnTick(float deltaTime, ScriptTimePoint time) + { + m_context->GetData()->m_deltaTime = deltaTime; + m_context->GetData()->m_simulateTime = time.GetSeconds(); + + if (m_readyToCapture && m_ticksToCapture-- <= 0) + { + m_context->GetData()->m_renderPipeline->AddToRenderTickOnce(); + + RPI::AttachmentReadback::CallbackFunction readbackCallback = [&](const RPI::AttachmentReadback::ReadbackResult& result) + { + uchar* data = result.m_dataBuffer.get()->data(); + QImage image( + data, result.m_imageDescriptor.m_size.m_width, result.m_imageDescriptor.m_size.m_height, QImage::Format_RGBA8888); + QPixmap pixmap; + pixmap.convertFromImage(image); + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event( + m_context->GetData()->m_thumbnailKeyRendered, + &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, + pixmap); + }; + + Render::FrameCaptureNotificationBus::Handler::BusConnect(); + bool startedCapture = false; + Render::FrameCaptureRequestBus::BroadcastResult( + startedCapture, + &Render::FrameCaptureRequestBus::Events::CapturePassAttachmentWithCallback, + m_context->GetData()->m_passHierarchy, AZStd::string("Output"), readbackCallback); + // Reset the capture flag if the capture request was successful. Otherwise try capture it again next tick. + if (startedCapture) + { + m_readyToCapture = false; + } + } + } + + void CaptureStep::OnCaptureFinished([[maybe_unused]] Render::FrameCaptureResult result, [[maybe_unused]] const AZStd::string& info) + { + m_context->SetStep(Step::FindThumbnailToRender); + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.h new file mode 100644 index 0000000000..9c1bab370a --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.h @@ -0,0 +1,59 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + //! CaptureStep renders a thumbnail to a pixmap and notifies MaterialOrModelThumbnail once finished + class CaptureStep + : public ThumbnailRendererStep + , private TickBus::Handler + , private Render::FrameCaptureNotificationBus::Handler + { + public: + CaptureStep(ThumbnailRendererContext* context); + + void Start() override; + void Stop() override; + + private: + //! Places the camera so that the entire model is visible + void RepositionCamera() const; + + //! AZ::TickBus::Handler interface overrides... + void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; + + //! Render::FrameCaptureNotificationBus::Handler overrides... + void OnCaptureFinished(Render::FrameCaptureResult result, const AZStd::string& info) override; + + static constexpr float DepthNear = 0.01f; + static constexpr float StartingDistanceMultiplier = 1.75f; + static constexpr float StartingRotationAngle = Constants::QuarterPi / 2.0f; + + //! This flag is needed to wait one frame after each frame capture to reset FrameCaptureSystemComponent + bool m_readyToCapture = true; + //! This is necessary to suspend capture to allow a frame for Material and Mesh components to assign materials + int m_ticksToCapture = 0; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.cpp new file mode 100644 index 0000000000..bfbada3b30 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.cpp @@ -0,0 +1,83 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + FindThumbnailToRenderStep::FindThumbnailToRenderStep(ThumbnailRendererContext* context) + : ThumbnailRendererStep(context) + { + } + + void FindThumbnailToRenderStep::Start() + { + TickBus::Handler::BusConnect(); + } + + void FindThumbnailToRenderStep::Stop() + { + TickBus::Handler::BusDisconnect(); + } + + void FindThumbnailToRenderStep::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] ScriptTimePoint time) + { + PickNextThumbnail(); + } + + void FindThumbnailToRenderStep::PickNextThumbnail() + { + if (!m_context->GetData()->m_thumbnailQueue.empty()) + { + // pop the next thumbnailkey to be rendered from the queue + m_context->GetData()->m_thumbnailKeyRendered = m_context->GetData()->m_thumbnailQueue.front(); + m_context->GetData()->m_thumbnailQueue.pop(); + + // Find whether thumbnailkey contains a material asset or set a default material + m_context->GetData()->m_materialAsset = m_context->GetData()->m_defaultMaterialAsset; + Data::AssetId materialAssetId = GetAssetId(m_context->GetData()->m_thumbnailKeyRendered, RPI::MaterialAsset::RTTI_Type()); + if (materialAssetId.IsValid()) + { + if (m_context->GetData()->m_assetsToLoad.emplace(materialAssetId).second) + { + m_context->GetData()->m_materialAsset.Create(materialAssetId); + m_context->GetData()->m_materialAsset.QueueLoad(); + } + } + + // Find whether thumbnailkey contains a model asset or set a default model + m_context->GetData()->m_modelAsset = m_context->GetData()->m_defaultModelAsset; + Data::AssetId modelAssetId = GetAssetId(m_context->GetData()->m_thumbnailKeyRendered, RPI::ModelAsset::RTTI_Type()); + if (modelAssetId.IsValid()) + { + if (m_context->GetData()->m_assetsToLoad.emplace(modelAssetId).second) + { + m_context->GetData()->m_modelAsset.Create(modelAssetId); + m_context->GetData()->m_modelAsset.QueueLoad(); + } + } + + m_context->SetStep(Step::WaitForAssetsToLoad); + } + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.h new file mode 100644 index 0000000000..7e79881b43 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.h @@ -0,0 +1,44 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + //! FindThumbnailToRenderStep checks whether there are any new thumbnails that need to be rendered every tick + class FindThumbnailToRenderStep + : public ThumbnailRendererStep + , private TickBus::Handler + { + public: + FindThumbnailToRenderStep(ThumbnailRendererContext* context); + + void Start() override; + void Stop() override; + + private: + + //! AZ::TickBus::Handler interface overrides... + void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; + + void PickNextThumbnail(); + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp new file mode 100644 index 0000000000..5c65f0b907 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp @@ -0,0 +1,224 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + + InitializeStep::InitializeStep(ThumbnailRendererContext* context) + : ThumbnailRendererStep(context) + { + } + + void InitializeStep::Start() + { + auto data = m_context->GetData(); + + data->m_entityContext = AZStd::make_unique(); + data->m_entityContext->InitContext(); + + // Create and register a scene with minimum required feature processors + RPI::SceneDescriptor sceneDesc; + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::TransformServiceFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::MeshFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::PointLightFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::SpotLightFeatureProcessor"); + // There is currently a bug where having multiple DirectionalLightFeatureProcessors active can result in shadow flickering [ATOM-13568] + // as well as continually rebuilding MeshDrawPackets [ATOM-13633]. Lets just disable the directional light FP for now. + // Possibly re-enable with [GFX TODO][ATOM-13639] + // sceneDesc.m_featureProcessorNames.push_back("AZ::Render::DirectionalLightFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::DiskLightFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::CapsuleLightFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::QuadLightFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::DecalTextureArrayFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::ImageBasedLightFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::PostProcessFeatureProcessor"); + sceneDesc.m_featureProcessorNames.push_back("AZ::Render::SkyBoxFeatureProcessor"); + + data->m_scene = RPI::Scene::CreateScene(sceneDesc); + + // Setup scene srg modification callback (to push per-frame values to the shaders) + RPI::ShaderResourceGroupCallback callback = [data](RPI::ShaderResourceGroup* srg) + { + if (srg == nullptr) + { + return; + } + bool needCompile = false; + RHI::ShaderInputConstantIndex timeIndex = srg->FindShaderInputConstantIndex(Name{ "m_time" }); + if (timeIndex.IsValid()) + { + srg->SetConstant(timeIndex, aznumeric_cast(data->m_simulateTime)); + needCompile = true; + } + RHI::ShaderInputConstantIndex deltaTimeIndex = srg->FindShaderInputConstantIndex(Name{ "m_deltaTime" }); + if (deltaTimeIndex.IsValid()) + { + srg->SetConstant(deltaTimeIndex, data->m_deltaTime); + needCompile = true; + } + + if (needCompile) + { + srg->Compile(); + } + }; + data->m_scene->SetShaderResourceGroupCallback(callback); + + // Bind m_defaultScene to the GameEntityContext's AzFramework::Scene + Outcome createSceneOutcome; + AzFramework::SceneSystemRequestBus::BroadcastResult( + createSceneOutcome, + &AzFramework::SceneSystemRequests::CreateScene, + data->m_sceneName); + AZ_Assert(createSceneOutcome, createSceneOutcome.GetError().c_str()); // This should never happen unless scene creation has changed. + createSceneOutcome.GetValue()->SetSubsystem(data->m_scene.get()); + data->m_frameworkScene = createSceneOutcome.GetValue(); + data->m_frameworkScene->SetSubsystem(data->m_scene.get()); + + bool success = false; + AzFramework::SceneSystemRequestBus::BroadcastResult( + success, + &AzFramework::SceneSystemRequests::SetSceneForEntityContextId, + data->m_entityContext->GetContextId(), + data->m_frameworkScene); + AZ_Assert(success, "Unable to set entity context on AzFramework::Scene: %s", data->m_sceneName.c_str()); + + // Create a render pipeline from the specified asset for the window context and add the pipeline to the scene + RPI::RenderPipelineDescriptor pipelineDesc; + pipelineDesc.m_mainViewTagName = "MainCamera"; + pipelineDesc.m_name = data->m_pipelineName; + pipelineDesc.m_rootPassTemplate = "MainPipelineRenderToTexture"; + // We have to set the samples to 4 to match the pipeline passes' setting, otherwise it may lead to device lost issue + // [GFX TODO] [ATOM-13551] Default value sand validation required to prevent pipeline crash and device lost + pipelineDesc.m_renderSettings.m_multisampleState.m_samples = 4; + data->m_renderPipeline = RPI::RenderPipeline::CreateRenderPipeline(pipelineDesc); + data->m_scene->AddRenderPipeline(data->m_renderPipeline); + data->m_scene->Activate(); + RPI::RPISystemInterface::Get()->RegisterScene(data->m_scene); + data->m_passHierarchy.push_back(data->m_pipelineName); + data->m_passHierarchy.push_back("CopyToSwapChain"); + + // Connect camera to pipeline's default view after camera entity activated + Name viewName = Name("MainCamera"); + data->m_view = RPI::View::CreateView(viewName, RPI::View::UsageCamera); + + Matrix4x4 viewToClipMatrix; + MakePerspectiveFovMatrixRH(viewToClipMatrix, + Constants::QuarterPi, + AspectRatio, + NearDist, + FarDist, true); + data->m_view->SetViewToClipMatrix(viewToClipMatrix); + + data->m_renderPipeline->SetDefaultView(data->m_view); + + // Create lighting preset + data->m_lightingPresetAsset = AZ::RPI::AssetUtils::LoadAssetByProductPath(LightingPresetPath); + if (data->m_lightingPresetAsset.IsReady()) + { + auto preset = data->m_lightingPresetAsset->GetDataAs(); + if (preset) + { + auto iblFeatureProcessor = data->m_scene->GetFeatureProcessor(); + auto postProcessFeatureProcessor = data->m_scene->GetFeatureProcessor(); + auto exposureControlSettingInterface = postProcessFeatureProcessor->GetOrCreateSettingsInterface(EntityId())->GetOrCreateExposureControlSettingsInterface(); + auto directionalLightFeatureProcessor = data->m_scene->GetFeatureProcessor(); + auto skyboxFeatureProcessor = data->m_scene->GetFeatureProcessor(); + skyboxFeatureProcessor->Enable(true); + skyboxFeatureProcessor->SetSkyboxMode(Render::SkyBoxMode::Cubemap); + + Camera::Configuration cameraConfig; + cameraConfig.m_fovRadians = Constants::HalfPi; + cameraConfig.m_nearClipDistance = NearDist; + cameraConfig.m_farClipDistance = FarDist; + cameraConfig.m_frustumWidth = 100.0f; + cameraConfig.m_frustumHeight = 100.0f; + + AZStd::vector lightHandles; + + preset->ApplyLightingPreset( + iblFeatureProcessor, + skyboxFeatureProcessor, + exposureControlSettingInterface, + directionalLightFeatureProcessor, + cameraConfig, + lightHandles); + } + } + + // Create preview model + AzFramework::EntityContextRequestBus::EventResult(data->m_modelEntity, data->m_entityContext->GetContextId(), + &AzFramework::EntityContextRequestBus::Events::CreateEntity, "ThumbnailPreviewModel"); + data->m_modelEntity->CreateComponent(Render::MeshComponentTypeId); + data->m_modelEntity->CreateComponent(Render::MaterialComponentTypeId); + data->m_modelEntity->CreateComponent(azrtti_typeid()); + data->m_modelEntity->Init(); + data->m_modelEntity->Activate(); + + // preload default model + Data::AssetId defaultModelAssetId; + Data::AssetCatalogRequestBus::BroadcastResult( + defaultModelAssetId, + &Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, + m_context->GetData()->DefaultModelPath, + RPI::ModelAsset::RTTI_Type(), + false); + if (m_context->GetData()->m_assetsToLoad.emplace(defaultModelAssetId).second) + { + data->m_defaultModelAsset.Create(defaultModelAssetId); + data->m_defaultModelAsset.QueueLoad(); + } + + // preload default material + Data::AssetId defaultMaterialAssetId; + Data::AssetCatalogRequestBus::BroadcastResult( + defaultMaterialAssetId, + &Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, + m_context->GetData()->DefaultMaterialPath, + RPI::MaterialAsset::RTTI_Type(), + false); + if (m_context->GetData()->m_assetsToLoad.emplace(defaultMaterialAssetId).second) + { + data->m_defaultMaterialAsset.Create(defaultMaterialAssetId); + data->m_defaultMaterialAsset.QueueLoad(); + } + + m_context->SetStep(Step::FindThumbnailToRender); + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.h new file mode 100644 index 0000000000..8ba2446265 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.h @@ -0,0 +1,42 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + //! InitializeStep sets up RPI system and scene and prepares it for rendering thumbnail entities + //! This step is only called once when CommonThumbnailRenderer begins rendering its first thumbnail + class InitializeStep + : public ThumbnailRendererStep + { + public: + InitializeStep(ThumbnailRendererContext* context); + + void Start() override; + + private: + static constexpr const char* LightingPresetPath = "lightingpresets/default.lightingpreset.azasset"; + static constexpr float AspectRatio = 1.0f; + static constexpr float NearDist = 0.1f; + static constexpr float FarDist = 100.0f; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.cpp new file mode 100644 index 0000000000..03ab03336d --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.cpp @@ -0,0 +1,62 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + ReleaseResourcesStep::ReleaseResourcesStep(ThumbnailRendererContext* context) + : ThumbnailRendererStep(context) + { + } + + void ReleaseResourcesStep::Start() + { + m_context->GetData()->m_defaultMaterialAsset.Release(); + m_context->GetData()->m_defaultModelAsset.Release(); + m_context->GetData()->m_materialAsset.Release(); + m_context->GetData()->m_modelAsset.Release(); + + if (m_context->GetData()->m_modelEntity) + { + AzFramework::EntityContextRequestBus::Event(m_context->GetData()->m_entityContext->GetContextId(), + &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_context->GetData()->m_modelEntity); + m_context->GetData()->m_modelEntity = nullptr; + } + + m_context->GetData()->m_frameworkScene->UnsetSubsystem(); + + m_context->GetData()->m_scene->Deactivate(); + m_context->GetData()->m_scene->RemoveRenderPipeline(m_context->GetData()->m_renderPipeline->GetId()); + RPI::RPISystemInterface::Get()->UnregisterScene(m_context->GetData()->m_scene); + bool sceneRemovedSuccessfully = false; + AzFramework::SceneSystemRequestBus::BroadcastResult( + sceneRemovedSuccessfully, + &AzFramework::SceneSystemRequests::RemoveScene, + m_context->GetData()->m_sceneName); + m_context->GetData()->m_scene = nullptr; + m_context->GetData()->m_renderPipeline = nullptr; + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.h new file mode 100644 index 0000000000..bf67a2ec16 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.h @@ -0,0 +1,34 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + class ReleaseResourcesStep + : public ThumbnailRendererStep + { + public: + ReleaseResourcesStep(ThumbnailRendererContext* context); + + void Start() override; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ThumbnailRendererStep.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ThumbnailRendererStep.h new file mode 100644 index 0000000000..cf47c62764 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/ThumbnailRendererStep.h @@ -0,0 +1,41 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + class ThumbnailRendererContext; + + //! ThumbnailRendererStep decouples CommonThumbnailRenderer logic into easy-to-understand and debug pieces + class ThumbnailRendererStep + { + public: + explicit ThumbnailRendererStep(ThumbnailRendererContext* context) : m_context(context) {} + virtual ~ThumbnailRendererStep() = default; + + //! Start is called when step begins execution + virtual void Start() {} + //! Stop is called when step ends execution + virtual void Stop() {} + + protected: + ThumbnailRendererContext* m_context; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.cpp new file mode 100644 index 0000000000..0e2a6c3fef --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.cpp @@ -0,0 +1,105 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "Thumbnails/ThumbnailerBus.h" + +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + WaitForAssetsToLoadStep::WaitForAssetsToLoadStep(ThumbnailRendererContext* context) + : ThumbnailRendererStep(context) + { + } + + void WaitForAssetsToLoadStep::Start() + { + LoadNextAsset(); + } + + void WaitForAssetsToLoadStep::Stop() + { + Data::AssetBus::Handler::BusDisconnect(); + TickBus::Handler::BusDisconnect(); + m_context->GetData()->m_assetsToLoad.clear(); + } + + void WaitForAssetsToLoadStep::LoadNextAsset() + { + if (m_context->GetData()->m_assetsToLoad.empty()) + { + // When all assets are loaded, render the thumbnail itself + m_context->SetStep(Step::Capture); + } + else + { + // Pick the the next asset and wait until its ready + const auto assetIdIt = m_context->GetData()->m_assetsToLoad.begin(); + m_context->GetData()->m_assetsToLoad.erase(assetIdIt); + m_assetId = *assetIdIt; + Data::AssetBus::Handler::BusConnect(m_assetId); + // If asset is already loaded, then AssetEvents will call OnAssetReady instantly and we don't need to wait this time + if (Data::AssetBus::Handler::BusIsConnected()) + { + TickBus::Handler::BusConnect(); + m_timeRemainingS = TimeOutS; + } + } + } + + void WaitForAssetsToLoadStep::OnAssetReady([[maybe_unused]] Data::Asset asset) + { + Data::AssetBus::Handler::BusDisconnect(); + LoadNextAsset(); + } + + void WaitForAssetsToLoadStep::OnAssetError([[maybe_unused]] Data::Asset asset) + { + Data::AssetBus::Handler::BusDisconnect(); + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event( + m_context->GetData()->m_thumbnailKeyRendered, + &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); + m_context->SetStep(Step::FindThumbnailToRender); + } + + void WaitForAssetsToLoadStep::OnAssetCanceled([[maybe_unused]] Data::AssetId assetId) + { + Data::AssetBus::Handler::BusDisconnect(); + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event( + m_context->GetData()->m_thumbnailKeyRendered, + &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); + m_context->SetStep(Step::FindThumbnailToRender); + } + + void WaitForAssetsToLoadStep::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) + { + m_timeRemainingS -= deltaTime; + if (m_timeRemainingS < 0) + { + auto assetIdStr = m_assetId.ToString(); + AZ_Warning("CommonThumbnailRenderer", false, "Timed out waiting for asset %s to load.", assetIdStr.c_str()); + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event( + m_context->GetData()->m_thumbnailKeyRendered, + &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); + m_context->SetStep(Step::FindThumbnailToRender); + } + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.h new file mode 100644 index 0000000000..8ce322c9f1 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.h @@ -0,0 +1,54 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + //! WaitForAssetsToLoadStep pauses further rendering until all assets used for rendering a thumbnail have been loaded + class WaitForAssetsToLoadStep + : public ThumbnailRendererStep + , private Data::AssetBus::Handler + , private TickBus::Handler + { + public: + WaitForAssetsToLoadStep(ThumbnailRendererContext* context); + + void Start() override; + void Stop() override; + + private: + void LoadNextAsset(); + + // AZ::Data::AssetBus::Handler + void OnAssetReady(Data::Asset asset) override; + void OnAssetError(Data::Asset asset) override; + void OnAssetCanceled(Data::AssetId assetId) override; + + //! AZ::TickBus::Handler interface overrides... + void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; + + static constexpr float TimeOutS = 3.0f; + Data::AssetId m_assetId; + float m_timeRemainingS = 0; + }; + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ + diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/ThumbnailUtils.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/ThumbnailUtils.cpp new file mode 100644 index 0000000000..4d6d8aefc8 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/ThumbnailUtils.cpp @@ -0,0 +1,90 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + Data::AssetId GetAssetId(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, const Data::AssetType& assetType) + { + static const Data::AssetId invalidAssetId; + + // if it's a source thumbnail key, find first product with a matching asset type + auto sourceKey = azrtti_cast(key.data()); + if (sourceKey) + { + bool foundIt = false; + AZStd::vector productsAssetInfo; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult(foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetAssetsProducedBySourceUUID, sourceKey->GetSourceUuid(), productsAssetInfo); + if (!foundIt) + { + return invalidAssetId; + } + auto assetInfoIt = AZStd::find_if(productsAssetInfo.begin(), productsAssetInfo.end(), + [&assetType](const Data::AssetInfo& assetInfo) + { + return assetInfo.m_assetType == assetType; + }); + if (assetInfoIt == productsAssetInfo.end()) + { + return invalidAssetId; + } + + return assetInfoIt->m_assetId; + } + + // if it's a product thumbnail key just return its assetId + auto productKey = azrtti_cast(key.data()); + if (productKey && productKey->GetAssetType() == assetType) + { + return productKey->GetAssetId(); + } + return invalidAssetId; + } + + + QString WordWrap(const QString& string, int maxLength) + { + QString result; + int length = 0; + + for (const QChar& c : string) + { + if (c == '\n') + { + length = 0; + } + else if (length > maxLength) + { + result.append('\n'); + length = 0; + } + else + { + length++; + } + result.append(c); + } + return result; + } + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/ThumbnailUtils.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/ThumbnailUtils.h new file mode 100644 index 0000000000..8c949a4c7d --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/ThumbnailUtils.h @@ -0,0 +1,34 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +#if !defined(Q_MOC_RUN) +#include +#endif + +namespace AZ +{ + namespace LyIntegration + { + namespace Thumbnails + { + //! Get assetId by assetType that belongs to either source or product thumbnail key + Data::AssetId GetAssetId(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, const Data::AssetType& assetType); + + //! Word wrap function for previewer QLabel, since by default it does not break long words such as filenames, so manual word wrap needed + QString WordWrap(const QString& string, int maxLength); + } // namespace Thumbnails + } // namespace LyIntegration +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake b/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake index f5ccb8b94e..ab94a84d78 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake @@ -33,6 +33,8 @@ set(FILES Source/ImageBasedLights/EditorImageBasedLightComponent.cpp Source/Material/EditorMaterialComponent.cpp Source/Material/EditorMaterialComponent.h + Source/Material/EditorMaterialComponentUtil.cpp + Source/Material/EditorMaterialComponentUtil.h Source/Material/EditorMaterialComponentSlot.cpp Source/Material/EditorMaterialComponentSlot.h Source/Material/EditorMaterialComponentExporter.cpp @@ -43,8 +45,14 @@ set(FILES Source/Material/EditorMaterialModelUvNameMapInspector.h Source/Material/EditorMaterialSystemComponent.cpp Source/Material/EditorMaterialSystemComponent.h + Source/Material/MaterialThumbnail.cpp + Source/Material/MaterialThumbnail.h Source/Mesh/EditorMeshComponent.h Source/Mesh/EditorMeshComponent.cpp + Source/Mesh/EditorMeshSystemComponent.cpp + Source/Mesh/EditorMeshSystemComponent.h + Source/Mesh/MeshThumbnail.h + Source/Mesh/MeshThumbnail.cpp Source/PostProcess/EditorPostFxLayerComponent.cpp Source/PostProcess/EditorPostFxLayerComponent.h Source/PostProcess/Bloom/EditorBloomComponent.cpp @@ -79,15 +87,28 @@ set(FILES Source/SkyBox/EditorHDRiSkyboxComponent.h Source/SkyBox/EditorPhysicalSkyComponent.cpp Source/SkyBox/EditorPhysicalSkyComponent.h - Source/Material/Preview/MaterialPreviewer.cpp - Source/Material/Preview/MaterialPreviewer.h - Source/Material/Preview/MaterialPreviewer.ui - Source/Material/Preview/MaterialPreviewerFactory.cpp - Source/Material/Preview/MaterialPreviewerFactory.h - Source/Material/Thumbnails/MaterialThumbnail.cpp - Source/Material/Thumbnails/MaterialThumbnail.h - Source/Material/Thumbnails/MaterialThumbnailRenderer.cpp - Source/Material/Thumbnails/MaterialThumbnailRenderer.h + Source/Thumbnails/ThumbnailUtils.h + Source/Thumbnails/ThumbnailUtils.cpp + Source/Thumbnails/Preview/CommonPreviewer.cpp + Source/Thumbnails/Preview/CommonPreviewer.h + Source/Thumbnails/Preview/CommonPreviewer.ui + Source/Thumbnails/Preview/CommonPreviewerFactory.cpp + Source/Thumbnails/Preview/CommonPreviewerFactory.h + Source/Thumbnails/Rendering/CommonThumbnailRenderer.cpp + Source/Thumbnails/Rendering/CommonThumbnailRenderer.h + Source/Thumbnails/Rendering/ThumbnailRendererData.h + Source/Thumbnails/Rendering/ThumbnailRendererContext.h + Source/Thumbnails/Rendering/ThumbnailRendererSteps/ThumbnailRendererStep.h + Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp + Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.h + Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.cpp + Source/Thumbnails/Rendering/ThumbnailRendererSteps/FindThumbnailToRenderStep.h + Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.cpp + Source/Thumbnails/Rendering/ThumbnailRendererSteps/WaitForAssetsToLoadStep.h + Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp + Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.h + Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.cpp + Source/Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.h Source/Scripting/EditorEntityReferenceComponent.cpp Source/Scripting/EditorEntityReferenceComponent.h Resources/AtomLyIntegrationResources.qrc diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.cpp index d5500ce74c..de3670dd6b 100644 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.cpp +++ b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.cpp @@ -185,9 +185,7 @@ void CAtomShimRenderer::BeginFrame() m_dynamicDraw = AZ::RPI::DynamicDrawInterface::Get()->CreateDynamicDrawContext( AZ::RPI::RPISystemInterface::Get()->GetDefaultScene().get()); AZ::Data::Instance shader = AZ::RPI::LoadShader(shaderFilepath); - AZ::RPI::ShaderOptionList shaderOptions; - shaderOptions.push_back(AZ::RPI::ShaderOption(AZ::Name("o_useColorChannels"), AZ::Name("true"))); - m_dynamicDraw->InitShader(shader, &shaderOptions); + m_dynamicDraw->InitShader(shader); m_dynamicDraw->InitVertexFormat( {{"POSITION", AZ::RHI::Format::R32G32B32_FLOAT}, {"COLOR", AZ::RHI::Format::R8G8B8A8_UNORM}, @@ -199,11 +197,18 @@ void CAtomShimRenderer::BeginFrame() | AZ::RPI::DynamicDrawContext::DrawStateOptions::FaceCullMode); m_dynamicDraw->EndInit(); + // declare the two shader variants it will use + AZ::RPI::ShaderOptionList shaderOptionsClamp; + shaderOptionsClamp.push_back(AZ::RPI::ShaderOption(AZ::Name("o_useColorChannels"), AZ::Name("true"))); + shaderOptionsClamp.push_back(AZ::RPI::ShaderOption(AZ::Name("o_clamp"), AZ::Name("true"))); + m_shaderVariantClamp = m_dynamicDraw->UseShaderVariant(shaderOptionsClamp); + AZ::RPI::ShaderOptionList shaderOptionsWrap; + shaderOptionsWrap.push_back(AZ::RPI::ShaderOption(AZ::Name("o_useColorChannels"), AZ::Name("true"))); + shaderOptionsWrap.push_back(AZ::RPI::ShaderOption(AZ::Name("o_clamp"), AZ::Name("false"))); + m_shaderVariantWrap = m_dynamicDraw->UseShaderVariant(shaderOptionsWrap); + AZ::Data::Instance drawSrg = m_dynamicDraw->NewDrawSrg(); const AZ::RHI::ShaderResourceGroupLayout* layout = drawSrg->GetAsset()->GetLayout(); - m_imageInputIndex = layout->FindShaderInputImageIndex(AZ::Name("m_texture")); - m_samplerInputIndex = layout->FindShaderInputSamplerIndex(AZ::Name("m_sampler")); - m_viewProjInputIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_worldToProj")); m_isFinalInitializationDone = true; } @@ -1547,21 +1552,15 @@ void CAtomShimRenderer::DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVer Matrix44A matViewProj = matView * matProj; Matrix4x4 azMatViewProj = Matrix4x4::CreateFromColumnMajorFloat16(matViewProj.GetData()); + bool isClamp = m_clampFlagPerTextureUnit[0]; + m_dynamicDraw->SetShaderVariant(isClamp? m_shaderVariantClamp : m_shaderVariantWrap); + Data::Instance drawSrg = m_dynamicDraw->NewDrawSrg(); drawSrg->SetConstant(m_viewProjInputIndex, azMatViewProj); AtomShimTexture* atomTexture = m_currentTextureForUnit[0]; drawSrg->SetImageView(m_imageInputIndex, atomTexture->m_imageView.get()); - AZ::RHI::SamplerState samplerState; - samplerState.m_anisotropyEnable = true; - samplerState.m_anisotropyMax = 16; - bool isClamp = m_clampFlagPerTextureUnit[0]; - RHI::AddressMode addressMode = isClamp ? RHI::AddressMode::Clamp : RHI::AddressMode::Wrap; - samplerState.m_addressU = addressMode; - samplerState.m_addressV = addressMode; - samplerState.m_addressW = addressMode; - drawSrg->SetSampler(m_samplerInputIndex, samplerState); drawSrg->Compile(); RHI::PrimitiveTopology primitiveType = RHI::PrimitiveTopology::TriangleList; diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.h b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.h index 73f2ad8af1..a95dfb602c 100644 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.h +++ b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.h @@ -139,7 +139,7 @@ public: virtual SDepthTexture* FX_GetDepthSurface([[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] bool bAA, [[maybe_unused]] bool shaderResourceView = false) override { return nullptr; } virtual long FX_SetIStream([[maybe_unused]] const void* pB, [[maybe_unused]] uint32 nOffs, [[maybe_unused]] RenderIndexType idxType) override { return -1; } virtual long FX_SetVStream([[maybe_unused]] int nID, [[maybe_unused]] const void* pB, [[maybe_unused]] uint32 nOffs, [[maybe_unused]] uint32 nStride, [[maybe_unused]] uint32 nFreq = 1) override { return -1; } - virtual void FX_DrawPrimitive([[maybe_unused]] const eRenderPrimitiveType eType, [[maybe_unused]] const int nStartVertex, [[maybe_unused]] const int nVerticesCount, [[maybe_unused]] const int nInstanceVertices = 0) {} + virtual void FX_DrawPrimitive([[maybe_unused]] eRenderPrimitiveType eType, [[maybe_unused]] int nStartVertex, [[maybe_unused]] int nVerticesCount, [[maybe_unused]] int nInstanceVertices = 0) {} virtual void DrawQuad3D([[maybe_unused]] const Vec3& v0, [[maybe_unused]] const Vec3& v1, [[maybe_unused]] const Vec3& v2, [[maybe_unused]] const Vec3& v3, [[maybe_unused]] const ColorF& color, [[maybe_unused]] float ftx0, [[maybe_unused]] float fty0, [[maybe_unused]] float ftx1, [[maybe_unused]] float fty1) override {} virtual void DrawQuad([[maybe_unused]] float x0, [[maybe_unused]] float y0, [[maybe_unused]] float x1, [[maybe_unused]] float y1, [[maybe_unused]] const ColorF& color, [[maybe_unused]] float z = 1.0f, [[maybe_unused]] float s0 = 0.0f, [[maybe_unused]] float t0 = 0.0f, [[maybe_unused]] float s1 = 1.0f, [[maybe_unused]] float t1 = 1.0f) override {}; virtual void FX_ClearTarget(ITexture* pTex) override; @@ -196,7 +196,7 @@ public: virtual void SetRenderTile([[maybe_unused]] f32 nTilesPosX, [[maybe_unused]] f32 nTilesPosY, [[maybe_unused]] f32 nTilesGridSizeX, [[maybe_unused]] f32 nTilesGridSizeY) {} - virtual void EF_InvokeShadowMapRenderJobs([[maybe_unused]] const int nFlags){} + virtual void EF_InvokeShadowMapRenderJobs([[maybe_unused]] int nFlags){} //! Fills array of all supported video formats (except low resolution formats) //! Returns number of formats, also when called with NULL virtual int EnumDisplayFormats(SDispFormat* Formats); @@ -235,8 +235,8 @@ public: virtual void SetTexture(int tnum, int nUnit); virtual void SetState(int State, int AlphaRef); - virtual void DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, const bool asciiMultiLine, const STextDrawContext& ctx) const; - virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, const PublicRenderPrimitiveType nPrimType); + virtual void DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, bool asciiMultiLine, const STextDrawContext& ctx) const; + virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, PublicRenderPrimitiveType nPrimType); virtual void DrawDynUiPrimitiveList(DynUiPrimitiveList& primitives, int totalNumVertices, int totalNumIndices); virtual void DrawBuffer(CVertexBuffer* pVBuf, CIndexBuffer* pIBuf, int nNumIndices, int nOffsIndex, const PublicRenderPrimitiveType nPrmode, int nVertStart = 0, int nVertStop = 0); @@ -286,7 +286,7 @@ public: virtual unsigned int DownLoadToVideoMemory3D([[maybe_unused]] const byte* data, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] int d, [[maybe_unused]] ETEX_Format eTFSrc, [[maybe_unused]] ETEX_Format eTFDst, [[maybe_unused]] int nummipmap, [[maybe_unused]] bool repeat = true, [[maybe_unused]] int filter = FILTER_BILINEAR, [[maybe_unused]] int Id = 0, [[maybe_unused]] const char* szCacheName = NULL, [[maybe_unused]] int flags = 0, [[maybe_unused]] EEndian eEndian = eLittleEndian, [[maybe_unused]] RectI* pRegion = NULL, [[maybe_unused]] bool bAsynDevTexCreation = false) { return 0; } virtual void UpdateTextureInVideoMemory([[maybe_unused]] uint32 tnum, [[maybe_unused]] const byte* newdata, [[maybe_unused]] int posx, [[maybe_unused]] int posy, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] ETEX_Format eTFSrc = eTF_R8G8B8A8, [[maybe_unused]] int posz = 0, [[maybe_unused]] int sizez = 1){} - virtual bool SetGammaDelta(const float fGamma); + virtual bool SetGammaDelta(float fGamma); virtual void RestoreGamma(void) {}; virtual void RemoveTexture([[maybe_unused]] unsigned int TextureId) {} @@ -347,7 +347,7 @@ public: virtual void GetProjectionMatrix(float* mat); //for texture - virtual ITexture* EF_LoadTexture(const char* nameTex, const uint32 flags = 0); + virtual ITexture* EF_LoadTexture(const char* nameTex, uint32 flags = 0); virtual ITexture* EF_LoadDefaultTexture(const char* nameTex); virtual void DrawQuad(const Vec3& right, const Vec3& up, const Vec3& origin, int nFlipMode = 0); @@ -405,10 +405,10 @@ public: virtual bool EF_SetLightHole(Vec3 vPos, Vec3 vNormal, int idTex, float fScale = 1.0f, bool bAdditive = true); // Draw all shaded REs in the list - virtual void EF_EndEf3D (const int nFlags, const int nPrecacheUpdateId, const int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo); + virtual void EF_EndEf3D (int nFlags, int nPrecacheUpdateId, int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo); // 2d interface for shaders - virtual void EF_EndEf2D(const bool bSort); + virtual void EF_EndEf2D(bool bSort); virtual bool EF_PrecacheResource(SShaderItem* pSI, float fMipFactor, float fTimeToReady, int Flags, int nUpdateId, int nCounter); virtual bool EF_PrecacheResource(ITexture* pTP, float fDist, float fTimeToReady, int Flags, int nUpdateId, int nCounter); virtual void PrecacheResources(); @@ -495,7 +495,7 @@ public: virtual void RT_DrawDynVB([[maybe_unused]] int Pool, [[maybe_unused]] uint32 nVerts) {} virtual void RT_DrawDynVB([[maybe_unused]] SVF_P3F_C4B_T2F* pBuf, [[maybe_unused]] uint16* pInds, [[maybe_unused]] uint32 nVerts, [[maybe_unused]] uint32 nInds, [[maybe_unused]] const PublicRenderPrimitiveType nPrimType) {} virtual void RT_DrawDynVBUI([[maybe_unused]] SVF_P2F_C4B_T2F_F4B* pBuf, [[maybe_unused]] uint16* pInds, [[maybe_unused]] uint32 nVerts, [[maybe_unused]] uint32 nInds, [[maybe_unused]] const PublicRenderPrimitiveType nPrimType) {} - virtual void RT_DrawStringU([[maybe_unused]] IFFont_RenderProxy* pFont, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z, [[maybe_unused]] const char* pStr, [[maybe_unused]] const bool asciiMultiLine, [[maybe_unused]] const STextDrawContext& ctx) const {} + virtual void RT_DrawStringU([[maybe_unused]] IFFont_RenderProxy* pFont, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z, [[maybe_unused]] const char* pStr, [[maybe_unused]] bool asciiMultiLine, [[maybe_unused]] const STextDrawContext& ctx) const {} virtual void RT_DrawLines([[maybe_unused]] Vec3 v[], [[maybe_unused]] int nump, [[maybe_unused]] ColorF& col, [[maybe_unused]] int flags, [[maybe_unused]] float fGround) {} virtual void RT_Draw2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] CTexture* pTexture, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] DWORD col, [[maybe_unused]] float z) {} virtual void RT_Push2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] CTexture* pTexture, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] DWORD col, [[maybe_unused]] float z, [[maybe_unused]] float stereoDepth) {} @@ -517,7 +517,7 @@ public: virtual void RT_SetViewport([[maybe_unused]] int x, [[maybe_unused]] int y, [[maybe_unused]] int width, [[maybe_unused]] int height, [[maybe_unused]] int id) {} virtual void RT_SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] const bool bSilentMode = false) {}; - virtual void SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] const bool bSilentMode = false) {}; + virtual void SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] bool bSilentMode = false) {}; virtual void SetMatrices(float* pProjMat, float* pViewMat); @@ -569,10 +569,13 @@ private: IStereoRenderer* m_pAtomShimStereoRenderer; AZ::RHI::Ptr m_dynamicDraw; + + AZ::RPI::ShaderVariantId m_shaderVariantWrap; + AZ::RPI::ShaderVariantId m_shaderVariantClamp; + // cached input indices for dynamic draw's draw srg - AZ::RHI::ShaderInputImageIndex m_imageInputIndex; - AZ::RHI::ShaderInputSamplerIndex m_samplerInputIndex; - AZ::RHI::ShaderInputConstantIndex m_viewProjInputIndex; + AZ::RHI::ShaderInputNameIndex m_imageInputIndex = "m_texture"; + AZ::RHI::ShaderInputNameIndex m_viewProjInputIndex = "m_worldToProj"; AZStd::unordered_map m_viewContexts; AtomShimViewContext* m_currContext = nullptr; diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp index e168b67b41..60940d8854 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp @@ -281,99 +281,35 @@ namespace AZ } } - void ProcessMorphsForLod(const EMotionFX::Actor* actor, uint32_t lodIndex, const AZStd::string& fullFileName, SkinnedMeshInputLod& skinnedMeshLod) + static void ProcessMorphsForLod(const EMotionFX::Actor* actor, const Data::Asset& morphBufferAsset, uint32_t lodIndex, const AZStd::string& fullFileName, SkinnedMeshInputLod& skinnedMeshLod) { EMotionFX::MorphSetup* morphSetup = actor->GetMorphSetup(lodIndex); if (morphSetup) { - uint32_t morphTargetCount = morphSetup->GetNumMorphTargets(); + AZ_Assert(actor->GetMorphTargetMetaAsset().IsReady(), "Trying to create morph targets from actor '%s', but the MorphTargetMetaAsset isn't loaded.", actor->GetName()); + const AZStd::vector& metaDatas = actor->GetMorphTargetMetaAsset()->GetMorphTargets(); - // We're going to split the data into separate streams with 4byte elements, - // which allows for a coalesced read in the morph target compute shader when each thread is loading 4 adjacent bytes at the same time - - // Packed, interleaved vertex deltas - AZStd::vector deltaData; - - uint32_t totalDeformDataCount = 0; - - for (uint32_t morphTargetIndex = 0; morphTargetIndex < morphTargetCount; ++morphTargetIndex) + // Loop over all the EMotionFX morph targets + const AZ::u32 numMorphTargets = morphSetup->GetNumMorphTargets(); + for (AZ::u32 morphTargetIndex = 0; morphTargetIndex < numMorphTargets; ++morphTargetIndex) { - EMotionFX::MorphTarget* morphTarget = morphSetup->GetMorphTarget(morphTargetIndex); - // check if we are dealing with a standard morph target - if (morphTarget->GetType() != EMotionFX::MorphTargetStandard::TYPE_ID) - { - continue; - } - - // down cast the morph target - EMotionFX::MorphTargetStandard* morphTargetStandard = static_cast(morphTarget); - uint32_t deformDataCount = morphTargetStandard->GetNumDeformDatas(); - - // Get the min/max weight across the entire morph - float minWeight = morphTargetStandard->GetRangeMin(); - float maxWeight = morphTargetStandard->GetRangeMax(); - - // There are multiple deforms for a single morph. Combine them all into a single morph to be processed at once - for (uint32_t deformDataIndex = 0; deformDataIndex < deformDataCount; ++deformDataIndex) + EMotionFX::MorphTargetStandard* morphTarget = static_cast(morphSetup->GetMorphTarget(morphTargetIndex)); + for (const auto& metaData : metaDatas) { - EMotionFX::MorphTargetStandard::DeformData* deformData = morphTargetStandard->GetDeformData(deformDataIndex); - - // Vertex data - for (uint32_t vertexIndex = 0; vertexIndex < deformData->mNumVerts; ++vertexIndex) + // Loop through the metadatas to find the one that corresponds with the current morph target + // This ensures the order stays in sync with the order in the MorphSetup, + // so that the correct weights are applied to the correct morphs later + // Skip any that don't modify any vertices + if (metaData.m_morphTargetName == morphTarget->GetNameString() && metaData.m_numVertices > 0) { - const EMotionFX::MorphTargetStandard::DeformData::VertexDelta& delta = deformData->mDeltas[vertexIndex]; - - // TODO: Modify the builder to pack data the way it's expected to be read on the GPU instead of packing it here [ATOM-14698] - - // Add the target vertex index - deltaData.push_back(delta.mVertexNr); - - // Combine the position x in the most-significant 16 bits and position y in the least significant 16 bits - uint32_t xy = 0; - xy |= (static_cast(delta.mPosition.mX) << 16); - xy |= static_cast(delta.mPosition.mY); - deltaData.push_back(xy); - - // Combine the position z in the most significant 16 bits with the normal x and y in the least significant 16 bits - uint32_t positionZnormalXY = 0; - positionZnormalXY |= static_cast(delta.mPosition.mZ) << 16; - positionZnormalXY |= static_cast(delta.mNormal.mX) << 8; - positionZnormalXY |= static_cast(delta.mNormal.mY); - deltaData.push_back(positionZnormalXY); - - // Combine the normal z in the most significant 8 bits with the tangent in the least significant 24 bits - uint32_t normalZTangent = 0; - normalZTangent |= (static_cast(delta.mNormal.mZ) << 24); - normalZTangent |= (static_cast(delta.mTangent.mX) << 16); - normalZTangent |= (static_cast(delta.mTangent.mY) << 8); - normalZTangent |= static_cast(delta.mTangent.mZ); - deltaData.push_back(normalZTangent); - - // Combine padding in most significant 8 bits with the bitangent in the least significant 24 bits - uint32_t padBitangent = 0; - padBitangent |= static_cast(delta.mBitangent.mX) << 16; - padBitangent |= (static_cast(delta.mBitangent.mY) << 8); - padBitangent |= static_cast(delta.mBitangent.mZ); - deltaData.push_back(padBitangent); - - // Extra padding so each structured element of the buffer is 16 byte aligned - deltaData.push_back(0); - deltaData.push_back(0); - deltaData.push_back(0); - } + // The skinned mesh lod gets a unique morph for each meta, since each one has unique min/max delta values to use for decompression + AZStd::string morphString = AZStd::string::format("%s_Lod%u_Morph_%s", fullFileName.c_str(), lodIndex, metaData.m_meshNodeName.c_str()); - if (deformData->mNumVerts > 0) - { - // The skinned mesh lod gets a unique morph for each deform data, since each one has unique min/max delta values to use for decompression - AZStd::string morphString = AZStd::string::format("_Lod%u_Morph%u", lodIndex, totalDeformDataCount); - skinnedMeshLod.AddMorphTarget(minWeight, maxWeight, deformData->mMinValue, deformData->mMaxValue, deformData->mNumVerts, deltaData, fullFileName + morphString); - totalDeformDataCount++; - } - else - { - AZ_Warning("ProcessMorphsForLod", false, "EMotionFX deform data '%u' in morph target '%u' for lod '%u' in '%s' modifies zero vertices and will be skipped.", deformDataIndex, morphTargetIndex, lodIndex, fullFileName.c_str()); + float minWeight = morphTarget->GetRangeMin(); + float maxWeight = morphTarget->GetRangeMax(); + + skinnedMeshLod.AddMorphTarget(metaData, morphBufferAsset, morphString, minWeight, maxWeight); } - deltaData.clear(); } } } @@ -574,7 +510,11 @@ namespace AZ // and create the common, shared sub-mesh buffer views skinnedMeshLod.SetSubMeshProperties(subMeshes); - ProcessMorphsForLod(actor, lodIndex, fullFileName, skinnedMeshLod); + const RPI::BufferAssetView* morphBufferAssetView = mesh0.GetSemanticBufferAssetView(Name{ "MORPHTARGET_VERTEXDELTAS" }); + if (morphBufferAssetView) + { + ProcessMorphsForLod(actor, morphBufferAssetView->GetBufferAsset(), lodIndex, fullFileName, skinnedMeshLod); + } skinnedMeshInputBuffers->SetLod(lodIndex, skinnedMeshLod); diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp index 4ab5bd120c..b0d52e0776 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp @@ -422,7 +422,7 @@ namespace AZ if (morphSetup) { uint32_t morphTargetCount = morphSetup->GetNumMorphTargets(); - AZStd::vector weights; + m_morphTargetWeights.clear(); for (uint32_t morphTargetIndex = 0; morphTargetIndex < morphTargetCount; ++morphTargetIndex) { EMotionFX::MorphTarget* morphTarget = morphSetup->GetMorphTarget(morphTargetIndex); @@ -441,10 +441,15 @@ namespace AZ // and thus correspond with unique dispatches in the morph target pass for (uint32_t deformDataIndex = 0; deformDataIndex < morphTargetStandard->GetNumDeformDatas(); ++deformDataIndex) { - weights.push_back(morphTargetSetupInstance->GetWeight()); + // Morph targets that don't deform any vertices (e.g. joint-based morph targets) are not registered in the render proxy. Skip adding their weights. + const EMotionFX::MorphTargetStandard::DeformData* deformData = morphTargetStandard->GetDeformData(deformDataIndex); + if (deformData->mNumVerts > 0) + { + m_morphTargetWeights.push_back(morphTargetSetupInstance->GetWeight()); + } } } - m_skinnedMeshRenderProxy->SetMorphTargetWeights(lodIndex, weights); + m_skinnedMeshRenderProxy->SetMorphTargetWeights(lodIndex, m_morphTargetWeights); } } } diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h index 31858ddc40..e14a0a7c4f 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h @@ -187,6 +187,7 @@ namespace AZ AZStd::shared_ptr m_meshHandle; AZ::TransformInterface* m_transformInterface = nullptr; AZStd::set m_waitForMaterialLoadIds; + AZStd::vector m_morphTargetWeights; }; } // namespace Render diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/DebugConsole.cpp b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/DebugConsole.cpp new file mode 100644 index 0000000000..a8c2b231e0 --- /dev/null +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/DebugConsole.cpp @@ -0,0 +1,379 @@ +/* +* All or portions of this file Copyright(c) Amazon.com, Inc.or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution(the "License").All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file.Do not +* remove or modify any license notices.This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include + +using namespace AzFramework; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +namespace AZ +{ + //////////////////////////////////////////////////////////////////////////////////////////////// + constexpr const char* DebugConsoleInputContext = "DebugConsoleInputContext"; + const InputChannelId ToggleDebugConsoleInputChannelId("ToggleDebugConsole"); + const InputChannelId ThumbstickL3AndR3InputChannelId("BothGamepadTriggers"); + + //////////////////////////////////////////////////////////////////////////////////////////////// + AZ::Color GetColorForLogLevel(const AZ::LogLevel& logLevel) + { + switch (logLevel) + { + case AZ::LogLevel::Fatal: + case AZ::LogLevel::Error: + { + return AZ::Colors::Red; + } + break; + case AZ::LogLevel::Warn: + { + return AZ::Colors::Yellow; + } + break; + case AZ::LogLevel::Notice: + case AZ::LogLevel::Info: + case AZ::LogLevel::Debug: + case AZ::LogLevel::Trace: + default: + { + return AZ::Colors::White; + } + break; + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + DebugConsole::DebugConsole(int maxEntriesToDisplay, int maxInputHistorySize) + : InputChannelEventListener(InputChannelEventListener::GetPriorityFirst(), true) + , m_logHandler + ( + [this](AZ::LogLevel logLevel, + const char* message, + [[maybe_unused]]const char* file, + [[maybe_unused]]const char* function, + [[maybe_unused]]int32_t line) + { + AddDebugLog(message, GetColorForLogLevel(logLevel)); + } + ) + , m_inputContext(DebugConsoleInputContext, {nullptr, InputChannelEventListener::GetPriorityFirst(), true, true}) + , m_maxEntriesToDisplay(maxEntriesToDisplay) + , m_maxInputHistorySize(maxInputHistorySize) + { + // Create an input mapping so that the debug console can be toggled by 'L3+R3' on a gamepad. + AZStd::shared_ptr inputMappingL3AndR3 = AZStd::make_shared(ThumbstickL3AndR3InputChannelId, m_inputContext); + inputMappingL3AndR3->AddSourceInput(InputDeviceGamepad::Button::L3); + inputMappingL3AndR3->AddSourceInput(InputDeviceGamepad::Button::R3); + m_inputContext.AddInputMapping(inputMappingL3AndR3); + + // Create an input mapping so that the debug console can be toggled by any of: + // - The '~' key on a keyboard. + // - Both the 'L3+R3' buttons on a gamepad. + // - The fourth finger press on a touch screen. + AZStd::shared_ptr inputMappingToggleConsole = AZStd::make_shared(ToggleDebugConsoleInputChannelId, m_inputContext); + inputMappingToggleConsole->AddSourceInput(InputDeviceKeyboard::Key::PunctuationTilde); + inputMappingToggleConsole->AddSourceInput(inputMappingL3AndR3->GetInputChannelId()); + inputMappingToggleConsole->AddSourceInput(InputDeviceTouch::Touch::Index4); + m_inputContext.AddInputMapping(inputMappingToggleConsole); + + // Filter so the input context only listens for input events that can map to + // 'ToggleDebugConsoleInputChannelId', and so the debug console only listens + // for the custom 'ToggleDebugConsoleInputChannelId' id (optimization only). + AZStd::shared_ptr inputFilter = AZStd::make_shared(); + inputFilter->IncludeChannelName(InputDeviceGamepad::Button::L3.GetNameCrc32()); + inputFilter->IncludeChannelName(InputDeviceGamepad::Button::R3.GetNameCrc32()); + inputFilter->IncludeChannelName(inputMappingL3AndR3->GetInputChannelId().GetNameCrc32()); + inputFilter->IncludeChannelName(InputDeviceKeyboard::Key::PunctuationTilde.GetNameCrc32()); + inputFilter->IncludeChannelName(InputDeviceTouch::Touch::Index4.GetNameCrc32()); + m_inputContext.SetFilter(inputFilter); + inputFilter = AZStd::make_shared(); + inputFilter->IncludeChannelName(inputMappingToggleConsole->GetInputChannelId().GetNameCrc32()); + SetFilter(inputFilter); + + // Bind our custom log handler. + AZ::Interface::Get()->BindLogHandler(m_logHandler); + + // Connect to receive tick events. + AZ::TickBus::Handler::BusConnect(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + DebugConsole::~DebugConsole() + { + // Disconnect to stop receiving tick events. + AZ::TickBus::Handler::BusDisconnect(); + + // Disconnect our custom log handler. + m_logHandler.Disconnect(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + int DebugConsole::GetTickOrder() + { + return AZ::ComponentTickBus::TICK_UI; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void DebugConsole::OnTick([[maybe_unused]]float deltaTime, + [[maybe_unused]]AZ::ScriptTimePoint scriptTimePoint) + { + if (m_isShowing) + { + DrawDebugConsole(); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + bool DebugConsole::OnInputChannelEventFiltered(const AzFramework::InputChannel& inputChannel) + { + if (inputChannel.GetInputChannelId() == ToggleDebugConsoleInputChannelId && + inputChannel.IsStateBegan()) + { + m_isShowing = !m_isShowing; + return true; + } + return false; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void DebugConsole::AddDebugLog(const AZStd::string& debugLogString, const AZ::Color& color) + { + // Add the debug to our display, removing the oldest entry if we exceed the maximum. + m_debugLogEntires.push_back(AZStd::make_pair(debugLogString, color)); + if (m_debugLogEntires.size() > m_maxEntriesToDisplay) + { + m_debugLogEntires.pop_front(); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void DebugConsole::ClearDebugLog() + { + m_debugLogEntires.clear(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void ResetTextInputField(ImGuiInputTextCallbackData* data, const AZStd::string& newText) + { + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, newText.c_str()); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void DebugConsole::AutoCompleteCommand(ImGuiInputTextCallbackData* data) + { + AZStd::vector matchingCommands; + const AZStd::string longestMatchingSubstring = AZ::Interface::Get()->AutoCompleteCommand(data->Buf, &matchingCommands); + ResetTextInputField(data, longestMatchingSubstring); + + // Auto complete options are logged in AutoCompleteCommand using AZLOG_INFO, + // so if the log level is set higher we display auto complete options here. + if (AZ::Interface::Get()->GetLogLevel() > AZ::LogLevel::Info) + { + if (matchingCommands.empty()) + { + AZStd::string noAutoCompletionResults("No auto completion options: "); + noAutoCompletionResults += data->Buf; + AddDebugLog(noAutoCompletionResults, AZ::Colors::Gray); + } + else if (matchingCommands.size() > 1) + { + AZStd::string autoCompletionResults("Auto completion options: "); + autoCompletionResults += data->Buf; + AddDebugLog(autoCompletionResults, AZ::Colors::Green); + for (const AZStd::string& matchingCommand : matchingCommands) + { + AddDebugLog(matchingCommand, AZ::Colors::Green); + } + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void DebugConsole::BrowseInputHistory(ImGuiInputTextCallbackData* data) + { + const int previousHistoryIndex = m_currentHistoryIndex; + const int maxHistoryIndex = m_textInputHistory.size() - 1; + switch (data->EventKey) + { + // Browse backwards through the history. + case ImGuiKey_UpArrow: + { + if (m_currentHistoryIndex < 0) + { + // Go to the last history entry. + m_currentHistoryIndex = maxHistoryIndex; + } + else if (m_currentHistoryIndex > 0) + { + // Go to the previous history entry. + --m_currentHistoryIndex; + } + } + break; + + // Browse forwards through the history. + case ImGuiKey_DownArrow: + { + if (m_currentHistoryIndex >= 0 && m_currentHistoryIndex < maxHistoryIndex) + { + ++m_currentHistoryIndex; + } + } + break; + } + + if (previousHistoryIndex != m_currentHistoryIndex) + { + ResetTextInputField(data, m_textInputHistory[m_currentHistoryIndex]); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void DebugConsole::OnTextInputEntered(const char* inputText) + { + // Add the input text to our history, removing the oldest entry if we exceed the maximum. + const AZStd::string inputTextString(inputText); + m_textInputHistory.push_back(inputTextString); + if (m_textInputHistory.size() > m_maxInputHistorySize) + { + m_textInputHistory.pop_front(); + } + + // Clear the current history index; + m_currentHistoryIndex = -1; + + // Attempt to perform a console command. + AZ::Interface::Get()->PerformCommand(inputTextString.c_str()); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + int InputTextCallback(ImGuiInputTextCallbackData* data) + { + DebugConsole* debugConsole = static_cast(data->UserData); + if (!debugConsole) + { + return 0; + } + + switch (data->EventFlag) + { + case ImGuiInputTextFlags_CallbackCompletion: + { + debugConsole->AutoCompleteCommand(data); + } + break; + case ImGuiInputTextFlags_CallbackHistory: + { + debugConsole->BrowseInputHistory(data); + } + break; + } + return 0; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void DebugConsole::DrawDebugConsole() + { + // Draw the debug console in a closeable, moveable, and resizeable IMGUI window. + ImGui::SetNextWindowSize(ImVec2(640, 480), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Debug Console", &m_isShowing)) + { + ImGui::End(); + return; + } + + // Show a scrolling child region in which to display all debug log entires. + const float footerHeightToReserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetStyle().FramePadding.y + ImGui::GetFrameHeightWithSpacing(); + ImGui::BeginChild("DebugLogEntriesScrollBox", ImVec2(0, -footerHeightToReserve), false, ImGuiWindowFlags_HorizontalScrollbar); + { + // Display each debug log entry individually so they can be colored. + for (const auto& debugLogEntry : m_debugLogEntires) + { + const ImVec4 color(debugLogEntry.second.GetR(), + debugLogEntry.second.GetG(), + debugLogEntry.second.GetB(), + debugLogEntry.second.GetA()); + ImGui::PushStyleColor(ImGuiCol_Text, color); + ImGui::TextUnformatted(debugLogEntry.first.c_str()); + ImGui::PopStyleColor(); + } + + // Scroll to the last debug log entry if needed. + if (m_forceScroll || (m_autoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())) + { + ImGui::SetScrollHereY(1.0f); + m_forceScroll = false; + } + } + ImGui::EndChild(); + + // Show a text input field. + ImGui::Separator(); + const ImGuiInputTextFlags inputTextFlags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; + const bool textWasInput = ImGui::InputText("", m_inputBuffer, IM_ARRAYSIZE(m_inputBuffer), inputTextFlags, &InputTextCallback, (void*)this); + if (textWasInput) + { + OnTextInputEntered(m_inputBuffer); + azstrncpy(m_inputBuffer, IM_ARRAYSIZE(m_inputBuffer), "", 1); + ImGui::SetKeyboardFocusHere(-1); + m_forceScroll = true; + } + + // Focus on the text input field. + ImGui::SetItemDefaultFocus(); + + // Show a button to clear the debug log. + ImGui::SameLine(); + if (ImGui::Button("Clear")) + { + ClearDebugLog(); + } + + // Show an options menu. + if (ImGui::BeginPopup("Options")) + { + // Show a combo box that controls the minimum log level (options correspond to AZ::LogLevel). + ImGui::SetNextItemWidth((ImGui::CalcTextSize("WWWWWW").x + ImGui::GetStyle().FramePadding.x) * 2.0f); + int logLevel = static_cast(AZ::Interface::Get()->GetLogLevel()); + if (ImGui::Combo("Minimum Log Level", &logLevel, "All\0Trace\0Debug\0Info\0Notice\0Warn\0Error\0Fatal\0\0")) + { + logLevel = AZStd::clamp(logLevel, static_cast(AZ::LogLevel::Trace), static_cast(AZ::LogLevel::Fatal)); + AZ::Interface::Get()->SetLogLevel(static_cast(logLevel)); + } + + // Show a checkbox that controls whether to auto scroll when new debug log entires are added. + ImGui::Checkbox("Auto Scroll New Log Entries", &m_autoScroll); + + ImGui::EndPopup(); + } + + // Show a button to open the options menu. + ImGui::SameLine(); + if (ImGui::Button("Options")) + { + ImGui::OpenPopup("Options"); + } + + ImGui::End(); + } +} diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/DebugConsole.h b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/DebugConsole.h new file mode 100644 index 0000000000..077c231c55 --- /dev/null +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/DebugConsole.h @@ -0,0 +1,126 @@ +/* +* All or portions of this file Copyright(c) Amazon.com, Inc.or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution(the "License").All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file.Do not +* remove or modify any license notices.This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include + +#include +#include +#include + +#include +#include + +struct ImGuiInputTextCallbackData; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +namespace AZ +{ + //////////////////////////////////////////////////////////////////////////////////////////////// + //! The default maximum number of entries to display in the debug log. + constexpr int DefaultMaxEntriesToDisplay = 1028; + + //////////////////////////////////////////////////////////////////////////////////////////////// + //! The default maximum number of input history items to retain. + constexpr int DefaultMaxInputHistorySize = 512; + + //////////////////////////////////////////////////////////////////////////////////////////////// + //! A debug console used to enter debug console commands and display debug log messages. + //! + //! Toggled using any of the following: + //! - The '~' key on a keyboard. + //! - Both the 'L3+R3' buttons on a gamepad. + //! - The fourth finger press on a touch screen. + class DebugConsole : public AZ::TickBus::Handler + , public AzFramework::InputChannelEventListener + { + public: + //////////////////////////////////////////////////////////////////////////////////////////// + // Allocator + AZ_CLASS_ALLOCATOR(DebugConsole, AZ::SystemAllocator, 0); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Constructor + //! \param[in] maxEntriesToDisplay The maximum number of entries to display in the debug log. + //! \param[in] maxInputHistorySize The maximum number of text input history items to retain. + DebugConsole(int maxEntriesToDisplay = DefaultMaxEntriesToDisplay, + int maxInputHistorySize = DefaultMaxInputHistorySize); + + //////////////////////////////////////////////////////////////////////////////////////////// + // Disable copying + AZ_DISABLE_COPY_MOVE(DebugConsole); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Destructor + ~DebugConsole() override; + + //////////////////////////////////////////////////////////////////////////////////////////// + // AZ::TickBus::Handler + int GetTickOrder() override; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! \ref AZ::TickEvents::OnTick + void OnTick(float deltaTime, AZ::ScriptTimePoint scriptTimePoint) override; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! \ref AzFramework::InputChannelEventListener::OnInputChannelEventFiltered + bool OnInputChannelEventFiltered(const AzFramework::InputChannel& inputChannel) override; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Add a string to the debug log display. + //! \param[in] debugLogString The string to add to the debug log display. + //! \param[in] color The color in which to display the above string. + void AddDebugLog(const AZStd::string& debugLogString, const AZ::Color& color = AZ::Colors::White); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Clears the debug log display. + void ClearDebugLog(); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Attempt to auto complete a command using this input text callback data. + //! \param[in] data The input text callback data used try and auto complete. + void AutoCompleteCommand(ImGuiInputTextCallbackData* data); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Attempt to browse the input history using this input text callback data. + //! \param[in] data The input text callback data used to try and browse history. + void BrowseInputHistory(ImGuiInputTextCallbackData* data); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Called when the user enters text input. + //! \param[in] inputText The text input that was entered. + void OnTextInputEntered(const char* inputText); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Draw the debug console. + void DrawDebugConsole(); + + private: + //////////////////////////////////////////////////////////////////////////////////////////// + // Variables + AZStd::deque> m_debugLogEntires; //!< All debug logs. + AZStd::deque m_textInputHistory; //!< History of input that has been entered. + AZ::ILogger::LogEvent::Handler m_logHandler; //!< Handler that receives log events to display. + AzFramework::InputContext m_inputContext; //!< Input context used to open/close the console. + char m_inputBuffer[1028] = {}; //!< The character buffer used to accept text input. + int m_currentHistoryIndex = -1; //!< The current index into the input history when browsing. + int m_maxEntriesToDisplay = DefaultMaxEntriesToDisplay; //!< The maximum entries to display. + int m_maxInputHistorySize = DefaultMaxInputHistorySize; //!< The maximum input history size. + int m_logLevelToSet = 0; //!< The minimum log level to set (see AZ::LogLevel). + bool m_isShowing = false; //!< Is the debug console currently being displayed? + bool m_autoScroll = true; //!< Should we auto-scroll as new entries are added? + bool m_forceScroll = false; //!< Do we need to force scroll after input entered? + }; +} // namespace AZ diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h index a9084040cc..44df8fd410 100644 --- a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h @@ -15,6 +15,7 @@ #include #include #include +#include namespace AZ { @@ -45,6 +46,8 @@ namespace AZ // OtherActiveImGuiRequestBus overrides ... void RenderImGuiBuffers(const ImDrawData& drawData) override; + private: + DebugConsole m_debugConsole; }; } // namespace LYIntegration } // namespace AZ diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/imguiatom_files.cmake b/Gems/AtomLyIntegration/ImguiAtom/Code/imguiatom_files.cmake index db0eec5519..93645aa8ed 100644 --- a/Gems/AtomLyIntegration/ImguiAtom/Code/imguiatom_files.cmake +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/imguiatom_files.cmake @@ -10,6 +10,8 @@ # set(FILES + Source/DebugConsole.cpp + Source/DebugConsole.h Source/ImguiAtomSystemComponent.cpp Source/ImguiAtomSystemComponent.h ) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env index ea6128bfb3..78ac0099ba 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env @@ -17,12 +17,12 @@ export DYNACONF_LY_PROJECT_PATH=`pwd` export DYNACONF_LY_DEV=${LY_PROJECT_PATH}\..\..\..\.. # LY build folder -export DYNACONF_LY_BUILD_PATH=${LY_DEV}\windows_vs2019 +export DYNACONF_LY_BUILD_PATH=${LY_DEV}\build export DYNACONF_LY_BIN_PATH=${LY_BUILD_PATH}\bin\profile # default IDE and debug settings -export DYNACONF_DCCSI_GDEBUG=false -export DYNACONF_DCCSI_DEV_MODE=false +#export DYNACONF_DCCSI_GDEBUG=false +#export DYNACONF_DCCSI_DEV_MODE=false export DYNACONF_DCCSI_GDEBUGGER=WING export DYNACONF_DCCSI_LOGLEVEL=20 @@ -30,18 +30,21 @@ export DYNACONF_DCCSI_LOGLEVEL=20 export DYNACONF_DCCSIG_PATH=${LY_DEV}\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface # set up default python interpreter (Lumberyard) +# we may want to entirely remove these and rely on config.py to dynamically set up +# however VScode can be configured with a .env so might be valueable to keep export DYNACONF_DCCSI_PY_VERSION_MAJOR=3 export DYNACONF_DCCSI_PY_VERSION_MINOR=7 -export DYNACONF_DCCSI_PY_VERSION_RELEASE=5 +export DYNACONF_DCCSI_PY_VERSION_RELEASE=11 +# To Do: probably move the folder below into the /SDK folder? export DYNACONF_DCCSI_PYTHON_PATH=${DCCSIG_PATH}\3rdParty\Python # add access to a Lib location that matches the py version (3.7.x) -# switch this for other python version like maya (2.7.x) +# switch this for other python version like (2.7.x) for Maya export DYNACONF_DCCSI_PYTHON_LIB_PATH=${DCCSI_PYTHON_PATH}\Lib\${DCCSI_PY_VERSION_MAJOR}.x\${DCCSI_PY_VERSION_MAJOR}.${DCCSI_PY_VERSION_MINOR}.x\site-packages # TO DO: figure out how to best deal with OS folder (i.e. 'windows') -export DYNACONF_DCCSI_PYTHON_INSTALL=${LY_DEV}\Tools\Python\${DCCSI_PY_VERSION_MAJOR}.${DCCSI_PY_VERSION_MINOR}.${DCCSI_PY_VERSION_RELEASE}\${OS_FOLDER} -export DYNACONF_DDCCSI_PY_BASE=${DCCSI_PYTHON_INSTALL}\python.exe +export DYNACONF_DCCSI_PYTHON_INSTALL=${LY_DEV}\python +export DYNACONF_DDCCSI_PY_BASE=${DCCSI_PYTHON_INSTALL}\python.cmd # set up Qt / PySide2 # TO DO: These should NOT be set in the global env as they will cause conflicts diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.gitignore index d6a9906ed2..9ad4717873 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.gitignore +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.gitignore @@ -1,4 +1,11 @@ - +.mayaSwatches +.temp +__downloads__ +__pycache__ +*.pyc +*.pyo +workspace.xml # Ignore dynaconf secret files .secrets.* -settings.local.json \ No newline at end of file +settings.local.json +azpy/_sample_package_/* \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/2.x/2.7.x/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/2.x/2.7.x/.gitignore new file mode 100644 index 0000000000..0f7e383448 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/2.x/2.7.x/.gitignore @@ -0,0 +1,5 @@ +# exclude everything +site-packages/* + +# exception to the rule +!site-packages/stub \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/2.x/2.7.x/site-packages/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/2.x/2.7.x/site-packages/stub new file mode 100644 index 0000000000..c4330ff2d6 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/2.x/2.7.x/site-packages/stub @@ -0,0 +1,2 @@ +this is just a stub +this is a silo directory for sandboxing the addition of python packages \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/3.x/3.7.x/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/3.x/3.7.x/.gitignore new file mode 100644 index 0000000000..0f7e383448 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/3.x/3.7.x/.gitignore @@ -0,0 +1,5 @@ +# exclude everything +site-packages/* + +# exception to the rule +!site-packages/stub \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/3.x/3.7.x/site-packages/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/3.x/3.7.x/site-packages/stub new file mode 100644 index 0000000000..c4330ff2d6 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/3rdParty/Python/Lib/3.x/3.7.x/site-packages/stub @@ -0,0 +1,2 @@ +this is just a stub +this is a silo directory for sandboxing the addition of python packages \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.jpg b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.jpg new file mode 100644 index 0000000000..6a46317a7f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d101843b6780578d326f94b8dac06ca4d6597703d5a0fd08e6dc18561a16f749 +size 392292 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.resources/XXXXXX-fabric.tif b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.resources/XXXXXX-fabric.tif new file mode 100644 index 0000000000..6a48e67c0c --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.resources/XXXXXX-fabric.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f27032e14c278ee82fead2f4ac2726df6321a370b1a6eb6135540ecda565239c +size 3146071 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.sbs b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.sbs new file mode 100644 index 0000000000..702130275f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.sbs @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20fd966e4e19f3f96479a396c0747ec2bd8e6eebb0296ea4303e06252bbd7160 +size 10512 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.sbsar b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.sbsar new file mode 100644 index 0000000000..60dcc82335 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Fabric/fabric.sbsar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf0141cf55ff5b468580a63beb1d723d15e08c883a48ffa7e650c54156ab340e +size 4619089 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Rust/rust.resources/XXXXXX-006METAL.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Rust/rust.resources/XXXXXX-006METAL.png new file mode 100644 index 0000000000..581753352d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Rust/rust.resources/XXXXXX-006METAL.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98e0b98644fbe047dd714686da5357a6a62afe413083ad79e049a5ff2d3d475c +size 455961 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Rust/rust.sbs b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Rust/rust.sbs new file mode 100644 index 0000000000..f4e41d5eb3 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/Rust/rust.sbs @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6207ce940853cae79d725d725d7b05303e09cd0b940a4d77f1e280742aed0f00 +size 13161 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Materials/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Textures/red.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Textures/red.png new file mode 100644 index 0000000000..46ac9a68e6 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/Textures/red.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f127dfe53824a7f15a91d1103805172e70f521ce286b6db05bee6c5026c5bd4 +size 203 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Assets/TestData/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt index 20a680bce9..041414ebc1 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt @@ -10,3 +10,4 @@ # add_subdirectory(Code) +update_pip_requirements(${CMAKE_CURRENT_LIST_DIR}/requirements.txt DccScriptingInterface) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/CMakeLists.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/CMakeLists.txt index 75b776fe17..76cbf6546d 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/CMakeLists.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/CMakeLists.txt @@ -38,25 +38,3 @@ ly_add_target( PRIVATE Gem::DccScriptingInterface.Static ) - -################################################################################ -# Tests -################################################################################ -if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) - ly_add_target( - NAME DccScriptingInterface.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} - NAMESPACE Gem - FILES_CMAKE - dccscriptinginterface_tests_files.cmake - INCLUDE_DIRECTORIES - PRIVATE - Tests - BUILD_DEPENDENCIES - PRIVATE - AZ::AzTest - Gem::DccScriptingInterface.Static - ) - ly_add_googletest( - NAME Gem::DccScriptingInterface.Tests - ) -endif() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/Tests/DCCScriptingInterfaceTest.cpp b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/Tests/DCCScriptingInterfaceTest.cpp deleted file mode 100644 index b8bdf718e8..0000000000 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/Tests/DCCScriptingInterfaceTest.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ - -#include - -class DCCScriptingInterfaceTest - : public ::testing::Test -{ -protected: - void SetUp() override - { - - } - - void TearDown() override - { - - } -}; - -TEST_F(DCCScriptingInterfaceTest, SanityTest) -{ - ASSERT_TRUE(true); -} - -AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV); diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/dccscriptinginterface_tests_files.cmake b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/dccscriptinginterface_tests_files.cmake deleted file mode 100644 index 832d750ea8..0000000000 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Code/dccscriptinginterface_tests_files.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(FILES - Tests/DCCScriptingInterfaceTest.cpp -) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/.gitignore new file mode 100644 index 0000000000..8655d47401 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/.gitignore @@ -0,0 +1 @@ +Env_Dev.bat \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env.bat deleted file mode 100644 index 6dec5182ef..0000000000 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env.bat +++ /dev/null @@ -1,305 +0,0 @@ -@echo off - -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM - -:: Sets up environment for Lumberyard DCC tools and code access - -:: Skip initialization if already completed -IF "%DCCSI_ENV_INIT%"=="1" GOTO :END_OF_FILE - -echo. -echo _____________________________________________________________________ -echo. -echo ~ Setting up Default LY DCC Scripting Interface Environment ... -echo _____________________________________________________________________ -echo. - -:: Store current dir -%~d0 -cd %~dp0 -PUSHD %~dp0 - -IF "%DCCSI_LAUNCHERS_PATH%"=="" (set DCCSI_LAUNCHERS_PATH=%~dp0) -echo DCCSI_LAUNCHERS_PATH = %DCCSI_LAUNCHERS_PATH% - -:: add to the PATH -SET PATH=%DCCSI_LAUNCHERS_PATH%;%PATH% - -:: This maps up to the \Dev folder -IF "%DEV_REL_PATH%"=="" (set DEV_REL_PATH=..\..\..\..) -echo DEV_REL_PATH = %DEV_REL_PATH% - -IF "%LY_PROJECT%"=="" ( - ECHO !!LY_PROJECT NOT defined!! - for %%a in (%CD%..\..\..) do set LY_PROJECT=%%~na - ) -echo LY_PROJECT = %LY_PROJECT% - -:: set up the default project path (dccsi) -CD /D ..\..\ -IF "%LY_PROJECT_PATH%"=="" (set LY_PROJECT_PATH=%CD%) -echo LY_PROJECT_PATH = %LY_PROJECT_PATH% - -IF "%ABS_PATH%"=="" (set ABS_PATH=%CD%) -echo ABS_PATH = %ABS_PATH% - -:: Save current directory and change to target directory -pushd %ABS_PATH% - -:: Change to root Lumberyard dev dir -CD /d %LY_PROJECT_PATH%\%DEV_REL_PATH% -set LY_DEV=%CD% -echo LY_DEV = %LY_DEV% -:: Restore original directory -popd - -:: dcc scripting interface gem path -set DCCSIG_PATH=%LY_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface -echo DCCSIG_PATH = %DCCSIG_PATH% - -:: Change to root dir -CD /D %DCCSIG_PATH% - -:: Constant Vars (Global) -:: global debug (propogates) -IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false) -echo DCCSI_GDEBUG = %DCCSI_GDEBUG% -:: initiates debugger connection -IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false) -echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% -:: sets debugger, options: WING, PYCHARM -IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) -echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% -:: Default level logger will handle -:: CRITICAL:50 -:: ERROR:40 -:: WARNING:30 -:: INFO:20 -:: DEBUG:10 -:: NOTSET:0 -IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=20) -echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% - -set MAYA_PROJECT=%LY_PROJECT_PATH% -echo MAYA_PROJECT = %MAYA_PROJECT% - -:: add to the PATH -SET PATH=%DCCSIG_PATH%;%PATH% - -:: dcc python api path -set DCCSI_AZPY_PATH=%DCCSIG_PATH%\azpy -echo DCCSI_AZPY_PATH = %DCCSI_AZPY_PATH% - -:: per-dcc sdk patj -set DCCSI_SDK_PATH=%DCCSIG_PATH%\SDK -echo DCCSI_SDK_PATH = %DCCSI_SDK_PATH% - -set DCCSI_LOG_PATH=%DCCSIG_PATH%\.temp\logs -echo DCCSI_LOG_PATH = %DCCSI_LOG_PATH% -echo. - -:: PY version Major -IF "%DCCSI_PY_VERSION_MAJOR%"=="" (set DCCSI_PY_VERSION_MAJOR=3) -echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% - -:: PY version Major -IF "%DCCSI_PY_VERSION_MINOR%"=="" (set DCCSI_PY_VERSION_MINOR=7) -echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% - -IF "%DCCSI_PY_VERSION_RELEASE%"=="" (set DCCSI_PY_VERSION_RELEASE=5) -echo DCCSI_PY_VERSION_RELEASE = %DCCSI_PY_VERSION_RELEASE% - -:: shared location for 64bit python 3.7 DEV location -set DCCSI_PYTHON_PATH=%DCCSIG_PATH%\3rdParty\Python -echo DCCSI_PYTHON_PATH = %DCCSI_PYTHON_PATH% - -:: add access to a Lib location that matches the py version (3.7.x) -:: switch this for other python version like maya (2.7.x) -IF "%DCCSI_PYTHON_LIB_PATH%"=="" (set DCCSI_PYTHON_LIB_PATH=%DCCSI_PYTHON_PATH%\Lib\%DCCSI_PY_VERSION_MAJOR%.x\%DCCSI_PY_VERSION_MAJOR%.%DCCSI_PY_VERSION_MINOR%.x\site-packages) -echo DCCSI_PYTHON_LIB_PATH = %DCCSI_PYTHON_LIB_PATH% - -:: add to the PATH -SET PATH=%DCCSI_PYTHON_LIB_PATH%;%PATH% - -set DCCSI_PYTHON_ROOT=%LY_DEV%\Tools\Python\%DCCSI_PY_VERSION_MAJOR%.%DCCSI_PY_VERSION_MINOR%.%DCCSI_PY_VERSION_RELEASE% -echo DCCSI_PYTHON_ROOT = %DCCSI_PYTHON_ROOT% - -:: shared location for Lumberyard 64bit python 3.x location -set DCCSI_PYTHON_INSTALL=%DCCSI_PYTHON_ROOT%\windows -echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% - -:: add to the PATH -SET PATH=%DCCSI_PYTHON_INSTALL%;%PATH% - -set LY_PY_INTERNAL=%DCCSI_PYTHON_ROOT%\internal\site-packages\windows -echo LY_PY_INTERNAL = %LY_PY_INTERNAL% - -:: add to the PATH -SET PATH=%LY_PY_INTERNAL%;%PATH% - -:: shared location for 64bit python 3.7 BASE location -set DCCSI_PY_BASE=%DCCSI_PYTHON_INSTALL%\python.exe -echo DCCSI_PY_BASE = %DCCSI_PY_BASE% - -:: shared location for 64bit python 3.7 BASE location -set DCCSI_PY_DCCSI=%DCCSI_LAUNCHERS_PATH%\Launch_pyBASE.bat -echo DCCSI_PY_DCCSI = %DCCSI_PY_DCCSI% - -:: maya sdk path -set DCCSI_SDK_MAYA_PATH=%DCCSI_SDK_PATH%\Maya -echo DCCSI_SDK_MAYA_PATH = %DCCSI_SDK_MAYA_PATH% - -set MAYA_MODULE_PATH=%DCCSI_SDK_MAYA_PATH%;%MAYA_MODULE_PATH% -echo MAYA_MODULE_PATH = %MAYA_MODULE_PATH% - -:: Default Maya Version -IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=2020) -echo DCCSI_MAYA_VERSION = %DCCSI_MAYA_VERSION% - -:: Maya File Paths, etc -:: https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2015/ENU/Maya/files/Environment-Variables-File-path-variables-htm.html -set MAYA_LOCATION=%ProgramFiles%\Autodesk\Maya%DCCSI_MAYA_VERSION% -echo MAYA_LOCATION = %MAYA_LOCATION% - -set MAYA_BIN_PATH=%MAYA_LOCATION%\bin\ -echo MAYA_BIN_PATH = %MAYA_BIN_PATH% - -:: these improve the boot up time -IF "%MAYA_DISABLE_CIP%"=="" (set MAYA_DISABLE_CIP=1) -echo MAYA_DISABLE_CIP = %MAYA_DISABLE_CIP% - -IF "%MAYA_DISABLE_CER%"=="" (set MAYA_DISABLE_CER=1) -echo MAYA_DISABLE_CER = %MAYA_DISABLE_CER% - -IF "%MAYA_DISABLE_CLIC_IPM%"=="" (set MAYA_DISABLE_CLIC_IPM=1) -echo MAYA_DISABLE_CLIC_IPM = %MAYA_DISABLE_CLIC_IPM% - -IF "%DCCSI_MAYA_SET_CALLBACKS%"=="" (set DCCSI_MAYA_SET_CALLBACKS=false) -echo DCCSI_MAYA_SET_CALLBACKS = %DCCSI_MAYA_SET_CALLBACKS% - -:: setting this to 1 should further improve boot time (I think) -::IF "%MAYA_NO_CONSOLE_WINDOW%"=="" (set MAYA_NO_CONSOLE_WINDOW=0) -::echo MAYA_NO_CONSOLE_WINDOW = %MAYA_NO_CONSOLE_WINDOW% - -:: shared location for 64bit DCCSI_PY_MAYA python 2.7 DEV location -set DCCSI_PY_MAYA=%MAYA_LOCATION%\bin\mayapy.exe -echo DCCSI_PY_MAYA = %DCCSI_PY_MAYA% - -:: azpy Maya plugins access -:: our path -set DCCSI_MAYA_PLUG_IN_PATH=%DCCSI_SDK_MAYA_PATH%\plugins -:: also attached to maya's built-it env var -set MAYA_PLUG_IN_PATH=%DCCSI_MAYA_PLUG_IN_PATH%;MAYA_PLUG_IN_PATH -echo DCCSI_MAYA_PLUG_IN_PATH = %DCCSI_MAYA_PLUG_IN_PATH% - -:: azpy Maya shelves -:: our path -set DCCSI_MAYA_SHELF_PATH=%DCCSI_SDK_MAYA_PATH%\Prefs\Shelves -set MAYA_SHELF_PATH=%DCCSI_MAYA_SHELF_PATH% -echo DCCSI_MAYA_SHELF_PATH = %DCCSI_MAYA_SHELF_PATH% - -:: azpy Maya icons -:: our path -set DCCSI_MAYA_XBMLANGPATH=%DCCSI_SDK_MAYA_PATH%\Prefs\icons -:: also attached to maya's built-it env var -set XBMLANGPATH=%DCCSI_MAYA_XBMLANGPATH%;%XBMLANGPATH% -echo DCCSI_MAYA_XBMLANGPATH = %DCCSI_MAYA_XBMLANGPATH% - -:: azpy root Maya boostrap, userSetup.py access -:: our path -set DCCSI_MAYA_SCRIPT_PATH=%DCCSI_SDK_MAYA_PATH%\Scripts -:: also attached to maya's built-it env var -set MAYA_SCRIPT_PATH=%DCCSI_MAYA_SCRIPT_PATH%;%MAYA_SCRIPT_PATH% -echo DCCSI_MAYA_SCRIPT_PATH = %DCCSI_MAYA_SCRIPT_PATH% - -:: azpy Maya Mel scripts -:: our path -set DCCSI_MAYA_SCRIPT_MEL_PATH=%DCCSI_SDK_MAYA_PATH%\Scripts\Mel -:: also attached to maya's built-it env var -set MAYA_SCRIPT_PATH=%DCCSI_MAYA_SCRIPT_MEL_PATH%;%MAYA_SCRIPT_PATH% -echo DCCSI_MAYA_SCRIPT_MEL_PATH = %DCCSI_MAYA_SCRIPT_MEL_PATH% - -:: azpy Maya Py scripts -:: our path -set DCCSI_MAYA_SCRIPT_PY_PATH=%DCCSI_SDK_MAYA_PATH%\Scripts\Python -:: also attached to maya's built-it env var -set MAYA_SCRIPT_PATH=%DCCSI_MAYA_SCRIPT_PY_PATH%;%MAYA_SCRIPT_PATH% -echo DCCSI_MAYA_SCRIPT_PY_PATH = %DCCSI_MAYA_SCRIPT_PY_PATH% - -:: azpy add all python related paths to PYTHONPATH -::set PYTHONPATH=%DCCSIG_PATH%;%DCCSI_AZPY_PATH%;%DCCSI_SDK_MAYA_PATH%;%DCCSI_MAYA_SCRIPT_PATH%;%DCCSI_MAYA_SCRIPT_PY_PATH%;%PYTHONPATH% -set PYTHONPATH=%LY_PY_INTERNAL%;%DCCSIG_PATH%;%DCCSI_PYTHON_LIB_PATH%;%DCCSI_MAYA_SCRIPT_PATH%;%DCCSI_MAYA_SCRIPT_PY_PATH%;%PYTHONPATH% -echo PYTHONPATH = %PYTHONPATH% - -:: build path -IF "%TAG_LY_BUILD_PATH%"=="" (set TAG_LY_BUILD_PATH=windows_vs2019) -echo TAG_LY_BUILD_PATH = %TAG_LY_BUILD_PATH% - -IF "%LY_BUILD_PATH%"=="" (set LY_BUILD_PATH=%LY_DEV%\%TAG_LY_BUILD_PATH%) -echo LY_BUILD_PATH = %LY_BUILD_PATH% - -:: Substance Designer -:: maya sdk path -set DCCSI_SUBSTANCE_PATH=%DCCSI_SDK_PATH%\Substance -echo DCCSI_SUBSTANCE_PATH = %DCCSI_SUBSTANCE_PATH% -:: https://docs.substance3d.com/sddoc/project-preferences-107118596.html#ProjectPreferences-ConfigurationFile -:: Path to .exe, "C:\Program Files\Allegorithmic\Substance Designer\Substance Designer.exe" -set SUBSTANCE_PATH="%ProgramFiles%\Allegorithmic\Substance Designer" -echo SUBSTANCE_PATH = %SUBSTANCE_PATH% - -:: default config -set SUBSTANCE_CFG_PATH=%LY_PROJECT_PATH%\DCCsi_default.sbscfg -echo SUBSTANCE_CFG_PATH = %SUBSTANCE_CFG_PATH% - -:: WingIDE version Major -IF "%DCCSI_WING_VERSION_MAJOR%"=="" (set DCCSI_WING_VERSION_MAJOR=7) -echo DCCSI_WING_VERSION_MAJOR = %DCCSI_WING_VERSION_MAJOR% - -:: WingIDE version Major -IF "%DCCSI_WING_VERSION_MINOR%"=="" (set DCCSI_WING_VERSION_MINOR=1) -echo DCCSI_WING_VERSION_MINOR = %DCCSI_WING_VERSION_MINOR% - -:: put project env variables/paths here -set WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% -echo WINGHOME = %WINGHOME% - -:: add to the PATH -SET PATH=%WINGHOME%;%PATH% - -:: ide and debugger plugs -set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% - -:: add prefered python to the PATH -SET PATH=%DCCSIG_PATH%;%DCCSI_AZPY_PATH%;%DCCSI_PY_DEFAULT%;%PATH% -echo PATH = %PATH% - -:: Change to root dir -CD /D %ABS_PATH% - -:: if the user has set up a custom env call it -IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat - -echo. -echo _____________________________________________________________________ -echo. -echo ~ Default DCCsi Environment ... -echo _____________________________________________________________________ -echo. - -:: Set flag so we don't initialize dccsi environment twice -SET DCCSI_ENV_INIT=1 -GOTO END_OF_FILE - -:: Return to starting directory -POPD - -:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Core.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Core.bat new file mode 100644 index 0000000000..ed49075109 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Core.bat @@ -0,0 +1,131 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Sets up environment for Lumberyard DCC tools and code access + +:: Set up window +TITLE O3DE DCC Scripting Interface Core +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Skip initialization if already completed +IF "%DCCSI_ENV_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCC Scripting Interface Environment ... +echo _____________________________________________________________________ +echo. + +IF "%DCCSI_LAUNCHERS_PATH%"=="" (set DCCSI_LAUNCHERS_PATH=%~dp0) +echo DCCSI_LAUNCHERS_PATH = %DCCSI_LAUNCHERS_PATH% + +:: add to the PATH +SET PATH=%DCCSI_LAUNCHERS_PATH%;%PATH% + +:: Constant Vars (Global) +:: global debug flag (propogates) +:: The intent here is to set and globally enter a debug mode +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates earliest debugger connection +:: we support attaching to WingIDE... PyCharm and VScode in the future +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: Override this to control the setting +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=20) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: This maps up to the \Dev folder +IF "%DEV_REL_PATH%"=="" (set DEV_REL_PATH=..\..\..\..) +echo DEV_REL_PATH = %DEV_REL_PATH% + +:: You can define the project name +:: if not defined we just use the DCCsi path as standin +IF "%LY_PROJECT%"=="" ( + for %%a in (%CD%..\..\..) do set LY_PROJECT=%%~na + ) +echo LY_PROJECT = %LY_PROJECT% + +:: set up the default project path (dccsi) +:: if not set we lso use the DCCsi path as standin +CD /D ..\..\ +IF "%LY_PROJECT_PATH%"=="" (set LY_PROJECT_PATH=%CD%) +echo LY_PROJECT_PATH = %LY_PROJECT_PATH% + +IF "%ABS_PATH%"=="" (set ABS_PATH=%CD%) +echo ABS_PATH = %ABS_PATH% + +:: Save current directory and change to target directory +pushd %ABS_PATH% + +:: Change to root Lumberyard dev dir +CD /d %LY_PROJECT_PATH%\%DEV_REL_PATH% +set LY_DEV=%CD% +echo LY_DEV = %LY_DEV% +:: Restore original directory +popd + +:: dcc scripting interface gem path +:: currently know relative path to this gem +set DCCSIG_PATH=%LY_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface +echo DCCSIG_PATH = %DCCSIG_PATH% + +:: Change to DCCsi root dir +CD /D %DCCSIG_PATH% + +:: per-dcc sdk path +set DCCSI_SDK_PATH=%DCCSIG_PATH%\SDK +echo DCCSI_SDK_PATH = %DCCSI_SDK_PATH% + +:: temp log location specific to this gem +set DCCSI_LOG_PATH=%DCCSIG_PATH%\.temp\logs +echo DCCSI_LOG_PATH = %DCCSI_LOG_PATH% + +:: O3DE build path +IF "%TAG_LY_BUILD_PATH%"=="" (set TAG_LY_BUILD_PATH=build) +echo TAG_LY_BUILD_PATH = %TAG_LY_BUILD_PATH% + +IF "%LY_BUILD_PATH%"=="" (set LY_BUILD_PATH=%LY_DEV%\%TAG_LY_BUILD_PATH%\bin\profile) +echo LY_BUILD_PATH = %LY_BUILD_PATH% + +:: add to the PATH +SET PATH=%LY_BUILD_PATH%;%DCCSIG_PATH%;%DCCSI_AZPY_PATH%;%PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat new file mode 100644 index 0000000000..cad2d2d4f3 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat @@ -0,0 +1,152 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Sets up extended DCCsi environment for Maya + +:: Set up window +TITLE O3DE DCCsi Autodesk Maya Environment +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Skip initialization if already completed +IF "%DCCSI_ENV_MAYA_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +IF "%DCCSI_PY_VERSION_MAJOR%"=="" (set DCCSI_PY_VERSION_MAJOR=2) +IF "%DCCSI_PY_VERSION_MINOR%"=="" (set DCCSI_PY_VERSION_MINOR=7) +IF "%DCCSI_PY_VERSION_RELEASE%"=="" (set DCCSI_PY_VERSION_RELEASE=11) + +:: Default Maya Version +IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=2020) + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCCsi Autodesk Maya Environment ... +echo _____________________________________________________________________ +echo. + +echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% +echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% +echo DCCSI_PY_VERSION_RELEASE = %DCCSI_PY_VERSION_RELEASE% +echo DCCSI_MAYA_VERSION = %DCCSI_MAYA_VERSION% + +:::: Set Maya native project acess to this project +IF "%MAYA_PROJECT%"=="" (set MAYA_PROJECT=%LY_PROJECT%) +echo MAYA_PROJECT = %MAYA_PROJECT% + +:: maya sdk path +set DCCSI_SDK_MAYA_PATH=%DCCSI_SDK_PATH%\Maya +echo DCCSI_SDK_MAYA_PATH = %DCCSI_SDK_MAYA_PATH% + +set MAYA_MODULE_PATH=%DCCSI_SDK_MAYA_PATH%;%MAYA_MODULE_PATH% +echo MAYA_MODULE_PATH = %MAYA_MODULE_PATH% + +:: Maya File Paths, etc +:: https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2015/ENU/Maya/files/Environment-Variables-File-path-variables-htm.html +:::: Set Maya native project acess to this project +IF "%MAYA_LOCATION%"=="" (set MAYA_LOCATION=%ProgramFiles%\Autodesk\Maya%DCCSI_MAYA_VERSION%) +echo MAYA_LOCATION = %MAYA_LOCATION% + +IF "%MAYA_BIN_PATH%"=="" (set MAYA_BIN_PATH=%MAYA_LOCATION%\bin) +echo MAYA_BIN_PATH = %MAYA_BIN_PATH% + +:: these improve the boot up time (Ha ... not really much) +IF "%MAYA_DISABLE_CIP%"=="" (set MAYA_DISABLE_CIP=1) +echo MAYA_DISABLE_CIP = %MAYA_DISABLE_CIP% + +IF "%MAYA_DISABLE_CER%"=="" (set MAYA_DISABLE_CER=1) +echo MAYA_DISABLE_CER = %MAYA_DISABLE_CER% + +IF "%MAYA_DISABLE_CLIC_IPM%"=="" (set MAYA_DISABLE_CLIC_IPM=1) +echo MAYA_DISABLE_CLIC_IPM = %MAYA_DISABLE_CLIC_IPM% + +IF "%DCCSI_MAYA_SET_CALLBACKS%"=="" (set DCCSI_MAYA_SET_CALLBACKS=false) +echo DCCSI_MAYA_SET_CALLBACKS = %DCCSI_MAYA_SET_CALLBACKS% + +:: setting this to 1 should further improve boot time (I think) +::IF "%MAYA_NO_CONSOLE_WINDOW%"=="" (set MAYA_NO_CONSOLE_WINDOW=0) +::echo MAYA_NO_CONSOLE_WINDOW = %MAYA_NO_CONSOLE_WINDOW% +:: But I like the console window for development and debugging early boot + +:: shared location for 64bit DCCSI_PY_MAYA python location (2.7) +set DCCSI_PY_MAYA=%MAYA_BIN_PATH%\mayapy.exe +echo DCCSI_PY_MAYA = %DCCSI_PY_MAYA% + +:: add to the PATH +SET PATH=%MAYA_BIN_PATH%;%PATH% + +:: Local DCCsi Maya plugins access (ours) +set DCCSI_MAYA_PLUG_IN_PATH=%DCCSI_SDK_MAYA_PATH%\plugins +:: also attached to maya's built-it env var +set MAYA_PLUG_IN_PATH=%DCCSI_MAYA_PLUG_IN_PATH%;MAYA_PLUG_IN_PATH +echo DCCSI_MAYA_PLUG_IN_PATH = %DCCSI_MAYA_PLUG_IN_PATH% + +:: Local DCCsi Maya shelves (ours) +set DCCSI_MAYA_SHELF_PATH=%DCCSI_SDK_MAYA_PATH%\Prefs\Shelves +set MAYA_SHELF_PATH=%DCCSI_MAYA_SHELF_PATH% +echo DCCSI_MAYA_SHELF_PATH = %DCCSI_MAYA_SHELF_PATH% + +:: Local DCCsi Maya icons path (ours) +set DCCSI_MAYA_XBMLANGPATH=%DCCSI_SDK_MAYA_PATH%\Prefs\icons +:: also attached to maya's built-it env var +set XBMLANGPATH=%DCCSI_MAYA_XBMLANGPATH%;%XBMLANGPATH% +echo DCCSI_MAYA_XBMLANGPATH = %DCCSI_MAYA_XBMLANGPATH% + +:: Local DCCsi Maya Mel scripts (ours) +set DCCSI_MAYA_SCRIPT_MEL_PATH=%DCCSI_SDK_MAYA_PATH%\Scripts\Mel +:: also attached to maya's built-it env var +set MAYA_SCRIPT_PATH=%DCCSI_MAYA_SCRIPT_MEL_PATH%;%MAYA_SCRIPT_PATH% +echo DCCSI_MAYA_SCRIPT_MEL_PATH = %DCCSI_MAYA_SCRIPT_MEL_PATH% + +:: Local DCCsi Maya Python scripts (ours) +set DCCSI_MAYA_SCRIPT_PY_PATH=%DCCSI_SDK_MAYA_PATH%\Scripts\Python +:: also attached to maya's built-it env var +set MAYA_SCRIPT_PATH=%DCCSI_MAYA_SCRIPT_PY_PATH%;%MAYA_SCRIPT_PATH% +echo DCCSI_MAYA_SCRIPT_PY_PATH = %DCCSI_MAYA_SCRIPT_PY_PATH% + +:: DCCsi Maya boostrap, userSetup.py access (ours) +set DCCSI_MAYA_SCRIPT_PATH=%DCCSI_SDK_MAYA_PATH%\Scripts +:: also attached to maya's built-it env var +set MAYA_SCRIPT_PATH=%DCCSI_MAYA_SCRIPT_PATH%;%MAYA_SCRIPT_PATH% +echo DCCSI_MAYA_SCRIPT_PATH = %DCCSI_MAYA_SCRIPT_PATH% + +echo MAYA_SCRIPT_PATH = %MAYA_SCRIPT_PATH% + +:: add all python related paths to PYTHONPATH for package imports +set PYTHONPATH=%DCCSI_MAYA_SCRIPT_PATH%;%DCCSI_MAYA_SCRIPT_PY_PATH%;%PYTHONPATH% +echo PYTHONPATH = %PYTHONPATH% + +:: DX11 Viewport +Set MAYA_VP2_DEVICE_OVERRIDE=VirtualDeviceDx11 +echo MAYA_VP2_DEVICE_OVERRIDE = %MAYA_VP2_DEVICE_OVERRIDE% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_MAYA_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat new file mode 100644 index 0000000000..a9eb47788e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat @@ -0,0 +1,67 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Sets up environment for Lumberyard DCC tools and code access + +:: Skip initialization if already completed +IF "%DCCSI_ENV_PYCHARM_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: version Major +SET PYCHARM_VERSION_YEAR=2020 +:: version Major +SET PYCHARM_VERSION_MAJOR=2 + +::"C:\Program Files\JetBrains\PyCharm 2019.1.3\bin" +::"C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.5\bin\pycharm64.exe" + +:: put project env variables/paths here +set PYCHARM_HOME=%PROGRAMFILES%\JetBrains\PyCharm %PYCHARM_VERSION_YEAR%.%PYCHARM_VERSION_MAJOR% + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_IDE%\python.exe + +SET PYCHARM_PROJ=%DCCSIG_PATH%\Solutions + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Setting up O3DE DCCsi Dev Env PyCharm %PYCHARM_VERSION_YEAR%.%PYCHARM_VERSION_MAJOR%.%PYCHARM_VERSION_MINOR% +echo _____________________________________________________________________ +echo. + +echo PYCHARM_VERSION_YEAR = %PYCHARM_VERSION_YEAR% +echo PYCHARM_VERSION_MAJOR = %PYCHARM_VERSION_MAJOR% +echo PYCHARM_HOME = %PYCHARM_HOME% +echo PYCHARM_PROJ = %PYCHARM_PROJ% + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_PYCHARM_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat new file mode 100644 index 0000000000..b1d202c55a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat @@ -0,0 +1,95 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Sets up extended environment for O3DE and DCCsi python + +:: Skip initialization if already completed +IF "%DCCSI_ENV_PY_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +CALL %~dp0\Env_Core.bat + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCCsi Python Environment ... +echo _____________________________________________________________________ +echo. + +:: Python Version +:: Ideally these are set to match the O3DE python distribution +:: \python\runtime +IF "%DCCSI_PY_VERSION_MAJOR%"=="" (set DCCSI_PY_VERSION_MAJOR=3) +echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% + +:: PY version Major +IF "%DCCSI_PY_VERSION_MINOR%"=="" (set DCCSI_PY_VERSION_MINOR=7) +echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% + +IF "%DCCSI_PY_VERSION_RELEASE%"=="" (set DCCSI_PY_VERSION_RELEASE=10) +echo DCCSI_PY_VERSION_RELEASE = %DCCSI_PY_VERSION_RELEASE% + +:: shared location for 64bit python 3.7 DEV location +:: this defines a DCCsi sandbox for lib site-packages by version +:: \Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\3rdParty\Python\Lib +set DCCSI_PYTHON_PATH=%DCCSIG_PATH%\3rdParty\Python +echo DCCSI_PYTHON_PATH = %DCCSI_PYTHON_PATH% + +:: add access to a Lib location that matches the py version (example: 3.7.x) +:: switch this for other python versions like maya (2.7.x) +IF "%DCCSI_PYTHON_LIB_PATH%"=="" (set DCCSI_PYTHON_LIB_PATH=%DCCSI_PYTHON_PATH%\Lib\%DCCSI_PY_VERSION_MAJOR%.x\%DCCSI_PY_VERSION_MAJOR%.%DCCSI_PY_VERSION_MINOR%.x\site-packages) +echo DCCSI_PYTHON_LIB_PATH = %DCCSI_PYTHON_LIB_PATH% + +:: add to the PATH +SET PATH=%DCCSI_PYTHON_LIB_PATH%;%PATH% + +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python +echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% + +:: location for O3DE python 3.7 location +set DCCSI_PY_BASE=%DCCSI_PYTHON_INSTALL%\python.cmd +echo DCCSI_PY_BASE = %DCCSI_PY_BASE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +set DCCSI_PY_IDE_PACKAGES=%DCCSI_PY_IDE%\Lib\site-packages +echo DCCSI_PY_IDE_PACKAGES = %DCCSI_PY_IDE_PACKAGES% + +:: add to the PATH +SET PATH=%DCCSI_PYTHON_INSTALL%;%DCCSI_PY_IDE%;%DCCSI_PY_IDE_PACKAGES%;%PATH% + +:: add all python related paths to PYTHONPATH for package imports +set PYTHONPATH=%DCCSIG_PATH%;%DCCSI_PYTHON_LIB_PATH%;%LY_BUILD_PATH%;%PYTHONPATH% +echo PYTHONPATH = %PYTHONPATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_PY_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Qt.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Qt.bat new file mode 100644 index 0000000000..140c5d3092 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Qt.bat @@ -0,0 +1,67 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Skip initialization of QT if already completed +IF "%DCCSI_ENV_QT_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCCsi Qt/PySide2 Environment ... +echo _____________________________________________________________________ +echo. + +:: These need to be ADDED to any env or launcher that needs Qt/PySide2 access +:: This bootstraps O3DE Qt binaraies and PySide2 packages (which likely won't work in other versions of python) +:: If you set these in the env.bat it may cause some Qt apps like WingIDE from starting correctly (Wing is a Qt app) +:: Those apps provide their own Qt bins and Pyside packages (Wing, Substance, Maya, etc.) +:: set up Qt/Pyside paths + +:: set up PySide2/Shiboken +set QTFORPYTHON_PATH=%LY_DEV%\Gems\QtForPython\3rdParty\pyside2\windows\release +echo QTFORPYTHON_PATH = %QTFORPYTHON_PATH% + +:: add to the PATH +SET PATH=%QTFORPYTHON_PATH%;%PATH% +SET PYTHONPATH=%QTFORPYTHON_PATH%;%PYTHONPATH% + +set QT_PLUGIN_PATH=%LY_BUILD_PATH%\bin\profile\EditorPlugins +echo QT_PLUGIN_PATH = %QT_PLUGIN_PATH% + +:: add to the PATH +SET PATH=%QT_PLUGIN_PATH%;%PATH% +SET PYTHONPATH=%QT_PLUGIN_PATH%;%PYTHONPATH% + +set LY_BIN_PATH=%LY_BUILD_PATH%\bin\profile +echo LY_BIN_PATH = %LY_BIN_PATH% +SET PATH=%LY_BIN_PATH%;%PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_QT_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Substance.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Substance.bat new file mode 100644 index 0000000000..9422bc6696 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Substance.bat @@ -0,0 +1,57 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Sets up environment for Lumberyard DCC tools and code access + +:: Skip initialization if already completed +IF "%DCCSI_ENV_SUBSTANCE_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCCsi Adobe Substance Environment ... +echo _____________________________________________________________________ +echo. + +: Substance Designer +:: maya sdk path +set DCCSI_SUBSTANCE_PATH=%DCCSI_SDK_PATH%\Substance +echo DCCSI_SUBSTANCE_PATH = %DCCSI_SUBSTANCE_PATH% +:: https://docs.substance3d.com/sddoc/project-preferences-107118596.html#ProjectPreferences-ConfigurationFile +:: Path to .exe, "C:\Program Files\Allegorithmic\Substance Designer\Substance Designer.exe" +set SUBSTANCE_PATH="%ProgramFiles%\Allegorithmic\Substance Designer" +echo SUBSTANCE_PATH = %SUBSTANCE_PATH% + +:: default config +set SUBSTANCE_CFG_PATH=%LY_PROJECT_PATH%\DCCsi_default.sbscfg +echo SUBSTANCE_CFG_PATH = %SUBSTANCE_CFG_PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_SUBSTANCE_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_VScode.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_VScode.bat new file mode 100644 index 0000000000..0da2c3e48d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_VScode.bat @@ -0,0 +1,55 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Sets up environment for Lumberyard DCC tools and code access + +:: Skip initialization if already completed +IF "%DCCSI_ENV_VSCODE_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat + +::SETLOCAL ENABLEDELAYEDEXPANSION + +:: vscode has either a user install or a system install +:: https://code.visualstudio.com/#alt-downloads +:: that will change the paths assumed in this launcher (assume system install) +:: vscode envars: https://code.visualstudio.com/docs/editor/variables-reference + +SET VSCODE_WRKSPC=%DCCSIG_PATH%\Solutions\.vscode\dccsi.code-workspace + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCCsi WingIDE Environment ... +echo _____________________________________________________________________ +echo. + +echo VSCODE_WRKSPC = %VSCODE_WRKSPC% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_VSCODE_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat new file mode 100644 index 0000000000..cb5badbde7 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat @@ -0,0 +1,70 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Sets up environment for Lumberyard DCC tools and code access + +:: Skip initialization if already completed +IF "%DCCSI_ENV_WINGIDE_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: WingIDE version Major +IF "%DCCSI_WING_VERSION_MAJOR%"=="" (set DCCSI_WING_VERSION_MAJOR=7) +:: WingIDE version Major +IF "%DCCSI_WING_VERSION_MINOR%"=="" (set DCCSI_WING_VERSION_MINOR=1) + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_IDE%\python.exe + +:: put project env variables/paths here +set WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% +SET WING_PROJ=%DCCSIG_PATH%\Solutions\.wing\DCCsi_%DCCSI_WING_VERSION_MAJOR%x.wpr + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCCsi WingIDE Environment ... +echo _____________________________________________________________________ +echo. + +echo DCCSI_WING_VERSION_MAJOR = %DCCSI_WING_VERSION_MAJOR% +echo DCCSI_WING_VERSION_MINOR = %DCCSI_WING_VERSION_MINOR% +echo WINGHOME = %WINGHOME% +echo WING_PROJ = %WING_PROJ% + +:: add to the PATH +SET PATH=%WINGHOME%;%PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_WINGIDE_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat index 142954850b..23af8bb8ed 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat @@ -1,7 +1,4 @@ -:: Need to set up - @echo off - REM REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or REM its licensors. @@ -18,25 +15,35 @@ REM :: Puts you in the CMD within the dev environment :: Set up window -TITLE Lumberyard DCC Scripting Interface Cmd +TITLE O3DE DCC Scripting Interface Cmd :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE DCCsi CMD ... +echo _____________________________________________________________________ +echo. + %~d0 cd %~dp0 PUSHD %~dp0 -:: Keep changes local -SETLOCAL +SETLOCAL ENABLEDELAYEDEXPANSION -CALL %~dp0\Env.bat +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat +CALL %~dp0\Env_Maya.bat +CALL %~dp0\Env_Substance.bat +CALL %~dp0\Env_WingIDE.bat -echo. -echo _____________________________________________________________________ -echo. -echo ~ LY DCC Scripting Interface CMD ... -echo _____________________________________________________________________ -echo. +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat + +:: Change to root dir +CD /D %LY_PROJECT_PATH% :: Create command prompt with environment CALL %windir%\system32\cmd.exe diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_MayaPy_PyCharmPro.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_MayaPy_PyCharmPro.bat new file mode 100644 index 0000000000..12b3ddc826 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_MayaPy_PyCharmPro.bat @@ -0,0 +1,103 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Set up window +TITLE O3DE DCCsi GEM PyCharm +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Constant Vars (Global) +:: global debug (propogates) +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=True) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates debugger connection +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=True) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=10) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_PyCharm.bat +CALL %~dp0\Env_Maya.bat + +set DCCSI_PY_DEFAULT=%DCCSI_PY_MAYA% + +:: add prefered python to the PATH +set PATH=%DCCSI_PY_DEFAULT%;%PATH% + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Launching DCCsi Project in PyCharm %PYCHARM_VER_YEAR%.%PYCHARM_VER_MAJOR%.%PYCHARM_VER_MINOR% ... +echo ~ MayaPy.exe (default python interpreter) +echo _____________________________________________________________________ +echo. + +echo LY_DEV = %LY_DEV% + +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python +echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_BASE=%DCCSI_PY_IDE%\python.exe +echo DCCSI_PY_BASE = %DCCSI_PY_BASE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_MAYA% +echo DCCSI_PY_DEFAULT = %DCCSI_PY_DEFAULT% + +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat + +echo. + +:: Change to root dir +CD /D %LY_PROJECT_PATH% + +IF EXIST "%PYCHARM_HOME%\bin\pycharm64.exe" ( + start "" "%PYCHARM_HOME%\bin\pycharm64.exe" "%PYCHARM_PROJ%" +) ELSE ( + Where pycharm64.exe 2> NUL + IF ERRORLEVEL 1 ( + echo pycharm64.exe could not be found + pause + ) ELSE ( + start "" pycharm64.exe "%PYCHARM_PROJ%" + ) +) + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat index 387843e432..ba8aae4974 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat @@ -1,8 +1,4 @@ -:: Launches maya wityh a bunch of local hooks for Lumberyard -:: ToDo: move all of this to a .json data driven boostrapping system - @echo off - REM REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or REM its licensors. @@ -14,60 +10,67 @@ REM remove or modify any license notices. This file is distributed on an "AS IS" REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. REM -echo ________________________________ -echo ~ calling DccScriptingInterface_Env.bat - +:: Store current dir %~d0 cd %~dp0 PUSHD %~dp0 -:: Keep changes local -SETLOCAL enableDelayedExpansion +SETLOCAL ENABLEDELAYEDEXPANSION -:: PY version Major +:: Default Maya and Python version +set MAYA_VERSION=2020 set DCCSI_PY_VERSION_MAJOR=2 -echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% - -:: PY version Major set DCCSI_PY_VERSION_MINOR=7 -echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% +set DCCSI_PY_VERSION_RELEASE=11 -:: Default Maya Version -set MAYA_VERSION=2020 -echo MAYA_VERSION = %MAYA_VERSION% +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Maya.bat -:: if a local customEnv.bat exists, run it -IF EXIST "%~dp0Env.bat" CALL %~dp0Env.bat +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_MAYA% -echo ________________________________ -echo Launching Maya %MAYA_VERSION% for LY DCCsi... +:: Default BASE DCCsi python 3.7 location +:: Can be overridden (example, Launch_mayaPy_2020.bat :: MayaPy.exe) +set DCCSI_PY_DCCSI=%DCCSI_LAUNCHERS_PATH%Launch_mayaPy_2020.bat +echo DCCSI_PY_DCCSI = %DCCSI_PY_DCCSI% -::set MAYA_PATH="D:\Program Files\Autodesk\Maya2019" -echo MAYA_PATH = %MAYA_PATH% +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat -:::: Set Maya native project acess to this project -::set MAYA_PROJECT=%LY_PROJECT% -::echo MAYA_PROJECT = %MAYA_PROJECT% +echo. +echo _____________________________________________________________________ +echo. +echo Launching Maya %MAYA_VERSION% for O3DE DCCsi... +echo _____________________________________________________________________ +echo. -:: DX11 Viewport -Set MAYA_VP2_DEVICE_OVERRIDE=VirtualDeviceDx11 +echo MAYA_VERSION = %MAYA_VERSION% +echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% +echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% +echo DCCSI_PY_VERSION_RELEASE = %DCCSI_PY_VERSION_RELEASE% +echo MAYA_LOCATION = %MAYA_LOCATION% +echo MAYA_BIN_PATH = %MAYA_BIN_PATH% + +:: Change to root dir +CD /D %LY_PROJECT_PATH% :: Default to the right version of Maya if we can detect it... and launch -IF EXIST "C:\Program Files\Autodesk\Maya%MAYA_VERSION%\bin\maya.exe" ( - start "" "C:\Program Files\Autodesk\Maya%MAYA_VERSION%\bin\maya.exe" %* +IF EXIST "%MAYA_BIN_PATH%\maya.exe" ( + start "" "%MAYA_BIN_PATH%\maya.exe" %* ) ELSE ( - Where maya.exe 2> NUL - IF ERRORLEVEL 1 ( - echo Maya.exe could not be found - pause - ) ELSE ( - start "" Maya.exe %* - ) + Where maya.exe 2> NUL + IF ERRORLEVEL 1 ( + echo Maya.exe could not be found + pause + ) ELSE ( + start "" Maya.exe %* + ) ) -:: Return to starting directory -POPD +::ENDLOCAL -:END_OF_FILE +:: Restore previous directory +POPD -exit /b 0 \ No newline at end of file +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyCharmPro.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyCharmPro.bat index eac99e5616..afd2587dbc 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyCharmPro.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyCharmPro.bat @@ -10,61 +10,41 @@ REM remove or modify any license notices. This file is distributed on an "AS IS" REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. REM -:: Launches Wing IDE and the DccScriptingInterface Project Files - -:: version Major -SET PYCHARM_VERSION_YEAR=2020 -echo PYCHARM_VERSION_YEAR = %PYCHARM_VERSION_YEAR% - -:: version Major -SET PYCHARM_VERSION_MAJOR=2 -echo PYCHARM_VERSION_MAJOR = %PYCHARM_VERSION_MAJOR% - -@echo off - - - :: Set up window -TITLE Lumberyard DCC Scripting Interface GEM PyCharm CE %PYCHARM_VERSION_YEAR%.%PYCHARM_VERSION_MAJOR%.%PYCHARM_VERSION_MINOR% +TITLE O3DE DCCsi GEM PyCharm :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E -echo. -echo _____________________________________________________________________ -echo. -echo ~ Setting up LY DCC SIG PyCharm Dev Env... -echo _____________________________________________________________________ -echo. - :: Store current dir %~d0 cd %~dp0 PUSHD %~dp0 -SET ABS_PATH=%~dp0 -echo ~ Current Dir, %ABS_PATH% - -:: Keep changes local -SETLOCAL -CALL %~dp0\Env.bat - -echo. -echo _____________________________________________________________________ -echo. -echo ~ Setting up Env for PyCharm CE %PYCHARM_VERSION_YEAR%.%PYCHARM_VERSION_MAJOR%.%PYCHARM_VERSION_MINOR% -echo _____________________________________________________________________ -echo. - - -::"C:\Program Files\JetBrains\PyCharm 2019.1.3\bin" -::"C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.5\bin\pycharm64.exe" - -:: put project env variables/paths here -set PYCHARM_HOME=%PROGRAMFILES%\JetBrains\PyCharm %PYCHARM_VERSION_YEAR%.%PYCHARM_VERSION_MAJOR% -echo PYCHARM_HOME = %PYCHARM_HOME% - -SET PYCHARM_PROJ=%DCCSIG_PATH%\Solutions -echo PYCHARM_PROJ = %PYCHARM_PROJ% +:: Constant Vars (Global) +:: global debug (propogates) +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=True) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates debugger connection +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=True) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=10) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: Initialize env +CALL %~dp0\Env_PyCharm.bat + +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat echo. echo _____________________________________________________________________ @@ -74,15 +54,15 @@ echo _____________________________________________________________________ echo. IF EXIST "%PYCHARM_HOME%\bin\pycharm64.exe" ( - start "" "%PYCHARM_HOME%\bin\pycharm64.exe" "%PYCHARM_PROJ%" + start "" "%PYCHARM_HOME%\bin\pycharm64.exe" "%PYCHARM_PROJ%" ) ELSE ( - Where pycharm64.exe 2> NUL - IF ERRORLEVEL 1 ( - echo pycharm64.exe could not be found - pause - ) ELSE ( - start "" pycharm64.exe "%PYCHARM_PROJ%" - ) + Where pycharm64.exe 2> NUL + IF ERRORLEVEL 1 ( + echo pycharm64.exe could not be found + pause + ) ELSE ( + start "" pycharm64.exe "%PYCHARM_PROJ%" + ) ) ENDLOCAL diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat index a6c8a40b6e..4989086ec6 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat @@ -16,42 +16,33 @@ REM :: Puts you in the CMD within the dev environment :: Set up window -TITLE Lumberyard DCC Scripting Interface Cmd +TITLE O3DE DCC Scripting Interface Py Min CMD :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E %~d0 cd %~dp0 +PUSHD %~dp0 -:: Keep changes local -SETLOCAL enableDelayedExpansion +SETLOCAL ENABLEDELAYEDEXPANSION -:: This maps up to the \Dev folder -IF "%DEV_REL_PATH%"=="" (set DEV_REL_PATH=..\..\..\..\..\..\) +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat -:: Change to root Lumberyard dev dir -:: Don't use the LY_DEV so we can test that ENVAR!!! -CD /d %DEV_REL_PATH% -set Rel_Dev=%CD% -echo Rel_Dev = %Rel_Dev% -:: Restore original directory -popd - -set DCCSI_PYTHON_INSTALL=%Rel_Dev%\Tools\Python\3.7.5\windows - -:: add to the PATH -SET PATH=%DCCSI_PYTHON_INSTALL%;%PATH% - -set DCCSI_PY_BASE=%DCCSI_PYTHON_INSTALL%\python.exe -echo DCCSI_PY_BASE = %DCCSI_PY_BASE% +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat echo. echo _____________________________________________________________________ echo. -echo ~ LY DCC Scripting Interface, Py Min Env CMD ... +echo ~ O3DE DCC Scripting Interface, Py Min Env CMD ... echo _____________________________________________________________________ echo. +:: Change to root dir +CD /D %LY_PROJECT_PATH% + :: Create command prompt with environment CALL %windir%\system32\cmd.exe diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Qt_PyMin_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Qt_PyMin_Cmd.bat new file mode 100644 index 0000000000..094514b0ae --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Qt_PyMin_Cmd.bat @@ -0,0 +1,55 @@ +@echo off + +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Set up and run LY Python CMD prompt +:: Sets up the DccScriptingInterface_Env, +:: Puts you in the CMD within the LY_DEV environment + +:: Set up window +TITLE O3DE DCC Scripting Interface Py Qt Cmd +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +%~d0 +cd %~dp0 +PUSHD %~dp0 + +SETLOCAL ENABLEDELAYEDEXPANSION + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat + +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat + +echo. +echo _____________________________________________________________________ +echo. +echo ~ LY DCC Scripting Interface, Py Qt Env CMD ... +echo _____________________________________________________________________ +echo. + +:: Change to root dir +CD /D %LY_PROJECT_PATH% + +:: Create command prompt with environment +CALL %windir%\system32\cmd.exe + +ENDLOCAL + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat new file mode 100644 index 0000000000..03d8d2955b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat @@ -0,0 +1,107 @@ +@echo off + +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Launches VScode and the DccScriptingInterface Project Files + +:: Set up window +TITLE O3DE DCC Scripting Interface VScode +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Setting up O3DE DCCsi VScode Dev Env... +echo _____________________________________________________________________ +echo. + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Constant Vars (Global) +:: global debug (propogates) +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=True) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates debugger connection +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=True) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=10) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: Initialize envCALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat +CALL %~dp0\Env_Maya.bat +CALL %~dp0\Env_Substance.bat +CALL %~dp0\Env_VScode.bat + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Launching DCCsi Project in VScode +echo _____________________________________________________________________ +echo. + +echo LY_DEV = %LY_DEV% + +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python +echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_BASE=%DCCSI_PY_IDE%\python.exe +echo DCCSI_PY_BASE = %DCCSI_PY_BASE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% +echo DCCSI_PY_DEFAULT = %DCCSI_PY_DEFAULT% + +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat + +echo. + +REM "C:\Program Files\Microsoft VS Code\Code.exe" + +IF EXIST "%ProgramFiles%\Microsoft VS Code\Code.exe" ( + start "" "%ProgramFiles%\Microsoft VS Code\Code.exe" "%VSCODE_WRKSPC%" +) ELSE ( + Where Code.exe 2> NUL + IF ERRORLEVEL 1 ( + echo Code.exe could not be found + pause + ) ELSE ( + start "" code.exe "%VSCODE_WRKSPC%" + ) +) + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat index e583e2b493..404c013e0c 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat @@ -14,40 +14,15 @@ REM :: Launches Wing IDE and the DccScriptingInterface Project Files :: Set up window -TITLE Lumberyard DCC Scripting Interface GEM WingIDE 7x +TITLE O3DE DCCsi Launch WingIDE 7x :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E -echo. -echo _____________________________________________________________________ -echo. -echo ~ Setting up LY DCCsi WingIDE Dev Env... -echo _____________________________________________________________________ -echo. - :: Store current dir %~d0 cd %~dp0 PUSHD %~dp0 -:: Keep changes local -SETLOCAL enableDelayedExpansion - -SET ABS_PATH=%~dp0 -echo ABS_PATH = %ABS_PATH% - -:: WingIDE version Major -set WING_VERSION_MAJOR=7 -echo WING_VERSION_MAJOR = %WING_VERSION_MAJOR% - -:: WingIDE version Major -set WING_VERSION_MINOR=1 -echo WING_VERSION_MINOR = %WING_VERSION_MINOR% - -:: note the changed path from IDE to Pro -set WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% -echo WINGHOME = %WINGHOME% - :: Constant Vars (Global) :: global debug (propogates) IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=True) @@ -68,40 +43,59 @@ echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=10) echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% -CALL %~dp0\Env.bat - +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat +CALL %~dp0\Env_Maya.bat +CALL %~dp0\Env_Substance.bat +CALL %~dp0\Env_WingIDE.bat echo. echo _____________________________________________________________________ echo. -echo ~ WingIDE Version %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% +echo ~ WingIDE Version %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% +echo ~ Launching O3DE %LY_PROJECT% project in WingIDE %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% ... echo _____________________________________________________________________ echo. -SET WING_PROJ=%DCCSIG_PATH%\Solutions\.wing\DCCsi_%WING_VERSION_MAJOR%x.wpr -echo WING_PROJ = %WING_PROJ% +echo LY_DEV = %LY_DEV% +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python +echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_BASE=%DCCSI_PY_IDE%\python.exe +echo DCCSI_PY_BASE = %DCCSI_PY_BASE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% +echo DCCSI_PY_DEFAULT = %DCCSI_PY_DEFAULT% + +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat -echo. -echo _____________________________________________________________________ -echo. -echo ~ Launching %LY_PROJECT% project in WingIDE %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% ... -echo _____________________________________________________________________ echo. +:: Change to root dir +CD /D %LY_PROJECT_PATH% + IF EXIST "%WINGHOME%\bin\wing.exe" ( - start "" "%WINGHOME%\bin\wing.exe" "%WING_PROJ%" + start "" "%WINGHOME%\bin\wing.exe" "%WING_PROJ%" ) ELSE ( - Where wing.exe 2> NUL - IF ERRORLEVEL 1 ( - echo wing.exe could not be found - pause - ) ELSE ( - start "" wing.exe "%WING_PROJ%" - ) + Where wing.exe 2> NUL + IF ERRORLEVEL 1 ( + echo wing.exe could not be found + pause + ) ELSE ( + start "" wing.exe "%WING_PROJ%" + ) ) -ENDLOCAL - :: Return to starting directory POPD diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2019.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2019.bat deleted file mode 100644 index a3f804b9f1..0000000000 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2019.bat +++ /dev/null @@ -1,60 +0,0 @@ -@echo off - -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM - -:: Store current directory and change to environment directory so script works in any path. -%~d0 -cd %~dp0 -PUSHD %~dp0 - -:: Keep changes local -SETLOCAL enableDelayedExpansion - -:: PY version Major -set DCCSI_PY_VERSION_MAJOR=2 -echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% - -:: PY version Major -set DCCSI_PY_VERSION_MINOR=7 -echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% - -:: Default Maya Version -set MAYA_VERSION=2019 -echo MAYA_VERSION = %MAYA_VERSION% - -:: Initialize env -CALL %~dp0\Env.bat - -echo ~ Launching LY Dc cScripting Interfacw MayaPy (%MAYA_VERSION%) ... -echo ________________________________________________________________ -echo. - -:: Start Maya -:: Default to the right version of Maya if we can detect it. -Set MAYA_VP2_DEVICE_OVERRIDE = VirtualDeviceDx11 - -IF EXIST "%DCCSI_PY_MAYA%" ( - CALL "%DCCSI_PY_MAYA%" %* -) ELSE ( - Where mayapy.exe 2> NUL - IF ERRORLEVEL 1 ( - echo mayapy.exe could not be found - pause - ) ELSE ( - start "" mayapy.exe %* - ) -) - -ENDLOCAL - -:: Restore previous directory -POPD \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat index a14e8b071c..01ec2b5687 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat @@ -1,5 +1,4 @@ @echo off - REM REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or REM its licensors. @@ -11,50 +10,67 @@ REM remove or modify any license notices. This file is distributed on an "AS IS" REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. REM +:: Set up window +TITLE O3DE DCCsi Launch MayaPy +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + :: Store current directory and change to environment directory so script works in any path. %~d0 cd %~dp0 PUSHD %~dp0 -:: Keep changes local -SETLOCAL enableDelayedExpansion - -:: PY version Major +:: Default Maya and Python version +set MAYA_VERSION=2020 set DCCSI_PY_VERSION_MAJOR=2 -echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% - -:: PY version Major set DCCSI_PY_VERSION_MINOR=7 -echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% +set DCCSI_PY_VERSION_RELEASE=11 -:: Default Maya Version -set MAYA_VERSION=2020 -echo MAYA_VERSION = %MAYA_VERSION% +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Maya.bat -:: Initialize env -CALL %~dp0\Env.bat +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat -echo ~ Launching LY Dc cScripting Interfacw MayaPy (%MAYA_VERSION%) ... +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_MAYA% + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Launching O3DE DCCsi MayaPy (%MAYA_VERSION%) ... echo ________________________________________________________________ echo. -:: Start Maya -:: Default to the right version of Maya if we can detect it. -Set MAYA_VP2_DEVICE_OVERRIDE = VirtualDeviceDx11 +echo MAYA_VERSION = %MAYA_VERSION% +echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% +echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% +echo DCCSI_PY_VERSION_RELEASE = %DCCSI_PY_VERSION_RELEASE% +echo MAYA_LOCATION = %MAYA_LOCATION% +echo MAYA_BIN_PATH = %MAYA_BIN_PATH% + +:: Change to root dir +CD /D %LY_PROJECT_PATH% +SETLOCAL ENABLEDELAYEDEXPANSION + +:: Default to the right version of Maya if we can detect it... and launch IF EXIST "%DCCSI_PY_MAYA%" ( - CALL "%DCCSI_PY_MAYA%" %* + start "" "%DCCSI_PY_MAYA%" %* ) ELSE ( - Where mayapy.exe 2> NUL - IF ERRORLEVEL 1 ( - echo mayapy.exe could not be found - pause - ) ELSE ( - start "" mayapy.exe %* - ) + Where maya.exe 2> NUL + IF ERRORLEVEL 1 ( + echo Maya.exe could not be found + pause + ) ELSE ( + start "" Maya.exe %* + ) ) ENDLOCAL -:: Restore previous directory -POPD \ No newline at end of file +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat new file mode 100644 index 0000000000..23d2567e42 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat @@ -0,0 +1,102 @@ +@echo off + +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Launches Wing IDE and the DccScriptingInterface Project Files + +:: Set up window +TITLE O3DE DCCsi Launch WingIDE 7x +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Constant Vars (Global) +:: global debug (propogates) +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=True) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates debugger connection +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=True) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=10) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_WingIDE.bat +CALL %~dp0\Env_Maya.bat + +echo. +echo _____________________________________________________________________ +echo. +echo ~ WingIDE Version %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% +echo ~ Launching O3DE %LY_PROJECT% project in WingIDE %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% ... +echo ~ MayaPy.exe (default python interpreter) +echo _____________________________________________________________________ +echo. + +echo LY_DEV = %LY_DEV% + +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python +echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_BASE=%DCCSI_PY_IDE%\python.exe +echo DCCSI_PY_BASE = %DCCSI_PY_BASE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_MAYA% +echo DCCSI_PY_DEFAULT = %DCCSI_PY_DEFAULT% + +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat + +echo. + +:: Change to root dir +CD /D %LY_PROJECT_PATH% + +IF EXIST "%WINGHOME%\bin\wing.exe" ( + start "" "%WINGHOME%\bin\wing.exe" "%WING_PROJ%" +) ELSE ( + Where wing.exe 2> NUL + IF ERRORLEVEL 1 ( + echo wing.exe could not be found + pause + ) ELSE ( + start "" wing.exe "%WING_PROJ%" + ) +) + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat index bad1ad35cc..8de4c55651 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat @@ -1,5 +1,4 @@ @echo off - REM REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or REM its licensors. @@ -16,7 +15,7 @@ REM :: Puts you in the CMD within the dev environment :: Set up window -TITLE DCCsi (miniconda3) +TITLE O3DE DCCsi Launch pyBase :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E @@ -24,36 +23,24 @@ COLOR 8E cd %~dp0 PUSHD %~dp0 -:: Keep changes local -:: SETLOCAL enableDelayedExpansion - -CALL %~dp0\Env.bat - -:: These need to be ADDED to any env or launcher that is py3.7+ and needs PySide2 access -:: This bootstraps LUMBERYARDS Qt binaraies and PySide2 packages (which likely won't work in other versions of python) -:: If you set these in the env.bat it will cause some Qt apps like WingIDE from starting correctly -:: Those apps provide their own Qt bins and Pyside packages (Wing, Substance, Maya, etc.) -:: set up Qt/Pyside paths +SETLOCAL ENABLEDELAYEDEXPANSION -:: set up PySide2/Shiboken -set QTFORPYTHON_PATH=%LY_DEV%\Gems\QtForPython\3rdParty\pyside2\windows\release -echo QTFORPYTHON_PATH = %QTFORPYTHON_PATH% +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat +CALL %~dp0\Env_Maya.bat -:: add to the PATH -SET PATH=%QTFORPYTHON_PATH%;%PATH% -SET PYTHONPATH=%QTFORPYTHON_PATH%;%PYTHONPATH% +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat -set QT_PLUGIN_PATH=%LY_BUILD_PATH%\bin\profile\EditorPlugins -echo QT_PLUGIN_PATH = %QT_PLUGIN_PATH% +echo Starting: %DCCSI_PY_BASE% -:: add to the PATH -SET PATH=%QT_PLUGIN_PATH%;%PATH% -SET PYTHONPATH=%QT_PLUGIN_PATH%;%PYTHONPATH% +call %DCCSI_PY_BASE% %* -set LY_BIN_PATH=%LY_BUILD_PATH%\bin\profile -echo LY_BIN_PATH = %LY_BIN_PATH% -SET PATH=%LY_BIN_PATH%;%PATH% +ENDLOCAL -echo Starting: %DCCSI_PYTHON_INSTALL%\python.exe +:: Return to starting directory +POPD -call %DCCSI_PYTHON_INSTALL%\python.exe %* \ No newline at end of file +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat index ac22f33f36..17aea4ee26 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat @@ -16,7 +16,7 @@ REM :: Puts you in the CMD within the dev environment :: Set up window -TITLE DCCsi (miniconda3) +TITLE O3DE DCCsi pyBase CMD :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E @@ -24,35 +24,19 @@ COLOR 8E cd %~dp0 PUSHD %~dp0 -:: Keep changes local -:: SETLOCAL enableDelayedExpansion +SETLOCAL ENABLEDELAYEDEXPANSION -CALL %~dp0\Env.bat +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Qt.bat +CALL %~dp0\Env_Maya.bat -:: These need to be ADDED to any env or launcher that is py3.7+ and needs PySide2 access -:: This bootstraps LUMBERYARDS Qt binaraies and PySide2 packages (which likely won't work in other versions of python) -:: If you set these in the env.bat it will cause some Qt apps like WingIDE from starting correctly -:: Those apps provide their own Qt bins and Pyside packages (Wing, Substance, Maya, etc.) -:: set up Qt/Pyside paths +:: if the user has set up a custom env call it +IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat -:: set up PySide2/Shiboken -set QTFORPYTHON_PATH=%LY_DEV%\Gems\QtForPython\3rdParty\pyside2\windows\release -echo QTFORPYTHON_PATH = %QTFORPYTHON_PATH% - -:: add to the PATH -SET PATH=%QTFORPYTHON_PATH%;%PATH% -SET PYTHONPATH=%QTFORPYTHON_PATH%;%PYTHONPATH% - -set QT_PLUGIN_PATH=%LY_BUILD_PATH%\bin\profile\EditorPlugins -echo QT_PLUGIN_PATH = %QT_PLUGIN_PATH% - -:: add to the PATH -SET PATH=%QT_PLUGIN_PATH%;%PATH% -SET PYTHONPATH=%QT_PLUGIN_PATH%;%PYTHONPATH% - -set LY_BIN_PATH=%LY_BUILD_PATH%\bin\profile -echo LY_BIN_PATH = %LY_BIN_PATH% -SET PATH=%LY_BIN_PATH%;%PATH% +:: Change to root dir +CD /D %LY_PROJECT_PATH% :: Create command prompt with environment CALL %windir%\system32\cmd.exe diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launcher_SubstanceBuilder.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launcher_SubstanceBuilder.bat deleted file mode 100644 index 8256490aaa..0000000000 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launcher_SubstanceBuilder.bat +++ /dev/null @@ -1,67 +0,0 @@ -:: Need to set up - -@echo off - -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM - -:: Set up window -TITLE Launcher Substance Builder -:: Use obvious color to prevent confusion (Grey with Yellow Text) -COLOR 8E - -%~d0 -cd %~dp0 -PUSHD %~dp0 - -:: Keep changes local -SETLOCAL enableDelayedExpansion - -:: These need to be ADDED to any env or launcher that is py3.7+ and needs PySide2 access -:: This bootstraps LUMBERYARDS Qt binaraies and PySide2 packages (which likely won't work in other versions of python) -:: If you set these in the env.bat it will cause some Qt apps like WingIDE from starting correctly -:: Those apps provide their own Qt bins and Pyside packages (Wing, Substance, Maya, etc.) -:: set up Qt/Pyside paths - -:: set up PySide2/Shiboken -set QTFORPYTHON_PATH=%LY_DEV%\Gems\QtForPython\3rdParty\pyside2\windows\release -echo QTFORPYTHON_PATH = %QTFORPYTHON_PATH% - -:: add to the PATH -SET PATH=%QTFORPYTHON_PATH%;%PATH% -SET PYTHONPATH=%QTFORPYTHON_PATH%;%PYTHONPATH% - -set QT_PLUGIN_PATH=%LY_BUILD_PATH%\bin\profile\EditorPlugins -echo QT_PLUGIN_PATH = %QT_PLUGIN_PATH% - -:: add to the PATH -SET PATH=%QT_PLUGIN_PATH%;%PATH% -SET PYTHONPATH=%QT_PLUGIN_PATH%;%PYTHONPATH% - -set LY_BIN_PATH=%LY_BUILD_PATH%\bin\profile -echo LY_BIN_PATH = %LY_BIN_PATH% -SET PATH=%LY_BIN_PATH%;%PATH% - -:: if a local customEnv.bat exists, run it -IF EXIST "%~dp0Env.bat" CALL %~dp0Env.bat - -echo ~ Launching DCCsi Substance Builder ... -echo ________________________________________________________________ -echo. - -call Launch_pyBASE "%DCCSIG_PATH%\SDK\substance\builder\sb_gui_main.py" - -:: Return to starting directory -POPD - -:END_OF_FILE - -exit /b 0 \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat new file mode 100644 index 0000000000..b11dd013e2 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat @@ -0,0 +1,28 @@ +@echo off +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: This maps up to the \Dev folder +set LY_DEV=..\..\..\..\..\.. + +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python + +set PY_SITE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python\Lib\site-packages + +set PACKAGE_LOC=C:\Depot\3rdParty\packages\openimageio-2.1.16.0-rev1-windows\OpenImageIO\2.1.16.0\win_x64\bin + +copy %PACKAGE_LOC%\OpenImageIO.pyd %PY_SITE%\OpenImageIO.pyd \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/__init__.py new file mode 100644 index 0000000000..5f0cb02ec4 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/__init__.py @@ -0,0 +1,27 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# from maya_mapping import MayaMapping +# from max_mapping import MaxMapping +# from blender_mapping import BlenderMapping + +# def get_dcc_mapping(app): +# app = app.lower() +# if app == 'maya': +# return MayaMapping() +# elif app == '3dsmax': +# return MaxMapping() +# elif app == 'blender': +# return BlenderMapping() +# else: +# return NullMapping(app) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/maya_materials_export.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/maya_materials_export.py new file mode 100644 index 0000000000..e50148e96d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/maya_materials_export.py @@ -0,0 +1,628 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +""" +Usage +===== +Put usage instructions here. + +Output +====== +Put output information here. + +Relevant Links: +https://pythonhosted.org/an_example_pypi_project/sphinx.html +https://github.com/ideasman42/pyfbx_i42 +https://pypi.org/project/py-fbx/ +https://www.quora.com/How-do-I-execute-Maya-script-without-lauching-Maya +https://stackoverflow.com/questions/27437733/use-external-python-script-to-open-maya-and-run-another-script-inside-maya + +Notes: +-- Materials information can be extracted from ASCII fbx pretty easily, binary is possible but more difficult +-- FBX files could be exported as ASCII files and I could use regex there to extract material information +-- I couldn't get pyfbx_i42 to work, but purportedly it can extract information from binary files. You may just have +to use the specified python versions + +-- Jonny wants me to use pathlib wherever possible for OO pathing, as well as python-box (aka Box) for dict access + +# Things to do: + --> Create the cube demo for Jonny with 4 attached materials + --> Create mapping widget for stacked layout + --> Allow export of JSON file for demo + --> Allow custom field entries for description, etc. + --> Need to figure out how to clear pointers for stored data properly +""" + +from PySide2 import QtWidgets, QtCore, QtGui +from PySide2.QtCore import Signal, Slot, QThread, QAbstractItemModel, QModelIndex, QObject +from maya import OpenMayaUI as omui +from maya.standalone import initialize +from shiboken2 import wrapInstance +import pymel.core as pm +# import sphinx +# import azpy +import json +import os +import re + + +mayaMainWindowPtr = omui.MQtUtil.mainWindow() +mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QtWidgets.QWidget) + + +class MayaToLumberyard(QtWidgets.QWidget): + def __init__(self, parent=None): + super(MayaToLumberyard, self).__init__(parent) + + self.app = QtWidgets.QApplication.instance() + self.setParent(mayaMainWindow) + self.setWindowFlags(QtCore.Qt.Window) + self.setGeometry(50, 50, 600, 500) + self.setObjectName('MaterialsToLumberyard') + self.setWindowTitle('Maya To Lumberyard') + self.isTopLevel() + self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMinMaxButtonsHint) + + self.desktop_location = os.path.join(os.path.expanduser('~'), 'Desktop') + self.bold_font_large = QtGui.QFont('Plastique', 7, QtGui.QFont.Bold) + self.medium_font = QtGui.QFont('Plastique', 7, QtGui.QFont.Normal) + self.target_file_list = [] + self.materials_dict = {} + self.material_definitions = {} + self.processed_materials = [] + self.current_scene = pm.sceneName() + self.model = None + self.total_transfer_materials = 1 + + self.main_container = QtWidgets.QVBoxLayout(self) + self.main_container.setAlignment(QtCore.Qt.AlignTop) + self.setLayout(self.main_container) + + # Header Bar ------> + self.header_bar_layout = QtWidgets.QHBoxLayout() + self.select_files_button = QtWidgets.QPushButton('Select Files') + self.select_files_button.clicked.connect(self.choose_files_clicked) + self.select_files_button.setFixedSize(80, 35) + self.header_bar_layout.addWidget(self.select_files_button) + self.header_bar_layout.addSpacing(15) + self.use_current_file_checkbox = QtWidgets.QCheckBox('Use Current File') + self.use_current_file_checkbox.setFont(self.bold_font_large) + self.use_current_file_checkbox.clicked.connect(self.use_current_file_clicked) + self.header_bar_layout.addWidget(self.use_current_file_checkbox) + self.header_bar_layout.addSpacing(100) + self.switch_layout_combobox = QtWidgets.QComboBox() + self.switch_layout_combobox.setEnabled(False) + self.switch_layout_combobox.setFixedSize(250, 30) + self.combobox_items = ['Target Files', 'Extracted Values', 'Material Tree'] + self.switch_layout_combobox.setStyleSheet('QComboBox {padding-left:6px;}') + self.switch_layout_combobox.addItems(self.combobox_items) + self.header_bar_layout.addWidget(self.switch_layout_combobox) + self.header_bar_layout.addSpacing(4) + self.main_container.addSpacing(5) + self.main_container.addLayout(self.header_bar_layout) + + # Separation Line ------> + self.separatorLayout1 = QtWidgets.QHBoxLayout() + self.line1 = QtWidgets.QLabel() + self.line1.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + self.line1.setLineWidth(1) + self.line1.setFixedHeight(10) + self.separatorLayout1.addWidget(self.line1) + self.main_container.addLayout(self.separatorLayout1) + + # ++++++++++++++++++++++++++++++++++++++++++++++++# + # File Source Table / Attributes (Stacked Layout) # + # ++++++++++++++++++++++++++++++++++++++++++++++++# + self.content_stacked_layout = QtWidgets.QStackedLayout() + self.main_container.addLayout(self.content_stacked_layout) + self.switch_layout_combobox.currentIndexChanged.connect(self.layout_combobox_changed) + + # --- Files Table + self.target_files_table = QtWidgets.QTableWidget() + self.target_files_table.setFocusPolicy(QtCore.Qt.NoFocus) + self.target_files_table.setColumnCount(2) + self.target_files_table.setAlternatingRowColors(True) + self.target_files_table.setHorizontalHeaderLabels(['File List', '']) + self.target_files_table.horizontalHeader().setStyleSheet('QHeaderView::section {padding-top:9px; padding-left:10px;}') + self.target_files_table.verticalHeader().hide() + files_header = self.target_files_table.horizontalHeader() + files_header.setFixedHeight(30) + files_header.setDefaultAlignment(QtCore.Qt.AlignLeft) + files_header.setContentsMargins(10, 10, 0, 0) + files_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + files_header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) + self.target_files_table.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.content_stacked_layout.addWidget(self.target_files_table) + + # --- Scene Information Table + self.material_tree_view = QtWidgets.QTreeView() + self.headers = ['Key', 'Value'] + self.material_tree_view.setStyleSheet('QTreeView::item {height:25px;} QHeaderView::section {height:30px; padding-left:10px}') + + self.material_tree_view.setFocusPolicy(QtCore.Qt.NoFocus) + self.material_tree_view.setAlternatingRowColors(True) + self.material_tree_view.setUniformRowHeights(True) + self.content_stacked_layout.addWidget(self.material_tree_view) + + # --- LY Material Definitions + self.material_definitions_widget = QtWidgets.QWidget() + self.material_definitions_layout = QtWidgets.QHBoxLayout(self.material_definitions_widget) + self.material_definitions_layout.setSpacing(0) + self.material_definitions_layout.setContentsMargins(0, 0, 0, 0) + self.material_definitions_frame = QtWidgets.QFrame(self.material_definitions_widget) + self.material_definitions_frame.setGeometry(0, 0, 5000, 5000) + self.material_definitions_frame.setStyleSheet('background-color:rgb(150,150,150);') + + self.title_bar_widget = QtWidgets.QWidget() + self.title_bar_layout = QtWidgets.QHBoxLayout(self.title_bar_widget) + self.title_bar_layout.setContentsMargins(17, 17, 17, 0) + self.title_bar_layout.setAlignment(QtCore.Qt.AlignTop) + self.title_bar_frame = QtWidgets.QFrame(self.title_bar_widget) + self.title_bar_frame.setGeometry(0, 0, 5000, 60) + self.title_bar_frame.setStyleSheet('background-color:rgb(102,69,153);') + self.material_definitions_layout.addWidget(self.title_bar_widget) + + self.material_name = QtWidgets.QCheckBox('StingrayPBS2') + self.material_name.setStyleSheet('spacing:10px; color:white') + self.material_name.setFont(self.bold_font_large) + self.material_name.setChecked(True) + self.title_bar_layout.addWidget(self.material_name) + + # Forward/Back Buttons -------------------------->> + self.previous_next_button_layout = QtWidgets.QHBoxLayout() + self.item_count = QtWidgets.QLabel('1 of 10') + self.previous_next_button_layout.addWidget(self.item_count) + self.previous_next_button_layout.addSpacing(10) + self.previous_next_button_layout.setContentsMargins(0, 0, 0, 0) + self.previous_next_button_layout.setAlignment(QtCore.Qt.AlignRight) + self.previous_button = QtWidgets.QToolButton() + self.previous_button.setArrowType(QtCore.Qt.LeftArrow) + self.previous_button.setStyleSheet('background-color:rgb(110,110,110);') + self.previous_button.clicked.connect(self.previous_button_clicked) + self.previous_next_button_layout.addWidget(self.previous_button) + self.next_button = QtWidgets.QToolButton() + self.next_button.setArrowType(QtCore.Qt.RightArrow) + self.next_button.setStyleSheet('background-color:rgb(110,110,110);') + self.next_button.clicked.connect(self.next_button_clicked) + self.previous_next_button_layout.addWidget(self.next_button) + self.title_bar_layout.addLayout(self.previous_next_button_layout) + self.content_stacked_layout.addWidget(self.material_definitions_widget) + + # File processing buttons ------> + self.process_files_layout = QtWidgets.QHBoxLayout() + self.main_container.addLayout(self.process_files_layout) + self.process_files_button = QtWidgets.QPushButton('Process Listed Files') + self.process_files_button.setFixedHeight(50) + self.process_files_button.clicked.connect(self.process_files_clicked) + self.process_files_layout.addWidget(self.process_files_button) + self.reset_button = QtWidgets.QPushButton('Reset') + self.reset_button.setFixedSize(50, 50) + self.reset_button.clicked.connect(self.reset_clicked) + self.reset_button.setEnabled(False) + self.process_files_layout.addWidget(self.reset_button) + self.initialize_window() + + def initialize_window(self): + if self.current_scene: + self.target_file_list = [self.current_scene] + self.use_current_file_checkbox.setChecked(True) + self.populate_files_table() + + def populate_files_table(self): + self.target_files_table.setRowCount(0) + for index, entry in enumerate(self.target_file_list): + entry = entry[1] if type(entry) == list else entry + self.target_files_table.insertRow(index) + item = QtWidgets.QTableWidgetItem(' {}'.format(entry)) + self.target_files_table.setRowHeight(index, 45) + remove_button = QtWidgets.QPushButton(' Remove ') + remove_button.setStyleSheet('border-width:0px; background-color:rgb(100,100,100);') + remove_button.clicked.connect(self.remove_file_clicked) + self.target_files_table.setItem(index, 0, item) + self.target_files_table.setCellWidget(index, 1, remove_button) + + def process_file_list(self): + file_processing_errors = [] + for maya_file_location in self.target_file_list: + try: + if maya_file_location != self.current_scene: + pm.openFile(maya_file_location, force=True) + self.current_scene = maya_file_location + self.get_scene_materials_description() + except Exception as e: + file_processing_errors.append([maya_file_location, e]) + + # Create Model with extracted values from file list + self.set_material_model() + + # Setup Lumberyard Material File Values + self.map_materials() + print ('MaterialDefinitions:'.format(self.material_definitions)) + print json.dumps(self.material_definitions, sort_keys=True, indent=4) + + # Update UI Layout + self.set_material_view() + self.switch_layout_combobox.setCurrentIndex(2) + self.set_ui_buttons() + + def map_materials(self): + root = self.model.rootItem + for row in range(self.model.rowCount()): + name = self.model.get_attribute_value('MaterialName', root.child(row)) + material_type = self.model.get_attribute_value('MaterialType', root.child(row)) + file_connections = {} + shader_attributes = {} + + for childIndex in range(root.child(row).childCount()): + child_item = root.child(row).child(childIndex) + child_value = child_item.itemData + if child_item.childCount(): + target_dict = file_connections if child_value[0] == 'FileConnections' else shader_attributes + for subChildIndex in range(child_item.childCount()): + sub_child_data = child_item.child(subChildIndex).itemData + target_dict[sub_child_data[0]] = sub_child_data[1] + self.set_pbr_material_description(name, material_type, file_connections) + + def reset_all_values(self): + pass + # Need to figure out how to clear pointers for stored data properly + # self.target_files_table.setRowCount(0) + # self.model.beginResetModel() + # self.model.qDeleteAll(mResults) + # self.model.endResetModel() + # self.initialize_window() + + ############################ + # Getters/Setters ########## + ############################ + + @staticmethod + def get_materials(target_mesh): + shading_group = pm.listConnections(pm.PyNode(target_mesh), type='shadingEngine') + materials = pm.ls(pm.listConnections(shading_group), materials=1) + return list(set(materials)) + + @staticmethod + def get_shader(material_name): + connections = pm.listConnections(material_name, type='shadingEngine')[0] + shader_name = '{}.surfaceShader'.format(connections) + shader = pm.listConnections(shader_name)[0] + return shader + + @staticmethod + def get_shader_information(shader): + shader_file_connections = {} + for node in pm.listConnections(shader, type='file', c=True): + shader_file_connections[str(node[0])] = str(pm.getAttr(node[1].fileTextureName)) + shader_attributes = {} + for shader_attribute in pm.listAttr(shader, s=True, iu=True): + try: + shader_attributes[str(shader_attribute)] = pm.getAttr('{}.{}'.format(shader, shader_attribute)) + except pm.MayaAttributeError as e: + print ('MayaAttributeError: {}'.format(e)) + + return shader_file_connections, shader_attributes + + @staticmethod + def get_shader_properties(name, material_type, file_connections): + """ This system will probably need rethinking if DCCs and compatible materials grow """ + attr_list = {} + if material_type == 'StingrayPBS': + naming_exceptions = {'color': 'baseColor', 'ao': 'ambientOcclusion'} + maps = 'color, metallic, roughness, normal, emissive, ao, opacity'.split(', ') + for m in maps: + texture_attribute = 'TEX_{}_map'.format(m) + for tex in file_connections.keys(): + if tex.find(texture_attribute) != -1: + key = m if m not in naming_exceptions else naming_exceptions.get(m) + attr_list[key] = {'useTexture': 'true', + 'textureMap': file_connections.get('{}.{}'.format(name, texture_attribute))} + return attr_list + + @staticmethod + def get_increment(name): + last_number = re.compile(r'(?:[^\d]*(\d+)[^\d]*)+') + number_found = last_number.search(name) + if number_found: + next_number = str(int(number_found.group(1)) + 1) + start, end = number_found.span(1) + name = name[:max(end - len(next_number), start)] + next_number + name[end:] + return name + + @staticmethod + def get_material_template(shader_type): + definitions = os.path.join(os.path.dirname(os.path.abspath(__file__)), '{}.material'.format(shader_type)) + if os.path.exists(definitions): + with open(definitions) as f: + return json.load(f) + + def get_scene_materials_description(self): + scene_geo = pm.ls(v=True, geometry=True) + for target_mesh in scene_geo: + material_list = self.get_materials(target_mesh) + for material_name in material_list: + material_type = pm.nodeType(material_name, api=True) + material_listed = [x for x in self.materials_dict if self.materials_dict[x]['MaterialName'] == material_name] + + if not material_listed: + self.set_material_dict(str(material_name), str(material_type), target_mesh) + else: + mesh_list = self.materials_dict[material_name].get('AppliedMesh') + if not isinstance(mesh_list, list): + self.materials_dict[material_name]['AppliedMesh'] = [mesh_list, target_mesh] + else: + mesh_list.append(target_mesh) + + def set_material_dict(self, material_name, material_type, material_mesh): + shader = self.get_shader(material_name) + shader_file_connections, shader_attributes = self.get_shader_information(shader) + material_dict = {'MaterialName': material_name, 'MaterialType': material_type, 'AppliedMesh': material_mesh, + 'FileConnections': shader_file_connections, 'SceneName': str(self.current_scene), + 'MaterialAttributes': shader_attributes} + material_name = 'Material_{}'.format(self.total_transfer_materials) + self.materials_dict[material_name] = material_dict + self.total_transfer_materials += 1 + + def set_material_model(self): + self.model = MaterialsModel(self.headers, self.materials_dict) + + def set_material_view(self): + self.material_tree_view.setModel(self.model) + self.material_tree_view.expandAll() + self.material_tree_view.resizeColumnToContents(0) + + def set_pbr_material_description(self, name, material_type, file_connections): + # Build dictionary for material description based on extracted values + default_settings = self.get_material_template('pbr') + material = {'description': name, + 'materialType': default_settings.get('materialType'), + 'parentMaterial': default_settings.get('parentMaterial'), + 'propertyLayoutVersion': default_settings.get('propertyLayoutVersion'), + 'properties': self.get_shader_properties(name, material_type, file_connections)} + self.material_definitions[name if name not in self.material_definitions.keys() else self.get_increment(name)] = material + + def set_ui_buttons(self): + display_index = self.content_stacked_layout.currentIndex() + self.switch_layout_combobox.setEnabled(True) + # Target Files + if display_index == 0: + self.use_current_file_checkbox.setEnabled(True) + self.select_files_button.setEnabled(True) + self.reset_button.setEnabled(True) + self.process_files_button.setText('Process Listed Files') + + # Extracted Values + elif display_index == 1: + self.reset_button.setEnabled(True) + self.process_files_button.setEnabled(False) + self.use_current_file_checkbox.setEnabled(False) + self.select_files_button.setEnabled(False) + + # Material Tree + else: + self.use_current_file_checkbox.setEnabled(False) + self.select_files_button.setEnabled(False) + self.process_files_button.setText('Export Selected Materials') + if self.material_definitions: + self.process_files_button.setEnabled(True) + + ############################ + # Button Actions ########### + ############################ + + def use_current_file_clicked(self): + self.current_scene = pm.sceneName() + if self.use_current_file_checkbox.isChecked(): + self.target_file_list.insert(0, self.current_scene) + self.target_file_list = list(set(self.target_file_list)) + else: + if self.current_scene in self.target_file_list: + del self.target_file_list[self.target_file_list.index(self.current_scene)] + self.populate_files_table() + + def remove_file_clicked(self): + file_index = self.target_files_table.indexAt(self.sender().pos()) + target_file = self.target_file_list[file_index.row()] + if target_file == pm.sceneName(): + self.use_current_file_checkbox.setChecked(False) + del self.target_file_list[file_index.row()] + self.populate_files_table() + + def process_files_clicked(self): + self.process_file_list() + + def choose_files_clicked(self): + dialog = QtWidgets.QFileDialog(self, 'Shift-Select Target Files', self.desktop_location) + dialog.setFileMode(QtWidgets.QFileDialog.ExistingFile) + dialog.setNameFilter('Maya Files (*.ma *.mb *.fbx)') + dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True) + file_view = dialog.findChild(QtWidgets.QListView, 'listView') + + # Workaround for selecting multiple files with File Dialog + if file_view: + file_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + f_tree_view = dialog.findChild(QtWidgets.QTreeView) + if f_tree_view: + f_tree_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + + if dialog.exec_() == QtWidgets.QDialog.Accepted: + self.target_file_list = dialog.selectedFiles() + if self.target_file_list: + self.populate_files_table() + self.process_files_button.setEnabled(True) + + def layout_combobox_changed(self): + self.content_stacked_layout.setCurrentIndex(self.switch_layout_combobox.currentIndex()) + self.set_ui_buttons() + + def reset_clicked(self): + self.reset_all_values() + + def previous_button_clicked(self): + print ('Previous button clicked') + + def next_button_clicked(self): + print ('Next button clicked') + + +class MaterialsModel(QAbstractItemModel): + def __init__(self, headers, data, parent=None): + super(MaterialsModel, self).__init__(parent) + + self.rootItem = TreeNode(headers) + self.parents = [self.rootItem] + self.indentations = [0] + self.create_data(data) + + def create_data(self, data, indent=-1): + if type(data) == dict: + indent += 1 + position = 4 * indent + for key, value in data.iteritems(): + if position > self.indentations[-1]: + if self.parents[-1].childCount() > 0: + self.parents.append(self.parents[-1].child(self.parents[-1].childCount() - 1)) + self.indentations.append(position) + else: + while position < self.indentations[-1] and len(self.parents) > 0: + self.parents.pop() + self.indentations.pop() + parent = self.parents[-1] + parent.insertChildren(parent.childCount(), 1, parent.columnCount()) + parent.child(parent.childCount() - 1).setData(0, key) + value_string = str(value) if type(value) != dict else str('') + parent.child(parent.childCount() - 1).setData(1, value_string) + try: + self.create_data(value, indent) + except RuntimeError: + pass + + @staticmethod + def get_attribute_value(search_string, search_column): + for childIndex in range(search_column.childCount()): + child_item = search_column.child(childIndex) + child_value = child_item.itemData + if child_value[0] == search_string: + return child_value[1] + return None + + def index(self, row, column, index=QModelIndex()): + """ Returns the index of the item in the model specified by the given row, column and parent index """ + if not self.hasIndex(row, column, index): + return QModelIndex() + if not index.isValid(): + item = self.rootItem + else: + item = index.internalPointer() + + child = item.child(row) + if child: + return self.createIndex(row, column, child) + return QModelIndex() + + def parent(self, index): + """ + Returns the parent of the model item with the given index If the item has no parent, + an invalid QModelIndex is returned + """ + if not index.isValid(): + return QModelIndex() + item = index.internalPointer() + if not item: + return QModelIndex() + + parent = item.parentItem + if parent == self.rootItem: + return QModelIndex() + else: + return self.createIndex(parent.childNumber(), 0, parent) + + def rowCount(self, index=QModelIndex()): + """ + Returns the number of rows under the given parent. When the parent is valid it means that + rowCount is returning the number of children of parent + """ + if index.isValid(): + parent = index.internalPointer() + else: + parent = self.rootItem + return parent.childCount() + + def columnCount(self, index=QModelIndex()): + """ Returns the number of columns for the children of the given parent """ + return self.rootItem.columnCount() + + def data(self, index, role=QtCore.Qt.DisplayRole): + """ Returns the data stored under the given role for the item referred to by the index """ + if index.isValid() and role == QtCore.Qt.DisplayRole: + return index.internalPointer().data(index.column()) + elif not index.isValid(): + return self.rootItem.data(index.column()) + + def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole): + """ Returns the data for the given role and section in the header with the specified orientation """ + if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: + return self.rootItem.data(section) + + +class TreeNode(object): + def __init__(self, data, parent=None): + self.parentItem = parent + self.itemData = data + self.children = [] + + def child(self, row): + return self.children[row] + + def childCount(self): + return len(self.children) + + def childNumber(self): + if self.parentItem is not None: + return self.parentItem.children.index(self) + + def columnCount(self): + return len(self.itemData) + + def data(self, column): + return self.itemData[column] + + def insertChildren(self, position, count, columns): + if position < 0 or position > len(self.children): + return False + for row in range(count): + data = [v for v in range(columns)] + item = TreeNode(data, self) + self.children.insert(position, item) + + def parent(self): + return self.parentItem + + def setData(self, column, value): + if column < 0 or column >= len(self.itemData): + return False + self.itemData[column] = value + + +def delete_instances(): + for obj in mayaMainWindow.children(): + if str(type(obj)) == "": + if obj.__class__.__name__ == "MayaToLumberyard": + obj.setParent(None) + obj.deleteLater() + + +def show_ui(): + delete_instances() + ui = MayaToLumberyard(mayaMainWindow) + ui.show() + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/pbr.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/pbr.material new file mode 100644 index 0000000000..4bf22b8762 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/pbr.material @@ -0,0 +1,55 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "ambientOcclusion": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "baseColor": { + "color": [ 1.0, 1.0, 1.0 ], + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "emissive": { + "color": [ 1.0, 1.0, 1.0 ], + "intensity": 1.0, + "useTexture": false, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "metallic": { + "factor": 0.0, + "useTexture": false, + "textureMap": "" + }, + "roughness": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif" + }, + "opacity": { + "doubleSided": false, + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": false, + "textureMap": "" + } + } +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/minspect.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/minspect.py new file mode 100644 index 0000000000..9cb0b34b85 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/minspect.py @@ -0,0 +1,136 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +import pymel.core as pmc +import sys +import types + + +def syspath(): + print 'sys.path:' + for p in sys.path: + print ' ' + p + + +def info(obj): + """Prints information about the object.""" + + lines = ['Info for %s' % obj.name(), + 'Attributes:'] + # Get the name of all attributes + for a in obj.listAttr(): + lines.append(' ' + a.name()) + lines.append('MEL type: %s' % obj.type()) + lines.append('MRO:') + lines.extend([' ' + t.__name__ for t in type(obj).__mro__]) + result = '\n'.join(lines) + print result + + +def _is_pymel(obj): + try: # (1) + module = obj.__module__ # (2) + except AttributeError: # (3) + try: + module = obj.__name__ # (4) + except AttributeError: + return None # (5) + return module.startswith('pymel') # (6) + + +def _py_to_helpstr(obj): + if isinstance(obj, basestring): + return 'search.html?q=%s' % (obj.replace(' ', '+')) + if not _is_pymel(obj): + return None + if isinstance(obj, types.ModuleType): + return ('generated/%(module)s.html#module-%(module)s' % + dict(module=obj.__name__)) + if isinstance(obj, types.MethodType): + return ('generated/classes/%(module)s/' + '%(module)s.%(typename)s.html' + '#%(module)s.%(typename)s.%(methname)s' % dict( + module=obj.__module__, + typename=obj.im_class.__name__, + methname=obj.__name__)) + if isinstance(obj, types.FunctionType): + return ('generated/functions/%(module)s/' + '%(module)s.%(funcname)s.html' + '#%(module)s.%(funcname)s' % dict( + module=obj.__module__, + funcname=obj.__name__)) + if not isinstance(obj, type): + obj = type(obj) + return ('generated/classes/%(module)s/' + '%(module)s.%(typename)s.html' + '#%(module)s.%(typename)s' % dict( + module=obj.__module__, + typename=obj.__name__)) + + +def test_py_to_helpstr(): + def dotest(obj, ideal): + result = _py_to_helpstr(obj) + assert result == ideal, '%s != %s' % (result, ideal) + dotest('maya rocks', 'search.html?q=maya+rocks') + dotest(pmc.nodetypes, + 'generated/pymel.core.nodetypes.html' + '#module-pymel.core.nodetypes') + dotest(pmc.nodetypes.Joint, + 'generated/classes/pymel.core.nodetypes/' + 'pymel.core.nodetypes.Joint.html' + '#pymel.core.nodetypes.Joint') + dotest(pmc.nodetypes.Joint(), + 'generated/classes/pymel.core.nodetypes/' + 'pymel.core.nodetypes.Joint.html' + '#pymel.core.nodetypes.Joint') + dotest(pmc.nodetypes.Joint().getTranslation, + 'generated/classes/pymel.core.nodetypes/' + 'pymel.core.nodetypes.Joint.html' + '#pymel.core.nodetypes.Joint.getTranslation') + dotest(pmc.joint, + 'generated/functions/pymel.core.animation/' + 'pymel.core.animation.joint.html' + '#pymel.core.animation.joint') + dotest(object(), None) + dotest(10, None) + dotest([], None) + dotest(sys, None) + + +def test_py_to_helpstrFAIL(): + assert 1 == 2, '1 != 2' + + +import webbrowser # (1) +HELP_ROOT_URL = ('http://help.autodesk.com/cloudhelp/2018/ENU/Maya-Tech-Docs/PyMel/')# (2) + + +def pmhelp(obj): # (3) + """Gives help for a pymel or python object. + + If obj is not a PyMEL object, use Python's built-in + `help` function. + If obj is a string, open a web browser to a search in the + PyMEL help for the string. + Otherwise, open a web browser to the page for the object. + """ + tail = _py_to_helpstr(obj) + if tail is None: + help(obj) # (4) + else: + webbrowser.open(HELP_ROOT_URL + tail) # (5) + + +if __name__ == '__main__': + test_py_to_helpstr() + print 'Tests ran successfully.' diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Lumberyard/Scripts/set_menu.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Lumberyard/Scripts/set_menu.py new file mode 100644 index 0000000000..77ae689f41 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Lumberyard/Scripts/set_menu.py @@ -0,0 +1,168 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +"""This module creates a DccScriptingInterface menu in Lumberyard. +This module is designed to only run in Lumberyard and py3.7+""" +# -- Standard Python modules +import sys +import os +import importlib.util + +# -- External Python modules +from pathlib import Path + +# -- DCCsi Extension Modules +import azpy + +# Lumberyard extension modules +import azlmbr +import azlmbr.bus +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# some basic DCCsi module setup, DCCsi bootstrap already performed some +from dynaconf import settings +settings.setenv() + +# ------------------------------------------------------------------------- +_log_level = int(settings.DCCSI_LOGLEVEL) +if settings.DCCSI_GDEBUG: + _log_level = int(10) # force debug level + +_MODULENAME = r'DCCsi.SDK.Lumberyard.Scripts.set_menu' + +_LOGGER = azpy.initialize_logger(_MODULENAME, default_log_level=_log_level) +_LOGGER.debug(f'Invoking:: {0}.'.format({_MODULENAME})) + +# early attach WingIDE debugger (can refactor to include other IDEs later) +if settings.DCCSI_DEV_MODE: + from azpy.env_bool import env_bool + if not env_bool('DCCSI_DEBUGGER_ATTACHED', False): + # if not already attached lets do it here + from azpy.test.entry_test import connect_wing + foo = connect_wing() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# validate pyside before continuing +try: + azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, 'IsActive') + params = azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, 'GetQtBootstrapParameters') + params is not None and params.mainWindowId is not 0 + from PySide2 import QtWidgets +except Exception as e: + _LOGGER.error(f'Pyside not available, exception: {e}') + raise e + +# keep going, import the other PySide2 bits we will use +from PySide2 import QtGui +from PySide2.QtCore import Slot +from shiboken2 import wrapInstance, getCppPointer +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def get_ly_mainwindow(): + widget_main_window = QtWidgets.QWidget.find(params.mainWindowId) + widget_main_window = wrapInstance(int(getCppPointer(widget_main_window)[0]), QtWidgets.QMainWindow) + return widget_main_window +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +class SampleUI(QtWidgets.QDialog): + """Lightweight UI Test Class created a button""" + def __init__(self, parent, title='Not Set'): + super(SampleUI, self).__init__(parent) + self.setWindowTitle(title) + self.initUI() + + def initUI(self): + mainLayout = QtWidgets.QHBoxLayout() + testBtn = QtWidgets.QPushButton("I am just a Button man!") + mainLayout.addWidget(testBtn) + self.setLayout(mainLayout) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +_tag_str = 'DccScriptingInterface' +_LOGGER.info(f'Creating {_tag_str} Menu') +# Lumberyards main window +widget_main_window = get_ly_mainwindow() + +# create our own menuBar +dccsi_menu = widget_main_window.menuBar().addMenu(f"&{_tag_str}") + +# nest a menu for util/tool launching +dccsi_launch_menu = dccsi_menu.addMenu("Launch Utility") + +# (1) add the first utility: Substance Builder +# to do, make adding this a data-driven dynaconf option configured per-project? +action_launch_sub_builder = dccsi_launch_menu.addAction("Substance Builder") + +@Slot() +def clicked_launch_sub_builder(): + # breadcrumbs + if settings.DCCSI_GDEBUG: + debug_msg = "Clicked action_launch_sub_builder" + print(debug_msg) + _LOGGER.debug(debug_msg) + + _SUB_BUILDER_PATH = Path(settings.DCCSIG_PATH, + 'SDK', + 'Substance', + 'builder') + _SUB_BUILDER_BOOTSTRAP = Path(_SUB_BUILDER_PATH, 'bootstrap.py') + + # bootstrap is a generic name and we have many of them + # this ensures we are loading a specific one + _spec_bootstrap = importlib.util.spec_from_file_location("dccsi.sdk.substance.builder.bootstrap", + _SUB_BUILDER_BOOTSTRAP) + _app_bootstrap = importlib.util.module_from_spec(_spec_bootstrap) + _spec_bootstrap.loader.exec_module(_app_bootstrap) + + while 1: # simple PySide2 test, set to 0 to disable + ui = SampleUI(parent=widget_main_window, title='Atom: Substance Builder') + ui.show() + break + return + +# Add click event to menu bar +action_launch_sub_builder.triggered.connect(clicked_launch_sub_builder) +# ----------------------------------------------------------------- + +# add launching the dcc material converter util to the menu +# to do, make adding this a data-driven dynaconf option? +action_launch_dcc_mat_converter = dccsi_launch_menu.addAction("DCC Material Converter") + +@Slot() +def clicked_launch_dcc_mat_converter(): + if settings.DCCSI_GDEBUG: + debug_msg = "Clicked action_launch_dcc_mat_converter" + print(debug_msg) + _LOGGER.debug(debug_msg) + + while 1: # simple PySide2 test, set to 0 to disable + ui = SampleUI(parent=widget_main_window, title='Atom: DCC Material Converter') + ui.show() + break + + return + +# Add click event to menu bar +action_launch_dcc_mat_converter.triggered.connect(clicked_launch_dcc_mat_converter) + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/IBLbaker_brdf_lut.dds b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/IBLbaker_brdf_lut.dds new file mode 100644 index 0000000000..81e62781b4 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/IBLbaker_brdf_lut.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:646b6d93b2c672bbbbcb46af1bfcaf26ca37c8a0c2b218989b145417bb6b7c93 +size 262272 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_lighting_diffuse.dds b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_lighting_diffuse.dds new file mode 100644 index 0000000000..980477af4b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_lighting_diffuse.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86209db0389b152c709d529e9d5705219b44bfbf712a26788a5c2ab0adc0c373 +size 98452 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_lighting_specular.dds b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_lighting_specular.dds new file mode 100644 index 0000000000..fd6e1f99fc --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_lighting_specular.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd95898a04b81b80b095dbef34523f3b70a8c14bc9f82116f732ab648f25658b +size 2096788 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_skybox.dds b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_skybox.dds new file mode 100644 index 0000000000..304aaa0a1f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Resources/PBR/ly_cubempas/artist_workshop_4k_skybox.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a85a15d5c60102f414b4ad03604dbd1c78e3d1c1fe445f60db158b2c069f792d +size 25165972 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/__init__.py new file mode 100644 index 0000000000..4745b9ab2b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/__init__.py @@ -0,0 +1,35 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# from maya_mapping import MayaMapping +# from max_mapping import MaxMapping +# from blender_mapping import BlenderMapping + +# def get_dcc_mapping(app): +# app = app.lower() +# if app == 'maya': +# return MayaMapping() +# elif app == '3dsmax': +# return MaxMapping() +# elif app == 'blender': +# return BlenderMapping() +# else: +# return NullMapping(app) + +__all__ = ['blender_materials', + 'dcc_material_mapping', + 'drag_and_drop', + 'main', + 'materials_export', + 'max_materials', + 'maya_materials', + 'model'] \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/blender_materials.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/blender_materials.py new file mode 100644 index 0000000000..d6860dc2dc --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/blender_materials.py @@ -0,0 +1,160 @@ +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import bpy +import sys +import json + + +class BlenderMaterials(object): + def __init__(self, files_list, materials_count): + super(BlenderMaterials, self).__init__() + + self.files_list = files_list + self.current_scene = None + self.materials_dictionary = {} + self.materials_count = materials_count + self.get_material_information() + + def get_material_information(self): + """ + Main entry point for the material information extraction. Because this class is run + in Standalone mode as a subprocess, the list is passed as a string- some parsing/measures + need to be taken in order to separate values that originated as a list before passed. + + :return: A dictionary of all of the materials gathered. Sent back to main UI through stdout + """ + for file in file_list.split(','): + self.current_scene = file.replace('\'', '') + print('File in BlenderMaterials to be processed: {}'.format(self.current_scene)) + + # pm.openFile(self.current_scene, force=True) + # self.set_material_descriptions() + # json.dump(self.materials_dictionary, sys.stdout) + + @staticmethod + def get_materials(target_mesh): + """ + Gathers a list of all materials attached to each mesh's shader + + :param target_mesh: The target mesh to pull attached material information from. + :return: List of unique material values attached to the mesh passed as an argument. + """ + pass + + @staticmethod + def get_shader(material_name): + """ + Convenience function for obtaining the shader that the specified material (as an argument) + is attached to. + + :param material_name: Takes the material name as an argument to get associated shader object + :return: + """ + pass + + @staticmethod + def get_shader_information(shader): + """ + Helper function for extracting shader/material attributes used to form the DCC specific dictionary + of found material values for conversion. + + :param shader: The target shader object to analyze + :return: Complete set (in the form of two dictionaries) of file connections and material attribute values + """ + pass + + def set_material_dictionary(self, material_name, material_type, material_mesh): + """ + When a unique material has been found, this creates a dictionary entry with all relevant material values. This + includes material attributes as well as attached file textures. Later in the process this information is + leveraged when creating the Lumberyard material definition. + + :param material_name: The name attached to the material + :param material_type: Specific type of material (Arnold, Stingray, etc.) + :param material_mesh: Mesh that the material is applied to + :return: + """ + self.materials_count += 1 + pass + # shader = self.get_shader(material_name) + # shader_file_connections, shader_attributes = self.get_shader_information(shader) + # material_dictionary = {'MaterialName': material_name, 'MaterialType': material_type, 'DccApplication': 'Maya', + # 'AppliedMesh': material_mesh, 'FileConnections': shader_file_connections, + # 'SceneName': str(self.current_scene), 'MaterialAttributes': shader_attributes} + # material_name = 'Material_{}'.format(self.materials_count) + # self.materials_dictionary[material_name] = material_dictionary + + def set_material_descriptions(self): + """ + This function serves as the clearinghouse for all analyzed materials passing through the system. + It will determine whether or not the found material has already been processed, or if it needs to + be added to the final material dictionary. In the event that an encountered material has already + been processed, this function creates a register of all meshes it is applied to in the 'AppliedMesh' + attribute. + :return: + """ + pass + # scene_geo = pm.ls(v=True, geometry=True) + # for target_mesh in scene_geo: + # material_list = self.get_materials(target_mesh) + # for material_name in material_list: + # material_type = pm.nodeType(material_name, api=True) + # material_listed = [x for x in self.materials_dictionary + # if self.materials_dictionary[x]['MaterialName'] == material_name] + # + # if not material_listed: + # self.set_material_dictionary(str(material_name), str(material_type), str(target_mesh)) + # else: + # mesh_list = self.materials_dictionary[material_name].get('AppliedMesh') + # if not isinstance(mesh_list, list): + # self.materials_dictionary[material_name]['AppliedMesh'] = [mesh_list, target_mesh] + # else: + # mesh_list.append(target_mesh) + +# def get_material_information(): +# material_attributes = {} +# for target_object in bpy.data.objects: +# if target_object.type == 'MESH': +# print('Object: {} Material: {}'.format(target_object, target_object.active_material)) +# assigned_material = target_object.active_material +# material_nodes = assigned_material.node_tree.nodes +# +# for node in material_nodes: +# for material_input in node.inputs: +# try: +# attribute_name = material_input.name +# attribute_value = node.inputs[attribute_name].default_value +# material_attributes[attribute_name] = str(attribute_value) +# except Exception as e: +# print ('[{}] Exception encountered: {}'.format(material_input.name, e)) +# +# print(json.dumps(material_attributes, sort_keys=True, indent=4)) + + + + +# get_material_information() + + +# ++++++++++++++++++++++++++++++++++++++++++++++++# +# Maya Specific Shader Mapping # +# ++++++++++++++++++++++++++++++++++++++++++++++++# + +if __name__ == '__main__': + print(len(sys.argv)) + print(sys.argv[5]) + # arg_values = sys.argv[5].split(',') + # scene_information = [] + # for value in arg_values: + # print(value) + # scene_information.append(value) + # initialize_scene(scene_information) +# instance = BlenderMaterials(file_list, total_material_count) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/dcc_material_mapping.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/dcc_material_mapping.py new file mode 100644 index 0000000000..c6e9152531 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/dcc_material_mapping.py @@ -0,0 +1,60 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +import logging + + +logging.basicConfig(level=logging.DEBUG) + + +def get_maya_material_mapping(name, material_type, file_connections): + material_properties = {} + if material_type == 'StingrayPBS': + print('Mapping StingrayPBS') + maps = 'color, metallic, roughness, normal, emissive, ao, opacity'.split(', ') + naming_exceptions = {'color': 'baseColor', 'ao': 'ambientOcclusion'} + for m in maps: + texture_attribute = 'TEX_{}_map'.format(m) + for tex in file_connections.keys(): + if tex.find(texture_attribute) != -1: + key = m if m not in naming_exceptions else naming_exceptions.get(m) + logging.debug('Key, Value: {} {}.{}'.format(key, name, texture_attribute)) + material_properties[key] = {'useTexture': 'true', + 'textureMap': file_connections.get( + '{}.{}'.format(name, texture_attribute))} + elif material_type == 'aiStandardSurface': + print('Mapping AiStandardSurface') + # TODO- Occlusion is based on a more difficult setup- there is no standard channel. Set this up as time permits + maps = 'baseColor, metalness, specularRoughness, normal, emissionColor, opacity'.split(', ') + naming_exceptions = {'metalness': 'metallic', 'specularRoughness': 'roughness', 'emissionColor': 'emissive'} + for m in maps: + key = m if m not in naming_exceptions.keys() else naming_exceptions.get(m) + texture_attribute = m + for tex in file_connections.keys(): + if tex.find(texture_attribute) != -1: + logging.debug('Key, Value: {} {}.{}'.format(key, name, texture_attribute)) + material_properties[key] = {'useTexture': 'true', + 'textureMap': file_connections.get( + '{}.{}'.format(name, texture_attribute))} + else: + pass + + return material_properties + + +def get_blender_material_mapping(name, material_type, file_connections): + pass + + +def get_max_material_mapping(name, material_type, file_connections): + pass + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/drag_and_drop.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/drag_and_drop.py new file mode 100644 index 0000000000..f14e07531d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/drag_and_drop.py @@ -0,0 +1,68 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +from PySide2 import QtWidgets, QtCore +from PySide2.QtCore import Signal + + +class DragAndDrop(QtWidgets.QWidget): + drop_update = QtCore.Signal(list) + drop_over = QtCore.Signal(bool) + + def __init__(self, frame_color=None, highlight=None, parent=None): + super(DragAndDrop, self).__init__(parent) + + self.urls = [] + self.frame_color = frame_color + self.frame_highlight = highlight + self.setContentsMargins(0, 0, 0, 0) + self.setAcceptDrops(True) + + self.drag_and_drop_frame = QtWidgets.QFrame(self) + self.drag_and_drop_frame.setGeometry(0, 0, 5000, 5000) + self.drag_and_drop_frame.setStyleSheet('background-color:rgb({});'.format(self.frame_color)) + + def dragEnterEvent(self, e): + if e.mimeData().hasUrls: + e.accept() + self.drop_over.emit(True) + if self.frame_highlight: + self.drag_and_drop_frame.setStyleSheet('background-color:rgb({});'.format(self.frame_highlight)) + else: + e.ignore() + + def dragLeaveEvent(self, e): + self.drop_over.emit(False) + + if self.frame_highlight: + self.drag_and_drop_frame.setStyleSheet('background-color:rgb({});'.format(self.frame_color)) + + + def dragMoveEvent(self, e): + if e.mimeData().hasUrls: + e.accept() + else: + e.ignore() + + def dropEvent(self, e): + if e.mimeData().hasUrls: + e.setDropAction(QtCore.Qt.CopyAction) + e.accept() + + for url in e.mimeData().urls(): + file_name = str(url.toLocalFile()) + self.urls.append(file_name) + self.drop_update.emit(self.urls) + if self.frame_highlight: + self.drag_and_drop_frame.setStyleSheet('background-color:rgb({});'.format(self.frame_color)) + else: + e.ignore() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/img/lumberyard_logo.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/img/lumberyard_logo.png new file mode 100644 index 0000000000..56cb3c8931 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/img/lumberyard_logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a78856a5dddee1466183f56dad21148dcf2f093fb316f4aa3af6842912fff61 +size 8087 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/main.py new file mode 100644 index 0000000000..c9a29d6c0c --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/main.py @@ -0,0 +1,957 @@ +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +""" +Usage +===== +Put usage instructions here. + +Output +====== +Put output information here. + +Notes: +In order to run this, you'll need to verify that the "mayapy_path" class attribute corresponds to the location on +your machine. Currently I've just included mapping instructions for Maya StingrayPBS materials, although most of +the needed elements are in place to carry out additional materials inside of Maya pretty quickly moving forward. +I've marked areas that still need refinement (or to be added altogether) with TODO comments + +TODO- Add command line access (Be sure to use pathlib and box libraries) +TODO- Docstrings need work... wanted to get descriptions in but they need to be set for Sphinx +TODO- Add Blender and 3ds Max interoperability +Links: +https://blender.stackexchange.com/questions/100497/use-blenders-bpy-in-projects-outside-blender +https://knowledge.autodesk.com/support/3ds-max/learn-explore/caas/CloudHelp/cloudhelp/2019/ENU/3DSMax-Batch/files/GUID-0968FF0A-5ADD-454D-B8F6-1983E76A4AF9-htm.html + +TODO- Look at dynaconf and wire in a solid means for configuration settings +TODO- This hasn't been "designed"- might be worth it to consider the visual design to ensure the most effective and + attractive UI +TODO- Allow revisions to Model +TODO- Create several test files from different DCC Applications with different materials + +Reading FBX file information (might come in handy later) +-- Materials information can be extracted from ASCII fbx pretty easily, binary is possible but more difficult +-- FBX files could be exported as ASCII files and I could use regex there to extract material information +-- I couldn't get pyfbx_i42 to work, but purportedly it can extract information from binary files. You may just have +to use the specified python versions +""" +import logging +import subprocess +import json +import sys +import os +import re + +from PySide2 import QtWidgets, QtCore, QtGui +from PySide2.QtCore import Slot +from PySide2.QtWidgets import QApplication + +from dcc_materials.model import MaterialsModel +from dcc_materials.drag_and_drop import DragAndDrop +import dcc_materials.dcc_material_mapping as mat_map + + +class MaterialsToLumberyard(QtWidgets.QWidget): + def __init__(self, parent=None): + super(MaterialsToLumberyard, self).__init__(parent) + + self.app = QtWidgets.QApplication.instance() + self.setWindowFlags(QtCore.Qt.Window) + self.setGeometry(50, 50, 800, 520) + self.setObjectName('MaterialsToLumberyard') + self.setWindowTitle(' ') + self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMinMaxButtonsHint) + self.isTopLevel() + + self.desktop_location = os.path.join(os.path.expanduser('~'), 'Desktop') + self.directory_path = os.path.dirname(os.path.abspath(__file__)) + self.lumberyard_materials_directory = os.path.join(self.desktop_location, 'LumberyardMaterials') + self.mayapy_path = os.path.abspath("C:/Program Files/Autodesk/Maya2020/bin/mayapy.exe") + self.blender_path = self.get_blender_path() + self.bold_font_large = QtGui.QFont('Helvetica', 7, QtGui.QFont.Bold) + self.medium_font = QtGui.QFont('Helvetica', 7, QtGui.QFont.Normal) + self.blessed_file_extensions = 'ma mb fbx max blend'.split(' ') + + self.dcc_materials_dictionary = {} + self.lumberyard_materials_dictionary = {} + self.lumberyard_material_nodes = [] + self.target_file_list = [] + self.current_scene = None + self.model = None + self.total_materials = 0 + + self.main_container = QtWidgets.QVBoxLayout(self) + self.main_container.setContentsMargins(0, 0, 0, 0) + self.main_container.setAlignment(QtCore.Qt.AlignTop) + self.setLayout(self.main_container) + self.content_layout = QtWidgets.QVBoxLayout() + self.content_layout.setAlignment(QtCore.Qt.AlignTop) + self.content_layout.setContentsMargins(10, 3, 10, 5) + self.main_container.addLayout(self.content_layout) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Header Bar + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.header_bar_layout = QtWidgets.QHBoxLayout() + self.lumberyard_logo_layout = QtWidgets.QHBoxLayout() + self.lumberyard_logo_layout.setAlignment(QtCore.Qt.AlignLeft) + logo_path = os.path.join(self.directory_path, 'img/lumberyard_logo.png') + logo_pixmap = QtGui.QPixmap(logo_path) + self.lumberyard_logo = QtWidgets.QLabel() + self.lumberyard_logo.setPixmap(logo_pixmap) + self.lumberyard_logo_layout.addWidget(self.lumberyard_logo) + self.header_bar_layout.addLayout(self.lumberyard_logo_layout) + + self.switch_combobox_layout = QtWidgets.QHBoxLayout() + self.switch_combobox_layout.setAlignment(QtCore.Qt.AlignRight) + self.switch_layout_combobox = QtWidgets.QComboBox() + self.set_combobox_items_accessibility() + self.switch_layout_combobox.setFixedSize(250, 30) + self.combobox_items = ['Add Source Files', 'Source File List', 'DCC Material Values', 'Export Materials'] + self.switch_layout_combobox.setStyleSheet('QComboBox {padding-left:6px;}') + self.switch_layout_combobox.addItems(self.combobox_items) + self.switch_combobox_layout.addWidget(self.switch_layout_combobox) + self.header_bar_layout.addLayout(self.switch_combobox_layout) + + self.content_layout.addSpacing(5) + self.content_layout.addLayout(self.header_bar_layout) + + # ++++++++++++++++++++++++++++++++++++++++++++++++# + # File Source Table / Attributes (Stacked Layout) # + # ++++++++++++++++++++++++++++++++++++++++++++++++# + + self.content_stacked_layout = QtWidgets.QStackedLayout() + self.content_layout.addLayout(self.content_stacked_layout) + self.switch_layout_combobox.currentIndexChanged.connect(self.layout_combobox_changed) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Add Source Files + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + frame_color_value = '75,75,75' + highlight_color_value = '20,106,30' + self.drag_and_drop_widget = DragAndDrop(frame_color_value, highlight_color_value) + self.drag_and_drop_widget.drop_update.connect(self.drag_and_drop_file_update) + self.drag_and_drop_widget.drop_over.connect(self.drag_and_drop_over) + self.drag_and_drop_layout = QtWidgets.QVBoxLayout() + self.drag_and_drop_layout.setContentsMargins(0, 0, 0, 0) + self.drag_and_drop_layout.setAlignment(QtCore.Qt.AlignCenter) + self.drag_and_drop_widget.setLayout(self.drag_and_drop_layout) + + start_message = 'Drag source files here, or use file browser button below to get started.' + self.drag_and_drop_label = QtWidgets.QLabel(start_message) + self.drag_and_drop_label.setStyleSheet('color: white;') + self.drag_and_drop_layout.addWidget(self.drag_and_drop_label) + self.drag_and_drop_layout.addSpacing(10) + + self.select_files_button_layout = QtWidgets.QHBoxLayout() + self.select_files_button_layout.setAlignment(QtCore.Qt.AlignCenter) + self.select_files_button = QtWidgets.QPushButton('Select Files') + self.select_files_button_layout.addWidget(self.select_files_button) + self.select_files_button.clicked.connect(self.select_files_button_clicked) + self.select_files_button.setFixedSize(80, 35) + self.drag_and_drop_layout.addLayout(self.select_files_button_layout) + self.content_stacked_layout.addWidget(self.drag_and_drop_widget) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Files Table + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.target_files_table = QtWidgets.QTableWidget() + self.target_files_table.setFocusPolicy(QtCore.Qt.NoFocus) + self.target_files_table.setColumnCount(2) + self.target_files_table.setAlternatingRowColors(True) + self.target_files_table.setHorizontalHeaderLabels(['File List', '']) + self.target_files_table.horizontalHeader().setStyleSheet('QHeaderView::section {background-color: rgb(220, 220, 220); padding-top:7px; padding-left:5px;}') + self.target_files_table.verticalHeader().hide() + files_header = self.target_files_table.horizontalHeader() + files_header.setFixedHeight(30) + files_header.setDefaultAlignment(QtCore.Qt.AlignLeft) + files_header.setContentsMargins(10, 10, 0, 0) + files_header.setDefaultSectionSize(60) + files_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + files_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Fixed) + self.target_files_table.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.content_stacked_layout.addWidget(self.target_files_table) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Scene Information Table + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.material_tree_view = QtWidgets.QTreeView() + self.headers = ['Key', 'Value'] + self.material_tree_view.setStyleSheet('QTreeView::item {height:25px;} QHeaderView::section {background-color: rgb(220, 220, 220); height:30px; padding-left:10px}') + self.material_tree_view.setFocusPolicy(QtCore.Qt.NoFocus) + self.material_tree_view.setAlternatingRowColors(True) + self.material_tree_view.setUniformRowHeights(True) + self.content_stacked_layout.addWidget(self.material_tree_view) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> LY Material Definitions + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.lumberyard_material_definitions_widget = QtWidgets.QWidget() + self.lumberyard_material_definitions_layout = QtWidgets.QHBoxLayout(self.lumberyard_material_definitions_widget) + self.lumberyard_material_definitions_layout.setSpacing(0) + self.lumberyard_material_definitions_layout.setContentsMargins(0, 0, 0, 0) + self.lumberyard_material_definitions_frame = QtWidgets.QFrame(self.lumberyard_material_definitions_widget) + self.lumberyard_material_definitions_frame.setGeometry(0, 0, 5000, 5000) + self.lumberyard_material_definitions_frame.setStyleSheet('background-color:rgb(75,75,75);') + self.lumberyard_material_definitions_scroller = QtWidgets.QScrollArea() + self.scroller_widget = QtWidgets.QWidget() + self.scroller_layout = QtWidgets.QVBoxLayout() + self.scroller_widget.setLayout(self.scroller_layout) + self.lumberyard_material_definitions_scroller.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) + self.lumberyard_material_definitions_scroller.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.lumberyard_material_definitions_scroller.setWidgetResizable(True) + self.lumberyard_material_definitions_scroller.setWidget(self.scroller_widget) + self.lumberyard_material_definitions_layout.addWidget(self.lumberyard_material_definitions_scroller) + self.content_stacked_layout.addWidget(self.lumberyard_material_definitions_widget) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> File processing buttons + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.process_files_layout = QtWidgets.QHBoxLayout() + self.content_layout.addLayout(self.process_files_layout) + self.process_files_button = QtWidgets.QPushButton('Process Added Files') + self.process_files_button.setFixedHeight(50) + self.process_files_button.clicked.connect(self.process_listed_files_clicked) + self.process_files_layout.addWidget(self.process_files_button) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Status bar / Loader + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + # TODO- Move all processing of files to another thread and display progress with loader + + self.status_bar = QtWidgets.QStatusBar() + self.status_bar.setStyleSheet('background-color: rgb(220, 220, 220);') + self.status_bar.setContentsMargins(0, 0, 0, 0) + self.status_bar.setSizeGripEnabled(False) + self.message_readout_label = QtWidgets.QLabel('Ready.') + self.message_readout_label.setStyleSheet('padding-left: 10px') + self.status_bar.addWidget(self.message_readout_label) + + self.progress_bar = QtWidgets.QProgressBar() + self.progress_bar_widget = QtWidgets.QWidget() + self.progress_bar_widget_layout = QtWidgets.QHBoxLayout() + self.progress_bar_widget_layout.setContentsMargins(0, 0, 0, 0) + self.progress_bar_widget_layout.setAlignment(QtCore.Qt.AlignRight) + self.progress_bar_widget.setLayout(self.progress_bar_widget_layout) + self.status_bar.addPermanentWidget(self.progress_bar_widget) + self.progress_bar_widget_layout.addWidget(self.progress_bar) + self.progress_bar.setFixedSize(180, 20) + self.main_container.addWidget(self.status_bar) + + ############################ + # UI Display Layers ######## + ############################ + + def populate_source_files_table(self): + """ + Adds selected files from the 'Source Files' section of the UI. This creates each item listing in the table + as well as adds a 'Remove' button that will clear corresponding item from the table. Processed files will + get color coded, based on whether or not the materials in the file could be successfully processed. Subsequent + searches will not clear items from the table currently, as each item acts as a register of materials that have + and have not yet been processed. + :return: + """ + self.target_files_table.setRowCount(0) + for index, entry in enumerate(self.target_file_list): + entry = entry[1] if type(entry) == list else entry + self.target_files_table.insertRow(index) + item = QtWidgets.QTableWidgetItem(' {}'.format(entry)) + self.target_files_table.setRowHeight(index, 45) + remove_button = QtWidgets.QPushButton('Remove') + remove_button.setFixedWidth(60) + remove_button.clicked.connect(self.remove_source_file_clicked) + self.target_files_table.setItem(index, 0, item) + self.target_files_table.setCellWidget(index, 1, remove_button) + + def populate_dcc_material_values_tree(self): + """ + Sets the materials model class to the file attribute tree. + :return: + """ + + # TODO- Create mechanism for collapsing previously gathered materials, and or pushing them further down the list + + self.material_tree_view.setModel(self.model) + self.material_tree_view.expandAll() + self.material_tree_view.resizeColumnToContents(0) + + def populate_export_materials_list(self): + """ + Once all materials have been analyzed inside of DCC applications, the 'Export Materials' view lists all + materials presented as their Lumberyard counterparts. Each listing displays a representation of the material + file based on its corresponding DCC material values and file connections. + :return: + """ + self.reset_export_materials_description() + for count, value in enumerate(self.lumberyard_materials_dictionary): + material_definition_node = MaterialNode([value, self.lumberyard_materials_dictionary[value]], count) + self.lumberyard_material_nodes.append(material_definition_node) + self.scroller_layout.addWidget(material_definition_node) + self.scroller_layout.addLayout(self.create_separator_line()) + + ############################ + # TBD ######## + ############################ + + def process_file_list(self): + """ + The entry point for reading DCC files and extracting values. Files are filtered and separated + by DCC app (based on file extensions) before processing is done. + + Supported DCC applications: + Maya (.ma, .mb, .fbx), 3dsMax(.max), Blender(.blend) + :return: + """ + files_dict = {'maya': [], 'max': [], 'blender': [], 'na': []} + for file_location in self.target_file_list: + file_name = os.path.basename(str(file_location)) + file_extension = os.path.splitext(file_name)[1] + target_application = self.get_target_application(file_extension) + if target_application in files_dict.keys(): + files_dict[target_application].append(file_location) + + for key, values in files_dict.items(): + try: + if key == 'maya' and len(values): + self.get_maya_material_values(values) + elif key == 'max' and len(values): + self.get_max_material_values(values) + elif key == 'blender' and len(values): + self.get_blender_material_values(values) + else: + pass + except Exception as e: + # TODO- Allow corrective actions or some display of errors if this fails? + logging.warning('Could not process files. Error: {}'.format(e)) + + if self.dcc_materials_dictionary: + self.set_transfer_status(self.dcc_materials_dictionary) + # Create Model with extracted values from file list + self.set_material_model() + # Setup Lumberyard Material File Values + self.set_export_materials_description() + # Update UI Layout + self.populate_export_materials_list() + self.switch_layout_combobox.setCurrentIndex(3) + self.set_ui_buttons() + self.message_readout_label.setText('Ready.') + + def reset_export_materials_description(self): + pass + + def reset_all_values(self): + pass + + def create_separator_line(self): + """ Convenience function for adding separation line to the UI. """ + layout = QtWidgets.QHBoxLayout() + line = QtWidgets.QLabel() + line.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + line.setLineWidth(1) + line.setFixedHeight(10) + layout.addWidget(line) + layout.setContentsMargins(8, 0, 8, 0) + return layout + + def export_selected_materials(self): + """ + This will eventually be revised to save material definitions in the proper place in the user's project folder, + but for now material definitions will be saved to the desktop. + :return: + """ + if not os.path.exists(self.lumberyard_materials_directory): + os.makedirs(self.lumberyard_materials_directory) + + for node in self.lumberyard_material_nodes: + if node.material_name_checkbox.isChecked(): + output = os.path.join(self.lumberyard_materials_directory, '{}.material'.format(node.material_name)) + with open(output, 'w', encoding='utf-8') as material_file: + json.dump(node.material_info, material_file, ensure_ascii=False, indent=4) + + ############################ + # Getters/Setters ########## + ############################ + + @staticmethod + def get_target_application(file_extension): + """ + Searches compatible file extensions and returns one of three Application names- Maya, 3dsMax, or Blender. + :param file_extension: Passed file extension used to determine DCC Application it originated from. + :return: Returns the application corresponding to the extension if found- otherwise returns a Boolean None + """ + app_extensions = {'maya': ['.ma', '.mb', '.fbx'], 'max': ['.max'], 'blender': ['.blend']} + target_dcc_application = [key for key, values in app_extensions.items() if file_extension in values] + if target_dcc_application: + return target_dcc_application[0] + return None + + @staticmethod + def get_lumberyard_material_template(shader_type): + """ + Loads material descriptions from the Lumberyard installation, providing a template to compare and convert DCC + shaders to Lumberyard material definitions. This is the first step in the comparison. The second step is to + compare these values with specific mapping instructions for DCC Application and DCC material type to arrive at + a converted material. + :param shader_type: The type of Lumberyard shader to pair material attributes to (i.e. PBR Shader) + :return: File dictionary of the available boilerplate Lumberyard shader settings. + """ + definitions = os.path.join(os.path.dirname(os.path.abspath(__file__)), '{}.material'.format(shader_type)) + if os.path.exists(definitions): + with open(definitions) as f: + return json.load(f) + + @staticmethod + def get_lumberyard_material_properties(name, dcc_app, material_type, file_connections): + """ + This system will probably need rethinking if DCCs and compatible materials grow. I've tried to keep this + flexible so that it can be expanded with more apps and materials. + + :param name: Material name from within the DCC application + :param dcc_app: The application that the material was sourced from + :param material_type: DCC material type + :param file_connections: Texture files found attached to the materials + """ + + material_properties = {} + if dcc_app == 'Maya': + material_properties = mat_map.get_maya_material_mapping(name, material_type, file_connections) + elif dcc_app == 'Blender': + material_properties = mat_map.get_blender_material_mapping(name, material_type, file_connections) + elif dcc_app == '3dsMax': + material_properties = mat_map.get_max_material_mapping(name, material_type, file_connections) + else: + pass + return material_properties + + @staticmethod + def get_filename_increment(name): + """ + Convenience function that assists in ensuring that if any materials are encountered with the same name, an + underscore and number is appended to it to prevent overwrites. + :param name: The name of the material. The function searches the string for increment numbers, and either adds + one to any encountered, or adds an "_1" if passed name is the first duplicate encountered. + :return: The adjusted name with a unique incremental value. + """ + last_number = re.compile(r'(?:[^\d]*(\d+)[^\d]*)+') + number_found = last_number.search(name) + if number_found: + next_number = str(int(number_found.group(1)) + 1) + start, end = number_found.span(1) + name = name[:max(end - len(next_number), start)] + next_number + name[end:] + return name + + def get_maya_material_values(self, target_files): + """ + Launches Maya Standalone and processes list of materials for each scene passed to the 'target_files' argument. + Also sets the environment paths needed for an instance of Maya's Python distribution. After files are processed + a single dictionary of scene materials is returned, and added to the "materials_dictionary" scene attribute. + :param target_files: List of files filtered from total list of files requested for processing that have a + Maya file extension + :return: + """ + + # TODO- Set load process to a separate thread and wire load progress bar up + + try: + script_path = str(os.path.join(self.directory_path, 'maya_materials.py')) + target_files.append(self.total_materials) + runtime_env = os.environ.copy() + runtime_env['MAYA_LOCATION'] = os.path.dirname(self.mayapy_path) + runtime_env['PYTHONPATH'] = os.path.dirname(self.mayapy_path) + command = f'{self.mayapy_path} "{script_path}"' + for file in target_files: + command += f' "{file}"' + p = subprocess.Popen(command, shell=False, env=runtime_env, stdout=subprocess.PIPE) + output = p.communicate()[0] + self.set_material_dictionary(json.loads(output)) + except Exception as e: + logging.warning('maya error: {}'.format(e)) + + def get_max_material_values(self, target_files): + logging.debug('Max Target file: {}'.format(target_files)) + + def get_blender_material_values(self, target_files): + logging.debug('Blender Target file: {}'.format(target_files)) + + script_path = str(os.path.join(self.directory_path, 'blender_materials.py')) + # command = f'{self.blender_path} "{script_path}" "{target_files}" "{self.total_materials}"' + # p = subprocess.Popen(command, shell=True, env=runtime_env, stdout=subprocess.PIPE) + + target_files.append(self.total_materials) + + p = subprocess.Popen([self.blender_path, '--background', '--python', script_path, '--', target_files]) + output = p.communicate()[0] + self.set_material_dictionary(json.loads(output)) + + def get_blender_path(self): + blender_base_directory = os.path.join(os.path.join('C:\\', 'Program Files', 'Blender Foundation')) + blender_versions_found = [] + for (dirpath, dirnames, filenames) in os.walk(blender_base_directory): + for filename in filenames: + if filename == 'blender.exe': + blender_versions_found.append(os.path.join(dirpath, filename)) + + if blender_versions_found: + return max(blender_versions_found, key=os.path.getctime) + else: + return None + + def set_combobox_items_accessibility(self): + """ + Locks items from within the combobox until the sections they connect to have content + :return: + """ + # TODO- Add this functionality + pass + + def set_transfer_status(self, transfer_info): + """ + Colorizes listings in the 'Source Files' view of the UI after processing to green or red, indicating whether or + not scene analysis successfully returned compatible materials and their values. + :param transfer_info: Each file the scripts attempt to process return a receipt of the success or failure of + the analysis. + :return: + """ + # TODO- Include some way to get error information if analysis fails, and potentially offer the means to + # effectively repair values as they mat_map to intended Lumberyard shader type + + for row in range(self.target_files_table.rowCount()): + for key, values in transfer_info.items(): + row_path = self.target_files_table.item(row, 0).text().strip() + scene_processed = {x for x in transfer_info if values['SceneName'] == row_path} + if scene_processed: + self.target_files_table.item(row, 0).setBackground(QtGui.QColor(192, 255, 171)) + break + else: + self.target_files_table.item(row, 0).setBackground(QtGui.QColor(255, 177, 171)) + + def set_export_materials_description(self): + root = self.model.rootItem + for row in range(self.model.rowCount()): + source_file = self.model.get_attribute_value('SceneName', root.child(row)) + name = self.model.get_attribute_value('MaterialName', root.child(row)) + material_type = self.model.get_attribute_value('MaterialType', root.child(row)) + dcc_app = self.model.get_attribute_value('DccApplication', root.child(row)) + file_connections = {} + shader_attributes = {} + + for childIndex in range(root.child(row).childCount()): + child_item = root.child(row).child(childIndex) + child_value = child_item.itemData + if child_item.childCount(): + target_dict = file_connections if child_value[0] == 'FileConnections' else shader_attributes + for subChildIndex in range(child_item.childCount()): + sub_child_data = child_item.child(subChildIndex).itemData + target_dict[sub_child_data[0]] = sub_child_data[1] + self.set_material_description(source_file, name, dcc_app, material_type, file_connections) + + def set_material_dictionary(self, dcc_dictionary): + """ + Adds all material descriptions pulled from each DCC file analyzed to the "materials_dictionary" class attribute. + This function runs each time a subprocess is launched to gather DCC application material values. + :param dcc_dictionary: The dictionary of values for each material analyzed by each specific DCC file list + return analyzed values + :return: + """ + logging.debug('DCC Dictionary: {}'.format(json.dumps(dcc_dictionary, indent=4))) + self.total_materials += len(dcc_dictionary) + self.dcc_materials_dictionary.update(dcc_dictionary) + + def set_material_model(self, initialize=True): + """ + Once all materials have been gathered across a selected file set query, this organizes the values into a + QT Model Class + :param initialize: Default is set to boolean True. If a model has already been established in the current + session, the initialize parameter would be set to false, and the values added to the Model. All changes to + the model would then be redistributed to other informational views in the UI. + :return: + """ + if initialize: + self.model = MaterialsModel(self.headers, self.dcc_materials_dictionary) + else: + self.model.update() + self.dcc_materials_dictionary.clear() + self.populate_dcc_material_values_tree() + + def set_ui_buttons(self): + """ + Handles UI buttons for each of the three stacked layout views (Source Files, DCC Material Values, + Export Materials) + :return: + """ + display_index = self.content_stacked_layout.currentIndex() + self.switch_layout_combobox.setEnabled(True) + self.process_files_button.setText('Process Listed Files') + # Add Source Files Layout ------------------------------->> + if display_index == 0: + self.process_files_button.setEnabled(True) + + # Source File List -------------------------------------->> + elif display_index == 1: + self.process_files_button.setEnabled(True) + + # DCC Material Values Layout ---------------------------->> + elif display_index == 2: + self.process_files_button.setEnabled(False) + + # Export Materials Layout ------------------------------->> + else: + self.process_files_button.setText('Export Selected Materials') + if self.lumberyard_materials_dictionary: + self.process_files_button.setEnabled(True) + + def set_material_description(self, source_file, name, dcc_app, material_type, file_connections): + """ + Build dictionary for material description based on extracted values + + :param source_file: The file that the material was extracted from + :param name: Name of material + :param dcc_app: Source file type of material (Maya, Blender or 3ds Max) + :param material_type: Material type within app (i.e. Stingray PBS) + :param file_connections: Texture files found connected to the shader + :return: + """ + + default_settings = self.get_lumberyard_material_template('pbr') + material = {'sourceFile': source_file, + 'description': name, + 'materialType': default_settings.get('materialType'), + 'parentMaterial': default_settings.get('parentMaterial'), + 'propertyLayoutVersion': default_settings.get('propertyLayoutVersion'), + 'properties': self.get_lumberyard_material_properties(name, dcc_app, material_type, file_connections)} + self.lumberyard_materials_dictionary[name if name not in self.lumberyard_materials_dictionary.keys() else + self.get_filename_increment(name)] = material + + ############################ + # Button Actions ########### + ############################ + + def remove_source_file_clicked(self): + """ + In the Source File view of the UI layout, this will remove the listed file in its respective row. If files + have not been processed yet, it prevents that file from being analyzed. If the files have already been + analyzed, this will remove the materials from stored values. + :return: + """ + file_index = self.target_files_table.indexAt(self.sender().pos()) + del self.target_file_list[file_index.row()] + self.populate_files_table() + + def process_listed_files_clicked(self): + """ + The button serves a dual purpose, depending on the current layout of the window. 'Process listed files' + initiates the DCC file analysis that extracts material information. In the "Export Materials" layout, this + button (for now) will export material files corresponding to each analyzed material. + :return: + """ + + # TODO- Need to decide how the materials are going to be routed. At this stage they will just be saved to the + # desktop, but I assume that we want these files to be saved to an associated project folder + + if self.sender().text() == 'Process Added Files': + self.message_readout_label.setText('Gathering Material Information...') + self.app.processEvents() + self.process_file_list() + else: + self.export_selected_materials() + + def select_files_button_clicked(self): + """ + This dialog allows user to select DCC files to be processed for the materials present for conversion. + :return: + """ + + # TODO- Eventually it might be worth it to allow files from multiple locations to be selected. Currently + # this only allows single/multiple files from a single directory to be selected. + + dialog = QtWidgets.QFileDialog(self, 'Shift-Select Target Files', self.desktop_location) + dialog.setFileMode(QtWidgets.QFileDialog.ExistingFile) + dialog.setNameFilter('Compatible Files (*.ma *.mb *.fbx *.max *.blend)') + dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True) + file_view = dialog.findChild(QtWidgets.QListView, 'listView') + + # Workaround for selecting multiple files with File Dialog + if file_view: + file_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + f_tree_view = dialog.findChild(QtWidgets.QTreeView) + if f_tree_view: + f_tree_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + + if dialog.exec_() == QtWidgets.QDialog.Accepted: + self.target_file_list += dialog.selectedFiles() + if self.target_file_list: + self.populate_source_files_table() + self.process_files_button.setEnabled(True) + + def layout_combobox_changed(self): + """ + Handles main window layout combobox index change. + :return: + """ + self.content_stacked_layout.setCurrentIndex(self.switch_layout_combobox.currentIndex()) + self.set_ui_buttons() + + def reset_clicked(self): + """ + Brings the application and all variables back to their initial state. + :return: + """ + self.reset_all_values() + + ############################ + # Slots #################### + ############################ + + @Slot(list) + def drag_and_drop_file_update(self, file_list): + for file in file_list: + if os.path.basename(file).split('.')[-1] in self.blessed_file_extensions: + self.target_file_list.append(file) + self.drag_and_drop_widget.urls.clear() + self.populate_source_files_table() + self.message_readout_label.setText('Source files added: {}'.format(len(self.target_file_list))) + self.drag_and_drop_label.setStyleSheet('color: white;') + + @Slot(bool) + def drag_and_drop_over(self, is_over): + if is_over: + self.drag_and_drop_label.setStyleSheet('color: rgb(0, 255, 0);') + else: + self.drag_and_drop_label.setStyleSheet('color: white;') + + +class MaterialNode(QtWidgets.QWidget): + def __init__(self, material_info, current_position, parent=None): + super(MaterialNode, self).__init__(parent) + + self.material_name = material_info[0] + self.material_info = material_info[1] + self.current_position = current_position + self.property_settings = {} + + self.small_font = QtGui.QFont("Helvetica", 7, QtGui.QFont.Bold) + self.bold_font = QtGui.QFont("Helvetica", 8, QtGui.QFont.Bold) + self.main_layout = QtWidgets.QVBoxLayout() + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(self.main_layout) + + self.background_frame = QtWidgets.QFrame(self) + self.background_frame.setGeometry(0, 0, 5000, 5000) + self.background_frame.setStyleSheet('background-color:rgb(220, 220, 220);') + + # ######################## + # Title Bar + # ######################## + + self.title_bar_widget = QtWidgets.QWidget() + self.title_bar_layout = QtWidgets.QHBoxLayout(self.title_bar_widget) + self.title_bar_layout.setContentsMargins(10, 0, 10, 0) + self.title_bar_layout.setAlignment(QtCore.Qt.AlignTop) + self.title_bar_frame = QtWidgets.QFrame(self.title_bar_widget) + self.title_bar_frame.setGeometry(0, 0, 5000, 40) + self.title_bar_frame.setStyleSheet('background-color:rgb(193,154,255);') + self.main_layout.addWidget(self.title_bar_widget) + self.material_name_checkbox = QtWidgets.QCheckBox(self.material_name) + self.material_name_checkbox.setFixedHeight(35) + self.material_name_checkbox.setStyleSheet('spacing:10px; color:white') + self.material_name_checkbox.setFont(self.bold_font) + self.material_name_checkbox.setChecked(True) + self.title_bar_layout.addWidget(self.material_name_checkbox) + + self.material_file_layout = QtWidgets.QHBoxLayout() + self.material_file_layout.setAlignment(QtCore.Qt.AlignRight) + self.source_file = QtWidgets.QLabel(os.path.basename(self.material_info['sourceFile'])) + self.source_file.setStyleSheet('color:white;') + self.source_file.setFont(self.small_font) + self.material_file_layout.addWidget(self.source_file) + self.material_file_layout.addSpacing(10) + + self.edit_button = QtWidgets.QPushButton('Edit') + self.edit_button.clicked.connect(self.edit_button_clicked) + self.edit_button.setFixedWidth(55) + self.material_file_layout.addWidget(self.edit_button) + self.title_bar_layout.addLayout(self.material_file_layout) + + self.information_layout = QtWidgets.QHBoxLayout() + self.information_layout.setContentsMargins(10, 0, 10, 10) + self.main_layout.addLayout(self.information_layout) + + # ######################## + # Details layout + # ######################## + + self.details_layout = QtWidgets.QVBoxLayout() + self.details_layout.setAlignment(QtCore.Qt.AlignTop) + self.details_groupbox = QtWidgets.QGroupBox("Details") + self.details_groupbox.setFixedWidth(200) + self.details_groupbox.setStyleSheet("QGroupBox {font:bold; border: 1px solid silver; " + "margin-top: 6px;} QGroupBox::title { color: rgb(150, 150, 150); " + "subcontrol-position: top left;}") + self.details_layout.addSpacing(15) + self.material_type_label = QtWidgets.QLabel('Material Type') + self.material_type_label.setStyleSheet('padding-left: 6px; color: white; background-color:rgb(175, 175, 175);') + self.material_type_label.setFixedHeight(25) + self.material_type_label.setFont(self.bold_font) + self.details_layout.addWidget(self.material_type_label) + + self.material_type_combobox = QtWidgets.QComboBox() + self.material_type_combobox.setFixedHeight(30) + self.material_type_combobox.setStyleSheet('QCombobox QAbstractItemView { padding-left: 15px; }') + material_type_items = [' Standard PBR'] + self.material_type_combobox.addItems(material_type_items) + self.details_layout.addWidget(self.material_type_combobox) + self.details_layout.addSpacing(10) + + self.description_label = QtWidgets.QLabel('Description') + self.description_label.setStyleSheet('padding-left: 6px; color: white; background-color:rgb(175, 175, 175);') + self.description_label.setFixedHeight(25) + self.description_label.setFont(self.bold_font) + self.details_layout.addWidget(self.description_label) + + self.description_box = QtWidgets.QTextEdit('This space is reserved for additional information.') + self.details_layout.addWidget(self.description_box) + self.information_layout.addWidget(self.details_groupbox) + self.details_groupbox.setLayout(self.details_layout) + + # ######################## + # Properties layout + # ######################## + + self.properties_layout = QtWidgets.QVBoxLayout() + self.properties_layout.setAlignment(QtCore.Qt.AlignTop) + self.properties_groupbox = QtWidgets.QGroupBox("Properties") + self.properties_groupbox.setFixedWidth(150) + self.properties_groupbox.setStyleSheet("QGroupBox {font:bold; border: 1px solid silver; " + "margin-top: 6px;} QGroupBox::title { color: rgb(150, 150, 150); " + "subcontrol-position: top left;}") + self.properties_list_widget = QtWidgets.QListWidget() + self.material_properties = ['ambientOcclusion', 'baseColor', 'emissive', 'metallic', 'roughness', 'specularF0', + 'normal', 'opacity'] + self.properties_list_widget.addItems(self.material_properties) + self.properties_list_widget.itemSelectionChanged.connect(self.property_selection_changed) + self.properties_layout.addSpacing(15) + self.properties_layout.addWidget(self.properties_list_widget) + self.information_layout.addWidget(self.properties_groupbox) + self.properties_groupbox.setLayout(self.properties_layout) + + # ######################## + # Attributes layout + # ######################## + + self.attributes_layout = QtWidgets.QVBoxLayout() + self.attributes_layout.setAlignment(QtCore.Qt.AlignTop) + self.attributes_groupbox = QtWidgets.QGroupBox("Attributes") + self.attributes_groupbox.setStyleSheet("QGroupBox {font:bold; border: 1px solid silver; " + "margin-top: 6px;} QGroupBox::title { color: rgb(150, 150, 150); " + "subcontrol-position: top left;}") + self.information_layout.addWidget(self.attributes_groupbox) + self.attributes_layout.addSpacing(15) + self.attributes_table = QtWidgets.QTableWidget() + self.attributes_table.setFocusPolicy(QtCore.Qt.NoFocus) + self.attributes_table.setColumnCount(2) + self.attributes_table.setAlternatingRowColors(True) + self.attributes_table.setHorizontalHeaderLabels(['Attribute', 'Value']) + self.attributes_table.verticalHeader().hide() + attributes_table_header = self.attributes_table.horizontalHeader() + attributes_table_header.setStyleSheet('QHeaderView::section {background-color: rgb(220, 220, 220);}') + attributes_table_header.setDefaultAlignment(QtCore.Qt.AlignLeft) + attributes_table_header.setContentsMargins(10, 10, 0, 0) + attributes_table_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + attributes_table_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) + attributes_table_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Interactive) + self.attributes_layout.addWidget(self.attributes_table) + self.attributes_groupbox.setLayout(self.attributes_layout) + + self.initialize_display_values() + + def initialize_display_values(self): + """ + Initializes all of the widget item information for material based on the DCC application info the class has + been passed. + :return: + """ + for material_property in self.material_properties: + if material_property in self.material_info.get('properties'): + self.property_settings[material_property] = self.material_info['properties'].get(material_property) + current_row = self.material_properties.index(material_property) + current_item = self.properties_list_widget.takeItem(current_row) + self.properties_list_widget.insertItem(0, current_item) + else: + self.property_settings[material_property] = 'inactive' + current_row = self.material_properties.index(material_property) + item = self.properties_list_widget.item(current_row) + item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEnabled) + item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable) + + self.properties_list_widget.setCurrentRow(0) + self.set_attributes_table(self.get_selected_property()) + + def set_attributes_table(self, selected_property): + """ + Displays the key, value pairs for the item selected in the Properties list widget + :param selected_property: The item in the Properties list widget that is currently selected. Only active + values are displayed. + :return: + """ + self.attributes_table.setRowCount(0) + row_count = 0 + for key, value in self.property_settings[selected_property].items(): + self.attributes_table.insertRow(row_count) + key_item = QtWidgets.QTableWidgetItem(key) + self.attributes_table.setItem(row_count, 0, key_item) + value_item = QtWidgets.QTableWidgetItem(value) + self.attributes_table.setItem(row_count, 1, value_item) + row_count += 1 + + def get_selected_property(self): + """ + Convenience function to get current value selected in the Properties list widget. + :return: + """ + return self.properties_list_widget.currentItem().text() + + def update_model(self): + """ + Not sure if this will go away, but if desired, I could make attribute values able to be revised after + materials have been scraped from the DCC materials + :return: + """ + pass + + def edit_button_clicked(self): + """ + This is in place in the event that we want to allow material revisions for properties to be made after + DCC processing step has already been executed. The idea would basically be to surface an editable + table where values can be added, removed or changed within the final material definition. + :return: + """ + logging.debug('Edit button clicked') + + def property_selection_changed(self): + """ + Fired when index of list view selected property selection has changed. + :return: + """ + self.set_attributes_table(self.get_selected_property()) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + materials_to_lumberyard = MaterialsToLumberyard() + materials_to_lumberyard.show() + sys.exit(app.exec_()) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/materials_export.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/materials_export.py new file mode 100644 index 0000000000..a57b7d4eaa --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/materials_export.py @@ -0,0 +1,852 @@ +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +""" +Usage +===== +Put usage instructions here. + +Output +====== +Put output information here. + +Notes: +In order to run this, you'll need to verify that the "mayapy_path" class attribute corresponds to the location on +your machine. Currently I've just included mapping instructions for Maya StingrayPBS materials, although most of +the needed elements are in place to carry out additional materials inside of Maya pretty quickly moving forward. +I've marked areas that still need refinement (or to be added altogether) with TODO comments + +TODO- Add command line access +TODO- Docstrings need work... wanted to get descriptions in but they need to be set for Sphinx +TODO- Add Blender and 3ds Max interoperablity +Links: +https://blender.stackexchange.com/questions/100497/use-blenders-bpy-in-projects-outside-blender +https://knowledge.autodesk.com/support/3ds-max/learn-explore/caas/CloudHelp/cloudhelp/2019/ENU/3DSMax-Batch/files/GUID-0968FF0A-5ADD-454D-B8F6-1983E76A4AF9-htm.html + +TODO- Look at dynaconf and wire in a solid means for configuration settings +TODO- This hasn't been "designed"- might be worth it to consider the visual design to ensure the most effective and + attractive UI + +Reading FBX file information (might come in handy later) +-- Materials information can be extracted from ASCII fbx pretty easily, binary is possible but more difficult +-- FBX files could be exported as ASCII files and I could use regex there to extract material information +-- I couldn't get pyfbx_i42 to work, but purportedly it can extract information from binary files. You may just have +to use the specified python versions + +-- Jonny wants me to use pathlib wherever possible for OO pathing, as well as python-box (aka Box) for dict access + +# Things to do: + --> Create the cube demo for Jonny with 4 attached materials + --> Allow export of JSON file for demo + --> Need to figure out how to clear pointers for stored data properly + --> Allow for command line control + +""" + +from PySide2 import QtWidgets, QtCore, QtGui +from PySide2.QtWidgets import QApplication +from model import MaterialsModel, TreeNode +import subprocess +import json +import sys +import os +import re + + +class MaterialsToLumberyard(QtWidgets.QWidget): + def __init__(self, parent=None): + super(MaterialsToLumberyard, self).__init__(parent) + + self.app = QtWidgets.QApplication.instance() + self.setWindowFlags(QtCore.Qt.Window) + self.setGeometry(50, 50, 800, 520) + self.setObjectName('MaterialsToLumberyard') + self.setWindowTitle('Materials To Lumberyard') + self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMinMaxButtonsHint) + self.isTopLevel() + + self.desktop_location = os.path.join(os.path.expanduser('~'), 'Desktop') + self.lumberyard_materials_directory = os.path.join(self.desktop_location, 'LumberyardMaterials') + self.mayapy_path = os.path.abspath('C:/"Program Files"/Autodesk/Maya2020/bin/mayapy.exe') + self.bold_font_large = QtGui.QFont('Helvetica', 7, QtGui.QFont.Bold) + self.medium_font = QtGui.QFont('Helvetica', 7, QtGui.QFont.Normal) + + self.materials_dictionary = {} + self.material_definitions = {} + self.material_definitions_nodes = [] + self.processed_materials = [] + self.target_file_list = [] + self.current_scene = None + self.model = None + self.total_materials = 0 + + self.main_container = QtWidgets.QVBoxLayout(self) + self.main_container.setContentsMargins(0, 0, 0, 0) + self.main_container.setAlignment(QtCore.Qt.AlignTop) + self.setLayout(self.main_container) + self.content_layout = QtWidgets.QVBoxLayout() + self.content_layout.setAlignment(QtCore.Qt.AlignTop) + self.content_layout.setContentsMargins(10, 3, 10, 5) + self.main_container.addLayout(self.content_layout) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Header Bar + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.header_bar_layout = QtWidgets.QHBoxLayout() + self.select_files_layout = QtWidgets.QHBoxLayout() + self.select_files_layout.setAlignment(QtCore.Qt.AlignLeft) + self.select_files_button = QtWidgets.QPushButton('Select Files') + self.select_files_button.clicked.connect(self.select_files_button_clicked) + self.select_files_button.setFixedSize(90, 35) + self.select_files_layout.addWidget(self.select_files_button) + self.header_bar_layout.addLayout(self.select_files_layout) + self.switch_combobox_layout = QtWidgets.QHBoxLayout() + self.switch_combobox_layout.setAlignment(QtCore.Qt.AlignRight) + self.switch_layout_combobox = QtWidgets.QComboBox() + self.switch_layout_combobox.setEnabled(False) + self.switch_layout_combobox.setFixedSize(250, 30) + self.combobox_items = ['Source Files', 'DCC Material Values', 'Export Materials'] + self.switch_layout_combobox.setStyleSheet('QComboBox {padding-left:6px;}') + self.switch_layout_combobox.addItems(self.combobox_items) + self.header_bar_layout.addWidget(self.switch_layout_combobox) + self.header_bar_layout.addLayout(self.switch_combobox_layout) + self.content_layout.addSpacing(5) + self.content_layout.addLayout(self.header_bar_layout) + + # ++++++++++++++++++++++++++++++++++++++++++++++++# + # File Source Table / Attributes (Stacked Layout) # + # ++++++++++++++++++++++++++++++++++++++++++++++++# + + self.content_stacked_layout = QtWidgets.QStackedLayout() + self.content_layout.addLayout(self.content_stacked_layout) + self.switch_layout_combobox.currentIndexChanged.connect(self.layout_combobox_changed) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Files Table + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.target_files_table = QtWidgets.QTableWidget() + self.target_files_table.setFocusPolicy(QtCore.Qt.NoFocus) + self.target_files_table.setColumnCount(2) + self.target_files_table.setAlternatingRowColors(True) + self.target_files_table.setHorizontalHeaderLabels(['File List', '']) + self.target_files_table.horizontalHeader().setStyleSheet('QHeaderView::section {background-color: rgb(220, 220, 220); padding-top:7px; padding-left:5px;}') + self.target_files_table.verticalHeader().hide() + files_header = self.target_files_table.horizontalHeader() + files_header.setFixedHeight(30) + files_header.setDefaultAlignment(QtCore.Qt.AlignLeft) + files_header.setContentsMargins(10, 10, 0, 0) + files_header.setDefaultSectionSize(60) + files_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + files_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Fixed) + self.target_files_table.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.content_stacked_layout.addWidget(self.target_files_table) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Scene Information Table + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.material_tree_view = QtWidgets.QTreeView() + self.headers = ['Key', 'Value'] + self.material_tree_view.setStyleSheet('QTreeView::item {height:25px;} QHeaderView::section {background-color: rgb(220, 220, 220); height:30px; padding-left:10px}') + + self.material_tree_view.setFocusPolicy(QtCore.Qt.NoFocus) + self.material_tree_view.setAlternatingRowColors(True) + self.material_tree_view.setUniformRowHeights(True) + self.content_stacked_layout.addWidget(self.material_tree_view) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> LY Material Definitions + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.material_definitions_widget = QtWidgets.QWidget() + self.material_definitions_layout = QtWidgets.QHBoxLayout(self.material_definitions_widget) + self.material_definitions_layout.setSpacing(0) + self.material_definitions_layout.setContentsMargins(0, 0, 0, 0) + self.material_definitions_frame = QtWidgets.QFrame(self.material_definitions_widget) + self.material_definitions_frame.setGeometry(0, 0, 5000, 5000) + self.material_definitions_frame.setStyleSheet('background-color:rgb(75,75,75);') + self.material_definitions_scroller = QtWidgets.QScrollArea() + self.scroller_widget = QtWidgets.QWidget() + self.scroller_layout = QtWidgets.QVBoxLayout() + self.scroller_widget.setLayout(self.scroller_layout) + self.material_definitions_scroller.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) + self.material_definitions_scroller.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.material_definitions_scroller.setWidgetResizable(True) + self.material_definitions_scroller.setWidget(self.scroller_widget) + self.material_definitions_layout.addWidget(self.material_definitions_scroller) + self.content_stacked_layout.addWidget(self.material_definitions_widget) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> File processing buttons + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + self.process_files_layout = QtWidgets.QHBoxLayout() + self.content_layout.addLayout(self.process_files_layout) + self.process_files_button = QtWidgets.QPushButton('Process Listed Files') + self.process_files_button.setFixedHeight(50) + self.process_files_button.clicked.connect(self.process_listed_files_clicked) + self.process_files_layout.addWidget(self.process_files_button) + self.reset_button = QtWidgets.QPushButton('Reset') + self.reset_button.setFixedSize(50, 50) + self.reset_button.clicked.connect(self.reset_clicked) + self.reset_button.setEnabled(False) + self.process_files_layout.addWidget(self.reset_button) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + # ---->> Status bar / Loader + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + # TODO- Move all processing of files to another thread and display progress with loader + + self.status_bar = QtWidgets.QStatusBar() + self.status_bar.setStyleSheet('background-color: rgb(220, 220, 220);') + self.status_bar.setContentsMargins(0, 0, 0, 0) + self.status_bar.setSizeGripEnabled(False) + self.message_readout_label = QtWidgets.QLabel('Ready.') + self.message_readout_label.setStyleSheet('padding-left: 10px') + self.status_bar.addWidget(self.message_readout_label) + + self.progress_bar = QtWidgets.QProgressBar() + self.progress_bar_widget = QtWidgets.QWidget() + self.progress_bar_widget_layout = QtWidgets.QHBoxLayout() + self.progress_bar_widget_layout.setContentsMargins(0, 0, 0, 0) + self.progress_bar_widget_layout.setAlignment(QtCore.Qt.AlignRight) + self.progress_bar_widget.setLayout(self.progress_bar_widget_layout) + self.status_bar.addPermanentWidget(self.progress_bar_widget) + self.progress_bar_widget_layout.addWidget(self.progress_bar) + self.progress_bar.setFixedSize(180, 20) + self.main_container.addWidget(self.status_bar) + + ############################ + # UI Display Layers ######## + ############################ + + def populate_source_files_table(self): + """ + Adds selected files from the 'Source Files' section of the UI. This creates each item listing in the table + as well as adds a 'Remove' button that will clear corresponding item from the table. Processed files will + get color coded, based on whether or not the materials in the file could be successfully processed. Subsequent + searches will not clear items from the table currently, as each item acts as a register of materials that have + and have not yet been processed. + :return: + """ + self.target_files_table.setRowCount(0) + for index, entry in enumerate(self.target_file_list): + entry = entry[1] if type(entry) == list else entry + self.target_files_table.insertRow(index) + item = QtWidgets.QTableWidgetItem(' {}'.format(entry)) + self.target_files_table.setRowHeight(index, 45) + remove_button = QtWidgets.QPushButton('Remove') + remove_button.setFixedWidth(60) + remove_button.clicked.connect(self.remove_source_file_clicked) + self.target_files_table.setItem(index, 0, item) + self.target_files_table.setCellWidget(index, 1, remove_button) + + def populate_dcc_material_values_tree(self): + """ + Sets the materials model class to the file attribute tree. + :return: + """ + + # TODO- Create mechanism for collapsing previously gathered materials, and or pushing them further down the list + + self.material_tree_view.setModel(self.model) + self.material_tree_view.expandAll() + self.material_tree_view.resizeColumnToContents(0) + + def populate_export_materials_list(self): + """ + Once all materials have been analyzed inside of DCC applications, the 'Export Materials' view lists all + materials presented as their Lumberyard counterparts. Each listing displays a representation of the material + file based on its corresponding DCC material values and file connections. + :return: + """ + self.reset_export_materials_description() + for count, value in enumerate(self.material_definitions): + material_definition_node = MaterialNode([value, self.material_definitions[value]], count) + self.material_definitions_nodes.append(material_definition_node) + self.scroller_layout.addWidget(material_definition_node) + self.scroller_layout.addLayout(self.create_separator_line()) + + ############################ + # TBD ######## + ############################ + + def process_file_list(self): + """ + The entry point for reading DCC files and extracting values. Files are filtered and separated + by DCC app (based on file extensions) before processing is done. + + Supported DCC applications: + Maya (.ma, .mb, .fbx), 3dsMax(.max), Blender(.blend) + :return: + """ + files_dict = {'maya': [], 'max': [], 'blender': [], 'na': []} + for file_location in self.target_file_list: + file_name = os.path.basename(str(file_location)) + file_extension = os.path.splitext(file_name)[1] + target_application = self.get_target_application(file_extension) + if target_application in files_dict.keys(): + files_dict[target_application].append(file_location) + + for key, values in files_dict.items(): + for value in values: + transfer_info = {'file_location': value, 'success': True} + try: + if key == 'maya' and len(value): + self.get_maya_material_values(value) + elif key == 'max' and len(value): + self.get_max_material_values(value) + elif key == 'blender' and len(value): + self.get_blender_material_values(value) + else: + pass + except Exception as e: + # TODO- Allow corrective actions or some display of errors if this fails? + transfer_info['success'] = [value, e] + self.set_transfer_status(transfer_info) + + if self.materials_dictionary: + # Create Model with extracted values from file list + self.set_material_model() + # Setup Lumberyard Material File Values + self.set_export_materials_description() + # Update UI Layout + self.populate_export_materials_list() + self.switch_layout_combobox.setCurrentIndex(2) + self.set_ui_buttons() + self.message_readout_label.setText('Ready.') + + def get_maya_material_values(self, target_files): + """ + Launches Maya Standalone and processes list of materials for each scene passed to the 'target_files' argument. + Also sets the environment paths needed for an instance of Maya's Python distribution. After files are processed + a single dictionary of scene materials is returned, and added to the "materials_dictionary" scene attribute. + :param target_files: List of files filtered from total list of files requested for processing that have a + Maya file extension + :return: + """ + + # TODO- Set load process to a separate thread and wire load progress bar up + + script_path = str(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'maya_materials.py')) + runtime_env = os.environ.copy() + runtime_env['MAYA_LOCATION'] = os.path.dirname(self.mayapy_path) + runtime_env['PYMEL_SKIP_MEL_INIT'] = '1' + runtime_env['PYTHONPATH'] = os.path.dirname(self.mayapy_path) + command = f'{self.mayapy_path} "{script_path}" "{target_files}" "{self.total_materials}"' + p = subprocess.Popen(command, shell=True, env=runtime_env, stdout=subprocess.PIPE) + output = p.communicate()[0] + self.set_material_dictionary(json.loads(output)) + + def get_max_material_values(self, target_file): + print('Max Target file: {}'.format(target_file)) + + def get_blender_material_values(self, target_file): + print('Blender Target file: {}'.format(target_file)) + + def reset_export_materials_description(self): + pass + + def reset_all_values(self): + pass + + def create_separator_line(self): + """ Convenience function for adding separation line to the UI. """ + layout = QtWidgets.QHBoxLayout() + line = QtWidgets.QLabel() + line.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + line.setLineWidth(1) + line.setFixedHeight(10) + layout.addWidget(line) + layout.setContentsMargins(8, 0, 8, 0) + return layout + + def export_selected_materials(self): + """ + This will eventually be revised to save material definitions in the proper place in the user's project folder, + but for now material definitions will be saved to the desktop. + :return: + """ + if not os.path.exists(self.lumberyard_materials_directory): + os.makedirs(self.lumberyard_materials_directory) + + for node in self.material_definitions_nodes: + if node.material_name_checkbox.isChecked(): + output = os.path.join(self.lumberyard_materials_directory, '{}.material'.format(node.material_name)) + with open(output, 'w', encoding='utf-8') as material_file: + json.dump(node.material_info, material_file, ensure_ascii=False, indent=4) + + ############################ + # Getters/Setters ########## + ############################ + + @staticmethod + def get_target_application(file_extension): + """ + Searches compatible file extensions and returns one of three Application names- Maya, 3dsMax, or Blender. + :param file_extension: Passed file extension used to determine DCC Application it originated from. + :return: Returns the application corresponding to the extension if found- otherwise returns a Boolean None + """ + app_extensions = {'maya': ['.ma', '.mb', '.fbx'], 'max': ['.max'], 'blender': ['.blend']} + target_dcc_application = [key for key, values in app_extensions.items() if file_extension in values] + if target_dcc_application: + return target_dcc_application[0] + return None + + @staticmethod + def get_lumberyard_material_template(shader_type): + """ + Loads material descriptions from the Lumberyard installation, providing a template to compare and convert DCC + shaders to Lumberyard material definitions. This is the first step in the comparison. The second step is to + compare these values with specific mapping instructions for DCC Application and DCC material type to arrive at + a converted material. + :param shader_type: The type of Lumberyard shader to pair material attributes to (i.e. PBR Shader) + :return: File dictionary of the available boilerplate Lumberyard shader settings. + """ + definitions = os.path.join(os.path.dirname(os.path.abspath(__file__)), '{}.material'.format(shader_type)) + if os.path.exists(definitions): + with open(definitions) as f: + return json.load(f) + + @staticmethod + def get_lumberyard_material_properties(name, material_type, file_connections): + """ This system will probably need rethinking if DCCs and compatible materials grow """ + material_properties = {} + if material_type == 'StingrayPBS': + naming_exceptions = {'color': 'baseColor', 'ao': 'ambientOcclusion'} + maps = 'color, metallic, roughness, normal, emissive, ao, opacity'.split(', ') + for m in maps: + texture_attribute = 'TEX_{}_map'.format(m) + for tex in file_connections.keys(): + if tex.find(texture_attribute) != -1: + key = m if m not in naming_exceptions else naming_exceptions.get(m) + material_properties[key] = {'useTexture': 'true', + 'textureMap': file_connections.get('{}.{}'.format(name, texture_attribute))} + return material_properties + + @staticmethod + def get_filename_increment(name): + """ + Convenience function that assists in ensuring that if any materials are encountered with the same name, an + underscore and number is appended to it to prevent overwrites. + :param name: The name of the material. The function searches the string for increment numbers, and either adds + one to any encountered, or adds an "_1" if passed name is the first duplicate encountered. + :return: The adjusted name with a unique incremental value. + """ + last_number = re.compile(r'(?:[^\d]*(\d+)[^\d]*)+') + number_found = last_number.search(name) + if number_found: + next_number = str(int(number_found.group(1)) + 1) + start, end = number_found.span(1) + name = name[:max(end - len(next_number), start)] + next_number + name[end:] + return name + + def set_transfer_status(self, transfer_info): + """ + Colorizes listings in the 'Source Files' view of the UI after processing to green or red, indicating whether or + not scene analysis successfully returned compatible materials and their values. + :param transfer_info: Each file the scripts attempt to process return a receipt of the success or failure of + the analysis. + :return: + """ + # TODO- Include some way to get error information if analysis fails, and potentially offer the means to + # effectively repair values as they map to intended Lumberyard shader type + + for row in range(self.target_files_table.rowCount()): + if self.target_files_table.item(row, 0).text().strip() == transfer_info['file_location']: + if transfer_info['success']: + self.target_files_table.item(row, 0).setBackground(QtGui.QColor(192, 255, 171)) + else: + self.target_files_table.item(row, 0).setBackground(QtGui.QColor(255, 177, 171)) + + def set_export_materials_description(self): + root = self.model.rootItem + for row in range(self.model.rowCount()): + source_file = self.model.get_attribute_value('SceneName', root.child(row)) + name = self.model.get_attribute_value('MaterialName', root.child(row)) + material_type = self.model.get_attribute_value('MaterialType', root.child(row)) + file_connections = {} + shader_attributes = {} + + for childIndex in range(root.child(row).childCount()): + child_item = root.child(row).child(childIndex) + child_value = child_item.itemData + if child_item.childCount(): + target_dict = file_connections if child_value[0] == 'FileConnections' else shader_attributes + for subChildIndex in range(child_item.childCount()): + sub_child_data = child_item.child(subChildIndex).itemData + target_dict[sub_child_data[0]] = sub_child_data[1] + self.set_pbr_material_description(source_file, name, material_type, file_connections) + + def set_material_dictionary(self, dcc_dictionary): + """ + Adds all material descriptions pulled from each DCC file analyzed to the "materials_dictionary" class attribute. + This function runs each time a subprocess is launced to gather DCC application material values. + :param dcc_dictionary: The dictionary of values for each material analyzed by each specific DCC file list + return analyzed values + :return: + """ + self.total_materials += len(dcc_dictionary) + self.materials_dictionary.update(dcc_dictionary) + + def set_material_model(self, initialize=True): + """ + Once all materials have been gathered across a selected file set query, this organizes the values into a + QT Model Class + :param initialize: Default is set to boolean True. If a model has already been established in the current + session, the initialize parameter would be set to false, and the values added to the Model. All changes to + the model would then be redistributed to other informational views in the UI. + :return: + """ + if initialize: + self.model = MaterialsModel(self.headers, self.materials_dictionary) + else: + self.model.update() + self.materials_dictionary.clear() + self.populate_dcc_material_values_tree() + + def set_ui_buttons(self): + """ + Handles UI buttons for each of the three stacked layout views (Source Files, DCC Material Values, + Export Materials) + :return: + """ + display_index = self.content_stacked_layout.currentIndex() + self.switch_layout_combobox.setEnabled(True) + # Source Files Layout ----------------------------------->> + if display_index == 0: + self.select_files_button.setEnabled(True) + self.reset_button.setEnabled(True) + self.process_files_button.setText('Process Listed Files') + + # DCC Material Values Layout ---------------------------->> + elif display_index == 1: + self.reset_button.setEnabled(True) + self.process_files_button.setEnabled(False) + self.select_files_button.setEnabled(False) + + # Export Materials Layout ------------------------------->> + else: + self.select_files_button.setEnabled(False) + self.process_files_button.setText('Export Selected Materials') + if self.material_definitions: + self.process_files_button.setEnabled(True) + + def set_pbr_material_description(self, source_file, name, material_type, file_connections): + # Build dictionary for material description based on extracted values + default_settings = self.get_lumberyard_material_template('pbr') + material = {'sourceFile': source_file, + 'description': name, + 'materialType': default_settings.get('materialType'), + 'parentMaterial': default_settings.get('parentMaterial'), + 'propertyLayoutVersion': default_settings.get('propertyLayoutVersion'), + 'properties': self.get_lumberyard_material_properties(name, material_type, file_connections)} + self.material_definitions[name if name not in self.material_definitions.keys() else + self.get_filename_increment(name)] = material + + ############################ + # Button Actions ########### + ############################ + + def remove_source_file_clicked(self): + """ + In the Source File view of the UI layout, this will remove the listed file in its respective row. If files + have not been processed yet, it prevents that file from being analyzed. If the files have already been + analyzed, this will remove the materials from stored values. + :return: + """ + file_index = self.target_files_table.indexAt(self.sender().pos()) + del self.target_file_list[file_index.row()] + self.populate_files_table() + + def process_listed_files_clicked(self): + """ + The button serves a dual purpose, depending on the current layout of the window. 'Process listed files' + initiates the DCC file analysis that extracts material information. In the "Export Materials" layout, this + button (for now) will export material files corresponding to each analyzed material. + :return: + """ + + # TODO- Need to decide how the materials are going to be routed. At this stage they will just be saved to the + # desktop, but I assume that we want these files to be saved to an associated project folder + + if self.sender().text() == 'Process Listed Files': + self.message_readout_label.setText('Gathering Material Information...') + self.app.processEvents() + self.process_file_list() + else: + self.export_selected_materials() + + def select_files_button_clicked(self): + """ + This dialog allows user to select DCC files to be processed for the materials present for conversion. + :return: + """ + + # TODO- Eventually it might be worth it to allow files from multiple locations to be selected. Currently + # this only allows single/multiple files from a single directory to be selected. + + dialog = QtWidgets.QFileDialog(self, 'Shift-Select Target Files', self.desktop_location) + dialog.setFileMode(QtWidgets.QFileDialog.ExistingFile) + dialog.setNameFilter('Compatible Files (*.ma *.mb *.fbx *.max *.blend)') + dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True) + file_view = dialog.findChild(QtWidgets.QListView, 'listView') + + # Workaround for selecting multiple files with File Dialog + if file_view: + file_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + f_tree_view = dialog.findChild(QtWidgets.QTreeView) + if f_tree_view: + f_tree_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + + if dialog.exec_() == QtWidgets.QDialog.Accepted: + self.target_file_list = dialog.selectedFiles() + if self.target_file_list: + self.populate_source_files_table() + self.process_files_button.setEnabled(True) + + def layout_combobox_changed(self): + """ + Handles main window layout combobox index change. + :return: + """ + self.content_stacked_layout.setCurrentIndex(self.switch_layout_combobox.currentIndex()) + self.set_ui_buttons() + + def reset_clicked(self): + """ + Brings the application and all variables back to their initial state. + :return: + """ + self.reset_all_values() + + +class MaterialNode(QtWidgets.QWidget): + def __init__(self, material_info, current_position, parent=None): + super(MaterialNode, self).__init__(parent) + + self.material_name = material_info[0] + self.material_info = material_info[1] + self.current_position = current_position + self.property_settings = {} + + self.small_font = QtGui.QFont("Helvetica", 7, QtGui.QFont.Bold) + self.bold_font = QtGui.QFont("Helvetica", 8, QtGui.QFont.Bold) + self.main_layout = QtWidgets.QVBoxLayout() + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(self.main_layout) + + self.background_frame = QtWidgets.QFrame(self) + self.background_frame.setGeometry(0, 0, 5000, 5000) + self.background_frame.setStyleSheet('background-color:rgb(220, 220, 220);') + + # ######################## + # Title Bar + # ######################## + + self.title_bar_widget = QtWidgets.QWidget() + self.title_bar_layout = QtWidgets.QHBoxLayout(self.title_bar_widget) + self.title_bar_layout.setContentsMargins(10, 0, 10, 0) + self.title_bar_layout.setAlignment(QtCore.Qt.AlignTop) + self.title_bar_frame = QtWidgets.QFrame(self.title_bar_widget) + self.title_bar_frame.setGeometry(0, 0, 5000, 40) + self.title_bar_frame.setStyleSheet('background-color:rgb(193,154,255);') + self.main_layout.addWidget(self.title_bar_widget) + self.material_name_checkbox = QtWidgets.QCheckBox(self.material_name) + self.material_name_checkbox.setFixedHeight(35) + self.material_name_checkbox.setStyleSheet('spacing:10px; color:white') + self.material_name_checkbox.setFont(self.bold_font) + self.material_name_checkbox.setChecked(True) + self.title_bar_layout.addWidget(self.material_name_checkbox) + + self.material_file_layout = QtWidgets.QHBoxLayout() + self.material_file_layout.setAlignment(QtCore.Qt.AlignRight) + self.source_file = QtWidgets.QLabel(os.path.basename(self.material_info['sourceFile'])) + self.source_file.setStyleSheet('color:white;') + self.source_file.setFont(self.small_font) + self.material_file_layout.addWidget(self.source_file) + self.material_file_layout.addSpacing(10) + + self.edit_button = QtWidgets.QPushButton('Edit') + self.edit_button.clicked.connect(self.edit_button_clicked) + self.edit_button.setFixedWidth(55) + self.material_file_layout.addWidget(self.edit_button) + self.title_bar_layout.addLayout(self.material_file_layout) + + self.information_layout = QtWidgets.QHBoxLayout() + self.information_layout.setContentsMargins(10, 0, 10, 10) + self.main_layout.addLayout(self.information_layout) + + # ######################## + # Details layout + # ######################## + + self.details_layout = QtWidgets.QVBoxLayout() + self.details_layout.setAlignment(QtCore.Qt.AlignTop) + self.details_groupbox = QtWidgets.QGroupBox("Details") + self.details_groupbox.setFixedWidth(200) + self.details_groupbox.setStyleSheet("QGroupBox {font:bold; border: 1px solid silver; " + "margin-top: 6px;} QGroupBox::title { color: rgb(150, 150, 150); " + "subcontrol-position: top left;}") + self.details_layout.addSpacing(15) + self.material_type_label = QtWidgets.QLabel('Material Type') + self.material_type_label.setStyleSheet('padding-left: 6px; color: white; background-color:rgb(175, 175, 175);') + self.material_type_label.setFixedHeight(25) + self.material_type_label.setFont(self.bold_font) + self.details_layout.addWidget(self.material_type_label) + + self.material_type_combobox = QtWidgets.QComboBox() + self.material_type_combobox.setFixedHeight(30) + self.material_type_combobox.setStyleSheet('QCombobox QAbstractItemView { padding-left: 15px; }') + material_type_items = [' Standard PBR'] + self.material_type_combobox.addItems(material_type_items) + self.details_layout.addWidget(self.material_type_combobox) + self.details_layout.addSpacing(10) + + self.description_label = QtWidgets.QLabel('Description') + self.description_label.setStyleSheet('padding-left: 6px; color: white; background-color:rgb(175, 175, 175);') + self.description_label.setFixedHeight(25) + self.description_label.setFont(self.bold_font) + self.details_layout.addWidget(self.description_label) + + self.description_box = QtWidgets.QTextEdit('This space is reserved for additional information.') + self.details_layout.addWidget(self.description_box) + self.information_layout.addWidget(self.details_groupbox) + self.details_groupbox.setLayout(self.details_layout) + + # ######################## + # Properties layout + # ######################## + + self.properties_layout = QtWidgets.QVBoxLayout() + self.properties_layout.setAlignment(QtCore.Qt.AlignTop) + self.properties_groupbox = QtWidgets.QGroupBox("Properties") + self.properties_groupbox.setFixedWidth(150) + self.properties_groupbox.setStyleSheet("QGroupBox {font:bold; border: 1px solid silver; " + "margin-top: 6px;} QGroupBox::title { color: rgb(150, 150, 150); " + "subcontrol-position: top left;}") + self.properties_list_widget = QtWidgets.QListWidget() + self.material_properties = ['ambientOcclusion', 'baseColor', 'emissive', 'metallic', 'roughness', 'specularF0', + 'normal', 'opacity'] + self.properties_list_widget.addItems(self.material_properties) + self.properties_list_widget.itemSelectionChanged.connect(self.property_selection_changed) + self.properties_layout.addSpacing(15) + self.properties_layout.addWidget(self.properties_list_widget) + self.information_layout.addWidget(self.properties_groupbox) + self.properties_groupbox.setLayout(self.properties_layout) + + # ######################## + # Attributes layout + # ######################## + + self.attributes_layout = QtWidgets.QVBoxLayout() + self.attributes_layout.setAlignment(QtCore.Qt.AlignTop) + self.attributes_groupbox = QtWidgets.QGroupBox("Attributes") + self.attributes_groupbox.setStyleSheet("QGroupBox {font:bold; border: 1px solid silver; " + "margin-top: 6px;} QGroupBox::title { color: rgb(150, 150, 150); " + "subcontrol-position: top left;}") + self.information_layout.addWidget(self.attributes_groupbox) + self.attributes_layout.addSpacing(15) + self.attributes_table = QtWidgets.QTableWidget() + self.attributes_table.setFocusPolicy(QtCore.Qt.NoFocus) + self.attributes_table.setColumnCount(2) + self.attributes_table.setAlternatingRowColors(True) + self.attributes_table.setHorizontalHeaderLabels(['Attribute', 'Value']) + attributes_table_header = self.attributes_table.horizontalHeader() + attributes_table_header.setStyleSheet('QHeaderView::section {background-color: rgb(220, 220, 220);}') + attributes_table_header.setDefaultAlignment(QtCore.Qt.AlignLeft) + attributes_table_header.setContentsMargins(10, 10, 0, 0) + attributes_table_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + attributes_table_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) + self.attributes_layout.addWidget(self.attributes_table) + self.attributes_groupbox.setLayout(self.attributes_layout) + + self.initialize_display_values() + + def initialize_display_values(self): + """ + Initializes all of the widget item information for material based on the DCC application info the class has + been passed. + :return: + """ + for material_property in self.material_properties: + if material_property in self.material_info.get('properties'): + self.property_settings[material_property] = self.material_info['properties'].get(material_property) + current_row = self.material_properties.index(material_property) + current_item = self.properties_list_widget.takeItem(current_row) + self.properties_list_widget.insertItem(0, current_item) + else: + self.property_settings[material_property] = 'inactive' + current_row = self.material_properties.index(material_property) + item = self.properties_list_widget.item(current_row) + item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEnabled) + item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable) + + self.properties_list_widget.setCurrentRow(0) + self.set_attributes_table(self.get_selected_property()) + + def set_attributes_table(self, selected_property): + """ + Displays the key, value pairs for the item selected in the Properties list widget + :param selected_property: The item in the Properties list widget that is currently selected. Only active + values are displayed. + :return: + """ + self.attributes_table.setRowCount(0) + row_count = 0 + for key, value in self.property_settings[selected_property].items(): + self.attributes_table.insertRow(row_count) + key_item = QtWidgets.QTableWidgetItem(key) + self.attributes_table.setItem(row_count, 0, key_item) + value_item = QtWidgets.QTableWidgetItem(value) + self.attributes_table.setItem(row_count, 1, value_item) + row_count += 1 + + def get_selected_property(self): + """ + Convenience function to get current value selected in the Properties list widget. + :return: + """ + return self.properties_list_widget.currentItem().text() + + def update_model(self): + """ + Not sure if this will go away, but if desired, I could make attribute values able to be revised after + materials have been scraped from the DCC materials + :return: + """ + pass + + def edit_button_clicked(self): + """ + This is in place in the event that we want to allow material revisions for properties to be made after + DCC processing step has already been executed. The idea would basically be to surface an editable + table where values can be added, removed or changed within the final material definition. + :return: + """ + print('Edit button clicked') + + def property_selection_changed(self): + """ + Fired when index of list view selected property selection has changed. + :return: + """ + self.set_attributes_table(self.get_selected_property()) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + materials_to_lumberyard = MaterialsToLumberyard() + materials_to_lumberyard.show() + sys.exit(app.exec_()) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/max_materials.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/max_materials.py new file mode 100644 index 0000000000..b3619e4cd2 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/max_materials.py @@ -0,0 +1,15 @@ +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +# import pymxs + +def get_material_information(file_location): + print('[Max] Get Material Information: {}'.format(file_location)) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/maya_materials.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/maya_materials.py new file mode 100644 index 0000000000..cef6b2885e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/maya_materials.py @@ -0,0 +1,158 @@ +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +from PySide2 import QtCore +import maya.standalone +maya.standalone.initialize(name='python') +import pymel.core as pm +import json +import sys +import logging + + +logging.basicConfig(level=logging.WARNING) + + +class MayaMaterials(QtCore.QObject): + def __init__(self, files_list, materials_count, parent=None): + super(MayaMaterials, self).__init__(parent) + + self.files_list = files_list + self.current_scene = None + self.materials_dictionary = {} + self.materials_count = int(materials_count) + self.get_material_information() + + def get_material_information(self): + """ + Main entry point for the material information extraction. Because this class is run + in Standalone mode as a subprocess, the list is passed as a string- some parsing/measures + need to be taken in order to separate values that originated as a list before passed. + + :return: A dictionary of all of the materials gathered. Sent back to main UI through stdout + """ + for file in file_list: + self.current_scene = file.replace('\'', '') + pm.openFile(self.current_scene, force=True) + self.set_material_descriptions() + json.dump(self.materials_dictionary, sys.stdout) + + @staticmethod + def get_materials(target_mesh): + """ + Gathers a list of all materials attached to each mesh's shader + + :param target_mesh: The target mesh to pull attached material information from. + :return: List of unique material values attached to the mesh passed as an argument. + """ + shading_group = pm.listConnections(pm.PyNode(target_mesh), type='shadingEngine') + materials = pm.ls(pm.listConnections(shading_group), materials=1) + return list(set(materials)) + + @staticmethod + def get_shader(material_name): + """ + Convenience function for obtaining the shader that the specified material (as an argument) + is attached to. + + :param material_name: Takes the material name as an argument to get associated shader object + :return: + """ + connections = pm.listConnections(material_name, type='shadingEngine')[0] + shader_name = '{}.surfaceShader'.format(connections) + shader = pm.listConnections(shader_name)[0] + return shader + + @staticmethod + def get_shader_information(shader, material_mesh): + """ + Helper function for extracting shader/material attributes used to form the DCC specific dictionary + of found material values for conversion. + + :param shader: The target shader object to analyze + :param material_mesh: The material mesh needs to be passed to search for textures attached to it. + :return: Complete set (in the form of two dictionaries) of file connections and material attribute values + """ + shader_file_connections = {} + shading_group = pm.listConnections(material_mesh, type='shadingEngine') + material = pm.ls(pm.listConnections(shading_group), materials=1)[0] + used_texture_nodes = set(pm.listHistory(material, type='file')) + for node in used_texture_nodes: + for attr in pm.listConnections(node, plugs=1): + try: + if attr.split('.')[0] == material: + shader_file_connections[str(attr)] = pm.getAttr(node.fileTextureName) + break + except pm.MayaAttributeError: + pass + + shader_attributes = {} + for shader_attribute in pm.listAttr(shader, s=True, iu=True): + try: + shader_attributes[str(shader_attribute)] = str(pm.getAttr('{}.{}'.format(shader, shader_attribute))) + except pm.MayaAttributeError as e: + logging.error('MayaAttributeError: {}'.format(e)) + + return shader_file_connections, shader_attributes + + def set_material_dictionary(self, material_name, material_type, material_mesh): + """ + When a unique material has been found, this creates a dictionary entry with all relevant material values. This + includes material attributes as well as attached file textures. Later in the process this information is + leveraged when creating the Lumberyard material definition. + + :param material_name: The name attached to the material + :param material_type: Specific type of material (Arnold, Stingray, etc.) + :param material_mesh: Mesh that the material is applied to + :return: + """ + self.materials_count += 1 + shader = self.get_shader(material_name) + shader_file_connections, shader_attributes = self.get_shader_information(shader, material_mesh) + material_dictionary = {'MaterialName': material_name, 'MaterialType': material_type, 'DccApplication': 'Maya', + 'AppliedMesh': material_mesh, 'FileConnections': shader_file_connections, + 'SceneName': str(self.current_scene), 'MaterialAttributes': shader_attributes} + material_name = 'Material_{}'.format(self.materials_count) + self.materials_dictionary[material_name] = material_dictionary + + def set_material_descriptions(self): + """ + This function serves as the clearinghouse for all analyzed materials passing through the system. + It will determine whether or not the found material has already been processed, or if it needs to + be added to the final material dictionary. In the event that an encountered material has already + been processed, this function creates a register of all meshes it is applied to in the 'AppliedMesh' + attribute. + :return: + """ + scene_geo = pm.ls(v=True, geometry=True) + for target_mesh in scene_geo: + material_list = self.get_materials(target_mesh) + for material_name in material_list: + material_type = pm.nodeType(material_name, api=True) + material_listed = [x for x in self.materials_dictionary + if self.materials_dictionary[x]['MaterialName'] == material_name] + + if not material_listed: + self.set_material_dictionary(str(material_name), str(material_type), str(target_mesh)) + else: + mesh_list = self.materials_dictionary[material_name].get('AppliedMesh') + if not isinstance(mesh_list, list): + self.materials_dictionary[material_name]['AppliedMesh'] = [mesh_list, target_mesh] + else: + mesh_list.append(target_mesh) + + +# ++++++++++++++++++++++++++++++++++++++++++++++++# +# Maya Specific Shader Mapping # +# ++++++++++++++++++++++++++++++++++++++++++++++++# + +file_list = sys.argv[1:-1] +count = sys.argv[-1] +instance = MayaMaterials(file_list, count) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/model.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/model.py new file mode 100644 index 0000000000..c6e4713044 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/model.py @@ -0,0 +1,157 @@ +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +from PySide2.QtCore import QAbstractItemModel, QModelIndex, Qt + + +class MaterialsModel(QAbstractItemModel): + def __init__(self, headers, data, parent=None): + super(MaterialsModel, self).__init__(parent) + + self.rootItem = TreeNode(headers) + self.parents = [self.rootItem] + self.indentations = [0] + self.create_data(data) + + def create_data(self, data, indent=-1): + """ + Recursive loop that structures Model data into tree form. + :param data: Row information. + :param indent: Column information. This helps to facilitate the creation of nested rows. + :return: + """ + if type(data) == dict: + indent += 1 + position = 4 * indent + for key, value in data.items(): + if position > self.indentations[-1]: + if self.parents[-1].childCount() > 0: + self.parents.append(self.parents[-1].child(self.parents[-1].childCount() - 1)) + self.indentations.append(position) + else: + while position < self.indentations[-1] and len(self.parents) > 0: + self.parents.pop() + self.indentations.pop() + parent = self.parents[-1] + parent.insertChildren(parent.childCount(), 1, parent.columnCount()) + parent.child(parent.childCount() - 1).setData(0, key) + value_string = str(value) if type(value) != dict else str('') + parent.child(parent.childCount() - 1).setData(1, value_string) + try: + self.create_data(value, indent) + except RuntimeError: + pass + + @staticmethod + def get_attribute_value(search_string, search_column): + """ Convenience function for quickly accessing row information based on attribute keys. """ + for childIndex in range(search_column.childCount()): + child_item = search_column.child(childIndex) + child_value = child_item.itemData + if child_value[0] == search_string: + return child_value[1] + return None + + def index(self, row, column, index=QModelIndex()): + """ Returns the index of the item in the model specified by the given row, column and parent index """ + if not self.hasIndex(row, column, index): + return QModelIndex() + if not index.isValid(): + item = self.rootItem + else: + item = index.internalPointer() + + child = item.child(row) + if child: + return self.createIndex(row, column, child) + return QModelIndex() + + def parent(self, index): + """ + Returns the parent of the model item with the given index If the item has no parent, + an invalid QModelIndex is returned + """ + if not index.isValid(): + return QModelIndex() + item = index.internalPointer() + if not item: + return QModelIndex() + + parent = item.parentItem + if parent == self.rootItem: + return QModelIndex() + else: + return self.createIndex(parent.childNumber(), 0, parent) + + def rowCount(self, index=QModelIndex()): + """ + Returns the number of rows under the given parent. When the parent is valid it means that + rowCount is returning the number of children of parent + """ + if index.isValid(): + parent = index.internalPointer() + else: + parent = self.rootItem + return parent.childCount() + + def columnCount(self, index=QModelIndex()): + """ Returns the number of columns for the children of the given parent """ + return self.rootItem.columnCount() + + def data(self, index, role=Qt.DisplayRole): + """ Returns the data stored under the given role for the item referred to by the index """ + if index.isValid() and role == Qt.DisplayRole: + return index.internalPointer().data(index.column()) + elif not index.isValid(): + return self.rootItem.data(index.column()) + + def headerData(self, section, orientation, role=Qt.DisplayRole): + """ Returns the data for the given role and section in the header with the specified orientation """ + if orientation == Qt.Horizontal and role == Qt.DisplayRole: + return self.rootItem.data(section) + + +class TreeNode(object): + def __init__(self, data, parent=None): + self.parentItem = parent + self.itemData = data + self.children = [] + + def child(self, row): + return self.children[row] + + def childCount(self): + return len(self.children) + + def childNumber(self): + if self.parentItem is not None: + return self.parentItem.children.index(self) + + def columnCount(self): + return len(self.itemData) + + def data(self, column): + return self.itemData[column] + + def insertChildren(self, position, count, columns): + if position < 0 or position > len(self.children): + return False + for row in range(count): + data = [v for v in range(columns)] + item = TreeNode(data, self) + self.children.insert(position, item) + + def parent(self): + return self.parentItem + + def setData(self, column, value): + if column < 0 or column >= len(self.itemData): + return False + self.itemData[column] = value diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/pbr.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/pbr.material new file mode 100644 index 0000000000..4bf22b8762 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/pbr.material @@ -0,0 +1,55 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "ambientOcclusion": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "baseColor": { + "color": [ 1.0, 1.0, 1.0 ], + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "emissive": { + "color": [ 1.0, 1.0, 1.0 ], + "intensity": 1.0, + "useTexture": false, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "metallic": { + "factor": 0.0, + "useTexture": false, + "textureMap": "" + }, + "roughness": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif" + }, + "opacity": { + "doubleSided": false, + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": false, + "textureMap": "" + } + } +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/__init__.py new file mode 100644 index 0000000000..a866722d02 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/__init__.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/launcher.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/launcher.bat new file mode 100644 index 0000000000..47704c22d7 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/launcher.bat @@ -0,0 +1,88 @@ +@echo off + +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Set up and run LY Python CMD prompt +:: Sets up the DccScriptingInterface_Env, +:: Puts you in the CMD within the dev environment + +:: Set up window +TITLE Lumberyard DCC Scripting Interface Cmd +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +%~d0 +cd %~dp0 + +:: Keep changes local +SETLOCAL enableDelayedExpansion + +:: This maps up to the \Dev folder +IF "%DEV_REL_PATH%"=="" (set DEV_REL_PATH=..\..\..\..\..\..\..\..\..) + +:: Change to root Lumberyard dev dir +:: Don't use the LY_DEV so we can test that ENVAR!!! +CD /d %DEV_REL_PATH% +set Rel_Dev=%CD% +echo Rel_Dev = %Rel_Dev% +:: Restore original directory +popd + +set DCCSI_PYTHON_INSTALL=%Rel_Dev%\Tools\Python\3.7.5\windows + +:: add to the PATH +SET PATH=%DCCSI_PYTHON_INSTALL%;%PATH% + +:: dcc scripting interface gem path +set DCCSIG_PATH=%Rel_Dev%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface +echo DCCSIG_PATH = %DCCSIG_PATH% + +:: add to the PATH +SET PATH=%DCCSIG_PATH%;%PATH% + +:: Constant Vars (Global) +:: global debug (propogates) +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates debugger connection +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% + +echo. +echo _____________________________________________________________________ +echo. +echo ~ LY DCCsi, DCC Material Converter +echo _____________________________________________________________________ +echo. + +:: Change to root dir +CD /D %DCCSIG_PATH% + +:: add to the PATH +SET PATH=%DCCSIG_PATH%;%PATH% + +set PYTHONPATH=%DCCSIG_PATH%;%PYTHONPATH% + +CALL %DCCSI_PYTHON_INSTALL%\python.exe "%DCCSIG_PATH%\SDK\Maya\Scripts\Python\kitbash_converter\standalone.py" + + +ENDLOCAL + +:: Return to starting directory +POPD + +:END_OF_FILE + +exit /b 0 \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/main.py new file mode 100644 index 0000000000..094f2a5edf --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/main.py @@ -0,0 +1,1076 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +# File Description: +# This tool helps to convert KitBash3D FBX models to Lumberyard materials. +# ------------------------------------------------------------------------- + +# Built-ins +from functools import partial +import logging as _logging +from pathlib import Path +import json +import time +import sys +import os +import re + +# azpy bootstrapping and extensions +import azpy.config_utils + +_config = azpy.config_utils.get_dccsi_config() +print(_config) +# ^ this is effectively an import and retrieve of \config.py +# and init's access to Qt/Pyside2 +# init lumberyard Qy/PySide2 access +# now default settings are extended with PySide2 +# this is an alternative to "from dynaconf import settings" with Qt +settings = _config.get_config_settings(setup_ly_pyside=True) + +# app_path = Path.joinpath(settings.DCCSIG_PATH, < relative path to current script dir >).resolve() + +# 3rd Party (we may or do provide) +from box import Box + +# lumberyard Qt/PySide2 +from PySide2 import QtWidgets, QtCore, QtGui +from PySide2.QtWidgets import QApplication, QMessageBox +from PySide2.QtCore import Signal, Slot, QThread, QProcess, QProcessEnvironment + +for handler in _logging.root.handlers[:]: + _logging.root.removeHandler(handler) + +module_name = 'kitbash_converter.main' +log_file_path = os.path.join(settings.DCCSI_LOG_PATH, f'{module_name}.log') + +_log_level = int(20) +_G_DEBUG = True +if _G_DEBUG: + _log_level = int(10) + +from azpy.constants import FRMT_LOG_LONG + +_logging.basicConfig(level=_log_level, + format=FRMT_LOG_LONG, + datefmt='%m-%d %H:%M', + filename=log_file_path, + filemode='w') +_LOGGER = _logging.getLogger(module_name) + +console_handler = _logging.StreamHandler(sys.stdout) +console_handler.setLevel(_log_level) +formatter = _logging.Formatter(FRMT_LOG_LONG) +console_handler.setFormatter(formatter) +_LOGGER.addHandler(console_handler) +_LOGGER.setLevel(_log_level) +_LOGGER.debug('Initializing: {0}.'.format({module_name})) + +# early attach WingIDE debugger (can refactor to include other IDEs later) +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_DEV_MODE +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, True) # flip to True to attach + +if _DCCSI_DEV_MODE: + from azpy.test.entry_test import connect_wing + foo = connect_wing() +# to do: ^ this should be replaced with full featured azpy.dev.util +# that supports additional debuggers (pycharm, vscode, etc.) + +# Things to do +# Create materials for shaders without textures attached- most likely glass +# Plants- get opacity/clipping set up correctly. Light transmission +# Handle "Split texture alpha" Break alpha out of the color and map into the materials + +class FBXConverter(QtWidgets.QDialog): + + def __init__(self, parent=None): + super(FBXConverter, self).__init__(parent) + + self.app = QtWidgets.QApplication.instance() + self.setWindowFlags(QtCore.Qt.Window) + self.setGeometry(50, 50, 600, 400) + # self.setFixedWidth(600) + self.setObjectName('FBXConverter') + self.setWindowTitle('FBX to Lumberyard') + self.isTopLevel() + self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMinMaxButtonsHint) + + self.default_search_path = os.path.normpath(Path(__file__).parents[8] / 'AtomContent') + self.autodesk_directory = Path(os.environ['ProgramFiles']) / 'Autodesk' + self.default_material_definition = 'standardPBR.template.material' + self.processed_material_information = {} + self.relative_export_path = 'Objects' + self.mayapy_path = self.get_mayapy_path() + self.single_asset_file = '' + self.flagged_material_information = None + self.input_directory = None + self.output_directory = None + self.process = None + self.process_results = {} + self.audit_list = [] + # self.current_fbx = None + self.current_audit_index = 0 + self.bold_font = QtGui.QFont("Helvetica", 8, QtGui.QFont.Black) + self.bold_title_font = QtGui.QFont("Helvetica", 10, QtGui.QFont.Black) + self.small_font = QtGui.QFont("Helvetica", 7, QtGui.QFont.Black) + self.line = QtWidgets.QLabel() + self.separator_layout = QtWidgets.QHBoxLayout() + + self.main_container = QtWidgets.QVBoxLayout(self) + self.main_container.setContentsMargins(0, 0, 0, 0) + self.main_container.setAlignment(QtCore.Qt.AlignTop) + self.setLayout(self.main_container) + self.content_layout = QtWidgets.QVBoxLayout() + self.content_layout.setContentsMargins(8, 10, 8, 0) + self.content_layout.setAlignment(QtCore.Qt.AlignTop) + self.main_container.addLayout(self.content_layout) + + # Asset Type Combobox + self.header_layout = QtWidgets.QHBoxLayout() + self.asset_type_combobox = QtWidgets.QComboBox() + self.asset_type_combobox.setFixedHeight(35) + self.asset_type_combobox.setStyleSheet('padding-left: 10px;') + self.asset_type_items = ['Kitbash3d', 'Basic Maya'] + self.asset_type_combobox.addItems(self.asset_type_items) + self.header_layout.addWidget(self.asset_type_combobox) + + # Reset All Button + self.reset_all_button = QtWidgets.QPushButton('Reset All') + self.reset_all_button.clicked.connect(self.reset_all_clicked) + self.reset_all_button.setFont(self.bold_font) + self.reset_all_button.setFixedSize(85, 35) + self.header_layout.addWidget(self.reset_all_button) + self.content_layout.addLayout(self.header_layout) + + # Set Directory Path + self.target_directory_layout = QtWidgets.QVBoxLayout() + self.target_directory_layout.setAlignment(QtCore.Qt.AlignTop) + self.target_directory_groupbox = QtWidgets.QGroupBox() + self.target_directory_groupbox.setLayout(self.target_directory_layout) + self.target_directory_layout.setContentsMargins(10, 10, 10, 10) + + # Input Directory + self.input_field_layout = QtWidgets.QHBoxLayout() + self.input_directory_label = QtWidgets.QLabel('Input Directory') + self.input_directory_label.setFixedWidth(75) + self.input_field_layout.addWidget(self.input_directory_label) + self.input_path_field = QtWidgets.QLineEdit() + self.input_path_field.textChanged.connect(self.set_io_directories) + self.input_path_field.setFixedHeight(25) + self.input_field_layout.addWidget(self.input_path_field) + self.set_input_button = QtWidgets.QPushButton('Set') + self.set_input_button.clicked.connect(partial(self.set_directory_button_clicked, 'input')) + self.set_input_button.setFixedSize(40, 25) + self.input_field_layout.addWidget(self.set_input_button) + self.target_directory_layout.addLayout(self.input_field_layout) + self.target_directory_layout.addSpacing(8) + + # File handling radio buttons + self.file_options_layout = QtWidgets.QHBoxLayout() + self.radio_button_layout = QtWidgets.QHBoxLayout() + self.radio_button_layout.setAlignment(QtCore.Qt.AlignLeft) + self.radio_button_group = QtWidgets.QButtonGroup() + self.use_directory_radio_button = QtWidgets.QRadioButton('Directory') + self.use_directory_radio_button.setChecked(True) + self.use_directory_radio_button.clicked.connect(self.radio_clicked) + self.radio_button_group.addButton(self.use_directory_radio_button) + self.radio_button_layout.addWidget(self.use_directory_radio_button) + self.radio_button_layout.addSpacing(10) + self.use_file_radio_button = QtWidgets.QRadioButton('Single File') + self.use_file_radio_button.setFixedWidth(80) + self.use_file_radio_button.clicked.connect(self.radio_clicked) + self.radio_button_layout.addWidget(self.use_file_radio_button) + self.radio_button_group.addButton(self.use_file_radio_button) + self.file_options_layout.addLayout(self.radio_button_layout) + self.target_directory_layout.addLayout(self.file_options_layout) + self.content_layout.addWidget(self.target_directory_groupbox) + + # Relative Output Path + self.output_directory_widget = QtWidgets.QWidget() + self.output_field_layout = QtWidgets.QHBoxLayout(self.output_directory_widget) + self.output_field_layout.setAlignment(QtCore.Qt.AlignRight) + self.output_field_layout.addStretch() + self.output_field_layout.setContentsMargins(0, 0, 0, 0) + self.output_directory_color_frame = QtWidgets.QFrame(self.output_directory_widget) + self.output_directory_color_frame.setGeometry(0, 0, 5000, 30) + self.output_directory_color_frame.setStyleSheet('background-color:rgb(210,210,210);') + self.output_directory_button = QtWidgets.QPushButton(self.relative_export_path) + self.output_directory_button.clicked.connect(self.set_relative_path_clicked) + self.output_directory_button.setFixedHeight(30) + self.output_directory_button.setFont(self.small_font) + self.output_directory_button.setStyleSheet( + 'QPushButton {border:None; color:rgb(125,125,125); padding-right:10px; background-color:rgb(210,210,210); ' + 'text-align:right;} QPushButton:hover { color: black;}') + self.output_field_layout.addWidget(self.output_directory_button) + self.file_options_layout.addWidget(self.output_directory_widget) + + # Navigate Listings + self.review_layout = QtWidgets.QVBoxLayout() + self.review_layout.setContentsMargins(10, 10, 10, 10) + self.review_groupbox = QtWidgets.QGroupBox() + self.review_groupbox.setLayout(self.review_layout) + self.title_layout = QtWidgets.QHBoxLayout() + self.review_layout.addLayout(self.title_layout) + self.object_title_layout = QtWidgets.QHBoxLayout() + self.object_title_layout.setAlignment(QtCore.Qt.AlignLeft) + self.title_label = QtWidgets.QLabel('FBX Title') + self.title_label.setFont(self.bold_title_font) + self.object_title_layout.addWidget(self.title_label) + self.object_title_layout.addSpacing(3) + self.jump_button = QtWidgets.QPushButton('Jump') + self.jump_button.clicked.connect(self.jump_button_clicked) + self.jump_button.setFixedSize(32, 22) + self.object_title_layout.addWidget(self.jump_button) + self.hidden_button = QtWidgets.QPushButton() + self.hidden_button.setFixedSize(0,0) + self.object_title_layout.addWidget(self.hidden_button) + self.object_title_layout.setAlignment(QtCore.Qt.AlignLeft) + self.title_layout.addSpacing(5) + self.title_layout.addLayout(self.object_title_layout) + + self.arrow_button_layout = QtWidgets.QHBoxLayout() + self.arrow_button_layout.setAlignment(QtCore.Qt.AlignRight) + self.back_button = QtWidgets.QToolButton() + self.back_button.setFixedSize(37, 27) + self.back_button.setArrowType(QtCore.Qt.LeftArrow) + self.back_button.clicked.connect(self.back_button_clicked) + self.forward_button = QtWidgets.QToolButton() + self.forward_button.setFixedSize(37, 27) + self.forward_button.setArrowType(QtCore.Qt.RightArrow) + self.forward_button.clicked.connect(self.forward_button_clicked) + self.arrow_button_layout.addWidget(self.back_button) + self.arrow_button_layout.addWidget(self.forward_button) + self.title_layout.addLayout(self.arrow_button_layout) + self.content_layout.addWidget(self.review_groupbox) + self.separator_bar_layout = self.get_separator_bar() + self.review_layout.addLayout(self.separator_bar_layout) + + self.materials_control_layout = QtWidgets.QHBoxLayout() + self.material_combobox = QtWidgets.QComboBox() + self.material_combobox.currentIndexChanged.connect(self.material_combobox_changed) + self.material_combobox_items = [] + self.material_combobox.setFixedHeight(30) + self.materials_control_layout.addWidget(self.material_combobox) + self.review_layout.addLayout(self.materials_control_layout) + + self.update_material_button = QtWidgets.QPushButton('Update Material') + self.update_material_button.setFixedSize(100, 30) + self.update_material_button.clicked.connect(self.update_material_clicked) + self.materials_control_layout.addWidget(self.update_material_button) + + # Results Parameters + self.material_attributes = {} + self.results_grid_widget = QtWidgets.QWidget() + self.scroll_area = QtWidgets.QScrollArea(self.results_grid_widget) + self.scroll_area.setMinimumHeight(300) + self.review_layout.addWidget(self.scroll_area) + self.scroll_area.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.scrollAreaWidgetContents = QtWidgets.QWidget() + self.results_grid_layout = QtWidgets.QGridLayout() + self.results_grid_layout.setColumnStretch(0,-1) + self.scrollAreaWidgetContents.setLayout(self.results_grid_layout) + self.scroll_area.setWidgetResizable(True) + self.results_grid_layout.setContentsMargins(0, 0, 0, 0) + self.results_grid_layout.setSpacing(0) + index = 0 + for key, values in self.get_material_attributes().items(): + attribute_list = [key, values] + self.material_attributes[key] = AttributeListing(attribute_list) + self.material_attributes[key].attribute_changed.connect(self.material_attribute_updated) + self.results_grid_layout.addWidget(self.material_attributes[key], index, 0) + index += 1 + + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 600, 1000)) + self.scroll_area.setWidget(self.scrollAreaWidgetContents) + + # Process Files Button + self.process_files_button = QtWidgets.QPushButton('Process Files') + self.process_files_button.setFont(self.bold_font) + self.process_files_button.clicked.connect(self.process_files_clicked) + self.process_files_button.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.process_files_button.setFixedHeight(60) + self.process_files_button.setEnabled(False) + self.content_layout.addWidget(self.process_files_button) + + # Messaging Bar + self.message_widget = QtWidgets.QWidget() + self.message_readout_layout = QtWidgets.QHBoxLayout(self.message_widget) + self.message_readout_layout.setAlignment(QtCore.Qt.AlignLeft) + self.message_readout_layout.setContentsMargins(0, 0, 0, 0) + self.message_color_frame = QtWidgets.QFrame(self.message_widget) + self.message_color_frame.setGeometry(0, 0, 5000, 1000) + self.message_color_frame.setStyleSheet('background-color:rgb(35, 35, 35);') + self.message_readout_layout.addSpacing(10) + self.message_readout_label = QtWidgets.QLabel('Ready.') + self.message_readout_label.setFixedHeight(30) + self.message_readout_label.setStyleSheet('color:rgb(0,255,0);') + self.message_readout_layout.addWidget(self.message_readout_label) + self.main_container.addWidget(self.message_widget) + self.initialize_window() + + def initialize_window(self): + self.set_ui_visibility(False) + self.initialize_qprocess() + self.input_path_field.setFocus() + + def process_single_asset(self, target_fbx): + """ + This function is executed for both individual and directory processing- it separates + actions into a single process for splitting sources files and generating materials. + :param target_fbx: + :return: + """ + self.process_results[target_fbx.name] = self.start_maya_session(target_fbx) + if self.use_file_radio_button.isChecked(): + _LOGGER.info(f'Process finished -- Results: {self.process_results}') + self.display_message('Process Completed.') + self.app.processEvents() + time.sleep(5) + self.display_message('Ready.') + self.app.processEvents() + + def process_directory(self, directory_path): + """ + Sets script for directory processing, this function will collect all fbx files found + in a targeted directory and send each individually to single asset processing above. + :param directory_path: + :return: + """ + _LOGGER.info(f'Processing Directory: {directory_path}') + for target_file in directory_path.iterdir(): + if target_file.suffix.lower() == '.fbx': + _LOGGER.info(f'TargetFBX from Process Directory: {target_file}') + self.process_single_asset(target_file) + self.display_message('Process Completed.') + self.app.processEvents() + time.sleep(5) + self.display_message('Ready.') + self.app.processEvents() + _LOGGER.info(f'Process finished -- Results: {self.process_results}') + + def display_message(self, message): + """ + Sets informational bar at the bottom of the window that indicates what is being processed. + :param message: + :return: + """ + self.message_readout_label.setText(message) + self.app.processEvents() + + def initialize_qprocess(self): + """ + This sets the QProcess object up and adds all of the aspects that will remain consistent for each directory + processed. + :return: + """ + self.p = QProcess() + env = [env for env in QtCore.QProcess.systemEnvironment() if not env.startswith('PYTHONPATH=')] + env.append(f'MAYA_LOCATION={os.path.dirname(self.mayapy_path)}') + env.append(f'PYTHONPATH={os.path.dirname(self.mayapy_path)}') + self.p.setEnvironment(env) + self.p.setProgram(str(self.mayapy_path)) + self.p.setProcessChannelMode(QProcess.SeparateChannels) + self.p.readyReadStandardOutput.connect(self.handle_stdout) + self.p.readyReadStandardError.connect(self.handle_stderr) + self.p.stateChanged.connect(self.handle_state) + self.p.started.connect(self.processStarted) + self.p.finished.connect(self.cleanup) + + def processStarted(self): + _LOGGER.info('Maya Standalone Process Started....') + + def handle_stderr(self): + pass + # data = self.p.readAllStandardError() + # stderr = bytes(data).decode("utf8") + # _LOGGER.info(f'STD_ERROR_FIRED: {stderr}') + + def handle_stdout(self): + """ + This catches standard output from Maya while processing. It is used for keeping track of progress, and once + the last FBX file in a target directory is processed, it updates the database with the newly created Maya files. + :return: + """ + data = self.p.readAllStandardOutput() + stdout = bytes(data).decode("utf8") + if stdout.startswith('{'): + _LOGGER.info('QProcess Complete.') + self.processed_material_information = json.loads(stdout) + self.set_audit_list() + + def handle_state(self, state): + """ + Mainly just for an indication in the Logging statements as to whether or not the QProcess is running + :param state: + :return: + """ + states = { + QProcess.NotRunning: 'Not running', + QProcess.Starting: 'Starting', + QProcess.Running: 'Running' + } + state_name = states[state] + _LOGGER.info(f'QProcess State Change: {state_name}') + + def cleanup(self): + self.p.closeWriteChannel() + _LOGGER.info("Source File Conversion Complete") + self.set_audit_window() + self.process_files_button.setEnabled(False) + + def start_maya_session(self, target_fbx): + """ + This starts the exchange between the standalone QT UI and Maya Standalone to process FBX files. + The information sent to Maya is the FBX file for processing, as well as the base directory and + relative destination paths. There is a pipe that can be used to shuttle processed information + back to the script, but at this stage it is not being used. + :param target_fbx: + :return: + """ + self.display_message(f'Working: {target_fbx.name}') + self.app.processEvents() + if self.mayapy_path: + try: + info_list = [os.path.normpath(target_fbx), self.input_directory, self.relative_export_path] + script_path = os.path.normpath(os.path.join(os.getcwd(), 'process_fbx_file.py')) + _LOGGER.info(f'Script path: {script_path}') + _LOGGER.info(f'Mayapy path: {self.mayapy_path}') + _LOGGER.info(f'InfoList: {info_list}') + command = [script_path] + for entry in info_list: + command.append(entry) + _LOGGER.info(f'++++++ Command: {command}') + self.p.setArguments(command) + self.p.start() + self.p.waitForFinished(-1) + except Exception as e: + _LOGGER.warning(f'Error creating Maya Files: {e}') + return None + else: + try: + mayapy_path = file_browser.getOpenFileName(self, "Please Set Path to \'mayapy.exe\'", self.autodesk_directory, + 'Maya Python Executable (mayapy.exe)') + except Exception: + msg = QMessageBox() + msg.setIcon(QMessageBox.Critical) + msg.setText("You must have Maya installed to use this script!") + msg.setWindowTitle("Maya Not Found") + msg.setStandardButtons(QMessageBox.Ok) + + def export_lumberyard_material(self, output, material_description): + """ + Takes one final dictionary with information gathered in the process and saves with JSON formatting into a + .material file + + :param output: + :param material_description: + :return: + """ + with open(output, 'w', encoding='utf-8') as material_file: + json.dump(material_description, material_file, ensure_ascii=False, indent=4) + + def get_separator_bar(self): + """ Convenience function for UI layout element """ + self.line.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + self.line.setLineWidth(1) + self.line.setFixedHeight(10) + self.separator_layout.addWidget(self.line) + return self.separator_layout + + def get_mayapy_path(self): + """ + Finds the most current version of Maya for use of its standalone python capabilities. + :return: + """ + maya_versions = [int(x.name[-4:]) for x in self.autodesk_directory.iterdir() if x.name.startswith('Maya')] + if maya_versions: + target_version = f'Maya{max(maya_versions)}' + return os.path.normpath(self.autodesk_directory / target_version / 'bin' / 'mayapy.exe') + else: + return None + + def get_material_attributes(self): + attribute_dictionary = {} + self.default_material_definition = self.get_material_definition(self.default_material_definition) + for key, values in self.default_material_definition['properties'].items(): + attribute_dictionary[key] = values + return attribute_dictionary + + def get_material_definition(self, material_file): + _LOGGER.debug('get_material_definition, os.getcwd() is: {}'.format(os.getcwd())) + + # build a resolved absolute path because cwd may be unknown and change running externally + material_file = Path(settings.DCCSIG_PATH, + 'SDK', 'Maya', 'Scripts', 'Python', 'kitbash_converter', + material_file).resolve() + + material_definition = {} + with open(str(material_file)) as json_file: + material_definition = json.load(json_file) + return material_definition + + def get_audit_index(self, target_index): + fbx_name = self.audit_list[target_index][0] + fbx_materials = self.audit_list[target_index][1] + return fbx_name, fbx_materials + + def set_buttons(self): + self.update_material_button.setEnabled(False) + if self.current_audit_index == 0: + self.back_button.setEnabled(False) + self.forward_button.setEnabled(True) + elif self.current_audit_index == len(self.audit_list)-1: + self.forward_button.setEnabled(False) + self.back_button.setEnabled(True) + else: + self.forward_button.setEnabled(True) + self.back_button.setEnabled(True) + + + def set_io_directories(self): + """ + This is constantly running when user interacts with the source and destination fields in the UI, validating that + the paths are legitimate. In the event that there are malformed or non-existing paths- it disables the processing + button. + :return: + """ + input_directory = self.input_path_field.text() + unlocked = True + + if self.use_directory_radio_button.isChecked(): + if os.path.isdir(input_directory.strip()): + self.input_directory = Path(input_directory.strip()) + else: + unlocked = False + # Check Relative Output Path + output_path = os.path.join(self.input_directory, self.output_directory_button.text()) + if os.path.isdir(output_path): + _LOGGER.info('Directory is valid: {}'.format(output_path)) + unlocked = True + else: + unlocked = False + else: + if os.path.isfile(input_directory.strip()): + target_path = Path(input_directory.strip()).parent / self.output_directory_button.text() + if target_path.is_dir(): + self.input_directory = Path(input_directory.strip()) + unlocked = True + else: + unlocked = False + + self.process_files_button.setEnabled(unlocked) + self.process_files_button.setFocus() + + def set_audit_list(self): + for key, value in self.processed_material_information.items(): + material_files = [] + for file in os.listdir(value['asset_location']): + if file.endswith('.material'): + material_files.append(os.path.join(value['asset_location'], file)) + self.audit_list.append([key, material_files]) + # Add Materials to Combobox + self.set_material_combobox(self.current_audit_index) + + def set_audit_window(self, material_override=None): + self.set_ui_visibility(True) + fbx_name, fbx_materials = self.get_audit_index(self.current_audit_index) + material_file = material_override if material_override else fbx_materials[0] + self.title_label.setText(fbx_name) + target_definition = self.get_material_definition(material_file) + _LOGGER.info(f'TargetDefinition:::: {target_definition}') + for key in self.material_attributes.keys(): + if key in target_definition['properties'].keys(): + _LOGGER.info('++++++++++++++++ TargetDefinition [{}]: {}'.format(key, target_definition['properties'][key])) + self.material_attributes[key].set_material_attributes(key, target_definition['properties'][key]) + else: + _LOGGER.info(f'{key} NOT IN Definition Keys!!!!') + self.material_attributes[key].set_material_attributes(key, None) + + def set_material_combobox(self, object_index): + self.material_combobox.blockSignals(True) + self.material_combobox.clear() + self.material_combobox_items.clear() + for item in self.audit_list[object_index][1]: + self.material_combobox_items.append(item.split('\\')[-1]) + self.material_combobox.addItems(self.material_combobox_items) + self.material_combobox.setCurrentIndex(0) + self.material_combobox.blockSignals(False) + + def set_ui_visibility(self, is_visible): + ui_controls = [ + self.back_button, + self.forward_button, + self.material_combobox, + self.update_material_button, + self.jump_button, + self.title_label, + self.line] + + for item in ui_controls: + item.setVisible(is_visible) + + ############################## + # Button Actions ############# + ############################## + + def set_directory_button_clicked(self, target): + """ + Launches a file browser dialog window for specifying file paths + + :param target: Target sets which directory is being set- input or output + :return: + """ + if self.input_path_field.text != '': + if self.use_directory_radio_button.isChecked(): + file_path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Directory', self.default_search_path, + QtWidgets.QFileDialog.ShowDirsOnly) + if file_path != '': + self.input_path_field.setText(file_path) if target == 'input' else self.output_path_field.setText( + file_path) + else: + if target == 'input': + file_browser = QtWidgets.QFileDialog() + file_path = file_browser.getOpenFileName(self, 'Set Target File', self.default_search_path, + 'FBX Files (*.fbx)') + if file_path != '': + self.input_path_field.setText(file_path[0]) + self.single_asset_file = file_path + else: + file_path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Directory', + self.desktop_location, + QtWidgets.QFileDialog.ShowDirsOnly) + if file_path != '': + self.output_path_field.setText(file_path) + self.set_io_directories() + + def radio_clicked(self): + """ + Reconfigures the UI when user toggles between single file and directory processing. + :return: + """ + self.input_path_field.setText('') + signal_sender = self.sender() + if signal_sender.text() == 'Directory': + self.input_directory_label.setText('Input Directory') + input_path = '' if not self.input_directory else str(self.input_directory) + self.input_path_field.setText(input_path) + self.file_target_method = 'Directory' + else: + self.input_directory_label.setText('Input FBX File') + input_path = '' if not self.input_directory else str(self.input_directory) + self.input_path_field.setText(str(self.single_asset_file)) + self.file_target_method = 'File' + + def forward_button_clicked(self): + new_index = self.current_audit_index + 1 + if new_index <= len(self.audit_list): + self.current_audit_index = new_index + self.set_material_combobox(self.current_audit_index) + self.set_audit_window() + self.set_buttons() + + def back_button_clicked(self): + new_index = self.current_audit_index - 1 + if new_index >= 0: + self.current_audit_index = new_index + self.set_material_combobox(self.current_audit_index) + self.set_audit_window() + self.set_buttons() + + def process_files_clicked(self): + """ + Starts the conversion process once a target directory/file and output folder has been chosen in the UI + :return: + """ + invalid_path = False + if self.use_directory_radio_button.isChecked(): + directory_path = Path(self.input_path_field.text()) + if os.path.isdir(directory_path): + self.input_directory = os.path.normpath(directory_path) + self.process_directory(directory_path) + self.hidden_button.setFocus() + else: + invalid_path = 'Please enter a valid directory path.' + + else: + fbx_path = self.input_path_field.text() + if os.path.exists(fbx_path) and fbx_path.endswith('.fbx'): + self.input_directory = os.path.normpath(os.path.dirname(fbx_path)) + self.process_single_asset(Path(fbx_path)) + self.hidden_button.setFocus() + else: + invalid_path = 'Please enter a valid FBX path.' + + if invalid_path: + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Warning) + msg.setText(invalid_path) + msg.setWindowTitle('Bad Path') + msg.setStandardButtons(QtWidgets.QMessageBox.Ok) + msg.exec_() + + def set_relative_path_clicked(self): + """ + This button action keeps output file locations positioned in the best accessible locations. If the user + attempts to assign the relative output path to a path thats base is NOT the input directory, a warning + dialog box will prompt to select a compatible path. The path that is set by default ('Objects/KB3D/CityKit') + gives the recommended formatted location. + :return: + """ + input_path = os.path.normpath(self.input_directory) + search_path = self.default_search_path if not os.path.isdir(input_path) else input_path + file_path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Output Directory', search_path, + QtWidgets.QFileDialog.ShowDirsOnly) + + if os.path.isfile(file_path): + file_path = os.path.normpath(Path(file_path).parent) + else: + file_path = os.path.normpath(Path(file_path)) + + if file_path.index(input_path) != -1: + self.relative_export_path = file_path.replace('{}\\'.format(input_path), '') + self.output_directory_button.setText(self.relative_export_path) + else: + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Warning) + msg.setText('You must choose a subdirectory of \nthe input directory location!') + msg.setWindowTitle('Bad Location') + msg.setStandardButtons(QtWidgets.QMessageBox.Ok) + msg.exec_() + + def jump_button_clicked(self): + _LOGGER.info('Jump button clicked') + jumpable_objects = [x[0] for x in self.audit_list] + self.modal_dialog = JumpDialog(jumpable_objects, self) + self.modal_dialog.jump_object_selected.connect(self.jump_object_selected) + self.modal_dialog.show() + self.modal_launched = True + + def material_combobox_changed(self): + _LOGGER.info('Material Combobox changed') + fbx_name, fbx_materials = self.get_audit_index(self.current_audit_index) + target_material = [y for y in fbx_materials if y.endswith(self.material_combobox.currentText())] + self.set_audit_window(target_material[0]) + + def reset_all_clicked(self): + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Warning) + msg.setText('Resetting the window deletes all recorded file and \nmaterial information. Do you want to continue?') + msg.setWindowTitle('Confirm Reset') + msg.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) + return_value = msg.exec_() + + if return_value == QtWidgets.QMessageBox.Ok: + self.scroll_area.verticalScrollBar().setValue(0) + for value in self.material_attributes.values(): + value.setVisible(False) + self.current_audit_index = 0 + self.audit_list = [] + self.set_buttons() + self.process_files_button.setEnabled(True) + self.processed_material_information = {} + self.set_ui_visibility(False) + self.input_path_field.setText('') + + def update_material_clicked(self): + _LOGGER.info('Update material clicked') + fbx_name, fbx_materials = self.get_audit_index(self.current_audit_index) + destination_file = [x for x in fbx_materials if x.endswith(self.material_combobox.currentText())] + material_definition = {} + for key, value in self.default_material_definition.items(): + if key != 'properties': + material_definition[key] = value + else: + temp_dict = {} + for k, v in value.items(): + target_attribute = self.material_attributes[k] + if target_attribute.custom_attribute_values: + temp_dict[k] = target_attribute.get_update_values() + material_definition[key] = temp_dict + _LOGGER.info('Updated Material Definition: {}'.format(json.dumps(material_definition, indent=4, sort_keys=False))) + _LOGGER.info(f'Destination: {destination_file[0]}') + self.export_lumberyard_material(destination_file[0], material_definition) + + + @Slot(str) + def jump_object_selected(self, selected_object): + self.modal_launched = False + for index, listing in enumerate(self.audit_list): + if listing[0] == selected_object: + self.current_audit_index = index + self.set_material_combobox(self.current_audit_index) + self.set_audit_window() + self.set_buttons() + + @Slot(bool) + def material_attribute_updated(self): + _LOGGER.info('MaterialAttributeUpdated') + self.update_material_button.setEnabled(True) + self.hidden_button.setFocus() + + +class JumpDialog(QtWidgets.QDialog): + jump_object_selected = Signal(str) + + def __init__(self, object_list, parent=None): + super(JumpDialog, self).__init__(parent) + + self.setWindowTitle('Jump To FBX') + self.setObjectName('JumpToFbx') + self.object_list = object_list + self.main_layout = QtWidgets.QVBoxLayout() + popupWidth = 300 + popupHeight = 300 + self.setGeometry(200, 200, popupWidth, popupHeight) + self.verticalContainer = QtWidgets.QVBoxLayout(self) + self.setModal(True) + + # Filter Find Widget + self.filter_find_layout = QtWidgets.QHBoxLayout() + self.verticalContainer.addLayout(self.filter_find_layout) + self.filter_label = QtWidgets.QLabel('Filter:') + self.filter_entry_field = QtWidgets.QLineEdit() + self.filter_entry_field.textChanged.connect(self.filter_object_list) + self.filter_entry_field.setFixedHeight(24) + self.filter_find_layout.addWidget(self.filter_label) + self.filter_find_layout.addWidget(self.filter_entry_field) + + # Separation Line + self.separatorLayout1 = QtWidgets.QHBoxLayout() + self.line1 = QtWidgets.QLabel() + self.line1.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + self.line1.setLineWidth(1) + self.line1.setFixedHeight(10) + self.separatorLayout1.addWidget(self.line1) + self.verticalContainer.addLayout(self.separatorLayout1) + + # ASIN Source Table + self.search_table = QtWidgets.QTableWidget() + self.search_table.setColumnCount(1) + self.search_table.horizontalHeader().setStretchLastSection(True) + self.search_table.horizontalHeader().hide() + self.search_table.verticalHeader().hide() + self.verticalContainer.addWidget(self.search_table) + + # Jump Button + self.jump_button = QtWidgets.QPushButton('Jump to Selected') + self.jump_button.clicked.connect(self.jump_button_clicked) + self.jump_button.setFixedHeight(40) + self.verticalContainer.addWidget(self.jump_button) + self.populate_search_table() + + def populate_search_table(self): + for index, entry in enumerate(self.object_list): + self.search_table.insertRow(index) + item = QtWidgets.QTableWidgetItem(entry) + item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable) + self.search_table.setItem(index, 0, item) + if index % 2 == 0: + self.search_table.item(index, 0).setBackground(QtGui.QColor(240, 240, 240)) + self.search_table.resizeRowsToContents() + + def filter_object_list(self): + ''' + Used for long listings of FBX objects for finding target folders more quickly + ''' + self.search_table.setRowCount(0) + for fbx_object in self.object_list: + if self.filter_entry_field.text() in fbx_object: + count = self.search_table.rowCount() + self.search_table.insertRow(count) + item = QtWidgets.QTableWidgetItem(fbx_object) + self.search_table.setItem(count, 0, item) + if count % 2 == 0: + self.search_table.item(count, 0).setBackground(QtGui.QColor(240, 240, 240)) + self.search_table.resizeRowsToContents() + + def jump_button_clicked(self): + selected_object = self.search_table.selectedItems() + target_object = selected_object[0].text() + self.jump_object_selected.emit(target_object) + self.close() + + +class AttributeListing(QtWidgets.QWidget): + ''' This creates a search result entry in the combiner tab ''' + attribute_changed = Signal(bool) + + def __init__(self, attribute_values, parent=None): + super(AttributeListing, self).__init__(parent) + self.attribute_values = None + self.custom_attribute_values = {} + self.bold_font = QtGui.QFont("Helvetica", 8, QtGui.QFont.Black) + self.attribute_values = attribute_values + self.listing_layout = QtWidgets.QVBoxLayout(self) + self.listing_layout.addStretch(1) + self.listing_layout.setAlignment(QtCore.Qt.AlignTop) + self.message_color_frame = QtWidgets.QFrame(self) + self.message_color_frame.setGeometry(0, 0, 5000, 5000) + self.message_color_frame.setStyleSheet('background-color:rgb(125, 125, 125);') + self.listing_title = QtWidgets.QLabel(self.get_attribute_title()) + self.listing_title.setFont(self.bold_font) + self.listing_title.setStyleSheet('color: white;') + self.listing_layout.addWidget(self.listing_title) + self.attributes_table = QtWidgets.QTableWidget() + self.attributes_table.itemChanged.connect(self.table_item_update) + self.attributes_table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.attributes_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.attributes_table.setColumnCount(2) + self.attributes_table.setFocusPolicy(QtCore.Qt.NoFocus) + header = self.attributes_table.horizontalHeader() + header.setFont(self.bold_font) + header.setStyleSheet('color: rgb(125, 125, 125);') + header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) + header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) + vertical_header = self.attributes_table.verticalHeader() + vertical_header.setVisible(False) + self.attributes_table.setHorizontalHeaderLabels([' Attribute Name ', 'Attribute Value']) + self.attributes_table.setAlternatingRowColors(True) + self.listing_layout.addWidget(self.attributes_table) + self.setVisible(False) + + def populate_attributes_table(self): + """ + Feeds texture information into the texture table of the UI when inspecting FBX asset information + :param table_items: The texture list to be displayed- contains PBR texture type and file paths + :return: + """ + self.attributes_table.setRowCount(0) + self.attributes_table.blockSignals(True) + row = 0 + for key, value in self.attribute_values[1].items(): + self.attributes_table.insertRow(row) + self.attributes_table.setRowHeight(row, 25) + for column in range(2): + custom_value = False + cell_value = key if column == 0 else str(value) + bold_font = False + item = QtWidgets.QTableWidgetItem(cell_value) + item.setTextAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter | QtCore.Qt.AlignCenter) + if column == 0: + item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable) + else: + if self.custom_attribute_values: + if key in self.custom_attribute_values.keys(): + _LOGGER.info(f'KEY MATCH FOUND=====================>> {key}') + font = QtGui.QFont() + font.setBold(True) + item.setFont(font) + item.setText(str(self.custom_attribute_values[key])) + custom_value = True + self.attributes_table.setItem(row, column, item) + if custom_value: + self.attributes_table.item(row, column).setBackground(QtGui.QColor(255, 0, 255)) + self.attributes_table.item(row, column).setForeground(QtGui.QColor(255, 255, 255)) + + row += 1 + self.attributes_table.setMinimumSize(self.get_minimum_table_size()) + self.attributes_table.blockSignals(False) + + def set_material_attributes(self, fbx_name, custom_attribute_values): + self.fbx_name = fbx_name + self.custom_attribute_values = custom_attribute_values if custom_attribute_values else None + self.populate_attributes_table() + self.setVisible(True) + + def get_minimum_table_size(self): + w = 150 + h = self.attributes_table.horizontalHeader().height() + for i in range(self.attributes_table.rowCount()): + h += self.attributes_table.rowHeight(i) + return QtCore.QSize(w, h) + + def get_attribute_title(self): + title_dictionary = { + 'general': 'General', + 'ambientOcclusion': 'Ambient Occlusion', + 'baseColor': 'Base Color', + 'emissive': 'Emission', + 'metallic': 'Metallic', + 'roughness': 'Roughness', + 'specularF0': 'SpecularF0', + 'normal': 'Normal', + 'subsurfaceScattering': 'Subsurface Scattering', + 'opacity': 'Opacity', + 'uv': 'UV' + } + return title_dictionary[self.attribute_values[0]] + + def get_update_values(self): + _LOGGER.info(f'Getting Update Values for: {self.attribute_values[0]}') + if self.custom_attribute_values: + for key, value in self.custom_attribute_values.items(): + self.custom_attribute_values[key] = self.format_material_value(value) + return self.custom_attribute_values + + def format_material_value(self, value): + """ + In order for the formatting of the information to work properly once converted into a JSON-like material + definition, information needs to be properly formatted... not all information can be gathered as strings. This + function reviews the format of the information and makes changes if necessary for the information to carry + over properly in the definition. + :param value: The value under review for formatting issues + :return: + """ + if isinstance(value, list): + converted_list = [] + for item in value: + item_value = 0 if item is 0 else float(item) + converted_list.append(item) + return converted_list + elif isinstance(value, str): + if value.lower() in ['true', 'false']: + return bool(value.capitalize()) + elif value.isnumeric(): + return 0 if value is 0 else float(value) + else: + pattern = r'\[[^\]]*\]' + test_brackets = re.sub(pattern, '', value) + if test_brackets[0].isnumeric(): + return float(test_brackets) + else: + _LOGGER.info(f'Unknown Value Cannot Be Formatted: [{value}] --->> Type: {type(value)}') + return value + else: + return value + + + def table_item_update(self): + self.attribute_changed.emit(True) + current_row = self.attributes_table.currentRow() + target_attribute = self.attributes_table.item(current_row, 0).text() + _LOGGER.info(f'Item changed===> {target_attribute}') + default_value = self.attribute_values[1][target_attribute] + new_value = self.attributes_table.item(current_row, 1).text() + _LOGGER.info(f'TargetAttribute: {target_attribute} --> NewValue: {new_value} DefaultValue: {default_value}') + if str(new_value) != str(default_value): + if not self.custom_attribute_values: + self.custom_attribute_values = {target_attribute: new_value} + else: + self.custom_attribute_values[target_attribute] = new_value + else: + if target_attribute in self.custom_attribute_values.keys(): + del self.custom_attribute_values[target_attribute] + self.populate_attributes_table() + + +def launch_kitbash_converter(): + app = QApplication(sys.argv) + app.setStyle('Fusion') + converter = FBXConverter() + converter.show() + sys.exit(app.exec_()) + + +if __name__ == '__main__': + launch_kitbash_converter() \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/process_fbx_file.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/process_fbx_file.py new file mode 100644 index 0000000000..1a6eb0a94d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/process_fbx_file.py @@ -0,0 +1,372 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# File Description: +# This file is designed to run in Maya Standalone- it imports existing FBX files and reformats materials as Stingray +# PBS materials, and attempts to attach PBR Metal/Rough texture sets generated for each asset. There is currently a +# bug in Maya that prevents this from being possible, although it has been officially logged with Autodesk so hopefully +# a fix will exist in an updated version +# ------------------------------------------------------------------------- + + +# maya imports +from PySide2 import QtCore +import maya.cmds as mc +import maya.standalone +maya.standalone.initialize(name='python') +mc.loadPlugin("fbxmaya") +import maya.mel as mel +mel.eval('loadPlugin fbxmaya') + +# built-ins +import logging as _logging +import collections +import json +import sys +import os + +module_name = 'kitbash_converter.process_fbx_file' +_LOGGER = _logging.getLogger(module_name) + + +SUPPORTED_MATERIAL_PROPERTIES = ['baseColor', 'emissive', 'metallic', 'roughness', 'normal', 'opacity'] + + +class ProcessFbxFile(QtCore.QObject): + def __init__(self, fbx_file, base_directory, relative_destination_path, parent=None): + super(ProcessFbxFile, self).__init__(parent) + self.fbx_file = fbx_file + self.base_directory = base_directory + self.textures_directory = self.get_textures_directory() + self.relative_destination_path = relative_destination_path + self.default_material_definition = 'standardPBR.template.material' + self.transfer_data = {} + self.process_file() + + def process_file(self): + """ + This makes a copy of the Standard PBR material for use as a template when processing a Kitbash3d + asset. Then it imports the FBX file into Maya and begins the separation and material conversion + process. + :return: + """ + _LOGGER.info('MAYA STANDALONE PROCESS STARTED ---------------------------------------------') + _LOGGER.info('FBX File Passed: {}'.format(self.fbx_file)) + _LOGGER.info('Base Directory: {}'.format(self.base_directory)) + _LOGGER.info('Destination Directory: {}'.format(self.relative_destination_path)) + _LOGGER.info('-----------------------------------------------------------------------------\n') + + if self.textures_directory and os.path.exists(self.fbx_file): + # Get Material Definition Template + with open(self.default_material_definition) as json_file: + self.default_material_definition = json.load(json_file) + + mc.file(self.fbx_file, i=True, type="FBX") + return_dictionary = self.process_groups() + _LOGGER.info('ReturnDictionary: {}'.format(return_dictionary)) + json.dump(return_dictionary, sys.stdout) + _LOGGER.info('Process Complete.') + + def process_groups(self): + """ + This is the main function of the module and orchestrates the complete set of steps for extracting + each subobject from the asset FBX file and generating the .material files for use in Lumberyard. + :return: + """ + asset_dictionary = {} + ignore_list = ['persp', 'top', 'front', 'side'] + group_list = [] + for item in mc.ls(assemblies=True): + if item not in ignore_list: + group_list.append(item) + + for grp in group_list: + _LOGGER.info('\n_\n////////////////////////////////\n--> {}\n////////////////////////////////'.format(grp)) + asset_material_dictionary = self.get_asset_materials(grp) + material_dictionary = [] + for material_name, texture_set in asset_material_dictionary.items(): + _LOGGER.info('+++++ MaterialName: {} TextureSet: {}'.format(material_name, texture_set)) + fbx_parts_list = grp.split('_')[1:-1] + new_fbx_name = ('_').join(fbx_parts_list) + _LOGGER.info('NewFBXName: {}'.format(new_fbx_name)) + material_definition_name = '{}_{}.material'.format(new_fbx_name, material_name) + _LOGGER.info('Material File: {}'.format(material_definition_name)) + + # Export FBX + output_directory = os.path.join(base_directory, self.relative_destination_path, new_fbx_name) + _LOGGER.info('FBX Output Directory: {}'.format(output_directory)) + if not os.path.exists(output_directory): + os.makedirs(output_directory) + self.export_fbx(grp, os.path.join(output_directory, '{}.fbx'.format(new_fbx_name))) + material_definition = self.create_object_material(output_directory, material_definition_name, + texture_set, material_name) + asset_dictionary[new_fbx_name] = {'asset_location': output_directory} + return asset_dictionary + + def find_textures(self, material_name): + """ + This is run if there were no files attached to materials. There appears to be material sets for all materials, + and in the case of glass textures they just are not assigned. + :param material_name: The material name inside of the FBX- if there are textures they will begin with this. + """ + _LOGGER.info('Searching for textures for the following material: {}'.format(material_name)) + texture_set = {} + for file in os.listdir(self.textures_directory): + if file.startswith(material_name): + try: + texture_type = self.get_texture_type(file) + texture_set[texture_type] = os.path.join(self.textures_directory, file) + except Exception as e: + _LOGGER.info('Could not create texture record for file [{}]... Exception: {}'.format(file, e)) + return texture_set + + def create_object_material(self, output_directory, material_definition_name, texture_dictionary, material_name): + """ + Using the file textures present, this function takes materials and associated texture sets + and forms the .material file based on those values for each material/fbx found + :param output_directory: The destination directory for the exported assets + :param material_definition_name: The name for the exported .material file + :param texture_dictionary: All the file textures associated with a material + :return: + """ + output_path = os.path.join(output_directory, material_definition_name) + _LOGGER.info('Creating Material: {} OutputPath: {}'.format(material_definition_name, output_path)) + + if not os.path.exists(output_path): + material_definition = collections.OrderedDict() + material_template = self.default_material_definition.copy() + try: + for key, values in material_template.items(): + # These values remain constant + if key != 'properties': + material_definition[key] = values + else: + modified_items = {} + for material_property in SUPPORTED_MATERIAL_PROPERTIES: + for k, v in values.items(): + if k.lower() in texture_dictionary.keys(): + temp_dict = self.get_texture_attributes(k.lower(), texture_dictionary, material_name) + modified_items[k] = temp_dict + + if modified_items: + material_definition[key] = modified_items + + if len(material_definition) > 4: + _LOGGER.info('\n++++++++++++++\n+++++++++++++++\nFinal Material: {}\n++++++++++++++\n' + '+++++++++++++++\n_\n'.format(json.dumps(material_definition, indent=4, sort_keys=False))) + self.export_lumberyard_material(output_path, material_definition) + except Exception as e: + _LOGGER.info('Problem creating Material Definition: {}'.format(e)) + + def remediate_empty_material(self, material_name): + _LOGGER.info('Resolving empty material::::::: {}'.format(material_name)) + + ############################## + # Getters/Setters ############ + ############################## + + def get_asset_materials(self, target_group): + """ + Pulls information about assigned materials from materials in order to coordinate file textures present + for each material being set up for Lumberyard. + :param target_group: Kitbash 3d assets contain several subobjects grouped under locators. "Target group" + signifies a group from the total set of groups present. + :return: + """ + _LOGGER.info('Getting Asset Materials... Target Group: {}'.format(target_group)) + materials_dictionary = {} + mc.select(target_group, hierarchy=True) + + target_nodes = mc.ls(sl=True, dag=True, s=True) + sg = mc.listConnections(target_nodes, type= 'shadingEngine') + materials = list(set(mc.ls(mc.listConnections(sg), materials=True))) + + for material_name in materials: + found_textures = [] + texture_files = [x for x in mc.listConnections(material_name, plugs=1, source=1) if x.endswith('outColor')] + for file_name in texture_files: + try: + found_textures.append(mc.getAttr('{}.fileTextureName'.format(file_name.split('.')[0]))) + except Exception as e: + _LOGGER.info('Error occured: {}'.format(e)) + + texture_set = self.get_texture_set(found_textures) if found_textures else self.find_textures(material_name) + if texture_set: + materials_dictionary[material_name] = texture_set + else: + attribute_list = self.remediate_empty_material(material_name) + if attribute_list: + materials_dictionary[material_name] = attribute_list + return materials_dictionary + + def get_textures_directory(self): + for (root, dirs, files) in os.walk(self.base_directory, topdown=True): + for dir in dirs: + if dir.lower() == 'textures': + return os.path.join(root, dir) + return None + + def get_texture_set(self, texture_files): + """ + Gets the entire set of textures associated with a material using a single texture. + :param texture_files: + :return: + """ + texture_set = {} + for texture_file in texture_files: + base_texture_name = self.get_base_texture_name(texture_file) + for file in os.listdir(self.textures_directory): + if file.startswith(base_texture_name): + try: + texture_type = self.get_texture_type(file) + texture_set[texture_type] = os.path.join(self.textures_directory, file) + _LOGGER.info('{} texture added. Path::: {}'.format(texture_type, os.path.join(self.textures_directory, file))) + except Exception: + pass + return texture_set + + def get_texture_type(self, file): + """ + Tries to extract the texture type from a texture filename (ie "basecolor", "roughness") + + :param file: The file name to get the texture type from + """ + file_stem = file.split('.')[0] + file_parts = file_stem.split('_') + if len(file_parts) > 1: + return file_parts[-1] + + def get_texture_attributes(self, texture_type, texture_dictionary, material_name): + target_path = os.path.normpath(texture_dictionary[texture_type]) + if texture_type == 'opacity': + temp_dict = self.get_opacity_settings(material_name, target_path) + elif texture_type == 'subsurfacescattering': + temp_dict = self.get_sss_settings(material_name, target_path) + elif texture_type == 'emissive': + temp_dict = self.get_emissive_settings(material_name, target_path) + elif texture_type == 'basecolor': + temp_dict = self.get_basecolor_settings(material_name, target_path) + else: + temp_dict = {'textureMap': self.get_relative_path(target_path)} + + return temp_dict + + def get_opacity_settings(self, material_name, target_path): + """ + Reads Maya material to construct material opacity attributes + + :param material_name: The Maya Material name being translated for Lumberyard + :param target_path: The path to the texture file + :return: Attribute values as a dictionary + """ + _LOGGER.info('Getting opacity settings...') + return {'alphaSource': 'Split', 'mode': 'Cutout', 'textureMap': self.get_relative_path(target_path)} + + def get_sss_settings(self, material_name, target_path): + """ + Reads Maya material to construct material subsurface scattering attributes + + :param material_name: The Maya material name being translated for Lumberyard + :param target_path: The path to the texture file + :return: Attribute values as a dictionary + """ + _LOGGER.info('Getting Subsurface Scattering settings...') + return {'enableSubsurfaceScattering': True, 'influenceMap': self.get_relative_path(target_path)} + + def get_emissive_settings(self, material_name, target_path): + """ + Reads Maya material to construct material emissive attributes + + :param material_name: The Maya material name being translated for Lumberyard + :param target_path: The path to the texture file + :return: Attribute values as a dictionary + """ + _LOGGER.info('Getting Emissive settings...') + return {'enable': True, 'intensity': 4, 'textureMap': self.get_relative_path(target_path)} + + def get_basecolor_settings(self, material_name, target_path): + """ + Reads Maya material to construct material BaseColor settings + + :param material_name: The Maya material name being translated for Lumberyard + :param target_path: The path to the texture file + :return: Attribute values as a dictionary + """ + _LOGGER.info('Getting BaseColor settings...') + # Get shader color values + return {'textureMap': self.get_relative_path(target_path)} + + def get_base_texture_name(self, texture_path): + """ + Tries to extract texture name without the added texture type (ie "basecolor", "roughness", etc) + + :param texture_path: The path to the texture from which to extract the base texture name + """ + path_list = texture_path.split('\\') + file_name = path_list[-1] + texture_list = file_name.split('_') + base_texture_name = ('_').join(texture_list[:-1]) + return base_texture_name + + def get_relative_path(self, full_path): + """ + Material definitions use relative paths for file textures- this function takes the full paths of assets and + converts to the abbreviated relative path format needed for Lumberyard to source the files + + :param full_path: Full path to the asset + :return: + """ + truncated_path = self.textures_directory.split('AtomContent\\')[-1] + start_directory = truncated_path.split('\\')[0] + path_list = full_path.split('\\') + return_path = ('/').join(path_list[path_list.index(start_directory):]) + return return_path + + ############################## + # Export Files ############### + ############################## + + def export_fbx(self, group_name, output_path): + """ + Exports sub-objects from Kitbash3d assets, groups of assets are contained in a single FBX for delivery. + + :param group_name: Group name inside of FBX- subobjects are grouped under locators + :param output_path: The destination path for the exported FBX object + :return: + """ + if not os.path.exists(output_path): + mc.move(0, 0, 0, group_name, absolute=True) + mc.select(group_name, hierarchy=True) + mc.FBXExport('-file', output_path, '-s') + mc.select(clear=True) + + def export_lumberyard_material(self, output_path, material_description): + """ + Takes one final dictionary with information gathered in the process and saves with JSON formatting into a + .material file + + :param output: + :param material_description: + :return: + """ + _LOGGER.info('Output .material++++++>> {}'.format(output_path)) + with open(output_path, 'w') as material_file: + json.dump(dict(material_description), material_file, ensure_ascii=False, indent=4) + + +fbx_file = sys.argv[1] +_LOGGER.info('FBX file: {}'.format(fbx_file)) +base_directory = sys.argv[-2] +_LOGGER.info('Base Directory: {}'.format(base_directory)) +relative_destination_path = sys.argv[-1].replace('/', '\\') +_LOGGER.info('Relative Destination Path: {}'.format(relative_destination_path)) +ProcessFbxFile(fbx_file, base_directory, relative_destination_path) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standalone.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standalone.py new file mode 100644 index 0000000000..e768611c3d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standalone.py @@ -0,0 +1,40 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +"""Boostraps and Starts Standalone DCC Material Converter utility""" + +# built in's +import os +import site + +_MODULE_PATH = os.path.abspath(__file__) + +_DCCSIG_REL_PATH = "../../../.." +_DCCSIG_PATH = os.path.join(_MODULE_PATH, _DCCSIG_REL_PATH) +_DCCSIG_PATH = os.path.normpath(_DCCSIG_PATH) + +_DCCSIG_PATH = os.getenv('DCCSIG_PATH', + os.path.abspath(_DCCSIG_PATH)) + +# we don't have access yet to the DCCsi Lib\site-packages +site.addsitedir(_DCCSIG_PATH) # PYTHONPATH + +# azpy bootstrapping and extensions +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +settings = _config.get_config_settings(setup_ly_pyside=True) + +from main import launch_kitbash_converter + +launch_kitbash_converter() \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standardPBR.template.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standardPBR.template.material new file mode 100644 index 0000000000..5632c6fc0d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standardPBR.template.material @@ -0,0 +1,86 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "general": { + "texcoord": 0 + }, + "ambientOcclusion": { + "factor": 1.0, + "useTexture": false, + "textureMap": "" + }, + "baseColor": { + "color": [ + 1.0, + 1.0, + 1.0 + ], + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "emissive": { + "color": [ + 1.0, + 1.0, + 1.0 + ], + "enable": false, + "intensity": -5.0, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "metallic": { + "factor": 1.0, + "useTexture": false, + "textureMap": "" + }, + "roughness": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": false, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif" + }, + "subsurfaceScattering": { + "enableSubsurfaceScattering": true, + "influenceMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif", + "quality": 0.4, + "scatterDistance": 8, + "subsurfaceScatterFactor": 1 + }, + "opacity": { + "mode": "Opaque", + "alphaSource": "Packed", + "doubleSided": false, + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "textureMap": "" + }, + "uv": { + "center": [ + 0, + 0 + ], + "offsetU": 0, + "offsetV": 0, + "rotateDegrees": 0, + "scale": 1.0, + "tileU": 1.0, + "tileV": 1.0 + } + } +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/.gitignore new file mode 100644 index 0000000000..165c04895b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/.gitignore @@ -0,0 +1,3 @@ +.temp +materialsdb.dat +materialsdb.dir \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Cmd.bat new file mode 100644 index 0000000000..35475366cc --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Cmd.bat @@ -0,0 +1,48 @@ +:: coding:utf-8 +:: !/usr/bin/python +:: +:: All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +:: its licensors. +:: +:: For complete copyright and license terms please see the LICENSE at the root of this +:: distribution (the "License"). All use of this software is governed by the License, +:: or, if provided, by the license below or the license accompanying this file. Do not +:: remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +:: + +@echo off +:: Set up and run LY Python CMD prompt +:: Sets up the DccScriptingInterface_Env, +:: Puts you in the CMD within the dev environment + +:: Set up window +TITLE Lumberyard DCC Scripting Interface Cmd +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Keep changes local +SETLOCAL enableDelayedExpansion + +CALL %~dp0\Project_Env.bat + +echo. +echo _____________________________________________________________________ +echo. +echo ~ LY DCC Scripting Interface CMD ... +echo _____________________________________________________________________ +echo. + +:: Create command prompt with environment +CALL %windir%\system32\cmd.exe + +ENDLOCAL + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Maya_2020.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Maya_2020.bat new file mode 100644 index 0000000000..9705898e10 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Maya_2020.bat @@ -0,0 +1,71 @@ +:: coding:utf-8 +:: !/usr/bin/python +:: +:: All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +:: its licensors. +:: +:: For complete copyright and license terms please see the LICENSE at the root of this +:: distribution (the "License"). All use of this software is governed by the License, +:: or, if provided, by the license below or the license accompanying this file. Do not +:: remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +:: + +@echo off +:: Launches maya with a bunch of local hooks for Lumberyard +:: ToDo: move all of this to a .json data driven boostrapping system + +%~d0 +cd %~dp0 +PUSHD %~dp0 + +echo ________________________________ +echo ~ calling PROJ_Env.bat + +:: Keep changes local +SETLOCAL enableDelayedExpansion + +:: PY version Major +set DCCSI_PY_VERSION_MAJOR=2 +echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% + +:: PY version Major +set DCCSI_PY_VERSION_MINOR=7 +echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% + +:: Maya Version +set MAYA_VERSION=2020 +echo MAYA_VERSION = %MAYA_VERSION% + +:: if a local customEnv.bat exists, run it +IF EXIST "%~dp0Project_Env.bat" CALL %~dp0Project_Env.bat + +echo ________________________________ +echo Launching Maya %MAYA_VERSION% for Lumberyard... + +:::: Set Maya native project acess to this project +::set MAYA_PROJECT=%LY_PROJECT% +::echo MAYA_PROJECT = %MAYA_PROJECT% + +:: DX11 Viewport +Set MAYA_VP2_DEVICE_OVERRIDE = VirtualDeviceDx11 + +:: Default to the right version of Maya if we can detect it... and launch +IF EXIST "%MAYA_LOCATION%\bin\Maya.exe" ( + start "" "%MAYA_LOCATION%\bin\Maya.exe" %* +) ELSE ( + Where maya.exe 2> NUL + IF ERRORLEVEL 1 ( + echo Maya.exe could not be found + pause + ) ELSE ( + start "" Maya.exe %* + ) +) + +:: Return to starting directory +POPD + +:END_OF_FILE + +exit /b 0 \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_WingIDE-7-1.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_WingIDE-7-1.bat new file mode 100644 index 0000000000..a02afd58fe --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_WingIDE-7-1.bat @@ -0,0 +1,84 @@ +:: coding:utf-8 +:: !/usr/bin/python +:: +:: All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +:: its licensors. +:: +:: For complete copyright and license terms please see the LICENSE at the root of this +:: distribution (the "License"). All use of this software is governed by the License, +:: or, if provided, by the license below or the license accompanying this file. Do not +:: remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +:: + +@echo off +:: Launches Wing IDE and the DccScriptingInterface Project Files + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Setting up LY DCCsi WingIDE Dev Env... +echo _____________________________________________________________________ +echo. + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Keep changes local +SETLOCAL enableDelayedExpansion + +SET ABS_PATH=%~dp0 +echo Current Dir, %ABS_PATH% + +:: WingIDE version Major +SET WING_VERSION_MAJOR=7 +echo WING_VERSION_MAJOR = %WING_VERSION_MAJOR% + +:: WingIDE version Major +SET WING_VERSION_MINOR=1 +echo WING_VERSION_MINOR = %WING_VERSION_MINOR% + +:: note the changed path from IDE to Pro +set WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% +echo WINGHOME = %WINGHOME% + +CALL %~dp0\Project_Env.bat + +echo. +echo _____________________________________________________________________ +echo. +echo ~ WingIDE Version %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% +echo _____________________________________________________________________ +echo. + +SET WING_PROJ=%DCCSIG_PATH%\Solutions\.wing\DCCsi_%WING_VERSION_MAJOR%x.wpr +echo WING_PROJ = %WING_PROJ% + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Launching %LY_PROJECT% project in WingIDE %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% ... +echo _____________________________________________________________________ +echo. + + +IF EXIST "%WINGHOME%\bin\wing.exe" ( + start "" "%WINGHOME%\bin\wing.exe" "%WING_PROJ%" +) ELSE ( + Where wing.exe 2> NUL + IF ERRORLEVEL 1 ( + echo wing.exe could not be found + pause + ) ELSE ( + start "" wing.exe "%WING_PROJ%" + ) +) + +ENDLOCAL + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Project_Env.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Project_Env.bat new file mode 100644 index 0000000000..8e7447203c --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Project_Env.bat @@ -0,0 +1,75 @@ +:: coding:utf-8 +:: !/usr/bin/python +:: +:: All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +:: its licensors. +:: +:: For complete copyright and license terms please see the LICENSE at the root of this +:: distribution (the "License"). All use of this software is governed by the License, +:: or, if provided, by the license below or the license accompanying this file. Do not +:: remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +:: + +@echo off +:: Sets up environment for Lumberyard DCC tools and code access + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +for %%a in (.) do set LY_PROJECT=%%~na + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Setting up LY DSI PROJECT Environment ... +echo _____________________________________________________________________ +echo. + +echo LY_PROJECT = %LY_PROJECT% + +:: Put you project env vars and overrides here + +:: chanhe the relative path up to dev +set DEV_REL_PATH=../../.. +set ABS_PATH=%~dp0 + +:: Override the default maya version +set MAYA_VERSION=2020 +echo MAYA_VERSION = %MAYA_VERSION% + +set LY_PROJECT_PATH=%ABS_PATH% +echo LY_PROJECT_PATH = %LY_PROJECT_PATH% + +:: Change to root Lumberyard dev dir +CD /d %LY_PROJECT_PATH%\%DEV_REL_PATH% +set LY_DEV=%CD% +echo LY_DEV = %LY_DEV% + +CALL %LY_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Launchers\Windows\Env.bat + +rem :: Constant Vars (Global) +rem SET LYPY_GDEBUG=0 +rem echo LYPY_GDEBUG = %LYPY_GDEBUG% +rem SET LYPY_DEV_MODE=0 +rem echo LYPY_DEV_MODE = %LYPY_DEV_MODE% +rem SET LYPY_DEBUGGER=WING +rem echo LYPY_DEBUGGER = %LYPY_DEBUGGER% + +:: Restore original directory +popd + +:: Change to root dir +CD /D %ABS_PATH% + +:: if the user has set up a custom env call it +IF EXIST "%~dp0User_Env.bat" CALL %~dp0User_Env.bat + +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/__init__.py new file mode 100644 index 0000000000..a89840703b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/__init__.py @@ -0,0 +1,24 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +__all__ = [ + 'create_maya_files', + 'constants' + 'image_conversion', + 'isolate_and_assign', + 'lumberyard_data', + 'cli_control', + 'utilities', + 'main' +] diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/cli_control.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/cli_control.py new file mode 100644 index 0000000000..32b10b73da --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/cli_control.py @@ -0,0 +1,48 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +import click +import os +import main as app_main + + +@click.version_option('1.0.0') +@click.option('--output', default='PBR', help='Lumberyard material type. Current options: [pbr_basic]') +@click.argument('operands', type=click.STRING, nargs=-1) +@click.command(context_settings=dict(ignore_unknown_options=True)) +def main(output, operands): + target_files = [] + for index, operand in enumerate(operands): + entry_path = os.path.abspath(str(operand)) + if os.path.isdir(entry_path): + for directory_path, directory_names, file_names in os.walk(entry_path): + for file_name in file_names: + if is_valid_file(file_name): + target_files.append(os.path.join(entry_path, file_name)) + else: + if is_valid_file(operand): + target_files.append(operand) + + if len(target_files): + app_main.launch_cli(output, target_files) + + +def is_valid_file(file_name): + target_extensions = 'ma mb fbx blend max'.split(' ') + if file_name.split('.')[-1] in target_extensions: + return True + return False + + +if __name__ == '__main__': + main() + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/constants.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/constants.py new file mode 100644 index 0000000000..254becf913 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/constants.py @@ -0,0 +1,77 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +# File Description: +# This is an area to make customized changes in how the script looks for and processes files +# ------------------------------------------------------------------------- + + +IMAGE_TYPES = ['.tif', '.tiff', '.png', '.jpg', '.jpeg', '.tga'] + +DIRECTORY_EXCLUSION_LIST = ['.mayaSwatches'] + +LUMBERYARD_DATA_FILES = ['.mtl', '.assetinfo', '.material'] + +EXPORT_MATERIAL_TYPES = ['Illum'] + +PREFERRED_IMAGE_FORMAT = '.tif' + +TRANSFER_EXTENSIONS = ['.fbx', '.assetinfo'] + +IMAGE_KEYS = { + 'ddn': ['ddn'], + 'ddna': ['ddna'], + 'diffuse': ['diffuse', 'diff', 'dif', 'd'], + 'emissive': ['emis', 'emissive', 'e', 'emiss'], + 'specular': ['spec', 'specular'], + 'scattering': ['scattering', 'sss'], + 'normal': ['normal'], + 'basecolor': ['basecolor', 'albedo'] +} + +LOAD_WEIGHTS = { + 'maya': 4, + 'fbx': 2, + 'material': 1 +} + +SUPPORTED_MATERIAL_PROPERTIES = ['general', 'ambientOcclusion', 'baseColor', 'emissive', + 'metallic', 'roughness', 'specularF0', 'normal', 'opacity', 'uv'] + +MATERIAL_SUFFIX_LIST = ['_mat', '_m'] + +DIELECTRIC_METALLIC_COLOR = (.04, .04, .04) + +# For more information see OpenImageIO docs +# https://openimageio.readthedocs.io/en/latest/pythonbindings.html +# Recommended weight values for: +# ImageBufAlgo.channel_sum +WEIGHTED_RGB_VALUES = (.2126, .7152, .0722) + +# MATERIAL DB +FBX_DIRECTORY_PATH = 'directorypath' +FBX_DIRECTORY_NAME = 'directoryname' +FBX_FILES = 'fbxfiles' +FBX_MATERIALS = 'materials' +FBX_TEXTURES = 'textures' +FBX_MAYA_FILE = 'mayafile' +FBX_DESIGNER_FILE = 'designerfile' +FBX_TEXTURE_MODIFICATIONS = 'modifications' +FBX_NUMERICAL_SETTINGS = 'numericalsettings' +FBX_MATERIAL_FILE = 'materialfile' +FBX_ASSIGNED_GEO = 'assigned' + +# Threshold values for baked vertex color +# id mask images when no UVs present +EMPTY_IMAGE_LOW = 260000 +EMPTY_IMAGE_LOW = 270000 \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/create_maya_files.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/create_maya_files.py new file mode 100644 index 0000000000..ba6f351154 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/create_maya_files.py @@ -0,0 +1,366 @@ +# coding:utf-8 +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# File Description: +# This file is designed to run in Maya Standalone- it imports existing FBX files and reformats materials as Stingray +# PBS materials, and attempts to attach PBR Metal/Rough texture sets generated for each asset. There is currently a +# bug in Maya that prevents this from being possible, although it has been officially logged with Autodesk so hopefully +# a fix will exist in an updated version +# ------------------------------------------------------------------------- + + +# maya imports +from PySide2 import QtCore +import maya.cmds as mc +import maya.standalone +maya.standalone.initialize(name='python') +mc.loadPlugin("fbxmaya") +import maya.mel as mel +mel.eval('loadPlugin fbxmaya') + +# built-ins +import logging as _logging +import shelve +import json +import time +import sys +import os + +# local tool imports +import constants + + +module_name = 'legacy_asset_converter.create_maya_files' +_LOGGER = _logging.getLogger(module_name) + + +class CreateMayaFiles(QtCore.QObject): + def __init__(self, files_list, base_directory, destination_directory, modify_naming, parent=None): + super(CreateMayaFiles, self).__init__(parent) + self.files_list = files_list + self.base_directory = base_directory + self.destination_directory = destination_directory + self.modify_naming = modify_naming + self.scene_shader_info = None + self.materials_db = shelve.open('materialsdb', protocol=2) + self.new_file = True + self.file_name = None + self.target_database_listing = None + self.material_list = {} + self.transfer_data = {} + self.create_maya_files() + + def create_maya_files(self): + """ + The main function of the script- this runs when the standalone session begins, and creates a Maya file + based on each FBX file the script is passed through the subprocess that launches it. Due to the bug mentioned + in the description above, a template file ('stingray_helper.ma') is loaded into the file so Maya at least + knows what a Stingray material is- the root of the bug is that when it loads up it is unaware of the Stingray + material node as well as its extended attributes. This workaround informs Maya of what a Stingray material is, + although it is limited to this information only- it still doesn't know what the attributes of the material are + that are necessary for making texture connections. This function processes each file, makes a note of it, and + continues to move through the passed list until all FBX files have had companion Maya files created, and then + returns a receipt of converted files. + :return: + """ + _LOGGER.info('Base Directory: {}'.format(self.base_directory)) + _LOGGER.info('Destination Directory: {}'.format(self.destination_directory)) + _LOGGER.info('Files List: {}'.format(self.files_list)) + + for count, fbx_file in enumerate(self.files_list): + target_file_path = os.path.join(self.base_directory, fbx_file) + target_file_path = target_file_path.replace('\\', '/') + self.file_name = os.path.basename(fbx_file) + maya_file_name = os.path.join(self.destination_directory,'{}.ma'.format(os.path.splitext(self.file_name)[0])) + sys.stdout.write('maya_{}'.format(maya_file_name)) + self.flush_then_wait() + _LOGGER.info('\n\n++++++++++\n++++++++++>>>>\n {}\n++++++++++>>>>\n++++++++++\n'.format(self.file_name)) + + if not os.path.isfile(maya_file_name): + try: + self.reset_transfer_values() + mc.file('stingray_helper.ma', o=True, force=True) + mc.listAttr('StingrayTemplate') + mc.listAttr('StingrayTemplate') + mc.file(target_file_path, i=True, type="FBX") + self.get_file_information(self.file_name, True) + self.replace_materials() + mc.delete('stingrayHelper') + # mel.eval('cleanUpScene 3') + mc.file(rename=maya_file_name) + mc.file(save=True, type='mayaAscii', force=True) + _LOGGER.info('Maya File Processing Complete... Transferring:') + _LOGGER.info('FileName: {}'.format(self.file_name)) + _LOGGER.info('MayaFileName: {}'.format(maya_file_name)) + self.transfer_data[self.file_name] = {'maya_file': maya_file_name} + except Exception as e: + _LOGGER.info('Error Processing File: {} -- {}'.format(e, target_file_path)) + else: + mc.file(maya_file_name, force=True, o=True) + self.get_file_information(fbx_file, false) + try: + return_dictionary = {self.target_database_listing: self.transfer_data} + json.dump(return_dictionary, sys.stdout) + self.materials_db.close() + except Exception as e: + _LOGGER.info('Error: {} -- {}'.format(e, self.transfer_data)) + + def flush_then_wait(self): + sys.stdout.flush() + sys.stderr.flush() + time.sleep(0.5) + + def get_file_information(self, fbx_file, new_file): + """ + Draws information relating to the target directory of the shelve database to gather texture assignments + :param fbx_file: + :param new_file: + :return: + """ + self.new_file = new_file + for key, values in self.materials_db.items(): + if os.path.normpath(values['directorypath']) == self.base_directory: + self.target_database_listing = key + self.material_list = values['fbxfiles'][fbx_file] + break + + def reset_transfer_values(self): + """ + Refreshes variables in between each FBX file processed + + :return: + """ + self.new_file = True + self.material_list.clear() + + def replace_materials(self): + """ + Finds the currently assigned Phong and Lambert shaders customary with Legacy material setups in FBX files + and replaces with Stingray PBS materials. + :return: + """ + for key, values in self.material_list['materials'].items(): + _LOGGER.info('\n_\n---------|| Processing material: {}'.format(key)) + if self.new_file: + try: + material_name = str(self.resolve_legacy_material(key)) + _LOGGER.info('MaterialName: {}'.format(material_name)) + _LOGGER.info('MaterialInfo: {}'.format(values)) + if values['assigned']: + target_assignments = values['assigned'] + _LOGGER.info('TargetAssignments: {}'.format(target_assignments)) + sha, sg = self.get_material(material_name) + _LOGGER.info('ShaderInfo: {}, {}'.format(sha, sg)) + if target_assignments: + _LOGGER.info('Target Assignments exist- Assigning Shader...') + self.set_material(sha, sg, target_assignments) + # Disabled until Autodesk fixes bug + # self.set_texture_maps(material_name, values['textures']) + except Exception as e: + _LOGGER.info('Cannot replace materials... Error: {}'.format(e)) + + def resolve_legacy_material(self, material_name): + """ + Deletes the legacy Phong and Lambert materials so it can name newly generated Stingray materials with the + same name. + :param material_name: Legacy material name to be re-applied to new material + :return: + """ + mc.delete(material_name) + for listing in constants.MATERIAL_SUFFIX_LIST: + if material_name.lower().endswith(listing) and self.modify_naming == 'True': + string_length = len(listing) * -1 + new_material_name = material_name[:string_length] + self.material_list[new_material_name] = self.material_list[material_name] + del self.material_list[material_name] + return new_material_name + return material_name + + def get_texture_modifications(self, material_name): + """ + Checks for tiling information drawn from the corresponding mtl file. Because the attributes are currently + not able to be accessed, this function has been tabled for now + + :param material_name: Target material name + :return: + """ + _LOGGER.info('Scanning for texture modifications...') + for material in self.textures_modifications: + _LOGGER.info('Modification listing:::: {}'.format(material)) + + def get_material(self, material_name): + """ + Gets material assignments and swaps legacy formatted materials with Stingray PBS materials + :param material_name: Target material name + :return: + """ + _LOGGER.info('Shaders in scene: {}'.format(self.get_materials_in_scene())) + sha = None + sg = None + if material_name in self.get_materials_in_scene(): + _LOGGER.info('Deleting material: {}'.format(material_name)) + mc.delete(material_name) + + _LOGGER.info('Creating Stingray material: {}'.format(material_name)) + try: + sha = mc.shadingNode('StingrayPBS', asShader=True, name=material_name) + sg = mc.sets(renderable=True, noSurfaceShader=True, empty=True) + mc.connectAttr(sha + '.outColor', sg + '.surfaceShader', force=True) + except Exception as e: + _LOGGER.info('Shader creation failed: {}'.format(e)) + return sha, sg + + def get_scene_shader_info(self): + """ + Audits scene to gather all materials present in scene geometry (that is to be converted) + :return: + """ + self.scene_shader_info = {} + scene_geo = mc.ls(v=True, geometry=True) + for target_mesh in scene_geo: + try: + shading_groups = list(set(mc.listConnections(target_mesh, type='shadingEngine'))) + for sg in shading_groups: + if sg not in self.scene_shader_info.keys(): + self.scene_shader_info[sg] = list(set(mc.ls(mc.listConnections(sg), materials=True))) + except Exception: + pass + + def get_materials_in_scene(self): + """ + Audits scene to gather all materials present in the Hypershade, and returns them in a list + :return: + """ + material_list = [] + for shading_engine in mc.ls(type='shadingEngine'): + if mc.sets(shading_engine, q=True): + for material in mc.ls(mc.listConnections(shading_engine), materials=True): + material_list.append(material) + return material_list + + def set_material(self, sha, sg, assignment_list): + """ + Assigns specified material to specified mesh + :param sha: Material name + :param sg: Shading Group + :param assignment_list: List of geometry to assign shader to + :return: + """ + assignment_list = list(set([x.replace('.', '|') for x in assignment_list])) + _LOGGER.info('\n_\nSET MATERIAL: {} {{{{{{{{{{{{{{{{{{{{{{'.format(sha)) + _LOGGER.info('Assignment list--> {}'.format(assignment_list)) + for item in assignment_list: + try: + mc.sets(item, e=True, forceElement=sg) + except Exception as e: + _LOGGER.info('Material assignment failed: {}'.format(e)) + + def set_texture_maps(self, material_name, texture_list): + """ + Plugs texture files into texture slots in the shader for specified material name. Currently due to the + aforementioned bug this functionality does not work as intended, but it remains for when Autodesk supplies a fix + :param material_name: + :param texture_list: + :return: + """ + shader_translation_keys = { + 'BaseColor': 'color', + 'Roughness': 'roughness', + 'Metallic': 'metallic', + 'Emissive': 'emissive', + 'Normal': 'normal' + } + + _LOGGER.info('\n_\nSET_TEXTURE_MAPS {{{{{{{{{{{{{{{{{{{{{{') + _LOGGER.info('Material--> {}'.format(material_name)) + for texture_type, texture_path in texture_list.items(): + try: + _LOGGER.info('Texture type: {} Texture path: {}'.format(texture_type, texture_path)) + file_count = len(mc.ls(type='file')) + 1 + texture_file = 'file{}'.format(file_count) + mc.shadingNode('file', asTexture=True, name=texture_file) + mc.setAttr('{}.fileTextureName'.format(texture_file), texture_path, type="string") + _LOGGER.info('TexturePath: {}'.format(texture_path)) + _LOGGER.info('Attributes: {}'.format(mc.listAttr(material_name))) + mc.setAttr('{}.use_{}_map'.format(material_name, shader_translation_keys[texture_type]), 1) + mc.connectAttr('{}.outColor'.format(texture_file), + '{}.TEX_{}_map'.format(material_name, shader_translation_keys[texture_type]), force=True) + except Exception as e: + _LOGGER.info('Conversion failed: {}'.format(e)) + + # Revise to make generic and put in Maya utility class -------------------------------------------------------- + # def get_textures_by_connections(self, material_name): + # _LOGGER.info(':::::: Get textures by connections ::::::') + # material_files = [x for x in mc.listConnections(material_name, plugs=1, source=1) if x.startswith('file')] + # searched_values = [] + # for material_file in material_files: + # try: + # texture_path = mc.getAttr('{}.fileTextureName'.format(material_file.split('.')[0])) + # texture_path_list = texture_path.split('/') + # if 'ShaderFX' not in texture_path_list: + # if texture_path: + # search_string = self.get_base_texture_name(texture_path) + # if search_string not in searched_values: + # _LOGGER.info('TexturePath: {}'.format(texture_path)) + # searched_values.append(search_string) + # search_results_list = self.get_texture_set(search_string, material_name) + # if search_results_list: + # self.material_list[material_name] = search_results_list + # + # except mc.MayaAttributeError: + # pass + + # def get_texture_set(self, search_string, material_name): + # target_key = self.base_directory.split('\\')[-1] + # for key, values in self.materials_db.items(): + # if values['directoryname'] == target_key: + # for texture_key, texture_set in values['textures'].items(): + # for k, v in texture_set.items(): + # texture_base = self.get_base_texture_name(v).lower() + # if texture_base.find('_') != -1: + # texture_base = '_'.join(texture_base.split('_')[:-1]) + # if texture_base == search_string: + # _LOGGER.info('MatchFound:::::::::::::::') + # _LOGGER.info('Finding modifications... MaterialName: {}'.format(material_name)) + # if material_name in self.textures_modifications.keys(): + # texture_set['modifications'] = self.textures_modifications[material_name] + # _LOGGER.info('Texture modifications found: {}'.format(self.textures_modifications[material_name])) + # return texture_set + # return None + + # def get_base_texture_name(self, texture_path): + # path_base = os.path.basename(texture_path) + # base_texture_name = os.path.splitext(path_base)[0] + # if path_base.find('_') != -1: + # base = path_base.split('_')[-1] + # suffix = base.split('.')[0] + # naming_key_found = None + # for key, values in self.texture_naming_dict.items(): + # for v in values: + # if suffix == v: + # base_list = path_base.split('_')[:-1] + # base_texture_name = '_'.join(base_list) + # return base_texture_name + # return base_texture_name + + +# ++++++++++++++++++++++++++++++++++++++++++++++++# +# Maya Specific Shader Mapping # +# ++++++++++++++++++++++++++++++++++++++++++++++++# + +_LOGGER.info('MAYA STANDALONE FILE FIRING: {}'.format(sys.argv)) +file_list = sys.argv[1:-3] +base_directory = sys.argv[-3] +destination_directory = sys.argv[-2] +modify_naming = sys.argv[-1] +CreateMayaFiles(file_list, base_directory, destination_directory, modify_naming) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/image_conversion.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/image_conversion.py new file mode 100644 index 0000000000..e8cc01e6f0 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/image_conversion.py @@ -0,0 +1,349 @@ +# coding:utf-8 +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# File Description: +# This file is contains OpenImageIO operations for file texture conversions +# ------------------------------------------------------------------------- + + +# built-ins +from shutil import copyfile +import logging as _logging +from pathlib import Path +import constants +import os + +# 3rd Party (we may or do provide) +import OpenImageIO +from OpenImageIO import ImageInput, ImageOutput, ImageBuf, ImageSpec, ImageBufAlgo, ROI + + +module_name = 'legacy_asset_converter.main.image_conversion' +_LOGGER = _logging.getLogger(module_name) + + +def get_pbr_textures(legacy_textures, destination_directory, search_path, base_directory): + pbr_textures = {} + for texture_type, texture_path in legacy_textures.items(): + _LOGGER.info(f'TEXTURETYPE::> {texture_type} TEXTUREPATH::> {texture_path}') + if not texture_path.is_file(): + _LOGGER.info(f'(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( Missing:::: {texture_path}') + existing_path = resolve_path(texture_path, base_directory) + if not existing_path: + continue + _LOGGER.info(f'Found texture [{existing_path}]. Continuing...') + texture_path = Path(existing_path) + if texture_type == 'diffuse': + dst = get_converted_filename(texture_path, destination_directory, 'BaseColor') + pbr_textures['BaseColor'] = transfer_texture(dst, texture_path) if not os.path.isfile(dst) else dst + elif texture_type == 'specular': + dst = get_converted_filename(texture_path, destination_directory, 'Metallic') + pbr_textures['Metallic'] = convert_metallic_texture(dst, texture_path) if not os.path.isfile(dst) else dst + elif texture_type == 'emittance': + dst = get_converted_filename(texture_path, destination_directory, 'Emissive') + pbr_textures['Emissive'] = transfer_texture(dst, texture_path) if not os.path.isfile(dst) else dst + elif texture_type == 'scattering': + dst = get_converted_filename(texture_path, destination_directory, 'Scattering') + pbr_textures['SubsurfaceScattering'] = transfer_texture(dst, texture_path) if not os.path.isfile(dst) else dst + elif texture_type == 'bumpmap': + dst = get_converted_filename(texture_path, destination_directory, 'Normal') + pbr_textures['Normal'] = convert_normal_texture(dst, texture_path) if not os.path.isfile(dst) else dst + if texture_path.stem.endswith('ddna'): + dst = get_converted_filename(texture_path, destination_directory, 'Roughness') + pbr_textures['Roughness'] = convert_roughness_texture(dst, texture_path) if not os.path.isfile(dst) else dst + else: + pass + + if pbr_textures and 'Metallic' not in pbr_textures.keys(): + _LOGGER.info(f'Metallic Not found... adding: {pbr_textures}') + try: + pbr_texture_keys = list(pbr_textures.keys()) + texture_path = Path(pbr_textures[pbr_texture_keys[0]]) + filename = texture_path.name.replace(get_texture_type(texture_path), 'Metallic') + _LOGGER.info(f'Filename: {filename}') + target_file_path = destination_directory / filename + _LOGGER.info(f'TargetFilePath: {target_file_path}') + if target_file_path.is_file(): + _LOGGER.info(f'File found: {target_file_path}') + pbr_textures['Metallic'] = os.path.normpath(target_file_path) + else: + _LOGGER.info(f'Creating Generic Metallic File: {target_file_path}') + convert_metallic_texture(target_file_path) + pbr_textures['Metallic'] = target_file_path + except Exception: + pass + + _LOGGER.info(f'OUTPUT // -------------->> {pbr_textures}') + return pbr_textures + + +def resolve_path(texture_path, base_directory): + _LOGGER.info(f'Resolving Path... Filename[{texture_path.name}: {base_directory}') + for (root, dirs, files) in os.walk(base_directory.parent, topdown=True): + for file in files: + target_file = file.split('.')[0].lower() + if target_file == texture_path.stem.lower(): + return os.path.abspath(os.path.join(root, file)) + return None + + +def transfer_texture(dst, src, overwrite=False): + if not os.path.exists(dst) or overwrite: + return Path(transfer_file(src, dst)) + return Path(dst) + + +def convert_normal_texture(dst, src, overwrite=False): + if not os.path.exists(dst) or overwrite: + try: + rgba = ImageBuf(str(src)) + spec = get_image_spec(rgba) + rgb = ImageBufAlgo.channels(rgba, (0, 1, 2)) + write_image(rgba, dst, spec['format']) + _LOGGER.info(f'Output Normal Map: {dst}') + except Exception as e: + _LOGGER.info(f'{src} -- Normal Map Conversion Failed. Error: {e}') + return None + return Path(dst) + + +def convert_roughness_texture(dst, src, overwrite=False): + if not os.path.exists(dst) or overwrite: + try: + rgba = ImageBuf(str(src)) + spec = get_image_spec(rgba) + alpha = ImageBufAlgo.channels(rgba, (3,)) + roughness = ImageBufAlgo.invert(alpha) + write_image(roughness, dst, spec['format']) + _LOGGER.info(f'Output Roughness Map: {dst}') + except Exception as e: + _LOGGER.info(f'{src} -- Roughness Map Conversion Failed. Error: {e}') + return None + return Path(dst) + + +def convert_metallic_texture(dst, src=None, overwrite=False): + _LOGGER.info(f'Convert Metallic ::::: >> {dst}') + if not os.path.exists(dst) or overwrite: + try: + if src: + _LOGGER.info(f'Converting Metallic image using: {src}') + # Get min/max pixels ---------------------->> + buf = ImageBuf(str(src)) + minval, maxval = find_min_max(buf) + buf.clear() + print(f'Minval: {minval}') + print(f'Maxval: {maxval}') + + # Run remap filter using mix/max values -------->> + buf = ImageBuf(str(src)) + spec = get_image_spec(buf) + img_width = spec['resolution'][0] + img_height = spec['resolution'][1] + remap = get_contrast_remap(buf, minval, maxval) + remove_color = remove_color_from_image(remap, dst) + else: + _LOGGER.info(f'Creating Dielectric Metallic Map') + buf = ImageBuf(ImageSpec(4, 4, 1, "uint8")) + ImageBufAlgo.fill(buf, constants.DIELECTRIC_METALLIC_COLOR, ROI(0, 1, 0, 1)) + write_image(buf, os.path.normpath(dst), 'uint8') + _LOGGER.info(f'Output Metallic Map: {dst}') + except Exception as e: + src = 'None' if not src else src + _LOGGER.info(f'{src} -- Metallic Map Conversion Failed. Error: {e}') + return None + return Path(dst) + + +def get_contrast_remap(buf, minval, maxval): + range_threshold = (maxval - minval) * .4 + ceiling_adjustment = .65 + white_point = float(round(maxval * ceiling_adjustment, 3)) + black_point = float(round(white_point - range_threshold, 3)) + percentage = 15 + black_point = (percentage * (white_point - black_point) / 100) + black_point + remap = ImageBufAlgo.contrast_remap(buf, black=black_point, white=white_point) + return remap + + +def remove_color_from_image(buf, dst): + """ + Some operations leave color in what should remain grayscale images (i.e. 'contrast_remap'). This function attempts + to gently remove color information without affecting the luminosity of the image + :param buf: + :param dst: + :return: + """ + buf.read(convert='float') + lin = ImageBufAlgo.colorconvert(buf, "sRGB", "linear") + luma = ImageBufAlgo.channel_sum(buf, constants.WEIGHTED_RGB_VALUES) + luma = ImageBufAlgo.colorconvert(luma, "linear", "sRGB") + write_image(luma, dst, 'uint8') + + +def find_min_max(buf): + """ + When attempting to automate the conversion of specular maps to metallic maps, the first step is to find high values + of luminosity in the image and compare against the low values. The intention is to expose what would likely be + metal and non-metal areas, and with this information attempt to clamp values to either black and white for the + generation of the metallic map. This function decreases the size of the image to a manageable representation of + pixel luminosity values, scans for the high and low values and returns those values to be further manipulated by + the contrast remap filter + :param buf: The image buffer containing the pixel information that needs to be scanned + :return: + """ + # Resize Image ------------------->> + goal_width = 512 + goal_height = 512 + + spec = buf.spec() + w = spec.width + h = spec.height + nchans = spec.nchannels + aspect = float(w) / float(h) + if aspect >= 1.0: + goal_height = int(h * goal_height / w) + else: + goal_width = (w * goal_width / h) + resized = ImageBuf(ImageSpec(goal_width, goal_height, spec.nchannels, spec.format)) + ImageBufAlgo.resize(resized, buf) + + # Scan buffer for min/max + pixels = resized.get_pixels(OpenImageIO.UINT8) + minval = 255 + maxval = 0 + test_dimensions = 512 + + for y in range(test_dimensions): + for x in range(test_dimensions): + pixel_value = pixels[y][x] + average_value = sum(pixel_value) / 3 + + if average_value < minval: + minval = average_value + if average_value > maxval: + maxval = average_value + + minimum_level = minval / 255 + maximum_level = maxval / 255 + + return minimum_level, maximum_level + + +def get_converted_filename(src, dst, texture_type): + """ + Takes the structure of an existing filename extracted from the legacy mtl files, and renames it, base on the + texture type argument that is passed to it + :param src: The legacy filename to be manipulated + :param dst: The destination directory that the new file will be saved to + :param texture_type: PBR texture type + :return: + """ + if src.is_file(): + filename = src.name.replace(get_texture_type(src), texture_type) + dst = os.path.normpath(dst / filename) + _LOGGER.info(f'+=+=+=+=+=+=+=+=+=+=+=+ {dst} -- {os.path.isfile(dst)}') + return dst + + +def get_image_spec(target_image): + """ + Pulls metadata about the image to be leveraged in file operations + :param target_image: Path to the target image intended for alterations + :return: + """ + spec = target_image.spec() + info = {'resolution': (spec.width, spec.height, spec.x, spec.y), 'channels': spec.channelnames, + 'format': str(spec.format)} + if spec.channelformats: + info['channelformats'] = str(spec.channelformats) + info['alpha channel'] = str(spec.alpha_channel) + info['z channel'] = str(spec.z_channel) + info['deep'] = str(spec.deep) + for i in range(len(spec.extra_attribs)): + if type(spec.extra_attribs[i].value) == str: + info[spec.extra_attribs[i].name] = spec.extra_attribs[i].value + else: + info[spec.extra_attribs[i].name] = spec.extra_attribs[i].value + return info + + +def get_texture_basename(image_path): + """ + Attempts to extract the naming convention base for each texture set + :param image_path: Path to an image from the texture set to use for basename extraction + :return: + """ + image_name = image_path.stem + if image_name.find('_') != -1: + image_components = image_name.split('_') + return ('_').join(image_components[:-1]) + return None + + +def get_texture_type(image_path): + """ + Gets the PBR texture type from the filename. + :param image_path: Path to the image from which to extract pbr type + :return: + """ + filename = Path(image_path) + texture_type = filename.stem.split('_')[-1] + return texture_type + + +def set_image_spec(spec): + """ + Writes new specification for images manipulated or created when needed + :param spec: + :return: + """ + output_spec = ImageSpec() + output_spec.set_format(OpenImageIO.UINT8) + output_spec.width = spec['resolution'][0] + output_spec.height = spec['resolution'][0] + output_spec.nchannels = 1 + return output_spec + + +def write_image(image, filename, image_format): + """ + Writes final processed image after operations have been completed and final result in buffer + + :param image: Image buffer + :param filename: Image name to save + :param image_format: File format for export + :return: + """ + if not image.has_error: + image.set_write_format(image_format) + image.write(filename) + if image.has_error: + _LOGGER.info(f'Error writing {filename}: {image.geterror()}') + + +def transfer_file(src, dst): + """ + Some legacy textures only need to be renamed an moved to the processed folder with no further manipulation + required. This function handles this transfer operation + :param src: Source of the image intended for transfer + :param dst: The destination path for the transferred image + :return: + """ + _LOGGER.info(f'{src} +++TRANSFER FILE+++>> {dst}') + try: + copyfile(src, dst) + return dst + except Exception as e: + _LOGGER.info(f'Copy error encountered: {e}') + return None + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/isolate_and_assign.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/isolate_and_assign.py new file mode 100644 index 0000000000..0f62f04fe6 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/isolate_and_assign.py @@ -0,0 +1,280 @@ +# coding:utf-8 +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# File Description: +# This is a temporary workaround script for previewing Stingray materials applied to FBX files in material conversion. +# The reason this is needed is because of a bug found in automating Stingray material assignmens +# ------------------------------------------------------------------------- + + +import pymel.core as pm +import maya.mel as mel +import constants +import random +import os + + +def get_materials_in_scene(): + for shading_engine in pm.ls(type=pm.nt.ShadingEngine): + if len(shading_engine): + for material in shading_engine.surfaceShader.listConnections(): + yield material + + +def get_file_textures(material_name): + try: + file_textures = [] + material_files = [x for x in pm.listConnections(material_name, plugs=1, source=1) if x.startswith('file')] + for file_name in material_files: + try: + file_textures.append(pm.getAttr('{}.fileTextureName'.format(file_name.split('.')[0]))) + except pm.MayaAttributeError: + pass + return file_textures + except AttributeError: + return None + + +def get_search_string(texture_name): + """ + Creates a "base" string derived from the passed texture name for finding associated files + :param texture_name: The texture name from which to extract the search string + :return: + """ + filename = os.path.basename(texture_name) + base = filename.split('.')[0] + basename_list = base.split('_') + search_string = '_'.join(basename_list[:-1]) + return search_string + + +def get_texture_type(search_string, file_name): + """ + Gets the type of PBR texture for assignments based on the texture filename + :param search_string: The convention basename for file texture + :param file_name: This is a filename extracted from the mtl file- used purely as a template for newly created PBR textures + :return: + """ + texture_types = ['BaseColor', 'Metallic', 'Normal', 'Emissive', 'Roughness'] + target_string = file_name.replace(search_string, '') + base = target_string.split('.')[0] + if base[1:] in texture_types: + return base[1:] + return None + + +def get_output_file_size(file_path): + """ + When creating texture masks for further processing, this function checks output filesize to determine if there are + any UVs present for the object it's created for. There are many assets without UVS or with UVs that entirely + encapsulate the 0 to 1 UV space- and they come out in the size fiting between the range below. Without any content + there is no need for the generated mask- so it is summarily removed + :param file_path: Path to the vertex map masks generated by object UVs + :return: + """ + size = os.stat(file_path).st_size + if (constants.EMPTY_IMAGE_LOW < size < constants.EMPTY_IMAGE_HIGH) == True: + os.remove(file_path) + + +def attach_texture(texture_type, material, shading_group_name, file_path): + material_info = { + 'BaseColor': 'color', + 'Metallic': 'metallic', + 'Normal': 'normal', + 'Emissive': 'emissive', + 'Roughness': 'roughness' + } + + file_count = len(pm.ls(type='file')) + 1 + texture_file = 'file{}'.format(file_count) + file_node = pm.shadingNode('file', asTexture=True, name=texture_file) + pm.setAttr('{}.fileTextureName'.format(texture_file), file_path, type="string") + pm.setAttr('{}.use_{}_map'.format(material, material_info[texture_type]), True) + pm.connectAttr('{}.outColor'.format(texture_file), '{}.TEX_{}_map'.format(material, material_info[texture_type]), + force=True) + + +def combine_meshes(): + """ + Combines geometry based on material assignment. This function was created before the incorporation of .assetinfo + files while processing. I intend to revamp the system, as this practice was found to be problematic when LOD meshes + were found in files containing the same materials. Leaving this in for now until a better system can be created as + this still helps in many cases to produce a mesh for preview + :return: + """ + pm.showHidden(all=True) + pm.select(pm.ls(geometry=True)) + selected_geo = pm.selected() + print(selected_geo) + if len(selected_geo) > 1: + combined_mesh = pm.polyUnite(selected_geo) + pm.delete(ch=True) + return combined_mesh[0] + else: + return selected_geo + + +def create_material_masks(target_mesh, material_list, base_directory): + """ + Fuction for generating vertex map masks of existing UVs. If metallic maps needed to be constructed by hand this + made mask assignments in Substance Designer a quicker process. There might still be a need for this process for + other things so I'm leaving this in here for now- eventually it might land in a Maya utility class. + :param target_mesh: The mesh to generate maps from + :param material_list: The list of materials needing masks generated for + :param base_directory: The directory to save vertex map masks to + :return: + """ + container = separate_applied_materials(target_mesh) + children = pm.listRelatives(container, children=True) + + for item in children: + if not item.endswith('_pbr_GEO'): + pm.delete(item) + else: + pm.hide(item) + + print('\n::::::::::::::::::::::::::::::::') + print('Bake material masks') + print('\n::::::::::::::::::::::::::::::::') + print('Children: {}'.format(children)) + print('Material List: {}'.format(material_list)) + + for material in material_list: + print('Material: {}'.format(material)) + separated_mesh_object = '{}_GEO'.format(material) + if separated_mesh_object in children: + pm.showHidden(separated_mesh_object) + bake_vertex_colors(separated_mesh_object, material, base_directory) + cleanup_object(separated_mesh_object, material) + print('\n') + + pm.setToolTo('selectSuperContext') + pm.select(clear=True) + + +def cleanup_object(target_mesh, material): + """ + Vertex masks are created using vertex colors, but once the maps have been generated the vertex colors should be + removed. This function handles the cleanup process. + :param target_mesh: + :param material: + :return: + """ + pm.select(target_mesh) + pm.polyColorPerVertex(rem=True) + pm.delete(ch=True) + pm.hyperShade(assign=material) + pm.hide() + pm.select(clear=True) + + +def bake_vertex_colors(target_mesh, material, base_directory): + file_path = get_file_path(material, base_directory) + print('Baking verts for: {} Path: {}'.format(target_mesh, file_path)) + pm.select(target_mesh) + pm.hyperShade(assign='lambert1') + mel.eval('artAttrColorPerVertexToolScript 4;') + pm.polyOptions(colorMaterialChannel='DIFFUSE') + pm.polyColorPerVertex(r=1, g=1, b=1, a=1, cdo=True) + pm.select(clear=True) + + try: + pm.select(target_mesh, r=True) + mel.eval('artAttrColorPerVertexToolScript 4;') + context = pm.currentCtx() + pm.artAttrPaintVertexCtx(context, e=True, esf=file_path, fsx=4096, fsy=4096) + get_output_file_size(file_path) + except RuntimeError as e: + print('+++++++++++++++++') + print('Bake Failed: {}'.format(e)) + print('+++++++++++++++++') + + +def get_file_path(material, base_directory): + texture_list = get_file_textures(material) + for item in texture_list: + search_string = get_search_string(item) + target_file = os.path.join(base_directory, '{}_Metallic.tif'.format(search_string)) + if os.path.isfile(target_file): + return target_file + return None + + +def separate_applied_materials(target_object): + target_object = target_object[0] if isinstance(target_object, list) else target_object + try: + shading_groups = list(set(pm.listConnections(target_object.getShape(), type='shadingEngine'))) + except AttributeError: + shading_groups = list(set(pm.listConnections(target_object, type='shadingEngine'))) + + materials_container = pm.group(empty=1, n='separated_materials') + for count, sg in enumerate(shading_groups): + material = pm.ls(pm.listConnections(sg), materials=True)[0] + target_material = pm.listConnections(sg + '.surfaceShader') + clone = '{}_GEO'.format(target_material[0]) + pm.duplicate(target_object, n=clone) + pm.parent(clone, 'separated_materials') + material = pm.listConnections(sg, s=True, d=False) + pm.select(clone) + pm.runtime.ConvertSelectionToFaces() + temp_set = str(pm.sets()) + temp_grps = pm.listConnections(material[0], type='shadingEngine') + pm.select(pm.sets(temp_grps[0], int=temp_set)) + pm.runtime.InvertSelection() + pm.delete() + + pm.delete(target_object) + return materials_container + + +def run(): + """ + The entry function of the script. This finds existing materials on FBX objects, converts to Stingray materials, + and assigns corresponding textures. + :return: + """ + file_name = pm.sceneName() + base_directory = os.path.dirname(pm.sceneName()) + print('Base Directory: {}'.format(base_directory)) + textured_materials = [] + for item in get_materials_in_scene(): + if str(type(item)) == "": + print('Material--> {}'.format(item)) + shading_group = pm.listConnections(item, type="shadingEngine")[0] + file_textures = get_file_textures(item[:-4]) + if file_textures: + print('FileTexture: {}'.format(file_textures)) + textured_materials.append(item) + if len(file_textures) > 1: + print('Multiple textures found :::::::::::: {}'.format(file_textures)) + print('Scene: {} Material: {}'.format(file_name, item)) + else: + search_string = get_search_string(file_textures[0]) + if search_string: + print('Search String: {}'.format(search_string)) + print('Found these related textures:') + for target_file in os.listdir(base_directory): + if target_file.startswith(search_string): + print('-->>>>>> {}'.format(target_file)) + texture_type = get_texture_type(search_string, target_file) + if texture_type: + textured_materials.append(item) + file_path = os.path.join(base_directory, target_file) + attach_texture(texture_type, item, shading_group, file_path) + + print('') + + target_mesh = combine_meshes() + textured_materials = list(set(textured_materials)) + create_material_masks(target_mesh, textured_materials, base_directory) + pm.saveFile(force=True) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/lumberyard_data.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/lumberyard_data.py new file mode 100644 index 0000000000..acfda416c9 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/lumberyard_data.py @@ -0,0 +1,180 @@ +# coding:utf-8 +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# File Description: +# This file contains Lumberyard specific file and helper functions for handling material conversion +# ------------------------------------------------------------------------- + + +import xml.etree.ElementTree as ET +import logging as _logging +from pathlib import Path +from box import Box +import constants +import json +import sys +import os + + +module_name = 'legacy_asset_converter.main.lumberyard_data' +_LOGGER = _logging.getLogger(module_name) + + +def walk_directories(target_path): + """ + Records file and directory structure information for all content within specified base folder for operation + + :target path: The base directory from which to perform the os.walk + :return: + """ + directory_audit = {} + scan_type, base_directory = get_base_directory(target_path) + base_directory_name = base_directory.name + exclusion_list = constants.DIRECTORY_EXCLUSION_LIST + + directory_index = 0 + for (root, dirs, files) in os.walk(base_directory, topdown=True): + temp_dictionary = {} + root = Path(root) + directory_name = root.name + is_object_directory = True if [x for x in root.iterdir() if x.suffix == '.fbx'] else False + _LOGGER.info(f'\n_\nScanning Directory: {directory_name} -- Object directory? {is_object_directory}') + + if is_object_directory: + if directory_name not in exclusion_list: + temp_dictionary = Box({'directoryname': directory_name, 'directorypath': str(root)}) + files_dictionary = scan_directory(root) + + subdirectories = [x for x in root.iterdir() if x.is_dir()] + for subdirectory in subdirectories: + target_path = subdirectory.name + if not [x for x in subdirectory.iterdir() if x.suffix == '.fbx'] and target_path \ + not in (exclusion_list +[base_directory_name]): + files_dictionary.update(scan_directory(root / subdirectory)) + temp_dictionary['files'] = files_dictionary + directory_audit[directory_index] = temp_dictionary + directory_index += 1 + return Box(directory_audit) + + +def scan_directory(directory_path): + """ + Finds all FBX files, which are needed for the materials conversion process + + :param directory_path: + :return: + """ + files_dictionary = {} + for filename in directory_path.iterdir(): + filename = Path(filename) + extension = filename.suffix + if extension in (constants.IMAGE_TYPES + constants.LUMBERYARD_DATA_FILES + ['.fbx']): + files_dictionary[extension] = [directory_path / filename] if filename.suffix not in list(files_dictionary) else \ + files_dictionary[extension] + [directory_path / filename] + return files_dictionary + + +def get_base_directory(target_path): + """ + The "walk" function can be passed both directory paths as well as file paths (for single asset processing). In the + event that a file path is passed, this will get the file path's containing folder for auditing related files + :param target_path: The path to check + :return: + """ + base_directory = target_path + scan_type = 'directory' + if target_path.is_file(): + scan_type = 'file' + base_directory = Path(target_path.parent) + return scan_type, base_directory + + +def get_material_info(target_directory, filename): + """ + Extracts material information from legacy .mtl files for conversion to the .material format + :param target_directory: + :param filename: + :return: + """ + materials_list = {} + texture_modifications = {} + target_mtl = target_directory / filename + if target_mtl.is_file(): + tree = ET.parse(target_mtl) + root = tree.getroot() + for material in root.iter('Material'): + material_attributes = {} + if 'Name' in material.attrib.keys(): + for key, value in material.attrib.items(): + material_attributes[key] = value + + material_textures = {} + for textures in material.findall('Textures'): + for texture in textures.findall('Texture'): + map_name = texture.get('Map') + file_path = texture.get('File') + material_textures[map_name.lower()] = Path(file_path) + if texture.findall('TexMod'): + listing = texture.findall('TexMod') + for child in listing: + texture_modifications[material_attributes['Name']] = child.attrib + if material_attributes: + temp_list = Box({'assigned': [], 'attributes': material_attributes, 'modifications': texture_modifications, + 'textures': material_textures}) + materials_list[material_attributes['Name']] = temp_list + return Box(materials_list) + + +def get_asset_info(target_directory, filename, target_material): + """ + Gathers material assignments for specified assets for .assetinfo files that typically accompany FBX files + :param target_directory: The directory to search for .assetinfo file + :param filename: The name of the FBX file for which information is being gathered + :param target_material: The material contained in the FBX file that the script is finding geo assignments for + :return: + """ + target_file = target_directory / filename.lower() + assignment_list = [] + if target_file.is_file(): + try: + tree = ET.parse(target_file) + root = tree.getroot() + for layer_listing in root.iter('Class'): + target_value = layer_listing.get('value') + if target_value and target_value.find('.') != -1: + search_string = target_value.split('.')[-1] + + if search_string == target_material: + asset_list = target_value.split('.') + crop_path = asset_list[2:-1] + asset_path = '.'.join(crop_path) + if asset_path not in assignment_list: + assignment_list.append(asset_path) + except Exception as e: + _LOGGER.info('AssetInfo file found, but information extraction failed.') + else: + _LOGGER.info('AssetInfo file not found. Cannot gather material assignments.') + return assignment_list + + +def export_lumberyard_material(output, material_description): + """ + Takes one final dictionary with information gathered in the process and saves with JSON formatting into a + .material file + + :param output: + :param material_description: + :return: + """ + with open(output, 'w', encoding='utf-8') as material_file: + json.dump(material_description, material_file, ensure_ascii=False, indent=4) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/main.py new file mode 100644 index 0000000000..bc4de6a158 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/main.py @@ -0,0 +1,1845 @@ +# coding:utf-8 +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +# File Description: +# This is the main entry point of the Legacy Material Conversion scripts. It provides +# UI for the script as well as coordinating many of its core processes. The purpose +# of the conversion scripts is to provide a way for individuals and game teams to +# convert assets and materials previously built for legacy spec/gloss based implementation +# to the current PBR metal rough formatting, with the new '.material' files +# replacing the previous '.mtl' descriptions. The script also creates Maya working files +# with the FBX files present and adds Stingray materials for preview as well as further +# look development +# ------------------------------------------------------------------------- + + + +# built-ins +import collections +from collections import abc +# import subprocess +import logging as _logging +import pathlib +from pathlib import * +import shelve +# import socket +import shutil +import math +import json +import time +import csv +import sys +import os +import re +from functools import partial +import xml.etree.ElementTree as ET +from shutil import copyfile + +# azpy bootstrapping and extensions +import azpy.config_utils + +_config = azpy.config_utils.get_dccsi_config() +print(_config) +# ^ this is effectively an import and retrieve of \config.py +# and init's access to Qt/Pyside2 +# init lumberyard Qy/PySide2 access +# now default settings are extended with PySide2 +# this is an alternative to "from dynaconf import settings" with Qt +settings = _config.get_config_settings(setup_ly_pyside=True) + + +# 3rd Party (we may or do provide) +from box import Box +import OpenImageIO as oiio +from OpenImageIO import ImageInput, ImageOutput +from OpenImageIO import ImageBuf, ImageSpec, ImageBufAlgo +# lumberyard Qt/PySide2 +from PySide2 import QtWidgets, QtCore, QtGui +from PySide2.QtWidgets import QApplication +from PySide2.QtCore import Signal, Slot, QThread, QProcess, QProcessEnvironment +# local tool imports +import lumberyard_data +import image_conversion +import constants +import utilities + +for handler in _logging.root.handlers[:]: + _logging.root.removeHandler(handler) + +module_name = 'legacy_asset_converter.main' +log_file_path = os.path.join(settings.DCCSI_LOG_PATH, f'{module_name}.log') + +_log_level = int(20) +_G_DEBUG = True +if _G_DEBUG: + _log_level = int(10) + +from azpy.constants import FRMT_LOG_LONG + +_logging.basicConfig(level=_log_level, + format=FRMT_LOG_LONG, + datefmt='%m-%d %H:%M', + filename=log_file_path, + filemode='w') +_LOGGER = _logging.getLogger(module_name) + +console_handler = _logging.StreamHandler(sys.stdout) +console_handler.setLevel(_log_level) +formatter = _logging.Formatter(FRMT_LOG_LONG) +console_handler.setFormatter(formatter) +_LOGGER.addHandler(console_handler) +_LOGGER.setLevel(_log_level) +_LOGGER.debug('Initializing: {0}.'.format({module_name})) + + +class LegacyFilesConverter(QtWidgets.QDialog): + def __init__(self, parent=None): + super(LegacyFilesConverter, self).__init__(parent) + + self.app = QtWidgets.QApplication.instance() + + self.setWindowFlags(QtCore.Qt.Window) + self.setGeometry(50, 50, 600, 800) + self.setObjectName('LegacyFilesConverter') + self.setWindowTitle('Legacy Converter') + self.isTopLevel() + self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMinMaxButtonsHint) + self.desktop_location = os.path.join(os.path.expanduser('~'), 'Desktop') + self.local_host = '127.0.0.1' + self.port = 54321 + self.p = None + self.modal_dialog = None + self.logger_enabled = True + self.image_key_dictionary = { + 'ddn': ['ddn'], + 'ddna': ['ddna'], + 'diffuse': ['diffuse', 'diff', 'd'], + 'emissive': ['emis', 'emissive', 'e', 'emiss'], + 'specular': ['spec', 'specular'], + 'scattering': ['scattering', 'sss'], + 'normal': ['normal'], + 'basecolor': ['basecolor', 'albedo'] + } + self.legacy_key_identifiers = {'Diffuse': 'diff', 'Bumpmap': 'ddna', 'Specular': 'spec'} + self.autodesk_directory = Path(os.environ['ProgramFiles']) / 'Autodesk' + self.headers = ('dirname dirpath fbxname mayafile designer diff ddna spec emi basecolor metallic normal ' + 'emissive status synced').split(' ') + self.initialization_files = ['workspace.mel', 'Launch_Cmd.bat', 'Launch_Maya_2020.bat', 'Launch_WingIDE-7-1.bat', + 'Project_Env.bat'] + self.mayapy_path = None + self.single_asset_file = '' + self.input_directory = None + self.output_directory = None + self.input_file = None + self.load_events = None + self.image_output_type = '.tif' + self.directory_audit = Box({}) + self.section_data = {} + self.template_lumberyard_material = {} + self.default_material_definition = 'standardPBR.template.material' + self.log_file_location = os.path.join(Path.cwd(), 'output.log') + self.directory_dictionary = {} + self.materials_dictionary = {} + self.materials_db = shelve.open('materialsdb', protocol=2) + self.file_target_method = 'Directory' + self.selected_directory_index = -1 + self.separator_layout = QtWidgets.QHBoxLayout() + self.line = QtWidgets.QLabel() + + self.small_font = QtGui.QFont("Helvetica", 8, QtGui.QFont.Normal) + self.medium_font = QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal) + self.bold_font = QtGui.QFont("Arial", 8, QtGui.QFont.Black) + self.bold_font_large = QtGui.QFont("Helvetica", 12, QtGui.QFont.Bold) + self.title_font = QtGui.QFont("Helvetica", 22, QtGui.QFont.Bold) + self.setStyleSheet('QWidget {font: "Helvetica"}') + + self.main_container = QtWidgets.QVBoxLayout(self) + self.main_container.setContentsMargins(10, 10, 10, 0) + self.main_container.setAlignment(QtCore.Qt.AlignTop) + self.setLayout(self.main_container) + self.content_layout = QtWidgets.QVBoxLayout() + self.content_layout.setAlignment(QtCore.Qt.AlignTop) + self.main_container.addLayout(self.content_layout) + + # Set Directory Path + self.target_directory_layout = QtWidgets.QVBoxLayout() + self.target_directory_layout.setAlignment(QtCore.Qt.AlignTop) + self.target_directory_groupbox = QtWidgets.QGroupBox("Target Files") + self.target_directory_groupbox.setLayout(self.target_directory_layout) + + # ---- Input Directory + self.input_field_layout = QtWidgets.QHBoxLayout() + self.input_directory_label = QtWidgets.QLabel('Input Directory') + self.input_directory_label.setFont(self.bold_font) + self.input_directory_label.setFixedWidth(80) + self.input_field_layout.addWidget(self.input_directory_label) + self.input_path_field = QtWidgets.QLineEdit('E:/LY/spectra_atom/dev/Gems/AtomStarterGame/Environment/Assets/Objects/AAGun') + self.input_path_field.textChanged.connect(self.set_io_directories) + self.input_path_field.setFixedHeight(25) + self.input_field_layout.addWidget(self.input_path_field) + self.set_input_button = QtWidgets.QPushButton('Set') + self.set_input_button.clicked.connect(partial(self.set_directory_button_clicked, 'input')) + self.set_input_button.setFixedSize(40, 25) + self.input_field_layout.addWidget(self.set_input_button) + self.target_directory_layout.addLayout(self.input_field_layout) + + # ---- Output Directory + self.output_field_layout = QtWidgets.QHBoxLayout() + self.output_directory_label = QtWidgets.QLabel('Output Directory') + self.output_directory_label.setFont(self.bold_font) + self.output_directory_label.setFixedWidth(80) + self.output_field_layout.addWidget(self.output_directory_label) + self.output_path_field = QtWidgets.QLineEdit('C:/Users/benblac/Desktop/test') + self.output_path_field.textChanged.connect(self.set_io_directories) + self.output_path_field.setFixedHeight(25) + self.output_field_layout.addWidget(self.output_path_field) + self.set_output_button = QtWidgets.QPushButton('Set') + self.set_output_button.clicked.connect(partial(self.set_directory_button_clicked, 'output')) + self.set_output_button.setFixedSize(40, 25) + self.output_field_layout.addWidget(self.set_output_button) + self.target_directory_layout.addLayout(self.output_field_layout) + + self.file_options_layout = QtWidgets.QHBoxLayout() + self.radio_button_layout = QtWidgets.QHBoxLayout() + self.radio_button_layout.setAlignment(QtCore.Qt.AlignLeft) + self.radio_button_group = QtWidgets.QButtonGroup() + self.use_directory_radio_button = QtWidgets.QRadioButton('Use Directory') + self.use_directory_radio_button.setChecked(True) + self.use_directory_radio_button.clicked.connect(self.radio_clicked) + self.radio_button_group.addButton(self.use_directory_radio_button) + self.radio_button_layout.addWidget(self.use_directory_radio_button) + self.radio_button_layout.addSpacing(10) + self.use_file_radio_button = QtWidgets.QRadioButton('Single File') + self.use_file_radio_button.clicked.connect(self.radio_clicked) + self.radio_button_layout.addWidget(self.use_file_radio_button) + + self.radio_button_group.addButton(self.use_file_radio_button) + self.target_directory_layout.addSpacing(5) + self.file_options_layout.addLayout(self.radio_button_layout) + self.target_directory_layout.addLayout(self.file_options_layout) + self.main_container.addWidget(self.target_directory_groupbox) + + # Set Actions + self.actions_layout = QtWidgets.QHBoxLayout() + self.actions_layout.setAlignment(QtCore.Qt.AlignTop) + self.actions_groupbox = QtWidgets.QGroupBox("Actions") + self.actions_groupbox.setLayout(self.actions_layout) + + # Left Column + self.left_checkbox_items = QtWidgets.QVBoxLayout() + self.left_checkbox_items.setAlignment(QtCore.Qt.AlignTop) + self.actions_layout.addLayout(self.left_checkbox_items) + self.convert_textures_checkbox = QtWidgets.QCheckBox('Convert Legacy Textures') + self.convert_textures_checkbox.setChecked(True) + self.left_checkbox_items.addWidget(self.convert_textures_checkbox) + self.create_material_files_checkbox = QtWidgets.QCheckBox('Create .material files') + self.create_material_files_checkbox.setChecked(True) + self.left_checkbox_items.addWidget(self.create_material_files_checkbox) + self.create_maya_files_checkbox = QtWidgets.QCheckBox('Create Maya Files') + self.left_checkbox_items.addWidget(self.create_maya_files_checkbox) + + # Center Column + self.center_checkbox_items = QtWidgets.QVBoxLayout() + self.center_checkbox_items.setAlignment(QtCore.Qt.AlignTop) + self.actions_layout.addLayout(self.center_checkbox_items) + self.create_logs_checkbox = QtWidgets.QCheckBox('Create Output Logs') + self.create_logs_checkbox.setChecked(True) + self.center_checkbox_items.addWidget(self.create_logs_checkbox) + self.create_checklist_checkbox = QtWidgets.QCheckBox('Create Asset Checklists') + self.create_checklist_checkbox.setChecked(True) + self.center_checkbox_items.addWidget(self.create_checklist_checkbox) + self.reprocess_checkbox = QtWidgets.QCheckBox('Reprocess Existing Files') + self.center_checkbox_items.addWidget(self.reprocess_checkbox) + + # Right Column + self.right_checkbox_items = QtWidgets.QVBoxLayout() + self.right_checkbox_items.setAlignment(QtCore.Qt.AlignTop) + self.actions_layout.addLayout(self.right_checkbox_items) + self.clean_material_names_checkbox = QtWidgets.QCheckBox('Clean Material Names') + self.clean_material_names_checkbox.setChecked(False) + self.right_checkbox_items.addWidget(self.clean_material_names_checkbox) + self.main_container.addWidget(self.actions_groupbox) + + self.process_files_button = QtWidgets.QPushButton('Process Files') + self.process_files_button.clicked.connect(self.process_files_clicked) + self.process_files_button.setFixedHeight(40) + self.process_files_button.setEnabled(False) + self.main_container.addWidget(self.process_files_button) + self.main_container.addLayout(self.get_separator_bar()) + + #################################### + # Stacked Layout ################### + #################################### + + self.window_tabs = QtWidgets.QTabWidget() + self.main_container.addWidget(self.window_tabs) + + # +++++++++++++++++++---->> + # DATA TAB --------------->> + # +++++++++++++++++++---->> + + # Data tab base + self.audit_tab_content = QtWidgets.QWidget() + self.window_tabs.addTab(self.audit_tab_content, 'Data') + self.audit_layout = QtWidgets.QVBoxLayout(self.audit_tab_content) + self.audit_layout.setAlignment(QtCore.Qt.AlignTop) + self.audit_layout.setContentsMargins(10, 10, 10, 10) + self.audit_color_frame = QtWidgets.QFrame(self.audit_tab_content) + self.audit_color_frame.setGeometry(0, 0, 5000, 5000) + self.audit_color_frame.setStyleSheet('background-color:rgb(235, 235, 235);') + + ############################## + # Data Display Component + ############################## + + self.data_results_layout = QtWidgets.QHBoxLayout() + self.audit_layout.addLayout(self.data_results_layout) + + # Display target combobox + self.display_combobox_layout = QtWidgets.QVBoxLayout() + self.display_combobox_layout.setAlignment(QtCore.Qt.AlignTop) + self.display_combobox = QtWidgets.QComboBox() + self.display_combobox.setFixedSize(125, 25) + + self.display_items = ('Show All', 'Show By Directory', 'Single FBX File') + self.display_combobox.addItems(self.display_items) + self.display_combobox.currentIndexChanged.connect(self.display_combobox_changed) + self.display_combobox_layout.addWidget(self.display_combobox) + self.data_results_layout.addLayout(self.display_combobox_layout) + + # Display stacked secondary + self.results_stacked_widget = QtWidgets.QStackedWidget() + self.data_results_layout.addWidget(self.results_stacked_widget) + self.results_stacked_widget.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum) + + # Directory combobox + self.combobox_results_widget = QtWidgets.QWidget() + self.combobox_results_widget.setFixedHeight(25) + self.combobox_results_layout = QtWidgets.QVBoxLayout(self.combobox_results_widget) + self.combobox_results_layout.setContentsMargins(7, 0, 0, 0) + self.directory_combobox = QtWidgets.QComboBox() + self.directory_combobox.setEnabled(False) + self.directory_combobox.setFixedHeight(25) + self.directory_combobox.currentIndexChanged.connect(self.directory_combobox_changed) + self.directories_items = ('') + self.combobox_results_layout.addWidget(self.directory_combobox) + self.results_stacked_widget.addWidget(self.combobox_results_widget) + + # Search Widget + self.search_results_widget = QtWidgets.QWidget() + self.container = QtWidgets.QVBoxLayout() + self.container.setContentsMargins(0, 0, 0, 0) + self.search_results_layout = QtWidgets.QHBoxLayout() + self.container.addLayout(self.search_results_layout) + self.search_results_layout.setAlignment(QtCore.Qt.AlignRight) + self.search_results_layout.setContentsMargins(10, 0, 0, 0) + self.search_results_widget.setLayout(self.container) + self.find_field = QtWidgets.QLineEdit() + self.find_field.setFixedSize(250, 25) + self.search_results_layout.addWidget(self.find_field) + self.search_button = QtWidgets.QPushButton('Search') + self.search_results_layout.addWidget(self.search_button) + self.search_button.clicked.connect(self.search_button_clicked) + self.search_button.setFixedSize(50, 27) + self.results_stacked_widget.addWidget(self.search_results_widget) + + self.asset_data_layout = QtWidgets.QVBoxLayout() + self.asset_data_window = QtWidgets.QTextEdit('Ready.') + self.asset_data_layout.addWidget(self.asset_data_window) + self.audit_layout.addLayout(self.asset_data_layout) + + self.progress_bar_layout = QtWidgets.QHBoxLayout() + self.progress_bar = QtWidgets.QProgressBar() + self.progress_bar.setFixedHeight(25) + self.progress_bar.setTextVisible(False) + self.progress_bar_layout.addWidget(self.progress_bar) + self.audit_layout.addLayout(self.progress_bar_layout) + + # +++++++++++++++++++---->> + # ASSET TAB --------------->> + # +++++++++++++++++++---->> + + self.asset_tab_content = QtWidgets.QWidget() + self.window_tabs.addTab(self.asset_tab_content, 'Asset') + self.asset_layout = QtWidgets.QVBoxLayout(self.asset_tab_content) + self.asset_layout.setContentsMargins(10, 10, 10, 10) + self.asset_layout.setSpacing(0) + self.asset_layout.setAlignment(QtCore.Qt.AlignTop) + self.asset_color_frame = QtWidgets.QFrame(self.asset_tab_content) + self.asset_color_frame.setGeometry(0, 0, 5000, 5000) + self.asset_color_frame.setStyleSheet('background-color:rgb(235, 235, 235);') + + # Panel Content ########### + self.panel_layout = QtWidgets.QVBoxLayout() + self.asset_layout.addLayout(self.panel_layout) + + # Directory + self.file_directory_layout = QtWidgets.QHBoxLayout() + self.panel_layout.addLayout(self.file_directory_layout) + self.directory_listing_layout = QtWidgets.QHBoxLayout() + self.directory_listing_layout.setAlignment(QtCore.Qt.AlignTop) + self.directory_groupbox = QtWidgets.QGroupBox("Directory") + self.directory_groupbox.setLayout(self.directory_listing_layout) + self.asset_directory_combobox = QtWidgets.QComboBox() + self.asset_directory_combobox.currentIndexChanged.connect(self.asset_directory_combobox_changed) + self.asset_directory_combobox.setFixedHeight(25) + self.directory_listing_layout.addWidget(self.asset_directory_combobox) + self.file_directory_layout.addWidget(self.directory_groupbox) + self.file_directory_layout.addSpacing(7) + + # Material Files + self.material_files_layout = QtWidgets.QHBoxLayout() + self.material_files_layout.setAlignment(QtCore.Qt.AlignTop) + self.material_files_groupbox = QtWidgets.QGroupBox("Material Files") + self.material_files_groupbox.setLayout(self.material_files_layout) + self.material_files_combobox = QtWidgets.QComboBox() + self.material_files_items = ['Choose'] + self.material_files_combobox.addItems(self.material_files_items) + self.material_files_combobox.setFixedHeight(25) + self.material_files_combobox.setStyleSheet('QComboBox:item {padding-left:30px;}') + self.material_files_layout.addWidget(self.material_files_combobox) + self.material_file_open_button = QtWidgets.QPushButton('Open') + self.material_file_open_button.setFixedSize(40, 27) + self.material_file_open_button.clicked.connect(self.open_material_clicked) + self.material_files_layout.addWidget(self.material_file_open_button) + self.file_directory_layout.addWidget(self.material_files_groupbox) + + # FBX File + self.maya_fbx_combo_layout = QtWidgets.QHBoxLayout() + self.panel_layout.addLayout(self.maya_fbx_combo_layout) + self.fbx_layout = QtWidgets.QVBoxLayout() + self.fbx_layout.setAlignment(QtCore.Qt.AlignTop) + self.fbx_groupbox = QtWidgets.QGroupBox("FBX File") + self.fbx_groupbox.setLayout(self.fbx_layout) + self.fbx_combobox = QtWidgets.QComboBox() + self.fbx_combobox.setFixedHeight(25) + self.fbx_combobox.currentIndexChanged.connect(self.fbx_combobox_changed) + self.fbx_layout.addWidget(self.fbx_combobox) + self.maya_fbx_combo_layout.addWidget(self.fbx_groupbox) + self.maya_fbx_combo_layout.addSpacing(7) + + # Maya File + self.maya_file_layout = QtWidgets.QHBoxLayout() + self.maya_file_layout.setAlignment(QtCore.Qt.AlignTop) + self.maya_file_groupbox = QtWidgets.QGroupBox("Maya File") + self.maya_file_groupbox.setLayout(self.maya_file_layout) + self.maya_file_label = QtWidgets.QLabel() + self.maya_file_label.setStyleSheet('color:blue') + self.maya_file_layout.addWidget(self.maya_file_label) + self.maya_open_button = QtWidgets.QPushButton('Open') + self.maya_open_button.setFixedSize(40, 27) + self.maya_file_layout.addWidget(self.maya_open_button) + self.maya_fbx_combo_layout.addWidget(self.maya_file_groupbox) + + # File Textures + self.file_textures_layout = QtWidgets.QHBoxLayout() + self.texture_table_layout = QtWidgets.QVBoxLayout() + self.file_textures_layout.addLayout(self.texture_table_layout) + self.file_textures_layout.setAlignment(QtCore.Qt.AlignTop) + self.file_textures_groupbox = QtWidgets.QGroupBox("File Textures") + self.file_textures_groupbox.setLayout(self.file_textures_layout) + + # File Textures Table + self.file_textures_table = QtWidgets.QTableWidget() + self.file_textures_table.setColumnCount(2) + self.file_textures_table.setAlternatingRowColors(True) + self.file_textures_table.setSelectionBehavior(QtWidgets.QTableView.SelectRows) + self.file_textures_table.setHorizontalHeaderLabels(['Texture Type', 'Texture Name']) + self.file_textures_table.horizontalHeader().setStyleSheet('QHeaderView::section ' + '{background-color: rgb(220, 220, 220); ' + 'padding-top:7px; padding-left:5px;}') + vertical_header = self.file_textures_table.verticalHeader() + vertical_header.setSectionResizeMode(QtWidgets.QHeaderView.Fixed) + vertical_header.setDefaultSectionSize(40) + vertical_header.hide() + files_header = self.file_textures_table.horizontalHeader() + files_header.setFont(self.small_font) + files_header.setDefaultAlignment(QtCore.Qt.AlignLeft) + files_header.setContentsMargins(0, 0, 0, 0) + files_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) + self.texture_table_layout.addWidget(self.file_textures_table) + + self.textures_button_layout = QtWidgets.QVBoxLayout() + self.directory_button_layout = QtWidgets.QVBoxLayout() + self.directory_button_layout.setAlignment(QtCore.Qt.AlignBottom) + self.textures_button_layout.addLayout(self.directory_button_layout) + self.texture_directory_button = QtWidgets.QPushButton('Directory') + self.texture_directory_button.setFixedSize(90, 40) + self.texture_directory_button.clicked.connect(self.goto_directory_clicked) + self.directory_button_layout.addWidget(self.texture_directory_button) + self.textures_button_layout.addSpacing(3) + + self.selected_button_layout = QtWidgets.QVBoxLayout() + self.selected_button_layout.setAlignment(QtCore.Qt.AlignTop) + self.textures_button_layout.addLayout(self.selected_button_layout) + self.texture_open_button = QtWidgets.QPushButton('Open Selected') + self.texture_open_button.setFixedSize(90, 40) + self.texture_open_button.clicked.connect(self.texture_open_clicked) + self.selected_button_layout.addWidget(self.texture_open_button) + self.file_textures_layout.addLayout(self.textures_button_layout) + self.panel_layout.addWidget(self.file_textures_groupbox) + + # Run Script + self.checklist_script_combo_layout = QtWidgets.QHBoxLayout() + self.panel_layout.addLayout(self.checklist_script_combo_layout) + self.run_script_layout = QtWidgets.QHBoxLayout() + self.run_script_groupbox = QtWidgets.QGroupBox("Run Script") + self.run_script_groupbox.setLayout(self.run_script_layout) + self.run_script_combobox = QtWidgets.QComboBox() + self.run_script_items = ['Attach Textures', 'Create ID Maps', 'Create Metallic Map', 'Set Maya Workspace', + 'Archive Asset'] + self.run_script_combobox.addItems(self.run_script_items) + self.run_script_combobox.setFixedHeight(25) + self.run_script_combobox.setStyleSheet('QComboBox:item {padding-left:30px;}') + self.run_script_layout.addWidget(self.run_script_combobox) + self.run_button = QtWidgets.QPushButton('Run') + self.run_button.clicked.connect(self.run_script_clicked) + self.run_button.setFixedSize(40, 27) + self.run_script_layout.addWidget(self.run_button) + self.checklist_script_combo_layout.addWidget(self.run_script_groupbox) + self.checklist_script_combo_layout.addSpacing(7) + + # Edit Checklist + self.checklist_layout = QtWidgets.QHBoxLayout() + self.checklist_layout.setAlignment(QtCore.Qt.AlignTop) + self.checklist_groupbox = QtWidgets.QGroupBox("Update") + self.checklist_groupbox.setLayout(self.checklist_layout) + self.update_spreadsheet_button = QtWidgets.QPushButton('Spreadsheet') + self.update_spreadsheet_button.setFixedHeight(27) + self.update_date_button = QtWidgets.QPushButton('Update All') + self.update_date_button.setFixedHeight(27) + self.checklist_layout.addWidget(self.update_spreadsheet_button) + self.checklist_layout.addWidget(self.update_date_button) + self.checklist_script_combo_layout.addWidget(self.checklist_groupbox) + self.checklist_script_combo_layout.addSpacing(10) + + # Navigate Listings + self.navigate_layout = QtWidgets.QHBoxLayout() + self.navigate_groupbox = QtWidgets.QGroupBox("Cycle Listings") + self.navigate_groupbox.setLayout(self.navigate_layout) + self.navigate_groupbox.setFixedWidth(105) + self.back_button = QtWidgets.QToolButton() + self.back_button.setFixedSize(37, 27) + self.back_button.setArrowType(QtCore.Qt.LeftArrow) + self.back_button.clicked.connect(self.back_button_clicked) + self.forward_button = QtWidgets.QToolButton() + self.forward_button.setFixedSize(37, 27) + self.forward_button.setArrowType(QtCore.Qt.RightArrow) + self.forward_button.clicked.connect(self.forward_button_clicked) + self.navigate_layout.addWidget(self.back_button) + self.navigate_layout.addWidget(self.forward_button) + self.checklist_script_combo_layout.addWidget(self.navigate_groupbox) + + # +++++++++++++++++++---->> + # UTILITY TAB --------------->> + # +++++++++++++++++++---->> + + self.utility_tab_content = QtWidgets.QWidget() + self.window_tabs.addTab(self.utility_tab_content, 'Utility') + self.utility_layout = QtWidgets.QVBoxLayout(self.utility_tab_content) + self.utility_layout.setContentsMargins(10, 10, 10, 10) + self.utility_layout.setSpacing(0) + self.utility_color_frame = QtWidgets.QFrame(self.utility_tab_content) + self.utility_color_frame.setGeometry(0, 0, 5000, 5000) + self.utility_color_frame.setStyleSheet('background-color:rgb(235, 235, 235);') + + self.utility_buttons_layout = QtWidgets.QVBoxLayout() + self.utility_buttons_layout.setAlignment(QtCore.Qt.AlignTop) + self.utility_buttons_groupbox = QtWidgets.QGroupBox("Actions") + self.utility_buttons_groupbox.setLayout(self.utility_buttons_layout) + self.utility_layout.addWidget(self.utility_buttons_groupbox) + + self.initialize_window() + + ############################## + # Initialize ################# + ############################## + + def initialize_window(self): + """ + This function is ran by default. The main purpose is to gather information from the Shelve database + on startup to display in the tool's main window in the UI if previously ran. + :return: + """ + self.mayapy_path = self.get_mayapy_path() + self.set_io_directories() + self.asset_data_window.setText('Ready.') + self.initialize_qprocess() + + # Get Material Definition Template + with open(self.default_material_definition) as json_file: + self.template_lumberyard_material = json.load(json_file) + + if os.path.exists(os.path.join(Path.cwd(), 'materialsdb.dat')): + if self.materials_db: + self.set_data_window() + else: + self.asset_data_window.setText('Ready.') + + def process_directory(self, directory_path): + """ + This is the main launching point for processing assets and asset information. The loop processes each + directory with an FBX file contained within it, and orchestrates image and pbr material conversions + :return: + """ + _LOGGER.info('Process directory') + target_path = Path(directory_path) + directory_audit = lumberyard_data.walk_directories(target_path) + self.start_load_sequence(directory_audit) + + for key, values in directory_audit.items(): + directory_audit = values + destination_directory = self.set_destination_directory(values.directoryname) + base_directory_path = Path(values.directorypath) + self.transfer_existing_files(base_directory_path, destination_directory) + fbx_files = values['files']['.fbx'] + for fbx_file in fbx_files: + self.progress_event_fired('fbx_{}'.format(fbx_file.name)) + mtl_info = lumberyard_data.get_material_info(base_directory_path, f'{fbx_file.stem}.mtl') + asset_information = self.filter_asset_information(fbx_file, directory_audit, mtl_info) + self.set_material_information(asset_information, mtl_info, fbx_file, destination_directory) + self.create_maya_files(base_directory_path, destination_directory, fbx_files) + self.reset_load_progress() + + def process_single_asset(self, fbx_path): + """ + Coordinates the processing of a single FBX asset, which includes generation of all material files + associated with that FBX file, the conversion of attached textures, and a Maya file for preview + :param fbx_path: Path to the FBX file to be converted. + :return: + """ + _LOGGER.info('Process single asset') + fbx_file = Path(fbx_path) + base_directory_path = fbx_file.parent + directory_audit = lumberyard_data.walk_directories(fbx_file) + self.start_load_sequence(directory_audit) + destination_directory = self.set_destination_directory(directory_audit[0].directoryname) + self.progress_event_fired('fbx_{}'.format(fbx_file.name)) + mtl_info = lumberyard_data.get_material_info(fbx_file.parent, f'{fbx_file.stem}.mtl') + asset_information = self.filter_asset_information(fbx_file, directory_audit[0], mtl_info) + self.transfer_existing_files(fbx_file.parent, destination_directory, fbx_file.name) + self.set_material_information(asset_information, mtl_info, fbx_file, destination_directory) + self.create_maya_files(base_directory_path, destination_directory, [fbx_file]) + self.reset_load_progress() + + def update_db_listing(self, index, asset_information): + """ + Processed file information is stored in a Shelve database. Due to the way Shelve stores information, + if listings need to be updated this cannot be achieved directly- a listing needs to be copied, revisions + made to it, with the original listing deleted and replaced by the revised copy + :param index: Index of the shelve database + :param asset_information: The information to include or update + :return: + """ + temp_dict = self.materials_db[index].copy() + del self.materials_db[index] + + fbx_files = temp_dict.fbxfiles + for key, values in fbx_files.items(): + asset_information.fbxfiles[key] = values + self.materials_db[index] = asset_information + + def compare_boilerplate_settings(self, property_values, material_template): + """ + Lumberyard material definitions only include settings that deviate from default settings. When converting .mtl + files to .material files, the script attempts to find all settings that each material previously held and carry + them over. When creating .material files, the script compares information found with the default settings of a + standard pbr material description, and only includes this information to the definition when it finds a need to + :param property_values: + :param material_template: + :return: + """ + updated = False + updated_property_dictionary = {} + try: + for key, value in material_template.items(): + lower_template_key = key.lower() + _LOGGER.info(f'-----|| Key: {lower_template_key}') + for k, v in property_values.items(): + lower_property_key = k.lower() + if lower_property_key == lower_template_key: + _LOGGER.info(f'////////////////// Target key found: {key}') + _LOGGER.info(f'TemplateValue: {value}') + _LOGGER.info(f'PropertyValue: {v}') + if v != value: + _LOGGER.info(f'{key}---->> NEW VALUE: {v}') + updated = True + target_value = self.format_material_value(v) + updated_property_dictionary[key] = target_value + else: + updated_property_dictionary[key] = value + break + except Exception as e: + _LOGGER.info(f'Problem in boilerplate: {e}') + if updated: + return updated_property_dictionary + return None + + def format_material_value(self, value): + """ + In order for the formatting of the information to work properly once converted into a JSON-like material + definition, information needs to be properly formatted... not all information can be gathered as strings. This + function reviews the format of the information and makes changes if necessary for the information to carry + over properly in the definition. + :param value: The value under review for formatting issues + :return: + """ + if isinstance(value, list): + converted_list = [] + for item in value: + item_value = 0 if item is 0 else float(item) + converted_list.append(item) + return converted_list + elif isinstance(value, str): + if os.path.isfile(str(value)): + target_path = self.get_relative_path(value) + return str(target_path) + elif value in ['true', 'false']: + return str(value) + elif value.isnumeric(): + return 0 if value is 0 else float(value) + else: + pattern = r'\[[^\]]*\]' + test_brackets = re.sub(pattern, '', value) + if test_brackets[0].isnumeric(): + return float(test_brackets) + else: + _LOGGER.info(f'Unknown Value Cannot Be Formatted: [{value}] --->> Type: {type(value)}') + return value + else: + return value + + def export_material_file(self, file_name, material_name, material_values, destination_directory): + """ + Collects all the information necessary to generate a material definition, and exports the file. Definition + information is cross-referenced with a StandardPBR material template file, and information that runs counter + to what is listed in this file is included in the definition. + :param file_name: The name of the file to be saved as a material definition. + :param material_name: The name of the material that the definition represents. + :param material_values: The values for the material to be included in the definition. + :param destination_directory: Where the .material file is saved once processed. + :return: + """ + _LOGGER.info(f'\n_\n******** {material_name} -- EXPORT INFO: {material_values}') + _LOGGER.info(f'Filename::::::::: {file_name}') + export_file_path = Path(destination_directory / file_name) + if not export_file_path.is_file(): + material_description = {} + material_template = self.template_lumberyard_material.copy() + material_textures = material_values.textures + try: + for key, values in material_template.items(): + # These values remain constant + if key != 'properties': + material_description[key] = values + # Values driven by textures and numerical values + else: + modified_items = [] + material_description[key] = {} + for material_property in constants.SUPPORTED_MATERIAL_PROPERTIES: + temp_dict = {} + texture_key = None + if material_property == 'general': + pass + elif material_property == 'ambientOcclusion': + pass + elif material_property == 'baseColor': + clr = material_values.numericalsettings.Diffuse.split(',') + clr = [float(x) for x in clr] + factor = clr[-1] + temp_dict['color'] = [clr[0], clr[1], clr[2]] + if factor < 1: + temp_dict['factor'] = factor + texture_key = 'BaseColor' + elif material_property == 'emissive': + if 'Emittance' in material_values.numericalsettings: + clr = material_values.numericalsettings.Emittance.split(',') + clr = [float(x) for x in clr] + temp_dict['color'] = [clr[0], clr[1], clr[2]] + factor = clr[-1] if len(clr) == 4 else 0.0 + emission_intensity = self.get_emission_intensity(factor) + if 'Emissive' in material_textures.keys() or emission_intensity != -5: + temp_dict['enable'] = True + temp_dict['intensity'] = str(emission_intensity) + texture_key = 'Emissive' + elif material_property == 'metallic': + texture_key = 'Metallic' + elif material_property == 'roughness': + texture_key = 'Roughness' + elif material_property == 'specularF0': + clr = material_values.numericalsettings.Specular.split(',') + if float(clr[0]) != .5: + temp_dict['factor'] = float(clr[0]) + elif material_property == 'normal': + texture_key = 'Normal' + elif material_property == 'opacity': + texture_key = 'Opacity' + elif material_property == 'uv': + modifications = material_values['modifications'] + if modifications: + for modification_key in modifications.keys(): + _LOGGER.info(f'{material_name.lower()} <+++++++> {modification_key.lower()}') + if material_name.lower() == modification_key.lower(): + for mod_key, mod_value in modifications[material_name].items(): + _LOGGER.info(f'ModKey: {mod_key} ModValue: {mod_value}') + temp_dict[mod_key] = mod_value + else: + _LOGGER.info(f'Unknown Material Property found: {material_property}') + + # Add Texture Map + if texture_key and texture_key in material_textures.keys(): + if material_property not in ['emissive', 'general'] and 'factor' not in temp_dict.keys(): + temp_dict['factor'] = 1.0 + temp_dict['useTexture'] = True + temp_dict['textureMap'] = os.path.normpath(material_textures[texture_key]) + + # Determine if property should be added based on deviation from default settings + _LOGGER.info(f'TempDict: {temp_dict}') + if temp_dict: + comparison_dictionary = material_template['properties'][material_property] + _LOGGER.info(f'ComparisonDictionary: {comparison_dictionary}') + custom_settings = self.compare_boilerplate_settings(temp_dict, comparison_dictionary) + _LOGGER.info(f'CustomSettings: {custom_settings}') + _LOGGER.info(f'MaterialProperty: {material_property}') + _LOGGER.info(f'Key: {key}') + if custom_settings: + material_description[key][material_property] = custom_settings + _LOGGER.info('Custom settings found') + + if self.create_material_files_checkbox.isChecked(): + if len(material_description) > 4: + _LOGGER.info('\n++++++++++++++\n+++++++++++++++\nFinal Material: {}\n++++++++++++++\n' + '+++++++++++++++\n_\n'.format(json.dumps(material_description, indent=4, sort_keys=False))) + lumberyard_data.export_lumberyard_material(os.path.abspath(export_file_path), material_description) + return os.path.abspath(export_file_path) + except Exception as e: + _LOGGER.info(f'###################### Error processing material file [{file_name}]: {e}') + else: + return os.path.abspath(export_file_path) + return None + + def get_emission_intensity(self, mtl_setting): + """ + This converts the emission intensity setting of an mtl file into an equivalent exposure value for the + .material format. + :param mtl_setting: The float value to be converted from the .mtl file + :return: + """ + if float(mtl_setting) > 0.0: + return math.log(mtl_setting * 1000.0 / .125, 2) / 3.0 + else: + return -5.0 + + def filter_asset_information(self, target_path, directory_audit, mtl_info): + """ + Helper function used for comparisons as well as structuring information for shelve database entries + :param target_path: Path to the processed directory + :param directory_audit: List of files found in a processed directory + :param mtl_info: Material information relating to each FBX asset (texture names, pbr type, and paths) + :return: + """ + asset_dictionary = {} + if target_path.is_file(): + directory_name = directory_audit.directoryname + directory_path = Path(directory_audit.directorypath) + directory_files = directory_audit.files + materials = self.get_material_information(directory_path, mtl_info, f'{target_path.name}.assetinfo') + fbx_files = {target_path.name: {constants.FBX_MAYA_FILE: '', constants.FBX_MATERIALS: materials}} + asset_dictionary = {constants.FBX_DIRECTORY_NAME: directory_name, constants.FBX_DIRECTORY_PATH: directory_path, + constants.FBX_FILES: fbx_files} + else: + pass + return Box(asset_dictionary) + + ############################## + # Creation ################### + ############################## + + def reformat_materials_db(self, to_maya, updates=False): + """ + This function is ran before and after the interchange of files between Maya, and is needed so that Maya + (which runs on Python 2.7) is able to access the information gathered from the main script, as opposed to + trying to shuttle and manage information based back and forth as strings through a subprocess. This function + will also prompt a listing update when new file information is received from Maya + :param to_maya: Specifies whether the reformatting is being executed before or after handoff to Maya for + generating Maya files + :param updates: Currently this only holds a list of Maya files generated after the return trip completes, + but can be used to shuttle any information back from Maya as needed. + :return: + """ + temp_dictionary = {} + for k, v in self.materials_db.items(): + temp_dictionary[k] = v + self.materials_db.clear() + + if updates: + temp_dictionary = self.update_maya_files(temp_dictionary, updates) + + if to_maya: + reformatted_database = utilities.convert_box_dict_to_standard(temp_dictionary) + for key, value in reformatted_database.items(): + self.materials_db[key] = value + else: + reformatted_database = utilities.convert_standard_dict_to_box(temp_dictionary) + for key, value in reformatted_database.items(): + self.materials_db[key] = value + + def update_maya_files(self, temp_dictionary, updates): + """ + Updates the "mayafiles" entry of each FBX file that has had a Maya file successfully generated for it. + :param temp_dictionary: Dictionary containing the current shelve database listing relating to the Maya + files generated. + :param updates: Dictionary containing the Maya file information + :return: + """ + _LOGGER.info('Updating Maya Files ------------------->>') + for key, value in temp_dictionary.items(): + for k, v in updates.items(): + if k == key: + for fbx_file, maya_file_value in v.items(): + for target_fbx, target_fbx_listing in value[constants.FBX_FILES].items(): + if fbx_file == target_fbx: + _LOGGER.info('Updating Mayafile: {}'.format(maya_file_value['maya_file'])) + target_fbx_listing[constants.FBX_MAYA_FILE] = maya_file_value['maya_file'] + return temp_dictionary + + def initialize_qprocess(self): + """ + This sets the QProcess object up and adds all of the aspects that will remain consistent for each directory + processed. + :return: + """ + self.p = QProcess() + env = [env for env in QtCore.QProcess.systemEnvironment() if not env.startswith('PYTHONPATH=')] + env.append(f'MAYA_LOCATION={os.path.dirname(self.mayapy_path)}') + env.append(f'PYTHONPATH={os.path.dirname(self.mayapy_path)}') + self.p.setEnvironment(env) + self.p.setProgram(str(self.mayapy_path)) + self.p.setProcessChannelMode(QProcess.SeparateChannels) + self.p.readyReadStandardOutput.connect(self.handle_stdout) + self.p.readyReadStandardError.connect(self.handle_stderr) + self.p.stateChanged.connect(self.handle_state) + self.p.started.connect(self.processStarted) + self.p.finished.connect(self.cleanup) + + def create_maya_files(self, base_directory, destination_directory, fbx_files): + """ + Once information is gathered for targeted directories and all the texture files have been converted, this is the + final processing step run before the material files are generated. The creation of the Maya files is done by + way of Maya Standalone. There are some reported issues with Stingray textures and Maya that have been formally + added to the bug fix queue at Autodesk. Until then, there is an additional script to run for each of the Maya + files generated to attach texture connections (isolate_and_assign.py). + :param base_directory: The directory that contains the FBX files used for creating the Maya files + :param destination_directory: Where the Maya files are to be saved + :param fbx_files: List of FBX files to be converted to Maya ascii files + :return: + """ + if self.create_maya_files_checkbox.isChecked(): + self.reformat_materials_db(True) + db_updates = None + fbx_list = [] + for file in fbx_files: + maya_file = Path(os.path.join(destination_directory, str(file.stem) + '.ma')) + if not maya_file.is_file(): + fbx_list.append(str(file)) + try: + script_path = os.path.join(os.getcwd(), 'create_maya_files.py') + modify_material_names = 'True' if self.clean_material_names_checkbox.isChecked() else 'False' + fbx_list.append(os.path.normpath(base_directory)) + fbx_list.append(os.path.normpath(destination_directory)) + fbx_list.append(modify_material_names) + + command = [script_path] + for file in fbx_list: + command.append(file) + + self.p.setArguments(command) + self.p.start() + self.p.waitForFinished(-1) + except Exception as e: + _LOGGER.warning(f'Error creating Maya Files: {e}') + + def processStarted(self): + _LOGGER.info('Maya Standalone Process Started....') + + def handle_stderr(self): + pass + # data = self.p.readAllStandardError() + # stderr = bytes(data).decode("utf8") + # _LOGGER.info(f'STD_ERROR_FIRED: {stderr}') + + def handle_stdout(self): + """ + This catches standard output from Maya while processing. It is used for keeping track of progress, and once + the last FBX file in a target directory is processed, it updates the database with the newly created Maya files. + :return: + """ + data = self.p.readAllStandardOutput() + stdout = bytes(data).decode("utf8") + if stdout.startswith('{'): + _LOGGER.info('QProcess Complete.') + db_updates = json.loads(stdout) + self.maya_processing_complete(db_updates) + else: + self.progress_event_fired(stdout) + + def handle_state(self, state): + """ + Mainly just for an indication in the Logging statements as to whether or not the QProcess is running + :param state: + :return: + """ + states = { + QProcess.NotRunning: 'Not running', + QProcess.Starting: 'Starting', + QProcess.Running: 'Running' + } + state_name = states[state] + _LOGGER.info(f'QProcess State Change: {state_name}') + + def cleanup(self): + self.p.closeWriteChannel() + _LOGGER.info("Maya File Conversion Complete") + + def create_designer_files(self, fbx_file): + """ + It would be helpful to have the ability to send an FBX file to Substance Designer and have a node tree + automatically created to assist in further processing of each of the PBR textures. This serves as a stub + until this functionality can be added. + :param fbx_file: File for the Designer setup to be based upon + :return: + """ + _LOGGER.info(f'Generate Designer File for: {fbx_file}') + + def create_checklist_data(self, directory_index): + """ + Creates checklists for keeping track of assets as well as containing file paths and other useful information + :param directory_index: The shelve database listing that the checklist corresponds to + :return: + """ + checklist_data = {} + texture_types = 'basecolor metallic roughness normal emissive scattering opacity'.split(' ') + + if self.create_checklist_checkbox.isChecked(): + target_dictionary = self.materials_db[str(directory_index)] + try: + for key, values in target_dictionary[constants.FBX_FILES].items(): + fbx_name = key + destination_directory = self.set_destination_directory(target_dictionary[constants.FBX_DIRECTORY_NAME]) + + for material_name, texture_set in values['materials'].items(): + checklist = collections.OrderedDict() + checklist['fbxname'] = fbx_name + checklist['materialname'] = material_name + checklist['dirname'] = target_dictionary[constants.FBX_DIRECTORY_NAME] + checklist['dirpath'] = target_dictionary[constants.FBX_DIRECTORY_PATH] + checklist['mayafile'] = values[constants.FBX_MAYA_FILE] + + for texture in texture_types: + checklist[texture] = '' + try: + if 'textures' in texture_set.keys(): + for key, value in texture_set['textures'].items(): + if key.lower() == texture: + checklist[texture] = str(value) + break + except TypeError as e: + _LOGGER.info(f'Could not gather image data for index [{directory_index}]: {e}') + checklist['status'] = 'Started' + checklist['synced'] = 'No' + checklist_data[material_name] = {key: values for key, values in checklist.items()} + self.export_checklist(destination_directory, dict(checklist_data)) + except Exception as e: + _LOGGER.info(f'Checklist data could not be processed- Exception: {e}') + + def export_checklist(self, target_path, export_data): + """ + Creates the auditing checklist csv file for keeping logs on progress in the conversion process. + :param target_path: + :param export_data: + :return: + """ + if len(export_data.items()): + headers = [value for key, value in export_data.items()][0].keys() + checklist_path = os.path.join(target_path, 'checklist.csv') + with open(checklist_path, 'w', newline='') as outfile: + writer = csv.writer(outfile) + writer.writerow(headers) + for key, value in export_data.items(): + row_info = [] + for k, v in value.items(): + row_info.append(v) + writer.writerow(row_info) + + def populate_image_table(self, table_items): + """ + Feeds texture information into the texture table of the UI when inspecting FBX asset information + :param table_items: The texture list to be displayed- contains PBR texture type and file paths + :return: + """ + self.file_textures_table.setRowCount(0) + for index, listing in enumerate(table_items): + self.file_textures_table.insertRow(index) + for column in range(2): + cell_value = listing[0] if column == 0 else os.path.basename(listing[1]) + item = QtWidgets.QTableWidgetItem(cell_value) + self.file_textures_table.setItem(index, column, item) + + def transfer_existing_files(self, base_directory, destination_directory, target_prefix=None): + """ + Some files in the conversion process need to be copied over into the newly converted destination directory + unchanged. These files include the assetinfo and fbx files. Target prefix is for the single FBX transfer + setting, and will limit files moved to those starting with this value + :param base_directory: The directory that the existing files are located in + :param destination_directory: The directory that the existing files need to be moved to + :param target_prefix: The file stem used to target individual file transfers + :return: + """ + for file in base_directory.iterdir(): + if file.suffix in constants.TRANSFER_EXTENSIONS: + if target_prefix: + if str(file).startswith(target_prefix) or str(file).startswith(target_prefix.lower()): + image_conversion.transfer_file(base_directory / file.name, destination_directory / file.name) + else: + image_conversion.transfer_file(base_directory / file.name, destination_directory / file.name) + + ############################## + # Getters/Setters ############ + ############################## + + def get_material_information(self, search_path, mtl_info, assetinfo): + """ + Builds a dictionary for each fbx in a processed directory used for creating a .material file. This information + includes texture sets, 'uv' modifications like tiling and rotation, numerical settings like color or f0 specularity + settings, and the fbx layer geometry that the materials are assigned to + :param search_path: The directory used to search for assets related to a listing + :param mtl_info: Information drawn from the .mtl file relevant for processing + :param assetinfo: Information collected after processing PBR textures conversion + :return: + """ + fbx_material_dictionary = Box({}) + for key, values in mtl_info.items(): + _LOGGER.info(f'\n_\n+++++++++++++++++++++++++\nMaterial: {key}\n+++++++++++++++++++++++++\n') + fbx_material_dictionary[key] = {} + if values.attributes.Shader == 'Illum': + legacy_textures = values.textures + all_textures = self.get_additional_textures(search_path, legacy_textures) + fbx_material_dictionary[key][constants.FBX_TEXTURES] = self.get_texture_set(search_path, all_textures) if legacy_textures else '' + fbx_material_dictionary[key][constants.FBX_TEXTURE_MODIFICATIONS] = values.modifications if values.modifications else '' + fbx_material_dictionary[key][constants.FBX_NUMERICAL_SETTINGS] = self.get_numerical_settings(mtl_info, key) + fbx_material_dictionary[key][constants.FBX_MATERIAL_FILE] = '' + fbx_material_dictionary[key][constants.FBX_ASSIGNED_GEO] = lumberyard_data.get_asset_info(search_path, assetinfo, key) + elif values.attributes.Shader == 'Nodraw': + _LOGGER.info('Found No-draw shader... skipping') + else: + pass + _LOGGER.info(f'\n_____\n_____FBX Material Dictionary:::: {fbx_material_dictionary}\n______\n') + return fbx_material_dictionary + + def get_additional_textures(self, search_path, texture_set): + """ + Mtl files only contain 3 main textures in most cases that are associated with a material (*.dds files)- these + include diffuse, specular, and ddna ('emission') are also often listed. There are other textures that can be + lurking in these directories such as Opacity or SSS files- this function tries to find all textures that + comprise a set that may not fall explicitly into that mtl definition- found based on file prefix + :param search_path: The directory to search for the additional textures + :param texture_set: The specified textures from the mtl definition used to track down other related textures + :return: + """ + all_textures = texture_set.copy() + if texture_set: + texture_keys = texture_set.keys() + for key in texture_keys: + try: + texture_basename = image_conversion.get_texture_basename(texture_set[key]) + if texture_basename: + for target_image in search_path.iterdir(): + if target_image.stem.lower().startswith(texture_basename): + texture_type = image_conversion.get_texture_type(target_image) + for key, values in constants.IMAGE_KEYS.items(): + if texture_type.lower() in values: + all_textures[key] = search_path / target_image + break + except Exception as e: + _LOGGER.info(f'Could not find texture basename... skipping: {e}') + return all_textures + + def get_numerical_settings(self, mtl_info, material): + """ + In addition to texture file information, there are many settings that don't require files to change material + appearances. This gathers that information if it can be carried over to .material file definitions + :param mtl_info: + :param material: + :return: + """ + numerical_settings = {} + property_list = ['Diffuse', 'Specular', 'Emittance', 'Opacity'] + for material_property in property_list: + try: + numerical_settings[material_property] = mtl_info[material].attributes[material_property] + except Exception as e: + pass + return numerical_settings + + def get_texture_set(self, search_path, mtl_textures): + """ + Begins the process of collecting texture sets for each material found in an FBX file. The process begins by + getting the file "stem" string in order to find textures starting with identical strings + :param search_path: The directory to search for corresponding files + :param mtl_textures: The texture file names pulled from the mtl files in the legacy directories + :return: + """ + _LOGGER.info(f'GetTexSet: {search_path} MTL TEXTURES: {mtl_textures}') + destination_directory = self.set_destination_directory(search_path.name) + for key, value in mtl_textures.items(): + for file in search_path.iterdir(): + if file.stem.lower() == value.stem: + mtl_textures[key] = search_path / file + _LOGGER.info(f'\n///////// MTL TEX: {mtl_textures[key]}') + break + return image_conversion.get_pbr_textures(mtl_textures, Path(destination_directory), search_path, Path(self.input_directory)) + + def get_relative_path(self, full_path): + """ + Material definitions use relative paths for file textures- this function takes the full paths of assets and + converts to the abbreviated relative path format needed for Lumberyard to source the files + :param full_path: Full path to the asset + :return: + """ + return_path = Path(full_path) + start_directory = 'Objects' + path_list = return_path.parts + return_path = ('/').join(path_list[path_list.index(start_directory):]) + return return_path + + def get_separator_bar(self): + """ Convenience function for UI layout element """ + self.line.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + self.line.setLineWidth(3) + self.line.setFixedHeight(10) + self.separator_layout.addWidget(self.line) + return self.separator_layout + + def get_checklist(self, target_path): + """ + Reads audit checklist and returns the values contained as a list + + :param target_path: + :return: + """ + transfer_list = [] + if os.path.exists(target_path): + with open(target_path, 'r') as f: + reader = csv.reader(f, skipinitialspace=True, delimiter=',') + for row in reader: + transfer_list.append(row) + return transfer_list + + def get_current_section_path(self): + """ + Helps to determine which shelf database listing is open in the asset inspection window. + :return: + """ + section_directory = self.asset_directory_combobox.currentText() + for key, value in self.materials_db.items(): + if value[constants.FBX_DIRECTORY_PATH] == section_directory: + return value[constants.FBX_DIRECTORY_PATH] + + def get_mayapy_path(self): + """ + Finds the most current version of Maya for use of its standalone python capabilities. + :return: + """ + maya_versions = [int(x.name[-4:]) for x in self.autodesk_directory.iterdir() if x.name.startswith('Maya')] + if maya_versions: + target_version = f'Maya{max(maya_versions)}' + self.create_maya_files_checkbox.setChecked(True) + return self.autodesk_directory / target_version / 'bin\mayapy.exe' + else: + self.create_maya_files_checkbox.setChecked(False) + return None + + def get_section_audit(self, key): + """ + Gathers basic information for a directory that has been converted. + + :param key: Which key in the shelve database to target for audit information + :return: + """ + section_data = self.materials_db[key] + readout_text = '+++++++++++++++++++\n' + readout_text += '{}\n'.format(section_data[constants.FBX_DIRECTORY_NAME]) + readout_text += '+++++++++++++++++++\n\n' + + # FBX files //------------------>> + fbx_files = section_data[constants.FBX_FILES] + readout_text += f'FBX files: ({len(fbx_files)} total)\n' + for k, v in fbx_files.items(): + readout_text += f'{k}\n' + + # Maya files //------------------>> + maya_file_count = 0 + maya_file_list = [] + material_file_list = [] + texture_files = [] + for k, v in fbx_files.items(): + file_path = v[constants.FBX_MAYA_FILE] + if file_path: + maya_file_count += 1 + maya_file_list.append(file_path.name) + if constants.FBX_MATERIALS in v.keys(): + for k, v in v[constants.FBX_MATERIALS].items(): + for mat_key, mat_val in v.items(): + if mat_key == constants.FBX_MATERIAL_FILE: + if mat_val: + material_file_list.append(mat_val) + elif mat_key == constants.FBX_TEXTURES and isinstance(mat_val, dict): + if mat_val.keys(): + for texture_key, texture_path in mat_val.items(): + try: + texture_path = Path(texture_path) + texture_files.append(texture_path.name) + except Exception as e: + _LOGGER.info(f'Could not add TextureKey/Path in GET_SECTION_AUDIT: {e}') + else: + pass + texture_files = list(set(texture_files)) + + # Maya files //------------------>> + readout_text += f'\nMaya files: ({maya_file_count} total)\n' + for maya_file in maya_file_list: + readout_text += f'{maya_file}\n' + + # Material files //------------------>> + readout_text += f'\nMaterial Definitions: ({len(material_file_list)} Total)\n' + for material_definition in material_file_list: + # material_file = Path(material_definition) + readout_text += f'{Path(material_definition).name}\n' + + # Texture files //------------------>> + pbr_textures = ['BaseColor', 'Normal', 'Metallic', 'Roughness', 'Emissive'] + readout_text += f'\nTexture Files: ({len(texture_files)} Total)\n' + for texture_file in texture_files: + readout_text += f'{texture_file}\n' + readout_text += '\n\n\n' + return readout_text + + def set_material_information(self, asset_information, mtl_info, fbx_file, destination_directory): + """ + Sets the material information in shelve database listing based on individual FBX file + :param asset_information: Newly generated pbr texture information for each material + :param mtl_info: Information pulled from corresponding mtl file (modifications, textures, numerical info) + :param fbx_file: Target FBX file + :param destination_directory: The directory that assets will be saved to in the conversion process + :return: + """ + fbx_files = asset_information.fbxfiles.values() + for key, values in fbx_files[0].materials.items(): + for k, v in mtl_info.items(): + if key is v.attributes.Name: + if v.attributes.Shader in constants.EXPORT_MATERIAL_TYPES: + material_values = Box(values) + material_file = self.export_material_file(f'{fbx_file.stem}_{key}.material'.lower(), key, + material_values, destination_directory) + values.materialfile = material_file if material_file else '' + self.set_materials_db(asset_information) + + def set_materials_db(self, asset_information): + """ + Once information has been successfully collected for all assets involved in an individual asset directory, + this prompt moves the recorded information on all transactions into the shelve database + :param asset_information: + :return: + """ + target_path = asset_information[constants.FBX_DIRECTORY_PATH] + if self.materials_db: + for key, values in self.materials_db.items(): + if constants.FBX_DIRECTORY_PATH in values.keys(): + if values[constants.FBX_DIRECTORY_PATH] == target_path: + self.update_db_listing(key, asset_information) + return key + target_index = str(len(self.materials_db)) + + self.materials_db[target_index] = asset_information + return target_index + else: + self.materials_db['0'] = asset_information + return '0' + + def set_io_directories(self): + """ + This is constantly running when user interacts with the source and destination fields in the UI, validating that + the paths are legitimate. In the event that there are malformed or non-existing paths- it disables the processing + button. + :return: + """ + input_directory = self.input_path_field.text() + output_directory = self.output_path_field.text() + unlocked = True + + if self.use_directory_radio_button.isChecked(): + if os.path.isdir(input_directory.strip()): + self.input_directory = Path(input_directory.strip()) + else: + unlocked = False + else: + if os.path.isfile(input_directory.strip()): + self.input_directory = Path(input_directory.strip()) + else: + unlocked = False + if os.path.isdir(output_directory.strip()): + self.output_directory = Path(output_directory.strip()) + else: + unlocked = False + self.process_files_button.setEnabled(unlocked) + + def set_asset_window(self, section_data=None): + """ + The asset window gives a more detailed readout of information relating to individual asset folders that have + been processed. The information stored in this area is gathered using this function. + :param section_data: If there is no section data a brand now listing is created, otherwise the information + is added to an existing listing + :return: + """ + if len(self.materials_db) and section_data is None: + section_data = self.materials_db['0'] + + try: + self.asset_directory_combobox.blockSignals(True) + self.asset_directory_combobox.clear() + directory_items = [] + for key, values in self.materials_db.items(): + directory_items.append(values[constants.FBX_DIRECTORY_NAME]) + self.asset_directory_combobox.addItems(directory_items) + current_directory = section_data.directoryname + index = self.asset_directory_combobox.findText(current_directory, QtCore.Qt.MatchFixedString) + self.asset_directory_combobox.setCurrentIndex(index) + self.asset_directory_combobox.blockSignals(False) + + # Set FBX files --> + fbx_dictionary = {} + fbx_info = section_data[constants.FBX_FILES] + if fbx_info: + fbx_dictionary = self.get_fbx_info(fbx_info) + + # Set Material File List --> + self.material_files_combobox.clear() + material_list = self.get_material_list(fbx_dictionary) + self.material_files_combobox.addItems(material_list) + + # # Set FBX List --> + self.fbx_combobox.blockSignals(True) + self.fbx_combobox.clear() + fbx_files = list(fbx_dictionary.keys()) + self.fbx_combobox.addItems(fbx_files) + self.fbx_combobox.blockSignals(False) + + # Maya Filename and File Textures --> + success = self.set_texture_list(fbx_dictionary, fbx_files[0]) + + except Exception as e: + _LOGGER.info(f'Exception occured in set asset window: {e}') + + def get_fbx_info(self, fbx_files): + fbx_dictionary = {} + for key, values in fbx_files.items(): + temp_dictionary = {} + if 'mayafile' in values.keys(): + temp_dictionary['mayafile'] = values[constants.FBX_MAYA_FILE] + if 'materials' in values.keys(): + temp_dictionary['materials'] = values[constants.FBX_MATERIALS] + if temp_dictionary: + fbx_dictionary[key] = temp_dictionary + return fbx_dictionary + + def get_material_list(self, fbx_dictionary): + material_list = [] + for key, values in fbx_dictionary.items(): + for k, v in values['materials'].items(): + if 'materialfile' in v.keys(): + if v['materialfile']: + file_path = Path(v['materialfile']) + material_list.append(file_path.name) + material_list.insert(0, 'Choose') + return material_list + + def set_texture_list(self, fbx_dictionary, target_fbx): + table_texture_list = [] + for key, values in fbx_dictionary.items(): + if key == target_fbx: + self.maya_file_label.setText(Path(values['mayafile']).name) + for k, v in values['materials'].items(): + if 'textures' in v.keys(): + for texture_type, texture_path in v['textures'].items(): + table_texture_list.append([texture_type, texture_path]) + if table_texture_list: + self.populate_image_table(table_texture_list) + return True + else: + self.file_textures_table.setRowCount(0) + return False + + def set_data_window(self, target_section='All'): + """ + The data window prints out comprehensive audit information for all files processed + :param target_section: This specifies individual sections if the user filters by directory in the UI + :return: + """ + self.asset_data_window.setText('') + readout_text = '' + + # Show general information for "All" + if target_section == 'All': + count_totals = Box({'materials': 0, 'textures': 0, 'fbxfiles': 0, 'mayafiles': 0}) + + for key, values in self.materials_db.items(): + if values: + try: + for k, v in values.fbxfiles.items(): + count_totals.fbxfiles += 1 + if v[constants.FBX_MAYA_FILE]: + count_totals.mayafiles += 1 + if v.materials: + for material_name, material_values in v.materials.items(): + count_totals.materials += 1 + if constants.FBX_TEXTURES in material_values.keys(): + for texture_type, texture_path in material_values.textures.items(): + count_totals.textures += 1 + except Exception as e: + _LOGGER.info(f'MaterialDB processing failed for [{key}]: Error: {e}') + + readout_text += 'Processed Directories: {}\n'.format(len(self.materials_db)) + readout_text += 'Material Files Processed: {}\n'.format(count_totals['materials']) + readout_text += 'Texture Files Processed: {}\n'.format(count_totals['textures']) + readout_text += 'FBX Files Processed: {}\n'.format(count_totals['fbxfiles']) + readout_text += 'Generated Maya Files: {}\n\n\n'.format(count_totals['mayafiles']) + + if target_section == 'All': + target_keys = [x for x in self.materials_db.keys()] + else: + target_keys = [str(self.directory_combobox.currentIndex())] + + for key in target_keys: + readout_text += self.get_section_audit(key) + + self.asset_data_window.setText(readout_text) + self.set_asset_window() + self.fbx_combobox_changed() + self.create_checklist_data(key) + + def set_output_directory(self): + """ + This lays the groundwork for the output directory. This includes transferring some configuration files, as + well as creating the subdirectory structure to house the output directories + :return: + """ + for target_file in self.initialization_files: + src = os.path.join(os.getcwd(), target_file) + dst = os.path.join(self.output_directory, target_file) + + if os.path.isfile(src) and not os.path.isfile(dst): + image_conversion.transfer_file(src, dst) + + subdirectories = os.path.join(self.output_directory, 'Assets', 'Objects') + if not os.path.exists(subdirectories): + os.makedirs(subdirectories) + + def set_destination_directory(self, target_directory_name): + """ + Checks if a the directory specified as the "Output Directory" in the UI exists, and if not it creates it + :param target_directory_name: The directory path to search for + :return: + """ + destination_directory = self.output_directory / 'Assets\Objects' / target_directory_name + if not destination_directory.is_dir(): + _LOGGER.info(f'Making Destination Directory: {destination_directory}') + destination_directory.mkdir() + return destination_directory + + def set_directory_combobox(self, activate): + """ + Fills the directory combobox with all processed folders present in the shelve database + :param activate: + :return: + """ + if activate: + self.directories_items = [] + for item in self.materials_db.values(): + self.directories_items.append(item[constants.FBX_DIRECTORY_NAME]) + + if self.directories_items: + combobox_items = [str(x) for x in self.directories_items] + self.update_combobox(self.directory_combobox, combobox_items) + self.directory_combobox.setEnabled(True) + else: + self.directory_combobox.clear() + self.directory_combobox.setEnabled(False) + + def set_asset_directory_combobox(self): + """ + Fills the asset directory combobox with all the directory names that have been processed by the tool + :return: + """ + directories_list = [x[constants.FBX_DIRECTORY_NAME] for x in self.materials_db.values()] + self.update_combobox(self.asset_directory_combobox, directories_list) + + def update_combobox(self, target_combobox, items_list): + """ + Adds new items to a specified combobox + :param target_combobox: + :param items_list: + :return: + """ + target_combobox.blockSignals(True) + target_combobox.clear() + target_combobox.addItems(items_list) + target_combobox.blockSignals(False) + + ############################## + # Load Actions ############### + ############################## + + def start_load_sequence(self, audit_info): + """ + This sets the amount of 'load events' for a completed process. Once this number is set, whenever a load + event is triggered it will move the load bar a percentage of the way across. + :param audit_info: Load events are based on what this dictionary contains + :return: + """ + _LOGGER.info(f'STARTING LOAD SEQUENCE :::::: {audit_info}') + self.load_events = [0, 0] + for key, listing in audit_info.items(): + for fbx in listing['files']['.fbx']: + if self.create_maya_files_checkbox.isChecked(): + self.load_events[1] += constants.LOAD_WEIGHTS['maya'] + constants.LOAD_WEIGHTS['fbx'] + else: + self.load_events[1] += constants.LOAD_WEIGHTS['fbx'] + _LOGGER.info('LoadEventTotal: {}'.format(self.load_events[1])) + + def progress_event_fired(self, progress): + """ + Load events are weighted by type- each "maya" file has a weight of 4, 'fbx' has a weight of 2, 'material' is a + weight of 1 + :param progress: This contains the type of event and the name of the generated asset + :return: + """ + event_type = progress.split('_')[0] + progress_weight = constants.LOAD_WEIGHTS[event_type] + self.load_events[0] += progress_weight + load_percentage = int((self.load_events[0] / self.load_events[1]) * 100) + self.progress_bar.setValue(load_percentage) + self.app.processEvents() + + def maya_processing_complete(self, db_updates): + self.reformat_materials_db(False, db_updates) + + def reset_load_progress(self): + self.set_data_window() + self.load_events = None + self.progress_bar.setValue(0) + _LOGGER.info('Process Complete.') + + ############################## + # Button Actions ############# + ############################## + + def set_directory_button_clicked(self, target): + """ + Launches a file browser dialog window for specifying file paths + + :param target: Target sets which directory is being set- input or output + :return: + """ + if self.use_directory_radio_button.isChecked(): + file_path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Directory', self.desktop_location, + QtWidgets.QFileDialog.ShowDirsOnly) + if file_path != '': + self.input_path_field.setText(file_path) if target == 'input' else self.output_path_field.setText( + file_path) + else: + if target == 'input': + file_browser = QtWidgets.QFileDialog() + file_path = file_browser.getOpenFileName(self, 'Set Target File', self.desktop_location, + 'FBX Files (*.fbx)') + if file_path != '': + self.input_path_field.setText(file_path[0]) + self.single_asset_file = file_path + else: + file_path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select Directory', self.desktop_location, + QtWidgets.QFileDialog.ShowDirsOnly) + if file_path != '': + self.output_path_field.setText(file_path) + self.set_io_directories() + + def radio_clicked(self): + """ + Reconfigures the UI when user toggles between single asset and directory processing. + + :return: + """ + self.input_path_field.setText('') + signal_sender = self.sender() + if signal_sender.text() == 'Use Directory': + self.input_directory_label.setText('Input Directory') + self.input_path_field.setText(str(self.input_directory)) + self.file_target_method = 'Directory' + else: + self.input_directory_label.setText('Input FBX File') + self.input_path_field.setText(str(self.single_asset_file)) + self.file_target_method = 'File' + + def process_files_clicked(self): + """ + Starts the conversion process once a target directory/file and output folder has been chosen in the UI + :return: + """ + self.asset_data_window.setText('Conversion Process Started...') + self.app.processEvents() + invalid_path = False + if self.use_directory_radio_button.isChecked(): + directory_path = self.input_path_field.text() + if os.path.isdir(directory_path): + self.input_directory = os.path.normpath(directory_path) + self.set_output_directory() + self.process_directory(directory_path) + else: + invalid_path = 'Please enter a valid directory path.' + + else: + fbx_path = self.input_path_field.text() + if os.path.exists(fbx_path) and fbx_path.endswith('.fbx'): + self.input_directory = os.path.normpath(os.path.dirname(fbx_path)) + self.set_output_directory() + self.process_single_asset(fbx_path) + else: + invalid_path = 'Please enter a valid FBX path.' + + if invalid_path: + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Warning) + msg.setText(invalid_path) + msg.setWindowTitle('Bad Path') + msg.setStandardButtons(QtWidgets.QMessageBox.Ok) + msg.exec_() + + def search_button_clicked(self): + search_text = self.find_field.text() + for key, values in self.materials_db.items(): + section_data = values + for k, v in section_data[constants.FBX_FILES].items(): + if k == search_text: + self.inspect_asset(section_data) + return + + def display_combobox_changed(self): + self.find_field.clear() + if self.display_combobox.currentText() == 'Show All': + self.selected_directory_index = -1 + self.set_directory_combobox(False) + self.results_stacked_widget.setCurrentIndex(0) + elif self.display_combobox.currentText() == 'Show By Directory': + self.set_directory_combobox(True) + self.results_stacked_widget.setCurrentIndex(0) + else: + self.results_stacked_widget.setCurrentIndex(1) + + def directory_combobox_changed(self): + target_data = 'All' if self.directory_combobox.currentText() == '' else self.directory_combobox.currentText() + self.set_data_window(target_data) + + def asset_directory_combobox_changed(self): + self.set_asset_window(self.materials_db[str(self.asset_directory_combobox.currentIndex())]) + + def fbx_combobox_changed(self): + target_directory = self.asset_directory_combobox.currentText() + target_key = self.fbx_combobox.currentText() + _LOGGER.info(f'TargetDirectory: {target_directory} TargetKey: {target_key}') + fbx_files = None + for index, values in self.materials_db.items(): + if values[constants.FBX_DIRECTORY_NAME] == target_directory: + fbx_files = values[constants.FBX_FILES] + fbx_dictionary = self.get_fbx_info(fbx_files) + self.set_texture_list(fbx_dictionary, target_key) + break + + def goto_directory_clicked(self): + """ + Launches the directory containing specified file + :return: + """ + index = self.file_textures_table.selectionModel().selectedRows() + texture_type = self.file_textures_table.item(0,0).text() + current_directory = self.asset_directory_combobox.currentText() + for key, values in self.materials_db.items(): + if values[constants.FBX_DIRECTORY_NAME] == current_directory: + fbx_values = values[constants.FBX_FILES].values() + for val in fbx_values: + material_list = val[constants.FBX_MATERIALS] + for material_key, material_values in material_list.items(): + for texture_key, texture_path in material_values[FBX_TEXTURES].items(): + if texture_type: + if os.path.exists(texture_path): + try: + subprocess.Popen(r'explorer /select, "{}"'.format(texture_path)) + except Exception as e: + _LOGGER.info(f'Couldnt open image file directory: {e}') + return + + def run_script_clicked(self): + """ + Sends commands from the standalone window to an open Maya session. + :return: + """ + pass + + def back_button_clicked(self): + _LOGGER.info('Back button clicked') + + def forward_button_clicked(self): + _LOGGER.info('Forward button clicked') + + def open_material_clicked(self): + if self.material_files_combobox.currentText() != 'Choose': + base_path = self.get_current_section_path() + file_path = os.path.join(base_path, self.material_files_combobox.currentText()) + os.startfile(os.path.abspath(file_path)) + + def texture_open_clicked(self): + """ + Launches and/or opens selected texture file in texture table in Photoshop for making edits. + :return: + """ + index = self.file_textures_table.selectionModel().selectedRows() + texture_type = self.file_textures_table.item(index[0].row(), 0).text() + current_directory = self.asset_directory_combobox.currentText() + for key, values in self.materials_db.items(): + if values[constants.FBX_DIRECTORY_NAME] == current_directory: + fbx_values = values[constants.FBX_FILES].values() + for val in fbx_values: + material_list = val[constants.FBX_MATERIALS] + for material_key, material_values in material_list.items(): + for texture_key, texture_path in material_values[FBX_TEXTURES].items(): + if texture_key == texture_type: + if os.path.exists(texture_path): + try: + os.startfile(os.path.abspath(texture_path)) + except Exception as e: + _LOGGER.info(f'Couldnt open image: {e}') + return + + +if __name__ == '__main__': + app = QApplication(sys.argv) + converter = LegacyFilesConverter() + converter.show() + sys.exit(app.exec_()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/standardPBR.template.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/standardPBR.template.material new file mode 100644 index 0000000000..1ac6fb2fcb --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/standardPBR.template.material @@ -0,0 +1,85 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "general": { + "texcoord": 0 + }, + "ambientOcclusion": { + "factor": 1.0, + "useTexture": false, + "textureMap": "" + }, + "baseColor": { + "color": [ + 1.0, + 1.0, + 1.0 + ], + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "emissive": { + "color": [ + 1.0, + 1.0, + 1.0 + ], + "enable": false, + "intensity": -5.0, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "metallic": { + "factor": 1.0, + "useTexture": false, + "textureMap": "" + }, + "roughness": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": false, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif" + }, + "subsurfaceScattering": { + "enableSubsurfaceScattering": true, + "influenceMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif", + "quality": 0.4, + "scatterDistance": 8, + "subsurfaceScatterFactor": 1 + }, + "opacity": { + "doubleSided": false, + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": false, + "textureMap": "" + }, + "uv": { + "center": [ + 0, + 0 + ], + "offsetU": 0, + "offsetV": 0, + "rotateDegrees": 0, + "scale": 1.0, + "tileU": 1.0, + "tileV": 1.0 + } + } +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/stingray_helper.ma b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/stingray_helper.ma new file mode 100644 index 0000000000..cfacd01190 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/stingray_helper.ma @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d42de1023180dc9ff4f9db8c9718c0d476ecf1fe7be99e53b26ee7939ea55174 +size 133641 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/template.jpg b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/template.jpg new file mode 100644 index 0000000000..b643342010 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/template.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08fa77d80e790d2580f4a6ae6b204357a091c4e675e038e4ef9e1c0bebb5b6f6 +size 11285 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/test_command_port.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/test_command_port.py new file mode 100644 index 0000000000..77bd1f8b32 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/test_command_port.py @@ -0,0 +1,166 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +import socket +import pickle +import traceback +import sys + +# BUFFER_SIZE = 4096 +# port = 20201 +# +# if len(sys.argv) > 1: +# port = sys.argv[1] +# +# def SendCommand(target_command): +# maya_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +# maya_socket.connect(('localhost', port)) +# +# try: +# maya_socket.send("import maya.cmds as cmds".encode()) +# data = maya_socket.recv(BUFFER_SIZE) +# maya_socket.send("cmds.polySphere()".encode()) +# data = maya_socket.recv(BUFFER_SIZE) +# +# # This is a workaround for replacing "null bytes" and converting +# # return information as a list (as opposed to a string) +# result = eval(data.decode().replace('\x00', '')) +# print(result[0]) +# except Exception as e: +# print ('Connection Failed: {}'.format(e)) +# finally: +# maya_socket.close() +# +# +# # maya.send('import maya.cmds as mc; mc.polyCube()') +# # maya.close() +# +# if __name__=='__main__': +# target_command = "import maya.cmds as mc; mc.polySphere();" +# SendCommand(target_command) + + + + +#Port Number 20201 +# MayaVersion + 0 (Mel) or 1 (Python) +# +# import maya.cmds as mc +# mc.commandPort(name=":20201", sourceType="python") +# +# +# His user setup has this in it: +# +# if not mc.about(batch=True): +# mc.commandPort(name=":20200", sourceType="mel") +# mc.commandPort(name=":20201", sourceType="python") + + +class MayaClient(object): + PORT = 20201 + BUFFER_SIZE = 4096 + + def __init__(self): + self.maya_socket = None + self.port = self.__class__.PORT + + def connect(self, port=-1): + if port >= 0: + self.port = port + try: + self.maya_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.maya_socket.connect(('localhost', self.PORT)) + except: + traceback.print_exc() + return False + return True + + def disconnect(self): + try: + self.maya_socket.close() + except: + traceback.print_exc() + return False + return True + + def send(self, cmd): + try: + self.maya_socket.sendall(cmd.encode()) + except: + traceback.print_exc() + return None + return self.recv() + + def recv(self): + try: + data = self.maya_socket.recv(MayaClient.BUFFER_SIZE) + except: + traceback.print_exc() + return None + return data.decode().replace('\x00', '') + + ################## + # COMMANDS ##### + ################## + + def echo(self, text): + cmd = "eval(\"'{}'\")".format(text) + return self.send(cmd) + + def new_file(self): + cmd = "cmds.file(new=True, force=True)" + return self.send(cmd) + + def create_primitive(self, shape): + cmd = '' + if shape == 'sphere': + cmd += 'cmds.polySphere()' + elif shape == 'cube': + cmd += 'cmds.polyCube()' + else: + print('Invalid Shape: {}'.format(shape)) + return None + result = self.send(cmd) + return eval(result) + + def translate(self, node, translation): + cmd = "cmds.setAttr('{0}.translate', {1}, {2}, {3})".format(node, *translation) + + +if __name__ == '__main__': + maya_client = MayaClient() + if maya_client.connect(): + print('Connected successfully') + print('Echo: {}'.format(maya_client.echo('hello world'))) + + file_name = maya_client.new_file() + print(file_name) + + nodes = maya_client.create_primitive('sphere') + print(nodes) + + maya_client.translate(nodes[0], [0, 10, 0]) + + nodes = maya_client.create_primitive('cube') + print(nodes) + + + if maya_client.disconnect(): + print('Disconnected successfully') + else: + print('Failed to connect') + + + + +if __name__ == "__main__": + maya_client = MayaClient() \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/utilities.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/utilities.py new file mode 100644 index 0000000000..eb4974bd55 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/utilities.py @@ -0,0 +1,129 @@ +# coding:utf-8 +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# File Description: +# Contains helper functions to assist when processing files using the DCCsi. This file will be consistently added to +# as new helper functions are needed +# ------------------------------------------------------------------------- + + +import logging as _logging +from pathlib import Path +import pathlib +from box import Box +import os + + +module_name = 'legacy_asset_converter.main.utilities' +_LOGGER = _logging.getLogger(module_name) + + +def convert_box_dict_to_standard(target_dict): + """ + This converts all aspects of a dictionary to be compatible for Python 2.x and 3.x. Converting + dictionaries back and forth is needed in the event that they need to be processed with DCC apps ( + specifically Maya) that run on earlier versions of Python. The Pathlib and Box modules will cause + errors otherwise. + + :param target_dict: This specifies which dictionary to convert + :return: + """ + _LOGGER.info('Convert Box database with Pathlib to standard dictionary listings for Maya 2.7') + converted_dictionary = {} + for key, values in target_dict.items(): + updated_dictionary = {} + for k, v in values.items(): + if str(type(v)) == "": + updated_dictionary[k] = v.to_dict() + elif str(type(v)) == "": + updated_dictionary[k] = [os.path.normpath(x) for x in v.to_list()] + elif isinstance(v, pathlib.WindowsPath): + updated_dictionary[k] = os.path.abspath(v) + else: + updated_dictionary[k] = v + converted_dictionary[key] = clear_pathlib_instances(updated_dictionary) + return converted_dictionary + + +def convert_standard_dict_to_box(target_dict): + """ + This converts all aspects of a dictionary to the preferred formatting for Python 3.x to run it. + To allow more clarity when handling dictionaries extensive use of Box and Pathlib is using in + the handling of data. Unfortunately this is not compatible with Python 2.7 so in some situations + the formatting needs to be removed. This reinstates formatting to include Box and Pathlib. + + :param target_dict: This specifies which dictionary to convert + :return: + """ + _LOGGER.info('Convert Standard dictionary database back to Box Dictionary with Pathlib') + converted_dictionary = {} + for key, values in target_dict.items(): + updated_dictionary = Box({}) + for k, v in values.items(): + if str(type(v)) == "": + updated_dictionary[k] = Box(v) + elif str(type(v)) == "": + updated_dictionary[k] = BoxList(v) + elif os.path.isfile(v): + updated_dictionary[k] = Path(v) + else: + updated_dictionary[k] = v + converted_dictionary[key] = add_pathlib_instances(updated_dictionary) + return Box(converted_dictionary) + + +def add_pathlib_instances(target_dictionary): + """ + Converts string paths to pathlib instances. + :param target_dictionary: + :return: + """ + pathlib_added = {} + for k, v in target_dictionary.items(): + if isinstance(v, dict): + nested = add_pathlib_instances(v) + if len(nested.keys()): + pathlib_added[k] = nested + elif isinstance(v, Box): + nested = add_pathlib_instances(v) + if len(nested.keys()): + pathlib_added[k] = nested + elif isinstance(v, str): + if os.path.isfile(v): + pathlib_added[k] = Path(v) + elif os.path.isdir(v): + pathlib_added[k] = Path(v) + else: + pathlib_added[k] = v + else: + pathlib_added[k] = v + return pathlib_added + + +def clear_pathlib_instances(target_dictionary): + """ + Removes all pathlib instances and replaces with string paths + :param target_dictionary: + :return: + """ + clean = {} + for k, v in target_dictionary.items(): + if isinstance(v, dict): + nested = clear_pathlib_instances(v) + if len(nested.keys()): + clean[k] = nested + elif isinstance(v, pathlib.WindowsPath): + clean[k] = os.path.abspath(v) + else: + clean[k] = v + return clean + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/workspace.mel b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/workspace.mel new file mode 100644 index 0000000000..73f4023568 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/workspace.mel @@ -0,0 +1,88 @@ +//Maya 2020 Project Definition + +workspace -fr "fluidCache" ""; +workspace -fr "JT_ATF" ""; +workspace -fr "images" "Assets/Textures"; +workspace -fr "offlineEdit" ".maya_data/scenes/edits"; +workspace -fr "STEP_ATF Export" ""; +workspace -fr "furShadowMap" ""; +workspace -fr "SVG" ""; +workspace -fr "scripts" "Maya/Scripts"; +workspace -fr "DAE_FBX" ""; +workspace -fr "shaders" "Maya/Shaders"; +workspace -fr "NX_ATF" ""; +workspace -fr "CATIAV5_ATF Export" ""; +workspace -fr "furFiles" ""; +workspace -fr "OBJ" ".maya_data/obj"; +workspace -fr "PARASOLID_ATF Export" ""; +workspace -fr "FBX export" "Assets/Objects"; +workspace -fr "furEqualMap" ""; +workspace -fr "textures" "Assets/textures"; +workspace -fr "BIF" ""; +workspace -fr "lights" ".maya_data/renderData/shaders"; +workspace -fr "DAE_FBX export" ""; +workspace -fr "aliasWire" ".maya_data/data"; +workspace -fr "CATIAV5_ATF" ""; +workspace -fr "SAT_ATF Export" ""; +workspace -fr "movie" ".maya_data/movies"; +workspace -fr "ASS Export" ""; +workspace -fr "mayaAscii" ""; +workspace -fr "move" ".maya_data"; +workspace -fr "autoSave" ".maya_data/autoSave"; +workspace -fr "NX_ATF Export" ""; +workspace -fr "sound" ".maya_data/sound"; +workspace -fr "mayaBinary" ""; +workspace -fr "timeEditor" ""; +workspace -fr "RIBexport" ".maya_data/data"; +workspace -fr "DWG_ATF" ""; +workspace -fr "mentalray" ".maya_data/renderData/mentalray"; +workspace -fr "JT_ATF Export" ""; +workspace -fr "iprImages" ".maya_data/renderData/iprImages"; +workspace -fr "FBX" "Assets/Objects"; +workspace -fr "renderData" ".maya_data/renderData"; +workspace -fr "CATIAV4_ATF" ""; +workspace -fr "fileCache" ""; +workspace -fr "Fbx" "Objects"; +workspace -fr "eps" ""; +workspace -fr "IGESexport" ".maya_data/data"; +workspace -fr "3dPaintTextures" ".maya_data/3dPaintTextures"; +workspace -fr "DXF_ATF Export" ""; +workspace -fr "mel" ".maya_data/mel"; +workspace -fr "translatorData" ""; +workspace -fr "IGES" ".maya_data/data"; +workspace -fr "particles" ".maya_data/particles"; +workspace -fr "DXFexport" ".maya_data/data"; +workspace -fr "DXF_ATF" ""; +workspace -fr "scene" "Assets/Objects"; +workspace -fr "renderScenes" ".maya_data/renderScenes"; +workspace -fr "SAT_ATF" ""; +workspace -fr "PROE_ATF" ""; +workspace -fr "WIRE_ATF Export" ""; +workspace -fr "sourceImages" "ArtSource/Images"; +workspace -fr "RIB" ".maya_data/data"; +workspace -fr "furImages" ""; +workspace -fr "clips" ".maya_data/clips"; +workspace -fr "Adobe(R) Illustrator(R)" ".maya_data/data"; +workspace -fr "animExport" ".maya_data/data"; +workspace -fr "mentalRay" ".maya_data/mentalRay"; +workspace -fr "STEP_ATF" ""; +workspace -fr "DWG_ATF Export" ""; +workspace -fr "depth" ".maya_data/renderData/depth"; +workspace -fr "sceneAssembly" ""; +workspace -fr "IGES_ATF Export" ""; +workspace -fr "teClipExports" ""; +workspace -fr "IGES_ATF" ""; +workspace -fr "PARASOLID_ATF" ""; +workspace -fr "ASS" ""; +workspace -fr "Substance" ".maya_data/data"; +workspace -fr "audio" ".maya_data/sound"; +workspace -fr "EPS" ".maya_data/data"; +workspace -fr "Alembic" "Assets/Objects"; +workspace -fr "diskCache" ".maya_data/cache"; +workspace -fr "illustrator" ""; +workspace -fr "WIRE_ATF" ""; +workspace -fr "templates" "ArtSource/SceneTemplates"; +workspace -fr "animImport" ".maya_data/data"; +workspace -fr "OBJexport" "Assets/Objects"; +workspace -fr "furAttrMap" ""; +workspace -fr "DXF" ".maya_data/data"; diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/__init__.py new file mode 100644 index 0000000000..82db6fdc6f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/__init__.py @@ -0,0 +1,31 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- + +__all__ = ['maya_materials_export'] # populate with modules to control imports + +# from maya_mapping import MayaMapping +# from max_mapping import MaxMapping +# from blender_mapping import BlenderMapping + +# def get_dcc_mapping(app): +# app = app.lower() +# if app == 'maya': +# return MayaMapping() +# elif app == '3dsmax': +# return MaxMapping() +# elif app == 'blender': +# return BlenderMapping() +# else: +# return NullMapping(app) + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/maya_materials_export.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/maya_materials_export.py new file mode 100644 index 0000000000..ea2b6f5605 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/maya_materials_export.py @@ -0,0 +1,632 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- +""" +Usage +===== +Put usage instructions here. + +Output +====== +Put output information here. + +Relevant Links: +https://pythonhosted.org/an_example_pypi_project/sphinx.html +https://github.com/ideasman42/pyfbx_i42 +https://pypi.org/project/py-fbx/ +https://www.quora.com/How-do-I-execute-Maya-script-without-lauching-Maya +https://stackoverflow.com/questions/27437733/use-external-python-script-to-open-maya-and-run-another-script-inside-maya + +Notes: +-- Materials information can be extracted from ASCII fbx pretty easily +-- binary is possible but more difficult +-- FBX files could be exported as ASCII files +-- I could use regex there to extract material information +-- I couldn't get pyfbx_i42 to work, +-- ^ purportedly it can extract information from binary files. +-- You may just have to use the specified python versions + +-- Jonny wants me to use pathlib wherever possible for OO pathing, as well as python-box (aka Box) for dict access + +# Things to do: + --> Create the cube demo for Jonny with 4 attached materials + --> Create mapping widget for stacked layout + --> Allow export of JSON file for demo + --> Allow custom field entries for description, etc. + --> Need to figure out how to clear pointers for stored data properly +""" + +from PySide2 import QtWidgets, QtCore, QtGui +from PySide2.QtCore import Signal, Slot, QThread, QAbstractItemModel, QModelIndex, QObject +from maya import OpenMayaUI as omui +from maya.standalone import initialize +from shiboken2 import wrapInstance +import pymel.core as pm +# import sphinx +# import azpy +import json +import os +import re + + +mayaMainWindowPtr = omui.MQtUtil.mainWindow() +mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QtWidgets.QWidget) + + +class MayaToLumberyard(QtWidgets.QWidget): + def __init__(self, parent=None): + super(MayaToLumberyard, self).__init__(parent) + + self.app = QtWidgets.QApplication.instance() + self.setParent(mayaMainWindow) + self.setWindowFlags(QtCore.Qt.Window) + self.setGeometry(50, 50, 600, 500) + self.setObjectName('MaterialsToLumberyard') + self.setWindowTitle('Maya To Lumberyard') + self.isTopLevel() + self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowMinMaxButtonsHint) + + self.desktop_location = os.path.join(os.path.expanduser('~'), 'Desktop') + self.bold_font_large = QtGui.QFont('Plastique', 7, QtGui.QFont.Bold) + self.medium_font = QtGui.QFont('Plastique', 7, QtGui.QFont.Normal) + self.target_file_list = [] + self.materials_dict = {} + self.material_definitions = {} + self.processed_materials = [] + self.current_scene = pm.sceneName() + self.model = None + self.total_transfer_materials = 1 + + self.main_container = QtWidgets.QVBoxLayout(self) + self.main_container.setAlignment(QtCore.Qt.AlignTop) + self.setLayout(self.main_container) + + # Header Bar ------> + self.header_bar_layout = QtWidgets.QHBoxLayout() + self.select_files_button = QtWidgets.QPushButton('Select Files') + self.select_files_button.clicked.connect(self.choose_files_clicked) + self.select_files_button.setFixedSize(80, 35) + self.header_bar_layout.addWidget(self.select_files_button) + self.header_bar_layout.addSpacing(15) + self.use_current_file_checkbox = QtWidgets.QCheckBox('Use Current File') + self.use_current_file_checkbox.setFont(self.bold_font_large) + self.use_current_file_checkbox.clicked.connect(self.use_current_file_clicked) + self.header_bar_layout.addWidget(self.use_current_file_checkbox) + self.header_bar_layout.addSpacing(100) + self.switch_layout_combobox = QtWidgets.QComboBox() + self.switch_layout_combobox.setEnabled(False) + self.switch_layout_combobox.setFixedSize(250, 30) + self.combobox_items = ['Target Files', 'Extracted Values', 'Material Tree'] + self.switch_layout_combobox.setStyleSheet('QComboBox {padding-left:6px;}') + self.switch_layout_combobox.addItems(self.combobox_items) + self.header_bar_layout.addWidget(self.switch_layout_combobox) + self.header_bar_layout.addSpacing(4) + self.main_container.addSpacing(5) + self.main_container.addLayout(self.header_bar_layout) + + # Separation Line ------> + self.separatorLayout1 = QtWidgets.QHBoxLayout() + self.line1 = QtWidgets.QLabel() + self.line1.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + self.line1.setLineWidth(1) + self.line1.setFixedHeight(10) + self.separatorLayout1.addWidget(self.line1) + self.main_container.addLayout(self.separatorLayout1) + + # ++++++++++++++++++++++++++++++++++++++++++++++++# + # File Source Table / Attributes (Stacked Layout) # + # ++++++++++++++++++++++++++++++++++++++++++++++++# + self.content_stacked_layout = QtWidgets.QStackedLayout() + self.main_container.addLayout(self.content_stacked_layout) + self.switch_layout_combobox.currentIndexChanged.connect(self.layout_combobox_changed) + + # --- Files Table + self.target_files_table = QtWidgets.QTableWidget() + self.target_files_table.setFocusPolicy(QtCore.Qt.NoFocus) + self.target_files_table.setColumnCount(2) + self.target_files_table.setAlternatingRowColors(True) + self.target_files_table.setHorizontalHeaderLabels(['File List', '']) + self.target_files_table.horizontalHeader().setStyleSheet('QHeaderView::section {padding-top:9px; padding-left:10px;}') + self.target_files_table.verticalHeader().hide() + files_header = self.target_files_table.horizontalHeader() + files_header.setFixedHeight(30) + files_header.setDefaultAlignment(QtCore.Qt.AlignLeft) + files_header.setContentsMargins(10, 10, 0, 0) + files_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + files_header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) + self.target_files_table.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.content_stacked_layout.addWidget(self.target_files_table) + + # --- Scene Information Table + self.material_tree_view = QtWidgets.QTreeView() + self.headers = ['Key', 'Value'] + self.material_tree_view.setStyleSheet('QTreeView::item {height:25px;} QHeaderView::section {height:30px; padding-left:10px}') + + self.material_tree_view.setFocusPolicy(QtCore.Qt.NoFocus) + self.material_tree_view.setAlternatingRowColors(True) + self.material_tree_view.setUniformRowHeights(True) + self.content_stacked_layout.addWidget(self.material_tree_view) + + # --- LY Material Definitions + self.material_definitions_widget = QtWidgets.QWidget() + self.material_definitions_layout = QtWidgets.QHBoxLayout(self.material_definitions_widget) + self.material_definitions_layout.setSpacing(0) + self.material_definitions_layout.setContentsMargins(0, 0, 0, 0) + self.material_definitions_frame = QtWidgets.QFrame(self.material_definitions_widget) + self.material_definitions_frame.setGeometry(0, 0, 5000, 5000) + self.material_definitions_frame.setStyleSheet('background-color:rgb(150,150,150);') + + self.title_bar_widget = QtWidgets.QWidget() + self.title_bar_layout = QtWidgets.QHBoxLayout(self.title_bar_widget) + self.title_bar_layout.setContentsMargins(17, 17, 17, 0) + self.title_bar_layout.setAlignment(QtCore.Qt.AlignTop) + self.title_bar_frame = QtWidgets.QFrame(self.title_bar_widget) + self.title_bar_frame.setGeometry(0, 0, 5000, 60) + self.title_bar_frame.setStyleSheet('background-color:rgb(102,69,153);') + self.material_definitions_layout.addWidget(self.title_bar_widget) + + self.material_name = QtWidgets.QCheckBox('StingrayPBS2') + self.material_name.setStyleSheet('spacing:10px; color:white') + self.material_name.setFont(self.bold_font_large) + self.material_name.setChecked(True) + self.title_bar_layout.addWidget(self.material_name) + + # Forward/Back Buttons -------------------------->> + self.previous_next_button_layout = QtWidgets.QHBoxLayout() + self.item_count = QtWidgets.QLabel('1 of 10') + self.previous_next_button_layout.addWidget(self.item_count) + self.previous_next_button_layout.addSpacing(10) + self.previous_next_button_layout.setContentsMargins(0, 0, 0, 0) + self.previous_next_button_layout.setAlignment(QtCore.Qt.AlignRight) + self.previous_button = QtWidgets.QToolButton() + self.previous_button.setArrowType(QtCore.Qt.LeftArrow) + self.previous_button.setStyleSheet('background-color:rgb(110,110,110);') + self.previous_button.clicked.connect(self.previous_button_clicked) + self.previous_next_button_layout.addWidget(self.previous_button) + self.next_button = QtWidgets.QToolButton() + self.next_button.setArrowType(QtCore.Qt.RightArrow) + self.next_button.setStyleSheet('background-color:rgb(110,110,110);') + self.next_button.clicked.connect(self.next_button_clicked) + self.previous_next_button_layout.addWidget(self.next_button) + self.title_bar_layout.addLayout(self.previous_next_button_layout) + self.content_stacked_layout.addWidget(self.material_definitions_widget) + + # File processing buttons ------> + self.process_files_layout = QtWidgets.QHBoxLayout() + self.main_container.addLayout(self.process_files_layout) + self.process_files_button = QtWidgets.QPushButton('Process Listed Files') + self.process_files_button.setFixedHeight(50) + self.process_files_button.clicked.connect(self.process_files_clicked) + self.process_files_layout.addWidget(self.process_files_button) + self.reset_button = QtWidgets.QPushButton('Reset') + self.reset_button.setFixedSize(50, 50) + self.reset_button.clicked.connect(self.reset_clicked) + self.reset_button.setEnabled(False) + self.process_files_layout.addWidget(self.reset_button) + self.initialize_window() + + def initialize_window(self): + if self.current_scene: + self.target_file_list = [self.current_scene] + self.use_current_file_checkbox.setChecked(True) + self.populate_files_table() + + def populate_files_table(self): + self.target_files_table.setRowCount(0) + for index, entry in enumerate(self.target_file_list): + entry = entry[1] if type(entry) == list else entry + self.target_files_table.insertRow(index) + item = QtWidgets.QTableWidgetItem(' {}'.format(entry)) + self.target_files_table.setRowHeight(index, 45) + remove_button = QtWidgets.QPushButton(' Remove ') + remove_button.setStyleSheet('border-width:0px; background-color:rgb(100,100,100);') + remove_button.clicked.connect(self.remove_file_clicked) + self.target_files_table.setItem(index, 0, item) + self.target_files_table.setCellWidget(index, 1, remove_button) + + def process_file_list(self): + file_processing_errors = [] + for maya_file_location in self.target_file_list: + try: + if maya_file_location != self.current_scene: + pm.openFile(maya_file_location, force=True) + self.current_scene = maya_file_location + self.get_scene_materials_description() + except Exception as e: + file_processing_errors.append([maya_file_location, e]) + + # Create Model with extracted values from file list + self.set_material_model() + + # Setup Lumberyard Material File Values + self.map_materials() + print ('MaterialDefinitions:'.format(self.material_definitions)) + print json.dumps(self.material_definitions, sort_keys=True, indent=4) + + # Update UI Layout + self.set_material_view() + self.switch_layout_combobox.setCurrentIndex(2) + self.set_ui_buttons() + + def map_materials(self): + root = self.model.rootItem + for row in range(self.model.rowCount()): + name = self.model.get_attribute_value('MaterialName', root.child(row)) + material_type = self.model.get_attribute_value('MaterialType', root.child(row)) + file_connections = {} + shader_attributes = {} + + for childIndex in range(root.child(row).childCount()): + child_item = root.child(row).child(childIndex) + child_value = child_item.itemData + if child_item.childCount(): + target_dict = file_connections if child_value[0] == 'FileConnections' else shader_attributes + for subChildIndex in range(child_item.childCount()): + sub_child_data = child_item.child(subChildIndex).itemData + target_dict[sub_child_data[0]] = sub_child_data[1] + self.set_pbr_material_description(name, material_type, file_connections) + + def reset_all_values(self): + pass + # Need to figure out how to clear pointers for stored data properly + # self.target_files_table.setRowCount(0) + # self.model.beginResetModel() + # self.model.qDeleteAll(mResults) + # self.model.endResetModel() + # self.initialize_window() + + ############################ + # Getters/Setters ########## + ############################ + + @staticmethod + def get_materials(target_mesh): + shading_group = pm.listConnections(pm.PyNode(target_mesh), type='shadingEngine') + materials = pm.ls(pm.listConnections(shading_group), materials=1) + return list(set(materials)) + + @staticmethod + def get_shader(material_name): + connections = pm.listConnections(material_name, type='shadingEngine')[0] + shader_name = '{}.surfaceShader'.format(connections) + shader = pm.listConnections(shader_name)[0] + return shader + + @staticmethod + def get_shader_information(shader): + shader_file_connections = {} + for node in pm.listConnections(shader, type='file', c=True): + shader_file_connections[str(node[0])] = str(pm.getAttr(node[1].fileTextureName)) + shader_attributes = {} + for shader_attribute in pm.listAttr(shader, s=True, iu=True): + try: + shader_attributes[str(shader_attribute)] = pm.getAttr('{}.{}'.format(shader, shader_attribute)) + except pm.MayaAttributeError as e: + print ('MayaAttributeError: {}'.format(e)) + + return shader_file_connections, shader_attributes + + @staticmethod + def get_shader_properties(name, material_type, file_connections): + """ This system will probably need rethinking if DCCs and compatible materials grow """ + attr_list = {} + if material_type == 'StingrayPBS': + naming_exceptions = {'color': 'baseColor', 'ao': 'ambientOcclusion'} + maps = 'color, metallic, roughness, normal, emissive, ao, opacity'.split(', ') + for m in maps: + texture_attribute = 'TEX_{}_map'.format(m) + for tex in file_connections.keys(): + if tex.find(texture_attribute) != -1: + key = m if m not in naming_exceptions else naming_exceptions.get(m) + attr_list[key] = {'useTexture': 'true', + 'textureMap': file_connections.get('{}.{}'.format(name, texture_attribute))} + return attr_list + + @staticmethod + def get_increment(name): + last_number = re.compile(r'(?:[^\d]*(\d+)[^\d]*)+') + number_found = last_number.search(name) + if number_found: + next_number = str(int(number_found.group(1)) + 1) + start, end = number_found.span(1) + name = name[:max(end - len(next_number), start)] + next_number + name[end:] + return name + + @staticmethod + def get_material_template(shader_type): + definitions = os.path.join(os.path.dirname(os.path.abspath(__file__)), '{}.material'.format(shader_type)) + if os.path.exists(definitions): + with open(definitions) as f: + return json.load(f) + + def get_scene_materials_description(self): + scene_geo = pm.ls(v=True, geometry=True) + for target_mesh in scene_geo: + material_list = self.get_materials(target_mesh) + for material_name in material_list: + material_type = pm.nodeType(material_name, api=True) + material_listed = [x for x in self.materials_dict if self.materials_dict[x]['MaterialName'] == material_name] + + if not material_listed: + self.set_material_dict(str(material_name), str(material_type), target_mesh) + else: + mesh_list = self.materials_dict[material_name].get('AppliedMesh') + if not isinstance(mesh_list, list): + self.materials_dict[material_name]['AppliedMesh'] = [mesh_list, target_mesh] + else: + mesh_list.append(target_mesh) + + def set_material_dict(self, material_name, material_type, material_mesh): + shader = self.get_shader(material_name) + shader_file_connections, shader_attributes = self.get_shader_information(shader) + material_dict = {'MaterialName': material_name, 'MaterialType': material_type, 'AppliedMesh': material_mesh, + 'FileConnections': shader_file_connections, 'SceneName': str(self.current_scene), + 'MaterialAttributes': shader_attributes} + material_name = 'Material_{}'.format(self.total_transfer_materials) + self.materials_dict[material_name] = material_dict + self.total_transfer_materials += 1 + + def set_material_model(self): + self.model = MaterialsModel(self.headers, self.materials_dict) + + def set_material_view(self): + self.material_tree_view.setModel(self.model) + self.material_tree_view.expandAll() + self.material_tree_view.resizeColumnToContents(0) + + def set_pbr_material_description(self, name, material_type, file_connections): + # Build dictionary for material description based on extracted values + default_settings = self.get_material_template('standardpbr.template') + material = {'description': name, + 'materialType': default_settings.get('materialType'), + 'parentMaterial': default_settings.get('parentMaterial'), + 'propertyLayoutVersion': default_settings.get('propertyLayoutVersion'), + 'properties': self.get_shader_properties(name, material_type, file_connections)} + self.material_definitions[name if name not in self.material_definitions.keys() else self.get_increment(name)] = material + + def set_ui_buttons(self): + display_index = self.content_stacked_layout.currentIndex() + self.switch_layout_combobox.setEnabled(True) + # Target Files + if display_index == 0: + self.use_current_file_checkbox.setEnabled(True) + self.select_files_button.setEnabled(True) + self.reset_button.setEnabled(True) + self.process_files_button.setText('Process Listed Files') + + # Extracted Values + elif display_index == 1: + self.reset_button.setEnabled(True) + self.process_files_button.setEnabled(False) + self.use_current_file_checkbox.setEnabled(False) + self.select_files_button.setEnabled(False) + + # Material Tree + else: + self.use_current_file_checkbox.setEnabled(False) + self.select_files_button.setEnabled(False) + self.process_files_button.setText('Export Selected Materials') + if self.material_definitions: + self.process_files_button.setEnabled(True) + + ############################ + # Button Actions ########### + ############################ + + def use_current_file_clicked(self): + self.current_scene = pm.sceneName() + if self.use_current_file_checkbox.isChecked(): + self.target_file_list.insert(0, self.current_scene) + self.target_file_list = list(set(self.target_file_list)) + else: + if self.current_scene in self.target_file_list: + del self.target_file_list[self.target_file_list.index(self.current_scene)] + self.populate_files_table() + + def remove_file_clicked(self): + file_index = self.target_files_table.indexAt(self.sender().pos()) + target_file = self.target_file_list[file_index.row()] + if target_file == pm.sceneName(): + self.use_current_file_checkbox.setChecked(False) + del self.target_file_list[file_index.row()] + self.populate_files_table() + + def process_files_clicked(self): + self.process_file_list() + + def choose_files_clicked(self): + dialog = QtWidgets.QFileDialog(self, 'Shift-Select Target Files', self.desktop_location) + dialog.setFileMode(QtWidgets.QFileDialog.ExistingFile) + dialog.setNameFilter('Maya Files (*.ma *.mb *.fbx)') + dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True) + file_view = dialog.findChild(QtWidgets.QListView, 'listView') + + # Workaround for selecting multiple files with File Dialog + if file_view: + file_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + f_tree_view = dialog.findChild(QtWidgets.QTreeView) + if f_tree_view: + f_tree_view.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + + if dialog.exec_() == QtWidgets.QDialog.Accepted: + self.target_file_list = dialog.selectedFiles() + if self.target_file_list: + self.populate_files_table() + self.process_files_button.setEnabled(True) + + def layout_combobox_changed(self): + self.content_stacked_layout.setCurrentIndex(self.switch_layout_combobox.currentIndex()) + self.set_ui_buttons() + + def reset_clicked(self): + self.reset_all_values() + + def previous_button_clicked(self): + print ('Previous button clicked') + + def next_button_clicked(self): + print ('Next button clicked') + + +class MaterialsModel(QAbstractItemModel): + def __init__(self, headers, data, parent=None): + super(MaterialsModel, self).__init__(parent) + + self.rootItem = TreeNode(headers) + self.parents = [self.rootItem] + self.indentations = [0] + self.create_data(data) + + def create_data(self, data, indent=-1): + if type(data) == dict: + indent += 1 + position = 4 * indent + for key, value in data.iteritems(): + if position > self.indentations[-1]: + if self.parents[-1].childCount() > 0: + self.parents.append(self.parents[-1].child(self.parents[-1].childCount() - 1)) + self.indentations.append(position) + else: + while position < self.indentations[-1] and len(self.parents) > 0: + self.parents.pop() + self.indentations.pop() + parent = self.parents[-1] + parent.insertChildren(parent.childCount(), 1, parent.columnCount()) + parent.child(parent.childCount() - 1).setData(0, key) + value_string = str(value) if type(value) != dict else str('') + parent.child(parent.childCount() - 1).setData(1, value_string) + try: + self.create_data(value, indent) + except RuntimeError: + pass + + @staticmethod + def get_attribute_value(search_string, search_column): + for childIndex in range(search_column.childCount()): + child_item = search_column.child(childIndex) + child_value = child_item.itemData + if child_value[0] == search_string: + return child_value[1] + return None + + def index(self, row, column, index=QModelIndex()): + """ Returns the index of the item in the model specified by the given row, column and parent index """ + if not self.hasIndex(row, column, index): + return QModelIndex() + if not index.isValid(): + item = self.rootItem + else: + item = index.internalPointer() + + child = item.child(row) + if child: + return self.createIndex(row, column, child) + return QModelIndex() + + def parent(self, index): + """ + Returns the parent of the model item with the given index If the item has no parent, + an invalid QModelIndex is returned + """ + if not index.isValid(): + return QModelIndex() + item = index.internalPointer() + if not item: + return QModelIndex() + + parent = item.parentItem + if parent == self.rootItem: + return QModelIndex() + else: + return self.createIndex(parent.childNumber(), 0, parent) + + def rowCount(self, index=QModelIndex()): + """ + Returns the number of rows under the given parent. When the parent is valid it means that + rowCount is returning the number of children of parent + """ + if index.isValid(): + parent = index.internalPointer() + else: + parent = self.rootItem + return parent.childCount() + + def columnCount(self, index=QModelIndex()): + """ Returns the number of columns for the children of the given parent """ + return self.rootItem.columnCount() + + def data(self, index, role=QtCore.Qt.DisplayRole): + """ Returns the data stored under the given role for the item referred to by the index """ + if index.isValid() and role == QtCore.Qt.DisplayRole: + return index.internalPointer().data(index.column()) + elif not index.isValid(): + return self.rootItem.data(index.column()) + + def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole): + """ Returns the data for the given role and section in the header with the specified orientation """ + if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: + return self.rootItem.data(section) + + +class TreeNode(object): + def __init__(self, data, parent=None): + self.parentItem = parent + self.itemData = data + self.children = [] + + def child(self, row): + return self.children[row] + + def childCount(self): + return len(self.children) + + def childNumber(self): + if self.parentItem is not None: + return self.parentItem.children.index(self) + + def columnCount(self): + return len(self.itemData) + + def data(self, column): + return self.itemData[column] + + def insertChildren(self, position, count, columns): + if position < 0 or position > len(self.children): + return False + for row in range(count): + data = [v for v in range(columns)] + item = TreeNode(data, self) + self.children.insert(position, item) + + def parent(self): + return self.parentItem + + def setData(self, column, value): + if column < 0 or column >= len(self.itemData): + return False + self.itemData[column] = value + + +def delete_instances(): + for obj in mayaMainWindow.children(): + if str(type(obj)) == "": + if obj.__class__.__name__ == "MayaToLumberyard": + obj.setParent(None) + obj.deleteLater() + + +def show_ui(): + delete_instances() + ui = MayaToLumberyard(mayaMainWindow) + ui.show() + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/minspect.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/minspect.py new file mode 100644 index 0000000000..000b974d1a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/minspect.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +import pymel.core as pmc +import sys +import types + + +def syspath(): + print 'sys.path:' + for p in sys.path: + print ' ' + p + + +def info(obj): + """Prints information about the object.""" + + lines = ['Info for %s' % obj.name(), + 'Attributes:'] + # Get the name of all attributes + for a in obj.listAttr(): + lines.append(' ' + a.name()) + lines.append('MEL type: %s' % obj.type()) + lines.append('MRO:') + lines.extend([' ' + t.__name__ for t in type(obj).__mro__]) + result = '\n'.join(lines) + print result + + +def _is_pymel(obj): + try: # (1) + module = obj.__module__ # (2) + except AttributeError: # (3) + try: + module = obj.__name__ # (4) + except AttributeError: + return None # (5) + return module.startswith('pymel') # (6) + + +def _py_to_helpstr(obj): + if isinstance(obj, basestring): + return 'search.html?q=%s' % (obj.replace(' ', '+')) + if not _is_pymel(obj): + return None + if isinstance(obj, types.ModuleType): + return ('generated/%(module)s.html#module-%(module)s' % + dict(module=obj.__name__)) + if isinstance(obj, types.MethodType): + return ('generated/classes/%(module)s/' + '%(module)s.%(typename)s.html' + '#%(module)s.%(typename)s.%(methname)s' % dict( + module=obj.__module__, + typename=obj.im_class.__name__, + methname=obj.__name__)) + if isinstance(obj, types.FunctionType): + return ('generated/functions/%(module)s/' + '%(module)s.%(funcname)s.html' + '#%(module)s.%(funcname)s' % dict( + module=obj.__module__, + funcname=obj.__name__)) + if not isinstance(obj, type): + obj = type(obj) + return ('generated/classes/%(module)s/' + '%(module)s.%(typename)s.html' + '#%(module)s.%(typename)s' % dict( + module=obj.__module__, + typename=obj.__name__)) + + +def test_py_to_helpstr(): + def dotest(obj, ideal): + result = _py_to_helpstr(obj) + assert result == ideal, '%s != %s' % (result, ideal) + dotest('maya rocks', 'search.html?q=maya+rocks') + dotest(pmc.nodetypes, + 'generated/pymel.core.nodetypes.html' + '#module-pymel.core.nodetypes') + dotest(pmc.nodetypes.Joint, + 'generated/classes/pymel.core.nodetypes/' + 'pymel.core.nodetypes.Joint.html' + '#pymel.core.nodetypes.Joint') + dotest(pmc.nodetypes.Joint(), + 'generated/classes/pymel.core.nodetypes/' + 'pymel.core.nodetypes.Joint.html' + '#pymel.core.nodetypes.Joint') + dotest(pmc.nodetypes.Joint().getTranslation, + 'generated/classes/pymel.core.nodetypes/' + 'pymel.core.nodetypes.Joint.html' + '#pymel.core.nodetypes.Joint.getTranslation') + dotest(pmc.joint, + 'generated/functions/pymel.core.animation/' + 'pymel.core.animation.joint.html' + '#pymel.core.animation.joint') + dotest(object(), None) + dotest(10, None) + dotest([], None) + dotest(sys, None) + + +def test_py_to_helpstrFAIL(): + assert 1 == 2, '1 != 2' + + +import webbrowser # (1) +HELP_ROOT_URL = ('http://help.autodesk.com/cloudhelp/2018/ENU/Maya-Tech-Docs/PyMel/')# (2) + + +def pmhelp(obj): # (3) + """Gives help for a pymel or python object. + + If obj is not a PyMEL object, use Python's built-in + `help` function. + If obj is a string, open a web browser to a search in the + PyMEL help for the string. + Otherwise, open a web browser to the page for the object. + """ + tail = _py_to_helpstr(obj) + if tail is None: + help(obj) # (4) + else: + webbrowser.open(HELP_ROOT_URL + tail) # (5) + + +if __name__ == '__main__': + test_py_to_helpstr() + print 'Tests ran successfully.' diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/standardpbr.template.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/standardpbr.template.material new file mode 100644 index 0000000000..4bf22b8762 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/standardpbr.template.material @@ -0,0 +1,55 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "ambientOcclusion": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "baseColor": { + "color": [ 1.0, 1.0, 1.0 ], + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "emissive": { + "color": [ 1.0, 1.0, 1.0 ], + "intensity": 1.0, + "useTexture": false, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "metallic": { + "factor": 0.0, + "useTexture": false, + "textureMap": "" + }, + "roughness": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif" + }, + "opacity": { + "doubleSided": false, + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": false, + "textureMap": "" + } + } +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_shelf.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_shelf.py new file mode 100644 index 0000000000..37eb43a370 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_shelf.py @@ -0,0 +1,133 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +""" +Module Documentation: + DccScriptingInterface:: SDK//maya//scripts//set_shelf.py + +This module manages a custom shelf in maya for the DCCsi +Reference: https://gist.github.com/vshotarov/1c3176fe9e38dcaadd1e56c2f15c95d9 +""" +# ------------------------------------------------------------------------- +# -- Standard Python modules +# none + +# -- External Python modules +# none + +# -- DCCsi Extension Modules +# none + +# -- Maya Extension Modules +import maya.cmds as mc +# ------------------------------------------------------------------------- + +def _null(*args): + pass + +# ------------------------------------------------------------------------- +class customShelf(_Custom_Shelf): + '''This is an example shelf.''' + + def build(self): + self.add_button(label="button1") + self.add_button("button2") + self.add_button("popup") + p = mc.popupMenu(b=1) + self.add_menu_item(p, "popupMenuItem1") + self.add_menu_item(p, "popupMenuItem2") + sub = self.add_submenu(p, "subMenuLevel1") + self.add_menu_item(sub, "subMenuLevel1Item1") + sub2 = self.add_submenu(sub, "subMenuLevel2") + self.add_menu_item(sub2, "subMenuLevel2Item1") + self.add_menu_item(sub2, "subMenuLevel2Item2") + self.add_menu_item(sub, "subMenuLevel1Item2") + self.add_menu_item(p, "popupMenuItem3") + self.add_button("button3") +# ------------------------------------------------------------------------- + + + +class _Custom_Shelf(): + '''A simple class to build custom shelves in maya. + The build method is empty and an inheriting class should override''' + + def __init__(self, name="DCCsi", icon_path=""): + self._name = name + + self._icon_path = icon_path + + self._label_background_color = (0, 0, 0, 0) + self._label_colour = (.9, .9, .9) + + self._clean_old_shlef() + + mc.setParent(self._name) + + self.build() + + def build(self): + '''Override this method in custom class. + Otherwise, nothing is added to the shelf.''' + pass + + def add_button(self, + label='', + icon="commandButton.png", + command=_null, + doubleCommand=_null): + '''Adds a shelf button with the specified label, + command, double click command and image.''' + mc.setParent(self._name) + if icon: + icon = self._icon_path + icon + mc.shelfButton(width=37, height=37, + image=icon, + label=label, + command=command, + doubleClickCommand=doubleCommand, + imageOverlayLabel=label, + overlayLabelBackColor=self._label_background_color, + overlayLabelColor=self._label_colour) + + def add_menu_item(self, parent, label, command=_null, icon=""): + '''Adds a shelf button with the specified label, + command, double click command and image.''' + if icon: + icon = self._icon_path + icon + return mc.menuItem(p=parent, l=label, c=command, i="") + + def add_submenu(self, parent, label, icon=None): + '''Adds a sub menu item with the specified label and icon + to the specified parent popup menu.''' + if icon: + icon = self._icon_path + icon + return mc.menuItem(p=parent, l=label, i=icon, subMenu=1) + + def _clean_old_shlef(self): + '''Checks if the shelf exists and empties it if it does or + creates it if it does not.''' + if mc.shelfLayout(self._name, ex=1): + if mc.shelfLayout(self._name, q=1, ca=1): + for each in mc.shelfLayout(self._name, q=1, ca=1): + mc.deleteUI(each) + else: + mc.shelfLayout(self._name, p="ShelfLayout") + + +# ========================================================================== +# Module Tests +# ========================================================================== +if __name__ == '__main__': + customShelf() + pass diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/setupPaths.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/setupPaths.py new file mode 100644 index 0000000000..d3decbca05 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/setupPaths.py @@ -0,0 +1,16 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/userSetup.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/userSetup.py index 4602b1413c..809cb97494 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/userSetup.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/userSetup.py @@ -46,6 +46,9 @@ import logging as _logging import azpy from azpy.constants import * from azpy.env_base import _BASE_ENVVAR_DICT +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE # -- maya imports import maya.cmds as cmds @@ -55,10 +58,6 @@ import maya.mel as mel # ------------------------------------------------------------------------- -from azpy import env_bool -from azpy.constants import ENVAR_DCCSI_GDEBUG -from azpy.constants import ENVAR_DCCSI_DEV_MODE - # global space _G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) _DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/readme.txt new file mode 100644 index 0000000000..576022a495 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/readme.txt @@ -0,0 +1,80 @@ +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +------------------------------------------------------------------------------- + +"DccScriptingInterface" aka DCCsi is a Gem for O3DE to extend and interface with dcc tools +in the python ecosystem. Each dcc tool may have it's own specific version of python. +Most are some version of py3+. O3DE provides an install of py3+ and manages package +dependancies with requirements.txt files and the cmake build system. + +However Autodesk Maya still uses a version of py2.7 and so we need an alternate way +to deal with package management for this DCC tool. + +Maya ships with it's own python interpreter called mayapy.exe + +Generally it is located here: +C:\Program Files\Autodesk\Maya2020\bin\mayapy.exe + +The python install and site-packages are here: +C:\Program Files\Autodesk\Maya2020\Python\Lib\site-packages + +A general goal of the DCCsi is be self-maintained, and to not taint the users installed applications of environment. + +So we boostrap additional access to site-packages in our userSetup.py: +"C:\Depot\Lumberyard\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\SDK\Maya\Scripts\userSetup.py" + +We don't want users to have to install or use Python2.7 although with maya and possibly other dcc tools we don't have that control. Maya still is on Python2.7, so instead of forcing another install of python we can just use mayapy to manage extensions. + +Pip may already be installed, you can check like so (your maya install path may be different): + +C:\Program Files\Autodesk\Maya2020\bin>mayapy -m pip --version + +If pip is not available yet for your mayapy. + +First find out where th site-packages is located + +C:\Program Files\Autodesk\Maya2020\bin>mayapy -m site +sys.path = [ + 'C:\\Program Files\\Autodesk\\Maya2020\\bin', + 'C:\\Program Files\\Autodesk\\Maya2020\\bin\\python27.zip', + 'C:\\Program Files\\Autodesk\\Maya2020\\Python\\DLLs', + 'C:\\Program Files\\Autodesk\\Maya2020\\Python\\lib', + 'C:\\Program Files\\Autodesk\\Maya2020\\Python\\lib\\plat-win', + 'C:\\Program Files\\Autodesk\\Maya2020\\Python\\lib\\lib-tk', + 'C:\\Program Files\\Autodesk\\Maya2020\\Python', + 'C:\\Program Files\\Autodesk\\Maya2020\\Python\\lib\\site-packages', +] +USER_BASE: 'C:\\Users\\gallowj\\AppData\\Roaming\\Python' (exists) +USER_SITE: 'C:\\Users\\gallowj\\AppData\\Roaming\\Python\\Python27\\site-packages' (doesn't exist) +ENABLE_USER_SITE: True + +This is the location we are looking for: +C:\\Program Files\\Autodesk\\Maya2020\\Python\\lib\\site-packages + +download get-pip.py and put into the above ^ directory: +https://bootstrap.pypa.io/pip/2.7/get-pip.py + +Put that in the root of site-packages: +C:\\Program Files\\Autodesk\\Maya2020\\Python\\lib\\site-packages\\get-pip.py + +With get-pip module ready, we run it to install pip: +C:\Program Files\Autodesk\Maya2020\bin>mayapy -m get-pip + +Now you should be able to run the following command and verify pip: +C:\Program Files\Autodesk\Maya2020\bin>mayapy -m pip --version +pip 20.3.4 from C:\Users\< you >\AppData\Roaming\Python\Python27\site-packages\pip (python 2.7) + +Now your local maya install is all set up with pip so you can install additional python packages to use in maya. (note: not all packages are compatible with maya) + +Now you will want to run the following file to finish setup... +We have a requirements.txt file with the extension packages we use in the DCCsi. +You'll need the repo/branch path of your Lumberyard(O3DE) install. +And you'll need to know where the DCCsi, we will install package dependancies there. + +C:\Program Files\Autodesk\Maya2020\bin>mayapy -m pip install -r C:\Depot\Lumberyard\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\SDK\Maya\requirements.txt -t C:\Depot\Lumberyard\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\3rdParty\Python\Lib\2.x\2.7.x\site-packages \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/requirements.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/requirements.txt new file mode 100644 index 0000000000..b3c5068124 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/requirements.txt @@ -0,0 +1,33 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile --generate-hashes requirements.txt +# +typing==3.7.4.3 \ + --hash=sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9 \ + --hash=sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5 + # via + # -r requirements.txt + # dynaconf +click==7.1.2 \ + --hash=sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a \ + --hash=sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc + # via + # -r requirements.txt + # pip-tools +dynaconf==3.1.4 \ + --hash=sha256:b2f472d83052f809c5925565b8a2ba76a103d5dc1dbb9748b693ed67212781b9 \ + --hash=sha256:e6f383b84150b70fc439c8b2757581a38a58d07962aa14517292dcce1a77e160 + # via -r requirements.txt +pathlib==1.0.1 \ + --hash=sha256:6940718dfc3eff4258203ad5021090933e5c04707d5ca8cc9e73c94a7894ea9f + # via -r requirements.txt +python-box==3.4.6 \ + --hash=sha256:694a7555e3ff9fbbce734bbaef3aad92b8e4ed0659d3ed04d56b6a0a0eff26a9 \ + --hash=sha256:a71d3dc9dbaa34c8597d3517c89a8041bd62fa875f23c0f3dad55e1958e3ce10 + # via -r requirements.txt +unipath==1.1 \ + --hash=sha256:09839adcc72e8a24d4f76d63656f30b5a1f721fc40c9bcd79d8c67bdd8b47dae \ + --hash=sha256:e6257e508d8abbfb6ddd8ec357e33589f1f48b1599127f23b017124d90b0fff7 + # via -r requirements.txt \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Python/Tests/OpenImageIO/test_oiio.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Python/Tests/OpenImageIO/test_oiio.py index 1f843719be..7a5361a28e 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Python/Tests/OpenImageIO/test_oiio.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Python/Tests/OpenImageIO/test_oiio.py @@ -40,7 +40,7 @@ def convert(src): def get_image_spec(target_image): spec = target_image.spec() info = {'resolution': (spec.width, spec.height, spec.x, spec.y), 'channels': spec.channelnames, - 'format': str(spec.format)} + 'format': str(spec.format)} if spec.channelformats : info['channelformats'] = str(spec.channelformats) info['alpha channel'] = str(spec.alpha_channel) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Python/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Python/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/launcher.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/launcher.bat new file mode 100644 index 0000000000..b587dbb153 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/launcher.bat @@ -0,0 +1,88 @@ +@echo off + +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +:: Set up and run LY Python CMD prompt +:: Sets up the DccScriptingInterface_Env, +:: Puts you in the CMD within the dev environment + +:: Set up window +TITLE Lumberyard DCC Scripting Interface Cmd +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +%~d0 +cd %~dp0 + +:: Keep changes local +SETLOCAL enableDelayedExpansion + +:: This maps up to the \Dev folder +IF "%DEV_REL_PATH%"=="" (set DEV_REL_PATH=..\..\..\..\..\..\..) + +:: Change to root Lumberyard dev dir +:: Don't use the LY_DEV so we can test that ENVAR!!! +CD /d %DEV_REL_PATH% +set Rel_Dev=%CD% +echo Rel_Dev = %Rel_Dev% +:: Restore original directory +popd + +set DCCSI_PYTHON_INSTALL=%Rel_Dev%\Tools\Python\3.7.5\windows + +:: add to the PATH +SET PATH=%DCCSI_PYTHON_INSTALL%;%PATH% + +:: dcc scripting interface gem path +set DCCSIG_PATH=%Rel_Dev%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface +echo DCCSIG_PATH = %DCCSIG_PATH% + +:: add to the PATH +SET PATH=%DCCSIG_PATH%;%PATH% + +:: Constant Vars (Global) +:: global debug (propogates) +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates debugger connection +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% + +echo. +echo _____________________________________________________________________ +echo. +echo ~ LY DCCsi, DCC Material Converter +echo _____________________________________________________________________ +echo. + +:: Change to root dir +CD /D %DCCSIG_PATH% + +:: add to the PATH +SET PATH=%DCCSIG_PATH%;%PATH% + +set PYTHONPATH=%DCCSIG_PATH%;%PYTHONPATH% + +CALL %DCCSI_PYTHON_INSTALL%\python.exe "%DCCSIG_PATH%\SDK\PythonTools\DCC_Material_Converter\standalone.py" + + +ENDLOCAL + +:: Return to starting directory +POPD + +:END_OF_FILE + +exit /b 0 \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/main.py index 64fad9381a..e1d5d0146f 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/main.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/main.py @@ -41,24 +41,28 @@ Reading FBX file information (might come in handy later) -- I couldn't get pyfbx_i42 to work, but purportedly it can extract information from binary files. You may just have to use the specified python versions """ +# built-ins +import collections +import logging +import subprocess +import json +import sys +import os +import re +# should give access to Lumberyard Qt dlls and PySide2 from PySide2 import QtWidgets, QtCore, QtGui from PySide2.QtCore import Slot from PySide2.QtWidgets import QApplication import shiboken2 from shiboken2 import wrapInstance + +# local imports from model import MaterialsModel from drag_and_drop import DragAndDrop import dcc_material_mapping as dcc_map -import collections -import logging -import subprocess -import json -import sys -import os -import re - +# global space main_window_pointer = None main_app_window = None diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py index 02c7e75a33..10e3dda97c 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py @@ -12,10 +12,10 @@ import MaxPlus import sys - + def get_material_information(): for mesh_object in MaxPlus.Core.GetRootNode().Children: print('Object---> {}'.format(mesh_object)) - - + + get_material_information() \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/standalone.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/standalone.py new file mode 100644 index 0000000000..4034a29ab2 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/standalone.py @@ -0,0 +1,40 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +"""Boostraps and Starts Standalone DCC Material Converter utility""" + +# built in's +import os +import site + +# ------------------------------------------------------------------------- +# \dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\SDK\PythonTools\DCC_Material_Converter\standalone.py +_MODULE_PATH = os.path.abspath(__file__) + +_DCCSIG_REL_PATH = "../../../.." +_DCCSIG_PATH = os.path.join(_MODULE_PATH, _DCCSIG_REL_PATH) +_DCCSIG_PATH = os.path.normpath(_DCCSIG_PATH) + +_DCCSIG_PATH = os.getenv('DCCSIG_PATH', + os.path.abspath(_DCCSIG_PATH)) + +# we don't have access yet to the DCCsi Lib\site-packages +site.addsitedir(_DCCSIG_PATH) # PYTHONPATH + +# azpy bootstrapping and extensions +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +settings = _config.get_config_settings(setup_ly_pyside=True) + +from main import launch_material_converter + +launch_material_converter() \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/Launcher/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/Launcher/main.py new file mode 100644 index 0000000000..2d94768382 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/Launcher/main.py @@ -0,0 +1,77 @@ +# coding:utf-8 +#!/usr/bin/python +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +# built-ins +import os +import sys +import logging as _logging + +# azpy extensions +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +settings = _config.get_config_settings(setup_ly_pyside=True) + +# 3rd Party (we may or do provide) +from pathlib import Path +from pathlib import PurePath + +# Lumberyard extensions +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, settings.DCCSI_GDEBUG) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, settings.DCCSI_GDEBUG) + +for handler in _logging.root.handlers[:]: + _logging.root.removeHandler(handler) + +_MODULENAME = 'DCCsi.SDK.pythontools.launcher.main' + +_log_level = _logging.INFO +if _G_DEBUG: + _log_level = _logging.DEBUG + +_LOGGER = azpy.initialize_logger(name=_MODULENAME, + log_to_file=True, + default_log_level=_log_level) + +_LOGGER.debug('Starting up: {0}.'.format({_MODULENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def main(): + from PySide2.QtWidgets import QApplication, QPushButton + + app = QApplication(sys.argv) +# ------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + +app = QApplication([]) # Start an application. +window = QWidget() # Create a window. +layout = QVBoxLayout() # Create a layout. +button = QPushButton("I'm just a Button man") # Define a button +layout.addWidget(QLabel('Hello World!')) # Add a label +layout.addWidget(button) # Add the button man +window.setLayout(layout) # Pass the layout to the window +window.show() # Show window +app.exec_() # Execute the App \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/__init__.py new file mode 100644 index 0000000000..22068a2517 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/__init__.py @@ -0,0 +1,53 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +# The __init__.py files help guide import statements without automatically +# importing all of the modules +"""DCCsi.sdk.substance.builder.__init__""" + +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_DEV_MODE + +# global space +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = __name__ +if _PACKAGENAME is '__main__': + _PACKAGENAME = 'DCCsi.SDK.Substance.builder' + +import azpy +_LOGGER = azpy.initialize_logger(_PACKAGENAME) +_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- +# +__all__ = ['bootstrap', + 'atom_material', + 'sb_gui_main', + 'sbs_to_sbsar', + 'sbsar_info', + 'sbsar_render', + 'sbsar_utils', + 'substance_tools', + 'watchdog', + 'ui'] +# +# ------------------------------------------------------------------------- +if _DCCSI_DEV_MODE: + # If in dev mode this will test imports of __all__ + from azpy import test_imports + _LOGGER.debug('Testing Imports from {0}'.format(_PACKAGENAME)) + test_imports(__all__, + _pkg=_PACKAGENAME, + _logger=_LOGGER) +# ------------------------------------------------------------------------- +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/atom_material.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/atom_material.py new file mode 100644 index 0000000000..5f3b43f5fd --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/atom_material.py @@ -0,0 +1,199 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# -- This line is 75 characters ------------------------------------------- +"""Empty Doc String""" # To Do: add documentation +# ------------------------------------------------------------------------- +# built-ins +import os +import sys +#import simplejson as json +import json + +# Lumberyard extensions +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE +from azpy.constants import * + +# 3rdparty (we provide) +from box import Box +from pathlib import Path +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = __name__ +if _PACKAGENAME is '__main__': + _PACKAGENAME = 'DCCsi.SDK.substance.builder.atom_material' + +import azpy +_LOGGER = azpy.initialize_logger(_PACKAGENAME) +_LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# early attach WingIDE debugger (can refactor to include other IDEs later) +if _DCCSI_DEV_MODE: + from azpy.test.entry_test import connect_wing + foo = connect_wing() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# previous +class AtomPBR: + def __init__(self, material_file): + + # loading .material File + self.material_file = material_file + self.input_data = open(self.material_file, "r") + self.material = json.load(self.input_data) + self.mat_box = Box(self.material) + self.input_data.close() + + # List of texture slots + self.tex = ['baseColor', 'metallic', 'roughness', 'normalMap', 'opacity'] + + # Construct texture maps + self.basecolor_tex = "" + self.metallic_tex = "" + self.roughness_tex = "" + self.normalmap_tex = "" + self.opacity_tex = "" + + def load(self, material_file): + input_data = open(material_file, "r") + self.material = json.load(input_data) + self.mat_box = Box(self.material) + input_data.close() + + def get_map(self, tex_slot): + return self.mat_box.properties[tex_slot].parameters.textureMap + + def set_map(self, tex_slot, tex_map): + self.mat_box.properties[tex_slot].parameters.textureMap = tex_map + + def write(self, material_out): + output_data = open(material_out, "w+") + output_data.write(json.dumps(self.mat_box, indent=4)) + output_data.close() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# new? +class AtomMaterial: + def __init__(self, material_file): + # loading .material File + self.material_file = material_file + self.input_data = open(self.material_file, "r") + self.material = json.load(self.input_data) + self.mat_box = Box(self.material) + self.input_data.close() + + # List of texture slots + # old tex maps + # self.tex = ['DiffuseMap', 'NormalMap', 'SpecularMap', 'EnvironmentMap'] + self.tex = ['baseColor', 'metallic', 'roughness', 'specularF0', 'normal', 'opacity'] + + self.texture_map = {'baseColor': 'baseColor', + 'metallic': 'metallic', + 'roughness': 'roughness', + 'specularF0': 'specular', + 'normal': 'normal', + 'opacity': 'opacity' + } + + def load(self, material_file): + input_data = open(material_file, "r") + self.material = json.load(input_data) + self.mat_box = Box(self.material) + input_data.close() + + def get_material_type(self): + return self.mat_box.materialType + + # old getMap function + # def getMap(self, tex_slot): + # return self.mat_box.properties.general[tex_slot] + + def get_map(self, tex_slot): + return self.mat_box.properties[tex_slot].textureMap + + def set_map(self, tex_slot, tex_map): + self.mat_box.properties[tex_slot].textureMap = tex_map + self.mat_box.properties[tex_slot].useTexture = True + self.mat_box.properties[tex_slot].factor = 1.0 + + def write(self, material_out): + + if not material_out.parent.exists(): + try: + material_out.parent.mkdir(mode=0o777, parents=True, exist_ok=True) + _LOGGER.info('mkdir: {}'.format(material_out.parent)) + except Exception as e: + _LOGGER.error(e) + raise(e) + else: + _LOGGER.info('exists: {}'.format(material_out.parent)) + + material_out.touch() + output_data = open(str(material_out), "w+") + output_data.write(json.dumps(self.mat_box, indent=4)) + output_data.close() + return material_out +# ------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == "__main__": + """Run this file as main""" + + _LOGGER.info("Test Run:: {0}.".format({_PACKAGENAME})) + _LOGGER.info("{0} :: if __name__ == '__main__':".format(_PACKAGENAME)) + + material_path = Path(Path(__file__).parent.parent, 'resources', 'atom') + # material_01 = AtomPBR("atom_pbr.material", "awesome.material") + # material_01 = AtomPBR("atom_pbr.material") + material_01 = AtomMaterial(Path(material_path, "StandardPBR_AllProperties.material")) + # material_01.load("atom_pbr.material") + # material_01.map(material_01.tex[2]).textureMap = "materials/substance/amazing_xzzzx.tif" + # # print(material_01.metallic) + # material_01.write("awesome.material") + # print(material_01.tex[2]) + # print(material_01.getMap(material_01.tex[3])) + + # material_01.baesColor_tex = "materials/substance/amazing_bc.tif" + # material_01.setMap(material_01.tex[0], material_01.baesColor_tex) + # material_01.write("awesome.material") + + # Test material parser for the new format. + material_01.baseColor_tex = "Textures/Streaming/streaming99.dds" + material_01.metallic_tex = "Textures/Streaming/streaming99.dds" + material_01.set_map(material_01.tex[0], material_01.baseColor_tex) + material_01.set_map(material_01.tex[1], material_01.metallic_tex) + material_out = material_01.write(Path(material_path, "atom_variant00.material")) + _LOGGER.info('materialType is:: {}'.format(material_01.get_material_type())) + + if material_out.exists(): + _LOGGER.info('Wrote material file: {}'.format(material_out)) + + # remove the logger + del _LOGGER +# ---- END --------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/logs/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/logs/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sb_gui_main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sb_gui_main.py new file mode 100644 index 0000000000..9c9f9001fe --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sb_gui_main.py @@ -0,0 +1,958 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +from __future__ import unicode_literals +# from builtins import str +# -- This line is 75 characters ------------------------------------------- +# built in's +import os +import sys +import site +import logging as _logging +from collections import OrderedDict +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# normal scripts we would do the following 'from dynaconf import settings' +# for GUI apps that need PySide2 we init in the following manner instead +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +settings = _config.get_config_settings(setup_ly_pyside=True) + +from pathlib import Path +from pathlib import PurePath + +# Lumberyard extensions +#import azpy +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE + +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, settings.DCCSI_GDEBUG) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, settings.DCCSI_GDEBUG) + +for handler in _logging.root.handlers[:]: + _logging.root.removeHandler(handler) + +_MODULENAME = 'DCCsi.SDK.substance.builder.sb_gui_main' + +_log_level = _logging.INFO +if _G_DEBUG: + _log_level = _logging.DEBUG + +_LOGGER = azpy.initialize_logger(name=_MODULENAME, + log_to_file=True, + default_log_level=_log_level) + +_LOGGER.debug('Starting up: {0}.'.format({_MODULENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# early attach WingIDE debugger (can refactor to include other IDEs later) +if _DCCSI_DEV_MODE: + from azpy.test.entry_test import connect_wing + foo = connect_wing() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# now we should be cooking with gas (and can use the dnynamic settings) +# this block is really for standalone +from dynaconf import settings +import config +_LOGGER.debug('config.py is: {}'.format(config)) + +# initialize the Lumberyard Qt / PySide2 +config.init_ly_pyside(settings.LY_DEV) # for standalone +settings.setenv() # for standalone + +# log debug info about Qt/PySide2 +_LOGGER.debug('QTFORPYTHON_PATH: {}'.format(settings.QTFORPYTHON_PATH)) +_LOGGER.debug('LY_BIN_PATH: {}'.format(settings.LY_BIN_PATH)) +_LOGGER.debug('QT_PLUGIN_PATH: {}'.format(settings.QT_PLUGIN_PATH)) +_LOGGER.debug('QT_QPA_PLATFORM_PLUGIN_PATH: {}'.format(settings.QT_QPA_PLATFORM_PLUGIN_PATH)) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# Qt and Pyside2 imports block +import PySide2 +_LOGGER.debug('PySide2 is:'.format(PySide2.__file__)) + +import PySide2.QtCore +from PySide2 import QtCore, QtWidgets +# from PySide2.QtCore import QTimer +from PySide2.QtCore import QProcess, Signal, Slot, QTextCodec +from PySide2.QtGui import QTextCursor, QColor +from PySide2.QtWidgets import QApplication, QPlainTextEdit +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# substance automation toolkit (aka pysbs) +# To Do: move this into some kind of substance specific configuration +# SDK\substance should probably have it's own .env and settings.py (dynaconf) +# Note: pysbs has it's own installer and it wants to install itself directly +# into a python distribution (assumes vanilla external) +# we don't want to modify lumberyards core distribution +# and we can't ship pusbs anyway, so I used pip install --target +# and installed it into a folder within the substance local installation +# so a data driven configuration needs to allow this to be easily set +# outside of the DCCsi +from azpy.constants import PATH_SAT_INSTALL_PATH +_PYSBS_DIR_PATH = Path(PATH_SAT_INSTALL_PATH).resolve() +site.addsitedir(str(_PYSBS_DIR_PATH)) # 'install' is the folder I created + +import pysbs +import pysbs.batchtools as pysbs_batch +import pysbs.context as pysbs_context + +# local modules +import sbsar_utils +from atom_material import AtomMaterial +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# To Do: still should manage via dynaconf (dynamic config and settings) +from azpy.constants import ENVAR_LY_DEV +_LY_DEV = Path(os.getenv(ENVAR_LY_DEV, None)).resolve() + +from azpy.constants import ENVAR_LY_PROJECT +_LY_PROJECT = os.getenv(ENVAR_LY_PROJECT, None) + +from azpy.constants import ENVAR_LY_PROJECT_PATH +_LY_PROJECT_PATH = Path(os.getenv(ENVAR_LY_PROJECT_PATH, None)).resolve() + +from azpy.constants import ENVAR_DCCSI_SDK_PATH +_DCCSI_SDK_PATH = Path(os.getenv(ENVAR_DCCSI_SDK_PATH, None)).resolve() + +# build some reuseable path parts +_PROJECT_ASSET_PATH = Path(_LY_PROJECT_PATH).resolve() +_PROJECT_ASSETS_PATH = Path(_LY_PROJECT_PATH, 'Materials').resolve() + +# To Do: figure out a proper way to deal with Lumberyard game projects +_GEM_MATPLAY_PATH = Path(_LY_DEV, 'Gems', 'AtomContent', 'AtomMaterialPlayground').resolve() +_GEM_ROYALTYFREE = Path(_LY_DEV, 'Gems', 'AtomContent', 'RoyaltyFreeAssets').resolve() +_GEM_SUBSOURCELIBRARY = Path(_LY_DEV, 'Gems', 'AtomContent', 'SubstanceSourceLibrary').resolve() +_SUB_LIBRARY_PATH = Path(_GEM_SUBSOURCELIBRARY, 'Assets', 'SubstanceSource', 'Library').resolve() +# ^ This hard codes a bunch of known asset gems, again bad +# To Do: figure out a proper way to scrap the gem registry from project + +# path to watcher script +_WATCHER_SCRIPT_PATH = Path(_DCCSI_SDK_PATH, 'substance', 'builder', 'watchdog', '__init__.py').resolve() + +_TEX_RNDR_PATH = Path(_LY_PROJECT_PATH, 'Materials', 'Substance').resolve() +_MAT_OUTPUT_PATH = Path(_LY_PROJECT_PATH, 'Materials', 'Substance').resolve() +_SBSAR_COOK_PATH = Path(_LY_PROJECT_PATH, 'Materials', 'Substance').resolve() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# sys.path.insert(0, os.path.abspath('../ui/')) +# import main_win +# sys.path.insert(0, os.path.abspath('..')) +# from watchdog import * +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +class Window(QtWidgets.QDialog): + def __init__(self, parent=None, project_path=None, default_material_path=None): + super(Window, self).__init__(parent) + + # we should really init non-Qt stuff and set things up as properties + if project_path is None: + self.project_path = str(_LY_PROJECT_PATH) + else: + self.project_path = Path(project_path) + + if default_material_path is None: + self._default_material_path = Path(_DCCSIG_PATH, + 'sdk', + 'substance', + 'resources', + 'atom', + 'StandardPBR_AllProperties.material') + else: + self._default_material_path = default_material_path + + # the start building up qt specific ui, etc + # but really, much of this should be moved to a self.setup_ui() method + self.root_directory = str(_PROJECT_ASSET_PATH) + # os.chdir(self.root_directory) # change working dir path + + self.browseButton = self.create_button("&Browse...", self.browse) + self.browseButton1 = self.create_button("&Browse...", self.browse) + self.findButton = self.create_button("&Find", self.find) + self.removeButton = self.create_button("&Remove", self.remove) + self.startWatch = self.create_button("&Start Watch", self.watch) + self.killButton = self.create_button("&Stop Watch", self.kill) + self.clearlogButton = self.create_button("&Clear Log", self.clear_log) + self.atomMaterial = self.create_button("&Atom Material", self.atom_material) + + self.substance_ext_filters = ["*.sbs", "*.sbsar"] + + self.textComboBox = self.createComboBox() + # ^^ this is never added to a layout ... it's a phatom text entry that is empty + # it is never updated to add text + # but it's contents are retreived for use in self.find() + + self.atomMatNameComboBox = self.createComboBox("Setup Material name here(default:sbsar name)") + + # _texturePath = Path(self.project_path, 'Assets', 'SubstanceLibrary', 'textures').resolve() + self.texRenderPathComboBox = self.createComboBox(str(_TEX_RNDR_PATH)) + self.matOutputPathComboBox = self.createComboBox(str(_MAT_OUTPUT_PATH)) + + # self.directoryComboBox = self.createComboBox(QtCore.QDir.currentPath()) + # I changed this to scan the _LY_PROJECT + # self.sbsarDirectory = self.return_1st_sbsar(Path(self.project_path, 'Assets')).resolve().parent + self.sbsarDirectory = QtCore.QDir() + self.sbsarDirectory.setCurrent(str(_PROJECT_ASSET_PATH)) + self.sbsarDirectory.setNameFilters(self.substance_ext_filters) + + self.directoryComboBox = self.createComboBox(self.sbsarDirectory.canonicalPath()) + self.builderDirComboBox = self.createComboBox(self.sbsarDirectory.canonicalPath()) + + # I DO NOT like or want all of this ui creation here in the __init__, + # it is literally no better then a .ui file + # Rob G is wrong, except he is right if we are building with custom widgets + # but almost nothing here is custom so it's waste of lines of code + # extremely difficult to iterate on ... I feel this contributes to + # the length of time spent to stand this tool up + # textLabel = QtWidgets.QLabel("Containing text:") + self.directoryLabel = QtWidgets.QLabel("Watch directory:") + self.builderdirLabel = QtWidgets.QLabel("Watch directory:") + self.filesFoundLabel = QtWidgets.QLabel() + self.watcherLogLabel = QtWidgets.QLabel("Watcher Log") + self.fileListLabel = QtWidgets.QLabel("File List") + self.sbsarPresetLabel = QtWidgets.QLabel("Sbsar Preset:") + self.OutputResLabel = QtWidgets.QLabel("Output Size:") + self.OutputsLabel = QtWidgets.QLabel("Outputs:") + self.atomMatLabel = QtWidgets.QLabel("Material Name: ") + self.atomMatDirLabel = QtWidgets.QLabel("Material Path : ") + self.textOutputPathLabel = QtWidgets.QLabel("Texture Output:") + self.randomSeedLabel = QtWidgets.QLabel("Random Seed:") + + self.watcher_log = QPlainTextEdit() + self.watcher_log.setReadOnly(True) + # self.watcher_log.setFixedHeight(500) + self.watcher_log.setMaximumBlockCount(10000) # limit console to 10000 lines + self.watcher_log._cursor_output = self.watcher_log.textCursor() + + self.create_files_table() + buttonsLayout = QtWidgets.QHBoxLayout() + buttonsLayout.addStretch() + # buttonsLayout.addWidget(self.atomMaterial) + # buttonsLayout.addSpacing(50) + buttonsLayout.addWidget(self.findButton) + # buttonsLayout.addWidget(self.removeButton) + watcherBtnLayout = QtWidgets.QHBoxLayout() + watcherBtnLayout.addStretch() + watcherBtnLayout.addWidget(self.startWatch) + watcherBtnLayout.addWidget(self.killButton) + watcherBtnLayout.addWidget(self.clearlogButton) + + self.setObjectName("Dialog") + self.gridLayout = QtWidgets.QGridLayout(self) + self.gridLayout.setObjectName("gridLayout1_0") + self.tabLayout = QtWidgets.QTabWidget(self) + self.tabLayout.setObjectName("tabLayout") + self.tabBuilder = QtWidgets.QTabWidget() + self.tabBuilder.setObjectName("tabBuilder") + self.gridLayout1_1 = QtWidgets.QGridLayout(self.tabBuilder) + self.gridLayout1_1.setObjectName("gridLayout1_1") + self.builderLayout = QtWidgets.QGridLayout() + self.builderLayout.setObjectName("builderLayout") + +# self.extensionLabel = QtWidgets.QLabel("Watch extensions:") +# self.builderLayout.addWidget(self.extensionLabel, 0, 0, 1, 1) +# self.extFilterComboBox = self.createComboBox(str(self.substance_ext_filters)) +# self.builderLayout.addWidget(self.extFilterComboBox, 0, 1, 1, 2) + + # filename for search + self.filenameSearchLabel = QtWidgets.QLabel("Filename search:") + self.builderLayout.addWidget(self.filenameSearchLabel, 0, 0, 1, 1) + self.filenameSearchComboBox = self.createComboBox(None) + self.builderLayout.addWidget(self.filenameSearchComboBox, 0, 1, 1, 2) + + self.builderLayout.addWidget(self.builderdirLabel, 1, 0) + self.builderLayout.addWidget(self.builderDirComboBox, 1, 1, 1, 1) + self.builderLayout.addWidget(self.browseButton1, 1, 2, 1, 1) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.addWidget(self.filesTable) + self.verticalLayout.addWidget(self.filesFoundLabel) + self.builderLayout.addLayout(self.verticalLayout, 2, 0, 1, 3) + self.builderLayout.addLayout(buttonsLayout, 4, 0, 1, 3) + self.inputGroupBox = QtWidgets.QGroupBox("Input Parameters") + self.inputGridLayout = QtWidgets.QGridLayout(self.inputGroupBox) + self.inputGridLayout.addWidget(self.randomSeedLabel, 2, 0, 1, 1) + self.randomSeedComboBox = self.createComboBox("0000000000") + self.inputGridLayout.addWidget(self.randomSeedComboBox, 2, 1, 1, 2) + self.randomSeedBtn = self.create_button("&Generate", self.randomseed) + self.inputGridLayout.addWidget(self.randomSeedBtn, 2, 3, 1, 1) + self.randomSeedComboBox.setDisabled(True) + self.gridLayout1_1.addLayout(self.builderLayout, 0, 0, 1, 1) + self.tabLayout.addTab(self.tabBuilder, "Builder") + + self.tabWatcher = QtWidgets.QTabWidget() + self.tabWatcher.setObjectName("tabWatcher") + self.gridLayout2_1 = QtWidgets.QGridLayout(self.tabWatcher) + self.gridLayout2_1.setObjectName("gridLayout2_0") + self.watcherLayout = QtWidgets.QGridLayout() + self.watcherLayout.setObjectName("watcherLayout") + self.watcherLayout.addWidget(self.directoryLabel, 0, 0) + self.watcherLayout.addWidget(self.directoryComboBox, 0, 1) + self.watcherLayout.addWidget(self.browseButton, 0, 2) + self.watcherHBoxLayout = QtWidgets.QHBoxLayout() + self.watcherHBoxLayout.addWidget(self.watcher_log) + self.watcherLayout.addLayout(self.watcherHBoxLayout, 1, 0, 1, 3) + self.watcherLayout.addLayout(watcherBtnLayout, 2, 0, 1, 3) + self.gridLayout2_1.addLayout(self.watcherLayout, 0, 0, 1, 1) + self.tabLayout.addTab(self.tabWatcher, "Watcher") + self.gridLayout.addWidget(self.tabLayout) + # self.setLayout(self.watcherLayout) + + self.setWindowTitle("Substance Builder") + self.resize(800, 600) + # self.path = self.directoryComboBox.currentText() + self.path = Path(self.project_path) + self.groupboxOutputs = QtWidgets.QGroupBox("Outputs") + self.groupboxMat = QtWidgets.QGroupBox("Atom Material && Textures") + self.watcher_script = _WATCHER_SCRIPT_PATH + self.outputRenderPath = _TEX_RNDR_PATH + self.preset = '' + self.presetItem = '' + self.texRenderpath = self.texRenderPathComboBox.currentText() + self.res = 11 + self.output_name = '{inputGraphUrl}_{outputNodeName}' + self.randomstr = 1 + self.preset_index = -1 + self.outputCookPath = _SBSAR_COOK_PATH + self.selected_tex = [] + self.material_path = _MAT_OUTPUT_PATH + + self._reader = self.start_reader() + + def start_reader(self): + # set up + self._reader = ProcessOutputReader() + self._reader.produce_output.connect(self.append_output) + self._reader.start('python', ['-u', self.watcher_script, self.sbsarDirectory]) + return self._reader + + @Slot(str) + def append_output(self, text): + self.watcher_log._cursor_output.insertText(text) + self.scroll_to_last_line() + + def scroll_to_last_line(self): + cursor = self.watcher_log.textCursor() + cursor.movePosition(QTextCursor.End) + cursor.movePosition(QTextCursor.Up if cursor.atBlockStart() else + QTextCursor.StartOfLine) + self.watcher_log.setTextCursor(cursor) + + def output_text(self, text): + self.watcher_log._cursor_output.insertText(text) + self.watcher_log.scroll_to_last_line() + + def browse(self): + self.root_directory = QtWidgets.QFileDialog.getExistingDirectory(self, + "Find watcher folder", + str(_SUB_LIBRARY_PATH)) + if self.root_directory: + if self.directoryComboBox.findText(self.root_directory) or self.builderDirComboBox.findText( + self.root_directory) == -1: + self.directoryComboBox.addItem(self.root_directory) + self.builderDirComboBox.addItem(self.root_directory) + + self.directoryComboBox.setCurrentIndex(self.directoryComboBox.findText(self.root_directory)) + self.builderDirComboBox.setCurrentIndex(self.builderDirComboBox.findText(self.root_directory)) + + self.path = self.root_directory + self.find() + return self.path + + def browseRenderPath(self): + self.texRenderpath = QtWidgets.QFileDialog.getExistingDirectory(self, + "Setup textures output path", + str(_TEX_RNDR_PATH)) + if self.texRenderpath: + if self.texRenderPathComboBox.findText(self.texRenderpath) == -1: + self.texRenderPathComboBox.addItem(self.texRenderpath) + + self.texRenderPathComboBox.setCurrentIndex(self.texRenderPathComboBox.findText(self.texRenderpath)) + self.texRenderPathComboBox.setCurrentText(self.texRenderpath) + return self.texRenderpath + + def browseMaterialPath(self): + self.material_path = QtWidgets.QFileDialog.getExistingDirectory(self, + "Setup Atom Material output path", + str(_MAT_OUTPUT_PATH)) + if self.material_path: + if self.matOutputPathComboBox.findText(self.material_path) == -1: + self.matOutputPathComboBox.addItem(self.material_path) + + self.matOutputPathComboBox.setCurrentIndex(self.matOutputPathComboBox.findText(self.material_path)) + self.matOutputPathComboBox.setCurrentText(self.material_path) + return self.material_path + + @staticmethod + def updateComboBox(comboBox): + if comboBox.findText(comboBox.currentText()) == -1: + comboBox.addItem(comboBox.currentText()) + + def find(self, rootpath=None, filename=None, FILE_TEMPLATES=['*.sbs', '*.sbsar']): + self.filesTable.setRowCount(0) + + if not filename: + fileName = self.filenameSearchComboBox.currentText() + # ^ this looks like it is meant to either be a file name pattern for search + # or ext patterns? Or both? + + text = self.textComboBox.currentText() + # ^ what is this even for??? + # it never gets filled out but we continue to pass it on? + # I assume it's really meant to be a file name and file ext pattern search? + + if rootpath: + self.path = rootpath + else: + self.path = self.builderDirComboBox.currentText() + + self.directoryComboBox.setCurrentText(self.path) + # self.path = "C:/Users/chunghao/Documents/Allegorithmic/Substance Designer/sbsar" + + self.updateComboBox(self.filenameSearchComboBox) + self.updateComboBox(self.textComboBox) + self.updateComboBox(self.directoryComboBox) + + self.currentDir = QtCore.QDir(str(Path(self.path).resolve())) + + dirModel = QtWidgets.QFileSystemModel() + dirModel.setRootPath(self.currentDir.canonicalPath()) + dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs) + if fileName: + FILE_TEMPLATES = [str(fileName)] + dirModel.setNameFilters(FILE_TEMPLATES) + + # right now this filters to *.sbs and *.sbsar + # we use the project\assets dir as the root and query the filesystem + # instead of only a single directory + iterator = QtCore.QDirIterator(self.currentDir.canonicalPath(), + FILE_TEMPLATES, + QtCore.QDir.Files, + QtCore.QDirIterator.Subdirectories) + + # now we can iterate over that filtered filesystem + files = [] + while iterator.hasNext(): + files.append(iterator.next()) + files.sort() + +# if not fileName or filename == '': +# fileName = "*" +# files = self.currentDir.entryList([fileName], +# QtCore.QDir.Files | QtCore.QDir.NoSymLinks) + + files = self.find_files(files, text) + self.show_files(files) + return self.path + + def find_files(self, files, text): + progressDialog = QtWidgets.QProgressDialog(self) + + progressDialog.setCancelButtonText("&Cancel") + progressDialog.setRange(0, len(files)) + progressDialog.setWindowTitle("Find Files") + + foundFiles = [] + + for i in range(len(files)): + progressDialog.setValue(i) + progressDialog.setLabelText("Searching file number %d of %d..." % (i, len(files))) + QtCore.qApp.processEvents() + + if progressDialog.wasCanceled(): + break + + inFile = QtCore.QFile(self.currentDir.absoluteFilePath(files[i])) + + if inFile.open(QtCore.QIODevice.ReadOnly): + stream = QtCore.QTextStream(inFile) + while not stream.atEnd(): + if progressDialog.wasCanceled(): + break + line = stream.readLine() + if text in line: + foundFiles.append(files[i]) + break + + progressDialog.close() + + return foundFiles + + def show_files(self, files): + for fn in files: + file = QtCore.QFile(self.currentDir.absoluteFilePath(fn)) + size = QtCore.QFileInfo(file).size() + + fileNameItem = QtWidgets.QTableWidgetItem(fn) + fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable) + + sizeItem = QtWidgets.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024))) + sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight) + sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable) + row = self.filesTable.rowCount() + self.filesTable.insertRow(row) + self.filesTable.setItem(row, 0, fileNameItem) + self.filesTable.setItem(row, 1, sizeItem) + self.filesTable.setAlternatingRowColors(True) + self.filesTable.setStyleSheet("alternate-background-color: #444444; background-color: #4d4d4d;") + self.filesFoundLabel.setText( + "%d file(s) found (Double click on a SBSAR to cook, SBS file to load.)" % len(files)) + + def create_button(self, text, member): + button = QtWidgets.QPushButton(text) + button.clicked.connect(member) + return button + + def createComboBox(self, text=""): + comboBox = QtWidgets.QComboBox() + comboBox.setEditable(True) + comboBox.addItem(text) + comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred) + return comboBox + + def create_files_table(self): + self.filesTable = QtWidgets.QTableWidget(0, 2) + # self.filesTable.setMinimumHeight(300) + # self.filesTable.setFixedHeight(300) + self.filesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) + self.filesTable.setHorizontalHeaderLabels(("File Name", "Size")) + self.filesTable.horizontalHeaderItem(0).setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft) + self.filesTable.horizontalHeaderItem(1).setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight) + # self.filesTable.horizontalHeader().setDefaultAlignment(QtCore.Qt.AlignRight) + self.filesTable.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + self.filesTable.horizontalHeader().setDefaultSectionSize(5) + self.filesTable.verticalHeader().hide() + # self.filesTable.verticalHeader().show() + self.filesTable.setColumnWidth(1, 80) + self.filesTable.setShowGrid(False) + self.filesTable.verticalHeader().setDefaultSectionSize(5) + # style = "::section {""background-color: (241, 255, 175); }" + # self.filesTable.setStyleSheet(style) + # self.filesTable.setFixedHeight(200) + self.filesTable.cellActivated.connect(self.open_file_of_item) + + def create_sbsar_tex(self): + _LOGGER.debug('Running: .create_sbsar_tex') + # self.builderLayout.addWidget(self.OutputsLabel, 10, 0) + self.sbsarName = self.item.text().replace(".sbsar", "") + self.groupboxOutputs = QtWidgets.QGroupBox("Output Texture Maps") + self.horizontalLayoutOuputs = QtWidgets.QHBoxLayout(self.groupboxOutputs) + self.horizontalLayoutOuputs.setObjectName(("horizontalLayoutOuputs")) + # self.vertical_layout_outputs = QtWidgets.QVBoxLayout(self.groupboxOutputs) + # self.vertical_layout_outputs.setObjectName("vertical_layout_outputs") + self.sbsar_tex_outputs = sbsar_utils.output_info(self.path, self.sbsarName, 'tex_maps') + + for index, tex in enumerate(self.sbsar_tex_outputs): + _LOGGER.info(tex) + #text_item_checkbox = QtWidgets.QCheckBox(self.groupboxOutputs) + #text_item_checkbox.setObjectName(self.sbsarName + "_" + tex) + # text_item_checkbox.setEnabled(True) + # text_item_checkbox.setChecked(True) + # text_item_checkbox.setText(tex) + # self.horizontalLayoutOuputs.addWidget(text_item_checkbox) + + self.sbsar_tex_outputs[index] = QtWidgets.QCheckBox(self.groupboxOutputs) + self.sbsar_tex_outputs[index].setObjectName(self.sbsarName + "_" + tex) + self.sbsar_tex_outputs[index].setEnabled(True) + self.sbsar_tex_outputs[index].setChecked(True) + self.sbsar_tex_outputs[index].setText(tex) + self.horizontalLayoutOuputs.addWidget(self.sbsar_tex_outputs[index]) + + self.builderLayout.addWidget(self.groupboxOutputs, 7, 0, 1, 3) + + def create_sbsar_presets(self): + _LOGGER.debug('Running: .create_sbsar_presets') + self.inputGridLayout.addWidget(self.sbsarPresetLabel, 0, 0, 1, 1) + self.sbsar_presets = sbsar_utils.output_info(self.path, self.item.text().replace(".sbsar", ""), 'presets') + self.comboBox_SbsarPreset = QtWidgets.QComboBox(self) + self.comboBox_SbsarPreset.addItem("Default preset") + for self.presetItem in self.sbsar_presets: + _LOGGER.info(self.presetItem) + # preset_index = 0 + self.comboBox_SbsarPreset.addItem(self.presetItem, self.presetItem) + # self.comboBox_SbsarPreset.setItemText(preset_index, self.presetItem) + # preset_index += 1 + + self.inputGridLayout.addWidget(self.comboBox_SbsarPreset, 0, 1, 1, 3) + self.comboBox_SbsarPreset.activated.connect(self.preset_selected) + + def preset_selected(self, index): + self.preset = self.comboBox_SbsarPreset.itemData(index) + if self.preset in self.sbsar_presets: + self.atomMatNameComboBox.setCurrentText(self.sbsarName + "_" + self.preset.replace(" ", "")) + _LOGGER.info('Preset(variant): ' + self.atomMatNameComboBox.currentText()) + self.preset_index = index - 1 + _LOGGER.info('The Preset index: ' + str(self.preset_index)) + return self.preset_index + # return self.atomMatNameComboBox.currentText() + else: + self.atomMatNameComboBox.setCurrentText(self.sbsarName) + _LOGGER.info('Default preset selected.') + self.preset_index = index - 1 + _LOGGER.info(self.preset_index) + return self.preset_index + + def create_tex_res(self): + self.inputGridLayout.addWidget(self.OutputResLabel, 1, 0, 1, 1) + self.resSelector = QtWidgets.QComboBox(self) + # self.resSelector.addItem("512x512", "$outputsize@9,9") + # self.resSelector.addItem("1024x1024", "$outputsize@10,10") + # self.resSelector.addItem("2048x2048", "$outputsize@11,11") + self.resSelector.addItem("512x512", 9) + self.resSelector.addItem("1024x1024", 10) + self.resSelector.addItem("2048x2048", 11) + self.resSelector.addItem("4096x4096", 12) + self.resSelector.addItem("8096x8096", 13) + self.inputGridLayout.addWidget(self.resSelector, 1, 1, 1, 3) + self.resSelector.activated.connect(self.res_selected) + self.resSelector.setCurrentIndex(2) + + def res_selected(self, index): + self.res = self.resSelector.itemData(index) + _LOGGER.info(self.res) + return self.res + + def remove(self): + self.builderLayout.removeWidget(self.groupboxOutputs) + self.groupboxOutputs.close() + + def kill(self): + self._reader.kill() + + def clear_log(self): + self.watcher_log.clear() + + def atom_material(self, preset=None, + material_type=None, + tex_ext='.tif', + mat_ext='.material'): + """To Do""" + if preset is None: + preset = self.preset + + preset = str(preset).replace(" ", "-") + + # setup material template + if material_type is None: + material = AtomMaterial(self._default_material_path) + + mat_file_tag = str(self.atomMatNameComboBox.currentText()).replace(" ", "_") + + # file_path = Path(self.atomMatNameComboBox.currentText()) + # file_name = file_path.stem + # ^^ object oriented paths do all these things you want without destrpying the path + # write less code, use your autocomplete, reed the docs + # p.name, Final component only (name.ext) + # p.stem, Final component without extension. + # p.ext, Extension only. .suffix in pathlib + + # if you want relative paths here is a better way + # first of all, assume we know the project we are in + #_LY_PROJECT_PATH + + texture_output_path = Path(self.texRenderPathComboBox.currentText()).resolve() + rel_tex_path = None + for p in texture_output_path.parts: + if _LY_PROJECT == p: + index = texture_output_path.parts.index(_LY_PROJECT) + rel_tuple = texture_output_path.parts[index + 1:] + rel_tex_path = Path(*list(rel_tuple)) + + # if 'ambientocclusion' in self.preset: + # num_index = 5 + # else: + num_index = 5 + # ^^ ok what is all this magic mumbo jumbo? + + if preset is None or preset == '': + preset_slug = preset # gets rid of _ when not needed + else: + preset_slug = '_' + preset + + for tex_index in range(num_index): + # tex_map_name = material.texture_map[material.tex[tex_index]] + tex_ext + # ^ this is not so great, AtomMaterial is very rigid and only very specifically + # supports a hand coded implmentation of StandardPBR + # we should have a more generic material class that can consume any + # then we can somehow check for the type we are compatible with + # after that you might want a wrapper class above the atom material data that knows how + # to map from substance to the atom material, and builds a specific data structure above + # the generic one + + material_texture_slot = material.texture_map[material.tex[tex_index]] + material_slot_texture = material_texture_slot + tex_ext + + # text_map_path = Path(rel_tex_path + "\\" + tex_file_name + "_" + tex_map_name).resolve() + texture_slug = mat_file_tag + preset_slug + '_' + material_slot_texture + rel_texture_map_path = Path(rel_tex_path, texture_slug) # don't .resolve() + + # posiz / slash + material.set_map(material.tex[tex_index], str(rel_texture_map_path.as_posix())) + + # mat_path = self.material_path + "/" + self.atomMatNameComboBox.currentText().replace(" ", "") + ".material" + + material_path = Path(self.material_path, mat_file_tag + preset_slug + mat_ext) + material.write(material_path) + + self.preset = '' + + _LOGGER.info('{}'.format(material_path)) + + return material_path + + def create_single(self): + if self.preset is None: + self.atom_material(self.preset) + else: + self.atom_material(self.preset) + + def create_all_material(self): + # always make the make + # self.atom_material('base') + self.atom_material(self.preset) + + # then make any others + if len(self.sbsar_presets) > 0: + for i in self.sbsar_presets: + _LOGGER.info('Preset(variant): {}'.format(i.replace(" ", ""))) + self.atom_material(i) + + def print_something(self, words): + self.words = words + _LOGGER.info(self.words) + + def watch(self): + self._reader.start('python', ['-u', self.watcher_script, self.sbsarDirectory]) + + def create_atom_mat(self, item_path=None): + self.atom_matPath_button = self.create_button("&Browse", self.browseMaterialPath) + self.atom_material_button = self.create_button("&Create Single", self.create_single) + self.atom_material_output = self.create_button("&Create All", self.create_all_material) + self.renderPathbutton = self.create_button("&Output Path", self.browseRenderPath) + self.rendeTexbutton = self.create_button("&Render Textures", self.render_tex) + + if item_path is None: + item_path = Path(self.item.text()).resolve() + + # self.sbsarName = self.item.text().replace(".sbsar", "") + self.sbsarName = item_path.stem + self.groupboxMat = QtWidgets.QGroupBox("Atom Material") + self.atomMatNameComboBox.setCurrentText(self.sbsarName) + # self.atomMatNameComboBox.setDisabled(True) + # self.texRenderPathComboBox.setCurrentText(self.path) + self.gridLayoutMat = QtWidgets.QGridLayout(self.groupboxMat) + self.MatHBox0 = QtWidgets.QHBoxLayout() + self.MatHBox0.addWidget(self.atomMatDirLabel) + self.MatHBox0.addWidget(self.matOutputPathComboBox) + self.MatHBox0.addWidget(self.atom_matPath_button) + # self.MatHBox0.addWidget(self.atom_matPath_button2) + self.gridLayoutMat.addLayout(self.MatHBox0, 0, 0, 1, 4) + self.MatHBox = QtWidgets.QHBoxLayout() + self.MatHBox.addWidget(self.atomMatLabel) + self.MatHBox.addWidget(self.atomMatNameComboBox) + self.MatHBox.addWidget(self.atom_material_output) + self.MatHBox.addWidget(self.atom_material_button) + self.gridLayoutMat.addLayout(self.MatHBox, 1, 0, 1, 4) + self.MatHBox1 = QtWidgets.QHBoxLayout() + self.MatHBox1.addWidget(self.textOutputPathLabel) + self.MatHBox1.addWidget(self.texRenderPathComboBox) + self.MatHBox1.addWidget(self.renderPathbutton) + self.MatHBox1.addWidget(self.rendeTexbutton) + self.gridLayoutMat.addLayout(self.MatHBox1, 2, 0, 1, 4) + + self.builderLayout.addWidget(self.groupboxMat, 8, 0, 1, 3) + # _LOG.info("\n") + + def randomseed(self): + import random + random_num = random.randrange(1, 10 ** 10) + self.randomstr = str(random_num) + self.randomSeedComboBox.setCurrentText(str(random_num)) + _LOGGER.info('Random Seed: ' + self.randomstr) + return self.randomstr + + def render_tex(self): + """To Do""" + + texture_output_path = Path(self.texRenderPathComboBox.currentText()).resolve() + + sbsar_item_path = Path(self.item.text()).resolve() + + if not texture_output_path.exists(): + try: + texture_output_path.mkdir(mode=0o777) + _LOGGER.info('mkdir: {}'.format(texture_output_path)) + except Exception as e: + _LOGGER.ERROR(e) + raise(e) + else: + _LOGGER.info('exists: {}'.format(texture_output_path)) + + _LOGGER.info('Render texture from: ' + self.path + "/" + self.item.text()) + + # for index, tex in enumerate(self.groupboxOutputs.children()): + # if self.groupboxOutputs.children() + + for index, tex in enumerate(self.sbsar_tex_outputs): + if self.sbsar_tex_outputs[index].isChecked() is True: + self.selected_tex.append(tex.text()) + print(self.selected_tex) + + self.outputCookPath = sbsar_item_path.parent + + sbsar_utils.render_sbsar(self.outputCookPath, + self.selected_tex, + sbsar_item_path.stem, + texture_output_path, + self.preset_index, + self.res, + self.randomstr) + self.selected_tex = [] + + def find_1st_sbsar(self, seedpath=None): + i = None # previously broke if found none + + if seedpath is None: + seedpath = Path(self.project_path, 'Assets') + + filelist = [] + for r, d, f in os.walk(seedpath): + for file in f: + filelist.append(file) + for i in range(len(filelist)): + if filelist[i].split(".")[-1] == "sbsar": + return i + else: + i += 1 + return i + + def return_1st_sbsar(self, seedpath=None): + if seedpath is None: + seedpath = Path(self.project_path, 'Assets') + + filelist = [] + for r, d, f in os.walk(seedpath): + for file in f: + if Path(file).ext == ".sbsar": + filelist.append(Path(r, file).absolute()) + + return filelist[0] + + def open_file_of_item(self, row, column): + self.item = self.filesTable.item(row, 0) + item_path = Path(self.item.text()).resolve() + _LOGGER.debug('Item path: {}'.format(item_path)) + + # Load sbsar parameters. + if PurePath(item_path).suffix == ".sbsar": + self.create_sbsar_presets() + self.create_tex_res() + self.builderLayout.removeWidget(self.groupboxOutputs) + self.groupboxOutputs.close() + self.create_sbsar_tex() + self.builderLayout.removeWidget(self.groupboxMat) + self.groupboxMat.close() + self.builderLayout.addWidget(self.inputGroupBox, 5, 0, 1, 3) + self.randomSeedComboBox.setCurrentText("0000000000") + self.create_atom_mat(item_path) + + # Cook sbsar file and trigger watcher to generate textures. + elif self.item.text().split(".")[-1] == "sbs": + sbsar_utils.cook_sbsar(self.path + "/" + self.item.text(), sbsar_utils._PYSBS_CONTEXT, self.path, + self.item.text().split(".")[0]) + sbsar_utils.output_info() + + +class ProcessOutputReader(QProcess): + produce_output = Signal(str) + + def __init__(self, parent=None): + super().__init__(parent=parent) + + # merge stderr channel into stdout channel + self.setProcessChannelMode(QProcess.MergedChannels) + # prepare decoding process' output to Unicode + self._codec = QTextCodec.codecForLocale() + self._decoder_stdout = self._codec.makeDecoder() + # only necessary when stderr channel isn't merged into stdout: + # self._decoder_stderr = codec.makeDecoder() + + self.readyReadStandardOutput.connect(self._ready_read_standard_output) + # only necessary when stderr channel isn't merged into stdout: + # self.readyReadStandardError.connect(self._ready_read_standard_error) + + @Slot() + def _ready_read_standard_output(self): + raw_bytes = self.readAllStandardOutput() + text = self._decoder_stdout.toUnicode(raw_bytes) + self.produce_output.emit(text) + + # only necessary when stderr channel isn't merged into stdout: + # @Slot() + # def _ready_read_standard_error(self): + # raw_bytes = self.readAllStandardError() + # text = self._decoder_stderr.toUnicode(raw_bytes) + # self.produce_output.emit(text) + + +def substance_builder_launcher(): + + app = QApplication(sys.argv) + window = Window() + + _LOGGER.info('cwd: {}'.format(os.getcwd())) # project + _LOGGER.info('file: {}'.format(__file__)) # *might* come back relative + + # we should ensure we know the abs path + qss_filepath = Path(_DCCSIG_PATH).resolve().absolute() + qss_filepath = Path(qss_filepath, 'SDK', 'substance', 'builder', + 'ui', 'stylesheets', 'LYstyle.qss').resolve().absolute() + window.setStyleSheet(qss_filepath.read_text()) + # window.find() # uhm ... this is VERY odd, shouldn't you do this in __init__? + window.find() + first_item = window.find_1st_sbsar() + window.show() + # window.open_file_of_item(first_item, 0) + sys.exit(app.exec_()) + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + _LOGGER.info("Test Run:: {0}.".format({_MODULENAME})) + _LOGGER.info("{0} :: if __name__ == '__main__':".format(_MODULENAME)) + + _LOGGER.info('file: {}'.format(os.getcwd())) # project + _LOGGER.info('file: {}'.format(__file__)) # *might* come back relative + + substance_builder_launcher() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbs_to_sbsar.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbs_to_sbsar.py new file mode 100644 index 0000000000..8a328f3906 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbs_to_sbsar.py @@ -0,0 +1,133 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# -- This line is 75 characters ------------------------------------------- +"""Empty Doc String""" # To Do: add documentation +# ------------------------------------------------------------------------- +# built-ins +import os +import sys +import site +import subprocess + +# Lumberyard extensions +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE +from azpy.constants import * + +# 3rdparty +from unipath import Path +from unipath import FILES +import click +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# substance automation toolkit (aka pysbs) +# To Do: manage with dynaconf environment +_PYSBS_DIR_PATH = Path(PATH_PROGRAMFILES_X64, + 'Allegorithmic', + 'Substance Automation Toolkit', + 'Python API', + 'install').resolve() + +site.addsitedir(str(_PYSBS_DIR_PATH)) # 'install' is the folder I created + +# Susbstance +import pysbs.batchtools as pysbs_batch +import pysbs.context as pysbs_context +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = __name__ +if _PACKAGENAME is '__main__': + _PACKAGENAME = 'DCCsi.SDK.substance.builder.sbs_to_sbsar' + +import azpy +_LOGGER = azpy.initialize_logger(_PACKAGENAME) +_LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# Defining CONSTANTS +# To Do: shouldn't need this _BASE_ENVVAR_DICT (replace with dynaconf config) +from collections import OrderedDict +_SYNTH_ENV_DICT = OrderedDict() +_SYNTH_ENV_DICT = azpy.synthetic_env.stash_env(_SYNTH_ENV_DICT) +# grab a specific path from the base_env +_PATH_DCCSI = _SYNTH_ENV_DICT[ENVAR_DCCSIG_PATH] +_LY_PROJECT_PATH = _SYNTH_ENV_DICT[ENVAR_LY_PROJECT_PATH] + +# build some reuseable path parts +_PATH_MOCK_ASSETS = Path(_LY_PROJECT_PATH, 'Assets').norm() +_PATH_MOCK_SUBLIB = Path(_PATH_MOCK_ASSETS, 'SubstanceSource').norm() + +_PATH_MOCK_SBS = Path(_PATH_MOCK_SUBLIB, 'sbs').norm() +_PATH_MOCK_SBSAR = Path(_PATH_MOCK_SUBLIB, 'sbsar').norm() + +_PATH_MOCK_MAT = Path(_PATH_MOCK_ASSETS, 'Textures').norm() +_PATH_MOCK_MAT_SUB = Path(_PATH_MOCK_MAT, 'Substance').norm() + +# this will combine two parts into a single path (object) +# It also returnd the fixed-up version (norm) +_PATH_INPUT_SBS = Path(_PATH_MOCK_SBS, 'alien_rock_coral_formation', 'alien_rock_coral_formation.sbs').norm() +_PATH_COOK_OUTPUT = _PATH_MOCK_SBSAR.norm() +_PATH_RENDER_OUTPUT = _PATH_MOCK_MAT_SUB + +_SBS_NAME = _PATH_INPUT_SBS.split('.sbs')[0].split('\\')[-1] + +# quick test variables, will be removed +_PYSBS_CONTEXT = pysbs_context.Context() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +@click.command() +@click.option('--sbs_path', default=_PATH_INPUT_SBS, help='Sbs path.') +@click.option('--sbsar_path', default=_PATH_COOK_OUTPUT, help='Sbsar output path.') +@click.option('--sbsar_name', default=_SBS_NAME, help='Sbsar output name.') +def sbs_to_sbsar(sbs_path, sbsar_path, sbsar_name): + """ Cook SBSAR from SBS """ + sbs_path = Path(sbs_path).norm() + click.echo(sbs_path) + sbsar_path = Path(sbsar_path).norm() + click.echo(_SBS_NAME) + pysbs_batch.sbscooker(quiet=True, + inputs=sbs_path, + includes=_PYSBS_CONTEXT.getDefaultPackagePath(), + alias=_PYSBS_CONTEXT.getUrlAliasMgr().getAllAliases(), + output_path=sbsar_path, + output_name=sbsar_name, + compression_mode=2).wait() +# -------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_PACKAGENAME)) + + _LOGGER.debug(sbs_to_sbsar()) + + # remove the logger + del _LOGGER +# ---- END --------------------------------------------------------------- + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_info.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_info.py new file mode 100644 index 0000000000..1de3ff7844 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_info.py @@ -0,0 +1,177 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# -- This line is 75 characters ------------------------------------------- +"""Empty Doc String""" # To Do: add documentation +# ------------------------------------------------------------------------- +# built-ins +import os +import sys +import site +import subprocess +import logging + +# Lumberyard extensions +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE +from azpy.constants import * + +# 3rdparty +from unipath import Path +import click +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# substance automation toolkit (aka pysbs) +# To Do: manage with dynaconf environment +_PYSBS_DIR_PATH = Path(PATH_PROGRAMFILES_X64, + 'Allegorithmic', + 'Substance Automation Toolkit', + 'Python API', + 'install').resolve() + +site.addsitedir(str(_PYSBS_DIR_PATH)) # 'install' is the folder I created + +# Susbstance +import pysbs.batchtools as pysbs_batch +import pysbs.context as pysbs_context +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = __name__ +if _PACKAGENAME is '__main__': + _PACKAGENAME = 'DCCsi.SDK.substance.builder.sbsar_info' + +import azpy +_LOGGER = azpy.initialize_logger(_PACKAGENAME) +_LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = os.getenv(ENVAR_DCCSI_GDEBUG, False) + +# global space debug flag +_DCCSI_DEV_MODE = os.getenv(ENVAR_DCCSI_DEV_MODE, False) + +_MODULE_PATH = Path(__file__) + +_ORG_TAG = 'Amazon_Lumberyard' +_APP_TAG = 'DCCsi' +_TOOL_TAG = 'sdk.substance.builder.sbsar_info' +_TYPE_TAG = 'module' + +_MODULENAME = __name__ +if _MODULENAME is '__main__': + _MODULENAME = _TOOL_TAG +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# Defining CONSTANTS +# To Do: shouldn't need this _BASE_ENVVAR_DICT (replace with dynaconf config) +from collections import OrderedDict +_SYNTH_ENV_DICT = OrderedDict() +_SYNTH_ENV_DICT = azpy.synthetic_env.stash_env(_SYNTH_ENV_DICT) +# grab a specific path from the base_env +_PATH_DCCSI = _SYNTH_ENV_DICT[ENVAR_DCCSIG_PATH] +_LY_PROJECT_PATH = _SYNTH_ENV_DICT[ENVAR_LY_PROJECT_PATH] + +# build some reuseable path parts +_PATH_MOCK_ASSETS = Path(_LY_PROJECT_PATH, 'Assets').norm() +_PATH_MOCK_SUBLIB = Path(_PATH_MOCK_ASSETS, 'SubstanceSource').norm() + +_PATH_MOCK_SBS = Path(_PATH_MOCK_SUBLIB, 'sbs').norm() +_PATH_MOCK_SBSAR = Path(_PATH_MOCK_SUBLIB, 'sbsar').norm() + +_PATH_MOCK_MAT = Path(_PATH_MOCK_ASSETS, 'Textures').norm() +_PATH_MOCK_MAT_SUB = Path(_PATH_MOCK_MAT, 'Substance').norm() + +# this will combine two parts into a single path (object) +# It also returnd the fixed-up version (norm) +_PATH_INPUT_SBS = Path(_PATH_MOCK_SBS, 'bronze_yellow.sbs').norm() +_PATH_COOK_OUTPUT = _PATH_MOCK_SBSAR.norm() +_PATH_RENDER_OUTPUT = _PATH_MOCK_MAT_SUB + + +# quick test variables, will be removed +_PYSBS_CONTEXT = pysbs_context.Context() +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +def output_info(_outputCookPath, _outputName): + """ SBSAR information""" + info_lists = [] + input_n_output = pysbs_batch.sbsrender_info(input=os.path.join(_outputCookPath, _outputName + '.sbsar'), + stdout=subprocess.PIPE) + for info_list in input_n_output.stdout.read().splitlines(): + info_lists.append(info_list.decode('utf-8')) + + _outputs, _params, _presets, _inputs, _input, _input_type = [], [], [], [], [], [] + + for info_list in info_lists: + if 'OUTPUT' in info_list: + _outputs.append(info_list.split(' ')[3]) + elif 'INPUT $' in info_list: + _params.append(info_list.split(' ')[3:]) + elif 'PRESET' in info_list: + _presets.append(info_list.split('PRESET ')[1]) + elif 'INPUT' in info_list and (not '$'in info_list): + _inputs.append(info_list.split(' ')[3:]) + _input.append(info_list.split(' ')[3:][0]) + _input_type.append(info_list.split(' ')[3:][1]) + + info_list = {'texmaps': _outputs, + 'params': _params, + 'presets': _presets, + 'inputs': _inputs, + 'input': _input, + 'input_type': _input_type} + + return info_list +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +@click.command() +@click.option('--sbsar_path', default=_PATH_COOK_OUTPUT, help='Sbsar directory.') +@click.option('--sbsar_name', default=_PATH_INPUT_SBS.stem, help='Sbsar name.') +@click.option('--output_type', default='inputs', help='Output Type: \n' + 'texmaps | presets | inputs | input | input_type | params') +def sbsar_info(sbsar_path, sbsar_name, output_type): + click.echo(output_info(sbsar_path, sbsar_name)[output_type]) + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_PACKAGENAME)) + _LOGGER.debug("Test Run:: {0}.".format({_MODULENAME})) + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_TOOL_TAG)) + + _LOGGER.debug(sbsar_info()) + + # remove the logger + del _LOGGER +# ---- END --------------------------------------------------------------- + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_render.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_render.py new file mode 100644 index 0000000000..e5fc6d96c9 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_render.py @@ -0,0 +1,136 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# -- This line is 75 characters ------------------------------------------- +"""Empty Doc String""" # To Do: add documentation +# ------------------------------------------------------------------------- +# built-ins +import os +import sys +import site + +# Lumberyard extensions +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE +from azpy.constants import * + +# 3rdparty (we provide) +from unipath import Path +import click +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# substance automation toolkit (aka pysbs) +# To Do: manage with dynaconf environment +_PYSBS_DIR_PATH = Path(PATH_PROGRAMFILES_X64, + 'Allegorithmic', + 'Substance Automation Toolkit', + 'Python API', + 'install').resolve() + +site.addsitedir(str(_PYSBS_DIR_PATH)) # 'install' is the folder I created + +# Susbstance +import pysbs.batchtools as pysbs_batch +import pysbs.context as pysbs_context +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = __name__ +if _PACKAGENAME is '__main__': + _PACKAGENAME = 'DCCsi.SDK.substance.builder.sbsar_render' + +import azpy +_LOGGER = azpy.initialize_logger(_PACKAGENAME) +_LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# Defining CONSTANTS +# To Do: shouldn't need this _BASE_ENVVAR_DICT (replace with dynaconf config) +from collections import OrderedDict +_SYNTH_ENV_DICT = OrderedDict() +_SYNTH_ENV_DICT = azpy.synthetic_env.stash_env(_SYNTH_ENV_DICT) +# grab a specific path from the base_env +_PATH_DCCSI = _SYNTH_ENV_DICT[ENVAR_DCCSIG_PATH] +_LY_PROJECT_PATH = _SYNTH_ENV_DICT[ENVAR_LY_PROJECT_PATH] + +# build some reuseable path parts +_PATH_MOCK_ASSETS = Path(_LY_PROJECT_PATH, 'Assets').norm() +_PATH_MOCK_SUBLIB = Path(_PATH_MOCK_ASSETS, 'SubstanceSource').norm() + +_PATH_MOCK_SBS = Path(_PATH_MOCK_SUBLIB, 'sbs').norm() +_PATH_MOCK_SBSAR = Path(_PATH_MOCK_SUBLIB, 'sbsar').norm() + +_PATH_MOCK_MAT = Path(_PATH_MOCK_ASSETS, 'Textures').norm() +_PATH_MOCK_MAT_SUB = Path(_PATH_MOCK_MAT, 'Substance').norm() + +# this will combine two parts into a single path (object) +# It also returnd the fixed-up version (norm) +_PATH_INPUT_SBS = Path(_PATH_MOCK_SBS, 'alien_rock_coral_formation','alien_rock_coral_formation.sbs').norm() +_PATH_COOK_OUTPUT = _PATH_MOCK_SBSAR.norm() +_PATH_RENDER_OUTPUT = _PATH_MOCK_MAT_SUB + +# quick test variables, will be removed +_OUTPUT_SIZE = 9 +_user_preset = ['Red Coral', 'Red Sand', 'Grey Stone'] +integer1 = 0 +integer2 = [0, 0] +float1 = 0.0 +float2 = [0.0, 0.0] + +_PYSBS_CONTEXT = pysbs_context.Context() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +@click.command() +@click.option('--sbsar_path', default=_PATH_COOK_OUTPUT, help='Sbsar directory.') +@click.option('--sbsar_name', default=_PATH_INPUT_SBS.stem, help='Sbsar name.') +@click.option('--tex_path', default=_PATH_RENDER_OUTPUT, help='Texture output path.') +@click.option('--output_size', default=9, help='512x512, 9 | 1024x1024, 10 | 2048x2048, 11') +def sbsar_render(sbsar_path, sbsar_name, tex_path, output_size): + """ Doc String""" + pysbs_batch.sbsrender_render(inputs=os.path.join(sbsar_path, sbsar_name + '.sbsar'), + # input_graph=_inputGraphPath, + output_path=tex_path, + output_name='{inputGraphUrl}_{outputNodeName}', + output_format='tif', + set_value=['$outputsize@%s,%s' % (output_size, output_size), '$randomseed@1'], + # use_preset = _user_preset[0] + no_report=True, + verbose=True + ).wait() +# -------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_PACKAGENAME)) + + _LOGGER.debug(sbsar_render()) + + # remove the logger + del _LOGGER +# ---- END --------------------------------------------------------------- + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_utils.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_utils.py new file mode 100644 index 0000000000..05bffe8ed0 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/sbsar_utils.py @@ -0,0 +1,248 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# -- This line is 75 characters ------------------------------------------- +"""Empty Doc String""" # To Do: add documentation +# ------------------------------------------------------------------------- +# built-ins +import os +import sys +import site +import subprocess +import logging as _logging +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE + +# we boostrap access to some lib site-packages +from dynaconf import settings +from pathlib import Path + +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, settings.DCCSI_GDEBUG) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, settings.DCCSI_DEV_MODE) + +_MODULENAME = 'DCCsi.SDK.substance.builder.sbsar_utils' +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Starting up: {0}.'.format({_MODULENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# substance automation toolkit (aka pysbs) +# To Do: manage with dynaconf environment +from azpy.constants import PATH_SAT_INSTALL_PATH +_SAT_INSTALL_PATH = Path(PATH_SAT_INSTALL_PATH).resolve() +site.addsitedir(str(_SAT_INSTALL_PATH)) # 'install' is the folder I created + +# Susbstance +import pysbs.batchtools as pysbs_batch +import pysbs.context as _pysbs_context + +_PYSBS_CONTEXT = _pysbs_context.Context() +# ------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +def cook_sbsar(input_sbs, cook_output_path): + """ Doc String""" + input_sbs = Path(input_sbs).resolve() + cook_output_path = Path(cook_output_path).resolve() + if not cook_output_path.exists(): + try: + cook_output_path.mkdir() + except: + _LOGGER.warning('Could not mkdir: {}'.format(cook_output_path)) + output_name = input_sbs.stem + pysbs_batch.sbscooker(quiet=True, + inputs=str(input_sbs), + includes=_PYSBS_CONTEXT.getDefaultPackagePath(), + alias=_PYSBS_CONTEXT.getUrlAliasMgr().getAllAliases(), + output_path=str(cook_output_path), + output_name=output_name, + compression_mode=2).wait() + new_file = Path(cook_output_path, output_name + '.sbsar').resolve() + if new_file.exists(): + return new_file +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +def info_sbsar(input_path): + """ Doc String""" + sbsar_info = [] + in_file = Path(input_path).resolve() + input_n_output = pysbs_batch.sbsrender_info(input=str(in_file), + stdout=subprocess.PIPE) + + for info in input_n_output.stdout.read().splitlines(): + sbsar_info.append(info.decode('utf-8')) + + return sbsar_info +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +def output_info(cook_output_path, output_name, output_type): + """ Doc String""" + info_lists = [] + input_file = Path(cook_output_path, output_name + '.sbsar').resolve() + input_n_output = pysbs_batch.sbsrender_info(input=str(input_file), + stdout=subprocess.PIPE) + + for info_list in input_n_output.stdout.read().splitlines(): + info_lists.append(info_list.decode('utf-8')) + + tex_maps, params, output_size, presets, inputs = [], [], [], [], [] + + for info_list in info_lists: + if 'OUTPUT' in info_list: + tex_maps.append(info_list.split(' ')[3]) + elif 'INPUT $' in info_list: + params.append(info_list.split(' ')[3:]) + elif 'PRESET' in info_list: + presets.append(info_list.split('PRESET ')[1]) + elif 'INPUT' in info_list and not '$' in info_list: + inputs.append(info_list.split(' ')[3:]) + + output_info = {'tex_maps': tex_maps, + 'params': params, + 'output_size': output_size, + 'presets': presets, + 'inputs': inputs} + return output_info[output_type] +# To Do: Make preset a optional argument. +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +def render_sbsar(cook_output_path, output_texture_type, sbsar_name, + render_to_output_path, use_preset, output_size, random_seed): + """ Render textures maps from SBSAR""" + # _tex_output = ['diffuse', 'basecolor', 'normal'] + # print(_tex_output) + cook_output_path = Path(cook_output_path).resolve() + texture_path = Path(render_to_output_path).resolve() + sbsar_file = Path(cook_output_path, sbsar_name + '.sbsar').resolve() + + if output_info(cook_output_path, sbsar_name, 'presets'): + if use_preset == -1: + preset_base = '_' + pysbs_batch.sbsrender_render(inputs=str(sbsar_file), + # input_graph=_inputGraphPath, + input_graph_output=str(output_texture_type), + output_path=str(texture_path), + output_name=sbsar_name + preset_base + '{outputNodeName}', + output_format='tif', + set_value=['$outputsize@{},{}'.format(output_size, output_size), + '$randomseed@{}'.format(random_seed)], + no_report=True, + verbose=True + ).wait() + else: + preset_name = output_info(cook_output_path, sbsar_name, 'presets')[use_preset] + preset_base = '_' + pysbs_batch.sbsrender_render(inputs=str(sbsar_file), + # input_graph=_inputGraphPath, + input_graph_output=str(output_texture_type), + output_path=str(texture_path), + output_name=sbsar_name + preset_base + preset_name.replace(' ', '') + '_{outputNodeName}', + output_format='tif', + set_value=['$outputsize@{},{}'.format(output_size, output_size), + '$randomseed@{}'.format(random_seed)], + use_preset=preset_name, + no_report=True, + verbose=True + ).wait() + else: + pysbs_batch.sbsrender_render(inputs=str(sbsar_file), + # input_graph=_inputGraphPath, + input_graph_output=str(output_texture_type), + output_path=str(texture_path), + output_name=sbsar_name + '_{outputNodeName}', + output_format='tif', + set_value=['$outputsize@{},{}'.format(output_size, output_size), + '$randomseed@{}'.format(random_seed)], + no_report=True, + verbose=True + ).wait() +# -------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == "__main__": + """Run this file as main""" + # --------------------------------------------------------------------- + # Defining CONSTANTS + # To Do: shouldn't need this _SYNTH_ENV_DICT (replace with dynaconf config) + from azpy import synthetic_env + _SYNTH_ENV_DICT = synthetic_env.stash_env() + + from azpy.constants import ENVAR_DCCSIG_PATH + from azpy.constants import ENVAR_LY_PROJECT_PATH + + # grab a specific path from the base_env + _PATH_DCCSI = _SYNTH_ENV_DICT[ENVAR_DCCSIG_PATH] + + # use DCCsi as the project path for this test + _LY_PROJECT_PATH = _PATH_DCCSI + + _PROJECT_ASSETS_PATH = Path(_LY_PROJECT_PATH, 'Assets').resolve() + _PROJECT_MATERIALS_PATH = Path(_PROJECT_ASSETS_PATH, 'Materials').resolve() + + # this will combine two parts into a single path (object) + # It also returnd the fixed-up version (norm) + _PATH_OUTPUT = Path(_PROJECT_MATERIALS_PATH, 'Fabric') + _PATH_INPUT_SBS = Path(_PROJECT_MATERIALS_PATH, 'Fabric', 'fabric.sbsar') + # --------------------------------------------------------------------- + + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_MODULENAME)) + + _LOGGER.debug('_SYNTH_ENV_DICT: {}'.format(_SYNTH_ENV_DICT)) + + _LOGGER.info('presets: {}'.format(output_info(_PATH_OUTPUT, + _PATH_INPUT_SBS.stem, + 'presets'))) + + _LOGGER.info('params: {}'.format(output_info(_PATH_OUTPUT, + _PATH_INPUT_SBS.stem, + 'params'))) + + _LOGGER.info('inputs: {}'.format(output_info(_PATH_OUTPUT, + _PATH_INPUT_SBS.stem, + 'inputs'))) + + _LOGGER.info('tex_maps: {}'.format(output_info(_PATH_OUTPUT, + _PATH_INPUT_SBS.stem, + 'tex_maps'))) + + _LOGGER.info(info_sbsar(Path(_PATH_INPUT_SBS))) + new_file = cook_sbsar(_PATH_INPUT_SBS, Path(_PATH_OUTPUT, '.tests')) + if new_file: + _LOGGER.info('Cooked out: {}'.format(new_file)) + render_sbsar(cook_output_path=Path(_PATH_OUTPUT, '.tests'), + output_texture_type='basecolor', + sbsar_name=_PATH_INPUT_SBS.stem, + render_to_output_path=Path(_PATH_OUTPUT, '.tests'), + use_preset=-1, + output_size=256, + random_seed=1001) + + # remove the logger + del _LOGGER +# ---- END --------------------------------------------------------------- + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/substance_tools.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/substance_tools.py new file mode 100644 index 0000000000..38a7a00dd9 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/substance_tools.py @@ -0,0 +1,149 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# -- This line is 75 characters ------------------------------------------- +"""Empty Doc String""" # To Do: add documentation +# ------------------------------------------------------------------------- +# built-ins +import os +import sys +import site + +# Lumberyard extensions +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE +from azpy.constants import * +import sbsar_utils + +# 3rdparty +from unipath import Path +import click +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# substance automation toolkit (aka pysbs) +# To Do: manage with dynaconf environment +_PYSBS_DIR_PATH = Path(PATH_PROGRAMFILES_X64, + 'Allegorithmic', + 'Substance Automation Toolkit', + 'Python API', + 'install').resolve() + +site.addsitedir(str(_PYSBS_DIR_PATH)) # 'install' is the folder I created + +# Susbstance +import pysbs.batchtools as pysbs_batch +import pysbs.context as pysbs_context +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = __name__ +if _PACKAGENAME is '__main__': + _PACKAGENAME = 'DCCsi.SDK.substance.builder.substance_tools' + +import azpy +_LOGGER = azpy.initialize_logger(_PACKAGENAME) +_LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# Defining CONSTANTS +# To Do: shouldn't need this _BASE_ENVVAR_DICT (replace with dynaconf config) +from collections import OrderedDict +_SYNTH_ENV_DICT = OrderedDict() +_SYNTH_ENV_DICT = azpy.synthetic_env.stash_env(_SYNTH_ENV_DICT) +# grab a specific path from the base_env +_PATH_DCCSI = _SYNTH_ENV_DICT[ENVAR_DCCSIG_PATH] +_LY_PROJECT_PATH = _SYNTH_ENV_DICT[ENVAR_LY_PROJECT_PATH] + +# build some reuseable path parts +_PATH_MOCK_ASSETS = Path(_LY_PROJECT_PATH, 'Assets').norm() +_PATH_MOCK_SUBLIB = Path(_PATH_MOCK_ASSETS, 'SubstanceSource').norm() + +_PATH_MOCK_SBS = Path(_PATH_MOCK_SUBLIB, 'sbs').norm() +_PATH_MOCK_SBSAR = Path(_PATH_MOCK_SUBLIB, 'sbsar').norm() + +_PATH_MOCK_MAT = Path(_PATH_MOCK_ASSETS, 'Textures').norm() +_PATH_MOCK_MAT_SUB = Path(_PATH_MOCK_MAT, 'Substance').norm() + +_PATH_INPUT_SBS = Path(_PATH_MOCK_SBS, 'bronze_yellow.sbs').norm() +_PATH_COOK_OUTPUT = _PATH_MOCK_SBSAR.norm() +_PATH_RENDER_OUTPUT = _PATH_MOCK_MAT_SUB + +_SBS_NAME = _PATH_INPUT_SBS.split('.sbs')[0].split('\\')[-1] + +_PYSBS_CONTEXT = pysbs_context.Context() +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +@click.group() +def builder_tools(): + pass +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +@builder_tools.command() +@click.option('--sbsar_path', default=_PATH_COOK_OUTPUT, help='Sbsar directory.') +@click.option('--sbsar_name', default=_PATH_INPUT_SBS.stem, help='Sbsar name.') +@click.option('--output_type', default='inputs', help='Output Type: \n' + 'tex_maps | presets | inputs | input | input_type | params') +def info(sbsar_path, sbsar_name, output_type): + """SBSAR information""" + click.echo(sbsar_utils.output_info(sbsar_path, sbsar_name, output_type)) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +@builder_tools.command() +@click.option('--sbs_path', default=_PATH_INPUT_SBS, help='Sbs path.') +@click.option('--sbsar_path', default=_PATH_COOK_OUTPUT, help='Sbsar output path.') +def sbs2sbsar(sbs_path, sbsar_path): + """ Cook SBSAR from SBS""" + sbsar_utils.cook_sbsar(sbs_path, sbsar_path) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +@builder_tools.command() +@click.option('--sbsar_path', default=_PATH_COOK_OUTPUT, help='Sbsar directory.') +@click.option('--sbsar_name', default=_PATH_INPUT_SBS.stem, help='Sbsar name.') +@click.option('--tex_path', default=_PATH_RENDER_OUTPUT, help='Texture output path.') +@click.option('--preset', required=False, help='Preset') +@click.option('--output_size', default=9, help='512x512, 9 | 1024x1024, 10 | 2048x2048, 11') +def render(sbsar_path, sbsar_name, tex_path, preset, output_size): + """ Render textures maps from SBSAR""" + sbsar_utils.render_sbsar(sbsar_path, sbsar_name, tex_path, preset, output_size) +# ------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_PACKAGENAME)) + + _LOGGER.debug(builder_tools()) + + # remove the logger + del _LOGGER +# ---- END --------------------------------------------------------------- \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PyQt5_qtextedit_stdout.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PyQt5_qtextedit_stdout.py new file mode 100644 index 0000000000..d101248433 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PyQt5_qtextedit_stdout.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- +# https://gist.github.com/blubberdiblub/007bb92991d01ad29877931f75260b39 + +import sys + +from PyQt5.QtCore import pyqtSignal, pyqtSlot, QProcess, QTextCodec +from PyQt5.QtGui import QTextCursor +from PyQt5.QtWidgets import QApplication, QPlainTextEdit + + +class ProcessOutputReader(QProcess): + produce_output = pyqtSignal(str) + + def __init__(self, parent=None): + super().__init__(parent=parent) + + # merge stderr channel into stdout channel + self.setProcessChannelMode(QProcess.MergedChannels) + + # prepare decoding process' output to Unicode + codec = QTextCodec.codecForLocale() + self._decoder_stdout = codec.makeDecoder() + # only necessary when stderr channel isn't merged into stdout: + # self._decoder_stderr = codec.makeDecoder() + + self.readyReadStandardOutput.connect(self._ready_read_standard_output) + # only necessary when stderr channel isn't merged into stdout: + # self.readyReadStandardError.connect(self._ready_read_standard_error) + + @pyqtSlot() + def _ready_read_standard_output(self): + raw_bytes = self.readAllStandardOutput() + text = self._decoder_stdout.toUnicode(raw_bytes) + self.produce_output.emit(text) + + # only necessary when stderr channel isn't merged into stdout: + # @pyqtSlot() + # def _ready_read_standard_error(self): + # raw_bytes = self.readAllStandardError() + # text = self._decoder_stderr.toUnicode(raw_bytes) + # self.produce_output.emit(text) + + +class MyConsole(QPlainTextEdit): + + def __init__(self, parent=None): + super().__init__(parent=parent) + + self.setReadOnly(True) + self.setMaximumBlockCount(10000) # limit console to 10000 lines + + self._cursor_output = self.textCursor() + + @pyqtSlot(str) + def append_output(self, text): + self._cursor_output.insertText(text) + self.scroll_to_last_line() + + def scroll_to_last_line(self): + cursor = self.textCursor() + cursor.movePosition(QTextCursor.End) + cursor.movePosition(QTextCursor.Up if cursor.atBlockStart() else + QTextCursor.StartOfLine) + self.setTextCursor(cursor) + + +# create the application instance +app = QApplication(sys.argv) + +# create a process output reader +reader = ProcessOutputReader() + +# create a console and connect the process output reader to it +console = MyConsole() +reader.produce_output.connect(console.append_output) + +reader.start('python', ['-u', 'C:\\dccapi\\dev\\Gems\\DccScriptingInterface\\LyPy\\si_substance\\builder\\watchdog' + '\\__init__.py', 'C:\\Users\\chunghao\\Documents\\Allegorithmic\\Substance Designer' + '\\sbsar']) # start the process +console.show() # make the console visible +app.exec_() # run the PyQt main loop \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PySide2_qtextedit_stdout.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PySide2_qtextedit_stdout.py new file mode 100644 index 0000000000..11559b4ff5 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PySide2_qtextedit_stdout.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +import sys + +from PySide2.QtCore import QProcess, Signal, Slot, QTextCodec +from PySide2.QtGui import QTextCursor +from PySide2.QtWidgets import QApplication, QPlainTextEdit +from PySide2.QtCore import QTimer + +class ProcessOutputReader(QProcess): + produce_output = Signal(str) + + def __init__(self, parent=None): + super().__init__(parent=parent) + + # merge stderr channel into stdout channel + self.setProcessChannelMode(QProcess.MergedChannels) + # prepare decoding process' output to Unicode + self._codec = QTextCodec.codecForLocale() + self._decoder_stdout = self._codec.makeDecoder() + # only necessary when stderr channel isn't merged into stdout: + # self._decoder_stderr = codec.makeDecoder() + + self.readyReadStandardOutput.connect(self._ready_read_standard_output) + # only necessary when stderr channel isn't merged into stdout: + # self.readyReadStandardError.connect(self._ready_read_standard_error) + + @Slot() + def _ready_read_standard_output(self): + raw_bytes = self.readAllStandardOutput() + text = self._decoder_stdout.toUnicode(raw_bytes) + self.produce_output.emit(text) + + # only necessary when stderr channel isn't merged into stdout: + # @Slot() + # def _ready_read_standard_error(self): + # raw_bytes = self.readAllStandardError() + # text = self._decoder_stderr.toUnicode(raw_bytes) + # self.produce_output.emit(text) + + +class MyConsole(QPlainTextEdit): + + def __init__(self, parent=None): + super().__init__(parent=parent) + + self.setReadOnly(True) + self.setMaximumBlockCount(10000) # limit console to 10000 lines + + self._cursor_output = self.textCursor() + + @Slot(str) + def append_output(self, text): + self._cursor_output.insertText(text) + self.scroll_to_last_line() + + def scroll_to_last_line(self): + cursor = self.textCursor() + cursor.movePosition(QTextCursor.End) + cursor.movePosition(QTextCursor.Up if cursor.atBlockStart() else + QTextCursor.StartOfLine) + self.setTextCursor(cursor) + + def output_text(self, text): + self._cursor_output.insertText(text) + self.scroll_to_last_line() + +# create the application instance +app = QApplication(sys.argv) + +# create a process output reader +reader = ProcessOutputReader() + +# create a console and connect the process output reader to it +console = MyConsole() +reader.produce_output.connect(console.append_output) + +reader.start('python', ['-u', 'C:\\dccapi\\dev\\Gems\\DccScriptingInterface\\LyPy\\si_substance\\builder\\watchdog' + '\\__init__.py', 'C:\\Users\\chunghao\\Documents\\Allegorithmic\\Substance Designer' + '\\sbsar']) # start the process +console.show() # make the console visible +# app.exec_() # run the PyQt main loop +timer = QTimer() +timer.timeout.connect(lambda: None) +timer.start(100) + +sys.exit(app.exec_()) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/main.py new file mode 100644 index 0000000000..ab44d0e41e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/main.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +import os +import sys + +from PySide2.QtCore import QFile, QSize +from PySide2.QtUiTools import QUiLoader +from PySide2.QtWidgets import QApplication, QSizePolicy +from PySide2.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QHBoxLayout + +_MODULE_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) +_UI_FILEPATH = "{0}\\\\sbs_builder_widget.ui".format(_MODULE_DIR_PATH) +_PROGRAM_NAME_VERSION = 'Substance Builder' + + +class UiLoader(QUiLoader): + def __init__(self, baseInstance): + super(UiLoader, self).__init__(baseInstance) + self._baseInstance = baseInstance + + def createWidget(self, classname, parent=None, name=""): + widget = super(UiLoader, self).createWidget( + classname, parent, name) + + if parent is None: + return self._baseInstance + else: + setattr(self._baseInstance, name, widget) + return widget + + +class MainWindow(QMainWindow): + def __init__(self, ui_file=_UI_FILEPATH, parent=None): + super().__init__(parent) + + # Setup central widget and layout + self.central_widget = QWidget() + self.central_layout = QVBoxLayout(self.central_widget) + self.central_layout.setContentsMargins(8, 8, 8, 8) + self.setCentralWidget(self.central_widget) + self.setup_layout(ui_file) + self.setMinimumSize(QSize(675, 825)) + + def setup_layout(self, ui_file): + self.layout = QHBoxLayout() + self.widget = MyWidget(ui_file, self) + self.widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + self.layout.addWidget(self.widget) + self.central_layout.addLayout(self.layout) + + +class MyWidget(QWidget): + def __init__(self, ui_file=_UI_FILEPATH, parent=None): + super().__init__(parent) + loader = UiLoader(parent) + file = QFile(ui_file) + file.open(QFile.ReadOnly) + loader.load(file, self) + file.close() + + +if __name__ == "__main__": + app = QApplication(sys.argv) + mainWindow = MainWindow(_UI_FILEPATH) + mainWindow.setWindowTitle(_PROGRAM_NAME_VERSION) + mainWindow.show() + sys.exit(app.exec_()) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_main.ui b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_main.ui new file mode 100644 index 0000000000..d5018156e0 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_main.ui @@ -0,0 +1,565 @@ + + + Dialog + + + + 0 + 0 + 400 + 560 + + + + + 0 + 0 + + + + + 0 + 560 + + + + Dialog + + + + + + + + + 0 + 240 + + + + Watcher + + + false + + + false + + + + + 122 + 44 + 211 + 20 + + + + Watch folder + + + + + + 340 + 44 + 25 + 19 + + + + ... + + + + + + 24 + 70 + 92 + 16 + + + + Wacher Extensions + + + + + + 24 + 44 + 64 + 16 + + + + Wacher Foler + + + + + + 24 + 21 + 81 + 17 + + + + On / Off + + + + + + 122 + 70 + 211 + 20 + + + + *.sbsar, *.sbs + + + + + + 30 + 100 + 331 + 131 + + + + + + + + + + 0 + 280 + + + + SBSAR + + + false + + + + + 20 + 150 + 70 + 16 + + + + RandomSeed + + + + + + 120 + 50 + 20 + 161 + + + + Qt::Vertical + + + + + + 240 + 100 + 121 + 23 + + + + Create .material + + + + + + 140 + 150 + 70 + 17 + + + + Glossness + + + + + + 20 + 100 + 21 + 16 + + + + Size + + + + + + 240 + 50 + 47 + 13 + + + + Name + + + + + + 20 + 30 + 41 + 16 + + + + Preset + + + + + + 240 + 190 + 121 + 23 + + + + Render textures + + + + + + 20 + 240 + 181 + 20 + + + + + + + 240 + 30 + 71 + 20 + + + + Atom Material + + + + + + 140 + 190 + 70 + 17 + + + + Opacity + + + true + + + + + + 140 + 170 + 81 + 17 + + + + Roughness + + + true + + + + + + 20 + 120 + 101 + 22 + + + + + 512 * 512 + + + + + 1024 * 1024 + + + + + 2048 * 2048 + + + + + + + 240 + 70 + 121 + 20 + + + + + + + 140 + 30 + 41 + 16 + + + + Output + + + + + + 20 + 50 + 101 + 22 + + + + + Grey Stone + + + + + Red Coral + + + + + Red Stone + + + + + + + 210 + 240 + 25 + 19 + + + + ... + + + + + + 10 + 210 + 361 + 20 + + + + Qt::Horizontal + + + + + + 140 + 90 + 70 + 17 + + + + Specular + + + + + + 140 + 110 + 70 + 17 + + + + Metallic + + + true + + + + + true + + + + 140 + 50 + 71 + 17 + + + + Base Color + + + true + + + + + + 240 + 240 + 121 + 23 + + + + Bake SBSAR from SBS + + + + + + 140 + 130 + 81 + 17 + + + + Normal map + + + + + + 220 + 50 + 20 + 161 + + + + Qt::Vertical + + + + + + 20 + 80 + 91 + 16 + + + + Parameters + + + + + + 20 + 170 + 101 + 22 + + + + + + + 140 + 70 + 70 + 17 + + + + Albedo + + + + + + + + Qt::Horizontal + + + + + + + + + + + toolButton + pressed() + lineEdit + clear() + + + 362 + 63 + + + 237 + 63 + + + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_widget.ui b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_widget.ui new file mode 100644 index 0000000000..2d4d17cbca --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_widget.ui @@ -0,0 +1,494 @@ + + + Form + + + + 0 + 0 + 651 + 807 + + + + Form + + + + + + + + Watcher + + + + + + + + On / Off + + + + + + + Wacher Foler + + + + + + + Watch folder + + + + + + + ... + + + + + + + Wacher Extensions + + + + + + + *.sbsar, *.sbs + + + + + + + + + + + + + + + Qt::Horizontal + + + + + + + Sbsar + + + + + + 1 + + + true + + + false + + + 100 + + + true + + + true + + + false + + + 20 + + + false + + + + Item #01 + + + + false + false + PreferDefault + + + + + + Item #02 + + + + + Item #03 + + + + + Item #04 + + + + + Item #05 + + + + + Item #06 + + + + + Item #07 + + + + + Item #08 + + + + + File Path + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item01.sbsar + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item02.sbsar + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item03.sbsar + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item04.sbsar + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item05.sbsar + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item06.sbsar + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item07.sbsar + + + + + C:\Users\chunghao\Documents\Allegorithmic\Substance Designer\sbsar\item08.sbsar + + + + + + + + + + Parameters + + + + + + + + Preset + + + + + + + Size + + + + + + + RandomSeed + + + + + + + + + + + + Grey Stone + + + + + Red Coral + + + + + Red Stone + + + + + + + + + 512 * 512 + + + + + 1024 * 1024 + + + + + 2048 * 2048 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Vertical + + + + + + + Output + + + + + + true + + + Base Color + + + true + + + + + + + Albedo + + + + + + + Specular + + + + + + + Metallic + + + true + + + + + + + Normal map + + + + + + + Glossness + + + + + + + Roughness + + + true + + + + + + + Opacity + + + true + + + + + + + + + + Qt::Vertical + + + + + + + Atom Material + + + + + + + + + + Name + + + + + + + + + + + + Create .material + + + + + + + Render textures + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + ... + + + + + + + Bake SBSAR from SBS + + + + + + + + + + + + + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_widget_empty.ui b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_widget_empty.ui new file mode 100644 index 0000000000..b209ffba19 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/sbs_builder_widget_empty.ui @@ -0,0 +1,241 @@ + + + Form + + + + 0 + 0 + 461 + 502 + + + + Form + + + + + + + + Watcher + + + + + + + + On / Off + + + + + + + Wacher Foler + + + + + + + Watch folder + + + + + + + ... + + + + + + + Wacher Extensions + + + + + + + *.sbsar, *.sbs + + + + + + + + + + + + + + + Qt::Horizontal + + + + + + + Sbsar + + + + + + + + Parameters + + + + + + + + Qt::Vertical + + + + + + + Output + + + + + + true + + + Base Color + + + true + + + + + + + Albedo + + + + + + + Specular + + + + + + + Metallic + + + true + + + + + + + Normal map + + + + + + + Glossness + + + + + + + Roughness + + + true + + + + + + + Opacity + + + true + + + + + + + + + + Qt::Vertical + + + + + + + Atom Material + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + ... + + + + + + + Bake SBSAR from SBS + + + + + + + + + + + + + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/selection_dialog.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/selection_dialog.py new file mode 100644 index 0000000000..8faea4620e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/selection_dialog.py @@ -0,0 +1,341 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- +import sys, os + +from PySide2 import QtCore, QtWidgets +from PySide2.QtCore import QTimer +from PySide2.QtCore import QProcess, Signal, Slot, QTextCodec +from PySide2.QtGui import QTextCursor +from PySide2.QtWidgets import QApplication, QPlainTextEdit +sys.path.insert(0, os.path.abspath('../..')) +import builder +# sys.path.insert(0, os.path.abspath('../ui/')) +# import main_win +sys.path.insert(0, os.path.abspath('../watchdog/')) +import watchdog + +class Window(QtWidgets.QDialog): + def __init__(self, parent=None): + super(Window, self).__init__(parent) + self.browseButton = self.create_button("&Browse...", self.browse) + self.findButton = self.create_button("&Find", self.find) + self.removeButton = self.create_button("&Remove", self.remove) + self.startWatch = self.create_button("&Start Watch", self.watch) + self.killButton = self.create_button("&Stop Watch", self.kill) + self.fileComboBox = self.createComboBox("*") + self.textComboBox = self.createComboBox() + # self.directoryComboBox = self.createComboBox(QtCore.QDir.currentPath()) + self.sbsarDirectory = "C:/Users/chunghao/Documents/Allegorithmic/Substance Designer/sbsar" + self.directoryComboBox = self.createComboBox(self.sbsarDirectory) + self.extensionLabel = QtWidgets.QLabel("Watch extensions:") + # textLabel = QtWidgets.QLabel("Containing text:") + self.directoryLabel = QtWidgets.QLabel("Watch directory:") + self.filesFoundLabel = QtWidgets.QLabel() + self.wacherLogLabel = QtWidgets.QLabel("Watcher Log") + self.fileListLabel = QtWidgets.QLabel("File List") + self.sbsarPresetLabel = QtWidgets.QLabel("Sbsar Preset") + self.OutputResLabel = QtWidgets.QLabel("Output Size") + self.OutputsLabel = QtWidgets.QLabel("Outputs") + + self.watcher_log = QPlainTextEdit() + self.watcher_log.setReadOnly(True) + self.watcher_log.setMaximumBlockCount(10000) # limit console to 10000 lines + + self.watcher_log._cursor_output = self.watcher_log.textCursor() + + self.create_files_table() + + buttonsLayout = QtWidgets.QHBoxLayout() + buttonsLayout.addStretch() + buttonsLayout.addWidget(self.findButton) + # buttonsLayout.addWidget(self.removeButton) + buttonsLayout.addWidget(self.startWatch) + buttonsLayout.addWidget(self.killButton) + + self.mainLayout = QtWidgets.QGridLayout() + self.mainLayout.addWidget(self.extensionLabel, 0, 0) + self.mainLayout.addWidget(self.fileComboBox, 0, 1, 1, 2) + # self.mainLayout.addWidget(textLabel, 1, 0) + # self.mainLayout.addWidget(self.textComboBox, 1, 1, 1, 2) + self.mainLayout.addWidget(self.directoryLabel, 2, 0) + self.mainLayout.addWidget(self.wacherLogLabel, 3, 0) + self.mainLayout.addWidget(self.fileListLabel, 4, 0) + self.mainLayout.addWidget(self.directoryComboBox, 2, 1) + self.mainLayout.addWidget(self.browseButton, 2, 2) + self.mainLayout.addWidget(self.watcher_log, 3, 1, 1, 3) + self.mainLayout.addWidget(self.filesTable, 4, 1, 1, 3) + self.mainLayout.addWidget(self.filesFoundLabel, 5, 1) + self.mainLayout.addLayout(buttonsLayout, 6, 0, 1, 3) + self.setLayout(self.mainLayout) + + self.setWindowTitle("Substance Builder") + self.resize(800, 300) + self.path = self.directoryComboBox.currentText() + self.groupbox_outputs = QtWidgets.QGroupBox("Outputs") + self.watcher_script = "C:/dccapi/dev/Gems/DccScriptingInterface/LyPy/si_substance/builder/watchdog/__init__.py" + + @Slot(str) + def append_output(self, text): + self.watcher_log._cursor_output.insertText(text) + self.scroll_to_last_line() + + def scroll_to_last_line(self): + cursor = self.watcher_log.textCursor() + cursor.movePosition(QTextCursor.End) + cursor.movePosition(QTextCursor.Up if cursor.atBlockStart() else + QTextCursor.StartOfLine) + self.watcher_log.setTextCursor(cursor) + + def output_text(self, text): + self.watcher_log._cursor_output.insertText(text) + self.watcher_log.scroll_to_last_line() + def browse(self): + # self.directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Find Files", + # QtCore.QDir.currentPath()) + self.directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Find watcher folder", + "C:/Users/chunghao/Documents/Allegorithmic/Substance Designer/sbsar") + if self.directory: + if self.directoryComboBox.findText(self.directory) == -1: + self.directoryComboBox.addItem(self.directory) + + self.directoryComboBox.setCurrentIndex(self.directoryComboBox.findText(self.directory)) + self.path = self.directory + self.find() + return self.path + + @staticmethod + def updateComboBox(comboBox): + if comboBox.findText(comboBox.currentText()) == -1: + comboBox.addItem(comboBox.currentText()) + + def find(self): + self.filesTable.setRowCount(0) + + fileName = self.fileComboBox.currentText() + text = self.textComboBox.currentText() + self.path = self.directoryComboBox.currentText() + # self.path = "C:/Users/chunghao/Documents/Allegorithmic/Substance Designer/sbsar" + + self.updateComboBox(self.fileComboBox) + self.updateComboBox(self.textComboBox) + self.updateComboBox(self.directoryComboBox) + + self.currentDir = QtCore.QDir(self.path) + if not fileName: + fileName = "*" + files = self.currentDir.entryList([fileName], + QtCore.QDir.Files | QtCore.QDir.NoSymLinks) + + if text: + files = self.find_files(files, text) + self.show_files(files) + return self.path + + def find_files(self, files, text): + progressDialog = QtWidgets.QProgressDialog(self) + + progressDialog.setCancelButtonText("&Cancel") + progressDialog.setRange(0, len(files)) + progressDialog.setWindowTitle("Find Files") + + foundFiles = [] + + for i in range(len(files)): + progressDialog.setValue(i) + progressDialog.setLabelText("Searching file number %d of %d..." % (i, len(files))) + QtCore.qApp.processEvents() + + if progressDialog.wasCanceled(): + break + + inFile = QtCore.QFile(self.currentDir.absoluteFilePath(files[i])) + + if inFile.open(QtCore.QIODevice.ReadOnly): + stream = QtCore.QTextStream(inFile) + while not stream.atEnd(): + if progressDialog.wasCanceled(): + break + line = stream.readLine() + if text in line: + foundFiles.append(files[i]) + break + + progressDialog.close() + + return foundFiles + + def show_files(self, files): + for fn in files: + # file = QtCore.QFile(self.currentDir.absoluteFilePath(fn)) + # size = QtCore.QFileInfo(file).size() + + fileNameItem = QtWidgets.QTableWidgetItem(fn) + fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable) + # sizeItem = QtWidgets.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024))) + # sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight) + # sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable) + row = self.filesTable.rowCount() + self.filesTable.insertRow(row) + self.filesTable.setItem(row, 0, fileNameItem) + # self.filesTable.setItem(row, 1, sizeItem) + + self.filesFoundLabel.setText("%d file(s) found (Double click on a file to open it)" % len(files)) + + def create_button(self, text, member): + button = QtWidgets.QPushButton(text) + button.clicked.connect(member) + return button + + def createComboBox(self, text=""): + comboBox = QtWidgets.QComboBox() + comboBox.setEditable(True) + comboBox.addItem(text) + comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred) + return comboBox + + def create_files_table(self): + self.filesTable = QtWidgets.QTableWidget(0, 1) + self.filesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) + + self.filesTable.setHorizontalHeaderLabels(("File Name", "")) + self.filesTable.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + # self.filesTable.verticalHeader().hide() + self.filesTable.verticalHeader().show() + self.filesTable.setShowGrid(True) + self.filesTable.cellActivated.connect(self.open_fileOfitem) + + def create_sbsar_params(self): + self.mainLayout.addWidget(self.OutputsLabel, 9, 0) + self.sbsarName = self.item.text().replace(".sbsar", "") + self.groupbox_outputs = QtWidgets.QGroupBox("Outputs") + self.horizontalLayoutOuputs = QtWidgets.QHBoxLayout(self.groupbox_outputs) + self.horizontalLayoutOuputs.setObjectName(("horizontalLayoutOuputs")) + # self.vertical_layout_outputs = QtWidgets.QVBoxLayout(self.groupbox_outputs) + # self.vertical_layout_outputs.setObjectName("vertical_layout_outputs") + self.sbsar_tex_outputs = builder.output_info(self.path, self.sbsarName)['_outputs'] + + for index, tex in enumerate(self.sbsar_tex_outputs): + print(tex, end=" ") + self.sbsar_tex_outputs[index] = QtWidgets.QCheckBox(self.groupbox_outputs) + self.sbsar_tex_outputs[index].setEnabled(True) + self.sbsar_tex_outputs[index].setChecked(True) + self.sbsar_tex_outputs[index].setObjectName(self.sbsarName+"_"+tex) + self.sbsar_tex_outputs[index].setText(tex) + self.horizontalLayoutOuputs.addWidget(self.sbsar_tex_outputs[index]) + self.mainLayout.addWidget(self.groupbox_outputs, 9, 1, 1, 3) + print("\n") + + def create_sbsar_presets(self): + self.mainLayout.addWidget(self.sbsarPresetLabel, 7, 0) + self.sbsar_presets = builder.output_info(self.path, self.item.text().replace(".sbsar", ""))['_presets'] + self.comboBox_SbsarPreset = QtWidgets.QComboBox(self) + for self.presetItem in self.sbsar_presets: + print(self.presetItem, end=", ") + preset_index = 0 + self.comboBox_SbsarPreset.addItem(self.presetItem) + self.comboBox_SbsarPreset.setItemText(preset_index, self.presetItem) + preset_index += 1 + + self.mainLayout.addWidget(self.comboBox_SbsarPreset, 7, 1, 1, 3) + print("\n") + self.comboBox_SbsarPreset.activated[str].connect(self.preset_selected) + + def preset_selected(self, text): + self.selected_text = text + print(self.selected_text) + + def create_tex_res(self): + self.mainLayout.addWidget(self.OutputResLabel, 8, 0) + self.resSelector = QtWidgets.QComboBox(self) + self.res = ["512x512", "1024x1024", "2048x2048"] + self.resSelector.addItems(self.res) + + self.mainLayout.addWidget(self.resSelector, 8, 1, 1, 3) + self.resSelector.activated[str].connect(self.res_selected) + + def res_selected(self): + if self.resSelector.currentIndex() == 0: print("$outputsize@9,9") + elif self.resSelector.currentIndex() == 1: print("$outputsize@10,10") + elif self.resSelector.currentIndex() == 2: print("$outputsize@11,11") + + def remove(self): + + self.mainLayout.removeWidget(self.groupbox_outputs) + self.groupbox_outputs.close() + + def kill(self): + reader.kill() + + def watch(self): + reader.start('python', ['-u', window.watcher_script, window.sbsarDirectory]) + + def open_fileOfitem(self, row, column): + self.item = self.filesTable.item(row, 0) + print(self.path+"/"+self.item.text()) + if self.item.text().split(".")[-1] == "sbsar": + self.create_sbsar_presets() + self.create_tex_res() + self.mainLayout.removeWidget(self.groupbox_outputs) + self.groupbox_outputs.close() + self.create_sbsar_params() + elif self.item.text().split(".")[-1] == "sbs": + print("This is a Substance File") + builder.cook_sbsar(self.path+"/"+self.item.text(), builder._context, self.path, self.item.text().split(".")[0]) + # builder.output_info() + +class ProcessOutputReader(QProcess): + produce_output = Signal(str) + + def __init__(self, parent=None): + super().__init__(parent=parent) + + # merge stderr channel into stdout channel + self.setProcessChannelMode(QProcess.MergedChannels) + # prepare decoding process' output to Unicode + self._codec = QTextCodec.codecForLocale() + self._decoder_stdout = self._codec.makeDecoder() + # only necessary when stderr channel isn't merged into stdout: + # self._decoder_stderr = codec.makeDecoder() + + self.readyReadStandardOutput.connect(self._ready_read_standard_output) + # only necessary when stderr channel isn't merged into stdout: + # self.readyReadStandardError.connect(self._ready_read_standard_error) + + @Slot() + def _ready_read_standard_output(self): + raw_bytes = self.readAllStandardOutput() + text = self._decoder_stdout.toUnicode(raw_bytes) + self.produce_output.emit(text) + + # only necessary when stderr channel isn't merged into stdout: + # @Slot() + # def _ready_read_standard_error(self): + # raw_bytes = self.readAllStandardError() + # text = self._decoder_stderr.toUnicode(raw_bytes) + # self.produce_output.emit(text) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + reader = ProcessOutputReader() + window = Window() + reader.produce_output.connect(window.append_output) + reader.start('python', ['-u', window.watcher_script, window.sbsarDirectory]) + window.show() + timer = QTimer() + timer.timeout.connect(lambda: None) + timer.start(10) + # sys.exit(reader.kill()) + sys.exit(app.exec_()) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BaseStyleSheet.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BaseStyleSheet.qss new file mode 100644 index 0000000000..420967440b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BaseStyleSheet.qss @@ -0,0 +1,67 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +/* ============================================================= */ +/* Global styles */ +/* ============================================================= */ + + +* +{ + background-color: #444444; + color: white; + font-family: "Amazon Ember"; + font-weight: 400; +} + +QMainWindow, +QDialog, +QDockWidget +{ + color: #cccccc; + background-color: #393a3c; +} + +QTextEdit, +QPlainText, +QLineEdit, +QSpinBox, +QDoubleSpinBox, +QComboBox +{ + background-color: #e9e9e9; + color: black; + font-family: "Amazon Ember"; + border-radius: 2px; + border-width: 0px; + font-size: 12px; + line-height: 16px; +} + +@import "Text.qss"; +@import "PushButton.qss"; +@import "Menu.qss"; +@import "CheckBox.qss"; +@import "RadioButton.qss"; +@import "ToolTip.qss"; +@import "ProgressBar.qss"; +@import "ColorPicker.qss"; +@import "Slider.qss"; +@import "Card.qss"; +@import "BrowseEdit.qss"; +@import "BreadCrumbs.qss"; +@import "LineEdit.qss"; +@import "ComboBox.qss"; +@import "SegmentControl.qss"; +@import "SpinBox.qss"; +@import "ScrollBar.qss"; diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BreadCrumbs.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BreadCrumbs.qss new file mode 100644 index 0000000000..f9601c1668 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BreadCrumbs.qss @@ -0,0 +1,22 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +/* + +BreadCrumbs are QWidgets with a QHBoxLayout with 0 content margins and one QLabel child widget. + +*/ + +AzQtComponents--BreadCrumbs +{ +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BrowseEdit.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BrowseEdit.qss new file mode 100644 index 0000000000..33296a1215 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BrowseEdit.qss @@ -0,0 +1,61 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +AzQtComponents--BrowseEdit +{ + border-color: transparent; + border-width: 2px; + border-style: solid; + border-radius: 3px; +} + +AzQtComponents--BrowseEdit QLineEdit +{ + height: 16px; + border-width: 0px; + border-style: solid; + border-color: #444444; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; +} + +AzQtComponents--BrowseEdit QLineEdit:focus +{ + background-color: #FFFFFF; + border-color: #FFFFFF; +} + +AzQtComponents--BrowseEdit QLineEdit:disabled +{ + background-color: #777777; + border-color: #777777; + color: #999999; +} + +AzQtComponents--BrowseEdit QToolButton +{ + max-width: 15px; + min-width: 15px; + max-height: 14px; + min-height: 14px; + background-color: #444444; + border-color: #000000; + border-width: 1px; + border-style: solid; + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Card.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Card.qss new file mode 100644 index 0000000000..471a2fc654 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Card.qss @@ -0,0 +1,154 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +AzQtComponents--Card +{ + margin: 0px; + padding: 0px; + border: 1px solid rgb(33, 34, 35); + border-radius: 2px; +} + +AzQtComponents--CardNotification +{ + background-color: #1AFDC32D; + margin: 2px; + border: 1px solid #FDC32D; + border-radius: 2px; +} + +AzQtComponents--CardNotification #HeaderFrame, +AzQtComponents--CardNotification #Icon, +AzQtComponents--CardNotification #Title +{ + background-color: transparent; + border: none; +} + +/** + * CardHeader is a QFrame with a QHBoxLayout that contains the following children: + * #Expander: a QCheckBox used as a "tree expander". + * #Icon: a QLabel displaying an icon. The icon is set from c++. + * #Title: a QLabel displaying text. + * #ContextMenu: a QPushButton used to launch a context menu. + */ + +AzQtComponents--CardHeader +{ + margin: 0px; + padding: 0px; + border: none; +} + +AzQtComponents--CardHeader #Background +{ + margin: 2px; + padding: 0px; + border: none; + background-image: none; + background-color: transparent; +} + +.primaryCardHeader +{ + background-color: #222222; +} + +.secondaryCardHeader +{ + background-color: transparent; +} + +AzQtComponents--CardHeader #Background[readOnly=true] +{ + + background-repeat: repeat-xy; +} + +AzQtComponents--CardHeader #Background[readOnly=false] +{ + background-image: none; +} + +AzQtComponents--CardHeader #Title +{ + font-weight: bold; + background-color: transparent; +} + +AzQtComponents--CardHeader #Expander +{ + width: 16px; + height: 16px; + qproperty-flat: true; + border: none; + color: transparent; + background-color: transparent; + selection-color: transparent; + selection-background-color: transparent; + image: none; +} + +AzQtComponents--CardHeader #Expander:enabled:checked +{ + image: url(:/Cards/img/UI20/Cards/group_open.png); +} + +AzQtComponents--CardHeader #Expander:enabled:!checked +{ + image: url(:/Cards/img/UI20/Cards/group_closed.png); +} + +AzQtComponents--CardHeader #Icon, +AzQtComponents--CardHeader #WarningIcon +{ + width: 16px; + height: 16px; + border: none; + background-color: transparent; +} + +AzQtComponents--CardHeader #ContextMenu +{ + qproperty-flat: true; + border: none; + color: transparent; + background-color: transparent; + selection-color: transparent; + selection-background-color: transparent; + image: url(:/Cards/img/UI20/Cards/menu_ico.png); +} + +AzQtComponents--CardHeader #Help +{ + qproperty-flat: true; + border: none; + color: transparent; + background-color: transparent; + selection-color: transparent; + selection-background-color: transparent; + image: url(:/Cards/img/UI20/Cards/help.png); +} + +.separator +{ + color: #999999; +} + +AzQtComponents--Card #SeparatorContainer +{ + margin-left: 2px; + margin-right: 2px; + border: none; +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/CheckBox.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/CheckBox.qss new file mode 100644 index 0000000000..192f60db49 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/CheckBox.qss @@ -0,0 +1,106 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QCheckBox +{ + font-size: 12px; + line-height: 18px; + color: rgb(204, 204, 204); + outline: 0; +} + +QCheckBox::indicator:!focus { + width: 14px; + height: 14px; + border: 1px solid white; + border-radius: 2px; + margin: 2px; +} + +QCheckBox::indicator:focus { + width: 16px; + height: 16px; + border: 2px solid rgb(201, 170, 254); + border-radius: 4px; + margin: 0px; +} + +QCheckBox::indicator:disabled { + border-color: rgb(128, 128, 128); +} + +QCheckBox::indicator:indeterminate:!focus { + image: url(../builder/ui/stylesheets/img/UI20/combo-tristate.png); +} + +QCheckBox::indicator:indeterminate:focus { + image: url(../builder/ui/stylesheets/img/UI20/combo-tristate-focus.png); +} + +QCheckBox::indicator:checked:!focus { + image: url(../builder/ui/stylesheets/img/UI20/combo-checked.png); +} + +QCheckBox::indicator:checked:focus { + image: url(../builder/ui/stylesheets/img/UI20/combo-checked-focus.png); +} + +QCheckBox::indicator:checked:disabled { + image: url(../builder/ui/stylesheets/img/UI20/combo-checked-disabled.png); +} + +QCheckBox[class="ToggleSwitch"]::indicator +{ + width: 32px; + height: 16px; + border-width: 0px; + margin: 2px; +} + +QCheckBox[class="ToggleSwitch"]::indicator:Unchecked +{ + image: url(../builder/ui/stylesheets/img/UI20/toggle-unchecked.png); +} + +QCheckBox[class="ToggleSwitch"]::indicator:disabled +{ + image: url(../builder/ui/stylesheets/img/UI20/toggle-unchecked-disabled.png); +} + +QCheckBox[class="ToggleSwitch"]::indicator:Unchecked:focus +{ + width: 36px; + height: 20px; + border-width: 0px; + margin: 0px; + image: url(../builder/ui/stylesheets/img/UI20/toggle-unchecked-focus.png); +} + +QCheckBox[class="ToggleSwitch"]::indicator:Checked +{ + image: url(../builder/ui/stylesheets/img/UI20/toggle-checked.png); +} + +QCheckBox[class="ToggleSwitch"]::indicator:Checked:disabled +{ + image: url(../builder/ui/stylesheets/img/UI20/toggle-checked-disabled.png); +} + +QCheckBox[class="ToggleSwitch"]::indicator:Checked:focus +{ + width: 36px; + height: 20px; + border-width: 0px; + margin: 0px; + image: url(../builder/ui/stylesheets/img/UI20/toggle-checked-focus.png); +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ColorPicker.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ColorPicker.qss new file mode 100644 index 0000000000..d25ea8d2fd --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ColorPicker.qss @@ -0,0 +1,131 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + + +AzQtComponents--ColorPicker +{ + padding: 100px; +} + +AzQtComponents--ColorPicker * +{ + font-size: 12px; +} + +AzQtComponents--ColorPicker QTextEdit, +AzQtComponents--ColorPicker QPlainText, +AzQtComponents--ColorPicker QLineEdit, +AzQtComponents--ColorPicker QSpinBox, +AzQtComponents--ColorPicker QDoubleSpinBox +{ + padding-bottom: -2px; +} + +AzQtComponents--ColorPicker QToolButton +{ + border: none; + max-width: 16px; + min-width: 16px; + max-height: 16px; + min-height: 16px; + background-color: transparent; +} + +AzQtComponents--ColorPicker QLabel, +AzQtComponents--ColorPicker QCheckBox, +AzQtComponents--PaletteView, +AzQtComponents--ColorPicker #Container +{ + background-color: transparent; +} + +AzQtComponents--ColorPicker QScrollArea +{ + border: none; + background-color: transparent; +} + +AzQtComponents--ColorPicker QLabel +{ + padding: 0px; + margin: 0px; +} + +AzQtComponents--PaletteCard AzQtComponents--CardHeader +{ + background-color: transparent; +} + +AzQtComponents--PaletteCard AzQtComponents--CardHeader #Title +{ + font-weight: normal; +} + +AzQtComponents--PaletteCard[modified="true"] AzQtComponents--CardHeader #Title +{ + color: #ffa500; +} + +AzQtComponents--PaletteCard AzQtComponents--CardHeader #Expander:enabled:checked +{ + image: url(:/ColorPickerDialog/PaletteCard/open.png); +} + +AzQtComponents--PaletteCard AzQtComponents--CardHeader #Expander:enabled:!checked +{ + image: url(:/ColorPickerDialog/PaletteCard/closed.png); +} + +AzQtComponents--ColorPicker QSpinBox, +AzQtComponents--ColorPicker QDoubleSpinBox +{ + padding-left: 0px; +} + +AzQtComponents--ColorPicker QSpinBox::down-button, +AzQtComponents--ColorPicker QSpinBox::up-button, +AzQtComponents--ColorPicker QDoubleSpinBox::down-button, +AzQtComponents--ColorPicker QDoubleSpinBox::up-button +{ + width: 0px; + border-style: none; +} + +AzQtComponents--ColorPicker .HorizontalSeparator +{ + border-top: 1px solid #393a3c; + border-bottom: 1px solid #393a3c; + border-left: none; + border-right: none; + background: #222222; +} + +AzQtComponents--ColorPicker AzQtComponents--PaletteView +{ + border: none; +} + +AzQtComponents--ColorGrid, +AzQtComponents--ColorPreview, +AzQtComponents--Swatch +{ + /* Note: Swatches will ignore any 'background*' property set here */ + border: 1px solid #333333; + border-radius: 2px; +} + +AzQtComponents--Swatch:selected +{ + /* Note: Swatches will ignore any 'background*' property set here */ + border: 2px solid #C8ABFF; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ComboBox.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ComboBox.qss new file mode 100644 index 0000000000..141b3a0579 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ComboBox.qss @@ -0,0 +1,111 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +/* NOTE: a number of QComboBox properties are defined in BaseStyleSheet.qss already, along with other text entry controls */ + +/* ComboBox */ + +QComboBox +{ + height: 16px; + padding-left: 8px; + margin: 4px; + font-size: 12px; +} + +QComboBox:focus +{ + background-color: #FFFFFF; + margin: 2px; + border-width: 2px; + border-style: solid; + border-radius: 4px; + border-color: #C09EFF; +} + +QComboBox:disabled +{ + background-color: #777777; + color: #999999; +} + +QComboBox::drop-down +{ + border-width: 0; +} + +QComboBox::down-arrow +{ + image: url("../builder/ui/stylesheets/img/triangle3.png"); +} + +QComboBox::down-arrow:disabled +{ + image: url("../builder/ui/stylesheets/img/triangle1.png"); +} + +/* Popup */ + +QComboBox QAbstractItemView +{ + background-color: #222222; + padding: 4px 0px 4px 0px; + border-radius: 2px; + outline: none; /* Disable focus rect */ + show-decoration-selected: 1; +} + +QComboBox QAbstractItemView::item +{ + color: #FFFFFF; + padding-top: 6px; + padding-bottom: 6px; + padding-right: 24px; + padding-left: 2px; /* There is already 22px from the check mark */ + + /* Without that the padding don't apply */ + border: 0px solid transparent; +} + +/* + This is needed as a result of using padding / border in ::item as + selection-background-color and selection-color are no more honored... +*/ +QComboBox QAbstractItemView::item:selected +{ + background-color: #444444; + color: #FFFFFF; +} + +QComboBox QAbstractItemView::item:disabled +{ + color: #555555; +} + +QComboBox QAbstractItemView::separator +{ + height: 1px; + background: #444444; +} + +QComboBox QAbstractItemView::indicator +{ + /* Keep in sync with the check mark image size */ + width: 12px; + height: 9px; + image: none; +} + +QComboBox QAbstractItemView::indicator:checked +{ + image: url(../builder/ui/stylesheets/img/menu-check.png); +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/LYstyle.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/LYstyle.qss new file mode 100644 index 0000000000..7997f871b7 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/LYstyle.qss @@ -0,0 +1,2022 @@ +/*------------------------------------------------------------------------------------*/ + +/*! + @copyright Allegorithmic. All rights reserved. +*/ + +/* [Generic Stylesheet] ----------------------------------------------------- */ +/* +* { + font-family: "Segoe UI"; +}*/ + +*{ +outline: none; +} + +QCheckBox, +QListView, +QPushButton, +QRadioButton, +QTabBar, +QToolBar, +QToolBox, +QTreeView { + icon-size: 24px; +} + +/* QWidget */ +QMainWindow, +QWidget:window { + background-color: #444444; + color: #555555; +} + +QDockWidget { + background-color: #444444; + border: 4 solid #444444; +} + +QWidget { + background: #444444; + color: #c8c8c8; +} + +/* QFrame: noframe: 0, hline: 4, vline: 5 */ +QFrame { + color: #c8c8c8; +} +QFrame[frameShape="3"] { + background-color: #5a5a5a; + border-color: #808080 transparent #404040 transparent; + border-style: solid; + border-width: 1px; + padding: 3px; +} +QFrame[frameShape="4"], +QFrame[frameShape="5"] { + background: #2b2b2b; + border: none; + color: transparent; + qproperty-frameShadow: "Plain"; +} +QFrame[frameShape="4"] { + min-height: 1px; + max-height: 1px; + margin: 4px 0; +} +QFrame[frameShape="5"] { + min-width: 1px; + max-width: 1px; + margin: 0 4px; +} + +/* QComboBox */ +QComboBox { + background: #E9E9E9; + color: #000000; + border: 1px solid #666666; + border-radius: 3px; + padding: 0px 0px 0px 4px; /* Needed to make the text color works on Linux */ + height: 16px; +} +QComboBox:hover { + color: #111111; +} + +QComboBox:disabled { + background-color: #777777; + color: #999999; + border: 1px solid #4d4d4d; +} +QComboBox:checked { + background-color: #E9E9E9; + color: #111111; +} +QComboBox::drop-down { + color: #c8c8c8; + border: none; +} +QComboBox::down-arrow { + image: url(../builder/ui/stylesheets/img/triangle3.png); +} +QComboBox::down-arrow:disabled { + image: url(../builder/ui/stylesheets/img/triangle1.png); +} +QComboBox QAbstractItemView { + border: 1px solid #141414; + background-color: #222222; + selection-background-color: #444444; + selection-color: #FFFFFF; + padding: 1px; + outline: none; +} +QComboBox[isSupported="false"] { + background-color: #FCB917; + color: #808080; + font-style:italic; +} + +/* QLabel */ +QLabel { + background: transparent; +} +QLabel[hasError="true"] { + background: #a94442; +} + +/* QTreeView */ +QTreeView { + background-color: transparent; + alternate-background-color: #444444; + show-decoration-selected: 1; + selection-background-color: transparent; + outline: none; + border:none; +} + +QTreeView::branch, +QTreeView::item{ + padding: 1px 0; + outline: none; +} + +QTreeView::branch:has-children { + border-image: none; +} +QTreeView::branch:has-children:closed { + image: url(:/alg/gui/icons/lightarrowright.svg); +} +QTreeView::branch:has-children:closed:selected { + image: url(:/alg/gui/icons/lightarrowright.svg); +} +QTreeView::branch:has-children:open { + image: url(:/alg/gui/icons/lightarrowdown.svg); +} +QTreeView::branch:has-children:open:selected { + image: url(:/alg/gui/icons/lightarrowdown.svg); +} + +/* QAbstractItemView */ +QAbstractItemView { + background: #444444; + border: none; + color: rgb(200,200,200); + outline: none; +} +QAbstractItemView::branch, +QAbstractItemView::item { + border: 0 solid transparent; + padding: 2px; + outline: none; + show-decoration-selected: 0; +} + +/* Buttons */ +QAbstractItemView::branch:!selected:hover, +QAbstractItemView::item:!selected:hover, +QAbstractItemView::indicator:!selected:hover, +QAbstractItemView::indicator:enabled:hover { + background-color: #5a5a5a; + color: white; + border: 0 solid transparent; +} + +QAbstractItemView::item:enabled:selected, +QAbstractItemView::branch:enabled:selected, +QAbstractItemView::indicator:enabled:selected, +QAbstractItemView::indicator:enabled:pressed, +QAbstractItemView::indicator:enabled:checked, +QSlider::handle:enabled:pressed { + border: 0 solid transparent; + background-color: #757575; + color: #1a1a1a; +} +QGroupBox::indicator:enabled:pressed, +QGroupBox::indicator:enabled:checked { + border: 0 solid transparent; + background-color: #757575; +} + +QAbstractItemView::item:enabled:selected { + background-color: #757575; + border: 0 solid #1a8dff; + color: white; +} + +QAbstractItemView::branch:enabled:selected{ + background-color: #757575; + border: 0 solid transparent; + color: white; +} + +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView{ + background: #262626; + show-decoration-selected: 0; +} + +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item{ + border: 1 solid transparent; + border-width: 1px 0px 1px 1px; + min-height: 22px; + max-height: 22px; + min-height: 24px; + padding: 0px; +} + +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item:enabled:selected, +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item:enabled:selected:hover, +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::branch:enabled:selected, +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::branch:enabled:selected:hover { + background: transparent; +} + +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item:enabled:selected, +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item:enabled:selected:hover{ + background: #141414; + border: 1 solid #1a8dff; + border-width: 1 0 1 1; +} + +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item:enabled:!selected:hover{ + border-width: 1 0 1 1; +} + +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item:last:enabled:selected, +Pfx--Editor--Components--Explorer--ComponentWidget QTreeView::item:last:enabled:selected:hover{ + border-width: 1 1 1 0; +} + + + + +/* QHeaderView */ + +QHeaderView::section { + background: #444444; + border-color: #252525; + border-style: solid; + border-width: 0px 0px 0px 0px; + color: #c8c8c8; + padding: 0px 3px; +} +QHeaderView::section:last { + border-right: 0px; +} + +QHeaderView::down-arrow { + image: url(:/alg/gui/icons/lightarrowdown.svg); + min-height:16px; + min-width: 16px; +} + +QHeaderView::up-arrow { + image: url(:/alg/gui/icons/lightarrowup.svg); + min-height:16px; + min-width: 16px; +} + +Pfx--DataBase--ResourceTableWidget QHeaderView::section { + background: #444444; + border-width: 0px 0px 0px 0px; +} + +/* QDockWidget */ +QDockWidget { + color: #c8c8c8; + font-weight: bold; +} +QDockWidget::title { + background: #252525; + color: #c8c8c8; + border-bottom: 0px solid black; + padding-left: 4px; + padding-top: 5px; +} + +/* DockWidgetTitleBar */ +Alg--Gui--DockWidgetTitleBar { + background: #2b2b2b; + padding-left: 2px; + icon-size: 24px; + /*padding-top: 6px; /* hack to get the same size for information titlebar */ + /*padding-bottom: 6px; /* hack to get the same size for information titlebar */ +} + +Alg--Gui--DockWidgetTitleBar #title-label{ + color: #e0e0e0; + background: #2b2b2b; + font-weight:bold; + font-size: 12px; + padding-left: 0px; +} +Alg--Gui--DockWidgetTitleBar #title-icon{ + background: #2b2b2b; + padding-right: 2px; +} + +Alg--Gui--DockWidgetTitleBarButton { + background: #2b2b2b; + padding: 0px; + min-height: 24px; + min-width: 24px; + +} + +Alg--Gui--DockWidgetTitleBarButton:enabled:hover{ + background: #1a1a1a; +} +Alg--Gui--DockWidgetTitleBarButton:enabled:checked, +Alg--Gui--DockWidgetTitleBarButton:enabled:pressed { + background: #1a1a1a; +} + +Alg--Gui--DockWidgetTitleBarButton#dockactionbutton{ + image: url(':alg/gui/icons/dockwidgetdock.svg'); +} +Alg--Gui--DockWidgetTitleBarButton#floatactionbutton{ + image: url(':alg/gui/icons/dockwidgetfloat.svg'); +} +Alg--Gui--DockWidgetTitleBarButton#closeactionbutton{ + image: url(':alg/gui/icons/dockwidgetclose.svg'); +} +Alg--Gui--DockWidgetTitleBarButton#maximizeactionbutton{ + image: url(':alg/gui/icons/dockwidgetmax.svg'); +} +Alg--Gui--DockWidgetTitleBarButton#restoreactionbutton{ + image: url(':alg/gui/icons/dockwidgetnormal.svg'); +} + + +Alg--Gui--DockWidgetTitleBarButton#persistentactionbutton{ + padding: 0px; + margin: 0px; + min-width: 24px; + min-height: 24px; + image: url(':/pfx/editor/gui/images/pin_off.svg'); +} +Alg--Gui--DockWidgetTitleBarButton#persistentactionbutton:checked { + image: url(':/pfx/editor/gui/images/pin_on.svg'); +} + +Alg--Gui--DockWidgetTitleBarButton[tabIsCurrent="false"]:hover{ + background: #0d0d0d; +} + +Alg--Gui--ConsoleWidget QPlainTextEdit { + qproperty-infoColor : #D0D0D0; + qproperty-warningColor : coral; + qproperty-errorColor : crimson; + qproperty-quotedItemColor : #40ff00ff; + qproperty-uriItemColor : #400000ff; +} + +/* QGroupBox */ +QGroupBox { + border: 1px solid #4d4d4d 18%; + margin: 18px 0 0 0; + padding: 2px 10px; + font-size: 12px; +} +QGroupBox::title { + background: solid; + color: #f4f4f4; + left: 0; + padding: 2px 5px; + top: -16px; +} + +QGroupBox QGroupBox{ + border: none; + margin: 18px 0 0 0; + padding: 2px 10px; + font-size: 11px; +} + +QGroupBox#bakerView2DGroupBox { + padding: 2px 0px 0px 0px; +} + +/* QMenu */ +QMenu { + color: #c8c8c8; + background: #4d4d4d; + border-left: 1 solid #444444; + border-bottom: 1 solid #444444; +} +QMenu::item { + border: 0 solid transparent; + padding: 0px 24px 0px 26px; + min-height: 24px; +} +QMenu::item:selected { + color: white; + background-color: #444444; +} +QMenu::item:disabled { + color: #606060; +} +QMenu::icon { + background-color: transparent; +} +QMenu::separator { + background-color: #444444; + height: 1px; +} + +QMenu#materialSelectionMenu::item { + min-height: 25px; +} + +/* QMenuBar */ +QMenuBar { + background-color: #444444; + color: #c8c8c8; + border-bottom: 0px solid #1a1a1a; + min-height: 18px; + font-size: 11px; +} +QMenuBar::item { + spacing: 20px; + padding: 2px 10px; + margin: 0px 0px; +} +QMenuBar::item:selected { + color: white; + background-color: #4d4d4d; +} + +QMenuBar::item:disabled { + color: #202020; +} + +Pfx--Editor--Python--PythonEditorWidget QMenuBar { + min-height: 18px; +} + +Alg--Gui3D--MenuBar--ScrollableMenubar::item { + background-color: #444444; + spacing: 0px; + padding: 4 6; +} + +Alg--Gui3D Q{ + font-size: 16px; +} + +/* QProgressBar */ +QProgressBar { + color: white; + background-color: #404040; + border: none; + height: 8px; + padding: 0; +} +QProgressBar::chunk { + width: 4px; + background-color: #30b29c; +} +QProgressDialog QProgressBar { + background-color: #404040; + border: 1px solid grey; + height: 16px; + padding: 0; + text-align: center center; +} +/* +QProgressDialog QProgressBar::chunk { + width: 4px; + background-color: #2b2b2b; +}*/ + +/* QRadioButton */ +QRadioButton::indicator { + border-radius: 0px; + height: 12px; + width: 12px; +} + +/* QScrollBar */ + +QScrollBar::handle:vertical, QScrollBar::handle:horizontal { + background: #555555; + border: 0px solid #202020; +} +QScrollBar::handle:vertical:hover, QScrollBar::handle:horizontal:hover { + background-color: #444444; + border: 1px solid #202020; +} +QScrollBar::handle:vertical:pressed, QScrollBar::handle:horizontal:pressed { + border: 1px solid #202020; + background-color: #444444; +} +QScrollBar::handle:vertical:disabled, QScrollBar::handle:horizontal:disabled { + background-color: transparent; + border: 1px solid #2b2b2b; + color: #141414; +} +QScrollBar::handle:vertical:checked, QScrollBar::handle:horizontal:checked { + background-color: #444444; +} +QScrollBar::handle:vertical { + min-height: 8px; +} +QScrollBar::handle:horizontal { + min-width: 8px; +} +QScrollBar:vertical { + margin: 0px 0px 0px 0px; + width: 10px; +} +QScrollBar:horizontal { + margin: 0px 0px 0px 0px; + height: 10px; +} +QScrollBar::add-page:vertical, QScrollBar::add-page:horizontal, +QScrollBar::sub-page:vertical, QScrollBar::sub-page:horizontal { + background: #292929; + height:0px; + width: 0px; + /*border: 1 solid #444444;*/ +} +QScrollBar::sub-line:vertical:disabled, +QScrollBar::sub-line:horizontal:disabled, +QScrollBar::sub-line:vertical, +QScrollBar::sub-line:horizontal, +QScrollBar::add-line:vertical, +QScrollBar::add-line:horizontal { + background-color: transparent; + height:0px; + width: 0px; +} + +/* +QScrollBar::add-line:vertical { + border: none; + background: none; + height: 20px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal { + width: 0px; + subcontrol-position: right; + subcontrol-origin: margin; +} + + + +QScrollBar::sub-line:vertical, +QScrollBar::sub-line:horizontal { + background: none; + color: #99c8c8; + border: 0px solid #141414; + border-radius: 0px; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:horizontal:hover { + background-color: #525252; + border: 1px solid #996565; +} + +QScrollBar::sub-line:vertical:pressed, +QScrollBar::sub-line:vertical:checked, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:checked { + border: 0px solid #656565; + background-color: #2b2b2b +} + +*/ + +/* QScrollArea */ +QScrollArea { + border: none; +} +QScrollArea, +QScrollArea > QWidget, +QScrollArea > QWidget > QWidget { + background: transparent; +} + +/* Button */ +QAbstractButton::menu-indicator:enabled, +QAbstractButton::menu-arrow:enabled { + image: url(:/alg/gui/icons/lightarrowdown.svg); + subcontrol-position: right center; + top: 0; +} + +QAbstractButton::menu-indicator:enabled:checked, +QAbstractButton::menu-indicator:enabled:pressed, +QAbstractButton::menu-indicator:!enabled, +QAbstractButton::menu-arrow:enabled:checked, +QAbstractButton::menu-arrow:enabled:pressed, +QAbstractButton::menu-arrow:!enabled { + image: url(:/alg/gui/icons/darkarrowdown.svg); +} + +/* QSpinBox */ +QAbstractSpinBox { + padding-left: 10px; + height: 16px; +} +QAbstractSpinBox::down-button, +QAbstractSpinBox::up-button { + background-repeat: no-repeat; + border: none; + width: 12px; +} +QAbstractSpinBox::down-button { + background-position: center; + background-image: url(:/alg/gui/icons/darkarrowdown.svg); +} +QAbstractSpinBox::up-button { + background-position: center; + background-image: url(:/alg/gui/icons/darkarrowup.svg); +} + +QAbstractSpinBox::down-button:enabled:hover, +QAbstractSpinBox::up-button:enabled:hover { + background-color: #1a1a1a; + color: white; + border: 0 solid transparent; +} + +QAbstractSpinBox::down-button:enabled:hover { + background-image: url(:/alg/gui/icons/lightarrowdown.svg); +} + +QAbstractSpinBox::up-button:enabled:hover { + background-image: url(:/alg/gui/icons/lightarrowup.svg); +} + + + +QAbstractSpinBox::down-button:enabled:pressed, +QAbstractSpinBox::up-button:enabled:pressed { + border: 0 solid transparent; + background-color: #757575; + color: #1a1a1a; +} + +/* QStatusBar */ +QStatusBar { + border-top: 1px solid #141414; +} +QStatusBar::item { + background: #444444; + border: none; +} +QStatusBar QLabel { + font-size: 11px; + min-width: 150px; + vertical-align: center; +} +QStatusBar QProgressBar { + min-width: 128px; +} +QStatusBar QProgressBar::chunk { + background-color: #30b29c; +} + +QStatusBar QToolButton { + icon-size: 24px; +} + +/* QSlider */ +QSlider { + border: none; +} +QSlider:horizontal { + min-width: 32px; +} +QSlider:vertical { + min-height: 32x; +} + +QSlider::groove { + background: transparent; +} + +QSlider::handle { + background: #6a6a6a; + border: none; + margin: 0; +} +QSlider::handle:disabled { + background: #303030; +} +QSlider::handle:horizontal { + width: 8px; +} +QSlider::handle:vertical { + height: 8px; +} + +/* QTabBar */ +QTabWidget { + background: #141414; +} +QTabWidget::pane { + border-top: 1px solid #4c4c4c; +} + +QTabBar::close-button { + image: url(:alg/gui/icons/dockwidgetclose.svg); + } +QTabBar { + background: #333333; +} +QTabBar::tab { + background: #333333; + color: #c8c8c8; + border: 1px solid #111111; + border-bottom: none; + padding: 3px 45px 3px 45px; +} +QTabBar::tab:hover { + color: white; +} +QTabBar::tab:selected { + background: #444444; + color: white; + border: 1px solid #111111; + border-bottom: none; +} +QTabBar::tab:disabled { + background-color: #4c4c4c; + color: #afafaf; + border-top: 1px solid #141414; + border-right: 1px solid #141414; +} + +/* QPushButton */ +QPushButton { + background: #5d5d5d; + color: #c8c8c8; + border: 1px solid #282828; + border-radius: 3px; + padding: 2px; + /*margin-left: 5px; + margin-right: 5px;*/ + min-width: 96px; + outline: none; +} +QPushButton:hover { + background-color: #6d6d6d; + border: 1px solid #0b0b0b; + color: #fdf7df; +} +QPushButton:pressed { + background-color: #444444; + border: 1px solid #0b0b0b; + color: #fdf7df; +} +QPushButton:checked { + background-color: #262626; + color: #e1e1e1; +} +QPushButton:checked:hover { + background-color: #262626; + color: #1a8dff; +} +QPushButton:checked:pressed { + background-color: #1a1a1a; + color: #1a8dff; +} +QPushButton:disabled { + background-color: #3f3f3f; + color: #1a1a1a; +} +QPushButton:default { + border: 1px solid #0b0b0b; +} + +/* QDialogButtonBox */ +QDialogButtonBox { + dialogbuttonbox-buttons-have-icons: 0; +} + +/* QToolButton */ +QToolButton { + background: transparent; + border-radius: 3px; + color: #c8c8c8; + margin-right: 0px; +} + +QToolButton:hover { + background-color: #262626; + color: #1a8dff; +} +QToolButton:hover:pressed { + background-color: #1a1a1a; + color: #1a8dff; +} +QToolButton:disabled { + background-color: transparent; + color: #656565; +} +QToolButton[popupMode="2"]::menu-indicator:disabled { + subcontrol-position: center right; +} + +QToolButton:disabled:checked { + background-color: transparent; + color: #656565; +} +QToolButton:checked { + background-color: #262626; + color: #c8c8c8; +} +QToolButton:checked:hover { + background-color: #262626; + color: #1a8dff; +} +QToolButton:checked:pressed { + background-color: #1a1a1a; + color: #1a8dff; +} + +QToolButton::menu-button { + border-left: 0px solid transparent; + padding: 0; + width: 10px; +} + +QToolButton::menu-indicator { + width: 0px; +} + +QToolButton[popupMode="1"], +QToolButton#pwFunctionButton, +QToolButton#undo-button, +QToolButton#redo-button{ + padding-right: 11px; +} +QToolButton[popupMode="1"]::menu-indicator{ + width: 10px; +} + +/* ------------------------------------------------------------------------------------- */ +/* QToolBar */ +QToolBar { + background: transparent; + color: #c8c8c8; + padding: 1px; + border-bottom: 1px solid black; + spacing:1px; + min-height: 24px; +} +QToolBar::separator { + background: transparent; + width: 0px; +} + +QToolBar::handle:horizontal { + background-image: url(:/pfx/editor/gui/images/handle.svg); + width: 5px; + height:8px; + margin-right:5px; + margin-left:5px; +} + +QToolBar::handle:vertical { + background-image: url(:/pfx/editor/gui/images/handlevertical.svg); + width: 8px; + height:6px; + margin-top:5px; + margin-bottom:5px; +} + +QToolBar > QWidget[class~="QWidget"] { /*match only QWidget, not its subclasses*/ + background: none; +} + +/* LayoutWidget */ +Alg--Gui--LayoutWidget QToolButton { + max-height: 24px; + min-height: 24px; +} + +Alg--Gui--LayoutWidget #toolbar > QToolBar { + background: transparent; + border: none; + /*border-bottom: 1px solid #1a1a1a;*/ +} + +/* ------------------------------------------------------------------------------------- */ +/* QToolTip */ +QToolTip { + background: #444444; + border-color: #666666; + border-style: solid; + border-width: 1px; + padding: 6px; + max-width: 600px; + color: #cccccc; +} + +/* QGraphicsView */ +QGraphicsView { + border: none; +} + + +/* [Specific Stylesheet] ---------------------------------------------------- */ + +/* ArrayView */ +Alg--Gui--ArrayView { + border: none; + background: #444444; + margin: 0; +} + +Alg--Gui--ArrayViewEntryWidget #handle { + background: url(:/pfx/editor/gui/images/handle.svg); + border-bottom: 1px solid #4a4a4a; + min-width: 12px; +} + +Alg--Gui--PathArrayWidget #PathArrayWidgetAddButton, +Alg--Gui--PathArrayWidget #PathArrayWidgetRemoveButton, +Alg--Gui--MoverWidgetArray #WorkspaceListWidgetAddButton, +Alg--Gui--MoverWidgetArray #WorkspaceListWidgetRemoveButton { + icon-size: 16px; +} + + +QComboBox QListView::item { + background-color: #444444; + padding: 40px; +} + +/* WidgetGroup */ +Alg--Gui--WidgetGroup { + border-bottom: 0px solid #2b2b2b; +} + +Alg--Gui--WidgetGroupToolBar { + background-color: #4d4d4d; + min-height: 24px; + max-height: 24px; + border-bottom: 1px solid #2b2b2b; +} + +Alg--Gui--WidgetGroupToolBar:hover { + background-color: #262626; +} + +Alg--Gui--WidgetGroupToolBar QToolButton { + background-color: transparent; + min-height: 24px; + max-height: 24px; + max-width: 64px; + min-width: 24px; + icon-size: 24px; +} + +Alg--Gui--WidgetGroupToolBar QToolButton#WidgetGroupMinimizeButton { + icon-size: 17px; /* used odd number here, to have the tip of the arrow aligned to pixel center */ + max-width: 24px; +} + +Alg--Gui--WidgetGroupToolBar QToolButton#WidgetGroupMinimizeButton:hover { + icon-size: 17px; /* used odd number here, to have the tip of the arrow aligned to pixel center */ + max-width: 24px; + background-color: transparent; +} + +Alg--Gui--WidgetGroupToolBar QToolButton:hover { + background-color: #1a1a1a; +} + +Alg--Gui--WidgetGroupToolBar > QLabel { + color: #e6e6e6; + font-weight: bold; + font-size: 12px; + padding: 0 1px; +} + +/* BrushEditor */ +Alg--Graphics--BrushEditor #mPresetPanel { + background: #3a3a3a; +} + +/* Explorer */ +Alg--Gui--LayoutWidget #toolbar, +Pfx--Editor--Components--Explorer--ComponentWidget #mInformationTitleBar { + background-color: #444444; + color: #c8c8c8; +} + +Pfx--Editor--Components--Explorer--ComponentWidget #mInformationTitleBar { + border: none; +} + +Pfx--Editor--Components--Explorer--ComponentWidget QAbstractItemView::item{ + show-decoration-selected: 0; +} + +/* Properties */ + +Pfx--Editor--Components--Properties--PropertyWidget { + border-bottom: 1px solid #2b2b2b; + padding-top: 0px; + padding-bottom: 0px; + padding-left: 1px; + padding-right: 4px; +} + +Pfx--Editor--Components--Properties--PropertyWidget > QLabel { + color: #cccccc; + font-weight: Bold; + padding: 0px 0px 0px 12px; + min-height: 24px; +} + +Pfx--Editor--Components--Properties--PropertyWidget > QToolButton { + padding: 0px 0px 2px 0px; + icon-size: 24px; + margin: 0px; +} + +Pfx--Editor--Components--Properties--PropertyWidget > QToolButton#delete-tweak{ + icon-size: 16px; +} + +Pfx--Editor--Components--Properties--PropertyWidget > QToolButton#pw-collapse{ + icon-size: 17px; /* see WidgetGroupMinimizeButton */ +} + +Pfx--Editor--Components--Properties--PropertyWidget > +Pfx--Editor--Components--Properties--BaseEditor { + padding: 0px 0px 8px 16px; +} + +Pfx--Editor--Components--Properties--TransformationEditor { + margin-left: -10px; +} + +Pfx--Editor--Components--Properties--PropertyWidget QGroupBox { + font-size: 12px; +} + +Pfx--Editor--Components--Properties--TransformationEditor { + margin-left: -10px; +} + +Pfx--Editor--Components--Properties--BoolEditor QPushButton, +Pfx--Editor--Components--Properties--BoolNEditor QPushButton{ + max-width: 200px; +} + +Pfx--Editor--Components--Properties--PropertyWidget QGroupBox { + font-size: 12px; +} + +Pfx--Editor--Components--Properties--PropertyWidgetContainer[depth="1"], +Pfx--Editor--Components--Properties--PropertyWidgetContainer[depth="2"] { + background: transparent; + margin-left: 16px; +} + +Pfx--Editor--Components--Properties--PropertyWidgetContainer[depth="1"] Pfx--Editor--Components--Properties--PropertyWidget{ + background: transparent; + border-left: 0px solid #6c6c6c; +} + +QToolButton#GraphPresetWidget-add-button{ + icon-size: 24px; +} + +Pfx--Editor--Components--Properties--ColorEditor > QPushButton{ + min-width: 32px; +} + +Alg--Gui--MoverWidget { + background: transparent; +} + +Alg--Gui--MoverWidget:disabled { + background: #606060; +} + +Alg--Gui--MoverWidget:hover { + background: #404040; +} + +Alg--Gui--MoverWidget #handle { + background: url(:/pfx/editor/gui/images/handle.svg); + border-bottom: 0px solid #2b2b2b; + min-width: 12px; +} + +Alg--Gui--MoverWidget[selected="true"] { + background-color: #585858; +} + + +Pfx--Gui--EnginesList QAbstractItemView::item{ + border: 1 solid transparent; + padding-left: 0px; + max-height: 16px; +} + +Pfx--Gui--EnginesList QAbstractItemView::item:enabled:hover { + padding-left: 1px; +} + +Pfx--Gui--EnginesList QAbstractItemView::item:enabled:selected, +Pfx--Gui--EnginesList QAbstractItemView::item:enabled:selected:hover { + border: 1 solid #1a8dff; + background: #1a1a1a; + padding-left: 0px; +} + +/* Shelf */ + +Pfx--Editor--Components--Shelf--ComponentWidget QAbstractItemView{ + background: #262626; + show-decoration-selected: 0; +} + +Pfx--DataBase--ResourceTableWidget QAbstractItemView{ + padding-left: 1px; +} + +Pfx--Editor--Components--Shelf--ComponentWidget QAbstractItemView::item{ + border: 1 solid transparent; + padding:0px; + padding-left: 0px; +} + +Pfx--Editor--Components--Shelf--ComponentWidget QAbstractItemView::item:enabled:selected, +Pfx--Editor--Components--Shelf--ComponentWidget QAbstractItemView::item:enabled:selected:hover { + border: 1 solid #1a8dff; + background: #1a1a1a; + padding-left: 0px; +} +Pfx--Editor--Components--Graph--BrowserWidgetShelf QAbstractItemView::item:enabled:selected, +Pfx--Editor--Components--Graph--BrowserWidgetShelf QAbstractItemView::item:enabled:selected:hover { + border: 1 solid #1a8dff; + background: #1a1a1a; + padding-left: 1px; +} + +Pfx--Editor--Components--Graph--BrowserWidgetShelf { + min-height: 670px; + max-height: 670px; +} + +Pfx--Editor--Components--Graph--CompGraphWidget Alg--Gui--ToolBoxAreaWidget QToolBar { + background: #444444; +} + +Pfx--Editor--Components--Graph--BrowserWidgetShelf QSizeGrip { + min-width: 16px; +} + +Pfx--Editor--Components--Shelf--ComponentWidget QAbstractItemView::item:enabled:hover { + border: 1 solid transparent; + background: #1a1a1a; + padding:0px; +} + +Pfx--Editor--Components--Shelf--ComponentWidget QAbstractItemView::branch:enabled:selected { + border: 1 solid transparent; + background: transparent; +} + +Pfx--Editor--Components--Shelf--QueryExplorerWidget QTreeView{ + background: transparent; +} + +Pfx--Editor--Components--Shelf--QueryExplorerWidget QTreeView::branch, +Pfx--Editor--Components--Shelf--QueryExplorerWidget QTreeView::item { + padding: 2px 0; +} + + +Pfx--Editor--Components--Shelf--QueryExplorerWidget QTreeView::item { + border-bottom: 1px solid #2b2b2b; + outline: none; +} + +Pfx--Editor--Components--Shelf--QueryEditorWidget > QWidget { + background: #2b2b2b; + outline: none; +} + +Pfx--Editor--Components--Shelf--ComponentWidget QToolBar { + background: #444444; +} + +/* View2D */ +Pfx--Editor--Components--View2D--ComponentWidget QGraphicsView { + background: #202020; + font-size: 12px; +} + +Pfx--Editor--Components--View2D--Plugins--InformationWidget, +Pfx--Editor--Components--View2D--Plugins--InformationWidget QWidget, +Pfx--Editor--Components--View2D--Plugins--HistogramWidget { + background-color: transparent; +} + +Pfx--Editor--Components--View2D--Plugins--InformationWidget QFrame#mSep1, +Pfx--Editor--Components--View2D--Plugins--InformationWidget QFrame#mSep2 { + background: #2b2b2b; + border: 1px solid #444444; +} + +Pfx--Editor--Components--DependencyManager--TreeViewWidget:item{ + max-height: 14px; +} + +/* Layers */ + +Pfx--Editor--Components--Layers--LayerToolBox QTreeView::item { + min-height: 24px; +} + + +Pfx--Gui--NewSubstanceDialog QTreeView { + icon-size: 16px; +} + + +/* License */ +QDialog#LicenseFileWizard { + min-height: 320px; + max-height: 320px; + min-width: 440px; + max-width: 440px; +} +QDialog#LicenseFileWizard #labelError { + color: #dc0a0a; + border: 1px solid #dc0a0a; + background: #252525; + padding: 3px; +} +QDialog#LicenseFileWizard #labelFilePath, QDialog#LicenseFileWizard #labelLicenseDetails { + border: 1px solid #585858; + background: #252525; + padding: 3px; +} +QDialog#LicenseFileWizard #buttonOpenLicense { + outline: 0px; + padding-left: 3px; + padding-right: 3px; +} +QDialog#LicenseFileWizard QListWidget { + outline: 0px; +} +QDialog#LicenseFileWizard QListWidget::item { + background: qlineargradient(top bottom, #252525 0%, #1b1b1b 100%); + padding: 4px; +} +QDialog#LicenseFileWizard QListWidget::item:selected { + border: none; + background: qlineargradient(top bottom, #3c3c3c 0%, #323232 100%); + color: white; +} + +Alg--LicenseInfoDialog QListView, +Alg--LicenseNodeDialog QListView +{ + background: transparent; + border: 1px solid black; + max-height: 300px; + min-height: 200px; + max-width: 600px; + min-width: 500px; +} + +/* Welcome */ +Pfx--Editor--Components--Welcome--WelcomeScreen::window { + background-color: #252525; +} + +Pfx--Editor--Components--Welcome--WelcomeScreen #pane { + border: none; + margin: 0 0 0 150px; +} + +Pfx--Editor--Components--Welcome--WelcomeScreen QTabWidget:pane { + background: none; + border-top: 1px solid #4a4a4a; + padding: 0; +} + +Pfx--Editor--Components--Welcome--WelcomeScreen QTabBar::tab { + padding: 15px 25px; +} + +Pfx--Editor--Components--Welcome--WelcomeScreen QListView { + background: transparent; + border: none; + font-size: 12px +} + +Pfx--Editor--Components--Welcome--WelcomeScreen QListView::item { + color: #808080; + padding: 8px; +} + +Pfx--Editor--Components--Welcome--WelcomeScreen QToolButton { + font-size: 12px; + font-weight: bold; + padding: 8px 24px; +} + +Pfx--Applications--Designer--Components--WelcomePages--LearnPage #mWhatsThisLabel { + font-size: 12px; + min-height: 17px; /* Otherwise the label changes size when setting/clearing its text under Linux */ +} + +/* About */ +Alg--Gui--AboutDialog { + max-height: 500px; + min-height: 400px; + max-width: 700px; + min-width: 660px; +} + +Alg--Gui--AboutDialog #pane { + border: none; + padding: 32px auto; + margin: 0 0 0 150px; +} + +Alg--Gui--AboutDialog #about-title { + font-size: 20px; + font-weight: bold; +} + +Alg--Gui--AboutDialog #about-subtitle { + font-size: 18px; +} + +Alg--Gui--AboutDialog #about-details { + color: #a0a0a0; +} + +Alg--Gui--AboutDialog #about-disclamer { + font-weight: bold; +} + +/* Graph */ +Pfx--Editor--Components--Graph--BaseGraphSceneGrid { + qproperty-gridColor1: 90; + qproperty-gridColor2: 92; + qproperty-gridColor3: 110; +} + +Pfx--Editor--Components--Graph--CompGraphWidget QGraphicsView, +Pfx--Editor--Components--Graph--ParamGraphWidget QGraphicsView, +Pfx--Editor--Components--Graph--FuncGraphWidget QGraphicsView { + background: #404040; +} + +/* Settings */ +Alg--Gui--Settings--SettingsEditor > QTreeView, +Alg--Gui--Settings--SettingsEditor > QAbstractItemView { + background-color: #262626; + margin: 0; + selection-background-color: none; + font-size: 14px; +} + +Alg--Gui--Settings--SettingsEditor > QTreeView::branch, +Alg--Gui--Settings--SettingsEditor > QTreeView::item { + border-bottom: 1px solid #444444; + padding: 10px 5px 10px 0; +} + +Alg--Gui--Settings--SettingsEditor > QAbstractItemView::item:enabled:selected, +Alg--Gui--Settings--SettingsEditor > QAbstractItemView::branch:enabled:selected { + color: #e6e6e6; + border-bottom: 1px solid #444444; + padding: 10px 5px 10px 0; + background-color: #444444; +} + +Alg--Gui--Settings--SettingsEditor > QTreeView::branch:hover:!selected, +Alg--Gui--Settings--SettingsEditor > QTreeView::item:hover:!selected { + color: #1a8dff; + border-bottom: 1px solid #444444; + padding: 10px 5px 10px 0; + background-color: #262626; +} + +Alg--Gui--Settings--SettingsEditor > QTreeView::branch:hover:selected, +Alg--Gui--Settings--SettingsEditor > QTreeView::item:hover:selected { + border-bottom: 1px solid #444444; + padding: 10px 5px 10px 0; + background-color:#444444; +} + +Alg--Gui--Settings--SettingsEditor > QTreeView::branch { + border-bottom: 1px solid #444444; + padding: 10px 5px 10px 0; +} + +Alg--Gui--Settings--SettingsEditor > QFrame > QScrollArea{ + padding-right: 8px; + padding-top: -8px; +} + +Alg--Gui--Settings--SettingsEditor #mButtonBox { + padding: 50px; +} + +Alg--Gui--Settings--SettingsEditor QTabBar:tab{ + padding: 8px 10px; +} + +/* Dialogs */ +Pfx--Editor--Gui--ImagePreview { + background: #4a4a4a; +} + +Pfx--Editor--Gui--ImagesImportDialog #toolbar{ + background: #4a4a4a; + border-bottom: 1px solid #2a2a2a; +} + +Pfx--Editor--Gui--ImagesImportDialog #separator[frameShape="5"]{ + background: #4a4a4a; + min-width: 10px; + max-width: 10px; + margin: 0px 0px 1px 0px; +} + +Pfx--Editor--Gui--StatusToolBar +{ + background: #444444; +} + +/* [Relationnal Stylesheet] ------------------------------------------------- */ + + + +/* Edits & Inputs */ +QAbstractSpinBox, +QSlider { + background-color: #2c2c2c; + border-style: none; + color: #999999; +} + +QAbstractSpinBox:disabled, +QSlider:disabled { + background-color: transparent; + color: #4d4d4d; +} + +/*QAbstractSpinBox:enabled:hover, +QSlider:enabled:hover { + background-color: #1a1a1a; + color: #c0c0c0; +}*/ + +QAbstractSpinBox:enabled:focus, +QSlider:enabled:focus { + background-color: black; + color: white; +} + +QTextEdit, QLineEdit, QPlainTextEdit, QTextBrowser#PropertiesHtmlEditor { + background: #252525; + selection-color: white; + selection-background-color: #1a8dff; + border: none; + border-radius: 3px; +} +QTextEdit:hover, QLineEdit:hover, QPlainTextEdit:hover, QTextBrowser#PropertiesHtmlEditor:hover { + background: #2a2a2a; +} +QTextEdit[hasError="true"], QLineEdit[hasError="true"], QPlainTextEdit[hasError="true"], QTextBrowser#PropertiesHtmlEditor[hasError="true"] { + border: 1px solid #a94442; +} + +QLineEdit { + height: 16px; +} + +QLineEdit:disabled { + background: #303030; + border: 1px solid #505050; + color: #616161; +} + +/* Checkbox & RadioButton */ + +QCheckBox, +QRadioButton { + background: transparent; + padding: 2px; + spacing: 5px; +} +QCheckBox:disabled, +QRadioButton:disabled { + color: #505050; +} +QCheckBox[text~=""], +QRadioButton[text~=""] { + spacing: 10px; +} +QCheckBox::indicator, +QGroupBox::indicator, +QRadioButton::indicator, +QAbstractItemView::indicator { + background: transparent; +} + +QCheckBox::indicator:enabled, +QGroupBox::indicator:enabled, +QRadioButton::indicator:enabled, +QAbstractItemView::indicator:enabled, +QTreeView::indicator:enabled, +QTableView::indicator:enabled { + background-color: #1e1e1e; + width: 13px; + height: 13px; +} + +QCheckBox::indicator:enabled:hover, +QGroupBox::indicator:enabled:hover, +QRadioButton::indicator:enabled:hover, +QAbstractItemView::indicator:enabled:hover, +QTreeView::indicator:enabled:hover { + width: 13px; + height: 13px; + background-color: #4d4d4d; +} +QCheckBox::indicator:disabled, +QGroupBox::indicator:disabled, +QRadioButton::indicator:disabled, +QAbstractItemView::indicator:disabled, +QTreeView::indicator:disabled { + background-color: #303030; +} +QCheckBox::indicator:enabled:pressed, +QGroupBox::indicator:enabled:pressed, +QRadioButton::indicator:enabled:pressed, +QAbstractItemView::indicator:enabled:pressed, +QTreeView::indicator:enabled:pressed { + width: 13px; + height: 13px; + background-color: #1a1a1a; +} +QCheckBox::indicator:checked, +QGroupBox::indicator:checked, +QRadioButton::indicator:checked, +QAbstractItemView::indicator:checked, +QTreeView::indicator:enabled:checked, +QTableView::indicator:enabled:checked { + image: url(../builder/ui/stylesheets/img/UI20/combo-checked.png); + width: 13px; + height: 13px; + background-color: #1e1e1e; +} +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled, +QRadioButton::indicator:checked:disabled, +QAbstractItemView::indicator:checked:disabled, +QTreeView::indicator:enabled:checked:disabled, +QTableView::indicator:enabled:checked :disabled{ + image: url(../builder/ui/stylesheets/img/UI20/combo-checked-disabled.png); + width: 13px; + height: 13px; + background-color: #303030; +} +QCheckBox::indicator:checked:hover, +QGroupBox::indicator:checked:hover, +QRadioButton::indicator:checked:hover, +QAbstractItemView::indicator:checked:hover, +QTreeView::indicator:checked:hover { + + width: 13px; + height: 13px; + background-color: #4d4d4d; +} +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:pressed, +QRadioButton::indicator:checked:pressed, +QAbstractItemView::indicator:checked:pressed, +QTreeView::indicator:checked:pressed { + image: url(:/StyleSheetImages/checkbox_checked.png); + width: 13px; + height: 13px; + background-color: #1a1a1a; +} + +QCheckBox::indicator:indeterminate, +QGroupBox::indicator:indeterminate, +QRadioButton::indicator:indeterminate, +QAbstractItemView::indicator:indeterminate { + width: 10px; + height: 10px; + background-color: #444444; + border: 3px solid #1e1e1e; +} +QCheckBox::indicator:indeterminate:hover, +QGroupBox::indicator:indeterminate:hover, +QRadioButton::indicator:indeterminate:hover, +QAbstractItemView::indicator:indeterminate:hover { + width: 10px; + height: 10px; + background-color: #4d4d4d; + border: 3px solid #1e1e1e; +} + +QTreeView::indicator:enabled:selected, +QTableView::indicator:enabled:selected { + width: 13px; + height: 13px; + background-color: #1e1e1e; +} + +/* QTextBrowser */ +QTextBrowser:enabled, +QTextBrowser:enabled:hover, +QTextBrowser:enabled:focus { + background-color: #505050; + border-color: #252525; + color: #e0e0e0; +} + + +/* Splitters */ +QMainWindow::separator { + background: #0d0d0d; + width: 1px; + height: 0px; + border: 1px solid #444444; +} +QMainWindow::separator:hover { + background: #262626; + width: 0px; + border: 0px solid #1a1a1a; +} + +QSplitter::handle { + background: #0d0d0d; +} +QSplitter::handle:vertical { + height: 2px; +} + +Pfx--Applications--Player--View3D QSplitter::handle { + image: url(:/alg/gui/icons/lightarrowleft.svg); +} +Pfx--Applications--Player--View3D QSplitter::handle:vertical { + height: 11px; +} + +QSplitter::handle:pressed { + background: #262626; +} + + +/* Sliders */ +Alg--Gui--SliderEdit { + height: 14px; + background: transparent; + color: #c8c8c8; + border: 0px solid #14FF14; + margin: 0px 5px 0px 5px; +} + + +Alg--Gui--SliderEdit::add-page { + background: #4D4D4D; + border: none; +} + +Alg--Gui--SliderEdit::sub-page:hover { + background: red; +} + + +Alg--Gui--SliderEdit::add-page:disabled { + background: #4d4d4d; +} + +Alg--Gui--SliderEdit::groove { + background: #b3b3b3; + height: 2px; +} + +Alg--Gui--SliderEdit::groove:hover { + background: #1A8DFF; +} + +Alg--Gui--SliderEdit::groove:disabled { + background: #8c8c8c; +} + +Alg--Gui--SliderEdit::handle { + background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.5, fy:0.5, stop:0 #b3b3b3, /*stop:0.4 #444444, stop:0.5 #b3b3b3,*/ stop:0.7 #b3b3b3, stop:0.8 #444444, stop:1 #444444); + margin: -6px; + width: 14px; + height: 12px; + border-radius: 5px; +} + +Alg--Gui--SliderEdit::disabled { + color: #616161; +} + +QLabel::disabled { + color: #969696; +} + +Alg--Gui--SliderEdit::handle:hover { + background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.5, fy:0.5, stop:0 #1A8DFF, stop:0.7 #1A8DFF, stop:0.8 #444444, stop:1 #444444); +} + +Alg--Gui--SliderEdit::handle:disabled { + background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.5, fy:0.5, stop:0 #666666, stop:0.7 #666666, stop:0.8 #444444, stop:1 #444444); +} + +Alg--Gui--SliderEdit QDoubleSpinBox { + background: transparent; + padding-left: 0px; + margin: 0px; + color: #b3b3b3; + min-height: 15px; + max-height: 15px; + min-width: 70px; + max-width: 70px; +} + +Pfx--Applications--Player--TweaksList Alg--Gui--SliderEdit QDoubleSpinBox { + max-width: 0; + min-width: 0; +} + +Alg--Gui--SliderEdit QLabel { + min-height: 15px; + max-height: 15px; + padding: 0px; + margin: 0px; + padding-left: 1px; + color: #b3b3b3; +} + +/* QLabel[parent="SliderEditor"] { + min-width: 50px; + max-width: 50px; +} */ + +Alg--Gui--SliderEdit QLabel:hover { + min-height: 15px; + max-height: 15px; + padding: 0px; + margin: 0px; + padding-left: 3px; + color: #e6e6e6; +} + + +Alg--Gui--ColorEdit Alg--Gui--SliderEdit QLabel { + padding-left: 0px; +} + + +Alg--Gui--SliderEdit QDoubleSpinBox:focus, +Alg--Gui--SliderEdit QDoubleSpinBox:hover:focus{ + background: #141414; + color: #c8c8c8; + border-bottom: 1px solid #1A8DFF; +} + +Alg--Gui--SliderEdit QDoubleSpinBox:hover{ + color: #e6e6e6; + border-bottom: 1px solid #999999; +} + +Alg--Gui--SliderEdit QDoubleSpinBox::down-button { + border: none; + height: 0; +} + +Alg--Gui--SliderEdit QDoubleSpinBox::up-button { + border: none; + height: 0; +} + +Alg--Gui--SliderEdit QDoubleSpinBox::down-button:focus, +Alg--Gui--SliderEdit QDoubleSpinBox::up-button:focus { + height: 7px; +} + + + + +QToolBar#color-curve-toolbar { + background: none; + border:none; + spacing: 5px; +} + + +/*========================================================================================================*/ +Alg--Gui--MenuActionWidget { + background-color: #3f3f3f; +} + +Alg--Gui--MenuActionWidget #text { + color: #c8c8c8; +} + +Alg--Gui--MenuActionWidget[isNotSupported="true"] { + background-color: #FCB917; +} + +Alg--Gui--MenuActionWidget[isNotSupported="true"] #text { + background-color: #FCB917; + color: #808080; + font-style:italic; +} + +Alg--Gui--MenuActionWidget[mouseHover="true"][isNotSupported="false"] { + background-color: #585858; +} + +/*========================================================================================================*/ +QTableView QTableCornerButton::section{ + background: transparent; + border: none; +} +QTableView::item:enabled:selected{ + background: #656565; +} +/*========================================================================================================*/ +/* Pfx--Gui--FloatingWidget */ +Pfx--Gui--FloatingWidget { + border: 1px solid #141414; +} + +Pfx--Editor--Components--Graph--BrowserWidgetShelf QMainWindow{ +/* min-width: 260px; + max-width: 260px; + min-height: 670px; + max-height: 670px; */ +} + +Alg--Gui--ContextMenu[needExtraSpacing="1"]::item { + height: 26px; + padding-left: 28px; +} + +QPushButton#statusbar-inContextEditionButton { + background: none; + color: rgb(250, 250, 110); +} + +QPushButton#statusbar-inContextEditionButton:hover { + text-decoration: underline +} + +/*========================================================================================================*/ +/* BreadcrumbBar */ + +Pfx--Editor--Components--Graph--BreadcrumbBar { + background: #2b2b2b; + min-height: 30; /* Increase the height and add a 1px margin above/below buttons */ + max-height: 30; +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton { + border: 1 solid transparent; + border-radius: 0; + background: rgba(27, 27, 27, 0.5); +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton:hover { + color: #1a8dff; +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton[current=true] { + color: #111111; + background: #1a1a1a; + border: 1 solid #1a8dff; +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton[current=false]:hover { + background: #1a1a1a; + color: #1a8dff; +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton[type=arrow] { + margin: 0 2 0 0; +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton[type=arrow]:enabled { + qproperty-icon: url(:/alg/gui/icons/lightarrowright.svg); +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton[type=arrow]:disabled { + qproperty-icon: url(:/alg/gui/icons/darkarrowright.svg); +} + +Pfx--Editor--Components--Graph--BreadcrumbWidget QToolButton[type=arrow]:hover { + background: #1a1a1a; +} + +/*========================================================================================================*/ +/* BreadcrumbHistoryWidget */ + +Pfx--Editor--Components--Graph--BreadcrumbHistoryWidget { + border-left: 1 solid #444444; + border-bottom: 1 solid #444444; +} + +Pfx--Editor--Components--Graph--BreadcrumbHistoryWidget QWidget, +Pfx--Editor--Components--Graph--BreadcrumbHistoryWidget QWidget:hover, +Pfx--Editor--Components--Graph--BreadcrumbHistoryWidget QWidget:hover:pressed { + background: transparent; +} + +Pfx--Editor--Components--Graph--BreadcrumbHistoryWidget QToolButton[type=arrow] { + qproperty-enabled: false; +} + +Pfx--Editor--Components--Graph--BreadcrumbHistoryWidget #rowBackground { + background: #4d4d4d; +} + +Pfx--Editor--Components--Graph--BreadcrumbHistoryWidget #rowBackground[hovered=true] { + background: #444444; + border: 1 solid #4d4d4d; +} + +Pfx--Editor--Components--Graph--ThumbnailsWidget QLabel { + background: #444444; + border: 1px solid #666666; + color: #cccccc; + margin: 0 2 0 0; +} + +/*========================================================================================================*/ +/* BreadcrumbListWidget */ + +Pfx--Editor--Components--Graph--BreadcrumbListWidget { + border-left: 1 solid #444444; + border-bottom: 1 solid #444444; +} + +Pfx--Editor--Components--Graph--BreadcrumbListWidget QToolButton { + background: #4d4d4d; + border: 1 solid transparent; + border-radius: 0; +} + +Pfx--Editor--Components--Graph--BreadcrumbListWidget QToolButton[current=true], +Pfx--Editor--Components--Graph--BreadcrumbListWidget QToolButton[current=true]:hover, +Pfx--Editor--Components--Graph--BreadcrumbListWidget QToolButton[current=true]:pressed { + color: #ffffff; + background: #4d4d4d; + border: 1 solid #1a8dff; +} + +Pfx--Editor--Components--Graph--BreadcrumbListWidget QToolButton[current=false]:hover { + background: #444444; + border: 1 solid #4d4d4d; +} + +/*========================================================================================================*/ +/* ArrowScrollArea */ + +Alg--Gui--ArrowScrollArea #overflowButton, #rightButton, #leftButton { +/* border-radius: 0; */ +} + +Alg--Gui--ArrowScrollArea #overflowButton { + margin: 0 0 3 0; + icon-size: 10px; +} + +Alg--Gui--ArrowScrollArea #overflowButton:hover { + background-color: #262626; +} + +Alg--Gui--ArrowScrollArea #leftButton, #rightButton { + width: 10px; + icon-size: 15px; +} + +Alg--Gui--ArrowScrollArea #leftButton { + margin: 0 0 3 2; +} + +Alg--Gui--ArrowScrollArea #rightButton { + margin: 0 0 3 0; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/LineEdit.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/LineEdit.qss new file mode 100644 index 0000000000..9d887b5da6 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/LineEdit.qss @@ -0,0 +1,36 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +/* NOTE: a number of QLineEdit properties are defined in BaseStyleSheet.qss already, along with other text entry controls */ + +QLineEdit +{ + height: 16px; + padding-left: 8px; + border-width: 2px; + border-style: solid; +} + +QLineEdit[HasSearchAction=true] { + padding-left: 4px; +} + +QLineEdit:focus +{ + background-color: #FFFFFF; +} + +QLineEdit:disabled +{ + background-color: #777777; + color: #999999; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Menu.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Menu.qss new file mode 100644 index 0000000000..e7fb61edae --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Menu.qss @@ -0,0 +1,53 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QMenuBar::item:selected +{ + background: #222222; +} + + +QMenu +{ + background-color: #222222; + color: #FFFFFF; + padding: 4px 0px 4px 0px; + + /* Note: with QMenu, only 'margin' works, not 'margin-bottom' or 'margin-top'. */ +} + +QMenu::item +{ + color: #FFFFFF; + font-size: 12px; + padding-top: 6px; + padding-bottom: 6px; + padding-right: 24px; + padding-left: 24px; +} + +QMenu::item:selected +{ + background-color: #444444; +} + +QMenu::item:disabled +{ + color: #555555; +} + +QMenu::separator +{ + height: 1px; + background: #444444; +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ProgressBar.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ProgressBar.qss new file mode 100644 index 0000000000..afc8af1134 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ProgressBar.qss @@ -0,0 +1,28 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QProgressBar +{ + border: 0px transparent #000000; + border-radius: 0px; + background: #888888; + height: 7px; + font-size: 1px; /* hack to get around the fact that QProgressBar's minimumSizeHint + is computed from font size, even when text is invisible */ + qproperty-textVisible: False; +} + +QProgressBar::chunk +{ + background: #B48BFF; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/PushButton.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/PushButton.qss new file mode 100644 index 0000000000..e4890f0929 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/PushButton.qss @@ -0,0 +1,80 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + + +/* ============================================================= + Push Buttons + + Painting of the background and the frame of PushButtons + are done in code, in PushButton.cpp. + + It's done there because the default Qt rendering, or at least + the Fusion style, which we use as our base style, doesn't + properly anti-alias and position the button bounding box + when we customize the background colors and styles here. Also, + there's literally no way to get the colors and styling info out + of the stylesheet. + + Below is the configuration of the text colors for the + PushButtons and the font size, which can be done here in the + stylesheet. + + Everything else can be configured via PushButton.ini + ============================================================= */ + +QPushButton +{ + font-size: 12px; + color: white; + font-family: "Amazon Ember"; +} + +QPushButton:hover, +QPushButton:pressed +{ + color: white; +} + +QPushButton:disabled +{ + color: #C8C8C8; +} + +QPushButton.Primary, +QPushButton:default, +QToolButton::menu-indicator, +QToolButton.SmallIcon::menu-indicator +{ + color: white; +} + +QPushButton.Primary:disabled, +QPushButton:default:disabled, +QToolButton.SmallIcon:disabled::menu-indicator +{ + color: #C8C8C8; +} + + +QPushButton::menu-indicator +{ + subcontrol-position: right center; + subcontrol-origin: padding; + left: -8px; + image: url("../builder/ui/stylesheets/img/triangle1.png") +} + +QPushButton.SmallIcon +{ + margin: 0px; +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/RadioButton.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/RadioButton.qss new file mode 100644 index 0000000000..5c39261cd1 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/RadioButton.qss @@ -0,0 +1,67 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QRadioButton +{ + font-size: 12px; + line-height: 18px; + color: rgb(204, 204, 204); + outline: 0; +} + +QRadioButton::indicator:!focus +{ + width: 16px; + height: 16px; + margin: 2px; +} + +QRadioButton::indicator:focus +{ + width: 20px; + height: 20px; + margin: 0px; +} + +QRadioButton::indicator:checked +{ + image: url(../builder/ui/stylesheets/img/UI20/radio-checked.png); +} + +QRadioButton::indicator:checked:disabled +{ + image: url(../builder/ui/stylesheets/img/UI20/radio-checked-disabled.png); +} + +QRadioButton::indicator:checked:focus +{ + image: url(../builder/ui/stylesheets/img/UI20/radio-checked-focus.png); +} + +QRadioButton::indicator:unchecked +{ + image: url(../builder/ui/stylesheets/img/UI20/radio-unchecked.png); +} + +QRadioButton::indicator:unchecked:disabled +{ + image: url(../builder/ui/stylesheets/img/UI20/radio-unchecked-disabled.png); +} + +QRadioButton::indicator:unchecked:focus +{ + image: url(../builder/ui/stylesheets/img/UI20/radio-unchecked-disabled.png); +} + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ScrollBar.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ScrollBar.qss new file mode 100644 index 0000000000..30889afe45 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ScrollBar.qss @@ -0,0 +1,43 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QScrollBar:vertical +{ + border: 4px solid rgba(85, 85, 85, 65%); + width: 16px; + background-color: rgba(85, 85, 85, 65%); + margin: 0px; +} + +QScrollBar:horizontal +{ + border: 4px solid rgba(85, 85, 85, 65%); + height: 16px; + background-color: rgba(85, 85, 85, 65%); + margin: 0px; +} + +QScrollBar::handle +{ + border: 0px solid #000000; + border-radius: 4px; + background: #000000; +} + +QScrollBar::add-line, +QScrollBar::sub-line +{ + border: none; + background: none; + color: none; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/SegmentControl.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/SegmentControl.qss new file mode 100644 index 0000000000..2be6ddb530 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/SegmentControl.qss @@ -0,0 +1,61 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QTabWidget +{ +} + +/* An empty ::pane rule removes the default pane style. */ +QTabWidget::pane +{ +} + +QTabBar +{ + qproperty-drawBase: 0; + alignment: center; +} + +QTabBar::tab +{ + background-color: #333333; + border-color: #000000; + border-style: solid; + border-width: 1px; + + font-size: 12px; + + height: 28px; + + line-height: 24px; + + margin-left: 0px; + + min-width: 100px +} + +QTabBar::tab::middle, +QTabBar::tab::last +{ + margin-left: -1px; +} + +QTabBar::tab:selected +{ + background-color: #222222; +} + +QTabBar::tab:hover + +{ + background-color: #444444; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Slider.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Slider.qss new file mode 100644 index 0000000000..4fcda0a28f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Slider.qss @@ -0,0 +1,13 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/SpinBox.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/SpinBox.qss new file mode 100644 index 0000000000..018ad858e0 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/SpinBox.qss @@ -0,0 +1,71 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QSpinBox, +QDoubleSpinBox +{ + height: 16px; + margin: 2px; + padding-left: 8px; +} + +QSpinBox:focus, +QDoubleSpinBox:focus +{ + margin: 0px; + border-width: 2px; + border-style: solid; + border-radius: 4px; + border-color: #C19CFE; +} + +QSpinBox:disabled, +QDoubleSpinBox:disabled +{ + background-color: #777777; + color: #999999; +} + +QSpinBox::up-button, +QDoubleSpinBox::up-button, +QSpinBox::down-button, +QDoubleSpinBox::down-button +{ + width: 14px; + height: 6px; + border-width: 1px; + border-color: #222222; + border-style: solid; + background-color: #333333; +} + +QSpinBox::up-button, +QDoubleSpinBox::up-button +{ + border-top-right-radius: 2px; + image: url(../builder/ui/stylesheets/img/UI20/spinbox-up-arrow.png); +} + +QSpinBox::down-button, +QDoubleSpinBox::down-button +{ + border-bottom-right-radius: 2px; + image: url(../builder/ui/stylesheets/img/UI20/spinbox-down-arrow.png); +} + +QSpinBox::up-button:pressed, +QDoubleSpinBox::up-button:pressed, +QSpinBox::down-button:pressed, +QDoubleSpinBox::down-button:pressed +{ + background-color: #111111; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/Validation_icon.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/Validation_icon.png new file mode 100644 index 0000000000..4460445373 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/Validation_icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c45dda65605edfffe83701f467acbc28230fefdfedcddd1879d12e534f1c903 +size 1228 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/about_dark.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/about_dark.png new file mode 100644 index 0000000000..edac6eeb9b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/about_dark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b959d561237d63b859eb9a0bb5ef1fa614a5788b3604a4515232b904803e2e2b +size 59380 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/about_light.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/about_light.png new file mode 100644 index 0000000000..67348b1398 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/about_light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b327b9b1ab34d6facc574b4602eb678afa97825bf1aa721fa7505ef5c43ab051 +size 59380 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_down_V2.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_down_V2.png new file mode 100644 index 0000000000..836c9ea493 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_down_V2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:febc3883ac09ea579877deb49a41441f618a1558f63a838ca3e216c65c638b1c +size 448 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_left_V2.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_left_V2.png new file mode 100644 index 0000000000..547c749012 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_left_V2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e89ed1a88e4b7488a34f9d5ecc3cf231d1c3b2b225fe956e009431ae0cd02d3 +size 438 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_right_V2.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_right_V2.png new file mode 100644 index 0000000000..4017b4ba86 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_right_V2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7226b603a86d0f49f1fcc0159389555c02814af5382ba7b52374cac7e38f3b8 +size 446 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_up_V2.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_up_V2.png new file mode 100644 index 0000000000..b5da60c59e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/arrow_up_V2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63ed841be1103f4892ee5a6e9d7a8b0cdb0985a8267d445299aafc62b645c2fd +size 546 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked.png new file mode 100644 index 0000000000..2223a1a20a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:122e36afcffdb645c3e31d1209c1faa3f4902499b52d012a4b6d48cffd2f20fe +size 1160 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_disabled.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_disabled.png new file mode 100644 index 0000000000..7fda121609 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_disabled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:127d144107a9fbde39166ed0376c4426f5cc27a2158414157757763b5191f41f +size 1154 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_hover.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_hover.png new file mode 100644 index 0000000000..0e7bbbd285 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e1d4d0b66d84814957526e97187064789cc292dd6ddad761adde100b62712eb +size 295 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_pressed.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_pressed.png new file mode 100644 index 0000000000..bb3f21ec23 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_checked_pressed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41085a9d05c4d360ad5e01e1d59dd431938b091b043b607f1dbe5d97979138a7 +size 372 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_indeterminate_hover .png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_indeterminate_hover .png new file mode 100644 index 0000000000..643084201f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_indeterminate_hover .png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d40eecfe6550998ce610a9315db836e0f5ff4b5481c14de80b1ef58fbee60c53 +size 271 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_indeterminate_pressed.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_indeterminate_pressed.png new file mode 100644 index 0000000000..4989adfb65 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_indeterminate_pressed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7b7a54c2b0f629e3db70aa148dfd296b1a373398cf0a25e352d6a7f52a6cb6d +size 381 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked.png new file mode 100644 index 0000000000..85b552d719 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7788561044ecb229d2c1175891d5ebe04c5a68c6b9a55faf2ecb22139ad84c9 +size 1042 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_disabled.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000..b0892bf54e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_disabled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01a9e46b7ae80b68288b8d3a81e26b01c00fd8b72bcedd7ce7cebcfac1529153 +size 1043 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_hover.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_hover.png new file mode 100644 index 0000000000..a99ef6f0b3 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c90511863eea1443491f48892e6a686325d098d459dfcacbb8b560f46bf29a9 +size 294 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_pressed.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_pressed.png new file mode 100644 index 0000000000..bfecda0f6e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/checkbox_unchecked_pressed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dbebd9235853b1b5e5b75669dbb411c1f798681e78ea6bdfcf392bdf14280fb +size 169 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/dropdown_arrow.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/dropdown_arrow.png new file mode 100644 index 0000000000..5230a1ec1f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/dropdown_arrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d623ad9cecbb6c3fee912eb39689fe5442f805cd41d32fd6d5a49f5c7b049f7 +size 372 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/error_icon.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/error_icon.png new file mode 100644 index 0000000000..41e34cc219 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/error_icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41307cc4f2c5ac0c77cbe2eb15b488a5d52f6c05d850f8dd8d0540ad66e3a925 +size 1189 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/help.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/help.png new file mode 100644 index 0000000000..f089d171b0 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/help.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23bad55f0bf5efcbbe9017dd6b82e5f925349d5c6a2d120f2924aa7e6cd1f3dd +size 1122 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/info_icon.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/info_icon.png new file mode 100644 index 0000000000..05494cb90e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/info_icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73080538eae03ac319851d4a4c0928547c457eee730b67458794f0ac50a1f174 +size 528 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_checked.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_checked.png new file mode 100644 index 0000000000..2d4a0b033f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_checked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6686a111a1d0f0e02d544d24135b9b94599fb332cd43912675c6840eb318bc00 +size 3293 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_checked_disabled.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_checked_disabled.png new file mode 100644 index 0000000000..e05fa4f874 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_checked_disabled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d49c822d8f43f0f05dc8e2fa1ccee86ef3731cca074a586eb5b943caddaa6e52 +size 3306 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_unchecked.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_unchecked.png new file mode 100644 index 0000000000..9a74062cfa --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_unchecked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c8bf7b3f70d5f2683a8e495ddf80ecea1a437d63d259730becfd546286a8be2 +size 3191 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_unchecked_disabled.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_unchecked_disabled.png new file mode 100644 index 0000000000..c12309b77e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/radiobutton_unchecked_disabled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b4c23e60d84cfa16a310638ffc30d14c7821dbb852e96c5cbfb814aa0af3b1d +size 3244 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/spinbox_down.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/spinbox_down.png new file mode 100644 index 0000000000..5c0e28631b --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/spinbox_down.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:beb00c64d91c8e9035414fba270f2b9477a1d15debb2d4acad0481256948b58d +size 298 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/spinbox_up.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/spinbox_up.png new file mode 100644 index 0000000000..61b48f83da --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/spinbox_up.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b15e390624dc61ad6ae48faedb2f901f016615548747b6ed66296a8dd6ce5d7 +size 296 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/treeview_arrow_down.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/treeview_arrow_down.png new file mode 100644 index 0000000000..de11858d6a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/treeview_arrow_down.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b85878ce2422dba963334dfc04648d893b7f17f9f4e4a395d6fea92c3dc5998e +size 198 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/treeview_arrow_right.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/treeview_arrow_right.png new file mode 100644 index 0000000000..4af81abaaa --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/StyleSheetImages/treeview_arrow_right.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47df1e68051bd26a470e5d9d8af45c26e33c56d06cc379f861d8300963b606de +size 188 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Text.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Text.qss new file mode 100644 index 0000000000..58bac3e7ad --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Text.qss @@ -0,0 +1,92 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + + +.secondaryText +{ + color: #BBBBBB; +} + +.primaryText +{ + color: white; +} + +.highlightedText +{ + color: #C9AAFE; +} + +.blackText +{ + color: black; +} + +/* + Qt supports the line-height field, but only for QTextEdit controls, not for QLabel. + Even then, the support isn't exactly what we want. + So instead, we apply margin-top and bottom appropriately to get the required spec. + + To get the right line-height, we need to do: + + margin-top: ((line-height - font-size) / 2) px; + margin-bottom: ((line-height - font-size) / 2) px; +*/ + +QLabel +{ + font-size: 12px; + margin-top: 2px; + margin-bottom: 2px; + font-family: "Amazon Ember"; +} + +.Headline +{ + font-family: "Amazon Ember Light"; + font-size: 24px; + margin-top: 4px; + margin-bottom: 4px; +} + +.Title +{ + font-size: 18px; + margin-top: 7px; + margin-bottom: 7px; +} + +.Subtitle +{ + font-family: "Amazon Ember Light"; + font-size: 16px; + margin-top: 8px; + margin-bottom: 8px; +} + +.Paragraph +{ + font-size: 12px; + + /* + line-height doesn't work with multi-line text fields. + With single-line text fields, we can get close enough using the margin-top and margin-bottom. That doesn't + work for multi-line fields, because there's no inbetween line margins. + */ + + margin-top: 4px; + margin-bottom: 4px; +} + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ToolTip.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ToolTip.qss new file mode 100644 index 0000000000..af6807a734 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ToolTip.qss @@ -0,0 +1,23 @@ + +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +QToolTip +{ + color: #ffffff; + background-color: black; + border: 1px transparent black; + margin-left: 2px; + font-size: 12px; + margin-top: 0px; + margin-bottom: 0px; +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/UI20/combo-checked-disabled.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/UI20/combo-checked-disabled.png new file mode 100644 index 0000000000..e8c694a8cf --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/UI20/combo-checked-disabled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9f7e274bfcd9e1fd31084758b9ca782a1c8ba5e2760dee5d27e8f84ec9e90f5 +size 596 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/UI20/combo-checked.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/UI20/combo-checked.png new file mode 100644 index 0000000000..931997b7de --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/UI20/combo-checked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13a6a1da6e5e21fbe94b510c68671dfcdc38a5f9fe526699c2d9cccb5387876e +size 595 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle1.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle1.png new file mode 100644 index 0000000000..e7eb485e94 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f470a07169b00dc104bfb365bc7b9e126ca57e133bc26545e4c539322c965fd4 +size 202 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle2.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle2.png new file mode 100644 index 0000000000..15a0f21001 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2834eb4101a3b5ee1f59a8e12d55dc68de0825e24a06c7468a7d9eb4afb3e21f +size 218 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle3.png b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle3.png new file mode 100644 index 0000000000..688ec8451e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/img/triangle3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ebc0472590293c3b5e53fabef409bf1db056d3c02582066cf8e6655e5386999 +size 221 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/style_dark.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/style_dark.qss new file mode 100644 index 0000000000..193034b781 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/style_dark.qss @@ -0,0 +1,1273 @@ +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +:disabled{ + color: rgb(130, 130, 130); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QMainWindow{ + background-color: rgb(56, 58, 59); +} + +QMainWindow::separator { + border: 0px solid red; +} + +QMainWindow::separator:hover { + background-color: rgb(66, 133, 244); +} + +QMainWindow > QScrollArea { + background-color: rgb(45,45,45); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +QPushButton:!flat { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(90, 90, 90), stop:1 rgb(60, 60, 60)); + border: 1px solid black; + color: white; + opacity: 0.5; + padding: 1ex 2ex; +} + + +QPushButton:default { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(60, 60, 60), stop:1 rgb(30, 30, 30)); + color:rgb(0,0,0); + opacity: 0.5; + padding: 1ex 2ex; +} + +QPushButton:default:hover { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(160, 160, 160), stop:1 rgb(130, 130, 130)); + color:rgb(0,0,0); + opacity: 0.5; +} + +QPushButton:hover:!flat { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(150, 150, 150), stop:1 rgb(120, 120, 120)); + color: white; + opacity: 0.5; +} + +QPushButton:pressed { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(120, 120, 120), stop:1 rgb(90, 90, 90)); +} + +QPushButton:flat { + border: none; + background-color: transparent; + padding: none; + margin: none; +} + +QPushButton:flat:!hover +{ + color:rgb(210,210,210); +} + +QPushButton:flat:hover { + color:rgb(255,255,255); +} + +QDialogButtonBox > QPushButton, QDialog > QPushButton, QWizard > QWidget > QPushButton { + min-width: 5em; + min-height: 1.4em; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QDockWidget +{ + background-color: rgb(90, 90, 90); + border-top: 1px solid blue; + color : white; +} + +QDockWidget::title +{ + background-color: rgb(90, 90, 90); + border: 0px solid black; + padding: 0.4em; +} + +QDockWidget .QWidget +{ + background-color: rgb(40, 40, 40); + color: rgb(200,200,200); + border: 0px solid red; +} + +QDockWidget QScrollArea +{ + border: 0px solid rgb(90, 90, 90); +} + +#grabHandle +{ + background: none; + min-width: 4; + min-height: 16; + max-width: 4; + max-height: 16; + image: url(:/particleQT/icons/grab_handle.png); +} + +.DockWidget > #grabHandle +{ + margin-left: 1px; + margin-right: 3px; +} + +#Title > #grabHandle, #DockWidget::title > #grabHandle +{ + background: none; + color: none; + image: none; +} + +QDockWidget > QScrollArea +{ + border: 0px solid rgb(100, 100, 100); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QHeaderView::section{ +color: rgb(220,220,220); +} + +QHeaderView::section{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(90, 90, 90), stop:1 rgb(60, 60, 60)); + padding: 1ex; +} + +QHeaderView::section:first{ + border-top: 0px solid black; + border-right: 0px solid black; + border-bottom: 1px solid black; + border-left: 0px solid black; +} + +QHeaderView::section:middle{ + border-top: 0px solid black; + border-right: 0px solid black; + border-bottom: 1px solid black; + border-left: 1px solid black; +} + +QHeaderView::section:last{ + border-top: 0px solid black; + border-right: 0px solid black; + border-bottom: 1px solid black; + border-left: 1px solid black; +} + +QHeaderView::section:hover{ +background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(150, 150, 150), stop:1 rgb(120, 120, 120)); +} + +QHeaderView::section:pressed{ +background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(150, 150, 150), stop:1 rgb(120, 120, 120)); +} + +/* style the sort indicator */ +QHeaderView::down-arrow { +image: url(UI:arrow_down_V2.png); + +width: 10px; +height: 10px; + +padding-right: 1ex; +} + +QHeaderView::up-arrow { +image: url(UI:arrow_up_V2.png); + +width: 10px; +height: 10px; + +padding-right: 1ex; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QScrollBar{ + background-color: rgb(34, 34, 36); +} + +QScrollBar::add-page, QScrollBar::sub-page { + background: none; +} + +QScrollBar::horizontal{ + border:0px solid rgb(90, 90, 90); + border-left: 0px solid red; + border-right: 0px solid red; + + margin: 0px 16px 0px 16px; +} + +QScrollBar::vertical { + border: 0px solid rgb(90, 90, 90); + border-top: 0px solid red; + border-bottom: 0px solid red; + + margin: 16px 0px 16px 0px; +} + +QScrollBar::handle{ + background-color: rgb(110, 110, 110); + border: 1px solid rgb(65, 65, 65); +} + +QScrollBar::handle:horizontal{ + min-width: 20px; +} + +QScrollBar::handle:vertical{ + min-height: 20px; +} + +QScrollBar::handle:hover { + background-color: rgb(130, 130, 130); +} + +QScrollBar::handle:pressed { + background-color: rgb(180, 180, 180); +} + +QScrollBar::add-line:horizontal { + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 rgb(60, 60, 60), stop:1 rgb(90, 90, 90)); + border: 1px solid rgb(90, 90, 90); + border-left:0px; + + width: 15px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 rgb(90, 90, 90), stop:1 rgb(60, 60, 60)); + border: 1px solid rgb(90, 90, 90); + border-right:0px; + + width: 15px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 rgb(100, 100, 100), stop:1 rgb(150, 150, 150)); +} + +QScrollBar::sub-line:horizontal:hover{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 rgb(150, 150, 150), stop:1 rgb(100, 100, 100)); +} + +QScrollBar::add-line:horizontal:pressed{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 rgb(130, 130, 130), stop:1 rgb(180, 180, 180)); +} + +QScrollBar::sub-line:horizontal:pressed{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 rgb(180, 180, 180), stop:1 rgb(130, 130, 130)); +} + +QScrollBar::add-line:vertical { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(60, 60, 60), stop:1 rgb(90, 90, 90)); + border: 1px solid rgb(90, 90, 90); + border-top:0px; + + height: 15px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(90, 90, 90), stop:1 rgb(60, 60, 60)); + border: 1px solid rgb(90, 90, 90); + border-bottom:0px; + + height: 15px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(100, 100, 100), stop:1 rgb(150, 150, 150)); +} + +QScrollBar::sub-line:vertical:hover{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(150, 150, 150), stop:1 rgb(100, 100, 100)); +} + +QScrollBar::add-line:vertical:pressed{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(130, 130, 130), stop:1 rgb(180, 180, 180)); +} + +QScrollBar::sub-line:vertical:pressed{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(130, 130, 130)); +} + +QScrollBar::left-arrow:horizontal{ + background-image: url(UI:arrow_left_V2.png); + background-position: center; +} + +QScrollBar::right-arrow{ + background-image: url(UI:arrow_right_V2.png); + background-position: center; +} + +QScrollBar::up-arrow:vertical{ + background-image: url(UI:arrow_up_V2.png); + background-position: center; +} + +QScrollBar::down-arrow:vertical{ + background-image: url(UI:arrow_down_V2.png); + background-position: center; +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QSplitter{ + background-color: transparent; + border: 0px solid red; +} + +QSplitter::handle{ + background-color: rgb(40,40,40); + border: 0px solid green; +} + +/* --------------------------------------------------------------------------- + Scroll Views + --------------------------------------------------------------------------*/ + +QScrollArea > QWidget { + background-color: rgb(120, 120, 120); +} + +QScrollArea > QWidget > QWidget { + background-color: rgb(140, 140, 140); + color: rgb(220,220,220); +} + +/*----------------------------------------------------------------------------*/ +/* All Tree Views */ +/*----------------------------------------------------------------------------*/ + +QTreeView{ + background-color: rgb(100, 100, 100); + alternate-background-color: rgb(90, 90, 90); + border: 0px solid black; + color: rgb(220,220,220); +} + +QTreeView:enabled{ + background-color: rgb(100, 100, 100); + alternate-background-color: rgb(90, 90, 90); +} + +QTreeView:!enabled{ + background-color: rgb(45, 45, 45); + alternate-background-color: rgb(35, 35, 35); +} + +QTreeView:active{ + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); +} + +QTreeView:!active{ + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(70, 70, 70)); +} + +QTreeView::item:enabled{ + color: rgb(220,220,220); +} + +QTreeView::item:!enabled{ + color: rgb(127,127,127); +} + +QTreeView::item QWidget { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); + color: rgb(220,220,220); +} + +QTreeView::item:selected:!active { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(70, 70, 70), stop:1 rgb(50, 50, 50)); +} + +QTreeView::item:selected:active { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); +} + +QTreeView::item:hover { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(110, 110, 110), stop:1 rgb(120, 120, 120)); +} + +QTreeView::branch:closed:has-children:!has-siblings, QTreeView::branch:closed:has-children:has-siblings +{ + border-image: none; + image: url(UI:treeview_arrow_right.png); +} + +QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings +{ + border-image: none; + image: url(UI:treeview_arrow_down.png); +} + +QTreeView::indicator +{ + border: 0px solid red; + width: 14px; + height: 16px; +} + +QTreeView::indicator:unchecked { + image: url(UI:checkbox_unchecked.png); +} + +QTreeView::indicator:unchecked:disabled{ + image: url(UI:checkbox_unchecked_disabled.png); +} + +QTreeView::indicator:checked{ + image: url(UI:checkbox_checked.png); +} + +QTreeView::indicator:checked:disabled{ + image: url(UI:checkbox_checked_disabled.png); +} + +QListView{ + background-color: rgb(100, 100, 100); + alternate-background-color: rgb(90, 90, 90); + border: 0px solid black; + color: rgb(220,220,220); +} + +QListView:enabled{ + background-color: rgb(100, 100, 100); + alternate-background-color: rgb(90, 90, 90); +} + +QListView:!enabled{ + background-color: rgb(45, 45, 45); + alternate-background-color: rgb(35, 35, 35); +} + +QListView:active{ + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); +} + +QListView:!active{ + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(70, 70, 70)); +} + +QListView::item:enabled{ + color: rgb(220,220,220); +} + +QListView::item:!enabled{ + color: rgb(127,127,127); +} + +QListView::item QWidget { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); + color: rgb(220,220,220); +} + +QListView::item:selected:!active { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(70, 70, 70), stop:1 rgb(50, 50, 50)); +} + +QListView::item:selected:active { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); +} + +QListView::item:hover { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(110, 110, 110), stop:1 rgb(120, 120, 120)); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + + +QTableView{ + background-color: rgb(100, 100, 100); + alternate-background-color: rgb(90, 90, 90); + border: 0px solid black; + color: rgb(220,220,220); +} + +QTableView:enabled{ + background-color: rgb(100, 100, 100); + alternate-background-color: rgb(90, 90, 90); +} + +QTableView:!enabled{ + background-color: rgb(45, 45, 45); + alternate-background-color: rgb(35, 35, 35); +} + +QTableView:active{ + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); +} + +QTableView:!active{ + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(70, 70, 70)); +} + +QTableView::item:enabled{ + color: rgb(220,220,220); +} + +QTableView::item:!enabled{ + color: rgb(127,127,127); +} + +QTableView::item QWidget { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); + color: rgb(220,220,220); +} + +QTableView::item:selected:!active { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(70, 70, 70), stop:1 rgb(50, 50, 50)); +} + +QTableView::item:selected:active { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(80, 80, 80), stop:1 rgb(60, 60, 60)); +} + +QTableView::item:hover { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(110, 110, 110), stop:1 rgb(120, 120, 120)); +} + + + + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QMenuBar{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(120, 120, 120), stop:1 rgb(100, 100, 100)); +} + +QMenuBar::item{ + background-color: transparent; + color: rgb(220, 220, 220); +} + +QMenuBar::item:selected{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(130, 130, 130)); + color: rgb(220, 220, 220); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QMenu{ +background-color: rgb(60, 60, 60); +color: rgb(220, 220, 220); +border: 0px solid red; +padding: 5px; +} + +QMenu::item{ +background-color: transparent; +border: 1px solid transparent; +padding: 2px 25px 2px 20px; +} + +QMenu::item:selected{ +background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(150, 150, 150), stop:1 rgb(100, 100, 100)); +border: 1px solid transparent; +color:rgb(220, 220, 220); +} + +QMenu::separator{ +height: 1px; +background-color: rgb(220, 220, 220); +margin: 5px 25px 5px 20px; +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QDialog{ + background-color: rgb(95, 95, 95); + border: 0px solid black; +} + +QDialog WScrollArea{ + background-color: rgb(40, 40, 40); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QTabWidget::pane { /* The tab widget frame */ + border: 0px solid black; + margin-top:-1px; +} + +QTabWidget::tab-bar { + width: 9999px; +} + +/*----------------------------------------------------------------------------*/ +/* TOP TAB BAR */ +/*----------------------------------------------------------------------------*/ +QTabBar{ + background-color: rgb(80, 80, 80); + border:0px solid red; + color: rgb(80, 80, 80); +} + +QTabBar::tab{ + background-color: rgb(40, 40, 40); + min-width:3em; + padding: 0.5ex 0.5em; + color: rgb(190, 190, 190); +} + +QTabBar::tab:selected{ + background-color: rgb(120, 120, 120); + border-width: 1px; + border-style: solid; + color: rgb(230, 230, 230); +} + +QTabBar::tab:top:selected{ + border-bottom-color: rgb(128, 128, 128); + border-top-color: rgb(180, 180, 180); + border-left-color: rgb(180, 180, 180); + border-right-color: rgb(180, 180, 180); +} + +QTabBar::tab:bottom:selected{ + border-top-color: rgb(128, 128, 128); + border-bottom-color: rgb(180, 180, 180); + border-left-color: rgb(180, 180, 180); + border-right-color: rgb(180, 180, 180); +} + +QTabBar::tab:!selected{ + border: 1px solid rgb(80,80,80); + margin-top: 2px; +} + +QTabBar::tab:first:selected{ + margin-left: 0px; + margin-right: -2px; +} + +QTabBar::tab:middle:selected{ + margin-left: 0px; + margin-right: -2px; +} + +QTabBar::tab:last:selected{ + margin-left: 0px; + margin-right: 0px; +} + +QTabBar::tab:last:!selected{ + border-left:0px solid red; + border-right:0px solid black; +} + +QTabBar::tab:!selected:hover{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(90, 90, 90), stop:1 rgb(60, 60, 60)); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +QProgressBar { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(90, 90, 90), stop:1 rgb(60, 60, 60)); + border: 1px solid black; + color:black; + border-radius: 6px; +} + +QProgressBar::chunk{ + background-color:qlineargradient(x1:0, y0:0, x2:0, y2:1, stop:0 rgb(255, 93, 0), stop:1 rgb(180, 45, 0)); + border: 1px solid rgba(255,255,255,128); + border-radius: 3px; +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QToolBar{ + border: 0px; + spacing: 0px; +} + +QToolBar:horizontal{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(0, 0, 0), stop:0.035 rgb(67, 69, 70), stop:0.95 rgb(40, 40, 40), stop:0.98 rgb(0, 0, 0)); +} + +QToolBar:vertical{ + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0.98 rgb(0, 0, 0), stop:0.95 rgb(67, 69, 70), stop:0.035 rgb(40, 40, 40), stop:0 rgb(0, 0, 0)); +} + +QToolBar:separator{ + background-color:qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(90, 90, 90));; + border-right: 0px solid black; + border-bottom: 0px solid black; + + width:1px; + height:1px; + margin:5px; +} + +QToolButton { + width: 24px; + height: 24px; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QSlider::groove:horizontal { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(140, 140, 140)); + border: 0px solid rgb(60, 60, 60); + height: 8px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ +} + +QSlider::handle:horizontal { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(140, 140, 140)); + border: 1px solid rgb(60, 60, 60); + width: 8px; + margin: -2px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ + border-radius: 2px; +} + +QSlider::handle:horizontal:hover { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(220, 220, 220), stop:1 rgb(180, 180, 180)); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QStatusBar{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(90, 90, 90), stop:1 rgb(60, 60, 60)); + color: rgb(220, 220, 220); + border: 0px solid red; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +DlgSettings QToolButton { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(60, 60, 60), stop:1 rgb(90, 90, 90)); + color:rgb(220,220,220); +} + +DlgSettings QTabWidget::pane { + background-color: rgb(60, 60, 60); +} + +DlgSettings QTabBar[shape="0"]::tab:selected { + background-color: rgb(60, 60, 60); + color: white; + border-top:3px solid rgb(30, 144, 255); +} + +QToolButton { + background-color: transparent; + border: 0px solid red; + color:rgb(220, 220, 220); +} + +QToolButton::hover{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(70, 70, 70), stop:1 rgb(57, 57, 57)); +} + +QToolButton::checked{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(70, 70, 70), stop:1 rgb(57, 57, 57)); +} + +QToolButton::pressed{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(120, 120, 120), stop:1 rgb(90, 90, 90)); +} + +QToolButton[popupMode="1"]{ + padding-right: 10px; +} + +QToolButton::menu-button{ + border: 0px solid red; +} + +QToolButton::menu-button:hover{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(150, 150, 150)); +} + +QToolButton::menu-button:pressed{ + +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QLabel, QCheckBox, QRadioButton +{ + color: rgb(200, 200, 200); +} + +QLabel:focus, QCheckBox:focus, QRadioButton:focus{ + color: rgb(250, 250, 250); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QSpinBox, QDoubleSpinBox { + border: 1px solid black; + padding:0px; + + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(150, 150, 150)); + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(120, 120, 120), stop:1 rgb(60, 60, 60)); + selection-color: white; +} + +QSpinBox:focus, QDoubleSpinBox:focus { + border: 1px solid white; + padding:0px; + + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(200, 200, 200), stop:1 rgb(170, 170, 170)); + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(140, 140, 140), stop:1 rgb(80, 80, 80)); + selection-color: white; +} + + +QSpinBox::up-button, QSpinBox::down-button, QDoubleSpinBox::up-button, QDoubleSpinBox::down-button { + subcontrol-origin: border; + width: 16px; + border-width: 0px; +} + +QSpinBox::up-button, QDoubleSpinBox::up-button { + subcontrol-position: top right; +} + +QSpinBox::down-button, QDoubleSpinBox::down-button { + subcontrol-position: bottom right; +} + +QSpinBox::up-arrow, QDoubleSpinBox::up-arrow { + border-image: url(UI:spinbox_up.png); + height:7px; +} + +QSpinBox::down-arrow, QDoubleSpinBox::down-arrow { + border-image: url(UI:spinbox_down.png); + height:7px; +} + +QSpinBox:disabled, QDoubleSpinBox:disabled +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(150, 150, 150), stop:1 rgb(120, 120, 120)); + color: rgb(64,64,64); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QCheckBox::indicator:unchecked{ + image: url(UI:checkbox_unchecked.png); +} + +QCheckBox::indicator:unchecked:disabled{ + image: url(UI:checkbox_unchecked_disabled.png); +} + +QCheckBox::indicator:checked{ + image: url(UI:checkbox_checked.png); +} + +QCheckBox::indicator:checked:disabled{ + image: url(UI:checkbox_checked_disabled.png); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QRadioButton::indicator:unchecked{ + image: url(UI:radiobutton_unchecked.png); +} + +QRadioButton::indicator:unchecked:disabled{ + image: url(UI:radiobutton_unchecked_disabled.png); +} + +QRadioButton::indicator:checked{ + image: url(UI:radiobutton_checked.png); +} + +QRadioButton::indicator:checked:disabled{ + image: url(UI:radiobutton_checked_disabled.png); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QLineEdit { + border: 1px solid black; + padding:0px; + + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(70, 70, 70), stop:1 rgb(57, 57, 57)); + color:white; + + selection-background-color: rgb(46, 46, 46); + selection-color: white; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QLineEdit:focus { + border: 1px solid white; + padding:0px; + + background-color: rgb(46, 46, 46); + color:white; + + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(140, 140, 140), stop:1 rgb(80, 80, 80)); + selection-color: white; +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QComboBox +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(150, 150, 150)); + color:white; + + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(120, 120, 120), stop:1 rgb(60, 60, 60)); + selection-color: white; + border: 1px black; +} + +QComboBox:focus +{ + border: 1px solid white; + padding:0px; + + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(200, 200, 200), stop:1 rgb(170, 170, 170)); + color:black; + + selection-background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(140, 140, 140), stop:1 rgb(80, 80, 80)); + selection-color: white; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border: 0px; +} + +QComboBox::down-arrow +{ + image: url(UI:dropdown_arrow.png); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +/* fix group box */ +QGroupBox{ + color: rgb(200, 200, 200); + background-color: rgb(90, 90, 90); + border: 1px solid black; + + margin-top: 1.1em; /* leave space at the top for the title */ + margin-bottom: 0.1em; /* leave space at the top for the title */ + + font-weight: bold; +} + +QGroupBox::title{ + border: 0px solid red; + + subcontrol-origin: margin; + top: 0px; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QTextEdit{ + background-color: rgb(90, 90, 90); + color: rgb(220,220,220); + border: 3px solid rgb(90, 90, 90); + + selection-background-color: rgb(60, 60, 60) ; + selection-color: rgb(220, 220, 220); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QToolTip{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(150, 150, 150)); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QWizard{ +} + +QWizard > QWidget{ + background-color: rgb(40,40,40); + color:rgb(220,220,220); +} + +QWizard > QFrame{ + background-color: rgb(40,40,40); + color:rgb(220,220,220); +} + +QWizard > QWidget > QLabel{ + background-color: rgb(40,40,40); + color:rgb(220,220,220); +} + +QWizard QListView{ + background-color: rgb(60,60,60); + color:rgb(220,220,220); +} + + +QWizardPage > QFrame{ + background-color: transparent; + border: 1px solid black; +} + +SearchLineEdit{ + background-color: transparent; + border: 0px solid black; + padding: 0px; +} + +SearchLineEdit>QLineEdit{ + background-color: rgb(160, 160, 160); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +QPlainTextEdit{ + border: 0px solid rgb(0, 0, 0); + background-color: rgb(90, 90, 90); + color: rgb(220,220,220); + selection-background-color: rgb(220, 220, 220) ; + selection-color: rgb(90, 90, 90); +} + +QPlainTextEdit:focus{ + background-color: rgb(90, 90, 90); + selection-background-color: rgb(220, 220, 220) ; + selection-color: rgb(90, 90, 90); +} + +QPlainTextEdit:!focus{ + background-color: rgb(70, 70, 70); + color: rgb(200,200,200); + selection-background-color: rgb(200, 200, 200) ; + selection-color: rgb(70, 70, 70); +} + +QPlainTextEdit[readOnly="true"]:focus{ + background-color: rgb(70, 70, 70); + color: rgb(200,200,200); + selection-background-color: rgb(200, 200, 200) ; + selection-color: rgb(70, 70, 70); +} + +QPlainTextEdit[readOnly="true"]:!focus{ + background-color: rgb(50, 50, 50); + color: rgb(180,180,180); + selection-background-color: rgb(180, 180, 180) ; + selection-color: rgb(50, 50, 50); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +QPushButton#captureButton { + background-color: "#F3811D"; + border: 1px solid #212223; + color: #ffffff; +} + +QPushButton#captureButton:disabled { + background-color: rgba(90,44,4,50%); + border: 1px solid #212223; + color: rgba(255,255,255,50%); +} +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +Driller--DrillerCaptureWindow > #centralwidget > #playButton { + color: white; +} + + +Driller--DrillerCaptureWindow > #centralwidget > AzToolsFramework--AZAutoSizingScrollArea#scrollArea { + background-color: rgb(100,100,100); + border: 1px solid rgb(100,100,100); +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +Driller--DrillerMainWindow QDockWidget +{ + background: rgb(56, 58, 59); +} + +Driller--DrillerMainWindow QDockWidget::title +{ + background: rgb(56, 58, 59); +} + +Driller--DrillerMainWindow QDockWidget .QWidget +{ + background: rgb(56, 58, 59); + border: 0px solid red; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +Driller--ChannelControl > QFrame { + background-color: rgb(100, 100, 100); +} + +Driller--ChannelControl > #infoArea > QLabel { + color: #999999; + font-size: 12px; + font-family: "open sans"; + font-weight:600; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +Driller--ChannelProfilerWidget #profilerName { + color: #cccccc; + font-size: 13px; + font-family: "open sans"; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +Driller--AnnotationHeaderView { + background-color: rgb(80,80,80); +} + +Driller--AnnotationHeaderView > #frame { + background-color: rgb(80,80,80); +} + +Driller--AnnotationHeaderView > #frame > #annotationBackground { + background-color: rgb(80,80,80); +} + +Driller--AnnotationHeaderView > #frame > #annotationBackground > #configureAnnotations { + color: white; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +Driller--CollapsiblePanel > QGroupBox { + background-color: rgb(56, 58, 59); + margin-top: 0px; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +AzToolsFramework--TargetSelectorButton#targetButton { + color: white; +} + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +LUAEditor--LUAEditorBreakpointWidget:!enabled { + border: 0px solid rgb(0, 0, 0); +} + +LUAEditor--LUAEditorBreakpointWidget:enabled { + border: 0px solid rgb(0, 0, 0); +} + +LUAEditor--FoldingWidget:!enabled { + border: 0px solid rgb(0, 0, 0); + background-color: rgb(70, 70, 70); +} + +LUAEditor--FoldingWidget:enabled { + border: 0px solid rgb(0, 0, 0); + background-color: rgb(90, 90, 90); +} + +LUAEditor--LUAEditorSettingsDialog QFrame { + background-color: rgb(90, 90, 90); +} + +HexPropertySystem--PropertyAssetCtrl QLabel:!focus +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(150, 150, 150)); + color: black; + border: 1px solid black; +} + +HexPropertySystem--PropertyAssetCtrl QLabel:focus +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(200, 200, 200), stop:1 rgb(170, 170, 170)); + color: black; + border: 1px solid white; +} + +HexPropertySystem--PropertyAssetCtrl QLabel[drophighlight="true"] +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 255, 180), stop:1 rgb(150, 255, 150)); + color: black; + border: 1px solid white; +} + +HexPropertySystem--PropertyEntityIdCtrl QLabel:!focus +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 180, 180), stop:1 rgb(150, 150, 150)); + color: black; + border: 1px solid black; +} + +HexPropertySystem--PropertyEntityIdCtrl QLabel:focus +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(200, 200, 200), stop:1 rgb(170, 170, 170)); + color: black; + border: 1px solid white; +} + +HexPropertySystem--PropertyEntityIdCtrl QLabel[drophighlight="true"] +{ + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(180, 255, 180), stop:1 rgb(150, 255, 150)); + color: black; + border: 1px solid white; +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/test_widget.ui b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/test_widget.ui new file mode 100644 index 0000000000..8cf50cefdf --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/test_widget.ui @@ -0,0 +1,371 @@ + + + Form + + + + 0 + 0 + 461 + 502 + + + + Form + + + + + + + + Watcher + + + + + + + + On / Off + + + + + + + Wacher Foler + + + + + + + Watch folder + + + + + + + ... + + + + + + + Wacher Extensions + + + + + + + *.sbsar, *.sbs + + + + + + + + + + + + + + + Qt::Horizontal + + + + + + + Sbsar + + + + + + + + Parameters + + + + + + + + Preset + + + + + + + Size + + + + + + + RandomSeed + + + + + + + + + + + + Grey Stone + + + + + Red Coral + + + + + Red Stone + + + + + + + + + 512 * 512 + + + + + 1024 * 1024 + + + + + 2048 * 2048 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Vertical + + + + + + + Output + + + + + + true + + + Base Color + + + true + + + + + + + Albedo + + + + + + + Specular + + + + + + + Metallic + + + true + + + + + + + Normal map + + + + + + + Glossness + + + + + + + Roughness + + + true + + + + + + + Opacity + + + true + + + + + + + + + + Qt::Vertical + + + + + + + Atom Material + + + + + + + + + + Name + + + + + + + + + + + + Create .material + + + + + + + Render textures + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + ... + + + + + + + Bake SBSAR from SBS + + + + + + + + + + + + + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/watchdog/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/watchdog/__init__.py new file mode 100644 index 0000000000..65bec76ddf --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/watchdog/__init__.py @@ -0,0 +1,166 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# -- This line is 75 characters ------------------------------------------- +# The __init__.py files help guide import statements without automatically +# built-ins +import os +import sys +import site +import time + +# ------------------------------------------------------------------------- +# we don't have access yet to the DCCsi Lib\site-packages +# (1) this will give us import access to dccsi and azpy import +_DCCSIG_PATH = os.getenv('DCCSIG_PATH', os.getcwd()) # always?, doubtful +# ^^ this assume that the \DccScriptingInterface is the cwd!!! (launch there) +site.addsitedir(_DCCSIG_PATH) + +# Lumberyard extensions +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE +from azpy.constants import * + +# 3rdparty +from unipath import Path +from watchdog.observers import Observer +from watchdog.events import PatternMatchingEventHandler +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# substance automation toolkit (aka pysbs) +# To Do: manage with dynaconf environment +_PYSBS_DIR_PATH = Path(PATH_PROGRAMFILES_X64, + 'Allegorithmic', + 'Substance Automation Toolkit', + 'Python API', + 'install').resolve() + +site.addsitedir(str(_PYSBS_DIR_PATH)) # 'install' is the folder I created + +# Susbstance +import pysbs.batchtools as pysbs_batch +import pysbs.context as pysbs_context +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = __name__ +if _PACKAGENAME is '__main__': + _PACKAGENAME = 'DCCsi.SDK.substance.builder.watchdog' + +import azpy +_LOGGER = azpy.initialize_logger(_PACKAGENAME) +_LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# check some env var tags (fail if no, likely means no proper code access)from collections import OrderedDict +from collections import OrderedDict +_SYNTH_ENV_DICT = OrderedDict() +_SYNTH_ENV_DICT = azpy.synthetic_env.stash_env(_SYNTH_ENV_DICT) +_LY_DEV = _SYNTH_ENV_DICT[ENVAR_LY_DEV] +_LY_PROJECT_PATH = _SYNTH_ENV_DICT[ENVAR_LY_PROJECT_PATH] + + +# ------------------------------------------------------------------------- +class MyHandler(PatternMatchingEventHandler): + patterns = ["*.sbsar", "*.txt"] + + def process(self, event): + """ + event.event_type + 'modified' | 'created' | 'moved' | 'deleted' + event.is_directory + True | False + event.src_path + path/to/observed/file + """ + self.outputName = event.src_path.split(".sbsar")[0].split("/")[-1] + self.outputCookPath = event.src_path.split(self.outputName) + self.outputRenderPath = Path(_LY_PROJECT_PATH, 'Assets', 'Textures', 'Substance').norm() + _LOGGER.debug(self.outputCookPath, self.outputName, self.outputRenderPath) + + pysbs_batch.sbsrender_info(input=event.src_path) + pysbs_batch.sbsrender_render(inputs=event.src_path, + # inputs=os.path.join(self.outputCookPath, self.outputName + '.sbsar'), + # input_graph=_inputGraphPath, + output_path=self.outputRenderPath, + output_name='{inputGraphUrl}_{outputNodeName}', + output_format='tif', + # set_value=['$outputsize@%s,%s' % (_outputSize, _outputSize), '$randomseed@1'], + # use_preset = _user_preset[0] + no_report=True, + verbose=True + ).wait() + # print(self.outputName, self.outputCookPath) + # builder.output_info(self.outputCookPath, self.outputName) + # print(builder.output_info(event.src_path.split("/")[0], event.src_path.split("/")[-1].split(".sbsar")[0])['_inputs']) + # pysbs_batch.sbsrender_render( + # input = event.src_path, + # output_path = 'C:/dccapi/dev/Gems/DccScriptingInterface/MockProject/Assets/Materials/Substance/textures', + # output_name = '{inputGraphUrl}_{outputNodeName}', + # output_format = 'tif', + # # set_value=['$outputsize@9,9', '$randomseed@3'] + # set_value = '$outputsize@10,10', + # use_preset = ['Red Coral', 'Red Sand', 'Grey Stone'][0] + # ).wait() + # pysbs_batch.sbsrender_render( + # input = event.src_path, + # output_path = 'C:/dccapi/dev/Gems/DccScriptingInterface/MockProject/Assets/Materials/Substance/textures', + # output_name = '{inputGraphUrl}_{outputNodeName}', + # output_format = 'tif', + # # set_value=['$outputsize@9,9', '$randomseed@3'] + # set_value = '$outputsize@10,10', + # use_preset = 'Red Sand' + # ).wait() + + # print("Hello World!!!") + + def on_modified(self, event): + self.process(event) + + def on_created(self, event): + self.process(event) + + +if __name__ == '__main__': + """Run this file as main""" + _TYPE_TAG = 'MODULE_TEST' + + _TEST_APP_NAME = '{0}-{1}'.format(_TOOL_TAG, _TYPE_TAG) + + _LOGGER = setup_config_logging(_TEST_APP_NAME) + _LOGGER.debug("Test Run:: {0}.".format({_PACKAGENAME})) + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_TOOL_TAG)) + + args = sys.argv[1:] + observer = Observer() + observer.schedule(MyHandler(), path=args[0] if args else '.') + observer.start() + + try: + while True: + time.sleep(1) + except KeyboardInterrupt: + observer.stop() + + observer.join() + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/StandardPBR.basematerial b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/StandardPBR.basematerial new file mode 100644 index 0000000000..ef285d0834 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/StandardPBR.basematerial @@ -0,0 +1,262 @@ +{ + + "baseMaterial": { + "description": "TBD description", + "propertyLayout": { + "version": 1, + "groups": [ + { + "id": "baseColor", + "displayName": "Base Color", + "description": "Properties for configuring the surface color (for non-metal) or specular color (for metal)." + }, + { + "id": "metallic", + "displayName": "Metallic", + "description": "Properties for configuring whether the surface is metallic or not." + }, + { + "id": "roughness", + "displayName": "Roughness", + "description": "Properties for configuring how rough the surface appears." + }, + { + "id": "specularF0", + "displayName": "Specular Reflectance f0", + "description": "The constant f0 represents the specular reflectance at normal incidence (Fresnel 0 Angle). The default IOR is 1.5, which gives you 0.04 (4% of light reflected at 0° angle for dielectric materials). F0 values lie in the range 0-0.08, so that’s why the default F0 factor is set on 0.5." + }, + { + "id": "normal", + "displayName": "Normal", + "description": "Properties for configuring surface normals." + }, + { + "id": "opacity", + "displayName": "Opacity", + "description": "Properties for configuring surface opacity." + } + ], + "properties": { + "general": [ + { + "id": "texcoord", + "displayName": "Texture Coordinate Stream", + "description": "Which UV stream to use when sampling textures.", + "type": "int", + "defaultValue": 0, + "min": 0, + "max": 8 + } + ], + "baseColor": [ + { + "id": "colorLinear", + "displayName": "Color", + "description": "Linear color value", + "type": "color", + "defaultValue": [ 1.0, 1.0, 1.0 ], + "aliasOutputId": { + "type": "shaderConstant", + "id": "m_baseColor" + } + }, + { + "id": "factor", + "displayName": "Factor", + "description": "Strength factor for scaling the color values", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0, + "aliasOutputId": { + "type": "shaderConstant", + "id": "m_baseColorFactor" + } + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map, or just the Color value", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Base color texture map", + "type": "image", + "defaultValue": "EngineAssets/TextureMsg/DefaultNoUVs.tif", + "aliasOutputId": { + "type": "shaderImage", + "id": "m_baseColorMap" + } + } + ], + "metallic": [ + { + "id": "factor", + "displayName": "Factor", + "description": "Strength factor for scaling the values", + "type": "float", + "defaultValue": 0.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map, or just default to the Factor value.", + "type": "bool", + "defaultValue": false + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "", + "type": "image", + "defaultValue": "" + } + ], + "roughness": [ + { + "id": "factor", + "displayName": "Factor", + "description": "Strength factor for scaling the values", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map, or just default to the Factor value.", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for defining surface roughness.", + "type": "image", + "defaultValue": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + } + ], + "specularF0": [ + { + "id": "factor", + "displayName": "Factor", + "description": "Strength factor for scaling the values from 0.0 to 0.08", + "type": "float", + "defaultValue": 0.5, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map, or just default to the Factor value.", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for defining surface reflectance.", + "type": "image", + "defaultValue": "" + } + ], + "normal": [ + { + "id": "factor", + "displayName": "Factor", + "description": "Strength factor for scaling the values", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map, or just rely on vertex normals.", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for defining surface normal direction.", + "type": "image", + "defaultValue": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif", + "aliasOutputId": { + "type": "shaderImage", + "id": "m_normalMap" + } + } + ], + "opacity": [ + { + "id": "doubleSided", + "displayName": "Double-sided", + "description": "Whether to render back-faces or just front-faces.", + "type": "bool", + "defaultValue": false + }, + { + "id": "factor", + "displayName": "Factor", + "description": "Scales the opacity values", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "cutoutAlpha", + "displayName": "Cutout Alpha", + "description": "Whether to clip the surfaces where the alpha value falls below a threshold.", + "type": "bool", + "defaultValue": false + }, + { + "id": "cutoutThreshold", + "displayName": "Cutout Alpha Threshold", + "description": "If enabled, values lower than this will be clipped.", + "type": "float", + "defaultValue": 0.5, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useBaseColorTextureAlpha", + "displayName": "Use Base Color Texture Alpha", + "description": "Use the alpha channel of the base color texture map to define opacity.", + "type": "bool", + "defaultValue": false + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map to define opacity.", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for defining surface opacity.", + "type": "image", + "defaultValue": "" + } + ] + } + }, + "shaders": [ + { + "file": "./StandardPBR_ForwardPass.shader" + } + ] + } +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/StandardPBR_AllProperties.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/StandardPBR_AllProperties.material new file mode 100644 index 0000000000..7d38d1a1a3 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/StandardPBR_AllProperties.material @@ -0,0 +1,47 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "general": { + "texcoord": 0 + }, + "baseColor": { + "colorLinear": [ 1.0, 1.0, 1.0 ], + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + }, + "metallic": { + "factor": 0.0, + "useTexture": false, + "textureMap": "" + }, + "roughness": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif" + }, + "opacity": { + "doubleSided": false, + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": false, + "textureMap": "" + } + } +} + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom.material new file mode 100644 index 0000000000..9c7c82f0a5 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom.material @@ -0,0 +1,15 @@ +{ + "material": { + "baseMaterial": "StaticMesh.basematerial", + "propertyLayoutVersion": 1, + "properties": { + "general": { + "DiffuseColor": [ 1.0, 0.5, 0.5, 1.0 ], + "DiffuseMap": "Textures/Streaming/streaming12.dds", + "NormalMap": "Textures/left_mask.png", + "SpecularMap": "Textures/left_mask.png", + "EnvironmentMap": "Textures/YokohamaCube_cm.dds" + } + } + } +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_PBR_BASE.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_PBR_BASE.material new file mode 100644 index 0000000000..6e35b2e4fb --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_PBR_BASE.material @@ -0,0 +1,265 @@ +{ + "baseMaterial": { + "description": "Base Material with properties used to define Standard PBR, a metallic-roughness Physically-Based Rendering (PBR) material shading model.", + "propertyLayout": { + "version": 1, + "groups": [ + { + "id": "baseColor", + "displayName": "Base Color", + "description": "Properties for configuring the surface reflected color for dielectrics or reflectance values for metals." + }, + { + "id": "metallic", + "displayName": "Metallic", + "description": "Properties for configuring whether the surface is metallic or not." + }, + { + "id": "roughness", + "displayName": "Roughness", + "description": "Properties for configuring how rough the surface appears." + }, + { + "id": "specularF0", + "displayName": "Specular Reflectance f0", + "description": "The constant f0 represents the specular reflectance at normal incidence (Fresnel 0 Angle)." + }, + { + "id": "normal", + "displayName": "Normal", + "description": "Properties related to configuring surface normal." + }, + { + "id": "opacity", + "displayName": "Opacity", + "description": "Properties for configuring the materials transparency." + } + ], + "properties": { + "general": [ + { + "id": "texcoord", + "displayName": "UV Channel", + "description": "Which UV channel to use when sampling textures.", + "type": "int", + "defaultValue": 0, + "min": 0, + "max": 8 + } + ], + "baseColor": [ + { + "id": "colorLinear", + "displayName": "Color", + "description": "Color is displayed as sRGB but the values are stored as linear color.", + "type": "color", + "defaultValue": [ + 1.0, + 1.0, + 1.0 + ], + "aliasOutputId": { + "type": "shaderConstant", + "id": "m_baseColor" + } + }, + { + "id": "factor", + "displayName": "Factor", + "description": "Strength factor for scaling the base color values. Zero (0.0) is black, white (1.0) is full color.", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0, + "aliasOutputId": { + "type": "shaderConstant", + "id": "m_baseColorFactor" + } + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to enable using the texture map values (texture value is scaled by the factor.)", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Base color texture map", + "type": "image", + "defaultValue": "EngineAssets/TextureMsg/DefaultNoUVs.tif", + "aliasOutputId": { + "type": "shaderImage", + "id": "m_baseColorMap" + } + } + ], + "metallic": [ + { + "id": "factor", + "displayName": "Factor", + "description": "Determines if surface is metal or not. Black (0.0) is non-metal, white (1.0) means raw metal.", + "type": "float", + "defaultValue": 0.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to enable using the texture map values (texture value is scaled by the factor.)", + "type": "bool", + "defaultValue": false + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for defining per-pixel surface metalness variation.", + "type": "image", + "defaultValue": "" + } + ], + "roughness": [ + { + "id": "factor", + "displayName": "Factor", + "description": "Describes transition from smooth to rough microfacet surface. Black (0.0) is smooth, white (1.0) is rough.", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to enable using the texture map values (texture value is scaled by the factor.)", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for describing per-pixel surface roughness variation.", + "type": "image", + "defaultValue": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + } + ], + "specularF0": [ + { + "id": "factor", + "displayName": "Factor", + "description": "The default IOR is 1.5, which gives you 0.04 (4% of light reflected at 0\u00c2\u00b0 angle for dielectric materials). F0 values lie in the range 0-0.08, so that\u00e2\u20ac\u2122s why the default F0 slider is set on 0.5.", + "type": "float", + "defaultValue": 0.5, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to enable using the texture map values (texture value is scaled by the factor.)", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for describing per-pixel surface specular reflectance variation.", + "type": "image", + "defaultValue": "" + } + ], + "normal": [ + { + "id": "factor", + "displayName": "Factor", + "description": "Strength factor for scaling the influence of normal map values", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map, or just rely on vertex normals.", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for defining Tangent space surface normal direction.", + "type": "image", + "defaultValue": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif", + "aliasOutputId": { + "type": "shaderImage", + "id": "m_normalMap" + } + } + ], + "opacity": [ + { + "id": "doubleSided", + "displayName": "Double-sided", + "description": "Whether to render back-faces or just front-faces.", + "type": "bool", + "defaultValue": false + }, + { + "id": "factor", + "displayName": "Factor", + "description": "Scales the opacity values", + "type": "float", + "defaultValue": 1.0, + "min": 0.0, + "max": 1.0 + }, + { + "id": "cutoutAlpha", + "displayName": "Cutout Alpha", + "description": "Whether to clip the surfaces where the alpha value falls below a threshold.", + "type": "bool", + "defaultValue": false + }, + { + "id": "cutoutThreshold", + "displayName": "Cutout Alpha Threshold", + "description": "If enabled, values lower than this will be clipped.", + "type": "float", + "defaultValue": 0.5, + "min": 0.0, + "max": 1.0 + }, + { + "id": "useBaseColorTextureAlpha", + "displayName": "Use Base Color Texture Alpha", + "description": "Use the alpha channel of the base color texture map to define opacity.", + "type": "bool", + "defaultValue": false + }, + { + "id": "useTexture", + "displayName": "Use Texture", + "description": "Whether to use the texture map to define opacity.", + "type": "bool", + "defaultValue": true + }, + { + "id": "textureMap", + "displayName": "Texture Map", + "description": "Texture map for defining surface opacity.", + "type": "image", + "defaultValue": "" + } + ] + } + }, + "shaders": [ + { + "file": "./StandardPBR_ForwardPass.shader" + } + ] + } +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_pbr.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_pbr.material new file mode 100644 index 0000000000..45c7c039cc --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_pbr.material @@ -0,0 +1,79 @@ +{ + "Material": { + "name": "myPBR", + "template": "atom_standard_pbr", + "schemaVersion": 0, + "properties": { + "General": { + "defaultTexcoord": 0 + }, + "baseColor": { + "parameters": { + "colorLinear": [ + 1.0, + 0.0, + 0.0 + ], + "factor": 1.0, + "useTexture": true, + "textureMap": "materials/substance/amazing_bc.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "metallic": { + "parameters": { + "factor": 0.0, + "useTexture": true, + "textureMap": "materials/substance/amazing_m.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "roughness": { + "parameters": { + "factor": 0.5, + "useTexture": true, + "textureMap": "materials/substance/amazing_r.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "normalMap": { + "parameters": { + "factor": 1.0, + "useTexture": true, + "textureMap": "materials/substance/amazing_ddn.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "opacity": { + "parameters": { + "doubleSided": false, + "mode": "OPAQUE", + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": true, + "textureMap": "materials/substance/amazing_a.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "Extras": { + "Substance": { + "parameters": { + "sbsarFile": { + "$ref": "materials/substance/amazing.sbsar" + }, + "sbsarParams": { + "$ref": "materials/substance/amazing.myPBR.params" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_variant00.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_variant00.material new file mode 100644 index 0000000000..09ebcd7f88 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_variant00.material @@ -0,0 +1,50 @@ +{ + "description": "", + "materialType": "Materials\\StandardPBR\\StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "general": { + "texcoord": 0 + }, + "baseColor": { + "colorLinear": [ + 1.0, + 1.0, + 1.0 + ], + "factor": 1.0, + "useTexture": true, + "textureMap": "Textures/Streaming/streaming99.dds" + }, + "metallic": { + "factor": 1.0, + "useTexture": true, + "textureMap": "Textures/Streaming/streaming99.dds" + }, + "roughness": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_spec.tif" + }, + "specularF0": { + "factor": 0.5, + "useTexture": false, + "textureMap": "" + }, + "normal": { + "factor": 1.0, + "useTexture": true, + "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs_ddn.tif" + }, + "opacity": { + "doubleSided": false, + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": false, + "textureMap": "" + } + } +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/awesome.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/awesome.material new file mode 100644 index 0000000000..45c7c039cc --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/awesome.material @@ -0,0 +1,79 @@ +{ + "Material": { + "name": "myPBR", + "template": "atom_standard_pbr", + "schemaVersion": 0, + "properties": { + "General": { + "defaultTexcoord": 0 + }, + "baseColor": { + "parameters": { + "colorLinear": [ + 1.0, + 0.0, + 0.0 + ], + "factor": 1.0, + "useTexture": true, + "textureMap": "materials/substance/amazing_bc.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "metallic": { + "parameters": { + "factor": 0.0, + "useTexture": true, + "textureMap": "materials/substance/amazing_m.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "roughness": { + "parameters": { + "factor": 0.5, + "useTexture": true, + "textureMap": "materials/substance/amazing_r.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "normalMap": { + "parameters": { + "factor": 1.0, + "useTexture": true, + "textureMap": "materials/substance/amazing_ddn.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "opacity": { + "parameters": { + "doubleSided": false, + "mode": "OPAQUE", + "factor": 1.0, + "cutoutAlpha": false, + "cutoutThreshold": 0.5, + "useBaseColorTextureAlpha": false, + "useTexture": true, + "textureMap": "materials/substance/amazing_a.tif", + "setTexcoord": false, + "texcoordIndex": 0 + } + }, + "Extras": { + "Substance": { + "parameters": { + "sbsarFile": { + "$ref": "materials/substance/amazing.sbsar" + }, + "sbsarParams": { + "$ref": "materials/substance/amazing.myPBR.params" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/imgui.ini b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/imgui.ini new file mode 100644 index 0000000000..4a5c20148e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/imgui.ini @@ -0,0 +1,5 @@ +[Window][Debug##Default] +Pos=60,60 +Size=400,400 +Collapsed=0 + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/custom_shaders/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/custom_shaders/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/ly_presets/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/ly_presets/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/templates/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/templates/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/test/testInput/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/test/testInput/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/test/testOutput/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/test/testOutput/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/scripts/sbs_builder_main_SD.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/scripts/sbs_builder_main_SD.py new file mode 100644 index 0000000000..08c85a6b97 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/scripts/sbs_builder_main_SD.py @@ -0,0 +1,564 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +import sys +import os +from PySide2 import QtCore, QtWidgets +# from PySide2.QtCore import QTimer +from PySide2.QtCore import QProcess, Signal, Slot, QTextCodec +from PySide2.QtGui import QTextCursor, QColor +from PySide2.QtWidgets import QApplication, QPlainTextEdit +import pysbs.batchtools as sbs +from LyPy.si_substance import builder +from LyPy.si_substance.builder.atom_material import AtomMaterial + +# sys.path.insert(0, os.path.abspath('../ui/')) +# import main_win +# sys.path.insert(0, os.path.abspath('..')) +# from watchdog import * + + +class Window(QtWidgets.QDialog): + def __init__(self, parent=None): + super(Window, self).__init__(parent) + self.browseButton = self.create_button("&Browse...", self.browse) + self.browseButton1 = self.create_button("&Browse...", self.browse) + self.findButton = self.create_button("&Find", self.find) + self.removeButton = self.create_button("&Remove", self.remove) + self.startWatch = self.create_button("&Start Watch", self.watch) + self.killButton = self.create_button("&Stop Watch", self.kill) + self.clearlogButton = self.create_button("&Clear Log", self.clear_log) + self.atomMaterial = self.create_button("&Atom Material", self.atom_material) + self.fileComboBox = self.createComboBox("*") + self.textComboBox = self.createComboBox() + self.atomMatNameComboBox = self.createComboBox("Setup Material name here(default:sbsar name)") + self.texRenderPathComboBox = self.createComboBox("C:/dccapi/dev/Gems/DccScriptingInterface/MockProject/Assets/" + "Materials/Substance/textures") + # self.directoryComboBox = self.createComboBox(QtCore.QDir.currentPath()) + self.sbsarDirectory = "C:/dccapi/dev/Gems/DccScriptingInterface/MockProject/Assets/Materials/Substance" + self.directoryComboBox = self.createComboBox(self.sbsarDirectory) + self.builderdirComboBox = self.createComboBox(self.sbsarDirectory) + self.extensionLabel = QtWidgets.QLabel("Watch extensions:") + # textLabel = QtWidgets.QLabel("Containing text:") + self.directoryLabel = QtWidgets.QLabel("Watch directory:") + self.builderdirLabel = QtWidgets.QLabel("Watch directory:") + self.filesFoundLabel = QtWidgets.QLabel() + self.watcherLogLabel = QtWidgets.QLabel("Watcher Log") + self.fileListLabel = QtWidgets.QLabel("File List") + self.sbsarPresetLabel = QtWidgets.QLabel("Sbsar Preset:") + self.OutputResLabel = QtWidgets.QLabel("Output Size:") + self.OutputsLabel = QtWidgets.QLabel("Outputs:") + self.atomMatLabel = QtWidgets.QLabel("Material Name: ") + self.textOutputPathLabel = QtWidgets.QLabel("Texture Output:") + self.randomSeedLabel = QtWidgets.QLabel("Random Seed:") + + self.watcher_log = QPlainTextEdit() + self.watcher_log.setReadOnly(True) + # self.watcher_log.setFixedHeight(500) + self.watcher_log.setMaximumBlockCount(10000) # limit console to 10000 lines + self.watcher_log._cursor_output = self.watcher_log.textCursor() + + self.create_files_table() + buttonsLayout = QtWidgets.QHBoxLayout() + buttonsLayout.addStretch() + # buttonsLayout.addWidget(self.atomMaterial) + # buttonsLayout.addSpacing(50) + buttonsLayout.addWidget(self.findButton) + # buttonsLayout.addWidget(self.removeButton) + watcherBtnLayout = QtWidgets.QHBoxLayout() + watcherBtnLayout.addStretch() + watcherBtnLayout.addWidget(self.startWatch) + watcherBtnLayout.addWidget(self.killButton) + watcherBtnLayout.addWidget(self.clearlogButton) + + self.setObjectName("Dialog") + self.gridLayout = QtWidgets.QGridLayout(self) + self.gridLayout.setObjectName("gridLayout1_0") + self.tabLayout = QtWidgets.QTabWidget(self) + self.tabLayout.setObjectName("tabLayout") + self.tabBuilder = QtWidgets.QTabWidget() + self.tabBuilder.setObjectName("tabBuilder") + self.gridLayout1_1 = QtWidgets.QGridLayout(self.tabBuilder) + self.gridLayout1_1.setObjectName("gridLayout1_1") + self.builderLayout = QtWidgets.QGridLayout() + self.builderLayout.setObjectName("builderLayout") + self.builderLayout.addWidget(self.extensionLabel, 0, 0, 1, 1) + self.builderLayout.addWidget(self.fileComboBox, 0, 1, 1, 2) + self.builderLayout.addWidget(self.builderdirLabel, 1, 0) + self.builderLayout.addWidget(self.builderdirComboBox, 1, 1, 1, 1) + self.builderLayout.addWidget(self.browseButton1, 1, 2, 1, 1) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.addWidget(self.filesTable) + self.verticalLayout.addWidget(self.filesFoundLabel) + self.builderLayout.addLayout(self.verticalLayout, 2, 0, 1, 3) + self.builderLayout.addLayout(buttonsLayout, 4, 0, 1, 3) + self.inputGroupBox = QtWidgets.QGroupBox("Input Parameters") + self.inputGridLayout = QtWidgets.QGridLayout(self.inputGroupBox) + self.inputGridLayout.addWidget(self.randomSeedLabel, 2, 0, 1, 1) + self.randomSeedComboBox = self.createComboBox("0000000000") + self.inputGridLayout.addWidget(self.randomSeedComboBox, 2, 1, 1, 2) + self.randomSeedBtn = self.create_button("&Generate", self.randomseed) + self.inputGridLayout.addWidget(self.randomSeedBtn, 2, 3, 1, 1) + self.randomSeedComboBox.setDisabled(True) + self.gridLayout1_1.addLayout(self.builderLayout, 0, 0, 1, 1) + self.tabLayout.addTab(self.tabBuilder, "Builder") + + self.tabWatcher = QtWidgets.QTabWidget() + self.tabWatcher.setObjectName("tabWatcher") + self.gridLayout2_1 = QtWidgets.QGridLayout(self.tabWatcher) + self.gridLayout2_1.setObjectName("gridLayout2_0") + self.watcherLayout = QtWidgets.QGridLayout() + self.watcherLayout.setObjectName("watcherLayout") + self.watcherLayout.addWidget(self.directoryLabel, 0, 0) + self.watcherLayout.addWidget(self.directoryComboBox, 0, 1) + self.watcherLayout.addWidget(self.browseButton, 0, 2) + self.watcherHBoxLayout = QtWidgets.QHBoxLayout() + self.watcherHBoxLayout.addWidget(self.watcher_log) + self.watcherLayout.addLayout(self.watcherHBoxLayout, 1, 0, 1, 3) + self.watcherLayout.addLayout(watcherBtnLayout, 2, 0, 1, 3) + self.gridLayout2_1.addLayout(self.watcherLayout, 0, 0, 1, 1) + self.tabLayout.addTab(self.tabWatcher, "Watcher") + self.gridLayout.addWidget(self.tabLayout) + # self.setLayout(self.watcherLayout) + + self.setWindowTitle("Substance Builder") + self.resize(800, 600) + self.path = self.directoryComboBox.currentText() + self.groupboxOutputs = QtWidgets.QGroupBox("Outputs") + self.groupboxMat = QtWidgets.QGroupBox("Atom Material && Textures") + self.watcher_script = "C:/dccapi/dev/Gems/DccScriptingInterface/LyPy/si_substance/builder/watchdog/__init__.py" + self.outputRenderPath = 'C:/dccapi/dev/Gems/DccScriptingInterface/MockProject/Assets/Materials/textures/' + self.preset = "" + self.presetItem = "" + self.texRenderpath = self.texRenderPathComboBox.currentText() + self.res = "$outputsize@9,9" + self.output_name = '{inputGraphUrl}_{outputNodeName}' + self.randomstr = "" + + @Slot(str) + def append_output(self, text): + self.watcher_log._cursor_output.insertText(text) + self.scroll_to_last_line() + + def scroll_to_last_line(self): + cursor = self.watcher_log.textCursor() + cursor.movePosition(QTextCursor.End) + cursor.movePosition(QTextCursor.Up if cursor.atBlockStart() else + QTextCursor.StartOfLine) + self.watcher_log.setTextCursor(cursor) + + def output_text(self, text): + self.watcher_log._cursor_output.insertText(text) + self.watcher_log.scroll_to_last_line() + + def browse(self): + # self.directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Find Files", + # QtCore.QDir.currentPath()) + self.directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Find watcher folder", + "C:/dccapi/dev/Gems/DccScriptingInterface/MockProject/Assets/Materials/Substance") + if self.directory: + if self.directoryComboBox.findText(self.directory) or self.builderdirComboBox.findText(self.directory) == -1: + self.directoryComboBox.addItem(self.directory) + self.builderdirComboBox.addItem(self.directory) + + self.directoryComboBox.setCurrentIndex(self.directoryComboBox.findText(self.directory)) + self.builderdirComboBox.setCurrentIndex(self.builderdirComboBox.findText(self.directory)) + + self.path = self.directory + self.find() + return self.path + + def browseRenderPath(self): + self.texRenderpath = QtWidgets.QFileDialog.getExistingDirectory(self, "Setup textures output path", + "C:/dccapi/dev/Gems/DccScriptingInterface/MockProject/Assets/Materials/textures") + if self.texRenderpath: + if self.texRenderPathComboBox.findText(self.texRenderpath) == -1: + self.texRenderPathComboBox.addItem(self.texRenderpath) + + self.texRenderPathComboBox.setCurrentIndex(self.texRenderPathComboBox.findText(self.texRenderpath)) + self.texRenderPathComboBox.setCurrentText(self.texRenderpath) + return self.texRenderpath + + @staticmethod + def updateComboBox(comboBox): + if comboBox.findText(comboBox.currentText()) == -1: + comboBox.addItem(comboBox.currentText()) + + def find(self): + self.filesTable.setRowCount(0) + + fileName = self.fileComboBox.currentText() + text = self.textComboBox.currentText() + self.path = self.builderdirComboBox.currentText() + self.directoryComboBox.setCurrentText(self.path) + # self.path = "C:/Users/chunghao/Documents/Allegorithmic/Substance Designer/sbsar" + + self.updateComboBox(self.fileComboBox) + self.updateComboBox(self.textComboBox) + self.updateComboBox(self.directoryComboBox) + + self.currentDir = QtCore.QDir(self.path) + if not fileName: + fileName = "*" + files = self.currentDir.entryList([fileName], + QtCore.QDir.Files | QtCore.QDir.NoSymLinks) + + if text: + files = self.find_files(files, text) + self.show_files(files) + return self.path + + def find_files(self, files, text): + progressDialog = QtWidgets.QProgressDialog(self) + + progressDialog.setCancelButtonText("&Cancel") + progressDialog.setRange(0, len(files)) + progressDialog.setWindowTitle("Find Files") + + foundFiles = [] + + for i in range(len(files)): + progressDialog.setValue(i) + progressDialog.setLabelText("Searching file number %d of %d..." % (i, len(files))) + QtCore.qApp.processEvents() + + if progressDialog.wasCanceled(): + break + + inFile = QtCore.QFile(self.currentDir.absoluteFilePath(files[i])) + + if inFile.open(QtCore.QIODevice.ReadOnly): + stream = QtCore.QTextStream(inFile) + while not stream.atEnd(): + if progressDialog.wasCanceled(): + break + line = stream.readLine() + if text in line: + foundFiles.append(files[i]) + break + + progressDialog.close() + + return foundFiles + + def show_files(self, files): + for fn in files: + file = QtCore.QFile(self.currentDir.absoluteFilePath(fn)) + size = QtCore.QFileInfo(file).size() + + fileNameItem = QtWidgets.QTableWidgetItem(fn) + fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable) + + sizeItem = QtWidgets.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024))) + sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight) + sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable) + row = self.filesTable.rowCount() + self.filesTable.insertRow(row) + self.filesTable.setItem(row, 0, fileNameItem) + self.filesTable.setItem(row, 1, sizeItem) + self.filesTable.setAlternatingRowColors(True) + self.filesTable.setStyleSheet("alternate-background-color: #444444; background-color: #4d4d4d;") + self.filesFoundLabel.setText("%d file(s) found (Double click on a SBSAR to cook, SBS file to load.)" % len(files)) + + def create_button(self, text, member): + button = QtWidgets.QPushButton(text) + button.clicked.connect(member) + return button + + def createComboBox(self, text=""): + comboBox = QtWidgets.QComboBox() + comboBox.setEditable(True) + comboBox.addItem(text) + comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred) + return comboBox + + def create_files_table(self): + self.filesTable = QtWidgets.QTableWidget(0, 2) + # self.filesTable.setMinimumHeight(300) + # self.filesTable.setFixedHeight(300) + self.filesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) + self.filesTable.setHorizontalHeaderLabels(("File Name", "Size")) + self.filesTable.horizontalHeaderItem(0).setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft) + self.filesTable.horizontalHeaderItem(1).setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight) + # self.filesTable.horizontalHeader().setDefaultAlignment(QtCore.Qt.AlignRight) + self.filesTable.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) + self.filesTable.horizontalHeader().setDefaultSectionSize(5) + self.filesTable.verticalHeader().hide() + # self.filesTable.verticalHeader().show() + self.filesTable.setColumnWidth(1, 80) + self.filesTable.setShowGrid(True) + self.filesTable.verticalHeader().setDefaultSectionSize(5) + # style = "::section {""background-color: (241, 255, 175); }" + # self.filesTable.setStyleSheet(style) + # self.filesTable.setFixedHeight(200) + self.filesTable.cellActivated.connect(self.open_file_of_item) + + def create_sbsar_tex(self): + # self.builderLayout.addWidget(self.OutputsLabel, 10, 0) + self.sbsarName = self.item.text().replace(".sbsar", "") + self.groupboxOutputs = QtWidgets.QGroupBox("Output Texture Maps") + self.horizontalLayoutOuputs = QtWidgets.QHBoxLayout(self.groupboxOutputs) + self.horizontalLayoutOuputs.setObjectName(("horizontalLayoutOuputs")) + # self.vertical_layout_outputs = QtWidgets.QVBoxLayout(self.groupboxOutputs) + # self.vertical_layout_outputs.setObjectName("vertical_layout_outputs") + self.sbsar_tex_outputs = builder.output_info(self.path, self.sbsarName)['_outputs'] + + for index, tex in enumerate(self.sbsar_tex_outputs): + print(tex, end=" ") + self.sbsar_tex_outputs[index] = QtWidgets.QCheckBox(self.groupboxOutputs) + self.sbsar_tex_outputs[index].setEnabled(False) + self.sbsar_tex_outputs[index].setChecked(True) + self.sbsar_tex_outputs[index].setObjectName(self.sbsarName+"_"+tex) + self.sbsar_tex_outputs[index].setText(tex) + self.horizontalLayoutOuputs.addWidget(self.sbsar_tex_outputs[index]) + self.builderLayout.addWidget(self.groupboxOutputs, 7, 0, 1, 3) + print("\n") + + def create_sbsar_presets(self): + self.inputGridLayout.addWidget(self.sbsarPresetLabel, 0, 0, 1, 1) + self.sbsar_presets = builder.output_info(self.path, self.item.text().replace(".sbsar", ""))['_presets'] + self.comboBox_SbsarPreset = QtWidgets.QComboBox(self) + self.comboBox_SbsarPreset.addItem("Please select a preset") + for self.presetItem in self.sbsar_presets: + print(self.presetItem, end=", ") + # preset_index = 0 + self.comboBox_SbsarPreset.addItem(self.presetItem, self.presetItem) + # self.comboBox_SbsarPreset.setItemText(preset_index, self.presetItem) + # preset_index += 1 + + self.inputGridLayout.addWidget(self.comboBox_SbsarPreset, 0, 1, 1, 3) + print("\n") + self.comboBox_SbsarPreset.activated.connect(self.preset_selected) + + def preset_selected(self, index): + self.preset = self.comboBox_SbsarPreset.itemData(index) + if self.preset in self.sbsar_presets: + self.atomMatNameComboBox.setCurrentText(self.sbsarName + "_" + self.preset.replace(" ", "")) + print(self.atomMatNameComboBox.currentText()) + return self.atomMatNameComboBox.currentText() + # return self.preset + else: + self.atomMatNameComboBox.setCurrentText(self.sbsarName) + print(self.atomMatNameComboBox.currentText()) + return self.atomMatNameComboBox.currentText() + # return self.preset + + def create_tex_res(self): + self.inputGridLayout.addWidget(self.OutputResLabel, 1, 0, 1, 1) + self.resSelector = QtWidgets.QComboBox(self) + self.resSelector.addItem("512x512", "$outputsize@9,9") + self.resSelector.addItem("1024x1024", "$outputsize@10,10") + self.resSelector.addItem("2048x2048", "$outputsize@11,11") + self.inputGridLayout.addWidget(self.resSelector, 1, 1, 1, 3) + self.resSelector.activated.connect(self.res_selected) + + def res_selected(self, index): + self.res = self.resSelector.itemData(index) + print(self.res) + return self.res + + def remove(self): + self.builderLayout.removeWidget(self.groupboxOutputs) + self.groupboxOutputs.close() + + def kill(self): + reader.kill() + + def clear_log(self): + self.watcher_log.clear() + + def atom_material(self, preset): + # setup material template + self._material = AtomMaterial('C:/dccapi/dev/Gems/DccScriptingInterface/LyPy/' + 'si_substance/builder/atom.material') + self.preset = preset + self._material.DiffuseMap_tex = self.texRenderPathComboBox.currentText()+"/"+self.sbsarName+"_"+self.preset.\ + replace(" ", "")+"_diffuse.tif" + self._material.set_map(self._material.tex[0], self._material.DiffuseMap_tex) + self._material.NormalMap_tex = self.texRenderPathComboBox.currentText()+"/"+self.sbsarName+"_"+self.preset.\ + replace(" ", "")+"_normal.tif" + self._material.set_map(self._material.tex[1], self._material.NormalMap_tex) + self._material.SpeculareMap_tex =self.texRenderPathComboBox.currentText()+"/"+self.sbsarName+"_"+self.preset.\ + replace(" ", "")+"_specular.tif" + self._material.set_map(self._material.tex[2], self._material.SpeculareMap_tex) + + # self.mat_path = self.sbsarDirectory + "/" + self.atomMatNameComboBox.currentText() + ".material" + if not self.preset: + mat_path = self.sbsarDirectory + "/" + self.sbsarName + ".material" + else: + mat_path = self.sbsarDirectory + "/" + self.sbsarName + "_" + self.preset.replace(" ", "") + ".material" + + self._material.write(mat_path) + print(mat_path) + + def create_single(self): + self.atom_material(self.preset) + + def create_all_material(self): + for i in self.sbsar_presets: + print(i.replace(" ", "")) + self.atom_material(i) + + def print_something(self, words): + self.words = words + print(self.words) + + def watch(self): + reader.start('python', ['-u', window.watcher_script, window.sbsarDirectory]) + + def create_atom_mat(self): + self.atom_material_button = self.create_button("&Create Single", self.create_single) + self.atom_material_output = self.create_button("&Create All", self.create_all_material) + self.renderPathbutton = self.create_button("&Output Path", self.browseRenderPath) + self.rendeTexbutton = self.create_button("&Render Textures", self.render_tex) + self.sbsarName = self.item.text().replace(".sbsar", "") + self.atomMatNameComboBox.setCurrentText(self.sbsarName) + self.atomMatNameComboBox.setDisabled(True) + # self.texRenderPathComboBox.setCurrentText(self.path) + self.gridLayoutMat = QtWidgets.QGridLayout(self.groupboxMat) + self.MatHBox = QtWidgets.QHBoxLayout() + self.MatHBox.addWidget(self.atomMatLabel) + self.MatHBox.addWidget(self.atomMatNameComboBox) + self.MatHBox.addWidget(self.atom_material_output) + self.MatHBox.addWidget(self.atom_material_button) + self.gridLayoutMat.addLayout(self.MatHBox, 0, 0, 1, 4) + self.MatHBox1 = QtWidgets.QHBoxLayout() + self.MatHBox1.addWidget(self.textOutputPathLabel) + self.MatHBox1.addWidget(self.texRenderPathComboBox) + self.MatHBox1.addWidget(self.renderPathbutton) + self.MatHBox1.addWidget(self.rendeTexbutton) + self.gridLayoutMat.addLayout(self.MatHBox1, 1, 0, 1, 4) + self.builderLayout.addWidget(self.groupboxMat, 8, 0, 1, 3) + print("\n") + + def randomseed(self): + import random + random_num = random.randrange(1,10**10) + self.randomstr = '$randomseed@'+str(random_num) + self.randomSeedComboBox.setCurrentText(str(random_num)) + print(self.randomstr) + return self.randomstr + + def render_tex(self): + self.output_name = self.atomMatNameComboBox.currentText() + if not os.path.exists(self.texRenderPathComboBox.currentText()): + os.makedirs(self.texRenderPathComboBox.currentText()) + print(self.texRenderPathComboBox.currentText()) + else: + print(self.texRenderPathComboBox.currentText()) + + sbs.sbsrender_render(inputs=self.path+"/"+self.item.text(), + # inputs=os.path.join(self.outputCookPath, self.outputName + '.sbsar'), + # input_graph=_inputGraphPath, + # output_path=self.texRenderpath, + output_path=self.texRenderPathComboBox.currentText(), + # output_name=self.output_name+'_{outputNodeName}', + output_name=self.output_name+'_{outputNodeName}', + output_format='tif', + # set_value=['$outputsize@%s,%s' % (_outputSize, _outputSize), '$randomseed@1'], + set_value=[self.res, self.randomstr], + # use_preset = _user_preset[0] + no_report=True, + verbose=True + ).wait() + + def find_1st_sbsar(self): + filelist = [] + pathx = self.directoryComboBox.currentText() + for r, d, f in os.walk(pathx): + for file in f: + filelist.append(file) + for i in range(len(filelist)): + if filelist[i].split(".")[-1] == "sbsar": + return i + else: + i += 1 + + def open_file_of_item(self, row, column): + self.item = self.filesTable.item(row, 0) + print(self.path+"/"+self.item.text()) + + # Load sbsar parameters. + if self.item.text().split(".")[-1] == "sbsar": + self.create_sbsar_presets() + self.create_tex_res() + self.builderLayout.removeWidget(self.groupboxOutputs) + self.groupboxOutputs.close() + self.create_sbsar_tex() + self.builderLayout.removeWidget(self.groupboxMat) + self.groupboxMat.close() + self.builderLayout.addWidget(self.inputGroupBox, 5, 0, 1, 3) + self.randomSeedComboBox.setCurrentText("0000000000") + self.create_atom_mat() + + # Cook sbsar file and trigger watcher to generate textures. + elif self.item.text().split(".")[-1] == "sbs": + builder.cook_sbsar(self.path+"/"+self.item.text(), builder._context, self.path, + self.item.text().split(".")[0]) + # builder.output_info() + + +class ProcessOutputReader(QProcess): + produce_output = Signal(str) + + def __init__(self, parent=None): + super().__init__(parent=parent) + + # merge stderr channel into stdout channel + self.setProcessChannelMode(QProcess.MergedChannels) + # prepare decoding process' output to Unicode + self._codec = QTextCodec.codecForLocale() + self._decoder_stdout = self._codec.makeDecoder() + # only necessary when stderr channel isn't merged into stdout: + # self._decoder_stderr = codec.makeDecoder() + + self.readyReadStandardOutput.connect(self._ready_read_standard_output) + # only necessary when stderr channel isn't merged into stdout: + # self.readyReadStandardError.connect(self._ready_read_standard_error) + + @Slot() + def _ready_read_standard_output(self): + raw_bytes = self.readAllStandardOutput() + text = self._decoder_stdout.toUnicode(raw_bytes) + self.produce_output.emit(text) + + # only necessary when stderr channel isn't merged into stdout: + # @Slot() + # def _ready_read_standard_error(self): + # raw_bytes = self.readAllStandardError() + # text = self._decoder_stderr.toUnicode(raw_bytes) + # self.produce_output.emit(text) + +# Creaste Substance Builder QtWidget +def createWin(): + mainWindow = uiMgr.getMainWindow() + window = Window(parent=mainWindow) + reader = ProcessOutputReader() + reader.produce_output.connect(window.append_output) + reader.start('python', ['-u', window.watcher_script, window.sbsarDirectory]) + window.show() + window.find() + + +if __name__ == '__main__': + app = sd.getContext().getSDApplication() + uiMgr = app.getQtForPythonUIMgr() + menu = uiMgr.newMenu(menuTitle="Atom", objectName="atom") + # Create a new action. + act = QtWidgets.QAction("Substance Builder", menu) + act.triggered.connect(createWin) + # Add the action to the menu. + menu.addAction(act) + #sys.exit(app.exec_()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/scripts/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/scripts/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/readme.txt new file mode 100644 index 0000000000..1886429d07 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/readme.txt @@ -0,0 +1,42 @@ +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +------------------------------------------------------------------------------- + +We .gitignore the folder .dev: +DccScriptingInterface\Solutions\.dev + +Locally we put two things here foor development. + +1. pyi inspection files, this makes it easier to add a single folder +to IDE configurations for api inspection and auto-complete + +DccScriptingInterface\Solutions\.dev\pyi +DccScriptingInterface\Solutions\.dev\pyi\maya +DccScriptingInterface\Solutions\.dev\pyi\pymel +DccScriptingInterface\Solutions\.dev\pyi\PySide2 +etc + +2. Pyside2-tools + +DccScriptingInterface\Solutions\.dev\QtForPython\pyside2-tools-dev + +These are not currently part of the O3DE QtForPython Gem +But they can be valuable for development. + +Ticket to include them in O3DE: https://jira.agscollab.com/browse/ATOM-13861 + +You can manually clone them from here: https://github.com/pyside/pyside2-tools + +Note: if you want to use them as a python package +1. you will need to add as a site-package (PYTHONPATH) +2. you will need to rename a file: + this: pyside2-tools/pyside2uic/__init__.py.in + becomes: pyside2-tools/pyside2uic/__init__.py + +Some examples are in: DccScriptingInterface\azpy\shared\ui\templates.py \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/stub b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/stub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.gitignore new file mode 100644 index 0000000000..84a073bd43 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.gitignore @@ -0,0 +1,7 @@ +.dev/* +!.dev/stub +!.dev/readme.txt +!.idea +!.vscode +!.wing +.venv \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.gitignore new file mode 100644 index 0000000000..265145e9c1 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +./workspace.xml \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.p4ignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.p4ignore new file mode 100644 index 0000000000..835472432f --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.p4ignore @@ -0,0 +1 @@ +workspace.xml \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/DccScriptingInterface.iml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/DccScriptingInterface.iml new file mode 100644 index 0000000000..86800f7ab3 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/DccScriptingInterface.iml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/encodings.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/encodings.xml new file mode 100644 index 0000000000..15a15b218a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/main.py new file mode 100644 index 0000000000..7cc608b3b2 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/main.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# !/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +# This is a sample Python script. + +# Press Shift+F10 to execute it or replace it with your code. +# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. + + +def print_hi(name): + # Use a breakpoint in the code line below to debug your script. + print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. + + +# Press the green button in the gutter to run the script. +if __name__ == '__main__': + print_hi('PyCharm') + +# See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/misc.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/misc.xml new file mode 100644 index 0000000000..227fa01c70 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/modules.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/modules.xml new file mode 100644 index 0000000000..3f41c1f178 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/vcs.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/vcs.xml new file mode 100644 index 0000000000..bc59970703 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/webResources.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/webResources.xml new file mode 100644 index 0000000000..1922420c78 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/webResources.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/dccsi.code-workspace b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/dccsi.code-workspace new file mode 100644 index 0000000000..b9bcffd345 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/dccsi.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": "..\\.." + } + ], + "settings": { + "python.envFile": "${workspaceFolder}/../../.env", + "python.pythonPath": "${env:DCCSI_PY_DEFAULT}" + } +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/launch.json b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/launch.json new file mode 100644 index 0000000000..34a6705c82 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "python": "${workspaceFolder}\\..\\..\\..\\..\\..\\..\\Tools\\Python\\3.7.5\\windows\\python.exe" + } + ] +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/settings.json b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/settings.json new file mode 100644 index 0000000000..824f2fa77a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "python.envFile": "${workspaceFolder}/../../.env", + "python.pythonPath": "${workspaceFolder}\\..\\..\\..\\..\\..\\..\\Tools\\Python\\3.7.5\\windows\\python.exe", + "editor.wordWrap": "wordWrapColumn" +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.wing/.gitignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.wing/.gitignore new file mode 100644 index 0000000000..3894994dba --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.wing/.gitignore @@ -0,0 +1 @@ +*.wpu \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.wing/DCCsi_7x.wpr b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.wing/DCCsi_7x.wpr index 94c163961f..d57e91f35d 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.wing/DCCsi_7x.wpr +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.wing/DCCsi_7x.wpr @@ -33,21 +33,6 @@ debug.launch-configs = (2, 'pyrunargs': ('project', '-u'), 'runargs': u'', - 'rundir': ('project', - u'')}), - 'launch-fAzXtHnoGUQ6FYXE': ({'shared': True}, - {'buildcmd': ('project', - None), - 'env': ('project', - [u'']), - 'name': 'DCCSI_PY_DCCSI', - 'pyexec': ('custom', - u'${DCCSI_PY_DCCSI}'), - 'pypath': ('project', - []), - 'pyrunargs': ('project', - '-u'), - 'runargs': u'', 'rundir': ('project', u'')}), 'launch-oobMrvXFf1SwtYBg': ({'shared': True}, @@ -77,6 +62,10 @@ proj.launch-config = {loc('../../SDK/Atom/Scripts/Python/DCC_Materials/maya_mate 'ustom', (u'', 'launch-GeaM41WYMGA1sEfm')), + loc('../../SDK/Maya/Scripts/Python/legacy_asset_converter/main.py'): ('c'\ + 'ustom', + (u'', + 'launch-WUN9lgYK6qYU7qE9')), loc('../../azpy/__init__.py'): ('custom', (u'', 'launch-oobMrvXFf1SwtYBg')), diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/readme.txt new file mode 100644 index 0000000000..024392c339 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/readme.txt @@ -0,0 +1,16 @@ +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +------------------------------------------------------------------------------- + +We .gitignore the folder .dev: +DccScriptingInterface\Solutions\.dev + +The user can create this folder locally. +We use it to store .pyi files to add to IDE configurations +for api inspection and auto-complete functionality \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py index 6e5538e65f..44c35c9cd8 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/__init__.py index d03e4c6906..57b97ad1cb 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/__init__.py @@ -67,18 +67,11 @@ _DCCSI_DEV_MODE = env_bool.env_bool(constants.ENVAR_DCCSI_DEV_MODE, False) # for py2.7 (Maya) we provide this, so we must assume some bootstrapping # has occured, see DccScriptingInterface\\config.py (_DCCSI_PYTHON_LIB_PATH) -if sys.version_info.major >= 3: - import pathlib -else: # py2.x - import pathlib2 as pathlib # python 2 backport - # its mkdir() function supposedly supports exist_ok - # ^ but in practice still seems to bark - # TypeError: mkdir() got an unexpected keyword argument 'exist_ok' - -if _G_DEBUG: - print('DCCsi debug breadcrumb, pathlib is: {}'.format(pathlib)) +import pathlib from pathlib import Path +if _G_DEBUG: + print('DCCsi debug breadcrumb, pathlib is: {}'.format(pathlib)) # to be continued... @@ -95,7 +88,7 @@ _LY_PROJECT_TAG = os.getenv(constants.ENVAR_LY_PROJECT, _DCCSI_LOG_PATH = Path(os.getenv(constants.ENVAR_DCCSI_LOG_PATH, Path(_LY_DEV, _LY_PROJECT_TAG, - 'Cache', + 'Cache', 'pc', 'user', 'log', 'logs'))) @@ -105,7 +98,7 @@ for handler in _logging.root.handlers[:]: # very basic root logger for early debugging, flip to while 1: while 0: _logging.basicConfig(level=_logging.DEBUG, - format=constants.FRMT_LOG_LONG, + format=constants.FRMT_LOG_LONG, datefmt='%m-%d %H:%M') _logging.debug('azpy.rootlogger> root logger set up for debugging') # root logger @@ -190,7 +183,7 @@ def initialize_logger(name, _logger.debug("Folder is already there") else: _logger.debug("Folder was created") - + _log_filepath = Path(_DCCSI_LOG_PATH, '{}.log'.format(name)) try: _log_filepath.touch(mode=0o666, exist_ok=True) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py index 606c51d5ac..364ac699de 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py index f7bbe0bf5b..14be101c36 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py @@ -30,7 +30,7 @@ _LOGGER = _logging.getLogger(_PACKAGENAME) _LOGGER.debug('Initializing: {0}.'.format({_PACKAGENAME})) __all__ = ['get_os', 'return_stub', 'get_stub_check_path', - 'get_dccsi_config'] + 'get_dccsi_config', 'get_current_project'] # note: this module should reamin py2.7 compatible (Maya) so no f'strings # ------------------------------------------------------------------------- @@ -49,7 +49,7 @@ def get_os(): message = str("DCCsi.azpy.config_utils.py: " "Unexpectedly executing on operating system '{}'" "".format(sys.platform)) - + raise RuntimeError(message) return os_folder # ------------------------------------------------------------------------- @@ -72,7 +72,7 @@ def return_stub_dir(stub_file='dccsi_stub'): '({}) in a walk-up from currnet path' ''.format(stub_file)) break - + _dir_to_last_file = path return _dir_to_last_file @@ -109,7 +109,7 @@ def get_stub_check_path(in_path=os.getcwd(), check_stub='engineroot.txt'): # settings.setenv() # doing this will add the additional DYNACONF_ envars def get_dccsi_config(dccsi_dirpath=return_stub_dir()): """Convenience method to set and retreive settings directly from module.""" - + # we can go ahead and just make sure the the DCCsi env is set # config is SO generic this ensures we are importing a specific one _module_tag = "dccsi.config" @@ -123,18 +123,36 @@ def get_dccsi_config(dccsi_dirpath=return_stub_dir()): str(_dccsi_path.resolve())) _dccsi_config = importlib.util.module_from_spec(_spec_dccsi_config) _spec_dccsi_config.loader.exec_module(_dccsi_config) - + _LOGGER.debug('Executed config: {}'.format(_spec_dccsi_config)) else: # py2.x import imp _dccsi_config = imp.load_source(_module_tag, str(_dccsi_path.resolve())) _LOGGER.debug('Imported config: {}'.format(_spec_dccsi_config)) return _dccsi_config - + else: return None # ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +def get_current_project(dev_folder=get_stub_check_path()): + """Uses regex in lumberyard Dev\\bootstrap.cfg to retreive project tag str""" + boostrap_filepath = Path(dev_folder, "bootstrap.cfg") + if boostrap_filepath.exists(): + bootstrap = open(str(boostrap_filepath), "r") + regex_str = r"^project_path\s*=\s*(.*)" + game_project_regex = re.compile(regex_str) + for line in bootstrap: + game_folder_match = game_project_regex.match(line) + if game_folder_match: + _LOGGER.debug('Project is: {}'.format(game_folder_match.group(1))) + return game_folder_match.group(1) + return None +# ------------------------------------------------------------------------- + + # ------------------------------------------------------------------------- def bootstrap_dccsi_py_libs(dccsi_dirpath=return_stub_dir()): """Builds and adds local site dir libs based on py version""" @@ -166,16 +184,18 @@ if __name__ == '__main__': _LOGGER.info("# {0} #".format('-' * 72)) _LOGGER.info('Current Work dir: {0}'.format(os.getcwd())) - + _LOGGER.info('OS: {}'.format(get_os())) _LOGGER.info('DCCSIG_PATH: {}'.format(return_stub_dir('dccsi_stub'))) - + _config = get_dccsi_config() _LOGGER.info('DCCSI_CONFIG_PATH: {}'.format(_config)) _LOGGER.info('LY_DEV: {}'.format(get_stub_check_path('engineroot.txt'))) + _LOGGER.info('LY_PROJECT: {}'.format(get_current_project(get_stub_check_path('engineroot.txt')))) + _LOGGER.info('DCCSI_PYTHON_LIB_PATH: {}'.format(bootstrap_dccsi_py_libs(return_stub_dir('dccsi_stub')))) # custom prompt diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/constants.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/constants.py index 42d8e6645f..5ca0bc4a95 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/constants.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/constants.py @@ -27,7 +27,7 @@ import os import sys import site import logging as _logging - + # for this module to perform standalone # we need to set up basic access to the DCCsi _MODULE_PATH = os.path.realpath(__file__) # To Do: what if frozen? @@ -56,12 +56,15 @@ FRMT_LOG_SHRT = "[%(asctime)s][%(name)s][%(levelname)s] >> %(message)s" _G_DEBUG = env_bool.env_bool(ENVAR_DCCSI_GDEBUG, False) _DCCSI_DEV_MODE = env_bool.env_bool(ENVAR_DCCSI_DEV_MODE, False) +for handler in _logging.root.handlers[:]: + _logging.root.removeHandler(handler) + _PACKAGENAME = 'azpy.constants' -_log_level = int(20) +_LOG_LEVEL = int(20) if _G_DEBUG: - _log_level = int(10) -_logging.basicConfig(level=_log_level, + _LOG_LEVEL = int(10) +_logging.basicConfig(level=_LOG_LEVEL, format=FRMT_LOG_LONG, datefmt='%m-%d %H:%M') _LOGGER = _logging.getLogger(_PACKAGENAME) @@ -85,7 +88,7 @@ TAG_MOCK_PROJECT = str('MockProject') TAG_DIR_LY_DEV = str('dev') TAG_DIR_DCCSI_AZPY = str('azpy') TAG_DIR_DCCSI_SDK = str('SDK') -TAG_DIR_LY_BUILD = str('windows_vs2019') +TAG_DIR_LY_BUILD = str('build') TAG_QT_PLUGIN_PATH = str('QT_PLUGIN_PATH') # filesystem markers, stub file names. @@ -255,7 +258,7 @@ PATH_DEFAULT_WINGHOME = str('{0}{1}{2}.{3}' TAG_DEFAULT_WING_MINOR_VER)) PATH_SAT_INSTALL_PATH = str('{0}\\{1}\\{2}\\{3}\\{4}' - ''.format(PATH_PROGRAMFILES_X64, + ''.format(PATH_PROGRAMFILES_X64, 'Allegorithmic', 'Substance Automation Toolkit', 'Python API', @@ -273,7 +276,7 @@ if __name__ == '__main__': _G_DEBUG = True _DCCSI_DEV_MODE = True _LOGGER.setLevel(_logging.DEBUG) # force debugging - + # this is a top level module and to reduce cyclical azpy imports # it only has a basic logger configured, add log to console _handler = _logging.StreamHandler(sys.stdout) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/__init__.py new file mode 100644 index 0000000000..bb95d93e1d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/__init__.py @@ -0,0 +1,94 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +"""azpy.dev.ide.__init__""" + +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE + +# global space +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = 'azpy.dev.ide' + +from azpy import initialize_logger +_LOGGER = initialize_logger(_PACKAGENAME) +_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME})) + +# ------------------------------------------------------------------------- + +__all__ = [] + +try: + import wingapi + __all__ = init_wing(__all__) +except: + pass + +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def init_wing(_all): + """If the wingapi is required for a package/module to import, + then it should be initialized and added here so general imports + don't fail""" + + # Make sure we can import the native apis + import wingapi # this will fail if we can't + + _all.append('wing') + # add others + + # Importing additional local packages/modules + return _all +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def init_all(_all): + """If the wingapi is required for a package/module to import, + then it should be initialized and added here so general imports + don't fail""" + + # Make sure we can import the native apis + import wingapi # this will fail if we can't + + _all.append('wing') + # add others + + # Importing additional local packages/modules + return _all +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def import_all(_all=__all__): + """this will test imports of __all__ + can be run before or after init() to test""" + from azpy import test_imports + _LOGGER.debug('Testing Imports from {0}'.format(_PACKAGENAME)) + test_imports(_all, + _pkg=_PACKAGENAME, + _logger=_LOGGER) + return _all +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +if _DCCSI_DEV_MODE: + # If in dev mode this will test imports of __all__ + import_all(__all__) +# ------------------------------------------------------------------------- \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/examples/maya_command_script.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/examples/maya_command_script.py new file mode 100644 index 0000000000..6bf001df07 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/examples/maya_command_script.py @@ -0,0 +1,83 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +# send each line to maya with > send_py_cmd_to_maya +print('Hello World: Command received from WingIDE') +import maya.cmds as cmds +foo = cmds.polySphere(n='DemoSphere', radius=1.0) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# more complex example +import maya.cmds as cmds +import random +import time + +name = 'DemoCube' +size = random.uniform(0.5, 2.0) +variation = random.uniform(1.5, 5.0) +amount = random.randint(9, 21) + +# remove previous +obj_list = cmds.ls('{}*'.format(name)) +if len(obj_list) > 0: + cmds.delete(obj_list) + +for i in range(0, amount - 1): + + depth_rand = random.uniform(size, size * variation) + + tegel = cmds.polyCube(name='{}#'.format(name), + w=size, h=size, d=depth_rand) + cmds.move(size * i, 0, 5) + i += 1 +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +import maya.cmds as cmds +import random +import time + +name = 'DemoCube' +size = random.uniform(0.5, 2.0) +variation = random.uniform(1.5, 5.0) +amount = random.randint(9, 21) + +def make_some_wonky_cubes(name=, size, variation, amount): + # remove previous + obj_list = cmds.ls('{}*'.format(name)) + if len(obj_list) > 0: + cmds.delete(obj_list) + + for i in range(0, amount - 1): + + depth_rand = random.uniform(size, size * variation) + + tegel = cmds.polyCube(name='{}#'.format(name), + w=size, h=size, d=depth_rand) + cmds.move(size * i, 0, 5) + i += 1 + return + +foo = make_some_wonky_cubes() +time.sleep(10) +foo = make_some_wonky_cubes() + +while 1: + foo = make_some_wonky_cubes() + time.sleep(5) + foo = make_some_wonky_cubes(size=0.5, amount=20) + time.sleep(5) + break diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/.p4ignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/.p4ignore new file mode 100644 index 0000000000..38389e3936 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/.p4ignore @@ -0,0 +1,2 @@ +*.pyo +*.pyc \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/__init__.py new file mode 100644 index 0000000000..d06d198261 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/__init__.py @@ -0,0 +1,21 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +"""azpy.dev.ide.wing.__init__""" + +__all__ = ['hot_keys', 'test'] + + + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/hot_keys.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/hot_keys.py new file mode 100644 index 0000000000..59e65ba8e5 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/hot_keys.py @@ -0,0 +1,355 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# inspiration: http://www.emeraldartist.com/blog/2012/10/11/remotely-sending-code-to-maya-from-wing + +from __future__ import unicode_literals + +""" Module to remotely send code to maya. Inside of WingIDE prefs, you will +need to add the parent dire of this module to 'IDE Extension Scripting>Search Path' +Additionally, you will need set up custom key bindings 'User Interface>Keyboard' + +""" +# -- This line is 75 characters ------------------------------------------- + +# standard imports +import socket +import random +import sys +import os +import time +import logging as _logging + +# wing ide +import wingapi +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +MODULENAME = 'azpy.dev.ide.wing.hot_keys' +_LOGGER = _logging.getLogger(MODULENAME) + +## extend logger +#_handler = _logging.StreamHandler(sys.stdout) +#_handler.setLevel(_logging.DEBUG) +#FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" +#_formatter = _logging.Formatter(FRMT_LOG_LONG) +#_handler.setFormatter(_formatter) +#_LOGGER.addHandler(_handler) +#_LOGGER.debug('Loading: {0}.'.format({MODULENAME})) + +_LOCAL_HOST = socket.gethostbyname(socket.gethostname()) +_LOGGER.info('local_host: {}'.format(_LOCAL_HOST)) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def display_text(test_str): + """Displays text in a WingIDE pop-up dialog""" + app = wingapi.gApplication + v = "Product info is: " + str(app.GetProductInfo()) + v += "\nAnd you typed: %s" % test_str + wingapi.gApplication.ShowMessageDialog("Test Message", v) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def get_wing_text(): # no hotkey + """ + Return the text currently selected in wing + """ + editor = wingapi.gApplication.GetActiveEditor() + if editor is None: + return None + else: + current_doc = editor.GetDocument() + start, end = editor.GetSelection() + text_block = current_doc.GetCharRange(start, end) + _LOGGER.debug('selected text is: {}'.format(text_block)) + return text_block +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def display_wing_text(): # Ctrl+Shift+D + text_block = get_wing_text() + display_text(text_block) + return text_block + +display_wing_text.contexts = [ + wingapi.kContextNewMenu("DCCsi Scripts"), + wingapi.kContextEditor(), +] +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +def get_stub_check_path(in_path=__file__, check_stub='engineroot.txt'): + ''' + Returns the branch root directory of the dev\\'engineroot.txt' + (... or you can pass it another known stub) + + so we can safely build relative filepaths within that branch. + + If the stub is not found, it returns None + ''' + path = os.path.abspath(os.path.join(os.path.dirname(in_path), "..")) + _LOGGER.info('parent dir: {}'.format(path)) + + while 1: + test_path = os.path.join(path, check_stub) + + if os.path.isfile(test_path): + return os.path.abspath(os.path.join(os.path.dirname(test_path))) + + else: + path, tail = (os.path.abspath(os.path.join(os.path.dirname(test_path), "..")), + os.path.basename(test_path)) + + if (len(tail) == 0): + return None +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# globals + +_LY_DEV = get_stub_check_path() +_LOGGER.info('_LY_DEV: {}'.format(_LY_DEV)) + +_PROJ_CACHE = os.path.join(_LY_DEV, 'cache', 'DCCsi', 'wing') +_LOGGER.info('_PROJ_CACHE: {}'.format(_PROJ_CACHE)) + +if not os.path.exists(_PROJ_CACHE): + os.makedirs(_PROJ_CACHE) + _LOGGER.info('SUCCESS creating: {}'.format(_PROJ_CACHE)) +else: + _LOGGER.info('_PROJ_CACHE already exists: {}'.format(_PROJ_CACHE)) + +# makedirs(_PROJ_CACHE) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def create_client_socket(local_host=_LOCAL_HOST,command_port=6000): + """create a client (wing) socket connection to maya (server, commandPort)""" + for res in socket.getaddrinfo(local_host, command_port, + socket.AF_UNSPEC, socket.SOCK_STREAM,0, socket.AI_PASSIVE): + af, socktype, proto, canonname, sa = res + try: + mSocket = socket.socket(af, socktype, proto) + except socket.error as e: + mSocket = None + continue + try: + # Make our socket --> Maya connection: + mSocket.connect(sa) + except socket.error as e: + mSocket.close() + mSocket = None + continue + break + + if not mSocket: + raise RuntimeError("Unable to initialise client socket.") + + return mSocket +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def send_selection_to_maya(language='python', + local_host=_LOCAL_HOST, + command_port=6000): + """Basic method to connect to Maya and send selected code over. + chunks can be large, which makes socket programming cumbersome. + This module stashes the selection in a temp .txt file in the cache. + Then send maya a command for a specific module, which will then + read that file and execute the code line-by-line, allowing for + arbirtarily large selections that might otherwise overrun buffer""" + + port_name = str('{0}:{1}'.format(local_host, command_port)) + _LOGGER.info('port_name: {}'.format(port_name)) + + if language != "mel" and language != "python": + raise ValueError("Expecting either 'mel' or 'python'") + + # Save the text to a temp file. + # If mel, make sure it end with a semicolon + selected_text = get_wing_text() + if language == 'mel': + if not selected_text.endswith(';'): + selected_text += ';' + + # This saves a temp file on Windows + # Mac\Linux support may need updating + temp_file_name = 'tmp_wing_data.txt' + + temp_file_path = os.path.join(_PROJ_CACHE, temp_file_name) + temp_file_path = os.path.abspath(temp_file_path) + temp_file = temp_file_path.replace("\\", "/") # maya is linux paths? + _LOGGER.debug('temp_file_path is: {}'.format(temp_file_path)) + + if os.access(temp_file, os.F_OK): + # open and print the file in Maya: + f=open(temp_file_path, "w") + f.write(selected_text) + f.close() + else: + _LOGGER.info("No temp file exists: {}".format(temp_file)) + file=open(temp_file, "w") + if os.path.isfile(temp_file): + _LOGGER.info('Created the file, please try again') + else: + _LOGGER.info('File not created') + + # Create the socket that will connect to Maya, Opening a socket can vary from + mSocket = create_client_socket(local_host, command_port) + + if mSocket: + # Now ping Maya over the command-port + message = ("import azpy.maya.utils.execute_wing_code;" + "azpy.maya.utils.execute_wing_code.main('{}')".format(language)) + + if language == 'mel': + message = 'python({})'.format(message) # wrap in in mel python cmd + try: + # Send our code to Maya: + mSocket.send(message.encode('ascii')) + time.sleep(1) + client_response = str(mSocket.recv(4096)).encode("utf-8") # receive the result info + # time.sleep(0.25) + # next command + except Exception as e: + _LOGGER.error("Sending command to Maya failed: {}".format(e)) + + _LOGGER.info("salt:{0}:: sent: {1}".format(str(random.randint(1, 9999)), message)) + _LOGGER.info("The result is: {}".format(client_response)) + + mSocket.close() + else: + _LOGGER.error('No client socket, mSocket is: {}'.format(mSocket)) + + return +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def send_command_to_maya(language='python', + local_host=_LOCAL_HOST, + command_port=6000): + """Basic method to connect to Maya and send a single smaller command directly""" + + port_name = str('{0}:{1}'.format(local_host, command_port)) + _LOGGER.info('port_name: {}'.format(port_name)) + + if language != "mel" and language != "python": + raise ValueError("Expecting either 'mel' or 'python'") + + # Save the text to a temp file. + # If mel, make sure it end with a semicolon + selected_text = get_wing_text() + if language == 'mel': + if not selected_text.endswith(';'): + selected_text += ';' + + # Create the socket that will connect to Maya, Opening a socket can vary from + mSocket = create_client_socket(local_host, command_port) + _LOGGER.info('mSocket is: {}'.format(mSocket)) + + if mSocket: + # Now ping Maya over the command-port + message = str(selected_text) + if language == 'mel': + message = 'python({})'.format(message) # wrap in in mel python cmd + # Now ping Maya over the command-port + try: + if language == 'mel': + message = 'python({})'.format(message) + + # to do: the buffer default I think is 4096 + # long selections are going to fail (not sure how) + mSocket.send(message.encode('ascii')) + time.sleep(1) + client_response = str(mSocket.recv(4096)).encode("utf-8") # receive the result info + # time.sleep(0.25) + # next command + except Exception as e: + _LOGGER.error("Sending command to Maya failed: {}".format(e)) + + _LOGGER.info("salt:{0}:: sent: {1}".format(str(random.randint(1, 9999)), message)) + _LOGGER.info("The result is: {}".format(client_response)) + + mSocket.close() + else: + _LOGGER.error('No client socket, mSocket is: {}'.format(mSocket)) + + return +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def send_py_cmd_to_maya(): + """Send the selected Python command to Maya""" + send_command_to_maya() # default language is 'python' + +send_py_cmd_to_maya.contexts = [ + wingapi.kContextNewMenu("DCCsi Scripts"), + wingapi.kContextEditor(), +] + +def send_mel_cmd_to_maya(): + """Send the selected code to Maya as mel""" + send_command_to_maya('mel') + +send_mel_cmd_to_maya.contexts = [ + wingapi.kContextNewMenu("DCCsi Scripts"), + wingapi.kContextEditor(), +] + +def python_selection_to_maya(): + """Send the selected Python code to Maya""" + send_selection_to_maya() # default language is 'python' + +python_selection_to_maya.contexts = [ + wingapi.kContextNewMenu("DCCsi Scripts"), + wingapi.kContextEditor(), +] + +def mel_selection_to_maya(): + """Send the selected code to Maya as mel""" + send_selection_to_maya('mel') + +mel_selection_to_maya.contexts = [ + wingapi.kContextNewMenu("DCCsi Scripts"), + wingapi.kContextEditor(), +] + +# ------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + # there are not really tests to run here due to this being a list of + # constants for shared use. + _G_DEBUG = True + _DCCSI_DEV_MODE = True + _LOGGER.setLevel(_logging.DEBUG) # force debugging + + foo = get_wing_text() + + # send each line to maya with > send_py_cmd_to_maya + print('Hello World: Command received from WingIDE') + #import maya.cmds as cmds + #foo = cmds.polySphere() + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/readme.txt new file mode 100644 index 0000000000..db6f13568a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/readme.txt @@ -0,0 +1,66 @@ +This particular sub-package is devoted to WingIDE + +It is mainly wingide specific extensions + +Some notes ... + +There are a couple of projects set up for Lumberyard python development with WingIDE + +The FIRST is the DCCsi: +dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Solutions\.wing\DCCsi_7x.wpr + +This provides devs a project to directly work on the DCCsi itself + +You can launch wing and directly load this project via the following .bat file: +dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Launchers\Windows\Launch_WingIDE-7-1.bat + +Note: the data-driven env hooks for the DCCsi are in the Env.bat: +dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Launchers\Windows\Env.bat +^ when you launch wing via the .bat file it bootstraps that env first + +Additionally, that same env is being transitioned to a python implementation using dynaconf (WIP): +dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\.env +dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\settings.json +dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\config.py +^ this last file is the root dynaconf config for the DCCsi +This will also allow us to have per-tool, per-project, per-dcc app env extensions and settings in a more nested way + +The SECOND is the AtomTechArt Lumberyard project: dev\AtomTechArt +dev\AtomTechArt\DCCsi\envs\AtomTechArt\AtomTechArt.wpr + +Note: this is set up as a venv based on the lumberyard python intstall +and thus provides a sandbox silo to develop outside of the lumberyard python, and outside of the DCCsi + +This .bat will launch wing and directly load this project: +dev\AtomTechArt\DCCsi\Launch_AtomTechArt_WingIDE-7-1.bat + +WingIDE auto-complete with Lumberyard: +Lumberyard when built will generate .pyi files for source analysis, inspection and auto-complete +On a per-project basis they are generated in the cache like: +dev\Cache\AtomTechArt\pc\user\python_symbols\azlmbr + +Note: to get this to work unfortunatley each user must configure the wingide prefs to include this path +(there is no shared project / data-driven way that I know of to set this up otherwise) + +Note: lumberyard is not currently generating __init__.pyi files in that package structure: +https://jira.agscollab.com/browse/SPEC-3315 + +The workaround is to create them yourself (they can be empty) and needs to be in the root of each package folder, like this: +dev\Cache\AtomTechArt\pc\user\python_symbols\azlmbr\__init__.pyi +dev\Cache\AtomTechArt\pc\user\python_symbols\azlmbr\materialeditor\__init__.pyi +ETC... + +Then to enable do the following in WingIDE + +1. (Dialog) WingIDE > Edit > Peferences +2. (Section) Category > Source Analysis > Advanced +3. (Add Path) In the area labeled "Interface File Path", insert a new path and point it to your cache: +Example (mine): g:\depot\JG_PC1_spectrAtom\dev\Cache\AtomTechArt\pc\user\python_symbols + +You might need to reboot wing. Then you should have auto-complete for the lumberyard api +> import azlmbr + +Note: the entirety of azlmbr api does not generate .pyi files currently, +all of the "Behaviour Context" based classes do +non-BC modules such as azlmbr.paths currently do not +https://jira.agscollab.com/browse/SPEC-3316 \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/test.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/test.py new file mode 100644 index 0000000000..f66919b502 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/test.py @@ -0,0 +1,83 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +"""This is a module to test script extensions for WingIDE +reference: https://wingware.com/doc/scripting/example + +note: there are important instructions in that doc for +setting up your project files with wingapi auto-complete, etc. + +We added C:\Program Files (x86)\Wing Pro 7.1\src to the +PYTHONPATH via env.bat and dynaconf config instead so it is +part of the inhereted environment.""" + +import sys +import logging as _logging +import wingapi + +# ------------------------------------------------------------------------- +_MODULENAME = 'azpy.dev.ide.wing.test' +_LOGGER = _logging.getLogger(_MODULENAME) +_handler = _logging.StreamHandler(sys.stdout) +_handler.setLevel(_logging.DEBUG) +FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" +_formatter = _logging.Formatter(FRMT_LOG_LONG) +_handler.setFormatter(_formatter) +_LOGGER.addHandler(_handler) +_LOGGER.debug('Loading: {0}.'.format({_MODULENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def dccsi_test_script(test_str): + """Simple test command for WingIDE + + to run in wing: Edit > Command by Name + ^ opens a commanline at bottom of IDE + + type: test-script (then return) + ^ commandline now takes entering a Test Str + + Test Str: Booyah + ^ a Pop-up dialog will display in wing + + """ + app = wingapi.gApplication + v = "Product info is: " + str(app.GetProductInfo()) + v += "\nAnd you typed: %s" % test_str + wingapi.gApplication.ShowMessageDialog("Test Message", v) + +#dccsi_test_script.contexts = [wingapi.kContextNewMenu("Scripts")] + +# this will add to a menu in WingIDE +dccsi_test_script.contexts = [ + wingapi.kContextNewMenu("DCCsi Scripts"), + wingapi.kContextEditor(), +] +# ------------------------------------------------------------------------- + +# bind a hotkey inside Wing that will execute our newly installed Module +# Inside Wing, choose Edit -> Preferences, and on the left, under User Interface, choose Keyboard +# In the center right of the Keyboard section is where you can add "Ccustom Key Bindings" combinations to execute code +# For this test example, I have bound Ctrl+Alt+Shift+T as my key combination for executing dccsi_test_script + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + # there are not really tests to run here due to this being a list of + # constants for shared use. + _G_DEBUG = True + _DCCSI_DEV_MODE = True + _LOGGER.setLevel(_logging.DEBUG) # force debugging + + foo = dccsi_test_script("This is a test") \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/__init__.py new file mode 100644 index 0000000000..a4141ade7c --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/__init__.py @@ -0,0 +1,16 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- + +# define api package for each IDE supported +__all__ = ['check'] \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/__init__.py new file mode 100644 index 0000000000..4755741a1d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/__init__.py @@ -0,0 +1,18 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- + +# define api package for each IDE supported +__all__ = ['running_state', 'maya_app'] + +# maya_app, named such to avoid namespace collisions with maya dcc app api \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/maya_app.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/maya_app.py new file mode 100644 index 0000000000..7e08f3375e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/maya_app.py @@ -0,0 +1,157 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +# -- Standard Python modules -- +import sys +import os +import inspect +import logging as _logging + +# -- External Python modules -- +# none + +# -- Extension Modules -- +import azpy +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE + +# -------------------------------------------------------------------------- +# -- Global Definitions -- +_DCCSI_DCC_APP = None + +# set up global space, logging etc. +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_MODULENAME = 'azpy.dev.utils.check.maya_app' +_LOGGER = _logging.getLogger(_MODULENAME) +# ------------------------------------------------------------------------- + + +########################################################################### +## These mini-functions need to be defined, before they are called +# ------------------------------------------------------------------------- +# run this, if we are in Maya +def set_dcc_app(dcc_app='maya'): + """ + azpy.dev.utils.check.maya.set_dcc_app() + this will set global _DCCSI_DCC_APP = 'maya' + and os.environ["DCCSI_DCC_APP"] = 'maya' + """ + _DCCSI_DCC_APP = dcc_app + + _LOGGER.info('Setting DCCSI_DCC_APP to: {0}'.format(dcc_app)) + + return _DCCSI_DCC_APP +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def clear_dcc_app(dcc_app=False): + """ + azpy.dev.utils.check.maya.set_dcc_app() + this will set global _DCCSI_DCC_APP = False + and os.environ["DCCSI_DCC_APP"] = False + """ + _DCCSI_DCC_APP = dcc_app + + _LOGGER.info('Setting DCCSI_DCC_APP to: {0}'.format(dcc_app)) + + return _DCCSI_DCC_APP +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def validate_state(DCCSI_DCC_APP=_DCCSI_DCC_APP): + ''' + This will detect if we are running in Maya or not, + then will call either, set_dcc_app('maya') or clear_dcc_app(dcc_app=False) + ''' + + if _G_DEBUG: + _LOGGER.debug(autolog()) + + try: + import maya.cmds as cmds + DCCSI_DCC_APP = set_dcc_app('maya') + except ImportError as e: + _LOGGER.warning('Can not perform: import maya.cmds as cmds') + DCCSI_DCC_APP = clear_dcc_app() + else: + try: + if cmds.about(batch=True): + DCCSI_DCC_APP = set_dcc_app('maya') + except AttributeError as e: + _LOGGER.warning("maya.cmds module isn't fully loaded/populated, " + "(cmds populates only in batch, maya.standalone, or maya GUI)") + # NO Maya + DCCSI_DCC_APP=clear_dcc_app() + + return DCCSI_DCC_APP +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def autolog(): + '''Automatically log the current function details.''' + # Get the previous frame in the stack, otherwise it would + # be this function!!! + func = inspect.currentframe().f_back.f_back.f_code + # Dump the message + the name of this function to the log. + output = ('{module} AUTOLOG:\r' + 'Called from::\n{0}():\r' + 'In file: {1},\r' + 'At line: {2}\n' + ''.format(func.co_name, + func.co_filename, + func.co_firstlineno, + module=_MODULENAME)) + return output +#------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# run the check on import +_DCCSI_DCC_APP = validate_state() +# ------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + # there are not really tests to run here due to this being a list of + # constants for shared use. + _G_DEBUG = True + _DCCSI_DEV_MODE = True + _LOGGER.setLevel(_logging.DEBUG) # force debugging + + ## reduce cyclical azpy imports + ## it only has a basic logger configured, add log to console + #_handler = _logging.StreamHandler(sys.stdout) + #_handler.setLevel(_logging.DEBUG) + #FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" + #_formatter = _logging.Formatter(FRMT_LOG_LONG) + #_handler.setFormatter(_formatter) + #_LOGGER.addHandler(_handler) + #_LOGGER.debug('Loading: {0}.'.format({_MODULENAME})) + + # happy print + from azpy.constants import STR_CROSSBAR + _LOGGER.info(STR_CROSSBAR) + _LOGGER.info('{} ... Running script as __main__'.format(_MODULENAME)) + _LOGGER.info(STR_CROSSBAR) + + _DCCSI_DCC_APP = validate_state() + _LOGGER.info('Is Maya Running? _DCCSI_DCC_APP = {}'.format(_DCCSI_DCC_APP)) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/running_state.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/running_state.py new file mode 100644 index 0000000000..ca4f0d98fa --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/running_state.py @@ -0,0 +1,257 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +# -- Standard Python modules -- +import sys +import os +import logging as _logging + +# -- External Python modules -- +# none + +# -- Extension Modules -- +# none (yet) + +# -------------------------------------------------------------------------- +# -- Global Definitions -- +_DCCSI_DCC_APP = None + +_MODULENAME = 'azpy.dev.utils.check.running_state' +_LOGGER = _logging.getLogger(_MODULENAME) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# First Class +class CheckRunningState(object): + """ + < To Do: document Class > + """ + + # Class Variables + DCCSI_DCC_APP = None + + def __init__(self, *args, **kwargs): + ''' + CheckRunningState Class Initialization + + < To Do: Need to document > + + Input Attributes: + ----------------- + self. -> SCALAR: Description. + Default = + + Keyword Arguments: + ------------------ + self. -> STRING: Description. + Default = + self. -> OBJECT: Description. + Default = + + Additional Attributes: + ---------------------- + self. -> BOOLEAN: Description. + Default = + + Documentation last updated: Month. Day, Year - Author + ''' + + # -- Default Values -- + # top level storage for whether or not we are running + # in a DCC tool interpreter + self._dcc_py = False + + # basic python info + # if these can't run, we are in a bad state anyway + self._python = sys.version + self._py_version_info = sys.version_info + + # -- Input Checks -- + self.check_known() + # --------------------------------------------------------------------- + + # --method------------------------------------------------------------- + def check_known(self): + # -- init -- + # first let's check if any of these DCC apps are running + # 0 - maya first + CheckRunningState.DCCSI_DCC_APP = self.maya_running() + + # 1 - then max + if not CheckRunningState.DCCSI_DCC_APP: + CheckRunningState.DCCSI_DCC_APP = self.max_running() + else: + _LOGGER.warning('DCCSI_DCC_APP is already set: {}'.format(CheckRunningState.DCCSI_DCC_APP)) + + # 2 - then blender + if not CheckRunningState.DCCSI_DCC_APP: + CheckRunningState.DCCSI_DCC_APP = self.blender_running() + else: + _LOGGER.warning('DCCSI_DCC_APP is already set: {}'.format(CheckRunningState.DCCSI_DCC_APP)) + + # store checks for DCC info + if CheckRunningState.DCCSI_DCC_APP: + self.dcc_py = True + + # store check for is maya running headless + if CheckRunningState.DCCSI_DCC_APP == 'maya': + self.maya_headless = self.is_maya_headless() + + # set a envar other modules can easily check + if CheckRunningState.DCCSI_DCC_APP: + os.environ['DCCSI_DCC_APP'] = CheckRunningState.DCCSI_DCC_APP + # --------------------------------------------------------------------- + + + #--properties---------------------------------------------------------- + @property + def python(self): + return self._python + + @python.setter + def python(self, value): + self._python = value + return self._python + + @property + def py_version_info(self): + return self._py_version_info + + @py_version_info.setter + def py_version_info(self, value): + self._py_version_info = value + return self._py_version_info + + @property + def dcc_app(self): + return self._dcc_py + + @dcc_app.setter + def dcc_app(self, value): + self._dcc_py = value + return self._dcc_py + + @property + def maya_headless(self): + return self._maya_headless + + @maya_headless.setter + def maya_headless(self, value): + self._maya_headless = value + return self._maya_headless + + # template property + # @property + # def foo(self): + # return self._foo + + # @foo.setter + # def foo(self, value): + #self._foo = value + # return self._foo + # --properties---------------------------------------------------------- + + # --method------------------------------------------------------------- + def maya_running(self): + """< To Do: Need to document >""" + try: + import azpy.dev.utils.check.maya_app as check_dcc + DCCSI_DCC_APP = check_dcc.validate_state() + except ImportError as e: + _LOGGER.info('Not Implemented: azpy.dev.utils.check.maya_app') + if DCCSI_DCC_APP: + CheckRunningState.DCCSI_DCC_APP = check_dcc.validate_state() + os.environ["DCCSI_DCC_APP"] = str(DCCSI_DCC_APP) + return CheckRunningState.DCCSI_DCC_APP + #---------------------------------------------------------------------- + + # --method------------------------------------------------------------- + def is_maya_headless(self): + """< To Do: Need to document >""" + if self.maya_app: + import maya.cmds as mc + try: + if mc.about(batch=True): + return True + else: + return False + except Exception as e: + # cmds module isn't fully loaded/populated + # (which only happens in batch, maya.standalone, or maya GUI) + # no maya + return False + else: + return False + # --method------------------------------------------------------------- + + + # --method------------------------------------------------------------- + def max_running(self): + """ + < To Do: implement > + """ + try: + import azpy.dev.utils.check.max_app as check_dcc + CheckRunningState.DCCSI_DCC_APP = check_dcc.validate_state() + except ImportError as e: + _LOGGER.info('Not Implemented: azpy.dev.utils.check.max') + if CheckRunningState.DCCSI_DCC_APP: + CheckRunningState.DCCSI_DCC_APP = check_dcc.validate_state() + os.environ["DCCSI_DCC_APP"] = str(CheckRunningState.DCCSI_DCC_APP) + return CheckRunningState.DCCSI_DCC_APP + #---------------------------------------------------------------------- + + + # --method------------------------------------------------------------- + def blender_running(self): + """ + < To Do: implement > + """ + try: + import azpy.dev.utils.check.blender_app as check_dcc + CheckRunningState.DCCSI_DCC_APP = check_dcc.validate_state() + except ImportError as e: + _LOGGER.info('Not Implemented: azpy.dev.utils.check.blender') + if CheckRunningState.DCCSI_DCC_APP: + CheckRunningState.DCCSI_DCC_APP = check_dcc.validate_state() + os.environ["DCCSI_DCC_APP"] = str(CheckRunningState.DCCSI_DCC_APP) + return CheckRunningState.DCCSI_DCC_APP + #---------------------------------------------------------------------- + + +#========================================================================== +# Class Test +#========================================================================== +if __name__ == '__main__': + _G_DEBUG = True + _DCCSI_DEV_MODE = True + _LOGGER.setLevel(_logging.DEBUG) # force debugging + + # -- Extend Logger + #_handler = _logging.StreamHandler(sys.stdout) + # _handler.setLevel(_logging.DEBUG) + #FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" + #_formatter = _logging.Formatter(FRMT_LOG_LONG) + # _handler.setFormatter(_formatter) + # _LOGGER.addHandler(_handler) + #_LOGGER.debug('Loading: {0}.'.format({_MODULENAME})) + + # happy print + from azpy.constants import STR_CROSSBAR + _LOGGER.info(STR_CROSSBAR) + _LOGGER.info('{} ... Running script as __main__'.format(_MODULENAME)) + _LOGGER.info(STR_CROSSBAR) + + foo = CheckRunningState() + _LOGGER.info('DCCSI_DCC_APP: {}'.format(foo.DCCSI_DCC_APP)) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_base.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_base.py index d7c7a7170e..ab03154358 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_base.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_base.py @@ -12,8 +12,6 @@ # # -- This line is 75 characters ------------------------------------------- from __future__ import unicode_literals - -# ------------------------------------------------------------------------- ''' Module: \azpy\shared\common\base_env.py @@ -27,21 +25,15 @@ Allowing those str('tag') to easily be changed in a single location. If they are paths for code acess we assume they were put on the sys path. ''' -# ------------------------------------------------------------------------- -# ------------------------------------------------------------------------- - -__author__ = 'HogJonny' -__project__ = 'DccScriptingInterface' - # ------------------------------------------------------------------------- # built in's import os import sys import json import logging as _logging +from collections import OrderedDict # 3rd Party -from box import Box from pathlib import Path # Lumberyard extensions @@ -51,27 +43,29 @@ from azpy.shared.common.core_utils import get_stub_check_path from azpy.shared.common.envar_utils import get_envar_default from azpy.shared.common.envar_utils import set_envar_defaults from azpy.shared.common.envar_utils import Validate_Envar -# ------------------------------------------------------------------------- -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE +# ------------------------------------------------------------------------- -# global space -_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) -_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) -_PACKAGENAME = __name__ -if _PACKAGENAME is '__main__': - _PACKAGENAME = 'azpy.env_base' +# ------------------------------------------------------------------------- +_PACKAGENAME = 'azpy.env_base' +_logging.basicConfig(level=_logging.INFO, + format=FRMT_LOG_LONG, + datefmt='%m-%d %H:%M') _LOGGER = _logging.getLogger(_PACKAGENAME) _LOGGER.debug('Initializing: {0}.'.format({_PACKAGENAME})) -# ------------------------------------------------------------------------- +# global space +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + # set up base totally non-functional defauls (denoted with $) # if something hasn't been set, it will stay '$' -_BASE_ENVVAR_DICT = Box(ordered_box=True) +_BASE_ENVVAR_DICT = OrderedDict() # project tag _BASE_ENVVAR_DICT[ENVAR_LY_PROJECT] = '${0}'.format(ENVAR_LY_PROJECT) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py index e32ce8ff55..e77ff25a3b 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py @@ -18,7 +18,7 @@ All Lumberyard render related packages/modules should live here.""" import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py index e38d2118aa..183946fe20 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py index c843798a78..280deb80ba 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py @@ -15,14 +15,10 @@ # importing all of the modules """azpy.maya.__init__""" -import os - -from azpy import env_bool -from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_DEV_MODE # global space -_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) _DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) _PACKAGENAME = __name__ diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/__init__.py index db32ef28e1..a945b21692 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/event_callback_handler.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/event_callback_handler.py index 6cb8a177e1..f0e886dc9a 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/event_callback_handler.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/event_callback_handler.py @@ -9,8 +9,6 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -# -- This line is 75 characters ------------------------------------------- # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- @@ -26,7 +24,7 @@ Module Documentation: .. module:: event_callback_handler :synopsis: Simple event based callback_event handler using maya.api.OpenMaya (api2) - + .. :note: nothing mundane to declare .. :attention: callbacks should be uninstalled on exit .. :warning: maya may crash on exit if callbacks are not uninstalled @@ -55,7 +53,7 @@ Module Documentation: SceneOpened PostSceneRead workspaceChanged - + .. moduleauthor:: Amazon Lumberyard """ @@ -96,10 +94,10 @@ _LOGGER.debug('Invoking:: {0}.'.format({_PACKAGENAME})) class EventCallbackHandler(object): """ A simple Maya event based callback_event handler class - + :ivar callback_event: stores event type trigger for a maya callback_event :vartype event: for example, 'NameChanged' - + :ivar this_function: stores this_function to call when callback_event is triggered :vartype this_function: for example, cb = EventCallbackHandler(callback_event='NameChanged', @@ -116,12 +114,12 @@ class EventCallbackHandler(object): self._callback_id = None # state tracker self._message_id_set = None - + # the callback_event event trigger self._callback_event = callback_event # the thing to do on callback_event self._function = this_function - + if install: self.install() @@ -129,7 +127,7 @@ class EventCallbackHandler(object): @property def callback_id(self): return self._callback_id - + @property def callback_event(self): return self._callback_event @@ -137,15 +135,15 @@ class EventCallbackHandler(object): @property def this_function(self): return self._this_function - + # --method------------------------------------------------------------- def install(self): """ installs this callback_event for event, which makes it active """ - + add_event_method = openmaya.MEventMessage.addEventCallback - + # when called, check if it's already installed if self._callback_id: _LOGGER.warning("EventCallback::{0}:{1}, is already installed" @@ -177,7 +175,7 @@ class EventCallbackHandler(object): """ remove_event_callback = openmaya.MEventMessage.removeCallback - + if self._callback_id: try: remove_event_callback(self._callback_id) @@ -197,7 +195,7 @@ class EventCallbackHandler(object): "".format(self._callback_event, self._function.__name__)) return False - + # --method------------------------------------------------------------- def __del__(self): """ diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/node_message_callback_handler.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/node_message_callback_handler.py index 148230a94b..43edbdcf82 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/node_message_callback_handler.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/callbacks/node_message_callback_handler.py @@ -21,47 +21,47 @@ """ .. module:: node_message_callback_handler :synopsis: this module contains code related to mNodeName message based callbacks in Maya - + .. moduleauthor:: Amazon Lumberyard - + .. :note: nothing mundane to declare .. :attention: callbacks should be uninstalled on exit .. :warning: maya may crash on exit if callbacks are not uninstalled .. Usage: - < To Do > + < To Do > .. Version: 0.1.0 | prototype .. History: < To Do > - + .. Reference: MNodeMessage This class is used to register callbacks for dependency mNodeName messages of specific dependency nodes. http://download.autodesk.com/us/maya/2011help/API/class_m_node_message.html - + There are 4 add thisCallback methods which will add callbacks for the following types of messages: - Attribute Changed - Attribute Added or Removed - Node Dirty - Name Changed - + - Attribute Changed + - Attribute Added or Removed + - Node Dirty + - Name Changed + If we import OpenMaya, import maya.api.OpenMaya as om from maya.api.OpenMaya import MNodeMessage as mNM - + The valid callbacks for usage are: - mNM.addAttributeChangedCallback - mNM.addAttributeAddedOrRemovedCallback - mNM.addNodeDirtyCallback - mNM.addNodeDirtyPlugCallback - mNM.addNameChangedCallback - mNM.addNodeAboutToDeleteCallback - mNM.addNodePreRemovalCallback - mNM.addNodeDestroyedCallback - mNM.addKeyableChangeOverride + mNM.addAttributeChangedCallback + mNM.addAttributeAddedOrRemovedCallback + mNM.addNodeDirtyCallback + mNM.addNodeDirtyPlugCallback + mNM.addNameChangedCallback + mNM.addNodeAboutToDeleteCallback + mNM.addNodePreRemovalCallback + mNM.addNodeDestroyedCallback + mNM.addKeyableChangeOverride """ # -------------------------------------------------------------------------- @@ -117,12 +117,12 @@ class NodeMessageCallbackHandler(object): self._callback_type_id = None # state tracker self._message_id_set = None - + # the this_callback event trigger self._this_callback = this_callback # the thing to do on this_callback self._function = this_function - + # this handlers object mNodeName # passing in a null MObject (ie, without a name as an argument) # registers the this_callback to get all name changes in the scene @@ -132,18 +132,18 @@ class NodeMessageCallbackHandler(object): self._m_object = om.MObject() else: self._m_object = om.MObject(mNodeName) - + # install / activate this callback if install: self.install() #---------------------------------------------------------------------- - - + + #--properties---------------------------------------------------------- @property def callback_id(self): return self._callback_type_id - + @property def this_callback(self): return self._this_callback @@ -152,8 +152,8 @@ class NodeMessageCallbackHandler(object): def this_function(self): return self._this_function #--properties---------------------------------------------------------- - - + + # --method------------------------------------------------------------- def install(self): """ @@ -210,8 +210,8 @@ class NodeMessageCallbackHandler(object): self._function.__name__)) return False #---------------------------------------------------------------------- - - + + # --method------------------------------------------------------------- def __del__(self): """ @@ -234,7 +234,7 @@ def testNameChanged(*args): mNode = None _LOGGER.debug('\t~ no node') _LOGGER.debug('\t~ warning: {0}'.format(e)) - + # get old name try: oldName = args[1] @@ -242,7 +242,7 @@ def testNameChanged(*args): oldName = None _LOGGER.debug('\t~ no oldName') _LOGGER.debug('\t~ warning: {0}'.format(e)) - + # convert the MObject to a dep mNode try: depNode = om.MFnDependencyNode(mNode) @@ -250,9 +250,9 @@ def testNameChanged(*args): depNode = None _LOGGER.debug('\t~ no depNode') _LOGGER.debug('\t~ warning: {0}'.format(e)) - + if oldName == (u""): oldName = 'null' - + # get node type try: nodeType = depNode.typeName() @@ -260,7 +260,7 @@ def testNameChanged(*args): nodeType = None _LOGGER.debug('\t~ no nodeType') _LOGGER.debug('\t~ warning: {0}'.format(e)) - + # get node name try: nodeName = depNode.name() @@ -273,7 +273,7 @@ def testNameChanged(*args): _LOGGER.debug('newName: {0}'.format(nodeName)) _LOGGER.debug('oldName: {0}'.format(oldName)) _LOGGER.debug('nodeType: {0}'.format(nodeType)) - + return depNode # ------------------------------------------------------------------------- @@ -282,8 +282,8 @@ def testNameChanged(*args): # Run as LICENSE #========================================================================== if __name__ == '__main__': - + name_changed_callback = om.MNodeMessage.addNameChangedCallback ncbh = NodeMessageCallbackHandler(name_changed_callback, testNameChanged) - + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/helpers/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/helpers/__init__.py index 405c6dc5ce..a3e8ee69bf 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/helpers/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/helpers/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/toolbits/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/toolbits/__init__.py index dbab4f972a..570cada01a 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/toolbits/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/toolbits/__init__.py @@ -17,7 +17,7 @@ mport os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/__init__.py new file mode 100644 index 0000000000..8a30499739 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/__init__.py @@ -0,0 +1,16 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- + +# define api package for each IDE supported +__all__ = ['simple_command_port', 'execute_wing_code', 'wing_to_maya'] \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/execute_wing_code.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/execute_wing_code.py new file mode 100644 index 0000000000..79788dbaae --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/execute_wing_code.py @@ -0,0 +1,119 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +import os +import socket +import logging as _logging +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def get_stub_check_path(in_path=__file__, check_stub='engineroot.txt'): + ''' + Returns the branch root directory of the dev\\'engineroot.txt' + (... or you can pass it another known stub) + + so we can safely build relative filepaths within that branch. + + If the stub is not found, it returns None + ''' + path = os.path.abspath(os.path.join(os.path.dirname(in_path), "..")) + _LOGGER.info('parent dir: {}'.format(path)) + + while 1: + test_path = os.path.join(path, check_stub) + + if os.path.isfile(test_path): + return os.path.abspath(os.path.join(os.path.dirname(test_path))) + + else: + path, tail = (os.path.abspath(os.path.join(os.path.dirname(test_path), "..")), + os.path.basename(test_path)) + + if (len(tail) == 0): + return None +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# -- Global Definitions -- +_MODULENAME = 'azpy.maya.utils.execute_wing_code' +_LOGGER = _logging.getLogger(_MODULENAME) + +_LY_DEV = get_stub_check_path() +_LOGGER.info('_LY_DEV: {}'.format(_LY_DEV)) + +_PROJ_CACHE = os.path.join(_LY_DEV, 'cache', 'DCCsi', 'wing') +_LOGGER.info('_PROJ_CACHE: {}'.format(_PROJ_CACHE)) + +_LOCAL_HOST = socket.gethostbyname(socket.gethostname()) +_LOGGER.info('local_host: {}'.format(_LOCAL_HOST)) +# ------------------------------------------------------------------------- + + +########################################################################### +# --main code block-------------------------------------------------------- +def main(code_type='python'): + """ + Evaluate the temp file on disk, made by Wing, in Maya. + + code_type : string : Supports either 'python' or 'mel' + + """ + temp_file_name = 'tmp_wing_data.txt' + + temp_file_path = os.path.join(_PROJ_CACHE, temp_file_name) + temp_file_path = os.path.abspath(temp_file_path) + temp_file = temp_file_path.replace("\\", "/") # maya is linux paths? + _LOGGER.debug('temp_file_path is: {}'.format(temp_file_path)) + + if os.access(temp_file, os.F_OK): + # open and print the file in Maya: + f = open(temp_file, "r") + lines = f.readlines() + for line in lines: + print(line.rstrip()) + f.close() + + if code_type == "python": + # execute the file contents in Maya: + f = open(temp_file, "r") + # (1) doesn't work? + #exec(f, __main__.__dict__, __main__.__dict__) + # (2) works is series of single expressions + #for line in lines: + #exec(line.rstrip()) + # f.close() + # (3) this seems to work much better + temp_code_file_name = 'temp_code.py' + temp_code_file = os.path.join(_PROJ_CACHE, temp_code_file_name) + temp_code_file = os.path.abspath(temp_code_file) + temp_code = temp_file_path.replace("\\", "/") # maya is linux paths? + code = compile(f.read(), temp_code, 'exec') + _LOGGER.debug(type(code)) + exec(code) + + elif code_type == "mel": + mel_cmd = "source '{}'".format(temp_file) + # This causes the "// Result: " line to show up in the Script Editor: + om.MGlobal.executeCommand(mel_cmd, True, True) + else: + _LOGGER.warning("No temp file exists: {}".format(temp_file)) + file=open(temp_file, "w") + file.write("test file write") + if os.path.isfile(temp_file): + _LOGGER.info('Created the temp file, please try again!') + else: + _LOGGER.error('File not created: {}'.format(temp_file)) + + return +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/simple_command_port.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/simple_command_port.py new file mode 100644 index 0000000000..010d7c549e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/simple_command_port.py @@ -0,0 +1,242 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +# -- Standard Python modules -- +import sys +import os +import socket +import site +import time +import logging as _logging + +# -- External Python modules -- +# none + +# -- Extension Modules -- +# none (yet) + +# -------------------------------------------------------------------------- +# -- Global Definitions -- +_MODULENAME = 'azpy.maya.utils.simple_command_port' +_LOGGER = _logging.getLogger(_MODULENAME) + +_LOCAL_HOST = socket.gethostbyname(socket.gethostname()) +_LOGGER.info('local_host: {}'.format(_LOCAL_HOST)) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +class SimpleCommandPort: + """ + Simple maya command port Object Class. + """ + #---------------------------------------------------------------------- + #def __new__(self): + #try: + #self.port_name + #return self + #except NameError as e: + #self.port_name = None + #self.logger.error("Specify a port like: '127.0.0.1:6000'") + #return + #return + + # -- Constructor ------------------------------------------------------ + def __init__(self, + local_host=_LOCAL_HOST, + comman_port=6000, + logger=_LOGGER, + source_type='python', + echo_output=True, + noreturn=False, + *args, **kwargs): + ''' + SimpleCommandPort Class Initialization + + < To Do: Need to document > + + Input Attributes: + ----------------- + self. SCALAR: Description. + Default = + + Keyword Arguments: + ------------------ + self. STRING: Description. + Default = + self. OBJECT: Description. + Default = + + Additional Attributes: + ---------------------- + self. BOOLEAN: Description. + Default = + + Documentation last updated: Month. Day, Year - Author + ''' + + # -- Default Values -- + self._port_name = '0.0.0.0:0000' + self._port = None + self._logger = None + self._echo_output = echo_output + self._noreturn = noreturn + self._source_type = source_type + + if logger != None: + self._logger = logger + + # -- Input Checks -- + if local_host != None and local_host != '0.0.0.0': + self._port_name = str('{0}:{1}'.format(local_host, comman_port)) + else: + self.logger.error("Specify a port: SimpleCommandPort('127.0.0.1','6000')") + + ## -- init -- + #try: + #self.port = self.cmdPortOpen() + #except Exception as e: + #self.port = None + #if self.logger: + #self.logger.autolog(e, level='error') + #else: + #self.logIt(e, level='error') + #---------------------------------------------------------------------- + + + #--properties---------------------------------------------------------- + @property + def port_name(self): + return self._port_name + + @port_name.setter + def port_name(self, value): + self._port_name = value + return self._port_name + + @port_name.getter + def port_name(self): + return self._port_name + + @property + def port(self): + return self._port + + @port.setter + def port(self, value): + self._port = value + return self._port + + @property + def logger(self): + return self._logger + + @logger.setter + def logger(self, value): + self._logger = value + return self._logger + #---------------------------------------------------------------------- + + + # --method------------------------------------------------------------- + def open(self): + from azpy.dev.utils.check.maya_app import validate_state + if validate_state(): + if self.port_name != None and self.port_name != '0.0.0.0:0000': + import maya.cmds as cmds + try: + self.logger.info('Opening the cmd port: {0}' + ''.format(self.port_name)) + except Exception as e: + self.logger.error('{0}'.format(e)) + + try: + # to do: get mel working + self.port = cmds.commandPort(name=self.port_name, + echoOutput=self._echo_output, + sourceType =self._source_type, + noreturn=self._noreturn) + self.logger.info('{0}:: Open!'.format(self.port_name)) + time.sleep(0.25) + return True, self.port_name + except Exception as e: + self.logger.error('{0}'.format(e)) + _LOGGER.info(cmds.commandPort(self.port_name, q=True)) + self.port_name='ERROR' + return False, self.port_name + else: + self.logger.warning('Can not use a port: {}'.format(self.port_name)) + else: + self.logger.warning('Did not perform port open, Not running Maya!') + return False + #---------------------------------------------------------------------- + + + # --method------------------------------------------------------------- + def close(self): + + self.logger.info('Closing the port: {0}'.format(self.port_name)) + + try: + import maya.cmds as cmds + cmds.commandPort(name=self.port_name, close=True, echoOutput=self._echo_output) + self.port = None + self.logger.info('{0}:: Port Closed!'.format(self.port_name)) + except Exception as e: + self.logger.error('{0}'.format(e)) + self.port_name = 'ERROR' + return False + + time.sleep(1) + + return True + #---------------------------------------------------------------------- +# ------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + _G_DEBUG = True + _DCCSI_DEV_MODE = True + _LOGGER.setLevel(_logging.DEBUG) # force debugging + + # -- Extend Logger + #_handler = _logging.StreamHandler(sys.stdout) + # _handler.setLevel(_logging.DEBUG) + #FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" + #_formatter = _logging.Formatter(FRMT_LOG_LONG) + # _handler.setFormatter(_formatter) + # _LOGGER.addHandler(_handler) + #_LOGGER.debug('Loading: {0}.'.format({_MODULENAME})) + + # happy print + from azpy.constants import STR_CROSSBAR + _LOGGER.info(STR_CROSSBAR) + _LOGGER.info('{} ... Running script as __main__'.format(_MODULENAME)) + _LOGGER.info(STR_CROSSBAR) + + # should throw an error message + foo_port = SimpleCommandPort() + + # should attemp to open the port, should warn as defualt port is '0.0.0.0:0000' + foo_port.open() + + # should return a port object + foo_port = SimpleCommandPort('127.0.0.1:6000') + + # should attemp to open the port, which should warn because only works in Maya + foo_port.open() + + _LOGGER.info('Port Name: {}'.format(foo_port.port_name)) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/wing_to_maya.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/wing_to_maya.py new file mode 100644 index 0000000000..2c0f921fec --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/wing_to_maya.py @@ -0,0 +1,154 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +# -- Standard Python modules -- +import sys +import os +import site +import socket +import time +import logging as _logging + +# -- External Python modules -- +# none + +# -- Extension Modules -- +from simple_command_port import SimpleCommandPort + +# -------------------------------------------------------------------------- +# -- Global Definitions -- +_MODULENAME = 'azpy.maya.utils.wing_to_maya' +_LOGGER = _logging.getLogger(_MODULENAME) + +_LOCAL_HOST = socket.gethostbyname(socket.gethostname()) +_LOGGER.info('local_host: {}'.format(_LOCAL_HOST)) +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +def start_wing_to_maya(local_host=_LOCAL_HOST, + comman_port=6000, + logger=_LOGGER, + *args, **kwargs): + """ + imports the module + opens a port to run python code from wingIDE directly + """ + + if logger != None: + _LOGGER = _LOGGER + + try: + import maya.cmds as cmds + except ImportError as e: + _LOGGER.error('Could not perform: {}'.format(e)) + raise e + + try: + port + except NameError: + port = None + + port_name = str('{0}:{1}'.format(local_host, comman_port)) + + # should only be getting the port passed in + _LOGGER.info('Attempting to open port:: {0}'.format(port_name)) + port_object = SimpleCommandPort(port_name) + + try: + port = port_object.open() + except Exception as e: + _LOGGER.error('Could not open port: {e}'.format(e)) + raise e + + if not port: + return port + else: + try: + import execute_wing_code + except Exception as e: + _LOGGER.error('Could not execute code: {}'.format(e)) + return 'Error' + + time.sleep(0.25) + _LOGGER.info('WingIDE: Python >> to >> Maya, is started.') + + try: + test_port = cmds.commandPort(port_name, q=True) + except Exception as e: + _LOGGER.autolog(e, level='error') + return 'Error' + + if test_port: + message = 'That port is already open. ' + message += 'Attempting to close old port, so I can re-establish it...' + _LOGGER.info(message) + try: + cmds.commandPort(name=port_name, close=True, echoOutput=True) + except Exception as e: + _LOGGER.error(''.format(e)) + + time.sleep(0.25) + try: + test_port = cmds.commandPort(port_name, q=True) + except Exception as e: + _LOGGER.error('Could not query port: {}'.format(e)) + + if test_port == False: + _LOGGER.info('Port closed! Re-opening ...') + try: + port = SimpleCommandPort(port_name) + except Exception as e: + _LOGGER.error('Could not create port object: {}'.format(e)) + + time.sleep(0.25) + try: + test_port = cmds.commandPort(port_name, q=True) + _LOGGER.info('The posrt is: {}'.format(test_port)) + except Exception as e: + _LOGGER.error('Could not query port: {}'.format(e)) + + elif test_port == False: + _LOGGER.info('The port does not exist ... attempting to open it again now') + try: + port = SimpleCommandPort(port_name) + except Exception as e: + _LOGGER.error('Could not create port: {}'.format(e)) + + time.sleep(0.25) + + try: + test_port = cmds.commandPort(port_name, q=True) + _LOGGER.info('Port is: {}'.format(test_port)) + except Exception as e: + _LOGGER.error('Could not create port: {}'.format(e)) + + return port +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def start_wing_to_maya_menu(): + """ + Simple hook to call the function from a menu item, + using the default port name defined + """ + port = object() # init a dummy object + + # default name ... name is first arg, or a kwarg + portName, kwargs = setSynthArgKwarg(port, argPosIndex=0, argTag='portName', + inArgs=args, inKwargs=kwargs, + defaultValue="127.0.0.1:6000") + + port = start_wing_to_maya(local_host=_LOCAL_HOST, comman_port=6000) + return +# ------------------------------------------------------------------------- \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py index 4704fdf192..e6c0c12501 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py @@ -19,8 +19,7 @@ All Atom render related packages/modules should live here.""" import os -import azpy -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/return_stub.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/return_stub.py index afd936d461..d03ada6b99 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/return_stub.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/return_stub.py @@ -21,19 +21,8 @@ import logging as _logging # ------------------------------------------------------------------------- -# global space debug flag -# not using azpy.constants here to help avoid cyclical imports lower -from azpy.env_bool import env_bool - -# have to avoid importing these from constants -# because we can end up with cyclical import issues -# need to figure out a better solution later so we don't duplicate everywhere -ENVAR_DCCSI_GDEBUG = str('DCCSI_GDEBUG') -ENVAR_DCCSI_DEV_MODE = str('DCCSI_DEV_MODE') - -# global space -_G_DEBUG = os.getenv(ENVAR_DCCSI_GDEBUG, False) -_DCCSI_DEV_MODE = os.getenv(ENVAR_DCCSI_DEV_MODE, False) +# global space debug flag, no fancy stuff here we use in bootstrap +_G_DEBUG = False # manually enable to debug this file _PACKAGENAME = __name__ if _PACKAGENAME is '__main__': @@ -59,8 +48,9 @@ def return_stub(stub): if (len(tail) == 0): path = "" if _G_DEBUG: - print('~ Debug Message: I was not able to find the ' - 'path to that file (stub) in a walk-up from currnet path') + _LOGGER.debug('~ Debug Message: I was not able to find the ' + 'path to that file (stub) in a walk-up ' + 'from currnet path') break _dir_to_last_file = path @@ -76,13 +66,13 @@ if __name__ == '__main__': # constants for shared use. # happy print - print("# {0} #".format('-' * 72)) - print('~ find_stub.py ... Running script as __main__') - print("# {0} #\r".format('-' * 72)) + _LOGGER.info("# {0} #".format('-' * 72)) + _LOGGER.info('~ find_stub.py ... Running script as __main__') + _LOGGER.info("# {0} #\r".format('-' * 72)) - print('~ Current Work dir: {0}'.format(os.getcwd())) + _LOGGER.info('~ Current Work dir: {0}'.format(os.getcwd())) - print('~ Dev\: {0}'.format(return_stub('engineroot.txt'))) + _LOGGER.info('~ Dev\: {0}'.format(return_stub('engineroot.txt'))) # custom prompt sys.ps1 = "[azpy]>>" diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py index 556750f1f9..b181efc6e7 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py @@ -11,13 +11,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # # -- This line is 75 characters ------------------------------------------- -# The __init__.py files help guide import statements without automatically -# importing all of the modules + """azpy.shared.__init__""" import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/boxDumpTest.json b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/boxDumpTest.json new file mode 100644 index 0000000000..322fe53f26 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/boxDumpTest.json @@ -0,0 +1,17 @@ +{ + "ordered_box": true, + "COMPANY": "Amazon.Lumberyard", + "LY_PROJECT": "DccScriptingInterface", + "LY_DEV": "G:\\depot\\JG_PC1_spectrAtom\\dev", + "LY_BUILD_DIR_NAME": "windows_vs2019", + "LY_BUILD_PATH": "G:\\depot\\JG_PC1_spectrAtom\\dev\\windows_vs2019", + "QT_PLUGIN_PATH": "G:\\depot\\JG_PC1_spectrAtom\\dev\\bin\\profile\\EditorPlugins", + "LY_PROJECT_PATH": "G:\\depot\\JG_PC1_spectrAtom\\dev\\Gems\\AtomLyIntegration\\TechnicalArt\\DccScriptingInterface", + "DCCSIG_PATH": "G:\\depot\\JG_PC1_spectrAtom\\dev\\Gems\\AtomLyIntegration\\TechnicalArt\\DccScriptingInterface", + "DCCSI_AZPY_PATH": "G:\\depot\\JG_PC1_spectrAtom\\dev\\Gems\\AtomLyIntegration\\TechnicalArt\\DccScriptingInterface\\azpy", + "DCCSI_SDK_PATH": "G:\\depot\\JG_PC1_spectrAtom\\dev\\Gems\\AtomLyIntegration\\TechnicalArt\\DccScriptingInterface\\SDK", + "DCCSI_WING_VERSION_MAJOR": "7", + "DCCSI_WING_VERSION_MINOR": "1", + "WINGHOME": "C:\\Program Files (x86)\\Wing Pro 7.1", + "DCCSI_PY_DEFAULT": "G:\\depot\\JG_PC1_spectrAtom\\dev\\Tools\\Python\\3.7.5\\windows\\python.exe" +} \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py index 77e11964a9..2d0c0804c8 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/core_utils.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/core_utils.py index c4352113ec..6404f3ee07 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/core_utils.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/core_utils.py @@ -53,8 +53,8 @@ import site import fnmatch # 3rd Party -from unipath import Path -from progress.spinner import Spinner +from pathlib import Path +# from progress.spinner import Spinner # deprecate use (or refactor) # Lumberyard extensions from azpy.constants import * @@ -64,7 +64,7 @@ from azpy import initialize_logger # ------------------------------------------------------------------------- # global space debug flag -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE @@ -85,12 +85,9 @@ _LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME})) # -------------------------------------------------------------------------- def gather_paths_of_type_from_dir(in_path=str('c:\\'), extension=str('*.py'), - return_path_list=list(), - use_spinner=False): + return_path_list=list()): '''Walks from in_path and returns list of directories that contain the file type matching the extension''' - if use_spinner: - spinner = Spinner('Finding: {0}\r'.format(extension)) # recursive function for finding paths dir_contents = os.listdir(in_path) @@ -111,9 +108,6 @@ def gather_paths_of_type_from_dir(in_path=str('c:\\'), if found: return_path_list.append(dir_trim_following_slash(to_unix_path(os.path.abspath(in_path)))) - if use_spinner: - spinner.next() - complete = True return return_path_list @@ -136,7 +130,7 @@ def dir_trim_following_slash(current_path_str): def to_unix_path(current_path_str): '''converts path string to use unix slashes''' _LOGGER.debug('to_unix_path({0})'.format(current_path_str)) - safe_path = current_path_str.replace('\\', '/') + safe_path = str(current_path_str).replace('\\', '/') return safe_path # -------------------------------------------------------------------------- @@ -158,7 +152,7 @@ def module_path(): # -------------------------------------------------------------------------- -def get_stub_check_path(in_path, checkStub='engineroot.txt'): +def get_stub_check_path(in_path, check_stub='engineroot.txt'): ''' Returns the branch root directory of the dev\'engineroot.txt' (... or you can pass it another known stub) @@ -167,15 +161,13 @@ def get_stub_check_path(in_path, checkStub='engineroot.txt'): If the stub is not found, it returns None ''' - from unipath import Path - path = Path(in_path).absolute() while 1: - testPath = Path(path, checkStub) + test_path = Path(path, check_stub) - if testPath.isfile(): - return Path(testPath) + if test_path.is_file(): + return Path(test_path) else: path, tail = (path.parent, path.name) @@ -188,15 +180,16 @@ def get_stub_check_path(in_path, checkStub='engineroot.txt'): # ------------------------------------------------------------------------- def reorder_sys_paths(known_sys_paths): """Reorders new directories to the front""" - new_sys_path = [] + sys_paths = list(sys.path) + new_sys_paths = [] - for item in list(sys.path): + for item in sys_paths: item = Path(item) - if item.lower() not in known_sys_paths: - new_sys_path.append(item) - sys.path.remove(item) + if str(item).lower() not in known_sys_paths: + new_sys_paths.append(item) + sys_paths.remove(str(item)) - sys.path[:0] = new_sys_path + sys.path[:0] = new_sys_paths known_sys_paths = site._init_pathinfo() return known_sys_paths @@ -386,13 +379,11 @@ def walk_up_dir(in_path, dir_tag='foo'): returns None if the directory named dir_tag is not found ''' - from unipath import Path - - path = Path(Path(__file__).absolute()) + path = Path(__file__).absolute() while 1: # hmmm, will this break on unix paths? # what about case sensitivity? - dir_base_name = Path(path.norm_case()).name() + dir_base_name = path.norm_case().name() if (dir_base_name == dir_tag): break path, tail = (path.parent(), path.name()) @@ -406,6 +397,7 @@ def walk_up_dir(in_path, dir_tag='foo'): # -------------------------------------------------------------------------- def return_stub(stub): '''Take a file name (stub) and returns the directory of the file (stub)''' + # to do: refactor to pathlib.Path from unipath import Path dir_last_file = None diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/envar_utils.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/envar_utils.py index 356b19adba..4e59f86063 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/envar_utils.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/envar_utils.py @@ -43,7 +43,7 @@ from azpy.constants import * # ------------------------------------------------------------------------- -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/__init__.py new file mode 100644 index 0000000000..7d165916c5 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/__init__.py @@ -0,0 +1,44 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# The __init__.py files help guide import statements without automatically +# importing all of the modules +"""azpy.shared.ui.__init__""" + +import os +import logging +import logging.config + +# global space debug flag +_G_DEBUG = os.getenv('DCCSI_GDEBUG', False) + +# global space debug flag +_DCCSI_DEV_MODE = os.getenv('DCCSI_DEV_MODE', False) + +if _DCCSI_DEV_MODE: + _PACKAGENAME = __name__ + if _PACKAGENAME is '__main__': + _PACKAGENAME = 'noodely' + +_PKG_PARENT_PATH = str('azpy.shared') +_PKG_PATH = str('{0}.{1}'.format(_PKG_PARENT_PATH, _PACKAGENAME)) +_LOGGER = logging.getLogger(_PACKAGENAME) +_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PKG_PATH})) + +# ------------------------------------------------------------------------- +# +__all__ = ['config', 'find_arg', 'master', 'node', 'synth', + 'synth_arg_kwarg', 'test_foo'] +# +# ------------------------------------------------------------------------- + +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/find_arg.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/find_arg.py new file mode 100644 index 0000000000..517064e57a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/find_arg.py @@ -0,0 +1,123 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +# find_arg.py +# A simple function for arg, kwarg retrieval +# version: 0.1 +# maintenance: Gallowj +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +"""Module docstring: A simple function for retrieval of arg, kwarg""" +__author__ = 'HogJonny' +# ------------------------------------------------------------------------- + + +def find_arg(argPosIndex=None, argTag=None, removeKwarg=None, + inArgs=None, inKwargs=None, defaultValue=None): + """ + # finds and returns an arg... + # if a positional index is given argPosIndex=0, it checks args first + # if a argTag is given, it checks kwargs + # If removeKwarg=True, it will remove the found arg from kwargs + # * I actually want/need to do this often + # + # a set kwarg will ALWAYS take precident over + # positional arg!!! + # + # return outArg, args, kwargs <-- get back modified kwargs! + # + # proper usage: + # + # foundArg, args, kwargs = find_arg(0, 'name',) + """ + if argPosIndex != None: + if not isinstance(argPosIndex, int): + raise TypeError('argPosIndex: accepts a index integer!\r' + 'got: {0}'.format(argPosIndex)) + + # positional args ... check the position + if len(inArgs) > 0: + try: + foundArg = inArgs[argPosIndex] + except: + pass + + # check kwargs ... a set kwarg will ALWAYS take precident over + # positional arg!!! + try: + foundArg + except: + foundArg = inKwargs.get(argTag, defaultValue) # defaults to None + + if removeKwarg: + if argTag in inKwargs: + del inKwargs[argTag] + + # if we didn't find the arg/kwarg, the defualt return will be None + return foundArg, inKwargs +# ------------------------------------------------------------------------- + + +########################################################################### +# --call block------------------------------------------------------------- +if __name__ == "__main__": + print ("# ----------------------------------------------------------------------- #\r") + print ('~ find_arg.py ... Running script as __main__') + print ("# ----------------------------------------------------------------------- #\r") + + _G_DEBUG = True + + from test_foo import Foo + + ####################################################################### + # Node Class + # --------------------------------------------------------------------- + class TestNode(Foo): + def __init__(self, *args, **kwargs): + super().__init__() + self._name, kwargs = find_arg(argTag='foo', removeKwarg=True, + inArgs=args, inKwargs=kwargs) + self._name, kwargs = find_arg(argPosIndex=0, argTag='name', + removeKwarg=True, + inArgs=args, inKwargs=kwargs) # <-- first positional OR kwarg + self._parent, kwargs = find_arg(argPosIndex=1, argTag='parent', + removeKwarg=True, + inArgs=args, inKwargs=kwargs) # <-- second positional OR kwarg + + self._kwargsDict = {} + + # arbitrary argument properties + # checking **kwargs, any kwargs left + # will be used to synthesize a property + for key, value in kwargs.items(): + self._kwargsDict[key] = value + # synthesize(self, '{0}'.format(key), value) <-- I have a method, + # which synthesizes properties... with gettr, settr, etc. + if _G_DEBUG: + print("{0}:{1}".format(key, value)) + + # representation + def __repr__(self): + return '{0}({1})\r'.format(self.__class__.__name__, self.__dict__) + # --------------------------------------------------------------------- + + # ------------------------------------------------------------------------- + testNode = TestNode('foo') + + testNode2 = TestNode(name='fooey', parent=testNode) + + testNode3 = TestNode('kablooey', testNode2, goober='dufus') + + print ('testNode2, name: {0}, parent: {1}'.format(testNode2._name, testNode2._parent)) + print (testNode3) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/helpers.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/helpers.py new file mode 100644 index 0000000000..f8cc86c2e8 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/helpers.py @@ -0,0 +1,46 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +########################################################################### +# HELPER method functions +# ------------------------------------------------------------------------- + + +def istext(filename): + """ + A guess if a file is text or binary + """ + s = open(filename).read(512) + text_characters = "".join(map(chr, range(32, 127)) + list("\n\r\t\b")) + _null_trans = string.maketrans("", "") + if not s: + # Empty files are considered text + return True + if "\0" in s: + # Files with null bytes are likely binary + return False + # Get the non-text characters (maps a character to itself then + # use the 'remove' option to get rid of the text characters.) + t = s.translate(_null_trans, text_characters) + # If more than 30% non-text characters, then + # this is considered a binary file + if float(len(t)) / float(len(s)) > 0.30: + return False + return True + + +def display_cached_value(cache, cache_key): + try: + cached_value = cache[cache_key] + print("{0}={1}".format(cache_key, cached_value)) + except KeyError: + print("{0}=Not in cache".format(cache_key)) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/master.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/master.py new file mode 100644 index 0000000000..d85ea48854 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/master.py @@ -0,0 +1,90 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +# master.py +# Allows for project based setup to be used with noodly +# version: 0.1 +# author: Gallowj +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +import os + +from unipath import Path + +_G_DEFAULT_PROJECT_DIR = os.getcwd() +_G_MASTER_ROOT_NODE = None + + +@property +def _G_DEFAULT_PROJECT_DIR(value): + _G_DEFAULT_PROJECT_DIR = value + return _G_DEFAULT_PROJECT_DIR + + +def set_PROJECT_DIR(value): + """Sets and returns _G_DEFAULT_PROJECT_DIR""" + global _G_DEFAULT_PROJECT_DIR + _G_DEFAULT_PROJECT_DIR = Path(value).expand() + return Path(_G_DEFAULT_PROJECT_DIR) + + +@property +def _G_MASTER_ROOT_NODE(value): + _G_MASTER_ROOT_NODE = value + return _G_MASTER_ROOT_NODE + + +def set_MASTER_ROOT_NODE(value): + """Sets and returns _G_MASTER_ROOT_NODE""" + global _G_MASTER_ROOT_NODE + if not isinstance(inNode, ProjectRootNode): + raise TypeError('self._projectRootNode is: {0}\r' + 'A _projectRootNode, needs to be properly set\r' + 'So that we can acces:\r' + '\tself._projectRootNode._sourceRoot\r' + '\tself._projectRootNode._overrideRoot\r' + 'Use self.assignProjectRootNode()\r' + ''.format(type(inNode))) + + _G_MASTER_ROOT_NODE = inNode + return _G_MASTER_ROOT_NODE + + +########################################################################### +# tests(), code block for testing module +# ------------------------------------------------------------------------- +def tests(): + set_PROJECT_DIR(os.getcwd()) + print(_G_DEFAULT_PROJECT_DIR) + print(_G_DEFAULT_PROJECT_DIR.parent) + print(_G_DEFAULT_PROJECT_DIR.components()) + + # NOT implemented yet + # set_PROJECT_DIR + + return + + +########################################################################### +# --call block------------------------------------------------------------- +if __name__ == "__main__": + print ("# ----------------------------------------------------------------------- #") + print ('~ noodly.master ... Running script as __main__') + print ("# ----------------------------------------------------------------------- #\r") + + # run simple tests + tests() + + #_G_DEFAULT_PROJECT_DIR = Path(os.getcwd()) + print(_G_DEFAULT_PROJECT_DIR.components()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/node.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/node.py new file mode 100644 index 0000000000..4eca3b315d --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/node.py @@ -0,0 +1,623 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# this has to be at the beginning +from __future__ import division + +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +# node.py +# simple base Node Class, for tool creation. +# version: 0.1 +# author: Gallowj +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +""" +Module docstring: +A Simple Node Base Class Module, for creating basic nodes within a hierarchy. +""" + +__author__ = 'HogJonny' + +_G_DEBUG = True # global state for debugging +_G_SETTINGS = None # global Settings storage +_G_LOG = None # global LOGger storage + +_G_MASTER_NODE = None # We intend to init a master node, unless provided + +# ------------------------------------------------------------------------- +# built-ins +import os +import copy +import traceback +import string +import logging + +# using hashids to generate unique name identifiers for nodes +import hashids +import cachetools +from sched import scheduler + +# local imports +from LyPy.si_shared.noodly.helpers import display_cached_value +from LyPy.si_shared.noodly.find_arg import find_arg +from LyPy.si_shared.noodly.synth import synthesize +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# quick test code (remove later) +from hashids import Hashids +hashids = Hashids(min_length=16, salt='DCCsi') +if _G_DEBUG: + print (hashids.encrypt(193487)) # test hash +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# set up logger +_G_LOGGER = logging.getLogger(__name__) +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# Use unicode strings +_base = str # Python 3 str (=unicode), or Python 2 bytes. +if os.path.supports_unicode_filenames: + try: + _base = unicode # Python 2 unicode. + except NameError: + pass +# ------------------------------------------------------------------------- + +########################################################################### +# HELPER method functions +# ------------------------------------------------------------------------- + + +def return_node_from_hashid(hashid): + if not isinstance(hashid, str): + raise TypeError("{0},{1}: Accepts hashids as str types!\r" + "Input hashid:{2}\r" + "".format('noodly', + 'return_node_from_hashid(hashid)', + type(hashid))) + + temp_node = Node(temp_node=True).get_sibling_node_from_hashid('{0}'.format(hashid)) + + return temp_node +# ------------------------------------------------------------------------- + + +class Node(object): + """Class constructor: makes a node.""" + + # share the debug state + _DEBUG = _G_DEBUG + + # logger + _LOGGER = _G_LOGGER + + # class header + message_header = 'noodly, Node(): Message' + + # class variable + _cls_node_count = 0 + _cls_node_list = [] + _cls_node_dict = {} + + # --BASE-METHODS------------------------------------------------------- + # --constructor- + def __init__(self, node_name=None, parent_node=None, *args, **kwargs): + + self._logger = Node._LOGGER + + self._node_type = self.__class__.__name__ + + # a dict to store properties/attrs + # in the event an object is re-built / re-init + # it is important to store anything here that needs retention + self._kwargs_dict = {} + self._children = [] + + # private local access to the cls_node_list + self._cls_node_list = Node._cls_node_list + + # -- secret keyword ----------------------------------------------- + self._temp_node = False + temp_node, kwargs = find_arg(argPosIndex=None, argTag='temp_node', + removeKwarg=True, inArgs=args, + inKwargs=kwargs) # <-- kwarg only + self._temp_node = temp_node + if self._temp_node: + self._kwargs_dict['temp_node'] = self._temp_node + # ----------------------------------------------------------------- + + # -- store message header ----------------------------------------- + # setup the .message_header <-- kwarg only + message_header, kwargs = find_arg(argPosIndex=None, argTag='message_header', + removeKwarg=True, inArgs=args, inKwargs=kwargs, + defaultValue=('{0}(), Message' + .format(self._node_type))) + self._message_header = message_header + # ----------------------------------------------------------------- + + # -- hashid ------------------------------------------------------- + self._name_is_uni_hashid = False + self._node_class_index = len(Node._cls_node_list) + if Node._DEBUG: + print ('__init__.node_class_index: {0}'.format(self._node_class_index)) + self._uni_hashid = hashids.encrypt(self._node_class_index) + if Node._DEBUG: + print ('__init__.uni_hashid: {0}'.format(self._uni_hashid)) + + # update class dict + if not self._temp_node: + Node._cls_node_dict[self._uni_hashid] = self + # ----------------------------------------------------------------- + + # -- store the node name ------------------------------------------ + self._node_name = node_name + if (self._node_class_index == 0 and self._node_name == None): + self._node_name = 'MASTER' + elif (self._node_class_index > 0 and self._node_name == None): + # set a default node_name if none, based on the unihashid + if not self._name_is_uni_hashid: + self._node_name = self._uni_hashid + self._name_is_uni_hashid = True + if Node._DEBUG: + print ('__init__.node_name: {0}'.format(self._node_name)) + # ----------------------------------------------------------------- + + # -- node parent_node -------------------------------------------------- + # set up the parent_node property + self._parent_node = parent_node + + if self._parent_node != None: + # add this node, to the parent_nodes list of children + try: + self._parent_node.add_child(self) + except: + pass # <-- parent_node object passed is NOT a noodly.node? + + # Update class variables + Node.cls_node_count_up(self) + Node.cls_node_list_append(self) + # ----------------------------------------------------------------- + + # ----------------------------------------------------------------- + # arbitrary argument properties + # check postions *args and **kwargs + # any kwargs left will be used to synthesize a property + try: + # checking import due to the way the code is structured + # the code was passing even if module was not imported + synthesize + synthExists = True + except Exception as e: + print(e) + raise e + + for key, value in kwargs.items(): + self._kwargs_dict[key] = value + try: + synthesize(self, key, value) + except Exception as e: # <-- maybe it can't synthesize? + # in which case fall back to setting the property + print(e) + code = compile(r'self._{0}={1}'.format(key, value), 'synthProp', 'exec') + pass + if Node._DEBUG: + print("{0}:{1}".format(key, value)) + # ----------------------------------------------------------------- + + # if temp node, adjust the class counter + if temp_node: + self.cls_node_count_down() + self.cls_node_list_remove() + + # -- properties ------------------------------------------------------------ + @property + def logger(self): + return self._logger + + @logger.setter + def logger(self, logger): + self._logger = logger + return self._logger + + @logger.getter + def logger(self): + return self._logger + + @property + def kwargs_dict(self): + return self._kwargs_dict + + @kwargs_dict.getter + def kwargs_dict(self): + return self._kwargs_dict + + @property + def message_header(self): + return self._message_header + + @message_header.setter + def message_header(self, message_header): + self._message_header = message_header + return self._message_header + + @property + def node_type(self): + return self._node_type + + @node_type.setter + def node_type(self, node_type): + self._node_type = node_type + return self._node_type + + @node_type.getter + def node_type(self): + return self._node_type + + @property + def temp_node(self): + return self._temp_node + + @temp_node.setter + def temp_node(self, temp_node): + self._temp_node = temp_node + return self._temp_node + + @temp_node.getter + def temp_node(self): + return self._temp_node + + @property + def node_name(self): + return self._node_name + + @node_name.setter + def node_name(self, nameStr): + if nameStr != None: + if not isinstance(nameStr, str): + raise TypeError("{0}, {1}: Accepts str types!" + "".format(self.__class__.__name__, + self._node_name.__name__)) + try: + self._node_name = nameStr + except: + synthesize(self, '_node_name', None) + + return self._node_name + + @node_name.getter + def node_name(self): + return self._node_name + + @property + def name_is_uni_hashid(self): + return self._name_is_uni_hashid + + @node_type.setter + def name_is_uni_hashid(self, value): + self._name_is_uni_hashid = value + return self._name_is_uni_hashid + + @node_type.getter + def name_is_uni_hashid(self): + return self._name_is_uni_hashid + + @property + def node_class_index(self): + return self._node_class_index + + @property + def uni_hashid(self): + return self._uni_hashid + + @property + def cls_node_dict(self): + return Node._cls_node_dict + # ---------------------------------------------------------------------- + + # --method-set--------------------------------------------------------- + def cls_node_count_up(self): + Node._cls_node_count += 1 + return Node._cls_node_count + + def cls_node_count_down(self): + Node._cls_node_count -= 1 + return Node._cls_node_count + + def cls_node_list_append(self): + Node._cls_node_list.append(self) + return Node._cls_node_list + + def cls_node_list_remove(self): + Node._cls_node_list.remove(self) + return Node._cls_node_list + # --------------------------------------------------------------------- + + # --method-set--------------------------------------------------------- + @property + def parent_node(self): + return self._parent_node + + @parent_node.setter + def parent_node(self, parent_node): + self._parent_node = parent_node + return self._parent_node + + @parent_node.getter + def parent_node(self): + return self._parent_node + + def add_child(self, child): + self._children.append(child) + + # --method-- + def remove_child(self, child): + self._children.remove(child) + + @property + def children(self): + return self._children + + def child(self, row): + return self._children[row] + + def child_count(self): + return len(self._children) + + def row(self): + if self._parent_node != None: + return self._parent_node._children.index(self) + # --------------------------------------------------------------------- + + # --method------------------------------------------------------------- + def get_sibling_node_from_hashid(self, hashid): + if not isinstance(hashid, str): + raise TypeError("{0}.{1}: Accepts hashids as str types!" + "".format(self.__class__.__name__, + 'get_sibling_node_from_hashid(hashid)')) + + if hashid in self.cls_node_dict.keys(): + return self.cls_node_dict[hashid] + else: + return None + + # --method------------------------------------------------------------- + def clear_node_dep(self): + self.clear_children + self.clear_node_list() + self.clear_node_count() + return self + + def clear_node_list(self): + Node._cls_node_list = [] + return Node._cls_node_list + + def clear_node_count(self): + Node._cls_node_count = 0 + return Node._cls_node_count + + def clear_children(self): + self._children = [] + return self._children + # --------------------------------------------------------------------- + + # --------------------------------------------------------------------- + @cachetools.cached(cachetools.LFUCache(maxsize=2048)) + def cache_node(self): + return self + # --------------------------------------------------------------------- + + # --method------------------------------------------------------------- + def hierarchy(self, tab_level=-1): + + output = '' + tab_level += 1 + + for i in range(tab_level): + output += '\t' + + output += ('{tab}/------node_name:: "{0}"\n' + '{1} |type:: {2}\n' + '{1} |_uni_hashid:: "{3}"\r' + ''.format(self._node_name, + '\t' * tab_level, + self._node_type, + self._uni_hashid, + tab=tab_level)) + + # TO DO:: object hierarchy "'hips'|'rightLeg'|'etc'" + + for child in self._children: + output += child.hierarchy(tab_level) + + tab_level -= 1 + # output += '\n' + + return output + + def log_hierarchy(self): + # Not implemented + self._logger.autolog(self.hierarchy(), + "return_node_from_hashid('{0}').log_hierarchy()" + "".format(self._uni_hashid())) + return + # --------------------------------------------------------------------- + + # --method------------------------------------------------------------- + # representation + def __str__(self): + '''Returns a nice string representation of the object.''' + + # TO DO: need to improve this + if self.node_name == None or self.name_is_uni_hashid == True: + # open parenthesis only + output = ("{0}(node_name='{1}'" + "".format(self.__class__.__name__, + self.uni_hashid)) + else: + output = ("{0}(node_name='{1}'" + "".format(self.__class__.__name__, + self.node_name)) + + if self.parent_node != None: + output += (", parent_node=return_node_from_hashid('{0}')" + "".format(self.parent_node.uni_hashid)) + + if len(self.kwargs_dict) > 0: + for key, value in self.kwargs_dict.items(): + if not isinstance(value, str): + output += (", {0}={1}".format(key, value)) + else: # if a str add the extra quotes + output += (", {0}='{1}'".format(key, value)) + + # add the close parenthesis + output += ')' + + if self.name_is_uni_hashid == True or self.temp_node: + output = ("return_node_from_hashid('{0}')" + "".format(self.node_name)) + + # Node(self, node_name, parent_node=None, path='') + return output + + # representation + def __repr__(self): + return '{0}({1})\r'.format(self.__class__.__name__, self.__dict__) +# --Class End-------------------------------------------------------------- + + +class ClassProperty(property): + """Decorator""" + + def __get__(self, cls, owner): + return self.fget.__get__(None, owner)() +# --Class End-------------------------------------------------------------- + + +########################################################################### +# tests(), code block for testing module +# ------------------------------------------------------------------------- +def tests(): + default_node = Node() + print(str(default_node)) + print(repr(default_node)) + print(default_node.uni_hashid) + print(default_node.kwargs_dict) + print(default_node.message_header) + print(default_node.node_name) + print(default_node.parent_node) + print(default_node.node_class_index) + # print(default_node.cls_node_dict) + + # temp_node = Node() + temp_node = Node(temp_node=True) + print(temp_node) + + test_default_node = Node(temp_node=True).get_sibling_node_from_hashid('kxYLm0XQeXJ7jWaP') + print(test_default_node) + + another_test = return_node_from_hashid('kxYLm0XQeXJ7jWaP') + print(another_test) + + second_node = Node(node_name='foo', parent_node=default_node) + print(str(second_node)) + print(second_node.uni_hashid) + print(second_node.kwargs_dict) + print(second_node.message_header) + print(second_node.node_name) + print(second_node.parent_node.node_name) + print(second_node.node_class_index) + # print(second_node.cls_node_dict) + + second_child = Node(node_name='fooey', parent_node=another_test) + print(str(second_child)) + print(second_child.uni_hashid) + print(second_child.kwargs_dict) + print(second_child.message_header) + print(second_child.node_name) + print(second_child.parent_node.node_name) + print(second_child.node_class_index) + # print(second_child.cls_node_dict) + + third_node = Node(node_name='kablooey', parent_node=second_node, + message_header='Node(): CUSTOM Message') + print(str(third_node)) + print(third_node.uni_hashid) + print(third_node.kwargs_dict) + print(third_node.message_header) + print(third_node.node_name) + print(third_node.parent_node.node_name) + print(third_node.node_class_index) + + fourth_node = Node(parent_node=second_node, + message_header='Node(): CUSTOM Message') + print(str(fourth_node)) + print(fourth_node.uni_hashid) + print(fourth_node.kwargs_dict) + print(fourth_node.message_header) + print(fourth_node.node_name) + print(fourth_node.parent_node.node_name) + print(fourth_node.node_class_index) + + kwarg_test_child = Node(node_name='kwargChild', parent_node=default_node, garble=1001001) # custom kwarg + print(str(kwarg_test_child)) + print(kwarg_test_child.uni_hashid) + print(kwarg_test_child.node_name) + print(kwarg_test_child.parent_node.node_name) + print(kwarg_test_child.kwargs_dict) + # check the custom arg/property garble + print(kwarg_test_child.garble) + + # check the node hierarchy + print(default_node.hierarchy()) + + # retreive a node from it's known hashid + master_node = return_node_from_hashid('kxYLm0XQeXJ7jWaP') + print(master_node.uni_hashid) # verify hasid + # should return the same node as default_node + print(master_node.node_name) # should be 'MASTER' + return +# ------------------------------------------------------------------------- + + +def cache_tests(): + cache = cachetools.LFUCache(maxsize=128) + runner = scheduler() + cache["HogJonny"] = 1001001 + runner.enter(2, 1, display_cached_value, + kwargs={'cache': cache, 'cache_key': 'HogJonny'}) + runner.enter(6, 1, display_cached_value, + kwargs={'cache': cache, 'cache_key': 'HogJonny'}) + runner.run() + return +# ------------------------------------------------------------------------- + + +def main(): + return +# - END, main() -- + + +########################################################################### +# --call block------------------------------------------------------------- +if __name__ == "__main__": + print ("# ----------------------------------------------------------------------- #") + print ('~ noodly.Node ... Running script as __main__') + print ("# ----------------------------------------------------------------------- #\r") + + # run simple tests + tests() + + cache_tests() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/pathnode.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/pathnode.py new file mode 100644 index 0000000000..f969e16fbe --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/pathnode.py @@ -0,0 +1,407 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# this has to be at the beginning +from __future__ import division + +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +# pathnode.py +# simple path objecy based Node Class, for tool creation. +# version: 0.1 +# author: Gallowj +# ------------------------------------------------------------------------- +# ------------------------------------------------------------------------- +""" +Module docstring: +A simple path objecy based Node Class, for creating path hierarchies. +""" +__author__ = 'HogJonny' + +_G_DEBUG = True # global state for debugging +_G_SETTINGS = None # global Settings storage +_G_LOG = None # global LOGger storage + +_G_MASTER_NODE = None # We intend to init a master node + +# ------------------------------------------------------------------------- +# built-ins +import os +import copy +import subprocess +import traceback +import string +import logging +from unipath import Path, AbstractPath + +# local ly imports +from LyPy.si_shared.noodly.helpers import istext +from LyPy.si_shared.noodly.find_arg import find_arg +from LyPy.si_shared.noodly.synth import synthesize +from LyPy.si_shared.noodly.node import Node +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# Use unicode strings +_base = str # Python 3 str (=unicode), or Python 2 bytes. +if os.path.supports_unicode_filenames: + try: + _base = unicode # Python 2 unicode. + except NameError: + pass +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set up logger +_G_LOGGER = logging.getLogger(__name__) +# ------------------------------------------------------------------------- + + +class PathNode(Node): + """doc string""" + + # share the debug state + _DEBUG = _G_DEBUG + + # logger + _LOGGER = _G_LOGGER + + # class header + _message_header = 'noodly, PathNode(): Message' + + # App Launcher paths... + try: + _maya_exe_path = Path(os.environ['MAYAPY']) + except: + _maya_exe_path = Path(r"C:\Program Files\Autodesk\Maya2019\bin\maya.exe") + try: + _notepad_exe_path = Path(os.environ['DEFAULT_TXT_EXE']) + except: + _notepad_exe_path = Path(r"C:\Program Files (x86)\Notepad++\notepad++.exe") + + # --BASE-METHODS------------------------------------------------------- + def __new__(cls, path="", root_path=None, *args, **kwargs): + '''docstring''' +# if not isinstance(path, str) and not isinstance(path, Path): +# raise TypeError("{0}, {1}: Accepts paths as str or Path() types!\r" +# "Input data is:{2}\r" +# "".format('noodly, PathNode', +# 'PathNode(filename)', type(path))) +# + self = super(PathNode, cls).__new__(cls) + return self + + # --constructor-------------------------------------------------------- + def __init__(self, path="", root_path=None, parent_is_root=None, + name_is_path=None, *args, **kwargs): + + self._logger = Node._LOGGER + + self._node_type = self.__class__.__name__ + + # a dict to store properties/attrs + # in the event an object is re-built / re-init + # it is important to store anything here that needs retention + self._kwargs_dict = {} + + # -- secret keyword ----------------------------------------------- + self._temp_node = False + temp_node, kwargs = find_arg(argPosIndex=None, argTag='temp_node', + removeKwarg=True, inArgs=args, + inKwargs=kwargs) # <-- kwarg only + + self._temp_node = temp_node + if self._temp_node: + self.k_wargs_dict['temp_node'] = self._temp_node + + # -- Node class args/kwargs --------------------------------------- + node_name, kwargs = find_arg(argPosIndex=2, argTag='node_name', + removeKwarg=True, inArgs=args, + inKwargs=kwargs) # <-- third arg, kwarg + + parent_node, kwargs = find_arg(argPosIndex=3, argTag='parent_node', + removeKwarg=True, inArgs=args, + inKwargs=kwargs) # <-- fourth arg, kwarg + + self._root_path = root_path + + self._parent_is_root = parent_is_root + if self._parent_is_root != None: + self._kwargs_dict['parent_is_root'] = self.parent_is_root + + if parent_is_root: # <-- do it + self._root_path = parent_node + + # make sure the path is a Path + self._path = path + if not isinstance(self._path, Path): + try: + self._path = Path(path) + except: + self._path = Path() # empty path object fallback + + self._name_is_path = name_is_path + if self._name_is_path: + self._kwargs_dict['name_is_path'] = self._name_is_path + + # this might only work if the file actually exists + self._node_name = node_name + if self._name_is_path: + if self._path.name != None or self._path.name != '': + self._node_name = str(self._path.name) + + # Path.__init__(self) + super(PathNode, self).__init__(self._node_name, parent_node, + temp_node=temp_node, + *args, **kwargs) + + # -- properties ------------------------------------------------------- + + @property + def path(self): + return self._path + + @path.setter + def path(self, path): + self._path = path + return self._path + + @path.getter + def path(self): + return self._path + + @property + def root_path(self): + return self._root_path + + @root_path.setter + def root_path(self, root_path): + self._root_path = root_path + return self._root_path + + @root_path.getter + def root_path(self): + return self._root_path + + @property + def parent_is_root(self): + return self._parent_is_root + + @parent_is_root.setter + def parent_is_root(self, parent_is_root): + self._parent_is_root = parent_is_root + return self._parent_is_root + + @parent_is_root.getter + def parent_is_root(self): + return self._parent_is_root + + @property + def name_is_path(self): + return self._name_is_path + +# @name_is_path.setter +# def name_is_path(self, name_is_path): +# self._name_is_path = name_is_path +# return self._name_is_path + + @name_is_path.getter + def name_is_path(self): + return self._name_is_path + + # --method------------------------------------------------------------- + def set_file_path(self, path): + if not isinstance(path, Path): + try: + path = Path(path) + except: + raise TypeError("must be Path compatible") + + # retreive a copy of the old _kwargs dict + _kwargs_dict_copy = copy.copy(self._kwargs_dict) + _name_is_uni_hashid = copy.copy(self.name_is_uni_hashid) + + # create a new me (self), with new value + # attempt to keep existing attrs/settings + self = PathNode(path=path, + root_path=self.root_path, + parent_is_root=self.parent_is_root, + name_is_path=self.name_is_path, + temp_node=self.temp_node, + node_name=self.node_name, + parent_node=self.parent_node, + name_is_uni_hashid=self.name_is_uni_hashid) + + # now we need to restore any custom properties on the replacement object + for key, value in _kwargs_dict_copy.items(): + self._kwargs_dict[key] = value + try: + synthesize(self, '{0}'.format(key), value) + except: + code = compile('self._{0} = {1}'.format(key, value), 'synthProp', 'exec') + if Node._DEBUG: + self.logger.error('can not set: self._{0} = {1}'.format(key, value)) + + # replace myself in the class nodeDict, based on my unihashid + self.cls_node_dict[self.uni_hashid] = self + + # return the new version of myself + return self.cls_node_dict[self.uni_hashid] + # --------------------------------------------------------------------- + + # --method------------------------------------------------------------- + def start_file(self, filepath=None): + '''opens the file in the prefered os editor for the filetype''' + if filepath == None: + filepath = self.path + + if not isinstance(filepath, Path): # <-any subclass of Path works? + filepath = Path(filepath) + + self.logger.debug('starting file: {0}'.format(filepath)) + try: + os.startfile(filepath) + except IOError as e: + self.logger.error(e) + + return filepath + # --------------------------------------------------------------------- + + # --method------------------------------------------------------------- + def explore_file(self, filepath=None): + if filepath == None: + filepath = self.path + + if not isinstance(filepath, Path): + filepath = Path(filepath) + + self.logger.debug('exploring file: {0}'.format(filepath)) + if filepath.exists(): + try: + subprocess.Popen(r'explorer /select,"{0}"'.format(filepath)) + except IOError as e: + self.logger.error(e) + else: + self.logger.error('file does not exist: {0}'.format(filepath)) + + return filepath + # --------------------------------------------------------------------- + + # --method------------------------------------------------------------- + def hierarchy(self, tabLevel=-1): + + output = '' + if isinstance(self, RootNode): + if gDebug: + func = inspect.currentframe().f_back.f_code + output += ('{0}Called from:\n' + '{0}{1}\n'.format('\t' * (tabLevel + 1), func)) + + tabLevel += 1 + + for i in range(tabLevel): + output += '\t' + + output += ('{tab}/------ nodeName:: "{0}"\n' + '{1} |typeInfo:: {2}\n' + '{1} |_uniHashid:: "{3}"\r' + '{1} |path:: "{4}"\n' + '{1} |get_root():: "{5}"\n' + '{1} |getPathFromRoot():: "{6}"\n' + ''.format(self.getNodeName(), + '\t' * tabLevel, + self.get_typeInfo(), + self.get_uniHashid(), + self, + self.get_root(), + self.getPathFromRoot(), + tab=tabLevel)) + + for child in self._children: + output += child.hierarchy(tabLevel) + + tabLevel -= 1 + + return output + # --------------------------------------------------------------------- + +# --Class End-------------------------------------------------------------- + + +########################################################################### +# tests(), code block for testing module +# ------------------------------------------------------------------------- +def tests(): + from node import Node + default_node = Node() # result: Node(node_name='MASTER') + print(default_node) + + first_child = PathNode(path=None, node_name='first_child', parent_node=default_node) + print(first_child) + # result: PathNode(temp_node=True, parent_node=Node(node_name='MASTER')).siblingNodeFromHashid('WNPZoKBVpXV16QLz') + # first_child.nodeType + # first_child.parent_node + # first_child.node_name + + try: + # PathNode requires a arg 'path' input (should be a path str) + fubar_path_node = PathNode() # <-- this should fail + print (fubar_path_node) + except Exception as err: + print ('\r{0}'.format(err)) + print (traceback.format_exc()) + + foo = PathNode(r'\foo\fooey\kablooey', node_name='foo', + parent_node=default_node) + print(foo) + + testes = Path(r'/foo/fooey/kablooey') + + print(foo.path.exists()) + print(foo.path.parent) + print(foo.path.norm_case()) + print(foo.path.absolute()) + + fooey = PathNode(None, parent_node=foo) + print(fooey) + + kablooey = PathNode(r'\foo\fooey\kablooey', + parent_node=default_node, + name_is_path=True) + print(kablooey) + + kablooey = kablooey.set_file_path(r'c:\mytemp\fubar.txt') + print(kablooey) + kablooey.start_file() + kablooey.explore_file() + + return +# - END, tests() ---------------------------------------------------------- + + +def main(): + pass + return +# - END, main() ----------------------------------------------------------- + + +########################################################################### +# --call block------------------------------------------------------------- +if __name__ == "__main__": + print ("# ----------------------------------------------------------------------- #") + print ('~ noodly.PathNode ... Running script as __main__') + print ("# ----------------------------------------------------------------------- #\r") + + # run simple tests + tests() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/synth.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/synth.py new file mode 100644 index 0000000000..59add415ea --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/synth.py @@ -0,0 +1,116 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# synth.py +# Convenience module for a standardized attr interface for classes/objects. +# version: 0.1 +# date: 11/14/2013 +# author: jGalloway +# ------------------------------------------------------------------------- +__author__ = 'HogJonny' +# ------------------------------------------------------------------------- +""" +This module contains the function + +.synthesize(inst, name, value, readonly=False) + +It is useful in object oriented class attributes, providing a stardard +interface for creating properties of classes. + +Can be called within an objects Class, or an instance of an object can be +passed into the function to have the properties added. The property will +be added and set/get/del attr interface will be created. +""" + +# -------------------------------------------------------------------------- + + +def synthesize(inst, name, value, readonly=False): + """ + Convenience method to create getters, setters and a property for the + instance. Should the instance already have the getters or setters + defined this won't add them and the property will reference the already + defined getters and setters Should be called from within __init__. + + Creates [name], _[name], get[Name], set[Name], del[Name], and on inst. + + :param inst: An instance of the class to add the methods to. + :param name: Base name to build function names and storage variable. + :param value: Initial state of the created variable. + + """ + cls = type(inst) + storageName = '_{0}'.format(name) + getterName = 'get{0}{1}'.format(name[0].capitalize(), name[1:]) + setterName = 'set{0}{1}'.format(name[0].capitalize(), name[1:]) + deleterName = 'del{0}{1}'.format(name[0].capitalize(), name[1:]) + + setattr(inst, storageName, value) + + # We always define the getter + def buildCustomGetter(self): + return getattr(self, storageName) + + # Add the Getter + if not hasattr(inst, getterName): + setattr(cls, getterName, buildCustomGetter) + + # Handle Read Only + if readonly: + if not hasattr(inst, name): + setattr(cls, name, + property(fget=getattr(cls, getterName, None) or buildCustomGetter, + fdel=getattr(cls, getterName, None))) + else: + # We only define the setter if we arn't read only + def buildCustomSetter(self, state): + setattr(self, storageName, state) + if not hasattr(inst, setterName): + setattr(cls, setterName, buildCustomSetter) + member = None + if hasattr(cls, name): + # we need to try to update the property fget, fset, fdel + # incase the class has defined its own custom functions + member = getattr(cls, name) + if not isinstance(member, property): + raise ValueError('Member "{0}" for class "{1}" exists and is not a property.' + ''.format(name, cls.__name__)) + + # If the class has the property or not we still try to set it + setattr(cls, name, + property(fget=getattr(member, 'fget', None) + or getattr(cls, getterName, None) + or buildCustomGetter, + fset=getattr(member, 'fset', None) + or getattr(cls, setterName, None) + or buildCustomSetter, + fdel=getattr(member, 'fdel', None) + or getattr(cls, getterName, None))) + + return getattr(inst, name) +# -------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, will run the tool +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Self Testing""" + + from test_foo import Foo + + # create an object from Foo Class + myFoo = Foo() + + pass + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/synth_arg_kwarg.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/synth_arg_kwarg.py new file mode 100644 index 0000000000..3618ad67de --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/synth_arg_kwarg.py @@ -0,0 +1,158 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# synth_arg_kwarg.py +# Convenience module for a standardized attr interface for classes/objects. +# ------------------------------------------------------------------------- +__author__ = 'HogJonny' +# ------------------------------------------------------------------------- +from find_arg import find_arg +from synth import synthesize + +# ------------------------------------------------------------------------- + + +def setSynthArgKwarg(inst, argPosIndex=None, argTag=None, defaultValue=None, + inArgs=None, inKwargs=None, removeKwarg=True, + setAnyway=True): + """ + Uses find_arg and sets a property on a object. + + Special args: + setAnyway <-- if the object has the property already, set it + + If the arg/property doesn't exist we synthesize it + """ + + foundArg = None + argValueDict = {} + + # find the argument, or set to default value + foundArg, inKwargs = find_arg(argPosIndex, argTag, removeKwarg, + inArgs, inKwargs, + defaultValue) + + if foundArg: + argTag = foundArg + + # single arg first + # make sure the object doesn't arealdy have this property + try: + hasattr(inst, argTag) # check if property exists + if setAnyway: + try: + setattr(inst, argTag, defaultValue) # try to set + except Exception as e: + raise e + except: + pass + + # make it a synthetic property + if argTag: + try: + argValue = synthesize(inst, argTag, defaultValue) + argValueDict[argTag] = argValue + except Exception as e: + raise e + + # multiple and/or remaining kwards next + if inKwargs: + if len(inKwargs) > 0: + for k, v in inKwargs.items(): + try: + hasattr(inst, k) # check if property exists + if setAnyway: + try: + setattr(inst, k, v) # try to set + except Exception as e: + raise e + except: + pass + + if k: + try: + argValue = synthesize(inst, k, v) + argValueDict[k] = argValue + except Exception as e: + raise e + + return argValueDict +# -------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, will run the tool +# ------------------------------------------------------------------------- +if __name__ == '__main__': + + from test_foo import Foo + + # define a arg/property tag we know doesn't exist + synthArgTag = 'syntheticArg' + + # create a test object + print('~ creating the test foo object...') + myFoo = Foo() + + print('~ Starting - single synthetic arg test...') + # find and set existing, or create and set + argValueDict = setSynthArgKwarg(myFoo, + argTag=synthArgTag, + defaultValue='kablooey') + + # what was returned + print('~ single value returned...') + for k, v in argValueDict.items(): + print("Arg '{0}':'{1}'".format(k, v)) + + # attempt to access the new synthetic property directly + print('~ direct property access test...') + try: + myFoo.syntheticArg + print('myFoo.{0}: {1}'.format(synthArgTag, myFoo.syntheticArg)) + except Exception as e: + raise e + + # can we create a bunch of kwargs? + print('~ Starting - multiple synthetic kwarg test...') + newKwargs = {'fooey': 'chop suey', 'success': True} + + # find and set existing, or create and set + argValueDict = setSynthArgKwarg(myFoo, + inKwargs=newKwargs, + defaultValue='kablooey') + + # what was returned + print('~ multiple values returned...') + for k, v in argValueDict.items(): + print("Arg '{0}':'{1}'".format(k, v)) + + print('~ multiple direct property access test...') + try: + myFoo.fooey + print('myFoo.{0}: {1}'.format('fooey', myFoo.fooey)) + except Exception as e: + raise e + + try: + myFoo.success + print('myFoo.{0}: {1}'.format('success', myFoo.success)) + except Exception as e: + raise e + + print('~ Starting - known failure test...') + try: + myFoo.knownBad + except Exception as e: + print(e) + print('Test failed as expected!!!') diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/test_foo.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/test_foo.py new file mode 100644 index 0000000000..ca652503d2 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/noodely/test_foo.py @@ -0,0 +1,62 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +# test_foo.py +# just a dumb test object +# ------------------------------------------------------------------------- +__author__ = 'HogJonny' +# ------------------------------------------------------------------------- + +from synth import synthesize + + +class Foo(object): + """ + This is a Class, it creates a Foo object... which does nothing really + """ + + __propertyTag = 'fooProperty' + + # ------------------------------------------------------------------ + def __init__(self, name='Foo', value='defaultValue', *args, **kwargs): + '''Class __init__''' + synthesize(self, 'name', name) + synthesize(self, Foo.__propertyTag, value) + + synthesize(self, 'test', 'testValue') + + self.testDump = object.__getattribute__(self, 'test') + + # This calls a class method + self.methodA() + + # ------------------------------------------------------------------ + def methodA(self): + '''Class synthesized property methods self-tests''' + + """test getters""" + print ('{0}.fooProperty is: {1}' + ''.format(self.getName(), self.getFooProperty())) + + """test property retreival""" + print ('{0}.testDump is: {1}' + ''.format(self.name, self.testDump)) +# ---------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, will run the tool +# ------------------------------------------------------------------------- +if __name__ == '__main__': + # create an object from Foo Class + myFoo = Foo() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py index f4326b7d66..5626c2b5ba 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py @@ -10,14 +10,13 @@ # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# -- This line is 75 characters ------------------------------------------- -# The __init__.py files help guide import statements without automatically -# importing all of the modules +# ------------------------------------------------------------------------- + """azpy.shared.ui.__init__""" import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/base_widget.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/base_widget.py new file mode 100644 index 0000000000..871e17ed08 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/base_widget.py @@ -0,0 +1,355 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +from __future__ import unicode_literals +# from builtins import str + +# built in's +import os +import sys +import uuid +import weakref +import logging as _logging + +# 3rd Party +from unipath import Path + +# azpy extensions +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +settings = _config.get_config_settings(setup_ly_pyside=True) + +import PySide2.QtWidgets as QtWidgets +import PySide2.QtCore as QtCore +from shiboken2 import wrapInstance + + +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = settings.DCCSI_GDEBUG + +# global space debug flag +_DCCSI_DEV_MODE = settings.DCCSI_DEV_MODE + +# global maya state (if we are running in maya with gui) +# or another dcc tool with pyside2 +# TODO implement that check +_G_PYSIDE2_DCC = None + +_MODULE_PATH = Path(__file__) + +_MODULENAME = 'azpy.shared.ui.azpy_base_widget' +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Something invoked :: {0}.'.format(_MODULENAME)) +# ------------------------------------------------------------------------- + + +class DccWidget(object): + """This is an experimental Class to make a widget compatible with + a number of PySide2/Python compatible DCC Tools like Maya and Houdini""" + + _LABEL_NAME = 'no name window' # Window display name + _instances = list() + + # --constructor-------------------------------------------------------- + def __init__(self, parent=None, dcc_gui=_G_PYSIDE2_DCC, *args, **kwargs): + + # False or None, 'Maya', 'Houdini' ... or another pysdie2 dcc + self._dcc_gui = dcc_gui + + self._name = '{0}_{1}'.format(self.__class__.__name__, uuid.uuid4()) + + self._parent = parent + self._parent = self._base_setup() + + # Init all baseclasses (including QWidget) of the main class + try: + super().__init__(*args, **kwargs) + except Exception as Err: + print(Err) + + self.__class__._instances.append(weakref.proxy(self)) + + if isinstance(self, QtWidgets.QWidget): + self.setParent(self._parent) + + # camel case because this is a Qt|Pyside2 widget method + if self.objectName() == '': + # Set a unique object name string so Maya can easily look it up + self.setObjectName('{0}_{1}'.format(self._name)) + + # -- properties ------------------------------------------------------- + @property + def dcc_gui(self): + return self._dcc_gui + + @dcc_gui.setter + def dcc_gui(self, type): + self._dcc_gui = type + return self._dcc_gui + + @dcc_gui.getter + def dcc_gui(self): + return self._dcc_gui + + @property + def parent(self): + return self._parent + + @parent.setter + def parent(self, type): + self._parent = type + return self._parent + + @parent.getter + def parent(self): + return self._parent + # --------------------------------------------------------------------- + + def _base_setup(self, *args, **kwargs): + '''TODO''' + # if there is not a parent, we want a mainwindow to parent to + if self.parent == None: + self.parent = self._make_standalone_mainwindow() + return self.parent + + def _make_standalone_mainwindow(self): + '''Make a standalone mainwindow parent to existing Qapp + We parent so that this Qwidget will not be auto-destroyed or garbage + collected if the instance variable goes out of scope. + + If a Qapp doesn't exist, start one. + ''' + original_parent = self._parent + new_parent = None + + if self.dcc_gui: + if self.dcc_gui == 'Maya': + # import the Maya ui class + import OpenMaya as omui + # Parent under the main Maya window + mainWindowPtr = omui.MQtUtil.mainWindow() + new_parent = wrapInstance(long(mainWindowPtr), QMainWindow) + elif self.dcc_gui == 'Houdini': + pass # not implemented + else: + from azpy.shared.ui.templates import TemplateMainWindow + new_parent = TemplateMainWindow() + + return new_parent + + def objectName(self): + # stand in for Qt call on mixed objects, thus camelCase + return None + + def show(self): + # stand in for Qt call on mixed objects, thus camelCase + return None + + def thing(self): + # Make this widget appear as a standalone window even though it is parented + if isinstance(self, QtWidgets.QDockWidget): + self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.FramelessWindowHint) + else: + try: + self.setWindowFlags(QtCore.Qt.Window) + except: + pass + + # Delete the parent QDockWidget if applicable + if isinstance(original_parent, QtWidgets.QDockWidget): + original_parent.close() +# ------------------------------------------------------------------------- + + +class BaseQwidgetAzpy(object): + """Inheret from to handle common base functionality for Qt Widgets + Parents to a standalone Qapp and mainwindow if not explicitly provided + Place this before the Qt Widget Class in inheretance order""" + + _LABEL_NAME = 'no name window' # Window display name + _instances = list() + + _ORG_TAG = 'Amazon_Lumberyard' + _APP_TAG = 'DCCsi' + + # --constructor-------------------------------------------------------- + def __init__(self, + parent=None, + logger=None, + qapp=None, + window_title=_LABEL_NAME, + *args, **kwargs): + """To DO""" + self._name_uuid = '{0}_{1}'.format(self.__class__.__name__, uuid.uuid4()) + + self._logger = logger + if not self._logger: + self._logger = _logging.getLogger(self._name_uuid) + + self._parent = parent + + self._qapp = qapp or QtWidgets.QApplication.instance() + if self._qapp == None: + self.logger.debug('No QApplication has been instantiated') + self._qapp = self._base_setup(window_title) + + # Init all baseclasses (including QWidget) of the main class + try: + super(BaseQwidgetAzpy, self).__init__(*args, **kwargs) + except Exception as Err: + print(Err) + + self.__class__._instances.append(weakref.proxy(self)) + + if isinstance(self, QtWidgets.QWidget): + self.setParent(self._parent) + + # camel case because this is a Qt|Pyside2 widget method + if self.objectName() == '': + # Set a unique object name string so Maya can easily look it up + self.setObjectName(self._name) + + # -- properties ------------------------------------------------------- + @property + def parent(self): + return self._parent + + @parent.setter + def parent(self, type): + self._parent = type + return self._parent + + @parent.getter + def parent(self): + return self._parent + + @property + def logger(self): + return self._logger + + @logger.setter + def logger(self, logger): + self._logger = logger + return self._logger + + @logger.getter + def logger(self): + return self._logger + + @property + def qapp(self): + return self._qapp + + @qapp.setter + def qapp(self, qapp): + self._qapp = qapp + return self._qapp + + @qapp.getter + def qapp(self): + return self._qapp + # ---------------------------------------------------------------------- + + def objectName(self): + # stand in for Qt call on mixed objects, thus camelCase + return self._name_uuid + + def show(self): + # stand in for Qt call on mixed objects, thus camelCase + return None + + def _base_setup(self, *args, **kwargs): + '''TODO''' + # if there is not a parent, we want a mainwindow to parent to + if self.parent == None: + try: + self.parent = self._make_standalone_app(self.objectName()) + except: + self.parent = self._make_standalone_app(self._name_uuid) + return self.parent + + def _make_standalone_app(self, name): + useGUI = not '-no-gui' in sys.argv + self.qapp = QtWidgets.QApplication(sys.argv) if useGUI else QtWidgets.QCoreApplication(sys.argv) + self.qapp.setOrganizationName(self.__class__._ORG_TAG) + self.qapp.setApplicationName('{app}:{tool}'.format(app=self.__class__._APP_TAG, + tool=name)) + return self.qapp + + @QtCore.Slot() + def closeEvent(self, *args, **kwargs): + """Event which is run when window closes""" + self.logger.debug("Method: {0}.{1}".format(self.__class__.__name__, 'closeEvent')) + self.logger.debug("Closing: {0}".format(self.objectName())) + self.__class__._instances.remove(self) + self.qapp.instance().quit + self.qapp.exit() + # ---------------------------------------------------------------------- +# ------------------------------------------------------------------------- + + +class TestWidget(BaseQwidgetAzpy, QtWidgets.QPushButton): + def __init__(self, parent=None, *args, **kwargs): + + # Init all baseclasses (including QWidget) of the main class + try: + super().__init__(*args, **kwargs) + except Exception as Err: + print(Err) + + try: + self.logger.debug('{0}'.format(self.parent)) + except Exception as Err: + print(Err) + + # self.setParent(parent) + + self.setText('Push Me') +# ------------------------------------------------------------------------- + + +if __name__ == '__main__': + """Run this file as main""" + import sys + + _TEST_APP_NAME = '{0}-{1}'.format(_MODULENAME, 'TEST') + + _LOGGER = azpy.initialize_logger(_TEST_APP_NAME, + log_to_file=True, + default_log_level=_logging.DEBUG) + + from azpy.constants import STR_CROSSBAR + _LOGGER.info(STR_CROSSBAR) + _LOGGER.info("{0} :: if __name__ == '__main__':".format(_MODULENAME)) + _LOGGER.info(STR_CROSSBAR) + + + # test raw BaseWidget + _TEST_BASE_WIDGET = BaseQwidgetAzpy() + _LOGGER.info(_TEST_BASE_WIDGET.objectName()) + _TEST_BASE_WIDGET.show() # this should do nothing,it is a dummy call + # this call is replaced with version the QWidget + _TEST_BASE_WIDGET.closeEvent() # mimic Qt close + _TEST_BASE_WIDGET = None + + # NEED TO DELETE ^ Makes a Qapp + + _TEST_WIDGET = TestWidget() + _LOGGER.info(_TEST_WIDGET.objectName()) + _TEST_WIDGET.show() + + del _LOGGER + sys.exit(_TEST_WIDGET.qapp.exec_()) +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/custom_treemodel.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/custom_treemodel.py new file mode 100644 index 0000000000..cded8fec09 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/custom_treemodel.py @@ -0,0 +1,89 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +from __future__ import unicode_literals +# from builtins import str + +# built in's +import os +# from io import StringIO # for handling unicode strings + +# azpy +from azpy import initialize_logger + +# 3rd Party +from unipath import Path +import PySide2.QtCore as QtCore +import PySide2.QtWidgets as QtWidgets +import PySide2.QtGui as QtGui +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = os.getenv('DCCSI_GDEBUG', False) + +# global space debug flag +_DCCSI_DEV_MODE = os.getenv('DCCSI_DEV_MODE', False) + +_MODULE_PATH = Path(__file__) + +_ORG_TAG = 'Amazon_Lumberyard' +_APP_TAG = 'DCCsi' +_TOOL_TAG = 'azpy.shared.ui.custom_treemodel' +_TYPE_TAG = 'test' + +_MODULENAME = __name__ +if _MODULENAME is '__main__': + _MODULENAME = _TOOL_TAG + +_UI_FILE = Path(_MODULE_PATH.parent, 'resources', 'example.ui') +# ------------------------------------------------------------------------- + +########################################################################### +## CustomTreeModel, Class +# ------------------------------------------------------------------------- + + +class CustomFileTreeModel(QtCore.QAbstractItemModel): + """ + Creates a customized model subclassed from, QAbstractItemModel + Compatible with a TreeView + """ + + # --constructor-------------------------------------------------------- + def __init__(self, parent=None, *args, **kwargs): + ''' + Constructor, INPUTS: Node, QObject + ''' + super(CustomFileTreeModel, self).__init__(parent=parent, *args, **kwargs) + + # can use these later (maybe?) + # easily extended later, TODO implement as property, add append + self._file_ext_list = ['.sbs', '.sbsar'] + + # we assume this is a file tree, we need a root path (lmbr project?) + self._root_filepath = root_filepath + # TODO: need to make sure we are getting path objects + + # build the root node + self._root_node = self.buildRootNode('root', None, self._rootFilePath) + + # master selection + self._masterSelection = masterSelection + + # build the master selection node + self._masterNode = self.buildMasterNode('master', None, self._masterSelection, self._rootNode.path()) + + # want to store off a couple lists in the model, for retreival later + self._nodeList = None + self._depNodesList = None + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/help_menu.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/help_menu.py new file mode 100644 index 0000000000..39f151cd2e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/help_menu.py @@ -0,0 +1,214 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +"""help_menu.py: Setup a standard Help item in the menubar for PySide2 GUIs""" + +# built in's +import os +import logging + +# azpy +from azpy import initialize_logger +# import azpy.shared.ui.qt_settings as qt_settings + +# 3rd Party +from unipath import Path +import PySide2.QtCore as QtCore +import PySide2.QtGui as QtGui +import PySide2.QtWidgets as QtWidgets + +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = os.getenv('DCCSI_GDEBUG', False) + +# global space developer mode flag +_DCCSI_DEV_MODE = os.getenv('DCCSI_DEV_MODE', False) + +_MODULE_PATH = Path(__file__) + +_ORG_TAG = 'Amazon_Lumberyard' +_APP_TAG = 'DCCsi' +_TOOL_TAG = 'azpy.shared.ui.help_menu' +_TYPE_TAG = 'test' + +_MODULENAME = __name__ +if _MODULENAME is '__main__': + _MODULENAME = _TOOL_TAG + +_LOGGER = logging.getLogger(_MODULENAME) +_LOGGER.debug('Something invoked :: {0}.'.format({_MODULENAME})) + +# TODO: implement this +# checks the run configuration to determine if we are running in maya +_G_MAYA = False +try: + from azpy.config.maya import _G_MAYA + if _G_MAYA: + import maya.cmds as mc +except: + pass +# ------------------------------------------------------------------------- + + +class HelpMenu(): + """ + Setup a standard Help item in the menubar for PySide2 GUIs + + INPUTS: + main_window = the class instance of the QMainWindow + tool_label = the menu label for the tool's help item + tool_help_page = the http:// path to the specific bpTool help page + + Here's an example + # self.help_menu = azpy.shared.ui.help_menu.setup(self, 'Help...', 'https://some.site.com/azpy') + + """ + + # ---------------------------------------------------------------------- + def __init__(self, main_window, tool_label, tool_help_page): + """Constructor""" + + self.main_window = main_window + # store mainwindow menubar, we can attach the Help menu to this + self.menubar = self.main_window.menuBar() + self.tool_label = tool_label + self.tool_help_page = tool_help_page + + self.help_menu = QtWidgets.QMenu(self.menubar) + self.help_menu.setObjectName("help_menu") + self.help_menu.setTitle("Help") + + self.generic_tool_help_setup() + self.specific_tool_help_setup() + self.tool_bug_report_setup() + + # ---------------------------------------------------------------------- + + def specific_tool_help_setup(self): + """""" + self.tool_action_help = QtWidgets.QAction(self.main_window) + self.tool_action_help.setObjectName("tool_action_help") + self.help_menu.addAction(self.tool_action_help) + self.menubar.addAction(self.help_menu.menuAction()) + self.tool_action_help.setText(self.tool_label) + self.main_window.connect(self.tool_action_help, QtCore.SIGNAL("triggered()"), self.tool_help_display) + + # ---------------------------------------------------------------------- + def generic_tool_help_setup(self): + """""" + self.azpy_tool_action_help = QtWidgets.QAction(self.main_window) + self.azpy_tool_action_help.setObjectName("azpy_tool_action_help") + self.help_menu.addAction(self.azpy_tool_action_help) + self.menubar.addAction(self.help_menu.menuAction()) + self.azpy_tool_action_help.setText("DCCsi help...") + self.main_window.connect(self.azpy_tool_action_help, QtCore.SIGNAL("triggered()"), self.azpy_tool_help_display) + + # ---------------------------------------------------------------------- + def tool_bug_report_setup(self): + """""" + self.tool_action_bug_report = QtWidgets.QAction(self.main_window) + self.tool_action_bug_report.setObjectName("tool_action_bug_report") + self.help_menu.addAction(self.tool_action_bug_report) + self.menubar.addAction(self.help_menu.menuAction()) + self.tool_action_bug_report.setText("Report a Tool Bug...") + self.main_window.connect(self.tool_action_bug_report, QtCore.SIGNAL("triggered()"), self.bug_report_display) + + # ---------------------------------------------------------------------- + + def tool_help_display(self): + """""" + if _G_MAYA: + mc.showHelp(self.tool_help_page, absolute=True) + else: + _LOGGER.debug('This command, {0}: currently only works when running in Maya.'.format('tool_help_display')) + pass + + # ---------------------------------------------------------------------- + def azpy_tool_help_display(self): + """""" + if _G_MAYA: + mc.showHelp('https://some.site.com/azpy/maya_tools/', absolute=True) + else: + _LOGGER.debug('This command, {0}: currently only works when running in Maya.'.format('azpy_tool_help_display')) + pass + + # ---------------------------------------------------------------------- + def bug_report_display(self): + """""" + if _G_MAYA: + mc.showHelp('https://some.site.com/azpy/report_bug', absolute=True) + else: + _LOGGER.debug('This command, {0}: currently only works when running in Maya.'.format('bug_report_display')) + pass +# ------------------------------------------------------------------------- + + +class TestMainWindow(QtWidgets.QMainWindow): + def __init__(self, parent=None): + super().__init__(parent) + self.setup_ui() + + def setup_ui(self): + self.setWindowTitle('PySide2-HelpMenu-Test') + + # Setup Help Menu + self.help_menu = HelpMenu(self, 'PySide2-Test Help...', 'http://dccSI.com/NewTool') + + # main widget + self.main_widget = QtWidgets.QWidget(self) + self.setCentralWidget(self.main_widget) + + # layout initialize + self.global_layout = QtWidgets.QVBoxLayout() + self.main_widget.setLayout(self.global_layout) + + # Add Widgets + self.spinbox = QtWidgets.QSpinBox() + self.spinbox.setValue(30) + layout = QtWidgets.QFormLayout() + layout.addRow('Parameter', self.spinbox) + self.button = QtWidgets.QPushButton('Execute') + + # global layout setting + self.global_layout.addLayout(layout) + self.global_layout.addWidget(self.button) + # ---------------------------------------------------------------------- + + def closeEvent(self, event): + """Event which is run when window closes""" + + _LOGGER.debug("Exiting: {0}".format(_TOOL_TAG)) + # ---------------------------------------------------------------------- +# ------------------------------------------------------------------------- + + +if __name__ == '__main__': + """Run this file as main""" + import sys + + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_TOOL_TAG)) + _LOGGER.debug("Starting App: {0} ...".format(_TOOL_TAG)) + app = QtWidgets.QApplication(sys.argv) + mainWin = TestMainWindow() + mainWin.show() + + del _LOGGER + sys.exit(app.exec_()) + + + + + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/pyside2_qtextedit_stdout.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/pyside2_qtextedit_stdout.py new file mode 100644 index 0000000000..a8c55ea39a --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/pyside2_qtextedit_stdout.py @@ -0,0 +1,173 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- +from __future__ import unicode_literals +# from builtins import str + +# built in's +import sys +import os +import uuid + +# azpy +from azpy import initialize_logger +from azpy.shared.ui.base_widget import BaseQwidgetAzpy + +# 3rd Party +from unipath import Path +import PySide2.QtCore as QtCore +import PySide2.QtWidgets as QtWidgets + +from PySide2.QtCore import QProcess, Signal, Slot, QTextCodec +from PySide2.QtGui import QTextCursor +from PySide2.QtWidgets import QPlainTextEdit +from PySide2.QtCore import QTimer + +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = os.getenv('DCCSI_GDEBUG', False) + +# global space debug flag +_DCCSI_DEV_MODE = os.getenv('DCCSI_DEV_MODE', False) + +_MODULE_PATH = Path(__file__) + +_ORG_TAG = 'Amazon_Lumberyard' +_APP_TAG = 'DCCsi' +_TOOL_TAG = 'azpy.shared.ui.pyside2_qtextedit_stdout' +_TYPE_TAG = 'test' + +_MODULENAME = __name__ +if _MODULENAME is '__main__': + _MODULENAME = _TOOL_TAG + +if _G_DEBUG: + _LOGGER = initialize_logger(_MODULENAME, log_to_file=True) + _LOGGER.debug('Something invoked :: {0}.'.format({_MODULENAME})) +else: + _LOGGER = initialize_logger(_MODULENAME) +# ------------------------------------------------------------------------- + + +class ProcessOutputReader(QProcess): + produce_output = Signal(str) + + def __init__(self, parent=None): + super().__init__(parent=parent) + + # merge stderr channel into stdout channel + self.setProcessChannelMode(QProcess.MergedChannels) + # prepare decoding process' output to Unicode + self._codec = QTextCodec.codecForLocale() + self._decoder_stdout = self._codec.makeDecoder() + # only necessary when stderr channel isn't merged into stdout: + # self._decoder_stderr = codec.makeDecoder() + + self.readyReadStandardOutput.connect(self._ready_read_standard_output) + # only necessary when stderr channel isn't merged into stdout: + # self.readyReadStandardError.connect(self._ready_read_standard_error) + + @Slot() + def _ready_read_standard_output(self): + raw_bytes = self.readAllStandardOutput() + text = self._decoder_stdout.toUnicode(raw_bytes) + self.produce_output.emit(text) + + # only necessary when stderr channel isn't merged into stdout: + # @Slot() + # def _ready_read_standard_error(self): + # raw_bytes = self.readAllStandardError() + # text = self._decoder_stderr.toUnicode(raw_bytes) + # self.produce_output.emit(text) +# -------------------------------------------------------------------------- + + +class MyConsole(BaseQwidgetAzpy, QPlainTextEdit): + + def __init__(self, parent=None): + super().__init__(parent=parent) + + # Set a unique object name string so Maya can easily look it up + self.setObjectName('{0}_{1}'.format(self.__class__.__name__, + uuid.uuid4())) + + self.setReadOnly(True) + self.setMaximumBlockCount(10000) # limit console to 10000 lines + + self._cursor_output = self.textCursor() + + @Slot(str) + def append_output(self, text): + self._cursor_output.insertText(text) + self.scroll_to_last_line() + + def scroll_to_last_line(self): + cursor = self.textCursor() + cursor.movePosition(QTextCursor.End) + cursor.movePosition(QTextCursor.Up if cursor.atBlockStart() else + QTextCursor.StartOfLine) + self.setTextCursor(cursor) + + def output_text(self, text): + self._cursor_output.insertText(text) + self.scroll_to_last_line() +# -------------------------------------------------------------------------- + + +if __name__ == '__main__': + """Run this file as main""" + import sys + + _ORG_TAG = 'Amazon_Lumberyard' + _APP_TAG = 'DCCsi' + _TOOL_TAG = 'azpy.shared.ui.pyside2_qtextedit_stdout' + _TYPE_TAG = 'test' + + if _G_DEBUG: + _LOGGER = initialize_logger('{0}-TEST'.format(_TOOL_TAG), log_to_file=True) + _LOGGER.debug('Something invoked :: {0}.'.format({_MODULENAME})) + + _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_TOOL_TAG)) + _LOGGER.debug("Starting App:{0} TEST ...".format(_TOOL_TAG)) + +# # create the application instance +# _APP = QtWidgets.QApplication(sys.argv) +# _APP.setOrganizationName(_ORG_TAG) +# _APP.setApplicationName('{app}:{tool}'.format(app=_APP_TAG, tool=_TOOL_TAG)) + + # create a console and connect the process output reader to it + _CONSOLE = MyConsole() + + # create a process output reader + _READER = ProcessOutputReader(parent=_CONSOLE) + _READER.produce_output.connect(_CONSOLE.append_output) + + # start something and log (including to console) + # this starts a test app + _TEST_PY_FILE = Path(_MODULE_PATH.parent, 'pyside2_ui_utils.py') + _READER.start('python', ['-u', _TEST_PY_FILE]) # start the process + + # after that starts, this will show the console + # LY_QSS = Path(_MODULE_PATH.parent, 'resources', 'stylesheets', 'LYstyle.qss') + _DARK_STYLE = Path(_MODULE_PATH.parent, 'resources', 'qdarkstyle', 'style.qss') + _CONSOLE.qapp.setStyleSheet(_DARK_STYLE.read_file()) + _CONSOLE.show() # make the console visible + + _LOGGER.debug(_CONSOLE.objectName()) + + _TIMER = QTimer() + _TIMER.timeout.connect(lambda: None) + _TIMER.start(100) + + del _LOGGER + sys.exit(_CONSOLE.qapp.exec_()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/pyside2_ui_utils.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/pyside2_ui_utils.py new file mode 100644 index 0000000000..395f7ada2e --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/pyside2_ui_utils.py @@ -0,0 +1,189 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- +# +from __future__ import unicode_literals +# from builtins import str + +# built in's +import os +import site +import uuid +import logging as _logging +import xml.etree.ElementTree as xml # Qt .ui files are xml +from io import StringIO # for handling unicode strings + +# azpy extensions +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +# ^ this is effectively an import and retreive of \config.py +# and init's access to Qt/Pyside2 +# init lumberyard Qy/PySide2 access + +# now default settings are extended with PySide2 +# this is an alternative to "from dynaconf import settings" with Qt +settings = _config.get_config_settings(setup_ly_pyside=True) + +# 3rd Party (we may or do provide) +from unipath import Path + +# now we can import lumberyards PySide2 +import PySide2.QtCore as QtCore +import PySide2.QtWidgets as QtWidgets +import PySide2.QtGui as QtGui +from PySide2.QtWidgets import QApplication, QSizePolicy +import PySide2.QtUiTools as QtUiTools + +# special case for import pyside2uic +site.addsitedir(settings.DCCSI_PYSIDE2_TOOLS) +import pyside2uic + +# azpy +import azpy.shared.ui.qt_settings as qt_settings +import azpy.shared.ui.help_menu as help_menu + +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = settings.DCCSI_GDEBUG + +# global space debug flag +_DCCSI_DEV_MODE = settings.DCCSI_DEV_MODE + +_MODULE_PATH = Path(__file__) + +_ORG_TAG = 'Amazon_Lumberyard' +_APP_TAG = 'DCCsi' +_TOOL_TAG = 'azpy.shared.ui.pyside2_ui_utils' +_TYPE_TAG = 'test' + +_MODULENAME = _TOOL_TAG +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Something invoked :: {0}.'.format(_MODULENAME)) + +_UI_FILE = Path(_MODULE_PATH.parent, 'resources', 'example.ui') +# ------------------------------------------------------------------------- + + +class UiLoader(QtUiTools.QUiLoader): + def __init__(self, base_instance): + super(UiLoader, self).__init__(base_instance) + self._base_instance = base_instance + + def createWidget(self, classname, parent=None, name=""): + widget = super(UiLoader, self).createWidget( + classname, parent, name) + + if parent is None: + return self._base_instance + else: + setattr(self._base_instance, name, widget) + return widget +# ------------------------------------------------------------------------- + + +class UiWidget(QtWidgets.QWidget): + def __init__(self, ui_file=_UI_FILE, parent=None): + super().__init__(parent) + loader = UiLoader(parent) + file = QFile(ui_file) + file.open(QFile.ReadOnly) + loader.load(file, self) + file.close() +# ------------------------------------------------------------------------- + + +def from_ui_generate_form_and_base_class(filename, return_output=False): + """Parse a Qt Designer .ui file and return Pyside2 Form and Base Class + Usage: + import azpy.shared.ui as azpyui + form_class, base_class = azpyui.from_ui_generate_form_and_class(r'C:\my\filepath\tool.ui') + """ + ui_file = Path(filename) + output = '' + parsed_xml = None + try: + ui_file.exists() + except FileNotFoundError as error: + output += 'File does not exist: {0}/r'.format(error) + if _G_DEBUG: + print(error) + if return_output: + return False, output + else: + return False + + try: + ui_file.ext == 'ui' + except IOError as error: + output += 'Not a Qt Designer .ui file: {0}/r'.format(error) + if return_output: + return False, output + else: + return False + + parsed_xml = xml.parse(ui_file) + form_class = parsed_xml.find('class').text + widget_class = parsed_xml.find('widget').get('class') + + with open(ui_file, 'r') as ui_file: + stream = StringIO() # create a file io stream + frame = {} + + _uic_compiler_path = Path(settings.DCCSI_PYSIDE2_TOOLS) + site.addsitedir(_uic_compiler_path) + + import pyside2uic + + # compile the .ui file as a .pyc represented in steam + pyside2uic.compileUi(ui_file, stream, indent=4) + # compile the .pyc bytecode from stream + pyc = compile(stream.getvalue(), '', 'exec') + # execute the .pyc bytecode + exec (pyc, frame) + + # Retreive the form_class and base_class based on type in designer .ui (xml) + form_class = frame['Ui_{0}'.format(form_class)] + base_class = eval('QtWidgets.{0}'.format(widget_class)) + + ui_file.close() + + if return_output: + return form_class, base_class, output + else: + return form_class, base_class +# ------------------------------------------------------------------------- + + +if __name__ == '__main__': + """Run this file as main""" + import sys + + _LOGGER = azpy.initialize_logger('{0}-TEST'.format(_TOOL_TAG), log_to_file=True) + _LOGGER.debug('Something invoked :: {0}.'.format({_MODULENAME})) + + _LOGGER.info("{0} :: if __name__ == '__main__':".format(_TOOL_TAG)) + _LOGGER.info("Starting App:{0} TEST ...".format(_TOOL_TAG)) + + _FORM_CLASS, _BASE_CLASS = from_ui_generate_form_and_base_class(_UI_FILE) + + _LOGGER.info(_FORM_CLASS) + _LOGGER.info(_BASE_CLASS) + + from azpy.shared.ui.templates import TemplateMainWindow + + _MAIN_WINDOW = TemplateMainWindow(logger=_LOGGER) + _MAIN_WINDOW.show() + + del _LOGGER + sys.exit(_MAIN_WINDOW.qapp.exec_()) +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/qt_settings.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/qt_settings.py new file mode 100644 index 0000000000..7702441c09 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/qt_settings.py @@ -0,0 +1,84 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +"""qt_settings.py: Manages a QSettings for a tool""" + +# built in's +import os +import logging as _logging + +# 3rd Party (we may provide) +from unipath import Path +from dynaconf import settings + +# azpy extensions +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +# ^ this is effectively an import and retreive of \config.py +# init lumberyard Qy/PySide2 access +_config.init_ly_pyside(settings.LY_DEV) + +# now we can import lumberyards PySide2 +import PySide2.QtCore as QtCore +import PySide2.QtWidgets as QtWidgets + +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = settings.DCCSI_GDEBUG + +# global space debug flag +_DCCSI_DEV_MODE = settings.DCCSI_DEV_MODE + +_MODULE_PATH = Path(__file__) + +_ORG_TAG = 'Amazon_Lumberyard' +_APP_TAG = 'DCCsi' +_TOOL_TAG = 'azpy.shared.ui.qt_settings' +_TYPE_TAG = 'test' + +_MODULENAME = _TOOL_TAG +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Something invoked :: {0}.'.format(_MODULENAME)) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def createSettings(org='Amazon_Lumberyard', app='DCCsi', + tool='azpy', type='default'): + """Sets up a settings .ini + + Returns a QSettings instance""" + + settings_folder = '{org}//{app}'.format(org=org, app=app) + settings_name = '{tool}-{type}'.format(tool=tool, type=type) + + settings = QtCore.QSettings(QtCore.QSettings.IniFormat, + QtCore.QSettings.UserScope, + settings_folder, settings_name) + + return settings +# ------------------------------------------------------------------------- + + +if __name__ == '__main__': + """Run this file as main""" + import sys + + app = QtWidgets.QApplication(sys.argv) + app.setOrganizationName(_ORG_TAG) + app.setApplicationName('{app}:{tool}'.format(app=_APP_TAG, tool=_TOOL_TAG)) + + test_esttings = createSettings(_ORG_TAG, _APP_TAG, _TOOL_TAG, _TYPE_TAG) + _LOGGER.info(test_esttings) + _LOGGER.info(test_esttings.fileName()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/templates.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/templates.py new file mode 100644 index 0000000000..4a5eda6b06 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/templates.py @@ -0,0 +1,680 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# ------------------------------------------------------------------------- + +from __future__ import unicode_literals +# from builtins import str + +# built in's +import os +import sys +import logging as _logging +import uuid +import xml.etree.ElementTree as xml # Qt .ui files are xml +from io import StringIO # for handling unicode strings + +# 3rd Party (we may or do provide) +from unipath import Path + +# azpy extensions +import azpy.config_utils +_config = azpy.config_utils.get_dccsi_config() +# ^ this is effectively an import and retreive of \config.py +# and init's access to Qt/Pyside2 +# init lumberyard Qy/PySide2 access + +# now default settings are extended with PySide2 +# this is an alternative to "from dynaconf import settings" with Qt +settings = _config.get_config_settings(setup_ly_pyside=True) + +# now we can import lumberyards PySide2 +import azpy.shared.ui.qt_settings as qt_settings +import azpy.shared.ui.help_menu as help_menu +import azpy.shared.ui.pyside2_ui_utils as ui_utils + +import pyside2uic +import PySide2.QtCore as QtCore +import PySide2.QtWidgets as QtWidgets +import PySide2.QtGui as QtGui +import PySide2.QtUiTools as QtUiTools + +# ------------------------------------------------------------------------- +# global space debug flag +_G_DEBUG = settings.DCCSI_GDEBUG + +# global space debug flag +_DCCSI_DEV_MODE = settings.DCCSI_DEV_MODE + +_MODULE_PATH = Path(__file__) + +_MODULENAME = 'azpy.shared.ui.teamplates' +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Something invoked :: {0}.'.format(_MODULENAME)) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# example .ui used as default (for tests, etc.) +_UI_FILE = Path(_MODULE_PATH.parent, 'resources', 'example.ui') +# Hmmm.... should be a better way to handle this? +_FORM_CLASS, _BASE_CLASS = ui_utils.from_ui_generate_form_and_base_class(_UI_FILE) +# looks like either we aren't compiling it or it's not provided in the current +# version of Qt we use (check mack Qt5.15) +# https://doc-snapshots.qt.io/qtforpython-5.15/PySide2/QtUiTools/ls.loadUiType.html) +#_FORM_CLASS, _BASE_CLASS = QtUiTools.loadUiType(_UI_FILE) +# print(QtUiTools.QUiLoader) <-- this one works differently but maybe that pattern is better? + +# default dark styling for standalone apps +_DARK_STYLE = Path(_MODULE_PATH.parent, 'resources', 'qdarkstyle', 'style.qss') +# ^ lumberyard style doesn't work for all widgets, so this can be direcly applied +# to sidgets that look funny, they won't be a perfect match but also won't look odd +# To Do: make optional and/or force only when standalone +# adopt the Qt app style by default (use lumberyards style when it's the parent) +# include a standlaone lumberyard-like styling also +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# https://doc.qt.io/qt-5/designer-using-a-ui-file-python.html +# pattern #1 + +# pyside2-uic.exe form.ui > form.py +# results might be something like this: + +#from ui_form import Ui_Form +# class UicWidget(QtWidgets.QWidget): + #def __init__(self, parent=None): + #super(Window, self).__init__(parent) + #self.m_ui = Ui_Form() + #self.m_ui.setupUi(self) + +# pattern #2 +# that could also be represented like? + +# class SomeWidget(Ui_Form, QtWidgets.QWidget): + #def __init__(self, parent=None): + #super(Window, self).__init__(parent) + # self.setupUi(self) + +# pattern 3, use QUiLoader +# you need to know the main widget class (QtWidgets.QWidget), load .ui form within class +#from PySide2.QtUiTools import QUiLoader +#from PySide2 import QtWidgets +#from PySide2.QtCore import QFile + +#class MyForm(QtWidgets.QWidget): + #def __init__(self, parent=None): + #QtWidgets.QWidget.__init__(self, parent) + + ## read/load my .ui file + #file = QFile("form.ui") + #file.open(QFile.ReadOnly) + #self.loader = QUiLoader() + #self.my_widget = self.loader.load(file, self) + #file.close() + + ## setup my own layout + #layout = QtWidgets.QVBoxLayout() + #layout.addWidget(self.my_widget) + #self.setLayout(layout) + +#if __name__ == '__main__': + #app = QtWidgets.QApplication(sys.argv) + #myapp = MyForm() + #myapp.show() + #sys.exit(app.exec_()) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# pattern 4 (I like this) +#_UI_FILE = Path(_MODULE_PATH.parent, 'resources', 'example.ui') +#_FORM_CLASS, _BASE_CLASS = ui_utils.from_ui_generate_form_and_base_class(_UI_FILE) + +# here is basically what that returns ... +#parsed_xml = xml.parse(ui_file) +# form_class = parsed_xml.find('class').text # --> +# widget_class = parsed_xml.find('widget').get('class') # --> + +#class MyToolWidget(TemplateToolWidget): + #def __init__(self, parent, *args, **kwargs): + #super().__init__(parent, *args, **kwargs) + +#my_tool = MyToolWidget() + + +class TemplateToolWidget(_FORM_CLASS, _BASE_CLASS): + def __init__(self, parent, logger=None, *args, **kwargs): + '''A custom tool window with a demo set of template ui functionality''' + + super().__init__(parent, *args, **kwargs) + + self._logger = logger + if not self._logger: + try: + self._logger = self.parent().logger + except: + self._logger = azpy.initialize_logger(self.objectName()) + + self.logger.debug("Method: {0}.{1}".format(__class__, '__init__')) + + # lets hope the parent is a mainwindow? + self.mainwindow = parent + + self._project_directory = Path('C:\Lumberyard', 'Dev', 'Gems', + 'DccScriptingInterface', 'MockProject') + + # uic adds a function to our class called setupUi, + # calling this creates all the widgets from the .ui file + self.setupUi(self) + + # this one is local to this class + self.setup_ui() + + # Connect the interface controls + self.connect_interface() + # ---------------------------------------------------------------------- + + # -- properties -------------------------------------------------------- + @property + def logger(self): + return self._logger + + @logger.setter + def logger(self, logger): + self._logger = logger + return self._logger + + @logger.getter + def logger(self): + return self._logger + # ---------------------------------------------------------------------- + + def setup_ui(self): + """TODO: Doc String""" + # override this method to inject your own ui widgets amd layout + + self.logger.debug("Method: {0}.{1}".format(__class__, 'setup_ui')) + + self.helpMenu = help_menu.HelpMenu(self.mainwindow, 'TemplateToolTool Help...', 'http://dccSI.com/NewTool') + + _DARK_STYLE = Path(_MODULE_PATH.parent, 'resources', 'qdarkstyle', 'style.qss') + + try: + self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + except Exception as e: + self.logger.warning('warning! : {}'.format(e)) + + # override some of widgets to a better dark style + self.WatchdogList_treeView.setStyleSheet(_DARK_STYLE.read_file()) + self.WatchdogList_treeView.setMinimumHeight(250) + self.output_console_textEdit.setStyleSheet(_DARK_STYLE.read_file()) + self.output_console_textEdit.setMinimumHeight(250) + pass + # ---------------------------------------------------------------------- + + def set_defaults(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'set_defaults')) + pass + # ---------------------------------------------------------------------- + + def connect_interface(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'connect_interface')) + # Connect widgets to methods + # QtCore.QObject.connect(self.renameButton, QtCore.SIGNAL("clicked()"), self.NewCommand) + pass + # ---------------------------------------------------------------------- + + def new_command(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'new_command')) + pass + # ---------------------------------------------------------------------- +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +class TemplateMainWindow(QtWidgets.QMainWindow): + """TODO""" + + _ORG_TAG = 'Amazon_Lumberyard' + _APP_TAG = 'DCCsi' + + def __init__(self, + parent=None, + logger=None, + app=None, + custom_tool_widget=None, + window_title='TemplateToolWidget', + app_icon="icon.png", + *args, **kwargs): + """TODO""" + + # secret demo + demo = kwargs.pop('demo', False) + + self._logger = logger + self._qapp = None + self._name_uuid = '{0}_{1}'.format(self.__class__.__name__, uuid.uuid4()) + + if not self._logger: + self._logger = azpy.initialize_logger(self._name_uuid) + # self._logger = initialize_logger() + + self._qapp = app or QtWidgets.QApplication.instance() + if self._qapp is not None: + pass + else: + # self.logger.debug('No QApplication has been instantiated') + self._qapp = self._make_standalone_app(window_title) + + super(TemplateMainWindow, self).__init__(parent=parent, *args, **kwargs) + + # camel case because this is a Qt|Pyside2 widget method + if self.objectName() == '': + # Set a unique object name string so Maya can easily look it up + self.setObjectName(self._name_uuid) + + self.window_title = window_title + if self.window_title == '': + self.window_title = self.objectName() + self.setWindowTitle(self.window_title) + + self._style_sheet = None + if not self._style_sheet: + self._style_sheet = Path(_MODULE_PATH.parent, 'resources', + 'stylesheets', 'LYstyle.qss') + self.setStyleSheet(self._style_sheet.read_file()) + + self.app_icon = app_icon + + self._custom_widget = custom_tool_widget + if self._custom_widget: + self._custom_widget.parent(self) + + self.setup_ui() + if demo: + custom_tool_widget = TemplateToolWidget(self) + + self.add_custom_widget(custom_tool_widget) + + # Setup the settings .ini + _TYPE_TAG = 'TEMPLATE' + self.settings = qt_settings.createSettings(TemplateMainWindow._ORG_TAG, + TemplateMainWindow._APP_TAG, + self.window_title, _TYPE_TAG) + + # Read the saved settings + self.read_settings() + # --------------------------------------------------------------------- + + def _make_standalone_app(self, name): + useGUI = not '-no-gui' in sys.argv + self.qapp = QtWidgets.QApplication(sys.argv) if useGUI else QtWidgets.QCoreApplication(sys.argv) + self.qapp.setOrganizationName(TemplateMainWindow._ORG_TAG) + self.qapp.setApplicationName('{app}:{tool}'.format(app=TemplateMainWindow._APP_TAG, + tool=name)) + return self.qapp + # ---------------------------------------------------------------------- + + # -- properties -------------------------------------------------------- + @property + def logger(self): + return self._logger + + @logger.setter + def logger(self, logger): + self._logger = logger + return self._logger + + @logger.getter + def logger(self): + return self._logger + + @property + def custom_widget(self): + return self._lcustom_widget + + @custom_widget.setter + def custom_widget(self, custom_widget): + self._custom_widget = custom_widget + return self._custom_widget + + @custom_widget.getter + def custom_widget(self): + return self._custom_widget + + @property + def qapp(self): + return self._qapp + + @qapp.setter + def qapp(self, qapp): + self._qapp = qapp + return self._qapp + + @qapp.getter + def qapp(self): + return self._qapp + + @property + def app_icon(self): + return self._app_icon + + @app_icon.setter + def app_icon(self, icon): + self._app_icon = QtGui.QIcon(icon) + self.setWindowIcon(self._app_icon) + return self._app_icon + + @app_icon.getter + def app_icon(self): + return self._app_icon + + def setIcon(self, icon): + self.app_icon = icon + # ---------------------------------------------------------------------- + + def setup_ui(self, *args, **kwargs): + # self.toolbar = QtWidgets.QToolBar() + # self.addToolBar(self.toolbar) + self.logger.debug("Method: {0}.{1}".format(__class__, 'setup_ui')) + self.setIcon = self.app_icon + + # Exit QAction on hotkey + exit_tag = "Exit" + exit_action = QtWidgets.QAction(exit_tag, self) + exit_action.setShortcut("Ctrl+Q") + exit_action.triggered.connect(self.close) + + # basic menubar File > Exit event + self.menu_bar = self.menuBar() # type: QMenuBar + file_menu = self.menu_bar.addMenu("File") # type: QMenu + file_menu.addAction(exit_tag, self.close) + + # main widget + self.central_widget = QtWidgets.QWidget(self) + self.setCentralWidget(self.central_widget) + + # layout initialize + self.global_layout = QtWidgets.QVBoxLayout(self.central_widget) + self.global_layout.setContentsMargins(8, 8, 8, 8) + self.central_widget.setLayout(self.global_layout) + + self.createStatusBar() + + # TODO: create a progress bar + # https://codeloop.org/how-to-create-progressbar-in-pyside2/amp/ + # ---------------------------------------------------------------------- + + def add_custom_widget(self, custom_tool_widget=None): + # Add our TemplateToolWidget + if custom_tool_widget: + self.custom_widget = custom_tool_widget + self.custom_widget.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + layout = QtWidgets.QFormLayout() + self.global_layout.addLayout(layout) + self.global_layout.addWidget(self.custom_widget) +# else: # demo test tool +# self.custom_widget = TemplateToolWidget(self) + # ---------------------------------------------------------------------- + + def createStatusBar(self): + self.logger.debug("Method: {0}.{1}".format(__class__, 'createStatusBar')) + self.myStatus = QtWidgets.QStatusBar() + self.myStatus.showMessage("{0}: Ready".format(self.window_title), 3000) + self.setStatusBar(self.myStatus) + # ---------------------------------------------------------------------- + + @QtCore.Slot() + def closeEvent(self, event=None, *args, **kwargs): + """Event which is run when window closes""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'closeEvent')) + + close = QtWidgets.QMessageBox() + result = close.question(self, + "Confirm Exit...", + "Are you sure you want to exit ?", + QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) + + if result == QtWidgets.QMessageBox.Yes: + if event: + event.accept() + self.logger.debug("Closing: {0}".format(self.objectName())) + self.write_settings() + self.qapp.instance().quit + self.qapp.exit() + else: + if event: + event.ignore() + # ---------------------------------------------------------------------- + + def write_settings(self): + """Writes out the windows settings""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'write_settings')) + # main window + # saves window size and position + self.settings.setValue("geometry", self.saveGeometry()) + # saves the state of window's toolbars and dockWidgets + self.settings.setValue("windowState", self.saveState()) + # widgets, save a setting to persist + # self.settings.setValue("textFilePath", self.textFileLineEdit.text()) + # ---------------------------------------------------------------------- + + def read_settings(self): + """Reads in the windows settings""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'read_settings')) + # main window + self.restoreGeometry(self.settings.value("geometry")) # restores window size and position + self.restoreState(self.settings.value("windowState")) # restores the state of window's toolbars and dockWidgets + # widgets, restore something from settings + # if self.settings.value("textFilePath"): + # textFile = self.qt_settings.value("textFilePath",).toString() + # self.textFileLineEdit.setText(textFile) + # ---------------------------------------------------------------------- +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +class TestToolWidget(TemplateToolWidget): + def __init__(self, parent, *args, **kwargs): + '''A custom window with a demo set of ui widgets''' + + super(TestToolWidget, self).__init__(parent=parent, *args, **kwargs) + + self.logger.debug("Method: {0}.{1}".format(__class__, '__init__')) + + # this one is local to this class + self.extend_ui() + + self._test_property = 'Property Not set' + self.logger.debug("self._test_property: {0}".format(self._test_property)) + + self.class_tests() + # ---------------------------------------------------------------------- + + # -- properties -------------------------------------------------------- + @property + def test_property(self): + return self._test_property + + @test_property.setter + def test_property(self, test_property): + self._test_property = test_property + return self._test_property + + @test_property.getter + def test_property(self): + return self._test_property + # ---------------------------------------------------------------------- + + def class_tests(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'class_tests')) + self.test_property = 'TEST PROPERTY' + self.logger.debug("self._test_property: {0}".format(self.test_property)) + return + # ---------------------------------------------------------------------- + + def setup_ui(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'setup_ui')) + return + + def extend_ui(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'extend_ui')) + + # this would be local to this class, runs outside _init__ + # + # self.setup_ui() + + # Connect the interface controls + # self.connect_interface() + + self._watchdog_list = QtGui.QStandardItemModel(parent=self) + + self._project_directory = Path('C:\Lumberyard', 'Dev', 'Gems', + 'DccScriptingInterface', 'MockProject') + + # we want 2 columns + self._watchdog_list.setColumnCount(2) + + # set up a temp watch dog folder watch list (as a model) + self._watchdog_list.setHorizontalHeaderLabels(['Path', 'State']) + + _DARK_STYLE = Path(_MODULE_PATH.parent, 'resources', 'qdarkstyle', 'style.qss') + + # override some of widgets to a better dark style + self.WatchdogList_treeView.setStyleSheet(_DARK_STYLE.read_file()) + self.WatchdogList_treeView.setMinimumHeight(250) + self.WatchdogList_treeView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) + self.WatchdogList_treeView.setModel(self._watchdog_list) + self.WatchdogList_treeView.setUniformRowHeights(True) + + # populate treeView data + parent_item = self._watchdog_list.invisibleRootItem() + first_row = QtGui.QStandardItem(self._project_directory) + self._watchdog_list.appendRow(first_row) + # span container columns + self.WatchdogList_treeView.setFirstColumnSpanned(0, self.WatchdogList_treeView.rootIndex(), True) + + TemplateMainWindow = QtGui.QStandardItem('\\Assets\\some\\path') + self._watchdog_list.appendRow(TemplateMainWindow) + first_row_state = QtGui.QStandardItem('{0}'.format('Active')) + # TemplateMainWindow.appendRow(first_row_state) + + second_row = QtGui.QStandardItem('\\Assets\\another\\path') + self._watchdog_list.appendRow(second_row) + second_row_state = QtGui.QStandardItem('{0}'.format('Active')) + # second_row.appendRow(second_row_state) + + first_row.appendRow([TemplateMainWindow, second_row]) + # span container columns + self.WatchdogList_treeView.setFirstColumnSpanned(0, self.WatchdogList_treeView.rootIndex(), True) + + self.output_console_textEdit.setStyleSheet(_DARK_STYLE.read_file()) + self.output_console_textEdit.setMinimumHeight(250) + + # TODO: create a progress bar + # https://codeloop.org/how-to-create-progressbar-in-pyside2/amp/ + pass + # ---------------------------------------------------------------------- + + def set_defaults(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'extend_ui')) + pass + # ---------------------------------------------------------------------- + + def connect_interface(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'connect_interface')) + # Connect widgets to methods + # QtCore.QObject.connect(self.renameButton, QtCore.SIGNAL("clicked()"), self.NewCommand) + pass + # ---------------------------------------------------------------------- + + def new_command(self): + """TODO: Doc String""" + self.logger.debug("Method: {0}.{1}".format(__class__, 'new_command')) + pass + # ---------------------------------------------------------------------- +# -------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + import sys + + _TEST_APP_NAME = '{0}-{1}'.format(_MODULENAME, 'TEST') + + _LOGGER = azpy.initialize_logger(_TEST_APP_NAME, + log_to_file=True, + default_log_level=_logging.DEBUG) + + from azpy.constants import STR_CROSSBAR + _LOGGER.info(STR_CROSSBAR) + _LOGGER.info("{0} :: if __name__ == '__main__':".format(_MODULENAME)) + _LOGGER.info(STR_CROSSBAR) + + # test from_ui_generate_form_and_base_class + _FORM_CLASS, _BASE_CLASS = ui_utils.from_ui_generate_form_and_base_class(_UI_FILE) + + _LOGGER.info(_FORM_CLASS) + _LOGGER.info(_BASE_CLASS) + + _LOGGER.info("Starting App: {0} ...".format(_TEST_APP_NAME)) + +while 0: + # Test 1, MainWindow with no widget (just the frame) + _MAINWINDOW = TemplateMainWindow(logger=_LOGGER) + _LOGGER.info(_MAINWINDOW.objectName()) + _LOGGER.info(_MAINWINDOW.settings) + _LOGGER.info(_MAINWINDOW.settings.fileName()) + _MAINWINDOW.setWindowTitle(_TEST_APP_NAME) + _MAINWINDOW.show() + break + +while 0: + # test 2, demo forces a template widget to be created internally + _MAINWINDOW = TemplateMainWindow(logger=_LOGGER, + demo=True) #<-- template demo + _LOGGER.info(_MAINWINDOW.objectName()) + _LOGGER.info(_MAINWINDOW.settings) + _LOGGER.info(_MAINWINDOW.settings.fileName()) + _MAINWINDOW.setWindowTitle(_TEST_APP_NAME) + _MAINWINDOW.show() + break + +while 1: + # test 3, add a custom tool widget + _MAINWINDOW = TemplateMainWindow(logger=_LOGGER) + _CUSTOM_WIDGET = TemplateToolWidget(parent=_MAINWINDOW) + _MAINWINDOW.add_custom_widget(_CUSTOM_WIDGET) + _LOGGER.info(_MAINWINDOW.objectName()) + _LOGGER.info(_MAINWINDOW.settings) + _LOGGER.info(_MAINWINDOW.settings.fileName()) + _MAINWINDOW.setWindowTitle(_TEST_APP_NAME) + _MAINWINDOW.show() + _MAINWINDOW.close() # test the close function + break + +del _LOGGER +sys.exit(_MAINWINDOW.qapp.exec_()) + + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py index caac85767b..2c4b883c51 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/synthetic_env.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/synthetic_env.py new file mode 100644 index 0000000000..6186026852 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/synthetic_env.py @@ -0,0 +1,736 @@ +# coding:utf-8 +#!/usr/bin/python +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# -- This line is 75 characters ------------------------------------------- +from __future__ import unicode_literals + +""" +Module Description: + DccScriptingInterface\\azpy\\shared\\synthetic_env.py + +Stands up a synthetic version of the environment in: + DccScriptingInterface\\Launchers\\windows\\Env.bat + +DccScriptingInterface a.k.a. DCCsi + +This module (softly) assumes that the cwd is the DCCsi +AND that you can get access to imports from azpy + +The configures a synthetic version of the default DCCsi env, +which includes additional code access paths and some other settings. + +It does not assume that the external environment is configured. +It provides best guess defaults for the environment (when they are not set.) +It will not overwrite the envars that are configured. + +To do this, it uses the pattern: + _SOME_ENVAR = os.getenv('ENVAR_TAG', ) + +The environment is conveniently packed into a dictionary, +this allows the dictionar to be imported into another module, +the import will resolve and standup the synthetic environment. + +Configures several useful environment config settings and paths, + [key] : [value] + + # this is the required base environment + LY_PROJECT : name of project (project directory) + LY_DEV : path to Lumberyard \dev root + LY_PROJECT_PATH : path to project dir + DCCSIG_PATH : path to the DCCsi Gem root + DCCSI_AZPY_PATH * : path to azpy Python API (code) + DCCSI_SDK_PATH : path to associated (non-api code) DCC SDK + + # nice to haves in base env to define core support + DCCSI_GDEBUG : sets global debug prints + DCCSI_DEV_MODE : extends support like early debugger attachment + DCCSI_GDEBUGGER : default debugger (WING) + + DCCsi has been (experimentally) tested with : PY27, PY37 + - py27 for DCC tools like Maya + - py37 for Lumberyard + - it probably will work with 3.6 (substance) + + :: Default version py37 has a launcher + (activates the env, starts py interpreter) + set DCCSI_PY_BASE=%DCCSI_PYTHON_INSTALL%\python.exe + + :: shared location for 64bit python 3.7 BASE location + set DCCSI_PY_DCCSI=%DCCSI_LAUNCHERS_PATH%\Launch_pyBASE.bat + + :: Override DCCSI_PY_DCCSI to set a defualt version for the DCCsi + + :: ide and debugger plugs + :: for instance with WingIDE this defines using the default py interpreter + ${DCCSI_PY_DEFAULT} + + ::Other python runtimes can be defined, for py27 we use this + :: shared location for 64bit DCCSI_PY_MAYA python 2.7 DEV location + set DCCSI_PY_MAYA=%MAYA_LOCATION%\bin\mayapy.exe + :: wingIDE can use more then one defined/managed interpreters + :: allowing you to _G_DEBUG code in multiple runtimes in one session + ${DCCSI_PY_MAYA} + + # related to the WING as the default DCCSI_GDEBUGGER + DCCSI_WING_VERSION_MAJOR : the major version of Wing IDE (default IDE) + DCCSI_WING_VERSION_MINOR : minor version # + WINGHOME : path for wing (for debug) integration + + NOTES: + The default IDE and debugger is WING primarily because of author preference. + Other options are available to configure out-of-the-box (PyCharm) + """ +# ------------------------------------------------------------------------- +# built in's +import os +import sys +import site +import re +#import inspect +import json + +import logging as _logging +from collections import OrderedDict + +# Lumberyard and Atom standalone should be launched in py3.7+ +# because of use of pathlib (unless externally provided in py2.7) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +os.environ['PYTHONINSPECT'] = 'True' + +_MODULE_PATH = os.path.realpath(__file__) # To Do: what if frozen? +_DCCSIG_PATH = os.path.normpath(os.path.join(_MODULE_PATH, '../..')) +_DCCSIG_PATH = os.getenv('DCCSIG_PATH', _DCCSIG_PATH) +site.addsitedir(_DCCSIG_PATH) +print(_DCCSIG_PATH) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# Lumberyard extensions +from pathlib import Path + +# set up global space, logging etc. +import azpy +from azpy.env_bool import env_bool +from azpy.constants import ENVAR_DCCSI_GDEBUG +from azpy.constants import ENVAR_DCCSI_DEV_MODE + +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) + +_PACKAGENAME = 'DCCsi.azpy.sunthetic_env' + +_log_level = int(20) +if _G_DEBUG: + _log_level = int(10) +_LOGGER = azpy.initialize_logger(_PACKAGENAME, + log_to_file=True, + default_log_level=_log_level) + +_LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME})) +_LOGGER.debug('_DCCSIG_PATH: {}'.format(_DCCSIG_PATH)) +_LOGGER.debug('_G_DEBUG: {}'.format(_G_DEBUG)) +_LOGGER.debug('_DCCSI_DEV_MODE: {}'.format(_DCCSI_DEV_MODE)) + +if _DCCSI_DEV_MODE: + from azpy.test.entry_test import connect_wing + foo = connect_wing() + +# we can go ahead and just make sure the the DCCsi env is set +# config is SO generic this ensures we are importing a specific one +_spec_dccsi_config = importlib.util.spec_from_file_location("dccsi.config", + Path(_DCCSIG_PATH, + "config.py")) +_dccsi_config = importlib.util.module_from_spec(_spec_dccsi_config) +_spec_dccsi_config.loader.exec_module(_dccsi_config) + +settings = _dccsi_config.get_config_settings() +# ------------------------------------------------------------------------- + +# Lumberyard extensions +from azpy.constants import * +from azpy.shared.common.core_utils import walk_up_dir +from azpy.shared.common.core_utils import get_stub_check_path + +_DCCSI_PYTHON_LIB_PATH = os.getenv(ENVAR_DCCSI_PYTHON_LIB_PATH, + PATH_DCCSI_PYTHON_LIB_PATH) +_LOGGER.debug('Dccsi Lib Path: {0}'.format(_DCCSI_PYTHON_LIB_PATH)) + +if os.path.exists(_DCCSI_PYTHON_LIB_PATH): + site.addsitedir(_DCCSI_PYTHON_LIB_PATH) # add access + +# ------------------------------------------------------------------------- +# post-bootstrap global space +_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +_DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) +# ------------------------------------------------------------------------- + + +FRMT_LOG_LONG = ("[%(name)s][%(levelname)s] >> " + "%(message)s (%(asctime)s; %(filename)s:%(lineno)d)") +_PACKAGENAME = 'azpy.synthetic_env' + +_logging.basicConfig(level=_logging.INFO, + format=FRMT_LOG_LONG, + datefmt='%m-%d %H:%M') +_LOGGER = _logging.getLogger(_PACKAGENAME) + +_log_level = int(10) +console_handler = _logging.StreamHandler(sys.stdout) +console_handler.setLevel(_log_level) +formatter = _logging.Formatter(FRMT_LOG_LONG) +console_handler.setFormatter(formatter) +_LOGGER.addHandler(console_handler) +_LOGGER.setLevel(_log_level) + +_LOGGER.debug('Initializing: {0}.'.format({_PACKAGENAME})) + +# ------------------------------------------------------------------------- +# This module is semi-standalone (no azpy YET) to avoid circular imports +# To Do: figure out how to bets NOPT dup this methods (there are also moudles) +# we want to run this potentially with no preformed env +# and thus we may not have full acess to the DCCsi and azpy package +# ------------------------------------------------------------------------- +def get_current_project(dev_folder): + boostrap_filepath = Path(dev_folder, "bootstrap.cfg") + bootstrap = open(boostrap_filepath, "r") + game_project_regex = re.compile("^sys_game_folder\s*=\s*(.*)") + for line in bootstrap: + game_folder_match = game_project_regex.match(line) + if game_folder_match: + return game_folder_match.group(1) + return None +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# TO DO: Move to a util package or module +def return_stub(stub='dccsi_stub'): + '''Take a file name (stub) and returns the directory of the file (stub)''' + _dir_to_last_file = None + if _dir_to_last_file is None: + path = Path(__file__).absolute() + while 1: + path, tail = Path(path).split() + if Path(path, stub).is_file(): + break + if (len(tail) == 0): + path = "" + if _G_DEBUG: + _LOGGER.debug('~Not able to find the path to that file ' + '(stub) in a walk-up from currnet path.') + break + _dir_to_last_file = path + + return _dir_to_last_file +# ------------------------------------------------------------------------- + +# ------------------------------------------------------------------------- +def get_stub_check_path(in_path, check_stub='engineroot.txt'): + ''' + Returns the branch root directory of the dev\'engineroot.txt' + (... or you can pass it another known stub) + + so we can safely build relative filepaths within that branch. + + If the stub is not found, it returns None + ''' + path = Path(in_path).absolute() + + while 1: + test_path = Path(path, check_stub) + + if test_path.is_file(): + return Path(test_path) + + else: + path, tail = (path.parent, path.name) + + if (len(tail) == 0): + return None +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# TO DO: Move to a util package or module +def resolve_envar_path(envar='LY_DEV', + start_path=__file__, + check_stub='engineroot.txt', + dir_name='dev', + return_posix_str=False): + """This is meant to resolve a '\dev' path for LY + + First we validate the start_path (or we can't walk) + + Then we walk up the startPath looking for stub + engineroot.txt is the default file marker for lumberyard + + That is a pretty safe indicator that we found the right '\dev' + + Second it checks if the env var 'LY_DEV' is set, use that instead! + + """ + + fallback = None + + # amke sure the start_path exists, otherwise we have nothing to walk up + try: + start_path = Path(start_path) + start_path.exists() + if start_path.is_dir(): + fallback = start_path + elif start_path.is_file(): + fallback = start_path.parent + except Exception as e: + _LOGGER.info('Does NOT exist, no valid path: {0}'.format(start_path)) + raise EnvironmentError + + # generate a fallback based on finding know stub + # known stub is probably more reliable then dir name + + fallback_stub = get_stub_check_path(fallback, check_stub) + # there is alos a chance this comes back None + + # cast from is_file to directory + if fallback_stub and fallback_stub.is_file(): + fallback = fallback_stub.parent + + # check if it's set in env and fetch, or set to fallback + envar_path = Path(os.getenv(envar, fallback)) + try: + envar_path.exists() + envar_path.is_dir() + envar_path.name.lower == dir_name + except Exception as e: + _LOGGER.info('Not a lumbertard \dev path: {0}'.format(e)) + raise EnvironmentError + + # last resort see if you can walk up to the dir name + if not envar_path: + envar_path = walk_up_dir(start_path, dir_name) + + if envar_path and Path(envar_path).exists(): + # box module can't serialize WindowsPath objects + # so Path object being stashed in this dict need .resolve() or .as_posix() + if return_posix_str: + return Path(envar_path).as_posix() + else: + return Path(envar_path) + else: + return None +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# setting up storage dict, only using a Box (super dict) instead +_SYNTH_ENV_DICT = OrderedDict() +# ------------------------------------------------------------------------- + + +# --- Build Defaults ------------------------------------------------------ +def stash_env(_SYNTH_ENV_DICT = OrderedDict()): + """This block attempts to fetch or derive best guess fallback""" + + # basic default fall backs (in case no environment exists) + # this first set is just the expected base_env + + _LOGGER.info(STR_CROSSBAR) + _LOGGER.info('~ stash_env(), setting module fallbacks') + + # box module can't serialize WindowsPath objects + # so Path object being stashed in this dict need .resolve() or .as_posix() + _THIS_MODULE_PATH = Path(__file__).as_posix() + + # company name from env or default + # TAG_DEFAULT_COMPANY = str('Amazon.Lumberyard') + _G_COMPANY_NAME = os.getenv(ENVAR_COMPANY, + TAG_DEFAULT_COMPANY) + + # we want to pack these all into a easy access dict + _SYNTH_ENV_DICT[ENVAR_COMPANY] = _G_COMPANY_NAME + + # \dev Lumberyard ROOT PATH + # someone decided to use this as a root stub (for similar reasons in C++?) + # STUB_LY_DEV = str('engineroot.txt') + # I don't own \dev so I didn't want to check in anything new there + _LY_DEV = resolve_envar_path(ENVAR_LY_DEV, # envar + _THIS_MODULE_PATH, # search path + STUB_LY_DEV, # stub + TAG_DIR_LY_DEV) # dir + + _SYNTH_ENV_DICT[ENVAR_LY_DEV] = _LY_DEV.as_posix() + + # project name is a string, it should be project dir name + # for siloed testing and a purely synthetc env (nothing previously set) + # the default should probably be the 'DccScriptingInterface' (DCCsi) + # we also have a 'MockProject' sanndbox/silo, but we want to reseve that + # for testing overrides of the default synthetic env + + # we can do two things here, + # first we can try to fetch from the env os.getenv('LY_PROJECT') + # If comes back None, allows you to specify a default fallback + # changed to just make the fallback what is set in boostrap + # so now it's less of a fallnack and more correct if not + # explicitly set + _LY_PROJECT = os.getenv(ENVAR_LY_PROJECT, + get_current_project(_LY_DEV)) + _SYNTH_ENV_DICT[ENVAR_LY_PROJECT] = _LY_PROJECT + + _LY_BUILD_DIR_NAME = os.getenv(ENVAR_LY_BUILD_DIR_NAME, + TAG_DIR_LY_BUILD) + _SYNTH_ENV_DICT[ENVAR_LY_BUILD_DIR_NAME] = _LY_BUILD_DIR_NAME + + # pattern for the above is (and will be repeated) + # _SOME_ENVAR = resolve_envar_path('ENVAR', + # 'path\\to\\start\\search', + # 'knownStubFileName', + # 'knownDirName') + # checks env for ENVAR first, + # then walks up search path looking for stub (fallback 0), + # then walks up niavely looking for a dirName (fallback 1) + + # other paths that don't have a stub to search for as a fallback + # can be stashed in this manner + + # variable containers for all of the default/base env config dccsi entry + # setting most basic defaults, not using an module import dependancies + # we can't know where the user installed or set up any of these, + # so we guess based on how I set up the original dev environment + + # -- envar -- + _LY_BUILD_PATH = Path(os.getenv(ENVAR_LY_BUILD_PATH, + PATH_LY_BUILD_PATH)) + _SYNTH_ENV_DICT[ENVAR_LY_BUILD_PATH] = _LY_BUILD_PATH.as_posix() + + # -- envar -- + _LY_BIN_PATH = Path(os.getenv(ENVAR_LY_BIN_PATH, + PATH_LY_BIN_PATH)) + # some of these need hard checks + if not _LY_BIN_PATH.exists(): + raise Exception('LY_BIN_PATH does NOT exist: {0}'.format(_LY_BIN_PATH)) + else: + _SYNTH_ENV_DICT[ENVAR_LY_BIN_PATH] = _LY_BIN_PATH.as_posix() + # adding to sys.path apparently doesn't work for .dll locations like Qt + os.environ['PATH'] = _LY_BIN_PATH.as_posix() + os.pathsep + os.environ['PATH'] + + # -- envar -- + # if that stub marker doesn't exist assume DCCsi path (fallback 1) + _LY_PROJECT_PATH = Path(os.getenv(ENVAR_LY_PROJECT_PATH, + Path(_LY_DEV, _LY_PROJECT))) + _SYNTH_ENV_DICT[ENVAR_LY_PROJECT_PATH] = _LY_PROJECT_PATH.as_posix() + + # -- envar -- + _DCCSIG_PATH = resolve_envar_path(ENVAR_DCCSIG_PATH, # envar + _THIS_MODULE_PATH, # search path + STUB_LY_ROOT_DCCSI, # stub name + TAG_DEFAULT_PROJECT) # dir + _SYNTH_ENV_DICT[ENVAR_DCCSIG_PATH] = _DCCSIG_PATH.as_posix() + + # -- envar -- + _AZPY_PATH = Path(os.getenv(ENVAR_DCCSI_AZPY_PATH, + Path(_DCCSIG_PATH, TAG_DIR_DCCSI_AZPY))) + _SYNTH_ENV_DICT[ENVAR_DCCSI_AZPY_PATH] = _AZPY_PATH.as_posix() + + # -- envar -- + _DCCSI_SDK_PATH = Path(os.getenv(ENVAR_DCCSI_SDK_PATH, + Path(_DCCSIG_PATH, TAG_DIR_DCCSI_SDK))) + _SYNTH_ENV_DICT[ENVAR_DCCSI_SDK_PATH] = _DCCSI_SDK_PATH.as_posix() + + # -- envar -- + # external dccsi site-packages + _DCCSI_PYTHON_LIB_PATH = Path(os.getenv(ENVAR_DCCSI_PYTHON_LIB_PATH, + PATH_DCCSI_PYTHON_LIB_PATH)) + _SYNTH_ENV_DICT[ENVAR_DCCSI_PYTHON_LIB_PATH] = _DCCSI_PYTHON_LIB_PATH.as_posix() + + # -- envar -- + # extend to py36 (conda env) and interpreter (wrapped as a .bat file) + _DEFAULT_PY_PATH = Path(_DCCSIG_PATH, TAG_DEFAULT_PY) + _DEFAULT_PY_PATH = Path(os.getenv(ENVAR_DCCSI_PY_DEFAULT, + _DEFAULT_PY_PATH)) + _SYNTH_ENV_DICT[ENVAR_DCCSI_PY_DEFAULT] = _DEFAULT_PY_PATH.as_posix() + + # -- envar -- + # wing ide vars + _WINGHOME_DEFAULT_PATH = Path(os.getenv(ENVAR_WINGHOME, + PATH_DEFAULT_WINGHOME)) + _SYNTH_ENV_DICT[ENVAR_WINGHOME] = _WINGHOME_DEFAULT_PATH.as_posix() + + # -- done -- + return _SYNTH_ENV_DICT +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def init_ly_pyside(env_dict=_SYNTH_ENV_DICT): + """sets access to lumberyards Qt dlls and PySide""" + + # -- envar -- + _QTFORPYTHON_PATH = Path(os.getenv(ENVAR_QTFORPYTHON_PATH, + PATH_QTFORPYTHON_PATH)) + # some of these need hard checks + if not _QTFORPYTHON_PATH.exists(): + raise Exception('QTFORPYTHON_PATH does NOT exist: {0}'.format(_QTFORPYTHON_PATH)) + else: + _SYNTH_ENV_DICT[ENVAR_QTFORPYTHON_PATH] = _QTFORPYTHON_PATH.as_posix() + # ^ some of these should be put on sys.path and/or PYTHONPATH or PATH + #os.environ['PATH'] = _QTFORPYTHON_PATH.as_posix() + os.pathsep + os.environ['PATH'] + site.addsitedir(_QTFORPYTHON_PATH.as_posix()) # PYTHONPATH + + # -- envar -- + _QT_PLUGIN_PATH = Path(os.getenv(ENVAR_QT_PLUGIN_PATH, + PATH_QT_PLUGIN_PATH)) + # some of these need hard checks + if not _QT_PLUGIN_PATH.exists(): + raise Exception('QT_PLUGIN_PATH does NOT exist: {0}'.format(_QT_PLUGIN_PATH)) + else: + _SYNTH_ENV_DICT[ENVAR_QT_PLUGIN_PATH] = _QT_PLUGIN_PATH.as_posix() + # https://stackoverflow.com/questions/214852/python-module-dlls + os.environ['PATH'] = _QT_PLUGIN_PATH.as_posix() + os.pathsep + os.environ['PATH'] + + + + QTFORPYTHON_PATH = Path.joinpath(LY_DEV, + 'Gems', + 'QtForPython', + '3rdParty', + 'pyside2', + 'windows', + 'release').resolve() + os.environ["DYNACONF_QTFORPYTHON_PATH"] = str(QTFORPYTHON_PATH) + os.environ["QTFORPYTHON_PATH"] = str(QTFORPYTHON_PATH) + sys.path.insert(1, str(QTFORPYTHON_PATH)) + site.addsitedir(str(QTFORPYTHON_PATH)) + + LY_BIN_PATH = Path.joinpath(LY_DEV, + 'windows_vs2019', + 'bin', + 'profile').resolve() + os.environ["DYNACONF_LY_BIN_PATH"] = str(LY_BIN_PATH) + os.environ["LY_BIN_PATH"] = str(LY_BIN_PATH) + site.addsitedir(str(LY_BIN_PATH)) + sys.path.insert(1, str(LY_BIN_PATH)) + + QT_PLUGIN_PATH = Path.joinpath(LY_BIN_PATH, + 'EditorPlugins').resolve() + os.environ["DYNACONF_QT_PLUGIN_PATH"] = str(QT_PLUGIN_PATH) + os.environ["QT_PLUGIN_PATH"] = str(QT_PLUGIN_PATH) + site.addsitedir(str(QT_PLUGIN_PATH)) + sys.path.insert(1, str(QT_PLUGIN_PATH)) + + QT_QPA_PLATFORM_PLUGIN_PATH = Path.joinpath(QT_PLUGIN_PATH, + 'platforms').resolve() + os.environ["DYNACONF_QT_QPA_PLATFORM_PLUGIN_PATH"] = str(QT_QPA_PLATFORM_PLUGIN_PATH) + os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = str(QT_QPA_PLATFORM_PLUGIN_PATH) + site.addsitedir(str(QT_QPA_PLATFORM_PLUGIN_PATH)) + sys.path.insert(1, str(QT_QPA_PLATFORM_PLUGIN_PATH)) + + # add Qt binaries to the Windows path to handle findings DLL file dependencies + if sys.platform.startswith('win'): + path = os.environ['PATH'] + newPath = '' + newPath += str(LY_BIN_PATH) + os.pathsep + newPath += str(Path.joinpath(QTFORPYTHON_PATH, + 'shiboken2').resolve()) + os.pathsep + newPath += str(Path.joinpath(QTFORPYTHON_PATH, + 'PySide2').resolve()) + os.pathsep + newPath += path + os.environ['PATH']=newPath + _LOGGER.debug('PySide2 bootstrapped PATH for Windows.') + + try: + import PySide2 + _LOGGER.debug('DCCsi, config.py: SUCCESS: import PySide2') + _LOGGER.debug(PySide2) + status = True + except ImportError as e: + _LOGGER.debug('DCCsi, config.py: FAILURE: import PySide2') + status = False + raise(e) + + try: + import shiboken2 + _LOGGER.debug('DCCsi, config.py: SUCCESS: import shiboken2') + _LOGGER.debug(shiboken2) + status = True + except ImportError as e: + _LOGGER.debug('DCCsi, config.py: FAILURE: import shiboken2') + status = False + raise(e) + + return status +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# py 2 and 3 compatible iter +def get_items(dict_object): + for key in dict_object: + yield key, dict_object[key] + +def set_env(dict_object): + for key, value in get_items(dict_object): + try: + os.environ[key] = value + except EnvironmentError as e: + _LOGGER.error('ERROR: {e}') + return dict_object + +# will trigger on any import +# suggested use: from synthetic_env import _SYNTH_ENV_DICT +#_SYNTH_ENV_DICT = set_env(_SYNTH_ENV_DICT) + +# ------------------------------------------------------------------------- +def test_Qt(): + try: + import PySide2 + print('PySide2: {0}'.format(Path(PySide2.__file__).as_posix())) + # builtins.ImportError: DLL load failed: The specified procedure could not be found. + from PySide2 import QtCore + from PySide2 import QtWidgets + except IOError as e: + print('ERROR: {0}'.format(e)) + raise e + + try: + qapp = QtWidgets.QApplication([]) + except: + # already exists + qapp = QtWidgets.QApplication.instance() + + try: + buttonFlags = QtWidgets.QMessageBox.information(QtWidgets.QApplication.activeWindow(), 'title', 'ok') + qapp.instance().quit + qapp.exit() + except Exception as e: + print('ERROR: {0}'.format(e)) + raise e +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def main(argv, env_dict_object, debug=False, devmode=False): + import getopt + try: + opts, args = getopt.getopt(argv, "hvt:", ["verbose=", "test="]) + except getopt.GetoptError: + # not logging, print to cmd line console + print('synthetic_env.py -v -t ') + sys.exit(2) + + for opt, arg in opts: + if opt == '-h': + print('synthetic_env.py -v -t ') + sys.exit() + + elif opt in ("-t", "--test"): + debug = True + devmode = True + test() + + elif opt in ("-v", "--verbose"): + try: + from box import Box + except ImportError as e: + print('ERROR: {0}'.format(e)) + raise e + try: + env_dict_object = Box(env_dict_object) + print(str(env_dict_object.to_json(sort_keys=False, + indent=4))) + except Exception as e: + print('ERROR: {0}'.format(e)) + raise e +# ------------------------------------------------------------------------- + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + # run simple tests? + _G_DEBUG = True + _DCCSI_DEV_MODE = True + + if _DCCSI_DEV_MODE: + try: + import azpy.test.entry_test + print('SUCCESS: import azpy.test.entry_test') + azpy.test.entry_test.main(verbose=True, connectDebugger=True) + except ImportError as e: + print('ERROR: {0}'.format(e)) + raise e + + # init, stash and then activate + _SYNTH_ENV_DICT = OrderedDict() + _SYNTH_ENV_DICT = stash_env(_SYNTH_ENV_DICT) + _SYNTH_ENV_DICT = set_env(_SYNTH_ENV_DICT) + + main(sys.argv[1:], _SYNTH_ENV_DICT, _G_DEBUG, _DCCSI_DEV_MODE) + + if _G_DEBUG: + + tempBoxJsonFilePath = Path(_SYNTH_ENV_DICT['DCCSIG_PATH'], '.temp') + tempBoxJsonFilePath = Path(tempBoxJsonFilePath, 'boxDumpTest.json') + _LOGGER.info(f'tempBoxJsonFilePath: {tempBoxJsonFilePath}') + + try: + tempBoxJsonFilePath.mkdir(parents=True, exist_ok=True) + tempBoxJsonFilePath.touch(mode=0o777, exist_ok=True) + except Exception as e: + _LOGGER.info(e) + + _LOGGER.info('~ writting with Box.to_json') + try: + from box import Box + _SYNTH_ENV_DICT = Box(_SYNTH_ENV_DICT) + _LOGGER.info(type(_SYNTH_ENV_DICT)) + except Exception as e: + _LOGGER.info(e) + + # -- BOX STORE ------ + _LOGGER.info(str(_SYNTH_ENV_DICT.to_json(sort_keys=False, + indent=4))) + try: + #_SYNTH_ENV_DICT.to_json(filename=None, encoding='utf-8', errors='strict') + #from os import fspath + #tempBoxJsonFilePath = fspath(tempBoxJsonFilePath) + _SYNTH_ENV_DICT.to_json(filename=tempBoxJsonFilePath.as_posix(), + sort_keys=False, + indent=4) + _LOGGER.info('~ Box.to_json SUCCESS') + except Exception as e: + _LOGGER.info(e) + # if this raises an exception related to WindowsPath + # that a path obj was stashed, use .as_posix() when stashing + raise e + + _LOGGER.info('listing envar keys: {0}'.format(_SYNTH_ENV_DICT.keys())) + + # -- BOX READ ------ + _LOGGER.info('~ read Box.from_json') + + parseJsonBox = Box.from_json(filename=tempBoxJsonFilePath, + encoding="utf-8", + errors="strict", + object_pairs_hook=OrderedDict) + + _LOGGER.info('~ pretty print parsed Box.from_json') + + _LOGGER.info(json.dumps(parseJsonBox, indent=4, sort_keys=False, ensure_ascii=False)) + + # also run the Qt/PySide2 test + test_Qt() + + del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py index aa70611f1c..1911a0ad38 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py @@ -17,7 +17,7 @@ import os -from azpy import env_bool +from azpy.env_bool import env_bool from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/config.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/config.py index 245283898f..0068b4c766 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/config.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/config.py @@ -1,22 +1,20 @@ -# coding:utf-8 -#!/usr/bin/python -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -# -- This line is 75 characters ------------------------------------------- +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- """Extend the .env using dynaconf (dynamic configuration and settings) This config.py module assumes a minimal enviornment is defined in the .env -To do: ensure that we can stack/layer the dynamic env to work with ly projects +To do: ensure that we can stack/layer the dynamic env to work with O3DE projects """ -# ------------------------------------------------------------------------- + # built in's import os import sys @@ -29,7 +27,7 @@ import re # on py27 so we need to import and use after some boostrapping -# ------------------------------------------------------------------------- +# -------------------------------------------------------------------+------ #os.environ['PYTHONINSPECT'] = 'True' _MODULE_PATH = os.path.abspath(__file__) @@ -48,20 +46,21 @@ from azpy.constants import ENVAR_DCCSI_GDEBUG from azpy.constants import ENVAR_DCCSI_DEV_MODE # set up global space, logging etc. -_G_DEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) +# set these true if you want them set globally for debugging +_DCCSI_GDEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False) _DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False) _PACKAGENAME = 'DCCsi.config' -_log_level = int(20) -if _G_DEBUG: - _log_level = int(10) +_LOG_LEVEL = int(20) +if _DCCSI_GDEBUG: + _LOG_LEVEL = int(10) _LOGGER = azpy.initialize_logger(_PACKAGENAME, log_to_file=False, - default_log_level=_log_level) + default_log_level=_LOG_LEVEL) _LOGGER.info('Starting up: {}.'.format({_PACKAGENAME})) _LOGGER.info('site.addsitedir({})'.format(_DCCSIG_PATH)) -_LOGGER.debug('_G_DEBUG: {}'.format(_G_DEBUG)) +_LOGGER.debug('_DCCSI_GDEBUG: {}'.format(_DCCSI_GDEBUG)) _LOGGER.debug('_DCCSI_DEV_MODE: {}'.format(_DCCSI_DEV_MODE)) # early attach WingIDE debugger (can refactor to include other IDEs later) @@ -69,14 +68,14 @@ if _DCCSI_DEV_MODE: from azpy.test.entry_test import connect_wing foo = connect_wing() # to do: ^ this should be replaced with full featured azpy.dev.util -# that supports additional debuggers (pycharm, vscode) +# that supports additional debuggers (pycharm, vscode, etc.) # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # (2) this will give us import access to modules we provide _DCCSI_PYTHON_LIB_PATH = azpy.config_utils.bootstrap_dccsi_py_libs(_DCCSIG_PATH) - + # Now we should be able to just carry on with pth lib and dynaconf from dynaconf import Dynaconf from pathlib import Path @@ -149,7 +148,7 @@ def init_ly_pyside(LY_DEV=None): _LOGGER.debug('DCCsi, config.py: FAILURE: import PySide2') status = False raise(e) - + try: import shiboken2 _LOGGER.debug('DCCsi, config.py: SUCCESS: import shiboken2') @@ -159,7 +158,7 @@ def init_ly_pyside(LY_DEV=None): _LOGGER.debug('DCCsi, config.py: FAILURE: import shiboken2') status = False raise(e) - + # set up the pyside2-tools (pyside2uic) # to do: move path construction string to constants and build off of SDK # have not done that yet as I really want to get legal approval and @@ -170,7 +169,7 @@ def init_ly_pyside(LY_DEV=None): 'AtomLyIntegration', 'TechnicalArt', 'DccScriptingInterface', - 'SDK', + '.dev', 'QtForPython', 'pyside2-tools-dev') os.environ["DYNACONF_DCCSI_PYSIDE2_TOOLS"] = str(DCCSI_PYSIDE2_TOOLS.resolve()) @@ -210,9 +209,16 @@ settings = Dynaconf( settings_files=['settings.json', '.secrets.json'], ) +from azpy.constants import PATH_LY_BUILD_PATH +from azpy.constants import PATH_LY_BIN_PATH + +# global settings +os.environ["DYNACONF_DCCSI_GDEBUG"] = str(_DCCSI_GDEBUG) +os.environ["DYNACONF_DCCSI_DEV_MODE"] = str(_DCCSI_DEV_MODE) + # search up to get \dev _LY_DEV = azpy.config_utils.get_stub_check_path(in_path=_DCCSIG_PATH, - check_stub='engineroot.txt') + check_stub='engineroot.txt') os.environ["DYNACONF_LY_DEV"] = str(_LY_DEV.resolve()) _LY_PROJECT = azpy.config_utils.get_current_project(_LY_DEV) os.environ["DYNACONF_LY_PROJECT"] = _LY_PROJECT @@ -227,9 +233,9 @@ os.environ["DYNACONF_DCCSI_PYTHON_LIB_PATH"] = str(_DCCSI_PYTHON_LIB_PATH) os.environ["DYNACONF_OS_FOLDER"] = azpy.config_utils.get_os() # we need to set up the Ly dev build \bin\path (for Qt dll access) -_LY_BUILD_PATH = Path.joinpath(_LY_DEV, r'windows_vs2019').resolve() +_LY_BUILD_PATH = Path(PATH_LY_BUILD_PATH).resolve() os.environ["DYNACONF_LY_BUILD_PATH"] = str(_LY_BUILD_PATH) -_LY_BIN_PATH = Path.joinpath(_LY_BUILD_PATH, 'bin\\profile').resolve() +_LY_BIN_PATH = Path(PATH_LY_BIN_PATH).resolve() os.environ["DYNACONF_LY_BIN_PATH"] = str(_LY_BIN_PATH) # project cache log dir path @@ -259,7 +265,7 @@ def get_config_settings(setup_ly_pyside=False): if setup_ly_pyside: init_ly_pyside(settings.LY_DEV) - + settings.setenv() return settings # --- END ----------------------------------------------------------------- @@ -270,23 +276,29 @@ def get_config_settings(setup_ly_pyside=False): # ------------------------------------------------------------------------- if __name__ == '__main__': """Run this file as main""" - + + _LOG_LEVEL = int(10) # same as _logging.DEBUG + _LOGGER = azpy.initialize_logger(_PACKAGENAME, log_to_file=True, - default_log_level=int(10)) + default_log_level=_LOG_LEVEL) from dynaconf import settings - + # not using fstrings in this module because it might run in py2.7 (maya) + _LOGGER.info('DCCSI_GDEBUG: {}'.format(settings.DCCSI_GDEBUG)) + _LOGGER.info('DCCSI_DEV_MODE: {}'.format(settings.DCCSI_DEV_MODE)) + _LOGGER.info('DCCSI_LOGLEVEL: {}'.format(settings.DCCSI_LOGLEVEL)) + _LOGGER.info('OS_FOLDER: {}'.format(settings.OS_FOLDER)) _LOGGER.info('LY_PROJECT: {}'.format(settings.LY_PROJECT)) _LOGGER.info('LY_PROJECT_PATH: {}'.format(settings.LY_PROJECT_PATH)) _LOGGER.info('LY_DEV: {}'.format(settings.LY_DEV)) _LOGGER.info('LY_BUILD_PATH: {}'.format(settings.LY_BUILD_PATH)) _LOGGER.info('LY_BIN_PATH: {}'.format(settings.LY_BIN_PATH)) - + _LOGGER.info('DCCSI_LOG_PATH: {}'.format(settings.DCCSI_LOG_PATH)) - + _LOGGER.info('DCCSI_CONFIG_PATH: {}'.format(settings.DCCSI_CONFIG_PATH)) _LOGGER.info('DCCSIG_PATH: {}'.format(settings.DCCSIG_PATH)) _LOGGER.info('DCCSI_PYTHON_LIB_PATH: {}'.format(settings.DCCSI_PYTHON_LIB_PATH)) @@ -309,12 +321,12 @@ if __name__ == '__main__': _LOGGER.info('QT_PLUGIN_PATH: {}'.format(settings.QT_PLUGIN_PATH)) _LOGGER.info('QT_QPA_PLATFORM_PLUGIN_PATH: {}'.format(settings.QT_QPA_PLATFORM_PLUGIN_PATH)) _LOGGER.info('DCCSI_PYSIDE2_TOOLS: {}'.format(settings.DCCSI_PYSIDE2_TOOLS)) - + test_pyside2() # test PySide2 access with a pop-up button - - + + diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/requirements.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/requirements.txt new file mode 100644 index 0000000000..05d47ea70c --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/requirements.txt @@ -0,0 +1,37 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile --generate-hashes requirements.txt +# +typing==3.7.4.3 \ + --hash=sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9 \ + --hash=sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5 + # via + # -r requirements.txt + # dynaconf +click==7.1.2 \ + --hash=sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a \ + --hash=sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc + # via + # -r requirements.txt + # pip-tools +dynaconf==3.1.4 \ + --hash=sha256:b2f472d83052f809c5925565b8a2ba76a103d5dc1dbb9748b693ed67212781b9 \ + --hash=sha256:e6f383b84150b70fc439c8b2757581a38a58d07962aa14517292dcce1a77e160 + # via -r requirements.txt +pathlib==1.0.1 \ + --hash=sha256:6940718dfc3eff4258203ad5021090933e5c04707d5ca8cc9e73c94a7894ea9f + # via -r requirements.txt +python-box==3.4.6 \ + --hash=sha256:694a7555e3ff9fbbce734bbaef3aad92b8e4ed0659d3ed04d56b6a0a0eff26a9 \ + --hash=sha256:a71d3dc9dbaa34c8597d3517c89a8041bd62fa875f23c0f3dad55e1958e3ce10 + # via -r requirements.txt +unipath==1.1 \ + --hash=sha256:09839adcc72e8a24d4f76d63656f30b5a1f721fc40c9bcd79d8c67bdd8b47dae \ + --hash=sha256:e6257e508d8abbfb6ddd8ec357e33589f1f48b1599127f23b017124d90b0fff7 + # via -r requirements.txt + +# WARNING: The following packages were not pinned, but pip requires them to be +# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag. +# pip diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/setup.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/setup.py new file mode 100644 index 0000000000..9e3c21ca94 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/setup.py @@ -0,0 +1,19 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +# ------------------------------------------------------------------------- + +from setuptools import setup, find_packages + +setup( + name='DccScriptingInterface', + version='0.1', + packages=find_packages(), +) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/workspace.mel b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/workspace.mel new file mode 100644 index 0000000000..d3aa69b474 --- /dev/null +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/workspace.mel @@ -0,0 +1,88 @@ +//Maya 2020 Project Definition + +workspace -fr "fluidCache" ""; +workspace -fr "images" "Textures"; +workspace -fr "JT_ATF" ""; +workspace -fr "offlineEdit" ".maya_data/scenes/edits"; +workspace -fr "STEP_ATF Export" ""; +workspace -fr "furShadowMap" ""; +workspace -fr "SVG" ""; +workspace -fr "scripts" "Maya/Scripts"; +workspace -fr "DAE_FBX" ""; +workspace -fr "shaders" "Maya/Shaders"; +workspace -fr "NX_ATF" ""; +workspace -fr "furFiles" ""; +workspace -fr "CATIAV5_ATF Export" ""; +workspace -fr "OBJ" ".maya_data/obj"; +workspace -fr "PARASOLID_ATF Export" ""; +workspace -fr "FBX export" "Objects"; +workspace -fr "furEqualMap" ""; +workspace -fr "textures" "textures"; +workspace -fr "BIF" ""; +workspace -fr "lights" ".maya_data/renderData/shaders"; +workspace -fr "DAE_FBX export" ""; +workspace -fr "aliasWire" ".maya_data/data"; +workspace -fr "CATIAV5_ATF" ""; +workspace -fr "SAT_ATF Export" ""; +workspace -fr "movie" ".maya_data/movies"; +workspace -fr "ASS Export" ""; +workspace -fr "autoSave" ".maya_data/autoSave"; +workspace -fr "move" ".maya_data"; +workspace -fr "mayaAscii" ""; +workspace -fr "NX_ATF Export" ""; +workspace -fr "sound" ".maya_data/sound"; +workspace -fr "mayaBinary" ""; +workspace -fr "timeEditor" ""; +workspace -fr "RIBexport" ".maya_data/data"; +workspace -fr "DWG_ATF" ""; +workspace -fr "mentalray" ".maya_data/renderData/mentalray"; +workspace -fr "JT_ATF Export" ""; +workspace -fr "iprImages" ".maya_data/renderData/iprImages"; +workspace -fr "FBX" "Objects"; +workspace -fr "renderData" ".maya_data/renderData"; +workspace -fr "CATIAV4_ATF" ""; +workspace -fr "fileCache" ""; +workspace -fr "eps" ""; +workspace -fr "Fbx" "Objects"; +workspace -fr "IGESexport" ".maya_data/data"; +workspace -fr "3dPaintTextures" ".maya_data/3dPaintTextures"; +workspace -fr "translatorData" ""; +workspace -fr "mel" ".maya_data/mel"; +workspace -fr "DXF_ATF Export" ""; +workspace -fr "IGES" ".maya_data/data"; +workspace -fr "particles" ".maya_data/particles"; +workspace -fr "DXFexport" ".maya_data/data"; +workspace -fr "DXF_ATF" ""; +workspace -fr "scene" "Objects"; +workspace -fr "renderScenes" ".maya_data/renderScenes"; +workspace -fr "SAT_ATF" ""; +workspace -fr "PROE_ATF" ""; +workspace -fr "WIRE_ATF Export" ""; +workspace -fr "sourceImages" "ArtSource/Images"; +workspace -fr "RIB" ".maya_data/data"; +workspace -fr "furImages" ""; +workspace -fr "clips" ".maya_data/clips"; +workspace -fr "Adobe(R) Illustrator(R)" ".maya_data/data"; +workspace -fr "animExport" ".maya_data/data"; +workspace -fr "mentalRay" ".maya_data/mentalRay"; +workspace -fr "STEP_ATF" ""; +workspace -fr "DWG_ATF Export" ""; +workspace -fr "depth" ".maya_data/renderData/depth"; +workspace -fr "sceneAssembly" ""; +workspace -fr "IGES_ATF Export" ""; +workspace -fr "teClipExports" ""; +workspace -fr "IGES_ATF" ""; +workspace -fr "PARASOLID_ATF" ""; +workspace -fr "ASS" ""; +workspace -fr "Substance" ".maya_data/data"; +workspace -fr "audio" ".maya_data/sound"; +workspace -fr "EPS" ".maya_data/data"; +workspace -fr "Alembic" "Objects"; +workspace -fr "diskCache" ".maya_data/cache"; +workspace -fr "illustrator" ""; +workspace -fr "WIRE_ATF" ""; +workspace -fr "templates" "ArtSource/SceneTemplates"; +workspace -fr "animImport" ".maya_data/data"; +workspace -fr "OBJexport" "Objects"; +workspace -fr "furAttrMap" ""; +workspace -fr "DXF" ".maya_data/data"; diff --git a/Gems/AudioEngineWwise/Code/CMakeLists.txt b/Gems/AudioEngineWwise/Code/CMakeLists.txt index 73cfe8d90b..f8eaf1ef21 100644 --- a/Gems/AudioEngineWwise/Code/CMakeLists.txt +++ b/Gems/AudioEngineWwise/Code/CMakeLists.txt @@ -26,7 +26,6 @@ if (PAL_TRAIT_BUILD_SERVER_SUPPORTED OR PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB) ly_add_target( NAME AudioEngineWwise.Stub ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} NAMESPACE Gem - OUTPUT_NAME AudioEngineWwise.Stub FILES_CMAKE audioenginewwise_stub_files.cmake BUILD_DEPENDENCIES @@ -43,7 +42,6 @@ endif() ly_add_target( NAME AudioEngineWwise.Static STATIC NAMESPACE Gem - OUTPUT_NAME Gem.AudioEngineWwise.Static FILES_CMAKE audioenginewwise_files.cmake ${pal_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake diff --git a/Gems/AudioSystem/Code/CMakeLists.txt b/Gems/AudioSystem/Code/CMakeLists.txt index 83167ff92b..e38df4342c 100644 --- a/Gems/AudioSystem/Code/CMakeLists.txt +++ b/Gems/AudioSystem/Code/CMakeLists.txt @@ -18,7 +18,6 @@ ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${P ly_add_target( NAME AudioSystem.Static STATIC NAMESPACE Gem - OUTPUT_NAME Gem.AudioSystem.Static FILES_CMAKE audiosystem_files.cmake ${pal_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake diff --git a/Gems/AudioSystem/Code/Include/Engine/IAudioSystemImplementation.h b/Gems/AudioSystem/Code/Include/Engine/IAudioSystemImplementation.h index e30133f36e..07ff163f32 100644 --- a/Gems/AudioSystem/Code/Include/Engine/IAudioSystemImplementation.h +++ b/Gems/AudioSystem/Code/Include/Engine/IAudioSystemImplementation.h @@ -84,7 +84,7 @@ namespace Audio //! Updates all of the internal sub-systems that require regular updates, and pumps the audio //! middleware api. //! @param updateIntervalMS Time since the last call to Update in milliseconds. - virtual void Update(const float updateIntervalMS) = 0; + virtual void Update(float updateIntervalMS) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Initialize all internal components of the audio middleware implementation. @@ -116,7 +116,7 @@ namespace Audio //! @prarm objectData Implementation-specific audio object data. //! @param objectName The name of the audio object to be shown in debug info. //! @return eARS_SUCCESS if the object was registered, eARS_FAILURE otherwise. - virtual EAudioRequestStatus RegisterAudioObject(IATLAudioObjectData* const objectData, const char* const objectName = nullptr) = 0; + virtual EAudioRequestStatus RegisterAudioObject(IATLAudioObjectData* objectData, const char* objectName = nullptr) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Unregister an audio object with the audio middleware. @@ -124,20 +124,20 @@ namespace Audio //! an effect on the audio object. //! @prarm objectData Implementation-specific audio object data //! @return eARS_SUCCESS if the object was unregistered, eARS_FAILURE otherwise. - virtual EAudioRequestStatus UnregisterAudioObject(IATLAudioObjectData* const objectData) = 0; + virtual EAudioRequestStatus UnregisterAudioObject(IATLAudioObjectData* objectData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Clear out the audio object's internal state and reset it. //! After this action, the object can be recycled back to the pool of available audio objects. //! @param objectData Implementation-specific audio object data. //! @return eARS_SUCCESS if the object was reset, eARS_FAILURE otherwise. - virtual EAudioRequestStatus ResetAudioObject(IATLAudioObjectData* const objectData) = 0; + virtual EAudioRequestStatus ResetAudioObject(IATLAudioObjectData* objectData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Performs actions that need to be executed regularly on an audio object. //! @param objectData Implementation-specific audio object data. //! @return eARS_SUCCESS if the object was updated, eARS_FAILURE otherwise. - virtual EAudioRequestStatus UpdateAudioObject(IATLAudioObjectData* const objectData) = 0; + virtual EAudioRequestStatus UpdateAudioObject(IATLAudioObjectData* objectData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Prepare a trigger synchronously for execution. @@ -146,8 +146,8 @@ namespace Audio //! @param triggerData Implementation-specific trigger data. //! @return eARS_SUCCESS if the the trigger was successfully prepared, eARS_FAILURE otherwise. virtual EAudioRequestStatus PrepareTriggerSync( - IATLAudioObjectData* const audioObjectData, - const IATLTriggerImplData* const triggerData) = 0; + IATLAudioObjectData* audioObjectData, + const IATLTriggerImplData* triggerData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Unprepare a trigger synchronously when no longer needed. @@ -156,8 +156,8 @@ namespace Audio //! @param triggerData Implementation-specific trigger data. //! @return eARS_SUCCESS if the trigger data was successfully unloaded, eARS_FAILURE otherwise. virtual EAudioRequestStatus UnprepareTriggerSync( - IATLAudioObjectData* const objectData, - const IATLTriggerImplData* const triggerData) = 0; + IATLAudioObjectData* objectData, + const IATLTriggerImplData* triggerData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Prepare a trigger asynchronously for execution. @@ -171,9 +171,9 @@ namespace Audio //! @return eARS_SUCCESS if the trigger prepare event was successfully sent to the audio //! middleware, eARS_FAILURE otherwise. virtual EAudioRequestStatus PrepareTriggerAsync( - IATLAudioObjectData* const objectData, - const IATLTriggerImplData* const triggerData, - IATLEventData* const eventData) = 0; + IATLAudioObjectData* objectData, + const IATLTriggerImplData* triggerData, + IATLEventData* eventData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Unprepare a trigger asynchronously when no longer needed. @@ -186,9 +186,9 @@ namespace Audio //! @return eARS_SUCCESS if the trigger unprepare event was successfully sent to the audio //! middleware, eARS_FAILURE otherwise. virtual EAudioRequestStatus UnprepareTriggerAsync( - IATLAudioObjectData* const pAudioObjectData, - const IATLTriggerImplData* const pTriggerData, - IATLEventData* const pEventData) = 0; + IATLAudioObjectData* pAudioObjectData, + const IATLTriggerImplData* pTriggerData, + IATLEventData* pEventData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Activate a trigger on an audio object. @@ -198,10 +198,10 @@ namespace Audio //! @return eARS_SUCCESS if the trigger was activated and the event posted to the audio //! middleware, eARS_FAILURE otherwise. virtual EAudioRequestStatus ActivateTrigger( - IATLAudioObjectData* const objectData, - const IATLTriggerImplData* const triggerData, - IATLEventData* const tventData, - const SATLSourceData* const sourceData) = 0; + IATLAudioObjectData* objectData, + const IATLTriggerImplData* triggerData, + IATLEventData* tventData, + const SATLSourceData* sourceData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Stop an event active on an audio object. @@ -209,15 +209,15 @@ namespace Audio //! @param eventData Implementation-specific event data. //! @return eARS_SUCCESS if the event was successfully stopped, eARS_FAILURE otherwise. virtual EAudioRequestStatus StopEvent( - IATLAudioObjectData* const objectData, - const IATLEventData* const eventData) = 0; + IATLAudioObjectData* objectData, + const IATLEventData* eventData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Stop all events currently active on an audio object. //! @param objectData Implementation-specific audio object data. //! @return eARS_SUCCESS if the events were successfully stopped, eARS_FAILURE otherwise. virtual EAudioRequestStatus StopAllEvents( - IATLAudioObjectData* const objectData) = 0; + IATLAudioObjectData* objectData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Set the world position of an audio object. @@ -225,7 +225,7 @@ namespace Audio //! @param worldPosition The transform to set the audio object to. //! @return eARS_SUCCESS if the position was successfully set, eARS_FAILURE otherwise. virtual EAudioRequestStatus SetPosition( - IATLAudioObjectData* const objectData, + IATLAudioObjectData* objectData, const SATLWorldPosition& worldPosition) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// @@ -234,7 +234,7 @@ namespace Audio //! @param multiPositions Position parameter object containing world positions. //! @return eARS_SUCCESS if the position's were successfully set, eARS_FAILURE otherwise. virtual EAudioRequestStatus SetMultiplePositions( - IATLAudioObjectData* const objectData, + IATLAudioObjectData* objectData, const MultiPositionParams& multiPositions) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// @@ -244,9 +244,9 @@ namespace Audio //! @param value The value to be set, normally in the range [0.0, 1.0]. //! @return eARS_SUCCESS if the rtpc value was set on the audio object, eARS_FAILURE otherwise. virtual EAudioRequestStatus SetRtpc( - IATLAudioObjectData* const objectData, - const IATLRtpcImplData* const rtpcData, - const float value) = 0; + IATLAudioObjectData* objectData, + const IATLRtpcImplData* rtpcData, + float value) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Set the audio switchstate on a given audio object. @@ -255,8 +255,8 @@ namespace Audio //! @return eARS_SUCCESS if the audio switchstate has been successfully set, eARS_FAILURE //! otherwise. virtual EAudioRequestStatus SetSwitchState( - IATLAudioObjectData* const objectData, - const IATLSwitchStateImplData* const switchStateData) = 0; + IATLAudioObjectData* objectData, + const IATLSwitchStateImplData* switchStateData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Set the Obstruction and Occlusion amounts on a given audio object. @@ -267,9 +267,9 @@ namespace Audio //! Occlusion describes all paths being blocked, direct and environmental reflection paths. //! @return eARS_SUCCESS if the values were set, eARS_FAILURE otherwise. virtual EAudioRequestStatus SetObstructionOcclusion( - IATLAudioObjectData* const objectData, - const float obstruction, - const float occlusion) = 0; + IATLAudioObjectData* objectData, + float obstruction, + float occlusion) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Set the amount of an audio environment associated with an audio object. @@ -278,9 +278,9 @@ namespace Audio //! @param amount The float value to set, in the range [0.0, 1.0]. //! @return eARS_SUCCESS if the environment amount was set, eARS_FAILURE otherwise. virtual EAudioRequestStatus SetEnvironment( - IATLAudioObjectData* const objectData, - const IATLEnvironmentImplData* const environmentData, - const float amount) = 0; + IATLAudioObjectData* objectData, + const IATLEnvironmentImplData* environmentData, + float amount) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Set the world transform of an audio listener. @@ -289,7 +289,7 @@ namespace Audio //! @return eARS_SUCCESS if the audio listener's world transform has been successfully set, //! eARS_FAILURE otherwise. virtual EAudioRequestStatus SetListenerPosition( - IATLListenerData* const listenerData, + IATLListenerData* listenerData, const SATLWorldPosition& newPosition) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// @@ -299,8 +299,8 @@ namespace Audio //! @return eARS_SUCCESS if the provided rtpc has been successfully reset, eARS_FAILURE //! otherwise. virtual EAudioRequestStatus ResetRtpc( - IATLAudioObjectData* const objectData, - const IATLRtpcImplData* const rtpcData) = 0; + IATLAudioObjectData* objectData, + const IATLRtpcImplData* rtpcData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Inform the audio middleware about the memory location of loaded audio data file. @@ -308,7 +308,7 @@ namespace Audio //! registered. //! @return eARS_SUCCESS if the audio middleware successfully registered the file, eARS_FAILURE //! otherwise. - virtual EAudioRequestStatus RegisterInMemoryFile(SATLAudioFileEntryInfo* const audioFileEntry) = 0; + virtual EAudioRequestStatus RegisterInMemoryFile(SATLAudioFileEntryInfo* audioFileEntry) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Inform the audio middleware that the memory containing the audio data file should no longer @@ -316,7 +316,7 @@ namespace Audio //! @param audioFileEntry ATL-specific information describing the file being invalidated. //! @return eARS_SUCCESS if the audio middleware unregistered the file contents, eARS_FAILURE //! otherwise. - virtual EAudioRequestStatus UnregisterInMemoryFile(SATLAudioFileEntryInfo* const audioFileEntry) = 0; + virtual EAudioRequestStatus UnregisterInMemoryFile(SATLAudioFileEntryInfo* audioFileEntry) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Parse the implementation-specific XML node that represents an audio file entry. @@ -329,19 +329,19 @@ namespace Audio //! @return eARS_SUCCESS if the XML node was parsed successfully, eARS_FAILURE otherwise. virtual EAudioRequestStatus ParseAudioFileEntry( const AZ::rapidxml::xml_node* audioFileEntryNode, - SATLAudioFileEntryInfo* const fileEntryInfo) = 0; + SATLAudioFileEntryInfo* fileEntryInfo) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied audio file entry data. //! @param oldAudioFileEntryData Implementation-specific audio file entry data. - virtual void DeleteAudioFileEntryData(IATLAudioFileEntryData* const oldAudioFileEntryData) = 0; + virtual void DeleteAudioFileEntryData(IATLAudioFileEntryData* oldAudioFileEntryData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Get the full path to the folder containing the file described by fileEntryInfo. //! @param fileEntryInfo ATL-specific information describing the file whose location is being //! queried. //! @return A zero-terminated C-string containing the path to the file. - virtual const char* const GetAudioFileLocation(SATLAudioFileEntryInfo* const fileEntryInfo) = 0; + virtual const char* const GetAudioFileLocation(SATLAudioFileEntryInfo* fileEntryInfo) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Parse the implementation-specific XML node that represents an audio trigger. @@ -355,7 +355,7 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied audio trigger object. //! @param oldTriggerData Implementation-specific audio trigger data. - virtual void DeleteAudioTriggerImplData(IATLTriggerImplData* const oldTriggerData) = 0; + virtual void DeleteAudioTriggerImplData(IATLTriggerImplData* oldTriggerData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Parse the implementation-specific XML node that represents an audio rtpc. @@ -368,7 +368,7 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied audio rtpc object. //! @param oldRtpcData Implementation-specific audio rtpc data. - virtual void DeleteAudioRtpcImplData(IATLRtpcImplData* const oldRtpcData) = 0; + virtual void DeleteAudioRtpcImplData(IATLRtpcImplData* oldRtpcData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Parse the implementation-specific XML node that represents an audio switchstate. @@ -383,7 +383,7 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied audio switchstate object. //! @param oldAudioSwitchStateData Implementation-specific audio switchstate data. - virtual void DeleteAudioSwitchStateImplData(IATLSwitchStateImplData* const oldAudioSwitchStateData) = 0; + virtual void DeleteAudioSwitchStateImplData(IATLSwitchStateImplData* oldAudioSwitchStateData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Parse the implementation-specific XML node that represents an audio environment. @@ -398,59 +398,59 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied audio environment object. //! @param oldEnvironmentData Implementation-specific audio environment data. - virtual void DeleteAudioEnvironmentImplData(IATLEnvironmentImplData* const oldEnvironmentData) = 0; + virtual void DeleteAudioEnvironmentImplData(IATLEnvironmentImplData* oldEnvironmentData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Create an implementation-specific global audio object. //! @param objectId Unique ID to assign to the global audio object. //! @return Pointer to the newly created global audio object, or nullptr if it was not created. - virtual IATLAudioObjectData* NewGlobalAudioObjectData(const TAudioObjectID objectId) = 0; + virtual IATLAudioObjectData* NewGlobalAudioObjectData(TAudioObjectID objectId) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Create an implementation-specific audio object. //! @param objectId Unique ID of the audio object. //! @return Pointer to the newly created audio object, or nullptr if it was not created. - virtual IATLAudioObjectData* NewAudioObjectData(const TAudioObjectID objectId) = 0; + virtual IATLAudioObjectData* NewAudioObjectData(TAudioObjectID objectId) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied audio object data. //! @param oldObjectData Implementation-specific audio object data. - virtual void DeleteAudioObjectData(IATLAudioObjectData* const oldObjectData) = 0; + virtual void DeleteAudioObjectData(IATLAudioObjectData* oldObjectData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Create an implementation-specific listener object data that will be the default listener. //! @param objectId Unique ID of the default listener. //! @return Pointer to the newly created default listener object, or nullptr if it was not //! created. - virtual IATLListenerData* NewDefaultAudioListenerObjectData(const TATLIDType objectId) = 0; + virtual IATLListenerData* NewDefaultAudioListenerObjectData(TATLIDType objectId) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Create an implementation-specific listener object data. //! @param objectId Unique ID of the listener. //! @return Pointer to the newly created listener object, or nullptr if it was not created. - virtual IATLListenerData* NewAudioListenerObjectData(const TATLIDType objectId) = 0; + virtual IATLListenerData* NewAudioListenerObjectData(TATLIDType objectId) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied listener object. //! @param oldListenerData Implementation-specific listener object. - virtual void DeleteAudioListenerObjectData(IATLListenerData* const oldListenerData) = 0; + virtual void DeleteAudioListenerObjectData(IATLListenerData* oldListenerData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Create an implementation-specific event object data. //! @param eventId Unique ID for the event. //! @return Pointer to the newly created event object, or nullptr if it was not created. - virtual IATLEventData* NewAudioEventData(const TAudioEventID eventID) = 0; + virtual IATLEventData* NewAudioEventData(TAudioEventID eventID) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Free the memory and resources of the supplied event object. //! @param oldEventData Implementation-specific event object. - virtual void DeleteAudioEventData(IATLEventData* const oldEventData) = 0; + virtual void DeleteAudioEventData(IATLEventData* oldEventData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Reset all the members of an audio event instance without releasing the memory. //! This is used so the event object can be recycled back to the pool. //! @param eventData Implementation-specific event data. - virtual void ResetAudioEventData(IATLEventData* const eventData) = 0; + virtual void ResetAudioEventData(IATLEventData* eventData) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Set the language used by the audio middleware. @@ -458,7 +458,7 @@ namespace Audio //! use a different language. This function does not unload or reload the currently //! loaded audio files. //! @param language A zero-terminated C-string representing the language. - virtual void SetLanguage(const char* const language) = 0; + virtual void SetLanguage(const char* language) = 0; /////////////////////////////////////////////////////////////////////////////////////////////// //! Get the canonical subfolder for this audio middleware implementation. diff --git a/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp b/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp index 56cad4c963..8011a87ed2 100644 --- a/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp +++ b/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp @@ -31,7 +31,6 @@ #include #include -#include namespace Audio { @@ -687,6 +686,7 @@ namespace Audio rayInfo.m_raycastRequest.m_direction = dest - origin; rayInfo.m_raycastRequest.m_distance = rayInfo.m_raycastRequest.m_direction.NormalizeSafeWithLength(); rayInfo.m_raycastRequest.m_maxResults = s_maxHitResultsPerRaycast; + rayInfo.m_raycastRequest.m_reportMultipleHits = true; // Mark as pending rayInfo.m_pending = true; diff --git a/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.h b/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.h index 7d1330744f..e0af4113fc 100644 --- a/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.h +++ b/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.h @@ -21,7 +21,7 @@ #include - #include +#include struct IRenderAuxGeom; @@ -229,11 +229,11 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////////// struct AudioRaycastRequest { - Physics::RayCastRequest m_request{}; + AzPhysics::RayCastRequest m_request{}; TAudioObjectID m_audioObjectId = INVALID_AUDIO_OBJECT_ID; size_t m_rayIndex = 0; - AudioRaycastRequest(const Physics::RayCastRequest& request, TAudioObjectID audioObjectId, size_t rayId) + AudioRaycastRequest(const AzPhysics::RayCastRequest& request, TAudioObjectID audioObjectId, size_t rayId) : m_request(request) , m_audioObjectId(audioObjectId) , m_rayIndex(rayId) @@ -243,11 +243,11 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////////// struct AudioRaycastResult { - AZStd::vector m_result{}; + AZStd::vector m_result{}; TAudioObjectID m_audioObjectId = INVALID_AUDIO_OBJECT_ID; size_t m_rayIndex = 0; - AudioRaycastResult(AZStd::vector&& result, TAudioObjectID audioObjectId, size_t rayId) + AudioRaycastResult(AZStd::vector&& result, TAudioObjectID audioObjectId, size_t rayId) : m_result(AZStd::move(result)) , m_audioObjectId(audioObjectId) , m_rayIndex(rayId) @@ -290,8 +290,8 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////////// struct RaycastInfo { - AZStd::fixed_vector m_hits; - Physics::RayCastRequest m_raycastRequest; + AZStd::fixed_vector m_hits; + AzPhysics::RayCastRequest m_raycastRequest; float m_contribution = 0.f; float m_cacheTimerMs = 0.f; AZ::u16 m_numHits = 0; diff --git a/Gems/AudioSystem/Code/Source/Engine/ATLComponents.cpp b/Gems/AudioSystem/Code/Source/Engine/ATLComponents.cpp index 8c2d687a1b..d595fa9276 100644 --- a/Gems/AudioSystem/Code/Source/Engine/ATLComponents.cpp +++ b/Gems/AudioSystem/Code/Source/Engine/ATLComponents.cpp @@ -24,6 +24,9 @@ #include +#include +#include + #include #include #include @@ -630,10 +633,40 @@ namespace Audio m_raycastRequests.push_back(request); } + AudioRaycastManager::AudioRaycastManager() + : m_sceneFinishSimHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + this->OnPhysicsSubtickFinished(); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Audio)) + { + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneInterface->RegisterSceneSimulationFinishHandler(sceneHandle, m_sceneFinishSimHandler); + } + AudioRaycastRequestBus::Handler::BusConnect(); + } + + AudioRaycastManager::~AudioRaycastManager() + { + AudioRaycastRequestBus::Handler::BusDisconnect(); + m_sceneFinishSimHandler.Disconnect(); + } + /////////////////////////////////////////////////////////////////////////////////////////////////// - void AudioRaycastManager::OnPostPhysicsSubtick([[maybe_unused]] float fixedDeltaTimeSeconds) + void AudioRaycastManager::OnPhysicsSubtickFinished() { // [Main Thread] + AzPhysics::SceneHandle sceneHandle = AzPhysics::InvalidSceneHandle; + auto* sceneInterface = AZ::Interface::Get(); + if (sceneInterface != nullptr) + { + sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + } + AZ_Warning("AudioRaycastManager", sceneHandle != AzPhysics::InvalidSceneHandle, "Unable to retrive default physics scene."); + AudioRaycastRequestQueueType processingQueue; // Lock and swap the main request container with a local one for processing... @@ -651,13 +684,16 @@ namespace Audio AZ_Assert(request.m_request.m_maxResults <= s_maxHitResultsPerRaycast, "Encountered audio raycast request that has maxResults set too high (%" PRIu64 ")!\n", request.m_request.m_maxResults); - AZStd::vector hitResults; - Physics::WorldRequestBus::BroadcastResult(hitResults, &Physics::WorldRequestBus::Events::RayCastMultiple, request.m_request); + AzPhysics::SceneQueryHits hitResults; + if (sceneInterface != nullptr) + { + hitResults = sceneInterface->QueryScene(sceneHandle, &request.m_request); + } - AZ_Error("Audio Raycast", hitResults.size() <= s_maxHitResultsPerRaycast, - "RayCastMultiple returned too many hits (%zu)!\n", hitResults.size()); + AZ_Error("Audio Raycast", hitResults.m_hits.size() <= s_maxHitResultsPerRaycast, + "RayCastMultiple returned too many hits (%zu)!\n", hitResults.m_hits.size()); - resultsQueue.emplace_back(AZStd::move(hitResults), request.m_audioObjectId, request.m_rayIndex); + resultsQueue.emplace_back(AZStd::move(hitResults.m_hits), request.m_audioObjectId, request.m_rayIndex); } // Lock and swap the local results into the target container (or move-append if necessary)... diff --git a/Gems/AudioSystem/Code/Source/Engine/ATLComponents.h b/Gems/AudioSystem/Code/Source/Engine/ATLComponents.h index c488a673b8..e5d88fd111 100644 --- a/Gems/AudioSystem/Code/Source/Engine/ATLComponents.h +++ b/Gems/AudioSystem/Code/Source/Engine/ATLComponents.h @@ -16,8 +16,8 @@ #include #include - #include - #include +#include +#include #include #include @@ -87,30 +87,15 @@ namespace Audio /////////////////////////////////////////////////////////////////////////////////////////////////// class AudioRaycastManager : public AudioRaycastRequestBus::Handler - , public Physics::WorldNotificationBus::Handler { public: - AudioRaycastManager() - { - Physics::WorldNotificationBus::Handler::BusConnect(Physics::DefaultPhysicsWorldId); - AudioRaycastRequestBus::Handler::BusConnect(); - } - - ~AudioRaycastManager() override - { - AudioRaycastRequestBus::Handler::BusDisconnect(); - Physics::WorldNotificationBus::Handler::BusDisconnect(); - } + AudioRaycastManager(); + ~AudioRaycastManager() override; // AudioRaycastRequestBus::Handler interface void PushAudioRaycastRequest(const AudioRaycastRequest& request) override; - // Physics::WorldNotificationBus::Handler interface - void OnPostPhysicsSubtick(float fixedDeltaTimeSeconds) override; - int GetPhysicsTickOrder() override - { - return Physics::WorldNotifications::Audio; - } + void OnPhysicsSubtickFinished(); // Additional functionality related to processing raycasts... void ProcessRaycastResults(float updateIntervalMs); @@ -123,6 +108,8 @@ namespace Audio AZStd::mutex m_raycastResultsMutex; AudioRaycastRequestQueueType m_raycastRequests; AudioRaycastResultQueueType m_raycastResults; + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler; }; diff --git a/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp b/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp index a87ecb0672..7be14244d0 100644 --- a/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp +++ b/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.h b/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.h index 35326cbd15..0e780bd467 100644 --- a/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.h +++ b/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.h @@ -64,7 +64,7 @@ namespace Audio void Release(); void Update(); - virtual TAudioFileEntryID TryAddFileCacheEntry(const AZ::rapidxml::xml_node* fileXmlNode, const EATLDataScope dataScope, bool autoLoad); // 'virtual' is needed for unit tests/mocking + virtual TAudioFileEntryID TryAddFileCacheEntry(const AZ::rapidxml::xml_node* fileXmlNode, EATLDataScope dataScope, bool autoLoad); // 'virtual' is needed for unit tests/mocking bool TryRemoveFileCacheEntry(const TAudioFileEntryID audioFileID, const EATLDataScope dataScope); void UpdateLocalizedFileCacheEntries(); diff --git a/Gems/AudioSystem/Code/Tests/AudioSystemTest.cpp b/Gems/AudioSystem/Code/Tests/AudioSystemTest.cpp index 097010cbc9..9ffae40882 100644 --- a/Gems/AudioSystem/Code/Tests/AudioSystemTest.cpp +++ b/Gems/AudioSystem/Code/Tests/AudioSystemTest.cpp @@ -242,7 +242,7 @@ TEST_F(ATLAudioObjectTest, OnAudioRaycastResults_MultiRaycastZeroDistanceHits_Ze } // maximum number of hits, but we don't set the distance in any of them. - AZStd::vector hits(Audio::s_maxHitResultsPerRaycast); + AZStd::vector hits(Audio::s_maxHitResultsPerRaycast); AudioRaycastResult hitResults(AZStd::move(hits), testAudioObjectId, 0); audioObject.OnAudioRaycastResults(hitResults); @@ -268,7 +268,7 @@ TEST_F(ATLAudioObjectTest, OnAudioRaycastResults_SingleRaycastHit_NonZeroObstruc audioObject.SetRaycastCalcType(eAOOCT_SINGLE_RAY); raycastProcessor.SetupTestRay(0); - AZStd::vector hits(3); // three hits + AZStd::vector hits(3); // three hits hits[0].m_distance = 10.f; hits[1].m_distance = 11.f; hits[2].m_distance = 12.f; @@ -301,7 +301,7 @@ TEST_F(ATLAudioObjectTest, OnAudioRaycastResults_MultiRaycastHit_NonZeroOcclusio raycastProcessor.SetupTestRay(i); } - AZStd::vector hits(3); // three hits + AZStd::vector hits(3); // three hits hits[0].m_distance = 10.f; hits[1].m_distance = 11.f; hits[2].m_distance = 12.f; @@ -349,10 +349,11 @@ TEST(AudioRaycastManagerTest, AudioRaycastRequest_FullProcessFlow_CorrectRequest { AudioRaycastManager_Test raycastManager; - Physics::RayCastRequest physicsRequest; + AzPhysics::RayCastRequest physicsRequest; physicsRequest.m_direction = AZ::Vector3::CreateAxisX(); physicsRequest.m_distance = 5.f; physicsRequest.m_maxResults = Audio::s_maxHitResultsPerRaycast; + physicsRequest.m_reportMultipleHits = true; AudioRaycastRequest raycastRequest(AZStd::move(physicsRequest), testAudioObjectId, 0); @@ -364,7 +365,7 @@ TEST(AudioRaycastManagerTest, AudioRaycastRequest_FullProcessFlow_CorrectRequest EXPECT_EQ(1, raycastManager.GetNumRequests()); EXPECT_EQ(0, raycastManager.GetNumResults()); - raycastManager.OnPostPhysicsSubtick(0.017f); // seconds + raycastManager.OnPhysicsSubtickFinished(); EXPECT_EQ(0, raycastManager.GetNumRequests()); EXPECT_EQ(1, raycastManager.GetNumResults()); diff --git a/Gems/AudioSystem/Code/Tests/Mocks/FileCacheManagerMock.h b/Gems/AudioSystem/Code/Tests/Mocks/FileCacheManagerMock.h index c292487a8b..6377d61381 100644 --- a/Gems/AudioSystem/Code/Tests/Mocks/FileCacheManagerMock.h +++ b/Gems/AudioSystem/Code/Tests/Mocks/FileCacheManagerMock.h @@ -31,7 +31,7 @@ namespace Audio MOCK_METHOD0(Release, void()); MOCK_METHOD0(Update, void()); - MOCK_METHOD3(TryAddFileCacheEntry, TAudioFileEntryID(const AZ::rapidxml::xml_node*, const EATLDataScope, const bool)); + MOCK_METHOD3(TryAddFileCacheEntry, TAudioFileEntryID(const AZ::rapidxml::xml_node*, EATLDataScope, bool)); MOCK_METHOD2(TryRemoveFileCacheEntry, bool(const TAudioFileEntryID, const EATLDataScope)); MOCK_METHOD0(UpdateLocalizedFileCacheEntries, void()); diff --git a/Gems/AudioSystem/Code/Tests/Mocks/IAudioSystemImplementationMock.h b/Gems/AudioSystem/Code/Tests/Mocks/IAudioSystemImplementationMock.h index 9ca057dea1..2b192bed5e 100644 --- a/Gems/AudioSystem/Code/Tests/Mocks/IAudioSystemImplementationMock.h +++ b/Gems/AudioSystem/Code/Tests/Mocks/IAudioSystemImplementationMock.h @@ -22,7 +22,7 @@ namespace Audio : public AudioSystemImplementation { public: - MOCK_METHOD1(Update, void(const float)); + MOCK_METHOD1(Update, void(float)); MOCK_METHOD0(Initialize, EAudioRequestStatus()); @@ -42,89 +42,89 @@ namespace Audio MOCK_METHOD0(StopAllSounds, EAudioRequestStatus()); - MOCK_METHOD2(RegisterAudioObject, EAudioRequestStatus(IATLAudioObjectData* const, const char* const)); + MOCK_METHOD2(RegisterAudioObject, EAudioRequestStatus(IATLAudioObjectData*, const char*)); - MOCK_METHOD1(RegisterAudioObject, EAudioRequestStatus(IATLAudioObjectData* const)); + MOCK_METHOD1(RegisterAudioObject, EAudioRequestStatus(IATLAudioObjectData*)); - MOCK_METHOD1(UnregisterAudioObject, EAudioRequestStatus(IATLAudioObjectData* const)); + MOCK_METHOD1(UnregisterAudioObject, EAudioRequestStatus(IATLAudioObjectData*)); - MOCK_METHOD1(ResetAudioObject, EAudioRequestStatus(IATLAudioObjectData* const)); + MOCK_METHOD1(ResetAudioObject, EAudioRequestStatus(IATLAudioObjectData*)); - MOCK_METHOD1(UpdateAudioObject, EAudioRequestStatus(IATLAudioObjectData* const)); + MOCK_METHOD1(UpdateAudioObject, EAudioRequestStatus(IATLAudioObjectData*)); - MOCK_METHOD2(PrepareTriggerSync, EAudioRequestStatus(IATLAudioObjectData* const, const IATLTriggerImplData* const)); + MOCK_METHOD2(PrepareTriggerSync, EAudioRequestStatus(IATLAudioObjectData*, const IATLTriggerImplData*)); - MOCK_METHOD2(UnprepareTriggerSync, EAudioRequestStatus(IATLAudioObjectData* const, const IATLTriggerImplData* const)); + MOCK_METHOD2(UnprepareTriggerSync, EAudioRequestStatus(IATLAudioObjectData*, const IATLTriggerImplData*)); - MOCK_METHOD3(PrepareTriggerAsync, EAudioRequestStatus(IATLAudioObjectData* const, const IATLTriggerImplData* const, IATLEventData* const)); + MOCK_METHOD3(PrepareTriggerAsync, EAudioRequestStatus(IATLAudioObjectData*, const IATLTriggerImplData*, IATLEventData*)); - MOCK_METHOD3(UnprepareTriggerAsync, EAudioRequestStatus(IATLAudioObjectData* const, const IATLTriggerImplData* const, IATLEventData* const)); + MOCK_METHOD3(UnprepareTriggerAsync, EAudioRequestStatus(IATLAudioObjectData*, const IATLTriggerImplData*, IATLEventData*)); - MOCK_METHOD4(ActivateTrigger, EAudioRequestStatus(IATLAudioObjectData* const, const IATLTriggerImplData* const, IATLEventData* const, const SATLSourceData* const)); + MOCK_METHOD4(ActivateTrigger, EAudioRequestStatus(IATLAudioObjectData*, const IATLTriggerImplData*, IATLEventData*, const SATLSourceData*)); - MOCK_METHOD2(StopEvent, EAudioRequestStatus(IATLAudioObjectData* const, const IATLEventData* const)); + MOCK_METHOD2(StopEvent, EAudioRequestStatus(IATLAudioObjectData*, const IATLEventData*)); - MOCK_METHOD1(StopAllEvents, EAudioRequestStatus(IATLAudioObjectData* const)); + MOCK_METHOD1(StopAllEvents, EAudioRequestStatus(IATLAudioObjectData*)); - MOCK_METHOD2(SetPosition, EAudioRequestStatus(IATLAudioObjectData* const, const SATLWorldPosition&)); + MOCK_METHOD2(SetPosition, EAudioRequestStatus(IATLAudioObjectData*, const SATLWorldPosition&)); - MOCK_METHOD2(SetMultiplePositions, EAudioRequestStatus(IATLAudioObjectData* const, const MultiPositionParams&)); + MOCK_METHOD2(SetMultiplePositions, EAudioRequestStatus(IATLAudioObjectData*, const MultiPositionParams&)); - MOCK_METHOD3(SetRtpc, EAudioRequestStatus(IATLAudioObjectData* const, const IATLRtpcImplData* const, const float)); + MOCK_METHOD3(SetRtpc, EAudioRequestStatus(IATLAudioObjectData*, const IATLRtpcImplData*, float)); - MOCK_METHOD2(SetSwitchState, EAudioRequestStatus(IATLAudioObjectData* const, const IATLSwitchStateImplData* const)); + MOCK_METHOD2(SetSwitchState, EAudioRequestStatus(IATLAudioObjectData*, const IATLSwitchStateImplData*)); - MOCK_METHOD3(SetObstructionOcclusion, EAudioRequestStatus(IATLAudioObjectData* const, const float, const float)); + MOCK_METHOD3(SetObstructionOcclusion, EAudioRequestStatus(IATLAudioObjectData*, float, float)); - MOCK_METHOD3(SetEnvironment, EAudioRequestStatus(IATLAudioObjectData* const, const IATLEnvironmentImplData* const, const float)); + MOCK_METHOD3(SetEnvironment, EAudioRequestStatus(IATLAudioObjectData*, const IATLEnvironmentImplData*, float)); - MOCK_METHOD2(SetListenerPosition, EAudioRequestStatus(IATLListenerData* const, const SATLWorldPosition&)); + MOCK_METHOD2(SetListenerPosition, EAudioRequestStatus(IATLListenerData*, const SATLWorldPosition&)); - MOCK_METHOD1(RegisterInMemoryFile, EAudioRequestStatus(SATLAudioFileEntryInfo* const)); + MOCK_METHOD1(RegisterInMemoryFile, EAudioRequestStatus(SATLAudioFileEntryInfo*)); - MOCK_METHOD1(UnregisterInMemoryFile, EAudioRequestStatus(SATLAudioFileEntryInfo* const)); + MOCK_METHOD1(UnregisterInMemoryFile, EAudioRequestStatus(SATLAudioFileEntryInfo*)); - MOCK_METHOD2(ParseAudioFileEntry, EAudioRequestStatus(const AZ::rapidxml::xml_node*, SATLAudioFileEntryInfo* const)); + MOCK_METHOD2(ParseAudioFileEntry, EAudioRequestStatus(const AZ::rapidxml::xml_node*, SATLAudioFileEntryInfo*)); - MOCK_METHOD1(DeleteAudioFileEntryData, void(IATLAudioFileEntryData* const)); + MOCK_METHOD1(DeleteAudioFileEntryData, void(IATLAudioFileEntryData*)); - MOCK_METHOD1(GetAudioFileLocation, const char* const(SATLAudioFileEntryInfo* const)); + MOCK_METHOD1(GetAudioFileLocation, const char* const(SATLAudioFileEntryInfo*)); MOCK_METHOD1(NewAudioTriggerImplData, IATLTriggerImplData*(const AZ::rapidxml::xml_node*)); - MOCK_METHOD1(DeleteAudioTriggerImplData, void(IATLTriggerImplData* const)); + MOCK_METHOD1(DeleteAudioTriggerImplData, void(IATLTriggerImplData*)); MOCK_METHOD1(NewAudioRtpcImplData, IATLRtpcImplData*(const AZ::rapidxml::xml_node*)); - MOCK_METHOD1(DeleteAudioRtpcImplData, void(IATLRtpcImplData* const)); + MOCK_METHOD1(DeleteAudioRtpcImplData, void(IATLRtpcImplData*)); MOCK_METHOD1(NewAudioSwitchStateImplData, IATLSwitchStateImplData*(const AZ::rapidxml::xml_node*)); - MOCK_METHOD1(DeleteAudioSwitchStateImplData, void(IATLSwitchStateImplData* const)); + MOCK_METHOD1(DeleteAudioSwitchStateImplData, void(IATLSwitchStateImplData*)); MOCK_METHOD1(NewAudioEnvironmentImplData, IATLEnvironmentImplData*(const AZ::rapidxml::xml_node*)); - MOCK_METHOD1(DeleteAudioEnvironmentImplData, void(IATLEnvironmentImplData* const)); + MOCK_METHOD1(DeleteAudioEnvironmentImplData, void(IATLEnvironmentImplData*)); - MOCK_METHOD1(NewGlobalAudioObjectData, IATLAudioObjectData*(const TAudioObjectID)); + MOCK_METHOD1(NewGlobalAudioObjectData, IATLAudioObjectData*(TAudioObjectID)); - MOCK_METHOD1(NewAudioObjectData, IATLAudioObjectData*(const TAudioObjectID)); + MOCK_METHOD1(NewAudioObjectData, IATLAudioObjectData*(TAudioObjectID)); - MOCK_METHOD1(DeleteAudioObjectData, void(IATLAudioObjectData* const)); + MOCK_METHOD1(DeleteAudioObjectData, void(IATLAudioObjectData*)); - MOCK_METHOD1(NewDefaultAudioListenerObjectData, IATLListenerData*(const TATLIDType)); + MOCK_METHOD1(NewDefaultAudioListenerObjectData, IATLListenerData*(TATLIDType)); - MOCK_METHOD1(NewAudioListenerObjectData, IATLListenerData*(const TATLIDType)); + MOCK_METHOD1(NewAudioListenerObjectData, IATLListenerData*(TATLIDType)); - MOCK_METHOD1(DeleteAudioListenerObjectData, void(IATLListenerData* const)); + MOCK_METHOD1(DeleteAudioListenerObjectData, void(IATLListenerData*)); - MOCK_METHOD1(NewAudioEventData, IATLEventData*(const TAudioEventID)); + MOCK_METHOD1(NewAudioEventData, IATLEventData*(TAudioEventID)); - MOCK_METHOD1(DeleteAudioEventData, void(IATLEventData* const)); + MOCK_METHOD1(DeleteAudioEventData, void(IATLEventData*)); - MOCK_METHOD1(ResetAudioEventData, void(IATLEventData* const)); + MOCK_METHOD1(ResetAudioEventData, void(IATLEventData*)); - MOCK_METHOD1(SetLanguage, void(const char* const)); + MOCK_METHOD1(SetLanguage, void(const char*)); MOCK_CONST_METHOD0(GetImplSubPath, const char* const()); diff --git a/Gems/Blast/Code/CMakeLists.txt b/Gems/Blast/Code/CMakeLists.txt index d06ac4a687..aabb6646aa 100644 --- a/Gems/Blast/Code/CMakeLists.txt +++ b/Gems/Blast/Code/CMakeLists.txt @@ -130,7 +130,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) PRIVATE AZ::AzTestShared AZ::AzTest - AZ::AzPhysicsTests Gem::Atom_Feature_Common.Tests Gem::Blast.Static ) @@ -155,7 +154,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) 3rdParty::Qt::Test AZ::AzTestShared AZ::AzTest - AZ::AzPhysicsTests AZ::AzToolsFrameworkTestCommon Gem::Blast.Editor.Static ) diff --git a/Gems/Blast/Code/Editor/SettingsWidget.h b/Gems/Blast/Code/Editor/SettingsWidget.h index dacd101460..8d255037f3 100644 --- a/Gems/Blast/Code/Editor/SettingsWidget.h +++ b/Gems/Blast/Code/Editor/SettingsWidget.h @@ -13,7 +13,6 @@ #pragma once #if !defined(Q_MOC_RUN) -#include #include #include #include diff --git a/Gems/Blast/Code/Include/Blast/BlastActor.h b/Gems/Blast/Code/Include/Blast/BlastActor.h index 70a5b884b4..4fb88b77ec 100644 --- a/Gems/Blast/Code/Include/Blast/BlastActor.h +++ b/Gems/Blast/Code/Include/Blast/BlastActor.h @@ -11,14 +11,18 @@ */ #pragma once +#include #include #include -#include - #include #include +namespace AzPhysics +{ + struct SimulatedBody; +} + namespace AZ { class Transform; @@ -47,8 +51,8 @@ namespace Blast virtual AZ::Transform GetTransform() const = 0; virtual const BlastFamily& GetFamily() const = 0; virtual Nv::Blast::TkActor& GetTkActor() const = 0; - virtual Physics::WorldBody* GetWorldBody() = 0; - virtual const Physics::WorldBody* GetWorldBody() const = 0; + virtual AzPhysics::SimulatedBody* GetWorldBody() = 0; + virtual const AzPhysics::SimulatedBody* GetWorldBody() const = 0; virtual const AZ::Entity* GetEntity() const = 0; virtual const AZStd::vector& GetChunkIndices() const = 0; virtual bool IsStatic() const = 0; diff --git a/Gems/Blast/Code/Include/Blast/BlastActorData.h b/Gems/Blast/Code/Include/Blast/BlastActorData.h index c5bce195d9..36bad1db3f 100644 --- a/Gems/Blast/Code/Include/Blast/BlastActorData.h +++ b/Gems/Blast/Code/Include/Blast/BlastActorData.h @@ -12,6 +12,7 @@ #pragma once #include +#include #include #include diff --git a/Gems/Blast/Code/Source/Actor/BlastActorDesc.h b/Gems/Blast/Code/Source/Actor/BlastActorDesc.h index 597879f20e..a58fbd04df 100644 --- a/Gems/Blast/Code/Source/Actor/BlastActorDesc.h +++ b/Gems/Blast/Code/Source/Actor/BlastActorDesc.h @@ -12,7 +12,8 @@ #pragma once #include -#include +#include +#include namespace Nv::Blast { @@ -31,7 +32,7 @@ namespace Blast Physics::MaterialId m_physicsMaterialId; AZ::Vector3 m_parentLinearVelocity = AZ::Vector3::CreateZero(); AZ::Vector3 m_parentCenterOfMass = AZ::Vector3::CreateZero(); - Physics::RigidBodyConfiguration m_bodyConfiguration; //! Either rigid dynamic or rigid static + AzPhysics::RigidBodyConfiguration m_bodyConfiguration; //! Either rigid dynamic or rigid static AZStd::vector m_chunkIndices; //! Chunks that are going to simulate this actor. AZStd::shared_ptr m_entity; //! Entity that the actor should use to simulate rigid body bool m_isStatic = false; //! Denotes whether actor should be simulated by a static or dynamic rigid body. diff --git a/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp b/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp index d45e741b35..c7c1c5a12e 100644 --- a/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp +++ b/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -75,7 +74,7 @@ namespace Blast // Set initial velocities if we're not static if (!m_isStatic) { - Physics::RigidBody* rigidBody = nullptr; + AzPhysics::RigidBody* rigidBody = nullptr; Physics::RigidBodyRequestBus::EventResult( rigidBody, m_entity->GetId(), &Physics::RigidBodyRequests::GetRigidBody); rigidBody->SetTransform(transform); @@ -178,17 +177,17 @@ namespace Blast return m_tkActor; } - Physics::WorldBody* BlastActorImpl::GetWorldBody() + AzPhysics::SimulatedBody* BlastActorImpl::GetWorldBody() { - Physics::WorldBody* worldBody = nullptr; + AzPhysics::SimulatedBody* worldBody = nullptr; Physics::WorldBodyRequestBus::EventResult( worldBody, m_entity->GetId(), &Physics::WorldBodyRequests::GetWorldBody); return worldBody; } - const Physics::WorldBody* BlastActorImpl::GetWorldBody() const + const AzPhysics::SimulatedBody* BlastActorImpl::GetWorldBody() const { - Physics::WorldBody* worldBody = nullptr; + AzPhysics::SimulatedBody* worldBody = nullptr; Physics::WorldBodyRequestBus::EventResult( worldBody, m_entity->GetId(), &Physics::WorldBodyRequests::GetWorldBody); return worldBody; diff --git a/Gems/Blast/Code/Source/Actor/BlastActorImpl.h b/Gems/Blast/Code/Source/Actor/BlastActorImpl.h index 9cafaa6140..3b9b77652a 100644 --- a/Gems/Blast/Code/Source/Actor/BlastActorImpl.h +++ b/Gems/Blast/Code/Source/Actor/BlastActorImpl.h @@ -45,8 +45,8 @@ namespace Blast const AZStd::vector& GetChunkIndices() const override; bool IsStatic() const override; - Physics::WorldBody* GetWorldBody() override; - const Physics::WorldBody* GetWorldBody() const override; + AzPhysics::SimulatedBody* GetWorldBody() override; + const AzPhysics::SimulatedBody* GetWorldBody() const override; protected: //! We want to be able to override this function for testing purposes, because @@ -77,6 +77,6 @@ namespace Blast Physics::MaterialId m_physicsMaterialId; AZ::Vector3 m_parentLinearVelocity = AZ::Vector3::CreateZero(); AZ::Vector3 m_parentCenterOfMass = AZ::Vector3::CreateZero(); - Physics::RigidBodyConfiguration m_bodyConfiguration; + AzPhysics::RigidBodyConfiguration m_bodyConfiguration; }; } // namespace Blast diff --git a/Gems/Blast/Code/Source/Actor/ShapesProvider.cpp b/Gems/Blast/Code/Source/Actor/ShapesProvider.cpp index 18b8e09d71..42bdd773f7 100644 --- a/Gems/Blast/Code/Source/Actor/ShapesProvider.cpp +++ b/Gems/Blast/Code/Source/Actor/ShapesProvider.cpp @@ -15,7 +15,7 @@ namespace Blast { - ShapesProvider::ShapesProvider(AZ::EntityId entityId, Physics::RigidBodyConfiguration configuration) + ShapesProvider::ShapesProvider(AZ::EntityId entityId, AzPhysics::RigidBodyConfiguration configuration) : m_entityId(entityId) , m_configuration(configuration) { @@ -42,13 +42,13 @@ namespace Blast m_shapes.push_back(shape); } - Physics::RigidBodyConfiguration ShapesProvider::GetRigidBodyConfiguration() + AzPhysics::RigidBodyConfiguration ShapesProvider::GetRigidBodyConfiguration() { return m_configuration; } - Physics::WorldBodyConfiguration ShapesProvider::GetWorldBodyConfiguration() + AzPhysics::SimulatedBodyConfiguration ShapesProvider::GetSimulatedBodyConfiguration() { - return static_cast(m_configuration); + return static_cast(m_configuration); } } // namespace Blast diff --git a/Gems/Blast/Code/Source/Actor/ShapesProvider.h b/Gems/Blast/Code/Source/Actor/ShapesProvider.h index 5df084f79e..00a385a790 100644 --- a/Gems/Blast/Code/Source/Actor/ShapesProvider.h +++ b/Gems/Blast/Code/Source/Actor/ShapesProvider.h @@ -12,6 +12,7 @@ #pragma once #include +#include #include namespace Blast @@ -22,7 +23,7 @@ namespace Blast , public PhysX::BodyConfigurationComponentBus::Handler { public: - ShapesProvider(AZ::EntityId entityId, Physics::RigidBodyConfiguration configuration); + ShapesProvider(AZ::EntityId entityId, AzPhysics::RigidBodyConfiguration configuration); ~ShapesProvider(); void AddShape(AZStd::shared_ptr shape); @@ -32,14 +33,14 @@ namespace Blast AZStd::vector> GetShapes() override; - Physics::RigidBodyConfiguration GetRigidBodyConfiguration() override; + AzPhysics::RigidBodyConfiguration GetRigidBodyConfiguration() override; - Physics::WorldBodyConfiguration GetWorldBodyConfiguration() override; + AzPhysics::SimulatedBodyConfiguration GetSimulatedBodyConfiguration() override; private: AZStd::vector> m_shapes; AZ::EntityId m_entityId; - Physics::RigidBodyConfiguration m_configuration; + AzPhysics::RigidBodyConfiguration m_configuration; }; AZ_POP_DISABLE_WARNING } // namespace Blast diff --git a/Gems/Blast/Code/Source/Components/BlastFamilyComponent.cpp b/Gems/Blast/Code/Source/Components/BlastFamilyComponent.cpp index e898e45ad4..90bcb633bc 100644 --- a/Gems/Blast/Code/Source/Components/BlastFamilyComponent.cpp +++ b/Gems/Blast/Code/Source/Components/BlastFamilyComponent.cpp @@ -21,7 +21,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -203,7 +204,13 @@ namespace Blast { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::System); - Physics::CollisionNotificationBus::MultiHandler::BusDisconnect(); + // cleanup collision handlers + for (auto& itr : m_collisionHandlers) + { + itr.second.Disconnect(); + } + m_collisionHandlers.clear(); + BlastFamilyDamageRequestBus::MultiHandler::BusDisconnect(); BlastFamilyComponentRequestBus::Handler::BusDisconnect(); @@ -391,7 +398,7 @@ namespace Blast } } - void BlastFamilyComponent::OnCollisionBegin(const Physics::CollisionEvent& collisionEvent) + void BlastFamilyComponent::OnCollisionBegin(const AzPhysics::CollisionEvent& collisionEvent) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Physics); @@ -481,14 +488,18 @@ namespace Blast auto worldBody = actor->GetWorldBody(); if (actor->IsStatic()) { - auto gravity = worldBody->GetWorld()->GetGravity(); + AZ::Vector3 gravity = AzPhysics::DefaultGravity; + if (auto* sceneInterface = AZ::Interface::Get()) + { + gravity = sceneInterface->GetGravity(worldBody->m_sceneOwner); + } auto localGravity = worldBody->GetTransform().GetRotation().GetInverseFull().TransformVector(gravity); m_solver->addGravityForce(*actor->GetTkActor().getActorLL(), Convert(localGravity)); } else { - auto rigidBody = static_cast(worldBody); + auto* rigidBody = static_cast(worldBody); auto localCenterMass = rigidBody->GetCenterOfMassLocal(); auto localAngularVelocity = worldBody->GetTransform().GetRotation().GetInverseFull().TransformVector( @@ -516,8 +527,21 @@ namespace Blast { m_actorRenderManager->OnActorCreated(actor); m_solver->notifyActorCreated(*actor.GetTkActor().getActorLL()); - - Physics::CollisionNotificationBus::MultiHandler::BusConnect(actor.GetEntity()->GetId()); + + if (auto* physicsSystem = AZ::Interface::Get()) + { + AZStd::pair foundBody = physicsSystem->FindAttachedBodyHandleFromEntityId(actor.GetEntity()->GetId()); + if (foundBody.first != AzPhysics::InvalidSceneHandle) + { + AzPhysics::SimulatedBodyEvents::OnCollisionBegin::Handler collisionHandler = AzPhysics::SimulatedBodyEvents::OnCollisionBegin::Handler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, const AzPhysics::CollisionEvent& event) + { + OnCollisionBegin(event); + }); + CollisionHandlersMap::pair_iter_bool newHandlerItr = m_collisionHandlers.emplace(actor.GetEntity()->GetId(), collisionHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(foundBody.first, foundBody.second, newHandlerItr.first->second); + } + } BlastFamilyDamageRequestBus::MultiHandler::BusConnect(actor.GetEntity()->GetId()); BlastFamilyComponentNotificationBus::Event( GetEntityId(), &BlastFamilyComponentNotifications::OnActorCreated, actor); @@ -528,7 +552,13 @@ namespace Blast BlastFamilyComponentNotificationBus::Event( GetEntityId(), &BlastFamilyComponentNotifications::OnActorDestroyed, actor); BlastFamilyDamageRequestBus::MultiHandler::BusDisconnect(actor.GetEntity()->GetId()); - Physics::CollisionNotificationBus::MultiHandler::BusDisconnect(actor.GetEntity()->GetId()); + + if (CollisionHandlersMapItr foundHandler = m_collisionHandlers.find(actor.GetEntity()->GetId()); + foundHandler != m_collisionHandlers.end()) + { + foundHandler->second.Disconnect(); + m_collisionHandlers.erase(foundHandler); + } m_solver->notifyActorDestroyed(*actor.GetTkActor().getActorLL()); m_actorRenderManager->OnActorDestroyed(actor); diff --git a/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h b/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h index 62bbd7223f..13c9c4096a 100644 --- a/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h +++ b/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h @@ -11,11 +11,12 @@ */ #pragma once -#include +#include +#include #include #include #include -#include +#include #include #include #include @@ -27,6 +28,11 @@ #include #include +namespace AzPhysics +{ + struct CollisionEvent; +} + namespace Blast { //! Component that handles simulation of the Blast family. @@ -35,7 +41,6 @@ namespace Blast , public BlastFamilyDamageRequestBus::MultiHandler , public BlastFamilyComponentRequestBus::Handler , protected BlastListener - , protected Physics::CollisionNotificationBus::MultiHandler { public: AZ_COMPONENT(BlastFamilyComponent, "{88ECE087-C88A-4A83-A83C-477BA9C13221}", AZ::Component); @@ -94,7 +99,7 @@ namespace Blast void OnActorDestroyed(const BlastFamily& family, const BlastActor& actor) override; // Dispatched when two shapes start colliding. - void OnCollisionBegin(const Physics::CollisionEvent& collisionEvent) override; + void OnCollisionBegin(const AzPhysics::CollisionEvent& collisionEvent); // Logic processors AZStd::unique_ptr m_damageManager; @@ -114,5 +119,9 @@ namespace Blast bool m_isSpawned = false; bool m_shouldSpawnOnAssetLoad = false; DebugRenderMode m_debugRenderMode; + + using CollisionHandlersMap = AZStd::unordered_map; + using CollisionHandlersMapItr = CollisionHandlersMap::iterator; + CollisionHandlersMap m_collisionHandlers; }; } // namespace Blast diff --git a/Gems/Blast/Code/Source/Components/BlastMeshDataComponent.h b/Gems/Blast/Code/Source/Components/BlastMeshDataComponent.h index de1df45823..409f1baac4 100644 --- a/Gems/Blast/Code/Source/Components/BlastMeshDataComponent.h +++ b/Gems/Blast/Code/Source/Components/BlastMeshDataComponent.h @@ -11,7 +11,7 @@ */ #pragma once -#include +#include #include #include #include diff --git a/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp b/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp index 85256bc450..deb6362ee3 100644 --- a/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp +++ b/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/Gems/Blast/Code/Source/Family/ActorTracker.cpp b/Gems/Blast/Code/Source/Family/ActorTracker.cpp index 9749005517..5ceae87cd6 100644 --- a/Gems/Blast/Code/Source/Family/ActorTracker.cpp +++ b/Gems/Blast/Code/Source/Family/ActorTracker.cpp @@ -12,6 +12,7 @@ #include +#include #include #include @@ -40,7 +41,7 @@ namespace Blast return nullptr; } - BlastActor* ActorTracker::GetActorByBody(const Physics::WorldBody* body) + BlastActor* ActorTracker::GetActorByBody(const AzPhysics::SimulatedBody* body) { if (const auto it = m_bodyToActor.find(body); it != m_bodyToActor.end()) { diff --git a/Gems/Blast/Code/Source/Family/ActorTracker.h b/Gems/Blast/Code/Source/Family/ActorTracker.h index 91d7a4931c..a80faff289 100644 --- a/Gems/Blast/Code/Source/Family/ActorTracker.h +++ b/Gems/Blast/Code/Source/Family/ActorTracker.h @@ -12,7 +12,9 @@ #pragma once #include +#include #include +#include #include namespace Blast @@ -30,13 +32,13 @@ namespace Blast void RemoveActor(BlastActor* actor); [[nodiscard]] BlastActor* GetActorById(AZ::EntityId entityId); - [[nodiscard]] BlastActor* GetActorByBody(const Physics::WorldBody* body); + [[nodiscard]] BlastActor* GetActorByBody(const AzPhysics::SimulatedBody* body); [[nodiscard]] BlastActor* FindClosestActor(const AZ::Vector3& position); [[nodiscard]] const AZStd::unordered_set& GetActors() const; private: AZStd::unordered_set m_actors; AZStd::unordered_map m_entityIdToActor; - AZStd::unordered_map m_bodyToActor; + AZStd::unordered_map m_bodyToActor; }; } // namespace Blast diff --git a/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp b/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp index e6417d6067..2b3f2fcc82 100644 --- a/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp +++ b/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp @@ -166,7 +166,7 @@ namespace Blast const uint32_t newActorsCount = splitEvent->numChildren; BlastActor* parentActor = nullptr; - Physics::WorldBody* parentBody = nullptr; + AzPhysics::SimulatedBody* parentBody = nullptr; AZ_Assert(splitEvent->parentData.userData, "Parent actor in split event must have user data."); if (!splitEvent->parentData.userData) { @@ -217,18 +217,18 @@ namespace Blast } BlastActorDesc BlastFamilyImpl::CalculateActorDesc( - Physics::WorldBody* parentBody, bool parentStatic, AZ::Transform parentTransform, Nv::Blast::TkActor* tkActor) + AzPhysics::SimulatedBody* parentBody, bool parentStatic, AZ::Transform parentTransform, Nv::Blast::TkActor* tkActor) { auto actorDesc = CalculateActorDesc(parentTransform, tkActor); actorDesc.m_bodyConfiguration.m_initialAngularVelocity = !parentStatic - ? static_cast(parentBody)->GetAngularVelocity() + ? static_cast(parentBody)->GetAngularVelocity() : AZ::Vector3::CreateZero(); actorDesc.m_parentCenterOfMass = parentTransform.TransformPoint( - !parentStatic ? static_cast(parentBody)->GetCenterOfMassLocal() + !parentStatic ? static_cast(parentBody)->GetCenterOfMassLocal() : AZ::Vector3::CreateZero()); actorDesc.m_parentLinearVelocity = !parentStatic - ? static_cast(parentBody)->GetLinearVelocity() + ? static_cast(parentBody)->GetLinearVelocity() : AZ::Vector3::CreateZero(); return actorDesc; @@ -236,7 +236,7 @@ namespace Blast BlastActorDesc BlastFamilyImpl::CalculateActorDesc(const AZ::Transform& transform, Nv::Blast::TkActor* tkActor) { - Physics::RigidBodyConfiguration configuration; + AzPhysics::RigidBodyConfiguration configuration; configuration.m_position = transform.GetTranslation(); configuration.m_orientation = transform.GetRotation(); configuration.m_scale = transform.GetScale(); diff --git a/Gems/Blast/Code/Source/Family/BlastFamilyImpl.h b/Gems/Blast/Code/Source/Family/BlastFamilyImpl.h index 1621dfaf53..7903217cd2 100644 --- a/Gems/Blast/Code/Source/Family/BlastFamilyImpl.h +++ b/Gems/Blast/Code/Source/Family/BlastFamilyImpl.h @@ -70,7 +70,7 @@ namespace Blast // Calculates actor description for an actor that has a parent. BlastActorDesc CalculateActorDesc( - Physics::WorldBody* parentBody, bool parentStatic, AZ::Transform parentTransform, + AzPhysics::SimulatedBody* parentBody, bool parentStatic, AZ::Transform parentTransform, Nv::Blast::TkActor* tkActor); // Calculates actor description for an actor that does not have a parent. diff --git a/Gems/Blast/Code/Source/Family/DamageManager.cpp b/Gems/Blast/Code/Source/Family/DamageManager.cpp index aead91b8a3..1f275b99a6 100644 --- a/Gems/Blast/Code/Source/Family/DamageManager.cpp +++ b/Gems/Blast/Code/Source/Family/DamageManager.cpp @@ -13,8 +13,8 @@ #include -#include -#include +#include + #include #include #include @@ -130,57 +130,76 @@ namespace Blast } AZStd::vector DamageManager::OverlapSphere( - ActorTracker& actorTracker, const float radius, const AZ::Transform& pose) + [[maybe_unused]] ActorTracker& actorTracker, [[maybe_unused]] const float radius, [[maybe_unused]] const AZ::Transform& pose) { - AZStd::shared_ptr defaultWorld; - Physics::DefaultWorldBus::BroadcastResult(defaultWorld, &Physics::DefaultWorldRequests::GetDefaultWorld); - - auto overlapHits = defaultWorld->OverlapSphere( - radius, pose, - [&actorTracker](const Physics::WorldBody* worldBody, [[maybe_unused]] const Physics::Shape* shape) -> bool - { - return actorTracker.GetActorByBody(worldBody) != nullptr; - }); - AZStd::vector overlappedActors; - AZStd::transform( - overlapHits.begin(), overlapHits.end(), AZStd::back_inserter(overlappedActors), - [&actorTracker](const Physics::OverlapHit& overlapHit) -> BlastActor* + if (auto* sceneInterface = AZ::Interface::Get()) + { + if (AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneHandle != AzPhysics::InvalidSceneHandle) { - return actorTracker.GetActorByBody(overlapHit.m_body); - }); - + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateSphereOverlapRequest( + radius, + pose, + [&actorTracker](const AzPhysics::SimulatedBody* worldBody, [[maybe_unused]] const Physics::Shape* shape) -> bool + { + return actorTracker.GetActorByBody(worldBody) != nullptr; + }); + + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(sceneHandle, &request); + if (result) + { + AZStd::transform( + result.m_hits.begin(), result.m_hits.end(), AZStd::back_inserter(overlappedActors), + [&actorTracker, sceneInterface, sceneHandle](const AzPhysics::SceneQueryHit& overlapHit) -> BlastActor* + { + const AzPhysics::SimulatedBody* body = sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, overlapHit.m_bodyHandle); + return actorTracker.GetActorByBody(body); + }); + } + } + } return overlappedActors; } AZStd::vector DamageManager::OverlapCapsule( - ActorTracker& actorTracker, const AZ::Vector3& position0, const AZ::Vector3& position1, float radius) + [[maybe_unused]] ActorTracker& actorTracker, const AZ::Vector3& position0, const AZ::Vector3& position1, [[maybe_unused]] float radius) { - AZStd::shared_ptr defaultWorld; - Physics::DefaultWorldBus::BroadcastResult(defaultWorld, &Physics::DefaultWorldRequests::GetDefaultWorld); - - const float height = position0.GetDistance(position1); - - const auto pose = AZ::Transform::CreateFromQuaternionAndTranslation( - AZ::Quaternion::CreateFromVector3(position1 - position0), (position0 + position1) / 2.); - - auto overlapHits = defaultWorld->OverlapCapsule( - height, radius, pose, - [&actorTracker](const Physics::WorldBody* worldBody, [[maybe_unused]] const Physics::Shape* shape) -> bool - { - return actorTracker.GetActorByBody(worldBody) != nullptr; - }); - AZStd::vector overlappedActors; - AZStd::transform( - overlapHits.begin(), overlapHits.end(), AZStd::back_inserter(overlappedActors), - [&actorTracker](const Physics::OverlapHit& overlapHit) -> BlastActor* + if (auto* sceneInterface = AZ::Interface::Get()) + { + if (AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneHandle != AzPhysics::InvalidSceneHandle) { - return actorTracker.GetActorByBody(overlapHit.m_body); - }); - + const float height = position0.GetDistance(position1); + + const auto pose = AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromVector3(position1 - position0), (position0 + position1) / 2.); + + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateCapsuleOverlapRequest( + height, + radius, + pose, + [&actorTracker](const AzPhysics::SimulatedBody* worldBody, [[maybe_unused]] const Physics::Shape* shape) -> bool + { + return actorTracker.GetActorByBody(worldBody) != nullptr; + }); + + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(sceneHandle, &request); + if (result) + { + AZStd::transform( + result.m_hits.begin(), result.m_hits.end(), AZStd::back_inserter(overlappedActors), + [&actorTracker, sceneInterface, sceneHandle](const AzPhysics::SceneQueryHit& overlapHit) -> BlastActor* + { + const AzPhysics::SimulatedBody* body = sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, overlapHit.m_bodyHandle); + return actorTracker.GetActorByBody(body); + }); + } + } + } return overlappedActors; } } // namespace Blast diff --git a/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp b/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp index ef41c767cb..4036023397 100644 --- a/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp +++ b/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp @@ -18,9 +18,8 @@ #include #include #include -#include +#include #include -#include #include #include #include @@ -99,7 +98,7 @@ namespace Blast // ActorRenderManager::OnActorCreated { EXPECT_CALL( - *m_mockMeshFeatureProcessor, AcquireMesh(_, testing::A(), _)) + *m_mockMeshFeatureProcessor, AcquireMesh(_, testing::A(), _, _)) .Times(aznumeric_cast(m_actorFactory->m_mockActors[0]->GetChunkIndices().size())) .WillOnce(Return(testing::ByMove(AZ::Render::MeshFeatureProcessorInterface::MeshHandle()))) .WillOnce(Return(testing::ByMove(AZ::Render::MeshFeatureProcessorInterface::MeshHandle()))); diff --git a/Gems/Blast/Code/Tests/BlastActorTest.cpp b/Gems/Blast/Code/Tests/BlastActorTest.cpp index 5d05918e2a..7fb06b4eeb 100644 --- a/Gems/Blast/Code/Tests/BlastActorTest.cpp +++ b/Gems/Blast/Code/Tests/BlastActorTest.cpp @@ -76,7 +76,7 @@ namespace Blast AZStd::vector chunkIndices; chunkIndices.push_back(0); - Physics::RigidBodyConfiguration configuration; + AzPhysics::RigidBodyConfiguration configuration; auto entity = AZStd::make_shared(); AZ::EntityId entityId = entity->GetId(); auto actorDesc = BlastActorDesc diff --git a/Gems/Blast/Code/Tests/BlastFamilyTest.cpp b/Gems/Blast/Code/Tests/BlastFamilyTest.cpp index 21a9700896..2e6fd7f2bb 100644 --- a/Gems/Blast/Code/Tests/BlastFamilyTest.cpp +++ b/Gems/Blast/Code/Tests/BlastFamilyTest.cpp @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include diff --git a/Gems/Blast/Code/Tests/DamageManagerTest.cpp b/Gems/Blast/Code/Tests/DamageManagerTest.cpp index 846df01040..1a24248667 100644 --- a/Gems/Blast/Code/Tests/DamageManagerTest.cpp +++ b/Gems/Blast/Code/Tests/DamageManagerTest.cpp @@ -16,9 +16,8 @@ #include #include -#include +#include #include -#include #include #include diff --git a/Gems/Blast/Code/Tests/Mocks/BlastMocks.h b/Gems/Blast/Code/Tests/Mocks/BlastMocks.h index 01e53b5bab..0ac1f6c27e 100644 --- a/Gems/Blast/Code/Tests/Mocks/BlastMocks.h +++ b/Gems/Blast/Code/Tests/Mocks/BlastMocks.h @@ -14,12 +14,11 @@ #include #include #include -#include +#include #include #include #include #include -#include #include #include @@ -210,14 +209,6 @@ namespace Blast Physics::SystemRequestBus::Handler::BusDisconnect(); } - MOCK_CONST_METHOD0(GetDefaultWorldConfiguration, const Physics::WorldConfiguration&()); - MOCK_METHOD1(SetDefaultWorldConfiguration, void(const Physics::WorldConfiguration&)); - MOCK_METHOD1(CreateWorld, AZStd::shared_ptr(AZ::Crc32)); - MOCK_METHOD2( - CreateWorldCustom, AZStd::shared_ptr(AZ::Crc32, const Physics::WorldConfiguration&)); - MOCK_METHOD1( - CreateStaticRigidBody, AZStd::unique_ptr(const Physics::WorldBodyConfiguration&)); - MOCK_METHOD1(CreateRigidBody, AZStd::unique_ptr(const Physics::RigidBodyConfiguration&)); MOCK_METHOD2( CreateShape, AZStd::shared_ptr( @@ -231,9 +222,6 @@ namespace Blast MOCK_METHOD1( CreateMaterialsFromLibrary, AZStd::vector>(const Physics::MaterialSelection&)); - MOCK_METHOD0(LoadDefaultMaterialLibrary, bool()); - MOCK_METHOD0(GetDefaultMaterialLibraryAssetPtr, const AZ::Data::Asset*()); - MOCK_METHOD1(SetDefaultMaterialLibrary, void(const AZ::Data::Asset&)); MOCK_METHOD2( UpdateMaterialSelection, bool(const Physics::ShapeConfiguration&, Physics::ColliderConfiguration&)); MOCK_METHOD0(GetSupportedJointTypes, AZStd::vector()); @@ -241,7 +229,7 @@ namespace Blast MOCK_METHOD3( CreateJoint, AZStd::shared_ptr( - const AZStd::shared_ptr&, Physics::WorldBody*, Physics::WorldBody*)); + const AZStd::shared_ptr&, AzPhysics::SimulatedBody*, AzPhysics::SimulatedBody*)); MOCK_METHOD10( GenerateJointLimitVisualizationData, void( @@ -273,7 +261,7 @@ namespace Blast { Physics::DefaultWorldBus::Handler::BusDisconnect(); } - MOCK_METHOD0(GetDefaultWorld, AZStd::shared_ptr()); + MOCK_CONST_METHOD0(GetDefaultSceneHandle, AzPhysics::SceneHandle()); }; class MockBlastListener : public BlastListener @@ -286,7 +274,7 @@ namespace Blast class FakeBlastActor : public BlastActor { public: - FakeBlastActor(bool isStatic, Physics::WorldBody* worldBody, MockTkActor* tkActor) + FakeBlastActor(bool isStatic, AzPhysics::SimulatedBody* worldBody, MockTkActor* tkActor) : m_isStatic(isStatic) , m_transform(worldBody->GetTransform()) , m_worldBody(worldBody) @@ -299,12 +287,12 @@ namespace Blast return m_transform; } - Physics::WorldBody* GetWorldBody() override + AzPhysics::SimulatedBody* GetWorldBody() override { return m_worldBody.get(); } - const Physics::WorldBody* GetWorldBody() const override + const AzPhysics::SimulatedBody* GetWorldBody() const override { return m_worldBody.get(); } @@ -336,7 +324,7 @@ namespace Blast AZ::Transform m_transform; AZStd::vector m_chunkIndices; AZ::Entity m_entity; - AZStd::unique_ptr m_worldBody; + AZStd::unique_ptr m_worldBody; AZStd::unique_ptr m_tkActor; }; @@ -360,8 +348,8 @@ namespace Blast MOCK_CONST_METHOD0(GetTag, AZ::Crc32()); MOCK_METHOD1(AttachedToActor, void(void*)); MOCK_METHOD0(DetachedFromActor, void()); - MOCK_METHOD2(RayCast, Physics::RayCastHit(const Physics::RayCastRequest&, const AZ::Transform&)); - MOCK_METHOD1(RayCastLocal, Physics::RayCastHit(const Physics::RayCastRequest&)); + MOCK_METHOD2(RayCast, AzPhysics::SceneQueryHit(const AzPhysics::RayCastRequest&, const AZ::Transform&)); + MOCK_METHOD1(RayCastLocal, AzPhysics::SceneQueryHit(const AzPhysics::RayCastRequest&)); MOCK_CONST_METHOD1(GetAabb, AZ::Aabb(const AZ::Transform&)); MOCK_CONST_METHOD0(GetAabbLocal, AZ::Aabb()); MOCK_METHOD3(GetGeometry, void(AZStd::vector&, AZStd::vector&, AZ::Aabb*)); @@ -369,7 +357,7 @@ namespace Blast AZ_PUSH_DISABLE_WARNING(4996, "-Wdeprecated-declarations") - class FakeRigidBody : public Physics::RigidBody + class FakeRigidBody : public AzPhysics::RigidBody { public: FakeRigidBody( @@ -380,7 +368,7 @@ namespace Blast } void UpdateMassProperties( - [[maybe_unused]] Physics::MassComputeFlags flags, + [[maybe_unused]] AzPhysics::MassComputeFlags flags, [[maybe_unused]] const AZ::Vector3* centerOfMassOffsetOverride, [[maybe_unused]] const AZ::Matrix3x3* inertiaTensorOverride, [[maybe_unused]] const float* massOverride) override @@ -508,11 +496,6 @@ namespace Blast return m_entityId; } - Physics::World* GetWorld() const override - { - return nullptr; - } - AZ::Transform GetTransform() const override { return m_transform; @@ -538,7 +521,7 @@ namespace Blast return {}; } - Physics::RayCastHit RayCast([[maybe_unused]] const Physics::RayCastRequest& request) override + AzPhysics::SceneQueryHit RayCast([[maybe_unused]] const AzPhysics::RayCastRequest& request) override { return {}; } @@ -553,10 +536,6 @@ namespace Blast return nullptr; } - void AddToWorld([[maybe_unused]] Physics::World&) override {} - - void RemoveFromWorld([[maybe_unused]] Physics::World&) override {} - AZ::EntityId m_entityId; AZ::Transform m_transform; }; @@ -763,8 +742,8 @@ namespace Blast MOCK_METHOD1(SetGravityEnabled, void(bool)); MOCK_METHOD1(SetSimulationEnabled, void(bool)); MOCK_CONST_METHOD0(GetAabb, AZ::Aabb()); - MOCK_METHOD0(GetRigidBody, Physics::RigidBody*()); - MOCK_METHOD1(RayCast, Physics::RayCastHit(const Physics::RayCastRequest&)); + MOCK_METHOD0(GetRigidBody, AzPhysics::RigidBody*()); + MOCK_METHOD1(RayCast, AzPhysics::SceneQueryHit(const AzPhysics::RayCastRequest&)); }; class FakeBlastFamily : public BlastFamily diff --git a/Gems/Camera/Code/Source/CameraComponent.cpp b/Gems/Camera/Code/Source/CameraComponent.cpp index 66db678825..8479fb1981 100644 --- a/Gems/Camera/Code/Source/CameraComponent.cpp +++ b/Gems/Camera/Code/Source/CameraComponent.cpp @@ -40,14 +40,10 @@ namespace Camera void CameraComponent::Activate() { CameraComponentBase::Activate(); - - m_controller.ActivateAtomView(); } void CameraComponent::Deactivate() { - m_controller.DeactivateAtomView(); - CameraComponentBase::Deactivate(); } @@ -62,6 +58,28 @@ namespace Camera return true; } + class CameraNotificationBus_BehaviorHandler : public CameraNotificationBus::Handler, public AZ::BehaviorEBusHandler + { + public: + AZ_EBUS_BEHAVIOR_BINDER(CameraNotificationBus_BehaviorHandler, "{91E442A0-37E7-4E03-AB59-FEC11A06741D}", AZ::SystemAllocator, + OnCameraAdded, OnCameraRemoved, OnActiveViewChanged); + + void OnCameraAdded(const AZ::EntityId& cameraId) override + { + Call(FN_OnCameraAdded, cameraId); + } + + void OnCameraRemoved(const AZ::EntityId& cameraId) override + { + Call(FN_OnCameraRemoved, cameraId); + } + + void OnActiveViewChanged(const AZ::EntityId& cameraId) override + { + Call(FN_OnCameraRemoved, cameraId); + }; + }; + void CameraComponent::Reflect(AZ::ReflectContext* reflection) { CameraComponentBase::Reflect(reflection); @@ -101,6 +119,11 @@ namespace Camera ->Attribute(AZ::Script::Attributes::Category, "Camera") ->Event("GetActiveCamera", &CameraSystemRequestBus::Events::GetActiveCamera) ; + + behaviorContext->EBus("CameraNotificationBus") + ->Attribute(AZ::Script::Attributes::Category, "Camera") + ->Handler() + ; } } } //namespace Camera diff --git a/Gems/Camera/Code/Source/CameraComponentController.cpp b/Gems/Camera/Code/Source/CameraComponentController.cpp index bb853d08e7..786a7678eb 100644 --- a/Gems/Camera/Code/Source/CameraComponentController.cpp +++ b/Gems/Camera/Code/Source/CameraComponentController.cpp @@ -28,7 +28,7 @@ namespace Camera if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class() - ->Version(1) + ->Version(2) ->Field("Field of View", &CameraComponentConfig::m_fov) ->Field("Near Clip Plane Distance", &CameraComponentConfig::m_nearClipDistance) ->Field("Far Clip Plane Distance", &CameraComponentConfig::m_farClipDistance) @@ -36,6 +36,7 @@ namespace Camera ->Field("FrustumWidth", &CameraComponentConfig::m_frustumWidth) ->Field("FrustumHeight", &CameraComponentConfig::m_frustumHeight) ->Field("EditorEntityId", &CameraComponentConfig::m_editorEntityId) + ->Field("MakeActiveViewOnActivation", &CameraComponentConfig::m_makeActiveViewOnActivation) ; if (auto editContext = serializeContext->GetEditContext()) @@ -43,6 +44,8 @@ namespace Camera editContext->Class("CameraComponentConfig", "Configuration for a CameraComponent or EditorCameraComponent") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->DataElement(AZ::Edit::UIHandlers::Default, &CameraComponentConfig::m_makeActiveViewOnActivation, + "Make active camera on activation?", "If true, this camera will become the active render camera when it activates") ->DataElement(AZ::Edit::UIHandlers::Default, &CameraComponentConfig::m_fov, "Field of view", "Vertical field of view in degrees") ->Attribute(AZ::Edit::Attributes::Min, MIN_FOV) ->Attribute(AZ::Edit::Attributes::Suffix, " degrees") @@ -183,7 +186,6 @@ namespace Camera AZ::ComponentApplicationBus::BroadcastResult(entity, &AZ::ComponentApplicationRequests::FindEntity, m_entityId); m_view->LinkTo(entity); } - MakeActiveView(); } auto atomViewportRequests = AZ::Interface::Get(); @@ -221,6 +223,11 @@ namespace Camera AZ::TransformNotificationBus::Handler::BusConnect(m_entityId); CameraBus::Handler::BusConnect(); CameraNotificationBus::Broadcast(&CameraNotificationBus::Events::OnCameraAdded, m_entityId); + + if (m_config.m_makeActiveViewOnActivation) + { + MakeActiveView(); + } } void CameraComponentController::Deactivate() @@ -249,6 +256,8 @@ namespace Camera { AZ::RPI::ViewProviderBus::Handler::BusDisconnect(m_entityId); } + + DeactivateAtomView(); } void CameraComponentController::SetConfiguration(const CameraComponentConfig& config) @@ -334,9 +343,24 @@ namespace Camera void CameraComponentController::MakeActiveView() { - m_prevViewId = AZ::u32(m_viewSystem->GetActiveViewId()); - m_viewSystem->SetActiveView(m_view); + // Set Legacy Cry view, if it exists + if (m_viewSystem) + { + m_prevViewId = AZ::u32(m_viewSystem->GetActiveViewId()); + m_viewSystem->SetActiveView(m_view); + } + + // Set Atom camera, if it exists + if (m_atomCamera) + { + ActivateAtomView(); + } + + // Update camera parameters UpdateCamera(); + + // Notify of active view changed + CameraNotificationBus::Broadcast(&CameraNotificationBus::Events::OnActiveViewChanged, m_entityId); } void CameraComponentController::OnTransformChanged([[maybe_unused]] const AZ::Transform& local, const AZ::Transform& world) diff --git a/Gems/Camera/Code/Source/CameraComponentController.h b/Gems/Camera/Code/Source/CameraComponentController.h index 2787b869ad..92e1354f17 100644 --- a/Gems/Camera/Code/Source/CameraComponentController.h +++ b/Gems/Camera/Code/Source/CameraComponentController.h @@ -52,6 +52,7 @@ namespace Camera float m_frustumHeight = DefaultFrustumDimension; bool m_specifyFrustumDimensions = false; AZ::u64 m_editorEntityId = AZ::EntityId::InvalidEntityId; + bool m_makeActiveViewOnActivation = true; }; class CameraComponentController diff --git a/Gems/Camera/Code/Source/EditorCameraComponent.cpp b/Gems/Camera/Code/Source/EditorCameraComponent.cpp index 13ccd5e3d4..359fa936bc 100644 --- a/Gems/Camera/Code/Source/EditorCameraComponent.cpp +++ b/Gems/Camera/Code/Source/EditorCameraComponent.cpp @@ -33,9 +33,21 @@ namespace Camera { auto controllerConfig = m_controller.GetConfiguration(); controllerConfig.m_editorEntityId = GetEntityId().operator AZ::u64(); + + // The Editor manages active camera state, so while we're in Editor we explicitly + // disable the request to make this the active view at edit component activation time. + bool prevShouldActivateViewOnActivation = controllerConfig.m_makeActiveViewOnActivation; + controllerConfig.m_makeActiveViewOnActivation = false; + m_controller.SetConfiguration(controllerConfig); + // Call base class activate, which in turn calls Activate on our controller. EditorCameraComponentBase::Activate(); + + // Reset the original `m_makeActiveViewOnActivation' setting, so that the intended value is serialized, used in BuildGameEntity, etc. + controllerConfig.m_makeActiveViewOnActivation = prevShouldActivateViewOnActivation; + m_controller.SetConfiguration(controllerConfig); + AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(GetEntityId()); EditorCameraNotificationBus::Handler::BusConnect(); EditorCameraViewRequestBus::Handler::BusConnect(GetEntityId()); diff --git a/Gems/CrashReporting/Code/CMakeLists.txt b/Gems/CrashReporting/Code/CMakeLists.txt index 0195aa82e4..dbb78849fb 100644 --- a/Gems/CrashReporting/Code/CMakeLists.txt +++ b/Gems/CrashReporting/Code/CMakeLists.txt @@ -9,6 +9,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) + +include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) + if(NOT PAL_TRAIT_BUILD_CRASH_HANDLER_SUPPORTED) return() endif() @@ -26,26 +30,26 @@ ly_add_target( Include BUILD_DEPENDENCIES PRIVATE - 3rdParty::Crashpad - 3rdParty::Crashpad::Handler + AZ::AzCore AZ::CrashHandler AZ::CrashSupport - Legacy::CryCommon ) ly_add_target( NAME CrashReporting.Uploader APPLICATION NAMESPACE AZ FILES_CMAKE + game_crash_uploader_files.cmake Platform/${PAL_PLATFORM_NAME}/game_crash_uploader_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake INCLUDE_DIRECTORIES PRIVATE Include BUILD_DEPENDENCIES PRIVATE - 3rdParty::Crashpad - 3rdParty::Crashpad::Handler + #3rdParty::Crashpad + #3rdParty::Crashpad::Handler AZ::AzCore AZ::CrashUploaderSupport - AZ::CrashHandler + #AZ::CrashHandler + AZ::CrashSupport ) diff --git a/Gems/CrashReporting/Code/Platform/Android/PAL_android.cmake b/Gems/CrashReporting/Code/Platform/Android/PAL_android.cmake new file mode 100644 index 0000000000..b09df7b14e --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Android/PAL_android.cmake @@ -0,0 +1,12 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(PAL_TRAIT_BUILD_CRASH_HANDLER_SUPPORTED FALSE) diff --git a/Gems/CrashReporting/Code/Source/GameCrashUploader_non_win.cpp b/Gems/CrashReporting/Code/Platform/Common/UnixLike/GameCrashUploader_UnixLike.cpp similarity index 100% rename from Gems/CrashReporting/Code/Source/GameCrashUploader_non_win.cpp rename to Gems/CrashReporting/Code/Platform/Common/UnixLike/GameCrashUploader_UnixLike.cpp diff --git a/Gems/CrashReporting/Code/Source/platform/posix/main.cpp b/Gems/CrashReporting/Code/Platform/Common/UnixLike/main_UnixLike.cpp similarity index 100% rename from Gems/CrashReporting/Code/Source/platform/posix/main.cpp rename to Gems/CrashReporting/Code/Platform/Common/UnixLike/main_UnixLike.cpp diff --git a/Gems/CrashReporting/Code/Platform/Linux/PAL_linux.cmake b/Gems/CrashReporting/Code/Platform/Linux/PAL_linux.cmake new file mode 100644 index 0000000000..b09df7b14e --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Linux/PAL_linux.cmake @@ -0,0 +1,12 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(PAL_TRAIT_BUILD_CRASH_HANDLER_SUPPORTED FALSE) diff --git a/Gems/CrashReporting/Code/Platform/Mac/PAL_mac.cmake b/Gems/CrashReporting/Code/Platform/Mac/PAL_mac.cmake new file mode 100644 index 0000000000..b09df7b14e --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Mac/PAL_mac.cmake @@ -0,0 +1,12 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(PAL_TRAIT_BUILD_CRASH_HANDLER_SUPPORTED FALSE) diff --git a/Gems/CrashReporting/Code/Platform/Windows/GameCrashHandler_windows.cpp b/Gems/CrashReporting/Code/Platform/Windows/GameCrashHandler_windows.cpp new file mode 100644 index 0000000000..ceac6e177d --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Windows/GameCrashHandler_windows.cpp @@ -0,0 +1,26 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +// LY Game Crashpad Hook - win + +#include + +namespace CrashHandler +{ + const char* gameCrashHandlerPath = "GameCrash.Uploader.exe"; + + const char* GameCrashHandler::GetCrashHandlerExecutableName() const + { + return gameCrashHandlerPath; + } + +} diff --git a/Gems/CrashReporting/Code/Platform/Windows/GameCrashUploader_windows.cpp b/Gems/CrashReporting/Code/Platform/Windows/GameCrashUploader_windows.cpp new file mode 100644 index 0000000000..ef76182914 --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Windows/GameCrashUploader_windows.cpp @@ -0,0 +1,59 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +#include +#include +#include + +#pragma warning(disable : 4996) + +namespace Lumberyard +{ + + bool GameCrashUploader::CheckConfirmation(const crashpad::CrashReportDatabase::Report& report) + { + if (!m_noConfirmation) + { + const char* noConfirmation = getenv("LY_NO_CONFIRM"); + if (noConfirmation == nullptr) + { + + std::wstring sendDialogMessage; + + std::wstring_convert> converter; + sendDialogMessage = converter.from_bytes(m_executableName); + + sendDialogMessage += L" has encountered a fatal error. We're sorry for the inconvenience.\n\nA crash debugging file has been created at:\n"; + sendDialogMessage += report.file_path.value(); + sendDialogMessage += L"\n\nIf you are willing to submit this file to Amazon it will help us improve the Lumberyard experience. We will treat this report as confidential.\n\nWould you like to send the error report?"; + + int msgboxID = MessageBoxW( + NULL, + sendDialogMessage.data(), + L"Send Error Report", + (MB_ICONEXCLAMATION | MB_YESNO | MB_SYSTEMMODAL) + ); + + if (msgboxID == IDNO) + { + return false; + } + } + } + return true; + } +} diff --git a/Gems/CrashReporting/Code/Platform/Windows/PAL_windows.cmake b/Gems/CrashReporting/Code/Platform/Windows/PAL_windows.cmake new file mode 100644 index 0000000000..93285a8c55 --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Windows/PAL_windows.cmake @@ -0,0 +1,12 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(PAL_TRAIT_BUILD_CRASH_HANDLER_SUPPORTED TRUE) diff --git a/Gems/CrashReporting/Code/Platform/Windows/crashreporting_static_windows_files.cmake b/Gems/CrashReporting/Code/Platform/Windows/crashreporting_static_windows_files.cmake index b062cf4b20..353e87b310 100644 --- a/Gems/CrashReporting/Code/Platform/Windows/crashreporting_static_windows_files.cmake +++ b/Gems/CrashReporting/Code/Platform/Windows/crashreporting_static_windows_files.cmake @@ -10,5 +10,5 @@ # set(FILES - ../../Source/GameCrashHandler_win.cpp + GameCrashHandler_windows.cpp ) diff --git a/Gems/CrashReporting/Code/Platform/Windows/game_crash_uploader_windows_files.cmake b/Gems/CrashReporting/Code/Platform/Windows/game_crash_uploader_windows_files.cmake new file mode 100644 index 0000000000..336abcd863 --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Windows/game_crash_uploader_windows_files.cmake @@ -0,0 +1,15 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + GameCrashUploader_windows.cpp + main_windows.cpp +) diff --git a/Gems/CrashReporting/Code/Platform/Windows/main_windows.cpp b/Gems/CrashReporting/Code/Platform/Windows/main_windows.cpp new file mode 100644 index 0000000000..32ac52fb3e --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/Windows/main_windows.cpp @@ -0,0 +1,38 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +// LY Game Gem crash uploader extension - Windows + +#include + +#include +#include +#include + +namespace +{ + int HandlerMain(int argc, char* argv[]) + { + Lumberyard::InstallCrashUploader(argc, argv); + + LOG(ERROR) << "Initializing windows game crash uploader logging"; + int resultCode = crashpad::HandlerMain(argc, argv, Lumberyard::CrashUploader::GetCrashUploader()->GetUserStreamSources()); + + return resultCode; + } + +} +int APIENTRY wWinMain(HINSTANCE, HINSTANCE, [[maybe_unused]] wchar_t* lpCmdLine, int) +{ + return crashpad::ToolSupport::Wmain(__argc, __wargv, HandlerMain); +} + diff --git a/Gems/CrashReporting/Code/Platform/iOS/PAL_ios.cmake b/Gems/CrashReporting/Code/Platform/iOS/PAL_ios.cmake new file mode 100644 index 0000000000..b09df7b14e --- /dev/null +++ b/Gems/CrashReporting/Code/Platform/iOS/PAL_ios.cmake @@ -0,0 +1,12 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(PAL_TRAIT_BUILD_CRASH_HANDLER_SUPPORTED FALSE) diff --git a/Gems/CrashReporting/Code/Source/CrashReporting_precompiled.cpp b/Gems/CrashReporting/Code/Source/CrashReporting_precompiled.cpp deleted file mode 100644 index d3b93d5248..0000000000 --- a/Gems/CrashReporting/Code/Source/CrashReporting_precompiled.cpp +++ /dev/null @@ -1,12 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "CrashReporting_precompiled.h" diff --git a/Gems/CrashReporting/Code/Source/CrashReporting_precompiled.h b/Gems/CrashReporting/Code/Source/CrashReporting_precompiled.h deleted file mode 100644 index a2ce61c681..0000000000 --- a/Gems/CrashReporting/Code/Source/CrashReporting_precompiled.h +++ /dev/null @@ -1,14 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include // Many CryCommon files require that this is included first. diff --git a/Gems/CrashReporting/Code/Source/GameCrashHandler.cpp b/Gems/CrashReporting/Code/Source/GameCrashHandler.cpp index aad38d7dfd..eb376af26e 100644 --- a/Gems/CrashReporting/Code/Source/GameCrashHandler.cpp +++ b/Gems/CrashReporting/Code/Source/GameCrashHandler.cpp @@ -12,8 +12,6 @@ // LY Editor Crashpad Hook -#include - #include #include @@ -95,4 +93,4 @@ namespace CrashHandler returnPath += GetCrashHandlerExecutableName(); return returnPath; } -} \ No newline at end of file +} diff --git a/Gems/CrashReporting/Code/Source/GameCrashHandler_win.cpp b/Gems/CrashReporting/Code/Source/GameCrashHandler_win.cpp deleted file mode 100644 index d41d510af3..0000000000 --- a/Gems/CrashReporting/Code/Source/GameCrashHandler_win.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// LY Game Crashpad Hook - win - -#include - -#include - -namespace CrashHandler -{ - const char* gameCrashHandlerPath = "GameCrashUploader.exe"; - - const char* GameCrashHandler::GetCrashHandlerExecutableName() const - { - return gameCrashHandlerPath; - } - -} \ No newline at end of file diff --git a/Gems/CrashReporting/Code/Source/GameCrashUploader.cpp b/Gems/CrashReporting/Code/Source/GameCrashUploader.cpp index b8307b4cc0..e846c5dd4a 100644 --- a/Gems/CrashReporting/Code/Source/GameCrashUploader.cpp +++ b/Gems/CrashReporting/Code/Source/GameCrashUploader.cpp @@ -10,6 +10,7 @@ * */ +#include #include #include @@ -33,4 +34,4 @@ namespace Lumberyard { } -} \ No newline at end of file +} diff --git a/Gems/CrashReporting/Code/Source/GameCrashUploader_win.cpp b/Gems/CrashReporting/Code/Source/GameCrashUploader_win.cpp deleted file mode 100644 index 4f1b995203..0000000000 --- a/Gems/CrashReporting/Code/Source/GameCrashUploader_win.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include - -#include -#include -#include -#include - -#pragma warning(disable : 4996) - -namespace Lumberyard -{ - - bool GameCrashUploader::CheckConfirmation(const crashpad::CrashReportDatabase::Report& report) - { - if (!m_noConfirmation) - { - const char* noConfirmation = getenv("LY_NO_CONFIRM"); - if (noConfirmation == nullptr) - { - - std::wstring sendDialogMessage; - - std::wstring_convert> converter; - sendDialogMessage = converter.from_bytes(m_executableName); - - sendDialogMessage += L" has encountered a fatal error. We're sorry for the inconvenience.\n\nA crash debugging file has been created at:\n"; - sendDialogMessage += report.file_path.value(); - sendDialogMessage += L"\n\nIf you are willing to submit this file to Amazon it will help us improve the Lumberyard experience. We will treat this report as confidential.\n\nWould you like to send the error report?"; - - int msgboxID = MessageBoxW( - NULL, - sendDialogMessage.data(), - L"Send Error Report", - (MB_ICONEXCLAMATION | MB_YESNO | MB_SYSTEMMODAL) - ); - - if (msgboxID == IDNO) - { - return false; - } - } - } - return true; - } -} \ No newline at end of file diff --git a/Gems/CrashReporting/Code/Source/platform/win/main.cpp b/Gems/CrashReporting/Code/Source/platform/win/main.cpp deleted file mode 100644 index 7d0ef7a25d..0000000000 --- a/Gems/CrashReporting/Code/Source/platform/win/main.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// LY Game Gem crash uploader extension - Windows - -#include -#include -#include - -#include - -namespace -{ - int HandlerMain(int argc, char* argv[]) - { - Lumberyard::InstallCrashUploader(argc, argv); - - LOG(ERROR) << "Initializing windows game crash uploader logging"; - int resultCode = crashpad::HandlerMain(argc, argv, Lumberyard::CrashUploader::GetCrashUploader()->GetUserStreamSources()); - - return resultCode; - } - -} -int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t* lpCmdLine, int) -{ - return crashpad::ToolSupport::Wmain(__argc, __wargv, HandlerMain); -} - diff --git a/Gems/CrashReporting/Code/crashreporting_static_files.cmake b/Gems/CrashReporting/Code/crashreporting_static_files.cmake index d00a58211b..abdca96313 100644 --- a/Gems/CrashReporting/Code/crashreporting_static_files.cmake +++ b/Gems/CrashReporting/Code/crashreporting_static_files.cmake @@ -10,8 +10,6 @@ # set(FILES - Source/CrashReporting_precompiled.cpp - Source/CrashReporting_precompiled.h Include/CrashReporting/GameCrashHandler.h Source/GameCrashHandler.cpp ) diff --git a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.cpp b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.cpp index a4f69b0fb1..30253f1568 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.cpp @@ -35,7 +35,7 @@ namespace MCommon { MCORE_UNUSED(timeDelta); - // lock pitching to [-90.0�, 90.0�] + // lock pitching to [-90.0°, 90.0°] if (mPitch < -90.0f + 0.1f) { mPitch = -90.0f + 0.1f; diff --git a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.h b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.h index a4e28e1630..36d043067b 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.h +++ b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/FirstPersonCamera.h @@ -61,8 +61,8 @@ namespace MCommon const char* GetTypeString() const { return "First Person"; } /** - * Set the pitch angle in degrees. Looking up and down is limited to 90�. (0=Straight Ahead, +Up, -Down) - * @param The pitch angle in degrees, range[-90.0�, 90.0�]. + * Set the pitch angle in degrees. Looking up and down is limited to 90°. (0=Straight Ahead, +Up, -Down) + * @param The pitch angle in degrees, range[-90.0°, 90.0°]. */ MCORE_INLINE void SetPitch(float pitch) { mPitch = pitch; } @@ -79,8 +79,8 @@ namespace MCommon MCORE_INLINE void SetRoll(float roll) { mRoll = roll; } /** - * Get the pitch angle in degrees. Looking up and down is limited to 90�. (0=Straight Ahead, +Up, -Down) - * @return The pitch angle in degrees, range[-90.0�, 90.0�]. + * Get the pitch angle in degrees. Looking up and down is limited to 90°. (0=Straight Ahead, +Up, -Down) + * @return The pitch angle in degrees, range[-90.0°, 90.0°]. */ MCORE_INLINE float GetPitch() const { return mPitch; } diff --git a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/RenderUtil.cpp b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/RenderUtil.cpp index c6853310d8..4518d1aefa 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/RenderUtil.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/RenderUtil.cpp @@ -495,7 +495,6 @@ namespace MCommon } } - // render wireframe mesh void RenderUtil::RenderWireframe(EMotionFX::Mesh* mesh, const AZ::Transform& worldTM, const MCore::RGBAColor& color, bool directlyRender, float offsetScale) { @@ -505,10 +504,12 @@ namespace MCommon return; } + PrepareForMesh(mesh, worldTM); + const float scale = 0.01f * offsetScale; AZ::Vector3* normals = (AZ::Vector3*)mesh->FindVertexData(EMotionFX::Mesh::ATTRIB_NORMALS); - AZ::Vector3* positions = (AZ::Vector3*)mesh->FindVertexData(EMotionFX::Mesh::ATTRIB_POSITIONS); + MCore::RGBAColor* vertexColors = (MCore::RGBAColor*)mesh->FindVertexData(EMotionFX::Mesh::ATTRIB_COLORS128); const uint32 numSubMeshes = mesh->GetNumSubMeshes(); for (uint32 subMeshIndex = 0; subMeshIndex < numSubMeshes; ++subMeshIndex) @@ -516,7 +517,6 @@ namespace MCommon EMotionFX::SubMesh* subMesh = mesh->GetSubMesh(subMeshIndex); const uint32 numTriangles = subMesh->GetNumPolygons(); const uint32 startVertex = subMesh->GetStartVertex(); - const uint32 startIndex = subMesh->GetStartIndex(); const uint32* indices = subMesh->GetIndices(); for (uint32 triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex) @@ -526,13 +526,22 @@ namespace MCommon const uint32 indexB = indices[triangleStartIndex + 1] + startVertex; const uint32 indexC = indices[triangleStartIndex + 2] + startVertex; - const AZ::Vector3 posA = worldTM.TransformPoint(positions[indexA] + normals[indexA] * scale); - const AZ::Vector3 posB = worldTM.TransformPoint(positions[indexB] + normals[indexB] * scale); - const AZ::Vector3 posC = worldTM.TransformPoint(positions[indexC] + normals[indexC] * scale); + const AZ::Vector3 posA = mWorldSpacePositions[indexA] + normals[indexA] * scale; + const AZ::Vector3 posB = mWorldSpacePositions[indexB] + normals[indexB] * scale; + const AZ::Vector3 posC = mWorldSpacePositions[indexC] + normals[indexC] * scale; - RenderLine(posA, posB, color); - RenderLine(posB, posC, color); - RenderLine(posC, posA, color); + if (vertexColors) + { + RenderLine(posA, posB, vertexColors[indexA]); + RenderLine(posB, posC, vertexColors[indexB]); + RenderLine(posC, posA, vertexColors[indexC]); + } + else + { + RenderLine(posA, posB, color); + RenderLine(posB, posC, color); + RenderLine(posC, posA, color); + } } } @@ -542,7 +551,6 @@ namespace MCommon } } - // render vertex and face normals void RenderUtil::RenderNormals(EMotionFX::Mesh* mesh, const AZ::Transform& worldTM, bool vertexNormals, bool faceNormals, float vertexNormalsScale, float faceNormalsScale, const MCore::RGBAColor& colorVertexNormals, const MCore::RGBAColor& colorFaceNormals, bool directlyRender) { @@ -572,7 +580,6 @@ namespace MCommon EMotionFX::SubMesh* subMesh = mesh->GetSubMesh(subMeshIndex); const uint32 numTriangles = subMesh->GetNumPolygons(); const uint32 startVertex = subMesh->GetStartVertex(); - const uint32 startIndex = subMesh->GetStartIndex(); const uint32* indices = subMesh->GetIndices(); for (uint32 triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex) diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp index b6a07a3399..3bf5094a61 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp @@ -47,6 +47,8 @@ #include #include +#include + namespace EMotionFX { AZ_CLASS_ALLOCATOR_IMPL(Actor, ActorAllocator, 0) @@ -3013,12 +3015,8 @@ namespace EMotionFX // The lod has shared buffers that combine the data from each submesh. These buffers can be accessed through the first submesh in their entirety const AZ::RPI::ModelLodAsset::Mesh& sourceMesh = sourceMeshes[0]; - const AZStd::array_view vertexIndicesView = sourceMesh.GetSemanticBuffer(AZ::Name("MORPHTARGET_VERTEXINDICES")); - const AZStd::array_view positionDeltaView = sourceMesh.GetSemanticBuffer(AZ::Name("MORPHTARGET_POSITIONDELTAS")); - const AZStd::array_view normalDeltaView = sourceMesh.GetSemanticBuffer(AZ::Name("MORPHTARGET_NORMALDELTAS")); - const AZ::u32* vertexIndices = reinterpret_cast(vertexIndicesView.data()); - const AZ::u16* positionDeltas = reinterpret_cast(positionDeltaView.data()); - const AZ::u8* normalDeltas = normalDeltaView.data(); + const AZStd::array_view morphTargetDeltaView = sourceMesh.GetSemanticBuffer(AZ::Name("MORPHTARGET_VERTEXDELTAS")); + const AZ::RPI::PackedCompressedMorphTargetDelta* vertexDeltas = reinterpret_cast(morphTargetDeltaView.data()); const AZ::u32 numMorphTargets = morphSetup->GetNumMorphTargets(); for (AZ::u32 mtIndex = 0; mtIndex < numMorphTargets; ++mtIndex) @@ -3039,22 +3037,35 @@ namespace EMotionFX for (AZ::u32 deformVtx = 0; deformVtx < numDeformedVertices; ++deformVtx) { + // Get the index into the morph delta buffer const AZ::u32 vertexIndex = metaData.m_startIndex + deformVtx; - deformData->mDeltas[deformVtx].mVertexNr = vertexIndices[vertexIndex]; - const AZ::u32 componentIndex = vertexIndex * 3; + // Unpack the delta + const AZ::RPI::PackedCompressedMorphTargetDelta& packedCompressedDelta = vertexDeltas[vertexIndex]; + AZ::RPI::CompressedMorphTargetDelta unpackedCompressedDelta = AZ::RPI::UnpackMorphTargetDelta(packedCompressedDelta); + + // Set the EMotionFX deform data from the CmopressedMorphTargetDelta + deformData->mDeltas[deformVtx].mVertexNr = unpackedCompressedDelta.m_morphedVertexIndex; + deformData->mDeltas[deformVtx].mPosition = MCore::Compressed16BitVector3( - positionDeltas[componentIndex + 0], - positionDeltas[componentIndex + 1], - positionDeltas[componentIndex + 2]); - deformData->mDeltas[deformVtx].mNormal = MCore::Compressed8BitVector3( - normalDeltas[componentIndex + 0], - normalDeltas[componentIndex + 1], - normalDeltas[componentIndex + 2]); + unpackedCompressedDelta.m_positionX, + unpackedCompressedDelta.m_positionY, + unpackedCompressedDelta.m_positionZ); - // The exporting pipeline currently does not support delta bi-/tangents. Initialize with a zero delta. - deformData->mDeltas[deformVtx].mTangent.FromVector3(AZ::Vector3::CreateZero(), -2.0f, 2.0f); - deformData->mDeltas[deformVtx].mBitangent.FromVector3(AZ::Vector3::CreateZero(), -2.0f, 2.0f); + deformData->mDeltas[deformVtx].mNormal = MCore::Compressed8BitVector3( + unpackedCompressedDelta.m_normalX, + unpackedCompressedDelta.m_normalY, + unpackedCompressedDelta.m_normalZ); + + deformData->mDeltas[deformVtx].mTangent = MCore::Compressed8BitVector3( + unpackedCompressedDelta.m_tangentX, + unpackedCompressedDelta.m_tangentY, + unpackedCompressedDelta.m_tangentZ); + + deformData->mDeltas[deformVtx].mBitangent = MCore::Compressed8BitVector3( + unpackedCompressedDelta.m_bitangentX, + unpackedCompressedDelta.m_bitangentY, + unpackedCompressedDelta.m_bitangentZ); } morphTarget->AddDeformData(deformData); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphSymbolicFollowerParameterAction.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphSymbolicFollowerParameterAction.cpp index 8343263f48..2f4cdb5330 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphSymbolicFollowerParameterAction.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphSymbolicFollowerParameterAction.cpp @@ -144,7 +144,7 @@ namespace EMotionFX const unsigned int version = classElement.GetVersion(); if (version < 2) { - // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project’s related + // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project's related // codebases and APIs. Please note, some instances have been retained in the current version to provide backward compatibility // for assets/materials created prior to the change. These will be deprecated in the future. int index = classElement.FindElement(AZ_CRC("servantParameterName", 0xe6070940)); @@ -161,7 +161,7 @@ namespace EMotionFX classElement.AddElementWithData(context, "followerParameterName", oldValue); } - // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project’s related + // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project's related // codebases and APIs. Please note, some instances have been retained in the current version to provide backward compatibility for // assets/materials created prior to the change. These will be deprecated in the future. index = classElement.FindElement(AZ_CRC("masterParameterName", 0xd0d333e3)); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp index a8ae3e420e..4e5d3c3edf 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp @@ -819,7 +819,7 @@ namespace EMotionFX const unsigned int version = classElement.GetVersion(); if (version < 2) { - // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project’s related + // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project's related // codebases and APIs. Please note, some instances have been retained in the current version to provide backward compatibility // for assets/materials created prior to the change. These will be deprecated in the future. int index = classElement.FindElement(AZ_CRC("syncMasterMotionId", 0xfaec9599)); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp index 87f8786c9d..a762e6924b 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp @@ -1190,7 +1190,7 @@ namespace EMotionFX const unsigned int version = classElement.GetVersion(); if (version < 2) { - // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project’s related + // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project's related // codebases and APIs. Please note, some instances have been retained in the current version to provide backward compatibility // for assets/materials created prior to the change. These will be deprecated in the future. int index = classElement.FindElement(AZ_CRC("syncMasterMotionId", 0xfaec9599)); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFootIKNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFootIKNode.cpp index 9505d41e74..9b37c92f99 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFootIKNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFootIKNode.cpp @@ -320,7 +320,7 @@ namespace EMotionFX rayRequest.m_start = rayStart; rayRequest.m_direction = rayDirection; rayRequest.m_distance = maxDistance; - rayRequest.m_queryType = Physics::QueryType::Static; + rayRequest.m_queryType = AzPhysics::SceneQuery::QueryType::Static; rayRequest.m_hint = Integration::RaycastRequests::UsecaseHint::FootPlant; // Cast a ray, check for intersections. diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRaycastNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRaycastNode.cpp index 7df49c30fe..cdb6829638 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRaycastNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRaycastNode.cpp @@ -96,7 +96,7 @@ namespace EMotionFX rayRequest.m_start = rayStart; rayRequest.m_direction = rayDirection; rayRequest.m_distance = maxDistance; - rayRequest.m_queryType = Physics::QueryType::Static; + rayRequest.m_queryType = AzPhysics::SceneQuery::QueryType::Static; rayRequest.m_hint = Integration::RaycastRequests::UsecaseHint::Generic; // Cast a ray, check for intersections. diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeTwoLinkIKNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeTwoLinkIKNode.cpp index 88d67670b6..e2be8f8157 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeTwoLinkIKNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeTwoLinkIKNode.cpp @@ -195,11 +195,11 @@ namespace EMotionFX // the inverse matrix defines a coordinate system whose x axis contains P, so X = unit(P). const AZ::Vector3 x = MCore::SafeNormalize(goal); - // the y axis of the inverse is perpendicular to P, so Y = unit( D - X(D�X) ). + // the y axis of the inverse is perpendicular to P, so Y = unit( D - X(D . X) ). const float dot = bendDir.Dot(x); const AZ::Vector3 y = MCore::SafeNormalize(bendDir - (dot * x)); - // the z axis of the inverse is perpendicular to both X and Y, so Z = X�Y. + // the z axis of the inverse is perpendicular to both X and Y, so Z = X x Y. const AZ::Vector3 z = x.Cross(y); // set the rotation vectors of the output matrix diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.cpp index eb8be44b28..42a3e91ba6 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.cpp @@ -287,16 +287,6 @@ namespace EMotionFX AZ_Assert(maxSkinInfluences > 0 && maxSkinInfluences < 100, "Expect max skin influences in a reasonable value range."); skinWeights = static_cast(bufferData) + bufferAssetViewDescriptor.m_elementOffset; } - else if (name == AZ::Name("MORPHTARGET_VERTEXINDICES") || - name == AZ::Name("MORPHTARGET_POSITIONDELTAS") || - name == AZ::Name("MORPHTARGET_NORMALDELTAS")) - { - // Nothing to do here. - } - else - { - AZ_Assert(false, "Unknown stream buffer %s found when converting from atom mesh to emotionfx mesh", name.GetCStr()); - } } // Add the original vertex layer diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.cpp index 508bf8a390..ece584029c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.cpp @@ -248,13 +248,13 @@ namespace EMotionFX return m_ragdoll; } - AZ::Crc32 RagdollInstance::GetRagdollWorldId() const + AzPhysics::SceneHandle RagdollInstance::GetRagdollSceneHandle() const { if (m_ragdoll) { - return m_ragdoll->GetWorldId(); + return m_ragdoll->m_sceneOwner; } - return AZ::Crc32(); + return AzPhysics::InvalidSceneHandle; } const AZ::Outcome RagdollInstance::GetRagdollNodeIndex(size_t jointIndex) const diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.h b/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.h index 5e6c6e9c01..2a89d2ecb6 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/RagdollInstance.h @@ -49,7 +49,7 @@ namespace EMotionFX const AZ::Outcome GetRootRagdollNodeIndex() const; Physics::Ragdoll* GetRagdoll() const; - AZ::Crc32 GetRagdollWorldId() const; + AzPhysics::SceneHandle GetRagdollSceneHandle() const; void SetRagdollUsed() { m_ragdollUsedThisFrame = true; } /* diff --git a/Gems/EMotionFX/Code/Include/Integration/AnimationBus.h b/Gems/EMotionFX/Code/Include/Integration/AnimationBus.h index 1cbfb3c302..ead3d87fdb 100644 --- a/Gems/EMotionFX/Code/Include/Integration/AnimationBus.h +++ b/Gems/EMotionFX/Code/Include/Integration/AnimationBus.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include namespace EMotionFX @@ -193,7 +193,7 @@ namespace EMotionFX AZ::Vector3 m_start; /**< The start position of the ray in world space. */ AZ::Vector3 m_direction; /**< The direction vector (has to be normalized). */ float m_distance; /**< The maximum distance (has to be positive and larger than zero). */ - Physics::QueryType m_queryType = Physics::QueryType::StaticAndDynamic; + AzPhysics::SceneQuery::QueryType m_queryType = AzPhysics::SceneQuery::QueryType::StaticAndDynamic; UsecaseHint m_hint = UsecaseHint::Generic; /**< The use case hint. */ }; diff --git a/Gems/EMotionFX/Code/Source/Editor/ColliderContainerWidget.h b/Gems/EMotionFX/Code/Source/Editor/ColliderContainerWidget.h index f9322f7dbc..e8cc717e49 100644 --- a/Gems/EMotionFX/Code/Source/Editor/ColliderContainerWidget.h +++ b/Gems/EMotionFX/Code/Source/Editor/ColliderContainerWidget.h @@ -15,7 +15,7 @@ #if !defined(Q_MOC_RUN) #include #include -#include +#include #include #include #include diff --git a/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.cpp b/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.cpp index 5d1496abd3..cafdd40a4d 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.cpp @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include @@ -163,6 +163,16 @@ namespace EMotionFX ////////////////////////////////////////////////////////////////////////// ActorComponent::ActorComponent(const Configuration* configuration) : m_debugDrawRoot(false) + , m_sceneFinishSimHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + float fixedDeltatime + ) + { + if (m_actorInstance) + { + m_actorInstance->PostPhysicsUpdate(fixedDeltatime); + } + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Animation)) { if (configuration) { @@ -216,7 +226,7 @@ namespace EMotionFX { AzFramework::RagdollPhysicsNotificationBus::Handler::BusDisconnect(); AzFramework::CharacterPhysicsDataRequestBus::Handler::BusDisconnect(); - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneFinishSimHandler.Disconnect(); ActorComponentRequestBus::Handler::BusDisconnect(); AZ::TickBus::Handler::BusDisconnect(); ActorComponentNotificationBus::Handler::BusDisconnect(); @@ -330,9 +340,9 @@ namespace EMotionFX newActor->CheckFinalizeActor(); } - bool ActorComponent::IsWorldNotificationBusConnected(AZ::Crc32 worldId) const + bool ActorComponent::IsPhysicsSceneSimulationFinishEventConnected() const { - return Physics::WorldNotificationBus::Handler::BusIsConnectedId(worldId); + return m_sceneFinishSimHandler.IsConnected(); } void ActorComponent::CheckActorCreation() @@ -408,7 +418,10 @@ namespace EMotionFX // Send general mesh creation notification to interested parties. LmbrCentral::MeshComponentNotificationBus::Event(entityId, &LmbrCentral::MeshComponentNotifications::OnMeshCreated, m_configuration.m_actorAsset); - AzFramework::CharacterPhysicsDataNotificationBus::Event(entityId, &AzFramework::CharacterPhysicsDataNotifications::OnRagdollConfigurationReady); + Physics::RagdollConfiguration ragdollConfiguration; + [[maybe_unused]] bool ragdollConfigValid = GetRagdollConfiguration(ragdollConfiguration); + AZ_Assert(ragdollConfigValid, "Ragdoll Configuration is not valid"); + AzFramework::CharacterPhysicsDataNotificationBus::Event(entityId, &AzFramework::CharacterPhysicsDataNotifications::OnRagdollConfigurationReady, ragdollConfiguration); } ////////////////////////////////////////////////////////////////////////// @@ -527,19 +540,6 @@ namespace EMotionFX return AZ::TICK_PRE_RENDER; } - void ActorComponent::OnPostPhysicsSubtick(float fixedDeltaTime) - { - if (m_actorInstance) - { - m_actorInstance->PostPhysicsUpdate(fixedDeltaTime); - } - } - - int ActorComponent::GetPhysicsTickOrder() - { - return WorldNotifications::Animation; - } - ////////////////////////////////////////////////////////////////////////// void ActorComponent::OnActorInstanceCreated(ActorInstance* actorInstance) { @@ -643,7 +643,10 @@ namespace EMotionFX RagdollInstance* ragdollInstance = m_actorInstance->GetRagdollInstance(); AZ_Assert(ragdollInstance, "As the ragdoll passed in ActorInstance::SetRagdoll() is valid, a valid ragdoll instance is expected to exist."); - Physics::WorldNotificationBus::Handler::BusConnect(ragdollInstance->GetRagdollWorldId()); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RegisterSceneSimulationFinishHandler(ragdollInstance->GetRagdollSceneHandle(), m_sceneFinishSimHandler); + } } } @@ -651,7 +654,7 @@ namespace EMotionFX { if (m_actorInstance) { - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneFinishSimHandler.Disconnect(); m_actorInstance->SetRagdoll(nullptr); } } diff --git a/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.h b/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.h index 8cd4786a07..1a185edccc 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.h +++ b/Gems/EMotionFX/Code/Source/Integration/Components/ActorComponent.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include @@ -45,7 +45,6 @@ namespace EMotionFX , private LmbrCentral::AttachmentComponentNotificationBus::Handler , private AzFramework::CharacterPhysicsDataRequestBus::Handler , private AzFramework::RagdollPhysicsNotificationBus::Handler - , protected Physics::WorldNotificationBus::Handler , private EMotionFX::ActorNotificationBus::Handler { public: @@ -160,12 +159,11 @@ namespace EMotionFX void OnAssetReady(AZ::Data::Asset asset) override; void OnAssetReloaded(AZ::Data::Asset asset) override; + bool IsPhysicsSceneSimulationFinishEventConnected() const; + void SetActorAsset(AZ::Data::Asset actorAsset); AZ::Data::Asset GetActorAsset() const { return m_configuration.m_actorAsset; } - // Physics::WorldNotificationBus::Handler - bool IsWorldNotificationBusConnected(AZ::Crc32 worldId) const; - private: // AZ::TransformNotificationBus::MultiHandler void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; @@ -174,10 +172,6 @@ namespace EMotionFX void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; int GetTickOrder() override; - // Physics::WorldNotifications::Handler - void OnPostPhysicsSubtick(float fixedDeltaTime) override; - int GetPhysicsTickOrder() override; - // ActorNotificationBus::Handler void OnActorReady(Actor* actor) override; @@ -194,6 +188,8 @@ namespace EMotionFX AZStd::unique_ptr m_renderActorInstance; bool m_debugDrawRoot; ///< Enables drawing of actor root and facing. + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler; }; } //namespace Integration } // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp b/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp index ea12f3cc40..0e2c0bbf63 100644 --- a/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -52,7 +53,10 @@ #include #include -#include +#include +#include +#include + #include @@ -799,22 +803,27 @@ namespace EMotionFX RaycastRequests::RaycastResult rayResult; // Build the ray request in the physics system. - Physics::RayCastRequest physicsRayRequest; + AzPhysics::RayCastRequest physicsRayRequest; physicsRayRequest.m_start = rayRequest.m_start; physicsRayRequest.m_direction = rayRequest.m_direction; physicsRayRequest.m_distance = rayRequest.m_distance; physicsRayRequest.m_queryType = rayRequest.m_queryType; // Cast the ray in the physics system. - Physics::RayCastHit physicsRayResult; - Physics::WorldRequestBus::EventResult(physicsRayResult, Physics::DefaultPhysicsWorldId, &Physics::WorldRequests::RayCast, physicsRayRequest); - if (physicsRayResult) // We intersected. + if (auto* sceneInterface = AZ::Interface::Get()) { - rayResult.m_position = physicsRayResult.m_position; - rayResult.m_normal = physicsRayResult.m_normal; - rayResult.m_intersected = true; + if (AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneHandle != AzPhysics::InvalidSceneHandle) + { + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(sceneHandle, &physicsRayRequest); + if (result) // We intersected. + { + rayResult.m_position = result.m_hits[0].m_position; + rayResult.m_normal = result.m_hits[0].m_normal; + rayResult.m_intersected = true; + } + } } - return rayResult; } diff --git a/Gems/EMotionFX/Code/Tests/Integration/ActorComponentRagdollTests.cpp b/Gems/EMotionFX/Code/Tests/Integration/ActorComponentRagdollTests.cpp index e060cde2fc..df45092b7b 100644 --- a/Gems/EMotionFX/Code/Tests/Integration/ActorComponentRagdollTests.cpp +++ b/Gems/EMotionFX/Code/Tests/Integration/ActorComponentRagdollTests.cpp @@ -12,7 +12,6 @@ #include #include -#include #include #include #include @@ -20,6 +19,7 @@ #include #include #include +#include #include namespace EMotionFX @@ -67,13 +67,23 @@ namespace EMotionFX AZ::EntityId entityId(740216387); AZ::Crc32 worldId(174592); + AzPhysics::SceneEvents::OnSceneSimulationFinishEvent sceneFinishSimEvent; + + Physics::MockPhysicsSceneInterface mockSceneInterface; + EXPECT_CALL(mockSceneInterface, RegisterSceneSimulationFinishHandler) + .WillRepeatedly([&sceneFinishSimEvent]( + [[maybe_unused]]AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler& handler) + { + handler.Connect(sceneFinishSimEvent); + }); + TestRagdoll testRagdoll; TestRagdollPhysicsRequestHandler ragdollPhysicsRequestHandler(&testRagdoll, entityId); EXPECT_CALL(testRagdoll, GetState(::testing::_)).Times(::testing::AnyNumber()); EXPECT_CALL(testRagdoll, GetNumNodes()).WillRepeatedly(::testing::Return(1)); EXPECT_CALL(testRagdoll, IsSimulated()).WillRepeatedly(::testing::Return(true)); - EXPECT_CALL(testRagdoll, GetWorldId()).WillRepeatedly(::testing::Return(worldId)); EXPECT_CALL(testRagdoll, GetEntityId()).WillRepeatedly(::testing::Return(entityId)); EXPECT_CALL(testRagdoll, GetPosition()).WillRepeatedly(::testing::Return(AZ::Vector3::CreateZero())); EXPECT_CALL(testRagdoll, GetOrientation()).WillRepeatedly(::testing::Return(AZ::Quaternion::CreateIdentity())); @@ -94,23 +104,23 @@ namespace EMotionFX gameEntity->Activate(); actorComponent->SetActorAsset(actorAsset); - EXPECT_FALSE(actorComponent->IsWorldNotificationBusConnected(worldId)) - << "World notification bus should not be connected directly after creating the actor instance."; + EXPECT_FALSE(actorComponent->IsPhysicsSceneSimulationFinishEventConnected()) + << "Scene Finish Simulation handler should not be connected directly after creating the actor instance."; actorComponent->OnRagdollActivated(); - EXPECT_TRUE(actorComponent->IsWorldNotificationBusConnected(worldId)) - << "World notification bus should be connected after activating the ragdoll."; + EXPECT_TRUE(actorComponent->IsPhysicsSceneSimulationFinishEventConnected()) + << "Scene Finish Simulation handler should be connected after activating the ragdoll."; actorComponent->OnRagdollDeactivated(); - EXPECT_FALSE(actorComponent->IsWorldNotificationBusConnected(worldId)) - << "World notification bus should not be connected after deactivating the ragdoll."; + EXPECT_FALSE(actorComponent->IsPhysicsSceneSimulationFinishEventConnected()) + << "Scene Finish Simulation handler should not be connected after deactivating the ragdoll."; actorComponent->OnRagdollActivated(); - EXPECT_TRUE(actorComponent->IsWorldNotificationBusConnected(worldId)) - << "World notification bus should be connected after activating the ragdoll."; + EXPECT_TRUE(actorComponent->IsPhysicsSceneSimulationFinishEventConnected()) + << "Scene Finish Simulation handler should be connected after activating the ragdoll."; gameEntity->Deactivate(); - EXPECT_FALSE(actorComponent->IsWorldNotificationBusConnected(worldId)) - << "World notification bus should not be connected anymore after deactivating the entire entity."; + EXPECT_FALSE(actorComponent->IsPhysicsSceneSimulationFinishEventConnected()) + << "Scene Finish Simulation handler should not be connected anymore after deactivating the entire entity."; } } diff --git a/Gems/EMotionFX/Code/Tests/LeaderFollowerVersionTests.cpp b/Gems/EMotionFX/Code/Tests/LeaderFollowerVersionTests.cpp index 2f7e53a965..bd0e9aaecb 100644 --- a/Gems/EMotionFX/Code/Tests/LeaderFollowerVersionTests.cpp +++ b/Gems/EMotionFX/Code/Tests/LeaderFollowerVersionTests.cpp @@ -21,7 +21,7 @@ namespace EMotionFX { - // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project’s related + // Developer code and APIs with exclusionary terms will be deprecated as we introduce replacements across this project's related // codebases and APIs. Please note, some instances have been retained in the current version to provide backward compatibility // for assets/materials created prior to the change. These will be deprecated in the future. // Those tests validate the conversion of blendspace1d and blendspace2d node. diff --git a/Gems/EMotionFX/Code/Tests/Mocks/PhysicsRagdoll.h b/Gems/EMotionFX/Code/Tests/Mocks/PhysicsRagdoll.h index 829988d70e..b3acb73e19 100644 --- a/Gems/EMotionFX/Code/Tests/Mocks/PhysicsRagdoll.h +++ b/Gems/EMotionFX/Code/Tests/Mocks/PhysicsRagdoll.h @@ -38,11 +38,8 @@ namespace EMotionFX MOCK_CONST_METHOD1(GetNode, Physics::RagdollNode*(size_t)); MOCK_CONST_METHOD0(GetNumNodes, size_t()); - MOCK_CONST_METHOD0(GetWorldId, AZ::Crc32()); - // WorldBody MOCK_CONST_METHOD0(GetEntityId, AZ::EntityId()); - MOCK_CONST_METHOD0(GetWorld, Physics::World*()); MOCK_CONST_METHOD0(GetTransform, AZ::Transform()); MOCK_METHOD1(SetTransform, void(const AZ::Transform&)); @@ -52,12 +49,9 @@ namespace EMotionFX MOCK_CONST_METHOD0(GetAabb, AZ::Aabb()); - MOCK_METHOD1(RayCast, Physics::RayCastHit(const Physics::RayCastRequest&)); + MOCK_METHOD1(RayCast, AzPhysics::SceneQueryHit(const AzPhysics::RayCastRequest&)); MOCK_CONST_METHOD0(GetNativeType, AZ::Crc32()); MOCK_CONST_METHOD0(GetNativePointer, void*()); - - MOCK_METHOD1(AddToWorld, void(Physics::World&)); - MOCK_METHOD1(RemoveFromWorld, void(Physics::World&)); }; } // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h b/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h index d4df8d8773..0b20632884 100644 --- a/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h +++ b/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h @@ -13,6 +13,7 @@ #pragma once #include +#include #include #include @@ -31,23 +32,16 @@ namespace Physics { BusDisconnect(); } - MOCK_CONST_METHOD0(GetDefaultWorldConfiguration, const Physics::WorldConfiguration&()); - MOCK_METHOD1(SetDefaultWorldConfiguration, void(const Physics::WorldConfiguration& worldConfiguration)); - MOCK_METHOD1(CreateWorld, AZStd::shared_ptr(AZ::Crc32 id)); - MOCK_METHOD2(CreateWorldCustom, AZStd::shared_ptr(AZ::Crc32 id, const Physics::WorldConfiguration& settings)); - MOCK_METHOD1(CreateStaticRigidBody, AZStd::unique_ptr(const Physics::WorldBodyConfiguration& configuration)); - MOCK_METHOD1(CreateRigidBody, AZStd::unique_ptr(const Physics::RigidBodyConfiguration& configuration)); MOCK_METHOD2(CreateShape, AZStd::shared_ptr(const Physics::ColliderConfiguration& colliderConfiguration, const Physics::ShapeConfiguration& configuration)); MOCK_METHOD4(AddColliderComponentToEntity, void(AZ::Entity* entity, const Physics::ColliderConfiguration& colliderConfiguration, const Physics::ShapeConfiguration& shapeConfiguration, bool addEditorComponents)); MOCK_METHOD1(ReleaseNativeMeshObject, void(void* nativeMeshObject)); MOCK_METHOD1(CreateMaterial, AZStd::shared_ptr(const Physics::MaterialConfiguration& materialConfiguration)); MOCK_METHOD0(GetDefaultMaterial, AZStd::shared_ptr()); MOCK_METHOD1(CreateMaterialsFromLibrary, AZStd::vector>(const Physics::MaterialSelection& materialSelection)); - MOCK_METHOD0(LoadDefaultMaterialLibrary, bool()); MOCK_METHOD2(UpdateMaterialSelection, bool(const Physics::ShapeConfiguration& shapeConfiguration, Physics::ColliderConfiguration& colliderConfiguration)); MOCK_METHOD0(GetSupportedJointTypes, AZStd::vector()); MOCK_METHOD1(CreateJointLimitConfiguration, AZStd::shared_ptr(AZ::TypeId jointType)); - MOCK_METHOD3(CreateJoint, AZStd::shared_ptr(const AZStd::shared_ptr& configuration, Physics::WorldBody* parentBody, Physics::WorldBody* childBody)); + MOCK_METHOD3(CreateJoint, AZStd::shared_ptr(const AZStd::shared_ptr& configuration, AzPhysics::SimulatedBody* parentBody, AzPhysics::SimulatedBody* childBody)); MOCK_METHOD10(GenerateJointLimitVisualizationData, void(const Physics::JointLimitConfiguration& configuration, const AZ::Quaternion& parentRotation, const AZ::Quaternion& childRotation, float scale, AZ::u32 angularSubdivisions, AZ::u32 radialSubdivisions, AZStd::vector& vertexBufferOut, AZStd::vector& indexBufferOut, AZStd::vector& lineBufferOut, AZStd::vector& lineValidityBufferOut)); MOCK_METHOD5(ComputeInitialJointLimitConfiguration, AZStd::unique_ptr(const AZ::TypeId& jointLimitTypeId, const AZ::Quaternion& parentWorldRotation, const AZ::Quaternion& childWorldRotation, const AZ::Vector3& axis, const AZStd::vector& exampleLocalRotations)); MOCK_METHOD3(CookConvexMeshToFile, bool(const AZStd::string& filePath, const AZ::Vector3* vertices, AZ::u32 vertexCount)); @@ -74,11 +68,97 @@ namespace Physics MOCK_METHOD1(AddScene, AzPhysics::SceneHandle(const AzPhysics::SceneConfiguration& config)); MOCK_METHOD1(AddScenes, AzPhysics::SceneHandleList(const AzPhysics::SceneConfigurationList& configs)); + MOCK_METHOD1(GetSceneHandle, AzPhysics::SceneHandle(const AZStd::string& sceneName)); MOCK_METHOD1(GetScene, AzPhysics::Scene* (AzPhysics::SceneHandle handle)); MOCK_METHOD1(GetScenes, AzPhysics::SceneList (const AzPhysics::SceneHandleList& handles)); MOCK_METHOD0(GetAllScenes, AzPhysics::SceneList& ()); + MOCK_METHOD1(FindAttachedBodyHandleFromEntityId, AZStd::pair(AZ::EntityId entityId)); MOCK_CONST_METHOD0(GetConfiguration, const AzPhysics::SystemConfiguration* ()); MOCK_CONST_METHOD0(GetDefaultMaterialLibrary, const AZ::Data::Asset& ()); MOCK_CONST_METHOD0(GetDefaultSceneConfiguration, const AzPhysics::SceneConfiguration& ()); }; + + //Mocked of the AzPhysics Scene Interface. To keep things simple just mocked functions that have a return value OR required for a test. + class MockPhysicsSceneInterface + : AZ::Interface::Registrar + { + public: + + void StartSimulation( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float deltatime) override {} + void FinishSimulation([[maybe_unused]] AzPhysics::SceneHandle sceneHandle) override {} + void SetEnabled( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] bool enable) override {} + void RemoveSimulatedBody( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {} + void RemoveSimulatedBodies( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandleList& bodyHandles) override {} + void EnableSimulationOfBody( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {} + void DisableSimulationOfBody( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {} + void SuppressCollisionEvents( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleA, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleB) override {} + void UnsuppressCollisionEvents( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleA, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleB) override {} + void SetGravity( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AZ::Vector3& gravity) override {} + void RegisterSceneConfigurationChangedEventHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneConfigurationChanged::Handler& handler) override {} + void RegisterSimulationBodyAddedHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodyAdded::Handler& handler) override {} + void RegisterSimulationBodyRemovedHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodyRemoved::Handler& handler) override {} + void RegisterSimulationBodySimulationEnabledHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler) override {} + void RegisterSimulationBodySimulationDisabledHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler) override {} + void RegisterSceneSimulationStartHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneSimulationStartHandler& handler) override {} + void RegisterSceneActiveSimulatedBodiesHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler) override {} + void RegisterSceneCollisionEventHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneCollisionsEvent::Handler& handler) override {} + void RegisterSceneTriggersEventHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneTriggersEvent::Handler& handler) override {} + void RegisterSceneGravityChangedEvent( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler& handler) override {} + + MOCK_METHOD1(GetSceneHandle, AzPhysics::SceneHandle(const AZStd::string& sceneName)); + MOCK_CONST_METHOD1(IsEnabled, bool(AzPhysics::SceneHandle sceneHandle)); + MOCK_METHOD2(AddSimulatedBody, AzPhysics::SimulatedBodyHandle(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfiguration* simulatedBodyConfig)); + MOCK_METHOD2(AddSimulatedBodies, AzPhysics::SimulatedBodyHandleList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs)); + MOCK_METHOD2(GetSimulatedBodyFromHandle, AzPhysics::SimulatedBody* (AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle)); + MOCK_METHOD2(GetSimulatedBodiesFromHandle, AzPhysics::SimulatedBodyList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles)); + MOCK_CONST_METHOD1(GetGravity, AZ::Vector3(AzPhysics::SceneHandle sceneHandle)); + MOCK_METHOD2(RegisterSceneSimulationFinishHandler, void(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneSimulationFinishHandler& handler)); + MOCK_CONST_METHOD2(GetLegacyBody, AzPhysics::SimulatedBody* (AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle handle)); + MOCK_METHOD2(QueryScene, AzPhysics::SceneQueryHits(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequest* request)); + MOCK_METHOD2(QuerySceneBatch, AzPhysics::SceneQueryHitsList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequests& requests)); + MOCK_METHOD4(QuerySceneAsync, bool(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequest* request, AzPhysics::SceneQuery::AsyncCallback callback)); + MOCK_METHOD4(QuerySceneAsyncBatch, bool(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequests& requests, AzPhysics::SceneQuery::AsyncBatchCallback callback)); + }; } // namespace Physics diff --git a/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateLevelRunning.inl b/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateLevelRunning.inl index 76afc4fa80..174a5b43c4 100644 --- a/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateLevelRunning.inl +++ b/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateLevelRunning.inl @@ -58,7 +58,7 @@ namespace GameStateSamples if (levelSystem && !iSystem->GetGlobalEnvironment()->IsEditor()) { // Unload the currently loaded level - levelSystem->UnLoadLevel(); + levelSystem->UnloadLevel(); if (iSystem->GetI3DEngine()) { iSystem->GetI3DEngine()->LoadEmptyLevel(); diff --git a/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateMainMenu.inl b/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateMainMenu.inl index a26baaa132..bc9f3d0b15 100644 --- a/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateMainMenu.inl +++ b/Gems/GameStateSamples/Code/Include/GameStateSamples/GameStateMainMenu.inl @@ -10,6 +10,11 @@ * */ +#include +#include +#include +#include + #include #include #include @@ -135,14 +140,16 @@ namespace GameStateSamples AZStd::string levelName; UiButtonBus::EventResult(levelName, entityId, &UiButtonInterface::GetOnClickActionName); ISystem* iSystem = GetISystem(); - IConsole* iConsole = iSystem ? iSystem->GetIConsole() : nullptr; ILevelSystem* levelSystem = iSystem ? iSystem->GetILevelSystem() : nullptr; - if (levelSystem && !levelName.empty() && iConsole) + + if (levelSystem && !levelName.empty()) { // This command gets delayed by one frame, so we check for the // actual level load start in GameStateMainMenu::OnSystemEvent - AZStd::string mapCommand = "map " + levelName; - iConsole->ExecuteString(mapCommand.c_str()); + AZ::TickBus::QueueFunction([levelSystem, levelName]() { + levelSystem->UnloadLevel(); + levelSystem->LoadLevel(levelName.c_str()); + }); } } @@ -257,6 +264,7 @@ namespace GameStateSamples return "@assets@/ui/canvases/defaultmainmenuscreen.uicanvas"; } + //////////////////////////////////////////////////////////////////////////////////////////////// inline void GameStateMainMenu::RefreshLevelListDisplay() { @@ -268,48 +276,96 @@ namespace GameStateSamples "DynamicColumn"); if (dynamicLayoutElementId.IsValid()) { - // Refresh the dynamic layout UI element with the list of levels in the project ISystem* iSystem = GetISystem(); ILevelSystem* levelSystem = iSystem ? iSystem->GetILevelSystem() : nullptr; - const int numLevels = levelSystem ? levelSystem->GetLevelCount() : 0; - UiDynamicLayoutBus::Event(dynamicLayoutElementId, &UiDynamicLayoutInterface::SetNumChildElements, numLevels); - for (int i = 0; i < numLevels; ++i) + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) { - // Get the level name (strip folder names from the path) - const char* levelPath = levelSystem->GetLevelInfo(i)->GetName(); - const int levelPathLength = strlen(levelPath); - const char* levelName = levelPath; - for (int j = 0; j < levelPathLength; ++j) + // Run through all the assets in the asset catalog and gather up the list of level assets + + AZ::Data::AssetType levelAssetType = levelSystem->GetLevelAssetType(); + AZStd::vector levelNames; + auto enumerateCB = [levelAssetType, &levelNames]( + [[maybe_unused]] const AZ::Data::AssetId id, + const AZ::Data::AssetInfo& assetInfo) { - if ((levelPath[j] == '\\' || levelPath[j] == '/') && j + 1 < levelPathLength) + if (assetInfo.m_assetType == levelAssetType) { - levelName = levelPath + j + 1; + levelNames.emplace_back(assetInfo.m_relativePath); } - } + }; + + AZ::Data::AssetCatalogRequestBus::Broadcast( + &AZ::Data::AssetCatalogRequestBus::Events::EnumerateAssets, nullptr, enumerateCB, nullptr); + + // Add all the levels into the UI as buttons + + UiDynamicLayoutBus::Event(dynamicLayoutElementId, &UiDynamicLayoutInterface::SetNumChildElements, levelNames.size()); + for (int i = 0; i < levelNames.size(); ++i) + { + AZ::IO::PathView level(levelNames[i].c_str()); + + // Get the button element id + AZ::EntityId buttonElementId; + UiElementBus::EventResult(buttonElementId, dynamicLayoutElementId, &UiElementInterface::GetChildEntityId, i); + + // Get the text element id + AZ::EntityId textElementId; + UiElementBus::EventResult(textElementId, buttonElementId, &UiElementInterface::FindChildEntityIdByName, "Text"); - // Get the button element id - AZ::EntityId buttonElementId; - UiElementBus::EventResult(buttonElementId, - dynamicLayoutElementId, - &UiElementInterface::GetChildEntityId, - i); - - // Get the text element id - AZ::EntityId textElementId; - UiElementBus::EventResult(textElementId, - buttonElementId, - &UiElementInterface::FindChildEntityIdByName, - "Text"); - - // Set the name, on-click callback, and on-click action name for each button - UiTextBus::Event(textElementId, &UiTextInterface::SetText, levelName); - UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickCallback, OnLevelButtonClicked); - UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickActionName, levelName); - - if (i == 0) + // Set the name, on-click callback, and on-click action name for each button + UiTextBus::Event(textElementId, &UiTextInterface::SetText, level.Filename().Native()); + UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickCallback, OnLevelButtonClicked); + UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickActionName, levelNames[i]); + + if (i == 0) + { + // Force the first level to be selected + UiCanvasBus::Event(m_mainMenuCanvasEntityId, &UiCanvasInterface::ForceHoverInteractable, buttonElementId); + } + } + } + else + { + // Refresh the dynamic layout UI element with the list of levels in the project + const int numLevels = levelSystem ? levelSystem->GetLevelCount() : 0; + UiDynamicLayoutBus::Event(dynamicLayoutElementId, &UiDynamicLayoutInterface::SetNumChildElements, numLevels); + for (int i = 0; i < numLevels; ++i) { - // Force the first level to be selected - UiCanvasBus::Event(m_mainMenuCanvasEntityId, &UiCanvasInterface::ForceHoverInteractable, buttonElementId); + // Get the level name (strip folder names from the path) + const char* levelPath = levelSystem->GetLevelInfo(i)->GetName(); + const int levelPathLength = strlen(levelPath); + const char* levelName = levelPath; + for (int j = 0; j < levelPathLength; ++j) + { + if ((levelPath[j] == '\\' || levelPath[j] == '/') && j + 1 < levelPathLength) + { + levelName = levelPath + j + 1; + } + } + + // Get the button element id + AZ::EntityId buttonElementId; + UiElementBus::EventResult(buttonElementId, dynamicLayoutElementId, &UiElementInterface::GetChildEntityId, i); + + // Get the text element id + AZ::EntityId textElementId; + UiElementBus::EventResult(textElementId, buttonElementId, &UiElementInterface::FindChildEntityIdByName, "Text"); + + // Set the name, on-click callback, and on-click action name for each button + UiTextBus::Event(textElementId, &UiTextInterface::SetText, levelName); + UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickCallback, OnLevelButtonClicked); + UiButtonBus::Event(buttonElementId, &UiButtonInterface::SetOnClickActionName, levelName); + + if (i == 0) + { + // Force the first level to be selected + UiCanvasBus::Event(m_mainMenuCanvasEntityId, &UiCanvasInterface::ForceHoverInteractable, buttonElementId); + } } } } diff --git a/Gems/GraphCanvas/Code/CMakeLists.txt b/Gems/GraphCanvas/Code/CMakeLists.txt index c21c3ac806..683b0e4bdf 100644 --- a/Gems/GraphCanvas/Code/CMakeLists.txt +++ b/Gems/GraphCanvas/Code/CMakeLists.txt @@ -66,6 +66,7 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) AZ::AzCore AZ::AzFramework AZ::AzToolsFramework + AZ::AssetBuilderSDK 3rdParty::Qt::Core 3rdParty::Qt::Gui 3rdParty::Qt::Widgets diff --git a/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.cpp index a4ebd5ab12..232b0645a8 100644 --- a/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.cpp @@ -165,7 +165,7 @@ namespace GraphCanvas m_saveData.SignalDirty(); } - void GeometryComponent::OnItemChange(const AZ::EntityId& entityId, QGraphicsItem::GraphicsItemChange change, const QVariant& value) + void GeometryComponent::OnItemChange([[maybe_unused]] const AZ::EntityId& entityId, QGraphicsItem::GraphicsItemChange change, const QVariant& value) { AZ_Assert(entityId == GetEntityId(), "EIDs should match"); diff --git a/Gems/GraphCanvas/Code/Source/Components/SceneComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/SceneComponent.cpp index e4d4215f73..c7a6a3d198 100644 --- a/Gems/GraphCanvas/Code/Source/Components/SceneComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/SceneComponent.cpp @@ -682,6 +682,11 @@ namespace GraphCanvas { AZ_Error("GraphCanvas", !m_trackingTarget.IsValid(), "Trying to track a second target for gestures while still tracking the first."); + if (GeometryNotificationBus::Handler::BusIsConnected()) + { + GeometryNotificationBus::Handler::BusDisconnect(); + } + GeometryNotificationBus::Handler::BusConnect(elementId); m_trackingTarget = elementId; diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.cpp index 9c36689617..ed5d63eb9f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.cpp @@ -36,12 +36,13 @@ namespace GraphCanvas if (serializeContext) { serializeContext->Class() - ->Version(5) + ->Version(6) ->Field("TypeId", &DataSlotComponent::m_dataTypeId) ->Field("DataSlotType", &DataSlotComponent::m_dataSlotType) ->Field("CanConvertSlotTypes", &DataSlotComponent::m_canConvertSlotTypes) ->Field("ContainedTypeIds", &DataSlotComponent::m_containedTypeIds) ->Field("DataValueType", &DataSlotComponent::m_valueType) + ->Field("IsUserSlot", &DataSlotComponent::m_isUserSlot) ; } } @@ -97,6 +98,7 @@ namespace GraphCanvas , m_valueType(DataValueType::Primitive) , m_dataTypeId(AZ::Uuid::CreateNull()) , m_previousDataSlotType(DataSlotType::Unknown) + , m_isUserSlot(false) { if (m_slotConfiguration.m_slotGroup == SlotGroups::Invalid) { @@ -112,6 +114,7 @@ namespace GraphCanvas , m_dataTypeId(dataSlotConfiguration.m_typeId) , m_containedTypeIds(dataSlotConfiguration.m_containerTypeIds) , m_previousDataSlotType(DataSlotType::Unknown) + , m_isUserSlot(dataSlotConfiguration.m_isUserAdded) { if (m_slotConfiguration.m_slotGroup == SlotGroups::Invalid) { @@ -230,6 +233,8 @@ namespace GraphCanvas slotConfiguration->m_containerTypeIds = m_containedTypeIds; + slotConfiguration->m_isUserAdded = m_isUserSlot; + PopulateSlotConfiguration((*slotConfiguration)); return slotConfiguration; @@ -416,6 +421,11 @@ namespace GraphCanvas } } + bool DataSlotComponent::IsUserSlot() const + { + return m_isUserSlot; + } + const Styling::StyleHelper* DataSlotComponent::GetDataColorPalette() const { AZ::EntityId sceneId; diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h index 66d605d11e..9903921300 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h @@ -57,6 +57,8 @@ namespace GraphCanvas bool ConvertToValue() override; bool CanConvertToValue() const override; + bool IsUserSlot() const override; + DataSlotType GetDataSlotType() const override; DataValueType GetDataValueType() const override; @@ -91,6 +93,8 @@ namespace GraphCanvas DataSlotType m_dataSlotType; DataValueType m_valueType; + bool m_isUserSlot; + AZ::Uuid m_dataTypeId; AZStd::vector m_containedTypeIds; diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotLayoutComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotLayoutComponent.cpp index 7111c5e261..740a7d2769 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotLayoutComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotLayoutComponent.cpp @@ -878,13 +878,16 @@ namespace GraphCanvas if (dataRequests) { - if (dataRequests->GetDataSlotType() == DataSlotType::Value && dataRequests->CanConvertToReference()) + if (!dataRequests->IsUserSlot()) { - dataRequests->ConvertToReference(); - } - else if (dataRequests->GetDataSlotType() == DataSlotType::Reference && dataRequests->CanConvertToValue()) - { - dataRequests->ConvertToValue(); + if (dataRequests->GetDataSlotType() == DataSlotType::Value && dataRequests->CanConvertToReference()) + { + dataRequests->ConvertToReference(); + } + else if (dataRequests->GetDataSlotType() == DataSlotType::Reference && dataRequests->CanConvertToValue()) + { + dataRequests->ConvertToValue(); + } } } } diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.cpp index 766721a26a..e397e32a6e 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.cpp @@ -212,7 +212,7 @@ namespace GraphCanvas void ExtenderSlotComponent::TriggerExtension() { // Don't need to track anything. Just create the slot then ignore whatever the return is. - ConstructSlot(); + ConstructSlot(GraphModelRequests::ExtensionRequestReason::UserRequest); if (m_createdSlot.IsValid()) { @@ -236,7 +236,7 @@ namespace GraphCanvas return Endpoint(); } - ConstructSlot(); + ConstructSlot(GraphModelRequests::ExtensionRequestReason::ConnectionProposal); if (!m_createdSlot.IsValid()) { @@ -264,7 +264,7 @@ namespace GraphCanvas { } - void ExtenderSlotComponent::ConstructSlot() + void ExtenderSlotComponent::ConstructSlot(GraphModelRequests::ExtensionRequestReason reason) { if (!m_createdSlot.IsValid()) { @@ -275,7 +275,7 @@ namespace GraphCanvas { ScopedGraphUndoBlocker undoBlocker(graphId); - GraphModelRequestBus::EventResult(m_createdSlot, graphId, &GraphModelRequests::RequestExtension, nodeId, m_extenderId); + GraphModelRequestBus::EventResult(m_createdSlot, graphId, &GraphModelRequests::RequestExtension, nodeId, m_extenderId, reason); } } } @@ -311,7 +311,7 @@ namespace GraphCanvas AZ::Entity* ExtenderSlotComponent::ConstructConnectionEntity(const Endpoint& sourceEndpoint, const Endpoint& targetEndpoint, bool createModelConnection) { - ConstructSlot(); + ConstructSlot(GraphModelRequests::ExtensionRequestReason::Internal); if (m_createdSlot.IsValid()) { diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h index 7ac45b938f..a2a07ce5bb 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h @@ -86,7 +86,7 @@ namespace GraphCanvas ExtenderSlotComponent(const ExtenderSlotComponent&) = delete; ExtenderSlotComponent& operator=(const ExtenderSlotComponent&) = delete; - void ConstructSlot(); + void ConstructSlot(GraphModelRequests::ExtensionRequestReason reason); void EraseSlot(); void CleanupProposedSlot(); @@ -99,4 +99,4 @@ namespace GraphCanvas ExtenderId m_extenderId; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h index ae85fc9f70..fc74047c80 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h @@ -137,8 +137,13 @@ namespace GraphCanvas int GetLayoutPriority() const override; void SetLayoutPriority(int priority) override; + + void Show() { m_visible = true; } + void Hide() { m_visible = false; } //// + bool IsVisible() const { return m_visible; } + protected: void PopulateSlotConfiguration(SlotConfiguration& slotConfiguration) const; @@ -173,5 +178,7 @@ namespace GraphCanvas //! Stores custom user data for this slot AZStd::any m_userData; + + bool m_visible; }; } diff --git a/Gems/GraphCanvas/Code/Source/GraphCanvas.cpp b/Gems/GraphCanvas/Code/Source/GraphCanvas.cpp index cf66c020b8..cc9309d71f 100644 --- a/Gems/GraphCanvas/Code/Source/GraphCanvas.cpp +++ b/Gems/GraphCanvas/Code/Source/GraphCanvas.cpp @@ -69,6 +69,8 @@ #include #include +#include + namespace GraphCanvas { bool EntitySaveDataContainerVersionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) @@ -151,6 +153,7 @@ namespace GraphCanvas GraphCanvasMimeEvent::Reflect(context); GraphCanvasTreeModel::Reflect(context); CreateSplicingNodeMimeEvent::Reflect(context); + TranslationAsset::Reflect(context); if (auto behaviorContext = azrtti_cast(context)) { @@ -175,21 +178,62 @@ namespace GraphCanvas } } + void GraphCanvasSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(AZ_CRC("AssetDatabaseService", 0x3abf5601)); + } + void GraphCanvasSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { provided.push_back(GraphCanvasRequestsServiceId); } + void GraphCanvasSystemComponent::Init() + { + RegisterAssetHandler(); + m_translationDatabase.Init(); + } + void GraphCanvasSystemComponent::Activate() { + RegisterTranslationBuilder(); + + AzFramework::AssetCatalogEventBus::Handler::BusConnect(); GraphCanvasRequestBus::Handler::BusConnect(); Styling::PseudoElementFactoryRequestBus::Handler::BusConnect(); } + void GraphCanvasSystemComponent::RegisterTranslationBuilder() + { + // Register ScriptCanvas Builder + { + AssetBuilderSDK::AssetBuilderDesc builderDescriptor; + builderDescriptor.m_name = "Graph Canvas Translation Builder"; + builderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.names", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); + builderDescriptor.m_busId = TranslationAssetWorker::GetUUID(); + + // changing the analysis fingerprint just invalidates analysis (ie, not the assets themselves) + // which will cause the "CreateJobs" function to be called, for each asset, even if the + // source file has not changed, but won't actually do the jobs unless the source file has changed + // or the fingerprint of the individual job is different. + builderDescriptor.m_analysisFingerprint = m_translationAssetWorker.GetFingerprintString(); + + m_translationAssetWorker.BusConnect(builderDescriptor.m_busId); + AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBus::Handler::RegisterBuilderInformation, builderDescriptor); + + AzToolsFramework::ToolsAssetSystemBus::Broadcast(&AzToolsFramework::ToolsAssetSystemRequests::RegisterSourceAssetType, azrtti_typeid(), TranslationAsset::GetFileFilter()); + m_translationAssetWorker.Activate(); + } + } + void GraphCanvasSystemComponent::Deactivate() { + AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); Styling::PseudoElementFactoryRequestBus::Handler::BusDisconnect(); GraphCanvasRequestBus::Handler::BusDisconnect(); + AZ::Data::AssetBus::MultiHandler::BusDisconnect(); + + UnregisterAssetHandler(); } AZ::Entity* GraphCanvasSystemComponent::CreateBookmarkAnchor() const @@ -325,4 +369,75 @@ namespace GraphCanvas { return Styling::VirtualChildElement::Create(real, virtualChildElement); } + + void GraphCanvasSystemComponent::OnCatalogLoaded(const char* /*catalogFile*/) + { + auto postEnumerateCb = [this]() + { + PopulateTranslationDatabase(); + }; + + // Find any TranslationAsset files that may have translation database key/values + AZ::Data::AssetCatalogRequests::AssetEnumerationCB collectAssetsCb = [this](const AZ::Data::AssetId assetId, const AZ::Data::AssetInfo& assetInfo) + { + const auto assetType = azrtti_typeid(); + if (assetInfo.m_assetType == assetType) + { + m_translationAssets.push_back(assetId); + } + }; + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequestBus::Events::EnumerateAssets, nullptr, collectAssetsCb, postEnumerateCb); + } + + void GraphCanvasSystemComponent::RegisterAssetHandler() + { + AZ::Data::AssetType assetType(azrtti_typeid()); + if (AZ::Data::AssetManager::Instance().GetHandler(assetType)) + { + return; // Asset Type already handled + } + + auto* catalogBus = AZ::Data::AssetCatalogRequestBus::FindFirstHandler(); + if (catalogBus) + { + // Register asset types the asset DB should query our catalog for. + catalogBus->AddAssetType(assetType); + + // Build the catalog (scan). + catalogBus->AddExtension(".names"); + } + + m_assetHandler = AZStd::make_unique(); + AZ::Data::AssetManager::Instance().RegisterHandler(m_assetHandler.get(), assetType); + + // Use AssetCatalog service to register ScriptEvent asset type and extension + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::AddAssetType, assetType); + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::EnableCatalogForAsset, assetType); + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::AddExtension, TranslationAsset::GetFileFilter()); + + } + + void GraphCanvasSystemComponent::UnregisterAssetHandler() + { + if (m_assetHandler) + { + AZ::Data::AssetManager::Instance().UnregisterHandler(m_assetHandler.get()); + m_assetHandler.reset(); + } + + for (const AZ::Data::AssetId& assetId : m_translationAssets) + { + AZ::Data::AssetBus::MultiHandler::BusDisconnect(assetId); + } + m_translationAssets.clear(); + } + + void GraphCanvasSystemComponent::PopulateTranslationDatabase() + { + for (const AZ::Data::AssetId& assetId : m_translationAssets) + { + AZ::Data::AssetBus::MultiHandler::BusConnect(assetId); + AZ::Data::AssetManager::Instance().GetAsset(assetId, AZ::Data::AssetLoadBehavior::Default); + } + } } diff --git a/Gems/GraphCanvas/Code/Source/GraphCanvas.h b/Gems/GraphCanvas/Code/Source/GraphCanvas.h index ae399880d9..a86f038bd3 100644 --- a/Gems/GraphCanvas/Code/Source/GraphCanvas.h +++ b/Gems/GraphCanvas/Code/Source/GraphCanvas.h @@ -19,24 +19,32 @@ #include #include +#include +#include + namespace GraphCanvas { class GraphCanvasSystemComponent : public AZ::Component , private GraphCanvasRequestBus::Handler , protected Styling::PseudoElementFactoryRequestBus::Handler + , protected AzFramework::AssetCatalogEventBus::Handler + , protected AZ::Data::AssetBus::MultiHandler + { public: AZ_COMPONENT(GraphCanvasSystemComponent, "{F9F7BE55-4C28-4B8A-A722-D47C9EF24E60}") static void Reflect(AZ::ReflectContext* context); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); GraphCanvasSystemComponent() = default; ~GraphCanvasSystemComponent() override = default; private: // AZ::Component + void Init() override; void Activate() override; void Deactivate() override; //// @@ -72,5 +80,19 @@ namespace GraphCanvas AZ::EntityId CreateStyleEntity(const AZStd::string& style) const override; AZ::EntityId CreateVirtualChild(const AZ::EntityId& real, const AZStd::string& virtualChildElement) const override; //// + + void OnCatalogLoaded(const char* /*catalogFile*/) override; + + AZStd::unique_ptr m_assetHandler; + + void RegisterTranslationBuilder(); + + void RegisterAssetHandler(); + void UnregisterAssetHandler(); + TranslationAssetWorker m_translationAssetWorker; + AZStd::vector m_translationAssets; + void PopulateTranslationDatabase(); + + TranslationDatabase m_translationDatabase; }; } \ No newline at end of file diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationAsset.cpp b/Gems/GraphCanvas/Code/Source/Translation/TranslationAsset.cpp new file mode 100644 index 0000000000..4a22b95cf1 --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationAsset.cpp @@ -0,0 +1,250 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +namespace GraphCanvas +{ + void TranslationAsset::Reflect(AZ::ReflectContext* context) + { + if (AZ::JsonRegistrationContext* jsonContext = azrtti_cast(context)) + { + jsonContext->Serializer()->HandlesType(); + } + + + if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1) + ->Field("m_database", &TranslationFormat::m_database) + ; + + serializeContext->Class() + ->Version(0) + ; + } + } + + TranslationAsset::TranslationAsset(const AZ::Data::AssetId& assetId /*= AZ::Data::AssetId()*/, AZ::Data::AssetData::AssetStatus status /*= AZ::Data::AssetData::AssetStatus::NotLoaded*/) + : AZ::Data::AssetData(assetId, status) + { + } + + TranslationAssetHandler::TranslationAssetHandler() + { + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + + AZ::JsonRegistrationContext* jsonRegistrationContext; + AZ::ComponentApplicationBus::BroadcastResult(jsonRegistrationContext, &AZ::ComponentApplicationBus::Events::GetJsonRegistrationContext); + + auto reportCallback = [](AZStd::string_view /*message*/, AZ::JsonSerializationResult::ResultCode result, AZStd::string_view /*target*/)-> + AZ::JsonSerializationResult::ResultCode + { + return result; + }; + + m_serializationSettings = AZStd::make_unique(); + m_serializationSettings->m_serializeContext = serializeContext; + m_serializationSettings->m_registrationContext = jsonRegistrationContext; + m_serializationSettings->m_reporting = reportCallback; + + m_deserializationSettings = AZStd::make_unique(); + m_deserializationSettings->m_serializeContext = serializeContext; + m_deserializationSettings->m_registrationContext = jsonRegistrationContext; + m_deserializationSettings->m_reporting = reportCallback; + + m_jsonSerializationContext = AZStd::make_unique(*m_serializationSettings, m_jsonAllocator); + m_jsonDeserializationContext = AZStd::make_unique(*m_deserializationSettings); + + m_serializer = AZStd::make_unique(); + } + + TranslationAssetHandler::~TranslationAssetHandler() + { + Unregister(); + } + + AZ::Data::AssetPtr TranslationAssetHandler::CreateAsset(const AZ::Data::AssetId& id, const AZ::Data::AssetType& type) + { + AZ_UNUSED(type); + AZ_Assert(type == GetAssetType(), "Invalid asset type! TranslationAssetHandler will handle only 'TranslationAsset'"); + + // Look up the asset path to ensure it's actually a behavior tree library. + if (!CanHandleAsset(id)) + { + return nullptr; + } + + return aznew TranslationAsset; + } + + AZ::Data::AssetType TranslationAssetHandler::GetAssetType() const + { + return AZ::AzTypeInfo::Uuid(); + } + + const char* TranslationAssetHandler::GetAssetTypeDisplayName() const + { + return "Names"; + } + + const char* TranslationAssetHandler::GetGroup() const + { + return "Names"; + } + + const char* TranslationAssetHandler::GetBrowserIcon() const + { + return "Editor/Icons/Components/Names.svg"; + } + + AZ::Uuid TranslationAssetHandler::GetComponentTypeId() const + { + return AZ::Uuid::CreateNull(); + } + + void TranslationAssetHandler::GetAssetTypeExtensions(AZStd::vector& extensions) + { + extensions.push_back("names"); + } + + AZ::Data::AssetHandler::LoadResult TranslationAssetHandler::LoadAssetData( + const AZ::Data::Asset& asset, AZStd::shared_ptr stream, + const AZ::Data::AssetFilterCB&) + { + AZ::Data::AssetHandler::LoadResult result = AZ::Data::AssetHandler::LoadResult::LoadComplete; + + auto sizeBytes = stream->GetLoadedSize(); + + AZStd::unique_ptr buffer = AZStd::make_unique(sizeBytes + 1); + if (stream->Read(sizeBytes, buffer.get())) + { + buffer[sizeBytes] = '\0'; + + rapidjson::Document document; + + bool failure = false; + if (document.Parse(buffer.get()).HasParseError()) + { + failure = true; + + AZStd::string errorStr = AZStd::string::format( + "Error parsing JSON contents (offset %zu): %s", document.GetErrorOffset(), + rapidjson::GetParseError_En(document.GetParseError())); + + AZ_Error("TranslationDatabase", false, "Parse error in %s (%s)", asset.GetHint().c_str(), errorStr.c_str()); + + result = AssetHandler::LoadResult::Error; + } + else + { + const rapidjson::Value& rootValue = document.GetObject(); + if (!document.IsObject()) + { + failure = true; + } + + if (!failure) + { + using namespace AZ::JsonSerializationResult; + + TranslationFormat translationFormat; + + ResultCode serializerResult = m_serializer->Load( + &translationFormat, azrtti_typeid(), rootValue, *m_jsonDeserializationContext); + if (serializerResult.GetOutcome() == Outcomes::Success) + { + // Add the newly loaded translation data into the global database + bool warnings = false; + TranslationRequestBus::BroadcastResult(warnings, &TranslationRequests::Add, translationFormat); + if (warnings) + { + AZ_Warning("TranslationAsset", false, "Unable to add translation data to database for file: %s", asset.GetHint().c_str()); + } + } + else + { + AZ_Error("TranslationAsset", false, "Serialization of the TranslationFormat failed for: %s", asset.GetHint().c_str()); + } + } + } + } + + return result; + } + + void TranslationAssetHandler::DestroyAsset(AZ::Data::AssetPtr ptr) + { + delete ptr; + } + + void TranslationAssetHandler::GetHandledAssetTypes(AZStd::vector& assetTypes) + { + assetTypes.push_back(GetAssetType()); + } + + void TranslationAssetHandler::Register() + { + AZ_Assert(AZ::Data::AssetManager::IsReady(), "Asset manager isn't ready!"); + + auto assetType = GetAssetType(); + AZ::Data::AssetManager::Instance().RegisterHandler(this, assetType); + + // Use AssetCatalog service to register ScriptEvent asset type and extension + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::AddAssetType, assetType); + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::EnableCatalogForAsset, assetType); + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::AddExtension, TranslationAsset::GetFileFilter()); + + AZ::AssetTypeInfoBus::MultiHandler::BusConnect(assetType); + } + + void TranslationAssetHandler::Unregister() + { + AZ::AssetTypeInfoBus::MultiHandler::BusDisconnect(); + + m_serializer.reset(); + + if (AZ::Data::AssetManager::IsReady()) + { + AZ::Data::AssetManager::Instance().UnregisterHandler(this); + } + } + + bool TranslationAssetHandler::CanHandleAsset(const AZ::Data::AssetId&) const + { + return true; + } +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationAsset.h b/Gems/GraphCanvas/Code/Source/Translation/TranslationAsset.h new file mode 100644 index 0000000000..c2ad4db089 --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationAsset.h @@ -0,0 +1,161 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include "TranslationSerializer.h" + +namespace GraphCanvas +{ + // Stores a key/value database of strings that users can query translated + // names from + class TranslationFormat + { + public: + + AZ_RTTI(TranslationFormat, "{F51F816E-AEFB-40D4-B3DC-8478364AEB82}"); + + virtual ~TranslationFormat() = default; + + AZStd::unordered_map m_database; + }; + + // These are individual assets that store portions of the TranslationDatabase + // during load time, the TranslationDatabase will enumerate through all of these + // and build itself up + class TranslationAsset + : public AZ::Data::AssetData + { + public: + + AZ_RTTI(TranslationAsset, "{6A1A3B00-3DF2-4297-96BB-3BA067A978E6}", AZ::Data::AssetData); + AZ_CLASS_ALLOCATOR(TranslationAsset, AZ::SystemAllocator, 0); + + TranslationAsset(const AZ::Data::AssetId& assetId = AZ::Data::AssetId(), AZ::Data::AssetData::AssetStatus status = AZ::Data::AssetData::AssetStatus::NotLoaded); + + TranslationAsset(const TranslationAsset& rhs) = default; + ~TranslationAsset() = default; + + static const char* GetDisplayName() { return "Graph Canvas Translation"; } + static const char* GetGroup() { return "GraphCanvas"; } + static const char* GetFileFilter() { return ".names"; } + + static void Reflect(AZ::ReflectContext* context); + + TranslationFormat m_translationData; + + }; + + //! TranslationAssetHandler will process JSON based files that provide a mapping from string, string + //! the key will be generated using the JSON file structure, but does have some requirements. + //! + //! Requirements: + //! - Must have a top level array called "entries" + //! - Must provide a "key" element for any entry added + //! + //! Example: + //! + //! { + //! "entries": [ + //! { + //! "key": "Globals", + //! "details": { + //! "name": "My Name", + //! "tooltip": "My Tooltip" + //! } + //! ] + //! } + //! + //! The example JSON will produce the following database: + //! + //! [Globals.details.name, "My Name"] + //! [Globals.details.tooltip", "My Tooltip"] + //! + //! Arrays + //! Arrays are supported and will contain an index value encoded into the key, for an array called "somearray" these may look like this: + //! "somearray": [ { + //! "name": "First one" + //! }, { + //! "name": "Second one" + //! } ] + //! + //! Globals.details.somearray.0.name + //! Globals.details.somearray.1.name + //! + //! There is one important aspect however, if an element in an array has a "key" value, the value of this key + //! will replace the index. This is useful when the index and/or ordering of an entry is not relevant or may + //! change. + //! + //! "somearray": [ { + //! "name": "First one" + //! "key": "a_key" + //! }, { + //! "name": "Second one", + //! "key": "b_key" + //! } ] + //! + //! Globals.details.somearray.0.key == "a_key" + //! Globals.details.somearray.0.name == "First one" + //! Globals.details.somearray.1.key == "b_key" + //! Globals.details.somearray.1.name == "Second one" + //! + class TranslationAssetHandler + : public AZ::Data::AssetHandler + , protected AZ::AssetTypeInfoBus::MultiHandler + { + public: + AZ_CLASS_ALLOCATOR(TranslationAssetHandler, AZ::SystemAllocator, 0); + AZ_RTTI(TranslationAssetHandler, "{C161AB3B-86F6-4CB1-9DAE-83F2DE084CF4}", AZ::Data::AssetHandler); + + TranslationAssetHandler(); + ~TranslationAssetHandler() override; + + ////////////////////////////////////////////////////////////////////////////////////////////// + // AZ::Data::AssetHandler + AZ::Data::AssetPtr CreateAsset(const AZ::Data::AssetId& id, const AZ::Data::AssetType& type) override; + AZ::Data::AssetHandler::LoadResult LoadAssetData(const AZ::Data::Asset& asset, AZStd::shared_ptr stream, const AZ::Data::AssetFilterCB& assetLoadFilterCB) override; + void DestroyAsset(AZ::Data::AssetPtr ptr) override; + void GetHandledAssetTypes(AZStd::vector& assetTypes) override; + bool CanHandleAsset(const AZ::Data::AssetId& id) const override; + ////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////////////////////////// + // AZ::AssetTypeInfoBus::Handler + AZ::Data::AssetType GetAssetType() const override; + const char* GetAssetTypeDisplayName() const override; + const char* GetGroup() const override; + const char* GetBrowserIcon() const override; + AZ::Uuid GetComponentTypeId() const override; + void GetAssetTypeExtensions(AZStd::vector& extensions) override; + ////////////////////////////////////////////////////////////////////////////////////////////// + + void Register(); + void Unregister(); + + private: + + AZStd::unique_ptr m_serializer; + + AZStd::unique_ptr m_serializationSettings; + AZStd::unique_ptr m_deserializationSettings; + AZStd::unique_ptr m_jsonSerializationContext; + AZStd::unique_ptr m_jsonDeserializationContext; + + rapidjson::Document::AllocatorType m_jsonAllocator; + + }; + +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationBuilder.cpp b/Gems/GraphCanvas/Code/Source/Translation/TranslationBuilder.cpp new file mode 100644 index 0000000000..f1fdeab62a --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationBuilder.cpp @@ -0,0 +1,56 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "TranslationBuilder.h" +#include "TranslationAsset.h" + +namespace GraphCanvas +{ + constexpr const char* s_graphCanvasTranslationBuilderName = "GraphCanvasTranslationBuilder"; + + AZ::Uuid TranslationAssetWorker::GetUUID() + { + return AZ::Uuid::CreateString("{459EF910-CAAF-465A-BA19-C91979DA5729}"); + } + + const char* TranslationAssetWorker::GetFingerprintString() const + { + if (m_fingerprintString.empty()) + { + // compute it the first time + const AZStd::string runtimeAssetTypeId = azrtti_typeid().ToString(); + m_fingerprintString = AZStd::string::format("%i%s", GetVersionNumber(), runtimeAssetTypeId.c_str()); + } + return m_fingerprintString.c_str(); + } + + void TranslationAssetWorker::Activate() + { + // Use AssetCatalog service to register ScriptCanvas asset type and extension + AZ::Data::AssetType assetType(azrtti_typeid()); + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::AddAssetType, assetType); + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::EnableCatalogForAsset, assetType); + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::AddExtension, TranslationAsset::GetFileFilter()); + + m_assetHandler = AZStd::make_unique(); + if (!AZ::Data::AssetManager::Instance().GetHandler(assetType)) + { + AZ::Data::AssetManager::Instance().RegisterHandler(m_assetHandler.get(), assetType); + } + } + + void TranslationAssetWorker::ShutDown() + { + m_isShuttingDown = true; + } + +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationBuilder.h b/Gems/GraphCanvas/Code/Source/Translation/TranslationBuilder.h new file mode 100644 index 0000000000..084cb49319 --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationBuilder.h @@ -0,0 +1,58 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include + +#include + +namespace GraphCanvas +{ + + class TranslationAssetWorker + : public AssetBuilderSDK::AssetBuilderCommandBus::Handler + { + public: + + TranslationAssetWorker() = default; + ~TranslationAssetWorker() override = default; + + int GetVersionNumber() const { return 1; } + const char* GetFingerprintString() const; + + //! Asset Builder Callback Functions + void CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) const; + void ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) const; + + ////////////////////////////////////////////////////////////////////////// + //!AssetBuilderSDK::AssetBuilderCommandBus interface + void ShutDown() override; + ////////////////////////////////////////////////////////////////////////// + + void Activate(); + void Deactivate(); + + static AZ::Uuid GetUUID(); + + private: + TranslationAssetWorker(const TranslationAssetWorker&) = delete; + bool m_isShuttingDown = false; + + AZStd::unique_ptr m_assetHandler; + + // cached on first time query + mutable AZStd::string m_fingerprintString; + }; +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationBus.h b/Gems/GraphCanvas/Code/Source/Translation/TranslationBus.h new file mode 100644 index 0000000000..9940ba8a86 --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationBus.h @@ -0,0 +1,189 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include "TranslationAsset.h" + +#include + +namespace GraphCanvas +{ + namespace Translation + { + using Handle = size_t; + } + + class TranslationKey + { + public: + + TranslationKey() = default; + explicit TranslationKey(const AZStd::string& key) + : m_key(key) + {} + + TranslationKey(const TranslationKey& rhs) + { + m_key = rhs.m_key; + } + + TranslationKey& operator = (const AZStd::string& key) + { + m_key = key; + return *this; + } + + bool operator == (const TranslationKey& rhs) const + { + return m_key.compare(rhs.m_key) == 0; + } + + template + auto operator << (T value) -> AZStd::enable_if_t, void>, TranslationKey&> + { + if (!m_key.empty() && !AZStd::to_string(value).empty()) + { + m_key.append("."); + } + + if (!AZStd::to_string(value).empty()) + { + m_key.append(AZStd::to_string(value)); + } + + return *this; + } + + TranslationKey& operator << (const AZStd::string& value) + { + if (!m_key.empty() && !value.empty()) + { + m_key.append("."); + } + if (!value.empty()) + { + m_key.append(value.c_str()); + } + + return *this; + } + + const AZStd::string operator + (const AZStd::string& value) + { + return m_key + value; + } + + void clear() { m_key.clear(); } + + const AZStd::string& ToString() const { return m_key; } + + operator AZStd::string() { return m_key; } + + static AZStd::string Sanitize(const AZStd::string& text) + { + AZStd::string result = text; + AZ::StringFunc::Replace(result, ":", "_"); + AZ::StringFunc::Replace(result, "<", "_"); + AZ::StringFunc::Replace(result, ",", "_"); + AZ::StringFunc::Replace(result, ">", " "); + AZ::StringFunc::Strip(result, " "); + AZ::StringFunc::Path::Normalize(result); + return result; + } + + protected: + + AZStd::string m_key; + + }; + + //! Requests to access the database + class TranslationRequests : public AZ::EBusTraits + { + public: + + using MutexType = AZStd::recursive_mutex; + + //! Restores the database from all the assets + virtual void Restore() {} + + //! Returns true if they database has the specified key + virtual bool HasKey(const AZStd::string& /*key*/) { return false; } + + //! Returns the text value for a given key + virtual const char* Get(const AZStd::string& /*key*/) { return nullptr; } + + struct Details + { + AZStd::string Name; + AZStd::string Tooltip; + AZStd::string Category; + AZStd::string Subtitle; + + bool Valid = false; + + Details() = default; + + Details(const Details& rhs) + { + Name = rhs.Name; + Tooltip = rhs.Tooltip; + Subtitle = rhs.Subtitle; + Category = rhs.Category; + Valid = rhs.Valid; + } + + Details(const char* name, const char* tooltip, const char* subtitle, const char* category) + : Name(name), Tooltip(tooltip), Subtitle(subtitle), Category(category) + { + Valid = !Name.empty(); + } + }; + + //! Adds an entry into the database, returns true if there were any warnings while adding to the database + virtual bool Add(const TranslationFormat& /*translationFormat*/) { return false; } + + //! Get the details associated with a given key (assumes they are within a "details" object) + virtual Details GetDetails(const AZStd::string& /*key*/) { return Details(); } + + //! Generates the source JSON assets for all reflected elements + virtual void GenerateSourceAssets() {} + + //! Stores the runtime database into a json file for debugging only + virtual void DumpDatabase(const AZStd::string& /*filename*/) {} + }; + + using TranslationRequestBus = AZ::EBus; + +} + +namespace AZStd +{ + template + struct hash; + + // hashing support for STL containers + template <> + struct hash + { + using argument_type = GraphCanvas::TranslationKey; + using result_type = AZStd::size_t; + + inline size_t operator()(const GraphCanvas::TranslationKey& value) const + { + size_t h = 0; + hash_combine(h, value.ToString().c_str()); + return h; + } + }; +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationDatabase.cpp b/Gems/GraphCanvas/Code/Source/Translation/TranslationDatabase.cpp new file mode 100644 index 0000000000..f673621b46 --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationDatabase.cpp @@ -0,0 +1,170 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "GraphCanvas.h" + +namespace GraphCanvas +{ + + TranslationDatabase::TranslationDatabase() + { + TranslationRequestBus::Handler::BusConnect(); + } + + TranslationDatabase::~TranslationDatabase() + { + TranslationRequestBus::Handler::BusDisconnect(); + AZ::Data::AssetBus::MultiHandler::BusDisconnect(); + } + + void TranslationDatabase::Init() + { + AzFramework::AssetCatalogEventBus::Handler::BusConnect(); + } + + void TranslationDatabase::Restore() + { + AZStd::lock_guard lock(m_mutex); + + m_database.clear(); + + AZStd::function reloadFn = [this]() + { + // Collects all script assets for reloading + AZ::Data::AssetCatalogRequests::AssetEnumerationCB collectAssetsCb = [this](const AZ::Data::AssetId, const AZ::Data::AssetInfo& info) + { + // Check asset type + if (info.m_assetType == azrtti_typeid()) + { + auto asset = AZ::Data::AssetManager::Instance().GetAsset(info.m_assetId, AZ::Data::AssetLoadBehavior::Default); + if (asset && asset.IsReady()) + { + // Reload the asset from it's current data + asset.Reload(); + } + } + }; + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequestBus::Events::EnumerateAssets, nullptr, collectAssetsCb, nullptr); + }; + + AZ::TickBus::QueueFunction(reloadFn); + } + + void TranslationDatabase::DumpDatabase(const AZStd::string& filename) + { + rapidjson::Document document; + document.SetObject(); + rapidjson::Value entries(rapidjson::kArrayType); + + for (const auto& entry : m_database) + { + rapidjson::Value key(rapidjson::kStringType); + key.SetString(entry.first.c_str(), document.GetAllocator()); + + rapidjson::Value value(rapidjson::kStringType); + value.SetString(entry.second.c_str(), document.GetAllocator()); + + rapidjson::Value item(rapidjson::kObjectType); + item.AddMember(key, value, document.GetAllocator()); + + entries.PushBack(item, document.GetAllocator()); + + } + + document.AddMember("entries", entries, document.GetAllocator()); + + AZ::IO::SystemFile outputFile; + if (!outputFile.Open(filename.c_str(), + AZ::IO::SystemFile::OpenMode::SF_OPEN_CREATE | + AZ::IO::SystemFile::OpenMode::SF_OPEN_CREATE_PATH | + AZ::IO::SystemFile::OpenMode::SF_OPEN_WRITE_ONLY)) + { + AZ_Error("Translation", false, "Failed to create output file: %s", filename.c_str()); + return; + } + + rapidjson::StringBuffer scratchBuffer; + + rapidjson::PrettyWriter writer(scratchBuffer); + document.Accept(writer); + + outputFile.Write(scratchBuffer.GetString(), scratchBuffer.GetSize()); + outputFile.Close(); + + scratchBuffer.Clear(); + } + + bool TranslationDatabase::HasKey(const AZStd::string& key) + { + return m_database.find(key) != m_database.end(); + } + + GraphCanvas::TranslationRequests::Details TranslationDatabase::GetDetails(const AZStd::string& key) + { + const char* name = Get(key + ".name"); + const char* tooltip = Get(key + ".tooltip"); + const char* subtitle = Get(key + ".subtitle"); + const char* category = Get(key + ".category"); + + static bool s_traceMissingItems = true; + if (s_traceMissingItems) + { + AZ_TracePrintf("GraphCanvas", AZStd::string::format("Value (name) not found for key: %s", key.c_str()).c_str()); + AZ_TracePrintf("GraphCanvas", AZStd::string::format("Value (tooltip) not found for key: %s", key.c_str()).c_str()); + AZ_TracePrintf("GraphCanvas", AZStd::string::format("Value (subtitle) not found for key: %s", key.c_str()).c_str()); + AZ_TracePrintf("GraphCanvas", AZStd::string::format("Value (category) not found for key: %s", key.c_str()).c_str()); + } + + return Details(name ? name : "", tooltip ? tooltip : "", subtitle ? subtitle : "", category ? category : ""); + } + + const char* TranslationDatabase::Get(const AZStd::string& key) + { + AZStd::lock_guard lock(m_mutex); + + if (m_database.find(key) != m_database.end()) + { + return m_database[key].c_str(); + } + + return ""; + } + + bool TranslationDatabase::Add(const TranslationFormat& format) + { + AZStd::lock_guard lock(m_mutex); + + bool warnings = false; + + for (auto& entry : format.m_database) + { + if (m_database.find(entry.first) == m_database.end()) + { + m_database[entry.first] = entry.second; + } + else + { + AZStd::string warning = AZStd::string::format("Unable to store key: %s with value: %s because that key already exists with value: %s", entry.first.c_str(), entry.second.c_str(), m_database[entry.first].c_str()); + AZ_Warning("TranslationSerializer", false, warning.c_str()); + warnings = true; + } + } + + return warnings; + } + + bool TranslationDatabase::IsDuplicate(const AZStd::string& key) + { + return m_database.find(key) != m_database.end(); + } + +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationDatabase.h b/Gems/GraphCanvas/Code/Source/Translation/TranslationDatabase.h new file mode 100644 index 0000000000..5862648612 --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationDatabase.h @@ -0,0 +1,64 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace GraphCanvas +{ + + // This does not get stored as-is, this is built up during editor load + // time and becomes the one source of truth for translated or "pretty named" things. + class TranslationDatabase + : protected TranslationRequestBus::Handler + , protected AZ::Data::AssetBus::MultiHandler + , protected AZ::Data::AssetCatalogRequestBus::Handler + , protected AzFramework::AssetCatalogEventBus::Handler + { + public: + + TranslationDatabase(); + + ~TranslationDatabase(); + + void Init(); + + void Restore() override; + + void DumpDatabase(const AZStd::string& filename) override; + + bool HasKey(const AZStd::string& key) override; + + TranslationRequests::Details GetDetails(const AZStd::string& key) override; + + const char* Get(const AZStd::string& key) override; + + bool Add(const TranslationFormat& format) override; + + private: + + bool IsDuplicate(const AZStd::string& key); + + AZStd::unordered_map m_database; + + AZStd::recursive_mutex m_mutex; + }; +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationSerializer.cpp b/Gems/GraphCanvas/Code/Source/Translation/TranslationSerializer.cpp new file mode 100644 index 0000000000..5b723435ab --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationSerializer.cpp @@ -0,0 +1,210 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include + +namespace GraphCanvas +{ + namespace Schema + { + namespace Field + { + static constexpr char key[] = "key"; + static constexpr char context[] = "context"; + static constexpr char variant[] = "variant"; + static constexpr char entries[] = "entries"; + } + + static const AZStd::string_view RequiredFields[] = + { + Field::key, + Field::context, + Field::variant, + Field::entries + }; + } + + AZ_CLASS_ALLOCATOR_IMPL(TranslationFormatSerializer, AZ::SystemAllocator, 0); + + void AddEntryToDatabase(const AZStd::string& baseKey, const AZStd::string& name, const rapidjson::Value& it, TranslationFormat* translationFormat) + { + AZStd::string finalKey = baseKey; + if (it.IsString()) + { + if (translationFormat->m_database.find(finalKey) == translationFormat->m_database.end()) + { + translationFormat->m_database[finalKey] = it.GetString(); + } + else + { + // There is a name collision + AZStd::string error = AZStd::string::format("Unable to store key: %s with value: %s because that key already exists", finalKey.c_str(), it.GetString()); + AZ_Error("TranslationSerializer", false, error.c_str()); + } + } + else if (it.IsObject()) + { + if (!name.empty()) + { + finalKey.append("."); + finalKey.append(name); + } + + AZStd::string itemKey = finalKey; + for (auto objIt = it.MemberBegin(); objIt != it.MemberEnd(); ++objIt) + { + itemKey.append("."); + itemKey.append(objIt->name.GetString()); + + AddEntryToDatabase(itemKey, name, objIt->value, translationFormat); + + itemKey = finalKey; + } + + } + else if (it.IsArray()) + { + AZStd::string key = baseKey; + if (!name.empty()) + { + key.append("."); + key.append(name); + } + + AZStd::string itemKey = key; + + const rapidjson::Value& array = it; + for (rapidjson::SizeType i = 0; i < array.Size(); ++i) + { + // so, here, I need to go in and if there is a "key" member within the object, then I need to use that, + // if there isn't, I can use the %d + if (array[i].IsObject()) + { + if (array[i].HasMember(Schema::Field::key)) + { + AZStd::string innerKey = array[i].FindMember(Schema::Field::key)->value.GetString(); + itemKey.append(AZStd::string::format(".%s", innerKey.c_str())); + } + else + { + itemKey.append(AZStd::string::format(".%d", i)); + } + } + + AddEntryToDatabase(itemKey, "", array[i], translationFormat); + + itemKey = key; + } + } + } + + AZ::JsonSerializationResult::Result TranslationFormatSerializer::Load(void* outputValue, const AZ::Uuid& outputValueTypeId, + const rapidjson::Value& inputValue, AZ::JsonDeserializerContext& context) + { + AZ_Assert(azrtti_typeid() == outputValueTypeId, + "Unable to deserialize TranslationFormat to json because the provided type is %s", + outputValueTypeId.ToString().c_str()); + AZ_UNUSED(outputValueTypeId); + + TranslationFormat* translationFormat = reinterpret_cast(outputValue); + AZ_Assert(translationFormat, "Output value for TranslationFormatSerializer can't be null."); + + namespace JSR = AZ::JsonSerializationResult; + JSR::ResultCode result(JSR::Tasks::ReadField); + + if (!inputValue.IsObject()) + { + return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Unsupported, "Translation data must be a JSON object."); + } + + if (!inputValue.HasMember(Schema::Field::entries) || !inputValue[Schema::Field::entries].IsArray()) + { + return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Unsupported, "Translation data must be have a top level array of: entries"); + } + + // Go over the entries + { + const rapidjson::Value::ConstMemberIterator entries = inputValue.FindMember(Schema::Field::entries); + + rapidjson::SizeType entryCount = entries->value.Size(); + for (rapidjson::SizeType i = 0; i < entryCount; ++i) + { + const rapidjson::Value& entry = entries->value[i]; + + AZStd::string keyStr; + rapidjson::Value::ConstMemberIterator keyValue; + if (entry.HasMember(Schema::Field::key)) + { + keyValue = entry.FindMember(Schema::Field::key); + keyStr = keyValue->value.GetString(); + } + + AZStd::string contextStr; + rapidjson::Value::ConstMemberIterator contextValue; + if (entry.HasMember(Schema::Field::context)) + { + contextValue = entry.FindMember(Schema::Field::context); + contextStr = contextValue->value.GetString(); + } + + AZStd::string variantStr; + rapidjson::Value::ConstMemberIterator variantValue; + if (entry.HasMember(Schema::Field::variant)) + { + variantValue = entry.FindMember(Schema::Field::variant); + variantStr = variantValue->value.GetString(); + } + + AZStd::string baseKey = contextStr; + if (keyStr.empty()) + { + AZ_Error("TranslationDatabase", false, "Every entry in the Translation data must have a key: %s", baseKey.c_str()); + return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Unsupported, "Every entry in the Translation data must have a key"); + } + + if (!baseKey.empty()) + { + baseKey.append("."); + } + + baseKey.append(keyStr); + + if (!variantStr.empty()) + { + baseKey.append("."); + baseKey.append(variantStr); + } + + // Iterate over all members of entry + for (auto it = entry.MemberBegin(); it != entry.MemberEnd(); ++it) + { + // Skip the fixed elements + if (it == keyValue || it == contextValue || it == variantValue) + { + continue; + } + AddEntryToDatabase(baseKey, it->name.GetString(), it->value, translationFormat); + } + } + } + + return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Success, "Translation load success"); + } + + AZ::JsonSerializationResult::Result TranslationFormatSerializer::Store(rapidjson::Value& /*outputValue*/, const void* /*inputValue*/, + const void* /*defaultValue*/, const AZ::Uuid& /*valueTypeId*/, AZ::JsonSerializerContext& context) + { + namespace JSR = AZ::JsonSerializationResult; + return context.Report(JSR::Tasks::WriteValue, JSR::Outcomes::Unsupported, "Storing a Translation asset is not currently supported"); + } +} diff --git a/Gems/GraphCanvas/Code/Source/Translation/TranslationSerializer.h b/Gems/GraphCanvas/Code/Source/Translation/TranslationSerializer.h new file mode 100644 index 0000000000..d1bfeec72c --- /dev/null +++ b/Gems/GraphCanvas/Code/Source/Translation/TranslationSerializer.h @@ -0,0 +1,30 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace GraphCanvas +{ + class TranslationFormatSerializer + : public AZ::BaseJsonSerializer + { + public: + AZ_RTTI(TranslationFormatSerializer, "{DA2EE2D2-4BF9-430F-BDA2-41D8A7EF2B31}", BaseJsonSerializer); + AZ_CLASS_ALLOCATOR_DECL; + AZ::JsonSerializationResult::Result Load(void* outputValue, const AZ::Uuid& outputValueTypeId, + const rapidjson::Value& inputValue, AZ::JsonDeserializerContext& context) override; + AZ::JsonSerializationResult::Result Store(rapidjson::Value& outputValue, const void* inputValue, + const void* defaultValue, const AZ::Uuid& valueTypeId, AZ::JsonSerializerContext& context) override; + }; +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Data/DataSlotBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Data/DataSlotBus.h index 0009f3f5b7..499ea6474d 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Data/DataSlotBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Data/DataSlotBus.h @@ -59,6 +59,7 @@ namespace GraphCanvas bool m_canConvertTypes = true; DataSlotType m_dataSlotType = DataSlotType::Value; DataValueType m_dataValueType = DataValueType::Primitive; + bool m_isUserAdded = false; AZ::Uuid m_typeId; AZStd::vector m_containerTypeIds; @@ -83,6 +84,8 @@ namespace GraphCanvas virtual AZ::Uuid GetDataTypeId() const = 0; virtual void SetDataTypeId(AZ::Uuid typeId) = 0; + virtual bool IsUserSlot() const = 0; + virtual const Styling::StyleHelper* GetDataColorPalette() const = 0; virtual size_t GetContainedTypesCount() const = 0; diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/GraphModelBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/GraphModelBus.h index 294ad73a2d..b11f3d8555 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/GraphModelBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/GraphModelBus.h @@ -206,10 +206,17 @@ namespace GraphCanvas ////////////////////////////////////// // Extender Slot Optional Overrides + enum class ExtensionRequestReason + { + Internal, + UserRequest, + ConnectionProposal + }; + // Request an extension to the node for the specified group from the specific Node and ExtenderId. // // Should return the appropriate slotId for the newly added slots. - virtual SlotId RequestExtension([[maybe_unused]] const NodeId& nodeId, [[maybe_unused]] const ExtenderId& extenderId) + virtual SlotId RequestExtension([[maybe_unused]] const NodeId& nodeId, [[maybe_unused]] const ExtenderId& extenderId, ExtensionRequestReason) { return SlotId(); } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.cpp index 8be9496e9c..965dfc9b83 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.cpp @@ -37,6 +37,7 @@ namespace GraphCanvas void RemoveSlotMenuAction::RefreshAction() { bool enableAction = false; + bool isUserSlot = false; const AZ::EntityId& targetId = GetTargetId(); const GraphId& graphId = GetGraphId(); @@ -51,9 +52,14 @@ namespace GraphCanvas GraphModelRequestBus::EventResult(enableAction, graphId, &GraphModelRequests::IsSlotRemovable, endpoint); } + + if (GraphUtils::IsSlotType(targetId, SlotTypes::DataSlot)) + { + DataSlotRequestBus::EventResult(isUserSlot, targetId, &DataSlotRequests::IsUserSlot); + } } - setEnabled(enableAction); + setEnabled(enableAction || isUserSlot); } ContextMenuAction::SceneReaction RemoveSlotMenuAction::TriggerAction(const AZ::Vector2& /*scenePos*/) @@ -324,6 +330,7 @@ namespace GraphCanvas void PromoteToVariableAction::RefreshAction() { bool enableAction = false; + bool isUserSlot = false; const AZ::EntityId& targetId = GetTargetId(); const GraphId& graphId = GetGraphId(); @@ -333,6 +340,8 @@ namespace GraphCanvas SlotType slotType = SlotTypes::Invalid; SlotRequestBus::EventResult(slotType, targetId, &SlotRequests::GetSlotType); + DataSlotRequestBus::EventResult(isUserSlot, targetId, &DataSlotRequests::IsUserSlot); + if (slotType == SlotTypes::DataSlot) { ConnectionType connectionType = CT_Invalid; @@ -359,7 +368,7 @@ namespace GraphCanvas } } - setEnabled(enableAction); + setEnabled(enableAction && !isUserSlot); } GraphCanvas::ContextMenuAction::SceneReaction PromoteToVariableAction::TriggerAction(const AZ::Vector2& /*scenePos*/) diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.cpp index 2268307213..78008ff78b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.cpp @@ -95,25 +95,6 @@ namespace GraphCanvas intermediateRoot = m_rootMaps[key]; } - /*AZStd::vector categories; - AzFramework::StringFunc::Tokenize(categoryPath, categories, "/", true, true); - - for (auto it = categories.begin(); it < categories.end(); it++) - { - AZStd::string intermediatePath; - AzFramework::StringFunc::Join(intermediatePath, categories.begin(), it + 1, "/"); - - CategoryKey key(parentRoot, intermediatePath); - - if (m_rootMaps.find(key) == m_rootMaps.end()) - { - GraphCanvas::GraphCanvasTreeItem* treeItem = m_categorizerInterface.CreateCategoryNode(intermediatePath, it->c_str(), intermediateRoot); - m_rootMaps[key] = treeItem; - } - - intermediateRoot = m_rootMaps[key]; - }*/ - return intermediateRoot; } @@ -124,20 +105,24 @@ namespace GraphCanvas for (auto& mapPair : m_rootMaps) { - if (mapPair.second->GetChildCount() == 0 && mapPair.second->AllowPruneOnEmpty()) + if (mapPair.second) { - GraphCanvas::GraphCanvasTreeItem* parentItem = mapPair.second->GetParent(); - mapPair.second->DetachItem(); - - if (parentItem->GetChildCount() == 0 && mapPair.second->AllowPruneOnEmpty()) + if (mapPair.second->GetChildCount() == 0 && mapPair.second->AllowPruneOnEmpty()) { - potentialCategories.insert(parentItem); + if (GraphCanvas::GraphCanvasTreeItem* parentItem = mapPair.second->GetParent()) + { + if (parentItem->GetChildCount() == 0 && mapPair.second->AllowPruneOnEmpty()) + { + potentialCategories.insert(parentItem); + } + } + + mapPair.second->DetachItem(); + potentialCategories.erase(mapPair.second); + deletedKeys.push_back(mapPair.first); } - - potentialCategories.erase(mapPair.second); - deletedKeys.push_back(mapPair.first); - delete mapPair.second; } + } for (const CategoryKey& key : deletedKeys) @@ -163,30 +148,23 @@ namespace GraphCanvas void GraphCanvasTreeCategorizer::PruneNodes(AZStd::unordered_set< GraphCanvas::GraphCanvasTreeItem*> potentialPruners) { AZStd::unordered_set< GraphCanvas::GraphCanvasTreeItem* > deletedRoots; - while (!potentialPruners.empty()) { GraphCanvas::GraphCanvasTreeItem* treeItem = (*potentialPruners.begin()); potentialPruners.erase(potentialPruners.begin()); - if (treeItem && treeItem->GetChildCount() == 0 && treeItem->AllowPruneOnEmpty()) { GraphCanvas::GraphCanvasTreeItem* parentItem = static_cast(treeItem->GetParent()); - treeItem->DetachItem(); potentialPruners.insert(parentItem); - deletedRoots.insert(treeItem); delete treeItem; } } - auto mapIter = m_rootMaps.begin(); - while (mapIter != m_rootMaps.end() && !deletedRoots.empty()) { size_t erasedCount = deletedRoots.erase(mapIter->second); - if (erasedCount > 0) { mapIter = m_rootMaps.erase(mapIter); @@ -197,4 +175,4 @@ namespace GraphCanvas } } } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h index 4146a03f10..83aa939cde 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h @@ -58,4 +58,4 @@ namespace GraphCanvas bool m_debugEnabled; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h index c533dd3410..a63d414dd9 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h @@ -84,13 +84,14 @@ namespace GraphCanvas void SignalClicked(int row); bool SignalDoubleClicked(int row); - void SetError(const AZStd::string& errorString); void ClearError(); - protected: - bool HasError() const; + void SetError(const AZStd::string& errorString); + + protected: + void PreOnChildAdded(GraphCanvasTreeItem* item) override; void SetName(const QString& name); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/StyledItemDelegates/GenericComboBoxDelegate.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/StyledItemDelegates/GenericComboBoxDelegate.cpp index 5038750e59..d12ae4f7b5 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/StyledItemDelegates/GenericComboBoxDelegate.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/StyledItemDelegates/GenericComboBoxDelegate.cpp @@ -68,8 +68,6 @@ namespace GraphCanvas } cb->setSizeAdjustPolicy(QComboBox::SizeAdjustPolicy::AdjustToContents); - - cb->showPopup(); } else { diff --git a/Gems/GraphCanvas/Code/graphcanvas_files.cmake b/Gems/GraphCanvas/Code/graphcanvas_files.cmake index 6a86525ba0..98db1c7709 100644 --- a/Gems/GraphCanvas/Code/graphcanvas_files.cmake +++ b/Gems/GraphCanvas/Code/graphcanvas_files.cmake @@ -146,4 +146,14 @@ set(FILES Source/Widgets/GraphCanvasLabel.h Source/Widgets/NodePropertyDisplayWidget.cpp Source/Widgets/NodePropertyDisplayWidget.h + Source/Translation/TranslationAsset.h + Source/Translation/TranslationAsset.cpp + Source/Translation/TranslationBuilder.h + Source/Translation/TranslationBuilder.cpp + Source/Translation/TranslationBus.h + Source/Translation/TranslationDatabase.h + Source/Translation/TranslationDatabase.cpp + Source/Translation/TranslationSerializer.h + Source/Translation/TranslationSerializer.cpp + ) diff --git a/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h b/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h index 1d95200f0e..6583823055 100644 --- a/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h +++ b/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h @@ -186,7 +186,7 @@ namespace GraphModelIntegration /// Extendable slot handlers void RemoveSlot(const GraphCanvas::Endpoint& endpoint) override; bool IsSlotRemovable(const GraphCanvas::Endpoint& endpoint) const override; - GraphCanvas::SlotId RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId) override; + GraphCanvas::SlotId RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId, GraphModelRequests::ExtensionRequestReason) override; bool ShouldWrapperAcceptDrop(const GraphCanvas::NodeId& wrapperNode, const QMimeData* mimeData) const override; void AddWrapperDropTarget(const GraphCanvas::NodeId& wrapperNode) override; diff --git a/Gems/GraphModel/Code/Source/Integration/GraphController.cpp b/Gems/GraphModel/Code/Source/Integration/GraphController.cpp index 1e5d452c02..f6ce6282f4 100644 --- a/Gems/GraphModel/Code/Source/Integration/GraphController.cpp +++ b/Gems/GraphModel/Code/Source/Integration/GraphController.cpp @@ -1396,7 +1396,7 @@ namespace GraphModelIntegration } - GraphCanvas::SlotId GraphController::RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId) + GraphCanvas::SlotId GraphController::RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId, GraphModelRequests::ExtensionRequestReason ) { GraphCanvas::SlotId graphCanvasSlotId; diff --git a/Gems/GraphModel/Code/Tests/MockGraphCanvas.cpp b/Gems/GraphModel/Code/Tests/MockGraphCanvas.cpp index 06bd60a234..3f31a24c5d 100644 --- a/Gems/GraphModel/Code/Tests/MockGraphCanvas.cpp +++ b/Gems/GraphModel/Code/Tests/MockGraphCanvas.cpp @@ -108,6 +108,11 @@ namespace MockGraphCanvasServices return false; } + bool MockDataSlotComponent::IsUserSlot() const + { + return false; + } + bool MockDataSlotComponent::ConvertToValue() { return false; diff --git a/Gems/GraphModel/Code/Tests/MockGraphCanvas.h b/Gems/GraphModel/Code/Tests/MockGraphCanvas.h index 4abb294310..a13020269c 100644 --- a/Gems/GraphModel/Code/Tests/MockGraphCanvas.h +++ b/Gems/GraphModel/Code/Tests/MockGraphCanvas.h @@ -80,6 +80,8 @@ namespace MockGraphCanvasServices bool CanConvertToReference() const override; bool ConvertToValue() override; bool CanConvertToValue() const override; + bool IsUserSlot() const override; + GraphCanvas::DataSlotType GetDataSlotType() const override; GraphCanvas::DataValueType GetDataValueType() const override; AZ::Uuid GetDataTypeId() const override; diff --git a/Gems/ImGui/Code/CMakeLists.txt b/Gems/ImGui/Code/CMakeLists.txt index 0a828c0b2b..1f04033039 100644 --- a/Gems/ImGui/Code/CMakeLists.txt +++ b/Gems/ImGui/Code/CMakeLists.txt @@ -17,7 +17,6 @@ ly_get_list_relative_pal_filename(pal_source_dir ${CMAKE_CURRENT_LIST_DIR}/Sourc ly_add_target( NAME ImGui.imguilib ${PAL_TRAIT_MONOLITHIC_DRIVEN_LIBRARY_TYPE} NAMESPACE Gem - OUTPUT_NAME imguilib FILES_CMAKE imgui_lib_files.cmake ${pal_source_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp index ae3e5b4aa9..fb619d968d 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp @@ -235,25 +235,44 @@ namespace ImGui auto lvlSystem = (gEnv && gEnv->pSystem) ? gEnv->pSystem->GetILevelSystem() : nullptr; if (lvlSystem && ImGui::BeginMenu("Levels")) { - if (lvlSystem->GetCurrentLevel()) + if (lvlSystem->IsLevelLoaded()) { ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Current Level: "); ImGui::SameLine(); - ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "%s", lvlSystem->GetCurrentLevel()->GetLevelInfo()->GetName()); + ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "%s", lvlSystem->GetCurrentLevelName()); } - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Load Level: "); - for (int i = 0; i < lvlSystem->GetLevelCount(); i++) + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) { - if (ImGui::MenuItem(AZStd::string::format("%d- %s", i, lvlSystem->GetLevelInfo(i)->GetName()).c_str())) + char levelName[256]; + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Load Level: "); + bool result = ImGui::InputText("", levelName, sizeof(levelName), ImGuiInputTextFlags_EnterReturnsTrue); + if (result) { - AZStd::string mapCommandString = AZStd::string::format("map %s", lvlSystem->GetLevelInfo(i)->GetName()); - AZ::TickBus::QueueFunction([mapCommandString]() - { - gEnv->pConsole->ExecuteString(mapCommandString.c_str()); + AZ_TracePrintf("Imgui", "Attempting to load level '%s'\n", levelName); + AZ::TickBus::QueueFunction([lvlSystem, levelName]() { + lvlSystem->LoadLevel(levelName); }); } } + else + { + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Load Level: "); + for (int i = 0; i < lvlSystem->GetLevelCount(); i++) + { + if (ImGui::MenuItem(AZStd::string::format("%d- %s", i, lvlSystem->GetLevelInfo(i)->GetName()).c_str())) + { + AZStd::string mapCommandString = AZStd::string::format("map %s", lvlSystem->GetLevelInfo(i)->GetName()); + AZ::TickBus::QueueFunction([mapCommandString]() { + gEnv->pConsole->ExecuteString(mapCommandString.c_str()); + }); + } + } + } ImGui::EndMenu(); } diff --git a/Gems/ImageProcessing/Code/Tests/ImageProcessing_Test.cpp b/Gems/ImageProcessing/Code/Tests/ImageProcessing_Test.cpp index 8fafa9fd93..ce07f831ed 100644 --- a/Gems/ImageProcessing/Code/Tests/ImageProcessing_Test.cpp +++ b/Gems/ImageProcessing/Code/Tests/ImageProcessing_Test.cpp @@ -917,15 +917,15 @@ TEST_F(ImageProcessingTest, DISABLED_TestBuilderImageConvertor) /* //test cases for different presets //ddna - inputFile = "../SamplesProject/Objects/ParticleAssets/ShowRoom/showroom_pipe_blue_001_m_ddna.tif"; + inputFile = "../AutomatedTesting/Objects/ParticleAssets/ShowRoom/showroom_pipe_blue_001_m_ddna.tif"; ASSERT_TRUE(ConvertImageFile(inputFile, outputFolder, outPaths, m_context.get())); //cubemap - inputFile = "../SamplesProject/Levels/Samples/Camera_Sample/Cubemaps/noon_cm.tif"; + inputFile = "../AutomatedTesting/Levels/Samples/Camera_Sample/Cubemaps/noon_cm.tif"; ASSERT_TRUE(ConvertImageFile(inputFile, outputFolder, outPaths, m_context.get())); //albedo - inputFile = "../SamplesProject/Objects/ParticleAssets/ShowRoom/showroom_steel_brushed_001_diff.tif"; + inputFile = "../AutomatedTesting/Objects/ParticleAssets/ShowRoom/showroom_steel_brushed_001_diff.tif"; ASSERT_TRUE(ConvertImageFile(inputFile, outputFolder, outPaths, m_context.get())); - inputFile = "../SamplesProject/materials/pbs_reference/light_leather_diff.tif"; + inputFile = "../AutomatedTesting/materials/pbs_reference/light_leather_diff.tif"; ASSERT_TRUE(ConvertImageFile(inputFile, outputFolder, outPaths, m_context.get())); inputFile = "../Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel.tif"; ASSERT_TRUE(ConvertImageFile(inputFile, outputFolder, outPaths, m_context.get())); @@ -933,7 +933,7 @@ TEST_F(ImageProcessingTest, DISABLED_TestBuilderImageConvertor) inputFile = "../Bems/UiBasics/Assets/UI/Textures/Prefab/textinput_normal.tif"; ASSERT_TRUE(ConvertImageFile(inputFile, outputFolder, outPaths, m_context.get())); //albedo with generic alpha auto preset - inputFile = "../SamplesProject/textures/GettingStartedTextures/LY_Logo_Beaver.tif"; + inputFile = "../AutomatedTesting/textures/GettingStartedTextures/LY_Logo_Beaver.tif"; ASSERT_TRUE(ConvertImageFile(inputFile, outputFolder, outPaths, m_context.get())); //color chart inputFile = "../Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/colorcharts/debug_contrast_low_cch.tif"; @@ -946,7 +946,7 @@ TEST_F(ImageProcessingTest, DISABLED_TestBuilderImageConvertor) TEST_F(ImageProcessingTest, DISABLED_TestLoadDdsImage) { IImageObjectPtr originImage, alphaImage; - AZStd::string inputFolder = m_engineRoot + "/Cache/SamplesProject/pc/samplesproject/engineassets/texturemsg/"; + AZStd::string inputFolder = m_engineRoot + "/Cache/AutomatedTesting/pc/automatedtesting/engineassets/texturemsg/"; AZStd::string inputFile; inputFile = "E:/Javelin_NWLYDev/dev/Cache/Assets/pc/assets/textures/blend_maps/moss/jav_moss_ddn.dds"; diff --git a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp index 0afec8e1ba..9c52242052 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp @@ -20,7 +20,10 @@ #include #include #include +#include +#include #include +#include #ifdef LMBR_CENTRAL_EDITOR #include #endif @@ -426,6 +429,13 @@ namespace LmbrCentral , m_movementMethod(NavigationComponentRequests::MovementMethod::Physics) , m_usesCharacterPhysics(false) , m_allowVerticalNavigation(false) + , m_sceneStartSimHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + float fixedDeltatime + ) + { + this->MoveEntity(fixedDeltatime); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Components)) { } @@ -619,7 +629,11 @@ namespace LmbrCentral // Connect to physics bus if appropriate, else tick bus if ((m_movementMethod == NavigationComponentRequests::MovementMethod::Physics)) { - Physics::WorldNotificationBus::Handler::BusConnect(Physics::DefaultPhysicsWorldId); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneInterface->RegisterSceneSimulationStartHandler(sceneHandle, m_sceneStartSimHandler); + } } else { @@ -838,14 +852,6 @@ namespace LmbrCentral MoveEntity(deltaTime); } - ////////////////////////////////////////////////////////////////////////// - // Physics::WorldNotificationBus::Handler implementation - - void NavigationComponent::OnPrePhysicsSubtick(float fixedDeltaTime) - { - MoveEntity(fixedDeltaTime); - } - ////////////////////////////////////////////////////////////////////////// // AZ::TransformNotificationBus::Handler implementation // If the transform on the entity has changed @@ -863,7 +869,7 @@ namespace LmbrCentral // Disconnect from tick bus and physics bus AZ::TickBus::Handler::BusDisconnect(); - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneStartSimHandler.Disconnect(); } PathfindRequest::NavigationRequestId NavigationComponent::FindPathToEntity(AZ::EntityId targetEntityId) diff --git a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h index b002ab00cf..68af218b67 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h +++ b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h @@ -27,7 +27,7 @@ // Other buses used #include #include -#include +#include // Data and containers #include @@ -193,7 +193,6 @@ namespace LmbrCentral , public NavigationComponentRequestBus::Handler , public IAIPathAgent , public AZ::TickBus::Handler - , public Physics::WorldNotificationBus::Handler , public AZ::TransformNotificationBus::Handler { public: @@ -226,11 +225,6 @@ namespace LmbrCentral void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - // Physics::WorldNotificationBus - void OnPrePhysicsSubtick(float fixedDeltaTime) override; - ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// // Transform notification bus listener @@ -336,6 +330,7 @@ namespace LmbrCentral static void Reflect(AZ::ReflectContext* context); + AzPhysics::SceneEvents::OnSceneSimulationStartHandler m_sceneStartSimHandler; protected: void OnPathResult(const MNM::QueuedPathID& requestId, MNMPathRequestResult& result); diff --git a/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.cpp b/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.cpp index 21170386ea..1a83c3af1a 100644 --- a/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.cpp @@ -18,8 +18,9 @@ #include #include #include -#include -#include +#include +#include +#include #include #include @@ -28,6 +29,21 @@ namespace LmbrCentral { + AudioAreaEnvironmentComponent::AudioAreaEnvironmentComponent() + : m_onTriggerEnterHandler([this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::TriggerEvent& triggerEvent) + { + OnTriggerEnter(triggerEvent); + }) + , m_onTriggerExitHandler([this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::TriggerEvent& triggerEvent) + { + OnTriggerExit(triggerEvent); + }) + { + + } + //========================================================================= void AudioAreaEnvironmentComponent::Reflect(AZ::ReflectContext* context) { @@ -53,14 +69,25 @@ namespace LmbrCentral if (m_broadPhaseTriggerArea.IsValid()) { - Physics::TriggerNotificationBus::Handler::BusConnect(m_broadPhaseTriggerArea); + if (auto* physicsSystem = AZ::Interface::Get()) + { + AZStd::pair foundBody = physicsSystem->FindAttachedBodyHandleFromEntityId(m_broadPhaseTriggerArea); + if (foundBody.first != AzPhysics::InvalidSceneHandle) + { + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerEnterHandler( + foundBody.first, foundBody.second, m_onTriggerEnterHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerExitHandler( + foundBody.first, foundBody.second, m_onTriggerExitHandler); + } + } } } //========================================================================= void AudioAreaEnvironmentComponent::Deactivate() { - Physics::TriggerNotificationBus::Handler::BusDisconnect(); + m_onTriggerEnterHandler.Disconnect(); + m_onTriggerExitHandler.Disconnect(); } //========================================================================= @@ -95,14 +122,14 @@ namespace LmbrCentral //========================================================================= - void AudioAreaEnvironmentComponent::OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) + void AudioAreaEnvironmentComponent::OnTriggerEnter(const AzPhysics::TriggerEvent& triggerEvent) { AZ::EntityId enteringEntityId = triggerEvent.m_otherBody->GetEntityId(); AZ::TransformNotificationBus::MultiHandler::BusConnect(enteringEntityId); } //========================================================================= - void AudioAreaEnvironmentComponent::OnTriggerExit(const Physics::TriggerEvent& triggerEvent) + void AudioAreaEnvironmentComponent::OnTriggerExit(const AzPhysics::TriggerEvent& triggerEvent) { AZ::EntityId exitingEntityId = triggerEvent.m_otherBody->GetEntityId(); AZ::TransformNotificationBus::MultiHandler::BusDisconnect(exitingEntityId); diff --git a/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.h b/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.h index 7bc73f3a15..31de19e32a 100644 --- a/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.h +++ b/Gems/LmbrCentral/Code/Source/Audio/AudioAreaEnvironmentComponent.h @@ -13,7 +13,7 @@ #include #include -#include +#include #include @@ -33,11 +33,12 @@ namespace LmbrCentral class AudioAreaEnvironmentComponent : public AZ::Component , private AZ::TransformNotificationBus::MultiHandler - , private Physics::TriggerNotificationBus::Handler { friend class EditorAudioAreaEnvironmentComponent; public: + AudioAreaEnvironmentComponent(); + /*! * AZ::Component */ @@ -50,10 +51,6 @@ namespace LmbrCentral */ void OnTransformChanged(const AZ::Transform&, const AZ::Transform&) override; - - void OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) override; - void OnTriggerExit(const Physics::TriggerEvent& triggerEvent) override; - protected: static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { @@ -78,6 +75,12 @@ namespace LmbrCentral static void Reflect(AZ::ReflectContext* context); private: + void OnTriggerEnter(const AzPhysics::TriggerEvent& triggerEvent); + void OnTriggerExit(const AzPhysics::TriggerEvent& triggerEvent); + + AzPhysics::SimulatedBodyEvents::OnTriggerEnter::Handler m_onTriggerEnterHandler; + AzPhysics::SimulatedBodyEvents::OnTriggerExit::Handler m_onTriggerExitHandler; + //! Transient data Audio::TAudioEnvironmentID m_environmentId; diff --git a/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderComponent.cpp b/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderComponent.cpp index 531def108c..83aa773288 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderComponent.cpp @@ -14,11 +14,22 @@ #include "LevelBuilderComponent.h" #include #include +#include namespace LevelBuilder { void LevelBuilderComponent::Activate() { + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + // No need to build level.pak files when using the prefab system. + if (usePrefabSystemForLevels) + { + return; + } + AssetBuilderSDK::AssetBuilderDesc builderDescriptor; builderDescriptor.m_name = "LevelBuilderWorker"; // This builder only works with the level.pak exported from levels. Other pak files are handled by the copy job. diff --git a/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.cpp b/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.cpp index dc5c1db89d..799d924177 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.cpp @@ -166,10 +166,8 @@ namespace LevelBuilder AzFramework::StringFunc::Path::Join(tempDirectory.c_str(), "level", levelsubfolder); PopulateLevelSliceDependencies(levelsubfolder, productDependencies, productPathDependencies); - PopulateLevelDataDependencies(levelPakFile, levelsubfolder, productPathDependencies); PopulateMissionDependencies(levelPakFile, levelsubfolder, productPathDependencies); PopulateLevelAudioControlDependencies(levelPakFile, productPathDependencies); - PopulateVegetationMapDataDependencies(levelPakFile, productPathDependencies); extractionCompleteSemaphore.release(); }; @@ -220,15 +218,6 @@ namespace LevelBuilder // The defines exist in CryEngine code that we can't link from here. // We want to minimize engine changes to make it easier for game teams to incorporate these dependency improvements. - // LevelSystem.cpp, CLevelSystem::PopulateLevels stores all pak files in the level folder - // to load them during opening a level. AFAIK apart from level.pak, terraintexture.pak is the only pak file that might be present in the cached level folder. - // string paks = levelPath + string("/*.pak"); - AddLevelRelativeSourcePathProductDependency("terraintexture.pak", sourceLevelPakPath, productPathDependencies); - - // TerrainCompile.cpp, CTerrain::Load attempts to load the cover.ctc file for the terrain. - // OpenTerrainTextureFile(COMPILED_TERRAIN_TEXTURE_FILE_NAME) - AddLevelRelativeSourcePathProductDependency("terrain/cover.ctc", sourceLevelPakPath, productPathDependencies); - // CCullThread::LoadLevel attempts to load the occluder mesh, if it exists. // AZ::IO::HandleType fileHandle = gEnv->pCryPak->FOpen((string(pFolderName) + "/occluder.ocm").c_str(), "rbx"); AddLevelRelativeSourcePathProductDependency("occluder.ocm", sourceLevelPakPath, productPathDependencies); @@ -242,10 +231,6 @@ namespace LevelBuilder // if (!pResList->Load(filename.c_str())) AddLevelRelativeSourcePathProductDependency("auto_resourcelist.txt", sourceLevelPakPath, productPathDependencies); - // CMergedMeshesManager::PreloadMeshes attempts to load this file for the current level, if it exists. - // AZ::IO::HandleType fileHandle = gEnv->pCryPak->FOpen(Get3DEngine()->GetLevelFilePath(COMPILED_MERGED_MESHES_BASE_NAME COMPILED_MERGED_MESHES_LIST), "r"); - AddLevelRelativeSourcePathProductDependency("terrain/merged_meshes_sectors/mmrm_used_meshes.lst", sourceLevelPakPath, productPathDependencies); - // CLevelInfo::ReadMetaData() constructs a string based on levelName/LevelName.xml, and attempts to read that file. AZStd::string levelXml(AZStd::string::format("%s.xml", levelFolderName.c_str())); AddLevelRelativeSourcePathProductDependency(levelXml, sourceLevelPakPath, productPathDependencies); @@ -336,168 +321,6 @@ namespace LevelBuilder } - void LevelBuilderWorker::PopulateLevelDataDependencies( - [[maybe_unused]] const AZStd::string& levelPakFile, - const AZStd::string& levelPath, - AssetBuilderSDK::ProductPathDependencySet& productDependencies) const - { - const char levelDataFileName[] = "leveldata.xml"; - - AZStd::string levelDataFullPath; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), levelDataFileName, levelDataFullPath); - - AZ::IO::FileIOStream fileStream; - - if (fileStream.Open(levelDataFullPath.c_str(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary)) - { - PopulateLevelDataDependenciesHelper(&fileStream, productDependencies); - } - } - - bool LevelBuilderWorker::PopulateLevelDataDependenciesHelper(AZ::IO::GenericStream* stream, - AssetBuilderSDK::ProductPathDependencySet& productDependencies) const - { - if (!stream) - { - return false; - } - - AZ::IO::SizeType length = stream->GetLength(); - - if (length == 0) - { - return false; - } - - AZStd::vector charBuffer; - - charBuffer.resize_no_construct(length + 1); - stream->Read(length, charBuffer.data()); - charBuffer.back() = 0; - - AZ::rapidxml::xml_document xmlDoc; - xmlDoc.parse(charBuffer.data()); - auto levelDataNode = xmlDoc.first_node("LevelData"); - - if(!levelDataNode) - { - return false; - } - - auto surfaceTypesNode = levelDataNode->first_node("SurfaceTypes"); - - if (!surfaceTypesNode) - { - return false; - } - - auto surfaceTypeNode = surfaceTypesNode->first_node(); - - while(surfaceTypeNode) - { - auto detailMatrialAttr = surfaceTypeNode->first_attribute("DetailMaterial"); - - if (detailMatrialAttr) - { - // Add on the material file extension since it isn't included in the xml - productDependencies.emplace(AZStd::string(detailMatrialAttr->value()) + s_materialExtension, AssetBuilderSDK::ProductPathDependencyType::ProductFile); - } - - surfaceTypeNode = surfaceTypeNode->next_sibling(); - } - - return true; - } - - void LevelBuilderWorker::PopulateVegetationMapDataDependencies( - const AZStd::string& levelPakFile, - AssetBuilderSDK::ProductPathDependencySet& productDependencies) const - { - const char vegetationMapDataFileName[] = "leveldata/VegetationMap.dat"; - AZStd::string vegetationMapDataFullPath; - AZStd::string levelPakDir; - AzFramework::StringFunc::Path::GetFullPath(levelPakFile.c_str(), levelPakDir); - - AzFramework::StringFunc::Path::Join(levelPakDir.c_str(), vegetationMapDataFileName, vegetationMapDataFullPath); - - AZ::IO::FileIOStream fileStream; - - if (fileStream.Open(vegetationMapDataFullPath.c_str(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary)) - { - if (!PopulateVegetationMapDataDependenciesHelper(&fileStream, productDependencies)) - { - AZ_Error("LevelBuilder", false, "Unable to retreive product dependencies from file (%s).", vegetationMapDataFullPath.c_str()); - } - } - else - { - AZ_Error("LevelBuilder", false, "Failed to open file (%s).", vegetationMapDataFullPath.c_str()); - } - } - - bool LevelBuilderWorker::PopulateVegetationMapDataDependenciesHelper(AZ::IO::GenericStream* stream, - AssetBuilderSDK::ProductPathDependencySet& productDependencies) const - { - if (!stream) - { - return false; - } - - int charSize = 1; - AZ::IO::SizeType length = static_cast(readXmlDataLength(stream, charSize)); - - if (length == 0) - { - return false; - } - AZStd::string xmlString; - - if (charSize == 1) - { - xmlString.resize(length); - stream->Read(length, xmlString.data()); - } - else - { - AZStd::vector dataBuffer; - dataBuffer.resize(length); - stream->Read(length, dataBuffer.data()); - Utf8::Unchecked::utf16to8(dataBuffer.begin(), dataBuffer.end(), AZStd::back_inserter(xmlString)); - } - - AZ::rapidxml::xml_document xmlDoc; - xmlDoc.parse(xmlString.data()); - auto vegetationMapDataNode = xmlDoc.first_node("VegetationMap"); - - if (!vegetationMapDataNode) - { - return false; - } - - auto objectsTypeNode = vegetationMapDataNode->first_node("Objects"); - - if (!objectsTypeNode) - { - return false; - } - - auto objectTypeNode = objectsTypeNode->first_node(); - - while (objectTypeNode) - { - auto fileNameAttr = objectTypeNode->first_attribute("FileName"); - - if (fileNameAttr) - { - productDependencies.emplace(AZStd::string(fileNameAttr->value()), AssetBuilderSDK::ProductPathDependencyType::ProductFile); - } - - objectTypeNode = objectTypeNode->next_sibling(); - } - - return true; - } - void LevelBuilderWorker::PopulateMissionDependencies( [[maybe_unused]] const AZStd::string& levelPakFile, const AZStd::string& levelPath, diff --git a/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.h b/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.h index cdc09150f0..a0d62f3246 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.h +++ b/Gems/LmbrCentral/Code/Source/Builders/LevelBuilder/LevelBuilderWorker.h @@ -35,8 +35,6 @@ namespace LevelBuilder //!AssetBuilderSDK::AssetBuilderCommandBus interface void ShutDown() override; - bool PopulateLevelDataDependenciesHelper(AZ::IO::GenericStream* stream, AssetBuilderSDK::ProductPathDependencySet& productDependencies) const; - bool PopulateVegetationMapDataDependenciesHelper(AZ::IO::GenericStream* stream, AssetBuilderSDK::ProductPathDependencySet& productDependencies) const; bool PopulateMissionDependenciesHelper(AZ::IO::GenericStream* stream, AssetBuilderSDK::ProductPathDependencySet& productDependencies) const; void PopulateLevelSliceDependenciesHelper( const AZStd::string& levelSliceName, @@ -70,15 +68,6 @@ namespace LevelBuilder AZStd::vector& productDependencies, AssetBuilderSDK::ProductPathDependencySet& productPathDependencies) const; - void PopulateLevelDataDependencies( - const AZStd::string& levelPakFile, - const AZStd::string& levelPath, - AssetBuilderSDK::ProductPathDependencySet& productDependencies) const; - - void PopulateVegetationMapDataDependencies( - const AZStd::string& levelPakFile, - AssetBuilderSDK::ProductPathDependencySet& productDependencies) const; - void PopulateMissionDependencies( const AZStd::string& levelPakFile, const AZStd::string& levelPath, diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp index 80e87e081f..29dc8a92aa 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp @@ -39,7 +39,6 @@ #include "Rendering/LightComponent.h" #include "Rendering/HighQualityShadowComponent.h" #include "Rendering/MeshComponent.h" -#include "Rendering/SkinnedMeshComponent.h" #include "Rendering/FogVolumeComponent.h" #include "Rendering/GeomCacheComponent.h" #include "Ai/NavigationComponent.h" @@ -53,22 +52,15 @@ #include // Unhandled asset types -// Animation -#include "Unhandled/Animation/AnimationEventsAssetTypeInfo.h" -#include "Unhandled/Animation/DbaAssetTypeInfo.h" // Material #include "Unhandled/Material/MaterialAssetTypeInfo.h" // Other #include "Unhandled/Other/AudioAssetTypeInfo.h" #include "Unhandled/Other/CharacterPhysicsAssetTypeInfo.h" -#include "Unhandled/Other/CharacterRigAssetTypeInfo.h" #include "Unhandled/Other/GroupAssetTypeInfo.h" #include "Unhandled/Other/PrefabsLibraryAssetTypeInfo.h" -#include "Unhandled/Other/SkeletonAssetTypeInfo.h" -#include "Unhandled/Other/SkeletonParamsAssetTypeInfo.h" #include "Unhandled/Other/GameTokenAssetTypeInfo.h" #include "Unhandled/Other/EntityPrototypeLibraryAssetTypeInfo.h" -#include "Unhandled/Other/SkinnedMeshAssetTypeInfo.h" // Texture #include "Unhandled/Texture/SubstanceAssetTypeInfo.h" @@ -231,7 +223,6 @@ namespace LmbrCentral LmbrCentralSystemComponent::CreateDescriptor(), HighQualityShadowComponent::CreateDescriptor(), MeshComponent::CreateDescriptor(), - SkinnedMeshComponent::CreateDescriptor(), NavigationComponent::CreateDescriptor(), SimpleStateComponent::CreateDescriptor(), SpawnerComponent::CreateDescriptor(), @@ -447,19 +438,6 @@ namespace LmbrCentral // Register unhandled asset type info - // Animation - auto animEventsAssetTypeInfo = aznew AnimationEventsAssetTypeInfo(); - animEventsAssetTypeInfo->Register(); - m_unhandledAssetInfo.emplace_back(animEventsAssetTypeInfo); - - auto dbaAssetTypeInfo = aznew DbaAssetTypeInfo(); - dbaAssetTypeInfo->Register(); - m_unhandledAssetInfo.emplace_back(dbaAssetTypeInfo); - - // Geometry - auto skinnedMeshAssetTypeInfo = aznew SkinnedMeshAssetTypeInfo(); - skinnedMeshAssetTypeInfo->Register(); - m_unhandledAssetInfo.emplace_back(skinnedMeshAssetTypeInfo); // Material auto materialAssetTypeInfo = aznew MaterialAssetTypeInfo(); materialAssetTypeInfo->Register(); @@ -477,10 +455,6 @@ namespace LmbrCentral characterPhysicsAssetTypeInfo->Register(); m_unhandledAssetInfo.emplace_back(characterPhysicsAssetTypeInfo); - auto characterRigAssetTypeInfo = aznew CharacterRigAssetTypeInfo(); - characterRigAssetTypeInfo->Register(); - m_unhandledAssetInfo.emplace_back(characterRigAssetTypeInfo); - auto groupAssetTypeInfo = aznew GroupAssetTypeInfo(); groupAssetTypeInfo->Register(); m_unhandledAssetInfo.emplace_back(groupAssetTypeInfo); @@ -489,14 +463,6 @@ namespace LmbrCentral prefabsLibraryAssetTypeInfo->Register(); m_unhandledAssetInfo.emplace_back(prefabsLibraryAssetTypeInfo); - auto skeletonAssetTypeInfo = aznew SkeletonAssetTypeInfo(); - skeletonAssetTypeInfo->Register(); - m_unhandledAssetInfo.emplace_back(skeletonAssetTypeInfo); - - auto skeletonParamsAssetTypeInfo = aznew SkeletonParamsAssetTypeInfo(); - skeletonParamsAssetTypeInfo->Register(); - m_unhandledAssetInfo.emplace_back(skeletonParamsAssetTypeInfo); - auto entityPrototypeAssetTypeInfo = aznew EntityPrototypeLibraryAssetTypeInfo(); entityPrototypeAssetTypeInfo->Register(); m_unhandledAssetInfo.emplace_back(entityPrototypeAssetTypeInfo); diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp index dccabc4bea..c658f5ebb9 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp @@ -34,7 +34,6 @@ #include "Rendering/EditorEnvProbeComponent.h" #include "Rendering/EditorHighQualityShadowComponent.h" #include "Rendering/EditorMeshComponent.h" -#include "Rendering/EditorSkinnedMeshComponent.h" #include "Rendering/EditorFogVolumeComponent.h" #include "Rendering/EditorGeomCacheComponent.h" #include "Scripting/EditorLookAtComponent.h" @@ -90,7 +89,6 @@ namespace LmbrCentral EditorEnvProbeComponent::CreateDescriptor(), EditorHighQualityShadowComponent::CreateDescriptor(), EditorMeshComponent::CreateDescriptor(), - EditorSkinnedMeshComponent::CreateDescriptor(), EditorTagComponent::CreateDescriptor(), EditorSphereShapeComponent::CreateDescriptor(), EditorDiskShapeComponent::CreateDescriptor(), diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorSkinnedMeshComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/EditorSkinnedMeshComponent.cpp deleted file mode 100644 index 7cd3236f65..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorSkinnedMeshComponent.cpp +++ /dev/null @@ -1,524 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "LmbrCentral_precompiled.h" - -#include "EditorSkinnedMeshComponent.h" -#include -#include -#include - -#include - -#include -#include // For basic physicalization at edit-time for object snapping. -#include "MeshComponent.h" -#include - -#include - -#include "CryPhysicsDeprecation.h" - -namespace LmbrCentral -{ - - ////////////////////////////////////////////////////////////////////////// - /// Deprecated EditorMeshComponent - ////////////////////////////////////////////////////////////////////////// - namespace ClassConverters - { - static bool DeprecateEditorMeshComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); - } // namespace ClassConverters - ////////////////////////////////////////////////////////////////////////// - - - void EditorSkinnedMeshComponent::Reflect(AZ::ReflectContext* context) - { - AZ::SerializeContext* serializeContext = azrtti_cast(context); - - if (serializeContext) - { - // Need to deprecate the old EditorMeshComponent whenever we see one. - serializeContext->ClassDeprecate("EditorMeshComponent", "{C4C69E93-4C1F-446D-AFAB-F8835AD8EFB0}", &ClassConverters::DeprecateEditorMeshComponent); - serializeContext->Class() - ->Version(1) - ->Field("Skinned Mesh Render Node", &EditorSkinnedMeshComponent::m_mesh) - ; - - AZ::EditContext* editContext = serializeContext->GetEditContext(); - - if (editContext) - { - editContext->Class("Skinned Mesh", "The Skinned Mesh component is the primary way to add animated visual geometry to entities") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Category, "Animation (Legacy)") - ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/SkinnedMesh.svg") - ->Attribute(AZ::Edit::Attributes::PrimaryAssetType, AZ::AzTypeInfo::Uuid()) - ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/SkinnedMesh.png") - ->Attribute(AZ::Edit::Attributes::PreferNoViewportIcon, true) - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-skinned-mesh.html") - ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) - ->DataElement(AZ::Edit::UIHandlers::Default, &EditorSkinnedMeshComponent::m_mesh); - - editContext->Class( - "Render Options", "Rendering options for the mesh.") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Options") - - ->DataElement(AZ::Edit::UIHandlers::Slider, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_opacity, "Opacity", "Opacity value") - ->Attribute(AZ::Edit::Attributes::Min, 0.f) - ->Attribute(AZ::Edit::Attributes::Max, 1.f) - ->Attribute(AZ::Edit::Attributes::Step, 0.1f) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_maxViewDist, "Max view distance", "Maximum view distance in meters.") - ->Attribute(AZ::Edit::Attributes::Suffix, " m") - ->Attribute(AZ::Edit::Attributes::Min, 0.f) - ->Attribute(AZ::Edit::Attributes::Max, &SkinnedMeshComponentRenderNode::GetDefaultMaxViewDist) - ->Attribute(AZ::Edit::Attributes::Step, 0.1f) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_viewDistMultiplier, "View distance multiplier", "Adjusts max view distance. If 1.0 then default is used. 1.1 would be 10% further than default.") - ->Attribute(AZ::Edit::Attributes::Suffix, "x") - ->Attribute(AZ::Edit::Attributes::Min, 0.f) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - ->DataElement(AZ::Edit::UIHandlers::Slider, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_lodRatio, "LOD distance ratio", "Controls LOD ratio over distance.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0) - ->Attribute(AZ::Edit::Attributes::Max, 255) - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_castShadows, "Cast shadows", "Object will cast shadows.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_useVisAreas, "Use VisAreas", "Allow VisAreas to control this component's visibility.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Advanced") - - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_rainOccluder, "Rain occluder", "Occludes dynamic raindrops.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_acceptDecals, "Accept decals", "Can receive decals.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::OnChanged) - ; - - editContext->Class( - "Mesh Rendering", "Attach geometry to the entity.") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::m_visible, "Visible", "Is mesh initially visible?") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::RefreshRenderState) - // historical note: This used to be a "SkinnedMeshAsset" but that became a new type. For compatibility we are preserving the serialization name "SkinnedMeshAsset" - ->DataElement("SkinnedMeshAsset", &SkinnedMeshComponentRenderNode::m_characterDefinitionAsset, "Character definition", "Character Definition reference") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::OnAssetPropertyChanged) - ->DataElement(AZ::Edit::UIHandlers::Default, &SkinnedMeshComponentRenderNode::m_renderOptions, "Render options", "Render/draw options.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &SkinnedMeshComponentRenderNode::RefreshRenderState) - ; - - } - } - if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class()->RequestBus("MeshComponentRequestBus"); - } - } - - void EditorSkinnedMeshComponent::Activate() - { - EditorComponentBase::Activate(); - - m_mesh.AttachToEntity(m_entity->GetId()); - - // Check current visibility and updates render flags appropriately - bool visible = false; - AzToolsFramework::EditorEntityInfoRequestBus::EventResult( - visible, GetEntityId(), &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsVisible); - - m_mesh.UpdateAuxiliaryRenderFlags(!visible, ERF_HIDDEN); - - // Note we are purposely connecting to buses before calling m_mesh.CreateMesh(). - // m_mesh.CreateMesh() can result in events (eg: OnMeshCreated) that we want receive. - MaterialOwnerRequestBus::Handler::BusConnect(GetEntityId()); - MeshComponentRequestBus::Handler::BusConnect(GetEntityId()); - MeshComponentNotificationBus::Handler::BusConnect(GetEntityId()); - RenderNodeRequestBus::Handler::BusConnect(GetEntityId()); - AZ::TransformNotificationBus::Handler::BusConnect(GetEntityId()); - AzToolsFramework::EditorVisibilityNotificationBus::Handler::BusConnect(GetEntityId()); - SkeletalHierarchyRequestBus::Handler::BusConnect(GetEntityId()); - AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusConnect(GetEntityId()); - AzFramework::BoundsRequestBus::Handler::BusConnect(GetEntityId()); - - auto renderOptionsChangeCallback = - [this]() - { - this->m_mesh.ApplyRenderOptions(); - }; - m_mesh.m_renderOptions.m_changeCallback = renderOptionsChangeCallback; - - if (m_mesh.m_isQueuedForDestroyMesh) - { - m_mesh.m_isQueuedForDestroyMesh = false; - } - else - { - m_mesh.CreateMesh(); - } - } - - void EditorSkinnedMeshComponent::Deactivate() - { - AzFramework::BoundsRequestBus::Handler::BusDisconnect(); - SkeletalHierarchyRequestBus::Handler::BusDisconnect(); - MaterialOwnerRequestBus::Handler::BusDisconnect(); - MeshComponentRequestBus::Handler::BusDisconnect(); - MeshComponentNotificationBus::Handler::BusDisconnect(); - RenderNodeRequestBus::Handler::BusDisconnect(); - AZ::TransformNotificationBus::Handler::BusDisconnect(); - AzToolsFramework::EditorVisibilityNotificationBus::Handler::BusDisconnect(); - AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusDisconnect(); - - DestroyEditorPhysics(); - - m_mesh.m_renderOptions.m_changeCallback = 0; - - if (!m_mesh.GetMeshAsset().IsReady()) - { - m_mesh.m_isQueuedForDestroyMesh = true; - } - else - { - m_mesh.DestroyMesh(); - } - - m_mesh.AttachToEntity(AZ::EntityId()); - - EditorComponentBase::Deactivate(); - } - - void EditorSkinnedMeshComponent::OnMeshCreated(const AZ::Data::Asset& asset) - { - AZ_UNUSED(asset) - CRY_PHYSICS_REPLACEMENT_ASSERT(); - } - - void EditorSkinnedMeshComponent::OnMeshDestroyed() - { - DestroyEditorPhysics(); - } - - IRenderNode* EditorSkinnedMeshComponent::GetRenderNode() - { - return &m_mesh; - } - - float EditorSkinnedMeshComponent::GetRenderNodeRequestBusOrder() const - { - return s_renderNodeRequestBusOrder; - } - - void EditorSkinnedMeshComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world) - { - AZ_UNUSED(world) - CRY_PHYSICS_REPLACEMENT_ASSERT(); - } - - AZ::Aabb EditorSkinnedMeshComponent::GetWorldBounds() - { - return m_mesh.CalculateWorldAABB(); - } - - AZ::Aabb EditorSkinnedMeshComponent::GetLocalBounds() - { - return m_mesh.CalculateLocalAABB(); - } - - void EditorSkinnedMeshComponent::SetMeshAsset(const AZ::Data::AssetId& id) - { - m_mesh.SetMeshAsset(id); - EBUS_EVENT(AzToolsFramework::ToolsApplicationRequests::Bus, AddDirtyEntity, GetEntityId()); - } - - void EditorSkinnedMeshComponent::SetMaterial(_smart_ptr material) - { - m_mesh.SetMaterial(material); - - EBUS_EVENT(AzToolsFramework::ToolsApplicationEvents::Bus, InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues); - } - - _smart_ptr EditorSkinnedMeshComponent::GetMaterial() - { - return m_mesh.GetMaterial(); - } - - void EditorSkinnedMeshComponent::SetPrimaryAsset(const AZ::Data::AssetId& id) - { - SetMeshAsset(id); - } - - void EditorSkinnedMeshComponent::OnEntityVisibilityChanged(bool visibility) - { - m_mesh.UpdateAuxiliaryRenderFlags(!visibility, ERF_HIDDEN); - m_mesh.RefreshRenderState(); - } - - void EditorSkinnedMeshComponent::BuildGameEntity(AZ::Entity* gameEntity) - { - if (SkinnedMeshComponent* meshComponent = gameEntity->CreateComponent()) - { - m_mesh.CopyPropertiesTo(meshComponent->m_skinnedMeshRenderNode); - } - } - - AZ::Aabb EditorSkinnedMeshComponent::GetEditorSelectionBoundsViewport( - const AzFramework::ViewportInfo& /*viewportInfo*/) - { - return GetWorldBounds(); - } - - void EditorSkinnedMeshComponent::CreateEditorPhysics() - { - DestroyEditorPhysics(); - - if (!GetTransform()) - { - return; - } - - IStatObj* geometry = m_mesh.GetEntityStatObj(); - if (!geometry) - { - return; - } - - CRY_PHYSICS_REPLACEMENT_ASSERT(); - } - - void EditorSkinnedMeshComponent::DestroyEditorPhysics() - { - // If physics is completely torn down, all physical entities are by extension completely invalid (dangling pointers). - // It doesn't matter that we held a reference. - CRY_PHYSICS_REPLACEMENT_ASSERT(); - m_physTransform = AZ::Transform::CreateIdentity(); - } - - bool EditorSkinnedMeshComponent::GetVisibility() - { - return m_mesh.GetVisible(); - } - - void EditorSkinnedMeshComponent::SetVisibility(bool isVisible) - { - m_mesh.SetVisible(isVisible); - } - - AZ::u32 EditorSkinnedMeshComponent::GetJointCount() - { - return m_mesh.GetJointCount(); - } - - const char* EditorSkinnedMeshComponent::GetJointNameByIndex(AZ::u32 jointIndex) - { - return m_mesh.GetJointNameByIndex(jointIndex); - } - - AZ::s32 EditorSkinnedMeshComponent::GetJointIndexByName(const char* jointName) - { - return m_mesh.GetJointIndexByName(jointName); - } - - AZ::Transform EditorSkinnedMeshComponent::GetJointTransformCharacterRelative(AZ::u32 jointIndex) - { - return m_mesh.GetJointTransformCharacterRelative(jointIndex); - } - - ////////////////////////////////////////////////////////////////////////// - /// Deprecated EditorMeshComponent - ////////////////////////////////////////////////////////////////////////// - namespace ClassConverters - { - extern void MeshComponentRenderNodeRenderOptionsVersion1To2Converter(AZ::SerializeContext&, AZ::SerializeContext::DataElementNode&); - extern void MeshComponentRenderNodeRenderOptionsVersion2To3Converter(AZ::SerializeContext&, AZ::SerializeContext::DataElementNode&); - - static bool DeprecateEditorMeshComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) - { - - ////////////////////////////////////////////////////////////////////////// - // Pull data out of the old version - auto index = classElement.FindElement(AZ_CRC("Mesh", 0xe16f3a56)); - if (index < 0) - { - return false; - } - - auto renderNode = classElement.GetSubElement(index); - - index = classElement.FindElement(AZ_CRC("BaseClass1", 0xd4925735)); - if (index < 0) - { - return false; - } - - auto editorBaseClass = classElement.GetSubElement(index); - - index = renderNode.FindElement(AZ_CRC("Material Override", 0xebc12e43)); - if (index < 0) - { - return false; - } - - auto materialOverride = renderNode.GetSubElement(index); - - index = renderNode.FindElement(AZ_CRC("Render Options", 0xb5bc5e06)); - if (index < 0) - { - return false; - } - - auto renderOptions = renderNode.GetSubElement(index); - MeshComponentRenderNodeRenderOptionsVersion1To2Converter(context, renderOptions); - - // There is a visible field in the render options that we might want to keep so we should grab it now - // this will default to true if the mesh component is at version 3 and does not have a Visible render node option - bool visible = true; - renderOptions.GetChildData(AZ_CRC("Visible", 0x7ab0e859), visible); - MeshComponentRenderNodeRenderOptionsVersion2To3Converter(context, renderOptions); - - // Use the visible field found in the render node options as a default if we found it earlier, default to true otherwise - renderNode.GetChildData(AZ_CRC("Visible", 0x7ab0e859), visible); - - float opacity = 1.f; - renderOptions.GetChildData(AZ_CRC("Opacity", 0x43fd6d66), opacity); - float maxViewDistance; - renderOptions.GetChildData(AZ_CRC("MaxViewDistance", 0xa2945dd7), maxViewDistance); - float viewDIstanceMultuplier = 1.f; - renderOptions.GetChildData(AZ_CRC("ViewDistanceMultiplier", 0x86a77124), viewDIstanceMultuplier); - unsigned lodRatio = 100; - renderOptions.GetChildData(AZ_CRC("LODRatio", 0x36bf54bf), lodRatio); - bool castDynamicShadows = true; - renderOptions.GetChildData(AZ_CRC("CastDynamicShadows", 0x55c75b43), castDynamicShadows); - bool castLightmapShadows = true; - renderOptions.GetChildData(AZ_CRC("CastLightmapShadows", 0x10ce0bf8), castLightmapShadows); - bool indoorOnly = false; - renderOptions.GetChildData(AZ_CRC("IndoorOnly", 0xc8ab6ddb), indoorOnly); - bool bloom = true; - renderOptions.GetChildData(AZ_CRC("Bloom", 0xc6cd7d1b), bloom); - bool motionBlur = true; - renderOptions.GetChildData(AZ_CRC("MotionBlur", 0x917cdb53), motionBlur); - bool rainOccluder = false; - renderOptions.GetChildData(AZ_CRC("RainOccluder", 0x4f245a07), rainOccluder); - bool affectDynamicWater = false; - renderOptions.GetChildData(AZ_CRC("AffectDynamicWater", 0xe6774a5b), affectDynamicWater); - bool receiveWind = false; - renderOptions.GetChildData(AZ_CRC("ReceiveWind", 0x952a1261), receiveWind); - bool acceptDecals = true; - renderOptions.GetChildData(AZ_CRC("AcceptDecals", 0x3b3240a7), acceptDecals); - bool visibilityOccluder = false; - renderOptions.GetChildData(AZ_CRC("VisibilityOccluder", 0xe5819c29), visibilityOccluder); - bool depthTest = true; - renderOptions.GetChildData(AZ_CRC("DepthTest", 0x532f68b9), depthTest); - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // Parse the asset reference so we know if it's a static or skinned mesh - int meshAssetElementIndex = renderNode.FindElement(AZ_CRC("Mesh", 0xe16f3a56)); - AZStd::string path; - AZ::Data::AssetId meshAssetId; - if (meshAssetElementIndex != -1) - { - auto meshAssetNode = renderNode.GetSubElement(meshAssetElementIndex); - // pull the raw data from the old asset node to get the asset id so we can create an asset of the new type - AZStd::string rawElementString = AZStd::string(&meshAssetNode.GetRawDataElement().m_buffer[0]); - // raw data will look something like this - //"id={41FDB841-F602-5603-BFFA-8BAA6930347B}:0,type={202B64E8-FD3C-4812-A842-96BC96E38806}" - // ^ 38 chars ^ - unsigned int beginningOfSequence = rawElementString.find("id={") + 3; - const int guidLength = 38; - AZStd::string assetGuidString = rawElementString.substr(beginningOfSequence, guidLength); - - meshAssetId = AZ::Data::AssetId(AZ::Uuid::CreateString(assetGuidString.c_str())); - EBUS_EVENT_RESULT(path, AZ::Data::AssetCatalogRequestBus, GetAssetPathById, meshAssetId); - int renderOptionsIndex = -1; - } - - - AZStd::string newComponentStringGuid; - AZStd::string renderNodeName; - AZStd::string meshTypeString; - AZ::Uuid meshAssetUuId; - AZ::Uuid renderNodeUuid; - AZ::Uuid renderOptionUuid; - AZ::Data::Asset meshAssetData; - - // Switch to the new component type based on the asset type of the original - // .cdf,.chr files become skinned mesh assets inside of skinned mesh components - // otherwise it becomes a static mesh asset in a static mesh component - if (path.find(CRY_CHARACTER_DEFINITION_FILE_EXT) == AZStd::string::npos) - { - newComponentStringGuid = "{FC315B86-3280-4D03-B4F0-5553D7D08432}"; - renderNodeName = "Static Mesh Render Node"; - renderNodeUuid = AZ::AzTypeInfo::Uuid(); - meshAssetUuId = AZ::AzTypeInfo::Uuid(); - renderOptionUuid = MeshComponentRenderNode::GetRenderOptionsUuid(); - meshTypeString = "Static Mesh"; - } - else - { - newComponentStringGuid = "{D3E1A9FC-56C9-4997-B56B-DA186EE2D62A}"; - renderNodeName = "Skinned Mesh Render Node"; - renderNodeUuid = AZ::AzTypeInfo::Uuid(); - meshAssetUuId = AZ::AzTypeInfo::Uuid(); - renderOptionUuid = SkinnedMeshComponentRenderNode::GetRenderOptionsUuid(); - meshTypeString = "Skinned Mesh"; - } - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // Convert. this will destroy the old mesh component and change the uuid to the new type - classElement.Convert(context, newComponentStringGuid.c_str()); - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // add data back in as appropriate - classElement.AddElement(editorBaseClass); - - //create a static mesh render node - int renderNodeIndex = classElement.AddElement(context, renderNodeName.c_str(), renderNodeUuid); - auto& newrenderNode = classElement.GetSubElement(renderNodeIndex); - AZ::Data::Asset assetData(meshAssetId, meshAssetUuId); - newrenderNode.AddElementWithData(context, meshTypeString.c_str(), assetData); - newrenderNode.AddElement(materialOverride); - newrenderNode.AddElementWithData(context, "Visible", visible); - - // render options - int renderOptionsIndex = newrenderNode.AddElement(context, "Render Options", renderOptionUuid); - auto& newRenderOptions = newrenderNode.GetSubElement(renderOptionsIndex); - newRenderOptions.AddElementWithData(context, "Opacity", opacity); - newRenderOptions.AddElementWithData(context, "MaxViewDistance", maxViewDistance); - newRenderOptions.AddElementWithData(context, "ViewDistanceMultiplier", viewDIstanceMultuplier); - newRenderOptions.AddElementWithData(context, "LODRatio", lodRatio); - newRenderOptions.AddElementWithData(context, "CastDynamicShadows", castDynamicShadows); - newRenderOptions.AddElementWithData(context, "CastLightmapShadows", castLightmapShadows); - newRenderOptions.AddElementWithData(context, "IndoorOnly", indoorOnly); - newRenderOptions.AddElementWithData(context, "Bloom", bloom); - newRenderOptions.AddElementWithData(context, "MotionBlur", motionBlur); - newRenderOptions.AddElementWithData(context, "RainOccluder", rainOccluder); - newRenderOptions.AddElementWithData(context, "AffectDynamicWater", affectDynamicWater); - newRenderOptions.AddElementWithData(context, "ReceiveWind", receiveWind); - newRenderOptions.AddElementWithData(context, "AcceptDecals", acceptDecals); - newRenderOptions.AddElementWithData(context, "VisibilityOccluder", visibilityOccluder); - newRenderOptions.AddElementWithData(context, "DepthTest", depthTest); - ////////////////////////////////////////////////////////////////////////// - return true; - } - } // namespace ClassConverters -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorSkinnedMeshComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/EditorSkinnedMeshComponent.h deleted file mode 100644 index 05cfa673e8..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorSkinnedMeshComponent.h +++ /dev/null @@ -1,141 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "SkinnedMeshComponent.h" - -struct IPhysicalEntity; - -namespace LmbrCentral -{ - /*! - * In-editor mesh component. - * Conducts some additional listening and operations to ensure immediate - * effects when changing fields in the editor. - */ - class EditorSkinnedMeshComponent - : public AzToolsFramework::Components::EditorComponentBase - , private AzFramework::BoundsRequestBus::Handler - , private MeshComponentRequestBus::Handler - , private MaterialOwnerRequestBus::Handler - , private MeshComponentNotificationBus::Handler - , private RenderNodeRequestBus::Handler - , private AZ::TransformNotificationBus::Handler - , private AzToolsFramework::EditorVisibilityNotificationBus::Handler - , private SkeletalHierarchyRequestBus::Handler - , public AzToolsFramework::EditorComponentSelectionRequestsBus::Handler - { - public: - - AZ_COMPONENT(EditorSkinnedMeshComponent, "{D3E1A9FC-56C9-4997-B56B-DA186EE2D62A}", AzToolsFramework::Components::EditorComponentBase); - - ~EditorSkinnedMeshComponent() override = default; - - const float s_renderNodeRequestBusOrder = 100.f; - - // AZ::Component interface implementation - void Activate() override; - void Deactivate() override; - - // BoundsRequestBus and MeshComponentRequestBus overrides ... - AZ::Aabb GetWorldBounds() override; - AZ::Aabb GetLocalBounds() override; - - // MeshComponentRequestBus overrides ... - void SetMeshAsset(const AZ::Data::AssetId& id) override; - AZ::Data::Asset GetMeshAsset() override { return m_mesh.GetMeshAsset(); } - void SetVisibility(bool newVisibility) override; - bool GetVisibility() override; - - // SkeletalHierarchyRequestBus overrides ... - AZ::u32 GetJointCount() override; - const char* GetJointNameByIndex(AZ::u32 jointIndex) override; - AZ::s32 GetJointIndexByName(const char* jointName) override; - AZ::Transform GetJointTransformCharacterRelative(AZ::u32 jointIndex) override; - - // MaterialOwnerRequestBus interface implementation - void SetMaterial(_smart_ptr) override; - _smart_ptr GetMaterial() override; - - // MeshComponentNotificationBus interface implementation - void OnMeshCreated(const AZ::Data::Asset& asset) override; - void OnMeshDestroyed() override; - - // RenderNodeRequestBus::Handler - IRenderNode* GetRenderNode() override; - float GetRenderNodeRequestBusOrder() const override; - - // TransformBus::Handler - void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; - - // EditorVisibilityNotificationBus - void OnEntityVisibilityChanged(bool visibility) override; - - // EditorComponentBase - void BuildGameEntity(AZ::Entity* gameEntity) override; - - // EditorComponentSelectionRequestsBus::Handler - AZ::Aabb GetEditorSelectionBoundsViewport( - const AzFramework::ViewportInfo& viewportInfo) override; - - //! Called when you want to change the game asset through code (like when creating components based on assets). - void SetPrimaryAsset(const AZ::Data::AssetId& assetId) override; - - static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) - { - provided.push_back(AZ_CRC("MeshService", 0x71d8a455)); - provided.push_back(AZ_CRC("SkinnedMeshService", 0xac7cea96)); - } - - static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) - { - required.push_back(AZ_CRC("TransformService", 0x8ee22c50)); - } - - static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) - { - dependent.push_back(AZ_CRC("EditorVisibilityService", 0x90888caf)); - } - - static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) - { - incompatible.push_back(AZ_CRC("MeshService", 0x71d8a455)); - incompatible.push_back(AZ_CRC("SkinnedMeshService", 0xac7cea96)); - } - - static void Reflect(AZ::ReflectContext* context); - - protected: - - // Editor-specific physicalization for the attached mesh. This is needed to support - // features in the editor that rely on edit-time collision info (i.e. object snapping). - void CreateEditorPhysics(); - void DestroyEditorPhysics(); - - SkinnedMeshComponentRenderNode m_mesh; ///< IRender node implementation - - AZ::Transform m_physTransform; ///< To track scale changes, which requires re-physicalizing. - }; - -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/MeshComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/MeshComponent.h index 2cabd693d8..f7a7f5d861 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/MeshComponent.h +++ b/Gems/LmbrCentral/Code/Source/Rendering/MeshComponent.h @@ -318,6 +318,8 @@ namespace LmbrCentral MeshComponent(); ~MeshComponent() override; + AZ_DISABLE_COPY_MOVE(MeshComponent); + // AZ::Component overrides ... void Activate() override; void Deactivate() override; diff --git a/Gems/LmbrCentral/Code/Source/Rendering/SkinnedMeshComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/SkinnedMeshComponent.cpp deleted file mode 100644 index 99f3a4d2d1..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/SkinnedMeshComponent.cpp +++ /dev/null @@ -1,980 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" -#include "SkinnedMeshComponent.h" - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include "MeshComponent.h" - -namespace LmbrCentral -{ - - ////////////////////////////////////////////////////////////////////////// - /// Deprecated MeshComponent - - namespace ClassConverters - { - static bool DeprecateMeshComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); - } // namespace ClassConverters - - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - - void SkinnedMeshComponent::Reflect(AZ::ReflectContext* context) - { - SkinnedMeshComponentRenderNode::Reflect(context); - - AZ::SerializeContext* serializeContext = azrtti_cast(context); - - if (serializeContext) - { - // Need to deprecate the old MeshComponent whenever we see one. - serializeContext->ClassDeprecate("MeshComponent", "{9697D425-3D28-4414-93DD-1890E576AB4B}", &ClassConverters::DeprecateMeshComponent); - - serializeContext->Class() - ->Version(1) - ->Field("Skinned Mesh Render Node", &SkinnedMeshComponent::m_skinnedMeshRenderNode); - } - if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class()->RequestBus("MeshComponentRequestBus"); - } - } - - ////////////////////////////////////////////////////////////////////////// - - void SkinnedMeshComponentRenderNode::SkinnedRenderOptions::Reflect(AZ::ReflectContext* context) - { - AZ::SerializeContext* serializeContext = azrtti_cast(context); - - if (serializeContext) - { - serializeContext->Class() - ->Version(4, &VersionConverter) - ->Field("Opacity", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_opacity) - ->Field("MaxViewDistance", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_maxViewDist) - ->Field("ViewDistanceMultiplier", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_viewDistMultiplier) - ->Field("LODRatio", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_lodRatio) - ->Field("CastDynamicShadows", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_castShadows) - ->Field("UseVisAreas", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_useVisAreas) - ->Field("RainOccluder", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_rainOccluder) - ->Field("AcceptDecals", &SkinnedMeshComponentRenderNode::SkinnedRenderOptions::m_acceptDecals) - ; - } - } - - bool SkinnedMeshComponentRenderNode::SkinnedRenderOptions::VersionConverter([[maybe_unused]] AZ::SerializeContext& context, - AZ::SerializeContext::DataElementNode& classElement) - { - // conversion from version 1: - // - Remove Bloom (m_allowBloom) - // - Remove MotionBlur (m_allowMotionBlur) - // - Remove DepthTest (m_depthTest) - if (classElement.GetVersion() <= 1) - { - classElement.RemoveElementByName(AZ_CRC("Bloom", 0xc6cd7d1b)); - classElement.RemoveElementByName(AZ_CRC("MotionBlur", 0x917cdb53)); - classElement.RemoveElementByName(AZ_CRC("DepthTest", 0x532f68b9)); - } - - // conversion from version 2: - // - Remove IndoorOnly (m_indoorOnly) - if (classElement.GetVersion() <= 2) - { - classElement.RemoveElementByName(AZ_CRC("IndoorOnly", 0xc8ab6ddb)); - } - - // conversion from version 3: - // - Remove CastLightmapShadows (m_castLightmap) - // - Remove AffectDynamicWater (m_affectDynamicWater) - // - Remove ReceiveWind (m_receiveWind) - // - Remove AffectNavmesh (m_affectNavmesh) - // - Remove VisibilityOccluder (m_visibilityOccluder) - if (classElement.GetVersion() <= 3) - { - classElement.RemoveElementByName(AZ_CRC("CastLightmapShadows", 0x10ce0bf8)); - classElement.RemoveElementByName(AZ_CRC("AffectDynamicWater", 0xe6774a5b)); - classElement.RemoveElementByName(AZ_CRC("ReceiveWind", 0x952a1261)); - classElement.RemoveElementByName(AZ_CRC("AffectNavmesh", 0x77bd2697)); - classElement.RemoveElementByName(AZ_CRC("VisibilityOccluder", 0xe5819c29)); - } - - return true; - } - - void SkinnedMeshComponentRenderNode::Reflect(AZ::ReflectContext* context) - { - SkinnedRenderOptions::Reflect(context); - - AZ::SerializeContext* serializeContext = azrtti_cast(context); - - if (serializeContext) - { - serializeContext->Class() - ->Version(1) - ->Field("Visible", &SkinnedMeshComponentRenderNode::m_visible) - ->Field("Skinned Mesh", &SkinnedMeshComponentRenderNode::m_characterDefinitionAsset) - ->Field("Material Override", &SkinnedMeshComponentRenderNode::m_material) - ->Field("Render Options", &SkinnedMeshComponentRenderNode::m_renderOptions) - ; - } - } - - float SkinnedMeshComponentRenderNode::GetDefaultMaxViewDist() - { - if (gEnv && gEnv->p3DEngine) - { - return gEnv->p3DEngine->GetMaxViewDistance(false); - } - - // In the editor and the game, the dynamic lookup above should *always* hit. - // This case essentially means no renderer (not even the null renderer) is present. - return FLT_MAX; - } - - AZ::u32 SkinnedMeshComponentRenderNode::GetJointCount() const - { - return 0; - } - - const char* SkinnedMeshComponentRenderNode::GetJointNameByIndex([[maybe_unused]] AZ::u32 jointIndex) const - { - return nullptr; - } - - AZ::u32 SkinnedMeshComponentRenderNode::GetJointIndexByName([[maybe_unused]] const char* jointName) const - { - return 0; - } - - AZ::Transform SkinnedMeshComponentRenderNode::GetJointTransformCharacterRelative([[maybe_unused]] AZ::u32 jointIndex) const - { - return AZ::Transform::CreateIdentity(); - } - - SkinnedMeshComponentRenderNode::SkinnedRenderOptions::SkinnedRenderOptions() - : m_opacity(1.f) - , m_viewDistMultiplier(1.f) - , m_lodRatio(100) - , m_useVisAreas(true) - , m_castShadows(true) - , m_rainOccluder(true) - , m_acceptDecals(true) - { - m_maxViewDist = GetDefaultMaxViewDist(); - } - - SkinnedMeshComponentRenderNode::SkinnedMeshComponentRenderNode() - : m_materialOverride(nullptr) - , m_auxiliaryRenderFlags(0) - , m_auxiliaryRenderFlagsHistory(0) - , m_lodDistance(0.f) - , m_isRegisteredWithRenderer(false) - , m_objectMoved(false) - , m_characterDefinitionAsset(AZ::Data::AssetLoadBehavior::QueueLoad) - , m_visible(true) - , m_isQueuedForDestroyMesh(false) - { - m_localBoundingBox.Reset(); - m_worldBoundingBox.Reset(); - m_worldTransform = AZ::Transform::CreateIdentity(); - m_renderTransform = Matrix34::CreateIdentity(); - } - - SkinnedMeshComponentRenderNode::~SkinnedMeshComponentRenderNode() - { - DestroyMesh(); - } - - void SkinnedMeshComponentRenderNode::CopyPropertiesTo(SkinnedMeshComponentRenderNode& rhs) const - { - rhs.m_visible = m_visible; - rhs.m_materialOverride = m_materialOverride; - rhs.m_characterDefinitionAsset = m_characterDefinitionAsset; - rhs.m_material = m_material; - rhs.m_renderOptions = m_renderOptions; - } - - void SkinnedMeshComponentRenderNode::AttachToEntity(AZ::EntityId id) - { - if (AZ::TransformNotificationBus::Handler::BusIsConnectedId(m_attachedToEntityId)) - { - AZ::TransformNotificationBus::Handler::BusDisconnect(m_attachedToEntityId); - } - - if (id.IsValid()) - { - if (!AZ::TransformNotificationBus::Handler::BusIsConnectedId(id)) - { - AZ::TransformNotificationBus::Handler::BusConnect(id); - } - - AZ::Transform entityTransform = AZ::Transform::CreateIdentity(); - EBUS_EVENT_ID_RESULT(entityTransform, id, AZ::TransformBus, GetWorldTM); - UpdateWorldTransform(entityTransform); - } - - m_attachedToEntityId = id; - } - - void SkinnedMeshComponentRenderNode::OnAssetPropertyChanged() - { - if (HasMesh()) - { - DestroyMesh(); - } - - if (AZ::Data::AssetBus::Handler::BusIsConnected()) - { - AZ::Data::AssetBus::Handler::BusDisconnect(); - } - - CreateMesh(); - } - - void SkinnedMeshComponentRenderNode::RefreshRenderState() - { - if (gEnv->IsEditor()) - { - UpdateLocalBoundingBox(); - - AZ::Transform parentTransform = AZ::Transform::CreateIdentity(); - EBUS_EVENT_ID_RESULT(parentTransform, m_attachedToEntityId, AZ::TransformBus, GetWorldTM); - OnTransformChanged(AZ::Transform::CreateIdentity(), parentTransform); - - m_renderOptions.OnChanged(); - - if (HasMesh()) - { - // Re-register with the renderer, as some render settings/flags require it. - // Note that this is editor-only behavior (hence the guard above). - if (m_isRegisteredWithRenderer) - { - RegisterWithRenderer(false); - RegisterWithRenderer(true); - } - } - } - } - - void SkinnedMeshComponentRenderNode::SetAuxiliaryRenderFlags(uint32 flags) - { - m_auxiliaryRenderFlags = flags; - m_auxiliaryRenderFlagsHistory |= flags; - } - - void SkinnedMeshComponentRenderNode::UpdateAuxiliaryRenderFlags(bool on, uint32 mask) - { - if (on) - { - m_auxiliaryRenderFlags |= mask; - } - else - { - m_auxiliaryRenderFlags &= ~mask; - } - m_auxiliaryRenderFlagsHistory |= mask; - } - - void SkinnedMeshComponentRenderNode::CreateMesh() - { - //keep from hooking up component data when the component could be - //not activated on initialization due to component incompatibility - if (!m_attachedToEntityId.IsValid()) - { - return; - } - - if(m_characterDefinitionAsset.GetId().IsValid()) - { - if (!AZ::Data::AssetBus::Handler::BusIsConnected()) - { - AZ::Data::AssetBus::Handler::BusConnect(m_characterDefinitionAsset.GetId()); - } - - if (m_characterDefinitionAsset.IsReady()) - { - OnAssetReady(m_characterDefinitionAsset); - } - else - { - m_characterDefinitionAsset.QueueLoad(); - } - } - } - - void SkinnedMeshComponentRenderNode::DestroyMesh() - { - AZ::Data::AssetBus::Handler::BusDisconnect(); - - RegisterWithRenderer(false); - - m_characterDefinitionAsset.Release(); - m_isQueuedForDestroyMesh = false; - } - - bool SkinnedMeshComponentRenderNode::HasMesh() const - { - return false; - } - - void SkinnedMeshComponentRenderNode::SetMeshAsset(const AZ::Data::AssetId& id) - { - m_characterDefinitionAsset.Create(id); - OnAssetPropertyChanged(); - } - - - void SkinnedMeshComponentRenderNode::GetMemoryUsage(class ICrySizer* pSizer) const - { - pSizer->AddObjectSize(this); - } - - void SkinnedMeshComponentRenderNode::OnTransformChanged(const AZ::Transform&, const AZ::Transform& parentWorld) - { - // The entity to which we're attached has moved. - UpdateWorldTransform(parentWorld); - } - - void SkinnedMeshComponentRenderNode::OnAssetReady(AZ::Data::Asset asset) - { - // For skinned meshes, check the actual pointer since we create a new instance of the asset for every request - // to work around limitations on the Cry asset side. - // That behavior is driven by SkinnedMeshAsset::IsRegisterReadonlyAndShareable()==false. - if (asset.Get() == m_characterDefinitionAsset.Get()) - { - // Here is the soonest we can intercept an asset-load for cancelling (AssetLoadJob does not currently support cancelling). - // We release the asset and return before altering any ebus connections or calls related to asset-loading completion because, - // in reality, we've already cancelled the loading operation. Functions further below invoke loading logic to finalize - // asset loading state - we want to avoid this; bail early instead. - if (m_isQueuedForDestroyMesh) - { - DestroyMesh(); - return; - } - } - } - - void SkinnedMeshComponentRenderNode::UpdateWorldTransform(const AZ::Transform& entityTransform) - { - m_worldTransform = entityTransform; - - m_renderTransform = AZTransformToLYTransform(m_worldTransform); - - UpdateWorldBoundingBox(); - - m_objectMoved = true; - } - - void SkinnedMeshComponentRenderNode::UpdateLocalBoundingBox() - { - m_localBoundingBox.Reset(); - UpdateWorldBoundingBox(); - } - - void SkinnedMeshComponentRenderNode::SetVisible(bool isVisible) - { - if (m_visible != isVisible) - { - m_visible = isVisible; - RegisterWithRenderer(false); - RegisterWithRenderer(true); - } - } - - bool SkinnedMeshComponentRenderNode::GetVisible() - { - return m_visible; - } - - void SkinnedMeshComponentRenderNode::UpdateWorldBoundingBox() - { - m_worldBoundingBox.SetTransformedAABB(m_renderTransform, m_localBoundingBox); - - if (m_isRegisteredWithRenderer) - { - // Re-register with the renderer to update culling info - gEnv->p3DEngine->RegisterEntity(this); - } - } - - void SkinnedMeshComponentRenderNode::RegisterWithRenderer(bool registerWithRenderer) - { - if (gEnv && gEnv->p3DEngine) - { - if (registerWithRenderer) - { - if (!m_isRegisteredWithRenderer) - { - ApplyRenderOptions(); - - gEnv->p3DEngine->RegisterEntity(this); - - m_isRegisteredWithRenderer = true; - } - } - else - { - if (m_isRegisteredWithRenderer) - { - gEnv->p3DEngine->FreeRenderNodeState(this); - m_isRegisteredWithRenderer = false; - } - } - } - } - - namespace SkinnedMeshInternal - { - void UpdateRenderFlag(bool enable, int mask, unsigned int& flags) - { - if (enable) - { - flags |= mask; - } - else - { - flags &= ~mask; - } - } - } - - void SkinnedMeshComponentRenderNode::ApplyRenderOptions() - { - using SkinnedMeshInternal::UpdateRenderFlag; - unsigned int flags = GetRndFlags(); - flags |= ERF_COMPONENT_ENTITY; - - // Turn off any flag which has ever been set via auxiliary render flags. - UpdateRenderFlag(false, m_auxiliaryRenderFlagsHistory, flags); - - // Update flags according to current render settings - UpdateRenderFlag(m_renderOptions.m_useVisAreas == false, ERF_OUTDOORONLY, flags); - UpdateRenderFlag(m_renderOptions.m_castShadows, ERF_CASTSHADOWMAPS | ERF_HAS_CASTSHADOWMAPS, flags); - UpdateRenderFlag(m_renderOptions.m_rainOccluder, ERF_RAIN_OCCLUDER, flags); - UpdateRenderFlag(true, ERF_EXCLUDE_FROM_TRIANGULATION, flags); - UpdateRenderFlag(m_visible == false, ERF_HIDDEN, flags); - UpdateRenderFlag(false == m_renderOptions.m_acceptDecals, ERF_NO_DECALNODE_DECALS, flags); - - // Apply current auxiliary render flags - UpdateRenderFlag(true, m_auxiliaryRenderFlags, flags); - - m_fWSMaxViewDist = m_renderOptions.m_maxViewDist; - - SetViewDistanceMultiplier(m_renderOptions.m_viewDistMultiplier); - - SetLodRatio(static_cast(m_renderOptions.m_lodRatio)); - - SetRndFlags(flags); - } - - CLodValue SkinnedMeshComponentRenderNode::ComputeLOD(int wantedLod, [[maybe_unused]] const SRenderingPassInfo& passInfo) - { - return CLodValue(wantedLod); - } - - AZ::Aabb SkinnedMeshComponentRenderNode::CalculateWorldAABB() const - { - AZ::Aabb aabb = AZ::Aabb::CreateNull(); - if (!m_worldBoundingBox.IsReset()) - { - aabb.AddPoint(LYVec3ToAZVec3(m_worldBoundingBox.min)); - aabb.AddPoint(LYVec3ToAZVec3(m_worldBoundingBox.max)); - } - return aabb; - } - - AZ::Aabb SkinnedMeshComponentRenderNode::CalculateLocalAABB() const - { - AZ::Aabb aabb = AZ::Aabb::CreateNull(); - if (!m_localBoundingBox.IsReset()) - { - aabb.AddPoint(LYVec3ToAZVec3(m_localBoundingBox.min)); - aabb.AddPoint(LYVec3ToAZVec3(m_localBoundingBox.max)); - } - return aabb; - } - - /*IRenderNode*/ void SkinnedMeshComponentRenderNode::Render(const struct SRendParams& inRenderParams, const struct SRenderingPassInfo& passInfo) - { - SRendParams rParams(inRenderParams); - - // Assign a unique pInstance pointer, otherwise effects involving SRenderObjData will not work for this object. CEntityObject::Render does this for legacy entities. - rParams.pInstance = this; - - rParams.fAlpha = m_renderOptions.m_opacity; - - _smart_ptr previousMaterial = rParams.pMaterial; - const int previousObjectFlags = rParams.dwFObjFlags; - - if (m_materialOverride) - { - rParams.pMaterial = m_materialOverride; - } - - if (m_objectMoved) - { - rParams.dwFObjFlags |= FOB_DYNAMIC_OBJECT; - m_objectMoved = false; - } - - rParams.pMatrix = &m_renderTransform; - if (rParams.pMatrix->IsValid()) - { - rParams.lodValue = ComputeLOD(inRenderParams.lodValue.LodA(), passInfo); - } - - rParams.pMaterial = previousMaterial; - rParams.dwFObjFlags = previousObjectFlags; - } - - /*IRenderNode*/ bool SkinnedMeshComponentRenderNode::GetLodDistances(const SFrameLodInfo& frameLodInfo, float* distances) const - { - const float lodRatio = GetLodRatioNormalized(); - if (lodRatio > 0.0f) - { - const float distMultiplier = 1.f / (lodRatio * frameLodInfo.fTargetSize); - - for (int lodIndex = 0; lodIndex < SMeshLodInfo::s_nMaxLodCount; ++lodIndex) - { - distances[lodIndex] = m_lodDistance * (lodIndex + 1) * distMultiplier; - } - } - else - { - for (int lodIndex = 0; lodIndex < SMeshLodInfo::s_nMaxLodCount; ++lodIndex) - { - distances[lodIndex] = FLT_MAX; - } - } - - return true; - } - - void SkinnedMeshComponentRenderNode::UpdateLodDistance([[maybe_unused]] const SFrameLodInfo& frameLodInfo) - { - SMeshLodInfo lodInfo; - m_lodDistance = sqrt(lodInfo.fGeometricMean); - } - - /*IRenderNode*/ EERType SkinnedMeshComponentRenderNode::GetRenderNodeType() - { - return eERType_SkinnedMeshRenderComponent; - } - - - /*IRenderNode*/ const char* SkinnedMeshComponentRenderNode::GetName() const - { - return "SkinnedMeshComponentRenderNode"; - } - - /*IRenderNode*/ const char* SkinnedMeshComponentRenderNode::GetEntityClassName() const - { - return "SkinnedMeshComponentRenderNode"; - } - - - /*IRenderNode*/ Vec3 SkinnedMeshComponentRenderNode::GetPos([[maybe_unused]] bool bWorldOnly /*= true*/) const - { - return m_renderTransform.GetTranslation(); - } - - /*IRenderNode*/ const AABB SkinnedMeshComponentRenderNode::GetBBox() const - { - return m_worldBoundingBox; - } - - /*IRenderNode*/ void SkinnedMeshComponentRenderNode::SetBBox(const AABB& WSBBox) - { - m_worldBoundingBox = WSBBox; - } - - /*IRenderNode*/ void SkinnedMeshComponentRenderNode::OffsetPosition(const Vec3& delta) - { - // Recalculate local transform - AZ::Transform localTransform = AZ::Transform::CreateIdentity(); - EBUS_EVENT_ID_RESULT(localTransform, m_attachedToEntityId, AZ::TransformBus, GetLocalTM); - - localTransform.SetTranslation(localTransform.GetTranslation() + LYVec3ToAZVec3(delta)); - EBUS_EVENT_ID(m_attachedToEntityId, AZ::TransformBus, SetLocalTM, localTransform); - - m_objectMoved = true; - } - - /*IRenderNode*/ void SkinnedMeshComponentRenderNode::SetMaterial(_smart_ptr pMat) - { - m_materialOverride = pMat; - - if (pMat) - { - m_material.SetAssetPath(pMat->GetName()); - } - else - { - // If no material is provided, we intend to reset to the original material so we treat - // it as an asset reset to recreate the mesh. - m_material.SetAssetPath(""); - OnAssetPropertyChanged(); - } - } - - /*IRenderNode*/ _smart_ptr SkinnedMeshComponentRenderNode::GetMaterial([[maybe_unused]] Vec3* pHitPos /*= nullptr*/) - { - if (m_materialOverride) - { - return m_materialOverride; - } - - return nullptr; - } - - /*IRenderNode*/ _smart_ptr SkinnedMeshComponentRenderNode::GetMaterialOverride() - { - return m_materialOverride; - } - - /*IRenderNode*/ float SkinnedMeshComponentRenderNode::GetMaxViewDist() - { - return(m_renderOptions.m_maxViewDist * 0.75f * GetViewDistanceMultiplier()); - } - - /*IRenderNode*/ IStatObj* SkinnedMeshComponentRenderNode::GetEntityStatObj([[maybe_unused]] unsigned int nPartId, [[maybe_unused]] unsigned int nSubPartId, [[maybe_unused]] Matrix34A* pMatrix, [[maybe_unused]] bool bReturnOnlyVisible) - { - return nullptr; - } - - /*IRenderNode*/ _smart_ptr SkinnedMeshComponentRenderNode::GetEntitySlotMaterial(unsigned int nPartId, [[maybe_unused]] bool bReturnOnlyVisible, [[maybe_unused]] bool* pbDrawNear) - { - if (0 == nPartId) - { - return m_materialOverride; - } - - return nullptr; - } - - ////////////////////////////////////////////////////////////////////////// - // SkinnedMeshComponent - const float SkinnedMeshComponent::s_renderNodeRequestBusOrder = 100.f; - - void SkinnedMeshComponent::Activate() - { - m_skinnedMeshRenderNode.AttachToEntity(m_entity->GetId()); - - // Note we are purposely connecting to buses before calling m_mesh.CreateMesh(). - // m_mesh.CreateMesh() can result in events (eg: OnMeshCreated) that we want receive. - MaterialOwnerRequestBus::Handler::BusConnect(m_entity->GetId()); - MeshComponentRequestBus::Handler::BusConnect(m_entity->GetId()); - RenderNodeRequestBus::Handler::BusConnect(m_entity->GetId()); - SkeletalHierarchyRequestBus::Handler::BusConnect(GetEntityId()); - AzFramework::BoundsRequestBus::Handler::BusConnect(GetEntityId()); - - m_skinnedMeshRenderNode.CreateMesh(); - } - - void SkinnedMeshComponent::Deactivate() - { - AzFramework::BoundsRequestBus::Handler::BusDisconnect(); - SkeletalHierarchyRequestBus::Handler::BusDisconnect(); - MaterialOwnerRequestBus::Handler::BusDisconnect(); - MeshComponentRequestBus::Handler::BusDisconnect(); - RenderNodeRequestBus::Handler::BusDisconnect(); - - m_skinnedMeshRenderNode.DestroyMesh(); - m_skinnedMeshRenderNode.AttachToEntity(AZ::EntityId()); - } - - AZ::Aabb SkinnedMeshComponent::GetWorldBounds() - { - return m_skinnedMeshRenderNode.CalculateWorldAABB(); - } - - AZ::Aabb SkinnedMeshComponent::GetLocalBounds() - { - return m_skinnedMeshRenderNode.CalculateLocalAABB(); - } - - void SkinnedMeshComponent::SetMeshAsset(const AZ::Data::AssetId& id) - { - m_skinnedMeshRenderNode.SetMeshAsset(id); - } - - void SkinnedMeshComponent::SetMaterial(_smart_ptr material) - { - m_skinnedMeshRenderNode.SetMaterial(material); - } - - _smart_ptr SkinnedMeshComponent::GetMaterial() - { - return m_skinnedMeshRenderNode.GetMaterial(); - } - - IRenderNode* SkinnedMeshComponent::GetRenderNode() - { - return &m_skinnedMeshRenderNode; - } - - float SkinnedMeshComponent::GetRenderNodeRequestBusOrder() const - { - return s_renderNodeRequestBusOrder; - } - - bool SkinnedMeshComponent::GetVisibility() - { - return m_skinnedMeshRenderNode.GetVisible(); - } - - void SkinnedMeshComponent::SetVisibility(bool isVisible) - { - m_skinnedMeshRenderNode.SetVisible(isVisible); - } - - AZ::u32 SkinnedMeshComponent::GetJointCount() - { - return m_skinnedMeshRenderNode.GetJointCount(); - } - - const char* SkinnedMeshComponent::GetJointNameByIndex(AZ::u32 jointIndex) - { - return m_skinnedMeshRenderNode.GetJointNameByIndex(jointIndex); - } - - AZ::s32 SkinnedMeshComponent::GetJointIndexByName(const char* jointName) - { - return m_skinnedMeshRenderNode.GetJointIndexByName(jointName); - } - - AZ::Transform SkinnedMeshComponent::GetJointTransformCharacterRelative(AZ::u32 jointIndex) - { - return m_skinnedMeshRenderNode.GetJointTransformCharacterRelative(jointIndex); - } - - ////////////////////////////////////////////////////////////////////////// - /// Deprecated MeshComponent - - namespace ClassConverters - { - /// Convert MeshComponentRenderNode::RenderOptions to latest version. - void MeshComponentRenderNodeRenderOptionsVersion1To2Converter(AZ::SerializeContext& context, - AZ::SerializeContext::DataElementNode& classElement) - { - // conversion from version 1: - // - Need to convert Hidden to Visible - // - Need to convert OutdoorOnly to IndoorOnly - if (classElement.GetVersion() <= 1) - { - int hiddenIndex = classElement.FindElement(AZ_CRC("Hidden", 0x885de9bd)); - int visibleIndex = classElement.FindElement(AZ_CRC("Visible", 0x7ab0e859)); - - // There was a brief time where hidden became visible but the version was not patched and this will handle that case - // This should also be a reminder to always up the version at the time of renaming or removing parameters - if (visibleIndex <= -1) - { - if (hiddenIndex > -1) - { - //Invert hidden and rename to visible - AZ::SerializeContext::DataElementNode& hidden = classElement.GetSubElement(hiddenIndex); - bool hiddenData; - - hidden.GetData(hiddenData); - hidden.SetData(context, !hiddenData); - - hidden.SetName("Visible"); - } - } - - int outdoorOnlyIndex = classElement.FindElement(AZ_CRC("OutdoorOnly", 0x87f67f36)); - if (outdoorOnlyIndex > -1) - { - //Invert outdoor only and rename to indoor only - AZ::SerializeContext::DataElementNode& outdoorOnly = classElement.GetSubElement(outdoorOnlyIndex); - bool outdoorOnlyData; - - outdoorOnly.GetData(outdoorOnlyData); - outdoorOnly.SetData(context, !outdoorOnlyData); - - outdoorOnly.SetName("IndoorOnly"); - } - } - } - /// Convert MeshComponentRenderNode::RenderOptions to latest version. - void MeshComponentRenderNodeRenderOptionsVersion2To3Converter([[maybe_unused]] AZ::SerializeContext& context, - AZ::SerializeContext::DataElementNode& classElement) - { - // conversion from version 2: - // - Need to remove Visible - if (classElement.GetVersion() <= 2) - { - classElement.RemoveElementByName(AZ_CRC("Visible", 0x7ab0e859)); - } - } - - static bool DeprecateMeshComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) - { - ////////////////////////////////////////////////////////////////////////// - // Pull data out of the old version - auto renderNode = classElement.GetSubElement(classElement.FindElement(AZ_CRC("Mesh", 0xe16f3a56))); - - auto materialOverride = renderNode.GetSubElement(renderNode.FindElement(AZ_CRC("Material Override", 0xebc12e43))); - - auto renderOptions = renderNode.GetSubElement(renderNode.FindElement(AZ_CRC("Render Options", 0xb5bc5e06))); - MeshComponentRenderNodeRenderOptionsVersion1To2Converter(context, renderOptions); - - // There is a visible field in the render options that we might want to keep so we should grab it now - // this will default to true if the mesh component is at version 3 and does not have a Visible render node option - bool visible = true; - renderOptions.GetChildData(AZ_CRC("Visible", 0x7ab0e859), visible); - MeshComponentRenderNodeRenderOptionsVersion2To3Converter(context, renderOptions); - - // Use the visible field found in the render node options as a default if we found it earlier, default to true otherwise - renderNode.GetChildData(AZ_CRC("Visible", 0x7ab0e859), visible); - - float opacity = 1.f; - renderOptions.GetChildData(AZ_CRC("Opacity", 0x43fd6d66), opacity); - float maxViewDistance; - renderOptions.GetChildData(AZ_CRC("MaxViewDistance", 0xa2945dd7), maxViewDistance); - float viewDIstanceMultuplier = 1.f; - renderOptions.GetChildData(AZ_CRC("ViewDistanceMultiplier", 0x86a77124), viewDIstanceMultuplier); - unsigned lodRatio = 100; - renderOptions.GetChildData(AZ_CRC("LODRatio", 0x36bf54bf), lodRatio); - bool castDynamicShadows = true; - renderOptions.GetChildData(AZ_CRC("CastDynamicShadows", 0x55c75b43), castDynamicShadows); - bool castLightmapShadows = true; - renderOptions.GetChildData(AZ_CRC("CastLightmapShadows", 0x10ce0bf8), castLightmapShadows); - bool indoorOnly = false; - renderOptions.GetChildData(AZ_CRC("IndoorOnly", 0xc8ab6ddb), indoorOnly); - bool bloom = true; - renderOptions.GetChildData(AZ_CRC("Bloom", 0xc6cd7d1b), bloom); - bool motionBlur = true; - renderOptions.GetChildData(AZ_CRC("MotionBlur", 0x917cdb53), motionBlur); - bool rainOccluder = false; - renderOptions.GetChildData(AZ_CRC("RainOccluder", 0x4f245a07), rainOccluder); - bool affectDynamicWater = false; - renderOptions.GetChildData(AZ_CRC("AffectDynamicWater", 0xe6774a5b), affectDynamicWater); - bool receiveWind = false; - renderOptions.GetChildData(AZ_CRC("ReceiveWind", 0x952a1261), receiveWind); - bool acceptDecals = true; - renderOptions.GetChildData(AZ_CRC("AcceptDecals", 0x3b3240a7), acceptDecals); - bool visibilityOccluder = false; - renderOptions.GetChildData(AZ_CRC("VisibilityOccluder", 0xe5819c29), visibilityOccluder); - bool depthTest = true; - renderOptions.GetChildData(AZ_CRC("DepthTest", 0x532f68b9), depthTest); - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // Parse the asset reference so we know if it's a static or skinned mesh - int meshAssetElementIndex = renderNode.FindElement(AZ_CRC("Mesh", 0xe16f3a56)); - AZStd::string path; - AZ::Data::AssetId meshAssetId; - if (meshAssetElementIndex != -1) - { - auto meshAssetNode = renderNode.GetSubElement(meshAssetElementIndex); - // pull the raw data from the old asset node to get the asset id so we can create an asset of the new type - AZStd::string rawElementString = AZStd::string(&meshAssetNode.GetRawDataElement().m_buffer[0]); - // raw data will look something like this - //"id={41FDB841-F602-5603-BFFA-8BAA6930347B}:0,type={202B64E8-FD3C-4812-A842-96BC96E38806}" - // ^ 38 chars ^ - unsigned int beginningOfSequence = rawElementString.find("id={") + 3; - const int guidLength = 38; - AZStd::string assetGuidString = rawElementString.substr(beginningOfSequence, guidLength); - - meshAssetId = AZ::Data::AssetId(AZ::Uuid::CreateString(assetGuidString.c_str())); - EBUS_EVENT_RESULT(path, AZ::Data::AssetCatalogRequestBus, GetAssetPathById, meshAssetId); - int renderOptionsIndex = -1; - } - - - AZStd::string newComponentStringGuid; - AZStd::string renderNodeName; - AZStd::string meshTypeString; - AZ::Uuid meshAssetUuId; - AZ::Uuid renderNodeUuid; - AZ::Uuid renderOptionUuid; - AZ::Data::Asset meshAssetData; - - // Switch to the new component type based on the asset type of the original - // .cdf,.chr files become skinned mesh assets inside of skinned mesh components - // otherwise it becomes a static mesh asset in a static mesh component - if (path.find(CRY_CHARACTER_DEFINITION_FILE_EXT) == AZStd::string::npos) - { - newComponentStringGuid = "{2F4BAD46-C857-4DCB-A454-C412DE67852A}"; - renderNodeName = "Static Mesh Render Node"; - renderNodeUuid = AZ::AzTypeInfo::Uuid(); - meshAssetUuId = AZ::AzTypeInfo::Uuid(); - renderOptionUuid = MeshComponentRenderNode::GetRenderOptionsUuid(); - meshTypeString = "Static Mesh"; - } - else - { - newComponentStringGuid = "{C99EB110-CA74-4D95-83F0-2FCDD1FF418B}"; - renderNodeName = "Skinned Mesh Render Node"; - renderNodeUuid = AZ::AzTypeInfo::Uuid(); - meshAssetUuId = AZ::AzTypeInfo::Uuid(); - renderOptionUuid = SkinnedMeshComponentRenderNode::GetRenderOptionsUuid(); - meshTypeString = "Skinned Mesh"; - } - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // Convert. this will destroy the old mesh component and change the uuid to the new type - classElement.Convert(context, newComponentStringGuid.c_str()); - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // add data back in as appropriate - //create a static mesh render node - int renderNodeIndex = classElement.AddElement(context, renderNodeName.c_str(), renderNodeUuid); - auto& newrenderNode = classElement.GetSubElement(renderNodeIndex); - AZ::Data::Asset assetData; - if (!path.empty()) - { - assetData = AZ::Data::AssetManager::Instance().GetAsset(meshAssetId, meshAssetUuId, AZ::Data::AssetLoadBehavior::Default); - } - newrenderNode.AddElementWithData(context, meshTypeString.c_str(), assetData); - newrenderNode.AddElement(materialOverride); - newrenderNode.AddElementWithData(context, "Visible", visible); - - // render options - int renderOptionsIndex = newrenderNode.AddElement(context, "Render Options", renderOptionUuid); - auto& newRenderOptions = newrenderNode.GetSubElement(renderOptionsIndex); - newRenderOptions.AddElementWithData(context, "Opacity", opacity); - newRenderOptions.AddElementWithData(context, "MaxViewDistance", maxViewDistance); - newRenderOptions.AddElementWithData(context, "ViewDistanceMultiplier", viewDIstanceMultuplier); - newRenderOptions.AddElementWithData(context, "LODRatio", lodRatio); - newRenderOptions.AddElementWithData(context, "CastDynamicShadows", castDynamicShadows); - newRenderOptions.AddElementWithData(context, "CastLightmapShadows", castLightmapShadows); - newRenderOptions.AddElementWithData(context, "IndoorOnly", indoorOnly); - newRenderOptions.AddElementWithData(context, "Bloom", bloom); - newRenderOptions.AddElementWithData(context, "MotionBlur", motionBlur); - newRenderOptions.AddElementWithData(context, "RainOccluder", rainOccluder); - newRenderOptions.AddElementWithData(context, "AffectDynamicWater", affectDynamicWater); - newRenderOptions.AddElementWithData(context, "ReceiveWind", receiveWind); - newRenderOptions.AddElementWithData(context, "AcceptDecals", acceptDecals); - newRenderOptions.AddElementWithData(context, "VisibilityOccluder", visibilityOccluder); - newRenderOptions.AddElementWithData(context, "DepthTest", depthTest); - ////////////////////////////////////////////////////////////////////////// - return true; - } - } // namespace ClassConverters - -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/SkinnedMeshComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/SkinnedMeshComponent.h deleted file mode 100644 index b80a58dc3c..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/SkinnedMeshComponent.h +++ /dev/null @@ -1,319 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace LmbrCentral -{ - /*! - * RenderNode implementation responsible for integrating with the renderer. - * The node owns render flags, the mesh instance, and the render transform. - */ - class SkinnedMeshComponentRenderNode - : public IRenderNode - , public AZ::TransformNotificationBus::Handler - , public AZ::Data::AssetBus::Handler - { - friend class EditorSkinnedMeshComponent; - public: - using MaterialPtr = _smart_ptr; - - AZ_TYPE_INFO(SkinnedMeshComponentRenderNode, "{AE5CFE2B-6CFF-4B66-9B9C-C514BFDB8A88}"); - - SkinnedMeshComponentRenderNode(); - ~SkinnedMeshComponentRenderNode() override; - - void CopyPropertiesTo(SkinnedMeshComponentRenderNode& rhs) const; - - //! Notifies render node which entity owns it, for subscribing to transform - //! bus, etc. - void AttachToEntity(AZ::EntityId id); - - //! Instantiate mesh instance. - void CreateMesh(); - - //! Destroy mesh instance. - void DestroyMesh(); - - //! Returns true if the node has geometry assigned. - bool HasMesh() const; - - //! Assign a new mesh asset - void SetMeshAsset(const AZ::Data::AssetId& id); - - AZ::Data::Asset GetMeshAsset() const { return m_characterDefinitionAsset; } - - //! Invoked in the editor when the user assigns a new asset. - void OnAssetPropertyChanged(); - - //! Render the mesh - void RenderMesh(const struct SRendParams& inRenderParams, const struct SRenderingPassInfo& passInfo); - - //! Updates the render node's world transform based on the entity's. - void UpdateWorldTransform(const AZ::Transform& entityTransform); - - //! Computes world-space AABB. - AZ::Aabb CalculateWorldAABB() const; - - //! Computes local-space AABB. - AZ::Aabb CalculateLocalAABB() const; - - ////////////////////////////////////////////////////////////////////////// - // AZ::Data::AssetBus::Handler - void OnAssetReady(AZ::Data::Asset asset) override; - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // AZ::TransformNotificationBus::Handler interface implementation - void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - // IRenderNode interface implementation - void Render(const struct SRendParams& inRenderParams, const struct SRenderingPassInfo& passInfo) override; - bool GetLodDistances(const SFrameLodInfo& frameLodInfo, float* distances) const override; - float GetFirstLodDistance() const override { return m_lodDistance; } - EERType GetRenderNodeType() override; - const char* GetName() const override; - const char* GetEntityClassName() const override; - Vec3 GetPos(bool bWorldOnly = true) const override; - const AABB GetBBox() const override; - void SetBBox(const AABB& WSBBox) override; - void OffsetPosition(const Vec3& delta) override; - void SetMaterial(_smart_ptr pMat) override; - _smart_ptr GetMaterial(Vec3* pHitPos = nullptr) override; - _smart_ptr GetMaterialOverride() override; - IStatObj* GetEntityStatObj(unsigned int nPartId = 0, unsigned int nSubPartId = 0, Matrix34A* pMatrix = nullptr, bool bReturnOnlyVisible = false) override; - _smart_ptr GetEntitySlotMaterial(unsigned int nPartId, bool bReturnOnlyVisible = false, bool* pbDrawNear = nullptr) override; - float GetMaxViewDist() override; - void GetMemoryUsage(class ICrySizer* pSizer) const override; - AZ::EntityId GetEntityId() override { return m_attachedToEntityId; } - ////////////////////////////////////////////////////////////////////////// - - //! Invoked in the editor when a property requiring render state refresh - //! has changed. - void RefreshRenderState(); - - //! Set/get auxiliary render flags. - void SetAuxiliaryRenderFlags(uint32 flags); - uint32 GetAuxiliaryRenderFlags() const { return m_auxiliaryRenderFlags; } - void UpdateAuxiliaryRenderFlags(bool on, uint32 mask); ///< turn particular bits on/off - - //! Computes the entity - relative(local space) bounding box for - //! the assigned mesh. - virtual void UpdateLocalBoundingBox(); - void SetVisible(bool isVisible); - bool GetVisible(); - - static void Reflect(AZ::ReflectContext* context); - - static float GetDefaultMaxViewDist(); - - static AZ::Uuid GetRenderOptionsUuid() { return AZ::AzTypeInfo::Uuid(); } - - //! Retrieve skeleton joint count. - AZ::u32 GetJointCount() const; - //! Retrieve joint name by index. - const char* GetJointNameByIndex(AZ::u32 jointIndex) const; - //! Retrieve joint index by name. - AZ::u32 GetJointIndexByName(const char* jointName) const; - //! Retrieve joint character-local transform. - AZ::Transform GetJointTransformCharacterRelative(AZ::u32 jointIndex) const; - - //! Registers or unregisters our render node with the render. - void RegisterWithRenderer(bool registerWithRenderer); - - protected: - - //! Calculates base LOD distance based on mesh characteristics. - //! We do this each time the mesh resource changes. - void UpdateLodDistance(const SFrameLodInfo& frameLodInfo); - - //! Computes desired LOD level for the assigned mesh instance. - CLodValue ComputeLOD(int wantedLod, const SRenderingPassInfo& passInfo); - - //! Updates the world-space bounding box and world space transform - //! for the assigned mesh. - void UpdateWorldBoundingBox(); - - //! Applies configured render options to the render node. - void ApplyRenderOptions(); - - - class SkinnedRenderOptions - { - public: - - AZ_TYPE_INFO(SkinnedRenderOptions, "{33E69F1C-518F-4DD2-88D1-DF6D12ECA54E}") - - SkinnedRenderOptions(); - - float m_opacity; //!< Alpha/opacity value for rendering. - float m_maxViewDist; //!< Maximum draw distance. - float m_viewDistMultiplier; //!< Adjusts max view distance. If 1.0 then default max view distance is used. - AZ::u32 m_lodRatio; //!< Controls LOD distance ratio. - bool m_useVisAreas; //!< Allow VisAreas to control this component's visibility. - bool m_castShadows; //!< Casts dynamic shadows. - bool m_rainOccluder; //!< Occludes raindrops. - bool m_acceptDecals; //!< Accepts decals. - - AZStd::function m_changeCallback; - - void OnChanged() - { - if (m_changeCallback) - { - m_changeCallback(); - } - } - - static void Reflect(AZ::ReflectContext* context); - - private: - static bool VersionConverter(AZ::SerializeContext& context, - AZ::SerializeContext::DataElementNode& classElement); - }; - - //! Should be visible. - bool m_visible; - - //! User-specified material override. - AzFramework::SimpleAssetReference m_material; - - //! Render flags/options. - SkinnedRenderOptions m_renderOptions; - - //! Currently-assigned material. Null if no material is manually assigned. - MaterialPtr m_materialOverride; - - //! The Id of the entity we're associated with, for bus subscription. - AZ::EntityId m_attachedToEntityId; - - //! World and render transforms. - //! These are equivalent, but for different math libraries. - AZ::Transform m_worldTransform; - Matrix34 m_renderTransform; - - //! Local and world bounding boxes. - AABB m_localBoundingBox; - AABB m_worldBoundingBox; - - //! Additional render flags -- for special editor behavior, etc. - uint32 m_auxiliaryRenderFlags; - - //! Remember which flags have ever been toggled externally so that we can shut them off. - uint32 m_auxiliaryRenderFlagsHistory; - - //! Reference to current asset - AZ::Data::Asset m_characterDefinitionAsset; - - //! Computed LOD distance. - float m_lodDistance; - - //! Identifies whether we've already registered our node with the renderer. - bool m_isRegisteredWithRenderer; - - //! Tracks if the object was moved so we can notify the renderer. - bool m_objectMoved; - - //! Editor-only flag to avoid duplicate asset loading during scene load. - //! Duplicate asset loading can occur if we call the following in order, within the same frame: - //! CreateMesh()... DestroyMesh()... CreateMesh().... - //! The flag ensures mesh destruction/loading only occurs once the mesh asset loading job completes. - bool m_isQueuedForDestroyMesh; - }; - - class SkinnedMeshComponent - : public AZ::Component - , private MeshComponentRequestBus::Handler - , private AzFramework::BoundsRequestBus::Handler - , private MaterialOwnerRequestBus::Handler - , private RenderNodeRequestBus::Handler - , private SkeletalHierarchyRequestBus::Handler - { - public: - friend class EditorSkinnedMeshComponent; - - AZ_COMPONENT(SkinnedMeshComponent, "{C99EB110-CA74-4D95-83F0-2FCDD1FF418B}"); - - ~SkinnedMeshComponent() override = default; - - // AZ::Component overrides ... - void Activate() override; - void Deactivate() override; - - // BoundsRequestBus and MeshComponentRequestBus overrides ... - AZ::Aabb GetWorldBounds() override; - AZ::Aabb GetLocalBounds() override; - - // MeshComponentRequestBus overrides ... - void SetMeshAsset(const AZ::Data::AssetId& id) override; - AZ::Data::Asset GetMeshAsset() override { return m_skinnedMeshRenderNode.GetMeshAsset(); } - void SetVisibility(bool newVisibility) override; - bool GetVisibility() override; - - // SkeletalHierarchyRequestBus overrides ... - AZ::u32 GetJointCount() override; - const char* GetJointNameByIndex(AZ::u32 jointIndex) override; - AZ::s32 GetJointIndexByName(const char* jointName) override; - AZ::Transform GetJointTransformCharacterRelative(AZ::u32 jointIndex) override; - - // MaterialOwnerRequestBus overrides ... - void SetMaterial(_smart_ptr) override; - _smart_ptr GetMaterial() override; - - // RenderNodeRequestBus overrides ... - IRenderNode* GetRenderNode() override; - float GetRenderNodeRequestBusOrder() const override; - static const float s_renderNodeRequestBusOrder; - protected: - - static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) - { - provided.push_back(AZ_CRC("MeshService", 0x71d8a455)); - provided.push_back(AZ_CRC("SkinnedMeshService", 0xac7cea96)); - } - - static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) - { - incompatible.push_back(AZ_CRC("MeshService", 0x71d8a455)); - incompatible.push_back(AZ_CRC("SkinnedMeshService", 0xac7cea96)); - } - - static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) - { - required.push_back(AZ_CRC("TransformService", 0x8ee22c50)); - } - - static void Reflect(AZ::ReflectContext* context); - - // Reflected Data - SkinnedMeshComponentRenderNode m_skinnedMeshRenderNode; - }; -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.cpp b/Gems/LmbrCentral/Code/Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.cpp deleted file mode 100644 index ace01b435b..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "LmbrCentral_precompiled.h" -#include "AnimationEventsAssetTypeInfo.h" - -namespace LmbrCentral -{ - static AZ::Data::AssetType animationEventsType("{C1D209C1-F81A-4586-A34E-1615995F9F3F}"); - - AnimationEventsAssetTypeInfo::~AnimationEventsAssetTypeInfo() - { - Unregister(); - } - - void AnimationEventsAssetTypeInfo::Register() - { - AZ::AssetTypeInfoBus::Handler::BusConnect(animationEventsType); - } - - void AnimationEventsAssetTypeInfo::Unregister() - { - AZ::AssetTypeInfoBus::Handler::BusDisconnect(animationEventsType); - } - - AZ::Data::AssetType AnimationEventsAssetTypeInfo::GetAssetType() const - { - return animationEventsType; - } - - const char* AnimationEventsAssetTypeInfo::GetAssetTypeDisplayName() const - { - return "Animation Events"; - } - - const char* AnimationEventsAssetTypeInfo::GetGroup() const - { - return "Animation"; - } -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.h deleted file mode 100644 index 33c2551885..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace LmbrCentral -{ - class AnimationEventsAssetTypeInfo - : public AZ::AssetTypeInfoBus::Handler - { - public: - - AZ_CLASS_ALLOCATOR(AnimationEventsAssetTypeInfo, AZ::SystemAllocator, 0); - - ~AnimationEventsAssetTypeInfo() override; - - ////////////////////////////////////////////////////////////////////////////////////////////// - // AZ::AssetTypeInfoBus::Handler - AZ::Data::AssetType GetAssetType() const override; - const char* GetAssetTypeDisplayName() const override; - const char* GetGroup() const override; - ////////////////////////////////////////////////////////////////////////////////////////////// - - void Register(); - void Unregister(); - }; -} // namespace LmbrCentral \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/DbaAssetTypeInfo.cpp b/Gems/LmbrCentral/Code/Source/Unhandled/Animation/DbaAssetTypeInfo.cpp deleted file mode 100644 index fba23a580e..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/DbaAssetTypeInfo.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "LmbrCentral_precompiled.h" -#include "DbaAssetTypeInfo.h" - -namespace LmbrCentral -{ - static AZ::Data::AssetType dbaAssetType("{511562BE-65A5-4538-A5F1-AC685366243E}"); - - DbaAssetTypeInfo::~DbaAssetTypeInfo() - { - Unregister(); - } - - void DbaAssetTypeInfo::Register() - { - AZ::AssetTypeInfoBus::Handler::BusConnect(dbaAssetType); - } - - void DbaAssetTypeInfo::Unregister() - { - AZ::AssetTypeInfoBus::Handler::BusDisconnect(dbaAssetType); - } - - AZ::Data::AssetType DbaAssetTypeInfo::GetAssetType() const - { - return dbaAssetType; - } - - const char* DbaAssetTypeInfo::GetAssetTypeDisplayName() const - { - return "Animation Database"; - } - - const char* DbaAssetTypeInfo::GetGroup() const - { - return "Animation"; - } -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/DbaAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Animation/DbaAssetTypeInfo.h deleted file mode 100644 index a91f19df33..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Animation/DbaAssetTypeInfo.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace LmbrCentral -{ - class DbaAssetTypeInfo - : public AZ::AssetTypeInfoBus::Handler - { - public: - - AZ_CLASS_ALLOCATOR(DbaAssetTypeInfo, AZ::SystemAllocator, 0); - - ~DbaAssetTypeInfo() override; - - ////////////////////////////////////////////////////////////////////////////////////////////// - // AZ::AssetTypeInfoBus::Handler - AZ::Data::AssetType GetAssetType() const override; - const char* GetAssetTypeDisplayName() const override; - const char* GetGroup() const override; - ////////////////////////////////////////////////////////////////////////////////////////////// - - void Register(); - void Unregister(); - }; -} // namespace LmbrCentral \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterRigAssetTypeInfo.cpp b/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterRigAssetTypeInfo.cpp deleted file mode 100644 index b3d7f00f7a..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterRigAssetTypeInfo.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "LmbrCentral_precompiled.h" -#include "CharacterRigAssetTypeInfo.h" - -namespace LmbrCentral -{ - static AZ::Data::AssetType characterRigType("{B8C75662-D585-4B4A-B1A4-F9DFE3E174F0}"); - - CharacterRigAssetTypeInfo::~CharacterRigAssetTypeInfo() - { - Unregister(); - } - - void CharacterRigAssetTypeInfo::Register() - { - AZ::AssetTypeInfoBus::Handler::BusConnect(characterRigType); - } - - void CharacterRigAssetTypeInfo::Unregister() - { - AZ::AssetTypeInfoBus::Handler::BusDisconnect(characterRigType); - } - - AZ::Data::AssetType CharacterRigAssetTypeInfo::GetAssetType() const - { - return characterRigType; - } - - const char* CharacterRigAssetTypeInfo::GetAssetTypeDisplayName() const - { - return "Character Rig"; - } - - const char* CharacterRigAssetTypeInfo::GetGroup() const - { - return "Other"; - } -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterRigAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterRigAssetTypeInfo.h deleted file mode 100644 index a92bdc5577..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterRigAssetTypeInfo.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace LmbrCentral -{ - class CharacterRigAssetTypeInfo - : public AZ::AssetTypeInfoBus::Handler - { - public: - - AZ_CLASS_ALLOCATOR(CharacterRigAssetTypeInfo, AZ::SystemAllocator, 0); - - ~CharacterRigAssetTypeInfo() override; - - ////////////////////////////////////////////////////////////////////////////////////////////// - // AZ::AssetTypeInfoBus::Handler - AZ::Data::AssetType GetAssetType() const override; - const char* GetAssetTypeDisplayName() const override; - const char* GetGroup() const override; - ////////////////////////////////////////////////////////////////////////////////////////////// - - void Register(); - void Unregister(); - }; -} // namespace LmbrCentral \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonAssetTypeInfo.cpp b/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonAssetTypeInfo.cpp deleted file mode 100644 index 6514495786..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonAssetTypeInfo.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "LmbrCentral_precompiled.h" -#include "SkeletonAssetTypeInfo.h" - -namespace LmbrCentral -{ - static AZ::Data::AssetType skeletonType("{60161B46-21F0-4396-A4F0-F2CCF0664CDE}"); - - SkeletonAssetTypeInfo::~SkeletonAssetTypeInfo() - { - Unregister(); - } - - void SkeletonAssetTypeInfo::Register() - { - AZ::AssetTypeInfoBus::Handler::BusConnect(skeletonType); - } - - void SkeletonAssetTypeInfo::Unregister() - { - AZ::AssetTypeInfoBus::Handler::BusDisconnect(skeletonType); - } - - AZ::Data::AssetType SkeletonAssetTypeInfo::GetAssetType() const - { - return skeletonType; - } - - const char* SkeletonAssetTypeInfo::GetAssetTypeDisplayName() const - { - return "Skeleton"; - } - - const char* SkeletonAssetTypeInfo::GetGroup() const - { - return "Other"; - } -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonAssetTypeInfo.h deleted file mode 100644 index 78ffa2c5d5..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonAssetTypeInfo.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace LmbrCentral -{ - class SkeletonAssetTypeInfo - : public AZ::AssetTypeInfoBus::Handler - { - public: - - AZ_CLASS_ALLOCATOR(SkeletonAssetTypeInfo, AZ::SystemAllocator, 0); - - ~SkeletonAssetTypeInfo() override; - - ////////////////////////////////////////////////////////////////////////////////////////////// - // AZ::AssetTypeInfoBus::Handler - AZ::Data::AssetType GetAssetType() const override; - const char* GetAssetTypeDisplayName() const override; - const char* GetGroup() const override; - ////////////////////////////////////////////////////////////////////////////////////////////// - - void Register(); - void Unregister(); - }; -} // namespace LmbrCentral \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.cpp b/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.cpp deleted file mode 100644 index 760f11a14d..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "LmbrCentral_precompiled.h" -#include "SkeletonParamsAssetTypeInfo.h" - -namespace LmbrCentral -{ - static AZ::Data::AssetType skeletonParamsType("{4BBB785A-6824-4803-A607-F9323E7BEEF1}"); - - SkeletonParamsAssetTypeInfo::~SkeletonParamsAssetTypeInfo() - { - Unregister(); - } - - void SkeletonParamsAssetTypeInfo::Register() - { - AZ::AssetTypeInfoBus::Handler::BusConnect(skeletonParamsType); - } - - void SkeletonParamsAssetTypeInfo::Unregister() - { - AZ::AssetTypeInfoBus::Handler::BusDisconnect(skeletonParamsType); - } - - AZ::Data::AssetType SkeletonParamsAssetTypeInfo::GetAssetType() const - { - return skeletonParamsType; - } - - const char* SkeletonParamsAssetTypeInfo::GetAssetTypeDisplayName() const - { - return "Skeleton Params"; - } - - const char* SkeletonParamsAssetTypeInfo::GetGroup() const - { - return "Other"; - } -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.h deleted file mode 100644 index bec4869922..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace LmbrCentral -{ - class SkeletonParamsAssetTypeInfo - : public AZ::AssetTypeInfoBus::Handler - { - public: - - AZ_CLASS_ALLOCATOR(SkeletonParamsAssetTypeInfo, AZ::SystemAllocator, 0); - - ~SkeletonParamsAssetTypeInfo() override; - - ////////////////////////////////////////////////////////////////////////////////////////////// - // AZ::AssetTypeInfoBus::Handler - AZ::Data::AssetType GetAssetType() const override; - const char* GetAssetTypeDisplayName() const override; - const char* GetGroup() const override; - ////////////////////////////////////////////////////////////////////////////////////////////// - - void Register(); - void Unregister(); - }; -} // namespace LmbrCentral \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.cpp b/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.cpp deleted file mode 100644 index 7fa535f8c4..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "LmbrCentral_precompiled.h" -#include "SkinnedMeshAssetTypeInfo.h" - -#include - -namespace LmbrCentral -{ - static AZ::Data::AssetType skinnedMeshAssetType("{C5D443E1-41FF-4263-8654-9438BC888CB7}"); - - SkinnedMeshAssetTypeInfo::~SkinnedMeshAssetTypeInfo() - { - Unregister(); - } - - void SkinnedMeshAssetTypeInfo::Register() - { - AZ::AssetTypeInfoBus::Handler::BusConnect(skinnedMeshAssetType); - } - - void SkinnedMeshAssetTypeInfo::Unregister() - { - AZ::AssetTypeInfoBus::Handler::BusDisconnect(skinnedMeshAssetType); - } - - AZ::Data::AssetType SkinnedMeshAssetTypeInfo::GetAssetType() const - { - return skinnedMeshAssetType; - } - - const char* SkinnedMeshAssetTypeInfo::GetAssetTypeDisplayName() const - { - return "Skinned Mesh"; - } - - const char* SkinnedMeshAssetTypeInfo::GetGroup() const - { - return "Other"; - } - const char * SkinnedMeshAssetTypeInfo::GetBrowserIcon() const - { - return "Editor/Icons/Components/SkinnedMesh.svg"; - } -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.h deleted file mode 100644 index b8ac25281d..0000000000 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace LmbrCentral -{ - class SkinnedMeshAssetTypeInfo - : public AZ::AssetTypeInfoBus::Handler - { - public: - - AZ_CLASS_ALLOCATOR(SkinnedMeshAssetTypeInfo, AZ::SystemAllocator, 0); - - ~SkinnedMeshAssetTypeInfo() override; - - ////////////////////////////////////////////////////////////////////////////////////////////// - // AZ::AssetTypeInfoBus::Handler - AZ::Data::AssetType GetAssetType() const override; - const char* GetAssetTypeDisplayName() const override; - const char* GetGroup() const override; - const char* GetBrowserIcon() const override; - ////////////////////////////////////////////////////////////////////////////////////////////// - - void Register(); - void Unregister(); - }; -} // namespace LmbrCentral \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Tests/BoxShapeTest.cpp b/Gems/LmbrCentral/Code/Tests/BoxShapeTest.cpp index ebfef874fa..fd1e4ae4f1 100644 --- a/Gems/LmbrCentral/Code/Tests/BoxShapeTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/BoxShapeTest.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include namespace UnitTest { diff --git a/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp b/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp index a0ce24d34f..58e7e9e093 100644 --- a/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp @@ -133,7 +133,6 @@ protected: ProductPathDependencySet productDependencies; ASSERT_TRUE(OpenTestFile(fileName, fileStream)); - ASSERT_FALSE(worker.PopulateLevelDataDependenciesHelper(&fileStream, productDependencies)); ASSERT_EQ(productDependencies.size(), 0); } @@ -163,101 +162,6 @@ protected: AZ::ComponentDescriptor* m_simpleAssetRefDescriptor; }; -TEST_F(LevelBuilderTest, TestLevelData_RequestOptionalLevelDependencies_ExpectedDependenciesAdded) -{ - LevelBuilderWorker worker; - ProductPathDependencySet productDependencies; - - const AZStd::string levelPath("some/levelName/"); - AZStd::string levelPak; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "level.pak", levelPak); - - worker.PopulateOptionalLevelDependencies(levelPak, productDependencies); - - AZStd::string coverPath; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "terrain/cover.ctc", coverPath); - - AZStd::string occluderPath; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "occluder.ocm", occluderPath); - - AZStd::string levelCfgPath; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "level.cfg", levelCfgPath); - - AZStd::string autoResourceList; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "auto_resourcelist.txt", autoResourceList); - - AZStd::string mergedMeshesList; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "terrain/merged_meshes_sectors/mmrm_used_meshes.lst", mergedMeshesList); - - AZStd::string levelXmlPath; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "levelName.xml", levelXmlPath); - - AZStd::string terrainTexturePakPath; - AzFramework::StringFunc::Path::Join(levelPath.c_str(), "terraintexture.pak", terrainTexturePakPath); - - ASSERT_THAT(productDependencies, - testing::UnorderedElementsAre( - ProductPathDependency(coverPath.c_str(), AssetBuilderSDK::ProductPathDependencyType::SourceFile), - ProductPathDependency(occluderPath.c_str(), AssetBuilderSDK::ProductPathDependencyType::SourceFile), - ProductPathDependency(levelCfgPath.c_str(), AssetBuilderSDK::ProductPathDependencyType::SourceFile), - ProductPathDependency(autoResourceList.c_str(), AssetBuilderSDK::ProductPathDependencyType::SourceFile), - ProductPathDependency(mergedMeshesList.c_str(), AssetBuilderSDK::ProductPathDependencyType::SourceFile), - ProductPathDependency(terrainTexturePakPath.c_str(), AssetBuilderSDK::ProductPathDependencyType::SourceFile), - ProductPathDependency(levelXmlPath.c_str(), AssetBuilderSDK::ProductPathDependencyType::SourceFile)) - ); -} - -TEST_F(LevelBuilderTest, TestLevelData_MultipleDependencies) -{ - // Tests processing a leveldata.xml file containing multiple dependencies - // Should output 5 dependencies - - IO::FileIOStream fileStream; - - ASSERT_TRUE(OpenTestFile("leveldata_test1.xml", fileStream)); - - LevelBuilderWorker worker; - ProductPathDependencySet productDependencies; - - ASSERT_TRUE(worker.PopulateLevelDataDependenciesHelper(&fileStream, productDependencies)); - ASSERT_THAT(productDependencies, - testing::UnorderedElementsAre( - ProductPathDependency("materials/natural/terrain/am_mud1.mtl", AssetBuilderSDK::ProductPathDependencyType::ProductFile), - ProductPathDependency("materials/natural/terrain/am_grass1.mtl", AssetBuilderSDK::ProductPathDependencyType::ProductFile), - ProductPathDependency("materials/natural/terrain/am_rockcliff1.mtl", AssetBuilderSDK::ProductPathDependencyType::ProductFile), - ProductPathDependency("materials/natural/terrain/am_path_hexagon.mtl", AssetBuilderSDK::ProductPathDependencyType::ProductFile), - ProductPathDependency("materials/natural/terrain/am_rockground.mtl", AssetBuilderSDK::ProductPathDependencyType::ProductFile)) - ); -} - -TEST_F(LevelBuilderTest, TestLevelData_NoDependencies) -{ - // Tests processing a leveldata.xml file that has no dependencies - // Should output 0 dependencies - - IO::FileIOStream fileStream; - - ASSERT_TRUE(OpenTestFile("leveldata_test2.xml", fileStream)); - - LevelBuilderWorker worker; - ProductPathDependencySet productDependencies; - - ASSERT_TRUE(worker.PopulateLevelDataDependenciesHelper(&fileStream, productDependencies)); - ASSERT_EQ(productDependencies.size(), 0); -} - -TEST_F(LevelBuilderTest, TestLevelData_InvalidStream) -{ - // Tests passing an invalid stream in - // Should output 0 dependencies and return false - - LevelBuilderWorker worker; - ProductPathDependencySet productDependencies; - - ASSERT_FALSE(worker.PopulateLevelDataDependenciesHelper(nullptr, productDependencies)); - ASSERT_EQ(productDependencies.size(), 0); -} - TEST_F(LevelBuilderTest, TestLevelData_EmptyFile) { // Tests processing a leveldata.xml file that is empty @@ -472,30 +376,3 @@ TEST_F(LevelBuilderTest, DynamicSlice_HasEmptySimpleAssetReference_HasNoProductD ASSERT_EQ(productPathDependencies.size(), 0); } - -// Disabling due to OpenTestFile race condition -TEST_F(LevelBuilderTest, DISABLED_VegetationMap_HasFileReference_HasCorrectProductDependency) -{ - LevelBuilderWorker worker; - ProductPathDependencySet productPathDependencies; - - AZ::IO::FileIOStream fileStream; - ASSERT_TRUE(OpenTestFile("VegetationMap_oneFileReferences.dat", fileStream)); - - worker.PopulateVegetationMapDataDependenciesHelper(&fileStream, productPathDependencies); - ASSERT_EQ(productPathDependencies.size(), 1); - ASSERT_THAT(productPathDependencies, testing::UnorderedElementsAre( - ProductPathDependency{ "dummytestbasefolder/dummytestfolder/dummygeometryfile.cgf", AssetBuilderSDK::ProductPathDependencyType::ProductFile })); -} - -TEST_F(LevelBuilderTest, DISABLED_VegetationMap_HasNoFileReference_HasCorrectProductDependency) -{ - LevelBuilderWorker worker; - ProductPathDependencySet productPathDependencies; - - AZ::IO::FileIOStream fileStream; - ASSERT_TRUE(OpenTestFile("VegetationMap_noFileReferences.dat", fileStream)); - - worker.PopulateVegetationMapDataDependenciesHelper(&fileStream, productPathDependencies); - ASSERT_EQ(productPathDependencies.size(), 0); -} diff --git a/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp b/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp index 2e4835076a..0d6c4283bf 100644 --- a/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include namespace { diff --git a/Gems/LmbrCentral/Code/Tests/ShapeTestUtils.cpp b/Gems/LmbrCentral/Code/Tests/ShapeTestUtils.cpp deleted file mode 100644 index 202c81abd0..0000000000 --- a/Gems/LmbrCentral/Code/Tests/ShapeTestUtils.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include - -namespace UnitTest -{ - TestDebugDisplayRequests::TestDebugDisplayRequests() - { - m_transforms.push(AZ::Transform::CreateIdentity()); - } - - const AZStd::vector& TestDebugDisplayRequests::GetPoints() const - { - return m_points; - } - - void TestDebugDisplayRequests::DrawWireBox(const AZ::Vector3& min, const AZ::Vector3& max) - { - const AZ::Transform& tm = m_transforms.back(); - m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), min.GetY(), min.GetZ()))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), min.GetY(), max.GetZ()))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), max.GetY(), min.GetZ()))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(min.GetX(), max.GetY(), max.GetZ()))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), min.GetY(), min.GetZ()))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), min.GetY(), max.GetZ()))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), max.GetY(), min.GetZ()))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(max.GetX(), max.GetY(), max.GetZ()))); - } - - void TestDebugDisplayRequests::DrawSolidBox(const AZ::Vector3& min, const AZ::Vector3& max) - { - DrawWireBox(min, max); - } - - void TestDebugDisplayRequests::DrawWireQuad(float width, float height) - { - const AZ::Transform& tm = m_transforms.back(); - m_points.push_back(tm.TransformPoint(AZ::Vector3(-0.5f * width, 0.0f, -0.5f * height))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(-0.5f * width, 0.0f, 0.5f * height))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(0.5f * width, 0.0f, -0.5f * height))); - m_points.push_back(tm.TransformPoint(AZ::Vector3(0.5f * width, 0.0f, 0.5f * height))); - } - - void TestDebugDisplayRequests::DrawQuad(float width, float height) - { - DrawWireQuad(width, height); - } - - void TestDebugDisplayRequests::PushMatrix(const AZ::Transform& tm) - { - m_transforms.push(m_transforms.back() * tm); - } - - void TestDebugDisplayRequests::PopMatrix() - { - if (m_transforms.size() == 1) - { - AZ_Error("TestDebugDisplayRequest", false, "Invalid call to PopMatrix when no matrices were pushed."); - } - else - { - m_transforms.pop(); - } - } -} // namespace UnitTest diff --git a/Gems/LmbrCentral/Code/Tests/ShapeTestUtils.h b/Gems/LmbrCentral/Code/Tests/ShapeTestUtils.h deleted file mode 100644 index 8d00842999..0000000000 --- a/Gems/LmbrCentral/Code/Tests/ShapeTestUtils.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once -#include - -namespace UnitTest -{ - //! Minimal implementation of DebugDisplayRequests to support testing shapes. - //! Stores a list of points based on received draw calls to delineate the exterior of the object requested to be drawn. - class TestDebugDisplayRequests : public AzFramework::DebugDisplayRequests - { - public: - TestDebugDisplayRequests(); - const AZStd::vector& GetPoints() const; - - // DebugDisplayRequests ... - void DrawWireBox(const AZ::Vector3& min, const AZ::Vector3& max) override; - void DrawSolidBox(const AZ::Vector3& min, const AZ::Vector3& max) override; - void DrawWireQuad(float width, float height) override; - void DrawQuad(float width, float height) override; - void PushMatrix(const AZ::Transform& tm) override; - void PopMatrix() override; - private: - AZStd::vector m_points; - AZStd::stack m_transforms; - }; -} // namespace UnitTest diff --git a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake index a4d0289c9c..a7dcc8f770 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake @@ -56,8 +56,6 @@ set(FILES Source/Rendering/EditorEnvProbeComponent.cpp Source/Rendering/EditorMeshComponent.h Source/Rendering/EditorMeshComponent.cpp - Source/Rendering/EditorSkinnedMeshComponent.h - Source/Rendering/EditorSkinnedMeshComponent.cpp Source/Rendering/EditorHighQualityShadowComponent.h Source/Rendering/EditorHighQualityShadowComponent.cpp Source/Rendering/EditorFogVolumeComponent.h diff --git a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake index 669d3548cb..ba0330e93c 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake @@ -125,8 +125,6 @@ set(FILES Source/Rendering/MeshAssetHandler.cpp Source/Rendering/MeshComponent.h Source/Rendering/MeshComponent.cpp - Source/Rendering/SkinnedMeshComponent.h - Source/Rendering/SkinnedMeshComponent.cpp Source/Rendering/StereoRendererComponent.h Source/Rendering/StereoRendererComponent.cpp Source/Rendering/HighQualityShadowComponent.h @@ -184,18 +182,12 @@ set(FILES Source/Shape/ShapeComponentConverters.inl Source/Shape/ShapeGeometryUtil.h Source/Shape/ShapeGeometryUtil.cpp - Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.cpp - Source/Unhandled/Animation/AnimationEventsAssetTypeInfo.h - Source/Unhandled/Animation/DbaAssetTypeInfo.cpp - Source/Unhandled/Animation/DbaAssetTypeInfo.h Source/Unhandled/Material/MaterialAssetTypeInfo.cpp Source/Unhandled/Material/MaterialAssetTypeInfo.h Source/Unhandled/Other/AudioAssetTypeInfo.cpp Source/Unhandled/Other/AudioAssetTypeInfo.h Source/Unhandled/Other/CharacterPhysicsAssetTypeInfo.cpp Source/Unhandled/Other/CharacterPhysicsAssetTypeInfo.h - Source/Unhandled/Other/CharacterRigAssetTypeInfo.cpp - Source/Unhandled/Other/CharacterRigAssetTypeInfo.h Source/Unhandled/Other/EntityPrototypeLibraryAssetTypeInfo.cpp Source/Unhandled/Other/EntityPrototypeLibraryAssetTypeInfo.h Source/Unhandled/Other/GameTokenAssetTypeInfo.cpp @@ -204,12 +196,6 @@ set(FILES Source/Unhandled/Other/GroupAssetTypeInfo.h Source/Unhandled/Other/PrefabsLibraryAssetTypeInfo.cpp Source/Unhandled/Other/PrefabsLibraryAssetTypeInfo.h - Source/Unhandled/Other/SkeletonAssetTypeInfo.cpp - Source/Unhandled/Other/SkeletonAssetTypeInfo.h - Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.cpp - Source/Unhandled/Other/SkeletonParamsAssetTypeInfo.h - Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.cpp - Source/Unhandled/Other/SkinnedMeshAssetTypeInfo.h Source/Unhandled/Texture/SubstanceAssetTypeInfo.cpp Source/Unhandled/Texture/SubstanceAssetTypeInfo.h Source/Unhandled/Texture/TextureAssetTypeInfo.cpp diff --git a/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake index e2d65b0af4..ac894924d7 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake @@ -23,8 +23,6 @@ set(FILES Tests/LmbrCentralReflectionTest.cpp Tests/LmbrCentralTest.cpp Tests/ShapeGeometryUtilTest.cpp - Tests/ShapeTestUtils.cpp - Tests/ShapeTestUtils.h Tests/SpawnerComponentTest.cpp Tests/SplineComponentTests.cpp Tests/DiskShapeTest.cpp diff --git a/Gems/LyShine/Code/CMakeLists.txt b/Gems/LyShine/Code/CMakeLists.txt index 81abb0c08f..6f76144046 100644 --- a/Gems/LyShine/Code/CMakeLists.txt +++ b/Gems/LyShine/Code/CMakeLists.txt @@ -15,7 +15,6 @@ ly_get_list_relative_pal_filename(common_source_dir ${CMAKE_CURRENT_LIST_DIR}/So ly_add_target( NAME LyShine.Static STATIC NAMESPACE Gem - OUTPUT_NAME Gem.LyShine.Static FILES_CMAKE lyshine_static_files.cmake ${pal_source_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake @@ -29,6 +28,11 @@ ly_add_target( Legacy::CryCommon Gem::LmbrCentral Gem::TextureAtlas + PUBLIC + Gem::Atom_RPI.Public + Gem::Atom_Utils.Static + Gem::Atom_Bootstrap.Headers + Gem::AtomFont ) ly_add_target( @@ -84,6 +88,9 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) Gem::LmbrCentral Gem::TextureAtlas ${additional_dependencies} + PUBLIC + Gem::Atom_RPI.Public + Gem::Atom_Utils.Static ) ly_add_target( diff --git a/Gems/LyShine/Code/Source/Animation/AnimTrack.h b/Gems/LyShine/Code/Source/Animation/AnimTrack.h index 407f4e040f..3f8b6df333 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimTrack.h +++ b/Gems/LyShine/Code/Source/Animation/AnimTrack.h @@ -220,8 +220,8 @@ protected: Range m_timeRange; CUiAnimParamType m_nParamType; - int m_currKey : 31; - int m_bModified : 1; + unsigned int m_currKey : 31; + unsigned int m_bModified : 1; float m_lastTime; int m_flags; diff --git a/Gems/LyShine/Code/Source/LyShine.cpp b/Gems/LyShine/Code/Source/LyShine.cpp index b81d9988f6..c9b201dc5b 100644 --- a/Gems/LyShine/Code/Source/LyShine.cpp +++ b/Gems/LyShine/Code/Source/LyShine.cpp @@ -78,7 +78,6 @@ #include "World/UiCanvasProxyRefComponent.h" #include "World/UiCanvasOnMeshComponent.h" - //! \brief Simple utility class for LyShine functionality in Lua. //! //! Functionality unrelated to UI, such as showing the mouse cursor, should @@ -174,6 +173,7 @@ CLyShine::CLyShine(ISystem* system) AzFramework::InputChannelEventListener::Connect(); AzFramework::InputTextEventListener::Connect(); UiCursorBus::Handler::BusConnect(); + AZ::TickBus::Handler::BusConnect(); // These are internal Amazon components, so register them so that we can send back their names to our metrics collection // IF YOU ARE A THIRDPARTY WRITING A GEM, DO NOT REGISTER YOUR COMPONENTS WITH EditorMetricsComponentRegistrationBus @@ -249,6 +249,7 @@ CLyShine::CLyShine(ISystem* system) CLyShine::~CLyShine() { UiCursorBus::Handler::BusDisconnect(); + AZ::TickBus::Handler::BusDisconnect(); AzFramework::InputTextEventListener::Disconnect(); AzFramework::InputChannelEventListener::Disconnect(); @@ -382,6 +383,16 @@ void CLyShine::Update(float deltaTimeInSeconds) { FRAME_PROFILER(__FUNCTION__, gEnv->pSystem, PROFILE_UI); + if (!m_uiRenderer->IsReady()) + { + return; + } + + // Tell the UI system the size of the viewport we are rendering to - this drives the + // canvas size for full screen UI canvases. It needs to be set before either pLyShine->Update or + // pLyShine->Render are called. It must match the viewport size that the input system is using. + SetViewportSize(m_uiRenderer->GetViewportSize()); + // Guard against nested updates. This can occur if a canvas update below triggers the load screen component's // UpdateAndRender (ex. when a texture is loaded) if (!m_updatingLoadedCanvases) @@ -403,6 +414,7 @@ void CLyShine::Render() { FRAME_PROFILER(__FUNCTION__, gEnv->pSystem, PROFILE_UI); + // LYSHINE_ATOM_TODO - verify that this is no longer needed and remove if (!gEnv || !gEnv->pRenderer || gEnv->pRenderer->GetRenderType() == ERenderType::eRT_Null) { // if the renderer is not initialized or it is the null renderer (e.g. running as a server) @@ -417,13 +429,8 @@ void CLyShine::Render() return; } - // Fix for bug where this function could get called before CRenderer::InitSystemResources has been called. - // To check if it has been called we see if the default textures have been setup - int whiteTextureId = gEnv->pRenderer->GetWhiteTextureId(); - if (whiteTextureId == -1 || gEnv->pRenderer->EF_GetTextureByID(whiteTextureId) == nullptr) + if (!m_uiRenderer->IsReady()) { - // system resources are not yet initialized, this makes it impossible to render the UI and could - // cause a crash if we attempt to. return; } @@ -436,6 +443,7 @@ void CLyShine::Render() // Render all the canvases loaded in game m_uiCanvasManager->RenderLoadedCanvases(); +#ifdef LYSHINE_ATOM_TODO // convert cursor support to use Atom m_draw2d->RenderDeferredPrimitives(); // Don't render the UI cursor when in edit mode. For example during UI Preview mode a script could turn on the @@ -446,9 +454,11 @@ void CLyShine::Render() { RenderUiCursor(); } +#endif GetUiRenderer()->EndUiFrameRender(); +#ifdef LYSHINE_ATOM_TODO // convert debug info to Atom #ifndef _RELEASE if (CV_ui_DisplayElemBounds) { @@ -468,6 +478,7 @@ void CLyShine::Render() m_uiCanvasManager->DebugDisplayDrawCallData(); } #endif +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -633,6 +644,20 @@ bool CLyShine::OnInputTextEventFiltered(const AZStd::string& textUTF8) return result; } +void CLyShine::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) +{ + // Update the loaded UI canvases + Update(deltaTime); + + // Recreate dirty render graphs and send primitive data to the dynamic draw context + Render(); +} + +int CLyShine::GetTickOrder() +{ + return AZ::TICK_UI; +} + //////////////////////////////////////////////////////////////////////////////////////////////////// void CLyShine::RenderUiCursor() { diff --git a/Gems/LyShine/Code/Source/LyShine.h b/Gems/LyShine/Code/Source/LyShine.h index 84f12f4f6f..7e59cb37c8 100644 --- a/Gems/LyShine/Code/Source/LyShine.h +++ b/Gems/LyShine/Code/Source/LyShine.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,7 @@ class CLyShine , public UiCursorBus::Handler , public AzFramework::InputChannelEventListener , public AzFramework::InputTextEventListener + , public AZ::TickBus::Handler { public: @@ -104,6 +106,11 @@ public: bool OnInputTextEventFiltered(const AZStd::string& textUTF8) override; // ~InputTextEventListener + // TickEvents + void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; + int GetTickOrder() override; + // ~TickEvents + // Get the UIRenderer (which is owned by CLyShine). This is not exposed outside the gem. UiRenderer* GetUiRenderer(); diff --git a/Gems/LyShine/Code/Source/RenderGraph.cpp b/Gems/LyShine/Code/Source/RenderGraph.cpp index 5cbf2d5b97..c65e3d9fe3 100644 --- a/Gems/LyShine/Code/Source/RenderGraph.cpp +++ b/Gems/LyShine/Code/Source/RenderGraph.cpp @@ -15,6 +15,8 @@ #include "RenderGraph.h" #include "UiRenderer.h" +#include + #ifndef _RELEASE #include #endif @@ -40,7 +42,7 @@ namespace LyShine }; //////////////////////////////////////////////////////////////////////////////////////////////////// - PrimitiveListRenderNode::PrimitiveListRenderNode(ITexture* texture, + PrimitiveListRenderNode::PrimitiveListRenderNode(const AZ::Data::Instance& texture, bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, int blendModeState) : RenderNode(RenderNodeType::PrimitiveList) , m_numTextures(1) @@ -56,8 +58,9 @@ namespace LyShine } //////////////////////////////////////////////////////////////////////////////////////////////////// - PrimitiveListRenderNode::PrimitiveListRenderNode(ITexture* texture, ITexture* maskTexture, - bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, AlphaMaskType alphaMaskType, int blendModeState) + PrimitiveListRenderNode::PrimitiveListRenderNode(const AZ::Data::Instance& texture, + const AZ::Data::Instance& maskTexture, bool isClampTextureMode, bool isTextureSRGB, + bool preMultiplyAlpha, AlphaMaskType alphaMaskType, int blendModeState) : RenderNode(RenderNodeType::PrimitiveList) , m_numTextures(2) , m_isTextureSRGB(isTextureSRGB) @@ -82,6 +85,7 @@ namespace LyShine //////////////////////////////////////////////////////////////////////////////////////////////////// void PrimitiveListRenderNode::Render(UiRenderer* uiRenderer) { +#ifdef LYSHINE_ATOM_TODO // keeping this code for reference for future phase (masks/render targets) for (int i = 0; i < m_numTextures; ++i) { uiRenderer->SetTexture(m_textures[i].m_texture, i, m_textures[i].m_isClampTextureMode); @@ -123,6 +127,60 @@ namespace LyShine { renderer->SetSrgbWrite(true); } +#endif + if (!uiRenderer->IsReady()) + { + return; + } + + AZ::RHI::Ptr dynamicDraw = uiRenderer->GetDynamicDrawContext(); + const UiRenderer::UiShaderData& uiShaderData = uiRenderer->GetUiShaderData(); + + dynamicDraw->SetShaderVariant(uiShaderData.m_shaderVariantDefault); + + // Set up per draw SRG + AZ::Data::Instance drawSrg = dynamicDraw->NewDrawSrg(); + + // Set textures + uint32_t isClampTextureMode = 0; + for (int i = 0; i < m_numTextures; ++i) + { + const AZ::RHI::ImageView* imageView = m_textures[i].m_texture ? m_textures[i].m_texture->GetImageView() : nullptr; + + if (!imageView) + { + // Default to white texture + auto image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + imageView = image->GetImageView(); + } + + if (imageView) + { + drawSrg->SetImageView(uiShaderData.m_imageInputIndex, imageView, i); + if (m_textures[i].m_isClampTextureMode) + { + isClampTextureMode |= (1 << i); + } + } + } + + // Set sampler state per texture + drawSrg->SetConstant(uiShaderData.m_isClampInputIndex, isClampTextureMode); + + // Set projection matrix + drawSrg->SetConstant(uiShaderData.m_viewProjInputIndex, uiRenderer->GetModelViewProjectionMatrix()); + + drawSrg->Compile(); + + // Add the indexed primitives to the dynamic draw context for drawing + // + // [LYSHINE_ATOM_TODO][ATOM-15073] - need to combine into a single DrawIndexed call to take advantage of the draw call + // optimization done by this RenderGraph. This option will be added to DynamicDrawContext. For + // now we could combine the vertices ourselves + for (const IRenderer::DynUiPrimitive& primitive : m_primitives) + { + dynamicDraw->DrawIndexed(primitive.m_vertices, primitive.m_numVertices, primitive.m_indices, primitive.m_numIndices, AZ::RHI::IndexFormat::Uint16, drawSrg); + } } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -143,7 +201,7 @@ namespace LyShine } //////////////////////////////////////////////////////////////////////////////////////////////////// - int PrimitiveListRenderNode::GetOrAddTexture(ITexture* texture, bool isClampTextureMode) + int PrimitiveListRenderNode::GetOrAddTexture(const AZ::Data::Instance& texture, bool isClampTextureMode) { // Check if node is already using this texture int texUnit = FindTexture(texture, isClampTextureMode); @@ -167,7 +225,7 @@ namespace LyShine } //////////////////////////////////////////////////////////////////////////////////////////////////// - int PrimitiveListRenderNode::FindTexture(ITexture* texture, bool isClampTextureMode) const + int PrimitiveListRenderNode::FindTexture(const AZ::Data::Instance& texture, bool isClampTextureMode) const { for (int i = 0; i < m_numTextures; ++i) { @@ -580,24 +638,35 @@ namespace LyShine //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::BeginMask(bool isMaskingEnabled, bool useAlphaTest, bool drawBehind, bool drawInFront) { +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (masks and render targets) + // this uses pool allocator MaskRenderNode* maskRenderNode = new MaskRenderNode(m_currentMask, isMaskingEnabled, useAlphaTest, drawBehind, drawInFront); m_currentMask = maskRenderNode; m_renderNodeListStack.push(&maskRenderNode->GetMaskRenderNodeList()); +#else + AZ_UNUSED(drawInFront); + AZ_UNUSED(drawBehind); + AZ_UNUSED(useAlphaTest); + AZ_UNUSED(isMaskingEnabled); +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::StartChildrenForMask() { +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (masks and render targets) AZ_Assert(m_currentMask, "Calling StartChildrenForMask while not defining a mask"); m_renderNodeListStack.pop(); m_renderNodeListStack.push(&m_currentMask->GetContentRenderNodeList()); +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::EndMask() { +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (masks and render targets) AZ_Assert(m_currentMask, "Calling EndMask while not defining a mask"); if (m_currentMask) { @@ -618,12 +687,14 @@ namespace LyShine m_renderNodeListStack.top()->push_back(newMaskRenderNode); } } +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::BeginRenderToTexture(int renderTargetHandle, SDepthTexture* renderTargetDepthSurface, const AZ::Vector2& viewportTopLeft, const AZ::Vector2& viewportSize, const AZ::Color& clearColor) { +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (masks and render targets) // this uses pool allocator RenderTargetRenderNode* renderTargetRenderNode = new RenderTargetRenderNode( m_currentRenderTarget, renderTargetHandle, renderTargetDepthSurface, @@ -632,11 +703,19 @@ namespace LyShine m_currentRenderTarget = renderTargetRenderNode; m_renderNodeListStack.push(&m_currentRenderTarget->GetChildRenderNodeList()); m_renderTargetNestLevel++; +#else + AZ_UNUSED(clearColor); + AZ_UNUSED(viewportSize); + AZ_UNUSED(viewportTopLeft); + AZ_UNUSED(renderTargetDepthSurface); + AZ_UNUSED(renderTargetHandle); +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::EndRenderToTexture() { +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (masks and render targets) AZ_Assert(m_currentRenderTarget, "Calling EndRenderToTexture while not defining a render target node"); if (m_currentRenderTarget) { @@ -650,9 +729,9 @@ namespace LyShine m_renderNodeListStack.pop(); m_renderTargetNestLevel--; } +#endif } - //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::AddPrimitive( IRenderer::DynUiPrimitive* primitive, ITexture* texture, @@ -660,6 +739,19 @@ namespace LyShine bool isTextureSRGB, bool isTexturePremultipliedAlpha, BlendMode blendMode) + { + // LYSHINE_ATOM_TODO - this function will be removed when all IRenderer references are gone from UI components + AZ_UNUSED(primitive); + AZ_UNUSED(texture); + AZ_UNUSED(isClampTextureMode); + AZ_UNUSED(isTextureSRGB); + AZ_UNUSED(isTexturePremultipliedAlpha); + AZ_UNUSED(blendMode); + } + + //////////////////////////////////////////////////////////////////////////////////////////////////// + void RenderGraph::AddPrimitiveAtom(IRenderer::DynUiPrimitive* primitive, const AZ::Data::Instance& texture, + bool isClampTextureMode, bool isTextureSRGB, bool isTexturePremultipliedAlpha, BlendMode blendMode) { AZStd::vector* renderNodeList = m_renderNodeListStack.top(); @@ -735,6 +827,7 @@ namespace LyShine ITexture* texture, ITexture* maskTexture, bool isClampTextureMode, bool isTextureSRGB, bool isTexturePremultipliedAlpha, BlendMode blendMode) { +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (masks and render targets) AZStd::vector* renderNodeList = m_renderNodeListStack.top(); int texUnit0 = -1; @@ -808,6 +901,15 @@ namespace LyShine // add this primitive to the render node renderNodeToAddTo->AddPrimitive(primitive); } +#else + AZ_UNUSED(primitive); + AZ_UNUSED(texture); + AZ_UNUSED(maskTexture); + AZ_UNUSED(isClampTextureMode); + AZ_UNUSED(isTextureSRGB); + AZ_UNUSED(isTexturePremultipliedAlpha); + AZ_UNUSED(blendMode); +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -892,8 +994,12 @@ namespace LyShine //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::Render(UiRenderer* uiRenderer, const AZ::Vector2& viewportSize) { + // LYSHINE_ATOM_TODO - will probably need to support this when converting UI Editor to use Atom + AZ_UNUSED(viewportSize); + // First render the render targets, they are sorted so that more deeply nested ones are rendered first. +#ifdef LYSHINE_ATOM_TODO // keeping this code for reference for future phase (render targets) // They only need to be rendered the first time that a render graph is rendered after it has been built. // Though there is a special case, if this is the first time a shader variant has been used it can miss // the first render. So to be safe we only stop rendering to render targets after we have rendered to @@ -922,19 +1028,27 @@ namespace LyShine m_renderToRenderTargetCount = 0; } } +#else + for (RenderNode* renderNode : m_renderTargetRenderNodes) + { + renderNode->Render(uiRenderer); + } +#endif +#ifdef LYSHINE_ATOM_TODO // keeping this code for reference for future phase (UI Editor) // Set2DMode defines the viewport so we set it to canvas viewport here (the render target render nodes // above will have set the viewport as they needed). TransformationMatrices backupMatrices; gEnv->pRenderer->Set2DMode(static_cast(viewportSize.GetX()), static_cast(viewportSize.GetY()), backupMatrices); - +#endif for (RenderNode* renderNode : m_renderNodes) { renderNode->Render(uiRenderer); } - +#ifdef LYSHINE_ATOM_TODO // keeping this code for reference for future phase (UI Editor) // end the 2D mode gEnv->pRenderer->Unset2DMode(backupMatrices); +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1034,6 +1148,11 @@ namespace LyShine //////////////////////////////////////////////////////////////////////////////////////////////////// void RenderGraph::GetDebugInfoRenderNodeList(const AZStd::vector& renderNodeList, LyShineDebug::DebugInfoRenderGraph& info, AZStd::set& uniqueTextures) const { + AZ_UNUSED(renderNodeList); + AZ_UNUSED(info); + AZ_UNUSED(uniqueTextures); + +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (convert debug info to use Atom) const PrimitiveListRenderNode* prevPrimListNode = nullptr; bool isFirstNode = true; bool wasLastNodeAMask = false; @@ -1118,6 +1237,7 @@ namespace LyShine isFirstNode = false; } +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1172,6 +1292,13 @@ namespace LyShine void* context, const AZStd::string& indent) const { + AZ_UNUSED(renderNodeList); + AZ_UNUSED(fileHandle); + AZ_UNUSED(reportInfo); + AZ_UNUSED(context); + AZ_UNUSED(indent); + +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (convert debug info to use Atom) AZStd::string logLine; bool previousNodeAlreadyCounted = false; @@ -1334,6 +1461,7 @@ namespace LyShine prevPrimListNode = primListRenderNode; } } +#endif } #endif diff --git a/Gems/LyShine/Code/Source/RenderGraph.h b/Gems/LyShine/Code/Source/RenderGraph.h index 94363af19b..f9d16cf8b7 100644 --- a/Gems/LyShine/Code/Source/RenderGraph.h +++ b/Gems/LyShine/Code/Source/RenderGraph.h @@ -20,6 +20,9 @@ #include #include +#include +#include + #ifndef _RELEASE #include "LyShineDebug.h" #endif @@ -69,8 +72,8 @@ namespace LyShine // We use a pool allocator to keep these allocations fast. AZ_CLASS_ALLOCATOR(PrimitiveListRenderNode, AZ::PoolAllocator, 0); - PrimitiveListRenderNode(ITexture* texture, bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, int blendModeState); - PrimitiveListRenderNode(ITexture* texture, ITexture* maskTexture, + PrimitiveListRenderNode(const AZ::Data::Instance& texture, bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, int blendModeState); + PrimitiveListRenderNode(const AZ::Data::Instance& texture, const AZ::Data::Instance& maskTexture, bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, AlphaMaskType alphaMaskType, int blendModeState); ~PrimitiveListRenderNode() override; void Render(UiRenderer* uiRenderer) override; @@ -78,9 +81,9 @@ namespace LyShine void AddPrimitive(IRenderer::DynUiPrimitive* primitive); IRenderer::DynUiPrimitiveList& GetPrimitives() const; - int GetOrAddTexture(ITexture* texture, bool isClampTextureMode); + int GetOrAddTexture(const AZ::Data::Instance& texture, bool isClampTextureMode); int GetNumTextures() const { return m_numTextures; } - ITexture* GetTexture(int texIndex) const { return m_textures[texIndex].m_texture; } + const AZ::Data::Instance GetTexture(int texIndex) const { return m_textures[texIndex].m_texture; } bool GetTextureIsClampMode(int texIndex) const { return m_textures[texIndex].m_isClampTextureMode; } bool GetIsTextureSRGB() const { return m_isTextureSRGB; } @@ -91,7 +94,7 @@ namespace LyShine bool HasSpaceToAddPrimitive(IRenderer::DynUiPrimitive* primitive) const; // Search to see if this texture is already used by this texture unit, returns -1 if not used - int FindTexture(ITexture* texture, bool isClampTextureMode) const; + int FindTexture(const AZ::Data::Instance& texture, bool isClampTextureMode) const; #ifndef _RELEASE // A debug-only function useful for debugging @@ -104,8 +107,8 @@ namespace LyShine private: // types struct TextureUsage { - ITexture* m_texture; - bool m_isClampTextureMode; + AZ::Data::Instance m_texture; + bool m_isClampTextureMode; }; private: // data @@ -266,7 +269,11 @@ namespace LyShine void PopAlphaFade() override; float GetAlphaFade() const override; // ~IRenderGraph - + + // LYSHINE_ATOM_TODO - this can be renamed back to AddPrimitive after removal of IRenderer from all UI components + void AddPrimitiveAtom(IRenderer::DynUiPrimitive* primitive, const AZ::Data::Instance& texture, + bool isClampTextureMode, bool isTextureSRGB, bool isTexturePremultipliedAlpha, BlendMode blendMode); + //! Render the display graph void Render(UiRenderer* uiRenderer, const AZ::Vector2& viewportSize); diff --git a/Gems/LyShine/Code/Source/Sprite.cpp b/Gems/LyShine/Code/Source/Sprite.cpp index 121c9a9c42..a52724e952 100644 --- a/Gems/LyShine/Code/Source/Sprite.cpp +++ b/Gems/LyShine/Code/Source/Sprite.cpp @@ -16,8 +16,13 @@ #include #include #include +#include #include +#include +#include +#include + namespace { const char* const spriteExtension = "sprite"; @@ -32,11 +37,11 @@ namespace }; const int numAllowedSpriteTextureExtensions = AZ_ARRAY_SIZE(allowedSpriteTextureExtensions); - bool IsValidSpriteTextureExtension(const char* extension) + bool IsValidSpriteTextureExtension(const AZStd::string& extension) { for (int i = 0; i < numAllowedSpriteTextureExtensions; ++i) { - if (strcmp(extension, allowedSpriteTextureExtensions[i]) == 0) + if (extension.compare(allowedSpriteTextureExtensions[i]) == 0) { return true; } @@ -45,16 +50,56 @@ namespace return false; } - bool ReplaceSpriteExtensionWithTextureExtension(const string& spritePath, string& texturePath) + // Check if a file exists. This does not go through the AssetCatalog so that it can identify files that exist but aren't processed yet, + // and so that it will work before the AssetCatalog has loaded + bool CheckIfFileExists(const AZStd::string& sourceRelativePath, const AZStd::string& cacheRelativePath) + { + // If the file exists, it has already been processed and does not need to be modified + bool fileExists = AZ::IO::FileIOBase::GetInstance()->Exists(cacheRelativePath.c_str()); + + if (!fileExists) + { + // If the texture doesn't exist check if it's queued or being compiled. + AzFramework::AssetSystem::AssetStatus status; + AzFramework::AssetSystemRequestBus::BroadcastResult(status, &AzFramework::AssetSystemRequestBus::Events::GetAssetStatus, sourceRelativePath); + + switch (status) + { + case AzFramework::AssetSystem::AssetStatus_Queued: + case AzFramework::AssetSystem::AssetStatus_Compiling: + case AzFramework::AssetSystem::AssetStatus_Compiled: + case AzFramework::AssetSystem::AssetStatus_Failed: + { + // The file is queued, in progress, or finished processing after the initial FileIO check + fileExists = true; + break; + } + case AzFramework::AssetSystem::AssetStatus_Unknown: + case AzFramework::AssetSystem::AssetStatus_Missing: + default: + { + // The file does not exist + fileExists = false; + break; + } + } + } + + return fileExists; + } + + bool ReplaceSpriteExtensionWithTextureExtension(const AZStd::string& spritePath, AZStd::string& texturePath) { - string testPath; for (int i = 0; i < numAllowedSpriteTextureExtensions; ++i) { - testPath = PathUtil::ReplaceExtension(spritePath, allowedSpriteTextureExtensions[i]); - AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); - if (fileIO && fileIO->Exists(testPath.c_str())) + AZStd::string sourceRelativePath(spritePath); + AzFramework::StringFunc::Path::ReplaceExtension(sourceRelativePath, allowedSpriteTextureExtensions[i]); + AZStd::string cacheRelativePath = sourceRelativePath + ".streamingimage"; + + bool textureExists = CheckIfFileExists(sourceRelativePath, cacheRelativePath); + if (textureExists) { - texturePath = testPath; + texturePath = sourceRelativePath; return true; } } @@ -62,41 +107,42 @@ namespace return false; } - bool GetAssetPaths(const string& pathname, string& spritePath, string& texturePath) + bool GetAssetPaths(const AZStd::string& pathname, AZStd::string& spritePath, AZStd::string& texturePath) { // the input string could be in any form. So make it normalized // NOTE: it should not be a full path at this point. If called from the UI editor it will // have been transformed to a game path. If being called with a hard coded path it should be a // game path already - it is not good for code to be using full paths. - AZStd::string assetPath(pathname.c_str()); + AZStd::string assetPath(pathname); EBUS_EVENT(AzFramework::ApplicationRequests::Bus, NormalizePath, assetPath); - string gamePath = assetPath.c_str(); // check the extension and work out the pathname of the sprite file and the texture file // currently it works if the input path is either a sprite file or a texture file - const char* extension = PathUtil::GetExt(gamePath.c_str()); + AZStd::string extension; + AzFramework::StringFunc::Path::GetExtension(assetPath.c_str(), extension, false); - if (strcmp(extension, spriteExtension) == 0) + if (extension.compare(spriteExtension) == 0) { - spritePath = gamePath; + spritePath = assetPath; // look for a texture file with the same name if (!ReplaceSpriteExtensionWithTextureExtension(spritePath, texturePath)) { gEnv->pSystem->Warning(VALIDATOR_MODULE_SHINE, VALIDATOR_WARNING, VALIDATOR_FLAG_FILE | VALIDATOR_FLAG_TEXTURE, - gamePath.c_str(), "No texture file found for sprite: %s, no sprite will be used", gamePath.c_str()); + assetPath.c_str(), "No texture file found for sprite: %s, no sprite will be used", assetPath.c_str()); return false; } } else if (IsValidSpriteTextureExtension(extension)) { - texturePath = gamePath; - spritePath = PathUtil::ReplaceExtension(gamePath, spriteExtension); + texturePath = assetPath; + spritePath = assetPath; + AzFramework::StringFunc::Path::ReplaceExtension(spritePath, spriteExtension); } else { gEnv->pSystem->Warning(VALIDATOR_MODULE_SHINE, VALIDATOR_WARNING, VALIDATOR_FLAG_FILE | VALIDATOR_FLAG_TEXTURE, - gamePath.c_str(), "Invalid file extension for sprite: %s, no sprite will be used", gamePath.c_str()); + assetPath.c_str(), "Invalid file extension for sprite: %s, no sprite will be used", assetPath.c_str()); return false; } @@ -335,6 +381,7 @@ bool CSprite::AreCellBordersZeroWidth(int cellIndex) const //////////////////////////////////////////////////////////////////////////////////////////////////// AZ::Vector2 CSprite::GetSize() { +#ifdef LYSHINE_ATOM_TODO // Convert texture atlases to use Atom ITexture* texture = GetTexture(); if (texture) { @@ -348,6 +395,17 @@ AZ::Vector2 CSprite::GetSize() { return AZ::Vector2(0.0f, 0.0f); } +#else + if (m_image) + { + AZ::RHI::Size size = m_image->GetRHIImage()->GetDescriptor().m_size; + return AZ::Vector2(size.m_width, size.m_height); + } + else + { + return AZ::Vector2(0.0f, 0.0f); + } +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -540,7 +598,7 @@ void CSprite::OnAtlasLoaded(const TextureAtlasNamespace::TextureAtlas* atlas) { m_atlas = atlas; // Release the non-atlas version of the texture - ReleaseTexture(m_texture); + ReleaseImage(m_image); NotifyChanged(); } } @@ -561,7 +619,7 @@ void CSprite::OnAtlasUnloaded(const TextureAtlasNamespace::TextureAtlas* atlas) { // No replacement atlas found // load the texture file - LoadTexture(m_texturePathname, m_pathname, m_texture); + LoadImage(m_texturePathname.c_str(), m_image); } } NotifyChanged(); @@ -605,9 +663,9 @@ void CSprite::Shutdown() //////////////////////////////////////////////////////////////////////////////////////////////////// CSprite* CSprite::LoadSprite(const string& pathname) { - string spritePath; - string texturePath; - bool validAssetPaths = GetAssetPaths(pathname, spritePath, texturePath); + AZStd::string spritePath; + AZStd::string texturePath; + bool validAssetPaths = GetAssetPaths(pathname.c_str(), spritePath, texturePath); if (!validAssetPaths) { @@ -615,7 +673,7 @@ CSprite* CSprite::LoadSprite(const string& pathname) } // test if the sprite is already loaded, if so return loaded sprite - auto result = s_loadedSprites->find(spritePath); + auto result = s_loadedSprites->find(spritePath.c_str()); CSprite* loadedSprite = (result == s_loadedSprites->end()) ? nullptr : result->second; if (loadedSprite) @@ -629,6 +687,7 @@ CSprite* CSprite::LoadSprite(const string& pathname) TextureAtlasNamespace::TextureAtlas* atlas = nullptr; TextureAtlasNamespace::AtlasCoordinates atlasCoordinates; TextureAtlasNamespace::TextureAtlasRequestBus::BroadcastResult(atlas, &TextureAtlasNamespace::TextureAtlasRequests::FindAtlasContainingImage, texturePath.c_str()); + AZ::Data::Instance image; if (atlas) { atlasCoordinates = atlas->GetAtlasCoordinates(texturePath.c_str()); @@ -636,7 +695,7 @@ CSprite* CSprite::LoadSprite(const string& pathname) else { // load the texture file - if (!LoadTexture(texturePath, spritePath, texture)) + if (!LoadImage(texturePath, image)) { return nullptr; } @@ -645,9 +704,9 @@ CSprite* CSprite::LoadSprite(const string& pathname) // create Sprite object CSprite* sprite = new CSprite; - sprite->m_texture = texture; - sprite->m_pathname = spritePath; - sprite->m_texturePathname = texturePath; + sprite->m_image = image; + sprite->m_pathname = spritePath.c_str(); + sprite->m_texturePathname = texturePath.c_str(); sprite->m_atlas = atlas; sprite->m_atlasCoordinates = atlasCoordinates; @@ -700,9 +759,9 @@ CSprite* CSprite::CreateSprite(const string& renderTargetName) //////////////////////////////////////////////////////////////////////////////////////////////////// bool CSprite::DoesSpriteTextureAssetExist(const AZStd::string& pathname) { - string spritePath; - string texturePath; - bool validAssetPaths = GetAssetPaths(pathname.c_str(), spritePath, texturePath); + AZStd::string spritePath; + AZStd::string texturePath; + bool validAssetPaths = GetAssetPaths(pathname, spritePath, texturePath); if (!validAssetPaths) { @@ -710,7 +769,7 @@ bool CSprite::DoesSpriteTextureAssetExist(const AZStd::string& pathname) } // Check if the sprite is already loaded - auto result = s_loadedSprites->find(spritePath); + auto result = s_loadedSprites->find(spritePath.c_str()); CSprite* loadedSprite = (result == s_loadedSprites->end()) ? nullptr : result->second; if (loadedSprite) { @@ -727,14 +786,9 @@ bool CSprite::DoesSpriteTextureAssetExist(const AZStd::string& pathname) } // Check if the texture asset exists - string ddsTexturePath = PathUtil::ReplaceExtension(texturePath, ".dds"); - AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); - if (fileIO && fileIO->Exists(ddsTexturePath.c_str())) - { - return true; - } - - return false; + AZStd::string cacheRelativePath = texturePath + ".streamingimage"; + bool textureExists = CheckIfFileExists(texturePath, cacheRelativePath); + return textureExists; } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -793,6 +847,74 @@ void CSprite::ReleaseTexture(ITexture*& texture) } } +//////////////////////////////////////////////////////////////////////////////////////////////////// +bool CSprite::LoadImage(const AZStd::string& nameTex, AZ::Data::Instance& image) +{ + AZStd::string sourceRelativePath(nameTex); + AZStd::string cacheRelativePath = sourceRelativePath + ".streamingimage"; + bool textureExists = CheckIfFileExists(sourceRelativePath, cacheRelativePath); + + if (!textureExists) + { + // LyShine allows passing in a .dds extension even when the actual source file + // is differnt like a .tif. For the product file, we need the correct source extension + // prepended to the .streamingimage extension. So if the file doesn't exist and the + // extension passed in is .dds then try replacing it with .tif + // LYSHINE_ATOM_TODO - to remove this conversion we will have to update tge existing + // .dds references in Lua scripts, prefabs etc. + AZStd::string extension; + AzFramework::StringFunc::Path::GetExtension(nameTex.c_str(), extension, false); + if (extension == "dds") + { + sourceRelativePath = nameTex; + + static const char* textureExtensions[] = { "png", "tif", "tiff", "tga", "jpg", "jpeg", "bmp", "gif" }; + + for (const char* extensionReplacement : textureExtensions) + { + AzFramework::StringFunc::Path::ReplaceExtension(sourceRelativePath, extensionReplacement); + cacheRelativePath = sourceRelativePath + ".streamingimage"; + + textureExists = CheckIfFileExists(sourceRelativePath, cacheRelativePath); + if (textureExists) + { + break; + } + } + } + } + + if (!textureExists) + { + AZ_Error("CSprite", false, "Attempted to load '%s', but it does not exist.", nameTex.c_str()); + return false; + } + + // The file may not be in the AssetCatalog at this point if it is still processing or doesn't exist on disk. + // Use GenerateAssetIdTEMP instead of GetAssetIdByPath so that it will return a valid AssetId anyways + AZ::Data::AssetId streamingImageAssetId; + AZ::Data::AssetCatalogRequestBus::BroadcastResult( + streamingImageAssetId, &AZ::Data::AssetCatalogRequestBus::Events::GenerateAssetIdTEMP, + sourceRelativePath.c_str()); + streamingImageAssetId.m_subId = AZ::RPI::StreamingImageAsset::GetImageAssetSubId(); + + auto streamingImageAsset = AZ::Data::AssetManager::Instance().FindOrCreateAsset(streamingImageAssetId, AZ::Data::AssetLoadBehavior::PreLoad); + image = AZ::RPI::StreamingImage::FindOrCreate(streamingImageAsset); + if (!image) + { + AZ_Error("CSprite", false, "Failed to find or create an image instance from image asset '%s'", streamingImageAsset.GetHint().c_str()); + return false; + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +void CSprite::ReleaseImage(AZ::Data::Instance& image) +{ + image.reset(); +} + //////////////////////////////////////////////////////////////////////////////////////////////////// bool CSprite::CellIndexWithinRange(int cellIndex) const { diff --git a/Gems/LyShine/Code/Source/Sprite.h b/Gems/LyShine/Code/Source/Sprite.h index 4763c5acdd..ab4586da44 100644 --- a/Gems/LyShine/Code/Source/Sprite.h +++ b/Gems/LyShine/Code/Source/Sprite.h @@ -19,6 +19,9 @@ #include "TextureAtlas/TextureAtlasBus.h" #include "TextureAtlas/TextureAtlasNotificationBus.h" +#include +#include + //////////////////////////////////////////////////////////////////////////////////////////////////// class CSprite : public ISprite @@ -68,6 +71,8 @@ public: // member functions // ~TextureAtlasNotifications + AZ::Data::Instance GetImage() { return m_image; } + public: // static member functions static void Initialize(); @@ -83,6 +88,9 @@ private: static bool LoadTexture(const string& texturePathname, const string& pathname, ITexture*& texture); static void ReleaseTexture(ITexture*& texture); + static bool LoadImage(const AZStd::string& nameTex, AZ::Data::Instance& image); + static void ReleaseImage(AZ::Data::Instance& image); + protected: // member functions bool CellIndexWithinRange(int cellIndex) const; @@ -105,6 +113,7 @@ private: // data string m_texturePathname; Borders m_borders; ITexture* m_texture; + AZ::Data::Instance m_image; int m_numSpriteSheetCellTags; //!< Number of Cell child-tags in sprite XML; unfortunately needed to help with serialization. //! Texture atlas data diff --git a/Gems/LyShine/Code/Source/UiImageComponent.cpp b/Gems/LyShine/Code/Source/UiImageComponent.cpp index ab5cb9dd93..b5b407c421 100644 --- a/Gems/LyShine/Code/Source/UiImageComponent.cpp +++ b/Gems/LyShine/Code/Source/UiImageComponent.cpp @@ -37,6 +37,8 @@ #include "Sprite.h" #include "UiLayoutHelpers.h" +#include "RenderGraph.h" + namespace { //! Given a sprite with a cell index, populates the UV/ST coords array for traditional (stretched) 9-sliced image types. @@ -372,6 +374,7 @@ void UiImageComponent::Render(LyShine::IRenderGraph* renderGraph) ImageType imageType = m_imageType; +#ifdef LYSHINE_ATOM_TODO // support default white texture // if there is no texture we will just use a white texture and want to stretch it const bool spriteOrTextureIsNull = sprite == nullptr || sprite->GetTexture() == nullptr; @@ -394,6 +397,12 @@ void UiImageComponent::Render(LyShine::IRenderGraph* renderGraph) { imageType = ImageType::Stretched; } +#else + if (sprite == nullptr) + { + imageType = ImageType::Stretched; + } +#endif switch (imageType) { @@ -454,12 +463,33 @@ void UiImageComponent::Render(LyShine::IRenderGraph* renderGraph) } } +#ifdef LYSHINE_ATOM_TODO // keeping this code for future phase (masks and render targets) ITexture* texture = (sprite) ? sprite->GetTexture() : nullptr; bool isClampTextureMode = m_imageType == ImageType::Tiled ? false : true; bool isTextureSRGB = IsSpriteTypeRenderTarget() && m_isRenderTargetSRGB; bool isTexturePremultipliedAlpha = false; // we are not rendering from a render target with alpha in it renderGraph->AddPrimitive(&m_cachedPrimitive, texture, isClampTextureMode, isTextureSRGB, isTexturePremultipliedAlpha, m_blendMode); +#else + AZ::Data::Instance image; + if (sprite) + { + CSprite* cSprite = static_cast(sprite); // LYSHINE_ATOM_TODO - find a different solution from downcasting + if (cSprite) + { + image = cSprite->GetImage(); + } + } + bool isClampTextureMode = m_imageType == ImageType::Tiled ? false : true; + bool isTextureSRGB = IsSpriteTypeRenderTarget() && m_isRenderTargetSRGB; + bool isTexturePremultipliedAlpha = false; // we are not rendering from a render target with alpha in it + + LyShine::RenderGraph* lyRenderGraph = static_cast(renderGraph); // LYSHINE_ATOM_TODO - find a different solution from downcasting + if (lyRenderGraph) + { + lyRenderGraph->AddPrimitiveAtom(&m_cachedPrimitive, image, isClampTextureMode, isTextureSRGB, isTexturePremultipliedAlpha, m_blendMode); + } +#endif } } diff --git a/Gems/LyShine/Code/Source/UiRenderer.cpp b/Gems/LyShine/Code/Source/UiRenderer.cpp index 62bee06bf2..31c6ffc99f 100644 --- a/Gems/LyShine/Code/Source/UiRenderer.cpp +++ b/Gems/LyShine/Code/Source/UiRenderer.cpp @@ -12,6 +12,17 @@ #include "LyShine_precompiled.h" #include "UiRenderer.h" +#include +#include +#include +#include +#include +#include +#include // LYSHINE_ATOM_TODO - remove when GS_DEPTHFUNC_LEQUAL reference is removed with LyShine render target Atom conversion + +#include +#include + #include //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -23,16 +34,81 @@ UiRenderer::UiRenderer() : m_baseState(GS_DEPTHFUNC_LEQUAL) , m_stencilRef(0) { + AZ::Render::Bootstrap::NotificationBus::Handler::BusConnect(); } //////////////////////////////////////////////////////////////////////////////////////////////////// UiRenderer::~UiRenderer() { + AZ::Render::Bootstrap::NotificationBus::Handler::BusDisconnect(); + + m_dynamicDraw = nullptr; +} + +bool UiRenderer::IsReady() +{ + return m_isReady; +} + +void UiRenderer::OnBootstrapSceneReady([[maybe_unused]] AZ::RPI::Scene* bootstrapScene) +{ + // Create a dynamic draw context for UI Canvas drawing + AZ::RPI::Scene* scene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene().get(); + m_dynamicDraw = AZ::RPI::DynamicDrawInterface::Get()->CreateDynamicDrawContext(scene); + + // Load the UI shader + const char* uiShaderFilepath = "Shaders/LyShineUI.azshader"; + AZ::Data::Instance uiShader = AZ::RPI::LoadShader(uiShaderFilepath); + + // Initialize the dynamic draw context + m_dynamicDraw->InitShader(uiShader); + m_dynamicDraw->InitVertexFormat( + { { "POSITION", AZ::RHI::Format::R32G32_FLOAT }, + { "COLOR", AZ::RHI::Format::B8G8R8A8_UNORM }, + { "TEXCOORD", AZ::RHI::Format::R32G32_FLOAT }, + { "BLENDINDICES", AZ::RHI::Format::R16G16_UINT } } + ); + + m_dynamicDraw->EndInit(); + + // Cache shader data such as input indices for later use + CacheShaderData(uiShader); + + m_isReady = true; +} + +void UiRenderer::CacheShaderData(const AZ::Data::Instance shader) +{ + // Cache draw srg input indices + static const char textureIndexName[] = "m_texture"; + static const char worldToProjIndexName[] = "m_worldToProj"; + static const char isClampIndexName[] = "m_isClamp"; + AZ::Data::Instance drawSrg = m_dynamicDraw->NewDrawSrg(); + const AZ::RHI::ShaderResourceGroupLayout* layout = drawSrg->GetAsset()->GetLayout(); + m_uiShaderData.m_imageInputIndex = layout->FindShaderInputImageIndex(AZ::Name(textureIndexName)); + AZ_Error(LogName, m_uiShaderData.m_imageInputIndex.IsValid(), "Failed to find shader input constant %s.", + textureIndexName); + m_uiShaderData.m_viewProjInputIndex = layout->FindShaderInputConstantIndex(AZ::Name(worldToProjIndexName)); + AZ_Error(LogName, m_uiShaderData.m_viewProjInputIndex.IsValid(), "Failed to find shader input constant %s.", + worldToProjIndexName); + m_uiShaderData.m_isClampInputIndex = layout->FindShaderInputConstantIndex(AZ::Name(isClampIndexName)); + AZ_Error(LogName, m_uiShaderData.m_isClampInputIndex.IsValid(), "Failed to find shader input constant %s.", + isClampIndexName); + + // Cache shader variants that will be used + // LYSHINE_ATOM_TODO - more variants will be used in future phase (masks/render target support) + AZ::RPI::ShaderOptionList shaderOptionsDefault; + shaderOptionsDefault.push_back(AZ::RPI::ShaderOption(AZ::Name("o_preMultiplyAlpha"), AZ::Name("false"))); + shaderOptionsDefault.push_back(AZ::RPI::ShaderOption(AZ::Name("o_alphaTest"), AZ::Name("false"))); + shaderOptionsDefault.push_back(AZ::RPI::ShaderOption(AZ::Name("o_srgbWrite"), AZ::Name("true"))); + shaderOptionsDefault.push_back(AZ::RPI::ShaderOption(AZ::Name("o_modulate"), AZ::Name("Modulate::None"))); + m_uiShaderData.m_shaderVariantDefault = m_dynamicDraw->UseShaderVariant(shaderOptionsDefault); } //////////////////////////////////////////////////////////////////////////////////////////////////// void UiRenderer::BeginUiFrameRender() { +#ifdef LYSHINE_ATOM_TODO m_renderer = gEnv->pRenderer; // we are rendering at the end of the frame, after tone mapping, so we should be writing sRGB values @@ -43,6 +119,7 @@ void UiRenderer::BeginUiFrameRender() { m_texturesUsedInFrame.clear(); } +#endif #endif // Various platform drivers expect all texture slots used in the shader to be bound @@ -60,6 +137,7 @@ void UiRenderer::EndUiFrameRender() //////////////////////////////////////////////////////////////////////////////////////////////////// void UiRenderer::BeginCanvasRender() { +#ifdef LYSHINE_ATOM_TODO m_baseState = GS_NODEPTHTEST; m_stencilRef = 0; @@ -70,6 +148,7 @@ void UiRenderer::BeginCanvasRender() renderer->SetCullMode(R_CULL_DISABLE); renderer->SetColorOp(eCO_MODULATE, eCO_MODULATE, DEF_TEXARG0, DEF_TEXARG0); renderer->SetState(GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA | GS_NODEPTHTEST); +#endif } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -77,6 +156,51 @@ void UiRenderer::EndCanvasRender() { } +//////////////////////////////////////////////////////////////////////////////////////////////////// +AZ::RHI::Ptr UiRenderer::GetDynamicDrawContext() +{ + return m_dynamicDraw; +} + +const UiRenderer::UiShaderData& UiRenderer::GetUiShaderData() +{ + return m_uiShaderData; +} + +AZ::Matrix4x4 UiRenderer::GetModelViewProjectionMatrix() +{ + auto viewContextManager = AZ::Interface::Get(); + auto viewportContext = viewContextManager->GetViewportContextByName(viewContextManager->GetDefaultViewportContextName()); + auto windowContext = viewportContext->GetWindowContext(); + + const AZ::RHI::Viewport& viewport = windowContext->GetViewport(); + const float viewX = viewport.m_minX; + const float viewY = viewport.m_minY; + const float viewWidth = viewport.m_maxX - viewport.m_minX; + const float viewHeight = viewport.m_maxY - viewport.m_minY; + const float zf = viewport.m_minZ; + const float zn = viewport.m_maxZ; + + AZ::Matrix4x4 modelViewProjMat; + AZ::MakeOrthographicMatrixRH(modelViewProjMat, viewX, viewX + viewWidth, viewY + viewHeight, viewY, zn, zf); + + return modelViewProjMat; +} + +AZ::Vector2 UiRenderer::GetViewportSize() +{ + auto viewContextManager = AZ::Interface::Get(); + auto viewportContext = viewContextManager->GetViewportContextByName(viewContextManager->GetDefaultViewportContextName()); + auto windowContext = viewportContext->GetWindowContext(); + + const AZ::RHI::Viewport& viewport = windowContext->GetViewport(); + const float viewX = viewport.m_minX; + const float viewY = viewport.m_minY; + const float viewWidth = viewport.m_maxX - viewport.m_minX; + const float viewHeight = viewport.m_maxY - viewport.m_minY; + return AZ::Vector2(viewWidth, viewHeight); +} + //////////////////////////////////////////////////////////////////////////////////////////////////// int UiRenderer::GetBaseState() { @@ -113,6 +237,7 @@ void UiRenderer::DecrementStencilRef() --m_stencilRef; } +#ifdef LYSHINE_ATOM_TODO //////////////////////////////////////////////////////////////////////////////////////////////////// void UiRenderer::SetTexture(ITexture* texture, int texUnit, bool clamp) { @@ -134,10 +259,13 @@ void UiRenderer::SetTexture(ITexture* texture, int texUnit, bool clamp) } #endif } +#endif + //////////////////////////////////////////////////////////////////////////////////////////////////// void UiRenderer::BindNullTexture() { +#ifdef LYSHINE_ATOM_TODO // Bind the global white texture for all the texture units we use const int MaxTextures = 16; int whiteTexId = m_renderer->GetWhiteTextureId(); @@ -145,6 +273,7 @@ void UiRenderer::BindNullTexture() { m_renderer->SetTexture(whiteTexId, texUnit); } +#endif } #ifndef _RELEASE @@ -160,6 +289,7 @@ void UiRenderer::DebugDisplayTextureData(int recordingOption) { if (recordingOption > 0) { +#ifdef LYSHINE_ATOM_TODO // compute the total area of all the textures, also create a vector that we can sort by area AZStd::vector textures; int totalArea = 0; @@ -241,6 +371,7 @@ void UiRenderer::DebugDisplayTextureData(int recordingOption) } draw2d->EndDraw2d(); +#endif } } diff --git a/Gems/LyShine/Code/Source/UiRenderer.h b/Gems/LyShine/Code/Source/UiRenderer.h index 2599034c41..6a0205af4e 100644 --- a/Gems/LyShine/Code/Source/UiRenderer.h +++ b/Gems/LyShine/Code/Source/UiRenderer.h @@ -11,23 +11,46 @@ */ #pragma once -#include +#include +#include +#include +#include #ifndef _RELEASE #include #endif //////////////////////////////////////////////////////////////////////////////////////////////////// -//! Implementation of IUiRenderInterface +//! UI render interface // class UiRenderer + : public AZ::Render::Bootstrap::NotificationBus::Handler { +public: // types + + // Cached shader data + struct UiShaderData + { + AZ::RHI::ShaderInputImageIndex m_imageInputIndex; + AZ::RHI::ShaderInputSamplerIndex m_samplerInputIndex; + AZ::RHI::ShaderInputConstantIndex m_viewProjInputIndex; + AZ::RHI::ShaderInputConstantIndex m_isClampInputIndex; + + AZ::RPI::ShaderVariantId m_shaderVariantDefault; + + AZ::RPI::ShaderVariantKey m_shaderVariantKeyFallback; + AZ::RPI::ShaderVariantStableId m_defaultVariantStableId; + }; + public: // member functions //! Constructor, constructed by the LyShine class UiRenderer(); ~UiRenderer(); + //! Returns whether RPI has loaded all its assets and is ready to render + bool IsReady(); + //! Start the rendering of the frame for LyShine void BeginUiFrameRender(); @@ -40,6 +63,18 @@ public: // member functions //! End the rendering of a UI canvas void EndCanvasRender(); + //! Return the dynamic draw context used for LyShine + AZ::RHI::Ptr GetDynamicDrawContext(); + + //! Return the shader data for the ui shader + const UiShaderData& GetUiShaderData(); + + //! Return the current orthographic view matrix + AZ::Matrix4x4 GetModelViewProjectionMatrix(); + + //! Return the curent viewport size + AZ::Vector2 GetViewportSize(); + //! Get the current base state int GetBaseState(); @@ -58,9 +93,6 @@ public: // member functions //! Decrement the current stencil reference value void DecrementStencilRef(); - //! Set the current texture - void SetTexture(ITexture* texture, int texUnit, bool clamp); - #ifndef _RELEASE //! Setup to record debug texture data before rendering void DebugSetRecordingOptionForTextureData(int recordingOption); @@ -69,21 +101,36 @@ public: // member functions void DebugDisplayTextureData(int recordingOption); #endif -private: +private: // member functions AZ_DISABLE_COPY_MOVE(UiRenderer); + // AZ::Render::Bootstrap::Notification + void OnBootstrapSceneReady(AZ::RPI::Scene* bootstrapScene) override; + // ~AZ::Render::Bootstrap::Notification + //! Bind the global white texture for all the texture units we use void BindNullTexture(); + + //! Store shader data for later use + void CacheShaderData(const AZ::Data::Instance shader); protected: // attributes - int m_baseState; - uint32 m_stencilRef; - IRenderer* m_renderer = nullptr; + static constexpr char LogName[] = "UiRenderer"; + + int m_baseState; + uint32 m_stencilRef; + + UiShaderData m_uiShaderData; + AZ::RHI::Ptr m_dynamicDraw; + + bool m_isReady = false; #ifndef _RELEASE - int m_debugTextureDataRecordLevel = 0; + int m_debugTextureDataRecordLevel = 0; +#ifdef LYSHINE_ATOM_TODO // Convert debug code to Atom AZStd::unordered_set m_texturesUsedInFrame; #endif +#endif }; diff --git a/Gems/LyShine/Code/Source/UiTextComponent.cpp b/Gems/LyShine/Code/Source/UiTextComponent.cpp index 8d2bbab784..a718cc8e53 100644 --- a/Gems/LyShine/Code/Source/UiTextComponent.cpp +++ b/Gems/LyShine/Code/Source/UiTextComponent.cpp @@ -37,6 +37,9 @@ #include "UiTextComponentOffsetsSelector.h" #include "StringUtfUtils.h" #include "UiLayoutHelpers.h" +#include "RenderGraph.h" + +#include namespace { @@ -1911,11 +1914,10 @@ void UiTextComponent::Render(LyShine::IRenderGraph* renderGraph) const char* profileMarker = "UI_TEXT"; gEnv->pRenderer->PushProfileMarker(profileMarker); - int textureId = batch->m_font->GetFontTextureId(); - if (textureId != -1) + AZ::FFont* font = static_cast(batch->m_font); // LYSHINE_ATOM_TODO - find a different solution from downcasting FFont to IFont + AZ::Data::Instance fontImage = font->GetFontImage(); + if (fontImage) { - ITexture* texture = gEnv->pRenderer->EF_GetTextureByID(textureId); - // update alpha values in the verts if alpha has changed (due to fader or SetAlpha). // We never do this if any font effect used has transparency since in that case // not all of the verts will have the same alpha. We handle that case above @@ -1935,8 +1937,12 @@ void UiTextComponent::Render(LyShine::IRenderGraph* renderGraph) // because there is no padding on the left of the glyphs. bool isClampTextureMode = false; - renderGraph->AddPrimitive(&batch->m_cachedPrimitive, texture, - isClampTextureMode, isTextureSRGB, isTexturePremultipliedAlpha, blendMode); + LyShine::RenderGraph* lyRenderGraph = static_cast(renderGraph); // LYSHINE_ATOM_TODO - find a different solution from downcasting + if (lyRenderGraph) + { + lyRenderGraph->AddPrimitiveAtom(&batch->m_cachedPrimitive, fontImage, + isClampTextureMode, isTextureSRGB, isTexturePremultipliedAlpha, blendMode); + } } gEnv->pRenderer->PopProfileMarker(profileMarker); diff --git a/Gems/LyShine/Code/Source/UiTextInputComponent.cpp b/Gems/LyShine/Code/Source/UiTextInputComponent.cpp index 50c00b7a0d..ca0d3fab02 100644 --- a/Gems/LyShine/Code/Source/UiTextInputComponent.cpp +++ b/Gems/LyShine/Code/Source/UiTextInputComponent.cpp @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/Maestro/Code/CMakeLists.txt b/Gems/Maestro/Code/CMakeLists.txt index afe01e822e..bf67ee2744 100644 --- a/Gems/Maestro/Code/CMakeLists.txt +++ b/Gems/Maestro/Code/CMakeLists.txt @@ -12,7 +12,6 @@ ly_add_target( NAME Maestro.Static STATIC NAMESPACE Gem - OUTPUT_NAME Gem.Maestro.Static FILES_CMAKE maestro_static_files.cmake INCLUDE_DIRECTORIES diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp index 9056476849..1c60c23b51 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp @@ -47,9 +47,7 @@ void AnimSerializer::ReflectAnimTypes(AZ::SerializeContext* context) ->Field("TimeStep", &ICaptureKey::timeStep) ->Field("Folder", &ICaptureKey::folder) ->Field("Once", &ICaptureKey::once) - ->Field("FilePrefix", &ICaptureKey::prefix) - ->Field("Format", &ICaptureKey::format) - ->Field("BufferType", &ICaptureKey::captureBufferIndex); + ->Field("FilePrefix", &ICaptureKey::prefix); context->Class() ->Field("Animation", &ICharacterKey::m_animation) diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h index 57d085de48..d8a644e671 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h @@ -259,7 +259,7 @@ protected: SortKeys(); } }; - void Invalidate() { m_bModified = 1; }; + void Invalidate() { m_bModified = -1; }; int m_refCount; diff --git a/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp index 66fd8739a8..1a9df2baa7 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp @@ -22,28 +22,10 @@ void CCaptureTrack::SerializeKey(ICaptureKey& key, XmlNodeRef& keyNode, bool bLo if (bLoading) { const char* desc; - keyNode->getAttr("time", key.time); keyNode->getAttr("flags", key.flags); keyNode->getAttr("duration", key.duration); keyNode->getAttr("timeStep", key.timeStep); - desc = keyNode->getAttr("format"); - if (strcmp(desc, "jpg") == 0) - { - key.FormatJPG(); - } - else if (strcmp(desc, "bmp") == 0) - { - key.FormatBMP(); - } - else if (strcmp(desc, "hdr") == 0) - { - key.FormatHDR(); - } - else - { - key.FormatTGA(); - } desc = keyNode->getAttr("folder"); key.folder = desc; keyNode->getAttr("once", key.once); @@ -52,9 +34,6 @@ void CCaptureTrack::SerializeKey(ICaptureKey& key, XmlNodeRef& keyNode, bool bLo { key.prefix = desc; } - int intAttr; - keyNode->getAttr("bufferToCapture", intAttr); - key.captureBufferIndex = (intAttr < ICaptureKey::NumCaptureBufferTypes) ? static_cast(intAttr) : ICaptureKey::Color; } else { @@ -62,11 +41,9 @@ void CCaptureTrack::SerializeKey(ICaptureKey& key, XmlNodeRef& keyNode, bool bLo keyNode->setAttr("flags", key.flags); keyNode->setAttr("duration", key.duration); keyNode->setAttr("timeStep", key.timeStep); - keyNode->setAttr("format", key.GetFormat()); keyNode->setAttr("folder", key.folder.c_str()); keyNode->setAttr("once", key.once); keyNode->setAttr("prefix", key.prefix.c_str()); - keyNode->setAttr("bufferToCapture", key.captureBufferIndex); } } @@ -85,11 +62,11 @@ void CCaptureTrack::GetKeyInfo(int key, const char*& description, float& duratio description = buffer; if (!m_keys[key].folder.empty()) { - sprintf_s(buffer, "[%s] %s, %.3f, %s", prefix, m_keys[key].GetFormat(), m_keys[key].timeStep, m_keys[key].folder.c_str()); + sprintf_s(buffer, "[%s], %.3f, %s", prefix, m_keys[key].timeStep, m_keys[key].folder.c_str()); } else { - sprintf_s(buffer, "[%s] %s, %.3f", prefix, m_keys[key].GetFormat(), m_keys[key].timeStep); + sprintf_s(buffer, "[%s], %.3f", prefix, m_keys[key].timeStep); } } diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.cpp b/Gems/Maestro/Code/Source/Cinematics/Movie.cpp index 231cd25157..4e3e631e44 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.cpp @@ -217,7 +217,6 @@ CMovieSystem::CMovieSystem(ISystem* pSystem) m_fixedTimeStepBackUp = 0; m_maxStepBackUp = 0; m_smoothingBackUp = 0; - m_cvar_capture_file_format = nullptr; m_cvar_capture_frame_once = nullptr; m_cvar_capture_folder = nullptr; m_cvar_t_FixedStep = nullptr; @@ -1589,12 +1588,10 @@ void CMovieSystem::ControlCapture() assert(!bBothStartAndEnd); bool bAllCVarsReady - = m_cvar_capture_file_format && m_cvar_capture_frame_once - && m_cvar_capture_folder && m_cvar_capture_frames; + = m_cvar_capture_frame_once && m_cvar_capture_folder && m_cvar_capture_frames; if (!bAllCVarsReady) { - m_cvar_capture_file_format = gEnv->pConsole->GetCVar("capture_file_format"); m_cvar_capture_frame_once = gEnv->pConsole->GetCVar("capture_frame_once"); m_cvar_capture_folder = gEnv->pConsole->GetCVar("capture_folder"); m_cvar_capture_frames = gEnv->pConsole->GetCVar("capture_frames"); @@ -1602,7 +1599,7 @@ void CMovieSystem::ControlCapture() } bAllCVarsReady - = m_cvar_capture_file_format && m_cvar_capture_frame_once + = m_cvar_capture_frame_once && m_cvar_capture_folder && m_cvar_capture_frames && m_cvar_capture_file_prefix; assert(bAllCVarsReady); @@ -1615,7 +1612,6 @@ void CMovieSystem::ControlCapture() if (m_bStartCapture) { - m_cvar_capture_file_format->Set(m_captureKey.GetFormat()); m_cvar_capture_frame_once->Set(m_captureKey.once ? 1 : 0); m_cvar_capture_folder->Set(m_captureKey.folder.c_str()); m_cvar_capture_file_prefix->Set(m_captureKey.prefix.c_str()); diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.h b/Gems/Maestro/Code/Source/Cinematics/Movie.h index 585fafebc3..1749d3b491 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.h +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.h @@ -275,7 +275,6 @@ private: float m_maxStepBackUp; float m_smoothingBackUp; float m_maxTimeStepForMovieSystemBackUp; - ICVar* m_cvar_capture_file_format; ICVar* m_cvar_capture_frame_once; ICVar* m_cvar_capture_folder; ICVar* m_cvar_t_FixedStep; diff --git a/Gems/Microphone/3rdParty/Findlibsamplerate.cmake b/Gems/Microphone/3rdParty/Findlibsamplerate.cmake deleted file mode 100644 index 6787ec62ad..0000000000 --- a/Gems/Microphone/3rdParty/Findlibsamplerate.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -ly_add_external_target( - NAME libsamplerate - 3RDPARTY_ROOT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../External/libsamplerate - VERSION 0.1.9 - INCLUDE_DIRECTORIES include -) diff --git a/Gems/Microphone/3rdParty/Platform/Windows/libsamplerate_windows.cmake b/Gems/Microphone/3rdParty/Platform/Windows/libsamplerate_windows.cmake deleted file mode 100644 index c64d5f20b8..0000000000 --- a/Gems/Microphone/3rdParty/Platform/Windows/libsamplerate_windows.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -set(LIBSAMPLERATE_LIBS ${BASE_PATH}/lib/x64_vc140/$,Debug,Release>/libsamplerate.lib) \ No newline at end of file diff --git a/Gems/Microphone/3rdParty/Platform/Windows/libsamplerate_windows.json b/Gems/Microphone/3rdParty/Platform/Windows/libsamplerate_windows.json deleted file mode 100644 index 92ba5c928e..0000000000 --- a/Gems/Microphone/3rdParty/Platform/Windows/libsamplerate_windows.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "platform": { - "win_x64_vs2017": { - "libpath_debug": [ - "lib/x64_vc140/Debug" - ], - "libpath_profile": [ - "lib/x64_vc140/Release" - ], - "libpath_performance": [ - "lib/x64_vc140/Release" - ], - "libpath_release": [ - "lib/x64_vc140/Release" - ], - "lib": [ - "${lib_names}.lib" - ] - } - } -} diff --git a/Gems/Microphone/CMakeLists.txt b/Gems/Microphone/CMakeLists.txt index d577738051..20a680bce9 100644 --- a/Gems/Microphone/CMakeLists.txt +++ b/Gems/Microphone/CMakeLists.txt @@ -9,5 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) add_subdirectory(Code) diff --git a/Gems/Microphone/External/libsamplerate/0.1.9/COPYING b/Gems/Microphone/External/libsamplerate/0.1.9/COPYING deleted file mode 100644 index 9f82626e63..0000000000 --- a/Gems/Microphone/External/libsamplerate/0.1.9/COPYING +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2012-2016, Erik de Castro Lopo -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Gems/Microphone/External/libsamplerate/0.1.9/include/samplerate.h b/Gems/Microphone/External/libsamplerate/0.1.9/include/samplerate.h deleted file mode 100644 index ac0f2b0850..0000000000 --- a/Gems/Microphone/External/libsamplerate/0.1.9/include/samplerate.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -** Copyright (c) 2002-2016, Erik de Castro Lopo -** All rights reserved. -** -** This code is released under 2-clause BSD license. Please see the -** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING -*/ - -/* -** API documentation is available here: -** http://www.mega-nerd.com/SRC/api.html -*/ - -#ifndef SAMPLERATE_H -#define SAMPLERATE_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/* Opaque data type SRC_STATE. */ -typedef struct SRC_STATE_tag SRC_STATE ; - -/* SRC_DATA is used to pass data to src_simple() and src_process(). */ -typedef struct -{ const float *data_in ; - float *data_out ; - - long input_frames, output_frames ; - long input_frames_used, output_frames_gen ; - - int end_of_input ; - - double src_ratio ; -} SRC_DATA ; - -/* -** User supplied callback function type for use with src_callback_new() -** and src_callback_read(). First parameter is the same pointer that was -** passed into src_callback_new(). Second parameter is pointer to a -** pointer. The user supplied callback function must modify *data to -** point to the start of the user supplied float array. The user supplied -** function must return the number of frames that **data points to. -*/ - -typedef long (*src_callback_t) (void *cb_data, float **data) ; - -/* -** Standard initialisation function : return an anonymous pointer to the -** internal state of the converter. Choose a converter from the enums below. -** Error returned in *error. -*/ - -SRC_STATE* src_new (int converter_type, int channels, int *error) ; - -/* -** Initilisation for callback based API : return an anonymous pointer to the -** internal state of the converter. Choose a converter from the enums below. -** The cb_data pointer can point to any data or be set to NULL. Whatever the -** value, when processing, user supplied function "func" gets called with -** cb_data as first parameter. -*/ - -SRC_STATE* src_callback_new (src_callback_t func, int converter_type, int channels, - int *error, void* cb_data) ; - -/* -** Cleanup all internal allocations. -** Always returns NULL. -*/ - -SRC_STATE* src_delete (SRC_STATE *state) ; - -/* -** Standard processing function. -** Returns non zero on error. -*/ - -int src_process (SRC_STATE *state, SRC_DATA *data) ; - -/* -** Callback based processing function. Read up to frames worth of data from -** the converter int *data and return frames read or -1 on error. -*/ -long src_callback_read (SRC_STATE *state, double src_ratio, long frames, float *data) ; - -/* -** Simple interface for performing a single conversion from input buffer to -** output buffer at a fixed conversion ratio. -** Simple interface does not require initialisation as it can only operate on -** a single buffer worth of audio. -*/ - -int src_simple (SRC_DATA *data, int converter_type, int channels) ; - -/* -** This library contains a number of different sample rate converters, -** numbered 0 through N. -** -** Return a string giving either a name or a more full description of each -** sample rate converter or NULL if no sample rate converter exists for -** the given value. The converters are sequentially numbered from 0 to N. -*/ - -const char *src_get_name (int converter_type) ; -const char *src_get_description (int converter_type) ; -const char *src_get_version (void) ; - -/* -** Set a new SRC ratio. This allows step responses -** in the conversion ratio. -** Returns non zero on error. -*/ - -int src_set_ratio (SRC_STATE *state, double new_ratio) ; - -/* -** Get the current channel count. -** Returns negative on error, positive channel count otherwise -*/ - -int src_get_channels (SRC_STATE *state) ; - -/* -** Reset the internal SRC state. -** Does not modify the quality settings. -** Does not free any memory allocations. -** Returns non zero on error. -*/ - -int src_reset (SRC_STATE *state) ; - -/* -** Return TRUE if ratio is a valid conversion ratio, FALSE -** otherwise. -*/ - -int src_is_valid_ratio (double ratio) ; - -/* -** Return an error number. -*/ - -int src_error (SRC_STATE *state) ; - -/* -** Convert the error number into a string. -*/ -const char* src_strerror (int error) ; - -/* -** The following enums can be used to set the interpolator type -** using the function src_set_converter(). -*/ - -enum -{ - SRC_SINC_BEST_QUALITY = 0, - SRC_SINC_MEDIUM_QUALITY = 1, - SRC_SINC_FASTEST = 2, - SRC_ZERO_ORDER_HOLD = 3, - SRC_LINEAR = 4, -} ; - -/* -** Extra helper functions for converting from short to float and -** back again. -*/ - -void src_short_to_float_array (const short *in, float *out, int len) ; -void src_float_to_short_array (const float *in, short *out, int len) ; - -void src_int_to_float_array (const int *in, float *out, int len) ; -void src_float_to_int_array (const float *in, int *out, int len) ; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* SAMPLERATE_H */ - diff --git a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc120/Debug/libsamplerate.lib b/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc120/Debug/libsamplerate.lib deleted file mode 100644 index 35b4397dfe..0000000000 --- a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc120/Debug/libsamplerate.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c690bb32062f6cb30f1fd89405f0d7145c6a9cd3fac6a91b4b68a9c2767043ca -size 1559004 diff --git a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc120/Release/libsamplerate.lib b/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc120/Release/libsamplerate.lib deleted file mode 100644 index 4466c5f282..0000000000 --- a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc120/Release/libsamplerate.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce18170b3a8c63ff63150e9fc774de175bf1f87409c0a756403fc1bf9acc9c8a -size 2712958 diff --git a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc140/Debug/libsamplerate.lib b/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc140/Debug/libsamplerate.lib deleted file mode 100644 index 79417375ac..0000000000 --- a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc140/Debug/libsamplerate.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21ed7e79e3d76bca2fbfc156d2ae3056a9368fad20eb3251aaf5e54559f81231 -size 1595778 diff --git a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc140/Release/libsamplerate.lib b/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc140/Release/libsamplerate.lib deleted file mode 100644 index a968791bbf..0000000000 --- a/Gems/Microphone/External/libsamplerate/0.1.9/lib/x64_vc140/Release/libsamplerate.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e5baeaff3c7a0c203adedf303e98a4ff775f1fb591b0f04242429fe1919673b -size 1585756 diff --git a/Gems/Multiplayer/Code/CMakeLists.txt b/Gems/Multiplayer/Code/CMakeLists.txt index af9aef2591..f811ac64b3 100644 --- a/Gems/Multiplayer/Code/CMakeLists.txt +++ b/Gems/Multiplayer/Code/CMakeLists.txt @@ -36,6 +36,9 @@ ly_add_target( *.AutoPackets.xml,AutoPackets_Source.jinja,$path/$fileprefix.AutoPackets.cpp *.AutoPackets.xml,AutoPacketDispatcher_Header.jinja,$path/$fileprefix.AutoPacketDispatcher.h *.AutoPackets.xml,AutoPacketDispatcher_Inline.jinja,$path/$fileprefix.AutoPacketDispatcher.inl + *.AutoComponent.xml,AutoComponent_Header.jinja,$path/$fileprefix.AutoComponent.h + *.AutoComponent.xml,AutoComponent_Source.jinja,$path/$fileprefix.AutoComponent.cpp + *.AutoComponent.xml,AutoComponentTypes_Header.jinja,$path/AutoComponentTypes.h ) ly_add_target( diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Header.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Header.jinja new file mode 100644 index 0000000000..6332b5c8fe --- /dev/null +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Header.jinja @@ -0,0 +1,13 @@ +#pragma once + +{% set Namespace = dataFiles[0].attrib['Namespace'] %} +namespace {{ Namespace }} +{ + enum class ComponentTypes + { +{% for Component in dataFiles %} +{% set ComponentName = Component.attrib['Name'] %} + {{ ComponentName }}, +{% endfor %} + }; +} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja new file mode 100644 index 0000000000..fd73c103e6 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja @@ -0,0 +1,306 @@ +{% macro UpperFirst(text) %}{{ text[0] | upper}}{{ text[1:] }}{% endmacro %} +{% macro LowerFirst(text) %}{{ text[0] | lower}}{{ text[1:] }}{% endmacro %} +{# + +#} +{%- macro ParseRpcParams(property, outNames, outTypes, outDefines, use_default_value=False) -%} +{%- for Param in property.iter('Param') -%} +{%- do outNames.append(Param.attrib['Name']) -%} +{%- do outTypes.append(Param.attrib['Type']) -%} +{%- if use_default_value and Param.attrib['DefaultValue'] -%} +{%- do outDefines.append('const ' ~ Param.attrib['Type'] ~ '& ' + Param.attrib['Name'] + ' = ' + Param.attrib['DefaultValue']) -%} +{%- else -%} +{%- do outDefines.append('const ' ~ Param.attrib['Type'] ~ '& ' ~ Param.attrib['Name']) -%} +{%- endif -%} +{%- endfor -%} +{%- endmacro -%} +{# + +#} +{%- macro ParseIncludes(Component) -%} +{%- for Include in Component.iter('Include') -%} +{{ caller(Include) -}} +{%- endfor -%} +{%- endmacro -%} +{# + +#} +{%- macro ParseNetworkInputs(Component) -%} +{%- for NetworkInput in Component.iter('NetworkInput') -%} +{{ caller(NetworkInput) -}} +{%- endfor -%} +{%- endmacro -%} +{# + +#} +{%- macro ParseArchetypeProperties(Component) -%} +{%- for ArchetypeProperty in Component.iter('ArchetypeProperty') -%} +{{ caller(ArchetypeProperty) -}} +{%- endfor -%} +{%- endmacro -%} +{# + +#} +{%- macro ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) -%} +{%- for NetworkProperty in Component.iter('NetworkProperty') -%} +{%- if NetworkProperty.attrib['ReplicateFrom'] == ReplicateFrom and NetworkProperty.attrib['ReplicateTo'] == ReplicateTo -%} +{{ caller(NetworkProperty) -}} +{%- endif -%} +{%- endfor -%} +{%- endmacro -%} +{# + +#} +{%- macro ParseRemoteProcedures(Component, InvokeFrom, HandleOn) -%} +{%- for RemoteProcedure in Component.iter('RemoteProcedure') -%} +{%- if RemoteProcedure.attrib['InvokeFrom'] == InvokeFrom and RemoteProcedure.attrib['HandleOn'] == HandleOn -%} +{{ caller(RemoteProcedure) -}} +{%- endif -%} +{%- endfor -%} +{%- endmacro -%} +{# + +#} +{%- macro GetNetPropertiesClassName(Component, ClassType) -%} +{{ Component.attrib['Name'] }}{{ ClassType }}NetProperties +{%- endmacro -%} +{# + +#} +{%- macro GetNetPropertiesDirtyEnumName(Component, ClassType, ReplicateFrom, ReplicateTo) -%} +{{ ReplicateFrom }}To{{ ReplicateTo }}DirtyEnum +{%- endmacro -%} +{# + +#} +{%- macro GetNetPropertiesPropertyDirtyEnum(Property) -%} +{{ Property.attrib['Name'] }}_DirtyFlag +{%- endmacro -%} +{# + +#} +{%- macro GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ClassType, ReplicateFrom, ReplicateTo, Property) -%} +{{ GetNetPropertiesDirtyEnumName(Component, ClassType, ReplicateFrom, ReplicateTo) }}::{{ GetNetPropertiesPropertyDirtyEnum(Property) }} +{%- endmacro -%} +{# + +#} +{%- macro GetModelClassName(Component, ClassType) -%} +{{ Component.attrib['Name'] }}Model{{ ClassType }} +{%- endmacro -%} +{# + +#} +{%- macro GetArchetypeClassName(Entity, ClassType) -%} +{{ Entity.attrib['Name'] }}Archetype{{ ClassType }} +{%- endmacro -%} +{# + +#} +{%- macro GetNetPropertiesSetName(ReplicateFrom, ReplicateTo) -%} +{{ ReplicateFrom }}To{{ ReplicateTo }} +{%- endmacro -%} +{# + +#} +{%- macro GetModelReplicationRecordName(Component, ClassType) -%} +{{ Component.attrib['Name'] }}{{ ClassType }}ReplicationRecord +{%- endmacro -%} +{# + +#} +{%- macro GetComponentDeltaName(Component, ClassType) -%} +{{ Component.attrib['Name'] }}Delta{{ ClassType }} +{%- endmacro -%} +{# + +#} +{%- macro GetNetworkPropertyEventType(Property) -%} +AZ::Event<{{ Property.attrib['Type'] }}> +{%- endmacro -%} +{# + +#} +{%- macro GetEntityClassName(Entity, ClassType) -%} +{{ Entity.attrib['Name'] }}{{ ClassType }} +{%- endmacro -%} +{# + +#} +{%- macro GetEntityReplicatorName(Entity, ClassType) -%} +{{ Entity.attrib['Name'] }}{{ ClassType }}Replicator +{%- endmacro -%} +{# + +#} +{%- macro GetEntityReplicationRecordName(Entity) -%} +{{ Entity.attrib['Name'] }}ReplicationRecord +{%- endmacro -%} +{# + +#} +{% macro DefineNetworkPropertyReflection(Component, ReplicateFrom, ReplicateTo, ClassName) %} +{% call(Property) ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['ExposeToEditor'] | booleanTrue %} +->Field("{{ Property.attrib['Name'] }}", &{{ ClassName }}::m_{{ LowerFirst(Property.attrib['Name']) }}) +{% endif %} +{% endcall -%} +{% endmacro %} +{# + +#} +{% macro DefineArchetypePropertyReflection(Component, ClassName) %} +{% call(Property) ParseArchetypeProperties(Component) %} +{% if Property.attrib['ExposeToEditor'] | booleanTrue %} +->Field("{{ Property.attrib['Name'] }}", &{{ ClassName }}::m_{{ LowerFirst(Property.attrib['Name']) }}) +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertyConstructors(Component, ReplicateFrom, ReplicateTo, ClassType) %} +{% call(Property) ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['Container'] == 'Array' %} + , m_{{ LowerFirst(Property.attrib['Name']) }}({% if Property.attrib['IsRewindable']|booleanTrue %}Multiplayer::RewindableObject<{{ Property.attrib['Type'] }}, Multiplayer::RewindHistorySize>({% endif %}{{ Property.attrib['Init'] }}{% if Property.attrib['IsRewindable']|booleanTrue %}, this){% endif %}) +{% elif Property.attrib['Container'] == 'Vector' %} + , m_{{ LowerFirst(Property.attrib['Name']) }}({{ Property.attrib['Init'] }}) +{% elif Property.attrib['IsRewindable']|booleanTrue %} + , m_{{ LowerFirst(Property.attrib['Name']) }}({{ Property.attrib['Init'] }}, this) +{% else %} + , m_{{ LowerFirst(Property.attrib['Name']) }}({{ Property.attrib['Init'] }}) +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineArchetypePropertyConstructors(Component) %} +{% call(Property) ParseArchetypeProperties(Component) %} +{% if Property.attrib['Container'] == 'Vector' %} + , m_{{ LowerFirst(Property.attrib['Name']) }}({{ Property.attrib['Init'] }}, {{ Property.attrib['Count'] }}) +{% else %} + , m_{{ LowerFirst(Property.attrib['Name']) }}({{ Property.attrib['Init'] }}) +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro ParseComponentServiceTypeAndName(Component) %} +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] != 'Incompatible' %} +{% set Type = Service.attrib['Namespace'] + "::" + Service.attrib['Name'] %} +{% set Name = 'm_' + LowerFirst(Service.attrib['Name']) %} +{{ caller(Type, Name) -}} +{% endif %} +{% endfor %} +{% endmacro %} +{# + +#} +{%- macro GetRpcEventAccessorName(InvokeFrom, HandleOn) -%} +{{ "GetRpc" + InvokeFrom + "To" + HandleOn + "Event" }} +{% endmacro %} +{# + +#} +{% macro DeclareRpcHandler(Property, HandleOn, IsOverride) %} +{% set paramNames = [] %} +{% set paramTypes = [] %} +{% set paramDefines = [] %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +{{ ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }} +{% if IsOverride %} +void Handle{{ PropertyName }}({{ ', '.join(paramDefines) }}) override {} +{% else %} +//! {{ PropertyName }} Handler +//! {{ Property.attrib['Description'] }} +//! HandleOn {{ HandleOn }} +virtual void Handle{{ PropertyName }}({{ ', '.join(paramDefines) }}) = 0; +{% endif %} +{% endmacro %} +{# + +#} +{% macro DeclareRpcHandlers(Component, InvokeFrom, HandleOn, IsOverride) %} +{% call(Property) ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %} +{{- DeclareRpcHandler(Property, HandleOn, IsOverride) -}} +{% endcall %} +{% endmacro %} +{# + +#} +{%- macro EmitDerivedClassesComment(dataFileNames, Component, ComponentName, ComponentNameBase, ComponentDerived, ControllerName, ControllerNameBase, ControllerDerived, NetworkInputCount) -%} +{% if ComponentDerived or ControllerDerived %} +/* +/// You may use the classes below as a basis for your new derived classes. Derived classes must be marked in {{ (dataFileNames[0] | basename) }} +/// Place in your .h +#pragma once + +#include + +namespace {{ Component.attrib['Namespace'] }} +{ +{% if ComponentDerived %} + class {{ ComponentName }} + : public {{ ComponentNameBase }} + { + public: + AZ_MULTIPLAYER_COMPONENT({{ Component.attrib['Namespace'] }}::{{ ComponentName }}, s_{{ LowerFirst(ComponentName) }}ConcreteUuid, {{ Component.attrib['Namespace'] }}::{{ ComponentNameBase }}); + + static void Reflect([[maybe_unused]] AZ::ReflectContext* context); + + void OnInit() override {} + void OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} + void OnDeactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} + + {{ DeclareRpcHandlers(Component, 'Authority', 'Client', true)|indent(8) }} + }; +{% endif %} + +{% if ControllerDerived %} + class {{ ControllerName }} + : public {{ ControllerNameBase }} + { + public: + {{ ControllerName }}({{ ComponentName }}& parent) : {{ ControllerNameBase }}(parent) {} + + void OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} + void OnDeactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} +{% if NetworkInputCount > 0 %} + //! Common input processing logic for the NetworkInput. + //! @param input input structure to process + //! @param deltaTime amount of time to integrate the provided inputs over + void ProcessInput([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) override {} +{%endif %} + {{ DeclareRpcHandlers(Component, 'Server', 'Authority', true)|indent(8) }} + {{ DeclareRpcHandlers(Component, 'Client', 'Authority', true)|indent(8) }} + {{ DeclareRpcHandlers(Component, 'Autonomous', 'Authority', true)|indent(8) }} + {{ DeclareRpcHandlers(Component, 'Authority', 'Autonomous', true)|indent(8) }} + }; +{% endif %} +} +{% if ComponentDerived %} +/// Place in your .cpp +namespace {{ Component.attrib['Namespace'] }} +{ + void {{ ComponentName }}::{{ ComponentName }}::Reflect(AZ::ReflectContext* context) + { + AZ::SerializeContext* serializeContext = azrtti_cast(context); + if (serializeContext) + { + serializeContext->Class<{{ ComponentName }}, {{ ComponentNameBase }}>() + ->Version(1); + } + } +} +{% endif %} +*/ +{% else %} +// NOTE: +// No component roles have been overridden. You can modify {{ (dataFileNames[0] | basename) }} to specify derived classes for your desired network role. +// Once your modifications are complete, build the game. +// Your build will fail, but this comment will be replaced with a stub that can be used as the basis for your derived component roles. +{% endif %} +{%- endmacro -%} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja new file mode 100644 index 0000000000..d170d8b57f --- /dev/null +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja @@ -0,0 +1,479 @@ +{% import 'AutoComponent_Common.jinja' as AutoComponentMacros %} +{% macro UpperFirst(text) %}{{ text[0] | upper}}{{ text[1:] }}{% endmacro %} +{% macro LowerFirst(text) %}{{ text[0] | lower}}{{ text[1:] }}{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertyGetter(Property) %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +{% if Property.attrib['Container'] == 'Array' %} +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +void {{ PropertyName }}AddEvent(AZ::Event::Handler& handler); +{% endif %} +const AZStd::array<{% if Property.attrib['IsRewindable']|booleanTrue %}Multiplayer::RewindableObject<{% endif %}{{ Property.attrib['Type'] }}{% if Property.attrib['IsRewindable']|booleanTrue %}, Multiplayer::k_RewindHistorySize>{% endif %}, {{ Property.attrib['Count'] }}> &Get{{ PropertyName }}Array() const; +const {{ Property.attrib['Type'] }} &Get{{ PropertyName }}(int32_t index) const; +{% elif Property.attrib['Container'] == 'Vector' %} +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +void {{ PropertyName }}AddEvent(AZ::Event::Handler& handler); +void {{ PropertyName }}SizeChangedAddEvent(AZ::Event::Handler& handler); +{% endif %} +const AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}> &Get{{ PropertyName }}Vector() const; +const {{ Property.attrib['Type'] }} &Get{{ PropertyName }}(int32_t index) const; +const {{ Property.attrib['Type'] }} &{{ PropertyName }}GetBack() const; +uint32_t {{ PropertyName }}GetSize() const; +{% else %} +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +void {{ PropertyName }}AddEvent(AZ::Event<{{ Property.attrib['Type'] }}>::Handler& handler); +{% endif %} +const {{ Property.attrib['Type'] }}& Get{{ PropertyName }}() const; +{% endif %} +{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertySetter(Property) %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +{% if Property.attrib['IsPredictable'] | booleanTrue %} +{% if Property.attrib['Container'] == 'Array' %} +void Set{{ PropertyName }}(const Multiplayer::NetworkInput&, int32_t index, const {{ Property.attrib['Type'] }}& value); +{{ Property.attrib['Type'] }}& Modify{{ PropertyName }}(const Multiplayer::NetworkInput&, int32_t index); +{% elif Property.attrib['Container'] == 'Vector' %} +void Set{{ PropertyName }}(const Multiplayer::NetworkInput&, int32_t index, const {{ Property.attrib['Type'] }}& value); +{{ Property.attrib['Type'] }}& Modify{{ PropertyName }}(const Multiplayer::NetworkInput&, int32_t index); +bool {{ PropertyName }}PushBack(const Multiplayer::NetworkInput&, const {{ Property.attrib['Type'] }}& value); +bool {{ PropertyName }}PopBack(const Multiplayer::NetworkInput&); +void {{ PropertyName }}Clear(const Multiplayer::NetworkInput&); +{% elif Property.attrib['Container'] == 'Object' %} +void Set{{ PropertyName }}(const Multiplayer::NetworkInput&, const {{ Property.attrib['Type'] }}& value); +{{ Property.attrib['Type'] }}& Modify{{ PropertyName }}(const Multiplayer::NetworkInput&); +{% else %} +void Set{{ PropertyName }}(const Multiplayer::NetworkInput&, const {{ Property.attrib['Type'] }}& value); +{% endif %} +{% endif %} +{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertyGetters(Component, ReplicateFrom, ReplicateTo, IsProtected) %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +{% if Property.attrib['IsPublic'] | booleanTrue != IsProtected %} +//! {{ PropertyName }} Accessors +//! {{ Property.attrib['Description'] }}. +{{ DeclareNetworkPropertyGetter(Property) }} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareArchetypePropertyGetter(Property) %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +{% if Property.attrib['Container'] == 'Array' %} +const AZStd::array<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}>& Get{{ PropertyName }}Array() const; +const {{ Property.attrib['Type'] }}& Get{{ PropertyName }}(int32_t index) const; +{% elif Property.attrib['Container'] == 'Vector' %} +const AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}>& Get{{ PropertyName }}Vector() const; +const {{ Property.attrib['Type'] }}& Get{{ PropertyName }}(int32_t index) const; +const {{ Property.attrib['Type'] }}& {{ PropertyName }}GetBack() const; +uint32_t {{ PropertyName }}GetSize() const; +const {{ Property.attrib['Type'] }}& Get{{ PropertyName }}() const; +{% else %} +const {{ Property.attrib['Type'] }}& Get{{ PropertyName }}() const; +{% endif %} +{% endmacro %} +{# + +#} +{% macro DeclareArchetypePropertyGetters(Component) %} +{% call(Property) AutoComponentMacros.ParseArchetypeProperties(Component) %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +//! Get{{ PropertyName }} +//! {{ Property.attrib['Description'] }}. +{{ DeclareArchetypePropertyGetter(Property) }} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertyAccessors(Component, ReplicateFrom, ReplicateTo, IsProtected) %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +{% if Property.attrib['IsPublic'] | booleanTrue != IsProtected %} +//! {{ PropertyName }} Accessors +//! {{ Property.attrib['Description'] }}. +{{ DeclareNetworkPropertyGetter(Property) -}} +{{ DeclareNetworkPropertySetter(Property) }} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareRpcInvocation(Property, HandleOn) %} +{% set paramNames = [] %} +{% set paramTypes = [] %} +{% set paramDefines = [] %} +{% set PropertyName = UpperFirst(Property.attrib['Name']) %} +{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines, true) }} +//! {{ PropertyName }} Invocation +//! {{ Property.attrib['Description'] }} +//! HandleOn {{ HandleOn }} +void {{ PropertyName }}({{ ', '.join(paramDefines) }}); +{% endmacro %} +{# + +#} +{% macro DeclareRpcInvocations(Component, Section, HandleOn, ProctectedSection) %} +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, Section, HandleOn) %} +{% if Property.attrib['IsPublic']|booleanTrue == ProctectedSection %} +{{- DeclareRpcInvocation(Property, HandleOn) -}} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertyEvents(Component, ReplicateFrom, ReplicateTo) %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['Container'] == 'Array' %} +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +AZ::Event m_{{ LowerFirst(Property.attrib['Name']) }}Event; +{% endif %} +{% elif Property.attrib['Container'] == 'Vector' %} +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +AZ::Event m_{{ LowerFirst(Property.attrib['Name']) }}Event; +AZ::Event m_{{ LowerFirst(Property.attrib['Name']) }}SizeChangedEvent; +{% endif %} +{% else %} +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +AZ::Event<{{ Property.attrib['Type'] }}> m_{{ LowerFirst(Property.attrib['Name']) }}Event; +{% endif %} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertyVars(Component, ReplicateFrom, ReplicateTo) %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['Container'] == 'Array' %} +AZStd::array<{% if Property.attrib['IsRewindable']|booleanTrue %}Multiplayer::RewindableObject<{% endif %}{{ Property.attrib['Type'] }}{% if Property.attrib['IsRewindable']|booleanTrue %}, Multiplayer::RewindHistorySize>{% endif %}, {{ Property.attrib['Count'] }}> m_{{ Property.attrib['Name'] }}; +{% elif Property.attrib['Container'] == 'Vector' %} +AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}> m_{{ LowerFirst(Property.attrib['Name']) }}; +{% elif Property.attrib['IsRewindable']|booleanTrue %} +Multiplayer::RewindableObject<{{ Property.attrib['Type'] }}, Multiplayer::RewindHistorySize> m_{{ LowerFirst(Property.attrib['Name']) }} = {{ Property.attrib['Init'] }}; +{% else %} +{{ Property.attrib['Type'] }} m_{{ LowerFirst(Property.attrib['Name']) }} = {{ Property.attrib['Init'] }}; +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareArchetypePropertyVars(Component) %} +{% call(Property) AutoComponentMacros.ParseArchetypeProperties(Component) %} +{% if Property.attrib['Container'] == 'Array' %} +AZStd::array<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}> m_{{ LowerFirst(Property.attrib['Name']) }}; +{% elif Property.attrib['Container'] == 'Vector' %} +AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}> m_{{ LowerFirst(Property.attrib['Name']) }}; +{% else %} +{{ Property.attrib['Type'] }} m_{{ LowerFirst(Property.attrib['Name']) }}; +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +#pragma once + +{% for Component in dataFiles %} +{% set ComponentName = Component.attrib['Name'] %} +{% set ComponentBaseName = ComponentName %} +{% set ComponentDerived = Component.attrib['OverrideComponent']|booleanTrue %} +{% set ControllerDerived = Component.attrib['OverrideController']|booleanTrue %} +{% if ComponentDerived %} +{% set ComponentBaseName = ComponentName + "Base" %} +{% endif %} +{% set ControllerName = ComponentName + "Controller" %} +{% set ControllerBaseName = ControllerName %} +{% if ControllerDerived %} +{% set ControllerBaseName = ControllerName + "Base" %} +{% endif %} +{% set NetworkInputCount = Component.findall('NetworkInput') | len %} +{% set NetworkPropertyCount = Component.findall('NetworkProperty') | len %} +{% set RpcCount = Component.findall('RemoteProcedure') | len %} +#include "AutoComponentTypes.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +{% call(Include) AutoComponentMacros.ParseIncludes(Component) %} +#include <{{ Include.attrib['File'] }}> +{% endcall %} + +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] != 'Incompatible' %} +namespace {{ Service.attrib['Namespace'] }} +{ + class {{ Service.attrib['Name'] }}; +{% if Service.attrib['HasController']|booleanTrue %} + class {{ Service.attrib['Name'] }}Controller; +{% endif %} +} +{% endif %} +{% endfor %} + +{{ AutoComponentMacros.EmitDerivedClassesComment(dataFileNames, Component, ComponentName, ComponentBaseName, ComponentDerived, ControllerName, ControllerBaseName, ControllerDerived, NetworkInputCount) }} +namespace {{ Component.attrib['Namespace'] }} +{ + //! Forward declarations + class {{ ComponentName }}; + class {{ ControllerName }}; + + //! Returns a human readable name for the provided remoteProcedureId. + const char* GetRemoteProcedureName(uint16_t remoteProcedureId); + +{% set RecordName = ComponentName + "Record" %} + //! @class {{RecordName }} + //! @brief A record of the changed bits in the NetworkProperties for component {{ ComponentName }}. + class {{ RecordName }} + { + public: + //! AllocateRecord + //! Allocates and returns a new record. Will reserve storage in the provided ReplicationRecord. + static AZStd::unique_ptr<{{ RecordName }}> AllocateRecord(Multiplayer::ReplicationRecord& replicationRecord); + + //! CanAttachRecord + //! Returns a true if we can attach a {{ ClassType }}Record to the ReplicationRecord. + static bool CanAttachRecord(Multiplayer::ReplicationRecord& replicationRecord); + + //! AttachRecord + //! Returns a {{ ClassType }}Record that has been attached to the ReplicationRecord. This will consume bits in the provided ReplicationRecord. + static {{ RecordName }} AttachRecord(Multiplayer::ReplicationRecord& replicationRecord); + + //! SetPredictableBits + //! Sets the bits in the attached record that correspond to predictable network properties. + void SetPredictableBits(); + +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Authority', 'Client') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + AzNetworking::FixedSizeBitsetView m_authorityToClient; +{% endif %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Authority', 'Server') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + AzNetworking::FixedSizeBitsetView m_authorityToServer}; +{% endif %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Authority', 'Autonomous') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + AzNetworking::FixedSizeBitsetView m_authorityToAutonomous; +{% endif %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Autonomous', 'Authority') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + AzNetworking::FixedSizeBitsetView m_autonomousToAuthority; +{% endif %} + + private: + {{ RecordName }} + ( + Multiplayer::ReplicationRecord& replicationRecord, + uint32_t authorityToClientSimluationStartOffset, + uint32_t authorityToServerSimluationStartOffset, + uint32_t authorityToAutonomousStartOffset, + uint32_t autonomousToAuthorityStartOffset + ); + }; + +{% if NetworkInputCount > 0 %} + class NetworkInput + : public Multiplayer::IMultiplayerComponentInput + { + public: + static const Multiplayer::NetComponentId s_componentId = static_cast({{ Component.attrib['Namespace'] }}::ComponentTypes::{{ Component.attrib['Name'] }}); + Multiplayer::NetComponentId GetComponentId() const override; + INetworkInput& operator=(const INetworkInput& rhs) override; + bool Serialize(AzNetworking::ISerializer& serializer); + +{% call(Input) AutoComponentMacros.ParseNetworkInputs(Component) %} + {{ Input.attrib['Type'] }} m_{{ LowerFirst(Input.attrib['Name']) }} = {{ Input.attrib['Type'] }}({{ Input.attrib['Init'] }}); +{% endcall %} + }; + +{% endif %} + class {{ ControllerBaseName }}{% if not ControllerDerived %} final{% endif %}{{ "" }} + : public Multiplayer::MultiplayerController + { + public: + {{ ControllerBaseName }}({{ ComponentName }}& owner); + ~{{ ControllerBaseName }}() override = default; + + void NetworkAttach(Multiplayer::NetBindComponent* netBindComponent, Multiplayer::ReplicationRecord& predictableEntityRecord); + + void Activate(Multiplayer::EntityIsMigrating entityIsMigrating) override; + void Deactivate(Multiplayer::EntityIsMigrating entityIsMigrating) override; + + const {{ ComponentName }}& GetParent() const; + {{ ComponentName }}& GetParent(); + +{% if ControllerDerived %} + virtual void OnActivate(Multiplayer::EntityIsMigrating entityIsMigrating) = 0; + virtual void OnDeactivate(Multiplayer::EntityIsMigrating entityIsMigrating) = 0; + +{% endif %} + //! MultiplayerController interface + //! @{ + Multiplayer::MultiplayerController::InputPriorityOrder GetInputOrder() const override { return Multiplayer::MultiplayerController::InputPriorityOrder::Default; } + AZ::Aabb GetRewindBoundsForInput([[maybe_unused]] const NetworkInput& networkInput, [[maybe_unused]] float deltaTime) const override { return AZ::Aabb::CreateNull(); } + void CreateInput([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) override {} + void ProcessInput([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) override {} + //! @} + + {{ DeclareNetworkPropertyAccessors(Component, 'Authority', 'Server', false)|indent(8) -}} + {{ DeclareNetworkPropertyAccessors(Component, 'Authority', 'Client', false)|indent(8) -}} + {{ DeclareNetworkPropertyAccessors(Component, 'Authority', 'Autonomous', false)|indent(8) }} + {{ DeclareArchetypePropertyGetters(Component)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Server', 'Authority', false)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Server', 'Authority', true)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Client', 'Authority', false)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Client', 'Authority', true)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Autonomous', 'Authority', false)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Autonomous', 'Authority', true)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Authority', 'Autonomous', false)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Authority', 'Autonomous', true)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Authority', 'Client', false)|indent(8) }} + {{ DeclareRpcInvocations(Component, 'Authority', 'Client', true)|indent(8) }} + {{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Server', 'Authority', false)|indent(8) }} + {{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Client', 'Authority', false)|indent(8) }} + {{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Autonomous', 'Authority', false)|indent(8) }} + {{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Authority', 'Autonomous', false)|indent(8) }} +{% for Service in Component.iter('ComponentRelation') %} +{% if (Service.attrib['HasController']|booleanTrue) and (Service.attrib['Constraint'] != 'Incompatible') %} + {{ Service.attrib['Namespace'] }}::{{ Service.attrib['Name'] }}Controller* Get{{ Service.attrib['Name'] }}Controller(); +{% endif %} +{% endfor %} + }; + + static const AZ::Uuid s_{{ LowerFirst(ComponentName) }}ConcreteUuid = "{{ (ComponentName) | createHashGuid }}"; + class {{ ComponentBaseName }}{% if not ComponentDerived %} final{% endif %}{{ "" }} + : public Multiplayer::MultiplayerComponent + { + friend class {{ ControllerName }}; + friend class {{ ControllerBaseName }}; + public: +{% if ComponentDerived %} + AZ_CLASS_ALLOCATOR({{ ComponentBaseName }}, AZ::SystemAllocator, 0); + AZ_RTTI({{ ComponentBaseName }}, s_{{ LowerFirst(ComponentName) }}ConcreteUuid, AZ::Component); +{% else %} + AZ_MULTIPLAYER_COMPONENT({{ Component.attrib['Namespace'] }}::{{ ComponentBaseName }}, s_{{ LowerFirst(ComponentName) }}ConcreteUuid, Multiplayer::MultiplayerComponent); +{% endif %} + + static const Multiplayer::NetComponentId s_componentId = static_cast({{ Component.attrib['Namespace'] }}::ComponentTypes::{{ Component.attrib['Name'] }}); + + static void Reflect(AZ::ReflectContext* context); + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); + static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); + + {{ ComponentBaseName }}() = default; + ~{{ ComponentBaseName }}() override = default; + + void Init() override; + void Activate() override; + void Deactivate() override; +{% if ComponentDerived %} + virtual void OnInit() = 0; + virtual void OnActivate(Multiplayer::EntityIsMigrating entityIsMigrating) = 0; + virtual void OnDeactivate(Multiplayer::EntityIsMigrating entityIsMigrating) = 0; +{% endif %} + + {{ DeclareNetworkPropertyGetters(Component, 'Authority', 'Server', false)|indent(8) -}} + {{ DeclareNetworkPropertyGetters(Component, 'Authority', 'Client', false)|indent(8) }} + {{ DeclareArchetypePropertyGetters(Component)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Server', 'Authority', false)|indent(8) }} + + //! MultiplayerComponent interface + //! @{ + NetComponentId GetNetComponentId() const override; + bool HandleRpcMessage(Multiplayer::NetEntityRole remoteRole, Multiplayer::NetworkEntityRpcMessage& rpcMessage) override; + bool SerializeStateDeltaMessage(Multiplayer::ReplicationRecord& replicationRecord, AzNetworking::ISerializer& serializer) override; + void NotifyStateDeltaChanges(Multiplayer::ReplicationRecord& replicationRecord) override; + + protected: + bool HasController() const override; + MultiplayerController* GetController() override; + void ConstructController() override; + void DestructController() override; + void ActivateController(Multiplayer::EntityIsMigrating entityIsMigrating) override; + void DeactivateController(Multiplayer::EntityIsMigrating entityIsMigrating) override; + void NetworkAttach(Multiplayer::NetBindComponent* netBindComponent, Multiplayer::ReplicationRecord& currentEntityRecord, Multiplayer::ReplicationRecord& predictableEntityRecord) override; + //! @} + + {{ DeclareNetworkPropertyGetters(Component, 'Authority', 'Server', true)|indent(8) -}} + {{ DeclareNetworkPropertyGetters(Component, 'Authority', 'Autonomous', true)|indent(8) -}} + {{ DeclareNetworkPropertyGetters(Component, 'Autonomous', 'Authority', true)|indent(8) -}} + {{ DeclareNetworkPropertyGetters(Component, 'Authority', 'Client', true)|indent(8) -}} + {{ DeclareRpcInvocations(Component, 'Server', 'Authority', true)|indent(8) -}} + {{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Authority', 'Client', false)|indent(8) }} +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] != 'Incompatible' %} + const {{ Service.attrib['Namespace'] }}::{{ Service.attrib['Name'] }}* Get{{ Service.attrib['Name'] }}() const; + {{ Service.attrib['Namespace'] }}::{{ Service.attrib['Name'] }}* Get{{ Service.attrib['Name'] }}(); +{% endif %} +{% endfor %} + private: + //! Authority to Client serializers + bool SerializeAuthorityToClientProperties({{ RecordName }}& replicationRecord, AzNetworking::ISerializer& serializer); + void NotifyChangesAuthorityToClientProperties(const {{ RecordName }}& replicationRecord) const; + + //! Authority To Server serializers + bool SerializeAuthorityToServerProperties({{ RecordName }}& replicationRecord, AzNetworking::ISerializer& serializer); + void NotifyChangesAuthorityToServerProperties(const {{ RecordName }}& replicationRecord) const; + + //! Authority To Autonomous serializers + bool SerializeAuthorityToAutonomousProperties({{ RecordName }}& replicationRecord, AzNetworking::ISerializer& serializer); + void NotifyChangesAuthorityToAutonomousProperties(const {{ RecordName }}& replicationRecord) const; + + //! Autonomous To Authority serializers + bool SerializeAutonomousToAuthorityProperties({{ RecordName }}& replicationRecord, AzNetworking::ISerializer& serializer); + void NotifyChangesAutonomousToAuthorityProperties(const {{ RecordName }}& replicationRecord) const; + + AZStd::unique_ptr<{{ RecordName }}> m_currentRecord; + AZStd::unique_ptr<{{ ControllerName }}> m_controller; + + //! Network Properties + {{ DeclareNetworkPropertyVars(Component, 'Authority', 'Server')|indent(8) -}} + {{ DeclareNetworkPropertyVars(Component, 'Authority', 'Client')|indent(8) -}} + {{ DeclareNetworkPropertyVars(Component, 'Authority', 'Autonomous')|indent(8) -}} + {{ DeclareNetworkPropertyVars(Component, 'Autonomous', 'Authority')|indent(8) }} + //! NetworkProperty Events + {{ DeclareNetworkPropertyEvents(Component, 'Authority', 'Server')|indent(8) -}} + {{ DeclareNetworkPropertyEvents(Component, 'Authority', 'Client')|indent(8) -}} + {{ DeclareNetworkPropertyEvents(Component, 'Authority', 'Autonomous')|indent(8) -}} + {{ DeclareNetworkPropertyEvents(Component, 'Autonomous', 'Authority')|indent(8) }} + //! Archetype Properties + {{ DeclareArchetypePropertyVars(Component)|indent(8) }} +{% call(Type, Name) AutoComponentMacros.ParseComponentServiceTypeAndName(Component) %} + {{ Type }}* {{ Name }} = nullptr; +{% endcall %} + }; +} +{% endfor %} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja new file mode 100644 index 0000000000..5716896c6a --- /dev/null +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja @@ -0,0 +1,1241 @@ +{% import 'AutoComponent_Common.jinja' as AutoComponentMacros %} +{% macro UpperFirst(text) %}{{ text[0] | upper}}{{ text[1:] }}{% endmacro %} +{% macro LowerFirst(text) %}{{ text[0] | lower}}{{ text[1:] }}{% endmacro %} +{% macro DefineNetworkPropertyGet(ClassName, Property, Prefix = '') %} +{% if Property.attrib['Container'] == 'Array' %} +const AZStd::array<{% if Property.attrib['IsRewindable']|booleanTrue %}Multiplayer::RewindableObject<{% endif %}{{ Property.attrib['Type'] }}{% if Property.attrib['IsRewindable']|booleanTrue %}, Multiplayer::RewindHistorySize>{% endif %}, {{ Property.attrib['Count'] }}>& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}Array() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}; +} + +const {{ Property.attrib['Type'] }}& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}(int32_t index) const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}[index]; +} + +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}AddEvent(AZ::Event::Handler& handler) +{ + handler.Connect({{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}Event); +} + +{% endif %} +{% elif Property.attrib['Container'] == 'Vector' %} +const AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}>& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}Vector() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}; +} + +const {{ Property.attrib['Type'] }}& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}(int32_t index) const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}[index]; +} + +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}AddEvent(AZ::Event::Handler& handler) +{ + handler.Connect({{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}Event); +} + +{% endif %} +const {{ Property.attrib['Type'] }}& {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}GetBack() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}.GetBack(); +} + +uint32_t {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}GetSize() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}.GetSize(); +} + +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}SizeChangedAddEvent(AZ::Event::Handler& handler) +{ + handler.Connect({{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}SizeChangedEvent); +} + +{% endif %} +{% else %} +const {{ Property.attrib['Type'] }}& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}; +} + +{% if Property.attrib['GenerateEventBindings']|booleanTrue %} +void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}AddEvent(AZ::Event<{{ Property.attrib['Type'] }}>::Handler& handler) +{ + handler.Connect({{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}Event); +} + +{% endif %} +{% endif %} +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertyPredictableSet(Component, ReplicateFrom, ReplicateTo, ClassName, Property) %} +{% if Property.attrib['IsPredictable'] | booleanTrue %} +{% if Property.attrib['Container'] == 'Array' %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(const Multiplayer::NetworkInput& inputCommand, int32_t index, const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index] != value) + { + Modify{{ UpperFirst(Property.attrib['Name']) }}(inputCommand, index) = value; + } +} + +{{ Property.attrib['Type'] }}& {{ ClassName }}::Modify{{ UpperFirst(Property.attrib['Name']) }}(const Multiplayer::NetworkInput&, int32_t index) +{ + int32_t bitIndex = index + static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(bitIndex, true); + GetParent().MarkDirty(); + return GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index]; +} + +{% elif Property.attrib['Container'] == 'Vector' %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(const Multiplayer::NetworkInput& inputCommand, int32_t index, const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index] != value) + { + Modify{{ UpperFirst(Property.attrib['Name']) }}(inputCommand, index) = value; + } +} + +{{ Property.attrib['Type'] }}& {{ ClassName }}::Modify{{ UpperFirst(Property.attrib['Name']) }}(const Multiplayer::NetworkInput&, int32_t index) +{ + int32_t bitIndex = index + static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(bitIndex, true); + GetParent().MarkDirty(); + return GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index]; +} + +bool {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}PushBack(const Multiplayer::NetworkInput& inputCommand, const {{ Property.attrib['Type'] }} &value) +{ + int32_t indexToSet = GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.GetSize(); + GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.PushBack(value); + int32_t bitIndex = indexToSet + static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(bitIndex, true); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}), true); + GetParent().MarkDirty(); + return true; +} + +bool {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}PopBack(const Multiplayer::NetworkInput&) +{ + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}), true); + GetParent().MarkDirty(); + return GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.PopBack(); +} + +void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}Clear(const Multiplayer::NetworkInput&) +{ + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}), true); + GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.Clear(); + GetParent().MarkDirty(); +} + +{% elif Property.attrib['Container'] == 'Object' %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(const Multiplayer::NetworkInput& inputCommand, const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }} != value) + { + Modify{{ UpperFirst(Property.attrib['Name']) }}(inputCommand) = value; + } +} + +{{ Property.attrib['Type'] }}& {{ ClassName }}::Modify{{ UpperFirst(Property.attrib['Name']) }}(const Multiplayer::NetworkInput&) +{ + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property) }}), true); + GetParent().MarkDirty(); + return GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}{% if Property.attrib['IsRewindable']|booleanTrue %}.Modify(){% endif %}; +} + +{% else %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(const Multiplayer::NetworkInput&, const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }} != value) + { + GetParent().m_{{ LowerFirst(Property.attrib['Name']) }} = value; + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property) }}), true); + GetParent().MarkDirty(); + } +} + +{% endif %} +{% endif %} +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertySet(Component, ReplicateFrom, ReplicateTo, ClassName, Property) %} +{% if Property.attrib['Container'] == 'Array' %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(int32_t index, const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index] != value) + { + Modify{{ UpperFirst(Property.attrib['Name']) }}(index) = value; + } +} + +{{ Property.attrib['Type'] }}& {{ ClassName }}::Modify{{ UpperFirst(Property.attrib['Name']) }}(int32_t index) +{ + int32_t bitIndex = index + static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(bitIndex, true); + GetParent().MarkDirty(); + return static_cast<{{ Property.attrib['Type'] }}&>(GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index]{% if Property.attrib['IsRewindable']|booleanTrue %}.Modify(){% endif %}); +} + +{% elif Property.attrib['Container'] == 'Vector' %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(int32_t index, const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index] != value) + { + Modify{{ UpperFirst(Property.attrib['Name']) }}(index) = value; + } +} + +{{ Property.attrib['Type'] }}& {{ ClassName }}::Modify{{ UpperFirst(Property.attrib['Name']) }}(int32_t index) +{ + int32_t bitIndex = index + static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(bitIndex, true); + GetParent().MarkDirty(); + return static_cast<{{ Property.attrib['Type'] }}&>(GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}[index]); +} + +bool {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}PushBack(const {{ Property.attrib['Type'] }} &value) +{ + int32_t indexToSet = GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.GetSize(); + GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.PushBack(value); + int32_t bitIndex = indexToSet + static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(bitIndex, true); + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}), true); + GetParent().MarkDirty(); + return true; +} + +bool {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}PopBack() +{ + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}), true); + GetParent().MarkDirty(); + return GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.PopBack(); +} + +void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}Clear() +{ + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}), true); + GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}.Clear(); + GetParent().MarkDirty(); +} + +{% elif Property.attrib['Container'] == 'Object' %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }} != value) + { + Modify{{ UpperFirst(Property.attrib['Name']) }}() = value; + } +} + +{{ Property.attrib['Type'] }}& {{ ClassName }}::Modify{{ UpperFirst(Property.attrib['Name']) }}() +{ + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property) }}), true); + GetParent().MarkDirty(); + return static_cast<{{ Property.attrib['Type'] }}&>(GetParent().m_{{ LowerFirst(Property.attrib['Name']) }}{% if Property.attrib['IsRewindable']|booleanTrue %}.Modify(){% endif %}); +} + +{% else %} +void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(const {{ Property.attrib['Type'] }}& value) +{ + if (GetParent().m_{{ LowerFirst(Property.attrib['Name']) }} != value) + { + GetParent().m_{{ LowerFirst(Property.attrib['Name']) }} = value; + GetParent().m_currentRecord->m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ClassType, ReplicateFrom, ReplicateTo, Property) }}), true); + GetParent().MarkDirty(); + } +} + +{% endif %} +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertyGets(Component, ReplicateFrom, ReplicateTo, IsProtected, ClassName, Prefix = '') %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['IsPublic'] | booleanTrue != IsProtected %} +{{ DefineNetworkPropertyGet(ClassName, Property, Prefix) }} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertyAccessors(Component, ReplicateFrom, ReplicateTo, IsProtected, ClassName) %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['IsPublic'] | booleanTrue != IsProtected %} +{{ DefineNetworkPropertyGet(ClassName, Property, "GetParent().") }} +{{ DefineNetworkPropertyPredictableSet(ClassName, ReplicateFrom, ReplicateTo, ClassName, Property) }} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineRpcInvocation(Component, ClassName, Property, InvokeFrom, HandleOn) %} +{% set paramNames = [] %} +{% set paramTypes = [] %} +{% set paramDefines = [] %} +{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }} +void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramDefines) }}) +{ + constexpr uint8_t rpcId = static_cast(RemoteProcedure::{{ UpperFirst(Property.attrib['Name']) }}); + constexpr Multiplayer::NetComponentId componentId = static_cast({{ Component.attrib['Namespace'] }}::ComponentTypes::{{ Component.attrib['Name'] }}); +{% if Property.attrib['IsReliable']|booleanTrue %} + constexpr AzNetworking::ReliabilityType isReliable = Multiplayer::ReliabilityType::Reliable; +{% else %} + constexpr AzNetworking::ReliabilityType isReliable = Multiplayer::ReliabilityType::Unreliable; +{% endif %} + + Multiplayer::NetworkEntityRpcMessage rpcMessage(Multiplayer::RpcDeliveryType::{{ InvokeFrom }}To{{ HandleOn }}, GetNetEntityId(), componentId, rpcId, isReliable); +{% if paramNames|count > 0 %} + {{ UpperFirst(Property.attrib['Name']) }}RpcStruct rpcStruct({{ ', '.join(paramNames) }}); +{% else %} + Multiplayer::ComponentRpcEmptyStruct rpcStruct; +{% endif %} + rpcMessage.SetRpcParams(rpcStruct); + GetNetBindComponent()->{{ "GetSend" + InvokeFrom + "To" + HandleOn + "RpcEvent" }}().Signal(rpcMessage); +} +{% endmacro %} +{# + +#} +{% macro DefineRpcInvocations(Component, ClassName, InvokeFrom, HandleOn, ProctectedSection) %} +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %} +{% if Property.attrib['IsPublic']|booleanTrue == ProctectedSection %} +{{ DefineRpcInvocation(Component, ClassName, Property, InvokeFrom, HandleOn) }} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareRpcHandleCases(Component, ComponentDerived, InvokeFrom, HandleOn, ValidationFunction) %} +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %} +case RemoteProcedure::{{ UpperFirst(Property.attrib['Name']) }}: + { +{% set rpcParamList = [] %} +{% for Param in Property.iter('Param') %} +{% do rpcParamList.append("rpcStruct.m_" + LowerFirst(Param.attrib['Name']) ) %} +{% endfor %} +{% if rpcParamList|count > 0 %} + {{ UpperFirst(Property.attrib['Name']) }}RpcStruct rpcStruct; +{% else %} + Multiplayer::ComponentRpcEmptyStruct rpcStruct; +{% endif %} + const bool paramsSerialized = message.GetRpcParams(rpcStruct); + if (paramsSerialized && {{ ValidationFunction }}) + { +{% if HandleOn == 'Authority' %} + if (m_controller) + { + AZ_Assert(GetNetBindComponent()->GetNetEntityRole() == Multiplayer::NetEntityRole::Authority, "Entity proxy does not have authority"); + m_controller->Handle{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(rpcParamList) }}); + } +{% if Property.attrib['IsReliable']|booleanTrue %} +{# if the rpc is not reliable we can simply drop it, also note message reliability type is default reliable in EntityRpcMessage #} + else // Note that this rpc is marked reliable, trigger the appropriate rpc event so it can be forwarded + { + m_netBindComponent->{{ "GetSend" + InvokeFrom + "To" + HandleOn + "RpcEvent" }}().Signal(message); + } + +{% endif %} +{% elif HandleOn == 'Autonomous' %} + if (m_controller) + { + AZ_Assert(GetNetBindComponent()->GetNetEntityRole() == Multiplayer::NetEntityRole::Autonomous, "Entity proxy does not have autonomy"); + m_controller->Handle{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(rpcParamList) }}); + } +{% else %} + Handle{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(rpcParamList) }}); +{% endif %} + } + else if (paramsSerialized) + { + AZLOG_WARN("Did not handle rpc message, unexpected role (did the networkrole change?), discarding rpc type %d role %d", static_cast(rpcType), static_cast(remoteRole)); + } + return paramsSerialized; + } + break; +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineRemoteProcedureSerializables(Component, InvokeFrom, HandleOn) %} +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %} +{% set paramNames = [] %} +{% set paramTypes = [] %} +{% set paramDefines = [] %} +{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }} +{% if paramNames|count > 0 %} +struct {{ UpperFirst(Property.attrib['Name']) }}RpcStruct + : public Multiplayer::IRpcParamStruct +{ + {{ UpperFirst(Property.attrib['Name']) }}RpcStruct() + { + ; + } + +{% if paramNames|count > 0 %} + {{ UpperFirst(Property.attrib['Name']) }}RpcStruct({{ ', '.join(paramDefines) }}) +{% for paramName in paramNames %} + {% if loop.first %}:{% else %},{% endif %} m_{{ LowerFirst(paramName) }}({{ paramName }}) +{% endfor %} + { + ; + } + +{% endif %} + bool Serialize(AzNetworking::ISerializer& serializer) + { + bool ret(true); +{% for Param in Property.iter('Param') %} + ret &= serializer.Serialize(m_{{ LowerFirst(Param.attrib['Name']) }}, "{{ Param.attrib['Name'] }}"); +{% endfor %} + if (!ret) + { + AZLOG_ERROR("Failed to serialize {{ UpperFirst(Property.attrib['Name']) }}RpcStruct"); + } + return ret; + }; + +{% for Param in Property.iter('Param') %} + {{ Param.attrib['Type'] }} m_{{ LowerFirst(Param.attrib['Name']) }}; +{% endfor %} +}; +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertyDirtyEnumeration(Component, ClassType, ReplicateFrom, ReplicateTo) %} +enum class {{ AutoComponentMacros.GetNetPropertiesDirtyEnumName(Component, ClassType, ReplicateFrom, ReplicateTo) }} +{ +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['Container'] != 'None' and Property.attrib['Container'] != 'Object' %} + {{ AutoComponentMacros.GetNetPropertiesPropertyDirtyEnum(Property, "Start") }}, + {{ AutoComponentMacros.GetNetPropertiesPropertyDirtyEnum(Property, "End") }} = {{ AutoComponentMacros.GetNetPropertiesPropertyDirtyEnum(Property, "Start") }} + {{ Property.attrib['Count'] }} - 1, +{% if Property.attrib['Container'] == 'Vector' %} + {{ AutoComponentMacros.GetNetPropertiesPropertyDirtyEnum(Property, "Size") }}, +{% endif %} +{% else %} + {{ AutoComponentMacros.GetNetPropertiesPropertyDirtyEnum(Property) }}, +{% endif %} +{% endcall %} + Count, +}; +{% endmacro -%} +{# + +#} +{% macro GenerateModelReplicationRecordPredictableBits(Component, ClassType, ReplicateFrom, ReplicateTo) %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['IsPredictable'] | booleanTrue %} +{% if Property.attrib['Container'] != 'None' and Property.attrib['Container'] != 'Object' %} +{ + const uint32_t firstBit = static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ClassType, ReplicateFrom, ReplicateTo, Property, 'Start') }}); +{% if Property.attrib['Container'] == 'Vector' %} + const uint32_t lastBit = static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ClassType, ReplicateFrom, ReplicateTo, Property, 'Size') }}); +{% else %} + const uint32_t lastBit = static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ClassType, ReplicateFrom, ReplicateTo, Property, 'End') }}); +{% endif %} + + for (uint32_t i = firstBit; i <= lastBit; ++i) + { + m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast(i), true); + } +} +{% else %} +m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.SetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ClassType, ReplicateFrom, ReplicateTo, Property) }}), true); +{% endif %} +{% endif %} +{% endcall %} +{% endif %} +{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertySetSerializer(Component, ReplicateFrom, ReplicateTo, ClassName, RecordName) %} +bool {{ ClassName }}::Serialize{{ AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo) }}Properties([[maybe_unused]] {{ RecordName }}& replicationRecord, AzNetworking::ISerializer& serializer) +{ +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + // We modify the record if we are writing an update so that we don't notify for a change that really didn't change the value (just a duplicated send from the server) + [[maybe_unused]] bool modifyRecord = serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject; +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if Property.attrib['Container'] != 'None' and Property.attrib['Container'] != 'Object' %} + { + const uint32_t firstBit = static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}); +{% if Property.attrib['Container'] == 'Vector' %} + const uint32_t lastBit = static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}); +{% else %} + const uint32_t lastBit = static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'End') }}); +{% endif %} + AzNetworking::BitsetView deltaRecord(replicationRecord.m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}, firstBit, lastBit - firstBit + 1); + if (deltaRecord.AnySet()) + { +{% if Property.attrib['Container'] == 'Vector' %} + NovaNet::SerializableFixedSizeVectorDeltaStruct<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}> deltaStruct(m_{{ LowerFirst(Property.attrib['Name']) }}, deltaRecord); +{% else %} + NovaNet::SerializableFixedSizeArrayDeltaStruct<{% if Property.attrib['IsRewindable']|booleanTrue %}Multiplayer::RewindableObject<{% endif %}{{ Property.attrib['Type'] }}{% if Property.attrib['IsRewindable']|booleanTrue %}, Multiplayer::RewindHistorySize>{% endif %}, {{ Property.attrib['Count'] }}> deltaStruct(m_{{ Property.attrib['Name'] }}, deltaRecord); +{% endif %} + serializer.Serialize(deltaStruct, "{{ UpperFirst(Property.attrib['Name']) }}"); + } + } +{% else %} + Multiplayer::SerializeNetworkPropertyHelper + ( + serializer, + modifyRecord, + replicationRecord.m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}, + static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property) }}), + m_{{ LowerFirst(Property.attrib['Name']) }}, + "{{ Property.attrib['Name'] }}", + GetNetComponentId() + ); +{% endif %} +{% endcall %} +{% endif %} + return serializer.IsValid(); +} +{% endmacro %} +{# + +#} +{% macro DeclareNetworkPropertySetNotifyChanges(Component, ReplicateFrom, ReplicateTo, ClassName, RecordName) %} +void {{ ClassName }}::NotifyChanges{{ AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo) }}Properties([[maybe_unused]] const {{ RecordName }}& replicationRecord) const +{ +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if (Property.attrib['GenerateEventBindings']|booleanTrue) %} +{% if Property.attrib['Container'] != 'None' and Property.attrib['Container'] != 'Object' %} + for (uint32_t bitIndex = static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Start') }}), elementIndex = 0; bitIndex <= static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'End') }}); ++bitIndex, ++elementIndex) + { + if (replicationRecord.m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.GetBit(bitIndex){% if Property.attrib['Container'] == 'Vector' %} && elementIndex < m_{{ Property.attrib['Name'] }}.GetSize(){% endif %}) + { + m_LowerFirst( Property.attrib['Name']) }}Event.Signal(elementIndex, m_{{ LowerFirst(Property.attrib['Name']) }}[elementIndex]); + } + } +{% if Property.attrib['Container'] == 'Vector' %} + if (replicationRecord.m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.GetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property, 'Size') }}))) + { + m_{{ LowerFirst(Property.attrib['Name']) }}SizeChangedEvent.Signal(m_{{ LowerFirst(Property.attrib['Name']) }}.GetSize()); + } +{% endif %} +{% else %} + if (replicationRecord.m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}.GetBit(static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component, ReplicateFrom, ReplicateFrom, ReplicateTo, Property) }}))) + { + m_{{ LowerFirst(Property.attrib['Name']) }}Event.Signal(m_{{ LowerFirst(Property.attrib['Name']) }}); + } +{% endif %} +{% endif %} +{% endcall %} +} +{% endmacro %} +{# + +#} +{% macro DefineArchetypePropertyGet(Property, ClassType, ClassName, Prefix = '') %} +{% if ClassType == '' or Property.attrib['ExportTo'] == ClassType or Property.attrib['ExportTo'] == "Common" %} +{% if Property.attrib['Container'] == 'Array' %} +const AZStd::array<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}>& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}Array() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}; +} + +const {{ Property.attrib['Type'] }}& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}(int32_t index) const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}[index]; +} + +{% elif Property.attrib['Container'] == 'Vector' %} +const AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] }}>& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}Vector() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}; +} + +const {{ Property.attrib['Type'] }}& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}(int32_t index) const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}[index]; +} + +const {{ Property.attrib['Type'] }}& {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}GetBack() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}.GetBack(); +} + +uint32_t {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}GetSize() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}.GetSize(); +} + +{% else %} +const {{ Property.attrib['Type'] }}& {{ ClassName }}::Get{{ UpperFirst(Property.attrib['Name']) }}() const +{ + return {{ Prefix }}m_{{ LowerFirst(Property.attrib['Name']) }}; +} + +{% endif %} +{% endif %} +{% endmacro %} +{# + +#} +{% macro DefineArchetypePropertyGets(Component, ClassType, ClassName, Prefix = '') %} +{% call(Property) AutoComponentMacros.ParseArchetypeProperties(Component) %} +{{ DefineArchetypePropertyGet(Property, ClassType, ClassName, Prefix) }} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineRpcBehaviorBinderInvocations(Component, InvokeFrom, HandleOn) %} +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %} +{% if Property.attrib['IsPublic']|booleanTrue == false %} +{% set paramNames = [] %} +{% set paramTypes = [] %} +{% set paramDefines = [] %} +{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }} + void {{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramDefines) }}) + { + GetParent().{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramNames) }}); + } + +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DeclareRemoteProcedureEnumerations(Component) %} +enum class RemoteProcedure +{ + // Server to Client +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, 'Authority', 'Client') %} + {{ Property.attrib['Name'] }}, +{% endcall %} + // Server to Autonomous +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, 'Authority', 'Autonomous') %} + {{ Property.attrib['Name'] }}, +{% endcall %} + // Server to Servers +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, 'Server', 'Authority') %} + {{ Property.attrib['Name'] }}, +{% endcall %} + // Client to Servers +{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, 'Autonomous', 'Authority') %} + {{ Property.attrib['Name'] }}, +{% endcall %} + MAX +}; + +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertyBehaviorReflection(Component, ReplicateFrom, ReplicateTo, ClassType) %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if (Property.attrib['IsPublic'] | booleanTrue == true) %} +{% if Property.attrib['Container'] == 'Array' %} +->Event("Get{{ Property.attrib['Name'] }}", &{{ ClassType }}Bus::Events::Get{{ Property.attrib['Name'] }}) +{% elif Property.attrib['Container'] == 'Vector' %} +->Event("Get{{ Property.attrib['Name'] }}", &{{ ClassType }}Bus::Events::Get{{ Property.attrib['Name'] }}) +->Event("{{ Property.attrib['Name'] }}GetBack", &{{ ClassType }}Bus::Events::{{ Property.attrib['Name'] }}GetBack) +->Event("{{ Property.attrib['Name'] }}GetSize", &{{ ClassType }}Bus::Events::{{ Property.attrib['Name'] }}GetSize) +{% else %} +->Event("Get{{ Property.attrib['Name'] }}", &{{ ClassType }}Bus::Events::Get{{ Property.attrib['Name'] }}) +{% endif %} +{% endif %} +{% endcall -%} +{% endmacro %} +{# + +#} +{% macro DefineArchetypePropertyBehaviorReflection(Component, ClassType) %} +{% call(Property) AutoComponentMacros.ParseArchetypeProperties(Component) %} +{% if (Property.attrib['ExportTo'] == "Common" or Property.attrib['ExportTo'] == ClassType) %} +{% if Property.attrib['Container'] == 'Array' %} +->Event("Get{{ Property.attrib['Name'] }}", &{{ ClassType }}Bus::Events::Get{{ Property.attrib['Name'] }}) +{% elif Property.attrib['Container'] == 'Vector' %} +->Event("Get{{ Property.attrib['Name'] }}", &{{ ClassType }}Bus::Events::Get{{ Property.attrib['Name'] }}) +->Event("{{ Property.attrib['Name'] }}GetBack", &{{ ClassType }}Bus::Events::{{ Property.attrib['Name'] }}GetBack) +->Event("{{ Property.attrib['Name'] }}GetSize", &{{ ClassType }}Bus::Events::{{ Property.attrib['Name'] }}GetSize) +{% else %} +->Event("Get{{ Property.attrib['Name'] }}", &{{ ClassType }}Bus::Events::Get{{ Property.attrib['Name'] }}) +{% endif %} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro ParseComponentServiceIncludes(Component, ClassType) %} +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] != 'Incompatible' %} +{{ caller(Service.attrib['Include']) -}} +{% endif %} +{% endfor %} +{% endmacro %} +{# + +#} +{% macro ParseComponentServiceNames(Component, ClassType, ConstraintType) %} +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] == ConstraintType %} +{{ caller(Service.attrib['Name']) -}} +{% endif %} +{% endfor %} +{% endmacro %} +{# + +#} +{% macro DefineComponentServiceProxyGrabs(Component, ClassType, ComponentType) %} +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] != 'Incompatible' %} +m_{{ LowerFirst(Service.attrib['Name']) }} = FindComponent<{{ UpperFirst(Service.attrib['Namespace']) }}::{{ UpperFirst(Service.attrib['Name']) }}>(); +{% endif %} +{% endfor %} +{% endmacro %} +{# + +#} +{% macro DefineArchetypePropertyConstructors(Component, ClassType) %} +{% call(Property) AutoComponentMacros.ParseArchetypeProperties(Component) %} +{% if Property.attrib['ExportTo'] == "Common" or Property.attrib['ExportTo'] == ClassType %} +{% if Property.attrib['Container'] == 'Vector' %} +, m_{{ LowerFirst(Property.attrib['Name']) }}() +{% else %} +, m_{{ LowerFirst(Property.attrib['Name']) }}({{ Property.attrib['Init'] }}) +{% endif %} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineArchetypePropertyReflection(Component, ClassType, ClassName) %} +{% call(Property) AutoComponentMacros.ParseArchetypeProperties(Component) %} +{% if Property.attrib['ExportTo'] == ClassType or Property.attrib['ExportTo'] == "Common" %} +{% if Property.attrib['ExposeToEditor'] | booleanTrue %} +->Field("{{ Property.attrib['Name'] }}", &{{ ClassName }}::m_{{ LowerFirst(Property.attrib['Name']) }}) +{% endif %} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro DefineNetworkPropertyBehaviorBinderGets(Component, ReplicateFrom, ReplicateTo) %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} +{% if (Property.attrib['IsPublic'] | booleanTrue == true) %} +{% if Property.attrib['Container'] == 'Array' %} + {{ Property.attrib['Type'] }} Get{{ Property.attrib['Name'] }}(int32_t index) + { + return GetParent().Get{{ Property.attrib['Name'] }}(index); + } + +{% elif Property.attrib['Container'] == 'Vector' %} + {{ Property.attrib['Type'] }} Get{{ Property.attrib['Name'] }}(int32_t index) + { + return GetParent().Get{{ Property.attrib['Name'] }}(index); + } + + {{ Property.attrib['Type'] }} {{ Property.attrib['Name'] }}GetBack() + { + return GetParent().{{ Property.attrib['Name'] }}GetBack(); + } + + uint32_t {{ Property.attrib['Name'] }}GetSize() + { + return GetParent().{{ Property.attrib['Name'] }}GetSize(); + } +{% else %} + {{ Property.attrib['Type'] }} Get{{ Property.attrib['Name'] }}() + { + return GetParent().Get{{ Property.attrib['Name'] }}(); + } + +{% endif %} +{% endif %} +{% endcall %} +{% endmacro %} +{# + +#} +{% macro BehaviorContextInterfaceDefineParams(Interface) %} +{% if Interface.getchildren() | length > 0 %} +{% set comma = joiner(", ") %} +, {{ '{{' }} +{% for Param in Interface.iter('Param') %} + {{ comma() }}{"{{ Param.attrib['Name']}}", "{{ Param.attrib['Description']}}"{% if Param.attrib['DefaultValue'] %}, behaviorContext->MakeDefaultValue({{ Param.attrib['DefaultValue'] }}){% endif %}} +{% endfor %} +{{ '}}' }} +{% endif %} +{% endmacro %} +{% set includeFile = "{0}.h".format(((outputFile|basename)|splitext)[0]) %} +{% for Component in dataFiles %} +{% set ComponentName = Component.attrib['Name'] %} +{% set ComponentDerived = Component.attrib['OverrideComponent']|booleanTrue %} +{% set ControllerDerived = Component.attrib['OverrideController']|booleanTrue %} +{% if ComponentDerived %} +{% set ComponentBaseName = ComponentName + "Base" %} +{% else %} +{% set ComponentBaseName = ComponentName %} +{% endif %} +{% set ControllerName = ComponentName + "Controller" %} +{% if ControllerDerived %} +{% set ControllerBaseName = ControllerName + "Base" %} +{% else %} +{% set ControllerBaseName = ControllerName %} +{% endif %} +#include "{{ includeFile }}" +#include +#include +#include +#include +#include +#include +#include +{% if ComponentDerived or ControllerDerived %} +#include <{{ Component.attrib['OverrideInclude'] }}> +{% endif %} +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] != 'Incompatible' %} +#include <{{ Service.attrib['Include'] }}> +{% endif %} +{% endfor %} + +namespace {{ Component.attrib['Namespace'] }} +{ + {{ DeclareRemoteProcedureEnumerations(Component)|indent(4) }} + {{ DefineNetworkPropertyDirtyEnumeration(Component, ClassType, 'Authority', 'Client')|indent(4) }} + {{ DefineNetworkPropertyDirtyEnumeration(Component, ClassType, 'Authority', 'Server')|indent(4) }} + {{ DefineNetworkPropertyDirtyEnumeration(Component, ClassType, 'Authority', 'Autonomous')|indent(4) }} + {{ DefineNetworkPropertyDirtyEnumeration(Component, ClassType, 'Autonomous', 'Authority')|indent(4) }} + {{ DefineRemoteProcedureSerializables(Component, 'Server', 'Authority')|indent(4) }} + {{ DefineRemoteProcedureSerializables(Component, 'Authority', 'Client')|indent(4) }} + {{ DefineRemoteProcedureSerializables(Component, 'Authority', 'Autonomous')|indent(4) }} + {{ DefineRemoteProcedureSerializables(Component, 'Autonomous', 'Authority')|indent(4) }} +{% set RecordName = ComponentName + "Record" %} + {{ RecordName }}::{{ RecordName }} + ( + [[maybe_unused]] Multiplayer::ReplicationRecord& replicationRecord, + [[maybe_unused]] uint32_t authorityToClientStartOffset, + [[maybe_unused]] uint32_t authorityToServerStartOffset, + [[maybe_unused]] uint32_t authorityToAutonomousStartOffset, + [[maybe_unused]] uint32_t autonomousToAuthorityStartOffset + ) +{% set comma = joiner(" ,") %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Authority', 'Client') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} +{{ comma()|default(" :", true) }} m_authorityToClient(replicationRecord.m_authorityToClient, authorityToClientStartOffset, replicationRecord.ContainsAuthorityToClientBits() ? static_cast({{ AutoComponentMacros.GetNetPropertiesDirtyEnumName(Component, ClassType, 'Authority', 'Client') }}::Count) : 0) +{% endif %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Authority', 'Server') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + {{ comma()|default(" :", true) }} authorityToServer }}(replicationRecord.m_authorityToServer, authorityToServerStartOffset, replicationRecord.ContainsAuthorityToServerBits() ? static_cast({{ AutoComponentMacros.GetNetPropertiesDirtyEnumName(Component, ClassType, 'Authority', 'Server') }}::Count) : 0) +{% endif %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Authority', 'Autonomous') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + {{ comma()|default(" :", true) }} m_authorityToAutonomous(replicationRecord.m_authorityToAutonomous, authorityToAutonomousStartOffset, replicationRecord.ContainsAuthorityToAutonomousBits() ? static_cast({{ AutoComponentMacros.GetNetPropertiesDirtyEnumName(Component, ClassType, 'Authority', 'Autonomous') }}::Count) : 0) +{% endif %} +{% set networkPropertyCount = {'value' : 0} %} +{% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, 'Autonomous', 'Authority') %} +{%- if networkPropertyCount.update({'value': networkPropertyCount.value + 1}) %}{% endif -%} +{% endcall %} +{% if networkPropertyCount.value > 0 %} + {{ comma()|default(" :", true) }} m_autonomousToAuthority(replicationRecord.m_autonomousToAuthority, autonomousToAuthorityStartOffset, replicationRecord.ContainsAutonomousToAuthorityBits() ? static_cast({{ AutoComponentMacros.GetNetPropertiesDirtyEnumName(Component, ClassType, 'Autonomous', 'Authority') }}::Count) : 0) +{% endif %} + { + ; + } + + AZStd::unique_ptr<{{ RecordName }}> {{ RecordName }}::AllocateRecord(Multiplayer::ReplicationRecord& replicationRecord) + { + uint32_t authorityToClientStart = replicationRecord.m_authorityToClient.GetSize(); + replicationRecord.m_authorityToClient.Resize(authorityToClientStart + static_cast(AuthorityToClientDirtyEnum::Count)); + + uint32_t authorityToServerStart = replicationRecord.m_authorityToServer.GetSize(); + replicationRecord.m_authorityToServer.Resize(authorityToServerStart + static_cast(AuthorityToServerDirtyEnum::Count)); + + uint32_t authorityToAutonomousStart = replicationRecord.m_authorityToAutonomous.GetSize(); + replicationRecord.m_authorityToAutonomous.Resize(authorityToAutonomousStart + static_cast(AuthorityToAutonomousDirtyEnum::Count)); + + uint32_t autonomousToAuthorityStart = replicationRecord.m_autonomousToAuthority.GetSize(); + replicationRecord.m_autonomousToAuthority.Resize(autonomousToAuthorityStart + static_cast(AutonomousToAuthorityDirtyEnum::Count)); + + return AZStd::unique_ptr<{{ RecordName }}>(new {{ RecordName }}(replicationRecord, + authorityToClientStart, + authorityToServerStart, + authorityToAutonomousStart, + autonomousToAuthorityStart)); + } + + bool {{ RecordName }}::CanAttachRecord(Multiplayer::ReplicationRecord& replicationRecord) + { + bool canAttach{ true }; + canAttach &= replicationRecord.ContainsAuthorityToClientBits() ? (replicationRecord.GetRemainingAuthorityToClientBits() >= static_cast(AuthorityToClientDirtyEnum::Count)) : true; + canAttach &= replicationRecord.ContainsAuthorityToServerBits() ? (replicationRecord.GetRemainingAuthorityToServerBits() >= static_cast(AuthorityToServerDirtyEnum::Count)) : true; + canAttach &= replicationRecord.ContainsAuthorityToAutonomousBits() ? (replicationRecord.GetRemainingAuthorityToAutonomousBits() >= static_cast(AuthorityToAutonomousDirtyEnum::Count)) : true; + canAttach &= replicationRecord.ContainsAutonomousToAuthorityBits() ? (replicationRecord.GetRemainingAutonomousToAuthorityBits() >= static_cast(AutonomousToAuthorityDirtyEnum::Count)) : true; + return canAttach; + } + + {{ RecordName }} {{ RecordName }}::AttachRecord(Multiplayer::ReplicationRecord& replicationRecord) + { + uint32_t authorityToClientStart = replicationRecord.m_authorityToClientConsumedBits; + replicationRecord.ConsumeAuthorityToClientBits(static_cast(AuthorityToClientDirtyEnum::Count)); + + uint32_t authorityToServerStart = replicationRecord.m_authorityToServerConsumedBits; + replicationRecord.ConsumeAuthorityToServerBits(static_cast(AuthorityToServerDirtyEnum::Count)); + + uint32_t authorityToAutonomousStart = replicationRecord.m_authorityToAutonomousConsumedBits; + replicationRecord.ConsumeAuthorityToAutonomousBits(static_cast(AuthorityToAutonomousDirtyEnum::Count)); + + uint32_t autonomousToAuthorityStart = replicationRecord.m_autonomousToAuthorityConsumedBits; + replicationRecord.ConsumeAutonomousToAuthorityBits(static_cast(AutonomousToAuthorityDirtyEnum::Count)); + + return {{ RecordName }}(replicationRecord, + authorityToClientStart, + authorityToServerStart, + authorityToAutonomousStart, + autonomousToAuthorityStart); + } + + void {{ RecordName }}::SetPredictableBits() + { + {{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Client')|indent(8) -}} +{{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Server')|indent(8) -}} +{{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Authority', 'Autonomous')|indent(8) -}} +{{ GenerateModelReplicationRecordPredictableBits(Component, ClassType, 'Autonomous', 'Authority')|indent(8) }} + } + + {{ ControllerBaseName }}::{{ ControllerBaseName }}({{ ComponentName }}& parent) + : MultiplayerController(parent) + { + ; + } + + void {{ ControllerBaseName }}::NetworkAttach([[maybe_unused]] Multiplayer::NetBindComponent* netBindComponent, Multiplayer::ReplicationRecord& predictableEntityRecord) + { + // Setup the PredictableRecord + AZStd::unique_ptr<{{ RecordName }}> predictableRecord = {{ RecordName }}::AllocateRecord(predictableEntityRecord); + predictableRecord->SetPredictableBits(); + } + + void {{ ControllerBaseName }}::Activate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) + { +{% if ControllerDerived %} + OnActivate(entityIsMigrating); +{% endif %} + } + + void {{ ControllerBaseName }}::Deactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) + { +{% if ControllerDerived %} + OnDeactivate(entityIsMigrating); +{% endif %} + } + + const {{ ComponentName }}& {{ ControllerBaseName }}::GetParent() const + { + return static_cast(GetOwner()); + } + + {{ ComponentName }}& {{ ControllerBaseName }}::GetParent() + { + return static_cast<{{ ComponentName }}&>(GetOwner()); + } + + {{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Server', false, ControllerBaseName)|indent(4) -}} +{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Server', true, ControllerBaseName)|indent(4) -}} +{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Client', false, ControllerBaseName)|indent(4) -}} +{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Client', true, ControllerBaseName)|indent(4) -}} +{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Autonomous', false, ControllerBaseName)|indent(4) -}} +{{ DefineNetworkPropertyAccessors(Component, 'Authority', 'Autonomous', true, ControllerBaseName)|indent(4) -}} +{{ DefineNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', false, ControllerBaseName)|indent(4) -}} +{{ DefineNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', true, ControllerBaseName)|indent(4) }} + {{ DefineArchetypePropertyGets(Component, ClassType, ControllerBaseName, "GetParent().")|indent(4) -}} +{{ DefineRpcInvocations(Component, ControllerBaseName, 'Autonomous', 'Authority', false)|indent(4) -}} +{{ DefineRpcInvocations(Component, ControllerBaseName, 'Autonomous', 'Authority', true)|indent(4) -}} +{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Autonomous', false)|indent(4) -}} +{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Autonomous', true)|indent(4) -}} +{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Client', false)|indent(4) -}} +{{ DefineRpcInvocations(Component, ControllerBaseName, 'Authority', 'Client', true)|indent(4) }} +{% for Service in Component.iter('ComponentRelation') %} +{% if (Service.attrib['HasController']|booleanTrue) and (Service.attrib['Constraint'] != 'Incompatible') %} + {{ Service.attrib['Name'] }}Controller* {{ ControllerBaseName }}::Get{{ Service.attrib['Name'] }}Controller() + { + MultiplayerComponent* controllerComponent = GetParent().Get{{ Service.attrib['Name'] }}(); + return static_cast<{{ Service.attrib['Name'] }}Controller*>(controllerComponent->GetController()); + } + +{% endif %} +{% endfor %} + + void {{ ComponentBaseName }}::{{ ComponentBaseName }}::Reflect(AZ::ReflectContext* reflection) + { + AZ::SerializeContext* serializeContext = azrtti_cast(reflection); + if (serializeContext) + { + serializeContext->Class<{{ ComponentBaseName }}, MultiplayerComponent>() + ->Version(1) + {{ AutoComponentMacros.DefineNetworkPropertyReflection(Component, 'Authority', 'Server', ComponentBaseName)|indent(16) -}} +{{ AutoComponentMacros.DefineNetworkPropertyReflection(Component, 'Authority', 'Client', ComponentBaseName)|indent(16) -}} +{{ AutoComponentMacros.DefineNetworkPropertyReflection(Component, 'Authority', 'Autonomous', ComponentBaseName)|indent(16) -}} +{{ AutoComponentMacros.DefineNetworkPropertyReflection(Component, 'Autonomous', 'Authority', ComponentBaseName)|indent(16) }} + {{ DefineArchetypePropertyReflection(Component, ClassType, ComponentBaseName)|indent(16) }} + ; + } + } + + void {{ ComponentBaseName }}::{{ ComponentBaseName }}::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC_CE("{{ ComponentName }}Service")); + } + + void {{ ComponentBaseName }}::{{ ComponentBaseName }}::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(AZ_CRC_CE("NetBindService")); +{% call(ComponentService) ParseComponentServiceNames(Component, ClassType, 'Required') %} + required.push_back(AZ_CRC_CE("{{ ComponentService }}")); +{% endcall %} + } + + void {{ ComponentBaseName }}::{{ ComponentBaseName }}::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent) + { +{% call(ComponentService) ParseComponentServiceNames(Component, ClassType, 'Dependent') %} + dependent.push_back(AZ_CRC_CE("{{ ComponentService }}")); +{% endcall %} + } + + void {{ ComponentBaseName }}::{{ ComponentBaseName }}::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) + { + incompatible.push_back(AZ_CRC_CE("{{ ComponentName }}Service")); +{% call(ComponentService) ParseComponentServiceNames(Component, ClassType, 'Incompatible') %} + incompatible.push_back(AZ_CRC_CE("{{ ComponentService }}")); +{% endcall %} + } + + void {{ ComponentBaseName }}::Init() + { + {{ DefineComponentServiceProxyGrabs(Component, ClassType, ComponentName)|indent(8) }} +{% if ComponentDerived %} + OnInit(); +{% endif %} + if (m_netBindComponent->HasController()) + { + ConstructController(); + } + } + + void {{ ComponentBaseName }}::Activate() + { + Multiplayer::EntityIsMigrating isMigrating = Multiplayer::EntityIsMigrating::False;// m_netBindComponent->IsMigrationDataValid() ? Multiplayer::EntityIsMigrating::e_True : Multiplayer::EntityIsMigrating::False); +{% if ComponentDerived %} + OnActivate(isMigrating); +{% endif %} + if (m_controller != nullptr) + { + m_controller.get()->Activate(isMigrating); + } + } + + void {{ ComponentBaseName }}::Deactivate() + { + Multiplayer::EntityIsMigrating isMigrating = Multiplayer::EntityIsMigrating::False;// m_netBindComponent->IsMigrationDataValid() ? Multiplayer::EntityIsMigrating::e_True : Multiplayer::EntityIsMigrating::False); + if (m_controller != nullptr) + { + m_controller.get()->Deactivate(isMigrating); + } + m_controller = nullptr; +{% if ComponentDerived %} + OnDeactivate(isMigrating); +{% endif %} + m_currentRecord = nullptr; +{% call(Type, Name) AutoComponentMacros.ParseComponentServiceTypeAndName(Component) %} + {{ Name }} = nullptr; +{% endcall %} + } + + {{ DefineNetworkPropertyGets(Component, 'Authority', 'Server', false, ComponentBaseName)|indent(4) -}} +{{ DefineNetworkPropertyGets(Component, 'Authority', 'Autonomous', false, ComponentBaseName)|indent(4) -}} +{{ DefineNetworkPropertyGets(Component, 'Autonomous', 'Authority', false, ComponentBaseName)|indent(4) -}} +{{ DefineNetworkPropertyGets(Component, 'Authority', 'Client', false, ComponentBaseName)|indent(4) -}} +{{ DefineNetworkPropertyGets(Component, 'Authority', 'Server', true, ComponentBaseName)|indent(4) -}} +{{ DefineNetworkPropertyGets(Component, 'Authority', 'Autonomous', true, ComponentBaseName)|indent(4) -}} +{{ DefineNetworkPropertyGets(Component, 'Autonomous', 'Authority', true, ComponentBaseName)|indent(4) -}} +{{ DefineNetworkPropertyGets(Component, 'Authority', 'Client', true, ComponentBaseName)|indent(4) }} + {{ DefineArchetypePropertyGets(Component, ClassType, ComponentBaseName)|indent(4) -}} +{{ DefineRpcInvocations(Component, ComponentBaseName, 'Server', 'Authority', false)|indent(4) -}} +{{ DefineRpcInvocations(Component, ComponentBaseName, 'Server', 'Authority', true)|indent(4) }} + + Multiplayer::NetComponentId {{ ComponentBaseName }}::GetNetComponentId() const + { + return s_componentId; + } + +#pragma warning(push) +#pragma warning(disable: 4065) // switch statement contains 'default' but no 'case' labels + bool {{ ComponentBaseName }}::HandleRpcMessage([[maybe_unused]] Multiplayer::NetEntityRole remoteRole, Multiplayer::NetworkEntityRpcMessage& message) + { + const RemoteProcedure rpcType = static_cast(message.GetRpcMessageType()); + switch (rpcType) + { + {{ DeclareRpcHandleCases(Component, ComponentDerived, 'Server', 'Authority', "(remoteRole == Multiplayer::NetEntityRole::Authority || remoteRole == Multiplayer::NetEntityRole::Server)" )|indent(8) }} + {{ DeclareRpcHandleCases(Component, ComponentDerived, 'Autonomous', 'Authority', "(remoteRole == Multiplayer::NetEntityRole::Autonomous)")|indent(8) }} + {{ DeclareRpcHandleCases(Component, ComponentDerived, 'Authority', 'Client', "(remoteRole == Multiplayer::NetEntityRole::Authority || remoteRole == Multiplayer::NetEntityRole::Server)" )|indent(8) }} + {{ DeclareRpcHandleCases(Component, ComponentDerived, 'Authority', 'Autonomous', "(remoteRole == Multiplayer::NetEntityRole::Authority || remoteRole == Multiplayer::NetEntityRole::Server)" )|indent(8) }} + default: + return false; + } + AZ_Assert(0, "Got unhandled RpcType %d in {{ ComponentBaseName }}", static_cast(rpcType)); + return false; + } +#pragma warning(pop) + + bool {{ ComponentBaseName }}::SerializeStateDeltaMessage(Multiplayer::ReplicationRecord& replicationRecord, AzNetworking::ISerializer& serializer) + { + if (!{{ RecordName }}::CanAttachRecord(replicationRecord)) + { + AZ_Assert(false, "Unable to attach {{ ComponentName }}::{{ RecordName }}, out no remaining available bits in record"); + serializer.Invalidate(); + return serializer.IsValid(); + } + + {{ RecordName }} record = {{ RecordName }}::AttachRecord(replicationRecord); + + if (replicationRecord.ContainsAuthorityToClientBits()) + { + SerializeAuthorityToClientProperties(record, serializer); + } + if (replicationRecord.ContainsAuthorityToServerBits()) + { + SerializeAuthorityToServerProperties(record, serializer); + } + if (replicationRecord.ContainsAuthorityToAutonomousBits()) + { + SerializeAuthorityToAutonomousProperties(record, serializer); + } + if (replicationRecord.ContainsAutonomousToAuthorityBits()) + { + SerializeAutonomousToAuthorityProperties(record, serializer); + } + return serializer.IsValid(); + } + + void {{ ComponentBaseName }}::NotifyStateDeltaChanges(Multiplayer::ReplicationRecord& replicationRecord) + { + {{ RecordName }} record = {{ RecordName }}::AttachRecord(replicationRecord); + if (replicationRecord.ContainsAuthorityToClientBits()) + { + NotifyChangesAuthorityToClientProperties(record); + } + if (replicationRecord.ContainsAuthorityToServerBits()) + { + NotifyChangesAuthorityToServerProperties(record); + } + if (replicationRecord.ContainsAuthorityToAutonomousBits()) + { + NotifyChangesAuthorityToAutonomousProperties(record); + } + if (replicationRecord.ContainsAutonomousToAuthorityBits()) + { + NotifyChangesAutonomousToAuthorityProperties(record); + } + } + + bool {{ ComponentBaseName }}::HasController() const + { + return m_controller != nullptr; + } + + Multiplayer::MultiplayerController* {{ ComponentBaseName }}::GetController() + { + return m_controller.get(); + } + + void {{ ComponentBaseName }}::ConstructController() + { + AZ_Assert(m_controller == nullptr, "We already have a {{ ControllerName }}..."); + m_controller = AZStd::make_unique<{{ ControllerName }}>(static_cast<{{ ComponentName }}&>(*this)); + } + + void {{ ComponentBaseName }}::DestructController() + { + AZ_Assert(m_controller != nullptr, "We don't have a {{ ControllerName }}..."); + m_controller = nullptr; + } + + void {{ ComponentBaseName }}::ActivateController(Multiplayer::EntityIsMigrating entityIsMigrating) + { + m_controller.get()->Activate(entityIsMigrating); + } + + void {{ ComponentBaseName }}::DeactivateController(Multiplayer::EntityIsMigrating entityIsMigrating) + { + m_controller.get()->Deactivate(entityIsMigrating); + } + + void {{ ComponentBaseName }}::NetworkAttach(Multiplayer::NetBindComponent* netBindComponent, Multiplayer::ReplicationRecord& currentEntityRecord, Multiplayer::ReplicationRecord& predictableEntityRecord) + { + m_netBindComponent = netBindComponent; + + // Setup the CurrentRecord + if (m_currentRecord == nullptr) + { + m_currentRecord = {{ RecordName }}::AllocateRecord(currentEntityRecord); + } + m_controller.get()->NetworkAttach(netBindComponent, predictableEntityRecord); + } + + {{ DeclareNetworkPropertySetSerializer(Component, 'Authority', 'Client', ComponentBaseName, RecordName)|indent(4) }} + {{ DeclareNetworkPropertySetNotifyChanges(Component, 'Authority', 'Client', ComponentBaseName, RecordName)|indent(4) }} + {{ DeclareNetworkPropertySetSerializer(Component, 'Authority', 'Server', ComponentBaseName, RecordName)|indent(4) }} + {{ DeclareNetworkPropertySetNotifyChanges(Component, 'Authority', 'Server', ComponentBaseName, RecordName)|indent(4) }} + {{ DeclareNetworkPropertySetSerializer(Component, 'Authority', 'Autonomous', ComponentBaseName, RecordName)|indent(4) }} + {{ DeclareNetworkPropertySetNotifyChanges(Component, 'Authority', 'Autonomous', ComponentBaseName, RecordName)|indent(4) }} + {{ DeclareNetworkPropertySetSerializer(Component, 'Autonomous', 'Authority', ComponentBaseName, RecordName)|indent(4) }} + {{ DeclareNetworkPropertySetNotifyChanges(Component, 'Autonomous', 'Authority', ComponentBaseName, RecordName)|indent(4) }} + +{% for Service in Component.iter('ComponentRelation') %} +{% if Service.attrib['Constraint'] != 'Incompatible' %} + const {{ UpperFirst(Service.attrib['Namespace']) }}::{{ UpperFirst(Service.attrib['Name']) }}* {{ ComponentBaseName }}::Get{{ UpperFirst(Service.attrib['Name']) }}() const + { + return m_{{ LowerFirst(Service.attrib['Name']) }}; + } + + {{ UpperFirst(Service.attrib['Namespace']) }}::{{ UpperFirst(Service.attrib['Name']) }}* {{ ComponentBaseName }}::Get{{ UpperFirst(Service.attrib['Name']) }}() + { + return m_{{ LowerFirst(Service.attrib['Name']) }}; + } + +{% endif %} +{% endfor %} +} +{% endfor %} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml b/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml index 5ca64f2f3a..e5549e90d6 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml +++ b/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml @@ -52,6 +52,5 @@ - diff --git a/Gems/Multiplayer/Code/Source/AutoGen/NetworkTransformComponent.AutoComponent.xml b/Gems/Multiplayer/Code/Source/AutoGen/NetworkTransformComponent.AutoComponent.xml new file mode 100644 index 0000000000..cb18ca72fc --- /dev/null +++ b/Gems/Multiplayer/Code/Source/AutoGen/NetworkTransformComponent.AutoComponent.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp index 6fa919af96..3a4d6439ae 100644 --- a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.cpp @@ -58,4 +58,13 @@ namespace Multiplayer NetBindComponent* netBindComponent = GetNetBindComponent(); return netBindComponent ? netBindComponent->GetEntityHandle() : NetworkEntityHandle(); } + + void MultiplayerComponent::MarkDirty() + { + NetBindComponent* netBindComponent = GetNetBindComponent(); + if (netBindComponent != nullptr) + { + netBindComponent->MarkDirty(); + } + } } diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h index 41229cf98d..70f76c73be 100644 --- a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h @@ -14,14 +14,15 @@ #include #include +#include #include #include //! Macro to declare bindings for a multiplayer component inheriting from MultiplayerComponent -#define AZ_MULTIPLAYER_COMPONENT(ComponentClass, Guid) \ - AZ_RTTI(ComponentClass, Guid, AZ::Component) \ - AZ_COMPONENT_INTRUSIVE_DESCRIPTOR_TYPE(ComponentClass) \ - AZ_COMPONENT_BASE(ComponentClass, Guid, Multiplayer::MultiplayerComponent) +#define AZ_MULTIPLAYER_COMPONENT(ComponentClass, Guid, Base) \ + AZ_RTTI(ComponentClass, Guid, AZ::Component) \ + AZ_COMPONENT_INTRUSIVE_DESCRIPTOR_TYPE(ComponentClass) \ + AZ_COMPONENT_BASE(ComponentClass, Guid, Base) namespace Multiplayer { @@ -50,7 +51,7 @@ namespace Multiplayer NetBindComponent* GetNetBindComponent(); //! @} - //! Linearly searches the components attached to the entity and returns the requested component. . + //! Linearly searches the components attached to the entity and returns the requested component. //! @return the requested component, or nullptr if the component does not exist on the entity //! @{ template @@ -62,25 +63,22 @@ namespace Multiplayer NetEntityId GetNetEntityId() const; ConstNetworkEntityHandle GetEntityHandle() const; NetworkEntityHandle GetEntityHandle(); + void MarkDirty(); virtual NetComponentId GetNetComponentId() const = 0; virtual bool HandleRpcMessage(NetEntityRole netEntityRole, NetworkEntityRpcMessage& rpcMessage) = 0; - virtual bool SerializeStateDeltaMessage(ReplicationRecord& replicationRecord, AzNetworking::ISerializer& serializer, ComponentSerializationType componentSerializationType) = 0; - virtual void NotifyStateDeltaChanges(ReplicationRecord& replicationRecord, ComponentSerializationType componentSerializationType) = 0; + virtual bool SerializeStateDeltaMessage(ReplicationRecord& replicationRecord, AzNetworking::ISerializer& serializer) = 0; + virtual void NotifyStateDeltaChanges(ReplicationRecord& replicationRecord) = 0; protected: - virtual bool HasController() const = 0; virtual MultiplayerController* GetController() = 0; - - virtual bool Migrate(AzNetworking::ISerializer& serializer) = 0; virtual void ConstructController() = 0; virtual void DestructController() = 0; virtual void ActivateController(EntityIsMigrating entityIsMigrating) = 0; virtual void DeactivateController(EntityIsMigrating entityIsMigrating) = 0; - virtual void NetworkAttach(NetBindComponent& netBindComponent, ReplicationRecord& currentEntityRecord, ReplicationRecord& predictableEntityRecord) = 0; - virtual void NetworkDetach() = 0; + virtual void NetworkAttach(NetBindComponent* netBindComponent, ReplicationRecord& currentEntityRecord, ReplicationRecord& predictableEntityRecord) = 0; mutable NetBindComponent* m_netBindComponent = nullptr; @@ -100,4 +98,42 @@ namespace Multiplayer { return GetEntity()->FindComponent(); } + + template + inline void SerializeNetworkPropertyHelper + ( + AzNetworking::ISerializer& serializer, + bool modifyRecord, + AzNetworking::FixedSizeBitsetView& bitset, + int32_t bitIndex, + TYPE& value, + const char* name, + [[maybe_unused]] NetComponentId componentId + ) + { + if (bitset.GetBit(bitIndex)) + { + //uint32_t prevUpdateSize = serializer.GetSize(); + serializer.ClearTrackedChangesFlag(); + serializer.Serialize(value, name); + if (modifyRecord && !serializer.GetTrackedChangesFlag()) + { + bitset.SetBit(bitIndex, false); + } + //uint32_t postUpdateSize = serializer.GetSize(); + // Network Property metrics + // uint32_t updateSize = (postUpdateSize - prevUpdateSize); + // if (updateSize > 0) + // { + // if (serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject) + // { + // GetPacketHandlerMetricsInstance().LogRecvNetworkPropertyUpdates(componentType, name, updateSize); + // } + // else + // { + // GetPacketHandlerMetricsInstance().LogSentNetworkPropertyUpdates(componentType, name, updateSize); + // } + // } + } + } } diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerController.cpp b/Gems/Multiplayer/Code/Source/Components/MultiplayerController.cpp index 0ba4b1bc07..97746c3f6c 100644 --- a/Gems/Multiplayer/Code/Source/Components/MultiplayerController.cpp +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerController.cpp @@ -52,10 +52,19 @@ namespace Multiplayer return m_owner.GetNetBindComponent(); } + const MultiplayerComponent& MultiplayerController::GetOwner() const + { + return m_owner; + } + + MultiplayerComponent& MultiplayerController::GetOwner() + { + return m_owner; + } + bool MultiplayerController::IsProcessingInput() const { - //return m_owner.GetNetBindComponent()->IsProcessingInput(); - return false; + return GetNetBindComponent()->IsProcessingInput(); } MultiplayerController* MultiplayerController::FindController(const AZ::Uuid& typeId, const NetworkEntityHandle& entityHandle) const diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerController.h b/Gems/Multiplayer/Code/Source/Components/MultiplayerController.h index ed58342c17..3495893812 100644 --- a/Gems/Multiplayer/Code/Source/Components/MultiplayerController.h +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerController.h @@ -13,6 +13,7 @@ #pragma once #include +#include namespace Multiplayer { @@ -36,6 +37,12 @@ namespace Multiplayer MultiplayerController(MultiplayerComponent& owner); virtual ~MultiplayerController() = default; + //! Activates the controller. + virtual void Activate(EntityIsMigrating entityIsMigrating) = 0; + + //! Deactivates the controller. + virtual void Deactivate(EntityIsMigrating entityIsMigrating) = 0; + //! Returns the networkId for the entity that owns this controller. //! @return the networkId for the entity that owns this controller NetEntityId GetNetEntityId() const; @@ -54,8 +61,18 @@ namespace Multiplayer protected: + //! Returns the NetBindComponent responsible for net binding for this controller + //! @{ const NetBindComponent* GetNetBindComponent() const; NetBindComponent* GetNetBindComponent(); + //! @} + + //! Returns the MultiplayerComponent that owns this controller instance. + //! @return the MultiplayerComponent that owns this controller instance + //! @{ + const MultiplayerComponent& GetOwner() const; + MultiplayerComponent& GetOwner(); + //! @} //! Returns true if the owning entity is currently inside ProcessInput scope. bool IsProcessingInput() const; @@ -63,11 +80,11 @@ namespace Multiplayer //! Returns the input priority ordering for determining the order of ProcessInput or CreateInput functions. virtual InputPriorityOrder GetInputOrder() const = 0; - //! Hints the rewind system how close an entity should be in order to rewind, this can be very important for performance at scale. + //! Queries the rewind system to determine what volume is relevent for a given input, this is very important for performance at scale. //! @param networkInput input structure to process //! @param deltaTime amount of time the provided input would be integrated over - //! @return the maximum distance an entity should be for this component to interact with it given the provided input - virtual float GetRewindDistanceForInput(const NetworkInput& networkInput, float deltaTime) const = 0; + //! @return a world-space aabb representing the volume relevent to the provided input + virtual AZ::Aabb GetRewindBoundsForInput(const NetworkInput& networkInput, float deltaTime) const = 0; //! Base execution for ProcessInput packet, do not call directly. //! @param networkInput input structure to process diff --git a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp index e9be709e9b..57c3071178 100644 --- a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp +++ b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp @@ -75,9 +75,9 @@ namespace Multiplayer void NetBindComponent::Activate() { m_needsToBeStopped = true; - if (m_netEntityRole == NetEntityRole::ServerAuthority) + if (m_netEntityRole == NetEntityRole::Authority) { - m_handleLocalServerRpcMessageEventHandle.Connect(m_sendServerSimulationtoServerAuthorityRpcEvent); + m_handleLocalServerRpcMessageEventHandle.Connect(m_sendServertoAuthorityRpcEvent); } if (NetworkRoleHasController(m_netEntityRole)) { @@ -98,7 +98,6 @@ namespace Multiplayer { GetNetworkEntityManager()->NotifyControllersDeactivated(m_netEntityHandle, EntityIsMigrating::False); } - NetworkDetach(); } NetEntityRole NetBindComponent::GetNetEntityRole() const @@ -108,13 +107,13 @@ namespace Multiplayer bool NetBindComponent::IsAuthority() const { - return (m_netEntityRole == NetEntityRole::ServerAuthority); + return (m_netEntityRole == NetEntityRole::Authority); } bool NetBindComponent::HasController() const { - return (m_netEntityRole == NetEntityRole::ServerAuthority) - || (m_netEntityRole == NetEntityRole::ClientAutonomous); + return (m_netEntityRole == NetEntityRole::Authority) + || (m_netEntityRole == NetEntityRole::Autonomous); } NetEntityId NetBindComponent::GetNetEntityId() const @@ -160,7 +159,7 @@ namespace Multiplayer void NetBindComponent::CreateInput(NetworkInput& networkInput, float deltaTime) { // Only autonomous or authority runs this logic - AZ_Assert(m_netEntityRole == NetEntityRole::ClientAutonomous || m_netEntityRole == NetEntityRole::ServerAuthority, "Incorrect network role for input creation"); + AZ_Assert(m_netEntityRole == NetEntityRole::Autonomous || m_netEntityRole == NetEntityRole::Authority, "Incorrect network role for input creation"); for (MultiplayerComponent* multiplayerComponent : m_multiplayerInputComponentVector) { multiplayerComponent->GetController()->CreateInput(networkInput, deltaTime); @@ -177,15 +176,19 @@ namespace Multiplayer } } - float NetBindComponent::GetRewindDistanceForInput(const NetworkInput& networkInput, float deltaTime) const + AZ::Aabb NetBindComponent::GetRewindBoundsForInput(const NetworkInput& networkInput, float deltaTime) const { - AZ_Assert(m_netEntityRole == NetEntityRole::ServerAuthority, "Incorrect network role for computing rewind distance"); - float rewindDistance = 0.0f; + AZ_Assert(m_netEntityRole == NetEntityRole::Authority, "Incorrect network role for computing rewind bounds"); + AZ::Aabb bounds = AZ::Aabb::CreateNull(); for (MultiplayerComponent* multiplayerComponent : m_multiplayerInputComponentVector) { - rewindDistance = AZStd::max(rewindDistance, multiplayerComponent->GetController()->GetRewindDistanceForInput(networkInput, deltaTime)); + const AZ::Aabb componentBounds = multiplayerComponent->GetController()->GetRewindBoundsForInput(networkInput, deltaTime); + if (componentBounds.IsValid()) + { + bounds.AddAabb(componentBounds); + } } - return rewindDistance; + return bounds; } bool NetBindComponent::HandleRpcMessage(NetEntityRole remoteRole, NetworkEntityRpcMessage& message) @@ -203,25 +206,25 @@ namespace Multiplayer const NetEntityRole netEntityRole = m_netEntityRole; ReplicationRecord replicationRecord(netEntityRole); replicationRecord.Serialize(serializer); - if ((serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject) && (netEntityRole == NetEntityRole::ServerSimulation)) + if ((serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject) && (netEntityRole == NetEntityRole::Server)) { // Make sure to capture the entirety of the TotalRecord, before we clear out bits that haven't changed from our local state // If this entity migrates, we need to send all bits that might have changed from original baseline m_totalRecord.Append(replicationRecord); } // This will modify the replicationRecord and clear out bits that have not changed from the local state, this prevents us from notifying that something has changed multiple times - SerializeStateDeltaMessage(replicationRecord, serializer, ComponentSerializationType::Properties); + SerializeStateDeltaMessage(replicationRecord, serializer); if (serializer.IsValid()) { replicationRecord.ResetConsumedBits(); if (notifyChanges) { - NotifyStateDeltaChanges(replicationRecord, ComponentSerializationType::Properties); + NotifyStateDeltaChanges(replicationRecord); } // If we are deserializing on an entity, and this is a server simulation, then we need to remark our bits as dirty to replicate to the client - if ((serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject) && (netEntityRole == NetEntityRole::ServerSimulation)) + if ((serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject) && (netEntityRole == NetEntityRole::Server)) { m_currentRecord.Append(replicationRecord); MarkDirty(); @@ -230,24 +233,24 @@ namespace Multiplayer return serializer.IsValid(); } - RpcSendEvent& NetBindComponent::GetSendServerAuthorityToClientSimulationRpcEvent() + RpcSendEvent& NetBindComponent::GetSendAuthorityToClientRpcEvent() { - return m_sendServerAuthorityToClientSimulationRpcEvent; + return m_sendAuthorityToClientRpcEvent; } - RpcSendEvent& NetBindComponent::GetSendServerAuthorityToClientAutonomousRpcEvent() + RpcSendEvent& NetBindComponent::GetSendAuthorityToAutonomousRpcEvent() { - return m_sendServerAuthorityToClientAutonomousRpcEvent; + return m_sendAuthorityToAutonomousRpcEvent; } - RpcSendEvent& NetBindComponent::GetSendServerSimulationToServerAuthorityRpcEvent() + RpcSendEvent& NetBindComponent::GetSendServerToAuthorityRpcEvent() { - return m_sendServerSimulationtoServerAuthorityRpcEvent; + return m_sendServertoAuthorityRpcEvent; } - RpcSendEvent& NetBindComponent::GetSendClientAutonomousToServerAuthorityRpcEvent() + RpcSendEvent& NetBindComponent::GetSendAutonomousToAuthorityRpcEvent() { - return m_sendClientAutonomousToServerAuthorityRpcEvent; + return m_sendAutonomousToAuthorityRpcEvent; } const ReplicationRecord& NetBindComponent::GetPredictableRecord() const @@ -266,7 +269,7 @@ namespace Multiplayer void NetBindComponent::NotifyLocalChanges() { m_localNotificationRecord.ResetConsumedBits(); // Make sure our consumed bits are reset so that we can run through the notifications - NotifyStateDeltaChanges(m_localNotificationRecord, ComponentSerializationType::Properties); + NotifyStateDeltaChanges(m_localNotificationRecord); m_localNotificationRecord.Clear(); } @@ -297,40 +300,31 @@ namespace Multiplayer // The m_predictableRecord is a record that that marks every NetworkProperty that has been set as Predictable // We copy this record and use a temporary so that SerializeStateDeltaMessage will not modify the m_predictableRecord // since SerializeStateDeltaMessage will clear the dirty bit for the NetworkProperty if it did not actually change - const bool success = SerializeStateDeltaMessage(tmpRecord, serializer, ComponentSerializationType::Correction); + const bool success = SerializeStateDeltaMessage(tmpRecord, serializer); if (serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject) { tmpRecord.ResetConsumedBits(); - NotifyStateDeltaChanges(tmpRecord, ComponentSerializationType::Correction); + NotifyStateDeltaChanges(tmpRecord); } return success; } - bool NetBindComponent::SerializeStateDeltaMessage - ( - ReplicationRecord& replicationRecord, - AzNetworking::ISerializer& serializer, - ComponentSerializationType componentSerializationType - ) + bool NetBindComponent::SerializeStateDeltaMessage(ReplicationRecord& replicationRecord, AzNetworking::ISerializer& serializer) { bool success = true; for (auto iter = m_multiplayerSerializationComponentVector.begin(); iter != m_multiplayerSerializationComponentVector.end(); ++iter) { - success &= (*iter)->SerializeStateDeltaMessage(replicationRecord, serializer, componentSerializationType); + success &= (*iter)->SerializeStateDeltaMessage(replicationRecord, serializer); } return success; } - void NetBindComponent::NotifyStateDeltaChanges - ( - ReplicationRecord& replicationRecord, - ComponentSerializationType componentSerializationType - ) + void NetBindComponent::NotifyStateDeltaChanges(ReplicationRecord& replicationRecord) { for (auto iter = m_multiplayerSerializationComponentVector.begin(); iter != m_multiplayerSerializationComponentVector.end(); ++iter) { - (*iter)->NotifyStateDeltaChanges(replicationRecord, componentSerializationType); + (*iter)->NotifyStateDeltaChanges(replicationRecord); } } @@ -352,27 +346,6 @@ namespace Multiplayer } } - bool NetBindComponent::IsMigrationDataValid() const - { - return m_isMigrationDataValid; - } - - void NetBindComponent::SetMigrationDataValid(bool migrationDataValid) - { - m_isMigrationDataValid = migrationDataValid; - } - - bool NetBindComponent::SerializeMigrationData(AzNetworking::ISerializer& serializer) - { - bool ret = true; - // Purposefully not listed in reverse order, must match the order during construction - for (auto iter = m_multiplayerSerializationComponentVector.begin(); iter != m_multiplayerSerializationComponentVector.end(); ++iter) - { - ret &= (*iter)->Migrate(serializer); - } - return ret && serializer.IsValid(); - } - void NetBindComponent::PreInit(AZ::Entity* entity, const PrefabEntityId& prefabEntityId, NetEntityId netEntityId, NetEntityRole netEntityRole) { AZ_Assert(entity != nullptr, "AZ::Entity is null"); @@ -404,11 +377,11 @@ namespace Multiplayer { switch (m_netEntityRole) { - case NetEntityRole::ClientSimulation: - m_netEntityRole = NetEntityRole::ClientAutonomous; + case NetEntityRole::Client: + m_netEntityRole = NetEntityRole::Autonomous; break; - case NetEntityRole::ServerSimulation: - m_netEntityRole = NetEntityRole::ServerAuthority; + case NetEntityRole::Server: + m_netEntityRole = NetEntityRole::Authority; break; default: AZ_Assert(false, "Controller already constructed"); @@ -441,11 +414,11 @@ namespace Multiplayer switch (m_netEntityRole) { - case NetEntityRole::ClientAutonomous: - m_netEntityRole = NetEntityRole::ClientSimulation; + case NetEntityRole::Autonomous: + m_netEntityRole = NetEntityRole::Client; break; - case NetEntityRole::ServerAuthority: - m_netEntityRole = NetEntityRole::ServerSimulation; + case NetEntityRole::Authority: + m_netEntityRole = NetEntityRole::Server; break; default: AZ_Assert(false, "Controllers already destructed"); @@ -465,9 +438,9 @@ namespace Multiplayer } } DetermineInputOrdering(); - if (GetNetEntityRole() == NetEntityRole::ServerAuthority) + if (GetNetEntityRole() == NetEntityRole::Authority) { - m_handleLocalServerRpcMessageEventHandle.Connect(m_sendServerSimulationtoServerAuthorityRpcEvent); + m_handleLocalServerRpcMessageEventHandle.Connect(m_sendServertoAuthorityRpcEvent); } GetNetworkEntityManager()->NotifyControllersActivated(m_netEntityHandle, entityIsMigrating); } @@ -502,19 +475,11 @@ namespace Multiplayer { for (auto* component : m_multiplayerSerializationComponentVector) { - component->NetworkAttach(*this, m_currentRecord, m_predictableRecord); + component->NetworkAttach(this, m_currentRecord, m_predictableRecord); } m_totalRecord = m_currentRecord; } - void NetBindComponent::NetworkDetach() - { - for (auto* component : m_multiplayerSerializationComponentVector) - { - component->NetworkDetach(); - } - } - void NetBindComponent::HandleMarkedDirty() { m_dirtiedEvent.Signal(); @@ -532,7 +497,7 @@ namespace Multiplayer void NetBindComponent::HandleLocalServerRpcMessage(NetworkEntityRpcMessage& message) { - message.SetRpcDeliveryType(RpcDeliveryType::ServerSimulationToServerAuthority); + message.SetRpcDeliveryType(RpcDeliveryType::ServerToAuthority); GetNetworkEntityManager()->HandleLocalRpcMessage(message); } @@ -574,8 +539,8 @@ namespace Multiplayer { switch (networkRole) { - case NetEntityRole::ClientAutonomous: // Fall through - case NetEntityRole::ServerAuthority: + case NetEntityRole::Autonomous: // Fall through + case NetEntityRole::Authority: return true; default: return false; diff --git a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h index df9c524e36..8860c16fc1 100644 --- a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h +++ b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -23,6 +24,7 @@ #include #include #include +#include namespace Multiplayer { @@ -68,15 +70,15 @@ namespace Multiplayer bool IsProcessingInput() const; void CreateInput(NetworkInput& networkInput, float deltaTime); void ProcessInput(NetworkInput& networkInput, float deltaTime); - float GetRewindDistanceForInput(const NetworkInput& networkInput, float deltaTime) const; + AZ::Aabb GetRewindBoundsForInput(const NetworkInput& networkInput, float deltaTime) const; bool HandleRpcMessage(NetEntityRole remoteRole, NetworkEntityRpcMessage& message); bool HandlePropertyChangeMessage(AzNetworking::ISerializer& serializer, bool notifyChanges = true); - RpcSendEvent& GetSendServerAuthorityToClientSimulationRpcEvent(); - RpcSendEvent& GetSendServerAuthorityToClientAutonomousRpcEvent(); - RpcSendEvent& GetSendServerSimulationToServerAuthorityRpcEvent(); - RpcSendEvent& GetSendClientAutonomousToServerAuthorityRpcEvent(); + RpcSendEvent& GetSendAuthorityToClientRpcEvent(); + RpcSendEvent& GetSendAuthorityToAutonomousRpcEvent(); + RpcSendEvent& GetSendServerToAuthorityRpcEvent(); + RpcSendEvent& GetSendAutonomousToAuthorityRpcEvent(); const ReplicationRecord& GetPredictableRecord() const; @@ -88,20 +90,15 @@ namespace Multiplayer void AddEntityDirtiedEventHandler(EntityDirtiedEvent::Handler& eventHandler); void AddEntityMigrationEventHandler(EntityMigrationEvent::Handler& eventHandler); - bool SerializeEntityCorrection(AzNetworking::ISerializer& a_Serializer); + bool SerializeEntityCorrection(AzNetworking::ISerializer& serializer); - bool SerializeStateDeltaMessage(ReplicationRecord& replicationRecord, AzNetworking::ISerializer& serializer, ComponentSerializationType componentSerializationType); - void NotifyStateDeltaChanges(ReplicationRecord& replicationRecord, ComponentSerializationType componentSerializationType); + bool SerializeStateDeltaMessage(ReplicationRecord& replicationRecord, AzNetworking::ISerializer& serializer); + void NotifyStateDeltaChanges(ReplicationRecord& replicationRecord); void FillReplicationRecord(ReplicationRecord& replicationRecord) const; void FillTotalReplicationRecord(ReplicationRecord& replicationRecord) const; - bool IsMigrationDataValid() const; - private: - void SetMigrationDataValid(bool migrationDataValid); - bool SerializeMigrationData(AzNetworking::ISerializer& serializer); - void PreInit(AZ::Entity* entity, const PrefabEntityId& prefabEntityId, NetEntityId netEntityId, NetEntityRole netEntityRole); void ConstructControllers(); @@ -112,7 +109,6 @@ namespace Multiplayer void OnEntityStateEvent(AZ::Entity::State oldState, AZ::Entity::State newState); void NetworkAttach(); - void NetworkDetach(); void HandleMarkedDirty(); void HandleLocalServerRpcMessage(NetworkEntityRpcMessage& message); @@ -130,10 +126,10 @@ namespace Multiplayer AZStd::vector m_multiplayerSerializationComponentVector; AZStd::vector m_multiplayerInputComponentVector; - RpcSendEvent m_sendServerAuthorityToClientSimulationRpcEvent; - RpcSendEvent m_sendServerAuthorityToClientAutonomousRpcEvent; - RpcSendEvent m_sendServerSimulationtoServerAuthorityRpcEvent; - RpcSendEvent m_sendClientAutonomousToServerAuthorityRpcEvent; + RpcSendEvent m_sendAuthorityToClientRpcEvent; + RpcSendEvent m_sendAuthorityToAutonomousRpcEvent; + RpcSendEvent m_sendServertoAuthorityRpcEvent; + RpcSendEvent m_sendAutonomousToAuthorityRpcEvent; EntityStopEvent m_entityStopEvent; EntityDirtiedEvent m_dirtiedEvent; diff --git a/Gems/Multiplayer/Code/Source/Components/NetworkTransformComponent.cpp b/Gems/Multiplayer/Code/Source/Components/NetworkTransformComponent.cpp new file mode 100644 index 0000000000..fa0da4ca8f --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Components/NetworkTransformComponent.cpp @@ -0,0 +1,26 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +namespace Multiplayer +{ + void NetworkTransformComponent::NetworkTransformComponent::Reflect(AZ::ReflectContext* context) + { + AZ::SerializeContext* serializeContext = azrtti_cast(context); + if (serializeContext) + { + serializeContext->Class() + ->Version(1); + } + } +} diff --git a/Gems/Multiplayer/Code/Source/Components/NetworkTransformComponent.h b/Gems/Multiplayer/Code/Source/Components/NetworkTransformComponent.h new file mode 100644 index 0000000000..4719f11a7a --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Components/NetworkTransformComponent.h @@ -0,0 +1,41 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace Multiplayer +{ + class NetworkTransformComponent + : public NetworkTransformComponentBase + { + public: + AZ_MULTIPLAYER_COMPONENT(Multiplayer::NetworkTransformComponent, s_networkTransformComponentConcreteUuid, Multiplayer::NetworkTransformComponentBase); + + static void Reflect([[maybe_unused]] AZ::ReflectContext* context); + + void OnInit() override {} + void OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} + void OnDeactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} + }; + + class NetworkTransformComponentController + : public NetworkTransformComponentControllerBase + { + public: + NetworkTransformComponentController(NetworkTransformComponent& parent) : NetworkTransformComponentControllerBase(parent) {} + + void OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} + void OnDeactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override {} + }; +} diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp index 724e842977..c770dceed3 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp @@ -71,7 +71,7 @@ namespace Multiplayer { NetBindComponent* netBindComponent = m_controlledEntity.GetNetBindComponent(); // potentially false if we just migrated the player, if that is the case, don't send any more updates - if (netBindComponent != nullptr && (netBindComponent->GetNetEntityRole() == NetEntityRole::ServerAuthority)) + if (netBindComponent != nullptr && (netBindComponent->GetNetEntityRole() == NetEntityRole::Authority)) { m_entityReplicationManager.SendUpdates(serverGameTimeMs); } diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToServerConnectionData.cpp b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToServerConnectionData.cpp index 8a61b821b8..b8a81159f6 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToServerConnectionData.cpp +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToServerConnectionData.cpp @@ -29,7 +29,7 @@ namespace Multiplayer , m_entityReplicationManager(*connection, connectionListener, EntityReplicationManager::Mode::LocalServerToRemoteServer) , m_connectEvent([this]() { OnConnectTimeout(); }, AZ::Name("Server to server connection timeout event")) { - m_entityReplicationManager.SetRemoteHostId(InvalidHostId);// a_ServerAddrInfo.GetServerAddrInfo().GetShardId()); + m_entityReplicationManager.SetRemoteHostId(InvalidHostId);// serverAddrInfo.GetServerAddrInfo().GetShardId()); m_entityReplicationManager.SetEntityActivationTimeSliceMs(sv_DefaultNetworkEntityActivationTimeSliceMs); m_entityReplicationManager.SetMaxRemoteEntitiesPendingCreationCount(sv_ServerMaxRemoteEntitiesPendingCreationCount); diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp index def333a5b5..25b0b48a79 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp @@ -60,7 +60,7 @@ namespace Multiplayer AZ_CVAR(AZ::CVarFixedString, sv_map, "nolevel", nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "The map the server should load"); AZ_CVAR(AZ::CVarFixedString, sv_gamerules, "norules", nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "GameRules server works with"); AZ_CVAR(ProtocolType, sv_protocol, ProtocolType::Udp, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "This flag controls whether we use TCP or UDP for game networking"); - AZ_CVAR(bool, sv_isdedicated, true, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Whether the host command creates an independent or client hosted server"); + AZ_CVAR(bool, sv_isDedicated, true, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Whether the host command creates an independent or client hosted server"); void MultiplayerSystemComponent::Reflect(AZ::ReflectContext* context) { @@ -375,7 +375,6 @@ namespace Multiplayer } } m_agentType = multiplayerType; - } void MultiplayerSystemComponent::AddConnectionAcquiredHandler(ConnectionAcquiredEvent::Handler& handler) @@ -430,7 +429,7 @@ namespace Multiplayer void host([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments) { - Multiplayer::MultiplayerAgentType serverType = sv_isdedicated ? MultiplayerAgentType::DedicatedServer : MultiplayerAgentType::ClientServer; + Multiplayer::MultiplayerAgentType serverType = sv_isDedicated ? MultiplayerAgentType::DedicatedServer : MultiplayerAgentType::ClientServer; INetworkInterface* networkInterface = AZ::Interface::Get()->RetrieveNetworkInterface(AZ::Name(s_networkInterfaceName)); networkInterface->Listen(sv_port); AZ::Interface::Get()->InitializeMultiplayer(serverType); diff --git a/Gems/Multiplayer/Code/Source/MultiplayerTypes.h b/Gems/Multiplayer/Code/Source/MultiplayerTypes.h index 93e29eac86..b387602843 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerTypes.h +++ b/Gems/Multiplayer/Code/Source/MultiplayerTypes.h @@ -20,6 +20,9 @@ namespace Multiplayer { + //! The default number of rewindable samples for us to store. + static constexpr uint32_t RewindHistorySize = 128; + AZ_TYPE_SAFE_INTEGRAL(HostId, uint32_t); static constexpr HostId InvalidHostId = static_cast(-1); @@ -39,19 +42,19 @@ namespace Multiplayer enum class RpcDeliveryType : uint8_t { None, - ServerAuthorityToClientSimulation, // Invoked from ServerAuthority, handled on ClientSimulation - ServerAuthorityToClientAutonomous, // Invoked from ServerAuthority, handled on ClientAutonomous - ClientAutonomousToServerAuthority, // Invoked from ClientAutonomous, handled on ServerAuthority - ServerSimulationToServerAuthority // Invoked from ServerSimulation, handled on ServerAuthority + AuthorityToClient, // Invoked from Authority, handled on Client + AuthorityToAutonomous, // Invoked from Authority, handled on Autonomous + AutonomousToAuthority, // Invoked from Autonomous, handled on Authority + ServerToAuthority // Invoked from Server, handled on Authority }; enum class NetEntityRole : uint8_t { - InvalidRole, // No role - ClientSimulation, // A simulated proxy on a client - ClientAutonomous, // An autonomous proxy on a client (can execute local prediction) - ServerSimulation, // A simulated proxy on a server - ServerAuthority // An authoritative proxy on a server (full authority) + InvalidRole, // No role + Client, // A simulated proxy on a client + Autonomous, // An autonomous proxy on a client (can execute local prediction) + Server, // A simulated proxy on a server + Authority // An authoritative proxy on a server (full authority) }; enum class ComponentSerializationType : uint8_t diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp index ad5b3a015a..e58b7fde9d 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp @@ -216,7 +216,7 @@ namespace Multiplayer m_remoteEntitiesPendingCreation.insert(entityId); } - if (replicator->GetRemoteNetworkRole() == NetEntityRole::ClientAutonomous) + if (replicator->GetRemoteNetworkRole() == NetEntityRole::Autonomous) { autonomousReplicators.push_back(replicator); } @@ -557,7 +557,7 @@ namespace Multiplayer const bool changeNetworkRole = (netBindComponent->GetNetEntityRole() != localNetworkRole); if (changeNetworkRole) { - AZ_Assert(localNetworkRole != NetEntityRole::ServerAuthority, "UpdateMessage trying to set local role to ServerAuthority, this should only happen via migration"); + AZ_Assert(localNetworkRole != NetEntityRole::Authority, "UpdateMessage trying to set local role to Authority, this should only happen via migration"); AZLOG_INFO ( "EntityReplicationManager: Changing network role on entity %u, old role %u new role %u", @@ -590,14 +590,14 @@ namespace Multiplayer // A will tell us to set a timer to delete that entity (since it no longer owns it, and has been handed off), and B will tell us to create it. // This covers an edge case where the timer has popped, but the entity is pending removal when we are told by B to create the entity. GetNetworkEntityManager()->ClearEntityFromRemovalList(replicatorEntity); - entityReplicator = AddEntityReplicator(replicatorEntity, NetEntityRole::ServerAuthority); + entityReplicator = AddEntityReplicator(replicatorEntity, NetEntityRole::Authority); //AZLOG(NET_RepUpdate, "EntityReplicationManager: Created from update entity id %u for type %s role %d", netEntityId, prefabEntityId.GetString(), localNetworkRole); } // @nt: TODO - delete once dropped RPC problem fixed // This code is temporary to work around to the problem that RPC messages are silently lost during migration // Once this problem is solved, we can remove this code and associated event - if (createReplicator && localNetworkRole == NetEntityRole::ClientAutonomous) + if (createReplicator && localNetworkRole == NetEntityRole::Autonomous) { m_autonomousEntityReplicatorCreated.Signal(netEntityId); } @@ -647,10 +647,10 @@ namespace Multiplayer // don't trust the client by default result = UpdateValidationResult::DropMessageAndDisconnect; // Clients sending data must have a replicator and be sending in the correct mode, further, they must have a replicator and can never delete a replicator - if (updateMessage.GetNetworkRole() == NetEntityRole::ServerAuthority && entityReplicator && !updateMessage.GetIsDelete()) + if (updateMessage.GetNetworkRole() == NetEntityRole::Authority && entityReplicator && !updateMessage.GetIsDelete()) { // Make sure we our replicator is in the expected configuration - if ((entityReplicator->GetRemoteNetworkRole() == NetEntityRole::ClientAutonomous) && (entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority)) + if ((entityReplicator->GetRemoteNetworkRole() == NetEntityRole::Autonomous) && (entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::Authority)) { // If we're marked for removal, just drop the message - migration message is likely in flight if (entityReplicator->IsMarkedForRemoval()) @@ -663,7 +663,7 @@ namespace Multiplayer result = UpdateValidationResult::HandleMessage; } } // If we've migrated the entity away from the server, but we get this late, just drop it - else if ((entityReplicator->GetRemoteNetworkRole() == NetEntityRole::ClientSimulation) && (entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::ServerSimulation)) + else if ((entityReplicator->GetRemoteNetworkRole() == NetEntityRole::Client) && (entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::Server)) { result = UpdateValidationResult::DropMessage; } @@ -686,22 +686,22 @@ namespace Multiplayer break; case Mode::LocalServerToRemoteServer: { - AZ_Assert(updateMessage.GetNetworkRole() == NetEntityRole::ServerSimulation || updateMessage.GetIsDelete(), "Unexpected update type coming from peer server"); + AZ_Assert(updateMessage.GetNetworkRole() == NetEntityRole::Server || updateMessage.GetIsDelete(), "Unexpected update type coming from peer server"); // trust messages from a peer server by default result = UpdateValidationResult::HandleMessage; // If we have a replicator, make sure we're in the correct state if (entityReplicator) { - if (!entityReplicator->IsMarkedForRemoval() && (entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority)) + if (!entityReplicator->IsMarkedForRemoval() && (entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::Authority)) { // Likely an old message from a previous owner trying to delete the replicator it had, while we've received ownership // This can happen when Shard A migrates an entity to Shard B, then shard B migrates the entity to Shard C, and Shard A tries to delete a replicator it had to Shard C (which has already made a new replicator for Shard A) result = UpdateValidationResult::DropMessage; } - else if (entityReplicator->GetRemoteNetworkRole() != NetEntityRole::ServerAuthority)// we expect to the remote role to be e_ServerAuthority + else if (entityReplicator->GetRemoteNetworkRole() != NetEntityRole::Authority)// we expect to the remote role to be e_Authority { // This entity has migrated previously, and we haven't heard back that the remove was successful, so we can accept the message - AZ_Assert(entityReplicator->IsMarkedForRemoval() && entityReplicator->GetRemoteNetworkRole() == NetEntityRole::ServerSimulation, "Unexpected server message is not Authority or ServerSimulation"); + AZ_Assert(entityReplicator->IsMarkedForRemoval() && entityReplicator->GetRemoteNetworkRole() == NetEntityRole::Server, "Unexpected server message is not Authority or Server"); } } } @@ -1018,9 +1018,9 @@ namespace Multiplayer AZ_Assert(netBindComponent, "No NetBindComponent"); const EntityReplicator* entityReplicator = GetEntityReplicator(entityHandle.GetNetEntityId()); - hasAuthority = (netBindComponent->GetNetEntityRole() == NetEntityRole::ServerAuthority); // Make sure someone hasn't migrated this already + hasAuthority = (netBindComponent->GetNetEntityRole() == NetEntityRole::Authority); // Make sure someone hasn't migrated this already isInDomain = (m_remoteEntityDomain && m_remoteEntityDomain->IsInDomain(entityHandle)); // Make sure the remote side would want it - if (entityReplicator && entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority) + if (entityReplicator && entityReplicator->GetBoundLocalNetworkRole() == NetEntityRole::Authority) { isMarkedForRemoval = entityReplicator->IsMarkedForRemoval(); // Make sure we aren't telling the other side to remove the replicator const PropertyPublisher* propertyPublisher = entityReplicator->GetPropertyPublisher(); @@ -1035,7 +1035,7 @@ namespace Multiplayer { if (const EntityReplicator* replicator = GetEntityReplicator(entityHandle.GetNetEntityId())) { - return replicator->GetRemoteNetworkRole() == NetEntityRole::ServerAuthority; + return replicator->GetRemoteNetworkRole() == NetEntityRole::Authority; } return false; } @@ -1073,9 +1073,9 @@ namespace Multiplayer NetBindComponent* netBindComponent = entityHandle.GetNetBindComponent(); AZ_Assert(netBindComponent, "No NetBindComponent"); - if (netBindComponent && netBindComponent->GetNetEntityRole() == NetEntityRole::ServerAuthority) + if (netBindComponent && netBindComponent->GetNetEntityRole() == NetEntityRole::Authority) { - EntityReplicator* replicator = AddEntityReplicator(entityHandle, NetEntityRole::ServerSimulation); + EntityReplicator* replicator = AddEntityReplicator(entityHandle, NetEntityRole::Server); PropertyPublisher* propPublisher = replicator->GetPropertyPublisher(); AZ_Assert(propPublisher, "Assumed we have a property publisher"); @@ -1092,15 +1092,11 @@ namespace Multiplayer if (localEnt->GetState() == AZ::Entity::State::Active) { netBindComponent->DeactivateControllers(EntityIsMigrating::True); - AzNetworking::NetworkInputSerializer inputSerializer(message.ModifyMigrationData().GetBuffer(), message.ModifyMigrationData().GetCapacity()); - didSucceed = netBindComponent->SerializeMigrationData(inputSerializer); - message.ModifyMigrationData().Resize(inputSerializer.GetSize()); } netBindComponent->DestructControllers(); - netBindComponent->SetMigrationDataValid(false); - // save off network properties after the migration data is saved to capture any changes that might have occurred during deactivate + // Gather the most recent network property state, including authoritative only network properties for migration { // Send an update packet if it needs one propPublisher->GenerateRecord(); @@ -1119,7 +1115,7 @@ namespace Multiplayer AZLOG(NET_RepDeletes, "Migration packet sent %u to remote manager id %d", netEntityId, aznumeric_cast(GetRemoteHostId())); // Immediately add a new replicator so that we catch RPC invocations, the remote side will make us a new one, and then remove us if needs be - AddEntityReplicator(entityHandle, NetEntityRole::ServerAuthority); + AddEntityReplicator(entityHandle, NetEntityRole::Authority); } } @@ -1135,7 +1131,7 @@ namespace Multiplayer replicator, AzNetworking::InvalidPacketId, message.GetEntityId(), - NetEntityRole::ServerSimulation, + NetEntityRole::Server, outputSerializer, message.GetPrefabEntityId() )) @@ -1159,15 +1155,6 @@ namespace Multiplayer // Stop listening to the OnEntityNetworkRoleChange, since we are about to change it and we don't want that callback netBindComponent->ConstructControllers(); - bool didSucceed = false; - { - AzNetworking::NetworkOutputSerializer outputSerializer(message.ModifyMigrationData().GetBuffer(), message.ModifyMigrationData().GetSize()); - didSucceed = netBindComponent->SerializeMigrationData(outputSerializer); - AZ_Assert(didSucceed, "Failed to migrate entity to server"); - AZ_Assert(outputSerializer.IsValid() && outputSerializer.GetUnreadSize() == 0, "Bad migration"); - } - netBindComponent->SetMigrationDataValid(true); - if (entityHandle.GetEntity()->GetState() == AZ::Entity::State::Active) { // Only activate controllers if the entity was previously activated, otherwise, wait for the normal entity activation flow @@ -1175,10 +1162,10 @@ namespace Multiplayer } // change the role on the replicator - AddEntityReplicator(entityHandle, NetEntityRole::ServerSimulation); + AddEntityReplicator(entityHandle, NetEntityRole::Server); AZLOG(NET_RepDeletes, "Handle Migration %u new authority from remote manager id %d", entityHandle.GetNetEntityId(), aznumeric_cast(GetRemoteHostId())); - return didSucceed; + return true; } void EntityReplicationManager::OnEntityExitDomain(const ConstNetworkEntityHandle& entityHandle) diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp index 3220095f1b..17273e7675 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp @@ -50,8 +50,8 @@ namespace Multiplayer , m_onEntityDirtiedHandler([this]() { OnEntityDirtiedEvent(); }) , m_onSendRpcHandler([this](NetworkEntityRpcMessage& entityRpcMessage) { OnSendRpcEvent(entityRpcMessage); }) , m_onForwardRpcHandler([this](NetworkEntityRpcMessage& entityRpcMessage) { OnSendRpcEvent(entityRpcMessage); }) - , m_onSendClientAutonomousRpcHandler([this](NetworkEntityRpcMessage& entityRpcMessage) { OnSendRpcEvent(entityRpcMessage); }) - , m_onForwardClientAutonomousRpcHandler([this](NetworkEntityRpcMessage& entityRpcMessage) { OnSendRpcEvent(entityRpcMessage); }) + , m_onSendAutonomousRpcHandler([this](NetworkEntityRpcMessage& entityRpcMessage) { OnSendRpcEvent(entityRpcMessage); }) + , m_onForwardAutonomousRpcHandler([this](NetworkEntityRpcMessage& entityRpcMessage) { OnSendRpcEvent(entityRpcMessage); }) , m_onEntityStopHandler([this](const ConstNetworkEntityHandle &) { OnEntityRemovedEvent(); }) , m_proxyRemovalEvent([this] { OnProxyRemovalTimedEvent(); }, AZ::Name("ProxyRemovalTimedEvent")) { @@ -73,11 +73,11 @@ namespace Multiplayer m_prefabEntityIdSet = true; } - void EntityReplicator::Reset(NetEntityRole a_RemoteNetworkRole) + void EntityReplicator::Reset(NetEntityRole remoteNetworkRole) { AZ::EntityBus::Handler::BusDisconnect(); - m_remoteNetworkRole = a_RemoteNetworkRole; + m_remoteNetworkRole = remoteNetworkRole; m_propertyPublisher = nullptr; m_propertySubscriber = nullptr; @@ -86,8 +86,8 @@ namespace Multiplayer m_onSendRpcHandler.Disconnect(); m_onForwardRpcHandler.Disconnect(); - m_onSendClientAutonomousRpcHandler.Disconnect(); - m_onForwardClientAutonomousRpcHandler.Disconnect(); + m_onSendAutonomousRpcHandler.Disconnect(); + m_onForwardAutonomousRpcHandler.Disconnect(); m_onEntityStopHandler.Disconnect(); } @@ -136,8 +136,8 @@ namespace Multiplayer m_propertyPublisher = nullptr; } - if (m_remoteNetworkRole == NetEntityRole::ServerAuthority || - m_remoteNetworkRole == NetEntityRole::ClientAutonomous) + if (m_remoteNetworkRole == NetEntityRole::Authority || + m_remoteNetworkRole == NetEntityRole::Autonomous) { m_propertySubscriber = AZStd::make_unique(m_replicationManager, m_netBindComponent); } @@ -165,9 +165,9 @@ namespace Multiplayer { // Make sure all handlers are detached first m_onSendRpcHandler.Disconnect(); - m_onSendClientAutonomousRpcHandler.Disconnect(); + m_onSendAutonomousRpcHandler.Disconnect(); m_onForwardRpcHandler.Disconnect(); - m_onForwardClientAutonomousRpcHandler.Disconnect(); + m_onForwardAutonomousRpcHandler.Disconnect(); if (auto localEntity = m_entityHandle.GetEntity()) { @@ -176,49 +176,49 @@ namespace Multiplayer switch (GetBoundLocalNetworkRole()) { - case NetEntityRole::ServerAuthority: + case NetEntityRole::Authority: { - if (GetRemoteNetworkRole() == NetEntityRole::ClientSimulation || GetRemoteNetworkRole() == NetEntityRole::ClientAutonomous) + if (GetRemoteNetworkRole() == NetEntityRole::Client || GetRemoteNetworkRole() == NetEntityRole::Autonomous) { - m_onSendRpcHandler.Connect(netBindComponent->GetSendServerAuthorityToClientSimulationRpcEvent()); - if (GetRemoteNetworkRole() == NetEntityRole::ClientAutonomous) + m_onSendRpcHandler.Connect(netBindComponent->GetSendAuthorityToClientRpcEvent()); + if (GetRemoteNetworkRole() == NetEntityRole::Autonomous) { - m_onSendClientAutonomousRpcHandler.Connect(netBindComponent->GetSendServerAuthorityToClientAutonomousRpcEvent()); + m_onSendAutonomousRpcHandler.Connect(netBindComponent->GetSendAuthorityToAutonomousRpcEvent()); } } - else if (GetRemoteNetworkRole() == NetEntityRole::ServerSimulation) + else if (GetRemoteNetworkRole() == NetEntityRole::Server) { - m_onForwardRpcHandler.Connect(netBindComponent->GetSendServerAuthorityToClientSimulationRpcEvent()); + m_onForwardRpcHandler.Connect(netBindComponent->GetSendAuthorityToClientRpcEvent()); } } break; - case NetEntityRole::ServerSimulation: + case NetEntityRole::Server: { - if (GetRemoteNetworkRole() == NetEntityRole::ServerAuthority) + if (GetRemoteNetworkRole() == NetEntityRole::Authority) { - m_onSendRpcHandler.Connect(netBindComponent->GetSendServerSimulationToServerAuthorityRpcEvent()); - m_onForwardRpcHandler.Connect(netBindComponent->GetSendServerAuthorityToClientSimulationRpcEvent()); - m_onForwardClientAutonomousRpcHandler.Connect(netBindComponent->GetSendServerAuthorityToClientAutonomousRpcEvent()); + m_onSendRpcHandler.Connect(netBindComponent->GetSendServerToAuthorityRpcEvent()); + m_onForwardRpcHandler.Connect(netBindComponent->GetSendAuthorityToClientRpcEvent()); + m_onForwardAutonomousRpcHandler.Connect(netBindComponent->GetSendAuthorityToAutonomousRpcEvent()); } - else if (GetRemoteNetworkRole() == NetEntityRole::ClientSimulation) + else if (GetRemoteNetworkRole() == NetEntityRole::Client) { // Listen for these to forward the rpc along to the other Client replicators - m_onSendRpcHandler.Connect(netBindComponent->GetSendServerAuthorityToClientSimulationRpcEvent()); + m_onSendRpcHandler.Connect(netBindComponent->GetSendAuthorityToClientRpcEvent()); } - // NOTE: e_ClientAutonomous is not connected to e_ServerProxy, it is always connected to an e_ServerAuthority - AZ_Assert(GetRemoteNetworkRole() != NetEntityRole::ClientAutonomous, "Unexpected autonomous remote role") + // NOTE: e_Autonomous is not connected to e_ServerProxy, it is always connected to an e_Authority + AZ_Assert(GetRemoteNetworkRole() != NetEntityRole::Autonomous, "Unexpected autonomous remote role") } break; - case NetEntityRole::ClientSimulation: + case NetEntityRole::Client: { - // Nothing allowed, no ClientSimulation to Server communication + // Nothing allowed, no Client to Server communication } break; - case NetEntityRole::ClientAutonomous: + case NetEntityRole::Autonomous: { - if (GetRemoteNetworkRole() == NetEntityRole::ServerAuthority) + if (GetRemoteNetworkRole() == NetEntityRole::Authority) { - m_onSendRpcHandler.Connect(netBindComponent->GetSendClientAutonomousToServerAuthorityRpcEvent()); + m_onSendRpcHandler.Connect(netBindComponent->GetSendAutonomousToAuthorityRpcEvent()); } } break; @@ -282,11 +282,11 @@ namespace Multiplayer NetBindComponent* netBindComponent = m_netBindComponent; AZ_Assert(netBindComponent, "No Multiplayer::NetBindComponent"); - bool isServerAuthority = (GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority) + bool isAuthority = (GetBoundLocalNetworkRole() == NetEntityRole::Authority) && (GetBoundLocalNetworkRole() == netBindComponent->GetNetEntityRole()); - bool isClientSimulation = GetRemoteNetworkRole() == NetEntityRole::ClientSimulation; - bool isClientAutonomous = GetBoundLocalNetworkRole() == NetEntityRole::ClientAutonomous; - if (isServerAuthority || isClientSimulation || isClientAutonomous) + bool isClient = GetRemoteNetworkRole() == NetEntityRole::Client; + bool isAutonomous = GetBoundLocalNetworkRole() == NetEntityRole::Autonomous; + if (isAuthority || isClient || isAutonomous) { ret = true; } @@ -297,10 +297,10 @@ namespace Multiplayer bool EntityReplicator::OwnsReplicatorLifetime() const { bool ret(false); - if (GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority - || (GetBoundLocalNetworkRole() == NetEntityRole::ServerSimulation - && (GetRemoteNetworkRole() == NetEntityRole::ClientSimulation - || GetRemoteNetworkRole() == NetEntityRole::ClientAutonomous))) + if (GetBoundLocalNetworkRole() == NetEntityRole::Authority + || (GetBoundLocalNetworkRole() == NetEntityRole::Server + && (GetRemoteNetworkRole() == NetEntityRole::Client + || GetRemoteNetworkRole() == NetEntityRole::Autonomous))) { ret = true; } @@ -310,11 +310,11 @@ namespace Multiplayer bool EntityReplicator::RemoteManagerOwnsEntityLifetime() const { bool ret(false); - bool isServerSimulation = (GetBoundLocalNetworkRole() == NetEntityRole::ServerSimulation) - && (GetRemoteNetworkRole() == NetEntityRole::ServerAuthority); - bool isClientSimulation = (GetBoundLocalNetworkRole() == NetEntityRole::ClientSimulation) - || (GetBoundLocalNetworkRole() == NetEntityRole::ClientAutonomous); - if (isServerSimulation || isClientSimulation) + bool isServer = (GetBoundLocalNetworkRole() == NetEntityRole::Server) + && (GetRemoteNetworkRole() == NetEntityRole::Authority); + bool isClient = (GetBoundLocalNetworkRole() == NetEntityRole::Client) + || (GetBoundLocalNetworkRole() == NetEntityRole::Autonomous); + if (isServer || isClient) { ret = true; } @@ -346,7 +346,7 @@ namespace Multiplayer m_replicationManager.AddReplicatorToPendingRemoval(*this); m_onForwardRpcHandler.Disconnect(); - m_onForwardClientAutonomousRpcHandler.Disconnect(); + m_onForwardAutonomousRpcHandler.Disconnect(); m_onEntityStopHandler.Disconnect(); } @@ -492,32 +492,32 @@ namespace Multiplayer RpcValidationResult result = RpcValidationResult::DropRpcAndDisconnect; switch (entityRpcMessage.GetRpcDeliveryType()) { - case RpcDeliveryType::ServerAuthorityToClientSimulation: + case RpcDeliveryType::AuthorityToClient: { - if (((GetBoundLocalNetworkRole() == NetEntityRole::ClientSimulation) || (GetBoundLocalNetworkRole() == NetEntityRole::ClientAutonomous)) - && (GetRemoteNetworkRole() == NetEntityRole::ServerAuthority)) + if (((GetBoundLocalNetworkRole() == NetEntityRole::Client) || (GetBoundLocalNetworkRole() == NetEntityRole::Autonomous)) + && (GetRemoteNetworkRole() == NetEntityRole::Authority)) { // We are a local client, and we are connected to server, aka AuthorityToClient result = RpcValidationResult::HandleRpc; } - if ((GetBoundLocalNetworkRole() == NetEntityRole::ServerSimulation) - && (GetRemoteNetworkRole() == NetEntityRole::ServerAuthority)) + if ((GetBoundLocalNetworkRole() == NetEntityRole::Server) + && (GetRemoteNetworkRole() == NetEntityRole::Authority)) { // We are on a server, and we received this message from another server, therefore we should forward this to any connected clients result = RpcValidationResult::ForwardToClient; } } break; - case RpcDeliveryType::ServerAuthorityToClientAutonomous: + case RpcDeliveryType::AuthorityToAutonomous: { - if ((GetBoundLocalNetworkRole() == NetEntityRole::ClientAutonomous) - && (GetRemoteNetworkRole() == NetEntityRole::ServerAuthority)) + if ((GetBoundLocalNetworkRole() == NetEntityRole::Autonomous) + && (GetRemoteNetworkRole() == NetEntityRole::Authority)) { // We are an autonomous client, and we are connected to server, aka AuthorityToAutonomous result = RpcValidationResult::HandleRpc; } - if ((GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority) - && (GetRemoteNetworkRole() == NetEntityRole::ServerSimulation)) + if ((GetBoundLocalNetworkRole() == NetEntityRole::Authority) + && (GetRemoteNetworkRole() == NetEntityRole::Server)) { // We are on a server, and we received this message from another server, therefore we should forward this to our autonomous player // This can occur if we've recently migrated @@ -525,10 +525,10 @@ namespace Multiplayer } } break; - case RpcDeliveryType::ClientAutonomousToServerAuthority: + case RpcDeliveryType::AutonomousToAuthority: { - if ((GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority) - && (GetRemoteNetworkRole() == NetEntityRole::ClientAutonomous)) + if ((GetBoundLocalNetworkRole() == NetEntityRole::Authority) + && (GetRemoteNetworkRole() == NetEntityRole::Autonomous)) { if (IsMarkedForRemoval()) { @@ -552,10 +552,10 @@ namespace Multiplayer } } break; - case RpcDeliveryType::ServerSimulationToServerAuthority: + case RpcDeliveryType::ServerToAuthority: { - if ((GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority) - && (GetRemoteNetworkRole() == NetEntityRole::ServerSimulation)) + if ((GetBoundLocalNetworkRole() == NetEntityRole::Authority) + && (GetRemoteNetworkRole() == NetEntityRole::Server)) { // if we're marked for removal, then we should forward to whomever now owns this entity if (IsMarkedForRemoval()) @@ -583,8 +583,8 @@ namespace Multiplayer } if (result == RpcValidationResult::DropRpcAndDisconnect) { - bool isLocalServer = (GetBoundLocalNetworkRole() == NetEntityRole::ServerAuthority) || (GetBoundLocalNetworkRole() == NetEntityRole::ServerSimulation); - bool isRemoteServer = (GetRemoteNetworkRole() == NetEntityRole::ServerAuthority) || (GetRemoteNetworkRole() == NetEntityRole::ServerSimulation); + bool isLocalServer = (GetBoundLocalNetworkRole() == NetEntityRole::Authority) || (GetBoundLocalNetworkRole() == NetEntityRole::Server); + bool isRemoteServer = (GetRemoteNetworkRole() == NetEntityRole::Authority) || (GetRemoteNetworkRole() == NetEntityRole::Server); if (isLocalServer && isRemoteServer) { // Demote this to just a drop message, we didn't want to handle the message, but we don't want to drop the connection @@ -680,19 +680,19 @@ namespace Multiplayer case RpcValidationResult::ForwardToClient: { ScopedForwardingMessage forwarding(*this); - m_netBindComponent->GetSendServerAuthorityToClientSimulationRpcEvent().Signal(entityRpcMessage); + m_netBindComponent->GetSendAuthorityToClientRpcEvent().Signal(entityRpcMessage); return true; } case RpcValidationResult::ForwardToAutonomous: { ScopedForwardingMessage forwarding(*this); - m_netBindComponent->GetSendServerAuthorityToClientAutonomousRpcEvent().Signal(entityRpcMessage); + m_netBindComponent->GetSendAuthorityToAutonomousRpcEvent().Signal(entityRpcMessage); return true; } case RpcValidationResult::ForwardToAuthority: { ScopedForwardingMessage forwarding(*this); - m_netBindComponent->GetSendServerSimulationToServerAuthorityRpcEvent().Signal(entityRpcMessage); + m_netBindComponent->GetSendServerToAuthorityRpcEvent().Signal(entityRpcMessage); return true; } default: diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.h b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.h index 5f7943d70e..66274f638e 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.h @@ -119,8 +119,8 @@ namespace Multiplayer // Events RpcSendEvent::Handler m_onSendRpcHandler; RpcSendEvent::Handler m_onForwardRpcHandler; - RpcSendEvent::Handler m_onSendClientAutonomousRpcHandler; - RpcSendEvent::Handler m_onForwardClientAutonomousRpcHandler; + RpcSendEvent::Handler m_onSendAutonomousRpcHandler; + RpcSendEvent::Handler m_onForwardAutonomousRpcHandler; EntityDirtiedEvent::Handler m_onEntityDirtiedHandler; EntityStopEvent::Handler m_onEntityStopHandler; AZ::ScheduledEvent m_proxyRemovalEvent; diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/PropertyPublisher.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/PropertyPublisher.cpp index bbdf1c3f5f..dfa324f76b 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/PropertyPublisher.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/PropertyPublisher.cpp @@ -67,7 +67,7 @@ namespace Multiplayer void PropertyPublisher::SetRebasing() { - AZ_Assert(m_pendingRecord.GetNetworkRole() == NetEntityRole::ClientAutonomous, "Expected to be rebasing on a ClientAutonomous entity"); + AZ_Assert(m_pendingRecord.GetNetworkRole() == NetEntityRole::Autonomous, "Expected to be rebasing on a Autonomous entity"); m_replicatorState = EntityReplicatorState::Rebasing; } @@ -117,8 +117,8 @@ namespace Multiplayer // This is basically an Add record, but we don't want to send back predictable values m_sentRecords.clear(); m_netBindComponent->FillTotalReplicationRecord(m_pendingRecord); - // Don't send predictable properties back to the ClientAutonomous unless we correct them - if (m_pendingRecord.GetNetworkRole() == NetEntityRole::ClientAutonomous) + // Don't send predictable properties back to the Autonomous unless we correct them + if (m_pendingRecord.GetNetworkRole() == NetEntityRole::Autonomous) { m_pendingRecord.Subtract(m_netBindComponent->GetPredictableRecord()); } @@ -144,8 +144,8 @@ namespace Multiplayer m_pendingRecord.Append(*iter); } - // Don't send predictable properties back to the ClientAutonomous unless we correct them - if (m_pendingRecord.GetNetworkRole() == NetEntityRole::ClientAutonomous) + // Don't send predictable properties back to the Autonomous unless we correct them + if (m_pendingRecord.GetNetworkRole() == NetEntityRole::Autonomous) { m_pendingRecord.Subtract(m_netBindComponent->GetPredictableRecord()); } @@ -165,7 +165,7 @@ namespace Multiplayer AZ_Assert(m_netBindComponent, "NetBindComponent is nullptr"); m_pendingRecord.ResetConsumedBits(); m_pendingRecord.Serialize(serializer); - m_netBindComponent->SerializeStateDeltaMessage(m_pendingRecord, serializer, ComponentSerializationType::Properties); + m_netBindComponent->SerializeStateDeltaMessage(m_pendingRecord, serializer); return serializer.IsValid(); } diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.cpp index ae29b2f1da..f256b49378 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.cpp @@ -67,10 +67,10 @@ namespace Multiplayer bool ReplicationRecord::AreAllBitsConsumed() const { bool ret = true; - ret &= m_authorityToClientConsumedBits == m_authorityToClientRecord.GetSize(); - ret &= m_authorityToServerConsumedBits == m_authorityToServerRecord.GetSize(); - ret &= m_authorityToAutonomousConsumedBits == m_authorityToAutonomousRecord.GetSize(); - ret &= m_autonomousToAuthorityConsumedBits == m_autonomousToAuthorityRecord.GetSize(); + ret &= m_authorityToClientConsumedBits == m_authorityToClient.GetSize(); + ret &= m_authorityToServerConsumedBits == m_authorityToServer.GetSize(); + ret &= m_authorityToAutonomousConsumedBits == m_authorityToAutonomous.GetSize(); + ret &= m_autonomousToAuthorityConsumedBits == m_autonomousToAuthority.GetSize(); return ret; } @@ -86,37 +86,37 @@ namespace Multiplayer { ResetConsumedBits(); - uint32_t recordSize = m_authorityToClientRecord.GetSize(); - m_authorityToClientRecord.Clear(); - m_authorityToClientRecord.Resize(recordSize); + uint32_t recordSize = m_authorityToClient.GetSize(); + m_authorityToClient.Clear(); + m_authorityToClient.Resize(recordSize); - recordSize = m_authorityToServerRecord.GetSize(); - m_authorityToServerRecord.Clear(); - m_authorityToServerRecord.Resize(recordSize); + recordSize = m_authorityToServer.GetSize(); + m_authorityToServer.Clear(); + m_authorityToServer.Resize(recordSize); - recordSize = m_authorityToAutonomousRecord.GetSize(); - m_authorityToAutonomousRecord.Clear(); - m_authorityToAutonomousRecord.Resize(recordSize); + recordSize = m_authorityToAutonomous.GetSize(); + m_authorityToAutonomous.Clear(); + m_authorityToAutonomous.Resize(recordSize); - recordSize = m_autonomousToAuthorityRecord.GetSize(); - m_autonomousToAuthorityRecord.Clear(); - m_autonomousToAuthorityRecord.Resize(recordSize); + recordSize = m_autonomousToAuthority.GetSize(); + m_autonomousToAuthority.Clear(); + m_autonomousToAuthority.Resize(recordSize); } void ReplicationRecord::Append(const ReplicationRecord &rhs) { - m_authorityToClientRecord |= rhs.m_authorityToClientRecord; - m_authorityToServerRecord |= rhs.m_authorityToServerRecord; - m_authorityToAutonomousRecord |= rhs.m_authorityToAutonomousRecord; - m_autonomousToAuthorityRecord |= rhs.m_autonomousToAuthorityRecord; + m_authorityToClient |= rhs.m_authorityToClient; + m_authorityToServer |= rhs.m_authorityToServer; + m_authorityToAutonomous |= rhs.m_authorityToAutonomous; + m_autonomousToAuthority |= rhs.m_autonomousToAuthority; } void ReplicationRecord::Subtract(const ReplicationRecord &rhs) { - m_authorityToClientRecord.Subtract(rhs.m_authorityToClientRecord); - m_authorityToServerRecord.Subtract(rhs.m_authorityToServerRecord); - m_authorityToAutonomousRecord.Subtract(rhs.m_authorityToAutonomousRecord); - m_autonomousToAuthorityRecord.Subtract(rhs.m_autonomousToAuthorityRecord); + m_authorityToClient.Subtract(rhs.m_authorityToClient); + m_authorityToServer.Subtract(rhs.m_authorityToServer); + m_authorityToAutonomous.Subtract(rhs.m_authorityToAutonomous); + m_autonomousToAuthority.Subtract(rhs.m_autonomousToAuthority); } bool ReplicationRecord::HasChanges() const @@ -124,42 +124,42 @@ namespace Multiplayer bool hasChanges(false); if (ContainsAuthorityToClientBits()) { - hasChanges = hasChanges ? hasChanges : m_authorityToClientRecord.AnySet(); + hasChanges = hasChanges ? hasChanges : m_authorityToClient.AnySet(); } if (ContainsAuthorityToServerBits()) { - hasChanges = hasChanges ? hasChanges : m_authorityToServerRecord.AnySet(); + hasChanges = hasChanges ? hasChanges : m_authorityToServer.AnySet(); } if (ContainsAuthorityToAutonomousBits()) { - hasChanges = hasChanges ? hasChanges : m_authorityToAutonomousRecord.AnySet(); + hasChanges = hasChanges ? hasChanges : m_authorityToAutonomous.AnySet(); } if (ContainsAutonomousToAuthorityBits()) { - hasChanges = hasChanges ? hasChanges : m_autonomousToAuthorityRecord.AnySet(); + hasChanges = hasChanges ? hasChanges : m_autonomousToAuthority.AnySet(); } return hasChanges; } - bool ReplicationRecord::Serialize(AzNetworking::ISerializer& a_Serializer) + bool ReplicationRecord::Serialize(AzNetworking::ISerializer& serializer) { if (ContainsAuthorityToClientBits()) { - a_Serializer.Serialize(m_authorityToClientRecord, "ServerToClientsRecord"); + serializer.Serialize(m_authorityToClient, "ServerToClientsRecord"); } if (ContainsAuthorityToServerBits()) { - a_Serializer.Serialize(m_authorityToServerRecord, "ServerToServersRecord"); + serializer.Serialize(m_authorityToServer, "ServerToServersRecord"); } if (ContainsAuthorityToAutonomousBits()) { - a_Serializer.Serialize(m_authorityToAutonomousRecord, "ServerToClientAutonomousRecord"); + serializer.Serialize(m_authorityToAutonomous, "ServerToAutonomousRecord"); } if (ContainsAutonomousToAuthorityBits()) { - a_Serializer.Serialize(m_autonomousToAuthorityRecord, "ClientToServersRecord"); + serializer.Serialize(m_autonomousToAuthority, "ClientToServersRecord"); } - return a_Serializer.IsValid(); + return serializer.IsValid(); } void ReplicationRecord::ConsumeAuthorityToClientBits(uint32_t consumedBits) @@ -196,46 +196,46 @@ namespace Multiplayer bool ReplicationRecord::ContainsAuthorityToClientBits() const { - return (m_netEntityRole != NetEntityRole::ServerAuthority) + return (m_netEntityRole != NetEntityRole::Authority) || (m_netEntityRole == NetEntityRole::InvalidRole); } bool ReplicationRecord::ContainsAuthorityToServerBits() const { - return (m_netEntityRole == NetEntityRole::ServerSimulation) + return (m_netEntityRole == NetEntityRole::Server) || (m_netEntityRole == NetEntityRole::InvalidRole); } bool ReplicationRecord::ContainsAuthorityToAutonomousBits() const { - return (m_netEntityRole == NetEntityRole::ClientAutonomous || m_netEntityRole == NetEntityRole::ServerSimulation) + return (m_netEntityRole == NetEntityRole::Autonomous || m_netEntityRole == NetEntityRole::Server) || (m_netEntityRole == NetEntityRole::InvalidRole); } bool ReplicationRecord::ContainsAutonomousToAuthorityBits() const { - return (m_netEntityRole == NetEntityRole::ServerAuthority) + return (m_netEntityRole == NetEntityRole::Authority) || (m_netEntityRole == NetEntityRole::InvalidRole); } uint32_t ReplicationRecord::GetRemainingAuthorityToClientBits() const { - return m_authorityToClientConsumedBits < m_authorityToClientRecord.GetValidBitCount() ? m_authorityToClientRecord.GetValidBitCount() - m_authorityToClientConsumedBits : 0; + return m_authorityToClientConsumedBits < m_authorityToClient.GetValidBitCount() ? m_authorityToClient.GetValidBitCount() - m_authorityToClientConsumedBits : 0; } uint32_t ReplicationRecord::GetRemainingAuthorityToServerBits() const { - return m_authorityToServerConsumedBits < m_authorityToServerRecord.GetValidBitCount() ? m_authorityToServerRecord.GetValidBitCount() - m_authorityToServerConsumedBits : 0; + return m_authorityToServerConsumedBits < m_authorityToServer.GetValidBitCount() ? m_authorityToServer.GetValidBitCount() - m_authorityToServerConsumedBits : 0; } uint32_t ReplicationRecord::GetRemainingAuthorityToAutonomousBits() const { - return m_authorityToAutonomousConsumedBits < m_authorityToAutonomousRecord.GetValidBitCount() ? m_authorityToAutonomousRecord.GetValidBitCount() - m_authorityToAutonomousConsumedBits : 0; + return m_authorityToAutonomousConsumedBits < m_authorityToAutonomous.GetValidBitCount() ? m_authorityToAutonomous.GetValidBitCount() - m_authorityToAutonomousConsumedBits : 0; } uint32_t ReplicationRecord::GetRemainingAutonomousToAuthorityBits() const { - return m_autonomousToAuthorityConsumedBits < m_autonomousToAuthorityRecord.GetValidBitCount() ? m_autonomousToAuthorityRecord.GetValidBitCount() - m_autonomousToAuthorityConsumedBits : 0; + return m_autonomousToAuthorityConsumedBits < m_autonomousToAuthority.GetValidBitCount() ? m_autonomousToAuthority.GetValidBitCount() - m_autonomousToAuthorityConsumedBits : 0; } ReplicationRecordStats ReplicationRecord::GetStats() const diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h index 16586524b3..7370603ede 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h @@ -79,10 +79,10 @@ namespace Multiplayer ReplicationRecordStats GetStats() const; using RecordBitset = AzNetworking::FixedSizeVectorBitset; - RecordBitset m_authorityToClientRecord; - RecordBitset m_authorityToServerRecord; - RecordBitset m_authorityToAutonomousRecord; - RecordBitset m_autonomousToAuthorityRecord; + RecordBitset m_authorityToClient; + RecordBitset m_authorityToServer; + RecordBitset m_authorityToAutonomous; + RecordBitset m_autonomousToAuthority; uint32_t m_authorityToClientConsumedBits = 0; uint32_t m_authorityToServerConsumedBits = 0; diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityAuthorityTracker.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityAuthorityTracker.cpp index e54540da39..a37d444046 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityAuthorityTracker.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityAuthorityTracker.cpp @@ -103,7 +103,7 @@ namespace Multiplayer { networkRole = netBindComponent->GetNetEntityRole(); } - if (networkRole != NetEntityRole::ClientAutonomous) + if (networkRole != NetEntityRole::Autonomous) { AZ_Assert ( @@ -118,7 +118,7 @@ namespace Multiplayer } else { - AZLOG(NET_AuthTracker, "AuthTracker: Skipping timeout for ClientAutonomous networkEntityId %u", aznumeric_cast(entityHandle.GetNetEntityId())); + AZLOG(NET_AuthTracker, "AuthTracker: Skipping timeout for Autonomous networkEntityId %u", aznumeric_cast(entityHandle.GetNetEntityId())); } } } @@ -152,7 +152,7 @@ namespace Multiplayer { networkRole = netBindComponent->GetNetEntityRole(); } - if (networkRole == NetEntityRole::ServerAuthority) + if (networkRole == NetEntityRole::Authority) { return m_networkEntityManager.GetHostId(); } @@ -205,7 +205,7 @@ namespace Multiplayer { networkRole = netBindComponent->GetNetEntityRole(); } - if (networkRole != NetEntityRole::ServerAuthority) + if (networkRole != NetEntityRole::Authority) { AZLOG_ERROR ( diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp index 64bf9db0c0..d8d2a3222c 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp @@ -181,7 +181,7 @@ namespace Multiplayer void NetworkEntityManager::HandleLocalRpcMessage(NetworkEntityRpcMessage& message) { - AZ_Assert(message.GetRpcDeliveryType() == RpcDeliveryType::ServerSimulationToServerAuthority, "Only ServerSimulationToServerAuthority rpc messages can be locally deferred"); + AZ_Assert(message.GetRpcDeliveryType() == RpcDeliveryType::ServerToAuthority, "Only ServerToAuthority rpc messages can be locally deferred"); m_localDeferredRpcMessages.emplace_back(AZStd::move(message)); } diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h index dfb4cc855a..503a5900bd 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h @@ -56,8 +56,8 @@ namespace Multiplayer RpcDeliveryType GetRpcDeliveryType() const; //! Sets the current value for RpcDeliveryType. - //! @param a_Value the value to set RpcDeliveryType to - void SetRpcDeliveryType(RpcDeliveryType a_Value); + //! @param value the value to set RpcDeliveryType to + void SetRpcDeliveryType(RpcDeliveryType value); //! Gets the current value of EntityId. //! @return the current value of EntityId @@ -72,7 +72,7 @@ namespace Multiplayer uint8_t GetRpcMessageType() const; //! Writes the data contained inside a_Params to this NetworkEntityRpcMessage's blob buffer. - //! @param a_Params the parameters to save inside this NetworkEntityRpcMessage instance + //! @param params the parameters to save inside this NetworkEntityRpcMessage instance bool SetRpcParams(IRpcParamStruct& params); //! Reads the data contained inside this NetworkEntityRpcMessage's blob buffer and stores them in outParams. diff --git a/Gems/Multiplayer/Code/Source/NetworkInput/NetworkInputChild.h b/Gems/Multiplayer/Code/Source/NetworkInput/NetworkInputChild.h index 5b001ebf25..18b518f19f 100644 --- a/Gems/Multiplayer/Code/Source/NetworkInput/NetworkInputChild.h +++ b/Gems/Multiplayer/Code/Source/NetworkInput/NetworkInputChild.h @@ -36,7 +36,7 @@ namespace Multiplayer const NetworkInput& GetNetworkInput() const; NetworkInput& GetNetworkInput(); - bool Serialize(AzNetworking::ISerializer& a_Serializer); + bool Serialize(AzNetworking::ISerializer& serializer); private: ConstNetworkEntityHandle m_owner; NetworkInput m_networkInput; diff --git a/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.h b/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.h index bffc24c622..5e15810a7f 100644 --- a/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.h +++ b/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.h @@ -33,7 +33,7 @@ namespace Multiplayer //! Constructor. //! @param connectionId the connectionId of the connection that owns the object. - RewindableObject(AzNetworking::ConnectionId owningConnectionId); + RewindableObject(const BASE_TYPE& value); //! Copy construct from underlying base type. //! @param value base type value to construct from @@ -52,6 +52,10 @@ namespace Multiplayer //! @param rhs rewindable history buffer to assign from RewindableObject& operator = (const RewindableObject& rhs); + //! Sets the owning connectionId for the given rewindable object instance. + //! @param owningConnectionId the new connectionId to use as the owning connectionId. + void SetOwningConnectionId(AzNetworking::ConnectionId owningConnectionId); + //! Const base type operator. //! @return value in const base type form operator const BASE_TYPE&() const; @@ -106,4 +110,9 @@ namespace Multiplayer }; } +namespace AZ +{ + AZ_TYPE_INFO_TEMPLATE(Multiplayer::RewindableObject, "{B2937B44-FEE1-4277-B1E0-863DE76D363F}", AZ_TYPE_INFO_TYPENAME, AZ_TYPE_INFO_AUTO); +} + #include diff --git a/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.inl b/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.inl index 9838a2364b..d5936e6718 100644 --- a/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.inl +++ b/Gems/Multiplayer/Code/Source/NetworkTime/RewindableObject.inl @@ -15,10 +15,9 @@ namespace Multiplayer { template - inline RewindableObject::RewindableObject(AzNetworking::ConnectionId owningConnectionId) - : m_owningConnectionId(owningConnectionId) + inline RewindableObject::RewindableObject(const BASE_TYPE& value) { - m_history.fill(BASE_TYPE()); + m_history.fill(value); } template @@ -53,6 +52,12 @@ namespace Multiplayer return *this; } + template + inline void RewindableObject::SetOwningConnectionId(AzNetworking::ConnectionId owningConnectionId) + { + m_owningConnectionId = owningConnectionId; + } + template inline RewindableObject::operator const BASE_TYPE& () const { diff --git a/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.cpp b/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.cpp index 7ba0b6958b..b23dc7f119 100644 --- a/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.cpp +++ b/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.cpp @@ -165,8 +165,8 @@ namespace Multiplayer } // Add in Autonomous Entities - // Note: Do not add any ClientSimulation entities after this point, otherwise you stomp over the ClientAutonomous mode - m_replicationSet[m_controlledEntity] = { NetEntityRole::ClientAutonomous, 1.0f }; // Always replicate autonomous entities + // Note: Do not add any Client entities after this point, otherwise you stomp over the Autonomous mode + m_replicationSet[m_controlledEntity] = { NetEntityRole::Autonomous, 1.0f }; // Always replicate autonomous entities //auto hierarchyController = FindController(m_ControlledEntity); //if (hierarchyController != nullptr) @@ -277,7 +277,7 @@ namespace Multiplayer if (!sv_ReplicateServerProxies) { NetBindComponent* netBindComponent = entityHandle.GetNetBindComponent(); - if ((netBindComponent != nullptr) && (netBindComponent->GetNetEntityRole() == NetEntityRole::ServerSimulation)) + if ((netBindComponent != nullptr) && (netBindComponent->GetNetEntityRole() == NetEntityRole::Server)) { // Proxy replication disabled return; @@ -296,28 +296,28 @@ namespace Multiplayer m_replicationSet.erase(removeEnt); } m_candidateQueue.push(PrioritizedReplicationCandidate(entityHandle, priority)); - m_replicationSet[entityHandle] = { NetEntityRole::ClientSimulation, priority }; + m_replicationSet[entityHandle] = { NetEntityRole::Client, priority }; } } - //void ServerToClientReplicationWindow::CollectControlledEntitiesRecursive(ReplicationSet& a_ReplicationSet, EntityHierarchyComponent::Authority& a_HierarchyController) + //void ServerToClientReplicationWindow::CollectControlledEntitiesRecursive(ReplicationSet& replicationSet, EntityHierarchyComponent::Authority& hierarchyController) //{ - // auto controlledEnts = a_HierarchyController.GetChildrenRelatedEntities(); + // auto controlledEnts = hierarchyController.GetChildrenRelatedEntities(); // for (auto& controlledEnt : controlledEnts) // { // AZ_Assert(controlledEnt != nullptr, "We have lost a controlled entity unexpectedly"); - // a_ReplicationSet[controlledEnt.GetConstEntity()] = EntityReplicationData(EntityNetworkRoleT::e_ClientAutonomous, EntityPrioritySystem::k_MaxPriority); // Always replicate controlled entities + // replicationSet[controlledEnt.GetConstEntity()] = EntityReplicationData(EntityNetworkRoleT::e_Autonomous, EntityPrioritySystem::k_MaxPriority); // Always replicate controlled entities // auto hierarchyController = controlledEnt.FindController(); // if (hierarchyController != nullptr) // { - // CollectControlledEntitiesRecursive(a_ReplicationSet, *hierarchyController); + // CollectControlledEntitiesRecursive(replicationSet, *hierarchyController); // } // } //} - //void ServerToClientReplicationWindow::OnAddFilteredEntity(NetEntityId a_FitleredEntityId) + //void ServerToClientReplicationWindow::OnAddFilteredEntity(NetEntityId filteredEntityId) //{ - // ConstEntityPtr filteredEntity = gNovaGame->GetEntityManager().GetEntity(a_FitleredEntityId); - // m_replicationSet.erase(filteredEntity); + // ConstEntityPtr filteredEntity = gNovaGame->GetEntityManager().GetEntity(filteredEntityId); + // m_replicationSet.erase(filteredEntityId); //} } diff --git a/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.h b/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.h index 6f62b5cde4..4dad4bd01f 100644 --- a/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.h +++ b/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToClientReplicationWindow.h @@ -62,26 +62,26 @@ namespace Multiplayer void OnEntityDeactivated(const AZ::EntityId&) override; //! @} - //void CollectControlledEntitiesRecursive(ReplicationSet& a_ReplicationSet, EntityHierarchyComponent::Authority& a_HierarchyController); - //void OnAddFilteredEntity(EntityIdT a_FitleredEntityId); + //void CollectControlledEntitiesRecursive(ReplicationSet& replicationSet, EntityHierarchyComponent::Authority& hierarchyController); + //void OnAddFilteredEntity(NetEntityId filteredEntityId); void EvaluateConnection(); void AddEntityToReplicationSet(ConstNetworkEntityHandle& entityHandle, float priority, float distanceSquared); ServerToClientReplicationWindow& operator=(const ServerToClientReplicationWindow&) = delete; - NetworkEntityHandle m_controlledEntity; - AZ::TransformInterface* m_controlledEntityTransform = nullptr; - - //FilteredEntityComponent::Authority* mp_ControlledFilteredEntityComponent = nullptr; - //NetSystemComponent* mp_ControlledNetSystemComponent = nullptr; - // sorted in reverse, lowest priority is the top() ReplicationCandidateQueue m_candidateQueue; ReplicationSet m_replicationSet; AZ::ScheduledEvent m_updateWindowEvent; + NetworkEntityHandle m_controlledEntity; + AZ::TransformInterface* m_controlledEntityTransform = nullptr; + + //FilteredEntityComponent::Authority* m_controlledFilteredEntityComponent = nullptr; + //NetBindComponent* m_controlledNetBindComponent = nullptr; + const AzNetworking::IConnection* m_connection = nullptr; float m_minPriorityReplicated = 0.0f; ///< Lowest replicated entity priority in last update diff --git a/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToServerReplicationWindow.cpp b/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToServerReplicationWindow.cpp index c94e53528f..1bc99e921d 100644 --- a/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToServerReplicationWindow.cpp +++ b/Gems/Multiplayer/Code/Source/ReplicationWindows/ServerToServerReplicationWindow.cpp @@ -55,14 +55,14 @@ namespace Multiplayer if (netBindComponent != nullptr) { NetEntityRole networkRole = netBindComponent->GetNetEntityRole(); - if (networkRole == NetEntityRole::ServerAuthority) + if (networkRole == NetEntityRole::Authority) { const AZ::Entity* entity = entityHandle.GetEntity(); AZ::TransformInterface* transformInterface = entity->GetTransform(); AZ::Vector3 entityPosition = transformInterface->GetWorldTranslation(); if (m_aabb.Contains(entityPosition)) { - outNetworkRole = Multiplayer::NetEntityRole::ServerSimulation; + outNetworkRole = Multiplayer::NetEntityRole::Server; return true; } } @@ -88,9 +88,9 @@ namespace Multiplayer if (netBindComponent != nullptr) { NetEntityRole networkRole = netBindComponent->GetNetEntityRole(); - if (networkRole == NetEntityRole::ServerAuthority) + if (networkRole == NetEntityRole::Authority) { - m_replicationSet[entityHandle] = { NetEntityRole::ServerSimulation, 0.0f }; // Note, server replication does not use priority + m_replicationSet[entityHandle] = { NetEntityRole::Server, 0.0f }; // Note, server replication does not use priority } } } @@ -130,7 +130,7 @@ namespace Multiplayer NetEntityRole networkRole = NetEntityRole::InvalidRole; if (IsInWindow(entityHandle, networkRole)) { - m_replicationSet[entityHandle] = { NetEntityRole::ServerSimulation, 0.0f }; + m_replicationSet[entityHandle] = { NetEntityRole::Server, 0.0f }; } } diff --git a/Gems/Multiplayer/Code/Tests/RewindableObjectTests.cpp b/Gems/Multiplayer/Code/Tests/RewindableObjectTests.cpp index d9c30e35b1..d2d41723eb 100644 --- a/Gems/Multiplayer/Code/Tests/RewindableObjectTests.cpp +++ b/Gems/Multiplayer/Code/Tests/RewindableObjectTests.cpp @@ -31,7 +31,7 @@ namespace UnitTest TEST_F(RewindableObjectTests, BasicTests) { - Multiplayer::RewindableObject test(AzNetworking::InvalidConnectionId); + Multiplayer::RewindableObject test(0); for (uint32_t i = 0; i < 16; ++i) { @@ -62,7 +62,7 @@ namespace UnitTest TEST_F(RewindableObjectTests, OverflowTests) { - Multiplayer::RewindableObject test(AzNetworking::InvalidConnectionId); + Multiplayer::RewindableObject test(0); for (uint32_t i = 0; i < RewindableBufferFrames; ++i) { @@ -85,7 +85,7 @@ namespace UnitTest TEST_F(RewindableObjectTests, ComplexObject) { - Multiplayer::RewindableObject test(AzNetworking::InvalidConnectionId); + Multiplayer::RewindableObject test({ 0 }); for (uint32_t i = 0; i < RewindableBufferFrames; ++i) { @@ -104,7 +104,7 @@ namespace UnitTest TEST_F(RewindableObjectTests, TestBackfillOnLargeTimestep) { - Multiplayer::RewindableObject test(AzNetworking::InvalidConnectionId); + Multiplayer::RewindableObject test(0); Multiplayer::ScopedAlterTime time1(static_cast(0), AzNetworking::InvalidConnectionId); test = 1; @@ -123,7 +123,7 @@ namespace UnitTest TEST_F(RewindableObjectTests, TestMassiveValueOverflow) { - Multiplayer::RewindableObject test(AzNetworking::InvalidConnectionId); + Multiplayer::RewindableObject test(0); for (uint32_t i = 0; i < 1000; ++i) { diff --git a/Gems/Multiplayer/Code/multiplayer_files.cmake b/Gems/Multiplayer/Code/multiplayer_files.cmake index c95ab21744..40ef7ee988 100644 --- a/Gems/Multiplayer/Code/multiplayer_files.cmake +++ b/Gems/Multiplayer/Code/multiplayer_files.cmake @@ -16,13 +16,20 @@ set(FILES Source/MultiplayerSystemComponent.cpp Source/MultiplayerSystemComponent.h Source/MultiplayerTypes.h + Source/AutoGen/AutoComponent_Header.jinja + Source/AutoGen/AutoComponent_Source.jinja + Source/AutoGen/AutoComponent_Common.jinja + Source/AutoGen/AutoComponentTypes_Header.jinja Source/AutoGen/Multiplayer.AutoPackets.xml + Source/AutoGen/NetworkTransformComponent.AutoComponent.xml Source/Components/MultiplayerComponent.cpp Source/Components/MultiplayerComponent.h Source/Components/MultiplayerController.cpp Source/Components/MultiplayerController.h Source/Components/NetBindComponent.cpp Source/Components/NetBindComponent.h + Source/Components/NetworkTransformComponent.cpp + Source/Components/NetworkTransformComponent.h Source/ConnectionData/IConnectionData.h Source/ConnectionData/ServerToClientConnectionData.cpp Source/ConnectionData/ServerToClientConnectionData.h diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp index 0b297d8aad..05ee4af1e9 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp @@ -27,8 +27,9 @@ #include #include -#include +#include #include +#include namespace NvCloth { @@ -637,8 +638,15 @@ namespace NvCloth // Gravity and scale if (m_config.IsUsingWorldBusGravity()) { - AZ::Vector3 gravity(0.0f, 0.0f, -9.81f); - Physics::WorldRequestBus::EventResult(gravity, Physics::DefaultPhysicsWorldId, &Physics::WorldRequests::GetGravity); + AZ::Vector3 gravity = AzPhysics::DefaultGravity; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SceneHandle defaultScene = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + if (defaultScene != AzPhysics::InvalidSceneHandle) + { + gravity = sceneInterface->GetGravity(defaultScene); + } + } clothConfig->SetGravity(gravity * m_config.m_gravityScale); } else diff --git a/Gems/NvCloth/Code/Source/System/FabricCooker.cpp b/Gems/NvCloth/Code/Source/System/FabricCooker.cpp index 36057d6bee..5a74db6fee 100644 --- a/Gems/NvCloth/Code/Source/System/FabricCooker.cpp +++ b/Gems/NvCloth/Code/Source/System/FabricCooker.cpp @@ -56,7 +56,7 @@ namespace NvCloth } template - void CopyNvRange(const nv::cloth::Range& nvRange, AZStd::vector& azVector) + static void CopyNvRange(const nv::cloth::Range& nvRange, AZStd::vector& azVector) { azVector.resize(nvRange.size()); AZStd::copy(nvRange.begin(), nvRange.end(), azVector.begin()); diff --git a/Gems/NvCloth/Code/Tests/NvClothEditorTestEnvironment.cpp b/Gems/NvCloth/Code/Tests/NvClothEditorTestEnvironment.cpp index 0a875ee7dd..e65385722d 100644 --- a/Gems/NvCloth/Code/Tests/NvClothEditorTestEnvironment.cpp +++ b/Gems/NvCloth/Code/Tests/NvClothEditorTestEnvironment.cpp @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include @@ -29,6 +29,24 @@ namespace UnitTest { + class NvClothToolsTestApplication + : public ToolsTestApplication + { + public: + explicit NvClothToolsTestApplication(AZStd::string applicationName) + : ToolsTestApplication(applicationName) + { + } + + protected: + bool IsPrefabSystemEnabled() const override + { + // The NvCloth unit tests currently have a crash on teardown when the prefab system is enabled, + // so they can only be run with prefabs disabled at this time. + return false; + } + }; + //! Sets up gem test environment, required components, and shared objects used by cloth (e.g. FabricCooker) for all test cases. class NvClothEditorTestEnvironment : public AZ::Test::GemTestEnvironment @@ -102,7 +120,7 @@ namespace UnitTest AZ::ComponentApplication* NvClothEditorTestEnvironment::CreateApplicationInstance() { - return aznew AzToolsFramework::ToolsApplication; + return aznew NvClothToolsTestApplication("NvClothEditorTests"); } } // namespace UnitTest diff --git a/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp b/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp index c618fd6044..16a5d2efa3 100644 --- a/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp +++ b/Gems/NvCloth/Code/Tests/System/FabricCookerTest.cpp @@ -30,8 +30,6 @@ namespace NvCloth const AZStd::vector& indices, const AZ::Vector3& fabricGravity, bool useGeodesicTether); - template - void CopyNvRange(const nv::cloth::Range& nvRange, AZStd::vector& azVector); void CopyCookedData(FabricCookedData::InternalCookedData& azCookedData, const nv::cloth::CookedData& nvCookedData); AZStd::optional Cook( const AZStd::vector& particles, @@ -123,41 +121,6 @@ namespace UnitTest EXPECT_NE(fabricId1, fabricId2); } - TEST(NvClothSystem, FactoryCooker_CopyNvRangeEmpty_CopiedDataIsEmpty) - { - const nv::cloth::Range nvRange; - - AZStd::vector azVector; - NvCloth::Internal::CopyNvRange(nvRange, azVector); - - EXPECT_TRUE(azVector.empty()); - ExpectEq(azVector, nvRange); - } - - TEST(NvClothSystem, FactoryCooker_CopyNvRangeU32Data_CopiedDataMatchesSource) - { - const AZ::u32 data[] = { 0, 2, 45, 64, 125 }; - const size_t numDataElements = sizeof(data) / sizeof(data[0]); - const nv::cloth::Range nvRange(data, data + numDataElements); - - AZStd::vector azVector; - NvCloth::Internal::CopyNvRange(nvRange, azVector); - - ExpectEq(azVector, nvRange); - } - - TEST(NvClothSystem, FactoryCooker_CopyNvRangeFloatData_CopiedDataMatchesSource) - { - const float data[] = { 0.0f, 1.5f, -3.4f, 3.1f, 400.0f }; - const size_t numDataElements = sizeof(data) / sizeof(data[0]); - const nv::cloth::Range nvRange(data, data + numDataElements); - - AZStd::vector azVector; - NvCloth::Internal::CopyNvRange(nvRange, azVector); - - ExpectEq(azVector, nvRange); - } - TEST(NvClothSystem, FactoryCooker_CopyInternalCookedDataEmpty_CopiedDataIsEmpty) { nv::cloth::CookedData nvCookedData; diff --git a/Gems/PhysX/Code/CMakeLists.txt b/Gems/PhysX/Code/CMakeLists.txt index 2befecf7da..e9a60ab903 100644 --- a/Gems/PhysX/Code/CMakeLists.txt +++ b/Gems/PhysX/Code/CMakeLists.txt @@ -156,7 +156,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) PRIVATE AZ::AzTestShared AZ::AzTest - AZ::AzPhysicsTests Gem::PhysX.Static RUNTIME_DEPENDENCIES Gem::LmbrCentral @@ -188,7 +187,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) 3rdParty::Qt::Test AZ::AzTestShared AZ::AzTest - AZ::AzPhysicsTests AZ::AzToolsFrameworkTestCommon Gem::PhysX.Static Gem::PhysX.Editor.Static diff --git a/Gems/PhysX/Code/Editor/CollisionGroupWidget.cpp b/Gems/PhysX/Code/Editor/CollisionGroupWidget.cpp index 3607910524..9b7285ed12 100644 --- a/Gems/PhysX/Code/Editor/CollisionGroupWidget.cpp +++ b/Gems/PhysX/Code/Editor/CollisionGroupWidget.cpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace PhysX { @@ -98,19 +99,19 @@ namespace PhysX AzPhysics::CollisionGroups::Id CollisionGroupWidget::GetGroupFromName(const AZStd::string& groupName) { - const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetCollisionConfiguration(); + const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetConfiguration()->m_collisionConfig; return configuration.m_collisionGroups.FindGroupIdByName(groupName); } AZStd::string CollisionGroupWidget::GetNameFromGroup(const AzPhysics::CollisionGroups::Id& collisionGroup) { - const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetCollisionConfiguration(); + const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetConfiguration()->m_collisionConfig; return configuration.m_collisionGroups.FindGroupNameById(collisionGroup); } AZStd::vector CollisionGroupWidget::GetGroupNames() { - const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetCollisionConfiguration(); + const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetConfiguration()->m_collisionConfig; const AZStd::vector& collisionGroupPresets = configuration.m_collisionGroups.GetPresets(); AZStd::vector groupNames; diff --git a/Gems/PhysX/Code/Editor/CollisionLayerWidget.cpp b/Gems/PhysX/Code/Editor/CollisionLayerWidget.cpp index 5b4ebc5dde..1b9a87fb17 100644 --- a/Gems/PhysX/Code/Editor/CollisionLayerWidget.cpp +++ b/Gems/PhysX/Code/Editor/CollisionLayerWidget.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -96,20 +97,20 @@ namespace PhysX AzPhysics::CollisionLayer CollisionLayerWidget::GetLayerFromName(const AZStd::string& layerName) { - const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetCollisionConfiguration(); + const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetConfiguration()->m_collisionConfig; return configuration.m_collisionLayers.GetLayer(layerName); } AZStd::string CollisionLayerWidget::GetNameFromLayer(const AzPhysics::CollisionLayer& layer) { - const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetCollisionConfiguration(); + const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetConfiguration()->m_collisionConfig; return configuration.m_collisionLayers.GetName(layer); } AZStd::vector CollisionLayerWidget::GetLayerNames() { AZStd::vector layerNames; - const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetCollisionConfiguration(); + const AzPhysics::CollisionConfiguration& configuration = AZ::Interface::Get()->GetConfiguration()->m_collisionConfig; for (AZ::u8 layer = 0; layer < AzPhysics::CollisionLayers::MaxCollisionLayers; ++layer) { diff --git a/Gems/PhysX/Code/Editor/ConfigurationWidget.cpp b/Gems/PhysX/Code/Editor/ConfigurationWidget.cpp index 1a9da16799..1c6e6d1991 100644 --- a/Gems/PhysX/Code/Editor/ConfigurationWidget.cpp +++ b/Gems/PhysX/Code/Editor/ConfigurationWidget.cpp @@ -47,15 +47,13 @@ namespace PhysX verticalLayout->addWidget(m_tabs); connect(m_settings, &SettingsWidget::onValueChanged, - this, [this](const AZ::Data::Asset& materialLibrary, + this, [this](const PhysX::PhysXSystemConfiguration& physxSystemConfiguration, const AzPhysics::SceneConfiguration& defaultSceneConfiguration, - const Debug::DebugDisplayData& debugDisplayData, - const PhysX::WindConfiguration& windConfiguration) + const Debug::DebugDisplayData& debugDisplayData) { - m_physXSystemConfiguration.m_defaultMaterialLibrary = materialLibrary; + m_physXSystemConfiguration = physxSystemConfiguration; m_defaultSceneConfiguration = defaultSceneConfiguration; m_physXDebugConfiguration.m_debugDisplayData = debugDisplayData; - m_physXSystemConfiguration.m_windConfiguration = windConfiguration; emit onConfigurationChanged(m_physXSystemConfiguration, m_physXDebugConfiguration, m_defaultSceneConfiguration); }); @@ -90,7 +88,7 @@ namespace PhysX m_physXSystemConfiguration = physXSystemConfiguration; m_defaultSceneConfiguration = defaultSceneConfiguration; m_physXDebugConfiguration = physXDebugConfiguration; - m_settings->SetValue(m_physXSystemConfiguration.m_defaultMaterialLibrary, m_defaultSceneConfiguration, m_physXDebugConfiguration.m_debugDisplayData, m_physXSystemConfiguration.m_windConfiguration); + m_settings->SetValue(m_physXSystemConfiguration, m_defaultSceneConfiguration, m_physXDebugConfiguration.m_debugDisplayData); m_collisionFiltering->SetConfiguration(m_physXSystemConfiguration.m_collisionConfig.m_collisionLayers, m_physXSystemConfiguration.m_collisionConfig.m_collisionGroups); m_pvd->SetValue(m_physXDebugConfiguration.m_pvdConfigurationData); } diff --git a/Gems/PhysX/Code/Editor/ConfigurationWidget.h b/Gems/PhysX/Code/Editor/ConfigurationWidget.h index 082169f4b3..dc4c657b62 100644 --- a/Gems/PhysX/Code/Editor/ConfigurationWidget.h +++ b/Gems/PhysX/Code/Editor/ConfigurationWidget.h @@ -16,7 +16,6 @@ #include #include #include -#include #endif namespace AzQtComponents diff --git a/Gems/PhysX/Code/Editor/DebugDraw.cpp b/Gems/PhysX/Code/Editor/DebugDraw.cpp index d0ff325007..fffb1e1350 100644 --- a/Gems/PhysX/Code/Editor/DebugDraw.cpp +++ b/Gems/PhysX/Code/Editor/DebugDraw.cpp @@ -456,7 +456,7 @@ namespace PhysX const AZ::Vector3& colliderScale) const { const float scaledSphereRadius = - (Utils::GetNonUniformScale(m_entityId) * colliderScale).GetMaxElement() * sphereShapeConfig.m_radius; + (Utils::GetTransformScale(m_entityId) * colliderScale).GetMaxElement() * sphereShapeConfig.m_radius; debugDisplay.PushMatrix(GetColliderLocalTransform(colliderConfig, colliderScale)); debugDisplay.SetColor(CalcDebugColor(colliderConfig)); @@ -473,7 +473,7 @@ namespace PhysX const bool forceUniformScaling) const { // The resulting scale is the product of the scale in the entity's transform and the collider scale. - const AZ::Vector3 resultantScale = Utils::GetNonUniformScale(m_entityId) * colliderScale; + const AZ::Vector3 resultantScale = Utils::GetTransformScale(m_entityId) * colliderScale; // Scale the box parameters using the desired method (uniform or non-uniform). AZ::Vector3 scaledBoxParameters = boxShapeConfig.m_dimensions * 0.5f; @@ -508,7 +508,7 @@ namespace PhysX AZStd::vector indices; // The resulting scale is the product of the scale in the entity's transform and the collider scale. - const AZ::Vector3 resultantScale = Utils::GetNonUniformScale(m_entityId) * colliderScale; + const AZ::Vector3 resultantScale = Utils::GetTransformScale(m_entityId) * colliderScale; // Scale the capsule parameters using the desired method (uniform or non-uniform). AZ::Vector2 scaledCapsuleParameters = AZ::Vector2(capsuleShapeConfig.m_radius, capsuleShapeConfig.m_height); @@ -640,7 +640,7 @@ namespace PhysX { // Apply entity world transform scale to collider offset const AZ::Vector3 translation = - colliderConfig.m_position * Utils::GetNonUniformScale(m_entityId) * colliderScale; + colliderConfig.m_position * Utils::GetTransformScale(m_entityId) * colliderScale; return AZ::Transform::CreateFromQuaternionAndTranslation( colliderConfig.m_rotation, translation); diff --git a/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.cpp b/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.cpp index cb6c828b3c..60efb0c2ea 100644 --- a/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.cpp +++ b/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.cpp @@ -266,7 +266,7 @@ namespace PolygonPrismMeshUtils return m_edgeQueue; } - const AZStd::vector& Mesh2D::GetDebugDrawPoints(float height, float scale) const + const AZStd::vector& Mesh2D::GetDebugDrawPoints(float height, const AZ::Vector3& nonUniformScale) const { if (m_debugDrawDirty) { @@ -281,10 +281,10 @@ namespace PolygonPrismMeshUtils for (int edgeIndex = 0; edgeIndex < numEdges; edgeIndex++) { PolygonPrismMeshUtils::HalfEdge* nextEdge = currentEdge->m_next; - const AZ::Vector3 v1(scale * currentEdge->m_origin.GetX(), scale * currentEdge->m_origin.GetY(), 0.0f); - const AZ::Vector3 v2(scale * currentEdge->m_origin.GetX(), scale * currentEdge->m_origin.GetY(), scale * height); - const AZ::Vector3 v3(scale * nextEdge->m_origin.GetX(), scale * nextEdge->m_origin.GetY(), 0.0f); - const AZ::Vector3 v4(scale * nextEdge->m_origin.GetX(), scale * nextEdge->m_origin.GetY(), scale * height); + const auto v1 = nonUniformScale * AZ::Vector3(currentEdge->m_origin.GetX(), currentEdge->m_origin.GetY(), 0.0f); + const auto v2 = nonUniformScale * AZ::Vector3(currentEdge->m_origin.GetX(), currentEdge->m_origin.GetY(), height); + const auto v3 = nonUniformScale * AZ::Vector3(nextEdge->m_origin.GetX(), nextEdge->m_origin.GetY(), 0.0f); + const auto v4 = nonUniformScale * AZ::Vector3(nextEdge->m_origin.GetX(), nextEdge->m_origin.GetY(), height); m_debugDrawPoints.insert(m_debugDrawPoints.end(), { v1, v2, v1, v3, v2, v4 }); diff --git a/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.h b/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.h index f2d0ec29b2..70ea4f156f 100644 --- a/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.h +++ b/Gems/PhysX/Code/Editor/PolygonPrismMeshUtils.h @@ -97,7 +97,7 @@ namespace PolygonPrismMeshUtils const InternalEdgePriorityQueue& GetInternalEdges() const; - const AZStd::vector& GetDebugDrawPoints(float height, float scale) const; + const AZStd::vector& GetDebugDrawPoints(float height, const AZ::Vector3& nonUniformScale) const; void SetDebugDrawDirty(); @@ -119,4 +119,4 @@ namespace PolygonPrismMeshUtils //! Used to track when to recalculate the cached debug draw vertices. mutable bool m_debugDrawDirty = true; }; -} // namespace PolygonPrismMeshUtils \ No newline at end of file +} // namespace PolygonPrismMeshUtils diff --git a/Gems/PhysX/Code/Editor/PvdWidget.h b/Gems/PhysX/Code/Editor/PvdWidget.h index 575588cf86..8d70f9120a 100644 --- a/Gems/PhysX/Code/Editor/PvdWidget.h +++ b/Gems/PhysX/Code/Editor/PvdWidget.h @@ -13,7 +13,6 @@ #if !defined(Q_MOC_RUN) #include -#include #include #include #endif @@ -54,7 +53,6 @@ namespace PhysX AzToolsFramework::ReflectedPropertyEditor* m_propertyEditor; DocumentationLinkWidget* m_documentationLinkWidget; Debug::PvdConfiguration m_config; - Physics::WorldConfiguration m_worldConfiguration; }; } } diff --git a/Gems/PhysX/Code/Editor/SettingsWidget.cpp b/Gems/PhysX/Code/Editor/SettingsWidget.cpp index fede4e3b31..38022e8c92 100644 --- a/Gems/PhysX/Code/Editor/SettingsWidget.cpp +++ b/Gems/PhysX/Code/Editor/SettingsWidget.cpp @@ -32,22 +32,22 @@ namespace PhysX CreatePropertyEditor(this); } - void SettingsWidget::SetValue(const AZ::Data::Asset& materialLibrary, + void SettingsWidget::SetValue(const PhysX::PhysXSystemConfiguration& physxSystemConfiguration, const AzPhysics::SceneConfiguration& defaultSceneConfiguration, - const Debug::DebugDisplayData& debugDisplayData, - const PhysX::WindConfiguration& windConfiguration) + const Debug::DebugDisplayData& debugDisplayData) { - m_defaultPhysicsMaterialLibrary.m_asset = materialLibrary; + m_physxSystemConfiguration = physxSystemConfiguration; + m_defaultPhysicsMaterialLibrary.m_asset = m_physxSystemConfiguration.m_defaultMaterialLibrary; m_defaultSceneConfiguration = defaultSceneConfiguration; m_debugDisplayData = debugDisplayData; - m_windConfiguration = windConfiguration; blockSignals(true); m_propertyEditor->ClearInstances(); + m_propertyEditor->AddInstance(&m_physxSystemConfiguration); m_propertyEditor->AddInstance(&m_defaultPhysicsMaterialLibrary); - m_propertyEditor->AddInstance(&m_defaultSceneConfiguration.m_legacyConfiguration); + m_propertyEditor->AddInstance(&m_defaultSceneConfiguration); m_propertyEditor->AddInstance(&m_debugDisplayData); - m_propertyEditor->AddInstance(&m_windConfiguration); + m_propertyEditor->AddInstance(&m_physxSystemConfiguration.m_windConfiguration); m_propertyEditor->InvalidateAll(); blockSignals(false); } @@ -88,10 +88,10 @@ namespace PhysX void SettingsWidget::SetPropertyEditingComplete(AzToolsFramework::InstanceDataNode* /*node*/) { - emit onValueChanged(m_defaultPhysicsMaterialLibrary.m_asset, + m_physxSystemConfiguration.m_defaultMaterialLibrary = m_defaultPhysicsMaterialLibrary.m_asset; + emit onValueChanged(m_physxSystemConfiguration, m_defaultSceneConfiguration, - m_debugDisplayData, - m_windConfiguration + m_debugDisplayData ); } diff --git a/Gems/PhysX/Code/Editor/SettingsWidget.h b/Gems/PhysX/Code/Editor/SettingsWidget.h index a57eb8c272..78df72b6d3 100644 --- a/Gems/PhysX/Code/Editor/SettingsWidget.h +++ b/Gems/PhysX/Code/Editor/SettingsWidget.h @@ -14,7 +14,6 @@ #if !defined(Q_MOC_RUN) #include -#include #include #include #include @@ -37,16 +36,14 @@ namespace PhysX explicit SettingsWidget(QWidget* parent = nullptr); - void SetValue(const AZ::Data::Asset& materialLibrary, + void SetValue(const PhysX::PhysXSystemConfiguration& physxSystemConfiguration, const AzPhysics::SceneConfiguration& defaultSceneConfiguration, - const Debug::DebugDisplayData& debugDisplayData, - const PhysX::WindConfiguration& windConfiguration); + const Debug::DebugDisplayData& debugDisplayData); signals: - void onValueChanged(const AZ::Data::Asset& materialLibrary, + void onValueChanged(const PhysX::PhysXSystemConfiguration& physxSystemConfiguration, const AzPhysics::SceneConfiguration& defaultSceneConfiguration, - const Debug::DebugDisplayData& debugDisplayData, - const PhysX::WindConfiguration& windConfiguration); + const Debug::DebugDisplayData& debugDisplayData); private: void CreatePropertyEditor(QWidget* parent); @@ -60,9 +57,9 @@ namespace PhysX AzToolsFramework::ReflectedPropertyEditor* m_propertyEditor; DocumentationLinkWidget* m_documentationLinkWidget; Physics::DefaultMaterialLibraryAssetReflectionWrapper m_defaultPhysicsMaterialLibrary; + PhysX::PhysXSystemConfiguration m_physxSystemConfiguration; AzPhysics::SceneConfiguration m_defaultSceneConfiguration; Debug::DebugDisplayData m_debugDisplayData; - PhysX::WindConfiguration m_windConfiguration; }; } } diff --git a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp index e92189acbc..2f4b389795 100644 --- a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp +++ b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp @@ -15,9 +15,9 @@ #include "EditorSystemComponent.h" #include #include -#include -#include #include +#include +#include #include #include @@ -115,14 +115,9 @@ namespace PhysX if (auto* physicsSystem = AZ::Interface::Get()) { AzPhysics::SceneConfiguration editorWorldConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - editorWorldConfiguration.m_legacyId = Physics::EditorPhysicsWorldId; - editorWorldConfiguration.m_legacyConfiguration.m_fixedTimeStep = 0.0f; + editorWorldConfiguration.m_sceneName = AzPhysics::EditorPhysicsSceneName; editorWorldConfiguration.m_sceneName = "EditorScene"; m_editorWorldSceneHandle = physicsSystem->AddScene(editorWorldConfiguration); - if (AzPhysics::Scene* scene = physicsSystem->GetScene(m_editorWorldSceneHandle)) - { - scene->GetLegacyWorld()->SetEventHandler(this); - } } PhysX::RegisterConfigStringLineEditHandler(); // Register custom unique string line edit control @@ -142,41 +137,9 @@ namespace PhysX m_editorWorldSceneHandle = AzPhysics::InvalidSceneHandle; } - AZStd::shared_ptr EditorSystemComponent::GetEditorWorld() - { - if (auto* physicsSystem = AZ::Interface::Get()) - { - if (AzPhysics::Scene* scene = physicsSystem->GetScene(m_editorWorldSceneHandle)) - { - return scene->GetLegacyWorld(); - } - } - return nullptr; - } - - void EditorSystemComponent::OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), &Physics::TriggerNotifications::OnTriggerEnter, triggerEvent); - } - - void EditorSystemComponent::OnTriggerExit(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), &Physics::TriggerNotifications::OnTriggerExit, triggerEvent); - } - - void EditorSystemComponent::OnCollisionBegin(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionBegin, event); - } - - void EditorSystemComponent::OnCollisionPersist(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionPersist, event); - } - - void EditorSystemComponent::OnCollisionEnd(const Physics::CollisionEvent& event) + AzPhysics::SceneHandle EditorSystemComponent::GetEditorSceneHandle() const { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionEnd, event); + return m_editorWorldSceneHandle; } void EditorSystemComponent::OnStartPlayInEditorBegin() @@ -185,7 +148,7 @@ namespace PhysX { if (AzPhysics::Scene* scene = physicsSystem->GetScene(m_editorWorldSceneHandle)) { - scene->Enable(false); + scene->SetEnabled(false); } } } @@ -196,7 +159,7 @@ namespace PhysX { if (AzPhysics::Scene* scene = physicsSystem->GetScene(m_editorWorldSceneHandle)) { - scene->Enable(true); + scene->SetEnabled(true); } } } diff --git a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.h b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.h index 0436da277c..cba542ce84 100644 --- a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.h +++ b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.h @@ -14,10 +14,13 @@ #include #include -#include -#include #include +namespace AzPhysics +{ + struct TriggerEvent; +} + namespace PhysX { /// @@ -26,7 +29,6 @@ namespace PhysX class EditorSystemComponent : public AZ::Component , public Physics::EditorWorldBus::Handler - , private Physics::WorldEventHandler , private AzToolsFramework::EditorEntityContextNotificationBus::Handler { public: @@ -36,14 +38,9 @@ namespace PhysX EditorSystemComponent() = default; // Physics::EditorWorldBus - AZStd::shared_ptr GetEditorWorld() override; + AzPhysics::SceneHandle GetEditorSceneHandle() const override; private: - void OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) override; - void OnTriggerExit(const Physics::TriggerEvent& triggerEvent) override; - void OnCollisionBegin(const Physics::CollisionEvent& collisionEvent) override; - void OnCollisionPersist(const Physics::CollisionEvent& collisionEvent) override; - void OnCollisionEnd(const Physics::CollisionEvent& collisionEvent) override; static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { diff --git a/Gems/PhysX/Code/Editor/Source/Configuration/PhysXEditorSettingsRegistryManager.cpp b/Gems/PhysX/Code/Editor/Source/Configuration/PhysXEditorSettingsRegistryManager.cpp index a6bc12c0d1..d5bea11c04 100644 --- a/Gems/PhysX/Code/Editor/Source/Configuration/PhysXEditorSettingsRegistryManager.cpp +++ b/Gems/PhysX/Code/Editor/Source/Configuration/PhysXEditorSettingsRegistryManager.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include namespace PhysX @@ -78,30 +79,18 @@ namespace PhysX : PhysXSettingsRegistryManager() { // Resolve path to the .setreg files - auto* fileIo = AZ::IO::FileIOBase::GetInstance(); - if (fileIo == nullptr) - { - AZ_TracePrintf("PhysXSystemEditor", R"(Unable to resolve paths for PhysX configuration settings registry files, FileIOBase is null.\n)"); - return; - } - if (!fileIo->ResolvePath(m_physXConfigurationFilePath, "@devassets@/Registry/physxsystemconfiguration.setreg")) - { - AZ_TracePrintf("PhysXSystemEditor", R"(Unable to resolve path "%s" to the PhysX configuration settings registry file\n)", - m_physXConfigurationFilePath.c_str()); - return; - } - if (!fileIo->ResolvePath(m_defaultSceneConfigFilePath, "@devassets@/Registry/physxdefaultsceneconfiguration.setreg")) - { - AZ_TracePrintf("PhysXSystemEditor", R"(Unable to resolve path "%s" to the Default Scene Configuration settings registry file\n)", - m_defaultSceneConfigFilePath.c_str()); - return; - } - if(!fileIo->ResolvePath(m_debugConfigurationFilePath, "@devassets@/Registry/physxdebugconfiguration.setreg")) - { - AZ_TracePrintf("PhysXSystemEditor", R"(Unable to resolve path "%s" to the PhysX Debug Configuration settings registry file\n)", - m_debugConfigurationFilePath.c_str()); - return; - } + AZ::IO::FixedMaxPath projectPath = AZ::Utils::GetProjectPath(); + projectPath /= "Registry"; + + m_physXConfigurationFilePath = projectPath; + m_physXConfigurationFilePath /= "physxsystemconfiguration.setreg"; + + m_defaultSceneConfigFilePath = projectPath; + m_defaultSceneConfigFilePath /= "physxdefaultsceneconfiguration.setreg"; + + m_debugConfigurationFilePath = projectPath; + m_debugConfigurationFilePath /= "physxdebugconfiguration.setreg"; + m_initialized = true; } diff --git a/Gems/PhysX/Code/Include/PhysX/ColliderComponentBus.h b/Gems/PhysX/Code/Include/PhysX/ColliderComponentBus.h index 770849cd4a..fc06d69b4a 100644 --- a/Gems/PhysX/Code/Include/PhysX/ColliderComponentBus.h +++ b/Gems/PhysX/Code/Include/PhysX/ColliderComponentBus.h @@ -17,13 +17,11 @@ #include #include -#include -#include +#include namespace PhysX { class Shape; - class RigidBodyStatic; //! Messages serviced by a PhysX collider component. //! A PhysX collider component allows collision geometry to be attached to bodies in PhysX. @@ -46,8 +44,8 @@ namespace PhysX : public AZ::ComponentBus { public: - virtual Physics::RigidBodyConfiguration GetRigidBodyConfiguration() = 0; - virtual Physics::WorldBodyConfiguration GetWorldBodyConfiguration() = 0; + virtual AzPhysics::RigidBodyConfiguration GetRigidBodyConfiguration() = 0; + virtual AzPhysics::SimulatedBodyConfiguration GetSimulatedBodyConfiguration() = 0; }; using BodyConfigurationComponentBus = AZ::EBus; diff --git a/Gems/PhysX/Code/Include/PhysX/Configuration/PhysXConfiguration.h b/Gems/PhysX/Code/Include/PhysX/Configuration/PhysXConfiguration.h index cacd66fd20..936eadad18 100644 --- a/Gems/PhysX/Code/Include/PhysX/Configuration/PhysXConfiguration.h +++ b/Gems/PhysX/Code/Include/PhysX/Configuration/PhysXConfiguration.h @@ -30,7 +30,7 @@ namespace PhysX { public: AZ_CLASS_ALLOCATOR_DECL - AZ_TYPE_INFO(WindConfiguration, "{6EA3E646-ECDA-4044-912D-5722D5100066}"); + AZ_TYPE_INFO(PhysX::WindConfiguration, "{6EA3E646-ECDA-4044-912D-5722D5100066}"); static void Reflect(AZ::ReflectContext* context); /// Tag value that will be used to identify entities that provide global wind value. @@ -49,7 +49,7 @@ namespace PhysX struct PhysXSystemConfiguration : public AzPhysics::SystemConfiguration { AZ_CLASS_ALLOCATOR_DECL; - AZ_RTTI(PhysXSystemConfiguration, "{6E25A37B-2109-452C-97C9-B737CC72704F}"); + AZ_RTTI(PhysX::PhysXSystemConfiguration, "{6E25A37B-2109-452C-97C9-B737CC72704F}"); static void Reflect(AZ::ReflectContext* context); static PhysXSystemConfiguration CreateDefault(); diff --git a/Gems/PhysX/Code/Include/PhysX/HeightFieldAsset.cpp b/Gems/PhysX/Code/Include/PhysX/HeightFieldAsset.cpp new file mode 100644 index 0000000000..f314036301 --- /dev/null +++ b/Gems/PhysX/Code/Include/PhysX/HeightFieldAsset.cpp @@ -0,0 +1,73 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include + +namespace PhysX +{ + namespace Pipeline + { + HeightFieldAsset::~HeightFieldAsset() + { + ReleaseMemory(); + } + + physx::PxHeightField* HeightFieldAsset::GetHeightField() + { + return m_heightField; + } + + const physx::PxHeightField* HeightFieldAsset::GetHeightField() const + { + return m_heightField; + } + + void HeightFieldAsset::SetHeightField(physx::PxHeightField* heightField) + { + ReleaseMemory(); + + m_heightField = heightField; + m_status = AssetStatus::Ready; + } + + float HeightFieldAsset::GetMinHeight() const + { + return m_minHeight; + } + + void HeightFieldAsset::SetMinHeight(float height) + { + m_minHeight = height; + } + + float HeightFieldAsset::GetMaxHeight() const + { + return m_maxHeight; + } + + void HeightFieldAsset::SetMaxHeight(float height) + { + m_maxHeight = height; + } + + void HeightFieldAsset::ReleaseMemory() + { + if (m_heightField) + { + m_heightField->release(); + m_heightField = nullptr; + } + } + } // namespace Pipeline +} // namespace PhysX diff --git a/Gems/PhysX/Code/Include/PhysX/HeightFieldAsset.h b/Gems/PhysX/Code/Include/PhysX/HeightFieldAsset.h index 6a95ab8dd7..85a3803bd0 100644 --- a/Gems/PhysX/Code/Include/PhysX/HeightFieldAsset.h +++ b/Gems/PhysX/Code/Include/PhysX/HeightFieldAsset.h @@ -12,8 +12,7 @@ #pragma once -#include -#include +#include namespace physx { @@ -35,43 +34,21 @@ namespace PhysX AZ_CLASS_ALLOCATOR(HeightFieldAsset, AZ::SystemAllocator, 0); AZ_RTTI(HeightFieldAsset, "{B61189FE-B2D7-4AF1-8951-CB5C0F7834FC}", AZ::Data::AssetData); - ~HeightFieldAsset() - { - ReleaseMemory(); - } + ~HeightFieldAsset(); - physx::PxHeightField* GetHeightField() - { - return m_heightField; - } + physx::PxHeightField* GetHeightField(); - const physx::PxHeightField* GetHeightField() const - { - return m_heightField; - } + const physx::PxHeightField* GetHeightField() const; - void SetHeightField(physx::PxHeightField* heightField) - { - ReleaseMemory(); - - m_heightField = heightField; - m_status = AssetStatus::Ready; - } + void SetHeightField(physx::PxHeightField* heightField); - float GetMinHeight() const { return m_minHeight; } - void SetMinHeight(float height) { m_minHeight = height; } - float GetMaxHeight() const { return m_maxHeight; } - void SetMaxHeight(float height) { m_maxHeight = height; } + float GetMinHeight() const; + void SetMinHeight(float height); + float GetMaxHeight() const; + void SetMaxHeight(float height); private: - void ReleaseMemory() - { - if (m_heightField) - { - m_heightField->release(); - m_heightField = nullptr; - } - } + void ReleaseMemory(); physx::PxHeightField* m_heightField = nullptr; float m_minHeight = 0.0f; diff --git a/Gems/PhysX/Code/Include/PhysX/MeshColliderComponentBus.h b/Gems/PhysX/Code/Include/PhysX/MeshColliderComponentBus.h index 8e8b7e2061..33305be145 100644 --- a/Gems/PhysX/Code/Include/PhysX/MeshColliderComponentBus.h +++ b/Gems/PhysX/Code/Include/PhysX/MeshColliderComponentBus.h @@ -30,11 +30,6 @@ namespace PhysX /// @return Asset pointer to mesh asset. virtual AZ::Data::Asset GetMeshAsset() const = 0; - /// Gets the mesh triangles as a list of verts and indices. - /// @param verts The list of verts in the mesh - /// @param indices The ordering of the verts into triangles - virtual void GetStaticWorldSpaceMeshTriangles(AZStd::vector& verts, AZStd::vector& indices) const = 0; - /// Gets the material id from the material library for this entity. /// @return The asset ID to set it to. virtual Physics::MaterialId GetMaterialId() const = 0; @@ -54,4 +49,4 @@ namespace PhysX /// Bus to service the PhysX Mesh Collider Component event group. using MeshColliderComponentRequestsBus = AZ::EBus; -} // namespace PhysX \ No newline at end of file +} // namespace PhysX diff --git a/Gems/PhysX/Code/Include/PhysX/SystemComponentBus.h b/Gems/PhysX/Code/Include/PhysX/SystemComponentBus.h index 77742e300d..c87f29f439 100644 --- a/Gems/PhysX/Code/Include/PhysX/SystemComponentBus.h +++ b/Gems/PhysX/Code/Include/PhysX/SystemComponentBus.h @@ -13,8 +13,8 @@ #pragma once #include -#include #include +#include namespace AzPhysics { @@ -48,11 +48,6 @@ namespace PhysX virtual ~SystemRequests() = default; - /// Creates a new scene (world). - /// @param sceneDesc Scene descriptor specifying details of scene to be created. - /// @return Pointer to the created scene. - virtual physx::PxScene* CreateScene(physx::PxSceneDesc& sceneDesc) = 0; - /// Creates a new convex mesh. /// @param vertices Pointer to beginning of vertex data. /// @param vertexNum Number of vertices in mesh. diff --git a/Gems/PhysX/Code/Include/PhysX/TriggerEventCallback.h b/Gems/PhysX/Code/Include/PhysX/TriggerEventCallback.h deleted file mode 100644 index d8166ecf6f..0000000000 --- a/Gems/PhysX/Code/Include/PhysX/TriggerEventCallback.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -namespace physx -{ - struct PxTriggerPair; -} - -namespace Physics -{ - /// Created to decouple AzFramework/Physics from PhysX internals. - class ITriggerEventCallback - { - }; -} - -namespace PhysX -{ - /// A Low Level version of WorldEventHandler. Required for TouchBending - /// to detect when actors with colliders touch the proximity trigger. - class IPhysxTriggerEventCallback : public Physics::ITriggerEventCallback - { - public: - /** @brief Notifies that something touched a trigger. - * - * The TouchBending Gem will check if it owns the trigger object. - * If so, it will keep track of enter/exit count and kick off the - * creation of the Tree. - * - * @param triggerPair As provided by PhysX - * @returns TRUE if the callback is related with touch bending, otherwise - * return FALSE for further processing by World.cpp - */ - virtual bool OnTriggerCallback(physx::PxTriggerPair* triggerPair) = 0; - }; -} \ No newline at end of file diff --git a/Gems/PhysX/Code/Include/PhysX/UserDataTypes.h b/Gems/PhysX/Code/Include/PhysX/UserDataTypes.h index 29b4b0878b..606bdea10c 100644 --- a/Gems/PhysX/Code/Include/PhysX/UserDataTypes.h +++ b/Gems/PhysX/Code/Include/PhysX/UserDataTypes.h @@ -13,12 +13,17 @@ #pragma once #include -#include -#include #include #include +#include +#include #include +namespace AzPhysics +{ + struct SimulatedBody; +} + namespace PhysX { enum class BaseActorType : AZ::u32 @@ -69,11 +74,13 @@ namespace PhysX AZ::EntityId GetEntityId() const; void SetEntityId(AZ::EntityId entityId); - Physics::RigidBody* GetRigidBody() const; - void SetRigidBody(Physics::RigidBody* rigidBody); + AzPhysics::SimulatedBodyHandle GetBodyHandle() const; + + AzPhysics::RigidBody* GetRigidBody() const; + void SetRigidBody(AzPhysics::RigidBody* rigidBody); - Physics::RigidBodyStatic* GetRigidBodyStatic() const; - void SetRigidBodyStatic(Physics::RigidBodyStatic* rigidBody); + AzPhysics::StaticRigidBody* GetRigidBodyStatic() const; + void SetRigidBodyStatic(AzPhysics::StaticRigidBody* rigidBody); Physics::Character* GetCharacter() const; void SetCharacter(Physics::Character* character); @@ -81,7 +88,7 @@ namespace PhysX Physics::RagdollNode* GetRagdollNode() const; void SetRagdollNode(Physics::RagdollNode* ragdollNode); - Physics::WorldBody* GetWorldBody() const; + AzPhysics::SimulatedBody* GetWorldBody() const; private: @@ -89,8 +96,8 @@ namespace PhysX { AZ::EntityId m_entityId; // Possible references, only one of them is not nullptr - Physics::RigidBody* m_rigidBody = nullptr; - Physics::RigidBodyStatic* m_staticRigidBody = nullptr; + AzPhysics::RigidBody* m_rigidBody = nullptr; + AzPhysics::StaticRigidBody* m_staticRigidBody = nullptr; Physics::Character* m_character = nullptr; Physics::RagdollNode* m_ragdollNode = nullptr; void* m_externalUserData = nullptr; @@ -100,4 +107,4 @@ namespace PhysX }; } // namespace PhysX -#include \ No newline at end of file +#include diff --git a/Gems/PhysX/Code/Include/PhysX/UserDataTypes.inl b/Gems/PhysX/Code/Include/PhysX/UserDataTypes.inl index 51236ebbd2..a24fdb27b2 100644 --- a/Gems/PhysX/Code/Include/PhysX/UserDataTypes.inl +++ b/Gems/PhysX/Code/Include/PhysX/UserDataTypes.inl @@ -9,6 +9,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ +#include namespace PhysX { @@ -74,22 +75,32 @@ namespace PhysX m_payload.m_entityId = entityId; } - inline Physics::RigidBody* ActorData::GetRigidBody() const + inline AzPhysics::SimulatedBodyHandle ActorData::GetBodyHandle() const + { + AzPhysics::SimulatedBody* body = GetWorldBody(); + if (body) + { + return body->m_bodyHandle; + } + return AzPhysics::InvalidSimulatedBodyHandle; + } + + inline AzPhysics::RigidBody* ActorData::GetRigidBody() const { return m_payload.m_rigidBody; } - inline void ActorData::SetRigidBody(Physics::RigidBody* rigidBody) + inline void ActorData::SetRigidBody(AzPhysics::RigidBody* rigidBody) { m_payload.m_rigidBody = rigidBody; } - inline Physics::RigidBodyStatic* ActorData::GetRigidBodyStatic() const + inline AzPhysics::StaticRigidBody* ActorData::GetRigidBodyStatic() const { return m_payload.m_staticRigidBody; } - inline void ActorData::SetRigidBodyStatic(Physics::RigidBodyStatic* rigidBody) + inline void ActorData::SetRigidBodyStatic(AzPhysics::StaticRigidBody* rigidBody) { m_payload.m_staticRigidBody = rigidBody; } @@ -114,7 +125,7 @@ namespace PhysX m_payload.m_ragdollNode = ragdollNode; } - inline Physics::WorldBody* ActorData::GetWorldBody() const + inline AzPhysics::SimulatedBody* ActorData::GetWorldBody() const { if (m_payload.m_rigidBody) { @@ -143,4 +154,4 @@ namespace PhysX } } // ActorData END ******************************************************** -} //namespace PhysX \ No newline at end of file +} //namespace PhysX diff --git a/Gems/PhysX/Code/Include/PhysX/Utils.h b/Gems/PhysX/Code/Include/PhysX/Utils.h index 898c5a3ae7..81e2ca624e 100644 --- a/Gems/PhysX/Code/Include/PhysX/Utils.h +++ b/Gems/PhysX/Code/Include/PhysX/Utils.h @@ -16,13 +16,14 @@ #include #include #include -#include #include +#include namespace AzPhysics { class CollisionLayer; class CollisionGroup; + class Scene; } namespace Physics @@ -40,7 +41,7 @@ namespace PhysX ActorData* GetUserData(const physx::PxActor* actor); Physics::Material* GetUserData(const physx::PxMaterial* material); Physics::Shape* GetUserData(const physx::PxShape* shape); - Physics::World* GetUserData(physx::PxScene* scene); + AzPhysics::Scene* GetUserData(physx::PxScene* scene); namespace Collision { @@ -50,13 +51,6 @@ namespace PhysX void SetCollisionLayerAndGroup(physx::PxShape* shape, const AzPhysics::CollisionLayer& layer, const AzPhysics::CollisionGroup& group); bool ShouldCollide(const physx::PxFilterData& filterData0, const physx::PxFilterData& filterData1); } - - namespace RayCast - { - Physics::RayCastHit GetHitFromPxHit(const physx::PxLocationHit& pxHit); - physx::PxHitFlags GetPxHitFlags(Physics::HitFlags hitFlags); - Physics::RayCastHit ClosestRayHitAgainstPxRigidActor(const Physics::RayCastRequest& request, physx::PxRigidActor* actor); - } } } diff --git a/Gems/PhysX/Code/Include/PhysX/Utils.inl b/Gems/PhysX/Code/Include/PhysX/Utils.inl index 2318a7c525..9e528bb002 100644 --- a/Gems/PhysX/Code/Include/PhysX/Utils.inl +++ b/Gems/PhysX/Code/Include/PhysX/Utils.inl @@ -9,8 +9,8 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "PhysXLocks.h" +#include #include #include @@ -24,7 +24,7 @@ namespace PhysX } ActorData* actorData = static_cast(actor->userData); - if (!actorData->IsValid()) + if (!actorData || !actorData->IsValid()) { AZ_Warning("PhysX::Utils::GetUserData", false, "The actor data does not look valid and is not safe to use"); return nullptr; @@ -43,9 +43,9 @@ namespace PhysX return (pxShape == nullptr) ? nullptr : static_cast(pxShape->userData); } - inline Physics::World* Utils::GetUserData(physx::PxScene* scene) + inline AzPhysics::Scene* Utils::GetUserData(physx::PxScene* scene) { - return scene ? static_cast(scene->userData) : nullptr; + return scene ? static_cast(scene->userData) : nullptr; } inline AZ::u64 Utils::Collision::Combine(AZ::u32 word0, AZ::u32 word1) @@ -81,89 +81,4 @@ namespace PhysX AZ::u64 group1 = Combine(filterData1.word2, filterData1.word3); return (layer0 & group1) && (layer1 & group0); } - - inline Physics::RayCastHit Utils::RayCast::GetHitFromPxHit(const physx::PxLocationHit& pxHit) - { - Physics::RayCastHit hit; - - hit.m_distance = pxHit.distance; - hit.m_position = PxMathConvert(pxHit.position); - hit.m_normal = PxMathConvert(pxHit.normal); - hit.m_body = Utils::GetUserData(pxHit.actor)->GetWorldBody(); - hit.m_shape = Utils::GetUserData(pxHit.shape); - - if (pxHit.faceIndex != 0xFFFFffff) - { - PHYSX_SCENE_READ_LOCK(pxHit.actor->getScene()); - hit.m_material = Utils::GetUserData(pxHit.shape->getMaterialFromInternalFaceIndex(pxHit.faceIndex)); - } - else - { - hit.m_material = hit.m_shape->GetMaterial().get(); - } - - return hit; - } - - inline Physics::RayCastHit Utils::RayCast::ClosestRayHitAgainstPxRigidActor(const Physics::RayCastRequest& worldSpaceRequest, physx::PxRigidActor* actor) - { - const physx::PxVec3 start = PxMathConvert(worldSpaceRequest.m_start); - const physx::PxVec3 unitDir = PxMathConvert(worldSpaceRequest.m_direction); - const physx::PxU32 maxHits = 1; - const physx::PxHitFlags hitFlags = Utils::RayCast::GetPxHitFlags(worldSpaceRequest.m_hitFlags); - - physx::PxScene* scene = actor->getScene(); - physx::PxTransform actorTransform; - { - PHYSX_SCENE_READ_LOCK(scene); - actorTransform = actor->getGlobalPose(); - } - - Physics::RayCastHit closestHit; - float closestHitDistance = FLT_MAX; - - int numShapes = actor->getNbShapes(); - AZStd::vector shapes(numShapes); - actor->getShapes(shapes.data(), numShapes); - for (physx::PxShape* shape : shapes) - { - physx::PxTransform shapeTransform; - { - PHYSX_SCENE_READ_LOCK(scene); - shapeTransform = actorTransform * shape->getLocalPose(); - } - - physx::PxRaycastHit pxHitInfo; - const bool hit = physx::PxGeometryQuery::raycast(start, unitDir, shape->getGeometry().any(), shapeTransform, - worldSpaceRequest.m_distance, hitFlags, maxHits, &pxHitInfo); - - if (hit && pxHitInfo.distance < closestHitDistance) - { - // Fill actor and shape, as they won't be filled from PxGeometryQuery - pxHitInfo.actor = actor; - pxHitInfo.shape = shape; - closestHit = Utils::RayCast::GetHitFromPxHit(pxHitInfo); - closestHitDistance = pxHitInfo.distance; - } - } - return closestHit; - } - - inline physx::PxHitFlags Utils::RayCast::GetPxHitFlags(Physics::HitFlags hitFlags) - { - static_assert( - static_cast(Physics::HitFlags::Position) == static_cast(physx::PxHitFlag::ePOSITION) && - static_cast(Physics::HitFlags::Normal) == static_cast(physx::PxHitFlag::eNORMAL) && - static_cast(Physics::HitFlags::UV) == static_cast(physx::PxHitFlag::eUV) && - static_cast(Physics::HitFlags::AssumeNoInitialOverlap) == static_cast(physx::PxHitFlag::eASSUME_NO_INITIAL_OVERLAP) && - static_cast(Physics::HitFlags::MeshMultiple) == static_cast(physx::PxHitFlag::eMESH_MULTIPLE) && - static_cast(Physics::HitFlags::MeshAny) == static_cast(physx::PxHitFlag::eMESH_ANY) && - static_cast(Physics::HitFlags::MeshBothSides) == static_cast(physx::PxHitFlag::eMESH_BOTH_SIDES) && - static_cast(Physics::HitFlags::PreciseSweep) == static_cast(physx::PxHitFlag::ePRECISE_SWEEP) && - static_cast(Physics::HitFlags::MTD) == static_cast(physx::PxHitFlag::eMTD) && - static_cast(Physics::HitFlags::FaceIndex) == static_cast(physx::PxHitFlag::eFACE_INDEX), - "Physics::HitFlags values do not match the corresponding PhysX ones."); - - return static_cast(static_cast(hitFlags)); - } } diff --git a/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/EigenanalysisUtilities.cpp b/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/EigenanalysisUtilities.cpp index 5c77293f7a..b7f3fd51c3 100644 --- a/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/EigenanalysisUtilities.cpp +++ b/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/EigenanalysisUtilities.cpp @@ -61,8 +61,8 @@ namespace NumericalMethods::Eigenanalysis double a00, double a01, double a02, double a11, double a12, double a22, double val ) { - // By definition, (A−e∗I)v = 0, where e is the eigenvalue and v is the corresponding eigenvector to be found. - // This condition implies that the rows (A−e∗I) must be perpendicular to v. This matrix must have rank 2, so two + // By definition, (A-e*I)v = 0, where e is the eigenvalue and v is the corresponding eigenvector to be found. + // This condition implies that the rows (A-e*I) must be perpendicular to v. This matrix must have rank 2, so two // rows will be linearly dependent. For those two rows, the cross product will be (nearly) zero. So to find v, // we can simply take the cross product of the two rows that maximize its magnitude. VectorVariable row0 = VectorVariable::CreateFromVector({ a00 - val, a01, a02 }); diff --git a/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/Solver3x3.cpp b/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/Solver3x3.cpp index 7c4ade8bc9..9f4b1bdd90 100644 --- a/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/Solver3x3.cpp +++ b/Gems/PhysX/Code/NumericalMethods/Source/Eigenanalysis/Solver3x3.cpp @@ -31,7 +31,7 @@ namespace NumericalMethods::Eigenanalysis // A - the symmetric input matrix // a - the upper elements of the matrix (0 <= i <= j <= 2). // B - a matrix derived from A, such that B = (A - q*I)/p where - // p = sqrt( tr( (A−q∗I)^2 ) / 6 ) + // p = sqrt( tr( (A-q*I)^2 ) / 6 ) // q = tr(A) / 3 // beta - the eigenvalues of B (0 <= i <= 2) // alpha - the eigenvalues of A (not explicit, stored in the result) (0 <= i <= 2) diff --git a/Gems/PhysX/Code/Source/BallJointComponent.cpp b/Gems/PhysX/Code/Source/BallJointComponent.cpp index 4bbffe1181..b37efd5a33 100644 --- a/Gems/PhysX/Code/Source/BallJointComponent.cpp +++ b/Gems/PhysX/Code/Source/BallJointComponent.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include diff --git a/Gems/PhysX/Code/Source/BaseColliderComponent.cpp b/Gems/PhysX/Code/Source/BaseColliderComponent.cpp index e7f6b6eff9..f4bc86ef93 100644 --- a/Gems/PhysX/Code/Source/BaseColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/BaseColliderComponent.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #include #include #include +#include namespace PhysX { @@ -61,8 +63,9 @@ namespace PhysX if (numShapes > 0) { - auto world = Utils::GetDefaultWorld(); - PHYSX_SCENE_READ_LOCK(world->GetNativeWorld()); + auto* scene = Utils::GetDefaultScene(); + auto* pxScene = static_cast(scene->GetNativePointer()); + PHYSX_SCENE_READ_LOCK(pxScene); auto pxShape = static_cast(shapes[0]->GetNativePointer()); physx::PxTransform pxWorldTransform = PxMathConvert(m_worldTransform); @@ -273,7 +276,7 @@ namespace PhysX } else { - const AZ::Vector3 nonUniformScale = Utils::GetNonUniformScale(GetEntityId()); + const AZ::Vector3 nonUniformScale = Utils::GetTransformScale(GetEntityId()); m_shapes.reserve(m_shapeConfigList.size()); @@ -326,7 +329,11 @@ namespace PhysX return false; } - Utils::GetShapesFromAsset(physicsAssetConfiguration, componentColliderConfiguration, m_shapes); + const bool hasNonUniformScale = (AZ::NonUniformScaleRequestBus::FindFirstHandler(GetEntityId()) != nullptr); + // the value for the subdivision level doesn't matter in the runtime, because any approximation of primitives will already have + // happened in the editor, so can pass an arbitrary value here + AZ::u8 subdivisionLevel = 0; + Utils::GetShapesFromAsset(physicsAssetConfiguration, componentColliderConfiguration, hasNonUniformScale, subdivisionLevel, m_shapes); return true; } diff --git a/Gems/PhysX/Code/Source/BaseColliderComponent.h b/Gems/PhysX/Code/Source/BaseColliderComponent.h index 8223e83cd2..cf4f43fb03 100644 --- a/Gems/PhysX/Code/Source/BaseColliderComponent.h +++ b/Gems/PhysX/Code/Source/BaseColliderComponent.h @@ -24,7 +24,7 @@ namespace PhysX { - class RigidBodyStatic; + class StaticRigidBody; /// Base class for all runtime collider components. class BaseColliderComponent @@ -92,6 +92,7 @@ namespace PhysX static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) { dependent.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); + dependent.push_back(AZ_CRC_CE("NonUniformScaleService")); } static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) diff --git a/Gems/PhysX/Code/Source/BoxColliderComponent.cpp b/Gems/PhysX/Code/Source/BoxColliderComponent.cpp index b2ce40d6bf..c160974e0c 100644 --- a/Gems/PhysX/Code/Source/BoxColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/BoxColliderComponent.cpp @@ -40,6 +40,6 @@ namespace PhysX return; } - m_shapeConfigList[0].second->m_scale = Utils::GetNonUniformScale(GetEntityId()); + m_shapeConfigList[0].second->m_scale = Utils::GetTransformScale(GetEntityId()); } } diff --git a/Gems/PhysX/Code/Source/CapsuleColliderComponent.cpp b/Gems/PhysX/Code/Source/CapsuleColliderComponent.cpp index 63b9cb777d..4923138025 100644 --- a/Gems/PhysX/Code/Source/CapsuleColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/CapsuleColliderComponent.cpp @@ -39,6 +39,6 @@ namespace PhysX return; } - m_shapeConfigList[0].second->m_scale = Utils::GetNonUniformScale(GetEntityId()); + m_shapeConfigList[0].second->m_scale = Utils::GetTransformScale(GetEntityId()); } } diff --git a/Gems/PhysX/Code/Source/Common/PhysXSceneQueryHelpers.cpp b/Gems/PhysX/Code/Source/Common/PhysXSceneQueryHelpers.cpp new file mode 100644 index 0000000000..9903a311af --- /dev/null +++ b/Gems/PhysX/Code/Source/Common/PhysXSceneQueryHelpers.cpp @@ -0,0 +1,303 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace PhysX +{ + namespace SceneQueryHelpers + { + physx::PxQueryFlags GetPxQueryFlags(const AzPhysics::SceneQuery::QueryType& queryType) + { + physx::PxQueryFlags queryFlags = physx::PxQueryFlag::ePREFILTER; + switch (queryType) + { + case AzPhysics::SceneQuery::QueryType::StaticAndDynamic: + queryFlags |= physx::PxQueryFlag::eSTATIC | physx::PxQueryFlag::eDYNAMIC; + break; + case AzPhysics::SceneQuery::QueryType::Dynamic: + queryFlags |= physx::PxQueryFlag::eDYNAMIC; + break; + case AzPhysics::SceneQuery::QueryType::Static: + queryFlags |= physx::PxQueryFlag::eSTATIC; + break; + default: + AZ_Warning("Physics::World", false, "Unhandled queryType"); + break; + } + return queryFlags; + } + + AzPhysics::SceneQueryHit GetHitFromPxHit(const physx::PxLocationHit& pxHit) + { + AzPhysics::SceneQueryHit hit; + + hit.m_distance = pxHit.distance; + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::Distance; + + hit.m_position = PxMathConvert(pxHit.position); + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::Position; + + hit.m_normal = PxMathConvert(pxHit.normal); + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::Normal; + + const ActorData* actorData = Utils::GetUserData(pxHit.actor); + hit.m_bodyHandle = actorData->GetBodyHandle(); + if (hit.m_bodyHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::BodyHandle; + } + hit.m_entityId = actorData->GetEntityId(); + if (hit.m_entityId.IsValid()) + { + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::EntityId; + } + hit.m_shape = Utils::GetUserData(pxHit.shape); + if (hit.m_shape != nullptr) + { + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::Shape; + } + + if (pxHit.faceIndex != 0xFFFFffff) + { + PHYSX_SCENE_READ_LOCK(pxHit.actor->getScene()); + hit.m_material = Utils::GetUserData(pxHit.shape->getMaterialFromInternalFaceIndex(pxHit.faceIndex)); + } + else if (hit.m_shape != nullptr) + { + hit.m_material = hit.m_shape->GetMaterial().get(); + } + if (hit.m_material != nullptr) + { + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::Material; + } + + return hit; + } + + AzPhysics::SceneQueryHit GetHitFromPxOverlapHit(const physx::PxOverlapHit& pxHit) + { + AzPhysics::SceneQueryHit hit; + if (ActorData* actorData = Utils::GetUserData(pxHit.actor)) + { + hit.m_entityId = actorData->GetEntityId(); + if (hit.m_entityId.IsValid()) + { + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::EntityId; + } + + hit.m_bodyHandle = actorData->GetBodyHandle(); + if (hit.m_bodyHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::BodyHandle; + } + + if (pxHit.shape != nullptr) + { + hit.m_shape = static_cast(pxHit.shape->userData); + hit.m_resultFlags |= AzPhysics::SceneQuery::ResultFlags::Shape; + } + } + return hit; + } + + physx::PxHitFlags GetPxHitFlags(AzPhysics::SceneQuery::HitFlags hitFlags) + { + static_assert( + static_cast(AzPhysics::SceneQuery::HitFlags::Position) == static_cast(physx::PxHitFlag::ePOSITION) && + static_cast(AzPhysics::SceneQuery::HitFlags::Normal) == static_cast(physx::PxHitFlag::eNORMAL) && + static_cast(AzPhysics::SceneQuery::HitFlags::UV) == static_cast(physx::PxHitFlag::eUV) && + static_cast(AzPhysics::SceneQuery::HitFlags::AssumeNoInitialOverlap) == static_cast(physx::PxHitFlag::eASSUME_NO_INITIAL_OVERLAP) && + static_cast(AzPhysics::SceneQuery::HitFlags::MeshMultiple) == static_cast(physx::PxHitFlag::eMESH_MULTIPLE) && + static_cast(AzPhysics::SceneQuery::HitFlags::MeshAny) == static_cast(physx::PxHitFlag::eMESH_ANY) && + static_cast(AzPhysics::SceneQuery::HitFlags::MeshBothSides) == static_cast(physx::PxHitFlag::eMESH_BOTH_SIDES) && + static_cast(AzPhysics::SceneQuery::HitFlags::PreciseSweep) == static_cast(physx::PxHitFlag::ePRECISE_SWEEP) && + static_cast(AzPhysics::SceneQuery::HitFlags::MTD) == static_cast(physx::PxHitFlag::eMTD) && + static_cast(AzPhysics::SceneQuery::HitFlags::FaceIndex) == static_cast(physx::PxHitFlag::eFACE_INDEX), + "Physics::HitFlags values do not match the corresponding PhysX ones."); + + return static_cast(static_cast(hitFlags)); + } + + physx::PxQueryHitType::Enum GetPxHitType(AzPhysics::SceneQuery::QueryHitType hitType) + { + static_assert(static_cast(AzPhysics::SceneQuery::QueryHitType::None) == static_cast(physx::PxQueryHitType::eNONE) && + static_cast(AzPhysics::SceneQuery::QueryHitType::Touch) == static_cast(physx::PxQueryHitType::eTOUCH) && + static_cast(AzPhysics::SceneQuery::QueryHitType::Block) == static_cast(physx::PxQueryHitType::eBLOCK), + "PhysX hit types do not match QueryHitTypes"); + return static_cast(hitType); + } + + AzPhysics::SceneQueryHit ClosestRayHitAgainstPxRigidActor( + const AzPhysics::RayCastRequest& worldSpaceRequest, physx::PxRigidActor* actor) + { + const physx::PxVec3 start = PxMathConvert(worldSpaceRequest.m_start); + const physx::PxVec3 unitDir = PxMathConvert(worldSpaceRequest.m_direction.GetNormalized()); + const physx::PxU32 maxHits = 1; + const physx::PxHitFlags hitFlags = GetPxHitFlags(worldSpaceRequest.m_hitFlags); + + AzPhysics::SceneQueryHit closestHit; + float closestHitDistance = FLT_MAX; + + int numShapes = actor->getNbShapes(); + AZStd::vector shapes(numShapes); + actor->getShapes(shapes.data(), numShapes); + + { + physx::PxScene* scene = actor->getScene(); + PHYSX_SCENE_READ_LOCK(scene); + + const physx::PxTransform actorTransform = actor->getGlobalPose(); + for (physx::PxShape* shape : shapes) + { + const physx::PxTransform shapeTransform = actorTransform * shape->getLocalPose(); + + physx::PxRaycastHit pxHitInfo; + const bool hit = physx::PxGeometryQuery::raycast(start, unitDir, shape->getGeometry().any(), shapeTransform, + worldSpaceRequest.m_distance, hitFlags, maxHits, &pxHitInfo); + + if (hit && pxHitInfo.distance < closestHitDistance) + { + // Fill actor and shape, as they won't be filled from PxGeometryQuery + pxHitInfo.actor = actor; + pxHitInfo.shape = shape; + closestHit = GetHitFromPxHit(pxHitInfo); + closestHitDistance = pxHitInfo.distance; + } + } + } + return closestHit; + } + + AzPhysics::SceneQueryHit ClosestRayHitAgainstShapes(const AzPhysics::RayCastRequest& request, + const AZStd::vector>& shapes, const AZ::Transform& parentTransform) + { + AzPhysics::SceneQueryHit closestHit; + float closestHitDist = AZStd::numeric_limits::max(); + for (auto& shape : shapes) + { + AzPhysics::SceneQueryHit hit = shape->RayCast(request, parentTransform); + if (hit && hit.m_distance < closestHitDist) + { + closestHit = hit; + closestHitDist = hit.m_distance; + } + } + return closestHit; + } + + AzPhysics::SceneQuery::FilterCallback GetSceneQueryBlockFilterCallback(const AzPhysics::SceneQuery::FilterCallback& filterCallback) + { + if (!filterCallback) + { + return nullptr; + } + + return [filterCallback](const AzPhysics::SimulatedBody* body, const Physics::Shape* shape) + { + if (filterCallback(body, shape) != AzPhysics::SceneQuery::QueryHitType::None) + { + return AzPhysics::SceneQuery::QueryHitType::Block; + } + return AzPhysics::SceneQuery::QueryHitType::None; + }; + } + + AzPhysics::SceneQuery::FilterCallback GetFilterCallbackFromOverlap(const AzPhysics::SceneQuery::OverlapFilterCallback& overlapFilterCallback) + { + if (!overlapFilterCallback) + { + return nullptr; + } + + return [overlapFilterCallback](const AzPhysics::SimulatedBody* body, const Physics::Shape* shape) + { + if (overlapFilterCallback(body, shape)) + { + return AzPhysics::SceneQuery::QueryHitType::Touch; + } + return AzPhysics::SceneQuery::QueryHitType::None; + }; + } + + PhysXQueryFilterCallback::PhysXQueryFilterCallback( + const AzPhysics::CollisionGroup& collisionGroup, + AzPhysics::SceneQuery::FilterCallback filterCallback, + physx::PxQueryHitType::Enum hitType) + : m_filterCallback(AZStd::move(filterCallback)) + , m_collisionGroup(collisionGroup) + , m_hitType(hitType) + { + } + + //Performs game specific entity filtering + physx::PxQueryHitType::Enum PhysXQueryFilterCallback::preFilter( + [[maybe_unused]] const physx::PxFilterData& queryFilterData, const physx::PxShape* pxShape, + const physx::PxRigidActor* actor, [[maybe_unused]] physx::PxHitFlags& queryTypes) + { + auto shapeFilterData = pxShape->getQueryFilterData(); + + if (m_collisionGroup.GetMask() & PhysX::Collision::Combine(shapeFilterData.word0, shapeFilterData.word1)) + { + if (m_filterCallback) + { + ActorData* userData = Utils::GetUserData(actor); + Physics::Shape* shape = Utils::GetUserData(pxShape); + if (userData != nullptr && userData->GetWorldBody()) + { + return GetPxHitType(m_filterCallback(userData->GetWorldBody(), shape)); + } + } + return m_hitType; + } + return physx::PxQueryHitType::eNONE; + } + + // Unused, we're only pre-filtering at this time + physx::PxQueryHitType::Enum PhysXQueryFilterCallback::postFilter( + [[maybe_unused]] const physx::PxFilterData&, [[maybe_unused]] const physx::PxQueryHit&) + { + return physx::PxQueryHitType::eNONE; + } + + UnboundedOverlapCallback::UnboundedOverlapCallback(const AzPhysics::SceneQuery::UnboundedOverlapHitCallback& hitCallback, + AZStd::vector& hitBuffer) + : m_hitCallback(hitCallback) + , physx::PxHitCallback(hitBuffer.begin(), static_cast(hitBuffer.size())) + {} + + physx::PxAgain UnboundedOverlapCallback::processTouches(const physx::PxOverlapHit* buffer, physx::PxU32 numHits) + { + for (auto it = buffer; it != buffer + numHits; ++it) + { + const AzPhysics::SceneQueryHit hit = SceneQueryHelpers::GetHitFromPxOverlapHit(*it); + if (hit.IsValid() && !m_hitCallback(AZStd::optional(hit))) + { + return false; + } + m_results.m_hits.emplace_back(hit); + } + return true; + }; + + void UnboundedOverlapCallback::finalizeQuery() + { + m_hitCallback({}); + } + } // namespace SceneQuery +} diff --git a/Gems/PhysX/Code/Source/Common/PhysXSceneQueryHelpers.h b/Gems/PhysX/Code/Source/Common/PhysXSceneQueryHelpers.h new file mode 100644 index 0000000000..00fcc229ec --- /dev/null +++ b/Gems/PhysX/Code/Source/Common/PhysXSceneQueryHelpers.h @@ -0,0 +1,101 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +//physx sdk includes +#include +#include +#include + +namespace PhysX +{ + class Shape; + + namespace SceneQueryHelpers + { + //! Helper function to convert AZ query flags to PhysX. + physx::PxQueryFlags GetPxQueryFlags(const AzPhysics::SceneQuery::QueryType& queryType); + + //! Helper function to convert AZ hit flags to PhysX. + physx::PxHitFlags GetPxHitFlags(AzPhysics::SceneQuery::HitFlags hitFlags); + + //! Helper function to convert AZ query hit type to PhysX. + physx::PxQueryHitType::Enum GetPxHitType(AzPhysics::SceneQuery::QueryHitType hitType); + + //! Helper function to convert from PhysX hit to AZ. + AzPhysics::SceneQueryHit GetHitFromPxHit(const physx::PxLocationHit& pxHit); + AzPhysics::SceneQueryHit GetHitFromPxOverlapHit(const physx::PxOverlapHit& pxHit); + + //! Helper function to perform a ray cast against a PxRigidActor. + //! @param request The ray cast request to perform. + //! @param actor Pointer to the actor. + //! @return The closest hit. + AzPhysics::SceneQueryHit ClosestRayHitAgainstPxRigidActor(const AzPhysics::RayCastRequest& request, physx::PxRigidActor* actor); + + //! Helper function to perform a ray cast against all shapes provided and return the closest hit. + //! @param request The ray cast request to perform. + //! @param shapes The list of shapes to cast against. + //! @param parentTransform The world transform of the parent to the shapes. + //! @return The closest hit. + AzPhysics::SceneQueryHit ClosestRayHitAgainstShapes(const AzPhysics::RayCastRequest& request, + const AZStd::vector>& shapes, const AZ::Transform& parentTransform); + + //! Helper function to make the filter callback always return Block unless the result is None. + //! This is needed for queries where we only need the single closest result. + AzPhysics::SceneQuery::FilterCallback GetSceneQueryBlockFilterCallback(const AzPhysics::SceneQuery::FilterCallback& filterCallback); + + //! Helper function to convert the Overlap Filter Callback returning bool to a standard Filter Callback returning QueryHitType + AzPhysics::SceneQuery::FilterCallback GetFilterCallbackFromOverlap(const AzPhysics::SceneQuery::OverlapFilterCallback& overlapFilterCallback); + + //!Helper class, responsible for filtering invalid collision candidates prior to more expensive narrow phase checks + class PhysXQueryFilterCallback + : public physx::PxQueryFilterCallback + { + public: + PhysXQueryFilterCallback() = default; + PhysXQueryFilterCallback( + const AzPhysics::CollisionGroup& collisionGroup, + AzPhysics::SceneQuery::FilterCallback filterCallback, + physx::PxQueryHitType::Enum hitType); + + //Performs game specific entity filtering + physx::PxQueryHitType::Enum preFilter( + const physx::PxFilterData& queryFilterData, const physx::PxShape* pxShape, + const physx::PxRigidActor* actor, physx::PxHitFlags& queryTypes) override; + + // Unused, we're only pre-filtering at this time + physx::PxQueryHitType::Enum postFilter(const physx::PxFilterData&, const physx::PxQueryHit&) override; + + private: + AzPhysics::SceneQuery::FilterCallback m_filterCallback; + AzPhysics::CollisionGroup m_collisionGroup; + physx::PxQueryHitType::Enum m_hitType = physx::PxQueryHitType::eBLOCK; + }; + + //! Callback used to process unbounded overlap scene queries. + struct UnboundedOverlapCallback : public physx::PxHitCallback + { + // physx::PxHitCallback ... + physx::PxAgain processTouches(const physx::PxOverlapHit* buffer, physx::PxU32 numHits) override; + void finalizeQuery() override; + + const AzPhysics::SceneQuery::UnboundedOverlapHitCallback& m_hitCallback; + AzPhysics::SceneQueryHits m_results; + + UnboundedOverlapCallback(const AzPhysics::SceneQuery::UnboundedOverlapHitCallback& hitCallback, + AZStd::vector& hitBuffer); + }; + } // namespace SceneQueryHelpers +} diff --git a/Gems/PhysX/Code/Source/Configuration/PhysXConfiguration.cpp b/Gems/PhysX/Code/Source/Configuration/PhysXConfiguration.cpp index aa40339ee6..3ba520513f 100644 --- a/Gems/PhysX/Code/Source/Configuration/PhysXConfiguration.cpp +++ b/Gems/PhysX/Code/Source/Configuration/PhysXConfiguration.cpp @@ -45,7 +45,7 @@ namespace PhysX { if (auto* serialize = azrtti_cast(context)) { - serialize->Class() + serialize->Class() ->Version(1) ->Field("GlobalWindTag", &WindConfiguration::m_globalWindTag) ->Field("LocalWindTag", &WindConfiguration::m_localWindTag) @@ -53,7 +53,7 @@ namespace PhysX if (AZ::EditContext* editContext = serialize->GetEditContext()) { - editContext->Class("Wind Configuration", "Wind settings for PhysX") + editContext->Class("Wind Configuration", "Wind settings for PhysX") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->DataElement(AZ::Edit::UIHandlers::Default, &WindConfiguration::m_globalWindTag, @@ -86,13 +86,22 @@ namespace PhysX AzPhysics::SystemConfiguration::Reflect(context); WindConfiguration::Reflect(context); - if (auto* serialize = azrtti_cast(context)) + if (auto* serializeContext = azdynamic_cast(context)) { - serialize->Class() + serializeContext->Class() ->Version(1) ->Field("WindConfiguration", &PhysXSystemConfiguration::m_windConfiguration) ->Field("MaterialLibrary", &PhysXSystemConfiguration::m_defaultMaterialLibrary) ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + // this is needed so the edit context of AzPhysics::SystemConfiguration can be used. + editContext->Class("System Configuration", "PhysX system configuration") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ; + } } } diff --git a/Gems/PhysX/Code/Source/DefaultWorldComponent.cpp b/Gems/PhysX/Code/Source/DefaultWorldComponent.cpp index dc78cec72e..b276156c57 100644 --- a/Gems/PhysX/Code/Source/DefaultWorldComponent.cpp +++ b/Gems/PhysX/Code/Source/DefaultWorldComponent.cpp @@ -12,11 +12,8 @@ #include #include -#include -#include #include - -#include +#include namespace PhysX { @@ -49,41 +46,9 @@ namespace PhysX m_onDefaultSceneConfigChangedHandler.Disconnect(); } - void DefaultWorldComponent::OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), &Physics::TriggerNotifications::OnTriggerEnter, triggerEvent); - } - - void DefaultWorldComponent::OnTriggerExit(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), &Physics::TriggerNotifications::OnTriggerExit, triggerEvent); - } - - void DefaultWorldComponent::OnCollisionBegin(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionBegin, event); - } - - void DefaultWorldComponent::OnCollisionPersist(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionPersist, event); - } - - void DefaultWorldComponent::OnCollisionEnd(const Physics::CollisionEvent& event) + AzPhysics::SceneHandle DefaultWorldComponent::GetDefaultSceneHandle() const { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionEnd, event); - } - - AZStd::shared_ptr DefaultWorldComponent::GetDefaultWorld() - { - if (auto* physicsSystem = AZ::Interface::Get()) - { - if (auto scene = physicsSystem->GetScene(m_sceneHandle)) - { - return scene->GetLegacyWorld(); - } - } - return nullptr; + return m_sceneHandle; } void DefaultWorldComponent::OnPreGameEntitiesStarted() @@ -91,18 +56,10 @@ namespace PhysX if (auto* physicsSystem = AZ::Interface::Get()) { AzPhysics::SceneConfiguration sceneConfig = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfig.m_legacyId = Physics::DefaultPhysicsWorldId; + sceneConfig.m_sceneName = AzPhysics::DefaultPhysicsSceneName; m_sceneHandle = physicsSystem->AddScene(sceneConfig); if (m_sceneHandle != AzPhysics::InvalidSceneHandle) { - // Temporary until LYN-438 work is complete - if (auto* scene = physicsSystem->GetScene(m_sceneHandle)) - { - if (AZStd::shared_ptr legacyWorld = scene->GetLegacyWorld()) - { - legacyWorld->SetEventHandler(this); - } - } Physics::DefaultWorldBus::Handler::BusConnect(); } } @@ -134,28 +91,6 @@ namespace PhysX } const AzPhysics::SceneConfiguration& currentConfig = scene->GetConfiguration(); - - //this will be removed/improved with LYN-438 - constexpr const float tolerance = 0.0001f; - const bool gravityChanged = !currentConfig.m_legacyConfiguration.m_gravity.IsClose(config.m_legacyConfiguration.m_gravity); - const bool maxTimeStepChanged = !AZ::IsClose(currentConfig.m_legacyConfiguration.m_maxTimeStep, config.m_legacyConfiguration.m_maxTimeStep, tolerance); - const bool fixedTimeStepChanged = !AZ::IsClose(currentConfig.m_legacyConfiguration.m_fixedTimeStep, config.m_legacyConfiguration.m_fixedTimeStep, tolerance); - if (gravityChanged) - { - Physics::WorldRequestBus::Broadcast( - &Physics::WorldRequests::SetGravity, config.m_legacyConfiguration.m_gravity); - } - if (maxTimeStepChanged) - { - Physics::WorldRequestBus::Broadcast( - &Physics::WorldRequests::SetMaxDeltaTime, config.m_legacyConfiguration.m_maxTimeStep); - } - if (fixedTimeStepChanged) - { - Physics::WorldRequestBus::Broadcast( - &Physics::WorldRequests::SetFixedDeltaTime, config.m_legacyConfiguration.m_fixedTimeStep); - } - if (currentConfig != config) { scene->UpdateConfiguration(config); diff --git a/Gems/PhysX/Code/Source/DefaultWorldComponent.h b/Gems/PhysX/Code/Source/DefaultWorldComponent.h index 16bfe007e5..aa0a8022a4 100644 --- a/Gems/PhysX/Code/Source/DefaultWorldComponent.h +++ b/Gems/PhysX/Code/Source/DefaultWorldComponent.h @@ -12,26 +12,20 @@ #pragma once #include -#include -#include #include #include -#include -namespace Physics +namespace AzPhysics { - class World; + struct TriggerEvent; } namespace PhysX { - class World; - - // Sub Component to be conviniently used for spawning and ticking the default world + // Sub Component to be conveniently used for spawning and ticking the default world // Creates world and enables ticking when the game context activates (before game entities start) class DefaultWorldComponent : private Physics::DefaultWorldBus::Handler - , private Physics::WorldEventHandler , private AzFramework::GameEntityContextEventBus::Handler { public: @@ -42,15 +36,9 @@ namespace PhysX void Deactivate(); private: - // WorldEventHandler - void OnTriggerEnter(const Physics::TriggerEvent& event) override; - void OnTriggerExit(const Physics::TriggerEvent& event) override; - void OnCollisionBegin(const Physics::CollisionEvent& event) override; - void OnCollisionPersist(const Physics::CollisionEvent& event) override; - void OnCollisionEnd(const Physics::CollisionEvent& event) override; // DefaultWorldBus - AZStd::shared_ptr GetDefaultWorld() override; + AzPhysics::SceneHandle GetDefaultSceneHandle() const override; // GameEntityContextEventBus void OnPreGameEntitiesStarted() override; diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp index 15b3a9f373..974ce23810 100644 --- a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp @@ -16,8 +16,10 @@ #include #include #include -#include +#include #include +#include +#include #include #include #include @@ -35,7 +37,6 @@ #include #include #include -#include #include #include @@ -57,10 +58,10 @@ namespace PhysX { editContext->Class("EditorProxyShapeConfig", "PhysX Base shape collider") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyAssetShapeConfig::m_pxAsset, "PhysX Mesh", "PhysX mesh collider asset") ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyAssetShapeConfig::m_configuration, "Configuration", "Configuration of asset shape") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly); + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly); } } } @@ -78,35 +79,43 @@ namespace PhysX ->Field("Box", &EditorProxyShapeConfig::m_box) ->Field("Capsule", &EditorProxyShapeConfig::m_capsule) ->Field("PhysicsAsset", &EditorProxyShapeConfig::m_physicsAsset) - ; + ->Field("HasNonUniformScale", &EditorProxyShapeConfig::m_hasNonUniformScale) + ->Field("SubdivisionLevel", &EditorProxyShapeConfig::m_subdivisionLevel) + ; if (auto editContext = serializeContext->GetEditContext()) { editContext->Class( "EditorProxyShapeConfig", "PhysX Base shape collider") ->DataElement(AZ::Edit::UIHandlers::ComboBox, &EditorProxyShapeConfig::m_shapeType, "Shape", "The shape of the collider") - ->EnumAttribute(Physics::ShapeType::Sphere, "Sphere") - ->EnumAttribute(Physics::ShapeType::Box, "Box") - ->EnumAttribute(Physics::ShapeType::Capsule, "Capsule") - ->EnumAttribute(Physics::ShapeType::PhysicsAsset, "PhysicsAsset") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) - // note: we do not want the user to be able to change shape types while in ComponentMode (there will - // potentially be different ComponentModes for different shape types) - ->Attribute(AZ::Edit::Attributes::ReadOnly, &AzToolsFramework::ComponentModeFramework::InComponentMode) + ->EnumAttribute(Physics::ShapeType::Sphere, "Sphere") + ->EnumAttribute(Physics::ShapeType::Box, "Box") + ->EnumAttribute(Physics::ShapeType::Capsule, "Capsule") + ->EnumAttribute(Physics::ShapeType::PhysicsAsset, "PhysicsAsset") + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) + // note: we do not want the user to be able to change shape types while in ComponentMode (there will + // potentially be different ComponentModes for different shape types) + ->Attribute(AZ::Edit::Attributes::ReadOnly, &AzToolsFramework::ComponentModeFramework::InComponentMode) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_sphere, "Sphere", "Configuration of sphere shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsSphereConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsSphereConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_box, "Box", "Configuration of box shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsBoxConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsBoxConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_capsule, "Capsule", "Configuration of capsule shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsCapsuleConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsCapsuleConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_physicsAsset, "Asset", "Configuration of asset shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsAssetConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) - ; + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsAssetConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_subdivisionLevel, "Subdivision level", + "The level of subdivision if a primitive shape is replaced with a convex mesh due to scaling") + ->Attribute(AZ::Edit::Attributes::Min, Utils::MinCapsuleSubdivisionLevel) + ->Attribute(AZ::Edit::Attributes::Max, Utils::MaxCapsuleSubdivisionLevel) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::ShowingSubdivisionLevel) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ; } } } @@ -116,6 +125,23 @@ namespace PhysX return AZ::Edit::PropertyRefreshLevels::ValuesOnly; } + void EditorColliderComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC_CE("PhysicsWorldBodyService")); + provided.push_back(AZ_CRC_CE("PhysXColliderService")); + provided.push_back(AZ_CRC_CE("PhysXTriggerService")); + } + + void EditorColliderComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(AZ_CRC_CE("TransformService")); + } + + void EditorColliderComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + dependent.push_back(AZ_CRC_CE("NonUniformScaleService")); + } + void EditorColliderComponent::Reflect(AZ::ReflectContext* context) { EditorProxyShapeConfig::Reflect(context); @@ -128,25 +154,25 @@ namespace PhysX "EditorCapsuleColliderComponent", "{0BD5AF3A-35C0-4386-9930-54A2A3E97432}", &ClassConverters::DeprecateEditorCapsuleColliderComponent) - ; + ; serializeContext->ClassDeprecate( "EditorBoxColliderComponent", "{FAECF2BE-625B-469D-BBFF-E345BBB12D66}", &ClassConverters::DeprecateEditorBoxColliderComponent) - ; + ; serializeContext->ClassDeprecate( "EditorSphereColliderComponent", "{D11C1624-4AE9-4B66-A6F6-40EDB9CDCE99}", &ClassConverters::DeprecateEditorSphereColliderComponent) - ; + ; serializeContext->ClassDeprecate( "EditorMeshColliderComponent", "{214185DA-ABD9-4410-9819-7C177801CF7A}", &ClassConverters::DeprecateEditorMeshColliderComponent) - ; + ; serializeContext->Class() ->Version(9, &PhysX::ClassConverters::UpgradeEditorColliderComponent) @@ -154,30 +180,31 @@ namespace PhysX ->Field("ShapeConfiguration", &EditorColliderComponent::m_shapeConfiguration) ->Field("DebugDrawSettings", &EditorColliderComponent::m_colliderDebugDraw) ->Field("ComponentMode", &EditorColliderComponent::m_componentModeDelegate) - ; + ->Field("HasNonUniformScale", &EditorColliderComponent::m_hasNonUniformScale) + ; if (auto editContext = serializeContext->GetEditContext()) { editContext->Class( "PhysX Collider", "PhysX shape collider") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Category, "PhysX") - ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/PhysXCollider.svg") - ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/PhysXCollider.svg") - ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) - ->Attribute(AZ::Edit::Attributes::HelpPageURL, "http://docs.aws.amazon.com/console/lumberyard/component/physx/collider") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::Category, "PhysX") + ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/PhysXCollider.svg") + ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/PhysXCollider.svg") + ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) + ->Attribute(AZ::Edit::Attributes::HelpPageURL, "http://docs.aws.amazon.com/console/lumberyard/component/physx/collider") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorColliderComponent::m_configuration, "Collider Configuration", "Configuration of the collider") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorColliderComponent::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorColliderComponent::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorColliderComponent::m_shapeConfiguration, "Shape Configuration", "Configuration of the shape") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorColliderComponent::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorColliderComponent::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorColliderComponent::m_componentModeDelegate, "Component Mode", "Collider Component Mode") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorColliderComponent::m_colliderDebugDraw, "Debug draw settings", "Debug draw settings") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } } @@ -211,7 +238,7 @@ namespace PhysX { // Scale the collider offset Physics::ColliderConfiguration colliderConfiguration = m_configuration; - colliderConfiguration.m_position *= Utils::GetNonUniformScale(GetEntityId()); + colliderConfiguration.m_position *= Utils::GetTransformScale(GetEntityId()) * m_cachedNonUniformScale; return colliderConfiguration; } @@ -259,7 +286,7 @@ namespace PhysX { return m_shapeType == Physics::ShapeType::PhysicsAsset; } - + Physics::ShapeConfiguration& EditorProxyShapeConfig::GetCurrent() { return const_cast(static_cast(*this).GetCurrent()); @@ -285,8 +312,18 @@ namespace PhysX } } + bool EditorProxyShapeConfig::ShowingSubdivisionLevel() const + { + return (m_hasNonUniformScale && (IsCapsuleConfig() || IsSphereConfig() || IsAssetConfig())); + } + void EditorColliderComponent::Activate() { + if (m_sceneInterface = AZ::Interface::Get()) + { + m_editorSceneHandle = m_sceneInterface->GetSceneHandle(AzPhysics::EditorPhysicsSceneName); + } + m_physXConfigChangedHandler = AzPhysics::SystemEvents::OnConfigurationChangedEvent::Handler( []([[maybe_unused]] const AzPhysics::SystemConfiguration* config) { @@ -310,8 +347,19 @@ namespace PhysX LmbrCentral::MeshComponentNotificationBus::Handler::BusConnect(GetEntityId()); AZ::Render::MeshComponentNotificationBus::Handler::BusConnect(GetEntityId()); EditorColliderComponentRequestBus::Handler::BusConnect(AZ::EntityComponentIdPair(GetEntityId(), GetId())); + m_nonUniformScaleChangedHandler = AZ::NonUniformScaleChangedEvent::Handler( + [this](const AZ::Vector3& scale) {OnNonUniformScaleChanged(scale); }); + AZ::NonUniformScaleRequestBus::Event(GetEntityId(), &AZ::NonUniformScaleRequests::RegisterScaleChangedEvent, + m_nonUniformScaleChangedHandler); + m_hasNonUniformScale = (AZ::NonUniformScaleRequestBus::FindFirstHandler(GetEntityId()) != nullptr); + m_shapeConfiguration.m_hasNonUniformScale = m_hasNonUniformScale; AZ::TransformBus::EventResult(m_cachedWorldTransform, GetEntityId(), &AZ::TransformInterface::GetWorldTM); + m_cachedNonUniformScale = AZ::Vector3::CreateOne(); + if (m_hasNonUniformScale) + { + AZ::NonUniformScaleRequestBus::EventResult(m_cachedNonUniformScale, GetEntityId(), &AZ::NonUniformScaleRequests::GetScale); + } // Debug drawing m_colliderDebugDraw.Connect(GetEntityId()); @@ -353,7 +401,11 @@ namespace PhysX m_componentModeDelegate.Disconnect(); - m_editorBody = nullptr; + if (m_sceneInterface) + { + m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle); + m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + } } AZ::u32 EditorColliderComponent::OnConfigurationChanged() @@ -406,22 +458,58 @@ namespace PhysX auto sharedColliderConfig = AZStd::make_shared(m_configuration); BaseColliderComponent* colliderComponent = nullptr; + auto buildGameEntityScaledPrimitive = [gameEntity](AZStd::shared_ptr& colliderConfig, + Physics::ShapeConfiguration& shapeConfig, AZ::u8 subdivisionLevel) + { + auto scaledPrimitiveConfig = Utils::CreateConvexFromPrimitive(*colliderConfig, + shapeConfig, subdivisionLevel, shapeConfig.m_scale); + if (scaledPrimitiveConfig.has_value()) + { + colliderConfig->m_rotation = AZ::Quaternion::CreateIdentity(); + colliderConfig->m_position = AZ::Vector3::CreateZero(); + BaseColliderComponent* colliderComponent = gameEntity->CreateComponent(); + colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, + AZStd::make_shared(scaledPrimitiveConfig.value())) }); + } + }; + switch (m_shapeConfiguration.m_shapeType) { case Physics::ShapeType::Sphere: - colliderComponent = gameEntity->CreateComponent(); - colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(sharedColliderConfig, - AZStd::make_shared(m_shapeConfiguration.m_sphere)) }); + if (!m_hasNonUniformScale) + { + colliderComponent = gameEntity->CreateComponent(); + colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(sharedColliderConfig, + AZStd::make_shared(m_shapeConfiguration.m_sphere)) }); + } + else + { + buildGameEntityScaledPrimitive(sharedColliderConfig, m_shapeConfiguration.m_sphere, m_shapeConfiguration.m_subdivisionLevel); + } break; case Physics::ShapeType::Box: - colliderComponent = gameEntity->CreateComponent(); - colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(sharedColliderConfig, - AZStd::make_shared(m_shapeConfiguration.m_box)) }); + if (!m_hasNonUniformScale) + { + colliderComponent = gameEntity->CreateComponent(); + colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(sharedColliderConfig, + AZStd::make_shared(m_shapeConfiguration.m_box)) }); + } + else + { + buildGameEntityScaledPrimitive(sharedColliderConfig, m_shapeConfiguration.m_box, m_shapeConfiguration.m_subdivisionLevel); + } break; case Physics::ShapeType::Capsule: - colliderComponent = gameEntity->CreateComponent(); - colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(sharedColliderConfig, - AZStd::make_shared(m_shapeConfiguration.m_capsule)) }); + if (!m_hasNonUniformScale) + { + colliderComponent = gameEntity->CreateComponent(); + colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(sharedColliderConfig, + AZStd::make_shared(m_shapeConfiguration.m_capsule)) }); + } + else + { + buildGameEntityScaledPrimitive(sharedColliderConfig, m_shapeConfiguration.m_capsule, m_shapeConfiguration.m_subdivisionLevel); + } break; case Physics::ShapeType::PhysicsAsset: colliderComponent = gameEntity->CreateComponent(); @@ -447,7 +535,7 @@ namespace PhysX AZ::Transform EditorColliderComponent::GetColliderLocalTransform() const { - const AZ::Vector3 nonUniformScale = Utils::GetNonUniformScale(GetEntityId()); + const AZ::Vector3 nonUniformScale = Utils::GetTransformScale(GetEntityId()); return AZ::Transform::CreateFromQuaternionAndTranslation( m_configuration.m_rotation, m_configuration.m_position * nonUniformScale); } @@ -465,6 +553,11 @@ namespace PhysX UpdateMaterialSlotsFromMeshAsset(); } + bool IsNonUniformlyScaledPrimitive(const EditorProxyShapeConfig& shapeConfig) + { + return shapeConfig.m_hasNonUniformScale && Utils::IsPrimitiveShape(shapeConfig.GetCurrent()); + } + void EditorColliderComponent::CreateStaticEditorCollider() { // Don't create static rigid body in the editor if current entity components @@ -478,47 +571,68 @@ namespace PhysX { // Mesh asset has not been loaded, wait for OnAssetReady to be invoked. // We specifically check Ready state here rather than ReadyPreNotify to ensure OnAssetReady has been invoked - m_editorBody.reset(); + if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle); + m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + } return; } - AZStd::shared_ptr editorWorld; - Physics::EditorWorldBus::BroadcastResult(editorWorld, &Physics::EditorWorldRequests::GetEditorWorld); - if (editorWorld != nullptr) - { - AZ::Transform colliderTransform = GetWorldTM(); - AZ::Vector3 scale = colliderTransform.ExtractScale(); - - Physics::WorldBodyConfiguration configuration; - configuration.m_orientation = colliderTransform.GetRotation(); - configuration.m_position = colliderTransform.GetTranslation(); - configuration.m_entityId = GetEntityId(); - configuration.m_debugName = GetEntity()->GetName(); + AZ::Transform colliderTransform = GetWorldTM(); + colliderTransform.ExtractScale(); + AzPhysics::StaticRigidBodyConfiguration configuration; + configuration.m_orientation = colliderTransform.GetRotation(); + configuration.m_position = colliderTransform.GetTranslation(); + configuration.m_entityId = GetEntityId(); + configuration.m_debugName = GetEntity()->GetName(); - m_editorBody = AZ::Interface::Get()->CreateStaticRigidBody(configuration); + // This configuration needs to be at the scope of the function to be added + // to m_colliderAndShapeData as a pointer. + Physics::ColliderConfiguration colliderConfig; - if (m_shapeConfiguration.IsAssetConfig()) + if (m_shapeConfiguration.IsAssetConfig()) + { + AZStd::vector> shapes; + Utils::GetShapesFromAsset(m_shapeConfiguration.m_physicsAsset.m_configuration, + m_configuration, m_hasNonUniformScale, m_shapeConfiguration.m_subdivisionLevel, shapes); + configuration.m_colliderAndShapeData = shapes; + } + else + { + colliderConfig = GetColliderConfigurationScaled(); + Physics::ShapeConfiguration& shapeConfig = m_shapeConfiguration.GetCurrent(); + if (IsNonUniformlyScaledPrimitive(m_shapeConfiguration)) { - AZStd::vector> shapes; - Utils::GetShapesFromAsset(m_shapeConfiguration.m_physicsAsset.m_configuration, m_configuration, shapes); + auto convexConfig = Utils::CreateConvexFromPrimitive(GetColliderConfiguration(), shapeConfig, + m_shapeConfiguration.m_subdivisionLevel, shapeConfig.m_scale); + auto colliderConfigurationNoOffset = colliderConfig; + colliderConfigurationNoOffset.m_rotation = AZ::Quaternion::CreateIdentity(); + colliderConfigurationNoOffset.m_position = AZ::Vector3::CreateZero(); - for (const auto& shape : shapes) + if (convexConfig.has_value()) { - m_editorBody->AddShape(shape); + AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape( + colliderConfigurationNoOffset, convexConfig.value()); + configuration.m_colliderAndShapeData = shape; } } else { - const Physics::ColliderConfiguration colliderConfiguration = GetColliderConfigurationScaled(); - - const auto& shapeConfiguration = m_shapeConfiguration.GetCurrent(); - AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape( - colliderConfiguration, shapeConfiguration); - - m_editorBody->AddShape(shape); + configuration.m_colliderAndShapeData = AzPhysics::ShapeColliderPair(&colliderConfig, &shapeConfig); } + } - editorWorld->AddBody(*m_editorBody); + if (m_sceneInterface) + { + //remove the previous body if any + if (m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle); + m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + } + + m_editorBodyHandle = m_sceneInterface->AddSimulatedBody(m_editorSceneHandle, &configuration); } m_colliderDebugDraw.ClearCachedGeometry(); @@ -531,57 +645,6 @@ namespace PhysX return m_shapeConfiguration.m_physicsAsset.m_pxAsset; } - void EditorColliderComponent::GetStaticWorldSpaceMeshTriangles(AZStd::vector& verts, AZStd::vector& indices) const - { - bool isStatic = false; - AZ::TransformBus::EventResult(isStatic, m_entity->GetId(), &AZ::TransformBus::Events::IsStaticTransform); - - if (isStatic) - { - AZ_Warning("PhysX", verts.empty() && indices.empty(), - "Existing vertex and index data will be lost. Is this a duplicate model instance?"); - - BuildDebugDrawMesh(); - - AZ::u32 numShapes = m_colliderDebugDraw.GetNumShapes(); - AZ_Warning("PhysX", numShapes > 0, - "GetStaticWorldSpaceMeshTriangles: No debug draw geometry found. " - "Please make sure the collision geometry is loaded. Entity: %s", - GetEntity()->GetName().c_str()); - - indices.clear(); - verts.clear(); - - AZ::Transform overallTM = GetWorldTM() * GetColliderLocalTransform(); - - // Vertices can be added directly but indices need to be incremented - // by the amount of vertices already added in the last iteration - for (AZ::u32 shapeIndex = 0; shapeIndex < numShapes; shapeIndex++) - { - const AZStd::vector& shapeIndices = m_colliderDebugDraw.GetIndices(shapeIndex); - const AZStd::vector& shapeVerts = m_colliderDebugDraw.GetVerts(shapeIndex); - - AZ::u32 startingIndex = static_cast(verts.size()); - - indices.reserve(indices.size() + shapeIndices.size()); - - AZStd::transform(shapeIndices.begin(), shapeIndices.end(), AZStd::back_inserter(indices), - [startingIndex](AZ::u32 index) - { - return index + startingIndex; - }); - - verts.reserve(verts.size() + shapeVerts.size()); - - AZStd::transform(shapeVerts.begin(), shapeVerts.end(), AZStd::back_inserter(verts), - [&overallTM](const AZ::Vector3& vertex) - { - return overallTM.TransformPoint(vertex); - }); - } - } - } - Physics::MaterialId EditorColliderComponent::GetMaterialId() const { return m_configuration.m_materialSelection.GetMaterialId(); @@ -683,7 +746,8 @@ namespace PhysX if (m_shapeConfiguration.m_physicsAsset.m_configuration.GetShapeType() == Physics::ShapeType::PhysicsAsset && entityRigidbody) { AZStd::vector> shapes; - Utils::GetShapesFromAsset(m_shapeConfiguration.m_physicsAsset.m_configuration, m_configuration, shapes); + Utils::GetShapesFromAsset(m_shapeConfiguration.m_physicsAsset.m_configuration, m_configuration, m_hasNonUniformScale, + m_shapeConfiguration.m_subdivisionLevel, shapes); if (shapes.empty()) { @@ -740,7 +804,8 @@ namespace PhysX } Physics::ShapeConfigurationList shapeConfigList; - Utils::GetColliderShapeConfigsFromAsset(physicsAssetConfiguration, m_configuration, shapeConfigList); + Utils::GetColliderShapeConfigsFromAsset(physicsAssetConfiguration, m_configuration, m_hasNonUniformScale, + m_shapeConfiguration.m_subdivisionLevel, shapeConfigList); for (size_t shapeIndex = 0; shapeIndex < shapeConfigList.size(); shapeIndex++) { @@ -756,11 +821,38 @@ namespace PhysX else { const AZ::u32 shapeIndex = 0; // There's only one mesh gets built from the primitive collider, hence use geomIndex 0. - m_colliderDebugDraw.BuildMeshes(m_shapeConfiguration.GetCurrent(), shapeIndex); + if (!m_hasNonUniformScale) + { + m_colliderDebugDraw.BuildMeshes(m_shapeConfiguration.GetCurrent(), shapeIndex); + } + else + { + m_scaledPrimitive = Utils::CreateConvexFromPrimitive(GetColliderConfiguration(), m_shapeConfiguration.GetCurrent(), + m_shapeConfiguration.m_subdivisionLevel, m_shapeConfiguration.GetCurrent().m_scale); + if (m_scaledPrimitive.has_value()) + { + physx::PxGeometryHolder pxGeometryHolder; + Utils::CreatePxGeometryFromConfig(m_scaledPrimitive.value(), pxGeometryHolder); // this will cause the native mesh to be cached + m_colliderDebugDraw.BuildMeshes(m_scaledPrimitive.value(), shapeIndex); + } + } + } + } + + void EditorColliderComponent::DisplayScaledPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const + { + if (m_scaledPrimitive.has_value()) + { + const AZ::u32 shapeIndex = 0; + Physics::ColliderConfiguration colliderConfigNoOffset = m_configuration; + colliderConfigNoOffset.m_rotation = AZ::Quaternion::CreateIdentity(); + colliderConfigNoOffset.m_position = AZ::Vector3::CreateZero(); + m_colliderDebugDraw.DrawMesh(debugDisplay, colliderConfigNoOffset, m_scaledPrimitive.value(), + GetWorldTM().GetScale() * m_cachedNonUniformScale, shapeIndex); } } - void EditorColliderComponent::DisplayPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const + void EditorColliderComponent::DisplayUnscaledPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const { switch (m_shapeConfiguration.m_shapeType) { @@ -787,7 +879,8 @@ namespace PhysX const Physics::PhysicsAssetShapeConfiguration& physicsAssetConfiguration = m_shapeConfiguration.m_physicsAsset.m_configuration; Physics::ShapeConfigurationList shapeConfigList; - Utils::GetColliderShapeConfigsFromAsset(physicsAssetConfiguration, m_configuration, shapeConfigList); + Utils::GetColliderShapeConfigsFromAsset(physicsAssetConfiguration, m_configuration, m_hasNonUniformScale, + m_shapeConfiguration.m_subdivisionLevel, shapeConfigList); const AZ::Vector3& assetScale = physicsAssetConfiguration.m_assetScale; @@ -805,10 +898,10 @@ namespace PhysX const Physics::CookedMeshShapeConfiguration* cookedMeshShapeConfiguration = static_cast(shapeConfiguration); - const AZ::Vector3 nonUniformScale = Utils::GetNonUniformScale(GetEntityId()); + const AZ::Vector3 overallScale = Utils::GetTransformScale(GetEntityId()) * m_cachedNonUniformScale * assetScale; m_colliderDebugDraw.DrawMesh(debugDisplay, *colliderConfiguration, *cookedMeshShapeConfiguration, - assetScale * nonUniformScale, shapeIndex); + overallScale, shapeIndex); break; } case Physics::ShapeType::Sphere: @@ -860,7 +953,14 @@ namespace PhysX } else { - DisplayPrimitiveCollider(debugDisplay); + if (m_hasNonUniformScale) + { + DisplayScaledPrimitiveCollider(debugDisplay); + } + else + { + DisplayUnscaledPrimitiveCollider(debugDisplay); + } } } } @@ -903,10 +1003,20 @@ namespace PhysX CreateStaticEditorCollider(); } + void EditorColliderComponent::OnNonUniformScaleChanged(const AZ::Vector3& nonUniformScale) + { + m_cachedNonUniformScale = nonUniformScale; + + UpdateShapeConfigurationScale(); + CreateStaticEditorCollider(); + } + // PhysX::ColliderShapeBus AZ::Aabb EditorColliderComponent::GetColliderShapeAabb() { return PhysX::Utils::GetColliderAabb(GetWorldTM() + , m_hasNonUniformScale + , m_shapeConfiguration.m_subdivisionLevel , m_shapeConfiguration.GetCurrent() , m_configuration); } @@ -914,7 +1024,7 @@ namespace PhysX void EditorColliderComponent::UpdateShapeConfigurationScale() { auto& shapeConfiguration = m_shapeConfiguration.GetCurrent(); - shapeConfiguration.m_scale = GetWorldTM().ExtractScale(); + shapeConfiguration.m_scale = GetWorldTM().ExtractScale() * m_cachedNonUniformScale; m_colliderDebugDraw.ClearCachedGeometry(); } @@ -928,35 +1038,52 @@ namespace PhysX void EditorColliderComponent::DisablePhysics() { - m_editorBody.reset(); + if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle); + m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + } } bool EditorColliderComponent::IsPhysicsEnabled() const { - return m_editorBody && m_editorBody->GetWorld(); + return m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle; } AZ::Aabb EditorColliderComponent::GetAabb() const { - if (m_editorBody) + if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle) { - return m_editorBody->GetAabb(); + if (auto* body = m_sceneInterface->GetSimulatedBodyFromHandle(m_editorSceneHandle, m_editorBodyHandle)) + { + return body->GetAabb(); + } } return AZ::Aabb::CreateNull(); } - Physics::WorldBody* EditorColliderComponent::GetWorldBody() + AzPhysics::SimulatedBody* EditorColliderComponent::GetWorldBody() { - return m_editorBody.get(); + if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + if (auto* body = m_sceneInterface->GetSimulatedBodyFromHandle(m_editorSceneHandle, m_editorBodyHandle)) + { + return body; + } + } + return nullptr; } - Physics::RayCastHit EditorColliderComponent::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit EditorColliderComponent::RayCast(const AzPhysics::RayCastRequest& request) { - if (m_editorBody) + if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle) { - return m_editorBody->RayCast(request); + if (auto* body = m_sceneInterface->GetSimulatedBodyFromHandle(m_editorSceneHandle, m_editorBodyHandle)) + { + return body->RayCast(request); + } } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } bool EditorColliderComponent::IsTrigger() @@ -1210,6 +1337,7 @@ namespace PhysX void EditorColliderComponentDescriptor::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent, [[maybe_unused]] const AZ::Component* instance) const { + EditorColliderComponent::GetDependentServices(dependent); } void EditorColliderComponentDescriptor::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required, [[maybe_unused]] const AZ::Component* instance) const @@ -1217,11 +1345,6 @@ namespace PhysX EditorColliderComponent::GetRequiredServices(required); } - void EditorColliderComponentDescriptor::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible, [[maybe_unused]] const AZ::Component* instance) const - { - EditorColliderComponent::GetIncompatibleServices(incompatible); - } - void EditorColliderComponentDescriptor::GetWarnings(AZ::ComponentDescriptor::StringWarningArray& warnings, const AZ::Component* instance) const { const PhysX::EditorColliderComponent* editorColliderComponent = azrtti_cast(instance); diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.h b/Gems/PhysX/Code/Source/EditorColliderComponent.h index e9dc0bea15..65c7a9c67f 100644 --- a/Gems/PhysX/Code/Source/EditorColliderComponent.h +++ b/Gems/PhysX/Code/Source/EditorColliderComponent.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * @@ -14,14 +14,15 @@ #include #include +#include #include #include -#include #include #include #include #include +#include #include #include @@ -41,6 +42,12 @@ #include +namespace AzPhysics +{ + class SceneInterface; + struct SimulatedBody; +} + namespace PhysX { struct EditorProxyAssetShapeConfig @@ -54,7 +61,7 @@ namespace PhysX Physics::PhysicsAssetShapeConfiguration m_configuration; }; - /// Proxy container for only displaying a specific shape configuration depending on the shapeType selected. + //! Proxy container for only displaying a specific shape configuration depending on the shapeType selected. struct EditorProxyShapeConfig { AZ_CLASS_ALLOCATOR(EditorProxyShapeConfig, AZ::SystemAllocator, 0); @@ -70,6 +77,8 @@ namespace PhysX Physics::BoxShapeConfiguration m_box; Physics::CapsuleShapeConfiguration m_capsule; EditorProxyAssetShapeConfig m_physicsAsset; + bool m_hasNonUniformScale = false; //!< Whether there is a non-uniform scale component on this entity. + AZ::u8 m_subdivisionLevel = 4; //!< The level of subdivision if a primitive shape is replaced with a convex mesh due to scaling. Physics::CookedMeshShapeConfiguration m_cookedMesh; bool IsSphereConfig() const; @@ -79,12 +88,14 @@ namespace PhysX Physics::ShapeConfiguration& GetCurrent(); const Physics::ShapeConfiguration& GetCurrent() const; + bool ShowingSubdivisionLevel() const; + AZ::u32 OnConfigurationChanged(); }; class EditorColliderComponentDescriptor; - /// Editor PhysX Collider Component. - /// + //! Editor PhysX Collider Component. + //! class EditorColliderComponent : public AzToolsFramework::Components::EditorComponentBase , protected DebugDraw::DisplayCallback @@ -107,23 +118,9 @@ namespace PhysX friend class EditorColliderComponentDescriptor; static void Reflect(AZ::ReflectContext* context); - static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) - { - provided.push_back(AZ_CRC("PhysicsWorldBodyService", 0x944da0cc)); - provided.push_back(AZ_CRC("PhysXColliderService", 0x4ff43f7c)); - provided.push_back(AZ_CRC("PhysXTriggerService", 0x3a117d7b)); - } - static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) - { - required.push_back(AZ_CRC("TransformService", 0x8ee22c50)); - } - static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) - { - // Not compatible with Legacy Cry Physics services - incompatible.push_back(AZ_CRC("ColliderService", 0x902d4e93)); - incompatible.push_back(AZ_CRC("LegacyCryPhysicsService", 0xbb370351)); - } - + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); static AZ::ComponentDescriptor* CreateDescriptor(); EditorColliderComponent() = default; @@ -144,14 +141,15 @@ namespace PhysX void Activate() override; void Deactivate() override; - /// AzToolsFramework::EntitySelectionEvents + //! AzToolsFramework::EntitySelectionEvents void OnSelected() override; void OnDeselected() override; // DisplayCallback void Display(AzFramework::DebugDisplayRequests& debugDisplay) const; void DisplayMeshCollider(AzFramework::DebugDisplayRequests& debugDisplay) const; - void DisplayPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const; + void DisplayUnscaledPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const; + void DisplayScaledPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const; // AZ::Data::AssetBus::Handler void OnAssetReady(AZ::Data::Asset asset) override; @@ -159,7 +157,6 @@ namespace PhysX // PhysXMeshColliderComponentRequestBus AZ::Data::Asset GetMeshAsset() const override; - void GetStaticWorldSpaceMeshTriangles(AZStd::vector& verts, AZStd::vector& indices) const override; Physics::MaterialId GetMaterialId() const override; void SetMeshAsset(const AZ::Data::AssetId& id) override; void SetMaterialAsset(const AZ::Data::AssetId& id) override; @@ -169,6 +166,9 @@ namespace PhysX // TransformBus void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; + // non-uniform scale handling + void OnNonUniformScaleChanged(const AZ::Vector3& nonUniformScale); + // AzToolsFramework::BoxManipulatorRequestBus AZ::Vector3 GetDimensions() override; void SetDimensions(const AZ::Vector3& dimensions) override; @@ -216,8 +216,8 @@ namespace PhysX void DisablePhysics() override; bool IsPhysicsEnabled() const override; AZ::Aabb GetAabb() const override; - Physics::WorldBody* GetWorldBody() override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SimulatedBody* GetWorldBody() override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; // Mesh collider void UpdateMeshAsset(); @@ -233,10 +233,12 @@ namespace PhysX AZ::ComponentDescriptor::StringWarningArray GetComponentWarnings() const { return m_componentWarnings; }; using ComponentModeDelegate = AzToolsFramework::ComponentModeFramework::ComponentModeDelegate; - ComponentModeDelegate m_componentModeDelegate; ///< Responsible for detecting ComponentMode activation - ///< and creating a concrete ComponentMode. + ComponentModeDelegate m_componentModeDelegate; //!< Responsible for detecting ComponentMode activation + //!< and creating a concrete ComponentMode. - AZStd::unique_ptr m_editorBody; + AzPhysics::SceneInterface* m_sceneInterface = nullptr; + AzPhysics::SceneHandle m_editorSceneHandle = AzPhysics::InvalidSceneHandle; + AzPhysics::SimulatedBodyHandle m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; // Auto-assigning collision mesh utility functions bool ShouldUpdateCollisionMeshFromRender() const; @@ -255,6 +257,10 @@ namespace PhysX AzPhysics::SystemEvents::OnDefaultMaterialLibraryChangedEvent::Handler m_onDefaultMaterialLibraryChangedEventHandler; AZ::Transform m_cachedWorldTransform; + AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler; //!< Responds to changes in non-uniform scale. + bool m_hasNonUniformScale = false; //!< Whether there is a non-uniform scale component on this entity. + AZ::Vector3 m_cachedNonUniformScale = AZ::Vector3::CreateOne(); //!< Caches the current non-uniform scale. + mutable AZStd::optional m_scaledPrimitive; //!< Approximation for non-uniformly scaled primitive. AZ::ComponentDescriptor::StringWarningArray m_componentWarnings; }; @@ -273,7 +279,6 @@ namespace PhysX void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided, const AZ::Component* instance) const override; void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent, const AZ::Component* instance) const override; void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required, const AZ::Component* instance) const override; - void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible, const AZ::Component* instance) const override; void GetWarnings(AZ::ComponentDescriptor::StringWarningArray& warnings, const AZ::Component* instance) const override; }; diff --git a/Gems/PhysX/Code/Source/EditorForceRegionComponent.cpp b/Gems/PhysX/Code/Source/EditorForceRegionComponent.cpp index 44e031d195..128e859f7a 100644 --- a/Gems/PhysX/Code/Source/EditorForceRegionComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorForceRegionComponent.cpp @@ -148,6 +148,11 @@ namespace PhysX return m_type == ForceType::LinearDamping; } + EditorForceRegionComponent::EditorForceRegionComponent() + : m_nonUniformScaleChangedHandler([this](const AZ::Vector3& scale) {OnNonUniformScaleChanged(scale); }) + { + } + void EditorForceRegionComponent::Reflect(AZ::ReflectContext* context) { EditorForceRegionComponent::EditorForceProxy::Reflect(context); @@ -237,12 +242,22 @@ namespace PhysX required.push_back(AZ_CRC("PhysXTriggerService", 0x3a117d7b)); } + void EditorForceRegionComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + dependent.push_back(AZ_CRC_CE("NonUniformScaleService")); + } + void EditorForceRegionComponent::Activate() { AZ::EntityId entityId = GetEntityId(); EditorComponentBase::Activate(); AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(entityId); + m_cachedNonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(m_cachedNonUniformScale, entityId, &AZ::NonUniformScaleRequests::GetScale); + AZ::NonUniformScaleRequestBus::Event(entityId, &AZ::NonUniformScaleRequests::RegisterScaleChangedEvent, + m_nonUniformScaleChangedHandler); + for (auto& force : m_forces) { force.Activate(entityId); @@ -323,10 +338,20 @@ namespace PhysX randomPoints = Utils::Geometry::GenerateBoxPoints(-halfExtents, halfExtents); } - PhysX::Utils::ColliderPointsLocalToWorld(randomPoints - , GetWorldTM() - , editorColliderComponent->GetColliderConfiguration().m_position - , editorColliderComponent->GetColliderConfiguration().m_rotation); + if (!shapeConfig.IsAssetConfig()) + { + PhysX::Utils::ColliderPointsLocalToWorld(randomPoints + , GetWorldTM() + , editorColliderComponent->GetColliderConfiguration().m_position + , editorColliderComponent->GetColliderConfiguration().m_rotation + , m_cachedNonUniformScale); + } + else + { + const AZ::Vector3 aabbCenter = aabb.GetCenter(); + AZStd::transform(randomPoints.begin(), randomPoints.end(), randomPoints.begin(), + [&aabbCenter](AZ::Vector3& point) {return point + aabbCenter; }); + } DrawForceArrows(randomPoints, debugDisplayRequests); } @@ -408,4 +433,9 @@ namespace PhysX ForceRegionNotificationBus::Broadcast( &ForceRegionNotificationBus::Events::OnForceRegionForceChanged, GetEntityId()); } + + void EditorForceRegionComponent::OnNonUniformScaleChanged(const AZ::Vector3& scale) + { + m_cachedNonUniformScale = scale; + } } diff --git a/Gems/PhysX/Code/Source/EditorForceRegionComponent.h b/Gems/PhysX/Code/Source/EditorForceRegionComponent.h index 735ab52e4c..547689f42f 100644 --- a/Gems/PhysX/Code/Source/EditorForceRegionComponent.h +++ b/Gems/PhysX/Code/Source/EditorForceRegionComponent.h @@ -13,6 +13,7 @@ #include #include +#include #include @@ -30,7 +31,7 @@ namespace PhysX AZ_EDITOR_COMPONENT(EditorForceRegionComponent, EditorForceRegionComponentTypeId, AzToolsFramework::Components::EditorComponentBase); static void Reflect(AZ::ReflectContext* context); - EditorForceRegionComponent() = default; + EditorForceRegionComponent(); // EditorComponentBase void BuildGameEntity(AZ::Entity* gameEntity) override; @@ -39,6 +40,7 @@ namespace PhysX static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); // AZ::Component void Activate() override; @@ -99,8 +101,13 @@ namespace PhysX /// Callback invoked when there are changes to the forces in this force region. void OnForcesChanged() const; + /// Called when non-uniform scale is updated. + void OnNonUniformScaleChanged(const AZ::Vector3& scale); + bool m_visibleInEditor = true; ///< Visible in the editor viewport even if force region entity is unselected. bool m_debugForces = false; ///< Draw debug lines (arrows) for forces in game. AZStd::vector m_forces; ///< Forces (editor version) in force region. + AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler; ///< Responds to changes in non-uniform scale. + AZ::Vector3 m_cachedNonUniformScale = AZ::Vector3::CreateOne(); ///< Caches non-uniform scale for this entity. }; } diff --git a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp index dea8eb4402..eff1997473 100644 --- a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -27,12 +28,93 @@ namespace PhysX { + namespace Internal + { + AZStd::vector> GetCollisionShapes(AZ::Entity* entity) + { + AZStd::vector> allShapes; + + const bool hasNonUniformScaleComponent = (AZ::NonUniformScaleRequestBus::FindFirstHandler(entity->GetId()) != nullptr); + + const AZStd::vector colliders = entity->FindComponents(); + for (const EditorColliderComponent* collider : colliders) + { + const EditorProxyShapeConfig& shapeConfigurationProxy = collider->GetShapeConfiguration(); + if (shapeConfigurationProxy.IsAssetConfig() && !shapeConfigurationProxy.m_physicsAsset.m_configuration.m_asset.IsReady()) + { + continue; + } + + const Physics::ColliderConfiguration colliderConfiguration = collider->GetColliderConfigurationScaled(); + if (shapeConfigurationProxy.IsAssetConfig()) + { + AZStd::vector> shapes; + Utils::GetShapesFromAsset(shapeConfigurationProxy.m_physicsAsset.m_configuration, + colliderConfiguration, hasNonUniformScaleComponent, shapeConfigurationProxy.m_subdivisionLevel, shapes); + + for (const auto& shape : shapes) + { + AZ_Assert(shape, "CreateEditorWorldRigidBody: Shape must not be null!"); + allShapes.emplace_back(shape); + } + } + else + { + const Physics::ShapeConfiguration& shapeConfiguration = shapeConfigurationProxy.GetCurrent(); + if (!hasNonUniformScaleComponent) + { + AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape( + colliderConfiguration, shapeConfiguration); + AZ_Assert(shape, "CreateEditorWorldRigidBody: Shape must not be null!"); + if (shape) + { + allShapes.emplace_back(shape); + } + } + else + { + const Physics::ColliderConfiguration colliderConfigurationUnscaled = collider->GetColliderConfiguration(); + auto convexConfig = Utils::CreateConvexFromPrimitive(colliderConfigurationUnscaled, shapeConfiguration, + shapeConfigurationProxy.m_subdivisionLevel, shapeConfiguration.m_scale); + auto colliderConfigurationNoOffset = colliderConfigurationUnscaled; + colliderConfigurationNoOffset.m_rotation = AZ::Quaternion::CreateIdentity(); + colliderConfigurationNoOffset.m_position = AZ::Vector3::CreateZero(); + + if (convexConfig.has_value()) + { + AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape( + colliderConfigurationNoOffset, convexConfig.value()); + allShapes.emplace_back(shape); + } + } + } + } + + const AZStd::vector shapeColliders = entity->FindComponents(); + for (const EditorShapeColliderComponent* shapeCollider : shapeColliders) + { + const Physics::ColliderConfiguration& colliderConfig = shapeCollider->GetColliderConfiguration(); + const AZStd::vector>& shapeConfigs = + shapeCollider->GetShapeConfigurations(); + for (const auto& shapeConfig : shapeConfigs) + { + AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape(colliderConfig, *shapeConfig); + AZ_Assert(shape, "CreateEditorWorldRigidBody: Shape must not be null!"); + allShapes.emplace_back(shape); + } + } + + return allShapes; + } + } // namespace Internal + + void EditorRigidBodyConfiguration::Reflect(AZ::ReflectContext* context) { auto serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(2, &ClassConverters::EditorRigidBodyConfigVersionConverter) ->Field("Debug Draw Center of Mass", &EditorRigidBodyConfiguration::m_centerOfMassDebugDraw) ; @@ -40,104 +122,104 @@ namespace PhysX AZ::EditContext* editContext = serializeContext->GetEditContext(); if (editContext) { - editContext->Class( + editContext->Class( "PhysX Rigid Body Configuration", "") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Category, "PhysX") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_initialLinearVelocity, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_initialLinearVelocity, "Initial linear velocity", "Initial linear velocity") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInitialVelocitiesVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInitialVelocitiesVisibility) ->Attribute(AZ::Edit::Attributes::Suffix, " " + Physics::NameConstants::GetSpeedUnit()) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_initialAngularVelocity, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_initialAngularVelocity, "Initial angular velocity", "Initial angular velocity (limited by maximum angular velocity)") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInitialVelocitiesVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInitialVelocitiesVisibility) ->Attribute(AZ::Edit::Attributes::Suffix, " " + Physics::NameConstants::GetAngularVelocityUnit()) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_linearDamping, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_linearDamping, "Linear damping", "Linear damping (must be non-negative)") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetDampingVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetDampingVisibility) ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_angularDamping, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_angularDamping, "Angular damping", "Angular damping (must be non-negative)") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetDampingVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetDampingVisibility) ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_sleepMinEnergy, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_sleepMinEnergy, "Sleep threshold", "Kinetic energy per unit mass below which body can go to sleep (must be non-negative)") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetSleepOptionsVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetSleepOptionsVisibility) ->Attribute(AZ::Edit::Attributes::Min, 0.0f) ->Attribute(AZ::Edit::Attributes::Suffix, " " + Physics::NameConstants::GetSleepThresholdUnit()) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_startAsleep, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_startAsleep, "Start asleep", "The rigid body will be asleep when spawned") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetSleepOptionsVisibility) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_interpolateMotion, + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetSleepOptionsVisibility) + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_interpolateMotion, "Interpolate motion", "Makes object motion look smoother") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInterpolationVisibility) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_gravityEnabled, + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInterpolationVisibility) + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_gravityEnabled, "Gravity enabled", "Rigid body will be affected by gravity") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetGravityVisibility) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_kinematic, + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetGravityVisibility) + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_kinematic, "Kinematic", "Rigid body is kinematic") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetKinematicVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetKinematicVisibility) ->ClassElement(AZ::Edit::ClassElements::Group, "Continuous Collision Detection") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetCCDVisibility) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_ccdEnabled, + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetCCDVisibility) + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_ccdEnabled, "CCD enabled", "Whether continuous collision detection is enabled for this body") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetCCDVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetCCDVisibility) ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_ccdMinAdvanceCoefficient, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_ccdMinAdvanceCoefficient, "Min advance coefficient", "Lower values reduce clipping but can affect simulation smoothness") ->Attribute(AZ::Edit::Attributes::Min, 0.01f) ->Attribute(AZ::Edit::Attributes::Step, 0.01f) ->Attribute(AZ::Edit::Attributes::Max, 0.99f) - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::IsCCDEnabled) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_ccdFrictionEnabled, + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::IsCCDEnabled) + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_ccdFrictionEnabled, "CCD friction", "Whether friction is applied when CCD collisions are resolved") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::IsCCDEnabled) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::IsCCDEnabled) ->ClassElement(AZ::Edit::ClassElements::Group, "") // end previous group by starting new unnamed expanded group ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_maxAngularVelocity, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_maxAngularVelocity, "Maximum angular velocity", "The PhysX solver will clamp angular velocities with magnitude exceeding this value") ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetMaxVelocitiesVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetMaxVelocitiesVisibility) ->Attribute(AZ::Edit::Attributes::Suffix, " " + Physics::NameConstants::GetAngularVelocityUnit()) // Mass properties ->DataElement(AZ::Edit::UIHandlers::Default, &RigidBodyConfiguration::m_computeCenterOfMass, "Compute COM", "Whether to automatically compute the center of mass") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInertiaSettingsVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInertiaSettingsVisibility) ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) ->DataElement(AZ::Edit::UIHandlers::Default, &RigidBodyConfiguration::m_centerOfMassOffset, "COM offset", "Center of mass offset in local frame") - ->Attribute(AZ::Edit::Attributes::Visibility, &RigidBodyConfiguration::GetCoMVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetCoMVisibility) ->Attribute(AZ::Edit::Attributes::Suffix, " " + Physics::NameConstants::GetLengthUnit()) ->DataElement(AZ::Edit::UIHandlers::Default, &RigidBodyConfiguration::m_computeMass, "Compute Mass", "Whether to automatically compute the mass") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInertiaSettingsVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInertiaSettingsVisibility) ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) - ->DataElement(AZ::Edit::UIHandlers::Default, &Physics::RigidBodyConfiguration::m_mass, + ->DataElement(AZ::Edit::UIHandlers::Default, &AzPhysics::RigidBodyConfiguration::m_mass, "Mass", "The mass of the object (must be non-negative, with a value of zero treated as infinite)") ->Attribute(AZ::Edit::Attributes::Min, 0.0f) ->Attribute(AZ::Edit::Attributes::Suffix, " " + Physics::NameConstants::GetMassUnit()) - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetMassVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetMassVisibility) ->DataElement(AZ::Edit::UIHandlers::Default, &RigidBodyConfiguration::m_computeInertiaTensor, "Compute inertia", "Whether to automatically compute the inertia values based on the mass and shape of the rigid body") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInertiaSettingsVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInertiaSettingsVisibility) ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) - ->DataElement(Editor::InertiaHandler, &Physics::RigidBodyConfiguration::m_inertiaTensor, + ->DataElement(Editor::InertiaHandler, &AzPhysics::RigidBodyConfiguration::m_inertiaTensor, "Inertia diagonal", "Diagonal elements of the inertia tensor") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInertiaVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInertiaVisibility) ->Attribute(AZ::Edit::Attributes::Suffix, " " + Physics::NameConstants::GetInertiaUnit()) ->DataElement(AZ::Edit::UIHandlers::Default, &RigidBodyConfiguration::m_includeAllShapesInMassCalculation, "Include non-simulated shapes in Mass", "If set, non-simulated shapes will also be included in the center of mass, inertia and mass calculations.") - ->Attribute(AZ::Edit::Attributes::Visibility, &Physics::RigidBodyConfiguration::GetInertiaSettingsVisibility) + ->Attribute(AZ::Edit::Attributes::Visibility, &AzPhysics::RigidBodyConfiguration::GetInertiaSettingsVisibility) ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) ; @@ -159,7 +241,16 @@ namespace PhysX AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(GetEntityId()); AZ::TransformNotificationBus::Handler::BusConnect(GetEntityId()); Physics::ColliderComponentEventBus::Handler::BusConnect(GetEntityId()); - Physics::WorldNotificationBus::Handler::BusConnect(Physics::EditorPhysicsWorldId); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SceneHandle editorSceneHandle = sceneInterface->GetSceneHandle(AzPhysics::EditorPhysicsSceneName); + sceneInterface->RegisterSceneSimulationStartHandler(editorSceneHandle, m_sceneStartSimHandler); + } + + m_nonUniformScaleChangedHandler = AZ::NonUniformScaleChangedEvent::Handler( + [this](const AZ::Vector3& scale) {OnNonUniformScaleChanged(scale); }); + AZ::NonUniformScaleRequestBus::Event(GetEntityId(), &AZ::NonUniformScaleRequests::RegisterScaleChangedEvent, + m_nonUniformScaleChangedHandler); if (auto* physXDebug = AZ::Interface::Get()) { @@ -171,7 +262,7 @@ namespace PhysX physXDebug->RegisterDebugDisplayDataChangedEvent(m_debugDisplayDataChangeHandler); UpdateDebugDrawSettings(physXDebug->GetDebugDisplayData()); } - UpdateEditorWorldRigidBody(); + CreateEditorWorldRigidBody(); Physics::WorldBodyRequestBus::Handler::BusConnect(GetEntityId()); } @@ -181,13 +272,18 @@ namespace PhysX m_debugDisplayDataChangeHandler.Disconnect(); Physics::WorldBodyRequestBus::Handler::BusDisconnect(); - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneStartSimHandler.Disconnect(); Physics::ColliderComponentEventBus::Handler::BusDisconnect(); AZ::TransformNotificationBus::Handler::BusDisconnect(); AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect(); AzToolsFramework::Components::EditorComponentBase::Deactivate(); - m_editorBody.reset(); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_rigidBodyHandle); + m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + m_editorBody = nullptr; + } } void EditorRigidBodyComponent::Reflect(AZ::ReflectContext* context) @@ -216,21 +312,28 @@ namespace PhysX ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/console/lumberyard/components/physx/rigid-body") ->DataElement(0, &EditorRigidBodyComponent::m_config, "Configuration", "Configuration for rigid body physics.") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorRigidBodyComponent::UpdateEditorWorldRigidBody) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorRigidBodyComponent::CreateEditorWorldRigidBody) ; } } } + EditorRigidBodyComponent::EditorRigidBodyComponent() + { + InitPhysicsTickHandler(); + } + EditorRigidBodyComponent::EditorRigidBodyComponent(const EditorRigidBodyConfiguration& config) : m_config(config) { - + InitPhysicsTickHandler(); } void EditorRigidBodyComponent::BuildGameEntity(AZ::Entity* gameEntity) { - gameEntity->CreateComponent(m_config); + // for now use Invalid scene which will fall back on default scene when entity is activated. + // update to correct scene once multi-scene is fully supported. + gameEntity->CreateComponent(m_config, AzPhysics::InvalidSceneHandle); } void EditorRigidBodyComponent::DisplayEntityViewport( @@ -246,110 +349,86 @@ namespace PhysX } } - void EditorRigidBodyComponent::UpdateEditorWorldRigidBody() + void EditorRigidBodyComponent::CreateEditorWorldRigidBody() { - AZStd::shared_ptr editorWorld; - Physics::EditorWorldBus::BroadcastResult(editorWorld, &Physics::EditorWorldRequests::GetEditorWorld); - - AZ_Assert(editorWorld, "Attempting to create an edit time rigid body without an editor world."); - - if (editorWorld) + if (auto* sceneInterface = AZ::Interface::Get()) { - AZ::Transform colliderTransform = GetWorldTM(); - colliderTransform.ExtractScale(); - - Physics::RigidBodyConfiguration configuration; - configuration.m_orientation = colliderTransform.GetRotation(); - configuration.m_position = colliderTransform.GetTranslation(); - configuration.m_entityId = GetEntityId(); - configuration.m_debugName = GetEntity()->GetName(); - configuration.m_centerOfMassOffset = m_config.m_centerOfMassOffset; - configuration.m_computeCenterOfMass = m_config.m_computeCenterOfMass; - configuration.m_computeInertiaTensor = m_config.m_computeInertiaTensor; - configuration.m_inertiaTensor = m_config.m_inertiaTensor; - configuration.m_simulated = false; - configuration.m_kinematic = m_config.m_kinematic; - - m_editorBody = AZ::Interface::Get()->CreateRigidBody(configuration); - const AZStd::vector colliders = GetEntity()->FindComponents(); - for (const EditorColliderComponent* collider : colliders) + m_editorSceneHandle = sceneInterface->GetSceneHandle(AzPhysics::EditorPhysicsSceneName); + if (m_editorSceneHandle == AzPhysics::InvalidSceneHandle) { - const EditorProxyShapeConfig& shapeConfigurationProxy = collider->GetShapeConfiguration(); - - if (shapeConfigurationProxy.IsAssetConfig() && !shapeConfigurationProxy.m_physicsAsset.m_configuration.m_asset.IsReady()) - { - continue; - } - - const Physics::ColliderConfiguration colliderConfiguration = collider->GetColliderConfigurationScaled(); - - if (shapeConfigurationProxy.IsAssetConfig()) - { - AZStd::vector> shapes; - Utils::GetShapesFromAsset(shapeConfigurationProxy.m_physicsAsset.m_configuration, - colliderConfiguration, - shapes); - - for (const auto& shape : shapes) - { - AZ_Assert(shape, "CreateEditorWorldRigidBody: Shape must not be null!"); - m_editorBody->AddShape(shape); - } - } - else - { - const Physics::ShapeConfiguration& shapeConfiguration = shapeConfigurationProxy.GetCurrent(); - - AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape( - colliderConfiguration, - shapeConfiguration); - - if (shape) - { - m_editorBody->AddShape(shape); - } - } + AZ_Assert(false, "Attempting to create an edit time rigid body without an editor scene."); + return; } + } + + AZ::Transform colliderTransform = GetWorldTM(); + colliderTransform.ExtractScale(); + + AzPhysics::RigidBodyConfiguration configuration; + configuration.m_orientation = colliderTransform.GetRotation(); + configuration.m_position = colliderTransform.GetTranslation(); + configuration.m_entityId = GetEntityId(); + configuration.m_debugName = GetEntity()->GetName(); + configuration.m_centerOfMassOffset = m_config.m_centerOfMassOffset; + configuration.m_computeCenterOfMass = m_config.m_computeCenterOfMass; + configuration.m_computeInertiaTensor = m_config.m_computeInertiaTensor; + configuration.m_inertiaTensor = m_config.m_inertiaTensor; + configuration.m_simulated = false; + configuration.m_kinematic = m_config.m_kinematic; + configuration.m_colliderAndShapeData = Internal::GetCollisionShapes(GetEntity()); + + if (auto* sceneInterface = AZ::Interface::Get()) + { + m_rigidBodyHandle = sceneInterface->AddSimulatedBody(m_editorSceneHandle, &configuration); + m_editorBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_editorSceneHandle, m_rigidBodyHandle)); + } - const AZStd::vector shapeColliders = GetEntity()->FindComponents(); - for (const EditorShapeColliderComponent* shapeCollider : shapeColliders) - { - const Physics::ColliderConfiguration& colliderConfig = shapeCollider->GetColliderConfiguration(); - const AZStd::vector>& shapeConfigs = - shapeCollider->GetShapeConfigurations(); - for (const auto& shapeConfig : shapeConfigs) - { - AZStd::shared_ptr shape; - shape = AZ::Interface::Get()->CreateShape(colliderConfig, *shapeConfig); - m_editorBody->AddShape(shape); - } - } + m_editorBody->UpdateMassProperties(m_config.GetMassComputeFlags(), &m_config.m_centerOfMassOffset, &m_config.m_inertiaTensor, &m_config.m_mass); + m_config.m_mass = m_editorBody->GetMass(); + m_config.m_centerOfMassOffset = m_editorBody->GetCenterOfMassLocal(); + m_config.m_inertiaTensor = m_editorBody->GetInverseInertiaLocal(); + } - m_editorBody->UpdateMassProperties(m_config.GetMassComputeFlags(), &m_config.m_centerOfMassOffset, &m_config.m_inertiaTensor, &m_config.m_mass); - m_config.m_mass = m_editorBody->GetMass(); - m_config.m_centerOfMassOffset = m_editorBody->GetCenterOfMassLocal(); - m_config.m_inertiaTensor = m_editorBody->GetInverseInertiaLocal(); + void EditorRigidBodyComponent::OnColliderChanged() + { + //recreate the rigid body when collider changes + SetShouldBeRecreated(); + } - editorWorld->AddBody(*m_editorBody); - } + void EditorRigidBodyComponent::OnTransformChanged([[maybe_unused]]const AZ::Transform& local, [[maybe_unused]]const AZ::Transform& world) + { + SetShouldBeRecreated(); } - void EditorRigidBodyComponent::OnColliderChanged() + void EditorRigidBodyComponent::OnNonUniformScaleChanged([[maybe_unused]] const AZ::Vector3& scale) { - SetShouldBeUpdated(); + SetShouldBeRecreated(); } - void EditorRigidBodyComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& /*world*/) + void EditorRigidBodyComponent::InitPhysicsTickHandler() { - SetShouldBeUpdated(); + m_sceneStartSimHandler = AzPhysics::SceneEvents::OnSceneSimulationStartHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime + ) + { + this->PrePhysicsTick(); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Components)); } - void EditorRigidBodyComponent::OnPrePhysicsSubtick(float /*fixedDeltaTime*/) + void EditorRigidBodyComponent::PrePhysicsTick() { - if (m_shouldBeUpdated) + if (m_shouldBeRecreated) { - UpdateEditorWorldRigidBody(); - m_shouldBeUpdated = false; + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_rigidBodyHandle); + m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + m_editorBody = nullptr; + + CreateEditorWorldRigidBody(); + } + m_shouldBeRecreated = false; } } @@ -357,18 +436,18 @@ namespace PhysX { if (!IsPhysicsEnabled()) { - UpdateEditorWorldRigidBody(); + m_editorBody->SetSimulationEnabled(true); } } void EditorRigidBodyComponent::DisablePhysics() { - m_editorBody.reset(); + m_editorBody->SetSimulationEnabled(false); } bool EditorRigidBodyComponent::IsPhysicsEnabled() const { - return m_editorBody && m_editorBody->GetWorld(); + return m_editorBody && m_editorBody->m_simulating; } AZ::Aabb EditorRigidBodyComponent::GetAabb() const @@ -380,18 +459,18 @@ namespace PhysX return AZ::Aabb::CreateNull(); } - Physics::WorldBody* EditorRigidBodyComponent::GetWorldBody() + AzPhysics::SimulatedBody* EditorRigidBodyComponent::GetWorldBody() { - return m_editorBody.get(); + return m_editorBody; } - Physics::RayCastHit EditorRigidBodyComponent::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit EditorRigidBodyComponent::RayCast(const AzPhysics::RayCastRequest& request) { if (m_editorBody) { return m_editorBody->RayCast(request); } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } void EditorRigidBodyComponent::UpdateDebugDrawSettings(const Debug::DebugDisplayData& data) @@ -400,16 +479,16 @@ namespace PhysX m_centerOfMassDebugSize = data.m_centerOfMassDebugSize; } - const Physics::RigidBody* EditorRigidBodyComponent::GetRigidBody() const + const AzPhysics::RigidBody* EditorRigidBodyComponent::GetRigidBody() const { - return m_editorBody.get(); + return m_editorBody; } - void EditorRigidBodyComponent::SetShouldBeUpdated() + void EditorRigidBodyComponent::SetShouldBeRecreated() { - if (!m_shouldBeUpdated) + if (!m_shouldBeRecreated) { - m_shouldBeUpdated = true; + m_shouldBeRecreated = true; } } } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.h b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.h index 28a96973f7..2d42812292 100644 --- a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.h +++ b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.h @@ -15,11 +15,13 @@ #include #include -#include -#include +#include #include +#include +#include #include +#include #include #include #include @@ -29,10 +31,10 @@ namespace PhysX /// Configuration data for EditorPhysXRigidBodyComponent. /// struct EditorRigidBodyConfiguration - : public Physics::RigidBodyConfiguration + : public AzPhysics::RigidBodyConfiguration { AZ_CLASS_ALLOCATOR(EditorRigidBodyConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(EditorRigidBodyConfiguration, "{27297024-5A99-4C58-8614-4EF18137CE69}", Physics::RigidBodyConfiguration); + AZ_RTTI(EditorRigidBodyConfiguration, "{27297024-5A99-4C58-8614-4EF18137CE69}", AzPhysics::RigidBodyConfiguration); static void Reflect(AZ::ReflectContext* context); @@ -47,14 +49,13 @@ namespace PhysX , protected AzFramework::EntityDebugDisplayEventBus::Handler , private AZ::TransformNotificationBus::Handler , private Physics::ColliderComponentEventBus::Handler - , private Physics::WorldNotificationBus::Handler , private Physics::WorldBodyRequestBus::Handler { public: AZ_EDITOR_COMPONENT(EditorRigidBodyComponent, "{F2478E6B-001A-4006-9D7E-DCB5A6B041DD}", AzToolsFramework::Components::EditorComponentBase); static void Reflect(AZ::ReflectContext* context); - EditorRigidBodyComponent() = default; + EditorRigidBodyComponent(); explicit EditorRigidBodyComponent(const EditorRigidBodyConfiguration& configuration); ~EditorRigidBodyComponent() = default; @@ -79,6 +80,7 @@ namespace PhysX static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) { dependent.push_back(AZ_CRC("PhysXColliderService", 0x4ff43f7c)); + dependent.push_back(AZ_CRC_CE("NonUniformScaleService")); } // AZ::Component @@ -88,7 +90,7 @@ namespace PhysX // EditorComponentBase void BuildGameEntity(AZ::Entity* gameEntity) override; - const Physics::RigidBody* GetRigidBody() const; + const AzPhysics::RigidBody* GetRigidBody() const; private: // AzFramework::EntityDebugDisplayEventBus @@ -99,31 +101,40 @@ namespace PhysX // TransformBus void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; + // non-uniform scale handling + void OnNonUniformScaleChanged(const AZ::Vector3& scale); + // Physics::ColliderComponentEventBus void OnColliderChanged() override; - // Physics::WorldNotificationBus - void OnPrePhysicsSubtick(float fixedDeltaTime) override; - // WorldBodyRequestBus void EnablePhysics() override; void DisablePhysics() override; bool IsPhysicsEnabled() const override; AZ::Aabb GetAabb() const override; - Physics::WorldBody* GetWorldBody() override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SimulatedBody* GetWorldBody() override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; - void UpdateEditorWorldRigidBody(); + void CreateEditorWorldRigidBody(); void UpdateDebugDrawSettings(const Debug::DebugDisplayData& data); - void SetShouldBeUpdated(); + void SetShouldBeRecreated(); + + void InitPhysicsTickHandler(); + void PrePhysicsTick(); Debug::DebugDisplayDataChangedEvent::Handler m_debugDisplayDataChangeHandler; EditorRigidBodyConfiguration m_config; - AZStd::unique_ptr m_editorBody; + AzPhysics::SimulatedBodyHandle m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + AzPhysics::RigidBody* m_editorBody = nullptr; + AzPhysics::SceneHandle m_editorSceneHandle = AzPhysics::InvalidSceneHandle; + AZ::Color m_centerOfMassDebugColor = AZ::Colors::White; float m_centerOfMassDebugSize = 0.1f; - bool m_shouldBeUpdated = false; + bool m_shouldBeRecreated = false; + + AzPhysics::SceneEvents::OnSceneSimulationStartHandler m_sceneStartSimHandler; + AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler; //!< Responds to changes in non-uniform scale. }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp index 96cca0807b..2c3c8adf48 100644 --- a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include @@ -30,6 +32,7 @@ #include #include +#include #include namespace PhysX @@ -47,6 +50,7 @@ namespace PhysX m_colliderConfig.m_materialSelection.OnDefaultMaterialLibraryChanged(defaultMaterialLibrary); Physics::ColliderComponentEventBus::Event(GetEntityId(), &Physics::ColliderComponentEvents::OnColliderChanged); }) + , m_nonUniformScaleChangedHandler([this](const AZ::Vector3& scale) {OnNonUniformScaleChanged(scale);}) { m_colliderConfig.SetPropertyVisibility(Physics::ColliderConfiguration::Offset, false); } @@ -182,13 +186,13 @@ namespace PhysX if (polygonPrismPtr) { const AZ::Vector3 uniformScale = Utils::GetUniformScale(GetEntityId()); + const AZ::Vector3 overallScale = uniformScale * m_currentNonUniformScale; const AZStd::vector& vertices = polygonPrismPtr->m_vertexContainer.GetVertices(); for (const auto& vertex : vertices) { - const float scalarScale = uniformScale.GetX(); - const float scaledX = scalarScale * vertex.GetX(); - const float scaledY = scalarScale * vertex.GetY(); + const float scaledX = overallScale.GetX() * vertex.GetX(); + const float scaledY = overallScale.GetY() * vertex.GetY(); m_geometryCache.m_cachedSamplePoints.emplace_back(AZ::Vector3(scaledX, scaledY, 0.0f)); m_geometryCache.m_cachedSamplePoints.emplace_back(AZ::Vector3(scaledX, scaledY, m_geometryCache.m_height)); } @@ -247,30 +251,26 @@ namespace PhysX return; } - AZStd::shared_ptr editorWorld; - Physics::EditorWorldBus::BroadcastResult(editorWorld, &Physics::EditorWorldRequests::GetEditorWorld); - if (editorWorld) - { - AZ::Transform colliderTransform = GetWorldTM(); - - Physics::WorldBodyConfiguration configuration; - configuration.m_orientation = colliderTransform.GetRotation(); - configuration.m_position = colliderTransform.GetTranslation(); - configuration.m_entityId = GetEntityId(); - configuration.m_debugName = GetEntity()->GetName(); + const AZ::Transform colliderTransform = GetWorldTM(); - m_editorBody = AZ::Interface::Get()->CreateStaticRigidBody(configuration); + AzPhysics::StaticRigidBodyConfiguration configuration; + configuration.m_orientation = colliderTransform.GetRotation(); + configuration.m_position = colliderTransform.GetTranslation(); + configuration.m_entityId = GetEntityId(); + configuration.m_debugName = GetEntity()->GetName(); - for (const auto& shapeConfig : m_shapeConfigs) - { - AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape(m_colliderConfig, *shapeConfig); - m_editorBody->AddShape(shape); - } + AZStd::vector colliderShapePairs; + colliderShapePairs.reserve(m_shapeConfigs.size()); + for (const auto& shapeConfig : m_shapeConfigs) + { + colliderShapePairs.emplace_back(&m_colliderConfig, shapeConfig.get()); + } + configuration.m_colliderAndShapeData = colliderShapePairs; - if (!m_shapeConfigs.empty()) - { - editorWorld->AddBody(*m_editorBody); - } + if (m_sceneInterface) + { + m_editorBodyHandle = m_sceneInterface->AddSimulatedBody(m_editorSceneHandle, &configuration); + m_editorBody = azdynamic_cast(m_sceneInterface->GetSimulatedBodyFromHandle(m_editorSceneHandle, m_editorBodyHandle)); } Physics::WorldBodyRequestBus::Handler::BusConnect(GetEntityId()); @@ -292,11 +292,12 @@ namespace PhysX &LmbrCentral::ShapeComponentRequests::GetShapeType); const AZ::Vector3 uniformScale = Utils::GetUniformScale(GetEntityId()); + const AZ::Vector3 overallScale = uniformScale * m_currentNonUniformScale; // using if blocks because switch statements aren't supported for values generated by the crc macro if (shapeCrc == ShapeConstants::Box) { - UpdateBoxConfig(uniformScale); + UpdateBoxConfig(overallScale); } else if (shapeCrc == ShapeConstants::Capsule) @@ -561,7 +562,8 @@ namespace PhysX const float unscaledPrismHeight = polygonPrismPtr->GetHeight(); const AZ::Vector3 uniformScale = Utils::GetUniformScale(GetEntityId()); - m_geometryCache.m_height = uniformScale.GetX() * unscaledPrismHeight; + const AZ::Vector3 overallScale = uniformScale * m_currentNonUniformScale; + m_geometryCache.m_height = overallScale.GetZ() * unscaledPrismHeight; int shapeConfigsCount = 0; bool refreshPropertyTree = false; @@ -584,7 +586,7 @@ namespace PhysX currentEdge = currentEdge->m_next; } - AZStd::optional shapeConfig = Utils::CreatePxCookedMeshConfiguration(points, uniformScale); + AZStd::optional shapeConfig = Utils::CreatePxCookedMeshConfiguration(points, overallScale); if (shapeConfig.has_value()) { @@ -635,9 +637,19 @@ namespace PhysX AZ::TransformNotificationBus::Handler::BusConnect(GetEntityId()); LmbrCentral::ShapeComponentNotificationsBus::Handler::BusConnect(GetEntityId()); PhysX::ColliderShapeRequestBus::Handler::BusConnect(GetEntityId()); + AZ::NonUniformScaleRequestBus::Event(GetEntityId(), &AZ::NonUniformScaleRequests::RegisterScaleChangedEvent, + m_nonUniformScaleChangedHandler); AZ::TransformBus::EventResult(m_cachedWorldTransform, GetEntityId(), &AZ::TransformInterface::GetWorldTM); + m_currentNonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(m_currentNonUniformScale, GetEntityId(), &AZ::NonUniformScaleRequests::GetScale); + + if (m_sceneInterface = AZ::Interface::Get()) + { + m_editorSceneHandle = m_sceneInterface->GetSceneHandle(AzPhysics::EditorPhysicsSceneName); + } + UpdateShapeConfigs(); // Debug drawing @@ -660,7 +672,12 @@ namespace PhysX AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect(); AzToolsFramework::Components::EditorComponentBase::Deactivate(); - m_editorBody = nullptr; + if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle); + m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + m_editorBody = nullptr; + } } // AzToolsFramework::EntitySelectionEvents @@ -695,22 +712,36 @@ namespace PhysX Physics::ColliderComponentEventBus::Event(GetEntityId(), &Physics::ColliderComponentEvents::OnColliderChanged); } + void EditorShapeColliderComponent::OnNonUniformScaleChanged(const AZ::Vector3& scale) + { + m_currentNonUniformScale = scale; + + UpdateShapeConfigs(); + + CreateStaticEditorCollider(); + m_geometryCache.m_cachedSamplePointsDirty = true; + Physics::ColliderComponentEventBus::Event(GetEntityId(), &Physics::ColliderComponentEvents::OnColliderChanged); + } + void EditorShapeColliderComponent::EnablePhysics() { - if (!IsPhysicsEnabled()) + if (!IsPhysicsEnabled() && m_sceneInterface) { - CreateStaticEditorCollider(); + m_sceneInterface->EnableSimulationOfBody(m_editorSceneHandle, m_editorBodyHandle); } } void EditorShapeColliderComponent::DisablePhysics() { - m_editorBody.reset(); + if (m_sceneInterface) + { + m_sceneInterface->DisableSimulationOfBody(m_editorSceneHandle, m_editorBodyHandle); + } } bool EditorShapeColliderComponent::IsPhysicsEnabled() const { - return m_editorBody && m_editorBody->GetWorld(); + return m_editorBody != nullptr && m_editorBody->m_simulating; } AZ::Aabb EditorShapeColliderComponent::GetAabb() const @@ -722,18 +753,18 @@ namespace PhysX return AZ::Aabb::CreateNull(); } - Physics::WorldBody* EditorShapeColliderComponent::GetWorldBody() + AzPhysics::SimulatedBody* EditorShapeColliderComponent::GetWorldBody() { - return m_editorBody.get(); + return m_editorBody; } - Physics::RayCastHit EditorShapeColliderComponent::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit EditorShapeColliderComponent::RayCast(const AzPhysics::RayCastRequest& request) { if (m_editorBody) { return m_editorBody->RayCast(request); } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } // LmbrCentral::ShapeComponentNotificationBus @@ -760,9 +791,10 @@ namespace PhysX if (polygonPrismPtr) { const AZ::Vector3 uniformScale = Utils::GetUniformScale(GetEntityId()); + const AZ::Vector3 overallScale = uniformScale * m_currentNonUniformScale; const float height = polygonPrismPtr->GetHeight(); m_colliderDebugDraw.DrawPolygonPrism(debugDisplay, m_colliderConfig, m_mesh.GetDebugDrawPoints(height, - uniformScale.GetX())); + overallScale)); } } @@ -788,7 +820,7 @@ namespace PhysX case Physics::ShapeType::Box: { const auto& boxConfig = static_cast(*shapeConfig); - m_colliderDebugDraw.DrawBox(debugDisplay, m_colliderConfig, boxConfig, AZ::Vector3::CreateOne(), true); + m_colliderDebugDraw.DrawBox(debugDisplay, m_colliderConfig, boxConfig, m_currentNonUniformScale, false); break; } case Physics::ShapeType::Capsule: diff --git a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h index 484653f5a3..bbb14fe6a4 100644 --- a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h +++ b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h @@ -13,11 +13,12 @@ #pragma once #include +#include #include #include -#include #include #include +#include #include #include #include @@ -26,8 +27,16 @@ #include #include +namespace AzPhysics +{ + class SceneInterface; + struct SimulatedBody; +} + namespace PhysX { + class StaticRigidBody; + enum class ShapeType { None, @@ -108,13 +117,16 @@ namespace PhysX // TransformBus void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; + // handling for non-uniform scale + void OnNonUniformScaleChanged(const AZ::Vector3& scale); + // WorldBodyRequestBus void EnablePhysics() override; void DisablePhysics() override; bool IsPhysicsEnabled() const override; AZ::Aabb GetAabb() const override; - Physics::WorldBody* GetWorldBody() override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SimulatedBody* GetWorldBody() override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; // LmbrCentral::ShapeComponentNotificationBus void OnShapeChanged(LmbrCentral::ShapeComponentNotifications::ShapeChangeReasons changeReason) override; @@ -128,7 +140,10 @@ namespace PhysX Physics::ColliderConfiguration m_colliderConfig; //!< Stores collision layers, whether the collider is a trigger, etc. DebugDraw::Collider m_colliderDebugDraw; //!< Handles drawing the collider based on global and local - AZStd::unique_ptr m_editorBody; //!< Body in the editor physics world if there is no rigid body component. + AzPhysics::SceneInterface* m_sceneInterface = nullptr; + AzPhysics::SceneHandle m_editorSceneHandle = AzPhysics::InvalidSceneHandle; + StaticRigidBody* m_editorBody = nullptr; //!< Body in the editor physics scene if there is no rigid body component. + AzPhysics::SimulatedBodyHandle m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; //!< Handle to the body in the editor physics scene if there is no rigid body component. bool m_shapeTypeWarningIssued = false; //!< Records whether a warning about unsupported shapes has been previously issued. PolygonPrismMeshUtils::Mesh2D m_mesh; //!< Used for storing decompositions of the polygon prism. AZStd::vector> m_shapeConfigs; //!< Stores the physics shape configuration(s). @@ -142,5 +157,7 @@ namespace PhysX AzPhysics::SystemEvents::OnConfigurationChangedEvent::Handler m_physXConfigChangedHandler; AzPhysics::SystemEvents::OnDefaultMaterialLibraryChangedEvent::Handler m_onDefaultMaterialLibraryChangedEventHandler; AZ::Transform m_cachedWorldTransform; + AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler; //!< Responds to changes in non-uniform scale. + AZ::Vector3 m_currentNonUniformScale = AZ::Vector3::CreateOne(); //!< Caches the current non-uniform scale. }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/FixedJointComponent.cpp b/Gems/PhysX/Code/Source/FixedJointComponent.cpp index 5e48e8b3ad..8170477aeb 100644 --- a/Gems/PhysX/Code/Source/FixedJointComponent.cpp +++ b/Gems/PhysX/Code/Source/FixedJointComponent.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include diff --git a/Gems/PhysX/Code/Source/ForceRegionComponent.cpp b/Gems/PhysX/Code/Source/ForceRegionComponent.cpp index fb7841261d..e408d68eec 100644 --- a/Gems/PhysX/Code/Source/ForceRegionComponent.cpp +++ b/Gems/PhysX/Code/Source/ForceRegionComponent.cpp @@ -13,14 +13,13 @@ #include #include -#include #include #include -#include -#include -#include +#include +#include #include +#include namespace PhysX { @@ -44,16 +43,37 @@ namespace PhysX } } + ForceRegionComponent::ForceRegionComponent() + { + InitPhysicsTickHandler(); + } + ForceRegionComponent::ForceRegionComponent(ForceRegion&& forceRegion, bool debug) : m_forceRegion(std::move(forceRegion)) , m_debugForces(debug) { + InitPhysicsTickHandler(); } void ForceRegionComponent::Activate() { - Physics::WorldNotificationBus::Handler::BusConnect(Physics::DefaultPhysicsWorldId); - Physics::TriggerNotificationBus::Handler::BusConnect(m_entity->GetId()); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneInterface->RegisterSceneSimulationFinishHandler(sceneHandle, m_sceneFinishSimHandler); + } + + if (auto* physicsSystem = AZ::Interface::Get()) + { + AZStd::pair foundBody = physicsSystem->FindAttachedBodyHandleFromEntityId(m_entity->GetId()); + if (foundBody.first != AzPhysics::InvalidSceneHandle) + { + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerEnterHandler( + foundBody.first, foundBody.second, m_onTriggerEnterHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerExitHandler( + foundBody.first, foundBody.second, m_onTriggerExitHandler); + } + } if (m_debugForces) { AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(m_entity->GetId()); @@ -68,13 +88,38 @@ namespace PhysX { AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect(); } - Physics::TriggerNotificationBus::Handler::BusDisconnect(); - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_onTriggerEnterHandler.Disconnect(); + m_onTriggerExitHandler.Disconnect(); + m_sceneFinishSimHandler.Disconnect(); m_entities.clear(); // On re-activation, each entity in this force region triggers OnTriggerEnter again. } - void ForceRegionComponent::OnPostPhysicsSubtick(float fixedDeltaTime) + void ForceRegionComponent::InitPhysicsTickHandler() + { + m_sceneFinishSimHandler = AzPhysics::SceneEvents::OnSceneSimulationFinishHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + float fixedDeltatime) + { + this->PostPhysicsSubTick(fixedDeltatime); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Components)); + + m_onTriggerEnterHandler = AzPhysics::SimulatedBodyEvents::OnTriggerEnter::Handler([this]( + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::TriggerEvent& triggerEvent) + { + OnTriggerEnter(triggerEvent); + }); + + m_onTriggerExitHandler = AzPhysics::SimulatedBodyEvents::OnTriggerExit::Handler([this]( + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::TriggerEvent& triggerEvent) + { + OnTriggerExit(triggerEvent); + }); + } + + void ForceRegionComponent::PostPhysicsSubTick(float fixedDeltaTime) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Physics); @@ -92,12 +137,7 @@ namespace PhysX } } - int ForceRegionComponent::GetPhysicsTickOrder() - { - return WorldNotifications::Components; - } - - void ForceRegionComponent::OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) + void ForceRegionComponent::OnTriggerEnter(const AzPhysics::TriggerEvent& triggerEvent) { if (!triggerEvent.m_otherBody) { @@ -118,7 +158,7 @@ namespace PhysX } } - void ForceRegionComponent::OnTriggerExit(const Physics::TriggerEvent& triggerEvent) + void ForceRegionComponent::OnTriggerExit(const AzPhysics::TriggerEvent& triggerEvent) { if (triggerEvent.m_otherBody == nullptr) { diff --git a/Gems/PhysX/Code/Source/ForceRegionComponent.h b/Gems/PhysX/Code/Source/ForceRegionComponent.h index 3cdd21c8c2..bf23623984 100644 --- a/Gems/PhysX/Code/Source/ForceRegionComponent.h +++ b/Gems/PhysX/Code/Source/ForceRegionComponent.h @@ -18,9 +18,14 @@ #include +#include +#include #include -#include -#include + +namespace AzPhysics +{ + struct TriggerEvent; +} namespace PhysX { @@ -30,19 +35,18 @@ namespace PhysX /// A net force will be calculated per entity by summing all the attached forces on each tick. class ForceRegionComponent : public AZ::Component - , protected Physics::WorldNotificationBus::Handler - , protected Physics::TriggerNotificationBus::Handler , private AzFramework::EntityDebugDisplayEventBus::Handler { public: AZ_COMPONENT(ForceRegionComponent, ForceRegionComponentTypeId); static void Reflect(AZ::ReflectContext* context); - ForceRegionComponent() = default; - ForceRegionComponent(ForceRegion&& forceRegion, bool debug); + ForceRegionComponent(); + explicit ForceRegionComponent(ForceRegion&& forceRegion, bool debug); ~ForceRegionComponent() = default; protected: + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) { required.push_back(AZ_CRC("TransformService", 0x8ee22c50)); @@ -53,21 +57,22 @@ namespace PhysX void Activate() override; void Deactivate() override; - // Physics::WorldNotificationBus - void OnPostPhysicsSubtick(float fixedDeltaTime) override; - int GetPhysicsTickOrder() override; - - // TriggerNotifications - void OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) override; - void OnTriggerExit(const Physics::TriggerEvent& triggerEvent) override; - // EntityDebugDisplayEventBus void DisplayEntityViewport(const AzFramework::ViewportInfo& viewportInfo , AzFramework::DebugDisplayRequests& debugDisplayRequests) override; private: + void InitPhysicsTickHandler(); + void PostPhysicsSubTick(float fixedDeltaTime); + void OnTriggerEnter(const AzPhysics::TriggerEvent& triggerEvent); + void OnTriggerExit(const AzPhysics::TriggerEvent& triggerEvent); + AZStd::unordered_set m_entities; ///< Collection of entity IDs contained within the region. ForceRegion m_forceRegion; ///< Calculates the net force. bool m_debugForces = false; ///< Draws debug lines for entities in the region + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler; + AzPhysics::SimulatedBodyEvents::OnTriggerEnter::Handler m_onTriggerEnterHandler; + AzPhysics::SimulatedBodyEvents::OnTriggerExit::Handler m_onTriggerExitHandler; }; } diff --git a/Gems/PhysX/Code/Source/HingeJointComponent.cpp b/Gems/PhysX/Code/Source/HingeJointComponent.cpp index 365444232e..7b0702559c 100644 --- a/Gems/PhysX/Code/Source/HingeJointComponent.cpp +++ b/Gems/PhysX/Code/Source/HingeJointComponent.cpp @@ -16,8 +16,8 @@ #include #include #include -#include #include +#include #include diff --git a/Gems/PhysX/Code/Source/Joint.cpp b/Gems/PhysX/Code/Source/Joint.cpp index 2d05fd23ea..80575607c4 100644 --- a/Gems/PhysX/Code/Source/Joint.cpp +++ b/Gems/PhysX/Code/Source/Joint.cpp @@ -16,6 +16,7 @@ #include #include #include +#include namespace PhysX { @@ -26,20 +27,20 @@ namespace PhysX static const float MinSwingLimitDegrees = 1.0f; } // namespace JointConstants - Physics::WorldBody* Joint::GetParentBody() const + AzPhysics::SimulatedBody* Joint::GetParentBody() const { return m_parentBody; } - Physics::WorldBody* Joint::GetChildBody() const + AzPhysics::SimulatedBody* Joint::GetChildBody() const { return m_childBody; } - bool IsAtLeastOneDynamic(Physics::WorldBody* body0, - Physics::WorldBody* body1) + bool IsAtLeastOneDynamic(AzPhysics::SimulatedBody* body0, + AzPhysics::SimulatedBody* body1) { - for (const Physics::WorldBody* body : { body0, body1 }) + for (const AzPhysics::SimulatedBody* body : { body0, body1 }) { if (body) { @@ -53,7 +54,7 @@ namespace PhysX return false; } - physx::PxRigidActor* GetPxRigidActor(Physics::WorldBody* worldBody) + physx::PxRigidActor* GetPxRigidActor(AzPhysics::SimulatedBody* worldBody) { if (worldBody && static_cast(worldBody->GetNativePointer())->is()) { @@ -70,8 +71,8 @@ namespace PhysX joint->release(); } - Joint::Joint(physx::PxJoint* pxJoint, Physics::WorldBody* parentBody, - Physics::WorldBody* childBody) + Joint::Joint(physx::PxJoint* pxJoint, AzPhysics::SimulatedBody* parentBody, + AzPhysics::SimulatedBody* childBody) : m_parentBody(parentBody) , m_childBody(childBody) { @@ -92,7 +93,7 @@ namespace PhysX return true; } - void Joint::SetParentBody(Physics::WorldBody* parentBody) + void Joint::SetParentBody(AzPhysics::SimulatedBody* parentBody) { if (IsAtLeastOneDynamic(parentBody, m_childBody)) { @@ -106,7 +107,7 @@ namespace PhysX } } - void Joint::SetChildBody(Physics::WorldBody* childBody) + void Joint::SetChildBody(AzPhysics::SimulatedBody* childBody) { if (IsAtLeastOneDynamic(m_parentBody, childBody)) { @@ -307,7 +308,7 @@ namespace PhysX } AZStd::shared_ptr JointUtils::CreateJoint(const AZStd::shared_ptr& configuration, - Physics::WorldBody* parentBody, Physics::WorldBody* childBody) + AzPhysics::SimulatedBody* parentBody, AzPhysics::SimulatedBody* childBody) { if (!configuration) { diff --git a/Gems/PhysX/Code/Source/Joint.h b/Gems/PhysX/Code/Source/Joint.h index 5833b0e20f..01214a0fec 100644 --- a/Gems/PhysX/Code/Source/Joint.h +++ b/Gems/PhysX/Code/Source/Joint.h @@ -14,6 +14,11 @@ #include +namespace AzPhysics +{ + struct SimulatedBody; +} + namespace PhysX { class D6JointLimitConfiguration @@ -39,15 +44,15 @@ namespace PhysX AZ_CLASS_ALLOCATOR(Joint, AZ::SystemAllocator, 0); AZ_RTTI(Joint, "{3C739E22-8EF0-419F-966B-C575A1F5A08B}", Physics::Joint); - Joint(physx::PxJoint* pxJoint, Physics::WorldBody* parentBody, - Physics::WorldBody* childBody); + Joint(physx::PxJoint* pxJoint, AzPhysics::SimulatedBody* parentBody, + AzPhysics::SimulatedBody* childBody); virtual ~Joint() = default; - Physics::WorldBody* GetParentBody() const override; - Physics::WorldBody* GetChildBody() const override; - void SetParentBody(Physics::WorldBody* parentBody) override; - void SetChildBody(Physics::WorldBody* childBody) override; + AzPhysics::SimulatedBody* GetParentBody() const override; + AzPhysics::SimulatedBody* GetChildBody() const override; + void SetParentBody(AzPhysics::SimulatedBody* parentBody) override; + void SetChildBody(AzPhysics::SimulatedBody* childBody) override; const AZStd::string& GetName() const override; void SetName(const AZStd::string& name) override; void* GetNativePointer() override; @@ -57,8 +62,8 @@ namespace PhysX using PxJointUniquePtr = AZStd::unique_ptr>; PxJointUniquePtr m_pxJoint; - Physics::WorldBody* m_parentBody; - Physics::WorldBody* m_childBody; + AzPhysics::SimulatedBody* m_parentBody; + AzPhysics::SimulatedBody* m_childBody; AZStd::string m_name; }; @@ -69,8 +74,8 @@ namespace PhysX AZ_CLASS_ALLOCATOR(D6Joint, AZ::SystemAllocator, 0); AZ_RTTI(D6Joint, "{962C4044-2BD2-4E4C-913C-FB8E85A2A12A}", Joint); - D6Joint(physx::PxJoint* pxJoint, Physics::WorldBody* parentBody, - Physics::WorldBody* childBody) + D6Joint(physx::PxJoint* pxJoint, AzPhysics::SimulatedBody* parentBody, + AzPhysics::SimulatedBody* childBody) : Joint(pxJoint, parentBody, childBody) { } @@ -101,8 +106,8 @@ namespace PhysX AZ_CLASS_ALLOCATOR(FixedJoint, AZ::SystemAllocator, 0); AZ_TYPE_INFO(FixedJoint, "{203FB99C-7DC5-478A-A52C-A1F2AAF61FB8}"); - FixedJoint(physx::PxJoint* pxJoint, Physics::WorldBody* parentBody, - Physics::WorldBody* childBody) + FixedJoint(physx::PxJoint* pxJoint, AzPhysics::SimulatedBody* parentBody, + AzPhysics::SimulatedBody* childBody) : Joint(pxJoint, parentBody, childBody) { } @@ -125,8 +130,8 @@ namespace PhysX AZ_CLASS_ALLOCATOR(HingeJoint, AZ::SystemAllocator, 0); AZ_TYPE_INFO(HingeJoint, "{8EFF1002-B08C-47CE-883C-82F0CF3736E0}"); - HingeJoint(physx::PxJoint* pxJoint, Physics::WorldBody* parentBody, - Physics::WorldBody* childBody) + HingeJoint(physx::PxJoint* pxJoint, AzPhysics::SimulatedBody* parentBody, + AzPhysics::SimulatedBody* childBody) : Joint(pxJoint, parentBody, childBody) { } @@ -149,8 +154,8 @@ namespace PhysX AZ_CLASS_ALLOCATOR(BallJoint, AZ::SystemAllocator, 0); AZ_TYPE_INFO(BallJoint, "{9FADA1C2-0E2F-4E1B-9E83-6292A1606372}"); - BallJoint(physx::PxJoint* pxJoint, Physics::WorldBody* parentBody, - Physics::WorldBody* childBody) + BallJoint(physx::PxJoint* pxJoint, AzPhysics::SimulatedBody* parentBody, + AzPhysics::SimulatedBody* childBody) : Joint(pxJoint, parentBody, childBody) { } @@ -238,7 +243,7 @@ namespace PhysX static AZStd::shared_ptr CreateJointLimitConfiguration(AZ::TypeId jointType); static AZStd::shared_ptr CreateJoint(const AZStd::shared_ptr& configuration, - Physics::WorldBody* parentBody, Physics::WorldBody* childBody); + AzPhysics::SimulatedBody* parentBody, AzPhysics::SimulatedBody* childBody); static D6JointState CalculateD6JointState( const AZ::Quaternion& parentWorldRotation, diff --git a/Gems/PhysX/Code/Source/JointComponent.cpp b/Gems/PhysX/Code/Source/JointComponent.cpp index 400753b52e..39fbe4a3fa 100644 --- a/Gems/PhysX/Code/Source/JointComponent.cpp +++ b/Gems/PhysX/Code/Source/JointComponent.cpp @@ -13,8 +13,9 @@ #include #include -#include #include +#include +#include #include #include #include diff --git a/Gems/PhysX/Code/Source/JointComponent.h b/Gems/PhysX/Code/Source/JointComponent.h index 6a97cf300d..468470dd37 100644 --- a/Gems/PhysX/Code/Source/JointComponent.h +++ b/Gems/PhysX/Code/Source/JointComponent.h @@ -20,6 +20,11 @@ #include +namespace AzPhysics +{ + struct SimulatedBody; +} + namespace PhysX { /// Base class for game-time generic joint components. @@ -44,8 +49,8 @@ namespace PhysX physx::PxRigidActor* m_followerActor = nullptr; physx::PxTransform m_leadLocal = physx::PxTransform(physx::PxIdentity); physx::PxTransform m_followerLocal = physx::PxTransform(physx::PxIdentity); - Physics::WorldBody* m_leadBody = nullptr; - Physics::WorldBody* m_followerBody = nullptr; + AzPhysics::SimulatedBody* m_leadBody = nullptr; + AzPhysics::SimulatedBody* m_followerBody = nullptr; }; // AZ::Component @@ -55,7 +60,7 @@ namespace PhysX // AZ::EntityBus void OnEntityActivated(const AZ::EntityId&) override; - /// Invoked in OnPostPhysicsUpdate for specific joint types to instantiate native joint pointer. + /// Invoked in JointComponent::OnEntityActivated for specific joint types to instantiate native joint pointer. virtual void InitNativeJoint() {}; physx::PxTransform GetJointLocalPose(const physx::PxRigidActor* actor, diff --git a/Gems/PhysX/Code/Source/MeshColliderComponent.cpp b/Gems/PhysX/Code/Source/MeshColliderComponent.cpp index bedcc81bbd..d383ba97de 100644 --- a/Gems/PhysX/Code/Source/MeshColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/MeshColliderComponent.cpp @@ -74,11 +74,6 @@ namespace PhysX AZ::Data::AssetLoadBehavior::Default); } - void MeshColliderComponent::GetStaticWorldSpaceMeshTriangles([[maybe_unused]] AZStd::vector& verts, [[maybe_unused]] AZStd::vector& indices) const - { - AZ_Assert(false, "Run-time support for this function is not available"); - } - Physics::MaterialId MeshColliderComponent::GetMaterialId() const { return m_colliderConfiguration->m_materialSelection.GetMaterialId(); @@ -142,6 +137,6 @@ namespace PhysX return; } - m_shapeConfigList[0].second->m_scale = Utils::GetNonUniformScale(GetEntityId()); + m_shapeConfigList[0].second->m_scale = Utils::GetOverallScale(GetEntityId()); } } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/MeshColliderComponent.h b/Gems/PhysX/Code/Source/MeshColliderComponent.h index 38fe47a482..4014f7ab5a 100644 --- a/Gems/PhysX/Code/Source/MeshColliderComponent.h +++ b/Gems/PhysX/Code/Source/MeshColliderComponent.h @@ -38,7 +38,6 @@ namespace PhysX // MeshColliderComponentRequestsBus AZ::Data::Asset GetMeshAsset() const override; - void GetStaticWorldSpaceMeshTriangles(AZStd::vector& verts, AZStd::vector& indices) const override; Physics::MaterialId GetMaterialId() const override; void SetMeshAsset(const AZ::Data::AssetId& id) override; void SetMaterialAsset(const AZ::Data::AssetId& id) override; @@ -53,4 +52,4 @@ namespace PhysX Physics::ColliderConfiguration* m_colliderConfiguration = nullptr; Physics::PhysicsAssetShapeConfiguration* m_shapeConfiguration = nullptr; }; -} // namespace PhysX \ No newline at end of file +} // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp index 32bbc2e293..dba069ac29 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp @@ -12,14 +12,16 @@ #include #include +#include +#include #include #include +#include +#include #include #include -#include -#include -#include #include +#include #include #include @@ -201,10 +203,14 @@ namespace PhysX } CharacterController::CharacterController(physx::PxController* pxController, - AZStd::unique_ptr callbackManager) + AZStd::unique_ptr callbackManager, + AzPhysics::SceneHandle sceneHandle) : m_pxController(pxController) , m_callbackManager(AZStd::move(callbackManager)) { + m_sceneOwner = sceneHandle; + m_simulating = false; //character controller starts disabled, so set m_simulating to false + AZ_Assert(m_pxController, "pxController should not be null."); m_pxControllerFilters.mFilterCallback = m_callbackManager.get(); m_pxControllerFilters.mCCTFilterCallback = m_callbackManager.get(); @@ -270,14 +276,82 @@ namespace PhysX m_minimumMovementDistance = distance; } - void CharacterController::CreateShadowBody(const Physics::CharacterConfiguration& configuration, Physics::World& world) + void CharacterController::CreateShadowBody(const Physics::CharacterConfiguration& configuration) { - Physics::RigidBodyConfiguration rigidBodyConfig; + DestroyShadowBody(); + + AzPhysics::RigidBodyConfiguration rigidBodyConfig; rigidBodyConfig.m_kinematic = true; rigidBodyConfig.m_debugName = configuration.m_debugName + " (Shadow)"; rigidBodyConfig.m_entityId = configuration.m_entityId; - m_shadowBody = AZ::Interface::Get()->CreateRigidBody(rigidBodyConfig); - world.AddBody(*m_shadowBody); + if (auto* sceneInterface = AZ::Interface::Get()) + { + m_shadowBodyHandle = sceneInterface->AddSimulatedBody(m_sceneOwner, &rigidBodyConfig); + if (m_shadowBodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + AZ_Error("PhysXCharacter", false, "Failed to create the CharacterController rigid body."); + return; + } + m_shadowBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_sceneOwner, m_shadowBodyHandle)); + } + } + + void CharacterController::EnablePhysics(const Physics::CharacterConfiguration& configuration) + { + if (m_simulating) + { + return; + } + + SetFilterDataAndShape(configuration); + SetUserData(configuration); + SetActorName(configuration.m_debugName); + SetMinimumMovementDistance(configuration.m_minimumMovementDistance); + SetMaximumSpeed(configuration.m_maximumSpeed); + CreateShadowBody(configuration); + SetTag(configuration.m_colliderTag); + + m_simulating = true; + } + + void CharacterController::DisablePhysics() + { + if (!m_simulating) + { + return; + } + + DestroyShadowBody(); + RemoveControllerFromScene(); + m_simulating = false; + } + + void CharacterController::DestroyShadowBody() + { + if (m_shadowBodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + return; + } + + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_shadowBodyHandle); + m_shadowBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + m_shadowBody = nullptr; + } + } + + void CharacterController::RemoveControllerFromScene() + { + if (m_pxController) + { + if (auto* pxScene = m_pxController->getScene()) + { + PHYSX_SCENE_WRITE_LOCK(pxScene); + pxScene->removeActor(*m_pxController->getActor()); + + } + } } void CharacterController::SetTag(const AZStd::string& tag) @@ -292,12 +366,15 @@ namespace PhysX CharacterController::~CharacterController() { + DestroyShadowBody(); + m_shape = nullptr; //shape has to go before m_pxController + if (m_pxController) { - PHYSX_SCENE_WRITE_LOCK(m_pxController->getScene()); - m_shape = nullptr; //shape has to go before m_pxController - m_pxController->release(); + PHYSX_SCENE_WRITE_LOCK(m_pxController->getScene()); + m_pxController->release(); // This internally removes the controller's actor from the scene } + m_pxController = nullptr; m_material = nullptr; } @@ -559,13 +636,12 @@ namespace PhysX } } - // Physics::WorldBody AZ::EntityId CharacterController::GetEntityId() const { return m_actorUserData.GetEntityId(); } - Physics::World* CharacterController::GetWorld() const + AzPhysics::Scene* CharacterController::GetScene() { return m_pxController ? PhysX::Utils::GetUserData(m_pxController->getScene()) : nullptr; } @@ -604,17 +680,17 @@ namespace PhysX return PxMathConvert(m_pxController->getActor()->getWorldBounds(inflationFactor)); } - Physics::RayCastHit CharacterController::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit CharacterController::RayCast(const AzPhysics::RayCastRequest& request) { if (m_pxController) { if (physx::PxRigidDynamic* actor = m_pxController->getActor()) { - return PhysX::Utils::RayCast::ClosestRayHitAgainstPxRigidActor(request, actor); + return PhysX::SceneQueryHelpers::ClosestRayHitAgainstPxRigidActor(request, actor); } } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } AZ::Crc32 CharacterController::GetNativeType() const @@ -627,30 +703,6 @@ namespace PhysX return m_pxController; } - void CharacterController::AddToWorld(Physics::World& world) - { - if (m_shadowBody) - { - m_shadowBody->AddToWorld(world); - } - } - - void CharacterController::RemoveFromWorld(Physics::World& world) - { - physx::PxScene* scene = static_cast(world.GetNativePointer()); - - if (scene) - { - PHYSX_SCENE_WRITE_LOCK(scene); - scene->removeActor(*m_pxController->getActor()); - } - - if (m_shadowBody) - { - m_shadowBody->RemoveFromWorld(world); - } - } - // CharacterController specific void CharacterController::Resize(float height) { diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.h index 72f0f30d75..1ab10a9ea2 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.h @@ -17,6 +17,7 @@ #include #include +#include namespace PhysX { @@ -156,20 +157,23 @@ namespace PhysX { public: AZ_CLASS_ALLOCATOR(CharacterController, AZ::SystemAllocator, 0); - AZ_TYPE_INFO_LEGACY(CharacterController, "{A75A7D19-BC21-4F7E-A3D9-05031D2DFC94}", Physics::Character); + AZ_RTTI(PhysX::CharacterController, "{A75A7D19-BC21-4F7E-A3D9-05031D2DFC94}", Physics::Character); static void Reflect(AZ::ReflectContext* context); CharacterController() = default; CharacterController(physx::PxController* pxController, - AZStd::unique_ptr callbackManager); + AZStd::unique_ptr callbackManager, + AzPhysics::SceneHandle sceneHandle); ~CharacterController(); - void SetFilterDataAndShape(const Physics::CharacterConfiguration& characterConfig); - void SetUserData(const Physics::CharacterConfiguration& characterConfig); - void SetActorName(const AZStd::string& name = "Character Controller"); - void SetMinimumMovementDistance(float distance); - void CreateShadowBody(const Physics::CharacterConfiguration& configuration, Physics::World&); - void SetTag(const AZStd::string& tag); + //! Character Controller can be only enabled and disabled once after creation. + //! And after being disabled it cannot be enabled again, it has to be destroyed and re-created. + //! This is because the way PhysX controller works, it doesn't allow the state of having physics disabled, so being enabled/disabled is linked to be created/destroyed. + //! @{ + void EnablePhysics(const Physics::CharacterConfiguration& configuration); + void DisablePhysics(); + //! @} + CharacterControllerCallbackManager* GetCallbackManager(); void SetFilterFlags(physx::PxQueryFlags filterFlags); @@ -196,19 +200,17 @@ namespace PhysX void SetRotation(const AZ::Quaternion& rotation) override; void AttachShape(AZStd::shared_ptr shape) override; - // Physics::WorldBody + // AzPhysics::SimulatedBody AZ::EntityId GetEntityId() const override; - Physics::World* GetWorld() const override; + AzPhysics::Scene* GetScene() override; AZ::Transform GetTransform() const override; void SetTransform(const AZ::Transform& transform) override; AZ::Vector3 GetPosition() const override; AZ::Quaternion GetOrientation() const override; AZ::Aabb GetAabb() const override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; AZ::Crc32 GetNativeType() const override; void* GetNativePointer() const override; - void AddToWorld(Physics::World&) override; - void RemoveFromWorld(Physics::World&) override; // CharacterController specific void Resize(float height); @@ -222,6 +224,14 @@ namespace PhysX void SetHalfForwardExtent(float halfForwardExtent); private: + void SetFilterDataAndShape(const Physics::CharacterConfiguration& characterConfig); + void SetUserData(const Physics::CharacterConfiguration& characterConfig); + void SetActorName(const AZStd::string& name = "Character Controller"); + void SetMinimumMovementDistance(float distance); + void SetTag(const AZStd::string& tag); + void CreateShadowBody(const Physics::CharacterConfiguration& configuration); + void DestroyShadowBody(); + void RemoveControllerFromScene(); void UpdateFilterLayerAndGroup(AzPhysics::CollisionLayer collisionLayer, AzPhysics::CollisionGroup collisionGroup); physx::PxController* m_pxController = nullptr; ///< The underlying PhysX controller. @@ -233,7 +243,8 @@ namespace PhysX physx::PxControllerFilters m_pxControllerFilters; ///< Controls which objects the controller interacts with when moving. AZStd::shared_ptr m_material; ///< The generic physics API material for the controller. AZStd::shared_ptr m_shape; ///< The generic physics API shape associated with the controller. - AZStd::unique_ptr m_shadowBody; ///< A kinematic-synchronised rigid body used to store additional colliders. + AzPhysics::RigidBody* m_shadowBody = nullptr; ///< A kinematic-synchronised rigid body used to store additional colliders. + AzPhysics::SimulatedBodyHandle m_shadowBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; //!
#include #include +#include +#include #include -#include #include #include #include +#include #include #include @@ -94,15 +96,23 @@ namespace PhysX } } - AZStd::unique_ptr CreateCharacterController(const Physics::CharacterConfiguration& - characterConfig, const Physics::ShapeConfiguration& shapeConfig, Physics::World& world) + AZStd::unique_ptr CreateCharacterController(const Physics::CharacterConfiguration& characterConfig, + const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle sceneHandle) { physx::PxControllerManager* manager = nullptr; - if (auto physxWorld = azrtti_cast(&world)) + AzPhysics::Scene* scene = nullptr; + PhysX::PhysXScene* physxScene = nullptr; + if (auto* physicsSystem = AZ::Interface::Get()) { - manager = physxWorld->GetOrCreateControllerManager(); + if (scene = physicsSystem->GetScene(sceneHandle)) + { + if (physxScene = azrtti_cast(scene)) + { + manager = physxScene->GetOrCreateControllerManager(); + } + } } - if (!manager) + if (!manager || !scene) { AZ_Error("PhysX Character Controller", false, "Could not retrieve character controller manager."); return nullptr; @@ -111,6 +121,7 @@ namespace PhysX auto callbackManager = AZStd::make_unique(); physx::PxController* pxController = nullptr; + auto* pxScene = static_cast(physxScene->GetNativePointer()); if (shapeConfig.GetShapeType() == Physics::ShapeType::Capsule) { @@ -124,10 +135,9 @@ namespace PhysX AppendShapeIndependentProperties(capsuleDesc, characterConfig, callbackManager.get()); AppendPhysXSpecificProperties(capsuleDesc, characterConfig); - PHYSX_SCENE_WRITE_LOCK(static_cast(world.GetNativePointer())); - pxController = manager->createController(capsuleDesc); + PHYSX_SCENE_WRITE_LOCK(pxScene); + pxController = manager->createController(capsuleDesc); // This internally adds the controller's actor to the scene } - else if (shapeConfig.GetShapeType() == Physics::ShapeType::Box) { physx::PxBoxControllerDesc boxDesc; @@ -139,10 +149,9 @@ namespace PhysX AppendShapeIndependentProperties(boxDesc, characterConfig, callbackManager.get()); AppendPhysXSpecificProperties(boxDesc, characterConfig); - PHYSX_SCENE_WRITE_LOCK(static_cast(world.GetNativePointer())); - pxController = manager->createController(boxDesc); + PHYSX_SCENE_WRITE_LOCK(pxScene); + pxController = manager->createController(boxDesc); // This internally adds the controller's actor to the scene } - else { AZ_Error("PhysX Character Controller", false, "PhysX only supports box and capsule shapes for character controllers."); @@ -155,20 +164,12 @@ namespace PhysX return nullptr; } - auto controller = AZStd::make_unique(pxController, AZStd::move(callbackManager)); - controller->SetFilterDataAndShape(characterConfig); - controller->SetUserData(characterConfig); - controller->SetActorName(characterConfig.m_debugName); - controller->SetMinimumMovementDistance(characterConfig.m_minimumMovementDistance); - controller->SetMaximumSpeed(characterConfig.m_maximumSpeed); - controller->CreateShadowBody(characterConfig, world); - controller->SetTag(characterConfig.m_colliderTag); - + auto controller = AZStd::make_unique(pxController, AZStd::move(callbackManager), sceneHandle); return controller; } - AZStd::unique_ptr CreateRagdoll(const Physics::RagdollConfiguration& configuration, - const Physics::RagdollState& initialState, const ParentIndices& parentIndices) + AZStd::unique_ptr CreateRagdoll(Physics::RagdollConfiguration& configuration, + const Physics::RagdollState& initialState, const ParentIndices& parentIndices, AzPhysics::SceneHandle sceneHandle) { const size_t numNodes = configuration.m_nodes.size(); if (numNodes != initialState.size()) @@ -178,39 +179,55 @@ namespace PhysX return nullptr; } - AZStd::unique_ptr ragdoll = AZStd::make_unique(); + AZStd::unique_ptr ragdoll = AZStd::make_unique(sceneHandle); ragdoll->SetParentIndices(parentIndices); + auto* sceneInterface = AZ::Interface::Get(); + if (sceneInterface == nullptr) + { + AZ_Error("PhysX Ragdoll", false, "Unable to Create Ragdoll, Physics Scene Interface is missing."); + return nullptr; + } + // Set up rigid bodies for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { - const Physics::RagdollNodeConfiguration& nodeConfig = configuration.m_nodes[nodeIndex]; + Physics::RagdollNodeConfiguration& nodeConfig = configuration.m_nodes[nodeIndex]; const Physics::RagdollNodeState& nodeState = initialState[nodeIndex]; - physx::PxTransform transform(PxMathConvert(nodeState.m_position), PxMathConvert(nodeState.m_orientation)); - - AZStd::unique_ptr rigidBody = AZStd::make_unique(nodeConfig); - - physx::PxRigidDynamic* pxRigidDynamic = static_cast(rigidBody->GetNativePointer()); - pxRigidDynamic->setGlobalPose(transform); Physics::CharacterColliderNodeConfiguration* colliderNodeConfig = configuration.m_colliders.FindNodeConfigByName(nodeConfig.m_debugName); if (colliderNodeConfig) { + AZStd::vector> shapes; for (const auto& shapeConfig : colliderNodeConfig->m_shapes) { - AZStd::shared_ptr shape = AZStd::make_shared(*shapeConfig.first, *shapeConfig.second); - if (shape) + if (auto shape = AZStd::make_shared(*shapeConfig.first, *shapeConfig.second)) { - rigidBody->AddShape(shape); + shapes.emplace_back(shape); } else { AZ_Error("PhysX Ragdoll", false, "Failed to create collider shape for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return nullptr; } } + nodeConfig.m_colliderAndShapeData = shapes; } - AZStd::unique_ptr node = AZStd::make_unique(AZStd::move(rigidBody)); + AzPhysics::SimulatedBodyHandle newBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &nodeConfig); + if (newBodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + AZ_Error("PhysX Ragdoll", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return nullptr; + } + sceneInterface->DisableSimulationOfBody(sceneHandle, newBodyHandle); + auto* rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, newBodyHandle)); + + physx::PxRigidDynamic* pxRigidDynamic = static_cast(rigidBody->GetNativePointer()); + physx::PxTransform transform(PxMathConvert(nodeState.m_position), PxMathConvert(nodeState.m_orientation)); + pxRigidDynamic->setGlobalPose(transform); + + AZStd::unique_ptr node = AZStd::make_unique(rigidBody, newBodyHandle); ragdoll->AddNode(AZStd::move(node)); } @@ -274,6 +291,7 @@ namespace PhysX else { AZ_Error("PhysX Ragdoll", false, "Failed to create joint for node index %i.", nodeIndex); + return nullptr; } } else diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h index 8b37ecb428..6eb10bd4eb 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h @@ -12,6 +12,7 @@ #pragma once #include +#include #include #include @@ -19,7 +20,6 @@ namespace Physics { class CharacterConfiguration; class ShapeConfiguration; - class World; } // namespace Physics namespace PhysX @@ -32,26 +32,27 @@ namespace PhysX { AZ::Outcome GetNodeIndex(const Physics::RagdollConfiguration& configuration, const AZStd::string& nodeName); - /// Creates a character controller based on the supplied configuration in the specified world. - /// @param configuration Information required to create the controller such as shape, slope behavior etc. - /// @param world The physics world in which the character controller should be created. + //! Creates a character controller based on the supplied configuration in the specified world. + //! @param configuration Information required to create the controller such as shape, slope behavior etc. + //! @param sceneHandle A handle to the physics scene in which the character controller should be created. AZStd::unique_ptr CreateCharacterController(const Physics::CharacterConfiguration& - characterConfig, const Physics::ShapeConfiguration& shapeConfig, Physics::World& world); + characterConfig, const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle sceneHandle); - /// Creates a ragdoll based on the specified setup and initial pose. - /// @param configuration Information about collider geometry and joint setup required to initialize the ragdoll. - /// @param initialState Initial settings for the positions, orientations and velocities of the ragdoll nodes. - /// @param parentIndices Identifies the parent ragdoll node for each node in the ragdoll. - AZStd::unique_ptr CreateRagdoll(const Physics::RagdollConfiguration& configuration, - const Physics::RagdollState& initialState, const ParentIndices& parentIndices); + //! Creates a ragdoll based on the specified setup and initial pose. + //! @param configuration Information about collider geometry and joint setup required to initialize the ragdoll. + //! @param initialState Initial settings for the positions, orientations and velocities of the ragdoll nodes. + //! @param parentIndices Identifies the parent ragdoll node for each node in the ragdoll. + //! @param sceneHandle A handle to the physics scene in which the ragdoll should be created. + AZStd::unique_ptr CreateRagdoll(Physics::RagdollConfiguration& configuration, + const Physics::RagdollState& initialState, const ParentIndices& parentIndices, AzPhysics::SceneHandle sceneHandle); - /// Creates a joint drive with properties based on the input values. - /// The input values are validated and the damping ratio is used to calculate the damping value used internally. - /// @param strength The joint strength (also referred to as stiffness). - /// @param dampingRatio The ratio of the damping value to the critical damping value, indicating whether the - /// joint drive is under-damped, critically damped or over-damped. - /// @param forceLimit The upper limit on the force the joint can apply to reach its target. - /// @return The created joint drive. + //! Creates a joint drive with properties based on the input values. + //! The input values are validated and the damping ratio is used to calculate the damping value used internally. + //! @param strength The joint strength (also referred to as stiffness). + //! @param dampingRatio The ratio of the damping value to the critical damping value, indicating whether the + //! joint drive is under-damped, critically damped or over-damped. + //! @param forceLimit The upper limit on the force the joint can apply to reach its target. + //! @return The created joint drive. physx::PxD6JointDrive CreateD6JointDrive(float strength, float dampingRatio, float forceLimit); } // namespace Characters } // namespace Utils diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp index 64fe731a10..72cb511e21 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp @@ -13,14 +13,32 @@ #include #include #include +#include +#include #include #include #include #include #include +#include namespace PhysX { + namespace Internal + { + physx::PxScene* GetPxScene(AzPhysics::SceneHandle sceneHandle) + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + if (AzPhysics::Scene* scene = physicsSystem->GetScene(sceneHandle)) + { + return static_cast(scene->GetNativePointer()); + } + } + return nullptr; + } + } // namespace Internal + // PhysX::Ragdoll void Ragdoll::Reflect(AZ::ReflectContext* context) { @@ -52,7 +70,7 @@ namespace PhysX { if (nodeIndex < m_nodes.size()) { - Physics::RigidBody& rigidBody = m_nodes[nodeIndex]->GetRigidBody(); + AzPhysics::RigidBody& rigidBody = m_nodes[nodeIndex]->GetRigidBody(); return static_cast(rigidBody.GetNativePointer()); } @@ -81,14 +99,32 @@ namespace PhysX return physx::PxTransform(physx::PxIdentity); } - Ragdoll::Ragdoll() - : m_isSimulated(false) + Ragdoll::Ragdoll(AzPhysics::SceneHandle sceneHandle) + : m_sceneStartSimHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime) + { + this->ApplyQueuedEnableSimulation(); + this->ApplyQueuedSetState(); + this->ApplyQueuedDisableSimulation(); + }) { + m_simulating = false; + m_sceneOwner = sceneHandle; } Ragdoll::~Ragdoll() { - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneStartSimHandler.Disconnect(); + + if (auto* sceneInterface = AZ::Interface::Get()) + { + const size_t numNodes = m_nodes.size(); + for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) + { + sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_nodes[nodeIndex]->GetRigidBodyHandle()); + } + } } void Ragdoll::ApplyQueuedEnableSimulation() @@ -125,14 +161,25 @@ namespace PhysX // Physics::Ragdoll void Ragdoll::EnableSimulation(const Physics::RagdollState& initialState) { - if (m_isSimulated) + if (m_simulating) { return; } - AZStd::shared_ptr world; - Physics::DefaultWorldBus::BroadcastResult(world, &Physics::DefaultWorldRequests::GetDefaultWorld); - physx::PxScene* pxScene = static_cast(world->GetNativePointer()); + auto* sceneInterface = AZ::Interface::Get(); + if (sceneInterface == nullptr) + { + AZ_Error("PhysX Ragdoll", false, "Unable to Enable Ragdoll, Physics Scene Interface is missing."); + return; + } + + physx::PxScene* pxScene = Internal::GetPxScene(m_sceneOwner); + + if (pxScene == nullptr) + { + AZ_Error("PhysX Ragdoll", false, "Unable to Enable Ragdoll, Unable to retrieve Physics Scene Interface is missing."); + return; + } const size_t numNodes = m_nodes.size(); if (initialState.size() != numNodes) @@ -154,7 +201,8 @@ namespace PhysX pxActor->setGlobalPose(pxTm); pxActor->setLinearVelocity(PxMathConvert(nodeState.m_linearVelocity)); pxActor->setAngularVelocity(PxMathConvert(nodeState.m_angularVelocity)); - pxScene->addActor(*pxActor); + + sceneInterface->EnableSimulationOfBody(m_sceneOwner, m_nodes[nodeIndex]->GetRigidBodyHandle()); } else @@ -167,62 +215,68 @@ namespace PhysX size_t parentIndex = m_parentIndices[nodeIndex]; if (parentIndex < numNodes) { - world->RegisterSuppressedCollision(m_nodes[nodeIndex]->GetRigidBody(), m_nodes[parentIndex]->GetRigidBody()); + sceneInterface->SuppressCollisionEvents(m_sceneOwner, + m_nodes[nodeIndex]->GetRigidBodyHandle(), m_nodes[parentIndex]->GetRigidBodyHandle()); } } } - Physics::WorldNotificationBus::Handler::BusConnect(world->GetWorldId()); + sceneInterface->RegisterSceneSimulationStartHandler(m_sceneOwner, m_sceneStartSimHandler); - m_isSimulated = true; + m_simulating = true; } void Ragdoll::EnableSimulationQueued(const Physics::RagdollState& initialState) { - if (m_isSimulated) + if (m_simulating) { return; } - AZStd::shared_ptr world; - Physics::DefaultWorldBus::BroadcastResult(world, &Physics::DefaultWorldRequests::GetDefaultWorld); - - Physics::WorldNotificationBus::Handler::BusConnect(world->GetWorldId()); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RegisterSceneSimulationStartHandler(m_sceneOwner, m_sceneStartSimHandler); + } m_queuedInitialState = initialState; } void Ragdoll::DisableSimulation() { - if (!m_isSimulated) + if (!m_simulating) + { + return; + } + auto* sceneInterface = AZ::Interface::Get(); + if (sceneInterface == nullptr) { + AZ_Error("PhysX Ragdoll", false, "Unable to Disable Ragdoll, Physics Scene Interface is missing."); return; } - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneStartSimHandler.Disconnect(); - AZStd::shared_ptr world; - Physics::DefaultWorldBus::BroadcastResult(world, &Physics::DefaultWorldRequests::GetDefaultWorld); - physx::PxScene* pxScene = static_cast(world->GetNativePointer()); + physx::PxScene* pxScene = Internal::GetPxScene(m_sceneOwner); const size_t numNodes = m_nodes.size(); PHYSX_SCENE_WRITE_LOCK(pxScene); for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { - pxScene->removeActor(*GetPxRigidDynamic(nodeIndex)); + sceneInterface->DisableSimulationOfBody(m_sceneOwner, m_nodes[nodeIndex]->GetRigidBodyHandle()); if (nodeIndex < m_parentIndices.size()) { size_t parentIndex = m_parentIndices[nodeIndex]; if (parentIndex < numNodes) { - world->UnregisterSuppressedCollision(m_nodes[nodeIndex]->GetRigidBody(), m_nodes[parentIndex]->GetRigidBody()); + sceneInterface->UnsuppressCollisionEvents(m_sceneOwner, + m_nodes[nodeIndex]->GetRigidBodyHandle(), m_nodes[parentIndex]->GetRigidBodyHandle()); } } } - m_isSimulated = false; + m_simulating = false; } void Ragdoll::DisableSimulationQueued() @@ -232,7 +286,7 @@ namespace PhysX bool Ragdoll::IsSimulated() { - return m_isSimulated; + return m_simulating; } void Ragdoll::GetState(Physics::RagdollState& ragdollState) const @@ -352,21 +406,15 @@ namespace PhysX return m_nodes.size(); } - AZ::Crc32 Ragdoll::GetWorldId() const - { - return Physics::DefaultPhysicsWorldId; - } - - // Physics::WorldBody AZ::EntityId Ragdoll::GetEntityId() const { AZ_Warning("PhysX Ragdoll", false, "Not yet supported."); return AZ::EntityId(AZ::EntityId::InvalidEntityId); } - Physics::World* Ragdoll::GetWorld() const + AzPhysics::Scene* Ragdoll::GetScene() { - return m_nodes.empty() ? nullptr : m_nodes[0]->GetWorld(); + return m_nodes.empty() ? nullptr : m_nodes[0]->GetScene(); } AZ::Transform Ragdoll::GetTransform() const @@ -403,13 +451,13 @@ namespace PhysX return aabb; } - Physics::RayCastHit Ragdoll::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit Ragdoll::RayCast(const AzPhysics::RayCastRequest& request) { - Physics::RayCastHit closestHit; + AzPhysics::SceneQueryHit closestHit; float closestHitDist = FLT_MAX; for (int i = 0; i < m_nodes.size(); ++i) { - Physics::RayCastHit hit = m_nodes[i]->RayCast(request); + AzPhysics::SceneQueryHit hit = m_nodes[i]->RayCast(request); if (hit && hit.m_distance < closestHitDist) { closestHit = hit; @@ -429,28 +477,4 @@ namespace PhysX AZ_WarningOnce("PhysX Ragdoll", false, "Not yet supported."); return nullptr; } - - void Ragdoll::AddToWorld(Physics::World& world) - { - for (auto& node : m_nodes) - { - node->GetRigidBody().AddToWorld(world); - } - } - - void Ragdoll::RemoveFromWorld(Physics::World& world) - { - for (auto& node : m_nodes) - { - node->GetRigidBody().RemoveFromWorld(world); - } - } - - // Physics::WorldNotificationBus - void Ragdoll::OnPrePhysicsSubtick([[maybe_unused]] float fixedDeltaTime) - { - ApplyQueuedEnableSimulation(); - ApplyQueuedSetState(); - ApplyQueuedDisableSimulation(); - } } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h index 2e11da3ceb..46bae6648b 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h @@ -14,7 +14,7 @@ #include #include -#include +#include #include namespace PhysX @@ -24,16 +24,16 @@ namespace PhysX /// PhysX specific implementation of generic physics API Ragdoll class. class Ragdoll : public Physics::Ragdoll - , private Physics::WorldNotificationBus::Handler { public: friend class RagdollComponent; AZ_CLASS_ALLOCATOR(Ragdoll, AZ::SystemAllocator, 0); - AZ_TYPE_INFO_LEGACY(Ragdoll, "{55D477B5-B922-4D3E-89FE-7FB7B9FDD635}", Physics::Ragdoll); + AZ_TYPE_INFO_LEGACY(PhysX::Ragdoll, "{55D477B5-B922-4D3E-89FE-7FB7B9FDD635}", Physics::Ragdoll); static void Reflect(AZ::ReflectContext* context); - Ragdoll(); + Ragdoll() = default; + explicit Ragdoll(AzPhysics::SceneHandle sceneHandle); Ragdoll(const Ragdoll&) = delete; ~Ragdoll(); @@ -56,39 +56,35 @@ namespace PhysX void SetNodeState(size_t nodeIndex, const Physics::RagdollNodeState& nodeState) override; Physics::RagdollNode* GetNode(size_t nodeIndex) const override; size_t GetNumNodes() const override; - AZ::Crc32 GetWorldId() const override; - // Physics::WorldBody + // AzPhysics::SimulatedBody AZ::EntityId GetEntityId() const override; - Physics::World* GetWorld() const override; + AzPhysics::Scene* GetScene() override; AZ::Transform GetTransform() const override; void SetTransform(const AZ::Transform& transform) override; AZ::Vector3 GetPosition() const override; AZ::Quaternion GetOrientation() const override; AZ::Aabb GetAabb() const override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; AZ::Crc32 GetNativeType() const override; void* GetNativePointer() const override; - void AddToWorld(Physics::World&) override; - void RemoveFromWorld(Physics::World&) override; private: void ApplyQueuedEnableSimulation(); void ApplyQueuedSetState(); void ApplyQueuedDisableSimulation(); - // Physics::WorldNotificationBus - void OnPrePhysicsSubtick(float fixedDeltaTime) override; - AZStd::vector> m_nodes; ParentIndices m_parentIndices; AZ::Outcome m_rootIndex = AZ::Failure(); - bool m_isSimulated; + /// Queued initial state for the ragdoll, for EnableSimulationQueued, to be applied prior to the world update. Physics::RagdollState m_queuedInitialState; /// Holds a queued state for SetState, to be applied prior to the physics world update. Physics::RagdollState m_queuedState; /// Used to track whether a call to DisableSimulation has been queued. bool m_queuedDisableSimulation = false; + + AzPhysics::SceneEvents::OnSceneSimulationStartHandler m_sceneStartSimHandler; }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp index 36f61bd1bf..63d62144f8 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include @@ -30,8 +30,9 @@ namespace PhysX } } - RagdollNode::RagdollNode(AZStd::unique_ptr rigidBody) - : m_rigidBody(AZStd::move(rigidBody)) + RagdollNode::RagdollNode(AzPhysics::RigidBody* rigidBody, AzPhysics::SimulatedBodyHandle rigidBodyHandle) + : m_rigidBody(rigidBody) + , m_rigidBodyHandle(rigidBodyHandle) { physx::PxRigidDynamic* pxRigidDynamic = static_cast(m_rigidBody->GetNativePointer()); m_actorUserData = PhysX::ActorData(pxRigidDynamic); @@ -45,7 +46,7 @@ namespace PhysX } // Physics::RagdollNode - Physics::RigidBody& RagdollNode::GetRigidBody() + AzPhysics::RigidBody& RagdollNode::GetRigidBody() { return *m_rigidBody; } @@ -55,10 +56,18 @@ namespace PhysX return m_joint; } - // Physics::WorldBody - Physics::World* RagdollNode::GetWorld() const + bool RagdollNode::IsSimulating() const { - return m_rigidBody ? m_rigidBody->GetWorld() : nullptr; + if (m_rigidBody) + { + return m_rigidBody->m_simulating; + } + return false; + } + + AzPhysics::Scene* RagdollNode::GetScene() + { + return m_rigidBody ? m_rigidBody->GetScene() : nullptr; } AZ::EntityId RagdollNode::GetEntityId() const @@ -92,13 +101,13 @@ namespace PhysX return m_rigidBody ? m_rigidBody->GetAabb() : AZ::Aabb::CreateNull(); } - Physics::RayCastHit RagdollNode::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit RagdollNode::RayCast(const AzPhysics::RayCastRequest& request) { if (m_rigidBody) { return m_rigidBody->RayCast(request); } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } AZ::Crc32 RagdollNode::GetNativeType() const @@ -111,13 +120,8 @@ namespace PhysX return m_rigidBody ? m_rigidBody->GetNativePointer() : nullptr; } - void RagdollNode::AddToWorld(Physics::World&) - { - AZ_WarningOnce("RagdollNode", false, "Not allowed to add individual ragdoll nodes to a world"); - } - - void RagdollNode::RemoveFromWorld(Physics::World&) + AzPhysics::SimulatedBodyHandle RagdollNode::GetRigidBodyHandle() const { - AZ_WarningOnce("RagdollNode", false, "Not allowed to remove individual ragdoll nodes to a world"); + return m_rigidBodyHandle; } } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h index 2decbf39ab..c23930e25e 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h @@ -14,6 +14,7 @@ #include #include +#include #include namespace PhysX @@ -28,17 +29,18 @@ namespace PhysX static void Reflect(AZ::ReflectContext* context); RagdollNode() = default; - RagdollNode(AZStd::unique_ptr rigidBody); + explicit RagdollNode(AzPhysics::RigidBody* rigidBody, AzPhysics::SimulatedBodyHandle rigidBodyHandle); ~RagdollNode() = default; void SetJoint(const AZStd::shared_ptr& joint); // Physics::RagdollNode - Physics::RigidBody& GetRigidBody() override; + AzPhysics::RigidBody& GetRigidBody() override; const AZStd::shared_ptr& GetJoint() const override; + bool IsSimulating() const override; - // Physics::WorldBody - Physics::World* GetWorld() const override; + // AzPhysics::SimulatedBody + AzPhysics::Scene* GetScene() override; AZ::EntityId GetEntityId() const override; AZ::Transform GetTransform() const override; @@ -48,16 +50,17 @@ namespace PhysX AZ::Quaternion GetOrientation() const override; AZ::Aabb GetAabb() const override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; AZ::Crc32 GetNativeType() const override; void* GetNativePointer() const override; - void AddToWorld(Physics::World&) override; - void RemoveFromWorld(Physics::World&) override; + AzPhysics::SimulatedBodyHandle GetRigidBodyHandle() const; + private: AZStd::shared_ptr m_joint; - AZStd::unique_ptr m_rigidBody; + AzPhysics::RigidBody* m_rigidBody; + AzPhysics::SimulatedBodyHandle m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; PhysX::ActorData m_actorUserData; }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp index 89c5ed4005..e5d8064e13 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp @@ -11,6 +11,8 @@ */ #include + +#include #include #include #include @@ -18,10 +20,12 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -43,23 +47,6 @@ namespace PhysX if (auto behaviorContext = azrtti_cast(context)) { - behaviorContext->EBus("CharacterControllerRequestBus", "Character Controller") - ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::RuntimeOwn) - ->Attribute(AZ::Edit::Attributes::Category, "PhysX") - ->Event("GetBasePosition", &Physics::CharacterRequests::GetBasePosition, "Get Base Position") - ->Event("SetBasePosition", &Physics::CharacterRequests::SetBasePosition, "Set Base Position") - ->Event("GetCenterPosition", &Physics::CharacterRequests::GetCenterPosition, "Get Center Position") - ->Event("GetStepHeight", &Physics::CharacterRequests::GetStepHeight, "Get Step Height") - ->Event("SetStepHeight", &Physics::CharacterRequests::SetStepHeight, "Set Step Height") - ->Event("GetUpDirection", &Physics::CharacterRequests::GetUpDirection, "Get Up Direction") - ->Event("GetSlopeLimitDegrees", &Physics::CharacterRequests::GetSlopeLimitDegrees, "Get Slope Limit (Degrees)") - ->Event("SetSlopeLimitDegrees", &Physics::CharacterRequests::SetSlopeLimitDegrees, "Set Slope Limit (Degrees)") - ->Event("GetMaximumSpeed", &Physics::CharacterRequests::GetMaximumSpeed, "Get Maximum Speed") - ->Event("SetMaximumSpeed", &Physics::CharacterRequests::SetMaximumSpeed, "Set Maximum Speed") - ->Event("GetVelocity", &Physics::CharacterRequests::GetVelocity, "Get Velocity") - ->Event("AddVelocity", &Physics::CharacterRequests::AddVelocity, "Add Velocity") - ; - behaviorContext->EBus("PhysXCharacterControllerRequestBus", "Character Controller (PhysX specific)") ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::RuntimeOwn) @@ -105,13 +92,12 @@ namespace PhysX void CharacterControllerComponent::Deactivate() { + DisablePhysics(); + Physics::CollisionFilteringRequestBus::Handler::BusDisconnect(); Physics::WorldBodyRequestBus::Handler::BusDisconnect(); - m_preSimulateHandler.Disconnect(); - CharacterControllerRequestBus::Handler::BusDisconnect(); AZ::TransformNotificationBus::Handler::BusDisconnect(); Physics::CharacterRequestBus::Handler::BusDisconnect(); - Physics::Utils::DeferDelete(AZStd::move(m_controller)); } AZ::Vector3 CharacterControllerComponent::GetBasePosition() const @@ -223,10 +209,18 @@ namespace PhysX { if(IsPhysicsEnabled()) { - m_controller.reset(); + m_controller->DisablePhysics(); + + // The character is first removed from the scene, and then its deletion is deferred. + // This ensures trigger exit events are raised correctly on deleted objects. + { + auto* scene = azdynamic_cast(m_controller->GetScene()); + AZ_Assert(scene, "Invalid PhysX scene"); + scene->DeferDelete(AZStd::move(m_controller)); + m_controller.reset(); + } - // do not disconnect from the CharacterRequestBus or the IsPresent function used to determine - // if the CharacterControllerComponent is on this entity will not work + m_preSimulateHandler.Disconnect(); if (CharacterControllerRequestBus::Handler::BusIsConnected()) { @@ -239,7 +233,7 @@ namespace PhysX bool CharacterControllerComponent::IsPhysicsEnabled() const { - return m_controller && m_controller->GetWorld(); + return m_controller && m_controller->m_simulating; } AZ::Aabb CharacterControllerComponent::GetAabb() const @@ -251,96 +245,64 @@ namespace PhysX return AZ::Aabb::CreateNull(); } - Physics::WorldBody* CharacterControllerComponent::GetWorldBody() + AzPhysics::SimulatedBody* CharacterControllerComponent::GetWorldBody() { return m_controller.get(); } - Physics::RayCastHit CharacterControllerComponent::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit CharacterControllerComponent::RayCast(const AzPhysics::RayCastRequest& request) { if (m_controller) { return m_controller->RayCast(request); } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } // CharacterControllerRequestBus void CharacterControllerComponent::Resize(float height) { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->Resize(height); - } + return m_controller->Resize(height); } float CharacterControllerComponent::GetHeight() { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->GetHeight(); - } - return 0.0f; + return m_controller->GetHeight(); } void CharacterControllerComponent::SetHeight(float height) { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->SetHeight(height); - } + return m_controller->SetHeight(height); } float CharacterControllerComponent::GetRadius() { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->GetRadius(); - } - return 0.0f; + return m_controller->GetRadius(); } void CharacterControllerComponent::SetRadius(float radius) { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->SetRadius(radius); - } + return m_controller->SetRadius(radius); } float CharacterControllerComponent::GetHalfSideExtent() { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->GetHalfSideExtent(); - } - return 0.0f; + return m_controller->GetHalfSideExtent(); } void CharacterControllerComponent::SetHalfSideExtent(float halfSideExtent) { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->SetHalfSideExtent(halfSideExtent); - } + return m_controller->SetHalfSideExtent(halfSideExtent); } float CharacterControllerComponent::GetHalfForwardExtent() { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->GetHalfForwardExtent(); - } - - return 0.0f; + return m_controller->GetHalfForwardExtent(); } void CharacterControllerComponent::SetHalfForwardExtent(float halfForwardExtent) { - if (auto characterController = static_cast(m_controller.get())) - { - return characterController->SetHalfForwardExtent(halfForwardExtent); - } + return m_controller->SetHalfForwardExtent(halfForwardExtent); } // TransformNotificationBus @@ -450,23 +412,24 @@ namespace PhysX bool CharacterControllerComponent::CreateController() { - AZStd::shared_ptr defaultWorld; - Physics::DefaultWorldBus::BroadcastResult(defaultWorld, &Physics::DefaultWorldRequests::GetDefaultWorld); - if (!defaultWorld) + AzPhysics::SceneHandle defaultSceneHandle = AzPhysics::InvalidSceneHandle; + Physics::DefaultWorldBus::BroadcastResult(defaultSceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); + if (defaultSceneHandle == AzPhysics::InvalidSceneHandle) { - AZ_Error("PhysX Character Controller Component", false, "Failed to retrieve default world."); + AZ_Error("PhysX Character Controller Component", false, "Failed to retrieve default scene."); return false; } m_characterConfig->m_debugName = GetEntity()->GetName(); m_characterConfig->m_entityId = GetEntityId(); - m_controller = Utils::Characters::CreateCharacterController(*m_characterConfig, *m_shapeConfig, *defaultWorld); + m_controller = Utils::Characters::CreateCharacterController(*m_characterConfig, *m_shapeConfig, defaultSceneHandle); if (!m_controller) { AZ_Error("PhysX Character Controller Component", false, "Failed to create character controller."); return false; } + m_controller->EnablePhysics(*m_characterConfig); AZ::Vector3 entityTranslation = AZ::Vector3::CreateZero(); AZ::TransformBus::EventResult(entityTranslation, GetEntityId(), &AZ::TransformBus::Events::GetWorldTranslation); diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h index c994459a6e..2ff7453568 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h @@ -16,12 +16,16 @@ #include #include #include -#include #include #include #include #include +namespace AzPhysics +{ + struct SimulatedBody; +} + namespace PhysX { class CharacterControllerConfiguration; @@ -100,8 +104,8 @@ namespace PhysX void DisablePhysics() override; bool IsPhysicsEnabled() const override; AZ::Aabb GetAabb() const override; - Physics::WorldBody* GetWorldBody() override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SimulatedBody* GetWorldBody() override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; // CharacterControllerRequestBus void Resize(float height) override; @@ -131,7 +135,7 @@ namespace PhysX AZStd::unique_ptr m_characterConfig; AZStd::unique_ptr m_shapeConfig; - AZStd::unique_ptr m_controller; + AZStd::unique_ptr m_controller; AzPhysics::SystemEvents::OnPresimulateEvent::Handler m_preSimulateHandler; }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.cpp index 946a6b7112..e0c3ba40ba 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -139,26 +140,33 @@ namespace PhysX // AZ::Component void CharacterGameplayComponent::Init() { + //setup AZ::events + m_onGravityChangedHandler = AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler( + [this]([[maybe_unused]] AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& newGravity) + { + OnGravityChanged(newGravity); + }); + m_preSimulateHandler = AzPhysics::SystemEvents::OnPresimulateEvent::Handler( + [this](float deltaTime) + { + OnPreSimulate(deltaTime); + } + ); } void CharacterGameplayComponent::Activate() { - Physics::WorldBody* worldBody = nullptr; + AzPhysics::SimulatedBody* worldBody = nullptr; Physics::WorldBodyRequestBus::EventResult(worldBody, GetEntityId(), &Physics::WorldBodyRequests::GetWorldBody); if (worldBody) { - m_gravity = worldBody->GetWorld()->GetGravity(); - AZ::Crc32 worldId = worldBody->GetWorld()->GetWorldId(); - Physics::WorldNotificationBus::Handler::BusConnect(worldId); - } - - m_preSimulateHandler = AzPhysics::SystemEvents::OnPresimulateEvent::Handler( - [this](float deltaTime) + if (auto* sceneInterface = AZ::Interface::Get()) { - OnPreSimulate(deltaTime); + m_gravity = sceneInterface->GetGravity(worldBody->m_sceneOwner); + sceneInterface->RegisterSceneGravityChangedEvent(worldBody->m_sceneOwner, m_onGravityChangedHandler); } - ); + } if (auto* physXSystem = GetPhysXSystem()) { @@ -184,7 +192,7 @@ namespace PhysX void CharacterGameplayComponent::Deactivate() { CharacterGameplayRequestBus::Handler::BusDisconnect(); - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_onGravityChangedHandler.Disconnect(); m_preSimulateHandler.Disconnect(); } @@ -194,7 +202,6 @@ namespace PhysX ApplyGravity(deltaTime); } - // Physics::WorldNotificationBus void CharacterGameplayComponent::OnGravityChanged(const AZ::Vector3& gravity) { // project the falling velocity onto the new gravity direction diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.h b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.h index 6ed0fc28a7..2f3457120e 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterGameplayComponent.h @@ -38,7 +38,6 @@ namespace PhysX //! dynamic. class CharacterGameplayComponent : public AZ::Component - , public Physics::WorldNotificationBus::Handler , public CharacterGameplayRequestBus::Handler { public: @@ -68,18 +67,17 @@ namespace PhysX void Activate() override; void Deactivate() override; - // Physics::WorldNotificationBus - void OnGravityChanged(const AZ::Vector3& gravity) override; - private: - AzPhysics::SystemEvents::OnPresimulateEvent::Handler m_preSimulateHandler; void OnPreSimulate(float deltaTime); - + void OnGravityChanged(const AZ::Vector3& gravity); void ApplyGravity(float deltaTime); float m_gravityMultiplier = 1.0f; AZ::Vector3 m_gravity = AZ::Vector3::CreateZero(); AZ::Vector3 m_fallingVelocity = AZ::Vector3::CreateZero(); + + AzPhysics::SystemEvents::OnPresimulateEvent::Handler m_preSimulateHandler; + AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler m_onGravityChangedHandler; }; //! Example implementation of controller-controller filtering callback. diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp index 257c263fa7..5f30d45639 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp @@ -11,11 +11,16 @@ */ #include + +#include #include #include #include #include #include +#include +#include +#include #include namespace PhysX @@ -145,109 +150,15 @@ namespace PhysX void RagdollComponent::Activate() { AzFramework::CharacterPhysicsDataNotificationBus::Handler::BusConnect(GetEntityId()); - - Reinit(); - } - - void RagdollComponent::Reinit() - { - bool ragdollConfigValid = false; - Physics::RagdollConfiguration ragdollConfiguration; - AzFramework::CharacterPhysicsDataRequestBus::EventResult(ragdollConfigValid, GetEntityId(), - &AzFramework::CharacterPhysicsDataRequests::GetRagdollConfiguration, ragdollConfiguration); - - // Reinit is called in two cases: - // 1. When activating the ragdoll component - // In this case the ragdoll configuration might not be available yet as the actor asset hasn't finished loading. - // Early out in this case and wait for the OnRagdollConfigurationReady() callback. - // 2. OnRagdollConfigurationReady() callback - if (!ragdollConfigValid) - { - m_ragdoll.reset(); - return; - } - - const size_t numNodes = ragdollConfiguration.m_nodes.size(); - - if (numNodes == 0) - { - AZ_Error("PhysX Ragdoll Component", false, - "Ragdoll configuration has 0 nodes, ragdoll will not be created for entity \"%s\".", - GetEntity()->GetName().c_str()); - return; - } - - ParentIndices parentIndices; - parentIndices.resize(numNodes); - for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) - { - AZStd::string parentName; - AZStd::string nodeName = ragdollConfiguration.m_nodes[nodeIndex].m_debugName; - AzFramework::CharacterPhysicsDataRequestBus::EventResult(parentName, GetEntityId(), - &AzFramework::CharacterPhysicsDataRequests::GetParentNodeName, nodeName); - AZ::Outcome parentIndex = Utils::Characters::GetNodeIndex(ragdollConfiguration, parentName); - parentIndices[nodeIndex] = parentIndex ? parentIndex.GetValue() : SIZE_MAX; - - ragdollConfiguration.m_nodes[nodeIndex].m_entityId = GetEntityId(); - } - - Physics::RagdollState bindPose; - AzFramework::CharacterPhysicsDataRequestBus::EventResult(bindPose, GetEntityId(), - &AzFramework::CharacterPhysicsDataRequests::GetBindPose, ragdollConfiguration); - - AZ::Transform entityTransform = AZ::Transform::CreateIdentity(); - AZ::TransformBus::EventResult(entityTransform, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); - Physics::RagdollState bindPoseWorld = GetBindPoseWorld(bindPose, entityTransform); - - m_ragdoll = Utils::Characters::CreateRagdoll(ragdollConfiguration, bindPoseWorld, parentIndices); - if (!m_ragdoll) - { - AZ_Error("PhysX Ragdoll Component", false, "Failed to create ragdoll."); - return; - } - - for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) - { - if (auto pxRigidBody = m_ragdoll->GetPxRigidDynamic(nodeIndex)) - { - pxRigidBody->setSolverIterationCounts(m_positionIterations, m_velocityIterations); - } - } - - if (m_enableJointProjection) - { - const float linearTolerance = AZ::GetMax(0.0f, m_jointProjectionLinearTolerance); - const float angularTolerance = AZ::DegToRad(AZ::GetMax(0.0f, m_jointProjectionAngularToleranceDegrees)); - - for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) - { - if (auto joint = m_ragdoll->GetNode(nodeIndex)->GetJoint()) - { - if (auto pxJoint = static_cast(joint->GetNativePointer())) - { - pxJoint->setConstraintFlag(physx::PxConstraintFlag::ePROJECTION, true); - pxJoint->setConstraintFlag(physx::PxConstraintFlag::ePROJECT_TO_ACTOR0, true); - pxJoint->setProjectionLinearTolerance(linearTolerance); - pxJoint->setProjectionAngularTolerance(angularTolerance); - } - } - } - } - - AzFramework::RagdollPhysicsRequestBus::Handler::BusConnect(GetEntityId()); - Physics::WorldBodyRequestBus::Handler::BusConnect(GetEntityId()); - - AzFramework::RagdollPhysicsNotificationBus::Event(GetEntityId(), - &AzFramework::RagdollPhysicsNotifications::OnRagdollActivated); } void RagdollComponent::Deactivate() { Physics::WorldBodyRequestBus::Handler::BusDisconnect(); AzFramework::RagdollPhysicsRequestBus::Handler::BusDisconnect(); - DisableSimulation(); AzFramework::RagdollPhysicsNotificationBus::Event(GetEntityId(), &AzFramework::RagdollPhysicsNotifications::OnRagdollDeactivated); + m_ragdoll.reset(); AzFramework::CharacterPhysicsDataNotificationBus::Handler::BusDisconnect(); } @@ -315,14 +226,14 @@ namespace PhysX void RagdollComponent::EnablePhysics() { - // do nothing here, ragdolls are enabled via EnableSimulation + // do nothing here, ragdolls are enabled via RagdollPhysicsBus::EnableSimulation // don't raise an error though, because the character controller component may also be handling the world body // request bus and it would be legitimate to call this function on this entity ID } void RagdollComponent::DisablePhysics() { - // do nothing here, ragdolls are disabled via DisableSimulation + // do nothing here, ragdolls are disabled via RagdollPhysicsBus::DisableSimulation // don't raise an error though, because the character controller component may also be handling the world body // request bus and it would be legitimate to call this function on this entity ID } @@ -341,25 +252,98 @@ namespace PhysX return AZ::Aabb::CreateNull(); } - Physics::WorldBody* RagdollComponent::GetWorldBody() + AzPhysics::SimulatedBody* RagdollComponent::GetWorldBody() { return m_ragdoll.get(); } - Physics::RayCastHit RagdollComponent::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit RagdollComponent::RayCast(const AzPhysics::RayCastRequest& request) { if (m_ragdoll) { return m_ragdoll->RayCast(request); } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } - void RagdollComponent::OnRagdollConfigurationReady() + void RagdollComponent::OnRagdollConfigurationReady(const Physics::RagdollConfiguration& ragdollConfigurationRef) { - // The ragdoll configuration currently is stored within the actor component and loaded along with the actor asset. - // We'll have to wait until the actor asset it loaded and then trigger a reinit. - Reinit(); + Physics::RagdollConfiguration ragdollConfiguration( ragdollConfigurationRef ); + + const size_t numNodes = ragdollConfiguration.m_nodes.size(); + + if (numNodes == 0) + { + AZ_Error("PhysX Ragdoll Component", false, + "Ragdoll configuration has 0 nodes, ragdoll will not be created for entity \"%s\".", + GetEntity()->GetName().c_str()); + return; + } + + ParentIndices parentIndices; + parentIndices.resize(numNodes); + for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) + { + AZStd::string parentName; + AZStd::string nodeName = ragdollConfiguration.m_nodes[nodeIndex].m_debugName; + AzFramework::CharacterPhysicsDataRequestBus::EventResult(parentName, GetEntityId(), + &AzFramework::CharacterPhysicsDataRequests::GetParentNodeName, nodeName); + AZ::Outcome parentIndex = Utils::Characters::GetNodeIndex(ragdollConfiguration, parentName); + parentIndices[nodeIndex] = parentIndex ? parentIndex.GetValue() : SIZE_MAX; + + ragdollConfiguration.m_nodes[nodeIndex].m_entityId = GetEntityId(); + } + + Physics::RagdollState bindPose; + AzFramework::CharacterPhysicsDataRequestBus::EventResult(bindPose, GetEntityId(), + &AzFramework::CharacterPhysicsDataRequests::GetBindPose, ragdollConfiguration); + + AZ::Transform entityTransform = AZ::Transform::CreateIdentity(); + AZ::TransformBus::EventResult(entityTransform, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); + Physics::RagdollState bindPoseWorld = GetBindPoseWorld(bindPose, entityTransform); + + AzPhysics::SceneHandle defaultSceneHandle = AzPhysics::InvalidSceneHandle; + Physics::DefaultWorldBus::BroadcastResult(defaultSceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); + m_ragdoll = Utils::Characters::CreateRagdoll(ragdollConfiguration, bindPoseWorld, parentIndices, defaultSceneHandle); + if (!m_ragdoll) + { + AZ_Error("PhysX Ragdoll Component", false, "Failed to create ragdoll."); + return; + } + + for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) + { + if (physx::PxRigidDynamic* pxRigidBody = m_ragdoll->GetPxRigidDynamic(nodeIndex)) + { + pxRigidBody->setSolverIterationCounts(m_positionIterations, m_velocityIterations); + } + } + + if (m_enableJointProjection) + { + const float linearTolerance = AZ::GetMax(0.0f, m_jointProjectionLinearTolerance); + const float angularTolerance = AZ::DegToRad(AZ::GetMax(0.0f, m_jointProjectionAngularToleranceDegrees)); + + for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) + { + if (const AZStd::shared_ptr& joint = m_ragdoll->GetNode(nodeIndex)->GetJoint()) + { + if (auto* pxJoint = static_cast(joint->GetNativePointer())) + { + pxJoint->setConstraintFlag(physx::PxConstraintFlag::ePROJECTION, true); + pxJoint->setConstraintFlag(physx::PxConstraintFlag::ePROJECT_TO_ACTOR0, true); + pxJoint->setProjectionLinearTolerance(linearTolerance); + pxJoint->setProjectionAngularTolerance(angularTolerance); + } + } + } + } + + AzFramework::RagdollPhysicsRequestBus::Handler::BusConnect(GetEntityId()); + Physics::WorldBodyRequestBus::Handler::BusConnect(GetEntityId()); + + AzFramework::RagdollPhysicsNotificationBus::Event(GetEntityId(), + &AzFramework::RagdollPhysicsNotifications::OnRagdollActivated); } // deprecated Cry functions diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h index 892f78c6f2..d6cbab5088 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h @@ -13,9 +13,14 @@ #pragma once #include +#include #include #include +namespace AzPhysics +{ + struct SimulatedBody; +} namespace PhysX { @@ -81,11 +86,11 @@ namespace PhysX void DisablePhysics() override; bool IsPhysicsEnabled() const override; AZ::Aabb GetAabb() const override; - Physics::WorldBody* GetWorldBody() override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SimulatedBody* GetWorldBody() override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; // CharacterPhysicsDataNotificationBus - void OnRagdollConfigurationReady() override; + void OnRagdollConfigurationReady(const Physics::RagdollConfiguration& ragdollConfiguration) override; // deprecated Cry functions void EnterRagdoll() override; @@ -96,7 +101,6 @@ namespace PhysX private: bool IsJointProjectionVisible(); - void Reinit(); AZStd::unique_ptr m_ragdoll; /// Minimum number of position iterations to perform in the PhysX solver. diff --git a/Gems/PhysX/Code/Source/PhysX_precompiled.h b/Gems/PhysX/Code/Source/PhysX_precompiled.h index 76e89b75bb..b9d2f18d87 100644 --- a/Gems/PhysX/Code/Source/PhysX_precompiled.h +++ b/Gems/PhysX/Code/Source/PhysX_precompiled.h @@ -19,6 +19,8 @@ #include #include +#include + #ifndef _RELEASE #define AZ_PHYSICS_DEBUG_ENABLED #endif diff --git a/Gems/PhysX/Code/Source/RigidBody.cpp b/Gems/PhysX/Code/Source/RigidBody.cpp index 68261b3964..6d1ece6a82 100644 --- a/Gems/PhysX/Code/Source/RigidBody.cpp +++ b/Gems/PhysX/Code/Source/RigidBody.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -23,8 +24,8 @@ #include #include #include -#include #include +#include namespace PhysX { @@ -39,9 +40,8 @@ namespace PhysX } } - RigidBody::RigidBody(const Physics::RigidBodyConfiguration& configuration) - : Physics::RigidBody(configuration) - , m_startAsleep(configuration.m_startAsleep) + RigidBody::RigidBody(const AzPhysics::RigidBodyConfiguration& configuration) + : m_startAsleep(configuration.m_startAsleep) { CreatePhysXActor(configuration); } @@ -59,9 +59,14 @@ namespace PhysX } } m_shapes.clear(); + + // Invalidate user data so it sets m_pxRigidActor->userData to nullptr. + // It's appropriate to do this as m_pxRigidActor is a shared pointer and + // techniqucally it could survive m_actorUserData life's spam. + m_actorUserData.Invalidate(); } - void RigidBody::CreatePhysXActor(const Physics::RigidBodyConfiguration& configuration) + void RigidBody::CreatePhysXActor(const AzPhysics::RigidBodyConfiguration& configuration) { if (m_pxRigidActor != nullptr) { @@ -69,13 +74,8 @@ namespace PhysX return; } - if (auto rigidBody = PxActorFactories::CreatePxRigidBody(configuration)) + if (m_pxRigidActor = PxActorFactories::CreatePxRigidBody(configuration)) { - m_pxRigidActor = AZStd::shared_ptr(rigidBody, [](auto& actor) - { - PxActorFactories::ReleaseActor(actor); - }); - m_actorUserData = ActorData(m_pxRigidActor.get()); m_actorUserData.SetRigidBody(this); m_actorUserData.SetEntityId(configuration.m_entityId); @@ -85,7 +85,7 @@ namespace PhysX SetSimulationEnabled(configuration.m_simulated); SetCCDEnabled(configuration.m_ccdEnabled); - Physics::MassComputeFlags flags = configuration.GetMassComputeFlags(); + AzPhysics::MassComputeFlags flags = configuration.GetMassComputeFlags(); UpdateMassProperties(flags, &configuration.m_centerOfMassOffset, &configuration.m_inertiaTensor, &configuration.m_mass); @@ -162,22 +162,20 @@ namespace PhysX m_shapes.erase(found); } - void RigidBody::UpdateMassProperties(Physics::MassComputeFlags flags, const AZ::Vector3* centerOfMassOffsetOverride, const AZ::Matrix3x3* inertiaTensorOverride, const float* massOverride) + void RigidBody::UpdateMassProperties(AzPhysics::MassComputeFlags flags, const AZ::Vector3* centerOfMassOffsetOverride, const AZ::Matrix3x3* inertiaTensorOverride, const float* massOverride) { - using Physics::MassComputeFlags; - // Input validation - bool computeCenterOfMass = MassComputeFlags::COMPUTE_COM == (flags & MassComputeFlags::COMPUTE_COM); + bool computeCenterOfMass = AzPhysics::MassComputeFlags::COMPUTE_COM == (flags & AzPhysics::MassComputeFlags::COMPUTE_COM); AZ_Assert(computeCenterOfMass || centerOfMassOffsetOverride, "UpdateMassProperties: MassComputeFlags::COMPUTE_COM is not set but COM offset is not specified"); computeCenterOfMass = computeCenterOfMass || !centerOfMassOffsetOverride; - bool computeInertiaTensor = MassComputeFlags::COMPUTE_INERTIA == (flags & MassComputeFlags::COMPUTE_INERTIA); + bool computeInertiaTensor = AzPhysics::MassComputeFlags::COMPUTE_INERTIA == (flags & AzPhysics::MassComputeFlags::COMPUTE_INERTIA); AZ_Assert(computeInertiaTensor || inertiaTensorOverride, "UpdateMassProperties: MassComputeFlags::COMPUTE_INERTIA is not set but inertia tensor is not specified"); computeInertiaTensor = computeInertiaTensor || !inertiaTensorOverride; - bool computeMass = MassComputeFlags::COMPUTE_MASS == (flags & MassComputeFlags::COMPUTE_MASS); + bool computeMass = AzPhysics::MassComputeFlags::COMPUTE_MASS == (flags & AzPhysics::MassComputeFlags::COMPUTE_MASS); AZ_Assert(computeMass || massOverride, "UpdateMassProperties: MassComputeFlags::COMPUTE_MASS is not set but mass is not specified"); computeMass = computeMass || !massOverride; @@ -185,7 +183,7 @@ namespace PhysX AZ::u32 shapesCount = GetShapeCount(); // Basic cases when we don't need to compute anything - if (shapesCount == 0 || flags == Physics::MassComputeFlags::NONE) + if (shapesCount == 0 || flags == AzPhysics::MassComputeFlags::NONE) { if (massOverride) { @@ -214,7 +212,7 @@ namespace PhysX const physx::PxVec3* massLocalPose = optionalComOverride.has_value() ? &optionalComOverride.value() : nullptr; bool includeAllShapesInMassCalculation = - MassComputeFlags::INCLUDE_ALL_SHAPES == (flags & MassComputeFlags::INCLUDE_ALL_SHAPES); + AzPhysics::MassComputeFlags::INCLUDE_ALL_SHAPES == (flags & AzPhysics::MassComputeFlags::INCLUDE_ALL_SHAPES); // Handle the case when we don't compute mass if (!computeMass) @@ -265,12 +263,6 @@ namespace PhysX } } - void RigidBody::ReleasePhysXActor() - { - m_shapes.clear(); - m_pxRigidActor = nullptr; - } - AZ::u32 RigidBody::GetShapeCount() { return static_cast(m_shapes.size()); @@ -592,8 +584,11 @@ namespace PhysX void RigidBody::SetSimulationEnabled(bool enabled) { - PHYSX_SCENE_WRITE_LOCK(m_pxRigidActor->getScene()); - m_pxRigidActor->setActorFlag(physx::PxActorFlag::eDISABLE_SIMULATION, enabled == false); + if (m_pxRigidActor) + { + PHYSX_SCENE_WRITE_LOCK(m_pxRigidActor->getScene()); + m_pxRigidActor->setActorFlag(physx::PxActorFlag::eDISABLE_SIMULATION, enabled == false); + } } void RigidBody::SetCCDEnabled(bool enabled) @@ -602,12 +597,6 @@ namespace PhysX m_pxRigidActor->setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD, enabled); } - // Physics::WorldBody - Physics::World* RigidBody::GetWorld() const - { - return m_pxRigidActor ? Utils::GetUserData(m_pxRigidActor->getScene()) : nullptr; - } - AZ::Transform RigidBody::GetTransform() const { if (m_pxRigidActor) @@ -662,9 +651,9 @@ namespace PhysX return m_actorUserData.GetEntityId(); } - Physics::RayCastHit RigidBody::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit RigidBody::RayCast(const AzPhysics::RayCastRequest& request) { - return PhysX::Utils::RayCast::ClosestRayHitAgainstShapes(request, m_shapes, GetTransform()); + return PhysX::SceneQueryHelpers::ClosestRayHitAgainstShapes(request, m_shapes, GetTransform()); } // Physics::ReferenceBase @@ -789,51 +778,6 @@ namespace PhysX } } - void RigidBody::AddToWorld(Physics::World& world) - { - physx::PxScene* scene = static_cast(world.GetNativePointer()); - - if (!scene) - { - AZ_Error("RigidBody", false, "Tried to add body to invalid world."); - return; - } - - if (!m_pxRigidActor) - { - AZ_Error("RigidBody", false, "Tried to add invalid PhysX body to world."); - return; - } - - { - PHYSX_SCENE_WRITE_LOCK(scene); - scene->addActor(*m_pxRigidActor); - if (m_startAsleep) - { - m_pxRigidActor->putToSleep(); - } - } - } - - void RigidBody::RemoveFromWorld(Physics::World& world) - { - physx::PxScene* scene = static_cast(world.GetNativePointer()); - if (!scene) - { - AZ_Error("PhysX World", false, "Tried to remove body from invalid world."); - return; - } - - if (!m_pxRigidActor) - { - AZ_Error("PhysX World", false, "Tried to remove invalid PhysX body from world."); - return; - } - - PHYSX_SCENE_WRITE_LOCK(scene); - scene->removeActor(*m_pxRigidActor); - } - void RigidBody::SetName(const AZStd::string& entityName) { m_name = entityName; diff --git a/Gems/PhysX/Code/Source/RigidBody.h b/Gems/PhysX/Code/Source/RigidBody.h index 22a412f223..c9f171b261 100644 --- a/Gems/PhysX/Code/Source/RigidBody.h +++ b/Gems/PhysX/Code/Source/RigidBody.h @@ -14,9 +14,15 @@ #include #include -#include +#include +#include #include +namespace AzPhysics +{ + struct RigidBodyConfiguration; +} + namespace PhysX { class RigidBodyComponent; @@ -26,16 +32,16 @@ namespace PhysX /// PhysX specific implementation of generic physics API RigidBody class. class RigidBody - : public Physics::RigidBody + : public AzPhysics::RigidBody { public: friend class RigidBodyComponent; AZ_CLASS_ALLOCATOR(RigidBody, AZ::SystemAllocator, 0); - AZ_RTTI(RigidBody, "{30CD41DD-9783-47A1-B935-9E5634238F45}", Physics::RigidBody); + AZ_RTTI(PhysX::RigidBody, "{30CD41DD-9783-47A1-B935-9E5634238F45}", AzPhysics::RigidBody); RigidBody() = default; - RigidBody(const Physics::RigidBodyConfiguration& configuration); + RigidBody(const AzPhysics::RigidBodyConfiguration& configuration); ~RigidBody(); static void Reflect(AZ::ReflectContext* context); @@ -71,8 +77,7 @@ namespace PhysX void SetSimulationEnabled(bool enabled) override; void SetCCDEnabled(bool enabled) override; - // Physics::WorldBody - Physics::World* GetWorld() const override; + // AzPhysics::SimulatedBody AZ::Transform GetTransform() const override; void SetTransform(const AZ::Transform& transform) override; AZ::Vector3 GetPosition() const override; @@ -80,7 +85,7 @@ namespace PhysX AZ::Aabb GetAabb() const override; AZ::EntityId GetEntityId() const override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; // Physics::ReferenceBase AZ::Crc32 GetNativeType() const override; @@ -99,8 +104,7 @@ namespace PhysX float GetSleepThreshold() const override; void SetSleepThreshold(float threshold) override; - void AddToWorld(Physics::World&) override; - void RemoveFromWorld(Physics::World&) override; + bool ShouldStartAsleep() const { return m_startAsleep; } void SetName(const AZStd::string& entityName); const AZStd::string& GetName() const; @@ -108,25 +112,24 @@ namespace PhysX void AddShape(AZStd::shared_ptr shape) override; void RemoveShape(AZStd::shared_ptr shape) override; - void UpdateMassProperties(Physics::MassComputeFlags flags = Physics::MassComputeFlags::DEFAULT, + void UpdateMassProperties(AzPhysics::MassComputeFlags flags = AzPhysics::MassComputeFlags::DEFAULT, const AZ::Vector3* centerOfMassOffsetOverride = nullptr, const AZ::Matrix3x3* inertiaTensorOverride = nullptr, const float* massOverride = nullptr) override; private: - AZStd::shared_ptr m_pxRigidActor; - AZStd::vector> m_shapes; - AZStd::string m_name; - PhysX::ActorData m_actorUserData; - bool m_startAsleep; + void CreatePhysXActor(const AzPhysics::RigidBodyConfiguration& configuration); void UpdateComputedCenterOfMass(); void ComputeInertia(); void SetInertia(const AZ::Matrix3x3& inertia); void SetZeroCenterOfMass(); - void CreatePhysXActor(const Physics::RigidBodyConfiguration& configuration); - void ReleasePhysXActor(); + AZStd::shared_ptr m_pxRigidActor; + AZStd::vector> m_shapes; + AZStd::string m_name; + PhysX::ActorData m_actorUserData; + bool m_startAsleep = false; }; AZ_POP_DISABLE_WARNING diff --git a/Gems/PhysX/Code/Source/RigidBodyComponent.cpp b/Gems/PhysX/Code/Source/RigidBodyComponent.cpp index a684e2ecc5..8984343fe5 100644 --- a/Gems/PhysX/Code/Source/RigidBodyComponent.cpp +++ b/Gems/PhysX/Code/Source/RigidBodyComponent.cpp @@ -11,12 +11,15 @@ */ #include + +#include #include #include -#include #include #include +#include #include +#include #include #include #include @@ -37,7 +40,6 @@ namespace PhysX serializeContext->Class() ->Version(1) ->Field("RigidBodyConfiguration", &RigidBodyComponent::m_configuration) - ->Field("RigidBody", &RigidBodyComponent::m_rigidBody) ; } @@ -93,9 +95,16 @@ namespace PhysX } } - RigidBodyComponent::RigidBodyComponent(const Physics::RigidBodyConfiguration& config) + RigidBodyComponent::RigidBodyComponent() + { + InitPhysicsTickHandler(); + } + + RigidBodyComponent::RigidBodyComponent(const AzPhysics::RigidBodyConfiguration& config, AzPhysics::SceneHandle sceneHandle) : m_configuration(config) + , m_attachedSceneHandle(sceneHandle) { + InitPhysicsTickHandler(); } void RigidBodyComponent::Init() @@ -117,6 +126,11 @@ namespace PhysX void RigidBodyComponent::Activate() { + if (m_attachedSceneHandle == AzPhysics::InvalidSceneHandle) + { + Physics::DefaultWorldBus::BroadcastResult(m_attachedSceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); + } + AZ::TransformBus::EventResult(m_staticTransformAtActivation, GetEntityId(), &AZ::TransformInterface::IsStaticTransform); if (m_staticTransformAtActivation) @@ -167,12 +181,17 @@ namespace PhysX return; } - Physics::Utils::DeferDelete(AZStd::move(m_rigidBody)); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_attachedSceneHandle, m_rigidBodyHandle); + m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + m_rigidBody = nullptr; + } Physics::RigidBodyRequestBus::Handler::BusDisconnect(); Physics::WorldBodyRequestBus::Handler::BusDisconnect(); AZ::TransformNotificationBus::MultiHandler::BusDisconnect(); - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneFinishSimHandler.Disconnect(); AZ::TickBus::Handler::BusDisconnect(); } @@ -195,7 +214,18 @@ namespace PhysX return AZ::ComponentTickBus::TICK_PHYSICS; } - void RigidBodyComponent::OnPostPhysicsSubtick(float fixedDeltaTime) + void RigidBodyComponent::InitPhysicsTickHandler() + { + m_sceneFinishSimHandler = AzPhysics::SceneEvents::OnSceneSimulationFinishHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + float fixedDeltatime + ) + { + this->PostPhysicsTick(fixedDeltatime); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Physics)); + } + + void RigidBodyComponent::PostPhysicsTick(float fixedDeltaTime) { // When transform changes, Kinematic Target is updated with the new transform, so don't set the transform again. // But in the case of setting the Kinematic Target directly, the transform needs to reflect the new kinematic target @@ -226,11 +256,6 @@ namespace PhysX m_isLastMovementFromKinematicSource = false; } - int RigidBodyComponent::GetPhysicsTickOrder() - { - return WorldNotifications::Physics; - } - void RigidBodyComponent::OnTransformChanged([[maybe_unused]] const AZ::Transform& local, const AZ::Transform& world) { // Note: OnTransformChanged is not safe at the moment due to TransformComponent design flaw. @@ -252,25 +277,35 @@ namespace PhysX // Create rigid body SetupConfiguration(); - m_rigidBody = AZ::Interface::Get()->CreateRigidBody(m_configuration); - m_rigidBody->SetKinematic(m_configuration.m_kinematic); - // Add shapes - ColliderComponentRequestBus::EnumerateHandlersId(GetEntityId(), [this](ColliderComponentRequests* handler) - { - for (auto& shape : handler->GetShapes()) + AZStd::vector> shapes; + ColliderComponentRequestBus::EnumerateHandlersId(GetEntityId(), [&shapes](ColliderComponentRequests* handler) { - m_rigidBody->AddShape(shape); - } - return true; - }); + AZStd::vector> newShapes = handler->GetShapes(); + shapes.insert(shapes.end(), newShapes.begin(), newShapes.end()); + return true; + }); + m_configuration.m_colliderAndShapeData = shapes; + + auto* sceneInterface = AZ::Interface::Get(); + if (sceneInterface != nullptr) + { + m_rigidBodyHandle = sceneInterface->AddSimulatedBody(m_attachedSceneHandle, &m_configuration); + m_rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_attachedSceneHandle, m_rigidBodyHandle)); + //disable simulating the body until EnablePhysics is called. + sceneInterface->DisableSimulationOfBody(m_attachedSceneHandle, m_rigidBodyHandle); + } + m_rigidBody->SetKinematic(m_configuration.m_kinematic); - Physics::MassComputeFlags flags = m_configuration.GetMassComputeFlags(); + AzPhysics::MassComputeFlags flags = m_configuration.GetMassComputeFlags(); m_rigidBody->UpdateMassProperties(flags, &m_configuration.m_centerOfMassOffset, &m_configuration.m_inertiaTensor, &m_configuration.m_mass); // Listen to the PhysX system for events concerning this entity. - Physics::WorldNotificationBus::Handler::BusConnect(Physics::DefaultPhysicsWorldId); + if (sceneInterface != nullptr) + { + sceneInterface->RegisterSceneSimulationFinishHandler(m_attachedSceneHandle, m_sceneFinishSimHandler); + } AZ::TickBus::Handler::BusConnect(); AZ::TransformNotificationBus::MultiHandler::BusConnect(GetEntityId()); Physics::RigidBodyRequestBus::Handler::BusConnect(GetEntityId()); @@ -284,11 +319,10 @@ namespace PhysX return; } - // Add actor to scene - AZStd::shared_ptr world = nullptr; - Physics::DefaultWorldBus::BroadcastResult(world, &Physics::DefaultWorldRequests::GetDefaultWorld); - m_world = world.get(); - world->AddBody(*m_rigidBody); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->EnableSimulationOfBody(m_attachedSceneHandle, m_rigidBodyHandle); + } AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, GetEntityId(), &AZ::TransformInterface::GetWorldTM); @@ -312,9 +346,9 @@ namespace PhysX void RigidBodyComponent::DisablePhysics() { - if (Physics::World* world = m_rigidBody->GetWorld()) + if (auto* sceneInterface = AZ::Interface::Get()) { - world->RemoveBody(*m_rigidBody); + sceneInterface->DisableSimulationOfBody(m_attachedSceneHandle, m_rigidBodyHandle); } Physics::RigidBodyNotificationBus::Event(GetEntityId(), &Physics::RigidBodyNotificationBus::Events::OnPhysicsDisabled); @@ -323,7 +357,7 @@ namespace PhysX bool RigidBodyComponent::IsPhysicsEnabled() const { - return m_rigidBody != nullptr && m_rigidBody->GetWorld() != nullptr; + return m_rigidBody != nullptr && m_rigidBody->m_simulating; } void RigidBodyComponent::ApplyLinearImpulse(const AZ::Vector3& impulse) @@ -487,23 +521,23 @@ namespace PhysX return m_rigidBody->GetAabb(); } - Physics::RigidBody* RigidBodyComponent::GetRigidBody() + AzPhysics::RigidBody* RigidBodyComponent::GetRigidBody() { - return m_rigidBody.get(); + return m_rigidBody; } - Physics::WorldBody* RigidBodyComponent::GetWorldBody() + AzPhysics::SimulatedBody* RigidBodyComponent::GetWorldBody() { - return m_rigidBody.get(); + return m_rigidBody; } - Physics::RayCastHit RigidBodyComponent::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit RigidBodyComponent::RayCast(const AzPhysics::RayCastRequest& request) { if (m_rigidBody) { return m_rigidBody->RayCast(request); } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } void RigidBodyComponent::OnSliceInstantiated(const AZ::Data::AssetId&, const AZ::SliceComponent::SliceInstanceAddress&, diff --git a/Gems/PhysX/Code/Source/RigidBodyComponent.h b/Gems/PhysX/Code/Source/RigidBodyComponent.h index 7fdf900bf3..c46e136669 100644 --- a/Gems/PhysX/Code/Source/RigidBodyComponent.h +++ b/Gems/PhysX/Code/Source/RigidBodyComponent.h @@ -15,12 +15,18 @@ #include #include #include -#include #include #include -#include +#include +#include +#include #include +namespace AzPhysics +{ + struct SimulatedBody; +} + namespace PhysX { class TransformForwardTimeInterpolator; @@ -33,15 +39,14 @@ namespace PhysX , public AZ::TickBus::Handler , public AzFramework::SliceGameEntityOwnershipServiceNotificationBus::Handler , protected AZ::TransformNotificationBus::MultiHandler - , protected Physics::WorldNotificationBus::Handler { public: AZ_COMPONENT(RigidBodyComponent, "{D4E52A70-BDE1-4819-BD3C-93AB3F4F3BE3}"); static void Reflect(AZ::ReflectContext* context); - RigidBodyComponent() = default; - explicit RigidBodyComponent(const Physics::RigidBodyConfiguration& config); + RigidBodyComponent(); + explicit RigidBodyComponent(const AzPhysics::RigidBodyConfiguration& config, AzPhysics::SceneHandle sceneHandle); ~RigidBodyComponent() override = default; static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) @@ -70,7 +75,7 @@ namespace PhysX void DisablePhysics() override; bool IsPhysicsEnabled() const override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; AZ::Aabb GetAabb() const override; // RigidBodyRequests @@ -113,17 +118,17 @@ namespace PhysX float GetSleepThreshold() const override; void SetSleepThreshold(float threshold) override; - Physics::RigidBody* GetRigidBody() override; + AzPhysics::RigidBody* GetRigidBody() override; // WorldBodyRequestBus - Physics::WorldBody* GetWorldBody() override; + AzPhysics::SimulatedBody* GetWorldBody() override; // SliceGameEntityOwnershipServiceNotificationBus void OnSliceInstantiated(const AZ::Data::AssetId&, const AZ::SliceComponent::SliceInstanceAddress&, const AzFramework::SliceInstantiationTicket&) override; void OnSliceInstantiationFailed(const AZ::Data::AssetId&, const AzFramework::SliceInstantiationTicket&) override; - Physics::RigidBodyConfiguration& GetConfiguration() + AzPhysics::RigidBodyConfiguration& GetConfiguration() { return m_configuration; } @@ -137,8 +142,6 @@ namespace PhysX void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; int GetTickOrder() override; - void OnPostPhysicsSubtick(float deltaTime) override; - int GetPhysicsTickOrder() override; // TransformNotificationBus void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; @@ -146,17 +149,22 @@ namespace PhysX private: void SetupConfiguration(); void CreatePhysics(); + void InitPhysicsTickHandler(); + void PostPhysicsTick(float fixedDeltaTime); std::unique_ptr m_interpolator; - Physics::RigidBodyConfiguration m_configuration; - AZStd::unique_ptr m_rigidBody; - Physics::World* m_world = nullptr; + AzPhysics::RigidBodyConfiguration m_configuration; + AzPhysics::SimulatedBodyHandle m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + AzPhysics::RigidBody* m_rigidBody = nullptr; + AzPhysics::SceneHandle m_attachedSceneHandle = AzPhysics::InvalidSceneHandle; AZ::Vector3 m_initialScale = AZ::Vector3::CreateOne(); bool m_staticTransformAtActivation = false; ///< Whether the transform was static when the component last activated. bool m_isLastMovementFromKinematicSource = false; ///< True when the source of the movement comes from SetKinematicTarget as opposed to coming from a Transform change bool m_rigidBodyTransformNeedsUpdateOnPhysReEnable = false; ///< True if rigid body transform needs to be synced to the entity's when physics is re-enabled + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler; }; class TransformForwardTimeInterpolator diff --git a/Gems/PhysX/Code/Source/RigidBodyStatic.cpp b/Gems/PhysX/Code/Source/RigidBodyStatic.cpp index 892271f283..117541034f 100644 --- a/Gems/PhysX/Code/Source/RigidBodyStatic.cpp +++ b/Gems/PhysX/Code/Source/RigidBodyStatic.cpp @@ -13,62 +13,71 @@ #include #include +#include #include #include #include #include #include #include -#include -#include +#include +#include namespace PhysX { - RigidBodyStatic::RigidBodyStatic(const Physics::WorldBodyConfiguration& configuration) + StaticRigidBody::StaticRigidBody(const AzPhysics::StaticRigidBodyConfiguration& configuration) { - CreatePxActor(configuration); + CreatePhysXActor(configuration); } - RigidBodyStatic::~RigidBodyStatic() + StaticRigidBody::~StaticRigidBody() { //clean up the attached shapes { - PHYSX_SCENE_WRITE_LOCK(m_staticRigidBody->getScene()); + PHYSX_SCENE_WRITE_LOCK(m_pxStaticRigidBody->getScene()); for (auto shape : m_shapes) { - m_staticRigidBody->detachShape(*shape->GetPxShape()); + m_pxStaticRigidBody->detachShape(*shape->GetPxShape()); shape->DetachedFromActor(); } } m_shapes.clear(); + + // Invalidate user data so it sets m_pxStaticRigidBody->userData to nullptr. + // It's appropriate to do this as m_pxStaticRigidBody is a shared pointer and + // techniqucally it could survive m_actorUserData life's spam. + m_actorUserData.Invalidate(); } - void RigidBodyStatic::CreatePxActor(const Physics::WorldBodyConfiguration& configuration) + void StaticRigidBody::CreatePhysXActor(const AzPhysics::StaticRigidBodyConfiguration& configuration) { - if (auto staticBody = PxActorFactories::CreatePxStaticRigidBody(configuration)) + if (m_pxStaticRigidBody != nullptr) { - m_staticRigidBody = AZStd::shared_ptr(staticBody, [](auto& actor) - { - PxActorFactories::ReleaseActor(actor); - }); - m_actorUserData = PhysX::ActorData(m_staticRigidBody.get()); + AZ_Warning("PhysX Static Rigid Body", false, "Trying to create PhysX static rigid actor when it's already created"); + return; + } + + if (m_pxStaticRigidBody = PxActorFactories::CreatePxStaticRigidBody(configuration)) + { + m_actorUserData = ActorData(m_pxStaticRigidBody.get()); m_actorUserData.SetRigidBodyStatic(this); m_actorUserData.SetEntityId(configuration.m_entityId); + m_debugName = configuration.m_debugName; - m_staticRigidBody->setName(m_debugName.c_str()); + m_pxStaticRigidBody->setName(m_debugName.c_str()); } } - void RigidBodyStatic::AddShape(const AZStd::shared_ptr& shape) + void StaticRigidBody::AddShape(const AZStd::shared_ptr& shape) { auto pxShape = AZStd::rtti_pointer_cast(shape); if (pxShape && pxShape->GetPxShape()) { { - PHYSX_SCENE_WRITE_LOCK(m_staticRigidBody->getScene()); - m_staticRigidBody->attachShape(*pxShape->GetPxShape()); + PHYSX_SCENE_WRITE_LOCK(m_pxStaticRigidBody->getScene()); + m_pxStaticRigidBody->attachShape(*pxShape->GetPxShape()); } - pxShape->AttachedToActor(m_staticRigidBody.get()); + pxShape->AttachedToActor(m_pxStaticRigidBody.get()); m_shapes.push_back(pxShape); } else @@ -77,7 +86,7 @@ namespace PhysX } } - AZStd::shared_ptr RigidBodyStatic::GetShape(AZ::u32 index) + AZStd::shared_ptr StaticRigidBody::GetShape(AZ::u32 index) { if (index >= m_shapes.size()) { @@ -86,122 +95,77 @@ namespace PhysX return m_shapes[index]; } - AZ::u32 RigidBodyStatic::GetShapeCount() + AZ::u32 StaticRigidBody::GetShapeCount() { return static_cast(m_shapes.size()); } - // Physics::WorldBody - Physics::World* RigidBodyStatic::GetWorld() const + AZ::Transform StaticRigidBody::GetTransform() const { - return m_staticRigidBody ? Utils::GetUserData(m_staticRigidBody->getScene()) : nullptr; - } - - AZ::Transform RigidBodyStatic::GetTransform() const - { - if (m_staticRigidBody) + if (m_pxStaticRigidBody) { - PHYSX_SCENE_READ_LOCK(m_staticRigidBody->getScene()); - return PxMathConvert(m_staticRigidBody->getGlobalPose()); + PHYSX_SCENE_READ_LOCK(m_pxStaticRigidBody->getScene()); + return PxMathConvert(m_pxStaticRigidBody->getGlobalPose()); } return AZ::Transform::CreateIdentity(); } - void RigidBodyStatic::SetTransform(const AZ::Transform & transform) + void StaticRigidBody::SetTransform(const AZ::Transform & transform) { - if (m_staticRigidBody) + if (m_pxStaticRigidBody) { - PHYSX_SCENE_WRITE_LOCK(m_staticRigidBody->getScene()); - m_staticRigidBody->setGlobalPose(PxMathConvert(transform)); + PHYSX_SCENE_WRITE_LOCK(m_pxStaticRigidBody->getScene()); + m_pxStaticRigidBody->setGlobalPose(PxMathConvert(transform)); } } - AZ::Vector3 RigidBodyStatic::GetPosition() const + AZ::Vector3 StaticRigidBody::GetPosition() const { - if (m_staticRigidBody) + if (m_pxStaticRigidBody) { - PHYSX_SCENE_READ_LOCK(m_staticRigidBody->getScene()); - return PxMathConvert(m_staticRigidBody->getGlobalPose().p); + PHYSX_SCENE_READ_LOCK(m_pxStaticRigidBody->getScene()); + return PxMathConvert(m_pxStaticRigidBody->getGlobalPose().p); } return AZ::Vector3::CreateZero(); } - AZ::Quaternion RigidBodyStatic::GetOrientation() const + AZ::Quaternion StaticRigidBody::GetOrientation() const { - if (m_staticRigidBody) + if (m_pxStaticRigidBody) { - PHYSX_SCENE_READ_LOCK(m_staticRigidBody->getScene()); - return PxMathConvert(m_staticRigidBody->getGlobalPose().q); + PHYSX_SCENE_READ_LOCK(m_pxStaticRigidBody->getScene()); + return PxMathConvert(m_pxStaticRigidBody->getGlobalPose().q); } return AZ::Quaternion::CreateZero(); } - AZ::Aabb RigidBodyStatic::GetAabb() const + AZ::Aabb StaticRigidBody::GetAabb() const { - if (m_staticRigidBody) + if (m_pxStaticRigidBody) { - PHYSX_SCENE_READ_LOCK(m_staticRigidBody->getScene()); - return PxMathConvert(m_staticRigidBody->getWorldBounds(1.0f)); + PHYSX_SCENE_READ_LOCK(m_pxStaticRigidBody->getScene()); + return PxMathConvert(m_pxStaticRigidBody->getWorldBounds(1.0f)); } return AZ::Aabb::CreateNull(); } - Physics::RayCastHit RigidBodyStatic::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit StaticRigidBody::RayCast(const AzPhysics::RayCastRequest& request) { - return PhysX::Utils::RayCast::ClosestRayHitAgainstShapes(request, m_shapes, GetTransform()); + return PhysX::SceneQueryHelpers::ClosestRayHitAgainstShapes(request, m_shapes, GetTransform()); } - AZ::EntityId RigidBodyStatic::GetEntityId() const + AZ::EntityId StaticRigidBody::GetEntityId() const { return m_actorUserData.GetEntityId(); } - AZ::Crc32 RigidBodyStatic::GetNativeType() const + AZ::Crc32 StaticRigidBody::GetNativeType() const { return PhysX::NativeTypeIdentifiers::RigidBodyStatic; } - void* RigidBodyStatic::GetNativePointer() const - { - return m_staticRigidBody.get(); - } - - void RigidBodyStatic::AddToWorld(Physics::World& world) + void* StaticRigidBody::GetNativePointer() const { - physx::PxScene* scene = static_cast(world.GetNativePointer()); - - if (!scene) - { - AZ_Error("RigidBodyStatic", false, "Tried to add body to invalid world."); - return; - } - - if (!m_staticRigidBody) - { - AZ_Error("RigidBodyStatic", false, "Tried to add invalid PhysX body to world."); - return; - } - - PHYSX_SCENE_WRITE_LOCK(scene); - scene->addActor(*m_staticRigidBody); - } - - void RigidBodyStatic::RemoveFromWorld(Physics::World& world) - { - physx::PxScene* scene = static_cast(world.GetNativePointer()); - if (!scene) - { - AZ_Error("RigidBodyStatic", false, "Tried to remove body from invalid world."); - return; - } - - if (!m_staticRigidBody) - { - AZ_Error("RigidBodyStatic", false, "Tried to remove invalid PhysX body from world."); - return; - } - - PHYSX_SCENE_WRITE_LOCK(scene); - scene->removeActor(*m_staticRigidBody); + return m_pxStaticRigidBody.get(); } } diff --git a/Gems/PhysX/Code/Source/RigidBodyStatic.h b/Gems/PhysX/Code/Source/RigidBodyStatic.h index afcebad74c..4477164fbb 100644 --- a/Gems/PhysX/Code/Source/RigidBodyStatic.h +++ b/Gems/PhysX/Code/Source/RigidBodyStatic.h @@ -13,35 +13,38 @@ #pragma once #include -#include +#include #include #include +namespace AzPhysics +{ + struct StaticRigidBodyConfiguration; +} + namespace PhysX { class Shape; - class RigidBodyStatic - : public Physics::RigidBodyStatic + class StaticRigidBody + : public AzPhysics::StaticRigidBody { public: - AZ_CLASS_ALLOCATOR(RigidBodyStatic, AZ::SystemAllocator, 0); - AZ_RTTI(RigidBodyStatic, "{06E960EF-E1F3-466F-B34F-800E32775092}", Physics::RigidBodyStatic); + AZ_CLASS_ALLOCATOR(StaticRigidBody, AZ::SystemAllocator, 0); + AZ_RTTI(StaticRigidBody, "{06E960EF-E1F3-466F-B34F-800E32775092}", AzPhysics::StaticRigidBody); - RigidBodyStatic() = default; - RigidBodyStatic(const Physics::WorldBodyConfiguration& configuration); - ~RigidBodyStatic(); + StaticRigidBody() = default; + StaticRigidBody(const AzPhysics::StaticRigidBodyConfiguration& configuration); + ~StaticRigidBody(); - // Physics::RigidBodyStatic + // AzPhysics::StaticRigidBody void AddShape(const AZStd::shared_ptr& shape) override; AZStd::shared_ptr GetShape(AZ::u32 index) override; AZ::u32 GetShapeCount() override; - // Physics::WorldBody + // AzPhysics::SimulatedBody AZ::EntityId GetEntityId() const override; - Physics::World* GetWorld() const override; - AZ::Transform GetTransform() const override; void SetTransform(const AZ::Transform& transform) override; @@ -49,17 +52,15 @@ namespace PhysX AZ::Quaternion GetOrientation() const override; AZ::Aabb GetAabb() const override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; virtual AZ::Crc32 GetNativeType() const override; virtual void* GetNativePointer() const override; - void AddToWorld(Physics::World&) override; - void RemoveFromWorld(Physics::World&) override; - private: - void CreatePxActor(const Physics::WorldBodyConfiguration& configuration); - AZStd::shared_ptr m_staticRigidBody; + void CreatePhysXActor(const AzPhysics::StaticRigidBodyConfiguration& configuration); + + AZStd::shared_ptr m_pxStaticRigidBody; AZStd::vector> m_shapes; PhysX::ActorData m_actorUserData; AZStd::string m_debugName; diff --git a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp index f0cb9cac9a..760867a3e0 100644 --- a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp +++ b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp @@ -13,32 +13,548 @@ #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + namespace PhysX { - PhysXScene::PhysXScene(const AzPhysics::SceneConfiguration& config) - : m_legacyWorld(AZStd::make_shared(config.m_legacyId, config.m_legacyConfiguration)) + AZ_CLASS_ALLOCATOR_IMPL(PhysXScene, AZ::SystemAllocator, 0); + + /*static*/ thread_local AZStd::vector PhysXScene::s_rayCastBuffer; + /*static*/ thread_local AZStd::vector PhysXScene::s_sweepBuffer; + /*static*/ thread_local AZStd::vector PhysXScene::s_overlapBuffer; + + namespace Internal + { + physx::PxScene* CreatePxScene(const AzPhysics::SceneConfiguration& config, + SceneSimulationFilterCallback* filterCallback, + SceneSimulationEventCallback* simEventCallback) + { + const physx::PxTolerancesScale tolerancesScale = physx::PxTolerancesScale(); + physx::PxSceneDesc sceneDesc(tolerancesScale); + sceneDesc.gravity = PxMathConvert(config.m_gravity); + if (config.m_enableCcd) + { + sceneDesc.flags |= physx::PxSceneFlag::eENABLE_CCD; + sceneDesc.filterShader = Collision::DefaultFilterShaderCCD; + sceneDesc.ccdMaxPasses = config.m_maxCcdPasses; + if (config.m_enableCcdResweep) + { + sceneDesc.flags.clear(physx::PxSceneFlag::eDISABLE_CCD_RESWEEP); + } + else + { + sceneDesc.flags.set(physx::PxSceneFlag::eDISABLE_CCD_RESWEEP); + } + } + else + { + sceneDesc.filterShader = Collision::DefaultFilterShader; + } + + if (config.m_enableActiveActors) + { + sceneDesc.flags |= physx::PxSceneFlag::eENABLE_ACTIVE_ACTORS; + } + + if (config.m_enablePcm) + { + sceneDesc.flags |= physx::PxSceneFlag::eENABLE_PCM; + } + else + { + sceneDesc.flags &= ~physx::PxSceneFlag::eENABLE_PCM; + } + + if (config.m_kinematicFiltering) + { + sceneDesc.kineKineFilteringMode = physx::PxPairFilteringMode::eKEEP; + } + + if (config.m_kinematicStaticFiltering) + { + sceneDesc.staticKineFilteringMode = physx::PxPairFilteringMode::eKEEP; + } + + sceneDesc.bounceThresholdVelocity = config.m_bounceThresholdVelocity; + + sceneDesc.filterCallback = filterCallback; + sceneDesc.simulationEventCallback = simEventCallback; + #ifdef ENABLE_TGS_SOLVER + // Use Temporal Gauss-Seidel solver by default + sceneDesc.solverType = physx::PxSolverType::eTGS; + #endif + #ifdef PHYSX_ENABLE_MULTI_THREADING + sceneDesc.flags |= physx::PxSceneFlag::eREQUIRE_RW_LOCK; + #endif + + if (auto* physXSystem = GetPhysXSystem()) + { + sceneDesc.cpuDispatcher = physXSystem->GetPxCpuDispathcher(); + if (physx::PxScene * pxScene = physXSystem->GetPxPhysics()->createScene(sceneDesc)) + { + if (physx::PxPvdSceneClient* pvdClient = pxScene->getScenePvdClient()) + { + pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_CONSTRAINTS, true); + pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_CONTACTS, true); + pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_SCENEQUERIES, true); + } + return pxScene; + } + } + return nullptr; + } + + bool AddShape(AZStd::variant simulatedBody, const AzPhysics::ShapeVariantData& shapeData) + { + if (auto* shapeColliderPair = AZStd::get_if(&shapeData)) + { + bool shapeAdded = false; + auto shapePtr = AZStd::make_shared(*(shapeColliderPair->first), *(shapeColliderPair->second)); + AZStd::visit([shapePtr, &shapeAdded](auto&& body) + { + if (shapePtr->GetPxShape()) + { + body->AddShape(shapePtr); + shapeAdded = true; + } + }, simulatedBody); + return shapeAdded; + } + else if (auto* shapeColliderPairList = AZStd::get_if>(&shapeData)) + { + bool shapeAdded = false; + for (const auto& shapeColliderConfigs : *shapeColliderPairList) + { + auto shapePtr = AZStd::make_shared(*(shapeColliderConfigs.first), *(shapeColliderConfigs.second)); + AZStd::visit([shapePtr, &shapeAdded](auto&& body) + { + if (shapePtr->GetPxShape()) + { + body->AddShape(shapePtr); + shapeAdded = true; + } + }, simulatedBody); + return shapeAdded; + } + } + else if (auto* shape = AZStd::get_if>(&shapeData)) + { + AZStd::visit([shape](auto&& body) + { + body->AddShape(*shape); + }, simulatedBody); + return true; + } + else if (auto* shapeList = AZStd::get_if>>(&shapeData)) + { + for (auto shapePtr : *shapeList) + { + AZStd::visit([shapePtr](auto&& body) + { + body->AddShape(shapePtr); + }, simulatedBody); + } + return true; + } + return false; + } + + template + AzPhysics::SimulatedBody* CreateSimulatedBody(const ConfigurationType* configuration, AZ::Crc32& crc) + { + SimulatedBodyType* newBody = aznew SimulatedBodyType(*configuration); + if (!AZStd::holds_alternative(configuration->m_colliderAndShapeData)) + { + const bool shapeAdded = AddShape(newBody, configuration->m_colliderAndShapeData); + AZ_Warning("PhysXScene", shapeAdded, "No Collider or Shape information found when creating Rigid body [%s]", configuration->m_debugName.c_str()); + } + crc = AZ::Crc32(newBody, sizeof(*newBody)); + return newBody; + } + + //helper to perform a ray cast + AzPhysics::SceneQueryHits RayCast(const AzPhysics::RayCastRequest* raycastRequest, + AZStd::vector& raycastBuffer, + physx::PxScene* physxScene, + const physx::PxQueryFilterData queryData, + const AZ::u64 sceneMaxResults) + { + // if this query need to report multiple hits, we need to prepare a buffer to hold up to the max allowed. + // The filter should also use the eTOUCH flag to find all contacts with the ray. + // Otherwise the default buffer (1 result) and eBLOCK flag is enough to find the first hit. + physx::PxRaycastBuffer castResult; + SceneQueryHelpers::PhysXQueryFilterCallback queryFilterCallback; + if (raycastRequest->m_reportMultipleHits) + { + const AZ::u64 maxSize = AZStd::min(raycastRequest->m_maxResults, sceneMaxResults); + if (raycastBuffer.size() < maxSize) //todo this needs to be limited by the config setting + { + raycastBuffer.resize(maxSize); + } + castResult = physx::PxRaycastBuffer(raycastBuffer.begin(), aznumeric_cast(maxSize)); + queryFilterCallback = SceneQueryHelpers::PhysXQueryFilterCallback( + raycastRequest->m_collisionGroup, + raycastRequest->m_filterCallback, + physx::PxQueryHitType::eTOUCH); + } + else + { + queryFilterCallback = SceneQueryHelpers::PhysXQueryFilterCallback( + raycastRequest->m_collisionGroup, + SceneQueryHelpers::GetSceneQueryBlockFilterCallback(raycastRequest->m_filterCallback), + physx::PxQueryHitType::eBLOCK); + } + + const physx::PxVec3 orig = PxMathConvert(raycastRequest->m_start); + const physx::PxVec3 dir = PxMathConvert(raycastRequest->m_direction.GetNormalized()); + const physx::PxHitFlags hitFlags = SceneQueryHelpers::GetPxHitFlags(raycastRequest->m_hitFlags); + //Raycast + bool status = false; + { + PHYSX_SCENE_READ_LOCK(physxScene); + status = physxScene->raycast(orig, dir, raycastRequest->m_distance, castResult, hitFlags, queryData, &queryFilterCallback); + } + + AzPhysics::SceneQueryHits hits; + if (status) + { + if (castResult.hasBlock) + { + hits.m_hits.emplace_back(SceneQueryHelpers::GetHitFromPxHit(castResult.block)); + } + + if (raycastRequest->m_reportMultipleHits) + { + for (auto i = 0u; i < castResult.getNbTouches(); ++i) + { + const auto& pxHit = castResult.getTouch(i); + hits.m_hits.emplace_back(SceneQueryHelpers::GetHitFromPxHit(pxHit)); + } + } + } + return hits; + } + + //helper to preform a shape cast + AzPhysics::SceneQueryHits ShapeCast(const AzPhysics::ShapeCastRequest* shapecastRequest, + AZStd::vector& shapecastBuffer, + physx::PxScene* physxScene, + const physx::PxQueryFilterData queryData, + const AZ::u64 sceneMaxResults) + { + // if this query need to report multiple hits, we need to prepare a buffer to hold up to the max allowed. + // The filter should also use the eTOUCH flag to find all contacts with the shape. + // Otherwise the default buffer (1 result) and eBLOCK flag is enough to find the first hit. + physx::PxSweepBuffer castResult; + SceneQueryHelpers::PhysXQueryFilterCallback queryFilterCallback; + if (shapecastRequest->m_reportMultipleHits) + { + const AZ::u64 maxSize = AZStd::min(shapecastRequest->m_maxResults, sceneMaxResults); + if (shapecastBuffer.size() < maxSize) //todo this needs to be limited by the config setting + { + shapecastBuffer.resize(maxSize); + } + castResult = physx::PxSweepBuffer(shapecastBuffer.begin(), aznumeric_cast(maxSize)); + queryFilterCallback = SceneQueryHelpers::PhysXQueryFilterCallback( + shapecastRequest->m_collisionGroup, + shapecastRequest->m_filterCallback, + physx::PxQueryHitType::eTOUCH); + } + else + { + queryFilterCallback = SceneQueryHelpers::PhysXQueryFilterCallback( + shapecastRequest->m_collisionGroup, + SceneQueryHelpers::GetSceneQueryBlockFilterCallback(shapecastRequest->m_filterCallback), + physx::PxQueryHitType::eBLOCK); + } + + physx::PxGeometryHolder pxGeometry; + Utils::CreatePxGeometryFromConfig(*(shapecastRequest->m_shapeConfiguration), pxGeometry); + + AzPhysics::SceneQueryHits results; + if (pxGeometry.any().getType() == physx::PxGeometryType::eSPHERE || + pxGeometry.any().getType() == physx::PxGeometryType::eBOX || + pxGeometry.any().getType() == physx::PxGeometryType::eCAPSULE || + pxGeometry.any().getType() == physx::PxGeometryType::eCONVEXMESH) + { + const physx::PxTransform pose = PxMathConvert(shapecastRequest->m_start); + const physx::PxVec3 dir = PxMathConvert(shapecastRequest->m_direction.GetNormalized()); + const physx::PxHitFlags hitFlags = SceneQueryHelpers::GetPxHitFlags(shapecastRequest->m_hitFlags); + + bool status = false; + { + PHYSX_SCENE_READ_LOCK(*physxScene); + status = physxScene->sweep(pxGeometry.any(), pose, dir, shapecastRequest->m_distance, + castResult, hitFlags, queryData, &queryFilterCallback); + } + + if (status) + { + if (castResult.hasBlock) + { + results.m_hits.emplace_back(SceneQueryHelpers::GetHitFromPxHit(castResult.block)); + } + + if (shapecastRequest->m_reportMultipleHits) + { + for (auto i = 0u; i < castResult.getNbTouches(); ++i) + { + const auto& pxHit = castResult.getTouch(i); + results.m_hits.emplace_back(SceneQueryHelpers::GetHitFromPxHit(pxHit)); + } + } + } + } + else + { + AZ_Warning("World", false, "Invalid geometry type passed to shape cast. Only sphere, box, capsule or convex mesh is supported"); + } + + return results; + } + + bool OverlapGeneric(physx::PxScene* physxScene, const AzPhysics::OverlapRequest* overlapRequest, + physx::PxOverlapCallback& overlapCallback, const physx::PxQueryFilterData& filterData) + { + // Prepare overlap data + const physx::PxTransform pose = PxMathConvert(overlapRequest->m_pose); + physx::PxGeometryHolder pxGeometry; + Utils::CreatePxGeometryFromConfig(*(overlapRequest->m_shapeConfiguration), pxGeometry); + + SceneQueryHelpers::PhysXQueryFilterCallback filterCallback( + overlapRequest->m_collisionGroup, + SceneQueryHelpers::GetFilterCallbackFromOverlap(overlapRequest->m_filterCallback), + physx::PxQueryHitType::eTOUCH); + + bool status = false; + { + PHYSX_SCENE_READ_LOCK(*physxScene); + status = physxScene->overlap(pxGeometry.any(), pose, overlapCallback, filterData, &filterCallback); + } + return status; + } + + AzPhysics::SceneQueryHits OverlapQuery(const AzPhysics::OverlapRequest* overlapRequest, + AZStd::vector& overlapBuffer, + physx::PxScene* physxScene, + const physx::PxQueryFilterData queryData, + const AZ::u64 sceneMaxResults) + { + const AZ::u64 maxSize = AZStd::min(overlapRequest->m_maxResults, sceneMaxResults); + if (overlapBuffer.size() < maxSize) + { + overlapBuffer.resize(maxSize); + } + + if (overlapRequest->m_unboundedOverlapHitCallback) + { + SceneQueryHelpers::UnboundedOverlapCallback callback(overlapRequest->m_unboundedOverlapHitCallback, overlapBuffer); + const bool status = OverlapGeneric(physxScene, overlapRequest, callback, queryData); + if (status) + { + return callback.m_results; + } + return {}; + } + + physx::PxOverlapBuffer queryHits(overlapBuffer.begin(), aznumeric_cast(maxSize)); + bool status = OverlapGeneric(physxScene, overlapRequest, queryHits, queryData); + + AzPhysics::SceneQueryHits results; + if (status) + { + // Process results + AZ::u32 hitNum = queryHits.getNbAnyHits(); + results.m_hits.reserve(hitNum); + for (AZ::u32 i = 0; i < hitNum; ++i) + { + const AzPhysics::SceneQueryHit hit = SceneQueryHelpers::GetHitFromPxOverlapHit(queryHits.getAnyHit(i)); + if (hit.IsValid()) + { + results.m_hits.emplace_back(hit); + } + } + results.m_hits.shrink_to_fit(); + } + return results; + } + } + + PhysXScene::PhysXScene(const AzPhysics::SceneConfiguration& config, const AzPhysics::SceneHandle& sceneHandle) + : Scene(config) , m_config(config) + , m_sceneHandle(sceneHandle) + , m_physicsSystemConfigChanged([this](const AzPhysics::SystemConfiguration* config) + { + m_raycastBufferSize = config->m_raycastBufferSize; + m_shapecastBufferSize = config->m_shapecastBufferSize; + m_overlapBufferSize = config->m_overlapBufferSize; + }) + { + //setup the scene query buffer sizes + if (auto* physXSystem = GetPhysXSystem()) + { + if (const AzPhysics::SystemConfiguration* sysConfig = physXSystem->GetConfiguration()) + { + m_raycastBufferSize = sysConfig->m_raycastBufferSize; + m_shapecastBufferSize = sysConfig->m_shapecastBufferSize; + m_overlapBufferSize = sysConfig->m_overlapBufferSize; + } + //register for future changes to the buffer sizes. + physXSystem->RegisterSystemConfigurationChangedEvent(m_physicsSystemConfigChanged); + } + + PhysXScene::s_rayCastBuffer = {}; + PhysXScene::s_sweepBuffer = {}; + PhysXScene::s_overlapBuffer = {}; + + m_pxScene = Internal::CreatePxScene(m_config, &m_collisionFilterCallback, &m_simulationEventCallback); + AZ_Assert(m_pxScene != nullptr, "PhysX::Scene creation failed."); + + m_pxScene->userData = this; + + m_gravity = m_config.m_gravity; + } + + PhysXScene::~PhysXScene() { + m_physicsSystemConfigChanged.Disconnect(); + + for (auto& simulatedBody : m_simulatedBodies) + { + if (simulatedBody.second != nullptr) + { + if (simulatedBody.second->m_simulating) + { + // Disable simulation on body (not signaling OnSimulationBodySimulationDisabled event) + DisableSimulationOfBodyInternal(*simulatedBody.second); + } + delete simulatedBody.second; + } + } + m_simulatedBodies.clear(); + + ClearDeferedDeletions(); + + if (m_controllerManager) + { + m_controllerManager->release(); + m_controllerManager = nullptr; + } + if (m_pxScene) + { + m_pxScene->release(); + m_pxScene = nullptr; + } } void PhysXScene::StartSimulation(float deltatime) { - if (IsEnabled() && m_legacyWorld) + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysXScene::StartSimulation"); + + if (!IsEnabled()) { - m_legacyWorld->StartSimulation(deltatime); + return; } + + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "OnSceneSimulationStartEvent::Signaled"); + m_sceneSimuationStartEvent.Signal(m_sceneHandle, deltatime); + } + + m_currentDeltaTime = deltatime; + + PHYSX_SCENE_WRITE_LOCK(m_pxScene); + m_pxScene->simulate(deltatime); } void PhysXScene::FinishSimulation() { - if (IsEnabled() && m_legacyWorld) + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysXScene::FinishSimulation"); + + if (!IsEnabled()) + { + return; + } + + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysXScene::CheckResults"); + + // Wait for the simulation to complete. + // In the multithreaded environment we need to make sure we don't lock the scene for write here. + // This is because contact modification callbacks can be issued from the job threads and cause deadlock + // due to the callback code locking the scene. + // https://devtalk.nvidia.com/default/topic/1024408/pxcontactmodifycallback-and-pxscene-locking/ + m_pxScene->checkResults(true); + } + + bool activeActorsEnabled = false; { - m_legacyWorld->FinishSimulation(); + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysXScene::FetchResults"); + PHYSX_SCENE_WRITE_LOCK(m_pxScene); + + activeActorsEnabled = m_pxScene->getFlags() & physx::PxSceneFlag::eENABLE_ACTIVE_ACTORS; + + // Swap the buffers, invoke callbacks, build the list of active actors. + m_pxScene->fetchResults(true); + } + + if (activeActorsEnabled) + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysXScene::ActiveActors"); + + PHYSX_SCENE_READ_LOCK(m_pxScene); + + physx::PxU32 numActiveActors = 0; + physx::PxActor** activeActors = m_pxScene->getActiveActors(numActiveActors); + AzPhysics::SimulatedBodyHandleList activeBodyHandles; + activeBodyHandles.reserve(numActiveActors); + for (physx::PxU32 i = 0; i < numActiveActors; ++i) + { + if (ActorData* actorData = Utils::GetUserData(activeActors[i])) + { + activeBodyHandles.emplace_back(actorData->GetBodyHandle()); + } + } + m_sceneActiveSimulatedBodies.Signal(m_sceneHandle, activeBodyHandles); + } + + FlushQueuedEvents(); + ClearDeferedDeletions(); + + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "OnSceneSimulationFinishedEvent::Signaled"); + m_sceneSimuationFinishEvent.Signal(m_sceneHandle, m_currentDeltaTime); } + + UpdateAzProfilerDataPoints(); + } + + void PhysXScene::FlushQueuedEvents() + { + //send queued trigger events + ProcessTriggerEvents(); + + //send queued collision events + ProcessCollisionEvents(); } - void PhysXScene::Enable(bool enable) + void PhysXScene::SetEnabled(bool enable) { m_isEnabled = enable; } @@ -55,6 +571,506 @@ namespace PhysX void PhysXScene::UpdateConfiguration(const AzPhysics::SceneConfiguration& config) { - m_config = config; + if (m_config != config) + { + m_config = config; + m_configChangeEvent.Signal(m_sceneHandle, m_config); + + // set gravity verifies this is a new value. + SetGravity(m_config.m_gravity); + } + } + + AzPhysics::SimulatedBodyHandle PhysXScene::AddSimulatedBody(const AzPhysics::SimulatedBodyConfiguration* simulatedBodyConfig) + { + AzPhysics::SimulatedBody* newBody = nullptr; + AZ::Crc32 newBodyCrc; + if (azrtti_istypeof(simulatedBodyConfig)) + { + newBody = Internal::CreateSimulatedBody( + azdynamic_cast(simulatedBodyConfig), newBodyCrc); + } + else if (azrtti_istypeof(simulatedBodyConfig)) + { + newBody = Internal::CreateSimulatedBody( + azdynamic_cast(simulatedBodyConfig), newBodyCrc); + } + + if (newBody != nullptr) + { + AzPhysics::SimulatedBodyIndex index; + + if (m_freeSceneSlots.empty()) + { + m_simulatedBodies.emplace_back(newBodyCrc, newBody); + index = m_simulatedBodies.size() - 1; + } + else + { + //fill any free slots first before increasing the size of the simulatedBodies vector. + index = m_freeSceneSlots.front(); + m_freeSceneSlots.pop(); + AZ_Assert(index < m_simulatedBodies.size(), "PhysXScene::AddSimulatedBody: Free simulated body index is out of bounds"); + AZ_Assert(m_simulatedBodies[index].second == nullptr, "PhysXScene::AddSimulatedBody: Free simulated body index is not free"); + + m_simulatedBodies[index] = AZStd::make_pair(newBodyCrc, newBody); + } + + const AzPhysics::SimulatedBodyHandle newBodyHandle(newBodyCrc, index); + newBody->m_sceneOwner = m_sceneHandle; + newBody->m_bodyHandle = newBodyHandle; + m_simulatedBodyAddedEvent.Signal(m_sceneHandle, newBodyHandle); + + // Enable simulation by default (not signaling OnSimulationBodySimulationEnabled event) + EnableSimulationOfBodyInternal(*newBody); + + return newBodyHandle; + } + + return AzPhysics::InvalidSimulatedBodyHandle; + } + + AzPhysics::SimulatedBodyHandleList PhysXScene::AddSimulatedBodies(const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs) + { + AzPhysics::SimulatedBodyHandleList newBodyHandles; + newBodyHandles.reserve(simulatedBodyConfigs.size()); + for (auto* config : simulatedBodyConfigs) + { + newBodyHandles.emplace_back(AddSimulatedBody(config)); + } + return newBodyHandles; + } + + AzPhysics::SimulatedBody* PhysXScene::GetSimulatedBodyFromHandle(AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (bodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + return nullptr; + } + + AzPhysics::SimulatedBodyIndex index = AZStd::get(bodyHandle); + if (index < m_simulatedBodies.size() + && m_simulatedBodies[index].first == AZStd::get(bodyHandle)) + { + return m_simulatedBodies[index].second; + } + return nullptr; + } + + AzPhysics::SimulatedBodyList PhysXScene::GetSimulatedBodiesFromHandle(const AzPhysics::SimulatedBodyHandleList& bodyHandles) + { + AzPhysics::SimulatedBodyList results; + for (auto& handle : bodyHandles) + { + results.emplace_back(GetSimulatedBodyFromHandle(handle)); + } + return results; + } + + void PhysXScene::RemoveSimulatedBody(AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (bodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + return; + } + + AzPhysics::SimulatedBodyIndex index = AZStd::get(bodyHandle); + if (index < m_simulatedBodies.size() + && m_simulatedBodies[index].first == AZStd::get(bodyHandle)) + { + if (m_simulatedBodies[index].second->m_simulating) + { + // Disable simulation on body (not signaling OnSimulationBodySimulationDisabled event) + DisableSimulationOfBodyInternal(*m_simulatedBodies[index].second); + } + + m_simulatedBodyRemovedEvent.Signal(m_sceneHandle, bodyHandle); + + m_deferredDeletions.push_back(m_simulatedBodies[index].second); + m_simulatedBodies[index] = AZStd::make_pair(AZ::Crc32(), nullptr); + m_freeSceneSlots.push(index); + } + } + + void PhysXScene::RemoveSimulatedBodies(const AzPhysics::SimulatedBodyHandleList& bodyHandles) + { + for (auto& handle: bodyHandles) + { + RemoveSimulatedBody(handle); + } + } + + void PhysXScene::EnableSimulationOfBody(AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (bodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + return; + } + + if (AzPhysics::SimulatedBody* body = GetSimulatedBodyFromHandle(bodyHandle)) + { + if (body->m_simulating) + { + return; + } + + m_simulatedBodySimulationEnabledEvent.Signal(m_sceneHandle, bodyHandle); + + EnableSimulationOfBodyInternal(*body); + } + else + { + AZ_Warning("PhysXScene", false, "Unable to enable Simulated body, failed to find body.") + } + } + + void PhysXScene::DisableSimulationOfBody(AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (bodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + return; + } + + if (AzPhysics::SimulatedBody* body = GetSimulatedBodyFromHandle(bodyHandle)) + { + if (!body->m_simulating) + { + return; + } + + m_simulatedBodySimulationDisabledEvent.Signal(m_sceneHandle, bodyHandle); + + DisableSimulationOfBodyInternal(*body); + } + else + { + AZ_Warning("PhysXScene", false, "Unable to disable Simulated body, failed to find body.") + } + } + + AzPhysics::SceneQueryHits PhysXScene::QueryScene(const AzPhysics::SceneQueryRequest* request) + { + if (request == nullptr) + { + return {}; //return 0 hits + } + + // Query flags. + const physx::PxQueryFlags queryFlags = SceneQueryHelpers::GetPxQueryFlags(request->m_queryType); + const physx::PxQueryFilterData queryData(queryFlags); + + if (azrtti_istypeof(request)) + { + return Internal::RayCast(azdynamic_cast(request), + s_rayCastBuffer, m_pxScene, queryData, m_raycastBufferSize); + } + else if (azrtti_istypeof(request)) + { + return Internal::ShapeCast(azdynamic_cast(request), + s_sweepBuffer, m_pxScene, queryData, m_shapecastBufferSize); + } + else if (azrtti_istypeof(request)) + { + return Internal::OverlapQuery(azdynamic_cast(request), + s_overlapBuffer, m_pxScene, queryData, m_overlapBufferSize); + } + else + { + AZ_Warning("Physx", false, "Unknown Scene Query request type."); + } + return AzPhysics::SceneQueryHits(); + } + + AzPhysics::SceneQueryHitsList PhysXScene::QuerySceneBatch(const AzPhysics::SceneQueryRequests& requests) + { + AzPhysics::SceneQueryHitsList results; + results.reserve(requests.size()); + for (auto& request : requests) + { + results.emplace_back(QueryScene(request.get())); + } + return results; + } + + [[nodiscard]] bool PhysXScene::QuerySceneAsync([[maybe_unused]] AzPhysics::SceneQuery::AsyncRequestId requestId, + [[maybe_unused]] const AzPhysics::SceneQueryRequest* request, [[maybe_unused]] AzPhysics::SceneQuery::AsyncCallback callback) + { + AZ_Warning("Physx", false, "Currently unimplemented."); // LYN-2306 + return false; + } + + [[nodiscard]] bool PhysXScene::QuerySceneAsyncBatch([[maybe_unused]] AzPhysics::SceneQuery::AsyncRequestId requestId, + [[maybe_unused]] const AzPhysics::SceneQueryRequests& requests, [[maybe_unused]] AzPhysics::SceneQuery::AsyncBatchCallback callback) + { + AZ_Warning("Physx", false, "Currently unimplemented."); // LYN-2306 + return false; + } + + void PhysXScene::SuppressCollisionEvents( + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) + { + AzPhysics::SimulatedBody* bodyA = GetSimulatedBodyFromHandle(bodyHandleA); + AzPhysics::SimulatedBody* bodyB = GetSimulatedBodyFromHandle(bodyHandleB); + if (bodyA != nullptr && bodyB != nullptr) + { + m_collisionFilterCallback.RegisterSuppressedCollision(bodyA, bodyB); + } + } + + void PhysXScene::UnsuppressCollisionEvents( + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) + { + AzPhysics::SimulatedBody* bodyA = GetSimulatedBodyFromHandle(bodyHandleA); + AzPhysics::SimulatedBody* bodyB = GetSimulatedBodyFromHandle(bodyHandleB); + if (bodyA != nullptr && bodyB != nullptr) + { + m_collisionFilterCallback.UnregisterSuppressedCollision(bodyA, bodyB); + } + } + + void PhysXScene::SetGravity(const AZ::Vector3& gravity) + { + if (m_pxScene && !m_gravity.IsClose(gravity)) + { + m_gravity = gravity; + { + PHYSX_SCENE_WRITE_LOCK(m_pxScene); + m_pxScene->setGravity(PxMathConvert(m_gravity)); + } + m_sceneGravityChangedEvent.Signal(m_sceneHandle, m_gravity); + } + } + + AZ::Vector3 PhysXScene::GetGravity() const + { + return m_gravity; + } + + void PhysXScene::EnableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body) + { + auto pxActor = static_cast(body.GetNativePointer()); + AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); + + { + PHYSX_SCENE_WRITE_LOCK(m_pxScene); + m_pxScene->addActor(*pxActor); + } + + if (azrtti_istypeof(body)) + { + auto rigidBody = azdynamic_cast(&body); + if (rigidBody->ShouldStartAsleep()) + { + rigidBody->ForceAsleep(); + } + } + + body.m_simulating = true; + } + + void PhysXScene::DisableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body) + { + auto pxActor = static_cast(body.GetNativePointer()); + AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); + + { + PHYSX_SCENE_WRITE_LOCK(m_pxScene); + m_pxScene->removeActor(*pxActor); + } + + body.m_simulating = false; + } + + physx::PxControllerManager* PhysXScene::GetOrCreateControllerManager() + { + if (m_controllerManager) + { + return m_controllerManager; + } + + if (m_pxScene) + { + m_controllerManager = PxCreateControllerManager(*m_pxScene); + } + + if (m_controllerManager) + { + m_controllerManager->setOverlapRecoveryModule(true); + } + else + { + AZ_Error("PhysX Character Controller System", false, "Unable to create a Controller Manager."); + } + + return m_controllerManager; + } + + void PhysXScene::DeferDelete(AZStd::unique_ptr worldBody) + { + m_deferredDeletions_uniquePtrs.push_back(AZStd::move(worldBody)); + } + + void* PhysXScene::GetNativePointer() const + { + return m_pxScene; + } + + void PhysXScene::ClearDeferedDeletions() + { + for (auto& simulatedBody : m_deferredDeletions) + { + delete simulatedBody; + } + m_deferredDeletions.clear(); + m_deferredDeletions_uniquePtrs.clear(); + } + + void PhysXScene::ProcessTriggerEvents() + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysXScene::ProcessTriggerEvents"); + + AzPhysics::TriggerEventList& triggers = m_simulationEventCallback.GetQueuedTriggerEvents(); + if (triggers.empty()) + { + return; // nothing to signal + } + m_sceneTriggerEvent.Signal(m_sceneHandle, triggers); + + for (auto& triggerEvent : triggers) + { + if (triggerEvent.m_triggerBody != nullptr) + { + triggerEvent.m_triggerBody->ProcessTriggerEvent(triggerEvent); + } + if (triggerEvent.m_otherBody != nullptr) + { + triggerEvent.m_otherBody->ProcessTriggerEvent(triggerEvent); + } + } + + //cleanup events for next simulate + m_simulationEventCallback.FlushQueuedTriggerEvents(); + } + + void PhysXScene::ProcessCollisionEvents() + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysXScene::ProcessCollisionEvents"); + + AzPhysics::CollisionEventList& collisions = m_simulationEventCallback.GetQueuedCollisionEvents(); + if (collisions.empty()) + { + return; //nothing to signal + } + //send all event to any scene listeners + m_sceneCollisionEvent.Signal(m_sceneHandle, collisions); + + //send events to each body listener + for (auto& collision : collisions) + { + //trigger on body 1 + if (collision.m_body1 != nullptr) + { + collision.m_body1->ProcessCollisionEvent(collision); + } + //trigger for body 2 + if (collision.m_body2 != nullptr) + { + //swap the data as the event expects the trigger body to be body1. + //this is ok to do as this event is no longer used after calling TriggerCollisionEvent + AZStd::swap(collision.m_bodyHandle1, collision.m_bodyHandle2); + AZStd::swap(collision.m_body1, collision.m_body2); + AZStd::swap(collision.m_shape1, collision.m_shape2); + collision.m_body1->ProcessCollisionEvent(collision); + } + } + + //cleanup events for next simulate + m_simulationEventCallback.FlushQueuedCollisionEvents(); + } + + void PhysXScene::UpdateAzProfilerDataPoints() + { + using physx::PxGeometryType; + + bool isProfilingActive = false; + AZ::Debug::ProfilerRequestBus::BroadcastResult(isProfilingActive, &AZ::Debug::ProfilerRequests::IsActive); + + if (!isProfilingActive) + { + return; + } + + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::Statistics"); + + physx::PxSimulationStatistics stats; + + { + PHYSX_SCENE_READ_LOCK(m_pxScene); + m_pxScene->getSimulationStatistics(stats); + } + + const char* RootCategory = "PhysX/%s/%s"; + + const char* ShapesSubCategory = "Shapes"; + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eSPHERE], RootCategory, ShapesSubCategory, "Sphere"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::ePLANE], RootCategory, ShapesSubCategory, "Plane"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eCAPSULE], RootCategory, ShapesSubCategory, "Capsule"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eBOX], RootCategory, ShapesSubCategory, "Box"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eCONVEXMESH], RootCategory, ShapesSubCategory, "ConvexMesh"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eTRIANGLEMESH], RootCategory, ShapesSubCategory, "TriangleMesh"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eHEIGHTFIELD], RootCategory, ShapesSubCategory, "Heightfield"); + + const char* ObjectsSubCategory = "Objects"; + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbActiveConstraints, RootCategory, ObjectsSubCategory, "ActiveConstraints"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbActiveDynamicBodies, RootCategory, ObjectsSubCategory, "ActiveDynamicBodies"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbActiveKinematicBodies, RootCategory, ObjectsSubCategory, "ActiveKinematicBodies"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbStaticBodies, RootCategory, ObjectsSubCategory, "StaticBodies"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDynamicBodies, RootCategory, ObjectsSubCategory, "DynamicBodies"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbKinematicBodies, RootCategory, ObjectsSubCategory, "KinematicBodies"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbAggregates, RootCategory, ObjectsSubCategory, "Aggregates"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbArticulations, RootCategory, ObjectsSubCategory, "Articulations"); + + const char* SolverSubCategory = "Solver"; + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbAxisSolverConstraints, RootCategory, SolverSubCategory, "AxisSolverConstraints"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.compressedContactSize, RootCategory, SolverSubCategory, "CompressedContactSize"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.requiredContactConstraintMemory, RootCategory, SolverSubCategory, "RequiredContactConstraintMemory"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.peakConstraintMemory, RootCategory, SolverSubCategory, "PeakConstraintMemory"); + + const char* BroadphaseSubCategory = "Broadphase"; + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.getNbBroadPhaseAdds(), RootCategory, BroadphaseSubCategory, "BroadPhaseAdds"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.getNbBroadPhaseRemoves(), RootCategory, BroadphaseSubCategory, "BroadPhaseRemoves"); + + // Compute pair stats for all geometry types + AZ::u32 ccdPairs = 0; + AZ::u32 modifiedPairs = 0; + AZ::u32 triggerPairs = 0; + + for (AZ::u32 i = 0; i < PxGeometryType::eGEOMETRY_COUNT; i++) + { + // stat[i][j] = stat[j][i], hence, discarding the symmetric entries + for (AZ::u32 j = i; j < PxGeometryType::eGEOMETRY_COUNT; j++) + { + const PxGeometryType::Enum firstGeom = static_cast(i); + const PxGeometryType::Enum secondGeom = static_cast(j); + ccdPairs += stats.getRbPairStats(physx::PxSimulationStatistics::eCCD_PAIRS, firstGeom, secondGeom); + modifiedPairs += stats.getRbPairStats(physx::PxSimulationStatistics::eMODIFIED_CONTACT_PAIRS, firstGeom, secondGeom); + triggerPairs += stats.getRbPairStats(physx::PxSimulationStatistics::eTRIGGER_PAIRS, firstGeom, secondGeom); + } + } + + const char* CollisionsSubCategory = "Collisions"; + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, ccdPairs, RootCategory, CollisionsSubCategory, "CCDPairs"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, modifiedPairs, RootCategory, CollisionsSubCategory, "ModifiedPairs"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, triggerPairs, RootCategory, CollisionsSubCategory, "TriggerPairs"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDiscreteContactPairsTotal, RootCategory, CollisionsSubCategory, "DiscreteContactPairsTotal"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDiscreteContactPairsWithCacheHits, RootCategory, CollisionsSubCategory, "DiscreteContactPairsWithCacheHits"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDiscreteContactPairsWithContacts, RootCategory, CollisionsSubCategory, "DiscreteContactPairsWithContacts"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbNewPairs, RootCategory, CollisionsSubCategory, "NewPairs"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbLostPairs, RootCategory, CollisionsSubCategory, "LostPairs"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbNewTouches, RootCategory, CollisionsSubCategory, "NewTouches"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbLostTouches, RootCategory, CollisionsSubCategory, "LostTouches"); + AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbPartitions, RootCategory, CollisionsSubCategory, "Partitions"); } } diff --git a/Gems/PhysX/Code/Source/Scene/PhysXScene.h b/Gems/PhysX/Code/Source/Scene/PhysXScene.h index c43b16432b..ec708cee9e 100644 --- a/Gems/PhysX/Code/Source/Scene/PhysXScene.h +++ b/Gems/PhysX/Code/Source/Scene/PhysXScene.h @@ -13,9 +13,16 @@ #include #include +#include #include -#include // Temporary until LYN-438 work is complete +#include +#include + +namespace physx +{ + class PxScene; +} namespace PhysX { @@ -24,27 +31,85 @@ namespace PhysX : public AzPhysics::Scene { public: + AZ_CLASS_ALLOCATOR_DECL; AZ_RTTI(PhysXScene, "{B0FCFDE6-8B59-49D8-8819-E8C2F1EDC182}", AzPhysics::Scene); - PhysXScene(const AzPhysics::SceneConfiguration& config); - ~PhysXScene() = default; + explicit PhysXScene(const AzPhysics::SceneConfiguration& config, const AzPhysics::SceneHandle& sceneHandle); + ~PhysXScene(); // AzPhysics::PhysicsScene ... void StartSimulation(float deltatime) override; void FinishSimulation() override; - void Enable(bool enable) override; + void SetEnabled(bool enable) override; bool IsEnabled() const override; const AzPhysics::SceneConfiguration& GetConfiguration() const override; void UpdateConfiguration(const AzPhysics::SceneConfiguration& config) override; + AzPhysics::SimulatedBodyHandle AddSimulatedBody(const AzPhysics::SimulatedBodyConfiguration* simulatedBodyConfig) override; + AzPhysics::SimulatedBodyHandleList AddSimulatedBodies(const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs) override; + AzPhysics::SimulatedBody* GetSimulatedBodyFromHandle(AzPhysics::SimulatedBodyHandle bodyHandle) override; + AzPhysics::SimulatedBodyList GetSimulatedBodiesFromHandle(const AzPhysics::SimulatedBodyHandleList& bodyHandles) override; + void RemoveSimulatedBody(AzPhysics::SimulatedBodyHandle bodyHandle) override; + void RemoveSimulatedBodies(const AzPhysics::SimulatedBodyHandleList& bodyHandles) override; + void EnableSimulationOfBody(AzPhysics::SimulatedBodyHandle bodyHandle) override; + void DisableSimulationOfBody(AzPhysics::SimulatedBodyHandle bodyHandle) override; + AzPhysics::SceneQueryHits QueryScene(const AzPhysics::SceneQueryRequest* request) override; + AzPhysics::SceneQueryHitsList QuerySceneBatch(const AzPhysics::SceneQueryRequests& requests) override; + [[nodiscard]] bool QuerySceneAsync(AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequest* request, AzPhysics::SceneQuery::AsyncCallback callback) override; + [[nodiscard]] bool QuerySceneAsyncBatch(AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequests& requests, AzPhysics::SceneQuery::AsyncBatchCallback callback) override; + void SuppressCollisionEvents( + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) override; + void UnsuppressCollisionEvents( + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) override; + void SetGravity(const AZ::Vector3& gravity) override; + AZ::Vector3 GetGravity() const override; + + AzPhysics::SceneHandle GetSceneHandle() const { return m_sceneHandle; } + const AZStd::vector>& GetSimulatedBodyList() const { return m_simulatedBodies; } + + void* GetNativePointer() const override; + + physx::PxControllerManager* GetOrCreateControllerManager(); + void DeferDelete(AZStd::unique_ptr worldBody); - // Temporary until LYN-438 work is complete - AZStd::shared_ptr GetLegacyWorld() const override { return m_legacyWorld; } private: + void EnableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body); + void DisableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body); + + void FlushQueuedEvents(); + void ClearDeferedDeletions(); + void ProcessTriggerEvents(); + void ProcessCollisionEvents(); + + void UpdateAzProfilerDataPoints(); + bool m_isEnabled = true; AzPhysics::SceneConfiguration m_config; + AzPhysics::SceneHandle m_sceneHandle; + float m_currentDeltaTime = 0.0f; + + AZStd::vector> m_simulatedBodies; //this will become a SimulatedBody with LYN-1334 + AZStd::vector m_deferredDeletions; + AZStd::vector> m_deferredDeletions_uniquePtrs; // this is to support Character as it stores itself in a unique pointer currently. + AZStd::queue m_freeSceneSlots; + + AzPhysics::SystemEvents::OnConfigurationChangedEvent::Handler m_physicsSystemConfigChanged; + + static thread_local AZStd::vector s_rayCastBuffer; //!< thread local structure to hold hits for a single raycast or shapecast. + static thread_local AZStd::vector s_sweepBuffer; //!< thread local structure to hold hits for a single shapecast. + static thread_local AZStd::vector s_overlapBuffer; //!< thread local structure to hold hits for a single overlap query. + AZ::u64 m_raycastBufferSize = 32; //!< Maximum number of hits that will be returned from a raycast. + AZ::u64 m_shapecastBufferSize = 32; //!< Maximum number of hits that can be returned from a shapecast. + AZ::u64 m_overlapBufferSize = 32; //!< Maximum number of overlaps that can be returned from an overlap query. - AzPhysics::SystemEvents::OnDefaultSceneConfigurationChangedEvent::Handler m_defaultSceneConfigChanged; + SceneSimulationFilterCallback m_collisionFilterCallback; //!< Handles the filtering of collision pairs reported from PhysX. + SceneSimulationEventCallback m_simulationEventCallback; //!< Handles the collision and trigger events reported from PhysX. + physx::PxScene* m_pxScene = nullptr; //!< The physx scene + physx::PxControllerManager* m_controllerManager = nullptr; //!< The physx controller manager - AZStd::shared_ptr m_legacyWorld; // Temporary until LYN-438 work is complete + AZ::Vector3 m_gravity; // cache the gravity of the scene to avoid a lock in GetGravity(). }; } diff --git a/Gems/PhysX/Code/Source/Scene/PhysXSceneInterface.cpp b/Gems/PhysX/Code/Source/Scene/PhysXSceneInterface.cpp new file mode 100644 index 0000000000..948529a5c8 --- /dev/null +++ b/Gems/PhysX/Code/Source/Scene/PhysXSceneInterface.cpp @@ -0,0 +1,288 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or +* a third party where indicated. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include + +#include +#include +#include + +namespace PhysX +{ + namespace Internal + { + template + void EventRegisterHelper(PhysXSystem* physxSystem, AzPhysics::SceneHandle sceneHandle, Handler& handler, Function registerFunc) + { + if (AzPhysics::Scene* scene = physxSystem->GetScene(sceneHandle)) + { + auto func = AZStd::bind(registerFunc, scene, AZStd::placeholders::_1); + func(handler); + } + } + } + + PhysXSceneInterface::PhysXSceneInterface(PhysXSystem* physxSystem) + : m_physxSystem(physxSystem) + { + + } + + // AzPhysics::SceneInterface ... + AzPhysics::SceneHandle PhysXSceneInterface::GetSceneHandle(const AZStd::string& sceneName) + { + return m_physxSystem->GetSceneHandle(sceneName); + } + + void PhysXSceneInterface::StartSimulation(AzPhysics::SceneHandle sceneHandle, float deltatime) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->StartSimulation(deltatime); + } + } + + void PhysXSceneInterface::FinishSimulation(AzPhysics::SceneHandle sceneHandle) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->FinishSimulation(); + } + } + + void PhysXSceneInterface::SetEnabled(AzPhysics::SceneHandle sceneHandle, bool enable) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->SetEnabled(enable); + } + } + + bool PhysXSceneInterface::IsEnabled(AzPhysics::SceneHandle sceneHandle) const + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->IsEnabled(); + } + return false; + } + + AzPhysics::SimulatedBodyHandle PhysXSceneInterface::AddSimulatedBody(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfiguration* simulatedBodyConfig) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->AddSimulatedBody(simulatedBodyConfig); + } + return AzPhysics::InvalidSimulatedBodyHandle; + } + + AzPhysics::SimulatedBodyHandleList PhysXSceneInterface::AddSimulatedBodies(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->AddSimulatedBodies(simulatedBodyConfigs); + } + + return {}; //return an empty list + } + + AzPhysics::SimulatedBody* PhysXSceneInterface::GetSimulatedBodyFromHandle(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->GetSimulatedBodyFromHandle(bodyHandle); + } + return nullptr; + } + + AzPhysics::SimulatedBodyList PhysXSceneInterface::GetSimulatedBodiesFromHandle(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->GetSimulatedBodiesFromHandle(bodyHandles); + } + return {}; //return an empty list + } + + void PhysXSceneInterface::RemoveSimulatedBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->RemoveSimulatedBody(bodyHandle); + } + } + + void PhysXSceneInterface::RemoveSimulatedBodies(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->RemoveSimulatedBodies(bodyHandles); + } + } + + void PhysXSceneInterface::EnableSimulationOfBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->EnableSimulationOfBody(bodyHandle); + } + } + + void PhysXSceneInterface::DisableSimulationOfBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->DisableSimulationOfBody(bodyHandle); + } + } + + AzPhysics::SceneQueryHits PhysXSceneInterface::QueryScene( + AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequest* request) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->QueryScene(request); + } + return AzPhysics::SceneQueryHits(); + } + + AzPhysics::SceneQueryHitsList PhysXSceneInterface::QuerySceneBatch( + AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequests& requests) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->QuerySceneBatch(requests); + } + return {}; //return an empty list + } + + bool PhysXSceneInterface::QuerySceneAsync( + AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequest* request, AzPhysics::SceneQuery::AsyncCallback callback) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->QuerySceneAsync(requestId, request, callback); + } + return false; + } + + bool PhysXSceneInterface::QuerySceneAsyncBatch( + AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequests& requests, AzPhysics::SceneQuery::AsyncBatchCallback callback) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->QuerySceneAsyncBatch(requestId, requests, callback); + } + return false; + } + + void PhysXSceneInterface::SuppressCollisionEvents(AzPhysics::SceneHandle sceneHandle, + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->SuppressCollisionEvents(bodyHandleA, bodyHandleB); + } + + } + + void PhysXSceneInterface::UnsuppressCollisionEvents(AzPhysics::SceneHandle sceneHandle, + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->UnsuppressCollisionEvents(bodyHandleA, bodyHandleB); + } + } + + void PhysXSceneInterface::SetGravity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& gravity) + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + scene->SetGravity(gravity); + } + } + + AZ::Vector3 PhysXSceneInterface::GetGravity(AzPhysics::SceneHandle sceneHandle) const + { + if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle)) + { + return scene->GetGravity(); + } + return AZ::Vector3::CreateZero(); + } + + void PhysXSceneInterface::RegisterSceneConfigurationChangedEventHandler(AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSceneConfigurationChanged::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSceneConfigurationChangedEventHandler); + } + + void PhysXSceneInterface::RegisterSimulationBodyAddedHandler(AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSimulationBodyAdded::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSimulationBodyAddedHandler); + } + + void PhysXSceneInterface::RegisterSimulationBodyRemovedHandler(AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSimulationBodyRemoved::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSimulationBodyRemovedHandler); + } + + void PhysXSceneInterface::RegisterSimulationBodySimulationEnabledHandler(AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSimulationBodySimulationEnabledHandler); + } + + void PhysXSceneInterface::RegisterSimulationBodySimulationDisabledHandler(AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSimulationBodySimulationDisabledHandler); + } + + void PhysXSceneInterface::RegisterSceneSimulationStartHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneSimulationStartHandler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSceneSimulationStartHandler); + } + + void PhysXSceneInterface::RegisterSceneSimulationFinishHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneSimulationFinishHandler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSceneSimulationFinishHandler); + } + + void PhysXSceneInterface::RegisterSceneActiveSimulatedBodiesHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSceneActiveSimulatedBodiesHandler); + } + + void PhysXSceneInterface::RegisterSceneCollisionEventHandler(AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSceneCollisionsEvent::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSceneCollisionEventHandler); + } + + void PhysXSceneInterface::RegisterSceneTriggersEventHandler(AzPhysics::SceneHandle sceneHandle, + AzPhysics::SceneEvents::OnSceneTriggersEvent::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSceneTriggersEventHandler); + } + + void PhysXSceneInterface::RegisterSceneGravityChangedEvent(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler& handler) + { + Internal::EventRegisterHelper(m_physxSystem, sceneHandle, handler, &AzPhysics::Scene::RegisterSceneGravityChangedEvent); + } +} diff --git a/Gems/PhysX/Code/Source/Scene/PhysXSceneInterface.h b/Gems/PhysX/Code/Source/Scene/PhysXSceneInterface.h new file mode 100644 index 0000000000..3bc08d641c --- /dev/null +++ b/Gems/PhysX/Code/Source/Scene/PhysXSceneInterface.h @@ -0,0 +1,75 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or +* a third party where indicated. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include +#include +#include + +namespace AzPhysics +{ + struct SimulatedBody; +} + +namespace PhysX +{ + class PhysXSystem; + + class PhysXSceneInterface + : public AZ::Interface::Registrar + { + public: + explicit PhysXSceneInterface(PhysXSystem* physxSystem); + + // AzPhysics::SceneInterface ... + AzPhysics::SceneHandle GetSceneHandle(const AZStd::string& sceneName) override; + void StartSimulation(AzPhysics::SceneHandle sceneHandle, float deltatime) override; + void FinishSimulation(AzPhysics::SceneHandle sceneHandle) override; + void SetEnabled(AzPhysics::SceneHandle sceneHandle, bool enable) override; + bool IsEnabled(AzPhysics::SceneHandle sceneHandle) const override; + AzPhysics::SimulatedBodyHandle AddSimulatedBody(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfiguration* simulatedBodyConfig) override; + AzPhysics::SimulatedBodyHandleList AddSimulatedBodies(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs) override; + AzPhysics::SimulatedBody* GetSimulatedBodyFromHandle(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override; + AzPhysics::SimulatedBodyList GetSimulatedBodiesFromHandle(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles) override; + void RemoveSimulatedBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override; + void RemoveSimulatedBodies(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles) override; + void EnableSimulationOfBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override; + void DisableSimulationOfBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override; + AzPhysics::SceneQueryHits QueryScene(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequest* request) override; + AzPhysics::SceneQueryHitsList QuerySceneBatch(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequests& requests) override; + [[nodiscard]] bool QuerySceneAsync(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequest* request, AzPhysics::SceneQuery::AsyncCallback callback) override; + [[nodiscard]] bool QuerySceneAsyncBatch(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequests& requests, AzPhysics::SceneQuery::AsyncBatchCallback callback) override; + void SuppressCollisionEvents(AzPhysics::SceneHandle sceneHandle, + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) override; + void UnsuppressCollisionEvents(AzPhysics::SceneHandle sceneHandle, + const AzPhysics::SimulatedBodyHandle& bodyHandleA, + const AzPhysics::SimulatedBodyHandle& bodyHandleB) override; + void SetGravity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& gravity) override; + AZ::Vector3 GetGravity(AzPhysics::SceneHandle sceneHandle) const override; + void RegisterSceneConfigurationChangedEventHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneConfigurationChanged::Handler& handler) override; + void RegisterSimulationBodyAddedHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSimulationBodyAdded::Handler& handler) override; + void RegisterSimulationBodyRemovedHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSimulationBodyRemoved::Handler& handler) override; + void RegisterSimulationBodySimulationEnabledHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler) override; + void RegisterSimulationBodySimulationDisabledHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler) override; + void RegisterSceneSimulationStartHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneSimulationStartHandler& handler) override; + void RegisterSceneSimulationFinishHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneSimulationFinishHandler& handler) override; + void RegisterSceneActiveSimulatedBodiesHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler) override; + void RegisterSceneCollisionEventHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneCollisionsEvent::Handler& handler) override; + void RegisterSceneTriggersEventHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneTriggersEvent::Handler& handler) override; + void RegisterSceneGravityChangedEvent(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler& handler) override; + private: + PhysXSystem* m_physxSystem = nullptr; + }; +} diff --git a/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationEventCallback.cpp b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationEventCallback.cpp new file mode 100644 index 0000000000..fbe7b36a03 --- /dev/null +++ b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationEventCallback.cpp @@ -0,0 +1,219 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +namespace PhysX +{ + AzPhysics::CollisionEventList& SceneSimulationEventCallback::GetQueuedCollisionEvents() + { + return m_queuedCollisionEvents; + } + + AzPhysics::TriggerEventList& SceneSimulationEventCallback::GetQueuedTriggerEvents() + { + return m_queuedTriggerEvents; + } + + void SceneSimulationEventCallback::FlushQueuedCollisionEvents() + { + m_queuedCollisionEvents.clear(); + } + + void SceneSimulationEventCallback::FlushQueuedTriggerEvents() + { + m_queuedTriggerEvents.clear(); + } + + void SceneSimulationEventCallback::onConstraintBreak( + [[maybe_unused]] physx::PxConstraintInfo* constraints, [[maybe_unused]] physx::PxU32 count) + { + } + + void SceneSimulationEventCallback::onWake([[maybe_unused]] physx::PxActor** actors, [[maybe_unused]] physx::PxU32 count) + { + } + + void SceneSimulationEventCallback::onSleep([[maybe_unused]] physx::PxActor** actors, [[maybe_unused]] physx::PxU32 count) + { + } + + void SceneSimulationEventCallback::onContact( + const physx::PxContactPairHeader& pairHeader, + const physx::PxContactPair* pairs, physx::PxU32 nbPairs) + { + const bool body1Destroyed = pairHeader.flags & physx::PxContactPairHeaderFlag::eREMOVED_ACTOR_0; + const bool body2Destroyed = pairHeader.flags & physx::PxContactPairHeaderFlag::eREMOVED_ACTOR_1; + if (body1Destroyed || body2Destroyed) + { + // We can't report destroyed bodies at the moment. + return; + } + + const auto flagsToNotify = + physx::PxPairFlag::eNOTIFY_TOUCH_FOUND | + physx::PxPairFlag::eNOTIFY_TOUCH_PERSISTS | + physx::PxPairFlag::eNOTIFY_TOUCH_LOST; + static constexpr const physx::PxU32 MaxPointsToReport = 10; + for (physx::PxU32 i = 0; i < nbPairs; i++) + { + const physx::PxContactPair& contactPair = pairs[i]; + + if (contactPair.events & flagsToNotify) + { + ActorData* actorData1 = Utils::GetUserData(pairHeader.actors[0]); + ActorData* actorData2 = Utils::GetUserData(pairHeader.actors[1]); + + // Missing user data, or user data was invalid + if (!actorData1 || !actorData2) + { + AZ_Warning("PhysX", false, "Invalid user data set for objects Obj0:%p Obj1:%p", actorData1, actorData2); + continue; + } + + AzPhysics::SimulatedBody* body1 = actorData1->GetWorldBody(); + AzPhysics::SimulatedBody* body2 = actorData2->GetWorldBody(); + + if (!body1 || !body2) + { + AZ_Warning("PhysX", false, "Invalid body data set for objects Obj0:%p Obj1:%p", body1, body2); + continue; + } + + Physics::Shape* shape1 = Utils::GetUserData(contactPair.shapes[0]); + Physics::Shape* shape2 = Utils::GetUserData(contactPair.shapes[1]); + + if (!shape1 || !shape2) + { + AZ_Warning("PhysX", false, "Invalid shape userdata set for objects Obj0:%p Obj1:%p", shape1, shape2); + continue; + } + + // Collision Event + AzPhysics::CollisionEvent collision; + collision.m_bodyHandle1 = actorData1->GetBodyHandle(); + collision.m_body1 = body1; + collision.m_bodyHandle2 = actorData2->GetBodyHandle(); + collision.m_body2 = body2; + collision.m_shape1 = shape1; + collision.m_shape2 = shape2; + + // Extract contacts for collision event + physx::PxContactPairPoint extractedPoints[MaxPointsToReport]; + physx::PxU32 contactPointCount = contactPair.extractContacts(extractedPoints, MaxPointsToReport); + collision.m_contacts.resize(contactPointCount); + for (physx::PxU8 j = 0; j < contactPointCount; ++j) + { + const physx::PxContactPairPoint& point = extractedPoints[j]; + + AzPhysics::Contact& contact = collision.m_contacts[j]; + contact.m_position = PxMathConvert(point.position); + contact.m_normal = PxMathConvert(point.normal); + contact.m_impulse = PxMathConvert(point.impulse); + contact.m_separation = point.separation; + contact.m_internalFaceIndex01 = point.internalFaceIndex0; + contact.m_internalFaceIndex02 = point.internalFaceIndex1; + } + + if (contactPair.events & physx::PxPairFlag::eNOTIFY_TOUCH_FOUND) + { + collision.m_type = AzPhysics::CollisionEvent::Type::Begin; + m_queuedCollisionEvents.emplace_back(AZStd::move(collision)); + } + else if (contactPair.events & physx::PxPairFlag::eNOTIFY_TOUCH_PERSISTS) + { + collision.m_type = AzPhysics::CollisionEvent::Type::Persist; + m_queuedCollisionEvents.emplace_back(AZStd::move(collision)); + } + else if (contactPair.events & physx::PxPairFlag::eNOTIFY_TOUCH_LOST) + { + collision.m_type = AzPhysics::CollisionEvent::Type::End; + m_queuedCollisionEvents.emplace_back(AZStd::move(collision)); + } + } + } + } + + void SceneSimulationEventCallback::onTrigger(physx::PxTriggerPair* pairs, physx::PxU32 count) + { + for (physx::PxU32 i = 0; i < count; ++i) + { + const physx::PxTriggerPair& triggerPair = pairs[i]; + + if (triggerPair.triggerActor == nullptr || + triggerPair.triggerActor->userData == nullptr || + triggerPair.otherActor == nullptr || + triggerPair.otherActor->userData == nullptr) + { + continue; + } + + ActorData* triggerBodyActorData = Utils::GetUserData(triggerPair.triggerActor); + AzPhysics::SimulatedBody* triggerBody = triggerBodyActorData->GetWorldBody(); + if (!triggerBody) + { + AZ_Error("PhysX", false, "onTrigger:: trigger body was invalid"); + continue; + } + if (!triggerBody->GetEntityId().IsValid()) + { + AZ_Warning("PhysX", false, "onTrigger received invalid actors."); + continue; + } + + ActorData* otherActorData = Utils::GetUserData(triggerPair.otherActor); + AzPhysics::SimulatedBody* otherBody = otherActorData->GetWorldBody(); + if (!otherBody) + { + AZ_Error("PhysX", false, "onTrigger:: otherBody was invalid"); + continue; + } + if (!otherBody->GetEntityId().IsValid()) + { + AZ_Warning("PhysX", false, "onTrigger received invalid actors."); + continue; + } + + AzPhysics::TriggerEvent trigger; + trigger.m_triggerBodyHandle = triggerBodyActorData->GetBodyHandle(); + trigger.m_triggerBody = triggerBody; + trigger.m_triggerShape = static_cast(triggerPair.triggerShape->userData); + trigger.m_otherBodyHandle = otherActorData->GetBodyHandle(); + trigger.m_otherBody = otherBody; + trigger.m_otherShape = static_cast(triggerPair.otherShape->userData); + + if (triggerPair.status == physx::PxPairFlag::eNOTIFY_TOUCH_FOUND) + { + trigger.m_type = AzPhysics::TriggerEvent::Type::Enter; + m_queuedTriggerEvents.emplace_back(AZStd::move(trigger)); + } + else if (triggerPair.status == physx::PxPairFlag::eNOTIFY_TOUCH_LOST) + { + trigger.m_type = AzPhysics::TriggerEvent::Type::Exit; + m_queuedTriggerEvents.emplace_back(AZStd::move(trigger)); + } + else + { + AZ_Warning("PhysX", false, "onTrigger with status different from TOUCH_FOUND and TOUCH_LOST."); + } + } + } + + void SceneSimulationEventCallback::onAdvance( + [[maybe_unused]] const physx::PxRigidBody* const* bodyBuffer, + [[maybe_unused]] const physx::PxTransform* poseBuffer, [[maybe_unused]] const physx::PxU32 count) + { + } +} diff --git a/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationEventCallback.h b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationEventCallback.h new file mode 100644 index 0000000000..c747021e0b --- /dev/null +++ b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationEventCallback.h @@ -0,0 +1,49 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +#include +namespace PhysX +{ + //! Helper class that receives the collision events reported from PhysX. + //! This will convert physx collision and trigger events in TriggerEvent and CollisionEvent to be forwarded to the Scene. + class SceneSimulationEventCallback + : public physx::PxSimulationEventCallback + { + public: + SceneSimulationEventCallback() = default; + ~SceneSimulationEventCallback() = default; + + //! Accessor to the queued Collision / trigger Events. + AzPhysics::CollisionEventList& GetQueuedCollisionEvents(); + AzPhysics::TriggerEventList& GetQueuedTriggerEvents(); + + //! Clear all queued collision / trigger events. + void FlushQueuedCollisionEvents(); + void FlushQueuedTriggerEvents(); + + // physx::PxSimulationEventCallback Interface + void onConstraintBreak(physx::PxConstraintInfo* constraints, physx::PxU32 count) override; + void onWake(physx::PxActor** actors, physx::PxU32 count) override; + void onSleep(physx::PxActor** actors, physx::PxU32 count) override; + void onContact(const physx::PxContactPairHeader& pairHeader, const physx::PxContactPair* pairs, physx::PxU32 nbPairs) override; + void onTrigger(physx::PxTriggerPair* pairs, physx::PxU32 count) override; + void onAdvance(const physx::PxRigidBody* const* bodyBuffer, const physx::PxTransform* poseBuffer, const physx::PxU32 count) override; + + private: + AzPhysics::CollisionEventList m_queuedCollisionEvents; //!< Holds all the collision events the happened until the next call to FlushCollisionEvents; + AzPhysics::TriggerEventList m_queuedTriggerEvents; //!< Holds all the trigger events the happened until the next call to FlushTriggerEvents; + }; +} diff --git a/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationFilterCallback.cpp b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationFilterCallback.cpp new file mode 100644 index 0000000000..2f755ca1aa --- /dev/null +++ b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationFilterCallback.cpp @@ -0,0 +1,131 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include + +namespace PhysX +{ + namespace Internal + { + // get the PxActor if the simulated body is one. + const physx::PxActor* GetPxActor(const AzPhysics::SimulatedBody* simBody) + { + const AZ::Crc32& nativeType = simBody->GetNativeType(); + if (nativeType != NativeTypeIdentifiers::RigidBody && + nativeType != NativeTypeIdentifiers::RigidBodyStatic) + { + return nullptr; + } + + return static_cast(simBody->GetNativePointer()); + } + } // namespace Internal + + // SceneSimulationFilterCallback::CollisionActorPair ------------- + + SceneSimulationFilterCallback::CollisionActorPair::CollisionActorPair(const physx::PxActor* actorA, const physx::PxActor* actorB) + : m_actorA(actorA) + , m_actorB(actorB) + { + + } + + const bool SceneSimulationFilterCallback::CollisionActorPair::operator==(const CollisionActorPair& other) const + { + //the order of m_actorA and m_actorB do not matter thus {1,2} == {2,1} and {1,2} == {1,2} should both return true. + if (m_actorA == other.m_actorA) + { + return m_actorB == other.m_actorB; + } + else if (m_actorA == other.m_actorB) + { + return m_actorB == other.m_actorA; + } + return false; + } + + size_t SceneSimulationFilterCallback::CollisionPairHasher::operator()(const CollisionActorPair& collisionPair) const + { + size_t hash{ 0 }; + AZStd::hash_combine(hash, collisionPair.m_actorA, collisionPair.m_actorB); + return hash; + } + + // SceneSimulationFilterCallback ------------- + + void SceneSimulationFilterCallback::RegisterSuppressedCollision(const AzPhysics::SimulatedBody* body0, + const AzPhysics::SimulatedBody* body1) + { + const physx::PxActor* actor0 = Internal::GetPxActor(body0); + const physx::PxActor* actor1 = Internal::GetPxActor(body1); + if (actor0 && actor1) + { + if (FindSuppressedPair(actor0, actor1) == m_suppressedCollisionPairs.end()) + { + m_suppressedCollisionPairs.insert(CollisionActorPair(actor0, actor1)); + } + } + } + + void SceneSimulationFilterCallback::UnregisterSuppressedCollision(const AzPhysics::SimulatedBody* body0, + const AzPhysics::SimulatedBody* body1) + { + const physx::PxActor* actor0 = Internal::GetPxActor(body0); + const physx::PxActor* actor1 = Internal::GetPxActor(body1); + if (actor0 && actor1) + { + if (auto iterator = FindSuppressedPair(actor0, actor1); + iterator != m_suppressedCollisionPairs.end()) + { + m_suppressedCollisionPairs.erase(*iterator); + } + } + } + + physx::PxFilterFlags SceneSimulationFilterCallback::pairFound( + [[maybe_unused]] physx::PxU32 pairId, [[maybe_unused]] physx::PxFilterObjectAttributes attributes0, + [[maybe_unused]] physx::PxFilterData filterData0, const physx::PxActor* actor0, + [[maybe_unused]] const physx::PxShape* shape0, [[maybe_unused]] physx::PxFilterObjectAttributes attributes1, + [[maybe_unused]] physx::PxFilterData filterData1, const physx::PxActor* actor1, + [[maybe_unused]] const physx::PxShape* shape1, [[maybe_unused]] physx::PxPairFlags& pairFlags) + { + if (FindSuppressedPair(actor0, actor1) != m_suppressedCollisionPairs.end()) + { + return physx::PxFilterFlag::eSUPPRESS; + } + + return physx::PxFilterFlag::eDEFAULT; + } + + void SceneSimulationFilterCallback::pairLost( + [[maybe_unused]] physx::PxU32 pairId, [[maybe_unused]] physx::PxFilterObjectAttributes attributes0, + [[maybe_unused]] physx::PxFilterData filterData0, [[maybe_unused]] physx::PxFilterObjectAttributes attributes1, + [[maybe_unused]] physx::PxFilterData filterData1, [[maybe_unused]] bool objectRemoved) + { + + } + + bool SceneSimulationFilterCallback::statusChange([[maybe_unused]] physx::PxU32& pairId, [[maybe_unused]] physx::PxPairFlags& pairFlags, + [[maybe_unused]] physx::PxFilterFlags& filterFlags) + { + return false; + } + + SceneSimulationFilterCallback::CollisionPairSet::const_iterator SceneSimulationFilterCallback::FindSuppressedPair( + const physx::PxActor* actor0, const physx::PxActor* actor1) const + { + return m_suppressedCollisionPairs.find(CollisionActorPair(actor0, actor1)); + } +} diff --git a/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationFilterCallback.h b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationFilterCallback.h new file mode 100644 index 0000000000..39ad8feeb0 --- /dev/null +++ b/Gems/PhysX/Code/Source/Scene/PhysXSceneSimulationFilterCallback.h @@ -0,0 +1,76 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +#include + +namespace AzPhysics +{ + struct SimulatedBody; +} + +namespace PhysX +{ + //! Helper class to handle the filtering of collision pairs reported from PhysX. + class SceneSimulationFilterCallback + : public physx::PxSimulationFilterCallback + { + public: + SceneSimulationFilterCallback() = default; + ~SceneSimulationFilterCallback() = default; + + //! Registers a pair of simulated bodies for which collisions should be suppressed. + void RegisterSuppressedCollision( + const AzPhysics::SimulatedBody* body0, + const AzPhysics::SimulatedBody* body1); + + //! Unregisters a pair of simulated bodies for which collisions should be suppressed. + void UnregisterSuppressedCollision( + const AzPhysics::SimulatedBody* body0, + const AzPhysics::SimulatedBody* body1); + + // physx::PxSimulationFilterCallback Interface + physx::PxFilterFlags pairFound(physx::PxU32 pairId, physx::PxFilterObjectAttributes attributes0, + physx::PxFilterData filterData0, const physx::PxActor* actor0, const physx::PxShape* shape0, + physx::PxFilterObjectAttributes attributes1, physx::PxFilterData filterData1, const physx::PxActor* actor1, + const physx::PxShape* shape1, physx::PxPairFlags& pairFlags) override; + void pairLost(physx::PxU32 pairId, physx::PxFilterObjectAttributes attributes0, physx::PxFilterData filterData0, + physx::PxFilterObjectAttributes attributes1, physx::PxFilterData filterData1, bool objectRemoved) override; + bool statusChange(physx::PxU32& pairId, physx::PxPairFlags& pairFlags, physx::PxFilterFlags& filterFlags) override; + + private: + struct CollisionActorPair + { + CollisionActorPair() = default; + CollisionActorPair(const physx::PxActor* actorA, const physx::PxActor* actorB); + ~CollisionActorPair() = default; + + const bool operator==(const CollisionActorPair& other) const; + + const physx::PxActor* m_actorA = nullptr; + const physx::PxActor* m_actorB = nullptr; + }; + + struct CollisionPairHasher + { + size_t operator()(const CollisionActorPair& collisionPair) const; + }; + using CollisionPairSet = AZStd::unordered_set; + + CollisionPairSet::const_iterator FindSuppressedPair(const physx::PxActor* actor0, const physx::PxActor* actor1) const; + + CollisionPairSet m_suppressedCollisionPairs; //!< Actor pairs with collision suppressed. + }; +} diff --git a/Gems/PhysX/Code/Source/Shape.cpp b/Gems/PhysX/Code/Source/Shape.cpp index c9ea4f07c1..31c3d3ec15 100644 --- a/Gems/PhysX/Code/Source/Shape.cpp +++ b/Gems/PhysX/Code/Source/Shape.cpp @@ -11,14 +11,16 @@ */ #include -#include -#include #include -#include -#include -#include + +#include #include +#include #include +#include +#include +#include +#include namespace PhysX { @@ -327,12 +329,12 @@ namespace PhysX m_attachedActor = nullptr; } - Physics::RayCastHit Shape::RayCastInternal(const Physics::RayCastRequest& worldSpaceRequest, const physx::PxTransform& pose) + AzPhysics::SceneQueryHit Shape::RayCastInternal(const AzPhysics::RayCastRequest& worldSpaceRequest, const physx::PxTransform& pose) { const physx::PxVec3 start = PxMathConvert(worldSpaceRequest.m_start); const physx::PxVec3 unitDir = PxMathConvert(worldSpaceRequest.m_direction); const physx::PxU32 maxHits = 1; - const physx::PxHitFlags hitFlags = Utils::RayCast::GetPxHitFlags(worldSpaceRequest.m_hitFlags); + const physx::PxHitFlags hitFlags = SceneQueryHelpers::GetPxHitFlags(worldSpaceRequest.m_hitFlags); physx::PxRaycastHit hitInfo; const bool hit = physx::PxGeometryQuery::raycast(start, unitDir, m_pxShape->getGeometry().any(), pose, @@ -343,12 +345,12 @@ namespace PhysX // Fill actor and shape, as they won't be filled from PxGeometryQuery hitInfo.actor = static_cast(m_attachedActor); // This cast is safe since GetHitFromPxHit() only uses PxActor:: functions hitInfo.shape = GetPxShape(); - return Utils::RayCast::GetHitFromPxHit(hitInfo); + return SceneQueryHelpers::GetHitFromPxHit(hitInfo); } - return Physics::RayCastHit(); + return AzPhysics::SceneQueryHit(); } - Physics::RayCastHit Shape::RayCast(const Physics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform) + AzPhysics::SceneQueryHit Shape::RayCast(const AzPhysics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform) { physx::PxTransform localPose; { @@ -358,7 +360,7 @@ namespace PhysX return RayCastInternal(worldSpaceRequest, PxMathConvert(worldTransform) * localPose); } - Physics::RayCastHit Shape::RayCastLocal(const Physics::RayCastRequest& localSpaceRequest) + AzPhysics::SceneQueryHit Shape::RayCastLocal(const AzPhysics::RayCastRequest& localSpaceRequest) { physx::PxTransform localPose; { diff --git a/Gems/PhysX/Code/Source/Shape.h b/Gems/PhysX/Code/Source/Shape.h index 0600efcbe8..079b8e417e 100644 --- a/Gems/PhysX/Code/Source/Shape.h +++ b/Gems/PhysX/Code/Source/Shape.h @@ -82,11 +82,11 @@ namespace PhysX //! Raycast against this shape. //! @param request Ray parameters in world space. //! @param worldTransform World transform of this shape. - Physics::RayCastHit RayCast(const Physics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform) override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform) override; //! Raycast against this shape using local coordinates. //! @param request Ray parameters in local space. - Physics::RayCastHit RayCastLocal(const Physics::RayCastRequest& localSpaceRequest) override; + AzPhysics::SceneQueryHit RayCastLocal(const AzPhysics::RayCastRequest& localSpaceRequest) override; //! Retrieve this shape AABB. //! @param worldTransform World transform of this shape. @@ -102,7 +102,7 @@ namespace PhysX void ExtractMaterialsFromPxShape(); physx::PxScene* GetScene() const; void ReleasePxShape(physx::PxShape* shape); - Physics::RayCastHit RayCastInternal(const Physics::RayCastRequest& worldSpaceRequest, const physx::PxTransform& pose); + AzPhysics::SceneQueryHit RayCastInternal(const AzPhysics::RayCastRequest& worldSpaceRequest, const physx::PxTransform& pose); using PxShapeUniquePtr = AZStd::unique_ptr>; Shape() = default; diff --git a/Gems/PhysX/Code/Source/ShapeColliderComponent.cpp b/Gems/PhysX/Code/Source/ShapeColliderComponent.cpp index e3be9b7cdf..4b0c07b85d 100644 --- a/Gems/PhysX/Code/Source/ShapeColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/ShapeColliderComponent.cpp @@ -42,14 +42,13 @@ namespace PhysX // BaseColliderComponent void ShapeColliderComponent::UpdateScaleForShapeConfigs() { - // all currently supported shape types scale uniformly based on the largest element of the non-uniform scale - const AZ::Vector3 uniformScale = Utils::GetUniformScale(GetEntityId()); + const AZ::Vector3 overallScale = Utils::GetOverallScale(GetEntityId()); for (auto& shapeConfigPair : m_shapeConfigList) { if (shapeConfigPair.second) { - shapeConfigPair.second->m_scale = uniformScale; + shapeConfigPair.second->m_scale = overallScale; } } } diff --git a/Gems/PhysX/Code/Source/SphereColliderComponent.cpp b/Gems/PhysX/Code/Source/SphereColliderComponent.cpp index 3134998aae..e39ad0f97d 100644 --- a/Gems/PhysX/Code/Source/SphereColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/SphereColliderComponent.cpp @@ -40,6 +40,6 @@ namespace PhysX return; } - m_shapeConfigList[0].second->m_scale = Utils::GetNonUniformScale(GetEntityId()); + m_shapeConfigList[0].second->m_scale = Utils::GetTransformScale(GetEntityId()); } } diff --git a/Gems/PhysX/Code/Source/StaticRigidBodyComponent.cpp b/Gems/PhysX/Code/Source/StaticRigidBodyComponent.cpp index b33f5a25f9..9387884999 100644 --- a/Gems/PhysX/Code/Source/StaticRigidBodyComponent.cpp +++ b/Gems/PhysX/Code/Source/StaticRigidBodyComponent.cpp @@ -15,10 +15,14 @@ #include #include #include -#include #include +#include +#include #include +#include +#include +#include #include @@ -29,6 +33,12 @@ namespace PhysX StaticRigidBodyComponent::StaticRigidBodyComponent() = default; StaticRigidBodyComponent::~StaticRigidBodyComponent() = default; + StaticRigidBodyComponent::StaticRigidBodyComponent(AzPhysics::SceneHandle sceneHandle) + : m_attachedSceneHandle(sceneHandle) + { + + } + void StaticRigidBodyComponent::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) @@ -65,9 +75,9 @@ namespace PhysX dependent.push_back(AZ_CRC("PhysXColliderService", 0x4ff43f7c)); } - PhysX::RigidBodyStatic* StaticRigidBodyComponent::GetStaticRigidBody() + PhysX::StaticRigidBody* StaticRigidBodyComponent::GetStaticRigidBody() { - return m_staticRigidBody.get(); + return m_staticRigidBody; } void StaticRigidBodyComponent::InitStaticRigidBody() @@ -75,26 +85,30 @@ namespace PhysX AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, GetEntityId(), &AZ::TransformInterface::GetWorldTM); - Physics::WorldBodyConfiguration configuration; + AzPhysics::StaticRigidBodyConfiguration configuration; configuration.m_orientation = transform.GetRotation(); configuration.m_position = transform.GetTranslation(); configuration.m_entityId = GetEntityId(); configuration.m_debugName = GetEntity()->GetName(); - m_staticRigidBody = AZStd::make_unique(configuration); - - ColliderComponentRequestBus::EnumerateHandlersId(GetEntityId(), [this](ColliderComponentRequests* handler) + AZStd::vector> allshapes; + ColliderComponentRequestBus::EnumerateHandlersId(GetEntityId(), [&allshapes](ColliderComponentRequests* handler) { const AZStd::vector>& shapes = handler->GetShapes(); - for (auto& shape : shapes) - { - m_staticRigidBody->AddShape(shape); - } + allshapes.insert(allshapes.end(), shapes.begin(), shapes.end()); return true; }); + configuration.m_colliderAndShapeData = allshapes; - World* world = Utils::GetDefaultWorld(); - world->AddBody(*m_staticRigidBody); + if (m_attachedSceneHandle == AzPhysics::InvalidSceneHandle) + { + Physics::DefaultWorldBus::BroadcastResult(m_attachedSceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); + } + if (auto* sceneInterface = AZ::Interface::Get()) + { + m_staticRigidBodyHandle = sceneInterface->AddSimulatedBody(m_attachedSceneHandle, &configuration); + m_staticRigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_attachedSceneHandle, m_staticRigidBodyHandle)); + } } void StaticRigidBodyComponent::Activate() @@ -109,7 +123,12 @@ namespace PhysX void StaticRigidBodyComponent::Deactivate() { - Physics::Utils::DeferDelete(AZStd::move(m_staticRigidBody)); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_attachedSceneHandle, m_staticRigidBodyHandle); + m_staticRigidBodyHandle = AzPhysics::InvalidSceneHandle; + m_staticRigidBody = nullptr; + } Physics::WorldBodyRequestBus::Handler::BusDisconnect(); AZ::TransformNotificationBus::Handler::BusDisconnect(); @@ -126,17 +145,19 @@ namespace PhysX { return; } - World* world = Utils::GetDefaultWorld(); - world->AddBody(*m_staticRigidBody); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->EnableSimulationOfBody(m_attachedSceneHandle, m_staticRigidBodyHandle); + } Physics::WorldBodyNotificationBus::Event(GetEntityId(), &Physics::WorldBodyNotifications::OnPhysicsEnabled); } void StaticRigidBodyComponent::DisablePhysics() { - if (Physics::World* world = m_staticRigidBody->GetWorld()) + if (auto* sceneInterface = AZ::Interface::Get()) { - world->RemoveBody(*m_staticRigidBody); + sceneInterface->DisableSimulationOfBody(m_attachedSceneHandle, m_staticRigidBodyHandle); } Physics::WorldBodyNotificationBus::Event(GetEntityId(), &Physics::WorldBodyNotifications::OnPhysicsDisabled); @@ -144,7 +165,7 @@ namespace PhysX bool StaticRigidBodyComponent::IsPhysicsEnabled() const { - return m_staticRigidBody != nullptr && m_staticRigidBody->GetWorld() != nullptr; + return m_staticRigidBody != nullptr && m_staticRigidBody->m_simulating; } AZ::Aabb StaticRigidBodyComponent::GetAabb() const @@ -152,14 +173,18 @@ namespace PhysX return m_staticRigidBody->GetAabb(); } - Physics::WorldBody* StaticRigidBodyComponent::GetWorldBody() + AzPhysics::SimulatedBody* StaticRigidBodyComponent::GetWorldBody() { - return m_staticRigidBody.get(); + return m_staticRigidBody; } - Physics::RayCastHit StaticRigidBodyComponent::RayCast(const Physics::RayCastRequest& request) + AzPhysics::SceneQueryHit StaticRigidBodyComponent::RayCast(const AzPhysics::RayCastRequest& request) { - return m_staticRigidBody->RayCast(request); + if (m_staticRigidBody) + { + return m_staticRigidBody->RayCast(request); + } + return AzPhysics::SceneQueryHit(); } } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/StaticRigidBodyComponent.h b/Gems/PhysX/Code/Source/StaticRigidBodyComponent.h index d7c8ab9001..f846329ca0 100644 --- a/Gems/PhysX/Code/Source/StaticRigidBodyComponent.h +++ b/Gems/PhysX/Code/Source/StaticRigidBodyComponent.h @@ -16,9 +16,14 @@ #include #include +namespace AzPhysics +{ + struct SimulatedBody; +} + namespace PhysX { - class RigidBodyStatic; + class StaticRigidBody; class StaticRigidBodyComponent final : public AZ::Component @@ -29,6 +34,7 @@ namespace PhysX AZ_COMPONENT(StaticRigidBodyComponent, StaticRigidBodyComponentTypeId); StaticRigidBodyComponent(); + explicit StaticRigidBodyComponent(AzPhysics::SceneHandle sceneHandle); ~StaticRigidBodyComponent(); static void Reflect(AZ::ReflectContext* context); @@ -38,15 +44,15 @@ namespace PhysX static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); - PhysX::RigidBodyStatic* GetStaticRigidBody(); + PhysX::StaticRigidBody* GetStaticRigidBody(); // WorldBodyRequestBus void EnablePhysics() override; void DisablePhysics() override; bool IsPhysicsEnabled() const override; AZ::Aabb GetAabb() const override; - Physics::WorldBody* GetWorldBody() override; - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; + AzPhysics::SimulatedBody* GetWorldBody() override; + AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override; private: void InitStaticRigidBody(); @@ -58,6 +64,8 @@ namespace PhysX // AZ::TransformNotificationsBus void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; - AZStd::unique_ptr m_staticRigidBody; + AzPhysics::SimulatedBodyHandle m_staticRigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + PhysX::StaticRigidBody* m_staticRigidBody = nullptr; + AzPhysics::SceneHandle m_attachedSceneHandle = AzPhysics::InvalidSceneHandle; }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/System/PhysXSystem.cpp b/Gems/PhysX/Code/Source/System/PhysXSystem.cpp index 24c0736e3e..1d925570c5 100644 --- a/Gems/PhysX/Code/Source/System/PhysXSystem.cpp +++ b/Gems/PhysX/Code/Source/System/PhysXSystem.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -19,8 +20,11 @@ #include #include + namespace PhysX { + AZ_CLASS_ALLOCATOR_IMPL(PhysXSystem, AZ::SystemAllocator, 0); + PhysXSystem::MaterialLibraryAssetHelper::MaterialLibraryAssetHelper(PhysXSystem* physXSystem) : m_physXSystem(physXSystem) { @@ -53,6 +57,7 @@ namespace PhysX PhysXSystem::PhysXSystem(PhysXSettingsRegistryManager* registryManager, const physx::PxCookingParams& cookingParams) : m_registryManager(*registryManager) , m_materialLibraryAssetHelper(this) + , m_sceneInterface(this) { // Start PhysX allocator PhysXAllocator::Descriptor allocatorDescriptor; @@ -125,12 +130,12 @@ namespace PhysX auto simulateScenes = [this](float timeStep) { - for (auto* scene : m_sceneList) + for (auto& scenePtr : m_sceneList) { - if (scene != nullptr && scene->IsEnabled()) + if (scenePtr != nullptr && scenePtr->IsEnabled()) { - scene->StartSimulation(timeStep); - scene->FinishSimulation(); + scenePtr->StartSimulation(timeStep); + scenePtr->FinishSimulation(); } } }; @@ -138,12 +143,14 @@ namespace PhysX deltaTime = AZ::GetClamp(deltaTime, 0.0f, m_systemConfig.m_maxTimestep); AZ_Assert(m_systemConfig.m_fixedTimestep >= 0.0f, "PhysXSystem - fixed timestep is negitive."); + float tickTime = deltaTime; if (m_systemConfig.m_fixedTimestep > 0.0f) //use the fixed timestep { - m_accumulatedTime += deltaTime; + m_accumulatedTime += tickTime; //divide accumulated time by the fixed step and floor it to get the number of steps that would occur. Then multiply by fixedTimeStep to get the total executed time. - const float tickTime = AZStd::floorf(m_accumulatedTime / m_systemConfig.m_fixedTimestep) * m_systemConfig.m_fixedTimestep; + tickTime = AZStd::floorf(m_accumulatedTime / m_systemConfig.m_fixedTimestep) * m_systemConfig.m_fixedTimestep; m_preSimulateEvent.Signal(tickTime); + while (m_accumulatedTime >= m_systemConfig.m_fixedTimestep) { simulateScenes(m_systemConfig.m_fixedTimestep); @@ -152,29 +159,40 @@ namespace PhysX } else { - m_preSimulateEvent.Signal(deltaTime); - simulateScenes(deltaTime); + m_preSimulateEvent.Signal(tickTime); + + simulateScenes(tickTime); } m_postSimulateEvent.Signal(); } AzPhysics::SceneHandle PhysXSystem::AddScene(const AzPhysics::SceneConfiguration& config) { + if (config.m_sceneName.empty()) + { + AZ_Error("PhysXSystem", false, "AddScene: Trying to Add a scene without a name. SceneConfiguration::m_sceneName must have a value"); + return AzPhysics::InvalidSceneHandle; + } + if (!m_freeSceneSlots.empty()) //fill any free slots first before increasing the size of the scene list vector. { - AZ::u64 freeIndex = m_freeSceneSlots.front(); + AzPhysics::SceneIndex freeIndex = m_freeSceneSlots.front(); m_freeSceneSlots.pop(); AZ_Assert(freeIndex < m_sceneList.size(), "PhysXSystem::AddScene: Free scene index is out of bounds!"); AZ_Assert(m_sceneList[freeIndex] == nullptr, "PhysXSystem::AddScene: Free scene index is not free"); - m_sceneList[freeIndex] = new PhysXScene(config); - return AzPhysics::SceneHandle(config.m_legacyId, freeIndex); + const AzPhysics::SceneHandle sceneHandle(AZ::Crc32(config.m_sceneName), freeIndex); + m_sceneList[freeIndex] = AZStd::make_unique(config, sceneHandle); + m_sceneAddedEvent.Signal(sceneHandle); + return sceneHandle; } if (m_sceneList.size() < std::numeric_limits::max()) //add a new scene if it is under the limit { - m_sceneList.emplace_back(new PhysXScene(config)); - return AzPhysics::SceneHandle(config.m_legacyId, (m_sceneList.size() - 1)); + const AzPhysics::SceneHandle sceneHandle(AZ::Crc32(config.m_sceneName), (m_sceneList.size())); + m_sceneList.emplace_back(AZStd::make_unique(config, sceneHandle)); + m_sceneAddedEvent.Signal(sceneHandle); + return sceneHandle; } AZ_Warning("Physx", false, "Scene Limit reached[%d], unable to add new scene [%s]", std::numeric_limits::max(), @@ -194,6 +212,20 @@ namespace PhysX return sceneHandles; } + AzPhysics::SceneHandle PhysXSystem::GetSceneHandle(const AZStd::string& sceneName) + { + const AZ::Crc32 sceneCrc(sceneName); + auto sceneItr = AZStd::find_if(m_sceneList.begin(), m_sceneList.end(), [sceneCrc](auto& scene) { + return scene != nullptr && sceneCrc == scene->GetId(); + }); + + if (sceneItr != m_sceneList.end()) + { + return AzPhysics::SceneHandle((*sceneItr)->GetId(), AZStd::distance(m_sceneList.begin(), sceneItr)); + } + return AzPhysics::InvalidSceneHandle; + } + AzPhysics::Scene* PhysXSystem::GetScene(AzPhysics::SceneHandle handle) { if (handle == AzPhysics::InvalidSceneHandle) @@ -201,14 +233,15 @@ namespace PhysX return nullptr; } - AzPhysics::SceneIndex index = AZStd::get(handle); + AzPhysics::SceneIndex index = AZStd::get(handle); if (index < m_sceneList.size()) { - if (AzPhysics::Scene* scene = m_sceneList[index]) + if (auto& scenePtr = m_sceneList[index]; + scenePtr != nullptr) { - if (scene->GetConfiguration().m_legacyId == AZStd::get(handle)) + if (scenePtr->GetId() == AZStd::get(handle)) { - return scene; + return scenePtr.get(); } } } @@ -239,12 +272,19 @@ namespace PhysX return; } - AZ::u64 index = AZStd::get(handle); - if (index < m_sceneList.size()) + AZ::u64 index = AZStd::get(handle); + if (index < m_sceneList.size() ) { - delete m_sceneList[index]; - m_sceneList[index] = nullptr; - m_freeSceneSlots.push(index); + if (auto& scenePtr = m_sceneList[index]; + scenePtr != nullptr) + { + if (scenePtr->GetId() == AZStd::get(handle)) + { + m_sceneRemovedEvent.Signal(handle); + m_sceneList[index].reset(); + m_freeSceneSlots.push(index); + } + } } } @@ -258,11 +298,6 @@ namespace PhysX void PhysXSystem::RemoveAllScenes() { - for (auto* scene : m_sceneList) - { - delete scene; - scene = nullptr; - } m_sceneList.clear(); //clear the free slots queue @@ -270,6 +305,28 @@ namespace PhysX m_freeSceneSlots.swap(empty); } + AZStd::pair PhysXSystem::FindAttachedBodyHandleFromEntityId(AZ::EntityId entityId) + { + for (auto& scenePtr : m_sceneList) + { + if (scenePtr == nullptr) + { + continue; + } + if (auto* physXScene = azdynamic_cast(scenePtr.get())) + { + for (const auto& [_, body] : physXScene->GetSimulatedBodyList()) + { + if (body != nullptr && body->GetEntityId() == entityId) + { + return AZStd::make_pair(physXScene->GetSceneHandle(), body->m_bodyHandle); + } + } + } + } + return AZStd::make_pair(AzPhysics::InvalidSceneHandle, AzPhysics::InvalidSimulatedBodyHandle); + } + const AzPhysics::SystemConfiguration* PhysXSystem::GetConfiguration() const { return &m_systemConfig; diff --git a/Gems/PhysX/Code/Source/System/PhysXSystem.h b/Gems/PhysX/Code/Source/System/PhysXSystem.h index bf815e31ce..04d23ad47d 100644 --- a/Gems/PhysX/Code/Source/System/PhysXSystem.h +++ b/Gems/PhysX/Code/Source/System/PhysXSystem.h @@ -16,11 +16,11 @@ #include #include #include -#include #include #include #include +#include #include #include @@ -41,6 +41,7 @@ namespace PhysX , private AzFramework::AssetCatalogEventBus::Handler { public: + AZ_CLASS_ALLOCATOR_DECL; AZ_RTTI(PhysXSystem, "{B6F4D92A-061B-4CB3-AAB5-984B599A53AE}", AzPhysics::SystemInterface); PhysXSystem(PhysXSettingsRegistryManager* registryManager, const physx::PxCookingParams& cookingParams); @@ -53,12 +54,14 @@ namespace PhysX void Simulate(float deltaTime) override; AzPhysics::SceneHandle AddScene(const AzPhysics::SceneConfiguration& config) override; AzPhysics::SceneHandleList AddScenes(const AzPhysics::SceneConfigurationList& configs) override; + AzPhysics::SceneHandle GetSceneHandle(const AZStd::string& sceneName) override; AzPhysics::Scene* GetScene(AzPhysics::SceneHandle handle) override; AzPhysics::SceneList GetScenes(const AzPhysics::SceneHandleList& handles) override; AzPhysics::SceneList& GetAllScenes() override; void RemoveScene(AzPhysics::SceneHandle handle) override; void RemoveScenes(const AzPhysics::SceneHandleList& handles) override; void RemoveAllScenes() override; + AZStd::pair FindAttachedBodyHandleFromEntityId(AZ::EntityId entityId) override; const AzPhysics::SystemConfiguration* GetConfiguration() const override; void UpdateConfiguration(const AzPhysics::SystemConfiguration* newConfig, bool forceReinitialization = false) override; void UpdateDefaultMaterialLibrary(const AZ::Data::Asset& materialLibrary) override; @@ -124,6 +127,7 @@ namespace PhysX Debug::PhysXDebug m_physXDebug; //! Handler for the PhysXDebug Interface. PhysXSettingsRegistryManager& m_registryManager; //! Handles all settings registry interactions. + PhysXSceneInterface m_sceneInterface; //! Implemented the Scene Az::Interface. class MaterialLibraryAssetHelper : private AZ::Data::AssetBus::Handler diff --git a/Gems/PhysX/Code/Source/SystemComponent.cpp b/Gems/PhysX/Code/Source/SystemComponent.cpp index 869b2e98ec..d1e46c847f 100644 --- a/Gems/PhysX/Code/Source/SystemComponent.cpp +++ b/Gems/PhysX/Code/Source/SystemComponent.cpp @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -49,8 +52,6 @@ namespace PhysX { - static const char* const DefaultWorldName = "PhysX Default"; - bool SystemComponent::VersionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) { @@ -284,17 +285,6 @@ namespace PhysX } #endif - // PhysXSystemComponentRequestBus interface implementation - physx::PxScene* SystemComponent::CreateScene(physx::PxSceneDesc& sceneDesc) - { -#ifdef PHYSX_ENABLE_MULTI_THREADING - sceneDesc.flags |= physx::PxSceneFlag::eREQUIRE_RW_LOCK; -#endif - //TEMP until this in moved over - sceneDesc.cpuDispatcher = m_physXSystem->GetPxCpuDispathcher(); - return m_physXSystem->GetPxPhysics()->createScene(sceneDesc); - } - physx::PxConvexMesh* SystemComponent::CreateConvexMesh(const void* vertices, AZ::u32 vertexNum, AZ::u32 vertexStride) { physx::PxConvexMeshDesc desc; @@ -383,16 +373,6 @@ namespace PhysX return m_physXSystem->GetPxPhysics()->createTriangleMesh(inpStream); } - AZStd::unique_ptr SystemComponent::CreateStaticRigidBody(const Physics::WorldBodyConfiguration& configuration) - { - return AZStd::make_unique(configuration); - } - - AZStd::unique_ptr SystemComponent::CreateRigidBody(const Physics::RigidBodyConfiguration& configuration) - { - return AZStd::make_unique(configuration); - } - AZStd::shared_ptr SystemComponent::CreateShape(const Physics::ColliderConfiguration& colliderConfiguration, const Physics::ShapeConfiguration& configuration) { auto shapePtr = AZStd::make_shared(colliderConfiguration, configuration); @@ -444,7 +424,7 @@ namespace PhysX } AZStd::shared_ptr SystemComponent::CreateJoint(const AZStd::shared_ptr& configuration, - Physics::WorldBody* parentBody, Physics::WorldBody* childBody) + AzPhysics::SimulatedBody* parentBody, AzPhysics::SimulatedBody* childBody) { return JointUtils::CreateJoint(configuration, parentBody, childBody); } @@ -534,21 +514,9 @@ namespace PhysX // Physics::CharacterSystemRequestBus AZStd::unique_ptr SystemComponent::CreateCharacter(const Physics::CharacterConfiguration& - characterConfig, const Physics::ShapeConfiguration& shapeConfig, Physics::World& world) + characterConfig, const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle& sceneHandle) { - return Utils::Characters::CreateCharacterController(characterConfig, shapeConfig, world); - } - - void SystemComponent::UpdateCharacters(Physics::World& world, float deltaTime) - { - if (auto physxWorld = azrtti_cast(&world)) - { - auto manager = physxWorld->GetOrCreateControllerManager(); - if (manager) - { - manager->computeInteractions(deltaTime); - } - } + return Utils::Characters::CreateCharacterController(characterConfig, shapeConfig, sceneHandle); } AzPhysics::CollisionLayer SystemComponent::GetCollisionLayerByName(const AZStd::string& layerName) @@ -605,11 +573,6 @@ namespace PhysX m_physXSystem->CreateCollisionGroup(groupName, group); } - AzPhysics::CollisionConfiguration SystemComponent::GetCollisionConfiguration() - { - return m_physXSystem->GetPhysXConfiguration().m_collisionConfig; - } - physx::PxFilterData SystemComponent::CreateFilterData(const AzPhysics::CollisionLayer& layer, const AzPhysics::CollisionGroup& group) { return PhysX::Collision::CreateFilterData(layer, group); @@ -701,10 +664,6 @@ namespace PhysX void SystemComponent::ActivatePhysXSystem() { - // Set Physics API constants to PhysX-friendly values - Physics::DefaultRigidBodyConfiguration::m_computeInertiaTensor = true; - Physics::DefaultRigidBodyConfiguration::m_sleepMinEnergy = 0.005f; - if (m_physXSystem = GetPhysXSystem()) { m_physXSystem->RegisterSystemInitializedEvent(m_onSystemInitializedHandler); diff --git a/Gems/PhysX/Code/Source/SystemComponent.h b/Gems/PhysX/Code/Source/SystemComponent.h index 64a30f784e..668f12e0c0 100644 --- a/Gems/PhysX/Code/Source/SystemComponent.h +++ b/Gems/PhysX/Code/Source/SystemComponent.h @@ -19,11 +19,10 @@ #include #include #include -#include +#include #include #include #include -#include #include #include #include @@ -35,12 +34,17 @@ #include #include #include -#include #include #ifdef PHYSX_EDITOR #include #endif +namespace AzPhysics +{ + struct StaticRigidBodyConfiguration; + struct RigidBodyConfiguration; + struct SimulatedBody; +} namespace PhysX { @@ -81,7 +85,6 @@ namespace PhysX SystemComponent(const SystemComponent&) = delete; // SystemRequestsBus - physx::PxScene* CreateScene(physx::PxSceneDesc& sceneDesc) override; physx::PxConvexMesh* CreateConvexMesh(const void* vertices, AZ::u32 vertexNum, AZ::u32 vertexStride) override; // should we use AZ::Vector3* or physx::PxVec3 here? physx::PxConvexMesh* CreateConvexMeshFromCooked(const void* cookedMeshData, AZ::u32 bufferSize) override; physx::PxTriangleMesh* CreateTriangleMeshFromCooked(const void* cookedMeshData, AZ::u32 bufferSize) override; @@ -104,8 +107,7 @@ namespace PhysX // Physics::CharacterSystemRequestBus virtual AZStd::unique_ptr CreateCharacter(const Physics::CharacterConfiguration& characterConfig, - const Physics::ShapeConfiguration& shapeConfig, Physics::World& world) override; - virtual void UpdateCharacters(Physics::World& world, float deltaTime) override; + const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle& sceneHandle) override; // CollisionRequestBus AzPhysics::CollisionLayer GetCollisionLayerByName(const AZStd::string& layerName) override; @@ -117,7 +119,6 @@ namespace PhysX AzPhysics::CollisionGroup GetCollisionGroupById(const AzPhysics::CollisionGroups::Id& groupId) override; void SetCollisionLayerName(int index, const AZStd::string& layerName) override; void CreateCollisionGroup(const AZStd::string& groupName, const AzPhysics::CollisionGroup& group) override; - AzPhysics::CollisionConfiguration GetCollisionConfiguration() override; // AZ::Component interface implementation void Init() override; @@ -132,8 +133,6 @@ namespace PhysX #endif // Physics::SystemRequestBus::Handler - AZStd::unique_ptr CreateStaticRigidBody(const Physics::WorldBodyConfiguration& configuration) override; - AZStd::unique_ptr CreateRigidBody(const Physics::RigidBodyConfiguration& configuration) override; AZStd::shared_ptr CreateShape(const Physics::ColliderConfiguration& colliderConfiguration, const Physics::ShapeConfiguration& configuration) override; AZStd::shared_ptr CreateMaterial(const Physics::MaterialConfiguration& materialConfiguration) override; AZStd::shared_ptr GetDefaultMaterial() override; @@ -142,7 +141,7 @@ namespace PhysX AZStd::vector GetSupportedJointTypes() override; AZStd::shared_ptr CreateJointLimitConfiguration(AZ::TypeId jointType) override; AZStd::shared_ptr CreateJoint(const AZStd::shared_ptr& configuration, - Physics::WorldBody* parentBody, Physics::WorldBody* childBody) override; + AzPhysics::SimulatedBody* parentBody, AzPhysics::SimulatedBody* childBody) override; void GenerateJointLimitVisualizationData( const Physics::JointLimitConfiguration& configuration, const AZ::Quaternion& parentRotation, diff --git a/Gems/PhysX/Code/Source/Utils.cpp b/Gems/PhysX/Code/Source/Utils.cpp index 0ba1b4615d..767f386b6f 100644 --- a/Gems/PhysX/Code/Source/Utils.cpp +++ b/Gems/PhysX/Code/Source/Utils.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -23,6 +24,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include @@ -42,7 +48,7 @@ namespace PhysX { namespace Utils { - physx::PxBase* CreateNativeMeshObjectFromCookedData(const AZStd::vector& cookedData, + physx::PxBase* CreateNativeMeshObjectFromCookedData(const AZStd::vector& cookedData, Physics::CookedMeshShapeConfiguration::MeshType meshType) { // PxDefaultMemoryInputData only accepts a non-const U8* pointer however keeps it as const U8* inside. @@ -129,7 +135,7 @@ namespace PhysX } case Physics::ShapeType::CookedMesh: { - const Physics::CookedMeshShapeConfiguration& cookedMeshShapeConfig = + const Physics::CookedMeshShapeConfiguration& cookedMeshShapeConfig = static_cast(shapeConfiguration); physx::PxBase* nativeMeshObject = nullptr; @@ -240,17 +246,26 @@ namespace PhysX return nullptr; } - World* GetDefaultWorld() + AzPhysics::Scene* GetDefaultScene() { - AZStd::shared_ptr world = nullptr; - Physics::DefaultWorldBus::BroadcastResult(world, &Physics::DefaultWorldRequests::GetDefaultWorld); - return static_cast(world.get()); + AzPhysics::SceneHandle sceneHandle; + Physics::DefaultWorldBus::BroadcastResult(sceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); + + if (auto* physicsSystem = AZ::Interface::Get()) + { + if (auto* scene = physicsSystem->GetScene(sceneHandle)) + { + return scene; + } + } + + return nullptr; } AZStd::optional CreatePxCookedMeshConfiguration(const AZStd::vector& points, const AZ::Vector3& scale) { Physics::CookedMeshShapeConfiguration shapeConfig; - + AZStd::vector cookedData; bool cookingResult = false; Physics::SystemRequestBus::BroadcastResult(cookingResult, &Physics::SystemRequests::CookConvexMeshToMemory, @@ -268,9 +283,108 @@ namespace PhysX return shapeConfig; } + bool IsPrimitiveShape(const Physics::ShapeConfiguration& shapeConfig) + { + const Physics::ShapeType shapeType = shapeConfig.GetShapeType(); + return + shapeType == Physics::ShapeType::Box || + shapeType == Physics::ShapeType::Capsule || + shapeType == Physics::ShapeType::Sphere; + } + + AZStd::optional CreateConvexFromPrimitive( + const Physics::ColliderConfiguration& colliderConfig, + const Physics::ShapeConfiguration& primitiveShapeConfig, AZ::u8 subdivisionLevel, + const AZ::Vector3& scale) + { + AZ::u8 subdivisionLevelClamped = AZ::GetClamp(subdivisionLevel, MinCapsuleSubdivisionLevel, MaxCapsuleSubdivisionLevel); + + auto applyColliderOffset = [&colliderConfig](const AZ::Vector3 point) { + return colliderConfig.m_rotation.TransformVector(point) + colliderConfig.m_position; + }; + + auto shapeType = primitiveShapeConfig.GetShapeType(); + switch (shapeType) + { + case Physics::ShapeType::Box: + { + auto boxConfig = static_cast(primitiveShapeConfig); + AZStd::vector points; + points.reserve(8); + const float x = 0.5f * boxConfig.m_dimensions.GetX(); + const float y = 0.5f * boxConfig.m_dimensions.GetY(); + const float z = 0.5f * boxConfig.m_dimensions.GetZ(); + points.push_back(applyColliderOffset(AZ::Vector3(-x, -y, -z))); + points.push_back(applyColliderOffset(AZ::Vector3(-x, -y, +z))); + points.push_back(applyColliderOffset(AZ::Vector3(-x, +y, -z))); + points.push_back(applyColliderOffset(AZ::Vector3(-x, +y, +z))); + points.push_back(applyColliderOffset(AZ::Vector3(+x, -y, -z))); + points.push_back(applyColliderOffset(AZ::Vector3(+x, -y, +z))); + points.push_back(applyColliderOffset(AZ::Vector3(+x, +y, -z))); + points.push_back(applyColliderOffset(AZ::Vector3(+x, +y, +z))); + return CreatePxCookedMeshConfiguration(points, scale); + } + break; + case Physics::ShapeType::Capsule: + { + auto capsuleConfig = static_cast(primitiveShapeConfig); + const AZ::u8 numLayers = subdivisionLevelClamped; + const AZ::u8 numPerLayer = 4 * subdivisionLevelClamped; + AZStd::vector points; + points.reserve(2 * numLayers * numPerLayer + 2); + points.push_back(applyColliderOffset(AZ::Vector3::CreateAxisZ(0.5f * capsuleConfig.m_height))); + points.push_back(applyColliderOffset(AZ::Vector3::CreateAxisZ(-0.5f * capsuleConfig.m_height))); + for (AZ::u8 layerIndex = 0; layerIndex < numLayers; layerIndex++) + { + const float theta = (layerIndex + 1) * AZ::Constants::HalfPi / aznumeric_cast(numLayers); + const float layerRadius = capsuleConfig.m_radius * AZ::Sin(theta); + const float layerHeight = 0.5f * capsuleConfig.m_height + capsuleConfig.m_radius * (AZ::Cos(theta) - 1.0f); + for (AZ::u8 radialIndex = 0; radialIndex < numPerLayer; radialIndex++) + { + const float phi = radialIndex * AZ::Constants::TwoPi / aznumeric_cast(numPerLayer); + points.push_back(applyColliderOffset(AZ::Vector3( + layerRadius * AZ::Cos(phi), layerRadius * AZ::Sin(phi), layerHeight))); + points.push_back(applyColliderOffset(AZ::Vector3( + layerRadius * AZ::Cos(phi), layerRadius * AZ::Sin(phi), -layerHeight))); + } + } + return CreatePxCookedMeshConfiguration(points, scale); + } + break; + case Physics::ShapeType::Sphere: + { + auto sphereConfig = static_cast(primitiveShapeConfig); + const AZ::u8 numLayers = 2 * subdivisionLevelClamped; + const AZ::u8 numPerLayer = 4 * subdivisionLevelClamped; + AZStd::vector points; + points.reserve((numLayers - 1) * numPerLayer + 2); + points.push_back(applyColliderOffset(AZ::Vector3::CreateAxisZ(sphereConfig.m_radius))); + points.push_back(applyColliderOffset(AZ::Vector3::CreateAxisZ(-sphereConfig.m_radius))); + + for (AZ::u8 layerIndex = 1; layerIndex < numLayers; layerIndex++) + { + const float theta = layerIndex * AZ::Constants::Pi / aznumeric_cast(numLayers); + const float layerRadius = sphereConfig.m_radius * AZ::Sin(theta); + const float layerHeight = sphereConfig.m_radius * AZ::Cos(theta); + for (AZ::u8 radialIndex = 0; radialIndex < numPerLayer; radialIndex++) + { + const float phi = radialIndex * AZ::Constants::TwoPi / aznumeric_cast(numPerLayer); + points.push_back(applyColliderOffset(AZ::Vector3( + layerRadius * AZ::Cos(phi), layerRadius * AZ::Sin(phi), layerHeight))); + } + } + return CreatePxCookedMeshConfiguration(points, scale); + } + break; + default: + AZ_Error("PhysX Utils", false, "CreateConvexFromPrimitive was called with a non-primitive shape configuration."); + return {}; + } + } + // Returns a point list of the frustum extents based on the supplied frustum parameters. AZStd::optional> CreatePointsAtFrustumExtents(float height, float bottomRadius, float topRadius, AZ::u8 subdivisions) - { + { AZStd::vector points; if (height <= 0.0f) @@ -300,7 +414,7 @@ namespace PhysX AZ_Error("PhysX", false, "Frustum subdivision count %u is not in [%u, %u] range", subdivisions, MinFrustumSubdivisions, MaxFrustumSubdivisions); return {}; } - + points.reserve(subdivisions * 2); const float halfHeight = height * 0.5f; const double step = AZ::Constants::TwoPi / aznumeric_cast(subdivisions); @@ -320,33 +434,33 @@ namespace PhysX AZStd::string ConvexCookingResultToString(physx::PxConvexMeshCookingResult::Enum convexCookingResultCode) { static const AZStd::string resultToString[] = { "eSUCCESS", "eZERO_AREA_TEST_FAILED", "ePOLYGONS_LIMIT_REACHED", "eFAILURE" }; -AZ_PUSH_DISABLE_WARNING(, "-Wtautological-constant-out-of-range-compare") - if (AZ_ARRAY_SIZE(resultToString) > convexCookingResultCode) -AZ_POP_DISABLE_WARNING - { - return resultToString[convexCookingResultCode]; - } - else - { - AZ_Error("PhysX", false, "Unknown convex cooking result code: %i", convexCookingResultCode); - return ""; - } + AZ_PUSH_DISABLE_WARNING(, "-Wtautological-constant-out-of-range-compare") + if (AZ_ARRAY_SIZE(resultToString) > convexCookingResultCode) + AZ_POP_DISABLE_WARNING + { + return resultToString[convexCookingResultCode]; + } + else + { + AZ_Error("PhysX", false, "Unknown convex cooking result code: %i", convexCookingResultCode); + return ""; + } } AZStd::string TriMeshCookingResultToString(physx::PxTriangleMeshCookingResult::Enum triangleCookingResultCode) { static const AZStd::string resultToString[] = { "eSUCCESS", "eLARGE_TRIANGLE", "eFAILURE" }; -AZ_PUSH_DISABLE_WARNING(, "-Wtautological-constant-out-of-range-compare") - if (AZ_ARRAY_SIZE(resultToString) > triangleCookingResultCode) -AZ_POP_DISABLE_WARNING - { - return resultToString[triangleCookingResultCode]; - } - else - { - AZ_Error("PhysX", false, "Unknown trimesh cooking result code: %i", triangleCookingResultCode); - return ""; - } + AZ_PUSH_DISABLE_WARNING(, "-Wtautological-constant-out-of-range-compare") + if (AZ_ARRAY_SIZE(resultToString) > triangleCookingResultCode) + AZ_POP_DISABLE_WARNING + { + return resultToString[triangleCookingResultCode]; + } + else + { + AZ_Error("PhysX", false, "Unknown trimesh cooking result code: %i", triangleCookingResultCode); + return ""; + } } bool WriteCookedMeshToFile(const AZStd::string& filePath, const AZStd::vector& physxData, @@ -393,7 +507,7 @@ AZ_POP_DISABLE_WARNING return result; } - bool CookTriangleMeshToToPxOutputStream(const AZ::Vector3* vertices, AZ::u32 vertexCount, + bool CookTriangleMeshToToPxOutputStream(const AZ::Vector3* vertices, AZ::u32 vertexCount, const AZ::u32* indices, AZ::u32 indexCount, physx::PxOutputStream& stream) { physx::PxCooking* cooking = nullptr; @@ -537,7 +651,7 @@ AZ_POP_DISABLE_WARNING AZStd::string ReplaceAll(AZStd::string str, const AZStd::string& fromString, const AZStd::string& toString) { size_t positionBegin = 0; - while ((positionBegin = str.find(fromString, positionBegin)) != AZStd::string::npos) + while ((positionBegin = str.find(fromString, positionBegin)) != AZStd::string::npos) { str.replace(positionBegin, fromString.length(), toString); positionBegin += toString.length(); @@ -582,7 +696,8 @@ AZ_POP_DISABLE_WARNING void ColliderPointsLocalToWorld(AZStd::vector& pointsInOut, const AZ::Transform& worldTransform, const AZ::Vector3& colliderRelativePosition, - const AZ::Quaternion& colliderRelativeRotation) + const AZ::Quaternion& colliderRelativeRotation, + const AZ::Vector3& nonUniformScale) { AZ::Transform transform = GetColliderWorldTransform(worldTransform, colliderRelativePosition, @@ -590,26 +705,29 @@ AZ_POP_DISABLE_WARNING for (AZ::Vector3& point : pointsInOut) { - point = transform.TransformPoint(point); + point = worldTransform.TransformPoint(nonUniformScale * + GetColliderLocalTransform(colliderRelativePosition, colliderRelativeRotation).TransformPoint(point)); } } AZ::Aabb GetPxGeometryAabb(const physx::PxGeometryHolder& geometryHolder, const AZ::Transform& worldTransform, const ::Physics::ColliderConfiguration& colliderConfiguration - ) + ) { const float boundsInflationFactor = 1.0f; + AZ::Transform overallTransformNoScale = GetColliderWorldTransform(worldTransform, + colliderConfiguration.m_position, colliderConfiguration.m_rotation); + overallTransformNoScale.ExtractScale(); const physx::PxBounds3 bounds = physx::PxGeometryQuery::getWorldBounds(geometryHolder.any(), - physx::PxTransform( - PxMathConvert(PhysX::Utils::GetColliderWorldTransform(worldTransform, - colliderConfiguration.m_position, - colliderConfiguration.m_rotation))), - boundsInflationFactor); + PxMathConvert(overallTransformNoScale), + boundsInflationFactor); return PxMathConvert(bounds); } AZ::Aabb GetColliderAabb(const AZ::Transform& worldTransform, + bool hasNonUniformScale, + AZ::u8 subdivisionLevel, const ::Physics::ShapeConfiguration& shapeConfiguration, const ::Physics::ColliderConfiguration& colliderConfiguration) { @@ -619,9 +737,26 @@ AZ_POP_DISABLE_WARNING if (!isAssetShape) { - if (CreatePxGeometryFromConfig(shapeConfiguration, geometryHolder)) + if (!hasNonUniformScale) { - return GetPxGeometryAabb(geometryHolder, worldTransform, colliderConfiguration); + if (CreatePxGeometryFromConfig(shapeConfiguration, geometryHolder)) + { + return GetPxGeometryAabb(geometryHolder, worldTransform, colliderConfiguration); + } + } + else + { + auto convexPrimitive = Utils::CreateConvexFromPrimitive(colliderConfiguration, shapeConfiguration, subdivisionLevel, shapeConfiguration.m_scale); + if (convexPrimitive.has_value()) + { + if (CreatePxGeometryFromConfig(convexPrimitive.value(), geometryHolder)) + { + Physics::ColliderConfiguration colliderConfigurationNoOffset = colliderConfiguration; + colliderConfigurationNoOffset.m_rotation = AZ::Quaternion::CreateIdentity(); + colliderConfigurationNoOffset.m_position = AZ::Vector3::CreateZero(); + return GetPxGeometryAabb(geometryHolder, worldTransform, colliderConfigurationNoOffset); + } + } } return worldPosAabb; } @@ -638,6 +773,8 @@ AZ_POP_DISABLE_WARNING Physics::ShapeConfigurationList colliderShapes; GetColliderShapeConfigsFromAsset(physicsAssetConfig, colliderConfiguration, + hasNonUniformScale, + subdivisionLevel, colliderShapes); if (colliderShapes.empty()) @@ -652,7 +789,7 @@ AZ_POP_DISABLE_WARNING CreatePxGeometryFromConfig(*colliderShape.second, geometryHolder)) { aabb.AddAabb( - GetPxGeometryAabb(geometryHolder, worldTransform, colliderConfiguration) + GetPxGeometryAabb(geometryHolder, worldTransform, *colliderShape.first) ); } else @@ -674,8 +811,8 @@ AZ_POP_DISABLE_WARNING } void GetColliderShapeConfigsFromAsset(const Physics::PhysicsAssetShapeConfiguration& assetConfiguration, - const Physics::ColliderConfiguration& originalColliderConfiguration, - Physics::ShapeConfigurationList& resultingColliderShapes) + const Physics::ColliderConfiguration& originalColliderConfiguration, bool hasNonUniformScale, + AZ::u8 subdivisionLevel, Physics::ShapeConfigurationList& resultingColliderShapes) { if (!assetConfiguration.m_asset.IsReady()) { @@ -699,24 +836,24 @@ AZ_POP_DISABLE_WARNING const Pipeline::MeshAssetData& assetData = asset->m_assetData; const Pipeline::MeshAssetData::ShapeConfigurationList& shapeConfigList = assetData.m_colliderShapes; - + resultingColliderShapes.reserve(resultingColliderShapes.size() + shapeConfigList.size()); for (size_t shapeIndex = 0; shapeIndex < shapeConfigList.size(); shapeIndex++) { const Pipeline::MeshAssetData::ShapeConfigurationPair& shapeConfigPair = shapeConfigList[shapeIndex]; - AZStd::shared_ptr thisColliderConfiguration = + AZStd::shared_ptr thisColliderConfiguration = AZStd::make_shared(originalColliderConfiguration); AZ::u16 shapeMaterialIndex = assetData.m_materialIndexPerShape[shapeIndex]; // Triangle meshes have material indices cooked in the data. - if(shapeMaterialIndex != Pipeline::MeshAssetData::TriangleMeshMaterialIndex) + if (shapeMaterialIndex != Pipeline::MeshAssetData::TriangleMeshMaterialIndex) { // Clear the materials that came in from the component collider configuration thisColliderConfiguration->m_materialSelection.SetMaterialSlots({}); - + // Set the material that is relevant for this specific shape Physics::MaterialId assignedMaterialForShape = originalColliderConfiguration.m_materialSelection.GetMaterialId(shapeMaterialIndex); @@ -733,16 +870,35 @@ AZ_POP_DISABLE_WARNING AZStd::shared_ptr thisShapeConfiguration = shapeConfigPair.second; thisShapeConfiguration->m_scale = assetConfiguration.m_scale * assetConfiguration.m_assetScale; - resultingColliderShapes.emplace_back(thisColliderConfiguration, thisShapeConfiguration); + // If the shape is a primitive and there is non-uniform scale, replace it with a convex approximation + if (hasNonUniformScale && Utils::IsPrimitiveShape(*thisShapeConfiguration)) + { + auto scaledPrimitive = Utils::CreateConvexFromPrimitive(*thisColliderConfiguration, + *thisShapeConfiguration, subdivisionLevel, thisShapeConfiguration->m_scale); + if (scaledPrimitive.has_value()) + { + thisShapeConfiguration = AZStd::make_shared(scaledPrimitive.value()); + physx::PxGeometryHolder pxGeometryHolder; + CreatePxGeometryFromConfig(*thisShapeConfiguration, pxGeometryHolder); + thisColliderConfiguration->m_rotation = AZ::Quaternion::CreateIdentity(); + thisColliderConfiguration->m_position = AZ::Vector3::CreateZero(); + resultingColliderShapes.emplace_back(thisColliderConfiguration, thisShapeConfiguration); + } + } + else + { + resultingColliderShapes.emplace_back(thisColliderConfiguration, thisShapeConfiguration); + } } } void GetShapesFromAsset(const Physics::PhysicsAssetShapeConfiguration& assetConfiguration, - const Physics::ColliderConfiguration& originalColliderConfiguration, - AZStd::vector>& resultingShapes) + const Physics::ColliderConfiguration& originalColliderConfiguration, bool hasNonUniformScale, + AZ::u8 subdivisionLevel, AZStd::vector>& resultingShapes) { Physics::ShapeConfigurationList resultingColliderShapeConfigs; - GetColliderShapeConfigsFromAsset(assetConfiguration, originalColliderConfiguration, resultingColliderShapeConfigs); + GetColliderShapeConfigsFromAsset(assetConfiguration, originalColliderConfiguration, + hasNonUniformScale, subdivisionLevel, resultingColliderShapeConfigs); resultingShapes.reserve(resultingShapes.size() + resultingColliderShapeConfigs.size()); @@ -752,7 +908,7 @@ AZ_POP_DISABLE_WARNING shapeConfigPair.first->m_position *= shapeConfigPair.second->m_scale; AZStd::shared_ptr shape; - Physics::SystemRequestBus::BroadcastResult(shape, &Physics::SystemRequests::CreateShape, + Physics::SystemRequestBus::BroadcastResult(shape, &Physics::SystemRequests::CreateShape, *shapeConfigPair.first, *shapeConfigPair.second); if (shape) @@ -762,7 +918,7 @@ AZ_POP_DISABLE_WARNING } } - AZ::Vector3 GetNonUniformScale(AZ::EntityId entityId) + AZ::Vector3 GetTransformScale(AZ::EntityId entityId) { AZ::Vector3 worldScale = AZ::Vector3::CreateOne(); AZ::TransformBus::EventResult(worldScale, entityId, &AZ::TransformBus::Events::GetWorldScale); @@ -771,10 +927,22 @@ AZ_POP_DISABLE_WARNING AZ::Vector3 GetUniformScale(AZ::EntityId entityId) { - const float uniformScale = GetNonUniformScale(entityId).GetMaxElement(); + const float uniformScale = GetTransformScale(entityId).GetMaxElement(); return AZ::Vector3(uniformScale); } + AZ::Vector3 GetNonUniformScale(AZ::EntityId entityId) + { + AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, entityId, &AZ::NonUniformScaleRequests::GetScale); + return nonUniformScale; + } + + AZ::Vector3 GetOverallScale(AZ::EntityId entityId) + { + return GetUniformScale(entityId) * GetNonUniformScale(entityId); + } + const AZ::Vector3& Sanitize(const AZ::Vector3& input, const AZ::Vector3& defaultValue) { if (!input.IsFinite()) @@ -931,8 +1099,8 @@ AZ_POP_DISABLE_WARNING const float phiFactor = 1.f / aznumeric_cast(slices - 1) * AZ::Constants::TwoPi; // bottom cap - vertices.push_back(base + AZ::Vector3(0.f,0.f,-radius)); - for (size_t stack = 1; stack <= midStack ; ++stack) + vertices.push_back(base + AZ::Vector3(0.f, 0.f, -radius)); + for (size_t stack = 1; stack <= midStack; ++stack) { for (size_t i = 0; i < slices; ++i) { @@ -950,7 +1118,7 @@ AZ_POP_DISABLE_WARNING } // top cap - for (size_t stack = midStack; stack < topStack ; ++stack) + for (size_t stack = midStack; stack < topStack; ++stack) { for (size_t i = 0; i < slices; ++i) { @@ -966,7 +1134,7 @@ AZ_POP_DISABLE_WARNING vertices.push_back(top + AZ::Vector3(sinTheta * cosPhi * radius, sinTheta * sinPhi * radius, -cosTheta * radius)); } } - vertices.push_back(top + AZ::Vector3(0.f,0.f,radius)); + vertices.push_back(top + AZ::Vector3(0.f, 0.f, radius)); const AZ::u32 lastVertex = aznumeric_cast(vertices.size()) - 1; const AZ::u32 topRow = aznumeric_cast(vertices.size()) - slices - 1; @@ -1070,7 +1238,7 @@ AZ_POP_DISABLE_WARNING { const physx::PxHeightFieldSample& pxSample = geometry.heightField->getSample(y, x); - if (pxSample.materialIndex0 == physx::PxHeightFieldMaterial::eHOLE || + if (pxSample.materialIndex0 == physx::PxHeightFieldMaterial::eHOLE || pxSample.materialIndex1 == physx::PxHeightFieldMaterial::eHOLE) { // skip terrain geometry marked as eHOLE, this feature is often used for tunnels @@ -1195,26 +1363,6 @@ AZ_POP_DISABLE_WARNING } } // namespace Geometry - namespace RayCast - { - Physics::RayCastHit ClosestRayHitAgainstShapes(const Physics::RayCastRequest& request, - const AZStd::vector>& shapes, const AZ::Transform& parentTransform) - { - Physics::RayCastHit closestHit; - float closestHitDist = FLT_MAX; - for (int i = 0; i < shapes.size(); ++i) - { - Physics::RayCastHit hit = shapes[i]->RayCast(request, parentTransform); - if (hit && hit.m_distance < closestHitDist) - { - closestHit = hit; - closestHitDist = hit.m_distance; - } - } - return closestHit; - } - } // namespace RayCast - AZ::Transform GetEntityWorldTransformWithScale(AZ::EntityId entityId) { AZ::Transform worldTransformWithoutScale = AZ::Transform::CreateIdentity(); @@ -1319,12 +1467,29 @@ AZ_POP_DISABLE_WARNING namespace PxActorFactories { - physx::PxRigidDynamic* CreatePxRigidBody(const Physics::RigidBodyConfiguration& configuration) + constexpr auto PxActorDestructor = [](physx::PxActor* actor) + { + if (!actor) + { + return; + } + + if (auto* userData = Utils::GetUserData(actor)) + { + userData->Invalidate(); + } + + actor->release(); + }; + + AZStd::shared_ptr CreatePxRigidBody(const AzPhysics::RigidBodyConfiguration& configuration) { physx::PxTransform pxTransform(PxMathConvert(configuration.m_position), PxMathConvert(configuration.m_orientation).getNormalized()); - physx::PxRigidDynamic* rigidDynamic = PxGetPhysics().createRigidDynamic(pxTransform); + auto rigidDynamic = AZStd::shared_ptr( + PxGetPhysics().createRigidDynamic(pxTransform), + PxActorDestructor); if (!rigidDynamic) { @@ -1341,37 +1506,26 @@ AZ_POP_DISABLE_WARNING rigidDynamic->setCMassLocalPose(physx::PxTransform(PxMathConvert(configuration.m_centerOfMassOffset))); rigidDynamic->setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, configuration.m_kinematic); rigidDynamic->setMaxAngularVelocity(configuration.m_maxAngularVelocity); + return rigidDynamic; } - physx::PxRigidStatic* CreatePxStaticRigidBody(const Physics::WorldBodyConfiguration& configuration) + AZStd::shared_ptr CreatePxStaticRigidBody(const AzPhysics::StaticRigidBodyConfiguration& configuration) { physx::PxTransform pxTransform(PxMathConvert(configuration.m_position), PxMathConvert(configuration.m_orientation).getNormalized()); - physx::PxRigidStatic* rigidStatic = PxGetPhysics().createRigidStatic(pxTransform); - return rigidStatic; - } - void ReleaseActor(physx::PxActor* actor) - { - if (!actor) - { - return; - } + auto rigidStatic = AZStd::shared_ptr( + PxGetPhysics().createRigidStatic(pxTransform), + PxActorDestructor); - physx::PxScene* scene = actor->getScene(); - if (scene) + if (!rigidStatic) { - PHYSX_SCENE_WRITE_LOCK(scene); - scene->removeActor(*actor); - } - - if (auto userData = Utils::GetUserData(actor)) - { - userData->Invalidate(); + AZ_Error("PhysX Static Rigid Body", false, "Failed to create PhysX static rigid actor. Name: %s", configuration.m_debugName.c_str()); + return nullptr; } - actor->release(); + return rigidStatic; } } // namespace PxActorFactories @@ -1383,16 +1537,16 @@ AZ_POP_DISABLE_WARNING return AZStd::any_of(components.begin(), components.end(), [service](const AZ::Component* component) -> bool - { - AZ::ComponentDescriptor* componentDescriptor = nullptr; - AZ::ComponentDescriptorBus::EventResult( - componentDescriptor, azrtti_typeid(component), &AZ::ComponentDescriptorBus::Events::GetDescriptor); + { + AZ::ComponentDescriptor* componentDescriptor = nullptr; + AZ::ComponentDescriptorBus::EventResult( + componentDescriptor, azrtti_typeid(component), &AZ::ComponentDescriptorBus::Events::GetDescriptor); - AZ::ComponentDescriptor::DependencyArrayType services; - componentDescriptor->GetDependentServices(services, nullptr); + AZ::ComponentDescriptor::DependencyArrayType services; + componentDescriptor->GetDependentServices(services, nullptr); - return AZStd::find(services.begin(), services.end(), service) != services.end(); - } + return AZStd::find(services.begin(), services.end(), service) != services.end(); + } ); } diff --git a/Gems/PhysX/Code/Source/Utils.h b/Gems/PhysX/Code/Source/Utils.h index c66bf4baff..2a8329b267 100644 --- a/Gems/PhysX/Code/Source/Utils.h +++ b/Gems/PhysX/Code/Source/Utils.h @@ -27,6 +27,10 @@ namespace AzPhysics { class CollisionGroup; + struct RigidBodyConfiguration; + struct StaticRigidBodyConfiguration; + struct StaticRigidBody; + class Scene; } namespace Physics @@ -34,16 +38,10 @@ namespace Physics class RigidBodyConfiguration; class ColliderConfiguration; class ShapeConfiguration; - class RigidBodyConfiguration; - class WorldBodyConfiguration; - class RigidBodyStatic; } namespace PhysX { - class World; - - class Shape; class ActorData; class Material; @@ -64,7 +62,7 @@ namespace PhysX AzPhysics::CollisionGroup& assignedCollisionGroup ); - World* GetDefaultWorld(); + AzPhysics::Scene* GetDefaultScene(); //! Creates a PhysX cooked mesh config from the given points. //! @@ -74,6 +72,21 @@ namespace PhysX //! AZStd::optional CreatePxCookedMeshConfiguration(const AZStd::vector& pointList, const AZ::Vector3& scale); + //! Returns whether a shape configuration describes a primitive shape such as a box or sphere, as opposed to mesh geometry. + bool IsPrimitiveShape(const Physics::ShapeConfiguration& shapeConfig); + + //! Minimum and maximum values for the level of subdivision used when approximating capsules and spheres with convex meshes. + //! The maximum value is chosen so that the number of faces and vertices generated by CreateConvexFromPrimitive will be within + //! the limit imposed by PhysX (255). + //! @{ + constexpr AZ::u8 MinCapsuleSubdivisionLevel = 1; + constexpr AZ::u8 MaxCapsuleSubdivisionLevel = 5; + //! @} + + AZStd::optional CreateConvexFromPrimitive( + const Physics::ColliderConfiguration& colliderConfig, + const Physics::ShapeConfiguration& primitiveShapeConfig, AZ::u8 subdivisionLevel, const AZ::Vector3& scale); + // 255 is the hard limit for PhysX number of vertices/faces. Upper bound is set to something sensible and less than this hard limit. constexpr AZ::u8 MinFrustumSubdivisions = 3; constexpr AZ::u8 MaxFrustumSubdivisions = 125; @@ -105,7 +118,7 @@ namespace PhysX void GetMaterialList( AZStd::vector& pxMaterials, const AZStd::vector& materialIndexMapping, const Physics::TerrainMaterialSurfaceIdMap& terrainMaterialsToSurfaceIds); - /// Returns all connected busIds of the specified type. + //! Returns all connected busIds of the specified type. template AZStd::vector FindConnectedBusIds() { @@ -118,10 +131,10 @@ namespace PhysX return busIds; } - /// Logs a warning message using the names of the entities provided. + //! Logs a warning message using the names of the entities provided. void WarnEntityNames(const AZStd::vector& entityIds, const char* category, const char* message); - /// Logs a warning if there is more than one connected bus of the particular type. + //! Logs a warning if there is more than one connected bus of the particular type. template void LogWarningIfMultipleComponents(const char* messageCategroy, const char* messageFormat) { @@ -132,112 +145,114 @@ namespace PhysX } } - /// Converts collider position and orientation offsets to a transform. + //! Converts collider position and orientation offsets to a transform. AZ::Transform GetColliderLocalTransform(const AZ::Vector3& colliderRelativePosition , const AZ::Quaternion& colliderRelativeRotation); - /// Combines collider position and orientation offsets and world transform to a transform. + //! Combines collider position and orientation offsets and world transform to a transform. AZ::Transform GetColliderWorldTransform(const AZ::Transform& worldTransform , const AZ::Vector3& colliderRelativePosition , const AZ::Quaternion& colliderRelativeRotation); - /// Converts points in a collider's local space to world space positions - /// accounting for collider position and orientation offsets. + //! Converts points in a collider's local space to world space positions + //! accounting for collider position and orientation offsets. void ColliderPointsLocalToWorld(AZStd::vector& pointsInOut , const AZ::Transform& worldTransform , const AZ::Vector3& colliderRelativePosition - , const AZ::Quaternion& colliderRelativeRotation); + , const AZ::Quaternion& colliderRelativeRotation + , const AZ::Vector3& nonUniformScale); - /// Returns AABB of collider by constructing PxGeometry from collider and shape configuration, - /// and invoking physx::PxGeometryQuery::getWorldBounds. - /// This function is used only by editor components. + //! Returns AABB of collider by constructing PxGeometry from collider and shape configuration, + //! and invoking physx::PxGeometryQuery::getWorldBounds. + //! This function is used only by editor components. AZ::Aabb GetColliderAabb(const AZ::Transform& worldTransform + , bool hasNonUniformScale + , AZ::u8 subdivisionLevel , const ::Physics::ShapeConfiguration& shapeConfiguration , const ::Physics::ColliderConfiguration& colliderConfiguration); bool TriggerColliderExists(AZ::EntityId entityId); void GetShapesFromAsset(const Physics::PhysicsAssetShapeConfiguration& assetConfiguration, - const Physics::ColliderConfiguration& originalColliderConfiguration, - AZStd::vector>& resultingShapes); + const Physics::ColliderConfiguration& originalColliderConfiguration, bool hasNonUniformScale, + AZ::u8 subdivisionLevel, AZStd::vector>& resultingShapes); void GetColliderShapeConfigsFromAsset(const Physics::PhysicsAssetShapeConfiguration& assetConfiguration, const Physics::ColliderConfiguration& originalColliderConfiguration, - Physics::ShapeConfigurationList& resultingColliderShapes); + bool hasNonUniformScale, AZ::u8 subdivisionLevel, Physics::ShapeConfigurationList& resultingColliderShapes); - AZ::Vector3 GetNonUniformScale(AZ::EntityId entityId); + //! Gets the scale from the entity's Transform component. + AZ::Vector3 GetTransformScale(AZ::EntityId entityId); + //! Returns a vector scale with each element equal to the max element from the entity's Transform component. AZ::Vector3 GetUniformScale(AZ::EntityId entityId); + //! Gets the scale from the entity's Non-Uniform Scale component, if it is present. + //! Otherwise (1, 1, 1) is returned. + AZ::Vector3 GetNonUniformScale(AZ::EntityId entityId); + //! Gets the overall scale, taking into account the scale from both the entity's Transform component and the + //! Non-Uniform Scale component, if it is present. + AZ::Vector3 GetOverallScale(AZ::EntityId entityId); - /// Returns defaultValue if the input is infinite or NaN, otherwise returns the input unchanged. + //! Returns defaultValue if the input is infinite or NaN, otherwise returns the input unchanged. const AZ::Vector3& Sanitize(const AZ::Vector3& input, const AZ::Vector3& defaultValue = AZ::Vector3::CreateZero()); namespace Geometry { using PointList = AZStd::vector; - /// Generates a list of points on a box. + //! Generates a list of points on a box. PointList GenerateBoxPoints(const AZ::Vector3& min, const AZ::Vector3& max); - /// Generates a list of points on the surface of a sphere. + //! Generates a list of points on the surface of a sphere. PointList GenerateSpherePoints(float radius); - /// Generates a list of points on the surface of a cylinder. + //! Generates a list of points on the surface of a cylinder. PointList GenerateCylinderPoints(float height, float radius); - /// Generates vertices and indices representing the provided box geometry + //! Generates vertices and indices representing the provided box geometry void GetBoxGeometry(const physx::PxBoxGeometry& geometry, AZStd::vector& vertices, AZStd::vector& indices); - /// Generates vertices and indices representing the provided capsule geometry + //! Generates vertices and indices representing the provided capsule geometry void GetCapsuleGeometry(const physx::PxCapsuleGeometry& geometry, AZStd::vector& vertices, AZStd::vector& indices, const AZ::u32 stacks, const AZ::u32 slices); - /// Generates vertices and indices representing the provided convex mesh geometry + //! Generates vertices and indices representing the provided convex mesh geometry void GetConvexMeshGeometry(const physx::PxConvexMeshGeometry& geometry, AZStd::vector& vertices, AZStd::vector& indices); - /// Generates vertices and indices representing the provided heightfield geometry, optionally limited to a bounding box + //! Generates vertices and indices representing the provided heightfield geometry, optionally limited to a bounding box void GetHeightFieldGeometry(const physx::PxHeightFieldGeometry& geometry, AZStd::vector& vertices, AZStd::vector& indices, AZ::Aabb* optionalBounds); - /// Generates vertices and indices representing the provided sphere geometry and optional stacks and slices + //! Generates vertices and indices representing the provided sphere geometry and optional stacks and slices void GetSphereGeometry(const physx::PxSphereGeometry& geometry, AZStd::vector& vertices, AZStd::vector& indices, const AZ::u32 stacks, const AZ::u32 slices); - /// Generates vertices and indices representing the provided triangle mesh geometry + //! Generates vertices and indices representing the provided triangle mesh geometry void GetTriangleMeshGeometry(const physx::PxTriangleMeshGeometry& geometry, AZStd::vector& vertices, AZStd::vector& indices); } // namespace Geometry - namespace RayCast - { - Physics::RayCastHit ClosestRayHitAgainstShapes(const Physics::RayCastRequest& request, - const AZStd::vector>& shapes, const AZ::Transform& parentTransform); - } // namespace RayCast - - - /// Returns the World transform of an entity with scale. - /// This can be used if ComputeJointLocalTransform will be invoked with the result as an argument since ComputeJointLocalTransform will remove scale. + //! Returns the World transform of an entity with scale. + //! This can be used if ComputeJointLocalTransform will be invoked with the result as an argument since ComputeJointLocalTransform will remove scale. AZ::Transform GetEntityWorldTransformWithScale(AZ::EntityId entityId); - /// Returns the World transform of an entity without scale. + //! Returns the World transform of an entity without scale. AZ::Transform GetEntityWorldTransformWithoutScale(AZ::EntityId entityId); - /// Computes the local transform of joint from an entity given the joint's world transform and the entity's world transform. + //! Computes the local transform of joint from an entity given the joint's world transform and the entity's world transform. AZ::Transform ComputeJointLocalTransform(const AZ::Transform& jointWorldTransform, const AZ::Transform& entityWorldTransform); - /// Computes the world transform of joint given the joint's local transform from an entity and the entity's world transform. + //! Computes the world transform of joint given the joint's local transform from an entity and the entity's world transform. AZ::Transform ComputeJointWorldTransform(const AZ::Transform& jointLocalTransform, const AZ::Transform& entityWorldTransform); } // namespace Utils namespace ReflectionUtils { - /// Reflect API specific to PhysX physics. Generic physics API should be reflected in Physics::ReflectionUtils::ReflectPhysicsApi. + //! Reflect API specific to PhysX physics. Generic physics API should be reflected in Physics::ReflectionUtils::ReflectPhysicsApi. void ReflectPhysXOnlyApi(AZ::ReflectContext* context); } // namespace ReflectionUtils namespace PxActorFactories { - physx::PxRigidDynamic* CreatePxRigidBody(const Physics::RigidBodyConfiguration& configuration); - physx::PxRigidStatic* CreatePxStaticRigidBody(const Physics::WorldBodyConfiguration& configuration); - - void ReleaseActor(physx::PxActor* actor); + AZStd::shared_ptr CreatePxRigidBody(const AzPhysics::RigidBodyConfiguration& configuration); + AZStd::shared_ptr CreatePxStaticRigidBody(const AzPhysics::StaticRigidBodyConfiguration& configuration); } // namespace PxActorFactories namespace StaticRigidBodyUtils diff --git a/Gems/PhysX/Code/Source/World.cpp b/Gems/PhysX/Code/Source/World.cpp deleted file mode 100644 index a0813b1d03..0000000000 --- a/Gems/PhysX/Code/Source/World.cpp +++ /dev/null @@ -1,1119 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -namespace PhysX -{ - /*static*/ thread_local AZStd::vector World::s_raycastBuffer; - /*static*/ thread_local AZStd::vector World::s_sweepBuffer; - /*static*/ thread_local AZStd::vector World::s_overlapBuffer; - - // Helper function to convert AZ hit type to PhysX one. - static physx::PxQueryHitType::Enum GetPxHitType(Physics::QueryHitType hitType) - { - static_assert(static_cast(Physics::QueryHitType::None) == static_cast(physx::PxQueryHitType::eNONE) && - static_cast(Physics::QueryHitType::Touch) == static_cast(physx::PxQueryHitType::eTOUCH) && - static_cast(Physics::QueryHitType::Block) == static_cast(physx::PxQueryHitType::eBLOCK), - "PhysX hit types do not match QueryHitTypes"); - return static_cast(hitType); - } - - //Helper class, responsible for filtering invalid collision candidates prior to more expensive narrow phase checks - class PhysXQueryFilterCallback - : public physx::PxQueryFilterCallback - { - public: - explicit PhysXQueryFilterCallback(const AzPhysics::CollisionGroup& collisionGroup, Physics::FilterCallback filterCallback, physx::PxQueryHitType::Enum hitType) - : m_filterCallback(AZStd::move(filterCallback)) - , m_collisionGroup(collisionGroup) - , m_hitType(hitType) - { - } - - //Performs game specific entity filtering - physx::PxQueryHitType::Enum preFilter([[maybe_unused]] const physx::PxFilterData& queryFilterData, const physx::PxShape* pxShape, - const physx::PxRigidActor* actor, [[maybe_unused]] physx::PxHitFlags& queryTypes) override - { - auto shapeFilterData = pxShape->getQueryFilterData(); - - if (m_collisionGroup.GetMask() & Collision::Combine(shapeFilterData.word0, shapeFilterData.word1)) - { - if (m_filterCallback) - { - auto userData = Utils::GetUserData(actor); - auto shape = Utils::GetUserData(pxShape); - if (userData != nullptr && userData->GetEntityId().IsValid()) - { - return GetPxHitType(m_filterCallback(userData->GetWorldBody(), shape)); - } - } - else - { - return m_hitType; - } - } - return physx::PxQueryHitType::eNONE; - } - - // Unused, we're only prefiltering at this time - physx::PxQueryHitType::Enum postFilter(const physx::PxFilterData&, const physx::PxQueryHit&) override - { - return physx::PxQueryHitType::eNONE; - } - - private: - Physics::FilterCallback m_filterCallback; - AzPhysics::CollisionGroup m_collisionGroup; - physx::PxQueryHitType::Enum m_hitType; - }; - - World::World(AZ::Crc32 id, const Physics::WorldConfiguration& settings) - : m_worldId(id) - , m_maxDeltaTime(settings.m_maxTimeStep) - , m_fixedDeltaTime(settings.m_fixedTimeStep) - , m_maxRaycastBufferSize(settings.m_raycastBufferSize) - , m_maxSweepBufferSize(settings.m_sweepBufferSize) - , m_maxOverlapBufferSize(settings.m_overlapBufferSize) - { - Physics::WorldRequestBus::Handler::BusConnect(id); - - physx::PxTolerancesScale tolerancesScale = physx::PxTolerancesScale(); - physx::PxSceneDesc sceneDesc(tolerancesScale); - sceneDesc.gravity = PxMathConvert(settings.m_gravity); - if (settings.m_enableCcd) - { - sceneDesc.flags |= physx::PxSceneFlag::eENABLE_CCD; - sceneDesc.filterShader = Collision::DefaultFilterShaderCCD; - sceneDesc.ccdMaxPasses = settings.m_maxCcdPasses; - if (settings.m_enableCcdResweep) - { - sceneDesc.flags.clear(physx::PxSceneFlag::eDISABLE_CCD_RESWEEP); - } - else - { - sceneDesc.flags.set(physx::PxSceneFlag::eDISABLE_CCD_RESWEEP); - } - } - else - { - sceneDesc.filterShader = Collision::DefaultFilterShader; - } - - if (settings.m_enableActiveActors) - { - sceneDesc.flags |= physx::PxSceneFlag::eENABLE_ACTIVE_ACTORS; - } - - if (settings.m_enablePcm) - { - sceneDesc.flags |= physx::PxSceneFlag::eENABLE_PCM; - } - else - { - sceneDesc.flags &= ~physx::PxSceneFlag::eENABLE_PCM; - } - - if (settings.m_kinematicFiltering) - { - sceneDesc.kineKineFilteringMode = physx::PxPairFilteringMode::eKEEP; - } - - if (settings.m_kinematicStaticFiltering) - { - sceneDesc.staticKineFilteringMode = physx::PxPairFilteringMode::eKEEP; - } - - sceneDesc.bounceThresholdVelocity = settings.m_bounceThresholdVelocity; - - sceneDesc.filterCallback = this; -#ifdef ENABLE_TGS_SOLVER - // Use Temporal Gauss-Seidel solver by default - sceneDesc.solverType = physx::PxSolverType::eTGS; -#endif - SystemRequestsBus::BroadcastResult(m_world, &SystemRequests::CreateScene, sceneDesc); - m_world->userData = this; - - physx::PxPvdSceneClient* pvdClient = m_world->getScenePvdClient(); - if (pvdClient) - { - pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_CONSTRAINTS, true); - pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_CONTACTS, true); - pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_SCENEQUERIES, true); - } - - World::s_raycastBuffer = {}; - World::s_sweepBuffer = {}; - World::s_overlapBuffer = {}; - - Physics::SystemNotificationBus::Broadcast(&Physics::SystemNotificationBus::Events::OnWorldCreated, this); - } - - World::~World() - { - Physics::WorldRequestBus::Handler::BusDisconnect(); - m_deferredDeletions.clear(); - Physics::SystemNotificationBus::Broadcast(&Physics::SystemNotificationBus::Events::OnPreWorldDestroy, this); - if (m_controllerManager) - { - m_controllerManager->release(); - m_controllerManager = nullptr; - } - if (m_world) - { - m_world->release(); - m_world = nullptr; - } - } - - physx::PxControllerManager* World::GetOrCreateControllerManager() - { - if (m_controllerManager) - { - return m_controllerManager; - } - - if (m_world) - { - m_controllerManager = PxCreateControllerManager(*m_world); - } - - if (m_controllerManager) - { - m_controllerManager->setOverlapRecoveryModule(true); - } - else - { - AZ_Error("PhysX Character Controller System", false, "Unable to create a Controller Manager."); - } - - return m_controllerManager; - } - - static physx::PxQueryFlags GetPxQueryFlags(const Physics::QueryType& queryType) - { - physx::PxQueryFlags queryFlags = physx::PxQueryFlag::ePREFILTER; - switch (queryType) - { - case Physics::QueryType::StaticAndDynamic: - queryFlags |= physx::PxQueryFlag::eSTATIC | physx::PxQueryFlag::eDYNAMIC; - break; - case Physics::QueryType::Dynamic: - queryFlags |= physx::PxQueryFlag::eDYNAMIC; - break; - case Physics::QueryType::Static: - queryFlags |= physx::PxQueryFlag::eSTATIC; - break; - default: - AZ_Warning("Physics::World", false, "Unhandled queryType"); - break; - } - return queryFlags; - } - - // Helper function to make the filter callback always return Block unless the result is None. - // This is needed for queries where we only need the single closest result. - static Physics::FilterCallback GetBlockFilterCallback(const Physics::FilterCallback& filterCallback) - { - if (!filterCallback) - { - return nullptr; - } - - return [filterCallback](const Physics::WorldBody* body, const Physics::Shape* shape) - { - if (filterCallback(body, shape) != Physics::QueryHitType::None) - { - return Physics::QueryHitType::Block; - } - else - { - return Physics::QueryHitType::None; - } - }; - } - - // Helper function to convert the Overlap Filter Callback returning bool to a standard Filter Callback returning QueryHitType - static Physics::FilterCallback GetFilterCallbackFromOverlap(const Physics::OverlapFilterCallback& overlapFilterCallback) - { - if (!overlapFilterCallback) - { - return nullptr; - } - - return [overlapFilterCallback](const Physics::WorldBody* body, const Physics::Shape* shape) - { - if (overlapFilterCallback(body, shape)) - { - return Physics::QueryHitType::Touch; - } - else - { - return Physics::QueryHitType::None; - } - }; - } - - Physics::RayCastHit World::RayCast(const Physics::RayCastRequest& request) - { - const auto orig = PxMathConvert(request.m_start); - const auto dir = PxMathConvert(request.m_direction); - - // Query flags. - // Note: we specify eBLOCK here as we're only interested in the closest object. The touches field in the result will be invalid - const physx::PxQueryFlags queryFlags = GetPxQueryFlags(request.m_queryType); - const physx::PxQueryFilterData queryData(queryFlags); - const physx::PxHitFlags hitFlags = Utils::RayCast::GetPxHitFlags(request.m_hitFlags); - PhysXQueryFilterCallback queryFilterCallback(request.m_collisionGroup, - GetBlockFilterCallback(request.m_filterCallback), physx::PxQueryHitType::eBLOCK); - - // Raycast - physx::PxRaycastBuffer castResult; - bool status = false; - { - PHYSX_SCENE_READ_LOCK(*m_world); - status = m_world->raycast(orig, dir, request.m_distance, castResult, hitFlags, queryData, &queryFilterCallback); - } - - // Convert to generic API - Physics::RayCastHit hit; - if (status) - { - hit = Utils::RayCast::GetHitFromPxHit(castResult.block); - } - return hit; - } - - AZStd::vector World::RayCastMultiple(const Physics::RayCastRequest& request) - { - const auto orig = PxMathConvert(request.m_start); - const auto dir = PxMathConvert(request.m_direction); - - // Query flags. - // Note: we specify eTOUCH here as we're interested in all hits that intersect the ray. - const physx::PxQueryFlags queryFlags = GetPxQueryFlags(request.m_queryType); - const physx::PxQueryFilterData queryData(queryFlags); - const physx::PxHitFlags hitFlags = Utils::RayCast::GetPxHitFlags(request.m_hitFlags); - - PhysXQueryFilterCallback queryFilterCallback(request.m_collisionGroup, request.m_filterCallback, physx::PxQueryHitType::eTOUCH); - - //resize if needed - const AZ::u64 maxResults = AZ::GetMin(m_maxRaycastBufferSize, request.m_maxResults); - AZ_Warning("World", request.m_maxResults == maxResults, "Raycast request exceeded maximum set in PhysX Configuration. Max[%u] Requested[%u]", m_maxRaycastBufferSize, request.m_maxResults); - if (s_raycastBuffer.size() < maxResults) - { - s_raycastBuffer.resize(maxResults); - } - // Raycast - physx::PxRaycastBuffer castResult(s_raycastBuffer.begin(), aznumeric_cast(maxResults)); - bool status = false; - { - PHYSX_SCENE_READ_LOCK(*m_world); - status = m_world->raycast(orig, dir, request.m_distance, castResult, hitFlags, queryData, &queryFilterCallback); - } - - // Convert to generic API - AZStd::vector hits; - if (status) - { - PHYSX_SCENE_READ_LOCK(*m_world); - if (castResult.hasBlock) - { - hits.push_back(Utils::RayCast::GetHitFromPxHit(castResult.block)); - } - - for (auto i = 0u; i < castResult.getNbTouches(); ++i) - { - const auto& pxHit = castResult.getTouch(i); - hits.push_back(Utils::RayCast::GetHitFromPxHit(pxHit)); - } - } - return hits; - } - - Physics::RayCastHit World::ShapeCast(const Physics::ShapeCastRequest& request) - { - const physx::PxTransform pose = PxMathConvert(request.m_start); - const physx::PxVec3 dir = PxMathConvert(request.m_direction); - - const physx::PxQueryFlags queryFlags = GetPxQueryFlags(request.m_queryType); - const physx::PxQueryFilterData queryData(queryFlags); - const physx::PxHitFlags hitFlags = Utils::RayCast::GetPxHitFlags(request.m_hitFlags); - PhysXQueryFilterCallback queryFilterCallback(request.m_collisionGroup, - GetBlockFilterCallback(request.m_filterCallback), physx::PxQueryHitType::eBLOCK); - - physx::PxGeometryHolder pxGeometry; - Utils::CreatePxGeometryFromConfig(*request.m_shapeConfiguration, pxGeometry); - - Physics::RayCastHit hit; - if (pxGeometry.any().getType() == physx::PxGeometryType::eSPHERE || - pxGeometry.any().getType() == physx::PxGeometryType::eBOX || - pxGeometry.any().getType() == physx::PxGeometryType::eCAPSULE || - pxGeometry.any().getType() == physx::PxGeometryType::eCONVEXMESH) - { - // Buffer to store results in. - physx::PxSweepBuffer pxResult; - bool status = false; - { - PHYSX_SCENE_READ_LOCK(*m_world); - status = m_world->sweep(pxGeometry.any(), pose, dir, request.m_distance, pxResult, hitFlags, queryData, &queryFilterCallback); - } - if (status) - { - hit = Utils::RayCast::GetHitFromPxHit(pxResult.block); - } - } - else - { - AZ_Warning("World", false, "Invalid geometry type passed to shape cast. Only sphere, box, capsule or convex mesh is supported"); - } - - return hit; - } - - AZStd::vector World::ShapeCastMultiple(const Physics::ShapeCastRequest& request) - { - const physx::PxTransform pose = PxMathConvert(request.m_start); - const physx::PxVec3 dir = PxMathConvert(request.m_direction); - - const physx::PxQueryFlags queryFlags = GetPxQueryFlags(request.m_queryType); - const physx::PxQueryFilterData queryData(queryFlags); - const physx::PxHitFlags hitFlags = Utils::RayCast::GetPxHitFlags(request.m_hitFlags); - PhysXQueryFilterCallback queryFilterCallback(request.m_collisionGroup, request.m_filterCallback, physx::PxQueryHitType::eTOUCH); - - physx::PxGeometryHolder pxGeometry; - Utils::CreatePxGeometryFromConfig(*request.m_shapeConfiguration, pxGeometry); - - AZStd::vector hits; - if (pxGeometry.any().getType() == physx::PxGeometryType::eSPHERE || - pxGeometry.any().getType() == physx::PxGeometryType::eBOX || - pxGeometry.any().getType() == physx::PxGeometryType::eCAPSULE || - pxGeometry.any().getType() == physx::PxGeometryType::eCONVEXMESH) - { - //resize if needed - const AZ::u64 maxResults = AZ::GetMin(m_maxSweepBufferSize, request.m_maxResults); - AZ_Warning("World", request.m_maxResults == maxResults, "Shape cast request exceeded maximum set in PhysX Configuration. Max[%u] Requested[%u]", m_maxSweepBufferSize, request.m_maxResults); - if (s_sweepBuffer.size() < maxResults) - { - s_sweepBuffer.resize(maxResults); - } - - // Buffer to store results - physx::PxSweepBuffer pxResult(s_sweepBuffer.begin(), aznumeric_cast(maxResults)); - - bool status = false; - { - PHYSX_SCENE_READ_LOCK(*m_world); - status = m_world->sweep(pxGeometry.any(), pose, dir, request.m_distance, pxResult, hitFlags, queryData, &queryFilterCallback); - } - if (status) - { - if (pxResult.hasBlock) - { - hits.push_back(Utils::RayCast::GetHitFromPxHit(pxResult.block)); - } - - for (auto i = 0u; i < pxResult.getNbTouches(); ++i) - { - const auto& pxHit = pxResult.getTouch(i); - hits.push_back(Utils::RayCast::GetHitFromPxHit(pxHit)); - } - } - } - else - { - AZ_Warning("World", false, "Invalid geometry type passed to shape cast. Only sphere, box, capsule or convex mesh is supported"); - } - - return hits; - } - - AZStd::optional PxHitToLyHit(const physx::PxOverlapHit& hit) - { - if (auto userData = Utils::GetUserData(hit.actor)) - { - Physics::OverlapHit resultHit; - resultHit.m_body = userData->GetWorldBody(); - resultHit.m_shape = static_cast(hit.shape->userData); - return resultHit; - } - else - { - return {}; - } - } - - bool OverlapGeneric(physx::PxScene* world, const Physics::OverlapRequest& request, physx::PxOverlapCallback& overlapCallback) - { - // Prepare overlap data - const physx::PxTransform pose = PxMathConvert(request.m_pose); - physx::PxGeometryHolder pxGeometry; - Utils::CreatePxGeometryFromConfig(*request.m_shapeConfiguration, pxGeometry); - - const physx::PxQueryFlags queryFlags = GetPxQueryFlags(request.m_queryType); - const physx::PxQueryFilterData defaultFilterData(queryFlags); - PhysXQueryFilterCallback filterCallback(request.m_collisionGroup, GetFilterCallbackFromOverlap(request.m_filterCallback), physx::PxQueryHitType::eTOUCH); - - bool status = false; - { - PHYSX_SCENE_READ_LOCK(*world); - status = world->overlap(pxGeometry.any(), pose, overlapCallback, defaultFilterData, &filterCallback); - } - return status; - } - - AZStd::vector World::Overlap(const Physics::OverlapRequest& request) - { - //resize if needed - const AZ::u64 maxResults = AZ::GetMin(m_maxOverlapBufferSize, request.m_maxResults); - AZ_Warning("World", request.m_maxResults == maxResults, "Overlap request exceeded maximum set in PhysX Configuration. Max[%u] Requested[%u]", m_maxOverlapBufferSize, request.m_maxResults); - if (s_overlapBuffer.size() < maxResults) - { - s_overlapBuffer.resize(maxResults); - } - - // Buffer to store results - physx::PxOverlapBuffer queryHits(s_overlapBuffer.begin(), aznumeric_cast(maxResults)); - const bool status = OverlapGeneric(m_world, request, queryHits); - - AZStd::vector hits; - if (status) - { - // Process results - AZ::u32 hitNum = queryHits.getNbAnyHits(); - hits.reserve(hitNum); - for (AZ::u32 i = 0; i < hitNum; ++i) - { - if (auto hit = PxHitToLyHit(queryHits.getAnyHit(i))) - { - hits.push_back(AZStd::move(*hit)); - } - } - hits.shrink_to_fit(); - } - return hits; - } - - template - struct LyHitCallback : public physx::PxHitCallback - { - const Physics::HitCallback& m_hitCallback; - - LyHitCallback(const Physics::HitCallback& hitCallback, AZStd::vector& hitBuffer) - : m_hitCallback(hitCallback) - , physx::PxHitCallback(hitBuffer.begin(), static_cast(hitBuffer.size())) - {} - - physx::PxAgain processTouches(const PhysXHitType* buffer, physx::PxU32 numHits) override - { - for (auto it = buffer; it != buffer+numHits; ++it) - { - if (auto hit = PxHitToLyHit(*it)) - { - if (!m_hitCallback(AZStd::optional(hit))) - { - return false; - } - } - } - - return true; - }; - - void finalizeQuery() override - { - m_hitCallback({}); - } - }; - - void World::OverlapUnbounded(const Physics::OverlapRequest& request, const Physics::HitCallback& hitCallback) - { - //resize if needed - const AZ::u64 maxResults = AZ::GetMin(m_maxOverlapBufferSize, request.m_maxResults); - if (s_overlapBuffer.size() < maxResults) - { - s_overlapBuffer.resize(maxResults); - } - LyHitCallback callback(hitCallback, s_overlapBuffer); - OverlapGeneric(m_world, request, callback); - } - - physx::PxActor* GetPxActor(const Physics::WorldBody& worldBody) - { - if (worldBody.GetNativeType() != NativeTypeIdentifiers::RigidBody && - worldBody.GetNativeType() != NativeTypeIdentifiers::RigidBodyStatic) - { - return nullptr; - } - - return static_cast(worldBody.GetNativePointer()); - } - - AZStd::unordered_set::iterator World::FindSuppressedPair(const physx::PxActor* actor0, const physx::PxActor* actor1) - { - auto iterator = m_suppressedCollisionPairs.find(AZStd::make_pair(actor0, actor1)); - if (iterator != m_suppressedCollisionPairs.end()) - { - return iterator; - } - - // also check for the pair with the actors in the other order - return m_suppressedCollisionPairs.find(AZStd::make_pair(actor1, actor0)); - } - - void World::RegisterSuppressedCollision(const Physics::WorldBody& body0, - const Physics::WorldBody& body1) - { - physx::PxActor* actor0 = GetPxActor(body0); - physx::PxActor* actor1 = GetPxActor(body1); - if (actor0 && actor1) - { - if (FindSuppressedPair(actor0, actor1) == m_suppressedCollisionPairs.end()) - { - m_suppressedCollisionPairs.insert(AZStd::make_pair(actor0, actor1)); - } - } - } - - void World::UnregisterSuppressedCollision(const Physics::WorldBody& body0, - const Physics::WorldBody& body1) - { - physx::PxActor* actor0 = GetPxActor(body0); - physx::PxActor* actor1 = GetPxActor(body1); - if (actor0 && actor1) - { - auto iterator = FindSuppressedPair(actor0, actor1); - if (iterator != m_suppressedCollisionPairs.end()) - { - m_suppressedCollisionPairs.erase(*iterator); - } - } - } - - void World::AddBody(Physics::WorldBody& body) - { - body.AddToWorld(*this); - } - - void World::RemoveBody(Physics::WorldBody& body) - { - body.RemoveFromWorld(*this); - } - - void World::SetSimFunc(std::function func) - { - m_simFunc = func; - } - - void World::StartSimulation(float deltaTime) - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "World::StartSimulation"); - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "OnPrePhysicsSubtick"); - Physics::WorldNotificationBus::Event(m_worldId, &Physics::WorldNotifications::OnPrePhysicsSubtick, deltaTime); - } - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::Simulate"); - - PHYSX_SCENE_WRITE_LOCK(*m_world); - - // Performs simulation for the scene - m_world->simulate(deltaTime); - } - - m_currentDeltaTime = deltaTime; - } - - void World::FinishSimulation() - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "World::FinishSimulation"); - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::CheckResults"); - - // Wait for the simulation to complete. - // In the multithreaded environment we need to make sure we don't lock the scene for write here. - // This is because contact modification callbacks can be issued from the job threads and cause deadlock - // due to the callback code locking the scene. - // https://devtalk.nvidia.com/default/topic/1024408/pxcontactmodifycallback-and-pxscene-locking/ - m_world->checkResults(true); - } - - bool activeActorsEnabled = false; - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::FetchResults"); - PHYSX_SCENE_WRITE_LOCK(*m_world); - - activeActorsEnabled = m_world->getFlags() & physx::PxSceneFlag::eENABLE_ACTIVE_ACTORS; - - // Swap the buffers, invoke callbacks, build the list of active actors. - m_world->fetchResults(true); - } - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::ExecuteCollisionNotifications"); - Physics::CollisionNotificationBus::ExecuteQueuedEvents(); - } - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::ExecuteTriggerNotifications"); - Physics::TriggerNotificationBus::ExecuteQueuedEvents(); - } - - if (activeActorsEnabled && m_simFunc) - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::ActiveActors"); - - PHYSX_SCENE_READ_LOCK(*m_world); - - physx::PxU32 numActiveActors = 0; - physx::PxActor** activeActors = m_world->getActiveActors(numActiveActors); - - for (physx::PxU32 i = 0; i < numActiveActors; ++i) - { - m_simFunc(activeActors[i]); - } - } - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::OnPostPhysicsSubtick"); - Physics::WorldNotificationBus::Event(m_worldId, &Physics::WorldNotifications::OnPostPhysicsSubtick, m_currentDeltaTime); - } - - UpdateAzProfilerDataPoints(); - - m_deferredDeletions.clear(); - } - - void World::Update(float deltaTime) - { - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Physics); - - auto simulateFetch = [this](float simDeltaTime) - { - StartSimulation(simDeltaTime); - FinishSimulation(); - }; - - deltaTime = AZ::GetClamp(deltaTime, 0.0f, m_maxDeltaTime); - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "OnPrePhysicsTick"); - Physics::WorldNotificationBus::Event(m_worldId, &Physics::WorldNotifications::OnPrePhysicsTick, deltaTime); - } - - if (m_fixedDeltaTime != 0.0f) - { - m_accumulatedTime += deltaTime; - - while (m_accumulatedTime >= m_fixedDeltaTime) - { - - simulateFetch(m_fixedDeltaTime); - m_accumulatedTime -= m_fixedDeltaTime; - - } - } - else - { - simulateFetch(deltaTime); - } - - { - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "OnPostPhysicsTick"); - Physics::WorldNotificationBus::Event(m_worldId, &Physics::WorldNotifications::OnPostPhysicsTick, deltaTime); - } - } - - AZ::Crc32 World::GetNativeType() const - { - return PhysX::NativeTypeIdentifiers::World; - } - - void* World::GetNativePointer() const - { - return m_world; - } - - void World::SetEventHandler(Physics::WorldEventHandler* eventHandler) - { - PHYSX_SCENE_WRITE_LOCK(*m_world); - m_eventHandler = eventHandler; - if (m_eventHandler == nullptr && m_triggerCallback == nullptr) - { - m_world->setSimulationEventCallback(nullptr); - } - else if (m_triggerCallback == nullptr) - { - m_world->setSimulationEventCallback(this); - } - } - - void World::SetTriggerEventCallback(Physics::ITriggerEventCallback* callback) - { - PHYSX_SCENE_WRITE_LOCK(*m_world); - m_triggerCallback = static_cast(callback); - if (m_triggerCallback == nullptr && m_eventHandler == nullptr ) - { - m_world->setSimulationEventCallback(nullptr); - } - else - { - m_world->setSimulationEventCallback(this); - } - } - - // physx::PxSimulationFilterCallback - physx::PxFilterFlags World::pairFound([[maybe_unused]] physx::PxU32 pairId, [[maybe_unused]] physx::PxFilterObjectAttributes attributes0, - [[maybe_unused]] physx::PxFilterData filterData0, const physx::PxActor* actor0, [[maybe_unused]] const physx::PxShape* shape0, - [[maybe_unused]] physx::PxFilterObjectAttributes attributes1, [[maybe_unused]] physx::PxFilterData filterData1, const physx::PxActor* actor1, - [[maybe_unused]] const physx::PxShape* shape1, [[maybe_unused]] physx::PxPairFlags& pairFlags) - { - if (FindSuppressedPair(actor0, actor1) != m_suppressedCollisionPairs.end()) - { - return physx::PxFilterFlag::eSUPPRESS; - } - - return physx::PxFilterFlag::eDEFAULT; - } - - void World::pairLost([[maybe_unused]] physx::PxU32 pairId, [[maybe_unused]] physx::PxFilterObjectAttributes attributes0, [[maybe_unused]] physx::PxFilterData filterData0, - [[maybe_unused]] physx::PxFilterObjectAttributes attributes1, [[maybe_unused]] physx::PxFilterData filterData1, [[maybe_unused]] bool objectRemoved) - { - - } - - bool World::statusChange([[maybe_unused]] physx::PxU32& pairId, [[maybe_unused]] physx::PxPairFlags& pairFlags, [[maybe_unused]] physx::PxFilterFlags& filterFlags) - { - return false; - } - - // physx::PxSimulationEventCallback - void World::onConstraintBreak([[maybe_unused]] physx::PxConstraintInfo* constraints, [[maybe_unused]] physx::PxU32 count) - { - } - - void World::onWake([[maybe_unused]] physx::PxActor** actors, [[maybe_unused]] physx::PxU32 count) - { - } - - void World::onSleep([[maybe_unused]] physx::PxActor** actors, [[maybe_unused]] physx::PxU32 count) - { - } - - void World::onContact(const physx::PxContactPairHeader& pairHeader, const physx::PxContactPair* pairs, physx::PxU32 nbPairs) - { - AZ_Assert(m_eventHandler != nullptr, "Event handler has not been set. This should not be possible, see World::SetEventHandler"); - - const bool body01Destroyed = pairHeader.flags & physx::PxContactPairHeaderFlag::eREMOVED_ACTOR_0; - const bool body02Destroyed = pairHeader.flags & physx::PxContactPairHeaderFlag::eREMOVED_ACTOR_1; - if (body01Destroyed || body02Destroyed) - { - // We can't report destroyed bodies at the moment. - return; - } - - static const physx::PxU32 MaxPointsToReport = 10; - for (physx::PxU32 i = 0; i < nbPairs; i++) - { - auto contactPair = pairs[i]; - auto flagsToNotify = - physx::PxPairFlag::eNOTIFY_TOUCH_FOUND | - physx::PxPairFlag::eNOTIFY_TOUCH_PERSISTS | - physx::PxPairFlag::eNOTIFY_TOUCH_LOST; - - if (contactPair.events & flagsToNotify) - { - auto userData01 = Utils::GetUserData(pairHeader.actors[0]); - auto userData02 = Utils::GetUserData(pairHeader.actors[1]); - - // Missing user data, or user data was invalid - if (!userData01 || !userData02) - { - AZ_Warning("PhysX::World", false, "Invalid user data set for objects Obj0:%p Obj1:%p", userData01, userData02); - continue; - } - - Physics::WorldBody* body01 = userData01->GetWorldBody(); - Physics::WorldBody* body02 = userData02->GetWorldBody(); - - if (!body01 || !body02) - { - AZ_Warning("PhysX::World", false, "Invalid body data set for objects Obj0:%p Obj1:%p", body01, body02); - continue; - } - - Physics::Shape* shape01 = Utils::GetUserData(contactPair.shapes[0]); - Physics::Shape* shape02 = Utils::GetUserData(contactPair.shapes[1]); - - if (!shape01 || !shape02) - { - AZ_Warning("PhysX::World", false, "Invalid shape userdata set for objects Obj0:%p Obj1:%p", shape01, shape02); - continue; - } - - // Collision Event - Physics::CollisionEvent collision; - collision.m_body1 = body01; - collision.m_body2 = body02; - collision.m_shape1 = shape01; - collision.m_shape2 = shape02; - - // Extract contacts for collision event - physx::PxContactPairPoint extractedPoints[MaxPointsToReport]; - physx::PxU32 contactPointCount = contactPair.extractContacts(extractedPoints, MaxPointsToReport); - collision.m_contacts.resize(contactPointCount); - for (physx::PxU8 j = 0; j < contactPointCount; ++j) - { - auto point = extractedPoints[j]; - - collision.m_contacts[j].m_position = PxMathConvert(point.position); - collision.m_contacts[j].m_normal = PxMathConvert(point.normal); - collision.m_contacts[j].m_impulse = PxMathConvert(point.impulse); - collision.m_contacts[j].m_separation = point.separation; - collision.m_contacts[j].m_internalFaceIndex01 = point.internalFaceIndex0; - collision.m_contacts[j].m_internalFaceIndex02 = point.internalFaceIndex1; - } - - if (contactPair.events & physx::PxPairFlag::eNOTIFY_TOUCH_FOUND) - { - m_eventHandler->OnCollisionBegin(collision); - AZStd::swap(collision.m_body1, collision.m_body2); - AZStd::swap(collision.m_shape1, collision.m_shape2); - m_eventHandler->OnCollisionBegin(collision); - } - else if (contactPair.events & physx::PxPairFlag::eNOTIFY_TOUCH_PERSISTS) - { - m_eventHandler->OnCollisionPersist(collision); - AZStd::swap(collision.m_body1, collision.m_body2); - AZStd::swap(collision.m_shape1, collision.m_shape2); - m_eventHandler->OnCollisionPersist(collision); - } - else if (contactPair.events & physx::PxPairFlag::eNOTIFY_TOUCH_LOST) - { - m_eventHandler->OnCollisionEnd(collision); - AZStd::swap(collision.m_body1, collision.m_body2); - AZStd::swap(collision.m_shape1, collision.m_shape2); - m_eventHandler->OnCollisionEnd(collision); - } - } - } - } - - void World::onTrigger(physx::PxTriggerPair* pairs, physx::PxU32 count) - { - AZ_Assert( (m_eventHandler != nullptr) || (m_triggerCallback != nullptr), "Invalid event handlers"); - - for (physx::PxU32 i = 0; i < count; ++i) - { - physx::PxTriggerPair& triggerPair = pairs[i]; - - if (triggerPair.triggerActor->userData && triggerPair.otherActor->userData) - { - if (m_triggerCallback && m_triggerCallback->OnTriggerCallback(&triggerPair)) - { - continue; - } - - auto triggerBody = Utils::GetUserData(triggerPair.triggerActor)->GetWorldBody(); - auto triggerShape = static_cast(triggerPair.triggerShape->userData); - - if( !triggerBody ) - { - AZ_Error( "PhysX World", false, "onTrigger:: trigger body was invalid" ); - continue; - } - - auto otherBody = Utils::GetUserData(triggerPair.otherActor)->GetWorldBody(); - auto otherShape = static_cast(triggerPair.otherShape->userData); - - if( !otherBody ) - { - AZ_Error( "PhysX World", false, "onTrigger:: otherBody was invalid" ); - continue; - } - - if (triggerBody->GetEntityId().IsValid() && otherBody->GetEntityId().IsValid()) - { - Physics::TriggerEvent triggerEvent; - triggerEvent.m_triggerBody = triggerBody; - triggerEvent.m_triggerShape = triggerShape; - triggerEvent.m_otherBody = otherBody; - triggerEvent.m_otherShape = otherShape; - - if (triggerPair.status == physx::PxPairFlag::eNOTIFY_TOUCH_FOUND) - { - m_eventHandler->OnTriggerEnter(triggerEvent); - } - else if (triggerPair.status == physx::PxPairFlag::eNOTIFY_TOUCH_LOST) - { - m_eventHandler->OnTriggerExit(triggerEvent); - } - else - { - AZ_Warning("PhysX World", false, "onTrigger with status different from TOUCH_FOUND and TOUCH_LOST."); - } - } - else - { - AZ_Warning("PhysX World", false, "onTrigger received invalid actors."); - } - } - } - } - - void World::onAdvance([[maybe_unused]] const physx::PxRigidBody*const* bodyBuffer, [[maybe_unused]] const physx::PxTransform* poseBuffer, [[maybe_unused]] const physx::PxU32 count) - { - } - - AZ::Vector3 World::GetGravity() const - { - if (m_world) - { - PHYSX_SCENE_READ_LOCK(*m_world); - return PxMathConvert(m_world->getGravity()); - } - return AZ::Vector3::CreateZero(); - } - - void World::SetGravity(const AZ::Vector3& gravity) - { - if (m_world) - { - PHYSX_SCENE_WRITE_LOCK(*m_world); - m_world->setGravity(PxMathConvert(gravity)); - Physics::WorldNotificationBus::Event(m_worldId, &Physics::WorldNotifications::OnGravityChanged, gravity); - } - } - - void World::SetMaxDeltaTime(float maxDeltaTime) - { - m_maxDeltaTime = maxDeltaTime; - } - - - void World::SetFixedDeltaTime(float fixedDeltaTime) - { - m_fixedDeltaTime = fixedDeltaTime; - } - - void World::DeferDelete(AZStd::unique_ptr worldBody) - { - m_deferredDeletions.push_back(AZStd::move(worldBody)); - } - - void World::UpdateAzProfilerDataPoints() - { - using physx::PxGeometryType; - - bool isProfilingActive = false; - AZ::Debug::ProfilerRequestBus::BroadcastResult(isProfilingActive, &AZ::Debug::ProfilerRequests::IsActive); - - if (!isProfilingActive) - { - return; - } - - AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::Physics, "PhysX::Statistics"); - - physx::PxSimulationStatistics stats; - - { - PHYSX_SCENE_READ_LOCK(m_world); - m_world->getSimulationStatistics(stats); - } - - const char* RootCategory = "PhysX/%s/%s"; - - const char* ShapesSubCategory = "Shapes"; - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eSPHERE], RootCategory, ShapesSubCategory, "Sphere"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::ePLANE], RootCategory, ShapesSubCategory, "Plane"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eCAPSULE], RootCategory, ShapesSubCategory, "Capsule"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eBOX], RootCategory, ShapesSubCategory, "Box"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eCONVEXMESH], RootCategory, ShapesSubCategory, "ConvexMesh"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eTRIANGLEMESH], RootCategory, ShapesSubCategory, "TriangleMesh"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbShapes[PxGeometryType::eHEIGHTFIELD], RootCategory, ShapesSubCategory, "Heightfield"); - - const char* ObjectsSubCategory = "Objects"; - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbActiveConstraints, RootCategory, ObjectsSubCategory, "ActiveConstraints"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbActiveDynamicBodies, RootCategory, ObjectsSubCategory, "ActiveDynamicBodies"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbActiveKinematicBodies, RootCategory, ObjectsSubCategory, "ActiveKinematicBodies"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbStaticBodies, RootCategory, ObjectsSubCategory, "StaticBodies"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDynamicBodies, RootCategory, ObjectsSubCategory, "DynamicBodies"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbKinematicBodies, RootCategory, ObjectsSubCategory, "KinematicBodies"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbAggregates, RootCategory, ObjectsSubCategory, "Aggregates"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbArticulations, RootCategory, ObjectsSubCategory, "Articulations"); - - const char* SolverSubCategory = "Solver"; - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbAxisSolverConstraints, RootCategory, SolverSubCategory, "AxisSolverConstraints"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.compressedContactSize, RootCategory, SolverSubCategory, "CompressedContactSize"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.requiredContactConstraintMemory, RootCategory, SolverSubCategory, "RequiredContactConstraintMemory"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.peakConstraintMemory, RootCategory, SolverSubCategory, "PeakConstraintMemory"); - - const char* BroadphaseSubCategory = "Broadphase"; - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.getNbBroadPhaseAdds(), RootCategory, BroadphaseSubCategory, "BroadPhaseAdds"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.getNbBroadPhaseRemoves(), RootCategory, BroadphaseSubCategory, "BroadPhaseRemoves"); - - // Compute pair stats for all geometry types - AZ::u32 ccdPairs = 0; - AZ::u32 modifiedPairs = 0; - AZ::u32 triggerPairs = 0; - - for (AZ::u32 i = 0; i < PxGeometryType::eGEOMETRY_COUNT; i++) - { - // stat[i][j] = stat[j][i], hence, discarding the symmetric entries - for (AZ::u32 j = i; j < PxGeometryType::eGEOMETRY_COUNT; j++) - { - const PxGeometryType::Enum firstGeom = static_cast(i); - const PxGeometryType::Enum secondGeom = static_cast(j); - ccdPairs += stats.getRbPairStats(physx::PxSimulationStatistics::eCCD_PAIRS, firstGeom, secondGeom); - modifiedPairs += stats.getRbPairStats(physx::PxSimulationStatistics::eMODIFIED_CONTACT_PAIRS, firstGeom, secondGeom); - triggerPairs += stats.getRbPairStats(physx::PxSimulationStatistics::eTRIGGER_PAIRS, firstGeom, secondGeom); - } - } - - const char* CollisionsSubCategory = "Collisions"; - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, ccdPairs, RootCategory, CollisionsSubCategory, "CCDPairs"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, modifiedPairs, RootCategory, CollisionsSubCategory, "ModifiedPairs"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, triggerPairs, RootCategory, CollisionsSubCategory, "TriggerPairs"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDiscreteContactPairsTotal, RootCategory, CollisionsSubCategory, "DiscreteContactPairsTotal"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDiscreteContactPairsWithCacheHits, RootCategory, CollisionsSubCategory, "DiscreteContactPairsWithCacheHits"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbDiscreteContactPairsWithContacts, RootCategory, CollisionsSubCategory, "DiscreteContactPairsWithContacts"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbNewPairs, RootCategory, CollisionsSubCategory, "NewPairs"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbLostPairs, RootCategory, CollisionsSubCategory, "LostPairs"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbNewTouches, RootCategory, CollisionsSubCategory, "NewTouches"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbLostTouches, RootCategory, CollisionsSubCategory, "LostTouches"); - AZ_PROFILE_DATAPOINT(AZ::Debug::ProfileCategory::Physics, stats.nbPartitions, RootCategory, CollisionsSubCategory, "Partitions"); - } - -} // namespace PhysX diff --git a/Gems/PhysX/Code/Source/World.h b/Gems/PhysX/Code/Source/World.h deleted file mode 100644 index 3e24c8a03d..0000000000 --- a/Gems/PhysX/Code/Source/World.h +++ /dev/null @@ -1,123 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include -#include - -namespace PhysX -{ - class IPhysxTriggerEventCallback; - - /// PhysX specific implementation of generic physics API World class. - class World - : public Physics::WorldRequestBus::Handler - , public physx::PxSimulationFilterCallback - , public physx::PxSimulationEventCallback - { - public: - - AZ_CLASS_ALLOCATOR(World, AZ::SystemAllocator, 0); - AZ_RTTI(World, "{C116A4D3-8843-45CA-9F32-F7B5CCB7F3AB}", Physics::World); - - World(AZ::Crc32 id, const Physics::WorldConfiguration& settings); - ~World() override; - - physx::PxControllerManager* GetOrCreateControllerManager(); - - physx::PxScene* GetNativeWorld() const { return m_world; } - AZ::Crc32 GetWorldId() const override { return m_worldId; } - - // Physics::World - Physics::RayCastHit RayCast(const Physics::RayCastRequest& request) override; - Physics::RayCastHit ShapeCast(const Physics::ShapeCastRequest& request) override; - AZStd::vector RayCastMultiple(const Physics::RayCastRequest& request); - AZStd::vector ShapeCastMultiple(const Physics::ShapeCastRequest& request) override; - AZStd::vector Overlap(const Physics::OverlapRequest& request) override; - void OverlapUnbounded(const Physics::OverlapRequest& request, const Physics::HitCallback& cb) override; - void RegisterSuppressedCollision(const Physics::WorldBody& body0, - const Physics::WorldBody& body1) override; - void UnregisterSuppressedCollision(const Physics::WorldBody& body0, - const Physics::WorldBody& body1) override; - void AddBody(Physics::WorldBody& body) override; - void RemoveBody(Physics::WorldBody& body) override; - void Update(float deltaTime) override; - void StartSimulation(float deltaTime) override; - void FinishSimulation() override; - AZ::Crc32 GetNativeType() const override; - void* GetNativePointer() const override; - void SetEventHandler(Physics::WorldEventHandler* eventHandler) override; - - // physx::PxSimulationFilterCallback - physx::PxFilterFlags pairFound(physx::PxU32 pairId, physx::PxFilterObjectAttributes attributes0, - physx::PxFilterData filterData0, const physx::PxActor* actor0, const physx::PxShape* shape0, - physx::PxFilterObjectAttributes attributes1, physx::PxFilterData filterData1, const physx::PxActor* actor1, - const physx::PxShape* shape1, physx::PxPairFlags& pairFlags); - void pairLost(physx::PxU32 pairId, physx::PxFilterObjectAttributes attributes0, physx::PxFilterData filterData0, - physx::PxFilterObjectAttributes attributes1, physx::PxFilterData filterData1, bool objectRemoved); - bool statusChange(physx::PxU32& pairId, physx::PxPairFlags& pairFlags, physx::PxFilterFlags& filterFlags); - - // physx::PxSimulationEventCallback - void onConstraintBreak(physx::PxConstraintInfo* constraints, physx::PxU32 count) override; - void onWake(physx::PxActor** actors, physx::PxU32 count) override; - void onSleep(physx::PxActor** actors, physx::PxU32 count) override; - void onContact(const physx::PxContactPairHeader& pairHeader, const physx::PxContactPair* pairs, physx::PxU32 nbPairs) override; - void onTrigger(physx::PxTriggerPair* pairs, physx::PxU32 count) override; - void onAdvance(const physx::PxRigidBody*const* bodyBuffer, const physx::PxTransform* poseBuffer, const physx::PxU32 count) override; - - void SetSimFunc(std::function func) override; - void SetTriggerEventCallback(Physics::ITriggerEventCallback* callback) override; - - AZ::Vector3 GetGravity() const override; - void SetGravity(const AZ::Vector3& gravity) override; - void SetMaxDeltaTime(float maxDeltaTime) override; - void SetFixedDeltaTime(float fixedDeltaTime) override; - - void DeferDelete(AZStd::unique_ptr worldBody) override; - - private: - using ActorPair = AZStd::pair; - AZStd::unordered_set::iterator FindSuppressedPair(const physx::PxActor* actor0, const physx::PxActor* actor1); - - void UpdateAzProfilerDataPoints(); - - physx::PxScene* m_world = nullptr; - AZ::Crc32 m_worldId; - - static thread_local AZStd::vector s_raycastBuffer; ///< Maximum number of hits that can be stored from a single raycast. - static thread_local AZStd::vector s_sweepBuffer; ///< Maximum number of hits that can be stored from a single shape cast. - static thread_local AZStd::vector s_overlapBuffer; ///< Maximum number of hits that can be stored from a single overlap query. - - const AZ::u64 m_maxRaycastBufferSize; //!< Max size to limit the raycast buffer, set in WorldConfiguration. - const AZ::u64 m_maxSweepBufferSize; //!< Max size to limit the shape cast buffer, set in WorldConfiguration. - const AZ::u64 m_maxOverlapBufferSize; //!< Max size to limit the overlap query buffer, set in WorldConfiguration. - - AZStd::unordered_set m_suppressedCollisionPairs; ///< Actor pairs with collision suppressed. - - float m_maxDeltaTime = 0.0f; - float m_fixedDeltaTime = 0.0f; - float m_accumulatedTime = 0.0f; - float m_currentDeltaTime = 0.0f; - - //function pointer for simulating - std::function m_simFunc = nullptr; - Physics::WorldEventHandler* m_eventHandler = nullptr; - - PhysX::IPhysxTriggerEventCallback* m_triggerCallback = nullptr; - - AZStd::vector> m_deferredDeletions; - - physx::PxControllerManager* m_controllerManager = nullptr; - }; -} // namespace PhysX diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.cpp index 0aae052c9e..463aea2f71 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.cpp @@ -14,8 +14,13 @@ #include #include +#include #include #include +#include +#include +#include +#include namespace PhysX::Benchmarks { @@ -45,12 +50,24 @@ namespace PhysX::Benchmarks return AZ::Quaternion::CreateRotationZ(m_angularPosition); } + WashingMachine::WashingMachine() + : m_sceneStartSimHandler([this]([[maybe_unused]]AzPhysics::SceneHandle sceneHandle, float fixedDeltaTime) + { + this->UpdateBlade(fixedDeltaTime); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Animation)) + { + + } + WashingMachine::~WashingMachine() { - TearDownWashingMachine(); + if (m_sceneHandle != AzPhysics::InvalidSceneHandle) + { + TearDownWashingMachine(); + } } - void WashingMachine::SetupWashingMachine(AzPhysics::Scene* scene, float cylinderRadius, float cylinderHeight, + void WashingMachine::SetupWashingMachine(AzPhysics::SceneHandle sceneHandle, float cylinderRadius, float cylinderHeight, const AZ::Vector3& position, float RPM) { Physics::System* system = AZ::Interface::Get(); @@ -58,7 +75,14 @@ namespace PhysX::Benchmarks { return; } - AZStd::shared_ptr legacyWorld = scene->GetLegacyWorld(); + AzPhysics::Scene* scene = nullptr; + if (auto* physicsSystem = AZ::Interface::Get()) + { + scene = physicsSystem->GetScene(sceneHandle); + m_sceneHandle = sceneHandle; //cache the handle + } + + scene->RegisterSceneSimulationStartHandler(m_sceneStartSimHandler); //create the cylinder const float cylinderWallThickness = AZ::GetMin(25.0f, cylinderRadius); @@ -67,23 +91,15 @@ namespace PhysX::Benchmarks const float cylinderTheta = (AZ::Constants::TwoPi / NumCylinderSide); for (int i = 0; i < NumCylinderSide; i++) { - Physics::WorldBodyConfiguration config; + AzPhysics::StaticRigidBodyConfiguration config; config.m_position.SetX((cylinderRadius + halfCylinderWallThickness) * std::cos(AZ::Constants::TwoPi * i / NumCylinderSide) + position.GetX()); config.m_position.SetY((cylinderRadius + halfCylinderWallThickness) * std::sin(AZ::Constants::TwoPi * i / NumCylinderSide) + position.GetY()); config.m_position.SetZ(z); config.m_orientation = AZ::Quaternion::CreateRotationZ(AZ::Constants::HalfPi + (cylinderTheta * i)); - - AZStd::unique_ptr cylinderWall = system->CreateStaticRigidBody(config); - Physics::ColliderConfiguration colliderConfig; Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(cylinderRadius, cylinderWallThickness, cylinderHeight)); - AZStd::shared_ptr shape = system->CreateShape(colliderConfig, shapeConfiguration); - - cylinderWall->AddShape(shape); - - legacyWorld->AddBody(*cylinderWall); - - m_cylinder[i] = AZStd::move(cylinderWall); + config.m_colliderAndShapeData = AzPhysics::ShapeColliderPair(&colliderConfig, &shapeConfiguration); + m_cylinder[i] = scene->AddSimulatedBody(&config); } //create the prop @@ -92,45 +108,48 @@ namespace PhysX::Benchmarks m_bladeAnimation.Init(RPM); - Physics::RigidBodyConfiguration bladeRigidBodyConfig; + AzPhysics::RigidBodyConfiguration bladeRigidBodyConfig; bladeRigidBodyConfig.m_kinematic = true; bladeRigidBodyConfig.m_mass = 1000.0f; bladeRigidBodyConfig.m_position = position; bladeRigidBodyConfig.m_position.SetZ(position.GetZ() + (bladeHeight / 2.0f)); bladeRigidBodyConfig.m_orientation = AZ::Quaternion::CreateRotationZ(0.0f); - - m_blade = system->CreateRigidBody(bladeRigidBodyConfig); - Physics::ColliderConfiguration bladeColliderConfig; Physics::BoxShapeConfiguration bladeShapeConfiguration(AZ::Vector3(bladeLength, 1.0f, bladeHeight)); - AZStd::shared_ptr shape = system->CreateShape(bladeColliderConfig, bladeShapeConfiguration); - - m_blade->AddShape(shape); - - legacyWorld->AddBody(*m_blade); - - Physics::WorldNotificationBus::Handler::BusConnect(legacyWorld->GetWorldId()); + bladeRigidBodyConfig.m_colliderAndShapeData = AZStd::make_pair(&bladeColliderConfig, &bladeShapeConfiguration); + m_blade = scene->AddSimulatedBody(&bladeRigidBodyConfig); } void WashingMachine::TearDownWashingMachine() { - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneStartSimHandler.Disconnect(); - for (int i = 0; i < NumCylinderSide; i++) + if (auto* sceneInterface = AZ::Interface::Get()) { - m_cylinder[i].reset(); + for (int i = 0; i < NumCylinderSide; i++) + { + sceneInterface->RemoveSimulatedBody(m_sceneHandle, m_cylinder[i]); + m_cylinder[i] = AzPhysics::InvalidSimulatedBodyHandle; + } + sceneInterface->RemoveSimulatedBody(m_sceneHandle, m_blade); + m_blade = AzPhysics::InvalidSimulatedBodyHandle; } - - m_blade.reset(); + m_sceneHandle = AzPhysics::InvalidSceneHandle; } - void WashingMachine::OnPrePhysicsSubtick(float fixedDeltaTime) + void WashingMachine::UpdateBlade(float fixedDeltaTime) { - AZ::Quaternion newRot = m_bladeAnimation.StepAnimation(fixedDeltaTime); - - AZ::Transform transform = m_blade->GetTransform(); - transform.SetRotation(newRot); - m_blade->SetKinematicTarget(transform); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AZ::Quaternion newRot = m_bladeAnimation.StepAnimation(fixedDeltaTime); + + if(auto* bladeBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_sceneHandle, m_blade))) + { + AZ::Transform transform = bladeBody->GetTransform(); + transform.SetRotation(newRot); + bladeBody->SetKinematicTarget(transform); + } + } } } #endif //HAVE_BENCHMARK diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.h b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.h index c71e9b5267..27dda80d0f 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.h +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarkWashingMachine.h @@ -15,8 +15,8 @@ #include #include -#include -#include +#include +#include namespace AzPhysics { @@ -27,27 +27,26 @@ namespace PhysX::Benchmarks { //! Helper to create a cylinder and place a spinning 'blade' inside class WashingMachine - : public Physics::WorldNotificationBus::Handler { public: + WashingMachine(); ~WashingMachine(); //! Create the washing machine. - //! @param scene - the physics scene to create the washing machine in. - //! @param cylinderRadius - inside radius of the cylinder. - //! @param cylinderHeight - how tall to make the cylinder. - //! @param position - where to position the cylinder. - //! @param RPM - how fast to spin the 'blade' in rotations per minute. - void SetupWashingMachine(AzPhysics::Scene* scene, float cylinderRadius, float cylinderHeight, + //! @param sceneHandle A handle to the physics scene to create the washing machine in. + //! @param cylinderRadius Inside radius of the cylinder. + //! @param cylinderHeight How tall to make the cylinder. + //! @param position Where to position the cylinder. + //! @param RPM How fast to spin the 'blade' in rotations per minute. + void SetupWashingMachine(AzPhysics::SceneHandle sceneHandle, float cylinderRadius, float cylinderHeight, const AZ::Vector3& position, float RPM); //! Clean up the machine. void TearDownWashingMachine(); - // Physics::WorldNotificationBus::Handler Interface ---------- - void OnPrePhysicsSubtick(float fixedDeltaTime) override; - // Physics::WorldNotificationBus::Handler Interface ---------- private: + void UpdateBlade(float fixedDeltaTime); + //! Helper to animate the 'blade'. struct BladeAnimation { @@ -65,10 +64,13 @@ namespace PhysX::Benchmarks }; static const int NumCylinderSide = 12; - AZStd::array, NumCylinderSide> m_cylinder; - AZStd::unique_ptr m_blade; + AZStd::array m_cylinder; + AzPhysics::SimulatedBodyHandle m_blade; + AzPhysics::SceneHandle m_sceneHandle = AzPhysics::InvalidSceneHandle; BladeAnimation m_bladeAnimation; + + AzPhysics::SceneEvents::OnSceneSimulationStartHandler m_sceneStartSimHandler; }; } // namespace PhysX::Benchmarks diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.cpp index 6ca7184158..46c304a76b 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.cpp @@ -35,9 +35,9 @@ namespace PhysX::Benchmarks PhysX::Environment::TeardownInternal(); } - AZStd::shared_ptr PhysXBaseBenchmarkFixture::GetDefaultWorld() + AzPhysics::SceneHandle PhysXBaseBenchmarkFixture::GetDefaultSceneHandle() const { - return m_defaultScene->GetLegacyWorld(); + return m_testSceneHandle; } void PhysXBaseBenchmarkFixture::UpdateSimulation(unsigned int numFrames, float timeStep /*= DefaultTimeStep*/) @@ -51,6 +51,12 @@ namespace PhysX::Benchmarks } } + void PhysXBaseBenchmarkFixture::StepScene1Tick(float timeStep /*= DefaultTimeStep*/) + { + m_defaultScene->StartSimulation(timeStep); + m_defaultScene->FinishSimulation(); + } + void PhysXBaseBenchmarkFixture::SetUpInternal() { m_testSceneHandle = CreateDefaultTestScene(); //create the default scene @@ -87,17 +93,10 @@ namespace PhysX::Benchmarks { if (auto* physicsSystem = AZ::Interface::Get()) { - AzPhysics::SceneConfiguration sceneConfiguration; + AzPhysics::SceneConfiguration sceneConfiguration = GetDefaultSceneConfiguration(); sceneConfiguration.m_sceneName = "BenchmarkWorld"; - sceneConfiguration.m_legacyId = AZ_CRC_CE("BenchmarkWorld"); - sceneConfiguration.m_legacyConfiguration = GetDefaultWorldConfiguration(); AzPhysics::SceneHandle sceneHandle = physicsSystem->AddScene(sceneConfiguration); - if (AzPhysics::Scene* scene = physicsSystem->GetScene(sceneHandle)) - { - AZStd::shared_ptr world = scene->GetLegacyWorld(); - world->SetEventHandler(GetWorldEventHandler()); - return sceneHandle; - } + return sceneHandle; } return AzPhysics::InvalidSceneHandle; } diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.h b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.h index a24899ab7e..dee45d9de3 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.h +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksCommon.h @@ -17,8 +17,6 @@ #include #include -#include -#include namespace PhysX::Benchmarks { @@ -45,7 +43,7 @@ namespace PhysX::Benchmarks { public: // Physics::DefaultWorldBus::Handler Interface ------------- - AZStd::shared_ptr GetDefaultWorld(); + AzPhysics::SceneHandle GetDefaultSceneHandle() const override; // Physics::DefaultWorldBus::Handler Interface ------------- //! Run the simulation for a set number of frames. This will execute as each frame as quickly as possible @@ -53,19 +51,15 @@ namespace PhysX::Benchmarks //! @param timeStep - The frame time of the 'game' frame. Default - 0.0166667f (60fps) void UpdateSimulation(unsigned int numFrames, float timeStep = DefaultTimeStep); + void StepScene1Tick(float timeStep = DefaultTimeStep); protected: void SetUpInternal(); void TearDownInternal(); //! allows each fixture to setup and define the default World Config - virtual Physics::WorldConfiguration GetDefaultWorldConfiguration() = 0; - - //! allows each fixture to setup and define the World event handler - //! - this may be overrided if a handler is required by the fixture - virtual Physics::WorldEventHandler* GetWorldEventHandler() { return nullptr; } + virtual AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() = 0; //! Creates the default scene - //! - Calls GetDefaultWorldConfiguration() to get the fixtures configuration //! - Calls GetWorldEventHandler() to attached an event handle if provided by the fixture AzPhysics::SceneHandle CreateDefaultTestScene(); diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.cpp index 5c30f6bbe8..1684dd4c7f 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.cpp @@ -13,25 +13,26 @@ #include #include -#include +#include #include #include +#include namespace PhysX::Benchmarks { namespace Utils { - AZStd::vector> CreateRigidBodies(int numRigidBodies, Physics::System* system, + AzPhysics::SimulatedBodyHandleList CreateRigidBodies(int numRigidBodies, AzPhysics::Scene* scene, bool enableCCD, GenerateColliderFuncPtr* genColliderFuncPtr /*= nullptr*/, GenerateSpawnPositionFuncPtr* genSpawnPosFuncPtr /*= nullptr*/, GenerateSpawnOrientationFuncPtr* genSpawnOriFuncPtr /*= nullptr*/, GenerateMassFuncPtr* genMassFuncPtr /*= nullptr*/, GenerateEntityIdFuncPtr* genEntityIdFuncPtr /*= nullptr*/ ) { - AZStd::vector> rigidBodies; + AzPhysics::SimulatedBodyHandleList rigidBodies; rigidBodies.reserve(numRigidBodies); - Physics::RigidBodyConfiguration rigidBodyConfig; + AzPhysics::RigidBodyConfiguration rigidBodyConfig; rigidBodyConfig.m_ccdEnabled = enableCCD; Physics::ColliderConfiguration rigidBodyColliderConfig; @@ -56,8 +57,6 @@ namespace PhysX::Benchmarks rigidBodyConfig.m_orientation = (*genSpawnOriFuncPtr)(i); } - AZStd::unique_ptr newBody = system->CreateRigidBody(rigidBodyConfig); - Physics::ShapeConfiguration* shapeConfig = nullptr; if (genColliderFuncPtr != nullptr) { @@ -67,32 +66,62 @@ namespace PhysX::Benchmarks { shapeConfig = &defaultShapeConfiguration; } - AZStd::shared_ptr shape = system->CreateShape(rigidBodyColliderConfig, *shapeConfig); - newBody->AddShape(shape); - scene->GetLegacyWorld()->AddBody(*newBody); + rigidBodyConfig.m_colliderAndShapeData = AZStd::make_pair(&rigidBodyColliderConfig, shapeConfig); - rigidBodies.push_back(AZStd::move(newBody)); + AzPhysics::SimulatedBodyHandle simBodyHandle = scene->AddSimulatedBody(&rigidBodyConfig); + rigidBodies.push_back(simBodyHandle); } - return AZStd::move(rigidBodies); + return rigidBodies; + } + + AZStd::vector GetRigidBodiesFromHandles(AzPhysics::Scene* scene, const AzPhysics::SimulatedBodyHandleList& handlesList) + { + AZStd::vector rigidBodies; + rigidBodies.reserve(handlesList.size()); + for (auto handle : handlesList) + { + rigidBodies.push_back(azdynamic_cast(scene->GetSimulatedBodyFromHandle(handle))); + } + return rigidBodies; + } + + PrePostSimulationEventHandler::PrePostSimulationEventHandler() + : m_sceneStartSimHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime) + { + this->PreTick(); + }) + , m_sceneFinishSimHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + this->PostTick(); + }) + { + } void PrePostSimulationEventHandler::Start(AzPhysics::Scene* scene) { m_subTickTimes.clear(); - Physics::WorldNotificationBus::Handler::BusConnect(scene->GetLegacyWorld()->GetWorldId()); + scene->RegisterSceneSimulationStartHandler(m_sceneStartSimHandler); + scene->RegisterSceneSimulationFinishHandler(m_sceneFinishSimHandler); } + void PrePostSimulationEventHandler::Stop() { - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneStartSimHandler.Disconnect(); + m_sceneFinishSimHandler.Disconnect(); } - void PrePostSimulationEventHandler::OnPrePhysicsSubtick([[maybe_unused]] float fixedDeltaTime) + void PrePostSimulationEventHandler::PreTick() { m_tickStart = AZStd::chrono::system_clock::now(); } - void PrePostSimulationEventHandler::OnPostPhysicsSubtick([[maybe_unused]] float fixedDeltaTime) + void PrePostSimulationEventHandler::PostTick() { auto tickElapsedMilliseconds = Types::double_milliseconds(AZStd::chrono::system_clock::now() - m_tickStart); m_subTickTimes.emplace_back(tickElapsedMilliseconds.count()); diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.h b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.h index 0d3cdc6ae8..ab9a0ba2ab 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.h +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXBenchmarksUtilities.h @@ -19,7 +19,7 @@ #include #include -#include +#include namespace AzPhysics { @@ -52,7 +52,6 @@ namespace PhysX::Benchmarks //! Helper function to create the required number of rigid bodies and spawn them in the provided world. //! @param numRigidBodies The number of bodies to spawn. - //! @param system Current active physics system. //! @param world World where the rigid bodies will be spawned into. //! @param enableCCD Flag to enable|disable Continuous Collision Detection (CCD). //! @param genColliderFuncPtr [optional] Function pointer to allow caller to pick the collider object Default is a box sized at 1m. @@ -60,18 +59,22 @@ namespace PhysX::Benchmarks //! @param genSpawnOriFuncPtr [optional] Function pointer to allow caller to pick the spawn orientation. //! @param genMassFuncPtr [optional] Function pointer to allow caller to pick the mass of the object. //! @param genEntityIdFuncPtr [optional] Function pointer to allow caller to define the entity id of the object. - AZStd::vector> CreateRigidBodies(int numRigidBodies, Physics::System* system, + AzPhysics::SimulatedBodyHandleList CreateRigidBodies(int numRigidBodies, AzPhysics::Scene* scene, bool enableCCD, GenerateColliderFuncPtr* genColliderFuncPtr = nullptr, GenerateSpawnPositionFuncPtr* genSpawnPosFuncPtr = nullptr, GenerateSpawnOrientationFuncPtr* genSpawnOriFuncPtr = nullptr, GenerateMassFuncPtr* genMassFuncPtr = nullptr, GenerateEntityIdFuncPtr* genEntityIdFuncPtr = nullptr ); + //! Helper that takes a list of SimulatedBodyHandles to Rigid Bodies and return RigidBody pointers + AZStd::vector GetRigidBodiesFromHandles(AzPhysics::Scene* scene, const AzPhysics::SimulatedBodyHandleList& handlesList); + //! Object that when given a World will listen to the Pre / Post physics updates. //! Will time the duration between Pre and Post events in milliseconds. Used for running Benchmarks struct PrePostSimulationEventHandler - : public Physics::WorldNotificationBus::Handler { + PrePostSimulationEventHandler(); + //! Begin tracking the physics tick times. //! This will clear any previous recorded times //! @param world The physics world to track tick times @@ -82,14 +85,15 @@ namespace PhysX::Benchmarks Types::TimeList& GetSubTickTimes() { return m_subTickTimes; } - // Physics::WorldNotificationBus::Handler Interface ... - void OnPrePhysicsSubtick([[maybe_unused]] float fixedDeltaTime) override; - void OnPostPhysicsSubtick([[maybe_unused]] float fixedDeltaTime) override; - private: + void PreTick(); + void PostTick(); //! list of each sub tick execution time in milliseconds Types::TimeList m_subTickTimes; AZStd::chrono::system_clock::time_point m_tickStart; + + AzPhysics::SceneEvents::OnSceneSimulationStartHandler m_sceneStartSimHandler; + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler; }; //! This will calculate and return each requested percentiles of the data set provided. diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp index b876522262..892d7b2da0 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp @@ -98,7 +98,7 @@ namespace PhysX::Benchmarks //need to get the Physics::System to be able to spawn the rigid bodies m_system = AZ::Interface::Get(); - m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(CharacterConstants::TerrainSize, CharacterConstants::TerrainSize); + m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(m_testSceneHandle, CharacterConstants::TerrainSize, CharacterConstants::TerrainSize); } virtual void TearDown([[maybe_unused]] const ::benchmark::State& state) override @@ -109,12 +109,11 @@ namespace PhysX::Benchmarks protected: // PhysXBaseBenchmarkFixture Overrides ... - Physics::WorldConfiguration GetDefaultWorldConfiguration() override + AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() override { - Physics::WorldConfiguration worldConfig; - worldConfig.m_gravity = AZ::Vector3(0.0f, 0.0f, -9.81f); - worldConfig.m_enableCcd = CharacterConstants::CCDEnabled; - return worldConfig; + AzPhysics::SceneConfiguration sceneConfig = AzPhysics::SceneConfiguration::CreateDefault(); + sceneConfig.m_enableCcd = CharacterConstants::CCDEnabled; + return sceneConfig; } Physics::System* m_system = nullptr; @@ -132,7 +131,7 @@ namespace PhysX::Benchmarks //! @param scene, the scene to spawn the characters controller into //! @param genSpawnPosFuncPtr - [optional] function pointer to allow caller to pick the spawn position AZStd::vector> CreateCharacterControllers(int numCharacterControllers, CharacterConstants::CharacterSettings::ColliderType colliderType, - AzPhysics::Scene* scene, + AzPhysics::SceneHandle& sceneHandle, GenerateSpawnPositionFuncPtr* genSpawnPosFuncPtr = nullptr) { //define some common configs @@ -168,7 +167,7 @@ namespace PhysX::Benchmarks { AZStd::unique_ptr controller; Physics::CharacterSystemRequestBus::BroadcastResult(controller, - &Physics::CharacterSystemRequests::CreateCharacter, characterConfig, *shapeConfig, *scene->GetLegacyWorld()); + &Physics::CharacterSystemRequests::CreateCharacter, characterConfig, *shapeConfig, sceneHandle); const AZ::Vector3 spawnPosition = genSpawnPosFuncPtr != nullptr ? (*genSpawnPosFuncPtr)(i) : AZ::Vector3::CreateZero(); controller->SetBasePosition(spawnPosition); @@ -208,7 +207,7 @@ namespace PhysX::Benchmarks return AZ::Vector3(x, y, z); }; AZStd::vector> controllers = Utils::CreateCharacterControllers(numCharacters, - static_cast(state.range(1)), m_defaultScene, &posGenerator); + static_cast(state.range(1)), m_testSceneHandle, &posGenerator); //setup the sub tick tracker PhysX::Benchmarks::Utils::PrePostSimulationEventHandler subTickTracker; @@ -222,8 +221,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < CharacterConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = PhysX::Benchmarks::Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -265,7 +263,7 @@ namespace PhysX::Benchmarks return AZ::Vector3(x, y, z); }; AZStd::vector> controllers = Utils::CreateCharacterControllers(numCharacters, - static_cast(state.range(1)), m_defaultScene, &posGenerator); + static_cast(state.range(1)), m_testSceneHandle, &posGenerator); //setup the sub tick tracker PhysX::Benchmarks::Utils::PrePostSimulationEventHandler subTickTracker; @@ -289,8 +287,7 @@ namespace PhysX::Benchmarks controller->ApplyRequestedVelocity(PhysX::Benchmarks::DefaultTimeStep); } - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = PhysX::Benchmarks::Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -324,7 +321,7 @@ namespace PhysX::Benchmarks return AZ::Vector3(x, y, z); }; AZStd::vector> controllers = Utils::CreateCharacterControllers(numCharacters, - static_cast(state.range(1)), m_defaultScene, &posGenerator); + static_cast(state.range(1)), m_testSceneHandle, &posGenerator); //pair up each character controller with a movement vector using ControllerAndMovementDirPair = AZStd::pair, AZ::Vector3>; @@ -369,8 +366,7 @@ namespace PhysX::Benchmarks controllerMovementPair.first->ApplyRequestedVelocity(PhysX::Benchmarks::DefaultTimeStep); } - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = PhysX::Benchmarks::Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp index 9a5fa9aaa6..149dfac30b 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp @@ -83,7 +83,7 @@ namespace PhysX::Benchmarks //need to get the Physics::System to be able to spawn the rigid bodies m_system = AZ::Interface::Get(); - m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(RagdollConstants::TerrainSize, RagdollConstants::TerrainSize); + m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(m_testSceneHandle, RagdollConstants::TerrainSize, RagdollConstants::TerrainSize); } virtual void TearDown([[maybe_unused]] const ::benchmark::State& state) override @@ -94,12 +94,11 @@ namespace PhysX::Benchmarks protected: // PhysXBaseBenchmarkFixture Overrides ... - Physics::WorldConfiguration GetDefaultWorldConfiguration() override + AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() override { - Physics::WorldConfiguration worldConfig; - worldConfig.m_gravity = AZ::Vector3(0.0f, 0.0f, -9.81f); - worldConfig.m_enableCcd = RagdollConstants::CCDEnabled; - return worldConfig; + AzPhysics::SceneConfiguration sceneConfig = AzPhysics::SceneConfiguration::CreateDefault(); + sceneConfig.m_enableCcd = RagdollConstants::CCDEnabled; + return sceneConfig; } Physics::System* m_system; @@ -126,7 +125,7 @@ namespace PhysX::Benchmarks return GetTPose(AZ::Vector3::CreateZero(), simulationType); } - AZStd::unique_ptr CreateRagdoll() + AZStd::unique_ptr CreateRagdoll(AzPhysics::SceneHandle sceneHandle) { Physics::RagdollConfiguration* configuration = AZ::Utils::LoadObjectFromFile(AZ::Test::GetEngineRootPath() + "/Gems/PhysX/Code/Tests/RagdollConfiguration.xml"); @@ -138,7 +137,7 @@ namespace PhysX::Benchmarks parentIndices.push_back(RagdollTestData::ParentIndices[i]); } - return PhysX::Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices); + return PhysX::Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices, sceneHandle); } //! BM_Ragdoll_AtRest - This test just spawns the requested number of ragdolls and places them near the terrain @@ -153,7 +152,7 @@ namespace PhysX::Benchmarks ragdolls.reserve(numRagdolls); for (int i = 0; i < numRagdolls; i++) { - ragdolls.emplace_back(CreateRagdoll()); + ragdolls.emplace_back(CreateRagdoll(m_testSceneHandle)); } //enable and position the ragdolls @@ -187,8 +186,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < RagdollConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = PhysX::Benchmarks::Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -216,7 +214,7 @@ namespace PhysX::Benchmarks const AZ::Vector3 washingMachineCentre(500.0f, 500.0f, 0.0f); PhysX::Benchmarks::WashingMachine washingMachine; washingMachine.SetupWashingMachine( - m_defaultScene, RagdollConstants::WashingMachine::CylinderRadius, RagdollConstants::WashingMachine::CylinderHeight, + m_testSceneHandle, RagdollConstants::WashingMachine::CylinderRadius, RagdollConstants::WashingMachine::CylinderHeight, washingMachineCentre, RagdollConstants::WashingMachine::BladeRPM); //create ragdolls @@ -224,7 +222,7 @@ namespace PhysX::Benchmarks ragdolls.reserve(numRagdolls); for (int i = 0; i < numRagdolls; i++) { - ragdolls.emplace_back(CreateRagdoll()); + ragdolls.emplace_back(CreateRagdoll(m_testSceneHandle)); } //enable and position the ragdolls @@ -255,8 +253,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < RagdollConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = PhysX::Benchmarks::Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXGenericBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXGenericBenchmarks.cpp index fe214dbf9c..fb6a1f062e 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXGenericBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXGenericBenchmarks.cpp @@ -13,23 +13,23 @@ #ifdef HAVE_BENCHMARK #include -#include +#include namespace PhysX::Benchmarks { //! Used to measure how much overhead fixture adds to benchmark runs. class BenchmarkablePhysXBenchmarkFixture - : public Physics::GenericPhysicsFixture + : public PhysX::GenericPhysicsFixture { public: void SetUp() { - Physics::GenericPhysicsFixture::SetUpInternal(); + PhysX::GenericPhysicsFixture::SetUpInternal(); } void TearDown() { - Physics::GenericPhysicsFixture::TearDownInternal(); + PhysX::GenericPhysicsFixture::TearDownInternal(); } }; diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp index 7d752687d2..7143f08626 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp @@ -17,7 +17,11 @@ #include #include - +#include +#include +#include +#include +#include #include #include @@ -96,8 +100,8 @@ namespace PhysX::Benchmarks //! used with Utils::CreateJoints struct JointGroup { - AZStd::unique_ptr m_parent; - AZStd::unique_ptr m_child; + AzPhysics::RigidBody* m_parent; + AzPhysics::SimulatedBody* m_child; AZStd::shared_ptr m_joint; }; //! Structure to hold the upper and lower twist limits @@ -123,23 +127,23 @@ namespace PhysX::Benchmarks //! @param parentPositionGenerator, [optional] function pointer to allow caller to pick the spawn position of the parent body //! @param childPositionGenerator, [optional] function pointer to allow caller to pick the spawn position of the child body //! @param GenerateTwistLimitsFuncPtr, [optional] function pointer to allow caller to pick the twist limits of the joint - AZStd::vector CreateJoints(int numJoints, Physics::System* system, AzPhysics::Scene* scene, + AZStd::vector CreateJoints(int numJoints, + Physics::System* system, + AzPhysics::Scene* scene, GenerateSpawnPositionFuncPtr* parentPositionGenerator = nullptr, GenerateSpawnPositionFuncPtr* childPositionGenerator = nullptr, GenerateTwistLimitsFuncPtr* twistLimitsGenerator = nullptr) { - AZStd::shared_ptr legacyWorld = scene->GetLegacyWorld(); - AZStd::vector joints; Physics::ColliderConfiguration colliderConfig; Physics::SphereShapeConfiguration shapeConfiguration = Physics::SphereShapeConfiguration(JointConstants::CreateJointDefaults::ColliderRadius); - AZStd::shared_ptr shape = system->CreateShape(colliderConfig, shapeConfiguration); + AzPhysics::ShapeColliderPair shapeColliderConfig(&colliderConfig, &shapeConfiguration); for (int i = 0; i < numJoints; i++) { JointGroup newJoint; - Physics::RigidBodyConfiguration rigidBodyConfig; + AzPhysics::RigidBodyConfiguration rigidBodyConfig; if (parentPositionGenerator) { rigidBodyConfig.m_position = (*parentPositionGenerator)(i); @@ -148,12 +152,12 @@ namespace PhysX::Benchmarks { rigidBodyConfig.m_position = AZ::Vector3(JointConstants::CreateJointDefaults::DefaultXPosition * i, 0.0f, 0.0f); } - newJoint.m_parent = system->CreateRigidBody(rigidBodyConfig); - newJoint.m_parent->AddShape(shape); - legacyWorld->AddBody(*newJoint.m_parent); + rigidBodyConfig.m_colliderAndShapeData = shapeColliderConfig; + AzPhysics::SimulatedBodyHandle rigidBodyHandle = scene->AddSimulatedBody(&rigidBodyConfig); + newJoint.m_parent = azdynamic_cast(scene->GetSimulatedBodyFromHandle(rigidBodyHandle)); //fix the child - Physics::WorldBodyConfiguration staticRigidBodyConfig; + AzPhysics::StaticRigidBodyConfiguration staticRigidBodyConfig; if (childPositionGenerator) { staticRigidBodyConfig.m_position = (*childPositionGenerator)(i); @@ -165,9 +169,10 @@ namespace PhysX::Benchmarks JointConstants::CreateJointDefaults::DefaultYPosition, 0.0f); } - newJoint.m_child = system->CreateStaticRigidBody(staticRigidBodyConfig); - newJoint.m_child->AddShape(shape); - legacyWorld->AddBody(*newJoint.m_child); + staticRigidBodyConfig.m_colliderAndShapeData = shapeColliderConfig; + + AzPhysics::SimulatedBodyHandle staticRigidBodyHandle = scene->AddSimulatedBody(&staticRigidBodyConfig); + newJoint.m_child = scene->GetSimulatedBodyFromHandle(staticRigidBodyHandle); AZStd::shared_ptr config = AZStd::make_shared(); @@ -180,7 +185,7 @@ namespace PhysX::Benchmarks config->m_twistLimitLower = limits.m_lowerLimit; config->m_swingLimitY = 1.0f; config->m_swingLimitZ = 1.0f; - newJoint.m_joint = system->CreateJoint(config, newJoint.m_parent.get(), newJoint.m_child.get()); + newJoint.m_joint = system->CreateJoint(config, newJoint.m_parent, newJoint.m_child); joints.emplace_back(AZStd::move(newJoint)); } @@ -208,11 +213,10 @@ namespace PhysX::Benchmarks protected: // PhysXBaseBenchmarkFixture Interface --------- - Physics::WorldConfiguration GetDefaultWorldConfiguration() override + AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() override { - Physics::WorldConfiguration worldConfig; - worldConfig.m_gravity = AZ::Vector3(0.0f, 0.0f, -9.81f); - return worldConfig; + AzPhysics::SceneConfiguration sceneConfig = AzPhysics::SceneConfiguration::CreateDefault(); + return sceneConfig; } // PhysXBaseBenchmarkFixture Interface --------- @@ -248,8 +252,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < JointConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -315,8 +318,7 @@ namespace PhysX::Benchmarks } auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -339,16 +341,19 @@ namespace PhysX::Benchmarks //create the collider shape config to use on the whole snake Physics::SphereShapeConfiguration snakePartShapeConfiguration = Physics::SphereShapeConfiguration(JointConstants::CreateJointDefaults::ColliderRadius); + Physics::ColliderConfiguration snakeHeadcolliderConfig; //create the had of the snake this is the only static part. - Physics::WorldBodyConfiguration snakeHeadBodyConfig; + AzPhysics::StaticRigidBodyConfiguration snakeHeadBodyConfig; snakeHeadBodyConfig.m_position = AZ::Vector3::CreateZero(); - AZStd::unique_ptr snakeHead; - snakeHead = m_system->CreateStaticRigidBody(snakeHeadBodyConfig); - Physics::ColliderConfiguration snakeHeadcolliderConfig; - AZStd::shared_ptr snakeHeadShape = m_system->CreateShape(snakeHeadcolliderConfig, snakePartShapeConfiguration); - snakeHead->AddShape(snakeHeadShape); - m_defaultScene->GetLegacyWorld()->AddBody(*snakeHead); + snakeHeadBodyConfig.m_colliderAndShapeData = AzPhysics::ShapeColliderPair(&snakeHeadcolliderConfig, &snakePartShapeConfiguration); + + AzPhysics::SimulatedBody* snakeHead = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle snakeHeadHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &snakeHeadBodyConfig); + snakeHead = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, snakeHeadHandle); + } //create the body Utils::GenerateColliderFuncPtr colliderGenerator = [&snakePartShapeConfiguration]([[maybe_unused]] int idx) -> auto @@ -359,9 +364,11 @@ namespace PhysX::Benchmarks { return AZ::Vector3(0.0f, JointConstants::SnakeSegmentLength + JointConstants::SnakeSegmentLength * idx, 0.0f); }; - AZStd::vector> snakeRigidBodies; + + AzPhysics::SimulatedBodyHandleList snakeRigidBodyHandles = Utils::CreateRigidBodies(numSegments, m_defaultScene, JointConstants::CCDEnabled, &colliderGenerator, &posGenerator); + AZStd::vector snakeRigidBodies; snakeRigidBodies.reserve(numSegments); - snakeRigidBodies = Utils::CreateRigidBodies(numSegments, m_system, m_defaultScene, JointConstants::CCDEnabled, &colliderGenerator, &posGenerator); + snakeRigidBodies = Utils::GetRigidBodiesFromHandles(m_defaultScene, snakeRigidBodyHandles); //build the snake AZStd::vector> joints; @@ -371,10 +378,10 @@ namespace PhysX::Benchmarks config->m_swingLimitY = 1.0f; config->m_swingLimitZ = 1.0f; //build the head - joints.emplace_back(m_system->CreateJoint(config, snakeRigidBodies[0].get(), snakeHead.get())); + joints.emplace_back(m_system->CreateJoint(config, snakeRigidBodies[0], snakeHead)); for (size_t i = 0; (i+1) < snakeRigidBodies.size(); i++) { - joints.emplace_back(m_system->CreateJoint(config, snakeRigidBodies[i + 1].get(), snakeRigidBodies[i].get())); + joints.emplace_back(m_system->CreateJoint(config, snakeRigidBodies[i + 1], snakeRigidBodies[i])); } //setup the sub tick tracker @@ -388,8 +395,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < JointConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -398,6 +404,12 @@ namespace PhysX::Benchmarks } subTickTracker.Stop(); + for (auto handle : snakeRigidBodyHandles) + { + m_defaultScene->RemoveSimulatedBody(handle); + } + snakeRigidBodyHandles.clear(); + //sort the frame times and get the P50, P90, P99 percentiles Utils::ReportFramePercentileCounters(state, tickTimes, subTickTracker.GetSubTickTimes()); Utils::ReportFrameStandardDeviationAndMeanCounters(state, tickTimes, subTickTracker.GetSubTickTimes()); diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp index 7788da1a4c..54f7d2219c 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp @@ -16,6 +16,9 @@ #include #include +#include +#include + #include #include #include @@ -81,23 +84,56 @@ namespace PhysX::Benchmarks { //! Object that will connect to the collision notification bus of the provided entity id struct SimulatedBodyCollisionHandler - : public Physics::CollisionNotificationBus::Handler { - SimulatedBodyCollisionHandler(AZ::EntityId entityId) + SimulatedBodyCollisionHandler(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) + : m_onCollisionBeginHandler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + [[maybe_unused]] const AzPhysics::CollisionEvent& event) + { + m_beginCount++; + }) + , m_onCollisionPersistHandler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + [[maybe_unused]] const AzPhysics::CollisionEvent& event) + { + m_persistCount++; + }) + , m_onCollisionEndHandler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + [[maybe_unused]] const AzPhysics::CollisionEvent& event) + { + m_endCount++; + }) + { + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionBeginHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionPersistHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionEndHandler); + } + + SimulatedBodyCollisionHandler(SimulatedBodyCollisionHandler&& other) { - Physics::CollisionNotificationBus::Handler::BusConnect(entityId); + m_onCollisionBeginHandler = AZStd::move(other.m_onCollisionBeginHandler); + m_onCollisionPersistHandler = AZStd::move(other.m_onCollisionPersistHandler); + m_onCollisionEndHandler = AZStd::move(other.m_onCollisionEndHandler); + m_beginCount = other.m_beginCount; + m_persistCount = other.m_persistCount; + m_endCount = other.m_endCount; } + ~SimulatedBodyCollisionHandler() { - Physics::CollisionNotificationBus::Handler::BusDisconnect(); + m_onCollisionBeginHandler.Disconnect(); + m_onCollisionPersistHandler.Disconnect(); + m_onCollisionEndHandler.Disconnect(); } - // Physics::CollisionNotificationBus::Handler --------- - // just having the bus connected is enough to cause a change in perf, no need to add anything to the function callbacks - void OnCollisionBegin([[maybe_unused]] const Physics::CollisionEvent& collisionEvent) override {} - void OnCollisionPersist([[maybe_unused]] const Physics::CollisionEvent& collisionEvent) override {} - void OnCollisionEnd([[maybe_unused]] const Physics::CollisionEvent& collisionEvent) override {} - // Physics::CollisionNotificationBus::Handler --------- + int m_beginCount = 0; + int m_persistCount = 0; + int m_endCount = 0; + private: + AzPhysics::SimulatedBodyEvents::OnCollisionBegin::Handler m_onCollisionBeginHandler; + AzPhysics::SimulatedBodyEvents::OnCollisionPersist::Handler m_onCollisionPersistHandler; + AzPhysics::SimulatedBodyEvents::OnCollisionEnd::Handler m_onCollisionEndHandler; }; } // namespace Utils @@ -113,7 +149,7 @@ namespace PhysX::Benchmarks //need to get the Physics::System to be able to spawn the rigid bodies m_system = AZ::Interface::Get(); - m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(RigidBodyConstants::TerrainSize, RigidBodyConstants::TerrainSize); + m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(m_testSceneHandle, RigidBodyConstants::TerrainSize, RigidBodyConstants::TerrainSize); } virtual void TearDown([[maybe_unused]] const ::benchmark::State &state) override @@ -124,12 +160,11 @@ namespace PhysX::Benchmarks protected: // PhysXBaseBenchmarkFixture Interface --------- - Physics::WorldConfiguration GetDefaultWorldConfiguration() override + AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() override { - Physics::WorldConfiguration worldConfig; - worldConfig.m_gravity = AZ::Vector3(0.0f, 0.0f, -9.81f); - worldConfig.m_enableCcd = RigidBodyConstants::CCDEnabled; - return worldConfig; + AzPhysics::SceneConfiguration sceneConfig = AzPhysics::SceneConfiguration::CreateDefault(); + sceneConfig.m_enableCcd = RigidBodyConstants::CCDEnabled; + return sceneConfig; } // PhysXBaseBenchmarkFixture Interface --------- @@ -174,7 +209,7 @@ namespace PhysX::Benchmarks return &boxShapeConfiguration; }; //spawn the rigid bodies - AZStd::vector> rigidBodies = Utils::CreateRigidBodies(numRigidBodies, m_system, m_defaultScene, + AzPhysics::SimulatedBodyHandleList rigidBodies = Utils::CreateRigidBodies(numRigidBodies, m_defaultScene, RigidBodyConstants::CCDEnabled, &colliderGenerator, &posGenerator); //setup the sub tick tracker @@ -188,8 +223,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < RigidBodyConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -199,10 +233,11 @@ namespace PhysX::Benchmarks subTickTracker.Stop(); //object clean up - for (int i = 0; i < rigidBodies.size(); i++) + for (auto handle : rigidBodies) { - rigidBodies[i] = nullptr; + m_defaultScene->RemoveSimulatedBody(handle); } + rigidBodies.clear(); //sort the frame times and get the P50, P90, P99 percentiles Utils::ReportFramePercentileCounters(state, tickTimes, subTickTracker.GetSubTickTimes()); @@ -222,7 +257,7 @@ namespace PhysX::Benchmarks const AZ::Vector3 washingMachineCentre(500.0f, 500.0f, 1.0f); WashingMachine washingMachine; washingMachine.SetupWashingMachine( - m_defaultScene, RigidBodyConstants::TestRadius, RigidBodyConstants::WashingMachine::CylinderHeight, + m_testSceneHandle, RigidBodyConstants::TestRadius, RigidBodyConstants::WashingMachine::CylinderHeight, washingMachineCentre, RigidBodyConstants::WashingMachine::BladeRPM); //get the request number of rigid bodies and prepare to spawn them @@ -249,7 +284,7 @@ namespace PhysX::Benchmarks return &boxShapeConfiguration; }; //spawn the rigid bodies - AZStd::vector> rigidBodies = Utils::CreateRigidBodies(numRigidBodies, m_system, m_defaultScene, + AzPhysics::SimulatedBodyHandleList rigidBodies = Utils::CreateRigidBodies(numRigidBodies, m_defaultScene, RigidBodyConstants::CCDEnabled, &colliderGenerator, &posGenerator, &oriGenerator, &massGenerator); //setup the sub tick tracker @@ -264,8 +299,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < RigidBodyConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -276,10 +310,11 @@ namespace PhysX::Benchmarks //object clean up washingMachine.TearDownWashingMachine(); - for (int i = 0; i < rigidBodies.size(); i++) + for (auto handle : rigidBodies) { - rigidBodies[i] = nullptr; + m_defaultScene->RemoveSimulatedBody(handle); } + rigidBodies.clear(); //sort the frame times and get the P50, P90, P99 percentiles Utils::ReportFramePercentileCounters(state, tickTimes, subTickTracker.GetSubTickTimes()); @@ -289,7 +324,6 @@ namespace PhysX::Benchmarks //! Same as the PhysXRigidbodyBenchmarkFixture, adds a world event handler to receive collision events class PhysXRigidbodyCollisionsBenchmarkFixture : public PhysXRigidbodyBenchmarkFixture - , public Physics::WorldEventHandler { public: void SetUp(const ::benchmark::State& state) override @@ -299,38 +333,46 @@ namespace PhysX::Benchmarks m_collisionBeginCount = 0; m_collisionPersistCount = 0; m_collisionEndCount = 0; - } - // Physics::WorldEventHandler Interface --------- - void OnTriggerEnter([[maybe_unused]] const Physics::TriggerEvent& triggerEvent) override {} - void OnTriggerExit([[maybe_unused]] const Physics::TriggerEvent& triggerEvent) override {} - - //Recreate collision handling to be similar to what was in 1.x Action game - //queue an event to each party involved in the collision - void OnCollisionBegin(const Physics::CollisionEvent& collisionEvent) override - { - Physics::CollisionNotificationBus::QueueEvent(collisionEvent.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionBegin, collisionEvent); - m_collisionBeginCount++; + m_onSceneCollisionHandler = AzPhysics::SceneEvents::OnSceneCollisionsEvent::Handler( + [this]([[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + const AzPhysics::CollisionEventList& collisionData) + { + //count the events + for (const auto& collisionEvent : collisionData) + { + switch (collisionEvent.m_type) + { + case AzPhysics::CollisionEvent::Type::Begin: + m_collisionBeginCount++; + break; + case AzPhysics::CollisionEvent::Type::Persist: + m_collisionPersistCount++; + break; + case AzPhysics::CollisionEvent::Type::End: + m_collisionEndCount++; + break; + } + } + } + ); + m_defaultScene->RegisterSceneCollisionEventHandler(m_onSceneCollisionHandler); } - void OnCollisionPersist(const Physics::CollisionEvent& collisionEvent) override - { - Physics::CollisionNotificationBus::QueueEvent(collisionEvent.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionPersist, collisionEvent); - m_collisionPersistCount++; - } - void OnCollisionEnd(const Physics::CollisionEvent& collisionEvent) override + + void TearDown(const ::benchmark::State& state) override { - Physics::CollisionNotificationBus::QueueEvent(collisionEvent.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionEnd, collisionEvent); - m_collisionEndCount++; + m_onSceneCollisionHandler.Disconnect(); + + PhysXRigidbodyBenchmarkFixture::TearDown(state); } - // Physics::WorldEventHandler Interface --------- - protected: - //attach this fixture as an event handler - Physics::WorldEventHandler* GetWorldEventHandler() override { return this; } + protected: // Collision counters to track and report the number of events int m_collisionBeginCount; int m_collisionPersistCount; int m_collisionEndCount; + + AzPhysics::SceneEvents::OnSceneCollisionsEvent::Handler m_onSceneCollisionHandler; }; //! BM_RigidBody_MovingAndColliding_CollisionHandlers - Runs that same benchmark as BM_RigidBody_MovingAndColliding, under a different fixture that adds world event handler for collisions @@ -346,7 +388,7 @@ namespace PhysX::Benchmarks const AZ::Vector3 washingMachineCentre(500.0f, 500.0f, 1.0f); WashingMachine washingMachine; washingMachine.SetupWashingMachine( - m_defaultScene, RigidBodyConstants::TestRadius, RigidBodyConstants::WashingMachine::CylinderHeight, + m_testSceneHandle, RigidBodyConstants::TestRadius, RigidBodyConstants::WashingMachine::CylinderHeight, washingMachineCentre, RigidBodyConstants::WashingMachine::BladeRPM); //get the request number of rigid bodies and prepare to spawn them @@ -378,7 +420,7 @@ namespace PhysX::Benchmarks return &boxShapeConfiguration; }; //spawn the rigid bodies - AZStd::vector> rigidBodies = Utils::CreateRigidBodies(numRigidBodies, m_system, m_defaultScene, + AzPhysics::SimulatedBodyHandleList rigidBodies = Utils::CreateRigidBodies(numRigidBodies, m_defaultScene, RigidBodyConstants::CCDEnabled, &colliderGenerator, &posGenerator, &oriGenerator, &massGenerator); //create the collision handlers @@ -395,8 +437,8 @@ namespace PhysX::Benchmarks collisionHandlers.reserve(numberCollisionHandlers); for (int i = 0; i < numberCollisionHandlers; i++) { - AZ::u64 idOffset = rand.Getu64Random() % numRigidBodies; //randomly select the offset. - collisionHandlers.emplace_back(Utils::SimulatedBodyCollisionHandler(AZ::EntityId(RigidBodyConstants::RigidBodys::RigidBodyEntityIdStart + idOffset))); + const AZ::u64 randIndex = rand.Getu64Random() % numRigidBodies; //randomly select the offset. + collisionHandlers.emplace_back(m_testSceneHandle, rigidBodies[randIndex]); } //setup the sub tick tracker @@ -411,8 +453,7 @@ namespace PhysX::Benchmarks for (AZ::u32 i = 0; i < RigidBodyConstants::GameFramesToSimulate; i++) { auto start = AZStd::chrono::system_clock::now(); - m_defaultScene->StartSimulation(DefaultTimeStep); - m_defaultScene->FinishSimulation(); + StepScene1Tick(DefaultTimeStep); //time each physics tick and store it to analyze auto tickElapsedMilliseconds = Types::double_milliseconds(AZStd::chrono::system_clock::now() - start); @@ -424,10 +465,11 @@ namespace PhysX::Benchmarks //object clean up collisionHandlers.clear(); washingMachine.TearDownWashingMachine(); - for (int i = 0; i < rigidBodies.size(); i++) + for (auto handle : rigidBodies) { - rigidBodies[i] = nullptr; + m_defaultScene->RemoveSimulatedBody(handle); } + rigidBodies.clear(); //sort the frame times and get the P50, P90, P99 percentiles Utils::ReportFramePercentileCounters(state, tickTimes, subTickTracker.GetSubTickTimes()); diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp index 916997befc..6aabf9cd04 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp @@ -17,9 +17,9 @@ #include #include -#include #include #include +#include #include #include #include @@ -50,7 +50,7 @@ namespace PhysX::Benchmarks class PhysXSceneQueryBenchmarkFixture : public benchmark::Fixture - , public Physics::GenericPhysicsFixture + , public PhysX::GenericPhysicsFixture { public: @@ -62,7 +62,7 @@ namespace PhysX::Benchmarks //! \state.range(1) - max radius void SetUp(const ::benchmark::State& state) override { - Physics::GenericPhysicsFixture::SetUpInternal(); + PhysX::GenericPhysicsFixture::SetUpInternal(); m_random = AZ::SimpleLcgRandom(SceneQueryConstants::Seed); m_numBoxes = aznumeric_cast(state.range(0)); @@ -100,7 +100,7 @@ namespace PhysX::Benchmarks m_boxes = std::vector(possibleBoxes.begin(), possibleBoxes.begin() + m_numBoxes); for (auto box : m_boxes) { - auto newEntity = TestUtils::CreateBoxEntity(box, SceneQueryConstants::BoxDimensions, false); + auto newEntity = TestUtils::CreateBoxEntity(m_testSceneHandle, box, SceneQueryConstants::BoxDimensions); Physics::RigidBodyRequestBus::Event(newEntity->GetId(), &Physics::RigidBodyRequestBus::Events::SetGravityEnabled, false); m_entities.push_back(newEntity); } @@ -110,7 +110,7 @@ namespace PhysX::Benchmarks { m_boxes.clear(); m_entities.clear(); - Physics::GenericPhysicsFixture::TearDownInternal(); + PhysX::GenericPhysicsFixture::TearDownInternal(); } protected: @@ -122,11 +122,12 @@ namespace PhysX::Benchmarks BENCHMARK_DEFINE_F(PhysXSceneQueryBenchmarkFixture, BM_RaycastRandomBoxes)(benchmark::State& state) { - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_start = AZ::Vector3::CreateZero(); request.m_distance = 2000.0f; - Physics::RayCastHit result; + AZStd::vector executionTimes; + auto* sceneInterface = AZ::Interface::Get(); auto next = 0; for (auto _ : state) @@ -135,7 +136,7 @@ namespace PhysX::Benchmarks auto start = std::chrono::system_clock::now(); //AZStd::chrono::system_clock wont messeare below 1000ns - Physics::WorldRequestBus::BroadcastResult(result, &Physics::WorldRequests::RayCast, request); + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); auto timeElasped = std::chrono::nanoseconds(std::chrono::system_clock::now() - start); executionTimes.emplace_back(timeElasped.count()); @@ -151,14 +152,16 @@ namespace PhysX::Benchmarks BENCHMARK_DEFINE_F(PhysXSceneQueryBenchmarkFixture, BM_ShapecastRandomBoxes)(benchmark::State& state) { - Physics::SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = SceneQueryConstants::SphereShapeRadius; - Physics::ShapeCastRequest request; - request.m_start = AZ::Transform::CreateIdentity(); - request.m_distance = 2000.0f; - request.m_shapeConfiguration = &shapeConfiguration; - Physics::RayCastHit result; + AzPhysics::ShapeCastRequest request = AzPhysics::ShapeCastRequestHelpers::CreateSphereCastRequest( + SceneQueryConstants::SphereShapeRadius, + AZ::Transform::CreateIdentity(), + AZ::Vector3::CreateOne(), + 2000.0f + ); + + AZStd::vector executionTimes; + auto* sceneInterface = AZ::Interface::Get(); auto next = 0; for (auto _ : state) @@ -167,7 +170,7 @@ namespace PhysX::Benchmarks auto start = std::chrono::system_clock::now(); //AZStd::chrono::system_clock wont messeare below 1000ns - Physics::WorldRequestBus::BroadcastResult(result, &Physics::WorldRequests::ShapeCast, request); + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); auto timeElasped = std::chrono::nanoseconds(std::chrono::system_clock::now() - start); executionTimes.emplace_back(timeElasped.count()); @@ -183,12 +186,13 @@ namespace PhysX::Benchmarks BENCHMARK_DEFINE_F(PhysXSceneQueryBenchmarkFixture, BM_OverlapRandomBoxes)(benchmark::State& state) { - Physics::SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = SceneQueryConstants::SphereShapeRadius; - Physics::OverlapRequest request; - request.m_shapeConfiguration = &shapeConfiguration; - AZStd::vector result; + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateSphereOverlapRequest( + SceneQueryConstants::SphereShapeRadius, + AZ::Transform::CreateIdentity() + ); + AZStd::vector executionTimes; + auto* sceneInterface = AZ::Interface::Get(); auto next = 0; for (auto _ : state) @@ -197,7 +201,7 @@ namespace PhysX::Benchmarks auto start = std::chrono::system_clock::now(); //AZStd::chrono::system_clock wont messeare below 1000ns - Physics::WorldRequestBus::BroadcastResult(result, &Physics::WorldRequests::Overlap, request); + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); auto timeElasped = std::chrono::nanoseconds(std::chrono::system_clock::now() - start); executionTimes.emplace_back(timeElasped.count()); diff --git a/Gems/PhysX/Code/Tests/CharacterControllerTests.cpp b/Gems/PhysX/Code/Tests/CharacterControllerTests.cpp index 15b709d649..8d259bd7de 100644 --- a/Gems/PhysX/Code/Tests/CharacterControllerTests.cpp +++ b/Gems/PhysX/Code/Tests/CharacterControllerTests.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -38,11 +37,15 @@ namespace PhysX class ControllerTestBasis { public: - ControllerTestBasis(AzPhysics::Scene* scene, + ControllerTestBasis(AzPhysics::SceneHandle sceneHandle, const Physics::ShapeType shapeType = Physics::ShapeType::Capsule, const AZ::Transform& floorTransform = DefaultFloorTransform) - : m_testScene(scene) + : m_sceneHandle(sceneHandle) { + if (auto* physicsSystem = AZ::Interface::Get()) + { + m_testScene = physicsSystem->GetScene(m_sceneHandle); + } AZ_Assert(m_testScene != nullptr, "ControllerTestBasis: the Test scene is null."); SetUp(shapeType, floorTransform); } @@ -50,7 +53,7 @@ namespace PhysX void SetUp(const Physics::ShapeType shapeType = Physics::ShapeType::Capsule, const AZ::Transform& floorTransform = DefaultFloorTransform) { - m_floor = Physics::AddStaticFloorToWorld(GetLegacyWorld(), floorTransform); + m_floor = PhysX::TestUtils::AddStaticFloorToScene(m_sceneHandle, floorTransform); m_controllerEntity = AZStd::make_unique("CharacterEntity"); m_controllerEntity->CreateComponent()->SetWorldTM(AZ::Transform::Identity()); @@ -90,13 +93,9 @@ namespace PhysX } } - Physics::World* GetLegacyWorld() - { - return m_testScene->GetLegacyWorld().get(); - } - AzPhysics::Scene* m_testScene; - AZStd::shared_ptr m_floor; + AzPhysics::SceneHandle m_sceneHandle; + AzPhysics::StaticRigidBody* m_floor; AZStd::unique_ptr m_controllerEntity; Physics::Character* m_controller = nullptr; float m_timeStep = AzPhysics::SystemConfiguration::DefaultFixedTimestep; @@ -106,7 +105,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, CharacterController_UnimpededController_MovesAtDesiredVelocity) { - ControllerTestBasis basis(m_defaultScene); + ControllerTestBasis basis(m_testSceneHandle); basis.Update(AZ::Vector3::CreateZero()); AZ::Vector3 desiredVelocity = AZ::Vector3::CreateAxisX(); @@ -121,10 +120,10 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, CharacterController_MovingDirectlyTowardsStaticBox_StoppedByBox) { - ControllerTestBasis basis(m_defaultScene); + ControllerTestBasis basis(m_testSceneHandle); AZ::Vector3 velocity = AZ::Vector3::CreateAxisX(); - auto box = Physics::AddStaticUnitBoxToWorld(basis.GetLegacyWorld(), AZ::Vector3(1.5f, 0.0f, 0.5f)); + auto box = PhysX::TestUtils::AddStaticUnitBoxToScene(basis.m_sceneHandle, AZ::Vector3(1.5f, 0.0f, 0.5f)); // run the simulation for a while so the controller should get to the box and stop basis.Update(velocity, 50); @@ -147,10 +146,10 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, CharacterController_MovingDiagonallyTowardsStaticBox_SlidesAlongBox) { - ControllerTestBasis basis(m_defaultScene); + ControllerTestBasis basis(m_testSceneHandle); AZ::Vector3 velocity = AZ::Vector3(1.0f, 1.0f, 0.0f); - auto box = Physics::AddStaticUnitBoxToWorld(basis.GetLegacyWorld(), AZ::Vector3(1.0f, 0.5f, 0.5f)); + auto box = PhysX::TestUtils::AddStaticUnitBoxToScene(basis.m_sceneHandle, AZ::Vector3(1.0f, 0.5f, 0.5f)); // run the simulation for a while so the controller should get to the box and start sliding basis.Update(velocity, 20); @@ -174,7 +173,7 @@ namespace PhysX AZ::Transform slopedFloorTransform = AZ::Transform::CreateRotationY(-AZ::Constants::Pi / 6.0f); slopedFloorTransform.SetTranslation( AZ::Vector3::CreateAxisZ(0.35f) + slopedFloorTransform.TransformPoint(AZ::Vector3::CreateAxisZ(-0.85f))); - ControllerTestBasis basis(m_defaultScene, Physics::ShapeType::Capsule, slopedFloorTransform); + ControllerTestBasis basis(m_testSceneHandle, Physics::ShapeType::Capsule, slopedFloorTransform); // we should be able to travel at right angles to the slope AZ::Vector3 desiredVelocity = AZ::Vector3::CreateAxisY(); @@ -227,10 +226,10 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, CharacterController_Steps_StoppedByTallStep) { - ControllerTestBasis basis(m_defaultScene); + ControllerTestBasis basis(m_testSceneHandle); - auto shortStep = Physics::AddStaticUnitBoxToWorld(basis.GetLegacyWorld(), AZ::Vector3(1.0f, 0.0f, -0.3f)); - auto tallStep = Physics::AddStaticUnitBoxToWorld(basis.GetLegacyWorld(), AZ::Vector3(2.0f, 0.0f, 0.5f)); + auto shortStep = PhysX::TestUtils::AddStaticUnitBoxToScene(basis.m_sceneHandle, AZ::Vector3(1.0f, 0.0f, -0.3f)); + auto tallStep = PhysX::TestUtils::AddStaticUnitBoxToScene(basis.m_sceneHandle, AZ::Vector3(2.0f, 0.0f, 0.5f)); AZ::Vector3 desiredVelocity = AZ::Vector3::CreateAxisX(); @@ -261,10 +260,10 @@ namespace PhysX TEST_P(CharacterControllerFixture, CharacterController_ResizedController_CannotFitUnderLowBox) { Physics::ShapeType shapeType = GetParam(); - ControllerTestBasis basis(m_defaultScene, shapeType); + ControllerTestBasis basis(m_testSceneHandle, shapeType); // the bottom of the box will be at height 1.0 - auto box = Physics::AddStaticUnitBoxToWorld(basis.GetLegacyWorld(), AZ::Vector3(1.0f, 0.0f, 1.5f)); + auto box = PhysX::TestUtils::AddStaticUnitBoxToScene(basis.m_sceneHandle, AZ::Vector3(1.0f, 0.0f, 1.5f)); // resize the controller so that it is too tall to fit under the box auto controller = static_cast(basis.m_controller); @@ -294,7 +293,7 @@ namespace PhysX TEST_P(CharacterControllerFixture, CharacterController_ResizingToNegativeHeight_EmitsError) { Physics::ShapeType shapeType = GetParam(); - ControllerTestBasis basis(m_defaultScene, shapeType); + ControllerTestBasis basis(m_testSceneHandle, shapeType); auto controller = static_cast(basis.m_controller); UnitTest::ErrorHandler errorHandler("PhysX requires controller height to be positive"); controller->Resize(-0.2f); @@ -305,7 +304,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, CharacterController_ResizingCapsuleControllerBelowTwiceRadius_EmitsError) { - ControllerTestBasis basis(m_defaultScene); + ControllerTestBasis basis(m_testSceneHandle); auto controller = static_cast(basis.m_controller); // the controller will have been made with the default radius of 0.25, so any height under 0.5 should @@ -320,9 +319,9 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, CharacterController_DroppingBox_CollidesWithController) { - ControllerTestBasis basis(m_defaultScene); + ControllerTestBasis basis(m_testSceneHandle); - auto box = Physics::AddUnitBoxToWorld(basis.GetLegacyWorld(), AZ::Vector3(0.5f, 0.0f, 5.0f)); + AzPhysics::RigidBody* box = PhysX::TestUtils::AddUnitBoxToScene(m_testSceneHandle, AZ::Vector3(0.5f, 0.0f, 5.0f)); basis.Update(AZ::Vector3::CreateZero(), 200); @@ -336,25 +335,25 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, CharacterController_RaycastAgainstController_ReturnsHit) { + auto* sceneInterface = AZ::Interface::Get(); + // raycast on an empty scene should return no hits - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.25f); request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); request.m_distance = 200.0f; - Physics::RayCastHit hit; - Physics::WorldRequestBus::BroadcastResult(hit, &Physics::WorldRequests::RayCast, request); - EXPECT_FALSE(hit); + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + EXPECT_FALSE(result); // now add a controller and raycast again - ControllerTestBasis basis(m_defaultScene); + ControllerTestBasis basis(m_testSceneHandle); // the controller won't move to its initial position with its base at the origin until one update has happened basis.Update(AZ::Vector3::CreateZero()); - Physics::WorldRequestBus::BroadcastResult(hit, &Physics::WorldRequests::RayCast, request); - - EXPECT_TRUE(hit); + result = sceneInterface->QueryScene(m_testSceneHandle, &request); + EXPECT_TRUE(result); } TEST_F(PhysXDefaultWorldTest, CharacterController_DeleteCharacterInsideTrigger_RaisesExitEvent) @@ -489,7 +488,7 @@ namespace PhysX } // Create unit box located near character, collides with character by default - auto box = Physics::AddStaticUnitBoxToWorld(GetDefaultWorld().get(), AZ::Vector3(1.0f, 0.0f, 0.0f)); + auto box = PhysX::TestUtils::AddStaticUnitBoxToScene(m_testSceneHandle, AZ::Vector3(1.0f, 0.0f, 0.0f)); // Assign 'None' collision group to character controller - it should not collide with the box AZStd::string collisionGroupName; diff --git a/Gems/PhysX/Code/Tests/ColliderScalingTests.cpp b/Gems/PhysX/Code/Tests/ColliderScalingTests.cpp new file mode 100644 index 0000000000..51a11c7605 --- /dev/null +++ b/Gems/PhysX/Code/Tests/ColliderScalingTests.cpp @@ -0,0 +1,273 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace PhysXEditorTests +{ + void ExpectSingleConvexRuntimeConfig(AZ::Entity* gameEntity) + { + PhysX::BaseColliderComponent* colliderComponent = gameEntity->FindComponent(); + ASSERT_TRUE(colliderComponent != nullptr); + + Physics::ShapeConfigurationList shapeConfigList = colliderComponent->GetShapeConfigurations(); + EXPECT_EQ(shapeConfigList.size(), 1); + + for (const auto& shapeConfigPair : shapeConfigList) + { + EXPECT_EQ(shapeConfigPair.second->GetShapeType(), Physics::ShapeType::CookedMesh); + } + } + + TEST_F(PhysXEditorFixture, BoxCollider_NonUniformScaleComponent_RuntimeShapeConfigReplacedWithConvex) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Box"); + editorEntity->CreateComponent(Physics::ColliderConfiguration(), Physics::BoxShapeConfiguration()); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // because there is a non-uniform scale component, the runtime entity should have a BaseColliderComponent with a + // cooked mesh shape configuration, rather than a BoxColliderComponent + EXPECT_TRUE(gameEntity->FindComponent() == nullptr); + ExpectSingleConvexRuntimeConfig(gameEntity.get()); + } + + TEST_F(PhysXEditorFixture, BoxCollider_NonUniformScale_RuntimePhysicsAabbCorrect) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Box"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f)); + colliderConfig.m_position = AZ::Vector3(1.0f, 2.0f, 3.0f); + Physics::BoxShapeConfiguration boxShapeConfig(AZ::Vector3(0.5f, 0.7f, 0.9f)); + editorEntity->CreateComponent(colliderConfig, boxShapeConfig); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + AZ::EntityId editorId = editorEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.5f)); + worldTM.SetTranslation(AZ::Vector3(5.0f, 6.0f, 7.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationX(AZ::DegToRad(30.0f))); + AZ::TransformBus::Event(editorId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(editorId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.7f, 0.9f, 1.1f)); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // since there was no editor rigid body component, the runtime entity should have a static rigid body + const auto* staticBody = gameEntity->FindComponent()->GetStaticRigidBody(); + + const AZ::Aabb aabb = staticBody->GetAabb(); + EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(5.6045f, 4.9960f, 11.7074f), 1e-3f)); + EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(6.4955f, 6.7305f, 13.5662f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, BoxColliderRigidBody_NonUniformScale_RuntimePhysicsAabbCorrect) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Box"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f)); + colliderConfig.m_position = AZ::Vector3(1.0f, 2.0f, 3.0f); + Physics::BoxShapeConfiguration boxShapeConfig(AZ::Vector3(0.5f, 0.7f, 0.9f)); + editorEntity->CreateComponent(colliderConfig, boxShapeConfig); + editorEntity->CreateComponent(); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + AZ::EntityId editorId = editorEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.5f)); + worldTM.SetTranslation(AZ::Vector3(5.0f, 6.0f, 7.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationX(AZ::DegToRad(30.0f))); + AZ::TransformBus::Event(editorId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(editorId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.7f, 0.9f, 1.1f)); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // since there was an editor rigid body component, the runtime entity should have a dynamic rigid body + const auto* dynamicBody = gameEntity->FindComponent()->GetRigidBody(); + + const AZ::Aabb aabb = dynamicBody->GetAabb(); + EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(5.6045f, 4.9960f, 11.7074f), 1e-3f)); + EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(6.4955f, 6.7305f, 13.5662f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, CapsuleCollider_NonUniformScaleComponent_RuntimeShapeConfigReplacedWithConvex) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Capsule"); + editorEntity->CreateComponent(Physics::ColliderConfiguration(), Physics::CapsuleShapeConfiguration()); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // because there is a non-uniform scale component, the runtime entity should have a BaseColliderComponent with a + // cooked mesh shape configuration, rather than a CapsuleColliderComponent + EXPECT_TRUE(gameEntity->FindComponent() == nullptr); + ExpectSingleConvexRuntimeConfig(gameEntity.get()); + } + + TEST_F(PhysXEditorFixture, CapsuleCollider_NonUniformScale_RuntimePhysicsAabbCorrect) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Capsule"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)); + colliderConfig.m_position = AZ::Vector3(2.0f, 5.0f, 3.0f); + Physics::CapsuleShapeConfiguration capsuleShapeConfig(1.4f, 0.3f); + editorEntity->CreateComponent(colliderConfig, capsuleShapeConfig); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + AZ::EntityId capsuleId = editorEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(0.5f)); + worldTM.SetTranslation(AZ::Vector3(3.0f, 1.0f, -4.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f))); + AZ::TransformBus::Event(capsuleId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(capsuleId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(1.2f, 0.7f, 0.6f)); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // since there was no editor rigid body component, the runtime entity should have a static rigid body + const auto* staticBody = gameEntity->FindComponent()->GetStaticRigidBody(); + + const AZ::Aabb aabb = staticBody->GetAabb(); + + EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(3.81f, 2.505f, -5.38f), 1e-3f)); + EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(3.99f, 2.995f, -5.02f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, CapsuleColliderRigidBody_NonUniformScale_RuntimePhysicsAabbCorrect) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Capsule"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)); + colliderConfig.m_position = AZ::Vector3(2.0f, 5.0f, 3.0f); + Physics::CapsuleShapeConfiguration capsuleShapeConfig(1.4f, 0.3f); + editorEntity->CreateComponent(colliderConfig, capsuleShapeConfig); + editorEntity->CreateComponent(); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + AZ::EntityId capsuleId = editorEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(0.5f)); + worldTM.SetTranslation(AZ::Vector3(3.0f, 1.0f, -4.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f))); + AZ::TransformBus::Event(capsuleId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(capsuleId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(1.2f, 0.7f, 0.6f)); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // since there was an editor rigid body component, the runtime entity should have a dynamic rigid body + const auto* dynamicBody = gameEntity->FindComponent()->GetRigidBody(); + + const AZ::Aabb aabb = dynamicBody->GetAabb(); + + EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(3.81f, 2.505f, -5.38f), 1e-3f)); + EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(3.99f, 2.995f, -5.02f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, SphereCollider_NonUniformScaleComponent_RuntimeShapeConfigReplacedWithConvex) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Sphere"); + editorEntity->CreateComponent(Physics::ColliderConfiguration(), Physics::SphereShapeConfiguration()); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // because there is a non-uniform scale component, the runtime entity should have a BaseColliderComponent with a + // cooked mesh shape configuration, rather than a CapsuleColliderComponent + EXPECT_TRUE(gameEntity->FindComponent() == nullptr); + ExpectSingleConvexRuntimeConfig(gameEntity.get()); + } + + TEST_F(PhysXEditorFixture, SphereCollider_NonUniformScale_RuntimePhysicsAabbCorrect) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Sphere"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f)); + colliderConfig.m_position = AZ::Vector3(3.0f, -2.0f, 2.0f); + Physics::SphereShapeConfiguration sphereShapeConfig(0.7f); + editorEntity->CreateComponent(colliderConfig, sphereShapeConfig); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + AZ::EntityId sphereId = editorEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.2f)); + worldTM.SetTranslation(AZ::Vector3(-2.0f, -1.0f, 3.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f))); + AZ::TransformBus::Event(sphereId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(sphereId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.8f, 0.9f, 0.6f)); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // since there was no editor rigid body component, the runtime entity should have a static rigid body + const auto* staticBody = gameEntity->FindComponent()->GetStaticRigidBody(); + + const AZ::Aabb aabb = staticBody->GetAabb(); + + EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.208f, -2.944f, 0.084f), 1e-3f)); + EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(1.552f, -1.936f, 1.596f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, SphereColliderRigidBody_NonUniformScale_RuntimePhysicsAabbCorrect) + { + EntityPtr editorEntity = CreateInactiveEditorEntity("Sphere"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f)); + colliderConfig.m_position = AZ::Vector3(3.0f, -2.0f, 2.0f); + Physics::SphereShapeConfiguration sphereShapeConfig(0.7f); + editorEntity->CreateComponent(colliderConfig, sphereShapeConfig); + editorEntity->CreateComponent(); + editorEntity->CreateComponent(); + editorEntity->Activate(); + + AZ::EntityId sphereId = editorEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.2f)); + worldTM.SetTranslation(AZ::Vector3(-2.0f, -1.0f, 3.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f))); + AZ::TransformBus::Event(sphereId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(sphereId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.8f, 0.9f, 0.6f)); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // since there was an editor rigid body component, the runtime entity should have a dynamic rigid body + const auto* dynamicBody = gameEntity->FindComponent()->GetRigidBody(); + + const AZ::Aabb aabb = dynamicBody->GetAabb(); + + EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.208f, -2.944f, 0.084f), 1e-3f)); + EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(1.552f, -1.936f, 1.596f), 1e-3f)); + } +} // namespace PhysXEditorTests diff --git a/Gems/PhysX/Code/Tests/DebugDrawTests.cpp b/Gems/PhysX/Code/Tests/DebugDrawTests.cpp new file mode 100644 index 0000000000..5b41c37f34 --- /dev/null +++ b/Gems/PhysX/Code/Tests/DebugDrawTests.cpp @@ -0,0 +1,237 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include + +namespace PhysXEditorTests +{ + TEST_F(PhysXEditorFixture, BoxCollider_NonUniformScale_DebugDrawCorrect) + { + EntityPtr boxEntity = CreateInactiveEditorEntity("Box"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f)); + colliderConfig.m_position = AZ::Vector3(1.0f, 2.0f, 3.0f); + Physics::BoxShapeConfiguration boxShapeConfig(AZ::Vector3(0.5f, 0.7f, 0.9f)); + boxEntity->CreateComponent(colliderConfig, boxShapeConfig); + boxEntity->CreateComponent(); + boxEntity->Activate(); + + AZ::EntityId boxId = boxEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.5f)); + worldTM.SetTranslation(AZ::Vector3(5.0f, 6.0f, 7.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationX(AZ::DegToRad(30.0f))); + AZ::TransformBus::Event(boxId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(boxId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.7f, 0.9f, 1.1f)); + + UnitTest::TestDebugDisplayRequests testDebugDisplayRequests; + AzFramework::EntityDebugDisplayEventBus::Event(boxId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabb = testDebugDisplayRequests.GetAabb(); + + EXPECT_THAT(debugDrawAabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(5.6045f, 4.9960f, 11.7074f), 1e-3f)); + EXPECT_THAT(debugDrawAabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(6.4955f, 6.7305f, 13.5662f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, BoxCollider_NonUniformScale_DebugDrawAlignsWithAabb) + { + EntityPtr boxEntity = CreateInactiveEditorEntity("Box"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationY(AZ::DegToRad(30.0f)); + colliderConfig.m_position = AZ::Vector3(3.0f, -1.0f, 2.0f); + Physics::BoxShapeConfiguration boxShapeConfig(AZ::Vector3(1.2f, 0.4f, 1.3f)); + boxEntity->CreateComponent(colliderConfig, boxShapeConfig); + boxEntity->CreateComponent(); + boxEntity->Activate(); + + AZ::EntityId boxId = boxEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.2f)); + worldTM.SetTranslation(AZ::Vector3(4.0f, -3.0f, 1.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f))); + AZ::TransformBus::Event(boxId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(boxId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(1.1f, 0.6f, 1.3f)); + + UnitTest::TestDebugDisplayRequests testDebugDisplayRequests; + AzFramework::EntityDebugDisplayEventBus::Event(boxId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabb = testDebugDisplayRequests.GetAabb(); + + AZ::Aabb colliderAabb = AZ::Aabb::CreateNull(); + PhysX::ColliderShapeRequestBus::EventResult(colliderAabb, boxId, &PhysX::ColliderShapeRequests::GetColliderShapeAabb); + + EXPECT_TRUE(debugDrawAabb.IsClose(colliderAabb, 1e-3f)); + } + + TEST_F(PhysXEditorFixture, BoxCollider_UnitNonUniformScale_DebugDrawIdenticalToNoNonUniformScale) + { + EntityPtr boxEntity = CreateInactiveEditorEntity("Box"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f)); + colliderConfig.m_position = AZ::Vector3(1.0f, -2.0f, 1.0f); + Physics::BoxShapeConfiguration boxShapeConfig(AZ::Vector3(0.8f, 0.7f, 1.6f)); + boxEntity->CreateComponent(colliderConfig, boxShapeConfig); + boxEntity->Activate(); + + AZ::EntityId boxId = boxEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.2f)); + worldTM.SetTranslation(AZ::Vector3(4.0f, -3.0f, 1.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f))); + AZ::TransformBus::Event(boxId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + + UnitTest::TestDebugDisplayRequests testDebugDisplayRequests; + AzFramework::EntityDebugDisplayEventBus::Event(boxId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabbNoNonUniformScale = testDebugDisplayRequests.GetAabb(); + + // now add a non-uniform scale component but with scale (1, 1, 1) + boxEntity->Deactivate(); + boxEntity->CreateComponent(); + boxEntity->Activate(); + + // the Aabb for the debug draw points should not have changed + testDebugDisplayRequests.ClearPoints(); + AzFramework::EntityDebugDisplayEventBus::Event(boxId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabbUnitNonUniformScale = testDebugDisplayRequests.GetAabb(); + + EXPECT_TRUE(debugDrawAabbUnitNonUniformScale.IsClose(debugDrawAabbNoNonUniformScale, 1e-3f)); + } + + TEST_F(PhysXEditorFixture, CapsuleCollider_NonUniformScale_DebugDrawCorrect) + { + EntityPtr capsuleEntity = CreateInactiveEditorEntity("Capsule"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)); + colliderConfig.m_position = AZ::Vector3(2.0f, 5.0f, 3.0f); + Physics::CapsuleShapeConfiguration capsuleShapeConfig(1.4f, 0.3f); + capsuleEntity->CreateComponent(colliderConfig, capsuleShapeConfig); + capsuleEntity->CreateComponent(); + capsuleEntity->Activate(); + + AZ::EntityId capsuleId = capsuleEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(0.5f)); + worldTM.SetTranslation(AZ::Vector3(3.0f, 1.0f, -4.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f))); + AZ::TransformBus::Event(capsuleId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(capsuleId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(1.2f, 0.7f, 0.6f)); + + UnitTest::TestDebugDisplayRequests testDebugDisplayRequests; + AzFramework::EntityDebugDisplayEventBus::Event(capsuleId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabb = testDebugDisplayRequests.GetAabb(); + + EXPECT_THAT(debugDrawAabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(3.81f, 2.505f, -5.38f), 1e-3f)); + EXPECT_THAT(debugDrawAabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(3.99f, 2.995f, -5.02f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, CapsuleCollider_NonUniformScale_DebugDrawAlignsWithAabb) + { + EntityPtr capsuleEntity = CreateInactiveEditorEntity("Capsule"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationZ(AZ::DegToRad(60.0f)); + colliderConfig.m_position = AZ::Vector3(2.0f, -2.0f, 3.0f); + Physics::CapsuleShapeConfiguration capsuleShapeConfig(1.2f, 0.2f); + capsuleEntity->CreateComponent(colliderConfig, capsuleShapeConfig); + capsuleEntity->CreateComponent(); + capsuleEntity->Activate(); + + AZ::EntityId capsuleId = capsuleEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.4f)); + worldTM.SetTranslation(AZ::Vector3(1.0f, -4.0f, 4.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationX(AZ::DegToRad(45.0f))); + AZ::TransformBus::Event(capsuleId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(capsuleId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.8f, 0.9f, 0.4f)); + + UnitTest::TestDebugDisplayRequests testDebugDisplayRequests; + AzFramework::EntityDebugDisplayEventBus::Event(capsuleId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabb = testDebugDisplayRequests.GetAabb(); + + AZ::Aabb colliderAabb = AZ::Aabb::CreateNull(); + PhysX::ColliderShapeRequestBus::EventResult(colliderAabb, capsuleId, &PhysX::ColliderShapeRequests::GetColliderShapeAabb); + + EXPECT_TRUE(debugDrawAabb.IsClose(colliderAabb, 1e-3f)); + } + + TEST_F(PhysXEditorFixture, SphereCollider_NonUniformScale_DebugDrawCorrect) + { + EntityPtr sphereEntity = CreateInactiveEditorEntity("Sphere"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f)); + colliderConfig.m_position = AZ::Vector3(3.0f, -2.0f, 2.0f); + Physics::SphereShapeConfiguration sphereShapeConfig(0.7f); + sphereEntity->CreateComponent(colliderConfig, sphereShapeConfig); + sphereEntity->CreateComponent(); + sphereEntity->Activate(); + + AZ::EntityId sphereId = sphereEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(1.2f)); + worldTM.SetTranslation(AZ::Vector3(-2.0f, -1.0f, 3.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f))); + AZ::TransformBus::Event(sphereId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(sphereId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.8f, 0.9f, 0.6f)); + + UnitTest::TestDebugDisplayRequests testDebugDisplayRequests; + AzFramework::EntityDebugDisplayEventBus::Event(sphereId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabb = testDebugDisplayRequests.GetAabb(); + + EXPECT_THAT(debugDrawAabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.208f, -2.944f, 0.084f), 1e-3f)); + EXPECT_THAT(debugDrawAabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(1.552f, -1.936f, 1.596f), 1e-3f)); + } + + TEST_F(PhysXEditorFixture, SphereCollider_NonUniformScale_DebugDrawAlignsWithAabb) + { + EntityPtr sphereEntity = CreateInactiveEditorEntity("Sphere"); + + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::DegToRad(-30.0f)); + colliderConfig.m_position = AZ::Vector3(-1.0f, -2.0f, 1.0f); + Physics::SphereShapeConfiguration sphereShapeConfig(0.4f); + sphereEntity->CreateComponent(colliderConfig, sphereShapeConfig); + sphereEntity->CreateComponent(); + sphereEntity->Activate(); + + AZ::EntityId sphereId = sphereEntity->GetId(); + AZ::Transform worldTM; + worldTM.SetScale(AZ::Vector3(0.8f)); + worldTM.SetTranslation(AZ::Vector3(2.0f, -1.0f, 3.0f)); + worldTM.SetRotation(AZ::Quaternion::CreateRotationY(AZ::DegToRad(45.0f))); + AZ::TransformBus::Event(sphereId, &AZ::TransformBus::Events::SetWorldTM, worldTM); + AZ::NonUniformScaleRequestBus::Event(sphereId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.6f, 1.3f, 0.8f)); + + UnitTest::TestDebugDisplayRequests testDebugDisplayRequests; + AzFramework::EntityDebugDisplayEventBus::Event(sphereId, &AzFramework::EntityDebugDisplayEvents::DisplayEntityViewport, + AzFramework::ViewportInfo{ 0 }, testDebugDisplayRequests); + const AZ::Aabb debugDrawAabb = testDebugDisplayRequests.GetAabb(); + + AZ::Aabb colliderAabb = AZ::Aabb::CreateNull(); + PhysX::ColliderShapeRequestBus::EventResult(colliderAabb, sphereId, &PhysX::ColliderShapeRequests::GetColliderShapeAabb); + + EXPECT_TRUE(debugDrawAabb.IsClose(colliderAabb, 1e-3f)); + } +} // namespace PhysXEditorTests diff --git a/Gems/PhysX/Code/Tests/EditorTestUtilities.cpp b/Gems/PhysX/Code/Tests/EditorTestUtilities.cpp index f1d6c0087f..94d86e27c7 100644 --- a/Gems/PhysX/Code/Tests/EditorTestUtilities.cpp +++ b/Gems/PhysX/Code/Tests/EditorTestUtilities.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include @@ -53,12 +53,9 @@ namespace PhysXEditorTests { //in case a test modifies the default world config setup a config without getting the default(eg. SetWorldConfiguration_ForwardsConfigChangesToWorldRequestBus) AzPhysics::SceneConfiguration sceneConfiguration; - sceneConfiguration.m_legacyId = Physics::DefaultPhysicsWorldId; + sceneConfiguration.m_sceneName = AzPhysics::DefaultPhysicsSceneName; m_defaultSceneHandle = physicsSystem->AddScene(sceneConfiguration); - if (m_defaultScene = physicsSystem->GetScene(m_defaultSceneHandle)) - { - m_defaultScene->GetLegacyWorld()->SetEventHandler(this); - } + m_defaultScene = physicsSystem->GetScene(m_defaultSceneHandle); } Physics::DefaultWorldBus::Handler::BusConnect(); m_dummyTerrainComponentDescriptor = PhysX::DummyTestTerrainComponent::CreateDescriptor(); @@ -84,40 +81,9 @@ namespace PhysXEditorTests } // DefaultWorldBus - AZStd::shared_ptr PhysXEditorFixture::GetDefaultWorld() + AzPhysics::SceneHandle PhysXEditorFixture::GetDefaultSceneHandle() const { - return m_defaultScene->GetLegacyWorld(); - } - - // WorldEventHandler - void PhysXEditorFixture::OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), - &Physics::TriggerNotifications::OnTriggerEnter, triggerEvent); - } - - void PhysXEditorFixture::OnTriggerExit(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), - &Physics::TriggerNotifications::OnTriggerExit, triggerEvent); - } - - void PhysXEditorFixture::OnCollisionBegin(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), - &Physics::CollisionNotifications::OnCollisionBegin, event); - } - - void PhysXEditorFixture::OnCollisionPersist(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), - &Physics::CollisionNotifications::OnCollisionPersist, event); - } - - void PhysXEditorFixture::OnCollisionEnd(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), - &Physics::CollisionNotifications::OnCollisionEnd, event); + return m_defaultSceneHandle; } void PhysXEditorFixture::ValidateInvalidEditorShapeColliderComponentParams([[maybe_unused]] const float radius, [[maybe_unused]] const float height) @@ -133,8 +99,10 @@ namespace PhysXEditorTests LmbrCentral::CylinderShapeComponentRequestsBus::Event(editorEntity->GetId(), &LmbrCentral::CylinderShapeComponentRequests::SetRadius, radius); - // expect a warning if the radius is invalid - int expectedWarningCount = radius <= 0.f ? 1 : 0; + // expect 2 warnings + //1 if the radius is invalid + //2 when re-creating the underlying simulated body + int expectedWarningCount = radius <= 0.f ? 2 : 0; EXPECT_EQ(warningHandler.GetWarningCount(), expectedWarningCount); } @@ -143,8 +111,10 @@ namespace PhysXEditorTests LmbrCentral::CylinderShapeComponentRequestsBus::Event(editorEntity->GetId(), &LmbrCentral::CylinderShapeComponentRequests::SetHeight, height); - // expect a warning if the radius or height is invalid - int expectedWarningCount = radius <= 0.f || height <= 0.f ? 1 : 0; + // expect 2 warnings + //1 if the radius or height is invalid + //2 when re-creating the underlying simulated body + int expectedWarningCount = radius <= 0.f || height <= 0.f ? 2 : 0; EXPECT_EQ(warningHandler.GetWarningCount(), expectedWarningCount); } diff --git a/Gems/PhysX/Code/Tests/EditorTestUtilities.h b/Gems/PhysX/Code/Tests/EditorTestUtilities.h index e2bd6d12a1..3e38c1a03c 100644 --- a/Gems/PhysX/Code/Tests/EditorTestUtilities.h +++ b/Gems/PhysX/Code/Tests/EditorTestUtilities.h @@ -15,12 +15,15 @@ #include #include #include -#include #include -#include #include +namespace AzPhysics +{ + struct TriggerEvent; +} + namespace PhysXEditorTests { using EntityPtr = AZStd::unique_ptr; @@ -44,21 +47,13 @@ namespace PhysXEditorTests class PhysXEditorFixture : public UnitTest::AllocatorsTestFixture , public Physics::DefaultWorldBus::Handler - , public Physics::WorldEventHandler { public: void SetUp() override; void TearDown() override; // DefaultWorldBus - AZStd::shared_ptr GetDefaultWorld() override; - - // WorldEventHandler - void OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) override; - void OnTriggerExit(const Physics::TriggerEvent& triggerEvent) override; - void OnCollisionBegin(const Physics::CollisionEvent& event) override; - void OnCollisionPersist(const Physics::CollisionEvent& event) override; - void OnCollisionEnd(const Physics::CollisionEvent& event) override; + AzPhysics::SceneHandle GetDefaultSceneHandle() const override; AZ::ComponentDescriptor* m_dummyTerrainComponentDescriptor = nullptr; AzPhysics::SceneHandle m_defaultSceneHandle = AzPhysics::InvalidSceneHandle; diff --git a/Gems/PhysX/Code/Tests/PhysXColliderComponentModeTests.cpp b/Gems/PhysX/Code/Tests/PhysXColliderComponentModeTests.cpp index d71d77bad2..10a9565a47 100644 --- a/Gems/PhysX/Code/Tests/PhysXColliderComponentModeTests.cpp +++ b/Gems/PhysX/Code/Tests/PhysXColliderComponentModeTests.cpp @@ -28,7 +28,7 @@ namespace UnitTest : public ToolsApplicationFixture { protected: - using EntityPtr = AZStd::unique_ptr; + using EntityPtr = AZ::Entity*; AZ::ComponentId m_colliderComponentId; @@ -48,9 +48,7 @@ namespace UnitTest AzToolsFramework::SelectEntity(entityId); - AZStd::unique_ptr ptr; - ptr.reset(entity); - return AZStd::move(ptr); + return entity; } // Needed to support ViewportUi request calls. diff --git a/Gems/PhysX/Code/Tests/PhysXCollisionFilteringTest.cpp b/Gems/PhysX/Code/Tests/PhysXCollisionFilteringTest.cpp index 1316e5b10b..af75be2530 100644 --- a/Gems/PhysX/Code/Tests/PhysXCollisionFilteringTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXCollisionFilteringTest.cpp @@ -116,8 +116,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetColliderLayerOnStaticObject) { - auto ground = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); - auto fallingBox = TestUtils::CreateBoxEntity(AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto ground = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); + auto fallingBox = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); // GroupB does not collider with LayerA, no collision expected. TestUtils::SetCollisionLayer(ground, LayerA); @@ -132,8 +132,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetColliderLayerOnDynamicObject) { - auto ground = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); - auto fallingBox = TestUtils::CreateBoxEntity(AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto ground = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); + auto fallingBox = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); TestUtils::SetCollisionGroup(ground, GroupB); TestUtils::SetCollisionLayer(fallingBox, LayerA); @@ -147,8 +147,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetCollidesWithGroupOnDynamicObject) { - auto ground = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); - auto fallingBox = TestUtils::CreateBoxEntity(AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto ground = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); + auto fallingBox = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); TestUtils::SetCollisionGroup(fallingBox, GroupNone); @@ -161,8 +161,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetCollidesWithGroupOnStaticObject) { - auto ground = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); - auto fallingBox = TestUtils::CreateBoxEntity(AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto ground = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(10.0f, 10.0f, 0.5f)); + auto fallingBox = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); TestUtils::SetCollisionGroup(ground, GroupNone); @@ -175,8 +175,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetColliderLayerOnFilteredCollider) { - auto leftStatic = TestUtils::CreateStaticBoxEntity(AZ::Vector3(-1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); - auto rightStatic = TestUtils::CreateStaticBoxEntity(AZ::Vector3(1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto leftStatic = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(-1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto rightStatic = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); auto fallingMultiCollider = CreateDynamicMultiCollider(LeftCollider, RightCollider); TestUtils::SetCollisionGroup(leftStatic, GroupA); @@ -194,8 +194,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetCollidesWithGroupOnFilteredCollider) { - auto leftStatic = TestUtils::CreateStaticBoxEntity(AZ::Vector3(-1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); - auto rightStatic = TestUtils::CreateStaticBoxEntity(AZ::Vector3(1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto leftStatic = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(-1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto rightStatic = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); auto fallingMultiCollider = CreateDynamicMultiCollider(LeftCollider, RightCollider); TestUtils::SetCollisionLayer(leftStatic, LayerA); @@ -213,8 +213,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetCollidesWithLayer) { - auto ground = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(1.0f, 1.0f, 1.0f)); - auto fallingBox = TestUtils::CreateBoxEntity(AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto ground = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto fallingBox = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); TestUtils::SetCollisionLayer(fallingBox, LayerA); TestUtils::ToggleCollisionLayer(ground, LayerA, false); @@ -228,8 +228,8 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestSetCollidesWithLayerFiltered) { - auto leftStatic = TestUtils::CreateStaticBoxEntity(AZ::Vector3(-1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); - auto rightStatic = TestUtils::CreateStaticBoxEntity(AZ::Vector3(1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto leftStatic = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(-1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto rightStatic = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(1.0f, 0.0f, -1.5f), AZ::Vector3(1.0f, 1.0f, 1.0f)); auto fallingMultiCollider = CreateDynamicMultiCollider(LeftCollider, RightCollider); TestUtils::SetCollisionLayer(leftStatic, LayerA); @@ -247,7 +247,7 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestGetCollisionLayerName) { - auto staticBody = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto staticBody = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(1.0f, 1.0f, 1.0f)); TestUtils::SetCollisionLayer(staticBody, LayerA); @@ -259,7 +259,7 @@ namespace PhysX TEST_F(PhysXCollisionFilteringTest, TestGetCollisionGroupName) { - auto staticBody = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(1.0f, 1.0f, 1.0f)); + auto staticBody = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(1.0f, 1.0f, 1.0f)); TestUtils::SetCollisionGroup(staticBody, GroupA); diff --git a/Gems/PhysX/Code/Tests/PhysXComponentBusTests.cpp b/Gems/PhysX/Code/Tests/PhysXComponentBusTests.cpp new file mode 100644 index 0000000000..0422746f80 --- /dev/null +++ b/Gems/PhysX/Code/Tests/PhysXComponentBusTests.cpp @@ -0,0 +1,948 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include + +#include +#include + +namespace PhysX +{ + class PhysicsComponentBusTest + : public GenericPhysicsInterfaceTest + { + }; + + TEST_F(PhysicsComponentBusTest, SetLinearDamping_DynamicSphere_MoreDampedBodyFallsSlower) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); + + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::SetLinearDamping, 0.1f); + Physics::RigidBodyRequestBus::Event(sphereB->GetId(), + &Physics::RigidBodyRequests::SetLinearDamping, 0.2f); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 60); + + float dampingA, dampingB; + Physics::RigidBodyRequestBus::EventResult(dampingA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetLinearDamping); + Physics::RigidBodyRequestBus::EventResult(dampingB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetLinearDamping); + EXPECT_NEAR(dampingA, 0.1f, 1e-3f); + EXPECT_NEAR(dampingB, 0.2f, 1e-3f); + + float zA = TestUtils::GetPositionElement(sphereA, 2); + float zB = TestUtils::GetPositionElement(sphereB, 2); + EXPECT_GT(zB, zA); + + AZ::Vector3 vA = AZ::Vector3::CreateZero(); + AZ::Vector3 vB = AZ::Vector3::CreateZero(); + Physics::RigidBodyRequestBus::EventResult(vA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetLinearVelocity); + Physics::RigidBodyRequestBus::EventResult(vB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetLinearVelocity); + EXPECT_GT(static_cast(vA.GetLength()), static_cast(vB.GetLength())); + } + + TEST_F(PhysicsComponentBusTest, SetLinearDampingNegative_DynamicSphere_NegativeValueRejected) + { + UnitTest::ErrorHandler errorHandler("Negative linear damping value"); + + EntityPtr sphere = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), 0.5f); + + float damping = 0.0f, initialDamping = 0.0f; + Physics::RigidBodyRequestBus::EventResult(initialDamping, sphere->GetId(), + &Physics::RigidBodyRequests::GetLinearDamping); + + // a negative damping value should be rejected and the damping should remain at its previous value + Physics::RigidBodyRequestBus::Event(sphere->GetId(), + &Physics::RigidBodyRequests::SetLinearDamping, -0.1f); + Physics::RigidBodyRequestBus::EventResult(damping, sphere->GetId(), + &Physics::RigidBodyRequests::GetLinearDamping); + + EXPECT_NEAR(damping, initialDamping, 1e-3f); + EXPECT_TRUE(errorHandler.GetWarningCount() > 0); + } + + TEST_F(PhysicsComponentBusTest, SetAngularDamping_DynamicSphere_MoreDampedBodyRotatesSlower) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 1.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 1.0f), 0.5f); + EntityPtr floor = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); + + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::SetAngularDamping, 0.1f); + Physics::RigidBodyRequestBus::Event(sphereB->GetId(), + &Physics::RigidBodyRequests::SetAngularDamping, 0.2f); + + float dampingA, dampingB; + Physics::RigidBodyRequestBus::EventResult(dampingA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetAngularDamping); + Physics::RigidBodyRequestBus::EventResult(dampingB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetAngularDamping); + EXPECT_NEAR(dampingA, 0.1f, 1e-3f); + EXPECT_NEAR(dampingB, 0.2f, 1e-3f); + + AZ::Vector3 impulse(10.0f, 0.0f, 0.0f); + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::ApplyLinearImpulse, impulse); + Physics::RigidBodyRequestBus::Event(sphereB->GetId(), + &Physics::RigidBodyRequests::ApplyLinearImpulse, impulse); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 10); + + auto angularVelocityA = AZ::Vector3::CreateZero(); + auto angularVelocityB = AZ::Vector3::CreateZero(); + + for (int timestep = 0; timestep < 10; timestep++) + { + Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + EXPECT_GT(static_cast(angularVelocityA.GetLength()), static_cast(angularVelocityB.GetLength())); + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + } + } + + TEST_F(PhysicsComponentBusTest, SetAngularDampingNegative_DynamicSphere_NegativeValueRejected) + { + UnitTest::ErrorHandler errorHandler("Negative angular damping value"); + + EntityPtr sphere = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), 0.5f); + + float damping = 0.0f, initialDamping = 0.0f; + Physics::RigidBodyRequestBus::EventResult(initialDamping, sphere->GetId(), + &Physics::RigidBodyRequests::GetAngularDamping); + + // a negative damping value should be rejected and the damping should remain at its previous value + Physics::RigidBodyRequestBus::Event(sphere->GetId(), + &Physics::RigidBodyRequests::SetAngularDamping, -0.1f); + Physics::RigidBodyRequestBus::EventResult(damping, sphere->GetId(), + &Physics::RigidBodyRequests::GetAngularDamping); + + EXPECT_NEAR(damping, initialDamping, 1e-3f); + EXPECT_TRUE(errorHandler.GetWarningCount() > 0); + } + + TEST_F(PhysicsComponentBusTest, AddImpulse_DynamicSphere_AffectsTrajectory) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); + + AZ::Vector3 impulse(10.0f, 0.0f, 0.0f); + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::ApplyLinearImpulse, impulse); + + for (int i = 1; i < 10; i++) + { + float xPreviousA = TestUtils::GetPositionElement(sphereA, 0); + float xPreviousB = TestUtils::GetPositionElement(sphereB, 0); + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 10); + EXPECT_GT(TestUtils::GetPositionElement(sphereA, 0), xPreviousA); + EXPECT_NEAR(TestUtils::GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); + } + } + + TEST_F(PhysicsComponentBusTest, SetLinearVelocity_DynamicSphere_AffectsTrajectory) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); + + AZ::Vector3 velocity(10.0f, 0.0f, 0.0f); + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::SetLinearVelocity, velocity); + + for (int i = 1; i < 10; i++) + { + float xPreviousA = TestUtils::GetPositionElement(sphereA, 0); + float xPreviousB = TestUtils::GetPositionElement(sphereB, 0); + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 10); + EXPECT_GT(TestUtils::GetPositionElement(sphereA, 0), xPreviousA); + EXPECT_NEAR(TestUtils::GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); + } + } + + TEST_F(PhysicsComponentBusTest, AddImpulseAtWorldPoint_DynamicSphere_AffectsTrajectoryAndRotation) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); + + AZ::Vector3 impulse(10.0f, 0.0f, 0.0f); + AZ::Vector3 worldPoint(0.0f, -5.0f, 0.25f); + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::ApplyLinearImpulseAtWorldPoint, impulse, worldPoint); + + AZ::Vector3 angularVelocityA = AZ::Vector3::CreateZero(); + AZ::Vector3 angularVelocityB = AZ::Vector3::CreateZero(); + + for (int i = 1; i < 10; i++) + { + float xPreviousA = TestUtils::GetPositionElement(sphereA, 0); + float xPreviousB = TestUtils::GetPositionElement(sphereB, 0); + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 10); + EXPECT_GT(TestUtils::GetPositionElement(sphereA, 0), xPreviousA); + EXPECT_NEAR(TestUtils::GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); + + Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + EXPECT_FALSE(angularVelocityA.IsClose(AZ::Vector3::CreateZero())); + EXPECT_NEAR(static_cast(angularVelocityA.GetX()), 0.0f, 1e-3f); + EXPECT_NEAR(static_cast(angularVelocityA.GetZ()), 0.0f, 1e-3f); + EXPECT_TRUE(angularVelocityB.IsClose(AZ::Vector3::CreateZero())); + } + } + + TEST_F(PhysicsComponentBusTest, AddAngularImpulse_DynamicSphere_AffectsRotation) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); + + AZ::Vector3 angularImpulse(0.0f, 10.0f, 0.0f); + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::ApplyAngularImpulse, angularImpulse); + + for (int i = 1; i < 10; i++) + { + float xPreviousA = TestUtils::GetPositionElement(sphereA, 0); + float xPreviousB = TestUtils::GetPositionElement(sphereB, 0); + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 10); + EXPECT_NEAR(TestUtils::GetPositionElement(sphereA, 0), xPreviousA, 1e-3f); + EXPECT_NEAR(TestUtils::GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); + + AZ::Vector3 angularVelocityA = AZ::Vector3::CreateZero(); + AZ::Vector3 angularVelocityB = AZ::Vector3::CreateZero(); + Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + EXPECT_FALSE(angularVelocityA.IsClose(AZ::Vector3::CreateZero())); + EXPECT_NEAR(static_cast(angularVelocityA.GetX()), 0.0f, 1e-3f); + EXPECT_NEAR(static_cast(angularVelocityA.GetZ()), 0.0f, 1e-3f); + EXPECT_TRUE(angularVelocityB.IsClose(AZ::Vector3::CreateZero())); + } + } + + TEST_F(PhysicsComponentBusTest, SetAngularVelocity_DynamicSphere_AffectsRotation) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 0.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 0.0f), 0.5f); + + AZ::Vector3 angularVelocity(0.0f, 10.0f, 0.0f); + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::SetAngularVelocity, angularVelocity); + + for (int i = 1; i < 10; i++) + { + float xPreviousA = TestUtils::GetPositionElement(sphereA, 0); + float xPreviousB = TestUtils::GetPositionElement(sphereB, 0); + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 10); + EXPECT_NEAR(TestUtils::GetPositionElement(sphereA, 0), xPreviousA, 1e-3f); + EXPECT_NEAR(TestUtils::GetPositionElement(sphereB, 0), xPreviousB, 1e-3f); + + AZ::Vector3 angularVelocityA = AZ::Vector3::CreateZero(); + AZ::Vector3 angularVelocityB = AZ::Vector3::CreateZero(); + Physics::RigidBodyRequestBus::EventResult(angularVelocityA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + Physics::RigidBodyRequestBus::EventResult(angularVelocityB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetAngularVelocity); + EXPECT_FALSE(angularVelocityA.IsClose(AZ::Vector3::CreateZero())); + EXPECT_NEAR(static_cast(angularVelocityA.GetX()), 0.0f, 1e-3f); + EXPECT_NEAR(static_cast(angularVelocityA.GetZ()), 0.0f, 1e-3f); + EXPECT_TRUE(angularVelocityB.IsClose(AZ::Vector3::CreateZero())); + } + } + + TEST_F(PhysicsComponentBusTest, GetLinearVelocity_FallingSphere_VelocityIncreasesOverTime) + { + EntityPtr sphere = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f), 0.5f); + Physics::RigidBodyRequestBus::Event(sphere->GetId(), + &Physics::RigidBodyRequests::SetLinearDamping, 0.0f); + + float previousSpeed = 0.0f; + + for (int timestep = 0; timestep < 60; timestep++) + { + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + AZ::Vector3 velocity; + Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), + &Physics::RigidBodyRequests::GetLinearVelocity); + float speed = velocity.GetLength(); + EXPECT_GT(speed, previousSpeed); + previousSpeed = speed; + } + } + + TEST_F(PhysicsComponentBusTest, SetSleepThreshold_RollingSpheres_LowerThresholdSphereTravelsFurther) + { + EntityPtr sphereA = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 1.0f), 0.5f); + EntityPtr sphereB = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 5.0f, 1.0f), 0.5f); + EntityPtr floor = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); + + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::SetAngularDamping, 0.75f); + Physics::RigidBodyRequestBus::Event(sphereB->GetId(), + &Physics::RigidBodyRequests::SetAngularDamping, 0.75f); + + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::SetSleepThreshold, 1.0f); + Physics::RigidBodyRequestBus::Event(sphereB->GetId(), + &Physics::RigidBodyRequests::SetSleepThreshold, 0.5f); + + float sleepThresholdA, sleepThresholdB; + Physics::RigidBodyRequestBus::EventResult(sleepThresholdA, sphereA->GetId(), + &Physics::RigidBodyRequests::GetSleepThreshold); + Physics::RigidBodyRequestBus::EventResult(sleepThresholdB, sphereB->GetId(), + &Physics::RigidBodyRequests::GetSleepThreshold); + + EXPECT_NEAR(sleepThresholdA, 1.0f, 1e-3f); + EXPECT_NEAR(sleepThresholdB, 0.5f, 1e-3f); + + AZ::Vector3 impulse(0.0f, 0.1f, 0.0f); + Physics::RigidBodyRequestBus::Event(sphereA->GetId(), + &Physics::RigidBodyRequests::ApplyAngularImpulse, impulse); + Physics::RigidBodyRequestBus::Event(sphereB->GetId(), + &Physics::RigidBodyRequests::ApplyAngularImpulse, impulse); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 300); + + EXPECT_GT(TestUtils::GetPositionElement(sphereB, 0), TestUtils::GetPositionElement(sphereA, 0)); + } + + TEST_F(PhysicsComponentBusTest, SetSleepThresholdNegative_DynamicSphere_NegativeValueRejected) + { + UnitTest::ErrorHandler errorHandler("Negative sleep threshold value"); + + EntityPtr sphere = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, -5.0f, 1.0f), 0.5f); + + float threshold = 0.0f, initialThreshold = 0.0f; + Physics::RigidBodyRequestBus::EventResult(initialThreshold, sphere->GetId(), + &Physics::RigidBodyRequests::GetSleepThreshold); + Physics::RigidBodyRequestBus::Event(sphere->GetId(), + &Physics::RigidBodyRequests::SetSleepThreshold, -0.5f); + Physics::RigidBodyRequestBus::EventResult(threshold, sphere->GetId(), + &Physics::RigidBodyRequests::GetSleepThreshold); + + EXPECT_NEAR(threshold, initialThreshold, 1e-3f); + EXPECT_TRUE(errorHandler.GetWarningCount() > 0); + } + + TEST_F(PhysicsComponentBusTest, SetMass_Seesaw_TipsDownAtHeavierEnd) + { + EntityPtr floor = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); + EntityPtr pivot = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.7f), AZ::Vector3(0.4f, 1.0f, 0.4f)); + EntityPtr seesaw = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.95f), AZ::Vector3(20.0f, 1.0f, 0.1f)); + EntityPtr boxA = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(-9.0f, 0.0f, 1.5f), AZ::Vector3::CreateOne()); + EntityPtr boxB = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(9.0f, 0.0f, 1.5f), AZ::Vector3::CreateOne()); + + Physics::RigidBodyRequestBus::Event(boxA->GetId(), &Physics::RigidBodyRequests::SetMass, 5.0f); + float mass = 0.0f; + Physics::RigidBodyRequestBus::EventResult(mass, boxA->GetId(), + &Physics::RigidBodyRequests::GetMass); + EXPECT_NEAR(mass, 5.0f, 1e-3f); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 30); + EXPECT_GT(1.5f, TestUtils::GetPositionElement(boxA, 2)); + EXPECT_LT(1.5f, TestUtils::GetPositionElement(boxB, 2)); + + Physics::RigidBodyRequestBus::Event(boxB->GetId(), &Physics::RigidBodyRequests::SetMass, 20.0f); + Physics::RigidBodyRequestBus::EventResult(mass, boxB->GetId(), + &Physics::RigidBodyRequests::GetMass); + EXPECT_NEAR(mass, 20.0f, 1e-3f); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 60); + EXPECT_LT(1.5f, TestUtils::GetPositionElement(boxA, 2)); + EXPECT_GT(1.5f, TestUtils::GetPositionElement(boxB, 2)); + } + + TEST_F(PhysicsComponentBusTest, GetAabb_Sphere_ValidExtents) + { + AZ::Vector3 spherePosition(2.0f, -3.0f, 1.0f); + EntityPtr sphere = TestUtils::CreateSphereEntity(m_testSceneHandle, spherePosition, 0.5f); + + AZ::Aabb sphereAabb; + Physics::RigidBodyRequestBus::EventResult(sphereAabb, sphere->GetId(), + &Physics::RigidBodyRequests::GetAabb); + + EXPECT_TRUE(sphereAabb.GetMin().IsClose(spherePosition - 0.5f * AZ::Vector3::CreateOne())); + EXPECT_TRUE(sphereAabb.GetMax().IsClose(spherePosition + 0.5f * AZ::Vector3::CreateOne())); + + // rotate the sphere and check the bounding box is still correct + AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); + AZ::TransformBus::Event(sphere->GetId(), &AZ::TransformInterface::SetWorldTM, + AZ::Transform::CreateFromQuaternionAndTranslation(quat, spherePosition)); + sphere->Deactivate(); + sphere->Activate(); + + Physics::RigidBodyRequestBus::EventResult(sphereAabb, sphere->GetId(), + &Physics::RigidBodyRequests::GetAabb); + + EXPECT_TRUE(sphereAabb.GetMin().IsClose(spherePosition - 0.5f * AZ::Vector3::CreateOne())); + EXPECT_TRUE(sphereAabb.GetMax().IsClose(spherePosition + 0.5f * AZ::Vector3::CreateOne())); + } + + TEST_F(PhysicsComponentBusTest, GetAabb_Box_ValidExtents) + { + AZ::Vector3 boxPosition(2.0f, -3.0f, 1.0f); + AZ::Vector3 boxDimensions(3.0f, 4.0f, 5.0f); + EntityPtr box = TestUtils::CreateBoxEntity(m_testSceneHandle, boxPosition, boxDimensions); + + AZ::Aabb boxAabb; + Physics::RigidBodyRequestBus::EventResult(boxAabb, box->GetId(), + &Physics::RigidBodyRequests::GetAabb); + + EXPECT_TRUE(boxAabb.GetMin().IsClose(boxPosition - 0.5f * boxDimensions)); + EXPECT_TRUE(boxAabb.GetMax().IsClose(boxPosition + 0.5f * boxDimensions)); + + // rotate the box and check the bounding box is still correct + AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); + AZ::TransformBus::Event(box->GetId(), &AZ::TransformInterface::SetWorldTM, + AZ::Transform::CreateFromQuaternionAndTranslation(quat, boxPosition)); + box->Deactivate(); + box->Activate(); + + Physics::RigidBodyRequestBus::EventResult(boxAabb, box->GetId(), + &Physics::RigidBodyRequests::GetAabb); + + AZ::Vector3 expectedRotatedDimensions(3.5f * sqrtf(2.0f), 3.5f * sqrtf(2.0f), 5.0f); + EXPECT_TRUE(boxAabb.GetMin().IsClose(boxPosition - 0.5f * expectedRotatedDimensions)); + EXPECT_TRUE(boxAabb.GetMax().IsClose(boxPosition + 0.5f * expectedRotatedDimensions)); + } + + TEST_F(PhysicsComponentBusTest, GetAabb_Capsule_ValidExtents) + { + AZ::Vector3 capsulePosition(1.0f, -3.0f, 5.0f); + float capsuleHeight = 2.0f; + float capsuleRadius = 0.3f; + EntityPtr capsule = TestUtils::CreateCapsuleEntity(m_testSceneHandle, capsulePosition, capsuleHeight, capsuleRadius); + + AZ::Aabb capsuleAabb; + Physics::RigidBodyRequestBus::EventResult(capsuleAabb, capsule->GetId(), + &Physics::RigidBodyRequests::GetAabb); + + AZ::Vector3 expectedCapsuleHalfExtents(capsuleRadius, capsuleRadius, 0.5f * capsuleHeight); + + EXPECT_TRUE(capsuleAabb.GetMin().IsClose(capsulePosition - expectedCapsuleHalfExtents)); + EXPECT_TRUE(capsuleAabb.GetMax().IsClose(capsulePosition + expectedCapsuleHalfExtents)); + + // rotate the capsule and check the bounding box is still correct + AZ::Quaternion quat = AZ::Quaternion::CreateRotationY(0.25f * AZ::Constants::Pi); + AZ::TransformBus::Event(capsule->GetId(), &AZ::TransformInterface::SetWorldTM, + AZ::Transform::CreateFromQuaternionAndTranslation(quat, capsulePosition)); + capsule->Deactivate(); + capsule->Activate(); + + Physics::RigidBodyRequestBus::EventResult(capsuleAabb, capsule->GetId(), + &Physics::RigidBodyRequests::GetAabb); + + float rotatedHalfHeight = 0.25f * sqrtf(2.0f) * capsuleHeight + (1.0f - 0.5f * sqrt(2.0f)) * capsuleRadius; + expectedCapsuleHalfExtents = AZ::Vector3(rotatedHalfHeight, capsuleRadius, rotatedHalfHeight); + EXPECT_TRUE(capsuleAabb.GetMin().IsClose(capsulePosition - expectedCapsuleHalfExtents)); + EXPECT_TRUE(capsuleAabb.GetMax().IsClose(capsulePosition + expectedCapsuleHalfExtents)); + } + + TEST_F(PhysicsComponentBusTest, ForceAwakeForceAsleep_DynamicSphere_SleepStateCorrect) + { + EntityPtr floor = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(100.0f, 100.0f, 1.0f)); + EntityPtr boxA = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(-5.0f, 0.0f, 1.0f), AZ::Vector3::CreateOne()); + EntityPtr boxB = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(5.0f, 0.0f, 100.0f), AZ::Vector3::CreateOne()); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 60); + bool isAwakeA = false; + bool isAwakeB = false; + Physics::RigidBodyRequestBus::EventResult(isAwakeA, boxA->GetId(), + &Physics::RigidBodyRequests::IsAwake); + Physics::RigidBodyRequestBus::EventResult(isAwakeB, boxB->GetId(), + &Physics::RigidBodyRequests::IsAwake); + + EXPECT_FALSE(isAwakeA); + EXPECT_TRUE(isAwakeB); + + Physics::RigidBodyRequestBus::Event(boxA->GetId(), &Physics::RigidBodyRequests::ForceAwake); + Physics::RigidBodyRequestBus::Event(boxB->GetId(), &Physics::RigidBodyRequests::ForceAsleep); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + + Physics::RigidBodyRequestBus::EventResult(isAwakeA, boxA->GetId(), + &Physics::RigidBodyRequests::IsAwake); + Physics::RigidBodyRequestBus::EventResult(isAwakeB, boxB->GetId(), + &Physics::RigidBodyRequests::IsAwake); + + EXPECT_TRUE(isAwakeA); + EXPECT_FALSE(isAwakeB); + + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 60); + + Physics::RigidBodyRequestBus::EventResult(isAwakeA, boxA->GetId(), + &Physics::RigidBodyRequests::IsAwake); + Physics::RigidBodyRequestBus::EventResult(isAwakeB, boxB->GetId(), + &Physics::RigidBodyRequests::IsAwake); + + EXPECT_FALSE(isAwakeA); + EXPECT_FALSE(isAwakeB); + } + + TEST_F(PhysicsComponentBusTest, DisableEnablePhysics_DynamicSphere) + { + using namespace AzFramework; + + EntityPtr sphere = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f), 0.5f); + Physics::RigidBodyRequestBus::Event(sphere->GetId(), &Physics::RigidBodyRequests::SetLinearDamping, 0.0f); + + AZ::Vector3 velocity; + float previousSpeed = 0.0f; + for (int timestep = 0; timestep < 30; timestep++) + { + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), &Physics::RigidBodyRequests::GetLinearVelocity); + previousSpeed = velocity.GetLength(); + } + + // Disable physics + Physics::RigidBodyRequestBus::Event(sphere->GetId(), &Physics::RigidBodyRequests::DisablePhysics); + + // Check speed is not changing + for (int timestep = 0; timestep < 60; timestep++) + { + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), &Physics::RigidBodyRequests::GetLinearVelocity); + float speed = velocity.GetLength(); + EXPECT_FLOAT_EQ(speed, previousSpeed); + previousSpeed = speed; + } + + // Check physics is disabled + bool physicsEnabled = true; + Physics::RigidBodyRequestBus::EventResult(physicsEnabled, sphere->GetId(), &Physics::RigidBodyRequests::IsPhysicsEnabled); + EXPECT_FALSE(physicsEnabled); + + // Enable physics + Physics::RigidBodyRequestBus::Event(sphere->GetId(), &Physics::RigidBodyRequests::EnablePhysics); + + // Check speed is increasing + for (int timestep = 0; timestep < 60; timestep++) + { + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + Physics::RigidBodyRequestBus::EventResult(velocity, sphere->GetId(), &Physics::RigidBodyRequests::GetLinearVelocity); + float speed = velocity.GetLength(); + EXPECT_GT(speed, previousSpeed); + previousSpeed = speed; + } + } + + TEST_F(PhysicsComponentBusTest, Shape_Box_GetAabbIsCorrect) + { + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration; + shapeConfiguration.m_dimensions = AZ::Vector3(20.f, 20.f, 20.f); + AZStd::shared_ptr shape; + Physics::SystemRequestBus::BroadcastResult(shape, &Physics::SystemRequests::CreateShape, colliderConfig, shapeConfiguration); + const AZ::Aabb localAabb = shape->GetAabbLocal(); + EXPECT_TRUE(localAabb.GetMin().IsClose(-shapeConfiguration.m_dimensions / 2.f) + && localAabb.GetMax().IsClose(shapeConfiguration.m_dimensions / 2.f)); + + AZ::Vector3 worldOffset = AZ::Vector3(0, 0, 40.f); + AZ::Transform worldTransform = AZ::Transform::Identity(); + worldTransform.SetTranslation(worldOffset); + const AZ::Aabb worldAabb = shape->GetAabb(worldTransform); + EXPECT_TRUE(worldAabb.GetMin().IsClose((-shapeConfiguration.m_dimensions / 2.f) + worldOffset) + && worldAabb.GetMax().IsClose((shapeConfiguration.m_dimensions / 2.f) + worldOffset)); + } + + TEST_F(PhysicsComponentBusTest, Shape_Sphere_GetAabbIsCorrect) + { + const float radius = 20.f; + Physics::ColliderConfiguration colliderConfig; + Physics::SphereShapeConfiguration shapeConfiguration; + shapeConfiguration.m_radius = radius; + AZStd::shared_ptr shape; + Physics::SystemRequestBus::BroadcastResult(shape, &Physics::SystemRequests::CreateShape, colliderConfig, shapeConfiguration); + const AZ::Aabb localAabb = shape->GetAabbLocal(); + EXPECT_TRUE(localAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -radius)) + && localAabb.GetMax().IsClose(AZ::Vector3(radius, radius, radius))); + + AZ::Vector3 worldOffset = AZ::Vector3(0, 0, 40.f); + AZ::Transform worldTransform = AZ::Transform::Identity(); + worldTransform.SetTranslation(worldOffset); + const AZ::Aabb worldAabb = shape->GetAabb(worldTransform); + EXPECT_TRUE(worldAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -radius) + worldOffset) + && worldAabb.GetMax().IsClose(AZ::Vector3(radius, radius, radius) + worldOffset)); + } + + TEST_F(PhysicsComponentBusTest, Shape_Capsule_GetAabbIsCorrect) + { + const float radius = 20.f; + const float height = 80.f; + Physics::ColliderConfiguration colliderConfig; + Physics::CapsuleShapeConfiguration shapeConfiguration; + shapeConfiguration.m_radius = radius; + shapeConfiguration.m_height = height; + AZStd::shared_ptr shape; + Physics::SystemRequestBus::BroadcastResult(shape, &Physics::SystemRequests::CreateShape, colliderConfig, shapeConfiguration); + const AZ::Aabb localAabb = shape->GetAabbLocal(); + EXPECT_TRUE(localAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -height / 2.f)) + && localAabb.GetMax().IsClose(AZ::Vector3(radius, radius, height / 2.f))); + + AZ::Vector3 worldOffset = AZ::Vector3(0, 0, 40.f); + AZ::Transform worldTransform = AZ::Transform::Identity(); + worldTransform.SetTranslation(worldOffset); + const AZ::Aabb worldAabb = shape->GetAabb(worldTransform); + EXPECT_TRUE(worldAabb.GetMin().IsClose(AZ::Vector3(-radius, -radius, -height / 2.f) + worldOffset) + && worldAabb.GetMax().IsClose(AZ::Vector3(radius, radius, height / 2.f) + worldOffset)); + } + + TEST_F(PhysicsComponentBusTest, WorldBodyBus_RigidBodyColliders_AABBAreCorrect) + { + // Create 3 colliders, one of each type and check that the AABB of their body is the expected + EntityPtr box = TestUtils::CreateBoxEntity(m_testSceneHandle, AZ::Vector3(0, 0, 0), AZ::Vector3(32, 32, 32)); + AZ::Aabb boxAABB; + Physics::WorldBodyRequestBus::EventResult(boxAABB, box->GetId(), &Physics::WorldBodyRequests::GetAabb); + EXPECT_TRUE(boxAABB.GetMin().IsClose(AZ::Vector3(-16, -16, -16)) && boxAABB.GetMax().IsClose(AZ::Vector3(16, 16, 16))); + + EntityPtr sphere = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(-100, 0, 0), 16); + AZ::Aabb sphereAABB; + Physics::WorldBodyRequestBus::EventResult(sphereAABB, sphere->GetId(), &Physics::WorldBodyRequests::GetAabb); + EXPECT_TRUE(sphereAABB.GetMin().IsClose(AZ::Vector3(-16 -100, -16, -16)) && sphereAABB.GetMax().IsClose(AZ::Vector3(16 -100, 16, 16))); + + EntityPtr capsule = TestUtils::CreateCapsuleEntity(m_testSceneHandle, AZ::Vector3(100, 0, 0), 128, 16); + AZ::Aabb capsuleAABB; + Physics::WorldBodyRequestBus::EventResult(capsuleAABB, capsule->GetId(), &Physics::WorldBodyRequests::GetAabb); + EXPECT_TRUE(capsuleAABB.GetMin().IsClose(AZ::Vector3(-16 +100, -16, -64)) && capsuleAABB.GetMax().IsClose(AZ::Vector3(16 +100, 16, 64))); + } + + TEST_F(PhysicsComponentBusTest, WorldBodyBus_StaticRigidBodyColliders_AABBAreCorrect) + { + // Create 3 colliders, one of each type and check that the AABB of their body is the expected + EntityPtr box = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(0, 0, 0), AZ::Vector3(32, 32, 32)); + AZ::Aabb boxAABB; + Physics::WorldBodyRequestBus::EventResult(boxAABB, box->GetId(), &Physics::WorldBodyRequests::GetAabb); + EXPECT_TRUE(boxAABB.GetMin().IsClose(AZ::Vector3(-16, -16, -16)) && boxAABB.GetMax().IsClose(AZ::Vector3(16, 16, 16))); + + EntityPtr sphere = TestUtils::CreateStaticSphereEntity(m_testSceneHandle, AZ::Vector3(-100, 0, 0), 16); + AZ::Aabb sphereAABB; + Physics::WorldBodyRequestBus::EventResult(sphereAABB, sphere->GetId(), &Physics::WorldBodyRequests::GetAabb); + EXPECT_TRUE(sphereAABB.GetMin().IsClose(AZ::Vector3(-16 -100, -16, -16)) && sphereAABB.GetMax().IsClose(AZ::Vector3(16 -100, 16, 16))); + + EntityPtr capsule = TestUtils::CreateStaticCapsuleEntity(m_testSceneHandle, AZ::Vector3(100, 0, 0), 128, 16); + AZ::Aabb capsuleAABB; + Physics::WorldBodyRequestBus::EventResult(capsuleAABB, capsule->GetId(), &Physics::WorldBodyRequests::GetAabb); + EXPECT_TRUE(capsuleAABB.GetMin().IsClose(AZ::Vector3(-16 +100, -16, -64)) && capsuleAABB.GetMax().IsClose(AZ::Vector3(16 +100, 16, 64))); + } + + using CreateEntityFunc = AZStd::function; + + void CheckDisableEnablePhysics(AZStd::vector entityCreations, AzPhysics::SceneHandle sceneHandle) + { + auto* sceneInterface = AZ::Interface::Get(); + int i = 0; + for (CreateEntityFunc& entityCreation : entityCreations) + { + AZ::Vector3 entityPos = AZ::Vector3(128.f * i, 0, 0); + EntityPtr entity = entityCreation(entityPos); + + AzPhysics::RayCastRequest request; + request.m_start = entityPos + AZ::Vector3(0, 0, 100); + request.m_direction = AZ::Vector3(0, 0, -1); + request.m_distance = 200.f; + + Physics::WorldBodyRequestBus::Event(entity->GetId(), &Physics::WorldBodyRequests::DisablePhysics); + + bool enabled = true; + Physics::WorldBodyRequestBus::EventResult(enabled, entity->GetId(), &Physics::WorldBodyRequests::IsPhysicsEnabled); + EXPECT_FALSE(enabled); + + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(sceneHandle, &request); + EXPECT_FALSE(result); + + Physics::WorldBodyRequestBus::Event(entity->GetId(), &Physics::WorldBodyRequests::EnablePhysics); + + enabled = false; + Physics::WorldBodyRequestBus::EventResult(enabled, entity->GetId(), &Physics::WorldBodyRequests::IsPhysicsEnabled); + EXPECT_TRUE(enabled); + + result = sceneInterface->QueryScene(sceneHandle, &request); + EXPECT_TRUE(result); + EXPECT_TRUE(result.m_hits.size() == 1); + EXPECT_TRUE(result.m_hits[0].m_entityId == entity->GetId()); + + ++i; + } + } + + TEST_F(PhysicsComponentBusTest, WorldBodyBus_EnableDisablePhysics_StaticRigidBody) + { + AZStd::vector entityCreations = + { + [this](const AZ::Vector3& position) { return TestUtils::CreateStaticBoxEntity(m_testSceneHandle, position, AZ::Vector3(32, 32, 32)); }, + [this](const AZ::Vector3& position) { return TestUtils::CreateStaticSphereEntity(m_testSceneHandle, position, 16); }, + [this](const AZ::Vector3& position) { return TestUtils::CreateStaticCapsuleEntity(m_testSceneHandle, position, 16, 16); } + }; + CheckDisableEnablePhysics(entityCreations, m_testSceneHandle); + } + + TEST_F(PhysicsComponentBusTest, WorldBodyBus_EnableDisablePhysics_RigidBody) + { + AZStd::vector entityCreations = + { + [this](const AZ::Vector3& position) { return TestUtils::CreateBoxEntity(m_testSceneHandle, position, AZ::Vector3(32, 32, 32)); }, + [this](const AZ::Vector3& position) { return TestUtils::CreateSphereEntity(m_testSceneHandle, position, 16); }, + [this](const AZ::Vector3& position) { return TestUtils::CreateCapsuleEntity(m_testSceneHandle, position, 16, 16); } + }; + CheckDisableEnablePhysics(entityCreations, m_testSceneHandle); + } + + TEST_F(PhysicsComponentBusTest, WorldBodyRayCast_CastAgainstStaticBox_ReturnsHit) + { + EntityPtr staticBoxEntity = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3(0.0f), AZ::Vector3(10.f, 10.f, 10.f)); + + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + AzPhysics::SceneQueryHit hit; + Physics::WorldBodyRequestBus::EventResult(hit, staticBoxEntity->GetId(), &Physics::WorldBodyRequests::RayCast, request); + + EXPECT_TRUE(hit); + + bool hitIncludeSphereEntity = (hit.m_entityId == staticBoxEntity->GetId()); + EXPECT_TRUE(hitIncludeSphereEntity); + } + + using RayCastFunc = AZStd::function; + class PhysicsRigidBodyRayBusTest + : public GenericPhysicsInterfaceTest + , public ::testing::WithParamInterface + { + }; + + TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstNothing_ReturnsNoHit) + { + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit hit = rayCastFunction(AZ::EntityId(), request); + + EXPECT_FALSE(hit); + } + + TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstSphere_ReturnsHit) + { + EntityPtr sphereEntity = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f), 10.0f); + + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit hit = rayCastFunction(sphereEntity->GetId(), request); + + EXPECT_TRUE(hit); + + bool hitsIncludeSphereEntity = (hit.m_entityId == sphereEntity->GetId()); + EXPECT_TRUE(hitsIncludeSphereEntity); + } + + TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstBoxEntityWithLocalOffset_ReturnsHit) + { + const AZ::Vector3 boxExtent = AZ::Vector3(10.0f, 10.0f, 10.0f); + const AZ::Vector3 box1Offset(0.0f, 0.0f, 30.0f); + const AZ::Vector3 box2Offset(0.0f, 0.0f, -30.0f); + + MultiShapeConfig config; + config.m_position = AZ::Vector3(0.0f, 100.0f, 20.0f); + config.m_shapes.AddBox(boxExtent, box1Offset); + config.m_shapes.AddBox(boxExtent, box2Offset); + + auto shapeWithTwoBoxes = AddMultiShapeEntity(config); + + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 100.0f, 50.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); + + EXPECT_TRUE(result); + + bool hitIncludeEntity = (result.m_entityId == shapeWithTwoBoxes->GetId()); + EXPECT_TRUE(hitIncludeEntity); + } + + TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstBoxEntityWithMultipleShapesLocalOffset_ReturnsHits) + { + // Entity at (0, 100, 20) with two box childs with offsets +30 and -30 in Z. + // Child boxes world position centers are at (0, 100, 50) and (0, 100, -10) + // 4 rays tests that should retrieves the correct boxes + + const AZ::Vector3 boxExtent = AZ::Vector3(10.0f, 10.0f, 10.0f); + const AZ::Vector3 box1Offset(0.0f, 0.0f, 30.0f); + const AZ::Vector3 box2Offset(0.0f, 0.0f, -30.0f); + + MultiShapeConfig config; + config.m_position = AZ::Vector3(0.0f, 100.0f, 20.0f); + config.m_shapes.AddBox(boxExtent, box1Offset); + config.m_shapes.AddBox(boxExtent, box2Offset); + + AZStd::unique_ptr shapeWithTwoBoxes(AddMultiShapeEntity(config)); + AZStd::vector> shapes; + PhysX::ColliderComponentRequestBus::EventResult(shapes, shapeWithTwoBoxes->GetId(), &PhysX::ColliderComponentRequests::GetShapes); + + // Upper box part z=50 (-x to +x) + { + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 100.0f, 50.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); + + EXPECT_TRUE(result); + bool hitIncludesEntity = (result.m_entityId == shapeWithTwoBoxes->GetId()); + EXPECT_TRUE(hitIncludesEntity); + bool hitIncludesShape = (result.m_shape == shapes[0].get()); + EXPECT_TRUE(hitIncludesShape); + } + + // Lower box part z=-10 (-x to +x) + { + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 100.0f, -10.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); + + EXPECT_TRUE(result); + bool hitIncludesEntity = (result.m_entityId == shapeWithTwoBoxes->GetId()); + EXPECT_TRUE(hitIncludesEntity); + bool hitIncludesShape = (result.m_shape == shapes[1].get()); + EXPECT_TRUE(hitIncludesShape); + } + + // Trace Vertically from top, it should retrieve the upper box shape + { + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 100.0f, 80.0f); + request.m_direction = AZ::Vector3(0.0f, 0.0f, -1.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); + + EXPECT_TRUE(result); + bool hitIncludesEntity = (result.m_entityId == shapeWithTwoBoxes->GetId()); + EXPECT_TRUE(hitIncludesEntity); + bool hitIncludesShape = (result.m_shape == shapes[0].get()); + EXPECT_TRUE(hitIncludesShape); + } + + // Trace Vertically from bottom, it should retrieve the lower box shape + { + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 100.0f, -80.0f); + request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit result = rayCastFunction(shapeWithTwoBoxes->GetId(), request); + + EXPECT_TRUE(result); + bool hitIncludesEntity = (result.m_entityId == shapeWithTwoBoxes->GetId()); + EXPECT_TRUE(hitIncludesEntity); + bool hitIncludesShape = (result.m_shape == shapes[1].get()); + EXPECT_TRUE(hitIncludesShape); + } + } + + TEST_P(PhysicsRigidBodyRayBusTest, ComponentRayCast_CastAgainstBoxEntityLocalOffsetAndRotation_ReturnsHits) + { + // Entity at (0,0,0) rotated by 90 degrees and child box offset (0,100,0). + // World position of the child should be (-100, 0, 0). + // This tests raycasts from (0, 0, 0) to (-200, 0 ,0) checking that collides with the box + + const AZ::Vector3 boxExtent = AZ::Vector3(10.0f, 10.0f, 10.0f); + const AZ::Vector3 boxOffset(0.0f, 100.0f, 0.0f); + + MultiShapeConfig config; + config.m_position = AZ::Vector3(0.0f, 0.0f, 0.0f); + config.m_rotation = AZ::Vector3(0, 0, AZ::Constants::HalfPi); + config.m_shapes.AddBox(boxExtent, boxOffset); + + AZStd::unique_ptr shapeWithOneBox(AddMultiShapeEntity(config)); + AZStd::vector> shapes; + PhysX::ColliderComponentRequestBus::EventResult(shapes, shapeWithOneBox->GetId(), &PhysX::ColliderComponentRequests::GetShapes); + + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(-1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + auto rayCastFunction = GetParam(); + AzPhysics::SceneQueryHit result = rayCastFunction(shapeWithOneBox->GetId(), request); + + EXPECT_TRUE(result); + bool hitIncludesEntity = (result.m_entityId == shapeWithOneBox->GetId()); + EXPECT_TRUE(hitIncludesEntity); + bool hitIncludesShape = (result.m_shape == shapes[0].get()); + EXPECT_TRUE(hitIncludesShape); + } + + static const RayCastFunc RigidBodyRaycastEBusCall = []([[maybe_unused]] AZ::EntityId entityId, [[maybe_unused]] const AzPhysics::RayCastRequest& request) + { + AzPhysics::SceneQueryHit ret; + Physics::RigidBodyRequestBus::EventResult(ret, entityId, &Physics::RigidBodyRequests::RayCast, request); + return ret; + }; + + static const RayCastFunc WorldBodyRaycastEBusCall = []([[maybe_unused]] AZ::EntityId entityId, [[maybe_unused]] const AzPhysics::RayCastRequest& request) + { + AzPhysics::SceneQueryHit ret; + Physics::WorldBodyRequestBus::EventResult(ret, entityId, &Physics::WorldBodyRequests::RayCast, request); + return ret; + }; + + INSTANTIATE_TEST_CASE_P(, PhysicsRigidBodyRayBusTest, + ::testing::Values(RigidBodyRaycastEBusCall, WorldBodyRaycastEBusCall), + // Provide nice names for the tests runs + [](const testing::TestParamInfo& info) + { + const char* name = ""; + switch (info.index) + { + case 0: + name = "RigidBodyRequestBus"; + break; + case 1: + name = "WorldBodyRequestBus"; + break; + } + return name; + }); + + +} // namespace Physics diff --git a/Gems/PhysX/Code/Tests/PhysXEditorTest.cpp b/Gems/PhysX/Code/Tests/PhysXEditorTest.cpp index 8467de798e..863c47b02f 100644 --- a/Gems/PhysX/Code/Tests/PhysXEditorTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXEditorTest.cpp @@ -26,9 +26,27 @@ #include #include #include +#include namespace Physics { + class PhysXEditorTestToolsApplication + : public UnitTest::ToolsTestApplication + { + public: + PhysXEditorTestToolsApplication(AZStd::string appName) + : UnitTest::ToolsTestApplication(AZStd::move(appName)) + { + } + + bool IsPrefabSystemEnabled() const override + { + // Some physx tests fail if prefabs are enabled for the application, + // for now, make them use slices + return false; + } + }; + class PhysXEditorTestEnvironment : public AZ::Test::GemTestEnvironment { @@ -91,7 +109,7 @@ namespace Physics AZ::ComponentApplication* CreateApplicationInstance() override { - return aznew AzToolsFramework::ToolsApplication; + return aznew PhysXEditorTestToolsApplication("PhysXEditor"); } AZStd::unique_ptr m_fileIo; diff --git a/Gems/PhysX/Code/Tests/PhysXForceRegionTest.cpp b/Gems/PhysX/Code/Tests/PhysXForceRegionTest.cpp index b490a2e4c1..2fd30affce 100644 --- a/Gems/PhysX/Code/Tests/PhysXForceRegionTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXForceRegionTest.cpp @@ -30,10 +30,9 @@ #include #include #include -#include -#include -#include #include +#include +#include #include @@ -52,19 +51,15 @@ namespace PhysX class PhysXForceRegionTest : public::testing::Test , protected Physics::DefaultWorldBus::Handler - , protected Physics::WorldEventHandler { void SetUp() override { if (auto* physicsSystem = AZ::Interface::Get()) { AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = Physics::DefaultPhysicsWorldId; + sceneConfiguration.m_sceneName = AzPhysics::DefaultPhysicsSceneName; m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); - if (m_defaultScene = physicsSystem->GetScene(m_testSceneHandle)) - { - m_defaultScene->GetLegacyWorld()->SetEventHandler(this); - } + m_defaultScene = physicsSystem->GetScene(m_testSceneHandle); } Physics::DefaultWorldBus::Handler::BusConnect(); @@ -84,37 +79,10 @@ namespace PhysX TestUtils::ResetPhysXSystem(); } - // DefaultWorldBus - AZStd::shared_ptr GetDefaultWorld() override - { - return m_defaultScene->GetLegacyWorld(); - } - - // WorldEventHandler - void OnCollisionBegin(const Physics::CollisionEvent&) override //Not used in force region tests + // DefaultWorldBus + AzPhysics::SceneHandle GetDefaultSceneHandle() const override { - } - - void OnCollisionPersist(const Physics::CollisionEvent&) override //Not used in force region tests - { - } - - void OnCollisionEnd(const Physics::CollisionEvent&) override //Not used in force region tests - { - } - - void OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) override - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId() - , &Physics::TriggerNotifications::OnTriggerEnter - , triggerEvent); - } - - void OnTriggerExit(const Physics::TriggerEvent& triggerEvent) override - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId() - , &Physics::TriggerNotifications::OnTriggerExit - , triggerEvent); + return m_testSceneHandle; } AzPhysics::Scene* m_defaultScene = nullptr; @@ -125,10 +93,15 @@ namespace PhysX { return m_defaultScene; } + AzPhysics::SceneHandle GetTestSceneHandle() const + { + return m_testSceneHandle; + } }; AZStd::unique_ptr AddTestRigidBodyCollider(AZ::Vector3& position , ForceType forceType + , AzPhysics::SceneHandle sceneHandle , const char* name = "TestObjectEntity") { AZStd::unique_ptr entity(aznew AZ::Entity(name)); @@ -146,9 +119,9 @@ namespace PhysX auto boxColliderComponent = entity->CreateComponent(); boxColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfiguration, boxShapeConfiguration) }); - Physics::RigidBodyConfiguration rigidBodyConfig; + AzPhysics::RigidBodyConfiguration rigidBodyConfig; rigidBodyConfig.m_computeMass = false; - entity->CreateComponent(rigidBodyConfig); + entity->CreateComponent(rigidBodyConfig, sceneHandle); entity->Init(); entity->Activate(); @@ -260,17 +233,17 @@ namespace PhysX } template - AZ::Vector3 TestForceVolume(AzPhysics::Scene* scene, ForceType forceType) + AZ::Vector3 TestForceVolume(AzPhysics::SceneHandle sceneHandle, ForceType forceType) { AZ::Vector3 velocity = AZ::Vector3::CreateZero(); AZ::Vector3 position(0.0f, 0.0f, 16.0f); - auto rigidBodyCollider = AddTestRigidBodyCollider(position, forceType, "TestBox"); + auto rigidBodyCollider = AddTestRigidBodyCollider(position, forceType, sceneHandle, "TestBox" ); auto forceRegion = AddForceRegion(AZ::Vector3(0.0f, 0.0f, 12.0f), forceType); //Run simulation for a while - bounces box once on force volume constexpr const float deltaTime = 1.0f / 180.0f; - TestUtils::UpdateScene(scene, deltaTime, 240); + TestUtils::UpdateScene(sceneHandle, deltaTime, 240); Physics::RigidBodyRequestBus::EventResult(velocity , rigidBodyCollider->GetId() @@ -280,7 +253,7 @@ namespace PhysX } template - void TestAppliesSameMagnitude(AzPhysics::Scene* scene, ForceType forceType) + void TestAppliesSameMagnitude(AzPhysics::SceneHandle sceneHandle, ForceType forceType) { struct ForceRegionMagnitudeChecker : public ForceRegionNotificationBus::Handler @@ -306,12 +279,12 @@ namespace PhysX bool m_failed = false; }; ForceRegionMagnitudeChecker magnitudeChecker; - TestForceVolume(scene, forceType); + TestForceVolume(sceneHandle, forceType); } TEST_F(PhysXForceRegionTest, ForceRegion_WorldSpaceForce_EntityVelocityZPositive) { - AZ::Vector3 entityVelocity = TestForceVolume(GetTestScene(), WorldSpaceForce); + AZ::Vector3 entityVelocity = TestForceVolume(GetTestSceneHandle(), WorldSpaceForce); // World space force direction: AZ::Vector3(0.0f, 0.0f, 1.0f) EXPECT_TRUE(entityVelocity.GetZ() > 0.0f); // World space force causes box to bounce upwards EXPECT_NEAR(entityVelocity.GetX(), 0.0f, AZ::Constants::FloatEpsilon); @@ -320,7 +293,7 @@ namespace PhysX TEST_F(PhysXForceRegionTest, ForceRegion_LocalSpaceForce_EntityVelocityZPositive) { - AZ::Vector3 entityVelocity = TestForceVolume(GetTestScene(), LocalSpaceForce); + AZ::Vector3 entityVelocity = TestForceVolume(GetTestSceneHandle(), LocalSpaceForce); // Local space force direction: AZ::Vector3(0.0f, 0.0f, 1.0f) // Force region was rotated about Y-axis by 90 deg EXPECT_TRUE(entityVelocity.GetX() > 0.0f); // Falling body should be moving in positive X direction since force region is rotated. @@ -333,7 +306,7 @@ namespace PhysX // Falling body was positioned at AZ::Vector3(0.05f, 0.0f, 16.0f) // Force region was positioned at AZ::Vector3(0.0f, 0.0f, 12.0f) // PointForce causes box to bounce upwards and to the right. - AZ::Vector3 entityVelocity = TestForceVolume(GetTestScene(), PointForce); + AZ::Vector3 entityVelocity = TestForceVolume(GetTestSceneHandle(), PointForce); EXPECT_TRUE(entityVelocity.GetX() > 0.0f); EXPECT_NEAR(entityVelocity.GetY(), 0.0f, AZ::Constants::FloatEpsilon); EXPECT_TRUE(entityVelocity.GetZ() > 0.0f); @@ -341,7 +314,7 @@ namespace PhysX TEST_F(PhysXForceRegionTest, ForceRegion_SplineFollowForce_EntityVelocitySpecificValue) { - AZ::Vector3 entityVelocity = TestForceVolume(GetTestScene(), SplineFollowForce); + AZ::Vector3 entityVelocity = TestForceVolume(GetTestSceneHandle(), SplineFollowForce); // Follow spline direction towards positive X and Y. EXPECT_TRUE(entityVelocity.GetX() > 0.0f); EXPECT_TRUE(entityVelocity.GetY() > 0.0f); @@ -349,7 +322,7 @@ namespace PhysX TEST_F(PhysXForceRegionTest, ForceRegion_SimpleDragForce_EntityVelocitySpecificValue) { - AZ::Vector3 entityVelocity = TestForceVolume(GetTestScene(), SimpleDragForce); + AZ::Vector3 entityVelocity = TestForceVolume(GetTestSceneHandle(), SimpleDragForce); EXPECT_TRUE(entityVelocity.GetZ() > -12.65f); // Falling velocity should be slower than free fall velocity, which is -12.65. EXPECT_NEAR(entityVelocity.GetX(), 0.0f, AZ::Constants::FloatEpsilon); // Dragging should not change original direction. EXPECT_NEAR(entityVelocity.GetY(), 0.0f, AZ::Constants::FloatEpsilon); // Dragging should not change original direction. @@ -357,7 +330,7 @@ namespace PhysX TEST_F(PhysXForceRegionTest, ForceRegion_LinearDampingForce_EntityVelocitySpecificValue) { - AZ::Vector3 entityVelocity = TestForceVolume(GetTestScene(), LinearDampingForce); + AZ::Vector3 entityVelocity = TestForceVolume(GetTestSceneHandle(), LinearDampingForce); EXPECT_TRUE(entityVelocity.GetZ() > -12.65f); // Falling velocity should be slower than free fall velocity, which is -12.65. EXPECT_NEAR(entityVelocity.GetX(), 0.0f, AZ::Constants::FloatEpsilon); // Damping should not change original direction. EXPECT_NEAR(entityVelocity.GetY(), 0.0f, AZ::Constants::FloatEpsilon); // Damping should not change original direction. @@ -365,17 +338,17 @@ namespace PhysX TEST_F(PhysXForceRegionTest, ForceRegion_PointForce_AppliesSameMagnitude) { - TestAppliesSameMagnitude(GetTestScene(), PointForce); + TestAppliesSameMagnitude(GetTestSceneHandle(), PointForce); } TEST_F(PhysXForceRegionTest, ForceRegion_WorldSpaceForce_AppliesSameMagnitude) { - TestAppliesSameMagnitude(GetTestScene(), WorldSpaceForce); + TestAppliesSameMagnitude(GetTestSceneHandle(), WorldSpaceForce); } TEST_F(PhysXForceRegionTest, ForceRegion_LocalSpaceForce_AppliesSameMagnitude) { - TestAppliesSameMagnitude(GetTestScene(), LocalSpaceForce); + TestAppliesSameMagnitude(GetTestSceneHandle(), LocalSpaceForce); } } diff --git a/Gems/PhysX/Code/Tests/PhysXGenericTest.cpp b/Gems/PhysX/Code/Tests/PhysXGenericTest.cpp index fd52757d27..2023dadd46 100644 --- a/Gems/PhysX/Code/Tests/PhysXGenericTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXGenericTest.cpp @@ -10,285 +10,462 @@ * */ -#include - -#include +#include +#include +#include +#include #include +#include +#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include +#include +#include -namespace Physics +namespace PhysX { - void GenericPhysicsFixture::SetUpInternal() + TEST_F(GenericPhysicsInterfaceTest, Gravity_DynamicBody_BodyFalls) { - if (auto* physicsSystem = AZ::Interface::Get()) + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + auto* rigidBody = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 0.0f, 100.0f)); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.f, 60); + + // expect velocity to be -gt and distance fallen to be 1/2gt^2, but allow quite a lot of tolerance + // due to potential differences in back end integration schemes etc. + EXPECT_NEAR(rigidBody->GetLinearVelocity().GetZ(), -10.0f, 0.5f); + EXPECT_NEAR(rigidBody->GetTransform().GetTranslation().GetZ(), 95.0f, 0.5f); + EXPECT_NEAR(rigidBody->GetCenterOfMassWorld().GetZ(), 95.0f, 0.5f); + EXPECT_NEAR(rigidBody->GetPosition().GetZ(), 95.0f, 0.5f); + } + + TEST_F(GenericPhysicsInterfaceTest, IncreaseMass_StaggeredTowerOfBoxes_TowerOverbalances) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + + // make a tower of boxes which is staggered but should still balance if all the blocks are the same mass + AzPhysics::StaticRigidBody* boxA = TestUtils::AddStaticUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 0.0f, 0.5f)); + AzPhysics::RigidBody* boxB = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.3f, 0.0f, 1.5f)); + AzPhysics::RigidBody* boxC = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.6f, 0.0f, 2.5f)); + + // check that the tower balances + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 60); + EXPECT_NEAR(2.5f, boxC->GetPosition().GetZ(), 0.01f); + + // increasing the mass of the top block in the tower should overbalance it + boxC->SetMass(5.0f); + EXPECT_NEAR(1.0f, boxB->GetMass(), 0.01f); + EXPECT_NEAR(1.0f, boxB->GetInverseMass(), 0.01f); + EXPECT_NEAR(5.0f, boxC->GetMass(), 0.01f); + EXPECT_NEAR(0.2f, boxC->GetInverseMass(), 0.01f); + boxB->ForceAwake(); + boxC->ForceAwake(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 300); + EXPECT_GT(0.0f, static_cast(boxC->GetPosition().GetZ())); + } + + TEST_F(GenericPhysicsInterfaceTest, GetCenterOfMass_FallingBody_CenterOfMassCorrectDuringFall) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + + AzPhysics::StaticRigidBody* boxStatic = TestUtils::AddStaticUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f)); + AzPhysics::RigidBody* boxDynamic = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 0.0f, 2.0f)); + auto tolerance = 1e-3f; + + EXPECT_TRUE(boxDynamic->GetCenterOfMassWorld().IsClose(AZ::Vector3(0.0f, 0.0f, 2.0f), tolerance)); + EXPECT_TRUE(boxDynamic->GetCenterOfMassLocal().IsClose(AZ::Vector3(0.0f, 0.0f, 0.0f), tolerance)); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 300); + EXPECT_NEAR(static_cast(boxDynamic->GetCenterOfMassWorld().GetZ()), 1.0f, 1e-3f); + EXPECT_TRUE(boxDynamic->GetCenterOfMassLocal().IsClose(AZ::Vector3(0.0f, 0.0f, 0.0f), tolerance)); + } + + TEST_F(GenericPhysicsInterfaceTest, SetLinearVelocity_DynamicBox_AffectsTrajectory) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + AzPhysics::RigidBody* boxA = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, -5.0f, 10.0f)); + AzPhysics::RigidBody* boxB = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 5.0f, 10.0f)); + + boxA->SetLinearVelocity(AZ::Vector3(10.0f, 0.0f, 0.0f)); + for (int i = 1; i < 10; i++) { - AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = Physics::DefaultPhysicsWorldId; - m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); - m_defaultScene = physicsSystem->GetScene(m_testSceneHandle); + float xPreviousA = boxA->GetPosition().GetX(); + float xPreviousB = boxB->GetPosition().GetX(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 10); + EXPECT_GT(static_cast(boxA->GetPosition().GetX()), xPreviousA); + EXPECT_NEAR(boxB->GetPosition().GetX(), xPreviousB, 1e-3f); } - - Physics::DefaultWorldBus::Handler::BusConnect(); } - void GenericPhysicsFixture::TearDownInternal() + TEST_F(GenericPhysicsInterfaceTest, ApplyLinearImpulse_DynamicBox_AffectsTrajectory) { - PhysX::MaterialManagerRequestsBus::Broadcast(&PhysX::MaterialManagerRequestsBus::Events::ReleaseAllMaterials); - Physics::DefaultWorldBus::Handler::BusDisconnect(); - m_defaultScene = nullptr; - if (auto* physicsSystem = AZ::Interface::Get()) + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + AzPhysics::RigidBody* boxA = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 0.0f, 100.0f)); + AzPhysics::RigidBody* boxB = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 10.0f, 100.0f)); + + boxA->ApplyLinearImpulse(AZ::Vector3(10.0f, 0.0f, 0.0f)); + for (int i = 1; i < 10; i++) { - physicsSystem->RemoveScene(m_testSceneHandle); + float xPreviousA = boxA->GetPosition().GetX(); + float xPreviousB = boxB->GetPosition().GetX(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 10); + EXPECT_GT(static_cast(boxA->GetPosition().GetX()), xPreviousA); + EXPECT_NEAR(boxB->GetPosition().GetX(), xPreviousB, 1e-3f); } - m_testSceneHandle = AzPhysics::InvalidSceneHandle; - PhysX::TestUtils::ResetPhysXSystem(); } - AZStd::shared_ptr GenericPhysicsFixture::GetDefaultWorld() + // allow a more generous tolerance on tests involving objects in contact, since the way physics engines normally + // handle multiple contacts between objects can lead to slight imbalances in contact forces + static constexpr float ContactTestTolerance = 0.01f; + + TEST_F(GenericPhysicsInterfaceTest, GetAngularVelocity_DynamicCapsuleOnSlope_GainsAngularVelocity) { - return m_defaultScene->GetLegacyWorld(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + + AZ::Transform slopeTransform = AZ::Transform::CreateRotationY(0.1f); + TestUtils::AddStaticFloorToScene(sceneHandle, slopeTransform); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(sceneHandle, + slopeTransform.TransformPoint(AZ::Vector3::CreateAxisZ())); + auto* sceneInterface = AZ::Interface::Get(); + auto* capsule = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleHandle)); + + // the capsule should roll down the slope, picking up angular velocity parallel to the Y axis + float angularVelocityMagnitude = capsule->GetAngularVelocity().GetLength(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 60); + angularVelocityMagnitude = capsule->GetAngularVelocity().GetLength(); + for (int i = 0; i < 60; i++) + { + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 1); + auto angularVelocity = capsule->GetAngularVelocity(); + EXPECT_TRUE(angularVelocity.IsPerpendicular(AZ::Vector3::CreateAxisX(), ContactTestTolerance)); + EXPECT_TRUE(angularVelocity.IsPerpendicular(AZ::Vector3::CreateAxisZ(), ContactTestTolerance)); + EXPECT_TRUE(capsule->GetAngularVelocity().GetLength() > angularVelocityMagnitude); + angularVelocityMagnitude = angularVelocity.GetLength(); + } } - AZ::Entity* GenericPhysicsFixture::AddSphereEntity(const AZ::Vector3& position, const float radius, - const AzPhysics::CollisionLayer& layer) + TEST_F(GenericPhysicsInterfaceTest, SetAngularVelocity_DynamicCapsule_StartsRolling) { - auto entity = aznew AZ::Entity("TestSphereEntity"); - entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent - entity->Init(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); - entity->Activate(); + auto floor = TestUtils::AddStaticFloorToScene(sceneHandle); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(sceneHandle, AZ::Vector3::CreateAxisZ()); + auto* sceneInterface = AZ::Interface::Get(); + auto* capsule = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleHandle)); - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + // capsule should remain stationary + for (int i = 0; i < 60; i++) + { + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 1); + EXPECT_TRUE(capsule->GetPosition().IsClose(AZ::Vector3::CreateAxisZ(), ContactTestTolerance)); + EXPECT_TRUE(capsule->GetLinearVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); + EXPECT_TRUE(capsule->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); + } + + // apply an angular velocity and it should start rolling + auto angularVelocity = AZ::Vector3::CreateAxisY(10.0f); + capsule->SetAngularVelocity(angularVelocity); + EXPECT_TRUE(capsule->GetAngularVelocity().IsClose(angularVelocity)); + + for (int i = 0; i < 60; i++) + { + float xPrevious = capsule->GetPosition().GetX(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 1); + EXPECT_TRUE(capsule->GetPosition().GetX() > xPrevious); + } + } - entity->Deactivate(); + TEST_F(GenericPhysicsInterfaceTest, GetLinearVelocityAtWorldPoint_FallingRotatingCapsule_EdgeVelocitiesCorrect) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); - auto colliderConfig = AZStd::make_shared(); - colliderConfig->m_collisionLayer = layer; - auto shapeConfig = AZStd::make_shared(radius); - auto sphereColliderComponent = entity->CreateComponent(); - sphereColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + // create dynamic capsule and start it falling and rotating + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(sceneHandle, AZ::Vector3::CreateAxisZ()); + auto* sceneInterface = AZ::Interface::Get(); + auto* capsule = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleHandle)); - RigidBodyConfiguration rigidBodyConfig; - rigidBodyConfig.m_computeMass = false; - entity->CreateComponent(rigidBodyConfig); + float angularVelocityMagnitude = 1.0f; + capsule->SetAngularVelocity(AZ::Vector3::CreateAxisY(angularVelocityMagnitude)); + capsule->SetAngularDamping(0.0f); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 60); - entity->Activate(); - return entity; + // check the velocities at some points on the rim of the capsule are as expected + for (int i = 0; i < 60; i++) + { + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 1); + auto position = capsule->GetPosition(); + float fallingSpeed = capsule->GetLinearVelocity().GetZ(); + float radius = 0.5f; + AZ::Vector3 z = AZ::Vector3::CreateAxisZ(radius); + AZ::Vector3 x = AZ::Vector3::CreateAxisX(radius); + + auto v1 = capsule->GetLinearVelocityAtWorldPoint(position - z); + auto v2 = capsule->GetLinearVelocityAtWorldPoint(position - x); + auto v3 = capsule->GetLinearVelocityAtWorldPoint(position + x); + + EXPECT_TRUE(v1.IsClose(AZ::Vector3(-radius * angularVelocityMagnitude, 0.0f, fallingSpeed))); + EXPECT_TRUE(v2.IsClose(AZ::Vector3(0.0f, 0.0f, fallingSpeed + radius * angularVelocityMagnitude))); + EXPECT_TRUE(v3.IsClose(AZ::Vector3(0.0f, 0.0f, fallingSpeed - radius * angularVelocityMagnitude))); + } } - AZ::Entity* GenericPhysicsFixture::AddBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions, - const AzPhysics::CollisionLayer& layer) + TEST_F(GenericPhysicsInterfaceTest, GetPosition_RollingCapsule_OrientationCorrect) { - auto entity = aznew AZ::Entity("TestBoxEntity"); - entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent - entity->Init(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); - entity->Activate(); + auto floor = TestUtils::AddStaticFloorToScene(sceneHandle); - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + // create dynamic capsule and start it rolling + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(sceneHandle, AZ::Vector3::CreateAxisZ()); + auto* sceneInterface = AZ::Interface::Get(); + auto* capsule = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleHandle)); - entity->Deactivate(); + capsule->SetLinearVelocity(AZ::Vector3::CreateAxisX(5.0f)); + capsule->SetAngularVelocity(AZ::Vector3::CreateAxisY(10.0f)); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 60); - auto colliderConfig = AZStd::make_shared(); - colliderConfig->m_collisionLayer = layer; - auto shapeConfig = AZStd::make_shared(dimensions); - auto boxColliderComponent = entity->CreateComponent(); - boxColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + // check the capsule orientation evolves as expected + for (int i = 0; i < 60; i++) + { + auto orientationPrevious = capsule->GetOrientation(); + float xPrevious = capsule->GetPosition().GetX(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 1); + float angle = 2.0f * (capsule->GetPosition().GetX() - xPrevious); + EXPECT_TRUE(capsule->GetOrientation().IsClose(orientationPrevious * AZ::Quaternion::CreateRotationY(angle))); + } + } + + TEST_F(GenericPhysicsInterfaceTest, OffCenterImpulse_DynamicCapsule_StartsRotating) + { + auto* sceneInterface = AZ::Interface::Get(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + + auto floor = TestUtils::AddStaticFloorToScene(sceneHandle); + AZ::Vector3 posA(0.0f, -5.0f, 1.0f); + AZ::Vector3 posB(0.0f, 0.0f, 1.0f); + AZ::Vector3 posC(0.0f, 5.0f, 1.0f); + AzPhysics::SimulatedBodyHandle capsuleAHandle = TestUtils::AddCapsuleToScene(sceneHandle, posA); + auto* capsuleA = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleAHandle)); + AzPhysics::SimulatedBodyHandle capsuleBHandle = TestUtils::AddCapsuleToScene(sceneHandle, posB); + auto* capsuleB = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleBHandle)); + AzPhysics::SimulatedBodyHandle capsuleCHandle = TestUtils::AddCapsuleToScene(sceneHandle, posC); + auto* capsuleC = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleCHandle)); + + // all the capsules should be stationary initially + for (int i = 0; i < 10; i++) + { + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 1); + EXPECT_TRUE(capsuleA->GetPosition().IsClose(posA)); + EXPECT_TRUE(capsuleA->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); + EXPECT_TRUE(capsuleB->GetPosition().IsClose(posB)); + EXPECT_TRUE(capsuleB->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); + EXPECT_TRUE(capsuleC->GetPosition().IsClose(posC)); + EXPECT_TRUE(capsuleC->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); + } - RigidBodyConfiguration rigidBodyConfig; - rigidBodyConfig.m_computeMass = false; - entity->CreateComponent(rigidBodyConfig); + // apply off-center impulses to capsule A and C, and an impulse through the center of B + AZ::Vector3 impulse(0.0f, 0.0f, 10.0f); + capsuleA->ApplyLinearImpulseAtWorldPoint(impulse, posA + AZ::Vector3::CreateAxisX(0.5f)); + capsuleB->ApplyLinearImpulseAtWorldPoint(impulse, posB); + capsuleC->ApplyLinearImpulseAtWorldPoint(impulse, posC + AZ::Vector3::CreateAxisX(-0.5f)); - entity->Activate(); - return entity; + // A and C should be rotating in opposite directions, B should still have 0 angular velocity + for (int i = 0; i < 30; i++) + { + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 1); + EXPECT_TRUE(capsuleA->GetAngularVelocity().GetY() < 0.0f); + EXPECT_TRUE(capsuleB->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero(), ContactTestTolerance)); + EXPECT_TRUE(capsuleC->GetAngularVelocity().GetY() > 0.0f); + } } - AZ::Entity* GenericPhysicsFixture::AddStaticSphereEntity(const AZ::Vector3& position, const float radius, - const AzPhysics::CollisionLayer& layer) + TEST_F(GenericPhysicsInterfaceTest, ApplyAngularImpulse_DynamicSphere_StartsRotating) { - auto entity = aznew AZ::Entity("TestSphereEntity"); - entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent - entity->Init(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + if (auto* physicsSystem = AZ::Interface::Get()) + { + auto* testScene = physicsSystem->GetScene(sceneHandle); + } + auto floor = TestUtils::AddStaticFloorToScene(sceneHandle); - entity->Activate(); + auto* sceneInterface = AZ::Interface::Get(); + AzPhysics::RigidBody* spheres[3]; + for (int i = 0; i < 3; i++) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = TestUtils::AddSphereToScene(sceneHandle, AZ::Vector3(0.0f, -5.0f + 5.0f * i, 1.0f)); + spheres[i] = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, simBodyHandle)); + } - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + // all the spheres should start stationary + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 10); + for (int i = 0; i < 3; i++) + { + EXPECT_TRUE(spheres[i]->GetAngularVelocity().IsClose(AZ::Vector3::CreateZero())); + } - entity->Deactivate(); + // apply angular impulses and they should gain angular velocity parallel to the impulse direction + AZ::Vector3 impulses[3] = { AZ::Vector3(2.0f, 4.0f, 0.0f), AZ::Vector3(-3.0f, 1.0f, 0.0f), + AZ::Vector3(-2.0f, 3.0f, 0.0f) }; + for (int i = 0; i < 3; i++) + { + spheres[i]->ApplyAngularImpulse(impulses[i]); + } - auto colliderConfig = AZStd::make_shared(); - colliderConfig->m_collisionLayer = layer; - auto shapeConfig = AZStd::make_shared(radius); - auto sphereColliderComponent = entity->CreateComponent(); - sphereColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 10); - entity->CreateComponent(); + for (int i = 0; i < 3; i++) + { + auto angVel = spheres[i]->GetAngularVelocity(); + EXPECT_TRUE(angVel.GetProjected(impulses[i]).IsClose(angVel, 0.1f)); + } + } - entity->Activate(); - return entity; + TEST_F(GenericPhysicsInterfaceTest, StartAsleep_FallingBox_DoesNotFall) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + auto* sceneInterface = AZ::Interface::Get(); + + // Box should start asleep + AzPhysics::RigidBodyConfiguration config; + config.m_startAsleep = true; + Physics::ColliderConfiguration colliderConfig; + Physics::SphereShapeConfiguration shapeConfiguration; + config.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + + AzPhysics::SimulatedBodyHandle rigidBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &config); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 100); + + // Check the box is still at 0 and hasn't dropped + AzPhysics::SimulatedBody* box = sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, rigidBodyHandle); + EXPECT_NEAR(0.0f, box->GetPosition().GetZ(), 0.01f); } - AZ::Entity* GenericPhysicsFixture::AddStaticBoxEntity(const AZ::Vector3& position, - const AZ::Vector3& dimensions, const AzPhysics::CollisionLayer& layer) + TEST_F(GenericPhysicsInterfaceTest, ForceAsleep_FallingBox_BecomesStationary) { - auto entity = aznew AZ::Entity("TestStaticBoxEntity"); - entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent - entity->Init(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + + AzPhysics::StaticRigidBody* floor = TestUtils::AddStaticFloorToScene(sceneHandle); + AzPhysics::RigidBody* box = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 0.0f, 10.0f)); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 60); - entity->Activate(); + EXPECT_TRUE(box->IsAwake()); - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + auto pos = box->GetPosition(); + box->ForceAsleep(); + EXPECT_FALSE(box->IsAwake()); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 30); + EXPECT_FALSE(box->IsAwake()); + // the box should be asleep so it shouldn't have moved + EXPECT_TRUE(box->GetPosition().IsClose(pos)); + } - entity->Deactivate(); + TEST_F(GenericPhysicsInterfaceTest, ForceAwake_SleepingBox_SleepStateCorrect) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); - auto colliderConfig = AZStd::make_shared(); - colliderConfig->m_collisionLayer = layer; - auto shapeConfig = AZStd::make_shared(dimensions); - auto boxColliderComponent = entity->CreateComponent(); - boxColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + auto floor = TestUtils::AddStaticFloorToScene(sceneHandle); + AzPhysics::RigidBody* box = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(0.0f, 0.0f, 1.0f)); - entity->CreateComponent(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 60); + EXPECT_FALSE(box->IsAwake()); - entity->Activate(); - return entity; - } + box->ForceAwake(); + EXPECT_TRUE(box->IsAwake()); - AZ::Entity* GenericPhysicsFixture::AddStaticCapsuleEntity(const AZ::Vector3& position, const float height, - const float radius, const AzPhysics::CollisionLayer& layer) - { - auto entity = aznew AZ::Entity("TestCapsuleEntity"); - entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent - entity->Init(); + //bring these tests into a cpp and into PhysXTests. - entity->Activate(); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 60); + // the box should have gone back to sleep + EXPECT_FALSE(box->IsAwake()); + } - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + TEST_F(GenericPhysicsInterfaceTest, GetAabb_Box_ValidExtents) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); - entity->Deactivate(); + AZ::Vector3 posBox(0.0f, 0.0f, 0.0f); + AzPhysics::RigidBody* box = TestUtils::AddUnitBoxToScene(sceneHandle, posBox); - auto colliderConfig = AZStd::make_shared(); - colliderConfig->m_collisionLayer = layer; - auto shapeConfig = AZStd::make_shared(height, radius); - auto capsuleColliderComponent = entity->CreateComponent(); - capsuleColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + EXPECT_TRUE(box->GetAabb().GetMin().IsClose(posBox - 0.5f * AZ::Vector3::CreateOne())); + EXPECT_TRUE(box->GetAabb().GetMax().IsClose(posBox + 0.5f * AZ::Vector3::CreateOne())); - entity->CreateComponent(); + // rotate the box and check the bounding box is still correct + AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); + box->SetTransform(AZ::Transform::CreateFromQuaternionAndTranslation(quat, posBox)); - entity->Activate(); - return entity; + AZ::Vector3 boxExtent(sqrtf(0.5f), sqrtf(0.5f), 0.5f); + EXPECT_TRUE(box->GetAabb().GetMin().IsClose(posBox - boxExtent)); + EXPECT_TRUE(box->GetAabb().GetMax().IsClose(posBox + boxExtent)); } - - AZ::Entity* GenericPhysicsFixture::AddCapsuleEntity(const AZ::Vector3& position, const float height, - const float radius, const AzPhysics::CollisionLayer& layer) + TEST_F(GenericPhysicsInterfaceTest, GetAabb_Sphere_ValidExtents) { - auto entity = aznew AZ::Entity("TestCapsuleEntity"); - entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent - entity->Init(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); - entity->Activate(); + AZ::Vector3 posSphere(0.0f, 0.0f, 0.0f); + AzPhysics::SimulatedBodyHandle simBodyHandle = TestUtils::AddSphereToScene(sceneHandle, posSphere); - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + auto* sceneInterface = AZ::Interface::Get(); + auto* sphere = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, simBodyHandle)); - entity->Deactivate(); + EXPECT_TRUE(sphere->GetAabb().GetMin().IsClose(posSphere - 0.5f * AZ::Vector3::CreateOne())); + EXPECT_TRUE(sphere->GetAabb().GetMax().IsClose(posSphere + 0.5f * AZ::Vector3::CreateOne())); - auto colliderConfig = AZStd::make_shared(); - colliderConfig->m_collisionLayer = layer; - auto shapeConfig = AZStd::make_shared(height, radius); - auto capsuleColliderComponent = entity->CreateComponent(); - capsuleColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + // rotate the sphere and check the bounding box is still correct + AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); + sphere->SetTransform(AZ::Transform::CreateFromQuaternionAndTranslation(quat, posSphere)); - RigidBodyConfiguration rigidBodyConfig; - rigidBodyConfig.m_computeMass = false; - entity->CreateComponent(rigidBodyConfig); - - entity->Activate(); - return entity; + EXPECT_TRUE(sphere->GetAabb().GetMin().IsClose(posSphere - 0.5f * AZ::Vector3::CreateOne())); + EXPECT_TRUE(sphere->GetAabb().GetMax().IsClose(posSphere + 0.5f * AZ::Vector3::CreateOne())); } - AZStd::unique_ptr GenericPhysicsFixture::AddMultiShapeEntity(const MultiShapeConfig& config) + TEST_F(GenericPhysicsInterfaceTest, GetAabb_Capsule_ValidExtents) { - AZStd::unique_ptr entity(aznew AZ::Entity("TestShapeEntity")); - entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent - entity->Init(); + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); + + AZ::Vector3 posCapsule(0.0f, 0.0f, 0.0f); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(sceneHandle, posCapsule); + auto* sceneInterface = AZ::Interface::Get(); + auto* capsule = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, capsuleHandle)); - entity->Activate(); + EXPECT_TRUE(capsule->GetAabb().GetMin().IsClose(posCapsule - AZ::Vector3(0.5f, 1.0f, 0.5f))); + EXPECT_TRUE(capsule->GetAabb().GetMax().IsClose(posCapsule + AZ::Vector3(0.5f, 1.0f, 0.5f))); - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, config.m_position); - AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetLocalRotation, config.m_rotation); + // rotate the bodies and check the bounding boxes are still correct + AZ::Quaternion quat = AZ::Quaternion::CreateRotationZ(0.25f * AZ::Constants::Pi); + capsule->SetTransform(AZ::Transform::CreateFromQuaternionAndTranslation(quat, posCapsule)); - entity->Deactivate(); + AZ::Vector3 capsuleExtent(0.5f + sqrt(0.125f), 0.5f + sqrt(0.125f), 0.5f); + EXPECT_TRUE(capsule->GetAabb().GetMin().IsClose(posCapsule - capsuleExtent)); + EXPECT_TRUE(capsule->GetAabb().GetMax().IsClose(posCapsule + capsuleExtent)); + } - auto colliderConfig = AZStd::make_shared(); - colliderConfig->m_collisionLayer = config.m_layer; + TEST_F(GenericPhysicsInterfaceTest, Materials_BoxesSharingDefaultMaterial_JumpingSameHeight) + { + AzPhysics::SceneHandle sceneHandle = CreateTestScene(); - Physics::ShapeConfigurationList shapeconfigurationList; + auto floor = TestUtils::AddStaticFloorToScene(sceneHandle); + AzPhysics::RigidBody* boxB = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(1.0f, 0.0f, 10.0f)); + AzPhysics::RigidBody* boxC = TestUtils::AddUnitBoxToScene(sceneHandle, AZ::Vector3(-1.0f, 0.0f, 10.0f)); - struct Visitor - { - AZStd::shared_ptr& colliderConfig; - Physics::ShapeConfigurationList& shapeconfigurationList; - - void operator()(const MultiShapeConfig::ShapeList::ShapeData::Box& box) const - { - shapeconfigurationList.push_back - ({ - colliderConfig, - AZStd::make_shared(box.m_extent) - }); - } - void operator()(const MultiShapeConfig::ShapeList::ShapeData::Sphere& sphere) const - { - shapeconfigurationList.push_back - ({ - colliderConfig, - AZStd::make_shared(sphere.m_radius) - }); - } - void operator()(const MultiShapeConfig::ShapeList::ShapeData::Capsule& capsule) const - { - shapeconfigurationList.push_back - ({ - colliderConfig, - AZStd::make_shared(capsule.m_height, capsule.m_radius) - }); - } - void operator()(const AZStd::monostate&) const - { - AZ_Assert(false, "Invalid shape type"); - } - }; - Visitor addShapeConfig = {colliderConfig, shapeconfigurationList}; - - for (const MultiShapeConfig::ShapeList::ShapeData& shapeConfig : config.m_shapes.m_shapesData) - { - AZStd::visit(addShapeConfig, shapeConfig.m_data); - } + auto material = boxC->GetShape(0)->GetMaterial(); + material->SetRestitution(1.0f); - auto colliderComponent = entity->CreateComponent(); - colliderComponent->SetShapeConfigurationList(shapeconfigurationList); + TestUtils::UpdateScene(sceneHandle, 1.0f / 60.0f, 150); - RigidBodyConfiguration rigidBodyConfig; - entity->CreateComponent(rigidBodyConfig); + // boxB and boxC should have the same material (default) + // so they should both bounce high + EXPECT_NEAR(boxB->GetPosition().GetZ(), boxC->GetPosition().GetZ(), 0.5f); + } - entity->Activate(); + TEST_F(GenericPhysicsInterfaceTest, Collider_ColliderTag_IsSetFromConfiguration) + { + const AZStd::string colliderTagName = "ColliderTestTag"; + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_tag = colliderTagName; + Physics::SphereShapeConfiguration shapeConfig; - for (int i = 0; i < colliderComponent->GetShapes().size(); ++i) - { - colliderComponent->GetShapes()[i]->SetLocalPose(config.m_shapes.m_shapesData[i].m_offset, AZ::Quaternion::CreateIdentity()); - } + AZStd::shared_ptr shape; + Physics::SystemRequestBus::BroadcastResult(shape, &Physics::SystemRequests::CreateShape, colliderConfig, shapeConfig); - return AZStd::unique_ptr{ AZStd::move(entity) }; + EXPECT_EQ(shape->GetTag(), AZ::Crc32(colliderTagName)); } } // namespace Physics diff --git a/Gems/PhysX/Code/Tests/PhysXGenericTestFixture.cpp b/Gems/PhysX/Code/Tests/PhysXGenericTestFixture.cpp new file mode 100644 index 0000000000..5240cc06e6 --- /dev/null +++ b/Gems/PhysX/Code/Tests/PhysXGenericTestFixture.cpp @@ -0,0 +1,165 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +namespace PhysX +{ + // helper functions + AzPhysics::SceneHandle GenericPhysicsFixture::CreateTestScene() + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); + sceneConfiguration.m_sceneName = "TestScene"; + sceneConfiguration.m_gravity = AZ::Vector3(0.0f, 0.0f, -10.0f); + m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); + return m_testSceneHandle; + } + return AzPhysics::InvalidSceneHandle; + } + + void GenericPhysicsFixture::DestroyTestScene() + { + //clean up the test scene + if (auto* physicsSystem = AZ::Interface::Get()) + { + physicsSystem->RemoveScene(m_testSceneHandle); + } + } + + void GenericPhysicsFixture::SetUpInternal() + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); + sceneConfiguration.m_sceneName = AzPhysics::DefaultPhysicsSceneName; + m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); + m_defaultScene = physicsSystem->GetScene(m_testSceneHandle); + } + + Physics::DefaultWorldBus::Handler::BusConnect(); + } + + void GenericPhysicsFixture::TearDownInternal() + { + MaterialManagerRequestsBus::Broadcast(&MaterialManagerRequestsBus::Events::ReleaseAllMaterials); + Physics::DefaultWorldBus::Handler::BusDisconnect(); + m_defaultScene = nullptr; + if (auto* physicsSystem = AZ::Interface::Get()) + { + physicsSystem->RemoveScene(m_testSceneHandle); + } + m_testSceneHandle = AzPhysics::InvalidSceneHandle; + PhysX::TestUtils::ResetPhysXSystem(); + } + + AzPhysics::SceneHandle GenericPhysicsFixture::GetDefaultSceneHandle() const + { + return m_testSceneHandle; + } + + AZStd::unique_ptr GenericPhysicsFixture::AddMultiShapeEntity(const MultiShapeConfig& config) + { + AZStd::unique_ptr entity(aznew AZ::Entity("TestShapeEntity")); + entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent + entity->Init(); + + entity->Activate(); + + AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, config.m_position); + AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetLocalRotation, config.m_rotation); + + entity->Deactivate(); + + auto colliderConfig = AZStd::make_shared(); + colliderConfig->m_collisionLayer = config.m_layer; + + Physics::ShapeConfigurationList shapeconfigurationList; + + struct Visitor + { + AZStd::shared_ptr& colliderConfig; + Physics::ShapeConfigurationList& shapeconfigurationList; + + void operator()(const MultiShapeConfig::ShapeList::ShapeData::Box& box) const + { + shapeconfigurationList.push_back + ({ + colliderConfig, + AZStd::make_shared(box.m_extent) + }); + } + void operator()(const MultiShapeConfig::ShapeList::ShapeData::Sphere& sphere) const + { + shapeconfigurationList.push_back + ({ + colliderConfig, + AZStd::make_shared(sphere.m_radius) + }); + } + void operator()(const MultiShapeConfig::ShapeList::ShapeData::Capsule& capsule) const + { + shapeconfigurationList.push_back + ({ + colliderConfig, + AZStd::make_shared(capsule.m_height, capsule.m_radius) + }); + } + void operator()(const AZStd::monostate&) const + { + AZ_Assert(false, "Invalid shape type"); + } + }; + Visitor addShapeConfig = { colliderConfig, shapeconfigurationList }; + + for (const MultiShapeConfig::ShapeList::ShapeData& shapeConfig : config.m_shapes.m_shapesData) + { + AZStd::visit(addShapeConfig, shapeConfig.m_data); + } + + auto colliderComponent = entity->CreateComponent(); + colliderComponent->SetShapeConfigurationList(shapeconfigurationList); + + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + entity->CreateComponent(rigidBodyConfig, m_testSceneHandle); + + entity->Activate(); + + for (int i = 0; i < colliderComponent->GetShapes().size(); ++i) + { + colliderComponent->GetShapes()[i]->SetLocalPose(config.m_shapes.m_shapesData[i].m_offset, AZ::Quaternion::CreateIdentity()); + } + + return AZStd::unique_ptr{ AZStd::move(entity) }; + } +} // namespace Physics diff --git a/Gems/PhysX/Code/Tests/PhysXGenericTestFixture.h b/Gems/PhysX/Code/Tests/PhysXGenericTestFixture.h new file mode 100644 index 0000000000..80b338150f --- /dev/null +++ b/Gems/PhysX/Code/Tests/PhysXGenericTestFixture.h @@ -0,0 +1,129 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AzPhysics +{ + struct RigidBody; + struct StaticRigidBody; +} + +namespace PhysX +{ + class GenericPhysicsFixture + : protected Physics::DefaultWorldBus::Handler + { + public: + // Helper functions for setting up test scenes using API only + // These can be implemented here as they should not require any gem specific functions + AzPhysics::SceneHandle CreateTestScene(); + void DestroyTestScene(); + + void SetUpInternal(); + void TearDownInternal(); + + // Helper function for creating multishape entity + struct MultiShapeConfig + { + AZ::Vector3 m_position; // Position of entity + AZ::Vector3 m_rotation = AZ::Vector3(0.f, 0.f, 0.f); // Euler rotation of entity in radians + AzPhysics::CollisionLayer m_layer = AzPhysics::CollisionLayer::Default; // Collision layer + + struct ShapeList + { + struct ShapeData + { + struct Box + { + AZ::Vector3 m_extent; + }; + struct Sphere + { + float m_radius; + }; + struct Capsule + { + float m_height; + float m_radius; + }; + + AZ::Vector3 m_offset; + AZStd::variant m_data; + }; + + void AddBox(AZ::Vector3 extent, AZ::Vector3 offset) + { + ShapeData box; + ShapeData::Box boxData{ extent }; + box.m_data = boxData; + box.m_offset = offset; + m_shapesData.push_back(box); + } + void AddSphere(float radius, AZ::Vector3 offset) + { + ShapeData sphere; + ShapeData::Sphere sphereData{ radius }; + sphere.m_data = sphereData; + sphere.m_offset = offset; + m_shapesData.push_back(sphere); + } + void AddCapsule(float height, float radius, AZ::Vector3 offset) + { + ShapeData capsule; + ShapeData::Capsule capsuleData{ height, radius }; + capsule.m_data = capsuleData; + capsule.m_offset = offset; + m_shapesData.push_back(capsule); + } + + AZStd::vector m_shapesData; + }; + ShapeList m_shapes; + }; + AZStd::unique_ptr AddMultiShapeEntity(const MultiShapeConfig& config); + + protected: + // DefaultWorldBus + AzPhysics::SceneHandle GetDefaultSceneHandle() const override; + + AzPhysics::Scene* m_defaultScene = nullptr; + AzPhysics::SceneHandle m_testSceneHandle = AzPhysics::InvalidSceneHandle; + }; + + class GenericPhysicsInterfaceTest + : protected GenericPhysicsFixture + , public testing::Test + { + public: + void SetUp() override + { + SetUpInternal(); + } + void TearDown() override + { + TearDownInternal(); + + DestroyTestScene(); //cleanup any physics scene if created. + } + }; +} // namespace Physics diff --git a/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp b/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp index 2c4246dcbf..b976bbe77a 100644 --- a/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp @@ -13,6 +13,7 @@ #include +#include #include #include @@ -27,15 +28,15 @@ #include #include #include -#include -#include +#include namespace PhysX { - using PhysXJointsTest = Physics::GenericPhysicsInterfaceTest; + using PhysXJointsTest = PhysX::GenericPhysicsInterfaceTest; template - AZStd::unique_ptr AddBodyColliderEntity(const AZ::Vector3& position, + AZStd::unique_ptr AddBodyColliderEntity( AzPhysics::SceneHandle sceneHandle, + const AZ::Vector3& position, const AZ::Vector3& initialLinearVelocity, AZStd::shared_ptr jointConfig = nullptr, AZStd::shared_ptr jointLimitsConfig = nullptr) @@ -52,7 +53,7 @@ namespace PhysX auto boxColliderComponent = entity->CreateComponent(); boxColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfiguration, boxShapeConfiguration) }); - Physics::RigidBodyConfiguration rigidBodyConfig; + AzPhysics::RigidBodyConfiguration rigidBodyConfig; rigidBodyConfig.m_initialLinearVelocity = initialLinearVelocity; rigidBodyConfig.m_gravityEnabled = false; @@ -61,7 +62,7 @@ namespace PhysX { rigidBodyConfig.m_mass = 9999.0f; } - entity->CreateComponent(rigidBodyConfig); + entity->CreateComponent(rigidBodyConfig, sceneHandle); if (jointConfig) { @@ -108,14 +109,17 @@ namespace PhysX const AZ::Transform jointLocalTransform = AZ::Transform::CreateTranslation(AZ::Vector3(1.0f, 0.0f, 0.0f)); - auto leadEntity = AddBodyColliderEntity(leadPosition, // Templated joint component type is irrelevant since joint component is not created for this invokation. + // Templated joint component type is irrelevant since joint component is not created for this invocation. + auto leadEntity = AddBodyColliderEntity(m_testSceneHandle, + leadPosition, leadInitialLinearVelocity); auto jointConfig = AZStd::make_shared(); jointConfig->m_leadEntity = leadEntity->GetId(); jointConfig->m_localTransformFromFollower = jointLocalTransform; - auto followerEntity = AddBodyColliderEntity(followerPosition, + auto followerEntity = AddBodyColliderEntity(m_testSceneHandle, + followerPosition, followerInitialLinearVelocity, jointConfig); @@ -141,7 +145,9 @@ namespace PhysX jointLocalRotation, jointLocalPosition); - auto leadEntity = AddBodyColliderEntity(leadPosition, // Templated joint component type is irrelevant since joint component is not created for this invokation. + // Templated joint component type is irrelevant since joint component is not created for this invocation. + auto leadEntity = AddBodyColliderEntity(m_testSceneHandle, + leadPosition, leadInitialLinearVelocity); auto jointConfig = AZStd::make_shared(); @@ -151,7 +157,8 @@ namespace PhysX auto jointLimits = AZStd::make_shared (); jointLimits->m_isLimited = false; - auto followerEntity = AddBodyColliderEntity(followerPosition, + auto followerEntity = AddBodyColliderEntity(m_testSceneHandle, + followerPosition, followerInitialLinearVelocity, jointConfig, jointLimits); @@ -179,7 +186,9 @@ namespace PhysX jointLocalRotation, jointLocalPosition); - auto leadEntity = AddBodyColliderEntity(leadPosition, // Templated joint component type is irrelevant since joint component is not created for this invokation. + // Templated joint component type is irrelevant since joint component is not created for this invocation. + auto leadEntity = AddBodyColliderEntity(m_testSceneHandle, + leadPosition, leadInitialLinearVelocity); auto jointConfig = AZStd::make_shared(); @@ -189,7 +198,8 @@ namespace PhysX auto jointLimits = AZStd::make_shared (); jointLimits->m_isLimited = false; - auto followerEntity = AddBodyColliderEntity(followerPosition, + auto followerEntity = AddBodyColliderEntity(m_testSceneHandle, + followerPosition, followerInitialLinearVelocity, jointConfig, jointLimits); diff --git a/Gems/PhysX/Code/Tests/PhysXMultithreadingTest.cpp b/Gems/PhysX/Code/Tests/PhysXMultithreadingTest.cpp index be3ae787ca..2f79c9b55c 100644 --- a/Gems/PhysX/Code/Tests/PhysXMultithreadingTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXMultithreadingTest.cpp @@ -13,12 +13,12 @@ #include #include -#include -#include - #include #include +#include +#include + #include #include @@ -82,18 +82,18 @@ namespace PhysX } class PhysXMultithreadingTest - : public Physics::GenericPhysicsInterfaceTest + : public PhysX::GenericPhysicsInterfaceTest , public ::testing::WithParamInterface { public: virtual void SetUp() override { - Physics::GenericPhysicsInterfaceTest::SetUpInternal(); + PhysX::GenericPhysicsInterfaceTest::SetUpInternal(); //create some boxes for (int i = 0; i < Constants::NumBoxes; i++) { - EntityPtr newEntity = TestUtils::CreateBoxEntity(Constants::BoxPositions[i], Constants::BoxDimensions, false); + EntityPtr newEntity = TestUtils::CreateBoxEntity(m_testSceneHandle, Constants::BoxPositions[i], Constants::BoxDimensions); m_boxes.emplace_back(newEntity); //disable gravity so they don't move @@ -103,7 +103,7 @@ namespace PhysX virtual void TearDown() override { - Physics::GenericPhysicsInterfaceTest::TearDownInternal(); + PhysX::GenericPhysicsInterfaceTest::TearDownInternal(); } AZStd::vector m_boxes; @@ -112,11 +112,12 @@ namespace PhysX template struct SceneQueryBase { - SceneQueryBase(const AZStd::thread_desc& threadDesc, const RequestType& request) + SceneQueryBase(const AZStd::thread_desc& threadDesc, const RequestType& request, AzPhysics::SceneHandle sceneHandle) : m_threadDesc(threadDesc) , m_request(request) + , m_sceneHandle(sceneHandle) { - + m_sceneInterface = AZ::Interface::Get(); } virtual ~SceneQueryBase() = default; @@ -160,21 +161,23 @@ namespace PhysX AZStd::thread_desc m_threadDesc; int m_waitTimeMilliseconds; RequestType m_request; + AzPhysics::SceneInterface* m_sceneInterface; + AzPhysics::SceneHandle m_sceneHandle; }; struct RayCaster - : public SceneQueryBase + : public SceneQueryBase { - RayCaster(const AZStd::thread_desc& threadDesc, const Physics::RayCastRequest& request) - : SceneQueryBase(threadDesc, request) + RayCaster(const AZStd::thread_desc& threadDesc, const AzPhysics::RayCastRequest& request, AzPhysics::SceneHandle sceneHandle) + : SceneQueryBase(threadDesc, request, sceneHandle) { - + } private: void RunRequest() override { - Physics::WorldRequestBus::EventResult(m_result, Physics::DefaultPhysicsWorldId, &Physics::WorldRequests::RayCast, m_request); + m_result = m_sceneInterface->QueryScene(m_sceneHandle, &m_request); } }; @@ -186,7 +189,7 @@ namespace PhysX AZStd::vector> rayCasters; //common request data - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_start = AZ::Vector3::CreateZero(); request.m_distance = 2000.0f; @@ -200,7 +203,7 @@ namespace PhysX const int boxTargetIdx = i % m_boxes.size(); request.m_direction = Constants::BoxPositions[boxTargetIdx].GetNormalized(); - rayCasters.emplace_back(AZStd::make_unique(threadDesc, request)); + rayCasters.emplace_back(AZStd::make_unique(threadDesc, request, m_testSceneHandle)); } //start all threads @@ -223,8 +226,8 @@ namespace PhysX caster->Join(); const int boxTargetIdx = i % m_boxes.size(); - EXPECT_TRUE(caster->m_result.m_body != nullptr); - EXPECT_TRUE(caster->m_result.m_body->GetEntityId() == m_boxes[boxTargetIdx]->GetId()); + EXPECT_TRUE(caster->m_result); + EXPECT_TRUE(caster->m_result.m_hits[0].m_entityId == m_boxes[boxTargetIdx]->GetId()); caster.release(); i++; @@ -233,10 +236,10 @@ namespace PhysX } struct RayCasterMultiple - : public SceneQueryBase> + : public SceneQueryBase { - RayCasterMultiple(const AZStd::thread_desc& threadDesc, const Physics::RayCastRequest& request) - : SceneQueryBase(threadDesc, request) + RayCasterMultiple(const AZStd::thread_desc& threadDesc, const AzPhysics::RayCastRequest& request, AzPhysics::SceneHandle sceneHandle) + : SceneQueryBase(threadDesc, request, sceneHandle) { } @@ -244,7 +247,8 @@ namespace PhysX private: void RunRequest() override { - Physics::WorldRequestBus::EventResult(m_result, Physics::DefaultPhysicsWorldId, &Physics::WorldRequests::RayCastMultiple, m_request); + m_request.m_reportMultipleHits = true; + m_result = m_sceneInterface->QueryScene(m_sceneHandle, &m_request); } }; @@ -256,7 +260,7 @@ namespace PhysX AZStd::vector> rayCasters; //common request data - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_start = AZ::Vector3::CreateZero(); request.m_distance = 2000.0f; @@ -270,7 +274,7 @@ namespace PhysX const int boxTargetIdx = i % m_boxes.size(); request.m_direction = Constants::BoxPositions[boxTargetIdx].GetNormalized(); - rayCasters.emplace_back(AZStd::make_unique(threadDesc, request)); + rayCasters.emplace_back(AZStd::make_unique(threadDesc, request, m_testSceneHandle)); } //start all threads @@ -292,20 +296,17 @@ namespace PhysX { caster->Join(); //we should have some results - EXPECT_TRUE(caster->m_result.size() > 0); + EXPECT_TRUE(caster->m_result); //check the list of result for the target bool targetInList = false; const int boxTargetIdx = i % m_boxes.size(); - for (auto& hit : caster->m_result) + for (auto& hit : caster->m_result.m_hits) { - if (hit.m_body) + if (hit && hit.m_entityId == m_boxes[boxTargetIdx]->GetId()) { - if (hit.m_body->GetEntityId() == m_boxes[boxTargetIdx]->GetId()) - { - targetInList = true; - break; - } + targetInList = true; + break; } } EXPECT_TRUE(targetInList); @@ -317,10 +318,10 @@ namespace PhysX } struct ShapeCaster - : public SceneQueryBase + : public SceneQueryBase { - ShapeCaster(const AZStd::thread_desc& threadDesc, const Physics::ShapeCastRequest& request) - : SceneQueryBase(threadDesc, request) + ShapeCaster(const AZStd::thread_desc& threadDesc, const AzPhysics::ShapeCastRequest& request, AzPhysics::SceneHandle sceneHandle) + : SceneQueryBase(threadDesc, request, sceneHandle) { } @@ -328,7 +329,7 @@ namespace PhysX private: void RunRequest() override { - Physics::WorldRequestBus::EventResult(m_result, Physics::DefaultPhysicsWorldId, &Physics::WorldRequests::ShapeCast, m_request); + m_result = m_sceneInterface->QueryScene(m_sceneHandle, &m_request); } }; @@ -340,13 +341,10 @@ namespace PhysX AZStd::vector> shapeCasters; //common request data - Physics::SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = Constants::ShpereShapeRadius; - - Physics::ShapeCastRequest request; + AzPhysics::ShapeCastRequest request; request.m_start = AZ::Transform::CreateIdentity(); request.m_distance = 2000.0f; - request.m_shapeConfiguration = &shapeConfiguration; + request.m_shapeConfiguration = AZStd::make_shared(Constants::ShpereShapeRadius); AZStd::thread_desc threadDesc; threadDesc.m_name = "SCQFPThreads"; // ShapeCastsQueryFromParallelThreads @@ -358,7 +356,7 @@ namespace PhysX const int boxTargetIdx = i % m_boxes.size(); request.m_direction = Constants::BoxPositions[boxTargetIdx].GetNormalized(); - shapeCasters.emplace_back(AZStd::make_unique(threadDesc, request)); + shapeCasters.emplace_back(AZStd::make_unique(threadDesc, request, m_testSceneHandle)); } //start all threads @@ -381,8 +379,9 @@ namespace PhysX caster->Join(); const int boxTargetIdx = i % m_boxes.size(); - EXPECT_TRUE(caster->m_result.m_body != nullptr); - EXPECT_TRUE(caster->m_result.m_body->GetEntityId() == m_boxes[boxTargetIdx]->GetId()); + EXPECT_TRUE(caster->m_result); + EXPECT_EQ(caster->m_result.m_hits.size(), 1); + EXPECT_TRUE(caster->m_result.m_hits[0].m_entityId == m_boxes[boxTargetIdx]->GetId()); caster.release(); i++; @@ -391,10 +390,10 @@ namespace PhysX } struct ShapeCasterMultiple - : public SceneQueryBase> + : public SceneQueryBase { - ShapeCasterMultiple(const AZStd::thread_desc& threadDesc, const Physics::ShapeCastRequest& request) - : SceneQueryBase(threadDesc, request) + ShapeCasterMultiple(const AZStd::thread_desc& threadDesc, const AzPhysics::ShapeCastRequest& request, AzPhysics::SceneHandle sceneHandle) + : SceneQueryBase(threadDesc, request, sceneHandle) { } @@ -402,7 +401,8 @@ namespace PhysX private: void RunRequest() override { - Physics::WorldRequestBus::EventResult(m_result, Physics::DefaultPhysicsWorldId, &Physics::WorldRequests::ShapeCastMultiple, m_request); + m_request.m_reportMultipleHits = true; + m_result = m_sceneInterface->QueryScene(m_sceneHandle, &m_request); } }; @@ -414,12 +414,9 @@ namespace PhysX AZStd::vector> shapeCasters; //common request data - Physics::SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = Constants::ShpereShapeRadius; - - Physics::ShapeCastRequest request; + AzPhysics::ShapeCastRequest request; request.m_distance = 2000.0f; - request.m_shapeConfiguration = &shapeConfiguration; + request.m_shapeConfiguration = AZStd::make_shared(Constants::ShpereShapeRadius); AZStd::thread_desc threadDesc; threadDesc.m_name = "SCMQFPThreads"; // ShapeCastMultiplesQueryFromParallelThreads @@ -431,7 +428,7 @@ namespace PhysX const int boxTargetIdx = i % m_boxes.size(); request.m_direction = Constants::BoxPositions[boxTargetIdx].GetNormalized(); - shapeCasters.emplace_back(AZStd::make_unique(threadDesc, request)); + shapeCasters.emplace_back(AZStd::make_unique(threadDesc, request, m_testSceneHandle)); } //start all threads @@ -453,20 +450,17 @@ namespace PhysX { caster->Join(); //we should have some results - EXPECT_TRUE(caster->m_result.size() > 0); + EXPECT_TRUE(caster->m_result); //check the list of result for the target bool targetInList = false; const int boxTargetIdx = i % m_boxes.size(); - for (auto& hit : caster->m_result) + for (auto& hit : caster->m_result.m_hits) { - if (hit.m_body) + if (hit && hit.m_entityId == m_boxes[boxTargetIdx]->GetId()) { - if (hit.m_body->GetEntityId() == m_boxes[boxTargetIdx]->GetId()) - { - targetInList = true; - break; - } + targetInList = true; + break; } } EXPECT_TRUE(targetInList); @@ -478,10 +472,10 @@ namespace PhysX } struct OverlapQuery - : public SceneQueryBase> + : public SceneQueryBase { - OverlapQuery(const AZStd::thread_desc& threadDesc, const Physics::OverlapRequest& request) - : SceneQueryBase(threadDesc, request) + OverlapQuery(const AZStd::thread_desc& threadDesc, const AzPhysics::OverlapRequest& request, AzPhysics::SceneHandle sceneHandle) + : SceneQueryBase(threadDesc, request, sceneHandle) { } @@ -489,7 +483,7 @@ namespace PhysX private: void RunRequest() override { - Physics::WorldRequestBus::EventResult(m_result, Physics::DefaultPhysicsWorldId, &Physics::WorldRequests::Overlap, m_request); + m_result = m_sceneInterface->QueryScene(m_sceneHandle, &m_request); } }; @@ -501,11 +495,8 @@ namespace PhysX AZStd::vector> overlapQuery; //common request data - Physics::SphereShapeConfiguration shapeConfiguration; - shapeConfiguration.m_radius = Constants::ShpereShapeRadius; - - Physics::OverlapRequest request; - request.m_shapeConfiguration = &shapeConfiguration; + AzPhysics::OverlapRequest request; + request.m_shapeConfiguration = AZStd::make_shared(Constants::ShpereShapeRadius); AZStd::thread_desc threadDesc; threadDesc.m_name = "OQFPThreads"; // OverlapQueryFromParallelThreads @@ -517,7 +508,7 @@ namespace PhysX const int boxTargetIdx = i % m_boxes.size(); request.m_pose = AZ::Transform::CreateTranslation(Constants::BoxPositions[boxTargetIdx]); - overlapQuery.emplace_back(AZStd::make_unique(threadDesc, request)); + overlapQuery.emplace_back(AZStd::make_unique(threadDesc, request, m_testSceneHandle)); } //start all threads @@ -539,20 +530,18 @@ namespace PhysX { caster->Join(); //we should have some results - EXPECT_TRUE(caster->m_result.size() > 0); + EXPECT_TRUE(caster->m_result); + EXPECT_TRUE(caster->m_result.m_hits.size() > 0); //check the list of result for the target bool targetInList = false; const int boxTargetIdx = i % m_boxes.size(); - for (auto& hit : caster->m_result) + for (auto& hit : caster->m_result.m_hits) { - if (hit.m_body) + if (hit && hit.m_entityId == m_boxes[boxTargetIdx]->GetId()) { - if (hit.m_body->GetEntityId() == m_boxes[boxTargetIdx]->GetId()) - { - targetInList = true; - break; - } + targetInList = true; + break; } } EXPECT_TRUE(targetInList); @@ -566,8 +555,10 @@ namespace PhysX struct ShapeLocalPoseSetterGetter : public SceneQueryBase, AZStd::pair> { - ShapeLocalPoseSetterGetter(const AZStd::thread_desc& threadDesc, const AZStd::pair& request, AZStd::shared_ptr shape) - : SceneQueryBase(threadDesc, request) + ShapeLocalPoseSetterGetter(const AZStd::thread_desc& threadDesc, + const AZStd::pair& request, + AZStd::shared_ptr shape) + : SceneQueryBase(threadDesc, request, AzPhysics::InvalidSceneHandle) , m_shape(shape) { @@ -633,10 +624,12 @@ namespace PhysX } struct RigidBodyRayCaster - : public SceneQueryBase + : public SceneQueryBase { - RigidBodyRayCaster(const AZStd::thread_desc& threadDesc, const Physics::RayCastRequest& request, Physics::RigidBody* rigidBody) - : SceneQueryBase(threadDesc, request) + RigidBodyRayCaster(const AZStd::thread_desc& threadDesc, + const AzPhysics::RayCastRequest& request, + AzPhysics::RigidBody* rigidBody) + : SceneQueryBase(threadDesc, request, AzPhysics::InvalidSceneHandle) , m_rigidBody(rigidBody) { @@ -644,7 +637,7 @@ namespace PhysX private: - Physics::RigidBody* m_rigidBody; + AzPhysics::RigidBody* m_rigidBody; void RunRequest() override { @@ -660,7 +653,7 @@ namespace PhysX AZStd::vector> rayCasters; //common request data - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_start = AZ::Vector3::CreateZero(); request.m_distance = 2000.0f; @@ -673,7 +666,7 @@ namespace PhysX //pick a box to raycast against const int boxTargetIdx = i % m_boxes.size(); request.m_direction = Constants::BoxPositions[boxTargetIdx].GetNormalized(); - Physics::RigidBody* rigidBody = nullptr; + AzPhysics::RigidBody* rigidBody = nullptr; Physics::RigidBodyRequestBus::EventResult(rigidBody, m_boxes[boxTargetIdx]->GetId(), &Physics::RigidBodyRequests::GetRigidBody); rayCasters.emplace_back(AZStd::make_unique(threadDesc, request, rigidBody)); @@ -699,8 +692,8 @@ namespace PhysX caster->Join(); const int boxTargetIdx = i % m_boxes.size(); - EXPECT_TRUE(caster->m_result.m_body != nullptr); - EXPECT_TRUE(caster->m_result.m_body->GetEntityId() == m_boxes[boxTargetIdx]->GetId()); + EXPECT_TRUE(caster->m_result); + EXPECT_TRUE(caster->m_result.m_entityId == m_boxes[boxTargetIdx]->GetId()); caster.release(); i++; diff --git a/Gems/PhysX/Code/Tests/PhysXSceneQueryTests.cpp b/Gems/PhysX/Code/Tests/PhysXSceneQueryTests.cpp new file mode 100644 index 0000000000..d697e0a12f --- /dev/null +++ b/Gems/PhysX/Code/Tests/PhysXSceneQueryTests.cpp @@ -0,0 +1,1020 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace PhysX +{ + class PhysXSceneQueryBase + { + public: + void SetUpFixture() + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + AzPhysics::SceneConfiguration newSceneConfig; + newSceneConfig.m_sceneName = "TestScene"; + m_testSceneHandle = physicsSystem->AddScene(newSceneConfig); + } + } + void TearDownFixture() + { + //Cleanup any created scenes + if (auto* physicsSystem = AZ::Interface::Get()) + { + physicsSystem->RemoveScene(m_testSceneHandle); + } + m_testSceneHandle = AzPhysics::InvalidSceneHandle; + } + + AzPhysics::SceneHandle m_testSceneHandle; + }; + //setup a test fixture with a scene named 'TestScene' + class PhysXSceneQueryFixture + : public testing::Test + , public PhysXSceneQueryBase + { + public: + void SetUp() override + { + PhysXSceneQueryBase::SetUpFixture(); + } + void TearDown() override + { + PhysXSceneQueryBase::TearDownFixture(); + } + }; + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstNothing_ReturnsNoHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + EXPECT_FALSE(result); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstRigidBody_ReturnsHit) + { + auto* sceneInterface = AZ::Interface::Get(); + + //create the Simulated body + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, AZ::Vector3(0.0f), 10.0f); + EXPECT_FALSE(sphereHandle == AzPhysics::InvalidSimulatedBodyHandle); //ensure the sphere was created + + //create the raycast request + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 1 hit + ASSERT_EQ(result.m_hits.size(), 1); + //hit should be valid + const AzPhysics::SceneQueryHit& hit = result.m_hits[0]; + EXPECT_TRUE(hit); + + //Distance result flag should be set and have a non zero value + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Distance); + EXPECT_FALSE(AZ::IsClose(hit.m_distance, 0.0f)); + + //Position result flag should be set and have a non zero value + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Position); + EXPECT_FALSE(hit.m_position.IsZero()); + + //Normal result flag should be set and have a non zero value + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Normal); + EXPECT_FALSE(hit.m_normal.IsZero()); + + //BodyHandle result flag should be set and should match the sphereHandle + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::BodyHandle); + EXPECT_TRUE(hit.m_bodyHandle == sphereHandle); + + //Shape result flag should be set and should not be null + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Shape); + EXPECT_FALSE(hit.m_shape == nullptr); + + //EntityId result flag should NOT be set + EXPECT_FALSE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::EntityId); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, sphereHandle); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstSphereEntity_ReturnsCorrectShapeAndMaterial) + { + auto* sceneInterface = AZ::Interface::Get(); + + //create entity + auto colliderConfig = AZStd::make_shared(); + colliderConfig->m_collisionLayer = AzPhysics::CollisionLayer::Default; + EntityPtr sphereEntity = TestUtils::CreateSphereEntity(m_testSceneHandle, AZ::Vector3(0.0f), 10.0f, colliderConfig); + + //create raycast request + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 1 hit + ASSERT_EQ(result.m_hits.size(), 1); + //hit should be valid + const AzPhysics::SceneQueryHit& hit = result.m_hits[0]; + EXPECT_TRUE(hit); + + //get the Rigid body from the entity + AzPhysics::RigidBody* rigidBody; + Physics::RigidBodyRequestBus::EventResult(rigidBody, sphereEntity->GetId(), &Physics::RigidBodyRequestBus::Events::GetRigidBody); + + //Verify shape and material + ASSERT_NE(rigidBody->GetShape(0), nullptr); + ASSERT_NE(hit.m_material, nullptr); + ASSERT_EQ(hit.m_shape, rigidBody->GetShape(0).get()); + ASSERT_EQ(hit.m_material, rigidBody->GetShape(0).get()->GetMaterial().get()); + + const AZStd::string& typeName = hit.m_material->GetSurfaceTypeName(); + ASSERT_EQ(typeName, AZStd::string("Default")); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstStaticObject_ReturnsHit) + { + auto* sceneInterface = AZ::Interface::Get(); + + //Create the static body + AzPhysics::SimulatedBodyHandle boxHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(10.0f)); + + //create the raycast request + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(-100.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 200.0f; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 1 hit + ASSERT_EQ(result.m_hits.size(), 1); + //hit should be valid + const AzPhysics::SceneQueryHit& hit = result.m_hits[0]; + EXPECT_TRUE(hit); + + //Distance result flag should be set and have a non zero value + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Distance); + EXPECT_FALSE(AZ::IsClose(hit.m_distance, 0.0f)); + + //Position result flag should be set and have a non zero value + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Position); + EXPECT_FALSE(hit.m_position.IsZero()); + + //Normal result flag should be set and have a non zero value + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Normal); + EXPECT_FALSE(hit.m_normal.IsZero()); + + //BodyHandle result flag should be set and should match the sphereHandle + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::BodyHandle); + EXPECT_TRUE(hit.m_bodyHandle == boxHandle); + + //Shape result flag should be set and should not be null + EXPECT_TRUE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::Shape); + EXPECT_FALSE(hit.m_shape == nullptr); + + //EntityId result flag should NOT be set + EXPECT_FALSE(hit.m_resultFlags & AzPhysics::SceneQuery::ResultFlags::EntityId); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, boxHandle); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstFilteredSpheres_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //Create the simulated bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 10.0f), + 10.0f, + AzPhysics::CollisionLayer(0)); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 20.0f), + 10.0f, + 2.0f, + AzPhysics::CollisionLayer(1)); + AzPhysics::SimulatedBodyHandle staticCubeHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 30.0f), + AZ::Vector3(20.0f, 20.0f, 20.0f), + AzPhysics::CollisionLayer(2)); + + //Setup request + AzPhysics::CollisionGroup group = AzPhysics::CollisionGroup::All; + group.SetLayer(AzPhysics::CollisionLayer(0), true); + group.SetLayer(AzPhysics::CollisionLayer(1), false); + group.SetLayer(AzPhysics::CollisionLayer(2), true); + + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); + request.m_distance = 200.0f; + request.m_collisionGroup = group; + request.m_reportMultipleHits = true; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 2 hits + ASSERT_EQ(result.m_hits.size(), 2); + //hit 0 should be the staticCubeHandle + const AzPhysics::SceneQueryHit& hit0 = result.m_hits[0]; + EXPECT_TRUE(hit0.m_bodyHandle == staticCubeHandle); + //hit 0 should be the sphereHandle + const AzPhysics::SceneQueryHit& hit1 = result.m_hits[1]; + EXPECT_TRUE(hit1.m_bodyHandle == sphereHandle); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, sphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, capsuleHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, staticCubeHandle); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstStaticOnly_ReturnsStaticBody) + { + auto* sceneInterface = AZ::Interface::Get(); + + //Create the simulated bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f); + AzPhysics::SimulatedBodyHandle staticCubeHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 30.0f), + AZ::Vector3(20.0f, 20.0f, 20.0f)); + + //Setup request + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); + request.m_queryType = AzPhysics::SceneQuery::QueryType::Static; + request.m_reportMultipleHits = true; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 1 hit + ASSERT_EQ(result.m_hits.size(), 1); + //hit 0 should be the staticCubeHandle + const AzPhysics::SceneQueryHit& hit0 = result.m_hits[0]; + EXPECT_TRUE(hit0.m_bodyHandle == staticCubeHandle); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, sphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, staticCubeHandle); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstDynamicOnly_ReturnsDynamicSphere) + { + auto* sceneInterface = AZ::Interface::Get(); + + //Create the simulated bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f); + AzPhysics::SimulatedBodyHandle staticCubeHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 30.0f), + AZ::Vector3(20.0f, 20.0f, 20.0f)); + + //Setup request + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); + request.m_queryType = AzPhysics::SceneQuery::QueryType::Dynamic; + request.m_reportMultipleHits = true; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 1 hit + ASSERT_EQ(result.m_hits.size(), 1); + //hit 0 should be the sphereHandle + const AzPhysics::SceneQueryHit& hit0 = result.m_hits[0]; + EXPECT_TRUE(hit0.m_bodyHandle == sphereHandle); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, sphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, staticCubeHandle); + } + + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstStaticAndDynamic_ReturnsBothObjects) + { + auto* sceneInterface = AZ::Interface::Get(); + + //Create the simulated bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f); + AzPhysics::SimulatedBodyHandle staticCubeHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 30.0f), + AZ::Vector3(20.0f, 20.0f, 20.0f)); + + //Setup request + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(0.0f, 0.0f, 1.0f); + request.m_queryType = AzPhysics::SceneQuery::QueryType::StaticAndDynamic; + request.m_reportMultipleHits = true; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 2 hits + ASSERT_EQ(result.m_hits.size(), 2); + //hit 0 should be the staticCubeHandle + const AzPhysics::SceneQueryHit& hit0 = result.m_hits[0]; + EXPECT_TRUE(hit0.m_bodyHandle == staticCubeHandle); + //hit 1 should be the sphereHandle + const AzPhysics::SceneQueryHit& hit1 = result.m_hits[1]; + EXPECT_TRUE(hit1.m_bodyHandle == sphereHandle); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, sphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, staticCubeHandle); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_AgainstMultipleWithCustomFilter_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //Create the simulated bodies + AzPhysics::SimulatedBodyHandle dynamicSphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(20.0f, 0.0f, 0.0f), 10.0f); + AzPhysics::SimulatedBodyHandle staticBoxHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(40.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); + AzPhysics::SimulatedBodyHandle blockingSphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(60.0f, 0.0f, 0.0f), 5.0f); + AzPhysics::SimulatedBodyHandle blockingStaticBoxHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(80.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); + auto* blockingBox = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, blockingStaticBoxHandle); + AzPhysics::SimulatedBodyHandle farSphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(120.0f, 0.0f, 0.0f), 10.0f); + + //Setup the request + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_queryType = AzPhysics::SceneQuery::QueryType::StaticAndDynamic; + request.m_reportMultipleHits = true; + request.m_filterCallback = [&](const AzPhysics::SimulatedBody* body, [[maybe_unused]] const Physics::Shape* shape) + { + if (body->m_bodyHandle == blockingStaticBoxHandle || body->m_bodyHandle == blockingSphereHandle) + { + return AzPhysics::SceneQuery::QueryHitType::Block; + } + return AzPhysics::SceneQuery::QueryHitType::Touch; + }; + + //query the scene + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //result should have some hits + EXPECT_TRUE(result); + //should only have 3 hits + ASSERT_EQ(result.m_hits.size(), 3); + //verify each entry is expected + auto GetSimulatedBodyInRayCastHitCallBack = [](AzPhysics::SimulatedBodyHandle bodyHandle) + { + return [bodyHandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == bodyHandle; + }; + }; + ASSERT_EQ(1, AZStd::count_if(result.m_hits.begin(), result.m_hits.end(), + GetSimulatedBodyInRayCastHitCallBack(dynamicSphereHandle))); + ASSERT_EQ(1, AZStd::count_if(result.m_hits.begin(), result.m_hits.end(), + GetSimulatedBodyInRayCastHitCallBack(staticBoxHandle))); + ASSERT_EQ(1, AZStd::count_if(result.m_hits.begin(), result.m_hits.end(), + GetSimulatedBodyInRayCastHitCallBack(blockingSphereHandle))); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, dynamicSphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, staticBoxHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, blockingSphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, blockingStaticBoxHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, farSphereHandle); + } + + TEST_F(PhysXSceneQueryFixture, RayCast_FromInsideTriangleMesh_ReturnsHitsBasedOnHitFlags) + { + auto* sceneInterface = AZ::Interface::Get(); + + // Add a cube to the scene + AzPhysics::SimulatedBodyHandle rigidBodyhandle = TestUtils::AddStaticTriangleMeshCubeToScene(m_testSceneHandle, 3.0f); + AzPhysics::SimulatedBody* rigidBody = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, rigidBodyhandle); + + // Do a simple raycast from the inside of the cube + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(0.0f); + request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); + request.m_distance = 20.0f; + request.m_hitFlags = AzPhysics::SceneQuery::HitFlags::Position; + + // Verify no hit is detected + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + EXPECT_FALSE(result); + + // Set the flags to count hits for both sides of the mesh + request.m_hitFlags = AzPhysics::SceneQuery::HitFlags::Position | AzPhysics::SceneQuery::HitFlags::MeshBothSides; + + // Verify now the hit is detected and it's indeed the cube + request.m_reportMultipleHits = true; + result = sceneInterface->QueryScene(m_testSceneHandle, &request); + EXPECT_TRUE(result); + EXPECT_EQ(result.m_hits.size(), 1); + EXPECT_TRUE(result.m_hits[0].m_bodyHandle == rigidBodyhandle); + + // Shift the ray start position outside of the mesh + request.m_start.SetX(-4.0f); + + // Set the flags to include multiple hits per object + request.m_hitFlags = AzPhysics::SceneQuery::HitFlags::Position | AzPhysics::SceneQuery::HitFlags::MeshBothSides | AzPhysics::SceneQuery::HitFlags::MeshMultiple; + + // Verify now we have 4 hits: outside + inside of 1st side and inside + outside of the 2nd side + result = sceneInterface->QueryScene(m_testSceneHandle, &request); + EXPECT_EQ(result.m_hits.size(), 4); + + // Verify all hits are for the test cube + bool testBodyInAllHits = AZStd::all_of(result.m_hits.begin(), result.m_hits.end(), [&rigidBodyhandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == rigidBodyhandle; + }); + EXPECT_TRUE(testBodyInAllHits); + } + + // Fixture for testing combinations of shape flags for scene query + class SceneQueryFlagsTestFixture + : public ::testing::TestWithParam<::testing::tuple> + , public PhysXSceneQueryBase + { + public: + void SetUp() override + { + PhysXSceneQueryBase::SetUpFixture(); + } + void TearDown() override + { + PhysXSceneQueryBase::TearDownFixture(); + } + + bool IsTrigger() const + { + return AZStd::get<0>(GetParam()); + } + + bool IsSimulated() const + { + return AZStd::get<1>(GetParam()); + } + }; + + TEST_P(SceneQueryFlagsTestFixture, RayCast_ShapesWithMixedFlags_ReturnsHitsForShapes) + { + auto* physics = AZ::Interface::Get(); + auto* sceneInterface = AZ::Interface::Get(); + + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfig); + AzPhysics::RigidBody* rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + + // Create a box shape with InSceneQueries = false + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_isInSceneQueries = false; + colliderConfig.m_isTrigger = IsTrigger(); + colliderConfig.m_isSimulated = IsSimulated(); + colliderConfig.m_position = AZ::Vector3(1.0f, 0.0f, 0.0f); + AZStd::shared_ptr boxShape = + physics->CreateShape(colliderConfig, Physics::BoxShapeConfiguration()); + rigidBody->AddShape(boxShape); + + // Create a sphere with InSceneQuesries = true + colliderConfig.m_isInSceneQueries = true; + colliderConfig.m_isTrigger = IsTrigger(); + colliderConfig.m_isSimulated = IsSimulated(); + colliderConfig.m_position = AZ::Vector3(-1.0f, 0.0f, 0.0f); + AZStd::shared_ptr sphereShape = + physics->CreateShape(colliderConfig, Physics::SphereShapeConfiguration()); + rigidBody->AddShape(sphereShape); + + // Do a simple raycast from the box side + AzPhysics::RayCastRequest request; + request.m_start = AZ::Vector3(3.0f, 0.0f, 0.0f); + request.m_direction = AZ::Vector3(-1.0f, 0.0f, 0.0f); + request.m_distance = 20.0f; + request.m_hitFlags = AzPhysics::SceneQuery::HitFlags::Position; + + // Verify the sphere was hit + AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(m_testSceneHandle, &request); + EXPECT_TRUE(result); + EXPECT_EQ(result.m_hits[0].m_shape, sphereShape.get()); + } + + INSTANTIATE_TEST_CASE_P(PhysX, SceneQueryFlagsTestFixture, ::testing::Combine( + ::testing::Bool(), + ::testing::Bool())); + + TEST_F(PhysXSceneQueryFixture, ShapeCast_AgainstNothing_ReturnsNoHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //Create request + AzPhysics::ShapeCastRequest request = AzPhysics::ShapeCastRequestHelpers::CreateSphereCastRequest(1.0f, + AZ::Transform::CreateTranslation(AZ::Vector3(-20.0f, 0.0f, 0.0f)), + AZ::Vector3(1.0f, 0.0f, 0.0f), + 20.0f, + AzPhysics::SceneQuery::QueryType::StaticAndDynamic, + AzPhysics::CollisionGroup::All, + nullptr); + + //Run query + AzPhysics::SceneQueryHits hit = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results - there should be no hits returned. + EXPECT_FALSE(hit); + } + + TEST_F(PhysXSceneQueryFixture, ShapeCast_AgainstSphere_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup body + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, AZ::Vector3(0.0f), 10.0f); + + //Create request + AzPhysics::ShapeCastRequest request = AzPhysics::ShapeCastRequestHelpers::CreateSphereCastRequest(1.0f, + AZ::Transform::CreateTranslation(AZ::Vector3(-20.0f, 0.0f, 0.0f)), + AZ::Vector3(1.0f, 0.0f, 0.0f), + 20.0f, + AzPhysics::SceneQuery::QueryType::StaticAndDynamic, + AzPhysics::CollisionGroup::All, + nullptr); + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); // there is a hit + EXPECT_TRUE(results.m_hits.size() == 1); // there is exactly 1 hit + EXPECT_EQ(results.m_hits[0].m_bodyHandle, sphereHandle); // the hit matches the created sphere which is inside the shape cast request + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, sphereHandle); + } + + TEST_F(PhysXSceneQueryFixture, ShapeCast_AgainstStaticObject_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup body + AzPhysics::SimulatedBodyHandle boxHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 0.0f), AZ::Vector3(1.0f, 1.0f, 1.0f)); + + //Create request + AzPhysics::ShapeCastRequest request = AzPhysics::ShapeCastRequestHelpers::CreateSphereCastRequest(1.5f, + AZ::Transform::CreateTranslation(AZ::Vector3(-20.0f, 0.0f, 0.0f)), + AZ::Vector3(1.0f, 0.0f, 0.0f), + 20.0f, + AzPhysics::SceneQuery::QueryType::StaticAndDynamic, + AzPhysics::CollisionGroup::All, + nullptr); + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); // there is a hit + EXPECT_TRUE(results.m_hits.size() == 1); // there is exactly 1 hit + EXPECT_EQ(results.m_hits[0].m_bodyHandle, boxHandle); // the hit matches the created box which is inside the shape cast request + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, boxHandle); + } + + TEST_F(PhysXSceneQueryFixture, ShapeCast_AgainstFilteredObjects_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 10.0f), 10.0f, AzPhysics::CollisionLayer(0)); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 20.0f), 10.0f, 2.0f, AzPhysics::CollisionLayer(1)); + AzPhysics::SimulatedBodyHandle boxHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(0.0f, 0.0f, 30.0f), AZ::Vector3(20.0f, 20.0f, 20.0f), AzPhysics::CollisionLayer(2)); + + //Create request + AzPhysics::CollisionGroup group = AzPhysics::CollisionGroup::All; + group.SetLayer(AzPhysics::CollisionLayer(0), true); + group.SetLayer(AzPhysics::CollisionLayer(1), false); + group.SetLayer(AzPhysics::CollisionLayer(2), true); + + AzPhysics::ShapeCastRequest request = AzPhysics::ShapeCastRequestHelpers::CreateSphereCastRequest(1.5f, + AZ::Transform::CreateTranslation(AZ::Vector3(0.0f, 0.0f, 0.0f)), + AZ::Vector3(0.0f, 0.0f, 1.0f), + 200.0f, AzPhysics::SceneQuery::QueryType::StaticAndDynamic, + group, + nullptr); + request.m_reportMultipleHits = true; + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); // there is a hit + //while all objects created are within the shape cast the capsule should not be included as it is filtered out by the CollisionGroup. + ASSERT_TRUE(results.m_hits.size() == 2); + EXPECT_TRUE(results.m_hits[1].m_bodyHandle == sphereHandle); + EXPECT_TRUE(results.m_hits[0].m_bodyHandle == boxHandle); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, sphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, capsuleHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, boxHandle); + } + + TEST_F(PhysXSceneQueryFixture, ShapeCast_AgainstMultipleTouchAndBlockHits_ReturnsClosestBlockAndTouches) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + AzPhysics::SimulatedBodyHandle dynamicSphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(20.0f, 0.0f, 0.0f), 10.0f); + AzPhysics::SimulatedBodyHandle staticBoxHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(40.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); + AzPhysics::SimulatedBodyHandle blockingSphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(60.0f, 0.0f, 0.0f), 5.0f); + AzPhysics::SimulatedBodyHandle blockingBoxHandle = TestUtils::AddStaticBoxToScene(m_testSceneHandle, + AZ::Vector3(80.0f, 0.0f, 0.0f), AZ::Vector3(5.0f, 5.0f, 5.0f)); + AzPhysics::SimulatedBodyHandle farSphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(120.0f, 0.0f, 0.0f), 10.0f); + + //Create Request + AzPhysics::ShapeCastRequest request = AzPhysics::ShapeCastRequestHelpers::CreateSphereCastRequest(1.5f, + AZ::Transform::CreateTranslation(AZ::Vector3(0.0f, 0.0f, 0.0f)), + AZ::Vector3(1.0f, 0.0f, 0.0f), + 200.0f, AzPhysics::SceneQuery::QueryType::StaticAndDynamic, + AzPhysics::CollisionGroup::All, + [&](const AzPhysics::SimulatedBody* body, [[maybe_unused]] const Physics::Shape* shape) + { + if (body->m_bodyHandle == blockingBoxHandle || body->m_bodyHandle == blockingSphereHandle) + { + return AzPhysics::SceneQuery::QueryHitType::Block; + } + return AzPhysics::SceneQuery::QueryHitType::Touch; + }); + request.m_reportMultipleHits = true; + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); // there is a hit + + // expect 3 hits, the dynamic sphere, static box and blocking sphere. other objects should not be in the list as the block sphere stops the cast. + ASSERT_EQ(results.m_hits.size(), 3); + + auto GetSimulatedBodyInRayCastHitCallBack = [](AzPhysics::SimulatedBodyHandle bodyHandle) + { + return [bodyHandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == bodyHandle; + }; + }; + ASSERT_EQ(1, AZStd::count_if(results.m_hits.begin(), results.m_hits.end(), GetSimulatedBodyInRayCastHitCallBack(dynamicSphereHandle))); + ASSERT_EQ(1, AZStd::count_if(results.m_hits.begin(), results.m_hits.end(), GetSimulatedBodyInRayCastHitCallBack(staticBoxHandle))); + ASSERT_EQ(1, AZStd::count_if(results.m_hits.begin(), results.m_hits.end(), GetSimulatedBodyInRayCastHitCallBack(blockingSphereHandle))); + + //clean up + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, dynamicSphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, staticBoxHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, blockingSphereHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, blockingBoxHandle); + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, farSphereHandle); + } + + TEST_F(PhysXSceneQueryFixture, Overlap_MultipleObjects_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f); + AzPhysics::SimulatedBodyHandle boxHandle = TestUtils::AddBoxToScene(m_testSceneHandle, + AZ::Vector3(7.0f, 4.0f, 0.0f), AZ::Vector3(1.0f)); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(m_testSceneHandle, + AZ::Vector3(15.0f, 0.0f, 0.0f), 3.0f, 1.0f); + + //Create request + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateBoxOverlapRequest(AZ::Vector3(3.0f), + AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f))); + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); + EXPECT_EQ(results.m_hits.size(), 2); + + // boxEntity shouldn't be included in the result + EXPECT_FALSE(AZStd::any_of(results.m_hits.begin(), results.m_hits.end(), + [boxHandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == boxHandle; + })); + + } + + TEST_F(PhysXSceneQueryFixture, Overlap_MultipleObjectsUseFriendlyFunctions_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f); + AzPhysics::SimulatedBodyHandle boxHandle = TestUtils::AddBoxToScene(m_testSceneHandle, + AZ::Vector3(7.0f, 4.0f, 0.0f), AZ::Vector3(1.0f)); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(m_testSceneHandle, + AZ::Vector3(15.0f, 0.0f, 0.0f), 3.0f, 1.0f); + + //Box Overlap Request + { + //Create request + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateBoxOverlapRequest(AZ::Vector3(3.0f), + AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f))); + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); + EXPECT_EQ(results.m_hits.size(), 2); + + // boxEntity shouldn't be included in the result + EXPECT_FALSE(AZStd::any_of(results.m_hits.begin(), results.m_hits.end(), + [boxHandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == boxHandle; + })); + } + + //Sphere Overlap Request + { + //Create request + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateSphereOverlapRequest(3.0f, + AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f))); + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); + EXPECT_EQ(results.m_hits.size(), 2); + + // boxEntity shouldn't be included in the result + EXPECT_FALSE(AZStd::any_of(results.m_hits.begin(), results.m_hits.end(), + [boxHandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == boxHandle; + })); + } + } + + TEST_F(PhysXSceneQueryFixture, Overlap_MultipleObjectsUseFriendlyFunctionsCustomFiltering_ReturnsHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f); + AzPhysics::SimulatedBodyHandle boxHandle = TestUtils::AddBoxToScene(m_testSceneHandle, + AZ::Vector3(7.0f, 4.0f, 0.0f), AZ::Vector3(1.0f)); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(m_testSceneHandle, + AZ::Vector3(15.0f, 0.0f, 0.0f), 3.0f, 1.0f); + + // Here we do an overlap test that covers all objects in the scene + // However we provide a custom filtering function that filters out a specific entity + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateCapsuleOverlapRequest(100.0f, + 30.0f, + AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f)), + [capsuleHandle](const AzPhysics::SimulatedBody* body, [[maybe_unused]] const Physics::Shape* shape) + { + return body->m_bodyHandle != capsuleHandle; + }); + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); + EXPECT_EQ(results.m_hits.size(), 2); + + // boxEntity shouldn't be included in the result + EXPECT_FALSE(AZStd::any_of(results.m_hits.begin(), results.m_hits.end(), + [capsuleHandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == capsuleHandle; + })); + } + + TEST_F(PhysXSceneQueryFixture, Overlap_MultipleObjects_ReturnsFilteredHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + AzPhysics::SimulatedBodyHandle sphereHandle = TestUtils::AddSphereToScene(m_testSceneHandle, + AZ::Vector3(10.0f, 0.0f, 0.0f), 3.0f, AzPhysics::CollisionLayer(0)); + AzPhysics::SimulatedBodyHandle boxHandle = TestUtils::AddBoxToScene(m_testSceneHandle, + AZ::Vector3(12.0f, 0.0f, 0.0f), AZ::Vector3(1.0f), AzPhysics::CollisionLayer(1)); + AzPhysics::SimulatedBodyHandle capsuleHandle = TestUtils::AddCapsuleToScene(m_testSceneHandle, + AZ::Vector3(14.0f, 0.0f, 0.0f), 3.0f, 1.0f, AzPhysics::CollisionLayer(2)); + + //Create Request + AzPhysics::OverlapRequest request = AzPhysics::OverlapRequestHelpers::CreateBoxOverlapRequest(AZ::Vector3(1.0f), + AZ::Transform::CreateTranslation(AZ::Vector3(13.0f, 0.0f, 0.0f))); + + request.m_collisionGroup = AzPhysics::CollisionGroup::All; + request.m_collisionGroup.SetLayer(AzPhysics::CollisionLayer(0), false); // Filter out the sphere + request.m_collisionGroup.SetLayer(AzPhysics::CollisionLayer(1), true); + request.m_collisionGroup.SetLayer(AzPhysics::CollisionLayer(2), true); + + //Run query + AzPhysics::SceneQueryHits results = sceneInterface->QueryScene(m_testSceneHandle, &request); + + //verify results + EXPECT_TRUE(results); + EXPECT_EQ(results.m_hits.size(), 2); + + // sphereHandle shouldn't be included in the result + EXPECT_FALSE(AZStd::any_of(results.m_hits.begin(), results.m_hits.end(), + [sphereHandle](const AzPhysics::SceneQueryHit& hit) + { + return hit.m_bodyHandle == sphereHandle; + })); + } + + TEST_F(PhysXSceneQueryFixture, QuerySceneBatch_ReturnsExpectedHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + const AZStd::vector positions = { + AZ::Vector3(10.0f, 0.0f, 0.0f), + AZ::Vector3(-10.0f, 0.0f, 0.0f), + AZ::Vector3(0.0f, 10.0f, 0.0f), + AZ::Vector3(0.0f, -10.0f, 0.0f), + AZ::Vector3(0.0f, 0.0f, 10.0f), + AZ::Vector3(0.0f, 0.0f, -10.0f) + }; + + AZStd::vector simBodies; + for (const AZ::Vector3& pos : positions) + { + simBodies.emplace_back(TestUtils::AddSphereToScene(m_testSceneHandle, pos, 1.0f)); + } + + //create the raycast requests + AzPhysics::SceneQueryRequests requests; + for (const AZ::Vector3& targetPos : positions) + { + AZStd::shared_ptr request = AZStd::make_shared(); + request->m_start = AZ::Vector3::CreateZero(); + request->m_direction = targetPos.GetNormalized(); + request->m_distance = 200.0f; + + requests.emplace_back(AZStd::move(request)); + } + + //run query + AzPhysics::SceneQueryHitsList results = sceneInterface->QuerySceneBatch(m_testSceneHandle, requests); + + //verify each result from each request has the expected targeted simulated body + EXPECT_EQ(results.size(), requests.size());//results returned should match the requests + for (size_t i = 0; i< results.size(); i++) + { + const AzPhysics::SceneQueryHits& requestResult = results[i]; + const AzPhysics::SimulatedBodyHandle targetHandle = simBodies[i]; + + EXPECT_TRUE(requestResult); // should have a result + EXPECT_EQ(requestResult.m_hits.size(), 1); // each request should only have 1 hit + EXPECT_TRUE(requestResult.m_hits[0].m_bodyHandle == targetHandle); //returned hit should match expected + } + } + + TEST_F(PhysXSceneQueryFixture, QuerySceneBatch_MultipleHits_ReturnsExpectedHits) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup bodies + const AZStd::vector positions = { + //X-axis + AZ::Vector3(10.0f, 0.0f, 0.0f), + AZ::Vector3(15.0f, 0.0f, 0.0f), + //Y-axis + AZ::Vector3(0.0f, 10.0f, 0.0f), + AZ::Vector3(0.0f, 15.0f, 0.0f), + //Z-axis + AZ::Vector3(0.0f, 0.0f, 10.0f), + AZ::Vector3(0.0f, 0.0f, 15.0f) + }; + + AZStd::vector simBodies; + simBodies.reserve(positions.size()); + for (const AZ::Vector3& pos : positions) + { + simBodies.emplace_back(TestUtils::AddSphereToScene(m_testSceneHandle, pos, 1.0f)); + } + + //create the raycast requests + AzPhysics::SceneQueryRequests requests; + + //request along the x Axis + AZStd::shared_ptr request = AZStd::make_shared(); + request->m_start = AZ::Vector3::CreateZero(); + request->m_direction = AZ::Vector3::CreateAxisX(1.0f); + request->m_distance = 200.0f; + request->m_reportMultipleHits = true; + requests.emplace_back(AZStd::move(request)); + + //request along the y Axis + request = AZStd::make_shared(); + request->m_start = AZ::Vector3::CreateZero(); + request->m_direction = AZ::Vector3::CreateAxisY(1.0f); + request->m_distance = 200.0f; + request->m_reportMultipleHits = true; + requests.emplace_back(AZStd::move(request)); + + //request along the z Axis + request = AZStd::make_shared(); + request->m_start = AZ::Vector3::CreateZero(); + request->m_direction = AZ::Vector3::CreateAxisZ(1.0f); + request->m_distance = 200.0f; + request->m_reportMultipleHits = true; + requests.emplace_back(AZStd::move(request)); + + //run query + AzPhysics::SceneQueryHitsList results = sceneInterface->QuerySceneBatch(m_testSceneHandle, requests); + + //verify each result from each request has the expected targeted simulated body + EXPECT_EQ(results.size(), requests.size());//results returned should match the requests + for (size_t i = 0; i < results.size(); i++) + { + const AzPhysics::SceneQueryHits& requestResult = results[i]; + + EXPECT_TRUE(requestResult); // should have a result + EXPECT_EQ(requestResult.m_hits.size(), 2); // each request should only have 2 hits + for (size_t j = 0; j < requestResult.m_hits.size(); j++) + { + const AzPhysics::SimulatedBodyHandle targetHandle = simBodies[(i*2)+j];//index into the simBodies, ordered as [request1,request1, request2,request2, ...] + EXPECT_TRUE(requestResult.m_hits[j].m_bodyHandle == targetHandle); //returned hit should match expected + } + } + } +} diff --git a/Gems/PhysX/Code/Tests/PhysXSceneTests.cpp b/Gems/PhysX/Code/Tests/PhysXSceneTests.cpp new file mode 100644 index 0000000000..2a30fad32d --- /dev/null +++ b/Gems/PhysX/Code/Tests/PhysXSceneTests.cpp @@ -0,0 +1,583 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include + +#include +#include + +#include +#include +#include + +namespace PhysX +{ + //setup a test fixture with a scene named 'TestScene' + class PhysXSceneFixture + : public testing::Test + { + public: + void SetUp() override + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + AzPhysics::SceneConfiguration newSceneConfig; + newSceneConfig.m_sceneName = "TestScene"; + m_testSceneHandle = physicsSystem->AddScene(newSceneConfig); + } + } + void TearDown() override + { + //Cleanup any created scenes + if (auto* physicsSystem = AZ::Interface::Get()) + { + physicsSystem->RemoveScene(m_testSceneHandle); + } + m_testSceneHandle = AzPhysics::InvalidSceneHandle; + } + + AzPhysics::SceneHandle m_testSceneHandle; + }; + + TEST_F(PhysXSceneFixture, ChangesToConfiguration_TriggersEvents) + { + auto* physicsSystem = AZ::Interface::Get(); + + //get the test scene, and the config. + AzPhysics::Scene* scene = physicsSystem->GetScene(m_testSceneHandle); + AzPhysics::SceneConfiguration newConfig = scene->GetConfiguration(); + + //make a modification + newConfig.m_gravity.SetX(42); + + //setup the handler + bool eventTriggered = false; + AzPhysics::SceneEvents::OnSceneConfigurationChanged::Handler onConfigChanged( + [&eventTriggered, newConfig, this](AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneConfiguration& config) + { + eventTriggered = true; + //the event should come from the test scene + EXPECT_EQ(sceneHandle, m_testSceneHandle); + //the config should match the one provided + EXPECT_EQ(config, newConfig); + }); + scene->RegisterSceneConfigurationChangedEventHandler(onConfigChanged); + + //apply the config + scene->UpdateConfiguration(newConfig); + + //The event should be triggered. + EXPECT_TRUE(eventTriggered); + } + + TEST_F(PhysXSceneFixture, CreateSimulatedBodies_WithSceneInterface) + { + auto* sceneInterface = AZ::Interface::Get(); + + //add a static rigid body + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(1.0f, 1.0f, 1.0f)); + AzPhysics::StaticRigidBodyConfiguration config; + config.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &config); + EXPECT_FALSE(simBodyHandle == AzPhysics::InvalidSimulatedBodyHandle); + } + + TEST_F(PhysXSceneFixture, AddSimulatedBodies_returnsExpected) + { + auto* sceneInterface = AZ::Interface::Get(); + + AzPhysics::SimulatedBodyConfigurationList configs; + + //invalid scene handle returns empty + AzPhysics::SimulatedBodyHandleList emptyBodies = sceneInterface->AddSimulatedBodies(AzPhysics::InvalidSceneHandle, configs); + EXPECT_TRUE(emptyBodies.empty()); + emptyBodies = sceneInterface->AddSimulatedBodies(AzPhysics::SceneHandle(2347892347890, 7), configs); + EXPECT_TRUE(emptyBodies.empty()); + + //add some rigid bodies + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(1.0f, 1.0f, 1.0f)); + constexpr const int numberOfBodies = 100; + for (int i = 0; i < numberOfBodies; i++) + { + const float xpos = 2.0f * static_cast(i); + AzPhysics::RigidBodyConfiguration* config = aznew AzPhysics::RigidBodyConfiguration(); + config->m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + config->m_position = AZ::Vector3::CreateAxisX(xpos); + configs.emplace_back(config); + } + //add 1 null entry into the list + const int nullIndx = numberOfBodies / 3; + configs.insert(configs.begin() + nullIndx, nullptr); + + //add the bodies + AzPhysics::SimulatedBodyHandleList newBodies = sceneInterface->AddSimulatedBodies(m_testSceneHandle, configs); + + //should have a list of valid handles of the same size. + EXPECT_TRUE(newBodies.size() == configs.size()); + for (int i = 0; i < numberOfBodies; i++) + { + if (i != nullIndx) //all other indexes should have valid handles. + { + EXPECT_FALSE(newBodies[i] == AzPhysics::InvalidSimulatedBodyHandle); + } + else //this is the index where a null config was sent, this should be invalid. + { + EXPECT_TRUE(newBodies[i] == AzPhysics::InvalidSimulatedBodyHandle); + } + } + + //cleanup + for (auto* config : configs) + { + delete config; + } + configs.clear(); + } + + TEST_F(PhysXSceneFixture, GetSimulatedBodies_returnsExpected) + { + auto* sceneInterface = AZ::Interface::Get(); + + AzPhysics::SimulatedBodyConfigurationList configs; + //add some rigid bodies + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(1.0f, 1.0f, 1.0f)); + + constexpr const int numberOfBodies = 100; + for (int i = 0; i < numberOfBodies; i++) + { + const float xpos = 2.0f * static_cast(i); + AzPhysics::RigidBodyConfiguration* config = aznew AzPhysics::RigidBodyConfiguration(); + config->m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + config->m_position = AZ::Vector3::CreateAxisX(xpos); + configs.emplace_back(config); + } + + //add the bodies + AzPhysics::SimulatedBodyHandleList newBodies = sceneInterface->AddSimulatedBodies(m_testSceneHandle, configs); + + //invalid scene handle returns null + AzPhysics::SimulatedBody* nullBody = sceneInterface->GetSimulatedBodyFromHandle(AzPhysics::InvalidSceneHandle, newBodies[0]); + EXPECT_TRUE(nullBody == nullptr); + nullBody = sceneInterface->GetSimulatedBodyFromHandle(AzPhysics::SceneHandle(2347892347890, 7), newBodies[0]); + EXPECT_TRUE(nullBody == nullptr); + + //invalid simulated body handle returns null + nullBody = sceneInterface->GetSimulatedBodyFromHandle(AzPhysics::InvalidSceneHandle, AzPhysics::InvalidSimulatedBodyHandle); + EXPECT_TRUE(nullBody == nullptr); + nullBody = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, AzPhysics::SimulatedBodyHandle(2347892348, 9)); + EXPECT_TRUE(nullBody == nullptr); + + //get 1 simulated body, should not be null. + AzPhysics::SimulatedBody* bodyPtr = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, newBodies[0]); + EXPECT_TRUE(bodyPtr != nullptr); + + //request by list + AzPhysics::SimulatedBodyList bodies = sceneInterface->GetSimulatedBodiesFromHandle(m_testSceneHandle, newBodies); + //lists should be the same size + EXPECT_EQ(bodies.size(), newBodies.size()); + //none should be null + for (auto* body : bodies) + { + EXPECT_TRUE(body != nullptr); + } + + //cleanup + for (auto* config : configs) + { + delete config; + } + configs.clear(); + } + + TEST_F(PhysXSceneFixture, RemovedSimulatedBody_IsRemoved) + { + auto* sceneInterface = AZ::Interface::Get(); + + //add a simulated body + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(1.0f, 1.0f, 1.0f)); + AzPhysics::StaticRigidBodyConfiguration config; + config.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &config); + + //remove the body + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, simBodyHandle); + + //GetSimulatedBodyFromHandle should return nullptr + EXPECT_EQ(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle), nullptr); + } + + TEST_F(PhysXSceneFixture, RemovedSimulatedBody_FreesSimulatedBodyIndex_ForNextCreated) + { + auto* sceneInterface = AZ::Interface::Get(); + + //add a few simulated body + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(1.0f, 1.0f, 1.0f)); + AzPhysics::StaticRigidBodyConfiguration config; + config.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + + AzPhysics::SimulatedBodyHandleList simBodyHandles; + constexpr const int numBodies = 10; + for (int i = 0; i < numBodies; i++) + { + simBodyHandles.emplace_back(sceneInterface->AddSimulatedBody(m_testSceneHandle, &config)); + } + + //select 1 to remove + AzPhysics::SimulatedBodyHandle removedSelection = simBodyHandles[simBodyHandles.size() / 2]; + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, removedSelection); + + //add a new one. + AzPhysics::SimulatedBodyHandle newSimBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &config); + + //The old and new handle should share an index as the freed slot will be used + EXPECT_EQ(AZStd::get(removedSelection), + AZStd::get(newSimBodyHandle)); + } + + TEST_F(PhysXSceneFixture, AddRemoveSimulatedBodies_SendEvents) + { + auto* sceneInterface = AZ::Interface::Get(); + + //setup the add/remove handlers + bool addTriggered = false; + AzPhysics::SimulatedBodyHandle addEventSimBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + AzPhysics::SceneEvents::OnSimulationBodyAdded::Handler addedEvent( + [&addEventSimBodyHandle, &addTriggered, this](AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle simBodyHandle) + { + addTriggered = true; + addEventSimBodyHandle = simBodyHandle; + EXPECT_EQ(sceneHandle, m_testSceneHandle); + }); + + bool removedTriggered = false; + AzPhysics::SimulatedBodyHandle removeEventSimBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + AzPhysics::SceneEvents::OnSimulationBodyRemoved::Handler removedEvent( + [&removeEventSimBodyHandle, &removedTriggered, this](AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle simBodyHandle) + { + removedTriggered = true; + removeEventSimBodyHandle = simBodyHandle; + EXPECT_EQ(sceneHandle, m_testSceneHandle); + }); + + //register the handlers + sceneInterface->RegisterSimulationBodyAddedHandler(m_testSceneHandle, addedEvent); + sceneInterface->RegisterSimulationBodyRemovedHandler(m_testSceneHandle, removedEvent); + + //add a simulated body + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(1.0f, 1.0f, 1.0f)); + AzPhysics::StaticRigidBodyConfiguration config; + config.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &config); + + EXPECT_TRUE(addTriggered); + EXPECT_EQ(simBodyHandle, addEventSimBodyHandle); + + //remove the body + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, simBodyHandle); + EXPECT_TRUE(removedTriggered); + EXPECT_EQ(simBodyHandle, removeEventSimBodyHandle); + } + + TEST_F(PhysXSceneFixture, StartFinishSimulationEvents_triggerAsExpected) + { + auto* physicsSystem = AZ::Interface::Get(); + auto* sceneInterface = AZ::Interface::Get(); + + //add another scene for testing that only the registered scene sends the event + able to reuse 1 event handler for both scenes. + AzPhysics::SceneConfiguration newSceneConfig; + newSceneConfig.m_sceneName = "SecondTestScene"; + AzPhysics::SceneHandle secondTestSceneHandle = physicsSystem->AddScene(newSceneConfig); + + //struct to hold data for handlers + struct EventTriggerData + { + int startCount = 0; + int finishCount = 0; + AzPhysics::SceneHandle m_sceneHandle = AzPhysics::InvalidSceneHandle; + }; + + // setup start/finish handlers that will connect to the test scene. + EventTriggerData testScenedata; + testScenedata.m_sceneHandle = m_testSceneHandle; + AzPhysics::SceneEvents::OnSceneSimulationStartHandler startTestSceneHandler( + [&testScenedata](AzPhysics::SceneHandle sceneHandle, float fixedDeltaTime) + { + testScenedata.startCount++; + EXPECT_EQ(sceneHandle, testScenedata.m_sceneHandle); + EXPECT_NEAR(AzPhysics::SystemConfiguration::DefaultFixedTimestep, fixedDeltaTime, 0.001f); + }); + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler finishTestSceneHandler( + [&testScenedata](AzPhysics::SceneHandle sceneHandle, [[maybe_unused]] float fixedDeltatime) + { + testScenedata.finishCount++; + EXPECT_EQ(sceneHandle, testScenedata.m_sceneHandle); + }); + sceneInterface->RegisterSceneSimulationStartHandler(m_testSceneHandle, startTestSceneHandler); + sceneInterface->RegisterSceneSimulationFinishHandler(m_testSceneHandle, finishTestSceneHandler); + + // setup start/finish handlers that will connect to the second test scene. + EventTriggerData secondTestScenedata; + secondTestScenedata.m_sceneHandle = secondTestSceneHandle; + AzPhysics::SceneEvents::OnSceneSimulationStartHandler startSecondTestSceneHandler( + [&secondTestScenedata](AzPhysics::SceneHandle sceneHandle, float fixedDeltaTime) + { + secondTestScenedata.startCount++; + EXPECT_EQ(sceneHandle, secondTestScenedata.m_sceneHandle); + EXPECT_NEAR(AzPhysics::SystemConfiguration::DefaultFixedTimestep, fixedDeltaTime, 0.001f); + }); + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler finishSecondTestSceneHandler( + [&secondTestScenedata](AzPhysics::SceneHandle sceneHandle, [[maybe_unused]] float fixedDeltatime) + { + secondTestScenedata.finishCount++; + EXPECT_EQ(sceneHandle, secondTestScenedata.m_sceneHandle); + }); + sceneInterface->RegisterSceneSimulationStartHandler(secondTestSceneHandle, startSecondTestSceneHandler); + sceneInterface->RegisterSceneSimulationFinishHandler(secondTestSceneHandle, finishSecondTestSceneHandler); + + //update the system to trigger the events + physicsSystem->Simulate(AzPhysics::SystemConfiguration::DefaultFixedTimestep); + + //handlers should trigger once + EXPECT_EQ(testScenedata.startCount, 1); + EXPECT_EQ(testScenedata.finishCount, 1); + EXPECT_EQ(secondTestScenedata.startCount, 1); + EXPECT_EQ(secondTestScenedata.finishCount, 1); + + //clean up + physicsSystem->RemoveScene(secondTestSceneHandle); + } + + TEST_F(PhysXSceneFixture, StartFinishSimulationEvents_triggerInCorrectOrder) + { + auto* sceneInterface = AZ::Interface::Get(); + + AZStd::vector orderedEventTriggersStart; + AZStd::vector orderedEventTriggersFinish; + + //setup the start simulate handlers + AzPhysics::SceneEvents::OnSceneSimulationStartHandler physicsStartEvent( + [&orderedEventTriggersStart]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime ) + { + orderedEventTriggersStart.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Physics); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Physics)); + AzPhysics::SceneEvents::OnSceneSimulationStartHandler animationStartEvent( + [&orderedEventTriggersStart]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime) + { + orderedEventTriggersStart.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Animation); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Animation)); + AzPhysics::SceneEvents::OnSceneSimulationStartHandler componentsStartEvent( + [&orderedEventTriggersStart]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime) + { + orderedEventTriggersStart.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Components); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Components)); + AzPhysics::SceneEvents::OnSceneSimulationStartHandler scriptingStartEvent( + [&orderedEventTriggersStart]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime) + { + orderedEventTriggersStart.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Scripting); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Scripting)); + AzPhysics::SceneEvents::OnSceneSimulationStartHandler audioStartEvent( + [&orderedEventTriggersStart]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime) + { + orderedEventTriggersStart.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Audio); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Audio)); + AzPhysics::SceneEvents::OnSceneSimulationStartHandler defaultStartEvent( + [&orderedEventTriggersStart]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltaTime) + { + orderedEventTriggersStart.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Default); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Default)); + + sceneInterface->RegisterSceneSimulationStartHandler(m_testSceneHandle, physicsStartEvent); + sceneInterface->RegisterSceneSimulationStartHandler(m_testSceneHandle, animationStartEvent); + sceneInterface->RegisterSceneSimulationStartHandler(m_testSceneHandle, componentsStartEvent); + sceneInterface->RegisterSceneSimulationStartHandler(m_testSceneHandle, scriptingStartEvent); + sceneInterface->RegisterSceneSimulationStartHandler(m_testSceneHandle, audioStartEvent); + sceneInterface->RegisterSceneSimulationStartHandler(m_testSceneHandle, defaultStartEvent); + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler physicsFinishEvent( + [&orderedEventTriggersFinish]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + orderedEventTriggersFinish.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Physics); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Physics)); + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler animationFinishEvent( + [&orderedEventTriggersFinish]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + orderedEventTriggersFinish.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Animation); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Animation)); + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler componentsFinishEvent( + [&orderedEventTriggersFinish]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + orderedEventTriggersFinish.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Components); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Components)); + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler scriptingFinishEvent( + [&orderedEventTriggersFinish]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + orderedEventTriggersFinish.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Scripting); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Scripting)); + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler audioFinishEvent( + [&orderedEventTriggersFinish]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + orderedEventTriggersFinish.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Audio); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Audio)); + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler defaultFinishEvent( + [&orderedEventTriggersFinish]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float fixedDeltatime) + { + orderedEventTriggersFinish.push_back(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Default); + }, aznumeric_cast(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Default)); + + sceneInterface->RegisterSceneSimulationFinishHandler(m_testSceneHandle, physicsFinishEvent); + sceneInterface->RegisterSceneSimulationFinishHandler(m_testSceneHandle, animationFinishEvent); + sceneInterface->RegisterSceneSimulationFinishHandler(m_testSceneHandle, componentsFinishEvent); + sceneInterface->RegisterSceneSimulationFinishHandler(m_testSceneHandle, scriptingFinishEvent); + sceneInterface->RegisterSceneSimulationFinishHandler(m_testSceneHandle, audioFinishEvent); + sceneInterface->RegisterSceneSimulationFinishHandler(m_testSceneHandle, defaultFinishEvent); + + //trigger the events + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + + //all events should trigger + EXPECT_EQ(6, orderedEventTriggersStart.size()); + EXPECT_EQ(6, orderedEventTriggersFinish.size()); + + //is in order (sorted from Largest to smallest) + auto compareOp = [](const AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority& lhs, + const AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority& rhs) -> bool + { + return lhs > rhs; + }; + EXPECT_TRUE(AZStd::is_sorted(orderedEventTriggersStart.begin(), orderedEventTriggersStart.end(), compareOp)); + EXPECT_TRUE(AZStd::is_sorted(orderedEventTriggersFinish.begin(), orderedEventTriggersFinish.end(), compareOp)); + } + + TEST_F(PhysXSceneFixture, ChangeGravity_sendsNotification) + { + auto* sceneInterface = AZ::Interface::Get(); + + const AZ::Vector3 changedGravity(9.81f, 0.0f, 0.0f); + bool eventTriggered = false; + + //setup handler + AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler onGravityChangedHandler( + [this, changedGravity, &eventTriggered](AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& newGravity) + { + eventTriggered = true; + + // scene handles should match + EXPECT_TRUE(sceneHandle == m_testSceneHandle); + + // the new gravity value should be close to the requested gravity + EXPECT_TRUE(changedGravity.IsClose(newGravity)); + }); + sceneInterface->RegisterSceneGravityChangedEvent(m_testSceneHandle, onGravityChangedHandler); + + //update the gravity + sceneInterface->SetGravity(m_testSceneHandle, changedGravity); + + EXPECT_TRUE(eventTriggered); + } + + class PhysXSceneActiveSimulatedBodiesFixture + : public testing::Test + { + public: + void SetUp() override + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + AzPhysics::SceneConfiguration newSceneConfig; + newSceneConfig.m_sceneName = "TestScene"; + newSceneConfig.m_enableActiveActors = true; + m_testSceneHandle = physicsSystem->AddScene(newSceneConfig); + } + } + void TearDown() override + { + //Cleanup any created scenes + if (auto* physicsSystem = AZ::Interface::Get()) + { + physicsSystem->RemoveScene(m_testSceneHandle); + } + m_testSceneHandle = AzPhysics::InvalidSceneHandle; + } + + AzPhysics::SceneHandle m_testSceneHandle; + }; + + TEST_F(PhysXSceneActiveSimulatedBodiesFixture, SceneActiveSimulatedBodies_CorrectlyReported) + { + auto* sceneInterface = AZ::Interface::Get(); + + // setup shape config + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(1.0f, 1.0f, 1.0f)); + + // add a static simulated body - this is not expected to be reported as an active actor + AzPhysics::StaticRigidBodyConfiguration staticConfig; + staticConfig.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + AzPhysics::SimulatedBodyHandle staticSphereHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &staticConfig); + + // add a rigid body - this is expect to be reported as an active actor + AzPhysics::RigidBodyConfiguration rigidConfig; + rigidConfig.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + AzPhysics::SimulatedBodyHandle rigidSphereHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidConfig); + + // create + register the active handler + bool handlerTriggered = false; + AzPhysics::SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler activeActorsHandler( + [rigidSphereHandle, &handlerTriggered, this](AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& activeBodyList) + { + handlerTriggered = true; + //the scene handles should match + EXPECT_TRUE(m_testSceneHandle == sceneHandle); + + //there should only be 1 entry and it should be the rigidSphereHandler + EXPECT_TRUE(activeBodyList.size() == 1); + EXPECT_TRUE(activeBodyList[0] == rigidSphereHandle); + }); + sceneInterface->RegisterSceneActiveSimulatedBodiesHandler(m_testSceneHandle, activeActorsHandler); + + // run physics to trigger the event + TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + + EXPECT_TRUE(handlerTriggered); + } +} diff --git a/Gems/PhysX/Code/Tests/PhysXSpecificTest.cpp b/Gems/PhysX/Code/Tests/PhysXSpecificTest.cpp index d773be478f..5213caff46 100644 --- a/Gems/PhysX/Code/Tests/PhysXSpecificTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXSpecificTest.cpp @@ -15,25 +15,27 @@ #include "PhysXTestUtil.h" #include -#include -#include +#include +#include + #include -#include -#include -#include #include #include #include +#include +#include +#include +#include +#include + #include #include #include -#include -#include + +#include +#include #include -#include -#include #include -#include namespace PhysX { @@ -50,7 +52,7 @@ namespace PhysX namespace PhysXTests { - typedef EntityPtr(* EntityFactoryFunc)(const AZ::Vector3&, const char*); + typedef EntityPtr(* EntityFactoryFunc)(AzPhysics::SceneHandle, const AZ::Vector3&, const char*); } class PhysXEntityFactoryParamTest @@ -243,30 +245,39 @@ namespace PhysX TEST_F(PhysXSpecificTest, RigidBody_GetNativeShape_ReturnsCorrectShape) { - Physics::RigidBodyConfiguration rigidBodyConfiguration; AZ::Vector3 halfExtents(1.0f, 2.0f, 3.0f); - - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateRigidBody(rigidBodyConfiguration); - ASSERT_TRUE(rigidBody != nullptr); - Physics::BoxShapeConfiguration shapeConfig(halfExtents * 2.0f); Physics::ColliderConfiguration colliderConfig; colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi); AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape(colliderConfig, shapeConfig); - rigidBody->AddShape(shape); + + AzPhysics::RigidBodyConfiguration rigidBodyConfiguration; + rigidBodyConfiguration.m_colliderAndShapeData = shape; + AzPhysics::RigidBody* rigidBody = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfiguration); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } + ASSERT_TRUE(rigidBody != nullptr); auto nativeShape = rigidBody->GetShape(0); ASSERT_TRUE(nativeShape != nullptr); - auto pxShape = AZStd::rtti_pointer_cast(shape); - ASSERT_TRUE(pxShape->GetPxShape()->getGeometryType() == physx::PxGeometryType::eBOX); + { + auto* actor = static_cast(rigidBody->GetNativePointer()); + PHYSX_SCENE_READ_LOCK(actor->getScene()); + + auto pxShape = AZStd::rtti_pointer_cast(shape); + ASSERT_TRUE(pxShape->GetPxShape()->getGeometryType() == physx::PxGeometryType::eBOX); - physx::PxBoxGeometry boxGeometry; - pxShape->GetPxShape()->getBoxGeometry(boxGeometry); + physx::PxBoxGeometry boxGeometry; + pxShape->GetPxShape()->getBoxGeometry(boxGeometry); - EXPECT_NEAR(boxGeometry.halfExtents.x, halfExtents.GetX(), PhysXSpecificTest::tolerance); - EXPECT_NEAR(boxGeometry.halfExtents.y, halfExtents.GetY(), PhysXSpecificTest::tolerance); - EXPECT_NEAR(boxGeometry.halfExtents.z, halfExtents.GetZ(), PhysXSpecificTest::tolerance); + EXPECT_NEAR(boxGeometry.halfExtents.x, halfExtents.GetX(), PhysXSpecificTest::tolerance); + EXPECT_NEAR(boxGeometry.halfExtents.y, halfExtents.GetY(), PhysXSpecificTest::tolerance); + EXPECT_NEAR(boxGeometry.halfExtents.z, halfExtents.GetZ(), PhysXSpecificTest::tolerance); + } } auto entityFactories = { TestUtils::AddUnitTestObject, TestUtils::AddUnitTestBoxComponentsMix }; @@ -274,15 +285,25 @@ namespace PhysX TEST_F(PhysXSpecificTest, RigidBody_GetNativeType_ReturnsPhysXRigidBodyType) { - Physics::RigidBodyConfiguration rigidBodyConfiguration; - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateRigidBody(rigidBodyConfiguration); + AzPhysics::RigidBodyConfiguration rigidBodyConfiguration; + AzPhysics::RigidBody* rigidBody = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfiguration); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } EXPECT_EQ(rigidBody->GetNativeType(), AZ::Crc32("PhysXRigidBody")); } TEST_F(PhysXSpecificTest, RigidBody_GetNativePointer_ReturnsValidPointer) { - Physics::RigidBodyConfiguration rigidBodyConfiguration; - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateRigidBody(rigidBodyConfiguration); + AzPhysics::RigidBodyConfiguration rigidBodyConfiguration; + AzPhysics::RigidBody* rigidBody = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfiguration); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } physx::PxBase* nativePointer = static_cast(rigidBody->GetNativePointer()); EXPECT_TRUE(strcmp(nativePointer->getConcreteTypeName(), "PxRigidDynamic") == 0); } @@ -297,7 +318,7 @@ namespace PhysX TestTriggerAreaNotificationListener testTriggerAreaNotificationListener(triggerBox->GetId()); // Create a test box above the trigger so when it falls down it'd enter and leave the trigger box - auto testBox = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 16.0f), "TestBox"); + auto testBox = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 16.0f), "TestBox"); auto testBoxBody = testBox->FindComponent()->GetRigidBody(); auto testBoxShape = testBoxBody->GetShape(0); @@ -333,8 +354,8 @@ namespace PhysX // set up dynamic objs AZStd::vector testBoxes = { - TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 16.0f), "TestBox"), - TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 18.0f), "TestBox2") + TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 16.0f), "TestBox"), + TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 18.0f), "TestBox2") }; // set up listeners on triggers @@ -364,8 +385,8 @@ namespace PhysX TEST_F(PhysXSpecificTest, RigidBody_CollisionCallback_SimpleCallbackOfTwoSpheres) { - auto obj01 = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 10.0f), "TestSphere01"); - auto obj02 = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 0.0f), "TestSphere01"); + auto obj01 = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 10.0f), "TestSphere01"); + auto obj02 = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f), "TestSphere01"); auto body01 = obj01->FindComponent()->GetRigidBody(); auto body02 = obj02->FindComponent()->GetRigidBody(); @@ -420,8 +441,8 @@ namespace PhysX TEST_F(PhysXSpecificTest, RigidBody_CollisionCallback_SimpleCallbackSphereFallingOnStaticBox) { - auto obj01 = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 10.0f), "TestSphere01"); - auto obj02 = TestUtils::AddStaticUnitTestObject(AZ::Vector3(0.0f, 0.0f, 0.0f), "TestBox01"); + auto obj01 = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 10.0f), "TestSphere01"); + auto obj02 = TestUtils::AddStaticUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f), "TestBox01"); auto body01 = obj01->FindComponent()->GetRigidBody(); auto body02 = obj02->FindComponent()->GetStaticRigidBody(); @@ -517,19 +538,22 @@ namespace PhysX TEST_F(PhysXSpecificTest, RigidBody_CenterOfMassOffsetComputed) { - Physics::RigidBodyConfiguration rigidBodyConfiguration; AZ::Vector3 halfExtents(1.0f, 2.0f, 3.0f); - rigidBodyConfiguration.m_computeCenterOfMass = true; - rigidBodyConfiguration.m_computeInertiaTensor = true; - - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateRigidBody(rigidBodyConfiguration); - ASSERT_TRUE(rigidBody != nullptr); - Physics::BoxShapeConfiguration shapeConfig(halfExtents * 2.0f); Physics::ColliderConfiguration colliderConfig; colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi); - AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape(colliderConfig, shapeConfig); - rigidBody->AddShape(shape); + + AzPhysics::RigidBodyConfiguration rigidBodyConfiguration; + rigidBodyConfiguration.m_computeCenterOfMass = true; + rigidBodyConfiguration.m_computeInertiaTensor = true; + rigidBodyConfiguration.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfig); + AzPhysics::RigidBody* rigidBody = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfiguration); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } + ASSERT_TRUE(rigidBody != nullptr); auto com = rigidBody->GetCenterOfMassLocal(); EXPECT_TRUE(com.IsClose(AZ::Vector3::CreateZero(), PhysXSpecificTest::tolerance)); @@ -537,21 +561,25 @@ namespace PhysX TEST_F(PhysXSpecificTest, RigidBody_CenterOfMassOffsetSpecified) { - Physics::RigidBodyConfiguration rigidBodyConfiguration; AZ::Vector3 halfExtents(1.0f, 2.0f, 3.0f); + Physics::BoxShapeConfiguration shapeConfig(halfExtents * 2.0f); + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi); + + AzPhysics::RigidBodyConfiguration rigidBodyConfiguration; rigidBodyConfiguration.m_computeCenterOfMass = false; rigidBodyConfiguration.m_centerOfMassOffset = AZ::Vector3::CreateOne(); rigidBodyConfiguration.m_computeInertiaTensor = true; + rigidBodyConfiguration.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfig); - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateRigidBody(rigidBodyConfiguration); + AzPhysics::RigidBody* rigidBody = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfiguration); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } ASSERT_TRUE(rigidBody != nullptr); - Physics::BoxShapeConfiguration shapeConfig(halfExtents * 2.0f); - Physics::ColliderConfiguration colliderConfig; - colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi); - AZStd::shared_ptr shape = AZ::Interface::Get()->CreateShape(colliderConfig, shapeConfig); - rigidBody->AddShape(shape); - auto com = rigidBody->GetCenterOfMassLocal(); EXPECT_TRUE(com.IsClose(AZ::Vector3::CreateOne(), PhysXSpecificTest::tolerance)); } @@ -563,7 +591,7 @@ namespace PhysX auto triggerBody = triggerBox->FindComponent()->GetStaticRigidBody(); // Create a test box above the trigger so when it falls down it'd enter and leave the trigger box - auto testBox = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 1.5f), "TestBox"); + auto testBox = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.5f), "TestBox"); auto testBoxBody = testBox->FindComponent()->GetRigidBody(); // Listen for trigger events on the box @@ -599,7 +627,7 @@ namespace PhysX TEST_F(PhysXSpecificTest, TriggerArea_StaticBodyDestroyedInsideDynamicTrigger_OnTriggerExitEventRaised) { // Set up a static non trigger box - auto staticBox = TestUtils::AddStaticUnitTestObject(AZ::Vector3(0.0f, 0.0f, 0.0f)); + auto staticBox = TestUtils::AddStaticUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f)); auto staticBody = staticBox->FindComponent()->GetStaticRigidBody(); // Create a test trigger box above the static box so when it falls down it'd enter and leave the trigger box @@ -640,11 +668,11 @@ namespace PhysX { // Given a rigid body falling into a trigger. auto triggerBox = TestUtils::CreateTriggerAtPosition(AZ::Vector3(0.0f, 0.0f, 0.0f)); - auto testBox = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); + auto testBox = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); // When the rigid body is deleted inside on trigger enter event. TestTriggerAreaNotificationListener testTriggerAreaNotificationListener(triggerBox->GetId()); - testTriggerAreaNotificationListener.m_onTriggerEnter = [&]([[maybe_unused]] const Physics::TriggerEvent& triggerEvent) + testTriggerAreaNotificationListener.m_onTriggerEnter = [&]([[maybe_unused]] const AzPhysics::TriggerEvent& triggerEvent) { testBox.reset(); }; @@ -660,11 +688,11 @@ namespace PhysX { // Given a rigid body falling into a trigger. auto triggerBox = TestUtils::CreateTriggerAtPosition(AZ::Vector3(0.0f, 0.0f, 0.0f)); - auto testBox = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); + auto testBox = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); // When the rigid body is deleted inside on trigger enter event. TestTriggerAreaNotificationListener testTriggerAreaNotificationListener(triggerBox->GetId()); - testTriggerAreaNotificationListener.m_onTriggerExit = [&]([[maybe_unused]] const Physics::TriggerEvent& triggerEvent) + testTriggerAreaNotificationListener.m_onTriggerExit = [&]([[maybe_unused]] const AzPhysics::TriggerEvent& triggerEvent) { testBox.reset(); }; @@ -679,12 +707,12 @@ namespace PhysX TEST_F(PhysXSpecificTest, CollisionEvents_BodyDestroyedOnCollisionBegin_DoesNotCrash) { // Given a rigid body falling onto a static box. - auto staticBox = TestUtils::AddStaticUnitTestObject(AZ::Vector3(0.0f, 0.0f, 0.0f), "StaticTestBox"); - auto testBox = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); + auto staticBox = TestUtils::AddStaticUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f), "StaticTestBox"); + auto testBox = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); // When the rigid body is deleted inside on collision begin event. CollisionCallbacksListener collisionListener(testBox->GetId()); - collisionListener.m_onCollisionBegin = [&]([[maybe_unused]] const Physics::CollisionEvent& collisionEvent) + collisionListener.m_onCollisionBegin = [&]([[maybe_unused]] const AzPhysics::CollisionEvent& collisionEvent) { testBox.reset(); }; @@ -699,12 +727,12 @@ namespace PhysX TEST_F(PhysXSpecificTest, CollisionEvents_BodyDestroyedOnCollisionPersist_DoesNotCrash) { // Given a rigid body falling onto a static box. - auto staticBox = TestUtils::AddStaticUnitTestObject(AZ::Vector3(0.0f, 0.0f, 0.0f), "StaticTestBox"); - auto testBox = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); + auto staticBox = TestUtils::AddStaticUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f), "StaticTestBox"); + auto testBox = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); // When the rigid body is deleted inside on collision begin event. CollisionCallbacksListener collisionListener(testBox->GetId()); - collisionListener.m_onCollisionPersist = [&]([[maybe_unused]] const Physics::CollisionEvent& collisionEvent) + collisionListener.m_onCollisionPersist = [&]([[maybe_unused]] const AzPhysics::CollisionEvent& collisionEvent) { testBox.reset(); }; @@ -719,12 +747,12 @@ namespace PhysX TEST_F(PhysXSpecificTest, CollisionEvents_BodyDestroyedOnCollisionEnd_DoesNotCrash) { // Given a rigid body falling onto a static box. - auto staticBox = TestUtils::AddStaticUnitTestObject(AZ::Vector3(0.0f, 0.0f, 0.0f), "StaticTestBox"); - auto testBox = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); + auto staticBox = TestUtils::AddStaticUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 0.0f), "StaticTestBox"); + auto testBox = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 1.2f), "TestBox"); // When the rigid body is deleted inside on collision begin event. CollisionCallbacksListener collisionListener(testBox->GetId()); - collisionListener.m_onCollisionEnd = [&]([[maybe_unused]] const Physics::CollisionEvent& collisionEvent) + collisionListener.m_onCollisionEnd = [&]([[maybe_unused]] const AzPhysics::CollisionEvent& collisionEvent) { testBox.reset(); }; @@ -739,8 +767,13 @@ namespace PhysX TEST_F(PhysXSpecificTest, RigidBody_ConvexRigidBodyCreatedFromCookedMesh_CachedMeshObjectCreated) { // Create rigid body - Physics::RigidBodyConfiguration rigidBodyConfiguration; - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateRigidBody(rigidBodyConfiguration); + AzPhysics::RigidBodyConfiguration rigidBodyConfiguration; + AzPhysics::RigidBody* rigidBody = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfiguration); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } ASSERT_TRUE(rigidBody != nullptr); // Generate input data @@ -777,9 +810,6 @@ namespace PhysX rigidBody->AddShape(secondShape); - // Add the rigid body to the physics world - m_defaultScene->GetLegacyWorld()->AddBody(*rigidBody); - AZ::Vector3 initialPosition = rigidBody->GetPosition(); // Tick the world @@ -787,18 +817,10 @@ namespace PhysX // Verify the actor has moved EXPECT_NE(rigidBody->GetPosition(), initialPosition); - - // Clean up - m_defaultScene->GetLegacyWorld()->RemoveBody(*rigidBody); - rigidBody = nullptr; } TEST_F(PhysXSpecificTest, RigidBody_TriangleMeshRigidBodyCreatedFromCookedMesh_CachedMeshObjectCreated) { - // Create static rigid body - Physics::RigidBodyConfiguration rigidBodyConfiguration; - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateStaticRigidBody(rigidBodyConfiguration); - // Generate input data VertexIndexData cubeMeshData = TestUtils::GenerateCubeMeshData(3.0f); AZStd::vector cookedData; @@ -820,7 +842,17 @@ namespace PhysX AZStd::shared_ptr firstShape = AZ::Interface::Get()->CreateShape(colliderConfig, shapeConfig); AZ_Assert(firstShape != nullptr, "Failed to create a shape from cooked data"); - rigidBody->AddShape(firstShape); + // Create static rigid body + AzPhysics::StaticRigidBodyConfiguration staticBodyConfiguration; + staticBodyConfiguration.m_colliderAndShapeData = firstShape; + + AzPhysics::StaticRigidBody* rigidBody = nullptr; + AzPhysics::SimulatedBodyHandle rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + if (auto* sceneInterface = AZ::Interface::Get()) + { + rigidBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &staticBodyConfiguration); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, rigidBodyHandle)); + } // Validate the cached mesh is there EXPECT_NE(shapeConfig.GetCachedNativeMesh(), nullptr); @@ -835,12 +867,9 @@ namespace PhysX rigidBody->AddShape(secondShape); - // Add the rigid body to the physics world - m_defaultScene->GetLegacyWorld()->AddBody(*rigidBody); - // Drop a sphere - auto sphereActor = TestUtils::AddUnitTestObject(AZ::Vector3(0.0f, 0.0f, 8.0f), "TestSphere01"); - Physics::RigidBody* sphereRigidBody = sphereActor->FindComponent()->GetRigidBody(); + auto sphereActor = TestUtils::AddUnitTestObject(m_testSceneHandle, AZ::Vector3(0.0f, 0.0f, 8.0f), "TestSphere01"); + AzPhysics::RigidBody* sphereRigidBody = sphereActor->FindComponent()->GetRigidBody(); // Tick the world TestUtils::UpdateScene(m_defaultScene, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 120); @@ -850,7 +879,11 @@ namespace PhysX EXPECT_NEAR(spherePosition.GetZ(), 6.5f, 0.01f); // Clean up - m_defaultScene->GetLegacyWorld()->RemoveBody(*rigidBody); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_testSceneHandle, rigidBodyHandle); + rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + } rigidBody = nullptr; } @@ -1075,181 +1108,42 @@ namespace PhysX SanityCheckValidFrustumParams(points.value(), validHeight, validBottomRadius, validTopRadius, validSubdivisions); } - TEST_F(PhysXSpecificTest, RayCast_CastFromInsidTriangleMesh_ReturnsHitsBasedOnHitFlags) - { - // Add a cube to the scene - AZStd::unique_ptr rigidBody = TestUtils::CreateStaticTriangleMeshCube(3.0f); - AZStd::shared_ptr world = GetDefaultWorld(); - world->AddBody(*rigidBody); - - // Do a simple raycast from the inside of the cube - Physics::RayCastRequest request; - request.m_start = AZ::Vector3(0.0f); - request.m_direction = AZ::Vector3(1.0f, 0.0f, 0.0f); - request.m_distance = 20.0f; - request.m_hitFlags = Physics::HitFlags::Position; - - // Verify no hit is detected - Physics::RayCastHit hit = world->RayCast(request); - EXPECT_FALSE(hit); - - // Set the flags to count hits for both sides of the mesh - request.m_hitFlags = Physics::HitFlags::Position | Physics::HitFlags::MeshBothSides; - - // Verify now the hit is detected and it's indeed the cube - AZStd::vector hits = world->RayCastMultiple(request); - EXPECT_EQ(hits.size(), 1); - EXPECT_TRUE(hits[0].m_body == rigidBody.get()); - - // Shift the ray start position outside of the mesh - request.m_start.SetX(-4.0f); - - // Set the flags to include multiple hits per object - request.m_hitFlags = Physics::HitFlags::Position | Physics::HitFlags::MeshBothSides | Physics::HitFlags::MeshMultiple; - - // Verify now we have 4 hits: outside + inside of 1st side and inside + outside of the 2nd side - hits = world->RayCastMultiple(request); - EXPECT_EQ(hits.size(), 4); - - // Verify all hits are for the test cube - bool testBodyInAllHits = AZStd::all_of(hits.begin(), hits.end(), [&rigidBody](const Physics::RayCastHit& hit) - { - return hit.m_body == rigidBody.get(); - }); - EXPECT_TRUE(testBodyInAllHits); - } - - // Fixture for testing combinations of shape flags for scene query - class SceneQueryFlagsTestFixture - : public ::testing::TestWithParam<::testing::tuple> - , private Physics::DefaultWorldBus::Handler - { - public: - void SetUp() override - { - if (auto* physicsSystem = AZ::Interface::Get()) - { - AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = Physics::DefaultPhysicsWorldId; - m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); - m_defaultScene = physicsSystem->GetScene(m_testSceneHandle); - } - Physics::DefaultWorldBus::Handler::BusConnect(); - } - - void TearDown() override - { - Physics::DefaultWorldBus::Handler::BusDisconnect(); - m_defaultScene = nullptr; - //Ensure any Scenes used have been removed - if (auto* physicsSystem = AZ::Interface::Get()) - { - physicsSystem->RemoveScene(m_testSceneHandle); - } - m_testSceneHandle = AzPhysics::InvalidSceneHandle; - TestUtils::ResetPhysXSystem(); - } - - // DefaultWorldBus - AZStd::shared_ptr GetDefaultWorld() override - { - return m_defaultScene->GetLegacyWorld(); - } - - bool IsTrigger() const - { - return AZStd::get<0>(GetParam()); - } - - bool IsSimulated() const - { - return AZStd::get<1>(GetParam()); - } - - private: - AzPhysics::Scene* m_defaultScene = nullptr; - AzPhysics::SceneHandle m_testSceneHandle = AzPhysics::InvalidSceneHandle; - }; - - TEST_P(SceneQueryFlagsTestFixture, RayCast_CreateShapesWithMixedFlags_ReturnsHitsForSceneQueryShapes) - { - Physics::System* physics = AZ::Interface::Get(); - Physics::RigidBodyConfiguration rigidBodyConfig; - AZStd::unique_ptr rigidBody = physics->CreateRigidBody(rigidBodyConfig); - - // Create a box shape with InSceneQueries = false - Physics::ColliderConfiguration colliderConfig; - colliderConfig.m_isInSceneQueries = false; - colliderConfig.m_isTrigger = IsTrigger(); - colliderConfig.m_isSimulated = IsSimulated(); - colliderConfig.m_position = AZ::Vector3(1.0f, 0.0f, 0.0f); - AZStd::shared_ptr boxShape = - physics->CreateShape(colliderConfig, Physics::BoxShapeConfiguration()); - rigidBody->AddShape(boxShape); - - // Create a sphere with InSceneQuesries = true - colliderConfig.m_isInSceneQueries = true; - colliderConfig.m_isTrigger = IsTrigger(); - colliderConfig.m_isSimulated = IsSimulated(); - colliderConfig.m_position = AZ::Vector3(-1.0f, 0.0f, 0.0f); - AZStd::shared_ptr sphereShape = - physics->CreateShape(colliderConfig, Physics::SphereShapeConfiguration()); - rigidBody->AddShape(sphereShape); - - AZStd::shared_ptr world = GetDefaultWorld(); - world->AddBody(*rigidBody); - - // Do a simple raycast from the box side - Physics::RayCastRequest request; - request.m_start = AZ::Vector3(3.0f, 0.0f, 0.0f); - request.m_direction = AZ::Vector3(-1.0f, 0.0f, 0.0f); - request.m_distance = 20.0f; - request.m_hitFlags = Physics::HitFlags::Position; - - // Verify the sphere was hit - Physics::RayCastHit hit = world->RayCast(request); - EXPECT_EQ(hit.m_shape, sphereShape.get()); - } - - INSTANTIATE_TEST_CASE_P(PhysX, SceneQueryFlagsTestFixture, ::testing::Combine( - ::testing::Bool(), - ::testing::Bool())); - TEST_F(PhysXSpecificTest, RigidBody_RigidBodyWithSimulatedFlagsHitsPlane_OnlySimulatedShapeCollidesWithPlane) { // Helper function wrapping creation logic - auto CreateBoxRigidBody = [this](const AZ::Vector3& position, bool simulatedFlag, bool triggerFlag) + auto CreateBoxRigidBody = [this](const AZ::Vector3& position, bool simulatedFlag, bool triggerFlag) -> AzPhysics::RigidBody* { - Physics::System* physics = AZ::Interface::Get(); - AZStd::shared_ptr world = GetDefaultWorld(); - - Physics::RigidBodyConfiguration rigidBodyConfig; - rigidBodyConfig.m_entityId = AZ::EntityId(0); // Set entity ID to avoid warnings in OnTriggerEnter - rigidBodyConfig.m_position = position; - AZStd::unique_ptr rigidBody = physics->CreateRigidBody(rigidBodyConfig); Physics::ColliderConfiguration colliderConfig; colliderConfig.m_isSimulated = simulatedFlag; colliderConfig.m_isTrigger = triggerFlag; - AZStd::shared_ptr shapeNonSim = - physics->CreateShape(colliderConfig, Physics::BoxShapeConfiguration()); - rigidBody->AddShape(shapeNonSim); - world->AddBody(*rigidBody); - return rigidBody; + Physics::BoxShapeConfiguration shapeConfig; + + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + rigidBodyConfig.m_entityId = AZ::EntityId(0); // Set entity ID to avoid warnings in OnTriggerEnter + rigidBodyConfig.m_position = position; + rigidBodyConfig.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfig); + + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfig); + return azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } + return nullptr; }; // Create a box with m_isSimulated = false - AZStd::unique_ptr rigidBodyNonSim = + AzPhysics::RigidBody* rigidBodyNonSim = CreateBoxRigidBody(AZ::Vector3(-5.0f, 0.0f, 5.0f), false, false); - AZStd::unique_ptr rigidBodySolid = + AzPhysics::RigidBody* rigidBodySolid = CreateBoxRigidBody(AZ::Vector3(5.0f, 0.0f, 5.0f), true, false); - AZStd::unique_ptr rigidBodyTrigger = + AzPhysics::RigidBody* rigidBodyTrigger = CreateBoxRigidBody(AZ::Vector3(0.0f, 0.0f, 5.0f), true, true); // Create ground at origin - auto ground = TestUtils::CreateStaticBoxEntity(AZ::Vector3::CreateZero(), AZ::Vector3(20.0f, 20.0f, 0.5f)); + auto ground = TestUtils::CreateStaticBoxEntity(m_testSceneHandle, AZ::Vector3::CreateZero(), AZ::Vector3(20.0f, 20.0f, 0.5f)); TestUtils::UpdateScene(m_defaultScene, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 60); @@ -1267,13 +1161,41 @@ namespace PhysX class MultiShapesDensityTestFixture : public ::testing::TestWithParam> { + public: + void SetUp() override + { + if (auto* physicsSystem = AZ::Interface::Get()) + { + AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); + sceneConfiguration.m_sceneName = AzPhysics::DefaultPhysicsSceneName; + m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); + } + } + + void TearDown() override + { + //Clean up the Test scene + if (auto* physicsSystem = AZ::Interface::Get()) + { + physicsSystem->RemoveScene(m_testSceneHandle); + } + m_testSceneHandle = AzPhysics::InvalidSceneHandle; + } + + AzPhysics::SceneHandle m_testSceneHandle = AzPhysics::InvalidSceneHandle; }; TEST_P(MultiShapesDensityTestFixture, RigidBody_CreateShapesWithDifferentDensity_ResultingMassMatchesExpected) { Physics::System* physics = AZ::Interface::Get(); - Physics::RigidBodyConfiguration rigidBodyConfig; - AZStd::unique_ptr rigidBody = physics->CreateRigidBody(rigidBodyConfig); + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + + AzPhysics::RigidBody* rigidBody = nullptr; + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &rigidBodyConfig); + rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } // Create materials for each density Physics::MaterialConfiguration materialProperties; @@ -1357,23 +1279,39 @@ namespace PhysX }; class MassComputeFixture - : public ::testing::TestWithParam<::testing::tuple> + : public ::testing::TestWithParam<::testing::tuple> { public: void SetUp() override final { - SimulatedShapesMode shapeMode = GetShapesMode(); - Physics::MassComputeFlags massComputeFlags = GetMassComputeFlags(); + if (auto* physicsSystem = AZ::Interface::Get()) + { + AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); + sceneConfiguration.m_sceneName = AzPhysics::DefaultPhysicsSceneName; + m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); + } + SimulatedShapesMode shapeMode = GetShapesMode(); + AzPhysics::MassComputeFlags massComputeFlags = GetMassComputeFlags(); m_rigidBodyConfig.SetMassComputeFlags(massComputeFlags); - m_rigidBody = AZ::Interface::Get()->CreateRigidBody(m_rigidBodyConfig); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &m_rigidBodyConfig); + m_rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, simBodyHandle)); + } } void TearDown() override final { - m_rigidBodyConfig = Physics::RigidBodyConfiguration(); - m_rigidBody.reset(); + //Clean up the Test scene + if (auto* physicsSystem = AZ::Interface::Get()) + { + physicsSystem->RemoveScene(m_testSceneHandle); + } + m_testSceneHandle = AzPhysics::InvalidSceneHandle; + m_rigidBodyConfig = AzPhysics::RigidBodyConfiguration(); + m_rigidBody = nullptr; } SimulatedShapesMode GetShapesMode() const @@ -1381,7 +1319,7 @@ namespace PhysX return ::testing::get<0>(GetParam()); } - Physics::MassComputeFlags GetMassComputeFlags() const + AzPhysics::MassComputeFlags GetMassComputeFlags() const { return ::testing::get<1>(GetParam()); } @@ -1409,14 +1347,15 @@ namespace PhysX (!(GetShapesMode() == SimulatedShapesMode::NONE) || m_rigidBodyConfig.m_includeAllShapesInMassCalculation); } - Physics::RigidBodyConfiguration m_rigidBodyConfig; - AZStd::unique_ptr m_rigidBody; + AzPhysics::RigidBodyConfiguration m_rigidBodyConfig; + AzPhysics::RigidBody* m_rigidBody; + AzPhysics::SceneHandle m_testSceneHandle = AzPhysics::InvalidSceneHandle; }; TEST_P(MassComputeFixture, RigidBody_ComputeMassFlagsCombinationsTwoShapes_MassPropertiesCalculatedAccordingly) { SimulatedShapesMode shapeMode = GetShapesMode(); - Physics::MassComputeFlags massComputeFlags = GetMassComputeFlags(); + AzPhysics::MassComputeFlags massComputeFlags = GetMassComputeFlags(); bool multiShapeTest = IsMultiShapeTest(); Physics::System* physics = AZ::Interface::Get(); @@ -1482,17 +1421,17 @@ namespace PhysX } } - Physics::MassComputeFlags possibleMassComputeFlags[] = { - Physics::MassComputeFlags::NONE, Physics::MassComputeFlags::DEFAULT, Physics::MassComputeFlags::COMPUTE_MASS, - Physics::MassComputeFlags::COMPUTE_COM, Physics::MassComputeFlags::COMPUTE_INERTIA, - Physics::MassComputeFlags::DEFAULT | Physics::MassComputeFlags::INCLUDE_ALL_SHAPES, - Physics::MassComputeFlags::COMPUTE_COM, Physics::MassComputeFlags::COMPUTE_INERTIA, Physics::MassComputeFlags::INCLUDE_ALL_SHAPES, - Physics::MassComputeFlags::COMPUTE_MASS | Physics::MassComputeFlags::COMPUTE_COM, - Physics::MassComputeFlags::COMPUTE_MASS | Physics::MassComputeFlags::COMPUTE_COM | Physics::MassComputeFlags::INCLUDE_ALL_SHAPES, - Physics::MassComputeFlags::COMPUTE_MASS | Physics::MassComputeFlags::COMPUTE_INERTIA, - Physics::MassComputeFlags::COMPUTE_MASS | Physics::MassComputeFlags::COMPUTE_INERTIA | Physics::MassComputeFlags::INCLUDE_ALL_SHAPES, - Physics::MassComputeFlags::COMPUTE_COM | Physics::MassComputeFlags::COMPUTE_INERTIA, - Physics::MassComputeFlags::COMPUTE_COM | Physics::MassComputeFlags::COMPUTE_INERTIA | Physics::MassComputeFlags::INCLUDE_ALL_SHAPES + AzPhysics::MassComputeFlags possibleMassComputeFlags[] = { + AzPhysics::MassComputeFlags::NONE, AzPhysics::MassComputeFlags::DEFAULT, AzPhysics::MassComputeFlags::COMPUTE_MASS, + AzPhysics::MassComputeFlags::COMPUTE_COM, AzPhysics::MassComputeFlags::COMPUTE_INERTIA, + AzPhysics::MassComputeFlags::DEFAULT | AzPhysics::MassComputeFlags::INCLUDE_ALL_SHAPES, + AzPhysics::MassComputeFlags::COMPUTE_COM, AzPhysics::MassComputeFlags::COMPUTE_INERTIA, AzPhysics::MassComputeFlags::INCLUDE_ALL_SHAPES, + AzPhysics::MassComputeFlags::COMPUTE_MASS | AzPhysics::MassComputeFlags::COMPUTE_COM, + AzPhysics::MassComputeFlags::COMPUTE_MASS | AzPhysics::MassComputeFlags::COMPUTE_COM | AzPhysics::MassComputeFlags::INCLUDE_ALL_SHAPES, + AzPhysics::MassComputeFlags::COMPUTE_MASS | AzPhysics::MassComputeFlags::COMPUTE_INERTIA, + AzPhysics::MassComputeFlags::COMPUTE_MASS | AzPhysics::MassComputeFlags::COMPUTE_INERTIA | AzPhysics::MassComputeFlags::INCLUDE_ALL_SHAPES, + AzPhysics::MassComputeFlags::COMPUTE_COM | AzPhysics::MassComputeFlags::COMPUTE_INERTIA, + AzPhysics::MassComputeFlags::COMPUTE_COM | AzPhysics::MassComputeFlags::COMPUTE_INERTIA | AzPhysics::MassComputeFlags::INCLUDE_ALL_SHAPES }; INSTANTIATE_TEST_CASE_P(PhysX, MassComputeFixture, ::testing::Combine( diff --git a/Gems/PhysX/Code/Tests/PhysXSystemTests.cpp b/Gems/PhysX/Code/Tests/PhysXSystemTests.cpp index 747fee145b..5c3636d040 100644 --- a/Gems/PhysX/Code/Tests/PhysXSystemTests.cpp +++ b/Gems/PhysX/Code/Tests/PhysXSystemTests.cpp @@ -12,15 +12,20 @@ #include #include -#include #include #include +#include +#include #include namespace PhysX { + namespace Internal + { + static constexpr const char* DefaultSceneNameFormat = "scene-%d"; + } //setup a test fixture with no default created scene class PhysXSystemFixture : public testing::Test @@ -32,8 +37,7 @@ namespace PhysX AzPhysics::SceneConfiguration config; for (int i = 0; i < NumScenes; i++) { - config.m_sceneName = AZStd::string::format("scene-%d", i); - config.m_legacyId = AZ::Crc32(config.m_sceneName); + config.m_sceneName = AZStd::string::format(Internal::DefaultSceneNameFormat, i); m_sceneConfigs.push_back(config); } @@ -161,18 +165,14 @@ namespace PhysX AzPhysics::SceneConfiguration newSceneConfig; newSceneConfig.m_sceneName = "NewScene"; - newSceneConfig.m_legacyId = AZ::Crc32(newSceneConfig.m_sceneName); AzPhysics::SceneHandle newSceneHandle = physicsSystem->AddScene(newSceneConfig); //The old and new scene handle should share an index as the freed slot will be used - EXPECT_EQ(AZStd::get(removedSelection), - AZStd::get(newSceneHandle)); + EXPECT_EQ(AZStd::get(removedSelection), + AZStd::get(newSceneHandle)); } -#if AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS - TEST_F(PhysXSystemFixture, DISABLED_AddingScenes_PastLimitFails) -#else + TEST_F(PhysXSystemFixture, AddingScenes_PastLimitFails) -#endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { auto* physicsSystem = AZ::Interface::Get(); EXPECT_TRUE(physicsSystem->GetAllScenes().size() == 0); //there should be no scenes currently created @@ -182,13 +182,10 @@ namespace PhysX AzPhysics::SceneConfiguration config; for (int i = 0; i < std::numeric_limits::max(); i++) { - config.m_sceneName = AZStd::string::format("scene-%d", i); - config.m_legacyId = AZ::Crc32(config.m_sceneName); - + config.m_sceneName = AZStd::string::format(Internal::DefaultSceneNameFormat, i); sceneConfigs.push_back(config); } config.m_sceneName = "boom!"; - config.m_legacyId = AZ::Crc32(config.m_sceneName); //add all scene configs AzPhysics::SceneHandleList sceneHandles = physicsSystem->AddScenes(sceneConfigs); @@ -270,4 +267,59 @@ namespace PhysX physicsSystem->RegisterPreSimulateEvent(preSimEvent); physicsSystem->Simulate(frameDeltaTime); } + + TEST_F(PhysXSystemFixture, GetHandle_ReturnsExpected) + { + auto* physicsSystem = AZ::Interface::Get(); + + //add all scene configs + AzPhysics::SceneHandleList sceneHandles = physicsSystem->AddScenes(m_sceneConfigs); + + //setup the expected handle to get. + const int testSceneHandleIdx = PhysXSystemFixture::NumScenes / 2; //pick one in range + const AzPhysics::SceneHandle expectedSceneHandle = sceneHandles[testSceneHandleIdx]; + + //create name as the same way they're created in PhysXSystemFixture::Setup(); + const AZStd::string sceneName = AZStd::string::format(Internal::DefaultSceneNameFormat, testSceneHandleIdx); + + AzPhysics::SceneHandle sceneHandle = physicsSystem->GetSceneHandle(sceneName); + EXPECT_EQ(sceneHandle, expectedSceneHandle); + + //ask for a scene not in the list, returns InvalidSceneHandle + sceneHandle = physicsSystem->GetSceneHandle("ThisSceneIsNotHere"); + EXPECT_EQ(sceneHandle, AzPhysics::InvalidSceneHandle); + } + + TEST_F(PhysXSystemFixture, AddRemoveScenes_InvokesEvents) + { + auto* physicsSystem = AZ::Interface::Get(); + + //setup the add scene handler + int addedCount = 0; + AzPhysics::SystemEvents::OnSceneAddedEvent::Handler onAddedHandler([&addedCount]([[maybe_unused]]AzPhysics::SceneHandle sceneHandle) + { + addedCount++; + }); + physicsSystem->RegisterSceneAddedEvent(onAddedHandler); + + //add all scene configs + AzPhysics::SceneHandleList sceneHandles = physicsSystem->AddScenes(m_sceneConfigs); + //the handler should be invoked the same number of times of the requested scenes. + EXPECT_EQ(addedCount, m_sceneConfigs.size()); + + //Setup the removed scene handler + int removedCount = 0; + AzPhysics::SystemEvents::OnSceneRemovedEvent::Handler onRemovedHandler([&removedCount, &sceneHandles, physicsSystem](AzPhysics::SceneHandle sceneHandle) + { + removedCount++; + auto foundItr = AZStd::find(sceneHandles.begin(), sceneHandles.end(), sceneHandle); + EXPECT_NE(foundItr, sceneHandles.end()); //the handle should be in the list. + + EXPECT_NE(physicsSystem->GetScene(sceneHandle), nullptr); //should return a valid scene. + }); + physicsSystem->RegisterSceneRemovedEvent(onRemovedHandler); + + physicsSystem->RemoveScenes(sceneHandles); + EXPECT_EQ(removedCount, m_sceneConfigs.size()); + } } diff --git a/Gems/PhysX/Code/Tests/PhysXTestCommon.cpp b/Gems/PhysX/Code/Tests/PhysXTestCommon.cpp index bc613aa0bd..2404a60e0d 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestCommon.cpp +++ b/Gems/PhysX/Code/Tests/PhysXTestCommon.cpp @@ -13,15 +13,19 @@ #include -#include +#include #include -#include #include #include #include +#include +#include +#include +#include #include #include +#include #include #include #include @@ -66,16 +70,30 @@ namespace PhysX } } - EntityPtr CreateFlatTestTerrain(float width /*= 1.0f*/, float depth /*= 1.0f*/) + void UpdateScene(AzPhysics::SceneHandle sceneHandle, float timeStep, AZ::u32 numSteps) + { + auto* physicsSystem = AZ::Interface::Get(); + UpdateScene(physicsSystem->GetScene(sceneHandle), timeStep, numSteps); + } + + EntityPtr CreateFlatTestTerrain(AzPhysics::SceneHandle sceneHandle, float width /*= 1.0f*/, float depth /*= 1.0f*/) { // Creates a single static box with the top at height 0, starting at (0, 0) and going to (width, depth) AZ::Vector3 position(width * 0.5f, depth * 0.5f, -1.0f); AZ::Vector3 dimensions(width, depth, 1.0f); - return CreateStaticBoxEntity(position, dimensions); + return CreateStaticBoxEntity(sceneHandle, position, dimensions); + } + + EntityPtr CreateSphereEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float radius, const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) + { + auto colliderConfiguration = AZStd::make_shared(); + colliderConfiguration->m_collisionLayer = layer; + return CreateSphereEntity(sceneHandle, position, radius, colliderConfiguration); } - EntityPtr CreateSphereEntity(const AZ::Vector3& position, const float radius, const AZStd::shared_ptr& colliderConfig) + EntityPtr CreateSphereEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const float radius, const AZStd::shared_ptr& colliderConfig) { EntityPtr entity = AZStd::make_shared("TestSphereEntity"); entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent @@ -91,21 +109,53 @@ namespace PhysX auto shpereColliderComponent = entity->CreateComponent(); shpereColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); - Physics::RigidBodyConfiguration rigidBodyConfig; - entity->CreateComponent(rigidBodyConfig); + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + rigidBodyConfig.m_computeMass = false; + entity->CreateComponent(rigidBodyConfig, sceneHandle); + + entity->Activate(); + return entity; + } + + EntityPtr CreateStaticSphereEntity(AzPhysics::SceneHandle sceneHandle, + const AZ::Vector3& position, + const float radius, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) + { + auto entity = AZStd::make_shared("TestSphereEntity"); + entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent + entity->Init(); + + entity->Activate(); + + AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + + entity->Deactivate(); + + auto colliderConfig = AZStd::make_shared(); + colliderConfig->m_collisionLayer = layer; + auto shapeConfig = AZStd::make_shared(radius); + auto sphereColliderComponent = entity->CreateComponent(); + sphereColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + + entity->CreateComponent(sceneHandle); entity->Activate(); return entity; } - EntityPtr CreateBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions, bool isTrigger) + EntityPtr CreateBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const AZ::Vector3& dimensions, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/, bool isTrigger /*= false*/) { auto colliderConfiguration = AZStd::make_shared(); + colliderConfiguration->m_collisionLayer = layer; colliderConfiguration->m_isTrigger = isTrigger; - return CreateBoxEntity(position, dimensions, colliderConfiguration); + return CreateBoxEntity(sceneHandle, position, dimensions, colliderConfiguration); } - EntityPtr CreateStaticBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions) + EntityPtr CreateStaticBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const AZ::Vector3& dimensions /*= AZ::Vector3(1.0f)*/, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) { EntityPtr entity = AZStd::make_shared("TestBoxEntity"); entity->CreateComponent(); @@ -120,19 +170,69 @@ namespace PhysX auto shapeConfig = AZStd::make_shared(dimensions); auto boxColliderComponent = entity->CreateComponent(); auto colliderConfig = AZStd::make_shared(); + colliderConfig->m_collisionLayer = layer; boxColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); - entity->CreateComponent(); + entity->CreateComponent(sceneHandle); + entity->Activate(); + return entity; + } + + EntityPtr CreateCapsuleEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float height, const float radius, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) + { + auto entity = AZStd::make_shared("TestCapsuleEntity"); + entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent + entity->Init(); + + entity->Activate(); + + AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + + entity->Deactivate(); + + auto colliderConfig = AZStd::make_shared(); + colliderConfig->m_collisionLayer = layer; + auto shapeConfig = AZStd::make_shared(height, radius); + auto capsuleColliderComponent = entity->CreateComponent(); + capsuleColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + rigidBodyConfig.m_computeMass = false; + entity->CreateComponent(rigidBodyConfig, sceneHandle); + entity->Activate(); return entity; } - AZStd::unique_ptr CreateStaticTriangleMeshCube(float halfExtent) + EntityPtr CreateStaticCapsuleEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float height, const float radius, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) { - // Create static rigid body - Physics::RigidBodyConfiguration rigidBodyConfiguration; - AZStd::unique_ptr rigidBody = AZ::Interface::Get()->CreateStaticRigidBody(rigidBodyConfiguration); - AZ_Assert(rigidBody != nullptr, "Failed to create a rigid body"); + auto entity = AZStd::make_shared("TestCapsuleEntity"); + entity->CreateComponent(AZ::Uuid::CreateString("{22B10178-39B6-4C12-BB37-77DB45FDD3B6}")); // TransformComponent + entity->Init(); + + entity->Activate(); + + AZ::TransformBus::Event(entity->GetId(), &AZ::TransformBus::Events::SetWorldTranslation, position); + + entity->Deactivate(); + + auto colliderConfig = AZStd::make_shared(); + colliderConfig->m_collisionLayer = layer; + auto shapeConfig = AZStd::make_shared(height, radius); + auto capsuleColliderComponent = entity->CreateComponent(); + capsuleColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); + entity->CreateComponent(sceneHandle); + + entity->Activate(); + return entity; + } + + AzPhysics::SimulatedBodyHandle AddStaticTriangleMeshCubeToScene(AzPhysics::SceneHandle scene, float halfExtent) + { // Generate input data VertexIndexData cubeMeshData = GenerateCubeMeshData(halfExtent); AZStd::vector cookedData; @@ -150,12 +250,14 @@ namespace PhysX Physics::ColliderConfiguration colliderConfig; - // Create the first shape - AZStd::shared_ptr firstShape = AZ::Interface::Get()->CreateShape(colliderConfig, shapeConfig); - AZ_Assert(firstShape != nullptr, "Failed to create a shape from cooked data"); + AzPhysics::StaticRigidBodyConfiguration staticRigidBodyConfiguration; + staticRigidBodyConfiguration.m_colliderAndShapeData = AzPhysics::ShapeColliderPair(&colliderConfig, &shapeConfig); - rigidBody->AddShape(firstShape); - return rigidBody; + if (auto* sceneInterface = AZ::Interface::Get()) + { + return sceneInterface->AddSimulatedBody(scene, &staticRigidBodyConfiguration); + } + return AzPhysics::InvalidSimulatedBodyHandle; } void SetCollisionLayer(EntityPtr& entity, const AZStd::string& layerName, const AZStd::string& colliderTag) @@ -173,7 +275,7 @@ namespace PhysX Physics::CollisionFilteringRequestBus::Event(entity->GetId(), &Physics::CollisionFilteringRequests::ToggleCollisionLayer, layerName, AZ::Crc32(colliderTag.c_str()), enabled); } - EntityPtr CreateBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions, + EntityPtr CreateBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const AZ::Vector3& dimensions, const AZStd::shared_ptr& colliderConfig) { EntityPtr entity = AZStd::make_shared("TestBoxEntity"); @@ -190,14 +292,15 @@ namespace PhysX auto boxColliderComponent = entity->CreateComponent(); boxColliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); - Physics::RigidBodyConfiguration rigidBodyConfig; - entity->CreateComponent(rigidBodyConfig); + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + rigidBodyConfig.m_computeMass = false; + entity->CreateComponent(rigidBodyConfig, sceneHandle); entity->Activate(); return entity; } - EntityPtr AddUnitTestBoxComponentsMix(const AZ::Vector3& position, const char* name) + EntityPtr AddUnitTestBoxComponentsMix(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name) { EntityPtr entity = AZStd::make_shared(name); @@ -210,8 +313,8 @@ namespace PhysX auto boxCollider = entity->CreateComponent(); boxCollider->SetShapeConfigurationList(shapeConfigList); - Physics::RigidBodyConfiguration rigidBodyConfig; - entity->CreateComponent(rigidBodyConfig); + AzPhysics::RigidBodyConfiguration rigidBodyConfig; + entity->CreateComponent(rigidBodyConfig, sceneHandle); // Removing and adding component can cause race condition in component activation code if dependencies are not correct // Simulation of user removing one collider and adding another @@ -266,5 +369,126 @@ namespace PhysX return AZStd::make_pair(points, indices); } + AzPhysics::StaticRigidBody* AddStaticFloorToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Transform& transform) + { + Physics::ColliderConfiguration colliderConfig; + Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(20.0f, 20.0f, 1.0f)); + AzPhysics::StaticRigidBodyConfiguration staticBodyConfiguration; + staticBodyConfiguration.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &staticBodyConfiguration); + if (auto* floor = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, simBodyHandle))) + { + floor->SetTransform(transform); + return floor; + } + } + return nullptr; + } + + AzPhysics::StaticRigidBody* AddStaticUnitBoxToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = AddStaticBoxToScene(sceneHandle, position); + if (auto* sceneInterface = AZ::Interface::Get()) + { + return azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, simBodyHandle)); + } + return nullptr; + } + + AzPhysics::RigidBody* AddUnitBoxToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position) + { + AzPhysics::SimulatedBodyHandle simBodyHandle = AddBoxToScene(sceneHandle, position); + if (auto* sceneInterface = AZ::Interface::Get()) + { + return azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, simBodyHandle)); + } + return nullptr; + } + + AzPhysics::SimulatedBodyHandle AddSphereToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float radius /*= 0.5f*/, const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) + { + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_collisionLayer = layer; + Physics::SphereShapeConfiguration shapeConfiguration; + shapeConfiguration.m_radius = radius; + AzPhysics::RigidBodyConfiguration rigidBodySettings; + rigidBodySettings.m_position = position; + rigidBodySettings.m_linearDamping = 0.0f; + rigidBodySettings.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + + if (auto* sceneInterface = AZ::Interface::Get()) + { + return sceneInterface->AddSimulatedBody(sceneHandle, &rigidBodySettings); + } + return AzPhysics::InvalidSimulatedBodyHandle; + } + + AzPhysics::SimulatedBodyHandle AddCapsuleToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float height /*= 2.0f*/, const float radius /*= 0.5f*/, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) + { + AzPhysics::RigidBodyConfiguration rigidBodySettings; + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_collisionLayer = layer; + colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi); + Physics::CapsuleShapeConfiguration shapeConfig(height, radius); + rigidBodySettings.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfig); + rigidBodySettings.m_position = position; + + if (auto* sceneInterface = AZ::Interface::Get()) + { + return sceneInterface->AddSimulatedBody(sceneHandle, &rigidBodySettings); + } + return AzPhysics::InvalidSimulatedBodyHandle; + } + + AzPhysics::SimulatedBodyHandle AddBoxToScene(AzPhysics::SceneHandle sceneHandle, + const AZ::Vector3& position, const AZ::Vector3& dimensions /*= AZ::Vector3(1.0f)*/, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) + { + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_collisionLayer = layer; + Physics::BoxShapeConfiguration shapeConfiguration; + shapeConfiguration.m_dimensions = dimensions; + + AzPhysics::RigidBodyConfiguration rigidBodySettings; + rigidBodySettings.m_position = position; + rigidBodySettings.m_linearDamping = 0.0f; + rigidBodySettings.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + if (auto* sceneInterface = AZ::Interface::Get()) + { + return sceneInterface->AddSimulatedBody(sceneHandle, &rigidBodySettings); + } + return AzPhysics::InvalidSimulatedBodyHandle; + } + + AzPhysics::SimulatedBodyHandle AddStaticBoxToScene(AzPhysics::SceneHandle sceneHandle, + const AZ::Vector3& position, const AZ::Vector3& dimensions /*= AZ::Vector3(1.0f)*/, + const AzPhysics::CollisionLayer& layer /*= AzPhysics::CollisionLayer::Default*/) + { + Physics::ColliderConfiguration colliderConfig; + colliderConfig.m_collisionLayer = layer; + Physics::BoxShapeConfiguration shapeConfiguration; + shapeConfiguration.m_dimensions = dimensions; + AzPhysics::StaticRigidBodyConfiguration rigidBodySettings; + rigidBodySettings.m_position = position; + rigidBodySettings.m_colliderAndShapeData = AZStd::make_pair(&colliderConfig, &shapeConfiguration); + + if (auto* sceneInterface = AZ::Interface::Get()) + { + return sceneInterface->AddSimulatedBody(sceneHandle, &rigidBodySettings); + } + return AzPhysics::InvalidSimulatedBodyHandle; + } + + float GetPositionElement(EntityPtr entity, int element) + { + AZ::Transform transform = AZ::Transform::CreateIdentity(); + AZ::TransformBus::EventResult(transform, entity->GetId(), &AZ::TransformInterface::GetWorldTM); + return transform.GetTranslation().GetElement(element); + } } } diff --git a/Gems/PhysX/Code/Tests/PhysXTestCommon.h b/Gems/PhysX/Code/Tests/PhysXTestCommon.h index 679d8be048..c4d08953eb 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestCommon.h +++ b/Gems/PhysX/Code/Tests/PhysXTestCommon.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -25,12 +26,9 @@ namespace AzPhysics { + struct RigidBody; class Scene; -} - -namespace Physics -{ - class RigidBodyStatic; + struct StaticRigidBody; } namespace PhysX @@ -55,21 +53,45 @@ namespace PhysX // Updates the default world void UpdateScene(AzPhysics::Scene* scene, float timeStep, AZ::u32 numSteps); + void UpdateScene(AzPhysics::SceneHandle sceneHandle, float timeStep, AZ::u32 numSteps); // Create a flat "Terrain" for testing - EntityPtr CreateFlatTestTerrain(float width = 1.0f, float depth = 1.0f); + EntityPtr CreateFlatTestTerrain(AzPhysics::SceneHandle sceneHandle, float width = 1.0f, float depth = 1.0f); // Create spheres - EntityPtr CreateSphereEntity(const AZ::Vector3& position, const float radius, const AZStd::shared_ptr& colliderConfig); + EntityPtr CreateSphereEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float radius, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + EntityPtr CreateSphereEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float radius, const AZStd::shared_ptr& colliderConfig); + + // Create static spheres + EntityPtr CreateStaticSphereEntity(AzPhysics::SceneHandle sceneHandle, + const AZ::Vector3& position, + const float radius, + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); // Create dynamic boxes - EntityPtr CreateBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions, bool isTrigger = false); - EntityPtr CreateBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions, + EntityPtr CreateBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const AZ::Vector3& dimensions, + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default, bool isTrigger = false); + EntityPtr CreateBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const AZ::Vector3& dimensions, const AZStd::shared_ptr& colliderConfig); // Create static boxes - EntityPtr CreateStaticBoxEntity(const AZ::Vector3& position, const AZ::Vector3& dimensions); - AZStd::unique_ptr CreateStaticTriangleMeshCube(float halfExtent); + EntityPtr CreateStaticBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const AZ::Vector3& dimensions = AZ::Vector3(1.0f), + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + + // Create Capsules + EntityPtr CreateCapsuleEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float height, const float radius, + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + + // Create static Capsules + EntityPtr CreateStaticCapsuleEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float height, const float radius, + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + + AzPhysics::SimulatedBodyHandle AddStaticTriangleMeshCubeToScene(AzPhysics::SceneHandle scene, float halfExtent); // Collision Filtering void SetCollisionLayer(EntityPtr& entity, const AZStd::string& layerName, const AZStd::string& colliderTag = ""); @@ -78,10 +100,10 @@ namespace PhysX // Generic creation functions template - EntityPtr AddUnitTestObject(const AZ::Vector3& position, const char* name = "TestObjectEntity"); + EntityPtr AddUnitTestObject(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name = "TestObjectEntity"); template - EntityPtr AddStaticUnitTestObject(const AZ::Vector3& position, const char* name = "TestObjectEntity"); + EntityPtr AddStaticUnitTestObject(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name = "TestObjectEntity"); template EntityPtr CreateTriggerAtPosition(const AZ::Vector3& position); @@ -90,12 +112,31 @@ namespace PhysX EntityPtr CreateDynamicTriggerAtPosition(const AZ::Vector3& position); // Misc - EntityPtr AddUnitTestBoxComponentsMix(const AZ::Vector3& position, const char* name = "TestBoxEntity"); + EntityPtr AddUnitTestBoxComponentsMix(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name = "TestBoxEntity"); // Mesh data generation PointList GeneratePyramidPoints(float length); VertexIndexData GenerateCubeMeshData(float halfExtent); + AzPhysics::StaticRigidBody* AddStaticFloorToScene(AzPhysics::SceneHandle sceneHandle, + const AZ::Transform& transform = AZ::Transform::CreateIdentity()); + AzPhysics::StaticRigidBody* AddStaticUnitBoxToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position); + AzPhysics::RigidBody* AddUnitBoxToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position); + + AzPhysics::SimulatedBodyHandle AddSphereToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float radius = 0.5f, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + AzPhysics::SimulatedBodyHandle AddCapsuleToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, + const float height = 2.0f, const float radius = 0.5f, + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + AzPhysics::SimulatedBodyHandle AddBoxToScene(AzPhysics::SceneHandle sceneHandle, + const AZ::Vector3& position, const AZ::Vector3& dimensions = AZ::Vector3(1.0f), + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + AzPhysics::SimulatedBodyHandle AddStaticBoxToScene(AzPhysics::SceneHandle sceneHandle, + const AZ::Vector3& position, const AZ::Vector3& dimensions = AZ::Vector3(1.0f), + const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default); + + float GetPositionElement(EntityPtr entity, int element); + } // namespace TestUtils } // namespace PhysX diff --git a/Gems/PhysX/Code/Tests/PhysXTestCommon.inl b/Gems/PhysX/Code/Tests/PhysXTestCommon.inl index de231bda37..b3528a7493 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestCommon.inl +++ b/Gems/PhysX/Code/Tests/PhysXTestCommon.inl @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -20,7 +21,7 @@ namespace PhysX namespace TestUtils { template - EntityPtr AddUnitTestObject(const AZ::Vector3& position, const char* name) + EntityPtr AddUnitTestObject(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name) { EntityPtr entity = AZStd::make_shared(name); @@ -31,16 +32,16 @@ namespace PhysX auto colliderConfig = AZStd::make_shared(); auto shapeConfig = AZStd::make_shared(); colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); - Physics::RigidBodyConfiguration rigidBodyConfig; + AzPhysics::RigidBodyConfiguration rigidBodyConfig; rigidBodyConfig.m_computeMass = false; - entity->CreateComponent(rigidBodyConfig); + entity->CreateComponent(rigidBodyConfig, sceneHandle); entity->Init(); entity->Activate(); return entity; } template - EntityPtr AddStaticUnitTestObject(const AZ::Vector3& position, const char* name) + EntityPtr AddStaticUnitTestObject(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name) { EntityPtr entity = AZStd::make_shared(name); @@ -52,7 +53,7 @@ namespace PhysX auto shapeConfig = AZStd::make_shared(); colliderComponent->SetShapeConfigurationList({ AZStd::make_pair(colliderConfig, shapeConfig) }); - entity->CreateComponent(); + entity->CreateComponent(sceneHandle); entity->Init(); entity->Activate(); diff --git a/Gems/PhysX/Code/Tests/PhysXTestFixtures.cpp b/Gems/PhysX/Code/Tests/PhysXTestFixtures.cpp index 490cc93a76..8998e84013 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestFixtures.cpp +++ b/Gems/PhysX/Code/Tests/PhysXTestFixtures.cpp @@ -16,6 +16,7 @@ #include #include +#include //hook in the test environments for Gem::PhysX.Tests #include @@ -39,12 +40,9 @@ namespace PhysX if (auto* physicsSystem = AZ::Interface::Get()) { AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = Physics::DefaultPhysicsWorldId; + sceneConfiguration.m_sceneName = AzPhysics::DefaultPhysicsSceneName; m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration); - if (m_defaultScene = physicsSystem->GetScene(m_testSceneHandle)) - { - m_defaultScene->GetLegacyWorld()->SetEventHandler(this); - } + m_defaultScene = physicsSystem->GetScene(m_testSceneHandle); } Physics::DefaultWorldBus::Handler::BusConnect(); @@ -67,34 +65,9 @@ namespace PhysX m_testSceneHandle = AzPhysics::InvalidSceneHandle; TestUtils::ResetPhysXSystem(); } - - AZStd::shared_ptr PhysXDefaultWorldTest::GetDefaultWorld() - { - return m_defaultScene->GetLegacyWorld(); - } - - void PhysXDefaultWorldTest::OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), &Physics::TriggerNotifications::OnTriggerEnter, triggerEvent); - } - - void PhysXDefaultWorldTest::OnTriggerExit(const Physics::TriggerEvent& triggerEvent) - { - Physics::TriggerNotificationBus::QueueEvent(triggerEvent.m_triggerBody->GetEntityId(), &Physics::TriggerNotifications::OnTriggerExit, triggerEvent); - } - - void PhysXDefaultWorldTest::OnCollisionBegin(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionBegin, event); - } - - void PhysXDefaultWorldTest::OnCollisionPersist(const Physics::CollisionEvent& event) - { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionPersist, event); - } - - void PhysXDefaultWorldTest::OnCollisionEnd(const Physics::CollisionEvent& event) + + AzPhysics::SceneHandle PhysXDefaultWorldTest::GetDefaultSceneHandle() const { - Physics::CollisionNotificationBus::QueueEvent(event.m_body1->GetEntityId(), &Physics::CollisionNotifications::OnCollisionEnd, event); + return m_testSceneHandle; } } diff --git a/Gems/PhysX/Code/Tests/PhysXTestFixtures.h b/Gems/PhysX/Code/Tests/PhysXTestFixtures.h index 4c882f77ba..d975cb4c2f 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestFixtures.h +++ b/Gems/PhysX/Code/Tests/PhysXTestFixtures.h @@ -14,16 +14,12 @@ #include #include -#include #include -#include -#include -#include -#include namespace AzPhysics { class Scene; + struct TriggerEvent; } namespace PhysX @@ -33,22 +29,13 @@ namespace PhysX class PhysXDefaultWorldTest : public ::testing::Test , protected Physics::DefaultWorldBus::Handler - , protected Physics::WorldEventHandler { protected: void SetUp() override; void TearDown() override; // DefaultWorldBus - AZStd::shared_ptr GetDefaultWorld() override; - - // WorldEventHandler - void OnTriggerEnter(const Physics::TriggerEvent& triggerEvent) override; - void OnTriggerExit(const Physics::TriggerEvent& triggerEvent) override; - - void OnCollisionBegin(const Physics::CollisionEvent& event); - void OnCollisionPersist(const Physics::CollisionEvent& event); - void OnCollisionEnd(const Physics::CollisionEvent& event); + AzPhysics::SceneHandle GetDefaultSceneHandle() const override; AZ::ComponentDescriptor* m_dummyTerrainComponentDescriptor = nullptr; AzPhysics::Scene* m_defaultScene = nullptr; diff --git a/Gems/PhysX/Code/Tests/PhysXTestUtil.cpp b/Gems/PhysX/Code/Tests/PhysXTestUtil.cpp index 2ae5a4e5fa..8c2756b797 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestUtil.cpp +++ b/Gems/PhysX/Code/Tests/PhysXTestUtil.cpp @@ -13,71 +13,126 @@ #include #include "PhysXTestUtil.h" +#include +#include namespace PhysX { CollisionCallbacksListener::CollisionCallbacksListener(AZ::EntityId entityId) { - Physics::CollisionNotificationBus::Handler::BusConnect(entityId); + InitCollisionHandlers(); + + if (auto* physicsSystem = AZ::Interface::Get()) + { + auto [sceneHandle, bodyHandle] = physicsSystem->FindAttachedBodyHandleFromEntityId(entityId); + if (sceneHandle != AzPhysics::InvalidSceneHandle) + { + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionBeginHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionPersistHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionEndHandler); + } + } } - CollisionCallbacksListener::~CollisionCallbacksListener() + CollisionCallbacksListener::CollisionCallbacksListener(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) { - Physics::CollisionNotificationBus::Handler::BusDisconnect(); + InitCollisionHandlers(); + + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionBeginHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionPersistHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnCollisionBeginHandler(sceneHandle, bodyHandle, m_onCollisionEndHandler); } - void CollisionCallbacksListener::OnCollisionBegin(const Physics::CollisionEvent& collision) + CollisionCallbacksListener::~CollisionCallbacksListener() { - if (m_onCollisionBegin) - { - m_onCollisionBegin(collision); - } - m_beginCollisions.push_back(collision); + m_onCollisionBeginHandler.Disconnect(); + m_onCollisionPersistHandler.Disconnect(); + m_onCollisionEndHandler.Disconnect(); } - void CollisionCallbacksListener::OnCollisionPersist(const Physics::CollisionEvent& collision) + void CollisionCallbacksListener::InitCollisionHandlers() { - if (m_onCollisionPersist) - { - m_onCollisionPersist(collision); - } - m_persistCollisions.push_back(collision); + m_onCollisionBeginHandler = AzPhysics::SimulatedBodyEvents::OnCollisionBegin::Handler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::CollisionEvent& event) + { + if (m_onCollisionBegin) + { + m_onCollisionBegin(event); + } + m_beginCollisions.push_back(event); + }); + m_onCollisionPersistHandler = AzPhysics::SimulatedBodyEvents::OnCollisionPersist::Handler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::CollisionEvent& event) + { + if (m_onCollisionPersist) + { + m_onCollisionPersist(event); + } + m_persistCollisions.push_back(event); + }); + m_onCollisionEndHandler = AzPhysics::SimulatedBodyEvents::OnCollisionEnd::Handler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::CollisionEvent& event) + { + if (m_onCollisionEnd) + { + m_onCollisionEnd(event); + } + m_endCollisions.push_back(event); + }); } - void CollisionCallbacksListener::OnCollisionEnd(const Physics::CollisionEvent& collision) + TestTriggerAreaNotificationListener::TestTriggerAreaNotificationListener(AZ::EntityId entityId) { - if (m_onCollisionEnd) + InitTriggerHandlers(); + if (auto* physicsSystem = AZ::Interface::Get()) { - m_onCollisionEnd(collision); + auto [sceneHandle, bodyHandle] = physicsSystem->FindAttachedBodyHandleFromEntityId(entityId); + if (sceneHandle != AzPhysics::InvalidSceneHandle) + { + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerEnterHandler(sceneHandle, bodyHandle, m_onTriggerEnterHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerExitHandler(sceneHandle, bodyHandle, m_onTriggerExitHandler); + } } - m_endCollisions.push_back(collision); } - TestTriggerAreaNotificationListener::TestTriggerAreaNotificationListener(AZ::EntityId triggerAreaEntityId) + TestTriggerAreaNotificationListener::TestTriggerAreaNotificationListener(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) { - Physics::TriggerNotificationBus::Handler::BusConnect(triggerAreaEntityId); + InitTriggerHandlers(); + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerEnterHandler(sceneHandle, bodyHandle, m_onTriggerEnterHandler); + AzPhysics::SimulatedBodyEvents::RegisterOnTriggerEnterHandler(sceneHandle, bodyHandle, m_onTriggerExitHandler); } TestTriggerAreaNotificationListener::~TestTriggerAreaNotificationListener() { - Physics::TriggerNotificationBus::Handler::BusDisconnect(); + m_onTriggerEnterHandler.Disconnect(); + m_onTriggerExitHandler.Disconnect(); } - void TestTriggerAreaNotificationListener::OnTriggerEnter(const Physics::TriggerEvent& event) + void TestTriggerAreaNotificationListener::InitTriggerHandlers() { - if (m_onTriggerEnter) - { - m_onTriggerEnter(event); - } - m_enteredEvents.push_back(event); - } + m_onTriggerEnterHandler = AzPhysics::SimulatedBodyEvents::OnTriggerEnter::Handler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::TriggerEvent& event) + { + if (m_onTriggerEnter) + { + m_onTriggerEnter(event); + } + m_enteredEvents.push_back(event); + }); - void TestTriggerAreaNotificationListener::OnTriggerExit(const Physics::TriggerEvent& event) - { - if (m_onTriggerExit) - { - m_onTriggerExit(event); - } - m_exitedEvents.push_back(event); + m_onTriggerExitHandler = AzPhysics::SimulatedBodyEvents::OnTriggerExit::Handler( + [this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, + const AzPhysics::TriggerEvent& event) + { + if (m_onTriggerExit) + { + m_onTriggerExit(event); + } + m_exitedEvents.push_back(event); + }); } } diff --git a/Gems/PhysX/Code/Tests/PhysXTestUtil.h b/Gems/PhysX/Code/Tests/PhysXTestUtil.h index e56f43bf28..85f462959a 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestUtil.h +++ b/Gems/PhysX/Code/Tests/PhysXTestUtil.h @@ -13,53 +13,58 @@ #pragma once #include "AzCore/Component/Component.h" -#include -#include +#include +#include #include namespace PhysX { - //! CollisionCallbacksListener listens to collision events for a particular entity id. + //! CollisionCallbacksListener listens to collision events for a particular sceneHandle and simulatedBodyHandle class CollisionCallbacksListener - : public Physics::CollisionNotificationBus::Handler { public: - CollisionCallbacksListener(AZ::EntityId entityId); + explicit CollisionCallbacksListener(AZ::EntityId entityId); + CollisionCallbacksListener(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle); ~CollisionCallbacksListener(); - void OnCollisionBegin(const Physics::CollisionEvent& collision) override; - void OnCollisionPersist(const Physics::CollisionEvent& collision) override; - void OnCollisionEnd(const Physics::CollisionEvent& collision) override; + AZStd::vector m_beginCollisions; + AZStd::vector m_persistCollisions; + AZStd::vector m_endCollisions; - AZStd::vector m_beginCollisions; - AZStd::vector m_persistCollisions; - AZStd::vector m_endCollisions; + AZStd::function m_onCollisionBegin; + AZStd::function m_onCollisionPersist; + AZStd::function m_onCollisionEnd; - AZStd::function m_onCollisionBegin; - AZStd::function m_onCollisionPersist; - AZStd::function m_onCollisionEnd; + private: + void InitCollisionHandlers(); + + AzPhysics::SimulatedBodyEvents::OnCollisionBegin::Handler m_onCollisionBeginHandler; + AzPhysics::SimulatedBodyEvents::OnCollisionPersist::Handler m_onCollisionPersistHandler; + AzPhysics::SimulatedBodyEvents::OnCollisionEnd::Handler m_onCollisionEndHandler; }; - //! TestTriggerAreaNotificationListener listens to trigger events for a particular entity id. + //! TestTriggerAreaNotificationListener listens to trigger events for a particular sceneHandle and simulatedBodyHandle class TestTriggerAreaNotificationListener - : protected Physics::TriggerNotificationBus::Handler { public: - TestTriggerAreaNotificationListener(AZ::EntityId triggerAreaEntityId); + explicit TestTriggerAreaNotificationListener(AZ::EntityId entityId); + TestTriggerAreaNotificationListener(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle); ~TestTriggerAreaNotificationListener(); - void OnTriggerEnter(const Physics::TriggerEvent& event) override; - void OnTriggerExit(const Physics::TriggerEvent& event) override; - - const AZStd::vector& GetEnteredEvents() const { return m_enteredEvents; } - const AZStd::vector& GetExitedEvents() const { return m_exitedEvents; } + const AZStd::vector& GetEnteredEvents() const { return m_enteredEvents; } + const AZStd::vector& GetExitedEvents() const { return m_exitedEvents; } - AZStd::function m_onTriggerEnter; - AZStd::function m_onTriggerExit; + AZStd::function m_onTriggerEnter; + AZStd::function m_onTriggerExit; private: - AZStd::vector m_enteredEvents; - AZStd::vector m_exitedEvents; + void InitTriggerHandlers(); + + AZStd::vector m_enteredEvents; + AZStd::vector m_exitedEvents; + + AzPhysics::SimulatedBodyEvents::OnTriggerEnter::Handler m_onTriggerEnterHandler; + AzPhysics::SimulatedBodyEvents::OnTriggerExit::Handler m_onTriggerExitHandler; }; diff --git a/Gems/PhysX/Code/Tests/PhysXWorldTest.cpp b/Gems/PhysX/Code/Tests/PhysXWorldTest.cpp deleted file mode 100644 index 3a2c1d96c4..0000000000 --- a/Gems/PhysX/Code/Tests/PhysXWorldTest.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include -#include -#include -#include -#include -#include -#include - -namespace PhysX -{ - class WorldEventListener - : public Physics::WorldNotificationBus::Handler - - { - public: - - WorldEventListener(const char* worldId = "") - : WorldEventListener(worldId, WorldNotifications::Default) - { - } - - WorldEventListener(const char* worldId, int priority) - : m_updateOrder(priority) - { - Physics::WorldNotificationBus::Handler::BusConnect(AZ::Crc32(worldId)); - } - - void Cleanup() - { - Physics::WorldNotificationBus::Handler::BusDisconnect(); - } - - void OnPrePhysicsSubtick(float fixedDeltaTime) override - { - if(m_onPreUpdate) - m_onPreUpdate(fixedDeltaTime); - m_preUpdates.push_back(fixedDeltaTime); - } - - void OnPostPhysicsSubtick(float fixedDeltaTime) override - { - if (m_onPostUpdate) - m_onPostUpdate(fixedDeltaTime); - m_postUpdates.push_back(fixedDeltaTime); - } - - int GetPhysicsTickOrder() override - { - return m_updateOrder; - } - - AZStd::vector m_preUpdates; - AZStd::vector m_postUpdates; - AZStd::function m_onPostUpdate; - AZStd::function m_onPreUpdate; - int m_updateOrder = WorldNotifications::Default; - }; - - class PhysXWorldTest - : public::testing::Test - { - protected: - using ScenePtr = AzPhysics::Scene*; - - AZStd::tuple CreateWorld(const char* worldId) - { - ScenePtr scene = nullptr; - if (auto* physicsSystem = AZ::Interface::Get()) - { - AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = AZ::Crc32(worldId); - AzPhysics::SceneHandle sceneHandle = physicsSystem->AddScene(sceneConfiguration); - if (scene = physicsSystem->GetScene(sceneHandle)) - { - m_createdSceneHandles.emplace_back(sceneHandle); - } - } - return AZStd::make_tuple(scene, WorldEventListener(worldId)); - } - - void TearDown() override - { - //Ensure any Scenes used have been created are removed - if (auto* physicsSystem = AZ::Interface::Get()) - { - physicsSystem->RemoveScenes(m_createdSceneHandles); - } - m_createdSceneHandles.clear(); - TestUtils::ResetPhysXSystem(); - } - - AzPhysics::SceneHandleList m_createdSceneHandles; - }; - - TEST_F(PhysXWorldTest, OnPostUpdateTriggeredPerWorld) - { - constexpr const float deltaTime = AzPhysics::SystemConfiguration::DefaultFixedTimestep; - auto* phsyicsSystem = AZ::Interface::Get(); - - //Setup Scene 1 - ScenePtr scene1; - WorldEventListener listener1; - std::tie(scene1, listener1) = CreateWorld("scene1"); - - // Tick the physics system, the fixed update should only run once. - phsyicsSystem->Simulate(deltaTime); - listener1.Cleanup(); //disconnect the handler - - //setup scene 2 - ScenePtr scene2; - WorldEventListener listener2; - std::tie(scene2, listener2) = CreateWorld("scene2"); - - // Tick the physics system, the fixed update should run twice. - phsyicsSystem->Simulate(deltaTime*2); - - listener2.Cleanup(); - // Then, we should receive correct amount of updates per world - EXPECT_EQ(1, listener1.m_postUpdates.size()); - EXPECT_EQ(2, listener2.m_postUpdates.size()); - } - - TEST_F(PhysXWorldTest, OnPreUpdateTriggeredPerWorld) - { - constexpr const float deltaTime = AzPhysics::SystemConfiguration::DefaultFixedTimestep; - auto* phsyicsSystem = AZ::Interface::Get(); - - //Setup Scene 1 - ScenePtr scene1; - WorldEventListener listener1; - std::tie(scene1, listener1) = CreateWorld("scene1"); - - // Tick the physics system, the fixed update should only run once. - phsyicsSystem->Simulate(deltaTime); - listener1.Cleanup(); //disconnect the handler - - //setup scene 2 - ScenePtr scene2; - WorldEventListener listener2; - std::tie(scene2, listener2) = CreateWorld("scene2"); - - // Tick the physics system, the fixed update should run twice. - phsyicsSystem->Simulate(deltaTime * 2); - - listener2.Cleanup(); - // Then, we should receive correct amount of updates per world - EXPECT_EQ(1, listener1.m_preUpdates.size()); - EXPECT_EQ(2, listener2.m_preUpdates.size()); - } - - TEST_F(PhysXWorldTest, WorldNotificationBusOrdered) - { - // GIVEN there is a world with multiple listeners - const char* worldId = "scene1"; - ScenePtr scene = nullptr; - AzPhysics::SceneHandle sceneHandle = AzPhysics::InvalidSceneHandle; - auto* physicsSystem = AZ::Interface::Get(); - if (physicsSystem != nullptr) - { - AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = AZ::Crc32(worldId); - sceneHandle = physicsSystem->AddScene(sceneConfiguration); - scene = physicsSystem->GetScene(sceneHandle); - } - - // Connect the buses in random-ish order. - WorldEventListener listener1(worldId, Physics::WorldNotifications::Physics); - WorldEventListener listener5(worldId, Physics::WorldNotifications::Default); - WorldEventListener listener3(worldId, Physics::WorldNotifications::Components); - WorldEventListener listener4(worldId, Physics::WorldNotifications::Scripting); - WorldEventListener listener2(worldId, Physics::WorldNotifications::Animation); - - AZStd::vector updateEvents; - listener1.m_onPostUpdate = [&](float){ - updateEvents.push_back(listener1.m_updateOrder); - }; - - listener2.m_onPostUpdate = [&](float) { - updateEvents.push_back(listener2.m_updateOrder); - }; - - listener3.m_onPostUpdate = [&](float) { - updateEvents.push_back(listener3.m_updateOrder); - }; - - listener4.m_onPostUpdate = [&](float) { - updateEvents.push_back(listener4.m_updateOrder); - }; - - listener5.m_onPostUpdate = [&](float) { - updateEvents.push_back(listener5.m_updateOrder); - }; - - // WHEN the world is ticked. - TestUtils::UpdateScene(scene, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); - - listener1.Cleanup(); - listener2.Cleanup(); - listener3.Cleanup(); - listener4.Cleanup(); - listener5.Cleanup(); - - // THEN all the listeners were updated in the correct order. - EXPECT_EQ(5, updateEvents.size()); - EXPECT_TRUE(AZStd::is_sorted(updateEvents.begin(), updateEvents.end())); - - if (physicsSystem != nullptr) - { - scene = nullptr; - physicsSystem->RemoveScene(sceneHandle); - sceneHandle = AzPhysics::InvalidSceneHandle; - } - } -} diff --git a/Gems/PhysX/Code/Tests/PolygonPrismMeshUtilsTest.cpp b/Gems/PhysX/Code/Tests/PolygonPrismMeshUtilsTest.cpp index e23dfa19ce..8319536480 100644 --- a/Gems/PhysX/Code/Tests/PolygonPrismMeshUtilsTest.cpp +++ b/Gems/PhysX/Code/Tests/PolygonPrismMeshUtilsTest.cpp @@ -301,7 +301,7 @@ namespace PolygonPrismMeshUtils Mesh2D mesh2d = CreateFromPolygon(testData.polygonHShape); mesh2d.ConvexMerge(); const float height = 1.5f; - const float scale = 0.2f; + const AZ::Vector3 scale(0.2f); const AZStd::vector& debugDrawPoints = mesh2d.GetDebugDrawPoints(height, scale); // the points should appear in pairs, so there should be an even number of them @@ -320,7 +320,7 @@ namespace PolygonPrismMeshUtils } EXPECT_TRUE(min.IsClose(AZ::Vector3::CreateZero())); - EXPECT_TRUE(max.IsClose(AZ::Vector3(3.0f * scale, 3.0f * scale, height * scale))); + EXPECT_TRUE(max.IsClose(scale * AZ::Vector3(3.0f, 3.0f, height))); } } // namespace PolygonPrismMeshUtils diff --git a/Gems/PhysX/Code/Tests/RagdollConfiguration.xml b/Gems/PhysX/Code/Tests/RagdollConfiguration.xml index ced90727d0..e1c2c5bed9 100644 --- a/Gems/PhysX/Code/Tests/RagdollConfiguration.xml +++ b/Gems/PhysX/Code/Tests/RagdollConfiguration.xml @@ -25,7 +25,6 @@ - @@ -64,7 +63,6 @@ - @@ -103,7 +101,6 @@ - @@ -142,7 +139,6 @@ - @@ -181,7 +177,6 @@ - @@ -220,7 +215,6 @@ - @@ -259,7 +253,6 @@ - @@ -298,7 +291,6 @@ - @@ -337,7 +329,6 @@ - @@ -376,7 +367,6 @@ - @@ -415,7 +405,6 @@ - @@ -454,7 +443,6 @@ - @@ -493,7 +481,6 @@ - @@ -532,7 +519,6 @@ - @@ -571,7 +557,6 @@ - @@ -610,7 +595,6 @@ - @@ -649,7 +633,6 @@ - @@ -688,7 +671,6 @@ - @@ -727,7 +709,6 @@ - @@ -766,7 +747,6 @@ - @@ -805,7 +785,6 @@ - @@ -844,7 +823,6 @@ - diff --git a/Gems/PhysX/Code/Tests/RagdollTests.cpp b/Gems/PhysX/Code/Tests/RagdollTests.cpp index ac92ef764e..184cbab4a5 100644 --- a/Gems/PhysX/Code/Tests/RagdollTests.cpp +++ b/Gems/PhysX/Code/Tests/RagdollTests.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -64,7 +63,7 @@ namespace PhysX return ragdollState; } - AZStd::unique_ptr CreateRagdoll() + AZStd::unique_ptr CreateRagdoll(AzPhysics::SceneHandle sceneHandle) { Physics::RagdollConfiguration* configuration = AZ::Utils::LoadObjectFromFile(AZ::Test::GetCurrentExecutablePath() + "/Test.Assets/Gems/PhysX/Code/Tests/RagdollConfiguration.xml"); @@ -76,7 +75,7 @@ namespace PhysX parentIndices.push_back(RagdollTestData::ParentIndices[i]); } - return Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices); + return Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices, sceneHandle); } #if AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS @@ -85,7 +84,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetNativeType_CorrectType) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); EXPECT_EQ(ragdoll->GetNativeType(), NativeTypeIdentifiers::Ragdoll); const size_t numNodes = ragdoll->GetNumNodes(); @@ -101,7 +100,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, RagdollNode_GetNativePointer_CorrectType) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); const size_t numNodes = ragdoll->GetNumNodes(); for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) @@ -117,7 +116,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, RagdollNode_GetTransform_MatchesTestSetup) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); ragdoll->EnableSimulation(GetTPose()); for (size_t nodeIndex = 0; nodeIndex < RagdollTestData::NumNodes; nodeIndex++) @@ -138,7 +137,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetTransform_MatchesTestSetup) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); auto orientation = ragdoll->GetOrientation(); auto position = ragdoll->GetPosition(); @@ -155,22 +154,21 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetWorld_CorrectWorld) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); // the ragdoll isn't enabled yet, so it shouldn't be in a world - EXPECT_EQ(ragdoll->GetWorld(), nullptr); + EXPECT_FALSE(ragdoll->IsSimulated()); const size_t numNodes = ragdoll->GetNumNodes(); for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { - EXPECT_EQ(ragdoll->GetNode(nodeIndex)->GetWorld(), nullptr); + EXPECT_FALSE(ragdoll->GetNode(nodeIndex)->IsSimulating()); } ragdoll->EnableSimulation(GetTPose()); - EXPECT_EQ(ragdoll->GetWorld()->GetWorldId(), Physics::DefaultPhysicsWorldId); - EXPECT_EQ(ragdoll->GetWorldId(), Physics::DefaultPhysicsWorldId); + EXPECT_TRUE(ragdoll->IsSimulated()); for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { - EXPECT_EQ(ragdoll->GetNode(nodeIndex)->GetWorld()->GetWorldId(), Physics::DefaultPhysicsWorldId); + EXPECT_TRUE(ragdoll->GetNode(nodeIndex)->IsSimulating()); } } @@ -180,7 +178,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetNumNodes_EqualsNumInTestPose) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); EXPECT_EQ(ragdoll->GetNumNodes(), RagdollTestData::NumNodes); } @@ -190,7 +188,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetJoint_MatchesTestDataJointStructure) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); const size_t numNodes = RagdollTestData::NumNodes; for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { @@ -217,7 +215,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetAabb_MatchesTestPoseAabb) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); auto aabb = ragdoll->GetAabb(); EXPECT_TRUE(aabb.GetMin().IsClose(AZ::Vector3(-0.623f, -0.145f, -0.005f), 1e-3f)); EXPECT_TRUE(aabb.GetMax().IsClose(AZ::Vector3(0.623f, 0.166f, 1.724f), 1e-3f)); @@ -229,7 +227,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetNodeOutsideRange_GeneratesError) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); UnitTest::ErrorHandler errorHandler("Invalid node index"); // this node index should be valid @@ -247,7 +245,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_GetNodeStateOutsideRange_GeneratesError) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); UnitTest::ErrorHandler errorHandler("Invalid node index"); // this node index should be valid @@ -266,7 +264,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_SetNodeStateOutsideRange_GeneratesError) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); UnitTest::ErrorHandler errorHandler("Invalid node index"); auto ragdollState = GetTPose(); @@ -287,7 +285,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_SimulateWithKinematicState_AabbDoesNotChange) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); auto initialAabb = ragdoll->GetAabb(); auto kinematicTPose = GetTPose(Physics::SimulationType::Kinematic); @@ -315,9 +313,9 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_EnableDisableSimulation_NumActorsInSceneCorrect) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); - auto pxScene = static_cast(m_defaultScene->GetLegacyWorld()->GetNativePointer()); + auto pxScene = static_cast(m_defaultScene->GetNativePointer()); EXPECT_EQ(GetNumRigidDynamicActors(pxScene), 0); EXPECT_FALSE(ragdoll->IsSimulated()); @@ -336,7 +334,7 @@ namespace PhysX TEST_F(PhysXDefaultWorldTest, Ragdoll_NoOtherGeometry_FallsUnderGravity) #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { - auto ragdoll = CreateRagdoll(); + auto ragdoll = CreateRagdoll(m_testSceneHandle); ragdoll->EnableSimulation(GetTPose()); @@ -359,8 +357,8 @@ namespace PhysX #endif // AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS { AZ::Transform floorTransform = AZ::Transform::CreateTranslation(AZ::Vector3::CreateAxisZ(-0.5f)); - auto floor = Physics::AddStaticFloorToWorld(m_defaultScene->GetLegacyWorld().get(), floorTransform); - auto ragdoll = CreateRagdoll(); + auto floor = PhysX::TestUtils::AddStaticFloorToScene(m_testSceneHandle, floorTransform); + auto ragdoll = CreateRagdoll(m_testSceneHandle); ragdoll->EnableSimulation(GetTPose()); TestUtils::UpdateScene(m_defaultScene, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 500); diff --git a/Gems/PhysX/Code/Tests/RigidBodyComponentTests.cpp b/Gems/PhysX/Code/Tests/RigidBodyComponentTests.cpp index 95e3a4b588..eee747d390 100644 --- a/Gems/PhysX/Code/Tests/RigidBodyComponentTests.cpp +++ b/Gems/PhysX/Code/Tests/RigidBodyComponentTests.cpp @@ -42,9 +42,8 @@ namespace PhysXEditorTests AZ::TransformBus::Event(editorEntity->GetId(), &AZ::TransformInterface::SetLocalScale, scale); // Trigger editor physics world update so EditorRigidBodyComponent can process scale change - AZStd::shared_ptr editorWorld; - Physics::EditorWorldBus::BroadcastResult(editorWorld, &Physics::EditorWorldRequests::GetEditorWorld); - editorWorld->Update(0.1f); + auto* physicsSystem = AZ::Interface::Get(); + physicsSystem->Simulate(0.1f); const AZ::Aabb finalAabb = rigidBodyComponent->GetRigidBody()->GetAabb(); @@ -53,7 +52,7 @@ namespace PhysXEditorTests } // LYN-1241 - Test disabled due to AZ_Error reports about MaterialLibrary being not found in the AssetCatalog - TEST_F(PhysXEditorFixture, DISABLED_EditorRigidBodyComponent_EntityScaledAndColliderHasNonZeroOffset_RigidBodyAabbMatchesScaledOffset) + TEST_F(PhysXEditorFixture, EditorRigidBodyComponent_EntityScaledAndColliderHasNonZeroOffset_RigidBodyAabbMatchesScaledOffset) { // Create editor entity EntityPtr editorEntity = CreateInactiveEditorEntity("Entity"); @@ -78,11 +77,10 @@ namespace PhysXEditorTests // Notify listeners that collider has changed Physics::ColliderComponentEventBus::Event(editorEntity->GetId(), &Physics::ColliderComponentEvents::OnColliderChanged); - AZStd::shared_ptr editorWorld; - Physics::EditorWorldBus::BroadcastResult(editorWorld, &Physics::EditorWorldRequests::GetEditorWorld); - + auto* physicsSystem = AZ::Interface::Get(); + // Update editor world to let updates to be applied - editorWorld->Update(0.1f); + physicsSystem->Simulate(0.1f); const AZ::Aabb originalAabb = rigidBodyComponent->GetRigidBody()->GetAabb(); @@ -95,7 +93,7 @@ namespace PhysXEditorTests AZ::TransformBus::Event(editorEntity->GetId(), &AZ::TransformInterface::SetLocalScale, scale); // Update editor world to let updates to be applied - editorWorld->Update(0.1f); + physicsSystem->Simulate(0.1f); const AZ::Aabb finalAabb = rigidBodyComponent->GetRigidBody()->GetAabb(); diff --git a/Gems/PhysX/Code/Tests/ShapeColliderComponentTests.cpp b/Gems/PhysX/Code/Tests/ShapeColliderComponentTests.cpp index b22319ae91..422385a777 100644 --- a/Gems/PhysX/Code/Tests/ShapeColliderComponentTests.cpp +++ b/Gems/PhysX/Code/Tests/ShapeColliderComponentTests.cpp @@ -13,6 +13,7 @@ #include "PhysX_precompiled.h" #include #include +#include #include #include #include @@ -219,6 +220,42 @@ namespace PhysXEditorTests EXPECT_TRUE(aabb.GetMin().IsClose(AZ::Vector3::CreateZero())); } + TEST_F(PhysXEditorFixture, EditorShapeColliderComponent_ShapeColliderWithPolygonPrismAndNonUniformScale_CorrectRunAabb) + { + // create an editor entity with a shape collider component and a polygon prism shape component + EntityPtr editorEntity = CreateInactiveEditorEntity("ShapeColliderComponentEditorEntity"); + editorEntity->CreateComponent(); + editorEntity->CreateComponent(LmbrCentral::EditorPolygonPrismShapeComponentTypeId); + + // add a non-uniform scale component + editorEntity->CreateComponent(); + + // suppress the shape collider error that will be raised because the polygon prism vertices have not been set yet + UnitTest::ErrorHandler polygonPrismErrorHandler("Invalid polygon prism"); + editorEntity->Activate(); + + // modify the geometry of the polygon prism + TestData testData; + AZ::EntityId entityId = editorEntity->GetId(); + SetPolygonPrismVertices(entityId, testData.polygonHShape); + SetPolygonPrismHeight(entityId, 2.0f); + + // update the transform scale and non-uniform scale + AZ::TransformBus::Event(entityId, &AZ::TransformBus::Events::SetScale, AZ::Vector3(2.0f)); + AZ::NonUniformScaleRequestBus::Event(entityId, &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3(0.5f, 1.5f, 2.0f)); + + EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); + + // since there was no editor rigid body component, the runtime entity should have a static rigid body + const auto* staticBody = gameEntity->FindComponent()->GetStaticRigidBody(); + + // the vertices of the input polygon prism ranged from (0, 0) to (3, 3) and the height was set to 2 + // the bounding box of the static rigid body should reflect those values combined with the scale values above + AZ::Aabb aabb = staticBody->GetAabb(); + EXPECT_TRUE(aabb.GetMax().IsClose(AZ::Vector3(3.0f, 9.0f, 8.0f))); + EXPECT_TRUE(aabb.GetMin().IsClose(AZ::Vector3::CreateZero())); + } + TEST_F(PhysXEditorFixture, EditorShapeColliderComponent_ShapeColliderWithCylinder_CorrectRuntimeComponents) { // create an editor entity with a shape collider component and a cylinder shape component @@ -318,8 +355,10 @@ namespace PhysXEditorTests editorEntity->CreateComponent(LmbrCentral::EditorCompoundShapeComponentTypeId); editorEntity->Activate(); - // check that a warning was raised for the unsupported shape - EXPECT_EQ(unsupportedShapeWarningHandler.GetWarningCount(), 1); + // expect 2 warnings + //1 raised for the unsupported shape + //2 when re-creating the underlying simulated body + EXPECT_EQ(unsupportedShapeWarningHandler.GetWarningCount(), 2); EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get()); @@ -515,7 +554,7 @@ namespace PhysXEditorTests EntityPtr gameChildEntity = CreateActiveGameEntityFromEditorEntity(editorChildEntity.get()); // since there was an editor rigid body component, the runtime entity should have a dynamic rigid body - const Physics::RigidBody* rigidBody = + const AzPhysics::RigidBody* rigidBody = gameChildEntity->FindComponent()->GetRigidBody(); // the bounding box of the rigid body should reflect the dimensions of the box set above diff --git a/Gems/PhysX/Code/Tests/ShapeGeometryTests.cpp b/Gems/PhysX/Code/Tests/ShapeGeometryTests.cpp index ef39bee8ae..86c8874fb6 100644 --- a/Gems/PhysX/Code/Tests/ShapeGeometryTests.cpp +++ b/Gems/PhysX/Code/Tests/ShapeGeometryTests.cpp @@ -16,6 +16,8 @@ #include "EditorTestUtilities.h" #include "PhysXTestCommon.h" +#include + #include #include diff --git a/Gems/PhysX/Code/Tests/StaticRigidBodyComponentTests.cpp b/Gems/PhysX/Code/Tests/StaticRigidBodyComponentTests.cpp index bb5b44d4a7..43b7132af4 100644 --- a/Gems/PhysX/Code/Tests/StaticRigidBodyComponentTests.cpp +++ b/Gems/PhysX/Code/Tests/StaticRigidBodyComponentTests.cpp @@ -28,13 +28,22 @@ namespace PhysXEditorTests { int GetEditorStaticRigidBodyCount() { - AZStd::shared_ptr world; - Physics::EditorWorldBus::BroadcastResult(world, &Physics::EditorWorldRequests::GetEditorWorld); + AzPhysics::SceneHandle sceneHandle; + Physics::EditorWorldBus::BroadcastResult(sceneHandle, &Physics::EditorWorldRequests::GetEditorSceneHandle); - auto* scene = static_cast(world->GetNativePointer()); - PHYSX_SCENE_READ_LOCK(scene); + physx::PxScene* pxScene = nullptr; - return scene->getNbActors(physx::PxActorTypeFlag::eRIGID_STATIC); + if (auto* physicsSystem = AZ::Interface::Get()) + { + if (AzPhysics::Scene* scene = physicsSystem->GetScene(sceneHandle)) + { + pxScene = static_cast(scene->GetNativePointer()); + } + } + + PHYSX_SCENE_READ_LOCK(pxScene); + + return pxScene->getNbActors(physx::PxActorTypeFlag::eRIGID_STATIC); } void AddEditorBoxShapeComponent(EntityPtr& editorEntity) diff --git a/Gems/PhysX/Code/Tests/SystemComponentTest.cpp b/Gems/PhysX/Code/Tests/SystemComponentTest.cpp index 581ae383a7..e7c8b82aa2 100644 --- a/Gems/PhysX/Code/Tests/SystemComponentTest.cpp +++ b/Gems/PhysX/Code/Tests/SystemComponentTest.cpp @@ -12,47 +12,10 @@ #include "PhysX_precompiled.h" -#include - -#include -#include -#include -#include -#include #include -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include namespace PhysXEditorTests { - class MockSystemNotificationBusHandler - : public Physics::SystemNotificationBus::Handler - { - public: - MockSystemNotificationBusHandler() - { - Physics::SystemNotificationBus::Handler::BusConnect(); - } - - ~MockSystemNotificationBusHandler() - { - Physics::SystemNotificationBus::Handler::BusDisconnect(); - } - - MOCK_METHOD1(OnWorldCreated, void(Physics::World*)); - }; - TEST_F(PhysXEditorFixture, SetDefaultSceneConfiguration_TriggersHandler) { bool handlerInvoked = false; @@ -69,9 +32,7 @@ namespace PhysXEditorTests AzPhysics::SceneConfiguration newConfiguration; - newConfiguration.m_legacyConfiguration.m_gravity = newGravity; - newConfiguration.m_legacyConfiguration.m_fixedTimeStep = newFixedTimeStep; - newConfiguration.m_legacyConfiguration.m_maxTimeStep = newMaxTimeStep; + newConfiguration.m_gravity = newGravity; auto* physicsSystem = AZ::Interface::Get(); physicsSystem->RegisterOnDefaultSceneConfigurationChangedEventHandler(defaultSceneConfigHandler); @@ -79,22 +40,4 @@ namespace PhysXEditorTests EXPECT_TRUE(handlerInvoked); } - - TEST_F(PhysXEditorFixture, SystemNotificationBus_CreateWorld_HandlerReceivedOnCreateWorldNotification) - { - testing::StrictMock mockHandler; - - EXPECT_CALL(mockHandler, OnWorldCreated).Times(1); - - if (auto* physicsSystem = AZ::Interface::Get()) - { - AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration(); - sceneConfiguration.m_legacyId = AZ::Crc32("SystemNotificationBusTestWorld"); - AzPhysics::SceneHandle sceneHandle = physicsSystem->AddScene(sceneConfiguration); - if (AzPhysics::Scene* scene = physicsSystem->GetScene(sceneHandle)) - { - auto world = scene->GetLegacyWorld(); - } - } - } } // namespace PhysXEditorTests diff --git a/Gems/PhysX/Code/physx_editor_tests_files.cmake b/Gems/PhysX/Code/physx_editor_tests_files.cmake index 4adab6d763..202e688a76 100644 --- a/Gems/PhysX/Code/physx_editor_tests_files.cmake +++ b/Gems/PhysX/Code/physx_editor_tests_files.cmake @@ -15,6 +15,8 @@ set(FILES Source/SystemComponent.h Tests/PhysXTestCommon.cpp Tests/PhysXTestCommon.h + Tests/ColliderScalingTests.cpp + Tests/DebugDrawTests.cpp Tests/EditorTestUtilities.cpp Tests/EditorTestUtilities.h Tests/PhysXEditorTest.cpp diff --git a/Gems/PhysX/Code/physx_files.cmake b/Gems/PhysX/Code/physx_files.cmake index 944b3a8edf..c850479f53 100644 --- a/Gems/PhysX/Code/physx_files.cmake +++ b/Gems/PhysX/Code/physx_files.cmake @@ -18,6 +18,7 @@ set(FILES Include/PhysX/MeshColliderComponentBus.h Include/PhysX/MeshAsset.h Include/PhysX/HeightFieldAsset.h + Include/PhysX/HeightFieldAsset.cpp Include/PhysX/UserDataTypes.h Include/PhysX/UserDataTypes.inl Include/PhysX/Utils.h @@ -26,7 +27,6 @@ set(FILES Include/PhysX/ComponentTypeIds.h Include/PhysX/ForceRegionComponentBus.h Include/PhysX/ColliderShapeBus.h - Include/PhysX/TriggerEventCallback.h Include/PhysX/PhysXLocks.h Include/PhysX/CharacterControllerBus.h Include/PhysX/CharacterGameplayBus.h @@ -64,8 +64,6 @@ set(FILES Source/Pipeline/StreamWrapper.h Source/Utils.h Source/Utils.cpp - Source/World.cpp - Source/World.h Source/RigidBody.cpp Source/RigidBody.h Source/RigidBodyStatic.cpp @@ -106,6 +104,8 @@ set(FILES Include/PhysX/Debug/PhysXDebugConfiguration.h Include/PhysX/Debug/PhysXDebugInterface.h Include/PhysX/Configuration/PhysXConfiguration.h + Source/Common/PhysXSceneQueryHelpers.h + Source/Common/PhysXSceneQueryHelpers.cpp Source/Configuration/PhysXConfiguration.cpp Source/Configuration/PhysXSettingsRegistryManager.h Source/Configuration/PhysXSettingsRegistryManager.cpp @@ -114,6 +114,12 @@ set(FILES Source/Debug/Configuration/PhysXDebugConfiguration.cpp Source/Scene/PhysXScene.h Source/Scene/PhysXScene.cpp + Source/Scene/PhysXSceneInterface.h + Source/Scene/PhysXSceneInterface.cpp + Source/Scene/PhysXSceneSimulationEventCallback.h + Source/Scene/PhysXSceneSimulationEventCallback.cpp + Source/Scene/PhysXSceneSimulationFilterCallback.h + Source/Scene/PhysXSceneSimulationFilterCallback.cpp Source/System/PhysXAllocator.h Source/System/PhysXAllocator.cpp Source/System/PhysXCookingParams.h diff --git a/Gems/PhysX/Code/physx_tests_files.cmake b/Gems/PhysX/Code/physx_tests_files.cmake index e10a51b3ca..adf0f587d2 100644 --- a/Gems/PhysX/Code/physx_tests_files.cmake +++ b/Gems/PhysX/Code/physx_tests_files.cmake @@ -14,6 +14,9 @@ set(FILES Source/SystemComponent.h Source/ComponentDescriptors.cpp Source/ComponentDescriptors.h + Tests/PhysXComponentBusTests.cpp + Tests/PhysXGenericTestFixture.h + Tests/PhysXGenericTestFixture.cpp Tests/PhysXTestCommon.h Tests/PhysXTestCommon.inl Tests/PhysXTestCommon.cpp @@ -22,10 +25,11 @@ set(FILES Tests/PhysXGenericTest.cpp Tests/PhysXSpecificTest.cpp Tests/PhysXForceRegionTest.cpp - Tests/PhysXWorldTest.cpp Tests/PhysXMaterialLibraryTest.cpp Tests/PhysXCollisionFilteringTest.cpp Tests/PhysXJointsTest.cpp + Tests/PhysXSceneTests.cpp + Tests/PhysXSceneQueryTests.cpp Tests/PhysXSystemTests.cpp Tests/PhysXTestFixtures.h Tests/PhysXTestFixtures.cpp diff --git a/Gems/PhysXDebug/Code/Source/SystemComponent.cpp b/Gems/PhysXDebug/Code/Source/SystemComponent.cpp index dc4db3ff80..53de88192d 100644 --- a/Gems/PhysXDebug/Code/Source/SystemComponent.cpp +++ b/Gems/PhysXDebug/Code/Source/SystemComponent.cpp @@ -22,9 +22,11 @@ #include #include +#include +#include +#include #include #include -#include #include #include @@ -47,10 +49,10 @@ namespace PhysXDebug return ColorB(r, g, b, a); } - bool UseEditorPhysicsWorld() + bool UseEditorPhysicsScene() { // Runtime components are created when 'simulation' mode is enabled in the Editor, - // so we shouldn't use Editor physics world in this case + // so we shouldn't use Editor physics scene in this case return gEnv->IsEditing() && !gEnv->IsEditorSimulationMode(); } @@ -148,6 +150,17 @@ namespace PhysXDebug } } + SystemComponent::SystemComponent() + : m_sceneFinishSimHandler([this]( + [[maybe_unused]] AzPhysics::SceneHandle sceneHanle, + [[maybe_unused]] float fixedDeltatime) + { + this->m_editorPhysicsSceneDirty = true; + }) + { + + } + void SystemComponent::ReflectPhysXDebugSettings(AZ::ReflectContext* context) { if (auto serialize = azrtti_cast(context)) @@ -216,14 +229,18 @@ namespace PhysXDebug ImGui::ImGuiUpdateListenerBus::Handler::BusConnect(); #endif // IMGUI_ENABLED #ifdef PHYSXDEBUG_GEM_EDITOR - Physics::WorldNotificationBus::Handler::BusConnect(Physics::EditorPhysicsWorldId); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::EditorPhysicsSceneName); + sceneInterface->RegisterSceneSimulationFinishHandler(sceneHandle, m_sceneFinishSimHandler); + } #endif // PHYSXDEBUG_GEM_EDITOR } void SystemComponent::Deactivate() { #ifdef PHYSXDEBUG_GEM_EDITOR - Physics::WorldNotificationBus::Handler::BusDisconnect(); + m_sceneFinishSimHandler.Disconnect(); #endif // PHYSXDEBUG_GEM_EDITOR #ifdef IMGUI_ENABLED ImGui::ImGuiUpdateListenerBus::Handler::BusDisconnect(); @@ -233,13 +250,6 @@ namespace PhysXDebug PhysXDebugRequestBus::Handler::BusDisconnect(); } -#ifdef PHYSXDEBUG_GEM_EDITOR - void SystemComponent::OnPostPhysicsSubtick(float) - { - m_editorPhysicsWorldDirty = true; - } -#endif - #ifdef IMGUI_ENABLED void SystemComponent::OnImGuiMainMenuUpdate() { @@ -402,21 +412,29 @@ namespace PhysXDebug } } - Physics::World* SystemComponent::GetCurrentPhysicsWorld() + physx::PxScene* SystemComponent::GetCurrentPxScene() { - AZStd::shared_ptr world = nullptr; + AzPhysics::SceneHandle sceneHandle; - if (UseEditorPhysicsWorld()) + if (UseEditorPhysicsScene()) { - // Editor world needs to be ticked for debug rendering to work (taking place in EditorSystemComponent) - Physics::EditorWorldBus::BroadcastResult(world, &Physics::EditorWorldRequests::GetEditorWorld); + // Editor scene needs to be ticked for debug rendering to work (taking place in EditorSystemComponent) + Physics::EditorWorldBus::BroadcastResult(sceneHandle, &Physics::EditorWorldRequests::GetEditorSceneHandle); } else { - Physics::DefaultWorldBus::BroadcastResult(world, &Physics::DefaultWorldRequests::GetDefaultWorld); + Physics::DefaultWorldBus::BroadcastResult(sceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); } - return world.get(); + if (auto* physicsSystem = AZ::Interface::Get()) + { + if (auto* scene = physicsSystem->GetScene(sceneHandle)) + { + return static_cast(scene->GetNativePointer()); + } + } + + return nullptr; } // TickBus::Handler @@ -431,17 +449,17 @@ namespace PhysXDebug m_currentTime = time; bool dirty = true; - if (UseEditorPhysicsWorld()) + if (UseEditorPhysicsScene()) { - dirty = m_editorPhysicsWorldDirty; + dirty = m_editorPhysicsSceneDirty; } UpdateColliderVisualizationByProximity(); if (dirty) { - // The physics world is dirty and contains changes to be gathered. - if (Physics::World* world = GetCurrentPhysicsWorld()) + // The physics scene is dirty and contains changes to be gathered. + if (auto* scene = GetCurrentPxScene()) { ConfigurePhysXVisualizationParameters(); ConfigureCullingBox(); @@ -449,7 +467,7 @@ namespace PhysXDebug ClearBuffers(); GatherBuffers(); - m_editorPhysicsWorldDirty = false; + m_editorPhysicsSceneDirty = false; } } @@ -459,7 +477,7 @@ namespace PhysXDebug void SystemComponent::UpdateColliderVisualizationByProximity() { if (auto* debug = AZ::Interface::Get(); - UseEditorPhysicsWorld() && m_settings.m_visualizeCollidersByProximity + UseEditorPhysicsScene() && m_settings.m_visualizeCollidersByProximity && debug != nullptr) { const CCamera& camera = gEnv->pSystem->GetViewCamera(); @@ -481,9 +499,7 @@ namespace PhysXDebug void SystemComponent::GatherBuffers() { - Physics::World* world = GetCurrentPhysicsWorld(); - - physx::PxScene* physxScene = static_cast(world->GetNativePointer()); + physx::PxScene* physxScene = GetCurrentPxScene(); const physx::PxRenderBuffer& rb = GetRenderBuffer(physxScene); GatherLines(rb); GatherTriangles(rb); @@ -605,9 +621,8 @@ namespace PhysXDebug { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Physics); - if (Physics::World* world = GetCurrentPhysicsWorld()) + if (physx::PxScene* physxScene = GetCurrentPxScene()) { - physx::PxScene* physxScene = static_cast(world->GetNativePointer()); PHYSX_SCENE_WRITE_LOCK(physxScene); // Warning: if "mScale" is enabled, then debug visualization data will be available and requested from PhysX @@ -669,9 +684,8 @@ namespace PhysXDebug DrawDebugCullingBox(cullingBoxAabb); } - if (Physics::World* world = GetCurrentPhysicsWorld()) + if (physx::PxScene* physxScene = GetCurrentPxScene()) { - physx::PxScene* physxScene = static_cast(world->GetNativePointer()); PHYSX_SCENE_WRITE_LOCK(physxScene); physxScene->setVisualizationCullingBox(m_cullingBox); } @@ -686,7 +700,7 @@ namespace PhysXDebug return; } - if (Physics::World* world = GetCurrentPhysicsWorld()) + if (GetCurrentPxScene()) { // Reserve vector capacity const int numTriangles = rb.getNbTriangles(); @@ -721,7 +735,7 @@ namespace PhysXDebug return; } - if (Physics::World* world = GetCurrentPhysicsWorld()) + if (GetCurrentPxScene()) { const int numLines = rb.getNbLines(); @@ -751,18 +765,17 @@ namespace PhysXDebug { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Physics); - Physics::World* world = GetCurrentPhysicsWorld(); + physx::PxScene* scene = GetCurrentPxScene(); // The PhysX debug render buffer does not seem to include joint limits, even when // PxVisualizationParameter::eJOINT_LIMITS is set, so they are separately added to the line buffer here. - if (m_settings.m_jointLimits && world) + if (m_settings.m_jointLimits && scene) { - physx::PxScene* physxScene = static_cast(world->GetNativePointer()); - const physx::PxU32 numConstraints = physxScene->getNbConstraints(); + const physx::PxU32 numConstraints = scene->getNbConstraints(); for (physx::PxU32 constraintIndex = 0; constraintIndex < numConstraints; constraintIndex++) { physx::PxConstraint* constraint; - physxScene->getConstraints(&constraint, 1, constraintIndex); + scene->getConstraints(&constraint, 1, constraintIndex); physx::PxRigidActor* actor0; physx::PxRigidActor* actor1; constraint->getActors(actor0, actor1); diff --git a/Gems/PhysXDebug/Code/Source/SystemComponent.h b/Gems/PhysXDebug/Code/Source/SystemComponent.h index dd4ce37503..453a80e109 100644 --- a/Gems/PhysXDebug/Code/Source/SystemComponent.h +++ b/Gems/PhysXDebug/Code/Source/SystemComponent.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include @@ -110,9 +110,6 @@ namespace PhysXDebug #ifdef IMGUI_ENABLED , public ImGui::ImGuiUpdateListenerBus::Handler #endif // IMGUI_ENABLED -#ifdef PHYSXDEBUG_GEM_EDITOR - , public Physics::WorldNotificationBus::Handler -#endif // PHYSXDEBUG_GEM_EDITOR { public: @@ -125,6 +122,8 @@ namespace PhysXDebug static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); + SystemComponent(); + // PhysxDebugDraw::PhysxDebugDrawRequestBus void SetVisualization(bool enabled) override; void ToggleVisualizationConfiguration() override; @@ -149,11 +148,6 @@ namespace PhysXDebug // CrySystemEvents void OnCrySystemInitialized(ISystem&, const SSystemInitParams&) override; -#ifdef PHYSXDEBUG_GEM_EDITOR - // Physics::WorldNotificationBus - void OnPostPhysicsSubtick(float) override; -#endif - private: /// Configure a PhysX scene debug visualization properties. @@ -203,7 +197,7 @@ namespace PhysXDebug void BuildColorPickingMenuItem(const AZStd::string& label, ColorB& color); #endif // IMGUI_ENABLED - Physics::World* GetCurrentPhysicsWorld(); + physx::PxScene* GetCurrentPxScene(); // Main configuration PhysXVisualizationSettings m_settings; @@ -212,7 +206,7 @@ namespace PhysXDebug AZ::ScriptTimePoint m_currentTime; bool m_registered = false; physx::PxBounds3 m_cullingBox; - bool m_editorPhysicsWorldDirty = true; + bool m_editorPhysicsSceneDirty = true; static const float m_maxCullingBoxSize; AZStd::vector m_linePoints; @@ -225,6 +219,8 @@ namespace PhysXDebug AZStd::vector m_jointIndexBuffer; AZStd::vector m_jointLineBuffer; AZStd::vector m_jointLineValidityBuffer; + + AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler; }; /// Possible console parameters for physx_Debug cvar. diff --git a/Gems/PhysXSamples/Assets/Objects/Quadcopter/drone_body.mtl b/Gems/PhysXSamples/Assets/Objects/Quadcopter/drone_body.mtl index 382a8618bd..4431c0867a 100644 --- a/Gems/PhysXSamples/Assets/Objects/Quadcopter/drone_body.mtl +++ b/Gems/PhysXSamples/Assets/Objects/Quadcopter/drone_body.mtl @@ -1,18 +1,18 @@ - + - + - + - + - + diff --git a/Gems/Prefab/PrefabBuilder/CMakeLists.txt b/Gems/Prefab/PrefabBuilder/CMakeLists.txt index d2304612ef..5ab614eecb 100644 --- a/Gems/Prefab/PrefabBuilder/CMakeLists.txt +++ b/Gems/Prefab/PrefabBuilder/CMakeLists.txt @@ -14,22 +14,52 @@ if(NOT PAL_TRAIT_BUILD_HOST_TOOLS) endif() ly_add_target( - NAME Prefab.PrefabBuilder MODULE + NAME PrefabBuilder.Static STATIC NAMESPACE Gem FILES_CMAKE prefabbuilder_files.cmake BUILD_DEPENDENCIES - PRIVATE + PUBLIC AZ::AzCore AZ::AzToolsFramework AZ::AssetBuilderSDK ) +ly_add_target( + NAME PrefabBuilder MODULE + NAMESPACE Gem + INCLUDE_DIRECTORIES + PRIVATE + . + FILES_CMAKE + prefabbuilder_module_files.cmake + BUILD_DEPENDENCIES + PRIVATE + Gem::PrefabBuilder.Static +) + +ly_add_target( + NAME PrefabBuilder.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} + NAMESPACE Gem + FILES_CMAKE + prefabbuilder_tests_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + . + BUILD_DEPENDENCIES + PRIVATE + AZ::AzTest + Gem::PrefabBuilder.Static +) +ly_add_googletest( + NAME Gem::PrefabBuilder.Tests +) + ly_add_target_dependencies( TARGETS AssetBuilder AssetProcessor AssetProcessorBatch DEPENDENT_TARGETS - Gem::Prefab.PrefabBuilder + Gem::PrefabBuilder ) diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.cpp b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.cpp new file mode 100644 index 0000000000..9aa415703f --- /dev/null +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.cpp @@ -0,0 +1,340 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "PrefabBuilderComponent.h" + +namespace AZ::Prefab +{ + void PrefabBuilderComponent::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serialize = azrtti_cast(context)) + { + serialize->Class()->Version(0)->Attribute( + AZ::Edit::Attributes::SystemComponentTags, AZStd::vector({AssetBuilderSDK::ComponentTags::AssetBuilder})); + } + } + + AzToolsFramework::Fingerprinting::TypeFingerprint PrefabBuilderComponent::CalculateBuilderFingerprint() const + { + AzToolsFramework::Fingerprinting::TypeCollection typeCollection = m_typeFingerprinter->GatherAllTypesForComponents(); + AzToolsFramework::Fingerprinting::TypeFingerprint fingerprint = m_typeFingerprinter->GenerateFingerprintForAllTypes(typeCollection); + AZStd::hash_combine(fingerprint, m_pipeline.GetFingerprint()); + + return fingerprint; + } + + void PrefabBuilderComponent::Activate() + { + AssetBuilderSDK::AssetBuilderCommandBus::Handler::BusConnect(m_builderId); + + m_pipeline.LoadStackProfile("GameObjectCreation"); + + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + AZ_Assert(serializeContext, "SerializeContext not found"); + m_typeFingerprinter = AZStd::make_unique(*serializeContext); + + AzToolsFramework::Fingerprinting::TypeFingerprint fingerprint = CalculateBuilderFingerprint(); + + AssetBuilderSDK::AssetBuilderDesc builderDesc; + builderDesc.m_name = "Prefab Builder"; + builderDesc.m_patterns.emplace_back("*.prefab", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard); + builderDesc.m_builderType = AssetBuilderSDK::AssetBuilderDesc::AssetBuilderType::External; + builderDesc.m_busId = m_builderId; + builderDesc.m_analysisFingerprint = AZStd::to_string(fingerprint); + builderDesc.m_createJobFunction = + [this](const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) { + CreateJobs(request, response); + }; + builderDesc.m_processJobFunction = + [this](const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) { + ProcessJob(request, response); + }; + + AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBusTraits::RegisterBuilderInformation, builderDesc); + } + + void PrefabBuilderComponent::Deactivate() + { + AssetBuilderSDK::AssetBuilderCommandBus::Handler::BusDisconnect(m_builderId); + } + + void PrefabBuilderComponent::ShutDown() + { + m_isShuttingDown = true; + } + + AzToolsFramework::Fingerprinting::TypeFingerprint PrefabBuilderComponent::CalculatePrefabFingerprint( + const AzToolsFramework::Prefab::PrefabDom& genericDocument) const + { + AzToolsFramework::Fingerprinting::TypeFingerprint fingerprint = m_pipeline.GetFingerprint(); + + // Deserialize all of the entities and their components (for this prefab only) + AzToolsFramework::Prefab::Instance::AliasToEntityMap entities; + auto entitiesIterator = genericDocument.FindMember(AzToolsFramework::Prefab::PrefabDomUtils::EntitiesName); + + if (entitiesIterator != genericDocument.MemberEnd()) + { + auto&& entitiesJson = entitiesIterator->value; + + if (entitiesJson.IsObject()) + { + JsonSerializationResult::ResultCode result = AZ::JsonSerialization::Load(entities, entitiesJson); + + if (result.GetProcessing() != JsonSerializationResult::Processing::Halted) + { + // Add the fingerprint of all the components and their types + AZStd::hash_combine(fingerprint, m_typeFingerprinter->GenerateFingerprintForAllTypesInObject(&entities)); + } + } + } + + return fingerprint; + } + + AZStd::vector PrefabBuilderComponent::GetSourceDependencies(const AzToolsFramework::Prefab::PrefabDom& genericDocument) + { + AZStd::vector sourceFileDependencies; + auto instancesIterator = genericDocument.FindMember(AzToolsFramework::Prefab::PrefabDomUtils::InstancesName); + + if (instancesIterator != genericDocument.MemberEnd()) + { + auto&& instances = instancesIterator->value; + + if (instances.IsObject()) + { + for (auto&& entry : instances.GetObject()) + { + auto sourceIterator = entry.value.FindMember(AzToolsFramework::Prefab::PrefabDomUtils::SourceName); + + if (sourceIterator != entry.value.MemberEnd()) + { + auto&& source = sourceIterator->value; + + if (source.IsString()) + { + sourceFileDependencies.emplace_back(source.GetString(), Uuid::CreateNull()); + } + } + } + } + } + + return sourceFileDependencies; + } + + void PrefabBuilderComponent::CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) const + { + using namespace AzToolsFramework::Prefab; + using namespace AzToolsFramework::Prefab::PrefabConversionUtils; + + if (m_isShuttingDown) + { + response.m_result = AssetBuilderSDK::CreateJobsResultCode::ShuttingDown; + return; + } + + AZStd::string fullPath; + AZ::StringFunc::Path::ConstructFull(request.m_watchFolder.c_str(), request.m_sourceFile.c_str(), fullPath); + + // Load the JSON Dom + AZ::Outcome readPrefabFileResult = AzFramework::FileFunc::ReadJsonFile(AZ::IO::Path(fullPath)); + if (!readPrefabFileResult.IsSuccess()) + { + AZ_Error( + "Prefab", false, + "PrefabLoader::LoadPrefabFile - Failed to load Prefab file from '%s'." + "Error message: '%s'", + fullPath.c_str(), readPrefabFileResult.GetError().c_str()); + + return; + } + + auto genericDocument = readPrefabFileResult.TakeValue(); + + size_t fingerprint = CalculatePrefabFingerprint(genericDocument); + AZStd::vector sourceFileDependencies = GetSourceDependencies(genericDocument); + + for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms) + { + AssetBuilderSDK::JobDescriptor job; + job.m_jobKey = PrefabJobKey; + job.SetPlatformIdentifier(info.m_identifier.c_str()); + job.m_additionalFingerprintInfo = AZStd::to_string(fingerprint); + + // Add a fingerprint job dependency on any referenced prefab so this prefab will rebuild if the dependent fingerprint changes + for (const AssetBuilderSDK::SourceFileDependency& sourceFileDependency : sourceFileDependencies) + { + job.m_jobDependencyList.emplace_back( + PrefabJobKey, info.m_identifier, AssetBuilderSDK::JobDependencyType::Fingerprint, sourceFileDependency); + } + + response.m_createJobOutputs.push_back(AZStd::move(job)); + } + + response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; + } + + bool PrefabBuilderComponent::StoreProducts( + AZ::IO::PathView tempDirPath, + const AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessorContext::ProcessedObjectStoreContainer& store, + AZStd::vector& outputProducts) const + { + outputProducts.reserve(store.size()); + + AZStd::vector data; + for (auto& object : store) + { + AZ_TracePrintf("Prefab Builder", " Serializing Prefab product '%s'.\n", object.GetId().c_str()); + if (!object.Serialize(data)) + { + AZ_Error("Prefab Builder", false, "Failed to serialize object '%s'.", object.GetId().c_str()); + return false; + } + + AZ::IO::Path productPath = tempDirPath; + productPath /= object.GetId(); + + AZ_TracePrintf("Prefab Builder", " Storing Prefab product '%s'.\n", object.GetId().c_str()); + + AZStd::unique_ptr productFile = GetOutputStream(productPath); + + if (!productFile->IsOpen()) + { + AZ_Error("Prefab Builder", false, "Unable to open product file at '%s'.", productPath.c_str()); + return false; + } + + if (productFile->Write(data.size(), data.data()) != data.size()) + { + AZ_Error("Prefab Builder", false, "Unable to write product file at '%s'.", productPath.c_str()); + return false; + } + + AssetBuilderSDK::JobProduct product; + + if (AssetBuilderSDK::OutputObject(&object.GetAsset(), object.GetAssetType(), productPath.String(), object.GetAssetType(), + object.GetAsset().GetId().m_subId, product)) + { + outputProducts.push_back(AZStd::move(product)); + } + + data.clear(); + } + return true; + } + + AZStd::unique_ptr PrefabBuilderComponent::GetOutputStream(const AZ::IO::Path& path) const + { + return AZStd::make_unique(path.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeCreatePath); + } + + bool PrefabBuilderComponent::ProcessPrefab( + const AZ::PlatformTagSet& platformTags, const char* filePath, AZ::IO::PathView tempDirPath, const AZ::Uuid& sourceFileUuid, + AzToolsFramework::Prefab::PrefabDom& mutableRootDom, AZStd::vector& jobProducts) + { + AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessorContext context(sourceFileUuid); + AZStd::string rootPrefabName; + if (!StringFunc::Path::GetFileName(filePath, rootPrefabName)) + { + AZ_Error("Prefab Builder", false, "Unable to extract filename from '%s'.", + filePath); + return false; + } + context.AddPrefab(AZStd::move(rootPrefabName), AZStd::move(mutableRootDom)); + + context.SetPlatformTags(AZStd::move(platformTags)); + + AZ_TracePrintf("Prefab Builder", "Sending Prefab to the processor stack.\n"); + m_pipeline.ProcessPrefab(context); + if (context.HasCompletedSuccessfully()) + { + AZ_TracePrintf("Prefab Builder", "Finalizing products.\n"); + if (!context.HasPrefabs()) + { + if (StoreProducts(tempDirPath, context.GetProcessedObjects(), jobProducts)) + { + return true; + } + else + { + AZ_Error("Prefab Builder", false, "One or more objects couldn't be committed to disk."); + } + } + else + { + AZ_Error("Prefab Builder", false, "After processing there were still Prefabs left."); + } + } + else + { + AZ_Error("Prefab Builder", false, "Failed to fully process the target prefab."); + } + return false; + } + + void PrefabBuilderComponent::ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) + { + using namespace AzToolsFramework::Prefab; + using namespace AzToolsFramework::Prefab::PrefabConversionUtils; + + if (m_isShuttingDown) + { + response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Cancelled; + return; + } + + response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed; + + auto* system = AZ::Interface::Get(); + if (!system) + { + AZ_Error("Prefab Builder", false, "Prefab system is not available."); + return; + } + + auto* loader = AZ::Interface::Get(); + if (!loader) + { + AZ_Error("Prefab Builder", false, "Prefab loader is not available."); + return; + } + + AZ_TracePrintf("Prefab Builder", "Loading Prefab in '%s'.\n", request.m_fullPath.c_str()); + TemplateId templateId = loader->LoadTemplateFromFile(AZStd::string_view(request.m_fullPath)); + if (templateId == InvalidTemplateId) + { + AZ_Error("Prefab Builder", false, "Failed to load Prefab template."); + return; + } + + PrefabDom mutableRootDom; + mutableRootDom.CopyFrom(system->FindTemplateDom(templateId), mutableRootDom.GetAllocator()); + + AZ::PlatformTagSet platformTags; + const auto& tags = request.m_platformInfo.m_tags; + AZStd::for_each(tags.begin(), tags.end(), [&platformTags](const auto& tag) { + platformTags.emplace(AZ::Crc32(tag.c_str(), tag.size(), true)); + }); + + if (ProcessPrefab( + platformTags, request.m_fullPath.c_str(), request.m_tempDirPath.c_str(), request.m_sourceFileUUID, mutableRootDom, + response.m_outputProducts)) + { + response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; + } + + AZ_TracePrintf("Prefab Builder", "Cleaning up.\n"); + system->RemoveAllTemplates(); + AZ_TracePrintf("Prefab Builder", "Prefab processing completed.\n"); + } +} // namespace AZ::Prefab diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.h b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.h new file mode 100644 index 0000000000..7fbd0b4be0 --- /dev/null +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.h @@ -0,0 +1,82 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AZ::Prefab +{ + class PrefabBuilderComponent + : public AssetBuilderSDK::AssetBuilderCommandBus::Handler + , public AZ::Component + { + public: + static constexpr const char* BuilderId = "{A2E0791C-4607-4363-A7FD-73D01ED49660}"; + static constexpr const char* PrefabJobKey = "Prefabs"; + + AZ_COMPONENT(PrefabBuilderComponent, BuilderId); + static void Reflect(AZ::ReflectContext* context); + + PrefabBuilderComponent() + : m_builderId(BuilderId) + { + + } + + ////////////////////////////////////////////////////////////////////////// + // AZ::Component + void Activate() override; + void Deactivate() override; + ////////////////////////////////////////////////////////////////////////// + + void ShutDown() override; + AzToolsFramework::Fingerprinting::TypeFingerprint CalculateBuilderFingerprint() const; + AzToolsFramework::Fingerprinting::TypeFingerprint CalculatePrefabFingerprint( + const AzToolsFramework::Prefab::PrefabDom& genericDocument) const; + static AZStd::vector GetSourceDependencies( + const AzToolsFramework::Prefab::PrefabDom& genericDocument); + bool ProcessPrefab( + const AZ::PlatformTagSet& platformTags, const char* filePath, AZ::IO::PathView tempDirPath, const AZ::Uuid& sourceFileUuid, + AzToolsFramework::Prefab::PrefabDom& mutableRootDom, + AZStd::vector& jobProducts); + + protected: + virtual AZStd::unique_ptr GetOutputStream(const AZ::IO::Path& path) const; + + private: + void CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) const; + + bool StoreProducts( + AZ::IO::PathView tempDirPath, + const AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessorContext::ProcessedObjectStoreContainer& store, + AZStd::vector& outputProducts) const; + + void ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response); + + AzToolsFramework::Prefab::PrefabConversionUtils::PrefabConversionPipeline m_pipeline; + AZ::Uuid m_builderId; + AZStd::atomic_bool m_isShuttingDown{ false }; + AZStd::unique_ptr m_typeFingerprinter; + }; + +} // namespace AZ::Prefab diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderModule.cpp b/Gems/Prefab/PrefabBuilder/PrefabBuilderModule.cpp index c587bd1a5a..a6a35f5115 100644 --- a/Gems/Prefab/PrefabBuilder/PrefabBuilderModule.cpp +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderModule.cpp @@ -10,219 +10,11 @@ * */ -#include -#include -#include #include -#include -#include -#include +#include namespace AZ::Prefab { - class PrefabBuilderComponent - : public AssetBuilderSDK::AssetBuilderCommandBus::Handler - { - public: - PrefabBuilderComponent() - : m_builderId("{A2E0791C-4607-4363-A7FD-73D01ED49660}") - { - AssetBuilderSDK::AssetBuilderCommandBus::Handler::BusConnect(m_builderId); - } - - ~PrefabBuilderComponent() - { - if (m_prefabSystem) - { - m_prefabSystem->Deactivate(); - } - - AssetBuilderSDK::AssetBuilderCommandBus::Handler::BusDisconnect(m_builderId); - } - - void Register() - { - AssetBuilderSDK::AssetBuilderDesc builderDesc; - builderDesc.m_name = "Prefab Builder"; - builderDesc.m_patterns.emplace_back("*.prefab", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard); - builderDesc.m_builderType = AssetBuilderSDK::AssetBuilderDesc::AssetBuilderType::Internal; - builderDesc.m_busId = m_builderId; - builderDesc.m_createJobFunction = - [this](const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) - { - CreateJobs(request, response); - }; - builderDesc.m_processJobFunction = - [this](const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) - { - ProcessJob(request, response); - }; - - AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBusTraits::RegisterBuilderInformation, builderDesc); - } - - void ShutDown() override - { - m_isShuttingDown = true; - } - - private: - void CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) - { - if (m_isShuttingDown) - { - response.m_result = AssetBuilderSDK::CreateJobsResultCode::ShuttingDown; - return; - } - - for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms) - { - AssetBuilderSDK::JobDescriptor job; - job.m_jobKey = "Prefabs"; - job.SetPlatformIdentifier(info.m_identifier.c_str()); - response.m_createJobOutputs.push_back(AZStd::move(job)); - } - - response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; - } - - bool StoreProducts(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response, - const AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessorContext::ProcessedObjectStoreContainer& store) - { - response.m_outputProducts.reserve(store.size()); - - AZStd::vector data; - for (auto& object : store) - { - AZ_TracePrintf("Prefab Builder", " Serializing Prefab product '%s'.\n", object.GetId().c_str()); - if (!object.Serialize(data)) - { - AZ_Error("Prefab Builder", false, "Failed to serialize object '%s'.", object.GetId().c_str()); - return false; - } - - AZ::IO::Path productPath = request.m_tempDirPath; - productPath /= object.GetId(); - - AZ_TracePrintf("Prefab Builder", " Storing Prefab product '%s'.\n", object.GetId().c_str()); - - AZ::IO::SystemFile productFile; - if (!productFile.Open(productPath.c_str(), - AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY | AZ::IO::SystemFile::SF_OPEN_CREATE | AZ::IO::SystemFile::SF_OPEN_CREATE_PATH)) - { - AZ_Error("Prefab Builder", false, "Unable to open product file at '%s'.", productPath.c_str()); - return false; - } - - if (productFile.Write(data.data(), data.size()) != data.size()) - { - AZ_Error("Prefab Builder", false, "Unable to write product file at '%s'.", productPath.c_str()); - return false; - } - - AssetBuilderSDK::JobProduct product; - product.m_productFileName = productPath.String(); - product.m_productAssetType = object.GetAssetType(); - product.m_productSubID = object.BuildSubId(); - - // TODO: Handle dependencies. - product.m_dependenciesHandled = true; - - response.m_outputProducts.push_back(AZStd::move(product)); - - data.clear(); - } - return true; - } - - void ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) - { - using namespace AzToolsFramework::Prefab; - using namespace AzToolsFramework::Prefab::PrefabConversionUtils; - - if (m_isShuttingDown) - { - response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Cancelled; - return; - } - - if (!m_prefabSystem) - { - m_prefabSystem = AZStd::make_unique(); - m_prefabSystem->Init(); - m_prefabSystem->Activate(); - - m_pipeline.LoadStackProfile("GameObjectCreation"); - } - - response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed; - - auto* system = AZ::Interface::Get(); - if (!system) - { - AZ_Error("Prefab Builder", false, "Prefab system is not available."); - return; - } - - auto* loader = AZ::Interface::Get(); - if (!loader) - { - AZ_Error("Prefab Builder", false, "Prefab loader is not available."); - return; - } - - AZ_TracePrintf("Prefab Builder", "Loading Prefab in '%s'.\n", request.m_fullPath.c_str()); - TemplateId templateId = loader->LoadTemplate(request.m_fullPath); - if (templateId == InvalidTemplateId) - { - AZ_Error("Prefab Builder", false, "Failed to load Prefab template."); - return; - } - - PrefabProcessorContext context; - PrefabDom mutableRootDom; - // TODO: LoadTemplate should be updated so there's no need to get the extra copy here. - mutableRootDom.CopyFrom(system->FindTemplateDom(templateId), mutableRootDom.GetAllocator()); - AZStd::string rootPrefabName; - if (!StringFunc::Path::GetFileName(request.m_fullPath.c_str(), rootPrefabName)) - { - AZ_Warning("Prefab Builder", false, "Unable to extract filename from '%s', using 'Root' instead.", - request.m_fullPath.c_str()); - rootPrefabName = "Root"; - } - context.AddPrefab(AZStd::move(rootPrefabName), AZStd::move(mutableRootDom)); - - AZ_TracePrintf("Prefab Builder", "Sending Prefab to the processor stack.\n"); - m_pipeline.ProcessPrefab(context); - - AZ_TracePrintf("Prefab Builder", "Finalizing products.\n"); - if (!context.HasPrefabs()) - { - if (StoreProducts(request, response, context.GetProcessedObjects())) - { - response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; - } - else - { - AZ_Error("Prefab Builder", false, "One or more objects couldn't be committed to disk."); - } - } - else - { - AZ_Error("Prefab Builder", false, "After processing there were still Prefabs left."); - } - - AZ_TracePrintf("Prefab Builder", "Cleaning up.\n"); - system->RemoveTemplate(templateId); - AZ_TracePrintf("Prefab Builder", "Prefab processing completed.\n"); - } - - AZStd::unique_ptr m_prefabSystem; - AzToolsFramework::Prefab::PrefabConversionUtils::PrefabConversionPipeline m_pipeline; - AZ::Uuid m_builderId; - AZStd::atomic_bool m_isShuttingDown{ false }; - }; - class PrefabBuilderModule : public Module { @@ -233,20 +25,10 @@ namespace AZ::Prefab PrefabBuilderModule() : Module() { - m_builder.Register(); + m_descriptors.insert(m_descriptors.end(), { + PrefabBuilderComponent::CreateDescriptor() + }); } - - void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) - { - provided.push_back(AZ_CRC_CE("PrefabBuilder")); - } - - void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) - { - incompatible.push_back(AZ_CRC_CE("PrefabBuilder")); - } - - PrefabBuilderComponent m_builder; }; } // namespace AZ::Prefab diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp new file mode 100644 index 0000000000..fffe6ddfd5 --- /dev/null +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp @@ -0,0 +1,198 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "PrefabBuilderTests.h" +#include +#include +#include +#include + +namespace UnitTest +{ + AZ::Entity* CreateEntity(const char* entityName, AZStd::initializer_list componentsToAdd = {}) + { + // Circumvent the EntityContext system and generate a new entity with a transformcomponent + AZ::Entity* newEntity = aznew AZ::Entity(entityName); + newEntity->CreateComponent(AZ::TransformComponentTypeId); + newEntity->Init(); + + for (auto&& component : componentsToAdd) + { + newEntity->AddComponent(component); + } + + newEntity->Activate(); + + return newEntity; + } + + TEST_F(PrefabBuilderTests, SourceDependencies) + { + static constexpr const char* ChildPrefabPath = "child.prefab"; + using namespace AzToolsFramework::Prefab; + + AZStd::vector> childInstances; + + auto* prefabSystemComponentInterface = AZ::Interface::Get(); + auto* prefabLoaderInterface = AZ::Interface::Get(); + + ASSERT_NE(prefabSystemComponentInterface, nullptr); + ASSERT_NE(prefabLoaderInterface, nullptr); + + // Create a child entity and a prefab containing it + childInstances.push_back(prefabSystemComponentInterface->CreatePrefab({CreateEntity("child")}, {}, ChildPrefabPath)); + + // Create a parent entity and a prefab for it, pass in the child prefab for it to reference + auto parentInstance = prefabSystemComponentInterface->CreatePrefab({CreateEntity("parent")}, AZStd::move(childInstances), "parent.prefab"); + + AZStd::string serializedInstance; + + // Save to a string so we can load it as a PrefabDom and so that the nested instance becomes a Source file reference + ASSERT_TRUE(prefabLoaderInterface->SaveTemplateToString(parentInstance->GetTemplateId(), serializedInstance)); + + AZ::Outcome readPrefabFileResult = AzFramework::FileFunc::ReadJsonFromString(serializedInstance); + + ASSERT_TRUE(readPrefabFileResult.IsSuccess()); + + // Now that we have a PrefabDom, test extracting the Source file reference as a Source Dependency + auto sourceFileDependencies = AZ::Prefab::PrefabBuilderComponent::GetSourceDependencies(readPrefabFileResult.TakeValue()); + + ASSERT_EQ(sourceFileDependencies.size(), 1); + EXPECT_STREQ(sourceFileDependencies[0].m_sourceFileDependencyPath.c_str(), ChildPrefabPath); + } + + TEST_F(PrefabBuilderTests, ProductDependencies) + { + constexpr const char* ChildPrefabPath = "child.prefab"; + using namespace AzToolsFramework::Prefab; + + AZ::Uuid TestAssetUuid("{7725567D-D420-46C2-B481-E0F79212CD34}"); + AZ::Data::AssetId TestAssetId(TestAssetUuid, 0); + + AZStd::vector> childInstances; + + auto* prefabSystemComponentInterface = AZ::Interface::Get(); + + ASSERT_NE(prefabSystemComponentInterface, nullptr); + + auto* component = aznew TestComponent(); + AZ::Data::Asset asset = AZ::Data::Asset(TestAssetId, azrtti_typeid()); + component->m_asset = asset; + AZ::Entity* childEntity = CreateEntity("child", {component}); + + // Create a child prefab with an entity that has an Asset reference on it + childInstances.push_back(prefabSystemComponentInterface->CreatePrefab( + {childEntity}, {}, ChildPrefabPath, AZStd::unique_ptr(CreateEntity("Container")))); + + // Create a parent prefab that has a nested instance reference to the child prefab + auto parentInstance = + prefabSystemComponentInterface->CreatePrefab({CreateEntity("parent")}, AZStd::move(childInstances), "parent.prefab", AZStd::unique_ptr(CreateEntity("Container"))); + + AZStd::string serializedInstance; + + TestPrefabBuilderComponent prefabBuilderComponent; + prefabBuilderComponent.Activate(); + + AZStd::vector jobProducts; + auto&& prefabDom = prefabSystemComponentInterface->FindTemplateDom(parentInstance->GetTemplateId()); + + ASSERT_TRUE(prefabBuilderComponent.ProcessPrefab({AZ::Crc32("pc")}, "parent.prefab", "unused", AZ::Uuid(), prefabDom, jobProducts)); + + ASSERT_EQ(jobProducts.size(), 1); + ASSERT_EQ(jobProducts[0].m_dependencies.size(), 1); + ASSERT_EQ(jobProducts[0].m_dependencies[0].m_dependencyId, TestAssetId); + + prefabBuilderComponent.Deactivate(); + } + + AZStd::pair GetFingerprint(AzToolsFramework::Prefab::PrefabDom& dom) + { + TestPrefabBuilderComponent prefabBuilderComponent; + + prefabBuilderComponent.Activate(); + size_t builderFingerprint = prefabBuilderComponent.CalculateBuilderFingerprint(); + size_t fingerprint = prefabBuilderComponent.CalculatePrefabFingerprint(dom); + prefabBuilderComponent.Deactivate(); + + return {fingerprint, builderFingerprint}; + } + + TEST_F(PrefabBuilderTests, FingerprintTest) + { + auto* prefabSystemComponentInterface = AZ::Interface::Get(); + + ASSERT_NE(prefabSystemComponentInterface, nullptr); + + auto* component = aznew TestComponent(); + AZ::Entity* entity = CreateEntity("test", {component}); + + auto parentInstance = prefabSystemComponentInterface->CreatePrefab( + {entity}, {}, "test.prefab", + AZStd::unique_ptr(CreateEntity("Container"))); + + AZStd::vector jobProducts; + auto&& prefabDom = prefabSystemComponentInterface->FindTemplateDom(parentInstance->GetTemplateId()); + + auto [v0Dom, v0Builder] = GetFingerprint(prefabDom); + auto [sanityDom, sanityBuilder] = GetFingerprint(prefabDom); + + // Make sure the fingerprint is stable without changes + ASSERT_EQ(v0Dom, sanityDom); + ASSERT_EQ(v0Builder, sanityBuilder); + + AZ::SerializeContext* context = m_app.GetSerializeContext(); + + // Unreflect VersionChangingData, change its version, and reflect it again + context->EnableRemoveReflection(); + VersionChangingData::Reflect(context); + VersionChangingData::m_version = 1; + context->DisableRemoveReflection(); + VersionChangingData::Reflect(context); + + // Get the new fingerprint and check that it changed + auto [v1Dom, v1Builder] = GetFingerprint(prefabDom); + + ASSERT_NE(v0Dom, v1Dom); // Verify the fingerprint for the object changed + ASSERT_NE(v0Builder, v1Builder); // Verify the fingerprint for the entire builder changed + } + + AZStd::unique_ptr TestPrefabBuilderComponent::GetOutputStream(const AZ::IO::Path&) const + { + return AZStd::make_unique(); + } + + void PrefabBuilderTests::SetUp() + { + AZ::ComponentApplication::Descriptor desc; + m_app.Start(desc); + m_app.CreateReflectionManager(); + + m_testComponentDescriptor = AZStd::unique_ptr{TestComponent::CreateDescriptor()}; + m_testComponentDescriptor->Reflect(m_app.GetSerializeContext()); + TestAsset::Reflect(m_app.GetSerializeContext()); + VersionChangingData::Reflect(m_app.GetSerializeContext()); + + // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is + // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash + // in the unit tests. + AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize); + } + + void PrefabBuilderTests::TearDown() + { + m_testComponentDescriptor = nullptr; + + m_app.Stop(); + } +} + +AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV); diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.h b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.h new file mode 100644 index 0000000000..a8a1f7ab6d --- /dev/null +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.h @@ -0,0 +1,99 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include + +namespace UnitTest +{ + struct VersionChangingData : AZ::Data::AssetData + { + AZ_TYPE_INFO(VersionChangingData, "{E3A37E19-AE61-4C2F-809E-03B4D83261E8}"); + + static void Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->Class()->Version(m_version); + } + } + + inline static int m_version = 0; + }; + + struct TestAsset : AZ::Data::AssetData + { + AZ_TYPE_INFO(TestAsset, "{8E736462-5424-4720-A2D9-F71DFC5905E3}"); + + static void Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->Class(); + } + } + }; + + struct TestComponent : AZ::Component + { + AZ_COMPONENT(TestComponent, "{E3982C6A-0B01-4B04-A3E2-D95729D4B9C6}"); + + static void Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Field("Asset", &TestComponent::m_asset) + ->Field("Version", &TestComponent::m_version); + } + } + + void Activate() override + { + } + void Deactivate() override + { + } + + AZ::Data::Asset m_asset{}; + VersionChangingData m_version; + }; + + struct SelfContainedMemoryStream : AZ::IO::ByteContainerStream> + { + SelfContainedMemoryStream() : ByteContainerStream>{&m_bufferData} + { + } + + AZStd::vector m_bufferData; + }; + + struct TestPrefabBuilderComponent : AZ::Prefab::PrefabBuilderComponent + { + protected: + AZStd::unique_ptr GetOutputStream(const AZ::IO::Path& path) const override; + }; + + struct PrefabBuilderTests : ::testing::Test + { + protected: + void SetUp() override; + void TearDown() override; + + AzToolsFramework::ToolsApplication m_app; + AZStd::unique_ptr m_testComponentDescriptor{}; + }; +} diff --git a/Gems/Prefab/PrefabBuilder/gem.json b/Gems/Prefab/PrefabBuilder/gem.json new file mode 100644 index 0000000000..595c0c7d7f --- /dev/null +++ b/Gems/Prefab/PrefabBuilder/gem.json @@ -0,0 +1,17 @@ +{ + "gem_name": "PrefabBuilder", + "GemFormatVersion": 4, + "Uuid": "88500802311C4793B03484BE2091B607", + "Name": "PrefabBuilder", + "DisplayName": "PrefabBuilder", + "Version": "0.1.0", + "Summary": "Asset Processor builder module for Prefabs", + "Tags": ["Prefabs"], + "IconPath": "preview.png", + "Modules": [ + { + "Name": "Editor", + "Type": "EditorModule" + } + ] +} diff --git a/Gems/Prefab/PrefabBuilder/prefabbuilder_files.cmake b/Gems/Prefab/PrefabBuilder/prefabbuilder_files.cmake index 84200cd2e6..f2fe7a7123 100644 --- a/Gems/Prefab/PrefabBuilder/prefabbuilder_files.cmake +++ b/Gems/Prefab/PrefabBuilder/prefabbuilder_files.cmake @@ -10,5 +10,6 @@ # set(FILES - PrefabBuilderModule.cpp + PrefabBuilderComponent.h + PrefabBuilderComponent.cpp ) diff --git a/Gems/Prefab/PrefabBuilder/prefabbuilder_module_files.cmake b/Gems/Prefab/PrefabBuilder/prefabbuilder_module_files.cmake new file mode 100644 index 0000000000..84200cd2e6 --- /dev/null +++ b/Gems/Prefab/PrefabBuilder/prefabbuilder_module_files.cmake @@ -0,0 +1,14 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + PrefabBuilderModule.cpp +) diff --git a/Gems/Prefab/PrefabBuilder/prefabbuilder_tests_files.cmake b/Gems/Prefab/PrefabBuilder/prefabbuilder_tests_files.cmake new file mode 100644 index 0000000000..04e916a71d --- /dev/null +++ b/Gems/Prefab/PrefabBuilder/prefabbuilder_tests_files.cmake @@ -0,0 +1,15 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +set(FILES + PrefabBuilderTests.h + PrefabBuilderTests.cpp +) diff --git a/Gems/RenderToTexture/Code/Source/RenderToTextureBase.cpp b/Gems/RenderToTexture/Code/Source/RenderToTextureBase.cpp index ce0099280a..569f62b790 100644 --- a/Gems/RenderToTexture/Code/Source/RenderToTextureBase.cpp +++ b/Gems/RenderToTexture/Code/Source/RenderToTextureBase.cpp @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.cpp b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.cpp index c716fd2e14..7b60ecb834 100644 --- a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.cpp +++ b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -28,6 +29,7 @@ #include #include #include +#include #include #include @@ -169,6 +171,24 @@ namespace AZ::SceneGenerationComponents } } + void TangentGenerateComponent::FindBlendShapes( + AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, + AZStd::vector& outBlendShapes) const + { + const auto nameContentView = AZ::SceneAPI::Containers::Views::MakePairView(graph.GetNameStorage(), graph.GetContentStorage()); + + auto meshChildView = AZ::SceneAPI::Containers::Views::MakeSceneGraphChildView( + graph, nodeIndex, nameContentView.begin(), true); + for (auto child = meshChildView.begin(); child != meshChildView.end(); ++child) + { + AZ::SceneData::GraphData::BlendShapeData* blendShape = + azrtti_cast(child->second.get()); + if (blendShape) + { + outBlendShapes.emplace_back(blendShape); + } + } + } bool TangentGenerateComponent::GenerateTangentsForMesh(AZ::SceneAPI::Containers::Scene& scene, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::SceneAPI::DataTypes::IMeshData* meshData) { @@ -202,6 +222,10 @@ namespace AZ::SceneGenerationComponents return true; } + // Find all blend shape data under the mesh. We need to generate the tangent and bitangent for blend shape as well. + AZStd::vector blendShapes; + FindBlendShapes(graph, nodeIndex, blendShapes); + // Generate all the tangent spaces we need. // Do this for every UV set. bool allSuccess = true; @@ -222,7 +246,12 @@ namespace AZ::SceneGenerationComponents // Generate using MikkT space. case AZ::SceneAPI::DataTypes::TangentSpace::MikkT: { - allSuccess &= AZ::TangentGeneration::MikkT::GenerateTangents(scene.GetManifest(), graph, nodeIndex, const_cast(meshData), uvSetIndex); + allSuccess &= AZ::TangentGeneration::Mesh::MikkT::GenerateTangents( + scene.GetManifest(), graph, nodeIndex, const_cast(meshData), uvSetIndex); + for (AZ::SceneData::GraphData::BlendShapeData* blendShape : blendShapes) + { + allSuccess &= AZ::TangentGeneration::BlendShape::MikkT::GenerateTangents(blendShape, uvSetIndex); + } } break; diff --git a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.h b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.h index ef59fdd7fc..f15321e436 100644 --- a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.h +++ b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerateComponent.h @@ -21,6 +21,10 @@ namespace AZ::SceneAPI::DataTypes { class IMeshVertexUVData; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexTangentData; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexBitangentData; } namespace AZ::SceneAPI::DataTypes { enum class TangentSpace; } +namespace AZ::SceneData::GraphData +{ + class BlendShapeData; +} namespace AZ::SceneGenerationComponents { @@ -56,6 +60,9 @@ namespace AZ::SceneGenerationComponents AZ::SceneAPI::Events::ProcessingResult GenerateTangentData(TangentGenerateContext& context); private: + void FindBlendShapes( + AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, + AZStd::vector& outBlendShapes) const; bool GenerateTangentsForMesh(AZ::SceneAPI::Containers::Scene& scene, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::SceneAPI::DataTypes::IMeshData* meshData); void UpdateFbxTangentWValues(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, const AZ::SceneAPI::DataTypes::IMeshData* meshData); AZStd::vector CollectRequiredTangentSpaces(const AZ::SceneAPI::Containers::Scene& scene) const; diff --git a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.cpp b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.cpp new file mode 100644 index 0000000000..857ade1407 --- /dev/null +++ b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.cpp @@ -0,0 +1,142 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include + +#include +#include + +#include +#include + +#include + +namespace AZ::TangentGeneration::BlendShape::MikkT +{ + // Returns the number of triangles in the mesh. + int GetNumFaces(const SMikkTSpaceContext* context) + { + MikktCustomData* customData = static_cast(context->m_pUserData); + return customData->m_blendShapeData->GetFaceCount(); + } + + int GetNumVerticesOfFace([[maybe_unused]] const SMikkTSpaceContext* context, [[maybe_unused]] const int face) + { + return 3; + } + + void GetPosition(const SMikkTSpaceContext* context, float posOut[], const int face, const int vert) + { + MikktCustomData* customData = static_cast(context->m_pUserData); + const AZ::u32 vertexIndex = customData->m_blendShapeData->GetFaceVertexIndex(face, vert); + const AZ::Vector3& pos = customData->m_blendShapeData->GetPosition(vertexIndex); + posOut[0] = pos.GetX(); + posOut[1] = pos.GetY(); + posOut[2] = pos.GetZ(); + } + + void GetNormal(const SMikkTSpaceContext* context, float normOut[], const int face, const int vert) + { + MikktCustomData* customData = static_cast(context->m_pUserData); + const AZ::u32 vertexIndex = customData->m_blendShapeData->GetFaceVertexIndex(face, vert); + const AZ::Vector3 normal = customData->m_blendShapeData->GetNormal(vertexIndex).GetNormalizedSafe(); + normOut[0] = normal.GetX(); + normOut[1] = normal.GetY(); + normOut[2] = normal.GetZ(); + } + + void GetTexCoord(const SMikkTSpaceContext* context, float texOut[], const int face, const int vert) + { + MikktCustomData* customData = static_cast(context->m_pUserData); + const AZ::u32 vertexIndex = customData->m_blendShapeData->GetFaceVertexIndex(face, vert); + const AZ::Vector2& uv = customData->m_blendShapeData->GetUV(vertexIndex, customData->m_uvSetIndex); + texOut[0] = uv.GetX(); + texOut[1] = uv.GetY(); + } + + // This function is used to return tangent space results to the application. + // tangent and bitangent are unit length vectors and magS and magT are their + // true magnitudes which can be used for relief mapping effects. + // bitangent is the "real" bitangent and thus may not be perpendicular to tangent. + // However, both are perpendicular to the vertex normal. + // For normal maps it is sufficient to use the following simplified version of the bitangent which is generated at pixel/vertex level. + // signValue = isOrientationPreserving ? 1.0f : -1.0f; + // bitangent = signValue * cross(vN, tangent); + void SetTSpace(const SMikkTSpaceContext* context, const float tangent[], const float bitangent[], const float magS, const float magT, const tbool isOrientationPreserving, const int face, const int vert) + { + MikktCustomData* customData = static_cast(context->m_pUserData); + const AZ::u32 vertexIndex = customData->m_blendShapeData->GetFaceVertexIndex(face, vert); + const float flipSign = isOrientationPreserving ? 1.0f : -1.0f; + const AZ::Vector4 tangentVec(tangent[0]*magS, tangent[1]*magS, tangent[2]*magS, flipSign); + const AZ::Vector3 bitangentVec(bitangent[0]*magT, bitangent[1]*magT, bitangent[2]*magT); + + // Set the tangent and bitangent back to the blendshape + AZStd::vector& tangents = customData->m_blendShapeData->GetTangents(); + AZStd::vector& bitangents = customData->m_blendShapeData->GetBitangents(); + tangents[vertexIndex] = tangentVec; + bitangents[vertexIndex] = bitangentVec; + } + + bool GenerateTangents(AZ::SceneData::GraphData::BlendShapeData* blendShapeData, size_t uvSetIndex) + { + // Create tangent and bitangent data sets and relate them to the given UV set. + const AZStd::vector& uvSet = blendShapeData->GetUVs(uvSetIndex); + if (uvSet.empty()) + { + AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Cannot find UV data (set index=%d) to generate tangents and bitangents from in MikkT generator!\n", uvSetIndex); + return false; + } + + AZStd::vector& tangents = blendShapeData->GetTangents(); + AZStd::vector& bitangents = blendShapeData->GetBitangents(); + if (!tangents.empty() || !bitangents.empty()) + { + AZ_TracePrintf( + AZ::SceneAPI::Utilities::WarningWindow, "Cannot generate tangents and bitangents because existing tangent or bitangent data has been found.\n"); + return false; + } + + // Pre-allocate the tangent and bitangent data. + tangents.resize(blendShapeData->GetVertexCount()); + bitangents.resize(blendShapeData->GetVertexCount()); + + //---------------------------------- + + // Provide the MikkT interface. + SMikkTSpaceInterface mikkInterface; + mikkInterface.m_getNumFaces = GetNumFaces; + mikkInterface.m_getNormal = GetNormal; + mikkInterface.m_getPosition = GetPosition; + mikkInterface.m_getTexCoord = GetTexCoord; + mikkInterface.m_setTSpace = SetTSpace; + mikkInterface.m_setTSpaceBasic = nullptr; + mikkInterface.m_getNumVerticesOfFace= GetNumVerticesOfFace; + + // Set the MikkT custom data. + MikktCustomData customData; + customData.m_blendShapeData = blendShapeData; + customData.m_uvSetIndex = uvSetIndex; + + // Generate the tangents. + SMikkTSpaceContext mikkContext; + mikkContext.m_pInterface = &mikkInterface; + mikkContext.m_pUserData = &customData; + if (genTangSpaceDefault(&mikkContext) == 0) + { + AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Failed to generate tangents and bitangents using MikkT for blend shape, because MikkT reported failure!\n"); + return false; + } + + return true; + } +} // namespace AZ::TangentGeneration::MikkT diff --git a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.h b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.h new file mode 100644 index 0000000000..2d5fa8b90b --- /dev/null +++ b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.h @@ -0,0 +1,32 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include + +namespace AZ::SceneData::GraphData +{ + class BlendShapeData; +} + +namespace AZ::TangentGeneration::BlendShape::MikkT +{ + struct MikktCustomData + { + AZ::SceneData::GraphData::BlendShapeData* m_blendShapeData; + size_t m_uvSetIndex; + }; + + // The main generation method. + bool GenerateTangents(AZ::SceneData::GraphData::BlendShapeData* blendShapeData, size_t uvSetIndex); +} // namespace AZ::TangentGeneration::MikkT diff --git a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.cpp b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.cpp index cb21debd5f..6cbf2a96bc 100644 --- a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.cpp +++ b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.cpp @@ -27,7 +27,7 @@ #include -namespace AZ::TangentGeneration::MikkT +namespace AZ::TangentGeneration::Mesh::MikkT { // Returns the number of triangles in the mesh. int GetNumFaces(const SMikkTSpaceContext* context) diff --git a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.h b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.h index 458e43a4ac..a2e2dabf61 100644 --- a/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.h +++ b/Gems/SceneProcessing/Code/Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.h @@ -19,7 +19,7 @@ namespace AZ::SceneAPI::DataTypes { class IMeshVertexUVData; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexTangentData; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexBitangentData; } -namespace AZ::TangentGeneration::MikkT +namespace AZ::TangentGeneration::Mesh::MikkT { struct MikktCustomData { diff --git a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp index 988c5fee7f..d839627bfc 100644 --- a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp +++ b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneBuilderComponent.cpp @@ -48,7 +48,7 @@ namespace SceneBuilder builderDescriptor.m_createJobFunction = AZStd::bind(&SceneBuilderWorker::CreateJobs, &m_sceneBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2); builderDescriptor.m_processJobFunction = AZStd::bind(&SceneBuilderWorker::ProcessJob, &m_sceneBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2); - builderDescriptor.m_version = 4; // bump this to rebuild everything. + builderDescriptor.m_version = 5; // bump this to rebuild everything. builderDescriptor.m_analysisFingerprint = m_sceneBuilder.GetFingerprint(); // bump this to at least re-analyze everything. m_sceneBuilder.BusConnect(builderDescriptor.m_busId); diff --git a/Gems/SceneProcessing/Code/sceneprocessing_editor_static_files.cmake b/Gems/SceneProcessing/Code/sceneprocessing_editor_static_files.cmake index cebcc6f15a..c44d1a2734 100644 --- a/Gems/SceneProcessing/Code/sceneprocessing_editor_static_files.cmake +++ b/Gems/SceneProcessing/Code/sceneprocessing_editor_static_files.cmake @@ -21,6 +21,8 @@ set(FILES Source/Generation/Components/TangentGenerator/TangentPreExportComponent.cpp Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.h Source/Generation/Components/TangentGenerator/TangentGenerators/MikkTGenerator.cpp + Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.h + Source/Generation/Components/TangentGenerator/TangentGenerators/BlendShapeMikkTGenerator.cpp Source/Generation/Components/MeshOptimizer/Array2D.h Source/Generation/Components/MeshOptimizer/Array2D.inl Source/Generation/Components/MeshOptimizer/MeshBuilder.cpp diff --git a/Gems/ScriptCanvas/Code/Asset/EditorAssetConversionBus.h b/Gems/ScriptCanvas/Code/Asset/EditorAssetConversionBus.h index 5a3f244f0e..a395959c08 100644 --- a/Gems/ScriptCanvas/Code/Asset/EditorAssetConversionBus.h +++ b/Gems/ScriptCanvas/Code/Asset/EditorAssetConversionBus.h @@ -43,7 +43,6 @@ namespace ScriptCanvasEditor virtual AZ::Data::Asset LoadAsset(AZStd::string_view graphPath) = 0; virtual AZ::Data::Asset LoadFunctionAsset(AZStd::string_view graphPath) = 0; virtual AZ::Outcome CreateLuaAsset(const AZ::Data::Asset& editAsset, AZStd::string_view graphPathForRawLuaFile) = 0; - virtual AZ::Outcome CreateLuaFunctionAsset(const AZ::Data::Asset& editAsset, AZStd::string_view graphPathForRawLuaFile) = 0; virtual AZ::Outcome, AZStd::string> CreateRuntimeAsset(const AZ::Data::Asset& editAsset) = 0; virtual AZ::Outcome, AZStd::string> CreateFunctionRuntimeAsset(const AZ::Data::Asset& editAsset) = 0; }; diff --git a/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.cpp b/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.cpp index b65f746edd..50250554ed 100644 --- a/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.cpp +++ b/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.cpp @@ -83,7 +83,7 @@ namespace ScriptCanvasEditor { m_editorAssetRegistry.Register(); m_editorAssetRegistry.Register(); - m_editorAssetRegistry.Register(); + m_editorAssetRegistry.Register(); AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusConnect(); EditorAssetConversionBus::Handler::BusConnect(); @@ -165,11 +165,6 @@ namespace ScriptCanvasEditor return ScriptCanvasBuilder::CreateLuaAsset(editAsset->GetScriptCanvasEntity(), editAsset->GetId(), graphPathForRawLuaFile); } - AZ::Outcome EditorAssetSystemComponent::CreateLuaFunctionAsset(const AZ::Data::Asset& editAsset, AZStd::string_view graphPathForRawLuaFile) - { - return ScriptCanvasBuilder::CreateLuaAsset(editAsset->GetScriptCanvasEntity(), editAsset->GetId(), graphPathForRawLuaFile); - } - void EditorAssetSystemComponent::AddSourceFileOpeners([[maybe_unused]] const char* fullSourceFileName, const AZ::Uuid& sourceUuid, AzToolsFramework::AssetBrowser::SourceFileOpenerList& openers) { using namespace AzToolsFramework; diff --git a/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.h b/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.h index 10712d18d7..fc93d5dec6 100644 --- a/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.h +++ b/Gems/ScriptCanvas/Code/Asset/EditorAssetSystemComponent.h @@ -66,7 +66,6 @@ namespace ScriptCanvasEditor AZ::Outcome, AZStd::string> CreateRuntimeAsset(const AZ::Data::Asset& editAsset) override; AZ::Outcome, AZStd::string> CreateFunctionRuntimeAsset(const AZ::Data::Asset& editAsset) override; AZ::Outcome CreateLuaAsset(const AZ::Data::Asset& editAsset, AZStd::string_view graphPathForRawLuaFile) override; - AZ::Outcome CreateLuaFunctionAsset(const AZ::Data::Asset& editAsset, AZStd::string_view graphPathForRawLuaFile) override; ////////////////////////////////////////////////////////////////////////// // ScriptCanvas::Grammar::RequestBus::Handler... diff --git a/Gems/ScriptCanvas/Code/Asset/RuntimeAssetSystemComponent.cpp b/Gems/ScriptCanvas/Code/Asset/RuntimeAssetSystemComponent.cpp index 21e3b4331e..b1ea228242 100644 --- a/Gems/ScriptCanvas/Code/Asset/RuntimeAssetSystemComponent.cpp +++ b/Gems/ScriptCanvas/Code/Asset/RuntimeAssetSystemComponent.cpp @@ -59,7 +59,7 @@ namespace ScriptCanvas void RuntimeAssetSystemComponent::Activate() { m_runtimeAssetRegistry.Register(); - m_runtimeAssetRegistry.Register(); + m_runtimeAssetRegistry.Register(); } void RuntimeAssetSystemComponent::Deactivate() diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderComponent.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderComponent.cpp index 000baab614..cc8bf314d5 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderComponent.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderComponent.cpp @@ -100,8 +100,9 @@ namespace ScriptCanvasBuilder // or the fingerprint of the individual job is different. size_t fingerprint = ScriptCanvas::BehaviorContextUtils::GenerateFingerprintForBehaviorContext(); builderDescriptor.m_analysisFingerprint = AZStd::string(m_scriptCanvasBuilder.GetFingerprintString()) - .append(AZStd::string::format("|%zu", fingerprint)); + .append(AZStd::string::format("|%lu", static_cast(fingerprint))); builderDescriptor.AddFlags(AssetBuilderSDK::AssetBuilderDesc::BF_DeleteLastKnownGoodProductOnFailure, s_scriptCanvasProcessJobKey); + builderDescriptor.m_productsToKeepOnFailure[s_scriptCanvasProcessJobKey] = { AZ_CRC("SubgraphInterface", 0xdfe6dc72) }; m_scriptCanvasBuilder.BusConnect(builderDescriptor.m_busId); AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBus::Handler::RegisterBuilderInformation, builderDescriptor); @@ -123,6 +124,7 @@ namespace ScriptCanvasBuilder // or the fingerprint of the individual job is different. builderDescriptor.m_analysisFingerprint = m_scriptCanvasFunctionBuilder.GetFingerprintString(); builderDescriptor.AddFlags(AssetBuilderSDK::AssetBuilderDesc::BF_DeleteLastKnownGoodProductOnFailure, s_scriptCanvasProcessJobKey); + builderDescriptor.m_productsToKeepOnFailure[s_scriptCanvasProcessJobKey] = { AZ_CRC("SubgraphInterface", 0xdfe6dc72) }; AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBus::Handler::RegisterBuilderInformation, builderDescriptor); ScriptCanvas::Grammar::RequestBus::Handler::BusConnect(); AzToolsFramework::ToolsAssetSystemBus::Broadcast(&AzToolsFramework::ToolsAssetSystemRequests::RegisterSourceAssetType, azrtti_typeid(), ScriptCanvasEditor::ScriptCanvasFunctionAsset::Description::GetFileFilter()); diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp index 680d9ffdf0..c467a150b1 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp @@ -86,41 +86,31 @@ namespace ScriptCanvasBuilder assetDataStream->Open(AZStd::move(fileBuffer)); } - m_sourceDependencies.clear(); - AZStd::unordered_multimap sourceFileDependencies; + m_processEditorAssetDependencies.clear(); - auto assetFilter = [&response](const AZ::Data::AssetFilterInfo& filterInfo) + auto assetFilter = [this, &response](const AZ::Data::AssetFilterInfo& filterInfo) { - if (filterInfo.m_assetType == azrtti_typeid() || - filterInfo.m_assetType == azrtti_typeid() || - filterInfo.m_assetType == azrtti_typeid() || - filterInfo.m_assetType == azrtti_typeid()) // this required, since nodes reference this, rather than the editor asset + // force load these before processing + if (filterInfo.m_assetType == azrtti_typeid() + || filterInfo.m_assetType == azrtti_typeid()) + { + this->m_processEditorAssetDependencies.push_back(filterInfo); + } + + // these trigger re-processing + if (filterInfo.m_assetType == azrtti_typeid() + || filterInfo.m_assetType == azrtti_typeid() + || filterInfo.m_assetType == azrtti_typeid()) { AssetBuilderSDK::SourceFileDependency dependency; dependency.m_sourceFileDependencyUUID = filterInfo.m_assetId.m_guid; - response.m_sourceFileDependencyList.push_back(dependency); - - /*AssetBuilderSDK::SourceFileDependency dependency; - dependency.m_sourceFileDependencyUUID = asset.GetId().m_guid; - - if (asset.GetType() == azrtti_typeid()) - { - sourceFileDependencies.emplace("Script Events", dependency); - } - else - { - sourceFileDependencies.emplace(s_scriptCanvasProcessJobKey, dependency); - } - - this->m_sourceDependencies.push_back(asset);*/ } // Asset filter always returns false to prevent parsing dependencies, but makes note of the script canvas dependencies return false; }; - AZ::Data::Asset asset; asset.Create(AZ::Data::AssetId(AZ::Uuid::CreateRandom())); if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, assetFilter) != AZ::Data::AssetHandler::LoadResult::LoadComplete) @@ -135,9 +125,20 @@ namespace ScriptCanvasBuilder auto* scriptCanvasEntity = asset.Get()->GetScriptCanvasEntity(); auto* sourceGraph = AZ::EntityUtils::FindFirstDerivedComponent(scriptCanvasEntity); AZ_Assert(sourceGraph, "Graph component is missing from entity."); + + struct EntityIdComparer + { + bool operator()(AZ::Entity* lhs, AZ::Entity* rhs) + { + AZ::EntityId lhsEntityId = lhs != nullptr ? lhs->GetId() : AZ::EntityId(); + AZ::EntityId rhsEntityId = rhs != nullptr ? rhs->GetId() : AZ::EntityId(); + return lhsEntityId < rhsEntityId; + } + }; + const AZStd::set sortedEntities(sourceGraph->GetGraphData()->m_nodes.begin(), sourceGraph->GetGraphData()->m_nodes.end()); + size_t fingerprint = 0; - const AZStd::set sortedEntities(sourceGraph->GetGraphData()->m_nodes.begin(), sourceGraph->GetGraphData()->m_nodes.end()); - for (auto& nodeEntity : sortedEntities) + for (const auto& nodeEntity : sortedEntities) { if (auto nodeComponent = AZ::EntityUtils::FindFirstDerivedComponent(nodeEntity)) { @@ -145,6 +146,8 @@ namespace ScriptCanvasBuilder } } + m_processEditorAssetDependencies.clear(); + for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms) { if (info.HasTag("tools")) @@ -164,11 +167,13 @@ namespace ScriptCanvasBuilder jobDescriptor.m_jobKey = s_scriptCanvasProcessJobKey; jobDescriptor.SetPlatformIdentifier(info.m_identifier.c_str()); jobDescriptor.m_additionalFingerprintInfo = AZStd::string(GetFingerprintString()).append("|").append(AZStd::to_string(static_cast(fingerprint))); + // Graph process job needs to wait until its dependency asset job finished - for (const auto& sourceDependency : sourceFileDependencies) + for (const auto& processingDependency : response.m_sourceFileDependencyList) { - jobDescriptor.m_jobDependencyList.emplace_back(sourceDependency.first, info.m_identifier.c_str(), AssetBuilderSDK::JobDependencyType::Order, sourceDependency.second); + jobDescriptor.m_jobDependencyList.emplace_back(s_scriptCanvasProcessJobKey, info.m_identifier.c_str(), AssetBuilderSDK::JobDependencyType::Order, processingDependency); } + response.m_createJobOutputs.push_back(jobDescriptor); } @@ -260,7 +265,6 @@ namespace ScriptCanvasBuilder assetDataStream->Open(AZStd::move(fileBuffer)); } - AZ::SerializeContext* context{}; AZ::ComponentApplicationBus::BroadcastResult(context, &AZ::ComponentApplicationBus::Events::GetSerializeContext); @@ -288,15 +292,16 @@ namespace ScriptCanvasBuilder jobProduct.m_productAssetType = azrtti_typeid(); jobProduct.m_productSubID = 0; jobProduct.m_dependenciesHandled = true; + jobProduct.m_dependencies.clear(); response.m_outputProducts.push_back(AZStd::move(jobProduct)); response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; } else { // force load all dependencies into memory - for (auto& dependency : m_sourceDependencies) + for (auto& dependency : m_processEditorAssetDependencies) { - auto depAsset = AZ::Data::AssetManager::Instance().GetAsset(dependency.GetId(), dependency.GetType(), AZ::Data::AssetLoadBehavior::PreLoad); + auto depAsset = AZ::Data::AssetManager::Instance().GetAsset(dependency.m_assetId, dependency.m_assetType, AZ::Data::AssetLoadBehavior::PreLoad); depAsset.BlockUntilLoadComplete(); } @@ -320,7 +325,23 @@ namespace ScriptCanvasBuilder auto saveOutcome = SaveRuntimeAsset(input, input.runtimeDataOut); if (saveOutcome.IsSuccess()) { - response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; + // save function interface + AzFramework::StringFunc::Path::StripExtension(fileNameOnly); + ScriptCanvas::SubgraphInterfaceData functionInterface; + functionInterface.m_name = fileNameOnly; + functionInterface.m_interface = AZStd::move(input.interfaceOut); + input.assetHandler = m_subgraphInterfaceHandler; + + AzFramework::StringFunc::Path::ReplaceExtension(input.runtimeScriptCanvasOutputPath, ScriptCanvas::SubgraphInterfaceAsset::GetFileExtension()); + auto saveInterfaceOutcome = SaveSubgraphInterface(input, functionInterface); + if (saveInterfaceOutcome.IsSuccess()) + { + response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; + } + else + { + AZ_Error(s_scriptCanvasBuilder, false, saveInterfaceOutcome.GetError().data()); + } } else { diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.h b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.h index 3d8d78aa39..1d1ea1d4aa 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.h +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.h @@ -56,6 +56,9 @@ namespace ScriptCanvasBuilder ChangeScriptRequirementToAsset, RemoveDebugVariablesFromRelease, FailJobsOnMissingLKG, + QuantumLeap, + DependencyArguments, + DependencyRequirementsData, // add new entries above Current, }; @@ -172,7 +175,7 @@ namespace ScriptCanvasBuilder AZ::Data::AssetHandler* m_runtimeAssetHandler = nullptr; AZ::Data::AssetHandler* m_subgraphInterfaceHandler = nullptr; - mutable AZStd::vector> m_sourceDependencies; + mutable AZStd::vector m_processEditorAssetDependencies; // cached on first time query mutable AZStd::string m_fingerprintString; }; diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp index ce45e586ab..9bdbb8abb2 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp @@ -80,8 +80,8 @@ namespace ScriptCanvasBuilder request.assetId = scriptAssetId; request.graph = sourceGraph; request.name = fileNameOnly; - request.rawSaveDebugOutput = ScriptCanvas::Grammar::s_saveRawTranslationOuputToFile; - request.printModelToConsole = ScriptCanvas::Grammar::s_printAbstractCodeModel; + request.rawSaveDebugOutput = ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile; + request.printModelToConsole = ScriptCanvas::Grammar::g_printAbstractCodeModel; request.path = fullPath; bool pathFound = false; @@ -129,7 +129,7 @@ namespace ScriptCanvasBuilder result.m_scriptAsset = asset; result.m_runtimeInputs = AZStd::move(translation.m_runtimeInputs); result.m_debugMap = AZStd::move(translation.m_debugMap); - result.m_dependencies = translationResult.m_model->GetDependencies(); + result.m_dependencies = translationResult.m_model->GetOrderedDependencies(); result.m_parseDuration = translationResult.m_parseDuration; result.m_translationDuration = translation.m_duration; return AZ::Success(result); @@ -547,8 +547,8 @@ namespace ScriptCanvasBuilder request.namespacePath = input.namespacePath; request.assetId = input.assetID; request.graph = sourceGraph; - request.rawSaveDebugOutput = ScriptCanvas::Grammar::s_saveRawTranslationOuputToFile; - request.printModelToConsole = ScriptCanvas::Grammar::s_printAbstractCodeModel; + request.rawSaveDebugOutput = ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile; + request.printModelToConsole = ScriptCanvas::Grammar::g_printAbstractCodeModel; ScriptCanvas::Translation::Result translationResult = TranslateToLua(request); auto outcome = translationResult.IsSuccess(ScriptCanvas::Translation::TargetFlags::Lua); @@ -592,9 +592,10 @@ namespace ScriptCanvasBuilder const AZ::Data::Asset scriptAsset(scriptAssetId, jobProduct.m_productAssetType, {}); input.runtimeDataOut.m_script = scriptAsset; - const ScriptCanvas::DependencyReport& dependencyReport = translationResult.m_model->GetDependencies(); + const ScriptCanvas::OrderedDependencies& orderedDependencies = translationResult.m_model->GetOrderedDependencies(); + const ScriptCanvas::DependencyReport& dependencyReport = orderedDependencies.source; - for (const auto& subgraphAssetID : dependencyReport.userSubgraphAssetIds) + for (const auto& subgraphAssetID : orderedDependencies.orderedAssetIds) { const AZ::Data::AssetId dependentSubgraphAssetID(subgraphAssetID.m_guid, AZ_CRC("RuntimeData", 0x163310ae)); const AZ::Data::Asset subgraphAsset(dependentSubgraphAssetID, azrtti_typeid(), {}); diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasFunctionBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasFunctionBuilderWorker.cpp index cd9a3384cd..63cd51f6da 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasFunctionBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasFunctionBuilderWorker.cpp @@ -13,7 +13,6 @@ #include "precompiled.h" #include "platform.h" - #include #include #include @@ -22,9 +21,10 @@ #include #include #include +#include #include #include - +#include #include #include #include @@ -37,8 +37,6 @@ #include #include -#include - namespace ScriptCanvasBuilder { void FunctionWorker::Activate(const AssetHandlers& handlers) @@ -124,6 +122,8 @@ namespace ScriptCanvasBuilder AZStd::hash_combine(fingerprint, nodeComponent->GenerateFingerprint()); } } + +#if defined(FUNCTION_LEGACY_SUPPORT_ENABLED) for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms) { if (info.HasTag("tools")) @@ -135,15 +135,14 @@ namespace ScriptCanvasBuilder copyDescriptor.SetPlatformIdentifier(info.m_identifier.c_str()); copyDescriptor.m_additionalFingerprintInfo = AZStd::string(GetFingerprintString()).append("|").append(AZStd::to_string(static_cast(fingerprint))); response.m_createJobOutputs.push_back(copyDescriptor); - } + } AssetBuilderSDK::JobDescriptor jobDescriptor; jobDescriptor.m_priority = 2; jobDescriptor.m_critical = true; jobDescriptor.m_jobKey = s_scriptCanvasProcessJobKey; jobDescriptor.SetPlatformIdentifier(info.m_identifier.c_str()); - jobDescriptor.m_additionalFingerprintInfo = AZStd::string(GetFingerprintString()) - .append(AZStd::string::format("|%zu", fingerprint)); + jobDescriptor.m_additionalFingerprintInfo = AZStd::string(GetFingerprintString()).append("|").append(AZStd::to_string(static_cast(fingerprint))); // Function process job needs to wait until its dependency asset job finished for (const auto& sourceDependency : response.m_sourceFileDependencyList) { @@ -152,6 +151,7 @@ namespace ScriptCanvasBuilder } response.m_createJobOutputs.push_back(jobDescriptor); } +#endif response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; AZ_TracePrintf(s_scriptCanvasBuilder, "Finish Creating Job"); @@ -303,7 +303,6 @@ namespace ScriptCanvasBuilder ScriptCanvas::SubgraphInterfaceData functionInterface; functionInterface.m_name = fileNameOnly; - functionInterface.m_version = sourceDataComponent->m_functionDataComponentVersion; functionInterface.m_interface = AZStd::move(input.interfaceOut); // save function interface diff --git a/Gems/ScriptCanvas/Code/CMakeLists.txt b/Gems/ScriptCanvas/Code/CMakeLists.txt index 6243c04b9d..32efa74520 100644 --- a/Gems/ScriptCanvas/Code/CMakeLists.txt +++ b/Gems/ScriptCanvas/Code/CMakeLists.txt @@ -77,8 +77,8 @@ ly_add_target( AZ::AzFramework Gem::ScriptCanvasDebugger AUTOGEN_RULES - *.ScriptCanvasNode.xml,ScriptCanvasNode_Header.jinja,$path/$fileprefix.generated.h - *.ScriptCanvasNode.xml,ScriptCanvasNode_Source.jinja,$path/$fileprefix.generated.cpp + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Header.jinja,$path/$fileprefix.generated.h + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Source.jinja,$path/$fileprefix.generated.cpp *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Header.jinja,$path/$fileprefix.generated.h *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Source.jinja,$path/$fileprefix.generated.cpp ) diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasMemoryAsset.cpp b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasMemoryAsset.cpp index 0ce74325f2..39ecbaa3d8 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasMemoryAsset.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasMemoryAsset.cpp @@ -711,7 +711,7 @@ namespace ScriptCanvasEditor AZStd::string tempFilename; AzFramework::StringFunc::Path::GetFullFileName(targetFilename.data(), tempFilename); - AZStd::string tempPath = AZStd::string::format("@cache@/scriptcanvas/%s.temp", tempFilename.data()); + AZStd::string tempPath = AZStd::string::format("@usercache@/scriptcanvas/%s.temp", tempFilename.data()); AZStd::array resolvedPath{}; AZ::IO::FileIOBase::GetInstance()->ResolvePath(tempPath.data(), resolvedPath.data(), resolvedPath.size()); diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp index 8d7cff863f..66e49b4bd8 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp @@ -584,6 +584,74 @@ namespace ScriptCanvasEditor return true; } + void Graph::HandleFunctionDefinitionExtension(ScriptCanvas::Node* node, GraphCanvas::SlotId graphCanvasSlotId, const GraphCanvas::NodeId& nodeId) + { + // Special-case for the execution nodeling extensions, which are adding input/output data slots. + // We want to automatically promote them to variables so that the user can refer to them more easily + auto functionDefintionNode = azrtti_cast(node); + if (functionDefintionNode && graphCanvasSlotId.IsValid()) + { + GraphCanvas::Endpoint endpoint; + GraphCanvas::SlotRequestBus::EventResult(endpoint, graphCanvasSlotId, &GraphCanvas::SlotRequests::GetEndpoint); + + const ScriptCanvas::Endpoint scEndpoint = ConvertToScriptCanvasEndpoint(endpoint); + if (scEndpoint.IsValid()) + { + ScriptCanvas::Slot* slot = FindSlot(scEndpoint); + + if (slot) + { + AZ::Vector2 position; + GraphCanvas::GeometryRequestBus::EventResult(position, nodeId, &GraphCanvas::GeometryRequests::GetPosition); + + // First we need to automatically display the ShowSlotTypeSelector dialog so the user + // can assign a type and name to the slot they are adding + VariablePaletteRequests::SlotSetup selectedSlotSetup; + bool createSlot = false; + QPoint scenePoint(aznumeric_cast(position.GetX()), aznumeric_cast(position.GetY())); + VariablePaletteRequestBus::BroadcastResult(createSlot, &VariablePaletteRequests::ShowSlotTypeSelector, slot, scenePoint, selectedSlotSetup); + + if (createSlot && !selectedSlotSetup.m_type.IsNull()) + { + if (slot) + { + auto displayType = ScriptCanvas::Data::FromAZType(selectedSlotSetup.m_type); + if (displayType.IsValid()) + { + slot->SetDisplayType(displayType); + } + + if (!selectedSlotSetup.m_name.empty()) + { + slot->Rename(selectedSlotSetup.m_name); + } + } + + // Now that the slot has a valid type/name, we can actually promote it to a variable + if (PromoteToVariableAction(endpoint) /*&& slot->IsVariableReference()*/) + { + ScriptCanvas::GraphVariable* variable = slot->GetVariable(); + + if (variable) + { + // functions 2.0 set variable scope to function + auto connectionType = slot->GetConnectionType(); + if (variable->GetScope() != ScriptCanvas::VariableFlags::Scope::Function) + { + variable->SetScope(ScriptCanvas::VariableFlags::Scope::Function); + } + } + } + } + else + { + RemoveSlot(endpoint); + } + } + } + } + } + AZ::Outcome Graph::ReplaceNodeByConfig(ScriptCanvas::Node* oldNode, const ScriptCanvas::NodeConfiguration& nodeConfig, ScriptCanvas::ReplacementConnectionMap& remapConnections) { @@ -917,17 +985,6 @@ namespace ScriptCanvasEditor if (remapVariableOutcome) { node->SetSlotVariableId(slot.GetId(), remapVariableOutcome.GetValue()); - - ScriptCanvas::GraphVariable* variable2 = nullptr; - ScriptCanvas::GraphVariableManagerRequestBus::EventResult(variable2, GetScriptCanvasId(), &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, remapVariableOutcome.GetValue()); - - if (variable2) - { - if (IsRuntimeGraph()) - { - variable2->RemoveScope(ScriptCanvas::VariableFlags::Scope::Output); - } - } } else { @@ -979,7 +1036,10 @@ namespace ScriptCanvasEditor ScriptCanvas::Endpoint scTargetEndpoint = connection->GetTargetEndpoint(); GraphCanvas::Endpoint targetEndpoint = ConvertToGraphCanvasEndpoint(scTargetEndpoint); + ScriptCanvas::GraphNotificationBus::Event(GetScriptCanvasId(), &ScriptCanvas::GraphNotifications::OnDisonnectionComplete, connectionId); + DisconnectById(scConnectionId); + } } @@ -1003,6 +1063,12 @@ namespace ScriptCanvasEditor scConnected = ConfigureConnectionUserData(scSourceEndpoint, scTargetEndpoint, connectionId); } + if (scConnected) + { + ScriptCanvas::GraphNotificationBus::Event(GetScriptCanvasId(), &ScriptCanvas::GraphNotifications::OnConnectionComplete, connectionId); + } + + return scConnected; } @@ -1777,38 +1843,21 @@ namespace ScriptCanvasEditor if (isExecutionNodeling) { - if (!IsFunctionGraph()) - { - invalidNodes.insert(nodeId); - } - else - { - AZStd::any* userData = nullptr; - GraphCanvas::NodeRequestBus::EventResult(userData, nodeId, &GraphCanvas::NodeRequests::GetUserData); - AZ::EntityId scSourceNodeId = (userData && userData->is()) ? *AZStd::any_cast(userData) : AZ::EntityId(); - + AZStd::any* userData = nullptr; + GraphCanvas::NodeRequestBus::EventResult(userData, nodeId, &GraphCanvas::NodeRequests::GetUserData); + AZ::EntityId scSourceNodeId = (userData && userData->is()) ? *AZStd::any_cast(userData) : AZ::EntityId(); + ScriptCanvas::Nodes::Core::FunctionDefinitionNode* nodeling = azrtti_cast(FindNode(scSourceNodeId)); - if (nodeling) - { - nodeling->RemapId(); - } + if (nodeling) + { + nodeling->RemapId(); } } - // Going to disallow all functions nodes inside of functions nodes until we sort out a dependency checking situation to avoid recursion. bool isFunctionNode = false; NodeDescriptorRequestBus::EventResult(isFunctionNode, nodeId, &NodeDescriptorRequests::IsType, NodeDescriptorType::FunctionNode); - if (isFunctionNode) - { - if (IsFunctionGraph()) - { - invalidNodes.insert(nodeId); - } - } - - // Show all hidden slots on a paste, as a temporary fix until I can sort out what I want this to work like. GraphCanvas::NodeRequestBus::Event(nodeId, &GraphCanvas::NodeRequests::ShowAllSlots); @@ -2021,6 +2070,21 @@ namespace ScriptCanvasEditor { ScriptCanvas::Endpoint scEndpoint = ConvertToScriptCanvasEndpoint(endpoint); + ScriptCanvas::Slot* slot = FindSlot(scEndpoint); + if (slot) + { + ScriptCanvas::GraphVariable* variable = slot->GetVariable(); + if (variable && variable->GetScope() == ScriptCanvas::VariableFlags::Scope::Function) + { + bool success = false; + ScriptCanvas::GraphVariableManagerRequestBus::EventResult(success, GetScriptCanvasId(), &ScriptCanvas::GraphVariableManagerRequests::RemoveVariable, variable->GetVariableId()); + if (!success) + { + AZ_Assert(success, "Failed to remove variable that corresponds to this slot"); + } + } + } + ScriptCanvas::Node* canvasNode = FindNode(scEndpoint.GetNodeId()); if (canvasNode) @@ -2198,36 +2262,18 @@ namespace ScriptCanvasEditor AZStd::string inBoxText = ""; - while (!nameAvailable) + // Special case to try re-using the slot name if this is on an execution nodeling, since the user had just + // given it a name already with the ShowSlotTypeSelector dialog + if (azrtti_istypeof(activeNode)) { - bool accepted = false; - QString name = QInputDialog::getText(mainWindow, "Variable Name", inBoxText.c_str(), QLineEdit::Normal, defaultName.c_str(), &accepted); - - if (!accepted) - { - break; - } - - if (!name.isEmpty()) - { - variableName = name.toUtf8().data(); - ScriptCanvas::GraphVariableManagerRequestBus::EventResult(nameAvailable, GetScriptCanvasId(), &ScriptCanvas::GraphVariableManagerRequests::IsNameAvailable, variableName); - - if (!nameAvailable) - { - inBoxText = AZStd::string::format("\"%s\" is already in use.", variableName.c_str()); - } - } - else - { - inBoxText = "Variable names cannot be empty."; - } + variableName = activeSlot->GetName(); + ScriptCanvas::GraphVariableManagerRequestBus::EventResult(nameAvailable, GetScriptCanvasId(), &ScriptCanvas::GraphVariableManagerRequests::IsNameAvailable, variableName); } - if (!nameAvailable) + while (!nameAvailable) { - ReleaseVariableCounter(variableCounter); - return false; + variableName.append(" (duplicate)"); + ScriptCanvas::GraphVariableManagerRequestBus::EventResult(nameAvailable, GetScriptCanvasId(), &ScriptCanvas::GraphVariableManagerRequests::IsNameAvailable, variableName); } ScriptCanvas::Datum variableDatum; @@ -2250,16 +2296,15 @@ namespace ScriptCanvasEditor AZ::Outcome addOutcome; + // #functions2 slot<->variable re-use the activeDatum, send the pointer (actually, all of the source slot information, and make a special conversion) ScriptCanvas::GraphVariableManagerRequestBus::EventResult(addOutcome, GetScriptCanvasId(), &ScriptCanvas::GraphVariableManagerRequests::AddVariable, variableName, variableDatum); if (addOutcome.IsSuccess()) { GraphCanvas::DataSlotRequestBus::Event(endpoint.GetSlotId(), &GraphCanvas::DataSlotRequests::ConvertToReference); - if (activeSlot->IsVariableReference()) - { - activeSlot->SetVariableReference(addOutcome.GetValue()); - } + activeSlot->SetVariableReference(addOutcome.GetValue()); + } return addOutcome.IsSuccess(); @@ -2348,7 +2393,7 @@ namespace ScriptCanvasEditor return false; } - GraphCanvas::SlotId Graph::RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId) + GraphCanvas::SlotId Graph::RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId, GraphModelRequests::ExtensionRequestReason reason) { GraphCanvas::SlotId graphCanvasSlotId; @@ -2363,8 +2408,20 @@ namespace ScriptCanvasEditor ScriptCanvas::Node* canvasNode = AZ::EntityUtils::FindFirstDerivedComponent(graphNodeEntity); if (canvasNode) { - ScriptCanvas::SlotId slotId = canvasNode->HandleExtension(extenderId); - SlotMappingRequestBus::EventResult(graphCanvasSlotId, nodeId, &SlotMappingRequests::MapToGraphCanvasId, slotId); + auto functionDefintionNode = azrtti_cast(canvasNode); + if (functionDefintionNode && reason == GraphModelRequests::ExtensionRequestReason::ConnectionProposal) + { + + } + else + { + ScriptCanvas::SlotId slotId = canvasNode->HandleExtension(extenderId); + if (slotId.IsValid()) + { + SlotMappingRequestBus::EventResult(graphCanvasSlotId, nodeId, &SlotMappingRequests::MapToGraphCanvasId, slotId); + HandleFunctionDefinitionExtension(canvasNode, graphCanvasSlotId, nodeId); + } + } } } @@ -3126,7 +3183,7 @@ namespace ScriptCanvasEditor bool Graph::CanExposeEndpoint(const GraphCanvas::Endpoint& endpoint) { - bool isEnabled = IsFunctionGraph(); + bool isEnabled = false; GraphCanvas::SlotType slotType; GraphCanvas::SlotRequestBus::EventResult(slotType, endpoint.GetSlotId(), &GraphCanvas::SlotRequests::GetSlotType); @@ -3171,6 +3228,10 @@ namespace ScriptCanvasEditor isEnabled = false; } } + else + { + isEnabled = true; + } bool isNodeling = false; NodeDescriptorRequestBus::EventResult(isNodeling, endpoint.GetNodeId(), &NodeDescriptorRequests::IsType, NodeDescriptorType::FunctionDefinitionNode); diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp index 0feb4b50e2..f49ace2e58 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp @@ -217,11 +217,6 @@ namespace ScriptCanvasEditor ScriptCanvasMemoryAsset::pointer memoryAsset; AssetTrackerRequestBus::BroadcastResult(memoryAsset, &AssetTrackerRequests::GetAsset, fileAssetId); - if (!memoryAsset) - { - AZ_Error("Script Canvas", false, AZStd::string::format("Could not find Script Canvas asset: %s", m_scriptCanvasAssetHolder.GetAssetHint().data()).c_str()); - } - if (memoryAsset && memoryAsset->GetAsset().GetStatus() == AZ::Data::AssetData::AssetStatus::Ready) { OnScriptCanvasAssetReady(memoryAsset); @@ -292,6 +287,7 @@ namespace ScriptCanvasEditor } */ + // #functions2 dependency-ctor-args make recursive auto executionComponent = gameEntity->CreateComponent(runtimeAsset); ScriptCanvas::VariableData varData; @@ -484,8 +480,8 @@ namespace ScriptCanvasEditor /*! Start Variable Block Implementation */ void EditorScriptCanvasComponent::AddVariable(AZStd::string_view varName, const ScriptCanvas::GraphVariable& graphVariable) { - bool exposeVariableToComponent = graphVariable.IsInScope(ScriptCanvas::VariableFlags::Scope::Input); - if (!exposeVariableToComponent) + // We only add component properties to the component + if (!graphVariable.IsComponentProperty()) { return; } @@ -533,7 +529,7 @@ namespace ScriptCanvasEditor const auto& variableId = varConfig.m_graphVariable.GetVariableId(); auto graphVariable = graphVarData.FindVariable(variableId); - if (!graphVariable || !graphVariable->IsInScope(ScriptCanvas::VariableFlags::Scope::Input)) + if (!graphVariable->IsComponentProperty()) { oldVariableIds.push_back(variableId); } diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorUtils.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorUtils.cpp index 633c5c8e19..e4596b5334 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/EditorUtils.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorUtils.cpp @@ -79,7 +79,7 @@ namespace ScriptCanvasEditor } else if (auto functionTreeItem = azrtti_cast(treeItem)) { - resultHash = ScriptCanvas::NodeUtils::ConstructFunctionNodeIdentifier(functionTreeItem->GetRuntimeAssetId()); + resultHash = ScriptCanvas::NodeUtils::ConstructFunctionNodeIdentifier(functionTreeItem->GetAssetId()); } return resultHash; diff --git a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp index a2c408153f..9cbae6981e 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp @@ -523,13 +523,13 @@ namespace ScriptCanvasEditor ScriptCanvas::ValidationResults validationResults; - // Disable the s_saveRawTranslationOuputToFile CVar during Parse (not needed for upgrade) and restore to its set value after - bool saveRawTranslationOuputToFile = ScriptCanvas::Grammar::s_saveRawTranslationOuputToFile; - ScriptCanvas::Grammar::s_saveRawTranslationOuputToFile = false; + // Disable the g_saveRawTranslationOuputToFile CVar during Parse (not needed for upgrade) and restore to its set value after + bool saveRawTranslationOuputToFile = ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile; + ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; graph->Parse(validationResults); - ScriptCanvas::Grammar::s_saveRawTranslationOuputToFile = saveRawTranslationOuputToFile; + ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = saveRawTranslationOuputToFile; if (validationResults.HasResults()) { diff --git a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.h b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.h index d4103f0e03..acdd8106ae 100644 --- a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.h +++ b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.h @@ -27,8 +27,6 @@ namespace ScriptCanvasEditor using LoadedInterpretedDependencies = AZStd::vector>; AZ_INLINE LoadedInterpretedDependencies LoadInterpretedDepencies(const ScriptCanvas::DependencySet& dependencySet); - AZ_INLINE LoadTestFunctionResult LoadTestFunction(AZStd::string_view path); - AZ_INLINE LoadTestGraphResult LoadTestGraph(AZStd::string_view path); struct RunSpec diff --git a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl index 71ecd24a61..364687649e 100644 --- a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl +++ b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl @@ -58,12 +58,12 @@ namespace ScriptCanvasEditor originalPath.resize(originalPath.size() - AZStd::string_view(Grammar::k_internalRuntimeSuffix).size()); } - AZStd::string path = AZStd::string::format("%s/%s.scriptcanvas_fn", k_unitTestDirPathRelative, originalPath.data()); - LoadTestFunctionResult loadResult = LoadTestFunction(path); - AZ_Assert(loadResult.m_runtimeAsset, "failed to load function asset"); + AZStd::string path = AZStd::string::format("%s/%s.scriptcanvas", k_unitTestDirPathRelative, originalPath.data()); + LoadTestGraphResult loadResult = LoadTestGraph(path); + AZ_Assert(loadResult.m_runtimeAsset, "failed to load dependent asset"); AZ::Outcome luaAssetOutcome = AZ::Failure(AZStd::string("lua asset creation for function failed")); - ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(luaAssetOutcome, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateLuaFunctionAsset, loadResult.m_editorAsset, loadResult.m_graphPath); + ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(luaAssetOutcome, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateLuaAsset, loadResult.m_editorAsset, loadResult.m_graphPath); AZ_Assert(luaAssetOutcome.IsSuccess(), "failed to create Lua asset"); AZStd::string modulePath = namespacePath[0].data(); @@ -97,29 +97,6 @@ namespace ScriptCanvasEditor return spec; } - AZ_INLINE LoadTestFunctionResult LoadTestFunction(AZStd::string_view path) - { - AZ::Data::Asset editorAsset; - ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(editorAsset, &ScriptCanvasEditor::EditorAssetConversionBusTraits::LoadFunctionAsset, path); - - if (editorAsset.GetData()) - { - AZ::Outcome< AZ::Data::Asset, AZStd::string> assetOutcome = AZ::Failure(AZStd::string("asset creation failed")); - ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(assetOutcome, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateFunctionRuntimeAsset, editorAsset); - if (assetOutcome.IsSuccess()) - { - LoadTestFunctionResult result; - result.m_graphPath = path; - result.m_editorAsset = editorAsset; - result.m_runtimeAsset = assetOutcome.GetValue(); - result.m_entity = AZStd::make_unique("Loaded Graph"); - return result; - } - } - - return {}; - } - AZ_INLINE LoadTestGraphResult LoadTestGraph(AZStd::string_view graphPath) { AZ::Data::Asset editorAsset; @@ -230,7 +207,7 @@ namespace ScriptCanvasEditor if (!reporter.IsProcessOnly()) { - dependencies = LoadInterpretedDepencies(luaAssetResult.m_dependencies.userSubgraphs); + dependencies = LoadInterpretedDepencies(luaAssetResult.m_dependencies.source.userSubgraphs); if (!dependencies.empty()) { @@ -260,7 +237,7 @@ namespace ScriptCanvasEditor dependencyData.m_input = depencyAssetResult.m_runtimeInputs; dependencyData.m_debugMap = depencyAssetResult.m_debugMap; dependencyData.m_script = depencyAssetResult.m_scriptAsset; - Execution::Context::IntializeAssetData(dependencyData); + Execution::Context::InitializeActivationData(dependencyData); Execution::InitializeInterpretedStatics(dependencyData); } } @@ -270,7 +247,7 @@ namespace ScriptCanvasEditor loadResult.m_runtimeAsset.Get()->GetData().m_input = luaAssetResult.m_runtimeInputs; loadResult.m_runtimeAsset.Get()->GetData().m_debugMap = luaAssetResult.m_debugMap; loadResult.m_runtimeComponent = loadResult.m_entity->CreateComponent(loadResult.m_runtimeAsset); - Execution::Context::IntializeAssetData(loadResult.m_runtimeAsset->GetData()); + Execution::Context::InitializeActivationData(loadResult.m_runtimeAsset->GetData()); Execution::InitializeInterpretedStatics(loadResult.m_runtimeAsset->GetData()); } else diff --git a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.h b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.h index aa4420b189..18bf99ae16 100644 --- a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.h +++ b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.inl b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.inl index 00ca30a635..5ce011c4e4 100644 --- a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.inl +++ b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasReporter.inl @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicOrderingDynamicSlotComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicOrderingDynamicSlotComponent.cpp index e094671b9d..04ecd05a8e 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicOrderingDynamicSlotComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicOrderingDynamicSlotComponent.cpp @@ -57,8 +57,8 @@ namespace ScriptCanvasEditor if (requestInterface) { - AZStd::vector< const ScriptCanvas::Slot* > scriptSlots; - ScriptCanvas::NodeRequestBus::EventResult(scriptSlots, GetScriptCanvasNodeId(), &ScriptCanvas::NodeRequests::GetAllSlots); + AZStd::vector scriptSlots; + ScriptCanvas::NodeRequestBus::EventResult(scriptSlots, GetScriptCanvasNodeId(), &ScriptCanvas::NodeRequests::ModAllSlots); for (int i = 0; i < scriptSlots.size(); ++i) { diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h index 561bca295f..3a4b2ce1d9 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h @@ -110,7 +110,7 @@ namespace ScriptCanvasEditor //// protected: - void OnAddedToGraphCanvasGraph(const GraphCanvas::GraphId& graphId, const AZ::EntityId& scriptCanvasNodeId); + void OnAddedToGraphCanvasGraph(const GraphCanvas::GraphId& graphId, const AZ::EntityId& scriptCanvasNodeId) override; private: diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.cpp new file mode 100644 index 0000000000..a1aaeeda2e --- /dev/null +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.cpp @@ -0,0 +1,102 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "FunctionDefinitionNodeDescriptorComponent.h" + +#include +#include + +#include +#include +#include +#include + +namespace ScriptCanvasEditor +{ + + FunctionDefinitionNodeDescriptorComponent::FunctionDefinitionNodeDescriptorComponent() + : NodelingDescriptorComponent(NodeDescriptorType::FunctionDefinitionNode) + { + } + + void FunctionDefinitionNodeDescriptorComponent::Activate() + { + NodelingDescriptorComponent::Activate(); + + GraphCanvas::VisualNotificationBus::Handler::BusConnect(GetEntityId()); + } + + void FunctionDefinitionNodeDescriptorComponent::Deactivate() + { + NodelingDescriptorComponent::Deactivate(); + GraphCanvas::VisualNotificationBus::Handler::BusDisconnect(); + } + + void FunctionDefinitionNodeDescriptorComponent::Reflect(AZ::ReflectContext* reflectContext) + { + if (AZ::SerializeContext* serializeContext = azrtti_cast(reflectContext)) + { + serializeContext->Class() + ->Version(1) + ; + } + } + + bool FunctionDefinitionNodeDescriptorComponent::RenameDialog(FunctionDefinitionNodeDescriptorComponent* descriptor) + { + if (!descriptor) + { + return false; + } + + AZStd::string inBoxText{}; + AZStd::string defaultName{}; + + GraphCanvas::NodeId nodeId = descriptor->GetEntityId(); + + GraphCanvas::NodeTitleRequestBus::EventResult(defaultName, nodeId, &GraphCanvas::NodeTitleRequests::GetTitle); + + QMainWindow* editorWindow = nullptr; + UIRequestBus::BroadcastResult(editorWindow, &UIRequests::GetMainWindow); + + bool accepted = false; + QString name = QInputDialog::getText(qobject_cast(editorWindow->parent()), "Name", inBoxText.c_str(), QLineEdit::Normal, defaultName.c_str(), &accepted); + + const AZStd::string newName = name.toUtf8().data(); + + if (!name.isEmpty() && newName.compare(defaultName) != 0) + { + GraphCanvas::NodeTitleRequestBus::Event(nodeId, &GraphCanvas::NodeTitleRequests::SetTitle, newName); + + + AZ::EntityId graphCanvasGraphId; + GraphCanvas::SceneMemberRequestBus::EventResult(graphCanvasGraphId, descriptor->GetEntityId(), &GraphCanvas::SceneMemberRequests::GetScene); + + ScriptCanvas::ScriptCanvasId scriptCanvasId; + GeneralRequestBus::BroadcastResult(scriptCanvasId, &GeneralRequests::GetScriptCanvasId, graphCanvasGraphId); + + ScriptCanvas::GraphScopedNodeId scopedNodeId = ScriptCanvas::GraphScopedNodeId(scriptCanvasId, descriptor->FindScriptCanvasNodeId()); + + ScriptCanvas::NodelingRequestBus::Event(scopedNodeId, &ScriptCanvas::NodelingRequests::SetDisplayName, newName); + + return true; + } + + return false; + } + + bool FunctionDefinitionNodeDescriptorComponent::OnMouseDoubleClick(const QGraphicsSceneMouseEvent*) + { + return RenameDialog(this); + } +} + diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.h new file mode 100644 index 0000000000..da33f1e369 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.h @@ -0,0 +1,47 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include "NodelingDescriptorComponent.h" + +#include + +#include +#include +#include + +namespace ScriptCanvasEditor +{ + class FunctionDefinitionNodeDescriptorComponent + : public NodelingDescriptorComponent + , GraphCanvas::VisualNotificationBus::Handler + { + public: + AZ_COMPONENT(FunctionDefinitionNodeDescriptorComponent, "{F433EC33-D8A7-40E0-97E7-B29C3C68323E}", NodelingDescriptorComponent); + static void Reflect(AZ::ReflectContext* reflectContext); + + FunctionDefinitionNodeDescriptorComponent(); + ~FunctionDefinitionNodeDescriptorComponent() override = default; + + static bool RenameDialog(FunctionDefinitionNodeDescriptorComponent* descriptor); + + protected: + + void Activate() override; + void Deactivate() override; + + // GraphCanvas::VisualNotificationBus::Handler... + bool OnMouseDoubleClick(const QGraphicsSceneMouseEvent*) override; + ///// + }; +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.cpp index 7f126504de..47b3d080e6 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.cpp @@ -26,7 +26,7 @@ #include #include -#include +#include namespace ScriptCanvasEditor { diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.h index e22e79ddc8..0c50e66280 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.h @@ -51,7 +51,7 @@ namespace ScriptCanvasEditor void OnVersionConversionEnd() override; //// - // GraphCanvas::NodeNotificationBus + // GraphCanvas::VisualNotificationBus bool OnMouseDoubleClick(const QGraphicsSceneMouseEvent*) override; // diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h index 84196bf73d..e654cc17e1 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h @@ -44,6 +44,7 @@ namespace ScriptCanvasEditor // NodeDescriptorBus::Handler NodeDescriptorType GetType() const override { return m_nodeDescriptorType; } + NodeDescriptorComponent* GetDescriptorComponent() override { return this; } //// // GraphCanvas::NodeNotificationBus diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.cpp index bf103d0f0d..bb7df36785 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.cpp @@ -11,11 +11,13 @@ */ #include "precompiled.h" -#include - #include "NodelingDescriptorComponent.h" - +#include "ScriptCanvas/Bus/EditorScriptCanvasBus.h" +#include "ScriptCanvas/GraphCanvas/MappingBus.h" +#include #include +#include +#include namespace ScriptCanvasEditor { @@ -35,11 +37,18 @@ namespace ScriptCanvasEditor } } - NodelingDescriptorComponent::NodelingDescriptorComponent() - : NodeDescriptorComponent(NodeDescriptorType::FunctionDefinitionNode) + NodelingDescriptorComponent::NodelingDescriptorComponent(NodeDescriptorType descriptorType) + : NodeDescriptorComponent(descriptorType) { } - + + void NodelingDescriptorComponent::Deactivate() + { + NodeDescriptorComponent::Deactivate(); + + ScriptCanvas::GraphNotificationBus::Handler::BusDisconnect(); + } + void NodelingDescriptorComponent::OnNameChanged(const AZStd::string& displayName) { GraphCanvas::NodeTitleRequestBus::Event(GetEntityId(), &GraphCanvas::NodeTitleRequests::SetTitle, displayName); @@ -56,7 +65,180 @@ namespace ScriptCanvasEditor AZStd::string displayName; ScriptCanvas::NodelingRequestBus::EventResult(displayName, scopedNodeId, &ScriptCanvas::NodelingRequests::GetDisplayName); - + OnNameChanged(displayName); + + ScriptCanvas::GraphNotificationBus::Handler::BusConnect(scriptCanvasId); + + } + + ScriptCanvas::Slot* NodelingDescriptorComponent::GetSlotFromNodeling(const AZ::EntityId& connectionId) + { + GraphCanvas::Endpoint sourceEndpoint; + GraphCanvas::ConnectionRequestBus::EventResult(sourceEndpoint, connectionId, &GraphCanvas::ConnectionRequests::GetSourceEndpoint); + + GraphCanvas::Endpoint targetEndpoint; + GraphCanvas::ConnectionRequestBus::EventResult(targetEndpoint, connectionId, &GraphCanvas::ConnectionRequests::GetTargetEndpoint); + + ScriptCanvas::ScriptCanvasId scriptCanvasId; + AZ::EntityId scriptCanvasNodeId = FindScriptCanvasNodeId(); + ScriptCanvas::NodeRequestBus::EventResult(scriptCanvasId, scriptCanvasNodeId, &ScriptCanvas::NodeRequests::GetOwningScriptCanvasId); + + AZStd::vector endpoints = { sourceEndpoint, targetEndpoint }; + + for (auto& endpoint : endpoints) + { + ScriptCanvas::Endpoint scEndpoint; + EditorGraphRequestBus::EventResult(scEndpoint, scriptCanvasId, &EditorGraphRequests::ConvertToScriptCanvasEndpoint, endpoint); + + ScriptCanvas::Slot* slot = nullptr; + ScriptCanvas::NodeRequestBus::EventResult(slot, scEndpoint.GetNodeId(), &ScriptCanvas::NodeRequests::GetSlot, scEndpoint.GetSlotId()); + + if (slot) + { + if (azrtti_istypeof(slot->GetNode())) + { + return slot; + } + } + } + + return nullptr; } + + void NodelingDescriptorComponent::OnConnectionComplete(const AZ::EntityId& connectionId) + { + + AZStd::vector< AZ::EntityId > graphCanvasSlotIds; + GraphCanvas::NodeRequestBus::EventResult(graphCanvasSlotIds, GetEntityId(), &GraphCanvas::NodeRequests::GetSlotIds); + + + ScriptCanvas::Slot* slot = GetSlotFromNodeling(connectionId); + if (slot) + { + const auto& descriptor = slot->GetDescriptor(); + if (descriptor.IsExecution()) + { + AZStd::vector scriptSlots; + ScriptCanvas::NodeRequestBus::EventResult(scriptSlots, slot->GetNodeId(), &ScriptCanvas::NodeRequests::ModAllSlots); + + if (descriptor.IsInput()) + { + // Hide the output slot + for (ScriptCanvas::Slot* s : scriptSlots) + { + if (s->IsExecution() && s->IsOutput()) + { + // Need the GC slot Id + + AZ::EntityId graphCanvasGraphId; + ScriptCanvasEditor::SlotMappingRequestBus::EventResult(graphCanvasGraphId, s->GetNodeId(), &ScriptCanvasEditor::SlotMappingRequests::MapToGraphCanvasId, s->GetId()); + if (graphCanvasGraphId.IsValid()) + { + m_removedSlotId = graphCanvasGraphId; + //m_removedSlot = *s; // copy the slot? + GraphCanvas::NodeRequestBus::Event(GetEntityId(), &GraphCanvas::NodeRequests::RemoveSlot, graphCanvasGraphId); + } + + s->SetVisible(false); + } + } + } + else + { + // Hide the input slot + for (ScriptCanvas::Slot* s : scriptSlots) + { + if (s->IsExecution() && s->IsInput()) + { + AZ::EntityId graphCanvasGraphId; + ScriptCanvasEditor::SlotMappingRequestBus::EventResult(graphCanvasGraphId, s->GetNodeId(), &ScriptCanvasEditor::SlotMappingRequests::MapToGraphCanvasId, s->GetId()); + if (graphCanvasGraphId.IsValid()) + { + GraphCanvas::NodeRequestBus::Event(GetEntityId(), &GraphCanvas::NodeRequests::RemoveSlot, graphCanvasGraphId); + } + + s->SetVisible(false); + } + } + } + } + } + } + + void NodelingDescriptorComponent::OnDisonnectionComplete(const AZ::EntityId& connectionId) + { + + ScriptCanvas::Slot* slot = GetSlotFromNodeling(connectionId); + if (slot) + { + const auto& descriptor = slot->GetDescriptor(); + if (descriptor.IsExecution()) + { + AZStd::vector scriptSlots; + ScriptCanvas::NodeRequestBus::EventResult(scriptSlots, slot->GetNodeId(), &ScriptCanvas::NodeRequests::ModAllSlots); + + if (descriptor.IsInput()) + { + // Hide the output slot + for (ScriptCanvas::Slot* s : scriptSlots) + { + if (s->IsExecution() && s->IsOutput()) + { + + AZ::EntityId graphCanvasGraphId; + ScriptCanvasEditor::SlotMappingRequestBus::EventResult(graphCanvasGraphId, s->GetNodeId(), &ScriptCanvasEditor::SlotMappingRequests::MapToGraphCanvasId, s->GetId()); + if (graphCanvasGraphId.IsValid()) + { + GraphCanvas::NodeRequestBus::Event(GetEntityId(), &GraphCanvas::NodeRequests::AddSlot, m_removedSlotId); + } + + s->SetVisible(true); + } + } + } + else + { + // Hide the input slot + for (ScriptCanvas::Slot* s : scriptSlots) + { + if (s->IsExecution() && s->IsInput()) + { + + AZ::EntityId graphCanvasGraphId; + ScriptCanvasEditor::SlotMappingRequestBus::EventResult(graphCanvasGraphId, s->GetNodeId(), &ScriptCanvasEditor::SlotMappingRequests::MapToGraphCanvasId, s->GetId()); + if (graphCanvasGraphId.IsValid()) + { + GraphCanvas::NodeRequestBus::Event(GetEntityId(), &GraphCanvas::NodeRequests::AddSlot, graphCanvasGraphId); + } + + s->SetVisible(true); + } + } + } + } + } + } + + void NodelingDescriptorComponent::OnPreConnectionRemoved(const AZ::EntityId& connectionId) + { + ScriptCanvas::Slot* slot = GetSlotFromNodeling(connectionId); + if (slot) + { + const auto& descriptor = slot->GetDescriptor(); + if (descriptor.IsExecution()) + { + AZStd::vector scriptSlots; + ScriptCanvas::NodeRequestBus::EventResult(scriptSlots, slot->GetNodeId(), &ScriptCanvas::NodeRequests::ModAllSlots); + + // Show all the slots + for (ScriptCanvas::Slot* s : scriptSlots) + { + s->SetVisible(true); + } + } + } + } + + } diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.h index 1a1bcd07e9..9ed7855a80 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodelingDescriptorComponent.h @@ -16,25 +16,41 @@ #include #include +#include namespace ScriptCanvasEditor { class NodelingDescriptorComponent : public NodeDescriptorComponent , public ScriptCanvas::NodelingNotificationBus::Handler + , private ScriptCanvas::GraphNotificationBus::Handler { public: AZ_COMPONENT(NodelingDescriptorComponent, "{9EFA1DA5-2CCB-4A6D-AA84-BD121C75773A}", NodeDescriptorComponent); static void Reflect(AZ::ReflectContext* reflectContext); - NodelingDescriptorComponent(); - ~NodelingDescriptorComponent() = default; - + NodelingDescriptorComponent(NodeDescriptorType descriptorType = NodeDescriptorType::FunctionDefinitionNode); + ~NodelingDescriptorComponent() override = default; + + void Deactivate() override; + // NodelingNotificationBus void OnNameChanged(const AZStd::string& newName) override; //// + // GraphCanvas::GraphNotificationBus + void OnConnectionComplete(const AZ::EntityId& connectionId) override; + void OnDisonnectionComplete(const AZ::EntityId& connectionId) override; + void OnPreConnectionRemoved(const AZ::EntityId& connectionId) override; + //// + protected: void OnAddedToGraphCanvasGraph(const GraphCanvas::GraphId& graphId, const AZ::EntityId& scriptCanvasNodeId) override; + + ScriptCanvas::Slot* GetSlotFromNodeling(const AZ::EntityId& connectionId); + + AZ::Entity* m_slotEntity; + ScriptCanvas::Slot* m_removedSlot; + AZ::EntityId m_removedSlotId; }; } diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.cpp index 2a8c9a402a..f5db6761da 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.cpp @@ -193,17 +193,6 @@ namespace ScriptCanvasEditor if (remapVariableOutcome) { SetVariableId(remapVariableOutcome.GetValue()); - - bool runtimeGraph = false; - EditorGraphRequestBus::EventResult(runtimeGraph, scriptCanvasId2, &EditorGraphRequests::IsRuntimeGraph); - - ScriptCanvas::GraphVariable* variable = nullptr; - ScriptCanvas::GraphVariableManagerRequestBus::EventResult(variable, scriptCanvasId2, &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, remapVariableOutcome.GetValue()); - - if (variable) - { - variable->RemoveScope(ScriptCanvas::VariableFlags::Scope::Output); - } } } } diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/RequestBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/RequestBus.h index 811b26e935..37c98f9cc1 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/RequestBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/RequestBus.h @@ -31,6 +31,8 @@ class QPushButton; class QTableView; class QToolButton; +namespace ScriptCanvas { class Slot; } + namespace GraphCanvas { struct Endpoint; @@ -83,7 +85,6 @@ namespace ScriptCanvasEditor virtual void OnChangeActiveGraphTab(AZ::Data::AssetId) {} - virtual void CreateNewFunctionAsset() = 0; virtual void CreateNewRuntimeAsset() = 0; virtual ScriptCanvas::ScriptCanvasId GetActiveScriptCanvasId() const @@ -195,6 +196,14 @@ namespace ScriptCanvasEditor virtual void RegisterVariableType(const ScriptCanvas::Data::Type& variabletype) = 0; virtual bool IsValidVariableType(const ScriptCanvas::Data::Type& variableType) const = 0; + + struct SlotSetup + { + AZStd::string m_name; + AZ::Uuid m_type = AZ::Uuid::CreateNull(); + }; + + virtual bool ShowSlotTypeSelector(ScriptCanvas::Slot* slot, const QPoint& scenePosition, SlotSetup&) = 0; }; using VariablePaletteRequestBus = AZ::EBus; diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h index bf98616350..3bd8270629 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h @@ -196,7 +196,7 @@ namespace ScriptCanvasEditor GraphCanvas::CanHandleMimeEventOutcome CanHandleValueMimeEvent(const GraphCanvas::Endpoint& endpoint, const QMimeData* mimeData) override; bool HandleValueMimeEvent(const GraphCanvas::Endpoint& endpoint, const QMimeData* mimeData) override; - GraphCanvas::SlotId RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId) override; + GraphCanvas::SlotId RequestExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId, GraphModelRequests::ExtensionRequestReason ) override; void ExtensionCancelled(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId) override; void FinalizeExtension(const GraphCanvas::NodeId& nodeId, const GraphCanvas::ExtenderId& extenderId) override; @@ -357,6 +357,9 @@ namespace ScriptCanvasEditor AZStd::unordered_map< GraphCanvas::ToastId, AZ::EntityId > m_toastNodeIds; + // Function Definition Node Extension + void HandleFunctionDefinitionExtension(ScriptCanvas::Node* node, GraphCanvas::SlotId graphCanvasSlotId, const GraphCanvas::NodeId& nodeId); + //// Version Update code AZ::Outcome ReplaceNodeByConfig(ScriptCanvas::Node*, const ScriptCanvas::NodeConfiguration&, ScriptCanvas::ReplacementConnectionMap&); bool SanityCheckNodeReplacement(ScriptCanvas::Node*, ScriptCanvas::Node*, AZStd::unordered_map>&); diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h index 1c2cd62310..f64fffdf1b 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h @@ -146,8 +146,6 @@ namespace ScriptCanvasEditor void LoadVariables(const ScriptCanvasMemoryAsset::pointer memoryAsset); void ClearVariables(); - void GetScriptCanvasId(); - private: AZ::Data::AssetId m_removedCatalogId; AZ::Data::AssetId m_previousAssetId; diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h index 2e29445d09..2fd0e5e314 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h @@ -53,7 +53,9 @@ namespace ScriptCanvasEditor AzEventHandler, Invalid }; - + + class NodeDescriptorComponent; + class NodeDescriptorRequests : public AZ::EBusTraits { public: @@ -74,6 +76,8 @@ namespace ScriptCanvasEditor return GetType() == descriptorType; } + + virtual NodeDescriptorComponent* GetDescriptorComponent() = 0; }; using NodeDescriptorRequestBus = AZ::EBus; diff --git a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp index ca53f18232..13f1767f2d 100644 --- a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -23,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -34,12 +35,15 @@ namespace ScriptCanvasEditor::Nodes { - NodeIdPair CreateExecutionNodeling(const ScriptCanvas::ScriptCanvasId& scriptCanvasId, AZStd::string_view rootName) + NodeIdPair CreateFunctionDefinitionNode(const ScriptCanvas::ScriptCanvasId& scriptCanvasId, bool isInput, AZStd::string rootName) { ScriptCanvasEditor::Nodes::StyleConfiguration styleConfiguration; - NodeIdPair createdPair = CreateNode(azrtti_typeid(), scriptCanvasId, styleConfiguration); + auto nodeAndPair = CreateAndGetNode(azrtti_typeid(), scriptCanvasId, styleConfiguration); + NodeIdPair createdPair = nodeAndPair.second; - if (createdPair.m_scriptCanvasId.IsValid()) + auto functionDefinitionNode = azrtti_cast(nodeAndPair.first); + + if (functionDefinitionNode && createdPair.m_scriptCanvasId.IsValid()) { AZStd::unordered_set nodelingNames; @@ -71,12 +75,43 @@ namespace ScriptCanvasEditor::Nodes nodelingId.m_scriptCanvasId = scriptCanvasId; ScriptCanvas::NodelingRequestBus::Event(nodelingId, &ScriptCanvas::NodelingRequests::SetDisplayName, nodelingName); + + if (!isInput) + { + functionDefinitionNode->MarkExecutionExit(); + } + + GraphCanvas::NodeTitleRequestBus::Event(createdPair.m_graphCanvasId, &GraphCanvas::NodeTitleRequests::SetSubTitle, "Function"); + + + + // Because of how the extender slots are registered, there isn't an easy way to only create one or the other based on + // the type of nodeling, so instead they both get created and we need to remove the inapplicable one + GraphCanvas::ConnectionType typeToRemove = (isInput) ? GraphCanvas::CT_Input : GraphCanvas::CT_Output; + + AZStd::vector extenderSlotIds, executionSlotIds; + GraphCanvas::NodeRequestBus::EventResult(extenderSlotIds, createdPair.m_graphCanvasId, &GraphCanvas::NodeRequests::FindVisibleSlotIdsByType, typeToRemove, GraphCanvas::SlotTypes::ExtenderSlot); + if (!extenderSlotIds.empty()) + { + GraphCanvas::NodeRequestBus::Event(createdPair.m_graphCanvasId, &GraphCanvas::NodeRequests::RemoveSlot, *extenderSlotIds.begin()); + } + + GraphCanvas::NodeRequestBus::EventResult(executionSlotIds, createdPair.m_graphCanvasId, &GraphCanvas::NodeRequests::FindVisibleSlotIdsByType, typeToRemove, GraphCanvas::SlotTypes::ExecutionSlot); + if (!executionSlotIds.empty()) + { + GraphCanvas::NodeRequestBus::Event(createdPair.m_graphCanvasId, &GraphCanvas::NodeRequests::RemoveSlot, *executionSlotIds.begin()); + } } return createdPair; } NodeIdPair CreateNode(const AZ::Uuid& classId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, const StyleConfiguration& styleConfiguration) + { + return CreateAndGetNode(classId, scriptCanvasId, styleConfiguration).second; + } + + AZStd::pair CreateAndGetNode(const AZ::Uuid& classId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, const StyleConfiguration& styleConfiguration) { AZ_PROFILE_TIMER("ScriptCanvas", __FUNCTION__); NodeIdPair nodeIdPair; @@ -104,7 +139,7 @@ namespace ScriptCanvasEditor::Nodes //nodeConfiguration.m_nodeSubStyle = styleConfiguration.m_nodeSubStyle; } - return nodeIdPair; + return AZStd::make_pair(node, nodeIdPair); } NodeIdPair CreateEntityNode(const AZ::EntityId& sourceId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId) @@ -367,7 +402,7 @@ namespace ScriptCanvasEditor::Nodes return nodeIds; } - NodeIdPair CreateFunctionNode(const ScriptCanvas::ScriptCanvasId& scriptCanvasGraphId, const AZ::Data::AssetId& assetId) + NodeIdPair CreateFunctionNode(const ScriptCanvas::ScriptCanvasId& scriptCanvasGraphId, const AZ::Data::AssetId& assetId, const ScriptCanvas::Grammar::FunctionSourceId& sourceId) { AZ_Assert(assetId.IsValid(), "CreateFunctionNode source asset Id must be valid"); @@ -381,11 +416,9 @@ namespace ScriptCanvasEditor::Nodes scriptCanvasEntity->Init(); ScriptCanvas::Node* node = nullptr; - ScriptCanvas::SystemRequestBus::BroadcastResult(node, &ScriptCanvas::SystemRequests::CreateNodeOnEntity, scriptCanvasEntity->GetId(), scriptCanvasGraphId, ScriptCanvas::Nodes::Core::FunctionNode::RTTI_Type()); - auto* functionNode = azrtti_cast(node); - functionNode->Initialize(assetId); - functionNode->ConfigureNode(assetId); - + ScriptCanvas::SystemRequestBus::BroadcastResult(node, &ScriptCanvas::SystemRequests::CreateNodeOnEntity, scriptCanvasEntity->GetId(), scriptCanvasGraphId, ScriptCanvas::Nodes::Core::FunctionCallNode::RTTI_Type()); + auto functionNode = azrtti_cast(node); + functionNode->Initialize(assetId, sourceId); functionNode->BuildNode(); nodeIdPair.m_scriptCanvasId = scriptCanvasEntity->GetId(); diff --git a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.h b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.h index 2a9f0ee888..ab4e5d264d 100644 --- a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.h +++ b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.h @@ -13,12 +13,16 @@ #pragma once #include - #include - #include +#include #include +namespace ScriptCanvas +{ + class Node; +} + namespace ScriptEvents { class Method; @@ -27,6 +31,7 @@ namespace ScriptEvents namespace ScriptCanvasEditor::Nodes { // Specific create methods which will also handle displaying the node. + AZStd::pair CreateAndGetNode(const AZ::Uuid& classData, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, const StyleConfiguration& styleConfiguration); NodeIdPair CreateNode(const AZ::Uuid& classData, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, const StyleConfiguration& styleConfiguration); NodeIdPair CreateEntityNode(const AZ::EntityId& sourceId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId); NodeIdPair CreateObjectMethodNode(AZStd::string_view className, AZStd::string_view methodName, const ScriptCanvas::ScriptCanvasId& scriptCanvasId); @@ -42,10 +47,8 @@ namespace ScriptCanvasEditor::Nodes NodeIdPair CreateSetVariableNode(const ScriptCanvas::VariableId& variableId, ScriptCanvas::ScriptCanvasId scriptCanvasGraphId); // Functions - NodeIdPair CreateFunctionNode(const ScriptCanvas::ScriptCanvasId& scriptCanvasGraphId, const AZ::Data::AssetId& assetId); - - // Nodelings - NodeIdPair CreateExecutionNodeling(const ScriptCanvas::ScriptCanvasId& scriptCanvasId, AZStd::string_view rootName = "New Nodeling"); + NodeIdPair CreateFunctionNode(const ScriptCanvas::ScriptCanvasId& scriptCanvasGraphId, const AZ::Data::AssetId& assetId, const ScriptCanvas::Grammar::FunctionSourceId& sourceId); + NodeIdPair CreateFunctionDefinitionNode(const ScriptCanvas::ScriptCanvasId& scriptCanvasId, bool isInput, AZStd::string rootName = "New Nodeling"); // AZ Event NodeIdPair CreateAzEventHandlerNode(const AZ::BehaviorMethod& methodWithAzEventReturn, ScriptCanvas::ScriptCanvasId scriptCanvasId, diff --git a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp index f6ec34e0c4..e93812e318 100644 --- a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp @@ -30,6 +30,8 @@ #include #include #include +#include + #include #include #include @@ -39,7 +41,7 @@ #include #include #include -#include +#include #include #include #include @@ -47,6 +49,7 @@ #include #include + namespace ScriptCanvasEditor::Nodes::SlotDisplayHelper { AZ::EntityId DisplayPropertySlot(AZ::EntityId graphCanvasNodeId, const ScriptCanvas::VisualExtensionSlotConfiguration& propertyConfiguration); @@ -819,12 +822,12 @@ namespace ScriptCanvasEditor::Nodes } // Function Nodes - AZ::EntityId DisplayFunctionNode(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::FunctionNode* functionNode) + AZ::EntityId DisplayFunctionNode(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::FunctionCallNode* functionNode) { - return DisplayFunctionNode(graphCanvasGraphId, const_cast(functionNode)); + return DisplayFunctionNode(graphCanvasGraphId, const_cast(functionNode)); } - AZ::EntityId DisplayFunctionNode(AZ::EntityId, ScriptCanvas::Nodes::Core::FunctionNode* functionNode) + AZ::EntityId DisplayFunctionNode(AZ::EntityId, ScriptCanvas::Nodes::Core::FunctionCallNode* functionNode) { AZ::EntityId graphCanvasNodeId; @@ -892,6 +895,80 @@ namespace ScriptCanvasEditor::Nodes return graphCanvasNodeId; } + AZ::EntityId DisplayFunctionDefinitionNode(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::FunctionDefinitionNode* nodeling) + { + NodeConfiguration nodeConfiguration; + + nodeConfiguration.PopulateComponentDescriptors(); + + if (nodeling->RequiresDynamicSlotOrdering()) + { + nodeConfiguration.PopulateComponentDescriptors(); + } + else + { + nodeConfiguration.PopulateComponentDescriptors(); + } + + nodeConfiguration.m_nodeSubStyle = ".nodeling"; + nodeConfiguration.m_titlePalette = "NodelingTitlePalette"; + nodeConfiguration.m_scriptCanvasId = nodeling->GetEntityId(); + + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); + + AZ_Assert(serializeContext, "Failed to acquire application serialize context."); + const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(azrtti_typeid(nodeling)); + + if (classData) + { + AZStd::string nodeContext = GetContextName(*classData); + nodeConfiguration.m_translationContext = TranslationHelper::GetUserDefinedContext(nodeContext); + + nodeConfiguration.m_titleFallback = (classData->m_editData && classData->m_editData->m_name) ? classData->m_editData->m_name : classData->m_name; + nodeConfiguration.m_tooltipFallback = (classData->m_editData && classData->m_editData->m_description) ? classData->m_editData->m_description : ""; + + GraphCanvas::TranslationKeyedString subtitleKeyedString(nodeContext, nodeConfiguration.m_translationContext); + subtitleKeyedString.m_key = TranslationHelper::GetUserDefinedNodeKey(nodeContext, nodeConfiguration.m_titleFallback, ScriptCanvasEditor::TranslationKeyId::Category); + + nodeConfiguration.m_subtitleFallback = subtitleKeyedString.GetDisplayString(); + + nodeConfiguration.m_translationKeyName = nodeConfiguration.m_titleFallback; + nodeConfiguration.m_translationKeyContext = nodeContext; + + nodeConfiguration.m_translationGroup = TranslationContextGroup::ClassMethod; + + + ScriptCanvas::GraphScopedNodeId nodelingId; + + nodelingId.m_identifier = nodeConfiguration.m_scriptCanvasId; + nodelingId.m_scriptCanvasId = nodeling->GetOwningScriptCanvasId(); + + AZStd::string nodelingName; + ScriptCanvas::NodelingRequestBus::EventResult(nodelingName, nodelingId, &ScriptCanvas::NodelingRequests::GetDisplayName); + + if (classData->m_editData) + { + const AZ::Edit::ElementData* elementData = classData->m_editData->FindElementData(AZ::Edit::ClassElements::EditorData); + + if (elementData) + { + if (auto nodeTypeAttribute = elementData->FindAttribute(ScriptCanvas::Attributes::Node::NodeType)) + { + if (auto nodeTypeAttributeData = azdynamic_cast*>(nodeTypeAttribute)) + { + nodeConfiguration.m_nodeType = nodeTypeAttributeData->Get(nullptr); + } + } + } + } + } + + nodeConfiguration.m_subtitleFallback = ""; + + return DisplayGeneralScriptCanvasNode(graphCanvasGraphId, nodeling, nodeConfiguration); + } + AZ::EntityId DisplayNodeling(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::Internal::Nodeling* nodeling) { NodeConfiguration nodeConfiguration; @@ -1062,9 +1139,13 @@ namespace ScriptCanvasEditor::Nodes { graphCanvasNodeId = DisplayScriptEventSenderNode(graphCanvasGraphId, static_cast(node)); } - else if (azrtti_istypeof(node)) + else if (azrtti_istypeof(node)) + { + graphCanvasNodeId = DisplayFunctionNode(graphCanvasGraphId, static_cast(node)); + } + else if (azrtti_istypeof(node)) { - graphCanvasNodeId = DisplayFunctionNode(graphCanvasGraphId, static_cast(node)); + graphCanvasNodeId = DisplayFunctionDefinitionNode(graphCanvasGraphId, static_cast(node)); } else if (azrtti_istypeof(node)) { @@ -1138,7 +1219,7 @@ namespace ScriptCanvasEditor::Nodes if (slot.IsLatent()) { - executionConfiguration.m_textDecoration = "🕒"; + executionConfiguration.m_textDecoration = u8"\U0001f552"; executionConfiguration.m_textDecorationToolTip = "This slot will not be executed immediately."; } @@ -1163,7 +1244,7 @@ namespace ScriptCanvasEditor::Nodes if (slot.IsLatent()) { - dataSlotConfiguration.m_textDecoration = "🕒"; + dataSlotConfiguration.m_textDecoration = u8"\U0001f552"; dataSlotConfiguration.m_textDecorationToolTip = "This slot will not be executed immediately."; } diff --git a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.h b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.h index fbfb5786e4..230a318deb 100644 --- a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.h +++ b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.h @@ -28,7 +28,7 @@ namespace ScriptCanvas::Nodes::Core { class AzEventHandler; class EBusEventHandler; - class FunctionNode; + class FunctionCallNode; class GetVariableNode; class Method; class ReceiveScriptEvent; @@ -66,8 +66,8 @@ namespace ScriptCanvasEditor::Nodes AZ::EntityId DisplayScriptEventWrapperNode(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::ReceiveScriptEvent* busNode); // Functions - AZ::EntityId DisplayFunctionNode(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::FunctionNode* functionNode); - AZ::EntityId DisplayFunctionNode(AZ::EntityId graphCanvasGraphId, ScriptCanvas::Nodes::Core::FunctionNode* functionNode); + AZ::EntityId DisplayFunctionNode(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::FunctionCallNode* functionNode); + AZ::EntityId DisplayFunctionNode(AZ::EntityId graphCanvasGraphId, ScriptCanvas::Nodes::Core::FunctionCallNode* functionNode); // SlotGroup will control how elements are grouped. diff --git a/Gems/ScriptCanvas/Code/Editor/ScriptCanvasEditorGem.cpp b/Gems/ScriptCanvas/Code/Editor/ScriptCanvasEditorGem.cpp index 6fb1ed56a9..26df9939a8 100644 --- a/Gems/ScriptCanvas/Code/Editor/ScriptCanvasEditorGem.cpp +++ b/Gems/ScriptCanvas/Code/Editor/ScriptCanvasEditorGem.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include @@ -118,6 +119,7 @@ namespace ScriptCanvas ScriptCanvasEditor::SetVariableNodeDescriptorComponent::CreateDescriptor(), ScriptCanvasEditor::UserDefinedNodeDescriptorComponent::CreateDescriptor(), ScriptCanvasEditor::FunctionNodeDescriptorComponent::CreateDescriptor(), + ScriptCanvasEditor::FunctionDefinitionNodeDescriptorComponent::CreateDescriptor(), ScriptCanvasEditor::NodelingDescriptorComponent::CreateDescriptor() }); diff --git a/Gems/ScriptCanvas/Code/Editor/Settings.cpp b/Gems/ScriptCanvas/Code/Editor/Settings.cpp index 7e7a4f3c3a..3d1745e814 100644 --- a/Gems/ScriptCanvas/Code/Editor/Settings.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Settings.cpp @@ -30,8 +30,8 @@ namespace SettingsCpp { if (auto userSettings = AZ::UserSettings::CreateFind(AZ_CRC("ScriptCanvasPreviewSettings", 0x1c5a2965), AZ::UserSettings::CT_LOCAL)) { - ScriptCanvas::Grammar::s_saveRawTranslationOuputToFile = userSettings->m_saveRawTranslationOuputToFile; - ScriptCanvas::Grammar::s_printAbstractCodeModel = userSettings->m_printAbstractCodeModel; + ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = userSettings->m_saveRawTranslationOuputToFile; + ScriptCanvas::Grammar::g_printAbstractCodeModel = userSettings->m_printAbstractCodeModel; } } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp index da1950672e..6d36236906 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp @@ -15,22 +15,19 @@ #include #include - +#include #include - -#include -#include -#include - -#include -#include +#include #include #include +#include #include +#include #include - -#include -#include +#include +#include +#include +#include namespace ScriptCanvasEditor { @@ -51,50 +48,41 @@ namespace ScriptCanvasEditor } - CreateFunctionMimeEvent::CreateFunctionMimeEvent(const AZ::Data::AssetId& assetId) + CreateFunctionMimeEvent::CreateFunctionMimeEvent(const AZ::Data::AssetId& assetId, const AZ::Data::AssetType& assetType, const ScriptCanvas::Grammar::FunctionSourceId& sourceId) : m_assetId(assetId) + , m_assetType(assetType) + , m_sourceId(sourceId) { } - bool CreateFunctionMimeEvent::CanGraphHandleEvent(const GraphCanvas::GraphId& graphId) const + bool CreateFunctionMimeEvent::CanGraphHandleEvent([[maybe_unused]] const GraphCanvas::GraphId& graphId) const { - AZ::EntityId scGraphId; - GeneralRequestBus::BroadcastResult(scGraphId, &GeneralRequests::GetScriptCanvasId, graphId); - - bool isFunctionGraph = false; - EditorGraphRequestBus::EventResult(isFunctionGraph, scGraphId, &EditorGraphRequests::IsFunctionGraph); - - return !isFunctionGraph; + return true; } ScriptCanvasEditor::NodeIdPair CreateFunctionMimeEvent::CreateNode(const AZ::EntityId& scriptCanvasGraphId) const { - return Nodes::CreateFunctionNode(scriptCanvasGraphId, m_assetId); + return Nodes::CreateFunctionNode(scriptCanvasGraphId, m_assetId, m_sourceId); } ///////////////////////////////////// // FunctionPaletteTreeItem ///////////////////////////////////// - FunctionPaletteTreeItem::FunctionPaletteTreeItem(const char* name, const AZ::Data::AssetId& sourceAssetId, const AZ::Data::AssetId& runtimeAssetId) + FunctionPaletteTreeItem::FunctionPaletteTreeItem(const char* name, const ScriptCanvas::Grammar::FunctionSourceId& sourceId, AZ::Data::Asset asset) : GraphCanvas::DraggableNodePaletteTreeItem(name, ScriptCanvasEditor::AssetEditorId) , m_editIcon(":/ScriptCanvasEditorResources/Resources/edit_icon.png") - , m_sourceAssetId(sourceAssetId) - , m_runtimeAssetId(runtimeAssetId) + , m_sourceId(sourceId) + , m_asset(asset) { - //TODO + // TODO //SetToolTip(m_methodDefinition.GetTooltip().c_str()); SetTitlePalette("FunctionNodeTitlePalette"); } - void FunctionPaletteTreeItem::SetRuntimeAssetId(const AZ::Data::AssetId& assetId) - { - m_runtimeAssetId = assetId; - } - GraphCanvas::GraphCanvasMimeEvent* FunctionPaletteTreeItem::CreateMimeEvent() const { - return aznew CreateFunctionMimeEvent(m_runtimeAssetId); + return aznew CreateFunctionMimeEvent(m_asset->GetId(), m_asset->GetType(), m_sourceId); } QVariant FunctionPaletteTreeItem::OnData(const QModelIndex& index, int role) const @@ -117,14 +105,24 @@ namespace ScriptCanvasEditor return GraphCanvas::DraggableNodePaletteTreeItem::OnData(index, role); } - const AZ::Data::AssetId& FunctionPaletteTreeItem::GetSourceAssetId() const + ScriptCanvas::Grammar::FunctionSourceId FunctionPaletteTreeItem::GetFunctionSourceId() const + { + return m_sourceId; + } + + AZ::Data::AssetId FunctionPaletteTreeItem::GetSourceAssetId() const + { + return AZ::Data::AssetId(GetAssetId().m_guid, 0); + } + + AZ::Data::AssetId FunctionPaletteTreeItem::GetAssetId() const { - return m_sourceAssetId; + return m_asset->GetId(); } - const AZ::Data::AssetId& FunctionPaletteTreeItem::GetRuntimeAssetId() const + AZ::Data::AssetType FunctionPaletteTreeItem::GetAssetType() const { - return m_runtimeAssetId; + return m_asset->GetType(); } void FunctionPaletteTreeItem::OnHoverStateChanged() @@ -136,7 +134,7 @@ namespace ScriptCanvasEditor { if (row == NodePaletteTreeItem::Column::Customization) { - GeneralRequestBus::Broadcast(&GeneralRequests::OpenScriptCanvasAsset, m_sourceAssetId, -1); + GeneralRequestBus::Broadcast(&GeneralRequests::OpenScriptCanvasAsset, GetSourceAssetId(), -1); } } @@ -144,7 +142,7 @@ namespace ScriptCanvasEditor { if (row != NodePaletteTreeItem::Column::Customization) { - GeneralRequestBus::Broadcast(&GeneralRequests::OpenScriptCanvasAsset, m_sourceAssetId, -1); + GeneralRequestBus::Broadcast(&GeneralRequests::OpenScriptCanvasAsset, GetSourceAssetId(), -1); return true; } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h index f637e5d9d8..bfd5268d5b 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h @@ -44,15 +44,16 @@ namespace ScriptCanvasEditor static void Reflect(AZ::ReflectContext* reflectContext); CreateFunctionMimeEvent() = default; - CreateFunctionMimeEvent(const AZ::Data::AssetId& assetId); + CreateFunctionMimeEvent(const AZ::Data::AssetId& assetId, const AZ::Data::AssetType& assetType, const ScriptCanvas::Grammar::FunctionSourceId& sourceId); ~CreateFunctionMimeEvent() = default; bool CanGraphHandleEvent(const GraphCanvas::GraphId& graphId) const override; ScriptCanvasEditor::NodeIdPair CreateNode(const AZ::EntityId& graphId) const override; private: - + ScriptCanvas::Grammar::FunctionSourceId m_sourceId; AZ::Data::AssetId m_assetId; + AZ::Data::AssetType m_assetType; }; class FunctionPaletteTreeItem @@ -62,30 +63,26 @@ namespace ScriptCanvasEditor AZ_RTTI(FunctionPaletteTreeItem, "{AF75BBAD-BC8A-46D2-81B6-54C0E6CB3E41}", GraphCanvas::DraggableNodePaletteTreeItem); AZ_CLASS_ALLOCATOR(FunctionPaletteTreeItem, AZ::SystemAllocator, 0); - FunctionPaletteTreeItem(const char* name, const AZ::Data::AssetId& sourceAssetId, const AZ::Data::AssetId& runtimeAssetId = {}); + FunctionPaletteTreeItem(const char* name, const ScriptCanvas::Grammar::FunctionSourceId& sourceId, AZ::Data::Asset asset); ~FunctionPaletteTreeItem() = default; - void SetRuntimeAssetId(const AZ::Data::AssetId& assetId); - GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const; QVariant OnData(const QModelIndex& index, int role) const; - const AZ::Data::AssetId& GetSourceAssetId() const; - const AZ::Data::AssetId& GetRuntimeAssetId() const; + ScriptCanvas::Grammar::FunctionSourceId GetFunctionSourceId() const; + AZ::Data::AssetId GetSourceAssetId() const; + AZ::Data::AssetId GetAssetId() const; + AZ::Data::AssetType GetAssetType() const; protected: - void OnHoverStateChanged() override; - void OnClicked(int row) override; bool OnDoubleClicked(int row) override; private: - QIcon m_editIcon; - - AZ::Data::AssetId m_sourceAssetId; - AZ::Data::AssetId m_runtimeAssetId; + ScriptCanvas::Grammar::FunctionSourceId m_sourceId; + AZ::Data::Asset m_asset; }; } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp index 1db4cb5afa..f72bec8393 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp @@ -583,6 +583,13 @@ namespace { if (!IsExplicitOverload(*methodIter.second)) { + // Respect the exclusion flags + auto attributeData = azdynamic_cast*>(AZ::FindAttribute(AZ::Script::Attributes::ExcludeFrom, methodIter.second->m_attributes)); + if (ShouldExcludeFromNodeList(attributeData , {})) + { + return; + } + RegisterMethod(nodePaletteModel, behaviorContext, categoryPath, behaviorClass, methodIter.first, *methodIter.second, behaviorClass->IsMethodOverloaded(methodIter.first)); } } @@ -1290,7 +1297,7 @@ namespace ScriptCanvasEditor AzFramework::StringFunc::Path::Join(rootPath.c_str(), assetInfo.m_relativePath.c_str(), absolutePath); - AZStd::string category = "Global Functions"; + AZStd::string category = "User Functions"; AZStd::string relativePath; if (AzFramework::StringFunc::Path::GetFolderPath(assetInfo.m_relativePath.c_str(), relativePath)) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp index eac1cfb425..ac8932d30b 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp @@ -27,59 +27,48 @@ #include #include #include -#include #include -#include +#include #include - +#include #include -#include #include +#include +#include +#include #include - -#include - -#include -#include -#include - -#include -#include - +#include +#include #include -#include - #include +#include +#include +#include +#include +#include #include #include -#include #include +#include +#include #include #include -#include - -#include -#include -#include -#include -#include -#include - +#include +#include +#include +#include +#include #include - -#include -#include - #include -#include -#include - +#include +#include #include #include #include - -#include -#include +#include +#include +#include +#include namespace ScriptCanvasEditor { @@ -103,7 +92,7 @@ namespace ScriptCanvasEditor GraphCanvas::NodePaletteTreeItem* customEventRoot = root->GetCategoryNode("Script Events"); customEventRoot->SetAllowPruneOnEmpty(false); - GraphCanvas::NodePaletteTreeItem* globalFunctionRoot = root->GetCategoryNode("Global Functions"); + GraphCanvas::NodePaletteTreeItem* globalFunctionRoot = root->GetCategoryNode("User Functions"); globalFunctionRoot->SetAllowPruneOnEmpty(false); } @@ -167,7 +156,6 @@ namespace ScriptCanvasEditor , m_nodePaletteModel(nodePaletteModel) , m_assetModel(assetModel) , m_categorizer(nodePaletteModel) - , m_isFunctionGraphActive(false) { UpgradeNotifications::Bus::Handler::BusConnect(); @@ -245,12 +233,9 @@ namespace ScriptCanvasEditor { ScriptCanvas::RuntimeRequestBus::EventResult(m_previousAssetId, scriptCanvasId, &ScriptCanvas::RuntimeRequests::GetAssetId); - m_isFunctionGraphActive = false; - EditorGraphRequestBus::EventResult(m_isFunctionGraphActive, scriptCanvasId, &EditorGraphRequests::IsFunctionGraph); - for (auto functionTreePair : m_globalFunctionTreeItems) { - functionTreePair.second->SetEnabled(!m_isFunctionGraphActive); + functionTreePair.second->SetEnabled(true); } } @@ -278,7 +263,6 @@ namespace ScriptCanvasEditor if (entry->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Product) { const AzToolsFramework::AssetBrowser::ProductAssetBrowserEntry* productEntry = azrtti_cast(entry); - const AZ::Data::AssetId& assetId = productEntry->GetAssetId(); auto scriptEventElementIter = m_scriptEventElementTreeItems.find(assetId); @@ -290,22 +274,10 @@ namespace ScriptCanvasEditor } else { - bool isRuntimeAsset = (m_runtimeAssets.erase(assetId) > 0); - - auto globalFunctionElementIter = m_globalFunctionTreeItems.find(assetId.m_guid); - + auto globalFunctionElementIter = m_globalFunctionTreeItems.find(assetId); if (globalFunctionElementIter != m_globalFunctionTreeItems.end()) { - if (isRuntimeAsset) - { - globalFunctionElementIter->second->SetError("Function has errors and cannot be created until these errors are resolved."); - } - else - { - globalFunctionElementIter->second->DetachItem(); - delete globalFunctionElementIter->second; - m_globalFunctionTreeItems.erase(globalFunctionElementIter); - } + globalFunctionElementIter->second->SetError("Graph has errors or has been deleted"); } } } @@ -337,35 +309,35 @@ namespace ScriptCanvasEditor if (entry->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Product) { const AzToolsFramework::AssetBrowser::ProductAssetBrowserEntry* productEntry = static_cast(entry); - const AZ::Data::AssetId& assetId = productEntry->GetAssetId(); - if (productEntry->GetAssetType() == azrtti_typeid()) - { - auto elementIter = m_globalFunctionTreeItems.find(assetId.m_guid); - if (elementIter == m_globalFunctionTreeItems.end()) - { - RequestAssetLoad(assetId, azrtti_typeid()); - } - } - else if (productEntry->GetAssetType() == azrtti_typeid()) + const auto entryType = productEntry->GetAssetType(); + + if (entryType == azrtti_typeid()) { - auto elementIter = m_globalFunctionTreeItems.find(assetId.m_guid); + const AZ::Data::AssetId& assetId = productEntry->GetAssetId(); + + auto elementIter = m_globalFunctionTreeItems.find(assetId); if (elementIter == m_globalFunctionTreeItems.end()) { - RequestAssetLoad(assetId, azrtti_typeid()); + RequestAssetLoad(assetId, productEntry->GetAssetType()); } else { - elementIter->second->SetRuntimeAssetId(assetId); - elementIter->second->ClearError(); + if (elementIter->second->HasError()) + { + m_pendingAssets.erase(assetId); + RequestAssetLoad(assetId, productEntry->GetAssetType()); + } } } - else if (productEntry->GetAssetType() == azrtti_typeid()) + else if (entryType == azrtti_typeid()) { + const AZ::Data::AssetId& assetId = productEntry->GetAssetId(); + auto elementIter = m_scriptEventElementTreeItems.find(assetId.m_guid); if (elementIter == m_scriptEventElementTreeItems.end()) { - RequestAssetLoad(assetId, azrtti_typeid()); + RequestAssetLoad(assetId, productEntry->GetAssetType()); } } } @@ -376,17 +348,15 @@ namespace ScriptCanvasEditor { AZ::SystemTickBus::Handler::BusDisconnect(); - while (!m_queuedLoads.empty()) + while (!m_requestQueue.empty()) { - auto entry = m_queuedLoads.front(); - m_queuedLoads.erase(m_queuedLoads.begin()); + const auto entry = m_requestQueue.front(); + m_requestQueue.pop(); - if (m_pendingAssets.find(entry) == m_pendingAssets.end()) + if (m_pendingAssets.find(entry.first) == m_pendingAssets.end()) { - m_pendingAssets.insert(entry); - AZ::Data::AssetBus::MultiHandler::BusConnect(entry.first); - AZ::Data::AssetManager::Instance().GetAsset(entry.first, entry.second, AZ::Data::AssetLoadBehavior::Default); + m_pendingAssets[entry.first] = AZ::Data::AssetManager::Instance().GetAsset(entry.first, entry.second, AZ::Data::AssetLoadBehavior::Default); } } } @@ -394,28 +364,28 @@ namespace ScriptCanvasEditor void ScriptCanvasRootPaletteTreeItem::OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) { auto scriptEventIter = m_scriptEventElementTreeItems.find(assetId.m_guid); - if (scriptEventIter != m_scriptEventElementTreeItems.end()) { RequestAssetLoad(assetId, azrtti_typeid()); } else { - AZ::Data::AssetType assetType = azrtti_typeid(); - auto elementIter = m_globalFunctionTreeItems.find(assetId.m_guid); - - if (m_runtimeAssets.count(assetId) > 0) + auto functionIter = m_globalFunctionTreeItems.find(assetId); + if (functionIter != m_globalFunctionTreeItems.end()) { - assetType = azrtti_typeid(); - } - - if (elementIter != m_globalFunctionTreeItems.end()) - { - RequestAssetLoad(assetId, assetType); + RequestAssetLoad(assetId, azrtti_typeid()); } } } + void ScriptCanvasRootPaletteTreeItem::OnCatalogAssetAdded(const AZ::Data::AssetId&) + { + } + + void ScriptCanvasRootPaletteTreeItem::OnCatalogAssetRemoved(const AZ::Data::AssetId&, const AZ::Data::AssetInfo&) + { + } + void ScriptCanvasRootPaletteTreeItem::OnUpgradeStart() { DisconnectLambdas(); @@ -450,15 +420,20 @@ namespace ScriptCanvasEditor { // Delay handling loads until the top of the next tick in case we are handling this on an asset callback thread to avoid potential deadlocks. AZ::SystemTickBus::Handler::BusConnect(); - m_queuedLoads.emplace_back(AZStd::make_pair(assetId, assetType)); + m_requestQueue.emplace(AZStd::make_pair(assetId, assetType)); } - void ScriptCanvasRootPaletteTreeItem::OnAssetReady(AZ::Data::Asset asset) + void ScriptCanvasRootPaletteTreeItem::OnAssetError(AZ::Data::Asset asset) { + // mark the function on error... if possible AZ::Data::AssetId assetId = asset.GetId(); + m_pendingAssets.erase(assetId); + } - m_pendingAssets.erase(AZStd::make_pair(assetId, asset.GetType())); - AZ::Data::AssetBus::MultiHandler::BusDisconnect(assetId); + void ScriptCanvasRootPaletteTreeItem::OnAssetReady(AZ::Data::Asset asset) + { + AZ::Data::AssetId assetId = asset.GetId(); + m_pendingAssets.erase(assetId); if (asset.GetType() == azrtti_typeid()) { @@ -480,125 +455,193 @@ namespace ScriptCanvasEditor } else if (asset.GetType() == azrtti_typeid()) { - ScriptCanvas::SubgraphInterfaceAsset* data = asset.GetAs(); - - AZStd::string rootPath, absolutePath; - AZ::Data::AssetInfo assetInfo = AssetHelpers::GetAssetInfo(assetId, rootPath); - AzFramework::StringFunc::Path::Join(rootPath.c_str(), assetInfo.m_relativePath.c_str(), absolutePath); - - AZ::Data::AssetId sourceAssetId; - - AZStd::string normPath = absolutePath; - AzFramework::StringFunc::Path::Normalize(normPath); - - AZStd::string watchFolder; - bool sourceInfoFound{}; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(sourceInfoFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, normPath.c_str(), assetInfo, watchFolder); + // We only need to add + auto treePaletteIter = m_globalFunctionTreeItems.find(asset->GetId()); - if (!sourceInfoFound) - { - // TODO-LS: report the problem - return; - } - - sourceAssetId = assetInfo.m_assetId; - - AZ::Data::AssetId runtimeAssetId = asset.GetId(); - - if (m_runtimeAssets.count(runtimeAssetId) == 0) + if (treePaletteIter == m_globalFunctionTreeItems.end()) { - m_runtimeAssets.insert(runtimeAssetId); - - auto treePaletteIter = m_globalFunctionTreeItems.find(sourceAssetId.m_guid); - - if (treePaletteIter == m_globalFunctionTreeItems.end()) + ScriptCanvas::SubgraphInterfaceAsset* data = asset.GetAs(); + if (!data) { - CreateFunctionPaletteItem(data->m_runtimeData.m_name, assetInfo, sourceAssetId, runtimeAssetId); + return; } - else + + if (!data->m_runtimeData.m_interface.HasAnyFunctionality()) { - treePaletteIter->second->SetRuntimeAssetId(runtimeAssetId); - treePaletteIter->second->ClearError(); + // check for deleting the old entry + return; } - } - } - else if (asset.GetType() == azrtti_typeid()) - { - ScriptCanvasFunctionAsset* data = asset.GetAs(); - - AZStd::string rootPath, absolutePath; - AZ::Data::AssetInfo assetInfo = AssetHelpers::GetAssetInfo(assetId, rootPath); - AzFramework::StringFunc::Path::Join(rootPath.c_str(), assetInfo.m_relativePath.c_str(), absolutePath); - AZ::Data::AssetId sourceAssetId; + AZStd::string rootPath, absolutePath; + AZ::Data::AssetInfo assetInfo = AssetHelpers::GetAssetInfo(assetId, rootPath); + AzFramework::StringFunc::Path::Join(rootPath.c_str(), assetInfo.m_relativePath.c_str(), absolutePath); - AZStd::string normPath = absolutePath; - AzFramework::StringFunc::Path::Normalize(normPath); + AZStd::string normPath = absolutePath; + AzFramework::StringFunc::Path::Normalize(normPath); - AZStd::string watchFolder; - bool sourceInfoFound{}; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(sourceInfoFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, normPath.c_str(), assetInfo, watchFolder); - - if (!sourceInfoFound) - { - return; - } + AZStd::string watchFolder; + bool sourceInfoFound{}; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult(sourceInfoFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, normPath.c_str(), assetInfo, watchFolder); - sourceAssetId = assetInfo.m_assetId; - - // We only need to add - auto treePaletteIter = m_globalFunctionTreeItems.find(sourceAssetId.m_guid); + if (!sourceInfoFound) + { + return; + } - if (treePaletteIter == m_globalFunctionTreeItems.end()) - { - CreateFunctionPaletteItem(data->GetFunctionData()->GetPrettyName(), assetInfo, sourceAssetId); + CreateFunctionPaletteItem(asset, assetInfo); - treePaletteIter = m_globalFunctionTreeItems.find(sourceAssetId.m_guid); + treePaletteIter = m_globalFunctionTreeItems.find(asset->GetId()); if (treePaletteIter != m_globalFunctionTreeItems.end()) { - treePaletteIter->second->SetError("Function has errors and cannot be created until these errors are resolved."); + treePaletteIter->second->ClearError(); } + + m_monitoredAssets.emplace(asset->GetId(), asset); + } + else + { + RequestBuildChildrenFromSubgraphInterface(treePaletteIter->second, asset); + treePaletteIter->second->ClearError(); } } } + void ScriptCanvasRootPaletteTreeItem::OnAssetReloaded(AZ::Data::Asset asset) + { + OnAssetReady(asset); + } + bool ScriptCanvasRootPaletteTreeItem::HasAssetTreeItem(AZ::Data::AssetId assetId) const { return m_scriptEventElementTreeItems.find(assetId) != m_scriptEventElementTreeItems.end() || m_globalFunctionTreeItems.find(assetId) != m_globalFunctionTreeItems.end(); } - void ScriptCanvasRootPaletteTreeItem::CreateFunctionPaletteItem(const AZStd::string& displayName, const AZ::Data::AssetInfo& assetInfo, const AZ::Data::AssetId& sourceId, const AZ::Data::AssetId& runtimeId) + void ScriptCanvasRootPaletteTreeItem::CreateFunctionPaletteItem(AZ::Data::Asset asset, const AZ::Data::AssetInfo& assetInfo) { + ScriptCanvas::SubgraphInterfaceAsset* data = asset.GetAs(); + if (!data) + { + return; + } + + const ScriptCanvas::Grammar::SubgraphInterface& graphInterface = data->m_runtimeData.m_interface; + if (!graphInterface.HasAnyFunctionality()) + { + return; + } + AZStd::string name; AzFramework::StringFunc::Path::GetFileName(assetInfo.m_relativePath.c_str(), name); - AZStd::string prettyName = displayName; + AZStd::string category = "User Functions"; - AZStd::string category = "Global Functions"; AZStd::string relativePath; if (AzFramework::StringFunc::Path::GetFolderPath(assetInfo.m_relativePath.c_str(), relativePath)) { AZStd::to_lower(relativePath.begin(), relativePath.end()); - const AZStd::string root = "scriptcanvas/functions/"; - if (relativePath.starts_with(root)) + auto stripPathStart = [&](const AZStd::string root) { - relativePath = relativePath.substr(root.size(), relativePath.size() - root.size()); - } + if (relativePath.starts_with(root)) + { + relativePath = relativePath.substr(root.size(), relativePath.size() - root.size()); + } + }; + + stripPathStart("scriptcanvas/functions"); + stripPathStart("scriptcanvas"); + stripPathStart("/"); category.append("/"); category.append(relativePath); } - GraphCanvas::NodePaletteTreeItem* categoryRoot = GetCategoryNode(category.c_str()); - FunctionPaletteTreeItem* treeItem = categoryRoot->CreateChildNode(prettyName.empty() ? name.c_str() : prettyName.c_str(), sourceId, runtimeId); + NodePaletteTreeItem* categoryRoot = GetCategoryNode(category.c_str()); + auto functionCategory = categoryRoot->CreateChildNode(name.c_str(), ScriptCanvasEditor::AssetEditorId); + RequestBuildChildrenFromSubgraphInterface(functionCategory, asset); + m_globalFunctionTreeItems[asset->GetId()] = functionCategory; + categoryRoot->SetEnabled(true); + } + + void ScriptCanvasRootPaletteTreeItem::RequestBuildChildrenFromSubgraphInterface(NodePaletteTreeItem* functionCategory, AZ::Data::Asset asset) + { + functionCategory->ClearChildren(); + + ScriptCanvas::SubgraphInterfaceAsset* data = asset.GetAs(); + if (!data) + { + return; + } - if (treeItem) + const ScriptCanvas::Grammar::SubgraphInterface& graphInterface = data->m_runtimeData.m_interface; + if (!graphInterface.HasAnyFunctionality()) { - m_globalFunctionTreeItems[sourceId.m_guid] = treeItem; - treeItem->SetEnabled(!m_isFunctionGraphActive); + return; + } + + auto parent = functionCategory; + parent->SetEnabled(true); + + if (graphInterface.IsUserNodeable()) + { + auto name = functionCategory->GetName().toUtf8().constData(); + parent = parent->CreateChildNode(AZStd::string::format("%s Node", name).c_str(), ScriptCanvas::Grammar::MakeFunctionSourceIdNodeable(), asset); + parent->SetEnabled(true); + } + + if (graphInterface.IsMarkedPure()) + { + for (auto& in : graphInterface.GetIns()) + { + auto childNode = parent->CreateChildNode(in.displayName.c_str(), in.sourceID, asset); + childNode->SetEnabled(true); + } + } + else + { + auto& ins = graphInterface.GetIns(); + AZStd::vector onNodeIns; + AZStd::vector pureIns; + + auto onNodeParent = parent; + auto pureParent = functionCategory; + + for (auto& in : ins) + { + if (in.isPure) + { + pureIns.push_back(&in); + } + else + { + onNodeIns.push_back(&in); + } + } + + if (!onNodeIns.empty()) + { + parent->SetEnabled(true); + + for (auto in : onNodeIns) + { + auto childNode = parent->CreateChildNode(in->displayName.c_str(), ScriptCanvasEditor::AssetEditorId); + childNode->SetEnabled(true); + } + } + + if (!pureIns.empty()) + { + parent = pureParent->CreateChildNode("Pure Functions", ScriptCanvasEditor::AssetEditorId); + parent->SetEnabled(true); + + for (auto in : pureIns) + { + auto childNode = parent->CreateChildNode(in->displayName.c_str(), in->sourceID, asset); + childNode->SetEnabled(true); + } + } } } @@ -643,9 +686,6 @@ namespace ScriptCanvasEditor auto scriptEventAction = creationMenu->addAction("New Script Event"); QObject::connect(scriptEventAction, &QAction::triggered, this, &NodePaletteDockWidget::OnNewCustomEvent); - auto functionAction = creationMenu->addAction("New Function"); - QObject::connect(functionAction, &QAction::triggered, this, &NodePaletteDockWidget::OnNewFunctionEvent); - m_newCustomEvent = new QToolButton(this); m_newCustomEvent->setIcon(QIcon(":/ScriptCanvasEditorResources/Resources/add.png")); m_newCustomEvent->setToolTip("Click to create a new Script Event or Function"); @@ -696,11 +736,6 @@ namespace ScriptCanvasEditor AzToolsFramework::AssetEditor::AssetEditorRequestsBus::Broadcast(&AzToolsFramework::AssetEditor::AssetEditorRequests::CreateNewAsset, azrtti_typeid()); } - void NodePaletteDockWidget::OnNewFunctionEvent() - { - GeneralRequestBus::Broadcast(&GeneralRequests::CreateNewFunctionAsset); - } - void NodePaletteDockWidget::OnActiveGraphChanged(const GraphCanvas::GraphId& graphCanvasGraphId) { GraphCanvas::SceneNotificationBus::Handler::BusDisconnect(); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.h index b4557af170..a083486742 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.h @@ -89,7 +89,9 @@ namespace ScriptCanvasEditor //// // AssetCatalogEventBus - void OnCatalogAssetChanged(const AZ::Data::AssetId& /*assetId*/) override; + void OnCatalogAssetChanged(const AZ::Data::AssetId&) override; + void OnCatalogAssetAdded(const AZ::Data::AssetId&) override; + void OnCatalogAssetRemoved(const AZ::Data::AssetId&, const AZ::Data::AssetInfo&) override; //// // UpgradeNotifications::Bus @@ -104,30 +106,35 @@ namespace ScriptCanvasEditor // Requests an async load of a given asset of a type void RequestAssetLoad(AZ::Data::AssetId assetId, AZ::Data::AssetType assetType); - // When the asset loading is ready, this allows to use the asset in some meaningful way void OnAssetReady(AZ::Data::Asset asset) override; + void OnAssetReloaded(AZ::Data::Asset asset) override; + + void OnAssetError(AZ::Data::Asset asset) override; + bool HasAssetTreeItem(AZ::Data::AssetId assetId) const; - void CreateFunctionPaletteItem(const AZStd::string& displayName, const AZ::Data::AssetInfo& assetInfo, const AZ::Data::AssetId& sourceId, const AZ::Data::AssetId& runtimeId = {}); + void CreateFunctionPaletteItem(AZ::Data::Asset asset, const AZ::Data::AssetInfo& assetInfo); + + void RequestBuildChildrenFromSubgraphInterface(NodePaletteTreeItem* item, AZ::Data::Asset asset); const NodePaletteModel& m_nodePaletteModel; AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel; GraphCanvas::GraphCanvasTreeCategorizer m_categorizer; - bool m_isFunctionGraphActive; AZ::Data::AssetId m_previousAssetId; AZStd::unordered_map< AZ::Data::AssetId, ScriptEventsPaletteTreeItem* > m_scriptEventElementTreeItems; - AZStd::unordered_set< AZ::Data::AssetId > m_runtimeAssets; - AZStd::unordered_map< AZ::Data::AssetId, FunctionPaletteTreeItem* > m_globalFunctionTreeItems; + AZStd::unordered_map< AZ::Data::AssetId, GraphCanvas::NodePaletteTreeItem*> m_globalFunctionTreeItems; - AZStd::vector< AZStd::pair> m_queuedLoads; + AZStd::queue> m_requestQueue; // RequestAssetLoad uses this set to track assets being asynchronously loaded - AZStd::unordered_set> m_pendingAssets; + AZStd::unordered_map> m_pendingAssets; + + AZStd::unordered_map< AZ::Data::AssetId, AZ::Data::Asset> m_monitoredAssets; AZStd::vector< QMetaObject::Connection > m_lambdaConnections; }; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.cpp index ad3e99b5e3..06bc36283c 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.cpp @@ -40,8 +40,20 @@ #include #include +#include + namespace ScriptCanvasEditor { + + const char* GraphVariablesModel::m_columnNames[static_cast(ColumnIndex::Count)] = + { + "Name", + "Type", + "Default Value", + "Scope", + "Initial Value" + }; + //////////////////////// // GraphVariablesModel //////////////////////// @@ -137,6 +149,16 @@ namespace ScriptCanvasEditor return ScriptCanvas::VariableFlags::GetScopeDisplayLabel(graphVariable->GetScope()); } } + else if (index.column() == ColumnIndex::InitialValueSource) + { + ScriptCanvas::GraphVariable* graphVariable = nullptr; + ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, m_scriptCanvasId, &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, varId.m_identifier); + + if (graphVariable) + { + return graphVariable->GetInitialValueSourceName().data(); + } + } } break; @@ -232,6 +254,16 @@ namespace ScriptCanvasEditor return ScriptCanvas::VariableFlags::GetScopeDisplayLabel(graphVariable->GetScope()); } } + else if (index.column() == ColumnIndex::InitialValueSource) + { + ScriptCanvas::GraphVariable* graphVariable = nullptr; + ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, m_scriptCanvasId, &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, varId.m_identifier); + + if (graphVariable) + { + return graphVariable->GetInitialValueSourceName().data(); + } + } } break; @@ -281,6 +313,19 @@ namespace ScriptCanvasEditor return QVariant(type.c_str()); } } + else if (index.column() == ColumnIndex::InitialValueSource) + { + ScriptCanvas::GraphVariable* graphVariable = nullptr; + ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, m_scriptCanvasId, &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, varId.m_identifier); + + QString tooltipString = QString("The value of this variable can only be set within this graph"); + if (graphVariable->GetInitialValueSource() == ScriptCanvas::VariableFlags::InitialValueSource::Component) + { + tooltipString = QString("The value of this variable can be set set on the component's properties"); + } + + return tooltipString; + } else { AZStd::string variableName; @@ -296,6 +341,7 @@ namespace ScriptCanvasEditor return tooltipString; } + } break; case Qt::DecorationRole: @@ -381,22 +427,17 @@ namespace ScriptCanvasEditor { if (index.column() == ColumnIndex::Scope) { - if (IsFunction()) - { - return QStringList{ - ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::Local), - ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::Input), - ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::Output), - ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::InOut) - }; - } - else - { - return QStringList{ - ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::Local), - ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::Input) - }; - } + return QStringList{ + ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::Graph), + ScriptCanvas::VariableFlags::GetScopeDisplayLabel(ScriptCanvas::VariableFlags::Scope::Function) + }; + } + else if (index.column() == ColumnIndex::InitialValueSource) + { + return QStringList{ + tr(ScriptCanvas::GraphVariable::s_InitialValueSourceNames[0]), + tr(ScriptCanvas::GraphVariable::s_InitialValueSourceNames[1]) + }; } } break; @@ -496,22 +537,25 @@ namespace ScriptCanvasEditor } } else if (index.column() == ColumnIndex::Scope) + { + // Scope is not changed by users + } + else if (index.column() == ColumnIndex::InitialValueSource) { ScriptCanvas::GraphVariable* graphVariable = nullptr; ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, m_scriptCanvasId, &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, varId.m_identifier); if (graphVariable) { - QString exposureValue = value.toString(); + QString comboBoxValue = value.toString(); - if (!exposureValue.isEmpty()) + if (!comboBoxValue.isEmpty()) { - ScriptCanvas::VariableFlags::Scope newScope = ScriptCanvas::VariableFlags::GetScopeFromLabel(exposureValue.toUtf8().data()); - - if (graphVariable->GetScope() != newScope) + if (graphVariable->GetInitialValueSourceName().compare(comboBoxValue.toUtf8().data()) != 0) { modifiedData = true; - graphVariable->SetScope(newScope); + graphVariable->SetInitialValueSourceFromName(comboBoxValue.toUtf8().data()); + AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(&AzToolsFramework::PropertyEditorGUIMessages::RequestRefresh, AzToolsFramework::Refresh_EntireTree); } } } @@ -563,8 +607,11 @@ namespace ScriptCanvasEditor } else if (index.column() == ColumnIndex::Scope) { - // Disabling the editing column temporarily, since the combo box doesn't work. - //itemFlags |= Qt::ItemIsEditable; + itemFlags |= Qt::ItemIsEditable; + } + else if (index.column() == ColumnIndex::InitialValueSource) + { + itemFlags |= Qt::ItemIsEditable; } return itemFlags; @@ -778,6 +825,19 @@ namespace ScriptCanvasEditor } } + void GraphVariablesModel::OnVariableInitialValueSourceChanged() + { + const ScriptCanvas::GraphScopedVariableId* variableId = ScriptCanvas::VariableNotificationBus::GetCurrentBusId(); + + int index = FindRowForVariableId((*variableId).m_identifier); + + if (index >= 0) + { + QModelIndex modelIndex = createIndex(index, ColumnIndex::InitialValueSource, nullptr); + dataChanged(modelIndex, modelIndex); + } + } + void GraphVariablesModel::OnVariablePriorityChanged() { const ScriptCanvas::GraphScopedVariableId* variableId = ScriptCanvas::VariableNotificationBus::GetCurrentBusId(); @@ -793,6 +853,16 @@ namespace ScriptCanvasEditor } } + QVariant GraphVariablesModel::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const + { + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + { + return tr(m_columnNames[section]); + } + + return QAbstractItemModel::headerData(section, orientation, role); + } + ScriptCanvas::VariableId GraphVariablesModel::FindVariableIdForIndex(const QModelIndex& index) const { ScriptCanvas::VariableId variableId; @@ -977,20 +1047,7 @@ namespace ScriptCanvasEditor for (auto variableMapData : copiedVariableData.m_variableMapping) { - AZ::Outcome variableOutcome = requests->CloneVariable(variableMapData.second); - - if (isRuntimeGraph) - { - if (variableOutcome) - { - ScriptCanvas::GraphVariable* variable = requests->FindVariableById(variableOutcome.GetValue()); - - if (variable) - { - variable->RemoveScope(ScriptCanvas::VariableFlags::Scope::Output); - } - } - } + requests->CloneVariable(variableMapData.second); } GeneralRequestBus::Broadcast(&GeneralRequests::PopPreventUndoStateUpdate); @@ -1015,12 +1072,15 @@ namespace ScriptCanvasEditor ApplyPreferenceSort(); setItemDelegateForColumn(GraphVariablesModel::Name, aznew GraphCanvas::IconDecoratedNameDelegate(this)); setItemDelegateForColumn(GraphVariablesModel::Scope, aznew GraphCanvas::GenericComboBoxDelegate(this)); + setItemDelegateForColumn(GraphVariablesModel::InitialValueSource, aznew GraphCanvas::GenericComboBoxDelegate(this)); horizontalHeader()->setStretchLastSection(false); - horizontalHeader()->setSectionResizeMode(GraphVariablesModel::Type, QHeaderView::ResizeMode::Fixed); - horizontalHeader()->setSectionResizeMode(GraphVariablesModel::Name, QHeaderView::ResizeMode::Stretch); - horizontalHeader()->setSectionResizeMode(GraphVariablesModel::DefaultValue, QHeaderView::ResizeMode::Fixed); - horizontalHeader()->setSectionResizeMode(GraphVariablesModel::Scope, QHeaderView::ResizeMode::Fixed); + horizontalHeader()->setSectionResizeMode(GraphVariablesModel::Name, QHeaderView::ResizeMode::ResizeToContents); + horizontalHeader()->setSectionResizeMode(GraphVariablesModel::DefaultValue, QHeaderView::ResizeMode::ResizeToContents); + horizontalHeader()->setSectionResizeMode(GraphVariablesModel::Type, QHeaderView::ResizeMode::Stretch); + horizontalHeader()->setSectionResizeMode(GraphVariablesModel::Scope, QHeaderView::ResizeMode::Stretch); + horizontalHeader()->setSectionResizeMode(GraphVariablesModel::InitialValueSource, QHeaderView::ResizeMode::Stretch); + horizontalHeader()->show(); { QAction* deleteAction = new QAction(this); @@ -1229,16 +1289,18 @@ namespace ScriptCanvasEditor horizontalHeader()->resizeSection(GraphVariablesModel::Type, typeLength); horizontalHeader()->resizeSection(GraphVariablesModel::DefaultValue, defaultValueLength); - - int exposureLength = aznumeric_cast(availableWidth * 0.2f); - int maxExposureLength = 60; - if (exposureLength >= 60) + horizontalHeader()->resizeSection(GraphVariablesModel::Scope, 100); + + int remainingLength = aznumeric_cast(availableWidth * 0.1f); + int maxExposureLength = 80; + + if (remainingLength >= maxExposureLength) { - exposureLength = 60; + remainingLength = maxExposureLength; } - horizontalHeader()->resizeSection(GraphVariablesModel::Scope, exposureLength); + horizontalHeader()->resizeSection(GraphVariablesModel::InitialValueSource, 120); } void GraphVariablesTableView::OnCopySelected() diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h index 2fc12a30d7..cd7a8965fb 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h @@ -45,9 +45,12 @@ namespace ScriptCanvasEditor Type, DefaultValue, Scope, + InitialValueSource, Count }; + static const char* m_columnNames[static_cast(ColumnIndex::Count)]; + enum CustomRole { VarIdRole = Qt::UserRole @@ -84,9 +87,13 @@ namespace ScriptCanvasEditor // ScriptCanvas::VariableRuntimeNotificationBus void OnVariableValueChanged() override; void OnVariableScopeChanged() override; + void OnVariableInitialValueSourceChanged() override; void OnVariablePriorityChanged() override; //// + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + ScriptCanvas::VariableId FindVariableIdForIndex(const QModelIndex& index) const; ScriptCanvas::GraphScopedVariableId FindScopedVariableIdForIndex(const QModelIndex& index) const; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp new file mode 100644 index 0000000000..856a93a2dc --- /dev/null +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp @@ -0,0 +1,233 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace ScriptCanvasEditor +{ + /////////////////////// + // SlotTypeSelectorWidget + /////////////////////// + + SlotTypeSelectorWidget::SlotTypeSelectorWidget(const ScriptCanvas::ScriptCanvasId& scriptCanvasId, QWidget* parent /*= nullptr*/) + : AzQtComponents::StyledDialog(parent) + , m_manipulatingSelection(false) + , ui(new Ui::SlotTypeSelectorWidget()) + , m_scriptCanvasId(scriptCanvasId) + { + ui->setupUi(this); + + ui->searchFilter->setClearButtonEnabled(true); + QObject::connect(ui->searchFilter, &QLineEdit::textChanged, this, &SlotTypeSelectorWidget::OnQuickFilterChanged); + QObject::connect(ui->slotName, &QLineEdit::returnPressed, this, &SlotTypeSelectorWidget::OnReturnPressed); + QObject::connect(ui->slotName, &QLineEdit::textChanged, this, &SlotTypeSelectorWidget::OnNameChanged); + QObject::connect(ui->variablePalette, &QTableView::clicked, this, [this]() { ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); }); + + // Tell the widget to auto create our context menu, for now + setContextMenuPolicy(Qt::ActionsContextMenu); + + ui->searchFilter->setEnabled(true); + + QObject::connect(ui->variablePalette, &VariablePaletteTableView::CreateVariable, this, &SlotTypeSelectorWidget::OnCreateVariable); + + m_filterTimer.setInterval(250); + m_filterTimer.setSingleShot(true); + m_filterTimer.stop(); + + QObject::connect(&m_filterTimer, &QTimer::timeout, this, &SlotTypeSelectorWidget::UpdateFilter); + + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + + } + + SlotTypeSelectorWidget::~SlotTypeSelectorWidget() + { + } + + void SlotTypeSelectorWidget::PopulateVariablePalette(const AZStd::unordered_set< AZ::Uuid >& objectTypes) + { + ui->variablePalette->PopulateVariablePalette(objectTypes); + } + + void SlotTypeSelectorWidget::OnEscape() + { + reject(); + } + + void SlotTypeSelectorWidget::focusOutEvent(QFocusEvent* ) + { + reject(); + } + + const ScriptCanvas::ScriptCanvasId& SlotTypeSelectorWidget::GetActiveScriptCanvasId() const + { + return m_scriptCanvasId; + } + + void SlotTypeSelectorWidget::ShowVariablePalette() + { + ClearFilter(); + + ui->searchFilter->setPlaceholderText("Variable Type..."); + FocusOnSearchFilter(); + + ui->searchFilter->setCompleter(ui->variablePalette->GetVariableCompleter()); + + AzToolsFramework::EditorEvents::Bus::Handler::BusConnect(); + } + + void SlotTypeSelectorWidget::FocusOnSearchFilter() + { + ui->searchFilter->setFocus(Qt::FocusReason::MouseFocusReason); + } + + void SlotTypeSelectorWidget::ClearFilter() + { + { + QSignalBlocker blocker(ui->searchFilter); + ui->searchFilter->setText(""); + } + + UpdateFilter(); + } + + void SlotTypeSelectorWidget::UpdateFilter() + { + ui->variablePalette->SetFilter(ui->searchFilter->userInputText()); + } + + void SlotTypeSelectorWidget::OnReturnPressed() + { + // Set the type to the slot + if (!m_selectedType.IsNull()) + { + m_slotName = ui->slotName->text().toUtf8().data(); + accept(); + } + } + + AZ::Uuid SlotTypeSelectorWidget::GetSelectedType() const + { + return m_selectedType; + } + + AZStd::string SlotTypeSelectorWidget::GetSlotName() const + { + return m_slotName; + } + + void SlotTypeSelectorWidget::SetSlotName(AZStd::string name) + { + m_slotName = name; + ui->slotName->setText(QString(name.c_str())); + } + + void SlotTypeSelectorWidget::OnQuickFilterChanged(const QString& text) + { + if (text.isEmpty()) + { + //If field was cleared, update immediately + UpdateFilter(); + return; + } + m_filterTimer.stop(); + m_filterTimer.start(); + } + + void SlotTypeSelectorWidget::OnNameChanged(const QString& text) + { + bool nameInUse = false; + + const AZStd::unordered_map* properties = nullptr; + ScriptCanvas::GraphVariableManagerRequestBus::EventResult(properties, m_scriptCanvasId, &ScriptCanvas::GraphVariableManagerRequests::GetVariables); + + if (properties) + { + for (const auto& variablePair : (*properties)) + { + AZStd::string testName = text.toUtf8().data(); + if (testName.compare(variablePair.second.GetVariableName()) == 0) + { + nameInUse = true; + break; + } + } + } + + m_slotName = text.toUtf8().data(); + + if (nameInUse) + { + m_slotName.append(" (duplicate)"); + ui->slotName->setText(m_slotName.c_str()); + } + } + + void SlotTypeSelectorWidget::OnContextMenuRequested(const QPoint&) + { + } + + void SlotTypeSelectorWidget::OnCreateVariable(ScriptCanvas::Data::Type varType) + { + m_selectedType = varType.GetAZType(); + } + +#include +} + diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.h new file mode 100644 index 0000000000..97eddcde43 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.h @@ -0,0 +1,131 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#if !defined(Q_MOC_RUN) +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#endif + +class QAction; +class QLineEdit; +class QPushButton; + +namespace Ui +{ + class SlotTypeSelectorWidget; +} + +namespace ScriptCanvasEditor +{ + class SlotTypeSelectorWidget + : public AzQtComponents::StyledDialog + , public AzToolsFramework::EditorEvents::Bus::Handler + { + Q_OBJECT + + public: + AZ_CLASS_ALLOCATOR(SlotTypeSelectorWidget, AZ::SystemAllocator, 0); + + SlotTypeSelectorWidget(const ScriptCanvas::ScriptCanvasId& scriptCanvasId, QWidget* parent = nullptr); + ~SlotTypeSelectorWidget(); + + void PopulateVariablePalette(const AZStd::unordered_set< AZ::Uuid >& objectTypes); + + // AzToolsFramework::EditorEvents::Bus + void OnEscape() override; + //// + + // QWidget + void focusOutEvent(QFocusEvent* focusEvent) override; + //// + + AZ::Uuid GetSelectedType() const; + AZStd::string GetSlotName() const; + void SetSlotName(AZStd::string); + + const ScriptCanvas::ScriptCanvasId& GetActiveScriptCanvasId() const; + + public Q_SLOTS: + void OnCreateVariable(ScriptCanvas::Data::Type varType); + + Q_SIGNALS: + void OnVariableSelectionChanged(const AZStd::vector& variableIds); + + private: + + void ShowVariablePalette(); + + void FocusOnSearchFilter(); + + void ClearFilter(); + void UpdateFilter(); + + void OnReturnPressed(); + void OnQuickFilterChanged(const QString& text); + void OnNameChanged(const QString& text); + + void OnContextMenuRequested(const QPoint& pos); + + //bool event(QEvent* ev) override; + + bool m_manipulatingSelection; + + AZStd::vector< AZStd::unique_ptr > m_propertyHelpers; + + ScriptCanvas::ScriptCanvasId m_scriptCanvasId; + + AZ::EntityId m_graphCanvasGraphId; + + AZ::Uuid m_selectedType; + AZStd::string m_slotName; + + AZStd::unique_ptr ui; + + QTimer m_filterTimer; + }; +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.ui b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.ui new file mode 100644 index 0000000000..0ba609717b --- /dev/null +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.ui @@ -0,0 +1,161 @@ + + + SlotTypeSelectorWidget + + + + 0 + 0 + 278 + 316 + + + + + 0 + 0 + + + + Pick slot name/type + + + false + + + + + 0 + 0 + 278 + 278 + + + + + + + 0 + + + 10 + + + 0 + + + 10 + + + 30 + + + + + + + + Search... + + + + + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + false + + + + + + + Qt::Horizontal + + + + + + + + + Type the name for your slot here... + + + + + + + + + Qt::StrongFocus + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + AzQtComponents::SearchLineEdit + QLineEdit +
AzQtComponents/Components/SearchLineEdit.h
+
+ + ScriptCanvasEditor::VariablePaletteTableView + QTableView +
Editor/View/Widgets/VariablePanel/VariablePaletteTableView.h
+
+
+ + + + buttonBox + accepted() + SlotTypeSelectorWidget + accept() + + + 77 + 294 + + + 7 + 296 + + + + + buttonBox + rejected() + SlotTypeSelectorWidget + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.cpp index 28f3101ebc..6668df21f9 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.cpp @@ -117,7 +117,7 @@ namespace ScriptCanvasEditor { if (variable) { - ScriptCanvas::VariableNotificationBus::Handler::BusDisconnect(); + ScriptCanvas::VariableNotificationBus::Handler::BusDisconnect(); m_variable = variable; m_componentTitle.clear(); @@ -180,6 +180,7 @@ namespace ScriptCanvasEditor { GeneralRequestBus::Broadcast(&GeneralRequests::PostUndoPoint, m_scriptCanvasGraphId); PropertyGridRequestBus::Broadcast(&PropertyGridRequests::RefreshPropertyGrid); + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues); } void VariablePropertiesComponent::OnVariableRenamed(AZStd::string_view variableName) @@ -292,6 +293,8 @@ namespace ScriptCanvasEditor dockWidget->OnDeleteVariables(variableIds); }); + + addAction(getAction); addAction(setAction); addSeparator(); @@ -299,56 +302,6 @@ namespace ScriptCanvasEditor addAction(pasteAction); addAction(duplicateAction); addAction(deleteAction); - addSeparator(); - - // Setup exposure options - ScriptCanvas::GraphScopedVariableId variableId; - variableId.m_scriptCanvasId = scriptCanvasId; - variableId.m_identifier = varId; - ScriptCanvas::GraphVariable* variable = nullptr; - ScriptCanvas::VariableRequestBus::EventResult(variable, variableId, &ScriptCanvas::VariableRequests::GetVariable); - AZ_Assert(variable, "The variable must exist at this point"); - - AZ::Data::AssetType assetType; - AssetTrackerRequestBus::BroadcastResult(assetType, &AssetTrackerRequests::GetAssetType, scriptCanvasId); - - // Exposing variables is only available for Function assets - QMenu* scopeSubMenu = new QMenu(QObject::tr("Scope"), this); - - QActionGroup* actionGroup = new QActionGroup(scopeSubMenu); - actionGroup->setExclusive(true); - - AZStd::vector scopes = { ScriptCanvas::VariableFlags::Scope::Local, ScriptCanvas::VariableFlags::Scope::Input }; - - if (assetType == azrtti_typeid()) - { - scopes.emplace_back(ScriptCanvas::VariableFlags::Scope::Output); - scopes.emplace_back(ScriptCanvas::VariableFlags::Scope::InOut); - } - - for (auto scopeType : scopes) - { - QAction* exposureAction = new QAction(QObject::tr(ScriptCanvas::VariableFlags::GetScopeDisplayLabel(scopeType)), this); - exposureAction->setCheckable(true); - exposureAction->setChecked(variable->GetScope() == scopeType); - exposureAction->setActionGroup(actionGroup); - exposureAction->setToolTip(QObject::tr(ScriptCanvas::VariableFlags::GetScopeToolTip(scopeType))); - - QObject::connect(exposureAction, &QAction::triggered, this, [variableId, scopeType](bool) - { - ScriptCanvas::GraphVariable* variable = nullptr; - ScriptCanvas::VariableRequestBus::EventResult(variable, variableId, &ScriptCanvas::VariableRequests::GetVariable); - - if (variable) - { - variable->SetScope(scopeType); - } - }); - - scopeSubMenu->addAction(exposureAction); - } - - addMenu(scopeSubMenu); } /////////////////////// diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.ui b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.ui index 9957e05cb5..aaf67cb3c2 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.ui +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.ui @@ -79,7 +79,7 @@ QAbstractItemView::SelectRows - false + true false diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp index 5744d6bb3e..e9b8c1785e 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp @@ -142,6 +142,8 @@ #include #include +#include + // Save Format Conversion #include #include @@ -160,6 +162,7 @@ #include #include + namespace ScriptCanvasEditor { using namespace AzToolsFramework; @@ -470,8 +473,6 @@ namespace ScriptCanvasEditor scriptEventAssetFilter->SetAssetGroup(ScriptEvents::ScriptEventsAsset::GetGroup()); scriptEventAssetFilter->SetFilterPropagation(AzToolsFramework::AssetBrowser::AssetBrowserEntryFilter::PropagateDirection::Down); - // Filter doesn't actually work for whatever reason - //m_scriptEventsAssetModel->SetFilter(AzToolsFramework::AssetBrowser::FilterConstType(scriptEventAssetFilter)); m_scriptEventsAssetModel->setSourceModel(assetBrowserModel); } @@ -482,8 +483,6 @@ namespace ScriptCanvasEditor scriptCanvasAssetFilter->SetAssetGroup(ScriptCanvasAsset::Description::GetGroup(azrtti_typeid())); scriptCanvasAssetFilter->SetFilterPropagation(AzToolsFramework::AssetBrowser::AssetBrowserEntryFilter::PropagateDirection::Down); - // Filter doesn't actually work for whatever reason - //m_scriptCanvasAssetModel->SetFilter(AzToolsFramework::AssetBrowser::FilterConstType(scriptCanvasAssetFilter)); m_scriptCanvasAssetModel->setSourceModel(assetBrowserModel); } @@ -537,14 +536,6 @@ namespace ScriptCanvasEditor m_editorToolbar->AddCreationAction(m_createScriptCanvas); RegisterObject(AutomationIds::CreateScriptCanvasButton, m_createScriptCanvas); - m_createFunction = new QToolButton(); - m_createFunction->setIcon(QIcon(ScriptCanvas::AssetDescription::GetIconPath())); - m_createFunction->setToolTip("Creates a new Script Canvas Function Graph"); - - QObject::connect(m_createFunction, &QToolButton::clicked, this, &MainWindow::OnFileNewFunction); - - m_editorToolbar->AddCreationAction(m_createFunction); - RegisterObject(AutomationIds::CreateScriptCanvasFunctionButton, m_createFunction); } { @@ -836,11 +827,6 @@ namespace ScriptCanvasEditor connect(ui->action_New_Script, &QAction::triggered, this, &MainWindow::OnFileNew); ui->action_New_Script->setShortcut(QKeySequence(QKeySequence::New)); - connect(ui->actionFunction, &QAction::triggered, this, &MainWindow::OnFileNewFunction); - //ui->action_New_Function->setShortcut(QKeySequence(QKeySequence::New)); - - connect(ui->actionEditor_Graph, &QAction::triggered, this, &MainWindow::OnFileNewFunction); - connect(ui->action_Open, &QAction::triggered, this, &MainWindow::OnFileOpen); ui->action_Open->setShortcut(QKeySequence(QKeySequence::Open)); @@ -969,7 +955,8 @@ namespace ScriptCanvasEditor } } - UpdateMenuState(enabled); + UpdateMenuState(enabled); + } void MainWindow::UpdateRecentMenu() @@ -1159,6 +1146,44 @@ namespace ScriptCanvasEditor return m_variableDockWidget->IsValidVariableType(dataType); } + bool MainWindow::ShowSlotTypeSelector(ScriptCanvas::Slot* slot, const QPoint& scenePosition, VariablePaletteRequests::SlotSetup& outSetup) + { + AZ_Assert(slot, "A valid slot must be provided"); + if (slot) + { + m_slotTypeSelector = new SlotTypeSelectorWidget(GetActiveScriptCanvasId(), this); // Recreate the widget every time because of https://bugreports.qt.io/browse/QTBUG-76509 + m_slotTypeSelector->PopulateVariablePalette(m_variablePaletteTypes); + + // Only set the slot name if the user has already configured this slot, so if they are creating + // for the first time they will see the placeholder text instead + bool isValidVariableType = false; + VariablePaletteRequestBus::BroadcastResult(isValidVariableType, &VariablePaletteRequests::IsValidVariableType, slot->GetDataType()); + if (isValidVariableType) + { + m_slotTypeSelector->SetSlotName(slot->GetName()); + } + + m_slotTypeSelector->move(scenePosition); + m_slotTypeSelector->setEnabled(true); + m_slotTypeSelector->update(); + + if (m_slotTypeSelector->exec() != QDialog::Rejected) + { + outSetup.m_name = m_slotTypeSelector->GetSlotName(); + outSetup.m_type = m_slotTypeSelector->GetSelectedType(); + } + else + { + return false; + } + + delete m_slotTypeSelector; + } + + return true; + } + + void MainWindow::OpenValidationPanel() { if (!m_validationDockWidget->isVisible()) @@ -1736,11 +1761,6 @@ namespace ScriptCanvasEditor MakeNewFile(); } - void MainWindow::OnFileNewFunction() - { - MakeNewFile(); - } - int MainWindow::InsertTabForAsset(AZStd::string_view assetPath, AZ::Data::AssetId assetId, int tabIndex) { int outTabIndex = -1; @@ -3598,14 +3618,12 @@ namespace ScriptCanvasEditor ui->action_EnableSelection->setEnabled(enabled); ui->action_DisableSelection->setEnabled(enabled); + m_createFunctionOutput->setEnabled(enabled); + m_createFunctionInput->setEnabled(enabled); + // File Menu ui->action_Close->setEnabled(enabled); - bool isFunctionGraph = false; - EditorGraphRequestBus::EventResult(isFunctionGraph, GetActiveScriptCanvasId(), &EditorGraphRequests::IsFunctionGraph); - m_createFunctionInput->setEnabled(isFunctionGraph && enabled); - m_createFunctionOutput->setEnabled(isFunctionGraph && enabled); - RefreshGraphPreferencesAction(); UpdateAssignToSelectionState(); @@ -3715,7 +3733,7 @@ namespace ScriptCanvasEditor void MainWindow::CreateFunctionInput() { PushPreventUndoStateUpdate(); - CreateExecutionNodeling(-1); + CreateFunctionDefinitionNode(-1); PopPreventUndoStateUpdate(); PostUndoPoint(GetActiveScriptCanvasId()); @@ -3724,13 +3742,13 @@ namespace ScriptCanvasEditor void MainWindow::CreateFunctionOutput() { PushPreventUndoStateUpdate(); - CreateExecutionNodeling(1); + CreateFunctionDefinitionNode(1); PopPreventUndoStateUpdate(); PostUndoPoint(GetActiveScriptCanvasId()); } - void MainWindow::CreateExecutionNodeling(int positionOffset) + void MainWindow::CreateFunctionDefinitionNode(int positionOffset) { ScriptCanvas::ScriptCanvasId scriptCanvasId = GetActiveScriptCanvasId(); @@ -3742,14 +3760,9 @@ namespace ScriptCanvasEditor QRectF viewBounds; GraphCanvas::ViewRequestBus::EventResult(viewBounds, viewId, &GraphCanvas::ViewRequests::GetCompleteArea); - AZStd::string rootName = "New Output"; - - if (positionOffset < 0) - { - rootName = "New Input"; - } - - NodeIdPair nodeIdPair = Nodes::CreateExecutionNodeling(scriptCanvasId, rootName); + const bool isInput = positionOffset < 0; + const AZStd::string rootName = isInput ? "New Input" : "New Output"; + NodeIdPair nodeIdPair = Nodes::CreateFunctionDefinitionNode(scriptCanvasId, isInput, rootName); GraphCanvas::SceneRequests* sceneRequests = GraphCanvas::SceneRequestBus::FindFirstHandler(graphCanvasGraphId); @@ -4151,6 +4164,13 @@ namespace ScriptCanvasEditor contextMenu.AddMenuAction(aznew ConvertVariableNodeToReferenceAction(&contextMenu)); } + if (descriptorType == NodeDescriptorType::FunctionDefinitionNode) + { + NodeDescriptorComponent* descriptor = nullptr; + NodeDescriptorRequestBus::EventResult(descriptor, nodeId, &NodeDescriptorRequests::GetDescriptorComponent); + contextMenu.AddMenuAction(aznew RenameFunctionDefinitionNodeAction(descriptor, &contextMenu)); + } + return HandleContextMenu(contextMenu, nodeId, screenPoint, scenePoint); } @@ -4276,6 +4296,7 @@ namespace ScriptCanvasEditor contextMenu.AddMenuAction(aznew ConvertReferenceToVariableNodeAction(&contextMenu)); contextMenu.AddMenuAction(aznew ExposeSlotMenuAction(&contextMenu)); contextMenu.AddMenuAction(aznew CreateAzEventHandlerSlotMenuAction(&contextMenu)); + contextMenu.AddMenuAction(aznew SetDataSlotTypeMenuAction(&contextMenu)); return HandleContextMenu(contextMenu, slotId, screenPoint, scenePoint); } @@ -4870,12 +4891,13 @@ namespace ScriptCanvasEditor m_variableDockWidget->setEnabled(false); m_propertyGrid->DisableGrid(); m_editorToolbar->OnViewDisabled(); - m_createFunction->setEnabled(false); + + m_createFunctionInput->setEnabled(false); + m_createFunctionOutput->setEnabled(false); m_createScriptCanvas->setEnabled(false); UpdateMenuState(false); - ui->action_New_Function->setEnabled(false); ui->action_New_Script->setEnabled(false); m_autoSaveTimer.stop(); @@ -4894,10 +4916,8 @@ namespace ScriptCanvasEditor m_propertyGrid->EnableGrid(); m_editorToolbar->OnViewEnabled(); - m_createFunction->setEnabled(true); m_createScriptCanvas->setEnabled(true); - ui->action_New_Function->setEnabled(true); ui->action_New_Script->setEnabled(true); UpdateMenuState(true); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h index 2f020b71a5..b39c1cc6ac 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h @@ -224,10 +224,12 @@ namespace ScriptCanvasEditor class GraphValidationDockWidget; class MainWindowStatusWidget; class StatisticsDialog; + class SlotTypeSelectorWidget; // Custom Context Menus class SceneContextMenu; class ConnectionContextMenu; + class RenameFunctionDefinitionNodeAction; class MainWindow : public QMainWindow @@ -289,8 +291,8 @@ namespace ScriptCanvasEditor // VariablePaletteRequestBus void RegisterVariableType(const ScriptCanvas::Data::Type& variableType) override; - bool IsValidVariableType(const ScriptCanvas::Data::Type& dataType) const override; + bool ShowSlotTypeSelector(ScriptCanvas::Slot* slot, const QPoint& scenePosition, VariablePaletteRequests::SlotSetup&) override; //// // GraphCanvas::AssetEditorRequestBus @@ -334,7 +336,6 @@ namespace ScriptCanvasEditor // File menu void OnFileNew(); - void OnFileNewFunction(); bool OnFileSave(const Callbacks::OnSave& saveCB); bool OnFileSaveAs(const Callbacks::OnSave& saveCB); @@ -451,7 +452,6 @@ namespace ScriptCanvasEditor void RemoveScriptCanvasAsset(const AZ::Data::AssetId& assetId); void OnChangeActiveGraphTab(AZ::Data::AssetId) override; - void CreateNewFunctionAsset() override { OnFileNewFunction(); } void CreateNewRuntimeAsset() override { OnFileNew(); } GraphCanvas::GraphId GetActiveGraphCanvasGraphId() const override; @@ -614,7 +614,7 @@ namespace ScriptCanvasEditor void CreateFunctionInput(); void CreateFunctionOutput(); - void CreateExecutionNodeling(int positionOffset); + void CreateFunctionDefinitionNode(int positionOffset); int CreateAssetTab(const AZ::Data::AssetId& assetId, int tabIndex = -1); @@ -713,7 +713,6 @@ namespace ScriptCanvasEditor QToolButton* m_createFunctionOutput = nullptr; QToolButton* m_createScriptCanvas = nullptr; - QToolButton* m_createFunction = nullptr; QMenu* m_selectedEntityMenu = nullptr; @@ -728,6 +727,8 @@ namespace ScriptCanvasEditor GraphCanvas::BookmarkDockWidget* m_bookmarkDockWidget = nullptr; GraphCanvas::MiniMapDockWidget* m_minimap = nullptr; LoggingWindow* m_loggingWindow = nullptr; + SlotTypeSelectorWidget* m_slotTypeSelector = nullptr; + AzQtComponents::WindowDecorationWrapper* m_presetWrapper = nullptr; GraphCanvas::ConstructPresetDialog* m_presetEditor = nullptr; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.cpp index 61c5898bec..9fd599d62f 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.cpp @@ -15,12 +15,14 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -54,6 +56,8 @@ #include #include #include +#include + namespace ScriptCanvasEditor { ////////////////////////////// @@ -173,7 +177,7 @@ namespace ScriptCanvasEditor } - ScriptCanvas::Slot* SlotManipulationMenuAction::GetScriptCanvasSlot(const GraphCanvas::Endpoint& endpoint) const + ScriptCanvas::Slot* SlotManipulationMenuAction::GetScriptCanvasSlot(const GraphCanvas::Endpoint& endpoint) { GraphCanvas::GraphId graphId; GraphCanvas::SceneMemberRequestBus::EventResult(graphId, endpoint.GetNodeId(), &GraphCanvas::SceneMemberRequests::GetScene); @@ -467,7 +471,12 @@ namespace ScriptCanvasEditor GraphCanvas::NodeId nodeId; GraphCanvas::SlotRequestBus::EventResult(nodeId, slotId, &GraphCanvas::SlotRequests::GetNode); - NodeIdPair nodePair = ScriptCanvasEditor::Nodes::CreateExecutionNodeling(scriptCanvasGraphId); + // Set the connection type for the node opposite of what it actually is because we're interested in the connection type of the node we're + // exposing, not the type of the slot we just created + ScriptCanvas::ConnectionType scriptCanvasConnectionType = (connectionType == GraphCanvas::CT_Input) ? ScriptCanvas::ConnectionType::Input : ScriptCanvas::ConnectionType::Output; + bool isInput = (scriptCanvasConnectionType == ScriptCanvas::ConnectionType::Output); + + NodeIdPair nodePair = ScriptCanvasEditor::Nodes::CreateFunctionDefinitionNode(scriptCanvasGraphId, isInput); GraphCanvas::SceneRequestBus::Event(graphId, &GraphCanvas::SceneRequests::AddNode, nodePair.m_graphCanvasId, scenePos, false); @@ -490,13 +499,8 @@ namespace ScriptCanvasEditor // Set the node title, subtitle, tooltip GraphCanvas::NodeTitleRequestBus::Event(nodePair.m_graphCanvasId, &GraphCanvas::NodeTitleRequests::SetTitle, fullTitle); - GraphCanvas::NodeTitleRequestBus::Event(nodePair.m_graphCanvasId, &GraphCanvas::NodeTitleRequests::SetSubTitle, "Function"); GraphCanvas::NodeRequestBus::Event(nodePair.m_graphCanvasId, &GraphCanvas::NodeRequests::SetTooltip, name); - // Set the connection type for the node opposite of what it actually is because we're interested in the connection type of the node we're - // exposing, not the type of the slot we just created - ScriptCanvas::ConnectionType scriptCanvasConnectionType = (connectionType == GraphCanvas::CT_Input) ? ScriptCanvas::ConnectionType::Input : ScriptCanvas::ConnectionType::Output; - ScriptCanvas::SlotDescriptor descriptor; descriptor.m_slotType = ScriptCanvas::SlotTypeDescriptor::Execution; descriptor.m_connectionType = scriptCanvasConnectionType; @@ -584,20 +588,7 @@ namespace ScriptCanvasEditor if (variable) { - if (connectionType == GraphCanvas::CT_Input) - { - if (!variable->IsInScope(ScriptCanvas::VariableFlags::Scope::Input)) - { - variable->SetScope(ScriptCanvas::VariableFlags::Scope::Input); - } - } - else if (connectionType == GraphCanvas::CT_Output) - { - if (!variable->IsInScope(ScriptCanvas::VariableFlags::Scope::Output)) - { - variable->SetScope(ScriptCanvas::VariableFlags::Scope::Output); - } - } + variable->SetScope(ScriptCanvas::VariableFlags::Scope::Function); } } } @@ -607,6 +598,100 @@ namespace ScriptCanvasEditor return GraphCanvas::ContextMenuAction::SceneReaction::PostUndo; } + ////////////////////////////////// + // SetDataSlotTypeMenuAction + ////////////////////////////////// + + SetDataSlotTypeMenuAction::SetDataSlotTypeMenuAction(QObject* parent) + : GraphCanvas::SlotContextMenuAction("Set Slot Type", parent) + { + } + + void SetDataSlotTypeMenuAction::RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) + { + ScriptCanvas::Slot* slot = GetSlot(graphId, targetId); + + bool isEnabled = slot && slot->IsUserAdded() && slot->GetDescriptor().IsData(); + + setEnabled(isEnabled); + } + + GraphCanvas::ContextMenuAction::SceneReaction SetDataSlotTypeMenuAction::TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) + { + ScriptCanvas::Slot* slot = GetSlot(graphId, GetTargetId()); + if (!slot) + { + return GraphCanvas::ContextMenuAction::SceneReaction::Nothing; + } + + // Show the selection dialog + bool createSlot = false; + VariablePaletteRequests::SlotSetup selectedSlotSetup; + QPoint scenePoint(scenePos.GetX(), scenePos.GetY()); + VariablePaletteRequestBus::BroadcastResult(createSlot, &VariablePaletteRequests::ShowSlotTypeSelector, slot, scenePoint, selectedSlotSetup); + + bool changed = false; + if (createSlot && !selectedSlotSetup.m_type.IsNull()) + { + if (slot) + { + auto displayType = ScriptCanvas::Data::FromAZType(selectedSlotSetup.m_type); + if (displayType.IsValid()) + { + slot->SetDisplayType(displayType); + changed = true; + } + + if (!selectedSlotSetup.m_name.empty()) + { + slot->Rename(selectedSlotSetup.m_name); + changed = true; + } + } + } + + return changed ? GraphCanvas::ContextMenuAction::SceneReaction::PostUndo : GraphCanvas::ContextMenuAction::SceneReaction::Nothing; + } + + bool SetDataSlotTypeMenuAction::IsSupportedSlotType(const AZ::EntityId& slotId) + { + GraphCanvas::Endpoint endpoint; + GraphCanvas::SlotRequestBus::EventResult(endpoint, slotId, &GraphCanvas::SlotRequests::GetEndpoint); + + const ScriptCanvas::Slot* slot = SlotManipulationMenuAction::GetScriptCanvasSlot(endpoint); + if (slot) + { + if (slot->GetDescriptor().IsData()) + { + return true; + } + } + + return false; + } + + ScriptCanvas::Slot* SetDataSlotTypeMenuAction::GetSlot(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) + { + ScriptCanvas::ScriptCanvasId scriptCanvasGraphId; + GeneralRequestBus::BroadcastResult(scriptCanvasGraphId, &GeneralRequests::GetScriptCanvasId, graphId); + + GraphCanvas::Endpoint endpoint; + GraphCanvas::SlotRequestBus::EventResult(endpoint, targetId, &GraphCanvas::SlotRequests::GetEndpoint); + + ScriptCanvas::Endpoint scEndpoint; + EditorGraphRequestBus::EventResult(scEndpoint, scriptCanvasGraphId, &EditorGraphRequests::ConvertToScriptCanvasEndpoint, endpoint); + + ScriptCanvas::Slot* slot = nullptr; + ScriptCanvas::NodeRequestBus::EventResult(slot, scEndpoint.GetNodeId(), &ScriptCanvas::NodeRequests::GetSlot, scEndpoint.GetSlotId()); + + return slot; + + } + + ////////////////////////////////// + // CreateAzEventHandlerSlotMenuAction + ////////////////////////////////// + CreateAzEventHandlerSlotMenuAction::CreateAzEventHandlerSlotMenuAction(QObject* parent) : SlotContextMenuAction("Create event handler", parent) { @@ -853,6 +938,34 @@ namespace ScriptCanvasEditor // TODO: Filter nodes. } + ////////////////////////// + // RenameFunctionDefinitionNodeAction + ////////////////////////// + + RenameFunctionDefinitionNodeAction::RenameFunctionDefinitionNodeAction(NodeDescriptorComponent* descriptor, QObject* parent) + : NodeContextMenuAction("Rename Function", parent) + , m_descriptor(descriptor) + {} + + void RenameFunctionDefinitionNodeAction::RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& /*targetId*/) + { + AZStd::vector selectedNodes; + GraphCanvas::SceneRequestBus::EventResult(selectedNodes, graphId, &GraphCanvas::SceneRequests::GetSelectedNodes); + + setEnabled(selectedNodes.size() == 1); + } + + GraphCanvas::ContextMenuAction::SceneReaction RenameFunctionDefinitionNodeAction::TriggerAction(const GraphCanvas::GraphId&, const AZ::Vector2&) + { + if (FunctionDefinitionNodeDescriptorComponent::RenameDialog(azrtti_cast(m_descriptor))) + { + return GraphCanvas::ContextMenuAction::SceneReaction::PostUndo; + } + + return GraphCanvas::ContextMenuAction::SceneReaction::Nothing; + } + + #include "Editor/View/Windows/moc_ScriptCanvasContextMenus.cpp" } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h index 992b2e7ccb..e123244964 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h @@ -23,8 +23,10 @@ #include #include #include +#include #include #include +#include #endif namespace ScriptCanvasEditor @@ -112,8 +114,8 @@ namespace ScriptCanvasEditor SlotManipulationMenuAction(AZStd::string_view actionName, QObject* parent); - protected: - ScriptCanvas::Slot* GetScriptCanvasSlot(const GraphCanvas::Endpoint& endpoint) const; + static ScriptCanvas::Slot* GetScriptCanvasSlot(const GraphCanvas::Endpoint& endpoint) ; + }; class ConvertReferenceToVariableNodeAction @@ -153,6 +155,25 @@ namespace ScriptCanvasEditor void CreateNodeling(const GraphCanvas::GraphId& graphId, AZ::EntityId scriptCanvasGraphId, GraphCanvas::GraphId slotId, const AZ::Vector2& scenePos, GraphCanvas::ConnectionType connectionType); }; + class SetDataSlotTypeMenuAction + : public GraphCanvas::SlotContextMenuAction + { + public: + AZ_CLASS_ALLOCATOR(SetDataSlotTypeMenuAction, AZ::SystemAllocator, 0); + + explicit SetDataSlotTypeMenuAction(QObject* parent); + virtual ~SetDataSlotTypeMenuAction() = default; + static bool IsSupportedSlotType(const AZ::EntityId& slotId); + + void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; + + private: + + ScriptCanvas::Slot* GetSlot(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId); + + }; + //! Context Menu Action for Creating an AzEventHandler node from a data slot of a Behavior Method node //! which returns an AZ::Event type class CreateAzEventHandlerSlotMenuAction @@ -172,6 +193,7 @@ namespace ScriptCanvasEditor const AZ::BehaviorMethod* m_methodWithAzEventReturn{}; GraphCanvas::Endpoint m_methodNodeAzEventEndpoint; + }; ///////////////// @@ -222,4 +244,27 @@ namespace ScriptCanvasEditor AZ::EntityId m_connectionId; }; + + ////////////////////////// + // RenameFunctionDefinitionNode + ////////////////////////// + + class NodeDescriptorComponent; + + //! Context menu to rename a node + class RenameFunctionDefinitionNodeAction + : public GraphCanvas::NodeContextMenuAction + { + public: + AZ_CLASS_ALLOCATOR(RenameFunctionDefinitionNodeAction, AZ::SystemAllocator, 0); + + RenameFunctionDefinitionNodeAction(NodeDescriptorComponent* descriptor, QObject* parent); + virtual ~RenameFunctionDefinitionNodeAction() = default; + + void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; + + NodeDescriptorComponent* m_descriptor; + }; + } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui b/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui index 968669b279..40ba00bb31 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui @@ -57,7 +57,6 @@ &File - @@ -180,11 +179,6 @@ &New Script - - - &Function - - &Editor Graph @@ -781,11 +775,6 @@ Editor Graph - - - New Function - - diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.cpp index 5c3b8d0807..f6cc6cea5d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.cpp @@ -71,6 +71,30 @@ namespace ScriptCanvas ->Field("requiredScriptEvents", &RuntimeData::m_requiredScriptEvents) ; } + + if (auto behaviorContext = azrtti_cast(reflectContext)) + { + behaviorContext->Class() + ->Method("GetRequiredAssets", [](const RuntimeData& data) { return data.m_requiredAssets; }) + ; + } + } + + bool RuntimeData::RequiresDependencyConstructionParameters() const + { + return AZStd::any_of(m_requiredAssets.begin(), m_requiredAssets.end(), [](const AZ::Data::Asset& asset) + { + return RequiresDependencyConstructionParametersRecurse(asset.Get()->m_runtimeData); + }); + } + + bool RuntimeData::RequiresDependencyConstructionParametersRecurse(const RuntimeData& data) + { + return data.m_input.GetConstructorParameterCount() != 0 + || AZStd::any_of(data.m_requiredAssets.begin(), data.m_requiredAssets.end(), [](const AZ::Data::Asset& asset) + { + return RequiresDependencyConstructionParametersRecurse(asset.Get()->m_runtimeData); + }); } bool RuntimeData::RequiresStaticInitialization() const @@ -78,6 +102,7 @@ namespace ScriptCanvas return !m_cloneSources.empty(); } + //////////////////////// // SubgraphInterfaceData //////////////////////// @@ -88,8 +113,7 @@ namespace ScriptCanvas { serializeContext->Class() ->Version(static_cast(ScriptCanvasRuntimeAssetCpp::FunctionRuntimeDataVersion::Current)) - ->Field("m_name", &SubgraphInterfaceData::m_name) - ->Field("m_version", &SubgraphInterfaceData::m_version) + ->Field("name", &SubgraphInterfaceData::m_name) ->Field("interface", &SubgraphInterfaceData::m_interface) ; } @@ -105,7 +129,6 @@ namespace ScriptCanvas if (this != &other) { m_name = AZStd::move(other.m_name); - m_version = AZStd::move(other.m_version); m_interface = AZStd::move(other.m_interface); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.h index f77a2c11a0..0bc0daecde 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAsset.h @@ -79,6 +79,12 @@ namespace ScriptCanvas Execution::ActivationInputRange m_activationInputRange; bool RequiresStaticInitialization() const; + + bool RequiresDependencyConstructionParameters() const; + + private: + + bool static RequiresDependencyConstructionParametersRecurse(const RuntimeData& data); }; class RuntimeAssetBase @@ -129,7 +135,6 @@ namespace ScriptCanvas }; - class RuntimeAsset : public RuntimeAssetTyped { public: @@ -146,24 +151,24 @@ namespace ScriptCanvas class SubgraphInterfaceAsset; - class RuntimeFunctionAssetDescription : public AssetDescription + class SubgraphInterfaceAssetDescription : public AssetDescription { public: - AZ_TYPE_INFO(RuntimeFunctionAssetDescription, "{7F7BE1A5-9447-41C2-9190-18580075094C}"); + AZ_TYPE_INFO(SubgraphInterfaceAssetDescription, "{7F7BE1A5-9447-41C2-9190-18580075094C}"); - RuntimeFunctionAssetDescription() + SubgraphInterfaceAssetDescription() : AssetDescription( azrtti_typeid(), - "Script Canvas Runtime Function", - "Script Canvas Runtime Function Graph", + "Script Canvas Function Interface", + "Script Canvas Function Interface", "@devassets@/scriptcanvas", ".scriptcanvas_fn_compiled", - "Script Canvas Runtime Function", + "Script Canvas Function Interface", "Untitled-Function-%i", - "Script Canvas Compiled Function Files (*.scriptcanvas_fn_compiled)", - "Script Canvas Runtime Function", - "Script Canvas Runtime Function", + "Script Canvas Compiled Function Interfaces (*.scriptcanvas_fn_compiled)", + "Script Canvas Function Interface", + "Script Canvas Function Interface", "Editor/Icons/ScriptCanvas/Viewport/ScriptCanvas_Function.png", AZ::Color(1.0f,0.0f,0.0f,1.0f), false @@ -184,7 +189,6 @@ namespace ScriptCanvas static void Reflect(AZ::ReflectContext* reflectContext); - size_t m_version; AZStd::string m_name; Grammar::SubgraphInterface m_interface; }; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAssetHandler.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAssetHandler.cpp index 152359c6f5..2106c26db5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAssetHandler.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/RuntimeAssetHandler.cpp @@ -97,7 +97,7 @@ namespace ScriptCanvas { RuntimeAsset* runtimeAsset = asset.GetAs(); AZ_Assert(runtimeAsset, "RuntimeAssetHandler::InitAsset This should be a Script Canvas runtime asset, as this is the only type this handler processes!"); - Execution::Context::IntializeAssetData(runtimeAsset->GetData()); + Execution::Context::InitializeActivationData(runtimeAsset->GetData()); Execution::InitializeInterpretedStatics(runtimeAsset->GetData()); } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja new file mode 100644 index 0000000000..e5c982cd2e --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja @@ -0,0 +1,170 @@ +{# +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#} + +{% import 'ScriptCanvas_Macros.jinja' as macros %} + +#pragma once + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// This code was produced with AzAutoGen, any modifications made will not be preserved. +// If you need to modify this code see: +// +// Gems\ScriptCanvas\Code\Include\ScriptCanvas\AutoGen\ScriptCanvasNode_Header.jinja +// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +{% for xml in dataFiles %} +{% for Class in xml.iter('Class') %} + +{# Any user-provided includes #} +{% for Include in Class.iter('Include') %} +#include <{{ Include.attrib['File'] }}> +{% endfor %} + +{# Class Attributes #} +{# ----------------------------------------------------------------------------------------- #} + +{% set attribute_Namespace = undefined %} +{%- if Class.attrib['Namespace'] is defined %} +{% if Class.attrib['Namespace'] != "None" %} +{% set attribute_Namespace = Class.attrib['Namespace'] %} +{% endif %} +{% endif %} + +{% if attribute_Namespace is defined %} +namespace {{attribute_Namespace}} +{ +{% endif %} + +{% set className = Class.attrib['Name'] %} +{% set baseClass = Class.attrib['Base'] %} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// +//// {{ className }} +//// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +{% set classUuid = Class.attrib['Uuid'] %} +{% if classUuid is not defined %} +{% set classUuid = className|createHashGuid %} +{% endif %} + +{% set deprecationUuid = Class.attrib['DeprecationUUID'] %} + +// The following will be injected directly into the source header file for which AzCodeGenerator is being run. +// You must #include the generated header into the source header +#define SCRIPTCANVAS_NODE_{{ className }} \ +public: \ + AZ_COMPONENT({{ className }}, "{{ classUuid }}"{% if baseClass is defined %}, {{ baseClass }}{% endif %}); \ + static void Reflect(AZ::ReflectContext* reflection); \ + void ConfigureSlots() override; \ + bool RequiresDynamicSlotOrdering() const override; \ + bool IsDeprecated() const override; \ +{% if deprecationUuid is defined %}NodeConfiguration GetReplacementNodeConfiguration() const override; \ {% endif %} + using Node::FindDatum; \ +{% if Class.attrib['GraphEntryPoint'] is defined %} bool IsEntryPoint() const override { return {%if Class.attrib['GraphEntryPoint'] == True %}true{%else%}false{%endif%}; } \ +{% endif %} +public: \ + friend struct ::{{ className | replace(' ','') }}Property; + +// Helpers for easily accessing properties and slots +struct {{ className | replace(' ','') }}Property +{ +{% for Property in Class.iter('Out') %} +{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} + + static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) + { + return owner->GetSlotId("{{ Property.attrib['Name'] }}"); + } + + static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) + { + return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); + } + +{% endfor %} +{% for Property in Class.iter('OutLatent') %} +{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} + + static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) + { + return owner->GetSlotId("{{ Property.attrib['Name'] }}"); + } + + static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) + { + return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); + } + +{% endfor %} +{% for Property in Class.iter('In') %} +{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} + + static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) + { + return owner->GetSlotId("{{ Property.attrib['Name'] }}"); + } + + static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) + { + return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); + } + +{% endfor %} +{% for Property in Class.iter('Property') %} +{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} + + static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) + { + return owner->GetSlotId("{{ Property.attrib['Name'] }}"); + } + + static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) + { + return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); + } + + static {{ Property.attrib['Type'] }} Get{{ Property.attrib['Name'] | replace(' ','') }}(ScriptCanvas::Node* owner); + +{% endfor %} +{% for Property in Class.iter('DynamicDataSlot') %} +{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} + + static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] }}SlotId(const ScriptCanvas::Node* owner) + { + return owner->GetSlotId("{{ Property.attrib['Name'] }}"); + } + + static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] }}Slot(const ScriptCanvas::Node* owner) + { + return owner->GetSlot(Get{{ Property.attrib['Name'] }}SlotId(owner)); + } + +{% endfor %} +}; + +{% if attribute_Namespace is defined %} +} +{% endif %} + +{{ macros.ReportErrors() }} + + +{% endfor %} +{% endfor %} \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Source.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Source.jinja new file mode 100644 index 0000000000..32ba09e017 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Source.jinja @@ -0,0 +1,276 @@ +{# +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#} +{% macro add_attribute(attribute, tags) %} +{% set value = tags[attribute] %} +{% if value is defined %} +->Attribute(AZ::Edit::Attributes::{{ attribute }}, {{ value }}) +{% endif %} +{% endmacro %} +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +{% for xml in dataFiles %} +#include "{{ xml.attrib['Include'] }}" + +{% for Class in xml.iter('Class') %} +void {{ Class.attrib['QualifiedName'] }}::ConfigureSlots() +{ +{% if Class.attrib['Base'] is defined %} + {{ Class.attrib['Base'] }}::ConfigureSlots(); + +{% endif %} +{% for Property in Class.iter('Property') %} + {% if Property.attrib['IsInput'] | booleanTrue %} + // {{ Property.attrib['Name'] }} + { + {% if Property.attrib['Overloaded'] is defined %} + ScriptCanvas::DynamicDataSlotConfiguration slotConfiguration; + slotConfiguration.m_dynamicDataType = ScriptCanvas::DynamicDataType::Any; + {% else %} + ScriptCanvas::DataSlotConfiguration slotConfiguration; + slotConfiguration.SetAZType<{{ Property.attrib['Type'] }}>(); + {% if Property.attrib['DefaultValue'] is defined %} + slotConfiguration.SetDefaultValue({{ Property.attrib['Type'] }}({{ Property.attrib['DefaultValue'] }})); + {% endif %} + {% endif %} + slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; + slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; + {% if Property.attrib['DisplayGroup'] is defined %} + slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; + {% endif %} + {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} + {% for slotContract in slotContracts %} + slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); + {% endfor %} + slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input); + AddSlot(slotConfiguration); + } + {% endif %} + {% if Property.attrib['IsOutput'] | booleanTrue %} + // {{ Property.attrib['Name'] }} + { + ScriptCanvas::DataSlotConfiguration slotConfiguration; + slotConfiguration.SetAZType<{{ Property.attrib['Type'] }}>(); + slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; + slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; + slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output); + {% if Property.attrib['DisplayGroup'] is defined %} + slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; + {% endif %} + {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} + {% for slotContract in slotContracts %} + slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); + {% endfor %} + AddSlot(slotConfiguration); + } + {% endif %} +{% endfor %} +{% for Property in Class.iter('In') %} + // {{ Property.attrib['Name'] }} + { + ScriptCanvas::ExecutionSlotConfiguration slotConfiguration; + slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; + slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; + {% if Property.attrib['DisplayGroup'] is defined %} + slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; + {% endif %} + {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} + {% for slotContract in slotContracts %} + slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); + {% endfor %} + slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input); + AddSlot(slotConfiguration); + } +{% endfor %} +{% for Property in Class.iter('Out') %} + // {{ Property.attrib['Name'] }} + { + ScriptCanvas::ExecutionSlotConfiguration slotConfiguration; + slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; + slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; + {% if Property.attrib['DisplayGroup'] is defined %} + slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; + {% endif %} + {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} + {% for slotContract in slotContracts %} + slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); + {% endfor %} + slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output); + AddSlot(slotConfiguration); + } +{% endfor %} +{% for Property in Class.iter('OutLatent') %} + // {{ Property.attrib['Name'] }} + { + ScriptCanvas::ExecutionSlotConfiguration slotConfiguration; + slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; + slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; + {% if Property.attrib['DisplayGroup'] is defined %} + slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; + {% endif %} + {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} + {% for slotContract in slotContracts %} + slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); + {% endfor %} + slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output); + slotConfiguration.m_isLatent = true; + AddSlot(slotConfiguration); + } +{% endfor %} +{% for Property in Class.iter('DynamicDataSlot') %} + // {{ Property.attrib['Name'] }} + { + ScriptCanvas::DynamicDataSlotConfiguration slotConfiguration; + slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; + slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; + {% if Property.attrib['DisplayGroup'] is defined %} + slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; + {% endif %} + slotConfiguration.SetConnectionType({{ Property.attrib['ConnectionType'] }}); + slotConfiguration.m_dynamicDataType = {{ Property.attrib['DynamicType'] }}; + {% if Property.attrib['DynamicGroup'] is defined %} + slotConfiguration.m_dynamicGroup = AZ::Crc32("{{ Property.attrib['DynamicGroup'] }}"); + {% endif %} + {% if Property.attrib['RestrictedTypes'] is defined %} + {% set typeContractList = Property.attrib['RestrictedTypes'].split(';') | join("(), ") %} + // Restricted Type Contract + slotConfiguration.m_contractDescs = AZStd::vector{ { []() { return aznew ScriptCanvas::RestrictedTypeContract({ {{ typeContractList }}() }); } } }; + {% endif %} + {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} + {% for slotContract in slotContracts %} + slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); + {% endfor %} + AddSlot(slotConfiguration); + } +{% endfor %} +} + + +bool {{ Class.attrib['QualifiedName'] }}::RequiresDynamicSlotOrdering() const +{ + return {% if Class.attrib['DynamicSlotOrdering'] is defined and Class.attrib['DynamicSlotOrdering'] == "true" %}true{% else %}false{% endif %}; +} + + +bool {{ Class.attrib['QualifiedName'] }}::IsDeprecated() const +{ + return {% if Class.attrib['Deprecated'] is defined %}true{% else %}false{% endif %}; +} + +{% set deprecationUuid = Class.attrib['DeprecationUUID'] %} +{% if deprecationUuid is defined %} +NodeConfiguration {{ Class.attrib['QualifiedName'] }}::GetReplacementNodeConfiguration() const +{ + ScriptCanvas::NodeConfiguration nodeConfig{}; + nodeConfig.m_type = AZ::Uuid({{ deprecationUuid }}); + {% if Class.attrib['ReplacementMethodName'] is defined %} + nodeConfig.m_methodName = "{{Class.attrib['ReplacementMethodName']}}"; + {% endif %} + return nodeConfig; +} +{% endif %} + +void {{ Class.attrib['QualifiedName'] }}::Reflect(AZ::ReflectContext* context) +{ +{% if Class.attrib['DependentReflections'] is defined %} +{% for dependentClass in Class.attrib['DependentReflections'].split(';') %} + {{ dependentClass }}::Reflect(context); +{% endfor %} + +{% endif %} +{% if Class.attrib['Base'] is defined %} + static_assert((std::is_base_of::value), "Script Canvas nodes require the first base class to be derived from ScriptCanvas::Node"); + +{% endif %} + if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class<{{ Class.attrib['QualifiedName'] }}{% if Class.attrib['Base'] is defined %}, {{ Class.attrib['Base'] }}{% endif %}>() +{% if Class.attrib['EventHandler'] is defined %} + ->EventHandler<{{ Class.attrib['EventHandler'] }}>() +{% endif %} +{% if Class.attrib['Version'] is defined %} + ->Version({{ Class.attrib['Version'] }}{% if Class.attrib['VersionConverter'] is defined %}, &{{ Class.attrib['VersionConverter'] }}{% endif %}) +{% endif %} +{% for Property in Class.iter('SerializedProperty') %} + ->Field("{{ Property.attrib['Name'] }}", &{{ Class.attrib['Name'] }}::{{ Property.attrib['Name'] | replace(' ','') }}) +{% endfor %} + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class<{{ Class.attrib['QualifiedName'] }}>("{{ Class.attrib['PreferredClassName'] }}", "{{ Class.attrib['Description'] }}") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) +{% if Class.attrib['Category'] is defined %} + ->Attribute(AZ::Edit::Attributes::Category, "{{ Class.attrib['Category'] }}") +{% endif %} + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) +{% if Class.attrib['Icon'] is defined %} + ->Attribute(AZ::Edit::Attributes::Icon, "{{ Class.attrib['Icon'] }}") +{% endif %} +{% if Class.attrib['Deprecated'] is defined %} + ->Attribute(ScriptCanvas::Attributes::Node::TitlePaletteOverride, "DeprecatedNodeTitlePalette") + ->Attribute(AZ::Script::Attributes::Deprecated, true) +{% else %} +{% if Class.attrib['EditAttributes'] is defined %} +{% for editAttributePair in Class.attrib['EditAttributes'].split(';') %} +{% set editAttributeKey, editAttributeValue = editAttributePair.split('@') %} +{% if editAttributeKey == "AZ::Script::Attributes::ExcludeFrom" %} + ->Attribute({{ editAttributeKey }}, {{ editAttributeValue }}) +{% else %} + ->Attribute({{ editAttributeKey }}, "{{ editAttributeValue }}") +{% endif %} +{% endfor %} +{% endif %} +{% for Property in Class.iter('EditProperty') %} +{% if Property.attrib['SerializeProperty'] is defined %} + ->DataElement({{ Property.attrib['UiHandler'] }}, &{{ Class.attrib['Name'] }}::{{ Property.attrib['SerializeProperty'] }}, "{{ Property.attrib['SerializeProperty'] }}", "") +{% else %} + ->DataElement({{ Property.attrib['UiHandler'] }}, &{{ Class.attrib['Name'] }}::{{ Property.attrib['FieldName'] }}, "{{ Property.attrib['Name'] | replace(' ','') }}", {% if Property.attrib['Description'] is defined %}"{{ Property.attrib['Description'] }}" {% else %}""{% endif %}) +{% endif %} +{% for EditAttribute in Property.iter('EditAttribute') %} + ->Attribute({{ EditAttribute.attrib['Key'] }}, {{ EditAttribute.attrib['Value'] }}) +{% endfor %} +{% endfor %} +{% endif %} + ; + } + } +} + + +{# Property Getters #} +{% for Property in Class.iter('Property') %} +{{ Property.attrib['Type'] }} {{ Class.attrib['Name'] }}Property::Get{{ Property.attrib['Name'] | replace(' ','') }}(ScriptCanvas::Node* owner) +{ + ScriptCanvas::SlotId slotId = Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner); + const ScriptCanvas::Datum* datum = owner->FindDatum(slotId); + if (!datum) + { + AZ_Error("Script Canvas", false, "Cannot find generated code gen slot with name {{ Property.attrib['Name'] | replace(' ','') }}. Has the ScriptCanvas_Property::Name changed without writing a version converter"); + } + const {{ Property.attrib['Type'] }}* datumValue = datum ? datum->GetAs<{{ Property.attrib['Type'] }}>() : nullptr; + return datumValue ? *datumValue : {{ Property.attrib['Type'] }}(); +} + + +{% endfor %} +{% endfor %} +{% endfor %} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja deleted file mode 100644 index 0ba503965f..0000000000 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja +++ /dev/null @@ -1,122 +0,0 @@ -{# -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -#} -#pragma once - -#include -#include - -{% for xml in dataFiles %} -{% for Class in xml.iter('Class') %} -{% for Include in Class.iter('Include') %} -#include <{{ Include.attrib['File'] }}> -{% endfor %} -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -//// -//// {{ Class.attrib['Name'] }} -//// -///////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// The following will be injected directly into the source header file for which AzCodeGenerator is being run. -// You must #include the generated header into the source header -#define SCRIPTCANVAS_NODE_{{ Class.attrib['Name'] }} \ -public: \ - AZ_COMPONENT({{ Class.attrib['Name'] }}, "{{ Class.attrib['Uuid'] }}"{% if Class.attrib['Base'] is defined %}, {{ Class.attrib['Base'] }}{% endif %}); \ - static void Reflect(AZ::ReflectContext* reflection); \ - void ConfigureSlots() override; \ - bool RequiresDynamicSlotOrdering() const override; \ - bool IsDeprecated() const override; \ - using Node::FindDatum; \ -{% if Class.attrib['GraphEntryPoint'] is defined %} bool IsEntryPoint() const override { return true; } \ -{% endif %} -public: \ - friend struct ::{{ Class.attrib['Name'] | replace(' ','') }}Property; - -// Helpers for easily accessing properties and slots -struct {{ Class.attrib['Name'] | replace(' ','') }}Property -{ -{% for Property in Class.iter('Out') %} -{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} - - static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) - { - return owner->GetSlotId("{{ Property.attrib['Name'] }}"); - } - - static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) - { - return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); - } - -{% endfor %} -{% for Property in Class.iter('OutLatent') %} -{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} - - static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) - { - return owner->GetSlotId("{{ Property.attrib['Name'] }}"); - } - - static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) - { - return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); - } - -{% endfor %} -{% for Property in Class.iter('In') %} -{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} - - static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) - { - return owner->GetSlotId("{{ Property.attrib['Name'] }}"); - } - - static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) - { - return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); - } - -{% endfor %} -{% for Property in Class.iter('Property') %} -{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} - - static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(const ScriptCanvas::Node* owner) - { - return owner->GetSlotId("{{ Property.attrib['Name'] }}"); - } - - static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] | replace(' ','') }}Slot(const ScriptCanvas::Node* owner) - { - return owner->GetSlot(Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner)); - } - - static {{ Property.attrib['Type'] }} Get{{ Property.attrib['Name'] | replace(' ','') }}(ScriptCanvas::Node* owner); - -{% endfor %} -{% for Property in Class.iter('DynamicDataSlot') %} -{% if Property.attrib['Description'] is defined %} // {{ Property.attrib['Description'] }}{% endif %} - - static ScriptCanvas::SlotId Get{{ Property.attrib['Name'] }}SlotId(const ScriptCanvas::Node* owner) - { - return owner->GetSlotId("{{ Property.attrib['Name'] }}"); - } - - static ScriptCanvas::Slot* Get{{ Property.attrib['Name'] }}Slot(const ScriptCanvas::Node* owner) - { - return owner->GetSlot(Get{{ Property.attrib['Name'] }}SlotId(owner)); - } - -{% endfor %} -}; - -{% endfor %} -{% endfor %} \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja deleted file mode 100644 index 16f7cff54d..0000000000 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja +++ /dev/null @@ -1,264 +0,0 @@ -{# -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -#} -{% macro add_attribute(attribute, tags) %} -{% set value = tags[attribute] %} -{% if value is defined %} -->Attribute(AZ::Edit::Attributes::{{ attribute }}, {{ value }}) -{% endif %} -{% endmacro %} -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -{% for xml in dataFiles %} -#include "{{ xml.attrib['Include'] }}" - -{% for Class in xml.iter('Class') %} -void {{ Class.attrib['QualifiedName'] }}::ConfigureSlots() -{ -{% if Class.attrib['Base'] is defined %} - {{ Class.attrib['Base'] }}::ConfigureSlots(); - -{% endif %} -{% for Property in Class.iter('Property') %} - {% if Property.attrib['IsInput'] | booleanTrue %} - // {{ Property.attrib['Name'] }} - { - {% if Property.attrib['Overloaded'] is defined %} - ScriptCanvas::DynamicDataSlotConfiguration slotConfiguration; - slotConfiguration.m_dynamicDataType = ScriptCanvas::DynamicDataType::Any; - {% else %} - ScriptCanvas::DataSlotConfiguration slotConfiguration; - slotConfiguration.SetAZType<{{ Property.attrib['Type'] }}>(); - {% if Property.attrib['DefaultValue'] is defined %} - slotConfiguration.SetDefaultValue({{ Property.attrib['Type'] }}({{ Property.attrib['DefaultValue'] }})); - {% endif %} - {% endif %} - slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; - slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; - {% if Property.attrib['DisplayGroup'] is defined %} - slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; - {% endif %} - {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} - {% for slotContract in slotContracts %} - slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); - {% endfor %} - slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input); - AddSlot(slotConfiguration); - } - {% endif %} - {% if Property.attrib['IsOutput'] | booleanTrue %} - // {{ Property.attrib['Name'] }} - { - ScriptCanvas::DataSlotConfiguration slotConfiguration; - slotConfiguration.SetAZType<{{ Property.attrib['Type'] }}>(); - slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; - slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; - slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output); - {% if Property.attrib['DisplayGroup'] is defined %} - slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; - {% endif %} - {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} - {% for slotContract in slotContracts %} - slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); - {% endfor %} - AddSlot(slotConfiguration); - } - {% endif %} -{% endfor %} -{% for Property in Class.iter('In') %} - // {{ Property.attrib['Name'] }} - { - ScriptCanvas::ExecutionSlotConfiguration slotConfiguration; - slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; - slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; - {% if Property.attrib['DisplayGroup'] is defined %} - slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; - {% endif %} - {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} - {% for slotContract in slotContracts %} - slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); - {% endfor %} - slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input); - AddSlot(slotConfiguration); - } -{% endfor %} -{% for Property in Class.iter('Out') %} - // {{ Property.attrib['Name'] }} - { - ScriptCanvas::ExecutionSlotConfiguration slotConfiguration; - slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; - slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; - {% if Property.attrib['DisplayGroup'] is defined %} - slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; - {% endif %} - {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} - {% for slotContract in slotContracts %} - slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); - {% endfor %} - slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output); - AddSlot(slotConfiguration); - } -{% endfor %} -{% for Property in Class.iter('OutLatent') %} - // {{ Property.attrib['Name'] }} - { - ScriptCanvas::ExecutionSlotConfiguration slotConfiguration; - slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; - slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; - {% if Property.attrib['DisplayGroup'] is defined %} - slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; - {% endif %} - {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} - {% for slotContract in slotContracts %} - slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); - {% endfor %} - slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output); - slotConfiguration.m_isLatent = true; - AddSlot(slotConfiguration); - } -{% endfor %} -{% for Property in Class.iter('DynamicDataSlot') %} - // {{ Property.attrib['Name'] }} - { - ScriptCanvas::DynamicDataSlotConfiguration slotConfiguration; - slotConfiguration.m_name = "{{ Property.attrib['Name'] }}"; - slotConfiguration.m_toolTip = "{{ Property.attrib['Description'] }}"; - {% if Property.attrib['DisplayGroup'] is defined %} - slotConfiguration.m_displayGroup = "{{ Property.attrib['DisplayGroup'] }}"; - {% endif %} - slotConfiguration.SetConnectionType({{ Property.attrib['ConnectionType'] }}); - slotConfiguration.m_dynamicDataType = {{ Property.attrib['DynamicType'] }}; - {% if Property.attrib['DynamicGroup'] is defined %} - slotConfiguration.m_dynamicGroup = AZ::Crc32("{{ Property.attrib['DynamicGroup'] }}"); - {% endif %} - {% if Property.attrib['RestrictedTypes'] is defined %} - {% set typeContractList = Property.attrib['RestrictedTypes'].split(';') | join("(), ") %} - // Restricted Type Contract - slotConfiguration.m_contractDescs = AZStd::vector{ { []() { return aznew ScriptCanvas::RestrictedTypeContract({ {{ typeContractList }}() }); } } }; - {% endif %} - {% set slotContracts = Property.attrib['Contracts'].split(';') if Property.attrib['Contracts'] is string else Property.attrib['Contracts']|default([]) %} - {% for slotContract in slotContracts %} - slotConfiguration.m_contractDescs.emplace_back([]() { return aznew {{ slotContract|e }}; }); - {% endfor %} - AddSlot(slotConfiguration); - } -{% endfor %} -} - - -bool {{ Class.attrib['QualifiedName'] }}::RequiresDynamicSlotOrdering() const -{ - return {% if Class.attrib['DynamicSlotOrdering'] is defined and Class.attrib['DynamicSlotOrdering'] == "true" %}true{% else %}false{% endif %}; -} - - -bool {{ Class.attrib['QualifiedName'] }}::IsDeprecated() const -{ - return {% if Class.attrib['Deprecated'] is defined %}true{% else %}false{% endif %}; -} - - -void {{ Class.attrib['QualifiedName'] }}::Reflect(AZ::ReflectContext* context) -{ -{% if Class.attrib['DependentReflections'] is defined %} -{% for dependentClass in Class.attrib['DependentReflections'].split(';') %} - {{ dependentClass }}::Reflect(context); -{% endfor %} - -{% endif %} -{% if Class.attrib['Base'] is defined %} - static_assert((std::is_base_of::value), "Script Canvas nodes require the first base class to be derived from ScriptCanvas::Node"); - -{% endif %} - if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) - { - serializeContext->Class<{{ Class.attrib['QualifiedName'] }}{% if Class.attrib['Base'] is defined %}, {{ Class.attrib['Base'] }}{% endif %}>() -{% if Class.attrib['EventHandler'] is defined %} - ->EventHandler<{{ Class.attrib['EventHandler'] }}>() -{% endif %} -{% if Class.attrib['Version'] is defined %} - ->Version({{ Class.attrib['Version'] }}{% if Class.attrib['VersionConverter'] is defined %}, &{{ Class.attrib['VersionConverter'] }}{% endif %}) -{% endif %} -{% for Property in Class.iter('SerializedProperty') %} - ->Field("{{ Property.attrib['Name'] }}", &{{ Class.attrib['Name'] }}::{{ Property.attrib['Name'] | replace(' ','') }}) -{% endfor %} - ; - - if (AZ::EditContext* editContext = serializeContext->GetEditContext()) - { - editContext->Class<{{ Class.attrib['QualifiedName'] }}>("{{ Class.attrib['PreferredClassName'] }}", "{{ Class.attrib['Description'] }}") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) -{% if Class.attrib['Category'] is defined %} - ->Attribute(AZ::Edit::Attributes::Category, "{{ Class.attrib['Category'] }}") -{% endif %} - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) -{% if Class.attrib['Icon'] is defined %} - ->Attribute(AZ::Edit::Attributes::Icon, "{{ Class.attrib['Icon'] }}") -{% endif %} -{% if Class.attrib['Deprecated'] is defined %} - ->Attribute(ScriptCanvas::Attributes::Node::TitlePaletteOverride, "DeprecatedNodeTitlePalette") - ->Attribute(AZ::Script::Attributes::Deprecated, true) -{% else %} -{% if Class.attrib['EditAttributes'] is defined %} -{% for editAttributePair in Class.attrib['EditAttributes'].split(';') %} -{% set editAttributeKey, editAttributeValue = editAttributePair.split('@') %} -{% if editAttributeKey == "AZ::Script::Attributes::ExcludeFrom" %} - ->Attribute({{ editAttributeKey }}, {{ editAttributeValue }}) -{% else %} - ->Attribute({{ editAttributeKey }}, "{{ editAttributeValue }}") -{% endif %} -{% endfor %} -{% endif %} -{% for Property in Class.iter('EditProperty') %} -{% if Property.attrib['SerializeProperty'] is defined %} - ->DataElement({{ Property.attrib['UiHandler'] }}, &{{ Class.attrib['Name'] }}::{{ Property.attrib['SerializeProperty'] }}, "{{ Property.attrib['SerializeProperty'] }}", "") -{% else %} - ->DataElement({{ Property.attrib['UiHandler'] }}, &{{ Class.attrib['Name'] }}::{{ Property.attrib['FieldName'] }}, "{{ Property.attrib['Name'] | replace(' ','') }}", {% if Property.attrib['Description'] is defined %}"{{ Property.attrib['Description'] }}" {% else %}""{% endif %}) -{% endif %} -{% for EditAttribute in Property.iter('EditAttribute') %} - ->Attribute({{ EditAttribute.attrib['Key'] }}, {{ EditAttribute.attrib['Value'] }}) -{% endfor %} -{% endfor %} -{% endif %} - ; - } - } -} - - -{# Property Getters #} -{% for Property in Class.iter('Property') %} -{{ Property.attrib['Type'] }} {{ Class.attrib['Name'] }}Property::Get{{ Property.attrib['Name'] | replace(' ','') }}(ScriptCanvas::Node* owner) -{ - ScriptCanvas::SlotId slotId = Get{{ Property.attrib['Name'] | replace(' ','') }}SlotId(owner); - const ScriptCanvas::Datum* datum = owner->FindDatum(slotId); - if (!datum) - { - AZ_Error("Script Canvas", false, "Cannot find generated code gen slot with name {{ Property.attrib['Name'] | replace(' ','') }}. Has the ScriptCanvas_Property::Name changed without writing a version converter"); - } - const {{ Property.attrib['Type'] }}* datumValue = datum ? datum->GetAs<{{ Property.attrib['Type'] }}>() : nullptr; - return datumValue ? *datumValue : {{ Property.attrib['Type'] }}(); -} - - -{% endfor %} -{% endfor %} -{% endfor %} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja index b50448fc4d..0db611ffcb 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja @@ -63,7 +63,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. {# ----------------------------------------------------------------------------------------- #} -{# Groups al tags that do not provide a DisplayGroup #} +{# Groups all tags that do not provide a DisplayGroup #} {% set global_standaloneTagMap = dict() %} {# Display Group Support #} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h index 2875304d05..d6ac7e5482 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h @@ -225,6 +225,12 @@ namespace ScriptCanvas void MergeWith(const DependencyReport& other); }; + struct OrderedDependencies + { + DependencyReport source; + AZStd::vector orderedAssetIds; + }; + //! Globally accessible Script Canvas settings, we use these to pass user provided settings //! into the Script Canvas code class ScriptCanvasSettingsRequests : public AZ::EBusTraits diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp index 4bc1ebad6a..8d24b67b4f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp @@ -177,20 +177,6 @@ namespace ScriptCanvas return true; } - for (auto& nodeEntity : m_graphData.m_nodes) - { - if (nodeEntity) - { - if (auto node = AZ::EntityUtils::FindFirstDerivedComponent(nodeEntity)) - { - if (azrtti_istypeof(node)) - { - return true; - } - } - } - } - return false; } @@ -324,8 +310,8 @@ namespace ScriptCanvas request.graph = this; request.name = "editorValidation"; - request.rawSaveDebugOutput = Grammar::s_saveRawTranslationOuputToFile; - request.printModelToConsole = Grammar::s_printAbstractCodeModel; + request.rawSaveDebugOutput = Grammar::g_saveRawTranslationOuputToFile; + request.printModelToConsole = Grammar::g_printAbstractCodeModel; const Translation::Result result = Translation::ToLua(request); @@ -348,7 +334,10 @@ namespace ScriptCanvas { validationResults.ClearResults(); - // Parse(validationResults); + if (!Grammar::g_disableParseOnGraphValidation) + { + Parse(validationResults); + } for (auto& connectionEntity : m_graphData.m_connections) { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphBus.h index 1ecb191919..186e65e18f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphBus.h @@ -131,6 +131,15 @@ namespace ScriptCanvas //! Notification when a connections is removed virtual void OnConnectionRemoved(const AZ::EntityId&) {} + //! Notification when a connections is about to be removed + virtual void OnPreConnectionRemoved(const AZ::EntityId&) {} + + //! Notification when a connection is completed + virtual void OnConnectionComplete(const AZ::EntityId&) {} + + //! Notification when a connection is completed + virtual void OnDisonnectionComplete(const AZ::EntityId&) {} + //! Notification when a batch add for a graph begins virtual void OnBatchAddBegin() {} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp index bc4b4d5f24..af72476b26 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp @@ -560,7 +560,27 @@ namespace ScriptCanvas return ""; } - SlotsOutcome Node::GetSlots(const AZStd::vector& slotIds) const + SlotsOutcome Node::GetSlots(const AZStd::vector& slotIds) + { + AZStd::vector slots; + slots.reserve(slotIds.size()); + + for (const auto& slotId : slotIds) + { + if (const auto slot = GetSlot(slotId)) + { + slots.push_back(slot); + } + else + { + return AZ::Failure(AZStd::string::format("No slot found for slotId %s", slotId.ToString().data())); + } + } + + return AZ::Success(slots); + } + + ConstSlotsOutcome Node::GetSlots(const AZStd::vector& slotIds) const { AZStd::vector slots; slots.reserve(slotIds.size()); @@ -2043,6 +2063,23 @@ namespace ScriptCanvas return retVal; } + AZStd::vector Node::ModAllSlots() + { + AZ_PROFILE_SCOPE(AZ::Debug::ProfileCategory::ScriptCanvas, "ScriptCanvas::Node::ModAllSlots"); + + SlotList& slots = GetSlots(); + + AZStd::vector retVal; + retVal.reserve(slots.size()); + + for (auto& slot : slots) + { + retVal.push_back(&slot); + } + + return retVal; + } + bool Node::SlotExists(AZStd::string_view name, const SlotDescriptor& slotDescriptor) const { return FindSlotIdForDescriptor(name, slotDescriptor).IsValid(); @@ -2673,7 +2710,7 @@ namespace ScriptCanvas Slot* slot = GetSlot(currentSlotId); - if (slot && slot->IsDynamicSlot()) + if (slot && slot->IsDynamicSlot() && !slot->IsUserAdded()) { AZ::Crc32 dynamicGroup = slot->GetDynamicGroup(); @@ -2890,9 +2927,9 @@ namespace ScriptCanvas { AZStd::string assetName = m_runtimeBus->GetAssetName(); AZ::EntityId assetNodeId = m_runtimeBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); - - AZ_Error("Script Canvas", false, "Unable to find node with id (id: %s) in the graph '%s'. Most likely the node was serialized with a type that is no longer reflected", + AZ_Warning("Script Canvas", false, "Unable to find node with id (id: %s) in the graph '%s'. Most likely the node was serialized with a type that is no longer reflected", assetNodeId.ToString().data(), assetName.data()); + continue; } else if (!node->IsNodeEnabled()) @@ -2900,7 +2937,18 @@ namespace ScriptCanvas continue; } - connectedNodes.emplace_back(node, node->GetSlot(endpoint.GetSlotId())); + auto endpointSlot = node->GetSlot(endpoint.GetSlotId()); + if (!endpointSlot) + { + AZStd::string assetName = m_runtimeBus->GetAssetName(); + AZ::EntityId assetNodeId = m_runtimeBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); + AZ_Warning("Script Canvas", false, "Endpoint was missing slot. id (id: %s) in the graph '%s'.", + assetNodeId.ToString().data(), assetName.data()); + + continue; + } + + connectedNodes.emplace_back(node, endpointSlot); } return connectedNodes; @@ -3127,7 +3175,7 @@ namespace ScriptCanvas return {}; } - bool Node::HandlerStartsConnected() const + bool Node::IsAutoConnected() const { return {}; } @@ -3167,7 +3215,7 @@ namespace ScriptCanvas return AZ::Failure(); } - SlotsOutcome Node::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const + ConstSlotsOutcome Node::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const { if (auto map = GetSlotExecutionMap()) { @@ -3201,7 +3249,7 @@ namespace ScriptCanvas return AZ::Failure(AZStd::string("override Node::GetSlotsInExecutionThreadByTypeImpl to do things subvert the normal slot map assumptions")); } - SlotsOutcome Node::GetSlotsFromMap(const SlotExecution::Map& map, const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const + ConstSlotsOutcome Node::GetSlotsFromMap(const SlotExecution::Map& map, const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const { // so far ACM, needs to map: // In -> Out, Data In, Data Out @@ -3244,7 +3292,7 @@ namespace ScriptCanvas return AZ::Failure(AZStd::string("no such mapping supported, yet")); } - SlotsOutcome Node::GetDataInSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const + ConstSlotsOutcome Node::GetDataInSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const { const auto in = map.GetIn(executionInSlot.GetId()); @@ -3256,7 +3304,7 @@ namespace ScriptCanvas return GetSlots(SlotExecution::ToInputSlotIds(in->inputs)); } - SlotsOutcome Node::GetDataOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const + ConstSlotsOutcome Node::GetDataOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const { const auto outs = map.GetOuts(executionInSlot.GetId()); @@ -3285,7 +3333,7 @@ namespace ScriptCanvas return AZ::Success(outputSlots); } - SlotsOutcome Node::GetDataOutSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const + ConstSlotsOutcome Node::GetDataOutSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const { if (executionOutSlot.IsLatent()) { @@ -3311,7 +3359,7 @@ namespace ScriptCanvas } } - SlotsOutcome Node::GetExecutionOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const + ConstSlotsOutcome Node::GetExecutionOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const { const auto outs = map.GetOuts(executionInSlot.GetId()); if (!outs) @@ -3336,7 +3384,7 @@ namespace ScriptCanvas return AZ::Success(outSlots); } - SlotsOutcome Node::GetDataInSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const + ConstSlotsOutcome Node::GetDataInSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const { if (auto returns = map.GetReturnValuesByOut(executionOutSlot.GetId())) { @@ -3464,7 +3512,7 @@ namespace ScriptCanvas return AZ::Success(signature); } - SlotsOutcome Node::GetSlotsInExecutionThreadByType(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const + ConstSlotsOutcome Node::GetSlotsInExecutionThreadByType(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const { auto targetSlotsOutcome = GetSlotsInExecutionThreadByTypeImpl(executionSlot, targetSlotType, executionChildSlot); if (targetSlotsOutcome.IsSuccess()) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h index 109c157ede..d160c83e9b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h @@ -260,7 +260,8 @@ namespace ScriptCanvas DataType* m_dataType; }; - using SlotsOutcome = AZ::Outcome, AZStd::string>; + using ConstSlotsOutcome = AZ::Outcome, AZStd::string>; + using SlotsOutcome = AZ::Outcome, AZStd::string>; using EndpointResolved = AZStd::pair; using EndpointsResolved = AZStd::vector; @@ -531,8 +532,10 @@ namespace ScriptCanvas AZStd::string GetSlotName(const SlotId& slotId) const; //! returns a list of all slots, regardless of type + SlotList& GetSlots() { return m_slots; } const SlotList& GetSlots() const { return m_slots; } - SlotsOutcome GetSlots(const AZStd::vector& slotIds) const; + ConstSlotsOutcome GetSlots(const AZStd::vector& slotIds) const; + SlotsOutcome GetSlots(const AZStd::vector& slotIds); AZStd::vector< Slot* > GetSlotsWithDisplayGroup(AZStd::string_view displayGroup) const; AZStd::vector< Slot* > GetSlotsWithDynamicGroup(const AZ::Crc32& dynamicGroup) const; @@ -557,6 +560,7 @@ namespace ScriptCanvas Slot* GetSlot(const SlotId& slotId) const override; size_t GetSlotIndex(const SlotId& slotId) const override; AZStd::vector GetAllSlots() const override; + AZStd::vector ModAllSlots() override; SlotId GetSlotId(AZStd::string_view slotName) const override; SlotId FindSlotIdForDescriptor(AZStd::string_view slotName, const SlotDescriptor& descriptor) const override; @@ -675,8 +679,6 @@ namespace ScriptCanvas ////////////////////////////////////////////////////////////////////////// // Translation - virtual bool IsSupportedByNewBackend() const { return false; } - // \todo a hack that will disappear after conversions are properly done virtual bool ConvertsInputToStrings() const; @@ -696,7 +698,7 @@ namespace ScriptCanvas virtual AZ::Outcome GetFunctionCallLexicalScope(const Slot* /*slot*/) const; // override if necessary, usually only when the node's execution topology dramatically alters at edit-time in a way that is not generally parseable - SlotsOutcome GetSlotsInExecutionThreadByType(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot = nullptr) const; + ConstSlotsOutcome GetSlotsInExecutionThreadByType(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot = nullptr) const; // override if necessary, only used by NodeableNodes which can hide branched outs and rename them later virtual AZ::Outcome GetInternalOutKey(const Slot& slot) const; @@ -757,7 +759,7 @@ namespace ScriptCanvas virtual AZStd::vector GetOnVariableHandlingExecutionSlots() const; - virtual bool HandlerStartsConnected() const; + virtual bool IsAutoConnected() const; virtual bool IsEBusAddressed() const; @@ -784,19 +786,19 @@ namespace ScriptCanvas virtual ExecutionNameMap GetExecutionNameMap() const { return ExecutionNameMap(); } // override if necessary, usually only when the node's execution topology dramatically alters at edit-time in a way that is not generally parseable - virtual SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const; + virtual ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const; - SlotsOutcome GetSlotsFromMap(const SlotExecution::Map& map, const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const; + ConstSlotsOutcome GetSlotsFromMap(const SlotExecution::Map& map, const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const; - SlotsOutcome GetDataInSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const; + ConstSlotsOutcome GetDataInSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const; - SlotsOutcome GetDataInSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const; + ConstSlotsOutcome GetDataInSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const; - SlotsOutcome GetDataOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const; + ConstSlotsOutcome GetDataOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const; - SlotsOutcome GetDataOutSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const; + ConstSlotsOutcome GetDataOutSlotsByExecutionOut(const SlotExecution::Map& map, const Slot& executionOutSlot) const; - SlotsOutcome GetExecutionOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const; + ConstSlotsOutcome GetExecutionOutSlotsByExecutionIn(const SlotExecution::Map& map, const Slot& executionInSlot) const; AZ::Outcome GetInternalOutKey(const SlotExecution::Map& map, const Slot& slot) const; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeBus.h index 692e5a8b5b..f37da99c9f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeBus.h @@ -52,7 +52,9 @@ namespace ScriptCanvas //! Name is funky to avoid a mismatch with typing with another function //! that returns a better version of this information that cannot be used with //! EBuses because of references. - virtual AZStd::vector GetAllSlots() const = 0; + virtual AZStd::vector GetAllSlots() const { return {}; } + + virtual AZStd::vector ModAllSlots() { return {}; } //! Retrieves a slot id that matches the supplied name //! There can be multiple slots with the same name on a node diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeFunctionGeneric.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeFunctionGeneric.h index 7cc6c7a046..3fee94c116 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeFunctionGeneric.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeFunctionGeneric.h @@ -253,7 +253,7 @@ namespace ScriptCanvas return AZ::Success(scope); } - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp index 28cf87c038..8fc582954a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp @@ -123,7 +123,7 @@ namespace ScriptCanvas return AZ::Success(behaviorClass); } - SlotsOutcome NodeableNode::GetBehaviorContextOutName(const Slot& inSlot) const + ConstSlotsOutcome NodeableNode::GetBehaviorContextOutName(const Slot& inSlot) const { auto behaviorClassOutcome = GetBehaviorContextClass(); if (!behaviorClassOutcome) @@ -236,11 +236,6 @@ namespace ScriptCanvas return &m_slotExecutionMap; } - bool NodeableNode::HandlerStartsConnected() const - { - return true; - } - bool NodeableNode::IsNodeableNode() const { return true; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h index 05900022cc..60ad7d3273 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h @@ -60,11 +60,7 @@ namespace ScriptCanvas const SlotExecution::Map* GetSlotExecutionMap() const override; - bool HandlerStartsConnected() const override; - - bool IsNodeableNode() const override; - - bool IsSupportedByNewBackend() const override { return true; } + bool IsNodeableNode() const override; Nodeable* ReleaseNodeable(); @@ -81,7 +77,7 @@ namespace ScriptCanvas AZ::Outcome GetBehaviorContextClass() const; - SlotsOutcome GetBehaviorContextOutName(const Slot& inSlot) const; + ConstSlotsOutcome GetBehaviorContextOutName(const Slot& inSlot) const; virtual void RegisterExecutionMap(const AZ::BehaviorContext&) {} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodelingBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodelingBus.h index 4fe73b3a1a..0ce5902d73 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodelingBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodelingBus.h @@ -29,6 +29,7 @@ namespace ScriptCanvas virtual GraphScopedNodeId GetGraphScopedNodeId() const = 0; virtual const AZStd::string& GetDisplayName() const = 0; + virtual void Setup() = 0; virtual void SetDisplayName(const AZStd::string& displayName) = 0; }; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SignalBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SignalBus.h index 1267167be8..fc05fa64a7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SignalBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SignalBus.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.cpp index b278055ed4..41b1ec6d6b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.cpp @@ -212,6 +212,7 @@ namespace ScriptCanvas ->Field("DataType", &Slot::m_dataType) ->Field("IsReference", &Slot::m_isVariableReference) ->Field("VariableReference", &Slot::m_variableReference) + ->Field("IsUserAdded", &Slot::m_isUserAdded) ; } @@ -221,6 +222,7 @@ namespace ScriptCanvas : m_name(slotConfiguration.m_name) , m_toolTip(slotConfiguration.m_toolTip) , m_isLatentSlot(slotConfiguration.m_isLatent) + , m_isUserAdded(slotConfiguration.m_isUserAdded) , m_descriptor(slotConfiguration.GetSlotDescriptor()) , m_dynamicDataType(DynamicDataType::None) , m_id(slotConfiguration.m_slotId) @@ -264,6 +266,7 @@ namespace ScriptCanvas , m_displayGroup(other.m_displayGroup) , m_dynamicGroup(other.m_dynamicGroup) , m_isLatentSlot(other.m_isLatentSlot) + , m_isUserAdded(other.m_isUserAdded) , m_descriptor(other.m_descriptor) , m_isVariableReference(other.m_isVariableReference) , m_dataType(other.m_dataType) @@ -286,6 +289,7 @@ namespace ScriptCanvas , m_displayGroup(AZStd::move(slot.m_displayGroup)) , m_dynamicGroup(AZStd::move(slot.m_dynamicGroup)) , m_isLatentSlot(AZStd::move(slot.m_isLatentSlot)) + , m_isUserAdded(AZStd::move(slot.m_isUserAdded)) , m_descriptor(AZStd::move(slot.m_descriptor)) , m_isVariableReference(AZStd::move(slot.m_isVariableReference)) , m_dataType(AZStd::move(slot.m_dataType)) @@ -311,6 +315,7 @@ namespace ScriptCanvas m_displayGroup = slot.m_displayGroup; m_dynamicGroup = slot.m_dynamicGroup; m_isLatentSlot = slot.m_isLatentSlot; + m_isUserAdded = slot.m_isUserAdded; m_descriptor = slot.m_descriptor; m_isVariableReference = slot.m_isVariableReference; m_dataType = slot.m_dataType; @@ -438,7 +443,7 @@ namespace ScriptCanvas bool Slot::CanConvertToValue() const { - return CanConvertTypes() && m_isVariableReference; + return !m_isUserAdded && CanConvertTypes() && m_isVariableReference; } bool Slot::ConvertToValue() @@ -467,7 +472,7 @@ namespace ScriptCanvas bool Slot::CanConvertToReference() const { - return CanConvertTypes() && !m_isVariableReference && !m_node->HasConnectedNodes((*this)); + return !m_isUserAdded && CanConvertTypes() && !m_isVariableReference && !m_node->HasConnectedNodes((*this)); } bool Slot::ConvertToReference() @@ -559,6 +564,11 @@ namespace ScriptCanvas { return m_isVisible; } + + bool Slot::IsUserAdded() const + { + return m_isUserAdded; + } bool Slot::IsInput() const { @@ -603,7 +613,8 @@ namespace ScriptCanvas void Slot::SetDisplayType(ScriptCanvas::Data::Type displayType) { if ((m_displayDataType.IsValid() && !displayType.IsValid()) - || (!m_displayDataType.IsValid() && displayType.IsValid())) + || (!m_displayDataType.IsValid() && displayType.IsValid()) + || IsDynamicSlot()) { // Confirm that the type we are display as conforms to what our underlying type says we // should be. @@ -925,4 +936,10 @@ namespace ScriptCanvas { m_dynamicGroup = dynamicGroup; } + + void Slot::SetVisible(bool isVisible) + { + m_isVisible = isVisible; + } + } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.h index 0effe57a20..c65d4efc84 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Slot.h @@ -160,6 +160,9 @@ namespace ScriptCanvas bool IsExecution() const; bool IsVisible() const; + bool IsUserAdded() const; + + void SetVisible(bool isVisible); bool IsInput() const; bool IsOutput() const; @@ -216,6 +219,8 @@ namespace ScriptCanvas protected: bool m_isOverload = false; bool m_isVisible = true; + bool m_isUserAdded = false; + void SetDynamicGroup(const AZ::Crc32& dynamicGroup); AZStd::string m_name; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.h index ec930882ec..1e0a676976 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.h @@ -220,6 +220,7 @@ namespace ScriptCanvas bool m_isVisible = true; bool m_isLatent = false; + bool m_isUserAdded = false; AZStd::vector m_contractDescs; bool m_addUniqueSlotByNameAndType = true; // Only adds a new slot if a slot with the supplied name and CombinedSlotType does not exist on the node diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h index 794319d330..25c237b138 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h @@ -64,7 +64,7 @@ namespace ScriptCanvas Input() = default; // not explicit on purpose Input(const SlotId& slotId); - Input(const SlotId & slotId, const VariableId & interfaceSourceId); + Input(const SlotId& slotId, const VariableId & interfaceSourceId); }; using Inputs = AZStd::vector; using InputSlotIds = AZStd::vector; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp index ec9fb75443..61ea74d011 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp @@ -30,9 +30,46 @@ namespace SubgraphInterfaceCpp AddActivityParsing, AddChildStarts, AddExecutionCharacteristics, + Functions_2_0, + AddConstructionParameterRequirement, + AddConstructionParameterRequirementForDependencies, // add your entry above Current }; + + const size_t k_maxTabs = 20; + + AZ_INLINE const char* GetTabs(size_t tabs) + { + AZ_Assert(tabs >= 0 && tabs <= k_maxTabs, "invalid argument to GetTabs"); + + static const char* const k_tabs[] = + { + "", // 0 + "\t", + "\t\t", + "\t\t\t", + "\t\t\t\t", + "\t\t\t\t\t", // 5 + "\t\t\t\t\t\t", + "\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t", // 10 + "\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t", // 15 + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t", // 20 + }; + + return k_tabs[tabs]; + } } namespace ScriptCanvas @@ -43,6 +80,11 @@ namespace ScriptCanvas { // written out explicitly to aid breakpoint placement + if (isPure != rhs.isPure) + { + return false; + } + if (!AZ::StringFunc::Equal(displayName.c_str(), rhs.displayName.c_str())) { return false; @@ -177,6 +219,18 @@ namespace ScriptCanvas } } + const In* SubgraphInterface::FindIn(const FunctionSourceId& sourceID) const + { + auto iter = AZStd::find_if(m_ins.begin(), m_ins.end(), [&sourceID](const In& in) { return in.sourceID == sourceID; }); + return iter != m_ins.end() ? iter : nullptr; + } + + const Out* SubgraphInterface::FindLatent(const FunctionSourceId& sourceID) const + { + auto iter = AZStd::find_if(m_latents.begin(), m_latents.end(), [&sourceID](const Out& latent) { return latent.sourceID == sourceID; }); + return iter != m_latents.end() ? iter : nullptr; + } + ExecutionCharacteristics SubgraphInterface::GetExecutionCharacteristics() const { return m_executionCharacteristics; @@ -202,6 +256,16 @@ namespace ScriptCanvas return m_ins.size(); } + size_t SubgraphInterface::GetInCountNotPure() const + { + return AZStd::count_if(m_ins.begin(), m_ins.end(), [](const auto& in) { return !in.isPure; }); + } + + size_t SubgraphInterface::GetInCountPure() const + { + return AZStd::count_if(m_ins.begin(), m_ins.end(), [](const auto& in) { return in.isPure; }); + } + const Inputs* SubgraphInterface::GetInput(const AZStd::string& inName) const { if (auto in = FindIn(inName)) @@ -230,7 +294,7 @@ namespace ScriptCanvas { return &(latent->outputs); } - + return nullptr; } @@ -241,7 +305,12 @@ namespace ScriptCanvas LexicalScope SubgraphInterface::GetLexicalScope() const { - if (IsMarkedPure()) + return GetLexicalScope(IsMarkedPure()); + } + + LexicalScope SubgraphInterface::GetLexicalScope(bool isSourcePure) const + { + if (isSourcePure) { return LexicalScope{ LexicalScopeType::Namespace , m_namespacePath }; } @@ -251,6 +320,11 @@ namespace ScriptCanvas } } + LexicalScope SubgraphInterface::GetLexicalScope(const In& in) const + { + return GetLexicalScope(in.isPure); + } + AZStd::string SubgraphInterface::GetName() const { AZ_Error("ScriptCanvas", !m_namespacePath.empty(), "Interface must have at least one name"); @@ -283,7 +357,7 @@ namespace ScriptCanvas { return &out->outputs; } - + return nullptr; } @@ -293,7 +367,7 @@ namespace ScriptCanvas { return &in->outs; } - + return nullptr; } @@ -315,7 +389,7 @@ namespace ScriptCanvas { Parse(); } - + const Out* SubgraphInterface::FindImmediateOut(const AZStd::string& inName, const AZStd::string& outName) const { if (auto in = FindIn(inName)) @@ -343,7 +417,7 @@ namespace ScriptCanvas const Out* SubgraphInterface::FindLatentOut(const AZStd::string& latentName) const { auto iter = AZStd::find_if(m_latents.begin(), m_latents.end(), [&latentName](const Out& latent) { return latent.displayName == latentName; }); - + if (iter != m_latents.end()) { return iter; @@ -360,9 +434,29 @@ namespace ScriptCanvas return m_isActiveDefaultObject; } - bool SubgraphInterface::IsAllInputOutputShared() const + bool SubgraphInterface::IsUserNodeable() const + { + if (IsMarkedPure()) + { + return false; + } + + if (IsUserVariable()) + { + return false; + } + + if (GetInCountNotPure() == 0 && GetLatentOutCount() == 0) + { + return false; + } + + return true; + } + + bool SubgraphInterface::IsUserVariable() const { - return m_isAllInputOutputShared; + return m_isUserVariable; } AZ::Outcome SubgraphInterface::IsBranch(const AZStd::string& inName) const @@ -374,7 +468,7 @@ namespace ScriptCanvas else { return AZ::Failure(); - } + } } bool SubgraphInterface::IsLatent() const @@ -389,7 +483,32 @@ namespace ScriptCanvas bool SubgraphInterface::IsParsedPure() const { - return (!IsLatent()) && (!HasBranches()) && m_areAllChildrenPure; + if (IsLatent()) + { + return false; + } + + if (HasBranches()) + { + return false; + } + + if (!m_areAllChildrenPure) + { + return false; + } + + if (m_requiresConstructionParameters && (!m_hasOnGraphStart && GetInCount() != 0)) + { + return false; + } + + return true; + } + + bool SubgraphInterface::HasAnyFunctionality() const + { + return IsActiveDefaultObject() || HasPublicFunctionality(); } bool SubgraphInterface::HasBranches() const @@ -407,7 +526,8 @@ namespace ScriptCanvas bool SubgraphInterface::HasIn(const FunctionSourceId& sourceID) const { - return AZStd::find_if(m_ins.begin(), m_ins.end(), [&sourceID](const In& in) { return in.sourceID == sourceID; }) != m_ins.end(); + return ((!IsUserVariable()) && (IsFunctionSourceIdNodeable(sourceID) || IsFunctionSourceIdObject(sourceID))) + || FindIn(sourceID) != nullptr; } bool SubgraphInterface::HasInput(const VariableId& sourceID) const @@ -488,9 +608,19 @@ namespace ScriptCanvas m_isActiveDefaultObject = true; } - void SubgraphInterface::MarkAllInputOutputShared() + void SubgraphInterface::MarkRequiresConstructionParameters() + { + m_requiresConstructionParameters = true; + } + + void SubgraphInterface::MarkRequiresConstructionParametersForDependencies() { - m_isAllInputOutputShared = true; + m_requiresConstructionParametersForDependencies = true; + } + + void SubgraphInterface::MarkUserVariable() + { + m_isUserVariable = true; } void SubgraphInterface::MarkExecutionCharacteristics(ExecutionCharacteristics characteristics) @@ -509,11 +639,20 @@ namespace ScriptCanvas m_hasOnGraphStart = m_hasOnGraphStart || dependency.HasOnGraphStart(); m_isActiveDefaultObject = m_isActiveDefaultObject || dependency.IsActiveDefaultObject(); m_areAllChildrenPure = m_areAllChildrenPure && dependency.IsMarkedPure(); + m_requiresConstructionParametersForDependencies = m_requiresConstructionParametersForDependencies || dependency.RequiresConstructionParameters(); + } + + In* SubgraphInterface::ModIn(const FunctionSourceId& sourceID) + { + return const_cast(FindIn(sourceID)); } bool SubgraphInterface::operator==(const SubgraphInterface& rhs) const { - // written out explicitly to aid debugging placement + if (m_isUserVariable != rhs.m_isUserVariable) + { + return false; + } if (m_areAllChildrenPure != rhs.m_areAllChildrenPure) { @@ -524,38 +663,43 @@ namespace ScriptCanvas { return false; } - - if (m_isAllInputOutputShared != rhs.m_isAllInputOutputShared) + + if (m_hasOnGraphStart != rhs.m_hasOnGraphStart) { return false; } - if (m_hasOnGraphStart != rhs.m_hasOnGraphStart) + if (m_requiresConstructionParameters != rhs.m_requiresConstructionParameters) { return false; } - if (!(m_ins == rhs.m_ins)) + if (m_requiresConstructionParametersForDependencies != rhs.m_requiresConstructionParametersForDependencies) { return false; } - if (!(m_latents == rhs.m_latents)) + if (m_executionCharacteristics != rhs.m_executionCharacteristics) { return false; } - if (!(m_outKeys == rhs.m_outKeys)) + if (!(m_ins == rhs.m_ins)) { return false; } - if (!(IsNamespacePathEqual(m_namespacePath, rhs.m_namespacePath))) + if (!(m_latents == rhs.m_latents)) { return false; } - if (m_executionCharacteristics != rhs.m_executionCharacteristics) + if (!(m_outKeys == rhs.m_outKeys)) + { + return false; + } + + if (!(IsNamespacePathEqual(m_namespacePath, rhs.m_namespacePath))) { return false; } @@ -615,13 +759,13 @@ namespace ScriptCanvas ->Field("parsedName", &In::parsedName) ->Field("inputs", &In::inputs) ->Field("outs", &In::outs) + ->Field("isPure", &In::isPure) ->Field("sourceID", &In::sourceID) ; serializeContext->Class() ->Version(SubgraphInterfaceCpp::Version::Current) ->Field("areAllChildrenPure", &SubgraphInterface::m_areAllChildrenPure) - ->Field("isAllInputOutputShared", &SubgraphInterface::m_isAllInputOutputShared) ->Field("hasOnGraphStart", &SubgraphInterface::m_hasOnGraphStart) ->Field("isActiveDefaultObject", &SubgraphInterface::m_isActiveDefaultObject) ->Field("ins", &SubgraphInterface::m_ins) @@ -629,10 +773,22 @@ namespace ScriptCanvas ->Field("outKeys", &SubgraphInterface::m_outKeys) ->Field("namespacePath", &SubgraphInterface::m_namespacePath) ->Field("executionCharacteristics", &SubgraphInterface::m_executionCharacteristics) + ->Field("requiresConstructionParameters", &SubgraphInterface::m_requiresConstructionParameters) + ->Field("requiresConstructionParametersForDependencies", &SubgraphInterface::m_requiresConstructionParametersForDependencies) ; } } + bool SubgraphInterface::RequiresConstructionParameters() const + { + return m_requiresConstructionParameters || m_requiresConstructionParametersForDependencies; + } + + bool SubgraphInterface::RequiresConstructionParametersForDependencies() const + { + return m_requiresConstructionParametersForDependencies; + } + void SubgraphInterface::SetNamespacePath(const NamespacePath& namespacePath) { m_namespacePath = namespacePath; @@ -673,6 +829,132 @@ namespace ScriptCanvas return result; } + template + AZStd::string EntryPerLine(const T& values, size_t tabs) + { + AZStd::string result; + + for (const auto& value : values) + { + result += "\n"; + result += ToString(value, tabs); + } + + return result; + } + + const char* YorN(bool value) + { + return value ? "Y" : "N"; + } + + AZStd::string ToString(const In& in, size_t tabs) + { + AZStd::string result = AZStd::string::format("In: %s, Pure: %s", in.displayName.c_str(), YorN(in.isPure)); + + if (!in.inputs.empty()) + { + result += AZStd::string::format("%sInputs:", SubgraphInterfaceCpp::GetTabs(tabs + 1)); + result += ToString(in.inputs, tabs + 2); + } + + if (!in.outs.empty()) + { + result += AZStd::string::format("%sOuts:", SubgraphInterfaceCpp::GetTabs(tabs + 1)); + result += ToString(in.outs, false, tabs + 2); + } + + return result; + } + + AZStd::string ToString(const Ins& ins, size_t tabs) + { + return EntryPerLine(ins, tabs); + } + + AZStd::string ToString(const Input& input, size_t tabs) + { + return AZStd::string::format("%sInput: %s, Type: %s", SubgraphInterfaceCpp::GetTabs(tabs), input.displayName.c_str(), Data::GetName(input.datum.GetType()).c_str()); + } + + AZStd::string ToString(const Inputs& inputs, size_t tabs) + { + return EntryPerLine(inputs, tabs); + } + + AZStd::string ToString(const Out& out, bool isLatent, size_t tabs) + { + AZStd::string result = AZStd::string::format("%s%s: %s", SubgraphInterfaceCpp::GetTabs(tabs), isLatent ? "Latent" : "Out", out.displayName.c_str()); + + if (!out.outputs.empty()) + { + result += AZStd::string::format("%sOutputs:", SubgraphInterfaceCpp::GetTabs(tabs + 1)); + result += ToString(out.outputs, tabs + 2); + } + + if (!out.returnValues.empty()) + { + result += AZStd::string::format("%sReturn Values:", SubgraphInterfaceCpp::GetTabs(tabs + 1)); + result += ToString(out.returnValues, tabs + 2); + } + + return result; + } + + AZStd::string ToString(const Outs& outs, bool isLatent, size_t tabs) + { + AZStd::string result; + + for (const auto& value : outs) + { + result += "\n"; + result += ToString(value, isLatent, tabs); + } + + return result; + } + + AZStd::string ToString(const Output& output, size_t tabs) + { + return AZStd::string::format("%sOutput: %s, Type: %s", SubgraphInterfaceCpp::GetTabs(tabs), output.displayName.c_str(), Data::GetName(output.type).c_str()); + } + + AZStd::string ToString(const Outputs& outputs, size_t tabs) + { + return EntryPerLine(outputs, tabs); + } + + AZStd::string ToString(const SubgraphInterface& subgraphInterface) + { + AZStd::string result("\n"); + result += subgraphInterface.GetName(); + result += "\n"; + result += AZStd::string::format("Is Active By Default: %s\n", YorN(subgraphInterface.IsActiveDefaultObject())); + result += AZStd::string::format("Is Latent: %s\n", YorN(subgraphInterface.IsLatent())); + result += AZStd::string::format("Is Pure: %s\n", YorN(subgraphInterface.GetExecutionCharacteristics() == ExecutionCharacteristics::Pure)); + result += AZStd::string::format("Is User Nodeable: %s\n", YorN(subgraphInterface.IsUserNodeable())); + result += AZStd::string::format("Has Any Functionality: %s\n", YorN(subgraphInterface.HasAnyFunctionality())); + result += AZStd::string::format("Has On Graph Start: %s\n", YorN(subgraphInterface.HasOnGraphStart())); + + const auto& ins = subgraphInterface.GetIns(); + if (!ins.empty()) + { + result += "Ins:"; + result += ToString(ins, 1); + } + + const auto& latents = subgraphInterface.GetLatentOuts(); + if (!latents.empty()) + { + result += "Latents:"; + result += ToString(latents, 1); + } + + result += "\n"; + + return result; + } + SubgraphInterfacePtrConst SubgraphInterfaceSystem::GetMap(const FunctionSourceId& nodeTypeId) const { auto iter = m_mapsByNodeType.find(nodeTypeId); @@ -695,5 +977,5 @@ namespace ScriptCanvas m_mapsByNodeType.insert({ nodeTypeId, executionMap }); return true; } - } + } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h index ad831dbe54..3eea850666 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h @@ -99,15 +99,16 @@ namespace ScriptCanvas AZ_TYPE_INFO(In, "{DFDA32F7-41D2-45BB-8ADF-876679053836}"); AZ_CLASS_ALLOCATOR(In, AZ::SystemAllocator, 0); + bool isPure = false; AZStd::string displayName; AZStd::string parsedName; Inputs inputs; Outs outs; FunctionSourceId sourceID; - + bool operator==(const In& rhs) const; - - AZ_INLINE bool IsBranch() const { return outs.size() > 1; } + // #functions2 In-sensitive parsing. convert pure branches to mini-nodeables and provide a creation function + inline bool IsBranch() const { return outs.size() > 1; } }; using Ins = AZStd::vector; @@ -131,6 +132,10 @@ namespace ScriptCanvas void AddLatent(Out&& out); + const In* FindIn(const FunctionSourceId& sourceID) const; + + const Out* FindLatent(const FunctionSourceId& sourceID) const; + ExecutionCharacteristics GetExecutionCharacteristics() const; const In* GetIn(const AZStd::string& in) const; @@ -141,6 +146,10 @@ namespace ScriptCanvas size_t GetInCount() const; + size_t GetInCountPure() const; + + size_t GetInCountNotPure() const; + const Inputs* GetInput(const AZStd::string& in) const; const Out& GetLatentOut(size_t index) const; @@ -151,9 +160,10 @@ namespace ScriptCanvas const Outs& GetLatentOuts() const; - // \todo for max optimization this would be In sensitive LexicalScope GetLexicalScope() const; + LexicalScope GetLexicalScope(const In& in) const; + AZStd::string GetName() const; const NamespacePath& GetNamespacePath() const; @@ -169,8 +179,6 @@ namespace ScriptCanvas bool IsActiveDefaultObject() const; - bool IsAllInputOutputShared() const; - AZ::Outcome IsBranch(const AZStd::string& in) const; // returns true iff there is at least one latent out @@ -180,6 +188,12 @@ namespace ScriptCanvas bool IsParsedPure() const; + bool IsUserNodeable() const; + + bool IsUserVariable() const; + + bool HasAnyFunctionality() const; + bool HasBranches() const; bool HasIn(const FunctionSourceId& sourceID) const; @@ -195,24 +209,35 @@ namespace ScriptCanvas bool HasOutput(const VariableId& sourceID) const; // returns true iff there is no public access to Ins or Latents - // \note The subgraph could still DO something, and be useful + // \note The subgraph could still DO something, and be useful, it could respond to tick bus or on graph start bool HasPublicFunctionality() const; - void MarkActiveDefaultObject(); - - void MarkAllInputOutputShared(); + void MarkActiveDefaultObject(); void MarkExecutionCharacteristics(ExecutionCharacteristics characteristics); void MarkOnGraphStart(); - void MergeExecutionCharacteristics(const SubgraphInterface& dependency); + void MarkRequiresConstructionParameters(); + + void MarkRequiresConstructionParametersForDependencies(); + + // #sc_user_data_type expose this to users directly, so they can say "I don't just want to make a component with this, I want to drop it right into another graph" + void MarkUserVariable(); + + void MergeExecutionCharacteristics(const SubgraphInterface & dependency); + + In* ModIn(const FunctionSourceId & sourceID); bool operator==(const SubgraphInterface& rhs) const; // Populates the list of out keys void Parse(); + bool RequiresConstructionParameters() const; + + bool RequiresConstructionParametersForDependencies() const; + void SetNamespacePath(const NamespacePath& namespacePath); void TakeNamespacePath(NamespacePath&& namespacePath); @@ -220,17 +245,20 @@ namespace ScriptCanvas AZStd::string ToExecutionString() const; private: + bool m_isUserVariable = false; + bool m_areAllChildrenPure = true; - // Does this graph have any (automatic) connection to buses or other latent activity, - // regardless of public exposure to out? + // Does this graph have any (automatic) connection to buses or other latent activity, or even on graph start + // regardless of public exposure to in/out? bool m_isActiveDefaultObject = false; - // all input/output are used in every in/out/latent slot? - bool m_isAllInputOutputShared = false; - bool m_hasOnGraphStart = false; + bool m_requiresConstructionParameters = false; + + bool m_requiresConstructionParametersForDependencies = false; + ExecutionCharacteristics m_executionCharacteristics = ExecutionCharacteristics::Pure; Ins m_ins; @@ -242,8 +270,37 @@ namespace ScriptCanvas const Out* FindImmediateOut(const AZStd::string& in, const AZStd::string& out) const; const In* FindIn(const AZStd::string& inSlotId) const; const Out* FindLatentOut(const AZStd::string& latent) const; + LexicalScope GetLexicalScope(bool isSourcePure) const; + +#if defined(FUNCTION_LEGACY_SUPPORT_ENABLED) + public: + bool IsAllInputOutputShared() const; + + // all input/output are used in every in/out/latent slot? + bool m_isAllInputOutputShared = false; + + void MarkAllInputOutputShared(); +#endif }; + AZStd::string ToString(const In& in, size_t tabs = 0); + + AZStd::string ToString(const Ins& ins, size_t tabs = 0); + + AZStd::string ToString(const Input& input, size_t tabs = 1); + + AZStd::string ToString(const Inputs& inputs, size_t tabs = 1); + + AZStd::string ToString(const Out& out, bool isLatent, size_t tabs = 0); + + AZStd::string ToString(const Outs& out, bool isLatent, size_t tabs = 0); + + AZStd::string ToString(const Output& output, size_t tabs = 1); + + AZStd::string ToString(const Outputs& outputs, size_t tabs = 1); + + AZStd::string ToString(const SubgraphInterface& subgraphInterface); + using SubgraphInterfacePtrConst = AZStd::shared_ptr; using InterfacesByNodeType = AZStd::unordered_map; @@ -268,7 +325,5 @@ namespace ScriptCanvas private: InterfacesByNodeType m_mapsByNodeType; }; - - } - + } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.cpp index 9bfbe8a2ed..89db333c9e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.cpp @@ -17,9 +17,29 @@ namespace SubgraphInterfaceUtilityCpp { - const constexpr size_t k_defaultOutIndex = 1; const constexpr size_t k_uniqueOutIndex = 0; + const constexpr size_t k_signatureIndex = 1; const constexpr AZ::u64 k_defaultOutIdSignature = 0x3ACF20E73ACF20E7ull; + + const constexpr AZ::u64 k_functionSourceIdObjectSignature = 0xADC636A91EA5433Aull; + const constexpr AZ::u64 k_functionSourceIdNodeableSignature = 0xAD71FC30CA2E468Cull; + + using namespace ScriptCanvas; + using namespace ScriptCanvas::Grammar; + + bool IsSignatureId(size_t index, AZ::u64 signature, const FunctionSourceId& id) + { + const AZ::u64* idData = reinterpret_cast(id.data); + return idData[index] == signature; + } + + FunctionSourceId MakeSignatureId(size_t index, AZ::u64 signature, const FunctionSourceId& id) + { + FunctionSourceId signatureId = id; + AZ::u64* idData = reinterpret_cast(signatureId.data); + idData[index] = signature; + return signatureId; + } } namespace ScriptCanvas @@ -30,17 +50,37 @@ namespace ScriptCanvas bool IsDefaultOutId(const FunctionSourceId& id) { - const AZ::u64* idData = reinterpret_cast(id.data); - return idData[k_defaultOutIndex] == k_defaultOutIdSignature; + return IsSignatureId(k_signatureIndex, k_defaultOutIdSignature, id); + } + + bool IsFunctionSourceIdObject(const FunctionSourceId& id) + { + return IsSignatureId(k_signatureIndex, k_functionSourceIdObjectSignature, id); + } + + bool IsFunctionSourceIdNodeable(const FunctionSourceId& id) + { + return IsSignatureId(k_signatureIndex, k_functionSourceIdNodeableSignature, id); + } + + bool IsReservedId(const FunctionSourceId& id) + { + return IsDefaultOutId(id) || IsFunctionSourceIdNodeable(id) || IsFunctionSourceIdObject(id); } FunctionSourceId MakeDefaultOutId(const FunctionSourceId& id) { - FunctionSourceId defaultOut = id; - AZ::u64* idData = reinterpret_cast(defaultOut.data); - idData[k_defaultOutIndex] = k_defaultOutIdSignature; - AZ_Assert(idData[k_uniqueOutIndex] != k_defaultOutIdSignature, "the default out must also be unique"); - return defaultOut; + return MakeSignatureId(k_signatureIndex, k_defaultOutIdSignature, id); + } + + FunctionSourceId MakeFunctionSourceIdObject() + { + return MakeSignatureId(k_signatureIndex, k_functionSourceIdObjectSignature, FunctionSourceId()); + } + + FunctionSourceId MakeFunctionSourceIdNodeable() + { + return MakeSignatureId(k_signatureIndex, k_functionSourceIdNodeableSignature, FunctionSourceId()); } bool OutIdIsEqual(const FunctionSourceId& lhs, const FunctionSourceId& rhs) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.h index 71c87b615c..9de0af9138 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterfaceUtility.h @@ -26,8 +26,18 @@ namespace ScriptCanvas { bool IsDefaultOutId(const FunctionSourceId& id); + bool IsFunctionSourceIdObject(const FunctionSourceId& id); + + bool IsFunctionSourceIdNodeable(const FunctionSourceId& id); + + bool IsReservedId(const FunctionSourceId& id); + FunctionSourceId MakeDefaultOutId(const FunctionSourceId& inID); + FunctionSourceId MakeFunctionSourceIdObject(); + + FunctionSourceId MakeFunctionSourceIdNodeable(); + bool OutIdIsEqual(const FunctionSourceId& lhs, const FunctionSourceId& rhs); Ins CreateInsFromBehaviorContextMethods(const AZStd::string& className, const AZ::BehaviorContext& behaviorContext, const AZStd::unordered_set& branchingMethods); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.cpp index fdebc70123..26a54cb336 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.cpp @@ -59,13 +59,11 @@ namespace ScriptCanvas ActivationInputRange Context::CreateActivateInputRange(ActivationData& activationData) { const RuntimeData& runtimeData = activationData.runtimeData; - - ActivationInputRange rangeOut; + ActivationInputRange rangeOut = runtimeData.m_activationInputRange; rangeOut.inputs = activationData.storage.begin(); - rangeOut.nodeableCount = runtimeData.m_activationInputRange.nodeableCount; - rangeOut.variableCount = runtimeData.m_activationInputRange.variableCount; - rangeOut.entityIdCount = runtimeData.m_activationInputRange.entityIdCount; - rangeOut.totalCount = rangeOut.nodeableCount + rangeOut.variableCount + rangeOut.entityIdCount; + + AZ_Assert(rangeOut.totalCount <= activationData.storage.size(), "Too many initial arguments for activation. " + "Consider increasing size, source of ActivationInputArray, or breaking up the source graph"); // nodeables { @@ -97,6 +95,7 @@ namespace ScriptCanvas } // (must always be re-mapped) EntityId + if (!runtimeData.m_input.m_entityIds.empty()) { AZ::SliceComponent::EntityIdToEntityIdMap loadedEntityIdMap; AzFramework::EntityContextId owningContextId = AzFramework::EntityContextId::CreateNull(); @@ -110,7 +109,7 @@ namespace ScriptCanvas + runtimeData.m_activationInputRange.nodeableCount + runtimeData.m_activationInputRange.variableCount; - const auto entityIdTypeId = azrtti_typeid< Data::EntityIDType>(); + const auto entityIdTypeId = azrtti_typeid(); for (auto& idEntityPair : runtimeData.m_input.m_entityIds) { destVariableIter->m_typeId = entityIdTypeId; @@ -141,22 +140,20 @@ namespace ScriptCanvas return rangeOut; } - void Context::IntializeActivationInputs(RuntimeData& runtimeData) + void Context::IntializeActivationInputs(RuntimeData& runtimeData, AZ::BehaviorContext& behaviorContext) { - AZ::BehaviorContext* behaviorContext(nullptr); - AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext); - AZ_Assert(behaviorContext, "missing behavior context"); - AZStd::vector& parameters = runtimeData.m_activationInputStorage; - parameters.reserve(runtimeData.m_input.GetParameterSize()); + auto& range = runtimeData.m_activationInputRange; + range.requiresDependencyConstructionParameters = runtimeData.RequiresDependencyConstructionParameters(); + parameters.reserve(runtimeData.m_input.GetConstructorParameterCount()); for (const Nodeable* nodeable : runtimeData.m_input.m_nodeables) { AZ::BehaviorValueParameter bvp; bvp.m_typeId = azrtti_typeid(nodeable); - const auto classIter(behaviorContext->m_typeToClassMap.find(bvp.m_typeId)); - AZ_Assert(classIter != behaviorContext->m_typeToClassMap.end(), "No class by typeID of %s in the behavior context!", bvp.m_typeId.ToString().c_str()); + const auto classIter(behaviorContext.m_typeToClassMap.find(bvp.m_typeId)); + AZ_Assert(classIter != behaviorContext.m_typeToClassMap.end(), "No class by typeID of %s in the behavior context!", bvp.m_typeId.ToString().c_str()); bvp.m_azRtti = classIter->second->m_azRtti; bvp.m_value = const_cast(nodeable); parameters.push_back(bvp); @@ -167,8 +164,8 @@ namespace ScriptCanvas const Datum* datum = &idDatumPair.second; AZ::BehaviorValueParameter bvp; bvp.m_typeId = datum->GetType().GetAZType(); - const auto classIter(behaviorContext->m_typeToClassMap.find(bvp.m_typeId)); - bvp.m_azRtti = classIter != behaviorContext->m_typeToClassMap.end() ? classIter->second->m_azRtti : nullptr; + const auto classIter(behaviorContext.m_typeToClassMap.find(bvp.m_typeId)); + bvp.m_azRtti = classIter != behaviorContext.m_typeToClassMap.end() ? classIter->second->m_azRtti : nullptr; bvp.m_value = const_cast(datum->GetAsDanger()); parameters.push_back(bvp); } @@ -180,20 +177,14 @@ namespace ScriptCanvas parameters.push_back(bvp); } - runtimeData.m_activationInputRange.inputs = parameters.begin(); - runtimeData.m_activationInputRange.nodeableCount = runtimeData.m_input.m_nodeables.size(); - runtimeData.m_activationInputRange.variableCount = runtimeData.m_input.m_variables.size(); - runtimeData.m_activationInputRange.entityIdCount = runtimeData.m_input.m_entityIds.size(); - } - - void Context::IntializeAssetData(RuntimeData& runtimeData) - { - // \todo, the stack push functions could be retrieved here - IntializeActivationInputs(runtimeData); - IntializeStaticCloners(runtimeData); + range.inputs = parameters.begin(); + range.nodeableCount = runtimeData.m_input.m_nodeables.size(); + range.variableCount = runtimeData.m_input.m_variables.size(); + range.entityIdCount = runtimeData.m_input.m_entityIds.size(); + range.totalCount = range.nodeableCount + range.variableCount + range.entityIdCount; } - void Context::IntializeStaticCloners(RuntimeData& runtimeData) + void Context::InitializeActivationData(RuntimeData& runtimeData) { AZ::BehaviorContext* behaviorContext(nullptr); AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext); @@ -203,12 +194,20 @@ namespace ScriptCanvas return; } + // \todo, the stack push functions could be retrieved here + IntializeActivationInputs(runtimeData, *behaviorContext); + IntializeStaticCloners(runtimeData, *behaviorContext); + } + + // This does not have to recursively initialize dependent assets, as this is called by asset handler + void Context::IntializeStaticCloners(RuntimeData& runtimeData, AZ::BehaviorContext& behaviorContext) + { runtimeData.m_cloneSources.reserve(runtimeData.m_input.m_staticVariables.size()); for (AZStd::pair& staticSource : runtimeData.m_input.m_staticVariables) { AZStd::any& anySource = staticSource.second; - auto bcClass = AZ::BehaviorContextHelper::GetClass(behaviorContext, anySource.type()); + auto bcClass = AZ::BehaviorContextHelper::GetClass(&behaviorContext, anySource.type()); AZ_Assert(bcClass, "BehaviorContext class for type %s was deleted", anySource.type().ToString().c_str()); runtimeData.m_cloneSources.emplace_back(*bcClass, AZStd::any_cast(&anySource)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.h index 1d99e7bada..1f217ac8cd 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionContext.h @@ -23,7 +23,7 @@ namespace ScriptCanvas namespace Execution { - using ActivationInputArray = AZStd::array; + using ActivationInputArray = AZStd::array; struct ActivationData { @@ -39,6 +39,7 @@ namespace ScriptCanvas struct ActivationInputRange { AZ::BehaviorValueParameter* inputs = nullptr; + bool requiresDependencyConstructionParameters = false; size_t nodeableCount = 0; size_t variableCount = 0; size_t entityIdCount = 0; @@ -52,12 +53,12 @@ namespace ScriptCanvas AZ_CLASS_ALLOCATOR(Context, AZ::SystemAllocator, 0); static ActivationInputRange CreateActivateInputRange(ActivationData& activationData); - static void IntializeAssetData(RuntimeData& runtimeData); + static void InitializeActivationData(RuntimeData& runtimeData); static void UnloadData(RuntimeData& runtimeData); private: - static void IntializeActivationInputs(RuntimeData& runtimeData); - static void IntializeStaticCloners(RuntimeData& runtimeData); + static void IntializeActivationInputs(RuntimeData& runtimeData, AZ::BehaviorContext& behaviorContext); + static void IntializeStaticCloners(RuntimeData& runtimeData, AZ::BehaviorContext& behaviorContext); }; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.cpp index 6de8956e9a..6e84695a5b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.cpp @@ -35,35 +35,26 @@ namespace ScriptCanvas ExecutionStatePtr ExecutionState::Create(const ExecutionStateConfig& config) { - switch (config.runtimeData.m_input.m_execution) - { - case ExecutionMode::Interpreted: - { - if (config.runtimeData.m_script.GetId().IsValid()) - { - switch (config.runtimeData.m_input.m_executionCharacteristics) - { - case Grammar::ExecutionCharacteristics::PerEntity: - return AZStd::make_shared(config); - - case Grammar::ExecutionCharacteristics::Pure: - return AZStd::make_shared(config); - - default: - break; - } - } - } - break; - - case ExecutionMode::Native: - default: - AZ_Assert(false, "not done yet!"); - return nullptr; - ; - } // switch (config.executionMode) - - return nullptr; + Grammar::ExecutionStateSelection selection = config.runtimeData.m_input.m_executionSelection; + + switch (selection) + { + case Grammar::InterpretedPure: + return AZStd::make_shared(config); + + case Grammar::InterpretedPureOnGraphStart: + return AZStd::make_shared(config); + + case Grammar::InterpretedObject: + return AZStd::make_shared(config); + + case Grammar::InterpretedObjectOnGraphStart: + return AZStd::make_shared(config); + + default: + AZ_Assert(false, "Unsupported ScriptCanvas execution selection"); + return nullptr; + } } AZ::Data::AssetId ExecutionState::GetAssetId() const @@ -96,6 +87,11 @@ namespace ScriptCanvas return m_component->GetScriptCanvasId(); } + const VariableData& ExecutionState::GetVariableOverrides() const + { + return m_component->GetVariableOverrides(); + } + void ExecutionState::Reflect(AZ::ReflectContext* reflectContext) { if (auto behaviorContext = azrtti_cast(reflectContext)) @@ -110,7 +106,9 @@ namespace ScriptCanvas ExecutionStateInterpreted::Reflect(reflectContext); ExecutionStateInterpretedPerActivation::Reflect(reflectContext); + ExecutionStateInterpretedPerActivationOnGraphStart::Reflect(reflectContext); ExecutionStateInterpretedPure::Reflect(reflectContext); + ExecutionStateInterpretedPureOnGraphStart::Reflect(reflectContext); ExecutionStateInterpretedSingleton::Reflect(reflectContext); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.h index 3c353d3e52..8ff5006857 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionState.h @@ -76,6 +76,8 @@ namespace ScriptCanvas AZ::EntityId GetScriptCanvasId() const; + const VariableData& GetVariableOverrides() const; + virtual void Initialize() = 0; ExecutionStatePtr SharedFromThis(); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp index dfb72b0e9d..5aa0488e7c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp @@ -64,7 +64,7 @@ namespace ExecutionInterpretedAPICpp int DeleteNodeable(lua_State* lua) { AZ::LuaUserData* userData = reinterpret_cast(lua_touserdata(lua, -1)); - AZ_Assert(userData && userData->magicData == AZ_CRC("AZLuaUserData", 0x7d76a773), "this isn't user data"); + AZ_Assert(userData && userData->magicData == AZ_CRC_CE("AZLuaUserData"), "this isn't user data"); delete reinterpret_cast(userData->value); userData->value = nullptr; return 0; @@ -413,7 +413,7 @@ namespace ScriptCanvas AZ_Assert(lua_istable(lua, -1), "Error in compiled lua file, 2nd argument to OverrideNodeableMetatable is not a Lua table"); auto userData = reinterpret_cast(lua_touserdata(lua, -2)); - AZ_Assert(userData && userData->magicData == AZ_CRC("AZLuaUserData", 0x7d76a773), "this isn't user data"); + AZ_Assert(userData && userData->magicData == AZ_CRC_CE("AZLuaUserData"), "this isn't user data"); // Lua: LuaUserData::nodeable, class_mt lua_newtable(lua); // Lua: LuaUserData::nodeable, class_mt, proxy @@ -472,6 +472,8 @@ namespace ScriptCanvas lua_register(lua, k_NodeableSetExecutionOutResultName, &SetExecutionOutResult); lua_register(lua, k_NodeableSetExecutionOutUserSubgraphName, &SetExecutionOutUserSubgraph); lua_register(lua, k_OverrideNodeableMetatableName, &OverrideNodeableMetatable); + lua_register(lua, k_UnpackDependencyConstructionArgsFunctionName, &UnpackDependencyConstructionArgs); + lua_register(lua, k_UnpackDependencyConstructionArgsLeafFunctionName, &UnpackDependencyConstructionArgsLeaf); #if defined(PERFORMANCE_BUILD) lua_pushboolean(lua, true); @@ -693,6 +695,49 @@ namespace ScriptCanvas AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequests::ClearAssetReferences, runtimeData.m_script.GetId()); } + struct DependencyConstructionPack + { + ExecutionStateInterpreted* executionState; + AZStd::vector>* dependentAssets; + const size_t dependentAssetsIndex; + RuntimeData& runtimeData; + }; + + DependencyConstructionPack UnpackDependencyConstructionArgsSanitize(lua_State* lua) + { + auto executionState = AZ::ScriptValue::StackRead(lua, 1); + AZ_Assert(executionState, "Error in compiled lua file, 1st argument to UnpackDependencyArgs is not an ExecutionStateInterpreted"); + AZ_Assert(lua_islightuserdata(lua, 2), "Error in compiled lua file, 2nd argument to UnpackDependencyArgs is not userdata (AZStd::vector>*), but a :%s", lua_typename(lua, 2)); + auto dependentAssets = reinterpret_cast>*>(lua_touserdata(lua, 2)); + AZ_Assert(lua_isinteger(lua, 3), "Error in compiled Lua file, 3rd argument to UnpackDependencyArgs is not a number"); + const size_t dependentAssetsIndex = lua_tointeger(lua, 3); + + return DependencyConstructionPack{ executionState, dependentAssets, dependentAssetsIndex, (*dependentAssets)[dependentAssetsIndex].Get()->m_runtimeData }; + } + + int Unpack(lua_State* lua, DependencyConstructionPack& args) + { + ActivationInputArray storage; + ActivationData data(args.executionState->GetEntityId(), args.executionState->GetVariableOverrides(), args.runtimeData, storage); + ActivationInputRange range = Execution::Context::CreateActivateInputRange(data); + PushActivationArgs(lua, range.inputs, range.totalCount); + return range.totalCount; + } + + int UnpackDependencyConstructionArgs(lua_State* lua) + { + // Lua: executionState, dependentAssets, dependentAssetsIndex + DependencyConstructionPack pack = UnpackDependencyConstructionArgsSanitize(lua); + lua_pushlightuserdata(lua, const_cast(reinterpret_cast(&pack.runtimeData.m_requiredAssets))); + return 1 + Unpack(lua, pack); + } + + int UnpackDependencyConstructionArgsLeaf(lua_State* lua) + { + // Lua: executionState, dependentAssets, dependentAssetsIndex + DependencyConstructionPack constructionArgs = UnpackDependencyConstructionArgsSanitize(lua); + return Unpack(lua, constructionArgs); + } } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.h index 6542e96726..a286fa1cb1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.h @@ -45,6 +45,8 @@ namespace ScriptCanvas int InterpretedSafeCall(lua_State* lua, int argCount, int returnValueCount); + void InterpretedUnloadData(RuntimeData& runtimeData); + void InitializeInterpretedStatics(const RuntimeData& runtimeData); int InitializeNodeableOutKeys(lua_State* lua); @@ -76,8 +78,13 @@ namespace ScriptCanvas bool StackRead(lua_State* lua, AZ::BehaviorContext* context, int index, AZ::BehaviorValueParameter& param, AZ::StackVariableAllocator* allocator); - void InterpretedUnloadData(RuntimeData& runtimeData); + // Lua: executionState, dependentAssets, dependentAssetsIndex + // leaves dependentAssets[dependentAssetsIndex], and all the construction args at the top of the stack + int UnpackDependencyConstructionArgs(lua_State* lua); + // Lua: executionState, dependentAssets, dependentAssetsIndex + // leaves all the construction args at the top of the stack + int UnpackDependencyConstructionArgsLeaf(lua_State* lua); } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp index 96336bfdd5..6612039c65 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp @@ -51,8 +51,9 @@ namespace ScriptCanvas AZ::StackVariableAllocator tempData; AZ::BehaviorValueParameter address = BehaviorValueParameterFromTypeIdString(aztypeidStr, behaviorContext); + // \todo check for nil if required...if the address is a BCO...and is NOT a pointer type...nil check is required + // that will have to be checked at compile time actually. AZ_Verify(StackRead(lua, &behaviorContext, -1, address, &tempData), "Error in compiled lua file, failed to read 2nd argument to EBusHandlerConnectTo"); - lua_pushboolean(lua, ebusHandler->ConnectTo(address)); return 1; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.cpp index 7e684be03f..d772cb81c0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.cpp @@ -39,41 +39,7 @@ namespace ScriptCanvas } void ExecutionStateInterpretedPerActivation::Execute() - { - const auto registryIndex = GetLuaRegistryIndex(); - AZ_Assert(registryIndex != LUA_NOREF, "ExecutionStateInterpretedPerActivation::Activate called but Init is was never called"); - auto& lua = m_luaState; - // Lua: - lua_rawgeti(lua, LUA_REGISTRYINDEX, registryIndex); - // Lua: instance - lua_getfield(lua, -1, Grammar::k_OnGraphStartFunctionName); - // Lua: instance, graph_VM['k_OnGraphStartFunctionName'] - if (lua_isfunction(lua, -1)) - { - // Lua: instance, graph_VM.k_OnGraphStartFunctionName - lua_pushvalue(lua, -2); - // Lua: instance, graph_VM.k_OnGraphStartFunctionName, instance - const int result = Execution::InterpretedSafeCall(lua, 1, 0); - // Lua: instance ? - if (result == LUA_OK) - { - // Lua: instance - lua_pop(lua, 1); - } - else - { - // Lua: instance, error - lua_pop(lua, 2); - } - } - else - { - // Lua: instance, nil - lua_pop(lua, 2); - } - // Lua: - m_deactivationRequired = true; - } + {} void ExecutionStateInterpretedPerActivation::Initialize() { @@ -86,9 +52,22 @@ namespace ScriptCanvas Execution::ActivationInputArray storage; Execution::ActivationData data(*m_component, storage); Execution::ActivationInputRange range = Execution::Context::CreateActivateInputRange(data); - Execution::PushActivationArgs(lua, range.inputs, range.totalCount); - // Lua: graph_VM, graph_VM['new'], userdata, args... - AZ::Internal::LuaSafeCall(lua, aznumeric_caster(1 + range.totalCount), 1); + + if (range.requiresDependencyConstructionParameters) + { + lua_pushlightuserdata(lua, const_cast(reinterpret_cast(&data.runtimeData.m_requiredAssets))); + // Lua: graph_VM, graph_VM['new'], userdata, dependencies + Execution::PushActivationArgs(lua, range.inputs, range.totalCount); + // Lua: graph_VM, graph_VM['new'], userdata, dependencies, args... + AZ::Internal::LuaSafeCall(lua, aznumeric_caster(2 + range.totalCount), 1); + } + else + { + Execution::PushActivationArgs(lua, range.inputs, range.totalCount); + // Lua: graph_VM, graph_VM['new'], userdata, args... + AZ::Internal::LuaSafeCall(lua, aznumeric_caster(1 + range.totalCount), 1); + } + // Lua: graph_VM, instance ReferenceExecutionState(); // Lua: graph_VM, @@ -100,7 +79,7 @@ namespace ScriptCanvas void ExecutionStateInterpretedPerActivation::StopExecution() { const auto registryIndex = GetLuaRegistryIndex(); - AZ_Assert(registryIndex != LUA_NOREF, "ExecutionStateInterpretedPerActivation::Deactivate called but Initialize is was never called"); + AZ_Assert(registryIndex != LUA_NOREF, "ExecutionStateInterpretedPerActivation::StopExecution called but Initialize is was never called"); auto& lua = m_luaState; // Lua: lua_rawgeti(lua, LUA_REGISTRYINDEX, registryIndex); @@ -125,4 +104,45 @@ namespace ScriptCanvas } } + ExecutionStateInterpretedPerActivationOnGraphStart::ExecutionStateInterpretedPerActivationOnGraphStart(const ExecutionStateConfig& config) + : ExecutionStateInterpretedPerActivation(config) + {} + + void ExecutionStateInterpretedPerActivationOnGraphStart::Execute() + { + const auto registryIndex = GetLuaRegistryIndex(); + AZ_Assert(registryIndex != LUA_NOREF, "ExecutionStateInterpretedPerActivationOnGraphStart::Execute called but Initialize is was never called"); + auto& lua = m_luaState; + // Lua: + lua_rawgeti(lua, LUA_REGISTRYINDEX, registryIndex); + // Lua: instance + lua_getfield(lua, -1, Grammar::k_OnGraphStartFunctionName); + // Lua: instance, graph_VM.k_OnGraphStartFunctionName + lua_pushvalue(lua, -2); + // Lua: instance, graph_VM.k_OnGraphStartFunctionName, instance + const int result = Execution::InterpretedSafeCall(lua, 1, 0); + // Lua: instance ? + if (result == LUA_OK) + { + // Lua: instance + lua_pop(lua, 1); + } + else + { + // Lua: instance, error + lua_pop(lua, 2); + } + // Lua: + m_deactivationRequired = true; + } + + void ExecutionStateInterpretedPerActivationOnGraphStart::Reflect(AZ::ReflectContext* reflectContext) + { + if (AZ::BehaviorContext* behaviorContext = azrtti_cast(reflectContext)) + { + behaviorContext->Class() + ; + } + } + } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.h index d54a9f6693..b286f0d015 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPerActivation.h @@ -35,6 +35,23 @@ namespace ScriptCanvas void StopExecution() override; + protected: + bool m_deactivationRequired = false; + }; + + class ExecutionStateInterpretedPerActivationOnGraphStart + : public ExecutionStateInterpretedPerActivation + { + public: + AZ_RTTI(ExecutionStateInterpretedPerActivationOnGraphStart, "{039AA0BF-C179-4F9C-A7CD-248F24453C4B}", ExecutionStateInterpretedPerActivation); + AZ_CLASS_ALLOCATOR(ExecutionStateInterpretedPerActivation, AZ::SystemAllocator, 0); + + static void Reflect(AZ::ReflectContext* reflectContext); + + ExecutionStateInterpretedPerActivationOnGraphStart(const ExecutionStateConfig& config); + + void Execute() override; + private: bool m_deactivationRequired = false; }; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.cpp index 1d39bb6b19..756de34966 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.cpp @@ -22,17 +22,39 @@ namespace ScriptCanvas { ExecutionStateInterpretedPure::ExecutionStateInterpretedPure(const ExecutionStateConfig& config) : ExecutionStateInterpreted(config) + {} + + void ExecutionStateInterpretedPure::Execute() + {} + + void ExecutionStateInterpretedPure::Initialize() + {} + + void ExecutionStateInterpretedPure::StopExecution() + {} + + void ExecutionStateInterpretedPure::Reflect(AZ::ReflectContext* reflectContext) { + if (auto behaviorContext = azrtti_cast(reflectContext)) + { + behaviorContext->Class() + ; + } } - void ExecutionStateInterpretedPure::Execute() + ExecutionStateInterpretedPureOnGraphStart::ExecutionStateInterpretedPureOnGraphStart(const ExecutionStateConfig& config) + : ExecutionStateInterpretedPure(config) + {} + + // #functions2 dependency - ctor - args adjust for (pure only) on graph start args + void ExecutionStateInterpretedPureOnGraphStart::Execute() { // execute the script in a single call auto lua = LoadLuaScript(); // Lua: graph_VM AZ::Internal::azlua_getfield(lua, -1, Grammar::k_OnGraphStartFunctionName); // Lua: graph_VM, graph_VM['k_OnGraphStartFunctionName'] - AZ::Internal::LuaClassToStack(lua, this, azrtti_typeid(), AZ::ObjectToLua::ByReference, AZ::AcquisitionOnPush::None); + AZ::Internal::LuaClassToStack(lua, this, azrtti_typeid(), AZ::ObjectToLua::ByReference, AZ::AcquisitionOnPush::None); // Lua: graph_VM, graph_VM['k_OnGraphStartFunctionName'], userdata Execution::ActivationInputArray storage; Execution::ActivationData data(*m_component, storage); @@ -52,18 +74,12 @@ namespace ScriptCanvas lua_pop(lua, 2); } } - - void ExecutionStateInterpretedPure::Initialize() - {} - void ExecutionStateInterpretedPure::StopExecution() - {} - - void ExecutionStateInterpretedPure::Reflect(AZ::ReflectContext* reflectContext) + void ExecutionStateInterpretedPureOnGraphStart::Reflect(AZ::ReflectContext* reflectContext) { if (auto behaviorContext = azrtti_cast(reflectContext)) { - behaviorContext->Class() + behaviorContext->Class() ; } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.h index 87a57c8af7..e08a3ebf83 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedPure.h @@ -33,4 +33,18 @@ namespace ScriptCanvas void StopExecution() override; }; + + class ExecutionStateInterpretedPureOnGraphStart + : public ExecutionStateInterpretedPure + { + public: + AZ_RTTI(ExecutionStateInterpretedPureOnGraphStart, "{D4CA9731-31CE-4B27-A91F-6E71E1DE8B7D}", ExecutionStateInterpretedPure); + AZ_CLASS_ALLOCATOR(ExecutionStateInterpretedPureOnGraphStart, AZ::SystemAllocator, 0); + + static void Reflect(AZ::ReflectContext* reflectContext); + + ExecutionStateInterpretedPureOnGraphStart(const ExecutionStateConfig& config); + + void Execute() override; + }; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp index a9319d5fba..14f1bedfeb 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp @@ -27,13 +27,15 @@ #include #include #include -#include +#include +#include #include #include #include #include #include "AbstractCodeModel.h" +#include "ExecutionTraversalListeners.h" #include "GrammarContextBus.h" #include "ParsingUtilities.h" #include "Primitives.h" @@ -43,72 +45,6 @@ namespace AbstractCodeModelCpp using namespace ScriptCanvas; using namespace ScriptCanvas::Grammar; - class NodelingInParserIterationListener - : public ExecutionTreeIterationListener - { - public: - void CountOnlyGrammarCalls() - { - m_countOnlyGrammarCalls = true; - } - - const AZStd::vector& GetLeavesWithoutNodelings() const - { - return m_leavesWithoutNodelings; - } - - const AZStd::unordered_set& GetNodelingsOut() const - { - return m_uniqueNodelings; - } - - const AZStd::vector& GetOutCalls() const - { - return m_outCalls; - } - - void Reset() override - { - m_uniqueNodelings.clear(); - m_outCalls.clear(); - m_leavesWithoutNodelings.clear(); - } - - protected: - void EvaluateLeaf(ExecutionTreeConstPtr node, const Slot*, int) override - { - bool without = true; - - if (node->GetSymbol() == Symbol::UserOut) - { - m_outCalls.push_back(node); - without = false; - } - - if (auto nodeling = azrtti_cast(node->GetId().m_node)) - { - if (!m_countOnlyGrammarCalls) - { - m_outCalls.push_back(node); - } - - m_uniqueNodelings.insert(nodeling); - without = false; - } - - if (without) - { - m_leavesWithoutNodelings.push_back(node); - } - } - - private: - bool m_countOnlyGrammarCalls = false; - AZStd::unordered_set m_uniqueNodelings; - AZStd::vector m_outCalls; - AZStd::vector m_leavesWithoutNodelings; - }; - AZStd::unordered_set< const Nodes::Core::FunctionDefinitionNode*> Intersection ( const AZStd::unordered_multimap& lhs , const AZStd::unordered_set< const Nodes::Core::FunctionDefinitionNode*>& rhs) @@ -146,19 +82,34 @@ namespace AbstractCodeModelCpp return resolved; } + bool IsConnectedToUserInRecurse(const Node* node, AZStd::unordered_set& previousPath); + bool IsConnectedToUserIn(const Node* node) + { + AZStd::unordered_set previousPath; + return IsConnectedToUserInRecurse(node, previousPath); + } + + bool IsConnectedToUserInRecurse(const Node* node, AZStd::unordered_set& previousPath) { auto parents = GetParentNodes(node); for (auto parent : parents) { + if (previousPath.contains(parent.second)) + { + continue; + } + + previousPath.insert(parent.second); + auto nodeling = azrtti_cast(parent.first); - if (nodeling && GetParentNodes(nodeling).empty()) + if (nodeling && nodeling->IsExecutionEntry()) { return true; } - if (IsConnectedToUserIn(parent.first)) + if (parent.first && IsConnectedToUserInRecurse(parent.first, previousPath)) { return true; } @@ -166,7 +117,6 @@ namespace AbstractCodeModelCpp return false; } - } namespace ScriptCanvas @@ -264,50 +214,32 @@ namespace ScriptCanvas void AbstractCodeModel::AddAllVariablesPreParse() { - if (m_variableScopeMeaning == VariableScopeMeaning::ValueInitialization) - { - // all variables assumed to be persistent - // InScope(Scope::Out) has no meaning, so warn on that - - auto& sourceVariables = m_source.m_variableData->GetVariables(); + auto& sourceVariables = m_source.m_variableData->GetVariables(); - AZStd::set sortedVariables; - for (const auto& variablePair : sourceVariables) + AZStd::set sortedVariables; + for (const auto& variablePair : sourceVariables) + { + if (variablePair.second.GetScope() == VariableFlags::Scope::Graph) { sortedVariables.insert(&variablePair.second); } - for (auto& sourceVariable : sortedVariables) + if (auto datum = variablePair.second.GetDatum()) { - auto datum = sourceVariable->GetDatum(); - AZ_Assert(datum != nullptr, "the datum must be valid"); - auto variable = AddMemberVariable(*datum, sourceVariable->GetVariableName(), sourceVariable->GetVariableId()); - variable->m_isExposedToConstruction = sourceVariable->IsExposedAsComponentInput(); - // also, all nodeables with !empty editor data have to be exposed - // \todo future optimizations will involve checking equality against a default constructed object + // #functions2 slot<->variable consider getting all variables from the UX variable manager, or from the ACM and looking them up in the variable manager for ordering + m_sourceVariableByDatum.insert(AZStd::make_pair(datum, &variablePair.second)); } } - else - { - // all variables assumed to be NOT persistent - in the live code they are reset when activated - // variables with no scope In/Out is assumed to be persistent, this is a mess with tick handlers - // warn on any variable attempted to be read before written - - AZ_Assert(m_variableScopeMeaning == VariableScopeMeaning::FunctionPrototype, "new graph type added without full support"); - auto& sourceVariables = m_source.m_variableData->GetVariables(); - - AZStd::set sortedVariables; - for (const auto& variablePair : sourceVariables) - { - sortedVariables.insert(&variablePair.second); - } - for (auto& sourceVariable : sortedVariables) - { - auto datum = sourceVariable->GetDatum(); - AZ_Assert(datum != nullptr, "the datum must be valid"); - AddVariable(*datum, sourceVariable->GetVariableName(), sourceVariable->GetVariableId()); - } + for (auto& sourceVariable : sortedVariables) + { + auto datum = sourceVariable->GetDatum(); + AZ_Assert(datum != nullptr, "the datum must be valid"); + // #functions2 slot<->variable check to verify if it is a member variable + auto variable = AddMemberVariable(*datum, sourceVariable->GetVariableName(), sourceVariable->GetVariableId()); + variable->m_isExposedToConstruction = sourceVariable->IsComponentProperty(); + // also, all nodeables with !empty editor data have to be exposed + // \todo future optimizations will involve checking equality against a default constructed object } } @@ -459,7 +391,7 @@ namespace ScriptCanvas void AbstractCodeModel::AddError(ExecutionTreeConstPtr execution, ValidationConstPtr&& error) const { - if (execution) + if (execution && execution->GetRoot()) { AZStd::string pretty; Grammar::PrettyPrint(pretty, execution->GetRoot(), execution); @@ -494,13 +426,13 @@ namespace ScriptCanvas for (auto& input : functionInput) { in.inputs.push_back - ({ GetOriginalVariableName(input.second->m_source->m_sourceVariableId) + ({ GetOriginalVariableName(input.second->m_source, nodelingIn) , input.second->m_source->m_name , input.second->m_source->m_datum , input.second->m_source->m_sourceVariableId }); } - if (!root->ReturnValuesRoutedToOuts()) + if (!root->HasExplicitUserOutCalls()) { // there is a single out call, default or not Out out; @@ -526,7 +458,7 @@ namespace ScriptCanvas { const auto& returnValueVariable = root->GetReturnValue(returnValueIndex).second->m_source; out.outputs.push_back - ({ GetOriginalVariableName(returnValueVariable->m_sourceVariableId) + ({ GetOriginalVariableName(returnValueVariable, *uniqueNodelingsOut.begin()) , returnValueVariable->m_name , returnValueVariable->m_datum.GetType() , returnValueVariable->m_sourceVariableId }); @@ -544,12 +476,12 @@ namespace ScriptCanvas return; } - auto outCall = outCalls[0]; - - for (auto& nodelingCanBeNull : uniqueNodelingsOut) + for (auto& outCall : outCalls) { Out out; - + const auto& outCallID = outCall->GetId(); + auto nodelingCanBeNull = azrtti_cast(outCallID.m_node); + if (nodelingCanBeNull) { SetDisplayAndParsedName(out, nodelingCanBeNull->GetDisplayName()); @@ -565,7 +497,7 @@ namespace ScriptCanvas { const auto& returnValueVariable = outCall->GetInput(inputIndex).m_value; out.outputs.push_back - ({ GetOriginalVariableName(returnValueVariable->m_sourceVariableId) + ({ GetOriginalVariableName(returnValueVariable, outCallID.m_node) , returnValueVariable->m_name , returnValueVariable->m_datum.GetType() , returnValueVariable->m_sourceVariableId }); @@ -576,7 +508,6 @@ namespace ScriptCanvas } m_subgraphInterface.AddIn(AZStd::move(in)); - m_subgraphInterface.MarkAllInputOutputShared(); } void AbstractCodeModel::AddExecutionMapLatentOut(const Nodes::Core::FunctionDefinitionNode& nodeling, ExecutionTreePtr outCall) @@ -596,7 +527,7 @@ namespace ScriptCanvas { const auto& inputVariable = outCall->GetInput(inputIndex).m_value; out.outputs.push_back - ({ GetOriginalVariableName(inputVariable->m_sourceVariableId) + ({ GetOriginalVariableName(inputVariable, &nodeling) , inputVariable->m_name , inputVariable->m_datum.GetType() , inputVariable->m_sourceVariableId }); @@ -606,14 +537,13 @@ namespace ScriptCanvas { const auto& returnValueVariable = outCall->GetReturnValue(returnValueIndex).second->m_source; out.outputs.push_back - ({ GetOriginalVariableName(returnValueVariable->m_sourceVariableId) + ({ GetOriginalVariableName(returnValueVariable, &nodeling) , returnValueVariable->m_name , returnValueVariable->m_datum.GetType() , returnValueVariable->m_sourceVariableId }); } m_subgraphInterface.AddLatent(AZStd::move(out)); - m_subgraphInterface.MarkAllInputOutputShared(); } void AbstractCodeModel::AddPreviouslyExecutedScopeVariableToOutputAssignments(VariableConstPtr newInputVariable, const ConnectionsInPreviouslyExecutedScope& connectedInputInPreviouslyExecutedScope) @@ -646,7 +576,12 @@ namespace ScriptCanvas return variable; } - void AbstractCodeModel::AddUserOut(ExecutionTreePtr parent, ExecutionTreeConstPtr root, AZStd::string_view name) + AZStd::string AbstractCodeModel::AddTranslationVariableName(const AZStd::string& name) const + { + return AZStd::const_pointer_cast(m_graphScope)->AddVariableName(name); + } + + void AbstractCodeModel::AddUserOutToLeaf(ExecutionTreePtr parent, ExecutionTreeConstPtr root, AZStd::string_view name) { ExecutionTreePtr out; @@ -738,9 +673,9 @@ namespace ScriptCanvas bool AbstractCodeModel::CheckCreateRoot(const Node& node) { - return CreateNodeableParse(node) - || CreateUserEventHandling(node) - || CreateUserFunctionDefinition(node); + return CheckCreateNodeableParse(node) + || CheckCreateUserEventHandling(node) + || CheckCreateUserFunctionDefinition(node); } AZStd::string AbstractCodeModel::CheckUniqueInterfaceNames @@ -784,6 +719,23 @@ namespace ScriptCanvas return CheckUniqueInterfaceNames(displayName, "Out", m_uniqueOutNames, nodelingsOut); } + AZStd::optional> AbstractCodeModel::CheckUserNodeableDependencyConstructionIndex(VariableConstPtr variable) const + { + auto iter = m_dependencyByVariable.find(variable); + if (iter != m_dependencyByVariable.end()) + { + for (size_t index = 0; index != m_orderedDependencies.orderedAssetIds.size(); ++index) + { + if (iter->second.assetId == m_orderedDependencies.orderedAssetIds[index]) + { + return AZStd::make_pair(index, iter->second); + } + } + } + + return {}; + } + AZStd::vector AbstractCodeModel::CombineVariableLists ( const AZStd::vector& constructionNodeables , const AZStd::vector>& constructionInputVariables @@ -852,7 +804,7 @@ namespace ScriptCanvas void AbstractCodeModel::ConvertNamesToIdentifiers() { - class ConvertListener : public ExecutionTreeIterationListener + class ConvertListener : public ExecutionTreeTraversalListener { protected: void Evaluate(ExecutionTreeConstPtr node, const Slot*, int) override @@ -903,9 +855,10 @@ namespace ScriptCanvas ebusHandling->m_handlerName = m_graphScope->AddVariableName(AZStd::string::format("%sHandler", ebusHandling->m_ebusName.data())); auto addressSlot = node.GetEBusConnectAddressSlot(); - VariableConstPtr startingAddressVariable = addressSlot && addressSlot->IsVariableReference() ? FindMemberVariable(addressSlot->GetVariableReference()) : nullptr; + VariableConstPtr startingAddressVariable = addressSlot && addressSlot->IsVariableReference() ? FindVariable(addressSlot->GetVariableReference()) : nullptr; ebusHandling->m_isAddressed = node.IsEBusAddressed(); + if (ebusHandling->m_isAddressed) { if (addressSlot == nullptr) @@ -928,7 +881,7 @@ namespace ScriptCanvas } } - if (node.HandlerStartsConnected()) + if (node.IsAutoConnected()) { if (ebusHandling->m_isAddressed) { @@ -940,7 +893,7 @@ namespace ScriptCanvas } } - ebusHandling->m_isAutoConnected = node.HandlerStartsConnected(); + ebusHandling->m_isAutoConnected = node.IsAutoConnected(); if (ebusHandling->m_isAddressed && !addressSlot->IsVariableReference() && (ebusHandling->m_startsConnected || ebusHandling->m_isAutoConnected)) { @@ -1016,7 +969,7 @@ namespace ScriptCanvas return true; } - bool AbstractCodeModel::CreateNodeableParse(const Node& node) + bool AbstractCodeModel::CheckCreateNodeableParse(const Node& node) { if (auto nodeableNode = azrtti_cast(&node)) { @@ -1043,7 +996,7 @@ namespace ScriptCanvas auto dataSlot = dataInOutcomes.GetValue()[0]; auto datum = node.FindDatum(dataSlot->GetId()); VariablePtr variable = AddMemberVariable(*datum, dataSlot->GetName(), node.GetEntityId()); - CreateVariableWriteHandling(*dataSlot, variable, node.HandlerStartsConnected()); + CreateVariableWriteHandling(*dataSlot, variable, node.IsAutoConnected()); onInputChangeExecution->AddInput({ nullptr, variable, DebugDataSource::FromInternal() }); FunctionCallDefaultMetaData metaData; @@ -1075,17 +1028,32 @@ namespace ScriptCanvas } } } - else if (auto functionNode = azrtti_cast(&node)) + else if (auto functionCallNode = azrtti_cast(&node)) { - if (!functionNode->IsPure()) + auto subgraphInterface = functionCallNode->GetSubgraphInterface(); + auto requiresCtorParamsForDependencies = subgraphInterface && subgraphInterface->RequiresConstructionParametersForDependencies(); + auto requiresCtorParams = subgraphInterface && subgraphInterface->RequiresConstructionParameters(); + + if (requiresCtorParams) + { + m_subgraphInterface.MarkRequiresConstructionParametersForDependencies(); + } + + // #functions2 pure on graph start nodes with dependencies can only by added to the graph as variables + if (!functionCallNode->IsPure()) { Datum nodeableDatum(Data::Type::BehaviorContextObject(azrtti_typeid()), Datum::eOriginality::Copy); - auto nodeableVariable = AddMemberVariable(nodeableDatum, functionNode->GetInterfaceName(), node.GetEntityId()); + + auto nodeableVariable = AddMemberVariable(nodeableDatum, functionCallNode->GetInterfaceName(), node.GetEntityId()); + auto nodeableParse = AZStd::make_shared(); nodeableVariable->m_isExposedToConstruction = false; nodeableParse->m_nodeable = nodeableVariable; + nodeableParse->m_simpleName = subgraphInterface->GetName(); + m_nodeablesByNode.emplace(&node, nodeableParse); m_userNodeables.insert(nodeableVariable); + m_dependencyByVariable.emplace(nodeableVariable, DependencyInfo{ functionCallNode->GetAssetId(), requiresCtorParams, requiresCtorParamsForDependencies }); return true; } } @@ -1182,7 +1150,7 @@ namespace ScriptCanvas return outputPtr; } - bool AbstractCodeModel::CreateUserEventHandling(const Node& node) + bool AbstractCodeModel::CheckCreateUserEventHandling(const Node& node) { const EventHandingType handlerType = CheckEventHandlingType(node); switch (handlerType) @@ -1202,64 +1170,90 @@ namespace ScriptCanvas } } - bool AbstractCodeModel::CreateUserFunctionDefinition(const Node& node) + void AbstractCodeModel::ConvertAllMemberVariablesToLocal(ExecutionTreePtr startNode) { - if (auto nodeling = azrtti_cast(&node)) + auto useageIter = m_variableUseByExecution.find(startNode); + if (useageIter == m_variableUseByExecution.end()) { - auto inputSlotVector = nodeling->GetEntrySlots(); - if (inputSlotVector.size() == 1) + useageIter = m_variableUseByExecution.emplace(startNode, VariableUseage()).first; + } + + for (auto constVariable : m_variables) + { + auto variable = AZStd::const_pointer_cast(constVariable); + if (variable->m_isMember && !variable->m_nodeableNodeId.IsValid()) { - auto displayName = nodeling->GetDisplayName(); - auto slot = inputSlotVector[0]; + variable->m_isMember = false; + variable->m_source = startNode; + useageIter->second.localVariables.insert(constVariable); + useageIter->second.memberVariables.erase(constVariable); + m_variableUse.localVariables.insert(constVariable); + m_variableUse.memberVariables.erase(constVariable); + } + } - if (slot->GetType() == CombinedSlotType::ExecutionOut) - { - if (m_uniqueInNames.contains(displayName)) - { - AddError(nodeling->GetEntityId() - , nullptr - , AZStd::string::format - ( "%s is the name of multiple In Nodelings in a subgraph,\n" - "this will result in a difficult or impossible to use Function Node when used in another graph", displayName.data())); - } - else - { - m_uniqueInNames.insert(displayName); - } + auto& variableNamesInStart = ModStaticVariablesNames(startNode); + variableNamesInStart.insert(variableNamesInStart.end(), m_staticVariableNames.begin(), m_staticVariableNames.end()); + } - ExecutionTreePtr definition = OpenScope(nullptr, nodeling, slot); - definition->SetSymbol(Symbol::FunctionDefinition); - definition->SetName(nodeling->GetDisplayName()); - m_userInsThatRequireTopology.insert({ nodeling, definition }); - return true; - } - else if (slot->GetType() == CombinedSlotType::ExecutionIn) - { - if (m_uniqueOutNames.contains(displayName)) - { - AddError(nodeling->GetEntityId() - , nullptr - , AZStd::string::format - ("%s is the name of multiple In Nodelings in a subgraph,\n" - "this will result in a difficult or impossible to use Function Node when used in another graph", displayName.data())); - } - else - { - m_uniqueOutNames.insert(displayName); - } + void AbstractCodeModel::CreateUserFunctionDefinition(const Node& node, const Slot& entrySlot) + { + auto nodeling = azrtti_cast(&node); + auto displayName = nodeling->GetDisplayName(); - // turn this into a latent in the function node - m_userOutsThatRequireTopology.insert({ nodeling, nullptr }); - m_variableScopeMeaning = VariableScopeMeaning::FunctionPrototype; + if (m_uniqueInNames.contains(displayName)) + { + AddError + ( nodeling->GetEntityId() + , nullptr + , AZStd::string::format + ( "%s is the name of multiple In Nodelings in a subgraph,\n" + "this will result in a difficult or impossible to use Function Node when used in another graph", displayName.data())); + return; + } + else + { + m_uniqueInNames.insert(displayName); + } + + ExecutionTreePtr definition = OpenScope(nullptr, nodeling, &entrySlot); + definition->SetSymbol(Symbol::FunctionDefinition); + definition->SetName(nodeling->GetDisplayName()); + + m_userInsThatRequireTopology.insert({ nodeling, definition }); + } + + bool AbstractCodeModel::CheckCreateUserFunctionDefinition(const Node& node) + { + if (auto nodeling = azrtti_cast(&node)) + { + if (auto entrySlot = nodeling->GetEntrySlot()) + { + CreateUserFunctionDefinition(node, *entrySlot); + return true; + } + else if (auto exitSlot = nodeling->GetExitSlot()) + { + auto displayName = nodeling->GetDisplayName(); + if (m_uniqueOutNames.contains(displayName)) + { + AddError(nodeling->GetEntityId() + , nullptr + , AZStd::string::format + ( "%s is the name of multiple In Nodelings in a subgraph,\n" + "this will result in a difficult or impossible to use Function Node when used in another graph", displayName.data())); } else { - AddError(nodeling->GetEntityId(), nullptr, ScriptCanvas::ParseErrors::UnexpectedSlotTypeFromNodeling); + m_uniqueOutNames.insert(displayName); } + + // turn this into a latent in the function node + m_userOutsThatRequireTopology.insert({ nodeling, nullptr }); } else { - AddError(nodeling->GetEntityId(), nullptr, ScriptCanvas::ParseErrors::FunctionDefinitionNodeDidNotReturn); + AddError(nodeling->GetEntityId(), nullptr, ScriptCanvas::ParseErrors::FunctionDefinitionNodeDidNotReturnSlot); } } @@ -1281,7 +1275,7 @@ namespace ScriptCanvas if (auto boundVariable = FindBoundVariable(*boundVariableId->GetAs())) { AZ_Assert(boundVariable, "variable write handling gave no bound variable"); - CreateVariableWriteHandling(*addressSlot, boundVariable, node.HandlerStartsConnected()); + CreateVariableWriteHandling(*addressSlot, boundVariable, node.IsAutoConnected()); return true; } @@ -1315,123 +1309,42 @@ namespace ScriptCanvas } } - bool AbstractCodeModel::ExecutionContainsCycles(const Node& node, const Slot& outSlot) const - { - if (ExecutionContainsCyclesRecurse(node, outSlot)) - { - AddError(nullptr, aznew Internal::ParseError(node.GetEntityId(), AZStd::string::format - ("Execution cycle detected (see connections to %s-%s. Use a looping node like While or For" - , node.GetDebugName().data(), outSlot.GetName().data()).data())); - - return true; - } - else - { - return false; - } - } - - bool AbstractCodeModel::ExecutionContainsCyclesRecurse(const Node& node, const Slot& outSlot) const - { - AZStd::unordered_set path; - return ExecutionContainsCyclesRecurse({&node, &outSlot}, path); - } - - bool AbstractCodeModel::ExecutionContainsCyclesRecurse(const EndpointsResolved& nextEndpoints, AZStd::unordered_set& previousPath) const + void AbstractCodeModel::CullUnusedVariables() { - if (!nextEndpoints.empty()) + AZStd::erase_if(m_variables, [this](auto variable) { - if (nextEndpoints.size() == 1) + if (IsManuallyDeclaredUserVariable(variable)) { - if (ExecutionContainsCyclesRecurse(nextEndpoints[0], previousPath)) + if (variable->m_isMember) { - return true; + return !this->m_variableUse.memberVariables.contains(variable); + } + else + { + return !this->m_variableUse.localVariables.contains(variable); } } else { - // Subsequent connections after an the multiple Execution Out connections syntax sugar - // only have to check for loops up to the sequence point. - // Duplicate endpoints after the sequence are not necessarily loops, but are likely just the normal - // ScriptCanvas way allowing users to use the same visual path (thus preventing "duplicate code"). - for (auto nextEndpoint : nextEndpoints) - { - AZStd::unordered_set pathUpToSequenceSyntaxSugar(previousPath); - - if (ExecutionContainsCyclesRecurse(nextEndpoint, pathUpToSequenceSyntaxSugar)) - { - return true; - } - } + return false; } - } - - return false; + }); } - bool AbstractCodeModel::ExecutionContainsCyclesRecurse(const EndpointResolved& in, AZStd::unordered_set& previousPath) const + bool AbstractCodeModel::ExecutionContainsCyclesCheck(const Node& node, const Slot& outSlot) { - if (previousPath.contains(in.second)) - { - return true; - } - - if (!in.second) + if (ExecutionContainsCycles(node, outSlot)) { - // the error will come later in parsing in a more readable way - return false; - } - - AZStd::vector outSlots; + AddError(nullptr, aznew Internal::ParseError(node.GetEntityId(), AZStd::string::format + ( "Execution cycle detected (see connections to %s-%s. Use a looping node like While or For" + , node.GetDebugName().data(), outSlot.GetName().data()).data())); - if (in.second->IsLatent()) - { - outSlots.push_back(in.second); + return true; } else { - previousPath.insert(in.second); - - auto outSlotsOutcome = in.first->GetSlotsInExecutionThreadByType(*in.second, CombinedSlotType::ExecutionOut); - if (!outSlotsOutcome.IsSuccess()) - { - AddError(in.first->GetEntityId(), nullptr, outSlotsOutcome.GetError().data()); - return true; - } - - outSlots = outSlotsOutcome.GetValue(); - } - - for (auto branch : outSlots) - { - auto nextEndpoints = in.first->GetConnectedNodes(*branch); - AZStd::unordered_set pathUpToBranchOrSyntaxSugar(previousPath); - - if (ExecutionContainsCyclesRecurse(nextEndpoints, pathUpToBranchOrSyntaxSugar)) - { - return true; - } - } - - return false; - } - - AZStd::vector AbstractCodeModel::FindAllVariablesInVariableFlagScope(VariableFlags::Scope scope) const - { - AZStd::vector variables; - auto& sourceVariables = m_source.m_variableData->GetVariables(); - - for (auto& variable : m_variables) - { - if (IsSourceInScope(variable, scope)) - { - variables.push_back(variable); - } + return false; } - - // sort by variable id - AZStd::sort(variables.begin(), variables.end(), [](const auto& lhs, const auto& rhs) { return lhs->m_sourceVariableId < rhs->m_sourceVariableId; }); - return variables; } AbstractCodeModel::ReturnValueConnections AbstractCodeModel::FindAssignments(ExecutionTreeConstPtr execution, const Slot& output) @@ -1637,7 +1550,7 @@ namespace ScriptCanvas return nullptr; } - VariableConstPtr AbstractCodeModel::FindMemberVariable(const AZ::EntityId& sourceNodeId) const + VariableConstPtr AbstractCodeModel::FindVariable(const AZ::EntityId& sourceNodeId) const { auto resultIter = AZStd::find_if ( m_variables.begin() @@ -1647,7 +1560,7 @@ namespace ScriptCanvas return resultIter != m_variables.end() ? *resultIter : nullptr; } - VariableConstPtr AbstractCodeModel::FindMemberVariable(const VariableId& sourceVariableId) const + VariableConstPtr AbstractCodeModel::FindVariable(const VariableId& sourceVariableId) const { auto resultIter = AZStd::find_if ( m_variables.begin() @@ -1657,11 +1570,35 @@ namespace ScriptCanvas return resultIter != m_variables.end() ? *resultIter : nullptr; } + AZStd::optional AbstractCodeModel::FindNodeableSimpleName(VariableConstPtr variable) const + { + if (IsUserNodeable(variable)) + { + auto iter = AZStd::find_if(m_nodeablesByNode.begin(), m_nodeablesByNode.end(), [&variable](auto& candidate){ return candidate.second->m_nodeable == variable; }); + if (iter != m_nodeablesByNode.end()) + { + return iter->second->m_simpleName; + } + } + + return {}; + } + + const AZStd::pair* AbstractCodeModel::FindStaticVariable(VariableConstPtr variable) const + { + auto iter = AZStd::find_if + (m_staticVariableNames.begin() + , m_staticVariableNames.end() + , [&](const auto& candidate) { return candidate.first == variable; }); + + return (iter != m_staticVariableNames.end()) ? iter : nullptr; + } + VariableConstPtr AbstractCodeModel::FindReferencedVariableChecked(ExecutionTreeConstPtr execution, const Slot& slot) const { if (slot.IsVariableReference()) { - if (auto variable = FindMemberVariable(slot.GetVariableReference())) + if (auto variable = FindVariable(slot.GetVariableReference())) { return variable; } @@ -1679,37 +1616,117 @@ namespace ScriptCanvas AZStd::pair AbstractCodeModel::FindReturnValueOnThread(ExecutionTreeConstPtr executionNode, const Node* node, const Slot* slot) const { - auto execution = executionNode; - - while (execution) + auto root = executionNode->GetRoot(); + if (root && IsUserFunctionDefinition(root)) { - if (execution->GetId().m_node == node) + for (size_t index(0); index < root->GetReturnValueCount(); ++index) { - for (size_t index(0); index < execution->GetReturnValueCount(); ++index) + auto returnValue = root->GetReturnValue(index); + + if (returnValue.second->m_source->m_sourceSlotId == slot->GetId()) { - auto returnValue = execution->GetReturnValue(index); + // #functions2 slot<->variable determine if the root or the function call should be passed in here...the slot/node lead to the user call on the thread, but it may not even be created yet + return AZStd::make_pair(root, returnValue.second->m_source); + } + } + } + else + { + auto execution = executionNode; - if (returnValue.second->m_source->m_sourceSlotId == slot->GetId()) + while (execution) + { + if (execution->GetId().m_node == node) + { + for (size_t index(0); index < execution->GetReturnValueCount(); ++index) { - return AZStd::make_pair(execution, returnValue.second->m_source); + auto returnValue = execution->GetReturnValue(index); + + if (returnValue.second->m_source->m_sourceSlotId == slot->GetId()) + { + return AZStd::make_pair(execution, returnValue.second->m_source); + } } } + + execution = execution->GetParent(); } - execution = execution->GetParent(); } return {}; - } + } - AZStd::vector AbstractCodeModel::FindSubGraphInputValues() const + AZStd::vector AbstractCodeModel::FindUserImmediateInput(ExecutionTreePtr call) const { - return FindAllVariablesInVariableFlagScope(VariableFlags::Scope::Input); + AZStd::vector inputsVariables; + + const auto inputs = call->GetId().m_node->GetSlotsByType(CombinedSlotType::DataOut); + + for (const auto& input : inputs) + { + auto iter = m_inputVariableByNodelingInSlot.find(input); + if (iter != m_inputVariableByNodelingInSlot.end()) + { + VariablePtr variable = iter->second; + const Slot* slot = iter->first; + variable->m_name = call->ModScope()->AddVariableName(slot->GetName()); + variable->m_source = call; + inputsVariables.push_back(variable); + } + } + + return inputsVariables; } - AZStd::vector AbstractCodeModel::FindSubGraphOutputValues() const + const AbstractCodeModel::ReturnValueDescription* AbstractCodeModel::FindUserImmediateOutput(ExecutionTreePtr call) const { - return FindAllVariablesInVariableFlagScope(VariableFlags::Scope::Output); + auto iter = m_returnValuesByUserFunctionDefinition.find(azrtti_cast(call->GetId().m_node)); + return iter != m_returnValuesByUserFunctionDefinition.end() ? &iter->second : nullptr; + } + + AZStd::vector AbstractCodeModel::FindUserLatentOutput(ExecutionTreePtr call) const + { + AZStd::vector outputVariables; + + const auto outputs = call->GetId().m_node->GetSlotsByType(CombinedSlotType::DataIn); + + for (const auto& output : outputs) + { + auto iter = m_outputVariableByNodelingOutSlot.find(output); + if (iter != m_outputVariableByNodelingOutSlot.end()) + { + VariablePtr variable = iter->second; + const Slot* slot = iter->first; + variable->m_name = call->ModScope()->AddVariableName(slot->GetName()); + variable->m_source = call; + outputVariables.push_back(variable); + } + } + + return outputVariables; + } + + AZStd::vector AbstractCodeModel::FindUserLatentReturnValues(ExecutionTreePtr call) const + { + AZStd::vector returnValues; + + const auto outputs = call->GetId().m_node->GetSlotsByType(CombinedSlotType::DataOut); + + for (const auto& output : outputs) + { + auto iter = m_returnVariableByNodelingOutSlot.find(output); + if (iter != m_returnVariableByNodelingOutSlot.end()) + { + VariablePtr variable = iter->second; + const Slot* slot = iter->first; + variable->m_name = call->ModScope()->AddVariableName(slot->GetName()); + variable->m_source = call; + returnValues.push_back(iter->second); + } + } + + return returnValues; } AZStd::vector AbstractCodeModel::GetAllExecutionRoots() const @@ -1791,9 +1808,14 @@ namespace ScriptCanvas return iter != m_debugMapReverse.m_variableSets.end() ? &iter->second : nullptr; } - const DependencyReport& AbstractCodeModel::GetDependencies() const + const DebugSymbolMap& AbstractCodeModel::GetDebugMap() const { - return m_dependencies; + return m_debugMap; + } + + const OrderedDependencies& AbstractCodeModel::GetOrderedDependencies() const + { + return m_orderedDependencies; } EBusHandlingConstPtr AbstractCodeModel::GetEBusEventHandling(const Node* node) const @@ -1855,66 +1877,55 @@ namespace ScriptCanvas return m_subgraphInterface; } - AZStd::vector AbstractCodeModel::GetLocalVariablesUser() const + const AZStd::unordered_set* AbstractCodeModel::GetLocalVariables(ExecutionTreeConstPtr execution) const { - AZStd::vector userLocalVariables; - - if (m_variableScopeMeaning == VariableScopeMeaning::FunctionPrototype) - { - for (auto variable : m_variables) - { - if (!variable->m_isMember - && variable->m_sourceVariableId.IsValid() - && !IsSourceInScope(variable, VariableFlags::Scope::Input) - && !IsSourceInScope(variable, VariableFlags::Scope::Output)) - { - userLocalVariables.push_back(variable); - } - } - } - - return userLocalVariables; + auto iter = m_variableUseByExecution.find(execution); + return iter != m_variableUseByExecution.end() ? &iter->second.localVariables : nullptr; } - AZStd::vector AbstractCodeModel::GetMemberVariables() const + AZStd::vector AbstractCodeModel::GetNodeableParse() const { - AZStd::vector memberVariables; + AZStd::vector nodeableParse; - for (auto variable : m_variables) + for (auto iter : m_nodeablesByNode) { - if (variable->m_isMember) - { - memberVariables.push_back(variable); - } + nodeableParse.push_back(iter.second); } - return memberVariables; + return nodeableParse; } - AZStd::vector AbstractCodeModel::GetNodeableParse() const + AZStd::string AbstractCodeModel::GetOriginalVariableName(VariableConstPtr variable, const Node* node) { - AZStd::vector nodeableParse; - - for (auto iter : m_nodeablesByNode) + if (variable->m_sourceVariableId.IsValid()) { - nodeableParse.push_back(iter.second); + auto graphVariable = m_source.m_variableData->FindVariable(variable->m_sourceVariableId); + if (graphVariable) + { + return graphVariable->GetVariableName(); + } + else + { + AddError(AZ::EntityId(), nullptr, AZStd::string::format("Missing graph variable by source variable id: %s", variable->m_sourceVariableId.ToString().data()).c_str()); + } } - - return nodeableParse; - } - - AZStd::string AbstractCodeModel::GetOriginalVariableName(const VariableId& sourceVariableId) - { - auto variable = m_source.m_variableData->FindVariable(sourceVariableId); - if (variable) + else if (node && variable->m_sourceSlotId.IsValid()) { - return variable->GetVariableName(); + if (auto slot = node->GetSlot(variable->m_sourceSlotId)) + { + return slot->GetName(); + } + else + { + AddError(AZ::EntityId(), nullptr, AZStd::string::format("Missing graph variable by source slot id: %s", variable->m_sourceSlotId.ToString().data()).c_str()); + } } else { - AddError(AZ::EntityId(), nullptr, AZStd::string::format("Missing variable by id: %s", sourceVariableId.ToString().data()).c_str()); - return ""; + AddError(AZ::EntityId(), nullptr, AZStd::string::format("Can't find original slot/variable name for parsed variable")); } + + return ""; } AZStd::string AbstractCodeModel::GetOutputSlotNameOverride(ExecutionTreePtr execution, const Slot& outputSlot) @@ -1943,7 +1954,7 @@ namespace ScriptCanvas return m_parseDuration; } - ExecutionCharacteristics AbstractCodeModel::GetRuntimeCharacteristics() const + ExecutionCharacteristics AbstractCodeModel::GetExecutionCharacteristics() const { return m_subgraphInterface.GetExecutionCharacteristics(); } @@ -1951,7 +1962,12 @@ namespace ScriptCanvas VariableConstPtr AbstractCodeModel::GetReadVariable(ExecutionTreePtr execution) { VariableId variableId = execution->GetId().m_node->GetVariableIdRead(execution->GetId().m_slot); - return variableId.IsValid() ? FindMemberVariable(variableId) : nullptr; + return variableId.IsValid() ? FindVariable(variableId) : nullptr; + } + + const ParsedRuntimeInputs& AbstractCodeModel::GetRuntimeInputs() const + { + return m_runtimeInputs; } const Source& AbstractCodeModel::GetSource() const @@ -1964,20 +1980,25 @@ namespace ScriptCanvas return m_source.m_assetIdString; } - ExecutionTreeConstPtr AbstractCodeModel::GetStart() const + const AZStd::vector>& AbstractCodeModel::GetStaticVariablesNames() const { - return m_start; + return m_staticVariableNames; } - VariableScopeMeaning AbstractCodeModel::GetVariableScopeMeaning() const + const AZStd::vector>& AbstractCodeModel::GetStaticVariablesNames(ExecutionTreeConstPtr functionBlock) const { - return m_variableScopeMeaning; + return const_cast(this)->ModStaticVariablesNames(functionBlock); + } + + ExecutionTreeConstPtr AbstractCodeModel::GetStart() const + { + return m_start; } VariableConstPtr AbstractCodeModel::GetWrittenVariable(ExecutionTreePtr execution) { VariableId variableId = execution->GetId().m_node->GetVariableIdWritten(execution->GetId().m_slot); - return variableId.IsValid() ? FindMemberVariable(variableId) : nullptr; + return variableId.IsValid() ? FindVariable(variableId) : nullptr; } VariableWriteHandlingConstPtr AbstractCodeModel::GetVariableHandling(const Slot* slot) const @@ -2047,7 +2068,7 @@ namespace ScriptCanvas for (auto outSlot : combinedOutSlots) { - SlotsOutcome outcome = node.GetSlotsInExecutionThreadByType(*outSlot, CombinedSlotType::DataOut); + ConstSlotsOutcome outcome = node.GetSlotsInExecutionThreadByType(*outSlot, CombinedSlotType::DataOut); if (outcome.IsSuccess()) { @@ -2102,8 +2123,8 @@ namespace ScriptCanvas bool AbstractCodeModel::IsUserNodeable() const { - return m_variableScopeMeaning == VariableScopeMeaning::FunctionPrototype - && !IsPureLibrary(); + // #functions2 check the subgraph interface for IsUserNodeable vs User variable + return !IsPureLibrary(); } bool AbstractCodeModel::IsUserNodeable(VariableConstPtr variable) const @@ -2111,14 +2132,6 @@ namespace ScriptCanvas return m_userNodeables.contains(variable); } - void AbstractCodeModel::MarkAllFunctionsPure() - { - for (auto function : ModAllExecutionRoots()) - { - function->MarkPure(); - } - } - void AbstractCodeModel::MarkParseStart() { m_parseStartTime = AZStd::chrono::system_clock::now(); @@ -2172,6 +2185,22 @@ namespace ScriptCanvas return roots; } + AZStd::vector>& AbstractCodeModel::ModStaticVariablesNames() + { + return m_staticVariableNames; + } + + AZStd::vector>& AbstractCodeModel::ModStaticVariablesNames(Grammar::ExecutionTreeConstPtr functionBlock) + { + auto iter = m_staticVariableNamesByFunctionBlock.find(functionBlock); + if (iter == m_staticVariableNamesByFunctionBlock.end()) + { + iter = m_staticVariableNamesByFunctionBlock.insert(AZStd::make_pair(functionBlock, AZStd::vector>())).first; + } + + return iter->second; + } + ExecutionTreePtr AbstractCodeModel::OpenScope(ExecutionTreePtr parent, const Node* node, const Slot* outSlot) const { ExecutionTreePtr child = CreateChild(parent, node, outSlot); @@ -2186,16 +2215,17 @@ namespace ScriptCanvas m_subgraphInterface.SetNamespacePath(m_source.m_namespacePath); +#if defined(FUNCTION_LEGACY_SUPPORT_ENABLED) if (m_source.m_graph->IsFunctionGraph()) { - m_variableScopeMeaning = VariableScopeMeaning::FunctionPrototype; + m_variableScopeMeaning = VariableScopeMeaning_LegacyFunctions::FunctionPrototype; m_subgraphInterface.MarkAllInputOutputShared(); } else { - m_variableScopeMeaning = VariableScopeMeaning::ValueInitialization; + m_variableScopeMeaning = VariableScopeMeaning_LegacyFunctions::ValueInitialization; } - +#endif AddAllVariablesPreParse(); for (auto& nodeEntity : m_source.m_graphData->m_nodes) @@ -2221,7 +2251,6 @@ namespace ScriptCanvas } ParseAutoConnectedEBusHandlerVariables(); - Parse(m_startNodes); for (auto node : m_possibleExecutionRoots) @@ -2231,36 +2260,16 @@ namespace ScriptCanvas ParseVariableHandling(); ParseUserFunctionTopology(); - - if (m_ebusHandlingByNode.empty() - && m_eventHandlingByNode.empty() - && m_nodeablesByNode.empty() - && m_variableWriteHandlingByVariable.empty() - && GetMemberVariables().empty() - && m_subgraphInterface.IsParsedPure()) - { - m_subgraphInterface.MarkExecutionCharacteristics(ExecutionCharacteristics::Pure); - } - else - { - m_subgraphInterface.MarkExecutionCharacteristics(ExecutionCharacteristics::PerEntity); - } + ParseConstructionInputVariables(); + ParseExecutionCharacteristics(); // from here on, nothing more needs to happen during simple parsing // for example, in the editor, to get validation on syntax based effects for the view // parsing could stop now - if (m_subgraphInterface.GetExecutionCharacteristics() == ExecutionCharacteristics::Pure) - { - MarkAllFunctionsPure(); - } - else - { - ParseDeactivation(); - } - if (IsErrorFree()) { + ParseDependenciesAssetIndicies(); ConvertNamesToIdentifiers(); if (m_source.m_addDebugInfo) @@ -2287,7 +2296,9 @@ namespace ScriptCanvas { AZStd::string pretty; PrettyPrint(pretty, *this); - AZ_TracePrintf("SC", "%s", pretty.data()); + AZ_TracePrintf("ScriptCanvas", "%s", pretty.data()); + AZ_TracePrintf("ScriptCanvas", "SubgraphInterface:"); + AZ_TracePrintf("ScriptCanvas", ToString(m_subgraphInterface).data()); } AZ_TracePrintf("Script Canvas", "Parse Duration: %8.4f ms\n", m_parseDuration / 1000.0); @@ -2319,7 +2330,7 @@ namespace ScriptCanvas // mark all of these variables as handler control addresses auto addressSlot = nodeAndHandling.first->GetEBusConnectAddressSlot(); AZ_Assert(addressSlot, "addressed ebus handler node must have address slot."); - CreateVariableWriteHandling(*addressSlot, ebusHandling->m_startingAdress, nodeAndHandling.first->HandlerStartsConnected()); + CreateVariableWriteHandling(*addressSlot, ebusHandling->m_startingAdress, nodeAndHandling.first->IsAutoConnected()); VariableWriteHandlingPtr addressChangeHandling = AZStd::const_pointer_cast(GetVariableHandling(addressSlot)); AZ_Assert(addressChangeHandling != nullptr, "failure to create variable handling for ebus address"); ExecutionTreePtr onAddressChange = OpenScope(nullptr, nodeAndHandling.first, nullptr); @@ -2369,6 +2380,8 @@ namespace ScriptCanvas ExecutionTreePtr childStartCall = CreateChild(start, node, nullptr); childStartCall->SetSymbol(Symbol::FunctionCall); childStartCall->SetName(k_OnGraphStartFunctionName); + childStartCall->MarkStart(); + auto lexicalScopeOutcome = node->GetFunctionCallLexicalScope(nullptr); if (lexicalScopeOutcome.IsSuccess()) @@ -2400,7 +2413,7 @@ namespace ScriptCanvas return; } - if (ExecutionContainsCycles(node, *outSlot)) + if (ExecutionContainsCyclesCheck(node, *outSlot)) { return; } @@ -2416,6 +2429,7 @@ namespace ScriptCanvas if (!outSlots.empty()) { start->AddChild({ outSlots[0], {}, nullptr }); + start->MarkStart(); ParseExecutionMultipleOutSyntaxSugar(start, outNodes, outSlots); PostParseProcess(start); @@ -2458,16 +2472,18 @@ namespace ScriptCanvas return false; } - // check for errors on validation here - if (!node.IsSupportedByNewBackend()) + if (auto functionNode = azrtti_cast(&node)) { - AZ_TracePrintf("ScriptCanvas", - AZStd::string::format("Node (%s) is not supported by new backend, please convert/remove it. %s", node.GetNodeName().c_str(), NodeCompatiliblity::k_newBackendMigrationGuideLink.c_str()).c_str()); - AddError(nullptr, aznew NodeCompatiliblity::NewBackendUnsupportedNode(node.GetEntityId(), node.GetNodeName())); - return false; - } + Nodes::Core::FunctionCallNodeCompareConfig config; - if (node.IsOutOfDate(m_source.m_graph->GetVersion())) + if (functionNode->IsOutOfDate(config)) + { + AZ_Warning("ScriptCanvas", false, "%s node is out-of-date.", node.GetNodeName().c_str()); + AddError(nullptr, aznew NodeCompatiliblity::NodeOutOfDate(node.GetEntityId(), node.GetNodeName())); + return false; + } + } + else if (node.IsOutOfDate(m_source.m_graph->GetVersion())) { AZ_Warning("ScriptCanvas", false, "%s node is out-of-date.", node.GetNodeName().c_str()); AddError(nullptr, aznew NodeCompatiliblity::NodeOutOfDate(node.GetEntityId(), node.GetNodeName())); @@ -2594,7 +2610,107 @@ namespace ScriptCanvas return nullptr; } - SlotsOutcome AbstractCodeModel::ParseDataOutSlots(ExecutionTreePtr execution, ExecutionChild& executionChild) const + void AbstractCodeModel::ParseConstructionInputVariables() + { + AZ::SerializeContext* serializeContext = AZ::EntityUtils::GetApplicationSerializeContext(); + AZStd::vector> nodeablesById; + AZStd::vector inputVariableIds; + AZStd::unordered_map inputVariablesById; + + for (auto variable : GetVariables()) + { + auto constructionRequirement = ParseConstructionRequirement(variable); + + switch (constructionRequirement) + { + case VariableConstructionRequirement::None: + break; + + case VariableConstructionRequirement::InputEntityId: + { + m_runtimeInputs.m_entityIds.emplace_back(variable->m_sourceVariableId, *variable->m_datum.GetAs()); + } + break; + + case VariableConstructionRequirement::InputNodeable: + { + // I solemnly swear no harm shall come to the nodeable + const Nodeable* nodeableSource = reinterpret_cast(variable->m_datum.GetAsDanger()); + AZ_Assert(nodeableSource != nullptr, "the must be a raw nodeable held by this pointer"); + AZ_Assert(azrtti_typeid(nodeableSource) != azrtti_typeid(), "type problem with nodeable"); + nodeablesById.push_back({ variable->m_nodeableNodeId, const_cast(nodeableSource) }); + } + break; + + case VariableConstructionRequirement::InputVariable: + { + inputVariableIds.push_back(variable->m_sourceVariableId); + inputVariablesById.insert({ variable->m_sourceVariableId, variable }); + // sort revealed a datum copy issue: type is not preserved, workaround below + // m_runtimeInputs.m_variables.emplace_back(variable->m_sourceVariableId, variable->m_datum); + } + break; + + case VariableConstructionRequirement::Static: + m_runtimeInputs.m_staticVariables.push_back({ variable->m_sourceVariableId, variable->m_datum.ToAny() }); + break; + + default: + AZ_Assert(constructionRequirement == VariableConstructionRequirement::None, "new requirement added and not handled"); + break; + } + } + + AZStd::sort(nodeablesById.begin(), nodeablesById.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); + + m_runtimeInputs.m_nodeables.reserve(nodeablesById.size()); + for (auto& idAndNodeable : nodeablesById) + { + m_runtimeInputs.m_nodeables.push_back(idAndNodeable.second); + } + + // sort revealed a datum copy issue: type is not preserved, workaround below + // AZStd::sort(m_runtimeInputs.m_variables.begin(), m_runtimeInputs.m_variables.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); + m_runtimeInputs.m_variables.reserve(inputVariableIds.size()); + AZStd::sort(inputVariableIds.begin(), inputVariableIds.end()); + for (auto variableId : inputVariableIds) + { + auto iter = inputVariablesById.find(variableId); + AZ_Assert(iter != inputVariablesById.end(), "missing variable id from list just constructed"); + m_runtimeInputs.m_variables.emplace_back(iter->first, iter->second->m_datum); + } + + AZStd::sort(m_runtimeInputs.m_entityIds.begin(), m_runtimeInputs.m_entityIds.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); + AZStd::sort(m_runtimeInputs.m_staticVariables.begin(), m_runtimeInputs.m_staticVariables.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); + + auto allStaticVariables = ToVariableList(m_runtimeInputs.m_staticVariables); + auto& staticVariableNames = ModStaticVariablesNames(); + + for (auto staticVariable : allStaticVariables) + { + AZStd::string name = AddTranslationVariableName(AZStd::string::format("s_%sCloneSource", staticVariable->m_name.c_str())); + staticVariableNames.push_back({ staticVariable, name }); + + if (!staticVariable->m_isMember) + { + if (staticVariable->m_source) + { + ModStaticVariablesNames(staticVariable->m_source).push_back({ staticVariable, name }); + } + else + { + AddError(nullptr, aznew Internal::ParseError(AZ::EntityId(), "Missing source for local variable that requires static initializer")); + } + } + } + + if (!(m_runtimeInputs.m_nodeables.empty() && m_runtimeInputs.m_variables.empty() && m_runtimeInputs.m_entityIds.empty())) + { + m_subgraphInterface.MarkRequiresConstructionParameters(); + } + } + + ConstSlotsOutcome AbstractCodeModel::ParseDataOutSlots(ExecutionTreePtr execution, ExecutionChild& executionChild) const { if (!execution->GetId().m_node) { @@ -2617,14 +2733,14 @@ namespace ScriptCanvas void AbstractCodeModel::ParseDeactivation() { - if (m_variableScopeMeaning != VariableScopeMeaning::FunctionPrototype || !IsPureLibrary()) + AZStd::vector> deactivatables = GetAllDeactivationVariables(); + + if (!IsPureLibrary() || !deactivatables.empty()) { ExecutionTreePtr deactivate = OpenScope(nullptr, nullptr, nullptr); deactivate->SetSymbol(Symbol::FunctionDefinition); deactivate->SetName(k_DeactivateName); - AZStd::vector> deactivatables = GetAllDeactivationVariables(); - if (deactivatables.empty()) { ExecutionTreePtr empty = CreateChild(deactivate, nullptr, nullptr); @@ -2716,6 +2832,8 @@ namespace ScriptCanvas { const auto& dependencies = dependencyOutcome.GetValue(); + // #functions2 this search needs to recurse, this layer of dependencies will only be one step deep + // currently this problem is found by the asset processor if (dependencies.userSubgraphs.find(m_source.m_namespacePath) != dependencies.userSubgraphs.end()) { AZStd::string circularDependency = AZStd::string::format @@ -2727,7 +2845,8 @@ namespace ScriptCanvas AddError(nullptr, aznew Internal::ParseError(node.GetEntityId(), circularDependency)); } - m_dependencies.MergeWith(dependencies); + // this part must NOT recurse, the dependency tree should remain a tree and not be flattened + m_orderedDependencies.source.MergeWith(dependencies); } else { @@ -2750,6 +2869,14 @@ namespace ScriptCanvas } } + void AbstractCodeModel::ParseDependenciesAssetIndicies() + { + for (const auto& subgraphAssetID : m_orderedDependencies.source.userSubgraphAssetIds) + { + m_orderedDependencies.orderedAssetIds.push_back(subgraphAssetID); + } + } + void AbstractCodeModel::ParseEntityIdInput(ExecutionTreePtr execution) { for (size_t index(0); index < execution->GetInputCount(); ++index) @@ -2785,6 +2912,96 @@ namespace ScriptCanvas } } + void AbstractCodeModel::ParseExecutionCharacteristics() + { + // parse each function, individually, but not the start function + // if all functions are pure, mark the start function pure + bool allRootsArePure = true; + auto roots = ModAllExecutionRoots(); + for (auto root : roots) + { + if (root != m_start) + { + ParseExecutionCharacteristics(root); + const bool rootIsPure = root->IsPure(); + allRootsArePure = allRootsArePure && rootIsPure; + + if (rootIsPure) + { + if (auto functionDefNode = azrtti_cast(root->GetId().m_node)) + { + if (auto in = m_subgraphInterface.ModIn(functionDefNode->GetIdentifier())) + { + in->isPure = true; + } + else + { + AddError(root->GetId().m_node->GetEntityId(), root, "Accounting error, missing Execution-In in SubgraphInterface."); + } + } + } + } + } + + // The start function gets special handling. If all of the rest of the graph can be considered pure, than no matter what, + // the start function will only run once. Therefore all the member variables are local to start (if used at all), and + // the start function itself can be considered pure. + if (m_start) + { + // The start function is only parsed for variable use. This way, if the graph is in all other ways pure, the + // start function can be pure, even if it has nodes like Cycle or Once. The state of those nodes can now be + // considered local state. + ParseVariableUseAndPurity(m_start); + } + + CullUnusedVariables(); + + if (allRootsArePure + && m_ebusHandlingByNode.empty() + && m_eventHandlingByNode.empty() + && m_nodeablesByNode.empty() + && m_variableWriteHandlingByVariable.empty() + && m_subgraphInterface.IsParsedPure()) + { + if (m_start) + { + m_start->MarkPure(); + ConvertAllMemberVariablesToLocal(m_start); + } + + m_subgraphInterface.MarkExecutionCharacteristics(ExecutionCharacteristics::Pure); + } + else + { + m_subgraphInterface.MarkExecutionCharacteristics(ExecutionCharacteristics::Object); + } + + if (m_subgraphInterface.GetExecutionCharacteristics() == ExecutionCharacteristics::Object) + { + ParseDeactivation(); + } + } + + void AbstractCodeModel::ParseExecutionCharacteristics(ExecutionTreePtr execution) + { + if (!ParseVariableUseAndPurity(execution)) + { + return; + } + + if (execution->IsOnLatentPath()) + { + return; + } + + if (execution->HasExplicitUserOutCalls()) + { + return; + } + + execution->MarkPure(); + } + void AbstractCodeModel::ParseExecutionCycleStatement(ExecutionTreePtr executionCycle) { auto cycleVariableIter = m_controlVariablesBySourceNode.find(executionCycle->GetId().m_node); @@ -3560,7 +3777,7 @@ namespace ScriptCanvas { ParseExecutionBreak(execution); } - else if (IsUserOut(execution)) + else if (IsUserOutNode(execution)) { ParseUserOutCall(execution); } @@ -3645,7 +3862,7 @@ namespace ScriptCanvas ExecutionTreePtr AbstractCodeModel::ParseExecutionTreeRoot(const Node& node, const Slot& outSlot, MarkLatent markLatent) { - if (ExecutionContainsCycles(node, outSlot)) + if (ExecutionContainsCyclesCheck(node, outSlot)) { return nullptr; } @@ -3811,8 +4028,34 @@ namespace ScriptCanvas return; } - if (!ExecutionContainsCycles(node, *outSlots.front())) + if (!ExecutionContainsCyclesCheck(node, *outSlots.front())) { + auto definition = userFunctionIter->second; + auto entrySlot = definition->GetId().m_slot; + AZ_Assert(entrySlot, "Bad accounting in user function definition node"); + AZStd::vector returnValues; + UserOutCallCollector userOutCallCollector; + TraverseExecutionConnections(node, *entrySlot, userOutCallCollector); + + const AZStd::unordered_set& uniqueNodelingsOut = userOutCallCollector.GetOutCalls(); + for (const auto& returnCall : uniqueNodelingsOut) + { + for (const auto returnSlot : returnCall->GetSlotsByType(CombinedSlotType::DataIn)) + { + auto iter = m_outputVariableByNodelingOutSlot.find(returnSlot); + if (iter != m_outputVariableByNodelingOutSlot.end()) + { + VariablePtr variable = iter->second; + variable->m_name = definition->ModScope()->AddVariableName(returnSlot->GetName()); + variable->m_source = definition; + variable->m_sourceSlotId = returnSlot->GetId(); + returnValues.push_back(variable); + } + } + } + + m_returnValuesByUserFunctionDefinition.insert(AZStd::make_pair(nodeling, ReturnValueDescription{ returnValues, uniqueNodelingsOut.size() })); + if (auto root = ParseExecutionTreeRoot(userFunctionIter->second)) { m_functions.push_back(root); @@ -3845,6 +4088,14 @@ namespace ScriptCanvas auto onceControl = AddMemberVariable(Datum(Data::BooleanType(true)), "onceControl"); m_controlVariablesBySourceNode.insert({ &node, onceControl }); } + else + { + const auto nodelingType = CheckNodelingType(node); + if (nodelingType != NodelingType::None) + { + ParseNodelingVariables(node, nodelingType); + } + } } void AbstractCodeModel::ParseInputData(ExecutionTreePtr execution) @@ -3865,7 +4116,7 @@ namespace ScriptCanvas else if (IsVariableGet(execution)) { const VariableId assignedFromId = execution->GetId().m_node->GetVariableIdRead(execution->GetId().m_slot); - auto variableRead = assignedFromId.IsValid() ? FindMemberVariable(assignedFromId) : nullptr; + auto variableRead = assignedFromId.IsValid() ? FindVariable(assignedFromId) : nullptr; if (variableRead) { @@ -4013,7 +4264,7 @@ namespace ScriptCanvas } else if (CheckEventHandlingType(*node) == EventHandingType::Event) { - if (auto variable = FindMemberVariable(execution->GetNodeId())) + if (auto variable = FindVariable(execution->GetNodeId())) { execution->AddInput({ nullptr, variable, DebugDataSource::FromInternal() }); } @@ -4041,7 +4292,7 @@ namespace ScriptCanvas } else if (node->IsNodeableNode()) { - if (auto variable = FindMemberVariable(execution->GetNodeId())) + if (auto variable = FindVariable(execution->GetNodeId())) { execution->AddInput({ nullptr, variable, DebugDataSource::FromInternal() }); } @@ -4077,6 +4328,67 @@ namespace ScriptCanvas void AbstractCodeModel::ParseMultiExecutionPre(ExecutionTreePtr execution) { ParsePropertyExtractionsPre(execution); + } + + void AbstractCodeModel::ParseNodelingVariables(const Node& node, NodelingType nodelingType) + { + // #functions2 slot<->variable adjust once datums are more coordinated + auto createVariablesSlots = [&](AZStd::unordered_map& variablesBySlots, const AZStd::vector& slots, bool slotHasDatum) + { + for (const auto& slot : slots) + { + auto variable = AZStd::make_shared(); + + if (slotHasDatum) + { + auto variableDatum = slot->FindDatum(); + if (!variableDatum) + { + AddError(nullptr, aznew Internal::ParseError(node.GetEntityId(), AZStd::string::format("Datum missing from Slot %s on Node %s", slot->GetName().data(), node.GetNodeName().c_str()))); + return; + } + + // #functions2 slot<->variable consider getting all variables from the UX variable manager, or from the ACM and looking them up in the variable manager for ordering +// auto iter = m_sourceVariableByDatum.find(variableDatum); +// if (iter == m_sourceVariableByDatum.end()) +// { +// AddError(nullptr, aznew Internal::ParseError(node.GetEntityId(), AZStd::string::format("Datum missing from Slot %s on Node %s", slot->GetName().data(), node.GetNodeName().c_str()))); +// return; +// } +// variable->m_sourceVariableId = iter->second->GetVariableId(); + variable->m_datum = *variableDatum; + } + else + { + // make a new datum and a source slot id and all that + variable->m_datum.SetType(slot->GetDataType()); + } + + // Scope and name are initialized later + variable->m_sourceSlotId = slot->GetId(); + variablesBySlots.insert({ slot, variable }); + m_variables.push_back(variable); + } + }; + + if (nodelingType == NodelingType::In) + { + // get the output slots of the In-Nodeling + const auto inputs = node.GetSlotsByType(CombinedSlotType::DataOut); + createVariablesSlots(m_inputVariableByNodelingInSlot, inputs, false); + } + else if (nodelingType == NodelingType::Out) + { + // get the input slots of the Out-Nodeling + const auto outputs = node.GetSlotsByType(CombinedSlotType::DataIn); + createVariablesSlots(m_outputVariableByNodelingOutSlot, outputs, true); + } + else if (nodelingType == NodelingType::OutReturn) + { + // get the output slots of the Out-Nodeling + const auto inputs = node.GetSlotsByType(CombinedSlotType::DataOut); + createVariablesSlots(m_returnVariableByNodelingOutSlot, inputs, false); + } } void AbstractCodeModel::ParseOperatorArithmetic(ExecutionTreePtr execution) @@ -4109,6 +4421,9 @@ namespace ScriptCanvas { if (const auto nodeling = azrtti_cast(execution->GetId().m_node)) { + // this nodeling will always be the Execution-In part of the function defintion + // since a call to a user out does not enter this path + AZ_Assert(execution->GetSymbol() != Symbol::UserOut, "User Out data should not be processed here"); ParseUserInData(execution, executionChild); return; } @@ -4310,19 +4625,6 @@ namespace ScriptCanvas ParseUserOuts(); m_subgraphInterface.Parse(); - - if (m_subgraphInterface.IsLatent()) - { - if (m_subgraphInterface.GetInCount() > 0) - { - AddError(AZ::EntityId(), nullptr, ParseErrors::SubgraphComplexity); - } - - if (!FindSubGraphInputValues().empty()) - { - AddError(AZ::EntityId(), nullptr, ParseErrors::SubgraphReturnValues); - } - } } void AbstractCodeModel::ParseUserIn(ExecutionTreePtr root, const Nodes::Core::FunctionDefinitionNode* nodeling) @@ -4331,7 +4633,7 @@ namespace ScriptCanvas size_t defaultAdded = 0; // get all the nodelings, all the leaves, and the calls to nodelings out - AbstractCodeModelCpp::NodelingInParserIterationListener listener; + NodelingInParserIterationListener listener; TraverseTree(root, listener); auto& leavesWithoutNodelings = listener.GetLeavesWithoutNodelings(); auto& outCalls = listener.GetOutCalls(); @@ -4354,12 +4656,12 @@ namespace ScriptCanvas { for (auto& leafWithout : leavesWithoutNodelings) { - AddUserOut(AZStd::const_pointer_cast(leafWithout), root, defaultOutName); + AddUserOutToLeaf(AZStd::const_pointer_cast(leafWithout), root, defaultOutName); } } // this is a sanity check now to verify there are no leaves - AbstractCodeModelCpp::NodelingInParserIterationListener listenerCheck; + NodelingInParserIterationListener listenerCheck; listenerCheck.CountOnlyGrammarCalls(); TraverseTree(root, listenerCheck); @@ -4382,7 +4684,7 @@ namespace ScriptCanvas const size_t branches = uniqueNodelingsOut.size() + defaultAdded; - if (result.addReturnValuesToOuts) + if (result.addExplicitOutCalls) { if (branches < 2) { @@ -4390,7 +4692,7 @@ namespace ScriptCanvas return; } - root->RouteReturnValuesToOuts(); + root->MarkHasExplicitUserOutCalls(); for (auto& outCall : outCallsChecked) { @@ -4418,7 +4720,7 @@ namespace ScriptCanvas uniqueNodelingsOut.insert(nullptr); } - if ((!root->ReturnValuesRoutedToOuts()) + if ((!root->HasExplicitUserOutCalls()) && root->GetReturnValueCount() > 0 && branches > 1) { @@ -4438,20 +4740,25 @@ namespace ScriptCanvas } else { - for (auto& inputValue : FindSubGraphInputValues()) + // inputs to the user function + const auto input = FindUserImmediateInput(execution); + for (auto& inputValue : input) { auto outputAssignment = CreateOutputAssignment(inputValue); inputValue->m_source = execution; executionChild.m_output.push_back({ nullptr, outputAssignment }); } - for (auto& outputValue : FindSubGraphOutputValues()) + // (all possible, even variant) output from the function + if (const auto output = FindUserImmediateOutput(execution)) { - ParseReturnValue(execution, outputValue, nullptr); - outputValue->m_source = execution; - AZStd::pair returnValue = execution->GetReturnValue(execution->GetReturnValueCount() - 1); - AZStd::const_pointer_cast(returnValue.second)->m_isNewValue = !IsSourceInScope(outputValue, VariableFlags::Scope::Input); - } + for (auto& outputValue : output->returnValues) + { + ParseReturnValue(execution, outputValue, nullptr); + AZStd::pair returnValue = execution->GetReturnValue(execution->GetReturnValueCount() - 1); + AZStd::const_pointer_cast(returnValue.second)->m_isNewValue = true; + } + } } } @@ -4464,21 +4771,24 @@ namespace ScriptCanvas // easy definition: syntax sugar where we give the user an Out for free result.addSingleOutToMap = true; result.addNewOutToLeavesWithout = false; - result.addReturnValuesToOuts = false; + result.addExplicitOutCalls = false; + result.isSimpleFunction = true; } else if (leavesWithoutNodelingsCount == 0) { // user defined every possible out result.addSingleOutToMap = false; result.addNewOutToLeavesWithout = false; - result.addReturnValuesToOuts = nodelingsOutCount > 1; + result.addExplicitOutCalls = nodelingsOutCount > 1; + result.isSimpleFunction = !result.addExplicitOutCalls; } else { - // user explicitly defined at least 1 Out, so we provide an out to any missing ones + // user explicitly defined at least 1 Out and there are execution leaves without Outs, so we provide an Out to any missing ones result.addSingleOutToMap = true; result.addNewOutToLeavesWithout = true; - result.addReturnValuesToOuts = true; + result.addExplicitOutCalls = true; + result.isSimpleFunction = false; } return result; @@ -4486,53 +4796,66 @@ namespace ScriptCanvas void AbstractCodeModel::ParseUserLatent(ExecutionTreePtr call, const Nodes::Core::FunctionDefinitionNode* nodeling) { + if (call && !call->GetRoot()) + { + AddError(call, aznew Internal::ParseError(call->GetNodeId(), "User Out call has no parent")); + return; + } + // process data values into the proper call ParseUserLatentData(call); // <- do this for very ACM node - // then - AddExecutionMapLatentOut(*nodeling, call); // <- do this once + AddExecutionMapLatentOut(*nodeling, call); // <- do this once for the nodeling + call->MarkHasExplicitUserOutCalls(); + call->ModRoot()->MarkHasExplicitUserOutCalls(); } void AbstractCodeModel::ParseUserLatentData(ExecutionTreePtr execution) { - if (execution->IsOnLatentPath()) - { - if (execution->GetChildrenCount() == 0) - { - execution->AddChild({ nullptr, {}, nullptr }); - } - - auto& executionChild = execution->ModChild(0); - - // inputs are return values expected from the latent out call - for (auto& returnValue : FindSubGraphInputValues()) - { - // if there are return values, we can continue execution after - // the nodeling out that is in the path (disable the contract) - // and we must make sure there's ONLY ONE - // and no immediate ins - auto outputAssignment = CreateOutputAssignment(returnValue); - executionChild.m_output.push_back({ nullptr, outputAssignment }); - } - - auto methodRoot = execution->ModRoot(); - - // outputs are inputs to the latent out call - for (auto& inputValue : FindSubGraphOutputValues()) - { - inputValue->m_source = methodRoot; - execution->AddInput({ nullptr, inputValue, DebugDataSource::FromVariable(SlotId{}, inputValue->m_datum.GetType(), inputValue->m_sourceVariableId) }); - } - - methodRoot->CopyInput(execution, ExecutionTree::RemapVariableSource::No); - } - else - { - AddError(execution, aznew Internal::ParseError(execution->GetNodeId(), "immediate execution parsed data in latent thread")); - } + if (execution->IsOnLatentPath()) + { + if (execution->GetChildrenCount() == 0) + { + execution->AddChild({ nullptr, {}, nullptr }); + } + + auto& executionChild = execution->ModChild(0); + + // inputs are return values expected from the latent out call + for (auto& returnValue : FindUserLatentReturnValues(execution)) + { + // if there are return values, we can continue execution after + // the nodeling out that is in the path (disable the contract) + // and we must make sure there's ONLY ONE + // and no immediate ins + auto outputAssignment = CreateOutputAssignment(returnValue); + executionChild.m_output.push_back({ nullptr, outputAssignment }); + } + + auto methodRoot = execution->ModRoot(); + + // outputs are inputs to the latent out call + for (auto& inputValue : FindUserLatentOutput(execution)) + { + inputValue->m_source = methodRoot; + execution->AddInput({ nullptr, inputValue, DebugDataSource::FromVariable(SlotId{}, inputValue->m_datum.GetType(), inputValue->m_sourceVariableId) }); + } + + methodRoot->CopyInput(execution, ExecutionTree::RemapVariableSource::No); + } + else + { + AddError(execution, aznew Internal::ParseError(execution->GetNodeId(), "immediate execution parsed data in latent thread")); + } } void AbstractCodeModel::ParseUserOutCall(ExecutionTreePtr execution) { + if (execution && !execution->GetRoot()) + { + AddError(execution, aznew Internal::ParseError(execution->GetNodeId(), "User Out call has no parent")); + return; + } + if (IsInLoop(execution)) { AddError(execution->GetId().m_node->GetEntityId(), execution, ScriptCanvas::ParseErrors::UserOutCallInLoop); @@ -4551,18 +4874,14 @@ namespace ScriptCanvas if (execution->IsOnLatentPath()) { - // Data for these calls processed later here: ParseUserInData - // since, for now all latent outs will have the same signature, all - // threads leading to the same nodeling will carry the same data - // all of the execution data needs to be re-routed in each ACM node - // but only one out entry needs to be made in the execution map + // Data for these calls processed later here: ParseUserOuts m_outsMarkedLatent.insert({ nodeling, execution }); } else { // Data for these calls are processed later here: ParseUserInData // since user out calls indicate branches in function definitions, their data is processed when - // the function is defined, since they cannot different signatures for the out calls + // the function is defined, since the return values could be modified at any time starting from the beginning of the function m_outsMarkedImmediate.insert(nodeling); } } @@ -4593,10 +4912,20 @@ namespace ScriptCanvas for (auto nodeling : m_outsMarkedImmediate) { - if (!IsConnectedToUserIn(nodeling)) + if (nodeling) + { + if (!IsConnectedToUserIn(nodeling)) + { + const auto report = AZStd::string::format + ( "Nodeling Out (%s) not connected to Nodeling In, functionality cannot be executed", nodeling->GetDisplayName().data()); + + AddError(nullptr, aznew Internal::ParseError(nodeling->GetEntityId(), report)); + } + } + else { const auto report = AZStd::string::format - ("Nodeling Out (%s) not connected to Nodeling In, functionality cannot be executed", nodeling->GetDisplayName().data()); + ("null nodeling in immediate out list"); AddError(nullptr, aznew Internal::ParseError(nodeling->GetEntityId(), report)); } @@ -4626,6 +4955,21 @@ namespace ScriptCanvas AZStd::erase_if(m_variableWriteHandlingBySlot, isNotActive); } + bool AbstractCodeModel::ParseVariableUseAndPurity(ExecutionTreePtr execution) + { + // gather a list of all the variables used in the function scope + // and in the graph scope in this execution. + PureFunctionListener listener; + TraverseTree(execution, listener); + const auto& usage = listener.GetUsedVariables(); + const bool usesOnlyLocalVariables = usage.memberVariables.empty() && usage.implicitMemberVariables.empty(); + + m_variableUse.localVariables.insert(usage.localVariables.begin(), usage.localVariables.end()); + m_variableUse.memberVariables.insert(usage.memberVariables.begin(), usage.memberVariables.end()); + m_variableUseByExecution.emplace(execution, listener.MoveUsedVariables()); + return (!usage.usesExternallyInitializedVariables) && usesOnlyLocalVariables && listener.IsPure(); + } + void AbstractCodeModel::PostParseErrorDetect(ExecutionTreePtr root) { if (IsInfiniteSelfEntityActivationLoop(*this, root)) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h index ef1b19fed5..6eef1b6934 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h @@ -54,8 +54,9 @@ namespace ScriptCanvas class AbstractCodeModel : public AZStd::enable_shared_from_this { - public: + friend struct PrintMetaData; + public: static bool RequiresCreationFunction(Data::eType type); static AbstractCodeModelConstPtr Parse(const Source& source, bool terminateOnError = false, bool terminateOnInternalError = false); @@ -68,11 +69,23 @@ namespace ScriptCanvas ~AbstractCodeModel(); - AZStd::vector CombineVariableLists + void AddError(ExecutionTreeConstPtr execution, ValidationConstPtr&& error) const; + + AZStd::string AddTranslationVariableName(const AZStd::string& name) const; + + AZStd::optional> CheckUserNodeableDependencyConstructionIndex(VariableConstPtr nodeable) const; + + AZStd::vector CombineVariableLists ( const AZStd::vector& constructionNodeables , const AZStd::vector>& constructionInputVariableIds , const AZStd::vector>& entityIds) const; + AZStd::optional FindNodeableSimpleName(VariableConstPtr variable) const; + + const AZStd::pair* FindStaticVariable(VariableConstPtr) const; + + AZStd::vector GetAllExecutionRoots() const; + const size_t* GetDebugInfoInIndex(ExecutionTreeConstPtr execution) const; const size_t* GetDebugInfoOutIndex(ExecutionTreeConstPtr execution, size_t index) const; @@ -83,7 +96,9 @@ namespace ScriptCanvas const size_t* GetDebugInfoVariableSetIndex(OutputAssignmentConstPtr output) const; - const DependencyReport& GetDependencies() const; + const DebugSymbolMap& GetDebugMap() const; + + const OrderedDependencies& GetOrderedDependencies() const; EBusHandlingConstPtr GetEBusEventHandling(const Node*) const; @@ -93,17 +108,21 @@ namespace ScriptCanvas AZStd::vector GetEventHandlings() const; + Grammar::ExecutionCharacteristics GetExecutionCharacteristics() const; + AZStd::vector GetFunctions() const; VariableConstPtr GetImplicitVariable(ExecutionTreeConstPtr execution) const; - AZStd::vector GetLocalVariablesUser() const; + const SubgraphInterface& GetInterface() const; - AZStd::vector GetMemberVariables() const; + const AZStd::unordered_set* GetLocalVariables(ExecutionTreeConstPtr execution) const; AZStd::vector GetNodeableParse() const; - Grammar::ExecutionCharacteristics GetRuntimeCharacteristics() const; + AZStd::sys_time_t GetParseDuration() const; + + const ParsedRuntimeInputs& GetRuntimeInputs() const; const Source& GetSource() const; @@ -111,6 +130,10 @@ namespace ScriptCanvas ExecutionTreeConstPtr GetStart() const; + const AZStd::vector>& GetStaticVariablesNames() const; + + const AZStd::vector>& GetStaticVariablesNames(Grammar::ExecutionTreeConstPtr functionBlock) const; + const ValidationResults::ValidationEventList& GetValidationEvents() const { return m_validationEvents; } VariableWriteHandlingConstPtr GetVariableHandling(const Slot* slot) const; @@ -119,8 +142,6 @@ namespace ScriptCanvas const AZStd::vector& GetVariables() const; - VariableScopeMeaning GetVariableScopeMeaning() const; - bool IsErrorFree() const; // has modified data or handlers @@ -134,9 +155,12 @@ namespace ScriptCanvas bool IsUserNodeable(VariableConstPtr variable) const; + bool HasUserNodeableDependenciesInVariables() const; + template AZStd::vector ToVariableList(const AZStd::vector>& source) const; + private: ////////////////////////////////////////////////////////////////////////// // Internal parsing ////////////////////////////////////////////////////////////////////////// @@ -145,29 +169,11 @@ namespace ScriptCanvas bool m_hasOtherConnections = false; AZStd::vector m_returnValuesOrReferences; }; - - ExecutionTreePtr m_start; - AZStd::vector m_startNodes; - ScopePtr m_graphScope; - const Source m_source; - DependencyReport m_dependencies; - AZStd::unordered_set m_userNodeables; - AZStd::vector m_variables; - AZStd::vector m_possibleExecutionRoots; - VariableScopeMeaning m_variableScopeMeaning = VariableScopeMeaning::ValueInitialization; - - // true iff there are no internal errors and no error validation events - bool m_isErrorFree = true; - - // for post parsing validation - ValidationResults::ValidationEventList m_validationEvents; - - DebugSymbolMap m_debugMap; - - DebugSymbolMapReverse m_debugMapReverse; - + void AddAllVariablesPreParse(); + void AddAllVariablesPreParse_LegacyFunctions(); + void AddDebugInformation(); void AddDebugInformation(ExecutionChild& execution); @@ -182,8 +188,6 @@ namespace ScriptCanvas void AddDebugInfiniteLoopDetectionInHandler(ExecutionTreePtr execution); - void AddError(ExecutionTreeConstPtr execution, ValidationConstPtr&& error) const; - void AddError(const AZ::EntityId& nodeId, ExecutionTreeConstPtr execution, const AZStd::string_view error) const; VariablePtr AddMemberVariable(const Datum& datum, AZStd::string_view rawName); @@ -228,15 +232,19 @@ namespace ScriptCanvas bool CreateEventHandling(const Node& node); - bool CreateNodeableParse(const Node& node); + bool CheckCreateNodeableParse(const Node& node); OutputAssignmentPtr CreateOutput(ExecutionTreePtr execution, const Slot& outputSlot, AZStd::string_view slotNameOverride, AZStd::string_view suffix); OutputAssignmentPtr CreateOutputAssignment(VariableConstPtr variable); - bool CreateUserEventHandling(const Node& node); + bool CheckCreateUserEventHandling(const Node& node); - bool CreateUserFunctionDefinition(const Node& node); + bool CheckCreateUserFunctionDefinition(const Node& node); + + void ConvertAllMemberVariablesToLocal(ExecutionTreePtr newSource); + + void CreateUserFunctionDefinition(const Node& node, const Slot& entrySlot); bool CreateVariableWriteHandling(const Node& node); @@ -244,6 +252,8 @@ namespace ScriptCanvas OutputAssignmentConstPtr CreateOutputData(ExecutionTreePtr execution, ExecutionChild& executionChild, const Slot& output); + void CullUnusedVariables(); + // Execution cycle detection is done first, before parsing starts. // This way, infinite loops in the parser execution itself are prevented, and input // used from previous ACM execution nodes are properly handled. @@ -251,34 +261,22 @@ namespace ScriptCanvas // which properly respects both the Ordered Sequencer node, and multiple Execution Outs connections // from a single slot. // Errors from poorly routed input are NOT detected here, and should not be, those are detected later. - bool ExecutionContainsCycles(const Node& node, const Slot& outSlot) const; - - bool ExecutionContainsCyclesRecurse(const Node& node, const Slot& outSlot) const; - - bool ExecutionContainsCyclesRecurse(const EndpointsResolved& nextEndpoints, AZStd::unordered_set& previousIns) const; - - bool ExecutionContainsCyclesRecurse(const EndpointResolved& in, AZStd::unordered_set& previousIns) const; + bool ExecutionContainsCyclesCheck(const Node& node, const Slot& outSlot); ReturnValueConnections FindAssignments(ExecutionTreeConstPtr execution, const Slot& output); - VariableConstPtr FindMemberVariable(const AZ::EntityId& sourceNodeId) const; + VariableConstPtr FindVariable(const AZ::EntityId& sourceNodeId) const; - VariableConstPtr FindMemberVariable(const VariableId& sourceVariableId) const; + VariableConstPtr FindVariable(const VariableId& sourceVariableId) const; VariableConstPtr FindReferencedVariableChecked(ExecutionTreeConstPtr execution, const Slot& slot) const; AZStd::pair FindReturnValueOnThread(ExecutionTreeConstPtr executionNode, const Node* node, const Slot* slot) const; - AZStd::vector GetAllExecutionRoots() const; - - const SubgraphInterface& GetInterface() const; - - AZStd::string GetOriginalVariableName(const VariableId& sourceVariableId); + AZStd::string GetOriginalVariableName(VariableConstPtr variable, const Node* node); AZStd::string GetOutputSlotNameOverride(ExecutionTreePtr execution, const Slot& outputSlot); - AZStd::sys_time_t GetParseDuration() const; - VariableConstPtr GetReadVariable(ExecutionTreePtr execution); VariableConstPtr GetWrittenVariable(ExecutionTreePtr execution); @@ -289,6 +287,10 @@ namespace ScriptCanvas AZStd::vector ModAllExecutionRoots(); + AZStd::vector>& ModStaticVariablesNames(); + + AZStd::vector>& ModStaticVariablesNames(Grammar::ExecutionTreeConstPtr functionBlock); + ExecutionTreePtr OpenScope(ExecutionTreePtr parent, const Node* node, const Slot* outSlot) const; void Parse(); @@ -308,7 +310,9 @@ namespace ScriptCanvas }; VariableConstPtr ParseConnectedInputData(const Slot& inputSlot, ExecutionTreePtr executionWithInput, const EndpointsResolved& scriptCanvasNodesConnectedToInput, FirstNode firstNode); - SlotsOutcome ParseDataOutSlots(ExecutionTreePtr execution, ExecutionChild& executionChild) const; + void ParseConstructionInputVariables(); + + ConstSlotsOutcome ParseDataOutSlots(ExecutionTreePtr execution, ExecutionChild& executionChild) const; void ParseDeactivation(); @@ -316,10 +320,16 @@ namespace ScriptCanvas void ParseDependencies(const Node& node); + void ParseDependenciesAssetIndicies(); + void ParseEntityIdInput(ExecutionTreePtr execution); void ParseExecutionBreak(ExecutionTreePtr execution); + void ParseExecutionCharacteristics(); + + void ParseExecutionCharacteristics(ExecutionTreePtr execution); + void ParseExecutionCycleStatement(ExecutionTreePtr execution); ExecutionTreePtr ParseExecutionForEachLoop(ExecutionTreePtr execution, const Slot& loopSlot, const Slot& breakSlot); @@ -377,6 +387,8 @@ namespace ScriptCanvas void ParseMultiExecutionPre(ExecutionTreePtr execution); + void ParseNodelingVariables(const Node& node, NodelingType nodelingType); + void ParseOperatorArithmetic(ExecutionTreePtr execution); void ParseOutputData(ExecutionTreePtr execution, ExecutionChild& executionChild); @@ -409,6 +421,9 @@ namespace ScriptCanvas void ParseVariableHandling(); + // tracks all local/member variable use, return true if uses a declared member variable + bool ParseVariableUseAndPurity(ExecutionTreePtr execution); + void PostParseErrorDetect(ExecutionTreePtr root); void PostParseProcess(ExecutionTreePtr root); @@ -419,8 +434,6 @@ namespace ScriptCanvas void RemoveFromTree(ExecutionTreePtr execution); - protected: - struct ConnectionInPreviouslyExecutedScope { size_t m_childIndex = 0; @@ -434,11 +447,18 @@ namespace ScriptCanvas ExecutionTreePtr m_mostParent; }; + struct ReturnValueDescription + { + AZStd::vector returnValues; + size_t outCallCount = 1; + }; + struct UserInParseTopologyResult { bool addSingleOutToMap; bool addNewOutToLeavesWithout; - bool addReturnValuesToOuts; + bool addExplicitOutCalls; + bool isSimpleFunction; }; void AccountForEBusConnectionControl(ExecutionTreePtr execution); @@ -465,7 +485,7 @@ namespace ScriptCanvas void AddExecutionMapLatentOut(const Nodes::Core::FunctionDefinitionNode& nodeling, ExecutionTreePtr out); - void AddUserOut(ExecutionTreePtr parent, ExecutionTreeConstPtr root, AZStd::string_view name); + void AddUserOutToLeaf(ExecutionTreePtr parent, ExecutionTreeConstPtr root, AZStd::string_view name); void AddPreviouslyExecutedScopeVariableToOutputAssignments(VariableConstPtr newInputVariable, const ConnectionsInPreviouslyExecutedScope& connectedInputInPreviouslyExecutedScope); @@ -485,11 +505,30 @@ namespace ScriptCanvas bool InSimultaneousDataPath(const Node& node, const Slot& reference, const Slot& candidate) const; - void MarkAllFunctionsPure(); - static UserInParseTopologyResult ParseUserInTolopology(size_t nodelingsOutCount, size_t leavesWithoutNodelingsCount); + + ExecutionTreePtr m_start; + AZStd::vector m_startNodes; + ScopePtr m_graphScope; + const Source m_source; + OrderedDependencies m_orderedDependencies; + AZStd::unordered_set m_userNodeables; + + AZStd::unordered_map m_dependencyByVariable; - private: + AZStd::vector m_variables; + AZStd::vector m_possibleExecutionRoots; + + // true iff there are no internal errors and no error validation events + bool m_isErrorFree = true; + + // for post parsing validation + ValidationResults::ValidationEventList m_validationEvents; + + DebugSymbolMap m_debugMap; + + DebugSymbolMapReverse m_debugMapReverse; + AZStd::sys_time_t m_parseDuration; AZStd::chrono::system_clock::time_point m_parseStartTime; EBusHandlingByNode m_ebusHandlingByNode; @@ -510,6 +549,16 @@ namespace ScriptCanvas AZStd::unordered_set m_outsMarkedImmediate; AZStd::unordered_set m_processedOuts; + // the output slots of the In-Nodeling + AZStd::unordered_map m_inputVariableByNodelingInSlot; + // the output slots of the Out-Nodeling + AZStd::unordered_map m_returnVariableByNodelingOutSlot; + // the input slots of the Out-Nodeling + AZStd::unordered_map m_outputVariableByNodelingOutSlot; + + AZStd::unordered_map m_returnValuesByUserFunctionDefinition; + + AZStd::unordered_map m_sourceVariableByDatum; AZStd::unordered_set m_subgraphStartCalls; AZStd::unordered_set m_activeDefaultObject; @@ -517,14 +566,21 @@ namespace ScriptCanvas AZStd::unordered_set m_uniqueOutNames; AZStd::unordered_set m_uniqueInNames; + AZStd::vector> m_staticVariableNames; + AZStd::unordered_map>> m_staticVariableNamesByFunctionBlock; - AZStd::vector FindAllVariablesInVariableFlagScope(VariableFlags::Scope scope) const; + AZStd::unordered_map m_variableUseByExecution; + VariableUseage m_variableUse; - // scrape variables for scope, every Scope::In and InOut - AZStd::vector FindSubGraphInputValues() const; + ParsedRuntimeInputs m_runtimeInputs; - // scrape variables for scope, every Scope::Out and InOut - AZStd::vector FindSubGraphOutputValues() const; + AZStd::vector FindUserImmediateInput(ExecutionTreePtr call) const; + + const ReturnValueDescription* FindUserImmediateOutput(ExecutionTreePtr call) const; + + AZStd::vector FindUserLatentOutput(ExecutionTreePtr call) const; + + AZStd::vector FindUserLatentReturnValues(ExecutionTreePtr call) const; bool IsSourceInScope(VariableConstPtr variable, VariableFlags::Scope scope) const; @@ -539,8 +595,25 @@ namespace ScriptCanvas void ParseExecutionIfStatementBooleanExpression(ExecutionTreePtr booleanExpressionExecution, AZStd::string executionName, LexicalScope lexicalScope); void ParseExecutionIfStatementInternalFunction(ExecutionTreePtr internalFunctionExecution); - - }; + +#if defined(FUNCTION_LEGACY_SUPPORT_ENABLED) + public: + AZStd::vector FindAllVariablesInVariableFlagScope(VariableFlags::Scope scope) const; + + // scrape variables for scope, every Scope::In and InOut + AZStd::vector FindSubGraphInputValues() const; + + // scrape variables for scope, every Scope::Out and InOut + AZStd::vector FindSubGraphOutputValues() const; + + AZStd::vector GetLocalVariablesUser() const; + + VariableScopeMeaning_LegacyFunctions GetVariableScopeMeaning() const; + + private: + VariableScopeMeaning_LegacyFunctions m_variableScopeMeaning = VariableScopeMeaning_LegacyFunctions::ValueInitialization; +#endif + }; // class AbstractCodeModel template AZStd::vector AbstractCodeModel::ToVariableList(const AZStd::vector>& source) const diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.cpp new file mode 100644 index 0000000000..6233911091 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.cpp @@ -0,0 +1,136 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ExecutionTraversalListeners.h" +#include "GrammarContextBus.h" +#include "ParsingUtilities.h" +#include "Primitives.h" + +namespace ScriptCanvas +{ + namespace Grammar + { + void NodelingInParserIterationListener::CountOnlyGrammarCalls() + { + m_countOnlyGrammarCalls = true; + } + + void NodelingInParserIterationListener::EvaluateLeaf(ExecutionTreeConstPtr node, const Slot*, int) + { + bool without = true; + bool addedToOutCall = false; + + if (node->GetSymbol() == Symbol::UserOut) + { + m_outCalls.push_back(node); + without = false; + addedToOutCall = true; + } + + if (auto nodeling = azrtti_cast(node->GetId().m_node)) + { + if (!m_countOnlyGrammarCalls && !addedToOutCall) + { + m_outCalls.push_back(node); + } + + m_uniqueNodelings.insert(nodeling); + without = false; + } + + if (without) + { + m_leavesWithoutNodelings.push_back(node); + } + } + + const AZStd::vector& NodelingInParserIterationListener::GetLeavesWithoutNodelings() const + { + return m_leavesWithoutNodelings; + } + + const AZStd::unordered_set& NodelingInParserIterationListener::GetNodelingsOut() const + { + return m_uniqueNodelings; + } + + const AZStd::vector& NodelingInParserIterationListener::GetOutCalls() const + { + return m_outCalls; + } + + void NodelingInParserIterationListener::Reset() + { + m_uniqueNodelings.clear(); + m_outCalls.clear(); + m_leavesWithoutNodelings.clear(); + } + + void PureFunctionListener::Evaluate(ExecutionTreeConstPtr node, [[maybe_unused]] const Slot* slot, [[maybe_unused]] int level) + { + ParseVariableUse(node, m_usedVariables); + + m_isPure = m_isPure + && Grammar::IsPure(node->GetSymbol()) + && Grammar::IsPure(node->GetId().m_node, node->GetId().m_slot); + } + + const VariableUseage& PureFunctionListener::GetUsedVariables() const + { + return m_usedVariables; + } + + bool PureFunctionListener::IsPure() const + { + return m_isPure && m_usedVariables.memberVariables.empty(); + } + + VariableUseage&& PureFunctionListener::MoveUsedVariables() + { + return AZStd::move(m_usedVariables); + } + + void UserOutCallCollector::Evaluate(const EndpointResolved& endpoint) + { + if (auto nodeling = IsUserOutNode(endpoint.first)) + { + m_outCalls.insert(nodeling); + } + } + + const AZStd::unordered_set& UserOutCallCollector::GetOutCalls() const + { + return m_outCalls; + } + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.h new file mode 100644 index 0000000000..3491cb1366 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.h @@ -0,0 +1,85 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include "PrimitivesDeclarations.h" +#include "PrimitivesExecution.h" + +namespace ScriptCanvas +{ + namespace Nodes + { + namespace Core + { + class FunctionDefinitionNode; + } + } + + namespace Grammar + { + class NodelingInParserIterationListener + : public ExecutionTreeTraversalListener + { + public: + void CountOnlyGrammarCalls(); + + const AZStd::vector& GetLeavesWithoutNodelings() const; + + const AZStd::unordered_set& GetNodelingsOut() const; + + const AZStd::vector& GetOutCalls() const; + + void Reset() override; + + protected: + void EvaluateLeaf(ExecutionTreeConstPtr node, const Slot*, int) override; + + private: + bool m_countOnlyGrammarCalls = false; + AZStd::unordered_set m_uniqueNodelings; + AZStd::vector m_outCalls; + AZStd::vector m_leavesWithoutNodelings; + }; + + class PureFunctionListener + : public ExecutionTreeTraversalListener + { + public: + const VariableUseage& GetUsedVariables() const; + + bool IsPure() const; + + VariableUseage&& MoveUsedVariables(); + + protected: + void Evaluate(ExecutionTreeConstPtr node, const Slot* slot, [[maybe_unused]] int) override; + + private: + bool m_isPure = true; + VariableUseage m_usedVariables; + }; + + class UserOutCallCollector + : public GraphExecutionPathTraversalListener + { + public: + const AZStd::unordered_set& GetOutCalls() const; + + protected: + void Evaluate(const EndpointResolved& endpoint) override; + + private: + AZStd::unordered_set m_outCalls; + }; + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/FunctionsLegacySupport.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/FunctionsLegacySupport.cpp new file mode 100644 index 0000000000..b44cd30446 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/FunctionsLegacySupport.cpp @@ -0,0 +1,288 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "PrimitivesDeclarations.h" + +#if defined(FUNCTION_LEGACY_SUPPORT_ENABLED) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AbstractCodeModel.h" +#include "FunctionsLegacySupport.h" +#include "GrammarContextBus.h" +#include "ParsingUtilities.h" +#include "Primitives.h" + +namespace ScriptCanvas +{ + namespace Grammar + { + + void AbstractCodeModel::AddAllVariablesPreParse_LegacyFunctions() + { + // all variables assumed to be NOT persistent - in the live code they are reset when activated + // variables with no scope In/Out is assumed to be persistent, this is a mess with tick handlers + // warn on any variable attempted to be read before written + AZ_Assert(m_variableScopeMeaning == VariableScopeMeaning_LegacyFunctions::FunctionPrototype, "new graph type added without full support"); + auto& sourceVariables = m_source.m_variableData->GetVariables(); + + AZStd::set sortedVariables; + for (const auto& variablePair : sourceVariables) + { + sortedVariables.insert(&variablePair.second); + } + + for (auto& sourceVariable : sortedVariables) + { + auto datum = sourceVariable->GetDatum(); + AZ_Assert(datum != nullptr, "the datum must be valid"); + AddVariable(*datum, sourceVariable->GetVariableName(), sourceVariable->GetVariableId()); + } + } + + AZStd::vector AbstractCodeModel::FindSubGraphInputValues() const + { + return FindAllVariablesInVariableFlagScope(VariableFlags::Scope::Input); + } + + AZStd::vector AbstractCodeModel::FindSubGraphOutputValues() const + { + return FindAllVariablesInVariableFlagScope(VariableFlags::Scope::Output); + } + + AZStd::vector AbstractCodeModel::FindAllVariablesInVariableFlagScope(VariableFlags::Scope scope) const + { + AZStd::vector variables; + auto& sourceVariables = m_source.m_variableData->GetVariables(); + + for (auto& variable : m_variables) + { + if (IsSourceInScope(variable, scope)) + { + variables.push_back(variable); + } + } + + // sort by variable id + AZStd::sort(variables.begin(), variables.end(), [](const auto& lhs, const auto& rhs) { return lhs->m_sourceVariableId < rhs->m_sourceVariableId; }); + return variables; + } + + AZStd::vector AbstractCodeModel::GetLocalVariablesUser() const + { + AZStd::vector userLocalVariables; + + if (m_variableScopeMeaning == VariableScopeMeaning_LegacyFunctions::FunctionPrototype) + { + for (auto variable : m_variables) + { + if (!variable->m_isMember + && variable->m_sourceVariableId.IsValid() + && !IsSourceInScope(variable, VariableFlags::Scope::Input) + && !IsSourceInScope(variable, VariableFlags::Scope::Output)) + { + userLocalVariables.push_back(variable); + } + } + } + + return userLocalVariables; + } + + VariableScopeMeaning_LegacyFunctions AbstractCodeModel::GetVariableScopeMeaning() const + { + return m_variableScopeMeaning; + } + + bool SubgraphInterface::IsAllInputOutputShared() const + { + return m_isAllInputOutputShared; + } + + void SubgraphInterface::MarkAllInputOutputShared() + { + m_isAllInputOutputShared = true; + } + } // namespace Grammar + + namespace Nodes + { + namespace Core + { + void FunctionCallNode::BuildNodeFromSubgraphInterface + (const AZ::Data::Asset& runtimeAsset + , const SlotExecution::Map& previousMap) + { + // build the node here, from the asset topology, take the node/variable ordering from the function runtime data as a suggestion + // deal with updates and conversions after + const Grammar::SubgraphInterface& subgraphInterface = runtimeAsset.Get()->m_runtimeData.m_interface; + m_prettyName = runtimeAsset.Get()->m_runtimeData.m_name; + + if (!subgraphInterface.IsAllInputOutputShared()) + { + AZ_Error("ScriptCanvas", false, "the current assumption is that there is no way to distinguish between the input/output of different nodelings"); + return; + } + + // for now, all outputs are shared + Grammar::Outputs outputs; + bool sharedOutputInitialized = false; + + SlotExecution::Ins slotMapIns; + SlotExecution::Outs slotMapLatents; + + int slotOffset = 0; + + // add all ins->outs, in their display groups + for (size_t indexIn = 0; indexIn < subgraphInterface.GetInCount(); ++indexIn) + { + const Grammar::In& interfaceIn = subgraphInterface.GetIn(indexIn); + + SlotExecution::In slotMapIn = AddExecutionInSlotFromInterface(interfaceIn, slotOffset++, previousMap.FindInSlotIdBySource(interfaceIn.sourceID)); + if (!slotMapIn.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Execution In slot from sub graph interface"); + return; + } + slotMapIn.inputs = AddDataInputSlotFromInterface(interfaceIn.inputs, interfaceIn.sourceID, interfaceIn.displayName, previousMap, slotOffset); + for (auto& input : slotMapIn.inputs) + { + if (!input.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Input slot from sub graph interface"); + return; + } + } + + for (auto& interfaceOut : interfaceIn.outs) + { + SlotExecution::Out slotMapOut = AddExecutionOutSlotFromInterface(interfaceIn, interfaceOut, slotOffset++, previousMap.FindOutSlotIdBySource(interfaceIn.sourceID, interfaceOut.sourceID)); + if (!slotMapOut.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Execution Out slot from sub graph interface"); + return; + } + if (!sharedOutputInitialized) + { + outputs = interfaceOut.outputs; + sharedOutputInitialized = true; + } + + slotMapIn.outs.push_back(slotMapOut); + } + + slotMapIns.push_back(slotMapIn); + } + + // add all latents in their display groups + for (size_t indexLatent = 0; indexLatent < subgraphInterface.GetLatentOutCount(); ++indexLatent) + { + const Grammar::Out& interfaceLatent = subgraphInterface.GetLatentOut(indexLatent); + + SlotExecution::Out slotMapLatentOut = AddExecutionLatentOutSlotFromInterface(interfaceLatent, slotOffset++, previousMap.FindLatentSlotIdBySource(interfaceLatent.sourceID)); + if (!slotMapLatentOut.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Latent Out slot from sub graph interface"); + return; + } + slotMapLatentOut.returnValues.values = AddDataInputSlotFromInterface(interfaceLatent.returnValues, interfaceLatent.sourceID, interfaceLatent.displayName, previousMap, slotOffset); + for (auto& input : slotMapLatentOut.returnValues.values) + { + if (!input.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Input slot from sub graph interface"); + return; + } + } + + if (!sharedOutputInitialized) + { + outputs = interfaceLatent.outputs; + sharedOutputInitialized = true; + } + + slotMapLatents.push_back(slotMapLatentOut); + } + + // add all outputs one time, since they are currently all required to be part of all the signatures [\todo must fix] , in a variable display group + SlotExecution::Outputs slotMapOutputs = AddDataOutputSlotFromInterface(outputs, "", previousMap, slotOffset); + for (auto& output : slotMapOutputs) + { + if (!output.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Output slot from sub graph interface"); + return; + } + } + if (!subgraphInterface.IsLatent()) + { + for (auto& slotMapIn : slotMapIns) + { + for (auto& slotMapOut : slotMapIn.outs) + { + slotMapOut.outputs = slotMapOutputs; + } + } + } + else + { + for (auto& slotMapLatent : slotMapLatents) + { + slotMapLatent.outputs = slotMapOutputs; + } + } + + // when returning variables: sort variables by source slot id, they are sorted in the slot map, so just take them from the slot map + m_slotExecutionMap = AZStd::move(SlotExecution::Map(AZStd::move(slotMapIns), AZStd::move(slotMapLatents))); + m_slotExecutionMapSourceInterface = subgraphInterface; + m_asset = runtimeAsset; + SignalSlotsReordered(); + } + } // namespace Core + } // namespace Nodes +} + +#endif diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/FunctionsLegacySupport.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/FunctionsLegacySupport.h new file mode 100644 index 0000000000..ab10d51b4f --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/FunctionsLegacySupport.h @@ -0,0 +1,25 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +namespace ScriptCanvas +{ + namespace Grammar + { + enum class VariableScopeMeaning_LegacyFunctions : AZ::u32 + { + ValueInitialization, + FunctionPrototype, + }; + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp index 457b64c85a..153242d78a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -53,7 +53,7 @@ namespace ParsingUtilitiesCpp using namespace ScriptCanvas::Grammar; class PrettyPrinter - : public ExecutionTreeIterationListener + : public ExecutionTreeTraversalListener { public: PrettyPrinter() = default; @@ -137,6 +137,33 @@ namespace ScriptCanvas , lexicalScope(scopeType) {} + void VariableUseage::Clear() + { + localVariables.clear(); + memberVariables.clear(); + } + + void VariableUseage::Parse(VariableConstPtr variable) + { + usesExternallyInitializedVariables = usesExternallyInitializedVariables || IsExternallyInitialized(variable); + + if (IsManuallyDeclaredUserVariable(variable)) + { + if (variable->m_isMember) + { + memberVariables.insert(variable); + } + else + { + localVariables.insert(variable); + } + } + else if (variable->m_isMember) + { + implicitMemberVariables.insert(variable); + } + } + bool ActivatesSelf(const ExecutionTreeConstPtr& execution) { auto methodNode = azrtti_cast(execution->GetId().m_node); @@ -271,6 +298,23 @@ namespace ScriptCanvas return execution->GetSymbol(); } + NodelingType CheckNodelingType(const Node& node) + { + if (auto nodeling = azrtti_cast(&node)) + { + if (nodeling->IsExecutionEntry()) + { + return NodelingType::In; + } + else if (nodeling->IsExecutionExit()) + { + return NodelingType::Out; + } + } + + return NodelingType::None; + } + CheckOperatorResult CheckOperatorArithmeticSymbol(const ExecutionTreeConstPtr& execution) { if (azrtti_istypeof(execution->GetId().m_node)) @@ -345,6 +389,12 @@ namespace ScriptCanvas } } + bool ExecutionContainsCycles(const Node& node, const Slot& outSlot) + { + GraphExecutionPathTraversalListener listener; + return TraverseExecutionConnections(node, outSlot, listener) != ExecutionTraversalResult::Success; + } + bool ExecutionWritesVariable(ExecutionTreeConstPtr execution, VariableConstPtr variable) { for (size_t i = 0, sentinel = execution->GetChildrenCount(); i < sentinel; ++i) @@ -435,6 +485,14 @@ namespace ScriptCanvas return azrtti_istypeof(execution->GetId().m_node); } + bool IsCodeConstructable(Grammar::VariableConstPtr value) + { + return Data::IsValueType(value->m_datum.GetType()) + // || value->m_datum.GetType().GetAZType() == azrtti_typeid() // <--- cut this.. can't be needed or correct + || value->m_datum.GetAsDanger() == nullptr; + ; + } + bool IsCycle(const Node& node) { return azrtti_istypeof(node); @@ -504,6 +562,13 @@ namespace ScriptCanvas return execution->GetExecutedPropertyExtraction() != nullptr; } + + bool IsExternallyInitialized(VariableConstPtr value) + { + const auto requirement = ParseConstructionRequirement(value); + return !(requirement == VariableConstructionRequirement::None || requirement == VariableConstructionRequirement::Static); + } + bool IsFloatingPointNumberEqualityComparison(ExecutionTreeConstPtr execution) { const auto symbol = execution->GetSymbol(); @@ -524,7 +589,7 @@ namespace ScriptCanvas || IsRandomSwitchStatement(execution) || IsSequenceNode(execution) || IsSwitchStatement(execution) - || IsUserOut(execution) + || IsUserOutNode(execution) || IsWhileLoop(execution); } @@ -678,6 +743,15 @@ namespace ScriptCanvas || symbol == Symbol::While; } + bool IsManuallyDeclaredUserVariable(VariableConstPtr variable) + { + return variable + && variable->m_source == nullptr + && !variable->m_sourceSlotId.IsValid() + && variable->m_sourceVariableId.IsValid() + && !variable->m_nodeableNodeId.IsValid(); + } + bool IsMidSequence(const ExecutionTreeConstPtr& execution) { if (!execution) @@ -866,6 +940,28 @@ namespace ScriptCanvas return azrtti_istypeof(execution->GetId().m_node); } + bool IsPure(Symbol symbol) + { + return symbol != Symbol::Cycle; + } + + bool IsPure(const Node* node, const Slot* slot) + { + if (auto userFunctionCall = azrtti_cast(node)) + { + if (!userFunctionCall->IsSlotPure(slot)) + { + return false; + } + } + else if (node && IsOnce(*node)) + { + return false; + } + + return true; + } + bool IsRandomSwitchStatement(const ExecutionTreeConstPtr& execution) { return azrtti_istypeof(execution->GetId().m_node) @@ -892,28 +988,25 @@ namespace ScriptCanvas bool IsUserFunctionCall(const ExecutionTreeConstPtr& execution) { return (execution->GetSymbol() == Symbol::FunctionCall) - && azrtti_istypeof(execution->GetId().m_node); + && azrtti_istypeof(execution->GetId().m_node); } - bool IsUserFunctionCallPure(const ExecutionTreeConstPtr& execution) + bool IsUserFunctionDefinition(const ExecutionTreeConstPtr& execution) { - const auto& id = execution->GetId(); - return execution->GetSymbol() == Symbol::FunctionCall - && azrtti_istypeof(id.m_node) - && azrtti_cast(id.m_node)->IsSlotPure(execution->GetId().m_slot); + auto nodeling = azrtti_cast(execution->GetId().m_node); + return nodeling && nodeling->IsExecutionEntry() && execution->GetSymbol() == Symbol::FunctionDefinition; } - bool IsUserFunctionDefinition(const ExecutionTreeConstPtr& execution) + const ScriptCanvas::Nodes::Core::FunctionDefinitionNode* IsUserOutNode(const Node* node) { - return (execution->GetSymbol() == Symbol::FunctionDefinition) - && azrtti_istypeof(execution->GetId().m_node); + auto nodeling = azrtti_cast(node); + return nodeling && nodeling->IsExecutionExit() ? nodeling : nullptr; } - bool IsUserOut(const ExecutionTreeConstPtr& execution) + const ScriptCanvas::Nodes::Core::FunctionDefinitionNode* IsUserOutNode(const ExecutionTreeConstPtr& execution) { - auto nodeling = azrtti_cast(execution->GetId().m_node); - // \todo change this evaluation, it is too brittle - return nodeling && !nodeling->IsEntryPoint(); + auto nodeling = IsUserOutNode(execution->GetId().m_node); + return nodeling ? nodeling : nullptr; } bool IsVariableGet(const ExecutionTreeConstPtr& execution) @@ -944,6 +1037,86 @@ namespace ScriptCanvas return AZStd::string::format("%s%s", k_memberNamePrefix, name.data()); } + VariableConstructionRequirement ParseConstructionRequirement(VariableConstPtr variable) + { + if (IsEntityIdThatRequiresRuntimeRemap(variable)) + { + return VariableConstructionRequirement::InputEntityId; + } + else if (variable->m_isExposedToConstruction) + { + if (variable->m_sourceVariableId.IsValid()) + { + return VariableConstructionRequirement::InputVariable; + } + else if (variable->m_nodeableNodeId.IsValid()) + { + return VariableConstructionRequirement::InputNodeable; + } + else + { + AZ_Assert(false, "A member variable in the model has no valid id"); + } + } + else if (variable->m_sourceVariableId.IsValid() && !IsCodeConstructable(variable)) + { + return VariableConstructionRequirement::Static; + } + + return VariableConstructionRequirement::None; + } + + void ParseVariableUse(const OutputAssignment& outputAssignment, VariableUseage& variableUse) + { + variableUse.Parse(outputAssignment.m_source); + + for (const auto& assignment : outputAssignment.m_assignments) + { + variableUse.Parse(assignment); + } + } + + void ParseVariableUse(ExecutionTreeConstPtr execution, VariableUseage& variableUse) + { + for (size_t inputIdx = 0; inputIdx != execution->GetInputCount(); ++inputIdx) + { + variableUse.Parse(execution->GetInput(inputIdx).m_value); + } + + for (size_t returnIdx = 0; returnIdx != execution->GetReturnValueCount(); ++returnIdx) + { + if (auto returnValue = execution->GetReturnValue(returnIdx).second) + { + ParseVariableUse(*returnValue, variableUse); + } + } + + if (auto localOutputPtr = execution->GetLocalOutput()) + { + for (const auto& localOuput : *localOutputPtr) + { + if (localOuput.second) + { + return ParseVariableUse(*localOuput.second, variableUse); + } + } + } + else + { + for (size_t childIdx = 0; childIdx != execution->GetChildrenCount(); ++childIdx) + { + const auto& child = execution->GetChild(childIdx); + for (const auto& localOuput : child.m_output) + { + if (localOuput.second) + { + ParseVariableUse(*localOuput.second, variableUse); + } + } + } + } + } + void PrettyPrint(AZStd::string& result, const AbstractCodeModel& model) { if (model.IsPerEntityDataRequired()) @@ -979,65 +1152,12 @@ namespace ScriptCanvas result = printer.TakeResult(); } - void TraverseTreeRecurse(const ExecutionTreeConstPtr& execution, ExecutionTreeIterationListener& listener, const Slot* slot, int depth = 0); - - void TraverseTree(const AbstractCodeModel& model, ExecutionTreeIterationListener& listener) - { - for (auto root : model.GetAllExecutionRoots()) - { - TraverseTree(root, listener); - } - } - - void TraverseTree(const ExecutionTreeConstPtr& execution, ExecutionTreeIterationListener& listener) - { - listener.Reset(); - TraverseTreeRecurse(execution, listener, nullptr, 0); - } - - void TraverseTreeRecurse(const ExecutionTreeConstPtr& execution, ExecutionTreeIterationListener& listener, const Slot* slot, int level) - { - if (!execution->GetParent()) - { - listener.EvaluateRoot(execution, slot); - } - - listener.Evaluate(execution, slot, level); - - if (execution->GetChildrenCount() == 0 && !IsInLoop(execution) && !IsMidSequence(execution)) - { - listener.EvaluateLeaf(execution, slot, level); - } - else - { - for (size_t i(0); i < execution->GetChildrenCount(); ++i) - { - auto& childIter = execution->GetChild(i); - - if (childIter.m_execution) - { - listener.EvaluateChildPre(execution, childIter.m_slot, i, level + 1); - TraverseTreeRecurse(childIter.m_execution, listener, childIter.m_slot, level + 1); - listener.EvaluateChildPost(execution, childIter.m_slot, i, level + 1); - } - else if (!IsInLoop(execution) && !IsMidSequence(execution)) - { - listener.EvaluateNullChildLeaf(execution, childIter.m_slot, i, level + 1); - } - } - } - } - void ProtectReservedWords(AZStd::string& name) { if (!name.ends_with(k_reservedWordProtection)) { name.append(k_reservedWordProtection); } - else - { - AZ_TracePrintf("ScriptCanvas", "%s name was already safe", name.data()); - } } OutputAssignmentPtr RemoveOutput(ExecutionChild& executionChild, const SlotId& slotId) @@ -1087,6 +1207,161 @@ namespace ScriptCanvas return identifier; } - } + ExecutionTraversalResult TraverseExecutionConnectionsRecurse(const EndpointsResolved& nextEndpoints, AZStd::unordered_set& previousIns, GraphExecutionPathTraversalListener& listener); + + ExecutionTraversalResult TraverseExecutionConnectionsRecurse(const EndpointResolved& in, AZStd::unordered_set& previousIns, GraphExecutionPathTraversalListener& listener); + + ExecutionTraversalResult TraverseExecutionConnections(const Node& node, const Slot& outSlot, GraphExecutionPathTraversalListener& listener) + { + AZStd::unordered_set path; + return TraverseExecutionConnectionsRecurse({ &node, &outSlot }, path, listener); + } + + ExecutionTraversalResult TraverseExecutionConnectionsRecurse(const EndpointsResolved& nextEndpoints, AZStd::unordered_set& previousPath, GraphExecutionPathTraversalListener& listener) + { + if (listener.CancelledTraversal()) + { + return ExecutionTraversalResult::Success; + } + + if (!nextEndpoints.empty()) + { + if (nextEndpoints.size() == 1) + { + auto status = TraverseExecutionConnectionsRecurse(nextEndpoints[0], previousPath, listener); + if (status != ExecutionTraversalResult::Success) + { + return status; + } + } + else + { + // Subsequent connections after an the multiple Execution Out connections syntax sugar + // only have to check for loops up to the sequence point. + // Duplicate endpoints after the sequence are not necessarily loops, but are likely just the normal + // ScriptCanvas way allowing users to use the same visual path (thus preventing "duplicate code"). + for (auto nextEndpoint : nextEndpoints) + { + AZStd::unordered_set pathUpToSequenceSyntaxSugar(previousPath); + + auto status = TraverseExecutionConnectionsRecurse(nextEndpoint, pathUpToSequenceSyntaxSugar, listener); + if (status != ExecutionTraversalResult::Success) + { + return status; + } + } + } + } + + return ExecutionTraversalResult::Success; + } + + ExecutionTraversalResult TraverseExecutionConnectionsRecurse(const EndpointResolved& in, AZStd::unordered_set& previousPath, GraphExecutionPathTraversalListener& listener) + { + if (previousPath.contains(in.second)) + { + return ExecutionTraversalResult::ContainsCycle; + } + + if (!in.second) + { + return ExecutionTraversalResult::NullSlot; + } + + listener.Evaluate(in); + + if (listener.CancelledTraversal()) + { + return ExecutionTraversalResult::Success; + } + + AZStd::vector outSlots; + + if (in.second->IsLatent()) + { + outSlots.push_back(in.second); + } + else + { + previousPath.insert(in.second); + + auto outSlotsOutcome = in.first->GetSlotsInExecutionThreadByType(*in.second, CombinedSlotType::ExecutionOut); + if (!outSlotsOutcome.IsSuccess()) + { + return ExecutionTraversalResult::GetSlotError; + } + + outSlots = outSlotsOutcome.GetValue(); + } + + for (auto branch : outSlots) + { + auto nextEndpoints = in.first->GetConnectedNodes(*branch); + AZStd::unordered_set pathUpToBranchOrSyntaxSugar(previousPath); + + const auto status = TraverseExecutionConnectionsRecurse(nextEndpoints, pathUpToBranchOrSyntaxSugar, listener); + if (status != ExecutionTraversalResult::Success) + { + return status; + } + } + + return ExecutionTraversalResult::Success; + } + + void TraverseTreeRecurse(const ExecutionTreeConstPtr& execution, ExecutionTreeTraversalListener& listener, const Slot* slot, int depth = 0); + + void TraverseTree(const AbstractCodeModel& model, ExecutionTreeTraversalListener& listener) + { + for (auto root : model.GetAllExecutionRoots()) + { + TraverseTree(root, listener); + } + } + + void TraverseTree(const ExecutionTreeConstPtr& execution, ExecutionTreeTraversalListener& listener) + { + listener.Reset(); + TraverseTreeRecurse(execution, listener, nullptr, 0); + } + + void TraverseTreeRecurse(const ExecutionTreeConstPtr& execution, ExecutionTreeTraversalListener& listener, const Slot* slot, int level) + { + if (listener.CancelledTraversal()) + { + return; + } + + if (!execution->GetParent()) + { + listener.EvaluateRoot(execution, slot); + } + + listener.Evaluate(execution, slot, level); + + if (execution->GetChildrenCount() == 0 && !IsInLoop(execution) && !IsMidSequence(execution)) + { + listener.EvaluateLeaf(execution, slot, level); + } + else + { + for (size_t i(0); i < execution->GetChildrenCount(); ++i) + { + auto& childIter = execution->GetChild(i); + + if (childIter.m_execution) + { + listener.EvaluateChildPre(execution, childIter.m_slot, i, level + 1); + TraverseTreeRecurse(childIter.m_execution, listener, childIter.m_slot, level + 1); + listener.EvaluateChildPost(execution, childIter.m_slot, i, level + 1); + } + else if (!IsInLoop(execution) && !IsMidSequence(execution)) + { + listener.EvaluateNullChildLeaf(execution, childIter.m_slot, i, level + 1); + } + } + } + } + } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h index 7b33906e08..62c8cafa7e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h @@ -17,6 +17,11 @@ namespace ScriptCanvas { + namespace Nodes::Core + { + class FunctionDefinitionNode; + } + namespace Grammar { struct CheckOperatorResult @@ -30,6 +35,18 @@ namespace ScriptCanvas CheckOperatorResult(Symbol symbol, AZStd::string_view name, LexicalScopeType scopeType); }; + struct VariableUseage + { + bool usesExternallyInitializedVariables = false; + AZStd::unordered_set localVariables; + AZStd::unordered_set memberVariables; + AZStd::unordered_set implicitMemberVariables; + + void Clear(); + + void Parse(VariableConstPtr variable); + }; + bool ActivatesSelf(const ExecutionTreeConstPtr& execution); EventHandingType CheckEventHandlingType(const ExecutionTreeConstPtr& execution); @@ -38,10 +55,16 @@ namespace ScriptCanvas Symbol CheckLogicalExpressionSymbol(const ExecutionTreeConstPtr& execution); + NodelingType CheckNodelingType(const Node& node); + CheckOperatorResult CheckOperatorArithmeticSymbol(const ExecutionTreeConstPtr& execution); void DenumberFirstCharacter(AZStd::string& identifier); + bool ExecutionContainsCycles(const Node& node, const Slot& outSlot); + + ExecutionTraversalResult TraverseExecutionConnections(const Node& node, const Slot& outSlot, GraphExecutionPathTraversalListener& listener); + bool ExecutionWritesVariable(ExecutionTreeConstPtr execution, VariableConstPtr variable); const Slot* GetOnceOnResetSlot(const Node& node); @@ -56,6 +79,8 @@ namespace ScriptCanvas bool IsBreak(const ExecutionTreeConstPtr& execution); + bool IsCodeConstructable(VariableConstPtr value); + bool IsCycle(const Node& node); bool IsCycle(const ExecutionTreeConstPtr& execution); @@ -70,6 +95,8 @@ namespace ScriptCanvas bool IsExecutedPropertyExtraction(const ExecutionTreeConstPtr& execution); + bool IsExternallyInitialized(VariableConstPtr value); + bool IsFloatingPointNumberEqualityComparison(ExecutionTreeConstPtr execution); bool IsFlowControl(const ExecutionTreeConstPtr& execution); @@ -96,6 +123,8 @@ namespace ScriptCanvas bool IsLooping(Symbol symbol); + bool IsManuallyDeclaredUserVariable(VariableConstPtr variable); + bool IsMidSequence(const ExecutionTreeConstPtr& execution); bool IsNoOp(const AbstractCodeModel& model, const ExecutionTreeConstPtr& parent, const Grammar::ExecutionChild& child); @@ -116,6 +145,10 @@ namespace ScriptCanvas bool IsPropertyExtractionNode(const ExecutionTreeConstPtr& execution); + bool IsPure(Symbol symbol); + + bool IsPure(const Node* node, const Slot* slot); + bool IsRandomSwitchStatement(const ExecutionTreeConstPtr& execution); bool IsSequenceNode(const Node* node); @@ -126,11 +159,11 @@ namespace ScriptCanvas bool IsUserFunctionCall(const ExecutionTreeConstPtr& execution); - bool IsUserFunctionCallPure(const ExecutionTreeConstPtr& execution); - bool IsUserFunctionDefinition(const ExecutionTreeConstPtr& execution); - bool IsUserOut(const ExecutionTreeConstPtr& execution); + const ScriptCanvas::Nodes::Core::FunctionDefinitionNode* IsUserOutNode(const Node* node); + + const ScriptCanvas::Nodes::Core::FunctionDefinitionNode* IsUserOutNode(const ExecutionTreeConstPtr& execution); bool IsVariableGet(const ExecutionTreeConstPtr& execution); @@ -140,11 +173,11 @@ namespace ScriptCanvas bool IsWrittenMathExpression(const ExecutionTreeConstPtr& execution); - void TraverseTree(const AbstractCodeModel& execution, ExecutionTreeIterationListener& listener); + AZStd::string MakeMemberVariableName(AZStd::string_view name); - void TraverseTree(const ExecutionTreeConstPtr& execution, ExecutionTreeIterationListener& listener); + VariableConstructionRequirement ParseConstructionRequirement(Grammar::VariableConstPtr value); - AZStd::string MakeMemberVariableName(AZStd::string_view name); + void ParseVariableUse(ExecutionTreeConstPtr execution, VariableUseage& variableUse); void PrettyPrint(AZStd::string& result, const AbstractCodeModel& model); @@ -162,6 +195,9 @@ namespace ScriptCanvas AZStd::string ToIdentifierSafe(AZStd::string_view name); + void TraverseTree(const AbstractCodeModel& execution, ExecutionTreeTraversalListener& listener); + + void TraverseTree(const ExecutionTreeConstPtr& execution, ExecutionTreeTraversalListener& listener); } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h index 666447493e..68856325d0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -23,6 +24,7 @@ namespace ScriptCanvas { + class Nodeable; namespace Grammar { enum class Direction @@ -30,6 +32,7 @@ namespace ScriptCanvas In, Out }; + enum class EventHandingType { EBus, @@ -42,9 +45,18 @@ namespace ScriptCanvas { Class, Namespace, + Self, Variable, }; + enum class NodelingType + { + In, + None, + Out, + OutReturn, + }; + enum TraitsFlags { Const = 1 << 0, @@ -161,12 +173,24 @@ namespace ScriptCanvas virtual ~NodeableParse() {} VariableConstPtr m_nodeable; + AZStd::string m_simpleName; AZStd::vector m_onInputChanges; AZStd::vector> m_latents; void Clear(); }; + struct ParsedRuntimeInputs + { + AZStd::vector m_nodeables; + AZStd::vector> m_variables; + // either the entityId was a (member) variable in the source graph, or it got promoted to one during parsing + AZStd::vector> m_entityIds; + // Statics required for internal, local values that need non-code constructible initialization, + // when the system can't pass in the input from C++. + AZStd::vector> m_staticVariables; + }; + struct PropertyExtraction : public AZStd::enable_shared_from_this { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp new file mode 100644 index 0000000000..0b1286e3f5 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp @@ -0,0 +1,23 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "PrimitivesDeclarations.h" + +namespace ScriptCanvas +{ + namespace Grammar + { + AZ_CVAR(bool, g_disableParseOnGraphValidation, false, {}, AZ::ConsoleFunctorFlags::Null, "In case parsing the graph is interfering with opening a graph, disable parsing on validation"); + AZ_CVAR(bool, g_printAbstractCodeModel, false, {}, AZ::ConsoleFunctorFlags::Null, "Print out the Abstract Code Model at the end of parsing for debug purposes."); + AZ_CVAR(bool, g_saveRawTranslationOuputToFile, false, {}, AZ::ConsoleFunctorFlags::Null, "Save out the raw result of translation for debug purposes."); + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h index da9679fb8e..72449ebc6d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h @@ -24,6 +24,10 @@ #include #include +#if defined (FUNCTION_LEGACY_SUPPORT_ENABLED) +#include "FunctionsLegacySupport.h" +#endif + namespace AZ { class ReflectContext; @@ -136,16 +140,33 @@ namespace ScriptCanvas constexpr const char* k_memberNamePrefix = "m_"; - enum class VariableScopeMeaning : AZ::u32 + constexpr const char* k_DependentAssetsArgName = "dependentAssets"; + constexpr const char* k_DependentAssetsIndexArgName = "dependentAssetsIndex"; + constexpr const char* k_UnpackDependencyConstructionArgsFunctionName = "UnpackDependencyConstructionArgs"; + constexpr const char* k_UnpackDependencyConstructionArgsLeafFunctionName = "UnpackDependencyConstructionArgsLeaf"; + + enum class ExecutionCharacteristics : AZ::u32 { - ValueInitialization, - FunctionPrototype, + Object, + Pure, }; - enum class ExecutionCharacteristics : AZ::u32 + // default to a pure, interpreted function + enum ExecutionStateSelection : AZ::u32 { - PerEntity, - Pure, + InterpretedPure, + InterpretedPureOnGraphStart, + InterpretedObject, + InterpretedObjectOnGraphStart, + }; + + enum class VariableConstructionRequirement + { + InputEntityId, + InputNodeable, + InputVariable, + None, + Static, }; // create Symbol enum @@ -229,8 +250,16 @@ namespace ScriptCanvas using VariableWriteHandlingConstSet = AZStd::unordered_set; using VariableWriteHandlingByVariable = AZStd::unordered_map; - AZ_CVAR(bool, s_saveRawTranslationOuputToFile, true, {}, AZ::ConsoleFunctorFlags::Null, "Save out the raw result of translation for debug purposes."); - AZ_CVAR(bool, s_printAbstractCodeModel, true, {}, AZ::ConsoleFunctorFlags::Null, "Print out the Abstract Code Model at the end of parsing for debug purposes."); + AZ_CVAR_EXTERNED(bool, g_disableParseOnGraphValidation); + AZ_CVAR_EXTERNED(bool, g_printAbstractCodeModel); + AZ_CVAR_EXTERNED(bool, g_saveRawTranslationOuputToFile); + + struct DependencyInfo + { + AZ::Data::AssetId assetId; + bool requiresCtorParams = false; + bool requiresCtorParamsForDependencies = false; + }; struct Request { @@ -281,9 +310,7 @@ namespace ScriptCanvas AZStd::string ToTypeSafeEBusResultName(const Data::Type& type); AZStd::string ToSafeName(const AZStd::string& name); NamespacePath ToNamespacePath(AZStd::string_view path, AZStd::string_view name); - } - } namespace AZStd @@ -294,7 +321,7 @@ namespace AZStd using argument_type = ScriptCanvas::Grammar::ExecutionTreeConstPtr; using result_type = size_t; - AZ_INLINE result_type operator() (const argument_type& id) const + inline result_type operator() (const argument_type& id) const { size_t h = 0; hash_combine(h, id.get()); @@ -308,7 +335,7 @@ namespace AZStd using argument_type = ScriptCanvas::Grammar::OutputAssignmentConstPtr; using result_type = size_t; - AZ_INLINE result_type operator() (const argument_type& id) const + inline result_type operator() (const argument_type& id) const { size_t h = 0; hash_combine(h, id.get()); @@ -322,7 +349,7 @@ namespace AZStd using argument_type = ScriptCanvas::Grammar::VariableConstPtr; using result_type = size_t; - AZ_INLINE result_type operator() (const argument_type& id) const + inline result_type operator() (const argument_type& id) const { size_t h = 0; hash_combine(h, id.get()); @@ -336,7 +363,7 @@ namespace AZStd using argument_type = ScriptCanvas::Grammar::VariableWriteHandlingPtr; using result_type = size_t; - AZ_INLINE result_type operator() (const argument_type& id) const + inline result_type operator() (const argument_type& id) const { size_t h = 0; hash_combine(h, id.get()); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp index e40b4b42d0..e1e46d231e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp @@ -118,10 +118,19 @@ namespace ScriptCanvas void ExecutionTree::CopyReturnValuesToInputs(ExecutionTreeConstPtr source) { AZ_Assert(m_input.empty(), "mixing return values with input"); + + if (!m_in.m_node) + { + return; + } + for (auto& returnValue : source->m_returnValues) { - // \todo convert to DebugDataSource::from variable - m_input.push_back({ nullptr, returnValue.second->m_source, DebugDataSource::FromInternal() }); + // only copy the value if the out call has the slot in question + if (auto slot = m_in.m_node->GetSlot(returnValue.second->m_source->m_sourceSlotId)) + { + m_input.push_back({ nullptr, returnValue.second->m_source, DebugDataSource::FromSelfSlot(*slot) }); + } } } @@ -286,6 +295,11 @@ namespace ScriptCanvas return m_symbol; } + bool ExecutionTree::HasExplicitUserOutCalls() const + { + return m_hasExplicitUserOutCalls; + } + bool ExecutionTree::HasReturnValues() const { return !m_returnValues.empty(); @@ -332,6 +346,11 @@ namespace ScriptCanvas return GetRoot()->m_isPure; } + bool ExecutionTree::IsStart() const + { + return m_isStart; + } + void ExecutionTree::MarkDebugEmptyStatement() { if (GetSymbol() != Symbol::UserOut && (GetChildrenCount() == 0 || GetSymbol() == Symbol::PlaceHolderDuringParsing)) @@ -340,6 +359,11 @@ namespace ScriptCanvas } } + void ExecutionTree::MarkHasExplicitUserOutCalls() + { + m_hasExplicitUserOutCalls = true; + } + void ExecutionTree::MarkInfiniteLoopDetectionPoint() { m_isInfiniteLoopDetectionPoint = true; @@ -366,6 +390,11 @@ namespace ScriptCanvas root->m_isLatent = true; } + void ExecutionTree::MarkStart() + { + m_isStart = true; + } + ExecutionChild& ExecutionTree::ModChild(size_t index) { return m_children[index]; @@ -495,16 +524,6 @@ namespace ScriptCanvas } } - bool ExecutionTree::ReturnValuesRoutedToOuts() const - { - return m_returnValuesRoutedToOuts; - } - - void ExecutionTree::RouteReturnValuesToOuts() - { - m_returnValuesRoutedToOuts = true; - } - void ExecutionTree::SetExecutedPropertyExtraction(PropertyExtractionConstPtr propertyExtraction) { m_propertyExtractionExecuted = propertyExtraction; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h index 652e5b5768..518b1ba7f1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h @@ -17,6 +17,9 @@ namespace ScriptCanvas { + using EndpointResolved = AZStd::pair; + using EndpointsResolved = AZStd::vector; + namespace Grammar { // The node and the activation slot. The execution in, or the event or latent out slot. @@ -67,7 +70,7 @@ namespace ScriptCanvas { // The node and the activation slot. The execution in, or the event or latent out slot. - class ExecutionTreeIterationListener; + class ExecutionTreeTraversalListener; struct ExecutionInput { @@ -181,6 +184,8 @@ namespace ScriptCanvas Symbol GetSymbol() const; + bool HasExplicitUserOutCalls() const; + bool HasReturnValues() const; bool IsInfiniteLoopDetectionPoint() const; @@ -195,6 +200,8 @@ namespace ScriptCanvas bool IsPure() const; + bool IsStart() const; + void MarkDebugEmptyStatement(); void MarkInfiniteLoopDetectionPoint(); @@ -207,6 +214,8 @@ namespace ScriptCanvas void MarkRootLatent(); + void MarkStart(); + ExecutionChild& ModChild(size_t index); ConversionByIndex& ModConversions(); @@ -227,9 +236,7 @@ namespace ScriptCanvas AZ::Outcome> RemoveChild(const ExecutionTreeConstPtr& child); - bool ReturnValuesRoutedToOuts() const; - - void RouteReturnValuesToOuts(); + void MarkHasExplicitUserOutCalls(); void SetExecutedPropertyExtraction(PropertyExtractionConstPtr propertyExtraction); @@ -252,7 +259,6 @@ namespace ScriptCanvas void SetSymbol(Symbol val); protected: - VariableConstPtr m_nodeable; private: @@ -276,7 +282,9 @@ namespace ScriptCanvas bool m_isPure = false; - bool m_returnValuesRoutedToOuts = false; + bool m_isStart = false; + + bool m_hasExplicitUserOutCalls = false; // The node and the activation slot. The execution in, or the event or latent out slot. ExecutionId m_in; @@ -305,11 +313,12 @@ namespace ScriptCanvas size_t FindIndexOfChild(ExecutionTreeConstPtr child) const; }; - class ExecutionTreeIterationListener + class ExecutionTreeTraversalListener { public: - virtual ~ExecutionTreeIterationListener() {} + virtual ~ExecutionTreeTraversalListener() {} + virtual bool CancelledTraversal() { return false; } virtual void Evaluate(ExecutionTreeConstPtr /*node*/, const Slot* /*slot*/, int /*level*/) {} virtual void EvaluateNullChildLeaf(ExecutionTreeConstPtr /*parent*/, const Slot* /*slot*/, size_t /*index*/, int /*level*/) {} virtual void EvaluateChildPost(ExecutionTreeConstPtr /*node*/, const Slot* /*slot*/, size_t /*index*/, int /*level*/) {} @@ -319,5 +328,22 @@ namespace ScriptCanvas virtual void Reset() {} }; + enum class ExecutionTraversalResult + { + Success, + ContainsCycle, + NullSlot, + NullNode, + GetSlotError, + }; + + class GraphExecutionPathTraversalListener + { + public: + virtual ~GraphExecutionPathTraversalListener() {} + + virtual bool CancelledTraversal() { return false; } + virtual void Evaluate([[maybe_unused]] const EndpointResolved& endpoint) {} + }; } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.h index 6667694b3b..15f1de58f4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.h @@ -43,7 +43,7 @@ namespace ScriptCanvas const AZStd::unordered_map& GetSlotsByName() const; - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml new file mode 100644 index 0000000000..1f9803db14 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasNode.xml deleted file mode 100644 index 5f7969ee86..0000000000 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasNode.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h index 73a6244dc8..f8fbcfdda0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h @@ -53,7 +53,7 @@ namespace ScriptCanvas AZ_INLINE const NamedSlotIdMap& GetNamedSlotIdMap() const { return m_formatSlotMap; } AZ_INLINE const int GetPostDecimalPrecision() const { return m_numericPrecision; } - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.cpp index 57c4b14542..796744a08c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.cpp @@ -230,7 +230,7 @@ namespace ScriptCanvas::Nodes::Core return GetNodeType(); } - SlotsOutcome AzEventHandler::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, [[maybe_unused]] const Slot* executionChildSlot) const + ConstSlotsOutcome AzEventHandler::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, [[maybe_unused]] const Slot* executionChildSlot) const { AZStd::vector slots; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.h index 0124d38c28..c8a308dda7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.h @@ -55,7 +55,7 @@ namespace ScriptCanvas::Nodes::Core size_t GenerateFingerprint() const override; - bool IsSupportedByNewBackend() const override { return true; } + AZ::Outcome GetFunctionCallLexicalScope(const Slot* slot) const override; @@ -79,7 +79,7 @@ namespace ScriptCanvas::Nodes::Core NodeTypeIdentifier GetOutputNodeType(const SlotId& slotId) const override; protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const override; + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const override; private: AzEventEntry m_azEventEntry; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BinaryOperator.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BinaryOperator.h index d770442b7c..351d02f2cc 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BinaryOperator.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BinaryOperator.h @@ -39,10 +39,10 @@ namespace ScriptCanvas static const char* k_onTrue; static const char* k_onFalse; - bool IsSupportedByNewBackend() const override { return true; } + protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& /*executionSlot*/, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& /*executionSlot*/, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } @@ -71,7 +71,7 @@ namespace ScriptCanvas static void Reflect(AZ::ReflectContext* reflection); bool IsDeprecated() const override { return true; } - bool IsSupportedByNewBackend() const override { return false; } + AZStd::unordered_map> GetReplacementSlotsMap() const override; void CustomizeReplacementNode(Node* replacementNode, AZStd::unordered_map>& outSlotIdMap) const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.cpp index 83cfce4892..01984d01f1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.cpp @@ -120,7 +120,7 @@ namespace ScriptCanvas AddNodeToRegistry(nodeRegistry); AddNodeToRegistry(nodeRegistry); AddNodeToRegistry(nodeRegistry); - AddNodeToRegistry(nodeRegistry); + AddNodeToRegistry(nodeRegistry); AddNodeToRegistry(nodeRegistry); // Nodeables AddNodeToRegistry(nodeRegistry); @@ -145,7 +145,7 @@ namespace ScriptCanvas ScriptCanvas::Nodes::Core::ReceiveScriptEvent::CreateDescriptor(), ScriptCanvas::Nodes::Core::SendScriptEvent::CreateDescriptor(), ScriptCanvas::Nodes::Core::Repeater::CreateDescriptor(), - ScriptCanvas::Nodes::Core::FunctionNode::CreateDescriptor(), + ScriptCanvas::Nodes::Core::FunctionCallNode::CreateDescriptor(), ScriptCanvas::Nodes::Core::FunctionDefinitionNode::CreateDescriptor(), // Nodeables ScriptCanvas::Nodes::RepeaterNodeableNode::CreateDescriptor(), diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.h index 47ce678c78..fc92a2e8bf 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/CoreNodes.h @@ -22,7 +22,7 @@ #include "ExtractProperty.h" #include "FunctionDefinitionNode.h" #include "ForEach.h" -#include "FunctionNode.h" +#include "FunctionCallNode.h" #include "GetVariable.h" #include "Method.h" #include "MethodOverloaded.h" diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp index c12059693e..cd57cb6608 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp @@ -155,7 +155,7 @@ namespace ScriptCanvas return IsIDRequired(); } - bool EBusEventHandler::HandlerStartsConnected() const + bool EBusEventHandler::IsAutoConnected() const { return m_autoConnectToGraphOwner; } @@ -264,7 +264,7 @@ namespace ScriptCanvas } } - SlotsOutcome EBusEventHandler::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const + ConstSlotsOutcome EBusEventHandler::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const { return EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(*this, executionSlot, targetSlotType); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h index f8af3a1065..890b50a9e4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h @@ -103,7 +103,7 @@ namespace ScriptCanvas bool IsOutOfDate(const VersionData& graphVersion) const override; - bool IsSupportedByNewBackend() const override { return true; } + bool CreateHandler(AZStd::string_view ebusName); @@ -117,7 +117,7 @@ namespace ScriptCanvas bool IsEBusAddressed() const override; const EBusEventEntry* FindEvent(const AZStd::string& name) const; AZStd::string GetEBusName() const override; - bool HandlerStartsConnected() const override; + bool IsAutoConnected() const override; const Datum* GetHandlerStartAddress() const override; const Slot* GetEBusConnectAddressSlot() const override; AZStd::vector GetOnVariableHandlingDataSlots() const override; @@ -166,7 +166,7 @@ namespace ScriptCanvas protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const override; + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const override; inline bool IsConfigured() const { return !m_eventMap.empty(); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.cpp index 41e38bcd95..83ab4a049d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.cpp @@ -18,42 +18,42 @@ namespace ScriptCanvas { namespace Core { - SlotsOutcome EventHandlerTranslationHelper::GetReturnValueSlotsByEventEntry(const EBusEventHandler& handler, const EBusEventEntry& eventEntry) + ConstSlotsOutcome EventHandlerTranslationHelper::GetReturnValueSlotsByEventEntry(const EBusEventHandler& handler, const EBusEventEntry& eventEntry) { return GetReturnValueSlotsByEventEntry(handler, eventEntry); } - SlotsOutcome EventHandlerTranslationHelper::GetReturnValueSlotsByEventEntry(const ReceiveScriptEvent& handler, const Internal::ScriptEventEntry& eventEntry) + ConstSlotsOutcome EventHandlerTranslationHelper::GetReturnValueSlotsByEventEntry(const ReceiveScriptEvent& handler, const Internal::ScriptEventEntry& eventEntry) { return GetReturnValueSlotsByEventEntry(handler, eventEntry); } - SlotsOutcome EventHandlerTranslationHelper::GetEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& slot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& slot, CombinedSlotType targetSlotType) { return GetEventSlotsInExecutionThreadByType(handler, slot, targetSlotType); } - SlotsOutcome EventHandlerTranslationHelper::GetEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& slot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& slot, CombinedSlotType targetSlotType) { return GetEventSlotsInExecutionThreadByType(handler, slot, targetSlotType); } - SlotsOutcome EventHandlerTranslationHelper::GetNonEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& slot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetNonEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& slot, CombinedSlotType targetSlotType) { return GetNonEventSlotsInExecutionThreadByType(handler, slot, targetSlotType); } - SlotsOutcome EventHandlerTranslationHelper::GetNonEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& slot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetNonEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& slot, CombinedSlotType targetSlotType) { return GetNonEventSlotsInExecutionThreadByType(handler, slot, targetSlotType); } - SlotsOutcome EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& slot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& slot, CombinedSlotType targetSlotType) { return GetSlotsInExecutionThreadByType(handler, slot, targetSlotType); } - SlotsOutcome EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& slot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& slot, CombinedSlotType targetSlotType) { return GetSlotsInExecutionThreadByType(handler, slot, targetSlotType); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.h index efe3e4dccd..88cf9e34e5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.h @@ -28,33 +28,33 @@ namespace ScriptCanvas { public: // EbusEvent handler - static SlotsOutcome GetSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); // ScriptEvent handler - static SlotsOutcome GetSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); private: - static SlotsOutcome GetReturnValueSlotsByEventEntry(const EBusEventHandler& handler, const EBusEventEntry& eventEntry); - static SlotsOutcome GetReturnValueSlotsByEventEntry(const ReceiveScriptEvent& handler, const Internal::ScriptEventEntry& eventEntry); + static ConstSlotsOutcome GetReturnValueSlotsByEventEntry(const EBusEventHandler& handler, const EBusEventEntry& eventEntry); + static ConstSlotsOutcome GetReturnValueSlotsByEventEntry(const ReceiveScriptEvent& handler, const Internal::ScriptEventEntry& eventEntry); template - static SlotsOutcome GetReturnValueSlotsByEventEntry(const HandlerType& handler, const EntryType& eventEntry); + static ConstSlotsOutcome GetReturnValueSlotsByEventEntry(const HandlerType& handler, const EntryType& eventEntry); - static SlotsOutcome GetEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); - static SlotsOutcome GetEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); template - static SlotsOutcome GetEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); - static SlotsOutcome GetNonEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); - static SlotsOutcome GetNonEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetNonEventSlotsInExecutionThreadByType(const EBusEventHandler& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetNonEventSlotsInExecutionThreadByType(const ReceiveScriptEvent& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); template - static SlotsOutcome GetNonEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetNonEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); template - static SlotsOutcome GetSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); + static ConstSlotsOutcome GetSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType); }; template - SlotsOutcome EventHandlerTranslationHelper::GetReturnValueSlotsByEventEntry(const HandlerType& handler, const EntryType& eventEntry) + ConstSlotsOutcome EventHandlerTranslationHelper::GetReturnValueSlotsByEventEntry(const HandlerType& handler, const EntryType& eventEntry) { if (!eventEntry.m_resultSlotId.IsValid()) { @@ -71,7 +71,7 @@ namespace ScriptCanvas } template - SlotsOutcome EventHandlerTranslationHelper::GetEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType) { const EntryType* eventEntry = handler.FindEventWithSlot(executionSlot); @@ -97,7 +97,7 @@ namespace ScriptCanvas } template - SlotsOutcome EventHandlerTranslationHelper::GetNonEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetNonEventSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType) { AZStd::vector executionSlots; AZStd::vector errorSlots; @@ -179,7 +179,7 @@ namespace ScriptCanvas } template - SlotsOutcome EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType) + ConstSlotsOutcome EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(const HandlerType& handler, const Slot& executionSlot, CombinedSlotType targetSlotType) { if (handler.IsEventSlotId(executionSlot.GetId())) { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.h index 8d1359c977..522f63eeb4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.h @@ -49,7 +49,7 @@ namespace ScriptCanvas bool IsOutOfDate(const VersionData& graphVersion) const override; //// - bool IsSupportedByNewBackend() const override { return true; } + protected: bool IsPropertySlot(const SlotId& slotId) const; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.h index d546014647..68e75adc80 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.h @@ -58,7 +58,7 @@ namespace ScriptCanvas bool IsOutOfDate(const VersionData& graphVersion) const override; - bool IsSupportedByNewBackend() const override { return true; } + UpdateResult OnUpdateNode() override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml new file mode 100644 index 0000000000..c3b125c692 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.cpp new file mode 100644 index 0000000000..cec643d799 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.cpp @@ -0,0 +1,812 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include "FunctionCallNode.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "FunctionCallNodeIsOutOfDate.h" + +namespace ScriptCanvas +{ + namespace Nodes + { + namespace Core + { + ///////////////// + // FunctionCallNode + ///////////////// + + FunctionCallNode::FunctionCallNode() + : m_asset(AZ::Data::AssetLoadBehavior::NoLoad) + {} + + FunctionCallNode::~FunctionCallNode() + { + AZ::Data::AssetBus::Handler::BusDisconnect(); + } + + + SlotExecution::In FunctionCallNode::AddAllSlots(const Grammar::In& interfaceIn, int& slotOffset, const SlotExecution::Map& previousMap) + { + SlotExecution::In slotMapIn = AddExecutionInSlotFromInterface(interfaceIn, slotOffset, previousMap.FindInSlotIdBySource(interfaceIn.sourceID)); + ++slotOffset; + if (!slotMapIn.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Execution In slot from sub graph interface"); + } + + slotMapIn.inputs = AddDataInputSlotsFromInterface(interfaceIn.inputs, interfaceIn.sourceID, interfaceIn.displayName, previousMap, slotOffset); + for (auto& input : slotMapIn.inputs) + { + if (!input.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Input slot from sub graph interface"); + break;; + } + } + + for (auto& interfaceOut : interfaceIn.outs) + { + slotMapIn.outs.push_back(AddAllSlots(interfaceIn, interfaceOut, slotOffset, previousMap)); + } + + return slotMapIn; + } + + SlotExecution::Out FunctionCallNode::AddAllSlots(const Grammar::In& interfaceIn, const Grammar::Out& interfaceOut, int& slotOffset, const SlotExecution::Map& previousMap) + { + SlotExecution::Out slotMapOut = AddExecutionOutSlotFromInterface(interfaceIn, interfaceOut, slotOffset, previousMap.FindOutSlotIdBySource(interfaceIn.sourceID, interfaceOut.sourceID)); + ++slotOffset; + + if (!slotMapOut.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Execution Out slot from sub graph interface"); + } + + slotMapOut.outputs = AddDataOutputSlotsFromInterface(interfaceOut.outputs, "", previousMap, slotOffset); + for (auto& output : slotMapOut.outputs) + { + if (!output.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Output slot from sub graph interface"); + break; + } + } + + return slotMapOut; + } + + SlotExecution::Out FunctionCallNode::AddAllSlots(const Grammar::Out& interfaceLatent, int& slotOffset, const SlotExecution::Map& previousMap) + { + SlotExecution::Out slotMapLatentOut = AddExecutionLatentOutSlotFromInterface(interfaceLatent, slotOffset, previousMap.FindLatentSlotIdBySource(interfaceLatent.sourceID)); + ++slotOffset; + + if (!slotMapLatentOut.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Latent Out slot from sub graph interface"); + } + + slotMapLatentOut.returnValues.values = AddDataInputSlotsFromInterface(interfaceLatent.returnValues, interfaceLatent.sourceID, interfaceLatent.displayName, previousMap, slotOffset); + for (auto& input : slotMapLatentOut.returnValues.values) + { + if (!input.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Input slot from sub graph interface"); + break; + } + } + + slotMapLatentOut.outputs = AddDataOutputSlotsFromInterface(interfaceLatent.outputs, "", previousMap, slotOffset); + for (auto& output : slotMapLatentOut.outputs) + { + if (!output.slotId.IsValid()) + { + AZ_Error("ScriptCanvas", false, "Failed to add Output slot from sub graph interface"); + break; + } + } + + return slotMapLatentOut; + } + + SlotExecution::In FunctionCallNode::AddExecutionInSlotFromInterface(const Grammar::In& in, int slotOffset, SlotId previousSlotId) + { + ExecutionSlotConfiguration config; + config.m_name = in.displayName; + config.m_displayGroup = in.displayName; + config.SetConnectionType(ScriptCanvas::ConnectionType::Input); + config.m_isLatent = false; + if (previousSlotId.IsValid()) + { + config.m_slotId = previousSlotId; + } + + SlotExecution::In slotMapIn; + slotMapIn.slotId = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); + slotMapIn.parsedName = in.parsedName; + slotMapIn.interfaceSourceId = in.sourceID; + return slotMapIn; + } + + SlotExecution::Out FunctionCallNode::AddExecutionOutSlotFromInterface(const Grammar::In& in, const Grammar::Out& out, int slotOffset, SlotId previousSlotId) + { + ExecutionSlotConfiguration config; + config.m_name = out.displayName; + config.m_displayGroup = in.displayName; + config.SetConnectionType(ScriptCanvas::ConnectionType::Output); + config.m_isLatent = false; + if (previousSlotId.IsValid()) + { + config.m_slotId = previousSlotId; + } + + SlotExecution::Out slotMapOut; + slotMapOut.slotId = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); + slotMapOut.interfaceSourceId = out.sourceID; + slotMapOut.name = out.displayName; + return slotMapOut; + } + + SlotExecution::Out FunctionCallNode::AddExecutionLatentOutSlotFromInterface(const Grammar::Out& latent, int slotOffset, SlotId previousSlotId) + { + ExecutionSlotConfiguration config; + config.m_name = latent.displayName; + config.m_displayGroup = latent.displayName; + config.SetConnectionType(ScriptCanvas::ConnectionType::Output); + config.m_isLatent = true; + if (previousSlotId.IsValid()) + { + config.m_slotId = previousSlotId; + } + + SlotExecution::Out slotMapLatentOut; + slotMapLatentOut.slotId = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); + slotMapLatentOut.name = latent.displayName; + slotMapLatentOut.interfaceSourceId = latent.sourceID; + return slotMapLatentOut; + } + + SlotExecution::Inputs FunctionCallNode::AddDataInputSlotsFromInterface(const Grammar::Inputs& inputs, const Grammar::FunctionSourceId& inSourceId, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset) + { + SlotExecution::Inputs slotMapInputs; + for (const auto& input : inputs) + { + DataSlotConfiguration config; + config.m_name = input.displayName; + config.m_displayGroup = displayGroup; + config.m_addUniqueSlotByNameAndType = false; + config.SetConnectionType(ScriptCanvas::ConnectionType::Input); + config.DeepCopyFrom(input.datum); + auto previousSlotId = previousMap.FindInputSlotIdBySource(input.sourceID, inSourceId); + if (previousSlotId.IsValid()) + { + config.m_slotId = previousSlotId; + } + + SlotExecution::Input slotMapInput; + slotMapInput.slotId = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); + ++slotOffset; + slotMapInput.interfaceSourceId = input.sourceID; + slotMapInputs.push_back(slotMapInput); + if (!slotMapInput.slotId.IsValid()) + { + return slotMapInputs; + } + } + return slotMapInputs; + } + + SlotExecution::Outputs FunctionCallNode::AddDataOutputSlotsFromInterface(const Grammar::Outputs& outputs, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset) + { + AZ_UNUSED(displayGroup); + + SlotExecution::Outputs slotMapOutputs; + for (const auto& output : outputs) + { + DataSlotConfiguration config; + config.m_name = output.displayName; + config.m_displayGroup = "(shared across all execution for now)"; // displayGroup + config.SetConnectionType(ScriptCanvas::ConnectionType::Output); + config.SetType(output.type); + auto previousSlotId = previousMap.FindOutputSlotIdBySource(output.sourceID); + if (previousSlotId.IsValid()) + { + config.m_slotId = previousSlotId; + } + + SlotExecution::Output outputSlotMap = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); + ++slotOffset; + outputSlotMap.interfaceSourceId = output.sourceID; + slotMapOutputs.push_back(outputSlotMap); + if (!outputSlotMap.slotId.IsValid()) + { + return slotMapOutputs; + } + } + return slotMapOutputs; + } + + + void FunctionCallNode::BuildNode() + { + AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().GetAsset(m_asset.GetId(), AZ::Data::AssetLoadBehavior::PreLoad); + m_slotExecutionMapSourceInterface = Grammar::SubgraphInterface{}; + m_slotExecutionMap = SlotExecution::Map{}; + BuildNodeFromSubgraphInterface(asset, m_sourceId, m_slotExecutionMap); + } + + void FunctionCallNode::BuildNodeFromSubgraphInterface + ( const AZ::Data::Asset& runtimeAsset + , const ScriptCanvas::Grammar::FunctionSourceId& sourceId + , const SlotExecution::Map& previousMap) + { + const Grammar::SubgraphInterface& subgraphInterface = runtimeAsset.Get()->m_runtimeData.m_interface; + + if (subgraphInterface.IsUserNodeable() && Grammar::IsFunctionSourceIdNodeable(sourceId) && subgraphInterface.HasIn(sourceId)) + { + m_prettyName = runtimeAsset.Get()->m_runtimeData.m_name; + BuildUserNodeableNode(subgraphInterface, previousMap); + } + else if ((!Grammar::IsFunctionSourceIdNodeable(sourceId)) && subgraphInterface.HasIn(sourceId)) + { + BuildUserFunctionCallNode(subgraphInterface, sourceId, previousMap); + } + + m_slotExecutionMapSourceInterface = subgraphInterface; + m_asset = runtimeAsset; + m_asset.SetAutoLoadBehavior(AZ::Data::AssetLoadBehavior::NoLoad); + m_sourceId = sourceId; + SignalSlotsReordered(); + } + + void FunctionCallNode::BuildUserFunctionCallNode + ( const Grammar::SubgraphInterface& subgraphInterface + , const ScriptCanvas::Grammar::FunctionSourceId& sourceId + , const SlotExecution::Map& previousMap) + { + if (auto interfaceIn = subgraphInterface.FindIn(sourceId)) + { + int slotOffset = 0; + auto in = AddAllSlots(*interfaceIn, slotOffset, previousMap); + // #functions2 FunctionCallNode cleanup, naming: always have the two names...file name for the title bar, In name for the method/file name for the object + m_prettyName = interfaceIn->displayName; + + SlotExecution::Ins slotMapIns; + slotMapIns.push_back(in); + SlotExecution::Outs slotMapLatents; + m_slotExecutionMap = AZStd::move(SlotExecution::Map(AZStd::move(slotMapIns), AZStd::move(slotMapLatents))); + } + else + { + AZ_Error("ScriptCanvas", false, "Failed to add Execution In slot from sub graph interface, source id was missing"); + } + } + + void FunctionCallNode::BuildUserNodeableNode(const Grammar::SubgraphInterface& subgraphInterface, const SlotExecution::Map& previousMap) + { + SlotExecution::Ins slotMapIns; + SlotExecution::Outs slotMapLatents; + int slotOffset = 0; + + for (size_t indexIn = 0; indexIn < subgraphInterface.GetInCount(); ++indexIn) + { + const auto& in = subgraphInterface.GetIn(indexIn); + + if (!in.isPure) + { + slotMapIns.push_back(AddAllSlots(subgraphInterface.GetIn(indexIn), slotOffset, previousMap)); + } + } + + for (size_t indexLatent = 0; indexLatent < subgraphInterface.GetLatentOutCount(); ++indexLatent) + { + slotMapLatents.push_back(AddAllSlots(subgraphInterface.GetLatentOut(indexLatent), slotOffset, previousMap)); + } + + // when returning variables: sort variables by source slot id, they are sorted in the slot map, so just take them from the slot map + m_slotExecutionMap = AZStd::move(SlotExecution::Map(AZStd::move(slotMapIns), AZStd::move(slotMapLatents))); + } + + AZ::Outcome FunctionCallNode::GetFunctionCallLexicalScope(const Slot* slot) const + { + if (slot) + { + if (const auto slotIn = m_slotExecutionMap.GetIn(slot->GetId())) + { + if (slotIn->interfaceSourceId == m_sourceId) + { + if (const auto in = m_slotExecutionMapSourceInterface.FindIn(slotIn->interfaceSourceId)) + { + return AZ::Success(m_slotExecutionMapSourceInterface.GetLexicalScope(*in)); + } + } + } + } + + return AZ::Success(m_slotExecutionMapSourceInterface.GetLexicalScope()); + } + + AZ::Outcome FunctionCallNode::GetFunctionCallName(const Slot* slot) const + { + if (auto in = m_slotExecutionMap.GetIn(slot->GetId())) + { + return AZ::Success(in->parsedName); + } + else + { + return AZ::Failure(); + } + } + + AZStd::string FunctionCallNode::GetInterfaceName() const + { + return m_slotExecutionMapSourceInterface.GetName(); + } + + bool FunctionCallNode::IsEntryPoint() const + { + return m_slotExecutionMapSourceInterface.IsActiveDefaultObject() + || m_slotExecutionMapSourceInterface.IsLatent(); + } + + bool FunctionCallNode::IsNodeableNode() const + { + return m_slotExecutionMapSourceInterface.IsUserNodeable() && Grammar::IsFunctionSourceIdNodeable(m_sourceId) ; + } + + bool FunctionCallNode::IsPure() const + { + auto inSlots = GetSlotsByType(CombinedSlotType::ExecutionIn); + return inSlots.size() == 1 && IsSlotPure(inSlots.front()); + } + + bool FunctionCallNode::IsSlotPure(const Slot* slot) const + { + auto slotMapIn = slot ? m_slotExecutionMap.GetIn(slot->GetId()) : nullptr; + auto in = slotMapIn ? m_slotExecutionMapSourceInterface.FindIn(slotMapIn->interfaceSourceId) : nullptr; + return in && in->isPure; + } + + void FunctionCallNode::OnInit() + { + if (m_asset.GetId().IsValid()) + { + Initialize(m_asset.GetId(), m_sourceId); + } + } + + SubgraphInterfaceAsset* FunctionCallNode::GetAsset() const + { + return m_asset.GetAs(); + } + + AZ::Data::AssetId FunctionCallNode::GetAssetId() const + { + return m_asset.GetId(); + } + + AZ::Outcome FunctionCallNode::GetDependencies() const + { + DependencyReport report; + report.userSubgraphs.insert(m_slotExecutionMapSourceInterface.GetNamespacePath()); + report.userSubgraphAssetIds.insert(m_asset.GetId()); + return AZ::Success(AZStd::move(report)); + } + + const AZStd::string& FunctionCallNode::GetName() const + { + return m_prettyName; + } + + void FunctionCallNode::Initialize(AZ::Data::AssetId assetId, const ScriptCanvas::Grammar::FunctionSourceId& sourceId) + { + PopulateNodeType(); + + // this is the only case where the subgraph id should not be modified + AZ::Data::AssetId interfaceAssetId(assetId.m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); + auto asset = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); + asset.BlockUntilLoadComplete(); + + if (asset) + { + // do not nuke the assetId in case an update will be attempted immediately after this call + m_asset = asset; + m_asset.SetAutoLoadBehavior(AZ::Data::AssetLoadBehavior::NoLoad); + m_sourceId = sourceId; + } + } + + bool FunctionCallNode::IsOutOfDate(const VersionData& graphVersion) const + { + if (graphVersion.grammarVersion < GrammarVersion::Current || graphVersion.runtimeVersion < RuntimeVersion::Current) + { + return true; + } + + FunctionCallNodeCompareConfig config; + return IsOutOfDate(config); + } + + bool FunctionCallNode::IsOutOfDate(const FunctionCallNodeCompareConfig& config) const + { + bool isUnitTestingInProgress = false; + ScriptCanvas::SystemRequestBus::BroadcastResult(isUnitTestingInProgress, &ScriptCanvas::SystemRequests::IsScriptUnitTestingInProgress); + if (isUnitTestingInProgress) + { + return false; + } + + AZ::Data::AssetId interfaceAssetId(m_asset.GetId().m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); + if (interfaceAssetId != m_asset.GetId()) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s wasn't saved out with the proper sub id", m_prettyName.data()); + } + + AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); + asset.BlockUntilLoadComplete(); + + if (!asset || !asset->IsReady()) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s failed to load source asset.", m_prettyName.data()); + return true; + } + + const Grammar::SubgraphInterface* latestAssetInterface = asset ? &asset.Get()->GetData().m_interface : nullptr; + if (!latestAssetInterface) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s failed to load latest interface from the source asset.", m_prettyName.data()); + return true; + } + + IsFunctionCallOutOfDateConfig isOutOfDataConfig{ config, *this, m_slotExecutionMap, m_sourceId, m_slotExecutionMapSourceInterface, *latestAssetInterface }; + return IsFunctionCallNodeOutOfDate(isOutOfDataConfig); + } + + UpdateResult FunctionCallNode::OnUpdateNode() + { + AZ::Data::AssetId interfaceAssetId(m_asset.GetId().m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); + AZ::Data::Asset assetData = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); + assetData.BlockUntilLoadComplete(); + + if (!assetData || !assetData->IsReady()) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s failed to load source asset, likely removed.", m_prettyName.data()); + this->AddNodeDisabledFlag(NodeDisabledFlag::ErrorInUpdate); + return UpdateResult::DisableNode; + } + + FunctionCallNodeCompareConfig config; + if (IsOutOfDate(config)) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s's source public interface has changed", m_prettyName.data()); + this->AddNodeDisabledFlag(NodeDisabledFlag::ErrorInUpdate); + return UpdateResult::DisableNode; + } + + // connections will be removed when the version conversion is finalized after this function returns + const bool k_DoNotRemoveConnections = false; + const bool k_DoNotWarnOnMissingDataSlots = false; + + ExecutionSlotMap executionSlotMap; + DataSlotMap dataSlotMap; + if (m_slotExecutionMap.IsEmpty()) + { + const Grammar::SubgraphInterface& subgraphInterface = assetData.Get()->m_runtimeData.m_interface; + RemoveInsFromInterface(subgraphInterface.GetIns(), executionSlotMap, dataSlotMap, k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); + RemoveOutsFromInterface(subgraphInterface.GetLatentOuts(), executionSlotMap, dataSlotMap, k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); + } + else + { + RemoveInsFromSlotExecution(m_slotExecutionMap.GetIns(), k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); + RemoveOutsFromSlotExecution(m_slotExecutionMap.GetLatents(), k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); + } + + BuildNodeFromSubgraphInterface(assetData, m_sourceId, m_slotExecutionMap); + SanityCheckSlotsAndConnections(executionSlotMap, dataSlotMap); + + this->RemoveNodeDisabledFlag(NodeDisabledFlag::ErrorInUpdate); + return UpdateResult::DirtyGraph; + } + + void FunctionCallNode::RemoveInsFromInterface + ( const Grammar::Ins& ins + , ExecutionSlotMap& executionSlotMap + , DataSlotMap& dataSlotMap + , bool removeConnection + , bool warnOnMissingSlot) + { + for (auto& in : ins) + { + if (auto inSlot = this->GetSlotByNameAndType(in.displayName, CombinedSlotType::ExecutionIn)) + { + executionSlotMap.emplace(in.sourceID, inSlot->GetId()); + RemoveSlot(inSlot->GetId(), removeConnection); + + RemoveInputsFromInterface(in.inputs, dataSlotMap, removeConnection, warnOnMissingSlot); + RemoveOutsFromInterface(in.outs, executionSlotMap, dataSlotMap, removeConnection, warnOnMissingSlot); + } + } + } + + void FunctionCallNode::RemoveInsFromSlotExecution(const SlotExecution::Ins& ins, bool removeConnection, bool warnOnMissingSlot) + { + for (auto& in : ins) + { + RemoveSlot(in.slotId, removeConnection); + + RemoveInputsFromSlotExecution(in.inputs, removeConnection, warnOnMissingSlot); + RemoveOutsFromSlotExecution(in.outs, removeConnection, warnOnMissingSlot); + } + } + + void FunctionCallNode::RemoveInputsFromInterface + ( const Grammar::Inputs& inputs + , DataSlotMap& dataSlotMap + , bool removeConnection + , bool warnOnMissingSlot) + { + for (auto& input : inputs) + { + if (auto inputSlot = this->GetSlotByNameAndType(input.displayName, CombinedSlotType::DataIn)) + { + DataSlotCache dataSlotCache; + dataSlotCache.m_slotId = inputSlot->GetId(); + if (inputSlot->IsVariableReference()) + { + dataSlotCache.m_variableReference = inputSlot->GetVariableReference(); + } + else if (auto inputDatum = inputSlot->FindDatum()) + { + dataSlotCache.m_datum.DeepCopyDatum(*inputDatum); + } + + dataSlotMap.emplace(input.sourceID, dataSlotCache); + RemoveSlot(inputSlot->GetId(), removeConnection, warnOnMissingSlot); + } + } + } + + void FunctionCallNode::RemoveInputsFromSlotExecution(const SlotExecution::Inputs& inputs, bool removeConnection, bool warnOnMissingSlot) + { + for (auto& input : inputs) + { + RemoveSlot(input.slotId, removeConnection, warnOnMissingSlot); + } + } + + void FunctionCallNode::RemoveOutsFromInterface(const Grammar::Outs& outs, ExecutionSlotMap& executionSlotMap, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot) + { + for (auto& out : outs) + { + if (auto inSlot = this->GetSlotByNameAndType(out.displayName, CombinedSlotType::ExecutionOut)) + { + executionSlotMap.emplace(out.sourceID, inSlot->GetId()); + RemoveSlot(inSlot->GetId(), removeConnection); + + RemoveInputsFromInterface(out.returnValues, dataSlotMap, removeConnection, warnOnMissingSlot); + RemoveOutputsFromInterface(out.outputs, dataSlotMap, removeConnection, warnOnMissingSlot); + } + } + } + + void FunctionCallNode::RemoveOutsFromSlotExecution(const SlotExecution::Outs& outs, bool removeConnection, bool warnOnMissingSlot) + { + for (auto& out : outs) + { + RemoveSlot(out.slotId, removeConnection); + + RemoveInputsFromSlotExecution(out.returnValues.values, removeConnection, warnOnMissingSlot); + RemoveOutputsFromSlotExecution(out.outputs, removeConnection, warnOnMissingSlot); + } + } + + void FunctionCallNode::RemoveOutputsFromInterface(const Grammar::Outputs& outputs, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot) + { + for (auto& output : outputs) + { + if (auto outputSlot = this->GetSlotByNameAndType(output.displayName, CombinedSlotType::DataOut)) + { + DataSlotCache dataSlotCache; + dataSlotCache.m_slotId = outputSlot->GetId(); + if (outputSlot->IsVariableReference()) + { + dataSlotCache.m_variableReference = outputSlot->GetVariableReference(); + } + else if (auto outputDatum = outputSlot->FindDatum()) + { + dataSlotCache.m_datum.DeepCopyDatum(*outputDatum); + } + + dataSlotMap.emplace(output.sourceID, dataSlotCache); + RemoveSlot(outputSlot->GetId(), removeConnection, warnOnMissingSlot); + } + } + } + + void FunctionCallNode::RemoveOutputsFromSlotExecution(const SlotExecution::Outputs& outputs, bool removeConnection, bool warnOnMissingSlot) + { + for (auto& output : outputs) + { + RemoveSlot(output.slotId, removeConnection, warnOnMissingSlot); + } + } + + void FunctionCallNode::SanityCheckSlotsAndConnections(const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap) + { + auto graph = this->GetGraph(); + if (graph) + { + ReplacementConnectionMap connectionMap; + SanityCheckInSlotsAndConnections(*graph, m_slotExecutionMap.GetIns(), executionSlotMap, dataSlotMap, connectionMap); + SanityCheckOutSlotsAndConnections(*graph, m_slotExecutionMap.GetLatents(), executionSlotMap, dataSlotMap, connectionMap); + for (auto connectionIter : connectionMap) + { + // need to remove old connection, or create new connection will fail because it triggers sanity check on removed slot + graph->RemoveConnection(connectionIter.first); + + for (auto newEndpointPair : connectionIter.second) + { + if (newEndpointPair.first.IsValid() && newEndpointPair.second.IsValid()) + { + graph->ConnectByEndpoint(newEndpointPair.first, newEndpointPair.second); + } + } + } + } + } + + void FunctionCallNode::SanityCheckInSlotsAndConnections(const Graph& graph, const SlotExecution::Ins& ins, + const ExecutionSlotMap& executionSlotMap, + const DataSlotMap& dataSlotMap, + ReplacementConnectionMap& connectionMap) + { + if (!executionSlotMap.empty()) + { + for (auto& in : ins) + { + auto executionSlotIter = executionSlotMap.find(in.interfaceSourceId); + if (executionSlotIter != executionSlotMap.end()) + { + if (in.slotId != executionSlotIter->second) + { + VersioningUtils::CreateRemapConnectionsForTargetEndpoint(graph, { this->GetEntityId(), executionSlotIter->second }, { this->GetEntityId(), in.slotId }, connectionMap); + } + } + + SanityCheckInputSlotsAndConnections(graph, in.inputs, dataSlotMap, connectionMap); + SanityCheckOutSlotsAndConnections(graph, in.outs, executionSlotMap, dataSlotMap, connectionMap); + } + } + } + + void FunctionCallNode::SanityCheckInputSlotsAndConnections(const Graph& graph, const SlotExecution::Inputs& inputs, + const DataSlotMap& dataSlotMap, + ReplacementConnectionMap& connectionMap) + { + if (!dataSlotMap.empty()) + { + for (auto& input : inputs) + { + auto dataSlotIter = dataSlotMap.find(input.interfaceSourceId); + if (dataSlotIter != dataSlotMap.end()) + { + if (input.slotId != dataSlotIter->second.m_slotId) + { + VersioningUtils::CopyOldValueToDataSlot(this->GetSlot(input.slotId), dataSlotIter->second.m_variableReference, &dataSlotIter->second.m_datum); + VersioningUtils::CreateRemapConnectionsForTargetEndpoint(graph, { this->GetEntityId(), dataSlotIter->second.m_slotId }, { this->GetEntityId(), input.slotId }, connectionMap); + } + } + } + } + } + + void FunctionCallNode::SanityCheckOutSlotsAndConnections(const Graph& graph, const SlotExecution::Outs& outs, + const ExecutionSlotMap& executionSlotMap, + const DataSlotMap& dataSlotMap, + ReplacementConnectionMap& connectionMap) + { + if (!executionSlotMap.empty()) + { + for (auto& out : outs) + { + auto executionSlotIter = executionSlotMap.find(out.interfaceSourceId); + if (executionSlotIter != executionSlotMap.end()) + { + if (out.slotId != executionSlotIter->second) + { + VersioningUtils::CreateRemapConnectionsForSourceEndpoint(graph, { this->GetEntityId(), executionSlotIter->second }, { this->GetEntityId(), out.slotId }, connectionMap); + } + } + + SanityCheckInputSlotsAndConnections(graph, out.returnValues.values, dataSlotMap, connectionMap); + SanityCheckOutputSlotsAndConnections(graph, out.outputs, dataSlotMap, connectionMap); + } + } + } + + void FunctionCallNode::SanityCheckOutputSlotsAndConnections(const Graph& graph, const SlotExecution::Outputs& outputs, + const DataSlotMap& dataSlotMap, + ReplacementConnectionMap& connectionMap) + { + if (!dataSlotMap.empty()) + { + for (auto& output : outputs) + { + auto dataSlotIter = dataSlotMap.find(output.interfaceSourceId); + if (dataSlotIter != dataSlotMap.end()) + { + if (output.slotId != dataSlotIter->second.m_slotId) + { + VersioningUtils::CopyOldValueToDataSlot(this->GetSlot(output.slotId), dataSlotIter->second.m_variableReference, &dataSlotIter->second.m_datum); + VersioningUtils::CreateRemapConnectionsForSourceEndpoint(graph, { this->GetEntityId(), dataSlotIter->second.m_slotId }, { this->GetEntityId(), output.slotId }, connectionMap); + } + } + } + } + } + + const SlotExecution::Map* FunctionCallNode::GetSlotExecutionMap() const + { + return &m_slotExecutionMap; + } + + const Grammar::SubgraphInterface* FunctionCallNode::GetSubgraphInterface() const + { + return &m_slotExecutionMapSourceInterface; + } + + AZStd::string FunctionCallNode::GetUpdateString() const + { + if (m_asset) + { + return AZStd::string::format("Updated Function (%s)", GetName().c_str()); + } + else + { + return AZStd::string::format("Disabled Function (%s)", m_asset.GetId().ToString().c_str()); + } + } + + void FunctionCallNode::OnAssetReady(AZ::Data::Asset asset) + { + AZ::Data::AssetId interfaceAssetId(m_asset.GetId().m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); + m_asset = asset; + AZ::Data::Asset assetData = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); + m_asset.SetAutoLoadBehavior(AZ::Data::AssetLoadBehavior::NoLoad); + + if (!assetData) + { + AZ_TracePrintf("SC", "Asset data unavailable in OnAssetReady"); + return; + } + + m_prettyName = assetData.Get()->m_runtimeData.m_name; + } + } + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.h new file mode 100644 index 0000000000..fe5b453cf3 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.h @@ -0,0 +1,180 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace ScriptCanvas { class RuntimeComponent; } + +namespace ScriptCanvas { struct SubgraphInterfaceData; } + +namespace AZ +{ + class BehaviorMethod; +} + +namespace ScriptCanvas +{ + namespace Nodes + { + namespace Core + { + struct FunctionCallNodeCompareConfig; + + class FunctionCallNode + : public Node + , AZ::Data::AssetBus::Handler + { + enum Version + { + AddParserResults = 3, + RemoveMappingData, + CorrectAssetSubId, + + // Add entry above + Current, + }; + + public: + + SCRIPTCANVAS_NODE(FunctionCallNode); + + FunctionCallNode(); + ~FunctionCallNode() override; + + void BuildNode(); + + SubgraphInterfaceAsset* GetAsset() const; + + AZ::Data::AssetId GetAssetId() const; + + const AZStd::string& GetName() const; + + void Initialize(AZ::Data::AssetId assetId, const ScriptCanvas::Grammar::FunctionSourceId& sourceId); + + bool IsOutOfDate(const VersionData& graphVersion) const override; + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config) const; + + UpdateResult OnUpdateNode() override; + + AZStd::string GetUpdateString() const override; + //// + + ////////////////////////////////////////////////////////////////////////// + // Translation + + + AZ::Outcome GetDependencies() const override; + + AZ::Outcome GetFunctionCallLexicalScope(const Slot* slot) const override; + + AZ::Outcome GetFunctionCallName(const Slot* /*slot*/) const override; + + AZStd::string GetInterfaceName() const; + + const SlotExecution::Map* GetSlotExecutionMap() const override; + + const Grammar::SubgraphInterface* GetSubgraphInterface() const override; + + bool IsEntryPoint() const override; + + bool IsNodeableNode() const override; + + bool IsPure() const; + + bool IsSlotPure(const Slot* /*slot*/) const; + ////////////////////////////////////////////////////////////////////////// + + protected: + SlotExecution::In AddAllSlots(const Grammar::In& in, int& slotOffset, const SlotExecution::Map& previousMap); + SlotExecution::Out AddAllSlots(const Grammar::In& in, const Grammar::Out& out, int& slotOffset, const SlotExecution::Map& previousMap); + SlotExecution::Out AddAllSlots(const Grammar::Out& latent, int& slotOffset, const SlotExecution::Map& previousMap); + SlotExecution::In AddExecutionInSlotFromInterface(const Grammar::In& in, int slotOffset, SlotId previousSlotId); + SlotExecution::Out AddExecutionOutSlotFromInterface(const Grammar::In& in, const Grammar::Out& out, int slotOffset, SlotId previousSlotId); + SlotExecution::Out AddExecutionLatentOutSlotFromInterface(const Grammar::Out& latent, int slotOffset, SlotId previousSlotId); + SlotExecution::Inputs AddDataInputSlotsFromInterface(const Grammar::Inputs& inputs, const Grammar::FunctionSourceId& inSourceId, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset); + SlotExecution::Outputs AddDataOutputSlotsFromInterface(const Grammar::Outputs& outputs, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset); + + void BuildNodeFromSubgraphInterface + ( const AZ::Data::Asset& runtimeAsset + , const ScriptCanvas::Grammar::FunctionSourceId& sourceId + , const SlotExecution::Map& previousMap); + + void BuildUserFunctionCallNode + ( const Grammar::SubgraphInterface& subgraphInterface + , const ScriptCanvas::Grammar::FunctionSourceId& sourceId + , const SlotExecution::Map& previousMap); + + void BuildUserNodeableNode + ( const Grammar::SubgraphInterface& subgraphInterface + , const SlotExecution::Map& previousMap); + + void OnInit() override; + + // AssetBus... + void OnAssetReady(AZ::Data::Asset asset) override; + /// + + AZStd::string m_prettyName; + + Grammar::FunctionSourceId m_sourceId; + AZ::Data::Asset m_asset; + SlotExecution::Map m_slotExecutionMap; + Grammar::SubgraphInterface m_slotExecutionMapSourceInterface; + + private: + + struct DataSlotCache + { + SlotId m_slotId; + VariableId m_variableReference; + Datum m_datum; + }; + + using ExecutionSlotMap = AZStd::unordered_map; + using DataSlotMap = AZStd::unordered_map; + + void RemoveInsFromInterface(const Grammar::Ins& ins, ExecutionSlotMap& executionSlotMap, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); + void RemoveInsFromSlotExecution(const SlotExecution::Ins& ins, bool removeConnection, bool warnOnMissingSlot); + + void RemoveInputsFromInterface(const Grammar::Inputs& inputs, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); + void RemoveInputsFromSlotExecution(const SlotExecution::Inputs& inputs, bool removeConnection, bool warnOnMissingSlot); + + void RemoveOutsFromInterface(const Grammar::Outs& outs, ExecutionSlotMap& executionSlotMap, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); + void RemoveOutsFromSlotExecution(const SlotExecution::Outs& outs, bool removeConnection, bool warnOnMissingSlot); + + void RemoveOutputsFromInterface(const Grammar::Outputs& outputs, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); + void RemoveOutputsFromSlotExecution(const SlotExecution::Outputs& outputs, bool removeConnection, bool warnOnMissingSlot); + + void SanityCheckSlotsAndConnections(const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap); + void SanityCheckInSlotsAndConnections(const Graph& graph, const SlotExecution::Ins& ins, const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); + void SanityCheckInputSlotsAndConnections(const Graph& graph, const SlotExecution::Inputs& inputs, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); + void SanityCheckOutSlotsAndConnections(const Graph& graph, const SlotExecution::Outs& outs, const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); + void SanityCheckOutputSlotsAndConnections(const Graph& graph, const SlotExecution::Outputs& outputs, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); + }; + } + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.cpp new file mode 100644 index 0000000000..9049ed423b --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.cpp @@ -0,0 +1,307 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include +#include + +#include "FunctionCallNode.h" +#include "FunctionCallNodeIsOutOfDate.h" + +namespace ScriptCanvas +{ + namespace Nodes + { + namespace Core + { + bool IsFunctionCallNodeOutOfDate(const IsFunctionCallOutOfDateConfig& config) + { + bool changedToNodeable = false; + + if (Grammar::IsFunctionSourceIdNodeable(config.sourceId)) + { + const bool latestIsNodeable = config.latestInterface.IsUserNodeable(); + + if (!config.compare.ignorePurityChanges && !latestIsNodeable) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s source interface has changed. The node must be recreated.", config.node.GetName().data()); + return true; + } + + if (IsFunctionCallNodeOutOfDateLatents(config)) + { + return true; + } + + if (IsFunctionCallNodeOutOfDateNodeable(config)) + { + return true; + } + } + else + { + return IsFunctionCallNodeOutOfDatePure(config); + } + + return false; + } + + bool IsFunctionCallNodeOutOfDateLatents(const IsFunctionCallOutOfDateConfig& config) + { + const bool latestIsNodeable = config.latestInterface.IsUserNodeable(); + + // if latents are missing or changed return true + for (const auto& latentMapEntry : config.slotMap.GetLatents()) + { + if (auto slot = config.node.GetSlot(latentMapEntry.slotId)) + { + if (slot->IsConnected()) + { + if (!latestIsNodeable) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s is exposing a latent function that has been deleted from the source. The node must be deleted.", config.node.GetName().data()); + return true; + } + + if (const auto* newLatent = config.latestInterface.FindLatent(latentMapEntry.interfaceSourceId)) + { + if (const auto* oldLatent = config.originalInterface.FindLatent(latentMapEntry.interfaceSourceId)) + { + if (IsOutOfDate(config.compare, *oldLatent, *newLatent)) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s is exposing a latent function that has been changed in the source. THe node must be recreated.", config.node.GetName().data()); + return true; + } + } + else + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s is exposing a latent function that has been deleted from the source. The node must be deleted.", config.node.GetName().data()); + return true; + } + } + else + { + AZ_Error("ScriptCanvas", false, "FunctionCallNode %s is exposing a latent function with a slot that cannot be found in its execution map.", config.node.GetName().data()); + return true; + } + } + } + } + + return false; + } + + bool IsFunctionCallNodeOutOfDateNodeable(const IsFunctionCallOutOfDateConfig& config) + { + // if in/outs are connected, and missing/changed from the the version, return true + for (const auto& inMapEntry : config.slotMap.GetIns()) + { + if (auto slot = config.node.GetSlot(inMapEntry.slotId)) + { + if (slot->IsConnected()) + { + if (const auto* newIn = config.latestInterface.FindIn(inMapEntry.interfaceSourceId)) + { + if (const auto* oldIn = config.originalInterface.FindIn(inMapEntry.interfaceSourceId)) + { + if (IsOutOfDate(config.compare, *oldIn, *newIn)) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s is calling a function that has been changed in the source. THe node must be recreated.", config.node.GetName().data()); + return true; + } + } + else + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s is calling a function that has been deleted from the source. The node must be recreated.", config.node.GetName().data()); + return true; + } + } + else + { + AZ_Error("ScriptCanvas", false, "FunctionCallNode %s is calling a function with a slot that doesn't refer to a function in the source graph.", config.node.GetName().data()); + return true; + } + } + } + else + { + AZ_Error("ScriptCanvas", false, "FunctionCallNode %s is calling a function with a slot that cannot be found in its execution map.", config.node.GetName().data()); + return true; + } + } + + return false; + } + + bool IsFunctionCallNodeOutOfDatePure(const IsFunctionCallOutOfDateConfig& config) + { + // check the pure call for being out of date + if (auto oldIn = config.originalInterface.FindIn(config.sourceId)) + { + if (auto newIn = config.latestInterface.FindIn(config.sourceId)) + { + if (IsOutOfDate(config.compare, *oldIn, *newIn)) + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s is calling a function that has been changed in the source. THe node must be recreated.", config.node.GetName().data()); + return true; + } + } + else + { + AZ_Warning("ScriptCanvas", false, "FunctionCallNode %s is calling a function that has been deleted from the source. The node must be deleted.", config.node.GetName().data()); + return true; + } + } + else + { + AZ_Error("ScriptCanvas", false, "FunctionCallNode %s is calling a function with a slot that cannot be found in its execution map.", config.node.GetName().data()); + return true; + } + + return false; + } + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::In& theOld, const Grammar::In& theNew) + { + if (!config.ignorePurityChanges && theOld.isPure != theNew.isPure) + { + return true; + } + + if (!config.ignoreInNameChanges) + { + if (!AZ::StringFunc::Equal(theOld.displayName.c_str(), theNew.displayName.c_str())) + { + return true; + } + + if (!AZ::StringFunc::Equal(theOld.parsedName.c_str(), theNew.parsedName.c_str())) + { + return true; + } + } + + if (!(theOld.inputs == theNew.inputs)) + { + return true; + } + + if (!(theOld.outs == theNew.outs)) + { + return true; + } + + if (!config.ignoreInSourceIdChanges && !(theOld.sourceID == theNew.sourceID)) + { + return true; + } + + return false; + } + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::Input& inputOld, const Grammar::Input& inputNew) + { + if (!config.ignoreInputNameChanges) + { + if (!AZ::StringFunc::Equal(inputOld.displayName.c_str(), inputNew.displayName.c_str())) + { + return true; + } + + if (!AZ::StringFunc::Equal(inputOld.parsedName.c_str(), inputNew.parsedName.c_str())) + { + return true; + } + } + + if (config.ignoreInputDefaultValueChanges) + { + if (inputOld.datum.GetType() != inputNew.datum.GetType()) + { + return true; + } + } + else if (!(inputOld.datum == inputNew.datum)) + { + return true; + } + + if (!config.ignoreInputSourceIdChanges && !(inputOld.sourceID == inputNew.sourceID)) + { + return true; + } + + return false; + } + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::Out& theOld, const Grammar::Out& theNew) + { + if (!config.ignoreOutNameChanges) + { + if (!AZ::StringFunc::Equal(theOld.displayName.c_str(), theNew.displayName.c_str())) + { + return true; + } + + if (!AZ::StringFunc::Equal(theOld.parsedName.c_str(), theNew.parsedName.c_str())) + { + return true; + } + } + + if (!config.ignoreOutSourceIdChanges && !Grammar::OutIdIsEqual(theOld.sourceID, theNew.sourceID)) + { + return true; + } + + if (!(theOld.outputs == theNew.outputs)) + { + return true; + } + + if (!(theOld.returnValues == theNew.returnValues)) + { + return true; + } + + return false; + } + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::Output& theOld, const Grammar::Output& theNew) + { + if (!config.ignoreOutputNameChanges) + { + if (!AZ::StringFunc::Equal(theOld.displayName.c_str(), theNew.displayName.c_str())) + { + return true; + } + + if (!AZ::StringFunc::Equal(theOld.parsedName.c_str(), theNew.parsedName.c_str())) + { + return true; + } + } + + if (!(theOld.type == theNew.type)) + { + return true; + } + + if (!config.ignoreOutputSourceIdChanges && !(theOld.sourceID == theNew.sourceID)) + { + return true; + } + + return false; + } + } + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.h new file mode 100644 index 0000000000..d468971322 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.h @@ -0,0 +1,71 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +namespace ScriptCanvas +{ + namespace SlotExecution + { + class Map; + } + + namespace Nodes + { + namespace Core + { + class FunctionCallNode; + + struct FunctionCallNodeCompareConfig + { + bool ignoreInNameChanges = true; + bool ignoreInputDefaultValueChanges = false; + bool ignoreInputNameChanges = false; + bool ignoreInputSourceIdChanges = false; + bool ignoreInSourceIdChanges = false; + + bool ignoreOutNameChanges = true; + bool ignoreOutputNameChanges = false; + bool ignoreOutputSourceIdChanges = false; + bool ignoreOutSourceIdChanges = false; + + bool ignorePurityChanges = true; + }; + + struct IsFunctionCallOutOfDateConfig + { + const FunctionCallNodeCompareConfig& compare; + const FunctionCallNode& node; + const SlotExecution::Map& slotMap; + const Grammar::FunctionSourceId& sourceId; + const Grammar::SubgraphInterface& originalInterface; + const Grammar::SubgraphInterface& latestInterface; + }; + + bool IsFunctionCallNodeOutOfDate(const IsFunctionCallOutOfDateConfig& config); + + bool IsFunctionCallNodeOutOfDateLatents(const IsFunctionCallOutOfDateConfig& config); + + bool IsFunctionCallNodeOutOfDateNodeable(const IsFunctionCallOutOfDateConfig& config); + + bool IsFunctionCallNodeOutOfDatePure(const IsFunctionCallOutOfDateConfig& config); + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::In& inOld, const Grammar::In& inNew); + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::Input& inputOld, const Grammar::Input& inputNew); + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::Out& outOld, const Grammar::Out& outNew); + + bool IsOutOfDate(const FunctionCallNodeCompareConfig& config, const Grammar::Output& outputOld, const Grammar::Output& outputNew); + } + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml new file mode 100644 index 0000000000..95060b88ce --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasNode.xml deleted file mode 100644 index b5a9036a3f..0000000000 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasNode.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.cpp index 304911e546..ad556ae093 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.cpp @@ -31,24 +31,19 @@ namespace ScriptCanvas constexpr const char* s_FunctionDefinitionNodeNameRegex = "^[A-Z|a-z][A-Z|a-z| |0-9|:|_]*"; - bool FunctionDefinitionNode::IsEntryPoint() const + bool FunctionDefinitionNode::IsExecutionEntry() const { - return m_externalConnectionType == ConnectionType::Input; + return m_isExecutionEntry; } - void FunctionDefinitionNode::OnConfigured() - { - SetupSlots(); - } - - void FunctionDefinitionNode::OnActivate() + bool FunctionDefinitionNode::IsExecutionExit() const { - Nodeling::OnActivate(); + return !m_isExecutionEntry; } - void FunctionDefinitionNode::OnInputSignal(const SlotId&) + void FunctionDefinitionNode::OnConfigured() { - + SetupSlots(); } bool FunctionDefinitionNode::OnValidateNode(ValidationResults& validationResults) @@ -71,38 +66,43 @@ namespace ScriptCanvas return AZ::Success(DependencyReport{}); } - AZStd::vector FunctionDefinitionNode::GetEntrySlots() const + const Slot* FunctionDefinitionNode::GetEntrySlot() const { - if (IsEntryPoint()) + if (IsExecutionExit()) { - return GetAllSlotsByDescriptor(ScriptCanvas::SlotDescriptors::ExecutionOut()); + return nullptr; } - else + + auto slots = GetAllSlotsByDescriptor(ScriptCanvas::SlotDescriptors::ExecutionOut()); + if (slots.size() != 1 || slots.front() == nullptr) { - return GetAllSlotsByDescriptor(ScriptCanvas::SlotDescriptors::ExecutionIn()); + AZ_Warning("ScriptCanvas", false, "FunctionDefinitionNode did not have a required, single Out slot."); + return nullptr; } - } - - void FunctionDefinitionNode::OnEndpointConnected(const ScriptCanvas::Endpoint& endpoint) - { - Nodeling::OnEndpointConnected(endpoint); - ConfigureExternalConnectionType(); + return slots.front(); } - void FunctionDefinitionNode::OnEndpointDisconnected(const ScriptCanvas::Endpoint& endpoint) + const Slot* FunctionDefinitionNode::GetExitSlot() const { - Nodeling::OnEndpointDisconnected(endpoint); + if (IsExecutionEntry()) + { + return nullptr; + } - ConfigureExternalConnectionType(); + auto slots = GetAllSlotsByDescriptor(ScriptCanvas::SlotDescriptors::ExecutionIn()); + if (slots.size() != 1 || slots.front() == nullptr) + { + AZ_Warning("ScriptCanvas", false, "FunctionDefinitionNode did not have a required, single In slot."); + return nullptr; + } + + return slots.front(); } - void FunctionDefinitionNode::SignalEntrySlots() + void FunctionDefinitionNode::MarkExecutionExit() { - for (const Slot* slot : m_entrySlots) - { - SignalOutput(slot->GetId()); - } + m_isExecutionEntry = false; } void FunctionDefinitionNode::OnDisplayNameChanged() @@ -113,23 +113,6 @@ namespace ScriptCanvas } } - void FunctionDefinitionNode::ConfigureExternalConnectionType() - { - // Invert the logic. If we have a connection to an in, we are an output for the function - if (HasConnectionForDescriptor(ScriptCanvas::SlotDescriptors::ExecutionIn())) - { - m_externalConnectionType = ConnectionType::Output; - } - else if (HasConnectionForDescriptor(ScriptCanvas::SlotDescriptors::ExecutionOut())) - { - m_externalConnectionType = ConnectionType::Input; - } - else - { - m_externalConnectionType = ConnectionType::Unknown; - } - } - void FunctionDefinitionNode::SetupSlots() { auto groupedSlots = GetSlotsWithDisplayGroup(GetSlotDisplayGroup()); @@ -215,6 +198,86 @@ namespace ScriptCanvas return AZStd::string::format("Found invalid character %c in display name", GetDisplayName()[offset]); } + + SlotId FunctionDefinitionNode::CreateDataSlot(AZStd::string_view name, AZStd::string_view toolTip, ConnectionType connectionType) + { + DynamicDataSlotConfiguration slotConfiguration; + + slotConfiguration.m_name = name; + slotConfiguration.m_toolTip = toolTip; + slotConfiguration.SetConnectionType(connectionType); + + slotConfiguration.m_displayGroup = GetDataDisplayGroup(); + slotConfiguration.m_dynamicGroup = GetDataDynamicTypeGroup(); + slotConfiguration.m_dynamicDataType = DynamicDataType::Any; + slotConfiguration.m_isUserAdded = true; + + slotConfiguration.m_addUniqueSlotByNameAndType = false; + + SlotId slotId = AddSlot(slotConfiguration); + + return slotId; + } + + SlotId FunctionDefinitionNode::HandleExtension(AZ::Crc32 extensionId) + { + if (extensionId == GetAddNodelingInputDataSlot()) + { + SlotId retVal = CreateDataSlot("Value", "", ConnectionType::Output); + return retVal; + } + + if (extensionId == GetAddNodelingOutputDataSlot()) + { + SlotId retVal = CreateDataSlot("Value", "", ConnectionType::Input); + return retVal; + } + + return SlotId(); + } + + void FunctionDefinitionNode::OnSetup() + { + m_configureVisualExtensions = true; + SetupSlots(); + } + + void FunctionDefinitionNode::ConfigureVisualExtensions() + { + { + VisualExtensionSlotConfiguration visualExtensions(VisualExtensionSlotConfiguration::VisualExtensionType::ExtenderSlot); + + visualExtensions.m_name = "Add Data Input"; + visualExtensions.m_tooltip = "Adds a new operand for the operator"; + + visualExtensions.m_displayGroup = GetDataDisplayGroup(); + visualExtensions.m_identifier = GetAddNodelingInputDataSlot(); + + visualExtensions.m_connectionType = ConnectionType::Output; + + RegisterExtension(visualExtensions); + } + + { + VisualExtensionSlotConfiguration visualExtensions(VisualExtensionSlotConfiguration::VisualExtensionType::ExtenderSlot); + + visualExtensions.m_name = "Add Data Output"; + visualExtensions.m_tooltip = ""; + + visualExtensions.m_displayGroup = GetDataDisplayGroup(); + visualExtensions.m_identifier = GetAddNodelingOutputDataSlot(); + + visualExtensions.m_connectionType = ConnectionType::Input; + + RegisterExtension(visualExtensions); + } + } + + bool FunctionDefinitionNode::CanDeleteSlot(const SlotId&) const + { + // Allow slots to be deleted by users + return true; + } } } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.h index 2034c21ef2..20b20cb65d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.h @@ -40,47 +40,61 @@ namespace ScriptCanvas SCRIPTCANVAS_NODE(FunctionDefinitionNode); FunctionDefinitionNode() = default; + ~FunctionDefinitionNode() = default; - ConnectionType GetConnectionType() const { return m_externalConnectionType; } + bool IsExecutionEntry() const; + bool IsExecutionExit() const; + // Node... - bool IsEntryPoint() const override; - + void OnConfigured() override; - void OnActivate() override; - - void OnInputSignal(const SlotId&) override; bool OnValidateNode(ValidationResults& validationResults) override; //// - AZStd::vector GetEntrySlots() const; - - void OnEndpointConnected(const ScriptCanvas::Endpoint& endpoint) override; + const Slot* GetEntrySlot() const; - void OnEndpointDisconnected(const ScriptCanvas::Endpoint& endpoint) override; - - void SignalEntrySlots(); + const Slot* GetExitSlot() const; AZ::Outcome GetDependencies() const override; + void MarkExecutionExit(); + protected: void OnDisplayNameChanged() override; - void ConfigureExternalConnectionType(); - - ConnectionType m_externalConnectionType = ConnectionType::Unknown; - - private: + bool CanDeleteSlot(const SlotId& slotId) const override; void SetupSlots(); bool IsValidDisplayName() const; + AZStd::string GenerateErrorMessage() const; + + SlotId CreateDataSlot(AZStd::string_view name, AZStd::string_view toolTip, ConnectionType connectionType); + + static constexpr AZ::Crc32 GetAddNodelingInputDataSlot() { return AZ_CRC_CE("AddNodelingInputDataSlot"); } + static constexpr AZ::Crc32 GetAddNodelingOutputDataSlot() { return AZ_CRC_CE("AddNodelingOutputDataSlot"); } + static constexpr AZ::Crc32 GetDataDynamicTypeGroup() { return AZ_CRC_CE("DataGroup"); } + + AZStd::string GetDataDisplayGroup() const { return "DataDisplayGroup"; } + SlotId HandleExtension(AZ::Crc32 extensionId) override; + + void ConfigureVisualExtensions() override; + + void OnSetup() override; + + private: + bool m_isExecutionEntry = true; AZStd::vector m_entrySlots; + AZStd::vector m_dataSlots; + + bool m_configureVisualExtensions = false; + }; } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.ScriptCanvasNode.xml deleted file mode 100644 index ea6e8438e1..0000000000 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.ScriptCanvasNode.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.cpp deleted file mode 100644 index b50ab119de..0000000000 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.cpp +++ /dev/null @@ -1,748 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "FunctionNode.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ScriptCanvas -{ - namespace Nodes - { - namespace Core - { - ///////////////// - // FunctionNode - ///////////////// - - FunctionNode::FunctionNode() - : m_asset(AZ::Data::AssetLoadBehavior::QueueLoad) - {} - - FunctionNode::~FunctionNode() - { - AZ::Data::AssetBus::Handler::BusDisconnect(); - } - - SlotExecution::In FunctionNode::AddExecutionInSlotFromInterface(const Grammar::In& in, int slotOffset, SlotId previousSlotId) - { - ExecutionSlotConfiguration config; - config.m_name = in.displayName; - config.m_displayGroup = in.displayName; - config.SetConnectionType(ScriptCanvas::ConnectionType::Input); - config.m_isLatent = false; - if (previousSlotId.IsValid()) - { - config.m_slotId = previousSlotId; - } - - SlotExecution::In slotMapIn; - slotMapIn.slotId = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); - slotMapIn.parsedName = in.parsedName; - slotMapIn.interfaceSourceId = in.sourceID; - return slotMapIn; - } - - SlotExecution::Out FunctionNode::AddExecutionOutSlotFromInterface(const Grammar::In& in, const Grammar::Out& out, int slotOffset, SlotId previousSlotId) - { - ExecutionSlotConfiguration config; - config.m_name = out.displayName; - config.m_displayGroup = in.displayName; - config.SetConnectionType(ScriptCanvas::ConnectionType::Output); - config.m_isLatent = false; - if (previousSlotId.IsValid()) - { - config.m_slotId = previousSlotId; - } - - SlotExecution::Out slotMapOut; - slotMapOut.slotId = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); - slotMapOut.interfaceSourceId = out.sourceID; - slotMapOut.name = out.displayName; - return slotMapOut; - } - - SlotExecution::Out FunctionNode::AddExecutionLatentOutSlotFromInterface(const Grammar::Out& latent, int slotOffset, SlotId previousSlotId) - { - ExecutionSlotConfiguration config; - config.m_name = latent.displayName; - config.m_displayGroup = latent.displayName; - config.SetConnectionType(ScriptCanvas::ConnectionType::Output); - config.m_isLatent = true; - if (previousSlotId.IsValid()) - { - config.m_slotId = previousSlotId; - } - - SlotExecution::Out slotMapLatentOut; - slotMapLatentOut.slotId = InsertSlot(slotOffset, config, !previousSlotId.IsValid()); - slotMapLatentOut.name = latent.displayName; - slotMapLatentOut.interfaceSourceId = latent.sourceID; - return slotMapLatentOut; - } - - SlotExecution::Inputs FunctionNode::AddDataInputSlotFromInterface(const Grammar::Inputs& inputs, const Grammar::FunctionSourceId& inSourceId, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset) - { - SlotExecution::Inputs slotMapInputs; - for (const auto& input : inputs) - { - DataSlotConfiguration config; - config.m_name = input.displayName; - config.m_displayGroup = displayGroup; - config.m_addUniqueSlotByNameAndType = false; - config.SetConnectionType(ScriptCanvas::ConnectionType::Input); - config.DeepCopyFrom(input.datum); - auto previousSlotId = previousMap.FindInputSlotIdBySource(input.sourceID, inSourceId); - if (previousSlotId.IsValid()) - { - config.m_slotId = previousSlotId; - } - - SlotExecution::Input slotMapInput; - slotMapInput.slotId = InsertSlot(slotOffset++, config, !previousSlotId.IsValid()); - slotMapInput.interfaceSourceId = input.sourceID; - slotMapInputs.push_back(slotMapInput); - if (!slotMapInput.slotId.IsValid()) - { - return slotMapInputs; - } - } - return slotMapInputs; - } - - SlotExecution::Outputs FunctionNode::AddDataOutputSlotFromInterface(const Grammar::Outputs& outputs, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset) - { - AZ_UNUSED(displayGroup); - - SlotExecution::Outputs slotMapOutputs; - for (const auto& output : outputs) - { - DataSlotConfiguration config; - config.m_name = output.displayName; - config.m_displayGroup = "(shared across all execution for now)"; // displayGroup - config.SetConnectionType(ScriptCanvas::ConnectionType::Output); - config.SetType(output.type); - auto previousSlotId = previousMap.FindOutputSlotIdBySource(output.sourceID); - if (previousSlotId.IsValid()) - { - config.m_slotId = previousSlotId; - } - - SlotExecution::Output outputSlotMap = InsertSlot(slotOffset++, config, !previousSlotId.IsValid()); - outputSlotMap.interfaceSourceId = output.sourceID; - slotMapOutputs.push_back(outputSlotMap); - if (!outputSlotMap.slotId.IsValid()) - { - return slotMapOutputs; - } - } - return slotMapOutputs; - } - - AZ::Outcome FunctionNode::GetFunctionCallLexicalScope(const Slot* /*slot*/) const - { - return AZ::Success(m_slotExecutionMapSourceInterface.GetLexicalScope()); - } - - AZ::Outcome FunctionNode::GetFunctionCallName(const Slot* slot) const - { - if (auto in = m_slotExecutionMap.GetIn(slot->GetId())) - { - return AZ::Success(in->parsedName); - } - else - { - return AZ::Failure(); - } - } - - AZStd::string FunctionNode::GetInterfaceName() const - { - return m_slotExecutionMapSourceInterface.GetName(); - } - - bool FunctionNode::IsNodeableNode() const - { - return !IsPure(); - } - - bool FunctionNode::IsPure() const - { - return m_slotExecutionMapSourceInterface.IsMarkedPure(); - } - - bool FunctionNode::IsSlotPure(const Slot* /*slot*/) const - { - // \todo optimizations are possible based on treating the slots separately - return m_slotExecutionMapSourceInterface.IsMarkedPure(); - } - - void FunctionNode::OnInit() - { - if (m_asset.GetId().IsValid()) - { - Initialize(m_asset.GetId()); - } - } - - void FunctionNode::ConfigureNode(const AZ::Data::AssetId&) - { - PopulateNodeType(); - } - - SubgraphInterfaceAsset* FunctionNode::GetAsset() const - { - return m_asset.GetAs(); - } - - AZ::Data::AssetId FunctionNode::GetAssetId() const - { - return m_asset.GetId(); - } - - AZ::Outcome FunctionNode::GetDependencies() const - { - DependencyReport report; - report.userSubgraphs.insert(m_slotExecutionMapSourceInterface.GetNamespacePath()); - report.userSubgraphAssetIds.insert(m_asset.GetId()); - return AZ::Success(AZStd::move(report)); - } - - const AZStd::string& FunctionNode::GetName() const - { - return m_prettyName; - } - - void FunctionNode::BuildNode() - { - AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().GetAsset(m_asset.GetId(), AZ::Data::AssetLoadBehavior::PreLoad); - m_slotExecutionMapSourceInterface = Grammar::SubgraphInterface{}; - m_slotExecutionMap = SlotExecution::Map{}; - BuildNodeFromSubgraphInterface(asset, m_slotExecutionMap); - } - - void FunctionNode::BuildNodeFromSubgraphInterface - ( const AZ::Data::Asset& runtimeAsset - , const SlotExecution::Map& previousMap) - { - // build the node here, from the asset topology, take the node/variable ordering from the function runtime data as a suggestion - // deal with updates and conversions after - const Grammar::SubgraphInterface& subgraphInterface = runtimeAsset.Get()->m_runtimeData.m_interface; - m_prettyName = runtimeAsset.Get()->m_runtimeData.m_name; - - if (!subgraphInterface.IsAllInputOutputShared()) - { - AZ_Error("ScriptCanvas", false, "the current assumption is that there is no way to distinguish between the input/output of different nodelings"); - return; - } - - // for now, all outputs are shared - Grammar::Outputs outputs; - bool sharedOutputInitialized = false; - - SlotExecution::Ins slotMapIns; - SlotExecution::Outs slotMapLatents; - - int slotOffset = 0; - - // add all ins->outs, in their display groups - for (size_t indexIn = 0; indexIn < subgraphInterface.GetInCount(); ++indexIn) - { - const Grammar::In& interfaceIn = subgraphInterface.GetIn(indexIn); - - SlotExecution::In slotMapIn = AddExecutionInSlotFromInterface(interfaceIn, slotOffset++, previousMap.FindInSlotIdBySource(interfaceIn.sourceID)); - if (!slotMapIn.slotId.IsValid()) - { - AZ_Error("ScriptCanvas", false, "Failed to add Execution In slot from sub graph interface"); - return; - } - slotMapIn.inputs = AddDataInputSlotFromInterface(interfaceIn.inputs, interfaceIn.sourceID, interfaceIn.displayName, previousMap, slotOffset); - for (auto& input : slotMapIn.inputs) - { - if (!input.slotId.IsValid()) - { - AZ_Error("ScriptCanvas", false, "Failed to add Input slot from sub graph interface"); - return; - } - } - - for (auto& interfaceOut : interfaceIn.outs) - { - SlotExecution::Out slotMapOut = AddExecutionOutSlotFromInterface(interfaceIn, interfaceOut, slotOffset++, previousMap.FindOutSlotIdBySource(interfaceIn.sourceID, interfaceOut.sourceID)); - if (!slotMapOut.slotId.IsValid()) - { - AZ_Error("ScriptCanvas", false, "Failed to add Execution Out slot from sub graph interface"); - return; - } - if (!sharedOutputInitialized) - { - outputs = interfaceOut.outputs; - sharedOutputInitialized = true; - } - - slotMapIn.outs.push_back(slotMapOut); - } - - slotMapIns.push_back(slotMapIn); - } - - // add all latents in their display groups - for (size_t indexLatent = 0; indexLatent < subgraphInterface.GetLatentOutCount(); ++indexLatent) - { - const Grammar::Out& interfaceLatent = subgraphInterface.GetLatentOut(indexLatent); - - SlotExecution::Out slotMapLatentOut = AddExecutionLatentOutSlotFromInterface(interfaceLatent, slotOffset++, previousMap.FindLatentSlotIdBySource(interfaceLatent.sourceID)); - if (!slotMapLatentOut.slotId.IsValid()) - { - AZ_Error("ScriptCanvas", false, "Failed to add Latent Out slot from sub graph interface"); - return; - } - slotMapLatentOut.returnValues.values = AddDataInputSlotFromInterface(interfaceLatent.returnValues, interfaceLatent.sourceID, interfaceLatent.displayName, previousMap, slotOffset); - for (auto& input : slotMapLatentOut.returnValues.values) - { - if (!input.slotId.IsValid()) - { - AZ_Error("ScriptCanvas", false, "Failed to add Input slot from sub graph interface"); - return; - } - } - - if (!sharedOutputInitialized) - { - outputs = interfaceLatent.outputs; - sharedOutputInitialized = true; - } - - slotMapLatents.push_back(slotMapLatentOut); - } - - // add all outputs one time, since they are currently all required to be part of all the signatures [\todo must fix] , in a variable display group - SlotExecution::Outputs slotMapOutputs = AddDataOutputSlotFromInterface(outputs, "", previousMap, slotOffset); - for (auto& output : slotMapOutputs) - { - if (!output.slotId.IsValid()) - { - AZ_Error("ScriptCanvas", false, "Failed to add Output slot from sub graph interface"); - return; - } - } - if (!subgraphInterface.IsLatent()) - { - for (auto& slotMapIn : slotMapIns) - { - for (auto& slotMapOut : slotMapIn.outs) - { - slotMapOut.outputs = slotMapOutputs; - } - } - } - else - { - for (auto& slotMapLatent : slotMapLatents) - { - slotMapLatent.outputs = slotMapOutputs; - } - } - - // when returning variables: sort variables by source slot id, they are sorted in the slot map, so just take them from the slot map - m_slotExecutionMap = AZStd::move(SlotExecution::Map(AZStd::move(slotMapIns), AZStd::move(slotMapLatents))); - m_slotExecutionMapSourceInterface = subgraphInterface; - m_asset = runtimeAsset; - SignalSlotsReordered(); - } - - void FunctionNode::Initialize(AZ::Data::AssetId assetId) - { - ConfigureNode(assetId); - - static bool blockingLoad = true; - // this is the only case where the subgraph id should not be modified - AZ::Data::AssetId interfaceAssetId(assetId.m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); - auto asset = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); - asset.BlockUntilLoadComplete(); - - if (asset) - { - // do not nuke the assetId in case an update will be attempted immediately after this call - m_asset = asset; - } - } - - bool FunctionNode::IsOutOfDate(const VersionData& graphVersion) const - { - bool isUnitTestingInProgress = false; - ScriptCanvas::SystemRequestBus::BroadcastResult(isUnitTestingInProgress, &ScriptCanvas::SystemRequests::IsScriptUnitTestingInProgress); - - if (isUnitTestingInProgress) - { - return false; - } - - if (graphVersion.grammarVersion == GrammarVersion::Initial || graphVersion.runtimeVersion == RuntimeVersion::Initial) - { - return true; - } - - // #conversion_diagnostic - AZ::Data::AssetId interfaceAssetId(m_asset.GetId().m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); - if (interfaceAssetId != m_asset.GetId()) - { - AZ_Warning("ScriptCanvas", false, "FunctionNode %s wasn't saved out with the proper sub id", m_prettyName.data()); - } - - AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); - asset.BlockUntilLoadComplete(); - - if (!asset || !asset->IsReady()) - { - AZ_Warning("ScriptCanvas", false, "FunctionNode %s failed to load source asset.", m_prettyName.data()); - return true; - } - - const Grammar::SubgraphInterface* latestAssetInterface = asset ? &asset.Get()->GetData().m_interface : nullptr; - - if (!latestAssetInterface) - { - AZ_Warning("ScriptCanvas", false, "FunctionNode %s failed to load latest interface from the source asset.", m_prettyName.data()); - return true; - } - - if (!(m_slotExecutionMapSourceInterface == *latestAssetInterface)) - { - return true; - } - - return false; - } - - UpdateResult FunctionNode::OnUpdateNode() - { - AZ::Data::AssetId interfaceAssetId(m_asset.GetId().m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); - AZ::Data::Asset assetData = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); - assetData.BlockUntilLoadComplete(); - - if (!assetData || !assetData->IsReady()) - { - AZ_Warning("ScriptCanvas", false, "FunctionNode %s failed to load source asset, likely removed.", m_prettyName.data()); - this->AddNodeDisabledFlag(NodeDisabledFlag::ErrorInUpdate); - return UpdateResult::DisableNode; - } - - // connections will be removed when the version conversion is finalized after this function returns - const bool k_DoNotRemoveConnections = false; - const bool k_DoNotWarnOnMissingDataSlots = !m_slotExecutionMapSourceInterface.IsAllInputOutputShared(); - - ExecutionSlotMap executionSlotMap; - DataSlotMap dataSlotMap; - if (m_slotExecutionMap.IsEmpty()) - { - const Grammar::SubgraphInterface& subgraphInterface = assetData.Get()->m_runtimeData.m_interface; - RemoveInsFromInterface(subgraphInterface.GetIns(), executionSlotMap, dataSlotMap, k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); - RemoveOutsFromInterface(subgraphInterface.GetLatentOuts(), executionSlotMap, dataSlotMap, k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); - } - else - { - RemoveInsFromSlotExecution(m_slotExecutionMap.GetIns(), k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); - RemoveOutsFromSlotExecution(m_slotExecutionMap.GetLatents(), k_DoNotRemoveConnections, k_DoNotWarnOnMissingDataSlots); - } - - BuildNodeFromSubgraphInterface(assetData, m_slotExecutionMap); - SanityCheckSlotsAndConnections(executionSlotMap, dataSlotMap); - - this->RemoveNodeDisabledFlag(NodeDisabledFlag::ErrorInUpdate); - return UpdateResult::DirtyGraph; - } - - void FunctionNode::RemoveInsFromInterface(const Grammar::Ins& ins, - ExecutionSlotMap& executionSlotMap, - DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& in : ins) - { - if (auto inSlot = this->GetSlotByNameAndType(in.displayName, CombinedSlotType::ExecutionIn)) - { - executionSlotMap.emplace(in.sourceID, inSlot->GetId()); - RemoveSlot(inSlot->GetId(), removeConnection); - - RemoveInputsFromInterface(in.inputs, dataSlotMap, removeConnection, warnOnMissingSlot); - RemoveOutsFromInterface(in.outs, executionSlotMap, dataSlotMap, removeConnection, warnOnMissingSlot); - } - } - } - - void FunctionNode::RemoveInsFromSlotExecution(const SlotExecution::Ins& ins, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& in : ins) - { - RemoveSlot(in.slotId, removeConnection); - - RemoveInputsFromSlotExecution(in.inputs, removeConnection, warnOnMissingSlot); - RemoveOutsFromSlotExecution(in.outs, removeConnection, warnOnMissingSlot); - } - } - - void FunctionNode::RemoveInputsFromInterface(const Grammar::Inputs& inputs, - DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& input : inputs) - { - if (auto inputSlot = this->GetSlotByNameAndType(input.displayName, CombinedSlotType::DataIn)) - { - DataSlotCache dataSlotCache; - dataSlotCache.m_slotId = inputSlot->GetId(); - if (inputSlot->IsVariableReference()) - { - dataSlotCache.m_variableReference = inputSlot->GetVariableReference(); - } - else if (auto inputDatum = inputSlot->FindDatum()) - { - dataSlotCache.m_datum.DeepCopyDatum(*inputDatum); - } - - dataSlotMap.emplace(input.sourceID, dataSlotCache); - RemoveSlot(inputSlot->GetId(), removeConnection, warnOnMissingSlot); - } - } - } - - void FunctionNode::RemoveInputsFromSlotExecution(const SlotExecution::Inputs& inputs, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& input : inputs) - { - RemoveSlot(input.slotId, removeConnection, warnOnMissingSlot); - } - } - - void FunctionNode::RemoveOutsFromInterface(const Grammar::Outs& outs, ExecutionSlotMap& executionSlotMap, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& out : outs) - { - if (auto inSlot = this->GetSlotByNameAndType(out.displayName, CombinedSlotType::ExecutionOut)) - { - executionSlotMap.emplace(out.sourceID, inSlot->GetId()); - RemoveSlot(inSlot->GetId(), removeConnection); - - RemoveInputsFromInterface(out.returnValues, dataSlotMap, removeConnection, warnOnMissingSlot); - RemoveOutputsFromInterface(out.outputs, dataSlotMap, removeConnection, warnOnMissingSlot); - } - } - } - - void FunctionNode::RemoveOutsFromSlotExecution(const SlotExecution::Outs& outs, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& out : outs) - { - RemoveSlot(out.slotId, removeConnection); - - RemoveInputsFromSlotExecution(out.returnValues.values, removeConnection, warnOnMissingSlot); - RemoveOutputsFromSlotExecution(out.outputs, removeConnection, warnOnMissingSlot); - } - } - - void FunctionNode::RemoveOutputsFromInterface(const Grammar::Outputs& outputs, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& output : outputs) - { - if (auto outputSlot = this->GetSlotByNameAndType(output.displayName, CombinedSlotType::DataOut)) - { - DataSlotCache dataSlotCache; - dataSlotCache.m_slotId = outputSlot->GetId(); - if (outputSlot->IsVariableReference()) - { - dataSlotCache.m_variableReference = outputSlot->GetVariableReference(); - } - else if (auto outputDatum = outputSlot->FindDatum()) - { - dataSlotCache.m_datum.DeepCopyDatum(*outputDatum); - } - - dataSlotMap.emplace(output.sourceID, dataSlotCache); - RemoveSlot(outputSlot->GetId(), removeConnection, warnOnMissingSlot); - } - } - } - - void FunctionNode::RemoveOutputsFromSlotExecution(const SlotExecution::Outputs& outputs, bool removeConnection, bool warnOnMissingSlot) - { - for (auto& output : outputs) - { - RemoveSlot(output.slotId, removeConnection, warnOnMissingSlot); - } - } - - void FunctionNode::SanityCheckSlotsAndConnections(const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap) - { - auto graph = this->GetGraph(); - if (graph) - { - ReplacementConnectionMap connectionMap; - SanityCheckInSlotsAndConnections(*graph, m_slotExecutionMap.GetIns(), executionSlotMap, dataSlotMap, connectionMap); - SanityCheckOutSlotsAndConnections(*graph, m_slotExecutionMap.GetLatents(), executionSlotMap, dataSlotMap, connectionMap); - for (auto connectionIter : connectionMap) - { - // need to remove old connection, or create new connection will fail because it triggers sanity check on removed slot - graph->RemoveConnection(connectionIter.first); - - for (auto newEndpointPair : connectionIter.second) - { - if (newEndpointPair.first.IsValid() && newEndpointPair.second.IsValid()) - { - graph->ConnectByEndpoint(newEndpointPair.first, newEndpointPair.second); - } - } - } - } - } - - void FunctionNode::SanityCheckInSlotsAndConnections(const Graph& graph, const SlotExecution::Ins& ins, - const ExecutionSlotMap& executionSlotMap, - const DataSlotMap& dataSlotMap, - ReplacementConnectionMap& connectionMap) - { - if (!executionSlotMap.empty()) - { - for (auto& in : ins) - { - auto executionSlotIter = executionSlotMap.find(in.interfaceSourceId); - if (executionSlotIter != executionSlotMap.end()) - { - if (in.slotId != executionSlotIter->second) - { - VersioningUtils::CreateRemapConnectionsForTargetEndpoint(graph, { this->GetEntityId(), executionSlotIter->second }, { this->GetEntityId(), in.slotId }, connectionMap); - } - } - - SanityCheckInputSlotsAndConnections(graph, in.inputs, dataSlotMap, connectionMap); - SanityCheckOutSlotsAndConnections(graph, in.outs, executionSlotMap, dataSlotMap, connectionMap); - } - } - } - - void FunctionNode::SanityCheckInputSlotsAndConnections(const Graph& graph, const SlotExecution::Inputs& inputs, - const DataSlotMap& dataSlotMap, - ReplacementConnectionMap& connectionMap) - { - if (!dataSlotMap.empty()) - { - for (auto& input : inputs) - { - auto dataSlotIter = dataSlotMap.find(input.interfaceSourceId); - if (dataSlotIter != dataSlotMap.end()) - { - if (input.slotId != dataSlotIter->second.m_slotId) - { - VersioningUtils::CopyOldValueToDataSlot(this->GetSlot(input.slotId), dataSlotIter->second.m_variableReference, &dataSlotIter->second.m_datum); - VersioningUtils::CreateRemapConnectionsForTargetEndpoint(graph, { this->GetEntityId(), dataSlotIter->second.m_slotId }, { this->GetEntityId(), input.slotId }, connectionMap); - } - } - } - } - } - - void FunctionNode::SanityCheckOutSlotsAndConnections(const Graph& graph, const SlotExecution::Outs& outs, - const ExecutionSlotMap& executionSlotMap, - const DataSlotMap& dataSlotMap, - ReplacementConnectionMap& connectionMap) - { - if (!executionSlotMap.empty()) - { - for (auto& out : outs) - { - auto executionSlotIter = executionSlotMap.find(out.interfaceSourceId); - if (executionSlotIter != executionSlotMap.end()) - { - if (out.slotId != executionSlotIter->second) - { - VersioningUtils::CreateRemapConnectionsForSourceEndpoint(graph, { this->GetEntityId(), executionSlotIter->second }, { this->GetEntityId(), out.slotId }, connectionMap); - } - } - - SanityCheckInputSlotsAndConnections(graph, out.returnValues.values, dataSlotMap, connectionMap); - SanityCheckOutputSlotsAndConnections(graph, out.outputs, dataSlotMap, connectionMap); - } - } - } - - void FunctionNode::SanityCheckOutputSlotsAndConnections(const Graph& graph, const SlotExecution::Outputs& outputs, - const DataSlotMap& dataSlotMap, - ReplacementConnectionMap& connectionMap) - { - if (!dataSlotMap.empty()) - { - for (auto& output : outputs) - { - auto dataSlotIter = dataSlotMap.find(output.interfaceSourceId); - if (dataSlotIter != dataSlotMap.end()) - { - if (output.slotId != dataSlotIter->second.m_slotId) - { - VersioningUtils::CopyOldValueToDataSlot(this->GetSlot(output.slotId), dataSlotIter->second.m_variableReference, &dataSlotIter->second.m_datum); - VersioningUtils::CreateRemapConnectionsForSourceEndpoint(graph, { this->GetEntityId(), dataSlotIter->second.m_slotId }, { this->GetEntityId(), output.slotId }, connectionMap); - } - } - } - } - } - - const SlotExecution::Map* FunctionNode::GetSlotExecutionMap() const - { - return &m_slotExecutionMap; - } - - const Grammar::SubgraphInterface* FunctionNode::GetSubgraphInterface() const - { - return &m_slotExecutionMapSourceInterface; - } - - AZStd::string FunctionNode::GetUpdateString() const - { - if (m_asset) - { - return AZStd::string::format("Updated Function (%s)", GetName().c_str()); - } - else - { - return AZStd::string::format("Disabled Function (%s)", m_asset.GetId().ToString().c_str()); - } - } - - void FunctionNode::OnAssetReady(AZ::Data::Asset asset) - { - AZ::Data::AssetId interfaceAssetId(m_asset.GetId().m_guid, AZ_CRC("SubgraphInterface", 0xdfe6dc72)); - m_asset = asset; - AZ::Data::Asset assetData = AZ::Data::AssetManager::Instance().GetAsset(interfaceAssetId, AZ::Data::AssetLoadBehavior::PreLoad); - - if (!assetData) - { - AZ_TracePrintf("SC", "Asset data unavailable in OnAssetReady"); - return; - } - - m_prettyName = assetData.Get()->m_runtimeData.m_name; - } - } - } -} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.h deleted file mode 100644 index d58f80bc06..0000000000 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionNode.h +++ /dev/null @@ -1,160 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ScriptCanvas { class RuntimeComponent; } - -namespace ScriptCanvas { struct SubgraphInterfaceData; } - -namespace AZ -{ - class BehaviorMethod; -} - -namespace ScriptCanvas -{ - namespace Nodes - { - namespace Core - { - class FunctionNode - : public Node - , AZ::Data::AssetBus::Handler - { - enum Version - { - AddParserResults = 3, - RemoveMappingData, - CorrectAssetSubId, - - // Add entry above - Current, - }; - - public: - - SCRIPTCANVAS_NODE(FunctionNode); - - FunctionNode(); - ~FunctionNode() override; - - void BuildNode(); - - void ConfigureNode(const AZ::Data::AssetId& assetId); - - SubgraphInterfaceAsset* GetAsset() const; - - AZ::Data::AssetId GetAssetId() const; - - const AZStd::string& GetName() const; - - void Initialize(AZ::Data::AssetId assetId); - - // NodeVersioning - bool IsOutOfDate(const VersionData& graphVersion) const override; - - UpdateResult OnUpdateNode() override; - - AZStd::string GetUpdateString() const override; - //// - - ////////////////////////////////////////////////////////////////////////// - // Translation - bool IsSupportedByNewBackend() const override { return true; } - - AZ::Outcome GetDependencies() const override; - - AZ::Outcome GetFunctionCallLexicalScope(const Slot* slot) const override; - - AZ::Outcome GetFunctionCallName(const Slot* /*slot*/) const override; - - AZStd::string GetInterfaceName() const; - - const SlotExecution::Map* GetSlotExecutionMap() const override; - - const Grammar::SubgraphInterface* GetSubgraphInterface() const override; - - bool IsNodeableNode() const override; - - bool IsPure() const; - - bool IsSlotPure(const Slot* /*slot*/) const; - ////////////////////////////////////////////////////////////////////////// - - protected: - SlotExecution::In AddExecutionInSlotFromInterface(const Grammar::In& in, int slotOffset, SlotId previousSlotId); - SlotExecution::Out AddExecutionOutSlotFromInterface(const Grammar::In& in, const Grammar::Out& out, int slotOffset, SlotId previousSlotId); - SlotExecution::Out AddExecutionLatentOutSlotFromInterface(const Grammar::Out& latent, int slotOffset, SlotId previousSlotId); - SlotExecution::Inputs AddDataInputSlotFromInterface(const Grammar::Inputs& inputs, const Grammar::FunctionSourceId& inSourceId, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset); - SlotExecution::Outputs AddDataOutputSlotFromInterface(const Grammar::Outputs& outputs, const AZStd::string& displayGroup, const SlotExecution::Map& previousMap, int& slotOffset); - - void BuildNodeFromSubgraphInterface(const AZ::Data::Asset& runtimeAsset, const SlotExecution::Map& previousMap); - - void OnInit() override; - - // AssetBus... - void OnAssetReady(AZ::Data::Asset asset) override; - /// - - AZStd::string m_prettyName; - - AZ::Data::Asset m_asset; - SlotExecution::Map m_slotExecutionMap; - Grammar::SubgraphInterface m_slotExecutionMapSourceInterface; - - private: - - struct DataSlotCache - { - SlotId m_slotId; - VariableId m_variableReference; - Datum m_datum; - }; - - using ExecutionSlotMap = AZStd::unordered_map; - using DataSlotMap = AZStd::unordered_map; - - void RemoveInsFromInterface(const Grammar::Ins& ins, ExecutionSlotMap& executionSlotMap, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); - void RemoveInsFromSlotExecution(const SlotExecution::Ins& ins, bool removeConnection, bool warnOnMissingSlot); - - void RemoveInputsFromInterface(const Grammar::Inputs& inputs, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); - void RemoveInputsFromSlotExecution(const SlotExecution::Inputs& inputs, bool removeConnection, bool warnOnMissingSlot); - - void RemoveOutsFromInterface(const Grammar::Outs& outs, ExecutionSlotMap& executionSlotMap, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); - void RemoveOutsFromSlotExecution(const SlotExecution::Outs& outs, bool removeConnection, bool warnOnMissingSlot); - - void RemoveOutputsFromInterface(const Grammar::Outputs& outputs, DataSlotMap& dataSlotMap, bool removeConnection, bool warnOnMissingSlot); - void RemoveOutputsFromSlotExecution(const SlotExecution::Outputs& outputs, bool removeConnection, bool warnOnMissingSlot); - - void SanityCheckSlotsAndConnections(const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap); - void SanityCheckInSlotsAndConnections(const Graph& graph, const SlotExecution::Ins& ins, const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); - void SanityCheckInputSlotsAndConnections(const Graph& graph, const SlotExecution::Inputs& inputs, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); - void SanityCheckOutSlotsAndConnections(const Graph& graph, const SlotExecution::Outs& outs, const ExecutionSlotMap& executionSlotMap, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); - void SanityCheckOutputSlotsAndConnections(const Graph& graph, const SlotExecution::Outputs& outputs, const DataSlotMap& dataSlotMap, ReplacementConnectionMap& connectionMap); - }; - } - } -} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.h index 6a155d5ad1..7b82028786 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.h @@ -63,7 +63,7 @@ namespace ScriptCanvas const Slot* GetVariableOutputSlot() const override; // Translation ////////////////////////////////////////////////////////////////////////// - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp index b27e45d46c..1a69dbb25e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp @@ -461,7 +461,7 @@ namespace ScriptCanvas return Data::Type::Invalid(); } - SlotsOutcome Method::GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const + ConstSlotsOutcome Method::GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h index 6cccbaf342..7af2c15e82 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h @@ -86,7 +86,7 @@ namespace ScriptCanvas bool IsObjectClass(AZStd::string_view objectClass) const { return objectClass.compare(m_className) == 0; } - bool IsSupportedByNewBackend() const override { return true; } + //! Attempts to initialize node with a BehaviorContext BehaviorMethod //! If the className is empty, then the methodName is searched on the BehaviorContext @@ -133,7 +133,7 @@ namespace ScriptCanvas AZ_INLINE AZStd::recursive_mutex& GetMutex() { return m_mutex; } - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const override; + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot) const override; AZ::Outcome GetSimpleSignature() const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.cpp index 96d7d2de53..e29f4b3399 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.cpp @@ -88,6 +88,11 @@ namespace ScriptCanvas return nullptr; } + const AZStd::string& Nodeling::GetDisplayName() const + { + return m_displayName; + } + void Nodeling::SetDisplayName(const AZStd::string& displayName) { m_displayName = displayName; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.h index 9a2c65ed8f..1cf458d20d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.h @@ -66,15 +66,16 @@ namespace ScriptCanvas // NodelingRequestBus AZ::EntityId GetNodeId() const override { return GetEntityId(); } GraphScopedNodeId GetGraphScopedNodeId() const override { return GetScopedNodeId(); } - const AZStd::string& GetDisplayName() const override { return m_displayName; } - - bool IsSupportedByNewBackend() const override { return true; } + const AZStd::string& GetDisplayName() const override; + void Setup() override { OnSetup(); } void SetDisplayName(const AZStd::string& displayName) override; //// void RemapId(); + virtual void OnSetup() {} + protected: AZStd::string m_previousName; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp index 67304f5510..962ee3e515 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp @@ -619,7 +619,7 @@ namespace ScriptCanvas return AZ::Failure(); } - SlotsOutcome ReceiveScriptEvent::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const + ConstSlotsOutcome ReceiveScriptEvent::GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const { return EventHandlerTranslationHelper::GetSlotsInExecutionThreadByType(*this, executionSlot, targetSlotType); } @@ -641,7 +641,7 @@ namespace ScriptCanvas return nonEventSlotIds; } - bool ReceiveScriptEvent::HandlerStartsConnected() const + bool ReceiveScriptEvent::IsAutoConnected() const { return m_autoConnectToGraphOwner; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h index 4171180485..3f2425cd4a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h @@ -75,7 +75,7 @@ namespace ScriptCanvas void SetAutoConnectToGraphOwner(bool enabled); AZStd::string GetEBusName() const override; - bool HandlerStartsConnected() const override; + bool IsAutoConnected() const override; bool IsEBusAddressed() const override; bool IsEventHandler() const override; const Datum* GetHandlerStartAddress() const override; @@ -85,7 +85,7 @@ namespace ScriptCanvas AZStd::vector GetOnVariableHandlingExecutionSlots() const override; protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; void OnScriptEventReady(const AZ::Data::Asset&) override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvas.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvas.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml new file mode 100644 index 0000000000..8bdae01378 --- /dev/null +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.h index d5fc834707..a6656be47c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.h @@ -113,7 +113,7 @@ namespace ScriptCanvas virtual void Initialize(const AZ::Data::AssetId assetId); - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.h index 681f12b1bd..13f4ab0c92 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.h @@ -66,8 +66,7 @@ namespace ScriptCanvas PropertyFields GetPropertyFields() const override; // Translation ////////////////////////////////////////////////////////////////////////// - - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.h index 4e391025c5..1230b73679 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.h @@ -31,7 +31,7 @@ namespace ScriptCanvas SCRIPTCANVAS_NODE(Start); - bool IsSupportedByNewBackend() const override { return true; } + void OnInputSignal(const SlotId&) override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/UnaryOperator.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/UnaryOperator.h index 55a2457c7f..2bd0b8bf3b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/UnaryOperator.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/UnaryOperator.h @@ -37,10 +37,10 @@ namespace ScriptCanvas static const char* k_onTrue; static const char* k_onFalse; - bool IsSupportedByNewBackend() const override { return true; } + protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.h index 215c5421c6..d23f60da3e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.h @@ -61,13 +61,12 @@ namespace ScriptCanvas /// Translation bool IsNoOp() const override; - bool IsSupportedByNewBackend() const override { return true; } + AZ::Outcome GetDependencies() const override; protected: - - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.h index f06185a0df..0f53b9fb3c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.h @@ -36,7 +36,7 @@ namespace ScriptCanvas AZ::Outcome GetDependencies() const override; - bool IsSupportedByNewBackend() const override { return true; } + }; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.cpp index 10f473ef37..b5486f8f13 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.cpp @@ -32,7 +32,7 @@ namespace ScriptCanvas return AZ::Success(DependencyReport()); } - SlotsOutcome Cycle::GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const + ConstSlotsOutcome Cycle::GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h index e557bc7e13..89458547b8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h @@ -46,9 +46,9 @@ namespace ScriptCanvas AZ::Outcome GetDependencies() const override; - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.h index 11ba59644b..b6868c5096 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.h @@ -41,11 +41,10 @@ namespace ScriptCanvas bool IsIfBranch() const override { return true; } - bool IsSupportedByNewBackend() const override { return true; } + protected: - - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& /*executionSlot*/, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& /*executionSlot*/, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h index eab5acfbbc..a5c1740c1d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h @@ -39,10 +39,10 @@ namespace ScriptCanvas bool IsIfBranchPrefacedWithBooleanExpression() const override; - bool IsSupportedByNewBackend() const override { return true; } + protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.h index 87b719e236..fb69c1d0dd 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.h @@ -37,7 +37,7 @@ namespace ScriptCanvas AZ::Outcome GetDependencies() const override; - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.cpp index 060816b24b..38408e8e5b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.cpp @@ -31,7 +31,7 @@ namespace ScriptCanvas return AZ::Success(DependencyReport()); } - SlotsOutcome OrderedSequencer::GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const + ConstSlotsOutcome OrderedSequencer::GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const { if (targetSlotType == CombinedSlotType::ExecutionOut) { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h index bfbeeb39b6..8091e4d04d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h @@ -38,7 +38,7 @@ namespace ScriptCanvas AZ::Outcome GetDependencies() const override; - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; SlotId HandleExtension(AZ::Crc32 extensionId); @@ -48,7 +48,7 @@ namespace ScriptCanvas void ConfigureVisualExtensions() override; - bool IsSupportedByNewBackend() const override { return true; } + protected: diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h index 946fa8a887..b18dbd5865 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h @@ -42,8 +42,6 @@ namespace ScriptCanvas SlotId HandleExtension(AZ::Crc32 extensionId); // Script Canvas Translation... - bool IsSupportedByNewBackend() const override { return true; } - bool IsSwitchStatement() const override { return true; } AZ::Outcome GetDependencies() const override @@ -51,7 +49,7 @@ namespace ScriptCanvas return AZ::Success(DependencyReport{}); } - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.cpp index 4ba786232a..24125adee6 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.cpp @@ -35,7 +35,7 @@ namespace ScriptCanvas return AZ::Success(DependencyReport()); } - SlotsOutcome WeightedRandomSequencer::GetSlotsInExecutionThreadByTypeImpl(const Slot& , CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const + ConstSlotsOutcome WeightedRandomSequencer::GetSlotsInExecutionThreadByTypeImpl(const Slot& , CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h index 15a049e9aa..9d7ca8dfc1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h @@ -39,7 +39,7 @@ namespace ScriptCanvas AZ::Outcome GetDependencies() const override; - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; // Node void OnInit() override; @@ -51,7 +51,7 @@ namespace ScriptCanvas SlotId HandleExtension(AZ::Crc32 extensionId) override; - bool IsSupportedByNewBackend() const override { return true; } + bool CanDeleteSlot(const SlotId& slotId) const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.h index 3ebe323e84..9906370598 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.h @@ -39,10 +39,10 @@ namespace ScriptCanvas bool IsFormalLoop() const override; - bool IsSupportedByNewBackend() const override { return true; } + protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& /*executionSlot*/, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& /*executionSlot*/, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.h index b417667103..17057db93d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.h @@ -37,7 +37,7 @@ namespace ScriptCanvas protected: - SlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override + ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot&, CombinedSlotType targetSlotType, const Slot*) const override { return AZ::Success(GetSlotsByType(targetSlotType)); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.h index 3a6430e8bf..262987d781 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.h @@ -70,7 +70,7 @@ namespace ScriptCanvas AZ::Crc32 GetArithmeticExtensionId() const { return AZ_CRC("AddnewValueExtension", 0xea20301c); } AZ::Crc32 GetArithmeticDynamicTypeGroup() const { return AZ_CRC("ArithmeticGroup", 0x4271e41f); } AZStd::string GetArithmeticDisplayGroup() const { return "ArithmeticGroup"; } - bool IsSupportedByNewBackend() const override { return true; } + virtual AZStd::string_view OperatorFunction() const { return ""; } virtual AZStd::unordered_set< Data::Type > GetSupportedNativeDataTypes() const { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/StringGenerics.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/StringGenerics.h index 5e33fa962c..fae8ee71e4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/StringGenerics.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/StringGenerics.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.h index 966e039e62..cfd7eb367c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.h @@ -29,8 +29,6 @@ namespace ScriptCanvas protected: void OnTimeElapsed() override; - - ScriptCanvas::EnumComboBoxNodePropertyInterface m_timeUnitsInterface; }; } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml index db2d23ab55..db00609956 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml @@ -19,7 +19,5 @@ - -
\ No newline at end of file diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.cpp index 50f8304053..f13e4456a1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.cpp @@ -11,8 +11,6 @@ */ #include "TimerNodeable.h" -#include -#include namespace ScriptCanvas { @@ -20,16 +18,6 @@ namespace ScriptCanvas { namespace Time { - void TimerNodeable::OnDeactivate() - { - AZ::TickBus::Handler::BusDisconnect(); - } - - TimerNodeable::~TimerNodeable() - { - AZ::TickBus::Handler::BusDisconnect(); - } - void TimerNodeable::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint time) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::ScriptCanvas); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.h index 20880ae600..31ce521849 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.h @@ -12,7 +12,7 @@ #pragma once -#include +#include #include #include @@ -27,24 +27,17 @@ namespace ScriptCanvas namespace Time { class TimerNodeable - : public ScriptCanvas::Nodeable - , public AZ::TickBus::Handler + : public Nodeables::Time::BaseTimer { SCRIPTCANVAS_NODE(TimerNodeable); - public: - virtual ~TimerNodeable(); - protected: - void OnDeactivate() override; - // TickBus void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; private: AZ::ScriptTimePoint m_start; - ScriptCanvas::EnumComboBoxNodePropertyInterface m_timeUnitsInterface; }; } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasNode.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasNode.xml rename to Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBus.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBus.cpp index 742aacdfbd..f9917edbda 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBus.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBus.cpp @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSenderMacros.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSenderMacros.h index 61fcda6028..4ce0ccf42c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSenderMacros.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSenderMacros.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTesting.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTesting.h index 6185e99eb4..66e5e2148d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTesting.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTesting.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Results/ErrorText.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Results/ErrorText.h index a1c742e96c..16ac7e1fa0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Results/ErrorText.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Results/ErrorText.h @@ -41,7 +41,7 @@ namespace ScriptCanvas constexpr const char* FailedToParseIfBranch = "Failed parse a node that declared itself an if branch"; constexpr const char* FailedToRemoveChild = "Failed to remove child expected in parent children list"; constexpr const char* FunctionDefinitionCannotStart = "Function definition graph has on graph start that can't get called"; - constexpr const char* FunctionDefinitionNodeDidNotReturn = "Function definition node didn't return 1 and only execution in slot"; + constexpr const char* FunctionDefinitionNodeDidNotReturnSlot = "Function definition node didn't return 1 and only execution in slot"; constexpr const char* InactiveGraph = "This graph defines no functions, it is never activated, and will never execute. Add a Start node or connect an event handler or define functions."; constexpr const char* InfiniteLoopWritingToVariable = "infinite loop when writing to variable"; constexpr const char* InfiniteSelfActivationLoop = "infinite loop when activating the entity that owns this graph"; @@ -53,6 +53,7 @@ namespace ScriptCanvas constexpr const char* MissingParentOfRemovedNode = "There should always be a parent, even in a function graph, the function definition would be the first node"; constexpr const char* MissingTrueExecutionSlotOnIf = "A 'True' Execution output slot is required in an If branch node"; constexpr const char* MissingVariable = "Missing variable"; + constexpr const char* MissingAddressSlotForEbusEvent = "missing slot for EBus handler address"; constexpr const char* MissingVariableForEBusHandlerAddress = "missing variable for ebus handler address"; constexpr const char* MissingVariableForEBusHandlerAddressConnected = "missing variable for ebus handler address"; constexpr const char* MultipleExecutionOutConnections = "This node has multiple, unordered execution Out connections"; @@ -78,7 +79,6 @@ namespace ScriptCanvas constexpr const char* SequentialExecutionMappingFailure = "Sequential execution slot mapping failure"; constexpr const char* SourceUpdateRequired = "Source Graph requires a dedicated upgrade. Please run the Script Canvas Editor, and follow the updgrade instructions."; constexpr const char* StartNodeFailedToParse = "Start node execution failed to parse"; - constexpr const char* SubgraphComplexity = "Subgraphs support [1, N) Execution Ins leading to Execution Outs, or [1, N) Latent Outs, but not both."; constexpr const char* SubgraphOnGraphStartFailedToReturnLexicalScope = "Subgraph On Graph Start call failed to return LexicalScope."; constexpr const char* SubgraphReturnValues = "Subgraph with Latent Outs do not support variables with Scope In or Scope InOut"; constexpr const char* TooManyBranchesForReturn = "Too many branches for standard return values."; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/Configuration.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/Configuration.h index eb7b484b31..cca0b6d32f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/Configuration.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/Configuration.h @@ -31,7 +31,8 @@ namespace ScriptCanvas AZStd::string_view m_executionStateEntityIdName; AZStd::string_view m_executionStateEntityIdRef; AZStd::string_view m_executionStateName; - AZStd::string_view m_executionStateReference; + AZStd::string_view m_executionStateReferenceGraph; + AZStd::string_view m_executionStateReferenceLocal; AZStd::string_view m_executionStateScriptCanvasIdName; AZStd::string_view m_executionStateScriptCanvasIdRef; AZStd::string_view m_functionBlockClose; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp index 208d142632..d2797890c2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp @@ -51,7 +51,7 @@ namespace ScriptCanvas { const static size_t k_DefaultLoopLimit = 1000; - Configuration CreateLuaConfig(const Grammar::AbstractCodeModel& source) + Configuration CreateLuaConfig([[maybe_unused]] const Grammar::AbstractCodeModel& source) { Configuration configuration; configuration.m_blockCommentClose = "--]]"; @@ -61,7 +61,8 @@ namespace ScriptCanvas configuration.m_executionStateEntityIdName = "m_entityId"; configuration.m_executionStateEntityIdRef = "executionState:GetEntityId()"; - configuration.m_executionStateReference = source.IsPerEntityDataRequired() ? "self.executionState" : configuration.m_executionStateName; + configuration.m_executionStateReferenceGraph = "self.executionState"; + configuration.m_executionStateReferenceLocal = configuration.m_executionStateName; configuration.m_executionStateScriptCanvasIdName = "m_scriptCanvasId"; configuration.m_executionStateScriptCanvasIdRef = "executionState:GetScriptCanvasId()"; configuration.m_functionBlockClose = "end"; @@ -102,12 +103,37 @@ namespace ScriptCanvas m_tableName = GraphToLuaCpp::FileNameToTableName(m_model.GetSource().m_name); m_tableName += m_configuration.m_suffix; - m_runtimeInputs.m_executionCharacteristics = m_model.GetRuntimeCharacteristics(); + const auto& parsedInputs = m_model.GetRuntimeInputs(); + m_runtimeInputs.CopyFrom(parsedInputs); + auto executionCharacteristics = m_model.GetExecutionCharacteristics(); + auto hasNoOnGraphStart = !m_model.GetInterface().HasOnGraphStart(); + + if (executionCharacteristics == Grammar::ExecutionCharacteristics::Pure) + { + if (hasNoOnGraphStart) + { + m_runtimeInputs.m_executionSelection = Grammar::ExecutionStateSelection::InterpretedPure; + } + else + { + m_runtimeInputs.m_executionSelection = Grammar::ExecutionStateSelection::InterpretedPureOnGraphStart; + } + } + else + { + if (hasNoOnGraphStart) + { + m_runtimeInputs.m_executionSelection = Grammar::ExecutionStateSelection::InterpretedObject; + } + else + { + m_runtimeInputs.m_executionSelection = Grammar::ExecutionStateSelection::InterpretedObjectOnGraphStart; + } + } WriteHeader(); TranslateDependencies(); TranslateClassOpen(); - ParseConstructionInputVariables(); TranslateBody(BuildConfiguration::Release); TranslateBody(BuildConfiguration::Performance); TranslateBody(BuildConfiguration::Debug); @@ -143,14 +169,6 @@ namespace ScriptCanvas } } - bool GraphToLua::IsCodeConstructable(Grammar::VariableConstPtr value) - { - return Data::IsValueType(value->m_datum.GetType()) - || value->m_datum.GetType().GetAZType() == azrtti_typeid() - || value->m_datum.GetAsDanger() == nullptr; - ; - } - bool GraphToLua::IsDebugInfoWritten() const { return m_executionConfig == BuildConfiguration::Debug @@ -208,7 +226,7 @@ namespace ScriptCanvas TargetResult result; result.m_text = m_dotLua.MoveOutput(); result.m_runtimeInputs = AZStd::move(m_runtimeInputs); - result.m_debugMap = m_model.m_debugMap; + result.m_debugMap = m_model.GetDebugMap(); result.m_subgraphInterface = m_model.GetInterface(); result.m_duration = GetTranslationDuration(); return result; @@ -219,125 +237,6 @@ namespace ScriptCanvas writer.Indent(); } - void GraphToLua::ParseConstructionInputVariables() - { - AZ::SerializeContext* serializeContext = AZ::EntityUtils::GetApplicationSerializeContext(); - AZStd::vector> nodeablesById; - AZStd::vector inputVariableIds; - AZStd::unordered_map inputVariablesById; - - for (auto variable : m_model.GetVariables()) - { - auto constructionRequirement = ParseConstructionRequirement(variable); - - switch (constructionRequirement) - { - case VariableConstructionRequirement::None: - break; - - case VariableConstructionRequirement::InputEntityId: - { - m_runtimeInputs.m_entityIds.emplace_back(variable->m_sourceVariableId, *variable->m_datum.GetAs()); - } - break; - - case VariableConstructionRequirement::InputNodeable: - { - // I solemnly swear no harm shall come to the nodeable - const Nodeable* nodeableSource = reinterpret_cast(variable->m_datum.GetAsDanger()); - AZ_Assert(nodeableSource != nullptr, "the must be a raw nodeable held by this pointer"); - AZ_Assert(azrtti_typeid(nodeableSource) != azrtti_typeid(), "type problem with nodeable"); - nodeablesById.push_back({ variable->m_nodeableNodeId, const_cast(nodeableSource) }); - } - break; - - case VariableConstructionRequirement::InputVariable: - { - inputVariableIds.push_back(variable->m_sourceVariableId); - inputVariablesById.insert({ variable->m_sourceVariableId, variable }); - // sort revealed a datum copy issue: type is not preserved, workaround below - // m_runtimeInputs.m_variables.emplace_back(variable->m_sourceVariableId, variable->m_datum); - } - break; - - case VariableConstructionRequirement::Static: - m_runtimeInputs.m_staticVariables.push_back({ variable->m_sourceVariableId, variable->m_datum.ToAny() }); - break; - - default: - AZ_Assert(constructionRequirement == VariableConstructionRequirement::None, "new requirement added and not handled"); - break; - } - } - - m_runtimeInputs.m_nodeables.reserve(nodeablesById.size()); - for (auto& idAndNodeable : nodeablesById) - { - m_runtimeInputs.m_nodeables.push_back(idAndNodeable.second); - } - - AZStd::sort(nodeablesById.begin(), nodeablesById.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - - // sort revealed a datum copy issue: type is not preserved, workaround below - // AZStd::sort(m_runtimeInputs.m_variables.begin(), m_runtimeInputs.m_variables.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - m_runtimeInputs.m_variables.reserve(inputVariableIds.size()); - AZStd::sort(inputVariableIds.begin(), inputVariableIds.end()); - for (auto variableId : inputVariableIds) - { - auto iter = inputVariablesById.find(variableId); - AZ_Assert(iter != inputVariablesById.end(), "missing variable id from list just constructed"); - m_runtimeInputs.m_variables.emplace_back(iter->first, iter->second->m_datum); - } - - AZStd::sort(m_runtimeInputs.m_entityIds.begin(), m_runtimeInputs.m_entityIds.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - AZStd::sort(m_runtimeInputs.m_staticVariables.begin(), m_runtimeInputs.m_staticVariables.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - - auto& staticVariables = ModStaticVariables(); - staticVariables = m_model.ToVariableList(m_runtimeInputs.m_staticVariables); - auto& staticVariableNames = ModStaticVariablesNames(); - for (auto staticVariable : staticVariables ) - { - AZStd::string name = m_model.m_graphScope->AddVariableName(AZStd::string::format("s_%sCloneSource", staticVariable->m_name.c_str())); - staticVariableNames.push_back({ staticVariable, name }); - } - } - - GraphToLua::VariableConstructionRequirement GraphToLua::ParseConstructionRequirement(Grammar::VariableConstPtr variable) - { - if (Grammar::IsEntityIdThatRequiresRuntimeRemap(variable)) - { - return VariableConstructionRequirement::InputEntityId; - } - else if (variable->m_isExposedToConstruction) - { - if (variable->m_sourceVariableId.IsValid()) - { - return VariableConstructionRequirement::InputVariable; - } - else if (variable->m_nodeableNodeId.IsValid()) - { - return VariableConstructionRequirement::InputNodeable; - } - else - { - AZ_Assert(false, "A member variable in the model has no valid id"); - } - } - else if (variable->m_sourceVariableId.IsValid() && !IsCodeConstructable(variable)) - { - if (m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::ValueInitialization) - { - return VariableConstructionRequirement::InputVariable; - } - else - { - return VariableConstructionRequirement::Static; - } - } - - return VariableConstructionRequirement::None; - } - AZ::Outcome GraphToLua::Translate(const Grammar::AbstractCodeModel& model) { GraphToLua translation(model); @@ -419,9 +318,9 @@ namespace ScriptCanvas void GraphToLua::TranslateDependencies() { - const auto& depencies = m_model.GetDependencies(); + const auto& dependencies = m_model.GetOrderedDependencies().source; - for (const auto& dependency : depencies.nativeLibraries) + for (const auto& dependency : dependencies.nativeLibraries) { if (dependency.size() == 1) { @@ -437,7 +336,7 @@ namespace ScriptCanvas } } - for (const auto& dependency : depencies.userSubgraphs) + for (const auto& dependency : dependencies.userSubgraphs) { if (dependency.empty()) { @@ -802,13 +701,13 @@ namespace ScriptCanvas { m_dotLua.Indent(); - if (m_model.IsPerEntityDataRequired()) + if (execution->IsPure()) { - m_dotLua.WriteLineIndented("if %s(%s) then", Grammar::k_DebugIsTracedName, m_configuration.m_executionStateReference.data()); + m_dotLua.WriteLineIndented("if %s(%s) then", Grammar::k_DebugIsTracedName, m_configuration.m_executionStateReferenceLocal.data()); } else { - m_dotLua.WriteLineIndented("if %s(%s) then", Grammar::k_DebugIsTracedName, m_configuration.m_executionStateName.data()); + m_dotLua.WriteLineIndented("if %s(%s) then", Grammar::k_DebugIsTracedName, m_configuration.m_executionStateReferenceGraph.data()); } TranslateFunctionBlock(execution, FunctionBlockConfig::Traced, lex); @@ -830,10 +729,9 @@ namespace ScriptCanvas { ScopedIndent indent(m_dotLua); - if (m_model.IsPerEntityDataRequired()) + if (!functionBlock->IsPure()) { - // \todo move to the config - m_dotLua.WriteLineIndented("local %s = %s", m_configuration.m_executionStateName.data(), m_configuration.m_executionStateReference.data()); + m_dotLua.WriteLineIndented("local %s = %s", m_configuration.m_executionStateName.data(), m_configuration.m_executionStateReferenceGraph.data()); } if (functionBlock->IsInfiniteLoopDetectionPoint()) @@ -877,22 +775,44 @@ namespace ScriptCanvas { m_dotLua.Write(" %s", m_tableName.data()); // function TableName - m_dotLua.Write(m_model.IsPerEntityDataRequired() ? ":" : "."); + m_dotLua.Write(execution->IsPure() ? "." : ":" ); // function TableName. OR function TableName: m_dotLua.Write(execution->GetName()); } m_dotLua.Write("("); - if (execution->GetChildrenCount() > 0) + if (execution->IsStart() && execution->IsPure()) { - const auto& output = execution->GetChild(0).m_output; + m_dotLua.Write(Grammar::k_executionStateVariableName); - int inputIndex = 0; - - if (isNamed == IsNamed::Yes) + WriteConstructionInput(); + } + else + { + if (execution->GetChildrenCount() > 0) { - if (execution->IsPure()) + const auto& output = execution->GetChild(0).m_output; + + int inputIndex = 0; + + if (isNamed == IsNamed::Yes) + { + if (execution->IsPure()) + { + m_dotLua.Write(Grammar::k_executionStateVariableName); + + if (!output.empty()) + { + m_dotLua.Write(", "); + } + } + else if (!m_model.IsUserNodeable()) + { + inputIndex = 1; + } + } + else if (execution->IsPure()) { m_dotLua.Write(Grammar::k_executionStateVariableName); @@ -901,34 +821,21 @@ namespace ScriptCanvas m_dotLua.Write(", "); } } - else if (!m_model.IsUserNodeable()) + + // function[name](arg0 + if (inputIndex < output.size()) { - inputIndex = 1; + m_dotLua.Write(output[inputIndex].second->m_source->m_name.data()); + ++inputIndex; } - } - else if (execution->IsPure()) - { - m_dotLua.Write(Grammar::k_executionStateVariableName); - if (!output.empty()) + // function[name](arg0 + for (; inputIndex < output.size(); ++inputIndex) { - m_dotLua.Write(", "); + m_dotLua.Write(", %s", output[inputIndex].second->m_source->m_name.data()); + // function[name](arg0, ..., argN } } - - // function[name](arg0 - if (inputIndex < output.size()) - { - m_dotLua.Write(output[inputIndex].second->m_source->m_name.data()); - ++inputIndex; - } - - // function[name](arg0 - for (; inputIndex < output.size(); ++inputIndex) - { - m_dotLua.Write(", %s", output[inputIndex].second->m_source->m_name.data()); - // function[name](arg0, ..., argN - } } m_dotLua.WriteLine(")"); @@ -945,7 +852,7 @@ namespace ScriptCanvas const bool hasResults = eventThread->HasReturnValues(); m_dotLua.WriteNewLine(); - m_dotLua.WriteLineIndented("%s(%s.%s, '%s'," + m_dotLua.WriteLineIndented("%s(%s%s, '%s'," , hasResults ? Grammar::k_EBusHandlerHandleEventResultName : Grammar::k_EBusHandlerHandleEventName , leftValue.data() , ebusHandling->m_handlerName.data() @@ -965,7 +872,7 @@ namespace ScriptCanvas { if (ebusHandling->m_isAddressed) { - m_dotLua.WriteIndented("%.*s.%s = %s(%s, '%s', \"" + m_dotLua.WriteIndented("%.*s%s = %s(%s, '%s', \"" , static_cast(leftValue.size()), leftValue.data() , ebusHandling->m_handlerName.data() , Grammar::k_EBusHandlerCreateAndConnectToName @@ -974,12 +881,12 @@ namespace ScriptCanvas m_dotLua.Write(Execution::CreateStringFastFromId(ebusHandling->m_startingAdress->m_datum.GetType().GetAZType()).data()); m_dotLua.Write("\", "); - m_dotLua.Write(AZStd::string::format("%s.%s", leftValue.data(), ebusHandling->m_startingAdress->m_name.data())); + m_dotLua.Write(AZStd::string::format("%s%s", leftValue.data(), ebusHandling->m_startingAdress->m_name.data())); m_dotLua.WriteLine(")"); } else { - m_dotLua.WriteLineIndented("%.*s.%s = %s(%s, '%s')" + m_dotLua.WriteLineIndented("%.*s%s = %s(%s, '%s')" , static_cast(leftValue.size()), leftValue.data() , ebusHandling->m_handlerName.data() , Grammar::k_EBusHandlerCreateAndConnectName @@ -989,7 +896,7 @@ namespace ScriptCanvas } else { - m_dotLua.WriteLineIndented("%.*s.%s = %s(%s, '%s')" + m_dotLua.WriteLineIndented("%.*s%s = %s(%s, '%s')" , static_cast(leftValue.size()), leftValue.data() , ebusHandling->m_handlerName.data() , Grammar::k_EBusHandlerCreateName @@ -1009,7 +916,7 @@ namespace ScriptCanvas } } - void GraphToLua::TranslateNodeableParse(AZStd::string_view leftValue) + void GraphToLua::TranslateNodeableParse() { for (auto& nodeAndParse : m_model.GetNodeableParse()) { @@ -1021,7 +928,7 @@ namespace ScriptCanvas for (auto& out : nodeAndParse->m_latents) { m_dotLua.WriteNewLine(); - TranslateNodeableParse(out.second, leftValue); + TranslateNodeableOut(out.second); } if (!nodeAndParse->m_latents.empty()) @@ -1030,11 +937,6 @@ namespace ScriptCanvas } } } - - void GraphToLua::TranslateNodeableParse(Grammar::ExecutionTreeConstPtr nodeable, AZStd::string_view /*leftValue*/) - { - TranslateNodeableOut(nodeable); - } void GraphToLua::TranslateInheritance() { @@ -1052,7 +954,7 @@ namespace ScriptCanvas m_dotLua.WriteNewLine(); m_dotLua.Write("function %s.new(executionState", m_tableName.c_str()); - WriteConstructionInput(IsLeadingCommaRequired::Yes); + WriteConstructionInput(); m_dotLua.WriteLine(")"); OpenFunctionBlock(m_dotLua); @@ -1087,7 +989,7 @@ namespace ScriptCanvas } m_dotLua.WriteLineIndented("self.%s = %s", Grammar::k_executionStateVariableName, Grammar::k_executionStateVariableName); - TranslateVariableInitialization("self"); + TranslateVariableInitialization("self."); m_dotLua.WriteLineIndented("return self"); } @@ -1144,12 +1046,11 @@ namespace ScriptCanvas m_dotLua.WriteLine(")"); m_dotLua.Indent(); - auto& variables = GetStaticVariables(); - auto& staticSource = GetStaticVariablesNames(); + const auto& staticSources = m_model.GetStaticVariablesNames(); - for (size_t i = 0; i < variables.size(); ++i) + for (const auto& staticSource : staticSources) { - m_dotLua.WriteLineIndented("rawset(self, '%s', %s)", staticSource[i].second.c_str(), variables[i]->m_name.c_str()); + m_dotLua.WriteLineIndented("rawset(self, '%s', %s)", staticSource.second.c_str(), staticSource.first->m_name.c_str()); } m_dotLua.Outdent(); @@ -1158,6 +1059,7 @@ namespace ScriptCanvas void GraphToLua::TranslateVariableInitialization(AZStd::string_view leftValue) { + const auto& staticVariableNames = m_model.GetStaticVariablesNames(); auto& variables = m_model.GetVariables(); for (auto& variable : variables) { @@ -1179,40 +1081,100 @@ namespace ScriptCanvas nodeableName.resize(nodeableName.size() - AZStd::string_view(Grammar::k_reservedWordProtection).size()); } - if (m_model.IsUserNodeable(variable)) + if (auto stringOptional = m_model.FindNodeableSimpleName(variable)) { - nodeableName = GraphToLuaCpp::ToDependencyTableName(nodeableName); + nodeableName = GraphToLuaCpp::ToDependencyTableName(*stringOptional); } - m_dotLua.WriteLineIndented("%s.%s = %s.new(%s)" - , leftValue.data() - , variable->m_name.data() - , nodeableName.data() - , Grammar::k_executionStateVariableName); + AZStd::optional> indexInfo = m_model.CheckUserNodeableDependencyConstructionIndex(variable); + if (indexInfo && indexInfo->second.requiresCtorParams) + { + if (indexInfo->second.requiresCtorParamsForDependencies) + { + // indexInfo->second.requiresCtorParamsForDependencies + // self.nonLeafDependency = NonLeafDependency.new(executionState, UnpackDependencyArgs(executionState, dependentAssets, 7)) + // -- has more dependencies, index, known from compile time, pushes the correct asset further down construction + m_dotLua.WriteLineIndented("%s%s = %s.new(%s, %s(%s, %s, %s))" + , leftValue.data() + , variable->m_name.data() + , nodeableName.data() + , Grammar::k_executionStateVariableName + , Grammar::k_UnpackDependencyConstructionArgsFunctionName + , Grammar::k_executionStateVariableName + , Grammar::k_DependentAssetsArgName + , AZStd::to_string(indexInfo->first).data()); + + } + else // vs. + { + // !indexInfo->second.hasMoreDependencies + // self.leafDependency = LeafDependency.new(executionState, UnpackDependencyArgsLeaf(executionState, dependentAssets, 10)) + // -- has NO more dependencies, index, known from compile time + m_dotLua.WriteLineIndented("%s%s = %s.new(%s, %s(%s, %s, %s))" + , leftValue.data() + , variable->m_name.data() + , nodeableName.data() + , Grammar::k_executionStateVariableName + , Grammar::k_UnpackDependencyConstructionArgsLeafFunctionName + , Grammar::k_executionStateVariableName + , Grammar::k_DependentAssetsArgName + , AZStd::to_string(indexInfo->first).data()); + } + } + else + { + // self.leaf = Lef.new(executionState) + m_dotLua.WriteLineIndented("%s%s = %s.new(%s)" + , leftValue.data() + , variable->m_name.data() + , nodeableName.data() + , Grammar::k_executionStateVariableName); + } } else if (variable->m_isMember) { const auto constructionRequirement = ParseConstructionRequirement(variable); - if (constructionRequirement == VariableConstructionRequirement::None) - { - m_dotLua.WriteLineIndented("%s.%s = %s", leftValue.data(), variable->m_name.data(), ToValueString(variable->m_datum, m_configuration).data()); - } - else if (constructionRequirement == VariableConstructionRequirement::InputNodeable) + switch (constructionRequirement) { + case Grammar::VariableConstructionRequirement::InputEntityId: + case Grammar::VariableConstructionRequirement::InputVariable: + m_dotLua.WriteLineIndented("%s%s = %s", leftValue.data(), variable->m_name.data(), variable->m_name.data()); + break; + + case Grammar::VariableConstructionRequirement::None: + m_dotLua.WriteLineIndented("%s%s = %s", leftValue.data(), variable->m_name.data(), ToValueString(variable->m_datum, m_configuration).data()); + break; + + case Grammar::VariableConstructionRequirement::InputNodeable: m_dotLua.WriteLineIndented("%s:InitializeExecutionState(%s)", variable->m_name.data(), Grammar::k_executionStateVariableName); - m_dotLua.WriteLineIndented("%s.%s = %s", leftValue.data(), variable->m_name.data(), variable->m_name.data()); - } - else if (constructionRequirement != VariableConstructionRequirement::Static) + m_dotLua.WriteLineIndented("%s%s = %s", leftValue.data(), variable->m_name.data(), variable->m_name.data()); + break; + + case Grammar::VariableConstructionRequirement::Static: { - m_dotLua.WriteLineIndented("%s.%s = %s", leftValue.data(), variable->m_name.data(), variable->m_name.data()); + auto iter = AZStd::find_if(staticVariableNames.begin(), staticVariableNames.end(), [&variable](auto& candidate) { return candidate.first == variable; }); + if (iter != staticVariableNames.end()) + { + m_dotLua.WriteLineIndented("%s%s = %s(rawget(%s, '%s'))", leftValue.data(), iter->first->m_name.c_str(), Grammar::k_CloneSourceFunctionName, m_tableName.c_str(), iter->second.c_str()); + } + else + { + AddError(nullptr, aznew Internal::ParseError(AZ::EntityId(), "Missing static name for variable that requires static initializer")); + } + break; + } + + default: + break; } + } } // translate the event handling...initialize to nil, check for nil before disconnecting TranslateEBusHandling(leftValue); - TranslateNodeableParse(leftValue); + TranslateNodeableParse(); } void GraphToLua::WriteConditionalCaseSwitch(Grammar::ExecutionTreeConstPtr execution, Grammar::Symbol symbol, const Grammar::ExecutionChild& child, size_t index) @@ -1234,23 +1196,32 @@ namespace ScriptCanvas } } - void GraphToLua::WriteConstructionInput(IsLeadingCommaRequired commaRequired) + void GraphToLua::WriteConstructionInput() + { + WriteConstructionDependencyArgs(); + WriteConstructionArgs(); + } + + void GraphToLua::WriteConstructionArgs() { AZStd::vector constructionArguments = m_model.CombineVariableLists(m_runtimeInputs.m_nodeables, m_runtimeInputs.m_variables, m_runtimeInputs.m_entityIds); if (!constructionArguments.empty()) { - if (commaRequired == IsLeadingCommaRequired::Yes) + for (auto& constructionArgument : constructionArguments) { - m_dotLua.Write(", "); + m_dotLua.Write(", %s", constructionArgument->m_name.data()); } + } + } - m_dotLua.Write(constructionArguments[0]->m_name.data()); + void GraphToLua::WriteConstructionDependencyArgs() + { + auto& dependencyArgs = m_model.GetOrderedDependencies().orderedAssetIds; - for (size_t i = 1; i < constructionArguments.size(); ++i) - { - m_dotLua.Write(", %s", constructionArguments[i]->m_name.data()); - } + if (!dependencyArgs.empty()) + { + m_dotLua.Write(", %s", Grammar::k_DependentAssetsArgName); } } @@ -1275,7 +1246,7 @@ namespace ScriptCanvas { if (auto* debugIndex = m_model.GetDebugInfoInIndex(execution)) { - if (m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::ValueInitialization) + if (!m_model.IsPureLibrary()) { m_dotLua.WriteIndented("%s(executionState, %d", Grammar::k_DebugSignalInName, *debugIndex); } @@ -1301,7 +1272,7 @@ namespace ScriptCanvas { if (auto* debugIndex = m_model.GetDebugInfoOutIndex(execution, childIndex)) { - if (m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::ValueInitialization) + if (!m_model.IsPureLibrary()) { m_dotLua.WriteIndented("%s(executionState, %d", Grammar::k_DebugSignalOutName, *debugIndex); } @@ -1329,7 +1300,7 @@ namespace ScriptCanvas { if (auto* debugIndex = m_model.GetDebugInfoReturnIndex(execution)) { - if (m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::ValueInitialization) + if (!m_model.IsPureLibrary()) { m_dotLua.WriteIndented("%s(executionState, %d", Grammar::k_DebugSignalReturnName, *debugIndex); } @@ -1355,7 +1326,7 @@ namespace ScriptCanvas { if (auto* debugIndex = m_model.GetDebugInfoVariableSetIndex(output)) { - if (m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::ValueInitialization) + if (!m_model.IsPureLibrary()) { m_dotLua.WriteIndented("%s(executionState, %d, ", Grammar::k_DebugVariableChangeName, *debugIndex); WriteVariableReference(output->m_source); @@ -1375,7 +1346,7 @@ namespace ScriptCanvas if (auto* debugIndex = m_model.GetDebugInfoVariableAssignmentIndex(output, assignmentIndex)) { - if (m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::ValueInitialization) + if (!m_model.IsPureLibrary()) { m_dotLua.WriteIndented("%s(executionState, %d, ", Grammar::k_DebugVariableChangeName, *debugIndex); WriteVariableReference(assignment); @@ -1574,7 +1545,15 @@ namespace ScriptCanvas break; } - WriteFunctionCallInput(execution, inputOverride); + // #functions2 pure on graph start nodes with dependencies can only be added to the graph as variables +// if (execution->IsStart() && execution->IsPure()) +// { +// WriteFunctionCallInputOfChildStart(execution); +// } +// else + { + WriteFunctionCallInput(execution, inputOverride); + } if (isNilCheckRequired.first == NilCheck::Single) { @@ -1666,6 +1645,7 @@ namespace ScriptCanvas void GraphToLua::WriteFunctionCallInput(Grammar::ExecutionTreeConstPtr execution, size_t inputCountOverride) { + const size_t inputCount = execution->GetInputCount(); const size_t inputMax = AZStd::min(inputCount, inputCountOverride != inputCount ? inputCountOverride : inputCount); const size_t startingIndex = WriteFunctionCallInputThisPointer(execution); @@ -1740,9 +1720,17 @@ namespace ScriptCanvas } } + // #functions2 pure on graph start nodes with dependencies can only by added to the graph as variables +// void GraphToLua::WriteFunctionCallInputOfChildStart(Grammar::ExecutionTreeConstPtr execution) +// { +// // auto pureStartVariable = m_model.GetPureStartVariable(execution); +// // and follow similar path in this function: TranslateVariableInitialization +// // if (AZStd::optional> indexInfo = m_model.CheckUserNodeableDependencyConstructionIndex(variable)) +// } + size_t GraphToLua::WriteFunctionCallInputThisPointer(Grammar::ExecutionTreeConstPtr execution) { - if (IsUserFunctionCallPure(execution)) + if (IsUserFunctionCall(execution) && execution->GetRoot()->IsPure()) { m_dotLua.Write("%s", Grammar::k_executionStateVariableName); @@ -1859,17 +1847,14 @@ namespace ScriptCanvas } } - void GraphToLua::WriteLocalInputCreation(Grammar::ExecutionTreeConstPtr execution) + void GraphToLua::WriteLocalInputCreation(Grammar::ExecutionTreeConstPtr functionBlock) { - if (m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::FunctionPrototype) - { - const auto& staticVariables = GetStaticVariablesNames(); + const auto& staticVariables = m_model.GetStaticVariablesNames(functionBlock); - for (const auto& intitializer : staticVariables) - { - AZ_Assert(!IsCodeConstructable(intitializer.first), "parsing of local input creation requirement failed"); - m_dotLua.WriteLineIndented("local %s = %s(rawget(%s, '%s'))", intitializer.first->m_name.c_str(), Grammar::k_CloneSourceFunctionName, m_tableName.c_str(), intitializer.second.c_str()); - } + for (const auto& intitializer : staticVariables) + { + AZ_Assert(!Grammar::IsCodeConstructable(intitializer.first), "parsing of local input creation requirement failed"); + m_dotLua.WriteLineIndented("local %s = %s(rawget(%s, '%s'))", intitializer.first->m_name.c_str(), Grammar::k_CloneSourceFunctionName, m_tableName.c_str(), intitializer.second.c_str()); } } @@ -1904,27 +1889,13 @@ namespace ScriptCanvas void GraphToLua::WriteLocalVariableInitializion(Grammar::ExecutionTreeConstPtr execution) { - if (execution->GetSymbol() == Grammar::Symbol::FunctionDefinition && m_model.GetVariableScopeMeaning() == Grammar::VariableScopeMeaning::FunctionPrototype) + if (const auto& localDeclaredVariables = m_model.GetLocalVariables(execution)) { - for (size_t index(0); index < execution->GetInputCount(); ++index) + for (const auto& variable : *localDeclaredVariables) { - if (auto variable = execution->GetInput(index).m_value) - { - if (variable->m_source == execution) - { - m_dotLua.WriteLineIndented("local %s = %s", variable->m_name.data(), ToValueString(variable->m_datum, m_configuration).data()); - } - } - else - { - AddError(execution, aznew Internal::ParseError(execution->GetNodeId(), ParseErrors::MissingInputVariableInFunctionDefinition)); - } - } + const auto requirement = ParseConstructionRequirement(variable); - auto localVariables = m_model.GetLocalVariablesUser(); - for (const auto& variable : localVariables) - { - if (IsCodeConstructable(variable) && !variable->m_isExposedToConstruction) + if (requirement == Grammar::VariableConstructionRequirement::None || (requirement != Grammar::VariableConstructionRequirement::Static && !execution->IsStart())) { m_dotLua.WriteLineIndented("local %s = %s", variable->m_name.data(), ToValueString(variable->m_datum, m_configuration).data()); } @@ -2202,7 +2173,7 @@ namespace ScriptCanvas void GraphToLua::WriteReturnStatement(Grammar::ExecutionTreeConstPtr execution) { - if (execution->HasReturnValues() && !execution->ReturnValuesRoutedToOuts()) + if (execution->HasReturnValues() && !execution->HasExplicitUserOutCalls()) { WriteDebugInfoReturn(execution, "WriteReturnStatement"); m_dotLua.WriteIndented("return "); @@ -2263,12 +2234,12 @@ namespace ScriptCanvas m_dotLua.Write(", "); } - auto& variables = GetStaticVariables(); - m_dotLua.Write(variables[0]->m_name.data()); + auto& variables = m_model.GetStaticVariablesNames(); + m_dotLua.Write(variables.front().first->m_name.data()); for (size_t i = 1; i < variables.size(); ++i) { - m_dotLua.Write(", %s", variables[i]->m_name.data()); + m_dotLua.Write(", %s", variables[i].first->m_name.data()); } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h index d527b2a39e..b10856c67a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h @@ -59,18 +59,6 @@ namespace ScriptCanvas protected: enum class IsNamed { No, Yes }; - // \todo part of the output of the compilation step will have to be the list of variables that must be stored on disk, cloned and loaded, - // rather than having the regular build step generate this - enum class VariableConstructionRequirement - { - InputEntityId, - InputNodeable, - InputVariable, - None, - Static, - }; - - static bool IsCodeConstructable(Grammar::VariableConstPtr value); static IsNamed IsInputNamed(Grammar::VariableConstPtr input, Grammar::ExecutionTreeConstPtr execution); RuntimeInputs m_runtimeInputs; @@ -98,8 +86,6 @@ namespace ScriptCanvas TargetResult MoveResult(); void OpenFunctionBlock(Writer& writer); - void ParseConstructionInputVariables(); - VariableConstructionRequirement ParseConstructionRequirement(Grammar::VariableConstPtr value); void TranslateBody(); void TranslateBody(BuildConfiguration configuration); void TranslateClassClose(); @@ -107,7 +93,6 @@ namespace ScriptCanvas void TranslateConstruction(); void TranslateDependencies(); void TranslateDestruction(); - // keep the leftValue thing, fix it, and put it in the configuration void TranslateEBusEvents(Grammar::EBusHandlingConstPtr ebusHandling, AZStd::string_view leftValue); void TranslateEBusHandlerCreation(Grammar::EBusHandlingConstPtr ebusHandling, AZStd::string_view leftValue); void TranslateEBusHandling(AZStd::string_view leftValue); @@ -127,13 +112,14 @@ namespace ScriptCanvas void TranslateInheritance(); void TranslateNodeableOut(Grammar::ExecutionTreeConstPtr execution); void TranslateNodeableOuts(Grammar::ExecutionTreeConstPtr execution); - void TranslateNodeableParse(AZStd::string_view leftValue); - void TranslateNodeableParse(Grammar::ExecutionTreeConstPtr execution, AZStd::string_view leftValue); + void TranslateNodeableParse(); void TranslateStaticInitialization(); void TranslateVariableInitialization(AZStd::string_view leftValue); void WriteConditionalCaseSwitch(Grammar::ExecutionTreeConstPtr execution, Grammar::Symbol symbol, const Grammar::ExecutionChild& child, size_t index); enum class IsLeadingCommaRequired { No, Yes }; - void WriteConstructionInput(IsLeadingCommaRequired commaRequired); + void WriteConstructionArgs(); + void WriteConstructionDependencyArgs(); + void WriteConstructionInput(); void WriteCycleBegin(Grammar::ExecutionTreeConstPtr execution); void WriteDebugInfoIn(Grammar::ExecutionTreeConstPtr execution, AZStd::string_view); void WriteDebugInfoIn(Grammar::ExecutionTreeConstPtr execution, AZStd::string_view, size_t inputCountOverride); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.cpp index 68b832ca83..bc4a7afc99 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.cpp @@ -76,16 +76,6 @@ namespace ScriptCanvas writer.WriteLineIndented(m_configuration.m_scopeClose); } - const AZStd::pair* GraphToX::FindStaticVariable(Grammar::VariableConstPtr variable) const - { - auto iter = AZStd::find_if - ( m_staticVariableNames.begin() - , m_staticVariableNames.end() - , [&](const auto& candidate) { return candidate.first == variable; }); - - return (iter != m_staticVariableNames.end()) ? iter : nullptr; - } - AZStd::string_view GraphToX::GetGraphName() const { return m_model.GetSource().m_name; @@ -101,16 +91,6 @@ namespace ScriptCanvas return AZStd::string::format("multiReturn_%d", m_multiReturnCount); } - const AZStd::vector& GraphToX::GetStaticVariables() const - { - return m_staticVariables; - } - - const AZStd::vector>& GraphToX::GetStaticVariablesNames() const - { - return m_staticVariableNames; - } - AZStd::sys_time_t GraphToX::GetTranslationDuration() const { return m_translationDuration; @@ -131,16 +111,6 @@ namespace ScriptCanvas m_translationDuration = AZStd::chrono::microseconds(AZStd::chrono::system_clock::now() - m_translationStartTime).count(); } - AZStd::vector& GraphToX::ModStaticVariables() - { - return m_staticVariables; - } - - AZStd::vector>& GraphToX::ModStaticVariablesNames() - { - return m_staticVariableNames; - } - AZStd::string GraphToX::ResolveScope(const AZStd::vector& namespaces) { AZStd::string resolution; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.h index b10de154ca..ee6abca82c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToX.h @@ -52,14 +52,9 @@ namespace ScriptCanvas void CloseFunctionBlock(Writer& writer); void CloseScope(Writer& writer); void CloseNamespace(Writer& writer, AZStd::string_view ns); - const AZStd::pair* FindStaticVariable(Grammar::VariableConstPtr) const; AZStd::string_view GetGraphName() const; AZStd::string_view GetFullPath() const; - const AZStd::vector& GetStaticVariables() const; - const AZStd::vector>& GetStaticVariablesNames() const; AZStd::sys_time_t GetTranslationDuration() const; - AZStd::vector& ModStaticVariables(); - AZStd::vector>& ModStaticVariablesNames(); AZStd::string ResolveScope(const AZStd::vector& namespaces); void SingleLineComment(Writer& writer); void OpenBlockComment(Writer& writer); @@ -78,8 +73,6 @@ namespace ScriptCanvas AZStd::vector m_errors; AZStd::sys_time_t m_translationDuration; AZStd::chrono::system_clock::time_point m_translationStartTime; - AZStd::vector m_staticVariables; - AZStd::vector> m_staticVariableNames; }; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.cpp index 260e54e199..cf45680d3c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.cpp @@ -21,6 +21,8 @@ namespace TranslationResultCpp { RemoveGraphType = 0, AddedStaticVariables, + SupportMemberVariableInputs, + ExecutionStateSelectionIncludesOnGraphStart, // add your entry above Current }; @@ -117,7 +119,15 @@ namespace ScriptCanvas *this = AZStd::move(rhs); } - size_t RuntimeInputs::GetParameterSize() const + void RuntimeInputs::CopyFrom(const Grammar::ParsedRuntimeInputs& rhs) + { + m_nodeables = rhs.m_nodeables; + m_variables = rhs.m_variables; + m_entityIds = rhs.m_entityIds; + m_staticVariables = rhs.m_staticVariables; + } + + size_t RuntimeInputs::GetConstructorParameterCount() const { return m_nodeables.size() + m_variables.size() + m_entityIds.size(); } @@ -126,8 +136,7 @@ namespace ScriptCanvas { if (this != &rhs) { - m_execution = AZStd::move(rhs.m_execution); - m_executionCharacteristics = AZStd::move(rhs.m_executionCharacteristics); + m_executionSelection = AZStd::move(rhs.m_executionSelection); m_nodeables = AZStd::move(rhs.m_nodeables); m_variables = AZStd::move(rhs.m_variables); m_entityIds = AZStd::move(rhs.m_entityIds); @@ -143,8 +152,7 @@ namespace ScriptCanvas { serializeContext->Class() ->Version(TranslationResultCpp::RuntimeInputsVersion::Current) - ->Field("execution", &RuntimeInputs::m_execution) - ->Field("executionCharacteristics", &RuntimeInputs::m_executionCharacteristics) + ->Field("executionSelection", &RuntimeInputs::m_executionSelection) ->Field("nodeables", &RuntimeInputs::m_nodeables) ->Field("variables", &RuntimeInputs::m_variables) ->Field("entityIds", &RuntimeInputs::m_entityIds) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.h index d6fbd22120..2670ccf7e4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationResult.h @@ -55,8 +55,7 @@ namespace ScriptCanvas static void Reflect(AZ::ReflectContext* reflectContext); - ExecutionMode m_execution = ExecutionMode::Interpreted; - Grammar::ExecutionCharacteristics m_executionCharacteristics = Grammar::ExecutionCharacteristics::PerEntity; + Grammar::ExecutionStateSelection m_executionSelection = Grammar::ExecutionStateSelection::InterpretedPure; AZStd::vector m_nodeables; AZStd::vector> m_variables; // either the entityId was a (member) variable in the source graph, or it got promoted to one during parsing @@ -70,7 +69,10 @@ namespace ScriptCanvas RuntimeInputs(RuntimeInputs&&); ~RuntimeInputs() = default; - size_t GetParameterSize() const; + void CopyFrom(const Grammar::ParsedRuntimeInputs& inputs); + + size_t GetConstructorParameterCount() const; + RuntimeInputs& operator=(const RuntimeInputs&) = default; RuntimeInputs& operator=(RuntimeInputs&&); }; @@ -116,7 +118,7 @@ namespace ScriptCanvas AZ::Data::Asset m_scriptAsset; RuntimeInputs m_runtimeInputs; Grammar::DebugSymbolMap m_debugMap; - DependencyReport m_dependencies; + OrderedDependencies m_dependencies; AZStd::sys_time_t m_parseDuration; AZStd::sys_time_t m_translationDuration; }; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.cpp index d277d15aa9..06ad79c21d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include #include @@ -73,7 +73,7 @@ namespace ScriptCanvas { return ConstructSetVariableNodeIdentifier(setVariableNode->GetId()); } - else if (auto functionNode = azrtti_cast(scriptCanvasNode)) + else if (auto functionNode = azrtti_cast(scriptCanvasNode)) { return ConstructFunctionNodeIdentifier(functionNode->GetAssetId()); } @@ -222,12 +222,22 @@ namespace ScriptCanvas { NodeTypeIdentifier resultHash = 0; - AZStd::hash_combine(resultHash, AZStd::hash()(azrtti_typeid())); + AZStd::hash_combine(resultHash, AZStd::hash()(azrtti_typeid())); AZStd::hash_combine(resultHash, AZStd::hash()(assetId.m_guid)); return resultHash; } + NodeTypeIdentifier NodeUtils::ConstructEmbeddedFunctionNodeIdentifier(const AZ::Data::AssetId& assetId) + { + NodeTypeIdentifier resultHash = 0; + + AZStd::hash_combine(resultHash, AZStd::hash()(azrtti_typeid())); + AZStd::hash_combine(resultHash, AZStd::hash()(assetId)); + + return resultHash; + } + NodeTypeIdentifier NodeUtils::ConstructAzEventIdentifier(AzEventIdentifier azEventIdentifier) { NodeTypeIdentifier resultHash = 0; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.h index 37e8a4f7d6..0f5b0f495d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/NodeUtils.h @@ -30,6 +30,7 @@ namespace ScriptCanvas // \todo examine if this is required // static NodeTypeIdentifier ConstructEBusEventReceiverOverloadedIdentifier(const ScriptCanvas::EBusBusId& ebusIdentifier, const EBusEventId& eventId); static NodeTypeIdentifier ConstructFunctionNodeIdentifier(const AZ::Data::AssetId& assetId); + static NodeTypeIdentifier ConstructEmbeddedFunctionNodeIdentifier(const AZ::Data::AssetId& assetId); static NodeTypeIdentifier ConstructScriptEventIdentifier(ScriptCanvas::EBusBusId busId); static NodeTypeIdentifier ConstructSendScriptEventIdentifier(ScriptCanvas::EBusBusId ebusIdentifier, const EBusEventId& eventId); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/VersionConverters.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/VersionConverters.cpp index ffb91ecd09..74746dd303 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/VersionConverters.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/VersionConverters.cpp @@ -368,7 +368,7 @@ namespace ScriptCanvas AZ::Data::Asset correctSubId(interfaceAssetId, asset.GetType(), asset.GetHint()); if (rootElement.AddElementWithData(context, "m_asset", correctSubId) == -1) { - AZ_Assert(false, "Unable to add m_asset data in FunctionNode version %u.", rootElement.GetVersion()); + AZ_Assert(false, "Unable to add m_asset data in FunctionCallNode version %u.", rootElement.GetVersion()); return false; } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.cpp index 3fe96731b5..f9c1c0c357 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.cpp @@ -45,14 +45,10 @@ namespace ScriptCanvas { switch (scopeType) { - case Scope::Local: - return "Local"; - case Scope::Input: - return "In"; - case Scope::Output: - return "Out"; - case Scope::InOut: - return "In/Out"; + case Scope::Graph: + return "Graph"; + case Scope::Function: + return "Function"; default: return "?"; } @@ -60,34 +56,22 @@ namespace ScriptCanvas Scope GetScopeFromLabel(const char* label) { - if (strcmp("In", label) == 0) + if (strcmp("Function", label) == 0) { - return Scope::Input; - } - else if (strcmp("Out", label) == 0) - { - return Scope::Output; - } - else if (strcmp("In/Out", label) == 0) - { - return Scope::InOut; + return Scope::Function; } - return Scope::Local; + return Scope::Graph; } const char* GetScopeToolTip(Scope scopeType) { switch (scopeType) { - case Scope::Local: - return "Variable is for use in the local scope only."; - case Scope::Input: - return "Variable will have an initial value set from an external source."; - case Scope::Output: - return "Variable will be used to return values to an external source."; - case Scope::InOut: - return "Variable will be used to receive and return values to an external source."; + case Scope::Graph: + return "Variable is accessible in the entire graph."; + case Scope::Function: + return "Variable is accessible only in the execution path of the function that defined it"; default: return "?"; } @@ -111,8 +95,27 @@ namespace ScriptCanvas } }; - static bool GraphVariableVersionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) + static bool GraphVariableVersionConverter([[maybe_unused]] AZ::SerializeContext& context, [[maybe_unused]] AZ::SerializeContext::DataElementNode& classElement) { + if (classElement.GetVersion() < 4) + { + enum class DeprecatedScope : AZ::u8 + { + Local = 0, + Input = 1, + Output = 2, + InOut = 3 + }; + + DeprecatedScope scope = DeprecatedScope::Local; + classElement.GetChildData(AZ_CRC_CE("Scope"), scope); + if (scope == DeprecatedScope::Input) + { + classElement.RemoveElementByName(AZ_CRC_CE("Scope")); + classElement.AddElementWithData(context, "InitialValueSource", VariableFlags::InitialValueSource::Component); + } + } + else if (classElement.GetVersion() < 3) { bool exposeAsInputField = false; @@ -121,26 +124,26 @@ namespace ScriptCanvas if (exposeAsInputField) { classElement.RemoveElementByName(AZ_CRC("Exposure", 0x398f29cd)); - classElement.AddElementWithData(context, "Scope", VariableFlags::Scope::Input); + classElement.AddElementWithData(context, "Scope", VariableFlags::Scope::Graph); } else { AZ::u8 exposureType = VariableFlags::Deprecated::Exposure::Exp_Local; classElement.GetChildData(AZ_CRC("Exposure", 0x398f29cd), exposureType); - VariableFlags::Scope scope = VariableFlags::Scope::Local; + VariableFlags::Scope scope = VariableFlags::Scope::Graph; if ((exposureType & VariableFlags::Deprecated::Exposure::Exp_InOut) == VariableFlags::Deprecated::Exposure::Exp_InOut) { - scope = VariableFlags::Scope::InOut; + scope = VariableFlags::Scope::Graph; } else if (exposureType & VariableFlags::Deprecated::Exposure::Exp_Input) { - scope = VariableFlags::Scope::Input; + scope = VariableFlags::Scope::Graph; } else if (exposureType & VariableFlags::Deprecated::Exposure::Exp_Output) { - scope = VariableFlags::Scope::Output; + scope = VariableFlags::Scope::Function; } classElement.AddElementWithData(context, "Scope", scope); @@ -153,6 +156,12 @@ namespace ScriptCanvas return true; } + const char* GraphVariable::s_InitialValueSourceNames[VariableFlags::InitialValueSource::COUNT] = + { + "From Graph", + "From Component" + }; + void GraphVariable::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) @@ -166,7 +175,7 @@ namespace ScriptCanvas serializeContext->Class() - ->Version(3, &GraphVariableVersionConverter) + ->Version(4, &GraphVariableVersionConverter) ->Field("Datum", &GraphVariable::m_datum) ->Field("InputControlVisibility", &GraphVariable::m_inputControlVisibility) ->Field("ExposureCategory", &GraphVariable::m_exposureCategory) @@ -176,29 +185,48 @@ namespace ScriptCanvas ->Attribute(AZ::Edit::Attributes::IdGeneratorFunction, &VariableId::MakeVariableId) ->Field("VariableName", &GraphVariable::m_variableName) ->Field("Scope", &GraphVariable::m_scope) + ->Field("InitialValueSource", &GraphVariable::m_InitialValueSource) ; if (auto editContext = serializeContext->GetEditContext()) { + auto propertyChoices = [] { + AZStd::vector< AZStd::pair> choices; + choices.emplace_back(AZStd::make_pair(VariableFlags::InitialValueSource::Graph, s_InitialValueSourceNames[0])); + choices.emplace_back(AZStd::make_pair(VariableFlags::InitialValueSource::Component, s_InitialValueSourceNames[1])); + return choices; + }; + editContext->Class("Variable", "Represents a Variable field within a Script Canvas Graph") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, &GraphVariable::GetVisibility) ->Attribute(AZ::Edit::Attributes::ChildNameLabelOverride, &GraphVariable::GetDisplayName) ->Attribute(AZ::Edit::Attributes::NameLabelOverride, &GraphVariable::GetDisplayName) ->Attribute(AZ::Edit::Attributes::DescriptionTextOverride, &GraphVariable::GetDescriptionOverride) - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &GraphVariable::m_scope, "Scope", "Controls the scope of this variable. i.e. If this is exposed as input to this script, or output from this script, or if the variable is just locally scoped.") + + ->DataElement(AZ::Edit::UIHandlers::ComboBox, &GraphVariable::m_InitialValueSource, "Initial Value Source", "Variables can get their values from within the graph or through component properties.") + ->Attribute(AZ::Edit::Attributes::GenericValueList, propertyChoices) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &GraphVariable::OnInitialValueSourceChanged) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) ->Attribute(AZ::Edit::Attributes::Visibility, &GraphVariable::GetInputControlVisibility) - ->Attribute(AZ::Edit::Attributes::GenericValueList, &GraphVariable::GetScopes) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &GraphVariable::OnScopeTypedChanged) + ->DataElement(AZ::Edit::UIHandlers::Default, &GraphVariable::m_datum, "Datum", "Datum within Script Canvas Graph") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::ChangeNotify, &GraphVariable::OnValueChanged) + + ->DataElement(AZ::Edit::UIHandlers::ComboBox, &GraphVariable::m_scope, "Scope", "Controls the scope of this variable. i.e. If this is exposed as input to this script, or output from this script, or if the variable is just locally scoped.") + ->Attribute(AZ::Edit::Attributes::Visibility, &GraphVariable::GetInputControlVisibility) + ->Attribute(AZ::Edit::Attributes::GenericValueList, &GraphVariable::GetScopes) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &GraphVariable::OnScopeTypedChanged) + ->DataElement(AZ::Edit::UIHandlers::Default, &GraphVariable::m_networkProperties, "Network Properties", "Enables whether or not this value should be network synchronized") ->Attribute(AZ::Edit::Attributes::Visibility, &GraphVariable::GetNetworkSettingsVisibility) + ->DataElement(AZ::Edit::UIHandlers::Default, &GraphVariable::m_sortPriority, "Display Order", "Allows for customizable display order. -1 implies it will be at the end of the list.") ->Attribute(AZ::Edit::Attributes::Visibility, &GraphVariable::GetInputControlVisibility) ->Attribute(AZ::Edit::Attributes::ChangeNotify, &GraphVariable::OnSortPriorityChanged) ->Attribute(AZ::Edit::Attributes::Min, -1) + ; } } @@ -222,34 +250,37 @@ namespace ScriptCanvas GraphVariable::GraphVariable() : m_sortPriority(-1) - , m_scope(VariableFlags::Scope::Local) + , m_scope(VariableFlags::Scope::Graph) , m_inputControlVisibility(AZ::Edit::PropertyVisibility::Show) , m_visibility(AZ::Edit::PropertyVisibility::ShowChildrenOnly) , m_signalValueChanges(false) , m_variableId(VariableId::MakeVariableId()) + , m_InitialValueSource(VariableFlags::InitialValueSource::Graph) { } GraphVariable::GraphVariable(const Datum& datum) : m_sortPriority(-1) - , m_scope(VariableFlags::Scope::Local) + , m_scope(VariableFlags::Scope::Graph) , m_inputControlVisibility(AZ::Edit::PropertyVisibility::Show) , m_visibility(AZ::Edit::PropertyVisibility::ShowChildrenOnly) , m_signalValueChanges(false) , m_variableId(VariableId::MakeVariableId()) , m_datum(datum) + , m_InitialValueSource(VariableFlags::InitialValueSource::Graph) { } GraphVariable::GraphVariable(Datum&& datum) : m_sortPriority(-1) - , m_scope(VariableFlags::Scope::Local) + , m_scope(VariableFlags::Scope::Graph) , m_inputControlVisibility(AZ::Edit::PropertyVisibility::Show) , m_visibility(AZ::Edit::PropertyVisibility::ShowChildrenOnly) , m_signalValueChanges(false) , m_variableId(VariableId::MakeVariableId()) , m_datum(AZStd::move(datum)) + , m_InitialValueSource(VariableFlags::InitialValueSource::Graph) { } @@ -268,11 +299,7 @@ namespace ScriptCanvas if (valuePair.m_varDatum.ExposeAsComponentInput()) { - SetScope(VariableFlags::Scope::Input); - } - else - { - SetScope(VariableFlags::Scope::Local); + SetScope(VariableFlags::Scope::Graph); } m_inputControlVisibility = valuePair.m_varDatum.GetInputControlVisibility(); @@ -324,9 +351,9 @@ namespace ScriptCanvas datumView.ConfigureView((*this)); } - bool GraphVariable::IsExposedAsComponentInput() const + bool GraphVariable::IsComponentProperty() const { - return IsInScope(VariableFlags::Scope::Input); + return m_scope == VariableFlags::Scope::Graph && m_InitialValueSource == ScriptCanvas::VariableFlags::InitialValueSource::Component; } void GraphVariable::SetVariableName(AZStd::string_view variableName) @@ -413,32 +440,6 @@ namespace ScriptCanvas m_visibility = visibility; } - void GraphVariable::RemoveScope(VariableFlags::Scope scopeType) - { - if (IsInScope(scopeType)) - { - if (m_scope == VariableFlags::Scope::InOut) - { - if (scopeType == VariableFlags::Scope::Input) - { - m_scope = VariableFlags::Scope::Output; - } - else if (scopeType == VariableFlags::Scope::Output) - { - m_scope = VariableFlags::Scope::Input; - } - else - { - m_scope = VariableFlags::Scope::Local; - } - } - else - { - m_scope = VariableFlags::Scope::Local; - } - } - } - void GraphVariable::SetScope(VariableFlags::Scope scopeType) { if (m_scope != scopeType) @@ -457,23 +458,14 @@ namespace ScriptCanvas { switch (scopeType) { - // All variables are local scoped - case VariableFlags::Scope::Local: + case VariableFlags::Scope::Graph: + return m_scope == VariableFlags::Scope::Graph; + // All graph variables are in function local scope + case VariableFlags::Scope::Function: return true; - case VariableFlags::Scope::Input: - return m_scope == VariableFlags::Scope::Input || m_scope == VariableFlags::Scope::InOut; - case VariableFlags::Scope::Output: - return m_scope == VariableFlags::Scope::Output || m_scope == VariableFlags::Scope::InOut; - case VariableFlags::Scope::InOut: - return m_scope == VariableFlags::Scope::InOut; - default: - return false; } - } - bool GraphVariable::IsLocalVariableOnly() const - { - return m_scope == VariableFlags::Scope::Local; + return false; } void GraphVariable::GenerateNewId() @@ -506,6 +498,25 @@ namespace ScriptCanvas return GraphScopedVariableId(m_scriptCanvasId, m_variableId); } + AZ::u32 GraphVariable::SetInitialValueSource(VariableFlags::InitialValueSource InitialValueSource) + { + m_InitialValueSource = InitialValueSource; + return OnInitialValueSourceChanged(); + } + + AZ::u32 GraphVariable::SetInitialValueSourceFromName(AZStd::string_view name) + { + for (int i = 0; i < VariableFlags::InitialValueSource::COUNT; ++i) + { + if (name.compare(s_InitialValueSourceNames[i]) == 0) + { + return SetInitialValueSource(static_cast(i)); + } + } + + return 0; + } + void GraphVariable::OnDatumEdited([[maybe_unused]] const Datum* datum) { VariableNotificationBus::Event(GetGraphScopedId(), &VariableNotifications::OnVariableValueChanged); @@ -514,16 +525,7 @@ namespace ScriptCanvas AZStd::vector> GraphVariable::GetScopes() const { AZStd::vector< AZStd::pair> scopes; - - scopes.emplace_back(AZStd::make_pair(VariableFlags::Scope::Local, VariableFlags::GetScopeDisplayLabel(VariableFlags::Scope::Local))); - scopes.emplace_back(AZStd::make_pair(VariableFlags::Scope::Input, VariableFlags::GetScopeDisplayLabel(VariableFlags::Scope::Input))); - - if (IsInFunction()) - { - scopes.emplace_back(AZStd::make_pair(VariableFlags::Scope::Output, VariableFlags::GetScopeDisplayLabel(VariableFlags::Scope::Output))); - scopes.emplace_back(AZStd::make_pair(VariableFlags::Scope::InOut, VariableFlags::GetScopeDisplayLabel(VariableFlags::Scope::InOut))); - } - + scopes.emplace_back(AZStd::make_pair(m_scope, VariableFlags::GetScopeDisplayLabel(m_scope))); return scopes; } @@ -540,6 +542,12 @@ namespace ScriptCanvas return assetType == azrtti_typeid(); } + AZ::u32 GraphVariable::OnInitialValueSourceChanged() + { + VariableNotificationBus::Event(GetGraphScopedId(), &VariableNotifications::OnVariableInitialValueSourceChanged); + return AZ::Edit::PropertyRefreshLevels::EntireTree; + } + void GraphVariable::OnScopeTypedChanged() { VariableNotificationBus::Event(GetGraphScopedId(), &VariableNotifications::OnVariableScopeChanged); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.h index 2c71e57a5a..9b5e5cc9d1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariable.h @@ -52,16 +52,19 @@ namespace ScriptCanvas enum class Scope : AZ::u8 { - Local = 0, - Input = 1, - Output = 2, - InOut = 3 + Graph = 0, + Function = 1, }; - const char* GetScopeDisplayLabel(Scope scopeType); + enum InitialValueSource : AZ::u8 + { + Graph, + Component, + COUNT + }; + const char* GetScopeDisplayLabel(Scope scopeType); Scope GetScopeFromLabel(const char* label); - const char* GetScopeToolTip(Scope scopeType); } @@ -126,9 +129,9 @@ namespace ScriptCanvas const Datum* GetDatum() const; - bool IsExposedAsComponentInput() const; + bool IsComponentProperty() const; - void ConfigureDatumView(ModifiableDatumView& accessController); + void ConfigureDatumView(ModifiableDatumView& accessController); void SetVariableName(AZStd::string_view displayName); AZStd::string_view GetVariableName() const; @@ -146,12 +149,10 @@ namespace ScriptCanvas AZ::Crc32 GetVisibility() const; void SetVisibility(AZ::Crc32 visibility); - void RemoveScope(VariableFlags::Scope scopeType); void SetScope(VariableFlags::Scope scopeType); VariableFlags::Scope GetScope() const; bool IsInScope(VariableFlags::Scope scopeType) const; - bool IsLocalVariableOnly() const; void SetExposureCategory(AZStd::string_view exposureCategory) { m_exposureCategory = exposureCategory; } AZStd::string_view GetExposureCategory() const { return m_exposureCategory; } @@ -165,6 +166,13 @@ namespace ScriptCanvas void SetOwningScriptCanvasId(const ScriptCanvasId& scriptCanvasId); GraphScopedVariableId GetGraphScopedId() const; + AZStd::string_view GetInitialValueSourceName() const { return s_InitialValueSourceNames[m_InitialValueSource]; } + VariableFlags::InitialValueSource GetInitialValueSource() const { return m_InitialValueSource; } + AZ::u32 SetInitialValueSource(VariableFlags::InitialValueSource InitialValueSource); + + AZ::u32 SetInitialValueSourceFromName(AZStd::string_view name); + + // Editor Callbacks void OnDatumEdited(const Datum* datum) override; AZStd::vector> GetScopes() const; @@ -172,11 +180,14 @@ namespace ScriptCanvas int GetSortPriority() const; + static const char* s_InitialValueSourceNames[VariableFlags::InitialValueSource::COUNT]; + private: bool IsInFunction() const; void OnScopeTypedChanged(); + AZ::u32 OnInitialValueSourceChanged(); void OnSortPriorityChanged(); void OnValueChanged(); @@ -186,6 +197,7 @@ namespace ScriptCanvas int m_sortPriority; VariableFlags::Scope m_scope; + VariableFlags::InitialValueSource m_InitialValueSource; // Still need to make this a proper bitmask, once we have support for multiple // input/output attributes. For now, just going to assume it's only the single flag(which is is). @@ -205,6 +217,7 @@ namespace ScriptCanvas Datum m_datum; ReplicaNetworkProperties m_networkProperties; + }; using GraphVariableMapping = AZStd::unordered_map< VariableId, GraphVariable >; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableManagerComponent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableManagerComponent.cpp index 848255f6ad..47f76af4ee 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableManagerComponent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableManagerComponent.cpp @@ -224,6 +224,7 @@ namespace ScriptCanvas return AZ::Success(newId); } + // #functions2 slot<->variable add this to the graph, using the old datum AZ::Outcome GraphVariableManagerComponent::AddVariable(AZStd::string_view name, const Datum& value) { if (FindVariable(name)) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableBus.h index 2c04beecc7..7c486ff5c7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableBus.h @@ -237,11 +237,13 @@ namespace ScriptCanvas // Invoked after a variable is renamed virtual void OnVariableRenamed(AZStd::string_view /*newVariableName*/) {} - virtual void OnVariableScopeChanged() {}; + virtual void OnVariableScopeChanged() {} - virtual void OnVariablePriorityChanged() {}; + virtual void OnVariableInitialValueSourceChanged() {} - virtual void OnVariableValueChanged() {}; + virtual void OnVariablePriorityChanged() {} + + virtual void OnVariableValueChanged() {} }; using VariableNotificationBus = AZ::EBus; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.cpp index 78dc8ca279..53200f79c1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.cpp @@ -211,9 +211,7 @@ namespace ScriptCanvas AZStd::list editableVariableConfigurationList; for (auto varNameValuePair : varNameValueVariableList) { - Datum defaultValue = varNameValuePair.m_varDatum.GetData(); - - editableVariableConfigurationList.push_back({ GraphVariable(AZStd::move(varNameValuePair)), defaultValue }); + editableVariableConfigurationList.push_back({ GraphVariable(AZStd::move(varNameValuePair)), }); } rootElementNode.RemoveElementByName(AZ_CRC("m_properties", 0x4227dbda)); @@ -263,12 +261,8 @@ namespace ScriptCanvas m_variables.emplace_back(); EditableVariableConfiguration& newVarConfig = m_variables.back(); - newVarConfig.m_graphVariable.DeepCopy(graphVariable); - newVarConfig.m_defaultValue.DeepCopyDatum((*graphVariable.GetDatum())); - newVarConfig.m_graphVariable.SetVariableName(varName); - return AZ::Success(); } @@ -340,18 +334,23 @@ namespace ScriptCanvas if (rootElementNode.GetVersion() < Version::VariableDatumSimplification) { Deprecated::VariableNameValuePair varNameValuePair; - if (!rootElementNode.GetChildData(AZ_CRC("m_variableNameValuePair", 0x89adc9d0), varNameValuePair)) + if (!rootElementNode.GetChildData(AZ_CRC_CE("m_variableNameValuePair"), varNameValuePair)) { return false; } - rootElementNode.RemoveElementByName(AZ_CRC("m_variableNameValuePair", 0x89adc9d0)); + rootElementNode.RemoveElementByName(AZ_CRC_CE("m_variableNameValuePair")); GraphVariable variable(AZStd::move(varNameValuePair)); rootElementNode.AddElementWithData(serializeContext, "GraphVariable", variable); } + if (rootElementNode.GetVersion() < Version::RemoveUnusedDefaultValue) + { + rootElementNode.RemoveElementByName(AZ_CRC_CE("m_defaultValue")); + } + return true; } @@ -362,7 +361,6 @@ namespace ScriptCanvas serializeContext->Class() ->Version(Version::Current, &EditableVariableConfiguration::VersionConverter) ->Field("GraphVariable", &EditableVariableConfiguration::m_graphVariable) - ->Field("m_defaultValue", &EditableVariableConfiguration::m_defaultValue) ; if (auto editContext = serializeContext->GetEditContext()) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.h index 49a446ba01..eb988f75a6 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableData.h @@ -42,8 +42,8 @@ namespace ScriptCanvas VariableData(VariableData&&); VariableData& operator=(VariableData&&); - AZ_INLINE GraphVariableMapping& GetVariables() { return m_variableMap; } - AZ_INLINE const GraphVariableMapping& GetVariables() const { return m_variableMap; } + inline GraphVariableMapping& GetVariables() { return m_variableMap; } + inline const GraphVariableMapping& GetVariables() const { return m_variableMap; } AZ::Outcome AddVariable(AZStd::string_view varName, const GraphVariable& graphVariable); @@ -75,7 +75,7 @@ namespace ScriptCanvas { InitialVersion, VariableDatumSimplification, - + RemoveUnusedDefaultValue, // Should always be last Current }; @@ -88,7 +88,6 @@ namespace ScriptCanvas static void Reflect(AZ::ReflectContext* context); GraphVariable m_graphVariable; - Datum m_defaultValue; }; //! Variable Data structure which uses the VariableNameValuePair struct to provide editor specific UI visualization diff --git a/Gems/ScriptCanvas/Code/scriptcanvasgem_common_files.cmake b/Gems/ScriptCanvas/Code/scriptcanvasgem_common_files.cmake index 1d06fdc071..871d8d4c5d 100644 --- a/Gems/ScriptCanvas/Code/scriptcanvasgem_common_files.cmake +++ b/Gems/ScriptCanvas/Code/scriptcanvasgem_common_files.cmake @@ -120,8 +120,8 @@ set(FILES Include/ScriptCanvas/PerformanceTracker.h Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja Include/ScriptCanvas/AutoGen/ScriptCanvas_Nodeable_Macros.jinja - Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja - Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja + Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja + Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Source.jinja Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja Include/ScriptCanvas/CodeGen/NodeableCodegen.h @@ -206,6 +206,10 @@ set(FILES Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp Include/ScriptCanvas/Grammar/DebugMap.h Include/ScriptCanvas/Grammar/DebugMap.cpp + Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.h + Include/ScriptCanvas/Grammar/ExecutionTraversalListeners.cpp + Include/ScriptCanvas/Grammar/FunctionsLegacySupport.h + Include/ScriptCanvas/Grammar/FunctionsLegacySupport.cpp Include/ScriptCanvas/Grammar/GrammarContext.h Include/ScriptCanvas/Grammar/GrammarContext.cpp Include/ScriptCanvas/Grammar/GrammarContextBus.h @@ -216,6 +220,7 @@ set(FILES Include/ScriptCanvas/Grammar/Primitives.h Include/ScriptCanvas/Grammar/Primitives.cpp Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h + Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp Include/ScriptCanvas/Grammar/PrimitivesExecution.h Include/ScriptCanvas/Grammar/SymbolNames.h @@ -235,20 +240,20 @@ set(FILES Include/ScriptCanvas/Internal/Nodeables/BaseTimer.ScriptCanvasNodeable.xml Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.cpp Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.h - Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasNode.xml + Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasGrammar.xml Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.cpp Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.h - Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasNode.xml + Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasGrammar.xml Include/ScriptCanvas/Internal/Nodes/StringFormatted.cpp Include/ScriptCanvas/Internal/Nodes/StringFormatted.h - Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasNode.xml + Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp Include/ScriptCanvas/Grammar/AbstractCodeModel.h Include/ScriptCanvas/Libraries/Libraries.h Include/ScriptCanvas/Libraries/Libraries.cpp Include/ScriptCanvas/Libraries/Core/AzEventHandler.cpp Include/ScriptCanvas/Libraries/Core/AzEventHandler.h - Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/BehaviorContextObjectNode.cpp Include/ScriptCanvas/Libraries/Core/BehaviorContextObjectNode.h Include/ScriptCanvas/Libraries/Core/BinaryOperator.cpp @@ -258,10 +263,10 @@ set(FILES Include/ScriptCanvas/Libraries/Core/ContainerTypeReflection.h Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h - Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/ExtractProperty.cpp Include/ScriptCanvas/Libraries/Core/ExtractProperty.h - Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.h Include/ScriptCanvas/Libraries/Core/EventHandlerTranslationUtility.cpp Include/ScriptCanvas/Libraries/Core/Error.cpp @@ -270,17 +275,19 @@ set(FILES Include/ScriptCanvas/Libraries/Core/ErrorHandler.h Include/ScriptCanvas/Libraries/Core/ForEach.cpp Include/ScriptCanvas/Libraries/Core/ForEach.h - Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/FunctionBus.h - Include/ScriptCanvas/Libraries/Core/FunctionNode.cpp - Include/ScriptCanvas/Libraries/Core/FunctionNode.h - Include/ScriptCanvas/Libraries/Core/FunctionNode.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/FunctionCallNode.cpp + Include/ScriptCanvas/Libraries/Core/FunctionCallNode.h + Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml + Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.h + Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.cpp Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.cpp Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.h - Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/GetVariable.cpp Include/ScriptCanvas/Libraries/Core/GetVariable.h - Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/Method.cpp Include/ScriptCanvas/Libraries/Core/Method.h Include/ScriptCanvas/Libraries/Core/MethodOverloaded.cpp @@ -289,28 +296,28 @@ set(FILES Include/ScriptCanvas/Libraries/Core/MethodUtility.h Include/ScriptCanvas/Libraries/Core/Nodeling.cpp Include/ScriptCanvas/Libraries/Core/Nodeling.h - Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h - Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/Repeater.cpp Include/ScriptCanvas/Libraries/Core/Repeater.h - Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.h Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.cpp Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml Include/ScriptCanvas/Libraries/Core/ScriptEventBase.cpp Include/ScriptCanvas/Libraries/Core/ScriptEventBase.h - Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/SendScriptEvent.cpp Include/ScriptCanvas/Libraries/Core/SendScriptEvent.h - Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/SetVariable.cpp Include/ScriptCanvas/Libraries/Core/SetVariable.h - Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/Start.cpp Include/ScriptCanvas/Libraries/Core/Start.h - Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Core/String.h Include/ScriptCanvas/Libraries/Core/UnaryOperator.cpp Include/ScriptCanvas/Libraries/Core/UnaryOperator.h @@ -322,54 +329,54 @@ set(FILES Include/ScriptCanvas/Libraries/Entity/EntityRef.h Include/ScriptCanvas/Libraries/Entity/Rotate.cpp Include/ScriptCanvas/Libraries/Entity/Rotate.h - Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Entity/RotateMethod.cpp Include/ScriptCanvas/Libraries/Entity/RotateMethod.h Include/ScriptCanvas/Libraries/Logic/And.h Include/ScriptCanvas/Libraries/Logic/Any.cpp Include/ScriptCanvas/Libraries/Logic/Any.h - Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Boolean.h Include/ScriptCanvas/Libraries/Logic/Break.h Include/ScriptCanvas/Libraries/Logic/Break.cpp - Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Cycle.cpp Include/ScriptCanvas/Libraries/Logic/Cycle.h - Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Gate.cpp Include/ScriptCanvas/Libraries/Logic/Gate.h - Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Indexer.cpp Include/ScriptCanvas/Libraries/Logic/Indexer.h - Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/IsNull.cpp Include/ScriptCanvas/Libraries/Logic/IsNull.h - Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Logic.cpp Include/ScriptCanvas/Libraries/Logic/Logic.h Include/ScriptCanvas/Libraries/Logic/Multiplexer.cpp Include/ScriptCanvas/Libraries/Logic/Multiplexer.h - Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Not.h Include/ScriptCanvas/Libraries/Logic/Once.cpp Include/ScriptCanvas/Libraries/Logic/Once.h - Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Or.h Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.cpp Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h - Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/Sequencer.cpp Include/ScriptCanvas/Libraries/Logic/Sequencer.h - Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.cpp Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h - Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.cpp Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h - Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Logic/While.cpp Include/ScriptCanvas/Libraries/Logic/While.h - Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Math/AABBNode.h Include/ScriptCanvas/Libraries/Math/AABBNodes.h Include/ScriptCanvas/Libraries/Math/ColorNode.h @@ -381,7 +388,7 @@ set(FILES Include/ScriptCanvas/Libraries/Math/Math.h Include/ScriptCanvas/Libraries/Math/MathExpression.cpp Include/ScriptCanvas/Libraries/Math/MathExpression.h - Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Math/MathNodeUtilities.cpp Include/ScriptCanvas/Libraries/Math/MathNodeUtilities.h Include/ScriptCanvas/Libraries/Math/MathGenerics.h @@ -398,7 +405,7 @@ set(FILES Include/ScriptCanvas/Libraries/Math/PlaneNodes.h Include/ScriptCanvas/Libraries/Math/Random.cpp Include/ScriptCanvas/Libraries/Math/Random.h - Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Math/Rotation.h Include/ScriptCanvas/Libraries/Math/RotationNodes.h Include/ScriptCanvas/Libraries/Math/Subtract.h @@ -422,19 +429,19 @@ set(FILES Include/ScriptCanvas/Libraries/Time/Time.cpp Include/ScriptCanvas/Libraries/Time/Countdown.cpp Include/ScriptCanvas/Libraries/Time/Countdown.h - Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Time/DelayNodeable.h Include/ScriptCanvas/Libraries/Time/DelayNodeable.cpp Include/ScriptCanvas/Libraries/Time/DelayNodeable.ScriptCanvasNodeable.xml Include/ScriptCanvas/Libraries/Time/Duration.cpp Include/ScriptCanvas/Libraries/Time/Duration.h - Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Time/HeartBeat.cpp Include/ScriptCanvas/Libraries/Time/HeartBeat.h - Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Time/Timer.cpp Include/ScriptCanvas/Libraries/Time/Timer.h - Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Time/TimeDelayNodeable.h Include/ScriptCanvas/Libraries/Time/TimeDelayNodeable.cpp Include/ScriptCanvas/Libraries/Time/TimeDelayNodeable.ScriptCanvasNodeable.xml @@ -449,16 +456,16 @@ set(FILES Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml Include/ScriptCanvas/Libraries/String/Contains.cpp Include/ScriptCanvas/Libraries/String/Contains.h - Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/String/Format.cpp Include/ScriptCanvas/Libraries/String/Format.h - Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/String/Print.cpp Include/ScriptCanvas/Libraries/String/Print.h - Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/String/Replace.cpp Include/ScriptCanvas/Libraries/String/Replace.h - Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/String/String.h Include/ScriptCanvas/Libraries/String/String.cpp Include/ScriptCanvas/Libraries/String/StringMethods.h @@ -466,43 +473,43 @@ set(FILES Include/ScriptCanvas/Libraries/String/StringGenerics.h Include/ScriptCanvas/Libraries/String/Utilities.cpp Include/ScriptCanvas/Libraries/String/Utilities.h - Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.cpp Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.h - Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.cpp Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.h - Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.cpp Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.h - Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.cpp Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.h - Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.cpp Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.h - Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBus.h Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusMacros.h Include/ScriptCanvas/Libraries/UnitTesting/UnitTesting.cpp @@ -519,58 +526,58 @@ set(FILES Include/ScriptCanvas/Libraries/Operators/Operators.h Include/ScriptCanvas/Libraries/Operators/Operator.cpp Include/ScriptCanvas/Libraries/Operators/Operator.h - Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.cpp Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.h - Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.h - Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasNode.xml + Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasGrammar.xml Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerpNodeable.h Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerpNodeable.cpp Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerpNodeableNode.h @@ -612,6 +619,9 @@ set(FILES ) set(SKIP_UNITY_BUILD_INCLUSION_FILES - Include/ScriptCanvas/Libraries/Core/FunctionNode.cpp - Include/ScriptCanvas/Libraries/Core/FunctionNode.h + Include/ScriptCanvas/Libraries/Core/FunctionCallNode.cpp + Include/ScriptCanvas/Libraries/Core/FunctionCallNode.h + Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.h + Include/ScriptCanvas/Libraries/Core/FunctionCallNodeIsOutOfDate.cpp + ) diff --git a/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake b/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake index 2a8c673450..2f1555af3d 100644 --- a/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake +++ b/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake @@ -93,6 +93,8 @@ set(FILES Editor/GraphCanvas/Components/NodeDescriptors/EntityRefNodeDescriptorComponent.h Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.cpp Editor/GraphCanvas/Components/NodeDescriptors/FunctionNodeDescriptorComponent.h + Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.h + Editor/GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.cpp Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.cpp Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.h Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.cpp @@ -255,6 +257,9 @@ set(FILES Editor/View/Widgets/VariablePanel/VariableDockWidget.ui Editor/View/Widgets/VariablePanel/VariablePaletteTableView.cpp Editor/View/Widgets/VariablePanel/VariablePaletteTableView.h + Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp + Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.h + Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.ui Editor/View/Widgets/UnitTestPanel/UnitTestDockWidget.cpp Editor/View/Widgets/UnitTestPanel/UnitTestDockWidget.h Editor/View/Widgets/UnitTestPanel/UnitTestDockWidget.ui diff --git a/Gems/ScriptCanvas/gem.json b/Gems/ScriptCanvas/gem.json index cae50f25e0..4c44350cc7 100644 --- a/Gems/ScriptCanvas/gem.json +++ b/Gems/ScriptCanvas/gem.json @@ -1,8 +1,8 @@ { - "gem_name": "ScriptCanvasGem", + "gem_name": "ScriptCanvas", "GemFormatVersion": 3, "Uuid": "869a0d0ec11a45c299917d45c81555e6", - "Name": "ScriptCanvasGem", + "Name": "ScriptCanvas", "DisplayName": "Script Canvas", "Version": "0.1.0", "LinkType": "DynamicStatic", diff --git a/Gems/ScriptCanvasDeveloper/gem.json b/Gems/ScriptCanvasDeveloper/gem.json index 7a9c6aa0d4..05e7391dcc 100644 --- a/Gems/ScriptCanvasDeveloper/gem.json +++ b/Gems/ScriptCanvasDeveloper/gem.json @@ -11,6 +11,11 @@ "Tags": ["Scripting", "Editor"], "IconPath": "preview.png", "Dependencies" : [ + { + "Uuid" : "bab8807a1bc646b3909f3cc200ffeedf", + "VersionConstraints" : [">=0.1.0"], + "_comment" : "ImGui" + }, { "Uuid" : "869a0d0ec11a45c299917d45c81555e6", "VersionConstraints" : [">=0.1.0"], diff --git a/Gems/ScriptCanvasDiagnosticLibrary/Code/CMakeLists.txt b/Gems/ScriptCanvasDiagnosticLibrary/Code/CMakeLists.txt index 9c2ca7282a..4593768464 100644 --- a/Gems/ScriptCanvasDiagnosticLibrary/Code/CMakeLists.txt +++ b/Gems/ScriptCanvasDiagnosticLibrary/Code/CMakeLists.txt @@ -27,8 +27,10 @@ ly_add_target( Gem::ScriptCanvas Legacy::CryCommon AUTOGEN_RULES - *.ScriptCanvasNode.xml,ScriptCanvasNode_Header.jinja,$path/$fileprefix.generated.h - *.ScriptCanvasNode.xml,ScriptCanvasNode_Source.jinja,$path/$fileprefix.generated.cpp + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Header.jinja,$path/$fileprefix.generated.h + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Source.jinja,$path/$fileprefix.generated.cpp + *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Header.jinja,$path/$fileprefix.generated.h + *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Source.jinja,$path/$fileprefix.generated.cpp ) ly_add_target( diff --git a/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/DrawText.ScriptCanvasNode.xml b/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/DrawText.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/ScriptCanvasDiagnosticLibrary/Code/Source/DrawText.ScriptCanvasNode.xml rename to Gems/ScriptCanvasDiagnosticLibrary/Code/Source/DrawText.ScriptCanvasGrammar.xml diff --git a/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_autogen_files.cmake b/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_autogen_files.cmake index a9f2829fa4..90cda4aa60 100644 --- a/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_autogen_files.cmake +++ b/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_autogen_files.cmake @@ -10,6 +10,10 @@ # set(FILES - ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja - ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Source.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Nodeable_Macros.jinja ) diff --git a/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_common_files.cmake b/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_common_files.cmake index d1be8fba06..af3d823a02 100644 --- a/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_common_files.cmake +++ b/Gems/ScriptCanvasDiagnosticLibrary/Code/scriptcanvasdiagnosticlibrary_common_files.cmake @@ -20,5 +20,5 @@ set(FILES Source/DebugLibraryDefinition.cpp Source/DrawText.h Source/DrawText.cpp - Source/DrawText.ScriptCanvasNode.xml + Source/DrawText.ScriptCanvasGrammar.xml ) diff --git a/Gems/ScriptCanvasPhysics/Code/CMakeLists.txt b/Gems/ScriptCanvasPhysics/Code/CMakeLists.txt index 8d6668b816..23ee6937c7 100644 --- a/Gems/ScriptCanvasPhysics/Code/CMakeLists.txt +++ b/Gems/ScriptCanvasPhysics/Code/CMakeLists.txt @@ -12,7 +12,6 @@ ly_add_target( NAME ScriptCanvasPhysics.Static STATIC NAMESPACE Gem - OUTPUT_NAME Gem.ScriptCanvasPhysics.Static FILES_CMAKE scriptcanvas_physics_files.cmake INCLUDE_DIRECTORIES diff --git a/Gems/ScriptCanvasPhysics/Code/Source/WorldNodes.h b/Gems/ScriptCanvasPhysics/Code/Source/WorldNodes.h index 1aeba4a9e4..5238c52e0e 100644 --- a/Gems/ScriptCanvasPhysics/Code/Source/WorldNodes.h +++ b/Gems/ScriptCanvasPhysics/Code/Source/WorldNodes.h @@ -14,11 +14,14 @@ #include #include -#include #include +#include #include #include +#include +#include #include +#include namespace ScriptCanvasPhysics { @@ -69,13 +72,13 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_start = start; request.m_direction = direction.GetNormalized(); request.m_distance = distance; - request.m_filterCallback = [ignore](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) + request.m_filterCallback = [ignore](const AzPhysics::SimulatedBody* body, [[maybe_unused]] const Physics::Shape* shape) { - return body->GetEntityId() != ignore ? Physics::QueryHitType::Block : Physics::QueryHitType::None; + return body->GetEntityId() != ignore ? AzPhysics::SceneQuery::QueryHitType::Block : AzPhysics::SceneQuery::QueryHitType::None; }; if (!collisionGroup.empty()) @@ -83,20 +86,27 @@ namespace ScriptCanvasPhysics request.m_collisionGroup = AzPhysics::CollisionGroup(collisionGroup); } - Physics::RayCastHit hit; - Physics::WorldRequestBus::BroadcastResult(hit, &Physics::World::RayCast, request); - - AZ::EntityId id; - AZ::Crc32 surfaceType; - if (hit.m_body) + AzPhysics::SceneQueryHits result; + if (auto* sceneInterface = AZ::Interface::Get()) { - id = hit.m_body->GetEntityId(); + if (AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneHandle != AzPhysics::InvalidSceneHandle) + { + result = sceneInterface->QueryScene(sceneHandle, &request); + } } - if (hit.m_material) + if (result) { - surfaceType = hit.m_material->GetSurfaceType(); + AZ::Crc32 surfaceType; + if (result.m_hits[0].m_material) + { + surfaceType = result.m_hits[0].m_material->GetSurfaceType(); + } + return AZStd::make_tuple(result.m_hits[0].IsValid(), result.m_hits[0].m_position, + result.m_hits[0].m_normal, result.m_hits[0].m_distance, + result.m_hits[0].m_entityId, surfaceType); } - return AZStd::make_tuple(hit.m_body != nullptr, hit.m_position, hit.m_normal, hit.m_distance, id, surfaceType); + return AZStd::make_tuple(false, AZ::Vector3::CreateZero(), AZ::Vector3::CreateZero(), 0.0f, AZ::EntityId(), AZ::Crc32()); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(RayCastWorldSpaceWithGroup, k_categoryName, @@ -123,33 +133,8 @@ namespace ScriptCanvasPhysics AZ::Transform worldSpaceTransform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(worldSpaceTransform, fromEntityId, &AZ::TransformInterface::GetWorldTM); - Physics::RayCastRequest request; - request.m_start = worldSpaceTransform.GetTranslation(); - request.m_direction = worldSpaceTransform.TransformVector(direction.GetNormalized()); - request.m_distance = distance; - request.m_filterCallback = [ignore](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) - { - return body->GetEntityId() != ignore ? Physics::QueryHitType::Block : Physics::QueryHitType::None; - }; - if (!collisionGroup.empty()) - { - request.m_collisionGroup = AzPhysics::CollisionGroup(collisionGroup); - } - - Physics::RayCastHit hit; - Physics::WorldRequestBus::BroadcastResult(hit, &Physics::World::RayCast, request); - - AZ::EntityId id; - AZ::Crc32 surfaceType; - if (hit.m_body) - { - id = hit.m_body->GetEntityId(); - } - if (hit.m_material) - { - surfaceType = hit.m_material->GetSurfaceType(); - } - return AZStd::make_tuple(hit.m_body != nullptr, hit.m_position, hit.m_normal, hit.m_distance, id, surfaceType); + return RayCastWorldSpaceWithGroup(worldSpaceTransform.GetTranslation(), worldSpaceTransform.TransformVector(direction.GetNormalized()), + distance, collisionGroup, ignore); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(RayCastLocalSpaceWithGroup, k_categoryName, @@ -167,7 +152,7 @@ namespace ScriptCanvasPhysics "EntityId", "Surface"); - AZ_INLINE AZStd::vector RayCastMultipleLocalSpaceWithGroup(const AZ::EntityId& fromEntityId, + AZ_INLINE AZStd::vector RayCastMultipleLocalSpaceWithGroup(const AZ::EntityId& fromEntityId, const AZ::Vector3& direction, float distance, const AZStd::string& collisionGroup, @@ -176,22 +161,29 @@ namespace ScriptCanvasPhysics AZ::Transform worldSpaceTransform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(worldSpaceTransform, fromEntityId, &AZ::TransformInterface::GetWorldTM); - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_start = worldSpaceTransform.GetTranslation(); request.m_direction = worldSpaceTransform.TransformVector(direction.GetNormalized()); request.m_distance = distance; - request.m_filterCallback = [ignore](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) + request.m_filterCallback = [ignore](const AzPhysics::SimulatedBody* body, [[maybe_unused]] const Physics::Shape* shape) { - return body->GetEntityId() != ignore ? Physics::QueryHitType::Touch : Physics::QueryHitType::None; + return body->GetEntityId() != ignore ? AzPhysics::SceneQuery::QueryHitType::Touch : AzPhysics::SceneQuery::QueryHitType::None; }; if (!collisionGroup.empty()) { request.m_collisionGroup = AzPhysics::CollisionGroup(collisionGroup); } - AZStd::vector hits; - Physics::WorldRequestBus::BroadcastResult(hits, &Physics::World::RayCastMultiple, request); - return hits; + AzPhysics::SceneQueryHits result; + if (auto* sceneInterface = AZ::Interface::Get()) + { + if (AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneHandle != AzPhysics::InvalidSceneHandle) + { + result = sceneInterface->QueryScene(sceneHandle, &request); + } + } + return result.m_hits; } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(RayCastMultipleLocalSpaceWithGroup, k_categoryName, @@ -205,14 +197,14 @@ namespace ScriptCanvasPhysics "Objects hit"); OverlapResult OverlapQuery(const AZ::Transform& pose, - Physics::ShapeConfiguration& shape, + AZStd::shared_ptr shape, const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::OverlapRequest request; + AzPhysics::OverlapRequest request; request.m_pose = pose; - request.m_shapeConfiguration = &shape; - request.m_filterCallback = [ignore](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) + request.m_shapeConfiguration = shape; + request.m_filterCallback = [ignore](const AzPhysics::SimulatedBody* body, [[maybe_unused]] const Physics::Shape* shape) { return body->GetEntityId() != ignore; }; @@ -222,15 +214,23 @@ namespace ScriptCanvasPhysics request.m_collisionGroup = AzPhysics::CollisionGroup(collisionGroup); } - AZStd::vector overlaps; - Physics::WorldRequestBus::BroadcastResult(overlaps, &Physics::World::Overlap, request); + AzPhysics::SceneQueryHits results; + if (auto* sceneInterface = AZ::Interface::Get()) + { + if (AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneHandle != AzPhysics::InvalidSceneHandle) + { + results = sceneInterface->QueryScene(sceneHandle, &request); + } + } AZStd::vector overlapIds; - overlapIds.reserve(overlaps.size()); - AZStd::transform(overlaps.begin(), overlaps.end(), AZStd::back_inserter(overlapIds), [](const Physics::OverlapHit& overlap) - { - return overlap.m_body->GetEntityId(); - }); + overlapIds.reserve(results.m_hits.size()); + AZStd::transform(results.m_hits.begin(), results.m_hits.end(), AZStd::back_inserter(overlapIds), + [](const AzPhysics::SceneQueryHit& overlap) + { + return overlap.m_entityId; + }); return AZStd::make_tuple(!overlapIds.empty(), overlapIds); } @@ -239,8 +239,8 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::SphereShapeConfiguration sphere(radius); - return OverlapQuery(AZ::Transform::CreateTranslation(position), sphere, collisionGroup, ignore); + return OverlapQuery(AZ::Transform::CreateTranslation(position), + AZStd::make_shared(radius), collisionGroup, ignore); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(OverlapSphereWithGroup, k_categoryName, @@ -257,8 +257,8 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::BoxShapeConfiguration box(dimensions); - return OverlapQuery(pose, box, collisionGroup, ignore); + return OverlapQuery(pose, + AZStd::make_shared(dimensions), collisionGroup, ignore); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(OverlapBoxWithGroup, k_categoryName, @@ -276,8 +276,8 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::CapsuleShapeConfiguration capsule(height, radius); - return OverlapQuery(pose, capsule, collisionGroup, ignore); + return OverlapQuery(pose, + AZStd::make_shared(height, radius), collisionGroup, ignore); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(OverlapCapsuleWithGroup, k_categoryName, @@ -293,18 +293,18 @@ namespace ScriptCanvasPhysics Result ShapecastQuery(float distance, const AZ::Transform& pose, const AZ::Vector3& direction, - Physics::ShapeConfiguration& shape, + AZStd::shared_ptr shape, const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::ShapeCastRequest request; + AzPhysics::ShapeCastRequest request; request.m_distance = distance; request.m_start = pose; request.m_direction = direction; - request.m_shapeConfiguration = &shape; - request.m_filterCallback = [ignore](const Physics::WorldBody* body, [[maybe_unused]] const Physics::Shape* shape) + request.m_shapeConfiguration = shape; + request.m_filterCallback = [ignore](const AzPhysics::SimulatedBody* body, [[maybe_unused]] const Physics::Shape* shape) { - return body->GetEntityId() != ignore ? Physics::QueryHitType::Block : Physics::QueryHitType::None; + return body->GetEntityId() != ignore ? AzPhysics::SceneQuery::QueryHitType::Block : AzPhysics::SceneQuery::QueryHitType::None; }; if (!collisionGroup.empty()) @@ -312,20 +312,27 @@ namespace ScriptCanvasPhysics request.m_collisionGroup = AzPhysics::CollisionGroup(collisionGroup); } - Physics::RayCastHit hit; - Physics::WorldRequestBus::BroadcastResult(hit, &Physics::World::ShapeCast, request); - - AZ::EntityId id; - AZ::Crc32 surfaceType; - if (hit.m_body) + AzPhysics::SceneQueryHits result; + if (auto* sceneInterface = AZ::Interface::Get()) { - id = hit.m_body->GetEntityId(); + if (AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + sceneHandle != AzPhysics::InvalidSceneHandle) + { + result = sceneInterface->QueryScene(sceneHandle, &request); + } } - if (hit.m_material) + if (result) { - surfaceType = hit.m_material->GetSurfaceType(); + AZ::Crc32 surfaceType; + if (result.m_hits[0].m_material) + { + surfaceType = result.m_hits[0].m_material->GetSurfaceType(); + } + return AZStd::make_tuple(result.m_hits[0].IsValid(), result.m_hits[0].m_position, + result.m_hits[0].m_normal, result.m_hits[0].m_distance, + result.m_hits[0].m_entityId, surfaceType); } - return AZStd::make_tuple(hit.m_body != nullptr, hit.m_position, hit.m_normal, hit.m_distance, id, surfaceType); + return AZStd::make_tuple(false, AZ::Vector3::CreateZero(), AZ::Vector3::CreateZero(), 0.0f, AZ::EntityId(), AZ::Crc32()); } AZ_INLINE Result SphereCastWithGroup(float distance, @@ -335,15 +342,14 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::SphereShapeConfiguration sphere(radius); - return ShapecastQuery(distance, pose, direction, sphere, collisionGroup, ignore); + return ShapecastQuery(distance, pose, direction, + AZStd::make_shared(radius), collisionGroup, ignore); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(SphereCastWithGroup, k_categoryName, "{7A4D8893-51F5-444F-9C77-64D179F9C9BB}", "SphereCast", "Distance", "Pose", "Direction", "Radius", "Collision group", "Ignore", // In Params "Object Hit", "Position", "Normal", "Distance", "EntityId", "Surface" // Out Params - ); AZ_INLINE Result BoxCastWithGroup(float distance, @@ -353,8 +359,8 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::BoxShapeConfiguration box(dimensions); - return ShapecastQuery(distance, pose, direction, box, collisionGroup, ignore); + return ShapecastQuery(distance, pose, direction, + AZStd::make_shared(dimensions), collisionGroup, ignore); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(BoxCastWithGroup, k_categoryName, @@ -371,8 +377,8 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore) { - Physics::CapsuleShapeConfiguration capsule(height, radius); - return ShapecastQuery(distance, pose, direction, capsule, collisionGroup, ignore); + return ShapecastQuery(distance, pose, direction, + AZStd::make_shared(height, radius), collisionGroup, ignore); } SCRIPT_CANVAS_GENERIC_FUNCTION_NODE(CapsuleCastWithGroup, k_categoryName, @@ -382,165 +388,15 @@ namespace ScriptCanvasPhysics ); /////////////////////////////////////////////////////////////// - // Deprecated nodes - - using DeprecatedResult = AZStd::tuple< - bool /*true if an object was hit*/, - AZ::Vector3 /*world space position*/, - AZ::Vector3 /*surface normal*/, - float /*distance to the hit*/, - AZ::EntityId /*entity hit, if any*/ - >; - - DeprecatedResult DeprecatedResultFunc(bool arg1, const AZ::Vector3& arg2, const AZ::Vector3& arg3, float arg4, AZ::EntityId arg5, AZ::Crc32) - { - return DeprecatedResult(arg1, arg2, arg3, arg4, arg5); - }; - - AZ_INLINE DeprecatedResult RayCastWorldSpace(const AZ::Vector3& start, const AZ::Vector3& direction, float distance, AZ::EntityId ignore) - { - return AZStd::apply(DeprecatedResultFunc, RayCastWorldSpaceWithGroup(start, direction, distance, "", ignore)); - } - - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(RayCastWorldSpace, - k_categoryName, - "{F75EF071-6755-40A3-8D5D-0603964774AE}", - "This node is deprecated, use RayCastWorldSpaceWithGroup", - "Start", - "Direction", - "Distance", - "Ignore", - "Object hit", - "Position", - "Normal", - "Distance", - "Result"); - - AZ_INLINE DeprecatedResult RayCastLocalSpace(const AZ::EntityId& fromEntityId, const AZ::Vector3& direction, float distance, AZ::EntityId ignore) - { - return AZStd::apply(DeprecatedResultFunc, RayCastLocalSpaceWithGroup(fromEntityId, direction, distance, "", ignore)); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(RayCastLocalSpace, - k_categoryName, - "{1D6935AF-8EE9-4636-9F0C-E0485D935800}", - "This node is deprecated, use RayCastLocalSpaceWithGroup", - "Source", - "Direction", - "Distance", - "Ignore", - "Object hit", - "Position", - "Normal", - "Distance", - "Result"); - - AZ_INLINE AZStd::vector RayCastMultipleLocalSpace(const AZ::EntityId& fromEntityId, const AZ::Vector3& direction, float distance, AZ::EntityId ignore) - { - return RayCastMultipleLocalSpaceWithGroup(fromEntityId, direction, distance, "", ignore); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(RayCastMultipleLocalSpace, - k_categoryName, - "{AB48C54A-0E0D-41F1-B73E-F689B9570446}", - "This node is deprecated, use RayCastMultipleLocalSpaceWithGroup", - "Source", - "Direction", - "Distance", - "Ignore", - "Objects hit"); - - AZ_INLINE OverlapResult OverlapSphere(const AZ::Vector3& position, float radius, AZ::EntityId ignore) - { - return OverlapSphereWithGroup(position, radius, "", ignore); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(OverlapSphere, - k_categoryName, - "{ED1CE1E1-5BF1-46BA-8DFF-78966FFDBF75}", - "This node is deprecated, use OverlapSphereWithGroup", - "Position", - "Radius", - "Ignore" - ); - - AZ_INLINE OverlapResult OverlapBox(const AZ::Transform& pose, const AZ::Vector3& dimensions, AZ::EntityId ignore) - { - return OverlapBoxWithGroup(pose, dimensions, "", ignore); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(OverlapBox, - k_categoryName, - "{8D60E5FA-6101-4D3B-BC60-28449CC93AC2}", - "This node is deprecated, use OverlapBoxWithGroup", - "Pose", - "Dimensions", - "Ignore" - ); - - AZ_INLINE OverlapResult OverlapCapsule(const AZ::Transform& pose, float height, float radius, AZ::EntityId ignore) - { - return OverlapCapsuleWithGroup(pose, height, radius, "", ignore); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(OverlapCapsule, - k_categoryName, - "{600D8F16-2F18-4FA3-858B-D7B59484BEF1}", - "This node is deprecated, use OverlapCapsuleWithGroup", - "Pose", - "Height", - "Radius", - "Ignore" - ); - - AZ_INLINE DeprecatedResult SphereCast(float distance, const AZ::Transform& pose, const AZ::Vector3& direction, float radius, AZ::EntityId ignore) - { - return AZStd::apply(DeprecatedResultFunc, SphereCastWithGroup(distance, pose, direction, radius, "", ignore)); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(SphereCast, - k_categoryName, - "{0236AC59-190C-4A41-99ED-5AFA3AD6C500}", "This node is deprecated, use SphereCastWithGroup", - "Distance", "Pose", "Direction", "Radius", "Ignore", // In Params - "Object Hit", "Position", "Normal", "Distance", "EntityId" // Out Params - ); - - AZ_INLINE DeprecatedResult BoxCast(float distance, const AZ::Transform& pose, const AZ::Vector3& direction, const AZ::Vector3& dimensions, AZ::EntityId ignore) - { - return AZStd::apply(DeprecatedResultFunc, BoxCastWithGroup(distance, pose, direction, dimensions, "", ignore)); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(BoxCast, - k_categoryName, - "{E9DB2310-21FE-4D58-BA13-512CA9BAA305}", "This node is deprecated, use BoxCastWithGroup", - "Distance", "Pose", "Direction", "Dimensions", "Ignore", // In Params - "Object Hit", "Position", "Normal", "Distance", "EntityId" // Out Params - ); - - AZ_INLINE DeprecatedResult CapsuleCast(float distance, const AZ::Transform& pose, const AZ::Vector3& direction, float height, float radius, AZ::EntityId ignore) - { - return AZStd::apply(DeprecatedResultFunc, CapsuleCastWithGroup(distance, pose, direction, height, radius, "", ignore)); - } - SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_DEPRECATED(CapsuleCast, - k_categoryName, - "{FC9F0631-4D63-453C-A876-EC87BC4F2A23}", "This node is deprecated, use CapsuleCastWithGroup", - "Distance", "Pose", "Direction", "Height", "Radius", "Ignore", // In Params - "Object Hit", "Position", "Normal", "Distance", "EntityId" // Out Params - ); - - /////////////////////////////////////////////////////////////// - using Registrar = ScriptCanvas::RegistrarGeneric< - RayCastWorldSpaceNode, - RayCastWorldSpaceWithGroupNode, - RayCastLocalSpaceNode, + using Registrar = ScriptCanvas::RegistrarGeneric + ; + SphereCastWithGroupNode, + CapsuleCastWithGroupNode>; } } diff --git a/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp b/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp index aecbfc4fa7..c74030d6df 100644 --- a/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp +++ b/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp @@ -15,12 +15,15 @@ #include #include #include +#include #include #include -#include +#include #include #include #include +#include +#include #include namespace ScriptCanvasPhysics @@ -53,7 +56,7 @@ namespace ScriptCanvasPhysics const AZStd::string& collisionGroup, AZ::EntityId ignore); - extern AZStd::vector RayCastMultipleLocalSpaceWithGroup(const AZ::EntityId& fromEntityId, + extern AZStd::vector RayCastMultipleLocalSpaceWithGroup(const AZ::EntityId& fromEntityId, const AZ::Vector3& direction, float distance, const AZStd::string& collisionGroup, @@ -62,7 +65,7 @@ namespace ScriptCanvasPhysics extern Result ShapecastQuery(float distance, const AZ::Transform& pose, const AZ::Vector3& direction, - Physics::ShapeConfiguration& shape, + AZStd::shared_ptr shape, const AZStd::string& collisionGroup, AZ::EntityId ignore); } @@ -72,59 +75,103 @@ namespace ScriptCanvasPhysicsTests { using namespace ::testing; - class MockWorld - : public Physics::WorldRequestBus::Handler + //Mocked of the AzPhysics Scene Interface. To keep things simple just mocked functions that have a return value OR required for a test. + class MockPhysicsSceneInterface + : AZ::Interface::Registrar { public: - MockWorld() - { - Physics::WorldRequestBus::Handler::BusConnect(Physics::DefaultPhysicsWorldId); - } - ~MockWorld() override - { - Physics::WorldRequestBus::Handler::BusDisconnect(); - } - MOCK_METHOD1(Update, void(float deltaTime)); - MOCK_METHOD1(StartSimulation, void(float deltaTime)); - MOCK_METHOD0(FinishSimulation, void()); - MOCK_METHOD1(RayCast, Physics::RayCastHit(const Physics::RayCastRequest& request)); - MOCK_METHOD1(RayCastMultiple, AZStd::vector(const Physics::RayCastRequest& request)); - MOCK_METHOD1(ShapeCast, Physics::RayCastHit(const Physics::ShapeCastRequest& request)); - MOCK_METHOD1(ShapeCastMultiple, AZStd::vector(const Physics::ShapeCastRequest& request)); - MOCK_METHOD1(Overlap, AZStd::vector(const Physics::OverlapRequest& request)); - MOCK_METHOD2(OverlapUnbounded, void(const Physics::OverlapRequest& request, const Physics::HitCallback& hitCallback)); - MOCK_METHOD2(RegisterSuppressedCollision, void(const Physics::WorldBody& body0, const Physics::WorldBody& body1)); - MOCK_METHOD2(UnregisterSuppressedCollision, void(const Physics::WorldBody& body0, const Physics::WorldBody& body1)); - MOCK_METHOD1(AddBody, void(Physics::WorldBody& body)); - MOCK_METHOD1(RemoveBody, void(Physics::WorldBody& body)); - MOCK_METHOD1(SetSimFunc, void(std::function func)); - MOCK_METHOD1(SetEventHandler, void(Physics::WorldEventHandler* eventHandler)); - MOCK_CONST_METHOD0(GetGravity, AZ::Vector3()); - MOCK_METHOD1(SetGravity, void(const AZ::Vector3& gravity)); - MOCK_METHOD1(SetMaxDeltaTime, void(float maxDeltaTime)); - MOCK_METHOD1(SetFixedDeltaTime, void(float fixedDeltaTime)); - MOCK_METHOD1(DeferDelete, void(AZStd::unique_ptr worldBody)); - MOCK_METHOD1(SetTriggerEventCallback, void(Physics::ITriggerEventCallback* triggerCallback)); - MOCK_CONST_METHOD0(GetWorldId, AZ::Crc32()); + void StartSimulation( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] float deltatime) override {} + void FinishSimulation([[maybe_unused]] AzPhysics::SceneHandle sceneHandle) override {} + void SetEnabled( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] bool enable) override {} + void RemoveSimulatedBody( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {} + void RemoveSimulatedBodies( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandleList& bodyHandles) override {} + void EnableSimulationOfBody( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {} + void DisableSimulationOfBody( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {} + void SuppressCollisionEvents( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleA, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleB) override {} + void UnsuppressCollisionEvents( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleA, + [[maybe_unused]] const AzPhysics::SimulatedBodyHandle& bodyHandleB) override {} + void SetGravity( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] const AZ::Vector3& gravity) override {} + void RegisterSceneConfigurationChangedEventHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneConfigurationChanged::Handler& handler) override {} + void RegisterSimulationBodyAddedHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodyAdded::Handler& handler) override {} + void RegisterSimulationBodyRemovedHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodyRemoved::Handler& handler) override {} + void RegisterSimulationBodySimulationEnabledHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodySimulationEnabled::Handler& handler) override {} + void RegisterSimulationBodySimulationDisabledHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSimulationBodySimulationDisabled::Handler& handler) override {} + void RegisterSceneSimulationStartHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneSimulationStartHandler& handler) override {} + void RegisterSceneActiveSimulatedBodiesHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneActiveSimulatedBodiesEvent::Handler& handler) override {} + void RegisterSceneCollisionEventHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneCollisionsEvent::Handler& handler) override {} + void RegisterSceneTriggersEventHandler( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneTriggersEvent::Handler& handler) override {} + void RegisterSceneGravityChangedEvent( + [[maybe_unused]] AzPhysics::SceneHandle sceneHandle, + [[maybe_unused]] AzPhysics::SceneEvents::OnSceneGravityChangedEvent::Handler& handler) override {} + + MOCK_METHOD1(GetSceneHandle, AzPhysics::SceneHandle(const AZStd::string& sceneName)); + MOCK_CONST_METHOD1(IsEnabled, bool(AzPhysics::SceneHandle sceneHandle)); + MOCK_METHOD2(AddSimulatedBody, AzPhysics::SimulatedBodyHandle(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfiguration* simulatedBodyConfig)); + MOCK_METHOD2(AddSimulatedBodies, AzPhysics::SimulatedBodyHandleList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs)); + MOCK_METHOD2(GetSimulatedBodyFromHandle, AzPhysics::SimulatedBody* (AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle)); + MOCK_METHOD2(GetSimulatedBodiesFromHandle, AzPhysics::SimulatedBodyList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles)); + MOCK_CONST_METHOD1(GetGravity, AZ::Vector3(AzPhysics::SceneHandle sceneHandle)); + MOCK_METHOD2(RegisterSceneSimulationFinishHandler, void(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneEvents::OnSceneSimulationFinishHandler& handler)); + MOCK_CONST_METHOD2(GetLegacyBody, AzPhysics::SimulatedBody* (AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle handle)); + MOCK_METHOD2(QueryScene, AzPhysics::SceneQueryHits(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequest* request)); + MOCK_METHOD2(QuerySceneBatch, AzPhysics::SceneQueryHitsList(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequests& requests)); + MOCK_METHOD4(QuerySceneAsync, bool(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequest* request, AzPhysics::SceneQuery::AsyncCallback callback)); + MOCK_METHOD4(QuerySceneAsyncBatch, bool(AzPhysics::SceneHandle sceneHandle, AzPhysics::SceneQuery::AsyncRequestId requestId, + const AzPhysics::SceneQueryRequests& requests, AzPhysics::SceneQuery::AsyncBatchCallback callback)); }; - class MockWorldBody - : public Physics::WorldBody + class MockSimulatedBody + : public AzPhysics::SimulatedBody { public: MOCK_CONST_METHOD0(GetEntityId, AZ::EntityId()); - MOCK_CONST_METHOD0(GetWorld, Physics::World*()); MOCK_CONST_METHOD0(GetTransform, AZ::Transform()); MOCK_METHOD1(SetTransform, void(const AZ::Transform& transform)); MOCK_CONST_METHOD0(GetPosition, AZ::Vector3()); MOCK_CONST_METHOD0(GetOrientation, AZ::Quaternion()); MOCK_CONST_METHOD0(GetAabb, AZ::Aabb()); - MOCK_METHOD1(RayCast, Physics::RayCastHit(const Physics::RayCastRequest& request)); + MOCK_METHOD1(RayCast, AzPhysics::SceneQueryHit(const AzPhysics::RayCastRequest& request)); MOCK_CONST_METHOD0(GetNativeType, AZ::Crc32()); MOCK_CONST_METHOD0(GetNativePointer, void*()); - MOCK_METHOD1(AddToWorld, void(Physics::World&)); - MOCK_METHOD1(RemoveFromWorld, void(Physics::World&)); }; class MockShape @@ -144,8 +191,8 @@ namespace ScriptCanvasPhysicsTests MOCK_CONST_METHOD0(GetTag, AZ::Crc32()); MOCK_METHOD1(AttachedToActor, void(void* actor)); MOCK_METHOD0(DetachedFromActor, void()); - MOCK_METHOD2(RayCast, Physics::RayCastHit(const Physics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform)); - MOCK_METHOD1(RayCastLocal, Physics::RayCastHit(const Physics::RayCastRequest& localSpaceRequest)); + MOCK_METHOD2(RayCast, AzPhysics::SceneQueryHit(const AzPhysics::RayCastRequest& worldSpaceRequest, const AZ::Transform& worldTransform)); + MOCK_METHOD1(RayCastLocal, AzPhysics::SceneQueryHit(const AzPhysics::RayCastRequest& localSpaceRequest)); MOCK_METHOD3(GetGeometry, void(AZStd::vector&, AZStd::vector&, AZ::Aabb*)); MOCK_CONST_METHOD1(GetAabb, AZ::Aabb(const AZ::Transform& worldTransform)); MOCK_CONST_METHOD0(GetAabbLocal, AZ::Aabb()); @@ -198,28 +245,34 @@ namespace ScriptCanvasPhysicsTests ON_CALL(m_material, GetSurfaceType()) .WillByDefault(Return(AZ::Crc32("CustomSurface"))); - m_hit.m_body = &m_worldBody; m_hit.m_position = AZ::Vector3(1.f, 2.f, 3.f); m_hit.m_distance = 2.5f; m_hit.m_normal = AZ::Vector3(-1.f, 3.5f, 0.5f); m_hit.m_shape = &m_shape; m_hit.m_material = &m_material; + m_hit.m_resultFlags = AzPhysics::SceneQuery::ResultFlags::Position | + AzPhysics::SceneQuery::ResultFlags::Distance | + AzPhysics::SceneQuery::ResultFlags::Normal | + AzPhysics::SceneQuery::ResultFlags::Shape | + AzPhysics::SceneQuery::ResultFlags::Material; + m_hitResult.m_hits.push_back(m_hit); } - NiceMock m_worldBody; + NiceMock m_worldBody; NiceMock m_shape; NiceMock m_material; - NiceMock m_worldMock; - Physics::RayCastHit m_hit; + NiceMock m_sceneInterfaceMock; + AzPhysics::SceneQueryHit m_hit; + AzPhysics::SceneQueryHits m_hitResult; - bool ResultIsEqualToHit(const ScriptCanvasPhysics::WorldNodes::Result& result, const Physics::RayCastHit& hit) + bool ResultIsEqualToHit(const ScriptCanvasPhysics::WorldNodes::Result& result, const AzPhysics::SceneQueryHit& hit) { return - AZStd::get<0>(result) == (hit.m_body != nullptr) && + AZStd::get<0>(result) == hit.IsValid() && AZStd::get<1>(result) == hit.m_position && AZStd::get<2>(result) == hit.m_normal && AZStd::get<3>(result) == hit.m_distance && - AZStd::get<4>(result) == (hit.m_body ? hit.m_body->GetEntityId() : AZ::EntityId()) && + AZStd::get<4>(result) == hit.m_entityId && AZStd::get<5>(result) == (hit.m_material ? hit.m_material->GetSurfaceType() : AZ::Crc32()) ; } @@ -228,8 +281,8 @@ namespace ScriptCanvasPhysicsTests TEST_F(ScriptCanvasPhysicsTest, WorldNodes_RayCastWorldSpaceWithGroup_FT) { - ON_CALL(m_worldMock, RayCast(_)) - .WillByDefault(Return(m_hit)); + ON_CALL(m_sceneInterfaceMock, QueryScene(_, _)) + .WillByDefault(Return(m_hitResult)); // given raycast data const AZ::Vector3 start = AZ::Vector3::CreateZero(); @@ -253,8 +306,8 @@ namespace ScriptCanvasPhysicsTests TEST_F(ScriptCanvasPhysicsTest, WorldNodes_RayCastLocalSpaceWithGroup_FT) { - ON_CALL(m_worldMock, RayCast(_)) - .WillByDefault(Return(m_hit)); + ON_CALL(m_sceneInterfaceMock, QueryScene(_, _)) + .WillByDefault(Return(m_hitResult)); // given raycast data const AZ::Vector3 start = AZ::Vector3::CreateZero(); @@ -283,11 +336,11 @@ namespace ScriptCanvasPhysicsTests TEST_F(ScriptCanvasPhysicsTest, WorldNodes_RayCastMultipleLocalSpaceWithGroup_FT) { - AZStd::vector hits; + AZStd::vector hits; hits.push_back(m_hit); - ON_CALL(m_worldMock, RayCastMultiple(_)) - .WillByDefault(Return(hits)); + ON_CALL(m_sceneInterfaceMock, QueryScene(_, _)) + .WillByDefault(Return(m_hitResult)); // given raycast data const AZ::Vector3 start = AZ::Vector3::CreateZero(); @@ -315,7 +368,6 @@ namespace ScriptCanvasPhysicsTests for (auto result : results) { - EXPECT_EQ(result.m_body, m_hit.m_body); EXPECT_EQ(result.m_distance, m_hit.m_distance); EXPECT_EQ(result.m_material, m_hit.m_material); EXPECT_EQ(result.m_normal, m_hit.m_normal); @@ -326,8 +378,8 @@ namespace ScriptCanvasPhysicsTests TEST_F(ScriptCanvasPhysicsTest, WorldNodes_ShapecastQuery_FT) { - ON_CALL(m_worldMock, ShapeCast(_)) - .WillByDefault(Return(m_hit)); + ON_CALL(m_sceneInterfaceMock, QueryScene(_, _)) + .WillByDefault(Return(m_hitResult)); // given shapecast data const AZ::Vector3 start = AZ::Vector3::CreateZero(); @@ -336,14 +388,13 @@ namespace ScriptCanvasPhysicsTests const AZStd::string collisionGroup = "default"; const AZ::EntityId ignoreEntityId; const AZ::Transform pose = AZ::Transform::CreateIdentity(); - Physics::BoxShapeConfiguration boxShapeConfiguration = Physics::BoxShapeConfiguration(); // when a shapecast is performed auto result = ScriptCanvasPhysics::WorldNodes::ShapecastQuery( distance, pose, direction, - boxShapeConfiguration, + AZStd::make_shared(), collisionGroup, ignoreEntityId ); diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_CallFunctionLocalValues.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_CallFunctionLocalValues.scriptcanvas deleted file mode 100644 index 7ac2433dd0..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_CallFunctionLocalValues.scriptcanvas +++ /dev/null @@ -1,417 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_DeviousStateFunctionFixGraph.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_DeviousStateFunctionFixGraph.scriptcanvas deleted file mode 100644 index 387306ce8a..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_DeviousStateFunctionFixGraph.scriptcanvas +++ /dev/null @@ -1,711 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExposeAnyOut.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExposeAnyOut.scriptcanvas_fn deleted file mode 100644 index 11da136790..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExposeAnyOut.scriptcanvas_fn +++ /dev/null @@ -1,949 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Function Names With Spaces.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Function Names With Spaces.scriptcanvas_fn deleted file mode 100644 index ac894c8f6e..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Function Names With Spaces.scriptcanvas_fn +++ /dev/null @@ -1,619 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version.scriptcanvas_fn deleted file mode 100644 index bc942f06a5..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version.scriptcanvas_fn +++ /dev/null @@ -1,619 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionAddVector3Call.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionAddVector3Call.scriptcanvas deleted file mode 100644 index 5a83e4e5be..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionAddVector3Call.scriptcanvas +++ /dev/null @@ -1,1387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionLocalObjectsCall.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionLocalObjectsCall.scriptcanvas deleted file mode 100644 index 2af834e12f..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionLocalObjectsCall.scriptcanvas +++ /dev/null @@ -1,2778 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionNoInputOneOutputCall.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionNoInputOneOutputCall.scriptcanvas deleted file mode 100644 index 39fbb85df2..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionNoInputOneOutputCall.scriptcanvas +++ /dev/null @@ -1,1403 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionWithOnGraphStart.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionWithOnGraphStart.scriptcanvas_fn deleted file mode 100644 index fd6decd4dd..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionWithOnGraphStart.scriptcanvas_fn +++ /dev/null @@ -1,665 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorld.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorld.scriptcanvas index 55ae0da585..0a06276a16 100644 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorld.scriptcanvas +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorld.scriptcanvas @@ -3,179 +3,34 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -186,7 +41,7 @@ - + @@ -207,55 +62,118 @@ + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + - @@ -263,21 +181,21 @@ - + - + - + - + - + - + @@ -286,45 +204,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -334,24 +220,25 @@ - - + + - + + - + @@ -366,8 +253,8 @@ - - + + @@ -388,12 +275,13 @@ + - + @@ -402,13 +290,8 @@ - - - - - - + @@ -419,23 +302,24 @@ - + - + + - + @@ -444,21 +328,9 @@ - - - - - - - - - - - - - - + + @@ -467,43 +339,38 @@ - - + + - + + - + - + - - - - - - - - + + + + - - - + - + @@ -517,6 +384,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -524,848 +434,28 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - + - + - + @@ -1381,50 +471,15 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1434,8 +489,8 @@ - - + + @@ -1445,42 +500,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1490,31 +510,31 @@ - - - - - - - - + - + - + + + + + + + + @@ -1522,7 +542,7 @@ - + @@ -1532,66 +552,31 @@ - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + @@ -1599,41 +584,41 @@ - + - - - - - - - + - - - + + + + - + - - - - + + + + + + + + + @@ -1642,10 +627,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphMultipleInError.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphMultipleInError.scriptcanvas_fn deleted file mode 100644 index 0f61ca4838..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphMultipleInError.scriptcanvas_fn +++ /dev/null @@ -1,1143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphMultipleOutError.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphMultipleOutError.scriptcanvas_fn deleted file mode 100644 index 80a18d5a50..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphMultipleOutError.scriptcanvas_fn +++ /dev/null @@ -1,1143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphOutInLoop.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphOutInLoop.scriptcanvas_fn deleted file mode 100644 index 4dcba0776d..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphOutInLoop.scriptcanvas_fn +++ /dev/null @@ -1,1198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphOutMidCycleMissingSlots.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphOutMidCycleMissingSlots.scriptcanvas_fn deleted file mode 100644 index a7245c09f5..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_InterpretedSubgraphOutMidCycleMissingSlots.scriptcanvas_fn +++ /dev/null @@ -1,1054 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunction.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunction.scriptcanvas new file mode 100644 index 0000000000..03e74763a1 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunction.scriptcanvas @@ -0,0 +1,987 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunction.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunction.scriptcanvas_fn deleted file mode 100644 index 0f8496db8f..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunction.scriptcanvas_fn +++ /dev/null @@ -1,975 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposeOut.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposeOut.scriptcanvas new file mode 100644 index 0000000000..dfe428a157 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposeOut.scriptcanvas @@ -0,0 +1,804 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposure.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposure.scriptcanvas_fn deleted file mode 100644 index 0c4e5444d8..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposure.scriptcanvas_fn +++ /dev/null @@ -1,794 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposureWithOutput.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposureWithOutput.scriptcanvas_fn deleted file mode 100644 index 052989738d..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationFunctionDirectExposureWithOutput.scriptcanvas_fn +++ /dev/null @@ -1,891 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraph.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraph.scriptcanvas index 45125c247d..1621294ed2 100644 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraph.scriptcanvas +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraph.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,370 +16,290 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -388,7 +308,7 @@ - + @@ -434,6 +354,7 @@ + @@ -471,6 +392,7 @@ + @@ -513,6 +435,7 @@ + @@ -550,6 +473,7 @@ + @@ -563,307 +487,592 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -871,7 +1080,7 @@ - + @@ -918,6 +1127,7 @@ + @@ -960,6 +1170,7 @@ + @@ -1002,6 +1213,7 @@ + @@ -1039,6 +1251,7 @@ + @@ -1113,142 +1326,21 @@ - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1258,20 +1350,20 @@ - + - + - + @@ -1280,107 +1372,80 @@ + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - + + + + - + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - + - + @@ -1389,9 +1454,14 @@ + + + + + - - + + @@ -1400,24 +1470,25 @@ - - + + - + + - + @@ -1426,18 +1497,23 @@ + + + + + - - + + - + - + @@ -1449,363 +1525,180 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - + + + + + - - - - - - - - - - - + + - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + - + + + + + + @@ -1813,7 +1706,7 @@ - + @@ -1860,6 +1753,7 @@ + @@ -1897,6 +1791,7 @@ + @@ -1983,6 +1878,7 @@ + @@ -2069,6 +1965,7 @@ + @@ -2150,6 +2047,7 @@ + @@ -2186,11 +2084,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -2200,7 +2240,7 @@ - + @@ -2208,7 +2248,7 @@ - + @@ -2221,7 +2261,7 @@ - + @@ -2231,7 +2271,7 @@ - + @@ -2239,7 +2279,7 @@ - + @@ -2252,7 +2292,7 @@ - + @@ -2262,7 +2302,7 @@ - + @@ -2270,7 +2310,7 @@ - + @@ -2283,7 +2323,7 @@ - + @@ -2293,7 +2333,7 @@ - + @@ -2301,7 +2341,7 @@ - + @@ -2314,7 +2354,7 @@ - + @@ -2324,7 +2364,7 @@ - + @@ -2332,7 +2372,7 @@ - + @@ -2345,7 +2385,7 @@ - + @@ -2355,7 +2395,7 @@ - + @@ -2363,7 +2403,7 @@ - + @@ -2376,7 +2416,7 @@ - + @@ -2386,7 +2426,7 @@ - + @@ -2394,7 +2434,7 @@ - + @@ -2407,7 +2447,7 @@ - + @@ -2417,7 +2457,7 @@ - + @@ -2425,7 +2465,7 @@ - + @@ -2438,7 +2478,7 @@ - + @@ -2448,7 +2488,7 @@ - + @@ -2456,7 +2496,7 @@ - + @@ -2469,25 +2509,25 @@ - + - + - + - + - + - + @@ -2506,7 +2546,7 @@ - + @@ -2514,7 +2554,7 @@ - + @@ -2522,7 +2562,7 @@ - + @@ -2540,15 +2580,15 @@ - - - + + + - - - + + + @@ -2556,7 +2596,7 @@ - + @@ -2598,7 +2638,7 @@ - + @@ -2606,27 +2646,21 @@ - + - + - - - - - - - + @@ -2635,12 +2669,18 @@ + + + + + + - + @@ -2648,27 +2688,27 @@ - + - + - + - + @@ -2682,7 +2722,7 @@ - + @@ -2690,27 +2730,27 @@ - + - + - + - + @@ -2724,7 +2764,28 @@ - + + + + + + + + + + + + + + + + + + + + + + @@ -2766,7 +2827,7 @@ - + @@ -2774,27 +2835,27 @@ - + - + - + - + @@ -2808,28 +2869,7 @@ - - - - - - - - - - - - - - - - - - - - - - + @@ -2837,27 +2877,27 @@ - + - + - + - + @@ -2871,7 +2911,7 @@ - + @@ -2879,27 +2919,27 @@ - + - + - + - + @@ -2916,7 +2956,7 @@ - + @@ -2924,7 +2964,7 @@ - + @@ -2932,23 +2972,23 @@ - + - + - + - + - + @@ -2966,7 +3006,7 @@ - + @@ -2992,13 +3032,14 @@ + - + @@ -3024,13 +3065,14 @@ + - + @@ -3056,6 +3098,7 @@ + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraphDirectExposedOut.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraphDirectExposedOut.scriptcanvas new file mode 100644 index 0000000000..42876bb8d6 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraphDirectExposedOut.scriptcanvas @@ -0,0 +1,3116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraphDirectionExposedOutWithOutput.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraphDirectionExposedOutWithOutput.scriptcanvas deleted file mode 100644 index 92807dc282..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_NodeableDurationSubgraphDirectionExposedOutWithOutput.scriptcanvas +++ /dev/null @@ -1,3332 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_OrderedSequencerFunction.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_OrderedSequencerFunction.scriptcanvas_fn deleted file mode 100644 index e570ed4f44..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_OrderedSequencerFunction.scriptcanvas_fn +++ /dev/null @@ -1,1157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunction.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunction.scriptcanvas_fn deleted file mode 100644 index 57a30805b3..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunction.scriptcanvas_fn +++ /dev/null @@ -1,1301 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranch.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranch.scriptcanvas_fn deleted file mode 100644 index 06a9752d35..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranch.scriptcanvas_fn +++ /dev/null @@ -1,1795 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranchDefaultOut.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranchDefaultOut.scriptcanvas_fn deleted file mode 100644 index 5327d27f5e..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranchDefaultOut.scriptcanvas_fn +++ /dev/null @@ -1,2141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranchSingleNamedOutJustReturns.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranchSingleNamedOutJustReturns.scriptcanvas_fn deleted file mode 100644 index 59dc8e15a8..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionBranchSingleNamedOutJustReturns.scriptcanvas_fn +++ /dev/null @@ -1,984 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionDefaultOut.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionDefaultOut.scriptcanvas_fn deleted file mode 100644 index f428bb6a3a..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionDefaultOut.scriptcanvas_fn +++ /dev/null @@ -1,1785 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionOut.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionOut.scriptcanvas_fn deleted file mode 100644 index 7c6e897161..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ParseFunctionOut.scriptcanvas_fn +++ /dev/null @@ -1,1558 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphComplexityError.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphComplexityError.scriptcanvas_fn deleted file mode 100644 index 1da04a8a47..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphComplexityError.scriptcanvas_fn +++ /dev/null @@ -1,1712 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphReturnValueFromIn.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphReturnValueFromIn.scriptcanvas_fn deleted file mode 100644 index 99444094af..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphReturnValueFromIn.scriptcanvas_fn +++ /dev/null @@ -1,827 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphReturnValueFromInOut.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphReturnValueFromInOut.scriptcanvas_fn deleted file mode 100644 index b07421d261..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SubgraphReturnValueFromInOut.scriptcanvas_fn +++ /dev/null @@ -1,827 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Subgraph_UserNodeable.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Subgraph_UserNodeable.scriptcanvas deleted file mode 100644 index 74296cc880..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Subgraph_UserNodeable.scriptcanvas +++ /dev/null @@ -1,1499 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Subgraph_UserNodeableLatent.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Subgraph_UserNodeableLatent.scriptcanvas deleted file mode 100644 index a26c9d9084..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_Subgraph_UserNodeableLatent.scriptcanvas +++ /dev/null @@ -1,660 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_UseFunctionWithOnGraphStart.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_UseFunctionWithOnGraphStart.scriptcanvas deleted file mode 100644 index 764bd7edd9..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_UseFunctionWithOnGraphStart.scriptcanvas +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_VariableReferences.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_VariableReferences.scriptcanvas index 154139a285..2652cb4779 100644 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_VariableReferences.scriptcanvas +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_VariableReferences.scriptcanvas @@ -3,9 +3,9 @@ - + - + @@ -16,358 +16,163 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + - - - - - - - - - - + - + + - - - - - - - - - - - - - + + - + + + + - + - + - + - + - + - + @@ -376,9 +181,14 @@ + + + + + - - + + @@ -387,8 +197,8 @@ - - + + @@ -399,33 +209,13 @@ + - - - - - - - - - - - - - - - - - - - - - - + @@ -434,9 +224,14 @@ + + + + + - - + + @@ -446,7 +241,7 @@ - + @@ -457,12 +252,13 @@ + - + @@ -472,8 +268,8 @@ - - + + @@ -482,7 +278,7 @@ - + @@ -494,12 +290,13 @@ + - + @@ -509,10 +306,10 @@ - + - + @@ -520,29 +317,60 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + - + @@ -550,142 +378,368 @@ - + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -696,7 +750,7 @@ - + @@ -717,48 +771,12 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - @@ -766,22 +784,22 @@ - + - + - + - + @@ -818,12 +836,13 @@ + - + @@ -839,7 +858,7 @@ - + @@ -858,14 +877,15 @@ - + + - + @@ -881,7 +901,7 @@ - + @@ -900,14 +920,15 @@ - + + - + @@ -944,12 +965,13 @@ + - + @@ -981,12 +1003,13 @@ + - + @@ -1018,6 +1041,7 @@ + @@ -1036,23 +1060,27 @@ - + - + - + + + - + - + - + + + @@ -1071,7 +1099,7 @@ - + @@ -1083,16 +1111,16 @@ - + - + - + - + @@ -1103,7 +1131,7 @@ - + @@ -1155,6 +1183,7 @@ + @@ -1195,8 +1224,9 @@ - + + @@ -1237,8 +1267,9 @@ - + + @@ -1281,6 +1312,7 @@ + @@ -1318,6 +1350,7 @@ + @@ -1355,6 +1388,7 @@ + @@ -1373,23 +1407,27 @@ - + - + - + + + - + - + - + + + @@ -1442,7 +1480,7 @@ - + @@ -1452,7 +1490,7 @@ - + @@ -1460,7 +1498,7 @@ - + @@ -1473,7 +1511,7 @@ - + @@ -1483,7 +1521,7 @@ - + @@ -1491,7 +1529,7 @@ - + @@ -1504,28 +1542,28 @@ - + - + - + - + - + - + - + @@ -1535,28 +1573,28 @@ - + - + - + - + - + - + - + @@ -1566,25 +1604,25 @@ - + - + - + - + - + @@ -1603,15 +1641,36 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + @@ -1619,7 +1678,7 @@ - + @@ -1639,7 +1698,13 @@ - + + + + + + + @@ -1647,7 +1712,7 @@ - + @@ -1655,7 +1720,7 @@ - + @@ -1675,7 +1740,13 @@ - + + + + + + + @@ -1683,7 +1754,7 @@ - + @@ -1691,27 +1762,33 @@ - + - + - + - + + + + + + + @@ -1719,7 +1796,7 @@ - + @@ -1727,27 +1804,33 @@ - + - + - + - + + + + + + + @@ -1755,7 +1838,7 @@ - + @@ -1763,7 +1846,7 @@ - + @@ -1783,7 +1866,13 @@ - + + + + + + + @@ -1791,7 +1880,7 @@ - + @@ -1799,7 +1888,7 @@ - + @@ -1819,28 +1908,7 @@ - - - - - - - - - - - - - - - - - - - - - - + @@ -1851,23 +1919,23 @@ - + - + - + - + - + @@ -1883,7 +1951,7 @@ - + @@ -1907,15 +1975,15 @@ - + - + - + @@ -1939,7 +2007,7 @@ - + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_VerifyByValueCorrectness.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_VerifyByValueCorrectness.scriptcanvas deleted file mode 100644 index 329f5239c0..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_VerifyByValueCorrectness.scriptcanvas +++ /dev/null @@ -1,3703 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTests_UseSubgraphWithStartAndEBus.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTests_UseSubgraphWithStartAndEBus.scriptcanvas deleted file mode 100644 index a5373a0dca..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTests_UseSubgraphWithStartAndEBus.scriptcanvas +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/TestFunction/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version-In^Forder.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/TestFunction/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version-In^Forder.scriptcanvas_fn deleted file mode 100644 index bb3cbe2ca4..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/TestFunction/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version-In^Forder.scriptcanvas_fn +++ /dev/null @@ -1,619 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Code/CMakeLists.txt b/Gems/ScriptCanvasTesting/Code/CMakeLists.txt index e8e34031c1..cba3991111 100644 --- a/Gems/ScriptCanvasTesting/Code/CMakeLists.txt +++ b/Gems/ScriptCanvasTesting/Code/CMakeLists.txt @@ -36,14 +36,15 @@ ly_add_target( Gem::ScriptCanvas Gem::ScriptCanvasEditor Gem::GraphCanvasWidgets + Gem::ScriptEvents PRIVATE AZ::AzCore AZ::AzFramework AZ::AzToolsFramework AZ::AssetBuilderSDK AUTOGEN_RULES - *.ScriptCanvasNode.xml,ScriptCanvasNode_Header.jinja,$path/$fileprefix.generated.h - *.ScriptCanvasNode.xml,ScriptCanvasNode_Source.jinja,$path/$fileprefix.generated.cpp + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Header.jinja,$path/$fileprefix.generated.h + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Source.jinja,$path/$fileprefix.generated.cpp *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Header.jinja,$path/$fileprefix.generated.h *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Source.jinja,$path/$fileprefix.generated.cpp ) diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.h b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.h index a86361e900..cc7be9397d 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.h +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.h @@ -78,11 +78,10 @@ namespace ScriptCanvasTests descriptor.m_modules.push_back(dynamicModuleDescriptor); dynamicModuleDescriptor.m_dynamicLibraryPath = "ScriptCanvas.Editor"; descriptor.m_modules.push_back(dynamicModuleDescriptor); - dynamicModuleDescriptor.m_dynamicLibraryPath = "Gem.ExpressionEvaluation.4c6f9df57ca2468f93c8d860ee6a1167.v0.1.0"; + dynamicModuleDescriptor.m_dynamicLibraryPath = "ExpressionEvaluation"; descriptor.m_modules.push_back(dynamicModuleDescriptor); - dynamicModuleDescriptor.m_dynamicLibraryPath = "Gem.ScriptEvents.32d8ba21703e4bbbb08487366e48dd69.v0.1.0"; + dynamicModuleDescriptor.m_dynamicLibraryPath = "ScriptEvents"; descriptor.m_modules.push_back(dynamicModuleDescriptor); - s_application->Start(descriptor, appStartup); // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.cpp b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.cpp index 43c609c8a4..890ed083a9 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.cpp +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.cpp @@ -46,16 +46,10 @@ namespace ScriptCanvasTests #undef SC_CORE_UNIT_TEST_DIR #undef SC_CORE_UNIT_TEST_NAME - void ExpectParse(AZStd::string_view graphPath) - { - ExpectParse(graphPath, ScriptCanvasTestUtilitiesCPP::k_defaultExtension); - } - - void ExpectParse(AZStd::string_view graphPath, AZStd::string_view extension) { AZ_TEST_START_TRACE_SUPPRESSION; - const AZStd::string filePath = AZStd::string::format("%s/%s.%s", ScriptCanvasTestUtilitiesCPP::k_unitTestDirPathRelative, graphPath.data(), extension.data()); + const AZStd::string filePath = AZStd::string::format("%s/%s.%s", ScriptCanvasTestUtilitiesCPP::k_unitTestDirPathRelative, graphPath.data(), ScriptCanvasTestUtilitiesCPP::k_defaultExtension); ScriptCanvasEditor::RunGraphSpec runGraphSpec; runGraphSpec.graphPath = filePath; @@ -68,14 +62,9 @@ namespace ScriptCanvasTests } void ExpectParseError(AZStd::string_view graphPath) - { - ExpectParseError(graphPath, ScriptCanvasTestUtilitiesCPP::k_defaultExtension); - } - - void ExpectParseError(AZStd::string_view graphPath, AZStd::string_view extension) { AZ_TEST_START_TRACE_SUPPRESSION; - const AZStd::string filePath = AZStd::string::format("%s/%s.%s", ScriptCanvasTestUtilitiesCPP::k_unitTestDirPathRelative, graphPath.data(), extension.data()); + const AZStd::string filePath = AZStd::string::format("%s/%s.%s", ScriptCanvasTestUtilitiesCPP::k_unitTestDirPathRelative, graphPath.data(), ScriptCanvasTestUtilitiesCPP::k_defaultExtension); ScriptCanvasEditor::RunGraphSpec runGraphSpec; runGraphSpec.runSpec.processOnly = true; runGraphSpec.graphPath = filePath; diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h index 2af9d81949..40e99cc87f 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h @@ -29,12 +29,8 @@ namespace ScriptCanvasTests void ExpectParse(AZStd::string_view graphPath); - void ExpectParse(AZStd::string_view graphPath, AZStd::string_view extension); - void ExpectParseError(AZStd::string_view graphPath); - void ExpectParseError(AZStd::string_view graphPath, AZStd::string_view extension); - AZStd::string_view GetGraphNameFromPath(AZStd::string_view graphPath); void RunUnitTestGraph(AZStd::string_view graphPath); diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.cpp b/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.cpp index f6e5adaf85..291d314799 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.cpp +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.cpp @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.h b/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.h index 455e16ecab..d975a629b9 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.h +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/UnitTestingReporter.h @@ -1,4 +1,4 @@ -/* +/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * diff --git a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_Core.cpp b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_Core.cpp index bb8fca2060..3a0ccc2b11 100644 --- a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_Core.cpp +++ b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_Core.cpp @@ -180,7 +180,7 @@ TEST_F(ScriptCanvasTestFixture, InsertSlot_Basic) graph->Deactivate(); { - AZStd::vector< const Slot* > slotList = basicNode->GetAllSlots(); + const AZStd::vector< const Slot* > slotList = basicNode->GetAllSlots(); EXPECT_EQ(slotList.size(), 3); diff --git a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_NodeGenerics.cpp b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_NodeGenerics.cpp index 3ebff5a2de..cfe0a3e30a 100644 --- a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_NodeGenerics.cpp +++ b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_NodeGenerics.cpp @@ -121,9 +121,8 @@ namespace ScriptCanvas SCRIPT_CANVAS_GENERIC_FUNCTION_NODE_WITH_DEFAULTS(NormalizeWithDefault, NormalizeWithDefaultInputOverrides, "Math/Vector3", "{1A56B08E-7E48-4240-878A-397A912519B6}", "description placeholder", "Vector", "Tolerance", "Fake Testing Default Value"); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenerics) -{ - +TEST_F(ScriptCanvasTestFixture, NodeGenerics) +{ using namespace ScriptCanvasEditor; RegisterComponentDescriptor(); @@ -167,37 +166,11 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenerics) EXPECT_TRUE(Connect(*graph, noArgsReturnNodeID, "Out", normalizeWithDefaultNodeID, "In")); - TraceSuppressionBus::Broadcast(&TraceSuppressionRequests::SuppressPrintf, true); - graph->GetEntity()->Activate(); - TraceSuppressionBus::Broadcast(&TraceSuppressionRequests::SuppressPrintf, false); - - if (auto tolerance = normalizeWithDefaultNode->GetInput_UNIT_TEST("Number: Tolerance")) - { - EXPECT_EQ(3.3, *tolerance); - } - else - { - ADD_FAILURE(); - } - - if (auto fakeDefault = normalizeWithDefaultNode->GetInput_UNIT_TEST("Boolean: Fake Testing Default Value")) - { - EXPECT_TRUE(*fakeDefault); - } - else - { - ADD_FAILURE(); - } - delete graph->GetEntity(); - - EXPECT_EQ(unitTestHandler.SideEffectCount(), 3); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValue) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByValue) { - - using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -276,29 +249,6 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValue) EXPECT_TRUE(Connect(*graph, valueID3, "Get", valueID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByValueID, "Result: TestBehaviorContextObject", valueID5, "Set")); - // execution - EXPECT_TRUE(Connect(*graph, startID, "Out", maxByValueID, "In")); - - graph->GetEntity()->Activate(); - - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, value3->GetValue()); - EXPECT_NE(value3, value1); - EXPECT_NE(value3, value2); - EXPECT_EQ(value3, value4); - EXPECT_EQ(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -309,7 +259,7 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValue) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointer) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByPointer) { using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -392,25 +342,6 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointer) // execution EXPECT_TRUE(Connect(*graph, startID, "Out", maxByValueID, "In")); - graph->GetEntity()->Activate(); - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, value3->GetValue()); - EXPECT_NE(value3, value1); - EXPECT_EQ(value3, value2); - EXPECT_EQ(value3, value4); - EXPECT_EQ(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -421,7 +352,7 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointer) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReference) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByReference) { using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -501,28 +432,6 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReference) EXPECT_TRUE(Connect(*graph, valueID3, "Get", valueID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByValueID, "Result: TestBehaviorContextObject", valueID5, "Set")); - // execution - EXPECT_TRUE(Connect(*graph, startID, "Out", maxByValueID, "In")); - - graph->GetEntity()->Activate(); - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, value3->GetValue()); - EXPECT_NE(value3, value1); - EXPECT_EQ(value3, value2); - EXPECT_EQ(value3, value4); - EXPECT_EQ(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -533,7 +442,7 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReference) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValueInteger) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByValueInteger) { using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -603,30 +512,6 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValueInteger) EXPECT_TRUE(Connect(*graph, valueID3, "Get", valueID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByValueID, "Result: Number", valueID5, "Set")); - // execution - EXPECT_TRUE(Connect(*graph, startID, "Out", maxByValueID, "In")); - - graph->GetEntity()->Activate(); - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, *value3); - EXPECT_EQ(2, *value4); - EXPECT_EQ(2, *value5); - EXPECT_NE(value3, value1); - EXPECT_NE(value3, value2); - EXPECT_NE(value3, value4); - EXPECT_NE(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -637,10 +522,8 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValueInteger) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointerInteger) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByPointerInteger) { - - using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -709,30 +592,8 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointerInteger) EXPECT_TRUE(Connect(*graph, valueID3, "Get", valueID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByValueID, "Result: Number", valueID5, "Set")); - // execution EXPECT_TRUE(Connect(*graph, startID, "Out", maxByValueID, "In")); - graph->GetEntity()->Activate(); - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, *value3); - EXPECT_EQ(2, *value4); - EXPECT_EQ(2, *value5); - EXPECT_NE(value3, value1); - EXPECT_NE(value3, value2); - EXPECT_NE(value3, value4); - EXPECT_NE(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -743,7 +604,7 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointerInteger) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReferenceInteger) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByReferenceInteger) { using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -813,30 +674,8 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReferenceInteger) EXPECT_TRUE(Connect(*graph, valueID3, "Get", valueID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByValueID, "Result: Number", valueID5, "Set")); - // execution EXPECT_TRUE(Connect(*graph, startID, "Out", maxByValueID, "In")); - graph->GetEntity()->Activate(); - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, *value3); - EXPECT_EQ(2, *value4); - EXPECT_EQ(2, *value5); - EXPECT_NE(value3, value1); - EXPECT_NE(value3, value2); - EXPECT_NE(value3, value4); - EXPECT_NE(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -847,7 +686,7 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReferenceInteger) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValueMulti) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByValueMulti) { using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -966,47 +805,8 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValueMulti) EXPECT_TRUE(Connect(*graph, valueIntegerID3, "Get", valueIntegerID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByValueID, "Result: Number", valueIntegerID5, "Set")); - // execution EXPECT_TRUE(Connect(*graph, startID, "Out", maxByValueID, "In")); - graph->GetEntity()->Activate(); - - valueInteger3 = valueIntegerNode3->GetInput_UNIT_TEST("Set"); - valueInteger4 = valueIntegerNode4->GetInput_UNIT_TEST("Set"); - valueInteger5 = valueIntegerNode5->GetInput_UNIT_TEST("Set"); - - if (valueInteger3 && valueInteger4 && valueInteger5) - { - EXPECT_EQ(2, *valueInteger3); - EXPECT_EQ(2, *valueInteger4); - EXPECT_EQ(2, *valueInteger5); - EXPECT_NE(valueInteger3, valueInteger1); - EXPECT_NE(valueInteger3, valueInteger2); - EXPECT_NE(valueInteger3, valueInteger4); - EXPECT_NE(valueInteger3, valueInteger5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, value3->GetValue()); - EXPECT_NE(value3, value1); - EXPECT_NE(value3, value2); - EXPECT_EQ(value3, value4); - EXPECT_EQ(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -1017,7 +817,7 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByValueMulti) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReferenceMulti) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByReferenceMulti) { using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -1136,47 +936,8 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReferenceMulti) EXPECT_TRUE(Connect(*graph, valueIntegerID3, "Get", valueIntegerID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByReferenceID, "Result: Number", valueIntegerID5, "Set")); - // execution EXPECT_TRUE(Connect(*graph, startID, "Out", maxByReferenceID, "In")); - graph->GetEntity()->Activate(); - - valueInteger3 = valueIntegerNode3->GetInput_UNIT_TEST("Set"); - valueInteger4 = valueIntegerNode4->GetInput_UNIT_TEST("Set"); - valueInteger5 = valueIntegerNode5->GetInput_UNIT_TEST("Set"); - - if (valueInteger3 && valueInteger4 && valueInteger5) - { - EXPECT_EQ(2, *valueInteger3); - EXPECT_EQ(2, *valueInteger4); - EXPECT_EQ(2, *valueInteger5); - EXPECT_NE(valueInteger3, valueInteger1); - EXPECT_NE(valueInteger3, valueInteger2); - EXPECT_NE(valueInteger3, valueInteger4); - EXPECT_NE(valueInteger3, valueInteger5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, value3->GetValue()); - EXPECT_NE(value3, value1); - EXPECT_EQ(value3, value2); - EXPECT_EQ(value3, value4); - EXPECT_EQ(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); @@ -1187,7 +948,7 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByReferenceMulti) m_behaviorContext->DisableRemoveReflection(); } -TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointerMulti) +TEST_F(ScriptCanvasTestFixture, NodeGenericsByPointerMulti) { using namespace ScriptCanvas; using namespace ScriptCanvas::Nodes; @@ -1306,47 +1067,8 @@ TEST_F(ScriptCanvasTestFixture, DISABLED_NodeGenericsByPointerMulti) EXPECT_TRUE(Connect(*graph, valueIntegerID3, "Get", valueIntegerID4, "Set")); EXPECT_TRUE(Connect(*graph, maxByPointerID, "Result: Number", valueIntegerID5, "Set")); - // execution EXPECT_TRUE(Connect(*graph, startID, "Out", maxByPointerID, "In")); - graph->GetEntity()->Activate(); - - valueInteger3 = valueIntegerNode3->GetInput_UNIT_TEST("Set"); - valueInteger4 = valueIntegerNode4->GetInput_UNIT_TEST("Set"); - valueInteger5 = valueIntegerNode5->GetInput_UNIT_TEST("Set"); - - if (valueInteger3 && valueInteger4 && valueInteger5) - { - EXPECT_EQ(2, *valueInteger3); - EXPECT_EQ(2, *valueInteger4); - EXPECT_EQ(2, *valueInteger5); - EXPECT_NE(valueInteger3, valueInteger1); - EXPECT_NE(valueInteger3, valueInteger2); - EXPECT_NE(valueInteger3, valueInteger4); - EXPECT_NE(valueInteger3, valueInteger5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - - value3 = valueNode3->GetInput_UNIT_TEST("Set"); - value4 = valueNode4->GetInput_UNIT_TEST("Set"); - value5 = valueNode5->GetInput_UNIT_TEST("Set"); - - if (value3 && value4 && value5) - { - EXPECT_EQ(2, value3->GetValue()); - EXPECT_NE(value3, value1); - EXPECT_EQ(value3, value2); - EXPECT_EQ(value3, value4); - EXPECT_EQ(value3, value5); - } - else - { - ADD_FAILURE() << "Values were nullptr"; - } - delete graph->GetEntity(); m_serializeContext->EnableRemoveReflection(); diff --git a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp index 103fbb625f..c48e4f4f1a 100644 --- a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp +++ b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp @@ -90,6 +90,11 @@ public: } }; +TEST_F(ScriptCanvasTestFixture, InterpretedHelloWorld) +{ + RunUnitTestGraph("LY_SC_UnitTest_HelloWorld"); +} + TEST_F(ScriptCanvasTestFixture, InterpretedEventHandlerNoDisconnect) { GlobalHandler handler; @@ -120,16 +125,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedEventHandlerDisconnect) RunUnitTestGraph("LY_SC_UnitTest_EventHandlerDisconnect", runSpec); } -TEST_F(ScriptCanvasTestFixture, InterpretedUseSubgraphWithStartAndEBus) -{ - RunUnitTestGraph("LY_SC_UnitTests_UseSubgraphWithStartAndEBus"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedDeviousStateFunctionFixGraph) -{ - RunUnitTestGraph("LY_SC_UnitTest_DeviousStateFunctionFixGraph"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedFixBoundMultipleResults) { RunUnitTestGraph("LY_SC_UnitTest_FixBoundMultipleResults"); @@ -137,12 +132,12 @@ TEST_F(ScriptCanvasTestFixture, InterpretedFixBoundMultipleResults) TEST_F(ScriptCanvasTestFixture, InterpretedDetectSelfDeactivation) { - ExpectParseError("LY_SC_UnitTest_DetectSelfDeactivation", "scriptcanvas"); + ExpectParseError("LY_SC_UnitTest_DetectSelfDeactivation"); } TEST_F(ScriptCanvasTestFixture, InterpretedDetectSelfDeactivationSequence) { - ExpectParseError("LY_SC_UnitTest_DetectSelfDeactivationSequence", "scriptcanvas"); + ExpectParseError("LY_SC_UnitTest_DetectSelfDeactivationSequence"); } TEST_F(ScriptCanvasTestFixture, InterpretedEraseFrontUntilEmpty) @@ -225,11 +220,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedMathRunAllVector4Nodes) RunUnitTestGraph("LY_SC_UnitTest_RunAllVector4Nodes"); } -TEST_F(ScriptCanvasTestFixture, InterpretedCallFunctionLocalValues) -{ - RunUnitTestGraph("LY_SC_UnitTest_CallFunctionLocalValues"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedSelfDeactivateParseError1) { ExpectParseError("LY_SC_UnitTest_SelfDeactivateParseError"); @@ -268,26 +258,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedChainedInfiniteLoop) RunUnitTestGraph("LY_SC_UnitTest_ChainedInfiniteLoop", spec); } -TEST_F(ScriptCanvasTestFixture, ParseFunctionLocalObjects) -{ - ExpectParse("LY_SC_UnitTest_FunctionLocalObjects", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedFunctionLocalObjectsCall) -{ - RunUnitTestGraph("LY_SC_UnitTest_FunctionLocalObjectsCall", ExecutionMode::Interpreted, DurationSpec::Ticks(31)); -} - -TEST_F(ScriptCanvasTestFixture, ParseFunctionWithOnGraphStart) -{ - ExpectParse("LY_SC_UnitTest_FunctionWithOnGraphStart", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedUseFunctionWithOnGraphStart) -{ - RunUnitTestGraph("LY_SC_UnitTest_UseFunctionWithOnGraphStart"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedGetTimeAtCurrentTickRegression) { RunUnitTestGraph("LY_SC_UnitTest_GetTimeAtCurrentTickRegression"); @@ -303,64 +273,24 @@ TEST_F(ScriptCanvasTestFixture, InterpretedUnhandledEventReturnValueTypeChangeTu RunUnitTestGraph("LY_SC_UnitTest_UnhandledEventReturnValueTypeChangeTuple"); } -TEST_F(ScriptCanvasTestFixture, ParseOrderedSequencerFunction) -{ - ExpectParse("LY_SC_UnitTest_OrderedSequencerFunction", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, ParseFunction_Names_With_Spaces) -{ - ExpectParse("LY_SC_UnitTest_Function Names With Spaces", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, ParseFunctionNameEvilVersion) -{ - ExpectParse("LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, ParseFunctionNameEvilVersionInFolder) -{ - ExpectParse("TestFunction/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version-In^Forder", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, ParseNodeableDurationFunction) +TEST_F(ScriptCanvasTestFixture, NodeableDurationFunction) { - ExpectParse("LY_SC_UnitTest_NodeableDurationFunction", "scriptcanvas_fn"); + ExpectParse("LY_SC_UnitTest_NodeableDurationFunction"); } TEST_F(ScriptCanvasTestFixture, NodeableDurationSubgraph) { RunUnitTestGraph("LY_SC_UnitTest_NodeableDurationSubgraph", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); } - -TEST_F(ScriptCanvasTestFixture, ParseNodeableDurationFunctionDirectExposure) -{ - ExpectParse("LY_SC_UnitTest_NodeableDurationFunctionDirectExposure", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, ParseNodeableDurationFunctionDirectExposureWithOutput) -{ - ExpectParse("LY_SC_UnitTest_NodeableDurationFunctionDirectExposureWithOutput", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, NodeableDurationSubgraphDirectionExposedOut) -{ - RunUnitTestGraph("LY_SC_UnitTest_NodeableDurationSubgraphDirectionExposedOut", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); -} - -TEST_F(ScriptCanvasTestFixture, NodeableDurationSubgraphDirectionExposedOutWithOutput) -{ - RunUnitTestGraph("LY_SC_UnitTest_NodeableDurationSubgraphDirectionExposedOutWithOutput", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); -} - -TEST_F(ScriptCanvasTestFixture, NodeableDurationSubgraphOnTickDiagnostic) + +TEST_F(ScriptCanvasTestFixture, NodeableDurationFunctionDirectExposeOut) { - RunUnitTestGraph("LY_SC_UnitTest_NodeableDurationSubgraphOnTickDiagnostic", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); + ExpectParse("LY_SC_UnitTest_NodeableDurationFunctionDirectExposeOut"); } -TEST_F(ScriptCanvasTestFixture, ParseFunctionBranchSingleNamedOutJustReturns) +TEST_F(ScriptCanvasTestFixture, NodeableDurationSubgraphDirectExposedOut) { - ExpectParse("LY_SC_UnitTest_ParseFunctionBranchSingleNamedOutJustReturns", "scriptcanvas_fn"); + RunUnitTestGraph("LY_SC_UnitTest_NodeableDurationSubgraphDirectExposedOut", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); } TEST_F(ScriptCanvasTestFixture, ForEachNodeNoInputParseError) @@ -368,66 +298,21 @@ TEST_F(ScriptCanvasTestFixture, ForEachNodeNoInputParseError) ExpectParseError("LY_SC_UnitTest_ForEachNodeNoInputParseError"); } -TEST_F(ScriptCanvasTestFixture, ParseExposeAnyOut) -{ - ExpectParse("LY_SC_UnitTest_ExposeAnyOut", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, ParseMultipleInputNoParseError) -{ - ExpectParse("LY_SC_UnitTest_MultipleInputNoParseError", "scriptcanvas"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphMultipleInError) -{ - ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphMultipleInError", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphMultipleOutError) -{ - ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphMultipleOutError", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphOutInLoop) -{ - ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphOutInLoop", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphOutMidCycleMissingSlots) -{ - ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphOutMidCycleMissingSlots", "scriptcanvas_fn"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedCycleDetectError) { ExpectParseError("LY_SC_UnitTest_CycleDetectError"); } - + TEST_F(ScriptCanvasTestFixture, InterpretedCycleDetectSimple) { ExpectParseError("LY_SC_UnitTest_CycleDetectSimple"); } - + TEST_F(ScriptCanvasTestFixture, InterpretedMultipleOutDataFlowParseError) { ExpectParseError("LY_SC_UnitTest_MultipleOutDataFlowParseError"); } -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphComplexityError) -{ - ExpectParseError("LY_SC_UnitTest_SubgraphComplexityError", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphReturnValueFromIn) -{ - ExpectParseError("LY_SC_UnitTest_SubgraphReturnValueFromIn", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphReturnValueFromInOut) -{ - ExpectParseError("LY_SC_UnitTest_SubgraphReturnValueFromInOut", "scriptcanvas_fn"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedSimultaneousDataInputError) { ExpectParseError("LY_SC_UnitTest_SimultaneousDataInputError"); @@ -438,31 +323,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedAnyAsTailNoOp) RunUnitTestGraph("LY_SC_UnitTest_AnyAsTailNoOp"); } -TEST_F(ScriptCanvasTestFixture, InterpretedVerifyByValueCorrectness) -{ - RunUnitTestGraph("LY_SC_UnitTest_VerifyByValueCorrectness", ExecutionMode::Interpreted); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedFunctionNoInputOneOutputCall) -{ - RunUnitTestGraph("LY_SC_UnitTest_FunctionNoInputOneOutputCall", ExecutionMode::Interpreted); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedFunctionAddVector3Call) -{ - RunUnitTestGraph("LY_SC_UnitTest_FunctionAddVector3Call", ExecutionMode::Interpreted); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraph_UserNodeable) -{ - ExpectParse("LY_SC_UnitTest_Subgraph_UserNodeable", "scriptcanvas"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedSubgraph_UserNodeableLatent) -{ - ExpectParse("LY_SC_UnitTest_Subgraph_UserNodeableLatent", "scriptcanvas"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedConstructionVariableOrder) { RunUnitTestGraph("LY_SC_UnitTest_ConstructionVariableOrder", ExecutionMode::Interpreted); @@ -853,31 +713,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedOrderedSequencer) RunUnitTestGraph("LY_SC_UnitTest_OrderedSequencer", ExecutionMode::Interpreted); } -TEST_F(ScriptCanvasTestFixture, InterpretedParseFunction) -{ - ExpectParse("LY_SC_UnitTest_ParseFunction", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionBranch) -{ - ExpectParse("LY_SC_UnitTest_ParseFunctionBranch", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionBranchDefaultOut) -{ - ExpectParse("LY_SC_UnitTest_ParseFunctionBranchDefaultOut", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionDefaultOut) -{ - ExpectParse("LY_SC_UnitTest_ParseFunctionDefaultOut", "scriptcanvas_fn"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionOut) -{ - ExpectParse("LY_SC_UnitTest_ParseFunctionOut", "scriptcanvas_fn"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedPerformance) { RunUnitTestGraph("LY_SC_UnitTest_Performance", ExecutionMode::Interpreted); @@ -902,22 +737,22 @@ TEST_F(ScriptCanvasTestFixture, InterpretedProperties) { RunUnitTestGraph("LY_SC_UnitTest_Properties", ExecutionMode::Interpreted); } - + TEST_F(ScriptCanvasTestFixture, InterpretedPropertiesLiteReference) { RunUnitTestGraph("LY_SC_UnitTest_PropertiesLite", ExecutionMode::Interpreted); } - + TEST_F(ScriptCanvasTestFixture, InterpretedPropertiesLiteConnection) { RunUnitTestGraph("LY_SC_UnitTest_PropertiesByConnection", ExecutionMode::Interpreted); } - + TEST_F(ScriptCanvasTestFixture, InterpretedPropertiesRecursion) { RunUnitTestGraph("LY_SC_UnitTest_PropertiesRecursion", ExecutionMode::Interpreted); } - + TEST_F(ScriptCanvasTestFixture, InterpretedPropertiesSet) { RunUnitTestGraph("LY_SC_UnitTest_PropertiesSet", ExecutionMode::Interpreted); @@ -928,21 +763,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedRandomSignal) RunUnitTestGraph("LY_SC_UnitTest_RandomSignal", ExecutionMode::Interpreted); } -// TEST_F(ScriptCanvasTestFixture, InterpretedSubgraph_CallAllFunctions) -//{ -// RunUnitTestGraph("LY_SC_UnitTest_Subgraph_CallAllFunctions", ExecutionMode::Interpreted); -//} - -TEST_F(ScriptCanvasTestFixture, InterpretedScript_Names_Tolerate_Spaces) -{ - RunUnitTestGraph("LY_SC_UnitTest_Script Names Tolerate Spaces"); -} - -TEST_F(ScriptCanvasTestFixture, InterpretedScriptNameEvilVersion) -{ - RunUnitTestGraph("LY_SC_UnitTest_Script Names(With) Random+Strings Evil~Version"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedStringFormat) { RunUnitTestGraph("LY_SC_UnitTest_StringFormat", ExecutionMode::Interpreted); @@ -1051,7 +871,7 @@ TEST_F(ScriptCanvasTestFixture, InterpretedBranchInputValuePointerReferenceType) RunUnitTestGraph("LY_SC_UnitTest_BranchInputValuePointerReferenceType"); } -// Graph was not marked complete +// \todo formal support of shared slots // TEST_F(ScriptCanvasTestFixture, InterpretedNodeableBranchMethodSharedDataSlot) // { // RunUnitTestGraph("LY_SC_UnitTest_NodeableBranchMethodSharedDataSlot", ExecutionMode::Interpreted); @@ -1061,3 +881,181 @@ TEST_F(ScriptCanvasTestFixture, InterpretedNodeableInputMethodSharedDataSlot) { RunUnitTestGraph("LY_SC_UnitTest_NodeableInputMethodSharedDataSlot", ExecutionMode::Interpreted); } + +#if defined(FUNCTION_LEGACY_SUPPORT_ENABLED) + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraph_UserNodeable) +{ + ExpectParse("LY_SC_UnitTest_Subgraph_UserNodeableD"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraph_UserNodeableLatent) +{ + ExpectParse("LY_SC_UnitTest_Subgraph_UserNodeableLatent"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedUseFunctionWithOnGraphStart) +{ + RunUnitTestGraph("LY_SC_UnitTest_UseFunctionWithOnGraphStart"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedUseSubgraphWithStartAndEBus) +{ + RunUnitTestGraph("LY_SC_UnitTests_UseSubgraphWithStartAndEBus"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedDeviousStateFunctionFixGraph) +{ + RunUnitTestGraph("LY_SC_UnitTest_DeviousStateFunctionFixGraph"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedCallFunctionLocalValues) +{ + RunUnitTestGraph("LY_SC_UnitTest_CallFunctionLocalValues"); +} + +TEST_F(ScriptCanvasTestFixture, ParseFunctionLocalObjects) +{ + ExpectParse("LY_SC_UnitTest_FunctionLocalObjects"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedFunctionLocalObjectsCall) +{ + RunUnitTestGraph("LY_SC_UnitTest_FunctionLocalObjectsCall", ExecutionMode::Interpreted, DurationSpec::Ticks(31)); +} + +TEST_F(ScriptCanvasTestFixture, ParseFunctionWithOnGraphStart) +{ + ExpectParse("LY_SC_UnitTest_FunctionWithOnGraphStart"); +} + +TEST_F(ScriptCanvasTestFixture, NodeableDurationSubgraphDirectionExposedOutWithOutput) +{ + RunUnitTestGraph("LY_SC_UnitTest_NodeableDurationSubgraphDirectionExposedOutWithOutput", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); +} + +TEST_F(ScriptCanvasTestFixture, ParseOrderedSequencerFunction) +{ + ExpectParse("LY_SC_UnitTest_OrderedSequencerFunction"); +} + +TEST_F(ScriptCanvasTestFixture, ParseFunction_Names_With_Spaces) +{ + ExpectParse("LY_SC_UnitTest_Function Names With Spaces"); +} + +TEST_F(ScriptCanvasTestFixture, ParseFunctionNameEvilVersion) +{ + ExpectParse("LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version"); +} + +TEST_F(ScriptCanvasTestFixture, ParseFunctionNameEvilVersionInFolder) +{ + ExpectParse("TestFunction/LY_SC_UnitTest_Function Names(With) Random+Strings Evil~Version-In^Forder"); +} + +TEST_F(ScriptCanvasTestFixture, ParseNodeableDurationFunction) +{ + ExpectParse("LY_SC_UnitTest_NodeableDurationFunction"); +} + +TEST_F(ScriptCanvasTestFixture, ParseNodeableDurationFunctionDirectExposure) +{ + ExpectParse("LY_SC_UnitTest_NodeableDurationFunctionDirectExposure"); +} + +TEST_F(ScriptCanvasTestFixture, ParseNodeableDurationFunctionDirectExposureWithOutput) +{ + ExpectParse("LY_SC_UnitTest_NodeableDurationFunctionDirectExposureWithOutput"); +} + + +TEST_F(ScriptCanvasTestFixture, ParseFunctionBranchSingleNamedOutJustReturns) +{ + ExpectParse("LY_SC_UnitTest_ParseFunctionBranchSingleNamedOutJustReturns"); +} + +TEST_F(ScriptCanvasTestFixture, ParseExposeAnyOut) +{ + ExpectParse("LY_SC_UnitTest_ExposeAnyOut"); +} + +TEST_F(ScriptCanvasTestFixture, ParseMultipleInputNoParseError) +{ + ExpectParse("LY_SC_UnitTest_MultipleInputNoParseError"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphMultipleInError) +{ + ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphMultipleInError"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphMultipleOutError) +{ + ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphMultipleOutError"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphOutInLoop) +{ + ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphOutInLoop"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphOutMidCycleMissingSlots) +{ + ExpectParseError("LY_SC_UnitTest_InterpretedSubgraphOutMidCycleMissingSlots"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphComplexityError) +{ + ExpectParseError("LY_SC_UnitTest_SubgraphComplexityError"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphReturnValueFromIn) +{ + ExpectParseError("LY_SC_UnitTest_SubgraphReturnValueFromIn"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedSubgraphReturnValueFromInOut) +{ + ExpectParseError("LY_SC_UnitTest_SubgraphReturnValueFromInOut"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedVerifyByValueCorrectness) +{ + RunUnitTestGraph("LY_SC_UnitTest_VerifyByValueCorrectness", ExecutionMode::Interpreted); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedFunctionNoInputOneOutputCall) +{ + RunUnitTestGraph("LY_SC_UnitTest_FunctionNoInputOneOutputCall", ExecutionMode::Interpreted); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedFunctionAddVector3Call) +{ + RunUnitTestGraph("LY_SC_UnitTest_FunctionAddVector3Call", ExecutionMode::Interpreted); +} +TEST_F(ScriptCanvasTestFixture, InterpretedParseFunction) +{ + ExpectParse("LY_SC_UnitTest_ParseFunction"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionBranch) +{ + ExpectParse("LY_SC_UnitTest_ParseFunctionBranch"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionBranchDefaultOut) +{ + ExpectParse("LY_SC_UnitTest_ParseFunctionBranchDefaultOut"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionDefaultOut) +{ + ExpectParse("LY_SC_UnitTest_ParseFunctionDefaultOut"); +} + +TEST_F(ScriptCanvasTestFixture, InterpretedParseFunctionOut) +{ + ExpectParse("LY_SC_UnitTest_ParseFunctionOut"); +} +#endif diff --git a/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake b/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake index a579214d7a..5e02bec82b 100644 --- a/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake +++ b/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake @@ -10,8 +10,8 @@ # set(FILES - ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja - ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Source.jinja ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja diff --git a/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsAsset.h b/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsAsset.h index 63a22862b0..337736a7b0 100644 --- a/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsAsset.h +++ b/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsAsset.h @@ -24,11 +24,6 @@ #include "ScriptEventDefinition.h" -namespace ScriptEventAsset -{ - constexpr const char* k_RuntimeAssetIdStr = "{CB4D603E-8CB0-4D80-8165-4244F28AF187}"; -} - namespace ScriptEvents { class ScriptEventsAsset @@ -36,7 +31,7 @@ namespace ScriptEvents { public: - AZ_RTTI(ScriptEventsAsset, ScriptEventAsset::k_RuntimeAssetIdStr, AZ::Data::AssetData); + AZ_RTTI(ScriptEventsAsset, "{CB4D603E-8CB0-4D80-8165-4244F28AF187}", AZ::Data::AssetData); AZ_CLASS_ALLOCATOR(ScriptEventsAsset, AZ::SystemAllocator, 0); ScriptEventsAsset(const AZ::Data::AssetId& assetId = AZ::Data::AssetId(), AZ::Data::AssetData::AssetStatus status = AZ::Data::AssetData::AssetStatus::NotLoaded) diff --git a/Gems/StartingPointInput/Code/CMakeLists.txt b/Gems/StartingPointInput/Code/CMakeLists.txt index 78a97e218f..1372a79a78 100644 --- a/Gems/StartingPointInput/Code/CMakeLists.txt +++ b/Gems/StartingPointInput/Code/CMakeLists.txt @@ -28,8 +28,8 @@ ly_add_target( CryCommon Gem::ScriptCanvas AUTOGEN_RULES - *.ScriptCanvasNode.xml,ScriptCanvasNode_Header.jinja,$path/$fileprefix.generated.h - *.ScriptCanvasNode.xml,ScriptCanvasNode_Source.jinja,$path/$fileprefix.generated.cpp + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Header.jinja,$path/$fileprefix.generated.h + *.ScriptCanvasGrammar.xml,ScriptCanvasGrammar_Source.jinja,$path/$fileprefix.generated.cpp *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Header.jinja,$path/$fileprefix.generated.h *.ScriptCanvasNodeable.xml,ScriptCanvasNodeable_Source.jinja,$path/$fileprefix.generated.cpp ) diff --git a/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml b/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml index 8cc7d2ac33..88f7c4cc69 100644 --- a/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml +++ b/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml @@ -21,11 +21,8 @@ - - + + + /> \ No newline at end of file diff --git a/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.h b/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.h index 9497cd322f..92932d7960 100644 --- a/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.h +++ b/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.h @@ -35,8 +35,6 @@ namespace StartingPointInput InputHandlerNodeable(const InputHandlerNodeable&) = default; InputHandlerNodeable& operator=(const InputHandlerNodeable&) = default; - void ConnectEvent(AZStd::string eventName); - protected: void OnDeactivate() override; diff --git a/Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasNode.xml b/Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasGrammar.xml similarity index 100% rename from Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasNode.xml rename to Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasGrammar.xml diff --git a/Gems/StartingPointInput/Code/startingpointinput_autogen_files.cmake b/Gems/StartingPointInput/Code/startingpointinput_autogen_files.cmake index f1d63532aa..ca25a91c66 100644 --- a/Gems/StartingPointInput/Code/startingpointinput_autogen_files.cmake +++ b/Gems/StartingPointInput/Code/startingpointinput_autogen_files.cmake @@ -10,8 +10,8 @@ # set(FILES - ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Header.jinja - ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNode_Source.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja + ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Source.jinja ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja ) diff --git a/Gems/StartingPointInput/Code/startingpointinput_files.cmake b/Gems/StartingPointInput/Code/startingpointinput_files.cmake index 951f42dfb3..2208dff6b5 100644 --- a/Gems/StartingPointInput/Code/startingpointinput_files.cmake +++ b/Gems/StartingPointInput/Code/startingpointinput_files.cmake @@ -25,7 +25,7 @@ set(FILES Source/InputHandlerNodeable.h Source/InputHandlerNodeable.cpp Source/InputHandlerNodeable.ScriptCanvasNodeable.xml - Source/InputNode.ScriptCanvasNode.xml + Source/InputNode.ScriptCanvasGrammar.xml Source/StartingPointInput_precompiled.h Source/StartingPointInput_precompiled.cpp ) diff --git a/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp b/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp index 83c08c3569..ec002ad77d 100644 --- a/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp +++ b/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp @@ -19,9 +19,8 @@ #include #include -#include -#include #include +#include #include #include @@ -207,7 +206,7 @@ namespace SurfaceData return false; } - Physics::RayCastRequest request; + AzPhysics::RayCastRequest request; request.m_direction = AZ::Vector3(0.0f, 0.0f, -1.0f); if (queryPointOnly) { @@ -223,7 +222,7 @@ namespace SurfaceData request.m_distance = m_colliderBounds.GetExtents().GetZ(); } - Physics::RayCastHit result; + AzPhysics::SceneQueryHit result; Physics::WorldBodyRequestBus::EventResult(result, GetEntityId(), &Physics::WorldBodyRequestBus::Events::RayCast, request); if (result) diff --git a/Gems/SurfaceData/Code/Tests/SurfaceDataColliderComponentTest.cpp b/Gems/SurfaceData/Code/Tests/SurfaceDataColliderComponentTest.cpp index 19bf799fc9..2d232854f3 100644 --- a/Gems/SurfaceData/Code/Tests/SurfaceDataColliderComponentTest.cpp +++ b/Gems/SurfaceData/Code/Tests/SurfaceDataColliderComponentTest.cpp @@ -21,7 +21,7 @@ #include -#include +#include #include #include @@ -59,11 +59,15 @@ namespace UnitTest // Only initialize our mock physics to return a raycast result if the test wants the point to hit. if (setHitResult) { + m_rayCastHit.m_resultFlags = AzPhysics::SceneQuery::ResultFlags::Distance | + AzPhysics::SceneQuery::ResultFlags::Position | + AzPhysics::SceneQuery::ResultFlags::Normal | + AzPhysics::SceneQuery::ResultFlags::BodyHandle; m_rayCastHit.m_distance = 0.0f; m_rayCastHit.m_position = hitResult.m_position; m_rayCastHit.m_normal = hitResult.m_normal; - // Just need to set this to a non-null value, it gets checked vs null but not otherwise used. - m_rayCastHit.m_body = reinterpret_cast(1); + // Just need to set this to a non-null value, it gets checked vs InvalidSimulatedBodyHandle but not otherwise used. + m_rayCastHit.m_bodyHandle = AzPhysics::SimulatedBodyHandle(AZ::Crc32(12345), 0); } } @@ -76,14 +80,14 @@ namespace UnitTest void EnablePhysics() override {} void DisablePhysics() override {} bool IsPhysicsEnabled() const override { return true; } - Physics::WorldBody* GetWorldBody() override { return nullptr; } + AzPhysics::SimulatedBody* GetWorldBody() override { return nullptr; } // Functional mocks to mock out the data needed by the component AZ::Aabb GetAabb() const override { return m_aabb; } - Physics::RayCastHit RayCast([[maybe_unused]] const Physics::RayCastRequest& request) override { return m_rayCastHit; } + AzPhysics::SceneQueryHit RayCast([[maybe_unused]] const AzPhysics::RayCastRequest& request) override { return m_rayCastHit; } AZ::Aabb m_aabb = AZ::Aabb::CreateNull(); - Physics::RayCastHit m_rayCastHit; + AzPhysics::SceneQueryHit m_rayCastHit; }; diff --git a/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.cpp b/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.cpp index 84f31f9e91..5c9cf6fcf2 100644 --- a/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.cpp +++ b/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.cpp @@ -18,8 +18,9 @@ #include #include +#include #include -#include +#include #include #include @@ -84,6 +85,11 @@ namespace WhiteBox m_physicsColliderConfiguration.SetPropertyVisibility(Physics::ColliderConfiguration::Offset, false); m_physicsColliderConfiguration.SetPropertyVisibility(Physics::ColliderConfiguration::IsTrigger, false); + if (m_sceneInterface = AZ::Interface::Get()) + { + m_editorSceneHandle = m_sceneInterface->GetSceneHandle(AzPhysics::EditorPhysicsSceneName); + } + // can't use buses here as EditorWhiteBoxComponentBus is addressed using component id. How do get component id? if (auto whiteBoxComponent = GetEntity()->FindComponent()) { @@ -101,6 +107,9 @@ namespace WhiteBox AzToolsFramework::Components::EditorComponentBase::Deactivate(); DestroyPhysics(); + + m_sceneInterface = nullptr; + m_editorSceneHandle = AzPhysics::InvalidSceneHandle; } void EditorWhiteBoxColliderComponent::BuildGameEntity(AZ::Entity* gameEntity) @@ -112,9 +121,12 @@ namespace WhiteBox void EditorWhiteBoxColliderComponent::OnTransformChanged( [[maybe_unused]] const AZ::Transform& local, const AZ::Transform& world) { - if (m_rigidBody) + if (m_sceneInterface) { - m_rigidBody->SetTransform(world); + if (auto* rigidBody = m_sceneInterface->GetSimulatedBodyFromHandle(m_editorSceneHandle, m_rigidBodyHandle)) + { + rigidBody->SetTransform(world); + } } } @@ -127,32 +139,25 @@ namespace WhiteBox ConvertToPhysicsMesh(whiteBox); - Physics::WorldBodyConfiguration bodyConfiguration; + AzPhysics::StaticRigidBodyConfiguration bodyConfiguration; bodyConfiguration.m_debugName = GetEntity()->GetName().c_str(); bodyConfiguration.m_entityId = GetEntityId(); bodyConfiguration.m_orientation = GetTransform()->GetWorldRotationQuaternion(); bodyConfiguration.m_position = GetTransform()->GetWorldTranslation(); + bodyConfiguration.m_colliderAndShapeData = AzPhysics::ShapeColliderPair(&m_physicsColliderConfiguration, &m_meshShapeConfiguration); - Physics::SystemRequestBus::BroadcastResult( - m_rigidBody, &Physics::SystemRequests::CreateStaticRigidBody, bodyConfiguration); - - if (m_rigidBody) + if (m_sceneInterface) { - AZStd::shared_ptr shape; - Physics::SystemRequestBus::BroadcastResult( - shape, &Physics::SystemRequests::CreateShape, m_physicsColliderConfiguration, m_meshShapeConfiguration); - - m_rigidBody->AddShape(shape); - - Physics::WorldRequestBus::Event(Physics::EditorPhysicsWorldId, &Physics::World::AddBody, *m_rigidBody); + m_rigidBodyHandle = m_sceneInterface->AddSimulatedBody(m_editorSceneHandle, &bodyConfiguration); } } void EditorWhiteBoxColliderComponent::DestroyPhysics() { - if (m_rigidBody) + if (m_sceneInterface) { - m_rigidBody.reset(); + m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_rigidBodyHandle); + m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; } } diff --git a/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.h b/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.h index 8592cd2001..5b46d0b99e 100644 --- a/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.h +++ b/Gems/WhiteBox/Code/Source/Components/EditorWhiteBoxColliderComponent.h @@ -15,12 +15,17 @@ #include "WhiteBoxColliderConfiguration.h" #include -#include #include +#include #include #include #include +namespace AzPhysics +{ + class SceneInterface; +} + namespace WhiteBox { //! Generates physics from white box mesh. @@ -58,11 +63,13 @@ namespace WhiteBox void ConvertToPhysicsMesh(const WhiteBoxMesh& whiteBox); + AzPhysics::SceneInterface* m_sceneInterface = nullptr; + AzPhysics::SceneHandle m_editorSceneHandle = AzPhysics::InvalidSceneHandle; + Physics::ColliderConfiguration m_physicsColliderConfiguration; //!< General physics collider configuration information. Physics::CookedMeshShapeConfiguration m_meshShapeConfiguration; //!< The physics representation of the mesh. - AZStd::unique_ptr - m_rigidBody; //!< Static rigid body to represent the White Box Mesh at edit time. + AzPhysics::SimulatedBodyHandle m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; //!< Handle to a static rigid body to represent the White Box Mesh at edit time. WhiteBoxColliderConfiguration m_whiteBoxColliderConfiguration; //!< White Box specific collider configuration information. }; diff --git a/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp b/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp index 984af6cc63..3179a2cd72 100644 --- a/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp +++ b/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp @@ -14,11 +14,14 @@ #include "WhiteBoxColliderComponent.h" +#include #include #include -#include +#include +#include #include -#include +#include +#include namespace WhiteBox { @@ -53,31 +56,54 @@ namespace WhiteBox void WhiteBoxColliderComponent::Activate() { + auto* sceneInterface = AZ::Interface::Get(); + if (sceneInterface == nullptr) + { + AZ_Error("WhiteBox", false, "Missing Physics Scene Interface, unble to Activate WhiteBoxColliderComponent"); + return; + } + + AzPhysics::SceneHandle defaultScene = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + if (defaultScene == AzPhysics::InvalidSceneHandle) + { + AZ_Error("WhiteBox", false, "Missing Default Physics Scene, unble to Activate WhiteBoxColliderComponent"); + return; + } + const AZ::EntityId entityId = GetEntityId(); AZ::Transform worldTransform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(worldTransform, entityId, &AZ::TransformInterface::GetWorldTM); - Physics::RigidBodyConfiguration bodyConfiguration; - bodyConfiguration.m_debugName = GetEntity()->GetName().c_str(); - bodyConfiguration.m_entityId = entityId; - bodyConfiguration.m_orientation = worldTransform.GetRotation(); - bodyConfiguration.m_position = worldTransform.GetTranslation(); - bodyConfiguration.m_kinematic = true; // note: this field is ignored in the WhiteBoxBodyType::Static case + // create shape + AZStd::shared_ptr shape; + Physics::SystemRequestBus::BroadcastResult( + shape, &Physics::SystemRequests::CreateShape, m_physicsColliderConfiguration, m_shapeConfiguration); // create rigid body switch (m_whiteBoxColliderConfiguration.m_bodyType) { case WhiteBoxBodyType::Kinematic: { - Physics::SystemRequestBus::BroadcastResult( - m_rigidBody, &Physics::SystemRequests::CreateRigidBody, bodyConfiguration); + AzPhysics::RigidBodyConfiguration bodyConfiguration; + bodyConfiguration.m_debugName = GetEntity()->GetName().c_str(); + bodyConfiguration.m_entityId = entityId; + bodyConfiguration.m_orientation = worldTransform.GetRotation(); + bodyConfiguration.m_position = worldTransform.GetTranslation(); + bodyConfiguration.m_kinematic = true; // note: this field is ignored in the WhiteBoxBodyType::Static case + bodyConfiguration.m_colliderAndShapeData = shape; + m_simulatedBodyHandle = sceneInterface->AddSimulatedBody(defaultScene, &bodyConfiguration); } break; case WhiteBoxBodyType::Static: { - Physics::SystemRequestBus::BroadcastResult( - m_rigidBody, &Physics::SystemRequests::CreateStaticRigidBody, bodyConfiguration); + AzPhysics::StaticRigidBodyConfiguration staticBodyConfiguration; + staticBodyConfiguration.m_debugName = GetEntity()->GetName().c_str(); + staticBodyConfiguration.m_entityId = entityId; + staticBodyConfiguration.m_orientation = worldTransform.GetRotation(); + staticBodyConfiguration.m_position = worldTransform.GetTranslation(); + staticBodyConfiguration.m_colliderAndShapeData = shape; + m_simulatedBodyHandle = sceneInterface->AddSimulatedBody(defaultScene, &staticBodyConfiguration); } break; default: @@ -86,26 +112,6 @@ namespace WhiteBox break; } - // create shape - AZStd::shared_ptr shape; - Physics::SystemRequestBus::BroadcastResult( - shape, &Physics::SystemRequests::CreateShape, m_physicsColliderConfiguration, m_shapeConfiguration); - - AZStd::visit( - [&shape](auto& rigidBody) - { - if (rigidBody) - { - // attach shape - rigidBody->AddShape(shape); - - // add body to the world - Physics::WorldRequestBus::Event( - Physics::DefaultPhysicsWorldId, &Physics::World::AddBody, *rigidBody); - } - }, - m_rigidBody); - AZ::TransformNotificationBus::Handler::BusConnect(entityId); } @@ -113,12 +119,15 @@ namespace WhiteBox { AZ::TransformNotificationBus::Handler::BusDisconnect(); - AZStd::visit( - [](auto& rigidBody) + if (auto* sceneInterface = AZ::Interface::Get()) + { + if (AzPhysics::SceneHandle defaultScene = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + defaultScene != AzPhysics::InvalidSceneHandle) { - rigidBody.reset(); - }, - m_rigidBody); + sceneInterface->RemoveSimulatedBody(defaultScene, m_simulatedBodyHandle); + } + } + m_simulatedBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; } void WhiteBoxColliderComponent::OnTransformChanged( @@ -130,16 +139,23 @@ namespace WhiteBox return worldTransform; }(); - if (auto rigidBody = AZStd::get_if>(&m_rigidBody)) + if (auto* sceneInterface = AZ::Interface::Get()) { - // move the rigid body kinematically so dynamic rigid bodies will be affected by the movement - (*rigidBody)->SetKinematicTarget(worldTransformWithoutScale); - } - else if (AZStd::get_if>(&m_rigidBody)) - { - AZ_WarningOnce( - "WhiteBox", false, - "The White Box Collider must be made Kinematic to respond to OnTransformChanged events"); + if (AzPhysics::SceneHandle defaultScene = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName); + defaultScene != AzPhysics::InvalidSceneHandle) + { + //if this is a rigid body update the transform, otherwise its static for just warn + if (auto* rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(defaultScene, m_simulatedBodyHandle))) + { + rigidBody->SetKinematicTarget(worldTransformWithoutScale); + } + else + { + AZ_WarningOnce( + "WhiteBox", false, + "The White Box Collider must be made Kinematic to respond to OnTransformChanged events"); + } + } } } } // namespace WhiteBox diff --git a/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.h b/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.h index e38b0fb593..1ad773652d 100644 --- a/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.h +++ b/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.h @@ -16,8 +16,9 @@ #include #include -#include #include +#include +#include namespace WhiteBox { @@ -51,8 +52,7 @@ namespace WhiteBox Physics::CookedMeshShapeConfiguration m_shapeConfiguration; //!< The physics representation of the mesh. Physics::ColliderConfiguration m_physicsColliderConfiguration; //!< General physics collider configuration information. - AZStd::variant, AZStd::unique_ptr> - m_rigidBody; //!< Rigid body to represent the White Box Mesh at runtime. + AzPhysics::SimulatedBodyHandle m_simulatedBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; //!< Simulated body to represent the White Box Mesh at runtime. WhiteBoxColliderConfiguration m_whiteBoxColliderConfiguration; //!< White Box specific collider configuration information. }; diff --git a/Templates/DefaultGem/Template/Code/CMakeLists.txt b/Templates/DefaultGem/Template/Code/CMakeLists.txt index ad9da2c414..8510dc53d5 100644 --- a/Templates/DefaultGem/Template/Code/CMakeLists.txt +++ b/Templates/DefaultGem/Template/Code/CMakeLists.txt @@ -46,7 +46,6 @@ ly_add_target( ly_add_target( NAME ${Name} ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} NAMESPACE Gem - OUTPUT_NAME Gem.${Name} FILES_CMAKE ${NameLower}_shared_files.cmake ${pal_dir}/${NameLower}_shared_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake diff --git a/Templates/DefaultProject/Template/.gitignore b/Templates/DefaultProject/Template/.gitignore new file mode 100644 index 0000000000..9a6d119b1b --- /dev/null +++ b/Templates/DefaultProject/Template/.gitignore @@ -0,0 +1,3 @@ +[Bb]uild/ +[Cc]ache/ +[Uu]ser/ \ No newline at end of file diff --git a/Templates/DefaultProject/Template/Code/${NameLower}_files.cmake b/Templates/DefaultProject/Template/Code/${NameLower}_files.cmake index 7ecc5c469d..459e33f547 100644 --- a/Templates/DefaultProject/Template/Code/${NameLower}_files.cmake +++ b/Templates/DefaultProject/Template/Code/${NameLower}_files.cmake @@ -15,4 +15,5 @@ set(FILES Source/${Name}SystemComponent.h runtime_dependencies.cmake tool_dependencies.cmake + server_dependencies.cmake ) diff --git a/Templates/DefaultProject/Template/Code/CMakeLists.txt b/Templates/DefaultProject/Template/Code/CMakeLists.txt index e4aa808c31..cb98254b3b 100644 --- a/Templates/DefaultProject/Template/Code/CMakeLists.txt +++ b/Templates/DefaultProject/Template/Code/CMakeLists.txt @@ -29,8 +29,8 @@ if(NOT PAL_TRAIT_${NameUpper}_SUPPORTED) endif() # We are on a supported platform, so add the ${Name} target -# Note: We include the common files and the platform specific files which are set in defaultprojectdource_files.cmake and -# in ${pal_dir}/defaultprojectdource_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake +# Note: We include the common files and the platform specific files which are set in ${NameLower}_files.cmake and +# in ${pal_dir}/${NameLower}_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake ly_add_target( NAME ${Name}.Static STATIC NAMESPACE Project @@ -43,12 +43,12 @@ ly_add_target( BUILD_DEPENDENCIES PRIVATE AZ::AzGameFramework + Gem::Atom_AtomBridge.Static ) ly_add_target( NAME ${Name} ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} NAMESPACE Project - OUTPUT_NAME Project.${Name} FILES_CMAKE ${NameLower}_shared_files.cmake ${pal_dir}/${NameLower}_shared_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake @@ -71,6 +71,7 @@ ly_add_project_dependencies( ${Name}.GameLauncher DEPENDENCIES_FILES runtime_dependencies.cmake + ${pal_dir}/${PAL_PLATFORM_NAME_LOWERCASE}_runtime_dependencies.cmake ) if(PAL_TRAIT_BUILD_HOST_TOOLS) @@ -84,6 +85,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS) Editor DEPENDENCIES_FILES tool_dependencies.cmake + ${pal_dir}/${PAL_PLATFORM_NAME_LOWERCASE}_tool_dependencies.cmake ) endif() @@ -94,7 +96,8 @@ if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) TARGETS ${Name}.ServerLauncher DEPENDENCIES_FILES - runtime_dependencies.cmake + server_dependencies.cmake + ${pal_dir}/${PAL_PLATFORM_NAME_LOWERCASE}_server_dependencies.cmake ) set_property(GLOBAL APPEND PROPERTY LY_LAUNCHER_SERVER_PROJECTS ${Name}) diff --git a/Templates/DefaultProject/Template/Code/Platform/Android/${NameLower}_android_files.cmake b/Templates/DefaultProject/Template/Code/Platform/Android/${NameLower}_android_files.cmake index d7112106d2..b774cd944f 100644 --- a/Templates/DefaultProject/Template/Code/Platform/Android/${NameLower}_android_files.cmake +++ b/Templates/DefaultProject/Template/Code/Platform/Android/${NameLower}_android_files.cmake @@ -10,4 +10,8 @@ # {END_LICENSE} set(FILES + PAL_android.cmake + android_runtime_dependencies.cmake + android_tool_dependencies.cmake + android_server_dependencies.cmake ) diff --git a/Templates/DefaultProject/Template/Code/Platform/Android/android_runtime_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Android/android_runtime_dependencies.cmake new file mode 100644 index 0000000000..a1ebd6e455 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Android/android_runtime_dependencies.cmake @@ -0,0 +1,14 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Vulkan.Private +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Android/android_server_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Android/android_server_dependencies.cmake new file mode 100644 index 0000000000..fe28e294e9 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Android/android_server_dependencies.cmake @@ -0,0 +1,13 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Android/android_tool_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Android/android_tool_dependencies.cmake new file mode 100644 index 0000000000..14e6f1aa4c --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Android/android_tool_dependencies.cmake @@ -0,0 +1,14 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES +) + diff --git a/Templates/DefaultProject/Template/Code/Platform/Linux/${NameLower}_linux_files.cmake b/Templates/DefaultProject/Template/Code/Platform/Linux/${NameLower}_linux_files.cmake index d7112106d2..58fc59d265 100644 --- a/Templates/DefaultProject/Template/Code/Platform/Linux/${NameLower}_linux_files.cmake +++ b/Templates/DefaultProject/Template/Code/Platform/Linux/${NameLower}_linux_files.cmake @@ -10,4 +10,8 @@ # {END_LICENSE} set(FILES + PAL_linux.cmake + linux_runtime_dependencies.cmake + linux_tool_dependencies.cmake + linux_server_dependencies.cmake ) diff --git a/Templates/DefaultProject/Template/Code/Platform/Linux/linux_runtime_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Linux/linux_runtime_dependencies.cmake new file mode 100644 index 0000000000..a54c22de8c --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Linux/linux_runtime_dependencies.cmake @@ -0,0 +1,15 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Vulkan.Private + Gem::Atom_RHI_Vulkan.Builders +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Linux/linux_server_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Linux/linux_server_dependencies.cmake new file mode 100644 index 0000000000..fe28e294e9 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Linux/linux_server_dependencies.cmake @@ -0,0 +1,13 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Linux/linux_tool_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Linux/linux_tool_dependencies.cmake new file mode 100644 index 0000000000..a1ebd6e455 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Linux/linux_tool_dependencies.cmake @@ -0,0 +1,14 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Vulkan.Private +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Mac/${NameLower}_mac_files.cmake b/Templates/DefaultProject/Template/Code/Platform/Mac/${NameLower}_mac_files.cmake index d9f2e6ec6b..7eb776e3a6 100644 --- a/Templates/DefaultProject/Template/Code/Platform/Mac/${NameLower}_mac_files.cmake +++ b/Templates/DefaultProject/Template/Code/Platform/Mac/${NameLower}_mac_files.cmake @@ -11,4 +11,8 @@ set(FILES ../../../Resources/Platform/Mac/Info.plist + PAL_mac.cmake + mac_runtime_dependencies.cmake + mac_tool_dependencies.cmake + mac_server_dependencies.cmake ) diff --git a/Templates/DefaultProject/Template/Code/Platform/Mac/mac_runtime_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Mac/mac_runtime_dependencies.cmake new file mode 100644 index 0000000000..e49929c6e1 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Mac/mac_runtime_dependencies.cmake @@ -0,0 +1,14 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Metal.Private +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Mac/mac_server_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Mac/mac_server_dependencies.cmake new file mode 100644 index 0000000000..fe28e294e9 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Mac/mac_server_dependencies.cmake @@ -0,0 +1,13 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Mac/mac_tool_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Mac/mac_tool_dependencies.cmake new file mode 100644 index 0000000000..eea4bb1dce --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Mac/mac_tool_dependencies.cmake @@ -0,0 +1,17 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Metal.Private + Gem::Atom_RHI_Metal.Builders + Gem::Atom_RHI_Vulkan.Builders + Gem::Atom_RHI_DX12.Builders +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Windows/${NameLower}_windows_files.cmake b/Templates/DefaultProject/Template/Code/Platform/Windows/${NameLower}_windows_files.cmake index d7112106d2..8fee85a163 100644 --- a/Templates/DefaultProject/Template/Code/Platform/Windows/${NameLower}_windows_files.cmake +++ b/Templates/DefaultProject/Template/Code/Platform/Windows/${NameLower}_windows_files.cmake @@ -10,4 +10,8 @@ # {END_LICENSE} set(FILES + PAL_windows.cmake + windows_runtime_dependencies.cmake + windows_tool_dependencies.cmake + windows_server_dependencies.cmake ) diff --git a/Templates/DefaultProject/Template/Code/Platform/Windows/windows_runtime_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Windows/windows_runtime_dependencies.cmake new file mode 100644 index 0000000000..c5e1b4bc2e --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Windows/windows_runtime_dependencies.cmake @@ -0,0 +1,15 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Vulkan.Private + Gem::Atom_RHI_DX12.Private +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Windows/windows_server_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Windows/windows_server_dependencies.cmake new file mode 100644 index 0000000000..fe28e294e9 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Windows/windows_server_dependencies.cmake @@ -0,0 +1,13 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES +) diff --git a/Templates/DefaultProject/Template/Code/Platform/Windows/windows_tool_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/Windows/windows_tool_dependencies.cmake new file mode 100644 index 0000000000..304f97d590 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/Windows/windows_tool_dependencies.cmake @@ -0,0 +1,17 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Vulkan.Private + Gem::Atom_RHI_Vulkan.Builders + Gem::Atom_RHI_DX12.Private + Gem::Atom_RHI_DX12.Builders +) diff --git a/Templates/DefaultProject/Template/Code/Platform/iOS/${NameLower}_ios_files.cmake b/Templates/DefaultProject/Template/Code/Platform/iOS/${NameLower}_ios_files.cmake index e2a1ed0d1f..41a6d13884 100644 --- a/Templates/DefaultProject/Template/Code/Platform/iOS/${NameLower}_ios_files.cmake +++ b/Templates/DefaultProject/Template/Code/Platform/iOS/${NameLower}_ios_files.cmake @@ -11,4 +11,8 @@ set(FILES ../Resources/Platform/iOS/Info.plist + PAL_ios.cmake + ios_runtime_dependencies.cmake + ios_tool_dependencies.cmake + ios_server_dependencies.cmake ) diff --git a/Templates/DefaultProject/Template/Code/Platform/iOS/ios_runtime_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/iOS/ios_runtime_dependencies.cmake new file mode 100644 index 0000000000..e49929c6e1 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/iOS/ios_runtime_dependencies.cmake @@ -0,0 +1,14 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Gem::Atom_RHI_Metal.Private +) diff --git a/Templates/DefaultProject/Template/Code/Platform/iOS/ios_server_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/iOS/ios_server_dependencies.cmake new file mode 100644 index 0000000000..fe28e294e9 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/iOS/ios_server_dependencies.cmake @@ -0,0 +1,13 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES +) diff --git a/Templates/DefaultProject/Template/Code/Platform/iOS/ios_tool_dependencies.cmake b/Templates/DefaultProject/Template/Code/Platform/iOS/ios_tool_dependencies.cmake new file mode 100644 index 0000000000..14e6f1aa4c --- /dev/null +++ b/Templates/DefaultProject/Template/Code/Platform/iOS/ios_tool_dependencies.cmake @@ -0,0 +1,14 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES +) + diff --git a/Templates/DefaultProject/Template/Code/runtime_dependencies.cmake b/Templates/DefaultProject/Template/Code/runtime_dependencies.cmake index 0770085492..ce8df8152d 100644 --- a/Templates/DefaultProject/Template/Code/runtime_dependencies.cmake +++ b/Templates/DefaultProject/Template/Code/runtime_dependencies.cmake @@ -11,9 +11,26 @@ set(GEM_DEPENDENCIES Project::${Name} - Gem::LyShine - Gem::TextureAtlas Gem::Maestro + Gem::TextureAtlas Gem::LmbrCentral + Gem::NvCloth + Gem::LyShine Gem::Camera + Gem::CameraFramework + Gem::Atom_RHI.Private + Gem::EMotionFX + Gem::Atom_RPI.Private + Gem::Atom_Feature_Common + Gem::ImGui + Gem::Atom_Bootstrap + Gem::Atom_Component_DebugCamera + Gem::AtomImGuiTools + Gem::AtomLyIntegration_CommonFeatures + Gem::EMotionFX_Atom + Gem::ImguiAtom + Gem::Atom_AtomBridge + Gem::GradientSignal + Gem::AtomFont + Gem::WhiteBox ) diff --git a/Templates/DefaultProject/Template/Code/server_dependencies.cmake b/Templates/DefaultProject/Template/Code/server_dependencies.cmake new file mode 100644 index 0000000000..3982bbb166 --- /dev/null +++ b/Templates/DefaultProject/Template/Code/server_dependencies.cmake @@ -0,0 +1,16 @@ +# {BEGIN_LICENSE} +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# {END_LICENSE} + +set(GEM_DEPENDENCIES + Project::${Name} + Gem::Maestro + Gem::LmbrCentral +) diff --git a/Templates/DefaultProject/Template/Code/tool_dependencies.cmake b/Templates/DefaultProject/Template/Code/tool_dependencies.cmake index afe6858925..010d45bd0f 100644 --- a/Templates/DefaultProject/Template/Code/tool_dependencies.cmake +++ b/Templates/DefaultProject/Template/Code/tool_dependencies.cmake @@ -11,11 +11,33 @@ set(GEM_DEPENDENCIES Project::${Name} - Gem::LyShine.Editor Gem::Maestro.Editor - Gem::SceneProcessing.Editor - Gem::ImageProcessing.Editor - Gem::LmbrCentral.Editor Gem::TextureAtlas + Gem::LmbrCentral.Editor + Gem::NvCloth.Editor + Gem::LyShine.Editor + Gem::SceneProcessing.Editor + Gem::EditorPythonBindings.Editor Gem::Camera.Editor + Gem::CameraFramework + Gem::Atom_RHI.Private + Gem::EMotionFX.Editor + Gem::Atom_RPI.Builders + Gem::Atom_RPI.Editor + Gem::Atom_Feature_Common.Builders + Gem::Atom_Feature_Common.Editor + Gem::ImGui.Editor + Gem::Atom_Bootstrap + Gem::Atom_Asset_Shader.Builders + Gem::Atom_Component_DebugCamera + Gem::AtomImGuiTools + Gem::AtomLyIntegration_CommonFeatures.Editor + Gem::EMotionFX_Atom.Editor + Gem::ImageProcessingAtom.Editor + Gem::Atom_AtomBridge.Editor + Gem::ImguiAtom + Gem::AtomFont + Gem::AtomToolsFramework.Editor + Gem::GradientSignal.Editor + Gem::WhiteBox.Editor ) diff --git a/Templates/DefaultProject/Template/Registry/assets_scan_folders.setreg b/Templates/DefaultProject/Template/Registry/assets_scan_folders.setreg index e3a84bd5c5..3da517eb83 100644 --- a/Templates/DefaultProject/Template/Registry/assets_scan_folders.setreg +++ b/Templates/DefaultProject/Template/Registry/assets_scan_folders.setreg @@ -5,7 +5,10 @@ { "SourcePaths": [ - "Assets" + "Assets", + "ShaderLib", + "Shaders", + "Registry" ] } } diff --git a/Templates/DefaultProject/template.json b/Templates/DefaultProject/template.json index 76edf18f87..10e3079f2e 100644 --- a/Templates/DefaultProject/template.json +++ b/Templates/DefaultProject/template.json @@ -10,6 +10,12 @@ ], "icon_path": "preview.png", "copyFiles": [ + { + "file": ".gitignore", + "origin": ".gitignore", + "isTemplated": false, + "isOptional": false + }, { "file": "CMakeLists.txt", "origin": "CMakeLists.txt", @@ -58,6 +64,24 @@ "isTemplated": true, "isOptional": false }, + { + "file": "Code/Platform/Android/android_runtime_dependencies.cmake", + "origin": "Code/Platform/Android/android_runtime_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Android/android_server_dependencies.cmake", + "origin": "Code/Platform/Android/android_server_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Android/android_tool_dependencies.cmake", + "origin": "Code/Platform/Android/android_tool_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, { "file": "Code/Platform/Linux/${NameLower}_linux_files.cmake", "origin": "Code/Platform/Linux/${NameLower}_linux_files.cmake", @@ -76,6 +100,24 @@ "isTemplated": true, "isOptional": false }, + { + "file": "Code/Platform/Linux/linux_runtime_dependencies.cmake", + "origin": "Code/Platform/Linux/linux_runtime_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Linux/linux_server_dependencies.cmake", + "origin": "Code/Platform/Linux/linux_server_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Linux/linux_tool_dependencies.cmake", + "origin": "Code/Platform/Linux/linux_tool_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, { "file": "Code/Platform/Mac/${NameLower}_mac_files.cmake", "origin": "Code/Platform/Mac/${NameLower}_mac_files.cmake", @@ -94,6 +136,24 @@ "isTemplated": true, "isOptional": false }, + { + "file": "Code/Platform/Mac/mac_runtime_dependencies.cmake", + "origin": "Code/Platform/Mac/mac_runtime_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Mac/mac_server_dependencies.cmake", + "origin": "Code/Platform/Mac/mac_server_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Mac/mac_tool_dependencies.cmake", + "origin": "Code/Platform/Mac/mac_tool_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, { "file": "Code/Platform/Windows/${NameLower}_shared_windows_files.cmake", "origin": "Code/Platform/Windows/${NameLower}_shared_windows_files.cmake", @@ -112,6 +172,24 @@ "isTemplated": true, "isOptional": false }, + { + "file": "Code/Platform/Windows/windows_runtime_dependencies.cmake", + "origin": "Code/Platform/Windows/windows_runtime_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Windows/windows_server_dependencies.cmake", + "origin": "Code/Platform/Windows/windows_server_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/Windows/windows_tool_dependencies.cmake", + "origin": "Code/Platform/Windows/windows_tool_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, { "file": "Code/Platform/iOS/${NameLower}_ios_files.cmake", "origin": "Code/Platform/iOS/${NameLower}_ios_files.cmake", @@ -130,6 +208,24 @@ "isTemplated": true, "isOptional": false }, + { + "file": "Code/Platform/iOS/ios_runtime_dependencies.cmake", + "origin": "Code/Platform/iOS/ios_runtime_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/iOS/ios_server_dependencies.cmake", + "origin": "Code/Platform/iOS/ios_server_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, + { + "file": "Code/Platform/iOS/ios_tool_dependencies.cmake", + "origin": "Code/Platform/iOS/ios_tool_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, { "file": "Code/Source/${Name}Module.cpp", "origin": "Code/Source/${Name}Module.cpp", @@ -154,6 +250,12 @@ "isTemplated": true, "isOptional": false }, + { + "file": "Code/server_dependencies.cmake", + "origin": "Code/server_dependencies.cmake", + "isTemplated": true, + "isOptional": false + }, { "file": "Code/tool_dependencies.cmake", "origin": "Code/tool_dependencies.cmake", @@ -510,6 +612,10 @@ } ], "createDirectories": [ + { + "dir": "Assets", + "origin": "Assets" + }, { "dir": "Code", "origin": "Code" diff --git a/Tests/BuildSystems/test_BuildBAT.py b/Tests/BuildSystems/test_BuildBAT.py index 56e436cc6c..1521508550 100755 --- a/Tests/BuildSystems/test_BuildBAT.py +++ b/Tests/BuildSystems/test_BuildBAT.py @@ -24,7 +24,7 @@ logger = logging.getLogger(__name__) @pytest.mark.BAT @pytest.mark.parametrize('spec', ['all']) -@pytest.mark.parametrize('project', ['SamplesProject']) +@pytest.mark.parametrize('project', ['AutomatedTesting']) class TestWindowsBuildConfig(object): """ diff --git a/Tests/editor/EditorScripts/assign_dynamic_slice.py b/Tests/editor/EditorScripts/assign_dynamic_slice.py deleted file mode 100755 index d1f301668f..0000000000 --- a/Tests/editor/EditorScripts/assign_dynamic_slice.py +++ /dev/null @@ -1,113 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C17211213: Assign Dynamic Slice -https://testrail.agscollab.com/index.php?/cases/view/17211213 -""" -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.math as math -import azlmbr.asset as asset -import azlmbr.bus as bus -import azlmbr.entity as entity -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as editor_utils -from PySide2 import QtWidgets -from PySide2.QtTest import QTest -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class AssignDynamicSlice(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="assign dynamic slice", args=["level"]) - - def run_test(self): - """ - Summary: - Dynamic slice can be assigned to a spawner on an entity - - Expected Behavior: - Dynamic slice is present in the file picker, can be added to - components, and is visible in game mode when spawned - - Test Steps: - 0) Open temporary test level - 1) Create an entity with a spawner component - 2) Add dynamic slice to the spawner component C17211213_visual_thunderbolt - 3) Set Spawn on activate to enabled - 4) Enter game mode - 5) Verify that the dynamic slice spawned and is visible in game mode - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def set_dynamic_slice_by_asset_path(entity_obj, asset_path): - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, 'GetAssetIdByPath', asset_path, math.Uuid(), False) - entity_obj.get_set_test(0, "Dynamic slice", asset_id) - - def set_spawn_checkbox_enabled(): - general.idle_wait(0.5) - editor_window = pyside_utils.get_editor_main_window() - entity_inspector = editor_window.findChildren(QtWidgets.QDockWidget, "Entity Inspector")[0] - spawn_activate_frame = entity_inspector.findChildren(QtWidgets.QFrame, "Spawn on activate")[0] - checkbox = spawn_activate_frame.findChildren(QtWidgets.QCheckBox)[0] - checkbox.click() - - # 0) Open temporary test level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 1) Create an entity with a spawner component - entity_postition = math.Vector3(125.0, 136.0, 32.0) - components_to_add = ["Spawner"] - - spawner_entity = editor_utils.Entity("Spawner") - spawner_entity.create_entity(entity_postition, components_to_add) - - # 2) Add dynamic slice to the spawner component C17211213_visual_thunderbolt - thunderbolt_path = os.path.join("slices", "Test", "C17211213_visual_thunderbolt.dynamicslice") - set_dynamic_slice_by_asset_path(spawner_entity, thunderbolt_path) - - # 3) Set Spawn on activate to enabled - set_spawn_checkbox_enabled() - - # 4) Enter game mode - general.enter_game_mode() - general.idle_wait(0.5) - - # 5) Verify that the dynamic slice spawned and is visible in game mode - slice_name = "thunderbolt" - thunderbolt_id = general.find_game_entity(slice_name) - check_valid = thunderbolt_id.IsValid() - assert check_valid, f"No entity found for {slice_name}" - if check_valid: - print(f"Entity found for {slice_name}") - - general.exit_game_mode() - - - -test = AssignDynamicSlice() -test.run() diff --git a/Tests/editor/EditorScripts/basic_docked_tools.py b/Tests/editor/EditorScripts/basic_docked_tools.py deleted file mode 100755 index e7f426a1f9..0000000000 --- a/Tests/editor/EditorScripts/basic_docked_tools.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6376081: Basic Function: Docked/Undocked Tools -https://testrail.agscollab.com/index.php?/cases/view/6376081 -""" - -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as entity -import azlmbr.legacy.general as general - -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper -import Tests.ly_shared.pyside_utils as pyside_utils - -from PySide2 import QtCore, QtWidgets, QtTest - - -class TestBasicDockedTools(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_docked_tools: ", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Test that tools still work as expected when docked together. - - Expected Behavior: - Multiple tools can be docked together. - Tools function while docked together and the main editor responds appropriately. - - Test Steps: - 1) Open the tools and dock them together in a floating tabbed widget. - 2) Perform actions in the docked tools to verify they still work as expected. - 2.1) Select the Entity Outliner in the floating window. - 2.2) Select an Entity in the Entity Outliner. - 2.3) Select the Entity Inspector in the floating window. - 2.4) Change the name of the selected Entity via the Entity Inspector. - 2.5) Select the Console inside the floating window. - 2.6) Send a console command. - 2.7) Check the Editor to verify all changes were made. - - :return: None - """ - - # Create a level since we are going to be dealing with an Entity. - self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # Make sure the Entity Outliner, Entity Inspector and Console tools are open - general.open_pane("Entity Outliner (PREVIEW)") - general.open_pane("Entity Inspector") - general.open_pane("Console") - - # Create an Entity to test with - entity_original_name = 'MyTestEntity' - entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', entity.EntityId()) - editor.EditorEntityAPIBus(bus.Event, 'SetName', entity_id, entity_original_name) - - editor_window = pyside_utils.get_editor_main_window() - entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - - # 1) Open the tools and dock them together in a floating tabbed widget. - # We drag/drop it over the viewport since it doesn't allow docking, so this will undock it - render_overlay = editor_window.findChild(QtWidgets.QWidget, "renderOverlay") - pyside_utils.drag_and_drop(entity_outliner, render_overlay) - - # We need to grab a new reference to the Entity Outliner QDockWidget because when it gets moved - # to the floating window, its parent changes so the wrapped intance we had becomes invalid - entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - - # Dock the Entity Inspector tabbed with the floating Entity Outliner - entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector") - pyside_utils.drag_and_drop(entity_inspector, entity_outliner) - - # We need to grab a new reference to the Entity Inspector QDockWidget because when it gets moved - # to the floating window, its parent changes so the wrapped intance we had becomes invalid - entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector") - - # Dock the Console tabbed with the floating Entity Inspector - console = editor_window.findChild(QtWidgets.QDockWidget, "Console") - pyside_utils.drag_and_drop(console, entity_inspector) - - # Check to ensure all the tools are parented to the same QStackedWidget - def check_all_panes_tabbed(): - entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector") - entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - console = editor_window.findChild(QtWidgets.QDockWidget, "Console") - entity_inspector_parent = entity_inspector.parentWidget() - entity_outliner_parent = entity_outliner.parentWidget() - console_parent = console.parentWidget() - print(f"Entity Inspector parent = {entity_inspector_parent}, Entity Outliner parent = {entity_outliner_parent}, Console parent = {console_parent}") - return isinstance(entity_inspector_parent, QtWidgets.QStackedWidget) and (entity_inspector_parent == entity_outliner_parent) and (entity_outliner_parent == console_parent) - - success = await pyside_utils.wait_for(check_all_panes_tabbed, timeout=3.0) - if success: - print("The tools are all docked together in a tabbed widget") - - # 2.1,2) Select an Entity in the Entity Outliner. - entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector") - entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - console = editor_window.findChild(QtWidgets.QDockWidget, "Console") - object_tree = entity_outliner.findChild(QtWidgets.QTreeView, "m_objectTree") - test_entity_index = pyside_utils.find_child_by_pattern(object_tree, entity_original_name) - object_tree.clearSelection() - object_tree.setCurrentIndex(test_entity_index) - selected_object_names = general.get_names_of_selected_objects() - if len(selected_object_names) == 1 and selected_object_names[0] == entity_original_name: - print("Entity Outliner works when docked, can select an Entity") - - # 2.3,4) Change the name of the selected Entity via the Entity Inspector. - entity_inspector_name_field = entity_inspector.findChild(QtWidgets.QLineEdit, "m_entityNameEditor") - expected_new_name = "DifferentName" - entity_inspector_name_field.setText(expected_new_name) - QtTest.QTest.keyClick(entity_inspector_name_field, QtCore.Qt.Key_Enter) - entity_new_name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id) - if entity_new_name == expected_new_name: - print(f"Entity Inspector works when docked, Entity name changed to {entity_new_name}") - - # 2.5,6) Send a console command. - console_line_edit = console.findChild(QtWidgets.QLineEdit, "lineEdit") - console_line_edit.setText("e_Vegetation=1") - QtTest.QTest.keyClick(console_line_edit, QtCore.Qt.Key_Enter) - - -test = TestBasicDockedTools() -test.run() diff --git a/Tests/editor/EditorScripts/basic_edit_menu_options.py b/Tests/editor/EditorScripts/basic_edit_menu_options.py deleted file mode 100755 index f46b814d99..0000000000 --- a/Tests/editor/EditorScripts/basic_edit_menu_options.py +++ /dev/null @@ -1,134 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C24064529: Base Edit Menu Options -https://testrail.agscollab.com/index.php?/cases/view/24064529 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as hydra -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestEditMenuOptions(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="edit_menu_options", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with Edit Menu options and verify if all the options are working. - - Expected Behavior: - The Edit menu functions normally. - - Test Steps: - 1) Create a temp level - 2) Interact with Edit Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - edit_menu_options = [ - ("Undo",), - ("Redo",), - ("Duplicate",), - ("Delete",), - ("Select All",), - ("Invert Selection",), - ("Hide Selection",), - ("Show Selection",), - ("Show Last Hidden",), - ("Unhide All",), - ("Modify", "Parent"), - ("Modify", "Un-Parent"), - ("Modify", "Align", "Align to grid"), - ("Modify", "Align", "Align to object"), - ("Modify", "Align", "Align object to surface"), - ("Modify", "Constrain", "Constrain to X axis"), - ("Modify", "Constrain", "Constrain to Y axis"), - ("Modify", "Constrain", "Constrain to Z axis"), - ("Modify", "Constrain", "Constrain to XY plane"), - ("Modify", "Constrain", "Constrain to terrain/geometry"), - ("Modify", "Snap", "Snap To Grid"), - ("Modify", "Snap", "Snap angle"), - ("Modify", "Fast Rotate", "Rotate X Axis"), - ("Modify", "Fast Rotate", "Rotate Y Axis"), - ("Modify", "Fast Rotate", "Rotate Z Axis"), - ("Modify", "Fast Rotate", "Rotate Angle"), - ("Modify", "Transform Mode", "Select mode"), - ("Modify", "Transform Mode", "Move"), - ("Modify", "Transform Mode", "Rotate"), - ("Modify", "Transform Mode", "Scale"), - ("Modify", "Transform Mode", "Select terrain"), - ("Lock selection",), - ("Unlock all",), - ("Editor Settings", "Global Preferences"), - ("Editor Settings", "Graphics Settings"), - ("Editor Settings", "Editor Settings Manager"), - ("Editor Settings", "Graphics Performance", "PC", "Very High"), - ("Editor Settings", "Graphics Performance", "PC", "High"), - ("Editor Settings", "Graphics Performance", "PC", "Medium"), - ("Editor Settings", "Graphics Performance", "PC", "Low"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "Very High"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "High"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "Medium"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "Low"), - ("Editor Settings", "Graphics Performance", "Android", "Very High"), - ("Editor Settings", "Graphics Performance", "Android", "High"), - ("Editor Settings", "Graphics Performance", "Android", "Medium"), - ("Editor Settings", "Graphics Performance", "Android", "Low"), - ("Editor Settings", "Graphics Performance", "iOS", "Very High"), - ("Editor Settings", "Graphics Performance", "iOS", "High"), - ("Editor Settings", "Graphics Performance", "iOS", "Medium"), - ("Editor Settings", "Graphics Performance", "iOS", "Low"), - ("Editor Settings", "Graphics Performance", "Apple TV"), - ("Editor Settings", "Keyboard Customization", "Customize Keyboard"), - ("Editor Settings", "Keyboard Customization", "Export Keyboard Settings"), - ("Editor Settings", "Keyboard Customization", "Import Keyboard Settings"), - ] - - # 1) Create and open the temp level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - # 2) Interact with Edit Menu options - try: - editor_window = pyside_utils.get_editor_main_window() - for option in edit_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "Edit", *option) - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - except Exception as e: - print(e) - -test = TestEditMenuOptions() -test.run() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/basic_edit_menu_options_new_viewport.py b/Tests/editor/EditorScripts/basic_edit_menu_options_new_viewport.py deleted file mode 100755 index f8ee3344c9..0000000000 --- a/Tests/editor/EditorScripts/basic_edit_menu_options_new_viewport.py +++ /dev/null @@ -1,118 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16780783: Base Edit Menu Options (New Viewport Interaction Model) -https://testrail.agscollab.com/index.php?/cases/view/16780783 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as hydra -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestEditMenuOptionsNewViewport(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="edit_menu_options: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with Edit Menu options and verify if all the options are working. - - Expected Behavior: - The Edit menu functions normally. - - Test Steps: - 1) Create a temp level - 2) Interact with Edit Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - edit_menu_options = [ - ("Undo",), - ("Redo",), - ("Duplicate",), - ("Delete",), - ("Select All",), - ("Invert Selection",), - ("Toggle Pivot Location",), - ("Reset Entity Transform",), - ("Reset Manipulator",), - ("Hide Selection",), - ("Show All",), - ("Modify", "Snap", "Snap angle"), - ("Modify", "Transform Mode", "Move"), - ("Modify", "Transform Mode", "Rotate"), - ("Modify", "Transform Mode", "Scale"), - ("Lock Selection",), - ("Unlock All Entities",), - ("Editor Settings", "Global Preferences"), - ("Editor Settings", "Graphics Settings"), - ("Editor Settings", "Editor Settings Manager"), - ("Editor Settings", "Graphics Performance", "PC", "Very High"), - ("Editor Settings", "Graphics Performance", "PC", "High"), - ("Editor Settings", "Graphics Performance", "PC", "Medium"), - ("Editor Settings", "Graphics Performance", "PC", "Low"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "Very High"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "High"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "Medium"), - ("Editor Settings", "Graphics Performance", "OSX Metal", "Low"), - ("Editor Settings", "Graphics Performance", "Android", "Very High"), - ("Editor Settings", "Graphics Performance", "Android", "High"), - ("Editor Settings", "Graphics Performance", "Android", "Medium"), - ("Editor Settings", "Graphics Performance", "Android", "Low"), - ("Editor Settings", "Graphics Performance", "iOS", "Very High"), - ("Editor Settings", "Graphics Performance", "iOS", "High"), - ("Editor Settings", "Graphics Performance", "iOS", "Medium"), - ("Editor Settings", "Graphics Performance", "iOS", "Low"), - ("Editor Settings", "Graphics Performance", "Apple TV"), - ("Editor Settings", "Keyboard Customization", "Customize Keyboard"), - ("Editor Settings", "Keyboard Customization", "Export Keyboard Settings"), - ("Editor Settings", "Keyboard Customization", "Import Keyboard Settings"), - ] - - # 1) Create and open the temp level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - # 2) Interact with Edit Menu options - try: - editor_window = pyside_utils.get_editor_main_window() - for option in edit_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "Edit", *option) - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - except Exception as e: - print(e) - -test = TestEditMenuOptionsNewViewport() -test.run() diff --git a/Tests/editor/EditorScripts/basic_file_menu_options.py b/Tests/editor/EditorScripts/basic_file_menu_options.py deleted file mode 100755 index 214b861d0d..0000000000 --- a/Tests/editor/EditorScripts/basic_file_menu_options.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C24064528: The File menu options function normally -https://testrail.agscollab.com/index.php?/cases/view/24064528 -C16780778: The File menu options function normally-New view interaction Model enabled -https://testrail.agscollab.com/index.php?/cases/view/16780778 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestFileMenuOptions(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="file_menu_options: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with File Menu options and verify if all the options are working. - - Expected Behavior: - The File menu functions normally. - - Test Steps: - 1) Open level - 2) Interact with File Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - file_menu_options = [ - ("New Level",), - ("Open Level",), - ("Import",), - ("Save",), - ("Save As",), - ("Save Level Statistics",), - ("Project Settings", "Switch Projects"), - ("Project Settings", "Configure Gems"), - ("Show Log File",), - ("Resave All Slices",), - ("Upgrade Legacy Entities",), - ] - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - # 2) Interact with File Menu options - try: - editor_window = pyside_utils.get_editor_main_window() - for option in file_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "File", *option) - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - except Exception as e: - print(e) - - -test = TestFileMenuOptions() -test.run() diff --git a/Tests/editor/EditorScripts/basic_function_lock_hide.py b/Tests/editor/EditorScripts/basic_function_lock_hide.py deleted file mode 100755 index 66a825fd65..0000000000 --- a/Tests/editor/EditorScripts/basic_function_lock_hide.py +++ /dev/null @@ -1,168 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17218881: Basic Function: Locking & Hiding -https://testrail.agscollab.com/index.php?/cases/view/17218881 -""" - -import azlmbr.bus as bus -import azlmbr.math as math -import azlmbr.editor as editor -from PySide2 import QtWidgets -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as hydra -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class BasicFunctionLockHideTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_function_lock_hide", args=["level"]) - - def run_test(self): - """ - Summary: - Basic Function: Locking & Hiding - - Expected Behavior: - 1) Entities can be hidden. - 2) Hiding a parent entity hides its children. - 3) Entities can be shown. - 4) Showing a parent entity shows its children. - 5) Entities can be locked. - 6) Locking a parent entity locks its children. - 7) Locked entities cannot be interacted with in the Viewport. - 8) Entities can be unlocked. - 9) Unlocking a parent entity unlocks its children. - 10)Unlocked entities can be interacted with in the Viewport. - 11)Entities can be reordered even when locked or hidden. - - Test Steps: - 1) Open a new level - 2) Create an entity and 3 child entity - 3) Click on show/hide button to hide entities and verify if they are hidden - 4) Click on show/hide button to show entities and verify if they are hidden - 5) Click on lock/unlock entities to lock entities and verify if they are locked - 6) Click on lock/unlock entities to unlock entities and verify if they are unlocked - 7) Create 2 new entities - 8) Hide/Lock the newly created entities - 9) Move the newly created entites under parent entity - - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def is_hidden(id): - return editor.EditorEntityInfoRequestBus(bus.Event, "IsHidden", id) - - def is_locked(id): - return editor.EditorEntityInfoRequestBus(bus.Event, "IsLocked", id) - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - editor_window = pyside_utils.get_editor_main_window() - outliner_widget = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)").widget() - - # 2) Create an entity and 3 child entity - entity_position = math.Vector3(200.0, 200.0, 38.0) - component_to_add = ["Mesh"] - parent = hydra.Entity("Entity2") - parent.create_entity(entity_position, component_to_add) - - child_1 = hydra.Entity("Entity3") - child_1.create_entity(entity_position, component_to_add, parent.id) - - child_2 = hydra.Entity("Entity4") - child_2.create_entity(entity_position, component_to_add, parent.id) - - child_3 = hydra.Entity("Entity5") - child_3.create_entity(entity_position, component_to_add, parent.id) - - # 3) Click on show/hide button to hide entities and verify if they are hidden - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 0).data() == "Entity2") - parent_model_index = pyside_utils.find_child_by_pattern(tree, "Entity2") - show_hide_parent = parent_model_index.siblingAtColumn(1) - pyside_utils.item_view_index_mouse_click(tree, show_hide_parent) - self.wait_for_condition(lambda: is_hidden(parent.id)) - entities_hidden = ( - is_hidden(parent.id) and is_hidden(child_1.id) and is_hidden(child_2.id) and is_hidden(child_3.id) - ) - print(f"Child entities are hidden when parent entity is hidden: {entities_hidden}") - - # 4) Click on show/hide button to show entities and verify if they are hidden - pyside_utils.item_view_index_mouse_click(tree, show_hide_parent) - self.wait_for_condition(lambda: not is_hidden(parent.id)) - entities_hidden = ( - not is_hidden(parent.id) - and not is_hidden(child_1.id) - and not is_hidden(child_2.id) - and not is_hidden(child_3.id) - ) - print(f"Child entities are shown when parent entity is shown: {entities_hidden}") - - # 5) Click on lock/unlock entities to lock entities and verify if they are locked - lock_unlock_parent = parent_model_index.siblingAtColumn(2) - pyside_utils.item_view_index_mouse_click(tree, lock_unlock_parent) - self.wait_for_condition(lambda: is_locked(parent.id)) - entities_locked = ( - is_locked(parent.id) and is_locked(child_1.id) and is_locked(child_2.id) and is_locked(child_3.id) - ) - print(f"Child entities are locked when parent entity is locked: {entities_locked}") - - # 6) Click on lock/unlock entities to unlock entities and verify if they are unlocked - pyside_utils.item_view_index_mouse_click(tree, lock_unlock_parent) - self.wait_for_condition(lambda: not is_locked(parent.id)) - entities_unlocked = ( - not is_locked(parent.id) - and not is_locked(child_1.id) - and not is_locked(child_2.id) - and not is_locked(child_3.id) - ) - print(f"Child entities are unlocked when parent entity is unlocked: {entities_unlocked}") - - # 7) Create 2 new entities - new_entity_1 = hydra.Entity("Entity6") - new_entity_1.create_entity(entity_position, component_to_add) - new_entity_2 = hydra.Entity("Entity7") - new_entity_2.create_entity(entity_position, component_to_add) - - self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 0).data() == "Entity6") - - # 8) Hide/Lock the newly created entities - new_entity_1_mi = pyside_utils.find_child_by_pattern(tree, "Entity6") - show_hide_new_entity = new_entity_1_mi.siblingAtColumn(1) - - new_entity_2_mi = pyside_utils.find_child_by_pattern(tree, "Entity7") - lock_unlock_new_entity = new_entity_2_mi.siblingAtColumn(2) - - pyside_utils.item_view_index_mouse_click(tree, show_hide_new_entity) - pyside_utils.item_view_index_mouse_click(tree, lock_unlock_new_entity) - - # 9) Move the newly created entites under parent entity - new_entity_1.set_test_parent_entity(parent) - new_entity_2.set_test_parent_entity(parent) - - -test = BasicFunctionLockHideTest() -test.run() diff --git a/Tests/editor/EditorScripts/basic_global_preferences.py b/Tests/editor/EditorScripts/basic_global_preferences.py deleted file mode 100755 index f240589afc..0000000000 --- a/Tests/editor/EditorScripts/basic_global_preferences.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6321491: Basic Function: Global Preferences -https://testrail.agscollab.com/index.php?/cases/view/6321491 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class BasicGlobalPreferencesTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_global_preferences: ") - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Verify if we can change some value in the Global Preferences in Editor Settings - - Expected Behavior: - Global preferences can be changed and saved. - - Test Steps: - 1) Change Toolbar Icon size in Global Preferences - 2) Verify if the Toolbar Icon size changed - 3) Reset the Toolbar Icon Size - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - async def change_tool_button_size(size): - action = pyside_utils.get_action_for_menu_path( - editor_window, "Edit", "Editor Settings", "Global Preferences" - ) - print(f"Global Preferences action triggered") - pyside_utils.trigger_action_async(action) - active_modal_widget = await pyside_utils.wait_for_modal_widget() - combo_box = await pyside_utils.wait_for_child_by_hierarchy( - active_modal_widget, - "EditorPreferencesDialog", - ..., - "propertyEditor", - ..., - dict(type=QtWidgets.QFrame, text="Toolbar Icon Size"), - ..., - QtWidgets.QComboBox - ) - combo_box.setCurrentIndex(combo_box.findText(size)) - button_box = active_modal_widget.findChild(QtWidgets.QDialogButtonBox, "buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - print(f"Toolbar Icon size set to {size}") - await pyside_utils.wait_for_destroyed(active_modal_widget) - - # 1) Change Toolbar Icon size in Global Preferences - editor_window = pyside_utils.get_editor_main_window() - play_game_button = await pyside_utils.wait_for_child_by_hierarchy( - editor_window, - ..., - "EditMode", - ..., - dict(type=QtWidgets.QToolButton, text="Play Game") - ) - - # First, make sure the toolbar icon size is the Default - await change_tool_button_size("Default") - initial_size = play_game_button.size() - - await change_tool_button_size("Large") - def check_size(): - current_size = play_game_button.size() - return initial_size.height() < current_size.height() and initial_size.width() < current_size.width() - - # 2) Verify if the Toolbar Icon size changed - await pyside_utils.wait_for_condition(check_size) - print("Toolbar Icon size changed in Global Preferences") - - # 3) Reset the Toolbar Icon Size - await change_tool_button_size("Default") - - -test = BasicGlobalPreferencesTest() -test.run() diff --git a/Tests/editor/EditorScripts/basic_toolbar_function.py b/Tests/editor/EditorScripts/basic_toolbar_function.py deleted file mode 100755 index 60de4158d2..0000000000 --- a/Tests/editor/EditorScripts/basic_toolbar_function.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6351301: Basic Function: Toolbars -https://testrail.agscollab.com/index.php?/cases/view/6351301 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestBasicToolBarFunction(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_toolbar_function: ", args=["level"]) - - def run_test(self): - """ - Summary: - Enable all menu toolbars and click between options in each of the toolbars and then disable all the toolbars. - - Expected Behavior: - All menu toolbars can be enabled and disbled with each toolbar is functional and options can be selected. - - Test Steps: - 1) Create new level with an Entity - 2) Enable each of the toolbars in the list. - 3) Verify options from toolbars can be selected - 3.1) "Play Game" option from EditMode toolbar - 3.2) "Go to selected object" option from Object toolbar - 4) Disable each of the toolbars in the list. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - editor_window = pyside_utils.get_editor_main_window() - - def fetch_vector3_parts(vec3): - x = vec3.get_property("x") - y = vec3.get_property("y") - z = vec3.get_property("z") - return (x, y, z) - - def enable_disable_toolbar(toolbar, enable=True): - toolbar = editor_window.findChild(QtWidgets.QToolBar, i) - action = toolbar.toggleViewAction() - if enable: - # Enable the toolbar - if not toolbar.isVisible(): - action.trigger() - if toolbar.isVisible(): - print(f"{i} toolbar is enabled") - - else: - # Disable the toolbar - if toolbar.isVisible(): - action.trigger() - if not toolbar.isVisible(): - print(f"{i} toolbar is disbaled") - - menu_toolbar_list = [ - "EditMode", - "Object", - "debugViewsToolbar", - "environmentModesToolbar", - "viewModesToolbar", - ] - - # 1) Create new level with an Entity - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - entityId = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId.EntityId()) - - # 2) Enable each of the toolbars in the list. - for i in menu_toolbar_list: - enable_disable_toolbar(i) - - # 3) Select options from toolbar - # 3.1) "Play Game" option from EditMode toolbar - editors_toolbar = editor_window.findChild(QtWidgets.QToolBar, "EditMode") - for i in editors_toolbar.children(): - if isinstance(i, QtWidgets.QToolButton) and i.text() == "Play Game": - play_game_button = i - break - # Click on the tool button to verify ToolBar functionality - play_game_button.click() - general.idle_wait(1.0) - - if general.is_in_game_mode(): - print("In game mode: Play game ToolButton is responsive") - general.exit_game_mode() - - # 3.2) "Go to selected object" option from Object toolbar - position = fetch_vector3_parts(general.get_current_view_position()) - - # Click on the tool button to verify ToolBar functionality - object_toolbar = editor_window.findChild(QtWidgets.QToolBar, "Object") - for i in object_toolbar.children(): - if isinstance(i, QtWidgets.QToolButton) and i.text() == "Go to selected object": - general.select_object(editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entityId)) - general.idle_wait(1.0) - i.click() - break - general.idle_wait(1.0) - new_pos = fetch_vector3_parts(general.get_current_view_position()) - if new_pos != position: - print("Go to selected object option is responsive") - - # 4) Disable each of the toolbars in the list. - for i in menu_toolbar_list: - enable_disable_toolbar(i, False) - - -test = TestBasicToolBarFunction() -test.run() diff --git a/Tests/editor/EditorScripts/basic_ui_appearence_function.py b/Tests/editor/EditorScripts/basic_ui_appearence_function.py deleted file mode 100755 index 235b4f5cc1..0000000000 --- a/Tests/editor/EditorScripts/basic_ui_appearence_function.py +++ /dev/null @@ -1,127 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317014: Basic UI Appearance & Function -https://testrail.agscollab.com/index.php?/cases/view/6317014 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestBasicUIAppearence(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_ui_appearence_function: ", args=["level"]) - - def run_test(self): - """ - Summary: - Open Lumberyard editor and check if basic UI components are loaded and responsive. - - Expected Behavior: - Elements below of the UI are loaded and responsive. - Menus - Toolbars - Tools - Viewport - - Test Steps: - 1) Open level - 2) Verify if Tools are responsive - Opens some tool by triggering the Tool Menu actions and - verifies if the tool has been opened and active. - 3) Verify if Menu items are responsive - Triggers the MenuBar actions of the Editor window. - 4) Verify if Viewport is responsive - Simulates right-click on the viewport to create a new Entity. - 5) Verify if Toolbars are responsive - Uses the "EditMode" toolbar to click on the Play Game - ToolButton, and then verifies if the editor is in game mode. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - def on_action_trigger(): - print("Tools Action triggered") - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - editor_window = pyside_utils.get_editor_main_window() - # 2) Verify if Tools are responsive - tool_action = pyside_utils.get_action_for_menu_path(editor_window, "Tools", "Script Canvas") - tool_action.triggered.connect(on_action_trigger) - tool_action.trigger() - tool_action.triggered.disconnect(on_action_trigger) - # Verify if the tool is opened - def is_script_canvas_active_window(): - tool = editor_window.findChild(QtWidgets.QWidget, "Script Canvas") - if tool: - return tool.isActiveWindow() - - return False - if self.wait_for_condition(is_script_canvas_active_window, 2.0): - print("Tool opened") - - # 3) Verify if Menu items are responsive - menu_bar = editor_window.menuBar() - for action in menu_bar.actions(): - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - - # 4) Verify if Viewport is responsive - # Clear the current selection and create a new Entity via the viewport right-click menu - render_overlay = editor_window.findChild(QtWidgets.QWidget, "renderOverlay") - general.clear_selection() - pyside_utils.trigger_context_menu_entry(render_overlay.parent(), "Create entity") - selected_entities = editor.ToolsApplicationRequestBus(bus.Broadcast, 'GetSelectedEntities') - if len(selected_entities) == 1: - entity_id = selected_entities[0] - name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id) - if name == "Entity2": - print("Viewport is responsive") - - # 5) Verify if Toolbars are responsive - editors_toolbar = editor_window.findChild(QtWidgets.QToolBar, "EditMode") - play_game_button = pyside_utils.find_child_by_pattern(editors_toolbar, "Play Game") - - # Click on the tool button to verify ToolBar functionality - play_game_button.click() - - if self.wait_for_condition(lambda: general.is_in_game_mode()): - print("In game mode: Play game ToolButton is responsive") - general.exit_game_mode() - - -test = TestBasicUIAppearence() -test.run() diff --git a/Tests/editor/EditorScripts/basic_ui_scaling.py b/Tests/editor/EditorScripts/basic_ui_scaling.py deleted file mode 100755 index 16e3284916..0000000000 --- a/Tests/editor/EditorScripts/basic_ui_scaling.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317020: Basic UI Scaling -https://testrail.agscollab.com/index.php?/cases/view/6317020 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestBasicUIScalingFunction(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_ui_scaling: ", args=["level"]) - - def run_test(self): - """ - Summary: - Resize the editor window and verify if the editor scaling works. - - Expected Behavior: - The editor window/docked widgets is scalable/resizable into windowed mode. - - Test Steps: - 1) Resize the editor window couple of times - 2) Resize the docked widget - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def check_size(widget, widget_name, width, height): - if widget.geometry().width() == width and widget.geometry().height() == height: - print(f"{widget_name} size is {width} X {height}") - else: - print("Widget size not equal to expected value") - - # 1) Resize the editor window couple of times - # wait util the editor opens - general.idle_wait(3.0) - editor_window = pyside_utils.get_editor_main_window() - editor_window.resize(1000, 500) - check_size(editor_window, "Editor", 1000, 500) - - editor_window.resize(2000, 1000) - check_size(editor_window, "Editor", 2000, 1000) - - # 2) Resize the docked widget - main_window = editor_window.findChild(QtWidgets.QMainWindow) - asset_browser = main_window.findChild(QtWidgets.QDockWidget, "Asset Browser") - asset_browser.resize(100, 100) - check_size(asset_browser, "Docked Widget", 100, 100) - - -test = TestBasicUIScalingFunction() -test.run() diff --git a/Tests/editor/EditorScripts/basic_viewport_configuration.py b/Tests/editor/EditorScripts/basic_viewport_configuration.py deleted file mode 100755 index 233c8fa333..0000000000 --- a/Tests/editor/EditorScripts/basic_viewport_configuration.py +++ /dev/null @@ -1,119 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317035: Basic Viewport Configuration -https://testrail.agscollab.com/index.php?/cases/view/6317035 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from PySide2.QtTest import QTest -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class BasicViewportConfigurationTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_viewport_configuration", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Verify id the basic viewport configuration works as expected. - - Expected Behavior: - 1) Layout Configuration dialog opens. - 2) Layout configuration can be changed. - 3) All viewports function properly and independently of one another. - 4) The viewport is reverted to a single, large window. - - Test Steps: - 1) Open a new level - 2) Configure the viewport layer to a different layout - 3) Verify if viewport 1 is functional - 4) Verify if viewport 2 is functional - 5) Reset the layout back to original - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def verify_viewport_function(viewport_main_window_object): - """ - To check if the viewport camera controls are working, we can use the key press 'Left Arrow' - which manuallly would have moved the camera to its left. So by simulating the Left Arrow press and - comparing the current view position before and after the key press, we can verify if the view has indeed - been modified and there by confirming if viewport is active. - """ - viewport = viewport_main_window_object.findChildren(QtWidgets.QWidget, "renderOverlay")[0].parent() - initial_x = general.get_current_view_position().x - viewport.setFocus() - QTest.keyPress(viewport, Qt.Key_Left, Qt.NoModifier) - general.idle_wait(0.5) - QTest.keyRelease(viewport, Qt.Key_Left, Qt.NoModifier, delay=2) - current_x = general.get_current_view_position().x - return current_x < initial_x - - async def select_layout(layout_index): - action = pyside_utils.get_action_for_menu_path(editor_window, "View", "Viewport", "Configure Layout") - pyside_utils.trigger_action_async(action) - active_modal_widget = await pyside_utils.wait_for_modal_widget() - layout_config_dialog = active_modal_widget.findChild(QtWidgets.QDialog, "CLayoutConfigDialog") - list_view = layout_config_dialog.findChild(QtWidgets.QListView, "m_layouts") - pyside_utils.item_view_mouse_click(list_view, layout_index) - button_box = layout_config_dialog.findChild(QtWidgets.QDialogButtonBox, "m_buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - print(f"Layout set to {layout_index}") - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - editor_window = pyside_utils.get_editor_main_window() - - # 2) Configure the viewport layer to a different layout - # In this case layout with 2 viewports placed side by side is selected - await select_layout(1) - main_window = editor_window.findChild(QtWidgets.QMainWindow).findChild(QtWidgets.QMainWindow) - central_widget = main_window.centralWidget() - await pyside_utils.wait_for_condition(lambda: central_widget.findChild(QtWidgets.QSplitter) is not None) - splitter = central_widget.findChild(QtWidgets.QSplitter) - - # 3) Verify if viewport 1 is functional - await pyside_utils.wait_for_condition(lambda: verify_viewport_function(splitter.children()[0]), 3.0) - print(f"Viewport 1 camera controls are functional: {verify_viewport_function(splitter.children()[0])}") - - # 4) Verify if viewport 2 is functional - await pyside_utils.wait_for_condition(lambda: verify_viewport_function(splitter.children()[1]), 3.0) - print(f"Viewport 2 camera controls are functional: {verify_viewport_function(splitter.children()[1])}") - - # 5) Reset the layout back to original - await select_layout(0) - -test = BasicViewportConfigurationTest() -test.run() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/basic_window_docking.py b/Tests/editor/EditorScripts/basic_window_docking.py deleted file mode 100755 index 98d06e5e20..0000000000 --- a/Tests/editor/EditorScripts/basic_window_docking.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C18668804: Basic Window Docking System Tests -https://testrail.agscollab.com/index.php?/cases/view/18668804 -""" - -import azlmbr.legacy.general as general - -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper -import Tests.ly_shared.pyside_utils as pyside_utils - -from PySide2 import QtCore, QtWidgets - - -class TestBasicWindowDocking(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_window_docking: ") - - def run_test(self): - """ - Summary: - Test basic docking behavior by undocking the Entity Outliner, and - then docking on the edges around the main Editor window. - - Expected Behavior: - The window becomes undocked and floats on its own. - The window can be docked to the main Editor's edges and is resized to fit. - - Test Steps: - 1) Click on the Entity Outliner's title bar and drag it away to undock it. - 2) Click and drag the Entity Outliner to empty borders along the main Editor (top/bottom/left/right) - - :return: None - """ - - # Make sure the Entity Outliner is open - general.open_pane("Entity Outliner (PREVIEW)") - - editor_window = pyside_utils.get_editor_main_window() - entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - - # 1) Click on the Entity Outliner's title bar and drag it away to undock it. - # We drag/drop it over the viewport since it doesn't allow docking, so this will undock it - render_overlay = editor_window.findChild(QtWidgets.QWidget, "renderOverlay") - pyside_utils.drag_and_drop(entity_outliner, render_overlay) - - # Make sure the Entity Outliner is in a different QMainWindow than the main Editor QMainWindow, - # which means it has been properly undocked (in a floating window) - main_window = editor_window.findChild(QtWidgets.QMainWindow) - if entity_outliner.parentWidget() != main_window: - print("Entity Outliner is in a floating window") - - # 2) Click and drag the Entity Outliner to empty borders along the main Editor (top/bottom/left/right) - - # We need to grab a new reference to the Entity Outliner QDockWidget because when it gets moved - # to the floating window, its parent changes so the wrapped intance we had becomes invalid - entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - - # Dock to absolute top of main window - edge_offset = 10 # The absolute drop zones are 25px wide, chose 10px as an in between - main_window_rect = main_window.rect() - main_window_center = main_window.rect().center() - top_center = QtCore.QPoint(main_window_center.x(), edge_offset) - pyside_utils.drag_and_drop(entity_outliner, main_window, QtCore.QPoint(), top_center) - - # Make sure the Entity Outliner is now in the top area of the main Editor window - if main_window.dockWidgetArea(entity_outliner) == QtCore.Qt.DockWidgetArea.TopDockWidgetArea: - print("Entity Outliner docked in top area") - - # Dock to absolute right of main window - right_center = QtCore.QPoint(main_window_rect.right() - edge_offset, main_window_center.y()) - pyside_utils.drag_and_drop(entity_outliner, main_window, QtCore.QPoint(), right_center) - - # Make sure the Entity Outliner is now in the right area of the main Editor window - if main_window.dockWidgetArea(entity_outliner) == QtCore.Qt.DockWidgetArea.RightDockWidgetArea: - print("Entity Outliner docked in right area") - - # Dock to absolute bottom of main window - bottom_center = QtCore.QPoint(main_window_center.x(), main_window_rect.bottom() - edge_offset) - pyside_utils.drag_and_drop(entity_outliner, main_window, QtCore.QPoint(), bottom_center) - - # Make sure the Entity Outliner is now in the bottom area of the main Editor window - if main_window.dockWidgetArea(entity_outliner) == QtCore.Qt.DockWidgetArea.BottomDockWidgetArea: - print("Entity Outliner docked in bottom area") - - # Dock to absolute left of main window - left_center = QtCore.QPoint(edge_offset, main_window_center.y()) - pyside_utils.drag_and_drop(entity_outliner, main_window, QtCore.QPoint(), left_center) - - # Make sure the Entity Outliner is now in the left area of the main Editor window - if main_window.dockWidgetArea(entity_outliner) == QtCore.Qt.DockWidgetArea.LeftDockWidgetArea: - print("Entity Outliner docked in left area") - - -test = TestBasicWindowDocking() -test.run() diff --git a/Tests/editor/EditorScripts/basic_workflow_layers.py b/Tests/editor/EditorScripts/basic_workflow_layers.py deleted file mode 100755 index 1d4599ee9f..0000000000 --- a/Tests/editor/EditorScripts/basic_workflow_layers.py +++ /dev/null @@ -1,164 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6384949: Basic Workflow: Layers -https://testrail.agscollab.com/index.php?/cases/view/6384949 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as editor_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as entity -import azlmbr.layers as layers -import azlmbr.math as math -from typing import Optional -from PySide2 import QtWidgets -from PySide2.QtGui import QContextMenuEvent -from PySide2.QtCore import QObject, QEvent, QPoint -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestBasicWorkflowLayers(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="basic_workflow_layers: ", args=["level"]) - - def run_test(self): - """ - Summary: - Basic Workflow: Layers. - - Test Steps: - 1) Open level - 2) Create layer in the Entity Outliner - 3) Create entity and Drag the entity into the layer - 4) Create another entity and Drag entities out of the layer - 5) Create a second layer and Drag the second layer into the first layer - 6) Save layer - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_entity_count_name(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - def verify_parent( - entity_to_check, expected_parent_entity, child_name, parent_name, additional_pretext: Optional[str] = "" - ): - actual_parent_id = editor.EditorEntityInfoRequestBus(bus.Event, "GetParent", entity_to_check) - if actual_parent_id.ToString() == expected_parent_entity.ToString(): - print(f"{additional_pretext} The parent entity of {child_name} is : {parent_name}") - - def set_parent(chilld_entity, parent_entity): - editor.EditorEntityAPIBus(bus.Event, "SetParent", chilld_entity, parent_entity) - - class EventFilter(QObject): - def eventFilter(self, obj, event): - if event.type() == QEvent.Type.ChildPolished: - print("ChildPolished event received") - menu = obj.children()[-1] - action = pyside_utils.find_child_by_property(menu, QtWidgets.QAction, "text", "Save layer") - action.trigger() - menu.clear() - return False - return False - - def on_focus_changed(old, new): - active_modal_widget = QtWidgets.QApplication.activeModalWidget() - general.idle_wait(1.0) - button_box = active_modal_widget.findChild(QtWidgets.QDialogButtonBox, "qt_msgbox_buttonbox") - button_box.button(QtWidgets.QDialogButtonBox.Save).click() - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Create layer in the Entity Outliner - first_layer_entity_id = layers.EditorLayerComponent_CreateLayerEntityFromName("Layer1") - if get_entity_count_name("Layer1*"): - print("First Layer is created") - - # 3) Create entity and Drag the entity into the layer - entity_postition = math.Vector3(125.0, 136.0, 32.0) - first_entity = editor_utils.Entity("Entity1") - first_entity.create_entity(entity_postition, []) - if get_entity_count_name("Entity1"): - print("First Entity is created") - set_parent(first_entity.id, first_layer_entity_id) - verify_parent(first_entity.id, first_layer_entity_id, first_entity.name, "Layer1", "Original Check:") - - # 4) Create another entity and Drag entities out of the layer - second_entity = editor_utils.Entity("Entity2") - second_entity.create_entity(entity_postition, []) - if get_entity_count_name("Entity2"): - print("Second Entity is created") - set_parent(second_entity.id, first_layer_entity_id) - verify_parent(second_entity.id, first_layer_entity_id, second_entity.name, "Layer1", "Original Check:") - # Drag entities out of the layer - set_parent(first_entity.id, entity.EntityId()) - set_parent(second_entity.id, entity.EntityId()) - verify_parent(first_entity.id, entity.EntityId(), first_entity.name, "", "After Drag:") - verify_parent(second_entity.id, entity.EntityId(), second_entity.name, "", "After Drag:") - - # 5) Create a second layer and Drag the second layer into the first layer - second_layer_entity_id = layers.EditorLayerComponent_CreateLayerEntityFromName("Layer2") - if get_entity_count_name("Layer2*"): - print("Second Layer is created") - set_parent(second_layer_entity_id, first_layer_entity_id) - verify_parent(second_layer_entity_id, first_layer_entity_id, "Layer2", "Layer1", "After Drag:") - - # 6) Save layer - app = QtWidgets.QApplication.instance() - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - entity_outliner = main_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - outliner_main_window = entity_outliner.findChild(QtWidgets.QMainWindow) - wid_1 = outliner_main_window.findChild(QtWidgets.QWidget) - wid_2 = wid_1.findChild(QtWidgets.QWidget) - tree = outliner_main_window.findChildren(QtWidgets.QTreeView, "m_objectTree")[0] - general.clear_selection() - general.select_object(editor.EditorEntityInfoRequestBus(bus.Event, "GetName", first_layer_entity_id)) - event_filter = EventFilter() - try: - app.focusChanged.connect(on_focus_changed) - wid_2.installEventFilter(event_filter) - context_menu_event = QContextMenuEvent(QContextMenuEvent.Mouse, QPoint(0, 0)) - app.sendEvent(tree, context_menu_event) - general.idle_wait(1.0) - except Exception as e: - print(e) - finally: - app.focusChanged.disconnect(on_focus_changed) - wid_2.removeEventFilter(event_filter) - - -test = TestBasicWorkflowLayers() -test.run() diff --git a/Tests/editor/EditorScripts/camera_component.py b/Tests/editor/EditorScripts/camera_component.py deleted file mode 100755 index 46c4fd4c5c..0000000000 --- a/Tests/editor/EditorScripts/camera_component.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C17219007: Camera Component -https://testrail.agscollab.com/index.php?/cases/view/17219007 -""" - -import os -import sys - -import azlmbr.legacy.general as general -import azlmbr.math as math -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as editor_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestCameraComponentHelper(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="camera_component: ", args=["level"]) - - def run_test(self): - """ - Summary: - Ensure that the camera component behaves properly in the editor and the - proper camera settings are being populated. - - Expected Behavior: - Camera fov is visible in the Viewport - The Camera entity is populated in the Viewport Selector - The Viewport perspective is changed to the camera - The Viewport perspective is switched back to the default editor camera - - Test Steps: - 1) Create or open any level - 2) Create an entity with a Camera component - 3) Click "Be this camera" - 4) Save the position of the floating camera viewport and compare against entity - 5) Click "Return to default editor camera" - 6) Save the position of the current viewport and compare against entity - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_button(button_text): - return pyside_utils.find_child_by_pattern(entity_inspector, button_text) - - # 1) Create or open any level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - editor_window = pyside_utils.get_editor_main_window() - entity_inspector = editor_window.findChildren(QtWidgets.QDockWidget, "Entity Inspector")[0] - - # 2) Create an entity with a Camera component - entity_postition = math.Vector3(200.0, 200.0, 32.0) - components_to_add = ["Camera"] - - test_entity = editor_utils.Entity("Temp_Entity") - test_entity.create_entity(entity_postition, components_to_add) - if test_entity.id.isValid(): - print("Entity created with camera component") - - # 3) Click "Be this camera" - button_text = "Be this camera" - self.wait_for_condition(lambda: get_button(button_text) is not None, 2.0) - button = get_button(button_text) - if button: - button.click() - print("Button 'Be this camera' clicked") - - # 4) Save the position of the floating camera viewport and compare against entity - self.wait_for_condition(lambda: general.get_current_view_position() == entity_postition, 1.0) - camera_position = general.get_current_view_position() - assert camera_position == entity_postition, "Camera positions did not change upon clicking 'Be this camera'" - print("Camera has shifted after clicking 'Be this camera' button") - - # 5) Click "Return to default editor camera" - button_text = "Return to default editor camera" - self.wait_for_condition(lambda: get_button(button_text) is not None, 2.0) - button = get_button(button_text) - if button: - button.click() - print("Button 'Return to default editor camera' clicked") - - # 6) Save the position of the current viewport and compare against entity - self.wait_for_condition(lambda: general.get_current_view_position() != entity_postition, 1.0) - camera_position = general.get_current_view_position() - assert camera_position != entity_postition, "Camera positions did not change upon clicking 'Return to default editor camera'" - print("Camera has shifted after clicking 'Return to default editor camera' button") - - -test = TestCameraComponentHelper() -test.run() diff --git a/Tests/editor/EditorScripts/component_list_contents.py b/Tests/editor/EditorScripts/component_list_contents.py deleted file mode 100755 index 4685217ed5..0000000000 --- a/Tests/editor/EditorScripts/component_list_contents.py +++ /dev/null @@ -1,154 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C16798661: Component List Contents -https://testrail.agscollab.com/index.php?/cases/view/16798661 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import azlmbr.math as math -from PySide2 import QtWidgets, QtTest, QtCore -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class ComponentListContentsTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="component_list_contents", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Select an entity. Click "Add Component" in the Entity Inspector. - Verify components are sorted into categories. - Expand / collapse component categories. - - Expected Behavior: - Component categories are expanded / collapsed as expected. - - Test Steps: - 1) Open level - 2) Create entity - 3) Select the newly created entity - 4) Click "Add Component" in the Entity Inspector. - 5) Verify list of components are sorted into categories. - 6) Collapse the first category. - 7) Expand the category which was just collapsed. - 8) Add a valid component to the entity. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # Make sure the Entity Inspector is open - general.open_pane('Entity Inspector') - - # 2) Create entity - entity_position = math.Vector3(125.0, 136.0, 32.0) - entity_id = editor.ToolsApplicationRequestBus( - bus.Broadcast, "CreateNewEntityAtPosition", entity_position, EntityId.EntityId() - ) - if entity_id.IsValid(): - print("Entity Created") - - # 3) Select the newly created entity - general.clear_selection() - general.select_object("Entity2") - - # Get the component type ID for our Box Shape - component_name = "Box Shape" - type_ids = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', [component_name], - EntityId.EntityType().Game) - component_type_id = type_ids[0] - - # Sanity check to make sure our Entity didn't already have the Box Shape component for some reason - had_component = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entity_id, component_type_id) - if had_component: - print("Box Shape already existed on Entity.") - - # 4) Click Add Component - general.idle_wait(0.5) - add_comp_btn = pyside_utils.find_child_by_hierarchy( - pyside_utils.get_editor_main_window(), ..., "Entity Inspector", ..., "m_addComponentButton") - add_comp_btn.click() - # Wait 0.5s to ensure component is added and rendered, especially when adding components - # continuously to the entity - general.idle_wait(0.5) - - popup = None - search_frame = None - def hasPopup(): - nonlocal popup - nonlocal search_frame - popup = QtWidgets.QApplication.activePopupWidget() - focus = QtWidgets.QApplication.focusWidget() - if isinstance(focus, QtWidgets.QLineEdit) and popup: - search_frame = popup.findChild(QtWidgets.QFrame, "SearchFrame") - if search_frame is not None: - return True - await pyside_utils.wait_for_condition(hasPopup) - - # To ensure we get an updated tree after the component name is set - general.idle_wait(0) - tree = popup.findChild(QtWidgets.QTreeView, "Tree") - QtTest.QTest.keyClick(tree, Qt.Key_Down, Qt.NoModifier) - while tree.indexBelow(tree.currentIndex()) != QtCore.QModelIndex(): - # 6) Collapse the first category (which is "AI") - # "Behavior Tree" is the first component in category "AI" - if tree.currentIndex().data(Qt.DisplayRole) == "Behavior Tree": - QtTest.QTest.keyClick(tree, Qt.Key_Left, Qt.NoModifier) - QtTest.QTest.keyClick(tree, Qt.Key_Left, Qt.NoModifier) - if tree.currentIndex().data(Qt.DisplayRole) == "AI": - print("Successfully collapsed category.") - - # 7) Expand the category which was just collapsed. - QtTest.QTest.keyClick(tree, Qt.Key_Right, Qt.NoModifier) - QtTest.QTest.keyClick(tree, Qt.Key_Right, Qt.NoModifier) - if tree.currentIndex().data(Qt.DisplayRole) == "Behavior Tree": - print("Successfully expanded category.") - break - - QtTest.QTest.keyClick(tree, Qt.Key_Down, Qt.NoModifier) - - # 8) Add the component (based on passed "component_name" variable) to entity - component_index = pyside_utils.find_child_by_pattern(tree, component_name) - tree.setCurrentIndex(component_index) - QtTest.QTest.keyClick(tree, Qt.Key_Enter, Qt.NoModifier) - - # After selecting the Box Shape from the component palette, make sure the component exists on our Entity now - has_component = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entity_id, component_type_id) - if has_component: - print("Box Shape successfully added.") - -test = ComponentListContentsTest() -test.run() diff --git a/Tests/editor/EditorScripts/component_list_filtering.py b/Tests/editor/EditorScripts/component_list_filtering.py deleted file mode 100755 index 209af7dc3a..0000000000 --- a/Tests/editor/EditorScripts/component_list_filtering.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C16877221: Component List Filtering -https://testrail.agscollab.com/index.php?/cases/view/16877221 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as entity -import azlmbr.math as math -from PySide2 import QtWidgets, QtTest, QtCore -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class ComponentListFilteringTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="component_list_filtering", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Select an entity. Click "Add Component" in the Entity Inspector. - Type the name of a valid component in the component search field, clear the search field and finally - type an invalid component name. - The test verifies the component list is filtered correctly in all these cases. - - Expected Behavior: - 1) Components are filtered as you type narrowing down to the desired component. - 2) Components are filtered with each character deleted, eventually restoring the entire component list when the - field is empty. - 3) Components are filtered until there are no entries present. - - Test Steps: - 1) Open level - 2) Create entity - 3) Select the newly created entity - 4) Click "Add Component" in the Entity Inspector. - 5) Type component name in search field. - 6) Verify list of components are filtered per the typed component name. - 7) Delete text in search field. - 8) Verify the list is restored. - 9) Type an invalid component name in search field. - 10) Verify the component list is empty as expected. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - async def search_component(component_name, expected_row_count=None): - # Click the "Add Component" button in the Entity Inspector and - # then enter the specified `component_name` into its search field - pyside_utils.click_button_async(add_comp_btn) - popup = await pyside_utils.wait_for_popup_widget() - search_frame = popup.findChild(QtWidgets.QFrame, "SearchFrame") - search_text = search_frame.findChild(QtWidgets.QLineEdit, "SearchText") - search_text.setText(component_name) - - # To ensure we get an updated tree after the component name is set, we - # need to wait until the rowCount matches what we expect, since the - # ComponentPaletteWidget::UpdateSearch is queued. - def row_count_matches(): - tree = popup.findChild(QtWidgets.QTreeView, "Tree") - row_count = tree.model().rowCount() - if expected_row_count is not None: - return row_count == expected_row_count - - # Else, if expected_row_count was left as None, then just wait until - # the tree model has been populated with anything - return row_count > 0 - - await pyside_utils.wait_for_condition(row_count_matches) - - # Print out the result based on what is populated in the component palette tree - tree = popup.findChild(QtWidgets.QTreeView, "Tree") - row_count = tree.model().rowCount() - component_index = pyside_utils.find_child_by_pattern(tree, text=component_name, type=QtCore.QModelIndex) - if component_index and component_index.isValid(): - print(f"{component_name} : Valid filtered component list") - elif row_count == 0: - print(f"{component_name} : Empty component list") - else: - print("Full component list") - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # Make sure the Entity Inspector is open - general.open_pane('Entity Inspector') - - # 2) Create entity - entity_id = editor.ToolsApplicationRequestBus( - bus.Broadcast, "CreateNewEntity", entity.EntityId() - ) - - # 3) Select the newly created entity - editor.ToolsApplicationRequestBus(bus.Broadcast, 'SetSelectedEntities', [entity_id]) - # Give the Entity Inspector time to fully create its contents - general.idle_wait(0.0) - - # 4) Click Add Component - editor_window = pyside_utils.get_editor_main_window() - entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector") - add_comp_btn = entity_inspector.findChild(QtWidgets.QPushButton, "m_addComponentButton") - - # 5,6) Search for a valid component name, verify list is properly filtered - component_name_to_search = "Box Shape" - await search_component(component_name_to_search, 1) - - # 7,8) Delete the search box, verify full list is loaded - component_name_to_search = "" - await search_component(component_name_to_search) - - # 9,10) Search for an invalid component name, verify the list is empty - component_name_to_search = "Invalid Component Name !@#$" - await search_component(component_name_to_search, 0) - -test = ComponentListFilteringTest() -test.run() diff --git a/Tests/editor/EditorScripts/conflicting_components.py b/Tests/editor/EditorScripts/conflicting_components.py deleted file mode 100755 index cf96453f73..0000000000 --- a/Tests/editor/EditorScripts/conflicting_components.py +++ /dev/null @@ -1,293 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -16929884: Conflicting Components -https://testrail.agscollab.com/index.php?/cases/view/16929884 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.editor as editor -import azlmbr.bus as bus -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.entity as entity - -from azlmbr.entity import EntityId -from PySide2 import QtWidgets, QtTest, QtCore -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestConflictingComponents(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="conflicting_components: ", args=["level"]) - - def run_test(self): - """ - Summary: - Create conflicting components on an entity, test activating and deactivated each. - - Expected Behavior: - Conflicting compoennts are deactivated when appropriate. - - Test Steps: - 1) Create new level - 2) Create an entity - 3) Create a box shape component on the entity - 4) Create a cylinder shape component on the entity - 5) Check both components have warnings and activate/delete buttons - 6) Select Activate on the cylinder shape - 7) Check that the cylinder is active and the box is not active - 8) Right click on the box shape and enable it - 9) Check delete/activate options exist on both components - 10) delete the cylinder shape - 11) Check that the cylinder is deleted and the box is enabled - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_component_type_id(component_type_name): - # Generate List of Component Types - component_list = editor.EditorComponentAPIBus(bus.Broadcast, 'BuildComponentTypeNameList') - - if len(component_list) == 0: - print("Component List returned incorrectly.") - return False, 0 - - # Get Component Types for Mesh and Comment - type_ids_list = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', - [component_type_name], entity.EntityType().Game) - - if len(type_ids_list) == 0: - print("Type Ids List returned incorrectly.") - return False, 0 - - return True, type_ids_list[0] - - def create_component_of_type(entity_id, component_type_name): - result, component_type_id = get_component_type_id(component_type_name) - if not result: - print("Failed to get " + component_type_name + " component id.") - return None - - has_component_before_add = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entity_id, - component_type_id) - - if not has_component_before_add: - print("Entity does not have " + component_type_name + " component before add.") - - # Add an ActorComponent to the entity. - component_outcome = editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', entity_id, - [component_type_id]) - - if component_outcome.IsSuccess(): - print(component_type_name + " component added to entity.") - else: - return None - - components = component_outcome.GetValue() - component = components[0] - - has_component_after_add = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entity_id, - component_type_id) - - if has_component_after_add and len(components) == 1: - print("Entity has " + component_type_name + " component after add.") - else: - return None - - return component - - def get_inspector_component_by_index(index): - inspector_dock = editor_window.findChild(QtWidgets.QWidget, "Entity Inspector") - entity_inspector = inspector_dock.findChild(QtWidgets.QMainWindow) - - child_widget = entity_inspector.findChild(QtWidgets.QWidget) - if child_widget is None: - return False, None - - general.idle_wait(1.0) - comp_list_contents = ( - child_widget.findChild(QtWidgets.QScrollArea, "m_componentList") - .findChild(QtWidgets.QWidget, "qt_scrollarea_viewport") - .findChild(QtWidgets.QWidget, "m_componentListContents") - ) - - if comp_list_contents is None or index >= len(comp_list_contents.children()): - return False, None - - return True, comp_list_contents.children()[index] - - def get_box_and_cylinder_component_inspector(): - result, box_frame = get_inspector_component_by_index(2) - - result, cylinder_frame = get_inspector_component_by_index(3) - - return box_frame, cylinder_frame - - def is_just_first_component_enabled(component1, component2): - c1_active = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', component1) - c2_active = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', component2) - - if c1_active and not c2_active: - return True - - return False - - def fail_test(msg): - print(msg) - print("Test Failed.") - sys.exit() - - create_level_result = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - if not create_level_result: - fail_test("New level failed.") - - EditorTestHelper.after_level_load(self) - - # Create a new entity. - new_entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId()) - - if not new_entity_id.IsValid(): - print("Failed to create new entity.") - - # Select the entity so that it appears in the inspector. - editor.ToolsApplicationRequestBus(bus.Broadcast, 'SetSelectedEntities', [new_entity_id]) - - # Create both shape components. - box_component = create_component_of_type(new_entity_id, "Box Shape") - if box_component is None: - fail_test("Failed to create Box Shape component.") - - cylinder_component = create_component_of_type(new_entity_id, "Cylinder Shape") - if cylinder_component is None: - fail_test("Failed to create Box Shape component.") - - # Check inspector windows exist for both shapes - box_frame, cylinder_frame = get_box_and_cylinder_component_inspector() - if box_frame is None: - fail_test("Could not find inspector for box shape.") - if cylinder_frame is None: - fail_test("Could not find inspector for cylinder shape.") - - # Check both shape inspectors have delete and activate buttons. - box_del_btn = pyside_utils.find_child_by_pattern(box_frame, "Delete component") - box_activate_btn = pyside_utils.find_child_by_pattern(box_frame, "Activate this component") - if box_del_btn is None or box_activate_btn is None: - fail_test("Failed to find buttons on box component.") - - cylinder_del_btn = pyside_utils.find_child_by_pattern(cylinder_frame, "Delete component") - cylinder_activate_btn = pyside_utils.find_child_by_pattern(cylinder_frame, "Activate this component") - if cylinder_del_btn is None or cylinder_activate_btn is None: - fail_test("Failed to find buttons on cylinder component.") - - # Check that just the box shape is enabled. - just_box_enabled = is_just_first_component_enabled(box_component, cylinder_component) - if not just_box_enabled: - fail_test("Incorrectly enabled components.") - - # Press Activate on cylinder - QtTest.QTest.mouseClick(cylinder_activate_btn, Qt.LeftButton, Qt.NoModifier) - - # Re-get the inspector windows to ensure they're up to date. - box_frame, cylinder_frame = get_box_and_cylinder_component_inspector() - - # Check that neither shape inspector now has delete or activate buttons. - - box_del_btn = pyside_utils.find_child_by_pattern(box_frame, "Delete component") - box_activate_btn = pyside_utils.find_child_by_pattern(box_frame, "Activate this component") - if box_del_btn is not None or box_activate_btn is not None: - fail_test("Found buttons on box component when disabled.") - - cylinder_del_btn = pyside_utils.find_child_by_pattern(cylinder_frame, "Delete component") - cylinder_activate_btn = pyside_utils.find_child_by_pattern(cylinder_frame, "Activate this component") - if cylinder_del_btn is not None or cylinder_activate_btn is not None: - fail_test("Found buttons on cylinder component when active.") - - # Check that the cylinder is now enabled and not the box. - just_cylinder_enabled = is_just_first_component_enabled(cylinder_component, box_component) - if not just_cylinder_enabled: - fail_test("Incorrectly enabled components.") - - # Click on the box frame to activate it or we might get the wrong context menu - QtTest.QTest.mouseClick(box_frame, Qt.LeftButton, Qt.NoModifier) - - general.idle_wait(1.0) - - # Pop up box component context menu and select the Enable component option - pyside_utils.trigger_context_menu_entry(box_frame, "Enable component") - - # Check that both components have the buttons again - box_frame, cylinder_frame = get_box_and_cylinder_component_inspector() - - box_del_btn = pyside_utils.find_child_by_pattern(box_frame, "Delete component") - box_activate_btn = pyside_utils.find_child_by_pattern(box_frame, "Activate this component") - if box_del_btn is None or box_activate_btn is None: - fail_test("Failed to find buttons on box component.") - - cylinder_del_btn = pyside_utils.find_child_by_pattern(cylinder_frame, "Delete component") - cylinder_activate_btn = pyside_utils.find_child_by_pattern(cylinder_frame, "Activate this component") - if cylinder_del_btn is None or cylinder_activate_btn is None: - fail_test("Failed to find buttons on cylinder component.") - - # Press "Delete component" on the Cylinder Shape. - QtTest.QTest.mouseClick(cylinder_del_btn, Qt.LeftButton, Qt.NoModifier) - - general.idle_wait(1.0) - - # Check it's gone. - result, component_type_id = get_component_type_id("Cylinder Shape") - if not result: - fail_test("Failed to get Cylinder Shape component id.") - - has_component_after_delete = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', new_entity_id, - component_type_id) - - if has_component_after_delete: - fail_test("Cylinder Shape still exists.") - - box_frame, cylinder_frame = get_box_and_cylinder_component_inspector() - - # Ensure the activate and delete buttons are gone from the box inspector. - box_del_btn = pyside_utils.find_child_by_pattern(box_frame, "Delete component") - box_activate_btn = pyside_utils.find_child_by_pattern(box_frame, "Activate this component") - if box_del_btn is not None or box_activate_btn is not None: - fail_test("Found buttons on box component when active.") - - # Check the box is now enabled. - box_active = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', box_component) - if not box_active: - fail_test("Box not active.") - - print("Conflicting components test successful.") - - -editor_window = pyside_utils.get_editor_main_window() -main_window = editor_window.findChild(QtWidgets.QMainWindow) -app = QtWidgets.QApplication.instance() -test = TestConflictingComponents() -test.run() diff --git a/Tests/editor/EditorScripts/corrupt_child_slice.py b/Tests/editor/EditorScripts/corrupt_child_slice.py deleted file mode 100755 index b6503d196d..0000000000 --- a/Tests/editor/EditorScripts/corrupt_child_slice.py +++ /dev/null @@ -1,368 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2603859: Parent Slice should still load on map if a child slice is corrupted. -https://testrail.agscollab.com/index.php?/cases/view/2603859 -""" - -import os -import sys -import shutil -import azlmbr.qt_helpers - -import azlmbr -import azlmbr.legacy.general as general -import azlmbr.editor as editor -import azlmbr.bus as bus -import azlmbr.slice as slice -import azlmbr.asset as asset -import azlmbr.math as math - -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest, QtCore, QtGui -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper -from azlmbr.entity import EntityId - -class TestCorruptChildSlice(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="corrupt_child_slice: ", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Carry out various operations to ensure a corrupt child slice does not - prevent a parent slice from loading. - - Expected Behavior: - Parent layer of corrupt slice can be loaded. - - Test Steps: - 1) Create a new entity named "CorruptC". - 2) Save as a slice. - 3) Create a new entity named "CorruptB". - 4) Make CorruptC a child of CorruptB. - 5) Save CorruptB as a slice. - 6) Create a new entity named CorruptA. - 7) Make CorruptB a child of CorruptA. - 8) Save CorruptA as a slice. - 9) Instantiate an instance of CorruptB. - 10) Save the level and close the editor. - 11) Rename the CorruptC slice to CorruptC.slice.backup. - 12) Make a copy of CorruptB.slice named CorruptB.slice.backup. - 13) Open the editor and level. - 14) Check that an error is displayed when loading the level. - 15) Check that CorruptB and A have loaded but CorruptA is absent. - 16) Check that CorruptA has a blue icon. - 17) Check that CorruptB is orange. - 18) Close the error message. - 19) Use the context menu of CorruptB to enter the Advanced Save dialog. - 20) Check there is a warning message in the dialog. - 21) Check that either CorruptB has "changed" next to it or CorruptB is listed as - having invalid references removed. - 22) Press "Save Selected Overrides". - 23) Close the editor and reopen the same level again. - 24) Check there are no warnings and the level loads correctly. - 25) Create a second instance of CorruptA. - 26) Check there are no errors. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - Outliner_Name = "Entity Outliner (PREVIEW)" - Console_Name = "Console" - - def fail_test(msg): - print(msg) - print("Test failed.") - sys.exit() - - async def save_level_as(main_editor_window, level_name_text): - save_action = pyside_utils.get_action_for_menu_path(main_editor_window, "File", "Save As") - pyside_utils.trigger_action_async(save_action) - active_widget = await pyside_utils.wait_for_modal_widget() - - save_level_as_dialogue = active_widget.findChild(QtWidgets.QWidget, "LevelFileDialog") - level_name = await pyside_utils.wait_for_child_by_hierarchy( - save_level_as_dialogue, - ..., - dict(type=QtWidgets.QLineEdit, objectName="nameLineEdit"), - ) - level_name.setText(level_name_text) - - button_box = save_level_as_dialogue.findChild(QtWidgets.QDialogButtonBox, "buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - await pyside_utils.close_modal(active_widget) - - async def open_level_check_for_warning(level_name): - general.open_level_no_prompt(level_name) - - try: - dialog = await pyside_utils.wait_for_child_by_hierarchy(None, - {"objectName": "ErrorLogDialog", "type": QtWidgets.QDialog}, - timeout=2.0) - - if dialog is None: - return False - - active_widget = QtWidgets.QApplication.activeModalWidget() - - button = active_widget.findChild(QtWidgets.QPushButton, "okButton") - if button is not None: - button.click() - except pyside_utils.EventLoopTimeoutException: - # The assertion is a timeout while waiting for the dialog. - return False - - return True - - async def push_slice_confirm_overwrite(button): - # If a confirm dialog pops up, press the confirm button. - pyside_utils.click_button_async(button) - - try: - dialog = await pyside_utils.wait_for_child_by_hierarchy(None, - {"objectName": "SliceUtilities.warningMessageBox", - "type": QtWidgets.QMessageBox}, - timeout=1.0) - confirm_button = pyside_utils.find_child_by_pattern(dialog, "Confirm") - pyside_utils.click_button_async(confirm_button) - await pyside_utils.close_modal(dialog) - except pyside_utils.EventLoopTimeoutException: - # No overwrite dialog appeared. - return False - - return True - - async def push_slice_to_file(slice_entity_id): - editor.ToolsApplicationRequestBus(bus.Broadcast, 'SetSelectedEntities', [slice_entity_id]) - general.idle_wait(0.0) - pyside_utils.run_soon(lambda: slice.SliceRequestBus(bus.Broadcast, "ShowPushDialog", [slice_entity_id])) - active_widget = await pyside_utils.wait_for_modal_widget() - - tree_widget = active_widget.findChild(QtWidgets.QTreeWidget, "SlicePushWidget.m_fieldTree") - if tree_widget is None: - return False - - # Check warning message - warning_message = active_widget.findChild(QtWidgets.QLabel, "SlicePushWidget.m_warningTitle") - if warning_message is None: - fail_test("Failed to find warning message in push dialog.") - - if not warning_message.text().startswith("1 missing reference(s)"): - fail_test("Failed to find Invalid References warning message.") - - # Check for CorruptB in the field selection. - found_corrupt_b_message = False - iterator = QtWidgets.QTreeWidgetItemIterator(tree_widget) - while iterator.value(): - item = iterator.value() - # Check it has one of the two possible messages. - if item.text(0) == "CorruptB (invalid references will be removed)" or item.text( - 0) == "CorruptB (changed)": - found_corrupt_b_message = True - iterator += 1 - - if not found_corrupt_b_message: - fail_test("Failed to find CorruptB invalid reference removal message.") - - # Press the save button. - save_button = pyside_utils.find_child_by_pattern(active_widget, "Save Selected Overrides") - - overwrite_result = await push_slice_confirm_overwrite(save_button) - - await pyside_utils.close_modal(active_widget) - - return overwrite_result - - def create_entity_with_name(entity_name): - new_entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId()) - if not new_entity_id.IsValid(): - fail_test("Failed to create new entity.") - editor.EditorEntityAPIBus(bus.Event, 'SetName', new_entity_id, entity_name) - name = editor.EditorEntityInfoRequestBus(bus.Event, 'GetName', new_entity_id) - return new_entity_id - - def path_is_valid_asset(asset_path): - tmp_asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False) - return tmp_asset_id.invoke("IsValid") - - def save_entity_as_slice(entity_id, slice_name): - current_level_name = editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") - slice_file = slice_name + ".slice" - slice_dir = os.path.join("Levels", current_level_name) - full_path = os.path.join(slice_dir, slice_file) - slice_created = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", entity_id, full_path) - self.wait_for_condition(lambda: path_is_valid_asset(full_path), 10.0) - if not slice_created: - fail_test("Failed to create slice.") - general.idle_wait(0.0) - - return slice_dir, slice_file - - def check_log_for_text_absence(console_text_edit, text_to_check): - # Grab the log text - text = console_text_edit.toPlainText() - - # Scan it for failed save lines. - lines = text.split('\n') - - for line in lines: - if line.find(text_to_check) >= 0: - return False - - return True - - EditorTestHelper.after_level_load(self) - - app = QtWidgets.QApplication.instance() - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - - # Make sure the outliner and console are open. - general.open_pane(Outliner_Name) - entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, Outliner_Name) - if entity_outliner is None: - fail_test("Failed to find the outliner.") - - outliner_main_window = entity_outliner.findChild(QtWidgets.QMainWindow) - if outliner_main_window is None: - fail_test("Failed to find the outliner main window.") - - outliner_tree_view = outliner_main_window.findChild(QtWidgets.QTreeView, "m_objectTree") - if outliner_tree_view is None: - fail_test("Failed to find the outliner tree view.") - - general.open_pane(Console_Name) - console = main_window.findChild(QtWidgets.QDockWidget, Console_Name) - if console is None: - fail_test("Failed to find the console.") - - text_edit = console.findChild(QtWidgets.QPlainTextEdit, "textEdit") - if text_edit is None: - fail_test("Failed to find console textEdit.") - - # Create a level. - result = general.create_level_no_prompt("test_level_1", 1024, 1, 4096, True) - if result != 0: - fail_test("Failed to create level") - general.idle_wait(2.0) - - # Save as a different level name so we can switch between them. - await save_level_as(editor_window, "test_level_2") - - # Create the entities. - corrupt_a_id = create_entity_with_name("CorruptA") - corrupt_b_id = create_entity_with_name("CorruptB") - corrupt_c_id = create_entity_with_name("CorruptC") - - # Make C a slice. - slice_file_path, slice_c_file = save_entity_as_slice(corrupt_c_id, "CorruptC") - - # Make C a child of B. - azlmbr.components.TransformBus(bus.Event, "SetParent", corrupt_c_id, corrupt_b_id) - - # Make B a slice. - slice_file_path, slice_b_file = save_entity_as_slice(corrupt_b_id, "CorruptB") - - # Make B a child of A. - azlmbr.components.TransformBus(bus.Event, "SetParent", corrupt_b_id, corrupt_a_id) - - # Make A a slice. - slice_file_path, slice_a_file = save_entity_as_slice(corrupt_a_id, "CorruptA") - - # Instantiate another B - slice_path = os.path.join(slice_file_path, slice_b_file) - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", slice_path, math.Uuid(), False) - transform = math.Transform_CreateIdentity() - slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform) - general.idle_wait(0.0) - - # Save. - general.save_level() - - # Switch levels while the files are manipulated. - general.open_level_no_prompt("test_level_1") - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") != "test_level_1": - fail_test("Failed to reload test_level_1") - - # Rename the slice C file. - game_folder = editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'GetGameFolder') - src = os.path.join(game_folder, slice_file_path, slice_c_file) - dest = src + ".backup" - os.rename(src, dest) - - # Duplicate the slice B file and rename that. - src = os.path.join(game_folder, slice_file_path, slice_b_file) - dest = src + ".backup" - shutil.copyfile(src, dest) - - # Switch back to the level with the slice instances in and check for error messages. - seen_error_dialog = await open_level_check_for_warning("test_level_2") - - if not seen_error_dialog: - fail_test("Failed to find error message dialog.") - - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") != "test_level_2": - fail_test("Failed to reload test_level_2") - - # Check that A and B are present but not C - corrupt_a_id = general.find_editor_entity("CorruptA") - if not corrupt_a_id.isValid(): - fail_test("No CorruptA entity found after reload") - corrupt_b_id = general.find_editor_entity("CorruptB") - if not corrupt_b_id.isValid(): - fail_test("No CorruptB entity found after reload") - corrupt_c_id = general.find_editor_entity("CorruptC") - if corrupt_c_id.isValid(): - fail_test("CorruptC entity found after reload") - - # Pop up the advanced push dialog for CorruptB and push it. - push_success = await push_slice_to_file(corrupt_b_id) - if not push_success: - fail_test("Failed to push slice.") - - # Switch levels again so we can reload level2. - general.open_level_no_prompt("test_level_1") - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") != "test_level_1": - fail_test("Failed to reload test_level_1") - - # Switch back to level 2 and check the error dialog did not appear. - seen_error_dialog = await open_level_check_for_warning("test_level_2") - - if seen_error_dialog: - fail_test("Level failed to load without errors.") - - # Instantiate another CorruptA and check there are no errors. - # Any errors will appear in the console so we need to check that. - text_edit.clear() - - slice_path = os.path.join(slice_file_path, slice_a_file) - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", slice_path, math.Uuid(), False) - transform = math.Transform_CreateIdentity() - slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform) - general.idle_wait(0.0) - - if not check_log_for_text_absence(text_edit, "could not be loaded"): - fail_test("Error occurred instantiating CorruptA.") - - print("Corrupt child slice test complete.") - - -test = TestCorruptChildSlice() -test.run() diff --git a/Tests/editor/EditorScripts/create_camera_comp_from_view.py b/Tests/editor/EditorScripts/create_camera_comp_from_view.py deleted file mode 100755 index 0f0b81e531..0000000000 --- a/Tests/editor/EditorScripts/create_camera_comp_from_view.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C17219006: Create Camera Entity from view -https://testrail.agscollab.com/index.php?/cases/view/17219006 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -import Tests.ly_shared.hydra_editor_utils as hydra -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class CreateCameraComponentFromViewTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="create_camera_comp_from_view", args=["level"]) - - def run_test(self): - """ - Summary: - Create Camera Entity from view - This can be verified by checking if the entity is created with - Camera component and if the Camera is listed in Viewport Camera Selector - - Expected Behavior: - An entity is created with a Camera Component attached from the current viewport perspective. - The camera entity is added to the Viewport Camera Selector. - The Camera entity is labeled "Camera #" where # is replaced by the #number of camera entities in the level. - - Test Steps: - 1) Open level - 2) Trigger the action 'Create camera entity from view' from viewport context menu - 3) Verify if the entity is created with the name Camera# (Ex: Camera1) - 4) Verify if the entity has Camera component added - 5) Verify if Camera1 is listed in the Viewport Camera Selector - 6) Close Viewport Camera Selector - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Trigger the action 'Create camera entity from view' from viewport context menu - # Get the editor window, main window, viewport objects - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - view_port = pyside_utils.find_child_by_hierarchy(main_window, ..., "renderOverlay") - view_port = main_window.findChildren(QtWidgets.QWidget, "renderOverlay")[0] - - # Trigger the action - pyside_utils.trigger_context_menu_entry(view_port, "Create camera entity from view") - - # 3) Verify if the entity is created with the name Camera# (Ex: Camera1) - camera_entity_id = general.find_editor_entity("Camera1") - assert camera_entity_id.isValid(), "Entity with Camera component is not created" - - # 4) Verify if the entity has Camera component added - assert hydra.has_components(camera_entity_id, ["Camera"]), "Entity do not have a Camera component" - - # 5) Verify if Camera1 is listed in the Viewport Camera Selector - # Open Viewport Camera Selector if not opened already - if not general.is_pane_visible("Viewport Camera Selector"): - general.open_pane("Viewport Camera Selector") - if general.is_pane_visible("Viewport Camera Selector"): - print("Viewport Camera Selector is opened") - - # Get the Camera Selector object and the list of cameras - camera_selector = editor_window.findChildren(QtWidgets.QDockWidget, "Viewport Camera Selector")[0] - list_view = camera_selector.findChildren(QtWidgets.QListView)[0] - - # Verify if the Camera1 is present in the list - assert pyside_utils.find_child_by_pattern( - list_view, "Camera1" - ), "Camera1 is not listed in the Viewport Camera Selector" - - # 6) Close Viewport Camera Selector - camera_selector.close() - if not general.is_pane_visible("Viewport Camera Selector"): - print("Viewport Camera Selector is closed") - - -test = CreateCameraComponentFromViewTest() -test.run() diff --git a/Tests/editor/EditorScripts/create_dynamic_slice.py b/Tests/editor/EditorScripts/create_dynamic_slice.py deleted file mode 100755 index 5a94ecdf70..0000000000 --- a/Tests/editor/EditorScripts/create_dynamic_slice.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C1519572: Create a dynamic slice -https://testrail.agscollab.com/index.php?/cases/view/1519572 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import azlmbr.asset as asset -import azlmbr.math as math -import azlmbr.slice as slice -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class CreateDynamicSliceTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="create_dynamic_slice", args=["level"]) - - def run_test(self): - """ - Summary: - Create a dynamic slice - - Expected Behavior: - Dynamic slices can be set/unset - - Test Steps: - 1) Open level - 2) Create new entity - 3) Create new slice from the newly created entity - 4) Set an existing slice to dynamic - 5) Unset the dynamic slice - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def is_slice_dynamic(asset_id): - if slice.SliceRequestBus(bus.Broadcast, "IsSliceDynamic", asset_id): - return "Dynamic" - return "Not Dynamic" - - def path_is_valid_asset(asset_path): - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False) - return asset_id.invoke("IsValid") - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Create new entity - entity_position = math.Vector3(125.0, 136.0, 32.0) - entity_id = editor.ToolsApplicationRequestBus( - bus.Broadcast, "CreateNewEntityAtPosition", entity_position, EntityId.EntityId() - ) - - # 3) Create new slice from the newly created entity - slice_path = os.path.join("slices", "TestSlice.slice") - slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", entity_id, slice_path) - self.wait_for_condition(lambda: path_is_valid_asset(slice_path), 10.0) - - # 4) Set an existing slice to dynamic - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", slice_path, math.Uuid(), False) - print(f"Slice Status (Before setting to dynamic): {is_slice_dynamic(asset_id)}") - slice.SliceRequestBus(bus.Broadcast, "SetSliceDynamic", asset_id, True) - self.wait_for_condition(lambda: slice.SliceRequestBus(bus.Broadcast, "IsSliceDynamic", asset_id), 5.0) - print(f"Slice Status (After setting to dynamic): {is_slice_dynamic(asset_id)}") - - # 5) Unset the dynamic slice - print(f"Slice Status (Before unsetting to dynamic): {is_slice_dynamic(asset_id)}") - slice.SliceRequestBus(bus.Broadcast, "SetSliceDynamic", asset_id, False) - self.wait_for_condition(lambda: not slice.SliceRequestBus(bus.Broadcast, "IsSliceDynamic", asset_id), 5.0) - print(f"Slice Status (After unsetting to dynamic): {is_slice_dynamic(asset_id)}") - - -test = CreateDynamicSliceTest() -test.run() diff --git a/Tests/editor/EditorScripts/create_entity_via_viewport.py b/Tests/editor/EditorScripts/create_entity_via_viewport.py deleted file mode 100755 index 658a59fe54..0000000000 --- a/Tests/editor/EditorScripts/create_entity_via_viewport.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317058: Viewport Entity Creation -https://testrail.agscollab.com/index.php?/cases/view/6317058 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.editor as editor -import azlmbr.components as components -import azlmbr.bus as bus -import azlmbr.math as math -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - -class ViewportEntityCreation(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="viewport_entity_creation: ", args=["level"]) - - def run_test(self): - """ - Summary: - Verify if creating new entities via the viewport context menu works correctly. - - Expected Behavior: - Right clicking the viewport and selecting the option in the context menu creates an entity under the cursor. - - Test Steps: - 1) Open a new level - 2) Move the cursor on the viewport - 3) Copy the position on the level pointed at by the cursor from the viewport's toolbar - 4) Create a new entity via the context menu - 5) Verify the entity has been created at the right position - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=False, - ) - - # Grab the necessary widgets - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - viewport_window = main_window.findChild(QtWidgets.QMainWindow) - overlay = viewport_window.findChild(QtWidgets.QWidget, "renderOverlay") - posCtrl = viewport_window.findChild(QtWidgets.QWidget, "m_posCtrl") - labels = ["X", "Y", "Z"] - pos = [0.0, 0.0, 0.0] - - # 2) Click on the Viewport to focus - QtTest.QTest.mouseClick(overlay, Qt.LeftButton) - - # Trigger a Move to update position in viewport toolbar - QtTest.QTest.mouseMove(overlay) - - # 3) Get position values - for i, label in enumerate(labels): - vector_element = posCtrl.findChild(QtWidgets.QWidget, label) - line_edit = vector_element.findChild(QtWidgets.QLineEdit) - pos[i] = float(line_edit.text()) - - # 4) Trigger Context Menu and click Create Entity - pyside_utils.trigger_context_menu_entry(overlay.parent(), "Create entity") - - # Get Selected Entity (it will be the newly created one) - selectedTestEntityIds = editor.ToolsApplicationRequestBus(bus.Broadcast, 'GetSelectedEntities') - newEntityId = selectedTestEntityIds[0] - - # Get Position of new Entity - position = components.TransformBus(bus.Event, "GetWorldTranslation", newEntityId) - - # 5) Verify the positions match (tolerance threshold is 1.0 since this is based on mouseClick - # right-click position which has some room for error) - POSITION_TOLERANCE = 1.0 - if (math.Math_IsClose(pos[0], position.x, POSITION_TOLERANCE) and - math.Math_IsClose(pos[1], position.y, POSITION_TOLERANCE) and - math.Math_IsClose(pos[2], position.z, POSITION_TOLERANCE)): - print("New Entity created in the correct position") - - -test = ViewportEntityCreation() -test.run() diff --git a/Tests/editor/EditorScripts/create_inputbindings_file.py b/Tests/editor/EditorScripts/create_inputbindings_file.py deleted file mode 100755 index 4371ad0bf8..0000000000 --- a/Tests/editor/EditorScripts/create_inputbindings_file.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1506874: Create Input Bindings File -https://testrail.agscollab.com/index.php?/cases/view/1506874 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.asset as asset -import azlmbr.editor as editor -import azlmbr.bus as bus -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class CreateInputBindingFileTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="create_inputbindings_file", args=["level"]) - - def run_test(self): - """ - Summary: - Create a new inputbinding file - - Expected Behavior: - The newly created inputbindings file is loaded into the Asset Editor. - - Test Steps: - 1) Open a new level - 2) Create new inputbindings file - 3) Verify if file is created - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - INPUTBINDING_FILE_PATH = "SamplesProject/temp.inputbindings" - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Create new inputbindings file - input_bindings_type_id = asset.AssetCatalogRequestBus( - bus.Broadcast, "GetAssetTypeByDisplayName", "Input Bindings" - ) - editor.AssetEditorRequestsBus(bus.Broadcast, "CreateNewAsset", input_bindings_type_id) - editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", INPUTBINDING_FILE_PATH) - - # 3) Verify if file is created - self.wait_for_condition(lambda: os.path.exists(INPUTBINDING_FILE_PATH), 0.5) - print(f"New inputbindings file created: {os.path.exists(INPUTBINDING_FILE_PATH)}") - - -test = CreateInputBindingFileTest() -test.run_test() diff --git a/Tests/editor/EditorScripts/create_new_level.py b/Tests/editor/EditorScripts/create_new_level.py deleted file mode 100755 index 14274cbae1..0000000000 --- a/Tests/editor/EditorScripts/create_new_level.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6351273: Create a new level -https://testrail.agscollab.com/index.php?/cases/view/6351273 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.editor as editor -import azlmbr.bus as bus -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestCreateNewLevel(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="create_new_level: ", args=["level"]) - - def run_test(self): - """ - Summary: - Create a new level and verify if the level is loaded properly. - - Expected Behavior: - A new level is created and loaded into the editor. - - Test Steps: - 1) Create new level - 2) Verify if the new level is loaded - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def on_focus_changed(old, new): - print("focus Changed") - active_modal_widget = QtWidgets.QApplication.activeModalWidget() - if active_modal_widget: - new_level_dlg = active_modal_widget.findChild(QtWidgets.QWidget, "CNewLevelDialog") - if new_level_dlg: - if new_level_dlg.windowTitle() == "New Level": - print("New Level dialog opened") - grp_box = new_level_dlg.findChild(QtWidgets.QGroupBox, "STATIC_GROUP1") - level_name = grp_box.findChild(QtWidgets.QLineEdit, "LEVEL") - level_name.setText(self.args["level"]) - level_folders = grp_box.findChild(QtWidgets.QComboBox, "LEVEL_FOLDERS") - level_folders.setCurrentText("Levels/") - button_box = new_level_dlg.findChild(QtWidgets.QDialogButtonBox, "buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - def on_action_triggered(): - print("New Level Action triggered") - - try: - # 1) Create new level - # Wait 2.0s for editor to load - general.idle_wait(2.0) - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - action = pyside_utils.get_action_for_menu_path(editor_window, "File", "New Level") - action.triggered.connect(on_action_triggered) - action.trigger() - action.triggered.disconnect(on_action_triggered) - - # 2) Verify if the new level is loaded - general.idle_wait(3.0) - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") == self.args["level"]: - print("Create and load new level: SUCCESS") - else: - print("Create and load new level: FAILED") - - except Exception as e: - print(e) - finally: - print("Disconnecting focusChanged signal") - app.focusChanged.disconnect(on_focus_changed) - - -test = TestCreateNewLevel() -test.run() diff --git a/Tests/editor/EditorScripts/customize_keyboard.py b/Tests/editor/EditorScripts/customize_keyboard.py deleted file mode 100755 index 921421a79d..0000000000 --- a/Tests/editor/EditorScripts/customize_keyboard.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6321576: Basic Function: Customize Keyboard -https://testrail.agscollab.com/index.php?/cases/view/6321576 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtGui, QtTest -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestCustomizeKeyboard(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="customize_keyboard: ") - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Assign any new shortcut keys to menu command. - - Expected Behavior: - Keyboard customizations can be changed, saved, and function properly. - - Test Steps: - 1) Open the Customize Keyboard dialog and Assign any button combination as new shortcut. - 2) Use the newly assigned hotkey. - 3) Restore the settings to default - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - # 1) Open the Customize Keyboard dialog and Assign any button combination as new shortcut - editor_window = pyside_utils.get_editor_main_window() - action = pyside_utils.find_child_by_pattern( - editor_window, {"text": "Customize &Keyboard...", "type": QtWidgets.QAction} - ) - pyside_utils.trigger_action_async(action) - active_modal_widget = await pyside_utils.wait_for_modal_widget() - if active_modal_widget: - keyboard_customizer = active_modal_widget.findChild(QtWidgets.QDialog, "CustomizeKeyboardDialog") - if keyboard_customizer: - print("Customize keyboard window opened successfully") - keySequenceEdit = pyside_utils.find_child_by_pattern(keyboard_customizer, "keySequenceEdit") - assign_button = pyside_utils.find_child_by_pattern(keyboard_customizer, "assignButton") - categories = keyboard_customizer.findChild(QtWidgets.QComboBox, "categories") - commandsView = keyboard_customizer.findChild(QtWidgets.QListView, "commandsView") - - # Assign a shortcut to the Tools -> Asset Editor action - categories.setCurrentText("Tools") - asset_editor_index = pyside_utils.find_child_by_pattern(commandsView, "Asset Editor") - commandsView.setCurrentIndex(asset_editor_index) - keySequenceEdit.setKeySequence(QtGui.QKeySequence(Qt.CTRL + Qt.Key_M)) - - assign_button.setEnabled(True) - if assign_button.isEnabled(): - app = QtWidgets.QApplication.instance() - pyside_utils.click_button_async(assign_button) - - # We need to handle in case this test had failed previously, the shortcut might - # already be assigned, in which case there will be a second modal dialog - # confirmation to overwrite it - try: - await pyside_utils.wait_for_condition(lambda: app.activeModalWidget() and app.activeModalWidget() != active_modal_widget, timeout=0.1) - confirmation_popup = app.activeModalWidget() - message_box = confirmation_popup.findChild(QtWidgets.QMessageBox) - button = message_box.button(QtWidgets.QMessageBox.Yes) - pyside_utils.click_button_async(button) - await pyside_utils.wait_for_destroyed(confirmation_popup) - except pyside_utils.EventLoopTimeoutException: - # If this timed out, it just means that the shortcut wasn't already assigned - pass - - # "Close" button acts as "Save and Close" in this widget - button_box = pyside_utils.find_child_by_pattern(keyboard_customizer, "buttonBox") - button = button_box.button(QtWidgets.QDialogButtonBox.Close) - pyside_utils.click_button_async(button) - await pyside_utils.wait_for_destroyed(active_modal_widget) - - # 2) Use the newly assigned hotkey. - general.close_pane("Asset Editor") - QtTest.QTest.keyPress(editor_window, Qt.Key_M, Qt.ControlModifier) - success = await pyside_utils.wait_for_condition(lambda: general.is_pane_visible("Asset Editor")) - if success: - print("New shortcut works : Asset Editor opened") - - # Close it now since we are going to verify the shortcut no longer works - # after restoring the default settings - general.close_pane("Asset Editor") - - # 3) Restore the settings to default - pyside_utils.trigger_action_async(action) - active_modal_widget = await pyside_utils.wait_for_modal_widget() - if active_modal_widget: - button_box = pyside_utils.find_child_by_pattern(active_modal_widget, "buttonBox") - restore_defaults = pyside_utils.find_child_by_pattern(button_box, "Restore Defaults") - pyside_utils.click_button_async(restore_defaults) - confirmation_modal_widget = await pyside_utils.wait_for_modal_widget() - if confirmation_modal_widget: - message_box = confirmation_modal_widget.findChild(QtWidgets.QMessageBox) - button = message_box.button(QtWidgets.QMessageBox.Yes) - button.click() - - # "Close" button acts as "Save and Close" in this widget - close_button = button_box.button(QtWidgets.QDialogButtonBox.Close) - pyside_utils.click_button_async(close_button) - await pyside_utils.wait_for_destroyed(active_modal_widget) - - # Verify if setting restored - QtTest.QTest.keyClick(editor_window, Qt.Key_M, Qt.ControlModifier) - if not general.is_pane_visible("Asset Editor"): - print("Default shortcuts restored : Asset Editor stays closed") - - -test = TestCustomizeKeyboard() -test.run() diff --git a/Tests/editor/EditorScripts/deleting_entities_from_outliner.py b/Tests/editor/EditorScripts/deleting_entities_from_outliner.py deleted file mode 100755 index 62fe443b9a..0000000000 --- a/Tests/editor/EditorScripts/deleting_entities_from_outliner.py +++ /dev/null @@ -1,155 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1510643: Deleting Entities in the Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/1510643 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestDeletingEntitiesFromOutliner(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="deleting_entities_from_outliner: ", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Create a nested group of Entities with parent and 2 children. - Right click on each of the entities and select "Delete". - Undo the deletion of those entites. - - Expected Behavior: - Deleting a Child entity does not delete the parent. - The child entity is restored as part of the hierarchy. - Deleting the Parent entity deletes all child entities linked to it. - The entity hierarchy is restored. - - Test Steps: - 1) Create a nested group of Entities and verify deleting the child does not destroy the parent - 1.1) Create group of entities - 1.2) Delete child - 1.3) Verify parent exists - 2) Undo the deletion of the child entity and verify the same is restored - 2.1) Undo the deletion - 2.2) verify child entity exists - 3) Delete the parent entity and verify all child entities deleted - 3.1) Delete parent - 3.2) Verify all child entities deleted - 4) Undo the deletion of the parent entity and verify hierarchy is restored - 4.1) Undo the deletion - 4.2) Verify all entities exist - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_entity_count_by_id(entity_id): - entity_name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id) - searchFilter = EntityId.SearchFilter() - searchFilter.names = [entity_name] - entities = EntityId.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - async def delete_entity(entity_id, entity_name): - """ - Delete an entity using PySide Right-Click and Delete. - :param entity_id: used to find and delete the entity - :param entity_name: not dynamically grabbed from entity or used in delete code but is used for printing out a comment statement for testrunner - :return None - """ - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - entity_outliner = main_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - object_tree = entity_outliner.findChild(QtWidgets.QTreeView, "m_objectTree") - index_to_delete = pyside_utils.find_child_by_pattern(object_tree, entity_name) - object_tree.setCurrentIndex(index_to_delete) - await pyside_utils.trigger_context_menu_entry(object_tree, "Delete", index=index_to_delete) - - if get_entity_count_by_id(entity_id) == 0: - print(f"{entity_name} deleted succesfully") - - # Create a level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 1) Create a nested group of Entities and verify deleting the child does not destroy the parent - # 1.1) Create group of entities - parent_entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId.EntityId()) - editor.EditorEntityAPIBus(bus.Event, "SetName", parent_entity_id, "Parent entity") - if get_entity_count_by_id(parent_entity_id) ==1: - print("Parent Entity created") - - child_entity_1 = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_entity_id) - editor.EditorEntityAPIBus(bus.Event, "SetName", child_entity_1, "Child entity 1") - child_entity_2 = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_entity_id) - editor.EditorEntityAPIBus(bus.Event, "SetName", child_entity_2, "Child entity 2") - if get_entity_count_by_id(child_entity_1) == 1 and get_entity_count_by_id(child_entity_1) == 1: - print("Child Entities created") - - # 1.2) Delete child - await delete_entity(child_entity_1, "Child entity 1") - - # 1.3) Verify parent exists - if get_entity_count_by_id(parent_entity_id) != 0: - print("Deleting a Child entity does not delete the parent") - - # 2) Undo the deletion of the child entity and verify the same is restored - # 2.1) Undo the deletion - general.undo() - - # 2.2) verify child entity exists - success = await pyside_utils.wait_for_condition(lambda: get_entity_count_by_id(child_entity_1) != 0) - if success: - print("Child entity restored successfully") - - # 3) Delete the parent entity and verify all child entities deleted - # 3.1) Delete parent - await delete_entity(parent_entity_id, "Parent entity") - - # 3.2) Verify all child entities deleted - if get_entity_count_by_id(child_entity_1) == 0 and get_entity_count_by_id(child_entity_1) == 0: - print("Deleting the Parent entity deletes all child entities linked to it") - - # 4) Undo the deletion of the parent entity and verify hierarchy is restored - # 4.1) Undo the deletion - general.undo() - - # 4.2) Verify all entities exist - success = await pyside_utils.wait_for_condition(lambda: - (get_entity_count_by_id(parent_entity_id) != 0 - and get_entity_count_by_id(child_entity_1) != 0 - and get_entity_count_by_id(child_entity_2) != 0)) - if success: - print("Entity hierarchy is restored") - - -test = TestDeletingEntitiesFromOutliner() -test.run() diff --git a/Tests/editor/EditorScripts/edit_mode_toolbar_function.py b/Tests/editor/EditorScripts/edit_mode_toolbar_function.py deleted file mode 100755 index 450dedc315..0000000000 --- a/Tests/editor/EditorScripts/edit_mode_toolbar_function.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1564083 : Edit Mode Toolbar -https://testrail.agscollab.com/index.php?/cases/view/1564083 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as editor_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestEditModeToolbar(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="edit_mode_toolbar_function: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with Edit mode toolbar options and verify if all the options are functional. - - Expected Behavior: - All options available in the Edit Mode Toolbar function as intended. - - Test Steps: - 1) Create/Open a level - 2) Open the Edit mode Toolbar - 3) Use every option in the toolbar. - - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - editor_window = pyside_utils.get_editor_main_window() - editors_toolbar = editor_window.findChild(QtWidgets.QToolBar, "EditMode") - - def get_entity_count(entity_id): - searchFilter = EntityId.SearchFilter() - searchFilter.names = [editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id)] - entities = EntityId.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - def get_tool_button(option): - button = pyside_utils.find_child_by_pattern(editors_toolbar, option) - if button.text() == option: - return button - - def wait_condition_print(function, wait_time, print_message=""): - self.wait_for_condition(function, wait_time) - if function() and print_message != "": - print(print_message) - - # 1) Create new level with an Entity - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Open the Editors Toolbar - if not editors_toolbar.isVisible(): - editors_toolbar.toggleViewAction().trigger() - if editors_toolbar.isVisible(): - print("Editors tool bar opened successfully") - - # 3) Use every option in the toolbar. - # i) Undo - entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId.EntityId()) - self.wait_for_condition(lambda: get_tool_button("Undo").isEnabled(), 2.0) - initial_count = get_entity_count(entity_id) - get_tool_button("Undo").click() - wait_condition_print(lambda: get_entity_count(entity_id) != initial_count, 2.0, "Undo tool button is functional") - - # ii) Redo - self.wait_for_condition(lambda: get_tool_button("Redo").isEnabled(), 2.0) - get_tool_button("Redo").click() - wait_condition_print(lambda: get_entity_count(entity_id) == initial_count, 2.0, "Redo tool button is functional") - - # iii) Move - move_button = get_tool_button("Move") - if not move_button.isChecked(): move_button.click() - if move_button.isChecked(): print("Move tool button is accesible") - - # iv) Rotate - rotate_button = get_tool_button("Rotate") - if not rotate_button.isChecked(): rotate_button.click() - if rotate_button.isChecked(): print("Rotate tool button is accesible") - - # v) Scale - scale_button = get_tool_button("Scale") - if not scale_button.isChecked(): scale_button.click() - if scale_button.isChecked(): print("Scale tool button is accesible") - - # vi) Play Game - get_tool_button("Play Game").click() - wait_condition_print(lambda : general.is_in_game_mode(), 3.0, "Play game tool button is responsive") - general.exit_game_mode() - - # vii) Snap to grid - # Wait for the snap_to_grid_text to become enabled since in the previous step we are leaving game mode, - # so it might still be disabled momentarily - snap_to_grid = get_tool_button("Snap To Grid") - snap_grid_widget = snap_to_grid.parent() - snap_to_grid.setChecked(True) - snap_to_grid_text = snap_grid_widget.findChild(QtWidgets.QDoubleSpinBox).findChild(QtWidgets.QLineEdit) - self.wait_for_condition(lambda: snap_to_grid_text.isEnabled()) - if snap_to_grid.isChecked() == snap_to_grid_text.isEnabled(): - print("Snap to grid tool button is responsive") - - # viii) Snap Angle - # Wait for the snap_angle_text to become enabled since in the previous step we are leaving game mode, - # so it might still be disabled momentarily - snap_angle = get_tool_button("Snap angle") - snap_angle_widget = snap_angle.parent() - snap_angle.setChecked(True) - snap_angle_text = snap_angle_widget.findChild(QtWidgets.QDoubleSpinBox).findChild(QtWidgets.QLineEdit) - self.wait_for_condition(lambda: snap_angle_text.isEnabled()) - if snap_angle.isChecked() == snap_angle_text.isEnabled(): - print("Snap angle tool button is responsive") - - -test = TestEditModeToolbar() -test.run_test() diff --git a/Tests/editor/EditorScripts/editor_layout_save_and_load.py b/Tests/editor/EditorScripts/editor_layout_save_and_load.py deleted file mode 100755 index 4049d1d311..0000000000 --- a/Tests/editor/EditorScripts/editor_layout_save_and_load.py +++ /dev/null @@ -1,156 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C697735: Custom layouts can be saved -C697736: Custom/Default layouts can be loaded -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestLoadLayout(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="load_layout") - - def run_test(self): - """ - Summary: - Creates a custom Editor layout, resets to the default options, and then reloads the custom layout. - - Expected Behavior: - Pane/tool layout matches expected results for both default and custom layout. - - Test Steps: - 1) Open Editor - 2) Open a few tools and dock them/leave floating - 3) Save the custom layout - 4) Restore the default layout and verify proper tools/panes are open - 5) Load the custom layout and verify proper tools/panes are open - 6) Delete the custom layout to cleanup - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - custom_layout_name = "custom_layout_test" - editor_window = pyside_utils.get_editor_main_window() - menu_paths = [ - ("Layouts", "Save Layout"), - ("Layouts", "Restore Default Layout"), - ("Layouts", custom_layout_name, "Load"), - ("Layouts", custom_layout_name, "Delete") - ] - - def on_save_layout_trigger(): - active_modal_widget = QtWidgets.QApplication.activeModalWidget() - if active_modal_widget: - save_level_as_dialogue = active_modal_widget.findChild(QtWidgets.QInputDialog) - if save_level_as_dialogue.windowTitle() == "Layout Name": - print("The 'Layout Name' dialog appeared") - layout_name_field = active_modal_widget.findChild(QtWidgets.QLineEdit) - layout_name_field.setText(custom_layout_name) - button_box = active_modal_widget.findChild(QtWidgets.QDialogButtonBox) - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - def on_restore_default_layout_trigger(): - active_modal_widget = QtWidgets.QApplication.activeModalWidget() - if active_modal_widget: - restore_default_layout_dialog = active_modal_widget.findChild(QtWidgets.QMessageBox) - if restore_default_layout_dialog.windowTitle() == "Restore Default Layout": - print("The 'Restore Default Layout' dialog appeared") - button_box = active_modal_widget.findChildren(QtWidgets.QDialogButtonBox)[0] - button_box.button(QtWidgets.QDialogButtonBox.RestoreDefaults).click() - - def on_custom_layout_load_trigger(): - print("Restoring default layout") - - def on_delete_custom_layout_trigger(): - print("Deleting custom layout") - active_modal_widget = QtWidgets.QApplication.activeModalWidget() - if active_modal_widget: - delete_custom_layout_dialog_button_box = active_modal_widget.findChild(QtWidgets.QDialogButtonBox) - if delete_custom_layout_dialog_button_box: - print("The 'Delete Layout' dialog appeared") - delete_custom_layout_dialog_button_box.button(QtWidgets.QDialogButtonBox.Yes).click() - - def trigger_view_menu_option(menu_path, on_trigger): - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_trigger) - try: - action = pyside_utils.get_action_for_menu_path(editor_window, "View", *menu_path) - action.trigger() - print(f"{action.iconText()} Action triggered") - finally: - app.focusChanged.disconnect(on_trigger) - - # Open a few floating tools - general.open_pane('Landscape Canvas') - general.open_pane('Track View') - general.open_pane('UI Editor') - - # Close a few open tools - general.close_pane('Console') - general.close_pane('Asset Browser') - - # Verify proper tools are open in the Editor prior to saving layout - landscape_canvas_open = general.is_pane_visible('Landscape Canvas') - track_view_open = general.is_pane_visible('Track View') - ui_editor_open = general.is_pane_visible('UI Editor') - console_closed = not general.is_pane_visible('Console') - asset_browser_closed = not general.is_pane_visible('Asset Browser') - self.test_success = landscape_canvas_open and track_view_open and ui_editor_open and console_closed \ - and asset_browser_closed - if self.test_success: - print('Custom layout setup complete') - - # Save layout - trigger_view_menu_option(menu_paths[0], on_save_layout_trigger) - - # Trigger Restore Default Layout option and click Restore Defaults on popup dialog - trigger_view_menu_option(menu_paths[1], on_restore_default_layout_trigger) - - # Verify proper panes are open with Default Layout - console_open = general.is_pane_visible('Console') - asset_browser_open = general.is_pane_visible('Asset Browser') - self.test_success = self.test_success and console_open and asset_browser_open - general.idle_wait(2.0) - - # Trigger Load of saved custom layout - trigger_view_menu_option(menu_paths[2], on_custom_layout_load_trigger) - - # Verify proper panes are open with saved custom layout - landscape_canvas_open = general.is_pane_visible('Landscape Canvas') - track_view_open = general.is_pane_visible('Track View') - ui_editor_open = general.is_pane_visible('UI Editor') - self.test_success = self.test_success and landscape_canvas_open and track_view_open and ui_editor_open - general.idle_wait(2.0) - - # Restore to defaults and delete custom layout - trigger_view_menu_option(menu_paths[1], on_restore_default_layout_trigger) - trigger_view_menu_option(menu_paths[3], on_delete_custom_layout_trigger) - - # Verify that custom layout has been cleaned up - pyside_utils.get_action_for_menu_path(editor_window, "View", *menu_paths[2]) - - -test = TestLoadLayout() -test.run() diff --git a/Tests/editor/EditorScripts/enter_exit_component_mode.py b/Tests/editor/EditorScripts/enter_exit_component_mode.py deleted file mode 100755 index 29208c1306..0000000000 --- a/Tests/editor/EditorScripts/enter_exit_component_mode.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2174442: Enter/Exit Component Mode -https://testrail.agscollab.com/index.php?/cases/view/2174442 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.entity as EntityId -import Tests.ly_shared.hydra_editor_utils as hydra -import azlmbr.math as math -import azlmbr.bus as bus -import azlmbr.editor as editor -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestEnterExitComponentMode(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="enter_exit_component_mode: ", args=["level"]) - - def run_test(self): - """ - Summary: - Enter/Exit Component Mode - - Expected Behavior: - Component Mode can be entered and exited. - - Test Steps: - 1) Open level - 2) Create an entity with Box Shape component - 3) Click the "Edit" button on the component to enter into component mode - 4) Click the "Done" button on the component to exit from component mode - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def on_entered_component_mode(parameters): - print("Entered component mode") - - def on_left_component_mode(parameters): - print("Left component mode") - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # Setup the handler to listen for Editor Component Mode notifications - context_id = editor.EditorEntityContextRequestBus(bus.Broadcast, "GetEditorEntityContextId") - handler = bus.NotificationHandler("EditorComponentModeNotificationBus") - handler.connect(context_id) - handler.add_callback("EnteredComponentMode", on_entered_component_mode) - handler.add_callback("LeftComponentMode", on_left_component_mode) - - # 2) Create an entity with Box Shape component - entity_position = math.Vector3(125.0, 136.0, 32.0) - entity_id = editor.ToolsApplicationRequestBus( - bus.Broadcast, "CreateNewEntityAtPosition", entity_position, EntityId.EntityId() - ) - general.clear_selection() - general.select_object(editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id)) - hydra.add_component("Box Shape", entity_id) - - # 3) Click the "Edit" button on the component to enter into component mode - # Retrieve the TypeId for the Box Shape component - type_ids = editor.EditorComponentAPIBus(bus.Broadcast, "FindComponentTypeIdsByEntityType", ["Box Shape"], - EntityId.EntityType().Game) - box_shape_type_id = type_ids[0] - - # Enter component mode for the Box Shape (Same as pressing the "Edit" button on the Box Shape component) - editor.ComponentModeSystemRequestBus(bus.Broadcast, "EnterComponentMode", box_shape_type_id) - - # 4) Click the "Done" button on the component to exit from component mode - # End component mode (Same as pressing the "Done" button on the Box Shape component) - editor.ComponentModeSystemRequestBus(bus.Broadcast, "EndComponentMode") - - -test = TestEnterExitComponentMode() -test.run() diff --git a/Tests/editor/EditorScripts/entity_duplication_entity_outliner.py b/Tests/editor/EditorScripts/entity_duplication_entity_outliner.py deleted file mode 100755 index 166e6a43ff..0000000000 --- a/Tests/editor/EditorScripts/entity_duplication_entity_outliner.py +++ /dev/null @@ -1,114 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17218882: Entity duplication in Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/17218882 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.entity as entity -import azlmbr.bus as bus -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest -from PySide2.QtCore import Qt, QObject, QEvent, QPoint -from PySide2.QtGui import QContextMenuEvent -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper -from re import compile as regex - - -class TestEntityDuplication(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="entity_duplication_entity_outliner: ", args=["level"]) - - def run_test(self): - """ - Summary: - Verify if the entities in the Entity Outliner can be duplicated. - - Expected Behavior: - Entities can be duplicated and can be undone. - - Test Steps: - 1) Open a new level - 2) Create a new entity by clicking "New Entity" - 3) Duplicate entity using shortcut CTRL+D - 4) Undo entity duplication using CTRL+Z - 5) Duplicate entity using Right click "Duplicate" Action - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_entity_count_name(entity_name="Entity2"): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Create a new entity by clicking "New Entity" - general.clear_selection() - editor_window = pyside_utils.get_editor_main_window() - - outliner_widget = pyside_utils.find_child_by_hierarchy(editor_window, - ..., - dict(windowTitle=regex("Entity Outliner.*")), - ..., - "m_objectList").parent() - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - - action = pyside_utils.find_child_by_pattern(outliner_widget, "Create Entity") - action.trigger() - if get_entity_count_name() == 1: - print("First entity created") - - # 3) Duplicate entity using shortcut CTRL+D - for index in range(3): - QtTest.QTest.keyPress(outliner_widget, Qt.Key_D, Qt.ControlModifier) - success = lambda: get_entity_count_name() == index+2 - self.wait_for_condition(success) - print(f"Entity duplicated using shortcut - {index+1} success: {success()}") - - # 4) Undo entity duplication using CTRL+Z - QtTest.QTest.keyPress(outliner_widget, Qt.Key_Z, Qt.ControlModifier) - success = lambda: get_entity_count_name() == 3 - self.wait_for_condition(success) - print(f"Entity duplication Undo success: {success()}") - - # 5) Duplicate entity using Right click "Duplicate" Action - general.select_object("Entity2") - for index in range(3): - index_to_duplicate = pyside_utils.find_child_by_pattern(tree, "Entity2") - pyside_utils.trigger_context_menu_entry(tree, "Duplicate", index=index_to_duplicate) - success = lambda: get_entity_count_name() == index+4 - self.wait_for_condition(success) - print(f"Entity duplication using right click - {index+1} success: {success()}") - - -test = TestEntityDuplication() -test.run() diff --git a/Tests/editor/EditorScripts/entity_manipulation_in_outliner.py b/Tests/editor/EditorScripts/entity_manipulation_in_outliner.py deleted file mode 100755 index 1c7609384a..0000000000 --- a/Tests/editor/EditorScripts/entity_manipulation_in_outliner.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6384955: Basic Workflow: Entity Manipulation in the Outliner -https://testrail.agscollab.com/index.php?/cases/view/6384955 -""" - -import os -import sys -from typing import Optional - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.bus as bus -import azlmbr.entity as entity -import azlmbr.editor as editor -import azlmbr.math as math -import azlmbr.legacy.general as general - -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as editor_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class BasicWorkflow(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="entity_manipulation_in_outliner", args=["level"]) - - def run_test(self): - """ - Summary: - Manipulate entities in the Entity Outliner - - Expected: - Entities/Children can be created/restructured - - Test Steps: - 0) Open new test level - 1) Create the Entities/Child Entities - 1.1) Create Parent Entity - 1.2) Create Child Entity - 1.3) Create Grandchild Entity - 1.4) Entities/Children can be created in Outliner and are displayed properly - 2) Move the grandchild entity (child of the child entity) to be a child of the Parent (top level) entity - 3) Verify Entity Heirarchies can be restructured from the Entity Outliner - 4) Undo Entity Restructure (Ctrl+Z) - 5) Verify Entity Hierarchy Restructure is undone - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def verify_parent(entity_to_check, expected_parent_entity, additional_pretext: Optional[str] = ""): - entity_to_check.get_parent_info() - actual_parent_id = entity_to_check.parent_id - actual_parent_name = entity_to_check.parent_name - - # fmt:off - print(f"{additional_pretext} The parent entity of {entity_to_check.name}: Expected: {expected_parent_entity.name}; Actual: {actual_parent_name}") - assert actual_parent_id == expected_parent_entity.id, \ - "The IDs of the actual and expected parent entities did not match" - # fmt:on - - # 0) Create or open any level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 1) Create the Entities/Child Entities - entity_postition = math.Vector3(125.0, 136.0, 32.0) - components_to_add = [] - - # 1.1) Create an entity called "Parent" - parent_entity = editor_utils.Entity("Parent") - parent_entity.create_entity(entity_postition, components_to_add) - - # 1.2) Create a child entity for "Parent" named "Child" - child_entity = editor_utils.Entity("Child") - child_entity.create_entity(entity_postition, components_to_add, parent_entity.id) - - # 1.3) Create a child entity for "Child" named "Grandchild" - grandchild_entity = editor_utils.Entity("Grandchild") - grandchild_entity.create_entity(entity_postition, components_to_add, child_entity.id) - - # 1.4) Verify the hierarchy of the entities (Parent>Child>Grandchild) - # Child should be a child to Parent - verify_parent(child_entity, parent_entity, "Original Check:") - # Grandchild should be a child to Child - verify_parent(grandchild_entity, child_entity, "Original Check:") - - # 2) Click and drag the Grandchild from the Child entity to the Parent entity - grandchild_entity.set_test_parent_entity(parent_entity) - - # 3) Verify the Granchild entity is now a child of the Parent Entity - verify_parent(grandchild_entity, parent_entity, "After Move:") - - # 4) Press Ctrl+Z using hydra utilities to undo the moving of the Grandchild - general.undo() - - # 5) Verify the hierarchy has returned to the original orientation - verify_parent(grandchild_entity, child_entity, "After Undo:") - - -test = BasicWorkflow() -test.run() diff --git a/Tests/editor/EditorScripts/entity_selection_entity_outliner.py b/Tests/editor/EditorScripts/entity_selection_entity_outliner.py deleted file mode 100755 index 6ec16e8983..0000000000 --- a/Tests/editor/EditorScripts/entity_selection_entity_outliner.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C2202976: Entity Selection - Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/2202976 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.entity as entity -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.slice as slice -import azlmbr.asset as asset -import azlmbr.math as math -import Tests.ly_shared.hydra_editor_utils as hydra -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtCore, QtWidgets, QtGui -from re import compile as regex -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class EntitySelectionEntityOutlinerTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="entity_selection_entity_outliner", args=["level"]) - - def run_test(self): - """ - Summary: - Entity Selection - Entity Outliner - We need to verify if the Entity outliner works as expected - for the entity selections by verifying the selected items. - - Expected Behavior: - Single clicking entities will swap selection between entities. - CTRL+Clicking entities will add to/remove from the selection group. - - Test Steps: - 1) Open level - 2) Create 3 new entities in the outliner - 3) Get Model Index for all the entities - 4) Verify single click - 5) Verify CTRL+click - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def verify_selected_index(expected_entity_list): - # NOTE: selectedIndexes() seems to return 2 extra elements for each item seleted whose data() is None - # So removing the items whose data is None and considering only the selected items having data. - selected_indexes = [i.data() for i in tree.selectedIndexes() if i.data()] - return sorted(selected_indexes) == sorted(expected_entity_list) - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # Get the editor window object - editor_window = pyside_utils.get_editor_main_window() - - # Get the outliner widget object based on the window title - outliner_widget = pyside_utils.find_child_by_hierarchy( - editor_window, ..., dict(windowTitle=regex("Entity Outliner.*")), ..., "m_objectList" - ).parent() - - # Get the object tree in the entity outliner - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - - # 2) Create 3 new entities in the outliner - entity_postition = math.Vector3(125.0, 136.0, 32.0) - entity_list = ["Entity2", "Entity3", "Entity4"] - [hydra.Entity(name).create_entity(entity_postition, []) for name in entity_list] - - # 3) Get Model Index for all the entities - model_index_2, model_index_3, model_index_4 = [ - pyside_utils.find_child_by_pattern(tree, name) for name in entity_list - ] - - # 4) Verify single click - # click on Entity2 and verify if it is selected - pyside_utils.item_view_index_mouse_click(tree, model_index_2) - print(f"Single entity selected on first click: {verify_selected_index(['Entity2'])}") - - # click on Entity3 and verify if only that is selected - pyside_utils.item_view_index_mouse_click(tree, model_index_3) - print(f"Single entity selected on second click: {verify_selected_index(['Entity3'])}") - - # 5) Verify CTRL+click - # CTRL+click on Entity2 and verify if Entity2 and Entity3 are selected as Entity is already selected - pyside_utils.item_view_index_mouse_click(tree, model_index_2, modifier=QtCore.Qt.ControlModifier) - print( - f"CTRL+click worked for adding selected elements (2 elements): {verify_selected_index(['Entity2', 'Entity3'])}" - ) - - # CTRL+click on Entity4 and verify if Entity 2, 3, 4 are selected - pyside_utils.item_view_index_mouse_click(tree, model_index_4, modifier=QtCore.Qt.ControlModifier) - print( - f"CTRL+click worked for adding selected elements (3 elements): {verify_selected_index(['Entity2', 'Entity3', 'Entity4'])}" - ) - - # CTRL+click on already selected element (Entity2) to verify if it is removed from selected items - pyside_utils.item_view_index_mouse_click(tree, model_index_2, modifier=QtCore.Qt.ControlModifier) - print( - f"CTRL+click worked for removing already selected elements: {verify_selected_index(['Entity3', 'Entity4'])}" - ) - -test = EntitySelectionEntityOutlinerTest() -test.run() diff --git a/Tests/editor/EditorScripts/export_level.py b/Tests/editor/EditorScripts/export_level.py deleted file mode 100755 index 0935a7a2e9..0000000000 --- a/Tests/editor/EditorScripts/export_level.py +++ /dev/null @@ -1,80 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C15167491: Export a level -https://testrail.agscollab.com/index.php?/cases/view/15167491 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.editor as editor -import Tests.ly_shared.pyside_utils as pyside_utils -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestExportALevel(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="export_level: ", args=["level"]) - - def run_test(self): - """ - Summary: - Export a Level and verify if the level file is created. - - Expected Behavior: - The level is exported and the message "Export to the game was successfully done." appears in the console. - The level.pak file is created after exporting. - - Test Steps: - 1) Create new level - 2) Export level - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def on_action_triggered(): - print("Game->Export to Engine Action triggered") - - # 1) Create new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Export level - editor_window = pyside_utils.get_editor_main_window() - action = pyside_utils.get_action_for_menu_path(editor_window, "Game", "Export to Engine") - action.triggered.connect(on_action_triggered) - action.trigger() - action.triggered.disconnect(on_action_triggered) - level_pak_file = os.path.join( - "SamplesProject", "Levels", self.args["level"], "level.pak" - ) - general.idle_wait(3.0) - if os.path.exists(level_pak_file): - print("level.pak file exists") - - -test = TestExportALevel() -test.run() diff --git a/Tests/editor/EditorScripts/game_menu_options.py b/Tests/editor/EditorScripts/game_menu_options.py deleted file mode 100755 index f1a9983f70..0000000000 --- a/Tests/editor/EditorScripts/game_menu_options.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C24064530 : Game Menu Options -https://testrail.agscollab.com/index.php?/cases/view/24064530 - -C16780793: Game Menu Options (New Viewport Interaction Model) -https://testrail.agscollab.com/index.php?/cases/view/16780793 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestGameMenuOptions(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="game_menu_options: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with Game Menu options and verify if all the options are working. - - Expected Behavior: - The Game menu functions normally. - - Test Steps: - 1) Open level - 2) Interact with Game Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - game_menu_options = [ - ("Play Game",), - ("Simulate",), - ("Export to Engine",), - ("Export Occlusion Mesh",), - ("Enable Camera Terrain Collision",), - ("Move Player and Camera Separately",), - ("AI", "Request a full MNM rebuild",), - ("AI", "Show Navigation Areas",), - ("AI", "Continuous Update",), - ("AI", "Visualize Navigation Accessibility",), - ("AI", "View Agent Type",), - ("Audio", "Stop All Sounds",), - ("Audio", "Refresh Audio",), - ("Debugging", "Configure ToolBox Macros",), - ("Debugging", "ToolBox Macros",), - ("Debugging", "Error Report",), - ] - - def on_focus_changed(old, new): - print("Focus Changed") - QtWidgets.QApplication.activeModalWidget().close() - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - if action_name == "Simulate": - general.exit_simulation_mode() - elif action_name == "Play Game": - general.exit_game_mode() - - # 1) Create a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Interact with Game Menu options - try: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - for option in game_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "Game", *option) - if action.isVisible(): - print(f"{option} is visible in Game Menu") - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - general.idle_wait(2.0) - else: - print(f"{option} is not visible in Game Menu") - except Exception as e: - print(e) - finally: - app.focusChanged.disconnect(on_focus_changed) - -test = TestGameMenuOptions() -test.run() diff --git a/Tests/editor/EditorScripts/graphics_settings.py b/Tests/editor/EditorScripts/graphics_settings.py deleted file mode 100755 index c529f1c267..0000000000 --- a/Tests/editor/EditorScripts/graphics_settings.py +++ /dev/null @@ -1,238 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6321557: Basic Function: Graphics Settings -https://testrail.agscollab.com/index.php?/cases/view/6321557 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general - -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest, QtCore -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper -from enum import Enum, auto - -class FocusChangeState(Enum): - IGNORE = auto() # We're not waiting for anything - SETTINGS_WINDOW_APPEAR = auto() # Waiting for the settings window to appear - WARNING_DIALOG_APPEAR = auto() # Waiting for the warning about risks of changing settings - POST_WARNING_DIALOG = auto() # After that, it'll either be a log message or source control warning. - SAVE_WARNING_APPEAR = auto() # Waiting for the "Could not save" dialog if source control stopped us. - LOG_WINDOW_APPEAR = auto() # Waiting for the log window to appear - CLOSE_WITHOUT_SAVING = auto() # Waiting for the close without saving dialog. - - -class TestGraphicsSettings(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="graphics_settings: ", args=["level"]) - - def run_test(self): - """ - Summary: - Open the graphics settings, change a value and ensure the setting changes. - - Expected Behavior: - Graphics settings can be changed. - - Test Steps: - 1) Open the graphics settings dialog. - 2) Check the Save button is disabled. - 3) Change a setting. - 4) Check the save button is enabled. - 5) Press the save button. - 6) Check a warning dialog has appeared. - 7) Press Yes. - 8) Check the dialog has closed. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def fail_test(msg): - print(msg) - print("Test failed.") - sys.exit() - - current_state = FocusChangeState.IGNORE - settings_have_saved = False - last_window_seen = None - - def handle_settings_dialog(): - nonlocal current_state - current_state = FocusChangeState.IGNORE - - general.idle_wait(0.0) - - active_widget = QtWidgets.QApplication.activeModalWidget() - - if active_widget is None: - fail_test("Failed to find graphics settings dialog.") - - save_button = pyside_utils.find_child_by_pattern(active_widget, "Save") - if save_button is None: - fail_test("Failed to find Save button") - - if type(save_button) != QtWidgets.QToolButton: - fail_test("Failed to find Save button 2") - - if save_button.isEnabled(): - fail_test("Save button is enabled before change.") - - spin_box = pyside_utils.find_child_by_pattern(active_widget, {"objectName": "e_viewdistratiocustom"}) - if spin_box is None: - fail_test("Failed to find spinbox.") - - if type(spin_box) != QtWidgets.QDoubleSpinBox: - fail_test("Failed to find spinbox.") - - current_value = spin_box.value() - spin_box.setValue(current_value * 2) - - new_value = spin_box.value() - if current_value == new_value: - fail_test("Failed to change value.") - - if not save_button.isEnabled(): - fail_test("Save button is not enabled after change.") - - current_state = FocusChangeState.WARNING_DIALOG_APPEAR - save_button.click() - - if not settings_have_saved: - current_state = FocusChangeState.CLOSE_WITHOUT_SAVING - - active_widget.close() - - def handle_warning_dialog(): - nonlocal current_state - current_state = FocusChangeState.IGNORE - active_widget = QtWidgets.QApplication.activeModalWidget() - - if active_widget is None: - fail_test("Failed to find warning dialog.") - - msg_box = active_widget.findChild(QtWidgets.QMessageBox) - if msg_box is None: - fail_test("Unable to find message box in warning dialog") - - if not msg_box.text().startswith("A non-tested setting could potentially crash the game"): - fail_test("Unexpected text in warning dialog: " + msg_box.text()) - - yes_button = pyside_utils.find_child_by_pattern(active_widget, "&Yes") - if yes_button is None: - fail_test("Failed to find yes button.") - - current_state = FocusChangeState.POST_WARNING_DIALOG - yes_button.click() - - def press_button_in_dialog(button_text, next_state): - nonlocal current_state - current_state = FocusChangeState.IGNORE - - active_widget = QtWidgets.QApplication.activeModalWidget() - - button = pyside_utils.find_child_by_pattern(active_widget, button_text) - if button is None: - fail_test("Failed to find " + button_text + " button.") - - current_state = next_state - button.click() - - def check_for_save_success(log_dialog_widget): - nonlocal settings_have_saved - - msg_box = log_dialog_widget.findChild(QtWidgets.QMessageBox) - if msg_box is None: - return - - if msg_box.text().startswith("Updated the graphics setting correctly"): - settings_have_saved = True - - def on_focus_changed(old, new): - nonlocal current_state, settings_have_saved, last_window_seen - - if current_state == FocusChangeState.IGNORE: - return - - active_widget = QtWidgets.QApplication.activeModalWidget() - if active_widget is None: - return - - # Make sure the window has changed. - if active_widget == last_window_seen: - return - - last_window_seen = active_widget - - title = pyside_utils.find_child_by_pattern(active_widget, "title") - if title is None: - return - - if current_state == FocusChangeState.SETTINGS_WINDOW_APPEAR: - # We're waiting for the settings dialog, ensure the right one has appeared. - if title.text() == "Graphics Settings": - handle_settings_dialog() - elif current_state == FocusChangeState.WARNING_DIALOG_APPEAR: - if title.text() == "Warning": - handle_warning_dialog() - elif current_state == FocusChangeState.POST_WARNING_DIALOG: - # This could be a source control dialog, or a log window if the settings file exists and is writable. - if title.text() == "Source Control": - # Just use overwrite for the project settings file. - press_button_in_dialog("Overwrite", FocusChangeState.POST_WARNING_DIALOG) - elif title.text() == "Log": - # After this, there will be another log window for the file that did save. - check_for_save_success(active_widget) - press_button_in_dialog("OK", FocusChangeState.LOG_WINDOW_APPEAR) - elif current_state == FocusChangeState.SAVE_WARNING_APPEAR: - if title.text() == "Warning": - press_button_in_dialog("OK", FocusChangeState.LOG_WINDOW_APPEAR) - elif current_state == FocusChangeState.LOG_WINDOW_APPEAR: - if title.text() == "Log": - check_for_save_success(active_widget) - press_button_in_dialog("OK", FocusChangeState.IGNORE) - elif current_state == FocusChangeState.CLOSE_WITHOUT_SAVING: - if title.text() == "Warning": - press_button_in_dialog("&Yes", FocusChangeState.IGNORE) - - EditorTestHelper.after_level_load(self) - - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - - editor_window = pyside_utils.get_editor_main_window() - action = pyside_utils.get_action_for_menu_path(editor_window, "Edit", "Editor Settings", "Graphics Settings") - if action is None: - fail_test("Failed to find Graphics Settings action.") - - current_state = FocusChangeState.SETTINGS_WINDOW_APPEAR - action.trigger() - - app.focusChanged.disconnect(on_focus_changed) - - if settings_have_saved: - print("Graphics Settings test successful.") - else: - print("Graphics Settings test failed.") - - -test = TestGraphicsSettings() -test.run() - diff --git a/Tests/editor/EditorScripts/help_menu_function.py b/Tests/editor/EditorScripts/help_menu_function.py deleted file mode 100755 index 47f606c796..0000000000 --- a/Tests/editor/EditorScripts/help_menu_function.py +++ /dev/null @@ -1,127 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" -""" -C1564080: Help Menu Function -https://testrail.agscollab.com/index.php?/cases/view/1564080 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtCore, QtWidgets, QtGui -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestHelpMenuFunction(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="help_menu_function: ") - - def run_test(self): - """ - Summary: - Interact with Help Menu options that open Urls and verify if Urls are valid. - - Expected Behavior: - The Help menu Urls are valid. - - Test Steps: - 1) Interact with Help Menu options that open Urls - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - url_help_menu_options = [ - ("Getting Started",), - ("Tutorials",), - ("Documentation", "Glossary",), - ("Documentation", "Lumberyard Documentation",), - ("Documentation", "GameLift Documentation",), - ("Documentation", "Release Notes",), - ("GameDev Resources", "GameDev Blog",), - ("GameDev Resources", "GameDev Twitch Channel",), - ("GameDev Resources", "Forums",), - ("GameDev Resources", "AWS Support",), - ("About Lumberyard",), - ] - - def validate_url_action(action_name, urlHandler): - if urlHandler.last_opened_url.isEmpty(): - print(f"{action_name} didn't open a url with an expected scheme (http/https)") - else: - url_display_string = urlHandler.last_opened_url.toDisplayString() - if urlHandler.last_opened_url.isValid(): - print(f"{action_name} triggered Url {url_display_string}") - else: - print(f"{action_name} triggered invalid Url {url_display_string}") - urlHandler.last_opened_url.clear() - - def on_focus_changed(old, new): - active_widget = QtWidgets.QApplication.activeModalWidget() - if active_widget: - active_widget.close() - - # 1) Interact with the Help Menu options that open urls - try: - # Create a handler to open Urls - class UrlHandler(QtCore.QObject): - self.last_opened_url = QtCore.QUrl() - @QtCore.Slot("QUrl") - def open_url(self, url): - self.last_opened_url = url - urlHandler = UrlHandler() - QtGui.QDesktopServices.setUrlHandler("https", urlHandler, "open_url") - QtGui.QDesktopServices.setUrlHandler("http", urlHandler, "open_url") - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - # Check help menu actions that trigger Urls - for option in url_help_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "Help", *option) - if action.isVisible(): - action.trigger() - action_name = action.iconText() - validate_url_action(f"{action_name} Action", urlHandler) - else: - print(f"{option} is not visible in Help Menu") - # Check the documentation search field under the help menu - menu_bar = editor_window.menuBar() - menu_bar_actions = [index.iconText() for index in menu_bar.actions()] - main_menu_item = "Help" - if main_menu_item not in menu_bar_actions: - print(f"QAction not found for main menu item '{main_menu_item}'") - else: - help_action = menu_bar.actions()[menu_bar_actions.index(main_menu_item)] - # Get the first action in the help menu which should be the search action - search_action = help_action.menu().actions()[0] - # Get the search line edit from the search action - search_line_widget = search_action.defaultWidget().findChild(QtWidgets.QLineEdit) - search_string = "component" - search_line_widget.setText(search_string) - search_line_widget.returnPressed.emit() - validate_url_action(f"Documentation search with '{search_string}' text", urlHandler) - search_string = "" - search_line_widget.setText(search_string) - search_line_widget.returnPressed.emit() - validate_url_action(f"Documentation Search with '{search_string}' text", urlHandler) - finally: - app.focusChanged.disconnect(on_focus_changed) - QtGui.QDesktopServices.unsetUrlHandler("https") - QtGui.QDesktopServices.unsetUrlHandler("http") - -test = TestHelpMenuFunction() -test.run() diff --git a/Tests/editor/EditorScripts/help_menu_options.py b/Tests/editor/EditorScripts/help_menu_options.py deleted file mode 100755 index c5d5cb91bb..0000000000 --- a/Tests/editor/EditorScripts/help_menu_options.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" -""" -C24064533: The Help menu functions normally. -https://testrail.agscollab.com/index.php?/cases/view/24064533 - -C16780815: Help Menu Options (New Viewport Interaction Model) -https://testrail.agscollab.com/index.php?/cases/view/16780815 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestHelpMenuOptions(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="help_menu_options: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with Help Menu options and verify if all the options are working. - - Expected Behavior: - The Help menu functions normally. - - Test Steps: - 1) Open level - 2) Interact with Help Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - help_menu_options = [ - ("Getting Started",), - ("Tutorials",), - ("Documentation", "Glossary",), - ("Documentation", "Lumberyard Documentation",), - ("Documentation", "GameLift Documentation",), - ("Documentation", "Release Notes",), - ("GameDev Resources", "GameDev Blog",), - ("GameDev Resources", "GameDev Twitch Channel",), - ("GameDev Resources", "Forums",), - ("GameDev Resources", "AWS Support",), - ("Give Us Feedback",), - ("About Lumberyard",), - ] - - def on_focus_changed(old, new): - QtWidgets.QApplication.activeModalWidget().close() - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - # 1) Create a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Interact with Help Menu options - try: - for option in help_menu_options: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - action = pyside_utils.get_action_for_menu_path(editor_window, "Help", *option) - if action.isVisible(): - print(f"{option} is visible in Help Menu") - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - general.idle_wait(2.0) - else: - print(f"{option} is not visible in Help Menu") - except Exception as e: - print(e) - finally: - app.focusChanged.disconnect(on_focus_changed) - -test = TestHelpMenuOptions() -test.run() diff --git a/Tests/editor/EditorScripts/left_and_right_mouse_buttons.py b/Tests/editor/EditorScripts/left_and_right_mouse_buttons.py deleted file mode 100755 index 19d10db6ff..0000000000 --- a/Tests/editor/EditorScripts/left_and_right_mouse_buttons.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1564610: LMB and RMB mouse functionality -https://testrail.agscollab.com/index.php?/cases/view/1564610 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.entity as entity -import azlmbr.bus as bus -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestLeftAndRightMouseButtons(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="left_and_right_mouse_buttons: ", args=["level"]) - - def run_test(self): - """ - Summary: - Use left mouse button to select items in Editor and - Right mouse button to open the item. - - Expected Behavior: - LMB interaction is correct and accurate. - RMB functions normally and appropriate context menus are opened. - - Test Steps: - 1) Open a new level - 2) Test LMB and RMB on Viewport of editor to open context menus and select items. - 2.1) Create camera entity from view - 2.2) Create entity - 2.3) Create layer - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_entity_count_name(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Test RMB and LMB on Viewport of editor to open context menus and select items. - # Note: pyside_utils.trigger_context_menu_entry(widget, pattern, pos=None) does same - # functionality as Right click to open context menu and left click to select options in menu. - - app = QtWidgets.QApplication.instance() - editor_window = pyside_utils.get_editor_main_window() - viewport = editor_window.findChildren(QtWidgets.QWidget, "renderOverlay")[0] - - # 2.1) Create camera entity from view - pyside_utils.trigger_context_menu_entry(viewport, "Create camera entity from view") - if get_entity_count_name("Camera1"): - print("Create camera entity from view option is selected using mouse buttons") - # 2.2) Create entity - pyside_utils.trigger_context_menu_entry(viewport, "Create entity") - if get_entity_count_name("Entity3"): - print("Create entity option is selected using mouse buttons") - # 2.3) Create layer - pyside_utils.trigger_context_menu_entry(viewport, "Create layer") - if get_entity_count_name("Layer4*"): - print("Create layer option is selected using mouse buttons") - - -test = TestLeftAndRightMouseButtons() -test.run() diff --git a/Tests/editor/EditorScripts/load_level_unpushed_slice_changes.py b/Tests/editor/EditorScripts/load_level_unpushed_slice_changes.py deleted file mode 100755 index 20b52f4f71..0000000000 --- a/Tests/editor/EditorScripts/load_level_unpushed_slice_changes.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C5436953: Loading a level with un-pushed slice changes does not effect editor stability -https://testrail.agscollab.com/index.php?/cases/view/5436953 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.entity as entity -import azlmbr.bus as bus -import azlmbr.math as math -import azlmbr.asset as asset -import azlmbr.editor as editor -import azlmbr.slice as slice -import Tests.ly_shared.hydra_editor_utils as hydra -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class LoadLevelUnpushedSliceTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="load_level_unpushed_slice_changes", args=["level"]) - - def run_test(self): - """ - Summary: - Loading a level with un-pushed slice changes does not effect editor stability - - Expected Behavior: - The editor remains stable, level loads, and the slice still has pushable changes. - - Test Steps: - 1) Open a new level - 2) Create an entity and add a component to it - 3) Create slice from the entity - 4) Delete component from the entity - 5) Save the level - 6) Reload the same level - 7) Verify changes after reload - 8) Instantiate slice and verify if it has a component - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - SLICE_NAME = "TestSlice.slice" - - def search_entity(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return entities - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Create an entity and add a component to it - new_entity = hydra.Entity("entity") - new_entity.create_entity(math.Vector3(64.0, 64.0, 32.0), ["Mesh"]) - - # 3) Create slice from the entity - success = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", new_entity.id, SLICE_NAME) - print(f"Slice Created: {success}") - - # 4) Delete component from the entity - success = editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", [new_entity.components[0]]) - print(f"Component removed successfully: {success}") - - # 5) Save the level - general.save_level() - - # 6) Reload the same level - general.reload_current_level() - - # 7) Verify changes after reload - # Entity should not have the component - entity_id = search_entity("entity")[0] - print(f"Entity found after level reload: {entity_id.IsValid()}") - print( - f"Level saved even if there are unpushed changes in slice: {not hydra.has_components(entity_id, ['Mesh'])}" - ) - - # 8) Instantiate slice and verify if it has a component - # Delete existing slice initially - general.delete_object("entity") - # Instantiate slice - transform = math.Transform_CreateIdentity() - position = math.Vector3(64.0, 64.0, 32.0) - transform.SetPosition(position) - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", SLICE_NAME, math.Uuid(), False) - slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform) - self.wait_for_condition(lambda: len(search_entity("entity")) > 0, 2.0) - entity_id = search_entity("entity")[0] - print(f"Unpushed changes in Slice are not saved: {hydra.has_components(entity_id, ['Mesh'])}") - - -test = LoadLevelUnpushedSliceTest() -test.run() diff --git a/Tests/editor/EditorScripts/object_toolbar_function.py b/Tests/editor/EditorScripts/object_toolbar_function.py deleted file mode 100755 index e08216e169..0000000000 --- a/Tests/editor/EditorScripts/object_toolbar_function.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1564082 : Object Toolbar -https://testrail.agscollab.com/index.php?/cases/view/1564082 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as editor_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestObjectToolbar(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="object_toolbar_function: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with Object toolbar options and verify if all the options are functionnal. - - Expected Behavior: - All options available in the Object Toolbar function as intended. - - Test Steps: - 1) Create/Open a level - 2) Open the Object Toolbar - 3) Verify 'Go to selected object' tool button functionality - i) Create entity and find the entity in viewport - ii) Change viewport position - iii) Click on option and verify viewport position - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - editor_window = pyside_utils.get_editor_main_window() - object_toolbar = editor_window.findChild(QtWidgets.QToolBar, "Object") - - def get_tool_button(option): - button = pyside_utils.find_child_by_pattern(object_toolbar, option) - if button.text() == option: - return button - - # 1) Create new level with an Entity - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Open the Object Toolbar - if not object_toolbar.isVisible(): - object_toolbar.toggleViewAction().trigger() - if object_toolbar.isVisible(): - print("Object tool bar opened successfully") - - # 3) Verify 'Go to selected object' tool button functionality - # i)Create entity and find the entity in viewport - editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId.EntityId()) - - # Find entity in viewport and get current position - entity_outliner = pyside_utils.find_child_by_pattern(editor_window, "Entity Outliner (PREVIEW)") - action = pyside_utils.find_child_by_pattern(entity_outliner, "Find in viewport") - default_pos = general.get_current_view_position() - action.trigger() - self.wait_for_condition(lambda: default_pos != general.get_current_view_position(), 2.0) - old_pos = general.get_current_view_position() - - # ii) Change viewport position - general.set_current_view_position(old_pos.x + 10.0, old_pos.y + 10.0, old_pos.z + 10.0) - self.wait_for_condition(lambda: old_pos != general.get_current_view_position(), 2.0) - current_pos = general.get_current_view_position() - - # iii) Click on option and verify viewport position - button = get_tool_button("Go to selected object") - button.click() - self.wait_for_condition(lambda: current_pos != general.get_current_view_position(), 2.0) - new_pos = general.get_current_view_position() - if new_pos != current_pos and new_pos == old_pos: - print("Go to selected object tool button is responsive") - - -test = TestObjectToolbar() -test.run_test() diff --git a/Tests/editor/EditorScripts/open_level.py b/Tests/editor/EditorScripts/open_level.py deleted file mode 100755 index 3cc0a1c297..0000000000 --- a/Tests/editor/EditorScripts/open_level.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6351276: Open a level -https://testrail.agscollab.com/index.php?/cases/view/6351276 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -import azlmbr.editor as editor -import azlmbr.bus as bus -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestOpenLevel(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="open_level", args=["level"]) - - def run_test(self): - """ - Summary: - Open a level and verify if the level is loaded properly. - - Expected Behavior: - A level is opened and loaded into the editor. - - Test Steps: - 1) Open an existing level - 2) Verify if the level is loaded - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - self.focus_changed = False - def on_focus_changed(old, new): - if not self.focus_changed: - self.focus_changed = True - active_widget = QtWidgets.QApplication.activeModalWidget() - open_level_as_dialogue = active_widget.findChild(QtWidgets.QWidget, "LevelFileDialog") - if open_level_as_dialogue.windowTitle() == "Open a Level": - print("Open a Level dialog opened") - level_name = open_level_as_dialogue.findChild(QtWidgets.QLineEdit, "nameLineEdit") - level_name.setText(self.args["level"]) - button_box = open_level_as_dialogue.findChild(QtWidgets.QDialogButtonBox, "buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - # 1) Open an existing level - try: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - action = pyside_utils.get_action_for_menu_path(editor_window, "File", "Open Level") - action_triggered = lambda: on_action_triggered("Open Level") - action.triggered.connect(action_triggered) - action.trigger() - action.triggered.disconnect(action_triggered) - except Exception as e: - print(e) - finally: - app.focusChanged.disconnect(on_focus_changed) - - # 2) Verify if the new level is loaded - general.idle_wait(2.0) - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") == "Audio_Sample": - print("An existing level opened : SUCCESS") - else: - print("An existing level opened : FAILED") - - -test = TestOpenLevel() -test.run() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/open_save_input_binding_file.py b/Tests/editor/EditorScripts/open_save_input_binding_file.py deleted file mode 100755 index 08d46426ea..0000000000 --- a/Tests/editor/EditorScripts/open_save_input_binding_file.py +++ /dev/null @@ -1,168 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1506875: Open Input Bindings File -https://testrail.agscollab.com/index.php?/cases/view/1506875 - -C1506876: Save Input Bindings File -https://testrail.agscollab.com/index.php?/cases/view/1506876 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class OpenSaveInputBindingFileTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="open_save_input_binding_file", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Verify if we are able to open/save a .inputbindings file in Asset Editor - - Expected Behavior: - The .inputbindings asset is loaded into the Asset Editor, replacing any currently open files. - The .inputbindings file is saved correctly. - All changes from step 1. are present in the .inputbindings file. - - Test Steps: - 1) Open a new level - 2) Open Asset Editor - 3) Access Asset Editor - 4) Open .inputbindings file - 5) Verify if the file has loaded by verifying the status bar in Asset Editor - 6) Delete all input events initially - 7) Add an event and save the file - 8) Close Asset editor and reopen the inputbindings file - 9) Verify if changes are saved. - 10) Close Asset Editor - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - INPUTBINDING_FILE_NAME = "test.inputbindings" - - def open_asset_editor(): - general.open_pane("Asset Editor") - return general.is_pane_visible("Asset Editor") - - def close_asset_editor(): - general.close_pane("Asset Editor") - return not general.is_pane_visible("Asset Editor") - - async def open_input_binding_file(): - # Trigger the open asynchronously, since it opens a modal dialog - action = pyside_utils.find_child_by_pattern(asset_editor_widget, {"iconText": "Open"}) - pyside_utils.trigger_action_async(action) - - # This is to deal with the file picker for .inputbinding - active_modal_widget = await pyside_utils.wait_for_modal_widget() - tree = active_modal_widget.findChild(QtWidgets.QTreeView, "m_assetBrowserTreeViewWidget") - # Make sure the folder structure tree is expanded so that after giving the searchtext the first - # .inputbinding file is selected - tree.expandAll() - search_text = active_modal_widget.findChild(QtWidgets.QLineEdit, "textSearch") - # Set the searchText so that the first .inputbinding file in the folder structure is selected - search_text.setText(INPUTBINDING_FILE_NAME) - model_index = pyside_utils.find_child_by_pattern(tree, INPUTBINDING_FILE_NAME) - pyside_utils.item_view_index_mouse_click(tree, model_index) - # Click OK - button_box = active_modal_widget.findChild(QtWidgets.QDialogButtonBox, "m_buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Open Asset Editor - print(f"Asset Editor opened: {open_asset_editor()}") - - # 3) Access Asset Editor - editor_window = pyside_utils.get_editor_main_window() - asset_editor = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor") - asset_editor_widget = asset_editor.findChild(QtWidgets.QWidget, "m_assetEditorWidget") - - # 4) Open .inputbindings file - await open_input_binding_file() - - # 5) Verify if the file has loaded by verifying the status bar in Asset Editor - status_bar = asset_editor_widget.findChild(QtWidgets.QWidget, "AssetEditorStatusBar") - text_edit = status_bar.findChild(QtWidgets.QLabel, "textEdit") - success = await pyside_utils.wait_for_condition(lambda: f"{INPUTBINDING_FILE_NAME} - Asset loaded!" in text_edit.text(), 2.0) - if success: - print("Input Binding File opened in the Asset Editor") - - # C1506876 - # 6) Delete all input events initially - await pyside_utils.wait_for_condition(lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "Input Event Groups") is not None) - input_event_groups = asset_editor_widget.findChild(QtWidgets.QFrame, "Input Event Groups") - delete_all_button = input_event_groups.findChildren(QtWidgets.QToolButton, "")[1] - pyside_utils.click_button_async(delete_all_button) - - # Clicking the Delete All button will prompt the user if they are sure they want to - # delete all the entries, so we wait for this modal dialog and then accept it - active_modal_widget = await pyside_utils.wait_for_modal_widget() - message_box = active_modal_widget.findChild(QtWidgets.QMessageBox) - yes_button = message_box.button(QtWidgets.QMessageBox.Yes) - yes_button.click() - - # 7) Add an event and save the file - # First QToolButton is +, Second QToolButton is Delete - await pyside_utils.wait_for_condition(lambda: len(asset_editor_widget.findChildren(QtWidgets.QFrame, "Input Event Groups")) > 1, 2.0) - input_event_groups = asset_editor_widget.findChildren(QtWidgets.QFrame, "Input Event Groups")[1] - add_button = input_event_groups.findChild(QtWidgets.QToolButton, "") - add_button.click() - action = pyside_utils.find_child_by_pattern(asset_editor_widget, {"text": "&Save"}) - action.trigger() - await pyside_utils.wait_for_condition(lambda: "Asset saved!" in text_edit.text(), 2.0) - - # 8) Close Asset editor and reopen the inputbindings file - close_asset_editor() - open_asset_editor() - await open_input_binding_file() - - # 9) Verify if changes are saved. (1 Event should be present) - # We need to re-find the Asset Editor and all its child widgets since we - # close/re-opened it, so it is brand new - asset_editor = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor") - asset_editor_widget = asset_editor.findChild(QtWidgets.QWidget, "m_assetEditorWidget") - input_event_groups = asset_editor_widget.findChild(QtWidgets.QFrame, "Input Event Groups") - no_of_elements_label = input_event_groups.findChild(QtWidgets.QLabel, "DefaultLabel") - success = await pyside_utils.wait_for_condition(lambda: "1 elements" in no_of_elements_label.text(), 3.0) - if success: - print("Changes are saved successfully") - - # 6) Close Asset Editor - print(f"Asset Editor closed: {close_asset_editor()}") - - -test = OpenSaveInputBindingFileTest() -test.run() diff --git a/Tests/editor/EditorScripts/outliner_search.py b/Tests/editor/EditorScripts/outliner_search.py deleted file mode 100755 index 7211adc74e..0000000000 --- a/Tests/editor/EditorScripts/outliner_search.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17218816: Entity Outliner Searching -https://testrail.agscollab.com/index.php?/cases/view/17218816 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.editor as editor -import azlmbr.entity as entity -import azlmbr.bus as bus -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest -from PySide2.QtCore import Qt, QObject, QEvent, QPoint -from PySide2.QtGui import QContextMenuEvent, QCursor -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - -class TestEntityOutlinerSearching(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="outliner_search: ", args=["level"]) - - def run_test(self): - """ - Summary: - Verify the search function of the Entity Outliner works properly - - Expected Behavior: - Typing text on the Entity Outliner search field limits the number of entities shown in the tree view - - Test Steps: - 1) Create new level - 2) Create some test entities - 3) Write in the Entity Outliner search field (different combinations) and validate - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=False, - ) - general.idle_wait(3.0) - - # Grab the Outliner - - app = QtWidgets.QApplication.instance() - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - entity_outliner = main_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)") - outliner_main_window = entity_outliner.findChild(QtWidgets.QMainWindow) - tree = outliner_main_window.findChild(QtWidgets.QTreeView, "m_objectTree") - search = outliner_main_window.findChild(QtWidgets.QLineEdit, "textSearch") - - # Store number of starting entities, just in case - startingEntityCount = tree.model().rowCount() - - # 2) Create entities - - def CreateEntityWithName(name): - entityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', entity.EntityId()) - editor.EditorEntityAPIBus(bus.Event, 'SetName', entityId, name) - - CreateEntityWithName("Test_01") - CreateEntityWithName("Test_02") - CreateEntityWithName("Test_03") - CreateEntityWithName("AnotherTest") - CreateEntityWithName("Entity01") - CreateEntityWithName("Entity02") - - # Count rows in Outliner - fullEntityCount = tree.model().rowCount() - - if((fullEntityCount - startingEntityCount) == 6): - print("Test Entities were set up correctly") - - # 3) Write in the Entity Outliner search field (different combinations) - - # Write "Test_0" in search box - search.setText("Test_0") - - entityCount = tree.model().rowCount() - if(entityCount == 3): - print("Searching Test_0 returns 3 entities") - - # Write "Test" in search box - search.setText("Test") - - entityCount = tree.model().rowCount() - if(entityCount == 4): - print("Searching Test returns 4 entities") - - # Write "asdfgh" in search box - search.setText("asdfgh") - - entityCount = tree.model().rowCount() - if(entityCount == 0): - print("Searching asdfgh returns 0 entities") - - # Write "" in search box - search.setText("") - - entityCount = tree.model().rowCount() - if(entityCount == fullEntityCount): - print("Emptying the search returns all entities") - -test = TestEntityOutlinerSearching() -test.run() diff --git a/Tests/editor/EditorScripts/quick_push_slice.py b/Tests/editor/EditorScripts/quick_push_slice.py deleted file mode 100755 index 6ab0127a31..0000000000 --- a/Tests/editor/EditorScripts/quick_push_slice.py +++ /dev/null @@ -1,127 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2669525: Adding and deleting entities to a slice are able to be quick pushed to slice -https://testrail.agscollab.com/index.php?/cases/view/2669525 -""" - -import os -import sys - -import azlmbr.legacy.general as general -import azlmbr.bus as bus -import azlmbr.math as math -import azlmbr.asset as asset -import azlmbr.editor as editor -import azlmbr.slice as slice -import azlmbr.entity as EntityId -import Tests.ly_shared.pyside_utils as pyside_utils -from re import compile as regex -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class QuickPushSliceTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="quick_push_slice", args=["level"]) - - def run_test(self): - """ - Summary: - Adding and deleting entities to a slice are able to be quick pushed to slice - - Expected Behavior: - The slice is saved and the second instance of the slice is updated with the - deletion of Child 1 and a addition of Child 2. - - Test Steps: - 1) Open a new level - 2) Create 2 entities as parent and child - 3) Create slice from the parent entity - 4) Wait until slice is created - 5) Instantiate a newly created slice - 6) Delete child on original slice - 7) Add a child to the original slice entity - 8) Save slice overrides - 9) Verify if the instantiated slice has a new child - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - SLICE_NAME = "temp_slice.slice" - - def path_is_valid_asset(asset_path): - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False) - return asset_id.invoke("IsValid") - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Create 2 entities as parent and child - parent_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId.EntityId()) - child_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_id) - editor.EditorEntityAPIBus(bus.Event, "SetName", child_id, "child1") - - # 3) Create slice from the parent entity - success = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", parent_id, SLICE_NAME) - print(f"Slice Created: {success}") - - # 4) Wait until slice is created - self.wait_for_condition(lambda: path_is_valid_asset(SLICE_NAME), 3.0) - - # 5) Instantiate a newly created slice - transform = math.Transform_CreateIdentity() - position = math.Vector3(64.0, 64.0, 32.0) - transform.SetPosition(position) - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", SLICE_NAME, math.Uuid(), False) - slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform) - - # 6) Delete child on original slice - editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", [child_id]) - - # 7) Add a child to the original slice entity - child_2_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_id) - editor.EditorEntityAPIBus(bus.Event, "SetName", child_2_id, "child2") - - # 8) Save slice overrides - editor_window = pyside_utils.get_editor_main_window() - outliner_widget = pyside_utils.find_child_by_hierarchy( - editor_window, ..., dict(windowTitle=regex("Entity Outliner.*")), ..., "m_objectList" - ).parent() - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - # Model index for the original slice - self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 2) is not None, 2.0) - model_index_1 = pyside_utils.get_item_view_index(tree, 1) - pyside_utils.trigger_context_menu_entry(tree, SLICE_NAME.lower(), index=model_index_1) - - # 9) Verify if the instantiated slice has a new child - # model index for instantiated slice - model_index_0 = pyside_utils.get_item_view_index(tree, 0) - self.wait_for_condition(lambda: pyside_utils.find_child_by_pattern(model_index_0, "child1") is None, 2.0) - if pyside_utils.find_child_by_pattern(model_index_0, "child2"): - print("Newly created child is updated in the instantiated slice") - if pyside_utils.find_child_by_pattern(model_index_0, "child1") is None: - print("Child deletion is updated in the instantiated slice") - - -test = QuickPushSliceTest() -test.run() diff --git a/Tests/editor/EditorScripts/quick_save_slice.py b/Tests/editor/EditorScripts/quick_save_slice.py deleted file mode 100755 index 99cc1b1477..0000000000 --- a/Tests/editor/EditorScripts/quick_save_slice.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17123213: Quick Saving Changes to Slice -https://testrail.agscollab.com/index.php?/cases/view/17123213 - -""" -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general - -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.asset as asset -import azlmbr.entity as entity -import azlmbr.math as math -import azlmbr.slice as slice -from azlmbr.entity import EntityId - -import Tests.ly_shared.pyside_utils as pyside_utils -import Tests.ly_shared.hydra_editor_utils as hydra -from re import compile as regex -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class QuickSaveSlice(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="quick_save_slice", args=["level"]) - - def run_test(self): - """ - Summary: - Quick Saving Changes to Slice - - Expected: - All changes made to the slice are saved - - Test Steps: - 1) Create or open a level - 2) Create a slice - 3) Create child entity - 4) Add a component to the slice. - 5) Quick save the slice - 6) Delete the existing slice before verifying if it is saved - 7) Reinstantiate the slice to verify if the changes are saved. - 8) Verify the saved changes - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - SLICE_NAME = "TempSlice.slice" - - def search_entity(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return entities - - # 1) Create or open any level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Create a slice - # Create an Entity to turn into a slice. - new_entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId()) - editor.EditorEntityAPIBus(bus.Event, "SetName", new_entity_id, "Entity2") - success = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", new_entity_id, SLICE_NAME) - print(f"Slice Created: {success}") - - # 3) Create child entity - child_entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", new_entity_id) - editor.EditorEntityAPIBus(bus.Event, "SetName", child_entity_id, "Entity3") - print(f"Child entity created: {child_entity_id.IsValid()}") - - # 4) Add a component to the slice. - hydra.add_component("Mesh", new_entity_id) - - # 5) Quick save the slice - editor_window = pyside_utils.get_editor_main_window() - outliner_widget = pyside_utils.find_child_by_hierarchy( - editor_window, ..., dict(windowTitle=regex("Entity Outliner.*")), ..., "m_objectList" - ).parent() - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - model_index = pyside_utils.find_child_by_pattern(tree, "Entity2") - pyside_utils.item_view_index_mouse_click(tree, model_index) - pyside_utils.trigger_context_menu_entry(tree, SLICE_NAME.lower()) - - # 6) Delete the existing slice before verifying if it is saved - editor.ToolsApplicationRequestBus(bus.Broadcast, 'DeleteEntities', [new_entity_id, child_entity_id]) - - # 7) Reinstantiate the slice to verify if the changes are saved. - transform = math.Transform_CreateIdentity() - position = math.Vector3(64.0, 64.0, 32.0) - transform.SetPosition(position) - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", SLICE_NAME, math.Uuid(), False) - slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform) - - # 8) Verify the saved changes - tree.expandAll() - self.wait_for_condition(lambda: len(search_entity("Entity3")) > 0, 2.0) - # Parent and child entities instantiated - parent_id = search_entity("Entity2")[0] - child_id = search_entity("Entity3")[0] - # Parent child hierarchy - parent_child_valid = parent_id.Equal(editor.EditorEntityInfoRequestBus(bus.Event, "GetParent", child_id)) - # Component in parent entity - has_component = hydra.has_components(parent_id, ["Mesh"]) - changes_saved = parent_id.IsValid() and child_id.IsValid() and parent_child_valid and has_component - print(f"Changes in the slice file are saved: {changes_saved}") - - -test = QuickSaveSlice() -test.run() diff --git a/Tests/editor/EditorScripts/recover_layer.py b/Tests/editor/EditorScripts/recover_layer.py deleted file mode 100755 index d251f46a09..0000000000 --- a/Tests/editor/EditorScripts/recover_layer.py +++ /dev/null @@ -1,239 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6130788: Recover a layer -https://testrail.agscollab.com/index.php?/cases/view/6130788 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.editor as editor -import azlmbr.bus as bus -import azlmbr.layers as layers - -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets, QtTest, QtCore -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestRecoverLayer(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="recover_layer: ", args=["level"]) - - def run_test(self): - """ - Summary: - Create two layers, delete them and ensure they can be recovered correctly. - - Expected Behavior: - Layers can be recovered. - - Test Steps: - 1) Create two new new levels - 2) Create two layers, one with "Save as binary" activated. - 3) Save the level. - 4) Delete the layers. - 5) Save the level again. - 6) Load the other level. - 7) Reload the first level. - 8) Reload the layers using the Asset Browser. - 9) Ensure the layers have recovered. - 9) Ensure the save options are correct. - 10) Undo, check the layers are removed - 11) Redo, check the layers are restored. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def fail_test(msg): - print(msg) - print("Test failed.") - sys.exit() - - def on_focus_changed_save_as(old, new): - active_widget = QtWidgets.QApplication.activeModalWidget() - save_level_as_dialogue = active_widget.findChild(QtWidgets.QWidget, "LevelFileDialog") - if save_level_as_dialogue.windowTitle() == "Save Level As ": - print("The 'Save Level As' dialog appeared") - level_name = save_level_as_dialogue.findChild(QtWidgets.QLineEdit, "nameLineEdit") - level_name.setText("test_level_2") - button_box = save_level_as_dialogue.findChild(QtWidgets.QDialogButtonBox, "buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - general.idle_wait(3.0) # wait for new level to load - - level_to_load = "" - - def get_inspector_window(): - nonlocal editor_window - inspector_dock = editor_window.findChild(QtWidgets.QWidget, "Entity Inspector") - entity_inspector = inspector_dock.findChild(QtWidgets.QMainWindow) - - child_widget = entity_inspector.findChild(QtWidgets.QWidget) - if child_widget is None: - fail_test("Failed to find inspector window") - - general.idle_wait(1.0) - comp_list_contents = ( - child_widget.findChild(QtWidgets.QScrollArea, "m_componentList") - .findChild(QtWidgets.QWidget, "qt_scrollarea_viewport") - .findChild(QtWidgets.QWidget, "m_componentListContents") - ) - - if comp_list_contents is None or len(comp_list_contents.children()) < 1: - return None - - return comp_list_contents.children()[1] - - def get_binary_save_state_for_layer(layer_name): - layer_id = general.find_editor_entity(layer_name) - if not layer_id.isValid(): - fail_test("Failed to find " + " after recovery") - - editor.ToolsApplicationRequestBus(bus.Broadcast, 'SetSelectedEntities', [layer_id]) - - layer_inspector = get_inspector_window() - if layer_inspector is None: - fail_test("Failed to find inspector window") - - frame = layer_inspector.findChild(QtWidgets.QFrame, "Save as binary") - check_box = frame.findChild(QtWidgets.QCheckBox) - - return check_box.isChecked() - - def set_binary_save_state_for_layer(layer_name, state): - layer_id = general.find_editor_entity(layer_name) - if not layer_id.isValid(): - fail_test("Failed to find " + " after recovery") - - editor.ToolsApplicationRequestBus(bus.Broadcast, 'SetSelectedEntities', [layer_id]) - - layer_inspector = get_inspector_window() - if layer_inspector is None: - fail_test("Failed to find inspector window") - - frame = layer_inspector.findChild(QtWidgets.QFrame, "Save as binary") - check_box = frame.findChild(QtWidgets.QCheckBox) - - check_box.setChecked(state) - - EditorTestHelper.after_level_load(self) - editor_window = pyside_utils.get_editor_main_window() - - # Create new level. - result = general.create_level_no_prompt("test_level_1", 1024, 1, 4096, True) - if result != 0: - fail_test("Failed to create level") - - general.idle_wait(1.0) - - # Create two layers - layer1_id = layers.EditorLayerComponent_CreateLayerEntityFromName('Layer1') - if layer1_id.isValid(): - print("Layer1 created.") - else: - fail_test("Layer1 creation failed.") - - layer2_id = layers.EditorLayerComponent_CreateLayerEntityFromName('Layer2') - if layer2_id.isValid(): - print("Layer2 created.") - else: - fail_test("Layer2 creation failed.") - - # Set the binary save option on layer 1. - set_binary_save_state_for_layer("Layer1", True) - - # Save as a different level name - try: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed_save_as) - action = pyside_utils.get_action_for_menu_path(editor_window, "File", "Save As") - action.trigger() - - finally: - app.focusChanged.disconnect(on_focus_changed_save_as) - - print("Saved level 2 with layers") - - # Delete the layers. - general.idle_wait(1.0) - editor.ToolsApplicationRequestBus(bus.Broadcast, 'DeleteEntities', [layer1_id, layer2_id]) - - # Save level 2 again. - general.save_level() - - print("Saved level 2 without layers") - - # Reopen level 1. - general.open_level_no_prompt("test_level_1") - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") != "test_level_1": - fail_test("Failed to reload test_level_1") - print("Reopened level 1") - - # Reopen level 2. - general.open_level_no_prompt("test_level_2") - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") != "test_level_2": - fail_test("Failed to reload test_level_2") - print("Reopened level 2") - - # Recover the layers - game_folder = editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'GetGameFolder') - layer1_path = game_folder + "\\Levels\\test_level_2\\Layers\\Layer1.layer" - layer2_path = game_folder + "\\Levels\\test_level_2\\Layers\\Layer2.layer" - - layers.EditorLayerComponent_RecoverLayer(layer1_path) - layers.EditorLayerComponent_RecoverLayer(layer2_path) - - # Check the binary save states are correct. - layer1_binary = get_binary_save_state_for_layer("Layer1") - layer2_binary = get_binary_save_state_for_layer("Layer2") - - if not layer1_binary: - fail_test("Layer1 save not set to binary.") - if layer2_binary: - fail_test("Layer2 save set to binary.") - - # Undo layer recovery. - general.undo() - general.undo() - - id1 = general.find_editor_entity("Layer1") - id2 = general.find_editor_entity("Layer2") - - if id1.isValid() or id2.isValid(): - fail_test("Failed to undo layer recovery.") - - # Redo layer recovery. - general.redo() - general.redo() - - id1 = general.find_editor_entity("Layer1") - id2 = general.find_editor_entity("Layer2") - - if not id1.isValid() or not id2.isValid(): - fail_test("Failed to redo layer recovery.") - - print("Recover Layer test complete.") - - -test = TestRecoverLayer() -test.run() - diff --git a/Tests/editor/EditorScripts/recover_layer_deleted_slice.py b/Tests/editor/EditorScripts/recover_layer_deleted_slice.py deleted file mode 100755 index 278746b461..0000000000 --- a/Tests/editor/EditorScripts/recover_layer_deleted_slice.py +++ /dev/null @@ -1,125 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6130896 : Recover a layer containing a deleted slice. -https://testrail.agscollab.com/index.php?/cases/view/6130896 -""" - -import os -import sys - -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as entity -import azlmbr.layers as layers -import azlmbr.slice as slice -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestRecoverLayerDeletedSlice(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="recover_layer_deleted_slice: ", args=["level"]) - - def run_test(self): - """ - Summary: - Recover a layer containing a deleted slice. - - Expected Behavior: - The layer is not recovered and a error is given: - This layer contains a reference to a slice that can't be loaded. This layer can't be recovered. - - Test Steps: - 1) Open level - 2) Create a layer on the level as Layer1 - 3) Create an entity as Entity1 - 4) Make Entity1 a slice named Slice1 - 5) Make Slice1 a child of Layer1 - 6) Save the level - 7) Delete Layer1 from the level - 8) On disk find Slice1 and delete it - 9) Find Layer1 and select the "Recover layer" option for Layer1 in the Asset Browser - - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - SLICE_NAME = "Slice1.slice" - - def get_entity_count_name(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Create a layer on the level as Layer1 - layer_id = layers.EditorLayerComponent_CreateLayerEntityFromName("Layer1") - if get_entity_count_name("Layer1*"): - print("Layer1 is created") - - # 3) Create an entity as Entity1 - entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", entity.EntityId()) - editor.EditorEntityAPIBus(bus.Event, "SetName", entity_id, "Entity1") - if get_entity_count_name("Entity1*"): - print("Entity1 is created") - - # 4) Make Entity1 a slice named Slice1 - success = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", entity_id, SLICE_NAME) - print(f"Slice Created: {success}") - - # 5) Make Slice1 a child of Layer1 - editor.EditorEntityAPIBus(bus.Event, "SetParent", entity_id, layer_id) - actual_parent_id = editor.EditorEntityInfoRequestBus(bus.Event, "GetParent", entity_id) - if actual_parent_id.ToString() == layer_id.ToString(): - print("Parent of Entity1 is : Layer1") - - # 6) Save the level - general.save_level() - - # 7) Delete Layer1 from the level - general.idle_wait(1.0) - editor.ToolsApplicationRequestBus(bus.Broadcast, 'DeleteEntities ', [layer_id]) - - # 8) On disk find Slice1 and delete it - os.remove(os.path.join("SamplesProject", "Slice1.slice")) - - # 9) Find Layer1 and select the "Recover layer" option for Layer1 in the Asset Browser - editor_window = pyside_utils.get_editor_main_window() - general.open_pane("Asset Browser") - asset_browser = editor_window.findChildren(QtWidgets.QDockWidget, "Asset Browser")[0] - search_bar = asset_browser.findChildren(QtWidgets.QLineEdit, "textSearch")[0] - search_bar.setText("Layer1.layer") - asset_browser_tree = asset_browser.findChildren(QtWidgets.QTreeView, "m_assetBrowserTreeViewWidget")[0] - asset_browser_tree.expandAll() - model_index = pyside_utils.find_child_by_pattern(asset_browser_tree, "Layer1.layer") - asset_browser_tree.setCurrentIndex(model_index) - pyside_utils.trigger_context_menu_entry(asset_browser_tree, "Recover layer", index=model_index) - -test = TestRecoverLayerDeletedSlice() -test.run() diff --git a/Tests/editor/EditorScripts/required_components.py b/Tests/editor/EditorScripts/required_components.py deleted file mode 100755 index 62c58d9ce1..0000000000 --- a/Tests/editor/EditorScripts/required_components.py +++ /dev/null @@ -1,211 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16929882: Required Components -https://testrail.agscollab.com/index.php?/cases/view/16929882 -""" - -import os -import sys - -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -from azlmbr.entity import EntityId -import azlmbr.entity as entity - -import Tests.ly_shared.hydra_editor_utils as hydra -from PySide2 import QtWidgets, QtTest, QtCore -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - -class RequiredComponentsTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="required_components: ", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Add required components to an entity. - - Expected Behavior: - 1) An entity inspector will show a warning if a required component is missing. - 2) It will allow that component to be added. - 3) The warning will disappear once the component is present.. - - Test Steps: - 1) Open level. - 2) Create entity. - 3) Add a tube shape. - 4) Check there is a required component warning and drop down in the inspector. - 5) Click "Add Required Component". - 6) Check that a list of valid components has appeared. - 7) Click "Spline in the list. - 8) Check that a spline component is added to the entity. - 9) Check that the warning drop down is gone. - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - def fail_test(msg): - print(msg) - print("Test failed.") - sys.exit() - - def get_component_type_id(component_type_name): - # Get Component Types for required component. - type_ids_list = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', - [component_type_name], entity.EntityType().Game) - - if len(type_ids_list) == 0: - print("Type Ids List returned incorrectly.") - return False, 0 - - return True, type_ids_list[0] - - def find_component_inspector(inspector_list, component_name): - for item in inspector_list: - title = item.findChild(QtWidgets.QLabel, "Title") - if title is None: - continue - print("Checking " + title.text()) - if title.text() == component_name: - return item - return None - - async def add_spine_to_tube_shape(button): - pyside_utils.click_button_async(button) - list_widget = await pyside_utils.wait_for_popup_widget() - - tree = pyside_utils.find_child_by_pattern(list_widget, "Tree") - QtTest.QTest.keyClick(tree, Qt.Key_Down, Qt.NoModifier) - - while tree.indexBelow(tree.currentIndex()) != QtCore.QModelIndex(): - if tree.currentIndex().data(Qt.DisplayRole) == "Shape": - # Expand the Shape category - QtTest.QTest.keyClick(tree, Qt.Key_Right, Qt.NoModifier) - QtTest.QTest.keyClick(tree, Qt.Key_Right, Qt.NoModifier) - if tree.currentIndex().data(Qt.DisplayRole) == "Spline": - # Add this component type - QtTest.QTest.keyClick(tree, Qt.Key_Enter, Qt.NoModifier) - general.idle_wait(0.0) - return - - QtTest.QTest.keyClick(tree, Qt.Key_Down, Qt.NoModifier) - - - # Create level - create_level_result = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - if not create_level_result: - fail_test("New level failed.") - - EditorTestHelper.after_level_load(self) - - # Ensure the inspector window is open. - general.open_pane('Entity Inspector') - - # Create an entity - new_entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId()) - - # Select the entity. - editor.ToolsApplicationRequestBus(bus.Broadcast, 'SetSelectedEntities', [new_entity_id]) - - # Add a Tube Shape Component - editor_window = pyside_utils.get_editor_main_window() - entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector") - - tube_component = hydra.add_component("Tube Shape", new_entity_id) - general.idle_wait(0.0) - result, tube_component_id = get_component_type_id("Tube Shape") - if not result: - fail_test("Failed to find Tube Shape id.") - - result, spline_component_id = get_component_type_id("Spline") - if not result: - fail_test("Failed to find Spline id.") - - if not editor.EditorComponentAPIBus(bus.Broadcast, "HasComponentOfType", new_entity_id, tube_component_id): - fail_test("Failed to add Tube Shape to entity.") - - is_enabled = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', tube_component) - if is_enabled: - fail_test("Tube is enabled when first created.") - - component_list = pyside_utils.find_child_by_hierarchy(entity_inspector, ..., {"objectName": "m_componentListContents"}) - if component_list is None: - fail_test("Failed to find component list.") - - # Find the add required component button. It's inside a lot of anonymous frames, - # so find the header_frame and work down from its parent. - tube_frame = find_component_inspector(component_list.children(), "Tube Shape") - if tube_frame is None: - fail_test("Failed to find tube shape inspector.") - - header_frame = pyside_utils.find_child_by_hierarchy(tube_frame, ..., {"objectName": "HeaderFrame"}) - if header_frame is None: - fail_test("Unable to find tube header frame") - - container_frame = header_frame.parent() - if container_frame is None: - fail_test("Unable to find tube container frame") - - add_button = container_frame.findChild(QtWidgets.QPushButton) - if add_button is None: - fail_test("Unable to find add required component button") - - # Check there is no spline component yet - if editor.EditorComponentAPIBus(bus.Broadcast, "HasComponentOfType", new_entity_id, spline_component_id): - fail_test("Spline component already exists.") - - await add_spine_to_tube_shape(add_button) - - if not editor.EditorComponentAPIBus(bus.Broadcast, "HasComponentOfType", new_entity_id, spline_component_id): - fail_test("Failed to add Spline component to entity.") - - is_enabled = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', tube_component) - if not is_enabled: - fail_test("Tube is not enabled.") - - # Check that the missing component warning is gone. - editor.ToolsApplicationRequestBus(bus.Broadcast, 'SetSelectedEntities', [new_entity_id]) - - component_list = pyside_utils.find_child_by_hierarchy(entity_inspector, ..., - {"objectName": "m_componentListContents"}) - if component_list is None: - fail_test("Failed to find component list.") - - tube_frame = find_component_inspector(component_list.children(), "Tube Shape") - if tube_frame is None: - fail_test("Failed to find tube shape inspector.") - - header_frame = pyside_utils.find_child_by_hierarchy(tube_frame, ..., {"objectName": "HeaderFrame"}) - if header_frame is not None: - fail_test("Missing component warning still exists") - - print("Required Component test successful.") - - -test = RequiredComponentsTest() -test.run() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/save_layer_50000_entities.py b/Tests/editor/EditorScripts/save_layer_50000_entities.py deleted file mode 100755 index 4deccab65e..0000000000 --- a/Tests/editor/EditorScripts/save_layer_50000_entities.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C3712672: Save a Layer with 50,000 entities. -https://testrail.agscollab.com/index.php?/cases/view/3712672 -""" - -import os - -import azlmbr.legacy.general as general -import azlmbr.entity as entity -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.layers as layers -import azlmbr.paths -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtTest, QtWidgets -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class SaveLayer50000EntitiesTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="save_layer_50000_entities", args=["level"]) - - def run_test(self): - """ - Summary: - Save a Layer with 50,000 entities and verify if the editor is stable. - - Expected Behavior: - The level and layer are saved. - The Editor remains stable. - - Test Steps: - 1) Open a new level - 2) Delete the DefaultLevelSetup initially to make the selection of entities easier - 3) Create a new layer - 4) Initially create 2000 entities using 'Duplicate' action - 5) Duplicate the already created entities - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def search_entity(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - def layer_saved(): - return os.path.exists(os.path.join(azlmbr.paths.devroot, "SamplesProject", "Levels", self.args["level"], "Layers", "Layer.layer")) - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - editor_window = pyside_utils.get_editor_main_window() - outliner_widget = editor_window.findChildren(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)")[0].widget() - - # 2) Delete the DefaultLevelSetup initially to make the selection of entities easier - default_entity_id = general.find_editor_entity("DefaultLevelSetup") - editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", [default_entity_id]) - - # 3) Create a new layer - layer_id = layers.EditorLayerComponent_CreateLayerEntityFromName("Layer") - print(f"New layer created: {layer_id.isValid()}") - editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", layer_id) - general.select_object("Entity2") - action = pyside_utils.get_action_for_menu_path(editor_window, "Edit", "Select All") - - # 4) Initially create 2000 entities using 'Duplicate' action - for _ in range(2000): - QtTest.QTest.keyPress(outliner_widget, Qt.Key_D, Qt.ControlModifier) - - # 5) Duplicate the already created entities - action.trigger() - for _ in range(25): - QtTest.QTest.keyPress(outliner_widget, Qt.Key_D, Qt.ControlModifier) - print(f"50000 entities created: {search_entity('Entity2')>=50000}") - - # 6) Save/Verify if layer is saved - general.clear_selection() - general.select_object("Layer") - action = pyside_utils.get_action_for_menu_path(editor_window, "File", "Save") - action.trigger() - self.wait_for_condition(layer_saved, 250.0) - print(f"Layer saved: {layer_saved()}") - - -test = SaveLayer50000EntitiesTest() -test.run() diff --git a/Tests/editor/EditorScripts/save_level.py b/Tests/editor/EditorScripts/save_level.py deleted file mode 100755 index 732b4b3dd3..0000000000 --- a/Tests/editor/EditorScripts/save_level.py +++ /dev/null @@ -1,118 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C15167490: Save a level -https://testrail.agscollab.com/index.php?/cases/view/15167490 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import azlmbr.bus as bus -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestSaveALevel(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="save_level: ", args=["level"]) - - def run_test(self): - """ - Summary: - Create or open a level in editor. Create an entity and - Save level with new name using File > Save As.. - - Expected Behavior: - The "Save Level As" dialog appears. - A new level file is created and saved with the name provided. - The level is saved. - - Test Steps: - 1) Create or open a level in the editor. - 2) Create an entity and Save Level with new name - 3) Make any changes to the level and click on save - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def on_focus_changed(old, new): - active_widget = QtWidgets.QApplication.activeModalWidget() - save_level_as_dialogue = active_widget.findChild(QtWidgets.QWidget, "LevelFileDialog") - if save_level_as_dialogue.windowTitle() == "Save Level As ": - print("The 'Save Level As' dialog appeared") - level_name = save_level_as_dialogue.findChild(QtWidgets.QLineEdit, "nameLineEdit") - level_name.setText("tmp_new_level") - button_box = save_level_as_dialogue.findChild(QtWidgets.QDialogButtonBox, "buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - general.idle_wait(3.0) #wait for new level lo load - - def on_action_triggered(action): - print(f"{action} Action triggered") - - # 1) Create or open a level in the editor. - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(4.0) - - # 2) Create an entity and Save Level with new name - newEntityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId.EntityId()) - if newEntityId.IsValid(): - print("Entity created") - try: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - action = pyside_utils.get_action_for_menu_path(editor_window, "File", "Save As") - action.triggered.connect(on_action_triggered("Save As")) - action.trigger() - action.triggered.disconnect(on_action_triggered("Save As")) - - finally: - app.focusChanged.disconnect(on_focus_changed) - - # Verify if the new level is loaded - general.idle_wait(2.0) - if editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") == "tmp_new_level": - print("A new level file is created and saved with the name provided.: SUCCESS") - else: - print("A new level file is created and saved with the name provided.: FAILED") - - # 3) Make any changes to the level and click on save - new_entity = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId.EntityId()) - if new_entity.IsValid(): - print("Made a change in level") - editor_window = pyside_utils.get_editor_main_window() - action = pyside_utils.get_action_for_menu_path(editor_window, "File", "Save") - action.triggered.connect(on_action_triggered("Save")) - action.trigger() - action.triggered.disconnect(on_action_triggered("Save")) - - -test = TestSaveALevel() -test.run() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/save_overrides_default.py b/Tests/editor/EditorScripts/save_overrides_default.py deleted file mode 100755 index 9134505e09..0000000000 --- a/Tests/editor/EditorScripts/save_overrides_default.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2654251: Adding and deleting entities to a slice should be included on save overrides by default -https://testrail.agscollab.com/index.php?/cases/view/2654251 -""" - -import os -import sys - -import azlmbr.legacy.general as general -import azlmbr.bus as bus -import azlmbr.math as math -import azlmbr.asset as asset -import azlmbr.editor as editor -import azlmbr.slice as slice -import azlmbr.entity as EntityId -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from PySide2.QtCore import Qt -from re import compile as regex -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class SaveOverridesDefaultTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="save_overrides_default", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Adding and deleting entities to a slice should be included on save overrides by default - - Expected Behavior: - Observe that the Adding of Child 2 and the Deletion of Child 1 are both checked by default - - Test Steps: - 1) Open a new level - 2) Create 2 entities as parent and child - 3) Create slice from the parent entity - 4) Wait until slice is created - 5) Delete child on slice - 6) Add a new child to the slice - 7) Open Save Slice Overrides (Advanced) and verify if the changes are checked by default - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - SLICE_NAME = "temp_slice.slice" - self.focus_changed_flag = False - - def path_is_valid_asset(asset_path): - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False) - return asset_id.invoke("IsValid") - - def on_focus_changed(old, new): - active_modal_widget = QtWidgets.QApplication.activeModalWidget() - if active_modal_widget and not self.focus_changed_flag: - self.focus_changed_flag = True - # verify the changes child1 (deleted) and child2 (added) are checked by default - # if the Qt.CheckStateRole of the checkbox is 2, it means it is checked - child1_deleted = pyside_utils.find_child_by_pattern(active_modal_widget, "child1 (deleted)").data( - Qt.CheckStateRole - ) - print(f"Child 1 deleted change checked by default: {child1_deleted == 2}") - child2_added = pyside_utils.find_child_by_pattern(active_modal_widget, "child2 (added)").data( - Qt.CheckStateRole - ) - print(f"Child 2 added change checked by default: {child2_added == 2}") - active_modal_widget.close() - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Create 2 entities as parent and child - parent_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId.EntityId()) - child_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_id) - editor.EditorEntityAPIBus(bus.Event, "SetName", child_id, "child1") - - # 3) Create slice from the parent entity - success = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", parent_id, SLICE_NAME) - print(f"Slice Created: {success}") - - # 4) Wait until slice is created - self.wait_for_condition(lambda: path_is_valid_asset(SLICE_NAME), 3.0) - - # 5) Delete child on slice - editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", [child_id]) - - # 6) Add a new child to the slice - child_2_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_id) - editor.EditorEntityAPIBus(bus.Event, "SetName", child_2_id, "child2") - - # 7) Open Save Slice Overrides (Advanced) and verify if the changes are checked by default - editor_window = pyside_utils.get_editor_main_window() - outliner_widget = pyside_utils.find_child_by_hierarchy( - editor_window, ..., dict(windowTitle=regex("Entity Outliner.*")), ..., "m_objectList" - ).parent() - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 1) is not None) - model_index = pyside_utils.get_item_view_index(tree, 0) - app = QtWidgets.QApplication.instance() - try: - app.focusChanged.connect(on_focus_changed) - await pyside_utils.trigger_context_menu_entry(tree, "Save Slice Overrides (Advanced)...", index=model_index) - finally: - app.focusChanged.disconnect(on_focus_changed) - -test = SaveOverridesDefaultTest() -test.run() diff --git a/Tests/editor/EditorScripts/select_multiple_entities_entityoutliner.py b/Tests/editor/EditorScripts/select_multiple_entities_entityoutliner.py deleted file mode 100755 index 3fc5cd8e57..0000000000 --- a/Tests/editor/EditorScripts/select_multiple_entities_entityoutliner.py +++ /dev/null @@ -1,161 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1508364 : Select over 1,000+ entities that are open in the Entity Outliner at one time -https://testrail.agscollab.com/index.php?/cases/view/1508364 -""" - -import azlmbr.legacy.general as general -import azlmbr.entity as entity -import azlmbr.bus as bus -import azlmbr.editor as editor -from azlmbr.entity import EntityId -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtCore, QtTest, QtWidgets -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper -from re import compile as regex - - -class TestSelectMultipleEntitiesEntityOutliner(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="select_multiple_entities_entityoutliner", args=["level"]) - - def run_test(self): - """ - Summary: - Select over 1,000+ entities that are open in the Entity Outliner at one time - - Expected Behavior: - The engine remains stable while selecting a large number of entities. - Selected entities are highlighted in the Entity Outliner. - The Entity Inspector shows an accurate count of selected entities. - The engine remains stable while selecting entities in the Outliner. - Selected entities are highlighted in the outliner. - The Entity Inspector shows an accurate count of selected entities. - - Test Steps: - 1) Open a new level - 2) Delete the DefaultLevelSetup initially to make the selection of entities easier - 3) Create 1000 entities using 'Duplicate' action - 4) Verify CTRL+click to select individual entities - 5) Select all entities and make sure selected entities are highlighted in the Entity Outliner - 6) Verify the count of selected entities in Entity Inspector - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_entity_count_name(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return len(entities) - - def verify_selected_index(expected_entity_list): - # NOTE: selectedIndexes() seems to return 2 extra elements for each item seleted whose data() is None - # So removing the items whose data is None and considering only the selected items having data. - selected_indexes = [i for i in tree.selectedIndexes() if i.data()] - return sorted(selected_indexes) == sorted(expected_entity_list) - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # Get the editor window object - editor_window = pyside_utils.get_editor_main_window() - - # Get the outliner widget object based on the window title - outliner_widget = editor_window.findChildren(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)")[0].widget() - - # Get the entity inspector object based on the window title - entity_inspector_name_editor = pyside_utils.find_child_by_hierarchy( - editor_window, ..., dict(windowTitle=regex("Entity Inspector.*")), ..., "m_entityNameEditor" - ) - - # Get the object tree in the entity outliner - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - - # 2) Delete the DefaultLevelSetup initially to make the selection of entities easier - default_entity_id = general.find_editor_entity("DefaultLevelSetup") - editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", [default_entity_id]) - - # 3) Create 1000 entities using 'Duplicate' action - entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId()) - entity_name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id) - editor.ToolsApplicationRequestBus(bus.Broadcast, "SetSelectedEntities", [entity_id]) - for _ in range(999): - QtTest.QTest.keyPress(outliner_widget, Qt.Key_D, Qt.ControlModifier) - - if get_entity_count_name(entity_name) == 1000: - print("1000 entities created") - editor.ToolsApplicationRequestBus(bus.Broadcast, "SetSelectedEntities", []) - - # 4) Verify CTRL+click to select individual entities - # CTRL+click on First Entity and verify if First Entity is selected - self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 1) is not None, 2.0) - model_index_1 = pyside_utils.get_item_view_index(tree, 0) - pyside_utils.item_view_index_mouse_click(tree, model_index_1, modifier=QtCore.Qt.ControlModifier) - self.wait_for_condition(lambda: entity_inspector_name_editor.text() == "Entity1", 1.0) - print( - f"The Entity Inspector shows an accurate count of selected entities (1 element): {entity_inspector_name_editor.text() == 'Entity1'}" - ) - print(f"CTRL+click worked for adding selected elements (1 element): {verify_selected_index([model_index_1])}") - - # CTRL+click on Second Entity and verify if First Entity and Second Entity are selected - self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 2) is not None, 2.0) - model_index_2 = pyside_utils.get_item_view_index(tree, 1) - pyside_utils.item_view_index_mouse_click(tree, model_index_2, modifier=QtCore.Qt.ControlModifier) - self.wait_for_condition(lambda: entity_inspector_name_editor.text() == "2 entities selected", 1.0) - print( - f"The Entity Inspector shows an accurate count of selected entities (2 elements): {entity_inspector_name_editor.text() == '2 entities selected'}" - ) - print( - f"CTRL+click worked for adding selected elements (2 elements): {verify_selected_index([model_index_1, model_index_2])}" - ) - - # CTRL+click on Third Entity and verify if First Entity, Second Entity and Third Entity are selected - self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 3) is not None, 2.0) - model_index_3 = pyside_utils.get_item_view_index(tree, 2) - pyside_utils.item_view_index_mouse_click(tree, model_index_3, modifier=QtCore.Qt.ControlModifier) - self.wait_for_condition(lambda: entity_inspector_name_editor.text() == "3 entities selected", 1.0) - print( - f"The Entity Inspector shows an accurate count of selected entities (3 elements): {entity_inspector_name_editor.text() == '3 entities selected'}" - ) - print( - f"CTRL+click worked for adding selected elements (3 elements): {verify_selected_index([model_index_1, model_index_2, model_index_3])}" - ) - - # 5) Select all entities and make sure selected entities are highlighted in the Entity Outliner - action = pyside_utils.get_action_for_menu_path(editor_window, "Edit", "Select All") - action.trigger() - if len(editor.ToolsApplicationRequestBus(bus.Broadcast, "GetSelectedEntities")) == 1000: - print("Selected entities are highlighted in the Entity Outliner") - - # 6) Verify the count of selected entities in Entity Inspector - self.wait_for_condition(lambda: entity_inspector_name_editor.text() == "1000 entities selected", 1.0) - print( - f"The Entity Inspector shows an accurate count of selected entities (1000 elements): {entity_inspector_name_editor.text() == '1000 entities selected'}" - ) - - -test = TestSelectMultipleEntitiesEntityOutliner() -test.run() diff --git a/Tests/editor/EditorScripts/settings_get_set.py b/Tests/editor/EditorScripts/settings_get_set.py deleted file mode 100755 index ba355b3608..0000000000 --- a/Tests/editor/EditorScripts/settings_get_set.py +++ /dev/null @@ -1,147 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -Test the Hydra API to access Editor Settings -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.math as math -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - -class TestSettingsAPI(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="settings_get_set: ", args=["level"]) - - def run_test(self): - """ - Summary: - Tests the Hydra API for Settings. - - Expected Behavior: - Settings can be listed, accessed and set. - - Test Steps: - 1) Build the list of all settings - 2) For each supported type (bool, int, float, string): - 2a) Get the current values - 2b) Set an altered values - 2c) Get the value again - 2d) Verify the value has changed - 2e) Restore original value - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - # Get full list of Editor settings - paths = editor.EditorSettingsAPIBus(bus.Broadcast, 'BuildSettingsList') - - if(len(paths) > 0): - print("BuildSettingsList returned a non-empty list") - - - # Verify a boolean settings - def ParseBoolValue(value): - if(value == "0"): - return False - return True - - boolOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|LoadLastLevelAtStartup') - - if(boolOutcome.isSuccess()): - startupValue = boolOutcome.GetValue() - - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|LoadLastLevelAtStartup', not(ParseBoolValue(startupValue))) - - boolOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|LoadLastLevelAtStartup') - - if(boolOutcome.isSuccess()): - newStartupValue = boolOutcome.GetValue() - - if not(ParseBoolValue(startupValue) == ParseBoolValue(newStartupValue)): - print("Boolean Setting editing works") - - # Restore previous value - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|LoadLastLevelAtStartup', ParseBoolValue(startupValue)) - - - # Verify an int settings - intOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|UndoLevels') - - if(intOutcome.isSuccess()): - undoLevel = intOutcome.GetValue() - - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|UndoLevels', (int(undoLevel) + 10)) - - intOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|UndoLevels') - - if(intOutcome.isSuccess()): - newUndoLevel = intOutcome.GetValue() - - if not(int(undoLevel) == int(newUndoLevel)): - print("Int Setting editing works") - - # Restore previous value - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|UndoLevels', int(undoLevel)) - - - # Verify a float settings - floatOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|DeepSelectionNearness') - - if(floatOutcome.isSuccess()): - deepSelection = floatOutcome.GetValue() - - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|DeepSelectionNearness', (float(deepSelection) + 0.5)) - - floatOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|DeepSelectionNearness') - - if(floatOutcome.isSuccess()): - newDeepSelection = floatOutcome.GetValue() - - if not(float(deepSelection) == float(newDeepSelection)): - print("Float Setting editing works") - - # Restore previous value - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|DeepSelectionNearness', float(deepSelection)) - - - # Verify a string settings - stringOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|TemporaryDirectory') - - if(stringOutcome.isSuccess()): - tempDir = stringOutcome.GetValue() - - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|TemporaryDirectory', "SomeTempDirectory") - - stringOutcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', 'Settings|TemporaryDirectory') - - if(stringOutcome.isSuccess()): - newTempDir = stringOutcome.GetValue() - - if not(tempDir == newTempDir): - print("String Setting editing works") - - # Restore previous value - editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', 'Settings|TemporaryDirectory', tempDir) - - -test = TestSettingsAPI() -test.run() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/tool_stability_asset_editor.py b/Tests/editor/EditorScripts/tool_stability_asset_editor.py deleted file mode 100755 index 008d4e2035..0000000000 --- a/Tests/editor/EditorScripts/tool_stability_asset_editor.py +++ /dev/null @@ -1,188 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C6312589: Tool Stability & Workflow: Asset Editor -https://testrail.agscollab.com/index.php?/cases/view/6312589 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import azlmbr.math as math -import Tests.ly_shared.hydra_editor_utils as hydra -from PySide2 import QtWidgets -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class ToolStabilityAssetEditorTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="tool_stability_asset_editor", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Tool Stability & Workflow: Asset Editor - - Expected Behavior: - 1) The Asset Editor can be opened/closed. - 2) New Input Bindings can be created. - 3) Created input bindings populate the Pick Input Bindings list. - 4) Input Bindings can be opened. - - Test Steps: - 1) Open level - 2) Open Asset Editor - 3) Create new Input Bindings - 4) Open Save As dialog - 5) Close the Asset Editor - 6) Create new entity and add a Input component - 7) Assign a .inputbindings file to the input component - 8) Open Asset Editor through the newly assigned inputbinding file - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def open_asset_editor(): - if general.is_pane_visible("Asset Editor"): - return True - general.open_pane("Asset Editor") - return general.is_pane_visible("Asset Editor") - - def close_asset_editor(): - asset_editor.close() - return not general.is_pane_visible("Asset Editor") - - class InputBinding: - input_binding_name = None - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - editor_window = pyside_utils.get_editor_main_window() - - # 2) Open Asset Editor - print(f"Asset Editor opened: {open_asset_editor()}") - - # 3) Create new Input Bindings - # Access Asset editor - asset_editor = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor") - asset_editor_widget = asset_editor.findChild(QtWidgets.QWidget, "m_assetEditorWidget") - menu_bar = asset_editor_widget.findChild(QtWidgets.QMenuBar) - # Get the action File->New->Input Bindings - action = pyside_utils.find_child_by_pattern(menu_bar, "Input Bindings") - # Trigger the action - action.trigger() - # wait until the trigger loads the frame - await pyside_utils.wait_for_condition(lambda: len(asset_editor_widget.findChildren(QtWidgets.QFrame, "Input Event Groups")) == 1, 3.0) - input_event_groups = asset_editor_widget.findChild(QtWidgets.QFrame, "Input Event Groups") - # Click on + button to assign Input event groups - input_event_groups.findChildren(QtWidgets.QToolButton)[1].click() - # wait until the click action loads the frame - await pyside_utils.wait_for_condition(lambda: len(asset_editor_widget.findChildren(QtWidgets.QFrame, "Event Name")) == 1, 3.0) - new_event_frame = asset_editor_widget.findChild(QtWidgets.QFrame, "") - expander = new_event_frame.findChild(QtWidgets.QCheckBox, "") - expander.click() - event_name_frame = asset_editor_widget.findChild(QtWidgets.QFrame, "Event Name") - event_name = event_name_frame.findChildren(QtWidgets.QLineEdit)[0] - # Set some event name - event_name.setText("tmp_input_binding") - - # 4) Open Save As dialog - action = pyside_utils.find_child_by_pattern(menu_bar, {"iconText": "Save As"}) - # We use trigger_action_async here since it will open a modal dialog (save as) - pyside_utils.trigger_action_async(action) - # This checks if the Save As dialog is opened - # NOTE: At the moment since we are not able to give a name and save something using QFileDialog - # widget and for this particular case it is not so important to actually save the file, we are - # just checking if the Save As dialog is opened and then closing it immediately - active_modal_widget = await pyside_utils.wait_for_modal_widget() - if active_modal_widget and "Save As" in active_modal_widget.windowTitle(): - print("Save as dialog opened") - active_modal_widget.close() - - # 5) Close the Asset Editor - print(f"Asset Editor closed: {close_asset_editor()}") - - # 6) Create new entity and add a Input component - entity_position = math.Vector3(125.0, 136.0, 32.0) - entity_id = editor.ToolsApplicationRequestBus( - bus.Broadcast, "CreateNewEntityAtPosition", entity_position, EntityId.EntityId() - ) - hydra.add_component("Input", entity_id) - entity_name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id) - - # 7) Assign a .inputbindings file to the input component - general.clear_selection() - general.select_object(entity_name) - general.open_pane("Entity Inspector") - entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector") - await pyside_utils.wait_for_condition(lambda: len(entity_inspector.findChildren(QtWidgets.QPushButton, "attached-button")) == 1, 2.0) - # Assess the file picker button of the "Input" component - button = entity_inspector.findChild(QtWidgets.QPushButton, "attached-button") - # Click on the file picker button and select a .inputbinding file - # We use click_button_async here since it will open a modal dialog - pyside_utils.click_button_async(button) - active_modal_widget = await pyside_utils.wait_for_modal_widget() - # This is to deal with the file picker for .inputbinding - if active_modal_widget: - tree = active_modal_widget.findChild(QtWidgets.QTreeView, "m_assetBrowserTreeViewWidget") - # Make sure the folder structure tree is expanded so that after giving the searchtext the first - # .inputbinding file is selected - tree.expandAll() - search_text = active_modal_widget.findChild(QtWidgets.QLineEdit, "textSearch") - # Set the searchText so that the first .inputbinding file in the folder structure is selected - search_text.setText(".inputbindings") - # Save the file name for later to check when we open the Asset Editor - InputBinding.input_binding_name = tree.currentIndex().data(Qt.DisplayRole) - # Ensure the currently selected item actually is a .inputbinding file - await pyside_utils.wait_for_condition(lambda: ".inputbinding" in str(tree.currentIndex().data(Qt.DisplayRole))) - if ".inputbinding" in str(tree.currentIndex().data(Qt.DisplayRole)): - print(".inputbinding file is selected in the file picker") - # Click OK - button_box = active_modal_widget.findChild(QtWidgets.QDialogButtonBox, "m_buttonBox") - button_box.button(QtWidgets.QDialogButtonBox.Ok).click() - - # 8) Open Asset Editor through the newly assigned inputbinding file - # Access the popup button to open the Asset Editor - tool_button_parent = entity_inspector.findChild(QtWidgets.QFrame, "browse-edit").parent() - tool_button = tool_button_parent.findChild(QtWidgets.QToolButton) - initial_active_window = QtWidgets.QApplication.activeWindow() - # Click on the "Open in Input Bindings Editor" button to open the selected .inputbindings file in the - # Asset Editor - tool_button.click() - await pyside_utils.wait_for_condition(lambda: initial_active_window != QtWidgets.QApplication.activeWindow(), 3.0) - current_active_window = QtWidgets.QApplication.activeWindow() - # Verify if the newly opened window is actually the Asset Editor to edit the selected inputbinding - if current_active_window.findChildren(QtWidgets.QDockWidget, InputBinding.input_binding_name): - print("Asset Editor for the assigned inputbinding file is opened") - - -test = ToolStabilityAssetEditorTest() -test.run() diff --git a/Tests/editor/EditorScripts/tool_stability_console.py b/Tests/editor/EditorScripts/tool_stability_console.py deleted file mode 100755 index 00a31903b7..0000000000 --- a/Tests/editor/EditorScripts/tool_stability_console.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6308169: Tool Stability & Workflow: Console -https://testrail.agscollab.com/index.php?/cases/view/6308169 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from PySide2.QtTest import QTest -from PySide2.QtCore import Qt -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class ToolStabilityConsoleTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="tool_stability_console: ", args=["level"]) - - def run_test(self): - """ - Summary: - Tool Stability & Workflow: Console - - Expected Behavior: - 1) Console can be opened - 2) Commands can be entered in the console - 3) Console can be closed - - Test Steps: - 1) Open level - 2) Open console - 3) Close the console - 4) Reopen console - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def open_console(): - general.open_pane("Console") - return general.is_pane_visible("Console") - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Open console - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - if main_window.findChild(QtWidgets.QDockWidget, "Console") is None: - print(f"Console opened successfully: {open_console()}") - console = main_window.findChild(QtWidgets.QDockWidget, "Console") - console_widget = console.findChild(QtWidgets.QWidget, "Console") - container = console_widget.findChild(QtWidgets.QWidget, "container2") - line_edit = container.findChild(QtWidgets.QLineEdit, "lineEdit") - line_edit.setText("r_GetScreenShot=2") - QTest.keyClick(line_edit, Qt.Key_Enter, Qt.ControlModifier) - general.idle_wait(1.0) - print("Ran the command in console") - - # 3) Close the console - general.close_pane("Console") - print(f"Console window closed: {not general.is_pane_visible('Console')}") - - # 4) Reopen console - print(f"Console reopened successfully: {open_console()}") - - -test = ToolStabilityConsoleTest() -test.run() diff --git a/Tests/editor/EditorScripts/tool_stability_entity_inspector.py b/Tests/editor/EditorScripts/tool_stability_entity_inspector.py deleted file mode 100755 index f076b05d38..0000000000 --- a/Tests/editor/EditorScripts/tool_stability_entity_inspector.py +++ /dev/null @@ -1,143 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6308162: Tool Stability: Entity Inspector -https://testrail.agscollab.com/index.php?/cases/view/6308162 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as EntityId -import azlmbr.math as math -import azlmbr.asset as asset -from PySide2 import QtWidgets, QtTest, QtCore -from PySide2.QtCore import Qt -import Tests.ly_shared.hydra_editor_utils as hydra -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestToolStabilityEntityInspector(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="tool_stability_entity_inspector: ", args=["level"]) - - def run_test(self): - """ - Summary: - Tool Stability: Entity Inspector - - Test Steps: - 1) Open level - 2) Create an Entity with Mesh component - 3) View the entity in the Viewport and Take screenshot - 4) Click on the filter icon in Entity Outliner and check the entities filtered by "Mesh" in Entity Outliner - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def on_focus_changed(old, new): - print("focus changed") - popup = QtWidgets.QApplication.activePopupWidget() - if popup: - while tree.indexBelow(tree.currentIndex()) != QtCore.QModelIndex(): - QtTest.QTest.keyClick(tree, Qt.Key_Down, Qt.NoModifier) - if tree.currentIndex().data(Qt.DisplayRole) == "Mesh": - break - tree.model().setData(tree.currentIndex(), 2, Qt.CheckStateRole) - outliner_tree = outliner_main_window.findChildren(QtWidgets.QTreeView, "m_objectTree")[0] - # make sure only one entity with mesh component is filtered - QtTest.QTest.keyClick(outliner_tree, Qt.Key_Down, Qt.NoModifier) - if tree.currentIndex().data(Qt.DisplayRole) == "Mesh" and outliner_tree.indexBelow(outliner_tree.currentIndex()) == QtCore.QModelIndex(): - print("Entity with Mesh component is filtered by Entity outliner") - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # 2) Create an Entity with Mesh component - entity_position = math.Vector3(125.0, 136.0, 32.0) - entity_id = editor.ToolsApplicationRequestBus( - bus.Broadcast, "CreateNewEntityAtPosition", entity_position, EntityId.EntityId() - ) - general.clear_selection() - entity_name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", entity_id) - general.select_object(entity_name) - Entity = hydra.Entity("Entity", entity_id) - Entity.components = [] - Entity.components.append(hydra.add_component("Mesh", entity_id)) - - def get_asset_by_path(path): - return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", path, math.Uuid(), False) - - # Add any valid mesh asset - hydra.get_set_test( - Entity, - 0, - "MeshComponentRenderNode|Mesh asset", - get_asset_by_path(os.path.join("Objects", "SamplesAssets", "mover_display_smooth.cgf")), - ) - - # 3) View the entity in the Viewport and Take screenshot - self.take_viewport_screenshot(125.00, 129.01, 34.90, 0.00, 0.00, 0.00) - screenshot_path = os.path.join("Cache", "SamplesProject", "pc", "user", "screenshots", "screenshot0000.jpg") - if os.path.isfile(screenshot_path): - print("Screenshot Taken") - - # 4) Click on the filter icon in Entity Outliner and check the entities filtered by "Mesh" in Entity Outliner - general.idle_wait(2.0) - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - entity_outliner = pyside_utils.find_child_by_property( - main_window, QtWidgets.QDockWidget, "objectName", "Entity Outliner (PREVIEW)" - ) - outliner_main_window = entity_outliner.findChild(QtWidgets.QMainWindow) - tool_button = ( - outliner_main_window.findChild(QtWidgets.QWidget) - .findChild(QtWidgets.QWidget, "OutlinerWidgetUI") - .findChild(QtWidgets.QFrame, "m_searchWidget") - .findChild(QtWidgets.QFrame, "textSearchContainer") - .findChild(QtWidgets.QToolButton, "assetTypeSelector") - ) - try: - menu = tool_button.findChild(QtWidgets.QMenu) - tree = menu.findChild(QtWidgets.QTreeView) - app = QtWidgets.QApplication.instance() - line_edit = menu.findChild(QtWidgets.QLineEdit, "filteredSearchWidget") - line_edit.setFocus() - line_edit.setText("Mesh") - app.focusChanged.connect(on_focus_changed) - tree.setFocus() - tool_button.click() - general.idle_wait(1.0) - - finally: - app.focusChanged.disconnect(on_focus_changed) - - -test = TestToolStabilityEntityInspector() -test.run_test() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/tool_stability_entity_outliner.py b/Tests/editor/EditorScripts/tool_stability_entity_outliner.py deleted file mode 100755 index a8b38ca8a3..0000000000 --- a/Tests/editor/EditorScripts/tool_stability_entity_outliner.py +++ /dev/null @@ -1,172 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C6308161: Tool Stability: Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/6308161 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.entity as entity -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.slice as slice -import azlmbr.asset as asset -import azlmbr.math as math -import Tests.ly_shared.pyside_utils as pyside_utils -from re import compile as regex -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class ToolStabilityEntityOutlinerTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="tool_stability_entity_outliner", args=["level"]) - - def run_test(self): - """ - Summary: - Tool Stability: Entity Outliner - This can be verified by creating entity, layer, slice and - instantiating a slice. - - Expected Behavior: - 1) Entities can be created in the Entity Outliner. - 2) Created entities populate in other tools properly. - 3) Entity creation can be undone and related tools are updated. - 4) Entity creation can be redone and related tools are updated. - 5) Layers can be created in the Entity Outliner. - 5) Created layers populate in the Entity Inspector properly. - 6) Slices can be created inside the Entity Outliner. - 7) Slices can be instantiated inside the Entity Outliner. - - Test Steps: - 1) Open level - 2) Create Entity and verify if it is created - 3) Undo entity creation and verify if entity is deleted - 4) Redo the last operation - 5) Create layer and verify if it is created - 6) Create slice using the first entity - 7) Instantiate an existing slice - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - def get_entities_by_name(entity_name="Entity2"): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entities = entity.SearchBus(bus.Broadcast, "SearchEntities", searchFilter) - return entities - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # Get the editor window object - editor_window = pyside_utils.get_editor_main_window() - - # Get the outliner widget object based on the window title - outliner_widget = pyside_utils.find_child_by_hierarchy( - editor_window, ..., dict(windowTitle=regex("Entity Outliner.*")), ..., "m_objectList" - ).parent() - - # Get the object tree in the entity outliner - tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree") - - # Get the entity inspector object based on the window title - entity_inspector_name_editor = pyside_utils.find_child_by_hierarchy( - editor_window, ..., dict(windowTitle=regex("Entity Inspector.*")), ..., "m_entityNameEditor" - ) - - # 2) Create Entity and verify if it is created - general.clear_selection() - - # find Create Entity action and trigger it - action = pyside_utils.find_child_by_pattern(outliner_widget, "Create Entity") - action.trigger() - - # ensure entity is created - entities = get_entities_by_name() - print(f"New entity created: {len(entities) == 1}") - - # get the newly create entity id and check if it is valid - entity_id = entities[0] - print(f"Entity Id is valid: {entity_id.isValid()}") - - # check in entity inspector that the newly created entity is present by verifying - # the name populated in the name editor in entity inspector - general.select_object("Entity2") - general.idle_wait(1.0) - self.wait_for_condition(lambda: entity_inspector_name_editor.text() == "Entity2", 1.0) - print(f"Entity name populated in Entity Inspector: {entity_inspector_name_editor.text() == 'Entity2'}") - - # 3) Undo entity creation and verify if entity is deleted - general.undo() - self.wait_for_condition(lambda: len(get_entities_by_name()) == 0, 3.0) - print(f"Entity creation undone: {len(get_entities_by_name())==0}") - - # 4) Redo the last operation - general.idle_wait(1.0) - general.redo() - self.wait_for_condition(lambda: len(get_entities_by_name()) == 1, 3.5) - print(f"Entity appeared after redo: {len(get_entities_by_name())==1}") - - # 5) Create layer and verify if it is created - general.idle_wait(2.0) - pyside_utils.trigger_context_menu_entry(tree, "Create layer") - - # ensure entity is created - self.wait_for_condition(lambda: len(get_entities_by_name("Layer3*")) == 1, 1.0) - print(f"New layer created: {len(get_entities_by_name('Layer3*'))==1}") - - # check in entity inspector that the newly created entity is present by verifying - # the name populated in the name editor in entity inspector - general.clear_selection() - general.select_object("Layer3*") - self.wait_for_condition(lambda: entity_inspector_name_editor.text() == "Layer3", 1.0) - print(f"Layer name populated in Entity Inspector: {entity_inspector_name_editor.text() == 'Layer3'}") - - # 6) Create slice using the first entity - current_level_name = editor.EditorToolsApplicationRequestBus(bus.Broadcast, "GetCurrentLevelName") - slice_path = os.path.join("Levels", current_level_name, "TestSlice.slice") - slice_created = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", entity_id, slice_path) - print(f"Slice created successfully: {slice_created}") - - # 7) Instantiate an existing slice - # ensure we clear the selection so that the newly instantiated slice is selected after instantiating - # so that we can verify the name of the object in the entity inspector - general.clear_selection() - slice_path = os.path.join("EngineAssets", "Slices", "DefaultLevelSetup.slice") - asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", slice_path, math.Uuid(), False) - transform = math.Transform_CreateIdentity() - position = math.Vector3(64.0, 64.0, 32.0) - transform.SetPosition(position) - slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform) - self.wait_for_condition(lambda: entity_inspector_name_editor.text() == "DefaultLevelSetup", 2.0) - print( - f"Instantiated slice populated in Entity Inspector: {entity_inspector_name_editor.text() == 'DefaultLevelSetup'}" - ) - - -test = ToolStabilityEntityOutlinerTest() -test.run() diff --git a/Tests/editor/EditorScripts/tool_stability_viewport_camera_selector.py b/Tests/editor/EditorScripts/tool_stability_viewport_camera_selector.py deleted file mode 100755 index b95bd3a31f..0000000000 --- a/Tests/editor/EditorScripts/tool_stability_viewport_camera_selector.py +++ /dev/null @@ -1,134 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C6308168: Tool Stability & Workflow: Viewport Camera Selector -https://testrail.agscollab.com/index.php?/cases/view/6308168 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -import Tests.ly_shared.hydra_editor_utils as hydra -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class ToolStabilityViewportCameraSelectorTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="tool_stability_viewport_camera_selector", args=["level"]) - - def run_test(self): - """ - Summary: - Tool Stability & Workflow: Viewport Camera Selector. This can be verified by creating mutiple entities - with Camera component and verifying their functionality by clicking each of them in the Viewport Camera - Selector tool - - Expected Behavior: - The Viewport Camera Selector can be opened. - Cameras added to a level will populate the Veiwport Camera Selector. - Selecting cameras in the Viewport Camera Selector will change the perspective camera in the Viewport. - The Viewport Camera Selector can be closed. - - - Test Steps: - 1) Open level - 2) Create first Camera component entity - 3) Create second Camera component entity at different position - 4) Open Viewport Camera Selector - 5) Click on both the Cameras in Viewport Camera Selector and verify view position - 6) Close Viewport Camera Selector - - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - CAM_POSITION_1 = (512.0, 512.0, 34.0) - CAM_POSITION_2 = (100.0, 100.0, 34.0) - - def create_camera_verify(entity_name, camera_position): - general.set_current_view_position(*camera_position) - # Trigger the action - pyside_utils.trigger_context_menu_entry(view_port, "Create camera entity from view") - # Verify if the entity is created with the name Camera# (Ex: Camera1) - camera_entity_id = general.find_editor_entity(entity_name) - assert camera_entity_id.isValid(), f"Entity {entity_name} with Camera component is not created" - # Verify if the entity has Camera component added - assert hydra.has_components(camera_entity_id, ["Camera"]), "Entity do not have a Camera component" - - def select_camera_verify_position(camera_index, expected_position): - # Get the model index of the camera in the list view of Viewport Camera Selector - model_index = pyside_utils.find_child_by_pattern(list_view, f"Camera{camera_index}") - assert model_index, f"Camera{camera_index} not found in Camera View Selctor" - # Click on the camera - pyside_utils.item_view_index_mouse_click(list_view, model_index) - self.wait_for_condition( - lambda: general.get_current_view_position().x == expected_position[0] - and general.get_current_view_position().y == expected_position[1] - and general.get_current_view_position().z == expected_position[2], - 1.0, - ) - current_position = general.get_current_view_position() - assert ( - current_position.x == expected_position[0] - and current_position.y == expected_position[1] - and current_position.z == expected_position[2] - ), f"View position incorrect for Camera {camera_index}" - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - # Get the editor window, main window, viewport objects - editor_window = pyside_utils.get_editor_main_window() - main_window = editor_window.findChild(QtWidgets.QMainWindow) - view_port = main_window.findChildren(QtWidgets.QWidget, "renderOverlay")[0] - - # 2) Create first Camera component entity - create_camera_verify("Camera1", CAM_POSITION_1) - print("done") - # 3) Create second Camera component entity at different position - create_camera_verify("Camera2", CAM_POSITION_2) - - # 4) Open Viewport Camera Selector - if not general.is_pane_visible("Viewport Camera Selector"): - general.open_pane("Viewport Camera Selector") - # Get the Camera Selector object and the list of cameras - camera_selector = editor_window.findChildren(QtWidgets.QDockWidget, "Viewport Camera Selector")[0] - list_view = camera_selector.findChildren(QtWidgets.QListView)[0] - - # 5) Click on both the Cameras in Viewport Camera Selector and verify view position - select_camera_verify_position(1, CAM_POSITION_1) - select_camera_verify_position(2, CAM_POSITION_2) - - # 6) Close Viewport Camera Selector - camera_selector.close() - self.wait_for_condition(lambda: not general.is_pane_visible("Viewport Camera Selector"), 1.0) - if not general.is_pane_visible("Viewport Camera Selector"): - print("Viewport Camera Selector is closed") - - -test = ToolStabilityViewportCameraSelectorTest() -test.run() diff --git a/Tests/editor/EditorScripts/tools_menu_after_interaction_model_toggle.py b/Tests/editor/EditorScripts/tools_menu_after_interaction_model_toggle.py deleted file mode 100755 index f97be0d3b7..0000000000 --- a/Tests/editor/EditorScripts/tools_menu_after_interaction_model_toggle.py +++ /dev/null @@ -1,117 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1564077: The Tools menu options function normally - New view interaction Model enabled -https://testrail.agscollab.com/index.php?/cases/view/1564077 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestToolsMenuOptionsAfterInteractionModelToggle(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="tools_menu_after_interaction_model_toggle: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with Tools Menu options and verify if all the options are working. - - Expected Behavior: - The Tools menu functions normally. - - Test Steps: - 1) Open level - 2) Interact with Tools Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - tools_menu_options = [ - ("Animation Editor (PREVIEW)",), - ("Asset Browser",), - ("Asset Editor",), - ("Console",), - ("Entity Inspector",), - ("ImGui Editor",), - ("Landscape Canvas",), - ("Level Inspector",), - ("Lua Editor",), - ("Material Editor",), - ("Particle Editor",), - ("PhysX Configuration (PREVIEW)",), - ("Script Canvas",), - ("Slice Relationship View (PREVIEW)",), - ("UI Editor",), - ("Vegetation Editor",), - ("Other", "Audio Controls Editor"), - ("Other", "Console Variables"), - ("Other", "Lens Flare Editor"), - ("Other", "Measurement System Tool"), - ("Other", "Python Console"), - ("Other", "Python Scripts"), - ("Other", "Slice Favorites"), - ("Other", "Sun Trajectory Tool"), - ("Other", "Terrain Texture Layers"), - ("Other", "Time Of Day"), - ("Plug-Ins", "Substance Editor"), - ("Viewport", "Viewport Camera Selector"), - ] - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - def on_focus_changed(old, new): - print("Focus Changed") - QtWidgets.QApplication.activeModalWidget().close() - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - - # 2) Interact with File Menu options - try: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - for option in tools_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "Tools", *option) - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - except Exception as e: - print(e) - finally: - app.focusChanged.disconnect(on_focus_changed) - general.close_pane("Editor Settings Manager") - -test = TestToolsMenuOptionsAfterInteractionModelToggle() -test.run() diff --git a/Tests/editor/EditorScripts/unsaved_changes_popup.py b/Tests/editor/EditorScripts/unsaved_changes_popup.py deleted file mode 100755 index df2bd76cc6..0000000000 --- a/Tests/editor/EditorScripts/unsaved_changes_popup.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1506899: Unsaved Changes Pop-Up -https://testrail.agscollab.com/index.php?/cases/view/1506899 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import azlmbr.asset as asset -import azlmbr.editor as editor -import azlmbr.math as math -import azlmbr.bus as bus -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class UnsavedChangesPopupTest(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="unsaved_changes_popup", args=["level"]) - - @pyside_utils.wrap_async - async def run_test(self): - """ - Summary: - Verify if the unsaved change popup appears and each of the buttons function appropriately. - - Expected Behavior: - A prompt appears informing the user there are unsaved changes, with 3 options present: Yes, No, and Cancel. - All options function as expected. - - Test Steps: - 1) Open a new level - 2) Access Editor window - 3) Open .inputbindings file in Asset Editor - 4) Delete All events initially - 5) Add an input event to make a change - 6) Click on close - verify CANCEL function - 7) Click on close - verify YES function - 8) Make a new change for verifying NO button (Add another input event group) - 9) Click on close - verify NO function - 10) Close Asset Editor - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - INPUTBINDING_FILE_NAME = "test.inputbindings" - - def close_asset_editor(): - general.close_pane("Asset Editor") - general.close_pane(INPUTBINDING_FILE_NAME) - return not general.is_pane_visible("Asset Editor") - - async def close_asset_editor_unsaved(button_type): - asset_editor = editor_window.findChild(QtWidgets.QDockWidget, INPUTBINDING_FILE_NAME) - - # Trigger the closing of the Asset Editor as async so we can listen for the modal dialog - pyside_utils.run_soon(lambda: asset_editor.close()) - active_modal_widget = await pyside_utils.wait_for_modal_widget(timeout=2.0) - if active_modal_widget: - print("Message Box opened") - message_box = active_modal_widget.findChild(QtWidgets.QMessageBox, "") - button = message_box.button(button_type) - pyside_utils.click_button_async(button) - - return await pyside_utils.wait_for_destroyed(active_modal_widget) - - # 1) Open a new level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - - # 2) Access Editor window - editor_window = pyside_utils.get_editor_main_window() - - # 3) Open .inputbindings file in Asset Editor - # Close Asset Editor initially - close_asset_editor() - input_bindings_id = asset.AssetCatalogRequestBus( - bus.Broadcast, "GetAssetIdByPath", INPUTBINDING_FILE_NAME, math.Uuid(), False - ) - editor.AssetEditorRequestsBus(bus.Broadcast, "OpenAssetEditorById", input_bindings_id) - - asset_editor = editor_window.findChild(QtWidgets.QDockWidget, INPUTBINDING_FILE_NAME) - asset_editor_widget = asset_editor.findChild(QtWidgets.QWidget, "m_assetEditorWidget") - input_event_groups = await pyside_utils.wait_for(lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "Input Event Groups")) - - # 4) Delete All events initially - delete_all_button = input_event_groups.findChildren(QtWidgets.QToolButton, "")[1] - pyside_utils.click_button_async(delete_all_button) - active_modal_widget = await pyside_utils.wait_for_modal_widget() - if active_modal_widget: - message_box = active_modal_widget.findChild(QtWidgets.QMessageBox, "") - button = message_box.button(QtWidgets.QMessageBox.Yes) - button.click() - - # 5) Add an input event to make a change - await pyside_utils.wait_for_condition(lambda: len(asset_editor_widget.findChildren(QtWidgets.QFrame, "Input Event Groups")) > 1, 2.0) - input_event_groups = asset_editor_widget.findChildren(QtWidgets.QFrame, "Input Event Groups")[1] - add_button = input_event_groups.findChild(QtWidgets.QToolButton, "") - add_button.click() - - # 6) Click on close - verify CANCEL function - await close_asset_editor_unsaved(QtWidgets.QMessageBox.Cancel) - # Cancel should not change anything and the Asset Editor should remain open - print(f"'CANCEL' button working as expected: {general.is_pane_visible(INPUTBINDING_FILE_NAME)}") - - # 7) Click on close - verify YES function - await close_asset_editor_unsaved(QtWidgets.QMessageBox.Yes) - # Yes option should save the changes and not close the Asset Editor - print(f"Asset Editor is visible after clicking YES: {general.is_pane_visible(INPUTBINDING_FILE_NAME)}") - status_bar = await pyside_utils.wait_for(lambda: asset_editor_widget.findChild(QtWidgets.QWidget, "AssetEditorStatusBar")) - text_edit = status_bar.findChild(QtWidgets.QLabel, "textEdit") - success = await pyside_utils.wait_for_condition(lambda: f"{INPUTBINDING_FILE_NAME} - Asset saved!" in text_edit.text(), 3.0) - if success: - print("'YES' button working as expected") - - # 8) Make a new change for verifying NO button (Add another input event group) - input_event_groups = await pyside_utils.wait_for(lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "Input Event Groups"), 2.0) - add_button = await pyside_utils.wait_for(lambda: input_event_groups.findChild(QtWidgets.QToolButton, ""), 2.0) - add_button.click() - - # 9) Click on close - verify NO function - await close_asset_editor_unsaved(QtWidgets.QMessageBox.No) - # No button should close the Asset Editor and changes should not be saved - print(f"Asset Editor is not visible after clicking NO: {not general.is_pane_visible('Asset Editor')}") - - # Reopen inputbindings file - input_bindings_id = asset.AssetCatalogRequestBus( - bus.Broadcast, "GetAssetIdByPath", INPUTBINDING_FILE_NAME, math.Uuid(), False - ) - editor.AssetEditorRequestsBus(bus.Broadcast, "OpenAssetEditorById", input_bindings_id) - # Ensure there are no changes saved (only one event group should be there) - asset_editor = await pyside_utils.wait_for(lambda: editor_window.findChild(QtWidgets.QDockWidget, INPUTBINDING_FILE_NAME), 2.0) - asset_editor_widget = asset_editor.findChild(QtWidgets.QWidget, "m_assetEditorWidget") - input_event_groups = asset_editor_widget.findChild(QtWidgets.QFrame, "Input Event Groups") - no_of_elements_label = input_event_groups.findChild(QtWidgets.QLabel, "DefaultLabel") - success = await pyside_utils.wait_for_condition(lambda: "1 elements" in no_of_elements_label.text(), 2.0) - if success: - print("'NO' button working as expected") - - # 10) Close Asset Editor - print(f"Asset Editor closed: {close_asset_editor()}") - - -test = UnsavedChangesPopupTest() -test.run() diff --git a/Tests/editor/EditorScripts/view_menu_after_interaction_model_toggle.py b/Tests/editor/EditorScripts/view_menu_after_interaction_model_toggle.py deleted file mode 100755 index b7b7230016..0000000000 --- a/Tests/editor/EditorScripts/view_menu_after_interaction_model_toggle.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16780807: The View menu options function normally - New view interaction Model enabled -https://testrail.agscollab.com/index.php?/cases/view/16780807 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestViewMenuAfterInteractionModelToggle(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="view_menu_after_interaction_model_toggle: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with View Menu options and verify if all the options are working. - - Expected Behavior: - The View menu functions normally. - - Test Steps: - 1) Open level - 2) Interact with View Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - view_menu_options = [ - ("Center on Selection",), - ("Show Quick Access Bar",), - ("Layouts", "Default Layout"), - ("Layouts", "User Legacy Layout"), - ("Layouts", "Default Layout"), - ("Layouts", "Save Layout"), - ("Layouts", "Restore Default Layout"), - ("Viewport", "Wireframe"), - ("Viewport", "Grid Settings"), - ("Viewport", "Configure Layout"), - ("Viewport", "Goto Coordinates"), - ("Viewport", "Center on Selection"), - ("Viewport", "Goto Location"), - ("Viewport", "Remember Location"), - ("Viewport", "Change Move Speed"), - ("Viewport", "Switch Camera"), - ("Viewport", "Show/Hide Helpers"), - ("Refresh Style",), - ] - - # 1) Open level - self.test_success = self.create_level( - self.args["level"], - heightmap_resolution=1024, - heightmap_meters_per_pixel=1, - terrain_texture_resolution=4096, - use_terrain=True, - ) - general.idle_wait(3.0) - - def on_focus_changed(old, new): - print("Focus Changed") - QtWidgets.QApplication.activeModalWidget().close() - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - # 2) Interact with View Menu options - try: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - for option in view_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "View", *option) - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - except Exception as e: - print(e) - finally: - app.focusChanged.disconnect(on_focus_changed) - -test = TestViewMenuAfterInteractionModelToggle() -test.run() \ No newline at end of file diff --git a/Tests/editor/EditorScripts/view_menu_options.py b/Tests/editor/EditorScripts/view_menu_options.py deleted file mode 100755 index c7166708fb..0000000000 --- a/Tests/editor/EditorScripts/view_menu_options.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C24064534: The View menu options function normally -https://testrail.agscollab.com/index.php?/cases/view/24064534 -""" - -import os -import sys - -sys.path.append(os.path.dirname(os.path.abspath(__file__))) -import azlmbr.legacy.general as general -import Tests.ly_shared.pyside_utils as pyside_utils -from PySide2 import QtWidgets -from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper - - -class TestViewMenuOptions(EditorTestHelper): - def __init__(self): - EditorTestHelper.__init__(self, log_prefix="view_menu_options: ", args=["level"]) - - def run_test(self): - """ - Summary: - Interact with View Menu options and verify if all the options are working. - - Expected Behavior: - The View menu functions normally. - - Test Steps: - 1) Interact with View Menu options - - Note: - - This test file must be called from the Lumberyard Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - view_menu_options = [ - ("Center on Selection",), - ("Show Quick Access Bar",), - ("Layouts", "Default Layout"), - ("Layouts", "User Legacy Layout"), - ("Layouts", "Default Layout"), - ("Layouts", "Save Layout"), - ("Layouts", "Restore Default Layout"), - ("Viewport", "Wireframe"), - ("Viewport", "Ruler"), - ("Viewport", "Grid Settings"), - ("Viewport", "Configure Layout"), - ("Viewport", "Goto Coordinates"), - ("Viewport", "Center on Selection"), - ("Viewport", "Goto Location"), - ("Viewport", "Remember Location"), - ("Viewport", "Change Move Speed"), - ("Viewport", "Switch Camera"), - ("Viewport", "Show/Hide Helpers"), - ("Refresh Style",), - ] - - general.idle_wait(3.0) - - def on_focus_changed(old, new): - print("Focus Changed") - QtWidgets.QApplication.activeModalWidget().close() - - def on_action_triggered(action_name): - print(f"{action_name} Action triggered") - - # 1) Interact with View Menu options - try: - editor_window = pyside_utils.get_editor_main_window() - app = QtWidgets.QApplication.instance() - app.focusChanged.connect(on_focus_changed) - for option in view_menu_options: - action = pyside_utils.get_action_for_menu_path(editor_window, "View", *option) - trig_func = lambda: on_action_triggered(action.iconText()) - action.triggered.connect(trig_func) - action.trigger() - action.triggered.disconnect(trig_func) - except Exception as e: - print(e) - finally: - app.focusChanged.disconnect(on_focus_changed) - -test = TestViewMenuOptions() -test.run() diff --git a/Tests/editor/__init__.py b/Tests/editor/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/editor/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -""" - - All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - its licensors. - - For complete copyright and license terms please see the LICENSE at the root of this - distribution (the "License"). All use of this software is governed by the License, - or, if provided, by the license below or the license accompanying this file. Do not - remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - diff --git a/Tests/editor/conftest.py b/Tests/editor/conftest.py deleted file mode 100755 index 56e802ae52..0000000000 --- a/Tests/editor/conftest.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import logging -import pytest -import winreg -from ..ly_shared import registry_utils as reg - - -logger = logging.getLogger(__name__) - - -layout = { - 'path': r'Software\Amazon\Lumberyard\Editor\fancyWindowLayouts', - 'value': 'last' -} -restore_camera = { - 'new': 16384, - 'path': r'Software\Amazon\Lumberyard\Editor\AutoHide', - 'value': 'ViewportCameraRestoreOnExitGameMode' -} - - -@pytest.fixture(autouse=True) -def set_editor_registry_defaults(request): - # Records editor settings at start, sets to default, then returns to original at teardown. - logger.debug('Executing an Editor settings fixture. If not executing an Editor test, this may be in error.') - - layout['original'] = reg.get_ly_registry_value(layout['path'], layout['value']) - restore_camera['original'] = reg.get_ly_registry_value(restore_camera['path'], restore_camera['value']) - - # Deleting current layout value to restore defaults - reg.delete_ly_registry_value(layout['path'], layout['value']) - - # Setting restore camera dialog to not display - reg.set_ly_registry_value(restore_camera['path'], restore_camera['value'], restore_camera['new']) - - # Revert settings to original values - def teardown(): - reg.set_ly_registry_value(layout['path'], layout['value'], layout['original'], value_type=winreg.REG_BINARY) - reg.set_ly_registry_value(restore_camera['path'], restore_camera['value'], restore_camera['original']) - - request.addfinalizer(teardown) diff --git a/Tests/editor/editor_utils/editor_test_helper.py b/Tests/editor/editor_utils/editor_test_helper.py deleted file mode 100755 index 2c15a228aa..0000000000 --- a/Tests/editor/editor_utils/editor_test_helper.py +++ /dev/null @@ -1,240 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -import sys -import time -import azlmbr.legacy.general as general -import azlmbr.legacy.settings as settings - - -class EditorTestHelper: - def __init__(self, log_prefix, args=None): - self.log_prefix = log_prefix + ": " - self.test_success = True - self.args = {} - if args: - # Get the level name and heightmap name from command-line args - - if len(sys.argv) == (len(args) + 1): - for arg_index in range(len(args)): - self.args[args[arg_index]] = sys.argv[arg_index + 1] - else: - test_success = False - self.log("Expected command-line args: {}".format(args)) - - # Test Setup - # Set helpers - # Set viewport size - # Turn off display mode, antialiasing - # set log prefix, log test started - def setup(self): - self.log("test started") - - def after_level_load(self): - success = True - - # Enable the Editor to start running its idle loop. - # This is needed for Python scripts passed into the Editor startup. Since they're executed - # during the startup flow, they run before idle processing starts. Without this, the engine loop - # won't run during idle_wait, which will prevent our test level from working. - general.idle_enable(True) - - # Give everything a second to initialize - general.idle_wait(1.0) - general.update_viewport() - general.idle_wait(0.5) # half a second is more than enough for updating the viewport. - self.original_settings = settings.get_misc_editor_settings() - self.helpers_visible = general.is_helpers_shown() - self.viewport_size = general.get_viewport_size() - # Turn off the helper gizmos if visible - if self.helpers_visible: - general.toggle_helpers() - general.idle_wait(1.0) - # Close the Error Report window so it doesn't interfere with testing hierarchies and focus - general.close_pane("Error Report") - # Set Editor viewport to a well-defined size - screen_width = 1600 - screen_height = 900 - general.set_viewport_expansion_policy("FixedSize") - general.set_viewport_size(screen_width, screen_height) - general.update_viewport() - general.idle_wait(1.0) - new_viewport_size = general.get_viewport_size() - new_viewport_width = new_viewport_size.x - new_viewport_height = new_viewport_size.y - - if (new_viewport_width != screen_width) or (new_viewport_height != screen_height): - self.log( - "set_viewport_size failed - expected ({},{}), got ({},{})".format( - screen_width, screen_height, new_viewport_size[0], new_viewport_size[1] - ) - ) - self.test_success = False - success = False - # Turn off any display info like FPS, as that will mess up our image comparisons - # Turn off antialiasing as well - general.run_console("r_displayInfo=0") - general.run_console("r_antialiasingmode=0") - general.idle_wait(1.0) - return success - - # Test Teardown - # Restore everything from above - # log test results, exit editor - def teardown(self): - # Restore the original Editor settings - if hasattr(self, 'original_settings'): - settings.set_misc_editor_settings(self.original_settings) - # If the helper gizmos were on at the start, restore them - if hasattr(self, 'helpers_visible') and self.helpers_visible: - general.toggle_helpers() - - # Set the viewport back to whatever size it was at the start - # Hydra exposes members of a Vector2 via .x, .y. - if hasattr(self, 'viewport_size'): - general.set_viewport_size(self.viewport_size.x, self.viewport_size.y) - - general.update_viewport() - general.idle_wait(1.0) - - self.log("test finished") - - if self.test_success: - self.log("result=SUCCESS") - general.set_result_to_success() - else: - self.log("result=FAILURE") - general.set_result_to_failure() - - general.exit_no_prompt() - - def run_test(self): - self.log("run") - - def run(self): - self.setup() - - # Only run the actual test if we didn't have setup issues - if self.test_success: - self.run_test() - - self.teardown() - - def get_arg(self, arg_name): - if arg_name in self.args: - return self.args[arg_name] - return "" - - # general logger that adds prefix? - def log(self, log_line): - general.log(self.log_prefix + log_line) - - # isclose: Compares two floating-point values for "nearly-equal" - # From https://www.python.org/dev/peps/pep-0485/#proposed-implementation : - def isclose(self, a, b, rel_tol=1e-9, abs_tol=0.0): - return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) - - # Create a new empty level - def create_level( - self, level_name, heightmap_resolution, heightmap_meters_per_pixel, terrain_texture_resolution, use_terrain - ): - self.log("Creating level {}".format(level_name)) - result = general.create_level_no_prompt( - level_name, heightmap_resolution, heightmap_meters_per_pixel, terrain_texture_resolution, use_terrain - ) - - # Result codes are ECreateLevelResult defined in CryEdit.h - if result == 1: - self.log("Temp level already exists") - elif result == 2: - self.log("Failed to create directory") - elif result == 3: - self.log("Directory length is too long") - elif result != 0: - self.log("Unknown error, failed to create level") - else: - self.log("Level created successfully") - if not self.after_level_load(): - result = -1 - - return result == 0 - - def open_level(self, level_name): - # Open the level non-interactively - self.log("Opening level {}".format(level_name)) - result = general.open_level_no_prompt(level_name) - result = result and self.after_level_load() - if result: - self.log("Level opened successfully") - else: - self.log("Unknown error, level failed to open") - - return result - - # Take Screenshot - def take_viewport_screenshot(self, posX, posY, posZ, rotX, rotY, rotZ): - # Set our camera position / rotation and wait for the Editor to acknowledge it - general.set_current_view_position(posX, posY, posZ) - general.set_current_view_rotation(rotX, rotY, rotZ) - general.idle_wait(1.0) - # Request a screenshot and wait for the Editor to process it - general.run_console("r_GetScreenShot=2") - general.idle_wait(1.0) - - def wait_for_condition(self, function, timeout_in_seconds=1.0): - # type: (function, float) -> bool - """ - **** Will be replaced by a function of the same name exposed in the Engine***** - a function to run until it returns True or timeout is reached - the function can have no parameters and - waiting idle__wait_* is handled here not in the function - - :param function: a function that returns a boolean indicating a desired condition is achieved - :param timeout_in_seconds: when reached, function execution is abandoned and False is returned - """ - - with Timeout(timeout_in_seconds) as t: - while True: - try: - general.idle_wait_frames(1) - except Exception: - print("WARNING: Couldn't wait for frame") - - if t.timed_out: - return False - - ret = function() - if not isinstance(ret, bool): - raise TypeError("return value for wait_for_condition function must be a bool") - if ret: - return True - - -class Timeout: - # type: (float) -> None - """ - contextual timeout - :param seconds: float seconds to allow before timed_out is True - """ - - def __init__(self, seconds): - self.seconds = seconds - - def __enter__(self): - self.die_after = time.time() + self.seconds - return self - - def __exit__(self, type, value, traceback): - pass - - @property - def timed_out(self): - return time.time() > self.die_after diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_0.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_0.jpg deleted file mode 100644 index 9f4eb75f8c..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb2cb4f18dbcf10513b5ec374769433b11b45c5dab7bbea7480af5f6d55cfb46 -size 248499 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_1.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_1.jpg deleted file mode 100644 index 9f4eb75f8c..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb2cb4f18dbcf10513b5ec374769433b11b45c5dab7bbea7480af5f6d55cfb46 -size 248499 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_10.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_10.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_11.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_11.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_11.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_12.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_12.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_12.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_13.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_13.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_13.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_14.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_14.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_14.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_15.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_15.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_15.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_16.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_16.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_16.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_17.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_17.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_17.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_18.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_18.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_18.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_19.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_19.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_19.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_2.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_2.jpg deleted file mode 100644 index 48a31d0a36..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7a956a117d3cdb86d1b933fde7b40e950c119f297e2d24f4ba7a083ee9806ab -size 248569 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_20.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_20.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_20.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_21.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_21.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_21.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_22.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_22.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_22.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_23.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_23.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_23.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_24.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_24.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_24.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_25.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_25.jpg deleted file mode 100644 index 75a467b158..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_25.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31986ca6fd8bc5d8932bf92be9399fa517b3293975b919f1b62d1768aad50d07 -size 43276 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_26.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_26.jpg deleted file mode 100644 index 67668e35f9..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_26.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ece5934edb0a5cbb8c5f576782f7389a65c5fec21787543b66b8d1e5a7d0e7d5 -size 250926 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_3.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_3.jpg deleted file mode 100644 index 88ce372617..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e592d891af476c573a9a2c5b79f96317cf066f948b6d1418027b7140c43e8da0 -size 247242 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_4.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_4.jpg deleted file mode 100644 index 7961fe7348..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bad8264904cd140812fbcbda6aaea26f3b9615509f031c00cd66a357fcb7ae99 -size 250793 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_5.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_5.jpg deleted file mode 100644 index 3fe2405af5..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e0fe770303bde8c77538ac837a7ffe1e352707b4bcc838f97c5c9393aa9d70d -size 256335 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_6.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_6.jpg deleted file mode 100644 index 4f629a9f0a..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b73190d30c15279988f614e24c72a3be0b3ddb0a3b71c2a9fa5755ab543f390c -size 255946 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_7.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_7.jpg deleted file mode 100644 index 4f629a9f0a..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b73190d30c15279988f614e24c72a3be0b3ddb0a3b71c2a9fa5755ab543f390c -size 255946 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_8.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_8.jpg deleted file mode 100644 index 4f629a9f0a..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b73190d30c15279988f614e24c72a3be0b3ddb0a3b71c2a9fa5755ab543f390c -size 255946 diff --git a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_9.jpg b/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_9.jpg deleted file mode 100644 index 8b4c02cef3..0000000000 --- a/Tests/editor/goldenimages/C1564086_environment_modes_toolbar_function_9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb3f563f3269883a7b1e637d1f062e0778f296921c70d1e9877687414047528b -size 255652 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_0.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_0.jpg deleted file mode 100644 index 95800d3043..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ede90dc2bfd44aafdd10675167e09ac407b3c54cbd400085b607c5a7fbd5f68 -size 250898 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_1.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_1.jpg deleted file mode 100644 index 89726d001d..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59254aa0c1eeb4c945f27b5242d14e699587e8bd0be9f00f1cccb61dd3b94774 -size 78600 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_10.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_10.jpg deleted file mode 100644 index b188767346..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62c7257f7d4c83eda324d8ff4415dafeb12ca65604a57c8d236497fabbd6a9fe -size 84941 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_11.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_11.jpg deleted file mode 100644 index b188767346..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_11.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62c7257f7d4c83eda324d8ff4415dafeb12ca65604a57c8d236497fabbd6a9fe -size 84941 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_12.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_12.jpg deleted file mode 100644 index b188767346..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_12.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62c7257f7d4c83eda324d8ff4415dafeb12ca65604a57c8d236497fabbd6a9fe -size 84941 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_13.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_13.jpg deleted file mode 100644 index b188767346..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_13.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62c7257f7d4c83eda324d8ff4415dafeb12ca65604a57c8d236497fabbd6a9fe -size 84941 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_14.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_14.jpg deleted file mode 100644 index 4d0d4f6c74..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_14.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b4741266da9bd50e6947a9c79301788cc8cae291a44d131aec05000051b2a74 -size 947845 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_15.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_15.jpg deleted file mode 100644 index 4d0d4f6c74..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_15.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b4741266da9bd50e6947a9c79301788cc8cae291a44d131aec05000051b2a74 -size 947845 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_16.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_16.jpg deleted file mode 100644 index b41845e10c..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_16.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f79245a06039632b28db196126ae79fab9418204b4bc34a61fee1387b34a4e20 -size 879719 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_17.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_17.jpg deleted file mode 100644 index 06fa9c9c43..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_17.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f31b460953ac39a4ba7749cf7b044c19f5ee99407692b01bc5468d3321ad29f3 -size 879732 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_18.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_18.jpg deleted file mode 100644 index 0ae679a7ac..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_18.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:734d16899c3a7cb0f812e716c0d5f44ef65dd1e1fb34a5ee7fcbeb942d7a6068 -size 879751 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_19.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_19.jpg deleted file mode 100644 index 0ae679a7ac..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_19.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:734d16899c3a7cb0f812e716c0d5f44ef65dd1e1fb34a5ee7fcbeb942d7a6068 -size 879751 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_2.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_2.jpg deleted file mode 100644 index 3f7b0334db..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6434148ddd02ad545d56370eb4be43babb9b73bb38df21c4247dcc8cb1cb22c7 -size 52507 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_20.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_20.jpg deleted file mode 100644 index 0ae679a7ac..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_20.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:734d16899c3a7cb0f812e716c0d5f44ef65dd1e1fb34a5ee7fcbeb942d7a6068 -size 879751 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_21.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_21.jpg deleted file mode 100644 index 92868765a3..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_21.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4077f1d6b735f8ba0be0f9390a5b189dd30213ef49f3bd99aef099c990c8215c -size 250894 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_3.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_3.jpg deleted file mode 100644 index ba01539a2c..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d697581ca31a3db3cbbb6ae443397d12f2f6451c71e1990df38fedc26147e614 -size 52615 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_4.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_4.jpg deleted file mode 100644 index cfbff70f3a..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec126230113cadb9dad5fce3d04e59ed362ffee914bcc3cfc87549b98925993a -size 240006 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_5.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_5.jpg deleted file mode 100644 index 4c1ff6bba9..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad27b3b961e7b80bf93c517b29ebd6c4afa74b25f8de5fbd882a0b1d7f017a29 -size 71636 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_6.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_6.jpg deleted file mode 100644 index 9998b5fac5..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a964d4ad0e028f384e8f71d451b5fce77cbde4d1235f83fca2485cd59754aa0 -size 48196 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_7.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_7.jpg deleted file mode 100644 index 652823e086..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73875f2ef02e61011838b749bc98d2554757f39ebdaa2c9542efb0000299b702 -size 49161 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_8.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_8.jpg deleted file mode 100644 index e896128488..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:545e8b6f7dfef6c3d96bb67f0a7c6a015771d55b8da7e5b0b4ce686f7fb337dc -size 61007 diff --git a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_9.jpg b/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_9.jpg deleted file mode 100644 index 906c3c64ee..0000000000 --- a/Tests/editor/goldenimages/C1796478_view_modes_toolbar_function_9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a316a0e8bb1f459c7ed3b0de0e18598d004cbe32aadd94aa665dc1809c019cb -size 202015 diff --git a/Tests/editor/goldenimages/C6308162_tool_stability_entity_inspector.jpg b/Tests/editor/goldenimages/C6308162_tool_stability_entity_inspector.jpg deleted file mode 100644 index b7d2e7d5fa..0000000000 --- a/Tests/editor/goldenimages/C6308162_tool_stability_entity_inspector.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b339d0960f277775ff57748f60401e8551b1cec12da15847e6c4d389b0af7c41 -size 185663 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_0.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_0.jpg deleted file mode 100644 index 89726d001d..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59254aa0c1eeb4c945f27b5242d14e699587e8bd0be9f00f1cccb61dd3b94774 -size 78600 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_1.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_1.jpg deleted file mode 100644 index 3f7b0334db..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6434148ddd02ad545d56370eb4be43babb9b73bb38df21c4247dcc8cb1cb22c7 -size 52507 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_10.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_10.jpg deleted file mode 100644 index 584e809c2d..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6716c9e81c0dba305b84b77cc9c20798b43f06da0ceca2d8a2116105078beb6c -size 357466 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_11.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_11.jpg deleted file mode 100644 index 1eaccce054..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_11.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb121c1872d6f3e1327f9d163c163f0f908f0d0d22205073e2e60bcb5da2f1c8 -size 264177 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_12.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_12.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_12.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_13.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_13.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_13.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_14.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_14.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_14.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_15.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_15.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_15.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_16.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_16.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_16.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_17.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_17.jpg deleted file mode 100644 index 8cb9c8e967..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_17.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfe0f02c94fa03717c1748265101f76954f4559b1a2eaab6621961b16313e949 -size 612250 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_18.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_18.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_18.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_19.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_19.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_19.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_2.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_2.jpg deleted file mode 100644 index ba01539a2c..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d697581ca31a3db3cbbb6ae443397d12f2f6451c71e1990df38fedc26147e614 -size 52615 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_20.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_20.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_20.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_21.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_21.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_21.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_22.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_22.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_22.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_23.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_23.jpg deleted file mode 100644 index 62c1f55911..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_23.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4afa2c8fdafe1609ff65abc9db434a9ccca21651684255d884f05b54e0f5376 -size 255558 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_3.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_3.jpg deleted file mode 100644 index cfbff70f3a..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec126230113cadb9dad5fce3d04e59ed362ffee914bcc3cfc87549b98925993a -size 240006 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_4.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_4.jpg deleted file mode 100644 index 4c1ff6bba9..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad27b3b961e7b80bf93c517b29ebd6c4afa74b25f8de5fbd882a0b1d7f017a29 -size 71636 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_5.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_5.jpg deleted file mode 100644 index 9998b5fac5..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a964d4ad0e028f384e8f71d451b5fce77cbde4d1235f83fca2485cd59754aa0 -size 48196 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_6.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_6.jpg deleted file mode 100644 index 652823e086..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73875f2ef02e61011838b749bc98d2554757f39ebdaa2c9542efb0000299b702 -size 49161 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_7.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_7.jpg deleted file mode 100644 index e896128488..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:545e8b6f7dfef6c3d96bb67f0a7c6a015771d55b8da7e5b0b4ce686f7fb337dc -size 61007 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_8.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_8.jpg deleted file mode 100644 index 7bf5b213f8..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d9a54052ca4b465ee74da7ba3c575738c7df8a40a4761362ba057ad376036c9 -size 255541 diff --git a/Tests/editor/goldenimages/debug_views_toolbar_function_9.jpg b/Tests/editor/goldenimages/debug_views_toolbar_function_9.jpg deleted file mode 100644 index 410b372c8b..0000000000 --- a/Tests/editor/goldenimages/debug_views_toolbar_function_9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a148d2e9010403fa7ec9c86b077d731c6c1a1154b3e1a402ad234035a1cb5e5 -size 542160 diff --git a/Tests/editor/test_assign_dynamic_slice.py b/Tests/editor/test_assign_dynamic_slice.py deleted file mode 100755 index dd7eac90a7..0000000000 --- a/Tests/editor/test_assign_dynamic_slice.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C17211213: Assign Dynamic Slice -https://testrail.agscollab.com/index.php?/cases/view/17211213 -""" -import os -import pytest - -# Skip test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestAssignDynamicSlice(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.BAT - @pytest.mark.test_case_id("C17211213") - def test_assign_dynamic_slice(self, request, editor, level): - expected_lines = [ - "Spawner Entity successfully created", - "Spawner component was added to entity", - "Entity has a Spawner component", - "Spawner Dynamic slice: SUCCESS", - "Entity found for thunderbolt" - ] - unexpected_lines = ["The test asset did not spawn"] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "assign_dynamic_slice.py", - expected_lines, - unexpected_lines, - cfg_args=[level], - timeout=log_monitor_timeout - ) diff --git a/Tests/editor/test_basic_docked_tools.py b/Tests/editor/test_basic_docked_tools.py deleted file mode 100755 index 2b4215c9db..0000000000 --- a/Tests/editor/test_basic_docked_tools.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6376081: Basic Function: Docked/Undocked Tools -https://testrail.agscollab.com/index.php?/cases/view/6376081 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicDockedTools(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6376081") - def test_basic_docked_tools(self, request, editor, level): - expected_lines = [ - "The tools are all docked together in a tabbed widget", - "Entity Outliner works when docked, can select an Entity", - "Entity Inspector works when docked, Entity name changed to DifferentName", - "e_Vegetation=1" # This line verifies the Console is working while docked, since it will print out this command - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_docked_tools.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_edit_menu_options.py b/Tests/editor/test_basic_edit_menu_options.py deleted file mode 100755 index a15bebdef4..0000000000 --- a/Tests/editor/test_basic_edit_menu_options.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C16780783: Base Edit Menu Options (New Viewport Interaction Model) -https://testrail.agscollab.com/index.php?/cases/view/16780783 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 160 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -class TestEditMenu(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C16780783", "C2174438") - def test_edit_menu_new_viewport(self, request, editor, level): - expected_lines = [ - "Undo Action triggered", - "Redo Action triggered", - "Duplicate Action triggered", - "Delete Action triggered", - "Select All Action triggered", - "Invert Selection Action triggered", - "Toggle Pivot Location Action triggered", - "Reset Entity Transform", - "Reset Manipulator", - "Snap angle Action triggered", - "Move Action triggered", - "Rotate Action triggered", - "Scale Action triggered", - "Lock Selection Action triggered", - "Unlock All Entities Action triggered", - "Global Preferences Action triggered", - "Graphics Settings Action triggered", - "Editor Settings Manager Action triggered", - "Very High Action triggered", - "High Action triggered", - "Medium Action triggered", - "Low Action triggered", - "Apple TV Action triggered", - "Customize Keyboard Action triggered", - "Export Keyboard Settings Action triggered", - "Import Keyboard Settings Action triggered", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_edit_menu_options_new_viewport.py", - expected_lines, - cfg_args=[level], - run_python="--runpython", - auto_test_mode=True, - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_file_menu_options.py b/Tests/editor/test_basic_file_menu_options.py deleted file mode 100755 index 74cb5476a2..0000000000 --- a/Tests/editor/test_basic_file_menu_options.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16780778: The File menu options function normally-New view interaction Model enabled -https://testrail.agscollab.com/index.php?/cases/view/16780778 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from ..ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -class TestFileMenu(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - expected_lines = [ - "New Level Action triggered", - "Open Level Action triggered", - "Import Action triggered", - "Save Action triggered", - "Save As Action triggered", - "Save Level Statistics Action triggered", - "Switch Projects Action triggered", - "Configure Gems Action triggered", - "Show Log File Action triggered", - "Resave All Slices Action triggered", - "Upgrade Legacy Entities Action triggered", - ] - - @pytest.mark.test_case_id("C16780778") - def test_file_menu_after_interaction_model_toggle(self, request, editor, level): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_file_menu_options.py", - self.expected_lines, - cfg_args=[level], - auto_test_mode=True, - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_function_lock_hide.py b/Tests/editor/test_basic_function_lock_hide.py deleted file mode 100755 index d88ec3716d..0000000000 --- a/Tests/editor/test_basic_function_lock_hide.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17218881: Basic Function: Locking & Hiding -https://testrail.agscollab.com/index.php?/cases/view/17218881 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicFunctionLockHide(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - expected_lines = [ - "Entity2 Entity successfully created", - "Entity3 Entity successfully created", - "Entity4 Entity successfully created", - "Entity5 Entity successfully created", - "Child entities are hidden when parent entity is hidden: True", - "Child entities are shown when parent entity is shown: True", - "Child entities are locked when parent entity is locked: True", - "Child entities are unlocked when parent entity is unlocked: True", - "Entity6 Entity successfully created", - "Entity7 Entity successfully created", - "The parent entity of Entity6 is Entity2", - "The parent entity of Entity7 is Entity2", - ] - - @pytest.mark.test_case_id("C17218881") - def test_basic_function_lock_hide(self, request, editor, level): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_function_lock_hide.py", - self.expected_lines, - auto_test_mode=False, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_global_preferences.py b/Tests/editor/test_basic_global_preferences.py deleted file mode 100755 index 525942a6ce..0000000000 --- a/Tests/editor/test_basic_global_preferences.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6321491: Basic Function: Global Preferences -https://testrail.agscollab.com/index.php?/cases/view/6321491 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -class TestBasicGlobalPreferences(object): - expected_lines = [ - "Global Preferences action triggered", - "Toolbar Icon size set to Large", - "Toolbar Icon size set to Default", - "Toolbar Icon size changed in Global Preferences", - ] - - @pytest.mark.test_case_id("C6321491") - def test_basic_global_preferences(self, request, editor): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_global_preferences.py", - self.expected_lines, - auto_test_mode=False, - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_toolbar_function.py b/Tests/editor/test_basic_toolbar_function.py deleted file mode 100755 index 58dcd3c13f..0000000000 --- a/Tests/editor/test_basic_toolbar_function.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6351301: Basic Function: Toolbars -https://testrail.agscollab.com/index.php?/cases/view/6351301 -""" - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicToolbarFunction(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6351301") - @pytest.mark.BAT - def test_basic_toolbar_function(self, request, editor, level): - - expected_lines = [ - "EditMode toolbar is enabled", - "Object toolbar is enabled", - "debugViewsToolbar toolbar is enabled", - "environmentModesToolbar toolbar is enabled", - "viewModesToolbar toolbar is enabled", - "In game mode: Play game ToolButton is responsive", - "Go to selected object option is responsive", - "EditMode toolbar is disbaled", - "Object toolbar is disbaled", - "debugViewsToolbar toolbar is disbaled", - "environmentModesToolbar toolbar is disbaled", - "viewModesToolbar toolbar is disbaled", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_toolbar_function.py", - expected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_ui_appearence_function.py b/Tests/editor/test_basic_ui_appearence_function.py deleted file mode 100755 index 92256c1001..0000000000 --- a/Tests/editor/test_basic_ui_appearence_function.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317014: Basic UI Appearance & Function -https://testrail.agscollab.com/index.php?/cases/view/6317014 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 120 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicUI(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6317014") - def test_basic_ui_appearence(self, request, editor, level): - expected_lines = [ - "Tool opened", - "File Action triggered", - "Edit Action triggered", - "Game Action triggered", - "Tools Action triggered", - "View Action triggered", - "AWS Action triggered", - "Help Action triggered", - "Viewport is responsive", - "In game mode: Play game ToolButton is responsive", - ] - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_ui_appearence_function.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_ui_scaling.py b/Tests/editor/test_basic_ui_scaling.py deleted file mode 100755 index cf7f60eb64..0000000000 --- a/Tests/editor/test_basic_ui_scaling.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317020: Basic UI Scaling -https://testrail.agscollab.com/index.php?/cases/view/6317020 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from ..ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicUIScaling(object): - @pytest.mark.test_case_id("C6317020") - def test_basic_ui_scaling(self, request, legacy_editor, level): - expected_lines = ["Editor size is 1000 X 500", "Editor size is 2000 X 1000", "Docked Widget size is 100 X 100"] - unexpected_lines = ["Widget size not equal to expected value"] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - legacy_editor, - "basic_ui_scaling.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_viewport_configuration.py b/Tests/editor/test_basic_viewport_configuration.py deleted file mode 100755 index 5730a603bd..0000000000 --- a/Tests/editor/test_basic_viewport_configuration.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317035: Basic Viewport Configuration -https://testrail.agscollab.com/index.php?/cases/view/6317035 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicViewportConfiguration(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6317035") - def test_basic_viewport_configuration(self, request, editor, level): - expected_lines = [ - "Layout set to 1", - "Viewport 1 camera controls are functional: True", - "Viewport 2 camera controls are functional: True", - "Layout set to 0" - ] - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_viewport_configuration.py", - expected_lines, - auto_test_mode=False, - cfg_args=[level], - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_window_docking.py b/Tests/editor/test_basic_window_docking.py deleted file mode 100755 index 31dfdeb6e0..0000000000 --- a/Tests/editor/test_basic_window_docking.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C18668804: Basic Window Docking System Tests -https://testrail.agscollab.com/index.php?/cases/view/18668804 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -class TestBasicWindowDocking(object): - @pytest.mark.test_case_id("C18668804") - def test_basic_window_docking(self, request, editor): - expected_lines = [ - "Entity Outliner is in a floating window", - "Entity Outliner docked in top area", - "Entity Outliner docked in right area", - "Entity Outliner docked in bottom area", - "Entity Outliner docked in left area" - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_window_docking.py", - expected_lines, - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_workflow.py b/Tests/editor/test_basic_workflow.py deleted file mode 100755 index cf3cae0bf8..0000000000 --- a/Tests/editor/test_basic_workflow.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6384955: Basic Workflow: Entity Manipulation in the Outliner -https://testrail.agscollab.com/index.php?/cases/view/6384955 -""" -import os -import pytest - -# Skip test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicWorkflow(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.BAT - @pytest.mark.test_case_id("C6384955") - def test_entity_manipulation_in_outliner(self, request, editor, level): - expected_lines = [ - "Parent Entity successfully created", - "Child Entity successfully created", - "Grandchild Entity successfully created", - "Original Check: The parent entity of Child: Expected: Parent; Actual: Parent", - "Original Check: The parent entity of Grandchild: Expected: Child; Actual: Child", - "After Move: The parent entity of Grandchild: Expected: Parent; Actual: Parent", - "Undo (Undo:6,Redo:1)", - "After Undo: The parent entity of Grandchild: Expected: Child; Actual: Child", - ] - unexpected_lines = [ - "The IDs of the actual and expected parent entities did not match", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "entity_manipulation_in_outliner.py", - expected_lines, - unexpected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_basic_workflow_layers.py b/Tests/editor/test_basic_workflow_layers.py deleted file mode 100755 index fbac331fc5..0000000000 --- a/Tests/editor/test_basic_workflow_layers.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6384949: Basic Workflow: Layers -https://testrail.agscollab.com/index.php?/cases/view/6384949 -""" -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestBasicWorkflowLayers(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6384949") - @pytest.mark.BAT - def test_basic_workflow_layers(self, request, editor, level): - expected_lines = [ - "First Layer is created", - "First Entity is created", - "Original Check: The parent entity of Entity1 is : Layer1", - "Second Entity is created", - "Original Check: The parent entity of Entity2 is : Layer1", - "After Drag: The parent entity of Entity1 is :", - "After Drag: The parent entity of Entity2 is :", - "Second Layer is created", - "After Drag: The parent entity of Layer2 is : Layer1", - "ChildPolished event received", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "basic_workflow_layers.py", - expected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_camera_component.py b/Tests/editor/test_camera_component.py deleted file mode 100755 index efc6669ac6..0000000000 --- a/Tests/editor/test_camera_component.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C17219007: Camera Component -https://testrail.agscollab.com/index.php?/cases/view/17219007 -""" - -import os -import pytest - -# Skip test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestCameraComponent(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.BAT - @pytest.mark.test_case_id("C17219007") - def test_camera_component(self, request, editor, level): - expected_lines = [ - "Entity created with camera component", - "'Be this camera' button was clicked", - "Camera has shifted after clicking 'Be this camera' button", - "'Return to default editor camera' button was clicked", - "Camera has shifted after clicking 'Return to default editor camera' button" - ] - - unexpected_lines = [ - "Camera positions do not differ as expected" - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "camera_component.py", - expected_lines, - unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_component_list_contents.py b/Tests/editor/test_component_list_contents.py deleted file mode 100755 index 63e45db203..0000000000 --- a/Tests/editor/test_component_list_contents.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C16798661: Component List Contents -https://testrail.agscollab.com/index.php?/cases/view/16798661 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestAddDeleteComponents(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C16798661") - def test_component_list_contents(self, request, editor, level): - expected_lines = [ - "Entity Created", - "Successfully collapsed category.", - "Successfully expanded category.", - "Box Shape successfully added.", - ] - - unexpected_lines = ["Box Shape already existed on Entity."] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "component_list_contents.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_component_list_filtering.py b/Tests/editor/test_component_list_filtering.py deleted file mode 100755 index cd90b3b7a5..0000000000 --- a/Tests/editor/test_component_list_filtering.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C16877221: Component List Filtering -https://testrail.agscollab.com/index.php?/cases/view/16877221 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestAddDeleteComponents(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C16877221") - def test_component_list_filtering(self, request, editor, level): - expected_lines = [ - "Box Shape : Valid filtered component list", - "Full component list", - "Invalid Component Name !@#$ : Empty component list" - ] - - unexpected_lines = [ - "Invalid component found in search results." - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "component_list_filtering.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False, - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_conflicting_components.py b/Tests/editor/test_conflicting_components.py deleted file mode 100755 index 77357b3045..0000000000 --- a/Tests/editor/test_conflicting_components.py +++ /dev/null @@ -1,82 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16929884: Conflicting Components -https://testrail.agscollab.com/index.php?/cases/view/16929884 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestConflictingComponents(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C16929884") - def test_conflicting_components(self, request, editor, level): - expected_lines = [ - "Conflicting components test successful." - ] - unexpected_lines = [ - "New level failed.", - "Failed to create new entity.", - "Could not find inspector for box shape.", - "Could not find inspector for cylinder shape.", - "Failed to create Box Shape component.", - "Failed to create Cylinder Shape component.", - "Failed to find buttons on box component.", - "Failed to find buttons on cylinder component.", - "Incorrectly enabled components.", - "Found buttons on box component when disabled.", - "Found buttons on cylinder component when active.", - "Box not disabled when cylinder active.", - "Cylinder Shape still exists.", - "Found buttons on box component when active.", - "Box not active.", - "Test Failed." - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "conflicting_components.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_corrupt_child_slice.py b/Tests/editor/test_corrupt_child_slice.py deleted file mode 100755 index 2ee2a3c9c7..0000000000 --- a/Tests/editor/test_corrupt_child_slice.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2603859: Parent Slice should still load on map if a child slice is corrupted. -https://testrail.agscollab.com/index.php?/cases/view/2603859 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 120 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestCorruptChildSlice(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_1")], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_2")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_1")], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_2")], True, True) - - @pytest.mark.test_case_id("C2603859") - def test_corrupt_child_slice(self, request, editor, level): - expected_lines = [ - "Corrupt child slice test complete." - ] - unexpected_lines = [ - "Failed to find warning message in push dialog.", - "Failed to find Invalid References warning message.", - "Failed to find CorruptB invalid reference removal message.", - "Failed to create new entity.", - "Failed to set entity name.", - "Failed to create slice.", - "Failed to find the outliner.", - "Failed to find the outliner main window.", - "Failed to find the outliner tree view.", - "Failed to find the console.", - "Failed to find console textEdit.", - "Failed to create level", - "Failed to reload test_level_1", - "Failed to reload test_level_2", - "Failed to find error message dialog.", - "No CorruptA entity found after reload", - "No CorruptB entity found after reload", - "CorruptC entity found after reload", - "Failed to find push dialog.", - "Failed to reload test_level_1", - "Failed to reload test_level_2", - "Level failed to load without errors.", - "Error occurred instantiating CorruptA." - "Test Failed." - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "corrupt_child_slice.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) - diff --git a/Tests/editor/test_create_camera_comp_from_view.py b/Tests/editor/test_create_camera_comp_from_view.py deleted file mode 100755 index e0fea89353..0000000000 --- a/Tests/editor/test_create_camera_comp_from_view.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C17219006: Create Camera Entity from view -https://testrail.agscollab.com/index.php?/cases/view/17219006 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestCreateCameraComponentFromView(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C17219006") - def test_create_camera_comp_from_view(self, request, editor, level): - expected_lines = ["Viewport Camera Selector is opened", "Viewport Camera Selector is closed"] - - unexpected_lines = [ - "Entity with Camera component is not created", - "Entity do not have a Camera component", - "Camera1 is not listed in the Viewport Camera Selector", - "Entity do not have a Camera component", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "create_camera_comp_from_view.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_create_dynamic_slice.py b/Tests/editor/test_create_dynamic_slice.py deleted file mode 100755 index 65d8399558..0000000000 --- a/Tests/editor/test_create_dynamic_slice.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C1519572: Create a dynamic slice -https://testrail.agscollab.com/index.php?/cases/view/1519572 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 90 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestCreateDynamicSlice(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "slices", "TestSlice.slice")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "slices", "TestSlice.slice")], True, True) - - @pytest.mark.test_case_id("C1519572") - def test_create_dynamic_slice(self, request, editor, level): - expected_lines = [ - "Slice Status (Before setting to dynamic): Not Dynamic", - "Slice Status (After setting to dynamic): Dynamic", - "Slice Status (Before unsetting to dynamic): Dynamic", - "Slice Status (After unsetting to dynamic): Not Dynamic", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "create_dynamic_slice.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_create_entity_via_viewport.py b/Tests/editor/test_create_entity_via_viewport.py deleted file mode 100755 index 302bacdd99..0000000000 --- a/Tests/editor/test_create_entity_via_viewport.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6317058: Viewport Entity Creation -https://testrail.agscollab.com/index.php?/cases/view/6317058 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestViewportEntityCreation(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6317058") - def test_viewport_entity_creation(self, request, editor, level): - expected_lines = [ - "New Entity created in the correct position" - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "create_entity_via_viewport.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_create_inputbindings_file.py b/Tests/editor/test_create_inputbindings_file.py deleted file mode 100755 index cb495e59c6..0000000000 --- a/Tests/editor/test_create_inputbindings_file.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1506874: Create Input Bindings File -https://testrail.agscollab.com/index.php?/cases/view/1506874 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestCreateInputBindingFile(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "temp.inputbindings")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "temp.inputbindings")], True, True) - - @pytest.mark.test_case_id("C1506874") - def test_create_inputbindings_file(self, request, editor, level): - expected_lines = [ - "New inputbindings file created: True", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "create_inputbindings_file.py", - expected_lines, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_create_new_level.py b/Tests/editor/test_create_new_level.py deleted file mode 100755 index 80723ce71c..0000000000 --- a/Tests/editor/test_create_new_level.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6351273: Create a new level -https://testrail.agscollab.com/index.php?/cases/view/6351273 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from ..ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestCreateANewLevel(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, legacy_workspace, project, level): - def teardown(): - # delete temp level - file_system.delete([os.path.join(legacy_workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6351273") - def test_create_level(self, request, legacy_editor, level): - expected_lines = [ - "New Level Action triggered", - "New Level dialog opened", - "Create and load new level: SUCCESS", - ] - unexpected_lines = ["Create and load new level: FAILED"] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - legacy_editor, - "create_new_level.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_customize_keyboard.py b/Tests/editor/test_customize_keyboard.py deleted file mode 100755 index f700aecdb1..0000000000 --- a/Tests/editor/test_customize_keyboard.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C6321576: Basic Function: Customize Keyboard -https://testrail.agscollab.com/index.php?/cases/view/6321576 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -class TestCustomizeKeyboard(object): - @pytest.mark.test_case_id("C6321576") - def test_customize_keyboard(self, request, editor): - expected_lines = [ - "Customize keyboard window opened successfully", - "New shortcut works : Asset Editor opened", - "Default shortcuts restored : Asset Editor stays closed" - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "customize_keyboard.py", - expected_lines, - auto_test_mode=False # Customize Keyboard is a modal dialog so test mode is disabled - ) diff --git a/Tests/editor/test_deleting_entities_from_outliner.py b/Tests/editor/test_deleting_entities_from_outliner.py deleted file mode 100755 index cde4aa93a4..0000000000 --- a/Tests/editor/test_deleting_entities_from_outliner.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1510643: Deleting Entities in the Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/1510643 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestDeletingEntitiesFromOutliner(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C1510643") - def test_deleting_entities_from_outliner(self, request, editor, level): - expected_lines = [ - "Parent Entity created", - "Child Entities created", - "Child entity 1 deleted succesfully", - "Deleting a Child entity does not delete the parent", - "Child entity restored successfully", - "Parent entity deleted succesfully", - "Deleting the Parent entity deletes all child entities linked to it", - "Entity hierarchy is restored", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "deleting_entities_from_outliner.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_edit_mode_toolbar.py b/Tests/editor/test_edit_mode_toolbar.py deleted file mode 100755 index a3639ce250..0000000000 --- a/Tests/editor/test_edit_mode_toolbar.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1564083 : Edit Mode Toolbar -https://testrail.agscollab.com/index.php?/cases/view/1564083 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestEditModeToolbar(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C1564083") - def test_edit_mode_toolbar(self, request, editor, level): - expected_lines = [ - "Editors tool bar opened successfully", - "Undo tool button is functional", - "Redo tool button is functional", - "Move tool button is accesible", - "Rotate tool button is accesible", - "Scale tool button is accesible", - "Play game tool button is responsive", - "Snap to grid tool button is responsive", - "Snap angle tool button is responsive", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "edit_mode_toolbar_function.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_editor_layout_save_and_load.py b/Tests/editor/test_editor_layout_save_and_load.py deleted file mode 100755 index 3893ca1d86..0000000000 --- a/Tests/editor/test_editor_layout_save_and_load.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C697735: Custom layouts can be saved -C697736: Custom/Default layouts can be loaded -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -class TestLoadLayout(object): - @pytest.mark.test_case_id("C697736", "C697735") - def test_EditorLayout_CustomLayoutSavesAndLoads(self, request, editor): - expected_lines = [ - "load_layout: test started", - "Custom layout setup complete", - "load_layout: result=SUCCESS", - "QAction not found for menu item 'custom_layout_test'" - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "editor_layout_save_and_load.py", - expected_lines, - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_enter_exit_component_mode.py b/Tests/editor/test_enter_exit_component_mode.py deleted file mode 100755 index 93e3f61eb3..0000000000 --- a/Tests/editor/test_enter_exit_component_mode.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2174442: Enter/Exit Component Mode -https://testrail.agscollab.com/index.php?/cases/view/2174442 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestEnterExitComponentMode(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C2174442") - def test_enter_exit_compoenent_mode(self, request, editor, level): - expected_lines = [ - "Entity has a Box Shape component", - "Entered component mode", - "Left component mode", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "enter_exit_component_mode.py", - expected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_entity_duplication_entity_outliner.py b/Tests/editor/test_entity_duplication_entity_outliner.py deleted file mode 100755 index 8f88b3a009..0000000000 --- a/Tests/editor/test_entity_duplication_entity_outliner.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17218882: Entity duplication in Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/17218882 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestEntityDuplicationIEntityOutliner(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C17218882") - def test_entity_duplication(self, request, editor, level): - expected_lines = [ - "First entity created", - "Entity duplicated using shortcut - 1 success: True", - "Entity duplicated using shortcut - 2 success: True", - "Entity duplicated using shortcut - 3 success: True", - "Entity duplication Undo success: True", - "Entity duplication using right click - 1 success: True", - "Entity duplication using right click - 2 success: True", - "Entity duplication using right click - 3 success: True", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "entity_duplication_entity_outliner.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_entity_selection_entity_outliner.py b/Tests/editor/test_entity_selection_entity_outliner.py deleted file mode 100755 index f01658a7df..0000000000 --- a/Tests/editor/test_entity_selection_entity_outliner.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C2202976: Entity Selection - Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/2202976 -""" - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -class TestEntitySelectionEntityOutliner(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - - @pytest.mark.test_case_id("C2202976") - def test_entity_selection_entity_outliner(self, request, editor, level): - expected_lines = [ - "Entity2 Entity successfully created", - "Entity3 Entity successfully created", - "Entity4 Entity successfully created", - "Single entity selected on first click: True", - "Single entity selected on second click: True", - "CTRL+click worked for adding selected elements (2 elements): True", - "CTRL+click worked for adding selected elements (3 elements): True", - "CTRL+click worked for removing already selected elements: True" - ] - unexpected_lines = [ - "Single entity selected on first click: False", - "Single entity selected on second click: False", - "CTRL+click worked for adding selected elements (2 elements): False", - "CTRL+click worked for adding selected elements (3 elements): False", - "CTRL+click worked for removing already selected elements: False" - ] - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "entity_selection_entity_outliner.py", - expected_lines, - unexpected_lines=unexpected_lines, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) - diff --git a/Tests/editor/test_export_level.py b/Tests/editor/test_export_level.py deleted file mode 100755 index 7114094584..0000000000 --- a/Tests/editor/test_export_level.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C15167491: Export a level -https://testrail.agscollab.com/index.php?/cases/view/15167491 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from ..ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestExportLevel(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, legacy_workspace, project, level): - def teardown(): - # delete temp level - file_system.delete([os.path.join(legacy_workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C15167491") - def test_export_level(self, request, legacy_editor, level): - expected_lines = [ - "Game->Export to Engine Action triggered", - "level.pak file exists", - "Export to the game was successfully done.", - ] - hydra_utils.launch_and_validate_results( - request, - test_directory, - legacy_editor, - "export_level.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_game_menu_options.py b/Tests/editor/test_game_menu_options.py deleted file mode 100755 index 510bb01423..0000000000 --- a/Tests/editor/test_game_menu_options.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16780793: Game Menu Options (New Viewport Interaction Model) -https://testrail.agscollab.com/index.php?/cases/view/16780793 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from ..ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -class TestGameMenuOptions(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - expected_lines = [ - "Play Game Action triggered", - "Simulate Action triggered", - "Export to Engine Action triggered", - "Export Occlusion Mesh Action triggered", - "Enable Camera Terrain Collision Action triggered", - "Move Player and Camera Separately Action triggered", - "Request a full MNM rebuild Action triggered", - "Show Navigation Areas Action triggered", - "Continuous Update Action triggered", - "Visualize Navigation Accessibility Action triggered", - "View Agent Type Action triggered", - "Stop All Sounds Action triggered", - "Refresh Audio Action triggered", - "Configure ToolBox Macros Action triggered", - "ToolBox Macros Action triggered", - "Error Report Action triggered", - ] - - @pytest.mark.test_case_id("C24064530") - def test_game_menu_after_interaction_model_toggle(self, request, editor, level): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "game_menu_options.py", - self.expected_lines, - auto_test_mode=True, - cfg_args=[level], - timeout=log_monitor_timeout, - ) \ No newline at end of file diff --git a/Tests/editor/test_graphics_settings.py b/Tests/editor/test_graphics_settings.py deleted file mode 100755 index 82fd272b4d..0000000000 --- a/Tests/editor/test_graphics_settings.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6321557: Basic Function: Graphics Settings -https://testrail.agscollab.com/index.php?/cases/view/6321557 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.hydra.hydra_utils import launch_test_case -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestGraphicsSettings(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete graphics settings file - file_system.delete( - [os.path.join(workspace.paths.dev(), "SamplesProject", "Config", "Spec", "pc_low.cfg")], - True, - True - ) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - - @pytest.mark.test_case_id("C6321557") - def test_conflicting_components(self, request, editor, level): - expected_lines = [ - "Graphics Settings test successful." - ] - unexpected_lines = [ - "Failed to find Graphics Settings action.", - "Failed to find graphics settings dialog.", - "Failed to find Save button", - "Save button is enabled before change.", - "Failed to find spinbox.", - "Failed to change value.", - "Save button is not enabled after change.", - "Failed to find warning dialog.", - "Unable to find message box in warning dialog", - "Unexpected text in warning dialog.", - "Failed to find yes button.", - "Test Failed." - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "graphics_settings.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) - diff --git a/Tests/editor/test_help_menu_function.py b/Tests/editor/test_help_menu_function.py deleted file mode 100755 index cf5bf451f6..0000000000 --- a/Tests/editor/test_help_menu_function.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1564080: Help Menu Function -https://testrail.agscollab.com/index.php?/cases/view/1564080 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -class TestHelpMenuFunction(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project): - def teardown(): - workspace = editor.workspace - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - - expected_lines = [ - "Getting Started Action triggered Url https://docs.aws.amazon.com/lumberyard/latest/gettingstartedguide", - "Tutorials Action triggered Url https://www.youtube.com/amazonlumberyardtutorials", - "Glossary Action triggered Url https://docs.aws.amazon.com/lumberyard/userguide/glossary", - "Lumberyard Documentation Action triggered Url https://docs.aws.amazon.com/lumberyard/userguide", - "GameLift Documentation Action triggered Url https://docs.aws.amazon.com/gamelift/developerguide", - "Release Notes Action triggered Url https://docs.aws.amazon.com/lumberyard/releasenotes", - "GameDev Blog Action triggered Url https://aws.amazon.com/blogs/gamedev", - "GameDev Twitch Channel Action triggered Url http://twitch.tv/amazongamedev", - "Forums Action triggered Url https://gamedev.amazon.com/forums", - "AWS Support Action triggered Url https://aws.amazon.com/contact-us", - "Documentation search with 'component' text triggered Url https://docs.aws.amazon.com/search/doc-search.html?searchPath=documentation-product&searchQuery=component&this_doc_product=Amazon Lumberyard&ref=lye&ev=0.0.0.0#facet_doc_product=Amazon Lumberyard", - "Documentation Search with '' text triggered Url https://aws.amazon.com/documentation/lumberyard/", - ] - - @pytest.mark.test_case_id("C1564080") - def test_help_menu_function(self, request, editor): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "help_menu_function.py", - self.expected_lines, - cfg_args=[], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_help_menu_options.py b/Tests/editor/test_help_menu_options.py deleted file mode 100755 index 0f6c4f5aa4..0000000000 --- a/Tests/editor/test_help_menu_options.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16780815: Help Menu Options (New Viewport Interaction Model) -https://testrail.agscollab.com/index.php?/cases/view/16780815 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -class TestHelpMenuOptions(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # kill the browser with tab titles matching 'AWS' or 'Amazon' or 'Lumberyard' - os.popen('taskkill /FI "WINDOWTITLE eq AWS*"') - os.popen('taskkill /FI "WINDOWTITLE eq Lumberyard*"') - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - expected_lines = [ - "Getting Started Action triggered", - "Tutorials Action triggered", - "Glossary Action triggered", - "Lumberyard Documentation Action triggered", - "GameLift Documentation Action triggered", - "Release Notes Action triggered", - "GameDev Blog Action triggered", - "GameDev Twitch Channel Action triggered", - "Forums Action triggered", - "AWS Support Action triggered", - "Give Us Feedback Action triggered", - "About Lumberyard Action triggered", - ] - - @pytest.mark.test_case_id("C16780815") - def test_help_menu_after_interaction_model_toggle(self, request, editor, level): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "help_menu_options.py", - self.expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_left_right_mouse_buttons.py b/Tests/editor/test_left_right_mouse_buttons.py deleted file mode 100755 index 6e6c223172..0000000000 --- a/Tests/editor/test_left_right_mouse_buttons.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1564610: LMB and RMB mouse functionality -https://testrail.agscollab.com/index.php?/cases/view/1564610 -""" - - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestLeftAndRightMouseButtons(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C1564610") - def test_left_and_right_mouse_buttons(self, request, editor, level): - - expected_lines = [ - "Create camera entity from view option is selected using mouse buttons", - "Create entity option is selected using mouse buttons", - "Create layer option is selected using mouse buttons", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "left_and_right_mouse_buttons.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_load_level_unpushed_slice_changes.py b/Tests/editor/test_load_level_unpushed_slice_changes.py deleted file mode 100755 index 6c3b400350..0000000000 --- a/Tests/editor/test_load_level_unpushed_slice_changes.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C5436953: Loading a level with un-pushed slice changes does not effect editor stability -https://testrail.agscollab.com/index.php?/cases/view/5436953 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 120 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestLoadLevelUnpushedSlice(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "TestSlice.slice")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "TestSlice.slice")], True, True) - - @pytest.mark.test_case_id("C5436953") - def test_load_level_unpushed_slice_changes(self, request, editor, level): - expected_lines = [ - "entity Entity successfully created", - "Mesh component was added to entity", - "Entity has a Mesh component", - "Slice Created: True", - "Component removed successfully: True", - "Entity found after level reload: True", - "Level saved even if there are unpushed changes in slice: True", - "Unpushed changes in Slice are not saved: True", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "load_level_unpushed_slice_changes.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_object_toolbar.py b/Tests/editor/test_object_toolbar.py deleted file mode 100755 index acbb5fde68..0000000000 --- a/Tests/editor/test_object_toolbar.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -C1564082 : Object Toolbar -https://testrail.agscollab.com/index.php?/cases/view/1564082 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestObjectToolbar(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C1564082") - def test_object_toolbar(self, request, editor, level): - expected_lines = [ - "Object tool bar opened successfully", - "Go to selected object tool button is responsive", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "object_toolbar_function.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_open_level.py b/Tests/editor/test_open_level.py deleted file mode 100755 index ee9b2b06d4..0000000000 --- a/Tests/editor/test_open_level.py +++ /dev/null @@ -1,56 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6351276: Open a level -https://testrail.agscollab.com/index.php?/cases/view/6351276 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["Samples/Audio_Sample"]) -class TestOpenLevel(object): - @pytest.mark.test_case_id("C6351276") - def test_open_level(self, request, editor, level): - expected_lines = [ - "Open Level Action triggered", - "Open a Level dialog opened", - "An existing level opened : SUCCESS", - ] - unexpected_lines = ["An existing level opened : FAILED"] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "open_level.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) \ No newline at end of file diff --git a/Tests/editor/test_open_save_input_binding_file.py b/Tests/editor/test_open_save_input_binding_file.py deleted file mode 100755 index 217c4da560..0000000000 --- a/Tests/editor/test_open_save_input_binding_file.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1506875: Open Input Bindings File -https://testrail.agscollab.com/index.php?/cases/view/1506875 - -C1506876: Save Input Bindings File -https://testrail.agscollab.com/index.php?/cases/view/1506876 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestOpenSaveInputBindings(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C1506875", "C1506876") - def test_open_save_input_binding_file(self, request, editor, level): - expected_lines = [ - "Asset Editor opened: True", - "Input Binding File opened in the Asset Editor", - "Changes are saved successfully", - "Asset Editor closed: True", - ] - - unexpected_lines = [ - "Asset Editor opened: False", - "Asset Editor closed: False", - ] - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "open_save_input_binding_file.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - run_python="--runpython", - auto_test_mode=False, - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_outliner_search.py b/Tests/editor/test_outliner_search.py deleted file mode 100755 index 3e11eb6ff6..0000000000 --- a/Tests/editor/test_outliner_search.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17218816: Entity Outliner Searching -https://testrail.agscollab.com/index.php?/cases/view/17218816 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestEntityOutlinerSearching(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C17218816") - def test_outliner_search(self, request, editor, level): - expected_lines = [ - "Test Entities were set up correctly", - "Searching Test_0 returns 3 entities", - "Searching Test returns 4 entities", - "Searching asdfgh returns 0 entities", - "Emptying the search returns all entities", - ] - unexpected_lines = [] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "outliner_search.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) \ No newline at end of file diff --git a/Tests/editor/test_quick_push_slice.py b/Tests/editor/test_quick_push_slice.py deleted file mode 100755 index adaa41a04f..0000000000 --- a/Tests/editor/test_quick_push_slice.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2669525: Adding and deleting entities to a slice are able to be quick pushed to slice -https://testrail.agscollab.com/index.php?/cases/view/2669525 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestQuickPushSlice(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "test_slice.slice")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "test_slice.slice")], True, True) - - @pytest.mark.test_case_id("C2669525") - def test_quick_push_slice(self, request, editor, level): - expected_lines = [ - "Slice Created: True", - "Newly created child is updated in the instantiated slice", - "Child deletion is updated in the instantiated slice", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "quick_push_slice.py", - expected_lines, - cfg_args=[level], - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_quick_save_slice.py b/Tests/editor/test_quick_save_slice.py deleted file mode 100755 index 009f016e37..0000000000 --- a/Tests/editor/test_quick_save_slice.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C17123213: Quick Saving Changes to Slice -https://testrail.agscollab.com/index.php?/cases/view/17123213 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestQuickSaveSlice(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "TestSlice.slice")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "TestSlice.slice")], True, True) - - @pytest.mark.BAT - @pytest.mark.test_case_id("C17123213") - def test_quick_save_slice(self, request, editor, level): - expected_lines = [ - "Slice Created: True", - "Child entity created: True", - "Mesh component was added to entity", - "Entity has a Mesh component", - "Changes in the slice file are saved: True", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "quick_save_slice.py", - expected_lines, - cfg_args=[level], - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_recover_layer.py b/Tests/editor/test_recover_layer.py deleted file mode 100755 index fb667f4873..0000000000 --- a/Tests/editor/test_recover_layer.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6130788: Recover a layer -https://testrail.agscollab.com/index.php?/cases/view/6130788 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.hydra.hydra_utils import launch_test_case -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestRecoverLayer(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_1")], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_2")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_1")], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "test_level_2")], True, True) - - @pytest.mark.test_case_id("C6130788") - def test_recover_layer(self, request, editor, level): - expected_lines = [ - "Saved level 2 with layers", - "Saved level 2 without layers", - "Reopened level 1", - "Reopened level 2", - "Recover Layer test complete." - ] - unexpected_lines = [ - "Failed to find Layer1 after recovery", - "Failed to find Layer2 after recovery", - "Failed to find inspector window", - "Failed to create level", - "Layer1 creation failed.", - "Layer2 creation failed.", - "Failed to reload test_level_1", - "Layer1 save not set to binary.", - "Layer2 save set to binary.", - "Failed to undo layer recovery.", - "Failed to redo layer recovery." - "Test Failed." - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "recover_layer.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) - diff --git a/Tests/editor/test_recover_layer_deleted_slice.py b/Tests/editor/test_recover_layer_deleted_slice.py deleted file mode 100755 index 88633bbf7b..0000000000 --- a/Tests/editor/test_recover_layer_deleted_slice.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6130896 : Recover a layer containing a deleted slice. -https://testrail.agscollab.com/index.php?/cases/view/6130896 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestRecoverLayerDeletedSlice(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6130896") - def test_recover_layer_deleted_slice(self, request, editor, level): - expected_lines = [ - "Layer1 is created", - "Entity1 is created", - "Slice Created: True", - "Parent of Entity1 is : Layer1", - "This layer can't be recovered.", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "recover_layer_deleted_slice.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_required_components.py b/Tests/editor/test_required_components.py deleted file mode 100755 index 4be47fdb20..0000000000 --- a/Tests/editor/test_required_components.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16929882: Required Components -https://testrail.agscollab.com/index.php?/cases/view/16929882 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.hydra.hydra_utils import launch_test_case -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestRequiredComponents(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C16929882") - def test_required_components(self, request, editor, level): - expected_lines = [ - "Required Component test successful." - ] - unexpected_lines = [ - "New level failed.", - "Failed to create entity.", - "Failed to find editor window.", - "Failed to find Entity Inspector.", - "Failed to find Tube Shape id.", - "Failed to find Spline id.", - "Failed to add Tube Shape to entity.", - "Tube is enabled when first created.", - "Failed to find component list.", - "Failed to find tube shape inspector.", - "Unable to find tube header frame", - "Unable to find tube container frame", - "Unable to find add required component button", - "Spline component already exists.", - "Failed to add Spline component to entity.", - "Tube is not enabled.", - "Missing component warning still exists.", - "Test Failed." - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "required_components.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) \ No newline at end of file diff --git a/Tests/editor/test_save_layer_50000_entities.py b/Tests/editor/test_save_layer_50000_entities.py deleted file mode 100755 index 6f358a5f7e..0000000000 --- a/Tests/editor/test_save_layer_50000_entities.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C3712672: Save a Layer with 50,000 entities. -https://testrail.agscollab.com/index.php?/cases/view/3712672 -""" - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 1000 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestSaveLayer50000Entities(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C3712672") - def testsave_layer_50000_entities(self, request, editor, level): - expected_lines = ["50000 entities created: True", "Layer saved: True"] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "save_layer_50000_entities.py", - expected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_save_level.py b/Tests/editor/test_save_level.py deleted file mode 100755 index d394f19a31..0000000000 --- a/Tests/editor/test_save_level.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C15167490: Save a level -https://testrail.agscollab.com/index.php?/cases/view/15167490 -""" - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") -import ly_test_tools.log.log_monitor -import ly_test_tools.environment.waiter as waiter - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestSaveALevel(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "tmp_new_level")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", "tmp_new_level")], True, True) - - @pytest.mark.test_case_id("C15167490") - @pytest.mark.BAT - def test_save_level(self, request, editor, level): - - expected_lines = [ - "Entity created", - "The 'Save Level As' dialog appeared", - "Save As Action triggered", - "A new level file is created and saved with the name provided.: SUCCESS", - "Made a change in level", - "Save Action triggered" - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "save_level.py", - expected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) \ No newline at end of file diff --git a/Tests/editor/test_save_overrides_default.py b/Tests/editor/test_save_overrides_default.py deleted file mode 100755 index 3aa93b7d96..0000000000 --- a/Tests/editor/test_save_overrides_default.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C2654251: Adding and deleting entities to a slice should be included on save overrides by default -https://testrail.agscollab.com/index.php?/cases/view/2654251 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestSaveOverridesDefault(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "test_slice.slice")], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - file_system.delete([os.path.join(workspace.paths.dev(), project, "test_slice.slice")], True, True) - - @pytest.mark.test_case_id("C2654251") - def test_save_overrides_default(self, request, editor, level): - expected_lines = [ - "Slice Created: True", - "Child 1 deleted change checked by default: True", - "Child 2 added change checked by default: True", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "save_overrides_default.py", - expected_lines, - cfg_args=[level], - run_python="--runpython", - auto_test_mode=False, - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_select_multiple_entities_entityoutliner.py b/Tests/editor/test_select_multiple_entities_entityoutliner.py deleted file mode 100755 index 979ccb8a53..0000000000 --- a/Tests/editor/test_select_multiple_entities_entityoutliner.py +++ /dev/null @@ -1,82 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1508364 : Select over 1,000+ entities that are open in the Entity Outliner at one time -https://testrail.agscollab.com/index.php?/cases/view/1508364 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestSelectMultipleEntitiesEntityOutliner(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C1508364") - def test_select_multiple_entities_entityoutliner(self, request, editor, level): - expected_lines = [ - "1000 entities created", - "The Entity Inspector shows an accurate count of selected entities (1 element): True", - "CTRL+click worked for adding selected elements (1 element): True", - "The Entity Inspector shows an accurate count of selected entities (2 elements): True", - "CTRL+click worked for adding selected elements (2 elements): True", - "The Entity Inspector shows an accurate count of selected entities (3 elements): True", - "CTRL+click worked for adding selected elements (3 elements): True", - "Selected entities are highlighted in the Entity Outliner", - "The Entity Inspector shows an accurate count of selected entities (1000 elements): True", - ] - - unexpected_lines = [ - "The Entity Inspector shows an accurate count of selected entities (1 element): False", - "CTRL+click worked for adding selected elements (1 element): False", - "The Entity Inspector shows an accurate count of selected entities (2 elements): False", - "CTRL+click worked for adding selected elements (2 elements): False", - "The Entity Inspector shows an accurate count of selected entities (3 elements): False", - "CTRL+click worked for adding selected elements (3 elements): False", - "The Entity Inspector shows an accurate count of selected entities (1000 elements): False", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "select_multiple_entities_entityoutliner.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_settings_get_set.py b/Tests/editor/test_settings_get_set.py deleted file mode 100755 index 9f5f1b32da..0000000000 --- a/Tests/editor/test_settings_get_set.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -Test the Hydra API to access Editor Settings -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestOpenLevel(object): - @pytest.mark.test_case_id("C6351276") - def test_settings_get_set(self, request, editor, level): - expected_lines = [ - "BuildSettingsList returned a non-empty list", - "Boolean Setting editing works", - "Int Setting editing works", - "Float Setting editing works", - "String Setting editing works" - ] - unexpected_lines = [] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "settings_get_set.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) \ No newline at end of file diff --git a/Tests/editor/test_tool_stability_asset_editor.py b/Tests/editor/test_tool_stability_asset_editor.py deleted file mode 100755 index 0469b2f4c3..0000000000 --- a/Tests/editor/test_tool_stability_asset_editor.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6312589: Tool Stability & Workflow: Asset Editor -https://testrail.agscollab.com/index.php?/cases/view/6312589 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestToolStabilityAssetEditor(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6312589") - def test_tool_stability_asset_editor(self, request, editor, level): - expected_lines = [ - "Asset Editor opened: True", - "Save as dialog opened", - "Asset Editor closed: True", - "Input component was added to entity", - ".inputbinding file is selected in the file picker", - "Asset Editor for the assigned inputbinding file is opened", - ] - - unexpected_lines = [ - "Asset Editor opened: False", - "Asset Editor closed: False", - ] - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "tool_stability_asset_editor.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False # Disabled so that we can inspect the modal dialogs, otherwise they would be dismissed immediately - ) diff --git a/Tests/editor/test_tool_stability_console.py b/Tests/editor/test_tool_stability_console.py deleted file mode 100755 index 81207e2fd8..0000000000 --- a/Tests/editor/test_tool_stability_console.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6308169: Tool Stability & Workflow: Console -https://testrail.agscollab.com/index.php?/cases/view/6308169 -""" - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 60 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestToolStabilityConsole(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - self.screenshot_path = os.path.join(editor.workspace.paths.dev(), "Cache", project, "pc", "user", "screenshots") - # Remove any old screenshots - self.remove_artifacts(self.screenshot_path, ".jpg") - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - def remove_artifacts(self, artifact_path, suffix): - if not os.path.isdir(artifact_path): - return - for file_name in os.listdir(artifact_path): - if file_name.endswith(suffix): - os.remove(os.path.join(artifact_path, file_name)) - - @pytest.mark.test_case_id("C6308169") - def test_tool_stability_console(self, request, editor, level): - expected_lines = [ - "Ran the command in console", - "Console window closed: True", - "Console reopened successfully: True", - ] - - unexpected_lines = ["Console opened successfully: False"] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "tool_stability_console.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) - - # Verify if the console command worked - assert os.path.exists( - os.path.join(self.screenshot_path, "screenshot0000.jpg") - ), "Screenshot is not taken when command is ran in console" - self.remove_artifacts(self.screenshot_path, ".jpg") diff --git a/Tests/editor/test_tool_stability_entity_inspector.py b/Tests/editor/test_tool_stability_entity_inspector.py deleted file mode 100755 index 850d311411..0000000000 --- a/Tests/editor/test_tool_stability_entity_inspector.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C6308162: Tool Stability: Entity Inspector -https://testrail.agscollab.com/index.php?/cases/view/6308162 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -from Tests.ly_shared import screenshot_utils as screenshot_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestToolStabilityEntityInspector(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # Save the exported screenshots and diffs in case they need to be examined later - screenshot_utils.move_screenshots_to_artifacts(self.screenshot_path, ".jpg", workspace.artifact_manager) - screenshot_utils.move_screenshots_to_artifacts(os.getcwd(), "_diff.jpg", workspace.artifact_manager) - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - self.screenshot_path = os.path.join(editor.workspace.paths.dev(), "Cache", project, "pc", "user", "screenshots") - # Remove any old screenshots and diff comparisons - self.remove_artifacts(self.screenshot_path, ".jpg") - self.remove_artifacts(os.getcwd(), "_diff.jpg") - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - def remove_artifacts(self, artifact_path, suffix): - if not os.path.isdir(artifact_path): - return - for file_name in os.listdir(artifact_path): - if file_name.endswith(suffix): - os.remove(os.path.join(artifact_path, file_name)) - - @pytest.mark.test_case_id("C6308162") - def test_tool_stability_entity_inspector(self, request, editor, level): - golden_screenshot_path = os.path.join(editor.workspace.paths.dev(), "Tests", "editor", "goldenimages") - expected_lines = [ - "Entity has a Mesh component", - "Screenshot Taken", - "focus changed", - "Entity with Mesh component is filtered by Entity outliner", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "tool_stability_entity_inspector.py", - expected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) - - screenshot_utils.compare_golden_image( - 0.95, - "screenshot0000.jpg", - self.screenshot_path, - "C6308162_tool_stability_entity_inspector.jpg", - golden_screenshot_path, - ) diff --git a/Tests/editor/test_tool_stability_entity_outliner.py b/Tests/editor/test_tool_stability_entity_outliner.py deleted file mode 100755 index e81d265630..0000000000 --- a/Tests/editor/test_tool_stability_entity_outliner.py +++ /dev/null @@ -1,96 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C6308161: Tool Stability: Entity Outliner -https://testrail.agscollab.com/index.php?/cases/view/6308161 -""" - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestToolStabilityEntityOutliner(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - self.screenshot_path = os.path.join(editor.workspace.paths.dev(), "Cache", project, "pc", "user", "screenshots") - # Remove any old screenshots - self.remove_artifacts(self.screenshot_path, ".jpg") - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - def remove_artifacts(self, artifact_path, suffix): - if not os.path.isdir(artifact_path): - return - for file_name in os.listdir(artifact_path): - if file_name.endswith(suffix): - os.remove(os.path.join(artifact_path, file_name)) - - @pytest.mark.BAT - @pytest.mark.test_case_id("C6308161") - def test_tool_stability_entity_outliner(self, request, editor, level): - expected_lines = [ - "New entity created: True", - "Entity Id is valid: True", - "Entity name populated in Entity Inspector: True", - "Entity creation undone: True", - "Entity appeared after redo: True", - "New layer created: True", - "Layer name populated in Entity Inspector: True", - "Slice created successfully: True", - "Instantiated slice populated in Entity Inspector: True", - ] - - unexpected_lines = [ - "New entity created: False", - "Entity Id is valid: False", - "Entity name populated in Entity Inspector: False", - "Entity creation undone: False", - "Entity appeared after redo: False", - "New layer created: False", - "Layer name populated in Entity Inspector: False", - "Slice created successfully: False", - "Instantiated slice populated in Entity Inspector: False", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "tool_stability_entity_outliner.py", - expected_lines, - unexpected_lines=unexpected_lines, - auto_test_mode=False, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/Tests/editor/test_tool_stability_viewport_camera_selector.py b/Tests/editor/test_tool_stability_viewport_camera_selector.py deleted file mode 100755 index 7559e9b540..0000000000 --- a/Tests/editor/test_tool_stability_viewport_camera_selector.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - - -C6308168: Tool Stability & Workflow: Viewport Camera Selector -https://testrail.agscollab.com/index.php?/cases/view/6308168 -""" - -import logging -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestToolStabilityViewportCameraSelector(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C6308168", "C988098") - def test_tool_stability_viewport_camera_selector(self, request, editor, level): - expected_lines = ["Viewport Camera Selector is closed"] - - unexpected_lines = [ - "Entity Camera1 with Camera component is not created", - "Entity Camera2 with Camera component is not created", - "Entity do not have a Camera component", - "Camera1 not found in Camera View Selctor", - "Camera2 not found in Camera View Selctor", - "View position incorrect for Camera 1", - "View position incorrect for Camera 2", - ] - - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "tool_stability_viewport_camera_selector.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - timeout=log_monitor_timeout, - ) \ No newline at end of file diff --git a/Tests/editor/test_tools_menu_options.py b/Tests/editor/test_tools_menu_options.py deleted file mode 100755 index d97a59e54f..0000000000 --- a/Tests/editor/test_tools_menu_options.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1564077: The Tools menu options function normally - New view interaction Model enabled -https://testrail.agscollab.com/index.php?/cases/view/1564077 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system -import ly_test_tools.environment.process_utils as process_utils - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 80 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -class TestToolsMenu(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - process_utils.kill_processes_named('LuaIDE', True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - expected_lines = [ - "Animation Editor (PREVIEW) Action triggered", - "Asset Browser Action triggered", - "Asset Editor Action triggered", - "Console Action triggered", - "Entity Inspector Action triggered", - "ImGui Editor Action triggered", - "Landscape Canvas Action triggered", - "Level Inspector Action triggered", - "Lua Editor Action triggered", - "Material Editor Action triggered", - "Particle Editor Action triggered", - "PhysX Configuration (PREVIEW) Action triggered", - "Script Canvas Action triggered", - "Slice Relationship View (PREVIEW) Action triggered", - "Track View Action triggered", - "UI Editor Action triggered", - "Vegetation Editor Action triggered", - "Audio Controls Editor Action triggered", - "Console Variables Action triggered", - "Lens Flare Editor Action triggered", - "Measurement System Tool Action triggered", - "Python Console Action triggered", - "Python Scripts Action triggered", - "Slice Favorites Action triggered", - "Sun Trajectory Tool Action triggered", - "Terrain Texture Layers Action triggered", - "Time Of Day Action triggered", - "Substance Editor Action triggered", - "Viewport Camera Selector Action triggered", - ] - - @pytest.mark.test_case_id("C1564077") - def test_tools_menu_options(self, request, editor, level): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "tools_menu_after_interaction_model_toggle.py", - self.expected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) - - \ No newline at end of file diff --git a/Tests/editor/test_unsaved_changes_popup.py b/Tests/editor/test_unsaved_changes_popup.py deleted file mode 100755 index fd638a5f88..0000000000 --- a/Tests/editor/test_unsaved_changes_popup.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C1506899: Unsaved Changes Pop-Up -https://testrail.agscollab.com/index.php?/cases/view/1506899 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from Tests.ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") - - -@pytest.mark.parametrize("platform", ["win_x64_vs2017"]) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("project", ["SamplesProject"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("level", ["tmp_level"]) -class TestUnsavedChangesPopup(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor, project, level): - def teardown(): - workspace = editor.workspace - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C1506899") - def test_unsaved_changes_popup(self, request, editor, level): - expected_lines = [ - "Message Box opened", - "'CANCEL' button working as expected: True", - "Asset Editor is visible after clicking YES: True", - "'YES' button working as expected", - "Asset Editor is not visible after clicking NO: True", - "'NO' button working as expected", - "Asset Editor closed: True", - ] - - unexpected_lines = [ - "'CANCEL' button working as expected: False", - "Asset Editor is visible after clicking YES: False", - "Asset Editor is not visible after clicking NO: False", - "Asset Editor closed: False", - ] - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "unsaved_changes_popup.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False # Need this so that the modal dialogs don't get dismissed automatically - ) diff --git a/Tests/editor/test_view_menu_options.py b/Tests/editor/test_view_menu_options.py deleted file mode 100755 index b66933af97..0000000000 --- a/Tests/editor/test_view_menu_options.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C16780807: The View menu options function normally - New view interaction Model enabled -https://testrail.agscollab.com/index.php?/cases/view/16780807 -""" - -import os -import pytest - -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip("ly_test_tools") - -from ..ly_shared import hydra_lytt_test_utils as hydra_utils -import ly_test_tools.environment.file_system as file_system - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 100 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -class TestViewMenu(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, project, level): - def teardown(): - # delete temp level - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - file_system.delete([os.path.join(workspace.paths.dev(), project, "Levels", level)], True, True) - - expected_lines = [ - "Center on Selection Action triggered", - "Show Quick Access Bar Action triggered", - "Default Layout Action triggered", - "User Legacy Layout Action triggered", - "Save Layout Action triggered", - "Restore Default Layout Action triggered", - "Wireframe Action triggered", - "Grid Settings Action triggered", - "Configure Layout Action triggered", - "Goto Coordinates Action triggered", - "Center on Selection Action triggered", - "Goto Location Action triggered", - "Remember Location Action triggered", - "Change Move Speed Action triggered", - "Switch Camera Action triggered", - "Show/Hide Helpers Action triggered", - "Refresh Style Action triggered", - ] - - @pytest.mark.test_case_id("C16780807") - def test_view_menu_options_interaction_model(self, request, editor, level): - hydra_utils.launch_and_validate_results( - request, - test_directory, - editor, - "view_menu_after_interaction_model_toggle.py", - self.expected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/Tests/samples/sanity_test.py b/Tests/samples/sanity_test.py index 01d2121e08..062bfeea63 100755 --- a/Tests/samples/sanity_test.py +++ b/Tests/samples/sanity_test.py @@ -40,7 +40,7 @@ class TestSanity: # TODO LY-109331 @pytest.mark.parametrize("platform", ["win_x64_vs2017", "win_x64_vs2019", "darwin_x64"]) @pytest.mark.parametrize("platform", ["win_x64_vs2017", "win_x64_vs2019"]) @pytest.mark.parametrize("configuration", ["profile"]) - @pytest.mark.parametrize("project", ["SamplesProject"]) + @pytest.mark.parametrize("project", ["AutomatedTesting"]) @pytest.mark.parametrize("spec", ["all"]) def test_Paths_DevPathExists_PathItsADirectory(self, legacy_workspace, platform, configuration, project, spec): # type: (WorkspaceManager, str, str, str, str) -> None diff --git a/Tools/3dsmax/plugins/CryExport16_64.dlu b/Tools/3dsmax/plugins/CryExport16_64.dlu deleted file mode 100644 index 9bc825ac54..0000000000 Binary files a/Tools/3dsmax/plugins/CryExport16_64.dlu and /dev/null differ diff --git a/Tools/3dsmax/plugins/CryExport16_64.pdb b/Tools/3dsmax/plugins/CryExport16_64.pdb deleted file mode 100644 index f8e1227486..0000000000 --- a/Tools/3dsmax/plugins/CryExport16_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12af868284907978494ea9e82004a4d11509aab1dc772b5a159614e26e6682b8 -size 10259456 diff --git a/Tools/3dsmax/plugins/CryExport17_64.dlu b/Tools/3dsmax/plugins/CryExport17_64.dlu deleted file mode 100644 index 9f7b9999b4..0000000000 Binary files a/Tools/3dsmax/plugins/CryExport17_64.dlu and /dev/null differ diff --git a/Tools/3dsmax/plugins/CryExport17_64.pdb b/Tools/3dsmax/plugins/CryExport17_64.pdb deleted file mode 100644 index 2c01d8fe1f..0000000000 --- a/Tools/3dsmax/plugins/CryExport17_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa7d1b5f34bf7b63a78d62cf7d59b24002fdfb4648182d76fe276347f7c20f32 -size 11930624 diff --git a/Tools/3dsmax/plugins/CryExport18_64.dlu b/Tools/3dsmax/plugins/CryExport18_64.dlu deleted file mode 100644 index fedf39692d..0000000000 Binary files a/Tools/3dsmax/plugins/CryExport18_64.dlu and /dev/null differ diff --git a/Tools/3dsmax/plugins/CryExport18_64.pdb b/Tools/3dsmax/plugins/CryExport18_64.pdb deleted file mode 100644 index 59dca2d97c..0000000000 --- a/Tools/3dsmax/plugins/CryExport18_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62a5feec5e47cb0b6a41e7c1d15a8a39f9c26f58100cee32b94d66c757fac71e -size 12004352 diff --git a/Tools/LauncherTestTools/run_local_launcher_test_android_startergame.bat b/Tools/LauncherTestTools/run_local_launcher_test_android_startergame.bat deleted file mode 100644 index 094c878620..0000000000 --- a/Tools/LauncherTestTools/run_local_launcher_test_android_startergame.bat +++ /dev/null @@ -1,18 +0,0 @@ -@echo off -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM -REM - -REM Provided as an example of how to run the Automated Launcher Test on a developer's local machine. -call ../../python/python.cmd run_launcher_tests_local_validation.py --dev-root-folder "../.." --project "StarterGame" -if %ERRORLEVEL% == 0 ( -call ../../python/python.cmd run_launcher_tests_android.py --project-json-path "../../StarterGame/project.json" --project-launcher-tests-folder "../../StarterGame/LauncherTests" -) \ No newline at end of file diff --git a/Tools/LauncherTestTools/run_local_launcher_test_ios_startergame.sh b/Tools/LauncherTestTools/run_local_launcher_test_ios_startergame.sh deleted file mode 100755 index 0679465299..0000000000 --- a/Tools/LauncherTestTools/run_local_launcher_test_ios_startergame.sh +++ /dev/null @@ -1,13 +0,0 @@ -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -# Provided as an example of how to run the Automated Launcher Test on a developer's local machine. -../../python/python.sh run_launcher_tests_local_validation.py --dev-root-folder "../.." --project "StarterGame" || exit -# Current known limitation on iOS, only one test at a time is supported, see run_launcher_tests_ios.py run_test -../../python/python.sh run_launcher_tests_ios.py --project-json-path "../../StarterGame/project.json" --project-launcher-tests-folder "../../StarterGame/LauncherTests" --test-names "progress" diff --git a/Tools/LauncherTestTools/run_local_launcher_test_win_samplesproject.bat b/Tools/LauncherTestTools/run_local_launcher_test_win_automatedtesting.bat similarity index 100% rename from Tools/LauncherTestTools/run_local_launcher_test_win_samplesproject.bat rename to Tools/LauncherTestTools/run_local_launcher_test_win_automatedtesting.bat diff --git a/Tools/LauncherTestTools/run_local_launcher_test_win_multiplayer.bat b/Tools/LauncherTestTools/run_local_launcher_test_win_multiplayer.bat deleted file mode 100644 index 0faea47b56..0000000000 --- a/Tools/LauncherTestTools/run_local_launcher_test_win_multiplayer.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM -REM - -REM Provided as an example of how to run the Automated Launcher Test on a developer's local machine. -../../python/python.cmd run_launcher_tests_win.py --project-json-path "../../MultiplayerSample/project.json" --project-launcher-tests-folder "../../MultiplayerSample/LauncherTests" \ No newline at end of file diff --git a/Tools/LauncherTestTools/run_local_launcher_test_win_startergame.bat b/Tools/LauncherTestTools/run_local_launcher_test_win_startergame.bat deleted file mode 100644 index 6989a2db65..0000000000 --- a/Tools/LauncherTestTools/run_local_launcher_test_win_startergame.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM -REM - -REM Provided as an example of how to run the Automated Launcher Test on a developer's local machine. -../../python/python.cmd run_launcher_tests_win.py --project-json-path "../../StarterGame/project.json" --project-launcher-tests-folder "../../StarterGame/LauncherTests" \ No newline at end of file diff --git a/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py b/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py index 806f634f1b..869cf6999b 100755 --- a/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py +++ b/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py @@ -118,7 +118,7 @@ class AbstractResourceLocator(object): def project(self): """ Return path to the project directory - ex. engine_root/dev/SamplesProject + ex. engine_root/dev/AutomatedTesting :return: path to /dev/Project """ return os.path.join(self.dev(), self._project) diff --git a/Tools/LyTestTools/ly_test_tools/lumberyard/asset_processor.py b/Tools/LyTestTools/ly_test_tools/lumberyard/asset_processor.py index 523c28bcf8..d79c00c70d 100755 --- a/Tools/LyTestTools/ly_test_tools/lumberyard/asset_processor.py +++ b/Tools/LyTestTools/ly_test_tools/lumberyard/asset_processor.py @@ -78,6 +78,8 @@ class AssetProcessor(object): self._control_connection = None self._function_name = None self._failed_log_root = None + self._temp_log_directory = None + self._temp_log_root = None self._disable_all_platforms = False self._enabled_platform_overrides = dict() @@ -96,7 +98,7 @@ class AssetProcessor(object): """ self.send_message("waitforidle") result = self.read_message(read_timeout=timeout) - assert result == "idle", "Couldn't get idle state from AP" + assert result == "idle" or not self.process_exists(), f"Couldn't get idle state from AP, message {result}" return True def next_idle(self): @@ -109,7 +111,7 @@ class AssetProcessor(object): """ self.send_message("signalidle") result = self.read_message() - assert result == "idle", "Couldn't get idle state from AP" + assert result == "idle" or not self.process_exists(), f"Couldn't get idle state from AP, message {result}" def send_quit(self): """ @@ -143,17 +145,17 @@ class AssetProcessor(object): def read_message(self, read_timeout=DEFAULT_TIMEOUT_SECONDS): """ - Read the next message from the AP Contorl socket. Must be running through gui_process/start method + Read the next message from the AP Control socket. Must be running through gui_process/start method """ if not self._ap_proc: logger.warning("Attempted to read message to AP but not currently running") - return + return "no_process" if not self._control_connection: self.connect_control() if not self._control_connection: - return + return "no_connection" self._control_connection.settimeout(read_timeout) try: @@ -163,6 +165,8 @@ class AssetProcessor(object): return result_message except IOError as e: logger.warning(f"Failed to read message from with error {e}") + return f"error_{e}" + def read_control_port(self): @@ -178,15 +182,18 @@ class AssetProcessor(object): start_time = time.time() read_port_timeout = 10 while (time.time() - start_time) < read_port_timeout: - log = APLogParser(self._workspace.paths.ap_gui_log()) - if len(log.runs): - try: - port = log.runs[-1][port_type] - if port: - logger.info(f"Read port type {port_type} : {port}") - return port - except: - pass + if not os.path.exists(self._workspace.paths.ap_gui_log()): + logger.debug(f"Log at {self._workspace.paths.ap_gui_log()} doesn't exist, sleeping") + else: + log = APLogParser(self._workspace.paths.ap_gui_log()) + if len(log.runs): + try: + port = log.runs[-1][port_type] + if port: + logger.info(f"Read port type {port_type} : {port}") + return port + except: + pass time.sleep(1) logger.warning(f"Failed to read port type {port_type}") return 0 @@ -201,8 +208,13 @@ class AssetProcessor(object): """ if not self._control_connection: control_timeout = 60 - return self.connect_socket("Control Connection", self.read_control_port, + try: + return self.connect_socket("Control Connection", self.read_control_port, set_port_method=self.set_control_connection, timeout=control_timeout) + except AssetProcessorError as e: + # We dont want a failure of our test socket connection to fail the entire test automatically. + logger.error(f"Failed to connect control socket with error {e}") + pass return True, None def using_temp_workspace(self): @@ -273,13 +285,13 @@ class AssetProcessor(object): wait_timeout = timeout try: - waiter.wait_for(lambda: not psutil.pid_exists(self.get_pid()), exc=AssetProcessorError, timeout=wait_timeout) + waiter.wait_for(lambda: not self.process_exists(), exc=AssetProcessorError, timeout=wait_timeout) except AssetProcessorError: logger.warning(f"Timeout attempting to quit asset processor after {wait_timeout} seconds, using terminate") self.terminate() - raise + pass - if psutil.pid_exists(self.get_pid()): + if self.process_exists(): logger.warning(f"Failed to stop process {self.get_pid()} after {wait_timeout} seconds, using terminate") self.terminate() self._ap_proc = None @@ -323,9 +335,9 @@ class AssetProcessor(object): """ Returns pid of asset processor proc currently executing the start command (Ap Gui) - :return: pid if exists, else 0 + :return: pid if exists, else -1 """ - return self._ap_proc.pid if self._ap_proc else 0 + return self._ap_proc.pid if self._ap_proc else -1 def get_process_list(self, name_filter: str = None): """ @@ -334,12 +346,13 @@ class AssetProcessor(object): :param name_filter: Name to match against, such as AssetBuilder :return: List of processes """ - if not self._ap_proc or not self.get_pid(): + my_pid = self.get_pid() + if my_pid is -1: return [] return_list = [] try: - return_list = [psutil.Process(self.get_pid())] - return_list.extend(utils.child_process_list(self.get_pid())) + return_list = [psutil.Process(my_pid)] + return_list.extend(utils.child_process_list(my_pid)) except psutil.NoSuchProcess: logger.warning("Process already finished calling get_process_list") return return_list @@ -400,9 +413,9 @@ class AssetProcessor(object): def process_exists(self): try: my_pid = self.get_pid() - if my_pid == 0: + if my_pid == -1: return False - return psutil.pid_exists(self.get_pid()) + return psutil.pid_exists(my_pid) except psutil.NoSuchProcess: pass return False @@ -410,6 +423,7 @@ class AssetProcessor(object): def batch_process(self, timeout=DEFAULT_TIMEOUT_SECONDS, fastscan=True, capture_output=False, platforms=None, extra_params=None, add_gem_scan_folders=None, add_config_scan_folders=None, decode=True, expect_failure=False, scan_folder_pattern=None): + self.create_temp_log_root() ap_path = self._workspace.paths.asset_processor_batch() command = self.build_ap_command(ap_path=ap_path, fastscan=fastscan, platforms=platforms, extra_params=extra_params, add_gem_scan_folders=add_gem_scan_folders, @@ -454,6 +468,7 @@ class AssetProcessor(object): else: extra_gui_params.append(extra_params) + self.create_temp_log_root() command = self.build_ap_command(ap_path=ap_path, fastscan=fastscan, platforms=platforms, extra_params=extra_gui_params, add_gem_scan_folders=add_gem_scan_folders, add_config_scan_folders=add_config_scan_folders, @@ -480,7 +495,7 @@ class AssetProcessor(object): self.connect_listen() if quitonidle: - waiter.wait_for(lambda: not psutil.pid_exists(self.get_pid()), timeout=timeout) + waiter.wait_for(lambda: not self.process_exists(), timeout=timeout) elif run_until_idle and accept_input: if not self.wait_for_idle(): return False, None @@ -519,15 +534,17 @@ class AssetProcessor(object): command.append(f'--regset="/Amazon/AzCore/Bootstrap/project_path={self._project_path}"') # When using a scratch workspace we will set several options. The asset root controls where our - # cache lives, gives us a unique directory to place our logs in, and indicates we wish to randomize our + # cache lives. + # The logDir gives us a unique directory to place our logs in, and indicates we wish to randomize our # listening port to avoid collisions. The port will be written to the logs which we'll retrieve it from if self._temp_asset_root: command.append("--assetroot") command.append(f"{self._temp_asset_root}") - command.append("--logDir") - command.append(f"{self._temp_asset_root}") command.append(f'--regset="/Amazon/AzCore/Bootstrap/project_cache_path={self.temp_project_cache_path()}"') command.append("--randomListeningPort") + if self._temp_log_root: + command.append("--logDir") + command.append(f"{self._temp_log_root}") if self._override_scan_folders: command.append("--scanfolders") command.append(f"{','.join(self._override_scan_folders)}") @@ -699,11 +716,29 @@ class AssetProcessor(object): self._temp_asset_directory = tempfile.TemporaryDirectory() self._temp_asset_root = self._temp_asset_directory.name self._copy_asset_root_files() - self._workspace.paths.set_ap_log_root(self._temp_asset_root) self._project_path = os.path.join(self._temp_asset_root, self._workspace.project) if project_scan_folder: self.add_scan_folder(self._project_path) + def log_root(self): + """ + Return the temp log root + """ + return self._temp_log_root + + def create_temp_log_root(self): + """ + Create a temp folder for logs. We want a unique temp folder for logs for each test using the AssetProcessor + test class rather than using the default logs folder which could contain any old data or be used by other + runs of asset processor. + """ + if self._temp_log_root: + logger.info(f'Cleaning up old log root at {self._temp_log_root}') + shutil.rmtree(self._temp_log_root, True) + self._temp_log_directory = tempfile.TemporaryDirectory() + self._temp_log_root = self._temp_log_directory.name + self._workspace.paths.set_ap_log_root(self._temp_log_root) + def add_scan_folder(self, folder_name) -> str: """ Add a new folder as one of the default folders which AP Batch should scan on the next run diff --git a/Tools/LyTestTools/tests/example/test_system_example.py b/Tools/LyTestTools/tests/example/test_system_example.py index f2510a020b..0016d2a7a8 100755 --- a/Tools/LyTestTools/tests/example/test_system_example.py +++ b/Tools/LyTestTools/tests/example/test_system_example.py @@ -51,7 +51,7 @@ def remote_console(request): # Shared parameters & fixtures for all test methods inside the TestSystemExample class. @pytest.mark.usefixtures("automatic_process_killer") -@pytest.mark.parametrize('project', ['SamplesProject']) +@pytest.mark.parametrize('project', ['AutomatedTesting']) class TestSystemExample(object): """ Example test case class to hold a set of test case methods. @@ -68,11 +68,11 @@ class TestSystemExample(object): @pytest.mark.parametrize('level', ['simple_jacklocomotion']) @pytest.mark.parametrize('load_wait', [120]) @pytest.mark.test_case_id('C16806863') - def test_SystemTestExample_AllSupportedPlatforms_LaunchSamplesProject( + def test_SystemTestExample_AllSupportedPlatforms_LaunchAutomatedTesting( # launcher_platform, asset_processor_platform, # Re-add these here if you plan to use them. self, launcher, remote_console, level, load_wait): """ - Tests launching the SamplesProject then launches the Lumberyard client & + Tests launching the AutomatedTesting then launches the Lumberyard client & loads the "simple_jacklocomotion" level using the remote console. Assumes the user already setup & built their machine for the test. """ diff --git a/Tools/LyTestTools/tests/unit/test_artifact_manager.py b/Tools/LyTestTools/tests/unit/test_artifact_manager.py index fdb8407bc1..cc4ee8d285 100755 --- a/Tools/LyTestTools/tests/unit/test_artifact_manager.py +++ b/Tools/LyTestTools/tests/unit/test_artifact_manager.py @@ -22,7 +22,6 @@ import pytest import ly_test_tools._internal.managers.artifact_manager -pytestmark = pytest.mark.SUITE_smoke TIMESTAMP_FORMAT = '%Y-%m-%dT%H-%M-%S-%f' DATE = datetime.datetime.now().strftime(TIMESTAMP_FORMAT) diff --git a/Tools/LyTestTools/tests/unit/test_asset_processor.py b/Tools/LyTestTools/tests/unit/test_asset_processor.py index d59b0412ab..b7c1493fed 100755 --- a/Tools/LyTestTools/tests/unit/test_asset_processor.py +++ b/Tools/LyTestTools/tests/unit/test_asset_processor.py @@ -61,6 +61,7 @@ class TestAssetProcessor(object): assert under_test._ap_proc is not None mock_popen.assert_called_once_with([mock_ap_path, '--zeroAnalysisMode', '--regset="/Amazon/AzCore/Bootstrap/project_path=AutomatedTesting"', + '--logDir', under_test.log_root(), '--acceptInput', '--platforms', 'bar'], cwd=os.path.dirname(mock_ap_path)) mock_connect.assert_called() @@ -68,7 +69,8 @@ class TestAssetProcessor(object): @mock.patch('subprocess.Popen') @mock.patch('os.path.basename', mock.MagicMock(return_value="")) @mock.patch('os.path.dirname', mock.MagicMock(return_value="")) - @mock.patch('ly_test_tools.environment.process_utils.kill_processes_with_name_not_started_from', mock.MagicMock(return_value=None)) + @mock.patch('ly_test_tools.environment.process_utils.kill_processes_with_name_not_started_from', + mock.MagicMock(return_value=None)) @mock.patch('ly_test_tools.environment.process_utils.process_exists', mock.MagicMock(return_value=True)) @mock.patch('socket.socket.connect') def test_Start_ProcAlreadyRunning_ProcNotChanged(self, mock_connect, mock_popen, mock_workspace): @@ -101,7 +103,6 @@ class TestAssetProcessor(object): mock_waiter.assert_called_once() assert under_test._ap_proc is None - @mock.patch('ly_test_tools._internal.managers.workspace.AbstractWorkspaceManager') @mock.patch('subprocess.run') def test_BatchProcess_NoFastscanBatchCompletes_Success(self, mock_run, mock_workspace): @@ -112,7 +113,8 @@ class TestAssetProcessor(object): result, _ = under_test.batch_process(1, False) assert result - mock_run.assert_called_once_with([apb_path], close_fds=True, capture_output=False, + mock_run.assert_called_once_with([apb_path, '--logDir', under_test.log_root()], + close_fds=True, capture_output=False, timeout=1) @mock.patch('ly_test_tools._internal.managers.workspace.AbstractWorkspaceManager') @@ -126,9 +128,13 @@ class TestAssetProcessor(object): result = under_test.batch_process(1, True) assert result - mock_run.assert_called_once_with([apb_path, '--zeroAnalysisMode', '--regset="/Amazon/AzCore/Bootstrap/project_path=AutomatedTesting"'], - close_fds=True, capture_output=False, - timeout=1) + mock_run.assert_called_once_with( + [apb_path, '--zeroAnalysisMode', '--regset="/Amazon/AzCore/Bootstrap/project_path=AutomatedTesting"', + '--logDir', + under_test.log_root()], + + close_fds=True, capture_output=False, + timeout=1) @mock.patch('ly_test_tools._internal.managers.workspace.AbstractWorkspaceManager') @mock.patch('subprocess.run') @@ -141,8 +147,8 @@ class TestAssetProcessor(object): result, _ = under_test.batch_process(None, False) assert not result - mock_run.assert_called_once_with([apb_path], close_fds=True, capture_output=False, timeout=28800.0) - + mock_run.assert_called_once_with([apb_path, '--logDir', under_test.log_root()], + close_fds=True, capture_output=False, timeout=28800.0) @mock.patch('ly_test_tools._internal.managers.workspace.AbstractWorkspaceManager') def test_EnableAssetProcessorPlatform_AssetProcessorObject_Updated(self, mock_workspace): @@ -181,5 +187,3 @@ class TestAssetProcessor(object): mock_stop.assert_called() mock_restore_ap.assert_called() - - diff --git a/Tools/LyTestTools/tests/unit/test_fixtures.py b/Tools/LyTestTools/tests/unit/test_fixtures.py index 7223ed71da..d024ca8c04 100755 --- a/Tools/LyTestTools/tests/unit/test_fixtures.py +++ b/Tools/LyTestTools/tests/unit/test_fixtures.py @@ -138,9 +138,9 @@ class TestFixtures(object): @mock.patch("ly_test_tools.builtin.helpers.create_builtin_workspace") def test_Workspace_MockFixturesAndExecTeardown_ReturnWorkspaceRegisterTeardown(self, mock_create, mock_setup): test_module = 'example.tests.test_system_example' - test_class = ('TestSystemExample.test_SystemTestExample_AllSupportedPlatforms_LaunchSamplesProject' - '[120-simple_jacklocomotion-SamplesProject-all-profile-win_x64_vs2017]') - test_method = 'test_SystemTestExample_AllSupportedPlatforms_LaunchSamplesProject' + test_class = ('TestSystemExample.test_SystemTestExample_AllSupportedPlatforms_LaunchAutomatedTesting' + '[120-simple_jacklocomotion-AutomatedTesting-all-profile-win_x64_vs2017]') + test_method = 'test_SystemTestExample_AllSupportedPlatforms_LaunchAutomatedTesting' artifact_folder_name = 'TheArtifactFolder' artifact_path = "PathToArtifacts" @@ -183,7 +183,7 @@ class TestFixtures(object): mock_workspace.artifact_manager.generate_folder_name.assert_called_with( test_module.split('.')[-1], # 'example.tests.test_system_example' -> 'test_system_example' test_class.split('.')[0], # 'TestSystemExample.test_SystemTestExample_...' -> 'TestSystemExample' - test_method # 'test_SystemTestExample_AllSupportedPlatforms_LaunchSamplesProject' + test_method # 'test_SystemTestExample_AllSupportedPlatforms_LaunchAutomatedTesting' ) @mock.patch('os.path.exists', mock.MagicMock(return_value=True)) diff --git a/Tools/RemoteConsole/RemoteConsole.exe b/Tools/RemoteConsole/RemoteConsole.exe deleted file mode 100644 index f7d390e491..0000000000 --- a/Tools/RemoteConsole/RemoteConsole.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22384a5b5ce513704462873caeeb7dadf021a24151a30a575b2fdbc0cd5fda4f -size 859136 diff --git a/Tools/RemoteConsole/filters.xml b/Tools/RemoteConsole/filters.xml deleted file mode 100644 index d3e4c2ab41..0000000000 --- a/Tools/RemoteConsole/filters.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - #000088 - \!(\w*)\] - - - - - - FF8C00 - - - - - - #000000 - - - - - - - - #000000 - - - - - #000000 - - - - - #000000 - - - - - #000000 - - - diff --git a/Tools/RemoteConsole/params.xml b/Tools/RemoteConsole/params.xml deleted file mode 100644 index 4a46093ff1..0000000000 --- a/Tools/RemoteConsole/params.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - r_displayInfo=1 - profile=1 - - - - r_displayInfo=0 - profile=0 - - - - sys_pakloginvalidFileAccess 0 - - - - r_getscreenshot 2 - - - - sv_timeofdayenabled 1 - - - - - - - - - r_displayinfo 0 - /g_cheats 1 - /g_godMode 1 - r_colorgradingchartimage 'chr' textures/colorcharts/kosovo2.dds - r_ColorGradingCharts 2 - - - r_displayinfo 0 - /g_cheats 1 - /g_godMode 1 - r_colorgradingchartimage 'chr' textures/colorcharts/default_char_l2_cch.tif - r_colorgradingchartimage 'env' textures/colorcharts/default_env_cch.tif - - - - r_colorgradingchartimage 'chr' - r_colorgradingchartimage 'env' - - - - r_ColorGradingMultiTarget 1 - - - - r_ColorGradingMultiTarget 0 - - - - r_autogenMips 1 - - - - r_autogenMips 0 - - - - - - - - - i_grammar_enable archers 0 - - - - i_debugdigitalButtons 127 - - - - - - - - - - SetViewMode:0 - - - SetViewMode:1 - - - SetViewMode:2 - - - GotoTagPoint:0 - - - - - - - - - map airfield - - - map forest - - - - - - - - - > - r_getscreenshot 2 - - > - RecordClip - - - - - - - - - log_verbosity # - - - t_scale # - - - cl_fov # - - - r_width # - - - r_height # - - - e_TimeOfDay # - - - i_debugdigitalButtons # - - - - - - r_colorgradingmultitarget # - - - r_colorgradingcharts # - - - r_displayInfo # - - - profile # - - - e_ShadowsCascadesDebug # - - - r_ShadowsStaticMap # - - - - - - \ No newline at end of file diff --git a/Tools/build/JenkinsScripts/build/Platform/Android/build_and_run_unit_tests.cmd b/Tools/build/JenkinsScripts/build/Platform/Android/build_and_run_unit_tests.cmd new file mode 100644 index 0000000000..4b57adac94 --- /dev/null +++ b/Tools/build/JenkinsScripts/build/Platform/Android/build_and_run_unit_tests.cmd @@ -0,0 +1,44 @@ +@ECHO OFF +REM +REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +REM its licensors. +REM +REM For complete copyright and license terms please see the LICENSE at the root of this +REM distribution (the "License"). All use of this software is governed by the License, +REM or, if provided, by the license below or the license accompanying this file. Do not +REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM + +SETLOCAL EnableDelayedExpansion + +CALL %~dp0gradle_windows.cmd +IF NOT %ERRORLEVEL%==0 GOTO :error + +IF NOT EXIST "%LY_3RDPARTY_PATH%" ( + ECHO [ci_build] LY_3RDPARTY_PATH is invalid or not set + GOTO :error +) + +IF NOT EXIST "%LY_ANDROID_SDK%" ( + SET LY_ANDROID_SDK=!LY_3RDPARTY_PATH!/android-sdk/platform-29 +) +IF NOT EXIST "%LY_ANDROID_SDK%" ( + ECHO [ci_build] FAIL: LY_ANDROID_SDK=!LY_ANDROID_SDK! + GOTO :error +) + +SET PYTHON=python\python.cmd +ECHO [ci_build] %PYTHON% Tools\build\JenkinsScripts\build\Platform\Android\run_test_on_android_simulator.py --android-sdk-path %LY_ANDROID_SDK% --build-path %OUTPUT_DIRECTORY% --build-config %CONFIGURATION% +CALL %PYTHON% Tools\build\JenkinsScripts\build\Platform\Android\run_test_on_android_simulator.py --android-sdk-path %LY_ANDROID_SDK% --build-path %OUTPUT_DIRECTORY% --build-config %CONFIGURATION% +IF NOT %ERRORLEVEL%==0 GOTO :popd_error + +EXIT /b 0 + +:popd_error +POPD + +:error +ECHO ERROR + +EXIT /b 1 diff --git a/Tools/build/JenkinsScripts/build/Platform/Android/build_config.json b/Tools/build/JenkinsScripts/build/Platform/Android/build_config.json index e4f86aea17..1847d8ea54 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Android/build_config.json +++ b/Tools/build/JenkinsScripts/build/Platform/Android/build_config.json @@ -141,7 +141,28 @@ "OUTPUT_DIRECTORY":"build\\android_gradle", "GAME_PROJECT": "AutomatedTesting", "ANDROID_NDK_PLATFORM": "21", - "ANDROID_SDK_PLATFORM": "29" + "ANDROID_SDK_PLATFORM": "29", + "SIGN_APK": "false", + "GRADLE_BUILD_CMD": "build", + "ADDITIONAL_GENERATE_ARGS": "" + } + }, + "periodic_test_profile": { + "TAGS":[ + "nightly", + "weekly-build-metrics" + ], + "COMMAND":"build_and_run_unit_tests.cmd", + "PARAMETERS": { + "CONFIGURATION":"profile", + "OUTPUT_DIRECTORY":"build\\android_unittest", + "GAME_PROJECT": "AutomatedTesting", + "ANDROID_NDK_PLATFORM": "21", + "ANDROID_SDK_PLATFORM": "29", + "SIGN_APK": "true", + "GRADLE_BUILD_CMD": "assemble", + "ADDITIONAL_GENERATE_ARGS": "--unit-test" } } + } diff --git a/Tools/build/JenkinsScripts/build/Platform/Android/gradle_windows.cmd b/Tools/build/JenkinsScripts/build/Platform/Android/gradle_windows.cmd index 4faff41bb2..b0869480a1 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Android/gradle_windows.cmd +++ b/Tools/build/JenkinsScripts/build/Platform/Android/gradle_windows.cmd @@ -10,6 +10,8 @@ REM remove or modify any license notices. This file is distributed on an "AS IS" REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. REM +SETLOCAL EnableDelayedExpansion + IF NOT EXIST "%LY_3RDPARTY_PATH%" ( ECHO [ci_build] LY_3RDPARTY_PATH is invalid or not set GOTO :error @@ -40,19 +42,27 @@ IF NOT EXIST "%LY_NINJA_PATH%" ( GOTO :error ) +REM Make sure that Ninja in the Path variable +ECHO Testing ninja on the current path variable +call ninja --version +IF %ERRORLEVEL%==0 GOTO ninja_on_path +ECHO Ninja wasnt in the call path, add the value set by LY_NINJA_PATH +SET PATH=%PATH%;%LY_NINJA_PATH% + +:ninja_on_path IF NOT EXIST "%LY_ANDROID_SDK%" ( - SET LY_ANDROID_SDK=%LY_3RDPARTY_PATH%/android-sdk/platform-29 + SET LY_ANDROID_SDK=!LY_3RDPARTY_PATH!/android-sdk/platform-29 ) IF NOT EXIST "%LY_ANDROID_SDK%" ( - ECHO [ci_build] FAIL: LY_ANDROID_SDK=%LY_ANDROID_SDK% + ECHO [ci_build] FAIL: LY_ANDROID_SDK=!LY_ANDROID_SDK! GOTO :error ) IF NOT EXIST "%LY_ANDROID_NDK%" ( - set LY_ANDROID_NDK=%LY_3RDPARTY_PATH%/android-ndk/r21d + set LY_ANDROID_NDK=!LY_3RDPARTY_PATH!/android-ndk/r21d ) IF NOT EXIST "%LY_ANDROID_NDK%" ( - ECHO [ci_build] LY_ANDROID_NDK=%LY_ANDROID_NDK% + ECHO [ci_build] LY_ANDROID_NDK=!LY_ANDROID_NDK! GOTO :error ) @@ -61,7 +71,7 @@ IF "%CLEAN_OUTPUT_DIRECTORY%"=="true" ( IF EXIST %OUTPUT_DIRECTORY% ( ECHO [ci_build] CLEAN_OUTPUT_DIRECTORY option set with value "%CLEAN_OUTPUT_DIRECTORY%" ECHO [ci_build] Deleting "%OUTPUT_DIRECTORY%" - DEL /s /q /f %OUTPUT_DIRECTORY% + DEL /s /q /f %OUTPUT_DIRECTORY% 1>nul ) ) @@ -73,27 +83,134 @@ REM Jenkins reports MSB8029 when TMP/TEMP is not defined, define a dummy folder SET TMP=%cd%/temp SET TEMP=%cd%/temp IF NOT EXIST %TMP% ( - mkdir temp + mkdir %TMP% +) + +REM Optionally sign the APK if we are generating an APK +SET GENERATE_SIGNED_APK=false +IF "%SIGN_APK%"=="true" ( + IF "%GRADLE_BUILD_CMD%"=="assemble" ( + SET GENERATE_SIGNED_APK=true + ) ) + SET PYTHON=python\python.cmd -ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --project-path=%GAME_PROJECT% --engine-root=. --build-dir=%OUTPUT_DIRECTORY% --gradle-install-path=%GRADLE_HOME% --cmake-install-path=%CMAKE_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --android-ndk-path=%LY_ANDROID_NDK% --android-sdk-path=%LY_ANDROID_SDK% --android-ndk-version=%ANDROID_NDK_PLATFORM% --android-sdk-version=%ANDROID_SDK_PLATFORM% -CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --project-path="%GAME_PROJECT%" --engine-root=. --build-dir="%OUTPUT_DIRECTORY%" --gradle-install-path="%GRADLE_HOME%" --cmake-install-path="%CMAKE_HOME%" --ninja-install-path="%LY_NINJA_PATH%" --third-party-path="%LY_3RDPARTY_PATH%" --android-ndk-path="%LY_ANDROID_NDK%" --android-sdk-path="%LY_ANDROID_SDK%" --android-ndk-version=%ANDROID_NDK_PLATFORM% --android-sdk-version=%ANDROID_SDK_PLATFORM% -IF NOT %ERRORLEVEL%==0 GOTO :error +REM Regardless of whether or not we generate a signing key, apparently we must set variables outside of +REM an IF clause otherwise it will not work. + +REM First look for the JDK HOME in the environment variable +IF EXIST "%JDK_HOME%" ( + ECHO JDK Home found in Environment: !JDK_HOME! + GOTO JDK_FOUND +) + +REM Next, look in the registry +FOR /F "skip=2 tokens=1,2*" %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8" /v "JavaHome" 2^>nul') DO ( + SET JDK_REG_VALUE=%%C +) +IF EXIST "%JDK_REG_VALUE%" ( + SET JDK_HOME=!JDK_REG_VALUE! + ECHO JDK Home found in registry: !JDK_HOME! + GOTO JDK_FOUND +) + +ECHO Unable to locate JDK_HOME +GOTO error + +:JDK_FOUND + +SET JDK_BIN=%JDK_HOME%\bin +IF NOT EXIST "%JDK_BIN%" ( + ECHO The environment variable JDK_HOME is not set to a valid JDK 1.8 folder %JDK_BIN% + ECHO Make sure the variable is set to your local JDK 1.8 installation + GOTO error +) + +SET KEYTOOL_PATH=%JDK_BIN%\keytool.exe +IF NOT EXIST "%KEYTOOL_PATH%" ( + ECHO The environment variable JDK_HOME is not set to a valid JDK 1.8 folder. Cannot find keytool at %JDK_BIN%\keytool.exe + ECHO Make sure the variable is set to your local JDK 1.8 installation + GOTO error +) + +SET CI_ANDROID_KEYSTORE_FILE=ly-android-dev.keystore +SET CI_ANDROID_KEYSTORE_ALIAS=ly-android +SET CI_ANDROID_KEYSTORE_PASSWORD=lumberyard +SET CI_ANDROID_KEYSTORE_DN=cn=LY Developer, ou=Lumberyard, o=Amazon, c=US +SET CI_KEYSTORE_VALIDITY_DAYS=10000 +SET CI_KEYSTORE_CERT_DN=cn=LY Developer, ou=Lumberyard, o=Amazon, c=US + +REM Clear out any existing keystore file since the password/alias may have changed +SET CI_ANDROID_KEYSTORE_FILE_ABS=%cd%\%OUTPUT_DIRECTORY%\%CI_ANDROID_KEYSTORE_FILE% + + +IF "%GENERATE_SIGNED_APK%"=="true" ( + + REM Prepare a temporary keystore just for this unit test session + + REM Generate the keystore file if needed + IF NOT EXIST "%CI_ANDROID_KEYSTORE_FILE_ABS%" ( + + ECHO [ci_build] Generating keystore file %CI_ANDROID_KEYSTORE_FILE% + ECHO [ci_build] "%KEYTOOL_PATH%" -genkeypair -v -keystore %CI_ANDROID_KEYSTORE_FILE_ABS% -storepass %CI_ANDROID_KEYSTORE_PASSWORD% -alias %CI_ANDROID_KEYSTORE_ALIAS% -keypass %CI_ANDROID_KEYSTORE_PASSWORD% -keyalg RSA -keysize 2048 -validity %CI_KEYSTORE_VALIDITY_DAYS% -dname "%CI_KEYSTORE_CERT_DN%" + CALL "%KEYTOOL_PATH%" -genkeypair -v -keystore %CI_ANDROID_KEYSTORE_FILE_ABS% -storepass %CI_ANDROID_KEYSTORE_PASSWORD% -alias %CI_ANDROID_KEYSTORE_ALIAS% -keypass %CI_ANDROID_KEYSTORE_PASSWORD% -keyalg RSA -keysize 2048 -validity %CI_KEYSTORE_VALIDITY_DAYS% -dname "%CI_KEYSTORE_CERT_DN%" 2> nul + IF errorlevel 1 ( + ECHO Unable to generate keystore file "%CI_ANDROID_KEYSTORE_FILE_ABS%" + GOTO error + ) + ) ELSE ( + ECHO Using keystore file at %CI_ANDROID_KEYSTORE_FILE_ABS% + ) + + ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_HOME% --cmake-install-path=%CMAKE_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --android-ndk-path=%LY_ANDROID_NDK% --android-sdk-path=%LY_ANDROID_SDK% --android-ndk-version=%ANDROID_NDK_PLATFORM% --android-sdk-version=%ANDROID_SDK_PLATFORM% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %OPTIONAL_TEST_FLAG% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing + CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_HOME% --cmake-install-path=%CMAKE_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --android-ndk-path=%LY_ANDROID_NDK% --android-sdk-path=%LY_ANDROID_SDK% --android-ndk-version=%ANDROID_NDK_PLATFORM% --android-sdk-version=%ANDROID_SDK_PLATFORM% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing +) ELSE ( + ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_HOME% --cmake-install-path=%CMAKE_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --android-ndk-path=%LY_ANDROID_NDK% --android-sdk-path=%LY_ANDROID_SDK% --android-ndk-version=%ANDROID_NDK_PLATFORM% --android-sdk-version=%ANDROID_SDK_PLATFORM% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing + CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_HOME% --cmake-install-path=%CMAKE_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --android-ndk-path=%LY_ANDROID_NDK% --android-sdk-path=%LY_ANDROID_SDK% --android-ndk-version=%ANDROID_NDK_PLATFORM% --android-sdk-version=%ANDROID_SDK_PLATFORM% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing +) + +REM Validate the android project generation +IF %ERRORLEVEL%==0 GOTO generate_project_success +ECHO Error Generating Android Project +goto error + +:generate_project_success + +REM Run the gradle build from the output directory PUSHD %OUTPUT_DIRECTORY% REM Stop any running or orphaned gradle daemon ECHO [ci_build] gradlew --stop -gradlew --stop +CALL gradlew --stop + +ECHO [ci_build] gradlew --no-daemon %GRADLE_BUILD_CMD%%CONFIGURATION% +CALL gradlew --no-daemon %GRADLE_BUILD_CMD%%CONFIGURATION% + +IF %ERRORLEVEL%==0 GOTO gradle_build_success + +REM Do another build with the debug flag to try to get the failure reasons -ECHO [ci_build] gradlew --no-daemon -build%CONFIGURATION% -gradlew --no-daemon build%CONFIGURATION% -IF NOT %ERRORLEVEL%==0 GOTO :popd_error +GOTO error + +ECHO Error building gradle. Rebuilding with debug information +ECHO [ci_build] gradlew --debug --full-stacktrace --no-daemon %GRADLE_BUILD_CMD%%CONFIGURATION% +CALL gradlew --debug --full-stacktrace --no-daemon %GRADLE_BUILD_CMD%%CONFIGURATION% + +ECHO [ci_build] gradlew --stop +CALL gradlew --stop POPD +GOTO error + + +:gradle_build_success + ECHO [ci_build] gradlew --stop -gradlew --stop +CALL gradlew --stop + +POPD EXIT /b 0 @@ -102,7 +219,4 @@ POPD :error -ECHO [ci_build] gradlew --stop -gradlew --stop - EXIT /b 1 \ No newline at end of file diff --git a/Tools/build/JenkinsScripts/build/Platform/Android/pipeline.json b/Tools/build/JenkinsScripts/build/Platform/Android/pipeline.json index 4780fadad5..a4a2700af0 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Android/pipeline.json +++ b/Tools/build/JenkinsScripts/build/Platform/Android/pipeline.json @@ -1,7 +1,7 @@ { "ENV": { "GRADLE_HOME": "C:/Gradle/gradle-5.6.4", - "NODE_LABEL": "windows", + "NODE_LABEL": "windows-047e5cdf", "LY_3RDPARTY_PATH": "C:/ly/3rdParty", "TIMEOUT": 30, "WORKSPACE": "D:/workspace", @@ -10,6 +10,9 @@ "PIPELINE_ENV_OVERRIDE": { "daily-pipeline-metrics": { "CLEAN_WORKSPACE": true + }, + "packaging": { + "CLEAN_WORKSPACE": true } } } \ No newline at end of file diff --git a/Tools/build/JenkinsScripts/build/Platform/Android/run_test_on_android_simulator.py b/Tools/build/JenkinsScripts/build/Platform/Android/run_test_on_android_simulator.py new file mode 100644 index 0000000000..e81db00537 --- /dev/null +++ b/Tools/build/JenkinsScripts/build/Platform/Android/run_test_on_android_simulator.py @@ -0,0 +1,544 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import argparse +import os +import pathlib +import re +import sys +import subprocess +import time +import logging + +CURRENT_PATH = pathlib.Path(os.path.dirname(__file__)).absolute() + +ENGINE_ROOT = CURRENT_PATH.parent.parent.parent.parent.parent.parent + + +class AndroidEmuError(Exception): + pass + + +def get_android_sdk_path(): + try: + android_sdk_path = pathlib.Path(os.getenv('LY_ANDROID_SDK')) + if not android_sdk_path: + raise AndroidEmuError(f"LY_ANDROID_SDK environment variable is not set") + if not android_sdk_path.is_dir(): + raise AndroidEmuError(f"Android SDK Path ('{android_sdk_path}') set with the LY_ANDROID_SDK variable is invalid") + #TODO: Sanity check on necessary files + return android_sdk_path + except Exception as err: + raise AndroidEmuError(f"Unable to determine android SDK path: {err}") + + +class Command(object): + + def __init__(self, tool_name, tool_path, run_as_shell=True): + + if not tool_path.is_file(): + raise AndroidEmuError(f"Invalid path for {tool_name}. Cannot find ('{tool_path.absolute()}')") + + self.tool_path = tool_path + self.run_as_shell = run_as_shell + + def run_return_output(self, cmd_args): + + args = [str(self.tool_path)] + if isinstance(cmd_args, str): + args.append(cmd_args) + elif isinstance(cmd_args, list): + args.extend(cmd_args) + else: + assert False, "run_return_output argument must be a string or list of strings" + + full_cmd = subprocess.list2cmdline(args) + logging.debug(f"run_return_output: {full_cmd}") + + run_result = subprocess.run(args, + capture_output=True, + encoding='UTF-8', + errors='ignore', + shell=self.run_as_shell) + if run_result.returncode != 0: + raise AndroidEmuError(f"Error executing command '{full_cmd}' (return code {run_result.returncode}): {run_result.stderr}") + + return run_result.stdout + + def run(self, cmd_args, cwd=None, suppress_output=False): + args = [str(self.tool_path)] + if isinstance(cmd_args, str): + args.append(cmd_args) + elif isinstance(cmd_args, list): + args.extend(cmd_args) + else: + assert False, "run_return_output argument must be a string or list of strings" + + full_cmd = subprocess.list2cmdline(args) + logging.debug(f"run: {full_cmd}") + + run_result = subprocess.run(args, + #stdout=subprocess.DEVNULL if suppress_output else subprocess.STDOUT, + capture_output=False, + shell=self.run_as_shell, + cwd=cwd) + if run_result.returncode != 0: + raise AndroidEmuError(f"Error executing command '{full_cmd}' (return code {run_result.returncode}): {run_result.stderr}") + + def run_process(self, cmd_args): + args = [str(self.tool_path)] + if isinstance(cmd_args, str): + args.append(cmd_args) + elif isinstance(cmd_args, list): + args.extend(cmd_args) + else: + assert False, "run_return_output argument must be a string or list of strings" + + full_cmd = subprocess.list2cmdline(args) + logging.debug(f"run_process: {full_cmd}") + + process = subprocess.Popen(args, + shell=True, + stdout=subprocess.PIPE, + creationflags=subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.NORMAL_PRIORITY_CLASS | + subprocess.CREATE_NO_WINDOW, + encoding='UTF-8', + errors='ignore') + return process + + +class AndroidEmulatorManager(object): + + UNIT_TEST_AVD_NAME = "LY_UNITTEST_AVD" + + UNIT_TEST_SYSTEM_IMAGE_PACKAGE = "android-30;google_apis;x86_64" + + UNIT_TEST_DEVICE_TEMPLATE_NAME = "pixel_xl" + + UNIT_TEST_DEVICE_SETTINGS_MAP = { + "disk.dataPartition.size": "32G", + "vm.heapSize": "1024", + "hw.ramSize": "2048", + "hw.sdCard": "no" + } + EMULATOR_STARTUP_TIMEOUT_SECS = 60*5 # Set the emulator startup timeout to 5 minutes + + def __init__(self, base_android_sdk_path, hide_emulator_windows=True, force_avd_creation=False, emulator_startup_timeout=EMULATOR_STARTUP_TIMEOUT_SECS): + + self.android_sdk_path = base_android_sdk_path + + self.force_avd_creation = force_avd_creation + + self.unit_test_avd_name = AndroidEmulatorManager.UNIT_TEST_AVD_NAME + self.unit_test_device_template_name = AndroidEmulatorManager.UNIT_TEST_DEVICE_TEMPLATE_NAME + self.unit_test_device_settings_map = AndroidEmulatorManager.UNIT_TEST_DEVICE_SETTINGS_MAP + self.unit_test_avd_system_image = AndroidEmulatorManager.UNIT_TEST_SYSTEM_IMAGE_PACKAGE + self.hide_emulator_windows = hide_emulator_windows + + self.emulator_startup_timeout = emulator_startup_timeout + self.emulator_cmd = Command("Emulator", self.android_sdk_path / 'emulator' / 'emulator.exe') + + self.avd_manager_cmd = Command("AVD Manager", self.android_sdk_path / 'tools' / 'bin' / 'avdmanager.bat') + + self.sdk_manager_cmd = Command("SDK Manager", self.android_sdk_path / 'tools' / 'bin' / 'sdkmanager.bat') + + self.adb_cmd = Command("ADB", self.android_sdk_path / 'platform-tools' / 'adb.exe') + + def collect_android_sdk_list(self): + """ + Use the SDK Manager to get the list of installed, available, and updateable packages + :return: tuple of 3 lists: installed, available, and updateable packages + """ + + result_str = self.sdk_manager_cmd.run_return_output(['--list']) + + # the result will be listed out in 3 sections: Installed packages, Available Packages, and Available updates + # and each item is represented by 3 columns separated by a '|' character + installed_packages = [] + available_packages = [] + available_updates = [] + + current_append_list = None + for avd_item in result_str.split('\n'): + avd_item_stripped = avd_item.strip() + if not avd_item_stripped: + continue + if '|' not in avd_item_stripped: + if avd_item_stripped.upper() == 'INSTALLED PACKAGES:': + current_append_list = installed_packages + elif avd_item_stripped.upper() == 'AVAILABLE PACKAGES:': + current_append_list = available_packages + elif avd_item_stripped.upper() == 'AVAILABLE UPDATES:': + current_append_list = available_updates + else: + current_append_list = None + continue + item_parts = [split.strip() for split in avd_item_stripped.split('|')] + if len(item_parts) < 3: + continue + elif item_parts[1].upper() in ('VERSION', 'INSTALLED', '-------'): + continue + elif current_append_list is None: + continue + + if current_append_list is not None: + current_append_list.append(item_parts) + + return installed_packages, available_packages, available_updates + + def install_system_package_if_necessary(self): + """ + Make sure that we have the correct system image installed, and install if not + """ + + installed_packages, available_packages, _ = self.collect_android_sdk_list() + + unit_test_sdk_package_name = f'system-images;{self.unit_test_avd_system_image}' + detected_sdk_package_version = None + for package_line_items in installed_packages: + if package_line_items[0] == unit_test_sdk_package_name: + detected_sdk_package_version = package_line_items[0] + + if detected_sdk_package_version: + # Already installed + logging.info(f"Detected installed system image {self.unit_test_avd_system_image} version {detected_sdk_package_version}") + return + + # Make sure its an available image to install + detected_available_sdk_package_version = None + for package_line_items in available_packages: + if package_line_items[0] == unit_test_sdk_package_name: + detected_available_sdk_package_version = package_line_items[0] + if not detected_available_sdk_package_version: + raise AndroidEmuError(f"Unable to install required system image {self.unit_test_avd_system_image}, not found by the Android SDK Manager") + + # Install the package + logging.info(f"Installing system image {self.unit_test_avd_system_image}...") + self.sdk_manager_cmd.run(['--install', unit_test_sdk_package_name]) + logging.info(f"Installed Completed") + + def find_device_id_by_name(self, device_name): + """ + Find a device id (from AVD Manager) by the device name + :param device_name: Name to lookup + :return: The device id + """ + result_str = self.avd_manager_cmd.run_return_output(['list', 'device']) + result_lines = [result_line.strip() for result_line in result_str.split('\n')] + + result_line_count = len(result_lines) + current_index = 0 + + device_to_id_map = {} + + while current_index < result_line_count: + + current_line = result_lines[current_index] + current_index += 1 + + # This assumes the pattern "id: or "" + if current_line.startswith('id:') and 'or' in current_line: + id_and_name_combo = current_line.split('or') + id_and_value_combo = id_and_name_combo[0].split(' ') + name = id_and_name_combo[1].replace('"', '').strip().upper() + id = id_and_value_combo[1] + device_to_id_map[name] = id + + if current_line.startswith('Available Android targets:'): + break + + device_id = device_to_id_map.get(device_name.upper()) + if not device_id: + raise AndroidEmuError(f"Unable to locate device id for '{device_name}'") + return device_id + + def query_installed_avds(self): + """ + Get maps of all valid and invalid AVDs installed on the current system + :return: tuple of 2 maps (AVD Name -> Path): Valid and invalid + """ + result_str = self.avd_manager_cmd.run_return_output(['list', 'avd']) + result_lines = [result_line.strip() for result_line in result_str.split('\n')] + + line_count = len(result_lines) + current_index = 0 + current_name = None + current_path = None + + valid_avd_to_path_map = {} + invalid_avd_to_path_map = {} + current_avd_to_path_map = valid_avd_to_path_map + + while current_index < line_count: + current_line = result_lines[current_index] + current_index += 1 + + if current_line.startswith('Name:'): + name = current_line[6:].strip() + if current_name is not None: + current_avd_to_path_map[current_name] = current_path + current_path = None + current_name = name + + elif current_line.startswith('Path:'): + current_path = current_line[6:].strip() + elif current_line.startswith('Device:'): + pass + elif 'could not be loaded:' in current_line: + if current_name is not None: + current_avd_to_path_map[current_name] = current_path + current_avd_to_path_map = invalid_avd_to_path_map + current_path = None + current_name = None + + if current_name is not None: + current_avd_to_path_map[current_name] = current_path + + return valid_avd_to_path_map, invalid_avd_to_path_map + + def create_unitest_avd(self): + """Create the unit test AVD""" + + self.install_system_package_if_necessary() + + device_id = self.find_device_id_by_name(self.unit_test_device_template_name) + + self.avd_manager_cmd.run(['--silent', + 'create', 'avd', + '--name', self.unit_test_avd_name, + '--package', f'system-images;{self.unit_test_avd_system_image}', + '--device', device_id]) + + valid_avd_map, _ = self.query_installed_avds() + unit_test_avd_path = valid_avd_map.get(self.unit_test_avd_name) + if not unit_test_avd_path: + raise AndroidEmuError(f"Unable to create unit test AVD {self.unit_test_avd_name}") + + unit_test_avd_config_path = pathlib.Path(unit_test_avd_path) / 'config.ini' + if not unit_test_avd_config_path.is_file(): + raise AndroidEmuError(f"Unable to create unit test AVD {self.unit_test_avd_name}: The expected config file '{unit_test_avd_config_path}' does not exist.") + + config_content_full = unit_test_avd_config_path.read_text(encoding='UTF-8', errors='ignore') + for item, value in self.unit_test_device_settings_map.items(): + regex_friendly_str = item.replace('.', '\\.') + repl_pattern = f"{regex_friendly_str}\\s*=\\s*[\\d]+" + repl_value = f"{item}={value}" + if re.search(repl_pattern, config_content_full): + config_content_full = re.sub(repl_pattern, repl_value, config_content_full) + else: + if not config_content_full.endswith('\n'): + config_content_full += '\n' + config_content_full += f"{repl_value}\n" + + unit_test_avd_config_path.write_text(config_content_full) + + def query_emulator_device_id(self): + result_str = self.adb_cmd.run_return_output(['devices', '-l']) + emulators = [] + for result_line in result_str.split('\n'): + if not result_line.startswith('emulator-'): + continue + emulator = result_line[:result_line.find(' ')].strip() + emulators.append(emulator) + + if len(emulators) > 1: + logging.warning(f"Found multiple emulators connect ({','.join(emulators)}). Defaulting to {emulators[0]}") + + return emulators[0] if len(emulators) > 0 else None + + def install_unit_test_avd(self): + """ + Install the unit test AVD (Android Virtual Device) + """ + + valid_avd_map, invalid_avd_map = self.query_installed_avds() + + if not self.unit_test_avd_name in valid_avd_map: + create_avd = True + elif self.force_avd_creation or self.unit_test_avd_name in invalid_avd_map: + logging.info(f"Deleting AVD {self.unit_test_avd_name}..") + self.avd_manager_cmd.run(['delete', 'avd', '--name', self.unit_test_avd_name]) + create_avd = True + else: + create_avd = False + + if create_avd: + self.create_unitest_avd() + + def uninstall_unit_test_avd(self): + """ + Uninstall the unit test AVD + """ + logging.info(f"Uninstalling AVD {self.unit_test_avd_name}..") + self.avd_manager_cmd.run(['delete', 'avd', '--name', self.unit_test_avd_name]) + + def launch_emulator_process(self): + """ + Launch the emulator process for the unit test avd and return the process handle and its device id + :return: tuple of the process handle and the device id for the emulator + """ + emulator_device_id = None + process = None + try: + # Launch the emulator process + emulator_process_args = [ + "-avd", + self.unit_test_avd_name + ] + if self.hide_emulator_windows: + emulator_process_args.append("-no-window") + process = self.emulator_cmd.run_process(emulator_process_args) + + # Wait for the emulator to signal that its bootup is complete + boot_completed = False + start_time = time.time() + timeout_secs = 360 + while process.poll() is None: + elapsed_time = time.time() - start_time + if elapsed_time > timeout_secs > 0: + break + line = process.stdout.readline() + print(line, end='') + if "boot completed" in line: + boot_completed = True + break + if not boot_completed: + raise AndroidEmuError("Bootup of emulator timed out") + + # query ADB to get the emulator ID + emulator_device_id = self.query_emulator_device_id() + + return process, emulator_device_id + + except Exception: + if process: + if emulator_device_id: + self.terminate_emulator_process(emulator_device_id) + else: + process.kill() + raise + + def terminate_emulator_process(self, device_id): + # Terminate the emulator + kill_emu_args = [ + '-s', device_id, + 'emu', 'kill' + ] + self.adb_cmd.run(kill_emu_args) + + def run_emulation_process(self, process_func): + """ + Execute a function that relies on the session based android simulator. + + :param process_func: The process function to execute. Function requires one argument which will be the device id + :return: The return value of the process function + """ + + emulator_device_id = None + try: + emulator_process, emulator_device_id = self.launch_emulator_process() + + return process_func(emulator_device_id) + + finally: + if emulator_device_id is not None: + self.terminate_emulator_process(emulator_device_id) + + +def process_unit_test_on_simulator(base_android_sdk_path, build_path, build_config): + """ + Run the android unit tests on a sessioned simulator + + :param base_android_sdk_path: The path to where the Android SDK exists + :param build_path: The build path relative to the engine root where the android unit test project is configured and built + :param build_config: The configuration of the build unit test APK to run + """ + + python_cmd = Command("Python", ENGINE_ROOT / 'python' / 'python.cmd') + + android_script_root = ENGINE_ROOT / 'cmake' / 'Tools' / 'Platform' / 'Android' + assert android_script_root.is_dir(), "Missing the android scripts path in the engine folder hierarchy" + deploy_android_py_path = android_script_root / 'deploy_android.py' + assert deploy_android_py_path.is_file(), "Missing the android deployment script in the engine folder hierarchy" + launch_android_ptest_py_path = android_script_root / 'launch_android_test.py' + assert launch_android_ptest_py_path.is_file(), "Missing the android unit test launcher script in the engine folder hierarchy" + + def _install_and_run_unit_tests(emulator_id): + + # install unit test on the emulator + install_apk_args = [ + str(deploy_android_py_path), + '-b', build_path, + '-c', build_config, + '--device-id-filter', emulator_id, + '--clean' + ] + python_cmd.run(cmd_args=install_apk_args, + cwd=os.path.normpath(str(ENGINE_ROOT))) + + try: + # Launch the unit test on the emulator + launch_apk_args = [ + str(launch_android_ptest_py_path), + '-b', build_path, + '-c', build_config, + '--device-serial', emulator_id + ] + python_cmd.run(cmd_args=launch_apk_args, + cwd=os.path.normpath(str(ENGINE_ROOT))) + return True + except AndroidEmuError: + print("\n\n") + raise AndroidEmuError("Unit Tests Failed") + + # Prepare the emulator manager + manager = AndroidEmulatorManager(base_android_sdk_path=base_android_sdk_path, + force_avd_creation=True) + + # First Install or overwrite the unit test emulator + manager.install_unit_test_avd() + + # Run the emulator-dependent process based on the session AVD created by the manager + manager.run_emulation_process(_install_and_run_unit_tests) + + # Uninstall the AVD when done + manager.uninstall_unit_test_avd() + + +if __name__ == '__main__': + + parser = argparse.ArgumentParser(description="Install and an android unit test APK on a android simulator.") + + parser.add_argument('--android-sdk-path', + help='Path to the Android SDK') + parser.add_argument('--build-path', + help='The build path (relative to the engine root) where the project was generated and the APK is built', + required=True) + parser.add_argument('--build-config', + help='The build config of the built APK', + required=True) + parser.add_argument('--debug', + help='Enable debug messages from this script', + action="store_true") + + parsed_args = parser.parse_args(sys.argv[1:]) + logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG if parsed_args.debug else logging.INFO) + + try: + base_android_sdk_path = pathlib.Path(parsed_args.android_sdk_path) if parsed_args.android_sdk_path else get_android_sdk_path() + process_unit_test_on_simulator(base_android_sdk_path=base_android_sdk_path, + build_path=parsed_args.build_path, + build_config=parsed_args.build_config) + exit(0) + except AndroidEmuError as e: + print(e) + exit(1) + diff --git a/Tools/build/JenkinsScripts/build/Platform/Linux/asset_linux.sh b/Tools/build/JenkinsScripts/build/Platform/Linux/asset_linux.sh index 325e09f57a..8d76068764 100755 --- a/Tools/build/JenkinsScripts/build/Platform/Linux/asset_linux.sh +++ b/Tools/build/JenkinsScripts/build/Platform/Linux/asset_linux.sh @@ -14,11 +14,14 @@ set -o errexit # exit on the first failure encountered # Delete output directory if CLEAN_OUTPUT_DIRECTORY env variable is set if [[ $CLEAN_OUTPUT_DIRECTORY == "true" ]]; then - if [[ -d Cache ]]; then - echo "[ci_build] CLEAN_OUTPUT_DIRECTORY option set with value \"${CLEAN_OUTPUT_DIRECTORY}\"" - echo "[ci_build] Deleting \"Cache\"" - rm -rf Cache - fi + for project in $(echo $CMAKE_LY_PROJECTS | sed "s/;/ /g") + do + if [[ -d "$project/Cache" ]]; then + echo "[ci_build] CLEAN_OUTPUT_DIRECTORY option set with value \"${CLEAN_OUTPUT_DIRECTORY}\"" + echo "[ci_build] Deleting \"$project/Cache\"" + rm -rf $project/Cache + fi + done fi if [[ ! -d $OUTPUT_DIRECTORY ]]; then diff --git a/Tools/build/JenkinsScripts/build/Platform/Linux/pipeline.json b/Tools/build/JenkinsScripts/build/Platform/Linux/pipeline.json index 73234569a3..ec06dff5bf 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Linux/pipeline.json +++ b/Tools/build/JenkinsScripts/build/Platform/Linux/pipeline.json @@ -9,6 +9,9 @@ "PIPELINE_ENV_OVERRIDE": { "daily-pipeline-metrics": { "CLEAN_WORKSPACE": true + }, + "packaging": { + "CLEAN_WORKSPACE": true } } } \ No newline at end of file diff --git a/Tools/build/JenkinsScripts/build/Platform/Mac/asset_mac.sh b/Tools/build/JenkinsScripts/build/Platform/Mac/asset_mac.sh index 1750521b02..90034bc7cf 100755 --- a/Tools/build/JenkinsScripts/build/Platform/Mac/asset_mac.sh +++ b/Tools/build/JenkinsScripts/build/Platform/Mac/asset_mac.sh @@ -14,11 +14,14 @@ set -o errexit # exit on the first failure encountered # Delete output directory if CLEAN_OUTPUT_DIRECTORY env variable is set if [[ $CLEAN_OUTPUT_DIRECTORY == "true" ]]; then - if [[ -d Cache ]]; then - echo "[ci_build] CLEAN_OUTPUT_DIRECTORY option set with value \"${CLEAN_OUTPUT_DIRECTORY}\"" - echo "[ci_build] Deleting \"Cache\"" - rm -rf Cache - fi + for project in $(echo $CMAKE_LY_PROJECTS | sed "s/;/ /g") + do + if [[ -d "$project/Cache" ]]; then + echo "[ci_build] CLEAN_OUTPUT_DIRECTORY option set with value \"${CLEAN_OUTPUT_DIRECTORY}\"" + echo "[ci_build] Deleting \"$project/Cache\"" + rm -rf $project/Cache + fi + done fi if [[ ! -d $OUTPUT_DIRECTORY ]]; then diff --git a/Tools/build/JenkinsScripts/build/Platform/Mac/pipeline.json b/Tools/build/JenkinsScripts/build/Platform/Mac/pipeline.json index 5e1a6912e9..bb94f33d70 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Mac/pipeline.json +++ b/Tools/build/JenkinsScripts/build/Platform/Mac/pipeline.json @@ -9,6 +9,9 @@ "PIPELINE_ENV_OVERRIDE": { "daily-pipeline-metrics": { "CLEAN_WORKSPACE": true + }, + "packaging": { + "CLEAN_WORKSPACE": true } } } \ No newline at end of file diff --git a/Tools/build/JenkinsScripts/build/Platform/Windows/asset_windows.cmd b/Tools/build/JenkinsScripts/build/Platform/Windows/asset_windows.cmd index 4a5b5cff1d..cc65d07703 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Windows/asset_windows.cmd +++ b/Tools/build/JenkinsScripts/build/Platform/Windows/asset_windows.cmd @@ -14,11 +14,13 @@ SETLOCAL EnableDelayedExpansion REM Delete output directory if CLEAN_OUTPUT_DIRECTORY env variable is set IF "%CLEAN_OUTPUT_DIRECTORY%"=="true" ( - IF EXIST Cache ( - ECHO [ci_build] CLEAN_OUTPUT_DIRECTORY option set with value "%CLEAN_OUTPUT_DIRECTORY%" - ECHO [ci_build] Deleting "Cache" - DEL /s /q /f Cache - ) + FOR %%P in (%CMAKE_LY_PROJECTS%) do ( + IF EXIST %%P\Cache ( + ECHO [ci_build] CLEAN_OUTPUT_DIRECTORY option set with value "%CLEAN_OUTPUT_DIRECTORY%" + ECHO [ci_build] Deleting "%%P\Cache" + DEL /s /q /f %%P\Cache 1>nul + ) + ) ) IF NOT EXIST %OUTPUT_DIRECTORY% ( diff --git a/Tools/build/JenkinsScripts/build/Platform/Windows/build_config.json b/Tools/build/JenkinsScripts/build/Platform/Windows/build_config.json index 0e5229a0c5..e1aa21f86b 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Windows/build_config.json +++ b/Tools/build/JenkinsScripts/build/Platform/Windows/build_config.json @@ -4,6 +4,7 @@ "default" ], "steps": [ + "scrubbing", "validation" ] }, @@ -27,18 +28,14 @@ ] }, "scrubbing": { - "TAGS": [ - "weekly-build-metrics" - ], + "TAGS": [], "COMMAND": "python_windows.cmd", "PARAMETERS": { "SCRIPT_PATH": "Tools/build/JenkinsScripts/build/scrubbing_job.py" } }, "validation": { - "TAGS": [ - "weekly-build-metrics" - ], + "TAGS": [], "COMMAND": "python_windows.cmd", "PARAMETERS": { "SCRIPT_PATH": "scripts/commit_validation/validate_file_or_folder.py" @@ -100,7 +97,7 @@ "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "TEST_SUITE_smoke TEST_SUITE_main", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", - "CTEST_OPTIONS": "-L \"(SUITE_smoke|SUITE_main)\" -T Test" + "CTEST_OPTIONS": "-L \"(SUITE_smoke|SUITE_main)\" -LE \"(REQUIRES_gpu)\" -T Test" } }, "profile_vs2019": { @@ -151,9 +148,11 @@ } }, "test_gpu_profile_vs2019": { - "TAGS": [], - "PIPELINE_ENV": { - "NODE_LABEL": "windows-gpu" + "TAGS":[ + "nightly" + ], + "PIPELINE_ENV":{ + "NODE_LABEL":"windows-gpu" }, "COMMAND": "build_test_windows.cmd", "PARAMETERS": { diff --git a/Tools/build/JenkinsScripts/build/Platform/Windows/build_windows.cmd b/Tools/build/JenkinsScripts/build/Platform/Windows/build_windows.cmd index 8e02fc76fc..e2253ee589 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Windows/build_windows.cmd +++ b/Tools/build/JenkinsScripts/build/Platform/Windows/build_windows.cmd @@ -19,7 +19,7 @@ IF "%CLEAN_OUTPUT_DIRECTORY%"=="true" ( IF EXIST %OUTPUT_DIRECTORY% ( ECHO [ci_build] CLEAN_OUTPUT_DIRECTORY option set with value "%CLEAN_OUTPUT_DIRECTORY%" ECHO [ci_build] Deleting "%OUTPUT_DIRECTORY%" - DEL /s /q /f %OUTPUT_DIRECTORY% + DEL /s /q /f %OUTPUT_DIRECTORY% 1>nul ) ) diff --git a/Tools/build/JenkinsScripts/build/Platform/Windows/pipeline.json b/Tools/build/JenkinsScripts/build/Platform/Windows/pipeline.json index 281c8621f2..380b8c1a48 100644 --- a/Tools/build/JenkinsScripts/build/Platform/Windows/pipeline.json +++ b/Tools/build/JenkinsScripts/build/Platform/Windows/pipeline.json @@ -1,6 +1,6 @@ { "ENV": { - "NODE_LABEL": "windows", + "NODE_LABEL": "windows-047e5cdf", "LY_3RDPARTY_PATH": "C:/ly/3rdParty", "TIMEOUT": 30, "WORKSPACE": "D:/workspace", @@ -9,6 +9,9 @@ "PIPELINE_ENV_OVERRIDE": { "daily-pipeline-metrics": { "CLEAN_WORKSPACE": true + }, + "packaging": { + "CLEAN_WORKSPACE": true } } } \ No newline at end of file diff --git a/Tools/build/JenkinsScripts/build/Platform/iOS/pipeline.json b/Tools/build/JenkinsScripts/build/Platform/iOS/pipeline.json index 5e1a6912e9..bb94f33d70 100644 --- a/Tools/build/JenkinsScripts/build/Platform/iOS/pipeline.json +++ b/Tools/build/JenkinsScripts/build/Platform/iOS/pipeline.json @@ -9,6 +9,9 @@ "PIPELINE_ENV_OVERRIDE": { "daily-pipeline-metrics": { "CLEAN_WORKSPACE": true + }, + "packaging": { + "CLEAN_WORKSPACE": true } } } \ No newline at end of file diff --git a/Tools/build/JenkinsScripts/build/ci_build_metrics.py b/Tools/build/JenkinsScripts/build/ci_build_metrics.py index 6ccd576330..b140afff9e 100755 --- a/Tools/build/JenkinsScripts/build/ci_build_metrics.py +++ b/Tools/build/JenkinsScripts/build/ci_build_metrics.py @@ -146,16 +146,23 @@ def gather_build_metrics(current_dir, build_config_filename, platform): print(f'[ci_build_metrics] {reason}', flush=True) continue - # Clean the output - output_directory = build_parameters['OUTPUT_DIRECTORY'] + # Clean the build output + output_directory = build_parameters['OUTPUT_DIRECTORY'] if 'OUTPUT_DIRECTORY' in build_parameters else None if not output_directory: metrics['result'] = -1 reason = f'OUTPUT_DIRECTORY entry in {build_config_abspath} is missing.' metrics['reason'] = reason print(f'[ci_build_metrics] {reason}', flush=True) continue - - folders_of_interest = ['Cache', 'AssetProcessorTemp', output_directory] + folders_of_interest = [output_directory] + + # Clean the AP output + cmake_ly_projects = build_parameters['CMAKE_LY_PROJECTS'] if 'CMAKE_LY_PROJECTS' in build_parameters else None + if cmake_ly_projects: + projects = cmake_ly_projects.split(';') + for project in projects: + folders_of_interest.append(os.path.join(project, 'user', 'AssetProcessorTemp')) + folders_of_interest.append(os.path.join(project, 'Cache')) metrics['build_metrics'] = [] build_metrics = metrics['build_metrics'] diff --git a/Tools/build/JenkinsScripts/distribution/README.txt b/Tools/build/JenkinsScripts/distribution/README.txt deleted file mode 100644 index bac81c0337..0000000000 --- a/Tools/build/JenkinsScripts/distribution/README.txt +++ /dev/null @@ -1,13 +0,0 @@ -Contact: l-infrastructure@amazon.com - -Last Updated: 2015.02.13 - - - -Description: - - - -LYKey.ppk is the keyfile for the EC2 instance hosted on the AWS account lumberyard-distribution@amazon.com. - -https://wiki.labcollab.net/confluence/display/lmbr/Build+Distribution+Proprosal diff --git a/Tools/build/JenkinsScripts/distribution/ThirdParty/BuildThirdPartyPackages.py b/Tools/build/JenkinsScripts/distribution/ThirdParty/BuildThirdPartyPackages.py new file mode 100644 index 0000000000..05ffd61640 --- /dev/null +++ b/Tools/build/JenkinsScripts/distribution/ThirdParty/BuildThirdPartyPackages.py @@ -0,0 +1,309 @@ +""" + + All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + its licensors. + + For complete copyright and license terms please see the LICENSE at the root of this + distribution (the "License"). All use of this software is governed by the License, + or, if provided, by the license below or the license accompanying this file. Do not + remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" + +import BuildThirdPartyArgs +import BuildThirdPartyUtils +import SDKPackager +import ThirdPartySDKAWS +import json +import os +import re +import sys +import urlparse + +importDir = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(os.path.join(importDir, "..")) #Required for AWS_PyTools +from AWS_PyTools import LyChecksum +from AWS_PyTools import LyCloudfrontOps + +# Some files are in the 3rd party folder and not associated with any SDK/Versions. +fileIgnorelist = [ + "boost/Boost_Autoexp.dat", + "boost/CryEngine Customizations.txt", + "boost/CryREADME.txt", + "boost/LICENSE_1_0.txt", + "boost/lumberyard-1.61.0.patch", + "Qwt/license.txt", + "lz4/git checkout.txt" + "3rdParty.txt" +] + + +class SDK(object): + + def __init__(self): + self.fileList = [] + self.path = "" + self.versionFolder = "" + + +def getListFromFile(file): + openFile = open(file, 'r') + filePaths = openFile.readlines() + openFile.close() + return filePaths + + +def addUntrackedSDKs(sdks): + # Not all SDKs are represented in SetupAssistantConfig.json yet. + + untrackedSDKs = { + "OpenEXR20": ["OpenEXR/2.0", "2.0"], + "OpenEXR22": ["OpenEXR/2.2", "2.2"], + } + + for sdkName, untrackedSDK in untrackedSDKs.iteritems(): + sdk = SDK() + sdk.path = untrackedSDK[0] + sdk.versionFolder = untrackedSDK[1] + sdks[sdkName] = sdk + + +def getSDKsToPathsDict(thirdPartyVersionsFile): + versionsList = getListFromFile(thirdPartyVersionsFile) + sdks = {} + for version in versionsList: + match = re.match(r"(.*)(\.package.dir=)(.*)", version) + if not match: + BuildThirdPartyUtils.printError('SDK version file {0} has invalid formatting on line {1}'.format( + thirdPartyVersionsFile, + version)) + + sdkName = match.group(1) + # Store the SDK Path with forward slashes to make matching easier. + sdkPath = match.group(3).replace('\\', '/') + sdk = SDK() + sdk.path = sdkPath + + versionMatch = re.search(r"([^/\\\\]*)$", sdkPath) + if not versionMatch: + BuildThirdPartyUtils.printError('SDK version file {0} has invalid formatting on line {1}'.format( + thirdPartyVersionsFile, + version)) + + sdk.versionFolder = versionMatch.group(1) + sdks[sdkName] = sdk + + addUntrackedSDKs(sdks) + return sdks + + +def populateSDKFilePaths(sdks, sdkFileListFile): + fileList = getListFromFile(sdkFileListFile) + lastSDKName = "" + for file in fileList: + slashesFixed = file.replace('\\', '/') + match = re.search("3rdParty/(.*)", slashesFixed) + if not match: + BuildThirdPartyUtils.printError("Could not find third party folder in file path {0}".format(file)) + + localPath = match.group(1) + sdkFound = False + + # Files are generally grouped by SDK in the file list, + # caching the last SDK used can save a search through the loop. + if lastSDKName: + if localPath.startswith(sdks[lastSDKName].path): + sdk.fileList.append(file) + sdkFound = True + continue + + for sdkName, sdk in sdks.iteritems(): + if localPath.startswith(sdk.path): + sdk.fileList.append(file) + sdkFound = True + lastSDKName = sdkName + break + + # Some files are loose and not trackable within the current system. For now we're going to ignore them, + # and they will need to be included in the package manually. + for ignore in fileIgnorelist: + if localPath == ignore: + sdkFound = True + break + + if not sdkFound: + BuildThirdPartyUtils.printError("File {0} is not associated with any known SDKs".format( + file, + sdkFileListFile)) + + +def checkForSDKStagingErrors(bucket, baseBucketPath, sdkPath, sdkPlatform, filesetHash): + tmpDirPath = SDKPackager.getTempDir(sdkPath, sdkPlatform) + + filelistFileName = SDKPackager.getFilelistFileName(sdkPlatform) + filelistLocalPath = os.path.join(tmpDirPath, filelistFileName) + filelistStagingPath = ThirdPartySDKAWS.getS3StagingPath(baseBucketPath, sdkPath) + filelistFileName + + if not os.path.exists(tmpDirPath): + os.makedirs(tmpDirPath) + bucket.download_file(filelistStagingPath, filelistLocalPath) + + filelistData = open(filelistLocalPath, 'r') + filelistJsonData = json.load(filelistData) + filelistData.close() + + assert(filelistData != ""), "Failed to load from " + filelistLocalPath + + filelistChecksum = filelistJsonData["filelist"]["checksum"] + + if filelistChecksum != filesetHash.hexdigest(): + # If the checksums don't match, then the SDK has been modified without changing the version. This is an error. + return True + return False + + +def checkForExistingSDK(ignoreExisting, + bucket, + baseBucketPath, + sdkName, + versionFolder, + sdkPath, + sdkPlatform, + filesetHash): + returnCode = 0 + statusMessage = None + # Check for existing manifest + manifestExists, filelistExists = ThirdPartySDKAWS.getSDKStagingStatus(bucket, + baseBucketPath, + sdkPath, + sdkPlatform) + if ignoreExisting: + return statusMessage, returnCode + + # If the manifest or filelist is missing, but one is available, then the SDK likely failed to upload. + # In this case, just continue on and generate the SDK package. + if manifestExists and filelistExists: + # If the manifest and filelist both exist, this SDK.version.package has been uploaded already. + stagingError = checkForSDKStagingErrors(bucket, + baseBucketPath, + sdkPath, + sdkPlatform, + filesetHash) + + if stagingError: + statusMessage = "ERROR: The file list manifests do not match for SDK {0}, Version {1}, Platform {2}".format(sdkName, + versionFolder, + sdkPlatform) + returnCode = 1 + else: + statusMessage = "\tEverything is up to date for SDK {0}, Version {1}, Platform {2}".format(sdkName, + versionFolder, + sdkPlatform) + if statusMessage: + print statusMessage + return statusMessage, returnCode + + +def getListFromJsonFile(jsonFile, root): + if not jsonFile: + return [] + if not os.path.isfile(jsonFile): + print "{} is not a valid file, please check the filename specified.".format(jsonFile) + exit(1) + with open(jsonFile, 'r') as source: + source_json = json.load(source) + try: + sdks_list = source_json[root] + return sdks_list + except KeyError: + print "Unknown json root {}, please check the json root specified.".format(root) + exit(1) + + +############################ + + +def main(): + print "Building third party packages" + args = BuildThirdPartyArgs.createArgs() + + print "Parsing file lists" + ignoreExistingSDKList = getListFromJsonFile(args.ignoreExistingList, args.sdkPlatform) + sdkBlacklist = getListFromJsonFile(args.sdkBlacklist, "Blacklist") + sdks = getSDKsToPathsDict(args.thirdPartyVersions) + populateSDKFilePaths(sdks, args.sdkFilelist) + + cloudfrontDist = LyCloudfrontOps.getCloudfrontDistribution(args.cloudfrontDomain, args.awsProfile) + bucket = LyCloudfrontOps.getBucket(cloudfrontDist, args.awsProfile) + baseBucketPath = LyCloudfrontOps.buildBucketPath(urlparse.urljoin(args.cloudfrontDomain, args.stagingFolderPath), cloudfrontDist) + baseCloudfrontUrl = args.cloudfrontDomain # we assume that the domain ends in a trailing '/' + if args.stagingFolderPath: + baseCloudfrontUrl += args.stagingFolderPath # we assume that the folder path ends in a trailing '/' + + returnCode = 0 + sdksGenerated = [] + + sdkCount = len(sdks) + currentSDK = -1 + for sdkName, sdk in sdks.iteritems(): + currentSDK += 1 + print "{0}/{1} - Processing {2}".format(currentSDK, sdkCount, sdkName) + + # Don't process SDKs in the blacklist. + if sdkName in sdkBlacklist: + print "\tSkipping blacklist SDK {0}".format(sdkName) + continue + # Hash all files for the SDK + filesetHash = LyChecksum.generateFilesetChecksum(sdk.fileList) + + if args.internalPackage: + ignoreExisting = True + else: + ignoreExisting = sdkName in ignoreExistingSDKList + + statusMessage, sdkReturnCode = checkForExistingSDK(ignoreExisting, + bucket, + baseBucketPath, + sdkName, + sdk.versionFolder, + sdk.path, + args.sdkPlatform, + filesetHash) + # The final return should be the highest reported return code. + returnCode = max(returnCode, sdkReturnCode) + if statusMessage: + continue + manifestPath, filelistPath, zipFiles = SDKPackager.generateSDKPackage(baseCloudfrontUrl, + sdkName, + sdk.versionFolder, + sdk.path, + args.sdkPlatform, + filesetHash, + sdk.fileList, + args.archiveMaxSize) + if not args.skipUpload: + ThirdPartySDKAWS.uploadSDKToStaging(bucket, + baseBucketPath, + sdkName, + sdk.versionFolder, + sdk.path, + args.sdkPlatform, + manifestPath, + filelistPath, + zipFiles) + print "{0}/{1} - Completed Processing {2}".format(currentSDK+1, sdkCount, sdkName) + sdksGenerated.append(sdkName) + + # If any SDKs were updated, and we were told to make a file to output + # the list of updated SDKs to, then make said file and write out the list + if len(sdksGenerated) > 0 and args.updatesFile: + try: + with open(args.updatesFile, 'w') as out: + out.writelines('\n'.join(sdksGenerated)) + except: + BuildThirdPartyUtils.printError("Failed to write list of updated SDKs to {0}. Backup zip files will not be created properly for this build.".format(args.updatesFile)) + + return returnCode + +if __name__ == "__main__": + sys.exit(main()) diff --git a/Tools/build/JenkinsScripts/distribution/ThirdParty/BuildThirdPartyUtils.py b/Tools/build/JenkinsScripts/distribution/ThirdParty/BuildThirdPartyUtils.py new file mode 100644 index 0000000000..865c45d47d --- /dev/null +++ b/Tools/build/JenkinsScripts/distribution/ThirdParty/BuildThirdPartyUtils.py @@ -0,0 +1,29 @@ +""" + + All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + its licensors. + + For complete copyright and license terms please see the LICENSE at the root of this + distribution (the "License"). All use of this software is governed by the License, + or, if provided, by the license below or the license accompanying this file. Do not + remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" + +import sys + +def printError(message): + print(message) + sys.exit(1) + + +def reportIterationStatus(index, count, reportFrequency, message): + # Reporting on the first, last, and at a frequency that is a good balance of not spamming the logs + frequency = count / reportFrequency + lastPercent = float(index-1) / float(count) + percentComplete = float(index) / float(count) + lastReportSlice = int(lastPercent * frequency) + thisReportSlice = int(percentComplete * frequency) + shouldPrint = lastReportSlice != thisReportSlice or index == 1 or index == count + if shouldPrint: + print "\t{0}% complete, {1}/{2} {3}".format(int(percentComplete*100), index, count, message) diff --git a/Tools/build/JenkinsScripts/distribution/ThirdParty/SDKPackager.py b/Tools/build/JenkinsScripts/distribution/ThirdParty/SDKPackager.py new file mode 100644 index 0000000000..32c51f6302 --- /dev/null +++ b/Tools/build/JenkinsScripts/distribution/ThirdParty/SDKPackager.py @@ -0,0 +1,207 @@ +""" + + All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + its licensors. + + For complete copyright and license terms please see the LICENSE at the root of this + distribution (the "License"). All use of this software is governed by the License, + or, if provided, by the license below or the license accompanying this file. Do not + remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" + +import zipfile +import os.path +import re +import json +import sys +import ThirdPartySDKAWS +import BuildThirdPartyUtils +import tempfile + +importDir = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(os.path.join(importDir, "..")) #Required for AWS_PyTools +from AWS_PyTools import LyChecksum + +class SDKZipFile(object): + def __init__(self): + self.file = None + self.filePath = None + self.contents = [] + self.compressedSize = 0 + self.uncompressedSize = 0 + self.compressedHash = 0 + + +def getFilelistVersion(): + return "1.0.0" + + +def getFilelistFileName(sdkPlatform): + return "filelist." + getFilelistVersion() + "." + sdkPlatform + ".json" + + +def getManifestVersion(): + return "1.0.0" + + +def getManifestFileName(sdkPlatform): + return "manifest." + getManifestVersion() + "." + sdkPlatform + ".json" + + +def toArchivePath(filePath): + # Archives are generated relative to 3rdParty folder, so strip everything before that in the path. + # zipfile is very particular in how paths to files within it are formatted. + slashesFixed = filePath.replace('\\', '/') + match = re.search("3rdParty/(.*)", slashesFixed) + if not match: + BuildThirdPartyUtils.printError("Could not find third party folder in file path {0}".format(filePath)) + archivePath = match.group(1).strip("/").strip("\n") + return archivePath + + +def prepFilesystemForFile(filePath): + directory = os.path.dirname(filePath) + if not os.path.exists(directory): + os.makedirs(directory) + if os.path.isfile(filePath): + os.remove(filePath) + +def createJSONString(dataToFormat): + return json.dumps(dataToFormat, sort_keys=True, indent=4, separators=(',', ': ')) + + +def generateSDKPackage(baseCloudfrontUrl, + sdkName, + sdkVersion, + sdkPath, + sdkPlatform, + filesetHash, + filePaths, + archiveMaxSize): + zipFiles = zipPackage(sdkName, sdkVersion, sdkPath, sdkPlatform, filePaths, archiveMaxSize) + filelistPath = buildFilelistJSON(sdkPath, sdkPlatform, filesetHash, filePaths) + manifestPath = buildManifestJSON(baseCloudfrontUrl, + sdkName, + sdkPath, + sdkPlatform, + zipFiles, + filelistPath) + return manifestPath, filelistPath, zipFiles + + +def getTempDir(sdkPath, sdkPlatform): + tempDir = os.path.join(tempfile.tempdir, "LY", "3rdPartySDKs", sdkPath, sdkPlatform) + return os.path.expandvars(tempDir) + + +def zipPackage(sdkName, sdkVersion, sdkPath, sdkPlatform, filePaths, archiveMaxSize): + try: + import zlib + compression = zipfile.ZIP_DEFLATED + except: + compression = zipfile.ZIP_STORED + + tempDir = getTempDir(sdkPath, sdkPlatform) + zipFiles = [] + currentZipFile = None + + fileIndex = 0 + fileCount = len(filePaths) + + for filePath in filePaths: + + filePath = filePath.strip("\n") + archivePath = toArchivePath(filePath) + if currentZipFile is None or currentZipFile.file is None or currentZipFile.compressedSize > archiveMaxSize: + if currentZipFile and currentZipFile.file: + currentZipFile.file.close() + currentZipFile = SDKZipFile() + zipFiles.append(currentZipFile) + currentZipFile.filePath = os.path.join(tempDir, sdkName + "." + str(sdkPlatform) + "." + str(len(zipFiles)) + ".zip") + prepFilesystemForFile(currentZipFile.filePath) + currentZipFile.file = zipfile.ZipFile(currentZipFile.filePath, mode='w') + currentZipFile.file.write(filePath, compress_type=compression, arcname=archivePath) + fileInfo = currentZipFile.file.getinfo(archivePath) + currentZipFile.compressedSize += fileInfo.compress_size + currentZipFile.uncompressedSize += fileInfo.file_size + currentZipFile.contents.append(filePath) + + fileIndex += 1 + BuildThirdPartyUtils.reportIterationStatus(fileIndex, fileCount, 25, "files zipped") + + if currentZipFile and currentZipFile.file: + currentZipFile.file.close() + + for zipFile in zipFiles: + zipFile.compressedHash = LyChecksum.getChecksumForSingleFile(zipFile.filePath) + + return zipFiles + + +def buildFilelistJSON(sdkPath, sdkPlatform, filesetHash, filePaths): + jsonFormatFiles = [] + for filePath in filePaths: + scrubbedFile = toArchivePath(filePath) + jsonFormatFiles.append(scrubbedFile) + + filelistInfo = { + "filelist": { + "filelistVersion": getFilelistVersion(), + "checksum": filesetHash.hexdigest(), + "files": jsonFormatFiles, + } + } + filelistJSON = createJSONString(filelistInfo) + filelistName = getFilelistFileName(sdkPlatform) + filelistPath = getTempDir(sdkPath, sdkPlatform) + filelistFullPath = os.path.join(filelistPath, filelistName) + + prepFilesystemForFile(filelistFullPath) + + outputFile = open(filelistFullPath, 'w') + outputFile.write(filelistJSON) + outputFile.close() + return filelistFullPath + + +def buildManifestJSON(baseCloudfrontUrl, sdkName, sdkPath, sdkPlatform, zipFiles, filelistPath): + uncompressedSize = 0 + packageArchives = [] + for zipFile in zipFiles: + uncompressedSize += zipFile.uncompressedSize + archiveUrl = ThirdPartySDKAWS.getProductionUrl(baseCloudfrontUrl, sdkPath, zipFile.filePath) + packageArchive = { + "archiveUrl": archiveUrl, + "archiveSize": str(zipFile.compressedSize), + "archiveChecksum": zipFile.compressedHash.hexdigest() + } + packageArchives.append(packageArchive) + + filelistChecksum = LyChecksum.getChecksumForSingleFile(filelistPath) + + filelistUrl = ThirdPartySDKAWS.getProductionUrl(baseCloudfrontUrl, sdkPath, filelistPath) + packageInfo = { + "package": + { + "manifestVersion": getManifestVersion(), + "identifier": sdkName, + "platform": sdkPlatform, + "uncompressedSize": str(uncompressedSize), + "filelistUrl": filelistUrl, + "filelistChecksum": filelistChecksum.hexdigest(), + "archives": packageArchives + + } + } + manifestJSON = createJSONString(packageInfo) + manifestName = getManifestFileName(sdkPlatform) + manifestPath = getTempDir(sdkPath, sdkPlatform) + manifestFullPath = os.path.join(manifestPath, manifestName) + + prepFilesystemForFile(manifestFullPath) + + outputFile = open(manifestFullPath, 'w') + outputFile.write(manifestJSON) + outputFile.close() + return manifestFullPath diff --git a/Tools/build/JenkinsScripts/distribution/ThirdParty/ThirdPartySDKAWS.py b/Tools/build/JenkinsScripts/distribution/ThirdParty/ThirdPartySDKAWS.py new file mode 100644 index 0000000000..c143195655 --- /dev/null +++ b/Tools/build/JenkinsScripts/distribution/ThirdParty/ThirdPartySDKAWS.py @@ -0,0 +1,76 @@ +""" + + All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + its licensors. + + For complete copyright and license terms please see the LICENSE at the root of this + distribution (the "License"). All use of this software is governed by the License, + or, if provided, by the license below or the license accompanying this file. Do not + remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" + +import os.path +import sys +import urlparse +import SDKPackager +import BuildThirdPartyUtils + +importDir = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(os.path.join(importDir, "..")) #Required for AWS_PyTools +from AWS_PyTools import LyCloudfrontOps + +def getS3StagingPath(stagingFolderPath, sdkPath): + # The staging path is used for the build machines to upload new builds of 3rd party packages. + # The Setup Assistant supports a global override so Lumberyard team members can pull from the staging location. + return urlparse.urljoin(stagingFolderPath, sdkPath.replace(' ', '_')) + '/' + +def getProductionUrl(cloudfrontUrl, sdkPath, filePath): + # The production path is the final path customers will download the SDK from. + # These links get baked into the manifest, which the Setup Assistant executable uses to acquire these SDKs. + # TODO : Generate an actual cloudfront production link. + #return cloudfrontUrl + getS3StagingPath(stagingFolderPath, sdkPath.replace(' ', '_')) + os.path.basename(filePath) + # we assume that the cloudfront url and the result of getS3stagingPath have a trailing '/' + return getS3StagingPath(cloudfrontUrl, sdkPath) + os.path.basename(filePath) + +def getSDKStagingStatus(bucket, baseBucketPath, sdkPath, sdkPlatform): + + pathToSDK = getS3StagingPath(baseBucketPath, sdkPath) + pathToFilelist = pathToSDK + SDKPackager.getFilelistFileName(sdkPlatform) + pathToManifest = pathToSDK + SDKPackager.getManifestFileName(sdkPlatform) + manifestExists = False + filelistExists = False + + objs = list(bucket.objects.filter(Prefix=pathToManifest)) + if len(objs) > 0 and objs[0].key == pathToManifest: + manifestExists = True + else: + manifestExists = False + + objs = list(bucket.objects.filter(Prefix=pathToFilelist)) + if len(objs) > 0 and objs[0].key == pathToFilelist: + filelistExists = True + else: + filelistExists = False + + return manifestExists, filelistExists + +def uploadSDKToStaging(bucket, baseBucketPath, sdkName, sdkVersion, sdkPath, sdkPlatform, manifestPath, filelistPath, zipFiles): + print "\tUploading SDK: {0} ({1},{2})".format(sdkName, sdkVersion, sdkPlatform) + + manifestStagingPath = getS3StagingPath(baseBucketPath, sdkPath) + os.path.basename(manifestPath) + bucket.upload_file(manifestPath, manifestStagingPath) + print "\tUploaded manifest" + + filelistStagingPath = getS3StagingPath(baseBucketPath, sdkPath) + os.path.basename(filelistPath) + bucket.upload_file(filelistPath, filelistStagingPath) + print "\tUploaded filelist" + + filesUploaded = 0 + totalFilesCount = len(zipFiles) + for zipFile in zipFiles: + fileLocalPath = zipFile.filePath + fileStagingPath = getS3StagingPath(baseBucketPath, sdkPath) + os.path.basename(zipFile.filePath) + bucket.upload_file(fileLocalPath, fileStagingPath) + filesUploaded += 1 + BuildThirdPartyUtils.reportIterationStatus(filesUploaded, totalFilesCount, 5, "files uploaded") diff --git a/Tools/maxscript/AddCryTools.ms b/Tools/maxscript/AddCryTools.ms deleted file mode 100644 index 40e05c344b..0000000000 --- a/Tools/maxscript/AddCryTools.ms +++ /dev/null @@ -1,2508 +0,0 @@ -------------------------------------------------------------------------------- --- AddCryTools.ms --- Version 2.0 --- Adds the current CryTools menu -------------------------------------------------------------------------------- - - - -try (cryTools.cryAnim.base.killCryAnim() ) catch() - -------------------------------------------------------------------------------- --- Set the cTools struct -------------------------------------------------------------------------------- - -struct cTools -( - - --global storage arrays - _fnStore, _fnStoreIndex, _varStore, _varStoreIndex, - - localBuildNumber, BuildPathFull, perforcePath, maxDirTxt, editorPath, cryINI, maxVersionNum, project_name, - latest_build, latestbuildnumber, cryExportPresent, cbaPath, rollback_status, DOMAIN, - - cryTemp = (sysInfo.tempDir + "cry_temp\\"), - - --INI read in - showSplash, reparenttwist, checkbeforeexport, suppresswarnings, warnmats, nounparentw, texturesOK, updateCollections, - syncCollections, udpObj, loadoldanimtools, generateMenu, -- added new menu generating function - - --Check For Export Variables - CheckSceneForExport, PreExportWarnings, CheckBnScale, ReparentTwistBns, CheckObjMat, WpnBnUnlink, - CheckNodeTm, CheckNonZeroMorphs, CheckVerts, - - --functions - scmd, getPerforcePath, existFile, existDir, storeFn, retrieveFn, getDNS, outToINI, inFromINI, md5, alienBrain, MirrorObjs, - matchPivot, findRoot, getBindPoseVertexTarget, CreateBindPoseMorph, getChildren, getBips, inFromUDP, outToUDP, storeVar, retrieveVar, - local2unc, forceLowerCase, getUDP, plusR, minusR, objTrajectoryToSpline, cutString, vertDistance, copyPasteController, - sliderMan, rotBind, polyStats, closestPoint, nodes2bones, readIN, writeOUT, distDiff, lookAtPos, threePlaneInter, avgArray, generateMenu, setupMacros, setupVars, setupCallbacks, - setupPlugins, setupTools, cryAnim, LookAndWrite, LookAndDelete, sortRootChildren - -) - - --- create instance of ctools struct -cryTools = cTools() - - - - - - - - - - -- Silent command -cryTools.scmd = fn scmd command wait = -( - csexport.export.execute_command_line ("cmd /c \"" + command + "\"") wait -) -scmd = undefined - - - ---// retrieves perforce path of the project if perforce is available -cryTools.getPerforcePath = fn getPerforcePath = -( - perforceString = "" - tempFile = ((getDir #maxroot) + "perforceDir.ct") - - local buildFilter = filterString buildPathFull_crytools "\\" - for i = 1 to buildFilter.count do - perforceString += buildFilter[i] + (if i < buildFilter.count then "\\" else "") - - - if cryTools.scmd != undefined then - ( - cryTools.scmd ("p4 where " + perforceString + " > \"" + tempFile + "\"") true - - tempString = "" - while tempString == "" do - ( - escapeEnable = true - - --// checks if the file is generated - while tempStream == undefined do - ( - escapeEnable = true - tempStream = openFile tempFile mode:"r" - ) - - if getFileSize tempFile == 0 then - ( - print "Perforce not found..." - return undefined - ) - - while eof tempStream != true do - tempString += (readLine tempStream) + "\n" - - close tempStream - --// delete file - deleteFile tempFile - ) - - try ( return (filterString tempString " ")[1] ) catch (return undefined) - ) -) -getPerforcePath = undefined - - --- File/Dir exist functions -cryTools.existFile = fn existFile fname = return ((getfiles fname).count != 0) -existFile = undefined - - -cryTools.existDir = fn existDir fname = return ((getdirectories fname).count != 0) -existDir = undefined - - ---reading and writing to the crytools.fnStore array -cryTools.storeFn = fn storeFn storeMe overWrite = -( - if (finditem cryTools._fnStoreIndex (storeMe as string)) == 0 then - ( - --print ("Cannot find " + storeme as string + " in " + crytools.fnstore as string) - append cryTools._fnStore storeMe - append cryTools._fnStoreIndex (storeMe as string) - ) - else - ( - if overWrite == true then - ( - itemIndex = (finditem cryTools._fnStoreIndex (storeMe as string)) - cryTools._fnStore[itemIndex] = storeMe - cryTools._fnStoreIndex[itemIndex] = (storeMe as string) - ) - else - ( - print "function exists" - ) - ) -) -storeFn = undefined - - -cryTools.retrieveFn = fn retrieveFn name = -( - index = finditem crytools._fnStoreIndex name - if index == 0 then - return undefined - else - return crytools._fnStore[index] -) -retrieveFn = undefined - ---reading and writing to the crytools.fvarStore array -cryTools.storeVar = fn storeVar storeMe alias overWrite = -( - if (finditem crytools._varStoreIndex alias) == 0 then - ( - append crytools._varStore storeMe - append crytools._varStoreIndex alias - ) - else - ( - if overWrite == true then - ( - itemIndex = finditem crytools._varStoreIndex alias - crytools._varStore[itemIndex] = storeMe - crytools._varStoreIndex[itemIndex] = alias - print "overwritten" - ) - else - ( - print "alias exists" - ) - ) -) -storeVar = undefined - - - -cryTools.retrieveVar = fn retrieveVar name = -( - index = finditem crytools._varStoreIndex name - if index == 0 then - return undefined - else - return crytools._varStore[index] -) -retrieveVar = undefined - - - --- Get DNS info -cryTools.getDNS = fn getDNS = -( - try - ( - cryTools.scmd ("ipconfig /all > " + crytools.cryTemp + "ipconfig.txt") true - in_text = openfile (crytools.cryTemp + "ipconfig.txt") - skipToString in_text "Primary Dns Suffix . . . . . . . : " - line = readline in_text - close in_text - deleteFile (crytools.cryTemp + "ipconfig.txt") - return line - ) - catch ( return "UNDEFINED" ) -) -getDNS = undefined - - - -cryTools.outToINI = fn outToINI subject key data = -( - csexport.set_value key data -) -outToINI = undefined - - - -cryTools.writeOUT = fn writeOUT data path echo:undefined = -( - if doesfileexist path == false then - ( - INIFile = createFile path - for i = 1 to data.count do - ( - if echo == true then - ( - print data[i] - ) - format (data[i] + "\n") to:INIFile - ) - close INIfile - ) - else - ( - try - ( - INIfile = openfile path mode:"w" - ) - catch - ( - cryTools.minusR path - ) - INIfile = openfile path mode:"w" - for i = 1 to data.count do - ( - if echo == true then - ( - print data[i] - ) - format (data[i] + "\n") to:INIFile - ) - close INIfile - ) -) -writeOUT = undefined - - - -cryTools.inFromINI = fn inFromINI subject key = -( - return (csexport.get_value key) -) -inFromINI = undefined - - - -cryTools.readIN = fn readIN path echo:undefined = -( - if doesfileexist path == false then - ( - print ("file " + path + " does not exist!") - return undefined - ) - INIfile = openfile path mode:"r" - fileContents = #() - while not EOF INIfile do - ( - append fileContents (readline INIfile) - ) - close INIfile - if echo == true then - ( - print fileContents - ) - return fileContents -) -readIN = undefined - - --// for old ini version -try ( csexport.set_value ) -catch -( - cryTools.outToINI = fn outToINI subject key data = - ( - setINISetting (sysInfo.tempDir + "cry_temp\\cryTools.ini") subject key data - ) - outToINI = undefined - - - cryTools.inFromINI = fn inFromINI subject key = - ( - return (getINISetting (sysInfo.tempDir + "cry_temp\\crytools.ini") subject key) - ) - inFromINI = undefined -) - - - - --- MD5 hash return -cryTools.md5 = fn md5 md5path = -( - cryTools.scmd ("\"" + cryTools.BuildPathFull + "Tools\\maxscript\\md5\" \"" + md5path + "\" > " + ("\"" + sysInfo.tempDir + "cry_temp\\hash.txt\"")) true - if doesfileexist md5path == false then - ( - print ( md5path + " does not exist.") - return undefined - ) - md5hashfile = openFile (sysInfo.tempDir + "cry_temp\\hash.txt") - while not eof md5hashfile do - ( - md5hashline = (readline md5hashfile) - ) - try - ( - md5hashArray = (filterstring md5hashline " ") - ) - catch - ( - return ("INVALID PATH: " + md5path) - ) - close md5hashfile - deleteFile (sysInfo.tempDir + "cry_temp\\hash.txt") - return md5hashArray[1] -) -md5 = undefined - --- AlienBrain interface via command line execution -cryTools.alienBrain = fn alienBrain abcommand = -( - crytools.scmd abcommand true -) -alienBrain = undefined - - - - --- For mirroring joint orientations over an arbitrary axis -cryTools.MirrorObjs = fn MirrorObjs Obj1 Obj2 MObj MAxis OAxis = -( - T = Obj2.Transform * inverse MObj.Transform --- the offset transform Matrix - Case MAxis of --- Mirror T in one axis of MObj - ( - #x:( for i = 1 to 4 do T[i] = [ -T[i].x , T[i].y , T[i].z ] ) - #y:( for i = 1 to 4 do T[i] = [ T[i].x , -T[i].y , T[i].z ] ) - #z:( for i = 1 to 4 do T[i] = [ T[i].x , T[i].y , -T[i].z ] ) - ) - case OAxis of --- But the axis has been flipped ...so flip it back. - ( - #x:( T[1] = - T[1] ) - #y:( T[2] = - T[2] ) - #z:( T[3] = - T[3] ) - ) - - TM = T * MObj.Transform - Obj1.rotation = Conjugate TM.rotation - Obj1.pos = TM.pos -) -MirrorObjs = undefined - - - --- Aligning the pivot of an object to that of another -cryTools.matchPivot = fn matchPivot obj1 obj2 = -( - obj2.pivot = obj1.pivot - pivrot = obj1.rotation - in coordsys local obj2.rotation*=pivrot - obj2.objectoffsetrot*=pivrot - obj2.objectoffsetpos*=pivrot -) -matchPivot = undefined - - - --- Gets the root of the hierarchy, when you give it an object of said hierarchy. -cryTools.findRoot = fn findRoot obj = -( - try - ( - if obj.parent == undefined then - ( - return obj - ) - local p1 = obj - for i = 1 to 10000 do - ( - p2 = p1.parent - if p2 == undefined then return p1 else p1 = p2 - ) - ) - catch( return obj) -) -findRoot = undefined - - - - --- Smithy's badassed morph extraction -cryTools.getBindPoseVertexTarget = fn getBindPoseVertexTarget targetNode sourceNode vertexID = -( - -- Find the skin modifier. - skin = sourceNode.skin - - -- Loop through all the bones influencing this vertex. - -- For now just use one of the bones. - skinTransform = Matrix3 0 - for link = 1 to skinOps.getVertexWeightCount skin vertexID do - ( - -- Get the bone that the vertex is linked to. - boneID = skinOps.getVertexWeightBoneID skin vertexID link - boneName = skinOps.GetBoneName skin boneID 0 - bone = getNodeByName boneName - - -- Find the bind pose transform of the bone. - in coordsys world bindPoseTM = skinUtils.GetBoneBindTM sourceNode bone - - -- Find the current transform of the bone. - in coordsys world currentTM = bone.transform - - -- Find the relative transform. - bindPoseToCurrentTM = (inverse bindPoseTM) * currentTM - - -- Get the weight assigned to this bone. - weight = skinOps.GetVertexWeight skin vertexID link - scale bindPoseToCurrentTM [weight, weight, weight] true - - -- Compute the weighted sum of the transform matrix. - skinTransform = skinTransform + bindPoseToCurrentTM - ) - - -- Apply the inverse of this transform to the vertex, to return to bind pose. - bindPoseVertex = (getVert targetNode vertexID) * (inverse skinTransform) - - return bindPoseVertex -) -getBindPoseVertexTarget = undefined - - - - --- CreateBindPoseMorph -cryTools.CreateBindPoseMorph = fn CreateBindPoseMorph targetNode sourceNode deleteYN addMorphYN channelNum extractedNode = -( - -- Make sure the user has selected the skinned character. - if targetNode != undefined then - ( - targetCopy = copy targetNode name:extractedNode - convertToMesh targetCopy - - targetCopy.transform = sourceNode.transform - - -- Transform all vertices to the bind pose. - for vertex = 1 to (getNumVerts targetCopy) do - ( - bindPosePosition = getBindPoseVertexTarget targetCopy sourceNode vertex - meshOp.setVert targetCopy vertex bindPosePosition - ) - - -- Add the morph channel. - if addMorphYN == 1 then - ( - WM3_MC_Delete sourceNode.morpher channelNum - wm3_mc_buildfromnode sourceNode.morpher channelNum targetCopy - ) - - -- Delete the cloned morph target. - if deleteYN == 1 then - ( - delete targetCopy - ) - ) -) -CreateBindPoseMorph = undefined - - - - --- Get children -cryTools.getChildren = fn getChildren theNode = -( - nodeArray = #() - for obj in theNode.children do - ( - append nodeArray obj - join nodeArray (cryTools.getChildren obj) - ) - return nodeArray -) -getChildren = undefined - - - ---function to get all bip roots -cryTools.getBips = fn getBips = -( - Bips = #() - for obj in geometry do - ( - if classof obj.controller == Vertical_Horizontal_Turn then - ( - append Bips obj - ) - ) - return Bips -) -getBips = undefined - - - - ---functions for reading and writing to user defined properties -cryTools.inFromUDP = fn inFromUDP obj = -( - if obj == undefined then - ( - print "No Object is Selected!" - return undefined - ) - UDPin = stringstream (getUserPropBuffer obj) - udpContents = #() - while not eof UDPin do - ( - append udpContents (readline (UDPin)) - ) - for i = 1 to udpContents.count do - ( - if udpContents[i] == "" then - ( - deleteItem udpContents i - ) - ) - return udpContents -) -inFromUDP = undefined - - - - -cryTools.outToUDP = fn outToUDP data obj echo = -( - text = "" - - if obj == undefined then - ( - print ("outToUDP: " + obj.name + " does not exist!") - return undefined - ) - - - for i = 1 to data.count do - text += data[i] + "\r\n" - - - if echo == true then - print text - - setUserPropBuffer obj text -) -outToUDP = undefined - - - -cryTools.LookAndDelete = fn LookAndDelete obj word= -( - local ObjUDP = crytools.inFromUDP obj - local index = 0 - - if ObjUDP.count > 0 then - ( - --// goes through udp entries - for i = 1 to ObjUDP.count do - ( - --// if the word is found in the entry - if word == ((filterstring ObjUDP[i] " =")[1]) then - ( - --// exit loop - index = i - exit - ) - ) - - if index != 0 then - --// delete entry - deleteItem ObjUDP index - - --// set new udp entries - crytools.outtoudp ObjUDP obj false - ) -) -LookAndDelete = undefined - - - -cryTools.LookAndWrite = fn LookAndWrite obj data = -( - local ObjUDP = crytools.inFromUDP obj - local TestArr = #() - local wordLocation = 0 - - for i = 1 to ObjUDP.count do - ( - --// adds the entries name to the test array - append TestArr (filterstring ObjUDP[i] " =")[1] - --// if the entry is the same as data - if TestArr[i] == (filterString data " =")[1] then - --// set new location in the array - wordLocation = i - ) - - --// tries to find the word in the entries list, if it can't find it, set location to the next of the last entry - if wordLocation == 0 then wordLocation = ObjUDP.count + 1 - - --// write new entry - ObjUDP[wordLocation] = data - crytools.OutToUDP ObjUDP obj false -) -LookAndWrite = undefined - - - -cryTools.local2unc = fn local2unc letter = -( - cmd = ("net use " + letter + ": > " + crytools.cryTemp + "local_unc.txt") - crytools.scmd cmd true - loadIn = openfile (crytools.cryTemp + "local_unc.txt") - skipToString loadIn "Remote" - loadInARR = (filterString (readline loadIn) " ") - close loadIn - cmd = ("del " + crytools.cryTemp + "local_unc.txt") - crytools.scmd cmd true - return loadInARR[2] -) -local2unc = undefined - - - - -cryTools.forceLowerCase = fn forceLowerCase inputString = -( - charCache = #() - outputString = "" - inputStream = (inputString as stringStream) - while not eof inputStream do - ( - append charCache (readChar inputStream) - ) - for i = 1 to charCache.count do - ( - case charCache[i] of - ( - "A": charCache[i] = "a" - "B": charCache[i] = "b" - "C": charCache[i] = "c" - "D": charCache[i] = "d" - "E": charCache[i] = "e" - "F": charCache[i] = "f" - "G": charCache[i] = "g" - "H": charCache[i] = "h" - "I": charCache[i] = "i" - "J": charCache[i] = "j" - "K": charCache[i] = "k" - "L": charCache[i] = "l" - "M": charCache[i] = "m" - "N": charCache[i] = "n" - "O": charCache[i] = "o" - "P": charCache[i] = "p" - "Q": charCache[i] = "q" - "R": charCache[i] = "r" - "S": charCache[i] = "s" - "T": charCache[i] = "t" - "U": charCache[i] = "u" - "V": charCache[i] = "v" - "W": charCache[i] = "w" - "X": charCache[i] = "x" - "Y": charCache[i] = "y" - "Z": charCache[i] = "z" - ) - ) - for i = 1 to charCache.count do - ( - append outputString charCache[i] - ) - return outputString -) -forceLowerCase = undefined - - - - -cryTools.getUDP = fn getUDP obj attrib = -( - --// init vars - returnVal = "" - udpInARR = crytools.inFromUDP obj - - --// go through every udp entry - for i = 1 to udpInARR.count do - ( - --// get's name - local testFor = (cryTools.forceLowerCase (filterString udpInArr[i] " =")[1]) - --// get's value - local testValue - if (filterString udpInArr[i] " =")[2] != undefined then - ( - testValue = ((filterString udpInArr[i] " =")[2] as float) - ) - else - ( - testValue = true - ) - --// returns value, if entry is the same as attrib - if testFor == attrib then - return testValue - ) - return undefined -) -getUDP = undefined - - - - --- file attrib +/-r in explorer -cryTools.plusR = fn plusR path = -( - if doesfileexist path == true then - ( - crytools.scmd ("attrib +r \"" + path + "\"") true - ) - else - ( - print (path + " does not exist") - ) -) -plusR = undefined - - - - -cryTools.minusR = fn minusR path = -( - if doesfileexist path == true then - ( - cryTools.scmd ("attrib -r \"" + path + "\"") true - ) - else - ( - print (path + " does not exist") - ) -) -minusR = undefined - - - - -cryTools.objTrajectoryToSpline = fn objTrajectoryToSpline = -( - for obj in selection do - ( - ss = SplineShape pos:(obj.position.keys[1].value) name:("traj_" + obj.name) - addNewSpline ss - for i = 2 to obj.position.keys.count do - ( - addKnot ss 1 #corner #line obj.position.keys[i].value - ) - updateShape ss - ss.transform = obj.transform - ) -) -objTrajectoryToSpline = undefined - - - - -cryTools.cutString = fn cutString stringIn cut = -( - startCut = (findString stringIn cut) - if startCut == undefined then - ( - print ("error: '" + stringIn + "' '" + cut +"'") - return stringIn - ) - return (replace stringIn startCut cut.count "") -) -cutString = undefined - - - - -cryTools.vertDistance = fn vertDistance pos1 pos2 = -( - distX = (pos1.x - pos2.x) * (pos1.x - pos2.x) - distY = (pos1.y - pos2.y) * (pos1.y - pos2.y) - distZ = (pos1.z - pos2.z) * (pos1.z - pos2.z) - - hypotDistXYZ = sqrt(distX + distY + distZ) as float - - return hypotDistXYZ -) -vertDistance = undefined - - - - -cryTools.copyPasteController = fn copyPasteController parentObj selOrChild what = -( - if selOrChild == "children" then - ( - for obj in parentObj.children do - ( - obj.parent = undefined - - --// if p exists - if (findString what "p") != undefined then - obj.position.controller = parentObj.position.controller - --// if r exists - if (findString what "r") != undefined then - obj.rotation.controller = parentObj.rotation.controller - ) - ) -) -copyPasteController = undefined - - - - ---old test, just puts in manip mode if slider is selected (needs callback) -cryTools.sliderMan = fn sliderMan = -( - if selection != undefined then - ( - if classof $ == sliderManipulator then - ( - manipulateMode = true - ) - else - ( - manipulateMode = false - ) - ) -) -sliderMan = undefined - -cryTools.rotBind = fn rotBind mesh root x y z leaveSkel = -( - select mesh - - --place bip into fig mode - if root.name == "Bip01" then - ( - $Bip01.controller.figureMode = true - ) - - --save out weights - max modify mode - try - ( - modPanel.setCurrentObject mesh.modifiers[#Skin] - ) - catch - ( - print (mesh.name + " does not appear to have a Skin modifier.") - return undefined - ) - skinOps.SaveEnvelope mesh.modifiers[#Skin] (crytools.cryTemp + "tests.env") - local boneXfer = #() - for i=1 to (skinOps.getNumberBones mesh.skin) do - ( - append boneXfer (skinOps.GetBoneName mesh.skin i 0) - ) - - --flip the character mesh - collapseStack mesh - mesh.transform[4] = root.transform[4] - in coordsys world rotate mesh (eulerangles x y z) - ResetXForm mesh - collapseStack mesh - - --flip the skeleton - in coordsys world rotate root (eulerangles x y z) - - --readd skin to the mesh - addModifier mesh (Skin ()) - modPanel.setCurrentObject mesh.modifiers[#Skin] - for i = 1 to (boneXfer.count - 1) do - ( - skinOps.addbone mesh.modifiers[#Skin] (getnodebyname (bonexfer[i])) 0 - ) - skinOps.addbone mesh.modifiers[#Skin] (getnodebyname (bonexfer[bonexfer.count])) 1 - --don't ask me why you have to do this twise to get it to work - skinOps.LoadEnvelope mesh.modifiers[#Skin] (crytools.cryTemp + "tests.env") - skinOps.LoadEnvelope mesh.modifiers[#Skin] (crytools.cryTemp + "tests.env") - - --flip the skeleton back - if leaveSkel == false then - ( - in coordsys world rotate root (eulerangles -x -y -z) - ) -) -rotBind = undefined - -crytools.polyStats = fn polyStats = -( - try - ( - if selection.count == 0 then - ( - return #(0,0,0) - ) - - totalFace = 0 - totalEdge = 0 - totalVert = 0 - - for obj in selection do - ( - totalFace += obj.mesh.numfaces - totalEdge += obj.mesh.edges.count - totalVert += obj.mesh.numverts - ) - - return #(totalFace,totalEdge,totalVert) - ) - catch(return #(0,0,0)) -) -polystats = undefined - -crytools.closestpoint = fn closestpoint point1 obj = -( - try - ( - local posArr = #() - for i = 1 to (polyOp.getNumVerts obj) do - ( - local vPos = polyOp.getVert obj i - append posArr vPos - ) - local sPosArr = #() - for i in posArr do - ( - local distX = distance point1 i - append sPosArr distX - ) - local minDistance = amin sPosArr - local minVert = findItem sPosArr (minDistance) - return minVert - ) - catch() -) -closestpoint = undefined - -crytools.nodes2bones = fn nodes2bones node = -( - try - ( - if node.children != undefined then - ( - newBones = #() - - for obj in (append (crytools.getchildren node) node) do - ( - for child in obj.children do - ( - if child.children != undefined then - ( - test = BoneSys.createBone obj.transform.pos child.transform.pos obj.transform[3] - test.name = (obj.name + "_bone") - append newBones test - ) - ) - ) - for obj in newBones do - ( - try (obj.parent = (getnodebyname (((getnodebyname (crytools.cutstring obj.name "_bone")).parent).name + "_bone"))) catch() - ) - ) - ) - catch() -) -nodes2bones = undefined - - ---############################################################################### - --// goes through the timeline and returns the distance largest distance two points move relative to start distance - --// used for looking at mocap stabilization markers ---############################################################################### -crytools.distDiff = fn distDiff pos1 pos2 detail: logOut: = -( - distMax = 0 - distMin = 100000 - local minF - local maxF - local stabLog = "" - local origDist = at time animationrange.start (distance pos1 pos2) - - for i=animationrange.start to animationrange.end do - ( - at time i - ( - dist = (distance pos1 pos2) - stabLog += (i as string+ "_" + (origDist - dist) as string + "\n") - if dist < distMin then - ( - distMin = dist - minF = i - ) - if dist > distMax then - ( - distMax = dist - maxF = i - ) - ) - ) - print (distmax as string + " " + distmin as string) - if logOut == true and detail == true then - ( - return #((distmax-distmin),minF,maxF, stabLog) - ) - else if detail = true then - ( - return #((distmax-distmin),minF,maxF) - ) - else - ( - return (distmax-distmin) - ) -) -distDiff = undefined - -cryTools.lookatPos = fn lookAtObj obj1 pos obj1axis = -( - local objDir - case obj1axis of - ( - 1: objDir = obj1.transform[1] - 2: objDir = obj1.transform[2] - 3: objDir = obj1.transform[3] - ) - theAngle = (acos(dot (normalize objDir) (normalize (pos - obj1.pos)))) - theAxis = (cross (normalize objdir) (normalize (pos - obj1.pos))) - rotAngle = angleAxis theAngle theAxis - rotate obj1 rotAngle -) -lookAtObj = undefined - ---############################################################################### - --// finds the intersection of three planes, returns undefined if any 2 or all 3 are parallel ---############################################################################### -crytools.threePlaneInter = fn threePlaneInter p1 p2 p3 selectPlanes: = -( - local d1 = (dot p1.dir p1.pos ) - local d2 = (dot p2.dir p2.pos ) - local d3 = (dot p3.dir p3.pos ) - - local num = ((d1 * (cross p2.dir p3.dir)) + (d2 * (cross p3.dir p1.dir)) + (d3 * (cross p1.dir p2.dir))) - local denom = (dot p1.dir (cross p2.dir p3.dir)) - - print ("num " + num as string) - print ("denom " + denom as string) - if (abs denom) < 0.0001 then (return undefined) - - if selectPlanes == true then - ( - selectMe = #(p1,p2,p3) - select selectMe - ) - return (num / denom) -) -threePlaneInter = undefined - - ---############################################################################### - --// returns an average of elements in an array ---############################################################################### -crytools.avgArray = fn avgArray arrayIn nodePos: = -( - try (arrayIn.count)catch(return undefined) - - if arrayIn.count == 1 then - ( - if nodePos == true then (return arrayIn[1].pos)else(return arrayIn[1]) - ) - - if nodePos == true then - ( - n = arrayIn[1].pos - for i = 2 to arrayIn.count do - ( - n += arrayIn[i].pos - ) - return (n/arrayIn.count) - ) - else - ( - n = arrayIn[1] - - for i = 2 to arrayIn.count do - ( - n += arrayIn[i] - ) - return (n/arrayIn.count) - ) -) -avgArray = undefined - - ---############################################################################### - --// sorts the array depending the hierarchy ---############################################################################### -cryTools.sortRootChildren = function sortRootChildren nodeArray = -( - try local tempParent = getNodeByName nodeArray[1].name - catch local tempParent = getNodeByName nodeArray[1] - - while tempParent.parent != undefined do - ( - enableEscape = true - tempParent = tempParent.parent - ) - - local root = tempParent - - nodeAllArray = #(root) - join nodeAllArray (cryTools.getChildren root) - - try - ( - for i = 1 to nodeArray.count do - nodeArray[i] = nodeArray[i].name - )catch() - - - - for i = 1 to nodeAllArray.count do - nodeAllArray[i] = nodeAllArray[i].name - - local notParentedArray = #() - - - for i = 1 to nodeAllArray.count do - ( - if findItem nodeArray nodeAllArray[i] == 0 then - nodeAllArray[i] = undefined - ) - - for i = 1 to nodeArray.count do - if findItem nodeAllArray nodeArray[i] == 0 then - append notParentedArray nodeArray[i] - - local resultArray = #() - - for i = 1 to nodeAllArray.count do - if nodeAllArray[i] != undefined then - append resultArray nodeAllArray[i] - - join resultArray notParentedArray - - return resultArray - -) -sortRootChildren = undefined - - - - -cryTools.generateMenu = fn generateMenu = -( - try (menuMan.unRegisterMenu (menuMan.findMenu "CryTools") ) catch() - - local mainMenuBar = menuMan.getMainMenuBar() - local subMenu = menuMan.createMenu "CryTools" - local subMenuItem = menuMan.createSubMenuItem "CryTools" subMenu - - mainMenuBar.addItem subMenuItem (mainMenuBar.numItems() - 1) - menuMan.updateMenuBar() - - local mainMenuBar = menuMan.getMainMenuBar() - local subMenu = menuMan.findMenu "CryTools" - - local addBar = menuMan.createActionItem "CryAnimation" "CryTools" - subMenu.addItem addBar -1 - - - local addBar = menuMan.createActionItem "CryArtistTools" "CryTools" - subMenu.addItem addBar -1 - local addBar = menuMan.createActionItem "CryMorphManager" "CryTools" - subMenu.addItem addBar -1 - local addBar = menuMan.createActionItem "CryRigging" "CryTools" - subMenu.addItem addBar -1 - local addBar = menuMan.createActionItem "CryInfo" "CryTools" - subMenu.addItem addBar -1 - local addBar = menuMan.createActionItem "SceneBrowser" "CryTools" - subMenu.addItem addBar -1 - - seperator = menuMan.createSeparatorItem() - subMenu.addItem seperator -1 - - --local addBar = menuMan.createActionItem "UpdateTools" "CryTools" - --subMenu.addItem addBar -1 - local addBar = menuMan.createActionItem "ControlPanel" "CryTools" - subMenu.addItem addBar -1 - local addBar = menuMan.createActionItem "CrytoolsDocs" "CryTools" - subMenu.addItem addBar -1 - local addBar = menuMan.createActionItem "OnlineDocumentation" "CryTools" - subMenu.additem addBar -1 - - menuMan.updateMenuBar() -) -generateMenu = undefined - - - - -cryTools.setupMacros = fn setupMacros = -( - MacroScript UpdateTools category:"CryTools" tooltip:"Reload/Update Cry Tools" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\UpdateTools.ms") - ) - MacroScript CryAnimation category:"CryTools" tooltip:"Animation Tools" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - ( - try - ( - if cryTools.loadoldanimtools == false then - ( - if cryTools.cryAnim != undefined then - ( - undo off - cryTools.cryAnim.UI.main._f.callDialog() - ) - ) - else - ( - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryAnimationTools.ms") - ) - )catch( messageBox "Error loading cryAnimation" ) - ) - ) - MacroScript CryArtistTools category:"CryTools" tooltip:"Artist Tools" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryArtistTools.ms") - ) - MacroScript CryMorphManager category:"CryTools" tooltip:"Facial Morph Tool" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryMorphTools.ms") - ) - MacroScript CryRigging category:"CryTools" tooltip:"Riging Tools" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryRiggingTools.ms") - ) - MacroScript SceneBrowser category:"CryTools" tooltip:"Scene Browser" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\SceneBrowser.ms") - ) - MacroScript CryInfo category:"CryTools" tooltip:"Add File Info" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryInfo.ms") - ) - MacroScript CryInfoLoader category:"CryTools" tooltip:"Auto-loads cryInfo" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryInfoLoader.ms") - ) - MacroScript ControlPanel category:"CryTools" tooltip:"Diagnostics//Preferences" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\Diagnostics.ms") - ) - MacroScript CrytoolsDocs category:"CryTools" tooltip:"Launch Help" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - shellLaunch (crytools.BuildPathFull + "Tools\\maxscript\\docs\\index.html") "" --Changed by Ruben "rubenst" Steinbacher, from Crytek internal path to the docs delivered with SDK - ) - --Added by Ruben "rubenst" Steinbacher - MacroScript OnlineDocumentation category:"CryTools" tooltip:"Launch Official CryENGINE2 Docu - Asset Creation Manual (Online)" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - shellLaunch "http://doc.crymod.com/AssetCreation/" "" - ) - --Added by Glen Schulz: - MacroScript CryMakeBlendShader category:"CryTools" tooltip:"Make DirectX Blend Shader from Max material" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryMakeBlendShader.ms") - ) - - -- Keybindings - MacroScript preserveUV category:"CryKeys" tooltip:"preserveUV" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\preserveUVs.ms") - ) - MacroScript centerPivot category:"CryKeys" tooltip:"centerPivot" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\centerPivot.ms") - ) - MacroScript resetXformCollapse category:"CryKeys" tooltip:"resetXformCollapse" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\resetXformCollapse.ms") - ) - MacroScript exportNodes category:"CryKeys" tooltip:"exportNodes" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\exportNodes.ms") - ) - MacroScript exportAnim category:"CryKeys" tooltip:"exportAnim" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\exportAnim.ms") - ) - MacroScript AddToExportList category:"CryKeys" tooltip:"AddToExportList" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\AddToExportList.ms") - ) - MacroScript UVcollapseVertical category:"CryKeys" tooltip:"UV Collapse Vertical" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\UVcollapseVertical.ms") - ) - MacroScript UVcollapseHorizontal category:"CryKeys" tooltip:"UV Collapse Horizontal" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\UVcollapseHorizontal.ms") - ) - MacroScript UVscaleUniform category:"CryKeys" tooltip:"UV Scale Uniform" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\UVscaleUniform.ms") - ) - MacroScript changeRefCoordSys category:"CryKeys" tooltip:"Change Reference Coordinate System" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\changeRefCoordsys.ms") - ) - MacroScript showVertexColors category:"CryKeys" tooltip:"Show/Hide Vertex Colors" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\showVertexColors.ms") - ) - MacroScript showVertexAlpha category:"CryKeys" tooltip:"Show/Hide Vertex Alpha" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\showVertexAlpha.ms") - ) - MacroScript collapseByLoc category:"CryKeys" tooltip:"MorphTools: Collapse" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\collapseByLoc.ms") - ) - MacroScript LimERing category:"CryKeys" tooltip:"Limited Edge/Vert Ring" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\LimERing.ms") - ) - MacroScript LimELoop category:"CryKeys" tooltip:"Limited Edge/Vert/Poly Loop" - ( - on isVisible do - ( - if cryTools != undefined then - return true - else - return false - ) - - on execute do - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\LimELoop.ms") - ) -) -setupMacros = undefined - - - - -cryTools.setupVars = fn setucpVars = -( - crytools.maxDirTxt = maxDirTxt_crytools - cryTools.cryINI = cryINI_crytools - cryTools.editorPath = editorPath_crytools - cryTools.BuildPathFull = BuildPathFull_crytools - cryTools.perforcePath = cryTools.getPerforcePath() - cryTools._fnStore = #() - cryTools._fnStoreIndex = #() - cryTools._varStore = #() - cryTools._varStoreIndex = #() - crytools.cryExportPresent = false - - cryTools.PreExportWarnings = #() - - --set vars because, well, yeah - crytools.reparenttwist = false - crytools.suppresswarnings = false - crytools.warnmats = false - crytools.nounparentw = false - crytools.texturesOK = true - - if (cryTools.existDir (sysInfo.tempDir + "cry_temp")) == false then - cryTools.scmd ("MKDIR \"" + sysInfo.tempDir + "cry_temp\"") true - - buildpatharray = filterstring crytools.BuildPathFull "\\" - crytools.project_name = buildpatharray[buildPathArray.count] - print (crytools.project_name + " is set as current project.") - - print "Retrieving list of latest builds from \\\\Storage\\builds" - - if doesfileexist "\\\\storage\\builds\\procedurally_generated_builds" == true then - ( - if doesfileexist (crytools.BuildPathFull + "tools\maxscript\scmd.exe") != false then - crytools.scmd ("DIR \\\\storage\\builds\\procedurally_generated_builds\\ /B /O-D > \"" + sysInfo.tempDir + "cry_temp\\crytools.latest_builds.txt\"") true - - sleep .7 - ) - else - ( - crytools.latestbuildnumber = "NET_ERROR" - crytools.latest_build = "NET_ERROR" - ) - - if crytools.latestbuildnumber != "NET_ERROR" then - ( - if doesfileexist (sysInfo.tempDir + "cry_temp\\crytools.latest_builds.txt") == true then - ( - if doesfileexist "\\\\storage\\builds\\procedurally_generated_builds" != true then - ( - print "Cannot find \\\\storage\\builds\\procedurally_generated_builds\\" - return undefined - ) - latest_build_list = openFile (sysInfo.tempDir + "cry_temp\\crytools.latest_builds.txt") - crytools.latest_build = (readline latest_build_list) - if crytools.latest_build == "TempBuildCopy" then - ( - skipToNextLine latest_build_list - crytools.latest_build = (readline latest_build_list) - ) - if crytools.latest_build == "MP" then - ( - skipToNextLine latest_build_list - crytools.latest_build = (readline latest_build_list) - ) - if crytools.latest_build == "TempBuildCopy" then - ( - skipToNextLine latest_build_list - crytools.latest_build = (readline latest_build_list) - ) - buildnumberArray = filterstring crytools.latest_build "()" - crytools.latestbuildnumber = buildnumberArray[2] - close latest_build_list - ) - ) - - - - if (doesfileexist (sysInfo.tempDir + "cry_temp\\hash.txt")) == true then - ( - deleteFile (sysInfo.tempDir + "cry_temp\\hash.txt") - ) - - - print crytools.BuildPathFull - if doesfileexist ((crytools.BuildPathFull + "Code_Changes.txt")) == false then - ( - print "Code_Changes.txt cannot be found in your build directory" - ) - else - ( - perf_path = (crytools.BuildPathFull + "Code_Changes.txt") - perf_changes = openFile perf_path - skipToString perf_changes "in Build " - local_build_line = (readLine perf_changes) - local_buildArray = (filterString local_build_line "-") - crytools.localBuildNumber = local_buildArray[1] - ) - - cryTools.cbapath = cryTools.buildpathfull + "Game\\Animations\Animations.cba" - - --get the crytools.DOMAIN - cryTools.DOMAIN = cryTools.inFromINI "CryTools" "domain" - if cryTools.DOMAIN == "" then (cryTools.outToINI "CryTools" "DOMAIN" (cryTools.getDNS()) ; cryTools.DOMAIN = cryTools.getDNS()) - - --get crytools.warnmats - cryTools.warnmats = cryTools.inFromINI "CryTools" "warnmats" - if cryTools.warnmats == "" then (cryTools.outToINI "CryTools" "warnmats" "true" ; cryTools.warnmats = true) - else if cryTools.warnmats == "true" then cryTools.warnmats = true else cryTools.warnmats = false - - --get crytools.reparenttwist - cryTools.reparenttwist = cryTools.inFromINI "CryTools" "reparent" - if cryTools.reparenttwist == "" then (cryTools.outToINI "CryTools" "reparent" "true" ; cryTools.reparenttwist = true) - else if cryTools.reparenttwist == "true" then cryTools.reparenttwist = true else cryTools.reparenttwist = false - - --get crytools.suppresswarnings - cryTools.suppresswarnings = cryTools.inFromINI "CryTools" "suppress" - if cryTools.suppresswarnings == "" then (cryTools.outToINI "CryTools" "suppress" "false" ; cryTools.suppresswarnings = false) - else if cryTools.suppresswarnings == "true" then cryTools.suppresswarnings = true else cryTools.suppresswarnings = false - - --get unParentW - cryTools.nounparentw = cryTools.inFromINI "CryTools" "no_unparent_weapons" - if cryTools.nounparentw == "" then (cryTools.outToINI "CryTools" "no_unparent_weapons" "true" ; cryTools.nounparentw = true) - else if cryTools.nounparentw == "true" then cryTools.nounparentw = true else cryTools.nounparentw = false - - --get crytools.showSplash - cryTools.showSplash = cryTools.inFromINI "CryTools" "splash" - if cryTools.showSplash == "" then (cryTools.outToINI "CryTools" "splash" "true" ; cryTools.showSplash = true) - else if cryTools.showSplash == "true" then cryTools.showSplash = true else cryTools.showSplash = false - - --get ActivateAnimTools - cryTools.loadOldAnimTools = cryTools.inFromINI "CryTools" "loadOld_animTools" - if cryTools.loadOldAnimTools == "" then (cryTools.outToINI "CryTools" "loadOld_animTools" "false" ; cryTools.loadOldAnimTools = false) - else if cryTools.loadOldAnimTools == "true" then cryTools.loadOldAnimTools = true else cryTools.loadOldAnimTools = false - - --get crytools.checkbeforeexport - cryTools.checkbeforeexport = cryTools.inFromINI "CryTools" "checkExport" - if cryTools.checkbeforeexport == "" then (cryTools.outToINI "CryTools" "checkExport" "true" ; cryTools.checkbeforeexport = true) - else if cryTools.checkbeforeexport == "true" then cryTools.checkbeforeexport = true else cryTools.checkbeforeexport = false -) -setupVars = undefined - - - - -cryTools.setupCallbacks = fn setupCallbacks = -( - --cryinfo callback - callbacks.removescripts id:#setMacros - callbacks.addscript #filePostOpen ("macros.run \"CryTools\" \"CryInfoLoader\"") id:#setMacros - --sliderMan callback - callbacks.removescripts id:#sliderManCall - callbacks.addScript #selectionSetChanged "crytools.sliderMan()" id:#sliderManCall - --update menu - callbacks.removescripts id:#updateMenu - callbacks.addscript #preSystemShutdown ("try (menuMan.unRegisterMenu (menuMan.findMenu \"CryTools\") ) catch()") id:#updateMenu - - -) -setupCallbacks = undefined - - - - -cryTools.setupPlugins = fn setupPlugins = -( - cryTools.maxVersionNum = (maxVersion())[1] / 1000 - print ("Loading CryTools for Max" + cryTools.maxVersionNum as String) - - -- See if cryExport is in the plugins folder - case crytools.maxVersionNum of - ( - 7: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport7.dlu") == true then ( crytools.cryExportPresent = true ) - 8: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == true then ( crytools.cryExportPresent = true ) - 9: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport9.dlu") == true or doesfileexist (crytools.maxDirTxt + "plugins\\CryExport9_64.dlu") then ( crytools.cryExportPresent = true ) - 10: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport10.dlu") == true or doesfileexist (crytools.maxDirTxt + "plugins\\CryExport10_64.dlu") then ( crytools.cryExportPresent = true ) - ) - - - ------------------------------------------------------------------------------- - --update the loader - ------------------------------------------------------------------------------- - if doesfileexist (crytools.BuildPathFull + "Tools\\maxscript\\LoadCryTools.ms") != false then - ( - newLoader = (crytools.md5 (crytools.BuildPathFull + "Tools\\maxscript\\LoadCryTools.ms")) - oldLoader = (crytools.md5 (crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms")) - if newLoader != oldLoader then - ( - crytools.minusR (getDir #maxroot + "Scripts\\Startup\\LoadCryTools.ms") - if (queryBox "Different CryLoader found in the Build.\n\nDo you want to update the Loader?" title:"CryTools") == true then - ( - cryTools.scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "sctipts\\startup\\LoadCryTools.ms\"") + " " + ("\"" + sysInfo.tempDir + "cry_temp\\\"")) true - cryTools.scmd ("copy /Y " + ("\"" + crytools.BuildPathFull + "Tools\\maxscript\\LoadCryTools.ms\"") + " " + ("\"" + crytools.maxDirTxt + "scripts\\startup\\\"")) true - --messagebox "The cryTools loader has been updated, cryTools will now reload with the updated loader." - print "Updated cryTools loader." - - return true - ) - --return undefined - ) - ) - - - if crytools.maxVersionNum == 7 then - ( - messageBox "Max Version is unsupported for CryTools." title:"Error loading CryTools" - return undefined - ) - - -- Check/Install CryExport8.dlu using the MD5 hash - if crytools.maxVersionNum == 8 then - ( - if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport7.dlu") == true then - ( - messageBox "You have CryExport7.dlu installed when you are running Max 8.\nPlease remove CryExport7 and reinstall cryTools or drop CryExport8 in it's place." - return undefined - ) - - -- check for location of the exporter - if crytools.existfile (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == false then - ( - crytools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\CryExport8.dlu\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true - if crytools.existfile (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == false then - ( - messageBox "I cannot find your CryExport8.dlu.\nIt isn't in your build directory, and it isn't in your plugins folder; what have you done with it?" title: "Error!" - return undefined - ) - ) - - if doesfileexist (crytools.BuildPathFull + "Tools\\CryExport8.dlu") == false then - ( - print ((crytools.BuildPathFull + "Tools\\CryExport8.dlu") + " does not exist!") - ) - else - ( - --check for +r on old cryExport - if doesfileexist (sysInfo.tempDir + "cry_temp\\cryExport8.dlu") == true then - ( - cryTools.scmd ("attrib -r \"" + sysInfo.tempDir + "cry_temp\\cryExport8.dlu\"") true - ) - newCryExport = (crytools.md5 (crytools.BuildPathFull + "Tools\\CryExport8.dlu")) - if crytools.md5 (crytools.maxDirTxt + "plugins\\CryExport8.dlu") != newCryExport then - ( - if crytools.rollback_status == "false" then - ( - if (queryBox "A new version of CryExport8.dlu is available, do you want to synch it?" title:"Update CryExport") == true then - ( - print ("Installing latest CryExport plugin to " + (crytools.maxDirTxt + "plugins\\CryExport8.dlu")) - scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\CryExport8.dlu\"") + " " + ("\"" + sysInfo.tempDir + "cry_temp\\\""))true - scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\CryExport8.dlu\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true - output_rollbackINI = createfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini") - format crytools.rollback_status to: output_rollbackINI - close output_rollbackINI - print ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.") - ) - ) - ) - ) - ) - - -- Check/Install CryExport9.dlu using the MD5 hash - if crytools.maxVersionNum == 9 then - ( - if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == true then - ( - messageBox "You have CryExport8.dlu installed when you are running Max 9.\nPlease remove CryExport8 and reinstall cryTools or drop CryExport9 in it's place." - return undefined - ) - - cryExportName = "CryExport9.dlu" - -- check for location of the exporter - if is64bitApplication != undefined then - ( - if is64bitApplication() == true then - cryExportName = "CryExport9_64.dlu" - ) - - - if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then - ( - cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true - if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then - ( - --messageBox "I cannot find your CryExport9.dlu.\nIt isn't in your build directory, and it isn't in your plugins folder; what have you done with it?" title: "Error!" - print ("Cannot find " + cryExportName) - return undefined - ) - ) - - if doesfileexist (crytools.BuildPathFull + "Tools\\" + cryExportName) == false then - ( - print ((crytools.BuildPathFull + "Tools\\" + cryExportName) + " does not exist!") - --return undefined - ) - else - ( - --check for +r on old cryExport - if doesfileexist (sysInfo.tempDir + "cry_temp\\" + cryExportName) == true then - ( - cryTools.scmd ("attrib -r \"" + sysInfo.tempDir + "cry_temp\\" + cryExportName + "\"") true - ) - newCryExport = (crytools.md5 (crytools.BuildPathFull + "Tools\\" + cryExportName)) - if crytools.md5 (crytools.maxDirTxt + "plugins\\" + cryExportName) != newCryExport then - ( - if crytools.rollback_status == "false" then - ( - print ("Installing latest CryExport plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName)) - cryTools.scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\" + cryExportName +"\"") + " " + ("\"" + sysInfo.tempDir + "cry_temp\\\"")) true - cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true - output_rollbackINI = createfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini") - format crytools.rollback_status to: output_rollbackINI - close output_rollbackINI - ) - --messageBox ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.") title: ((crytools.maxDirTxt + "plugins\\" + cryExportName) + " installed!") - print ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.") - ) - ) - ) - - - - -- Check/Install CryExport9.dlu using the MD5 hash - if crytools.maxVersionNum == 10 then - ( - if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport9.dlu") == true then - ( - messageBox "You have CryExport9.dlu installed when you are running Max 10.\nPlease remove CryExport9 and reinstall cryTools or drop CryExport10 in it's place." - return undefined - ) - - cryExportName = "CryExport10.dlu" - -- check for location of the exporter - if is64bitApplication != undefined then - ( - if is64bitApplication() == true then - cryExportName = "CryExport10_64.dlu" - ) - - - if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then - ( - cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true - if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then - ( - --messageBox "I cannot find your CryExport9.dlu.\nIt isn't in your build directory, and it isn't in your plugins folder; what have you done with it?" title: "Error!" - print ("Cannot find " + cryExportName) - return undefined - ) - ) - - if doesfileexist (crytools.BuildPathFull + "Tools\\" + cryExportName) == false then - ( - print ((crytools.BuildPathFull + "Tools\\" + cryExportName) + " does not exist!") - --return undefined - ) - else - ( - --check for +r on old cryExport - if doesfileexist (sysInfo.tempDir + "cry_temp\\" + cryExportName) == true then - ( - cryTools.scmd ("attrib -r \"" + sysInfo.tempDir + "cry_temp\\" + cryExportName + "\"") true - ) - newCryExport = (crytools.md5 (crytools.BuildPathFull + "Tools\\" + cryExportName)) - if crytools.md5 (crytools.maxDirTxt + "plugins\\" + cryExportName) != newCryExport then - ( - if crytools.rollback_status == "false" then - ( - print ("Installing latest CryExport plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName)) - cryTools.scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\" + cryExportName +"\"") + " " + ("\"" + sysInfo.tempDir+ "cry_temp\\\"")) true - cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true - output_rollbackINI = createfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini") - format crytools.rollback_status to: output_rollbackINI - close output_rollbackINI - ) - --messageBox ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\CryExport9.dlu") + " please restart save your work and restart Max.") title: ((crytools.maxDirTxt + "plugins\\" + cryExportName) + " installed!") - print ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.") - ) - ) - ) - - - - -- Check/Install AutoDesk Physique Maxscript Exposure - if is64bitApplication == undefined then - ( - if getFileSize (crytools.maxDirTxt + "plugins\\IPhysique.gup") != 25088 then - ( - --messageBox ("Installing latest AutoDesk Physique Exposure plugin to "+ (crytools.maxDirTxt + "plugins\\IPhysique.gup") + " please restart save your work and restart Max.") title: ((crytools.maxDirTxt + "plugins\\IPhysique.gup") + " installed!") - print ("Installing latest AutoDesk Physique Exposure plugin to "+ (crytools.maxDirTxt + "plugins\\IPhysique.gup") + " please restart save your work and restart Max.") - cryTools.scmd ("copy /Y \"" + (crytools.BuildPathFull + "Tools\\maxscript\\autoinstall\\IPhysique.gup\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true - ) - else - ( - print "no new cryexport" - ) - ) - - - return false -) -setupPlugins = undefined - - - - -cryTools.setupTools = fn setupTools = -( - cryTools.setupVars() - - - if perforcePath_crytools != undefined then - ( - if doesfileexist (BuildPathFull_crytools + "tools\\maxscript\\md5.exe") == false then - ( - cryTools.scmd ("p4 sync \"" + BuildPathFull_crytools + "Tools\\...\"") true - - print "syncing p4 to get md5.exe" - ) - ) - - - if crytools.showSplash == true then - ( - global crysplash - rollout crySplash "" - ( - label version "Version 2.0" pos:[9,108] - label build "" pos:[160,108] text:"TOOLS LOADING" - - on crySplash lbuttonup position do (destroyDialog crysplash) - ) - bm = (openBitmap (crytools.BuildPathFull + "Tools\\maxscript\\icons\\splash.png")) - createDialog crysplash style:#(#style_border) modal:false bitmap:bm width:bm.width height:bm.height fgcolor:white - - ) - - - - if crytools.showSplash == true then - crysplash.build.text = "ENV CHECK" - - - global loadingResult = cryTools.setupPlugins() - if loadingResult == undefined or loadingResult == true then - return undefined - - cryTools.setupCallbacks() - cryTools.generateMenu() - cryTools.setupMacros() - - if cryTools.loadOldAnimTools == false then - ( - try - ( - filein (crytools.BuildPathFull + "Tools\\maxscript\\cryAnim\\load.ms") - ) - catch ( print "Error loading cryAnim Tools." ) - ) - - - - - - if crytools.showSplash == true then - ( - crysplash.build.text = ("BUILD: " + (crytools.localBuildNumber as string) + "/" + (crytools.latestbuildnumber as string)) - sleep .5 - destroydialog crysplash - ) -) -setupTools = undefined - - ------------------------------------------------------------------------------------------ ---------------------------CHECKING SCENE FOR EXPORT-------------------------- ------------------------------------------------------------------------------------------ - - - -crytools.CheckObjMat = fn CheckObjMat = -( - --crytools.ObjMatOk = true - for obj in csexport.export.get_node_list() do - ( - if crytools.warnmats == true then - ( - if obj.children.count != 0 then - ( - for obj1 in (crytools.getChildren obj) do - ( - if obj1.material == undefined then - ( - if (classof obj1) != Dummy then - ( - append crytools.PreExportWarnings ("There is no defined shader for this object! " + obj1.name) - ) - ) - ) - ) - else - ( - if obj.material == undefined then - ( - if (classof obj) != Dummy then - ( - append crytools.PreExportWarnings ("There is no defined shader for this object! " + obj.name) - ) - ) - ) - - try - ( - if crytools.texturesOK == true then - ( - if obj.children.count != 0 then - ( - for obj1 in (crytools.getChildren obj) do - ( - if (classof obj1) != Dummy then - ( - if obj1.material != undefined then - ( - materials = obj1.material.materialIDlist - for i = 1 to materials.count do - ( - checkme = obj1.material.material[i].shadername - if checkme != "Crytek Shader" then - ( - append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj1.material.material[i].name) - ) - ) - ) - ) - ) - ) - else - ( - if (classof obj) != Dummy then - ( - if obj.material != undefined then - ( - materials = obj.material.materialIDlist - for i = 1 to materials.count do - ( - checkme = obj.material.material[i].shadername - if checkme != "Crytek Shader" then - ( - append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj.material.material[i].name) - ) - ) - ) - ) - ) - ) - ) - catch - ( - if (classof obj) != Dummy then - ( - if obj.material != undefined then - ( - if (classof obj.material) == MultiMaterial then - ( - materials = obj.material.materialList - if materials.count > 0 then - ( - if materials.count > 32 then - ( - append crytools.PreExportWarnings ("material '" + obj.material.name + " has '" + materials.count as string + "' number of submaterials, you may wish to clean the multimaterial using max, its on the utilities menu in the material editor") - ) - - for i = 1 to materials.count do - ( - if i <= 32 then - ( - checkme = obj.material.material[i].shadername - if checkme != "Crytek Shader" then - ( - append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj.material.material[i].name) - ) - ) - ) - ) - ) - else - ( - checkme = obj.material.shadername - if checkme != "Crytek Shader" then - ( - append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj.material.name) - ) - ) - ) - ) - ) - ) - ) -) - -crytools.ReparentTwistBns = fn ReparentTwistBns = -( - if $'Bip01 R ForeTwist' != undefined then - ( - if $'Bip01 R ForeTwist'.parent.name != "Bip01 R Forearm" then - ( - $'Bip01 R ForeTwist'.parent = $'Bip01 R Forearm' - if crytools.suppresswarnings == true then - ( - print "Biped lower arm twist bones reparented." - ) - else - ( - messageBox "Biped lower arm twist bones reparented." - ) - ) - if $'Bip01 L ForeTwist'.parent.name != "Bip01 L Forearm" then - ( - $'Bip01 L ForeTwist'.parent = $'Bip01 L Forearm' - ) - ) - - if $'Bip01 LUpArmTwist' != undefined then - ( - if $'Bip01 LUpArmTwist'.parent.name != "Bip01 L UpperArm" then - ( - $'Bip01 LUpArmTwist'.parent = $'Bip01 L UpperArm' - if crytools.suppresswarnings == true then - ( - print "Biped upper arm twist bones reparented." - ) - else - ( - messageBox "Biped upper arm twist bones reparented." - ) - ) - if $'Bip01 RUpArmTwist'.parent.name != "Bip01 R UpperArm" then - ( - $'Bip01 RUpArmTwist'.parent = $'Bip01 R UpperArm' - ) - ) -) - -crytools.WpnBnUnlink = fn WpnBnUnlink = -( - if $weapon_bone != undefined then - ( - if $weapon_bone.children.count != 0 then - ( - undo "unlinking $weapon_bone children" on - ( - for obj in $weapon_bone.children do - ( - obj.parent = undefined - if crytools.suppresswarnings == true then - ( - print "unlinking $weapon_bone children" - ) - else - ( - messagebox "unlinking $weapon_bone children" - ) - ) - ) - ) - ) -) - -crytools.CheckNodeTm = fn CheckNodeTm = -( - for obj in csexport.export.get_node_list() do - ( - ---check rotation--- - t = obj.rotation - if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then - ( - append crytools.PreExportWarnings ("The object '" + obj.name + "' has a rotation applied to it " + ((obj.rotation as eulerangles) as string) + "\nPlease Reset Xform the object before exporting.") - ) - ---check scale--- - t = obj.scale - [1,1,1] - if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then - ( - append crytools.PreExportWarnings ("The object '" + obj.name + "' has an abnormal scale " + ((obj.scale) as string) + "\nPlease Reset Xform the object before exporting.\nScale should be [1,1,1]") - ) - ) -) - -crytools.CheckNonZeroMorphs = fn CheckNonZeroMorphs = -( - for obj in csexport.export.get_node_list() do - ( - try - ( - for i = 1 to 1000 do - ( - test = obj.morpher[i].name - if test == "- empty -" then - ( - exit loop - ) - if obj.morpher[i].value != 0.0 then - ( - append crytools.PreExportWarnings (test + " has a non zero value! " + "(" + (obj.morpher[i].value as string) + ")") - ) - ) - ) - catch() - ) -) - -crytools.CheckBnScale = fn CheckBnScale = -( - for obj in csexport.export.get_bone_list() do - ( - try - ( - if obj.children.count != 0 then - ( - for obj1 in (crytools.getChildren obj) do - ( - t = obj1.scale - [1,1,1] - if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then - ( - append crytools.PreExportWarnings (obj1.name + " has a scale applied: " + (obj1.scale as string) + "\nPlease reset it's scale before exporting.") - ) - ) - ) - else - ( - t = obj.scale - [1,1,1] - if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then - ( - append crytools.PreExportWarnings (obj.name + " has a non zero scale (" + (obj.scale as string) + ")\nPlease reset it's scale before exporting.") - ) - ) - ) - catch() - ) -) - -crytools.CheckVerts = fn CheckVerts = -( - for obj in csexport.export.get_node_list() do - ( - try - ( - ClsVrts = #() - VertsArr = #() - for x in obj.verts do - ( - Vrts = #(x.index, x.pos.x, x.pos.y, x.pos.z) - append VertsArr Vrts - ) - - fn CompareFN v1 v2 = - ( - local d = (length [v1[2],v1[3],v1[4]]) - (length [v2[2],v2[3],v2[4]]) - case of - ( - (d < 0) : -1 - (d > 0) : 1 - default: 0 - ) - ) - - qsort VertsArr CompareFN - - for x = 1 to VertsArr.count do - ( - if VertsArr[x+1] != undefined then - ( - DiffX = (VertsArr[x+1][2] - VertsArr[x][2]) - if DiffX == 0 then DiffX = 0.001 - if DiffX < 0.08 and DiffX > -0.08 then - ( - DiffY = (VertsArr[x+1][3] - VertsArr[x][3]) - if DiffY == 0 then DiffY = 0.001 - if DiffY < 0.08 and DiffY > -0.08 then - ( - DiffZ = (VertsArr[x+1][4] - VertsArr[x][4]) - if DiffZ == 0 then DiffZ = 0.001 - if DiffZ < 0.08 and DiffZ > -0.08 then - ( - if (distance [VertsArr[x+1][2],VertsArr[x+1][3],VertsArr[x+1][4]] [VertsArr[x][2],VertsArr[x][3],VertsArr[x][4]]) < 0.08 then - ( - Tmp = #() - append Tmp VertsArr[x+1][1] - append Tmp VertsArr[x][1] - append ClsVrts Tmp - ) - ) - ) - ) - ) - ) - if ClsVrts.count != 0 then - ( - SelVerts = #{} - Txt = "" - for x in ClsVrts do - ( - if (FindItem ClsVrts x) == ClsVrts.count then - ( - Txt += (x as string) + ". " - ) - else - ( - Txt += (x as string) + ", " - ) - for num in x do - ( - append SelVerts num - ) - ) - append crytools.PreExportWarnings (obj.name + " has these verts too close to each other: " + Txt + "Please move them further appart.") - if ($.baseobject as string) == "Editable Poly" then - ( - polyop.setVertSelection obj SelVerts - ) - else - ( - SetVertSelection obj SelVerts - ) - ) - ) - catch (print "Object is not a mesh/poly!") - ) -) - --- check scene for export -crytools.CheckSceneForExport = fn CheckSceneForExport = -( - --try - --( - if crytools.checkbeforeexport == false then return true - - crytools.texturesOK = true - crytools.PreExportWarnings = #() - ----------------------Material Check----------------------------------------------- - crytools.CheckObjMat () - ----------------------Vertex Check------------------------------------------------- - crytools.CheckVerts () - -------------------------Reparent--------------------------------------------------- - if crytools.reparenttwist == true then ReparentTwistBns () - ------------------Weapon Bone Unlinking------------------------------------------- - -- check for children of the weapon bone - if crytools.nounparentw == false then WpnBnUnlink () - -----------------check for non zero morphs----------------------------------------- - crytools.CheckNonZeroMorphs () - ---------------check if reset transform needed------------------------------------ - crytools.CheckNodeTm () - ----------------------check bone scale---------------------------------------------- - crytools.CheckBnScale () - -------------------------------------------------------------------------------------- - - if crytools.PreExportWarnings.count != 0 then crytools.texturesOK = false - - if crytools.suppresswarnings == false then - ( - strng = "-------------------ERROR----------------\n" - For x = 1 to (crytools.PreExportWarnings.count-1) do - ( - strng = strng + crytools.PreExportWarnings[x] as string +"\n\n-------------------ERROR----------------\n" - ) - - if cryTools.PreExportWarnings.count > 0 then - messagebox (Strng + crytools.PreExportWarnings[crytools.PreExportWarnings.count] as string) title:"Problem Found!" - ) - - if crytools.texturesOK == false then - ( - return false - --print "bad" - ) - else - ( - return true - --print "good" - ) - --) - --catch (undefined) -) - - - --- register export callback -csexport.export.register_export_callback crytools.CheckSceneForExport - - - - - - -cryTools.setupTools() - -if loadingResult == true then -( - try ( destroyDialog crysplash ) catch() - filein (crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms") - print "Updated CryLoader" -) - -loadingResult = undefined diff --git a/Tools/maxscript/CryAnimationTools.ms b/Tools/maxscript/CryAnimationTools.ms deleted file mode 100644 index c1991c00b1..0000000000 --- a/Tools/maxscript/CryAnimationTools.ms +++ /dev/null @@ -1,2102 +0,0 @@ -------------------------------------------------------------------------------- --- CryAnimationTools.ms --- Version 2.2 External --- by Christopher Evans -------------------------------------------------------------------------------- - -global CryAnimationTools -( - if CryAnimationTools != undefined do ( closerolloutfloater CryAnimationTools ) - CryAnimationTools = newrolloutfloater "CryAnimationTools" 190 800 --450 - - ------------------------------------------------------------------------------- - -- GeneralTools - ------------------------------------------------------------------------------- - rollout generalTools "Baking Animation" - ( - group "CGA Prep" - ( - button makeTCB "Change Rotation to TCB" - button makeTCBpos "Change Position to TCB" - ) - button bakeMotion "Bake Motion to Keys" - group "Bake Rigid Objects to Character" - ( - edittext simStart_txt "Start" fieldWidth:30 - button bakeObjectsToCHR "Bake Objects" offset:[27,-23] - progressbar bakeToChr_prog color:red - ) - - on generalTools open do - ( - simStart_txt.text = animationrange.start.frame as string - ) - - on makeTCB pressed do - ( - for obj in selection do - ( - obj.rotation.controller = tcb_rotation () - ) - ) - - on makeTCBpos pressed do - ( - for obj in selection do - ( - obj.position.controller = tcb_position () - ) - ) - - on bakeMotion pressed do - ( - undo "bakeMotion" on - ( - for t = animationrange.start to animationrange.end do - ( - for obj in selection do - ( - sliderTime = t - max set key on selected - ) - ) - ) - ) - - on bakeObjectsToCHR pressed do - ( - try - ( - undo "bake to chr" on - ( - --with redraw off - --( - animationRange = interval -1f animationRange.end - slidertime = -1 - i = 0 - macros.run "Modifier Stack" "Convert_to_Mesh" - meshObjs = selection as array - proxyObjs = #() - proxyObj = "" - offset = 0 - simStart = (simStart_txt.text as float) - origPos = 0 - origRot = 0 - proxyObj = 0 - - maxops.cloneNodes selection cloneType:#copy newnodes:&copies - - for obj in selection do - ( - --crytools.objTrajectoryToSpline() - newPivot = [0,0,0] - with animate on - ( - origPos = obj.pos - obj.pos = [0,0,0] - origRot = obj.rotation - - obj.rotation = quat 0 0 0 1 - - bbox = (obj.max - obj.min) - newPivot = (obj.pivot - obj.min) - box length:bbox.y width:bbox.x height:bbox.z name:(obj.name + "_bprox") - offset += (20*(obj.max - obj.min).y) - ) - proxyObj = (getnodebyname (obj.name + "_bprox")) - proxyObj.pivot = proxyObj.min + newPivot - proxyObj.pos += (obj.pivot - proxyObj.pivot) - proxyobj.xray = true - - proxyObj.pos.controller = copy obj.pos.controller - proxyObj.rotation.controller = copy obj.rotation.controller - - obj.pos.y = offset - --(getnodebyname (obj.name + "_bprox")).pos.x = ((i*200)) - - append proxyObjs proxyObj - - proxyObj.pos.controller = tcb_position () - - with animate on - ( - proxyObj.rotation = obj.rotation - proxyObj.pos = obj.pos - - slidertime = 0 - proxyObj.rotation = origRot - proxyObj.pos = origPos - ) - slidertime = -1 - - deleteKeys obj #allkeys - - i+=1 - bakeToChr_prog.value += (100.0/selection.count) - ) - - --collapse all objs into one mesh - for obj in meshObjs do - ( - if obj != meshObjs[1] then - ( - attach meshObjs[1] obj - ) - ) - meshObjs[1].name = "ExportCHR" - - --apply skin modifier to object - select $ExportCHR - slidertime = 0 - modPanel.addModToSelection (Skin ()) ui:on - $ExportCHR.modifiers[#Skin].ref_frame = -1 - slidertime = -1 - - if $root == undefined then - ( - dummy name:"root" pos:[0,0,0] boxsize:[1,1,1] - ) - - - for obj in proxyObjs do - ( - skinOps.addBone $ExportCHR.modifiers[#Skin] obj 1 - ) - - bakeToChr_prog.value = 0 - bakeToChr_prog.color = blue - with redraw off - ( - with animate on - ( - for n = 1 to proxyObjs.count do - ( - for i = 1 to proxyObjs[n].pos.controller.keys.count do - ( - slidertime = proxyObjs[n].pos.controller.keys[i].time - proxyObjs[n].transform = copies[n].transform - ) - bakeToChr_prog.value += (100.0/proxyObjs.count) - ) - ) - ) - - for obj in copies do - ( - delete obj - ) - - - - slidertime = simStart - $root.pos = $ExportCHR.center - animationrange = (interval simStart animationrange.end) - - for obj in proxyObjs do - ( - obj.parent = $root - ) - bakeToChr_prog.value = 0 - bakeToChr_prog.color = red - --) - ) - )catch() - ) - ) - - ------------------------------------------------------------------------------- - -- CryPlantKey - ------------------------------------------------------------------------------- - rollout plantKey "CryPlantKey 1.4" - ( - dropdownlist key_mode "Key Type:" items:#("Planted","Sliding", "Free") - checkbox existingOnly "Only for existing keys" - button begin_btn "Begin" offset:[-55,0] - button end_btn "End " offset:[-55,0] - editText begin_txt fieldWidth:30 offset:[43,-50] - editText end_txt fieldWidth:30 offset:[43,3] - button specific "Use Begin/End" align:#center offset:[0,5] - button range "Use Animation Range" align:#center - - on begin_btn pressed do - ( - escapeenable = true - begin_txt.text = (((currentTime as integer)/TicksPerFrame) as string) - ) - - on end_btn pressed do - ( - end_txt.text = (((currentTime as integer)/TicksPerFrame) as string) - ) - - on range pressed do - ( - - undo "CryPlantKey" on - ( - if existingOnly.checked == false then - ( - if selection.count > 0 then - ( - for t = animationrange.start to animationrange.end do - ( - sliderTime = t - - for i = 1 to selection.count do - ( - try - ( - case key_mode.selection of - ( - 1: biped.setPlantedKey selection[i] - 2: biped.setSlidingKey selection[i] - 3: biped.setFreeKey selection[i] - ) - ) - catch() - - try - ( - case key_mode.selection of - ( - 1: biped.setPlantedKey selection[i] - 2: biped.setSlidingKey selection[i] - 3: biped.setFreeKey selection[i] - ) - ) - catch() - ) - ) - ) - ) - ) - - if existingOnly.checked == true then - ( - if selection.count > 0 then - ( - undo "cryPlantKey" on - ( - for obj in selection do - ( - for i = 1 to obj.transform.controller.keys.count do - ( - sliderTime = obj.transform.controller.keys[i].time - case key_mode.selection of - ( - 1: biped.setPlantedKey obj - 2: biped.setSlidingKey obj - 3: biped.setFreeKey obj - ) - ) - ) - ) - ) - ) - ) - - on specific pressed do - ( - try - ( - start = begin_txt.text as float - stop = end_txt.text as float - - old_start = animationrange.start - old_stop = animationrange.end - animationrange = interval start stop - - if selection.count > 0 then - ( - if existingOnly.checked != true then - ( - undo "cryPlantKey" on - ( - for t = animationrange.start to animationrange.end do - ( - - sliderTime = t - - for i = 1 to selection.count do - ( - try - ( - case key_mode.selection of - ( - 1: biped.setPlantedKey selection[i] - 2: biped.setSlidingKey selection[i] - 3: biped.setFreeKey selection[i] - ) - ) - catch() - - try - ( - case key_mode.selection of - ( - 1: biped.setPlantedKey selection[i] - 2: biped.setSlidingKey selection[i] - 3: biped.setFreeKey selection[i] - ) - ) - catch() - ) - ) - ) - ) - ) - if existingOnly.checked == true then - ( - if selection.count > 0 then - ( - undo "cryPlantKey" on - ( - for obj in selection do - ( - for i = 1 to obj.transform.controller.keys.count do - ( - sliderTime = obj.transform.controller.keys[i].time - case key_mode.selection of - ( - 1: biped.setPlantedKey obj - 2: biped.setSlidingKey obj - 3: biped.setFreeKey obj - ) - ) - ) - ) - ) - ) - animationrange = interval old_start old_stop - )catch() - ) - - -- on plantkey open - on plantkey open do - ( - --get animation tools location - local tempVar = cryTools.inFromINI "CryTools" "anim_pos" - if tempVar == "" then tempVar = [0,77] - else - ( - try - ( - tempVar = execute tempVar - cryanimationtools.pos = tempVar - ) - catch - ( - cryTools.outToINI "CryTools" "anim_pos" "[0,77]" - cryanimationtools.pos = [0,77] - ) - ) - ) - - -- on plantkey closed - on plantkey close do - ( - cryTools.outToINI "CryTools" "anim_pos" (cryanimationtools.pos as String) - ) - ) - - - ------------------------------------------------------------------------------- - -- BipedTools - ------------------------------------------------------------------------------- - rollout bipedtools "BipedTools 1.5" - ( - dropdownlist bipSelect "" items:#("") width:130 offset:[-5,0] - button refreshBipTools "<" offset:[65,-27] tooltip:"Refresh" - button bipmotion "Bip Motion Menu" offset:[-35,0] - button LoadBIP "Load BIP" offset:[47,-26] - checkbutton figuremode "Figure Mode" offset:[-39,0] - checkbutton hidebiped "Hide Biped" offset:[39,-26] - checkbutton inplace "In Place Mode" offset:[-30,0] - checkbutton inplacex "X" offset:[29,-26] - checkbutton inplacey "Y" offset:[57,-26] - button selectAllBip "Select Only Biped Bones" - button clampTimeline "Clamp Timeline->" tooltip:"Clamp timeline at current key" offset:[-35,0] - button clampTimelineKey "At Last Key" tooltip:"Clamp timeline at last keyframe" offset:[50,-26] - button reverseAnim "Reverse Animation to FBX Skel" - spinner start "Start " range:[-10000,10000,0] type:#integer scale:1 fieldWidth:40 offset:[-80,0] - spinner end "End " range:[-10000,10000,100] type:#integer scale:1 fieldWidth:40 offset:[0,-20] - button FBXBIP "Attach Biped to FBX Skeleton" - button deleteFBX " Delete FBX Skeleton " - - group "Collections" - ( - button loadCollections "Load Pose Collections" enabled:false - checkbox getLatest "Latest (P4)" enabled:false - checkbox overwriteCollections "Overwrite" offset:[80,-20] enabled:false - ) - - -- on bipselect selected do - on bipSelect selected s do - ( - print (bipSelect.items[s] + " selected.") - selectedBip = ("$'" + bips[s].name + "'") - global biped_ctrl = (execute (selectedBip + ".controller")) - ) - - --on refreshbiptools pressed - on refreshBipTools pressed do - ( - try - ( - global bips = (crytools.getBips()) - global namearr = #() - for i=1 to bips.count do - ( - append namearr bips[i].name - ) - bipSelect.items = namearr - global selectedBip = ("$'" + bips[1].name + "'") - global biped_ctrl = (execute (selectedBip + ".controller")) - - start.value = animationrange.start - end.value = animationrange.end - )catch() - ) - - -- on biped tools open - on bipedtools open do - ( - if $bip01 != undefined then - ( - bip_layer = LayerManager.getLayerFromName "Bip" - - if bip_layer != undefined then - ( - if bip_layer.ishidden == true then - ( - hideBiped.checked = true - ) - ) - - biped_ctrl=$bip01.controller - if biped_ctrl.figureMode == true then - ( - figureMode.checked = true - ) - else - ( - figureMode.checked = false - ) - ) - - overwritecollections.checked = true - getlatest.checked = true - - --callbacks - figureSet = "if $bip01.controller.figureMode == true then (CryAnimationTools.rollouts[2].figureMode.checked = true) else (CryAnimationTools.rollouts[2].figureMode.checked = false)" - callbacks.addscript #filePostOpen figureSet id:#figureMode - - BIPhideSet = "bip_layer = LayerManager.getLayerFromName \"Bip\" ; if bip_layer.ishidden == true then (CryAnimationTools.rollouts[2].hideBiped.checked = true) else (CryAnimationTools.rollouts[2].hideBiped.checked = false)" - callbacks.addscript #filePostOpen BIPhideSet id:#bipHide - - --get bips - if $Bip01 != undefined then - ( - global bips = (crytools.getBips()) - namearr = #() - for i=1 to bips.count do - ( - append namearr bips[i].name - ) - bipSelect.items = namearr - global selectedBip = ("$'" + bips[1].name + "'") - global biped_ctrl = (execute (selectedBip + ".controller")) - ) - - start.value = animationrange.start - end.value = animationrange.end - ) - - -- load bip - on LoadBIP pressed do - ( - LoadBIP_file = getOpenFileName types:"BIP(*.bip)" - if LoadBIP_file == undefined then - ( - return undefined - ) - animationrange = (interval 0f 1f) - biped_ctrl= (execute (selectedBip + ".controller")) - biped.loadBipFile biped_ctrl LoadBIP_file - ) - - -- bip motion menu button - on bipMotion pressed do - ( - try - ( - select (execute (selectedBip)) - max motion mode - ) - catch - ( - messageBox "Please load a biped." title:"Error" - return undefined - ) - ) - - - -- figure mode button - on figureMode changed state do - ( - try - if (figureMode.checked == true) then - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.figureMode = true - ) - else - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.figureMode = false - ) - catch - ( - messageBox "Please load a biped." title:"Error" - figuremode.Checked = false - return undefined - ) - ) - - -- hide biped button - on hideBiped changed state do - ( - try - ( - if (hideBiped.checked == true) then - ( - bip_layer = LayerManager.getLayerFromName "Bip" - bip_layer.ishidden = true - ) - else - ( - bip_layer = LayerManager.getLayerFromName "Bip" - bip_layer.ishidden = false - ) - ) - catch - ( - messageBox "Cannot find 'Biped' layer." title:"Error" - return undefined - ) - ) - - -- in place mode button - on inPlace changed state do - ( - try - if (inPlace.checked == true) then - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlaceMode = true - ) - else - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlaceMode = false - biped_ctrl.inplacexmode = false - biped_ctrl.inplaceymode = false - inplacex.checked = false - inplacey.checked = false - ) - catch - ( - messageBox "Please load a biped, or take the biped out of figure mode." title:"Error" - return undefined - ) - ) - - on inplacex changed state do - ( - try - ( - if (inPlacex.checked == true) then - ( - if inplace.checked == false then - ( - inplace.checked = true - ) - if inplacey.checked == true then - ( - inplacey.checked = false - ) - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlacexMode = true - ) - else - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlacexMode = false - if inplace.checked == true then - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlaceMode = true - ) - ) - )catch() - ) - - on inplacey changed state do - ( - try - ( - if (inPlacey.checked == true) then - ( - if inplace.checked == false then - ( - inplace.checked = true - ) - if inplacex.checked == true then - ( - inplacex.checked = false - ) - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlaceyMode = true - ) - else - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlaceyMode = false - if inplace.checked == true then - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.inPlaceMode = true - ) - ) - )catch() - ) - - -- select all biped bones - - on selectAllBIP pressed do - ( - try - ( - if selectedBip != "$'Bip01'" then - ( - messagebox "sorry, only works with bip01 for now!" - return undefined - ) - select $Bip01 - selectmore $'Bip01 Pelvis' - selectmore $'Bip01 L Thigh' - selectmore $'Bip01 L Calf' - selectmore $'Bip01 L Foot' - selectmore $'Bip01 L Toe0' - selectmore $_Bip01LToeHelper - selectmore $'Bip01 R Thigh' - selectmore $'Bip01 R Calf' - selectmore $'Bip01 R Foot' - selectmore $'Bip01 R Toe0' - selectmore $_Bip01RToeHelper - selectmore $'Bip01 Spine' - selectmore $'Bip01 Spine1' - selectmore $'Bip01 Spine2' - selectmore $'Bip01 Spine3' - selectmore $'Bip01 Neck' - selectmore $'Bip01 Head' - selectmore $'Bip01 L Clavicle' - selectmore $'Bip01 L UpperArm' - selectmore $'Bip01 L Forearm' - selectmore $'Bip01 L Hand' - selectmore $'Bip01 L Finger0' - selectmore $'Bip01 L Finger01' - selectmore $'Bip01 L Finger02' - selectmore $'_Bip01 L Finger0Nub' - selectmore $'Bip01 L Finger1' - selectmore $'Bip01 L Finger11' - selectmore $'Bip01 L Finger12' - selectmore $'_Bip01 L Finger1Nub' - selectmore $'Bip01 L Finger2' - selectmore $'Bip01 L Finger21' - selectmore $'Bip01 L Finger22' - selectmore $'_Bip01 L Finger2Nub' - selectmore $'Bip01 L Finger3' - selectmore $'Bip01 L Finger31' - selectmore $'Bip01 L Finger32' - selectmore $'_Bip01 L Finger3Nub' - selectmore $'Bip01 L Finger4' - selectmore $'Bip01 L Finger41' - selectmore $'Bip01 L Finger42' - selectmore $'_Bip01 L Finger4Nub' - selectmore $'Bip01 L ForeTwist' - selectmore $'Bip01 L ForeTwist1' - selectmore $'Bip01 L ForeTwist2' - selectmore $'Bip01 R Clavicle' - selectmore $'Bip01 R UpperArm' - selectmore $'Bip01 R Forearm' - selectmore $'Bip01 R Hand' - selectmore $'Bip01 R Finger0' - selectmore $'Bip01 R Finger01' - selectmore $'Bip01 R Finger02' - selectmore $'_Bip01 R Finger0Nub' - selectmore $'Bip01 R Finger1' - selectmore $'Bip01 R Finger11' - selectmore $'Bip01 R Finger12' - selectmore $'_Bip01 R Finger1Nub' - selectmore $'Bip01 R Finger2' - selectmore $'Bip01 R Finger21' - selectmore $'Bip01 R Finger22' - selectmore $'_Bip01 R Finger2Nub' - selectmore $'Bip01 R Finger3' - selectmore $'Bip01 R Finger31' - selectmore $'Bip01 R Finger32' - selectmore $'_Bip01 R Finger3Nub' - selectmore $'Bip01 R Finger4' - selectmore $'Bip01 R Finger41' - selectmore $'Bip01 R Finger42' - selectmore $'_Bip01 R Finger4Nub' - selectmore $'Bip01 R ForeTwist' - selectmore $'Bip01 R ForeTwist1' - selectmore $'Bip01 R ForeTwist2' - selectmore $'_Bip01 HeadNub' - )catch() - ) - - -- on clampTimeline pressed - on clampTimeline pressed do - ( - try ( animationrange = interval animationrange.start slidertime ) catch() - ) - - -- clampTimelineKey - on clampTimelineKey pressed do - ( - if $ != undefined then - ( - try - ( - animationrange = interval animationrange.start $.controller.keys[$.controller.keys.count].time - ) - catch - ( - messagebox "Max returned a -1 value and Biped does not support this.\nPlease select another object." - ) - ) - else - ( - messagebox "select an animated object" - ) - ) - - - -- FBX to BIP - on FBXBIP pressed do - ( - filein (crytools.BuildPathFull + "Tools\\maxscript\\FBX_Bones_to_Bip.ms") - ) - - on loadCollections pressed do - ( - if getLatest.checked == true then - ( - p4Update = ("p4 sync J:\\" + crytools.project_name + "_Production\\Art\\Animation\\Human\\Resources\\poses\\...") - crytools.scmd p4Update true - ) - try - ( - if $bip01 != undefined then - ( - biped_ctrl = (execute (selectedBip + ".controller")) - if overwritecollections.checked == true then - ( - biped.deleteallcopycollections biped_ctrl - ) - biped.loadCopyPasteFile biped_ctrl "J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male.cpy" - biped.loadCopyPasteFile biped_ctrl "J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_female.cpy" - biped.loadCopyPasteFile biped_ctrl "J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_combat.cpy" - biped.loadCopyPasteFile biped_ctrl "J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_crouch.cpy" - biped.loadCopyPasteFile biped_ctrl "J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_prone.cpy" - biped.loadCopyPasteFile biped_ctrl "J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_relaxed.cpy" - biped.loadCopyPasteFile biped_ctrl "J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_stealth.cpy" - ) - ) - catch - ( - messagebox "Cannot locate pose files" - ) - ) - - on reverseAnim pressed do - ( - try - ( - original = #() - newBones =#() - disablesceneredraw() - select (execute (selectedBip)) - biped_ctrl = $.controller - if biped_ctrl.figureMode == true then - ( - messagebox "Please leave FigureMode" - ) - - select (execute (selectedBip + "...*")) - selectionSets ["original"] = selection - - for i in selection do - ( - append original i - b = snapshot i name:("_" + (i.name as string)) - b.parent = undefined - b.transform = i.transform - b.position.track = bezier_position() - b.rotation.track = euler_xyz() - append newBones b - ) - selectionSets ["newBones"] = newBones - - for i in 1 to newBones.count do - ( - newBones[i].position.track = bezier_position() - newBones[i].rotation.track = euler_xyz() - ) - animate on - undo "match animation" on - ( - for t in start.value to end.value do at time t - ( - for i in 1 to newBones.count do - ( - newBones[i].transform = original[i].transform - --reverseTime newBones[i].transform.controller start.value end.value #incLeft #incRight - --scaleTime newBones[i].transform.controller start.value end.value -1 - --movekeys newBones[i].transform.controller ((animationrange.end) - (animationrange.start)) - --newBones[i].transform.controller.keys.time += ((start.value) - (end.value)) - ) - ) - for i in 1 to newBones.count do - ( - scaleTime newBones[i].transform.controller start.value end.value -1 - movekeys newBones[i].transform.controller ((animationrange.end) - (animationrange.start)) - ) - ) - - /*undo "reparent" on - ( - for i in 1 to newBones.count do - ( - try - ( - newBones[i].parent = execute ("$'_" + original[i].parent.name + "'") - ) - catch() - ) - )*/ - enablesceneredraw() - redrawviews() - )catch() - ) - - on deleteFBX pressed do - ( - try - ( - undo "remove FBX skel" on - ( - for i in 1 to selectionSets[#newbones].count do - ( - selectmore selectionSets[#newbones][i] - --max delete - ) - max delete - ) - )catch() - ) - - on bipedTools close do - ( - callbacks.removescripts #filePostOpen id:#figureMode - callbacks.removescripts #filePostOpen id:#bipHide - ) - - ) - - ------------------------------------------------------------------------------- - -- Rig Navigator - ------------------------------------------------------------------------------- - rollout bipSelect "Crysis Rig Navigator" - ( - activeXControl crysisBipHtml "http://www.crytek.com" width:168 height:430 pos:[2,3] - - on bipSelect open do - ( - crysisBipHtml.navigate (crytools.BuildPathFull + "Tools\\maxscript\\bipSelect\\bipselect.html") - ) - on crysisBipHtml titlechange txt do - ( - case txt of - ( - "Bip01 Head":( try (select (biped.getNode biped_ctrl 11 link:1)) ; catch() ) - "Bip01 L ForeArm":( try (select ( biped.getNode biped_ctrl 1 link:3 )) ; catch() ) - "Bip01 R Forearm": (select ( biped.getNode biped_ctrl 2 link:3)) --; catch() ) - "Bip01 R UpperArm":( try (select ( biped.getNode biped_ctrl 2 link:2)) ; catch() ) - "Bip01 L Thigh":( try (select ( biped.getNode biped_ctrl 5)) ; catch() ) - "Bip01 R Thigh":( try (select ( biped.getNode biped_ctrl 6 )) ; catch() ) - "Bip01 R Knee":( try (select $'Bip01 R Knee') ; catch() ) - "Bip01 L Knee":( try (select $'Bip01 L Knee') ; catch() ) - "Bip01":( try (select (execute(selectedBip))) ; catch() ) - "Bip01 Pelvis":( try (select ( biped.getNode biped_ctrl 12)) ; catch() ) - "Bip01 L UpperArm":( try (select ( biped.getNode biped_ctrl 1 link:2 ) ) ; catch() ) - "Bip01 Spine":( try (select (biped.getNode biped_ctrl 9 link:1)) ; catch() ) - "Bip01 Spine3":( try (select (biped.getNode biped_ctrl 9 link:4)) ; catch() ) - "Bip01 Spine1":( try (select (biped.getNode biped_ctrl 9 link:2)) ; catch() ) - "Bip01 R Calf":( try (select ( biped.getNode biped_ctrl 6 link:2)) ; catch() ) - "Bip01 L Calf":( try (select ( biped.getNode biped_ctrl 5 link:2)) ; catch() ) - "weapon_bone":( try (select $'weapon_bone') ; catch() ) - "alt_weapon_bone01":( try (select $'alt_weapon_bone01') ; catch() ) - "Bip01 Spine2":( try (select (biped.getNode biped_ctrl 9 link:3)) ; catch() ) - "Bip01 L Foot":( try (select ( biped.getNode biped_ctrl 5 link:3)) ; catch() ) - "Bip01 R Foot":( try (select ( biped.getNode biped_ctrl 6 link:3)) ; catch() ) - "Bip01 L Hand":( try (select ( biped.getNode biped_ctrl 1 link:4 )) ; catch() ) - "Bip01 R Hand":( try (select ( biped.getNode biped_ctrl 2 link:4)) ; catch() ) - "Bip01 R clavicular deltoid01":( try (select $'Bip01 R clavicular deltoid01') ; catch() ) - "Bip01 L clavicular deltoid01":( try (select $'Bip01 L clavicular deltoid01') ; catch() ) - ) - ) - ) - - ------------------------------------------------------------------------------- - -- RangeView - ------------------------------------------------------------------------------- - rollout rangeview "RangeView 1.6" - ( - - dropdownlist range_sel "Sub Range:" items:#("No tagged ranges found!") height:25 - - on rangeview open do - ( - global ntags = FrameTagManager.GetTagCount() - global tagNameArray = #() - if ntags == 0 then - ( - tagNameArray = #("No tagged ranges found!") - range_sel.enabled = false - ) - else - ( - for i = 1 to ntags do - ( - id = FrameTagManager.GetTagID i - name_ = FrameTagManager.GetNameByID id - get_ = filterstring name_ "_" - if get_[get_.count] == "start" do - ( - tagName = #(FrameTagManager.GetNameByID id) - join tagNameArray tagName - ) - ) - all_add = #("All Frames") - join tagNameArray all_add - ) - range_sel.items = tagNameArray - ) - - on range_sel selected n do - ( - if n == (tagNameArray.count) then - ( - animationRange = interval (FrameTagManager.GetTimeByID 1) (FrameTagManager.GetTimeByID ntags) - ) - else - ( - for i = 1 to ntags do - ( - if tagNameArray[n] == (FrameTagManager.GetNameByID i) then - ( - animationRange = interval (FrameTagManager.GetTimeByID i) (FrameTagManager.GetTimeByID (i+1)) - ) - ) - ) - ) - ) - - - ------------------------------------------------------------------------------- - -- MirrorArms - ------------------------------------------------------------------------------- - rollout mirrorarms "MirrorArms 1.4" - ( - dropdownlist mirrorRL "Mirror Animated Arms:" items:#("Right Arm Anim to Left", "Left Arm Anim to Right") height:25 - checkbox new_root "copy\mirror root anim" pos:[25,50] checked:true - progressbar mirror_prog color:red - button mirrorarmsbtn " Mirror " - - on mirrorarmsbtn pressed do - ( - try - ( - if mirrorRL.selection == 2 do - ( - -- Define left and right arms - left_arm = #($upperarm_NEW_L, $rootL, $upperarm_L, $forearm_L, $hand_L, $thumb_L01, $thumb_L02, $thumb_L03, $thumb_L04, $indexfinger_L01, $indexfinger_L02, $indexfinger_L03, $indexfinger_L04, $middlefinger_L01, $middlefinger_L02, $middlefinger_L03, $middlefinger_L04, $ringfinger_L01, $ringfinger_L02, $ringfinger_L03, $ringfinger_L04, $pinky_L01, $pinky_L02, $pinky_L03, $pinky_L04) - right_arm = #($upperarm_NEW_R, $rootR, $upperarm_R, $forearm_R, $hand_R, $thumb_R01, $thumb_R02, $thumb_R03, $thumb_R04, $indexfinger_R01, $indexfinger_R02, $indexfinger_R03, $indexfinger_R04, $middlefinger_R01, $middlefinger_R02, $middlefinger_R03, $middlefinger_R04, $ringfinger_R01, $ringfinger_R02, $ringfinger_R03, $ringfinger_R04, $pinky_R01, $pinky_R02, $pinky_R03, $pinky_R04) - - left_arm_only_rot = #($forearm_L, $hand_L, $thumb_L01, $thumb_L02, $thumb_L03, $thumb_L04, $indexfinger_L01, $indexfinger_L02, $indexfinger_L03, $indexfinger_L04, $middlefinger_L01, $middlefinger_L02, $middlefinger_L03, $middlefinger_L04, $ringfinger_L01, $ringfinger_L02, $ringfinger_L03, $ringfinger_L04, $pinky_L01, $pinky_L02, $pinky_L03, $pinky_L04) - right_arm_only_rot = #($forearm_R, $hand_R, $thumb_R01, $thumb_R02, $thumb_R03, $thumb_R04, $indexfinger_R01, $indexfinger_R02, $indexfinger_R03, $indexfinger_R04, $middlefinger_R01, $middlefinger_R02, $middlefinger_R03, $middlefinger_R04, $ringfinger_R01, $ringfinger_R02, $ringfinger_R03, $ringfinger_R04, $pinky_R01, $pinky_R02, $pinky_R03, $pinky_R04) - - if new_root.checked == true then - ( - dummy name:"new_root" pos:($root.pos) boxsize:[1,1,1] - $new_root.rotation = $root.rotation - $new_root.rotation.controller = tcb_rotation () - $root.rotation.controller = tcb_rotation () - for i = 1 to $root.rotation.controller.keys.count do - ( - with animate on - ( - slidertime = $root.rotation.controller.keys[i].time - $new_root.pos.x = -$root.pos.x - $new_root.pos.y = $root.pos.y - $new_root.pos.z = $root.pos.z - $new_root.dir = ([-1,1,1] * $root.dir) - rot_90 = eulerangles 0 0 -90 - in coordsys local rotate $new_root rot_90 - ) - ) - ) - - -- Remove right arm keys, copy over the controller info, and set TCB (quaternion) rotations - for i=1 to right_arm.count do - ( - deleteKeys right_arm[i].rotation.controller.keys #allkeys - deleteKeys right_arm[i].position.controller.keys #allkeys - deleteKeys right_arm[i].scale.controller.keys #allkeys - right_arm[i].position.controller = copy right_arm[i].position.controller - right_arm[i].rotation.controller = copy right_arm[i].rotation.controller - right_arm[i].rotation.controller = tcb_rotation () - left_arm[i].rotation.controller = tcb_rotation () - ) - - -- Mirror rotation data L->R - for i=1 to right_arm.count do - ( - for r = 1 to left_arm[i].rotation.controller.keys.count do - ( - with animate on - ( - slidertime = left_arm[i].rotation.controller.keys[r].time - crytools.MirrorObjs right_arm[i] left_arm[i] $root #x #x - in coordsys local rotate right_arm[i] (angleaxis 180 [0,1,0]) - ) - --right_arm[i].rotation.controller.keys[r].tension = left_arm[i].rotation.controller.keys[r].tension - --right_arm[i].rotation.controller.keys[r].continuity = left_arm[i].rotation.controller.keys[r].continuity - --right_arm[i].rotation.controller.keys[r].bias = left_arm[i].rotation.controller.keys[r].bias - ) - mirror_prog.value = 100.*i/right_arm.count - ) - ) - - if mirrorRL.selection == 1 do - ( - -- Define left and right arms - left_arm = #($upperarm_NEW_L, $rootL, $upperarm_L, $forearm_L, $hand_L, $thumb_L01, $thumb_L02, $thumb_L03, $thumb_L04, $indexfinger_L01, $indexfinger_L02, $indexfinger_L03, $indexfinger_L04, $middlefinger_L01, $middlefinger_L02, $middlefinger_L03, $middlefinger_L04, $ringfinger_L01, $ringfinger_L02, $ringfinger_L03, $ringfinger_L04, $pinky_L01, $pinky_L02, $pinky_L03, $pinky_L04) - right_arm = #($upperarm_NEW_R, $rootR, $upperarm_R, $forearm_R, $hand_R, $thumb_R01, $thumb_R02, $thumb_R03, $thumb_R04, $indexfinger_R01, $indexfinger_R02, $indexfinger_R03, $indexfinger_R04, $middlefinger_R01, $middlefinger_R02, $middlefinger_R03, $middlefinger_R04, $ringfinger_R01, $ringfinger_R02, $ringfinger_R03, $ringfinger_R04, $pinky_R01, $pinky_R02, $pinky_R03, $pinky_R04) - - left_arm_only_rot = #($forearm_L, $hand_L, $thumb_L01, $thumb_L02, $thumb_L03, $thumb_L04, $indexfinger_L01, $indexfinger_L02, $indexfinger_L03, $indexfinger_L04, $middlefinger_L01, $middlefinger_L02, $middlefinger_L03, $middlefinger_L04, $ringfinger_L01, $ringfinger_L02, $ringfinger_L03, $ringfinger_L04, $pinky_L01, $pinky_L02, $pinky_L03, $pinky_L04) - right_arm_only_rot = #($forearm_R, $hand_R, $thumb_R01, $thumb_R02, $thumb_R03, $thumb_R04, $indexfinger_R01, $indexfinger_R02, $indexfinger_R03, $indexfinger_R04, $middlefinger_R01, $middlefinger_R02, $middlefinger_R03, $middlefinger_R04, $ringfinger_R01, $ringfinger_R02, $ringfinger_R03, $ringfinger_R04, $pinky_R01, $pinky_R02, $pinky_R03, $pinky_R04) - - if new_root.checked == true then - ( - dummy name:"new_root" pos:($root.pos) boxsize:[1,1,1] - $new_root.rotation = $root.rotation - $new_root.rotation.controller = tcb_rotation () - $root.rotation.controller = tcb_rotation () - for i = 1 to $root.rotation.controller.keys.count do - ( - with animate on - ( - slidertime = $root.rotation.controller.keys[i].time - $new_root.pos.x = -$root.pos.x - $new_root.pos.y = $root.pos.y - $new_root.pos.z = $root.pos.z - $new_root.dir = ([-1,1,1] * $root.dir) - rot_90 = eulerangles 0 0 -90 - in coordsys local rotate $new_root rot_90 - ) - ) - ) - - -- Remove left arm keys, copy over the controller info, and set TCB (quaternion) rotations - for i=1 to left_arm.count do - ( - deleteKeys left_arm[i].rotation.controller.keys #allkeys - deleteKeys left_arm[i].position.controller.keys #allkeys - deleteKeys left_arm[i].scale.controller.keys #allkeys - left_arm[i].position.controller = copy right_arm[i].position.controller - left_arm[i].rotation.controller = copy right_arm[i].rotation.controller - right_arm[i].rotation.controller = tcb_rotation () - left_arm[i].rotation.controller = tcb_rotation () - ) - - -- Mirror rotation data R->L - for i=1 to left_arm.count do - ( - for r = 1 to right_arm[i].rotation.controller.keys.count do - ( - with animate on - ( - slidertime = right_arm[i].rotation.controller.keys[r].time - crytools.MirrorObjs left_arm[i] right_arm[i] $root #x #x - in coordsys local rotate left_arm[i] (angleaxis 180 [0,1,0]) - ) - left_arm[i].rotation.controller.keys[r].tension = right_arm[i].rotation.controller.keys[r].tension - left_arm[i].rotation.controller.keys[r].continuity = right_arm[i].rotation.controller.keys[r].continuity - left_arm[i].rotation.controller.keys[r].bias = right_arm[i].rotation.controller.keys[r].bias - ) - mirror_prog.value = 100.*i/left_arm.count - ) - mirror_prog.value = 0 - -- Remove left arm keys, copy over the controller info, and set TCB (quaternion) rotations - for i=1 to left_arm_only_rot.count do - ( - deleteKeys left_arm_only_rot[i].position.controller.keys #allkeys - deleteKeys left_arm_only_rot[i].scale.controller.keys #allkeys - ) - ) - )catch() - ) - ) - - ------------------------------------------------------------------------------- - -- BIP Batch Exporter - ------------------------------------------------------------------------------- - rollout batchBIP "Batch Export 2.0" - ( - - fn safeTime = - ( - time_string = localTime - while True do - ( - a = findString time_string "/" - if a == undefined then - exit - time_string = replace time_string a 1 "-" - ) - while True do - ( - a = findString time_string ":" - if a == undefined then - exit - time_string = replace time_string a 1 "." - ) - return time_string - ) - - fn endframe = - ( - animEnd = (animationrange.end as string) - animEndArray = filterString animEnd "f" - return (animEndArray[1] as float) - ) - - group "specify modes" - ( - checkbutton BIPmode "BIP Files" offset:[-45,0] enabled:false - checkbutton XAFmode "XAF Files" offset:[20,-26] enabled:false - dropdownlist character "" items:#("trooper","hunter","scout","fp_hands") enabled:false - ) - group "batch" - ( - button batchpath "Batch Folder" pos:[10,110] - button savepath "Save Folder " pos:[10,140] - button addlist "Add to List" pos:[10,170] enabled:false - label batchfolderTXT "NONE" align:#left pos:[90,115] - label savefolderTXT "NONE" align:#left pos:[90,144] - label addlistTXT "DISABLED" align:#left pos:[90,174] enabled:false - checkbox multiFolder "Multiple folders " pos:[10,195] - checkbox createCAL "Generate CAL " pos:[10,215] checked:true - checkbox createLOG "Log To File" pos:[10,235] checked:true - checkbox flipAnimY "Flip Animations on Z axis" pos:[10,255] checked:false - checkbox rawCAF "Export RAW CAF data" pos:[10,275] checked:false - checkbox saveBIP "Save BIP/XAF Files" pos:[10,295] enabled:false - checkbox onlySaveBIP "Only Save, No Export" offset:[5,0] enabled:false - button dobatch "-- No Files to Process --" enabled:false - progressbar doit_prog color:red - listbox exportlist "Folders to Process in List:" fieldWidth:152 height:10 offset:[-1,0] enabled:false - button savelist "Save" enabled:true offset:[-30,0] - button loadlist "Load" enabled:true offset:[25,-26] - ) - - on batchBIP open do - ( - global oldsavepath = crytools.BuildPathFull - global oldloadpath = crytools.BuildPathFull - BIPmode.checked = true - hiddenFolderArray = #() - feedIn = #() - selectArray = #() - hiddenFolderArray = #() - ) - - on XAFmode changed state do - ( - BIPmode.checked = false - character.enabled = true - ) - - on BIPmode changed state do - ( - XAFmode.checked = false - character.enabled = false - ) - - on saveBIP changed state do - ( - if saveBIP.checked == true then - ( - onlySaveBip.enabled = true - ) - else - ( - onlySaveBip.enabled = false - onlySaveBip.checked = false - ) - ) - - -- multiple folders checkbox - ------------------------------------------------------------------------------- - on multiFolder changed state do - ( - if multiFolder.checked == true then - ( - exportlist.enabled = true - addlist.enabled = true - --saveQue.enabled = true - --loadQue.enabled = true - addlistTXT.enabled = true - addlistTXT.text = "" - ) - else - ( - addlist.enabled = false - exportlist.enabled = false - addlistTXT.enabled = false - saveQue.enabled = false - loadQue.enabled = false - addlistTXT.text = "QUE DISABLED" - ) - ) - - -- Get batch path - ------------------------------------------------------------------------------- - on batchpath pressed do - ( - global oldloadpath - global batch_folder = getSavePath initialDir:oldloadpath caption:"Please select a folder of BIP files\nto be batch processed:" - if batch_folder == undefined do (return undefined) - oldloadpath = batch_folder - - if BIPmode.checked == true then - ( - global batch_files = getFiles (batch_folder + "\\*.bip") - ) - - if XAFmode.checked == true then - ( - global batch_files = getFiles (batch_folder + "\\*.xaf") - ) - - global batch_folder_name = (getFilenameFile batch_folder) - global numfiles = batch_files.count - if numfiles == 0 then - ( - messageBox "There are no BIP/XAF files in the selected folder." title:"Error: No BIP/XAF Files Found!" - ) - else - ( - dobatch.enabled = true - ) - batchfolderTXT.text = batch_folder_name - savefolderTXT.text = batch_folder_name - - if BIPmode.checked == true then - ( - dobatch.text = ("Export " + (numfiles as string) + " BIPs from \\" + batch_folder_name) - ) - - if XAFmode.checked == true then - ( - dobatch.text = ("Export " + (numfiles as string) + " XAFs from \\" + batch_folder_name) - ) - - global save_folder = batch_folder - global save_folder_name = (getFilenameFile save_folder) - global oldsavepath = batch_folder - ) - - - -- Get save path - ------------------------------------------------------------------------------- - on savepath pressed do - ( - global save_folder = getSavePath initialDir:oldsavepath caption:"Please select a folder to save the CAF files:" - if save_folder == undefined do (return undefined) - oldsavepath = save_folder - save_folder_name = (getFilenameFile save_folder) - print save_folder - savefolderTXT.text = save_folder_name - ) - - -- add to que button - ------------------------------------------------------------------------------- - on addlist pressed do - ( - save_folder_array = #(batch_folder_name) - if exportlist.items == undefined then - ( - exportlist.items = save_folder_array - ) - temp = (join exportlist.items save_folder_array) - exportlist.items = temp - feed = #((batch_folder as string),(save_folder as string)) - if feedIN == undefined then - ( - feedIN = #() - ) - feedIN = feed - --execme = (batch_folder_name + " = #()") - --execute execme - if hiddenFolderArray == undefined then - ( - hiddenFolderArray = feedIn - ) - else - ( - append hiddenFolderArray feedin - ) - --execme = (batch_folder_name + " = feedIn") - --execute execme - addlistTXT.text = ((exportlist.items.count as string) + " Folders") - ) - - on exportlist selected m do - ( - --selectArray = hiddenFolderArray[m] - batch_folder = hiddenFolderArray[m][1] - save_folder = hiddenFolderArray[m][2] - batchfolderTXT.text = (getFilenameFile batch_folder) - savefolderTXT.text = (getFilenameFile save_folder) - ) - - on exportlist doubleClicked itm do - ( - temp = exportlist.items - deleteItem temp itm - deleteitem hiddenFolderArray itm - exportlist.items = temp - addlistTXT.text = ((exportlist.items.count as string) + " Folders") - ) - - -- Save/load the folder que - ------------------------------------------------------------------------------- - - -- save the list - on savelist pressed do - ( - folderQue = getSaveFileName types:"Que(*.que)|*.que" initialDir:save_folder - outputQUE = createFile folderQue - outputQUE = openFile folderQue mode:"w" - format ((hiddenFolderArray as string) + "*" + (exportlist.items as string)) to: outputQUE - close - ) - - - -- import the list - on loadlist pressed do - ( - dobatch.enabled = true - dobatch.text = "Batch Loaded Folders" - import_queFile = getOpenFileName getSaveFileName types:"Que(*.que)|*.que" initialDir:crytools.BuildPathFull - import_que = openFile import_queFile mode:"r" - while not eof import_que do - ( - importedList = readline import_que - importedListBreak = (filterstring importedList "*") - ) - close import_que - --exportlist.items = (("\"" + importedlistbreak[2] as array)) - execme = ("cryanimationtools.rollouts[6].exportlist.items = " + importedlistbreak[2]) - execute execme - - execme = ("hiddenFolderArray = " + importedlistbreak[1]) - print execme - execute execme - ) - - -- Process batch export - ------------------------------------------------------------------------------- - on dobatch pressed do - ( - undo off - ( - -- allow esc to break from batching - escapeenable = true - - -- check to make sure the twist bones are parented correctly - if $'Bip01 R ForeTwist' != undefined then - ( - try - ( - if $'Bip01 R ForeTwist'.parent.name != "Bip01 R Forearm" then - ( - $'Bip01 R ForeTwist'.parent = $'Bip01 R Forearm' - print "Forearms reparented!" - ) - ) - catch - ( - $'Bip01 R ForeTwist'.parent = $'Bip01 R Forearm' - print "Forearms reparented!" - ) - ) - - --log to file - --test = localtime - --timeArray = (filterstring test "/ :") - logfilename = ("BIP_export_" + batch_folder_name + "_" + safeTime()) - - - try ( biped_ctrl=$bip01.controller ) - catch - ( - messageBox "I cannot find a biped in the scene." title:"Error: No Biped Found!" - return undefined - ) - - biped_ctrl.figureMode = false - - fileList = undefined - if multiFolder.checked == false then - fileList = numfiles - else - fileList = exportlist.items.count - - - for i = 1 to fileList do - ( - animationrange = interval 0 1 - utilitypanel.openutility csexport - caf_name = (getFilenameFile batch_files[i]) - print ("Exporting " + caf_name) - - biped_ctrl=$bip01.controller - - checkImport = biped.LoadBipFile biped_ctrl batch_files[i] - while (checkImport != true) do () - - -- rotate 180 deg on Z - if flipAnimY.checked == true then - ( - Dummy name: "rot_help" pos:[0,0,0] isSelected:off - $Bip01.parent = $rot_help - rot = eulerangles 0 0 180 - rotate $rot_help rot - select $Bip01 - max unlink - select $rot_help - max delete - ) - - - if saveBIP.checked = true then - biped.SaveBipFile biped_ctrl batch_files[i] - - -- Export - if rawCAF.checked == true then - checkExport = csexport.export.export_anim (save_folder + "\\" + caf_name + ".ivo") - else - checkExport = csexport.export.export_anim (save_folder + "\\" + caf_name + ".caf") - - while (checkExport != OK) do () - - - -- create logfile - if createLOG.checked == true then - ( - if ( outputLOG = openFile (save_folder + "\\" + logfilename + ".log") mode:"a" ) == undefined then - ( - outputLOG = createFile (save_folder + "\\" + logfilename + ".log") - outputLOG = openFile (save_folder + "\\" + logfilename + ".log") mode:"a" - format "#filepath = animations\human\male\n\n" to: outputCAL - --format (localTime + " --- BATCH EXPORTER STARTED PARSING FOLDER " + batch_folder + "\n") to: outputLOG - ) - format (localTime + " --- Exporting " + caf_name + "\n") to: outputLOG - close outputLOG - ) - - -- create CAL file - if createCAL.checked == true then - ( - if ( outputCAL = openFile (save_folder + "\\" + batch_folder_name + "_export_test.cal") mode:"a" ) == undefined then - ( - outputCAL = createFile (save_folder + "\\" + batch_folder_name + "_export_test.cal") - outputCAL = openFile (save_folder + "\\" + batch_folder_name + "_export_test.cal") mode:"a" - ) - format (caf_name + " = " + caf_name +".caf\n") to: outputCAL - close outputCAL - ) - - doit_prog.value = 100.*i/numfiles - gc() - ) - doit_prog.value = 0 - ) - ) -) - - ------------------------------------------------------------------------------- - -- INTERNAL TOOLS - ------------------------------------------------------------------------------- - rollout internalTools "Internal Tools/Fixes" - ( - group "Animation Setup" - ( - dropdownlist chooseWeapon items:#("none","pistol","rifle","mg","law") - ) - - button addTrooperWeapon "Add Trooper Weapon Bone" - - group "XAF Import/Export" - ( - button exportXAF "Export XAF (Trooper)" enabled:false - checkbox animTracks "animTracks" enabled:false - checkbox constraints "constraints" enabled:false offset:[80,-20] - checkbox keyable "keyableTracks" offset:[35,0] enabled:false - checkbox XAFuseRange "use current time range" enabled:false - dropdownlist XAFcharacterExport "" items:#("trooper", "hunter","scout","fp_arms") enabled:false - button importXAF "Import XAF (Trooper)" enabled:false - checkbox XAFrelative "Relative" enabled:false - checkbox XAFinsert "Insert" offset:[65,-20] enabled:false - dropdownlist XAFcharacterImport "" items:#("trooper", "hunter","scout","fp_arms") enabled:false - ) - - on internalTools open do - ( - - if $bip01 != undefined then - ( - undo "import_weapons" on - ( - if $hurricane_tp == undefined then - ( - if (doesfileexist (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max")) != false then - ( - mergeMAXfile (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") #("hurricane_tp","scar_L-C_tp","law_tp","socom_tp") #alwaysReparent - ) - else - ( - messagebox ("Cannot find " + crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") - ) - ) - ) - ) - - animTracks.checked = true - --constraints.enabled = true - constraints.checked = true - XAFuseRange.checked = true - ) - - on chooseWeapon selected sel do - ( - undo "select_weapon_setup" on - ( - biped_ctrl=$bip01.controller - if biped_ctrl.figureMode == true then - ( - messagebox "Please leave figure mode first" - return default - ) - case sel of - ( - 1: - ( - hateMaxRots= (in coordsys world $weapon_bone.pos) - in coordsys parent (about $weapon_bone $weapon_bone.rotation = (quat -0.0298008 -0.00344252 0.731658 -0.681011)) - $weapon_bone.pos = hateMaxRots - hide $socom_tp - hide $hurricane_tp - hide $'scar_L-C_tp' - hide $law_tp - ) - - 2: - ( - hateMaxRots= (in coordsys world $weapon_bone.pos) - in coordsys parent (about $weapon_bone $weapon_bone.rotation = (quat -0.0298008 -0.00344252 0.731658 -0.681011)) - $weapon_bone.pos = hateMaxRots - unhide $socom_tp - hide $hurricane_tp - hide $'scar_L-C_tp' - hide $law_tp - ) - - 3: - ( - hateMaxRots= (in coordsys world $weapon_bone.pos) - in coordsys parent (about $weapon_bone $weapon_bone.rotation = (quat -0.0298008 -0.00344252 0.731658 -0.681011)) - $weapon_bone.pos = hateMaxRots - unhide $'scar_L-C_tp' - hide $hurricane_tp - hide $socom_tp - hide $law_tp - ) - - 4: - ( - hateMaxRots = (in coordsys world $weapon_bone.pos) - in coordsys parent (about $weapon_bone $weapon_bone.rotation = (quat -0.251497 0.143304 0.510626 -0.809614)) - $weapon_bone.pos = hateMaxRots - unhide $hurricane_tp - hide $'scar_L-C_tp' - hide $socom_tp - hide $law_tp - ) - - 5: - ( - hateMaxRots= (in coordsys world $weapon_bone.pos) - in coordsys parent (about $weapon_bone $weapon_bone.rotation = (quat 0.681166 -0.400702 0.386398 -0.475549)) - $weapon_bone.pos = hateMaxRots - unhide $law_tp - hide $socom_tp - hide $hurricane_tp - hide $socom_tp - ) - ) - ) - ) - - on addTrooperWeapon pressed do - ( - if (doesfileexist (crytools.BuildPathFull + "Game\\Objects\\Characters\\alien\\trooper\\trooper.max")) != false then - ( - mergeMAXfile (crytools.BuildPathFull + "Game\\Objects\\Characters\\alien\\trooper\\trooper.max") #("weapon_bone") #alwaysReparent - ) - else - ( - messagebox ("Cannot find " + crytools.BuildPathFull + "Game\\Objects\\Characters\\alien\\trooper\\trooper.max") - ) - ) - - on XAFcharacterExport selected sel do - ( - case sel of - ( - 1: exportXAF.text = "Export XAF (Trooper)" - 2: exportXAF.text = "Export XAF (Hunter)" - ) - ) - - on XAFcharacterImport selected sel do - ( - case sel of - ( - 1: importXAF.text = "Import XAF (Trooper)" - 2: importXAF.text = "import XAF (Hunter)" - ) - ) - - -- animated tracks changed state - on animTracks changed state do - ( - if animTracks.checked == true then - ( - constraints.enabled = true - ) - else - ( - constraints.checked = false - constraints.enabled = false - ) - ) - - on exportXAF pressed do - ( - outputNameArr = (filterstring maxFilename ".") - outputName = outputNameArr[1] - XAFoldsavepath = crytools.BuildPathFull - - global XAFsave_file = getSaveFileName initialDir:XAFoldsavepath filename:outputname caption:"Please select a folder to save the XAF file in:" - if XAFsave_file == undefined do - ( - return undefined - ) - XAFoldsavepath = XAFsave_file - - -- trooper export - if XAFcharacterExport.selection == 1 then - ( - - if $R_rear_hand03 == undefined then - ( - messagebox "There is no trooper in the scene." - return undefined - ) - - select $MASTER - - if $R_mid_tent_spik02 != undefined then - ( - $R_mid_tent_spik02.name = "_R_mid_tent_spik02" - $R_mid_tent_spik03.name = "_R_mid_tent_spik03" - $R_mid_tent_spik04.name = "_R_mid_tent_spik04" - $L_mid_tent_spik04.name = "_L_mid_tent_spik04" - $L_mid_tent_spik03.name = "_L_mid_tent_spik03" - $L_mid_tent_spik02.name = "_L_mid_tent_spik02" - $R_rear_tent_spik02.name = "_R_rear_tent_spik02" - $R_rear_tent_spik03.name = "_R_rear_tent_spik03" - $R_rear_tent_spik04.name = "_R_rear_tent_spik04" - $L_rear_tent_spik04.name = "_L_rear_tent_spik04" - $L_rear_tent_spik03.name = "_L_rear_tent_spik03" - $L_rear_tent_spik02.name = "_L_rear_tent_spik02" - $L_rear_tent_stretch.name = "R_rear_tent_stretch" - ) - - selectmore $_R_mid_tent_spik02 - selectmore $_R_mid_tent_spik03 - selectmore $_R_mid_tent_spik04 - selectmore $_L_mid_tent_spik04 - selectmore $_L_mid_tent_spik03 - selectmore $_L_mid_tent_spik02 - selectmore $_R_rear_tent_spik02 - selectmore $_R_rear_tent_spik03 - selectmore $_R_rear_tent_spik04 - selectmore $_L_rear_tent_spik04 - selectmore $_L_rear_tent_spik03 - selectmore $_L_rear_tent_spik02 - selectmore $root - selectmore $spine01 - selectmore $spine02 - selectmore $spine03 - selectmore $pelvis - selectmore $null_rope03_connect - selectmore $'Rope3 Seg01' - selectmore $'Rope3 Seg02' - selectmore $'Rope3 Seg03' - selectmore $'Rope3 Seg04' - selectmore $'Rope3 Seg05' - selectmore $'Rope3 Seg06' - selectmore $'Rope3 Seg07' - selectmore $'Rope3 Seg08' - selectmore $'Rope3 Seg09' - selectmore $R_rear_hand01 - selectmore $R_rear_hand01_end - selectmore $R_rear_hand02 - selectmore $R_rear_hand02_end - selectmore $R_rear_hand03 - selectmore $R_rear_hand03_end - selectmore $null_rope04_connect - selectmore $'Rope4 Seg01' - selectmore $'Rope4 Seg02' - selectmore $'Rope4 Seg03' - selectmore $'Rope4 Seg04' - selectmore $'Rope4 Seg05' - selectmore $'Rope4 Seg06' - selectmore $'Rope4 Seg07' - selectmore $'Rope4 Seg08' - selectmore $'Rope4 Seg09' - selectmore $L_rear_hand01 - selectmore $L_rear_hand01_end - selectmore $L_rear_hand02 - selectmore $L_rear_hand02_end - selectmore $L_rear_hand03 - selectmore $L_rear_hand03_end - selectmore $R_rear_tent_spik01 - selectmore $L_rear_tent_spik01 - selectmore $R_mid_tent01 - selectmore $null_rope02_connect - selectmore $'Rope2 Seg01' - selectmore $'Rope2 Seg02' - selectmore $'Rope2 Seg03' - selectmore $'Rope2 Seg04' - selectmore $'Rope2 Seg05' - selectmore $'Rope2 Seg06' - selectmore $'Rope2 Seg07' - selectmore $'Rope2 Seg09' - selectmore $R_mid_hand01 - selectmore $R_mid_hand01_end - selectmore $R_mid_hand02 - selectmore $R_mid_hand02_end - selectmore $R_mid_hand03 - selectmore $R_mid_hand03_end - selectmore $R_mid_tent_spik01 - selectmore $L_mid_tent01 - selectmore $null_rope01_connect - selectmore $'Rope1 Seg01' - selectmore $'Rope1 Seg02' - selectmore $'Rope1 Seg03' - selectmore $'Rope1 Seg04' - selectmore $'Rope1 Seg05' - selectmore $'Rope1 Seg06' - selectmore $'Rope1 Seg07' - selectmore $'Rope1 Seg09' - selectmore $L_mid_hand01 - selectmore $L_mid_hand01_end - selectmore $L_mid_hand02 - selectmore $L_mid_hand02_end - selectmore $L_mid_hand03 - selectmore $L_mid_hand03_end - selectmore $L_mid_tent_spik01 - selectmore $chest - selectmore $R_humerus - selectmore $R_forearm - selectmore $R_front_hand - selectmore $R_front_hand01_01 - selectmore $R_front_hand01_02 - selectmore $R_front_hand01_02_end - selectmore $R_front_hand02_01 - selectmore $R_front_hand02_02 - selectmore $R_front_hand02_02_end - selectmore $R_front_hand03_01 - selectmore $R_front_hand03_02 - selectmore $R_front_hand03_02_end - selectmore $R_weapon_bone - selectmore $L_humerus - selectmore $L_forearm - selectmore $L_front_hand - selectmore $L_front_hand01_01 - selectmore $L_front_hand01_02 - selectmore $L_front_hand01_02_end - selectmore $L_front_hand02_01 - selectmore $L_front_hand02_02 - selectmore $L_front_hand02_02_end - selectmore $L_front_hand03_01 - selectmore $L_front_hand03_02 - selectmore $L_front_hand03_02_end - selectmore $L_weapon_bone - selectmore $L_booster - selectmore $L_booster_end - selectmore $R_booster - selectmore $R_booster_end - selectmore $'Bip01 Neck' - selectmore $'Bip01 Head' - selectmore $eye_left_bone - selectmore $eye_right_bone - - selectmore $Slider01 - selectmore $Slider02 - selectmore $Slider03 - selectmore $Slider04 - selectmore $Slider05 - selectmore $Slider06 - selectmore $Slider07 - selectmore $Slider08 - selectmore $L_front_tent_stretch - selectmore $R_front_tent_stretch - selectmore $L_rear_tent_stretch - selectmore $R_rear_tent_stretch - - XAFnodeExport = (selection as array) - ) - - -- save the XAF file - if XAFuseRange.checked == true then - ( - loadsaveanimation.saveanimation (XAFsave_file + ".xaf") XAFnodeExport #() #() animatedTracks:animTracks.checked includeConstraints:constraints.checked keyableTracks:keyable.checked savesegment:true segInterval:animationrange - ) - else - ( - loadsaveanimation.saveanimation (XAFsave_file + ".xaf") XAFnodeExport #() #() animatedTracks:animTracks.checked includeConstraints:constraints.checked keyableTracks:keyable.checked - ) - ) - - - -- import trooper - on importXAF pressed do - ( - if XAFoldsavepath == undefined then - ( - XAFoldsavepath = crytools.BuildPathFull - ) - - global XAFopen_file = getOpenFileName initialDir:XAFoldsavepath caption:"Please select a folder to save the XAF file in:" - if XAFopen_file == undefined do - ( - return undefined - ) - XAFoldsavepath = XAFopen_file - - -- trooper export - if XAFcharacterImport.selection == 1 then - ( - if $R_rear_hand03 == undefined then - ( - messagebox "There is no trooper in the scene." - return undefined - ) - select $MASTER - - if $R_mid_tent_spik02 != undefined then - ( - $R_mid_tent_spik02.name = "_R_mid_tent_spik02" - $R_mid_tent_spik03.name = "_R_mid_tent_spik03" - $R_mid_tent_spik04.name = "_R_mid_tent_spik04" - $L_mid_tent_spik04.name = "_L_mid_tent_spik04" - $L_mid_tent_spik03.name = "_L_mid_tent_spik03" - $L_mid_tent_spik02.name = "_L_mid_tent_spik02" - $R_rear_tent_spik02.name = "_R_rear_tent_spik02" - $R_rear_tent_spik03.name = "_R_rear_tent_spik03" - $R_rear_tent_spik04.name = "_R_rear_tent_spik04" - $L_rear_tent_spik04.name = "_L_rear_tent_spik04" - $L_rear_tent_spik03.name = "_L_rear_tent_spik03" - $L_rear_tent_spik02.name = "_L_rear_tent_spik02" - $L_rear_tent_stretch.name = "R_rear_tent_stretch" - ) - - selectmore $_R_mid_tent_spik02 - selectmore $_R_mid_tent_spik03 - selectmore $_R_mid_tent_spik04 - selectmore $_L_mid_tent_spik04 - selectmore $_L_mid_tent_spik03 - selectmore $_L_mid_tent_spik02 - selectmore $_R_rear_tent_spik02 - selectmore $_R_rear_tent_spik03 - selectmore $_R_rear_tent_spik04 - selectmore $_L_rear_tent_spik04 - selectmore $_L_rear_tent_spik03 - selectmore $_L_rear_tent_spik02 - selectmore $root - selectmore $spine01 - selectmore $spine02 - selectmore $spine03 - selectmore $pelvis - selectmore $null_rope03_connect - selectmore $'Rope3 Seg01' - selectmore $'Rope3 Seg02' - selectmore $'Rope3 Seg03' - selectmore $'Rope3 Seg04' - selectmore $'Rope3 Seg05' - selectmore $'Rope3 Seg06' - selectmore $'Rope3 Seg07' - selectmore $'Rope3 Seg08' - selectmore $'Rope3 Seg09' - selectmore $R_rear_hand01 - selectmore $R_rear_hand01_end - selectmore $R_rear_hand02 - selectmore $R_rear_hand02_end - selectmore $R_rear_hand03 - selectmore $R_rear_hand03_end - selectmore $null_rope04_connect - selectmore $'Rope4 Seg01' - selectmore $'Rope4 Seg02' - selectmore $'Rope4 Seg03' - selectmore $'Rope4 Seg04' - selectmore $'Rope4 Seg05' - selectmore $'Rope4 Seg06' - selectmore $'Rope4 Seg07' - selectmore $'Rope4 Seg08' - selectmore $'Rope4 Seg09' - selectmore $L_rear_hand01 - selectmore $L_rear_hand01_end - selectmore $L_rear_hand02 - selectmore $L_rear_hand02_end - selectmore $L_rear_hand03 - selectmore $L_rear_hand03_end - selectmore $R_rear_tent_spik01 - selectmore $L_rear_tent_spik01 - selectmore $R_mid_tent01 - selectmore $null_rope02_connect - selectmore $'Rope2 Seg01' - selectmore $'Rope2 Seg02' - selectmore $'Rope2 Seg03' - selectmore $'Rope2 Seg04' - selectmore $'Rope2 Seg05' - selectmore $'Rope2 Seg06' - selectmore $'Rope2 Seg07' - selectmore $'Rope2 Seg09' - selectmore $R_mid_hand01 - selectmore $R_mid_hand01_end - selectmore $R_mid_hand02 - selectmore $R_mid_hand02_end - selectmore $R_mid_hand03 - selectmore $R_mid_hand03_end - selectmore $R_mid_tent_spik01 - selectmore $L_mid_tent01 - selectmore $null_rope01_connect - selectmore $'Rope1 Seg01' - selectmore $'Rope1 Seg02' - selectmore $'Rope1 Seg03' - selectmore $'Rope1 Seg04' - selectmore $'Rope1 Seg05' - selectmore $'Rope1 Seg06' - selectmore $'Rope1 Seg07' - selectmore $'Rope1 Seg09' - selectmore $L_mid_hand01 - selectmore $L_mid_hand01_end - selectmore $L_mid_hand02 - selectmore $L_mid_hand02_end - selectmore $L_mid_hand03 - selectmore $L_mid_hand03_end - selectmore $L_mid_tent_spik01 - selectmore $chest - selectmore $R_humerus - selectmore $R_forearm - selectmore $R_front_hand - selectmore $R_front_hand01_01 - selectmore $R_front_hand01_02 - selectmore $R_front_hand01_02_end - selectmore $R_front_hand02_01 - selectmore $R_front_hand02_02 - selectmore $R_front_hand02_02_end - selectmore $R_front_hand03_01 - selectmore $R_front_hand03_02 - selectmore $R_front_hand03_02_end - selectmore $R_weapon_bone - selectmore $L_humerus - selectmore $L_forearm - selectmore $L_front_hand - selectmore $L_front_hand01_01 - selectmore $L_front_hand01_02 - selectmore $L_front_hand01_02_end - selectmore $L_front_hand02_01 - selectmore $L_front_hand02_02 - selectmore $L_front_hand02_02_end - selectmore $L_front_hand03_01 - selectmore $L_front_hand03_02 - selectmore $L_front_hand03_02_end - selectmore $L_weapon_bone - selectmore $L_booster - selectmore $L_booster_end - selectmore $R_booster - selectmore $R_booster_end - selectmore $'Bip01 Neck' - selectmore $'Bip01 Head' - selectmore $eye_left_bone - selectmore $eye_right_bone - - selectmore $Slider01 - selectmore $Slider02 - selectmore $Slider03 - selectmore $Slider04 - selectmore $Slider05 - selectmore $Slider06 - selectmore $Slider07 - selectmore $Slider08 - selectmore $L_front_tent_stretch - selectmore $R_front_tent_stretch - selectmore $L_rear_tent_stretch - selectmore $R_rear_tent_stretch - - XAFnodeImport = (selection as array) - ) - -- save the XAF file - loadsaveanimation.loadanimation XAFopen_file XAFnodeImport relative:XAFrelative.checked insert:XAFinsert.checked - ) - ) -addRollout plantKey CryAnimationTools -addRollout bipedtools CryAnimationTools -addRollout bipSelect CryAnimationTools rolledup:true ---addRollout internalTools CryAnimationTools -addRollout generalTools CryAnimationTools rolledup: true -addRollout rangeview CryAnimationTools rolledup:true -addRollout mirrorarms CryAnimationTools rolledup:true -addRollout batchBIP CryAnimationTools rolledup:true -) --End roulloutfloater diff --git a/Tools/maxscript/CryArtistTools.ms b/Tools/maxscript/CryArtistTools.ms deleted file mode 100644 index b97eaa7ef5..0000000000 --- a/Tools/maxscript/CryArtistTools.ms +++ /dev/null @@ -1,2128 +0,0 @@ -------------------------------------------------------------------------------- --- CryArtistTools.ms --- Version 2.2 External --- by Christopher Evans -------------------------------------------------------------------------------- - --- Globals -------------------------------------------------------------------------------- - -global CryArtistTools - -crytools.maxDirTxt = (getdir #maxroot) - -------------------------------------------------------------------- ------------Update "CGF Metadata Manager" Function--------- -------------------------------------------------------------------- -udpInARR = #() -testFor = #() -fn udpGetFromSel = -( - likeMass = false - likeDensity = false - multipleObj = false - AllMass = false - AllDens = false - AllDensity = false - AllLimit = false - AllTwist = false - AllBend = false - AllPull = false - AllPush = false - AllShift = false - LikeLimit = false - LikeTwist = false - LikeBend = false - LikePull = false - LikePush = false - LikeShift = false - - CryArtistTools.rollouts[3].objScale.value = 100 - - if $ == undefined then - ( - CryArtistTools.rollouts[3].isMain.checked = false - CryArtistTools.rollouts[3].isRemain.checked = false - CryArtistTools.rollouts[3].updateLBL.text = "Nothing selected" - CryArtistTools.rollouts[3].UpdateUDP.enabled = false - CryArtistTools.rollouts[3].udpSetToSel.enabled = false - return undefined - ) - - if CryArtistTools != undefined then - ( - CryArtistTools.rollouts[3].UpdateUDP.enabled = false - CryArtistTools.rollouts[3].udpSetToSel.enabled = true - if selection.count > 1 then multipleObj = true - if selection.count == 1 then - ( - case selection[1].name of - ( - "Main": (CryArtistTools.rollouts[3].isMain.checked = true) - "Remain": (CryArtistTools.rollouts[3].isRemain.checked = true) - ) - if selection[1].name != "Main" and selection[1].name!="Remain" then - ( - CryArtistTools.rollouts[3].isMain.checked = false - CryArtistTools.rollouts[3].isRemain.checked = false - ) - ) - LimitArr = #() - TwistArr = #() - BendArr = #() - PullArr = #() - PushArr = #() - ShiftArr = #() - - MassArr = #() - DensArr = #() - for obj in selection do - ( - Temp = #() - udpInARR = crytools.inFromUDP obj - if udpInARR.count == 0 then - ( - CryArtistTools.rollouts[3].updateLBL.text = "Object has no UDP data" - if multipleObj == true then - ( - CryArtistTools.rollouts[3].updateLBL.text = "Objects have no UDP data" - ) - ) - else - ( - CryArtistTools.rollouts[3].updateLBL.text = "UDP data loaded" - IsMass = (filterstring udpInARR[1] " =") - if IsMass[1] == "mass" then - ( - append MassArr obj - ) - else - ( - if IsMass[1] == "density" then - ( - append DensArr obj - ) - ) - ) - - for i = 1 to udpInArr.count do - ( - testFor = (filterstring udpInARR[i] " =")[1] - append Temp testFor - ) - if (findItem Temp "limit") != 0 then append LimitArr obj - if (findItem Temp "twist") != 0 then append TwistArr obj - if (findItem Temp "bend") != 0 then append BendArr obj - if (findItem Temp "pull") != 0 then append PullArr obj - if (findItem Temp "push") != 0 then append PushArr obj - if (findItem Temp "shift") != 0 then append ShiftArr obj - ) - - if multipleObj == true then - ( - CryArtistTools.rollouts[3].isMain.checked = false - CryArtistTools.rollouts[3].isRemain.checked = false - if MassArr.count != 0 then - ( - if MassArr.count == selection.count then AllMass = true else AllMass = false - ) - - if DensArr.count != 0 then - ( - if DensArr.count == selection.count then AllDens = true else AllDens = false - ) - - if LimitArr.count != 0 then - ( - if LimitArr.count == selection.count then AllLimit = true else AllLimit = false - ) - - if TwistArr.count != 0 then - ( - if TwistArr.count == selection.count then AllTwist = true else AllTwist = false - ) - - if BendArr.count != 0 then - ( - if BendArr.count == selection.count then AllBend = true else AllBend = false - ) - - if PullArr.count != 0 then - ( - if PullArr.count == selection.count then AllPull = true else AllPull = false - ) - - if PushArr.count != 0 then - ( - if PushArr.count == selection.count then AllPush = true else AllPush = false - ) - - if ShiftArr.count != 0 then - ( - if ShiftArr.count == selection.count then AllShift = true else AllShift = false - ) - ) - - testForMass = (crytools.getUDP selection[1] "mass") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "mass") != testForMass then likeMass = false else likeMass = true - ) - - testForDensity = (crytools.getUDP selection[1] "density") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "density") != testForDensity then likeDensity = false else likeDensity = true - ) - - testForLimit = (crytools.getUDP selection[1] "limit") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "limit") != testForLimit then likeLimit = false else likeLimit = true - ) - - testForTwist = (crytools.getUDP selection[1] "twist") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "twist") != testForTwist then likeTwist = false else likeTwist = true - ) - - testForBend = (crytools.getUDP selection[1] "bend") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "bend") != testForBend then likeBend = false else likeBend = true - ) - - testForPull = (crytools.getUDP selection[1] "pull") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "pull") != testForPull then likePull = false else likePull = true - ) - - testForPush = (crytools.getUDP selection[1] "push") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "push") != testForPush then likePush = false else likePush = true - ) - - testForShift = (crytools.getUDP selection[1] "shift") - for i = 2 to selection.count do - ( - if (crytools.getUDP selection[i] "shift") != testForShift then likeShift = false else likeShift = true - ) - - -- reset - CryArtistTools.rollouts[3].cylinder1.checked = false - CryArtistTools.rollouts[3].box1.checked = false - CryArtistTools.rollouts[3].capsule1.checked = false - CryArtistTools.rollouts[3].sphere1.checked = false - - CryArtistTools.rollouts[3].useMass.checked = false - CryArtistTools.rollouts[3].objMass.value = 0 - CryArtistTools.rollouts[3].objMass.enabled = false - CryArtistTools.rollouts[3].useDensity.checked = false - CryArtistTools.rollouts[3].objDensity.value = 0 - CryArtistTools.rollouts[3].objDensity.enabled = false - CryArtistTools.rollouts[3].objScale.enabled = false - - CryArtistTools.rollouts[3].jLimit.enabled = false - CryArtistTools.rollouts[3].jLimit.checked = false - CryArtistTools.rollouts[3].jTwist.enabled = false - CryArtistTools.rollouts[3].jTwist.checked = false - CryArtistTools.rollouts[3].jBend.enabled = false - CryArtistTools.rollouts[3].jBend.checked = false - CryArtistTools.rollouts[3].jPull.enabled = false - CryArtistTools.rollouts[3].jPull.checked = false - CryArtistTools.rollouts[3].jPush.enabled = false - CryArtistTools.rollouts[3].jPush.checked = false - CryArtistTools.rollouts[3].jShift.enabled = false - CryArtistTools.rollouts[3].jShift.checked = false - CryArtistTools.rollouts[3].jScale.enabled = false - CryArtistTools.rollouts[3].jScale.checked = false - CryArtistTools.rollouts[3].jointScale.enabled = false - CryArtistTools.rollouts[3].jointScale.value = 100 - - CryArtistTools.rollouts[3].usejoint.checked = false - CryArtistTools.rollouts[3].jointLimit.value = 0 - CryArtistTools.rollouts[3].jointLimit.enabled = false - CryArtistTools.rollouts[3].jointTwist.value = 0 - CryArtistTools.rollouts[3].jointTwist.enabled = false - CryArtistTools.rollouts[3].jointBend.value = 0 - CryArtistTools.rollouts[3].jointBend.enabled = false - CryArtistTools.rollouts[3].jointPull.value =0 - CryArtistTools.rollouts[3].jointPull.enabled = false - CryArtistTools.rollouts[3].jointPush.value = 0 - CryArtistTools.rollouts[3].jointPush.enabled = false - CryArtistTools.rollouts[3].jointShift.value = 0 - CryArtistTools.rollouts[3].jointShift.enabled = false - - CryArtistTools.rollouts[3].isEntity.checked = false - CryArtistTools.rollouts[3].xrot.checked = false - CryArtistTools.rollouts[3].yrot.checked = false - CryArtistTools.rollouts[3].zrot.checked = false - CryArtistTools.rollouts[3].sizevar.value = 0 - CryArtistTools.rollouts[3].GenericCount.value = 0 - - - --CryArtistTools.rollouts[3].ispickable.checked = false - - --lowercase inputs - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - - wordFilter = (crytools.forceLowerCase testFor[1]) - - jointsPresent = false - - case wordFilter of - ( - "mass": - ( - CryArtistTools.rollouts[3].useMass.checked = true - CryArtistTools.rollouts[3].objMass.enabled = true - CryArtistTools.rollouts[3].objMass.value = (testFor[2] as float) - CryArtistTools.rollouts[3].objScale.enabled = true - if multipleObj == true then - ( - if AllMass == true then - ( - if CryArtistTools.rollouts[3].objMass.value != 0 then - ( - CryArtistTools.rollouts[3].UpdateUDP.enabled = true - CryArtistTools.rollouts[3].udpSetToSel.enabled = false - ) - else - ( - CryArtistTools.rollouts[3].udpSetToSel.enabled = true - ) - - if likeMass == true then - ( - CryArtistTools.rollouts[3].updateLBL.text = "Objects have same mass" - --print "Selected objects have like mass" - ) - else - ( - CryArtistTools.rollouts[3].updateLBL.text = "Multiple objects: different mass" - --print "Multiple objects: different Mass" - CryArtistTools.rollouts[3].useMass.checked = false - CryArtistTools.rollouts[3].objMass.enabled = false - CryArtistTools.rollouts[3].objScale.enabled = true - CryArtistTools.rollouts[3].objMass.value = 0 - - ) - ) - else - ( - CryArtistTools.rollouts[3].updateLBL.text = "Multiple objects: Data mismatch" - CryArtistTools.rollouts[3].useMass.checked = false - CryArtistTools.rollouts[3].objMass.enabled = false - CryArtistTools.rollouts[3].objScale.enabled = false - CryArtistTools.rollouts[3].objMass.value = 0 - ) - ) - ) - "density": - ( - CryArtistTools.rollouts[3].useDensity.checked = true - CryArtistTools.rollouts[3].objDensity.enabled = true - CryArtistTools.rollouts[3].objDensity.value = (testFor[2] as float) - CryArtistTools.rollouts[3].objScale.enabled = true - - if multipleObj == true then - ( - if AllDens == true then - ( - if CryArtistTools.rollouts[3].objDensity.value != 0 then - ( - CryArtistTools.rollouts[3].UpdateUDP.enabled = true - CryArtistTools.rollouts[3].udpSetToSel.enabled = false - ) - else - ( - CryArtistTools.rollouts[3].udpSetToSel.enabled = true - ) - - if likeDensity == true then - ( - CryArtistTools.rollouts[3].updateLBL.text = "Objects have same density" - --print "Selected Objects have like density" - ) - else - ( - CryArtistTools.rollouts[3].updateLBL.text = "Multiple objects: different density" - --print "Multiple objects: data mismatch" - CryArtistTools.rollouts[3].useDensity.checked = false - CryArtistTools.rollouts[3].objDensity.enabled = false - CryArtistTools.rollouts[3].objDensity.value = 0 - CryArtistTools.rollouts[3].objScale.enabled = true - ) - ) - else - ( - CryArtistTools.rollouts[3].updateLBL.text = "Multiple objects: Data mismatch" - CryArtistTools.rollouts[3].useDensity.checked = false - CryArtistTools.rollouts[3].objDensity.enabled = false - CryArtistTools.rollouts[3].objScale.enabled = false - CryArtistTools.rollouts[3].objDensity.value = 0 - ) - ) - ) - "limit": - ( - CryArtistTools.rollouts[3].jointLimit.enabled = true - CryArtistTools.rollouts[3].jLimit.enabled = true - CryArtistTools.rollouts[3].jTwist.enabled = true - CryArtistTools.rollouts[3].jBend.enabled = true - CryArtistTools.rollouts[3].jPull.enabled = true - CryArtistTools.rollouts[3].jPush.enabled = true - CryArtistTools.rollouts[3].jShift.enabled = true - CryArtistTools.rollouts[3].jScale.enabled = true - CryArtistTools.rollouts[3].jointScale.enabled = true - CryArtistTools.rollouts[3].usejoint.checked = true - CryArtistTools.rollouts[3].jointLimit.value = (testFor[2] as float) - jointsPresent = true - if multipleObj == true then - ( - if AllLimit == true then - ( - if likeLimit == true then - ( - CryArtistTools.rollouts[3].jointLimit.value = (testFor[2] as float) - ) - else - ( - CryArtistTools.rollouts[3].jointLimit.value = 0 - ) - ) - else - ( - CryArtistTools.rollouts[3].jointLimit.value = 0 - ) - ) - ) - "twist": - ( - CryArtistTools.rollouts[3].jointTwist.enabled = true - CryArtistTools.rollouts[3].jLimit.enabled = true - CryArtistTools.rollouts[3].jTwist.enabled = true - CryArtistTools.rollouts[3].jBend.enabled = true - CryArtistTools.rollouts[3].jPull.enabled = true - CryArtistTools.rollouts[3].jPush.enabled = true - CryArtistTools.rollouts[3].jShift.enabled = true - CryArtistTools.rollouts[3].jScale.enabled = true - CryArtistTools.rollouts[3].jointScale.enabled = true - CryArtistTools.rollouts[3].usejoint.checked = true - CryArtistTools.rollouts[3].jointTwist.value = (testFor[2] as float) - jointsPresent = true - if multipleObj == true then - ( - if AllTwist == true then - ( - if likeTwist == true then - ( - CryArtistTools.rollouts[3].jointTwist.value = (testFor[2] as float) - ) - else - ( - CryArtistTools.rollouts[3].jointTwist.value = 0 - ) - ) - else - ( - CryArtistTools.rollouts[3].jointTwist.value = 0 - ) - ) - ) - "bend": - ( - CryArtistTools.rollouts[3].jointBend.enabled = true - CryArtistTools.rollouts[3].jLimit.enabled = true - CryArtistTools.rollouts[3].jTwist.enabled = true - CryArtistTools.rollouts[3].jBend.enabled = true - CryArtistTools.rollouts[3].jPull.enabled = true - CryArtistTools.rollouts[3].jPush.enabled = true - CryArtistTools.rollouts[3].jShift.enabled = true - CryArtistTools.rollouts[3].jScale.enabled = true - CryArtistTools.rollouts[3].jointScale.enabled = true - CryArtistTools.rollouts[3].usejoint.checked = true - CryArtistTools.rollouts[3].jointBend.value = (testFor[2] as float) - jointsPresent = true - if multipleObj == true then - ( - if AllBend == true then - ( - if likeBend == true then - ( - CryArtistTools.rollouts[3].jointBend.value = (testFor[2] as float) - ) - else - ( - CryArtistTools.rollouts[3].jointBend.value = 0 - ) - ) - else - ( - CryArtistTools.rollouts[3].jointBend.value = 0 - ) - ) - ) - "pull": - ( - CryArtistTools.rollouts[3].jointPull.enabled = true - CryArtistTools.rollouts[3].jLimit.enabled = true - CryArtistTools.rollouts[3].jTwist.enabled = true - CryArtistTools.rollouts[3].jBend.enabled = true - CryArtistTools.rollouts[3].jPull.enabled = true - CryArtistTools.rollouts[3].jPush.enabled = true - CryArtistTools.rollouts[3].jShift.enabled = true - CryArtistTools.rollouts[3].jScale.enabled = true - CryArtistTools.rollouts[3].jointScale.enabled = true - CryArtistTools.rollouts[3].usejoint.checked = true - CryArtistTools.rollouts[3].jointPull.value = (testFor[2] as float) - jointsPresent = true - if multipleObj == true then - ( - if AllPull == true then - ( - if likePull == true then - ( - CryArtistTools.rollouts[3].jointPull.value = (testFor[2] as float) - ) - else - ( - CryArtistTools.rollouts[3].jointPull.value = 0 - ) - ) - else - ( - CryArtistTools.rollouts[3].jointPull.value = 0 - ) - ) - ) - "push": - ( - CryArtistTools.rollouts[3].jointPush.enabled = true - CryArtistTools.rollouts[3].jLimit.enabled = true - CryArtistTools.rollouts[3].jTwist.enabled = true - CryArtistTools.rollouts[3].jBend.enabled = true - CryArtistTools.rollouts[3].jPull.enabled = true - CryArtistTools.rollouts[3].jPush.enabled = true - CryArtistTools.rollouts[3].jShift.enabled = true - CryArtistTools.rollouts[3].jScale.enabled = true - CryArtistTools.rollouts[3].jointScale.enabled = true - CryArtistTools.rollouts[3].usejoint.checked = true - CryArtistTools.rollouts[3].jointPush.value = (testFor[2] as float) - jointsPresent = true - if multipleObj == true then - ( - if AllPush == true then - ( - if likePush == true then - ( - CryArtistTools.rollouts[3].jointPush.value = (testFor[2] as float) - ) - else - ( - CryArtistTools.rollouts[3].jointPush.value = 0 - ) - ) - else - ( - CryArtistTools.rollouts[3].jointPush.value = 0 - ) - ) - ) - "shift": - ( - CryArtistTools.rollouts[3].jointShift.enabled = true - CryArtistTools.rollouts[3].jLimit.enabled = true - CryArtistTools.rollouts[3].jTwist.enabled = true - CryArtistTools.rollouts[3].jBend.enabled = true - CryArtistTools.rollouts[3].jPull.enabled = true - CryArtistTools.rollouts[3].jPush.enabled = true - CryArtistTools.rollouts[3].jShift.enabled = true - CryArtistTools.rollouts[3].jScale.enabled = true - CryArtistTools.rollouts[3].jointScale.enabled = true - CryArtistTools.rollouts[3].usejoint.checked = true - CryArtistTools.rollouts[3].jointShift.value = (testFor[2] as float) - jointsPresent = true - if multipleObj == true then - ( - if AllShift == true then - ( - if likeShift == true then - ( - CryArtistTools.rollouts[3].jointShift.value = (testFor[2] as float) - ) - else - ( - CryArtistTools.rollouts[3].jointShift.value = 0 - ) - ) - else - ( - CryArtistTools.rollouts[3].jointShift.value = 0 - ) - ) - ) - "pickable": - ( - CryArtistTools.rollouts[3].ispickable.checked = true - ) - "entity": - ( - CryArtistTools.rollouts[3].isEntity.checked = true - ) - "rotaxes": - ( - if testFor[2] == "x" then CryArtistTools.rollouts[3].xrot.checked = true - if testFor[2] == "y" then CryArtistTools.rollouts[3].yrot.checked = true - if testFor[2] == "z" then CryArtistTools.rollouts[3].zrot.checked = true - if testFor[2] == "xy"then - ( - CryArtistTools.rollouts[3].xrot.checked = true - CryArtistTools.rollouts[3].yrot.checked = true - ) - if testFor[2] == "xz"then - ( - CryArtistTools.rollouts[3].xrot.checked = true - CryArtistTools.rollouts[3].zrot.checked = true - ) - if testFor[2] == "yz"then - ( - CryArtistTools.rollouts[3].zrot.checked = true - CryArtistTools.rollouts[3].yrot.checked = true - ) - if testFor[2] == "xyz"then - ( - CryArtistTools.rollouts[3].xrot.checked = true - CryArtistTools.rollouts[3].Yrot.checked = true - CryArtistTools.rollouts[3].zrot.checked = true - ) - ) - "sizevar": - ( - CryArtistTools.rollouts[3].sizevar.value = (testFor[2] as float) - ) - "generic": - ( - CryArtistTools.rollouts[3].GenericCount.value = (testFor[2] as float) - ) - ) - case udpInARR[i] of - ( - "cylinder": CryArtistTools.rollouts[3].cylinder1.checked = true - "box": CryArtistTools.rollouts[3].box1.checked = true - "capsule": CryArtistTools.rollouts[3].capsule1.checked = true - "sphere": CryArtistTools.rollouts[3].sphere1.checked = true - ) - if jointsPresent == true then - ( - CryArtistTools.rollouts[3].jointLimit.enabled = true - CryArtistTools.rollouts[3].jointTwist.enabled = true - CryArtistTools.rollouts[3].jointBend.enabled = true - CryArtistTools.rollouts[3].jointPull.enabled = true - CryArtistTools.rollouts[3].jointPush.enabled = true - CryArtistTools.rollouts[3].jointShift.enabled = true - ) - ) - ) -) --------------------------------End of Update Function--------------------------------------------- - -------------------------------------------------------------------------------- --- CryArtistTools interface -------------------------------------------------------------------------------- - -( -if CryArtistTools != undefined do ( closerolloutfloater CryArtistTools ) -CryArtistTools = newrolloutfloater "CryArtistTools 1.4" 190 380 - ---ArtistTools -------------------------------------------------------------------------------- -rollout ArtistTools "Artist Tools" -( - group "General Tools" - ( - button centerPivotBttn "centerPivot" offset:[-42,0] - checkbutton preserveUV "preserveUVs" offset:[40,-26] - button resetXformBttn "resetXformCollapse" - checkbutton copyModifier "Copy Modifier" height:18 width:120 - button applyModifier "Select a modifier" height:18 width:120 enabled:false - ) - - button exportCheck "Export Check" - - Group "UV Tools" - ( - button scaleVert images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\scalevert.png"), undefined, 1, 1, 1, 1, 1) tooltip:"collapse vertical" offset:[-65,0] - button scaleHoriz images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\scaleHoriz.png"), undefined, 1, 1, 1, 1, 1) tooltip:"collapse horizontal" offset:[-35,-31] - button scaleUniform images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\scaleUniform.png"), undefined, 1, 1, 1, 1, 1) tooltip:"uniform scale" offset:[-5,-31] - button rot90c images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\90c.png"), undefined, 1, 1, 1, 1, 1) tooltip:"rotate 90 clockwise" offset:[25,-31] - button rot90cc images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\90cc.png"), undefined, 1, 1, 1, 1, 1) tooltip:"rotate 90 counter clockwise" offset:[55,-31] - label OBJvertsLBL "OBJ: " align:#left offset:[0,5] - label UVvertsLBL "UV: " align:#left offset:[70,-18.5] - button refreshVerts "<" align:#right offset:[0,-23] - ) - - Group "Modelling Tools" - ( - button LimEloop images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\LEloop.png"), undefined, 1, 1, 1, 1, 1) tooltip:"Limited Edge Loop" offset:[-65,0] - button LimEring images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\LEring.png"), undefined, 1, 1, 1, 1, 1) tooltip:"Limited Edge Ring" offset:[-35,-31] - button LimVloop images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\LVloop.png"), undefined, 1, 1, 1, 1, 1) tooltip:"Limited Vert Loop" offset:[-5,-31] - button LimVring images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\LVring.png"), undefined, 1, 1, 1, 1, 1) tooltip:"Limited Vert Ring" offset:[25,-31] - button LimPloop images:#((crytools.BuildPathFull + "tools\\maxscript\\icons\\LPloop.png"), undefined, 1, 1, 1, 1, 1) tooltip:"Limited Poly Ring" offset:[55,-31] - ) - - -- centerPivot - on centerPivotBttn pressed do - ( - for obj in selection do - ( - CenterPivot obj - ) - ) - - -- refreshVerts - on refreshVerts pressed do - ( - if selection.count != 1 then - ( - OBJvertsLBL.text = "OBJ: --" - UVvertsLBL.text = "UV: --" - ) - else - ( - try - ( - OBJvertsLBL.text = ("OBJ: " + ($.numverts as string)) - UVvertsLBL.text = ("UV: " + ($.modifiers[#unwrap_uvw].unwrap.numbervertices() as string)) - ) - catch() - ) - ) - - -- preserveUVs - on preserveUV changed state do - ( - try - if (preserveUV.checked == true) then - ( - $.preserveUVs = on - ) - else - ( - $.preserveUVs = off - ) - catch - ( - messageBox "Please select an object. Or make sure that your object has an edit poly applied." title:"Error" - preserveUV.checked = false - return undefined - ) - ) - - on ArtistTools open do - ( - try - ( - FileIn (BuildPathFull_crytools + "Tools\\maxscript\\CryModelling.ms") - if $.modifiers[#unwrap_uvw] != undefined then - ( - OBJvertsLBL.text = ("OBJ: " + ($.numverts as string)) - UVvertsLBL.text = ("UV: " + ($.modifiers[#unwrap_uvw].unwrap.numbervertices() as string)) - ) - ) - catch() - ) - - -- resetXformCollapse - on resetXformBttn pressed do - ( - for obj in selection do - ( - ResetXForm obj - print (obj.name + " xforms reset") - modPanel.setCurrentObject obj.baseObject - maxOps.CollapseNode obj off - ) - ) - - -- uv tools - on scaleVert pressed do - ( - try($.modifiers[#unwrap_uvw].unwrap2.ScaleSelectedCenter 0.001 2)catch() - ) - - on scaleHoriz pressed do - ( - try($.modifiers[#unwrap_uvw].unwrap2.ScaleSelectedCenter 0.001 1)catch() - ) - - on scaleUniform pressed do - ( - try($.modifiers[#unwrap_uvw].unwrap2.ScaleSelectedCenter 0.001 0)catch() - ) - - on rot90c pressed do - ( - try($.modifiers[#unwrap_uvw].unwrap2.RotateSelectedCenter -1.59698)catch() - ) - - on rot90cc pressed do - ( - try($.modifiers[#unwrap_uvw].unwrap2.RotateSelectedCenter 1.6057)catch() - ) - - --exportCheck - on exportCheck pressed do - ( - if $ == undefined then - ( - messageBox "No object selected" title:"Error" - return undefined - ) - if $.material == undefined then - ( - messageBox "There is no defined shader for this object!" title:"Problem Found!" - return undefined - ) - materials = $.material.materialIDlist - for i = 1 to materials.count do - ( - checkme = $.material.material[i].shadername - if checkme != "Crytek Shader" then - ( - messageBox ("The following material is not set to the Crytek Shader: " + $.material.material[i].name) title:"Problem Found!" - ) - ) - ) - - on applyModifier pressed do - ( - if xferModifier == undefined then return 0 - else - ( - undo "paste modifiers" on - ( - for obj in selection do - ( - if validModifier obj xferModifier then addmodifier obj (copy xferModifier) - print "test" - ) - ) - ) - ) - - -- modified from Velmar cgsociety post - on copyModifier changed state do - ( - local o,s - if copyModifier.checked = true then - ( - if selection.count == 1 then - ( - try - ( - o = selection[1] - s = modPanel.getcurrentObject() - if s != undefined then - ( - s = (modPanel.getModifierIndex o s) - print s - global xferModifier = copy o.modifiers[s] - copyModifier.caption = o.modifiers[s].name - applyModifier.enabled = true - applyModifier.caption = "Apply Modifier" - print ("copying " + (xferModifier as string)) - ) - else copyModifier.checked = off - ) - catch - ( - copyModifier.checked = off - print "error" - ) - ) - else copyModifier.checked = off - ) - else - ( - copyModifier.caption = "Copy Modifier" - xferModifier = undefined - applyModifier.caption = "Select a modifier" - applyModifier.enabled = false - ) - ) - - ---------Modelling Tools------------------ - on LimEloop pressed do - ( - CryModelling.SelLimELoop () - ) - - on LimEring pressed do - ( - CryModelling.SelLimERing() - ) - - on LimVloop pressed do - ( - CryModelling.SelVertLoop() - ) - - on LimVring pressed do - ( - CryModelling.SelVertRing() - ) - - on LimPloop pressed do - ( - CryModelling.SelPolyLoop() - ) -) - - -rollout Diagnostics "Diagnostics" -( - fn updatePolyStats = - ( - if CryArtistTools.rollouts[2].open == true then - ( - stats = crytools.polyStats() - CryArtistTools.rollouts[2].faceLBL.text = ("Faces: " + stats[1] as string) - CryArtistTools.rollouts[2].edgeLBL.text = ("Edges: " + stats[2] as string) - CryArtistTools.rollouts[2].vertLBL.text = ("Verts: " + stats[3] as string) - print (("Faces: " + stats[1] as string) + (" Edges: " + stats[2] as string) + (" Verts: " + stats[3] as string)) - ) - ) - - fn thinFatStats = - ( - if CryArtistTools.rollouts[2].open == true then - ( - if selection.count != 1 then - ( - messagebox "select one mesh" - return undefined - ) - base = (crytools.forcelowercase $.name) - base = crytools.cutstring base "_LOD1" - base = crytools.cutstring base "_LOD2" - base = crytools.cutstring base "_LOD3" - base = crytools.cutstring base "_thin" - base = crytools.cutstring base "_fat" - - outText = "" - try(outText = (((getnodebyname base).mesh.verts.count as string) + " " + base + "\n"))catch(outText = "BASE_LOD0: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_thin")).mesh.verts.count as string) + " " + base + "_thin\n"))catch(outText += "THIN_LOD0: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_fat")).mesh.verts.count as string) + " " + base + "_fat\n"))catch(outText += "FAT_LOD0: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_LOD1")).mesh.verts.count as string) + " " + base + "_LOD1\n"))catch(outText += "LOD1: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_thin_LOD1")).mesh.verts.count as string) + " " + base + "_thin_LOD1\n"))catch(outText += "THIN_LOD1: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_fat_LOD1")).mesh.verts.count as string) + " " + base + "_fat_LOD1\n"))catch(outText += "FAT_LOD1: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_LOD2")).mesh.verts.count as string) + " " + base + "_LOD2\n"))catch(outText += "LOD2: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_thin_LOD2")).mesh.verts.count as string) + " " + base + "_thin_LOD2\n"))catch(outText += "THIN_LOD2: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_fat_LOD2")).mesh.verts.count as string) + " " + base + "_fat_LOD2\n"))catch(outText += "FAT_LOD2: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_LOD3")).mesh.verts.count as string) + " " + base + "_LOD3\n"))catch(outText += "LOD3: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_thin_LOD3")).mesh.verts.count as string) + " " + base + "_thin_LOD3\n"))catch(outText += "THIN_LOD3: NOT FOUND\n") - try(outText += (((getnodebyname (base + "_fat_LOD3")).mesh.verts.count as string) + " " + base + "_fat_LOD2"))catch(outText += "FAT_LOD3: NOT FOUND") - - messagebox outText title:"Thin/Fat Mesh Check" - if cryartisttools.rollouts[2].printThinFat.checked == true then (print outText) - ) - ) - - group "polyStats" - ( - label faceLBL "Faces: " align:#left - label edgeLBL "Edges: " align:#left - label vertLBL "Verts: " align:#left - ) - group "thin/fat meshCheck" - ( - button thinFat "Thin/Fat Mesh Check" - checkbox printThinFat "Print to Listener" align:#center checked:true - ) - - on Diagnostics rolledUp state do - ( - if state == true then - ( - CryArtistTools.rollouts[2].updatePolyStats() - callbacks.addScript #selectionSetChanged "CryArtistTools.rollouts[2].updatePolyStats()" id:#updatePolyStats - ) - else - ( - callbacks.removeScripts id:#updatePolyStats - ) - ) - - /*on Diagnostics open do - ( - callbacks.addScript #selectionSetChanged "CryArtistTools.rollouts[2].updatePolyStats()" id:#updatePolyStats - )*/ - - on Diagnostics close do - ( - callbacks.removeScripts id:#updatePolyStats - ) - - on thinFat pressed do - ( - thinFatStats() - ) -) - -rollout metadataManager "CGF Metadata Manager" -( - label updateLBL "Info will be updated here" - button UpdateUDP " Update Data " Height:25 Enabled:false - button udpSetToSel " Apply Settings to Selected " height:25 - checkbox useMass "Mass:" offset:[-10,0] - spinner objMass "" type:#float range:[0,99999,0] fieldWidth:50 offset:[-40,-20] - checkbox useDensity "Density:" offset:[-10,0] - spinner objDensity "" type:#float range:[0,99999,0] fieldWidth:50 offset:[-40,-20] - spinner objScale "Scale" type:#float range:[0,99999,100] fieldWidth:50 offset:[-40,0] - button selectAllMatching "Select Objects Matching Details" - dropdownlist SelObjs items:#("mass", "density", "limit", "twist", "bend", "pull", "push", "shift") width:65 offset:[-10,0] - dropdownlist GrtrOrSmlr items:#( "=", ">", "<") width:40 offset:[63,-27.5] - spinner SelVal type:#float range:[0,99999,0] fieldWidth:40 offset:[7,-25] - - group "Force Primitives" - ( - checkbox box1 "box" - checkbox cylinder1 "cylinder" offset:[40,-20] - checkbox sphere1 "sphere" offset:[100,-20] - checkbox capsule1 "capsule" - ) - - group "Joints" - ( - checkbox useJoint "Enable joint properties" - checkbox jLimit "Limit:" offset:[55,0] - checkbox jTwist "Twist:" offset:[55,0] - checkbox jBend "Bend:" offset:[55,0] - checkbox jPull "Pull:" offset:[55,0] - checkbox jPush "Push:" offset:[55,0] - checkbox jShift "Shift:" offset:[55,0] - spinner jointLimit type:#float fieldWidth:35 offset:[0,-120] - spinner jointTwist type:#float fieldWidth:35 offset:[0,0] - spinner jointBend type:#float fieldWidth:35 offset:[0,0] - spinner jointPull type:#float fieldWidth:35 offset:[0,0] - spinner jointPush type:#float fieldWidth:35 offset:[0,0] - spinner jointShift type:#float fieldWidth:35 offset:[0,0] - checkbox jScale "Scale Properties:" offset:[0,10] - spinner jointScale type:#float range:[0,99999,100] fieldWidth:40 offset:[0,-20] - ) - --group "General" - --( - --checkbox isPickable "pickable" - --) - group "destroyableObjects" - ( - checkbox isMain "main" - checkbox isRemain "remain" offset:[47,-20] - spinner GenericCount "Generic:" type:#float fieldWidth:35 offset:[-70,0] - label spawnLocTXT "__Spawn Location_____________" - checkbox isEntity "entity" - --checkbox isBone "bone" - --edittext isBoneTXT "" offset:[45,-21] fieldWidth:60 - --pickbutton pickBone "pick" offset:[62,-24] - label rotAxesTXT "rot axes" offset:[-60,0] - checkbutton xrot "x" offset:[-25,-21] - checkbutton yrot "y" offset:[0,-26] - checkbutton zrot "z" offset:[25,-26] - spinner sizeVar "size var:" type:#float fieldWidth:35 offset:[-70,0] - ) - button openMetaDataLister "Open CGF Metadata Lister" enabled:false - - on selectAllMatching pressed do - ( - clearSelection() - for obj in objects do - ( - UDPdata = crytools.inFromUDP obj - for x = 1 to UDPdata.count do - ( - if (filterstring UDPdata[x] " =")[1] == SelObjs.selected then - ( - EquateVal = GrtrOrSmlr.selected - case EquateVal of - ( - "=": - ( - if (filterstring UDPdata[x] " =")[2] as float == SelVal.value then selectmore obj - ) - - ">": - ( - if (filterstring UDPdata[x] " =")[2] as float > SelVal.value then selectmore obj - ) - - "<": - ( - if (filterstring UDPdata[x] " =")[2] as float < SelVal.value then selectmore obj - ) - ) - ) - ) - ) - ) - - on metadataManager open do - ( - --isBoneTXT.enabled = false - --isBoneTXT.text = "bone name" - objDensity.value = 0 - objMass.value = 0 - objDensity.enabled = false - objMass.enabled = false - udpGetFromSel() - - --callbacks.removeScripts id:#updateUDP - --callbacks.addScript #selectionSetChanged "udpGetFromSel()" id:#updateUDP - ) - - - on metadataManager rolledUp state do - ( - if state then --set callback for dynamic change based on selection - ( - callbacks.removeScripts id:#updateUDP - callbacks.addScript #selectionSetChanged "udpGetFromSel()" id:#updateUDP - ) - else --removie callbacks if the rollout is rolled up - ( - callbacks.removeScripts id:#updateUDP - ) - ) - - on useMass changed state do --Mass checkbox behaviour - ( - if useMass.checked == true then - ( - if useJoint.checked == true then - ( - messagebox "Joints cannot have a mass or density!" - useMass.checked = false - return undefined - ) - objMass.enabled = true - objDensity.enabled = false - useDensity.checked = false - ) - else - ( - objMass.enabled = false - ) - ) - - on useDensity changed state do --Density checkbox behaviour - ( - if useDensity.checked == true then - ( - if useJoint.checked == true then - ( - messagebox "Joints cannot have a mass or density!" - useDensity.checked = false - return undefined - ) - objDensity.enabled = true - objMass.enabled = false - useMass.checked = false - ) - else - ( - objDensity.enabled = false - ) - ) - - --Primitives checkboxes behaviors - on box1 changed state do - ( - if box1.checked == true then - ( - cylinder1.checked = false - sphere1.checked = false - capsule1.checked = false - ) - ) - - on cylinder1 changed state do - ( - if cylinder1.checked == true then - ( - box1.checked = false - sphere1.checked = false - capsule1.checked = false - ) - ) - - on sphere1 changed state do - ( - if sphere1.checked == true then - ( - cylinder1.checked = false - box1.checked = false - capsule1.checked = false - ) - ) - - on capsule1 changed state do - ( - if capsule1.checked == true then - ( - cylinder1.checked = false - sphere1.checked = false - box1.checked = false - ) - ) - - --Joint Properties checkboxes behaviors - on jLimit changed state do - ( - if jLimit.checked == true then - ( - jointLimit.enabled = false - ) - else - ( - jointLimit.enabled = true - ) - ) - - on jTwist changed state do - ( - if jTwist.checked == true then - ( - jointTwist.enabled = false - ) - else - ( - jointTwist.enabled = true - ) - ) - - on jBend changed state do - ( - if jBend.checked == true then - ( - jointBend.enabled = false - ) - else - ( - jointBend.enabled = true - ) - ) - - on jPull changed state do - ( - if jPull.checked == true then - ( - jointPull.enabled = false - ) - else - ( - jointPull.enabled = true - ) - ) - - on jPush changed state do - ( - if jPush.checked == true then - ( - jointPush.enabled = false - ) - else - ( - jointPush.enabled = true - ) - ) - - on jShift changed state do - ( - if jShift.checked == true then - ( - jointShift.enabled = false - ) - else - ( - jointShift.enabled = true - ) - ) - on jScale changed state do - ( - if jScale.checked == true then - ( - jointScale.enabled = true - - jointLimit.enabled = false - jointTwist.enabled = false - jointBend.enabled = false - jointPull.enabled = false - jointPush.enabled = false - jointShift.enabled = false - ) - else - ( - jointScale.enabled = false - - jointLimit.enabled = true - jointTwist.enabled = true - jointBend.enabled = true - jointPull.enabled = true - jointPush.enabled = true - jointShift.enabled = true - ) - ) - ---------------------------------------------- ---------------Applying Settings------------ ---------------------------------------------- - - on udpSetToSel pressed do - ( - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - - -- MASS OUTPUT ---------------------------------------- - if useMass.checked == true then - ( - massVal = ("mass = " + objMass.value as string) - crytools.LookAndWrite obj massVal - ) - else - ( - cryTools.LookAndDelete obj "mass" - ) - - -- DENSITY OUTPUT ---------------------------------------- - if useDensity.checked == true then - ( - densityVal = ("density = " + objDensity.value as string) - crytools.LookAndWrite obj densityVal - ) - else - ( - cryTools.LookAndDelete obj "density" - ) - - -- FORCE PRIMITIVES OUTPUT ---------------------------------------- - if box1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "box" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "box" - ) - ) - if sphere1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "sphere" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "sphere" - ) - ) - if cylinder1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "cylinder" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "cylinder" - ) - ) - if capsule1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "capsule" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "capsule" - ) - ) - - --------JOINT PROPERTIES--------- - if useJoint.checked == true then - ( - if jointLimit.value != 0 then - ( - jLim = ("limit = " + jointLimit.value as string) - crytools.LookAndWrite obj jLim - ) - else - ( - if jScale.checked == false then - ( - cryTools.LookAndDelete obj "limit" - ) - ) - - if jointTwist.enabled == true and jointTwist.value != 0 then - ( - jTwis = ("twist = " + jointTwist.value as string) - crytools.LookAndWrite obj jTwis - ) - else - ( - if jScale.checked == false then - ( - cryTools.LookAndDelete obj "twist" - ) - ) - - if jointBend.value != 0 then - ( - jBen = ("bend = " + jointBend.value as string) - crytools.LookAndWrite obj jBen - ) - else - ( - if jScale.checked == false then - ( - cryTools.LookAndDelete obj "bend" - ) - ) - - if jointPull.value != 0 then - ( - jPul = ("pull = " + jointPull.value as string) - crytools.LookAndWrite obj jPul - ) - else - ( - if jScale.checked == false then - ( - cryTools.LookAndDelete obj "pull" - ) - ) - - if jointPush.value != 0 then - ( - jPus = ("push = " + jointPush.value as string) - crytools.LookAndWrite obj jPus - ) - else - ( - if jScale.checked == false then - ( - cryTools.LookAndDelete obj "push" - ) - ) - - if jointShift.value != 0 then - ( - jShif = ("shift = " + jointShift.value as string) - crytools.LookAndWrite obj jShif - ) - else - ( - if jScale.checked == false then - ( - cryTools.LookAndDelete obj "shift" - ) - ) - - ---------Scale Joint Properties---------- - jSclVal = (jointScale.value/100) - if jSclVal != 1 then - ( - if jLimit.checked == true then - ( - if jointLimit.value != 0 then - ( - jLim = ("limit = " + (jointLimit.value * jSclVal) as string) - crytools.LookAndWrite obj jLim - ) - else - ( - if (crytools.getUDP obj "limit") !=0 then - ( - jLim = ("limit = " + ((crytools.getUDP obj "limit") * jSclVal) as string) - crytools.LookAndWrite obj jLim - ) - ) - ) - - if jTwist.checked == true then - ( - if jointTwist.value != 0 then - ( - jTwis = ("twist = " + (jointTwist.value*jSclVal) as string) - crytools.LookAndWrite obj jTwis - ) - else - ( - if (crytools.getUDP obj "twist") !=0 then - ( - jTwis = ("twist = " + ((crytools.getUDP obj "twist") * jSclVal) as string) - crytools.LookAndWrite obj jLim - ) - ) - ) - - if jBend.checked == true then - ( - if jointBend.value != 0 then - ( - jBen = ("bend = " + (jointBend.value*jSclVal) as string) - crytools.LookAndWrite obj jBen - ) - else - ( - if (crytools.getUDP obj "bend") !=0 then - ( - jBen = ("bend = " + ((crytools.getUDP obj "bend") * jSclVal) as string) - crytools.LookAndWrite obj jBen - ) - ) - ) - - if jPull.checked == true then - ( - if jointPull.value != 0 then - ( - jPul = ("pull = " + (jointPull.value*jSclVal) as string) - crytools.LookAndWrite obj jPul - ) - else - ( - if (crytools.getUDP obj "pull") !=0 then - ( - jPul = ("pull = " + ((crytools.getUDP obj "pull") * jSclVal) as string) - crytools.LookAndWrite obj jPul - ) - ) - ) - - if jPush.checked == true then - ( - if jointPush.value != 0 then - ( - jPus = ("push = " + (jointPush.value*jSclVal) as string) - crytools.LookAndWrite obj jPus - ) - else - ( - if (crytools.getUDP obj "push") !=0 then - ( - jPus = ("push = " + ((crytools.getUDP obj "push") * jSclVal) as string) - crytools.LookAndWrite obj jPus - ) - ) - ) - - if jShift.checked == true then - ( - if jointShift.value != 0 then - ( - jShif = ("shift = " + (jointShift.value*jSclVal) as string) - crytools.LookAndWrite obj jShif - ) - else - ( - if (crytools.getUDP obj "shift") !=0 then - ( - jShif = ("shift = " + ((crytools.getUDP obj "shift") * jSclVal) as string) - crytools.LookAndWrite obj jShif - ) - ) - ) - ) - ) - else - ( - cryTools.LookAndDelete obj "limit" - cryTools.LookAndDelete obj "twist" - cryTools.LookAndDelete obj "bend" - cryTools.LookAndDelete obj "pull" - cryTools.LookAndDelete obj "push" - cryTools.LookAndDelete obj "shift" - ) - - ------------Destroyable Objects------------ - if isMain.checked == true then obj.name = "Main" - if isRemain.checked == true then obj.name = "Remain" - - if isEntity.checked == true then - ( - crytools.LookAndWrite obj "entity" - ) - else - ( - crytools.LookAndDelete obj "entity" - ) - - if xrot.checked == true then - ( - AxisRotations = "rotaxes = x" - if yrot.checked == true then - ( - AxisRotations = "rotaxes = xy" - if zrot.checked == true then - ( - AxisRotations = "rotaxes = xyz" - ) - ) - else - ( - if zrot.checked == true then - ( - AxisRotations = "rotaxes = xz" - ) - ) - crytools.LookAndWrite obj AxisRotations - ) - - if yrot.checked == true then - ( - AxisRotations = "rotaxes = y" - if xrot.checked == true then - ( - AxisRotations = "rotaxes = xy" - if zrot.checked == true then - ( - AxisRotations = "rotaxes = xyz" - ) - ) - else - ( - if zrot.checked == true then - ( - AxisRotations = "rotaxes = yz" - ) - ) - crytools.LookAndWrite obj AxisRotations - ) - - if zrot.checked == true then - ( - AxisRotations = "rotaxes = z" - if yrot.checked == true then - ( - AxisRotations = "rotaxes = yz" - if xrot.checked == true then - ( - AxisRotations = "rotaxes = xyz" - ) - ) - else - ( - if xrot.checked == true then - ( - AxisRotations = "rotaxes = xz" - ) - ) - crytools.LookAndWrite obj AxisRotations - ) - if xrot.checked ==false and yrot.checked==false and zrot.checked==false then - ( - crytools.LookAndDelete obj "rotaxes" - ) - - if sizeVar.value != 0 then - ( - Var = ("sizevar = " + sizeVar.value as string) - crytools.LookAndWrite obj Var - ) - else - ( - crytools.LookAndDelete obj "sizevar" - ) - - if GenericCount.value != 0 then - ( - GenCount = ("generic = " + GenericCount.value as string) - crytools.LookAndWrite obj GenCount - ) - else - ( - crytools.LookAndDelete obj "generic" - ) - ) - ) - - ------------------------------------------------ - --------------Updating Settings-------------- - ------------------------------------------------ - - on UpdateUDP pressed do - ( - SclVal =(objScale.value/100) - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - -- SCALE OUTPUT --------------------------------------- - if SclVal != 1 then - ( - --Scale Mass-- - testFor = filterstring udpInARR[1] " =" - - if testFor[1] == "mass" then - ( - massVal = ("mass = " + ((testFor[2] as float)*SclVal)as string) - udpInARR[1] = massVal - crytools.outToUDP udpInARR obj false - ) - --Scale Density-- - if testFor[1] == "density" then - ( - densityVal = ("density =" + ((testFor[2] as float)*SclVal)as string) - udpInARR[1] = densityVal - crytools.outToUDP udpInARR obj false - ) - ) - - -- MASS OUTPUT --------------------------------------- - - if useMass.checked == true then - ( - massVal = ("mass = " + objMass.value as string) - crytools.LookAndWrite obj massVal - ) - else - ( - - ) - - -- DENSITY OUTPUT ---------------------------------------- - if useDensity.checked == true then - ( - densityVal = ("density = " + objDensity.value as string) - crytools.LookAndWrite obj densityVal - ) - else - ( - - ) - - -- FORCE PRIMITIVES OUTPUT ---------------------------------------- - if box1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "box" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "box" - ) - ) - if sphere1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "sphere" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "sphere" - ) - ) - if cylinder1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "cylinder" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "cylinder" - ) - ) - if capsule1.checked == true then - ( - for obj in selection do - ( - crytools.LookAndWrite obj "capsule" - ) - ) - else - ( - for obj in selection do - ( - cryTools.LookAndDelete obj "capsule" - ) - ) - - --------JOINT PROPERTIES--------- - if useJoint.checked == true then - ( - if jointLimit.value != 0 then - ( - jLim = ("limit = " + jointLimit.value as string) - crytools.LookAndWrite obj jLim - ) - else - ( - cryTools.LookAndDelete obj "limit" - ) - - if jointTwist.value != 0 then - ( - jTwis = ("twist = " + jointTwist.value as string) - crytools.LookAndWrite obj jTwis - ) - else - ( - cryTools.LookAndDelete obj "twist" - ) - - if jointBend.value != 0 then - ( - jBen = ("bend = " + jointBend.value as string) - crytools.LookAndWrite obj jBen - ) - else - ( - cryTools.LookAndDelete obj "bend" - ) - - if jointPull.value != 0 then - ( - jPul = ("pull = " + jointPull.value as string) - crytools.LookAndWrite obj jPul - ) - else - ( - cryTools.LookAndDelete obj "pull" - ) - - if jointPush.value != 0 then - ( - jPus = ("push = " + jointPush.value as string) - crytools.LookAndWrite obj jPus - ) - else - ( - cryTools.LookAndDelete obj "push" - ) - - if jointShift.value != 0 then - ( - jShif = ("shift = " + jointShift.value as string) - crytools.LookAndWrite obj jShif - ) - else - ( - cryTools.LookAndDelete obj "shift" - ) - ) - else - ( - cryTools.LookAndDelete obj "limit" - cryTools.LookAndDelete obj "twist" - cryTools.LookAndDelete obj "bend" - cryTools.LookAndDelete obj "pull" - cryTools.LookAndDelete obj "push" - cryTools.LookAndDelete obj "shift" - ) - ------------Destroyable Objects------------ - if isMain.checked == true then obj.name = "Main" - if isRemain.checked == true then obj.name = "Remain" - - if isEntity.checked == true then - ( - crytools.LookAndWrite obj "entity" - ) - else - ( - crytools.LookAndDelete obj "entity" - ) - - if xrot.checked == true then - ( - AxisRotations = "rotaxes = x" - if yrot.checked == true then - ( - AxisRotations = "rotaxes = xy" - if zrot.checked == true then - ( - AxisRotations = "rotaxes = xyz" - ) - ) - else - ( - if zrot.checked == true then - ( - AxisRotations = "rotaxes = xz" - ) - ) - crytools.LookAndWrite obj AxisRotations - ) - - if yrot.checked == true then - ( - AxisRotations = "rotaxes = y" - if xrot.checked == true then - ( - AxisRotations = "rotaxes = xy" - if zrot.checked == true then - ( - AxisRotations = "rotaxes = xyz" - ) - ) - else - ( - if zrot.checked == true then - ( - AxisRotations = "rotaxes = yz" - ) - ) - crytools.LookAndWrite obj AxisRotations - ) - - if zrot.checked == true then - ( - AxisRotations = "rotaxes = z" - if yrot.checked == true then - ( - AxisRotations = "rotaxes = yz" - if xrot.checked == true then - ( - AxisRotations = "rotaxes = xyz" - ) - ) - else - ( - if xrot.checked == true then - ( - AxisRotations = "rotaxes = xz" - ) - ) - crytools.LookAndWrite obj AxisRotations - ) - if xrot.checked ==false and yrot.checked==false and zrot.checked==false then - ( - crytools.LookAndDelete obj "rotaxes" - ) - - if sizeVar.value != 0 then - ( - Var = ("sizevar = " + sizeVar.value as string) - crytools.LookAndWrite obj Var - ) - else - ( - crytools.LookAndDelete obj "sizevar" - ) - - if GenericCount.value != 0 then - ( - GenCount = ("generic = " + GenericCount.value as string) - crytools.LookAndWrite obj GenCount - ) - else - ( - crytools.LookAndDelete obj "generic" - ) - ) - ) - - on useJoint changed state do - ( - for obj in selection do - ( - if (classof obj) != Dummy then - ( - if (classof obj) != Point then - ( - messagebox "Only Helper objects can be joints\nThe selected objects are not all Dummy or Point helpers" - useJoint.checked = false - return undefined - ) - ) - ) - if useJoint.checked == true then - ( - jointLimit.enabled = true - jointTwist.enabled = true - jointBend.enabled = true - jointPull.enabled = true - jointPush.enabled = true - jointShift.enabled = true - - jLimit.enabled = true - jTwist.enabled = true - jBend.enabled = true - jPull.enabled = true - jPush.enabled = true - jShift.enabled = true - jScale.enabled = true - - ) - else - ( - jointLimit.enabled = false - jointTwist.enabled = false - jointBend.enabled = false - jointPull.enabled = false - jointPush.enabled = false - jointShift.enabled = false - - jLimit.enabled = false - jTwist.enabled = false - jBend.enabled = false - jPull.enabled = false - jPush.enabled = false - jShift.enabled = false - jScale.enabled = false - - ) - ) - - - ------PICKABLE GENERAL PROPERTY------ - on isPickable changed state do - ( - if ispickable.checked == true then - ( - for obj in selection do - ( - - ) - ) - ) - - ---------DESTROYABLE OBJECTS------------- - on isMain changed state do - ( - MainPresent = false - for x in objects do - ( - if x.name == "Main" then MainPresent = true - ) - if MainPresent == true then - ( - messagebox "There can only be one Main object" - isMain.checked = false - ) - if isMain.checked == true then isRemain.checked=false - ) - on isRemain changed state do - ( - RemainPresent = false - for x in objects do - ( - if x.name == "Remain" then RemainPresent = true - ) - if RemainPresent == true then - ( - messagebox "There can only be one Remain object" - isRemain.checked = false - ) - if isRemain.checked == true then isMain.checked=false - ) - - - on isBone changed state do - ( - if isBone.checked == true then - ( - isBoneTXT.enabled = true - ) - else - ( - isBoneTXT.enabled = false - ) - ) - - --------------------------------------------- - -------CGF METADATA LISTER--------- - --------------------------------------------- - - /*on openMetaDataLister pressed do - ( - rollout listview_rollout "CGF MetaData Lister" - ( - fn initListView lv = - ( - lv.gridLines = true - lv.View = #lvwReport - lv.fullRowSelect = true - - layout_def = #("Node","Mass","Density","Primitive","Joint","Limit,Twist,Bend,Pull,Push,Shift") - - for i in layout_def do - ( - column = lv.ColumnHeaders.add() - column.text = I - column.width = 1500 - if (column.text = I) == "Limit,Twist,Bend,Pull,Push,Shift" then - ( - column.width = 4300 - ) - ) - ) - - fn fillInSpreadSheet lv = - ( - for o in selection do - ( - li = lv.ListItems.add() - li.text = o.name - sub_li = li.ListSubItems.add() - sub_li.text = (crytools.getUDP o "mass") as string - sub_li = li.ListSubItems.add() - sub_li.text = (crytools.getUDP o "density") as string - sub_li = li.ListSubItems.add() - sub_li.text = try((o.mesh.numfaces) as string)catch("--") - sub_li = li.ListSubItems.add() - sub_li.text = (o.material) as string - ) - ) - - activeXControl lv_objects "MSComctlLib.ListViewCtrl" width:790 height:190 align:#center - on listview_rollout open do - ( - initListView lv_objects - fillInSpreadSheet lv_objects - ) - ) - - try(destroyDialog listview_rollout)catch() - createDialog listview_rollout 800 200 - )*/ -) - -addRollout ArtistTools CryArtistTools -addRollout Diagnostics CryArtistTools rolledup:true -addRollout metadataManager CryArtistTools rolledup:true -) - - diff --git a/Tools/maxscript/CryInfo.ms b/Tools/maxscript/CryInfo.ms deleted file mode 100644 index 4a0c4e01da..0000000000 --- a/Tools/maxscript/CryInfo.ms +++ /dev/null @@ -1,68 +0,0 @@ -------------------------------------------------------------------------------- --- cryInfoFloater.ms --- Version 1.2 --- by Christopher Evans -------------------------------------------------------------------------------- - -if cryInfoFloater != undefined do ( destroydialog cryInfoFloater ) - -rollout cryInfoFloater "cryInfo 1.4" - ( - edittext cryInfo_txt text:"cryInfo" fieldWidth:390 height:260 pos:[1,3] - button saveinfo_txt "Save Updated Info" pos:[3,269] - button runEmbed "Run Embedded Scripts" pos:[115,269] enabled:false - - -- on cryinfo open - on cryInfoFloater open do - ( - - if $cryInfo != undefined then - ( - cryInfo_txt.text = (getUserPropBuffer $cryInfo) - ) - - if $cryInfo == undefined then - ( - cryInfo_txt.text = "There is no cryInfo node present.\nType info in here and press \"Save Updated Info\" to save cryInfo in this file." - ) - if $cryEmbed == undefined then - ( - runEmbed.enabled = false - ) - else - ( - runEmbed.enabled = true - ) - ) - - -- on save info pressed - on saveinfo_txt pressed do - ( - - if $cryInfo == undefined then - ( - dummy name:"cryInfo" pos:[0,0,0] boxsize:[1,1,1] - ) - - setUserPropBuffer $cryInfo cryInfo_txt.text - - ) - - -- on runembed pressed - on runEmbed pressed do - ( - runme = (getUserPropBuffer $cryEmbed) - execute runme - ) - - -- on resized do - on cryInfoFloater resized size do - ( - size1 = size as string - size2 = filterstring size1 "[]," - cryInfo_txt.width = ((size2[1] as float) - 10) - cryInfo_txt.height = ((size2[2] as float) - 35) - saveinfo_txt.pos = [4, (cryInfoFloater.height - 26)] - ) - ) - createDialog cryInfoFloater 400 295 bgcolor:black fgcolor:white style:#(#style_resizing, #style_titlebar, #style_border, #style_sysmenu) \ No newline at end of file diff --git a/Tools/maxscript/CryInfoLoader.ms b/Tools/maxscript/CryInfoLoader.ms deleted file mode 100644 index 7e6c5d9da0..0000000000 --- a/Tools/maxscript/CryInfoLoader.ms +++ /dev/null @@ -1,76 +0,0 @@ -------------------------------------------------------------------------------- --- cryInfoLoader.ms --- This checks for cryinfo on load of every file. --- Version 1.2 --- by Christopher Evans -------------------------------------------------------------------------------- - -if cryInfoFloater != undefined do ( destroydialog cryInfoFloater ) - -if $cryInfo == undefined then - ( - print "No cryInfo detected" - ) -else -( -rollout cryInfoFloater "cryInfo 1.4" - ( - edittext cryInfo_txt text:"cryInfo" fieldWidth:390 height:260 pos:[1,3] - button saveinfo_txt "Save Updated Info" pos:[3,269] - button runEmbed "Run Embedded Scripts" pos:[115,269] enabled:false - - -- on cryinfo open - on cryInfoFloater open do - ( - - if $cryInfo != undefined then - ( - cryInfo_txt.text = (getUserPropBuffer $cryInfo) - ) - - if $cryInfo == undefined then - ( - cryInfo_txt.text = "There is no cryInfo node present.\nType info in here and press \"Save Updated Info\" to save cryInfo in this file." - ) - if $cryEmbed == undefined then - ( - runEmbed.enabled = false - ) - else - ( - runEmbed.enabled = true - ) - ) - - -- on save info pressed - on saveinfo_txt pressed do - ( - - if $cryInfo == undefined then - ( - dummy name:"cryInfo" pos:[0,0,0] boxsize:[1,1,1] - ) - - setUserPropBuffer $cryInfo cryInfo_txt.text - - ) - - -- on runembed pressed - on runEmbed pressed do - ( - runme = (getUserPropBuffer $cryEmbed) - execute runme - ) - - -- on resized do - on cryInfoFloater resized size do - ( - size1 = size as string - size2 = filterstring size1 "[]," - cryInfo_txt.width = ((size2[1] as float) - 10) - cryInfo_txt.height = ((size2[2] as float) - 35) - saveinfo_txt.pos = [4, (cryInfoFloater.height - 26)] - ) - ) - createDialog cryInfoFloater 400 295 bgcolor:black fgcolor:white style:#(#style_resizing, #style_titlebar, #style_border, #style_sysmenu) -) \ No newline at end of file diff --git a/Tools/maxscript/CryMakeBlendShader.ms b/Tools/maxscript/CryMakeBlendShader.ms deleted file mode 100644 index 9c73ec7944..0000000000 --- a/Tools/maxscript/CryMakeBlendShader.ms +++ /dev/null @@ -1,150 +0,0 @@ - - function createBlendFromMaxMat obj idx = - ( - - local blendShader = "" - local msg = "" - - global buildPathFull_crytools - - if buildPathFull_crytools == undefined then ( - local scriptPath = getSourceFileName() - scriptPath = substituteString scriptPath "\\CryMakeBlendShader.ms" "" - - print scriptPath - - blendShader = (scriptPath + "\\fx\\cryBlendShader.fx") - ) else ( - - blendShader = (buildPathFull_crytools + "Tools\\maxscript\\fx\\cryBlendShader.fx") - ) - - --local obj = $ - - local mat = obj.material - local numSubMats = getNumSubMtls mat - local matSlotOrig = (idx * 2) - 1 - setMeditMaterial matSlotOrig mat - - if (numSubMats > 0) then - ( - local newMat = multiMaterial() - newMat.numsubs = numSubMats - newMat.name = (mat.name + "_DX") - - local newSlot = matSlotOrig+1 - setMeditMaterial newSlot newMat - activeMeditSlot = newSlot - - print ("New MultiMaterial: "+newMat.name) - msg = ("Created mat: "+newMat.name+" in slot "+(newSlot as string)) - - local subMats = mat.materialList - - for i = 1 to numSubMats do - ( - newMat.materialList[i] = DirectX_9_Shader () - newMat.materialList[i].effectFile = blendShader - - newMat.materialList[i].name = mat.materialList[i].name - newMat.names[i] = mat.materialList[i].name - - if (isValidObj mat.materialList[i].diffuseMap) then - ( - print ("Creating submat "+mat.materialList[i].name+"...") - local bmFilename = mat.materialList[i].diffuseMap.fileName - - if (doesFileExist(bmFilename)) then - ( - local bm = openBitMap bmFilename - newMat.materialList[i].diffuseTexture1 = bm - ) else ( - print ("WARNING: File Not Found: "+bmFilename) - ) - ) - - if (isValidObj mat.materialList[i].bumpMap) then - ( - local bmFilename = mat.materialList[i].bumpMap.fileName - - if (doesFileExist(bmFilename)) then - ( - local bm = openBitMap bmFilename - newMat.materialList[i].normalMap = bm - ) else ( - print ("WARNING: File Not Found: "+bmFilename) - ) - ) - - ) - - ) else ( - local newMat = Material() - newMat.name = (mat.name + "_DX") - - local newSlot = matSlotOrig+1 - setMeditMaterial newSlot newMat - activeMeditSlot = newSlot - - print ("New Material: "+newMat.name) - msg = ("Created mat: "+newMat.name+" in slot "+(newSlot as string)) - - newMat = DirectX_9_Shader () - newMat.effectFile = blendShader - - if (isValidObj mat.diffuseMap) then - ( - local bmFilename = mat.diffuseMap.fileName - if (doesFileExist(bmFilename)) then - ( - local bm = openBitMap bmFilename - newMat.diffuseTexture1 = bm - ) else ( - print ("WARNING: File Not Found: "+bmFilename) - ) - ) - - if (isValidObj mat.bumpMap) then - ( - local bmFilename = mat.bumpMap.fileName - if (doesFileExist(bmFilename)) then - ( - local bm = openBitMap bmFilename - newMat.normalMap = bm - ) else ( - print ("WARNING: File Not Found: "+bmFilename) - ) - ) - ) - - msg = (msg + "\n\nNow pick Dirt textures and apply new material to your object.") - MatEditor.Open() - - messageBox msg title:"Cry Make Blend Shader" - - ) - - try(destroyDialog CryBlendShader_rollout)catch() - rollout CryBlendShader_rollout "CryMakeBlendShader" width:200 - ( - button cryMakeBlend_button "Create Blend Shader" toolTip:"Create a DirectX Blend shader from the selected object's Max material(s)" - label cryMakeBlendMsg1 "Select an object, and press button" - label cryMakeBlendMsg2 "to create Blend Shader." - - on cryMakeBlend_button pressed do - ( - if ($ == undefined) then - ( - cryMakeBlendMsg1.text = "You must select an object first" - ) else ( - for i=1 to selection.count do - ( - createBlendFromMaxMat selection[i] i - ) - ) - ) - - ) - - createDialog CryBlendShader_rollout - diff --git a/Tools/maxscript/CryModelling.ms b/Tools/maxscript/CryModelling.ms deleted file mode 100644 index 69c03b29e4..0000000000 --- a/Tools/maxscript/CryModelling.ms +++ /dev/null @@ -1,432 +0,0 @@ -struct CModelling( - GetNrstEdg, NxtEdg, IsSameLoop, SelLimELoop, NxtEdgRing, IsSameRing, SelLimERing, VertsInSameLoop, SelVertLoop, - SelVertRing, IsQuadPoly, SelPolyLoop -) - -CryModelling = cmodelling() - --------------------------Limited Edge Loop--------------------------- - - CryModelling.GetNrstEdg = fn GetNrstEdg Edg1 Edg2 Target = - ( - Edg1Vrts = (polyop.getvertsusingedge $ Edg1) as array - Edg2Vrts = (polyop.getvertsusingedge $ Edg2) as array - TrgtVrts = (polyop.getvertsusingedge $ Target) as array - mP1 = (((polyop.getvert $ Edg1Vrts[1]) + (polyop.getvert $ Edg1Vrts[2]))/2) - mP2 = (((polyop.getvert $ Edg2Vrts[1]) + (polyop.getvert $ Edg2Vrts[2]))/2) - TmP = (((polyop.getvert $ TrgtVrts[1]) + (polyop.getvert $ TrgtVrts[2]))/2) - if (distance Tmp mP1) > (distance Tmp mP2) then Edg2 else Edg1 - ) - - CryModelling.NxtEdg = fn NxtEdg edg trg = - ( - EdgsSel = polyop.getedgeselection $ - Verts = (polyop.getEdgeVerts $ edg) as array - Tmp = #() - NEdg = #() - VEdgs = undefined - for vert in Verts do - ( - VEdgs = (((polyop.getedgesUsingVert $ vert) - #{edg}) * EdgsSel) as array - --print VEdgs - for x in VEdgs do - ( - append Tmp x - ) - ) - --print Tmp.count - if Tmp.count == 1 then append NEdg Tmp[1] - else - ( - append NEdg (CryModelling.GetNrstEdg Tmp[1] Tmp[2] trg) - ) - NEdg[1] - ) - - CryModelling.IsSameLoop = fn IsSameLoop = - ( - with undo off - ( - EdgSel = (polyop.getedgeselection $) as array - polyop.setEdgeSelection $ EdgSel[1] - $.buttonOp #selectEdgeLoop - NSel = polyop.getedgeselection $ - polyop.setEdgeSelection $ EdgSel - if ((NSel * (EdgSel as bitarray)) as array).count != 2 then false else true - ) - ) - - CryModelling.SelLimELoop = fn SelLimELoop = - ( - try - ( - EdgeSel = (polyop.getEdgeSelection $) as array - if CryModelling.IsSameLoop() == true then - ( - with undo on - ( - with redraw off - ( - TargEdg = EdgeSel[2] - SEdg = EdgeSel[1] - NEdg = EdgeSel[1] - FinalSel = #(EdgeSel[1], EdgeSel[2]) - $.buttonOp #selectEdgeLoop - while NEdg != EdgeSel[2] do - ( - Edg = CryModelling.NxtEdg NEdg TargEdg - append FinalSel Edg - NEdg = Edg - ) - ) - ) - polyop.setEdgeSelection $ FinalSel - ) - else - ( - $.buttonOp #selectEdgeLoop - ) - ) - catch (print "The tool works only on EditablePoly Objects.") - ) - - -------------------------Limited Edge Ring--------------------------- - - CryModelling.NxtEdgRing = fn NxtEdgRing edg trg = - ( - EdgsSel = polyop.getedgeselection $ - Verts = polyop.getEdgeVerts $ edg - Edg1 = polyop.getedgesusingvert $ Verts[1] - Edg2 = polyop.getedgesusingvert $ Verts[2] - EdgFaces = (polyop.getEdgeFaces $ edg) as array - NEdgs = #() - if EdgFaces.count == 1 then - ( - Edgs = polyop.getFaceEdges $ EdgFaces[1] as bitarray - if Edgs.numberset == 4 do - ( - (((Edgs - Edg1) - Edg2) as array)[1] - ) - ) - else - ( - FEdgs1 = (polyop.getFaceEdges $ EdgFaces[1]) as bitarray - FEdgs2 = (polyop.getFaceEdges $ EdgFaces[2]) as bitarray - if FEdgs1.numberset == 4 do - ( - append NEdgs (((FEdgs1 - Edg1) - Edg2) as array)[1] - ) - if FEdgs2.numberset == 4 do - ( - append NEdgs (((FEdgs2 - Edg1) - Edg2) as array)[1] - ) - CryModelling.GetNrstEdg NEdgs[1] NEdgs[2] trg - ) - ) - - CryModelling.IsSameRing = fn IsSameRing = - ( - with undo off - ( - EdgSel = (polyop.getedgeselection $) as array - polyop.setEdgeSelection $ EdgSel[1] - $.buttonOp #selectEdgeRing - NSel = polyop.getedgeselection $ - polyop.setEdgeSelection $ EdgSel - if ((NSel * (EdgSel as bitarray)) as array).count != 2 then false else true - ) - ) - - CryModelling.SelLimERing = fn SelLimERing = - ( - try - ( - EdgeSel = (polyop.getEdgeSelection $) as array - if CryModelling.IsSameRing() == true then - ( - with undo on - ( - with redraw off - ( - TargEdg = EdgeSel[2] - SEdg = EdgeSel[1] - NEdg = EdgeSel[1] - FinalSel = #(EdgeSel[1], EdgeSel[2]) - $.buttonOp #selectEdgeRing - while NEdg != EdgeSel[2] do - ( - Edg = CryModelling.NxtEdgRing NEdg TargEdg - append FinalSel Edg - NEdg = Edg - ) - ) - ) - polyop.setEdgeSelection $ FinalSel - ) - else - ( - $.buttonOp #selectEdgeRing - ) - ) - catch (print "The tool works only on EditablePoly Objects.") - ) - - -------------------------Limited Vert Loop---------------------------- - CryModelling.VertsInSameLoop = fn VertsInSameLoop = - ( - Verts = polyop.GetVertSelection $ - Edgs = #() - for x in Verts do - ( - Edges = polyop.GetEdgesUsingVert $ x - polyop.setEdgeSelection $ Edges - $.ButtonOp #SelectEdgeLoop - Tmp = polyop.GetEdgeSelection $ - append Edgs Tmp - ) - if (Edgs[1]*Edgs[2]).numberset != 0 then true else false - ) - - CryModelling.SelVertLoop = fn SelVertLoop = - ( - try - ( - if CryModelling.VertsInSameLoop() == true then - ( - with undo on - ( - with redraw off - ( - Verts = polyop.GetVertSelection $ - Edgs = #() - for x in Verts do - ( - Edges = polyop.GetEdgesUsingVert $ x - polyop.setEdgeSelection $ Edges - $.ButtonOp #SelectEdgeLoop - Tmp = polyop.GetEdgeSelection $ - append Edgs Tmp - ) - LoopEdgs = Edgs[1]*Edgs[2] - V1Edges = (polyop.GetEdgesUsingVert $ (Verts as array)[1]) * LoopEdgs - V2Edges = (polyop.GetEdgesUsingVert $ (Verts as array)[2]) * LoopEdgs - LoopArr = #() - for i = 1 to 2 do - ( - VEdgs = polyop.setEdgeSelection $ #{(V1Edges as array)[i], (V2Edges as array)[i]} - CryModelling.SelLimELoop() - append LoopArr (polyop.getEdgeSelection $) - ) - FEdgs = LoopArr[1]*LoopArr[2] - FVerts = #{} - for x in FEdgs do - ( - FVerts = FVerts + (polyop.GetVertsUsingEdge $ x) - ) - polyop.setVertSelection $ FVerts - ) - redrawViews() - ) - ) - else - ( - print "Verts are not in the same loop!" - ) - ) - catch (print "The tool works only on EditablePoly Objects.") - ) - - -------------------------Limited Vert Ring------------------------------ - CryModelling.SelVertRing = fn SelVertRing = - ( - try - ( - with undo on - ( - with redraw off - ( - VertSel = polyop.GetVertSelection $ - UserEdgs = polyop.GetEdgeSelection $ - Edgs = #{} - FEdgs = #{} - for v in VertSel do - ( - Vedgs = polyop.GetEdgesUsingVert $ v - if Edgs.numberset != 0 then - ( - Inter = Edgs * Vedgs - if Inter.numberset != 0 then - ( - FEdgs = FEdgs + Inter - ) - else - ( - Edgs = Edgs + Vedgs - ) - ) - else - ( - Edgs = Edgs + Vedgs - ) - ) - polyop.SetEdgeSelection $ FEdgs - SelLimERing() - ESel = polyop.GetEdgeSelection $ - FVerts = #{} - for edg in ESel do - ( - FVerts = FVerts + (polyop.GetVertsUsingEdge $ edg) - ) - polyop.setEdgeSelection $ UserEdgs - polyop.setVertSelection $ FVerts - ) - redrawviews() - ) - ) - catch (print "The tool works only on EditablePoly Objects.") - ) - - -------------------------Limited Poly Loop------------------------------ - CryModelling.IsQuadPoly = fn IsQuadPoly = - ( - Arr = #() - for x in $.selectedfaces do - ( - a = (polyop.getFaceEdges $ x.index) as array - if a.count == 4 then - ( - append Arr x - ) - ) - if Arr.count == $.selectedfaces.count then true else false - ) - - CryModelling.SelPolyLoop = fn SelPolyLoop = - ( - try - ( - if CryModelling.IsQuadPoly() == true then - ( - EdgeCount = #{} - for x in $.selectedFaces do - ( - a = (polyop.GetFaceEdges $ x.index) as array - for x in a do - ( - append EdgeCount x - ) - ) - if (EdgeCount as array).count == ($.selectedFaces.count * 4) then - ( - if $.selectedFaces.count == 1 then - ( - with undo on - ( - with redraw off - ( - Sel = #{} - dg = polyop.SetEdgeSelection $ ((polyop.GetFaceEdges $ $.selectedFaces[1].index) as array) - $.buttonOp #selectEdgeRing - for x in $.selectedEdges do - ( - a = (polyop.getEdgeFaces $ x.index) as array - for x in a do - ( - if ((polyop.getFaceEdges $ x)as array).count == 4 then - ( - append Sel x - ) - ) - ) - polyop.SetFaceSelection $ Sel - ) - redrawviews() - ) - ) - else - ( - with undo on - ( - with redraw off - ( - Face1 = $.selectedFaces[1].index - Face2 = $.selectedFaces[2].index - Edgs1 = polyop.GetEdgesUsingFace $ Face1 - Edgs2 = polyop.GetEdgesUsingFace $ Face2 - UserSel = polyop.getedgeselection $ - polyop.setEdgeSelection $ Edgs1 - $.ButtonOp #SelectEdgeRing - NSel = (polyop.GetEdgeSelection $) - Edgs1 - CrosSel = NSel * Edgs2 - if CrosSel.numberset != 0 then - ( - polyop.setEdgeSelection $ CrosSel - $.ButtonOp #SelectEdgeRing - NSel = (polyop.GetEdgeSelection $) - Edgs2 - CrosSel2 = NSel * Edgs1 - FinalEdgs = #{} - for i = 1 to 2 do - ( - SelEdg = polyop.setEdgeSelection $ #((CrosSel as array)[i], (CrosSel2 as array)[i]) - CryModelling.SelLimERing () - FinalEdgs = FinalEdgs + (polyop.getedgeselection $) - ) - polyop.setEdgeSelection $ UserSel - FinalFaces = #{} - for x in FinalEdgs do - ( - Faces = polyop.getFacesUsingEdge $ x - for f in Faces do - ( - if ((polyop.GetEdgesUsingFace $ f)*FinalEdgs).numberset == 2 then - ( - append FinalFaces f - ) - ) - ) - polyop.setFaceSelection $ FinalFaces - ) - redrawViews() - ) - ) - ) - ) - else - ( - if $.selectedFaces.count == 2 then - ( - with undo on - ( - with redraw off - ( - Ar1 = #() - for x in $.selectedFaces do - ( - Edg = polyop.getEdgesUsingFace $ x.index - append Ar1 Edg - ) - FEdg = (Ar1[1]*Ar1[2]) - polyop.setedgeselection $ FEdg - $.buttonOp #selectEdgeRing - Sel = #{} - for x in $.selectededges do - ( - a = (polyop.getEdgeFaces $ x.index) as array - for x in a do - ( - if ((polyop.getFaceEdges $ x)as array).count == 4 then - ( - append Sel x - ) - ) - ) - polyop.SetFaceSelection $ Sel - ) - redrawviews () - ) - ) - ) - ) - ) - catch (print "The tool works only on EditablePoly Objects.") - ) \ No newline at end of file diff --git a/Tools/maxscript/CryMorphTools.ms b/Tools/maxscript/CryMorphTools.ms deleted file mode 100644 index 1eb15b8008..0000000000 --- a/Tools/maxscript/CryMorphTools.ms +++ /dev/null @@ -1,1760 +0,0 @@ -------------------------------------------------------------------------------- --- CryRiggingTools.ms --- Version 2.6 External --- by Christopher Evans -------------------------------------------------------------------------------- - -collapsedCache = #() -global CryMorphTools -( - if CryMorphTools != undefined do ( closerolloutfloater CryMorphTools ) - CryMorphTools = newrolloutfloater "CryMorphTools 2.7" 190 800 - ---used for index2loc -Index2Loc -obj1 = "" -obj1_points = #() -collapsedCache = #() -getVariations = #() -hiddenVerts = #{} - ---used by FacialTools -numMorphs = "" -exportedMorphs = #() - -------------------------------------------------------------------------------- ---FacialTools -------------------------------------------------------------------------------- - rollout FacialTools "Facial Tools" - ( - group "Auto Generation/Extraction" - ( - label labelMORPHS "No Head Loaded" - checkbutton LoadMorphsBTN "Load Morphs From Selected" - checkbox alignToDummy "Organize (Align to helpers)" offset:[13,0] - checkbox dirty "Enable dirty output" offset:[13,-4] - edittext layer_txt "New Layer:" fieldWidth:95 - button doit "Bake Morphs" enabled:false - progressbar doit_prog color:red - button compile "Add organized morphs to head" enabled:false - pickbutton compile2 "Add selected morphs to picked" - ) - - group "Delete Faces From Targets" - ( - checkbutton loadSelection "Load Polygon Selection" - button deletePolys "Remove From Selected" enabled:false - ) - group "Mirror Eye Animation" - ( - button mirrorEyesLR "Mirror Left Eye to Right" - button mirrorEyesRL "Mirror Right Eye to Left" - ) - group "Morph Transfer" - ( - button selectOriginal "Load Original head" - button selectTransfer "Load Target Head" - button bakeTransfer "Bake Out Transfer" - checkbox addSuffix "Add obj name suffix" - checkbox moveAside "Translate right 20 units" - ) - - ---FacialTools open/close -------------------------- - on FacialTools open do - ( - alignToDummy.checked = true - if polysSelected != undefined then - ( - deletepolys.enabled = true - ) - - local tempVar = cryTools.inFromINI "CryTools" "morph_pos" - if tempVar == "" then tempVar = [7,7] - else - ( - try - ( - tempVar = execute tempVar - crymorphtools.pos = tempVar - ) - catch - ( - cryTools.outToINI "CryTools" "morph_pos" "[7,7]" - crymorphtools.pos = [7,7] - ) - ) - ) - - on FacialTools close do - ( - cryTools.outToINI "CryTools" "morph_pos" (crymorphtools.pos as String) - ) - - ---LoadMorphsBTN ----------------- - on LoadMorphsBTN changed state do - ( - if state == on then - ( - try - ( - testMorph = $.morpher - ) - catch - ( - messageBox "Object has no Morpher modifier" - LoadMorphsBTN.checked = false - return undefined - ) - for i = 1 to 100 do - ( - test = $.morpher[i].name - print $.morpher[i].name - if test == "- empty -" then - ( - numMorphs = (i - 1) - exit loop - ) - ) - labelMORPHS.text = ((numMorphs as string) + " Morphs Loaded From:") - LoadMorphsBTN.text = ($.name) - doit.enabled = true - ) - else - ( - LoadMorphsBTN.text = "No Head Loaded" - doit.enabled = false - ) - ) - - ---Align/Dirty Checked ----------------------- - on alignToDummy changed state do - ( - if alignToDummy.checked == true then - ( - dirty.checked = false - ) - else - ( - dirty.checked = true - ) - ) - - on dirty changed state do - ( - if dirty.checked == true then - ( - alignToDummy.checked = false - ) - else - ( - alignToDummy.checked = true - ) - ) - - ---BakeMorphs pressed ---------------------- - on doit pressed do - ( - if selection[1] == undefined do - ( - messageBox "Please select a character head." title:"Error" - return undefined - ) - - try - ( - testMorph = $.morpher - ) - catch - ( - messageBox "Object has no Morpher modifier" - return undefined - ) - - undo "make heads" on - ( - with redraw off - ( - max create mode - --make layer - layer_name = layer_txt.text - layer01 = LayerManager.newLayer() - layer01.setname layer_name - layer01.current = true - - channelcount = numMorphs - exportedMorphs = #() - for i = 1 to channelcount do - ( - old = $ - $.morpher[i].value = 100.0 - morph_name = filterString ($.morpher[i].name) " " - new = snapshot $ name:morph_name[2] - append exportedMorphs new - old.morpher[i].value = 0.0 - select old - doit_prog.value = (i*(100/channelcount)) - ) - max modify mode - doit_prog.value = 0 - ) - ) - - --arbitrary morph dump - if dirty.checked == true then - ( - i=1 - for obj in exportedMorphs do - ( - move obj [(20*i),0,0] - i += 1 - ) - ) - - --move and color - if alignToDummy.checked == true then - ( - undo "organize" on - ( - mn = 1 - for obj in exportedMorphs do - ( - try - ( - obj.transform = (getNodeByName ("Dummy_" + obj.name)).transform - ) - catch - ( - move obj [(20*mn),0,0] - mn += 1 - ) - ) - ) - ) - compile.enabled = true - ) - - -- Add morphs to picked - on compile pressed do - ( - if selection[1] == undefined then - ( - messageBox "Please select a character head." title:"Error" - return undefined - ) - m = 1 - for obj in exportedMorphs do - ( - wm3_mc_buildfromnode $.morpher m obj - m += 1 - ) - ) - - on compile2 picked pick do - ( - try - ( - for i=1 to selection.count do - ( - wm3_mc_buildfromnode pick.morpher i selection[i] - ) - ) - catch() - ) - - --Delete Faces From Targets - on loadSelection changed state do - ( - if state == on do - ( - try - ( - try - ( - testMorph = $.morpher - ) - catch - ( - messageBox "Object has no Morpher modifier" - return undefined - ) - if $selection.count > 0 then - ( - if (getFaceSelection $) == undefined then - polysSelected = (getFaceSelection $) - loadSelection.text = ((polysSelected.count as string) + " Polygons Selected") - deletePolys.enabled = true - ) - ) - catch(loadSelection.checked = false) - ) - if state == off do - ( - loadSelection.text = "Load Polygon Selection" - deletePolys.enabled = false - ) - ) - - on deletePolys pressed do - ( - undo "delete from targets" on - ( - whatHeadsSelected = ($selection as array) - for obj in whatHeadsSelected do - ( - obj.selectedfaces = polysSelected - max modify mode - modPanel.setCurrentObject obj - subObjectLevel = 4 - meshops.delete obj - obj.selectedfaces = #() - ) - ) - ) - - ---Mirror Eyes pressed ---------------------- - on mirrorEyesLR pressed do - ( - left_eye = #($Eye_lid_L_U_01, $Eye_lid_L_U_02, $Eye_lid_L_U_03, $Eye_lid_L_L_01, $Eye_lid_L_L_02, $Eye_lid_L_L_03) - right_eye = #($Eye_lid_R_U_01, $Eye_lid_R_U_02, $Eye_lid_R_U_03, $Eye_lid_R_L_01, $Eye_lid_R_L_02, $Eye_lid_R_L_03) - try - ( - undo "mirror eye anim L R" on - ( - for i=1 to right_eye.count do - ( - deleteKeys right_eye[i].rotation.controller.keys #allkeys - deleteKeys right_eye[i].position.controller.keys #allkeys - deleteKeys right_eye[i].scale.controller.keys #allkeys - right_eye[i].position.controller = copy right_eye[i].position.controller - right_eye[i].rotation.controller = copy right_eye[i].rotation.controller - right_eye[i].rotation.controller = tcb_rotation () - left_eye[i].rotation.controller = tcb_rotation () - ) - for i=1 to right_eye.count do - ( - for r = 1 to left_eye[i].rotation.controller.keys.count do - ( - with animate on - ( - slidertime = left_eye[i].rotation.controller.keys[r].time - crytools.MirrorObjs right_eye[i] left_eye[i] $bip01 #y #y - ) - ) - ) - ) - )catch() - ) - - on mirrorEyesRL pressed do - ( - left_eye = #($Eye_lid_L_U_01, $Eye_lid_L_U_02, $Eye_lid_L_U_03, $Eye_lid_L_L_01, $Eye_lid_L_L_02, $Eye_lid_L_L_03) - right_eye = #($Eye_lid_R_U_01, $Eye_lid_R_U_02, $Eye_lid_R_U_03, $Eye_lid_R_L_01, $Eye_lid_R_L_02, $Eye_lid_R_L_03) - try - ( - undo "mirror eye anim R L" on - ( - for i=1 to left_eye.count do - ( - deleteKeys left_eye[i].rotation.controller.keys #allkeys - deleteKeys left_eye[i].position.controller.keys #allkeys - deleteKeys left_eye[i].scale.controller.keys #allkeys - left_eye[i].position.controller = copy left_eye[i].position.controller - left_eye[i].rotation.controller = copy left_eye[i].rotation.controller - left_eye[i].rotation.controller = tcb_rotation () - right_eye[i].rotation.controller = tcb_rotation () - ) - for i=1 to left_eye.count do - ( - for r = 1 to right_eye[i].rotation.controller.keys.count do - ( - with animate on - ( - slidertime = right_eye[i].rotation.controller.keys[r].time - crytools.MirrorObjs left_eye[i] right_eye[i] $bip01 #y #y - ) - ) - ) - ) - )catch() - ) - - ---Morph Transfer ------------------ - on selectOriginal pressed do - ( - try - ( - testMorph = $.morpher - ) - catch - ( - messageBox "Object has no Morpher modifier" - return undefined - ) - global originalHead = $ - selectOriginal.text = $.name - ) - - on selectTransfer pressed do - ( - try - ( - testMorph = $.morpher - ) - catch - ( - messageBox "Object has no Morpher modifier" - return undefined - ) - if $selection.count > 0 then - ( - global transferHead = $ - selectTransfer.text = $.name - ) - else - messageBox "Select Node before." title:"Error" - ) - - on bakeTransfer pressed do - ( - if originalHead == undefined then - ( - messagebox "No Original Head Loaded" - return undefined - ) - - if $selection.count > 0 then - ( - moveVal = 0 - for i = 1 to 1000 do - ( - testName = originalHead.morpher[i].name - if testName == "- empty -" then - ( - exit loop - ) - originalHead.morpher[i].value = 100.0 - morph_name = filterString (originalHead.morpher[i].name) " " - new = morph_name[2] - if addSuffix.checked == true then - ( - snapshot transferHead name:(new + "_" + transferHead.name) isSelected:true - ) - else - ( - snapshot transferHead name:new isSelected:true - ) - if moveAside.checked == true then - ( - moveVal += 20 - $.position.x = moveVal - ) - originalHead.morpher[i].value = 0.0 - ) - ) - else - messageBox "Select Node before." title:"Error" - ) - ) - - -------------------------------------------------------------------------------- ---DrivenMorphs -------------------------------------------------------------------------------- - rollout DrivenMorphs "Pose Driven Morphs" - ( - group "Head/Neck" - ( - pickbutton headSel "Select Character Head" - dropdownlist headVectors items:#("Select A Pose Vector...","Look_Up","Look_Down","Look_Right", "Look_Left", "Tilt_Left", "Tilt_Right") height:25 - button createHeadshape "Create A Pose Shape" - button addTarget "Add Pose Shape To Morpher" - button extractTarget "Extract Relative Pose Shape " - --button testMapping "Test Pose Space Mapping" - ) - - group "Fleshy Eyes (Auto-created)" - ( - dropdownlist eyeVectors items:#("Select An Eye Direction...","Eyelid_left_upper_middle","Eyelid_left_upper_right","Eyelid_left_upper_left","Eyelid_left_lower_middle","Eyelid_left_lower_left","Eyelid_left_lower_right","Eyelid_left_middle_right","Eyelid_left_middle_left","Eyelid_right_upper_middle","Eyelid_right_upper_left","Eyelid_right _upper_right","Eyelid_right_lower_middle","Eyelid_right_lower_right","Eyelid_right_lower_left","Eyelid_right_middle_left","Eyelid_right_middle_right") height:25 - checkbox createEyeLayer "" - edittext layerEye_txt "+Layer:" fieldWidth:85 enabled:false offset:[18,-20] - button bakeEyeShapes "Bake Eye Shapes" --enabled:false - button addEyeTarget "Add Current Shape To Morpher" enabled:false - button extractEyeTarget "Extract Relative Shape " --enabled:false - ) - - group "Shoulders" - ( - dropdownlist armVectors items:#("Select A Pose Vector...","Left Arm Up","Left Arm Down","Left Arm Forward","Left Arm Back","Right Arm Up","Right Arm Down","Right Arm Forward","Right Arm Back") height:25 enabled:false - button createShoulderShape "Auto-Create All Shapes" enabled:false - button addShoulderTarget "Add Pose Shape To Morpher" enabled:false - button extractShoulderTarget "Extract Relative Pose Shape " enabled:false - ) - - on headSel picked obj do - ( - global objItem = obj - headSel.text = (obj.name + " Head Loaded") - ) - - on headVectors selected i do - ( - if i == 1 then - ( - createHeadshape.text = "Create A Pose Shape" - createHeadshape.enabled = false - addTarget.enabled = false - extractTarget.enabled = false - ) - else - ( - if i == 2 then - ( - if $Look_Up_sculpt != undefined then - ( - createHeadshape.enabled = false - createHeadshape.text = "Look_Up Pose Shape Exists" - addTarget.enabled = true - extractTarget.enabled = true - return undefined - ) - ) - if i == 3 then - ( - if $Look_Down_sculpt != undefined then - ( - createHeadshape.enabled = false - addTarget.enabled = true - extractTarget.enabled = true - createHeadshape.text = "Look_Down Pose Shape Exists" - return undefined - ) - ) - if i == 4 then - ( - if $Look_Right_sculpt != undefined then - ( - createHeadshape.enabled = false - addTarget.enabled = true - extractTarget.enabled = true - createHeadshape.text = "Look_Down Pose Shape Exists" - return undefined - ) - ) - if i == 5 then - ( - if $Look_Left_sculpt != undefined then - ( - createHeadshape.enabled = false - addTarget.enabled = true - extractTarget.enabled = true - createHeadshape.text = "Look_Down Pose Shape Exists" - return undefined - ) - ) - if i == 6 then - ( - if $Tilt_Left_sculpt != undefined then - ( - createHeadshape.enabled = false - addTarget.enabled = true - extractTarget.enabled = true - createHeadshape.text = "Tilt_Left Pose Shape Exists" - return undefined - ) - ) - if i == 7 then - ( - if $Tilt_Right_sculpt != undefined then - ( - createHeadshape.enabled = false - addTarget.enabled = true - extractTarget.enabled = true - createHeadshape.text = "Tilt_Right Pose Shape Exists" - return undefined - ) - ) - addTarget.enabled = false - extractTarget.enabled = false - createHeadshape.enabled = true - createHeadshape.text = "Create Pose Shape" - ) - ) - - on DrivenMorphs open do - ( - createHeadshape.enabled = false - addTarget.enabled = false - extractTarget.enabled = false - if $Eye_lid_L_L_02 == undefined then - ( - bakeEyeShapes.enabled = false - addEyeTarget.enabled = false - extractEyeTarget.enabled = false - ) - ) - - on createHeadShape pressed do - undo "create_snapshot" on - ( - ( - if objItem == undefined then - ( - messageBox "Please load a character head." title:"Error" - return undefined - ) - - newSnap = headVectors.selected - - if slidertime != 0 then - ( - slidertime = 0 - ) - - case headVectors.selection of - ( - 2: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1]) - 3: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1]) - 4: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0]) - 5: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0]) - 6: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0]) - 7: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0]) - ) - - print ("creating " + newSnap) - snapshot objItem name: (newSnap + "_sculpt") isSelected:true - convertTo $ PolyMeshObject - - createHeadshape.text = (newSnap + " Pose Shape Exists") - createHeadshape.enabled = false - - case headVectors.selection of - ( - 2: move $ [0,0,60] - 3: move $ [0,0,30] - 4: move $ [-30,0,0] - 5: move $ [30,0,0] - 6: move $ [30,0,30] - 7: move $ [-30,0,30] - ) - - case headVectors.selection of - ( - 2: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1]) - 3: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1]) - 4: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0]) - 5: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0]) - 6: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0]) - 7: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0]) - ) - select objItem - addTarget.enabled = true - extractTarget.enabled = true - ) - ) - - on addTarget pressed do - undo "add_target" on - ( - for i = 1 to 1000 do - ( - test = objItem.morpher[i].name - if test == "- empty -" then - ( - global numMorphs = (i - 1) - exit loop - ) - ) - - select objItem - max modify mode - - case headVectors.selection of - ( - 2: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1]) - 3: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1]) - 4: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0]) - 5: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0]) - 6: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0]) - 7: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0]) - ) - - case headVectors.selection of - ( - 2: crytools.CreateBindPoseMorph $Look_Up_sculpt objItem 1 1 1 "Look_Up" - 3: crytools.CreateBindPoseMorph $Look_Down_sculpt objItem 1 1 2 "Look_Down" - 4: crytools.CreateBindPoseMorph $Look_Right_sculpt objItem 1 1 3 "Look_Right" - 5: crytools.CreateBindPoseMorph $Look_Left_sculpt objItem 1 1 4 "Look_Left" - 6: crytools.CreateBindPoseMorph $Tilt_Left_sculpt objItem 1 1 5 "Tilt_Left" - 7: crytools.CreateBindPoseMorph $Tilt_Right_sculpt objItem 1 1 6 "Tilt_Right" - ) - - case headVectors.selection of - ( - 2: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1]) - 3: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1]) - 4: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0]) - 5: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0]) - 6: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0]) - 7: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0]) - ) - ) - - on extractTarget pressed do - ( - undo "extract_target" on - ( - select objItem - max modify mode - modPanel.setCurrentObject $.modifiers[#Skin] - - case headVectors.selection of - ( - 2: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1]) - 3: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1]) - 4: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0]) - 5: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0]) - 6: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0]) - 7: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0]) - ) - - case headVectors.selection of - ( - 2: crytools.CreateBindPoseMorph $Look_Up_sculpt objItem 0 0 0 "Look_Up" - 3: crytools.CreateBindPoseMorph $Look_Down_sculpt objItem 0 0 0 "Look_Down" - 4: crytools.CreateBindPoseMorph $Look_Right_sculpt objItem 0 0 0 "Look_Right" - 5: crytools.CreateBindPoseMorph $Look_Left_sculpt objItem 0 0 0 "Look_Left" - 6: crytools.CreateBindPoseMorph $Tilt_Left_sculpt objItem 0 0 0 "Tilt_Left" - 7: crytools.CreateBindPoseMorph $Tilt_Right_sculpt objItem 0 0 0 "Tilt_Right" - ) - case headVectors.selection of - ( - 2: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1]) - 3: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1]) - 4: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0]) - 5: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0]) - 6: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0]) - 7: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0]) - ) - ) - ) - - on eyeVectors selected i do - ( - case i of - ( - 2: sliderTime = 1f - 3: sliderTime = 2f - 4: sliderTime = 3f - 5: sliderTime = 4f - 6: sliderTime = 5f - 7: sliderTime = 6f - 8: sliderTime = 7f - 9: sliderTime = 8f - 10: sliderTime = 11f - 11: sliderTime = 12f - 12: sliderTime = 13f - 13: sliderTime = 14f - 14: sliderTime = 15f - 15: sliderTime = 16f - 16: sliderTime = 17f - 17: sliderTime = 18f - 18: sliderTime = 19f - ) - ) - - on bakeEyeShapes pressed do - ( - undo "bake out eye morphs" on - ( - if $ == undefined then - ( - messagebox "Please select a head with the proper bone rig." - return undefined - ) - if createEyeLayer.checked == true then - ( - layer_name = layerEye_txt.text - layer01 = LayerManager.newLayer() - layer01.setname layer_name - layer01.current = true - ) - sliderTime = 1f - snapshot $ name:eyeVectors.items[2] --isSelected:true - sliderTime = 2f - snapshot $ name:eyeVectors.items[3] - sliderTime = 3f - snapshot $ name:eyeVectors.items[4] - sliderTime = 4f - snapshot $ name:eyeVectors.items[5] - sliderTime = 5f - snapshot $ name:eyeVectors.items[6] - sliderTime = 6f - snapshot $ name:eyeVectors.items[7] - sliderTime = 7f - snapshot $ name:eyeVectors.items[8] - sliderTime = 8f - snapshot $ name:eyeVectors.items[9] - sliderTime = 11f - snapshot $ name:eyeVectors.items[10] - sliderTime = 12f - snapshot $ name:eyeVectors.items[11] - sliderTime = 13f - snapshot $ name:eyeVectors.items[12] - sliderTime = 14f - snapshot $ name:eyeVectors.items[13] - sliderTime = 15f - snapshot $ name:eyeVectors.items[14] - sliderTime = 16f - snapshot $ name:eyeVectors.items[15] - sliderTime = 17f - snapshot $ name:eyeVectors.items[16] - sliderTime = 18f - snapshot $ name:eyeVectors.items[17] - sliderTime = 19f - slidertime = 0f - ) - ) - - on extractEyeTarget pressed do - ( - if $ == undefined then - ( - messagebox "Please select a head with the proper bone rig." - return undefined - ) - - undo "create eye target" on - ( - if createEyeLayer.checked == true then - ( - layer_name = layerEye_txt.text - layer01 = LayerManager.newLayer() - layer01.setname layer_name - layer01.current = true - ) - if eyeVectors.selection == 1 then - ( - messagebox "Please select an eye vector." - return undefined - ) - snapshot $ name:eyevectors.items[eyeVectors.selection] - ) - ) - - on createEyeLayer changed state do - ( - if createEyeLayer.checked == true then - ( - layerEye_txt.enabled = true - layerEye_txt.text = "eyeMorphs" - ) - else - ( - layerEye_txt.enabled = false - ) - ) - ) - - -------------------------------------------------------------------------------- ---DiagnosticTools -------------------------------------------------------------------------------- - rollout GeneralTools "Diagnostic Tools" - ( - button openManager "Open morphManager" - button morphList "Generate morphList" - checkbox addNum "Include channel numbers" align:#center - - on openManager pressed do - ( - if selection[1] == undefined do - ( - messageBox "Please select a character head." title:"Error" - return undefined - ) - - if $.modifiers[#morpher] == undefined then - ( - messagebox "No morph modifier on selected object." title:"Error" - return undefined - ) - - global mf_float, mf_morpher_mod - ( - mf_morpher_mod = $.modifiers[#morpher] - used_channels = #() - txt ="rollout mf_main \"morphManager\" (\n" - for i = 1 to 65 do - ( - if WM3_MC_HasData mf_morpher_mod i then - ( - append used_channels i - txt +="progressbar mf_slider_"+ i as string - txt +=" value:"+ (WM3_MC_GetValue mf_morpher_mod i) as string - txt +=" width:150 height:18 across:4 align:#left\n" - txt +="edittext mf_label_"+i as string - txt +=" align:#right text:\""+i as string+": " - txt +=(WM3_MC_GetName mf_morpher_mod i) +"\"\n" - txt +="on mf_slider_"+i as string+" clicked val do (\n" - txt +="WM3_MC_SetValue mf_morpher_mod " - txt += i as string+" (val as float) \n" - txt +="SliderTime +=0)\n" - ) - )--end i loop - txt +=")\n" - createDialog (execute txt) 680 800 bgcolor:black fgcolor:white - txt ="fn mf_update_slider = (\n" - - for i in used_channels do - ( - txt +="mf_main.mf_slider_"+i as string - txt +=".value = WM3_MC_GetValue mf_morpher_mod "+i as string+" \n" - )--end i loop - txt +=")\n" - global mf_update_slider = execute txt - registertimecallback mf_update_slider - deleteAllChangeHandlers id:#morpher_floater - when parameters mf_morpher_mod changes \ - HandleAt:#RedrawViews \ - id:#morpher_floater do mf_update_slider() - ) - ) - - on morphList pressed do - ( - try - ( - if $.modifiers[#morpher] == undefined then - ( - messagebox "No morph modifier on selected object." title:"Error" - return undefined - ) - if $selection.count > 0 then - ( - for i = 1 to 1000 do - ( - mname = $.morpher[i].name - mnameStripped = (filterstring mname " ") - if addNum.checked == true then - ( - print (mnameStripped[1] + " - " + mnameStripped[2]) - ) - else - ( - print mnameStripped[2] - ) - if mname == "- empty -" then - ( - global numMorphs = (i - 1) - exit loop - ) - ) - ) - else - messageBox "Select Node before." title:"Error" - ) - catch() - ) - ) - - -------------------------------------------------------------------------------- ---BakingTools -------------------------------------------------------------------------------- - rollout bakeTools "Baking Tools" - ( - group "Bake Deformation to Morphs" - ( - button loadBakeObj "Load Selected Object" - edittext bakeObj_txt "baseName:" fieldWidth:85 enabled:false - spinner bakeStart "Start " range:[-10000,10000,0] type:#integer scale:1 fieldWidth:40 offset:[-80,0] enabled:false - spinner bakeEnd "End " range:[-10000,10000,100] type:#integer scale:1 fieldWidth:40 offset:[0,-20] enabled:false - spinner bakeStep "Number of Morphs " range:[-10000,10000,0] type:#integer scale:1 fieldWidth:40 enabled:false - button bakeSequence "-EMPTY-" enabled:false - ) - - on loadBakeObj pressed do - ( - if $ == undefined then - ( - messagebox "please select a deforming object" - return undefined - ) - global bakeObj = $ - loadBakeObj.text = (bakeObj.name + " Loaded") - bakeObj_txt.text = (bakeObj.name + "_#") - bakeObj_txt.enabled = true - bakeStart.enabled = true - bakeEnd.enabled = true - bakeStart.value = animationrange.start - bakeEnd.value = animationrange.end - global bakeName = filterstring bakeObj_txt.text "#" - bakeSequence.text = "Bake " + (bakeObj.name + "_#") - bakeStep.enabled = true - bakeStep.value = 10 - bakesequence.enabled = true - ) - - on bakeSequence pressed do - ( - numFrames = (bakeEnd.value - bakeStart.value) - bakeInterval = (numframes / bakestep.value) - print bakeInterval - t1 = 0 - nameIter = 1 - while t1 < bakeEnd.value do - ( - slidertime = t1 - snapshot bakeObj name:(bakeName[1] + (nameIter as string)) - nameIter += 1 - t1 += bakeInterval - ) - ) - ) - - -------------------------------------------------------------------------------- ---Sync-Collapse by Location (Index2Loc) -------------------------------------------------------------------------------- - fn getVertByLoc node loc = - ( - for i = 1 to (polyOp.getNumVerts node) do - ( - if (polyOp.getVert node i) == loc then - ( - return i - ) - ) - ) - - fn collapseVerts = - ( - try - ( - undo "collapse by loc" on - ( - obj1 = (cryTools.retrieveVar "obj1") - selectedVerts = (getVertSelection obj1 as array) - - if selectedVerts.count != 2 then - ( - messagebox "Please select two verts to collapse." - return undefined - ) - - selectedVertsWorldLoc = #() - for i = 1 to selectedVerts.count do - ( - append selectedVertsWorldLoc (polyOp.getVert obj1 selectedVerts[i]) - ) - - polyOp.collapseVerts obj1 (selectedVerts as bitarray) - update obj1 - - if (cryTools.retrieveVar "hideCollapsedPass") == true then - ( - hiddenVerts += getVertSelection obj1 - polyOp.setHiddenVerts obj1 hiddenVerts - ) - - append collapsedCache #((finditem obj1_points selectedVertsWorldLoc[1]),(finditem obj1_points selectedVertsWorldLoc[2])) - print ((finditem obj1_points selectedVertsWorldLoc[1]) as string + " " + (finditem obj1_points selectedVertsWorldLoc[2]) as string + " collapsed") - - if (cryTools.retrieveVar "syncVariationsPass") == true then - ( - for obj in getVariations do - ( - execme = ("objPointData = " + obj.name + "_points") - execute execme - main_point1 = (findItem obj1_points selectedVertsWorldLoc[1]) - main_point2 = (findItem obj1_points selectedVertsWorldLoc[2]) - pointsInVar = #(main_point1, main_point2) as bitarray - print pointsinvar - polyOp.collapseVerts obj pointsInVar - update obj - ) - ) - ) - ) - catch(format "*** % ***\n" (getCurrentException())) - ) - cryTools.storeFn collapseVerts true - - rollout LocCollapse "Sync-Collapse by Location" - ( - group "Main Object" - ( - checkbutton object1 "Select Main Object" - label numVertsUpperLbl "0000 Vertices" - ) - group "Apply Collapse to Variations" - ( - checkbutton object2 "Select Variations" - label variationNumLbl "Zero Variations Loaded" - ) - group "Collapse Verts" - ( - button collapseVerts "Collapse Verts" - checkbox hideCollapsed "Hide Collapsed" - button unhideAll "Unhide All" offset:[52,-22] - checkbox syncVariations "Collapse Variations as I Work" enabled:false - ) - group "Load/Save Data" - ( - button saveCollapse "Save Collapse Data" - label dataReadOut "No Data Loaded." - button loadCollapse "Load Collapse Data"offset:[-26,0] - button applyCollapse "Apply" enabled:false offset:[57,-26] - checkbox markCollapsed "Mark collapsed verts in red" - ) - Group "Debug Tools" - ( - edittext indexNum width:35 offset:[-5,0] - button getIndexNum "Select by Point Index" offset:[20,-23] - button markVariations "Mark collapsedCache Verts" - label numVertsLbl "000" offset:[-50,5] - button numVertsBtn "Number of Verts" offset:[20,-22] - ) - - on LocCollapse open do - ( - object2.enabled = false - collapseVerts.enabled = false - ) - ---Object1 Button ----------------- - on object1 changed state do - ( - if object1.checked == true then - ( - if $ == undefined then - ( - messagebox "Select an object." - return undefined - ) - - obj1 = $ - cryTools.storeVar $ "obj1" true - object1.text = obj1.name - numVertsUpperLbl.text = (obj1.mesh.verts.count as string + " vertices.") - - for i = 1 to (polyOp.getNumVerts obj1) do - ( - vertLoc = polyOp.getVert obj1 i - append obj1_points vertLoc - print (vertLoc as string + " cached") - ) - print "All vertices cached" - object2.enabled = true - collapseVerts.enabled = true - syncVariations.enabled = true - ) - else - ( - object1.text = "Select Object 1" - obj1 = undefined - object2.enabled = false - collapseVerts.enabled = false - syncVariations.enabled = false - numVertsUpperLbl.text = "0000 Vertices" - ) - ) - ---Object2 Button ----------------- - on object2 changed state do - ( - if object2.checked == true then - ( - if $ == undefined then - ( - messagebox "Select an object." - return undefined - ) - - for i = 1 to selection.count do - ( - if selection[i] == obj1 then - ( - messagebox "The original object should not be in the current selection.." - object2.checked = false - return undefined - ) - --ADD: check for same vert count - - tempPoints = #() - - append getVariations selection[i] - - for n = 1 to (polyOp.getNumVerts selection[i]) do - ( - vertLoc = polyOp.getVert selection[i] n - append tempPoints vertLoc - ) - - execme = ("global " + selection[i].name + "_points = tempPoints") - execute execme - - object2.text = "Variations Loaded" - variationNumLbl.text = (selection.count as string + " variations loaded.") - ) - ) - else - ( - object2.text = "Select Variations" - getVariations = #() - ) - ) - ---Collapse button ------------------ - on collapseVerts pressed do - ( - undo "collapseVert" on - ( - cryTools.storeVar hideCollapsed.checked "hideCollapsedPass" true - cryTools.storeVar syncVariations.checked "syncVariationsPass" true - (crytools.retrieveFn "collapseVerts()")() - --crytools.fnstore[(crytools.storedFn #collapseVerts)]() - ) - ) - - on unhideAll pressed do - ( - try ( polyOp.unHideAllVerts obj1 ) catch() - ) - ---Save Collapse Data ---------------------- - on saveCollapse pressed do - ( - fileSaveLoc = getSaveFileName types:"Index2Loc(*.i2l)|*.i2l" initialDir:"c:\\" - if fileSaveLoc == undefined do (return undefined) - outputFile = createFile fileSaveLoc - outputFile = openFile fileSaveLoc mode:"w" - - format ("obj1 = " + obj1.name + "+" + ((filterstring numVertsUpperLbl.text " ")[1]) as string +"\n") to: outputFile - for i = 1 to obj1_points.count do - ( - format (("obj1_" + obj1_points[i] as string) + "\n") to: outputFile - ) - format "collapsed verts\n" to: outputFile - for i = 1 to collapsedCache.count do - ( - format ((collapsedCache[i] as string) + "\n") to: outputFile - ) - close outputFile - - if doesfileexist fileSaveLoc == true then - ( - dataReadOut.text = ("File saved successfully.") - ) - else - ( - dataReadOut.text = ("File was not saved?") - ) - ) - ---Load Collapse Data ---------------------- - on loadCollapse pressed do - ( - fileInLoc = getOpenFileName getSaveFileName types:"Index2Loc(*.i2l)|*.i2l" initialDir:"c:\\" - if fileInLoc == undefined do (return undefined) - incData = (crytools.readIN fileInLoc echo:false) - object1.checked = true - object1.text = (filterstring (filterstring incData[1] " =")[2] "+")[1] - obj1PtCount = (filterstring incData[1] "+")[2] - numVertsUpperLbl.text = ((obj1PtCount as string) + " vertices.") - obj1_points = #() - cacheStart = 0 - object2.enabled = true - - fileInArr = (filterstring fileInLoc "\\") - dataReadOut.text = (fileInArr[fileInArr.count] + " loaded.") - - for i = 2 to incData.count do - ( - if incData[i] == "collapsed verts" then - ( - cacheStart = i - exit - ) - append obj1_points (filterstring incData[i] "_")[2] - ) - - for i = (cacheStart + 1) to (incData.count - 1) do - ( - execute ("append collapsedCache " + incData[i]) - ) - - --ADD: check point count against orig main - applyCollapse.enabled = true - ) - - ---Apply Collapse Data ----------------------- - on applyCollapse pressed do - ( - if getVariations.count == 0 or getVariations == undefined then - ( - messagebox "Please select a variation." - return undefined - ) - - for obj in getVariations do - ( - if obj.mesh.verts.count != obj1_points.count then - ( - messagebox ("Variation " + obj.name + " has " + obj.mesh.verts.count as string + " vertices,\n" + "But original model " + object1.text + " had " + obj1_points.count as string) - return undefined - ) - ) - - undo "apply_collapse" on - ( - for obj in getVariations do - ( - for i = 1 to collapsedcache.count do - ( - pointGet1 = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][1]]) - pointGet2 = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][2]]) - selectedVerts = #(pointGet1,pointGet2) - --print selectedVerts - locOfNew = ((polyOp.getVert obj pointGet1) + (polyOp.getVert obj pointGet2))/2 - polyOp.collapseVerts obj (selectedVerts as bitarray) - update obj - if markCollapsed.checked == true then - ( - if (layermanager.getLayerFromName "_collapseMarkers") == undefined then - ( - layer01 = LayerManager.newLayer() - layer01.setname "_collapseMarkers" - layer01.current = true - ) - else - ( - layer01 = (layermanager.getLayerFromName "_collapseMarkers") - layer01.current = true - ) - box name:("collapsed_" + collapsedcache[i][1] as string) length:.1 width:.1 height:.1 position:(locOfNew + [0,0,-.05]) wirecolor:(color 255 0 0) - ) - ) - ) - ) - ) - ---debug group tools -------------------- - on getIndexNum pressed do - ( - try - ( - if selection.count != 1 then - ( - messagebox "please select an object" - return undefined - ) - polyOp.setVertSelection $ (#(indexNum.text as float) as bitarray) - ) - catch(print "must be in sub object level (edit poly)") - ) - - on markVariations pressed do - ( - if getVariations.count == 0 or getVariations == undefined then - ( - messagebox "Please select a variation." - return undefined - ) - - for obj in getVariations do - ( - if obj.mesh.verts.count != obj1_points.count then - ( - messagebox ("Variation " + obj.name + " has " + obj.mesh.verts.count as string + " vertices,\n" + "But original model " + object1.text + " had " + obj1_points.count as string) - return undefined - ) - ) - - undo "mark verts" on - ( - if (layermanager.getLayerFromName "_collapseMarkers") == undefined then - ( - layer01 = LayerManager.newLayer() - layer01.setname "_collapseMarkers" - layer01.current = true - ) - else - ( - layer01 = (layermanager.getLayerFromName "_collapseMarkers") - layer01.current = true - ) - for obj in getVariations do - ( - pointGet = "" - for i = 1 to collapsedcache.count do - ( - pointGet = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][1]]) - dummy name:("marker_" + collapsedcache[i][1] as string) position:(execute (obj.name + "_points"))[pointGet] scale:[.01,.01,.01] - pointGet = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][2]]) - dummy name:("marker_" + collapsedcache[i][2] as string) position:(execute (obj.name + "_points"))[pointGet] scale:[.01,.01,.01] - ) - ) - ) - ) - - on numVertsBtn pressed do - ( - if selection.count != 1 then - ( - messagebox "You have more than one mesh selected" - return undefined - ) - numVertsLbl.text = $.mesh.verts.count as string - ) - - ) - -------------------------------------------------------------------------------- ---Mirror Deformation (Morphs) -------------------------------------------------------------------------------- - rollout mirrorMorphs "Mirror Deformation (Morphs)" - ( - - local sourceObj = "" - local vTotalPairs = #() - - group "Load/Save Data" - ( - button sourceObjBTN "Select Source Object" - label sourceName "No Source Object" - label centDone "" offset:[-65,0] - button saveData "Save" offset:[-25,-22] - button loadData "Load" offset:[25,-26] - ) - group "Mirror" - ( - button rL "RIGHT ------> LEFT" enabled:false - button lR "RIGHT <------ LEFT" enabled:false - checkbox newBox "New Obj" checked:true enabled:false - checkbox morpherBox "Morpher" offset:[80,-20] enabled:false - checkBox epolyBox "Edit Poly" enabled:false - checkBox sameBox "Same Obj" offset:[80,-20] enabled:false - ) - - on mirrorMorphs open do - ( - - ) - - on sourceObjBTN pressed do - ( - if $ == undefined then - ( - messagebox "Nothing selected!" - return undefined - ) - sourceName.text = $.name - sourceObj = $ - ) - - on saveData pressed do - ( - saveName = getSaveFileName types:"Data(*.dat)|*.dat|" - if saveName == undefined then - ( - return undefined - ) - outputFile = createFile saveName - totalVerts = #() - - numVerts = sourceObj.numVerts - - for i = 1 to numVerts do - ( - append totalVerts i - ) - - selectedVerts = sourceObj.selectedVerts.count - format "%\n" selectedVerts to:outputFile - - vertSel = #() - unSelVerts = #() - - for i=1 to selectedVerts do - ( - append vertSel (sourceObj.selectedVerts[i].index) - ) - - for i=1 to totalVerts.count do - ( - if (findItem vertSel i) == 0 then - ( - append unSelVerts i - ) - ) - - for i = 1 to selectedVerts do - ( - mVertPos = sourceObj.verts[vertSel[i]].pos - mVertPos.x = abs(mVertPos.x) - - dist = crytools.vertDistance mVertPos sourceObj.verts[unSelVerts[1]].pos - mVertIndex = unSelVerts[1] - - for m = 2 to unSelVerts.count do - ( - test = cryTools.vertDistance mVertPos sourceObj.verts[unSelVerts[m]].pos - - if test < dist then - ( - dist = test - mVertIndex = unSelVerts[m] - ) - ) - - vPair = #() - append vPair vertSel[i] - append vPair mVertIndex - - format "%\n" vPair to:outputFile - vIndex = findItem unSelVerts mVertIndex - deleteItem unSelVerts vIndex - centDone.text = ("%" + (((((i as float) / (selectedVerts as float) ) * 100) as integer) as string)) - ) - subobjectLevel = 0 - close outputFile - centDone.text = "" - rL.enabled = true - lR.enabled = true - newBox.enabled = true - --morpherBox.enabled = true - --epolyBox.enabled = true - sameBox.enabled = true - ) - - on loadData pressed do - ( - vPairs = #() - vTotalPairs = #() - loadFile = getOpenFileName types:"Data(*.dat)|*.dat|" - if loadFile == undefined then - ( - return undefined - ) - outputfile = openFile loadFile - --vPairs = (filterString (readline outputFile) " ")[1] as integer - vPairs = (readline outputFile) as integer - vPair - - for i=1 to vPairs do - ( - vPair = execute((readline outputFile)) - append vTotalPairs vPair - ) - close outputfile - rL.enabled = true - lR.enabled = true - newBox.enabled = true - --morpherBox.enabled = true - --epolyBox.enabled = true - sameBox.enabled = true - ) - - on rL pressed do - ( - undo "mirror R --> L" on - ( - for obj in selection do - ( - local obj2 = "" - if newBox.checked or morpherBox.checked == true then - ( - snapshot sourceObj name:(obj.name + "_mirrored") - obj2 = (execute("$" + obj.name + "_mirrored")) - obj2.transform = sourceObj.transform - ) - baseVertPos - oldPos = obj.transform - obj.transform = sourceObj.transform - - if ((classof obj as string) == "Editable_Poly" or (classof obj as string) == "Editable_mesh") then - ( - for i = 1 to vTotalPairs.count do - ( - if newBox.checked == true then - ( - baseVertPos = obj.verts[vTotalPairs[i][2]].pos - baseVertPos.x = -1 * baseVertPos.x - if (classof obj2 as string) == "Editable_Poly" then - ( - polyOp.setVert obj2 vTotalPairs[i][1] baseVertPos - ) - else - ( - meshOp.setVert obj2 vTotalPairs[i][1] baseVertPos - ) - ) - if sameBox.checked == true then - ( - baseVertPos = obj.verts[vTotalPairs[i][2]].pos - baseVertPos.x = -1 * baseVertPos.x - if (classof obj as string) == "Editable_Poly" then - ( - polyOp.setVert obj vTotalPairs[i][1] baseVertPos - ) - else - ( - meshOp.setVert obj vTotalPairs[i][1] baseVertPos - ) - ) - ) - if samebox.checked == false then - ( - obj2.transform = oldPos - ) - if morpherBox.checked == true then - ( - addModifier obj (morpher()) - wm3_mc_buildfromnode obj.morpher 1 obj2 - delete obj2 - ) - ) - else - ( - messagebox "Object needs to be edit poly or edit mesh!" - ) - obj.transform = oldPos - ) - ) - ) - - on lR pressed do - ( - undo "mirror R --> L" on - ( - for obj in selection do - ( - obj2 = "" - if newBox.checked or morpherBox.checked == true then - ( - snapshot sourceObj name:(obj.name + "_mirrored") - obj2 = (execute("$" + obj.name + "_mirrored")) - obj2.transform = sourceObj.transform - ) - - local baseVertPos - oldPos = obj.transform - obj.transform = sourceObj.transform - - if ((classof obj as string) == "Editable_Poly" or (classof obj as string) == "Editable_mesh") then - ( - for i = 1 to vTotalPairs.count do - ( - if newBox.checked == true then - ( - baseVertPos = obj.verts[vTotalPairs[i][1]].pos - baseVertPos.x = -1 * baseVertPos.x - if (classof obj2 as string) == "Editable_Poly" then - ( - polyOp.setVert obj2 vTotalPairs[i][2] baseVertPos - ) - else - ( - meshOp.setVert obj2 vTotalPairs[i][2] baseVertPos - ) - ) - if sameBox.checked == true then - ( - baseVertPos = obj.verts[vTotalPairs[i][1]].pos - baseVertPos.x = -1 * baseVertPos.x - if (classof obj as string) == "Editable_Poly" then - ( - polyOp.setVert obj vTotalPairs[i][2] baseVertPos - ) - else - ( - meshOp.setVert obj vTotalPairs[i][2] baseVertPos - ) - ) - ) - if newbox.checked == true then - ( - obj2.transform = oldPos - ) - if morpherBox.checked == true then - ( - addModifier obj (morpher()) - wm3_mc_buildfromnode obj.morpher 1 obj2 - delete obj2 - ) - ) - else - ( - messagebox "Object needs to be edit poly or edit mesh!" - ) - obj.transform = oldPos - ) - ) - ) - - on newBox changed state do - ( - if newBox.checked == true then - ( - sameBox.checked = false - morpherBox.checked = false - epolybox.checked = false - ) - ) - on sameBox changed state do - ( - if sameBox.checked == true then - ( - newBox.checked = false - morpherBox.checked = false - epolybox.checked = false - ) - ) - on morpherBox changed state do - ( - if morpherBox.checked == true then - ( - newBox.checked = false - sameBox.checked = false - epolybox.checked = false - ) - ) - on epolyBox changed state do - ( - if epolyBox.checked == true then - ( - newBox.checked = false - morpherBox.checked = false - samebox.checked = false - ) - ) - ) - - addRollout FacialTools CryMorphTools - addRollout LocCollapse CryMorphTools rolledup:true - addRollout DrivenMorphs CryMorphTools rolledup:true - addRollout BakeTools CryMorphTools rolledup:true - addRollout GeneralTools CryMorphTools rolledup:true - addRollout mirrorMorphs CryMorphTools rolledup:true -) \ No newline at end of file diff --git a/Tools/maxscript/CryRiggingTools.ms b/Tools/maxscript/CryRiggingTools.ms deleted file mode 100644 index a9c02f50d3..0000000000 --- a/Tools/maxscript/CryRiggingTools.ms +++ /dev/null @@ -1,3023 +0,0 @@ -------------------------------------------------------------------------------- --- CryRiggingTools.ms --- Version 2.5 External --- by Christopher Evans -------------------------------------------------------------------------------- - -global CryRiggingTools - -udpInARR = #() -testFor = #() - -fn ANoon_EnvelopeCallbackFunction = -( -WindowHandle = DialogMonitorOPS.GetWindowHandle() -theDialogName = UIAccessor.GetWindowText WindowHandle -if theDialogName != undefined and matchpattern theDialogName pattern:"*Load Envelopes*" do -UIAccessor.PressButtonByName WindowHandle "OK" -true -) - -(--begin local scope - crytools.maxDirTxt = (getdir #maxroot) - -------------------------------------------------------------------------------- --- Define functions -------------------------------------------------------------------------------- - fn getStart = - ( - animEnd = (animationrange.start as string) - animEndArray = filterString animEnd "f" - return (animEndArray[1] as float) - ) - - fn getEnd = - ( - animEnd = (animationrange.end as string) - animEndArray = filterString animEnd "f" - return (animEndArray[1] as float) - ) - -------------------------------------------------------------------------------- --- CryRiggingTools interface -------------------------------------------------------------------------------- - - if CryRiggingTools != undefined do ( closerolloutfloater CryRiggingTools ) - CryRiggingTools = newrolloutfloater "CryRiggingTools 2.5" 190 815 - ---InternalTools - these are nothing special; just internal tools that are specific to our projects -------------------------------------------------------------------------------- - rollout InternalTools "Internal Tools" - ( - group "Helper Joints" - ( - button showHelpers "Hide/Show helper joints" enabled:false - button selectHelpers "Select helper joints" - button UnSelectHelpers "Unselect helper joints" - ) - - group "File Fixes/Cleanup" - ( - button mirror_weapon "Mirror Weapon Bone" - button selectWeaponPos "Select New Attachment Points" - checkbox deleteWeaponPos "delete/add" - checkbox hideWeaponPos "hide/show" offset:[80,-20] - button addTwistWire "Wire FP Hands Twist Bones" - button renameDummies "Comment Out Nub Bones" - ) - - group "Locomotion Manager" - ( - button locoChannel "Extract Data to LocoMan Node" - checkbox lockX "Lock to X" - checkbox lockY "Lock to Y" offset:[75,-20] - checkbox ignoreXrot "Ignore Root Rotation" - checkbox placeOnGround "Restrict to Ground Plane" - checkbox useHead "Use Head for Direction" - checkbox useRoot "Use Root for Direction" - checkbox freezeLock "Freeze and Lock" - ) - group "Remove Unwanted Bones" - ( - button removeBones "Remove Bones" - checkbox remBonesChk "Remove from Skin" - checkbox delBones "Delete bone objects" - ) - - on InternalTools open do - ( - placeOnGround.checked = true - useroot.checked = true - freezelock.checked = true - ) - - --unselect helpers pressed - on UnselectHelpers pressed do - ( - deselect $'Bip01 L clavicular deltoid01' - deselect $'Bip01 L clavicular deltoid02' - deselect $'Bip01 R clavicular deltoid01' - deselect $'Bip01 R clavicular deltoid02' - deselect $'Bip01 R rear deltoid01' - deselect $'Bip01 R rear deltoid02' - deselect $'Bip01 L rear deltoid01' - deselect $'Bip01 L rear deltoid02' - deselect $'Bip01 L Lat Control' - deselect $'Bip01 L Pec Control' - deselect $'Bip01 R Pec Control' - deselect $'Bip01 R Lat Control' - deselect $'Bip01 L knee' - deselect $'Bip01 R knee' - ) - - on selectHelpers pressed do - ( - select $'Bip01 L clavicular deltoid01' - selectMore $'Bip01 L clavicular deltoid02' - selectMore $'Bip01 R clavicular deltoid01' - selectMore $'Bip01 R clavicular deltoid02' - selectMore $'Bip01 R rear deltoid01' - selectMore $'Bip01 R rear deltoid02' - selectMore $'Bip01 L rear deltoid01' - selectMore $'Bip01 L rear deltoid02' - selectMore $'Bip01 L Lat Control' - selectMore $'Bip01 R Lat Control' - selectMore $'Bip01 L knee' - selectMore $'Bip01 R knee' - selectMore $'Bip01 R clavicular deltoid01_end' - selectMore $'Bip01 R rear deltoid01_end' - selectMore $'Bip01 R rear deltoid02_end' - selectMore $'Bip01 R Lat Control_end' - selectMore $'Bip01 R Pec Control_end01' - selectMore $'Bip01 L Pec Control_end' - selectMore $'Bip01 L Lat Control_end' - selectMore $'Bip01 R clavicular deltoid_end' - selectMore $'Bip01 L rear deltoid02_end' - selectMore $'Bip01 L rear deltoid01_end' - selectMore $'Bip01 R knee_end' - selectMore $'Bip01 L knee_end' - - if $'Bip01 R Pec Control' == undefined then - ( - selectMore $'Rope1 Seg1' - selectMore $'Rope1 Seg2' - selectMore $'Rope2 Seg1' - selectMore $'Rope2 Seg2' - ) - else - ( - selectMore $'Bip01 L Pec Control' - selectMore $'Bip01 R Pec Control' - ) - - ) - - -- Add New Attachment Points - on addWeapons pressed do - ( - undo "add weaponPos attachments" on - ( - if (doesfileexist (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max")) != false then - ( - mergeMAXfile (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") #("weaponPos_hurricane", "weaponPos_rifle02", "weaponPos_rifle01", "weaponPos_pistol_R_hip", "weaponPos_pistol_R_leg", "weaponPos_grenade_R_hip", "weaponPos_law", "weaponPos_grenade_L_hip", "weaponPos_pistol_L_hip", "weaponPos_pistol_L_leg") #alwaysReparent - ) - else - ( - messagebox ("Cannot find " + crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") - ) - ) - ) - - on selectWeaponPos pressed do - ( - if deleteweaponpos.checked == true then - ( - if $weaponPos_pistol_R_hip == undefined then - ( - undo "add weaponPos attachments" on - ( - if (doesfileexist (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max")) != false then - ( - mergeMAXfile (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") #("weaponPos_hurricane", "weaponPos_rifle02", "weaponPos_rifle01", "weaponPos_pistol_R_hip", "weaponPos_pistol_R_leg", "weaponPos_grenade_R_hip", "weaponPos_law", "weaponPos_grenade_L_hip", "weaponPos_pistol_L_hip", "weaponPos_pistol_L_leg") #alwaysReparent - ) - else - ( - messagebox ("Cannot find " + crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") - ) - ) - ) - else - ( - undo "delete weaponPos attachments" on - ( - delete $weaponPos* - ) - ) - ) - - if hideweaponpos.checked == true then - ( - if $weaponPos_law.ishidden == true then - ( - unhide $weaponpos* - ) - else - ( - hide $weaponPos* - ) - ) - - else - ( - select $weaponPos* - ) - ) - - -- mirror weapon bone - on mirror_weapon pressed do - ( - try - with undo "weapon_bone" on - ( - weapon_pos = in coordsys parent $weapon_bone.pos - maxops.cloneNodes $weapon_bone clonetype:#copy actualNodelist:$weapon_bone - $weapon_bone01.name = "alt_weapon_bone01" - $alt_weapon_bone01.parent = $'Bip01 L Hand' - crytools.MirrorObjs $alt_weapon_bone01 $weapon_bone $Bip01 #y #y - in coordsys parent $alt_weapon_bone01.pos = weapon_pos - rot_90 = eulerangles 0 0 -90 - in coordsys local rotate $weapon_bone rot_90 - in coordsys local rotate $alt_weapon_bone01 rot_90 - ) - catch - ( - messageBox "Please load a biped." title:"Error" - ) - ) - - on addTwistWire pressed do - ( - paramWire.connect $hand_R.rotation.controller[#X_Rotation] $twist03_R.rotation.controller[#X_Rotation] "X_Rotation*.6" - paramWire.connect $hand_R.rotation.controller[#X_Rotation] $twist02_R.rotation.controller[#X_Rotation] "X_Rotation*.4" - paramWire.connect $hand_R.rotation.controller[#X_Rotation] $twist01_R.rotation.controller[#X_Rotation] "X_Rotation*.25" - - paramWire.connect $hand_L.rotation.controller[#X_Rotation] $twist03_L.rotation.controller[#X_Rotation] "X_Rotation*.6" - paramWire.connect $hand_L.rotation.controller[#X_Rotation] $twist02_L.rotation.controller[#X_Rotation] "X_Rotation*.4" - paramWire.connect $hand_L.rotation.controller[#X_Rotation] $twist01_L.rotation.controller[#X_Rotation] "X_Rotation*.25" - ) - - on ignoreXrot changed state do - ( - if ignorexrot.checked == true then - ( - useroot.checked = false - usehead.checked = false - useroot.enabled = false - usehead.enabled = false - ) - else - ( - useroot.enabled = true - usehead.enabled = true - usehead.checked = true - ) - ) - - on usehead changed state do - ( - useroot.checked = false - ) - on useroot changed state do - ( - usehead.checked = false - ) - - -- add loco channel - on locoChannel pressed do - ( - if $Locator_Locomotion == undefined then - ( - if (doesfileexist (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max")) != false then - ( - mergeMAXfile (crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") #("Locator_Locomotion") - ) - else - ( - messagebox ("Cannot find " + crytools.BuildPathFull + "\\tools\\maxscript\\ref\\weapon_positions.max") - ) - ) - - for i = (getstart()) to (getend()) do - ( - with animate on - ( - slidertime = i - $Locator_Locomotion.transform = $Bip01.transform - - --ignore rotation - if ignoreXrot.checked == true then - ( - in coordsys world $Locator_Locomotion.rotation.controller.x_rotation = 0 - in coordsys world $Locator_Locomotion.rotation.controller.y_rotation = 0 - --in coordsys world $Locator_Locomotion.rotation.controller.z_rotation = -90 - ) - - if lockX.checked == true then - ( - in coordsys world $Locator_Locomotion.position.controller.x_position = 0 - ) - - if lockY.checked == true then - ( - in coordsys world $Locator_Locomotion.position.controller.y_position = 0 - ) - - if useRoot.checked == true then - ( - in coordsys world $Locator_Locomotion.rotation.controller.x_rotation = 0 - in coordsys world $Locator_Locomotion.rotation.controller.y_rotation = 0 - in coordsys world $Locator_Locomotion.rotation.controller.z_rotation += -90 - - ) - - if useHead.checked == true then - ( - headXrot = $'Bip01 Head'.transform.rotation as eulerangles - in coordsys world $Locator_Locomotion.rotation.controller.x_rotation = 0 - in coordsys world $Locator_Locomotion.rotation.controller.y_rotation = 0 - in coordsys world $Locator_Locomotion.rotation.controller.z_rotation = headXrot.x - ) - - --place on ground - if placeOnground.checked == true then - ( - in coordsys world $Locator_Locomotion.position.controller.z_position = 0 - ) - ) - ) - if freezeLock.checked == true then - ( - $Locator_Locomotion.isfrozen = true - $Locator_Locomotion.showfrozeningray = false - ) - ) - - on removeBones pressed do - ( - if remBonesChk.checked == true then - ( - remBones = $Bip*nub as array - join remBones ($_* as array) - join remBones ($weapon* as array) - join remBones ($alt_weapon* as array) - --join remBones ($bip01 as array) - - for obj in selection do - ( - modPanel.setCurrentObject obj.modifiers[#Skin] - undo "Remove Bones" on - ( - for u=1 to remBones.count do - ( - for i=1 to (skinOps.getNumberBones obj.skin) do - ( - if (skinOps.GetBoneName obj.skin i 0) == remBones[u].name then - ( - skinOps.removeBone obj.skin i - print ("removing " + remBones[u].name) - print i - exit loop - ) - ) - ) - ) - ) - ) - if delBones.checked == true then - ( - remBones = $Bip*nub as array - join remBones ($_* as array) - --join remBones ($weapon* as array) - for obj in remBones do - ( - delete obj - ) - ) - ) - - on renameDummies pressed do - ( - try ($'Bip01 HeadNub'.name = "_Bip01 HeadNub") catch() - try ($'Bip01 R Finger0Nub'.name = "_Bip01 R Finger0Nub") catch() - try ($'Bip01 R Finger1Nub'.name = "_Bip01 R Finger1Nub") catch() - try ($'Bip01 R Finger2Nub'.name = "_Bip01 R Finger2Nub") catch() - try ($'Bip01 R Finger3Nub'.name = "_Bip01 R Finger3Nub") catch() - try ($'Bip01 R Finger4Nub'.name = "_Bip01 R Finger4Nub") catch() - try ($'Bip01 L Finger0Nub'.name = "_Bip01 L Finger0Nub") catch() - try ($'Bip01 L Finger1Nub'.name = "_Bip01 L Finger1Nub") catch() - try ($'Bip01 L Finger2Nub'.name = "_Bip01 L Finger2Nub") catch() - try ($'Bip01 L Finger3Nub'.name = "_Bip01 L Finger3Nub") catch() - try ($'Bip01 L Finger4Nub'.name = "_Bip01 L Finger4Nub") catch() - --try ($'Bip01 R Toe0Nub'.name = "_Bip01 R Toe0Nub") catch() - --try ($'Bip01 L Toe0Nub'.name = "_Bip01 L Toe0Nub") catch() - try ($'Bip01 L Heel'.name = "_Bip01 L Heel") catch() - try ($'Bip01 R Heel'.name = "_Bip01 R Heel") catch() - try ($'Bip01LToeHelper'.name = "_Bip01LToeHelper") catch() - try ($'Bip01RToeHelper'.name = "_Bip01RToeHelper") catch() - ) - ) - -------------------------------------------------------------------------------- ---RiggingTools -------------------------------------------------------------------------------- - rollout RiggingTools "Rigging Tools" - ( - group "General Tools" - ( - button matchPivotBtn "matchPivot" offset:[-45,0] - button zeroOut "zeroOut Rots" offset:[35,-26] - button clampTimeline "Clamp Timeline at Current" - button clampTimelineKey "Clamp Timeline at Last Key" - button controllerXferChild "Copy/Past Controller" - checkbox copyPos "Pos" checked:true offset:[0,0] - checkbox copyRot "Rot" checked:true offset:[50,-20] - checkbox copyScale "Scale" checked:false enabled:false offset:[100,-20] - checkbox toChildren "to children" checked:true offset:[0,0] - checkbox toSelection "to selected" enabled:false offset:[80,-20] - button reduceKeysBTN "Reduce Keys on Sel" - ) - - group "Biped Tools" - ( - dropdownlist bipSelect "" items:#("") width:130 offset:[-5,0] - button refreshBipTools "<" offset:[65,-27] tooltip:"Refresh" - checkbutton figureMode "Figure Mode" offset:[-40,0] - checkbutton hideBiped " Hide Biped " offset:[40,-26] - button bipMotion "Bip Motion Menu" - button selectAllBIP "Select Biped Bones" - checkbutton inPlace "Toggle In Place Mode" - button convertBip "Convert Biped to Bones" - ) - - group "Rotate Bind Pose" - ( - button rootBTN "Load Selected Skeleton Root" - label rotBindLBL "No skeleton loaded." - spinner xVal "X" type:#float range:[-358,358,0] fieldWidth:35 offset:[-103,0] enabled:false - spinner yVal "Y" type:#float range:[-358,358,0] fieldWidth:35 offset:[-48,-21] enabled:false - spinner zVal "Z" type:#float range:[-358,358,180] fieldWidth:35 offset:[8,-21] enabled:false - button rotBindSel " Rotate Selected Meshes " enabled:false - ) - - group "Bone Tools" - ( - label boneadjustLBL "Adjust Bones:" align:#left - spinner boneTaper "Taper:" type:#float fieldWidth:25 offset:[-6,-18] - spinner boneWidth "Width:" type:#float fieldWidth:25 range:[0,500,1] offset:[-85,0] - spinner boneHeight "Height:" type:#float fieldwidth:25 range:[0,500,1] offset:[-6,-21] - button nodes2bones "Convert Hierarchy to Bones" - checkbox fromSelected "fromSelected" align:#left checked:true - checkbox fromRoot "fromRoot" offset:[90,-20] - ) - - group "Vertex Tools" - ( - button channelInfoBTN "channelInfo" offset:[-40,0] - checkbutton vertColors "vertexColors" offset:[40,-26] - button addChannel "Add cryChannel to Selected" enabled:false - label cryChannel "There is currently no cryChannel" - ) - - -- on rigging tools open - on RiggingTools open do - ( - if $bip01 != undefined then - ( - if (LayerManager.getLayerFromName "Bip") == undefined then - ( - messageBox "The BIP layer is not named \"Bip\"" title: "Error" - return undefined - ) - bip_layer = LayerManager.getLayerFromName "Bip" - if bip_layer.ishidden == true then - ( - hideBiped.checked = true - ) - - biped_ctrl=$bip01.controller - if biped_ctrl.figureMode == true then - ( - figureMode.checked = true - ) - else - ( - figureMode.checked = false - ) - - figureSet = "if $bip01 != undefined then\n" - figureSet += "(\n" - figureSet += "if $bip01.controller.figureMode == true then (CryRiggingTools.rollouts[2].figureMode.checked = true) else (CryRiggingTools.rollouts[2].figureMode.checked = false)\n" - figureSet += ")\n" - figureSet += "else (print \"no biped found\")" - callbacks.addscript #filePostOpen figureSet id:#figureMode - - BIPhideSet = "bip_layer = LayerManager.getLayerFromName \"Bip\"\n" - BIPhideSet += "if bip_layer == undefined then\n" - BIPhideSet += "(\n" - BIPhideSet += "if bip_layer.ishidden == true then (CryRiggingTools.rollouts[2].hideBiped.checked = true) else (CryRiggingTools.rollouts[2].hideBiped.checked = false)\n" - BIPhideSet += ")\n" - BIPhideSet += "else (print \"there is no bip layer\")" - callbacks.addscript #filePostOpen BIPhideSet id:#bipHide - - global bips = (crytools.getBips()) - namearr = #() - for i=1 to bips.count do - ( - append namearr bips[i].name - ) - bipSelect.items = namearr - global selectedBip = ("$'" + bips[1].name + "'") - global biped_ctrl = (execute (selectedBip + ".controller")) - ) - - - --get rigging tools location - --get rigging tools location - local tempVar = cryTools.inFromINI "CryTools" "rigging_pos" - if tempVar == "" then tempVar = [1000,0] - else - ( - try - ( - tempVar = execute tempVar - cryriggingtools.pos = tempVar - ) - catch - ( - cryTools.outToINI "CryTools" "rigging_pos" "[1000,0]" - cryriggingtools.pos = [1000,0] - ) - ) - ) - - -- on rigging tools closed - on RiggingTools close do - ( - cryTools.outToINI "CryTools" "rigging_pos" (cryriggingtools.pos as String) - - callbacks.removescripts #filePostOpen id:#figureMode - callbacks.removescripts #filePostOpen id:#bipHide - ) - - -- on clampTimeline pressed - on clampTimeline pressed do - ( - if animationrange.start == slidertime then - ( - messagebox ("Timeline cannot be clamped to a single frame (" + slidertime as string + ")") - return undefined - ) - animationrange = interval animationrange.start slidertime - ) - - -- clampTimelineKey - on clampTimelineKey pressed do - ( - if $ == undefined then - ( - messagebox "Nothing is selected" - return undefined - ) - - try - ( - if $.controller.keys.count == -1 then - ( - positionK = $.position.controller.keys[$.position.controller.keys.count].time - rotationK = $.rotation.controller.keys[$.rotation.controller.keys.count].time - if positionK > rotationK then - ( - if positionK == animationrange.start then (messagebox "Cannot clamp to timeline start"; return undefined) - animationrange = interval animationrange.start positionK - return undefined - ) - else - ( - if positionK == animationrange.start then (messagebox "Cannot clamp to timeline start"; return undefined) - animationrange = interval animationrange.start rotationK - return undefined - ) - ) - - if $ != undefined or $.controller.keys[$.controller.keys.count].time != animationrange.start then - ( - animationrange = interval animationrange.start $.controller.keys[$.controller.keys.count].time - ) - else - ( - messagebox "Object's last keyframe is current key.\nCannot clamp timeline to 1 key" - ) - ) - catch() - ) - - --controller copy/paste - on controllerXferChild pressed do - ( - if toChildren.checked == true then - ( - undo "copy/paste controller" on - ( - for mObj in selection do - ( - if copyPos.checked and copyRot.checked == true then - ( - crytools.copyPasteController mObj "children" "rp" - ) - ) - ) - ) - if toSelection.checked == true then - ( - - ) - ) - - --reduce keys - on reduceKeysBTN pressed do - ( - try - ( - undo "reduceKeys" on - ( - for obj in selection do - ( - if copyPos.checked == true then - ( - reduceKeys obj.position.controller 50 1f - ) - if copyRot.checked == true then - ( - reduceKeys obj.rotation.controller 50 1f - ) - ) - ) - ) - catch() - ) - - -- crytools.matchPivot button - on matchPivotBtn pressed do - ( - if selection.count == undefined or selection.count != 2 then - ( - messageBox "Please select two objects, the second being the object whos pivot you want to change." title: "Error" - return undefined - ) - undo "matchPivot" on - ( - crytools.matchPivot $[1] $[2] - ) - ) - - -- zero out button - on zeroOut pressed do - ( - objs = getCurrentSelection(); - oc = objs.count; - undo "ZEROOut" on - ( - setWaitCursor(); - for i in 1 to oc do - ( - pt = Point pos:[0,0,0] isSelected:on centermarker:on axistripod:off cross:off Box:off constantscreensize:off drawontop:off size:20; - pt.parent = objs[i].parent; - coordsys world - ( - pt.scale = objs[i].scale; - pt.rotation = objs[i].rotation; - pt.position = objs[i].position; - pt.wirecolor = (color 80 10 0); - pt.name = (objs[i].name+"_ZERO"); - ) - objs[i].parent = pt; - ) - select objs; - setArrowCursor(); - ) - ) - - on refreshBipTools pressed do - ( - try - ( - global bips = (crytools.getBips()) - global namearr = #() - for i=1 to bips.count do - ( - append namearr bips[i].name - ) - bipSelect.items = namearr - global selectedBip = ("$'" + bips[1].name + "'") - global biped_ctrl = (execute (selectedBip + ".controller")) - ) - catch(print "no bips selected/found") - ) - - on bipSelect selected s do - ( - print (bipSelect.items[s] + " selected.") - selectedBip = ("$'" + bips[s].name + "'") - global biped_ctrl = (execute (selectedBip + ".controller")) - ) - - -- figure mode button - on figureMode changed state do - ( - try - if (figureMode.checked == true) then - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.figureMode = true - ) - else - ( - biped_ctrl=(execute (selectedBip + ".controller")) - biped_ctrl.figureMode = false - ) - catch - ( - messageBox "Please load a biped." title:"Error" - figuremode.Checked = false - return undefined - ) - ) - -- hide biped button - on hideBiped changed state do - ( - try - ( - if (hideBiped.checked == true) then - ( - bip_layer = LayerManager.getLayerFromName "Bip" - bip_layer.ishidden = true - ) - else - ( - bip_layer = LayerManager.getLayerFromName "Bip" - bip_layer.ishidden = false - ) - ) - catch - ( - messageBox "Cannot find 'Biped' layer." title:"Error" - hideBiped.checked = false - return undefined - ) - ) - - -- bip motion menu button - on bipMotion pressed do - ( - try - ( - selectedbipOrig = selectedbip as string - selectedbip = crytools.cutstring selectedbip "$" - selectedbip = crytools.cutstring selectedbip "'" - selectedbip = crytools.cutstring selectedbip "'" - select (getnodebyname selectedbip) - max motion mode - selectedbip = selectedbipOrig - ) - catch - ( - messageBox "Please load a biped." title:"Error" - return undefined - ) - ) - - -- in place mode button - on inPlace changed state do - ( - try - if (inPlace.checked == true) then - ( - biped_ctrl.inPlaceMode = true - ) - else - ( - biped_ctrl.inPlaceMode = false - ) - catch - ( - messageBox "Please load a biped, or take the biped out of figure mode." title:"Error" - inPlace.checked = false - return undefined - ) - ) - - on convertBip pressed do - ( - --try - --( - undo "bip2bones" on - ( - newbones = #() - - if selection == undefined then - ( - messagebox "nothing is selected" - return undefined - ) - - if selection.count != 1 then - ( - messagebox "please select only one part of the biped to convert" - return undefined - ) - - for obj in crytools.getChildren (cryTools.findRoot $) do - ( - b = snapshot obj name:("bone_" + (obj.name as string)) - b.parent = undefined - b.transform = obj.transform - append newbones b - ) - - for i in newbones do - ( - if (getnodebyname (crytools.cutstring i.name "bone_")).parent != undefined then - ( - i.parent = getnodebyname ("bone_" + ((getnodebyname (crytools.cutstring i.name "bone_")).parent).name) - ) - ) - ) - --) - --catch() - ) - - on selectAllBIP pressed do - ( - selectionN = #() - for obj in $* do - ( - if obj.classid[1] == 37157 then - ( - append SelectionN obj - ) - ) - select SelectionN - ) - - --rotate bind pose - on rootBTN pressed do - ( - if selection.count != 1 then - ( - messagebox "Please select a root skeleton node" - return undefined - ) - else - ( - rootBTN.text = $.name - rotBindLBL.text = "Select character meshe(s)" - rotBindSel.enabled = true - xVal.enabled = true - yVal.enabled = true - zVal.enabled = true - ) - ) - - on rotBindSel pressed do - ( - DialogMonitorOPS.RegisterNotification ANoon_EnvelopeCallbackFunction ID:#ANoon_Envelopes - DialogMonitorOPS.Enabled = true - - if selection.count != 0 then - ( - undo "flipCHR" on - ( - items = selection as array - - if items.count < 2 then - ( - if items[1].name == rootBTN.text then - ( - messagebox ("Please select character meshes to be rotated\n(root currently selected (" + rootBTN.text + ")") - return undefined - ) - crytools.rotBind items[1] (getnodebyname rootBTN.text) 0 0 180 true - ) - else - ( - for i=1 to (items.count-1) do - ( - crytools.rotBind items[i] (getnodebyname rootBTN.text) 0 0 180 false - ) - crytools.rotBind items[items.count] (getnodebyname rootBTN.text) 0 0 180 true - ) - ) - ) - DialogMonitorOPS.Enabled = false - DialogMonitorOPS.UnRegisterNotification ID:#ANoon_Envelopes - ) - - -- bone tools - on boneWidth changed val do - ( - if $ != undefined then - ( - for obj in selection do - ( - if classof obj == BoneGeometry then obj.width = val - ) - ) - ) - - on boneHeight changed val do - ( - if $ != undefined then - ( - for obj in selection do - ( - if classof obj == BoneGeometry then obj.height = val - ) - ) - ) - - on nodes2bones pressed do - ( - undo "nodes2bones" on - ( - if $ == undefined then - ( - messagebox "please select a node" - return undefined - ) - - if fromSelected.checked == false then - ( - crytools.nodes2bones (crytools.findroot $) - ) - else - ( - crytools.nodes2bones $ - ) - ) - ) - - on fromSelected changed state do - ( - if fromselected.checked == true then fromRoot.checked = false - ) - - on fromRoot changed state do - ( - if fromRoot.checked == true then fromSelected.checked = false - ) - - on boneTaper changed val do - ( - if $ != undefined then - ( - for obj in selection do - ( - if classof obj == BoneGeometry then obj.taper = val - ) - ) - ) - - -- vertex tools - on channelInfoBTN pressed do - ( - channelInfo.Dialog () - ) - - on vertColors changed state do - ( - for obj in selection do - ( - if obj.showVertexColors == false then - ( - obj.showVertexColors = true - ) - else - ( - obj.showVertexColors = false - ) - ) - ) - - on addChannel pressed do - ( - numChannels = (meshop.getNumVDataChannels $) - channelinfo.addchannel $ - numChannels += 1 - cryChannel.text = ("cryChannel: channel " + (numchannels as string)) - channelinfo.NameChannel $ 3 numchannels "cry" - channelinfo.update() - --s.vertexColorType = #alpha - ) - - ) -- End RiggingTools - - -------------------------------------------------------------------------------- ---Physics -------------------------------------------------------------------------------- - rollout PhysicsSetup "Physics Setup" - ( - button createPhys "Create Phys Skeleton" - button createParentFrame "Create ParentFrame" - - on createPhys pressed do - ( - if $ != undefined then - ( - local root - undo "createPhys" on - ( - root = crytools.findRoot selection[1] - parts = crytools.getChildren root - parentRef = #(undefined) - partRef = #() - - snapshot root name:((root.name as string) + " phys") - - for i = 1 to parts.count do - ( - append parentRef (parts[i].parent.name + " phys") - new = snapshot parts[i] name:((parts[i].name as string) + " phys") - append partRef new - ) - - for i = 2 to partRef.count do - ( - partRef[i].parent = getnodebyname (parts[i].parent.name + " phys") - ) - ) - select (getnodebyname ((root.name as string) + " phys")) - ) - ) - - on createParentFrame pressed do - ( - if selection != undefined then - ( - undo "createParentFrame" on - ( - for obj in selection do - ( - frame = snapshot obj name:((obj.name as string) + " parentFrame") - frame.parent = obj.parent - obj.parent = frame - --frame.ishidden = true - --frame.isfrozen = true - ) - ) - ) - ) - ) -------------------------------------------------------------------------------- ---DiagnosticTools -------------------------------------------------------------------------------- - rollout Diagnostic "Diagnostic Tools" - ( - - group "General Diagnostics" - ( - button selectRoot "selectRoot" offset:[-45,0] - button selChildren "selectChildren" offset:[35,-26] - button numChildren "numChildren" offset:[-41,0] - label numChildrenLabel "---" offset:[5,-20] - checkbox printChildren "print" offset:[100,-20] - label compareLabel "Compare Two Hierarchies:" - checkbutton compare01 " Heirarchy1 " offset:[-40,0] - button compare02 " Heirarchy2 " offset:[40,-26] - checkbox checkConsistency "check consistency" enabled:false - ) - - on compare01 changed state do - ( - if $ == undefined then - ( - messagebox "Please select a hierarchy member!" - compare01.checked = false - return undefined - ) - - if compare01.checked == true then - ( - comp1root = crytools.findRoot $ - print (comp1root.name + " hierarchy loaded.") - tempArray = crytools.getChildren comp1root - global crytools_compareArray1 = #() - for obj in tempArray do - ( - append crytools_compareArray1 obj.name - ) - ) - ) - on compare02 pressed do - ( - if $ == undefined then - ( - messagebox "Please select a hierarchy member!" - return undefined - ) - comp2root = crytools.findRoot $ - compareArray2 = crytools.getChildren comp2root - print (comp2root.name + " heirarchy loaded.") - isIdentical = "yes" - for obj in compareArray2 do - ( - if (findItem crytools_compareArray1 obj.name) == 0 do - ( - print obj.name - isIdentical = "no" - ) - ) - if isIdentical == "yes" then - ( - print "hierarchy elements are identical" - ) - ) - - -- numChildren - on numChildren pressed do - ( - if $ == undefined or selection.count > 1 do - ( - print "Select 1 node." - numChildrenLabel.text = "--" - return undefined - ) - comp2root = crytools.findRoot $ - childArray = crytools.getChildren comp2root - numChildrenLabel.text = (childArray.count as string) - if printChildren.checked == true then - ( - for obj in childArray do print obj.name - ) - ) - - on selChildren pressed do - ( - selectMe = selection as array - for obj in selection do - ( - join selectMe (crytools.getChildren obj) - ) - select selectMe - ) - - on selectRoot pressed do - ( - if selection.count > 1 then - ( - messagebox "Please select one node of the hierarchy" - return undefined - ) - if $ == undefined or $.parent == undefined then - ( - print "Object has no parent or nothing is selected" - return undefined - ) - root_ = crytools.findRoot $ - select root_ - ) - - /*group "Physique Diagnostics" - ( - label label_bone01 "Select Verts that use X bones" - editText buneNum_text fieldWidth:20 offset:[20,0] - button fetchVertsBtn "Select" offset:[0,-24] - label label_bone02 "Get Physique Bone Count" - button boneCount "GetBoneCount" offset:[10,0] - label bone_txt "0" offset:[-50,-20] - checkbutton initialPose "Go to Initial Pose" - button zeroVerts "Select verts with 0.0 weight" - ) - - group "Animation Diagnostics" - ( - button getWeaponRoot "Get Weapon\Root Info" --pos:[0,0] - label positions "POS: " offset:[-53,0] - editText weapon_txt offset:[30,-20] fieldWidth:45 - editText root_txt offset:[80,-22] fieldWidth:45 - label translations "TRANS: " offset:[-60,0] - editText weapon_trans_txt offset:[30,-20] fieldWidth:45 - editText root_trans_txt offset:[80,-22] fieldWidth:45 - )*/ - - on boneCount pressed do - ( - try (bone_txt.text = ((physiqueOps.getbonecount $) as string)) - catch - ( - messageBox "Please Select a character (mesh) with a Physique modifier." title:"Error" - return undefined - ) - ) - - on fetchVertsBtn pressed do - ( - vertSel = #{} - numberOfBones = buneNum_text.text as float - for i=1 to (polyOp.getNumVerts $) do - ( - if (physiqueops.getvertexbonecount $ i) == numberOfBones then - ( - append vertSel i - ) - $.selectedVerts = vertsel - ) - ) - - on zeroVerts pressed do - ( - if $selection.count > 0 then - ( - vertSel = #{} - for i = 1 to (polyOp.getNumVerts $) do - ( - if (physiqueops.getvertexbonecount $ i) == 1 then - ( - --bonesUsing = physiqueops.getVertexBones $ i - if physiqueops.getVertexWeight $ i 1 == 0.0 then - ( - append vertSel i - ) - ) - $.selectedVerts = vertsel - ) - ) - else - messageBox "Select Node before." title:"Error" - ) - - on getWeaponRoot pressed do - ( - try - ( - weapon_txt.text = ((in coordsys world $weapon_bone.position.z) as string) - alt_weapon_txt = ((in coordsys world $alt_weapon_bone01.position.z) as string) - - bip01txt = ((in coordsys world $Bip01) as string) - bip01txtArray = filterstring bip01txt ",][" - rootZloc = bip01txtArray[4] - root_txt.text = (rootZloc as string) - - print ("Frame: " + (slidertime as string)) - print ("root " + (root_txt.text as string)) - print ("weapon_bone " + (weapon_txt.text as string)) - print ("alt_weapon_bone01 " + (alt_weapon_txt as string)) - - slidertime = animationrange.start - w1trans1 = (in coordsys world $weapon_bone.position.x) - w2trans1 = (in coordsys world $alt_weapon_bone01.position.x) - bip01txt = ((in coordsys world $Bip01) as string) - bip01txtArray = filterstring bip01txt ",][" - rootXloc = bip01txtArray[2] - rtrans1 = rootXloc - - slidertime = animationrange.end - w1trans2 = (in coordsys world $weapon_bone.position.x) - w2trans2 = (in coordsys world $alt_weapon_bone01.position.x) - bip01txt = ((in coordsys world $Bip01) as string) - bip01txtArray = filterstring bip01txt ",][" - rootXloc = bip01txtArray[2] - rtrans2 = rootXloc - - root_trans_txt.text = ((abs ((rtrans1 as float) - (rtrans2 as float))) as string) - weapon_trans_txt.text = ((abs (w1trans1 - w1trans2)) as string) - print ("root translation " + ((rtrans1 as float) - (rtrans2 as float)) as string) - print ("weapon_bone translation " + (w1trans1 - w1trans2) as string) - print ("alt_weapon_bone01 translation " + (w2trans1 - w2trans2) as string) - )catch() - ) - - on initialPose changed state do - ( - try - ( - if (initialPose.checked == true) then - ( - physiqueOps.setInitialPose $ true - ) - else - ( - physiqueOps.setInitialPose $ false - ) - ) - catch - ( - messageBox "Please Select a character (mesh) with a Physique modifier." title:"Error" - return undefined - ) - ) - - group "Attachment\\Game Diagnostics" - ( - label cdf_names "NAME: " offset:[-60,0] - editText cdfName_txt offset:[30,-20] fieldWidth:110 - button cdfData "Generate CDF Attachment Data" - ) - - on Diagnostic open do - ( - cdfName_txt.text = "Name of attachment." - ) - - on cdfData pressed do - ( - if $ == undefined then - ( - messageBox "Please Select an object" title:"Error" - return undefined - ) - global world_locArr = filterstring ((in coordsys world $.position) as string) "[]" - quatRotArray = filterstring ((in coordsys world $.rotation) as string) ",() " - global quatRot = ((quatRotArray[5] as string) + "," + (quatRotArray[2] as string) + "," + (quatRotArray[3] as string) + "," + (quatRotArray[4] as string)) - --print ("") - - rollout assumeHelp "Is this the file path of the CDF you are attaching?" - ( - label assume01 "finding..." align:#center --Assumed from max file directory - button yesCDF "Yes" align:#center offset: [-35,0] - button noCDF "No, let me choose." align:#center offset:[40,-26] - on yesCDF pressed do - ( - global cdf_location = assume01.text - global cdf_location_name = (getFilenameFile cdf_location) - destroyDialog assumeHelp - rollout assumeHelp2 "Is this the bone the CDF is attached to?" - ( - label assume01 "finding..." align:#center --Assumed from max file directory - button yesBONE "Yes" align:#center offset: [-40,0] - pickbutton noBONE "No, Pick Bone" align:#center offset:[30,-26] - on yesBONE pressed do - ( - global parent_bone = assume01.text - destroyDialog assumeHelp2 - rollout CDF_info_win "Generated CDF Bone Attachment info:" - ( - edittext cdfInfoWin_txt text:"generating..." fieldWidth:390 height:260 pos:[1,3] - - on CDF_info_win open do - ( - cdfInfoWin_txt.text = print ("") - ) - - on CDF_info_win resized size do - ( - size1 = size as string - size2 = filterstring size1 "[]," - cdfInfoWin_txt.width = ((size2[1] as float) - 10) - cdfInfoWin_txtheight = ((size2[2] as float) - 35) - ) - ) - createDialog CDF_info_win 400 295 bgcolor:black fgcolor:white style:#(#style_resizing, #style_titlebar, #style_border, #style_sysmenu) - ) - on noBONE picked obj do - ( - try - ( - global parent_bone = obj.name - destroyDialog assumeHelp2 - rollout CDF_info_win "Generated CDF Bone Attachment info:" - ( - edittext cdfInfoWin_txt text:"generating..." fieldWidth:390 height:260 pos:[1,3] - - on CDF_info_win open do - ( - cdfInfoWin_txt.text = print ("") - ) - - on CDF_info_win resized size do - ( - size1 = size as string - size2 = filterstring size1 "[]," - cdfInfoWin_txt.width = ((size2[1] as float) - 10) - cdfInfoWin_txtheight = ((size2[2] as float) - 35) - ) - ) - ) - catch - ( - print "Nothing selected." - return undefined - ) - createDialog CDF_info_win 400 295 bgcolor:black fgcolor:white style:#(#style_resizing, #style_titlebar, #style_border, #style_sysmenu) - ) - on assumeHelp2 open do - ( - assume01.text = $.parent.name - ) - ) - createDialog assumeHelp2 300 50 bgcolor:black fgcolor:white - ) - - on noCDF pressed do - ( - global cdf_location = getMAXSaveFileName caption:"C:" - if cdf_location == undefined then - ( - messageBox "You didn't select a file.." title:"Bad Monkey.." - return undefined - ) - global cdf_location_name = (getFilenameFile cdf_location) - destroyDialog assumeHelp - rollout assumeHelp2 "Is this the bone the CDF is attached to?" - ( - label assume01 "finding..." align:#center --Assumed from max file directory - button yesBONE "Yes" align:#center offset: [-40,0] - pickbutton noBONE "No, Pick Bone" align:#center offset:[30,-26] - on yesBONE pressed do - ( - global parent_bone = assume01.text - destroyDialog assumeHelp2 - ) - on noBONE picked obj do - ( - global parent_bone = obj.name - destroyDialog assumeHelp2 - ) - on assumeHelp2 open do - ( - assume01.text = $.parent.name - ) - ) - createDialog assumeHelp2 300 50 bgcolor:black fgcolor:white - ) - - on assumeHelp open do - ( - assume01.text = (maxFilePath + $.name + ".cdf") - ) - ) - createDialog assumeHelp 600 65 bgcolor:black fgcolor:white - ) - ) --end DiagnosticTools - -------------------------------------------------------------------------------- --- Reactor Tools -------------------------------------------------------------------------------- - rollout reactorTools "Reactor Tools" - ( - pickbutton addRigid "Add Objs to Rigid Body" - pickbutton addFracture "Add Objs to Fracture" - - on addFracture picked obj do - ( - try - ( - undo "addFracture" on - ( - for i=1 to selection.count do - ( - obj.addpiece selection[i] - ) - ) - ) - catch() - ) - on addRigid picked obj do - ( - try - ( - undo "addRigid" on - ( - for i=1 to selection.count do - ( - obj.addRigidBody selection[i] - ) - ) - ) - catch() - ) - ) - -------------------------------------------------------------------------------- --- Smart Object Template Generator -------------------------------------------------------------------------------- - rollout SmartObjects "Smart Object Tools" - ( - group "Template Generator/Exporter" - ( - button smartObjectManager "Smart Object Manager" - button selectSmartObj "Get Smart Obj Geometry" - button addStartStop "Add Start/Stop Locations" enabled:false - --TEMPORARY DEACTIVATED button addEdge "Add Edge" offset:[-36,0] enabled:false - --TEMPORARY DEACTIVATED button addEdgePoint "Add Point" offset:[36,-26] enabled:false - checkbox projectOnGround "Project on Ground" enabled:false - checkbox rotate180z "Flip Around Z Axis" enabled:false - button exportSOdata "Export Smart Object Data" enabled:false - ) - - - on smartObjectManager pressed do - ( - try destroyDialog SOManagerRO catch() - - - rollout SOManagerRO "Smart Object Manager" - ( - local mergedSO = "" - local rootSO = "" - - label labPath "Folder: " pos:[8,10] - edittext edPath "" pos:[40,8] fieldWidth:330 - --label edPath "" pos:[55,10] width:330 - button btnBrowsePath "Browse" pos:[382,6] width:50 height:20 - - groupbox gbList " Smart Object List " pos:[8,35] height:195 width:140 - listbox lbList "" pos:[12,50] height:13 width:132 - - groupbox gbPreview " Preview " pos:[158,35] height:285 width:274 - bitmap bmpPreview "" pos:[162,50] height:266 width:266 - - button btnRoot "Root" pos:[12,240] width:132 height:20 enabled:false - button btnEdit "Edit" pos:[12,260] width:66 height:20 enabled:false - button btnEditXML "XML" pos:[78,260] width:66 height:20 enabled:false - button btnMerge "Merge" pos:[12,280] width:132 height:20 enabled:false - button btnExport "Export to FBX" pos:[12,300] width:132 height:20 enabled:false - - - function updateDialog = - ( - try - ( - if lbList.selection > 0 then - ( - btnEditXML.enabled = true - - local tempFilename = (filterString lbList.items[lbList.selection] ".")[1] - - if (getFiles (edPath.text + "\\" + tempFilename + ".max")).count > 0 then - ( - btnEdit.enabled = true - btnMerge.enabled = true - btnExport.enabled = true - btnRoot.enabled = true - - if mergedSO == lbList.items[lbList.selection] then - ( - if rootSO != "" then - btnRoot.text = rootSO.name - else - btnRoot.text = "Root" - ) - else - btnRoot.text = "Root" - ) - else - ( - btnEdit.enabled = false - btnMerge.enabled = false - btnExport.enabled = false - btnRoot.enabled = false - ) - - - local SOPicture = (getFiles (edPath.text + "\\" + tempFilename + ".jpg"))[1] - if SOPicture != undefined then - try ( local tempBitmap = openBitMap (edPath.text + "\\" + tempFilename + ".jpg") )catch() - else - tempBitmap = bitmap 266 266 color:(color 190 190 190) - - bmpPreview.bitmap = tempBitmap - - ) - else - ( - btnEdit.enabled = false - btnEditXML.enabled = false - btnMerge.enabled = false - btnExport.enabled = false - ) - ) - catch() - ) - - - function updatePath initial:undefined = - ( - try - ( - local tempPath = cryTools.buildPathFull + "Game\\Libs\\SmartObjects\\ClassTemplates" - if edPath.text != "" then - tempPath = edPath.text - - if initial == undefined then - local openPath = getSavePath caption:"Open .xml directory of smart objects" initialDir:tempPath - else - local openPath = tempPath - - if openPath != undefined then - ( - local xmlList = getFiles (openPath + "\\*.xml") - if xmlList.count == 0 then - messageBox "No .xml files in the directory.\n\nPlease select a different folder" title:"Error in Smart Object Manager" - else - ( - edPath.text = openPath - - for i = 1 to xmlList.count do - ( - local filterFilename = filterString xmlList[i] "\\" - xmlList[i] = filterFilename[filterFilename.count] - ) - - lbList.items = xmlList - if lbList.items.count > 0 then - ( - lbList.selection = 1 - updateDialog() - ) - ) - ) - ) - catch (messageBox "Error in updatePath function") - ) - - - - on SOManagerRO open do - ( - updatePath initial:true - ) - - - on btnBrowsePath pressed do - ( - updatePath() - ) - - on lbList selected value do - ( - updateDialog() - ) - - on btnRoot pressed do - ( - local tempNode = selectByName title:"Select the Root Node of the Smart Object" showHidden:true single:true - if tempNode != undefined then - ( - btnRoot.text = tempNode.name - rootSO = tempNode - ) - - ) - - - on btnEdit pressed do - ( - try - ( - local tempFilename = (filterString lbList.selected ".")[1] - loadMaxFile (edPath.text + "\\" + tempFilename + ".max") - mergedSO = lbList.selected - rootSO = getNodeByName ((cryTools.sortRootChildren (Objects as Array))[1]) - - updateDialog() - )catch() - ) - - - on btnEditXML pressed do - ( - cryTools.scmd ("notepad \"" + edPath.text + "\\" + lbList.selected + "\"") false - ) - - - - on btnMerge pressed do - ( - try - ( - local tempFilename = (filterString lbList.selected ".")[1] - mergeMaxFile (edPath.text + "\\" + tempFilename + ".max") #select - mergedSO = lbList.selected - rootSO = getNodeByName ((cryTools.sortRootChildren (selection as Array))[1]) - - clearSelection() - updateDialog() - )catch() - ) - - - on btnExport pressed do - ( - local tempFilename = (filterString lbList.selected ".")[1] - - if rootSO == "" then - ( - if (queryBox "When continuing, the export will load the SO and overwrites the current scene.\n\nDo you want to continue?" title:"SO Manager") == true then - btnEdit.pressed() - else - return false - ) - - local exportPath = getSaveFileName filename:(edPath.text + "\\" + tempFilename + ".fbx") caption:"Export Smart Object to FBX" types:"Autodesk (*.FBX)|*.fbx" - - if exportPath != undefined then - ( - with redraw off - ( - clearSelection() - - local SOArray = #(rootSO) - join SOArray (cryTools.getChildren rootSO) - selectMore SOArray - - exportFile exportPath #noPrompt selectedOnly:true using:FBXEXP - - clearSelection() - ) - ) - ) - ) - - createDialog SOManagerRO height:330 width:440 - ) - - - on selectSmartObj pressed do - ( - if $ == undefined then - ( - messagebox "Please select an object to be defined as the Smart Object mesh/CGF." - return undefined - ) - - t = $.pos - if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then - ( - messagebox "ERROR: Object's pivot is not at origin (0,0,0)" - return undefined - ) - - if selection.count != 1 then - ( - messagebox "You can only export one mesh as a Smart Object CGF" - return undefined - ) - global smartObj_cryGlobal = $ - selectSmartObj.text = ($.name) - addStartStop.enabled = true - addEdge.enabled = true - exportSOdata.enabled = true - projectOnGround.enabled = true - rotate180z.enabled = true - ) - - on SmartObjects open do - ( - global numSO_cryGlobal = 0 - global startEndSO_cryGlobal = #() - if initialDirSO_cryGlobal == undefined then - ( - global initialDirSO_cryGlobal = crytools.BuildPathFull - ) - projectOnGround.checked = true - rotate180z.checked = true - ) - - on addStartStop pressed do - ( - undo "add start/stop SO objects" on - ( - numSO_cryGlobal += 1 - Circle radius:20 pos:[100,0,0] wirecolor:[0,255,0] name:("so_start_" + (numSO_cryGlobal as string)) isselected:true - setTransformLockFlags (getnodebyname ("so_start_" + (numSO_cryGlobal as string))) #{3} - $.parent = smartObj_cryGlobal - if projectOnGround.checked == true then - ( - setUserPropBuffer $ "1" - ) - else - ( - setUserPropBuffer $ "0" - ) - - Circle radius:20 pos:[-100,0,0] wirecolor:[255,0,0] name:("so_end_" + (numSO_cryGlobal as string)) isselected:true - setTransformLockFlags (getnodebyname ("so_end_" + (numSO_cryGlobal as string))) #{3} - $.parent = smartObj_cryGlobal - if projectOnGround.checked == true then - ( - setUserPropBuffer $ "1" - ) - else - ( - setUserPropBuffer $ "0" - ) - - deselect $ - ) - ) - - /*TEMPORARY DEACTIVATED - on addEdge pressed do - ( - local numberEdges = 0 - for obj in Objects do - if (findString obj.name "so_startEdge") != 0 then - try - ( - if ((local extractNumber = (subString obj.name 13 2) as Integer)) > numberEdges then - numberEdges = extractNumber - ) - catch() - - - - numberEdges += 1 - - print numberEdges - - - undo "add edge SO object" on - ( - local numberEdgesString = (if numberEdges < 10 then "0" else "") + numberEdges as String - in coordsys world - ( - local startEdge = dummy pos:[50,30,0] name:("so_startEdge"+ numberEdgesString) isselected:false - local endEdge = dummy pos:[50,-30,0] name:("so_endEdge" + numberEdgesString) isselected:false - - --local edgeLine = line pos:[50,30,0] name:("so_lineEdge" + numberEdgesString) isselected:false - - - local edgeSpline = splineShape pos:[0,50,0] wirecolor:[0,150,0] isselected:true rotation:(quat 0 0 0.707107 0.707107) - --edgeSpline.rotation = - addnewSpline edgeSpline - addKnot edgeSpline 1 #corner #line [50,30,0] - addKnot edgeSpline 1 #corner #line [50,-30,0] - ) - ) - - - ) - */ - - - - on exportSOdata pressed do - ( - try - ( - t = $.pos - if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then - ( - messagebox "ERROR: Object's pivot is not at origin" - return undefined - ) - - soSavePath = getSavePath caption:("Save " + (smartObj_cryGlobal.name + ".xml") + " to:") initialDir:initialDirSO_cryGlobal - if soSavePath == undefined then - ( - return undefined - ) - if rotate180z.checked == true then - ( - smartObj_cryGlobal.rotation = quat 0 0 1 0 - ) - initialDirSO_cryGlobal = soSavePath - - soData = #("",("\t")) - startEndSO_cryGlobal = ($so_* as array) - for obj in startEndSO_cryGlobal do - ( - append soData ("\t") - ) - append soData "" - print (soSavePath + "\\" + (smartObj_cryGlobal.name + ".xml")) - cryTools.writeOUT soData (soSavePath + "\\" + (smartObj_cryGlobal.name + ".xml")) echo:false - if rotate180z.checked == true then - ( - smartObj_cryGlobal.rotation = quat 0 0 1.50996e-007 1 - ) - ) - catch() - ) - ) - - -------------------------------------------------------------------------------- ---CGF Metadata Manager -------------------------------------------------------------------------------- - - rollout metadataManager "CGF Metadata Manager" - ( - label updateLBL "Info will be updated here" - button udpSetToSel " Apply Settings to Selected " height:25 - checkbox useMass "Mass:" offset:[-10,0] - spinner objMass "" type:#float range:[0,99999,0] fieldWidth:50 offset:[-40,-20] - checkbox useDensity "Density:" offset:[-10,0] - spinner objDensity "" type:#float range:[0,99999,0] fieldWidth:50 offset:[-40,-20] - --button udpGetFromSelBTN "GET" offset:[67,-26] - group "Force Primitives" - ( - checkbox box1 "box" - checkbox cylinder1 "cylinder" offset:[40,-20] - checkbox sphere1 "sphere" offset:[100,-20] - checkbox capsule1 "capsule" - ) - - group "Joints" - ( - checkbox useJoint "Enable joint properties" - spinner jointLimit "Limit:" type:#float fieldWidth:35 offset:[-84,0] - spinner jointTwist "Twist:" type:#float fieldWidth:35 offset:[0,-21] - spinner jointBend "Bend:" type:#float fieldWidth:35 offset:[-84,0] - spinner jointPull "Pull:" type:#float fieldWidth:35 offset:[0,-21] - spinner jointPush "Push:" type:#float fieldWidth:35 offset:[-84,0] - spinner jointShift "Shift:" type:#float fieldWidth:35 offset:[0,-21] - ) - group "General" - ( - checkbox isPickable "pickable" - ) - group "destroyableObjects" - ( - checkbox isMain "main" - checkbox isRemain "remain" offset:[47,-20] - spinner destroyCount "Count:" type:#float fieldWidth:35 offset:[-75,0] - label spawnLocTXT "__Spawn Location_____________" - checkbox isEntity "entity" - checkbox isBone "bone" - edittext isBoneTXT "" offset:[45,-21] fieldWidth:60 - pickbutton pickBone "pick" offset:[62,-24] - label rotAxesTXT "rot axes" offset:[-60,0] - checkbutton xrot "x" offset:[-25,-21] - checkbutton yrot "y" offset:[0,-26] - checkbutton zrot "z" offset:[25,-26] - spinner sizeVar "size var:" type:#float fieldWidth:35 offset:[-70,0] - ) - button selectAllMatching "Select Objects Matching Details" - button openMetaDataLister "Open CGF Metadata Lister" - - on metadataManager open do - ( - isBoneTXT.enabled = false - isBoneTXT.text = "bone name" - objDensity.value = 1000 - objMass.value = 1 - objDensity.enabled = false - objMass.enabled = false - udpGetFromSel() - - --set callback for dynamic change based on selection - callbacks.removeScripts id:#updateUDP - callbacks.addScript #selectionSetChanged "udpGetFromSel()" id:#updateUDP - ) - - on useMass changed state do - ( - if useMass.checked == true then - ( - if useJoint.checked == true then - ( - messagebox "Joints cannot have a mass or density!" - useMass.checked = false - return undefined - ) - objMass.enabled = true - objDensity.enabled = false - useDensity.checked = false - ) - else - ( - objMass.enabled = false - ) - ) - - on useDensity changed state do - ( - if useDensity.checked == true then - ( - if useJoint.checked == true then - ( - messagebox "Joints cannot have a mass or density!" - useDensity.checked = false - return undefined - ) - objDensity.enabled = true - objMass.enabled = false - useMass.checked = false - ) - else - ( - objDensity.enabled = false - ) - ) - - on udpSetToSel pressed do - ( - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - - -- MASS OUTPUT ---------------------------------------- - if useMass.checked == true then - ( - massVal = ("mass = " + objMass.value as string) - foundMass = 1 - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = filterstring udpInARR[i] " =" - if testFor[1] == "mass" then - ( - foundMass = i - ) - else - ( - foundMass = (udpInARR.count + 1) - ) - - if testFor[1] == "density" then - ( - deleteItem udpInARR i - ) - ) - - udpInARR[foundMass] = massVal - crytools.outToUDP udpInARR obj false - print massVal - ) - ) - else - ( - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - case wordFilter of - ( - "mass": - ( - deleteItem udpInARR i - crytools.outToUDP udpInARR obj false - ) - ) - ) - ) - - -- DENSITY OUTPUT ---------------------------------------- - if useDensity.checked == true then - ( - densityVal = ("density = " + objDensity.value as string) - foundDensity = 1 - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = filterstring udpInARR[i] " =" - if testFor[1] == "density" then - ( - foundDensity = i - ) - else - ( - foundDensity = (udpInARR.count + 1) - ) - - if testFor[1] == "mass" then - ( - deleteItem udpInARR i - ) - ) - - udpInARR[foundDensity] = densityVal - crytools.outToUDP udpInARR obj false - print densityVal - ) - ) - else - ( - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - case wordFilter of - ( - "density": - ( - deleteItem udpInARR i - crytools.outToUDP udpInARR obj false - ) - ) - ) - ) - - -- FORCE PRIMITIVES OUTPUT ---------------------------------------- - if box1.checked == true then - ( - for obj in selection do - ( - addBox = 1 - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "box" then - ( - addBox = i - ) - else - ( - addBox = (udpInARR.count + 1) - ) - ) - udpInARR[addBox] = "box" - crytools.outToUDP udpInARR obj false - ) - ) - else - ( - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "box" then - ( - deleteItem udpInARR i - crytools.outToUDP udpInARR obj false - ) - ) - ) - ) - if sphere1.checked == true then - ( - for obj in selection do - ( - addsphere = 1 - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "sphere" then - ( - addsphere = i - ) - else - ( - addsphere = (udpInARR.count + 1) - ) - ) - udpInARR[addsphere] = "sphere" - crytools.outToUDP udpInARR obj false - ) - ) - else - ( - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "sphere" then - ( - deleteItem udpInARR i - crytools.outToUDP udpInARR obj false - ) - ) - ) - ) - if cylinder1.checked == true then - ( - for obj in selection do - ( - addcylinder = 1 - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "cylinder" then - ( - addcylinder = i - ) - else - ( - addcylinder = (udpInARR.count + 1) - ) - ) - udpInARR[addcylinder] = "cylinder" - crytools.outToUDP udpInARR obj false - ) - ) - else - ( - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "cylinder" then - ( - deleteItem udpInARR i - crytools.outToUDP udpInARR obj false - ) - ) - ) - ) - if capsule1.checked == true then - ( - for obj in selection do - ( - addcapsule = 1 - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "capsule" then - ( - addcapsule = i - ) - else - ( - addcapsule = (udpInARR.count + 1) - ) - ) - udpInARR[addcapsule] = "capsule" - crytools.outToUDP udpInARR obj false - ) - ) - else - ( - for obj in selection do - ( - udpInARR = crytools.inFromUDP obj - for i = 1 to udpInARR.count do - ( - testFor = (filterstring udpInARR[i] " =") - wordFilter = (crytools.forceLowerCase testFor[1]) - if wordFilter == "capsule" then - ( - deleteItem udpInARR i - crytools.outToUDP udpInARR obj false - ) - ) - ) - ) - ) - ) - - on useJoint changed state do - ( - if (classof $) != Dummy then - ( - if (classof $) != Point then - ( - messagebox "Only Helper objects can be joints\nThe selected objects are not all Dummy or Point helpers" - useJoint.checked = false - return undefined - ) - ) - if useJoint.checked == true then - ( - cryRiggingtools.rollouts[5].jointLimit.enabled = true - cryRiggingtools.rollouts[5].jointTwist.enabled = true - cryRiggingtools.rollouts[5].jointBend.enabled = true - cryRiggingtools.rollouts[5].jointPull.enabled = true - cryRiggingtools.rollouts[5].jointPush.enabled = true - cryRiggingtools.rollouts[5].jointShift.enabled = true - ) - else - ( - cryRiggingtools.rollouts[5].jointLimit.enabled = false - cryRiggingtools.rollouts[5].jointTwist.enabled = false - cryRiggingtools.rollouts[5].jointBend.enabled = false - cryRiggingtools.rollouts[5].jointPull.enabled = false - cryRiggingtools.rollouts[5].jointPush.enabled = false - cryRiggingtools.rollouts[5].jointShift.enabled = false - ) - ) - - on isPickable changed state do - ( - if ispickable.checked == true then - ( - for obj in selection do - ( - - ) - ) - ) - - --on udpGetFromSelBTN pressed do - --( - -- udpGetFromSel() - --) - - on isBone changed state do - ( - if isBone.checked == true then - ( - isBoneTXT.enabled = true - ) - else - ( - isBoneTXT.enabled = false - ) - ) - - --CGF Meta Data Lister - on openMetaDataLister pressed do - ( - rollout listview_rollout "CGF MetaData Lister" - ( - fn initListView lv = - ( - lv.gridLines = true - lv.View = #lvwReport - lv.fullRowSelect = true - - layout_def = #("Node","Mass","Density","Primitive","Joint","Limit,Twist,Bend,Pull,Push,Shift") - - for i in layout_def do - ( - column = lv.ColumnHeaders.add() - column.text = I - column.width = 1500 - if (column.text = I) == "Limit,Twist,Bend,Pull,Push,Shift" then - ( - column.width = 4300 - ) - ) - ) - - fn fillInSpreadSheet lv = - ( - for o in selection do - ( - li = lv.ListItems.add() - li.text = o.name - sub_li = li.ListSubItems.add() - sub_li.text = (crytools.getUDP o "mass") as string - sub_li = li.ListSubItems.add() - sub_li.text = (crytools.getUDP o "density") as string - sub_li = li.ListSubItems.add() - sub_li.text = try((o.mesh.numfaces) as string)catch("--") - sub_li = li.ListSubItems.add() - sub_li.text = (o.material) as string - ) - ) - - activeXControl lv_objects "MSComctlLib.ListViewCtrl" width:790 height:190 align:#center - on listview_rollout open do - ( - initListView lv_objects - fillInSpreadSheet lv_objects - ) - ) - - try(destroyDialog listview_rollout)catch() - createDialog listview_rollout 800 200 - ) - ) - - - rollout bakeBones "Bake to Bones" - ( - label instruct "Select verts in the deforming mesh" - label instruct2 "these will generate bones" - button bake2bones "Bake Deformation to Bones" - button blendAllBones "Blend All Bones" - - on bake2bones pressed do - ( - if $selection.count > 0 then - ( - if selectedVerts == undefined or selectedVerts.count < 1 then - ( - messagebox "No vertices selected" - return undefined - ) - - for i = 1 to selectedVerts.count do - ( - box name:("bakeBone_" + (selectedVerts[i] as string)) position:((obj1.modifiers[1].getVertex selectedVerts[i]) + [0,0,-.05]) length:1 width:1 height:1 - ) - - for i = (animationrange.start as integer) to (animationrange.end as integer) do - ( - with animate on - ( - slidertime = i - for m=1 to selectedVerts.count do - ( - (execute ("$bakeBone_" + selectedVerts[m] as string)).position = ((obj1.modifiers[1].getVertex selectedVerts[m]) + [0,0,-.05]) - ) - ) - ) - ) - else - messageBox "Select Node before." title:"Error" - ) - - on blendAllBones pressed do - ( - try - ( - for obj in selection do - ( - undo "Blend Weights" on - ( - modPanel.setCurrentObject obj.modifiers[#Skin] - for i=1 to (skinOps.getNumberBones obj.skin) do - ( - skinOps.SelectBone obj.modifiers[#Skin] i - skinOps.blendSelected obj.modifiers[#Skin] - print i - ) - ) - ) - ) - catch() - ) - ) - - rollout rltSkinTools "Skinning Tools"( - group "Average Weights"( - button btnAverageWeightsExecute "Average Weights" width:110 height:16 align:#left offset:[0,-2] across:2 - button btnAverageWeightsRestore "Undo" enabled:false width:40 height:16 align:#right offset:[0,-2] - ) - group "Blur Weights"( - spinner spnBlurWeightsRadius "Radius" width:80 height:16 range:[0,1000,10] type:#float align:#right - checkbutton ckbtnBlurWeightsOptimize "Optimize" width:100 height:16 align:#left offset:[0,-5] across:2 tooltip:"Click to refresh optimization data" - checkBox chkBlurWeightsAutoOptimize "Auto" align:#right offset:[0,-5] checked:false tooltip:"Automatically refreshes on object change" - button btnBlurWeightsExecute "Blur Weights" width:110 height:16 align:#left offset:[0,-5] across:2 - button btnBlurWeightsRestore "Undo" enabled:false width:40 height:16 align:#right offset:[0,-5] tooltip:"Undo last blur" - ) - group "Grab Weights from Backside"( - radioButtons rdoGrabWeightsDirection width:100 height:16 labels:#("X", "Y", "Z", "N") columns:4 default:4 offset:[-8,-2] - button btnGrabWeightsExecute "Grab from Backside" width:110 height:16 align:#left offset:[0,-5] across:2 - button btnGrabWeightsRestore "Undo" enabled:false width:40 height:16 align:#right offset:[0,-5] - ) - group "Replace Bone"( - button btnReplaceBoneExecute "Replace Bone" width:110 height:16 align:#left offset:[0,-2] across:2 - button btnReplaceBoneRestore "Undo" enabled:false width:40 height:16 align:#right offset:[0,-2] - ) - - --globals for blur skin weights - local sMySkin = undefined --skin modifier of currently selected object - local aSelectedVerts = #() --list of selected vertices - local aOldVertWeights = #() --2D array storing old weights for all target verts - local aOldVertBones = #() --2D array storing old bones for all target verts - local oMyVertsOctreeRoot = undefined --octree root node - local sMyObject = undefined - local bBlurOptimize = false --true if optimization is active - - fn fnGetSelectedVerts sTempSkin = - ( --returns a list with the selected vertices - local iVertCount = skinOps.GetNumberVertices sTempSkin - local aTempArray = #() - for i = 1 to iVertCount do( - if skinOps.IsVertexSelected sTempSkin i == 1 do( - append aTempArray i - ) - ) - return aTempArray - ) - - fn fnFindBoneIDInWeightList sTempSkin iTempID iTempVert = - ( --returns the index of a certain bone in the weightlist of a certain vertex or 0 if it cant be found - local iWeightCount = skinOps.GetVertexWeightCount sTempSkin iTempVert - local iResult = 0 - for i = 1 to iWeightCount do( - iBoneID = skinOps.GetVertexWeightBoneID sTempSkin iTempVert i - if iBoneID == iTempID do(iResult = i) - ) - return iResult - ) - - --defined octree node struct and its functions - struct nVertsOctreeNode - ( - sParent, --parent node of vertices - p3Min, --bounding box minimum point - p3Max, --bounding box maximum point - aChildNodes = #(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined), --children unless node is a leaf - aNodeVerts = undefined, --vertices if node is a leaf - iMaxVertsPerLeaf = 20, --maximum amount of vertices before subdivision - - fn fnIsVertInBoundingBox p3Min p3Max iVert = - ( --returns true if vertex is within the specified bounding box - local p3VertexPosition = sParent.verts[iVert].pos - if p3VertexPosition.x >= p3Min.x and p3VertexPosition.y >= p3Min.y and p3VertexPosition.z >= p3Min.z then - ( - if p3VertexPosition.x <= p3Max.x and p3VertexPosition.y <= p3Max.y and p3VertexPosition.z <= p3Max.z then - ( - true - ) - else(false) - ) - else(false) - ), - - fn fnPopulate = - ( --populates the octree with vertices - if aNodeVerts.count > iMaxVertsPerLeaf then - ( - local p3ParentSize = (p3Max - p3Min)*.5 - local p3CurMin - local p3CurMax - local aNewNodeVerts = #() - - for i = 0 to 1 do - ( - for j = 0 to 1 do - ( - for k = 0 to 1 do - ( - p3CurMin = p3Min + [p3ParentSize.x*i, p3ParentSize.y*j, p3ParentSize.z*k] - p3CurMax = p3Min + p3ParentSize + [p3ParentSize.x*i, p3ParentSize.y*j, p3ParentSize.z*k] - local l = 1 - local end = aNodeVerts.count - aNewNodeVerts = #() - while l <= end do - ( --go through parent node verts and move them to child if inside current boundingbox - if (fnIsVertInBoundingBox p3CurMin p3CurMax aNodeVerts[l]) then - ( --if current vertex is in current boundingbox then move it to new child node and remove from parent node - append aNewNodeVerts aNodeVerts[l] - deleteItem aNodeVerts l - end -= 1 - ) - else - ( --else go to next vertex in parent node - l += 1 - ) - ) - if aNewNodeVerts.count != 0 then - ( - aChildNodes[i*4 + j*2 + k + 1] = nVertsOctreeNode sParent:sParent p3Min:p3CurMin p3Max:p3CurMax aNodeVerts:aNewNodeVerts iMaxVertsPerLeaf:iMaxVertsPerLeaf - - aChildNodes[i*4 + j*2 + k + 1].fnPopulate() - ) - ) - ) - ) - aNodeVerts = undefined - ) - ), - - fn fnPrintStatistics iLevel iNodeNumber= - ( --print vertex count per node - if iLevel == 0 then - ( - print "### Vertex Octree Statistics ###" - ) - sIndentation = "" - for i = 0 to iLevel-1 do - ( - sIndentation += " " - ) - if aNodeVerts == undefined then - ( - print (sIndentation + "Level " + iLevel as string + "." + iNodeNumber as string + " has children:") - for i = 1 to aChildNodes.count do - ( - if aChildNodes[i] != undefined then - ( - aChildNodes[i].fnPrintStatistics (iLevel+1) i - ) - ) - ) - else - ( - print (sIndentation + "Level " + iLevel as string + "." + iNodeNumber as string + " has " + aNodeVerts.count as string + " vertices.") - ) - ), - - fn fnGetAllVerts aArray = - ( --returns all vertices of octree - if aNodeVerts == undefined then - ( - for i = 1 to aChildNodes.count do - ( - aChildNodes[i].fnGetAllVerts aArray - ) - ) - else - ( - for iVert in aNodeVerts do - ( - append aArray iVert - ) - ) - ), - - fn fnSphereIntersectBox p3Min p3Max p3Center fRadius = - ( --returns true if the box and sphere intersect - local fDistanceOnAxis = 0 - local fDistanceSquared = 0 - for i = 1 to 3 do - ( - local fVal = p3Center[i] - if fVal < p3Min[i] then - ( - fDistanceOnAxis = fVal - p3Min[i] - fDistanceSquared += fDistanceOnAxis*fDistanceOnAxis - ) - else if fVal > p3Max[i] then - ( - fDistanceOnAxis = fVal - p3Max[i] - fDistanceSquared += fDistanceOnAxis*fDistanceOnAxis - ) - ) - fDistanceSquared <= fRadius*fRadius - ), - - fn fnFindVertsInSphere p3Center fRadius aVertArray aMultiplierArray = - ( --returns all vertices in the sphere and their weights according to the distance to the center - if aNodeVerts == undefined then - ( - for i = 1 to aChildNodes.count do - ( - if aChildNodes[i] != undefined then - ( - if (fnSphereIntersectBox aChildNodes[i].p3Min aChildNodes[i].p3Max p3Center fRadius) then - ( - aChildNodes[i].fnFindVertsInSphere p3Center fRadius aVertArray aMultiplierArray - ) - ) - ) - ) - else - ( - for iVert in aNodeVerts do - ( - fDist = distance sParent.verts[iVert].pos p3Center - if fDist < fRadius then - ( - append aVertArray iVert - append aMultiplierArray (fRadius - fDist) - ) - ) - ) - ) - ) - - fn fnBlurOptimize iMaxNodesPerLeaf = - (--generates octree and sets optimize flag - try - ( - sMyskin = modPanel.getCurrentObject() - if sMySkin.name != "CrySkin" then - ( - sMySkin = undefined - ) - ) - catch - ( - sMySkin = undefined - ) - if sMySkin != undefined then - ( - iOctreeTime = timeStamp() - local iCurrentFrame = sliderTime - local iMyRefFrame = sMySkin.ref_frame - if iMyRefFrame < animationRange.start then - ( - animationRange = interval iMyRefFrame animationRange.end - ) - if iMyRefFrame > animationRange.end then - ( - animationRange = interval animationRange.start iMyRefFrame - ) - sliderTime = iMyRefFrame - oMyVertsOctreeRoot = undefined - local aAllVerts = #() - for i = 1 to getNUmVerts sMyObject do( - append aAllVerts i - ) - aBoundingBox = in coordsys world nodeLocalBoundingBox sMyObject - oMyVertsOctreeRoot = nVertsOctreeNode sParent:sMyObject p3Min:(aBoundingBox[1]*1.01) p3Max:(aBoundingBox[2]*1.01) aNodeVerts:aAllVerts iMaxVertsPerLeaf:iMaxNodesPerLeaf - oMyVertsOctreeRoot.fnPopulate() - bBlurOptimize = true - ckbtnBlurWeightsOptimize.caption = "Optimization Active" - ckbtnBlurWeightsOptimize.state = true - sliderTime = iCurrentFrame - print ("### Octree Generation took: " + formattedprint ((timeStamp() - iOctreeTime)/1000.0) format:".3f" + " seconds ###") - ) - ) - - fn fnBlurUnOptimize = - ( - oMyVertsOctreeRoot = undefined - bBlurOptimize = false - ckbtnBlurWeightsOptimize.caption = "Optimize" - ckbtnBlurWeightsOptimize.state = false - ) - - fn fnUpdateSelection = - ( - sMyObject = $ - try - ( - sMyskin = modPanel.getCurrentObject() - if sMySkin.name != "CrySkin" then - ( - sMySkin = undefined - ) - ) - catch - ( - sMySkin = undefined - ) - if chkBlurWeightsAutoOptimize.state == true and sMyObject != undefined and sMyskin != undefined then - ( - fnBlurOptimize 64 - ) - else - ( - fnBlurUnOptimize() - ) - ) - - on rltSkinTools open do - ( - if rltSkinTools.open then - ( - fnUpdateSelection() - callbacks.addScript #selectionSetChanged "CryRiggingTools.rollouts[8].fnUpdateSelection()" id:#updateSelection - callbacks.addScript #modPanelObjPostChange "CryRiggingTools.rollouts[8].fnUpdateSelection()" id:#updateSelection - ) - ) - - on rltSkinTools rolledUp state do - ( - if state then - ( - fnUpdateSelection() - callbacks.addScript #selectionSetChanged "CryRiggingTools.rollouts[8].fnUpdateSelection()" id:#updateSelection - callbacks.addScript #modPanelObjPostChange "CryRiggingTools.rollouts[8].fnUpdateSelection()" id:#updateSelection - ) - else - ( - fnBlurUnOptimize() - callbacks.removeScripts id:#updateSelection - ) - ) - - on rltSkinTools close do - ( - fnBlurUnOptimize() - callbacks.removeScripts id:#updateSelection - ) - - on ckbtnBlurWeightsOptimize changed state do - ( - if state and sMyObject != undefined then - ( - fnBlurOptimize 64 - ) - else - ( - fnBlurUnOptimize() - ) - ) - - on btnAverageWeightsExecute pressed do - ( - sMySkin = undefined - if $ != undefined do( - sMyskin = modPanel.getCurrentObject() - if sMySkin.name != "CrySkin" do( - sMySkin = undefined - ) - ) - if sMySkin != undefined then( - aSelectedVerts = fnGetSelectedVerts sMySkin - aOldVertWeights = #() - aOldVertBones = #() - btnBlurWeightsRestore.enabled = false - btnAverageWeightsRestore.enabled = false - for iVert in aSelectedVerts do( --stores old weights for undo function - aOldWeights = #() - aOldBones = #() - for i = 1 to skinOps.GetVertexWeightCount sMySkin iVert do( - append aOldBones (skinOps.GetVertexWeightBoneID sMySkin iVert i) - append aOldWeights (skinOps.GetVertexWeight sMySkin iVert i) - ) - append aOldVertBones aOldBones - append aOldVertWeights aOldWeights - ) - aBoneIDList = #() --contains a list of all the bones that affect at least one of the selected vertices - for iVert in aSelectedVerts do( --unnormalize vertices and create aBoneIDList - skinOps.unNormalizeVertex sMySkin iVert true - iWeightCount = skinOps.GetVertexWeightCount sMySkin iVert - for i = 1 to iWeightCount do( - iBoneID = skinOps.GetVertexWeightBoneID sMySkin iVert i - if (findItem aBoneIDList iBoneID) == 0 do( - append aBoneIDList iBoneID - ) - ) - ) - for i = 1 to aBoneIDList.count do( - local fSum = 0 - for iVert in aSelectedVerts do( - aCurBoneInWeightList = fnFindBoneIDInWeightList sMySkin aBoneIDList[i] iVert - if aCurBoneInWeightList != 0 do( - fSum += (skinOps.GetVertexWeight sMySkin iVert aCurBoneInWeightList) - ) - ) - for iVert in aSelectedVerts do( - skinOps.SetVertexWeights sMySkin iVert aBoneIDList[i] (fSum/aSelectedVerts.count) - ) - ) - for iVert in aSelectedVerts do( - skinOps.unNormalizeVertex sMySkin iVert false - ) - btnAverageWeightsRestore.enabled = true - ) - else(messageBox "Please select the CrySkin modifier of an object!") - ) - - on btnAverageWeightsRestore pressed do - ( - for i = 1 to aSelectedVerts.count do - ( - skinOps.unNormalizeVertex sMySkin aSelectedVerts[i] true - skinOps.ReplaceVertexWeights sMySkin aSelectedVerts[i] aOldVertBones[i] aOldVertWeights[i] - skinOps.unNormalizeVertex sMySkin aSelectedVerts[i] false - ) - aSelectedVerts = #() - aOldVertWeights = #() - aOldVertBones = #() - btnAverageWeightsRestore.enabled = false - ) - - on btnBlurWeightsExecute pressed do - ( - sMySkin = undefined - if $ != undefined then - ( - try - ( - sMyskin = modPanel.getCurrentObject() - if sMySkin.name != "CrySkin" then - ( - sMySkin = undefined - ) - ) - catch - ( - sMySkin = undefined - ) - ) - if sMySkin != undefined then - ( - iBlurTime = timeStamp() - aSelectedVerts = fnGetSelectedVerts sMySkin - - if aSelectedVerts.count > 0 then - (--if vertex selection is not empty proceed - iFindVertsTimeSum = 0 - iGetWeightsTimeSum = 0 - iCurrentFrame = sliderTime - aOldVertWeights = #() --2D array storing old weights for undo function - aOldVertBones = #() --2D array storing old bones for undo function - fBlurRadius = spnBlurWeightsRadius.value --blur radius - aNewVertWeights = #() --2D array storing new weights for all target verts - aNewVertBones = #() --2D array storing new bones for all target verts - btnBlurWeightsRestore.enabled = false - btnAverageWeightsRestore.enabled = false - for iVert in aSelectedVerts do - ( --stores old weights for undo function - aOldWeights = #() - aOldBones = #() - for i = 1 to skinOps.GetVertexWeightCount sMySkin iVert do - ( - append aOldBones (skinOps.GetVertexWeightBoneID sMySkin iVert i) - append aOldWeights (skinOps.GetVertexWeight sMySkin iVert i) - ) - append aOldVertBones aOldBones - append aOldVertWeights aOldWeights - ) - - if bBlurOptimize then - (--if optimized then blur in base pose - local iMyRefFrame = sMySkin.ref_frame - if iMyRefFrame < animationRange.start then - ( - animationRange = interval iMyRefFrame animationRange.end - ) - if iMyRefFrame > animationRange.end then - ( - animationRange = interval animationRange.start iMyRefFrame - ) - sliderTime = iMyRefFrame - ) - - for iTargetVert in aSelectedVerts do - ( --unnormalize vertices and creates aNewVertWeights and aNewVertBones - p3TargetPos = sMyObject.verts[iTargetVert].pos --position of target vertex - aSourceVerts = #() --list of vertices within a certain proximity to selected vertex - aSourceVertMultipliers = #() --list of multiplier for each source vertex based on proximity to target - fSourceVertMultiplierSum = 0 - if bBlurOptimize then - ( --if optimization active then go find vertices in octree - iFindVertsTime = timeStamp() - oMyVertsOctreeRoot.fnFindVertsInSphere p3TargetPos fBlurRadius aSourceVerts aSourceVertMultipliers - for fElement in aSourceVertMultipliers do - ( - fSourceVertMultiplierSum+= fElement - ) - iFindVertsTimeSum += timeStamp() - iFindVertsTime - ) - else - ( --if not optimized go through all vertices in mesh - iFindVertsTime = timeStamp() - for iVert = 1 to (getNumVerts sMyObject) do( --creates aSourceVerts array - fCurDist = distance p3TargetPos (sMyObject.verts[iVert].pos) - if fCurDist < fBlurRadius then( - append aSourceVerts iVert - append aSourceVertMultipliers (fBlurRadius - fCurDist) - fSourceVertMultiplierSum += (fBlurRadius - fCurDist) - ) - ) - iFindVertsTimeSum += timeStamp() - iFindVertsTime - ) - - fSourceVertMultiplierSum = 1/fSourceVertMultiplierSum - for i = 1 to aSourceVertMultipliers.count do - ( --normalizes aSourceVertMultipliers - aSourceVertMultipliers[i] *= fSourceVertMultiplierSum - ) - - iGetWeightsTime = timeStamp() - aNewBones = #() --new bones that target vertex will be skinned to - aNewWeights = #() -- new weights for these bones - for j = 1 to aSourceVerts.count do - ( --per vertex creates element for aNewVertWeights and aNewVertBones - iWeightCount = skinOps.GetVertexWeightCount sMySkin aSourceVerts[j] - for i = 1 to iWeightCount do - ( - iBoneID = skinOps.GetVertexWeightBoneID sMySkin aSourceVerts[j] i - --if bone not in list: append bone and weight, else add weight of bone to existing weights - if (appendIfUnique aNewBones iBoneID) == true then - ( - append aNewWeights ((skinOps.GetVertexWeight sMySkin aSourceVerts[j] i)*aSourceVertMultipliers[j]) - ) - else - ( - aNewWeights[findItem aNewBones iBoneID] += (skinOps.GetVertexWeight sMySkin aSourceVerts[j] i)*aSourceVertMultipliers[j] - ) - ) - ) - append aNewVertWeights aNewWeights - append aNewVertBones aNewBones - iGetWeightsTimeSum += timeStamp() - iGetWeightsTime - ) - for i = 1 to aSelectedVerts.count do( - /* - --prints all the new weights - sMyPrint = "vertID: " + aSelectedVerts[i] as string + " - " - fSum = 0 - for j = 1 to aNewVertWeights[i].count do( - sMyPrint += aNewVertBones[i][j] as string + "= " + aNewVertWeights[i][j] as string + "; " - fSum += aNewVertWeights[i][j] - ) - sMyPrint += "Sum= " + fSum as string - print sMyPrint - */ - skinOps.unNormalizeVertex sMySkin aSelectedVerts[i] true - skinOps.ReplaceVertexWeights sMySkin aSelectedVerts[i] aNewVertBones[i] aNewVertWeights[i] - skinOps.unNormalizeVertex sMySkin aSelectedVerts[i] false - ) - if bBlurOptimize then - ( - sliderTime = iCurrentFrame - ) - print ("### Blurtimes - Find Verts: " + formattedPrint (iFindVertsTimeSum/1000.0) format:".3f" + " - Get Weights: " + formattedPrint (iGetWeightsTimeSum/1000.0) format:".3f" + " - Total: " + formattedPrint ((timeStamp() - iBlurTime)/1000.0) format:".3f" + " ###") - btnBlurWeightsRestore.enabled = true - ) - ) - else(messageBox "Please select the CrySkin modifier of an editable mesh!") - ) - - on btnBlurWeightsRestore pressed do( - for i = 1 to aSelectedVerts.count do( - skinOps.unNormalizeVertex sMySkin aSelectedVerts[i] true - skinOps.ReplaceVertexWeights sMySkin aSelectedVerts[i] aOldVertBones[i] aOldVertWeights[i] - skinOps.unNormalizeVertex sMySkin aSelectedVerts[i] false - ) - aSelectedVerts = #() - aOldVertWeights = #() - aOldVertBones = #() - btnBlurWeightsRestore.enabled = false - ) - ) - - - if crytools.DOMAIN == "INTERN.CRYTEK.DE" then - ( - addRollout InternalTools CryRiggingTools rolledup:true - ) - addRollout RiggingTools CryRiggingTools rolledup:true - addRollout PhysicsSetup CryRiggingTools rolledup:true - addRollout Diagnostic CryRiggingTools rolledup:true - addRollout SmartObjects CryRiggingTools rolledup:true - --addRollout metadataManager CryRiggingTools rolledup:true - addRollout reactorTools CryRiggingTools rolledup:true - addRollout bakebones CryRiggingTools rolledup:true - addRollout rltSkinTools CryRiggingTools --rolledup:true -) --end local scope - diff --git a/Tools/maxscript/Diagnostics.ms b/Tools/maxscript/Diagnostics.ms deleted file mode 100644 index 0edf3252a6..0000000000 --- a/Tools/maxscript/Diagnostics.ms +++ /dev/null @@ -1,682 +0,0 @@ -------------------------------------------------------------------------------- --- Diagnostics.ms --- Version 2.5 --- General cryTools control panel -------------------------------------------------------------------------------- - -if diagnostics != undefined then -( - destroydialog diagnostics -) - -rollout diagnostics "cryTools Control Panel 2.5" -( - group "Art" - ( - checkbox warnMatsCheck "Check for Crytek shader at export" - checkbox reparentTwistCheck "Re-parent biped twist bones at export" - ) - group "Animation" - ( - checkbox loadOldAnimTools "Load Old Animation Tools" - checkbox noUnparentWeapons "Do not unparent $weapon_bone children at export" - --checkbox updateCollectionsCheck "Auto-update pose collections on max file open" --enabled:false - --checkbox syncCollectionsAtLoad "Sync pose collections at max start (P4)" --enabled:false - ) - Group "Misc" - ( - checkbox checkBeforeExport "Check before Export" checked:true - checkbox suppressWarningsCheck "Suppress all export warnings" - checkbox showSplashCheck "Show splash screen" - ) - Group "Update/Uninstall/Rollback" - ( - button update_btn " Reload/Install Updates From Your Local Build " align:#center enabled:false - button update_btnAB "Retrieve Latest Tools\Sync" align:#left enabled:false - checkbox BuildOn "LAN" offset:[150,-22] enabled:false - checkBox PerfOn "PerForce" offset:[195,-20] checked:true enabled:false - checkbox HTTPOn "CryHTTP" offset:[262,-20] enabled:false - checkbutton rollback_exporter "Rollback Exporter" offset:[-112,0] enabled:false - button uninstall_tools "Uninstall CryTools" offset:[-7,-26] enabled:false - label current_exportTXT "LOCAL BUILD: Cannot find Code_Changes.txt" align:#center enabled:false - ) - button dumpCryToolsGlobals "dump crytools global vars" offset:[-100,0] - button callbackList "dump callbacks" offset:[18,-26] - button callbackRemove "remove callbacks" offset:[117,-26] tooltip:"right click to activate" enabled:true - --checkbox weaponChild "Remove $weapon_bone children (anim assets)" enabled:false - - --label spacer01 "" - label maxVersionNum_crytools_LBL "MAX VERSION:" align:#left - label maxDirTxt_LBL "MAX PATH:" align:#left - label project_name_crytools_LBL "PROJECT: " align:#left - edittext projectEnter text:"NONE" offset:[60,-20] fieldWidth:180 --enabled:false - button pickProject "PICK" offset:[105,-21] height:15 --enabled:false - button setProject "SET" offset:[148,-21] height:15 --enabled:false - label domain_LBL "DOMAIN: " align:#left - label BuildPathFull_LBL "BUILD PATH: " align:#left - label cryINI_LBL "CRYEXPORT.INI PATH:" align:#left - label cryToolsINI_LBL "CRYTOOLS.INI PATH:" align:#left - label editorpath_LBL "EDITOR PATH:" align:#left - label cbaPath_LBL "CBA PATH: UNDEFINED" align:#left - label rollback_status_LBL "ROLLBACK STATUS:" align:#left - label localBuildNumber_crytools_LBL "LOCAL BUILD #: " align:#left - label latestbuildnumber_crytools_LBL "LATEST BUILD #:" align:#left - label latest_build_crytools_LBL "LATEST BUILD ON SERVER: " align:#left - --button refresh "REFRESH" offset:[140,-20] - --button getPoses "Get latest (P4)" offset:[120,-493] --enabled:false - - on diagnostics open do - ( - - mat_dump = #("true","false","crytools.warnmats:") - - --warn mats set - if crytools.warnmats == true then - ( - warnMatsCheck.checked = true - ) - else - ( - warnMatsCheck.checked = false - ) - - --reparent twist set - if crytools.reparenttwist == true then - ( - reparenttwistcheck.checked = true - ) - else - ( - reparenttwistcheck.checked = false - ) - - --check before export - if crytools.checkbeforeexport == true then - ( - checkBeforeExport.checked = true - ) - else - ( - checkBeforeExport.checked = false - ) - - --suppress warnings set - if crytools.suppresswarnings == true then - ( - suppressWarningsCheck.checked = true - ) - else - ( - suppressWarningsCheck.checked = false - ) - - --do not unparent weapon_bone children - if crytools.nounparentw == true then - ( - noUnparentWeapons.checked = true - ) - else - ( - noUnparentWeapons.checked = false - ) - - --ActivateAnimTools - if crytools.loadoldanimtools == true then - ( - loadOldAnimTools.checked = true - ) - else - ( - loadOldAnimTools.checked = false - ) - - --show splash - if crytools.showSplash == true then - ( - showSplashCheck.checked = true - ) - else - ( - showSplashCheck.checked = false - ) - /* - --update collections - if crytools.updateCollections == true then - ( - updateCollectionsCheck.checked = true - ) - else - ( - updateCollectionsCheck.checked = false - ) - */ - - /* - --sync collections - if crytools.syncCollections == true then - ( - syncCollectionsAtLoad.checked = true - ) - else - ( - syncCollectionsAtLoad.checked = false - ) - */ - maxDirTxt_LBL.text = ("MAX PATH: " + crytools.maxDirTxt) - maxVersionNum_crytools_LBL.text = ("MAX VERSION: " + crytools.maxVersionNum as string) - - --crytools.rollback_status - if crytools.rollback_status == undefined then - ( - rollback_status_LBL.text = ("ROLLBACK STATUS: UNDEFINED") - ) - else - ( - rollback_status_LBL.text = ("ROLLBACK STATUS: " + crytools.rollback_status) - ) - - --crytools.project_name - /*if crytools.project_name == undefined then - ( - project_name_crytools_LBL.text = ("PROJECT: UNDEFINED") - ) - else - ( - project_name_crytools_LBL.text = ("PROJECT: " + crytools.project_name) - )*/ - /* - if crytools.project_name == undefined then - ( - projectEnter.text = NONE - ) - else - ( - projectEnter.text = crytools.project_name - ) - */ - - if crytools.BuildPathFull == undefined then - projectEnter.text = "NONE" - else - projectEnter.text = crytools.BuildPathFull - - - --DOMAIN - if crytools.DOMAIN == undefined then - ( - domain_LBL.text = ("DOMAIN: UNDEFINED") - ) - else - ( - domain_LBL.text = ("DOMAIN: " + crytools.DOMAIN) - ) - - cryINI_LBL.text = ("CRYEXPORT.INI PATH: " + crytools.cryINI) - cryToolsINI_LBL.text = ("CRYTOOLS.INI PATH: " + (sysInfo.tempDir + "cry_temp\\crytools.ini")) - - editorpath_LBL.text = ("EDITOR PATH: " + crytools.editorPath) - cbaPath_LBL.text = ("CBA PATH: " + crytools.cbaPath) - - --crytools.BuildPathFull - if crytools.BuildPathFull ==undefined then - ( - BuildPathFull_LBL.text = ("BUILD PATH: UNDEFINED") - ) - else - ( - BuildPathFull_LBL.text = ("BUILD PATH: " + crytools.BuildPathFull) - ) - - if crytools.latest_build != undefined then - ( - localBuildNumber_crytools_LBL.text = ("LOCAL BUILD #: " + crytools.localBuildNumber as string) - latestbuildnumber_crytools_LBL.text = ("LATEST BUILD #: " + crytools.latestbuildnumber as string) - latest_build_crytools_LBL.text = ("LATEST BUILD ON SERVER: " + crytools.latest_build) - ) - - -- in from updateTools - current_exportTXT.text = ("LOCAL BUILD: " + crytools.localBuildNumber as String+ " LATEST BUILD: " + crytools.latestbuildnumber as String) - if crytools.rollback_status == "true" do (rollback_exporter.checked = true) - if crytools.rollback_status == "false" do (rollback_exporter.checked = false) - ) - - on getPoses pressed do - ( - p4Update = ("p4 sync " + crytools.BuildPathFull + "_Production\\Art\\Animation\\Human\\Resources\\poses\\...") - crytools.scmd p4Update true - ) - - on dumpCryToolsGlobals pressed do - ( - print (apropos "crytools") - ) - - on callbacklist pressed do - ( - print (callbacks.show()) - ) - - on callbackRemove rightclick do - ( - callbacks.removescripts() - ) - - --warn mats checked - on warnMatsCheck changed state do - ( - cryTools.outToINI "CryTools" "warnmats" (state as String) - crytools.warnmats = state - ) - - --reparent checked - on reparentTwistCheck changed state do - ( - cryTools.outToINI "CryTools" "reparent" (state as String) - crytools.reparenttwist = state - ) - - --no unparent $weapon_bone checked - on noUnparentWeapons changed state do - ( - cryTools.outToINI "CryTools" "no_unparent_weapons" (state as String) - crytools.nounparentw = state - ) - - --Activate Anim Tools - on loadOldAnimTools changed state do - ( - cryTools.outToINI "CryTools" "loadOld_animTools" (state as String) - if loadOldAnimTools.checked == false then - ( - try closeRolloutfloater CryAnimationTools catch() - - try - ( - filein (crytools.BuildPathFull + "Tools\\maxscript\\cryAnim\\load.ms") - ) - catch ( print "No load.ms in cryAnim found" ) - ) - else - ( - if cryTools.cryAnim != undefined then - ( - cryTools.cryAnim.base.killCryAnim() - filein (crytools.BuildPathFull + "Tools\\maxscript\\CryAnimationTools.ms") - ) - ) - cryTools.loadoldanimtools = state - crytools.generateMenu() - ) - - - --check before export - on checkBeforeExport changed state do - ( - cryTools.outToINI "CryTools" "checkExport" (state as String) - crytools.checkbeforeexport = state - ) - - - --suppress warnings checked - on suppressWarningsCheck changed state do - ( - cryTools.outToINI "CryTools" "suppress" (state as String) - crytools.suppresswarnings = state - ) - - --show splash checked - on showSplashCheck changed state do - ( - cryTools.outToINI "CryTools" "splash" (state as String) - crytools.showSplash = state - ) - - /* - --auto update collections - on updateCollectionsCheck changed state do - ( - if updateCollectionsCheck.checked == false then - ( - oldData = (crytools.inFromINI (sysInfo.tempDir + "cry_temp\\crytools.ini") false) - oldData[11] = "UPDATE_COLLECTIONS:false" - crytools.outtoini oldData (sysInfo.tempDir + "cry_temp\\crytools.ini") false - crytools.updateCollections = false - callbacks.removescripts #filePostOpen id:#updateCollections - ) - else - ( - oldData = (crytools.inFromINI (sysInfo.tempDir + "cry_temp\\crytools.ini") false) - oldData[11] = "UPDATE_COLLECTIONS:true" - crytools.outtoini oldData (sysInfo.tempDir + "cry_temp\\crytools.ini") false - crytools.updateCollections = true - txt = "if $bip01 != undefined then (\n" - txt += "biped_ctrl = $bip01.controller\n" - txt += "biped.deleteallcopycollections biped_ctrl\n" - txt += "try(\n" - txt += "biped.loadCopyPasteFile biped_ctrl \"J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male.cpy\"\n" - txt += "biped.loadCopyPasteFile biped_ctrl \"J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_female.cpy\"\n" - txt += "biped.loadCopyPasteFile biped_ctrl \"J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_combat.cpy\"\n" - txt += "biped.loadCopyPasteFile biped_ctrl \"J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_crouch.cpy\"\n" - txt += "biped.loadCopyPasteFile biped_ctrl \"J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_prone.cpy\"\n" - txt += "biped.loadCopyPasteFile biped_ctrl \"J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_relaxed.cpy\"\n" - txt += "biped.loadCopyPasteFile biped_ctrl \"J:/Game02_Production/Art/Animation/Human/Resources/poses/crysis_male_stealth.cpy\")\n" - txt += "catch (messagebox \"Cannot locate pose files\"))" - callbacks.addscript #filePostOpen txt id:#updateCollections - ) - ) - */ - - /* - on syncCollectionsAtLoad changed state do - ( - if syncCollectionsAtLoad.checked == false then - ( - oldData = (crytools.inFromINI (sysInfo.tempDir + "cry_temp\\crytools.ini") false) - oldData[12] = "SYNC_COLLECTIONS:false" - crytools.outtoini oldData (sysInfo.tempDir + "cry_temp\\crytools.ini") false - crytools.syncCollections = false - ) - else - ( - oldData = (crytools.inFromINI (sysInfo.tempDir + "cry_temp\\crytools.ini") false) - oldData[12] = "SYNC_COLLECTIONS:true" - crytools.outtoini oldData (sysInfo.tempDir + "cry_temp\\crytools.ini") false - crytools.syncCollections = true - ) - ) - */ - - on pickProject pressed do - ( - local tempVar = (getSavePath caption:"Project Directory" initialDir:crytools.BuildPathFull) - if tempVar != undefined then - ( - if tempVar[tempVar.count] != "\\" then - append tempVar "\\" - --crytools.BuildPathFull = tempVar - projectEnter.text = tempVar - ) - ) - - - on setProject pressed do - ( - local buildPathNew = "" - local buildPathFilter = filterString projectEnter.text "\\" - for i = 1 to (buildPathFilter.count - 1) do - buildPathNew += buildPathFilter[i] + "\\" - - buildPathNew += buildPathFilter[buildPathFilter.count] - - if (queryBox ("Changing your project path to a bad location can render yout tools unusable.\nThis effects not only CryTools, but CryTif and others.\n\nAre you sure you would like to change your path to:\n" + buildPathNew) title:"Tread Carefullly.." beep:true) == true then - ( - if crytools.maxversionnum >= 10 then - ( - registry.openKey HKEY_CURRENT_USER "Software\\Crytek\\Settings\\" accessRights:#all key:&key1 - registry.setValue key1 "RootPath" #REG_SZ buildPathNew - ) - else - ( - messagebox "The ability to edit the registry has been limited to versions of Max10 and later.\nWe used to dynamically generate, execute, and delete VBScripts to accomplish this.\nWindows Vista does not like this, and it was a hack anyway." - return undefined - ) - ) - else - ( - return undefined - ) - - local animlistPathNew = buildPathNew + "Game\Animations\Animations.cba" - - local folderArray = getDirectories (buildPathNew + "*") - local folderArrayNew = #() - if folderArray.count > 0 then - ( - for i = 1 to folderArray.count do - ( - tempArray = #(folderArray[i]) - --// Add subFolderFiles to list - join tempArray (getDirectories (folderArray[i] + "*" )) - - join folderArrayNew tempArray - ) - - ) - - - local RCPath = "" - - for i = 1 to folderArrayNew.count do - ( - - local tempArray = getFiles (folderArrayNew[i] + "*.*") - for f = 1 to tempArray.count do - ( - if (findString tempArray[f] "rc.exe") != undefined then - ( - RCPath = folderArrayNew[i] - exit - ) - if RCPath != "" then - exit - ) - ) - - local editorPathNew = "" - - if RCPath != "" then - ( - - editorPathFilter = filterString RCPath "\\" - for i = 1 to (editorPathFilter.count - 1) do - editorPathNew += editorPathFilter[i] + "\\" - - editorPathNew += "Editor.exe" - ) - - /*setINISetting (getDir #maxroot + "Plugins\\CryExport.ini") "SandBox" "path" editorPathNew - cryTools.editorPath = editorPathNew - - setINISetting (getDir #maxroot + "Plugins\\CryExport.ini") "SandBox" "buildPath" buildPathNew - cryTools.buildPathFull = buildPathNew - - setINISetting (getDir #maxroot + "Plugins\\CryExport.ini") "SandBox" "animlistpath" animlistPathNew - cryTools.cbapath = animlistPathNew*/ - - fileIn (getDir #maxroot + "scripts\\startup\\loadCryTools.ms") - ) - - -------------------------------------------------------------------------- - -- UPDATE / UNINSTALL / ROLLBACK - -------------------------------------------------------------------------- - - on BuildOn changed state do - ( - if BuildOn.checked == true then - ( - PerfOn.checked = false - HTTPOn.checked = false - ) - ) - on PerfOn changed state do - ( - if PerfOn.checked == true then - ( - BuildOn.checked = false - HTTPOn.checked = false - ) - ) - on HTTPOn changed state do - ( - if HTTPOn.checked == true then - ( - PerfOn.checked = false - BuildOn.checked = false - ) - ) - on update_btn pressed do - ( - filein (crytools.BuildPathFull + "Tools\\maxscript\\AddCryTools.ms") - current_exportTXT.text = ("LOCAL BUILD: " + crytools.localBuildNumber + " LATEST BUILD: " + crytools.latestbuildnumber) - print ("Build updated from " + crytools.BuildPathFull) - --destroyDialog checkForUpdate - ) - - -- Get Latest From AB and Latest Build - ------------------------------------------------------------------------------- - on update_btnAB pressed do - ( - try - ( - if crytools.BuildPathFull == "J:\\Game04\\" then - ( - messagebox "You are on Game04" - return undefined - ) - -- AB Stuff - if HTTPOn.checked == true then - ( - rollout httpSock "httpSock" width:0 height:0 - ( - activeXControl port "Microsoft.XMLHTTP" setupEvents:false releaseOnClose:false - ); - createDialog httpSock pos:[-100,-100]; - destroyDialog httpSock; - - httpSock.port.open "GET" "http://www.crytek.com/index.htm" false; - httpSock.port.setrequestheader "If-Modified-Since" "Sat, 1 Jan 1900 00:00:00 GMT"; - httpSock.port.send(); - - print (httpSock.port.responsetext); - ) - - -- P4 stuff - if perfOn.checked == true then - ( - p4Update = ("p4 sync " + crytools.BuildPathFull + "Tools\...") - crytools.scmd p4Update true - ) - - if BuildOn.checked == true then - ( - -- Latest Build Stuff - rollback_check = openFile (sysInfo.tempDir + "cry_temp\\crytools.rollback_status.ini") - if rollback_check == undefined then (crytools.rollback_status = "false") - crytools.rollback_status = "false" - latestCryExport = (crytools.md5 ("\\\\Storage\\builds\\" + crytools.latest_build + "\\Tools\\CryExport8.dlu")) - if crytools.md5 (crytools.maxDirTxt + "plugins\\CryExport8.dlu") != latestCryExport then - ( - if crytools.existfile ("\\\\storage\\builds\\" + crytools.latest_build + "\\Tools\\CryExport8.dlu") == false then - ( - messageBox ("There is no exporter on the build server in the latest folder [" + crytools.latest_build + "]") title: "No Exporter Found!" - ) - else - ( - messageBox ("There is a new exporter available in build " + crytools.latestbuildnumber) title: "New Exporter Found!" - crytools.scmd (("copy /Y \\\\storage\\builds\\" + crytools.latest_build + "\\Tools\\CryExport8.dlu ") + (crytools.BuildPathFull + "Tools\\")) true - ) - ) - ) - ) - catch - ( - messageBox "Either cannot locate the build server [\\\\Storage\\], or you do not have crytools.alienBrain correctly installed." title: "Something is wrong!" - ) - messageBox ("CryTools has checked Build [" + crytools.latestbuildnumber + "] for updates.\nPlease click the \"Check/Install Updates From Your Latest Build\" button to install any updates it found.") title: ("Checked Build \\Tools (" + localTime + ") - Checked Plugins From Build #" + crytools.latestbuildnumber) - ) - - -- Rollback Exporter - ------------------------------------------------------------------------------- - on rollback_exporter changed state do - ( - try - if (rollback_exporter.checked == true) then - ( - crytools.rollback_status = "true" - crytools.scmd ("mkdir \"" + sysInfo.tempDir + "cry_temp\\bad\\\"") true - crytools.scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\CryExport8.dlu\"") + " " + (sysInfo.tempDir + "cry_temp\\bad\\")) true - crytools.scmd ("move /Y " + ("\"" +sysInfo.tempDir + "cry_temp\\CryExport8.dlu\"") + " " + (crytools.maxDirTxt + "plugins\\")) true - print "CryExport8.dlu has been rolled back to the previous version." - output_rollbackINI = openfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini") mode:"w" - format crytools.rollback_status to: output_rollbackINI - close output_rollbackINI - - messageBox "CryExport8.dlu has been rolled back to the previous version.\nTo get a newer exporter later you must click \"Get Latest Tools From crytools.alienBrain/Current Build\", or update your build." title: "CryExport8.dlu Rolled Back!" - ) - else - ( - crytools.rollback_status = "false" - output_rollbackINI = openfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini") mode:"w" - format crytools.rollback_status to: output_rollbackINI - close output_rollbackINI - messageBox "You are no longer in rollback mode.\nTo get a newer exporter later you must click \"Get Latest Tools From crytools.alienBrain/Current Build\", or update your build." title: "CryExport8.dlu No Longer Rolled Back!" - ) - catch - ( - messageBox "Rollback error 1442." title:"Error!" - return undefined - ) - ) - - -- Uninstall - ------------------------------------------------------------------------------- - - on uninstall_tools pressed do - ( - rollout areYouSure "CryTools Uninstallation" - ( - label doyouwant "Are you sure you want to completely remove CryTools?" align:#center - button uninstallNow "Yes" pos:[110,25] - button donotuninstall "No" pos:[150,25] - on donotuninstall pressed do - ( - destroyDialog areYouSure - ) - on uninstallNow pressed do - ( - subMenu = menuMan.findMenu "CryTools" - menuMan.unRegisterMenu subMenu - deleteFile "$UI\\MacroScripts\\CryTools-UpdateTools.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-CryRigging.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-CryMorphManager.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-CryAnimation.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-SceneBrowser.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-help.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-CryMorphManager.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-CryInfoLoader.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-CryInfo.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-CryArtistTools.mcr" - deleteFile "$UI\\MacroScripts\\CryTools-ControlPanel.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-UVscaleUniform.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-UVcollapseVertical.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-CryKeys-UVcollapseHorizontal.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-showVertexColors.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-resetXformCollapse.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-preserveUV.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-exportNodes.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-exportAnim.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-changeRefCoordSys.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-CenterPivot.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-showHideVertexColors.mcr" - deleteFile "$UI\\MacroScripts\\CryKeys-UVcollapseHorizontal.mcr" - crytools.maxDirTxt = (getdir #maxroot) - crytools.minusr (crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms") - sleep 1 - deleteFile (crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms") - print (sysInfo.username + " has uninstalled CryTools.") - destroyDialog areYouSure - --destroyDialog checkForUpdate - messageBox ("CryExport8.dlu is still in your plugins folder because it is in use.\n" + sysInfo.username + ", cryTools has been uninstalled.") title: "Uninstallation complete!" - ) - ) - createDialog areYouSure 300 60 bgcolor:black fgcolor:white - ) - - - /*on button refresh pressed do - ( - filein (crytools.BuildPathFull + "tools\\maxscript\\Diagnostics.ms") - )*/ - - ) -createDialog diagnostics 350 600 style:#(#style_resizing,#style_titlebar,#style_minimizebox,#style_sunkenedge,#style_sysmenu) diff --git a/Tools/maxscript/FBX_Bones_to_Bip.ms b/Tools/maxscript/FBX_Bones_to_Bip.ms deleted file mode 100644 index 3e85b022a5..0000000000 --- a/Tools/maxscript/FBX_Bones_to_Bip.ms +++ /dev/null @@ -1,227 +0,0 @@ -/* -[DESCRIPTION] -FBX to Bip conversion script. - -[USAGE] -With a merged in FBX bone structure and a matching biped in the scene run this script. - -It will go frame by frame and align the Bip structure to the Bone structure. - -One limitation, the script is hardcoded to work with the Bone structure names with "_Bip01" as a prefix and the matching bip being named "Bip01" - -This will be adressed in the future. - -[CREATION INFO] -Author:Paul Hormis -Last Updated: July 17, 2006 - -[VERSION HISTORY] -v1.00 Created - -Copyright (C) 2006 Paul Hormis -*/ - - - -Global FBXtoBipXFer, AnimXferProgress - -Struct FBXtoBipXFerStruct -( - PelvisRef = undefined, - PelvisRot = undefined, - PelvisRotFinal = undefined, - LThighRef = undefined, - RThighRef = undefined, - BipPartStep = 100.0 / 51.0, - - function DoCreatePointAtPivot ObjectForNull: = - ( - try - ( - tempRet = undefined - for MSobj in ObjectForNull do - with animate off - ( - PivotPointHelper = Point pos:(MSobj.transform.pos) isSelected:off size:3 centermarker:off axistripod:off cross:on Box:off constantscreensize:off drawontop:off wirecolor:yellow - PivotPointHelper.name = ((MSobj.name as string) + "_PivotPoint") - - in coordsys world PivotPointHelper.rotation = inverse(MSobj.transform.rotationPart) - in coordsys world PivotPointHelper.pos = MSobj.transform.pos - tempRet = PivotPointHelper - ) - - return tempRet - )catch() - ), - - function DoPosRotConst SelectedObj PARENTOBJ = - ( - SelectedObj.position.controller = position_constraint() - SelectedObj.rotation.controller = orientation_constraint() - - SelectedObj.position.controller.appendTarget PARENTOBJ 100 - SelectedObj.rotation.controller.appendTarget PARENTOBJ 100 - - SelectedObj.position.controller.relative = false - SelectedObj.rotation.controller.relative = false - ), - - fn DoRotConst SelectedObj PARENTOBJ = - ( - SelectedObj.rotation.controller = orientation_constraint() - SelectedObj.rotation.controller.appendTarget PARENTOBJ 100 - SelectedObj.rotation.controller.relative = false - ), - - function SetBipPosAndRot BipTarget: BoneSource: step: = - ( - biped.setTransform BipTarget #pos BoneSource.pos true - biped.setTransform BipTarget #rotation BoneSource.transform.rotation true - ), - - function SetBipRot BipTarget: BoneSource: step: = - ( - biped.setTransform BipTarget #rotation BoneSource.transform.rotation true - ), - - function SetBipPos BipTarget: BoneSource: step: = - ( - biped.setTransform BipTarget #pos BoneSource.pos true - ), - - - function DoFBXtoBipXFer = - ( - - FBXtoBipXFer.LThighRef = (FBXtoBipXFerStruct.DoCreatePointAtPivot ObjectForNull:#($'_Bip01 L Thigh')) - FBXtoBipXFer.RThighRef = (FBXtoBipXFerStruct.DoCreatePointAtPivot ObjectForNull:#($'_Bip01 R Thigh')) - - FBXtoBipXFer.LThighRef.parent = $'_Bip01 L Thigh' - FBXtoBipXFer.RThighRef.parent = $'_Bip01 R Thigh' - - FBXtoBipXFer.PelvisRef = point name:"PelvisReferenceLocation" size:3 - - FBXtoBipXFerStruct.DoPosRotConst FBXtoBipXFer.PelvisRef FBXtoBipXFer.LThighRef - FBXtoBipXFerStruct.DoPosRotConst FBXtoBipXFer.PelvisRef FBXtoBipXFer.RThighRef - - FBXtoBipXFer.PelvisRot = point pos:(FBXtoBipXFer.PelvisRef.transform.pos) name:"PelvisReferenceRotation" size:3 isSlected:off cross:off box:on - FBXtoBipXFer.PelvisRot.parent = FBXtoBipXFer.PelvisRef - - FBXtoBipXFerStruct.DoRotConst FBXtoBipXFer.PelvisRot $'_Bip01 Pelvis' - - FBXtoBipXFer.PelvisRotFinal = (FBXtoBipXFerStruct.DoCreatePointAtPivot ObjectForNull:FBXtoBipXFer.PelvisRot) - - in coordsys local rotate FBXtoBipXFer.PelvisRotFinal (angleaxis 90 [0,1,0]) - in coordsys local rotate FBXtoBipXFer.PelvisRotFinal (angleaxis 90 [0,0,1]) - - FBXtoBipXFer.PelvisRotFinal.parent = FBXtoBipXFer.PelvisRot - - setCommandPanelTaskMode mode:#create -- Sets the command panel to create. Motion panel slows down processing. - cui.commandPanelOpen = false -- hides the command panel - clearSelection() -- clears the selection - - if (viewport.getlayout()) != #layout_1 do (max tool maximize) -- If the viewport is not maximized then it will do so. - - StartFrame = animationRange.start.frame as integer - EndFrame = animationRange.end.frame as integer - - frameCount = EndFrame - StartFrame - - progressFrameSteps = undefined - progressFrameSteps = 100.0 / frameCount - - - - rollout AnimXferProgress "AnimationTransfer Progress" width:525 height:32 - ( - label ProgressInfo "Processing Animation Transfer" pos:[10,2] width:300 height:15 - label CurrentFrameLabel "Frame:" pos:[400,2] width:35 height:15 - label CurrentFrame "" pos:[440,2] width:80 height:15 - progressBar SubProgress "" pos:[10,17] width:505 height:7 color:blue - progressBar MainProgress "" pos:[10,23] width:505 height:7 color:green - ) - createdialog AnimXferProgress - - animButtonState = true - - for x = 0 to frameCount do - with redraw off - ( - slidertime = (StartFrame + x) - - AnimXferProgress.CurrentFrame.text = (slidertime.frame as integer) as string - AnimXferProgress.MainProgress.value = (progressFrameSteps * x + 1) -- I commented this out for speed - - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01' BoneSource:FBXtoBipXFer.PelvisRotFinal - - biped.setTransform $'Bip01 Pelvis' #rotation $'Bip01 Pelvis'.transform.rotation true - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 Spine' BoneSource:$'_Bip01 Spine' step:2 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 Spine1' BoneSource:$'_Bip01 Spine1' step:3 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 Spine2' BoneSource:$'_Bip01 Spine2' step:3 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 Spine3' BoneSource:$'_Bip01 Spine3' step:3 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 Neck' BoneSource:$'_Bip01 Neck' step:4 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 Head' BoneSource:$'_Bip01 Head' step:5 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Clavicle' BoneSource:$'_Bip01 L Clavicle' step:6 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L UpperArm' BoneSource:$'_Bip01 L UpperArm' step:7 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Forearm' BoneSource:$'_Bip01 L Forearm' step:8 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Hand' BoneSource:$'_Bip01 L Hand' step:9 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger0' BoneSource:$'_Bip01 L Finger0' step:10 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger01' BoneSource:$'_Bip01 L Finger01' step:11 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger02' BoneSource:$'_Bip01 L Finger02' step:12 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger1' BoneSource:$'_Bip01 L Finger1' step:13 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger11' BoneSource:$'_Bip01 L Finger11' step:14 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger12' BoneSource:$'_Bip01 L Finger12' step:15 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger2' BoneSource:$'_Bip01 L Finger2' step:16 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger21' BoneSource:$'_Bip01 L Finger21' step:17 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger22' BoneSource:$'_Bip01 L Finger22' step:18 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger3' BoneSource:$'_Bip01 L Finger3' step:19 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger31' BoneSource:$'_Bip01 L Finger31' step:20 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger32' BoneSource:$'_Bip01 L Finger32' step:21 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger4' BoneSource:$'_Bip01 L Finger4' step:22 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger41' BoneSource:$'_Bip01 L Finger41' step:23 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Finger42' BoneSource:$'_Bip01 L Finger42' step:24 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Clavicle' BoneSource:$'_Bip01 R Clavicle' step:25 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R UpperArm' BoneSource:$'_Bip01 R UpperArm' step:26 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Forearm' BoneSource:$'_Bip01 R Forearm' step:27 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Hand' BoneSource:$'_Bip01 R Hand' step:28 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger0' BoneSource:$'_Bip01 R Finger0' step:29 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger01' BoneSource:$'_Bip01 R Finger01' step:30 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger02' BoneSource:$'_Bip01 R Finger02' step:31 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger1' BoneSource:$'_Bip01 R Finger1' step:31 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger11' BoneSource:$'_Bip01 R Finger11' step:33 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger12' BoneSource:$'_Bip01 R Finger12' step:34 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger2' BoneSource:$'_Bip01 R Finger2' step:35 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger21' BoneSource:$'_Bip01 R Finger21' step:36 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger22' BoneSource:$'_Bip01 R Finger22' step:37 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger3' BoneSource:$'_Bip01 R Finger3' step:38 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger31' BoneSource:$'_Bip01 R Finger31' step:39 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger32' BoneSource:$'_Bip01 R Finger32' step:40 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger4' BoneSource:$'_Bip01 R Finger4' step:41 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger41' BoneSource:$'_Bip01 R Finger41' step:42 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Finger42' BoneSource:$'_Bip01 R Finger42' step:43 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Thigh' BoneSource:$'_Bip01 L Thigh' step:44 - --FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Calf' BoneSource:$'_Bip01 L Calf' step:45 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Foot' BoneSource:$'_Bip01 L Foot' step:46 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 L Toe0' BoneSource:$'_Bip01 L Toe0' step:47 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Thigh' BoneSource:$'_Bip01 R Thigh' step:48 - --FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Calf' BoneSource:$'_Bip01 R Calf' step:49 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Foot' BoneSource:$'_Bip01 R Foot' step:50 - FBXtoBipXFer.SetBipPosAndRot BipTarget:$'Bip01 R Toe0' BoneSource:$'_Bip01 R Toe0' step:51 - gc() -- I added this garbage collection to try to speed up the script. - ) - - delete FBXtoBipXFer.PelvisRef - delete FBXtoBipXFer.PelvisRot - delete FBXtoBipXFer.PelvisRotFinal - delete FBXtoBipXFer.LThighRef - delete FBXtoBipXFer.RThighRef - animButtonState = false - destroyDialog AnimXferProgress - cui.commandPanelOpen = true - ) -) - -FBXtoBipXFer = FBXtoBipXFerStruct() - - -FBXtoBipXFer.DoFBXtoBipXFer() diff --git a/Tools/maxscript/LoadCryTools.ms b/Tools/maxscript/LoadCryTools.ms deleted file mode 100644 index 502c2ce447..0000000000 --- a/Tools/maxscript/LoadCryTools.ms +++ /dev/null @@ -1,61 +0,0 @@ -------------------------------------------------------------------------------- --- LoadCryTools.ms --- Version 2.2 External --- By: Christopher Evans -------------------------------------------------------------------------------- - - -------------------------------------------------------------------------------- --- Get The Build Dirs -------------------------------------------------------------------------------- - --- Local Build Dir - -if csexport != undefined then -( - global maxDirTxt_crytools = (getdir #maxroot) - global cryINI_crytools = (getdir #maxroot + "plugins\\CryExport.ini") - - errorFound = false - - try ( global buildPathFull_crytools = csexport.get_root_path() + "\\" ) - catch - ( - global buildPathFull_crytools = getINISetting cryINI_crytools "SandBox" "buildPath" - - if buildPathFull_crytools == "" then - ( - messageBox "Incompatible version of CryTools and CryExport" title:"Error loading CryTools" - errorFound = true - ) - else - print "Loading CryTools from INI file" - ) - - if (doesfileexist(buildPathFull_crytools + "Bin64vc141\\Editor.exe") == true then - global editorPath_crytools = buildPathFull_crytools + "Bin64vc141\\Editor.exe" - else if (doesfileexist(buildPathFull_crytools + "Bin64vc140\\Editor.exe") == true then - global editorPath_crytools = buildPathFull_crytools + "Bin64vc140\\Editor.exe" - else - messagebox("I cannot find Editor.exe") - - --- Load CryTools -------------------------------------------------------------------------------- - if errorFound == false then - ( - if buildPathFull_crytools != "" then - ( - if (doesfileexist (BuildPathFull_crytools + "Tools\\maxscript\\AddCryTools.ms")) == true then - FileIn (BuildPathFull_crytools + "Tools\\maxscript\\AddCryTools.ms") - else - messagebox ("I cannot find" + (BuildPathFull_crytools + "Tools\\maxscript\\AddCryTools.ms")) - ) - else - messageBox "Can't find local Build from cryExport.ini" title:"Error loading CryTools" - ) -) -else - messageBox "Error initialising CryTools: CryExport plugin not found" - - diff --git a/Tools/maxscript/SceneBrowser.ms b/Tools/maxscript/SceneBrowser.ms deleted file mode 100644 index d162b86d80..0000000000 --- a/Tools/maxscript/SceneBrowser.ms +++ /dev/null @@ -1,268 +0,0 @@ ---sceneView . Christopher Evans . Crytek - -if sceneView != undefined then -( - destroyDialog sceneView -) - -ilTv = dotNetObject "System.Windows.Forms.ImageList" -ilTv.imageSize = dotNetObject "System.Drawing.Size" 16 15 - -rollout sceneView "SceneView v.001" -( - - fn getIconFromBitmap thePath number iconFileName = - ( - theFileName = getDir #image +"\\icon_"+ iconFileName +".bmp" - if not doesFileExist theFileName do - ( - tempBmp = openBitmap thePath - iconBmp = bitmap 16 15 - for v = 0 to 14 do - setPixels iconBmp [0,v] (getPixels tempBmp [(number-1)*16, v] 16) - iconBmp.filename = theFileName - save iconBmp - close iconBmp - close tempBmp - ) - img = dotNetClass "System.Drawing.Image" --create an image - ilTv.images.add (img.fromFile theFileName) --add to the list - ) - - fn initTreeView tv = - ( - tv.Indent= 28 - tv.CheckBoxes = true --same as in ActiveX - tv.labelEdit = true - tv.Indent = 15 - tv.Scrollable = true - colorTest = dotNetClass "System.Drawing.Color" - tv.BackColor = colorTest.FromArgb 255 196 196 196 - iconDir = (getDir #ui) + "\\icons\\" - --We call our function for each icon, this time also passing a - --third argument with the icon name suffix. - getIconFromBitmap (iconDir + "Standard_16i.bmp") 2 "Sphere" - getIconFromBitmap (iconDir + "Standard_16i.bmp") 1 "Box" - getIconFromBitmap (iconDir + "Lights_16i.bmp") 3 "Light" - getIconFromBitmap (iconDir + "Cameras_16i.bmp") 2 "Camera" - getIconFromBitmap (iconDir + "Helpers_16i.bmp") 1 "Helper" - getIconFromBitmap (iconDir + "Splines_16i.bmp") 2 "Shape" - getIconFromBitmap (iconDir + "Systems_16i.bmp") 1 "Bone" - --At the end, we assign the ImageList to the TreeView. - tv.imageList = ilTv - ) - - - fn addChildren theNode theChildren = - ( - for c in theChildren do - ( - newNode = theNode.Nodes.add c.name c.name - newNode.tag = dotNetMXSValue c - --newNode.count = c.handle - --By default, all nodes will use icon 0 (the first one) unless - --specified otherwise via the .iconIndex and .selectedIconIndex - --properties. We set both of them to the icon corresponding to - --the superclass of the scene object: - newNode.imageIndex = newNode.selectedImageIndex = case superclassof c of - ( - Default: 1 - GeometryClass: - ( - case (c.classid[1]) of - ( - Default: 1 - 683634317: 6 -- bones - 37157: 6 -- biped objects - ) - ) - Light: 2 - Camera: 3 - Helper: 4 - ) - - newNode.checked = not c.isHidden --same as in ActiveX - --For the color, we create a DotNet color class from the - --wirecolor of the object and assign to the .forecolor of - --the TreeView node: - --newNode.forecolor = (dotNetClass "System.Drawing.Color").fromARGB c.wirecolor.r c.wirecolor.g c.wirecolor.b - addChildren newNode c.children - ) - ) - - - - --Since every node uses icon with index 0 unless specified otherwise - --the Root Node will use the first icon by default. - fn fillInTreeView tv = - ( - theRoot = sceneview.tv.Nodes.add "WORLD" "WORLD" - rootNodes = for o in objects where o.parent == undefined collect o - sceneview.addChildren theRoot rootNodes - ) - - fn refresh = - ( - sceneview.tv.nodes.clear() - sceneview.fillInTreeView tv - sceneview.tv.topnode.expand() - ) - - fn getSelectedNode = - ( - try - ( - if selection[1] != undefined then - ( - --print selection[1].name - sceneview.tv.SelectedNode = (sceneview.tv.nodes.Find selection[1].name true)[1] - sceneview.tv.SelectedNode.EnsureVisible() - colorTest = dotNetClass "System.Drawing.Color" - sceneview.tv.selectednode.backColor = colorTest.FromArgb 255 221 221 221 - sceneview.tv.refresh() - ) - ) - catch -- for undo - ( - refresh() - if selection[1] != undefined then - ( - sceneview.tv.SelectedNode = (sceneview.tv.nodes.Find selection[1].name true)[1] - sceneview.tv.SelectedNode.EnsureVisible() - colorTest = dotNetClass "System.Drawing.Color" - sceneview.tv.selectednode.backColor = colorTest.FromArgb 255 221 221 221 - ) - ) - ) - - fn hideNode = - ( - if selection != undefined then - ( - for obj in selection do - ( - sceneview.tv.SelectedNode = (sceneview.tv.nodes.Find obj.name true)[1] - sceneview.tv.selectednode.checked = false - ) - ) - ) - - fn unhideNode = - ( - if selection != undefined then - ( - for obj in selection do - ( - sceneview.tv.SelectedNode = (sceneview.tv.nodes.Find obj.name true)[1] - sceneview.tv.selectednode.checked = true - ) - ) - ) - - dotNetControl tv "TreeView" width:290 height:565 align:#center - button layerM "Layer Manager" offset:[-9,0] Align:#left - label info " (X) + all (C/V) +- children" offset:[5,-22] - - on layerM pressed do - ( - macros.run "layers" "layermanager" - ) - - on tv Click arg do - ( - hitNode = tv.GetNodeAt (dotNetObject "System.Drawing.Point" arg.x arg.y) - if hitNode != undefined do - try(select hitNode.tag.value) catch(max select none) - ) - - on tv AfterCheck arg do - ( - try (arg.node.tag.value.isHidden = not arg.node.checked)catch() - ) - - on tv AfterLabelEdit arg do - ( - if arg.label != undefined then - ( - arg.node.tag.value.name = arg.label - ) - ) - - - on tv keyUp arg do - ( - --print arg.keyValue - case arg.keyValue of - ( - 67: tv.selectedNode.collapse() -- c key - 88: tv.expandAll() -- x key - 86: tv.selectedNode.ExpandAll() -- v key - 13: tv.selectedNode.beginEdit() -- enter key - 113: tv.selectedNode.beginEdit() -- F2 - 116: refresh() -- F5 - ) - ) - - fn OnClick sender args = - ( - --print sender.Text - case sender.Text of - ( - "Expand branches": if tv.selectedNode != undefined then tv.selectedNode.ExpandAll() - ) - ) - - on tv beforeSelect arg do - ( - colorTest = dotNetClass "System.Drawing.Color" - try (sceneview.tv.selectednode.backColor = colorTest.FromArgb 255 196 196 196) catch() - ) - - on tv nodeMouseClick arg do - ( - if arg.button == tv.mousebuttons.right then - ( - contextMenu = dotNetObject "System.Windows.Forms.ContextMenu" - contextMenu.MenuItems.Clear() - dotnet.addeventhandler (contextMenu.MenuItems.Add("Select all children")) "Click" OnClick - dotnet.addeventhandler (contextMenu.MenuItems.Add("Expand branches")) "Click" OnClick - pointTest = (dotNetObject "System.Drawing.Point" arg.x arg.y) - contextmenu.Show tv pointTest - ) - ) - - on sceneView open do - ( - initTreeView tv - fillInTreeView tv - tv.topnode.expand() - callbacks.addScript #nodeCreated "sceneView.refresh()" id:#upDateSceneView - callbacks.addScript #nodePostDelete "sceneView.refresh()" id:#upDateSceneView - callbacks.addScript #nodeRenamed "sceneView.refresh()" id:#upDateSceneView - callbacks.addScript #postNodesCloned "sceneView.refresh()" id:#upDateSceneView - callbacks.addScript #postMirrorNodes "sceneView.refresh()" id:#upDateSceneView - callbacks.addScript #selectionSetChanged "sceneView.getSelectedNode()" id:#upDateSceneView - callbacks.addScript #nodeHide "sceneView.hideNode()" id:#upDateSceneView - --callbacks.addScript #nodeUnhide "sceneView.unhideNode()" id:#upDateSceneView - callbacks.addScript #sceneUndo "sceneView.refresh()" id:#upDateSceneView - callbacks.addScript #sceneRedo "sceneView.refresh()" id:#upDateSceneView - ) - - on sceneView close do - ( - callbacks.removeScripts id:#upDateSceneView - ) - - on sceneView resized size do - ( - size1 = size as string - size2 = filterstring size1 "[]," - layerM.pos = [4, (sceneView.height - 26)] - info.pos = [100, (sceneView.height - 23)] - tv.height = ((size2[2] as float) - 35) - tv.width = ((size2[1] as float) - 10) - ) -) - -createDialog sceneView 300 600 style:#(#style_resizing, #style_titlebar, #style_border, #style_sysmenu) - diff --git a/Tools/maxscript/Startup/Macro_CrySkinTools.ms b/Tools/maxscript/Startup/Macro_CrySkinTools.ms deleted file mode 100644 index b2c1c77a46..0000000000 --- a/Tools/maxscript/Startup/Macro_CrySkinTools.ms +++ /dev/null @@ -1,992 +0,0 @@ --- --- This is a modified copy of ui\usermacros\Macro_SkinTools.mcr from 3DS MAX 2011 package. --- -/* - -Skin Operations Macro Script File - - Created: Aug 6 2000 - - Author : Peter Watje - Version: 3ds max 6 - - 12 dec 2003, Pierre-Felix Breton, - added product switcher: this macro file can be shared with all Discreet products - - -*/ ---*********************************************************************************************** --- MODIFY THIS AT YOUR OWN RISK --- - -fn getSkinOps = ( - try ( - if(crySkinOps.isCrySkin(modPanel.GetcurrentObject())) then - (crySkinOps) - else - (skinOps) - ) - catch ( - (skinOps) - ) -) - -MacroScript SkinLoopSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Loop Selection" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Loop Selection (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).loopSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinRingSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Ring Selection" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Ring Selection (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ringSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinGrowSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Grow Selection" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Grow Selection (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).growSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinShrinkSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Shrink Selection" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Shrink Selection (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).shrinkSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinSelectVerticesByBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Select Vertices By Bone" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Vertices By Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).selectVerticesByBone (modPanel.GetcurrentObject()) - ) -) - - - -MacroScript WeightTable_Dialog -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Weight Table Dialog" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Weight Table Dialog (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then - ( - ((getSkinOps()).isWeightTableOpen (modPanel.GetcurrentObject()) != 0) - ) - else - ( - false - ) - ) - - on closeDialogs do - ( - (getSkinOps()).closeWeightTable (modPanel.GetcurrentObject()) - ) - - on execute do - ( - (getSkinOps()).WeightTable (modPanel.GetcurrentObject()) - ) -) -MacroScript BlendWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Blend Weights" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Blend Weights (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).blendSelected (modPanel.GetcurrentObject()) - ) -) - -MacroScript RemoveZeroWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Remove Zero Weights" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Remove Zero Weights (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).RemoveZeroWeights (modPanel.GetcurrentObject()) - ) -) - -MacroScript WeightTool_Dialog -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Weight Tool Dialog" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Weight Tool Dialog (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then - ( - ((getSkinOps()).isWeightToolOpen (modPanel.GetcurrentObject()) != 0) - ) - else - ( - false - ) - ) - on closeDialogs do - ( - (getSkinOps()).closeWeightTool (modPanel.GetcurrentObject()) - ) - - on execute do - ( - (getSkinOps()).WeightTool (modPanel.GetcurrentObject()) - ) -) - -MacroScript SetWeight_00 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight To 0.0" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight To 0.0 (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.0 - ) -) - -MacroScript SetWeight_01 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight To 0.10" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight To 0.10 (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.1 - ) -) - -MacroScript SetWeight_25 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight To 0.25" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight To 0.25 (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.25 - ) -) - -MacroScript SetWeight_50 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight To 0.50" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight To 0.5 (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.5 - ) -) - -MacroScript SetWeight_75 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight To 0.75" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight To 0.75 (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.75 - ) -) - -MacroScript SetWeight_90 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight To 0.90" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight To 0.90 (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.90 - ) -) - -MacroScript SetWeight_100 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight To 1.0" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight To 1.0 (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 1.0 - ) -) - -MacroScript SetWeight_Custom -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Set Weight Custom" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Set Weight Custom (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - tmod = modPanel.GetcurrentObject() - v = tmod.weightTool_weight - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) v - ) -) - -MacroScript AddWeight -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Add Weight" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Add Weight (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).AddWeight (modPanel.GetcurrentObject()) 0.05 - ) -) - -MacroScript SubtractWeight -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Subtract Weight" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Subtract Weight (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).AddWeight (modPanel.GetcurrentObject()) -0.05 - ) -) - -MacroScript ScaleWeight_Custom -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Scale Weight Custom" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Scale Weight Custom (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - tmod = modPanel.GetcurrentObject() - v = tmod.weightTool_scale - (getSkinOps()).ScaleWeight (modPanel.GetcurrentObject()) v - ) -) - -MacroScript ScaleWeight_Up -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Scale Weight Up" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Scale Weight Up (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ScaleWeight (modPanel.GetcurrentObject()) 1.05 - ) -) - -MacroScript ScaleWeight_Down -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Scale Weight Down" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Scale Weight Down (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ScaleWeight (modPanel.GetcurrentObject()) 0.95 - ) -) - -MacroScript CopyWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Copy Weights" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Copy Weights (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).CopyWeights (modPanel.GetcurrentObject()) - ) -) - -MacroScript PasteWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Paste Weights" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Paste Weights (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).PasteWeights (modPanel.GetcurrentObject()) - ) -) - - -MacroScript PasteWeightsByPos -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Paste Weights By Pos" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Paste Weights By Pos(Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - tmod = modPanel.GetcurrentObject() - v = tmod.weightTool_tolerance - (getSkinOps()).pasteWeightsByPos (modPanel.GetcurrentObject()) v - ) -) - - -MacroScript selectParent -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Parent Bone" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Parent Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectParent (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectChild -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Child Bone" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Child Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectChild (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectNextSibling -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Sibling Next" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Next Sibling Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectNextSibling (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectPreviousSibling -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Sibling Previous" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Previous Sibling Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectPreviousSibling (modPanel.GetcurrentObject()) - ) -) - - - - -MacroScript backFaceCullVertices -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Backface Cull Vertices" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Backface Cull Vertices (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).backfacecull - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).backfacecull then - (modPanel.GetcurrentObject()).backfacecull = false - else (modPanel.GetcurrentObject()).backfacecull = true - ) -) - - -MacroScript AddBonesFromView -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Add Bones" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Add Bones (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - pushprompt "-- Click object to add as Bone" - (getSkinOps()).AddBoneFromViewStart (modPanel.GetcurrentObject()) - ) -) - -MacroScript multiRemove -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Remove Bones" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Remove Multiple Bones (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).MultiRemove (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectPrevious -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Previous Bone" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Previous Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectPreviousBone (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectNext -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Next Bone" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Next Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectNextBone (modPanel.GetcurrentObject()) - ) -) - -MacroScript zoomToBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Zoom To Bone" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Zoom To Selected Bone (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ZoomToBone (modPanel.GetcurrentObject()) FALSE - ) -) - -MacroScript zoomToGizmo -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Zoom To Gizmo" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Zoom To Selected Gizmo (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ZoomToGizmo (modPanel.GetcurrentObject()) FALSE - ) -) - - -MacroScript selectEndPoint -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Select End Point" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select End Point (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on Execute do - ( - (getSkinOps()).SelectEndPoint (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectStartPoint -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Select Start Point" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Start Point (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on Execute do - ( - (getSkinOps()).SelectStartPoint (modPanel.GetcurrentObject()) - ) -) - -MacroScript filterVertices -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Select Vertices" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Filter Vertices (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).filter_vertices - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).filter_vertices then - (modPanel.GetcurrentObject()).filter_vertices = FALSE - else (modPanel.GetcurrentObject()).filter_vertices = TRUE - ) -) - -MacroScript filterEnvelopes -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Select Cross Sections" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Filter Cross Sections (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).filter_cross_sections - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).filter_cross_sections then - (modPanel.GetcurrentObject()).filter_cross_sections = FALSE - else (modPanel.GetcurrentObject()).filter_cross_sections = TRUE - ) -) - -MacroScript filterCrossSections -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Select Envelopes" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Filter Envelopes (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).filter_envelopes - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).filter_envelopes then - (modPanel.GetcurrentObject()).filter_envelopes = false - else (modPanel.GetcurrentObject()).filter_envelopes = true - ) -) - -MacroScript excludeVerts -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Exclude Verts" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Exclude Verts (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on Execute do - ( - (getSkinOps()).ButtonExclude (modPanel.GetcurrentObject()) - ) -) - -MacroScript includeVerts -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Include Verts" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Include Verts (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on Execute do - ( - (getSkinOps()).ButtonInclude (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectIncludeVerts -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Select Excluded Verts" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Select Excluded Verts (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).ButtonSelectExcluded (modPanel.GetcurrentObject()) - ) -) - --- Added August 27 2000 Fred Ruff - -MacroScript CopySelectedBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Copy Envelope" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Copy Envelope (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).copySelectedBone (modPanel.GetcurrentObject()) - ) -) -MacroScript PasteToSelectedBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Paste Envelope" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Paste Envelope (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).PasteToSelectedBone (modPanel.GetcurrentObject()) - ) -) -MacroScript PasteToAllBones -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Paste to All Envelope" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Paste To All Envelopes (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).PasteToAllBones (modPanel.GetcurrentObject()) - ) -) -MacroScript AddCrossSection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Add Cross Section" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Add Cross Section (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).ButtonAddCrossSection (modPanel.GetcurrentObject()) - ) -) -MacroScript RemoveCrossSection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Remove Cross Section" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Remove Cross Section (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).ButtonRemoveCrossSection (modPanel.GetcurrentObject()) - ) -) -MacroScript DrawEnvelopeOnTop -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Envelope On Top" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Draw Envelope On Top (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).envelopesAlwaysOnTop - ) - else - ( - false - ) - ) - - on execute do - ( - if Selection[1].modifiers[#Skin].envelopesAlwaysOnTop then - Selection[1].modifiers[#Skin].envelopesAlwaysOnTop = FALSE - else Selection[1].modifiers[#Skin].envelopesAlwaysOnTop = TRUE - ) -) - -MacroScript DrawCrossSectionsOnTop -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"CrossSections On Top" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Draw CrossSections On Top (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then - ( - (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop - ) - else - ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop then - (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop = false - else (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop = true - ) -) - -MacroScript GizmoResetRotationPlane -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:"Gizmo Reset Reset Rotation Plane" -Category:"Skin Modifier" -internalCategory:"Skin Modifier" -Tooltip:"Gizmo Reset Reset Rotation Plane (Skin)" --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).GizmoResetRotationPlane (modPanel.GetcurrentObject()) - ) -) diff --git a/Tools/maxscript/Startup/Macro_CrySkinTools_2012.ms b/Tools/maxscript/Startup/Macro_CrySkinTools_2012.ms deleted file mode 100644 index 9865e50534..0000000000 --- a/Tools/maxscript/Startup/Macro_CrySkinTools_2012.ms +++ /dev/null @@ -1,992 +0,0 @@ --- --- This is a modified copy of ui\usermacros\Macro_SkinTools.mcr from 3DS MAX 2012 package. --- -/* - -Skin Operations Macro Script File - - Created: Aug 6 2000 - - Author : Peter Watje - Version: 3ds max 6 - - 12 dec 2003, Pierre-Felix Breton, - added product switcher: this macro file can be shared with all Discreet products - - -*/ ---*********************************************************************************************** --- MODIFY THIS AT YOUR OWN RISK --- - -fn getSkinOps = ( - try ( - if(crySkinOps.isCrySkin(modPanel.GetcurrentObject())) then - (crySkinOps) - else - (skinOps) - ) - catch ( - (skinOps) - ) -) - -MacroScript SkinLoopSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SKINLOOPSELECTION_BUTTONTEXT~ -Category:~SKINLOOPSELECTION_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SKINLOOPSELECTION_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).loopSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinRingSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SKINRINGSELECTION_BUTTONTEXT~ -Category:~SKINRINGSELECTION_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SKINRINGSELECTION_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ringSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinGrowSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SKINGROWSELECTION_BUTTONTEXT~ -Category:~SKINGROWSELECTION_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SKINGROWSELECTION_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).growSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinShrinkSelection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SKINSHRINKSELECTION_BUTTONTEXT~ -Category:~SKINSHRINKSELECTION_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SKINSHRINKSELECTION_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).shrinkSelection (modPanel.GetcurrentObject()) - ) -) - -MacroScript SkinSelectVerticesByBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SKINSELECTVERTICESBYBONE_BUTTONTEXT~ -Category:~SKINSELECTVERTICESBYBONE_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SKINSELECTVERTICESBYBONE_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).selectVerticesByBone (modPanel.GetcurrentObject()) - ) -) - - - -MacroScript WeightTable_Dialog -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~WEIGHTTABLE_DIALOG_BUTTONTEXT~ -Category:~WEIGHTTABLE_DIALOG_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~WEIGHTTABLE_DIALOG_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then - ( - ((getSkinOps()).isWeightTableOpen (modPanel.GetcurrentObject()) != 0) - ) - else - ( - false - ) - ) - - on closeDialogs do - ( - (getSkinOps()).closeWeightTable (modPanel.GetcurrentObject()) - ) - - on execute do - ( - (getSkinOps()).WeightTable (modPanel.GetcurrentObject()) - ) -) -MacroScript BlendWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~BLENDWEIGHTS_BUTTONTEXT~ -Category:~BLENDWEIGHTS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~BLENDWEIGHTS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).blendSelected (modPanel.GetcurrentObject()) - ) -) - -MacroScript RemoveZeroWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~REMOVEZEROWEIGHTS_BUTTONTEXT~ -Category:~REMOVEZEROWEIGHTS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~REMOVEZEROWEIGHTS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).RemoveZeroWeights (modPanel.GetcurrentObject()) - ) -) - -MacroScript WeightTool_Dialog -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~WEIGHTTOOL_DIALOG_BUTTONTEXT~ -Category:~WEIGHTTOOL_DIALOG_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~WEIGHTTOOL_DIALOG_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then - ( - ((getSkinOps()).isWeightToolOpen (modPanel.GetcurrentObject()) != 0) - ) - else - ( - false - ) - ) - on closeDialogs do - ( - (getSkinOps()).closeWeightTool (modPanel.GetcurrentObject()) - ) - - on execute do - ( - (getSkinOps()).WeightTool (modPanel.GetcurrentObject()) - ) -) - -MacroScript SetWeight_00 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_00_BUTTONTEXT~ -Category:~SETWEIGHT_00_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_00_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.0 - ) -) - -MacroScript SetWeight_01 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_01_BUTTONTEXT~ -Category:~SETWEIGHT_01_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_01_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.1 - ) -) - -MacroScript SetWeight_25 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_25_BUTTONTEXT~ -Category:~SETWEIGHT_25_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_25_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.25 - ) -) - -MacroScript SetWeight_50 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_50_BUTTONTEXT~ -Category:~SETWEIGHT_50_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_50_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.5 - ) -) - -MacroScript SetWeight_75 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_75_BUTTONTEXT~ -Category:~SETWEIGHT_75_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_75_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.75 - ) -) - -MacroScript SetWeight_90 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_90_BUTTONTEXT~ -Category:~SETWEIGHT_90_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_90_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 0.90 - ) -) - -MacroScript SetWeight_100 -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_100_BUTTONTEXT~ -Category:~SETWEIGHT_100_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_100_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) 1.0 - ) -) - -MacroScript SetWeight_Custom -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SETWEIGHT_CUSTOM_BUTTONTEXT~ -Category:~SETWEIGHT_CUSTOM_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SETWEIGHT_CUSTOM_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - tmod = modPanel.GetcurrentObject() - v = tmod.weightTool_weight - (getSkinOps()).SetWeight (modPanel.GetcurrentObject()) v - ) -) - -MacroScript AddWeight -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~ADDWEIGHT_BUTTONTEXT~ -Category:~ADDWEIGHT_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~ADDWEIGHT_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).AddWeight (modPanel.GetcurrentObject()) 0.05 - ) -) - -MacroScript SubtractWeight -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SUBTRACTWEIGHT_BUTTONTEXT~ -Category:~SUBTRACTWEIGHT_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SUBTRACTWEIGHT_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).AddWeight (modPanel.GetcurrentObject()) -0.05 - ) -) - -MacroScript ScaleWeight_Custom -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SCALEWEIGHT_CUSTOM_BUTTONTEXT~ -Category:~SCALEWEIGHT_CUSTOM_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SCALEWEIGHT_CUSTOM_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - tmod = modPanel.GetcurrentObject() - v = tmod.weightTool_scale - (getSkinOps()).ScaleWeight (modPanel.GetcurrentObject()) v - ) -) - -MacroScript ScaleWeight_Up -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SCALEWEIGHT_UP_BUTTONTEXT~ -Category:~SCALEWEIGHT_UP_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SCALEWEIGHT_UP_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ScaleWeight (modPanel.GetcurrentObject()) 1.05 - ) -) - -MacroScript ScaleWeight_Down -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SCALEWEIGHT_DOWN_BUTTONTEXT~ -Category:~SCALEWEIGHT_DOWN_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SCALEWEIGHT_DOWN_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ScaleWeight (modPanel.GetcurrentObject()) 0.95 - ) -) - -MacroScript CopyWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~COPYWEIGHTS_BUTTONTEXT~ -Category:~COPYWEIGHTS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~COPYWEIGHTS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).CopyWeights (modPanel.GetcurrentObject()) - ) -) - -MacroScript PasteWeights -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~PASTEWEIGHTS_BUTTONTEXT~ -Category:~PASTEWEIGHTS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~PASTEWEIGHTS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).PasteWeights (modPanel.GetcurrentObject()) - ) -) - - -MacroScript PasteWeightsByPos -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~PASTEWEIGHTSBYPOS_BUTTONTEXT~ -Category:~PASTEWEIGHTSBYPOS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~PASTEWEIGHTSBYPOS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - tmod = modPanel.GetcurrentObject() - v = tmod.weightTool_tolerance - (getSkinOps()).pasteWeightsByPos (modPanel.GetcurrentObject()) v - ) -) - - -MacroScript selectParent -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTPARENT_BUTTONTEXT~ -Category:~SELECTPARENT_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTPARENT_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectParent (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectChild -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTCHILD_BUTTONTEXT~ -Category:~SELECTCHILD_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTCHILD_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectChild (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectNextSibling -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTNEXTSIBLING_BUTTONTEXT~ -Category:~SELECTNEXTSIBLING_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTNEXTSIBLING_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectNextSibling (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectPreviousSibling -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTPREVIOUSSIBLING_BUTTONTEXT~ -Category:~SELECTPREVIOUSSIBLING_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTPREVIOUSSIBLING_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectPreviousSibling (modPanel.GetcurrentObject()) - ) -) - - - - -MacroScript backFaceCullVertices -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~BACKFACECULLVERTICES_BUTTONTEXT~ -Category:~BACKFACECULLVERTICES_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~BACKFACECULLVERTICES_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).backfacecull - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).backfacecull then - (modPanel.GetcurrentObject()).backfacecull = false - else (modPanel.GetcurrentObject()).backfacecull = true - ) -) - - -MacroScript AddBonesFromView -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~ADDBONESFROMVIEW_BUTTONTEXT~ -Category:~ADDBONESFROMVIEW_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~ADDBONESFROMVIEW_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - pushprompt ~ADDBONESFROMVIEW_PUSHPROMPT_CAPTION~ - (getSkinOps()).AddBoneFromViewStart (modPanel.GetcurrentObject()) - ) -) - -MacroScript multiRemove -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~MULTIREMOVE_BUTTONTEXT~ -Category:~MULTIREMOVE_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~MULTIREMOVE_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).MultiRemove (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectPrevious -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTPREVIOUS_BUTTONTEXT~ -Category:~SELECTPREVIOUS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTPREVIOUS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectPreviousBone (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectNext -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTNEXT_BUTTONTEXT~ -Category:~SELECTNEXT_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTNEXT_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).SelectNextBone (modPanel.GetcurrentObject()) - ) -) - -MacroScript zoomToBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~ZOOMTOBONE_BUTTONTEXT~ -Category:~ZOOMTOBONE_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~ZOOMTOBONE_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ZoomToBone (modPanel.GetcurrentObject()) FALSE - ) -) - -MacroScript zoomToGizmo -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~ZOOMTOGIZMO_BUTTONTEXT~ -Category:~ZOOMTOGIZMO_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~ZOOMTOGIZMO_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).ZoomToGizmo (modPanel.GetcurrentObject()) FALSE - ) -) - - -MacroScript selectEndPoint -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTENDPOINT_BUTTONTEXT~ -Category:~SELECTENDPOINT_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTENDPOINT_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on Execute do - ( - (getSkinOps()).SelectEndPoint (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectStartPoint -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTSTARTPOINT_BUTTONTEXT~ -Category:~SELECTSTARTPOINT_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTSTARTPOINT_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on Execute do - ( - (getSkinOps()).SelectStartPoint (modPanel.GetcurrentObject()) - ) -) - -MacroScript filterVertices -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~FILTERVERTICES_BUTTONTEXT~ -Category:~FILTERVERTICES_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~FILTERVERTICES_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).filter_vertices - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).filter_vertices then - (modPanel.GetcurrentObject()).filter_vertices = FALSE - else (modPanel.GetcurrentObject()).filter_vertices = TRUE - ) -) - -MacroScript filterEnvelopes -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~FILTERENVELOPES_BUTTONTEXT~ -Category:~FILTERENVELOPES_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~FILTERENVELOPES_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).filter_cross_sections - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).filter_cross_sections then - (modPanel.GetcurrentObject()).filter_cross_sections = FALSE - else (modPanel.GetcurrentObject()).filter_cross_sections = TRUE - ) -) - -MacroScript filterCrossSections -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~FILTERCROSSSECTIONS_BUTTONTEXT~ -Category:~FILTERCROSSSECTIONS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~FILTERCROSSSECTIONS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).filter_envelopes - ) - else ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).filter_envelopes then - (modPanel.GetcurrentObject()).filter_envelopes = false - else (modPanel.GetcurrentObject()).filter_envelopes = true - ) -) - -MacroScript excludeVerts -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~EXCLUDEVERTS_BUTTONTEXT~ -Category:~EXCLUDEVERTS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~EXCLUDEVERTS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on Execute do - ( - (getSkinOps()).ButtonExclude (modPanel.GetcurrentObject()) - ) -) - -MacroScript includeVerts -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~INCLUDEVERTS_BUTTONTEXT~ -Category:~INCLUDEVERTS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~INCLUDEVERTS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on Execute do - ( - (getSkinOps()).ButtonInclude (modPanel.GetcurrentObject()) - ) -) - -MacroScript selectIncludeVerts -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~SELECTINCLUDEVERTS_BUTTONTEXT~ -Category:~SELECTINCLUDEVERTS_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~SELECTINCLUDEVERTS_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).ButtonSelectExcluded (modPanel.GetcurrentObject()) - ) -) - --- Added August 27 2000 Fred Ruff - -MacroScript CopySelectedBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~COPYSELECTEDBONE_BUTTONTEXT~ -Category:~COPYSELECTEDBONE_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~COPYSELECTEDBONE_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).copySelectedBone (modPanel.GetcurrentObject()) - ) -) -MacroScript PasteToSelectedBone -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~PASTETOSELECTEDBONE_BUTTONTEXT~ -Category:~PASTETOSELECTEDBONE_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~PASTETOSELECTEDBONE_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).PasteToSelectedBone (modPanel.GetcurrentObject()) - ) -) -MacroScript PasteToAllBones -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~PASTETOALLBONES_BUTTONTEXT~ -Category:~PASTETOALLBONES_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~PASTETOALLBONES_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).PasteToAllBones (modPanel.GetcurrentObject()) - ) -) -MacroScript AddCrossSection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~ADDCROSSSECTION_BUTTONTEXT~ -Category:~ADDCROSSSECTION_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~ADDCROSSSECTION_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).ButtonAddCrossSection (modPanel.GetcurrentObject()) - ) -) -MacroScript RemoveCrossSection -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~REMOVECROSSSECTION_BUTTONTEXT~ -Category:~REMOVECROSSSECTION_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~REMOVECROSSSECTION_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - - on execute do - ( - (getSkinOps()).ButtonRemoveCrossSection (modPanel.GetcurrentObject()) - ) -) -MacroScript DrawEnvelopeOnTop -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~DRAWENVELOPEONTOP_BUTTONTEXT~ -Category:~DRAWENVELOPEONTOP_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~DRAWENVELOPEONTOP_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then ( - (modPanel.GetcurrentObject()).envelopesAlwaysOnTop - ) - else - ( - false - ) - ) - - on execute do - ( - if Selection[1].modifiers[#Skin].envelopesAlwaysOnTop then - Selection[1].modifiers[#Skin].envelopesAlwaysOnTop = FALSE - else Selection[1].modifiers[#Skin].envelopesAlwaysOnTop = TRUE - ) -) - -MacroScript DrawCrossSectionsOnTop -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~DRAWCROSSSECTIONSONTOP_BUTTONTEXT~ -Category:~DRAWCROSSSECTIONSONTOP_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~DRAWCROSSSECTIONSONTOP_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ((classof(modPanel.GetcurrentObject())) == Skin) - on isChecked return - ( - if (classof(modPanel.GetcurrentObject())) == Skin then - ( - (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop - ) - else - ( - false - ) - ) - - on execute do - ( - if (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop then - (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop = false - else (modPanel.GetcurrentObject()).crossSectionsAlwaysOnTop = true - ) -) - -MacroScript GizmoResetRotationPlane -enabledIn:#("max") --pfb: 2003.12.12 added product switch -ButtonText:~GIZMORESETROTATIONPLANE_BUTTONTEXT~ -Category:~GIZMORESETROTATIONPLANE_CATEGORY~ -internalCategory:"Skin Modifier" -Tooltip:~GIZMORESETROTATIONPLANE_TOOLTIP~ --- Needs Icon -( - on isVisible return ( (classof(modPanel.GetcurrentObject())) == Skin) - on isEnabled return ( (classof(modPanel.GetcurrentObject())) == Skin) - on execute do - ( - (getSkinOps()).GizmoResetRotationPlane (modPanel.GetcurrentObject()) - ) -) diff --git a/Tools/maxscript/UpdateTools.ms b/Tools/maxscript/UpdateTools.ms deleted file mode 100644 index d1be3de78a..0000000000 --- a/Tools/maxscript/UpdateTools.ms +++ /dev/null @@ -1,244 +0,0 @@ -------------------------------------------------------------------------------- --- UpdateTools.ms --- Version 2.0 --- Updates local CryTools files -------------------------------------------------------------------------------- - -version_ = "CryToolsUpdate 2.2" - -------------------------------------------------------------------------------- --- Get The Build Dirs -------------------------------------------------------------------------------- - --- Write Latest Builds on S:\_Builds to Local File -print "Retrieving list of latest builds from \\\\Storage\\builds" - -DOScommand ("DIR \\\\storage\\builds\\procedurally_generated_builds\\ /B /O-D > \"" + sysInfo.tempDir + "cry_temp\\latest_build_crytoolss.txt\"") - -if doesfileexist "\\\\storage\\builds\\procedurally_generated_builds\\" == false then -( - messageBox "Cannot locate \\\\Storage\\builds\\procedurally_generated_builds\nYou may need to contact SYSTEM_SUPPORT." title: "S Drive not found!" - return undefined -) - --- Gets the latest build number and build name -if crytools.existFile (sysInfo.tempDir + "cry_temp\\latest_build_crytoolss.txt") != false then - ( - if doesfileexist "\\\\storage\\builds\\procedurally_generated_builds" != true then - ( - messagebox "Cannot find \\\\storage\\builds\\procedurally_generated_builds\\" - return undefined - ) - latest_build_crytools_list = openFile (sysInfo.tempDir + "cry_temp\\latest_build_crytoolss.txt") - crytools.latest_build = (readline latest_build_crytools_list) - if crytools.latest_build == "TempBuildCopy" then - ( - skipToNextLine latest_build_crytools_list - crytools.latest_build = (readline latest_build_crytools_list) - ) - buildnumberArray = filterstring crytools.latest_build "()" - crytools.latestbuildnumber = buildnumberArray[2] - close latest_build_crytools_list - ) - --- Get the local build number -print crytools.BuildPathFull -if crytools.existfile ((crytools.BuildPathFull + "Code_Changes.txt")) == false then - ( - messageBox "Code_Changes.txt cannot be found in your build directory, have you removed it?" title: "Error!" - ) -else - ( - perf_path = (crytools.BuildPathFull + "Code_Changes.txt") - perf_changes = openFile perf_path - skipToString perf_changes "in Build " - local_build_line = (readLine perf_changes) - local_buildArray = (filterString local_build_line "-") - crytools.localBuildNumber = local_buildArray[1] - ) - --- Get The Project Name -buildpatharray2 = filterstring crytools.BuildPathFull "\\" -crytools.project_name = buildpatharray2[2] -print (crytools.project_name + " is set as current project.") - --- Check For Rollback -rollback_check = openFile (sysInfo.tempDir + "cry_temp\\crytools.rollback_status.ini") -if crytools.rollback_status == undefined then -( -crytools.rollback_status = "false" -output_rollbackINI = createfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini") -format crytools.rollback_status to: output_rollbackINI -close output_rollbackINI -) -if rollback_check != undefined then -( -crytools.rollback_status = (readline rollback_check) -) - -------------------------------------------------------------------------------- --- UpdateUI -------------------------------------------------------------------------------- - -print (sysInfo.username + " is requesting an update.") -rollout checkForUpdate version_ -( -label tools_version "" align:#center -button update_btn " Check/Install Updates From Your Latest Build" -button update_btnAB "Retrieve Latest Tools\Sync" -checkbox BuildOn "Current Build" offset:[0,-4] -checkBox PerfOn "PerForce" offset:[84,-20] checked:true -checkbox HTTPOn "CryHTTP" offset:[151,-20] -checkbutton rollback_exporter "Rollback Exporter" offset:[-55,0] -button uninstall_tools "Uninstall CryTools" offset:[55,-26] -label current_exportTXT "LOCAL BUILD: Cannot find Code_Changes.txt" align:#center - -on checkForUpdate open do -( -current_exportTXT.text = ("LOCAL BUILD: " + crytools.localBuildNumber + " LATEST BUILD: " + crytools.latestbuildnumber) -tools_version.text = version_ -if crytools.rollback_status == "true" do (rollback_exporter.checked = true) -if crytools.rollback_status == "false" do (rollback_exporter.checked = false) -) - -on update_btn pressed do -( -filein (crytools.BuildPathFull + "Tools\\maxscript\\AddCryTools.ms") -current_exportTXT.text = ("LOCAL BUILD: " + crytools.localBuildNumber + " LATEST BUILD: " + crytools.latestbuildnumber) -print ("Build updated from " + crytools.BuildPathFull) ---destroyDialog checkForUpdate -) - --- Get Latest From AB and Latest Build -------------------------------------------------------------------------------- -on update_btnAB pressed do -( - try - ( - if crytools.BuildPathFull == "J:\\Game04\\" then - ( - messagebox "You are on Game04" - return undefined - ) - -- AB Stuff - if HTTPOn.checked == true then - ( - rollout httpSock "httpSock" width:0 height:0 - ( - activeXControl port "Microsoft.XMLHTTP" setupEvents:false releaseOnClose:false - ); - createDialog httpSock pos:[-100,-100]; - destroyDialog httpSock; - - httpSock.port.open "GET" "http://www.crytek.com/index.htm" false; - httpSock.port.setrequestheader "If-Modified-Since" "Sat, 1 Jan 1900 00:00:00 GMT"; - httpSock.port.send(); - - print (httpSock.port.responsetext); - ) - - -- P4 stuff - if perfOn.checked == true then - ( - p4Update = ("p4 sync " + crytools.BuildPathFull + "Tools\...") - DOScommand p4Update - ) - - if BuildOn.checked == true then - ( - -- Latest Build Stuff - rollback_check = openFile (sysInfo.tempDir + "cry_temp\\crytools.rollback_status.ini") - if rollback_check == undefined then (crytools.rollback_status = "false") - crytools.rollback_status = "false" - latestCryExport = (crytools.md5 ("\\\\Storage\\builds\\" + crytools.latest_build + "\\Tools\\CryExport8.dlu")) - if crytools.md5 (crytools.maxDirTxt + "plugins\\CryExport8.dlu") != latestCryExport then - ( - if crytools.existfile ("\\\\storage\\builds\\" + crytools.latest_build + "\\Tools\\CryExport8.dlu") == false then - ( - messageBox ("There is no exporter on the build server in the latest folder [" + crytools.latest_build + "]") title: "No Exporter Found!" - ) - else - ( - messageBox ("There is a new exporter available in build " + crytools.latestbuildnumber) title: "New Exporter Found!" - DOScommand (("copy /Y \\\\storage\\builds\\" + crytools.latest_build + "\\Tools\\CryExport8.dlu ") + (crytools.BuildPathFull + "Tools\\")) - ) - ) - ) -) - catch - ( - messageBox "Either cannot locate the build server [\\\\Storage\\], or you do not have crytools.alienBrain correctly installed." title: "Something is wrong!" - ) - -messageBox ("CryTools has checked Build [" + crytools.latestbuildnumber + "] for updates.\nPlease click the \"Check/Install Updates From Your Latest Build\" button to install any updates it found.") title: ("Checked Build \\Tools (" + localTime + ") - Checked Plugins From Build #" + crytools.latestbuildnumber) -) - --- Rollback Exporter -------------------------------------------------------------------------------- -on rollback_exporter changed state do - ( - try - if (rollback_exporter.checked == true) then - ( - crytools.rollback_status = "true" - DOScommand ("mkdir \"" + sysInfo.tempDir + "cry_temp\\bad\\\"") - DOScommand ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\CryExport8.dlu\"") + " " + (sysInfo.tempDir + "cry_temp\\bad\\")) - DOScommand ("move /Y " + ("\"" +sysInfo.tempDir + "cry_temp\\CryExport8.dlu\"") + " " + (crytools.maxDirTxt + "plugins\\")) - print "CryExport8.dlu has been rolled back to the previous version." - output_rollbackINI = openfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini") mode:"w" - format crytools.rollback_status to: output_rollbackINI - close output_rollbackINI - - messageBox "CryExport8.dlu has been rolled back to the previous version.\nTo get a newer exporter later you must click \"Get Latest Tools From crytools.alienBrain/Current Build\", or update your build." title: "CryExport8.dlu Rolled Back!" - ) - else - ( - crytools.rollback_status = "false" - output_rollbackINI = openfile (sysInfo.tempDir+ "\\cry_temp\\crytools.rollback_status.ini") mode:"w" - format crytools.rollback_status to: output_rollbackINI - close output_rollbackINI - messageBox "You are no longer in rollback mode.\nTo get a newer exporter later you must click \"Get Latest Tools From crytools.alienBrain/Current Build\", or update your build." title: "CryExport8.dlu No Longer Rolled Back!" - ) - catch - ( - messageBox "Rollback error 1442." title:"Error!" - return undefined - ) - ) - - --- Uninstall -------------------------------------------------------------------------------- - -on uninstall_tools pressed do -( -rollout areYouSure "CryTools Uninstallation" -( -label doyouwant "Are you sure you want to completely remove CryTools?" align:#center -button uninstallNow "Yes" pos:[110,25] -button donotuninstall "No" pos:[150,25] -on donotuninstall pressed do -( -destroyDialog areYouSure -) -on uninstallNow pressed do -( -subMenu = menuMan.findMenu "CryTools" -menuMan.unRegisterMenu subMenu -deleteFile "$UI\\MacroScripts\\CryTools-UpdateTools.mcr" -deleteFile "$UI\\MacroScripts\\CryTools-CryRigging.mcr" -deleteFile "$UI\\MacroScripts\\CryTools-CryMorphManager.mcr" -deleteFile "$UI\\MacroScripts\\CryTools-CryAnimation.mcr" -crytools.maxDirTxt = (getdir #maxroot) -doscommand ("attrib -r \"" + crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms\"") -doscommand ("del \"" + crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms\"") -print (sysInfo.username + " has uninstalled CryTools.") -destroyDialog areYouSure -destroyDialog checkForUpdate -messageBox ("CryTools has been uninstalled. CryExport8.dlu is still installed, " + "sorry " + sysInfo.username) title: "Uninstallation complete!" -) -) -createDialog areYouSure 300 60 bgcolor:black fgcolor:white -) -) -createDialog checkForUpdate 250 137 bgcolor:black fgcolor:white \ No newline at end of file diff --git a/Tools/maxscript/bipSelect/alt_weapon_bone01.gif b/Tools/maxscript/bipSelect/alt_weapon_bone01.gif deleted file mode 100644 index dbd2d0ff2b..0000000000 --- a/Tools/maxscript/bipSelect/alt_weapon_bone01.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ea367bc6f5d4f9f3331c57229ecfaa15c4ff3edddcba1618889d39f7bc00f02 -size 17361 diff --git a/Tools/maxscript/bipSelect/bip.gif b/Tools/maxscript/bipSelect/bip.gif deleted file mode 100644 index 49d25df64e..0000000000 --- a/Tools/maxscript/bipSelect/bip.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1963f8897dae90853082dbb6961cc916eef0bf3b3dee4759d964c8010496686 -size 17124 diff --git a/Tools/maxscript/bipSelect/bip01.gif b/Tools/maxscript/bipSelect/bip01.gif deleted file mode 100644 index e7bc5fa89b..0000000000 --- a/Tools/maxscript/bipSelect/bip01.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3679794cce0eefa383c495b8eac5573e3040f2e256770c3aab78d429cb77a801 -size 17249 diff --git a/Tools/maxscript/bipSelect/bip01_head.gif b/Tools/maxscript/bipSelect/bip01_head.gif deleted file mode 100644 index 7b48da01f2..0000000000 --- a/Tools/maxscript/bipSelect/bip01_head.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9da74c3e57d522f866e3e3f77a22b1075a5e7d5f7e7616f8514ccab5f46b7926 -size 17259 diff --git a/Tools/maxscript/bipSelect/bip01_l_calf.gif b/Tools/maxscript/bipSelect/bip01_l_calf.gif deleted file mode 100644 index aede71287c..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_calf.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1dab772dfacb5dcc9f342e4e6d38ff1816f0a337a882174162d6312a38f117fa -size 17330 diff --git a/Tools/maxscript/bipSelect/bip01_l_clavicular_deltoid.gif b/Tools/maxscript/bipSelect/bip01_l_clavicular_deltoid.gif deleted file mode 100644 index 2254d45532..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_clavicular_deltoid.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fa2f8345128ad353ea1163ec6fd09217cfca657b27680f5e74cbec24e62be45 -size 17407 diff --git a/Tools/maxscript/bipSelect/bip01_l_foot.gif b/Tools/maxscript/bipSelect/bip01_l_foot.gif deleted file mode 100644 index 234992bf03..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_foot.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:955089a9c5f018ca1f9ab2077c1ca9e5b8f6d6cb470b06916375adb41fe2255a -size 17293 diff --git a/Tools/maxscript/bipSelect/bip01_l_forearm.gif b/Tools/maxscript/bipSelect/bip01_l_forearm.gif deleted file mode 100644 index 78bbd1a5b1..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_forearm.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e05dc8a8f2aeec820daa6d68f2cb2920104e30ad4a478a4f223c383aaabc469f -size 17330 diff --git a/Tools/maxscript/bipSelect/bip01_l_hand.gif b/Tools/maxscript/bipSelect/bip01_l_hand.gif deleted file mode 100644 index 18d1d6cb7e..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_hand.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e477bc06b3e189ca7033fa4a1b4ee53b13069b5b0e3237a1df3b360c8f375e0 -size 17332 diff --git a/Tools/maxscript/bipSelect/bip01_l_knee.gif b/Tools/maxscript/bipSelect/bip01_l_knee.gif deleted file mode 100644 index 1f2f7fffa0..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_knee.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf9293599559578b0e0573b727abd7489c21558854e4eca2fee6937694d7f8ad -size 17476 diff --git a/Tools/maxscript/bipSelect/bip01_l_thigh.gif b/Tools/maxscript/bipSelect/bip01_l_thigh.gif deleted file mode 100644 index bf5e059147..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_thigh.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5479f540088fc5b71e4e63ed106cc88a9c91a32d4bc1bc47d9445cbe7ec2a51 -size 17608 diff --git a/Tools/maxscript/bipSelect/bip01_l_upperarm.gif b/Tools/maxscript/bipSelect/bip01_l_upperarm.gif deleted file mode 100644 index 3969c49016..0000000000 --- a/Tools/maxscript/bipSelect/bip01_l_upperarm.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b73a7b502c67cd8d387aded0949563aa08003da1a23b769bb86e0c2588d32498 -size 17346 diff --git a/Tools/maxscript/bipSelect/bip01_pelvis.gif b/Tools/maxscript/bipSelect/bip01_pelvis.gif deleted file mode 100644 index 39dca36fdb..0000000000 --- a/Tools/maxscript/bipSelect/bip01_pelvis.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7115caa10fbbdd27ca72ba6058be36a5f8d71070477dff48360f092845ef80e -size 17291 diff --git a/Tools/maxscript/bipSelect/bip01_r_calf.gif b/Tools/maxscript/bipSelect/bip01_r_calf.gif deleted file mode 100644 index 7aa0bc710d..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_calf.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75e0afdc6255832ea2b53bcb3d492aeece9ee883bb3407de8694552ff14ef8d0 -size 17310 diff --git a/Tools/maxscript/bipSelect/bip01_r_clavicular_deltoid.gif b/Tools/maxscript/bipSelect/bip01_r_clavicular_deltoid.gif deleted file mode 100644 index 27cbb7cb74..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_clavicular_deltoid.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3920068a05e0575dd1e5dc19950d7a7ab9627b71504248e769dd69b73d11c5a4 -size 17386 diff --git a/Tools/maxscript/bipSelect/bip01_r_foot.gif b/Tools/maxscript/bipSelect/bip01_r_foot.gif deleted file mode 100644 index 4255837f24..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_foot.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a22e94851a802c1e19a731172805339b32e7338839adf9c9ecbab88020d6d9de -size 17212 diff --git a/Tools/maxscript/bipSelect/bip01_r_forearm.gif b/Tools/maxscript/bipSelect/bip01_r_forearm.gif deleted file mode 100644 index 8d01cd5428..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_forearm.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e57897bcaae23de73b33e7131863e1957c1d22460389bd97fae491251372ace -size 17333 diff --git a/Tools/maxscript/bipSelect/bip01_r_hand.gif b/Tools/maxscript/bipSelect/bip01_r_hand.gif deleted file mode 100644 index ba979a99a0..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_hand.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c9ca7dc9a0021ab407982b86561964577dd4516d6008d316e8b5c78c37a8bb1 -size 17323 diff --git a/Tools/maxscript/bipSelect/bip01_r_knee.gif b/Tools/maxscript/bipSelect/bip01_r_knee.gif deleted file mode 100644 index b52ebe1a00..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_knee.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97caba63c6d217237df08621378e21afc986570b726ee2ac54fdd669297c03df -size 17315 diff --git a/Tools/maxscript/bipSelect/bip01_r_thigh.gif b/Tools/maxscript/bipSelect/bip01_r_thigh.gif deleted file mode 100644 index 51d73125ca..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_thigh.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1dda267e18bb18c95672f9826e2319a193afa37c8d022f8460430b9287fc106b -size 17338 diff --git a/Tools/maxscript/bipSelect/bip01_r_upperarm.gif b/Tools/maxscript/bipSelect/bip01_r_upperarm.gif deleted file mode 100644 index d5b072c3cc..0000000000 --- a/Tools/maxscript/bipSelect/bip01_r_upperarm.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d689d1e960b5287a4530e328f8b943ede29fbba2d9ad8bfac4cb5fdde6e20617 -size 17350 diff --git a/Tools/maxscript/bipSelect/bip01_spine.gif b/Tools/maxscript/bipSelect/bip01_spine.gif deleted file mode 100644 index 1e0899f90f..0000000000 --- a/Tools/maxscript/bipSelect/bip01_spine.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d005e65fd844e38be4779cbc7cb2a447a171e08d836231bc8046abd9a30be43 -size 17320 diff --git a/Tools/maxscript/bipSelect/bip01_spine1.gif b/Tools/maxscript/bipSelect/bip01_spine1.gif deleted file mode 100644 index 207d35c6f1..0000000000 --- a/Tools/maxscript/bipSelect/bip01_spine1.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5e33c3fb3c790e7aaced3acf63d4b528cfd04436382de5424f714aaca1390c2 -size 17045 diff --git a/Tools/maxscript/bipSelect/bip01_spine2.gif b/Tools/maxscript/bipSelect/bip01_spine2.gif deleted file mode 100644 index 87a6546759..0000000000 --- a/Tools/maxscript/bipSelect/bip01_spine2.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdd976b74e6fb0db92f0b035425ff3ff14edd4a59bedaea2ecf40ad46a564c6f -size 17323 diff --git a/Tools/maxscript/bipSelect/bip01_spine3.gif b/Tools/maxscript/bipSelect/bip01_spine3.gif deleted file mode 100644 index 8707100b46..0000000000 --- a/Tools/maxscript/bipSelect/bip01_spine3.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7361dec9be5df77ffd730a9724466343c99e6dc6e435be2b7d38a8a739fd2938 -size 17345 diff --git a/Tools/maxscript/bipSelect/bipselect.html b/Tools/maxscript/bipSelect/bipselect.html deleted file mode 100644 index b238d7dcb4..0000000000 --- a/Tools/maxscript/bipSelect/bipselect.html +++ /dev/null @@ -1,225 +0,0 @@ - -CrysisRig - - - - - - Bip01 Head - Bip01 L ForeArm - Bip01 R Forearm - Bip01 R UpperArm - Bip01 L Thigh - Bip01 R Thigh - Bip01 R Knee - Bip01 L Knee - Bip01 - Bip01 Pelvis - Bip01 L UpperArm - Bip01 Spine - Bip01 Spine3 - Bip01 Spine2 - Bip01 Spine1 - Bip01 R Calf - Bip01 L Calf - weapon_bone - alt_weapon_bone01 - Bip01 L Foot - Bip01 R Foot - Bip01 L Foot - Bip01 L Hand - Bip01 R Hand - Bip01 R clavicular deltoid01 - Bip01 L clavicular deltoid01 - - - - - - - - - - diff --git a/Tools/maxscript/bipSelect/weapon_bone.gif b/Tools/maxscript/bipSelect/weapon_bone.gif deleted file mode 100644 index 4ef13cbf44..0000000000 --- a/Tools/maxscript/bipSelect/weapon_bone.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b421353a3b25558a926f5b700561712d8332c55a0fe2b74f67c78043377ae09 -size 17318 diff --git a/Tools/maxscript/chrXfer.ms b/Tools/maxscript/chrXfer.ms deleted file mode 100644 index 070f67e550..0000000000 --- a/Tools/maxscript/chrXfer.ms +++ /dev/null @@ -1,161 +0,0 @@ - -fn saveOutChr = -( - if $ == undefined then - ( - messagebox "Select meshes.." - return undefined - ) - - nodes = selection as array - max modify mode - - --check that all objs have skin - for obj in nodes do - ( - if obj.modifiers[#Skin] == undefined then - ( - messagebox (obj.name + " has no Skin modifier") - return undefined - ) - ) - - modPanel.setCurrentObject nodes[1].modifiers[#Skin] - root = (crytools.findroot (skinOps.GetBoneName nodes[1].modifiers[#Skin] 1 0)) - - --check that they all use the same skeleton - for obj in nodes do - ( - if (crytools.findroot (skinOps.GetBoneName obj.modifiers[#Skin] 1 0)) != root then - ( - messagebox "hierarchy mismatch!" - ) - ) - - savePath = getSavePath initialDir:crytools.buildPathFull caption:"Please select a folder to dump character data:" - if savePath == undefined then - ( - return undefined - ) - savePath += "\\" - print ("Saving to " + savePath) - global savePathCHR_crytools = savePath - - --save out envelopes - for obj in nodes do - ( - modPanel.setCurrentObject obj.modifiers[#Skin] - skinOps.SaveEnvelope obj.modifiers[#Skin] (savePath + obj.name + ".env") - ) - - --save out bone list - for obj in nodes do - ( - boneList = #() - for i=1 to (skinOps.getNumberBones obj.skin) do - ( - append boneList (skinOps.GetBoneName obj.modifiers[#Skin] i 1) - ) - crytools.writeOUT boneList (savePath + obj.name + ".bones") - ) - - --save out node list - nodeNames = #() - for obj in nodes do (append nodeNames obj.name) - crytools.writeOUT nodenames (savePath + "nodes.txt") - - --save out OBJ files - for obj in nodes do - ( - select obj - exportFile (savePath + obj.name + ".obj") #noPrompt selectedOnly:true using:Wavefront_ObjectExporterPlugin - ) -) ---saveOutChr() - -fn readInChr = -( - nodes = #() - - if savePathCHR_crytools != undefined then - ( - savePath = getSavePath initialDir:savePathCHR_crytools caption:"Please select a folder to load character data:" - ) - else - ( - savePath = getSavePath initialDir:savePathCHR_crytools caption:"Please select a folder to load character data:" - ) - - if savePath == undefined then - ( - return undefined - ) - savePath += "\\" - print ("Loading from " + savePath) - - nodenames = crytools.readIN (savePath + "nodes.txt") - - for name in nodenames do - ( - file = importFile (savePath + name + ".obj") #noPrompt - $.name = name - ) - - for name in nodenames do (append nodes (getnodebyname name)) - - for obj in nodes do - ( - addModifier obj (Skin ()) - ) -) ---readInChr() - -fn addBones savePath = -( - nodes = #() - nodenames = crytools.readIN (savePath + "nodes.txt") - for name in nodenames do (append nodes (getnodebyname name)) - print nodes - - if crytools.maxversionnum >= 9 then - ( - DialogMonitorOPS.RegisterNotification ANoon_EnvelopeCallbackFunction ID:#ANoon_Envelopes - DialogMonitorOPS.Enabled = true - ) - - for obj in nodes do - ( - boneNames = crytools.readIN (savePath + obj.name + ".bones") - bones = #() - for name in boneNames do (append bones (getnodebyname name)) - max modify mode - modPanel.setCurrentObject obj.modifiers[#Skin] - for bone in bones do - ( - skinOps.addbone obj.modifiers[#Skin] bone 1 - ) - skinOps.LoadEnvelope obj.modifiers[#Skin] (savePath + obj.name + ".env") - skinOps.LoadEnvelope obj.modifiers[#Skin] (savePath + obj.name + ".env") - ) - - if crytools.maxversionnum >= 9 then - ( - DialogMonitorOPS.Enabled = false - DialogMonitorOPS.UnRegisterNotification ID:#ANoon_Envelopes - ) -) - - - - - - - - - - - - - - - diff --git a/Tools/maxscript/cryAnim/functions.ms b/Tools/maxscript/cryAnim/functions.ms deleted file mode 100644 index 1fcd69c86a..0000000000 --- a/Tools/maxscript/cryAnim/functions.ms +++ /dev/null @@ -1,8401 +0,0 @@ -------------------------------------------------------------------------------- --- functions.ms --- Version 2.9 --- functions file where almost all specific functions are defined --- By: Mathias Lindner --- eMail: devsupport@crytek.com -------------------------------------------------------------------------------- - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.getBipNames ----------------------------------------------------------------------------------------------------------------------------------- --- get the names of used links (used for non-default biped systems) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.getBipNames = function getBipNames index = -( - try - ( - if $Bip01 != undefined then - ( - if $Bip01.classID[1] == 37157 then - ( - case index of - ( - /*Hand*/1: ( tempNode = biped.getNode $Bip01 #rArm link:4 ) - /*Foot*/2: ( tempNode = biped.getNode $Bip01 #rLeg link:3 ) - /*Toe0*/3: ( tempNode = biped.getNode $Bip01 #rToes link:1 ) - /*Finger*/4: ( return "Finger" ) - ) - - - --// stores the last part of the string - tempFilterString = (filterString tempNode.name " ")[3] - - return tempFilterString - ) - ) - - return undefined - ) - catch ( logOutput "!!> Error in cryAnim._f.getBipNames" ) -) -getBipNames = undefined -logOutput "> Created cryAnim._f.getBipNames function" - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.getBaseBip ----------------------------------------------------------------------------------------------------------------------------------- --- gets the root node of the biped hierarchy ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.getBaseBip = function getBaseBip op:undefined = -( - try - ( - local baseBip = undefined - try - ( - baseBip = selection[1].controller.rootNode - ) - catch - ( - for obj in Objects do - ( - if obj.classID[1] == 37157 then - baseBip = obj.controller.rootNode - ) - ) - - if baseBip == undefined then - ( - if op == #load then - messageBox "No Biped in Scene." title:"Load File" - else - print "No Biped in Scene" - ) - - return baseBip - ) - catch ( logOutput "!!> Error in cryAnim._f.getBaseBip" ) -) -getBaseBip = undefined -logOutput "> Created cryAnim._f.getBaseBip function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.getSelectedBipPart ----------------------------------------------------------------------------------------------------------------------------------- --- returns the biped part which is currently in selection ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.getSelectedBipPart = function getSelectedBipPart = -( - try - ( - --// defines using "standard" constructor - tempFilter = bipPartSt object:(objectSt selected:undefined parent:undefined child:undefined isPivot:false) part:(partNameSt name:undefined leftRight:undefined bodyPart:undefined) name:undefined pivotSel:(pivotSelSt index:undefined pivotName:undefined position:undefined pivPoint:(pivPointSt name:undefined position:undefined) ) - - --// gets selected biped object - selectedBipPart = getCurrentSelection() - - --// stores the selected object in tempFilter - if selectedBipPart[1] != undefined then - tempFilter.object.selected = selectedBipPart[1] - else return undefined - - if tempFilter.object.selected.superClassID != 16 then - return undefined - - --// filters the name using space (" ") for seperation - tempFilterString = (filterString selectedBipPart[1].name " ") - -- check if selected part is child of bip01 - tempNodeParent = #() - validBipedPart = false - for i = 1 to 20 do - ( - if tempNodeParent.count == 0 then - --// initialise with the selected object - append tempNodeParent tempFilter.object.selected - else - --// if the latest object is not undefined, then add the parent to the array - if tempNodeParent[tempNodeParent.count] != undefined then - append tempNodeParent tempNodeParent[tempNodeParent.count].parent - --// if parent is undefined (end of parentList) then break the loop - if tempNodeParent[tempNodeParent.count] == undefined then - break - ) - if (findItem tempNodeParent $Bip01 ) == 0 then - return undefined - else - --// if Bip01 is in in the parent list, then set validBipedPart to true - validBipedPart = true - - - ------// stores last part (body part, for example: "Foot" or "Hand" etc.) in .part - ----// necessary for resetRotation to get every possible biped part - --// if there is more than 2 substrings (i.e. "Bip01 L Hand" or "Bip01 R Foot") - if tempFilterString.count > 2 then - ( - tempFilter.part.leftRight = tempFilterString[2] - tempFilter.part.bodyPart = tempFilterString[3] - tempFilter.part.name = tempFilterString[2] + tempFilterString[3] - ) - --// if there is less than 3 substrings (i.e. "Bip01 Spine" or "Bip01 Head" - else - ( - tempFilter.part.leftRight = "" - tempFilter.part.bodyPart = tempFilterString[tempFilterString.count] - tempFilter.part.name = tempFilterString[tempFilterString.count] - ) - - if findString tempFilter.part.bodyPart "Finger" != undefined then - tempFilter.part.bodyPart = substring tempFilter.part.bodyPart 1 6 - - --// stores the name of the selected object - tempFilter.name = tempFilter.object.selected.name - - ok = false - tempBipNames = #() - - for i = 1 to 3 do - tempBipNames[i] = cryTools.cryAnim._f.getBipNames i - - - function getObjectParent baseObject = - ( - try - ( - for i = 1 to 20 do - ( - if baseObject != undefined then - ( - if findString baseObject.parent.name "Hand" != undefined then - return baseObject.parent - else - baseObject = baseObject.parent - ) - ) - ) - catch () - - return undefined - ) - - - case tempFilter.part.bodyPart of - ( - /*Hand*/(cryTools.cryAnim._f.getBipNames 1): ( ok = true ) - /*Finger*/(cryTools.cryAnim._f.getBipNames 4): ( ok = true - tempFilter.part.bodyPart = (cryTools.cryAnim._f.getBipNames 1) - tempFilter.part.name = tempFilter.part.leftRight + tempFilter.part.bodyPart - tempFilter.object.child = tempFilter.object.selected - tempFilter.object.selected = getObjectParent tempFilter.object.child - tempFilter.name = tempFilter.object.selected.name - ) - /*Foot*/(cryTools.cryAnim._f.getBipNames 2): ( ok = true ) - /*Toe0*/(cryTools.cryAnim._f.getBipNames 3): ( ok = true - --// only necessary for resetRotation() to check, if the toe or finger is selected - tempFilter.part.bodyPart = (cryTools.cryAnim._f.getBipNames 2) - tempFilter.part.name = tempFilter.part.leftRight + tempFilter.part.bodyPart - tempFilter.object.child = tempfilter.object.selected - tempFilter.object.selected = tempFilter.object.selected.parent - tempFilter.name = tempFilter.object.selected.name - ) - ) - - - if tempFilter.object.selected != $Bip01 then - tempFilter.object.parent = tempFilter.object.selected.parent - - if ok == true then - tempFilter.object.isPivot = true - - if tempFilter.object.isPivot == true then - ( - try (tempFilter.pivotSel.index = execute ("cryTools.cryAnim.align._v.pivotLast." + tempFilter.part.name + ".index") )catch( print "Error getting pivotSel.index" ) - try (tempFilter.pivotSel.pivotName = execute ("cryTools.cryAnim.align._v.pivotLast." + tempFilter.part.name + ".pivotName") ) catch(print "Error getting pivotSel.pivotName" ) - try (tempFilter.pivotSel.position = execute ("cryTools.cryAnim.align._v.pivotLast." + tempFilter.part.name + ".position") ) catch( print "Error getting pivotSel.position" ) - try (tempFilter.pivotSel.pivObject = execute ("cryTools.cryAnim.align._v.pivotLast." + tempFilter.part.name + ".pivObject") ) catch( print "Error getting pivotSel.pivObject" ) - try (tempFilter.pivotSel.pivPoint.name = execute ("cryTools.cryAnim.align._v.pivotLast." + tempFilter.part.name + ".pivPoint.name") ) catch( print "Error getting pivotSel.pivPoint.name" ) - try (tempFilter.pivotSel.pivPoint.position = execute ("cryTools.cryAnim.align._v.pivotLast." + tempFilter.part.name + ".pivPoint.position") ) catch( print "Error getting pivotSel.pivPoint.position" ) - ) - - - if validBipedPart == true then - return tempFilter - else - --// if no biped part for pivot selection is selected, then return - return undefined - ) - catch ( logOutput "!!> Error in cryAnim._f.getSelectedBipPart" ) -) -getSelectedBipPart = undefined -logOutput "> Created cryAnim._f.getSelectedBipPart function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.getSelectedBipPart ----------------------------------------------------------------------------------------------------------------------------------- --- returns the biped part which is currently in selection ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.getPivotPointPos = function getPivotPointPos index baseNode = -( - try - ( - vertPos = undefined - - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - - - case (selectedBipPart.part.bodyPart) of - ( - - --// checks what biped part is selected - /*Foot*/(cryTools.cryAnim._f.getBipNames 2): - ( - try ( child = baseNode.children[1] ) catch() - if child == undefined then - child = baseNode - - - case (index) of - ( - --// returns the pivot position values of the selected biped object - 1: vertPos = (in coordsys world baseNode.transform.pos) - 2: vertPos = (in coordsys world (getVert baseNode 7)) - 3: vertPos = (in coordsys world ( ((getVert baseNode 6) + (getVert baseNode 7)) / 2) ) - 4: vertPos = (in coordsys world (getVert baseNode 6)) - 5: vertPos = (in coordsys world (getVert baseNode 3)) - 6: vertPos = (in coordsys world ( ((getVert baseNode 2) + (getVert baseNode 3)) / 2) ) - 7: vertPos = (in coordsys world (getVert baseNode 2)) - 8: vertPos = (in coordsys world (getVert child 2)) - 9: vertPos = (in coordsys world ( ((getVert child 2) + (getVert child 6)) / 2) ) - 10: vertPos = (in coordsys world (getVert child 6)) - ) - ) - /*Hand*/(cryTools.cryAnim._f.getBipNames 1): - ( - local childArray = cryTools.cryAnim._f.getChildren selectedBipPart.object.selected - - - case (index) of - ( - --// STUPID EDIT POLY -- - 1: vertPos = (in coordsys world baseNode.transform.pos ) - 2: vertPos = (in coordsys world (getVert baseNode 8)) - 3: vertPos = (in coordsys world ( ((getVert baseNode 8) + (getVert baseNode 4)) / 2) ) - 4: vertPos = (in coordsys world (getVert baseNode 4)) - 5: vertPos = (in coordsys world (getVert baseNode 7)) - 6: vertPos = (in coordsys world ( ((getVert baseNode 7) + (getVert baseNode 3)) / 2) ) - 7: vertPos = (in coordsys world (getVert baseNode 3)) - ) - - - if index > 7 then - vertPos = (in coordsys world ( ((getVert childArray[index - 7] 7) + (getVert childArray[index - 7] 3)) / 2) ) - ) - ) - - return vertPos - ) - catch ( logOutput "!!> Error in cryAnim._f.getPivotPointPos" ) -) -getPivotPointPos = undefined -logOutput "> Created cryAnim._f.getPivotPointPos function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.getNearestSnapshot ----------------------------------------------------------------------------------------------------------------------------------- --- gets the nearest snapshot of the selected object in the scene ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.getNearestSnapshot = function getNearestSnapshot = -( - try - ( - local tempSnapList = #() - local usedSnapshot = undefined - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - - - pivotDistance = pivotDistanceStruct() - - - if selectedBipPart != undefined then - ( - if selectedBipPart.object.isPivot == true then - ( - --// tries to get the index the last used pivot - local pivotIndex = selectedBipPart.pivotSel.index - --// if not found, pivot will be set to 1 - if pivotIndex == undefined then pivotIndex = 1 - - - --// snapshot function does not work with fingers, in this case the pivot point will be used - if selectedBipPart.part.bodyPart == "Hand" then - if selectedBipPart.pivotSel.pivObject != undefined then - if findString selectedBipPart.pivotSel.pivObject "Finger" != undefined then - return undefined - - addModifier selectedBipPart.object.selected (edit_mesh()) - --// gets the pivot position of the biped object - local bipPivotPos = (cryTools.cryAnim._f.getPivotPointPos pivotIndex selectedBipPart.object.selected) - deleteModifier selectedBipPart.object.selected 1 - - - - for i = 1 to Objects.count do - ( - - if pivotIndex <= 7 then - --// gets all available snapshots and stores it temporary in tempSnap - local tempSnap = getNodeByName (selectedBipPart.name + "0" + i as String) - else - --// gets all available snapshot toes and stores it temporary in tempSnap - local tempSnap = getNodeByName (selectedBipPart.object.selected.children[1].name + i as String) - - - if tempSnap != undefined then - ( - --// stores founded snapshots in tempSnapList - append tempSnapList tempSnap.name - - --// gets pivot position of the snapshot - local snapshotPivotPos = (cryTools.cryAnim._f.getPivotPointPos pivotIndex tempSnap) - - - if pivotDistance.distance == undefined then - ( - ----// for initialisation - --// gets the distance between the pivot of snapshot and biped object and stores it in pivotDistance - pivotDistance.distance = distance bipPivotPos snapshotPivotPos - pivotDistance.name = tempSnap.name - ) - else - ( - --// gets the distance from snapshot and biped object pivot - local tempDistance = (distance bipPivotPos snapshotPivotPos) - --// checks, which distance is smaller and stores the distance and name of the snapshot in pivotDistance - if pivotDistance.distance > tempDistance then - ( - pivotDistance.distance = distance bipPivotPos snapshotPivotPos - pivotDistance.name = tempSnap.name - ) - ) - ) - ) - - if tempSnapList.count > 0 then - return (getNodeByName pivotDistance.name) - ) - ) - --// otherwise undefined - return undefined - ) - catch ( logOutput "!!> Error in cryAnim._f.getNearestSnapshot" ) -) -getNearestSnapshot = undefined -logOutput "> Created cryAnim._f.getNearestSnapshot function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.moveBipPartPivPoint ----------------------------------------------------------------------------------------------------------------------------------- --- moves node to the pivot point ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.moveBipPartPivPoint = function moveBipPartPivPoint = -( - try - ( - if (selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() ) != undefined then - ( - if selectedBipPart.object.isPivot == true then - ( - if selectedBipPart.pivotSel.pivPoint.position != undefined then - ( - selectedObject = selectedBipPart.object.selected - - - addModifier selectedBipPart.object.selected (edit_mesh()) - bipPivotPos = ( cryTools.cryAnim._f.getPivotPointPos selectedBipPart.pivotSel.index selectedBipPart.object.selected ) - deleteModifier selectedBipPart.object.selected 1 - - offsetPos = (selectedBipPart.pivotSel.pivPoint.position - bipPivotPos) - tempRot = selectedObject.transform.rotation as eulerangles - in coordsys world (move selectedObject offsetPos) - - if selectedBipPart.part.bodyPart == "Hand" then - biped.setTransform selectedObject #rotation tempRot true - - - return true - ) - ) - ) - return false - ) - catch ( logOutput "!!> Error in cryAnim._f.moveBipPartPivPoint" ) -) -moveBipPartPivPoint = undefined -logOutput "> Created cryAnim._f.moveBipPartPivPoint function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.moveRotBipPartPivPoint ----------------------------------------------------------------------------------------------------------------------------------- --- moves and rotates node to pivot point ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.moveRotBipPartPivPoint = function moveRotBipPartPivPoint = -( - try - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - if selectedBipPart.object.isPivot == true then - ( - if selectedBipPart.pivotSel.pivPoint.name != undefined then - ( - --try - --( - local tempString = "pivSnap" + (substring selectedBipPart.pivotSel.pivPoint.name 9 selectedBipPart.pivotSel.pivPoint.name.count) - biped.setTransform selectedBipPart.object.selected #rotation (getNodeByName tempString).transform.rotation true - cryTools.cryAnim._f.moveBipPartPivPoint() - return true - --)catch() - ) - ) - ) - else - return undefined - - return false - ) - catch ( logOutput "!!> Error in cryAnim._f.moveRotBipPartPivPoint" ) -) -moveRotBipPartPivPoint = undefined -logOutput "> Created cryAnim._f.moveRotBipPartPivPoint function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.moveBipPart ----------------------------------------------------------------------------------------------------------------------------------- --- moves node to the pivot of the nearest snapshot ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.moveBipPart = function moveBipPart = -( - try - ( - pivotIndex = undefined - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - if selectedBipPart.object.isPivot == true then - ( - --// if last used pivot is undefined then start selection tool - if selectedBipPart.pivotSel.index == undefined then - ( - pivotIndex = 1 - ) - else - ( - --// gets the initial letter of the pivot name ("e" or "p" (edge or point)) - case (substring selectedBipPart.pivotSel.pivotName 1 1) of - ( - "p": - ( - pivotIndex = selectedBipPart.pivotSel.index - ) - "e": - ( - angleY = 0.0 - angleZ = 0.0 - - --// due to different order of the edges the pivot will be choosen for the edge - case selectedBipPart.pivotSel.index of - ( - 1: pivotIndex = 2 - 2: pivotIndex = 5 - 3: pivotIndex = 7 - 4: pivotIndex = 4 - ) - - --// gets nearest snapshot and applys the transform matrix on the variable - if (tempSnapMatrix = cryTools.cryAnim._f.getNearestSnapshot() ) != undefined then - ( - tempSnapMatrix = tempSnapMatrix.transform - - --// gets the transform matrix of the selected object - tempBipMatrix = selectedBipPart.object.selected.transform - - --// which edges are selected - if mod selectedBipPart.pivotSel.index 2 == 0.0 then - ( - --// 2 or 4 is selected - angleY = 0.0 - --// gets angle of row2 - angleZ = acos ( dot (normalize [tempBipMatrix.row2.x, tempBipMatrix.row2.y, tempBipMatrix.row2.z]) (normalize [tempBipMatrix.row2.x, tempBipMatrix.row2.y, 0])) - --// if row2 is smaller than 0 (rotated downward) - if tempBipMatrix.row2.z < 0 then - --// stores negative value - angleZ -= angleZ*2 - ) - else - ( - --// 1 or 3 is selected - --// gets angle of row3 - angleY = acos ( dot (normalize [tempBipMatrix.row3.x, tempBipMatrix.row3.y, tempBipMatrix.row3.z]) (normalize [tempBipMatrix.row3.x, tempBipMatrix.row3.y, 0])) - angleZ = 0.0 - --// if row3 is bigger than 0 (rotated to the right) - if tempBipMatrix.row3.z > 0 then - --// stores negative value - angleY -= angleY*2 - ) - --// creates new matrix with the rotation of the snapshot, but transition of the biped part - newMatrix = matrix3 tempSnapMatrix.row1 tempSnapMatrix.row2 tempSnapMatrix.row3 tempBipMatrix.row4 - --// applys new transformation matrix to the selected biped part - selectedBipPart.object.selected.transform = newMatrix - - --// rotates the selected biped part with the angle of the original rotation - in coordsys local rotate selectedBipPart.object.selected (eulerangles 0 angleY angleZ ) - ) - ) - ) - ) - - addModifier selectedBipPart.object.selected (edit_mesh()) - --// gets pivot position of the biped object - local bipPivotPos = ( cryTools.cryAnim._f.getPivotPointPos pivotIndex selectedBipPart.object.selected ) - deleteModifier selectedBipPart.object.selected 1 - - --// gets nearest snapshot - local tempSnap = cryTools.cryAnim._f.getNearestSnapshot() - - --// if snapshot is not available or in the scene, then return false - if tempSnap == undefined then return false - --// gets pivot position of the nearest snapshot - local snapshotPivotPos = (cryTools.cryAnim._f.getPivotPointPos pivotIndex tempSnap ) - - --// generates the offset for moving the biped object to the new snapshot location - local bipPivotOffset = snapshotPivotPos - bipPivotPos - --// moves biped object to new location - local tempRot = $.transform.rotation as eulerangles - in coordsys world (move $ bipPivotOffset) - - if selectedBipPart.part.bodyPart == "Hand" then - biped.setTransform $ #rotation tempRot true - - - return true - ) - - return false - ) - ) - catch ( logOutput "!!> Error in cryAnim._f.moveBipPart" ) -) -moveBipPart = undefined -logOutput "> Created cryAnim._f.moveBipPart function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.moveRotBipPart ----------------------------------------------------------------------------------------------------------------------------------- --- moves and rotates node to the nearest snapshots pivot ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.moveRotBipPart = function moveRotBipPart = -( - try - ( - --// get selected object and check if not unselected - pivotIndex = undefined - - if ( selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() ) != undefined then - ( - if selectedBipPart.object.isPivot == true then - ( - if selectedBipPart.pivotSel.index == undefined then - pivotIndex = 1 - else - pivotIndex = selectedBipPart.pivotSel.index - - --// gets nearest snapshot - tempSnap = cryTools.cryAnim._f.getNearestSnapshot() - if tempSnap != undefined then - ( - --// gets the rotation of snapshot - tempRot = tempSnap.rotation - --// inverts the angle of rotation - tempRot.w = tempRot.w - (tempRot.w * 2) - --// checks, if the toe pivot is selected - if pivotIndex <= 7 then - ( - --// if available, then apply rotation of the snapshot to the selected biped object - biped.setTransform selectedBipPart.object.selected #rotation tempRot true - ) - else - ( - --// if toe is selected, then apply rotation to the toe (child of foot) - biped.setTransform selectedBipPart.object.selected.children[1] #rotation tempRot true - ) - ) - ) - ) - --// tries to translate the biped object to the snapshot - if cryTools.cryAnim._f.moveBipPart() == true then - return true - else - return false - ) - catch ( logOutput "!!> Error in cryAnim._f.moveRotBipPart" ) -) -moveRotBipPart = undefined -logOutput "> Created cryAnim._f.moveRotBipPart function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.moveToFloor ----------------------------------------------------------------------------------------------------------------------------------- --- moves the selected foot to the floor ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.moveToFloor = function moveToFloor value:undefined getHeight:undefined = -( - try - ( - if ( selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() ) != undefined then - ( - if selectedBipPart.object.isPivot == true then - ( - --// creates a matrix to rotate the selected object - tempMatrix = selectedBipPart.object.selected.transform - - --// creates the height of the foot out of the distance between the heighest vert (5) and lowest vert (6) - if value == undefined then - ( - addModifier selectedBipPart.object.selected (edit_mesh()) - tempHeight = distance (getVert selectedBipPart.object.selected 5) (getVert selectedBipPart.object.selected 6) - deleteModifier selectedBipPart.object.selected 1 - ) - else - tempHeight = value - - if getHeight != undefined then - return tempHeight - - --// sets new rotation to the matrix, so that it keeps the horizontal rotation - tempMatrix = matrix3 [0, 0, -1] [tempMatrix.row2.x, tempMatrix.row2.y, 0] [tempMatrix.row3.x, tempMatrix.row3.y, 0] [tempMatrix.row4.x, tempMatrix.row4.y, tempHeight] - --// sets the foot to the floor - selectedBipPart.object.selected.transform = tempMatrix - biped.setTransform selectedBipPart.object.selected #pos [tempMatrix.pos[1], tempMatrix.pos[2], tempMatrix.pos[3]] true - - return true - ) - else - return undefined - ) - ) - catch ( logOutput "!!> Error in cryAnim._f.moveToFloor" ) -) -moveToFloor = undefined -logOutput "> Created cryAnim._f.moveToFloor function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.resetRotation ----------------------------------------------------------------------------------------------------------------------------------- --- applies the parent rotation to the child ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.resetRotation = function resetRotation = -( - try - ( - if selection.count > 0 then - ( - for obj in selection do - ( - if obj.classID[1] == 37157 then - ( - if obj.parent != undefined then - ( - local newRotation = obj.parent.transform.rotation - - if findString obj.name "Toe" != undefined then - newRotation = (matrix3 obj.parent.transform.row2 -obj.parent.transform.row1 obj.parent.transform.row3 obj.transform.row4).rotation - if findString obj.name "Hand" != undefined then - newRotation = (matrix3 obj.parent.transform.row1 -obj.parent.transform.row3 obj.parent.transform.row2 obj.transform.row4).rotation - - biped.setTransform obj #rotation newRotation true - ) - ) - else - ( - if obj.parent != undefined then - ( - local newMatrix = obj.transform - - newMatrix.rotation = obj.parent.transform.rotation - newMatrix.position = obj.transform.position - obj.transform = newMatrix - ) - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim._f.resetRotation" ) -) -resetRotation = undefined -logOutput "> Created cryAnim._f.resetRotation function" - - - - - - - - ---///////////////////////////////////////////////////////////////////////////////////////////////////////////// ---//################################################################ ---// DEF:cryTools.cryAnim._f.rotate180 ---//-------------------------------------------------------------------------------------------------------------------------------- ---// rotates the biped around 180° ---//################################################################ ---///////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.rotateAnim = function rotateAnim animDir range:undefined = -( - try - ( - if classOf animDir == Integer or classOf animDir == Float then - ( - if selection.count > 0 then - local usedNode = (getCurrentSelection())[1] - else - if $Bip01 != undefined then - usedNode = $Bip01 - - if usedNode != undefined then - ( - if usedNode.classID[1] == 37157 then - ( - usedNode = usedNode.controller.rootNode - local undoString = "rotate " + animDir as String - undo undoString on - ( - if range != undefined then - ( - at time animationRange.start - ( - with animate off - ( - usedNode.controller.moveAllMode = true - rotate usedNode (eulerangles 0 0 animDir) - biped.collapseMoveAllMode usedNode.controller - usedNode.controller.moveAllMode = false - ) - ) - - - - if $Locator_Locomotion != undefined then - ( - if $Locator_Locomotion.classID[1] == 37157 then - ( - at time animationRange.start - ( - with animate off - ( - rotRoot = box pos:usedNode.transform.pos name:"rotRoot" - locClone = (cryTools.cryAnim._f.createSnapshot object:$Locator_Locomotion)[1] - locClone.parent = rotRoot - ) - ) - - for i = animationRange.start to animationRange.end do - ( - with animate on - at time i - locClone.transform = $Locator_Locomotion.transform - ) - - with animate off - ( - at time animationRange.start - rotate rotRoot (eulerangles 0 0 animDir) - ) - - - with redraw off - ( - for i = animationRange.start to animationRange.end do - ( - sliderTime = i - ( - with animate on - ( - biped.setTransform $Locator_Locomotion #rotation locClone.transform.rotation true - biped.setTransform $Locator_Locomotion #pos locClone.transform.pos true - ) - ) - ) - ) - ) - ) - - sliderTime = animationRange.start + 1 - sliderTime = animationRange.start - ) - else - ( - with animate on - rotate usedNode (eulerangles 0 0 animDir) - - if $Locator_Locomotion != undefined then - ( - if $Locator_Locomotion.classID[1] == 37157 then - ( - with animate off - ( - rotRoot = box pos:usedNode.transform.pos name:"rotRoot" - locClone = (cryTools.cryAnim._f.createSnapshot object:$Locator_Locomotion)[1] - locClone.parent = rotRoot - rotate rotRoot (eulerangles 0 0 animDir) - ) - - with animate on - ( - biped.setTransform $Locator_Locomotion #rotation locClone.transform.rotation true - biped.setTransform $Locator_Locomotion #pos locClone.transform.pos true - ) - ) - ) - ) - ) - ) - ) - ) - try - ( - delete rotRoot - delete locClone - )catch() - ) - catch ( logOutput "!!> Error in cryAnim._f.rotateAnim" ) -) -rotateAnim = undefined -logOutput "> Created cryAnim._f.rotateAnim function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.bipToZero2 ----------------------------------------------------------------------------------------------------------------------------------- --- moves Bip01 to [0,0,z] ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.bipToZero2 = function bipToZero2 = -( - try - ( - biped.setTransform $Bip01 #pos [0,0,($Bip01.transform.pos[3])] true - ) - catch ( logOutput "!!> Error in cryAnim._f.bipToZero2" ) -) -bipToZero2 = undefined -logOutput "> Created cryAnim._f.bipToZero2 function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.bipToZero3 ----------------------------------------------------------------------------------------------------------------------------------- --- moves Bip01 to [0,0,0] ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.bipToZero3 = function bipToZero3 = -( - try - ( - biped.setTransform $Bip01 #pos [0,0,0] true - ) - catch ( logOutput "!!> Error in cryAnim._f.bipToZero3" ) -) -bipToZero3 = undefined -logOutput "> Created cryAnim._f.bipToZero3 function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.setTrajectories ----------------------------------------------------------------------------------------------------------------------------------- --- shows trajectory of selected objects ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.setTrajectories = function setTrajectories dir = -( - try - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - - case dir of - ( - #show: - ( - for obj in $selection do - setTrajectoryOn obj true - - return true - ) - #hide: - ( - for obj in Objects do - setTrajectoryOn obj false - - return true - ) - #checkHide: - ( - for obj in Objects do - if (getTrajectoryOn obj) == true then - return true - - return false - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim._f.setTrajectories" ) -) -setTrajectories = undefined -logOutput "> Created cryAnim._f.setTrajectories function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.resetLocator ----------------------------------------------------------------------------------------------------------------------------------- --- resets locator to [0,0,0] Y+/Y- ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.resetLocator = function resetLocator forceDir:undefined = -( - try - ( - if $Locator_Locomotion != undefined then - ( - try - ( - biped.deleteKeys $'Locator_Locomotion'.controller #allKeys - biped.addNewKey $'Locator_Locomotion'.controller animationRange.start - - propKey = biped.getKey $'Locator_Locomotion'.controller 1 - - propKey.posSpace = 0 - propKey.rotSpace = 0 - - sliderTime = animationRange.start - - bipRot = $Bip01.transform.rotation as eulerangles - - biped.setTransform $'Locator_Locomotion' #pos (in coordsys world [0,0,0]) true - - if forceDir == undefined then - ( - if bipRot.z > 0 and bipRot.z < 180 then - ( - --// new, proper character rotation - biped.setTransform $'Locator_Locomotion' #rotation (quat 0 0 0 1) true - ) - else - ( - --// used for Crysis but old character rotation - biped.setTransform $'Locator_Locomotion' #rotation (quat 0 0 -1 0) true - ) - ) - else - biped.setTransform $'Locator_Locomotion' #rotation (quat 0 0 -1 0) true - - local tempItem = getCurrentSelection() - if findItem tempItem $Locator_Locomotion == 0 then - select $'Locator_Locomotion' - - return true - ) - catch( return false) - ) - else - print "No Locator in Scene" - ) - catch ( logOutput "!!> Error in cryAnim._f.resetLocator" ) -) -resetLocator = undefined -logOutput "> Created cryAnim._f.resetLocator function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.moveToBodyMass ----------------------------------------------------------------------------------------------------------------------------------- --- moves the locator to the body mass ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.moveToBodyMass = function moveToBodyMass = -( - try - ( - function getMaxValue root index = - ( - if root != undefined then - ( - maxValue = #(index, root.transform.pos[index], root.transform.pos[index]) - - for obj in root.children do - if obj.isHidden == false and obj.isFrozen == false then - maxValue = cryTools.cryAnim._f.getChildExtent obj maxValue - - return maxValue - ) - ) - - - - partPos = [0,0,0] - - for i = 1 to 3 do - ( - local newPos = getMaxValue $'Bip01 Spine' i - newPos = (newPos[2] + newPos[3]) / 2 - partPos[i] = newPos - ) - - - diffPos = ($'Bip01 Pelvis'.transform.pos - $'Bip01 Spine3'.transform.pos) / 2 - bodyPos = $'Bip01 Pelvis'.transform.pos - diffPos - - - partPos = partPos * 1/3 - bodyPos = bodyPos * 2/3 - - finalPos = partPos + bodyPos - finalPos[3] = 0 - - biped.setTransform $Locator_Locomotion #pos finalPos true - - return true - ) - catch ( logOutput "!!> Error in cryAnim._f.moveToBodyMass" ) -) -moveToBodyMass = undefined -logOutput "> Created cryAnim._f.moveToBodyMass function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.getChildren ----------------------------------------------------------------------------------------------------------------------------------- --- gets all children of a node ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.getChildren = function getChildren baseObject = -( - try - ( - function childToArray childArray = - ( - local tempArray = #() - for i = 1 to childArray.count do - ( - if childArray[i].classID[1] == 37157 then - if childArray[i].isHidden == false and childArray[i].isFrozen == false then - append tempArray childArray[i] - ) - - return tempArray - ) - - - - local baseArray = childToArray baseObject.children - - for obj in baseArray do - ( - if obj.children.count != 0 then - ( - local tempArray = childToArray obj.children - join baseArray tempArray - ) - ) - - return baseArray - ) - catch ( logOutput "!!> Error in cryAnim._f.getChildren" ) -) -getChildren = undefined -logOutput "> Created cryAnim._f.getChildren function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.getChildExtent ----------------------------------------------------------------------------------------------------------------------------------- --- returns the extremes of the children positions ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.getChildExtent = function getChildExtent root maxValue = -( - try - ( - if root.transform.pos[maxValue[1]] > maxValue[2] then - maxValue[2] = root.transform.pos[maxValue[1]] - - if root.transform.pos[maxValue[1]] < maxValue[3] then - maxValue[3] = root.transform.pos[maxValue[1]] - - if root.children != undefined then - ( - for obj in root.children do - if obj.isHidden == false and obj.isFrozen == false then - cryTools.cryAnim._f.getChildExtent obj maxValue - ) - return maxValue - ) - catch ( logOutput "!!> Error in cryAnim._f.getChildExtent" ) -) -getChildExtent = undefined -logOutput "> Created cryAnim._f.getChildExtent function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.createSnapshot ----------------------------------------------------------------------------------------------------------------------------------- --- creates snapshots of the selected node or with "object" specified node ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.createSnapshot = function createSnapshot children:unsupplied object:unsupplied = -( - try - ( - baseArray = #() - snapArray = #() - - function copyMesh baseObject = - ( - try - ( - local tempSnap = snapshot baseObject - tempSnap.parent = undefined - tempSnap.transform = baseObject.transform - tempSnap.wirecolor = baseObject.wirecolor - return tempSnap - ) - catch - return undefined - ) - - - if object == unsupplied then - ( - for obj in $selection do - ( - local newArray = #( obj ) - if children == true then - join newArray (cryTools.cryAnim._f.getChildren obj) - - for obj in newArray do - ( - append snapArray (copyMesh obj) - ) - - append baseArray newArray - ) - ) - else - ( - append snapArray (copyMesh object) - ) - - if snapArray.count > 0 then - return snapArray - else - return undefined - ) - catch ( logOutput "!!> Error in cryAnim._f.createSnapshot" ) -) -createSnapshot = undefined -logOutput "> Created cryAnim._f.createSnapshot function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.lockRotation ----------------------------------------------------------------------------------------------------------------------------------- --- locks rotation of the selected node ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.lockRotation = function lockRotation = -( - try - ( - if selection.count > 0 then - ( - if cryTools.cryAnim._v.lockRotation == undefined then - ( - cryTools.cryAnim._v.lockRotation = $.transform.rotation - return true - ) - else - return false - ) - ) - catch ( logOutput "!!> Error in cryAnim._f.lockRotation" ) -) -lockRotation = undefined -logOutput "> Created cryAnim._f.lockRotation function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim._f.pasteTransform ----------------------------------------------------------------------------------------------------------------------------------- --- pastes the transform (#transform, #pos, #rotation) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim._f.pasteTransform = function pasteTransform obj value op = -( - try - ( - try - ( - case op of - ( - #transform: - ( - biped.setTransform obj #rotation value.rotation true - biped.setTransform obj #pos value.pos true - biped.setTransform obj #rotation value.rotation true - ) - #pos: - ( - biped.setTransform obj #pos value.pos true - ) - #rotation: - ( - biped.setTransform obj #rotation value.rotation true - biped.setTransform obj #rotation value.pos true - ) - ) - ) - catch - ( - try - ( - local tempTransform = obj.transform - - case op of - ( - #transform: - ( - tempTransform = value - /* - obj.transform.rotation = value.rotation - obj.transform.pos = value.pos - obj.transform.rotation = value.rotation - */ - ) - #pos: - ( - tempTransform.pos = value.pos - tempTransform.rotation = obj.rotation - --obj.transform.pos = value.pos - ) - #rotation: - ( - tempTransform.rotation = value.rotation - tempTransform.pos = obj.pos - --obj.transform.rotation = value.rotation - ) - ) - obj.transform = tempTransform - ) - catch() - ) - ) - catch ( logOutput "!!> Error in cryAnim._f.pasteTransform" ) -) -pasteTransform = undefined -logOutput "> Created cryAnim._f.pasteTransform function" - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.createPivotEdge ----------------------------------------------------------------------------------------------------------------------------------- --- creates the cylinders for visualizing selection and hovering of edges ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.createPivotEdge = function createPivotEdge index positionFrom positionTo = -( - try - ( - if (alignLayer = layerManager.newLayerFromName "alignTool") == undefined then - alignLayer = layerManager.getLayerFromName "alignTool" - - alignLayer.current = true - - --// gets selected biped object - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - - --// creates a cylinder and stores it in edgeList - cryTools.cryAnim.align._v.edgeList.pivot[index] = cylinder() - --// creates and stores name, and other various values - cryTools.cryAnim.align._v.edgeList.pivot[index].name = ("e" + (index as String) + "_(" + selectedBipPart.name + ")") - cryTools.cryAnim.align._v.edgeList.pivot[index].radius = 0.1 - cryTools.cryAnim.align._v.edgeList.pivot[index].sides = 5 - --// sets position to the inital position - cryTools.cryAnim.align._v.edgeList.pivot[index].position = positionFrom - --// calculates distance between 2 pivot points and applies to the height - cryTools.cryAnim.align._v.edgeList.pivot[index].height = distance positionFrom positionTo - - - - if selectedBipPart.pivotSel.index != undefined then - ( - --// checks, if this pivotEdge was used before - --if cryTools.cryAnim.align._v.edgeList.pivot[index].index == selectedBipPart.pivotSel.index then - if index == selectedBipPart.pivotSel.index then - --// if used, set the color to red - cryTools.cryAnim.align._v.edgeList.pivot[index].wireColor = (color 255 0 0) - else - --// otherwise to "edgeBlue" - cryTools.cryAnim.align._v.edgeList.pivot[index].wireColor = (color 20 50 100) - ) - else - cryTools.cryAnim.align._v.edgeList.pivot[index].wireColor = (color 20 50 100) - - --// generates a tape with target for excact rotation of the cylinder - tempTape = tape pos:positionFrom target:(targetObject pos:positionTo) - --// applies transform from generated tape to the cylinder - cryTools.cryAnim.align._v.edgeList.pivot[index].transform = tempTape.transform - --// the cylinder is rotated 180°, so it will be rotated to the other side of the pivot - cryTools.cryAnim.align._v.edgeList.pivot[index].position = positionTo - - --// temporary tape will be deleted - cryTools.cryAnim.align._v.edgeList.selection[index] = cylinder radius:0.5 sides:5 height:cryTools.cryAnim.align._v.edgeList.pivot[index].height - cryTools.cryAnim.align._v.edgeList.selection[index].name = ("sE" + (index as String) + "_(" + selectedBipPart.name + ")") - cryTools.cryAnim.align._v.edgeList.selection[index].transform = tempTape.transform - cryTools.cryAnim.align._v.edgeList.selection[index].position = positionTo - --// hides the node (intersectRay still finds the mesh intersection of hidden nodes) - cryTools.cryAnim.align._v.edgeList.selection[index].isHidden = true - - delete tempTape - - tempBaseLayer = layerManager.getLayer 0 - tempBaseLayer.current = true - - return true - ) - catch ( logOutput "!!> Error in cryAnim.align._f.createPivotEdge" ) -) -createPivotEdge = undefined -logOutput "> Created cryAnim.align._f.createPivotEdge function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.createPivotPoint ----------------------------------------------------------------------------------------------------------------------------------- --- creates the spheres for visualizing selection and hovering of points ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.createPivotPoint = function createPivotPoint index position = -( - try - ( - if (alignLayer = layerManager.newLayerFromName "alignTool") == undefined then - alignLayer = layerManager.getLayerFromName "alignTool" - - alignLayer.current = true - - - --// gets selected object - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - --// generates sphere (point) - cryTools.cryAnim.align._v.pointList.pivot[index] = sphere() - --// sets name and other values - cryTools.cryAnim.align._v.pointList.pivot[index].name = ("p" + (index as String) + "_(" + selectedBipPart.name + ")") - cryTools.cryAnim.align._v.pointList.pivot[index].radius = 0.5 - cryTools.cryAnim.align._v.pointList.pivot[index].segs = 10 - cryTools.cryAnim.align._v.pointList.pivot[index].position = position - - - if selectedBipPart.pivotSel.index != undefined then - ( - --// checks, if the pivot was used before - --if cryTools.cryAnim.align._v.pointList.pivot[index]. == selectedBipPart.pivotSel.index then - if index == selectedBipPart.pivotSel.index then - --// if used, the color will be set to red - cryTools.cryAnim.align._v.pointList.pivot[index].wireColor = (color 255 0 0) - else - --// otherwise to blue - cryTools.cryAnim.align._v.pointList.pivot[index].wireColor = (color 0 0 255) - ) - else - cryTools.cryAnim.align._v.pointList.pivot[index].wireColor = (color 0 0 255) - - --// generates the selection area for pivot points - cryTools.cryAnim.align._v.pointList.selection[index] = sphere pos:cryTools.cryAnim.align._v.pointList.pivot[index].pos radius:1 - cryTools.cryAnim.align._v.pointList.selection[index].name = ("sP" + (index as String) + "_(" + selectedBipPart.name + ")") - - --// hides the node (intersectRay still finds the mesh intersection of hidden nodes) - cryTools.cryAnim.align._v.pointList.selection[index].isHidden = true - - tempBaseLayer = layerManager.getLayer 0 - tempBaseLayer.current = true - - - return true - ) - catch ( logOutput "!!> Error in cryAnim.align._f.createPivotPoint" ) -) -createPivotPoint = undefined -logOutput "> Created cryAnim.align._f.createPivotPoint function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align.createPointEdge ----------------------------------------------------------------------------------------------------------------------------------- --- creates the points and edges for the selection ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.createPointEdge = function createPointEdge = -( - try - ( - --// gets selected object - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - local editMeshAdded = #() - - if selectedBipPart != undefined then - ( - with redraw off - ( - local baseMeshNotFound = undefined - - try ( getVert selectedBipPart.object.selected 1 ) catch ( baseMeshNotFound = true) - - if baseMeshNotFound == true then - ( - addModifier selectedBipPart.object.selected (edit_mesh()) - append editMeshAdded selectedBipPart.object.selected - ) - --// checks, what body part is selected - case (selectedBipPart.part.bodyPart) of - ( - /*Foot*/(cryTools.cryAnim._f.getBipNames 2): - ( - local child = undefined - local meshNotFound = undefined - - try ( child = selectedBipPart.object.selected.children[1] ) catch() - if child != undefined then - ( - try ( getVert child 1 ) catch ( meshNotFound = true ) - - if meshNotFound == true then - ( - addModifier child (edit_mesh()) - append editMeshAdded child - ) - ) - - for i = 1 to 10 do - ( - --// generates pivot points - cryTools.cryAnim.align._f.createPivotPoint i (cryTools.cryAnim._f.getPivotPointPos i selectedBipPart.object.selected) - --// generates pivot edges - case i of - ( - 2:( cryTools.cryAnim.align._f.createPivotEdge 1 ( cryTools.cryAnim._f.getPivotPointPos 2 selectedBipPart.object.selected ) ( cryTools.cryAnim._f.getPivotPointPos 5 selectedBipPart.object.selected ) ) - 5:( cryTools.cryAnim.align._f.createPivotEdge 2 ( cryTools.cryAnim._f.getPivotPointPos 5 selectedBipPart.object.selected ) ( cryTools.cryAnim._f.getPivotPointPos 7 selectedBipPart.object.selected ) ) - 7:( cryTools.cryAnim.align._f.createPivotEdge 3 ( cryTools.cryAnim._f.getPivotPointPos 7 selectedBipPart.object.selected ) ( cryTools.cryAnim._f.getPivotPointPos 4 selectedBipPart.object.selected ) ) - 4:( cryTools.cryAnim.align._f.createPivotEdge 4 ( cryTools.cryAnim._f.getPivotPointPos 4 selectedBipPart.object.selected ) ( cryTools.cryAnim._f.getPivotPointPos 2 selectedBipPart.object.selected ) ) - ) - ) - ) - /*Hand*/(cryTools.cryAnim._f.getBipNames 1): - ( - --// gets children of the selected object (fingers) - local childArray = cryTools.cryAnim._f.getChildren selectedBipPart.object.selected - - for i = 1 to 7 do - ( - --// creates pivot points for the hand - cryTools.cryAnim.align._f.createPivotPoint i (cryTools.cryAnim._f.getPivotPointPos i selectedBipPart.object.selected ) - ) - for i = 8 to (childArray.count + 7) do - ( - try (getVert childArray[i - 7] 1) - catch - ( - addModifier childArray[i - 7] (edit_mesh()) - append editMeshAdded childArray[i - 7] - ) - --// creates pivot points for the fingers - cryTools.cryAnim.align._f.createPivotPoint i (cryTools.cryAnim._f.getPivotPointPos i selectedBipPart.object.selected ) - ) - ) - ) - for i = 1 to editMeshAdded.count do - deleteModifier editMeshAdded[i] 1 - ) - ) - else - #stop - ) - catch ( logOutput "!!> Error in cryAnim.align._f.createPointEdge" ) -) -createPointEdge = undefined -logOutput "> Created cryAnim.align._f.createPointEdge function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.initVars ----------------------------------------------------------------------------------------------------------------------------------- --- deletes pivot points and initializes default pivot selection ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.initVars = function initVars = -( - try - ( - --// if there are still pivots in the scene, delete old pivots by deletePivotPoints() function - try - ( - if cryTools.cryAnim.align._v.pointList.pivot.count > 0 then - cryTools.cryAnim.align._f.deletePivotPoints() - ) catch() - - return true - ) - catch ( logOutput "!!> Error in cryAnim.align._f.initVars" ) -) -initVars = undefined -logOutput "> Created cryAnim.align._f.initVars function" - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.interactPivotPoints ----------------------------------------------------------------------------------------------------------------------------------- --- user interaction with pivot points and edges ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.interactPivotPoint = function interactPivotPoint = -( - try - ( - --// gets selected bip object - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - - --// var initialisation part - local worldRay = undefined - local tempDistance = #() - - local activePivot = #() - local nearestPivot = undefined - - --// stores all points and edges in pointEdgeSt structure via array - local pointEdgeList = pointEdgeSt pivot:(cryTools.cryAnim.align._v.pointList.pivot + cryTools.cryAnim.align._v.edgeList.pivot) selection:(cryTools.cryAnim.align._v.pointList.selection + cryTools.cryAnim.align._v.edgeList.selection) - - for i = 1 to pointEdgeList.selection.count do - ( - --// generates a ray from the mousecursor position into the viewport - worldRay = mapScreenToWorldRay (in coordsys screen mouse.pos) - --// checks, if the mouse cursor is over a pivot point or edge (worldRay intersects with geometry) - tempPivotRay = intersectRay pointEdgeList.selection[i] worldRay - - --// if the ray intersects with the pivot selection - if tempPivotRay != undefined then - ( - --// if the pivot selection is not the pivot selected already - if pointEdgeList.pivot[i].name != selectedBipPart.pivotSel.pivotName then - --// adds the hovered pivot point or edge to the activePivot list struct - append activePivot (activePivotSt interPivot:pointEdgeList.pivot[i] interPos:tempPivotRay.pos) - ) - ) - - --// if a pivot is hovered - if activePivot.count > 0 then - ( - --// if more than 1 pivot is hovered (happens when in left or front view for example - if activePivot.count > 1 then - ( - for i = 1 to activePivot.count do - --// stores all distances between the cursor pos (screen) and intersection position of the pivot point or edge - tempDistance[i] = (distance worldRay.pos activePivot[i].interPos) - - for i = 1 to activePivot.count do - ( - if nearestPivot == undefined then - -- if there is no nearestPivot before, make one - nearestPivot = activePivot[i] - else - --// checks, if the distance of the activePivot before, has a bigger distance then the current one - if (tempDistance[i]) < ( distance worldRay.pos nearestPivot.interPos ) then - --// if so, the current activePivot is the new one - nearestPivot = activePivot[i] - ) - --// interPivot (the pivot point or edge) is the new nearestPivot - nearestPivot = nearestPivot.interPivot - ) - else - --// if there is no further pivot point or edge in line, take the first one in list - nearestPivot = activePivot[1].interPivot - ) - else - --// if no pivot point or edge is hovered, set nearestPivot to undefined - nearestPivot = undefined - - if nearestPivot != undefined then - ( - --// if the hovered nearest pivot is not an already selected one - if nearestPivot.name != selectedBipPart.pivotSel.pivotName then - ( - --// set the wireColor to the hovered color - nearestPivot.wireColor = (color 250 190 30) - --// and set to tempSelection - used for clickAction - cryTools.cryAnim.align._v.pivotLast.tempSelection = nearestPivot - ) - ) - else - --// if there is no pivot selected, set tempSelection - used for clickAction - to undefined - cryTools.cryAnim.align._v.pivotLast.tempSelection = undefined - - for i = 1 to pointEdgeList.pivot.count do - ( - if pointEdgeList.pivot[i].name != selectedBipPart.pivotSel.pivotName then - ( - if pointEdgeList.pivot[i] != nearestPivot then - ( - --// if no pivot point or edge is already selected or hovered, then apply wireColor - if (substring pointEdgeList.pivot[i].name 1 1) == "p" then - --// for points - pointEdgeList.pivot[i].wireColor = (color 0 0 255) - else - --// for edges - pointEdgeList.pivot[i].wireColor = (color 20 50 100) - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim.align._f.interactPivotPoint" ) -) -interactPivotPoint = undefined -logOutput "> Created cryAnim.align._f.interactPivotPoint function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.setPivotPoint ----------------------------------------------------------------------------------------------------------------------------------- --- sets the selected pivot point to the structure ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.setPivotPoint = function setPivotPoint tempPivot = -( - try - ( - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - - --// filters the name to have only the number of the pivot - local tempFilterString = filterString tempPivot.name "_" - tempFilterString = substring tempFilterString[1] 2 tempFilterString[1].count - - --// sets the pivotList.pivotLast part to the selected pivot - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".index = " + tempFilterString ) - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivotName = \"" + tempPivot.name + "\"") - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".position = " + (tempPivot.pos as String)) - local childArray = cryTools.cryAnim._f.getChildren selectedBipPart.object.selected - local tempPivotIndex = tempFilterString as Integer - - - if tempPivotIndex <= 7 then - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivObject = \"" + selectedBipPart.object.selected.name + "\"" ) - else - ( - if selectedBipPart.part.bodyPart == "Hand" then - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivObject = \"" + childArray[tempPivotIndex - 7].name + "\"" ) - else - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivObject = \"" + childArray[1].name + "\"" ) - ) - return true - ) - catch ( logOutput "!!> Error in cryAnim.align._f.setPivotPoint" ) -) -setSelectedBipPart = undefined -logOutput "> Created cryAnim.align._f.setPivotPoint function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.clickAction ----------------------------------------------------------------------------------------------------------------------------------- --- user interaction for the pivot selection ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.clickAction = function clickAction = -( - try - ( - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - --// checks, if there was a pivot selected before - if selectedBipPart == undefined then return false - - --// if no pivot is selected before - if selectedBipPart.pivotSel.index == undefined then - ( - --// if there is a pivot currently hovered - if cryTools.cryAnim.align._v.pivotLast.tempSelection != undefined then - ( - --// on mouse click, set color of the current pivot to red - cryTools.cryAnim.align._v.pivotLast.tempSelection.wireColor = (color 255 0 0) - - --// stores all the infos in the state variable for use of other _f - cryTools.cryAnim.align._f.setPivotPoint cryTools.cryAnim.align._v.pivotLast.tempSelection - ) - ) - --// if a pivot were selected before - else - ( - --// if a pivot is currently hovered - if cryTools.cryAnim.align._v.pivotLast.tempSelection != undefined then - ( - --// on mouseclick sets color to red - cryTools.cryAnim.align._v.pivotLast.tempSelection.wireColor = (color 255 0 0) - --// stores the values in the variable for the use of other _f - cryTools.cryAnim.align._f.setPivotPoint cryTools.cryAnim.align._v.pivotLast.tempSelection - - for i = 1 to cryTools.cryAnim.align._v.pointList.pivot.count do - ( - --// checks, if the pivot in list is not the current pivot - if cryTools.cryAnim.align._v.pointList.pivot[i] != cryTools.cryAnim.align._v.pivotLast.tempSelection then - --// and sets the color to blue (because of not selected) - cryTools.cryAnim.align._v.pointList.pivot[i].wireColor = (color 0 0 255) - ) - - for i = 1 to cryTools.cryAnim.align._v.edgeList.pivot.count do - ( - --// checks, if the current pivot is not the current edge - if cryTools.cryAnim.align._v.edgeList.pivot[i] != cryTools.cryAnim.align._v.pivotLast.tempSelection then - --// and sets the color to "edgeBlue" - cryTools.cryAnim.align._v.edgeList.pivot[i].wireColor = (color 20 50 100) - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim.align._f.clickAction" ) -) -clickAction = undefined -logOutput "> Created cryAnim.align._f.clickAction function" - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.deletePivotPoints ----------------------------------------------------------------------------------------------------------------------------------- --- deletes pivot points (spheres and edges) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.deletePivotPoints = function deletePivotPoints = -( - try - ( - for i = 1 to cryTools.cryAnim.align._v.pointList.pivot.count do - ( - try - ( - --// tries to delete the pivot points - delete cryTools.cryAnim.align._v.pointList.pivot[i] - delete cryTools.cryAnim.align._v.pointList.selection[i] - )catch() - ) - - for i = 1 to cryTools.cryAnim.align._v.edgeList.pivot.count do - ( - try - ( - --// tries to delete the pivot edges - delete cryTools.cryAnim.align._v.edgeList.pivot[i] - delete cryTools.cryAnim.align._v.edgeList.selection[i] - )catch() - ) - - cryTools.cryAnim.align._v.pointList.pivot = #() - cryTools.cryAnim.align._v.pointList.selection = #() - - cryTools.cryAnim.align._v.edgeList.pivot = #() - cryTools.cryAnim.align._v.edgeList.selection = #() - ) - catch ( logOutput "!!> Error in cryAnim.align._f.deletePivotPoints" ) -) -deletePivotPoints = undefined -logOutput "> Created cryAnim.align._f.deletePivotPoints function" - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.switchViewPort ----------------------------------------------------------------------------------------------------------------------------------- --- switches between viewports, if there are more than 1 viewport ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.switchViewPort = function switchViewPort = -( - try - ( - local numViews = viewport.numViews - local viewSize = getViewSize() - - - case numViews of - ( - 4: - ( - if mouse.screenpos[1] < viewSize[1] then - ( - if mouse.screenpos[2] < (viewSize[2]+74) then - if viewport.activeViewport != 1 then viewport.activeViewport = 1 - if mouse.screenpos[2] > (viewSize[2]+74) then - if viewport.activeViewport != 3 then viewport.activeViewport = 3 - ) - - if mouse.screenpos[1] > viewSize[1] then - ( - if mouse.screenpos[2] < (viewSize[2]+74) then - if viewport.activeViewport != 2 then viewport.activeViewport = 2 - if mouse.screenpos[2] > (viewSize[2]+74) then - if viewport.activeViewport != 4 then viewport.activeViewport = 4 - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim.align._f.switchViewPort" ) -) -switchViewPort = undefined -logOutput "> Created cryAnim.align._f.switchViewPort function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.align._f.callPivotSelect ----------------------------------------------------------------------------------------------------------------------------------- --- creates the tool ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.align._f.callPivotSelect = function callPivotSelect = -( - try - ( - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart == undefined then return undefined - if selectedBipPart.object.isPivot == false then return false - - - tool pivotSelect - ( - on start do - ( - --// initialise variables for global use - cryTools.cryAnim.align._f.initVars() - cryTools.cryAnim.align._f.createPointEdge() - ) - - on freeMove do - ( - --// makes the recognition of mouse interaction - cryTools.cryAnim.align._f.switchViewPort() - cryTools.cryAnim.align._f.interactPivotPoint() - ) - - on mousePoint click do - ( - --// switches trough pivots and highlights them, as well sets global variables for other _f - cryTools.cryAnim.align._f.switchViewPort() - cryTools.cryAnim.align._f.clickAction() - ) - - on mouseMove click do - ( - --// after the first click is finished, it waits for the mouse click to start the function - if click == 1 then - --// switches trough pivots and highlights them, as well sets global variables for other _f - cryTools.cryAnim.align._f.clickAction() - - --// makes the recognition of mouse interaction - cryTools.cryAnim.align._f.switchViewPort() - cryTools.cryAnim.align._f.interactPivotPoint() - ) - - on stop do - ( - --// deletes the used nodes - cryTools.cryAnim.align._f.deletePivotPoints() - ) - ) - cryTools.cryAnim.align.pivotSelect = pivotSelect - pivotSelect = undefined - - startTool cryTools.cryAnim.align.pivotSelect - ) - catch ( logOutput "!!> Error in cryAnim.align._f.callPivotSelect" ) -) -callPivotSelect = undefined -logOutput "> Created cryAnim.align._f.callPivotSelect function" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main._f.getUI ----------------------------------------------------------------------------------------------------------------------------------- --- returns the UI element (rollout, rollout controls/control) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main._f.getUI = function getUI rolloutTitle element = -( - try - ( - tempInt = undefined - tempCon = undefined - tempElement = undefined - local tempArray = #() - - - try - ( - for i = 1 to cryTools.cryAnim.UI.main.dialog.controls.count do - ( - for f = 1 to cryTools.cryAnim.UI.main.dialog.controls[i].rollouts.count do - ( - if cryTools.cryAnim.UI.main.dialog.controls[i].rollouts[f].title == rolloutTitle then - ( - tempInt = f - tempCon = i - ) - if cryTools.cryAnim.UI.main.dialog.controls[i].rollouts[f].name == rolloutTitle then - ( - tempInt = f - tempCon = i - ) - - append tempArray cryTools.cryAnim.UI.main.dialog.controls[i].rollouts[f] - ) - ) - ) - catch(return undefined) - - try - ( - if element == "" then - ( - if rolloutTitle == "" then - return tempArray - else - return cryTools.cryAnim.UI.main.dialog.controls[tempCon].rollouts[tempInt] - ) - )catch() - - - try - ( - for i = 1 to cryTools.cryAnim.UI.main.dialog.controls[tempCon].rollouts[tempInt].controls.count do - ( - if cryTools.cryAnim.UI.main.dialog.controls[tempCon].rollouts[tempInt].controls[i].name == element then tempElement = i - if cryTools.cryAnim.UI.main.dialog.controls[tempCon].rollouts[tempInt].controls[i].text == element then tempElement = i - ) - ) - catch(return undefined) - - - - - - if tempCon != undefined and tempInt != undefined and tempElement != undefined then - try ( execute ("return cryTools.cryAnim.UI.main.dialog.controls[" + tempCon as String + "].rollouts[" + tempInt as String + "].controls[" + tempElement as String + "]") ) catch() - - if tempInt != 0 then - try ( execute ("return cryTools.cryAnim.UI.main.dialog.controls[" + tempCon as String + "].rollouts[" + tempInt as String + "].controls") ) catch() - else - return undefined - ) - catch ( logOutput "!!> Error in cryAnim.UI.main._f." ) -) -getUI = undefined -logOutput "> Created cryAnim.UI.main._f.getUI function" - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main._f.checkExport ----------------------------------------------------------------------------------------------------------------------------------- --- checks the file path before saving or exporting, converts file path to .caf or to the project path, creates a folder ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main._f.checkExport = function checkExport op filepath = -( - try - ( - abortBool = false - - tempArray = filterString (cryTools.cryAnim.base.lowercase filepath) "\\" - tempBUIldPath = (filterString (cryTools.cryAnim.base.lowercase crytools.BUIldPathFull) "\\") - - case op of - ( - #save: - ( - if (biped.getCurrentLayer $'Bip01'.controller) > 0 then - ( - messageBox "Collapse Layers or choose Base Layer to Save" title:"Save Biped" - return false - ) - - /* - if tempArray[1] != tempBUIldPath[1] then abortBool = true - - if abortBool == true then - return false - else - return true - */ - return true - ) - - #saveExport: - ( - if (biped.getCurrentLayer $'Bip01'.controller) > 0 then - ( - messageBox "Collapse Layers or choose Base Layer to Save" title:"Save Biped" - return false - ) - - /* - if tempArray[1] != tempBUIldPath[1] then abortBool = true - if tempArray[2] != tempBUIldPath[2] + "_production" then abortBool = true - if tempArray[3] != "art" then abortBool = true - if tempArray[4] != "animation" then abortBool = true - if tempArray[5] != "human" then abortBool = true - - - if abortBool == true then - ( - messageBox ("\nSave to " + (substring crytools.BUIldPathFull 1 (crytools.BUIldPathFull.count - 1)) + "_Production\\Art\\Animation\\Human\\Male\\ \n\n or use the \"Save\" button\n\n(Resource Compiler)") title:"Export Animation" - return false - ) - */ - cryTools.cryAnim.UI.main._f.checkExport #createFolder filepath - return true - ) - #export: - ( - /* - if tempArray[1] != tempBUIldPath[1] then (abortBool = true; print "erste zeile") - if tempArray[2] != tempBUIldPath[2] then (abortBool = true; print "zweite zeile") - if tempArray[3] != "game" then (abortBool = true; print "dritte zeile") - if tempArray[4] != "animations" then (abortBool = true; print "fünfte zeile") - - if abortBool == true then - ( - messageBox ("\nSave to " + crytools.BUIldPathFull + "Game\\Animations\\ \n\n(Resource Compiler)") title:"Export Animation" - return false - ) - - cryTools.cryAnim.UI.dialog._f.checkExport #createFolder filepath - */ - return true - ) - - #ProductionToGame: - ( - try - ( - filepathFilter = filterString filepath "\\" - workingDirFilter = filterString cryTools.cryAnim.UI.main._v.bipWorkingDir "\\" - cafSavePath = cryTools.cryAnim.UI.main._v.cafWorkingDir - - if filepathFilter.count != workingDirFilter.count then - ( - for i = (workingDirFilter.count + 1) to filepathFilter.count do - cafSavePath += filepathFilter[i] + (if i != filepathFilter.count then "\\" else "") - - ) - - return (cryTools.cryAnim.UI.main._f.checkExport #getCaf cafSavePath) - ) - catch ( return cryTools.cryAnim.UI.main._v.cafSavePath ) - - ) - - #getCaf: - ( - local tempArray = filterString filepath "." - return (tempArray[1] + ".caf") - ) - - - #createFolder: - ( - if filePath != undefined then - ( - tempPath = filterString filepath "\\" - maxItems = tempPath.count - for i = 1 to tempPath.count do - ( - if findString tempPath[i] "." != undefined then - ( - maxItems = i - 1 - exit - ) - ) - tempString = "" - for i = 1 to maxItems do - ( - if i == 1 then - tempString = tempPath[i] - else - tempString += "\\" + tempPath[i] - - makeDir tempString - ) - return tempString - ) - else return false - ) - - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main._f.checkExport" ) -) -checkExport = undefined -logOutput "> Created cryAnim.UI.main._f.checkExport function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main._f.updateDialog ----------------------------------------------------------------------------------------------------------------------------------- --- updates the main dialog, sets new size ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main._f.updateDialog = function updateDialog = -( - try - ( - local maxRowHeight = 0 - - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - ( - local rowCount = 0 - - for i = 1 to cryTools.cryAnim.UI.main.dialog.controls.count do - ( - rowHeight = 0 - - if cryTools.cryAnim.UI.main.dialog.controls[i].rollouts.count > 0 then - rowCount = i - - for f = 1 to cryTools.cryAnim.UI.main.dialog.controls[i].rollouts.count do - ( - if cryTools.cryAnim.UI.main.dialog.controls[i].rollouts[f].open == true then - rowHeight += cryTools.cryAnim.UI.main.dialog.controls[i].rollouts[f].height + 4 - - rowHeight += 21.5 - ) - - - cryTools.cryAnim.UI.main.dialog.controls[i].height = rowHeight - - if rowHeight > maxRowHeight then - maxRowHeight = rowHeight + 4 - ) - - if maxRowHeight > cryTools.cryAnim.UI.main._v.dialogMaxHeight then - maxRowHeight = cryTools.cryAnim.UI.main._v.dialogMaxHeight - - if maxRowHeight > 637 then - maxRowHeight = 637 - - for i = 1 to cryTools.cryAnim.UI.main.dialog.controls.count do - cryTools.cryAnim.UI.main.dialog.controls[i].height = maxRowHeight + 4 - - - cryTools.cryAnim.UI.main.dialog.height = maxRowHeight + 8 - cryTools.cryAnim.UI.main.dialog.width = rowCount * 173 - ) - else - ( - for i = 1 to cryTools.cryAnim.UI.main.dialog.row1.rollouts.count do - ( - if cryTools.cryAnim.UI.main.dialog.row1.rollouts[i].open == true then - maxRowHeight += cryTools.cryAnim.UI.main.dialog.row1.rollouts[i].height + 4 - - maxRowHeight += 21.5 - ) - - if maxRowHeight > cryTools.cryAnim.UI.main._v.dialogMaxHeight then - maxRowHeight = cryTools.cryAnim.UI.main._v.dialogMaxHeight - - cryTools.cryAnim.UI.main.dialog.height = maxRowHeight - cryTools.cryAnim.UI.main.dialog.row1.height = maxRowHeight - 4 - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main._f.updateDialog" ) -) -updateDialog = undefined -logOutput "> Created cryAnim.UI.main._f.updateDialog function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main._f.callDialog ----------------------------------------------------------------------------------------------------------------------------------- --- creates the main dialog with all the rollouts and elements ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main._f.callDialog = function callDialog = -( - try - ( - try - ( - if cryTools.showSplash == true then - ( - if crySplash.open == false then - ( - bm = (openBitmap (crytools.BuildPathFull + "Tools\\maxscript\\icons\\splash.png")) - createDialog crysplash style:#(#style_border) modal:false bitmap:bm width:bm.width height:bm.height fgcolor:white - ) - try (crysplash.build.text = "LOADING DIALOG") catch() - ) - )catch() - - - if cryTools.cryAnim.UI.main.dialog != undefined then - destroyDialog cryTools.cryAnim.UI.main.dialog - - - - - global initializeDialog = true - - --// dialog template - rollout cryAnimDialog "CryAnim v3.2" - ( - subrollout row1 pos:[2,2] width:170 height:(cryTools.cryAnim.UI.main.dialog.height-4) - subrollout row2 pos:[175,2] width:170 height:(cryTools.cryAnim.UI.main.dialog.height-4) - subrollout row3 pos:[348,2] width:170 height:(cryTools.cryAnim.UI.main.dialog.height-4) - subrollout row4 pos:[521,2] width:170 height:(cryTools.cryAnim.UI.main.dialog.height-4) - - on cryAnimDialog moved value do - if initializeDialog == undefined then - cryTools.cryAnim.base.iniFile #set #dialogPos - ) - cryTools.cryAnim.UI.main.dialog = cryAnimDialog - cryAnimDialog = undefined - - createDialog cryTools.cryAnim.UI.main.dialog 173 579 style:#(#style_minimizebox,#style_titlebar,#style_border,#style_sysmenu) lockWidth:true lockHeight:false pos:[-1000,0] - - initializeDialog = undefined - - cryTools.cryAnim.base.iniFile #set #visible value:"1" - - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\target.ms") - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\operation.ms") - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\pivot.ms") - - if (maxVersion())[1] >= 9000 then - ( - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\batch\\batch9.ms") - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\models\\models9.ms") - ) - else - ( - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\batch\\batch8.ms") - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\models\\models8.ms") - ) - - - if cryTools.domain == "INTERN.CRYTEK.DE" then - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\muscle.ms") - - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\locator.ms") - - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\save.ms") - - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\pose.ms") - - if cryTools.cryAnim._v.perforceDir != undefined then - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\perforce.ms") - fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\main\\tools.ms") - - - - - if (local dialogPos = cryTools.cryAnim.base.iniFile #get #dialogPos) != undefined then - try ( setDialogPos cryTools.cryAnim.UI.main.dialog dialogPos )catch() - else - try ( setDialogPos cryTools.cryAnim.UI.main.dialog ( (getMAXWindowSize() / 2) - ((getDialogSize cryTools.cryAnim.UI.main.dialog) / 2) ) )catch() - - - - try destroyDialog crySplash catch() - - ) - catch ( logOutput "!!> Error in cryAnim.UI.main._f.callDialog" ) -) -callDialog = undefined -logOutput "> Created cryAnim.UI.main._f.callDialog function" - - - - - - - - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList = function subRangeUpdateList = --// updateList -( - try - ( - local tempList = #() - local listEntries = cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges - - - for i = 1 to listEntries.count do - ( - local tempStart = listEntries[i].range.start.frame as Integer - local tempStop = listEntries[i].range.end.frame as Integer - local tempObjectsName = "" - - for f = 1 to listEntries[i].objects.count do - tempObjectsName += listEntries[i].objects[f] + (if f < listEntries[i].objects.count then "; " else "") - - local tempString = listEntries[i].export + " (" + tempObjectsName + ") <" + tempStart as String + "> <" + tempStop as String + ">" - - append tempList tempString - ) - - cryTools.cryAnim.UI.batchProcess.subRangeDialog.lbObjects.items = tempList - ) - catch() - --catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeUpdateList" ) -) -subRangeUpdateList = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeUpdateList function" - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeGetRange = function subRangeGetRange objectArray = --// getRange -( - try - ( - local tempStart = 0 - local tempStop = 0 - - for obj in objectArray do - ( - if obj != undefined then - ( - for i = 1 to 2 do - ( - if obj[3][i].keys.count > 0 then - ( - if obj[3][i].keys[obj[3][i].keys.count].time.frame > tempStop then - tempStop = obj[3][i].keys[obj[3][i].keys.count].time.frame - - if obj[3][i].keys.count > 1 then - if obj[3][i].keys[1].time.frame < tempStart then - tempStart = obj[3][i].keys[1].time.frame - ) - ) - ) - ) - - return (interval (tempStart as Integer) (tempStop as Integer) ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeGetRange" ) -) -subRangeGetRange = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeGetRange function" - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateRange = function subRangeUpdateRange index = --// updateRange -( - try - ( - if cryTools.cryAnim.UI.batchProcess.subRangeDialog.open == true then - ( - local listEntries = cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges - local newObjects = #() - - for i = 1 to listEntries[index].objects.count do - newObjects[i] = getNodeByName listEntries[index].objects[i] - - - - local tempRange = cryTools.cryAnim.UI.batchProcess._f.subRangeGetRange newObjects - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges[index].range = tempRange - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeUpdateRange" ) -) -subRangeUpdateRange = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeUpdateRange function" - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues = function subRangeUpdateValues = --// updateValues -( - try - ( - if cryTools.cryAnim.UI.batchProcess.subRangeDialog.open == true then - ( - local lbObjects = cryTools.cryAnim.UI.batchProcess.subRangeDialog.lbObjects - local listEntries = cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges - local edAnimName = cryTools.cryAnim.UI.batchProcess.subRangeDialog.edAnimName - local edPrefixName = cryTools.cryAnim.UI.batchProcess.subRangeDialog.edPrefixName - local labObjects = cryTools.cryAnim.UI.batchProcess.subRangeDialog.labObjects - - local spnStart = cryTools.cryAnim.UI.batchProcess.subRangeDialog.spnStart - local spnStop = cryTools.cryAnim.UI.batchProcess.subRangeDialog.spnStop - - edPrefixName.text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRangePrefix - - if lbObjects.selection != 0 then - ( - spnStart.value = listEntries[lbObjects.selection].range.start - spnStop.value = listEntries[lbObjects.selection].range.end - - local tempObjectsName = "" - for i = 1 to listEntries[lbObjects.selection].objects.count do - tempObjectsName += listEntries[lbObjects.selection].objects[i] + (if i < listEntries[lbObjects.selection].objects.count then "; " else "") - - labObjects.text = tempObjectsName - - edAnimName.text = listEntries[lbObjects.selection].export - ) - else - ( - spnStart.value = 0 - spnStop.value = 0 - - labObjects.text = "None" - - edAnimName.text = "" - ) - ) - ) - catch() - --catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeUpdateValues" ) -) -subRangeUpdateValues = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeUpdateValues function" - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeSetList = function subRangeSetList objArray = --// setList -( - try - ( - if cryTools.cryAnim.UI.batchProcess.subRangeDialog.open == true then - ( - local edPrefixName = cryTools.cryAnim.UI.batchProcess.subRangeDialog.edPrefixName - local tempInterval = cryTools.cryAnim.UI.batchProcess._f.subRangeGetRange objArray - local listEntries = cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges - - try - ( - for i = 1 to objArray.count do - objArray[i] = objArray[i].name - )catch() - - append listEntries (subRangeStruct objects:objArray range:tempInterval export:objArray[1]) - - - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRangePrefix == "" then - try (cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRangePrefix = (filterString maxFileName "_")[1]) catch() - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges = listEntries - - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeSetList" ) -) -subRangeSetList = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeSetList function" - - - - - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeLoadFromDummy = function subRangeLoadFromDummy = --// loadFromDummy -( - try - ( - local listEntries = cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges - try (local edPrefixName = cryTools.cryAnim.UI.batchProcess.subRangeDialog.edPrefixName) catch() - - if (local rangeDummy = getNodeByName "subRangeDummy") != undefined then - ( - try - ( - local UDPArray = #() - - local prefix = getUserProp rangeDummy "subRangePrefix" - - local errorArray = #() - - - for i = 1 to 100 do - ( - if (local UDPString = (getUserProp rangeDummy ("subRange" + i as String))) != undefined then - ( - local filterArray = filterString UDPString "#" - local objectsArrayString = filterString filterArray[1] ";" - local objectsArray = #() - - local range = execute (filterArray[2]) - - if objectsArrayString.count > 0 then - append listEntries (subRangeStruct objects:objectsArrayString range:range export:filterArray[3]) - ) - ) - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges = listEntries - - - try (edPrefixName.text = prefix) catch() - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRangePrefix = prefix - - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog() - - return true - - )catch() - - return false - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeLoadFromDummy" ) -) -subRangeLoadFromDummy = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeLoadFromDummy function" - - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog = function subRangeUpdateDialog = -( - try - ( - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - ) - catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeUpdateDialog" ) -) -subRangeUpdateDialog = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeUpdateDialog function" - - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeCreateUDPString = function createUDPString importIndex:undefined = -( - try - ( - if importIndex == undefined then - importIndex = cryTools.cryAnim.UI.batchProcess._v.selectedFile - - - local listEntries = cryTools.cryAnim.UI.batchProcess._v.exportFiles[importIndex]--.subRanges - - if $subRangeDummy == undefined then - ( - local saveDummy = dummy name:"subRangeDummy" - saveDummy.isHidden = true - ) - else - local saveDummy = getNodeByName "subRangeDummy" - - - local UDPArray = filterString (getUserPropBuffer saveDummy) "\r\n" - - local UDPString = "" - for i = 1 to UDPArray.count do - if (findString UDPArray[i] "subRange") == undefined then - UDPString += UDPArray[i] + "\r\n" - - - - UDPString += "subRangePrefix=" + listEntries.subRangePrefix + "\r\n"--edPrefixName.text + "\r\n" - - for i = 1 to listEntries.subRanges.count do - ( - local listString = "subRange" + i as String + "=" - for f = 1 to listEntries.subRanges[i].objects.count do - listString += listEntries.subRanges[i].objects[f] + (if f < listEntries.subRanges[i].objects.count then ";" else "") - - listString += "#" + listEntries.subRanges[i].range as String + "#" + listEntries.subRanges[i].export as String + "\r\n" - - UDPString += listString - ) - - return UDPString - ) - catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeCreateUDPString" ) -) -subRangeCreateUDPString = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeCreateUDPString function" - - - - - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.subRangeCallDialog = function subRangeCallDialog = -( - try - ( - try ( destroyDialog cryTools.cryAnim.UI.batchProcess.subRangeDialog ) catch() - - rollout subRangeRO "Sub-Ranges" width:200 height:364 - ( - - button btnAddObjects "Add Entry" pos:[8,10] width:184 height:20 - listbox lbObjects "" pos:[8,40] width:184 height:18 - label labStart "Start" pos:[22,287] width:32 height:16 - spinner spnStart "" pos:[8,303] width:60 height:16 range:[-30000,30000,0] type:#integer scale:0.5 - label labStop "Stop" pos:[82,287] width:32 height:14 - spinner spnStop "" pos:[72,303] width:56 height:16 range:[-30000,30000,0] type:#integer scale:0.5 - button btnDelete "Delete" pos:[140,300] width:50 height:20 - - label labObjects "None" pos:[8,323] width:70 height:25 - button btnObject "Objects" pos:[140,327] width:50 height:20 - - label labPrefixName "Prefix:" pos:[8,358] - edittext edPrefixName "" pos:[70,355] fieldWidth:118 height:1 - - label labAnimName "Anim Name:" pos:[8,378] - edittext edAnimName "" pos:[70,375] fieldWidth:118 height:1 - - button btnSaveToScene "S A V E T O S C E N E" pos:[8,408] width:184 height:20 - button btnSaveToMaxFile "S A V E T O M A X F I L E" pos:[8,438] width:184 height:20 - - - - - - - on subRangeExport open do - ( - cryTools.cryAnim.UI.batchProcess._f.subRangeLoadFromDummy() - - - if $selection.count > 0 then - ( - if (queryBox "Load current Selection into the List?" title:"Sub-Range-Export") == true then - ( - cryTools.cryAnim.UI.batchProcess._f.subRangeSetList (selection as Array) - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - return true - ) - ) - ) - - - on btnAddObjects pressed do - ( - if $selection.count > 0 then - ( - if (queryBox "Load current Selection into the List?" title:"Sub-Range-Export") == true then - ( - cryTools.cryAnim.UI.batchProcess._f.subRangeSetList (selection as Array) - lbObjects.selection = 1 - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - return true - ) - ) - - if (local tempSel = selectByName title:"Select Nodes to be Added") != undefined then - cryTools.cryAnim.UI.batchProcess._f.subRangeSetList tempSel - - lbObjects.selection = 1 - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - ) - - - - on btnDelete pressed do - ( - if lbObjects.selection != 0 then - ( - deleteItem cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges lbObjects.selection - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - - if lbObjects.selection <= 0 then - lbObjects.selection = lbObjects.items.count - - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - ) - ) - - - on btnObject pressed do - ( - if lbObjects.selection != 0 then - ( - local tempSel = selectByName title:"Select Nodes" - local newObjects = #() - - if tempSel != undefined then - ( - for i = 1 to tempSel.count do - tempSel[i] = tempSel[i].name - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges[lbObjects.selection].objects = tempSel - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateRange lbObjects.selection - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - ) - ) - ) - - - on lbObjects selected value do - ( - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateValues() - ) - - - on spnStart changed value do - ( - if lbObjects.selection != 0 then - ( - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges[lbObjects.selection].range.start = value - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - ) - ) - - - on spnStop changed value do - ( - if lbObjects.selection != 0 then - ( - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges[lbObjects.selection].range.end = value - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - ) - ) - - - on edPrefixName changed value do - ( - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRangePrefix = value - --cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - ) - - - - - on edAnimName changed value do - ( - if lbObjects.selection != 0 then - ( - cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges[lbObjects.selection].export = value - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - ) - ) - - - - - - - - - - on btnSaveToScene pressed do - ( - if lbObjects.items.count == 0 and spnStart.value == 0 and spnStop.value == 0 and edPrefixName.text == "" and edAnimName.text == "" then - ( - if (getNodeByName "subRangeDummy") != undefined then - if (queryBox "Delete subRange Dummy in current Scene ?" title:"CryAnim Batch Process") == true then - try delete (getNodeByName "subRangeDummy") catch() - ) - else - ( - if $subRangeDummy == undefined then - ( - local saveDummy = dummy name:"subRangeDummy" - saveDummy.isHidden = true - ) - else - local saveDummy = getNodeByName "subRangeDummy" - - - local UDPString = cryTools.cryAnim.UI.batchProcess._f.subRangeCreateUDPString() - local importANM = true - - if cryTools.cryAnim.UI.batchProcess._v.flags[10] == false then - local importANM = queryBox "Overwrite current Scene ?" title:"CryAnim Batch Process" - - - - if importANM == true then - setUserPropBuffer saveDummy UDPString - ) - ) - - - - - on btnSaveToMaxFile pressed do - ( - try - ( - if (queryBox "Save .anm settings to selected .max file ?\n\n(Loads selected max file and saves settings)" title:"CryAnim Batch Process") == true then - ( - local tempSel = cryTools.cryAnim.UI.batchProcess._v.selectedFile - - - cryTools.cryAnim.UI.batchProcess._v.flags[10] = true - - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].btnLoadFile.pressed() - - - if $subRangeDummy == undefined then - ( - local saveDummy = dummy name:"subRangeDummy" - saveDummy.isHidden = true - ) - else - local saveDummy = getNodeByName "subRangeDummy" - - - local UDPString = cryTools.cryAnim.UI.batchProcess._f.subRangeCreateUDPString importIndex:tempSel - local importANM = true - - - setUserPropBuffer saveDummy UDPString - - - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].btnImportANM.pressed() - - cryTools.cryAnim.UI.batchProcess._v.flags[10] = false - - ) - ) - catch() - ) - - ) - cryTools.cryAnim.UI.batchProcess.subRangeDialog = subRangeRO - subRangeRO = undefined - - local newDialogPos = cryTools.cryAnim.UI.batchProcess.dialog.pos - [205,-23] - createDialog cryTools.cryAnim.UI.batchProcess.subRangeDialog 200 464 newDialogPos[1] newDialogPos[2] style:#(#style_border) - ) - catch ( logOutput "!!> Error in cryAnim.UI.batchProcess._f.subRangeCallDialog" ) -) -subRangeCallDialog = undefined -logOutput "> Created cryAnim.UI.batchProcess._f.subRangeCallDialog function" - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.addNode ----------------------------------------------------------------------------------------------------------------------------------- --- adds children to an array ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.addNode = function addNode treeView tempNode tempChildren = -( - try - ( - for child in tempChildren do - ( - --// creates an string array of all subfolders - tempString = filterString child "\\" - tempString = tempString[tempString.count] - - --// adds the last sub folder to the visible sub folders list - if classOf treeView == ActiveXControl then - ( - local newNode = treeView.Nodes.add tempNode.index 4 "" tempString - --// sorts the entry - newNode.sorted = true - ) - else - local newNode = tempNode.Nodes.add tempString tempString - - --// adds the whole path to the seperate sub folders list - append cryTools.cryAnim.UI.batchProcess._v.subFolders (subFolderStruct path:child node:newNode) - - - --// gets all directories in the current sub folder - folderArray = getDirectories (child + "*") - cryTools.cryAnim.UI.batchProcess._f.addNode treeView newNode folderArray - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.addNode" ) -) -addNode = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.addNode function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection ----------------------------------------------------------------------------------------------------------------------------------- --- save and get all checked entries into the ini file ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection = function updateSubFolderSelection op = -( - try - ( - case op of - ( - #set: - ( - local tempString = "#" - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.subFolders.count do - ( - if cryTools.cryAnim.UI.batchProcess._v.subFolders[i].node.checked == true then - tempString += (cryTools.cryAnim.base.lowercase cryTools.cryAnim.UI.batchProcess._v.subFolders[i].path) + "#" - ) - - cryTools.cryAnim.base.iniFile #set #batchProcessSubFolderSelection value:tempString - ) - - #get: - ( - local tempVar = cryTools.cryAnim.base.iniFile #get #batchProcessSubFolderSelection - if tempVar != "" then - ( - local tempFilter = filterString tempVar "#" - - cryTools.cryAnim._v.various[120] = true - - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.subFolders.count do - ( - local oldFolder = cryTools.cryAnim.base.lowercase cryTools.cryAnim.UI.batchProcess._v.subFolders[i].path - if (index = findItem tempFilter oldFolder) != 0 then - ( - local tempNode = cryTools.cryAnim.UI.batchProcess._v.subFolders[i].node - tempNode.checked = true - try - ( - local parentNode = tempNode.parent - - while parentNode != undefined do - ( - parentNode.expanded = true - parentNode = parentNode.parent - ) - )catch() - ) - ) - cryTools.cryAnim._v.various[120] = undefined - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection" ) -) -updateSubFolderSelection = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getCheckedNodes ----------------------------------------------------------------------------------------------------------------------------------- --- clears the sub folder list and adds new entries ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getCheckedNodes = function getCheckedNodes = -( - try - ( - local tempArray = #() - - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.subFolders.count do - ( - if cryTools.cryAnim.UI.batchProcess._v.subFolders[i].node.checked == true then - append tempArray i - ) - return tempArray - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getCheckedNodes" ) -) -getCheckedNodes = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getCheckedNodes function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.updateSubFolders ----------------------------------------------------------------------------------------------------------------------------------- --- clears the sub folder list and updates it with new entries ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.updateSubFolders = function updateSubFolders = -( - try - ( - local lbSubFolders = cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbSubFolders - --// clears lists - lbSubFolders.Nodes.clear() - cryTools.cryAnim.UI.batchProcess._v.subFolders = #() - - --// if there is a folder selected in rollout[2] - if findString cryTools.cryAnim.UI.batchProcess._v.sourcePath "\\" != undefined then - ( - - --// gets latest sub folder name for the root of the sub folders list - rootText = filterString cryTools.cryAnim.UI.batchProcess._v.sourcePath "\\" - rootText = rootText[rootText.count] - - --// adds a new entry to the sub folders list - if classOf lbSubFolders != ActiveXControl then - ( - root = lbSubFolders.Nodes.add rootText rootText - root.tag = rootText - ) - else - ( - root = lbSubFolders.Nodes.add() - root.text = rootText - ) - - --// adds the full path of the root folder to the seperate list - append cryTools.cryAnim.UI.batchProcess._v.subFolders (subFolderStruct path:cryTools.cryAnim.UI.batchProcess._v.sourcePath node:root) - - if classOf lbSubFolders == ActiveXControl then - ( - if (findString (cryTools.cryAnim.base.iniFile #get #batchProcessSubFolderSelection) "\\") == undefined then - ( - root.checked = true - cryTools.cryAnim.UI.batchProcess._v.subFolders[cryTools.cryAnim.UI.batchProcess._v.subFolders.count].checked = true - ) - ) - --// gets sub directories of the root folder - folderArray = getDirectories (cryTools.cryAnim.UI.batchProcess._v.sourcePath + "*") - --// adds all sub folders in sub folders to the list - cryTools.cryAnim.UI.batchProcess._f.addNode lbSubFolders root folderArray - - if classOf lbSubFolders == ActiveXControl then - ( - root.Expanded = true - root.Bold = true - ) - else - root.Expand() - ) - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.updateSubFolders" ) -) -updateSubFolders = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.updateSubFolders function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.updateCounter ----------------------------------------------------------------------------------------------------------------------------------- --- gets all selected or unselected files and updates the count string ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.updateCounter = function updateCounter = -( - try - ( - counter = 0 - maxFiles = 0 - tempText = "Count :" - - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - ( - local tempVar = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i] - - if tempVar.extension != "folder" then --and tempVar.extension != "scene" then - ( - maxFiles += 1 - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].used = tempVar.node.selected - - if tempVar.node.selected == true then - counter += 1 - else - ( - if tempVar.extension == "scene" then - maxFiles -= 1 - ) - ) - else - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].used = false - - ) - - --// if nothing is selected or everything is selected - if (counter == 0) or (counter == maxFiles) then - ( - --// go through the files list (scene entry only, if selected) and set used to true - for i = (cryTools.cryAnim.UI.batchProcess._v.exportFiles.count - maxFiles + 1) to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].used = true - - --// no addition to the counter string - counter = "" - ) - --// if something is selected - else - --// add a seperator to the counter string - counter = counter as String + " / " - - --// update the count string with the "Count :" and the selected files (if some were selected) and the maximum file count - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].labCount.text = tempText + " " + counter + maxFiles as String - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.updateCounter" ) -) -updateCounter = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.updateCounter function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getScriptList ----------------------------------------------------------------------------------------------------------------------------------- --- gets the list of all custom scripts in the batch directory ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getScriptList = function getScriptList scriptPath = -( - try - ( - local tempArray = getFiles scriptPath - local tempEntries = #() - - if tempArray.count > 0 then - ( - - for i = 1 to tempArray.count do - ( - local tempFilter = filterString tempArray[i] "\\" - local tempString = (filterString tempFilter[tempFilter.count] ".")[1] - - - append tempEntries tempString - ) - ) - - append tempEntries "----------------------------------------------" - append tempEntries "Cusomize Scripts" - - return tempEntries - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getScriptList" ) -) -getScriptList = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getScriptList function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.updateScriptLists ----------------------------------------------------------------------------------------------------------------------------------- --- updates the list of scripts in the customize script drob-down lists ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.updateScriptLists = function updateScriptLists scriptUpdate:undefined = -( - try - ( - local ddOp1 = cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp1 - local ddOp2 = cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp2 - local ddOp3 = cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp3 - local ddOp4 = cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp4 - - ddOp1.items = cryTools.cryAnim.UI.batchProcess._f.getScriptList (cryTools.buildpathfull + "Tools\\maxscript\\cryAnim\\ui\\batch\\Scripts\\*.ms") - ddOp2.items = cryTools.cryAnim.UI.batchProcess._f.getScriptList (cryTools.buildpathfull + "Tools\\maxscript\\cryAnim\\ui\\batch\\Scripts\\*.ms") - ddOp3.items = cryTools.cryAnim.UI.batchProcess._f.getScriptList (cryTools.buildpathfull + "Tools\\maxscript\\cryAnim\\ui\\batch\\Scripts\\*.ms") - ddOp4.items = cryTools.cryAnim.UI.batchProcess._f.getScriptList (cryTools.buildpathfull + "Tools\\maxscript\\cryAnim\\ui\\batch\\Scripts\\*.ms") - - --ddSecondOp.items = cryTools.cryAnim.UI.batchProcess._f.getScriptList (cryTools.buildpathfull + "Tools\\maxscript\\cryAnim\\ui\\batch\\SecondScript\\*.ms") - - if scriptUpdate == undefined then - ( - ddOp1.selection = ddOp1.items.count - 1 - ddOp2.selection = ddOp2.items.count - 1 - ddOp3.selection = ddOp3.items.count - 1 - ddOp4.selection = ddOp4.items.count - 1 - ) - else - ( - local tempFilter = filterString scriptUpdate "|" - - if tempFilter.count > 1 then - ( - case tempFilter[1] of - ( - "1": ddOp1.selection = (findItem ddOp1.items tempFilter[2]) - "2": ddOp2.selection = (findItem ddOp2.items tempFilter[2]) - "3": ddOp3.selection = (findItem ddOp3.items tempFilter[2]) - "4": ddOp4.selection = (findItem ddOp4.items tempFilter[2]) - ) - ) - else - ( - case tempFilter[1] of - ( - "1": ddOp1.selection = ddOp1.items.count - "2": ddOp2.selection = ddOp2.items.count - "3": ddOp3.selection = ddOp3.items.count - "4": ddOp4.selection = ddOp4.items.count - "None": - ( - --ddFirstOp.selection = (findItem ddFirstOp.items cryTools.cryAnim._v.various[33]) - --ddSecondOp.selection = (findItem ddSecondOp.items cryTools.cryAnim._v.various[34]) - ) - ) - ) - ) - - return true - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.updateScriptLists" ) -) -updateScriptLists = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.updateScriptLists function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts ----------------------------------------------------------------------------------------------------------------------------------- --- creates folder, runs pre-export script and/or exports the file, generates log file ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts = function executeCustomScripts op obj = -( - try - ( - local tempScript = cryTools.cryAnim.UI.batchProcess._v.customScripts[(op as Integer)] - - - --local tempMaxCount = obj.items.count - --local tempIndex = obj.selection - --local tempSelected = obj.items[tempIndex] - - - if obj.selection == obj.items.count then - ( - if tempScript != "" then - ( - --// try to execute it, otherwise print out the error message - try - ( - execute( tempScript ) - gc() - ) - catch - ( - format "*** % ***\n" (getCurrentException()) - break - ) - ) - ) - - if obj.selection < (obj.items.count - 1) then - ( - local tempString = (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\batch\\Scripts\\" + obj.items[obj.selection] + ".ms") - try ( fileIn tempString ) - catch - ( - print ("Can't execute " + tempString) - return false - ) - ) - return true - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts" ) -) -executeCustomScripts = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts function" - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getAllFolders ----------------------------------------------------------------------------------------------------------------------------------- --- returns an array of all folders selected in the sub folders list ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getAllFolders = function getAllFolders = -( - try - ( - local folderArray = #() - local nodeArray = cryTools.cryAnim.UI.batchProcess._f.getCheckedNodes() - - --// for entries in the sub folders list - for i = 1 to nodeArray.count do - --// if the entry is checked, add the entry to the folderArray - append folderArray cryTools.cryAnim.UI.batchProcess._v.subFolders[nodeArray[i]].path - - --// return checked sub folders - return folderArray - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getAllFolders" ) -) -getAllFolders = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getAllfolders function" - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getAllFiles ----------------------------------------------------------------------------------------------------------------------------------- --- returns an array of all files of the checked folders in sub folders list ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getAllFiles = function getAllFiles = -( - try - ( - local fileArray = #() - --// gets all checked sub folders - local folderArray = cryTools.cryAnim.UI.batchProcess._f.getAllFolders() - --// for all sub folders - for i = 1 to folderArray.count do - ( - --// Add subFolder to list - local tempArray = #(("##" + folderArray[i])) - --// Add subFolderFiles to list - join tempArray (getFiles (folderArray[i] + "*.*" )) - --// Add subFolder + Files to general files list - join fileArray tempArray - - ) - - return fileArray - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getAllFiles" ) -) -getAllFiles = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getAllFiles function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getBoneDetection ----------------------------------------------------------------------------------------------------------------------------------- --- compares the filename with the file parts specified in the boneList and returns the result if the bone is in the file name ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getBoneDetection = function getBoneDetection filename = -( - try - ( - local resultArray = #() - local resultActive = false - --// for all items in the bone list - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.boneList.count do - ( - local tempString = "" - --// if the entry is activated - if cryTools.cryAnim.UI.batchProcess._v.boneList[i].active == "true" then - ( - --// entry is activated and so there is something to use - resultActive = true - --// gets all the parts of the file parts to compare - local tempArray = filterString cryTools.cryAnim.UI.batchProcess._v.boneList[i].external ";" - - local foundBones = false - --// for all items in the file parts - for d = 1 to tempArray.count do - --// if the file part is in the filename string - if findString filename tempArray[d] != undefined then - --// bone entry was found and - foundBones = true - - --// if an entry was found - if foundBones == true then - --// add the index and name to the result - append resultArray (resultStruct index:i name:cryTools.cryAnim.UI.batchProcess._v.boneList[i].name) - ) - ) - --// if there is no entry in the bone list is checked - if resultActive == false then - --// return just false - resultArray = #(false) - --// otherwise return the result array - return resultArray - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getBoneDetection" ) -) -getBoneDetection = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getBoneDetection function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getFilename ----------------------------------------------------------------------------------------------------------------------------------- --- returns the filename of the full path ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getFilename = function getFilename filepath = -( - try - ( - --// return new filename - return (filterString (cryTools.cryAnim.base.perforce filepath #getFilename) ".")[1] - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getFilename" ) -) -getFilename = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getFilename function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getExtension ----------------------------------------------------------------------------------------------------------------------------------- --- returns the extension of a filepath ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getExtension = function getExtension filepath = -( - try - ( - --// if a folder is found - --if findString filepath "\\" != undefined and findString filepath "." == undefined then - --return "folder" - - if (findString filepath "##") != undefined then - return "folder" - - --// divides the string by a "." - local tempFilterString = filterString filepath "." - - --// returns the last part of the filepath (extension) - return tempFilterString[tempFilterString.count] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getExtension" ) -) -getExtension = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getExtension function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.findMaskEntry ----------------------------------------------------------------------------------------------------------------------------------- --- returns a mask struct with all the entries, in which the filename is part of ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.findMaskEntry = function findMaskEntry tempMask tempString = -( - try - ( - local tempArray = #(false, false, false, false) - - --// if the normal criteria is not empty - if tempMask.normal[1] != undefined then - ( - --// file is part in normal - tempArray[1] = true - for i = 1 to tempMask.normal.count do - ( - --// if the there is a missmatch in the file criteria - if (findString tempString tempMask.normal[i]) == undefined then - --// file is not part in normal - tempArray[1] = false - ) - ) - --// normal criteria is empty - else - --// file is not part in normal criteria - tempArray[1] = undefined - - --// goes through the addition criteria - for i = 1 to tempMask.add.count do - ( - --// if the criteria is not empty - if tempMask.add[i] != undefined then - -- // if the criteria is found in the filename - if (findString tempString tempMask.add[i]) != undefined then - --// file is part in addition - tempArray[2] = true - ) - - --// goes through the substraction criteria - for i = 1 to tempMask.remove.count do - ( - --// if the criteria is not empty - if tempMask.remove[i] != undefined then - --// if the criteria is found in the filename - if (findString tempString tempMask.remove[i]) != undefined then - --// file is part in substraction - tempArray[3] = true - ) - --// if there is a extension criteria defined - if tempMask.extension[1] != undefined then - ( - --// goes through the extension criteria - for i = 1 to tempMask.extension.count do - ( - --// if criteria is not empty - if tempMask.extension[i] != undefined then - ( - --// seperates the filepath and the extension - tempExtension = filterString tempString "." - --// and gets the extension - tempExtension = tempExtension[tempExtension.count] - --// if the extension criteria is found in the file - if (findString tempExtension tempMask.extension[i]) != undefined then - --// file is part in extension criteria - tempArray[4] = true - ) - ) - ) - --// if there is no extension criteria defined - else - tempArray[4] = undefined - - --// return the list of founded criterias - return tempArray - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.findMaskEntry" ) -) -findMaskEntry = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.findMaskEntry function" - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.getFileFound ----------------------------------------------------------------------------------------------------------------------------------- --- returns true, if the file matchs the file mask criteria and other checks ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.getFileFound = function getFileFound filename = -( - try - ( - --// creates an empty mask struct - fileMask = maskStruct() - --// seperates all entries in the file mask and stores them as an array - fileMaskFilter = filterString cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].etFileMask.text " " - --// end result which will be returned - fileMaskFound = false - - --// goes through the sperated mask entries - for f = 1 to fileMaskFilter.count do - ( - --// if a substract letter is found, put the part of the string into the remove part - if findString fileMaskFilter[f] "#" != undefined then - append fileMask.remove (substring fileMaskFilter[f] 2 fileMaskFilter[f].count) - - --// if an addition letter is found, put the part of the string into the addition part - if findString fileMaskFilter[f] "*" != undefined then - append fileMask.add (substring fileMaskFilter[f] 2 fileMaskFilter[f].count) - - --// if an additon letter and a substract letter is not found, put the part of the string into the normal part - if (findString fileMaskFilter[f] "*" == undefined) and (findString fileMaskFilter[f] "#" == undefined) and (findString fileMaskFilter[f] "$" == undefined) then - append fileMask.normal fileMaskFilter[f] - - --// if a file type letter is found, put the part of the string into the extension part - if findString fileMaskFilter[f] "$" != undefined then - append fileMask.extension (cryTools.cryAnim.base.lowercase(substring fileMaskFilter[f] 2 fileMaskFilter[f].count)) - ) - - - --// gets the result, if the file is part of the substract, add, normal or extension criteria - maskArray = cryTools.cryAnim.UI.batchProcess._f.findMaskEntry fileMask filename - - - --// if the file extension is found - if maskArray[4] != false then - ( - --// if the file is part in normal or is not specified then file is found - if (maskArray[1] == true or maskArray[1] == undefined) then - --// file is found - fileMaskFound = true - else - --// otherwise not - fileMaskFound = false - - --// if the file is part in substraction - if maskArray[3] == true then - --// file is hidden - fileMaskFound = false - --// if the file is part in addition - if maskArray[2] == true then - --// file is found - fileMaskFound = true - ) - --// if the file extension is not found - else - --// file is hidden - fileMaskFound = false - - --// returns the result if the file is visible or not - return fileMaskFound - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.getFileFound" ) -) -getFileFound = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.getFileFound function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.refreshFiles ----------------------------------------------------------------------------------------------------------------------------------- --- clears the file list, fills it with found files and sets the extent for the columns ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.refreshFiles = function refreshFiles = -( - try - ( - --// empty array of column text extents - local newExtent = #(0,0,0,0,0) - local lbFiles = cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbFiles - --// clears the file list - - if cryTools.cryAnim.UI.batchProcess._v.flags[1] == true then - ( - if classOf lbFiles == ActiveXControl then - lbFiles.listItems.clear() - else - lbFiles.items.clear() - ) - - - - --// goes through the file list - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - ( - local lbFilesFile = "" - local foreColor = [0,0,0] - - if cryTools.cryAnim.UI.batchProcess._v.flags[1] == true then - ( - --// adds the line with the name - if classOf lbFiles == ActiveXControl then - ( - lbFilesFile = lbFiles.listItems.Add text:cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename - --// adds the Details - lbFilesFile.listSubItems.Add text:cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details - --// adds the Export - lbFilesFile.listSubItems.Add text:"" - --// adds the Extension - lbFilesFile.listSubItems.Add text:cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension - --// adds the Anm - lbFilesFile.listSubItems.Add text:cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm - ) - else - ( - lbFilesFile = lbFiles.items.Add cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename - lbFilesFile.subItems.Add cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details - lbFilesFile.subItems.Add "" - lbFilesFile.subItems.Add cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension - lbFilesFile.subItems.Add cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm - ) - ) - else - ( - if classOf lbFiles == ActiveXControl then - ( - lbFilesFile = lbFiles.listItems[i] - lbFilesFile.listSubItems[1].text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details - lbFilesFile.listSubItems[2].text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process - lbFilesFile.listSubItems[4].text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm - ) - else - ( - lbFilesFile = lbFiles.items.item (i - 1) - (lbFilesFile.subItems.get_item 1).text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details - (lbFilesFile.subItems.get_item 2).text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process - (lbFilesFile.subItems.get_item 4).text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm - ) - ) - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].node = lbFilesFile - - local textExtent = #(0,0,0,0,0) - - - if classOf lbFiles == ActiveXControl then - ( - --// if a the "file" is a folder - case cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension of - ( - "folder": lbFilesFile.Bold = true - "scene": lbFilesFile.Bold = true - ) - - --// extent of the current filename - textExtent[1] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename)[1]) * 30 - --// extent of the current details - textExtent[2] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details)[1]) * 40 - --// extent of the current export - textExtent[3] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process)[1]) * 40 - --// extent of the current extension - textExtent[4] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension)[1]) * 50 - --// extent of the current .anm - textExtent[5] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm)[1]) * 50 - - --// goes through the extent list - for f = 1 to textExtent.count do - --// if the current extent is higher than the result extent - if textExtent[f] > newExtent[f] then - --// result extent is current extent - newExtent[f] = textExtent[f] - - --// files which are selected before will be selected again - ) - else - ( - --// adds the Details - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details != "" then - ( - if (findString cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details ";") != undefined then - foreColor = [200,150,50] - else - foreColor = [0,0,150] - ) - --// adds the Process - lbFilesFile.subItems.Add cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process != "" then - ( - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process == "Done" then - foreColor = [0,200,0] - else - foreColor = [255,0,0] - - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process == "Load" then - foreColor = [0,0,255] - ) - - --// adds the Extension - case cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension of - ( - "folder": foreColor = [200,0,0] - "scene": foreColor = [0,0,200] - ) - - - lbFilesFile.ForeColor = lbFilesFile.ForeColor.FromArgb foreColor[1] foreColor[2] foreColor[3] - - --// extent of the current filename - textExtent[1] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename)[1]) - --// extent of the current details - textExtent[2] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details)[1]) - --// extent of the current process - textExtent[3] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process)[1]) - --// extent of the current extension - textExtent[4] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension)[1]) - --// extent of the current .anm - textExtent[5] = ((getTextExtent cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm)[1]) - - --// goes through the extent list - for f = 1 to textExtent.count do - --// if the current extent is higher than the result extent - if textExtent[f] > newExtent[f] then - --// result extent is current extent - newExtent[f] = textExtent[f] + 12 --// additional number so entries are not cut - - ) - ) - - - - --// goes through the result extent list - for f = 1 to newExtent.count do - ( - --// applys the weidth of the column with the text extent - if classOf lbFiles == ActiveXControl then - lbFiles.columnHeaders[f].width = newExtent[f] - else - (lbFiles.Columns.item (f - 1)).width = newExtent[f] - ) - - - cryTools.cryAnim.UI.batchProcess._v.flags[1] = false - - --// updates the counter - cryTools.cryAnim.UI.batchProcess._f.updateCounter() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.refreshFiles" ) -) -refreshFiles = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.refreshFiles function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.updateDialog ----------------------------------------------------------------------------------------------------------------------------------- --- updates the whole dialog analyze the file mask and files ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.updateDialog = function updateDialog updateFromExport:false = -( - try - ( - --// if the function is called after the process file function - if updateFromExport == false then - --// don't clear the file list, as it stores the export results - cryTools.cryAnim.UI.batchProcess._v.exportFiles = #() - - - --// if the source path is not empty - if cryTools.cryAnim.UI.batchProcess._v.sourcePath != undefined then - ( - --// gets all selected folders - local folderArray = cryTools.cryAnim.UI.batchProcess._f.getAllFolders() - --// creates array with the scene entry first - local fileArray = #(" --- Current Scene ---.scene") - --// attaches all files in the selected folders - join fileArray (cryTools.cryAnim.UI.batchProcess._f.getAllFiles()) - - - --// goes through all files in the folders - for i = 1 to fileArray.count do - ( - tempFilename = #() - --// gets the filename with extension - tempFilename[1] = cryTools.cryAnim.base.perforce fileArray[i] #getFilename - --// gets filename without extension - tempFilename[2] = cryTools.cryAnim.UI.batchProcess._f.getFilename fileArray[i] - --// gets the whole file path - tempFilename[3] = fileArray[i] - - - --// checks, if the filename is part of the bone detection criteria - boneFound = cryTools.cryAnim.UI.batchProcess._f.getBoneDetection tempFilename[2] - --// checks, if the filename is part of show-criteria - fileFound = cryTools.cryAnim.UI.batchProcess._f.getFileFound tempFilename[1] - - - --// if file will be shown at the end - fileUsed = false - --// if the entry is a folder - folderFound = false - --// if the entry is the scene - sceneFound = false - --// if a bone criteria was detected - tempDetail = "" - - --// if a folder is found (definition of a folder is ##) - if (findString tempFilename[3] "##") != undefined then - ( - --// gets all subfolders of the file - tempFolderFilter = filterString tempFilename[3] "\\" - --// gets all subfolders of the source path - tempOpenFilter = filterString cryTools.cryAnim.UI.batchProcess._v.sourcePath "\\" - --// seperator at the beginning - tempFolderString = " --- " - - --// differentiate the subfolders from source and file path - for i = tempOpenFilter.count to tempFolderFilter.count do - --// adds the sub folder to the temporary string - tempFolderString += tempFolderFilter[i] + (if i != tempFolderFilter.count then " \\ " else " ---") - - --// filename is now sub folder structure - tempFilename[2] = tempFolderString - - --// folder is found - folderFound = true - ) - - if (cryTools.cryAnim.UI.batchProcess._f.getExtension tempFilename[1]) == "scene" then - sceneFound = true - - - if folderFound == false then - ( - --// if a boneDetection criteria is found - if (boneFound.count > 0) and (boneFound[1] != false) then - ( - local tempBoneString = "" - --// goes through the criteria - for f = 1 to boneFound.count do - --// adds the name of the criteria - tempBoneString += boneFound[f].name + (if f != boneFound.count then "; " else "") - - --// "Details" is bone criteria - tempDetail = tempBoneString - ) - ) - - - - - --// only bone detected files will be shown - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkOnlyBoneDetection.checked == true then - ( - --// if a bone detection criteria is found - if boneFound.count > 0 then - ( - --// if file is visible - if fileFound == true then - --// file will be used - fileUsed = true - ) - ) - --// if not only bone detected files will be shown - else - ( - --// if only not bone detected files be shown - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkNoBoneDetection.checked == true then - ( - --// if no bone detect criteria is found or no bone detect criteria is set up - if (boneFound.count == 0) or (boneFound[1] == false) then - ( - --// if file is visible - if fileFound == true then - --// file will be used - fileUsed = true - ) - ) - --// if both, only and no bone detection is checked - else - ( - --// if file is visible - if fileFound == true then - --// file will be used - fileUsed = true - ) - ) - - local tempExt = (cryTools.cryAnim.UI.batchProcess._f.getExtension tempFilename[3]) - case tempExt of - ( - "bip":() - "fbx":() - "max":() - "folder":() - "scene":() - default: (tempDetail = "File type not supported") - ) - - - --// if file is visible or a folder is found - if (fileFound == true) or (folderFound == true) or (sceneFound == true) then - ( - --// if the update dialog is not called after the files where processed - if updateFromExport == false then - if boneFound[1] == false or ((cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkOnlyBoneDetection.checked == true and boneFound.count > 0) or (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkNoBoneDetection.checked == true and boneFound.count == 0) or (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkOnlyBoneDetection.checked == false and cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkNoBoneDetection.checked == false)) or folderFound == true or sceneFound == true then - --// add the file details to the internal files list - append cryTools.cryAnim.UI.batchProcess._v.exportFiles (batchFileStruct filename:tempFilename[2] path:tempFilename[3] details:tempDetail process:"" used:fileUsed extension:(cryTools.cryAnim.UI.batchProcess._f.getExtension tempFilename[3]) anm:"") - - ) - ) - - --// clears the list, fills it with files and sets text extent - cryTools.cryAnim.UI.batchProcess._f.refreshFiles() - --// updates the counter - cryTools.cryAnim.UI.batchProcess._f.updateCounter() - - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.updateDialog" ) -) -updateDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.updateDialog function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.generateOutput ----------------------------------------------------------------------------------------------------------------------------------- --- creates and fills log file ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.generateOutput = function generateOutput op filepath = -( - try - ( - --// generates the log file and adds time tag - if op == #generate then - ( - --// seperates date and time - tempLocalTime = filterString localTime " " - --// gets date - tempDate = tempLocalTime[1] - - --// if a different region other then GMT is set - if tempLocalTime.count > 2 then - ( - --// seperate hour, minute second - tempTimeArray = filterString tempLocalTime[2] ":" - --// if it is afternoon - if tempLocalTime[3] == "PM" then - --// converts 12h to 24h system - tempTimeArray[1] = tempTimeArray[1] as Integer + 12 - - --// sets 24h system - tempLocalTime[2] = tempTimeArray[1] as String - - --// adds the rest of the time with ":" - for index = 2 to tempTimeArray.count do - tempLocalTime[2] += ":" + tempTimeArray[index] - - - ) - - --// sets new time - tempTime = tempLocalTime[2] - - --// if non GMT is found - if findString tempDate "/" != undefined then - ( - --// seperate month,day,year - tempDateFilter = filterString tempDate "/" - --// adds "." to the date and converts to GMT system - tempDate = tempDateFilter[2] + "." + tempDateFilter[1] + "." + tempDateFilter[3] - ) - - - --// seperates hour,minute,second - local timeExtension = filterString tempTime ":" - - tempString = "" - --// goes through the list and replaces ":" with "'" - for i = 1 to timeExtension.count do - ( - tempString += timeExtension[i] - if i != timeExtension.count then - tempString += "'" - ) - - --// set new time string - timeExtension = tempString - - --// batchProcess folder - local filepath = cryTools.cryTemp + "batchAnimExport" - --// if there is no folder, create one - cryTools.cryAnim.UI.main._f.checkExport #createFolder filepath - - --// generates file path out of day and time - filepath += "\\" + tempDate + "_" + timeExtension + ".txt" - - --// if file is already there, delete it - try ( deleteFile filepath ) catch() - --// create file and filestream - local fileStream = createFile filepath - - - --// header of the log file: date, time, source folder and insert it to the file - format "% %\n===================================================================================================================\n\n" localTime cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].labSourceFolder.text to:fileStream - --// cleses file/filestream - close filestream - - --// returns the log file path - return filepath - ) - - - - --// if a file should be logged - if op != #generate and op != undefined then - ( - --// open the file - local filestream = openFile filepath mode:"a+" - --// add the file and status - format "%\n" op to:filestream - --// close file again - close filestream - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.generateOutput" ) -) -generateOutput = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.generateOutput function" - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.updateExtent ----------------------------------------------------------------------------------------------------------------------------------- --- updates the extent of the text in pixel ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.updateExtent = function updateExtent = -( - try - ( - newExtent = #(0,0,0) - local lbList = cryTools.cryAnim.UI.batchProcess.editBoneList.lbList - - for i = 0 to (lbList.Items.count - 1) do - ( - local tempItem = lbList.Items.item i - local textExtent = #(0,0,0) - --// extent of the current filename - textExtent[1] = (getTextExtent (tempItem.SubItems.item 0).text)[1] + 12 - textExtent[2] = (getTextExtent (tempItem.SubItems.item 1).text)[1] - textExtent[3] = (getTextExtent (tempItem.SubItems.item 2).text)[1] - - for f = 1 to textExtent.count do - --// if the current extent is higher than the result extent - if textExtent[f] > newExtent[f] then - --// result extent is current extent - newExtent[f] = textExtent[f] + 12 --// additional number so entries are not cut - ) - - for f = 1 to newExtent.count do - if (lbList.Columns.item (f - 1)).width < newExtent[f] then - --// applys the weidth of the column with the text extent - (lbList.Columns.item (f - 1)).width = newExtent[f] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.updateExtent" ) -) -updateExtent = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.updateExtent function" - - - - - - - - - - -cryTools.cryAnim.UI.batchProcess._f.loadBatchFile = function loadBatchFile filepath = -( - try - ( - local extension = cryTools.cryAnim.UI.batchProcess._f.getExtension filepath - - case extension of - ( - --// if a bip file is in queue - "bip": - ( - --// if there is no biped character in the scene - if cryTools.cryAnim._f.getBaseBip() == undefined then - ( - return "Error: No Biped in Scene " --false - ) - --// wait until the biped file is opened - while ((tempBool = (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "Load Biped File").pressed())[1] != true) do - escapeEnable = true - - --// if an error occured while loading the file - if tempBool[2] == false then - return "Error loading file " - ) - - --// if a fbx file is in queue - "fbx": - ( - --// load the NullScene which has nothing in it, just to reset the scene without reset dialog - --loadMaxFile (cryTools.BUIldPathFull + "Tools\\maxscript\\ref\\NullSceneMax8.max") - resetMaxFile #noPrompt - - --// imports the fbx file in queue - if (importFile filepath #noPrompt) != true then - return "Error loading file " - - --// creates a dummy used for "Object Export" in CryEngine2 exporter - local tempDummy = dummy name:"tempDummy" - - - - --// tries to get the animation range, if it can't, the animation range is in most cases 0,0 which 3dmax can't handle - try - ( - --// sets animation range by the key times of the pelvis - animationRange = interval $'Bip01 Pelvis'.pos.controller.keys[1].time $'Bip01 Pelvis'.pos.controller.keys[$'Bip01 Pelvis'.pos.controller.keys.count].time - ) catch( animationRange = interval 0 1 ) - - ) - - --// if a max file is in queue - "max": - ( - try - loadMaxFile filepath useFileUnits:true quiet:true - catch - return "Error loading file " - ) - - - "scene": return "" - - --// if nothing useful is in queue - default: - ( - return "File extension not supported" - ) - ) - - return true - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.loadBatchFile" ) -) -loadBatchFile = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.loadBatchFile function" - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.batchProcess._f.processFiles ----------------------------------------------------------------------------------------------------------------------------------- --- creates folder, runs pre-export script and/or exports the file, generates log file ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.batchProcess._f.processFiles = function processFiles op = -( - try - ( - --// rollout to show the progress of the check/export - rollout exportProgress "Animation Export Progress" width:525 height:32 - ( - label ProgressInfo "Processing Animation :" pos:[10,4] width:150 height:15 - --// animation name - label CurrentAnimation "" pos:[160,4] width:370 height:15 - --// queue of animations - label CurrentCount "0 / 0" pos:[470,4] width:80 height:15 - --// progress bar for all animations - progressBar MainProgress "" pos:[10,23] width:505 height:7 color:green - ) - cryTools.cryAnim.UI.batchProcess.progressDialog = exportProgress - exportProgress = undefined - - --// creates the progress dialog - createdialog cryTools.cryAnim.UI.batchProcess.progressDialog - - --// generates log file - local filepath = cryTools.cryAnim.UI.batchProcess._f.generateOutput #generate "" - - - --// maximum files used - maxFiles = 0 - - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - if (cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension != "folder") and (cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].used == true) then - maxFiles += 1 - - --// counter for files only, not folders - counter = 0 - - with undo off - ( - - --// goes through the files/folder list - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - ( - tempStatus = "" - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process = "" - ready2export = true - --// if entry is visible and not a folder - if (cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].used == true) and (cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension != "folder") then - ( - --// increment the counter - counter += 1 - --// allow loop cancelation - escapeEnable = true - --// save variables - tempCheckBeforeExport = cryTools.checkbeforeexport - tempSuppressWarnings = cryTools.suppresswarnings - tempInterval = animationRange - - --// set file to be the next in the loading and exporting queue - cryTools.cryAnim.UI.batchProcess._v.fileQue = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].path - cryTools.cryAnim.UI.batchProcess._v.selectedFile = i - - --// changes the progress text to the new file name - cryTools.cryAnim.UI.batchProcess.progressDialog.CurrentAnimation.text = cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename - --// and updates the counter text - cryTools.cryAnim.UI.batchProcess.progressDialog.CurrentCount.text = ((counter as String) + " / " + (maxFiles as String) as String) - - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension != "scene" then - ( - ready2Export = cryTools.cryAnim.UI.batchProcess._f.loadBatchFile cryTools.cryAnim.UI.batchProcess._v.fileQue - - if ready2Export != true and ready2Export != false then - ( - tempStatus = ready2Export - ready2Export = false - ) - ) - - - case cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension of - ( - "fbx": - ( - --// deactivate checks, which show error messages (are not needed here) - cryTools.checkbeforeexport = false - cryTools.suppresswarnings = true - - --// opens the CryEngine2 Exporter - UtilityPanel.OpenUtility CryEngine2_Exporter - --// sets the "Object Export" list with the dummy - csexport.set_node_list #(tempDummy) - try csexport.set_bone_list #($Bip01) catch() - ) - ) - - - --// converts the file path to caf path - tempCafPath = (cryTools.cryAnim.UI.main._f.checkExport #ProductionToGame cryTools.cryAnim.UI.batchProcess._v.fileQue) - - --// use sub folder structure for export - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkKeepSubFolders.checked == true then - ( - --// seperate sub folders from the source directory - openFilter = filterString cryTools.cryAnim.UI.batchProcess._v.sourcePath "\\" - --// seperate sub folders from the file directory - fileFilter = filterString cryTools.cryAnim.UI.batchProcess._v.fileQue "\\" - - --// new export path is set from the batch export dialog - newCafPath = cryTools.cryAnim.UI.batchProcess._v.exportPath - - --// if there is a difference in the folder structure = sub folder of source folder - if (fileFilter.count - (openFilter.count - 1)) > 0 then - ( - --// goes through the sub folders - for i = (openFilter.count + 1) to fileFilter.count do - --// adds sub folders to the export path - newCafPath += fileFilter[i] + (if i != fileFilter.count then "\\" else "") - - --// adds .caf extension to the path - newCafPath = (substring newCafPath 1 (newCafPath.count - 4)) + ".caf" - ) - --// if there is no difference - else - newCafPath = cryTools.cryAnim.UI.batchProcess._v.exportPath + (cryTools.cryAnim.UI.main._f.checkExport #getCaf (cryTools.cryAnim.base.perforce cryTools.cryAnim.UI.batchProcess._v.fileQue #getFilename)) - - --// set new export path - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = newCafPath - ) - --// if no sub folders should be used - else - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = cryTools.cryAnim.UI.batchProcess._v.exportPath + (cryTools.cryAnim.UI.main._f.checkExport #getCaf (cryTools.cryAnim.base.perforce cryTools.cryAnim.UI.batchProcess._v.fileQue #getFilename)) - - - --// if there is no export path folder - if (getDirectories (cryTools.cryAnim.base.perforce cryTools.cryAnim.UI.main.loadSave._v.cafSavePath #getDirectory)).count == 0 then - --// create one - cryTools.cryAnim.UI.main._f.checkExport #createFolder cryTools.cryAnim.UI.main.loadSave._v.cafSavePath - - - --// if bone detection is activated - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkDetect.checked == true then - ( - --// get detected bones list - local tempBoneArray = cryTools.cryAnim.UI.batchProcess._f.getBoneDetection cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename - --// if the list is not empty and if there are bones defined - if (tempBoneArray.count > 0) and (tempBoneArray[1] != false) then - ( - --// seperate bones names - local tempBoneFilter = filterString cryTools.cryAnim.UI.batchProcess._v.boneList[tempBoneArray[1].index].bones ";" - --// add the bones to the used bones list - (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "lbExport").items = tempBoneFilter - ) - --// if no bone is detected - else - --// use Bip01 as default - (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "lbExport").items = #("Bip01") - ) - - - --// if there is no locator - if $Locator_Locomotion == undefined then - ( - --// if the pelvis and Bip01 position are the same, no locator is in the scene - try - ( - if $'Bip01 Pelvis'.transform.pos == $Bip01.transform.pos then - --// set export message - tempStatus += "Error: No Locator found " - ) - catch() - ) - --// if a locator is in the scene - else - ( - --// if the locator has no keys (not animated and in default position from biped) - if $Locator_Locomotion.controller.keys.count == 0 then - --// set export message - tempStatus += "Error: No Locator Keys found " - ) - - - --// if a pre-export script is defined - cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts "1" cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp1 - cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts "2" cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp2 - cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts "3" cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp3 - cryTools.cryAnim.UI.batchProcess._f.executeCustomScripts "4" cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].ddOp4 - - tempStatus += cryTools.cryAnim.UI.batchProcess._v.customScriptStatus - - cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "" - - --// if no error occured - if tempStatus == "" then - --// set export message - tempStatus = "Done" - - --// if bone detection is enabled - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkDetect.checked == true then - --// reset export bone list - (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "lbExport").items = #("Bip01") - - --// restore export checks - cryTools.checkbeforeexport = tempCheckBeforeExport - cryTools.suppresswarnings = tempSuppressWarnings - - --// update progress bar - cryTools.cryAnim.UI.batchProcess.progressDialog.MainProgress.value = (100 * i) / maxFiles - - --// add file to the log - cryTools.cryAnim.UI.batchProcess._f.generateOutput (cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].filename + " | " + cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].details + " | " + tempStatus) filepath - - --// update export status of the file - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process = tempStatus - ) - ) - ) - - --// update the whole dialog with export status - --cryTools.cryAnim.UI.batchProcess._f.updateDialog updateFromExport:true - cryTools.cryAnim.UI.batchProcess._f.refreshFiles() - --// reset file queue - cryTools.cryAnim.UI.batchProcess._v.fileQue = undefined - --// reset source path - cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath = cryTools.cryAnim.UI.main._v.bipWorkingDir + "*.bip" - --// kill progress dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.progressDialog - - return true - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.processFiles" ) -) -processFiles = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.processFiles function" - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.selectItem ----------------------------------------------------------------------------------------------------------------------------------- --- selects or returns the used item in the filename ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.selectItem = function selectItem itemSelect op = -( - try - ( - case op of - ( - #set: - ( - if cryTools.cryAnim.UI.main.models._v.itemList.count > 0 then - ( - local itemArray = cryTools.cryAnim.UI.main.models._v.itemList - - try - ( - local tempNodeForDelete = ($_IC_* as array) - for i = 1 to tempNodeForDelete.count do - delete tempNodeForDelete[i] - )catch() - - if itemArray[itemSelect].name != "" then - ( - if $Bip01 != undefined then - ( - local itemUsed = #() - local itemFound = #() - - for i = 1 to itemArray.count do - ( - if i == itemSelect then - ( - for d = 1 to itemArray[i].model.count do - ( - local tempNode = getNodeByName itemArray[i].model[d] - - if tempNode == undefined then - ( - mergeMAXfile (cryTools.BuildPathFull + "tools\\maxscript\\ref\\weapon_positions.max") #(itemArray[itemSelect].model[d]) #alwaysReparent #skipDups #useMergedMtlDups - try - ( - local tempNode = getNodebyName itemArray[itemSelect].model - - append itemUsed tempNode - append itemFound d - )catch() - ) - else - ( - if (findItem itemFound d) == 0 then - ( - append itemUsed tempNode - append itemFound d - ) - for f = 1 to itemArray[i].model.count do - ( - if f != d and (findItem itemFound f) == 0 then - ( - if itemArray[i].model[d] == itemArray[i].model[f] then - ( - local tempCopy = (cryTools.cryAnim._f.createSnapshot object:(getNodeByName itemArray[i].model[f]) )[1] - tempCopy.name = "_IC_" + tempCopy.name - tempCopy.isFrozen = (getNodeByName itemArray[i].model[f]).isFrozen - - append itemUsed tempCopy - append itemFound f - ) - ) - ) - ) - ) - ) - else - ( - for d = 1 to itemArray[i].model.count do - ( - local tempNode = getNodeByName itemArray[i].model[d] - - if tempNode != undefined then - ( - if tempNode.isHidden == false then - tempNode.isHidden = true - ) - ) - ) - ) - - for i = 1 to itemUsed.count do - ( - if itemUsed[i].isHidden == true then - itemUsed[i].isHidden = false - ) - - - - - for i = 1 to itemArray[itemSelect].model.count do - ( - try - ( - if (local nodeRef = getNodeByName itemArray[itemSelect].reference[i]) != undefined then - ( - in coordsys nodeRef - ( - if (local nodeParent = getNodeByName itemArray[itemSelect].parent[i]) != undefined then - ( - try - ( - itemUsed[i].transform = nodeParent.transform - itemUsed[i].parent = nodeParent - )catch() - - with animate off - ( - nodeParent.rotation = itemArray[itemSelect].rotation[i] - nodeParent.position = itemArray[itemSelect].position[i] - ) - ) - ) - ) - )catch() - ) - - - (cryTools.cryAnim.UI.main._f.getUI "Models" "ddItemSelect").selection = itemSelect - return true - ) - ) - ) - return false - ) - - #getIndex: - ( - if cryTools.cryAnim.UI.main.models._v.itemList.count > 0 then - ( - for i = 1 to cryTools.cryAnim.UI.main.models._v.itemList.count do - ( - local tempModels = cryTools.cryAnim.UI.main.models._v.itemList[i].model - local found = false - for d = 1 to tempModels.count do - ( - local tempNode = getNodeByName tempModels[d] - if tempNode != undefined then - ( - if tempNode.isHidden == false then - found = true - else - found = false - ) - ) - if found == true then - return i - ) - return 1 - ) - else - return 0 - ) - - #getList: - ( - local itemArray = cryTools.cryAnim.base.iniFile #get #items - - try - ( - --// gets ini info - if itemArray != undefined then - ( - tempListArray = #() - tempListArray2 = #() - - --// gets the array of properties in the structure of itemArray - local subItemArray = getPropNames itemArray[1] - - - - for i = 1 to itemArray.count do - ( - if itemArray[i].name != "" then - ( - itemArray[i].model = filterString itemArray[i].model ";" - itemArray[i].reference = filterString itemArray[i].reference ";" - itemArray[i].parent = filterString itemArray[i].parent ";" - itemArray[i].position = filterString itemArray[i].position ";" - itemArray[i].rotation = filterString itemArray[i].rotation ";" - - for f = 1 to itemArray[i].model.count do - ( - itemArray[i].position[f] = execute (itemArray[i].position[f]) - itemArray[i].rotation[f] = execute (itemArray[i].rotation[f]) - ) - - ) - ) - - return itemArray - ) - ) - catch - ( - itemArray = #() - return itemArray - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.selectItem" ) -) -selectItem = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.selectItem function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.selectByNameFilterNode ----------------------------------------------------------------------------------------------------------------------------------- --- checks, if the node is not an biped object ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.selectByNameFilterNode = function selectByNameFilterNode obj = -( - try - ( - if obj.classID[1] != 37157 then - return true - else - return false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.selectByNameFilterNode" ) -) -selectByNameFilterNode = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.selectByNameFilterNode function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.selectByNameFilterParent ----------------------------------------------------------------------------------------------------------------------------------- --- checks, if the node is not tempObj ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.selectByNameFilterParent = function selectByNameFilterParent objParent = -( - try - ( - if objParent.name != tempObj.name then - return true - else - return false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.selectByNameFilterParent" ) -) -selectByNameFilterParent = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.selectByNameFilterParent function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.setVisible ----------------------------------------------------------------------------------------------------------------------------------- --- returns true, if the selected index should be visible ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.setVisible = function setVisible index = -( - try - ( - tempArray = cryTools.cryAnim.base.iniFile #get #models - if (tempArray != "") and (tempArray != undefined) then - ( - if tempArray[index] != undefined then - return true - else - return false - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.setVisible" ) -) -setVisible = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.setVisible function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.getEntries ----------------------------------------------------------------------------------------------------------------------------------- --- returns an array of model entries (filter function) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.getEntries = function getEntries index entriesArray = -( - try - ( - if entriesArray[index] != undefined then - return entriesArray[index].name - else - return "" - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.getEntries" ) -) -getEntries = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.getEntries function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.loadModel ----------------------------------------------------------------------------------------------------------------------------------- --- loads the model specified in "entry" ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.loadModel = function loadModel entry = -( - try - ( - local tempVar = loadMaxFile entry.path - if tempVar != false then - ( - try - ( - $'Bip01 R ForeTwist'.parent = $'Bip01 R Forearm' - $'Bip01 L ForeTwist'.parent = $'Bip01 L Forearm' - print "TwistBones reparented..." - ) - catch - ( - print "No Biped Loaded..." - ) - - select $Bip01 - setCommandPanelTaskMode #motion - - return true - ) - else - ( - messageBox ("File: " + entry.path + " not found") title:"Error Loading Model" - return false - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.loadModel" ) -) -loadModel = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.loadModel function" - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.updateExtent ----------------------------------------------------------------------------------------------------------------------------------- --- updates the extent of the list view in editItemList ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.updateExtent = function updateExtent = -( - try - ( - local newExtent = #(0,0,0,0,0,0,0,0) - local columnExtent = #(0,0,0,0,0,0,0,0) - - local lbItems = cryTools.cryAnim.UI.main.models.editItemList.lbItems - - - for d = 0 to (lbItems.Columns.count - 1) do - ( - columnExtent[d+1] = (getTextExtent (lbItems.Columns.item d).text)[1] - - if columnExtent[d+1] > newExtent[d+1] then - newExtent[d+1] = columnExtent[d+1] + 12 - ) - - - for i = 0 to (lbItems.Items.count - 1) do - ( - local tempItem = lbItems.Items.item i - local textExtent = #(0,0,0,0,0,0,0,0) - - --// extent of the current filename - for d = 0 to (lbItems.Columns.count - 1) do - try ( textExtent[d+1] = (getTextExtent (tempItem.SubItems.item d).text)[1] + 12) catch() - - - - for f = 1 to textExtent.count do - ( - --// if the current extent is higher than the result extent - if textExtent[f] > newExtent[f] then - --// result extent is current extent - newExtent[f] = textExtent[f] --+ 12 --// additional number so entries are not cut - ) - - ) - - for f = 1 to newExtent.count do - --// applys the weidth of the column with the text extent - (lbItems.Columns.item (f - 1)).width = newExtent[f] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.updateExtent" ) -) -updateExtent = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.updateExtent function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.sortList ----------------------------------------------------------------------------------------------------------------------------------- --- sorts the list view in editItemList ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.sortList = function sortList = -( - try - ( - local lbItems = cryTools.cryAnim.UI.main.models.editItemList.lbItems - local newArray = #() - local oldArray = #() - local sortedArray = #() - if classOf lbItems == ActiveXControl then - ( - local maxCount = lbItems.ListItems.count - local forStart = 1 - ) - else - ( - local maxCount = lbItems.Items.count - 1 - local forStart = 0 - ) - - for i = forStart to maxCount do - ( - if classOf lbItems == ActiveXControl then - append oldArray (#(lbItems.ListItems[i].text, lbItems.ListItems[i].ListSubItems[1].text, lbItems.ListItems[i].ListSubItems[2].text, lbItems.ListItems[i].ListSubItems[3].text, lbItems.ListItems[i].ListSubItems[4].text, lbItems.ListItems[i].ListSubItems[5].text, lbItems.ListItems[i].ListSubItems[6].text, lbItems.ListItems[i].ListSubItems[7].text)) - else - append oldArray (#((lbItems.Items.item i).text, ((lbItems.Items.item i).SubItems.item 1).text, ((lbItems.Items.item i).SubItems.item 2).text, ((lbItems.Items.item i).SubItems.item 3).text, ((lbItems.Items.item i).SubItems.item 4).text, ((lbItems.Items.item i).SubItems.item 5).text, ((lbItems.Items.item i).SubItems.item 6).text, ((lbItems.Items.item i).SubItems.item 7).text)) - ) - - for i = 1 to oldArray.count do - append newArray oldArray[i][1] - - sort newArray - - for i = 1 to newArray.count do - ( - findEntry = newArray[i] - entryFound = 0 - for f = 1 to oldArray.count do - ( - if oldArray[f][1] == newArray[i] then - ( - append sortedArray oldArray[f] - sortedArray[sortedArray.count][1] = newArray[i] - ) - ) - ) - - if classOf lbItems != ActiveXControl then - ( - lbItems.BeginUpdate() - lbItems.Items.clear() - ) - else - lbItems.ListItems.clear() - - for i = 1 to newArray.count do - ( - if classOf lbItems == ActiveXControl then - ( - local tempItem = lbItems.ListItems.Add text:sortedArray[i][1] - tempItem.listSubItems.Add text:sortedArray[i][2] - tempItem.listSubItems.Add text:sortedArray[i][3] - tempItem.listSubItems.Add text:sortedArray[i][4] - tempItem.listSubItems.Add text:sortedArray[i][5] - tempItem.listSubItems.Add text:sortedArray[i][6] - tempItem.listSubItems.Add text:sortedArray[i][7] - tempItem.listSubItems.Add text:sortedArray[i][8] - ) - else - ( - local tempItem = lbItems.Items.Add sortedArray[i][1] - tempItem.SubItems.Add sortedArray[i][2] - tempItem.SubItems.Add sortedArray[i][3] - tempItem.SubItems.Add sortedArray[i][4] - tempItem.SubItems.Add sortedArray[i][5] - tempItem.SubItems.Add sortedArray[i][6] - tempItem.SubItems.Add sortedArray[i][7] - tempItem.SubItems.Add sortedArray[i][8] - ) - ) - - if classOf lbItems != ActiveXControl then - lbItems.EndUpdate() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.sortList" ) -) -sortList = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.sortList function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.models._f.updateExtentModel ----------------------------------------------------------------------------------------------------------------------------------- --- updates the extent of the list view in editModelList ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.models._f.updateExtentModel = function updateExtentModel = -( - try - ( - local newExtent = #(0,0) - local lbModels = cryTools.cryAnim.UI.main.models.editModelList.lbModels - - for i = 0 to (lbModels.Items.count - 1) do - ( - local tempItem = lbModels.Items.item i - local textExtent = #(0,0) - --// extent of the current filename - for d = 1 to lbModels.Columns.count do - textExtent[d] = (getTextExtent (tempItem.SubItems.item (d - 1)).text)[1]-- + (if d == 1 then 12 else 0) - - - for f = 1 to textExtent.count do - --// if the current extent is higher than the result extent - if textExtent[f] > newExtent[f] then - --// result extent is current extent - newExtent[f] = textExtent[f] + 12 --// additional number so entries are not cut - ) - - for f = 1 to newExtent.count do - if (lbModels.Columns.item (f - 1)).width < newExtent[f] then - --// applys the weidth of the column with the text extent - (lbModels.Columns.item (f - 1)).width = newExtent[f] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.models._f.updateExtentModel" ) -) -updateExtentModel = undefined -logOutput "> Created cryTools.cryAnim.UI.main.models._f.updateExtentModel function" - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.operation._f.updateDialog ----------------------------------------------------------------------------------------------------------------------------------- --- updates the dialog of operationRO ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.operation._f.updateDialog = function updateDialog output:unsupplied = -( - try - ( - local ddOperationItems = #( "Planted Key", "Sliding Key", "Free Key", "--------------------------------------------", "Move","Move/Rotate","--------------------------------------------", "Move to Floor","Reset Rotation","Rotate Anim","--------------------------------------------", "Copy" , "Paste", "--------------------------------------------","Bip to [0,0]","Bip to [0,0,0]" ) - local ddOperationToItems = #( "Snapshot", "Pivot Point" ) - - case output of - ( - #ddOp: - return ddOperationItems - #ddOpTo: - return ddOperationToItems - ) - - - local ddSel = cryTools.cryAnim.UI.main._f.getUI "Target" "ddSelection" - local ddOp = cryTools.cryAnim.UI.main._f.getUI "Operation" "ddOperation" - local ddOpTo = cryTools.cryAnim.UI.main._f.getUI "Operation" "ddOperationTo" - local spnDistance = cryTools.cryAnim.UI.main._f.getUI "Operation" "spnDistance" - local spnDirection = cryTools.cryAnim.UI.main._f.getUI "Operation" "spnDirection" - local spnSteps = cryTools.cryAnim.UI.main._f.getUI "Operation" "spnSteps" - local labOp = cryTools.cryAnim.UI.main._f.getUI "Operation" "labOperation" - local labDistanceDirection = cryTools.cryAnim.UI.main._f.getUI "Operation" "labDistanceDirection" - local gbOp = cryTools.cryAnim.UI.main._f.getUI "Operation" "gbOperation" - local btnApply = cryTools.cryAnim.UI.main._f.getUI "Operation" "btnApply" - local btnApplyBeginEnd = cryTools.cryAnim.UI.main._f.getUI "Operation" "btnApplyBeginEnd" - local btnApplyRange = cryTools.cryAnim.UI.main._f.getUI "Operation" "btnApplyRange" - local operationRO = cryTools.cryAnim.UI.main._f.getUI "Operation" "" - - - local ddOperationHidePos = 129 - local ddOperationShowPos = 170 - local ddSelectionChange = (cryTools.cryAnim.UI.main._f.getUI "Target" "labChange").text - local ddSelIndex = #(5,6,8,10,13) - - if ddSel.selection < 2 then - ( - ddOp.items = ddOperationItems - - if (findItem ddSelIndex ddOp.selection) != 0 then - ( - if ddOp.selection == 5 or ddOp.selection == 6 then - ddOpTo.items = #( "Snapshot", "Pivot Point" ) - else - ddOpTo.items = #( "Transform", "Position", "Rotation" ) - - if ddOp.selection == 8 or ddOp.selection == 10 then - ( - - labDistanceDirection.visible = true - ddOpTo.visible = false - labOp.visible = false - ) - else - ( - ddOpTo.visible = true - labOp.visible = true - labDistanceDirection.visible = false - ) - - if ddOp.selection == 8 then - spnDistance.visible = true - else - spnDistance.visible = false - - if ddOp.selection == 10 then - spnDirection.visible = true - else - spnDirection.visible = false - - - btnApply.enabled = true - - btnApply.pos.y = ddOperationShowPos - btnApplyBeginEnd.pos.y = ddOperationShowPos - btnApplyRange.pos.y = ddOperationShowPos - gbOp.height = ( ddOperationShowPos - gbOp.pos.y ) + 28 - operationRO.height = ddOperationShowPos + 32 - - spnSteps.enabled = true - btnApplyBeginEnd.enabled = true - - - if ddOp.selection == 8 then - ( - labDistanceDirection.text = "Floor Distance :" - local tempVar = cryTools.cryAnim._f.moveToFloor getHeight:true - if tempVar != undefined then - if (queryBox "Get Height from Selection?" title:"Move to Floor") == true then - spnDistance.value = tempVar - ) - else - ( - labDistanceDirection.text = "Direction :" - spnSteps.enabled = false - btnApplyBeginEnd.enabled = false - ) - - - ) - else - ( - ddOpTo.visible = false - labOp.visible = false - spnDistance.visible = false - spnDirection.visible = false - labDistanceDirection.visible = false - - if ddOp.selection == 10 then - ( - spnSteps.enabled = false - btnApplyBeginEnd.enabled = false - ) - else - ( - spnSteps.enabled = true - btnApplyBeginEnd.enabled = true - ) - - btnApply.pos.y = ddOperationHidePos - btnApplyBeginEnd.pos.y = ddOperationHidePos - btnApplyRange.pos.y = ddOperationHidePos - gbOp.height = ( ddOperationHidePos - gbOp.pos.y ) + 28 - operationRO.height = ddOperationHidePos + 32 - ) - - - ) - else - ( - ddOp.items = #( "Move", "Line" ) - if ddOp.selection == 0 then ddOp.selection = 1 - - if ddSelectionChange == "2:Changed" then - ( - ddOp.selection = 1 - (cryTools.cryAnim.UI.main._f.getUI "Target" "labChange").text = "2:Unchanged" - ) - - - spnSteps.enabled = true - btnApplyBeginEnd.enabled = true - - ddOpTo.visible = false - labOp.visible = false - - spnDistance.visible = false - spnDirection.visible = false - labDistanceDirection.visible = false - - - btnApply.pos.y = ddOperationHidePos - btnApplyBeginEnd.pos.y = ddOperationHidePos - btnApplyRange.pos.y = ddOperationHidePos - gbOp.height = ( ddOperationHidePos - gbOp.pos.y ) + 28 - operationRO.height = ddOperationHidePos + 32 - - - if ddOp.selection == 2 then - ( - btnApply.enabled = false - cryTools.cryAnim.UI.main.target._f.updateDDSelection op:false - - ) - else - ( - btnApply.enabled = true - cryTools.cryAnim.UI.main.target._f.updateDDSelection op:true - - ) - - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.operation._f.updateDialog" ) -) -updateDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.main.operation._f.updateDialog function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.operation._f.getSelectedAxis ----------------------------------------------------------------------------------------------------------------------------------- --- returns an array of axis which are checked in targetRO ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.operation._f.getSelectedAxis = function getSelectedAxis op = -( - try - ( - local posAxis = #(false, false, false, false) - local rotAxis = #(false, false, false, false) - - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkX.checked == true then posAxis[1] = true - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkY.checked == true then posAxis[2] = true - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkZ.checked == true then posAxis[3] = true - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkPosOffset.checked == true then posAxis[4] = true - - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkXRot.checked == true then rotAxis[1] = true - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkYRot.checked == true then rotAxis[2] = true - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkZRot.checked == true then rotAxis[3] = true - if (cryTools.cryAnim.UI.main._f.getUI "Target" "").chkRotOffset.checked == true then rotAxis[4] = true - - case op of - ( - #pos: return posAxis - #rot: return rotAxis - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.operation._f.getSelectedAxis" ) -) -getSelectedAxis = undefined -logOutput "> Created cryTools.cryAnim.UI.main.operation._f.updateDialog function" - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.operation._f.align ----------------------------------------------------------------------------------------------------------------------------------- --- align the selected node to the list node ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.operation._f.align = function align tempSel tempNode snapshots:undefined = -( - try - ( - local posAxis = cryTools.cryAnim.UI.main.operation._f.getSelectedAxis #pos - local rotAxis = cryTools.cryAnim.UI.main.operation._f.getSelectedAxis #rot - - for i = 1 to tempSel.count do - ( - local tempPos = tempSel[i].transform.pos - local tempRot = tempSel[i].transform.rotation as eulerangles - - if cryTools.cryAnim._v.various[35] != undefined then - ( - with undo off - ( - in coordsys tempNode - ( - snapshots[i].rotation = cryTools.cryAnim._v.various[35][i].rotation - snapshots[i].pos = cryTools.cryAnim._v.various[35][i].position - ) - ) - ) - - - - if rotAxis[4] == false then - ( - if rotAxis[1] == true then tempRot.x = (tempNode.transform.rotation as eulerangles).x - if rotAxis[2] == true then tempRot.y = (tempNode.transform.rotation as eulerangles).y - if rotAxis[3] == true then tempRot.z = (tempNode.transform.rotation as eulerangles).z - ) - else - ( - if rotAxis[1] == true then tempRot.x = (snapshots[i].transform.rotation as eulerangles).x - if rotAxis[2] == true then tempRot.y = (snapshots[i].transform.rotation as eulerangles).y - if rotAxis[3] == true then tempRot.z = (snapshots[i].transform.rotation as eulerangles).z - ) - - - - if posAxis[4] == false then - ( - if posAxis[1] == true then tempPos[1] = tempNode.transform.pos[1] - if posAxis[2] == true then tempPos[2] = tempNode.transform.pos[2] - if posAxis[3] == true then tempPos[3] = tempNode.transform.pos[3] - ) - else - ( - if posAxis[1] == true then tempPos[1] = snapshots[i].transform.pos[1] - if posAxis[2] == true then tempPos[2] = snapshots[i].transform.pos[2] - if posAxis[3] == true then tempPos[3] = snapshots[i].transform.pos[3] - ) - - local tempMatrix = snapshots[i].transform - tempMatrix.rotation = tempRot - tempMatrix.pos = tempPos - - - try tempSel[i].rotation = tempMatrix.rotation - catch biped.setTransform tempSel[i] #rotation tempMatrix.rotation true - - try tempSel[i].pos = tempMatrix.pos - catch biped.setTransform tempSel[i] #pos tempMatrix.pos true - - - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.operation._f.align" ) -) -align = undefined -logOutput "> Created cryTools.cryAnim.UI.main.operation._f.align function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.operation._f.alignLine ----------------------------------------------------------------------------------------------------------------------------------- --- align the selected node to the list node in a line ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.operation._f.alignLine = function alignLine startPos endPos axis tempSel tempNode = -( - try - ( - local diffAll = endPos[axis] - startPos[axis] - local diffSel = tempNode.transform.pos[axis] - startPos[axis] - - local tempPos = 0 - try ( tempPos = biped.getTransform tempNode #pos ) - catch ( tempPos = tempNode.pos ) - - - - local time = diffSel / diffAll - - local newPos = (endPos * time) + (startPos * (1 - time)) - - try - biped.setTransform tempSel #pos newPos true - catch - tempSel.pos = newPos - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.operation._f.alignLine" ) -) -alignLine = undefined -logOutput "> Created cryTools.cryAnim.UI.main.operation._f.alignLine function" - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.operation._f.applyOperation ----------------------------------------------------------------------------------------------------------------------------------- --- applies the in operationRO selected operation to the selected node ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.operation._f.applyOperation = function applyOperation operation opTo start end steps = -( - try - ( - local ddSelection = cryTools.cryAnim.UI.main._f.getUI "Target" "ddSelection" - local ddOp = cryTools.cryAnim.UI.main._f.getUI "Operation" "ddOperation" - local ddOpTo = cryTools.cryAnim.UI.main._f.getUI "Operation" "ddOperationTo" - - - if ddSelection.selection != 1 then - snapshots = cryTools.cryAnim._f.createSnapshot() - - - axis = 0 - local startPos = [0,0,0] - local endPos = [0,0,0] - - - if (ddSelection.selection > 2) and (ddOp.selection == 2) then - ( - tempNode = $ - - sliderTime = animationRange.start - startPos = tempNode.transform.pos - sliderTime = animationRange.end - endPos = tempNode.transform.pos - tempStart = 0 - - if startPos == endPos then - ( - messageBox ("Start point is equal to End Point") title:"Line Operation" - return false - ) - - - - - - for i = 1 to 3 do - ( - local tempStartPos = startPos[i] - local tempEndPos = endPos[i] - - if tempStartPos < 0 then tempStartPos -= tempStartPos * 2 - if tempEndPos < 0 then tempEndPos -= tempEndPos * 2 - - - - local tempPos = tempEndPos - tempStartPos - if tempPos > tempStart then - ( - axis = i - tempStart = tempPos - ) - ) - ) - - - - - - if operation == 10 then - ( - local animDir = (cryTools.cryAnim.UI.main._f.getUI "Operation" "spnDirection").value - local undoString = "rotate " + animDir as String - if start == end then - undo undoString on ( cryTools.cryAnim._f.rotateAnim animDir ) - else - ( - undo undoString on ( cryTools.cryAnim._f.rotateAnim animDir range:true ) - return false - ) - ) - - saveSliderTime = sliderTime - sliderTime = start - - if selection.count == 1 then - disableSceneRedraw() - - - - - - - tempIndex = 1 - if operation == 12 then - ( - deleteFile cryTools.cryAnim.UI.main._v.tempINIPath - cryTools.cryAnim._v.transformList = #() - for f = 1 to $selection.count do - append cryTools.cryAnim._v.transformList (#()) - ) - - - if selection.count == 0 then - ( - print "Nothing selected." - return false - ) - - - - - - for i = start to end by steps do - ( - escapeEnable = true - - sliderTime = i - case operation of - ( - 1: - ( - if ddSelection.selection == 1 then - ( - undo "make planted key" on - ( - for obj in selection do - ( - tempArray = obj.controller.keys - keyIndex = 0 - for i = 1 to tempArray.count do - if tempArray[i].time == sliderTime then keyIndex = i - try - ( - tempKey = biped.getKey obj.controller keyIndex - if tempKey.ikSpace != 1 or tempKey.ikJoinedPivot == false or tempKey.ikBlend != 1.0 then - biped.setPlantedKey obj - ) - catch - ( - try ( biped.setPlantedKey obj ) catch ( ) - ) - ) - ) - ) - else - ( - undo "align biped object" on - cryTools.cryAnim.UI.main.operation._f.align (getCurrentSelection()) (getNodeByName ddSelection.selected) snapshots:snapshots - ) - ) - 2: - ( - if ddSelection.selection == 1 then - ( - undo "make sliding key" on - ( - for obj in selection do - ( - local tempArray = obj.controller.keys - local keyIndex = 0 - for i = 1 to tempArray.count do - if tempArray[i].time == sliderTime then keyIndex = i - - try - ( - local tempKey = biped.getKey obj.controller keyIndex - if tempKey.ikSpace != 1 or tempKey.ikJoinedPivot == true or tempKey.ikBlend != 1.0 then - biped.setSlidingKey obj - ) - catch - ( - try ( biped.setSlidingKey obj ) catch ( ) - ) - ) - ) - ) - else - ( - undo "lineOperation" on - ( - for obj in selection do - if obj.isHidden == false then - cryTools.cryAnim.UI.main.operation._f.alignLine startPos endPos axis obj (getNodeByName ddSelection.selected) - ) - ) - ) - 3: - ( - undo "make free key" on - ( - for obj in selection do - ( - tempArray = obj.controller.keys - keyIndex = 0 - for i = 1 to tempArray.count do - if tempArray[i].time == sliderTime then keyIndex = i - - try - ( - tempKey = biped.getKey obj.controller keyIndex - if tempKey.ikSpace != 0 or tempKey.ikJoinedPivot == false or tempKey.ikBlend != 0.0 then - biped.setFreeKey obj - ) - catch - ( - try ( biped.setFreeKey obj ) catch ( ) - ) - ) - ) - ) - - 5: - ( - case ddOpTo.selection of - ( - 1:( undo "move to snapshot" on ( cryTools.cryAnim._f.moveBipPart() ) ) - 2:( undo "move to pivot point" on ( cryTools.cryAnim._f.moveBipPartPivPoint() ) ) - ) - ) - 6: - ( - case ddOpTo.selection of - ( - 1:( undo "move/rotate to snapshot" on ( cryTools.cryAnim._f.moveRotBipPart() ) ) - 2:( undo "move/rotate to pivot point" on ( cryTools.cryAnim._f.moveRotBipPartPivPoint() ) ) - ) - ) - - 8:( undo "move to floor" on ( cryTools.cryAnim._f.moveToFloor value:((cryTools.cryAnim.UI.main._f.getUI "Operation" "spnDistance").value) ) ) - 9:( undo "reset rotation" on ( cryTools.cryAnim._f.resetRotation() ) ) - - 12: - ( - for d = 1 to $selection.count do - ( - setINISetting cryTools.cryAnim.UI.main._v.tempINIPath ("Object" + d as String) (tempIndex as String) ($selection[d].transform as String) - ) - ) - 13: - ( - undo "paste transform" on - ( - for d = 1 to $selection.count do - ( - local newTran = getINISetting cryTools.cryAnim.UI.main._v.tempINIPath ("Object" + d as String) (tempIndex as String) - if newTran != "" then - ( - newTran = execute ( newTran ) - local newObjTran = $selection[d].transform - - case ddOpTo.selection of - ( - 1:( cryTools.cryAnim._f.pasteTransform $selection[d] newTran #transform ) - 2:( cryTools.cryAnim._f.pasteTransform $selection[d] newTran #pos ) - 3:( cryTools.cryAnim._f.pasteTransform $selection[d] newTran #rotation ) - ) - ) - ) - ) - ) - - - 15:( undo "bip to [0,0]" on ( cryTools.cryAnim._f.bipToZero2() ) ) - 16:( undo "bip to [0,0,0]" on ( cryTools.cryAnim._f.bipToZero3() ) ) - ) - - tempIndex += 1 - - ) - if isSceneRedrawDisabled() == true then - enableSceneRedraw() - - if snapshots != undefined then - for obj in snapshots do - delete obj - - sliderTime = saveSliderTime - - if operation >= 11 and operation <= 13 then - return false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.operation._f.applyOperation" ) -) -applyOperation = undefined -logOutput "> Created cryTools.cryAnim.UI.main.operation._f.applyOperation function" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.pivot._f.pivotPoint ----------------------------------------------------------------------------------------------------------------------------------- --- applies the in operationRO selected operation to the selected node ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.pivot._f.pivotPoint = function pivotPoint operation = -( - try - ( - if (selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() ) != undefined then - ( - case operation of - ( - #check: - ( - if selectedBipPart.pivotSel.pivPoint.position == undefined then - ( - return false - ) - else - ( - return true - ) - ) - #create: - ( - ready = true - try - ( - addModifier selectedBipPart.object.selected (edit_mesh()) - local tempPos = (cryTools.cryAnim._f.getPivotPointPos selectedBipPart.pivotSel.index selectedBipPart.object.selected) - deleteModifier selectedBipPart.object.selected 1 - - local tempSnap = (cryTools.cryAnim._f.createSnapshot object:(getNodeByName selectedBipPart.pivotSel.pivObject))[1] - tempSnap.wireColor = (color 255 0 0) - tempSnap.showFrozenInGray = false - tempSnap.isFrozen = true - tempSnap.name = ("pivSnap_(" + selectedBipPart.name + ")") - - tempSphere = sphere pos:tempPos radius:0.2 - tempSphere.wireColor = (color 255 0 0) - tempSphere.showFrozenInGray = false - tempSphere.isFrozen = true - tempSphere.name = ("pivPoint_(" + selectedBipPart.name + ")") - - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivPoint.name = \"" + tempSphere.name + "\"") - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivPoint.position = " + (tempPos as String)) - )catch() - ) - #delete: - ( - try - ( - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivPoint.name = undefined") - execute ("cryTools.cryAnim.align._v.pivotLast." + selectedBipPart.part.name + ".pivPoint.position = undefined") - delete (getNodeByName selectedBipPart.pivotSel.pivPoint.name) - delete (getNodeByName ("pivSnap" + ( substring selectedBipPart.pivotSel.pivPoint.name 9 selectedBipPart.pivotSel.pivPoint.name.count )) ) - return true - )catch() - - return false - ) - ) - ) - return undefined - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.pivot._f.pivotPoint" ) -) -pivotPoint = undefined -logOutput "> Created cryTools.cryAnim.UI.main.pivot._f.pivotPoint function" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.outputINI ----------------------------------------------------------------------------------------------------------------------------------- --- outputs the poses into the temp\ini file of the character ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.outputINI = function outputINI = -( - try - ( - local tempCharArray = #() - local tempColArray = #() - local tempPoseArray = #() - - local poses = cryTools.cryAnim.UI.main.poseManager._v.poses - local tempString = "" - local nodeString = "" - - - local charFileArray = getFiles (cryTools.cryTemp + "CryAnimPoseManager\\*.ini") - for i = 1 to charFileArray.count do - try ( deleteFile charFileArray[i] ) catch() - - - --// goes through the characters - for i = 1 to poses.count do - ( - local poseCount = 1 - local tempCharString = "" - --// sets character filename - for h = 1 to poses[i].nodes.count do - tempCharString += "#" + poses[i].nodes[h] - - local tempFilename = (cryTools.cryTemp + "CryAnimPoseManager\\" + poses[i].name + ".ini") - cryTools.cryAnim.UI.main._f.checkExport #createFolder tempFilename - - setINISetting tempFilename poses[i].name "nodes" tempCharString - - local tempColString = "" - for f = 1 to poses[i].collections.count do - ( - tempColString += "#" + poses[i].collections[f].name - - local tempPoseString - for d = 1 to poses[i].collections[f].poses.count do - ( - setINISetting tempFilename ("pose" + poseCount as String) "Collection" (f as String) - setINISetting tempFilename ("pose" + poseCount as String) "Name" poses[i].collections[f].poses[d].name - - for k = 1 to poses[i].collections[f].poses[d].nodes.count do - ( - local tempPoseString = poses[i].collections[f].poses[d].nodes[k].name + "/" + poses[i].collections[f].poses[d].nodes[k].transform as String - setINISetting tempFilename ("pose" + poseCount as String) ("node" + k as String) tempPoseString - ) - - poseCount += 1 - ) - ) - setINISetting tempFilename poses[i].name "collections" tempColString - - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.pivotPoint" ) -) -outputINI = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.outputINI function" - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.inputINI ----------------------------------------------------------------------------------------------------------------------------------- --- inputs the poses from the temp\ini file of the character ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.inputINI = function inputINI = -( - try - ( - global superTempArray = #() - local charFileArray = getFiles (cryTools.cryTemp + "CryAnimPoseManager\\*.ini") - if charFileArray.count > 0 then - ( - cryTools.cryAnim.UI.main.poseManager._v.poses = #() - - for i = 1 to charFileArray.count do - ( - local charEntry = cryTools.cryAnim.base.perforce charFileArray[i] #getFilename - charEntry = substring charEntry 1 (charEntry.count - 4) - local charNodes = getINISetting charFileArray[i] charEntry "nodes" - local charCollections = getINISetting charFileArray[i] charEntry "collections" - - if charNodes != "" then - charNodes = filterString charNodes "#" - else - charNodes = #() - - if charCollections != "" then - charCollections = filterString charCollections "#" - else - charCollections = #() - - for i = 1 to charCollections.count do - charCollections[i] = collectionStruct name:charCollections[i] - - - - - local tempPoseArray = #() - for h = 1 to 200 do - ( - if (local poseName = getINISetting charFileArray[i] ("pose" + h as String) "Name" ) != "" then - ( - local poseNodeArray = #() - local colIndex = (getINISetting charFileArray[i] ("pose" + h as String) "Collection") as Integer - - for g = 1 to 600 do - ( - if (local tempNode = getINISetting charFileArray[i] ("pose" + h as String) ("node" + g as String)) != "" then - ( - local tempArray = filterString tempNode "/" - local tempValue = execute (tempArray[2]) - append poseNodeArray (nodeStruct name:tempArray[1] transform:tempValue ) - ) - ) - - append charCollections[colIndex].poses (poseStruct name:poseName nodes:poseNodeArray) - ) - ) - append cryTools.cryAnim.UI.main.poseManager._v.poses (charStruct name:charEntry nodes:charNodes collections:charCollections) - - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.inputINI" ) -) -inputINI = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.inputINI function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.createPoseBitmap ----------------------------------------------------------------------------------------------------------------------------------- --- renders a bitmap of the current scene and outputs them to the character folder ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.createPoseBitmap = function createPoseBitmap outputPath = -( - try - ( - local chkNodesOnly = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "chkNodesOnly" - local lbNodes = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "lbNodes" - - - if chkNodesOnly.checked == true then - ( - nodeRenderArray = Objects as Array - newNodeRenderArray = #() - for obj in Objects do - append newNodeRenderArray obj.renderable - - for i = 1 to nodeRenderArray.count do - ( - if (findItem lbNodes.items nodeRenderArray[i].name) != 0 then - nodeRenderArray[i].renderable = true - else - nodeRenderArray[i].renderable = false - ) - ) - - local tempRender = render frame:#current outputsize:[144,110] renderhiddenobjects:false rendSimplifyAreaLights:true renderatmosphericeffects:false vfb:false outputHDRbitmap:false ComputeRadiosity:false progressbar:false renderMultiPassEffects:false mapping:false shadows:false autoReflect:false objectMotionBlur:false imageMotionBlur:false quiet:true - if tempRender != undefined then - ( - cryTools.cryAnim.UI.main._f.checkExport #createFolder outputPath - tempRender.filename = outputPath - save tempRender - (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "bmpPreview").bitmap = tempRender - - if chkNodesOnly.checked == true then - ( - for i = 1 to nodeRenderArray.count do - nodeRenderArray[i].renderable = newNodeRenderArray[i] - ) - ) - - - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.outputPath" ) -) -outputPath = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.outputPath function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.updateList ----------------------------------------------------------------------------------------------------------------------------------- --- updates the pose managers lists with the input ini settings ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.updateList = function updateList objectName initial:undefined = -( - try - ( - local ddCharacter = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCharacter" - local btnDeleteCharacter = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "btnDeleteCharacter" - local ddCollection = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCollection" - local btnDeleteCollection = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "btnDeleteCollection" - local btnCreateCollection = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "btnCreateCollection" - local ddPose = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddPose" - local btnDeletePose = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "btnDeletePose" - local btnCreatePose = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "btnCreatePose" - local btnPastePose = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "btnPastePose" - local lbNodes = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "lbNodes" - local edCharacter = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "edCharacter" - local edCollection = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "edCollection" - local edPose = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "edPose" - - - - - - case objectName of - ( - #character: - ( - local tempCharNameArray = #() - local tempColNameArray = #() - local tempPoseNameArray = #() - - if cryTools.cryAnim.UI.main.poseManager._v.poses.count > 0 then - ( - if initial == undefined then - ddCharSel = ddCharacter.selection - else - ( - for i = 1 to cryTools.cryAnim.UI.main.poseManager._v.poses.count do - append tempCharNameArray cryTools.cryAnim.UI.main.poseManager._v.poses[i].name - - ddCharacter.items = tempCharNameArray - ddCharSel = 1 - ) - - ddCollection.selection = 1 - ddPose.selection = 1 - - lbNodes.items = cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharSel].nodes - - if cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharSel].collections.count > 0 then - ( - for i = 1 to cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharSel].collections.count do - append tempColNameArray cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharSel].collections[i].name - - if cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharSel].collections[1].poses.count > 0 then - for i = 1 to cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharSel].collections[1].poses.count do - append tempPoseNameArray cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharSel].collections[1].poses[i].name - ) - ) - - ddCollection.items = tempColNameArray - ddPose.items = tempPoseNameArray - - ) - - #collection: - ( - local tempPoseNameArray = #() - - if cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].collections.count > 0 then - ( - if cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].collections[ddCollection.selection].poses.count > 0 then - for i = 1 to cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].collections[ddCollection.selection].poses.count do - append tempPoseNameArray cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].collections[ddCollection.selection].poses[i].name - ) - - ddPose.items = tempPoseNameArray - ddPose.selection = 1 - ) - ) - - if ddCharacter.items.count > 0 then - ( - try(edCharacter.text = ddCharacter.items[ddCharSel])catch() - btnDeleteCharacter.enabled = true - ddCharacter.enabled = true - edCharacter.enabled = true - btnCreateCollection.enabled = true - ) - else - ( - edCharacter.text = "" - btnDeleteCharacter.enabled = false - ddCharacter.enabled = false - edCharacter.enabled = false - btnCreateCollection.enabled = false - ) - - - if ddCollection.items.count > 0 then - ( - try(edCollection.text = ddCollection.items[ddCollection.selection])catch() - btnDeleteCollection.enabled = true - ddCollection.enabled = true - edCollection.enabled = true - btnCreatePose.enabled = true - btnPastePose.enabled = true - ) - else - ( - edCollection.text = "" - btnDeleteCollection.enabled = false - ddCollection.enabled = false - edCollection.enabled = false - btnCreatePose.enabled = false - btnPastePose.enabled = false - ) - - if ddPose.items.count > 0 then - ( - edPose.text = ddPose.items[ddPose.selection] - btnDeletePose.enabled = true - ddPose.enabled = true - edPose.enabled = true - btnPastePose.enabled = true - ) - else - ( - edPose.text = "" - btnDeletePose.enabled = false - ddPose.enabled = false - edPose.enabled = false - btnPastePose.enabled = false - ) - - - try ( local tempBitmap = openBitMap (cryTools.cryTemp + "CryAnimPoseManager\\" + ddCharacter.items[ddCharacter.selection] + "\\" + ddCollection.items[ddCollection.selection] + "_" + ddPose.items[ddPose.selection] + ".jpg") )catch() - if tempBitmap == undefined then - tempBitmap = bitmap 144 110 color:(color 190 190 190) - - (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "bmpPreview").bitmap = tempBitmap - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.updateList" ) -) -updateList = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.updateList function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.addEntry ----------------------------------------------------------------------------------------------------------------------------------- --- updates the pose managers lists with the input ini settings ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.addEntry = function addEntry edText objectName = -( - try - ( - local lbNodes = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "lbNodes") - local ddChar = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCharacter") - local ddCol = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCollection") - local ddPose = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddPose") - local poses = cryTools.cryAnim.UI.main.poseManager._v.poses - - local tempNodesArray = #() - local tempCharArray = #() - local tempVar = #() - - if edText != "" then - ( - - case objectName of - ( - "Character": - ( - if $selection.count != 0 then - ( - if (queryBox "Take Nodes from Selection?" title:"Adding Nodes") == true then - tempVar = getCurrentSelection() - else - tempVar = selectByName title:"Create Character Nodes Selection" showHidden:false single:false - ) - else - tempVar = selectByName title:"Create Character Nodes Selection" showHidden:false single:false - - if classOf tempVar == Array and tempVar.count > 0 then - ( - --// sorts nodes list by root->children - tempNodesArray = cryTools.sortRootChildren tempVar - - append cryTools.cryAnim.UI.main.poseManager._v.poses (charStruct name:edText) - - - cryTools.cryAnim.UI.main.poseManager._v.poses[cryTools.cryAnim.UI.main.poseManager._v.poses.count].nodes = deepcopy tempNodesArray - - tempCharArray = ddChar.items - append tempCharArray edText - - - ddChar.items = tempCharArray - lbNodes.items = tempNodesArray - ddChar.selection = tempCharArray.count - - cryTools.cryAnim.UI.main.poseManager._f.updateList #character - ) - else - messageBox "No nodes selected." title:"Error creating Character" - ) - - "Collection": - ( - local tempNodesArray = ddCol.items - append tempNodesArray edText - append cryTools.cryAnim.UI.main.poseManager._v.poses[ddChar.selection].collections (collectionStruct name:edText) - ddCol.items = tempNodesArray - ddCol.selection = ddCol.items.count - - cryTools.cryAnim.UI.main.poseManager._f.updateList #collection - ) - - "Pose": - ( - local tempArray = #() - - in coordsys world - ( - for i = 1 to poses[ddChar.selection].nodes.count do - ( - local tempObj = getNodeByName poses[ddChar.selection].nodes[i] - - if tempObj != undefined then - ( - --// find sliderManipulator - if tempObj.classID[1] == 1205540079 then - local tempTransform = tempObj.value - --// or normal node - else - local tempTransform = tempObj.transform - - try - ( - if getClassName tempObj.controller.position.controller == "Path Constraint" then - tempTransform = tempObj.controller.position.controller.percent - )catch() - - append tempArray (nodeStruct name:tempObj.name transform:tempTransform) - ) - ) - ) - - local tempNodesArray = ddPose.items - append tempNodesArray edText - append cryTools.cryAnim.UI.main.poseManager._v.poses[ddChar.selection].collections[ddCol.selection].poses (poseStruct name:edText nodes:tempArray) - ddPose.items = tempNodesArray - ddPose.selection = ddPose.items.count - - cryTools.cryAnim.UI.main.poseManager._f.createPoseBitmap (cryTools.cryTemp + "CryAnimPoseManager\\" + ddChar.items[ddChar.selection] + "\\" + ddCol.items[ddCol.selection] + "_" + ddPose.items[ddPose.selection] + ".jpg") - - cryTools.cryAnim.UI.main.poseManager._f.updateList #default - ) - ) - - cryTools.cryAnim.UI.main.poseManager._f.outputINI() - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.addEntry" ) -) -addEntry = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.addEntry function" - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.createEntry ----------------------------------------------------------------------------------------------------------------------------------- --- creates a new entry and adds the default text to the corresponding edittext ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.createEntry = function createEntry objectName = -( - try - ( - local ddCharacter = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCharacter" - local ddCollection = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCollection" - - - local edName = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" ("ed" + objectName) - local ddList = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" ("dd" + objectName) - - cryTools.cryAnim._v.various[55] = objectName - local maxDefaultEntriesFound = 0 - - for i = 1 to ddList.items.count do - ( - local tempString = objectName + (if i < 10 then "0" else "") + i as String - if (findItem ddList.items tempString ) != 0 then - maxDefaultEntriesFound += 1 - ) - - maxDefaultEntriesFound += 1 - - - local entryText = objectName + (if maxDefaultEntriesFound < 10 then "0" else "") + maxDefaultEntriesFound as String - - - cryTools.cryAnim.UI.main.poseManager._f.addEntry entryText objectName - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.createEntry" ) -) -createEntry = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.createEntry function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.deleteEntry ----------------------------------------------------------------------------------------------------------------------------------- --- deletes the selected entry of the corresponding listbox ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.deleteEntry = function deleteEntry objectName = -( - try - ( - local lbNodes = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "lbNodes") - local ddChar = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCharacter") - local ddCol = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCollection") - local ddPose = (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddPose") - local edName = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" ("ed" + objectName) - local poses = cryTools.cryAnim.UI.main.poseManager._v.poses - - case objectName of - ( - "Character": - ( - if ddChar.items.count > 0 then - ( - if queryBox ("Delete " + ddChar.items[ddChar.selection] + " ?") title:"Delete Item" == true then - ( - lbNodes.items = #() - local tempArray = ddChar.items - - try (deleteFile (cryTools.cryTemp + "CryAnimPoseManager\\" + ddChar.items[ddChar.selection] + ".ini") )catch() - - local tempFileArray = getFiles (cryTools.cryTemp + "CryAnimPoseManager\\" + ddChar.items[ddChar.selection] + "\\*.jpg") - - for i = 1 to tempFileArray.count do - try (deleteFile tempFileArray[i] )catch() - - - local tempSelection = ddChar.selection - deleteItem cryTools.cryAnim.UI.main.poseManager._v.poses ddChar.selection - deleteItem tempArray ddChar.selection - ddChar.items = tempArray - ddChar.selection = ddChar.items.count - - if tempSelection > 1 then - ddChar.selection = tempSelection - 1 - else - ddChar.selection = tempSelection - - cryTools.cryAnim.UI.main.poseManager._f.updateList #character - - ) - ) - ) - - "Collection": - ( - if ddCol.items.count > 0 then - ( - if queryBox ("Delete " + ddCol.items[ddCol.selection] + " ?") title:"Delete Item" == true then - ( - local tempArray = ddCol.items - for i = 1 to poses[ddChar.selection].collections[ddCol.selection].poses.count do - try (deleteFile (cryTools.cryTemp + "CryAnimCharacter_" + poses[ddChar.selection].name + "_" + poses[ddChar.selection].collections[ddCol.selection].name + "_" + poses[ddChar.selection].collections[ddCol.selection].poses[i].name + ".jpg") )catch() - local tempSelection = ddCol.selection - deleteItem cryTools.cryAnim.UI.main.poseManager._v.poses[ddChar.selection].collections ddCol.selection - deleteItem tempArray ddCol.selection - ddCol.items = tempArray - - if tempSelection > 1 then - ddCol.selection = tempSelection - 1 - else - ddCol.selection = tempSelection - - cryTools.cryAnim.UI.main.poseManager._f.updateList #collection - ) - ) - ) - - "Pose": - ( - if ddPose.items.count > 0 then - ( - if queryBox ("Delete " + ddPose.items[ddPose.selection] + " ?") title:"Delete Item" == true then - ( - local tempArray = ddPose.items - try (deleteFile (cryTools.cryTemp + "CryAnimPoseManager\\" + ddCharacter.items[ddCharacter.selection] + "\\" + ddCollection.items[ddCollection.selection] + "_" + ddPose.items[ddPose.selection] + ".jpg") )catch() - local tempSelection = ddPose.selection - deleteItem cryTools.cryAnim.UI.main.poseManager._v.poses[ddChar.selection].collections[ddCol.selection].poses ddPose.selection - deleteItem tempArray ddPose.selection - ddPose.items = tempArray - - if tempSelection > 1 then - ddPose.selection = tempSelection - 1 - else - ddPose.selection = tempSelection - - cryTools.cryAnim.UI.main.poseManager._f.updateList #default - ) - ) - ) - ) - cryTools.cryAnim.UI.main.poseManager._f.outputINI() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.deleteEntry" ) -) -deleteEntry = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.deleteEntry function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.renameEntry ----------------------------------------------------------------------------------------------------------------------------------- --- renames the selected entry of the corresponding listbox ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.renameEntry = function renameEntry objectName = -( - try - ( - local poses = cryTools.cryAnim.UI.main.poseManager._v.poses - local tempPath = (cryTools.cryTemp + "CryAnimPoseManager\\") - - local ddCharacter = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCharacter" - local ddCollection = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCollection" - local ddPose = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddPose" - local ddList = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" ("dd" + objectName) - local edName = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" ("ed" + objectName) - - local tempArray = ddList.items - - case objectName of - ( - "Character": - ( - try ( renameFile (tempPath + ddCharacter.items[ddCharacter.selection]) (tempPath + edName.text) ) catch() - - poses[ddCharacter.selection].name = edName.text - ) - - "Collection": - ( - local tempFileArray = getFiles (tempPath + ddCharacter.items[ddCharacter.selection] + "\\" + ddCollection.items[ddCollection.selection] + "*.jpg") - if tempFileArray.count > 0 then - ( - for i = 1 to tempFileArray.count do - ( - local tempFileFilter = filterString tempFileArray[i] "\\" - local tempFileString = "" - for f = 1 to (tempFileFilter.count - 1) do - tempFileString += tempFileFilter[f] + "\\" - - tempFileString += edName.text + "_" + (filterString tempFileFilter[tempFileFilter.count] "_")[2] - - try ( renameFile tempFileArray[i] tempFileString ) catch() - ) - ) - - poses[ddCharacter.selection].collections[ddCollection.selection].name = edName.text - ) - - "Pose": - ( - tempFilePath = tempPath + ddCharacter.items[ddCharacter.selection] + "\\" + ddCollection.items[ddCollection.selection] + "_" - try ( renameFile (tempFilePath + ddPose.items[ddPose.selection] + ".jpg") (tempFilePath + edName.text + ".jpg") ) catch() - - poses[ddCharacter.selection].collections[ddCollection.selection].poses[ddPose.selection].name = edName.text - ) - ) - - - tempArray[ddList.selection] = edName.text - ddList.items = tempArray - - cryTools.cryAnim.UI.main.poseManager._f.outputINI() - cryTools.cryAnim.UI.main.poseManager._f.updateList #collection - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.renameEntry" ) -) -renameEntry = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.renameEntry function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.poseManager._f.applyPose ----------------------------------------------------------------------------------------------------------------------------------- --- applies the selected pose to the character ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.poseManager._f.applyPose = function applyPose = -( - try - ( - --// poses array with characters, collections and poses - local poses = cryTools.cryAnim.UI.main.poseManager._v.poses - local ddCharacter = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCharacter" - local ddCollection = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddCollection" - local ddPose = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "ddPose" - local lbNodes = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "lbNodes" - - local chkBoneOnly = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "chkBoneOnly" - local chkControllerValue = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "chkControllerValue" - local chkPasteRotation = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "chkPasteRotation" - local chkPastePosition = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "chkPastePosition" - local chkByVelocity = cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "chkByVelocity" - --------------------------------------------------------------------------- - local tempNodeArray = #() - - if chkBoneOnly.checked == false then - tempNodeArray = poses[ddCharacter.selection].collections[ddCollection.selection].poses[ddPose.selection].nodes - else - ( - local tempSelArray = lbNodes.selection as Array - for i = 1 to tempSelArray.count do - append tempNodeArray poses[ddCharacter.selection].collections[ddCollection.selection].poses[ddPose.selection].nodes[tempSelArray[i]] - ) - - --------------------------------------------------------------------------- - local boneMissingMessage = "Could not find Bones:\n\n" - local boneMissing = false - - for i = 1 to tempNodeArray.count do - ( - if (getNodeByName tempNodeArray[i].name) == undefined then - ( - boneMissingMessage += tempNodeArray[i].name + "\n" - boneMissing = true - ) - ) - - if boneMissing == true then - ( - if queryBox (boneMissingMessage + "\n\nContinue with pasting the pose?") title:"Bones Missing" == false then - return undefined - ) - --------------------------------------------------------------------------- - --// get root node - local root = getNodeByName poses[ddCharacter.selection].collections[ddCollection.selection].poses[ddPose.selection].nodes[1].name - - if root == undefined then - return undefined - - --// get Locator_Locomotion (prop1) if available - try (local bipProp = biped.getNode (getNodeByName poses[ddCharacter.selection].nodes[1]) #prop1) catch() - --------------------------------------------------------------------------- - - with redraw off - ( - for i = 1 to tempNodeArray.count do - ( - try - ( - in coordsys world - ( - local tempNode = getNodeByName tempNodeArray[i].name - if tempNode != undefined then - ( - local newPos = tempNode.transform.pos - local safePos = tempNode.transform.pos - - --// node is a sliderManipulator - case tempNode.classID[1] of - ( - --// sliderManipulator - 1205540079: - ( - try - ( - if chkControllerValue.checked == true then - tempNode.value = tempNodeArray[i].transform - )catch() - ) - --// biped object - 37157: - ( - if chkPasteRotation.checked == true then - try ( biped.setTransform tempNode #rotation tempNodeArray[i].transform.rotation true ) catch() - - if chkPastePosition.checked == true then - ( - if chkByVelocity.checked == false then - ( - try ( biped.setTransform tempNode #pos tempNodeArray[i].transform.pos true ) catch() - ) - else - ( - if tempNodeArray[i].name != root.name then - ( - local offsetPos = tempNodeArray[1].transform.pos - tempNodeArray[i].transform.pos - local newOffsetPos = root.transform.pos - offsetPos - - try ( biped.setTransform tempNode #pos newOffsetPos true ) catch() - ) - ) - ) - ) - - default: - ( - local isNormalNode = false - - --// if node is path constraint - try - ( - if getClassName tempNode.controller.position.controller == "Path Constraint" then - ( - if chkControllerValue.checked == true then - try ( tempNode.controller.position.controller.percent = tempNodeArray[i].transform ) catch() - ) - else - isNormalNode = true - ) - catch( isNormalNode = true) - - --// normal node - if isNormalNode == true then - ( - if chkPasteRotation.checked == true then - try ( tempNode.rotation = inverse tempNodeArray[i].transform.rotation ) catch() - - if chkPastePosition.checked == true then - ( - if chkByVelocity.checked == false then - newPos = tempNodeArray[i].transform.pos - else - ( - if tempNodeArray[i].name != root.name then - ( - local offsetPos = tempNodeArray[1].transform.pos - tempNodeArray[i].transform.pos - newPos = root.transform.pos - offsetPos - ) - ) - ) - else - newPos = safePos - - try ( tempNode.pos = newPos ) catch() - ) - ) - ) - ) - ) - ) - catch() - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.poseManager._f.applyPose" ) -) -applyPose = undefined -logOutput "> Created cryTools.cryAnim.UI.main.poseManager._f.applyPose function" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.loadSave._f.checkRange ----------------------------------------------------------------------------------------------------------------------------------- --- checks the range of the animation and timeline range ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.loadSave._f.checkRange = function checkRange begin end = -( - try - ( - local tempTextString = "The current timeline range differs from the selected range.\nDo you want to use the current time range?\n\n" - - local tempTimeString = #( ( (animationRange.start.frame as Integer) as String + " -> " + (animationRange.end.frame as Integer) as String), ( begin as String + " -> " + end as String ) ) - - local tempInt = #( (getTextExtent tempTimeString[1])[1], (getTextExtent tempTimeString[2])[1] ) - local tempSep = #() - - - - for i = 1 to tempInt.count do - ( - tempSepString = "" - for f = 1 to tempInt[i] by 3 do - tempSepString += " " - - tempSep[i] = tempSepString - ) - - tempSep[2] = substring tempSep[2] 1 (tempSep[2].count - (tempSep[1].count - tempSep[2].count)) - - - - if ( queryBox (tempTextString + " " + tempTimeString[1] + " " + tempSep[2] + tempTimeString[2] ) title:("Animation Range") ) == true then - return interval animationRange.start.frame animationRange.end.frame - else - return interval begin end - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.loadSave._f.checkRange" ) -) -checkRange = undefined -logOutput "> Created cryTools.cryAnim.UI.main.loadSave._f.checkRange function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.loadSave._f.getProgressInfo ----------------------------------------------------------------------------------------------------------------------------------- --- returns the current progress text or the width ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.loadSave._f.getProgressInfo = function getProgressInfo op = -( - try - ( - local tempString = (" Processing Animation: " + cryTools.cryAnim.base.perforce cryTools.cryAnim.UI.main.loadSave._v.cafSavePath #getFilename) - local tempSize = getTextExtent tempString - case op of - ( - #width: - return tempSize[1] - #text: - return tempString - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.loadSave._f.getProgressInfo" ) -) -getProgressInfo = undefined -logOutput "> Created cryTools.cryAnim.UI.main.loadSave._f.getProgressInfo function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.loadSave._f.updateProgressBar ----------------------------------------------------------------------------------------------------------------------------------- --- refreshes the progressbar ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.loadSave._f.updateProgressBar = function updateProgressBar tempBitmap phase = -( - try - ( - maxColor = (color 255 0 0)--(color 230 100 0) - minColor = (color 0 0 0)--(color 110 120 130) - - - for x = 0 to tempBitmap.width do - ( - tempColor = (getPixels tempBitmap [x,0] 1)[1] - - for y = 0 to tempBitmap.height + 1 do - ( - diff = phase - x - if diff < 0 then - diff -= diff * 2 - - - percent = ((diff * 100) / tempBitmap.width) - newColor = (maxColor / percent) + minColor - - setPixels tempBitmap [x,y] #(newColor) - ) - ) - - return tempBitmap - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.loadSave._f.updateProgressBar" ) -) -updateProgressBar = undefined -logOutput "> Created cryTools.cryAnim.UI.main.loadSave._f.updateProgressBar function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.loadSave._f.progressDialog ----------------------------------------------------------------------------------------------------------------------------------- --- creates or deletes the test bar progress dialog ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.loadSave._f.progressDialog = function progressDialog op = -( - try - ( - case op of - ( - #destroy: - ( - destroyDialog cryTools.cryAnim.UI.main.loadSave.testBar - ) - #generate: - ( - try (destroyDialog cryTools.cryAnim.UI.main.loadSave.testBar) catch() - rollout testBar "Exporting Animation" width:300 height:32 - ( - label progressInfo "" pos:[10,5] height:15 align:#left - bitmap progressBar pos:[10,20] bitmap:(bitmap ((getProgressInfo #width) + 20) 5 color:(color 80 80 80)) - timer clock interval:80 active:true - - on testBar open do - ( - progressInfo.text = cryTools.cryAnim.UI.main.loadSave._f.getProgressInfo #text - testBar.width = (cryTools.cryAnim.UI.main.loadSave._f.getProgressInfo #width) + 40 - forward = true - global colorDirection = true - global tempX = 0 - ) - - on clock tick do - ( - progressBar.bitmap = cryTools.cryAnim.UI.main.loadSave._f.updateProgressBar progressBar.bitmap tempX - if tempX >= progressBar.bitmap.width then - colorDirection = false - if tempX <= 0 then - colorDirection = true - - if colorDirection == true then - tempX += 10 - else - tempX -= 10 - ) - - ) - cryTools.cryAnim.UI.main.loadSave.testBar = testBar - testBar = undefined - - createDialog cryTools.cryAnim.UI.main.loadSave.testBar --style:#(#style_sunkenedge) - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.loadSave._f.progressDialog" ) -) -progressDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.main.loadSave._f.progressDialog function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.loadSave._f.bakeMuscleBones ----------------------------------------------------------------------------------------------------------------------------------- --- bakes muscle bones to keys ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.loadSave._f.bakeMuscleBones = function bakeMuscleBones = -( - try - ( - if (cryTools.cryAnim.UI.main._f.getUI "Muscles" "Auto-Muscles").checked == true then - ( - if $'_Bip01 L knee_Con' != undefined then - ( - global automateAnimateMuscles = false - global useMuscleKeys = undefined - - saveSliderTime = sliderTime - sliderTime = animationRange.end - - local tempMode = getCommandPanelTaskMode() - setCommandPanelTaskMode #motion - - - for i = animationRange.start to animationRange.end do - ( - escapeEnable = true - sliderTime = i - ) - - sliderTime = saveSliderTime - - global automateAnimateMuscles = false - global useMuscleKeys = true - ) - else - return undefined - ) - else return false - - - - if (cryTools.cryAnim.UI.main._f.getUI "Muscles" "Auto-Muscles").checked == true then - global automateAnimateMuscles = undefined - else - global automateAnimateMuscles = false - - if (cryTools.cryAnim.UI.main._f.getUI "Muscles" "Use Keys").checked == true then - global useMusclesKeys = true - else - global useMusclesKeys = undefined - - return true - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.loadSave._f.bakeMuscleBones" ) -) -bakeMuscleBones = undefined -logOutput "> Created cryTools.cryAnim.UI.main.loadSave._f.bakeMuscleBones function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents ----------------------------------------------------------------------------------------------------------------------------------- --- returns the extent of the lbStatus entry ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents = function getStatusExtents = -( - try - ( - local tempSLB = (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "").lbStatus - local tempSFLB = (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "").lbStatusFilepath - local tempSize = getTextExtent tempSFLB.items[tempSLB.selection] - - return tempSize[1] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents" ) -) -getStatusExtents = undefined -logOutput "> Created cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents function" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.target._f.updateDDSelection ----------------------------------------------------------------------------------------------------------------------------------- --- updates the listbox in targetRO and changes settings in operationRO ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.target._f.updateDDSelection = function updateDDSelection op:undefined = -( - try - ( - local ddSelection = cryTools.cryAnim.UI.main._f.getUI "Target" "ddSelection" - local grpAxis = cryTools.cryAnim.UI.main._f.getUI "Target" "grpAxis" - local labX = cryTools.cryAnim.UI.main._f.getUI "Target" "labX" - local labY = cryTools.cryAnim.UI.main._f.getUI "Target" "labY" - local labZ = cryTools.cryAnim.UI.main._f.getUI "Target" "labZ" - local labOffset = cryTools.cryAnim.UI.main._f.getUI "Target" "labOffset" - local labPos = cryTools.cryAnim.UI.main._f.getUI "Target" "labPos" - local chkX = cryTools.cryAnim.UI.main._f.getUI "Target" "chkX" - local chkY = cryTools.cryAnim.UI.main._f.getUI "Target" "chkY" - local chkZ = cryTools.cryAnim.UI.main._f.getUI "Target" "chkZ" - local chkPosOffset = cryTools.cryAnim.UI.main._f.getUI "Target" "chkPosOffset" - local labRot = cryTools.cryAnim.UI.main._f.getUI "Target" "labRot" - local chkXRot = cryTools.cryAnim.UI.main._f.getUI "Target" "chkXRot" - local chkYRot = cryTools.cryAnim.UI.main._f.getUI "Target" "chkYRot" - local chkZRot = cryTools.cryAnim.UI.main._f.getUI "Target" "chkZRot" - local chkRotOffset = cryTools.cryAnim.UI.main._f.getUI "Target" "chkRotOffset" - local btnSetOffset = cryTools.cryAnim.UI.main._f.getUI "Target" "btnSetOffset" - local labEditOffset1 = cryTools.cryAnim.UI.main._f.getUI "Target" "labEditOffset1" - local labEditOffset2 = cryTools.cryAnim.UI.main._f.getUI "Target" "labEditOffset2" - local edOffset1 = cryTools.cryAnim.UI.main._f.getUI "Target" "edOffset1" - local edOffset2 = cryTools.cryAnim.UI.main._f.getUI "Target" "edOffset2" - - - local tempArray = #() - local tempArrayNames = #() - - for obj in objects do - ( - if obj.isHidden == false then - append tempArray obj.name - ) - - sort tempArray - - if tempArray.count != 0 then - insertItem "----------------------------------------" tempArray 1 - - insertItem "--------- Update List -----------" tempArray 1 - insertItem "----- Current Selection ------" tempArray 1 - - if ddSelection.items.count != tempArray.count then - ddSelection.items = tempArray - - local groupArray = #(\ - grpAxis, labX, labY, labZ, labOffset, \ - labPos, chkX, chkY, chkZ, chkPosOffset, \ - labRot, chkXRot, chkYRot, chkZRot, chkRotOffset, btnSetOffset, \ - labEditOffset1, labEditOffset2, edOffset1, edOffset2 ) - - if op == false then - ( - for i = 1 to groupArray.count do - groupArray[i].enabled = false - - ) - if op == true then - ( - for i = 1 to groupArray.count do - groupArray[i].enabled = true - - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.target._f.updateDDSelection" ) -) -updateDDSelection = undefined -logOutput "> Created cryTools.cryAnim.UI.main.target._f.updateDDSelection function" - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.target._f.updateOffset ----------------------------------------------------------------------------------------------------------------------------------- --- generates the offset of the selected node and selected item in the list ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.target._f.updateOffset = function updateOffset = -( - try - ( - local tempArray = #([0,0,0], (eulerangles 0 0 0)) - local chkPosOffset = cryTools.cryAnim.UI.main._f.getUI "Target" "chkPosOffset" - local chkRotOffset = cryTools.cryAnim.UI.main._f.getUI "Target" "chkRotOffset" - local labEditOffset1 = cryTools.cryAnim.UI.main._f.getUI "Target" "labEditOffset1" - local labEditOffset2 = cryTools.cryAnim.UI.main._f.getUI "Target" "labEditOffset2" - local edOffset1 = cryTools.cryAnim.UI.main._f.getUI "Target" "edOffset1" - local edOffset2 = cryTools.cryAnim.UI.main._f.getUI "Target" "edOffset2" - local grpAxis = cryTools.cryAnim.UI.main._f.getUI "Target" "grpAxis" - - try - ( - if cryTools.cryAnim._v.various[35].count > 0 then - ( - if chkPosOffset.checked == true then - tempArray[1] = cryTools.cryAnim._v.various[35][1].position as String - if chkRotOffset.checked == true then - tempArray[2] = cryTools.cryAnim._v.various[35][1].rotation as eulerangles - - tempArray[2] = (tempArray[2].x as Integer) as String + " " + (tempArray[2].y as Integer) as String + " " + (tempArray[2].z as Integer) as String - ) - )catch() - - - - if chkPosOffset.checked != chkRotOffset.checked then - ( - labEditOffset1.visible = true - edOffset1.visible = true - labEditOffset2.visible = false - edOffset2.visible = false - grpAxis.height = 107 - - (cryTools.cryAnim.UI.main._f.getUI "Target" "").height = 148 - - if chkPosOffset.checked == true then - ( - labEditOffset1.text = "Pos" - edOffset1.text = tempArray[1] - ) - if chkRotOffset.checked == true then - ( - labEditOffset1.text = "Rot" - edOffset1.text = tempArray[2] - ) - ) - - if chkPosOffset.checked == false and chkRotOffset.checked == false then - ( - labEditOffset1.visible = false - labEditOffset2.visible = false - edOffset1.visible = false - edOffset2.visible = false - grpAxis.height = 85 - - (cryTools.cryAnim.UI.main._f.getUI "Target" "").height = 128 - ) - - if chkPosOffset.checked == true and chkRotOffset.checked == true then - ( - labEditOffset1.visible = true - labEditOffset2.visible = true - edOffset1.visible = true - edOffset2.visible = true - grpAxis.height = 125 - - labEditOffset1.text = "Pos" - edOffset1.text = tempArray[1] - labEditOffset2.text = "Rot" - edOffset2.text = tempArray[2] - - (cryTools.cryAnim.UI.main._f.getUI "Target" "").height = 166 - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.target._f.updateOffset" ) -) -updateOffset = undefined -logOutput "> Created cryTools.cryAnim.UI.main.target._f.updateOffset function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.UI.main.target._f.setManualOffset ----------------------------------------------------------------------------------------------------------------------------------- --- sets the new value for the offset of the selected node and the selected item in the listbox ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.UI.main.target._f.setManualOffset = function setManualOffset lab ed = -( - try - ( - local tempVar - local error = false - try - ( - tempVar = execute ("eulerangles " + ed.text) - ) - catch ( error = true ) - - if lab.text == "Pos" then - ( - if error == false then - ( - if classOf tempVar == Point3 then - ( - cryTools.cryAnim._v.various[35][1].position = tempVar - print "Changed Offset Pos" - ) - else - ( - ed.text = cryTools.cryAnim._v.various[35][1].position as String - error = true - ) - ) - else - ( - ed.text = cryTools.cryAnim._v.various[35][1].position as String - ) - ) - if lab.text == "Rot" then - ( - local tempRot = cryTools.cryAnim._v.various[35][1].rotation as eulerangles - tempRot = (tempRot.x as Integer) as String + " " + (tempRot.y as Integer) as String + " " + (tempRot.z as Integer) as String - if error == false then - ( - if classOf tempVar == EulerAngles then - ( - cryTools.cryAnim._v.various[35][1].rotation = tempVar - print "Changed Offset Rot" - ) - else - ( - ed.text = tempRot - error = true - ) - ) - else - ( - ed.text = tempRot - ) - ) - - if error == true then - messageBox "Invalid value entered" title:("Manual " + lab.text + " Offset") - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.target._f.setManualOffset" ) -) -setManualOffset = undefined -logOutput "> Created cryTools.cryAnim.UI.main.target._f.setManualOffset function" - - - - - - - - - - - - -cryTools.cryAnim.UI.main.settings._f.callCustomizeDialog = function callCustomizeDialog = -( - try - ( - rollout customizeRolloutsRO "Customize Rollouts" - ( - - label labRow1 "Row 1" pos:[28,8] - dropdownlist ddRow1_1 "" pos:[8,25] width:90 height:15 - dropdownlist ddRow1_2 "" pos:[8,45] width:90 height:15 - dropdownlist ddRow1_3 "" pos:[8,65] width:90 height:15 - dropdownlist ddRow1_4 "" pos:[8,85] width:90 height:15 - dropdownlist ddRow1_5 "" pos:[8,105] width:90 height:15 - dropdownlist ddRow1_6 "" pos:[8,125] width:90 height:15 - dropdownlist ddRow1_7 "" pos:[8,145] width:90 height:15 - dropdownlist ddRow1_8 "" pos:[8,165] width:90 height:15 - dropdownlist ddRow1_9 "" pos:[8,185] width:90 height:15 - dropdownlist ddRow1_10 "" pos:[8,205] width:90 height:15 - - - - label labRow2 "Row 2" pos:[128,8] - dropdownlist ddRow2_1 "" pos:[108,25] width:90 height:15 - dropdownlist ddRow2_2 "" pos:[108,45] width:90 height:15 - dropdownlist ddRow2_3 "" pos:[108,65] width:90 height:15 - dropdownlist ddRow2_4 "" pos:[108,85] width:90 height:15 - dropdownlist ddRow2_5 "" pos:[108,105] width:90 height:15 - dropdownlist ddRow2_6 "" pos:[108,125] width:90 height:15 - dropdownlist ddRow2_7 "" pos:[108,145] width:90 height:15 - dropdownlist ddRow2_8 "" pos:[108,165] width:90 height:15 - dropdownlist ddRow2_9 "" pos:[108,185] width:90 height:15 - dropdownlist ddRow2_10 "" pos:[108,205] width:90 height:15 - - - - label labRow3 "Row 3" pos:[228,8] - dropdownlist ddRow3_1 "" pos:[208,25] width:90 height:15 - dropdownlist ddRow3_2 "" pos:[208,45] width:90 height:15 - dropdownlist ddRow3_3 "" pos:[208,65] width:90 height:15 - dropdownlist ddRow3_4 "" pos:[208,85] width:90 height:15 - dropdownlist ddRow3_5 "" pos:[208,105] width:90 height:15 - dropdownlist ddRow3_6 "" pos:[208,125] width:90 height:15 - dropdownlist ddRow3_7 "" pos:[208,145] width:90 height:15 - dropdownlist ddRow3_8 "" pos:[208,165] width:90 height:15 - dropdownlist ddRow3_9 "" pos:[208,185] width:90 height:15 - dropdownlist ddRow3_10 "" pos:[208,205] width:90 height:15 - - - - - label labRow4 "Row 4" pos:[328,8] - dropdownlist ddRow4_1 "" pos:[308,25] width:90 height:15 - dropdownlist ddRow4_2 "" pos:[308,45] width:90 height:15 - dropdownlist ddRow4_3 "" pos:[308,65] width:90 height:15 - dropdownlist ddRow4_4 "" pos:[308,85] width:90 height:15 - dropdownlist ddRow4_5 "" pos:[308,105] width:90 height:15 - dropdownlist ddRow4_6 "" pos:[308,125] width:90 height:15 - dropdownlist ddRow4_7 "" pos:[308,145] width:90 height:15 - dropdownlist ddRow4_8 "" pos:[308,165] width:90 height:15 - dropdownlist ddRow4_9 "" pos:[308,185] width:90 height:15 - dropdownlist ddRow4_10 "" pos:[308,205] width:90 height:15 - - - - - label labRow5 "Row 5" pos:[428,8] - dropdownlist ddRow5_1 "" pos:[408,25] width:90 height:15 - dropdownlist ddRow5_2 "" pos:[408,45] width:90 height:15 - dropdownlist ddRow5_3 "" pos:[408,65] width:90 height:15 - dropdownlist ddRow5_4 "" pos:[408,85] width:90 height:15 - dropdownlist ddRow5_5 "" pos:[408,105] width:90 height:15 - dropdownlist ddRow5_6 "" pos:[408,125] width:90 height:15 - dropdownlist ddRow5_7 "" pos:[408,145] width:90 height:15 - dropdownlist ddRow5_8 "" pos:[408,165] width:90 height:15 - dropdownlist ddRow5_9 "" pos:[408,185] width:90 height:15 - dropdownlist ddRow5_10 "" pos:[408,205] width:90 height:15 - - - - - label labRow6 "Row 6" pos:[528,8] - dropdownlist ddRow6_1 "" pos:[508,25] width:90 height:15 - dropdownlist ddRow6_2 "" pos:[508,45] width:90 height:15 - dropdownlist ddRow6_3 "" pos:[508,65] width:90 height:15 - dropdownlist ddRow6_4 "" pos:[508,85] width:90 height:15 - dropdownlist ddRow6_5 "" pos:[508,105] width:90 height:15 - dropdownlist ddRow6_6 "" pos:[508,125] width:90 height:15 - dropdownlist ddRow6_7 "" pos:[508,145] width:90 height:15 - dropdownlist ddRow6_8 "" pos:[508,165] width:90 height:15 - dropdownlist ddRow6_9 "" pos:[508,185] width:90 height:15 - dropdownlist ddRow6_10 "" pos:[508,205] width:90 height:15 - - - - - label labRow7 "Row 7" pos:[628,8] - dropdownlist ddRow7_1 "" pos:[608,25] width:90 height:15 - dropdownlist ddRow7_2 "" pos:[608,45] width:90 height:15 - dropdownlist ddRow7_3 "" pos:[608,65] width:90 height:15 - dropdownlist ddRow7_4 "" pos:[608,85] width:90 height:15 - dropdownlist ddRow7_5 "" pos:[608,105] width:90 height:15 - dropdownlist ddRow7_6 "" pos:[608,125] width:90 height:15 - dropdownlist ddRow7_7 "" pos:[608,145] width:90 height:15 - dropdownlist ddRow7_8 "" pos:[608,165] width:90 height:15 - dropdownlist ddRow7_9 "" pos:[608,185] width:90 height:15 - dropdownlist ddRow7_10 "" pos:[608,205] width:90 height:15 - - - - - label labRow8 "Row 8" pos:[728,8] - dropdownlist ddRow8_1 "" pos:[708,25] width:90 height:15 - dropdownlist ddRow8_2 "" pos:[708,45] width:90 height:15 - dropdownlist ddRow8_3 "" pos:[708,65] width:90 height:15 - dropdownlist ddRow8_4 "" pos:[708,85] width:90 height:15 - dropdownlist ddRow8_5 "" pos:[708,105] width:90 height:15 - dropdownlist ddRow8_6 "" pos:[708,125] width:90 height:15 - dropdownlist ddRow8_7 "" pos:[708,145] width:90 height:15 - dropdownlist ddRow8_8 "" pos:[708,165] width:90 height:15 - dropdownlist ddRow8_9 "" pos:[708,185] width:90 height:15 - dropdownlist ddRow8_10 "" pos:[708,205] width:90 height:15 - - - - - label labRow9 "Row 9" pos:[828,8] - dropdownlist ddRow9_1 "" pos:[808,25] width:90 height:15 - dropdownlist ddRow9_2 "" pos:[808,45] width:90 height:15 - dropdownlist ddRow9_3 "" pos:[808,65] width:90 height:15 - dropdownlist ddRow9_4 "" pos:[808,85] width:90 height:15 - dropdownlist ddRow9_5 "" pos:[808,105] width:90 height:15 - dropdownlist ddRow9_6 "" pos:[808,125] width:90 height:15 - dropdownlist ddRow9_7 "" pos:[808,145] width:90 height:15 - dropdownlist ddRow9_8 "" pos:[808,165] width:90 height:15 - dropdownlist ddRow9_9 "" pos:[808,185] width:90 height:15 - dropdownlist ddRow9_10 "" pos:[808,205] width:90 height:15 - - - - - label labRow10 "Row 10" pos:[928,8] - dropdownlist ddRow10_1 "" pos:[908,25] width:90 height:15 - dropdownlist ddRow10_2 "" pos:[908,45] width:90 height:15 - dropdownlist ddRow10_3 "" pos:[908,65] width:90 height:15 - dropdownlist ddRow10_4 "" pos:[908,85] width:90 height:15 - dropdownlist ddRow10_5 "" pos:[908,105] width:90 height:15 - dropdownlist ddRow10_6 "" pos:[908,125] width:90 height:15 - dropdownlist ddRow10_7 "" pos:[908,145] width:90 height:15 - dropdownlist ddRow10_8 "" pos:[908,165] width:90 height:15 - dropdownlist ddRow10_9 "" pos:[908,185] width:90 height:15 - dropdownlist ddRow10_10 "" pos:[908,205] width:90 height:15 - - - - button btnSave "Save" pos:[408,235] width:90 height:20 - button btnCancel "Cancel" pos:[508,235] width:90 height:20 - - - - - - - function updateDialog init:undefined = - ( - local rolloutList = #("---------------------------", "Target", "Operation", "Pivot", "Models", "Muscles", "Locator", "Load / Save / Export", "Pose Manager", "Perforce", "Settings") - - if init != undefined then - ( - for i = 1 to 10 do - ( - for f = 1 to 10 do - ( - local tempDD = execute ("cryTools.cryAnim.UI.main.settings.customizeRollouts.ddRow" + i as String + "_" + f as String) - tempDD.items = rolloutList - ) - ) - ) - ) - - - - on customizeRolloutsRO open do - ( - updateDialog init:true - ) - - - - on btnCancel pressed do - ( - try destroyDialog cryTools.cryAnim.UI.main.settings.customizeRollouts catch() - ) - - - - ) - - - cryTools.cryAnim.UI.main.settings.customizeRollouts = customizeRolloutsRO - customizeRolloutsRO = undefined - - createDialog cryTools.cryAnim.UI.main.settings.customizeRollouts 1000 260 - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.settings._f.callCustomizeDialog" ) -) -callCustomizeDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.main.settings._f.callCustomizeDialog function" - - - - - - -logOutput ">> functions.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/load.ms b/Tools/maxscript/cryAnim/load.ms deleted file mode 100644 index ba95af691e..0000000000 --- a/Tools/maxscript/cryAnim/load.ms +++ /dev/null @@ -1,3201 +0,0 @@ -------------------------------------------------------------------------------- --- load.ms --- Version 2.8 --- Loader script to define structures and loading and managing functions --- By: Mathias Lindner --- eMail: devsupport@crytek.com -------------------------------------------------------------------------------- - - -try -( - if cryTools.showSplash == true then - ( - if crySplash.open == false then - ( - bm = (openBitmap (crytools.BuildPathFull + "Tools\\maxscript\\icons\\splash.png")) - createDialog crysplash style:#(#style_border) modal:false bitmap:bm width:bm.width height:bm.height fgcolor:white - ) - - try crysplash.build.text = "LOADING CryANIM" catch() - ) -)catch() - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:logOutput ----------------------------------------------------------------------------------------------------------------------------------- --- creates the log and fills it with function definitions, errors ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -function logOutput outputText init:undefined = -( - logFilepath = (cryTools.cryTemp + "cryAnim_log.txt") - - if init != undefined then - try deleteFile logFilepath catch() - - try - ( - if doesfileexist logFilepath == false then - logStream = createFile logFilepath - else - logStream = openFile logFilepath mode:"a" - - if logStream != undefined then - ( - if findString "!!>" outputText != 0 and getCurrentException() != undefined then - ( - - additionString = "-----------------------------------------------------------------------------------\n" - additionString += (getCurrentException() as String) + "\n" + additionString - - if cryTools.suppresswarnings == false then - break() - else - print (outputText + "\n" + additionString) - ) - else - additionString = "" - - - - if trackTime != undefined then - ( - trackTimeDiv = timeStamp() - trackTimeStop - if additionString == "" then - outputText += " [" + (trackTimeDiv ) as String + " ms]" - - trackTimeStop = timeStamp() - ) - - format (outputText + "\n" + additionString) to:logStream - close logStream - - ) - ) - catch ( print "Error in Log-Output" ) -) -logOutput ( "CryAnim Log " + localTime + "\n===============================================\n" ) init:true - - -trackTime = timeStamp() -trackTimeStop = timeStamp() - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:Structures ----------------------------------------------------------------------------------------------------------------------------------- --- structure initialisation ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - --// cryTools.cryAnim.base structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct aToolsBaseStruct -( - setVars, - getFilePaths, - lowercase, - readTempFile, - perforce, - loadFiles, - iniFile, - getPerforcePath, - setMacros, - setCallbacks, - setMenu, - callStartUp, - reloadScript, - killCryAnim -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - --// cryTools.cryAnim._f structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct bipPartSt ( object, part, name, pivotSel ) -struct objectSt ( selected, parent, child, isPivot ) -struct pivotSelSt ( index, pivotName, position, pivPoint, pivObject ) -struct partNameSt ( name, leftRight, bodyPart ) -struct pivPointSt ( name, position ) -struct pivotDistanceStruct ( distance, name ) - -struct aToolsFunctionStruct -( - getBipNames, - getBaseBip, - getSelectedBipPart, - getPivotPointPos, - getNearestSnapshot, - moveBipPartPivPoint, - moveRotBipPartPivPoint, - moveBipPart, - moveRotBipPart, - moveToFloor, - resetRotation, - rotateAnim, - moveToBodyMass, - bipToZero2, - bipToZero3, - setTrajectories, - resetLocator, - getChildren, - getChildExtent, - createSnapshot, - lockRotation, - pasteTransform -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - --// cryTools.cryAnim.align structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct selectionSt ( pivot = #(), selection = #() ) -struct pivotLastSt ( index = 6, pivotName, position, pivObject, pivPoint = pivPointSt() ) -struct partSt ( LHand = pivotLastSt(), RHand = pivotLastSt(), LFoot = pivotLastSt(), RFoot = pivotLastSt(), tempSelection ) -struct pivotListSt ( pointList = selectionSt(), edgeList = selectionSt(), pivotLast = partSt() ) -struct pointEdgeSt ( pivot, selection ) -struct activePivotSt ( interPivot, interPos ) - -struct aToolsAlignFunctionStruct -( - createPivotEdge, - createPivotPoint, - createPointEdge, - initVars, - interactPivotPoint, - setPivotPoint, - clickAction, - deletePivotPoints, - switchViewPort, - callPivotSelect -) - -struct aToolsAlignStruct -( - pivotSelect, - _f = aToolsAlignFunctionStruct(), - _v = pivotListSt() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - - - - --// cryTools.cryAnim.UI.main.operation structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct operationFunctionStruct -( - updateDialog, - getSelectedAxis, - align, - alignLine, - applyOperation -) - -struct operationStruct -( - _f = operationFunctionStruct(), - _v = #() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - - --// cryTools.cryAnim.UI.main.pivot structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct pivotFunctionStruct -( - pivotPoint -) - -struct pivotStruct -( - _f = pivotFunctionStruct(), - _v = #() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - - --// cryTools.cryAnim.UI.main.poseManager structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct charStruct ( name, nodes = #(), collections = #() ) -struct collectionStruct ( name, poses = #() ) -struct poseStruct ( name, nodes = #() ) -struct nodeStruct ( name, transform ) - -struct poseManagerFunctionStruct -( - outputINI, - inputINI, - createPoseBitmap, - updateList, - addEntry, - createEntry, - deleteEntry, - renameEntry, - applyPose -) - -struct poseManagerVarsStruct -( - poses = #() -) - -struct poseManagerStruct -( - createDialog, - renameDialog, - _f = poseManagerFunctionStruct(), - _v = poseManagerVarsStruct() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - - - --// cryTools.cryAnim.UI.main.loadSave structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct loadSaveFunctionStruct -( - progressDialog, - checkRange, - progressDialog, - updateProgressBar, - bakeMuscleBones, - getStatusExtents, - getProgressInfo -) - -struct loadSaveVarsStruct -( - bipOpenPath = "", - bipSavePath = "", - cafSavePath = "" -) - -struct loadSaveStruct -( - testBar, - showSelectedFile, - _f = loadSaveFunctionStruct(), - _v = loadSaveVarsStruct() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - --// cryTools.cryAnim.UI.main.models structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct modelPathStruct ( name, path ) -struct itemStruct ( name, external, model, parent, reference, rotation, position ) - -struct modelsFunctionStruct -( - selectItem, - sortList, - setVisible, - getEntries, - LoadModel, - updateExtent, - updateExtentModel, - selectByNameFilterNode, - selectByNameFilterParent -) - -struct modelsVarsStruct -( - itemList = #() -) - -struct modelsStruct -( - editItemList, - entryDetails, - editModelList, - loadModelRC, - _f = modelsFunctionStruct(), - _v = modelsVarsStruct() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - --// cryTools.cryAnim.UI.main.target structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct targetFunctionStruct -( - updateDDSelection, - updateOffset, - setManualOffset -) - -struct targetStruct -( - _f = targetFunctionStruct(), - _v = #() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - -struct settingsFunctionStruct -( - callCustomizeDialog -) - -struct settingsStruct -( - customizeRollouts, - _f = settingsFunctionStruct(), - _v = #() -) - - - - - - - - - - ---################################################################ -struct mainDialogVarsStruct -( - animToolsINIPath, - tempINIPath, - bipWorkingDir = "", - cafWorkingDir = "", - dialogMaxHeight -) - -struct controlStruct ( name, rolloutName, tooltip, pos, width, height ) -struct mainDialogFunctionStruct -( - getUI, - checkExport, - updateDialog, - callDialog -) - -struct mainDialogStruct -( - dialog, - rollouts = #(), - loadSave = loadSaveStruct(), - models = modelsStruct(), - operation = operationStruct(), - pivot = pivotStruct(), - poseManager = poseManagerStruct(), - target = targetStruct(), - settings = settingsStruct(), - _f = mainDialogFunctionStruct(), - _v = mainDialogVarsStruct() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - - --// cryTools.cryAnim.UI.batchProcess structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct boneStruct ( active, name, external, bones ) -struct resultStruct ( index, name ) -struct maskStruct ( normal = #(), add = #(), remove = #(), extension = #() ) -struct subFolderStruct ( path, node ) - -struct subRangeStruct ( objects, range, export ) - -struct batchFileStruct -( - filename, - path, - details, - process, - used, - extension, - anm, - node, - subRanges = #(), - subRangePrefix = "" -) - -struct batchProcessVarsStruct -( - sourcePath = "", - exportPath = "", - customScripts = #(), - customScriptsSave = #(), - customScriptStatus = "", - customScriptSelected = 0, - flags = #{}, - subFolders = #(), - exportFiles = #(), - selectedFile, - fileQue, - exportBones, - boneList = #() -) - -struct batchProcessFunctionStruct -( - subRangeCallDialog, - subRangeUpdateList, - subRangeGetRange, - subRangeUpdateRange, - subRangeUpdateValues, - subRangeSetList, - subRangeLoadFromDummy, - subRangeUpdateDialog, - subRangeCreateUDPString, - - addNode, - callDialog, - updateSubFolderSelection, - updateSubFolders, - getCheckedNodes, - updateCounter, - getScriptList, - updateScriptLists, - createScriptDialog, - getAllFolders, - getAllFiles, - getBoneDetection, - getFilename, - getExtension, - findMaskEntry, - getFileFound, - refreshFiles, - updateDialog, - generateOutput, - executeCustomScripts, - loadBatchFile, - processFiles, - updateExtent -) - -struct batchProcessDialogStruct -( - dialog, - customizeScript, - subRangeDialog, - progressDialog, - editBoneList, - entryDetails, - _f = batchProcessFunctionStruct(), - _v = batchProcessVarsStruct() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - - - - - --// cryTools.cryAnim.UI structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct aToolsUIStruct -( - main = mainDialogStruct(), - batchProcess = batchProcessDialogStruct() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - - - --// cryTools.cryAnim._v structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct rotPosStruct ( rotation = (eulerangles 0 0 0), position = [0,0,0] ) - -struct aToolsGlobalVarsStruct -( - various = #(), - tempATPath, - perforceDir = "", - lockRotation, - transformList = #() -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - --// cryTools.cryAnim structure ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ -struct aToolsStruct -( - _v = ( aToolsGlobalVarsStruct() ), - _f = ( aToolsFunctionStruct() ), - base = ( aToolsBaseStruct() ), - align = ( aToolsAlignStruct() ), - UI = ( aToolsUIStruct() ) -) ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -logOutput "> Initialized main structures" - - - -if cryTools.cryAnim != undefined then - reloadCryAnim = true - -try cryTools.cryAnim.base.killCryAnim() catch() - - -cryTools.cryAnim = aToolsStruct() - - - -logOutput "> Created CryAnim structure interface" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.getFilePaths ----------------------------------------------------------------------------------------------------------------------------------- --- gets the paths of all used functions when loading and return the perforce path ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.getFilePaths = function getFilePaths op = -( - try - ( - struct ATFileStruct ( aToolsPaths = #(), perforcePaths = #() ) - local JPath = cryTools.BuildPathFull + "Tools\\maxscript\\cryAnim\\" - local ATFilePath = ATFileStruct() - - append ATFilePath.aToolsPaths (JPath + "load.ms") - append ATFilePath.aToolsPaths (JPath + "functions.ms") - - append ATFilePath.perforcePaths (JPath + "load.ms") - append ATFilePath.perforcePaths (JPath + "functions.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\operation.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\perforce.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\pivot.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\pose.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\save.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\target.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\tools.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\locator.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\muscle.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\models\\models8.ms") - append ATFilePath.perforcePaths (JPath + "ui\\main\\models\\models9.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\batch8.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\batch9.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\Scripts\\AutoLoc.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\Scripts\\Rotate180.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\Scripts\\ConvertTCB.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\Scripts\\bipExport.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\Scripts\\bipSave.ms") - append ATFilePath.perforcePaths (JPath + "ui\\batch\\Scripts\\bipSaveExport.ms") - - case op of - ( - #perforcePath: - ( - newString = substring JPath cryTools.buildPathFull.count JPath.count - - - local perforcePath = cryTools.cryAnim._v.perforceDir - if perforcePath != undefined then - ( - perforcePath += "/" - local tempArray = filterString newString "\\" - for i = 1 to tempArray.count do - perforcePath += tempArray[i] + (if i < tempArray.count then "/" else "") - ) - return perforcePath - ) - - #localPath: return JPath - - #aToolsPaths: return ATFilePath - ) - ) - catch ( logOutput "!!> Error in cryAnim.base.getFilePaths" ) -) -getFilePaths = undefined -logOutput "> Created cryAnim.base.getFilePath function" - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.lowercase ----------------------------------------------------------------------------------------------------------------------------------- --- converts string to lower case ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.lowercase = function lowercase input = -( - try - ( - local tempString = "" - - for i = 1 to input.count do - ( - x = input[i] - n = bit.charAsInt x - if (n > 64) and (n < 90) then - x = bit.intAsChar (n + 32) - tempString += x - ) - return tempString - ) - catch ( logOutput "!!> Error in cryAnim.base.lowercase"; return "" ) -) -lowercase = undefined -logOutput "> Created cryAnim.base.lowercase function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.readTempFile ----------------------------------------------------------------------------------------------------------------------------------- --- reads the temp file generated by perforce ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.readTempFile = function readTempFile = -( - try - ( - local tempSize = 0 - local tempString = "" - - --// if file temp file exists - if doesFileExist cryTools.cryAnim._v.tempATPath == true then - ( - - --// wait, until maxscript can access the file - while tempStream == undefined do --tempSize < 1 do - ( - escapeEnable = true - tempStream = openFile cryTools.cryAnim._v.tempATPath mode:"r" - ) - - - --// open the temp file - if getFileSize cryTools.cryAnim._v.tempATPath == 0 then - ( - print "Perforce not found..." - return undefined - ) - --// read all lines - while eof tempStream != true do - tempString += (readLine tempStream) + "\n" - - --// close the file - close tempStream - --// delete file - deleteFile cryTools.cryAnim._v.tempATPath - - --// returns the lines of the file - return tempString - ) - else - return undefined - ) - catch ( logOutput "!!> Error in cryAnim.base.readTempFile" ) -) -readTempFile = undefined -logOutput "> Created cryAnim.base.readTempFile function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.perforce ----------------------------------------------------------------------------------------------------------------------------------- --- connection between perforce and max ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.perforce = function perforce filename op = -( - try - ( - case op of - ( - #localToDepot: - ( - try - ( - buildFilter = filterString cryTools.buildPathFull "\\" - buildString = "" - for i = 1 to (buildFilter.count - 1) do - buildString += buildFilter[i] + "\\" - - perforceFilter = filterString cryTools.cryAnim._v.perforceDir "/" - perforceString = "//" - for i = 1 to (perforceFilter.count - 1) do - perforceString += perforceFilter[i] + (if i < (perforceFilter.count - 1) then "/" else "") - - pathString = substring filename buildString.count filename.count - - - tempFilter = filterString pathString "\\" - if tempFilter.count > 1 then - ( - tempString = perforceString - for i = 1 to tempFilter.count do - tempString += "/" + tempFilter[i] - - return tempString - ) - else - return false - - )catch (return undefined) - ) - #depotToLocal: - ( - try - ( - tempFilter = filterString filename "/" - if tempFilter.count > 1 then - ( - tempString = (filterString crytools.BUIldPathFull "\\")[1] - - for i = 2 to tempFilter.count do - tempString += "\\" + tempFilter[i] - - - return tempString - ) - else - return false - ) - catch(return undefined) - ) - - #getFilename: - ( - tempFilter = filterString filename "\\" - return tempFilter[tempFilter.count] - ) - - #getDirectory: - ( - tempFilter = filterString filename "\\" - tempString = "" - for i = 1 to (tempFilter.count - 1) do - tempString += tempFilter[i] + "\\" - - return tempString - ) - - #getFileStats: - ( - struct tempATFileStruct - ( - depotFile, - clientFile, - headRev, - haveRev, - otherOpen, - userOpen, - exist - ) - - tempStruct = tempATFileStruct exist:true - - tempPath = cryTools.cryAnim.base.perforce filename #localToDepot - - if (tempPath != false) and (tempPath != undefined) then - ( - cryTools.scmd ("p4 -s fstat " + tempPath + " > \"" + cryTools.cryAnim._v.tempATPath + "\"") false - - tempString = "" - while tempString == "" do - ( - escapeEnable = true - tempString = cryTools.cryAnim.base.readTempFile() - ) - if tempString != undefined then - ( - tempFilter = filterString tempString "\n" - - - - for i = 1 to tempFilter.count do - ( - tempSecFilter = filterString tempFilter[i] " " - if (findString tempFilter[i] "depotFile") != undefined then - tempStruct.depotFile = tempSecFilter[tempSecFilter.count] - if (findString tempFilter[i] "clientFile") != undefined then - tempStruct.clientFile = tempSecFilter[tempSecFilter.count] - if (findString tempFilter[i] "headRev") != undefined then - tempStruct.headRev = tempSecFilter[tempSecFilter.count] - if (findString tempFilter[i] "haveRev") != undefined then - tempStruct.haveRev = tempSecFilter[tempSecFilter.count] - if (findString tempFilter[i] "otherOpen0") != undefined then - tempStruct.otherOpen = tempSecFilter[tempSecFilter.count] - if (findString tempFilter[i] "actionOwner") != undefined then - tempStruct.userOpen = true - if (findString tempFilter[i] "no such file") != undefined then - tempStruct.exist = false - ) - - return tempStruct - ) - ) - --else - return undefined - ) - - #getLatestRev: - ( - cryTools.scmd ("p4 sync -f " + (cryTools.cryAnim.base.perforce filename #localToDepot) ) false - return true - ) - - #open: - ( - cryTools.cryAnim.base.perforce filename #getLatestRev - cryTools.scmd ("p4 edit " + (cryTools.cryAnim.base.perforce filename #localToDepot) ) false - return true - ) - #add: - ( - tempBinary == "" - fileType = cryTools.cryAnim.base.perforce filename #getFilename - tempString = cryTools.cryAnim.base.lowercase fileType - - if (findString tempString ".caf") != undefined then tempBinary = "-t binary+l " - if (findString tempString ".bip") != undefined then tempBinary = "-t binary+l " - - cryTools.scmd ("p4 add " + tempBinary + (cryTools.cryAnim.base.perforce filename #localToDepot) ) false - return true - ) - - #getPath: - ( - if cryTools.scmd != undefined then - ( - cryTools.scmd ("p4 where " + filename + " > \"" + cryTools.cryAnim._v.tempATPath + "\"") false - - tempString = "" - while tempString == "" do - ( - escapeEnable = true - tempString = cryTools.cryAnim.base.readTempFile() - ) - - try ( return (filterString tempString " ")[1] ) catch (return undefined) - ) - else - return undefined - ) - - - #checkForLoad: - ( - tempStruct = cryTools.cryAnim.base.perforce filename #getFileStats - if tempStruct != undefined then - ( - if tempStruct.exist == true then - ( - if tempStruct.otherOpen != undefined then - ( - messageBox ("The file is currently opened by:\n\n" + tempStruct.otherOpen) title:("Perforce Check: " + (cryTools.cryAnim.base.perforce filename #getFilename)) - ) - else - ( - if tempStruct.userOpen == undefined then - ( - if (queryBox "Do you want to 'Open for Edit' ?" title:("Perforce Check: " + (cryTools.cryAnim.base.perforce filename #getFilename))) == true then - ( - if tempStruct.headRev != tempStruct.haveRev then - ( - cryTools.cryAnim.base.perforce filename #getLatestRev - ) - - cryTools.cryAnim.base.perforce filename #open - ) - else - return false - ) - return true - ) - ) - return false - ) - else - return undefined - ) - - #checkForSave: - ( - tempCBAStruct = cryTools.cryAnim.base.perforce (cryTools.buildPathFull + "Game\\Animations\\Animations.cba") #getFileStats - if tempCBAStruct != undefined then - ( - if tempCBAStruct.headRev != tempCBAStruct.haveRev then - if (cryTools.cryAnim.base.perforce (cryTools.buildPathFull + "Game\\Animations\\Animations.cba") #getLatestRev) == true then - print "Synched - Animations.cba" - ) - - tempStruct = cryTools.cryAnim.base.perforce filename #getFileStats - if tempStruct != undefined then - ( - if tempStruct.exist == true then - ( - if tempStruct.headRev != tempStruct.haveRev then - ( - cryTools.cryAnim.base.perforce filename #getLatestRev - ) - - if tempStruct.userOpen == undefined then - ( - if tempStruct.otherOpen != undefined then - ( - return (queryBox ("The file is currently opened by:\n\n" + tempStruct.otherOpen + "\n\nOverwrite File?") title:("Perforce Check: " + (cryTools.cryAnim.base.perforce filename #getFilename)) beep:true) - ) - if (queryBox "Do you want to 'Open for Edit' ?" title:("Perforce Check: " + (cryTools.cryAnim.base.perforce filename #getFilename))) == true then - ( - cryTools.cryAnim.base.perforce filename #open - return true - ) - else - ( - cryTools.cryAnim.base.perforce filename #setReadMessage - return false - ) - - ) - else - return true - ) - else - ( - cryTools.cryAnim.base.perforce filename #setReadMessage - return false - ) - ) - else - return undefined - ) - - - #setRead: - ( - --// set attribute to read -- - if ((getFiles filename)[1]) != undefined then - ( - if (getFileAttribute filename #readOnly) == true then - ( - setFileAttribute filename #readOnly false - return true - ) - else - return false - ) - else - return undefined - ) - #setReadMessage: - ( - if (cryTools.cryAnim.base.perforce filename #setRead) == true then - ( - try - ( - if (cryTools.cryAnim.getUI "Perforce" "chkReadOnly").checked == true then - messageBox ("Set File Attribute to Read") title:("File Check: " + (cryTools.cryAnim.base.perforce filename #getFilename)) - )catch() - return true - ) - else - return false - ) - - #checkForAdd: - ( - tempStruct = cryTools.cryAnim.base.perforce filename #getFileStats - if tempStruct != undefined then - ( - if tempStruct.exist == false then - ( - if (queryBox "The file is not in the database.\nAdd to Source Control?" title:("Perforce Check: " + (cryTools.cryAnim.base.perforce filename #getFilename))) == true then - ( - cryTools.cryAnim.base.perforce filename #add - ) - ) - ) - ) - - #checkLoading: - ( - - local fileArray = #() - local perforcePath = cryTools.cryAnim.base.getFilePaths #perforcePath - if perforcePath != undefined then - ( - local tempFileString = "" - local tempFileList = #() - local ATFileListPath = (cryTools.cryAnim.base.getFilePaths #aToolsPaths).perforcePaths - local ATFileListHeadRev = #() - local ATFileListHaveRev = #() - local ATUpdatedFiles = #() - local tempFileString = "" - - while tempFileString == "" do - ( - escapeEnable = true - tempFileString = cryTools.cryAnim.base.readTempFile() - ) - - for i = 1 to tempFileList.count do - ( - if (findString tempFileList[i] "clientFile") != undefined then - ( - append ATFileListPath (substring tempFileList[i] 19 tempFileList[i].count) - ) - ) - - tempBool = false - - for i = 1 to ATFileListPath.count do - ( - local tempFileStat = cryTools.cryAnim.base.perforce ATFileListPath[i] #getFileStats - - if (tempFileStat.depotFile != undefined) and (tempFileStat.haveRev != undefined) then - ( - if (tempFileStat.haveRev != tempFileStat.headRev) then - ( - cryTools.cryAnim.base.perforce ATFileListPath[i] #getLatestRev - append ATUpdatedFiles (cryTools.cryAnim.base.perforce ATFileListPath[i] #getFilename) - print (" Synched - " + (cryTools.cryAnim.base.perforce ATFileListPath[i] #getFilename) ) - tempBool = true - ) - ) - ) - - - - if tempBool == false then - return false - else - ( - tempMessageFilesString = "" - local tempMessageBottomString = "" - local tempMessageString = "" - local compareFileSize = undefined - - for i = 1 to ATUpdatedFiles.count do - tempMessageFilesString += "\n" + ATUpdatedFiles[i] - - - return ATUpdatedFiles - - - ) - - return true - ) - return undefined - - ) - - #messageOnLoading: - ( - local tempMessageString = "" - local tempMessageBottomString = "" - local tempMessageFilesString = "" - - if filename.count > 1 then - tempMessageString = "These Files were Updated:\n" - else - tempMessageString = "This File was Updated:\n" - for i = 1 to filename.count do - tempMessageFilesString += "\n" + filename[i] - - if cryTools.suppressWarnings == false then - messageBox (tempMessageString + tempMessageFilesString + tempMessageBottomString) title:"CryAnim Perforce Check" - ) - - #messageOnUpdate: - ( - local tempMessageString = "" - local tempMessageBottomString = "" - local tempMessageFilesString = "" - - if filename.count > 1 then - tempMessageString = "These Files were Updated:\n" - else - tempMessageString = "This File was Updated:\n" - - for i = 1 to filename.count do - tempMessageFilesString += "\n " + filename[i] - - tempMessageFilesString += "\n\n Do you want to reload cryAnim?" - - if cryTools.suppressWarnings == false then - if (queryBox (tempMessageString + tempMessageFilesString + tempMessageBottomString) title:"CryAnim Perforce Check") == true then - cryTools.cryAnim.base.reloadScript() - ) - - - #autoUpdate: - ( - local tempVar = cryTools.cryAnim.base.perforce "" #checkLoading - if tempVar != false then - cryTools.cryAnim.base.perforce tempVar #messageOnUpdate - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim.base.perforce" ) -) -perforce = undefined -logOutput "> Created cryAnim.base.perforce function" - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.loadFiles ----------------------------------------------------------------------------------------------------------------------------------- --- loads used files ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.loadFiles = function loadFiles op = -( - try - ( - local ATFilePath = cryTools.cryAnim.base.getFilePaths #aToolsPaths - - case op of - ( - #load:( fileIn ATFilePath.aToolsPaths[1] ; return true ) - #all: - ( - for i = 2 to ATFilePath.aToolsPaths.count do - ( - try ( fileIn ATFilePath.aToolsPaths[i] ) - catch ( print ("Can't load: " + ATFilePath.aToolsPaths[i] ) ) - ) - return true - ) - #functions:( fileIn ATFilePath.aToolsPaths[2] ; return true ) - #pivot:( fileIn ATFilePath.aToolsPath[3] ; return true ) - #dialog:( fileIn ATFilePath.aToolsPath[4] ; return true ) - ) - ) - catch ( logOutput "!!> Error in cryAnim.base.loadFiles" ) -) -loadFiles = undefined -logOutput "> Created cryAnim.base.loadFiles function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.iniFile ----------------------------------------------------------------------------------------------------------------------------------- --- input and output of the cryAnim ini file ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.iniFile = function iniFile op item value:undefined = -( - try - ( - try - ( - csexport.set_value - - case op of - ( - #set: - ( - case item of - ( - -- Default Settings -- - #dialogPos: ( try ( csexport.set_value "cryAnimDlgPos" ( if value == undefined then ( (getDialogPos cryTools.cryAnim.UI.main.dialog) as String) else value) ) catch() ) - #visible: ( try (csexport.set_value "cryAnimDlgVisible" value ) catch() ) - #autoUpdate: ( try ( csexport.set_value "cryAnimDlgAutoUpdate" (if value == undefined then (if (cryTools.cryAnim.UI.main._f.getUI "Perforce" "chkAutoUpdate").checked == true then "1" else "0") else value ) ) catch() ) - #autoUpdateTime: ( try ( csexport.set_value "cryAnimDlgAutoUpdateTime" (if value == undefined then ( (cryTools.cryAnim.UI.main._f.getUI "Perforce" "spnAutoUpdateTime").value as String ) else value ) ) catch() ) - #multiRow: ( try ( csexport.set_value "cryAnimDlgMultiRow" (if value == undefined then (if (cryTools.cryAnim.UI.main._f.getUI "Settings" "chkMultiRow").checked == true then "1" else "0") else value ) ) catch() ) - #rolloutStates: ( try ( csexport.set_value "cryAnimDlgRolloutStates" (if value == undefined then (if (cryTools.cryAnim.UI.main._f.getUI "Settings" "chkRolloutStates").checked == true then "1" else "0") else value ) ) catch() ) - #readOnly: ( try ( csexport.set_value "cryAnimDlgReadOnly" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Settings" "chkReadOnly").checked == true then "1" else "0" ) else value ) ) catch () ) - #workingDir: ( try ( csexport.set_value "cryAnimDlgWorkingDir" (if value == undefined then ( (cryTools.cryAnim.UI.main._f.getUI "Settings" "edWorkingDir").text ) else value ) ) catch () ) - #loadBiped: ( try ( csexport.set_value "cryAnimDlgLoadBiped" (if value == undefined then cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath else value ) ) catch () ) - - - - -- Open For Edit -- - #loadOpen: ( try ( csexport.set_value "cryAnimDlgOFELoad" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radLoadOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #saveOpen: ( try ( csexport.set_value "cryAnimDlgOFESave" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #exportOpen: ( try ( csexport.set_value "cryAnimDlgOFEExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radExportOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #saveExportOpen: ( try ( csexport.set_value "cryAnimDlgOFESaveExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - - -- Add To Source Control -- - #saveAdd: ( try ( csexport.set_value "cryAnimDlgASCSave" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveAdd").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #exportAdd: ( try ( csexport.set_value "cryAnimDlgASCExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radExportAdd").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #saveExportAdd: ( try ( csexport.set_value "cryAnimDlgASCSaveExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportAdd").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - - -- Prompt for File -- - #savePrompt: ( try ( csexport.set_value "cryAnimDlgPFFSave" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSavePrompt").state of ( 1: "1"; 2: "2" ); ) else value ) ) catch() ) - #exportPrompt: ( try ( csexport.set_value "cryAnimDlgPFFExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Settings" "radExportPrompt").state of ( 1: "1"; 2: "2" ); ) else value ) ) catch() ) - #saveExportPrompt: ( try ( csexport.set_value "cryAnimDlgPFFSaveExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state of ( 1: "1"; 2: "2" ); ) else value ) ) catch() ) - - - - -- Rollout Settings -- - #targetRO: ( try ( csexport.set_value "cryAnimDlgRolloutTarget" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Target" "").open == true then "1" else "0" ) else value ) ) catch () ) - #operationRO: ( try ( csexport.set_value "cryAnimDlgRolloutOperation" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Operation" "").open == true then "1" else "0" ) else value ) ) catch () ) - #pivotRO: ( try ( csexport.set_value "cryAnimDlgRolloutPivot" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Pivot" "").open == true then "1" else "0" ) else value ) ) catch () ) - #modelsRO: ( try ( csexport.set_value "cryAnimDlgRolloutModels" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Models" "").open == true then "1" else "0" ) else value ) ) catch () ) - #locatorRO: ( try ( csexport.set_value "cryAnimDlgRolloutLocator" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Locator" "").open == true then "1" else "0" ) else value ) ) catch () ) - #poseRO: ( try ( csexport.set_value "cryAnimDlgRolloutPose" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "").open == true then "1" else "0" ) else value ) ) catch () ) - #musclesRO: ( try ( csexport.set_value "cryAnimDlgRolloutMuscles" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Muscles" "").open == true then "1" else "0" ) else value ) ) catch () ) - #loadSaveRO: ( try ( csexport.set_value "cryAnimDlgRolloutLoadSave" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "").open == true then "1" else "0" ) else value ) ) catch () ) - #perforceRO: ( try ( csexport.set_value "cryAnimDlgRolloutPerforce" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Perforce" "").open == true then "1" else "0" ) else value ) ) catch () ) - #toolsRO: ( try ( csexport.set_value "cryAnimDlgRolloutTools" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Settings" "").open == true then "1" else "0" ) else value ) ) catch () ) - - #batchProcessExt: ( try ( csexport.set_value "cryAnimDlgBatchExtension" value ) catch() ) - #batchProcessSourcePath: ( try ( csexport.set_value "cryAnimDlgBatchOpenPath" value ) catch() ) - #batchProcessExportPath: ( try ( csexport.set_value "cryAnimDlgbatchProcessPath" value ) catch() ) - #batchProcessSubFolderSelection: ( try ( csexport.set_value "cryAnimDlgBatchSubFolderSelection" value ) catch() ) - #batchProcessSubFolders: ( try ( csexport.set_value "cryAnimDlgBatchSubFolders" (if value != undefined then (if value == true then "1" else "0") ) ) catch() ) - - - #models: - ( - if value != undefined then - ( - for i = 1 to 20 do - ( - if value[i] != undefined then - ( - tempString = value[i].name + "#" + value[i].path - try ( csexport.set_value ("cryAnimDlgModel" + i as String) tempString ) catch() - ) - - else - try ( csexport.set_value ("cryAnimDlgModel" + i as String) "" ) catch() - - ) - ) - else - print "No value defined." - ) - - - #items: - ( - if value != undefined then - ( - for i = 1 to 20 do - ( - if value[i] != undefined then - ( - local tempStringArray = (itemStruct name:"" external:"" model:"" reference:"" parent:"" rotation:"" position:"") - local maxCount = value[i].model.count - - for d = 1 to maxCount do - ( - tempStringArray.model += value[i].model[d] + (if i != maxCount then ";" else "") - tempStringArray.reference += value[i].reference[d] as String + (if i != maxCount then ";" else "") - tempStringArray.parent += value[i].parent[d] as String + (if i != maxCount then ";" else "") - tempStringArray.rotation += value[i].rotation[d] as String + (if i != maxCount then ";" else "") - tempStringArray.position += value[i].position[d] as String + (if i != maxCount then ";" else "") - ) - - tempString = value[i].name + "#" + value[i].external + "#" + tempStringArray.model + "#" + tempStringArray.reference + "#" + tempStringArray.parent + "#" + tempStringArray.rotation + "#" + tempStringArray.position - try ( csexport.set_value ("cryAnimDlgWeapon" + i as String) tempString ) catch() - ) - else - try ( csexport.set_value ("cryAnimDlgWeapon" + i as String) "" ) catch() - ) - ) - else - print "No value defined." - ) - - - #bones: - ( - if value != undefined then - ( - for i = 1 to 20 do - ( - if value[i] != undefined then - ( - tempString = value[i].active + "#" + value[i].name + "#" + value[i].external + "#" + value[i].bones - try ( csexport.set_value ("cryAnimDlgBone" + i as String) tempString ) catch() - ) - else - try ( csexport.set_value ("cryAnimDlgBone" + i as String) "" ) catch() - ) - ) - else - print "No value defined." - ) - ) - ) - #get: - ( - case item of - ( - --// Default Settings -- - #dialogPos: ( try ( execute ("return " + (csexport.get_value "cryAnimDlgPos" ) ) ) catch(return undefined) ) - #visible: ( try ( return (if (csexport.get_value "cryAnimDlgVisible") == "1" then true else false) ) catch() ) - #autoUpdate: ( try ( return (if (csexport.get_value "cryAnimDlgAutoUpdate") == "1" then true else false) ) catch() ) - #autoUpdateTime: ( try ( return ( (csexport.get_value "cryAnimDlgAutoUpdateTime") as Integer) ) catch() ) - #multiRow: ( try ( return (if (csexport.get_value "cryAnimDlgMultiRow") == "1" then true else false) ) catch() ) - #rolloutStates: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutStates") == "1" then true else false) ) catch() ) - #readOnly: ( try ( return (if (csexport.get_value "cryAnimDlgReadOnly") == "1" then true else false) ) catch() ) - #workingDir: ( try ( return (csexport.get_value "cryAnimDlgWorkingDir") ) catch() ) - #loadBiped: ( try ( return (csexport.get_value "cryAnimDlgLoadBiped") ) catch() ) - - - - --// Open For Edit -- - #loadOpen: ( try ( return (case (csexport.get_value "cryAnimDlgOFELoad") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveOpen: ( try ( return (case (csexport.get_value "cryAnimDlgOFESave") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #exportOpen: ( try ( return (case (csexport.get_value "cryAnimDlgOFEExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveExportOpen: ( try ( return (case (csexport.get_value "cryAnimDlgOFESaveExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - - --// Add To Source Control -- - #saveAdd: ( try ( return (case (csexport.get_value "cryAnimDlgASCSave") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #exportAdd: ( try ( return (case (csexport.get_value "cryAnimDlgASCExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveExportAdd: ( try ( return (case (csexport.get_value "cryAnimDlgASCSaveExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - - --// Prompt for File -- - #savePrompt: ( try ( return (case (csexport.get_value "cryAnimDlgPFFSave") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #exportPrompt: ( try ( return (case (csexport.get_value "cryAnimDlgPFFExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveExportPrompt: ( try ( return (case (csexport.get_value "cryAnimDlgPFFSaveExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - - - --// Rollout Settings -- - #targetRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutTarget") == "1" then true else false) ) catch() ) - #operationRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutOperation") == "1" then true else false) ) catch() ) - #pivotRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutPivot") == "1" then true else false) ) catch() ) - #modelsRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutModels") == "1" then true else false) ) catch() ) - #locatorRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutLocator") == "1" then true else false) ) catch() ) - #poseRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutPose") == "1" then true else false) ) catch() ) - #musclesRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutMuscles") == "1" then true else false) ) catch() ) - #loadSaveRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutLoadSave") == "1" then true else false) ) catch() ) - #perforceRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutPerforce") == "1" then true else false) ) catch() ) - #toolsRO: ( try ( return (if (csexport.get_value "cryAnimDlgRolloutTools") == "1" then true else false) ) catch() ) - - --// Batch Process Settings -- - #batchProcessExt: ( try ( return (csexport.get_value "cryAnimDlgBatchExtension") ) catch() ) - #batchProcessSourcePath: ( try ( return (csexport.get_value "cryAnimDlgBatchOpenPath") ) catch() ) - #batchProcessExportPath: ( try ( return (csexport.get_value "cryAnimDlgbatchProcessPath") ) catch() ) - #batchProcessSubFolderSelection: ( try ( return (csexport.get_value "cryAnimDlgBatchSubFolderSelection") ) catch() ) - #batchProcessSubFolders: ( try ( return (if (csexport.get_value "cryAnimDlgBatchSubFolders") == "1" then true else false) ) catch() ) - - #models: - ( - tempArray = #() - - for i = 1 to 20 do - ( - tempString = csexport.get_value ("cryAnimDlgModel" + i as String) - if tempString != "" then - ( - tempInt = findString tempString "#" - tempFilter = filterString tempString "#" - if tempInt == 1 then - ( - tempFilter[2] = tempFilter[1] - tempFilter[1] = "" - ) - - if tempIn == tempString.count then - ( - tempFilter[2] = "" - ) - - append tempArray (modelPathStruct name:tempFilter[1] path:tempFilter[2]) - ) - ) - return tempArray - ) - - - #items: - ( - tempArray = #() - - for i = 1 to 20 do - ( - tempString = csexport.get_value ("cryAnimDlgWeapon" + i as String) - if tempString != "" then - ( - tempFilter = filterString tempString "#" - - append tempArray (itemStruct name:(tempFilter[1] as String) external:(tempFilter[2] as String) model:(tempFilter[3] as String) reference:(tempFilter[4] as String) parent:(tempFilter[5] as String) rotation:(tempFilter[6] as String) position:(tempFilter[7] as String)) - ) - ) - return tempArray - ) - - - #bones: - ( - local tempArray = #() - - for i = 1 to 20 do - ( - local tempString = csexport.get_value ("cryAnimDlgBone" + i as String) - if tempString != "" then - ( - local tempFilter = filterString tempString "#" - - append tempArray (boneStruct active:(tempFilter[1] as String) name:(tempFilter[2] as String) external:(tempFilter[3] as String) bones:(tempFilter[4] as String) ) - ) - ) - return tempArray - ) - ) - ) - ) - ) - - catch - ( - case op of - ( - #set: - ( - case item of - ( - -- Default Settings -- - #dialogPos: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "pos" ( if value == undefined then (cryTools.cryAnim.UI.dialog.pos as String) else value) ) catch() ) - #visible: (try (setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "visible" value ) catch() ) - #autoUpdate: ( try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "autoUpdate" (if value == undefined then (if (cryTools.cryAnim.UI.main._f.getUI "Perforce" "chkAutoUpdate").checked == true then "1" else "0") else value ) ) catch() ) - #autoUpdateTime: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "autoUpdateTime" (if value == undefined then (if (cryTools.cryAnim.UI.main._f.getUI "Perforce" "spnAutoUpdateTime").value == true then "1" else "0") else value ) ) catch() ) - #rolloutStates: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "rolloutStates" (if value == undefined then (if (cryTools.cryAnim.UI.main._f.getUI "Settings" "chkRolloutStates").checked == true then "1" else "0") else value ) ) catch() ) - #readOnly: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "readOnly" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Settings" "chkReadOnly").checked == true then "1" else "0" ) else value ) ) catch () ) - #workingDir: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "workingDir" (if value == undefined then ( (cryTools.cryAnim.UI.main._f.getUI "Settings" "edWorkingDir").text ) else value ) ) catch () ) - #loadBiped: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "loadBiped" (if value == undefined then cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath else value ) ) catch () ) - - - - -- Open For Edit -- - #loadOpen: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "Load" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radLoadOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #saveOpen: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "Save" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #exportOpen: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "Export" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radExportOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #saveExportOpen: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "SaveExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportOpen").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - - -- Add To Source Control -- - #saveAdd: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "AddToSourceControl" "Save" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveAdd").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #exportAdd: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "AddToSourceControl" "Export" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radExportAdd").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - #saveExportAdd: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "AddToSourceControl" "SaveExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportAdd").state of ( 1: "1"; 2: "2"; 3: "3" ); ) else value ) ) catch() ) - - -- Prompt for File -- - #savePrompt: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "PromptForFile" "Save" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSavePrompt").state of ( 1: "1"; 2: "2" ); ) else value ) ) catch() ) - #exportPrompt: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "PromptForFile" "Export" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Settings" "radExportPrompt").state of ( 1: "1"; 2: "2" ); ) else value ) ) catch() ) - #saveExportPrompt: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "PromptForFile" "SaveExport" (if value == undefined then (case (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state of ( 1: "1"; 2: "2" ); ) else value ) ) catch() ) - - - - -- Rollout Settings -- - #target: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Target" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Target" "").open == true then "1" else "0" ) else value ) ) catch () ) - #operation: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Operation" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Operation" "").open == true then "1" else "0" ) else value ) ) catch () ) - #pivot: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Pivot" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Pivot" "").open == true then "1" else "0" ) else value ) ) catch () ) - #base: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Misc" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Misc" "").open == true then "1" else "0" ) else value ) ) catch () ) - #muscles: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Muscles" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Muscles" "").open == true then "1" else "0" ) else value ) ) catch () ) - #loadSave: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "LoadSave" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "").open == true then "1" else "0" ) else value ) ) catch () ) - #perforce: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Perforce" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Perforce" "").open == true then "1" else "0" ) else value ) ) catch () ) - #tools: (try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Settings" (if value == undefined then ( if (cryTools.cryAnim.UI.main._f.getUI "Settings" "").open == true then "1" else "0" ) else value ) ) catch () ) - - #batchProcessExt: ( try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "Extension" value ) catch() ) - #batchProcessSourcePath: ( try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "OpenPath" value ) catch() ) - #batchProcessExportPath: ( try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "ExportPath" value ) catch() ) - #batchProcessSubFolderSelection: ( try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "SubFolderSelection" value ) catch() ) - #batchProcessSubFolders: ( try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "SubFolders" (if value != undefined then (if value == true then "1" else "0") ) ) catch() ) - - - #models: - ( - if value != undefined then - ( - for i = 1 to 20 do - ( - if value[i] != undefined then - ( - tempString = value[i].name + "#" + value[i].path - try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Models" ("path" + i as String) tempString ) catch() - ) - - else - try ( delINISetting cryTools.cryAnim._v.animToolsINIPath "Models" ("path" + i as String) ) catch() - - ) - ) - else - print "No value defined." - ) - - - #items: - ( - if value != undefined then - ( - for i = 1 to 20 do - ( - if value[i] != undefined then - ( - local tempStringArray = (itemStruct name:"" external:"" model:"" reference:"" parent:"" rotation:"" position:"") - local maxCount = value[i].model.count - - for d = 1 to maxCount do - ( - tempStringArray.model += value[i].model[d] + (if i != maxCount then ";" else "") - tempStringArray.reference += value[i].reference[d] as String + (if i != maxCount then ";" else "") - tempStringArray.parent += value[i].parent[d] as String + (if i != maxCount then ";" else "") - tempStringArray.rotation += value[i].rotation[d] as String + (if i != maxCount then ";" else "") - tempStringArray.position += value[i].position[d] as String + (if i != maxCount then ";" else "") - ) - - tempString = value[i].name + "#" + value[i].external + "#" + tempStringArray.model + "#" + tempStringArray.reference + "#" + tempStringArray.parent + "#" + tempStringArray.rotation + "#" + tempStringArray.position - try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Weapons" ("wp" + i as String) tempString ) catch() - ) - else - try ( delINISetting cryTools.cryAnim._v.animToolsINIPath "Weapons" ("wp" + i as String) ) catch() - ) - ) - else - print "No value defined." - ) - - - #bones: - ( - if value != undefined then - ( - for i = 1 to 20 do - ( - if value[i] != undefined then - ( - tempString = value[i].active + "#" + value[i].name + "#" + value[i].external + "#" + value[i].bones - try ( setINISetting cryTools.cryAnim._v.animToolsINIPath "Bones" ("bone" + i as String) tempString ) catch() - ) - else - try ( delINISetting cryTools.cryAnim._v.animToolsINIPath "Bones" ("bone" + i as String) ) catch() - ) - ) - else - print "No value defined." - ) - - ) - ) - #get: - ( - case item of - ( - -- Default Settings -- - #dialogPos: ( try ( execute ("return " + (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "pos" ) ) ) catch(return undefined) ) - #visible: (try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "visible") == "1" then true else false) ) catch() ) - #autoUpdate: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "autoUpdate") == "1" then true else false) ) catch() ) - #autoUpdateTime: ( try ( return (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "spnAutoUpdateTime") ) catch() ) - #rolloutStates: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "rolloutStates") == "1" then true else false) ) catch() ) - #readOnly: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "readOnly") == "1" then true else false) ) catch() ) - #workingDir: ( try ( return (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "workingDir") ) catch() ) - #loadBiped: ( try ( return (getINISetting cryTools.cryAnim._v.animToolsINIPath "cryAnimDlg" "loadBiped") ) catch() ) - - - - -- Open For Edit -- - #loadOpen: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "Load") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveOpen: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "Save") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #exportOpen: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "Export") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveExportOpen: ( try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "OpenForEdit" "SaveExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - - -- Add To Source Control -- - #saveAdd: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "AddToSourceControl" "Save") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #exportAdd: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "AddToSourceControl" "Export") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveExportAdd: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "AddToSourceControl" "SaveExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - - -- Prompt for File -- - #savePrompt: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "PromptForFile" "Save") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #exportPrompt: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "PromptForFile" "Export") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - #saveExportPrompt: (try ( return (case (getINISetting cryTools.cryAnim._v.animToolsINIPath "PromptForFile" "SaveExport") of ("1": 1; "2": 2; "3": 3);) ) catch() ) - - - -- Rollout Settings -- - #target: (try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Target") == "1" then true else false) ) catch() ) - #operation: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Operation") == "1" then true else false) ) catch() ) - #pivot: (try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Pivot") == "1" then true else false) ) catch() ) - #base: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Misc") == "1" then true else false) ) catch() ) - #muscles: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Muscles") == "1" then true else false) ) catch() ) - #loadSave: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "LoadSave") == "1" then true else false) ) catch() ) - #perforce: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Perforce") == "1" then true else false) ) catch() ) - #tools: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "Rollouts" "Settings") == "1" then true else false) ) catch() ) - - #batchProcessExt: ( try ( return (getINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "Extension") ) catch() ) - #batchProcessSourcePath: ( try ( return (getINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "OpenPath") ) catch() ) - #batchProcessExportPath: ( try ( return (getINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "ExportPath") ) catch() ) - #batchProcessSubFolderSelection: ( try ( return (getINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "SubFolderSelection") ) catch() ) - #batchProcessSubFolders: ( try ( return (if (getINISetting cryTools.cryAnim._v.animToolsINIPath "batchProcess" "SubFolders") == "1" then true else false) ) catch() ) - - #models: - ( - tempArray = #() - - for i = 1 to 20 do - ( - tempString = getINISetting cryTools.cryAnim._v.animToolsINIPath "Models" ("path" + i as String) - if tempString != "" then - ( - tempInt = findString tempString "#" - tempFilter = filterString tempString "#" - if tempInt == 1 then - ( - tempFilter[2] = tempFilter[1] - tempFilter[1] = "" - ) - - if tempIn == tempString.count then - ( - tempFilter[2] = "" - ) - - append tempArray (modelPathStruct name:tempFilter[1] path:tempFilter[2]) - ) - ) - return tempArray - ) - - - #items: - ( - tempArray = #() - - for i = 1 to 20 do - ( - tempString = getINISetting cryTools.cryAnim._v.animToolsINIPath "Weapons" ("wp" + i as String) - if tempString != "" then - ( - tempFilter = filterString tempString "#" - - append tempArray (itemStruct name:(tempFilter[1] as String) external:(tempFilter[2] as String) model:(tempFilter[3] as String) reference:(tempFilter[4] as String) parent:(tempFilter[5] as String) rotation:(tempFilter[6] as String) position:(tempFilter[7] as String)) - ) - ) - return tempArray - ) - - - #bones: - ( - tempArray = #() - - for i = 1 to 20 do - ( - tempString = getINISetting cryTools.cryAnim._v.animToolsINIPath "Bones" ("bone" + i as String) - if tempString != "" then - ( - tempFilter = filterString tempString "#" - - append tempArray (boneStruct active:(tempFilter[1] as String) name:(tempFilter[2] as String) external:(tempFilter[3] as String) bones:(tempFilter[4] as String) ) - ) - ) - return tempArray - ) - ) - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim.base.iniFile" ) -) -iniFile = undefined -logOutput "> Created cryAnim.base.iniFile function" - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.getPerforcePath ----------------------------------------------------------------------------------------------------------------------------------- --- checks, if the dialog is visible or not ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.getPerforcePath = function getPerforcePath = -( - try - ( - local perforceString = "" - local buildFilter = filterString cryTools.buildPathFull "\\" - for i = 1 to buildFilter.count do - perforceString += buildFilter[i] + (if i < buildFilter.count then "\\" else "") - - local perforceString = cryTools.cryAnim.base.perforce perforceString #getPath - - return perforceString - ) - catch ( logOutput "!!> Error in cryAnim.base.getPerforcePath" ) -) -getPerforcePath = undefined -logOutput "> Created cryAnim.base.getPerforcePath function" - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.setMacros ----------------------------------------------------------------------------------------------------------------------------------- --- creates macros and menu/quad menu entries ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.setMacros = function setMacros op = -( - try - ( - case op of - ( - #delete: - ( - local animToolsMacros = getFiles (getDir #UI + "MacroScripts\\CryAnim*.mcr") - - for i = 1 to animToolsMacros.count do - deleteFile animToolsMacros[i] - - menuMan.updateMenubar() - ) - - #update: - ( - ATFilesArray = # \ - ( \ - "ATAnimToolsDlg", \ - "ATBipToZero2", \ - "ATBipToZero3", \ - "ATCreateSingleSnapshot", \ - "ATCreateChildrenSnapshot", \ - "ATHideAllTrajectories", \ - "ATMoveRot", \ - "ATMoveToFloor", \ - "ATMoveToPivPoint", \ - "ATMoveRotToPivPoint", \ - "ATMoveToSnapshot", \ - "ATPivotSelect", \ - "ATResetRotation", \ - "ATShowTrajectory", \ - "ATLockRotation", \ - "ATUnlockRotation", \ - "ATCopyTransform", \ - "ATPasteTransform", \ - "ATPastePosition", \ - "ATPasteRotation" \ - ) - - localMacros = getFiles ((getDir #UI) + "\\MacroScripts\\CryAnim*") - for i = 1 to ATFilesArray.count do - ( - for f = 1 to 40 do - ( - if localMacros.count == 0 then - exit - else - ( - try - ( - if (findString localMacros[f] ATFilesArray[i]) != undefined then - deleteItem localMacros f - ) - catch() - ) - ) - ) - - if localMacros.count != 0 then - ( - for i = 1 to localMacros.count do - ( - deleteFile localMacros[i] - print ("Deleted unused MacroScript: " + localMacros[i]) - ) - ) - ) - ) - - - - - macroScript ATCreateSingleSnapshot category:"CryAnim" toolTip:"create single snapshot" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if selection.count > 0 then - return true - else - return false - ) - )catch( return false ) - ) - - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - with animate off - cryTools.cryAnim._f.createSnapshot() - ) - )catch() - ) - ) - - - - - macroScript ATCreateChildrenSnapshot category:"CryAnim" toolTip:"create children snapshot" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if selection.count > 0 then - return true - else - return false - ) - )catch( return false ) - ) - - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - with animate off - ( - if $selection.count > 0 then - ( - local baseArray = cryTools.cryAnim._f.createSnapshot children:true - if baseArray != undefined then - group baseArray prefix:"Snapshot_" - ) - else - print "Nothing selected" - ) - ) - )catch() - ) - ) - - - macroScript ATPivotSelect category:"CryAnim" toolTip:"select pivot" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on isEnabled do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - if selectedBipPart.object.isPivot == true then - return true - else - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo off - cryTools.cryAnim.align._f.callPivotSelect() - ) - )catch() - ) - ) - - - macroScript ATMoveToSnapshot category:"CryAnim" toolTip:"move to snapshot" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - return true - ) - return false - )catch( return false ) - ) - on isEnabled do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - nearestSnap = cryTools.cryAnim._f.getNearestSnapshot() - if nearestSnap != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo "move to snap" on - cryTools.cryAnim._f.moveBipPart() - ) - )catch() - ) - ) - - - - macroScript ATMoveToPivPoint category:"CryAnim" toolTip:"move to pivot point" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - if selectedBipPart.pivotSel.pivPoint.name != undefined then - return true - else - return false - ) - ) - return false - )catch( return false ) - ) - - on isEnabled do - ( - try - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - if selectedBipPart.object.isPivot == true then - return true - - return false - )catch( return false ) - ) - - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo "move to pivot point" on - cryTools.cryAnim._f.moveBipPartPivPoint() - ) - )catch() - ) - ) - - - - - macroScript ATMoveRotToPivPoint category:"CryAnim" toolTip:"move/rotate to pivot point" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - if selectedBipPart.pivotSel.pivPoint.name != undefined then - return true - else - return false - ) - ) - return false - )catch( return false ) - ) - on isEnabled do - ( - try - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - if selectedBipPart.object.isPivot == true then - return true - - return false - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo "move/rot to pivot point" on - cryTools.cryAnim._f.moveRotBipPartPivPoint() - ) - )catch() - ) - ) - - - - - macroScript ATMoveRot category:"CryAnim" toolTip:"move/rotate to snapshot" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on isEnabled do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - nearestSnap = cryTools.cryAnim._f.getNearestSnapshot() - if nearestSnap != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo "move/rot to snap" on - cryTools.cryAnim._f.moveRotBipPart() - ) - )catch() - ) - ) - - - macroScript ATMoveToFloor category:"CryAnim" toolTip:"move to floor" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on isEnabled do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - if (selectedBipPart.part.bodyPart == "Foot") and (selectedBipPart.object.child == undefined)then - return true - else - return false - ) - else - print ("No aTools Structure loaded...") - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo "move to floor" on - cryTools.cryAnim._f.moveToFloor() - ) - )catch() - ) - ) - - - macroScript ATResetRotation category:"CryAnim" toolTip:"reset rotation" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo "reset rotation" on - cryTools.cryAnim._f.resetRotation() - ) - )catch() - ) - ) - - - macroScript ATCryAnimDlg category:"CryAnim" toolTip:"cryAnim dialog" icon:#("Reactor",5) - ( - try - ( - if cryTools.cryAnim != undefined then - ( - undo off - cryTools.cryAnim.UI.main._f.callDialog() - ) - )catch() - ) - - - macroScript ATBipToZero2 category:"CryAnim" toolTip:"bip to [0,0]" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if $Bip01 != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - cryTools.cryAnim._f.bipToZero2() - ) - )catch() - ) - ) - - - macroScript ATBipToZero3 category:"CryAnim" toolTip:"bip to [0,0,0]" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if $Bip01 != undefined then - return true - else - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - cryTools.cryAnim._f.bipToZero3() - ) - )catch() - ) - ) - - - macroScript ATShowTrajectory category:"CryAnim" toolTip:"show trajectory" - ( - on isVisible do - ( - try - ( - if (cryTools.cryAnim != undefined) and ((maxVersion())[1] < 9000) then - ( - for obj in $selection do - if getTrajectoryOn obj == false then - return true - - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - cryTools.cryAnim._f.setTrajectories #show - ) - )catch() - ) - ) - - - macroScript ATHideAllTrajectories category:"CryAnim" toolTip:"hide all trajectories" - ( - on isVisible do - ( - try - ( - if (cryTools.cryAnim != undefined) and ((maxVersion())[1] < 9000) then - ( - return cryTools.cryAnim._f.setTrajectories #checkHide - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - cryTools.cryAnim._f.setTrajectories #hide - ) - )catch() - ) - ) - - - macroScript ATLockRotation category:"CryAnim" toolTip:"lock rotation" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - if cryTools.cryAnim._v.lockRotation == undefined then - ( - /* - - */ - - return true - ) - ) - - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - cryTools.cryAnim._f.lockRotation() - - /* - when transform $selection[1] change id:#lockRotation do - ( - if cryTools != undefined then - ( - if cryTools.cryAnim._v.lockRotation != undefined then - ( - local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - if selectedBipPart.part.bodyPart == "Hand" then - biped.setTransform $selection[1] #rotation cryTools.cryAnim._v.lockRotation true - ) - ) - ) - */ - ) - ) - )catch() - ) - ) - - - macroScript ATUnlockRotation category:"CryAnim" toolTip:"unlock rotation" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - if cryTools.cryAnim._v.lockRotation != undefined then - return true - ) - - return false - ) - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() - if selectedBipPart != undefined then - ( - cryTools.cryAnim._v.lockRotation = undefined - ) - ) - )catch() - ) - ) - - - macroScript ATCopyTransform category:"CryAnim" toolTip:"copy transform" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if $selection.count > 0 then - return true - ) - return false - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - try deleteFile cryTools.cryAnim.UI.main._v.tempINIPath catch() - for d = 1 to $selection.count do - ( - setINISetting cryTools.cryAnim.UI.main._v.tempINIPath ("Object" + d as String) "1" ($selection[d].transform as String) - ) - ) - )catch() - ) - ) - - - macroScript ATPasteTransform category:"CryAnim" toolTip:"paste transform" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if $selection.count > 0 then - return true - ) - return false - )catch( return false ) - ) - on isEnabled do - ( - try - ( - if (getFiles cryTools.cryAnim.UI.main._v.tempINIPath).count > 0 then - return true - else - return false - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if (getFiles cryTools.cryAnim.UI.main._v.tempINIPath).count > 0 then - ( - if $selection.count > 0 then - ( - for d = 1 to $selection.count do - ( - local newTran = getINISetting cryTools.cryAnim.UI.main._v.tempINIPath ("Object" + d as String) "1" - if newTran != "" then - ( - newTran = execute ( newTran ) - cryTools.cryAnim._f.pasteTransform $selection[d] newTran #transform - ) - ) - ) - ) - ) - )catch() - ) - ) - - - macroScript ATPastePosition category:"CryAnim" toolTip:"paste position" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if $selection.count > 0 then - return true - ) - return false - )catch( return false ) - ) - on isEnabled do - ( - try - ( - if (getFiles cryTools.cryAnim.UI.main._v.tempINIPath).count > 0 then - return true - else - return false - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if (getFiles cryTools.cryAnim.UI.main._v.tempINIPath).count > 0 then - ( - if $selection.count > 0 then - ( - for d = 1 to $selection.count do - ( - local newTran = getINISetting cryTools.cryAnim.UI.main._v.tempINIPath ("Object" + d as String) "1" - if newTran != "" then - ( - newTran = execute ( newTran ) - cryTools.cryAnim._f.pasteTransform $selection[d] newTran #pos - ) - ) - ) - ) - ) - )catch() - ) - ) - - - macroScript ATPasteRotation category:"CryAnim" toolTip:"paste rotation" - ( - on isVisible do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if $selection.count > 0 then - return true - ) - return false - )catch( return false ) - ) - on isEnabled do - ( - try - ( - if (getFiles cryTools.cryAnim.UI.main._v.tempINIPath).count > 0 then - return true - else - return false - )catch( return false ) - ) - on execute do - ( - try - ( - if cryTools.cryAnim != undefined then - ( - if (getFiles cryTools.cryAnim.UI.main._v.tempINIPath).count > 0 then - ( - if $selection.count > 0 then - ( - for d = 1 to $selection.count do - ( - local newTran = getINISetting cryTools.cryAnim.UI.main._v.tempINIPath ("Object" + d as String) "1" - if newTran != "" then - ( - newTran = execute ( newTran ) - cryTools.cryAnim._f.pasteTransform $selection[d] newTran #rotation - ) - ) - ) - ) - ) - )catch(print "FUCK!!") - ) - ) - ) - catch ( logOutput "!!> Error in cryAnim.base.setMacros" ) -) -setMacros = undefined -logOutput "> Created cryAnim.base.setMacros function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.setMenu ----------------------------------------------------------------------------------------------------------------------------------- --- creates menu for CryAnim ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.setMenu = function setMenu = -( - try - ( - local animToolsName = "CryAnim" - - tempInterface = menuMan.findMenu "Context CryAnim" - if tempInterface != undefined then - menuMan.unRegisterMenu tempInterface - - - -- Menu - local ATm = menuMan.createMenu "Context CryAnim" - -- Seperator - local ATSep = menuMan.createSeparatorItem() - -- List of menUItems - local ATmItem - - -- adding menUItems and set names - ATmItem = menuMan.createActionItem "ATBipToZero2" animToolsName; ATmItem.setTitle "bip to [0,0]"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - ATmItem = menuMan.createActionItem "ATBipToZero3" animToolsName; ATmItem.setTitle "bip to [0,0,0]"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createActionItem "ATShowTrajectory" animToolsName; ATmItem.setTitle "show trajectory"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - ATmItem = menuMan.createActionItem "ATHideAllTrajectories" animToolsName; ATmItem.setTitle "hide all trajectories"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createActionItem "ATMoveToPivPoint" animToolsName; ATmItem.setTitle "move to pivot point"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - ATmItem = menuMan.createActionItem "ATMoveRotToPivPoint" animToolsName; ATmItem.setTitle "move/rotate to pivot point"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - ATmItem = menuMan.createActionItem "ATMoveToSnapshot" animToolsName; ATmItem.setTitle "move to snapshot"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - ATmItem = menuMan.createActionItem "ATMoveRot" animToolsName; ATmItem.setTitle "move/rotate to snapshot"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createActionItem "ATLockRotation" animToolsName; ATmItem.setTitle "lock rotation"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - ATmItem = menuMan.createActionItem "ATUnlockRotation" animToolsName; ATmItem.setTitle "unlock rotation"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createActionItem "ATResetRotation" animToolsName; ATmItem.setTitle "reset rotation"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - ATmItem = menuMan.createActionItem "ATMoveToFloor" animToolsName; ATmItem.setTitle "move to floor"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItemSubMenu = menuMan.createMenu "create snapshot" - ATmItemSubMenUItem1 = menuMan.createActionItem "ATCreateSingleSnapshot" animToolsName ; ATmItemSubMenUItem1.setTitle "single" ; ATmItemSubMenUItem1.setUseCustomTitle true; ATmItemSubMenu.addItem ATmItemSubMenUItem1 -1 - ATmItemSubMenUItem2 = menuMan.createActionItem "ATCreateChildrenSnapshot" animToolsName ; ATmItemSubMenUItem2.setTitle "children" ; ATmItemSubMenUItem2.setUseCustomTitle true; ATmItemSubMenu.addItem ATmItemSubMenUItem2 -1 - -- - ATmItem = menuMan.createSubMenUItem "create snapshot" ATmItemSubMenu ; ATmItem.setTitle "create snapshot"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createActionItem "ATCopyTransform" animToolsName; ATmItem.setTitle "copy"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItemSubMenu = menuMan.createMenu "paste" - ATmItemSubMenUItem1 = menuMan.createActionItem "ATPasteTransform" animToolsName ; ATmItemSubMenUItem1.setTitle "transform" ; ATmItemSubMenUItem1.setUseCustomTitle true; ATmItemSubMenu.addItem ATmItemSubMenUItem1 -1 - ATmItemSubMenUItem2 = menuMan.createActionItem "ATPastePosition" animToolsName ; ATmItemSubMenUItem2.setTitle "position" ; ATmItemSubMenUItem2.setUseCustomTitle true; ATmItemSubMenu.addItem ATmItemSubMenUItem2 -1 - ATmItemSubMenUItem3 = menuMan.createActionItem "ATPasteRotation" animToolsName ; ATmItemSubMenUItem3.setTitle "rotation" ; ATmItemSubMenUItem3.setUseCustomTitle true; ATmItemSubMenu.addItem ATmItemSubMenUItem3 -1 - -- - ATmItem = menuMan.createSubMenUItem "paste" ATmItemSubMenu ; ATmItem.setTitle "paste"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createSeparatorItem(); ATm.addItem ATmItem -1 - -- - ATmItem = menuMan.createActionItem "ATPivotSelect" animToolsName; ATmItem.setTitle "select pivot"; ATmItem.setUseCustomTitle true; ATm.addItem ATmItem -1 - - -- QuadMenu - local ATqM = menuMan.getQuadMenu 1 - -- lower left corner of QuadMenu - local ATqMCorner = ATqM.getMenu 4 - -- generates subMenu to put in the Menu - local ATqMSub = menuMan.createSubMenUItem "Context CryAnim" ATm - -- sets the subMenu to be flat - ATqMSub.setDisplayFlat true - -- adding subMenu to QuadMenuCorner - ATqMCorner.addItem ATqMSub -1 - - --// initialize when struct -- - deleteAllChangeHandlers id:#lockRotation - ) - catch ( logOutput "!!> Error in cryAnim.base.setMenu" ) -) -setMenu = undefined -logOutput "> Created cryAnim.base.setMenu function" - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.setCallbacks ----------------------------------------------------------------------------------------------------------------------------------- --- creates callbacks for cryAnim ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.setCallbacks = function setCallbacks = -( - try - ( - with undo off - ( - callbacks.removeScripts id:#checkDialogVisible - callbacks.addScript #preSystemShutdown "cryTools.cryAnim.base.killCryAnim()" id:#checkDialogVisible - ) - return true - ) - catch ( logOutput "!!> Error in cryAnim.base.setCallbacks" ) -) -setCallbacks = undefined -logOutput "> Created cryAnim.base.setCallbacks function" - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.initVars ----------------------------------------------------------------------------------------------------------------------------------- --- initializes variables ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.setVars = function setVars = -( - try - ( - cryTools.cryAnim.UI.main._v.dialogMaxHeight = ((sysInfo.desktopSize)[2] - 135) - cryTools.cryAnim.UI.main._v.tempINIPath = (cryTools.cryTemp + "cryAnim_temp.ini") - cryTools.cryAnim.UI.main._v.animToolsINIPath = (cryTools.cryTemp + "cryAnim.ini") - - cryTools.cryAnim._v.tempATPath = (cryTools.cryTemp + "cryAnim_perforce.at") - cryTools.cryAnim._v.perforceDir = cryTools.cryAnim.base.getPerforcePath() - cryTools.cryAnim._v.various[35] = #(rotPosStruct()) - - cryTools.cryAnim.align._v.pivotLast.LFoot.pivObject = "Bip01 L Foot" - cryTools.cryAnim.align._v.pivotLast.RFoot.pivObject = "Bip01 R Foot" - cryTools.cryAnim.align._v.pivotLast.LHand.pivObject = "Bip01 L Hand" - cryTools.cryAnim.align._v.pivotLast.RHand.pivObject = "Bip01 R Hand" - - cryTools.cryAnim.align._v.pivotLast.LHand.pivotName = "p6_(Bip01 L Hand)" - cryTools.cryAnim.align._v.pivotLast.RHand.pivotName = "p6_(Bip01 R Hand)" - cryTools.cryAnim.align._v.pivotLast.LFoot.pivotName = "p6_(Bip01 L Foot)" - cryTools.cryAnim.align._v.pivotLast.RFoot.pivotName = "p6_(Bip01 R Foot)" - - return true - ) - catch ( logOutput "!!> Error in cryAnim.base.initVars" ) -) -setVars = undefined -logOutput "> Created cryAnim.base.initVars function" - - - - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.killCryAnim ----------------------------------------------------------------------------------------------------------------------------------- --- kills the dialog if one is opened and cleans all used variables ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.killCryAnim = function killCryAnim unloadCryAnim:undefined = -( - try - ( - cryTools.cryAnim._v.various[10] = true - - try destroyDialog cryTools.cryAnim.UI.main.dialog catch() - try destroyDialog cryTools.cryAnim.UI.main.models.editModelList catch() - try destroyDialog cryTools.cryAnim.UI.main.models.editItemList catch() - try destroyDialog cryTools.cryAnim.UI.batchProcess.customizeScript catch() - try destroyDialog cryTools.cryAnim.UI.batchProcess.subRangeDialog catch() - - try closeRolloutFloater cryTools.cryAnim.UI.batchProcess.dialog catch() - try destroyDialog cryTools.cryAnim.UI.batchProcess.editBoneList catch() - - - - if unloadCryAnim == true then - ( - cryTools.cryAnim = undefined - gc light:true - ) - - - return true - ) - catch ( logOutput "!!> Error in cryAnim.base.killCryAnim" ) -) -killCryAnim = undefined -logOutput "> Created cryAnim.base.killCryAnim function" - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.callStartUp ----------------------------------------------------------------------------------------------------------------------------------- --- sets up CryAnim ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.callStartUp = function callStartUp = -( - try - ( - --// deleting pivPoint if available - for obj in objects do - if ((findString obj.name "pivPoint") != undefined) or ((findString obj.name "pivSnap") != undefined) then - delete obj - - - cryTools.cryAnim.base.setVars() - cryTools.cryAnim.base.setMacros #update - cryTools.cryAnim.base.setMenu() - cryTools.cryAnim.base.setCallbacks() - - - - - if cryTools.cryAnim._v.perforceDir != undefined then - ( - if (cryTools.cryAnim.base.iniFile #get #autoUpdate) == true then - ( - if (local tempVar = cryTools.cryAnim.base.perforce "" #checkLoading) != false then - cryTools.cryAnim.base.perforce tempVar #messageOnLoading - ) - ) - - - - - local finishedLoading = cryTools.cryAnim.base.loadFiles #all - - - if (cryTools.cryAnim.base.iniFile #get #visible) == true then - ( - try crysplash.build.text = "LOADING DIALOG" catch() - cryTools.cryAnim.UI.main._f.callDialog() - ) - - - local tempLoadString = "Loaded" - - if reloadCryAnim == true then - tempLoadString = "Reloaded" - - reloadCryAnim = undefined - - - trackTime = ((timeStamp() - trackTime) / 1000.0) - - if finishedLoading == true then - print (tempLoadString + " CryAnim in " + trackTime as String + " seconds.\n") - - - try destroyDialog crySplash catch() - - ) - catch ( logOutput "!!> Error in cryAnim.base.callStartUp" ) -) -callStartUp = undefined -logOutput "> Created cryAnim.base.callStartUp function" - - - - - - - - - - - - - - ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// ---################################################################ --- DEF:cryTools.cryAnim.base.reloadScript ----------------------------------------------------------------------------------------------------------------------------------- --- reloads the full script ---################################################################ ---/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -cryTools.cryAnim.base.reloadScript = function reloadScript = -( - try - ( - cryTools.cryAnim.base.loadFiles #load - ) - catch ( logOutput "!!> Error in cryAnim.base.reloadScript" ) -) -reloadScript = undefined -logOutput "> Created cryAnim.base.reloadScript function" - - - - - --// creates aTools -cryTools.cryAnim.base.callStartUp() - -logOutput ">> load.ms loaded" - -trackTime = undefined \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/anmExport.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/anmExport.ms deleted file mode 100644 index 3f9d5719f1..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/anmExport.ms +++ /dev/null @@ -1,81 +0,0 @@ - -try -( - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile].subRanges.count == 0 then - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[2].btnImportANM.pressed() - - - local listEntries = cryTools.cryAnim.UI.batchProcess._v.exportFiles[cryTools.cryAnim.UI.batchProcess._v.selectedFile] - local tempStatus = "" - - local tempCheckBeforeExport = cryTools.checkbeforeexport - local tempSuppressWarnings = cryTools.suppresswarnings - - cryTools.checkbeforeexport = false - cryTools.suppresswarnings = true - - UtilityPanel.OpenUtility CryEngine2_Exporter - - - local tempRange = animationRange - - if listEntries.subRanges.count == 0 then - tempStatus = "Error: No Sub-Ranges found" - else - ( - - for i = 1 to listEntries.subRanges.count do - ( - if listEntries.subRanges[i].range.start.frame == listEntries.subRanges[i].range.end.frame then - ( - tempStatus = listEntries.subRanges[i].export + " has wrong animation range" - continue - ) - else - ( - if listEntries.subRanges[i].range.start.frame > listEntries.subRanges[i].range.end.frame then - ( - local tempTime = listEntries.subRanges[i].range.start - listEntries.subRanges[i].range.start = listEntries.subRanges[i].range.end - listEntries.subRanges[i].range.end = tempTime - - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateList() - tempStatus += "Switched Start and Stop of " + listEntries.subRanges[i].export - ) - ) - - - animationRange = listEntries.subRanges[i].range - - saveMaxFile (maxFilePath + listEntries.subRangePrefix + "_" + listEntries.subRanges[i].export + ".max") quiet:true - - local newObjects = #() - for f = 1 to listEntries.subRanges[i].objects.count do - ( - if (local tempNode = getNodeByName listEntries.subRanges[i].objects[f]) != undefined then - newObjects[f] = tempNode - else - tempStatus += "; Can't find " + listEntries.subRanges[i].objects[f] - ) - - - if newObjects.count > 0 then - ( - csexport.set_node_list newObjects - csexport.export_nodes() - ) - else - tempStatus += "; No Node Found" - - deleteFile (maxFilePath + maxFileName) - - ) - ) - animationRange = tempRange - - cryTools.checkbeforeexport = tempCheckBeforeExport - cryTools.suppresswarnings = tempSuppressWarnings - - cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = tempStatus -) -catch() diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/autoLoc.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/autoLoc.ms deleted file mode 100644 index fa86643b79..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/autoLoc.ms +++ /dev/null @@ -1,271 +0,0 @@ - -struct autoLocStruct -( - setCon, - getChildExtent, - getMaxValue, - setBodyMass, - calcLoc, - setLoc -) - - -autoLoc = autoLocStruct() - - -autoLoc.setCon = function setCon node time = -( - try - ( - for i = 1 to node.controller.keys.count do - ( - try - ( - tempKey = biped.getKey node.controller i - if tempKey.time == time then - ( - tempKey.continuity = 0 - ) - ) - catch() - ) - ) - catch() -) -setCon = undefined - - - -autoLoc.calcLoc = function calcLoc = -( - cycleLoc = true - rotateLoc = #none - posChange = false - startLoc = #none - locoCycle = false - - - - at time animationRange.start - ( - startRot = $Bip01.transform.rotation as eulerangles - startPos = $Bip01.transform.pos - - startLFootPos = $'Bip01 L Toe0'.transform.pos - startRFootPos = $'Bip01 R Toe0'.transform.pos - ) - - at time animationRange.end - ( - endRot = $Bip01.transform.rotation as eulerangles - endPos = $Bip01.transform.pos - ) - - at time ((animationRange.start + animationRange.end) / 2) - midRot = $Bip01.transform.rotation as eulerangles - - at time 2f - ( - startMidPos = $Bip01.transform.pos - - startMidLFootPos = $'Bip01 L Toe0'.transform.pos - startMidRFootPos = $'Bip01 R Toe0'.transform.pos - ) - - at time (animationRange.end - 2) - endMidPos = $Bip01.transform.pos - - - - diffRot = #(endRot.x, endRot.y, endRot.z) - diffRot[1] -= startRot.x - diffRot[2] -= startRot.y - diffRot[3] -= startRot.z - - diffMidRot = #(midRot.x, midRot.y, midRot.z) - diffMidRot[1] -= startRot.x - diffMidRot[2] -= startRot.y - diffMidRot[3] -= startRot.z - - - - diffPos = endPos - startPos - diffStartPos = startMidPos - startPos - diffEndPos = endPos - endMidPos - - diffLFootPos = startLFootPos - startMidLFootPos - diffRFootPos = startRFootPos - startMidRFootPos - - diffRotPositiv = copy diffRot #noMap - - for i = 1 to 3 do - ( - if diffPos[i] < 0 then diffPos[i] *= -1 - if diffPos[i] > 10 then posChange = true - if diffRotPositiv[i] < 0 then diffRotPositiv[i] *= -1 - if diffRotPositiv[i] > 2 then cycleLoc = false - --if diffMidRot[i] < 0 then diffMidRot[i] *= -1 - - if diffLFootPos[i] < 0 then diffLFootPos[i] *= -1 - if diffLFootPos[i] > 10 then locoCycle = true - - if diffRFootPos[i] < 0 then diffRFootPos[i] *= -1 - if diffRFootPos[i] > 10 then locoCycle = true - ) - - - - if cycleLoc == false then locoCycle = false - - - diffStartPos = distance startPos startMidPos - diffEndPos = distance endMidPos endPos - - - - if diffStartPos < 5 and diffStartPos > 0.4 then - ( - if locoCycle == false then - startLoc = #start - ) - if diffStartPos > 4 and diffEndPos < 2 then - if locoCycle == false then - if cycleLoc == false then - startLoc = #stop - - - - - if diffRot[3] < 140 and diffRot[3] > 80 then - rotateLoc = #left - if diffRot[3] < -40 and diffRot[3] > -100 then - rotateLoc = #right - - - if diffMidRot[3] > -220 and diffMidRot[3] < -140 then - ( - if diffRot[3] < -140 and diffRot[3] > -180 then - rotateLoc = #revL - ) - - if diffMidRot[3] > -140 and diffMidRot[3] < -60 then - ( - if diffRot[3] < -130 and diffRot[3] > -170 then - rotateLoc = #revR - ) - --- print ("diffMidRot = " + diffMidRot as String) --- print ("diffRot = " + diffRot as String) --- print ("diffEndPos = " + diffEndPos as String) --- print ("diffStartPos = " + diffStartPos as String) --- print ("diffLFootPos = " + diffLFootPos as String) --- print ("diffRFootPos = " + diffRFootPos as String) --- print ("startLoc = " + startLoc as String) --- print ("rotateLoc = " + rotateLoc as String) --- print ("cycleLoc = " + cycleLoc as String) --- print ("posChange = " + posChange as String) --- print ("locoCycle = " + locoCycle as String) - - - struct locStruct ( start, rotate, cycle, position ) - local tempValue = locStruct start:startLoc rotate:rotateLoc cycle:cycleLoc position:posChange - --- print tempValue - - return tempValue -) -calcLoc = undefined - - -autoLoc.setLoc = function setLoc = -( - analyseLoc = autoLoc.calcLoc() - - cryTools.cryAnim._f.resetLocator() - - cryTools.cryAnim._f.moveToBodyMass() - - if analyseLoc.rotate != #none then - ( - at time 10f - ( - biped.setTransform $Locator_Locomotion #pos $Locator_Locomotion.transform.pos true - autoLoc.setCon $Locator_Locomotion 10f - ) - - at time animationRange.end - cryTools.cryAnim._f.moveToBodyMass() - - - with animate on - ( - at time 16f - ( - case analyseLoc.rotate of - ( - #left: rotate $Locator_Locomotion (eulerangles 0 0 89) - #right: rotate $Locator_Locomotion (eulerangles 0 0 -89) - #revL: rotate $Locator_Locomotion (eulerangles 0 0 179) - #revR: rotate $Locator_Locomotion (eulerangles 0 0 -179) - ) - autoLoc.setCon $Locator_Locomotion 16f - ) - - at time animationRange.end - ( - case analyseLoc.rotate of - ( - #left: rotate $Locator_Locomotion (eulerangles 0 0 89) - #right: rotate $Locator_Locomotion (eulerangles 0 0 -89) - #revL: rotate $Locator_Locomotion (eulerangles 0 0 179) - #revR: rotate $Locator_Locomotion (eulerangles 0 0 -179) - ) - ) - ) - ) - else - ( - if analyseLoc.position == true then - ( - if analyseLoc.start == #start then - ( - at time 10f - ( - biped.setTransform $Locator_Locomotion #pos $Locator_Locomotion.transform.pos true - autoLoc.setCon $Locator_Locomotion 10f - ) - - at time animationRange.end - cryTools.cryAnim._f.moveToBodyMass() - ) - else - ( - at time animationRange.end - cryTools.cryAnim._f.moveToBodyMass() - ) - ) - else - ( - if analyseLoc.start == #start then - at time animationRange.end - cryTools.cryAnim._f.moveToBodyMass() - ) - ) - - sliderTime = animationRange.start + 1 - sliderTime = animationRange.start - -) -setLoc = undefined - -try - autoLoc.setLoc() -catch - cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "Error: Auto-Loc" - - - - - - - \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/bipExport.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/bipExport.ms deleted file mode 100644 index 07abbda66e..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/bipExport.ms +++ /dev/null @@ -1,10 +0,0 @@ -try -( - tempVar = (cryTools.cryAnim.UI.main._f.getUI "Settings" "radExportPrompt").state - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radExportPrompt").state = 2 - (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "Export").pressed() - - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state = tempVar - tempVar = undefined -) -catch ( cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "Error: Failed to Export" ) \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/bipSave.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/bipSave.ms deleted file mode 100644 index 5ec0f9f56c..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/bipSave.ms +++ /dev/null @@ -1,10 +0,0 @@ -try -( - tempVar = (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSavePrompt").state - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSavePrompt").state = 2 - (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "Save").pressed() - - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSavePrompt").state = tempVar - tempVar = undefined -) -catch ( cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "Error: Failed to Save" ) \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/bipSaveExport.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/bipSaveExport.ms deleted file mode 100644 index 7667ceab6e..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/bipSaveExport.ms +++ /dev/null @@ -1,10 +0,0 @@ -try -( - tempVar = (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state = 2 - (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "Save / Export").pressed() - - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state = tempVar - tempVar = undefined -) -catch ( cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "Error: Failed to Save/Export" ) \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/convertTCB.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/convertTCB.ms deleted file mode 100644 index 25641e963c..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/convertTCB.ms +++ /dev/null @@ -1,16 +0,0 @@ -try -( - if selection.count > 0 then - local selArray = selection as Array - else - local selArray = Objects as Array - - for obj in selArray do - ( - obj.controller.position.controller = TCB_Position() - obj.controller.rotation.controller = TCB_Rotation() - obj.controller.scale.controller = TCB_Scale() - ) -) -catch - cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "Error: Setting TCB" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/fbxExport.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/fbxExport.ms deleted file mode 100644 index 07abbda66e..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/fbxExport.ms +++ /dev/null @@ -1,10 +0,0 @@ -try -( - tempVar = (cryTools.cryAnim.UI.main._f.getUI "Settings" "radExportPrompt").state - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radExportPrompt").state = 2 - (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "Export").pressed() - - (cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state = tempVar - tempVar = undefined -) -catch ( cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "Error: Failed to Export" ) \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/batch/Scripts/rotate180.ms b/Tools/maxscript/cryAnim/ui/batch/Scripts/rotate180.ms deleted file mode 100644 index 5e53d199e7..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/Scripts/rotate180.ms +++ /dev/null @@ -1,7 +0,0 @@ -with undo off -( - try - cryTools.cryAnim._f.rotateAnim 180 range:true - catch - cryTools.cryAnim.UI.batchProcess._v.customScriptStatus = "Error: Rotating 180" -) diff --git a/Tools/maxscript/cryAnim/ui/batch/batch8.ms b/Tools/maxscript/cryAnim/ui/batch/batch8.ms deleted file mode 100644 index 19a968350b..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/batch8.ms +++ /dev/null @@ -1,951 +0,0 @@ -------------------------------------------------------------------------------- --- batch8.ms #for 3DSMax v.8 --- Version 2.4 Internal --- Batch Exporter for .bip and .fbx with upper body detection for upper body animations used in cryEngine --- By: Mathias Lindner --- eMail: devsupport@crytek.com -------------------------------------------------------------------------------- - - - - - ---############################################################################### - --// creates the dialog to customize the scripts ---############################################################################### -cryTools.cryAnim.UI.batchProcess._f.createScriptDialog = function createScriptDialog dialogTitle = -( - try - ( - --// rollout with edit option for the script which will be execute before exporting or at the end of check - rollout batchProcessScriptCustomize dialogTitle - ( - --// script container - --edittext edScript "" pos:[2,4] height:360 width:392 - edittext edScript "" pos:[2,4] height:360 fieldWidth:392 - --// applies the script to the current scene - button btnPreview "Preview" pos:[6,372] width:50 height:20 toolTip:"Executes the script on the current scene" - --// applies the script to the current scene - button btnClear "Clear" pos:[77,372] width:50 height:20 toolTip:"Clears the script in the edit box" - --// imports other scripts - button btnImport "Import" pos:[150,372] width:50 height:20 toolTip:"Opens a dialog to import .ms script files" - --// saves the script and destroys dialog - button btnCache "Cache" pos:[260,372] width:50 height:20 toolTip:"Stores the custom script in the memory" - --// saves the script and destroys dialog - button btnSaveAs "Save As" pos:[205,372] width:50 height:20 toolTip:"Saves the custom script in the edit box into a specific file" - --// destroys dialog without saving - button btnCancel "Cancel" pos:[345,372] width:50 height:20 toolTip:"Aborts the custom script generation" - - - - on batchProcessScriptCustomize open do - ( - case cryTools.cryAnim.UI.batchProcess.customizeScript.title of - ( - "First Script Customization": local tempVarScript = cryTools.cryAnim.UI.batchProcess._v.firstScript - "Second Script Customization": local tempVarScript = cryTools.cryAnim.UI.batchProcess._v.secondScript - ) - --// if there is a defined script already - if tempVarScript != "" then - --// set text of the script container to the already defined script - edScript.text = tempVarScript - ) - - - - on btnPreview pressed do - ( - try - ( - --// tries executing the script - tempString = execute( edScript.text ) - --print tempString - ) - catch - ( - --// if an error occured, print the error message - format "*** % ***\n" (getCurrentException()) - ) - ) - - - on btnClear pressed do - ( - edScript.text = "" - ) - - - on btnImport pressed do - ( - ret = "\r\n" - local tempVar = getOpenFileName caption:"First Script Import" filename:(getDir #scripts + "\\*.ms") types:"Script Files (*.ms)|*.ms" - if tempVar != undefined then - ( - cryTools.cryAnim.UI.batchProcess.customizeScript.edScript.text += ret + ret + ret +" -- Imported from " + tempVar + ret + ret - - local tempStream = openFile tempVar mode:"r" - while (eof tempStream) != true do - cryTools.cryAnim.UI.batchProcess.customizeScript.edScript.text += readLine tempStream + ret - - close tempStream - ) - ) - - - - - on btnCache pressed do - ( - local tempVar = "" - case cryTools.cryAnim.UI.batchProcess.customizeScript.title of - ( - "First Script Customization": ( cryTools.cryAnim.UI.batchProcess._v.firstScript = edScript.text ; tempVar = "First" ) - "Second Script Customization": ( cryTools.cryAnim.UI.batchProcess._v.secondScript = edScript.text ; tempVar = "Second" ) - ) - - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists scriptUpdate:tempVar - - --// destroys the dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.customizeScript - ) - - - on btnSaveAs pressed do - ( - local tempString = "" - - case cryTools.cryAnim.UI.batchProcess.customizeScript.title of - ( - "First Script Customization": tempString = "First" - "Second Script Customization": tempString = "Second" - ) - - local tempVar = getSaveFileName caption:"First Script Import" filename:(cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\batch\\" + tempString + "Script\\*.ms") types:"Script Files (*.ms)|*.ms" - if tempVar != undefined then - ( - local tempStream = openFile tempVar mode:"w" - format edScript.text to:tempStream - close tempStream - - local tempFilter = filterString tempVar "\\" - local tempString = (filterString tempFilter[tempFilter.count] ".")[1] - - case cryTools.cryAnim.UI.batchProcess.customizeScript.title of - ( - "First Script Customization": tempVar = "First|" + tempString - "Second Script Customization": tempVar = "Second|" + tempString - ) - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists scriptUpdate:tempVar - destroyDialog cryTools.cryAnim.UI.batchProcess.customizeScript - ) - - ) - - - on btnCancel pressed do - ( - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists scriptUpdate:"None" - --// destroys the dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.customizeScript - ) - ) - --// creates the dialog - cryTools.cryAnim.UI.batchProcess.customizeScript = batchProcessScriptCustomize - batchProcessScriptCustomize = undefined - - createDialog cryTools.cryAnim.UI.batchProcess.customizeScript 400 400 - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.createScriptDialog" ) -) -createScriptDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.createScriptDialog function" - - - - - - - - - - - - ---############################################################################### - --// creates the batchProcess dialog ---############################################################################### -cryTools.cryAnim.UI.batchProcess._f.callDialog = function callDialog = -( - try - ( - --// if batchProcess is already opened, close the rollout floater - try ( closeRolloutFloater cryTools.cryAnim.UI.batchProcess.dialog ) catch() - --// create new batchProcess rollout floater - cryTools.cryAnim.UI.batchProcess.dialog = newRolloutFloater "CryAnim Batch Process v2.7" 600 422 - - --// rollout with file and folder list - rollout fileStatusRO "File Status" height:200 - ( - --// files list - activeXControl lbFiles "MSComctlLib.ListViewCtrl" pos:[140,8] height:185 width:440 - --// sub folders list - activeXControl lbSubFolders "MSComctlLib.TreeCtrl" pos:[8,8] height:185 width:120 - - - - on fileStatusRO open do - ( - try - ( - --// initialise - lbFiles.GridLines = true - lbFiles.MousePointer = #ccArrow - lbFiles.AllowColumnReorder = true - lbFiles.view = #lvwReport - lbFiles.LabelEdit = #lvwManual - lbFiles.LabelWrap = true - lbFiles.MultiSelect = true - lbFiles.FullRowSelect = true - - - lbSubFolders.LineStyle = #tvwTreeLines - lbSubFolders.Style = #tvwTreelinesPlusMinusText - lbSubFolders.sorted = true - lbSubFolders.checkboxes = true - lbSubFolders.Indentation = 50 - - - --// adds columns - lbFiles.columnHeaders.Add text:"Filename" - lbFiles.columnHeaders.Add text:"Bone" - lbFiles.columnHeaders.Add text:"Export" - lbFiles.columnHeaders.Add text:"Ext" - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.open" ) - ) - - - - on lbFiles Click do - ( - try - ( - --// gets the cursor position of the active rollout part - screenPos = getCursorPos lbFiles - --// applies a hit test of the current mouse position - tempItem = lbFiles.hittest ((screenPos.x-2)*15) ((screenPos.y-2)*15) - - --// if nothing is selected - if tempItem == undefined then - ( - --// go through the files list and deselect every entry - for i = 1 to lbFiles.ListItems.count do - lbFiles.ListItems[i].selected = false - ) - --// if an item is selected - else - ( - --// if a folder is selected, deselect it - if tempItem.ListSubItems[3].text == "folder" then - tempItem.selected = false - - ) - --// update the files counter - cryTools.cryAnim.UI.batchProcess._f.updateCounter() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.lbFiles.click" ) - ) - - - - on lbSubFolders NodeCheck checkedNode do - ( - try - ( - if cryTools.cryAnim._v.various[120] != true then - ( - --// if a state changes in the sub folders list, update the whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection #set - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.lbSubFolders.nodeCheck" ) - ) - - - - on lbFiles DblClick do - ( - try - ( - --// gets the cursor position of the active rollout part - screenPos = getCursorPos lbFiles - --// applies a hit test of the current mouse position - tempItem = lbFiles.hittest ((screenPos.x-2)*15) ((screenPos.y-2)*15) - - --// if an item is selected - if tempItem != undefined then - ( - --// if a folder is selected - if tempItem.ListSubItems[3].text == "folder" then - ( - --// deselect the folder - tempItem.selected = false - - --// go through the files list and select every on-coming entry (without folders) until another folder is reached - for i = (tempItem.index + 1) to lbFiles.ListItems.count do - ( - if lbFiles.ListItems[i].ListSubItems[3].text != "folder" then - lbFiles.ListItems[i].selected = true - else - exit - ) - ) - --// if no folder is selected - else - ( - --// go through the list and select every entry without folders - for i = 1 to lbFiles.ListItems.count do - if lbFiles.ListItems[i].ListSubItems[3].text != "folder" then - lbFiles.ListItems[i].selected = true - ) - ) - --// update the files counter - cryTools.cryAnim.UI.batchProcess._f.updateCounter() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.lbFiles.dblClick" ) - ) - - ) - logOutput "> Created fileStatusRO rollout" - - - - - --// rollout with paths, file mask and pre export script - rollout inputOutputRO "Input / Output" height:50 - ( - --// source folder - button btnSourceFolder "Source" pos:[8,5] width:60 height:20 toolTip:"Opens a dialog to choose the source folder" - label labSourceFolder "No Folder selected" pos:[80,7] width:300 - --// output folder - button btnExportFolder "Export" pos:[8,27] width:60 height:20 toolTip:"Opens a dialog to choose the export folder" - label labExportFolder "No Folder selected" pos:[80,29] width:300 - - --// file mask - label labFileMask "File Mask" pos:[16,52] - edittext etFileMask "" text:"" pos:[75,50] fieldWidth:300 - - groupbox gbScripts " Process Templates " pos:[400,5] width:180 height:62 - - label labFirstOp "1." pos:[408,24] - dropdownlist ddFirstOp "" pos:[425,21] width:150 - - label labSecondOp "2." pos:[408,46] - dropdownlist ddSecondOp "" pos:[425,42] width:150 - - - - - - - on inputOutputRO open do - ( - try - ( - --// if a source path is already set - if cryTools.cryAnim.UI.batchProcess._v.sourcePath != undefined then - --// set text to the old source path - labSourceFolder.text = cryTools.cryAnim.UI.batchProcess._v.sourcePath - - --// if the ini setting for the file extension is found - if (local tempText = cryTools.cryAnim.base.iniFile #get #batchProcessExt) != "" then - --// set file mask to the ini setting - etFileMask.text = tempText - - --// if the ini setting for the source path is found - if (tempText = cryTools.cryAnim.base.iniFile #get #batchProcessSourcePath) != "" then - ( - --// set source string to the ini setting - labSourceFolder.text = tempText - cryTools.cryAnim.UI.batchProcess._v.sourcePath = tempText - ) - else - --// otherwise to the default string - labSourceFolder.text = "No Source Folder selected" - - --// if the ini setting for the export path is found - if (tempText = cryTools.cryAnim.base.iniFile #get #batchProcessExportPath) != "" then - ( - --// set export string to the ini setting - labexportFolder.text = tempText - cryTools.cryAnim.UI.batchProcess._v.exportPath = tempText - ) - else - --// otherwise to the default string - labexportFolder.text = "No Export Folder selected" - - --// updates the first and second scripts from the folders - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists() - - - --// fills the sub folders list - cryTools.cryAnim.UI.batchProcess._f.updateSubFolders() - cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection #get - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.open" ) - ) - - - - on btnSourceFolder pressed do - ( - try - ( - local tempPath = "" - --// if a source path is defined - if cryTools.cryAnim.UI.batchProcess._v.sourcePath != undefined then - --// set temporary path to the source path - tempPath = cryTools.cryAnim.UI.batchProcess._v.sourcePath - else - --// otherwise get new directory from an input dialog - tempPath = (cryTools.cryAnim.base.perforce cryTools.cryAnim.UI.main._v.bipSavePath #getDirectory) - - --// temporary string gets open directory input for source path - tempString = (getSavePath caption:"Select Source Folder" initialDir:tempPath) - - --// if a folder is selected by the open directory - if tempString != undefined then - ( - --// source path is the new folder with "\" - cryTools.cryAnim.UI.batchProcess._v.sourcePath = tempString + (if (filterString tempString "\\").count > 1 then "\\" else "") - --// updates the export path with the converted path to the project directory - cryTools.cryAnim.UI.batchProcess._v.exportPath = (cryTools.cryAnim.base.perforce (cryTools.cryAnim.UI.main._f.checkExport #ProductionToGame cryTools.cryAnim.UI.batchProcess._v.sourcePath) #getDirectory) - - --// update export folder text - labExportFolder.text = cryTools.cryAnim.UI.batchProcess._v.exportPath - --// update source folder text - labSourceFolder.text = cryTools.cryAnim.UI.batchProcess._v.sourcePath - - --// set ini setting for the source path - cryTools.cryAnim.base.iniFile #set #batchProcessSourcePath value:labSourceFolder.text - cryTools.cryAnim.base.iniFile #set #batchProcessExportPath value:labExportFolder.text - - if (findString labSourceFolder.text "\\") != undefined then - ( - --// clears and fills sub folders - cryTools.cryAnim.UI.batchProcess._f.updateSubFolders() - (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbSubFolders.Nodes.item 0).checked = true - --// clears and fills the file list - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - ) - ) - --// if no folder is selected - else - ( - --// if no export path is set before - if cryTools.cryAnim.UI.batchProcess._v.sourcepath == undefined then - ( - --// enable statistic button as it can be used without exporting - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].btnProcess.enabled = true - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnSourceFolder.pressed" ) - ) - - - on btnExportFolder pressed do - ( - try - ( - --// temporary string gets open directory input for export path - tempString = (getSavePath caption:"Select Export Folder" initialDir:cryTools.cryAnim.UI.batchProcess._v.exportPath) - --// if a folder is selected by the open directory - if tempString != undefined then - ( - --// set export path to the new folder path - cryTools.cryAnim.UI.batchProcess._v.exportPath = tempString + "\\" - --// update exportFolder text - labExportFolder.text = tempString + "\\" - - --// set ini setting for the export path - cryTools.cryAnim.base.iniFile #set #batchProcessExportPath value:labExportFolder.text - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnExportFolder.pressed" ) - ) - - - on ddFirstOp selected value do - ( - try - ( - if ddFirstOp.selection == ddFirstOp.items.count then - cryTools.cryAnim.UI.batchProcess._f.createScriptDialog "First Script Customization" - else - cryTools.cryAnim._v.various[33] = ddFirstOp.items[ddFirstOp.selection] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.ddFirstOp.selected" ) - ) - - - on ddSecondOp selected value do - ( - try - ( - if ddSecondOp.selection == ddSecondOp.items.count then - cryTools.cryAnim.UI.batchProcess._f.createScriptDialog "Second Script Customization" - else - cryTools.cryAnim._v.various[34] = ddSecondOp.items[ddSecondOp.selection] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.ddSecondOp.selected" ) - ) - - - - - on etFileMask entered value do - ( - try - ( - --// set ini setting with changed file mask - cryTools.cryAnim.base.iniFile #set #batchProcessExt value:etFileMask.text - --// update whole dialog with new changes - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.etFileMask.entered" ) - ) - ) - logOutput "> Created inputOutputRO rollout" - - - - - - - - - - --// rollout with all config options and check or export button - rollout checkExportRO "Check / Export" height:60 - ( - --// files / folders groub - label labFilesFolders "Files / Folders :" pos:[10,11] - groupBox gbFilesFolders "" pos:[100,-1] height:32 width:230 - - --// keep the sub folder structure when exporting - label labKeepSubFolders "Keep Sub Folders" pos:[210,11] - checkBox chkKeepSubFolders "" pos:[300,11] checked:true - - --// counter for selected and maximumm files - label labCount "Count :" pos:[130,11] - - --// bone detection for exporting specific body parts for specific file string parts - label labBoneDetection "Bone Detection :" pos:[10,42] - groupBox gbBoneDetection "" pos:[100,30] height:32 width:230 - - --// config bone detection, manage sets of bone detections - button btnConfig "Config" pos:[110,41] height:17 width:70 toolTip:"Opens a dialog to configure filename/bone detection" - --// activate automatic file detection - label labDetect "Detect" pos:[195,43] - checkBox chkDetect "" pos:[235,42] checked:true - --// only files which are detected will be shown - label labOnlyBoneDetection " + " pos:[255,43] - checkBox chkOnlyBoneDetection "" pos:[270,42] - --// only files which are not detected will be shown - label labNoBoneDetection " - " pos:[290,43] - checkBox chkNoBoneDetection "" pos:[300,42] - - --// executes the whole export process with pre export script, but without real exporting - button btnProcess "P R O C E S S" pos:[345,8] height:50 width:230 enabled:false toolTip:"Processes the files/selection in the list (executes scripts)" - - - - - on checkExportRO open do - ( - try - ( - --// clears the file list - cryTools.cryAnim.UI.batchProcess._v.exportFiles = #() - - try - ( - local tempSubFilter = cryTools.cryAnim.base.iniFile #get #batchProcessSubFolderSelection - tempSubFilter = filterString tempSubFilter "#" - - if tempSubFilter.count == 0 then - (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbSubFolders.Nodes.item 0).checked = true - - ) catch() - - try cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkKeepSubFolders.checked = cryTools.cryAnim.base.iniFile #get #batchProcessSubFolders catch() - - --// if a source path is internal defined - if cryTools.cryAnim.UI.batchProcess._v.sourcePath != undefined then - ( - --// enable check and export button - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].btnProcess.enabled = true - ) - - --// get bone detection set up - local tempBoneArray = cryTools.cryAnim.base.iniFile #get #bones - --// if a bone setup is found - if tempBoneArray != undefined then - ( - tempListArray = #() - --// goes through the bone list - for i = 1 to tempBoneArray.count do - --// if an entry is found - if tempBoneArray[i].name != "" then - --// add the entry to the list - append tempListArray tempBoneArray[i] - - --// set new bone list - cryTools.cryAnim.UI.batchProcess._v.boneList = tempBoneArray - ) - - --// update whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.open" ) - ) - - - - - on chkKeepSubFolders changed value do - ( - try - cryTools.cryAnim.base.iniFile #set #batchProcessSubFolders value:value - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.chkKeepSubFolder.changed" ) - ) - - - on btnProcess pressed do - ( - try - --// process all used files without export - cryTools.cryAnim.UI.batchProcess._f.processFiles #statistic - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.btnProcess.pressed" ) - ) - - - on chkOnlyBoneDetection changed value do - ( - try - ( - --// if only bone detection is activated - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkOnlyBoneDetection.checked == true then - --// no bone detection is deactivated - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkNoBoneDetection.checked = false - - --// updates whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - cryTools.cryAnim.UI.batchProcess._v.flags[1] = false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.chkOnlyBoneDetection.changed" ) - ) - - - on chkNoBoneDetection changed value do - ( - try - ( - --// if no bone detection is activated - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkNoBoneDetection.checked == true then - --// only bone detections is deactivated - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkOnlyBoneDetection.checked = false - - --// updates whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - cryTools.cryAnim.UI.batchProcess._v.flags[1] = false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.chkNoBoneDetection.changed" ) - ) - - on btnConfig pressed do - ( - try - ( - --// rollout to edit the bone list entry - rollout entryDetailsRO "Entry Details" - ( - label labName "Name :" pos:[8,10] - label labExternal "External :" pos:[8,30] - label labBones "Bones :" pos:[8,50] - - --// sets the name, file detection and bones column - edittext edName "" text:(cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem.SubItems.item 0).text pos:[70,10] fieldWidth:300 - edittext edExternal "" text:(cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem.SubItems.item 1).text pos:[70,30] fieldWidth:300 - edittext edBones "" text:(cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem.SubItems.item 2).text pos:[70,50] fieldWidth:245 - --// button to pick specific bones in the scene - button btnPickBones "Pick" pos:[323,50] height:17 width:50 toolTip:"Opens dialog to select the bone associated to the filename detection" - - --// save the entry or cancel - button btnSave "Save" pos:[100,80] height:20 width:80 toolTip:"Saves filename/bone detection" - button btnCancel "Cancel" pos:[200,80] height:20 width:80 toolTip:"Aborts filename/bone detection" - - - on btnSave pressed do - ( - --// get currently selected item - local tempItem = cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem - - --// set new name - (tempItem.SubItems.item 0).text = edName.text - --// set new file detection - (tempItem.SubItems.item 1).text = edExternal.text - --// set new bone list - (tempItem.SubItems.item 2).text = edBones.text - - local tempListArray = #() - - cryTools.cryAnim.UI.batchProcess._f.updateExtent() - --// kills bone edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.entryDetails - ) - - - on btnCancel pressed do - ( - --// kills bone edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.entryDetails - ) - - on btnPickBones pressed do - ( - local tempString = "" - --// pick node from the scene - objArray = selectByName title:("Select Nodes") showHidden:true - - --// if a node is selected - if objArray != undefined then - ( - --// goes through the nodes - for i = 1 to objArray.count do - --// adds the name of the node with a ";" as seperator - tempString += objArray[i].name + (if i != objArray.count then ";" else "") - - --// set the new bone list - edBones.text = tempString - ) - - ) - - ) - cryTools.cryAnim.UI.batchProcess.entryDetails = entryDetailsRO - entryDetailsRO = undefined - - - - - - - - - - --// rollout to edit the bone detection list - rollout editBoneListRO "Edit Bone List" - ( - --// list of all bone setups - activeXControl lbList "MSComctlLib.ListViewCtrl" pos:[1,1] height:185 width:440 - --// save current setup - button btnSave "Save" pos:[8,195] height:20 width:80 toolTip:"Saves selected filename/bone detection entry" - button btnDelete "Delete" pos:[150,195] height:20 width:60 toolTip:"Deletes selected entry" - button btnDeleteAll "Delete All" pos:[220,195] height:20 width:60 toolTip:"Clears whole list" - button btnCancel "Cancel" pos:[350,195] height:20 width:80 toolTip:"Abort filename/bone detection" - - - on editBoneListRO open do - ( - lbList.GridLines = true - lbList.MousePointer = #ccArrow - lbList.AllowColumnReorder = true - lbList.view = #lvwReport - lbList.LabelEdit = #lvwManual - lbList.Sorted = true - lbList.FullRowSelect = true - lbList.Checkboxes = true - - --// adds columns - lbList.columnHeaders.Add text:"Name" - lbList.columnHeaders.Add text:"External" - lbList.columnHeaders.Add text:"Bones" - - --// goes through the bone list - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.boneList.count do - ( - --// adds a new entry - local lbListEntry = lbList.listItems.Add text:cryTools.cryAnim.UI.batchProcess._v.boneList[i].name - - --// if entry is active - if cryTools.cryAnim.UI.batchProcess._v.boneList[i].active == "true" then - --// set list entry active - lbListEntry.checked = true - --// if entry is not active - if cryTools.cryAnim.UI.batchProcess._v.boneList[i].active == "false" then - --// set list entry not active - lbListEntry.checked = false - - --// add external entry - lbListEntry.listSubItems.Add text:cryTools.cryAnim.UI.batchProcess._v.boneList[i].external - --// add bone entry - lbListEntry.listSubItems.Add text:cryTools.cryAnim.UI.batchProcess._v.boneList[i].bones - ) - ) - - - on lbList DblClick do - ( - --// gets the bone list position - screenPos = getCursorPos lbList - --// hit test the cursor position - tempItem = lbList.hittest ((screenPos.x-2)*15) ((screenPos.y-2)*15) - - --// if an item is selected - if tempItem != undefined then - ( - --// creates bone entry edit - createDialog cryTools.cryAnim.UI.batchProcess.entryDetails 385 110 - - ) - --// if no item is selected - else - ( - --// empty boneStruct - tempStringArray = (boneStruct name:"" external:"" bones:"") - tempArray = #() - - --// get nodes to be added - objArray = selectByName title:("Select Nodes to be added") showHidden:true - - --// if a node is selected - if objArray != undefined then - ( - --// goes through node list - for obj in objArray do - --// add the nodes via boneStruct to a seperate list - append tempArray (boneStruct name:obj.name external:obj.name bones:obj.name) - - --// goes through the node list - for i = 1 to tempArray.count do - ( - --// adds name(s) of the node(s) - tempStringArray.name += tempArray[i].name + (if i != tempArray.count then ";" else "") - --// adds file detection(s) - tempStringArray.external += tempArray[i].external + (if i != tempArray.count then ";" else "") - --// adds bone(s) list - tempStringArray.bones += tempArray[i].bones + (if i != tempArray.count then ";" else "") - ) - - --// adds entry to the bone list - local lbListEntry = lbList.ListItems.Add text:tempStringArray.name - lbListEntry.checked = true - lbListEntry.ListSubItems.Add text:tempStringArray.external - lbListEntry.ListSubItems.Add text:tempStringArray.bones - ) - ) - ) - - on btnSave pressed do - ( - local tempArray = #() - local tempList = #() - - --// goes through the bone list - for i = 1 to lbList.ListItems.count do - ( - local tempItemArray = #() - local tempItem = lbList.ListItems[i] - - --// save checked state - tempItemArray[1] = tempItem.checked as String - --// if nothing is typed in, the entry will have " " to filter correctly - if tempItem.text != "" then tempItemArray[2] = tempItem.text else tempItemArray[2] = " " - if tempItem.ListSubItems[1].text != "" then tempItemArray[3] = tempItem.ListSubItems[1].text else tempItemArray[3] = " " - if tempItem.ListSubItems[2].text != "" then tempItemArray[4] = tempItem.ListSubItems[2].text else tempItemArray[4] = " " - - --// adds the entries to a seperate list - append tempArray (boneStruct active:tempItemArray[1] name:tempItemArray[2] external:tempItemArray[3] bones:tempItemArray[4]) - ) - - --// sets ini setting - cryTools.cryAnim.base.iniFile #set #bones value:tempArray - --// sets new bone list - cryTools.cryAnim.UI.batchProcess._v.boneList = tempArray - - --// updates whole dialog - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - - --// kills bone list edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.editBoneList - - - ) - - on btnDelete pressed do - ( - --// goes through the bone list - for i = 1 to lbList.ListItems.count do - ( - --// tries to delete the selected entry - try - ( - if lbList.ListItems[i].selected == true then - lbList.ListItems.Remove i - ) - catch() - ) - ) - - on btnDeleteAll pressed do - ( - --// clears whole list - lbList.ListItems.clear() - ) - - - on btnCancel pressed do - ( - --// kills bone list edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.editBoneList - ) - ) - cryTools.cryAnim.UI.batchProcess.editBoneList = editBoneListRO - editBoneListRO = undefined - - --// creates bone list edit dialog - createDialog cryTools.cryAnim.UI.batchProcess.editBoneList 443 220 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.btnConfig.pressed" ) - ) - ) - logOutput "> Created checkExportRO rollout" - - - --// adds all rollouts to the UI - addRollout fileStatusRO cryTools.cryAnim.UI.batchProcess.dialog - addRollout inputOutputRO cryTools.cryAnim.UI.batchProcess.dialog - addRollout checkExportRO cryTools.cryAnim.UI.batchProcess.dialog - - fileStatusRO = undefined - inputOutputRO = undefined - checkExportRO = undefined - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.callDialog" ) -) -callDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.callDialog function" - - - -logOutput ">> batch8.ms loaded" diff --git a/Tools/maxscript/cryAnim/ui/batch/batch9.ms b/Tools/maxscript/cryAnim/ui/batch/batch9.ms deleted file mode 100644 index feb5f1b1cb..0000000000 --- a/Tools/maxscript/cryAnim/ui/batch/batch9.ms +++ /dev/null @@ -1,1302 +0,0 @@ -------------------------------------------------------------------------------- --- batch9.ms #for 3DSMax v.9+ --- Version 2.4 Internal --- Batch Process for .bip and .fbx with upper body detection for upper body animations used in cryEngine --- By: Mathias Lindner --- eMail: devsupport@crytek.com -------------------------------------------------------------------------------- - - - - ---############################################################################### - --// creates the dialog to customize the scripts ---############################################################################### -cryTools.cryAnim.UI.batchProcess._f.createScriptDialog = function createScriptDialog scriptIndex = -( - try - ( - cryTools.cryAnim.UI.batchProcess._v.customScriptSelected = scriptIndex - - --// rollout with edit option for the script which will be execute before exporting or at the end of check - rollout batchProcessScriptCustomize "Script Customization" - ( - dotNetControl tabControl "System.Windows.Forms.TabControl" pos:[2,4] height:20 - --// script container - dotNetControl edScript "System.Windows.Forms.TextBox" pos:[2,24] height:340 width:392 - --// applies the script to the current scene - button btnPreview "Preview" pos:[6,372] width:50 height:20 toolTip:"Executes the script on the current scene" - --// applies the script to the current scene - button btnClear "Clear" pos:[77,372] width:50 height:20 toolTip:"Clears the script in the edit box" - --// imports other scripts - button btnImport "Import" pos:[150,372] width:50 height:20 toolTip:"Opens a dialog to import .ms script files" - --// saves the script and destroys dialog - button btnCache "Cache" pos:[260,372] width:50 height:20 toolTip:"Stores the custom script in the memory" - --// saves the script and destroys dialog - button btnSaveAs "Save As" pos:[205,372] width:50 height:20 toolTip:"Saves the custom script in the edit box into a specific file" - --// destroys dialog without saving - button btnCancel "Cancel" pos:[345,372] width:50 height:20 toolTip:"Aborts the custom script generation" - - - - on batchProcessScriptCustomize open do - ( - tabControl.TabPages.Add "Script 1 " - tabControl.TabPages.Add "Script 2 " - tabControl.TabPages.Add "Script 3 " - tabControl.TabPages.Add "Script 4 " - - - edScript.Multiline = true - edScript.ScrollBars = edScript.Scrollbars.Both - edScript.WordWrap = false - edScript.AcceptsReturn = true - edScript.AcceptsTab = true - - - for i = 1 to 4 do - ( - if classOf cryTools.cryAnim.UI.batchProcess._v.customScripts[i] == String then - cryTools.cryAnim.UI.batchProcess._v.customScriptsSave[i] = cryTools.cryAnim.UI.batchProcess._v.customScripts[i] - else - cryTools.cryAnim.UI.batchProcess._v.customScriptsSave[i] = "" - ) - - --local scriptListIndex = filterString dialogTitle " " - --try scriptListIndex = scriptListIndex[scriptListIndex.count] as Integer catch() - - tabControl.SelectedIndex = cryTools.cryAnim.UI.batchProcess._v.customScriptSelected - 1 - edScript.text = cryTools.cryAnim.UI.batchProcess._v.customScriptsSave[cryTools.cryAnim.UI.batchProcess._v.customScriptSelected] - - - - --// if there is a defined script already - --if tempVarScript != "" and tempVarScript != undefined then - --// set text of the script container to the already defined script - --edScript.text = tempVarScript - - ) - - - - - on tabControl selected value do - ( - edScript.text = cryTools.cryAnim.UI.batchProcess._v.customScriptsSave[tabControl.SelectedIndex + 1] - ) - - - on edScript TextChanged value do - ( - - cryTools.cryAnim.UI.batchProcess._v.customScriptsSave[tabControl.SelectedIndex + 1] = edScript.text - ) - - - - - on btnPreview pressed do - ( - try - ( - --// tries executing the script - execute( edScript.text ) - ) - catch - ( - --// if an error occured, print the error message - format "*** % ***\n" (getCurrentException()) - ) - ) - - - on btnClear pressed do - ( - edScript.text = "" - ) - - - on btnImport pressed do - ( - ret = "\r\n" - local tempVar = getOpenFileName caption:"First Script Import" filename:(getDir #scripts + "\\*.ms") types:"Script Files (*.ms)|*.ms" - if tempVar != undefined then - ( - cryTools.cryAnim.UI.batchProcess.customizeScript.edScript.text += ret + ret + ret +" -- Imported from " + tempVar + ret + ret - - local tempStream = openFile tempVar mode:"r" - while (eof tempStream) != true do - cryTools.cryAnim.UI.batchProcess.customizeScript.edScript.text += readLine tempStream + ret - - close tempStream - ) - ) - - - - - on btnCache pressed do - ( - --local scriptListIndex = filterString cryTools.cryAnim.UI.batchProcess.customizeScript.title " " - --try scriptListIndex = scriptListIndex[scriptListIndex.count] as Integer catch() - - - for i = 1 to 4 do - cryTools.cryAnim.UI.batchProcess._v.customScripts[i] = cryTools.cryAnim.UI.batchProcess._v.customScriptsSave[i] - --cryTools.cryAnim.UI.batchProcess._v.customScripts[scriptListIndex] = edScript.text - - - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists scriptUpdate:(cryTools.cryAnim.UI.batchProcess._v.customScriptSelected as String) - - --// destroys the dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.customizeScript - ) - - - on btnSaveAs pressed do - ( - local tempString = "" - - case cryTools.cryAnim.UI.batchProcess.customizeScript.title of - ( - "First Script Customization": tempString = "First" - "Second Script Customization": tempString = "Second" - ) - - local tempVar = getSaveFileName caption:"First Script Import" filename:(cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\batch\\" + tempString + "Script\\*.ms") types:"Script Files (*.ms)|*.ms" - if tempVar != undefined then - ( - local tempStream = openFile tempVar mode:"w" - format edScript.text to:tempStream - close tempStream - - local tempFilter = filterString tempVar "\\" - local tempString = (filterString tempFilter[tempFilter.count] ".")[1] - - case cryTools.cryAnim.UI.batchProcess.customizeScript.title of - ( - "First Script Customization": tempVar = "First|" + tempString - "Second Script Customization": tempVar = "Second|" + tempString - ) - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists scriptUpdate:tempVar - destroyDialog cryTools.cryAnim.UI.batchProcess.customizeScript - ) - - ) - - - on btnCancel pressed do - ( - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists scriptUpdate:"None" - --// destroys the dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.customizeScript - ) - ) - --// creates the dialog - cryTools.cryAnim.UI.batchProcess.customizeScript = batchProcessScriptCustomize - batchProcessScriptCustomize = undefined - - createDialog cryTools.cryAnim.UI.batchProcess.customizeScript 400 400 - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.createScriptDialog" ) -) -createScriptDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.createScriptDialog function" - - - - - - - ---############################################################################### - --// creates the batchProcess dialog ---############################################################################### -cryTools.cryAnim.UI.batchProcess._f.callDialog = function callDialog = -( - try - ( - --// if batchProcess is already opened, close the rollout floater - try ( closeRolloutFloater cryTools.cryAnim.UI.batchProcess.dialog ) catch() - --// create new batchProcess rollout floater - cryTools.cryAnim.UI.batchProcess.dialog = newRolloutFloater "Batch Process" 600 469 - - - --// rollout with file and folder list - rollout fileStatusRO "File Status" height:200 - ( - --// files list - dotNetControl lbFiles "System.Windows.Forms.ListView" pos:[140,8] height:185 width:440 - --// sub folders list - dotNetControl lbSubFolders "System.Windows.Forms.TreeView" pos:[8,8] height:185 width:130 - - - - on fileStatusRO open do - ( - try - ( - --// initialise - lbFiles.GridLines = true - lbFiles.AllowColumnReorder = true - lbFiles.View = lbFiles.View.Details - lbFiles.LabelEdit = false - lbFiles.LabelWrap = true - lbFiles.MultiSelect = true - lbFiles.FullRowSelect = true - lbFiles.HideSelection = false - - --// subFolders setu - lbSubFolders.Sorted = true - lbSubFolders.Checkboxes = true - lbSubFolders.Indent = 20 - lbSubFolders.ShowPlusMinus = true - lbSubFolders.ShowRootLines = true - lbSubFolders.HideSelection = false - - - --// adds columns - lbFiles.Columns.Add "Filename" - lbFiles.Columns.Add "Bone" - lbFiles.Columns.Add "Process" - lbFiles.Columns.Add "Ext" - lbFiles.Columns.Add ".anm" - - - cryTools.cryAnim.UI.batchProcess._v.selectedFile = undefined - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.open" ) - ) - - - on fileStatusRO moved value do - ( - try - setDialogPos cryTools.cryAnim.UI.batchProcess.subRangeDialog (cryTools.cryAnim.UI.batchProcess.dialog.pos - [205,-23]) - catch() - ) - - - on fileStatusRO close do - ( - try ( destroyDialog cryTools.cryAnim.UI.batchProcess.subRangeDialog ) catch() - ) - - - - - on lbFiles Click do - ( - try - ( - local tempItem = lbFiles.FocusedItem - if (tempItem.SubItems.item 3).text == "folder" then - tempItem.selected = false - - cryTools.cryAnim.UI.batchProcess._v.selectedFile = tempItem.index + 1 - - --// update the files counter - cryTools.cryAnim.UI.batchProcess._f.updateCounter() - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.lbFiles.click" ) - ) - - - - on lbFiles DoubleClick do - ( - try - ( - local tempItem = lbFiles.FocusedItem - - --// if an item is selected - if tempItem != undefined then - ( - if (tempItem.SubItems.item 3).text != "scene" then - ( - --// if a folder is selected - if (tempItem.SubItems.item 3).text == "folder" then - ( - - --// deselect the folder - tempItem.selected = false - - --// go through the files list and select every on-coming entry (without folders) until another folder is reached - for i = (tempItem.index + 1) to (lbFiles.Items.count - 1) do - ( - try - ( - if ((lbFiles.Items.item i).SubItems.item 3).text != "folder" and ((lbFiles.Items.item i).SubItems.item 3).text != "scene" then - (lbFiles.Items.item i).selected = true - else - exit - ) - catch() - ) - ) - --// if no folder is selected - else - ( - --// go through the list and select every entry without folders - for i = 0 to (lbFiles.Items.count - 1) do - if ((lbFiles.Items.item i).SubItems.item 3).text != "folder" and ((lbFiles.Items.item i).SubItems.item 3).text != "scene" then - (lbFiles.Items.item i).selected = true - ) - ) - - cryTools.cryAnim.UI.batchProcess._v.selectedFile = tempItem.index + 1 - ) - - --// update the files counter - cryTools.cryAnim.UI.batchProcess._f.updateCounter() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.lbFiles.doubleClick" ) - ) - - - - - on lbSubFolders AfterCheck arg do - ( - try - ( - if arg.Node.Checked == true then - arg.Node.ForeColor = arg.Node.ForeColor.FromArgb 200 0 0 - else - arg.Node.ForeColor = arg.Node.ForeColor.FromArgb 0 0 0 - - - if cryTools.cryAnim._v.various[120] != true then - ( - --// if a state changes in the sub folders list, update the whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection #set - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.fileStatusRO.lbSubFolders.afterCheck" ) - ) - ) - logOutput "> Created fileStatusRO rollout" - - - - - - - - - - - - - - --// rollout with paths, file mask and pre export script - rollout inputOutputRO "Input / Output" height:50 - ( - --// source folder - button btnSourceFolder "Source" pos:[8,5] width:60 height:20 toolTip:"Opens a dialog to choose the source folder" - label labSourceFolder "No Folder selected" pos:[80,7] width:300 - --// output folder - button btnExportFolder "Export" pos:[8,27] width:60 height:20 toolTip:"Opens a dialog to choose the export folder" - label labExportFolder "No Folder selected" pos:[80,29] width:300 - - --// file mask - label labFileMask "File Mask" pos:[16,52] - edittext etFileMask "" text:"" pos:[75,50] fieldWidth:300 - - groupbox gbScripts " Process Templates " pos:[400,5] width:180 height:113 - - label labOp1 "1." pos:[408,28] - dropdownlist ddOp1 "" pos:[425,24] width:150 height:20 - - label labOp2 "2." pos:[408,50] - dropdownlist ddOp2 "" pos:[425,46] width:150 height:20 - - label labOp3 "3." pos:[408,72] - dropdownlist ddOp3 "" pos:[425,68] width:150 height:20 - - label labOp4 "4." pos:[408,94] - dropdownlist ddOp4 "" pos:[425,90] width:150 height:20 - - - groupbox gbANMDialog " File Settings " pos:[12,78] width:368 height:40 - - label labFileSettings "ANM Files: " pos:[90,97] - - button btnLoadFile "Load" pos:[20,93] width:50 height:20 - button btnImportANM "Import" pos:[150,93] width:50 height:20 - checkbutton btnDialogANM "Dialog" pos:[210,93] width:50 height:20 - button btnDeleteANM "Delete" pos:[270,93] width:50 height:20 - button btnDeleteAllANM "Delete All" pos:[325,93] width:50 height:20 - - - - on inputOutputRO open do - ( - try - ( - --// if a source path is already set - if cryTools.cryAnim.UI.batchProcess._v.sourcePath != undefined then - --// set text to the old source path - labSourceFolder.text = cryTools.cryAnim.UI.batchProcess._v.sourcePath - - --// if the ini setting for the file extension is found - if (local tempText = cryTools.cryAnim.base.iniFile #get #batchProcessExt) != "" then - --// set file mask to the ini setting - etFileMask.text = tempText - - --// if the ini setting for the source path is found - if (tempText = cryTools.cryAnim.base.iniFile #get #batchProcessSourcePath) != "" then - ( - --// set source string to the ini setting - labSourceFolder.text = tempText - cryTools.cryAnim.UI.batchProcess._v.sourcePath = tempText - ) - else - --// otherwise to the default string - labSourceFolder.text = "No Source Folder selected" - - --// if the ini setting for the export path is found - if (tempText = cryTools.cryAnim.base.iniFile #get #batchProcessExportPath) != "" then - ( - --// set export string to the ini setting - labexportFolder.text = tempText - cryTools.cryAnim.UI.batchProcess._v.exportPath = tempText - ) - else - --// otherwise to the default string - labexportFolder.text = "No Export Folder selected" - - --// updates the first and second scripts from the folders - cryTools.cryAnim.UI.batchProcess._f.updateScriptLists() - - - --// fills the sub folders list - cryTools.cryAnim.UI.batchProcess._f.updateSubFolders() - cryTools.cryAnim.UI.batchProcess._f.updateSubFolderSelection #get - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.open" ) - ) - - - - on btnSourceFolder pressed do - ( - try - ( - local tempPath = "" - --// if a source path is defined - if cryTools.cryAnim.UI.batchProcess._v.sourcePath != undefined then - --// set temporary path to the source path - tempPath = cryTools.cryAnim.UI.batchProcess._v.sourcePath - else - --// otherwise get new directory from an input dialog - tempPath = (cryTools.cryAnim.base.perforce cryTools.cryAnim.UI.main._v.bipSavePath #getDirectory) - - --// temporary string gets open directory input for source path - tempString = (getSavePath caption:"Select Source Folder" initialDir:tempPath) - - --// if a folder is selected by the open directory - if tempString != undefined then - ( - --// source path is the new folder with "\" - cryTools.cryAnim.UI.batchProcess._v.sourcePath = tempString + (if (filterString tempString "\\").count > 1 then "\\" else "") - --// updates the export path with the converted path to the project directory - cryTools.cryAnim.UI.batchProcess._v.exportPath = (cryTools.cryAnim.base.perforce (cryTools.cryAnim.UI.main._f.checkExport #ProductionToGame cryTools.cryAnim.UI.batchProcess._v.sourcePath) #getDirectory) - - --// update export folder text - labExportFolder.text = cryTools.cryAnim.UI.batchProcess._v.exportPath - --// update source folder text - labSourceFolder.text = cryTools.cryAnim.UI.batchProcess._v.sourcePath - - --// set ini setting for the source path - cryTools.cryAnim.base.iniFile #set #batchProcessSourcePath value:labSourceFolder.text - cryTools.cryAnim.base.iniFile #set #batchProcessExportPath value:labExportFolder.text - - if (findString labSourceFolder.text "\\") != undefined then - ( - --// clears and fills sub folders - cryTools.cryAnim.UI.batchProcess._f.updateSubFolders() - (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbSubFolders.Nodes.item 0).checked = true - --// clears and fills the file list - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - ) - ) - --// if no folder is selected - else - ( - --// if no export path is set before - if cryTools.cryAnim.UI.batchProcess._v.sourcepath == undefined then - ( - --// enable statistic button as it can be used without exporting - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].btnProcess.enabled = true - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnSourceFolder.pressed" ) - ) - - - on btnExportFolder pressed do - ( - try - ( - --// temporary string gets open directory input for export path - tempString = (getSavePath caption:"Select Export Folder" initialDir:cryTools.cryAnim.UI.batchProcess._v.exportPath) - --// if a folder is selected by the open directory - if tempString != undefined then - ( - --// set export path to the new folder path - cryTools.cryAnim.UI.batchProcess._v.exportPath = tempString + "\\" - --// update exportFolder text - labExportFolder.text = tempString + "\\" - - --// set ini setting for the export path - cryTools.cryAnim.base.iniFile #set #batchProcessExportPath value:labExportFolder.text - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnExportFolder.pressed" ) - ) - - - on ddOp1 selected value do - ( - try - ( - if ddOp1.selection == ddOp1.items.count then - cryTools.cryAnim.UI.batchProcess._f.createScriptDialog 1 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.ddOp1.selected" ) - ) - - - on ddOp2 selected value do - ( - try - ( - if ddOp2.selection == ddOp2.items.count then - cryTools.cryAnim.UI.batchProcess._f.createScriptDialog 2 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.ddOp2.selected" ) - ) - - - on ddOp3 selected value do - ( - try - ( - if ddOp3.selection == ddOp3.items.count then - cryTools.cryAnim.UI.batchProcess._f.createScriptDialog 3 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.ddOp3.selected" ) - ) - - - on ddOp4 selected value do - ( - try - ( - if ddOp4.selection == ddOp4.items.count then - cryTools.cryAnim.UI.batchProcess._f.createScriptDialog 4 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.ddOp4.selected" ) - ) - - - on etFileMask entered value do - ( - try - ( - --// set ini setting with changed file mask - cryTools.cryAnim.base.iniFile #set #batchProcessExt value:etFileMask.text - --// update whole dialog with new changes - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.etFileMask.entered" ) - ) - - - - - on btnLoadFile pressed do - ( - try - ( - local index = cryTools.cryAnim.UI.batchProcess._v.selectedFile - if index != undefined then - ( - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[index].used == true then - ( - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[index].extension != "scene" then - ( - cryTools.cryAnim.UI.batchProcess._v.fileQue = cryTools.cryAnim.UI.batchProcess._v.exportFiles[index].path - local tempString = cryTools.cryAnim.UI.batchProcess._f.loadBatchFile cryTools.cryAnim.UI.batchProcess._v.exportFiles[index].path - if tempString == true then - tempString = "Load" - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[index].process = tempString as String - - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - ( - if i != index then - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process == "Load" then - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].process = "" - ) - - - - cryTools.cryAnim.UI.batchProcess._v.selectedFile = 1 - - - for i = 0 to (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbFiles.items.count - 1) do - (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbFiles.items.item i).selected = false - - - (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbFiles.items.item 0).selected = true - (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbFiles.items.item 0).focused = true - - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[1].subRanges = #() - cryTools.cryAnim.UI.batchProcess._v.exportFiles[1].subRangePrefix = "" - - - if (cryTools.cryAnim.UI.batchProcess._f.subRangeLoadFromDummy import:true) == true then - ( - cryTools.cryAnim.UI.batchProcess._v.exportFiles[1].anm = "Load" - - try - ( - if cryTools.cryAnim.UI.batchProcess.subRangeDialog.open == false then - cryTools.cryAnim.UI.batchProcess._f.subRangeCallDialog() - ) - catch - cryTools.cryAnim.UI.batchProcess._f.subRangeCallDialog() - - btnDialogANM.state = true - ) - else - cryTools.cryAnim.UI.batchProcess._v.exportFiles[1].anm = "" - - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog() - cryTools.cryAnim.UI.batchProcess._f.refreshFiles() - - cryTools.cryAnim.UI.batchProcess._v.fileQue = undefined - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnLoadFile.pressed" ) - ) - - - - - on btnImportANM pressed do - ( - try - ( - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - ( - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].used == true and cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension != "folder" and (cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension == "max" or cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension == "scene") then - ( - - local rangeDummy = undefined - - cryTools.cryAnim.UI.batchProcess._v.selectedFile = i - - - - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].extension != "scene" then - ( - if (rangeDummy = getNodeByName "subRangeDummy") != undefined then - rangeDummy.name = "#SAVE_" + rangeDummy.name - else - noDummyFound = true - - mergeMaxFile cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].path #("subRangeDummy") #mergeDups - ) - - - - - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].subRanges = #() - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].subRangePrefix = "" - - if (cryTools.cryAnim.UI.batchProcess._f.subRangeLoadFromDummy import:true) == true then - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm = "Load" - else - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm = "" - - - - - if rangeDummy != undefined then - ( - try (delete (getNodeByName "subRangeDummy") ) catch() - rangeDummy.name = subString rangeDummy.name 7 rangeDummy.name.count - ) - - if noDummyFound == true then - try (delete (getNodeByName "subRangeDummy") ) catch() - ) - ) - - - - - - try - ( - if cryTools.cryAnim.UI.batchProcess.subRangeDialog.open == false then - cryTools.cryAnim.UI.batchProcess._f.subRangeCallDialog() - ) - catch - cryTools.cryAnim.UI.batchProcess._f.subRangeCallDialog() - - - - - - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog() - cryTools.cryAnim.UI.batchProcess._f.refreshFiles() - - btnDialogANM.state = true - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnImportANM.pressed" ) - ) - - - - on btnDialogANM changed value do - ( - try - ( - try - ( - if cryTools.cryAnim.UI.batchProcess.subRangeDialog.open == false then - ( - cryTools.cryAnim.UI.batchProcess._f.subRangeCallDialog() - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog() - btnDialogANM.state = true - ) - else - ( - destroyDialog cryTools.cryAnim.UI.batchProcess.subRangeDialog - btnDialogANM.state = false - ) - ) - catch - cryTools.cryAnim.UI.batchProcess._f.subRangeCallDialog() - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnDialogANM.pressed" ) - ) - - - - - on btnDeleteANM pressed do - ( - try - ( - local selectedFile = cryTools.cryAnim.UI.batchProcess._v.selectedFile - - if (queryBox "Delete selected .anm entries ?" title:"CryAnim Batch Process") == true then - ( - - if selectedFile == undefined then - ( - messageBox "Nothing selected." title:"CryAnim Batch Process" - return false - ) - - - - - - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - ( - if cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].used == true then - ( - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].subRanges = #() - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].subRangePrefix = "" - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm = "" - ) - ) - - cryTools.cryAnim.UI.batchProcess._f.refreshFiles() - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog() - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnDeleteANM.pressed" ) - ) - - - - - on btnDeleteAllANM pressed do - ( - try - ( - local selectedFile = cryTools.cryAnim.UI.batchProcess._v.selectedFile - - if (queryBox "Delete All .anm entries ?" title:"CryAnim Batch Process") == true then - ( - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.exportFiles.count do - ( - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].subRanges = #() - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].subRangePrefix = "" - cryTools.cryAnim.UI.batchProcess._v.exportFiles[i].anm = "" - ) - - cryTools.cryAnim.UI.batchProcess._f.refreshFiles() - cryTools.cryAnim.UI.batchProcess._f.subRangeUpdateDialog() - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.inputOutputRO.btnDeleteAllANM.pressed" ) - ) - - - - - ) - logOutput "> Created inputOutputRO rollout" - - - - - - - - - - --// rollout with all config options and check or export button - rollout checkExportRO "Check / Export" height:60 - ( - --// files / folders groub - label labFilesFolders "Files / Folders :" pos:[10,11] - groupBox gbFilesFolders "" pos:[100,-1] height:32 width:230 - - --// keep the sub folder structure when exporting - label labKeepSubFolders "Keep Sub Folders" pos:[210,11] - checkBox chkKeepSubFolders "" pos:[300,11] checked:true - - --// counter for selected and maximumm files - label labCount "Count :" pos:[130,11] - - --// bone detection for exporting specific body parts for specific file string parts - label labBoneDetection "Bone Detection :" pos:[10,42] - groupBox gbBoneDetection "" pos:[100,30] height:32 width:230 - - --// config bone detection, manage sets of bone detections - button btnConfig "Config" pos:[110,41] height:17 width:70 toolTip:"Opens a dialog to configure filename/bone detection" - --// activate automatic file detection - label labDetect "Detect" pos:[195,43] - checkBox chkDetect "" pos:[235,42] checked:true - --// only files which are detected will be shown - label labOnlyBoneDetection " + " pos:[255,43] - checkBox chkOnlyBoneDetection "" pos:[270,42] - --// only files which are not detected will be shown - label labNoBoneDetection " - " pos:[290,43] - checkBox chkNoBoneDetection "" pos:[300,42] - - --// executes the whole export process with pre export script, but without real exporting - button btnProcess "P R O C E S S" pos:[345,8] height:50 width:230 enabled:false toolTip:"Processes the files/selection in the list (executes scripts)" - - - - - on checkExportRO open do - ( - try - ( - --// clears the file list - cryTools.cryAnim.UI.batchProcess._v.exportFiles = #() - - try - ( - local tempSubFilter = cryTools.cryAnim.base.iniFile #get #batchProcessSubFolderSelection - tempSubFilter = filterString tempSubFilter "#" - - if tempSubFilter.count == 0 then - (cryTools.cryAnim.UI.batchProcess.dialog.rollouts[1].lbSubFolders.Nodes.item 0).checked = true - - ) catch() - - try cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkKeepSubFolders.checked = cryTools.cryAnim.base.iniFile #get #batchProcessSubFolders catch() - - --// if a source path is internal defined - if cryTools.cryAnim.UI.batchProcess._v.sourcePath != undefined then - ( - --// enable check and export button - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].btnProcess.enabled = true - ) - - --// get bone detection set up - local tempBoneArray = cryTools.cryAnim.base.iniFile #get #bones - --// if a bone setup is found - if tempBoneArray != undefined then - ( - tempListArray = #() - --// goes through the bone list - for i = 1 to tempBoneArray.count do - --// if an entry is found - if tempBoneArray[i].name != "" then - --// add the entry to the list - append tempListArray tempBoneArray[i] - - --// set new bone list - cryTools.cryAnim.UI.batchProcess._v.boneList = tempBoneArray - ) - - --// update whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.open" ) - ) - - - - - on chkKeepSubFolders changed value do - ( - try - cryTools.cryAnim.base.iniFile #set #batchProcessSubFolders value:value - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.chkKeepSubFolder.changed" ) - ) - - - on btnProcess pressed do - ( - try - --// process all used files without export - cryTools.cryAnim.UI.batchProcess._f.processFiles #statistic - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.btnProcess.pressed" ) - ) - - - on chkOnlyBoneDetection changed value do - ( - try - ( - --// if only bone detection is activated - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkOnlyBoneDetection.checked == true then - --// no bone detection is deactivated - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkNoBoneDetection.checked = false - - --// updates whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - cryTools.cryAnim.UI.batchProcess._v.flags[1] = false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.chkOnlyBoneDetection.changed" ) - ) - - - on chkNoBoneDetection changed value do - ( - try - ( - --// if no bone detection is activated - if cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkNoBoneDetection.checked == true then - --// only bone detections is deactivated - cryTools.cryAnim.UI.batchProcess.dialog.rollouts[3].chkOnlyBoneDetection.checked = false - - --// updates whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - cryTools.cryAnim.UI.batchProcess._v.flags[1] = false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.chkNoBoneDetection.changed" ) - ) - - on btnConfig pressed do - ( - try - ( - --// rollout to edit the bone list entry - rollout entryDetailsRO "Entry Details" - ( - label labName "Name :" pos:[8,10] - label labExternal "External :" pos:[8,30] - label labBones "Bones :" pos:[8,50] - - --// sets the name, file detection and bones column - edittext edName "" text:(cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem.SubItems.item 0).text pos:[70,10] fieldWidth:300 - edittext edExternal "" text:(cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem.SubItems.item 1).text pos:[70,30] fieldWidth:300 - edittext edBones "" text:(cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem.SubItems.item 2).text pos:[70,50] fieldWidth:245 - --// button to pick specific bones in the scene - button btnPickBones "Pick" pos:[323,50] height:17 width:50 toolTip:"Opens dialog to select the bone associated to the filename detection" - - --// save the entry or cancel - button btnSave "Save" pos:[100,80] height:20 width:80 toolTip:"Saves filename/bone detection" - button btnCancel "Cancel" pos:[200,80] height:20 width:80 toolTip:"Aborts filename/bone detection" - - - on btnSave pressed do - ( - --// get currently selected item - local tempItem = cryTools.cryAnim.UI.batchProcess.editBoneList.lbList.FocusedItem - - --// set new name - (tempItem.SubItems.item 0).text = edName.text - --// set new file detection - (tempItem.SubItems.item 1).text = edExternal.text - --// set new bone list - (tempItem.SubItems.item 2).text = edBones.text - - local tempListArray = #() - - cryTools.cryAnim.UI.batchProcess._f.updateExtent() - --// kills bone edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.entryDetails - ) - - - on btnCancel pressed do - ( - --// kills bone edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.entryDetails - ) - - on btnPickBones pressed do - ( - local tempString = "" - --// pick node from the scene - objArray = selectByName title:("Select Nodes") showHidden:true - - --// if a node is selected - if objArray != undefined then - ( - --// goes through the nodes - for i = 1 to objArray.count do - --// adds the name of the node with a ";" as seperator - tempString += objArray[i].name + (if i != objArray.count then ";" else "") - - --// set the new bone list - edBones.text = tempString - ) - - ) - - ) - cryTools.cryAnim.UI.batchProcess.entryDetails = entryDetailsRO - entryDetailsRO = undefined - - - - - --// rollout to edit the bone detection list - rollout editBoneListRO "Edit Bone List" - ( - --// list of all bone setups - --activeXControl lbList "MSComctlLib.ListViewCtrl" pos:[1,1] height:185 width:440 - dotNetControl lbList "System.Windows.Forms.ListView" pos:[1,1] height:185 width:440 - --// save current setup - button btnSave "Save" pos:[8,195] height:20 width:80 toolTip:"Saves filename/bone detection" - button btnAdd "Add" pos:[120,195] height:20 width:60 toolTip:"Adds new entry" - button btnDelete "Delete" pos:[190,195] height:20 width:60 toolTip:"Deletes selected entry" - button btnDeleteAll "Delete All" pos:[260,195] height:20 width:60 toolTip:"Clears whole list" - button btnCancel "Cancel" pos:[350,195] height:20 width:80 toolTip:"Abort filename/bone detection" - - - on editBoneListRO open do - ( - lbList.GridLines = true - lbList.AllowColumnReorder = true - lbList.View = lbList.View.Details - lbList.LabelEdit = false - lbList.LabelWrap = true - lbList.MultiSelect = true - lbList.FullRowSelect = true - lbList.HideSelection = false - lbList.CheckBoxes = true - --// adds columns - lbList.Columns.Add "Name" - lbList.Columns.Add "External" - lbList.Columns.Add "Bones" - - --// goes through the bone list - for i = 1 to cryTools.cryAnim.UI.batchProcess._v.boneList.count do - ( - --// adds a new entry - local lbListEntry = lbList.Items.Add cryTools.cryAnim.UI.batchProcess._v.boneList[i].name cryTools.cryAnim.UI.batchProcess._v.boneList[i].name - - --// if entry is active - if cryTools.cryAnim.UI.batchProcess._v.boneList[i].active == "true" then - --// set list entry active - lbListEntry.checked = true - --// if entry is not active - if cryTools.cryAnim.UI.batchProcess._v.boneList[i].active == "false" then - --// set list entry not active - lbListEntry.checked = false - - --// add external entry - lbListEntry.SubItems.Add cryTools.cryAnim.UI.batchProcess._v.boneList[i].external - --// add bone entry - lbListEntry.SubItems.Add cryTools.cryAnim.UI.batchProcess._v.boneList[i].bones - ) - - cryTools.cryAnim.UI.batchProcess._f.updateExtent() - ) - - - - on lbList DoubleClick do - ( - tempItem = lbList.FocusedItem - tempItem.checked = not tempItem.checked - --// if an item is selected - if tempItem != undefined then - ( - --// creates bone entry edit - createDialog cryTools.cryAnim.UI.batchProcess.entryDetails 385 110 - - ) - --// if no item is selected - ) - - on btnAdd pressed do - ( - local tempStringArray = (boneStruct name:"" external:"" bones:"") - local tempArray = #() - local lbList = cryTools.cryAnim.UI.batchProcess.editBoneList.lbList - - --// get nodes to be added - local objArray = selectByName title:("Select Nodes to be added") showHidden:true - - --// if a node is selected - if objArray != undefined then - ( - --// goes through node list - for obj in objArray do - --// add the nodes via boneStruct to a seperate list - append tempArray (boneStruct name:obj.name external:obj.name bones:obj.name) - - --// goes through the node list - for i = 1 to tempArray.count do - ( - --// adds name(s) of the node(s) - tempStringArray.name += tempArray[i].name + (if i != tempArray.count then ";" else "") - --// adds file detection(s) - tempStringArray.external += tempArray[i].external + (if i != tempArray.count then ";" else "") - --// adds bone(s) list - tempStringArray.bones += tempArray[i].bones + (if i != tempArray.count then ";" else "") - ) - - --// adds entry to the bone list - local lbListEntry = lbList.Items.Add tempStringArray.name - lbListEntry.checked = true - lbListEntry.SubItems.Add tempStringArray.external - lbListEntry.SubItems.Add tempStringArray.bones - ) - ) - - - on btnSave pressed do - ( - local boneChanged = false - local tempArray = #() - local tempList = #() - local lbList = cryTools.cryAnim.UI.batchProcess.editBoneList.lbList - - --// goes through the bone list - for i = 0 to (lbList.Items.count - 1) do - ( - local tempItemArray = #() - local tempItem = lbList.Items.item i - - --// save checked state - tempItemArray[1] = tempItem.checked as String - --// if nothing is typed in, the entry will have " " to filter correctly - if (tempItem.SubItems.item 0).text != "" then tempItemArray[2] = (tempItem.SubItems.item 0).text else tempItemArray[2] = " " - if (tempItem.SubItems.item 1).text != "" then tempItemArray[3] = (tempItem.SubItems.item 1).text else tempItemArray[3] = " " - if (tempItem.SubItems.item 2).text != "" then tempItemArray[4] = (tempItem.SubItems.item 2).text else tempItemArray[4] = " " - - --// adds the entries to a seperate list - append tempArray (boneStruct active:tempItemArray[1] name:tempItemArray[2] external:tempItemArray[3] bones:tempItemArray[4]) - ) - - for i = 1 to tempArray.count do - ( - try - ( - if tempArray[i] != cryTools.cryAnim.UI.batchProcess._v.boneList[i] then - boneChanged = true - )catch() - ) - - --// sets ini setting - cryTools.cryAnim.base.iniFile #set #bones value:tempArray - --// sets new bone list - cryTools.cryAnim.UI.batchProcess._v.boneList = tempArray - - --// updates whole dialog - cryTools.cryAnim.UI.batchProcess._v.flags[1] = true - cryTools.cryAnim.UI.batchProcess._f.updateDialog() - cryTools.cryAnim.UI.batchProcess._v.flags[1] = false - - --// kills bone list edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.editBoneList - - - ) - - on btnDelete pressed do - ( - local lbList = cryTools.cryAnim.UI.batchProcess.editBoneList.lbList - - if lbList.FocusedItem != undefined then - lbList.FocusedItem.remove() - ) - - on btnDeleteAll pressed do - ( - local lbList = cryTools.cryAnim.UI.batchProcess.editBoneList.lbList - --// clears whole list - lbList.Items.clear() - ) - - - on btnCancel pressed do - ( - --// kills bone list edit dialog - destroyDialog cryTools.cryAnim.UI.batchProcess.editBoneList - ) - ) - cryTools.cryAnim.UI.batchProcess.editBoneList = editBoneListRO - editBoneListRO = undefined - - --// creates bone list edit dialog - createDialog cryTools.cryAnim.UI.batchProcess.editBoneList 443 220 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess.dialog.checkExportRO.btnConfig.pressed" ) - ) - ) - logOutput "> Created checkExportRO rollout" - - - --// adds all rollouts to the UI - addRollout fileStatusRO cryTools.cryAnim.UI.batchProcess.dialog - addRollout inputOutputRO cryTools.cryAnim.UI.batchProcess.dialog - addRollout checkExportRO cryTools.cryAnim.UI.batchProcess.dialog - - fileStatusRO = undefined - inputOutputRO = undefined - checkExportRO = undefined - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.batchProcess._f.callDialog" ) -) -callDialog = undefined -logOutput "> Created cryTools.cryAnim.UI.batchProcess._f.callDialog function" - - - -logOutput ">> batch9.ms loaded" diff --git a/Tools/maxscript/cryAnim/ui/main/locator.ms b/Tools/maxscript/cryAnim/ui/main/locator.ms deleted file mode 100644 index 564e22a290..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/locator.ms +++ /dev/null @@ -1,230 +0,0 @@ ---############################################################################### - --// rollout with elements to control the locator ---############################################################################### -rollout locatorRO "Locator" -( - button btnCreate "Create" pos:[8,8] width:70 height:20 toolTip:"Creates Locator_Locomotion biped prop" - button btnDelete "Delete" pos:[80,8] width:70 height:20 toolTip:"Deletes Locator_Locomotion" - button btnAutoLoc "Auto-Locator" pos:[8,35] width:142 height:20 toolTip:"Animates the Locator_Locomotion contextual of the animation" - button btnResetLocator "Reset Locator" pos:[8,55] width:142 height:20 toolTip:"Resets Locator_Locomotion to the origin facing in the direction the character faces" - button btnSetToBodyMass "Move to Body Mass" pos:[8,75] width:142 height:20 toolTip:"Moves the Locator_Locomotion to the calculated body mass of Bip01" - - - - on locatorRO open do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then - (cryTools.cryAnim.UI.main._f.getUI "Locator" "").open = cryTools.cryAnim.base.iniFile #get #locatorRO - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.locatorRO.open" ) - ) - - - on locatorRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #locatorRO) != value then - cryTools.cryAnim.base.iniFile #set #locatorRO - - local lolStream = createFile "C:\\Yeah.txt" - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.locatorRO.rolledUp" ) - ) - - - - - on btnCreate pressed do - ( - try - ( - if $Bip01 != undefined then - ( - if queryBox "Create Locator_Locomotion?" title:"Locator_Locomotion" == true then - ( - undo "create Locator_Locomotion" on - ( - try - ( - local locVertArray = #([-2.60474,5.627,0], [-2.60474,5.627,5.306], [-2.60501,-5.627,5.306], [-2.60501,-5.627,2.40557e-006], [2.60475,5.627,0], [2.60475,5.627,5.306], [2.60499,-5.627,5.306], [2.605,-5.627,1.88326e-007], [-5.71044,-5.62699,5.306], [-5.71044,-5.62699,3.72612e-006], [5.71043,-5.62701,-1.24204e-006], [5.71043,-5.62701,5.306], [-9.4768e-006,-11.63,-1.24204e-006], [-9.48043e-006,-11.63,5.306]) - $Bip01.controller.figureMode = true - $Bip01.controller.prop1Exists = false - - tempSaveRot = $Bip01.transform.rotation - tempBipRot = $Bip01.transform.rotation as eulerangles - if tempBipRot.z > 0 and tempBipRot.z < 180 then - tempBipRot.z = -90 - - biped.setTransform $Bip01 #rotation tempBipRot false - - $Bip01.controller.prop1Exists = true - - tempSel = biped.getNode $Bip01 20 - tempSel.name = "Locator_Locomotion" - select tempSel - - cryTools.cryAnim._f.resetLocator forceDir:true - - tempPanel = getCommandPanelTaskMode() - setCommandPanelTaskMode #modify - - addModifier tempSel (Edit_Poly()) - - - - - tempBit = #{1..(polyOp.getNumVerts tempSel)} - tempSel.modifiers[1].setSelection 1 tempBit - tempSel.modifiers[1].setOperation #DeleteVertex - tempSel.modifiers[1].commit() - - - for i = 1 to locVertArray.count do - ( - tempSel.modifiers[1].CreateVertex [0,0,0] - ) - tempSel.modifiers[1].commit() - tempSel.modifiers[1].SetEPolySelLevel #Vertex - - for i = 1 to locVertArray.count do - ( - tempSel.modifiers[1].SetSelection #Vertex #{} - tempSel.modifiers[1].Select #Vertex #{i} - tempSel.modifiers[1].Commit() - tempSel.modifiers[1].moveSelection locVertArray[i] - tempSel.modifiers[1].Commit() - - ) - - tempSel.modifiers[1].CreateFace #(6,5,1) - tempSel.modifiers[1].CreateFace #(6,1,2) - tempSel.modifiers[1].CreateFace #(7,6,2) - tempSel.modifiers[1].CreateFace #(2,3,7) - tempSel.modifiers[1].CreateFace #(8,5,6) - tempSel.modifiers[1].CreateFace #(6,7,8) - tempSel.modifiers[1].CreateFace #(1,4,3) - tempSel.modifiers[1].CreateFace #(3,2,1) - tempSel.modifiers[1].CreateFace #(1, 4,5) - tempSel.modifiers[1].CreateFace #(4,5, 8) - tempSel.modifiers[1].CreateFace #(11,8,7) - tempSel.modifiers[1].CreateFace #(7,12,11) - tempSel.modifiers[1].CreateFace #(3,4, 10) - tempSel.modifiers[1].CreateFace #(3, 9,10) - tempSel.modifiers[1].CreateFace #(9,14,12) - tempSel.modifiers[1].CreateFace #(11,12,14) - tempSel.modifiers[1].CreateFace #(14,13,11) - tempSel.modifiers[1].CreateFace #(10,13,14) - tempSel.modifiers[1].CreateFace #(10,14,9) - tempSel.modifiers[1].CreateFace #(10,13,11) - - tempSel.modifiers[1].SetSelection #Vertex #{} - tempSel.modifiers[1].SetEPolySelLevel #Object - - tempSel.wireColor = (color 255 0 0) - - tempSel.modifiers[1].Commit() - - biped.setTransform $Bip01 #rotation tempSaveRot true - - $Bip01.controller.figureMode = false - - setCommandPanelTaskMode tempPanel - - cryTools.cryAnim._f.resetLocator() - - redrawviews() - )catch (print "Error Creating Locator_Locomotion") - ) - ) - ) - else - messageBox "No Biped in Scene." title:"Error Creating Locator_Locomotion" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.locatorRO.btnCreate.pressed" ) - ) - - - on btnDelete pressed do - ( - try - ( - if $Bip01 != undefined then - ( - if queryBox "Delete Locator_Locomotion?" title:"Locator_Locomotion" == true then - ( - undo "delete Locator_Locomotion" on - ( - try - ( - $Bip01.controller.figureMode = true - $Bip01.controller.prop1Exists = false - $Bip01.controller.figureMode = false - ) catch ( print "Error Deleting Locatot_Locomtion" ) - ) - ) - ) - else - messageBox "No Biped in Scene." title:"Error Deleting Locator_Locomotion" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.locatorRO.btnDelete.pressed" ) - ) - - - - on btnResetLocator pressed do - ( - try - ( - if $Locator_Locomotion != undefined then - undo "Reset Locator" on - cryTools.cryAnim._f.resetLocator() - else print "No Locator in Scene." - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.locatorRO.btnResetLocator.pressed" ) - ) - - - on btnAutoLoc pressed do - ( - try - ( - if $Locator_Locomotion != undefined then - undo "Auto Locator" on - try ( fileIn (cryTools.buildPathFull + "Tools\\maxscript\\cryAnim\\ui\\batch\\Scripts\\AutoLoc.ms") ) catch() - else print "No Locator in Scene." - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.locatorRO.btnAutoLoc.pressed" ) - ) - - on btnSetToBodyMass pressed do - ( - try - ( - if $Locator_Locomotion != undefined then - undo "Move to BodyMass" on - try ( cryTools.cryAnim._f.moveToBodyMass() ) catch( print "Can't execute: Move to Body Mass") - else print "No Locator in Scene." - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.locatorRO.btnSetToBodyMass.pressed" ) - ) - -) -logOutput "> Created locatorRO rollout" - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row2 locatorRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 locatorRO -) -catch ( logOutput "!!> Error adding locatorRO to main dialog" ) -locatorRO = undefined - - -logOutput ">> locator.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/models/models8.ms b/Tools/maxscript/cryAnim/ui/main/models/models8.ms deleted file mode 100644 index e2bc27ddfc..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/models/models8.ms +++ /dev/null @@ -1,651 +0,0 @@ ---############################################################################### - --// rollout with elements to control models and items ---############################################################################### -rollout modelsRO "Models" -( - button btnLoadModel "Load Model" pos:[8,8] width:142 height:20 toolTip:"Loads often used models and shows dialog to edit them" - - groupBox gbItems " Items " pos:[2,35] width:153 height:50 - dropDownList ddItemSelect "" pos:[8,55] width:142 height:21 - - - - on modelsRO open do - ( - try - ( - try ( if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Models" "").open = cryTools.cryAnim.base.iniFile #get #modelsRO) catch() - - cryTools.cryAnim.UI.main.models._v.itemList = cryTools.cryAnim.UI.main.models._f.selectItem "" #getList - - local tempListArray = cryTools.cryAnim.UI.main.models._v.itemList - local tempListArray2 = #() - - for i = 1 to tempListArray.count do - tempListArray2[i] = tempListArray[i].name - - - join tempListArray2 #("-------------------------------------------", "Edit Entries") - - ddItemSelect.items = tempListArray2 - - - if (local tempVar = cryTools.cryAnim.UI.main.models._f.selectItem "" #getIndex) != 0 then - ddItemSelect.selection = tempVar - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.open" ) - ) - - on modelsRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #modelsRO) != value then - cryTools.cryAnim.base.iniFile #set #modelsRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.rolledUp" ) - ) - - - on ddItemSelect selected value do - ( - try - ( - if value < (ddItemSelect.items.count - 1) then - ( - local tempVar = cryTools.cryAnim.UI.main.models._f.selectItem value #set - if tempVar == false then - ddItemSelect.selection = 1 - ) - else - ddItemSelect.selection = ddItemSelect.items.count - - - if ddItemSelect.selection == ddItemSelect.items.count then - ( - try ( destroyDialog cryTools.cryAnim.UI.main.models.editItemList ) catch() - - rollout editItemListRO "Edit Item List" - ( - activeXControl lbItems "MSComctlLib.ListViewCtrl" pos:[1,1] height:185 width:440 - button btnSave "Save" pos:[8,195] height:20 width:80 toolTip:"Save item list" - button btnAdd "Add" pos:[120,195] height:20 width:60 toolTip:"Adds new entry" - button btnDelete "Delete" pos:[190,195] height:20 width:60 toolTip:"Deletes selected entry" - button btnDeleteAll "Delete All" pos:[260,195] height:20 width:60 toolTip:"Clears whole list" - button btnCancel "Cancel" pos:[350,195] height:20 width:80 toolTip:"Aborts dialog to edit item list" - - - - on editItemListRO open do - ( - lbItems.GridLines = true - lbItems.MousePointer = #ccArrow - lbItems.AllowColumnReorder = true - lbItems.view = #lvwReport - lbItems.LabelEdit = #lvwManual - lbItems.Sorted = true - lbItems.FullRowSelect = true - - lbItems.columnHeaders.Add text:"ID" - lbItems.columnHeaders.Add text:"Name" - lbItems.columnHeaders.Add text:"External" - lbItems.columnHeaders.Add text:"Model" - lbItems.columnHeaders.Add text:"Reference" - lbItems.columnHeaders.Add text:"Parent" - lbItems.columnHeaders.Add text:"Rotation" - lbItems.columnHeaders.Add text:"Position" - - lbItems.columnHeaders[1].width = 600 - - - for i = 1 to cryTools.cryAnim.UI.main.models._v.itemList.count do - ( - local lbItemsEntry = lbItems.listItems.Add text:(i as String) - lbItemsEntry.listSubItems.Add text:cryTools.cryAnim.UI.main.models._v.itemList[i].name - lbItemsEntry.listSubItems.Add text:cryTools.cryAnim.UI.main.models._v.itemList[i].external - - local maxCount = cryTools.cryAnim.UI.main.models._v.itemList[i].model.count - tempStringArray = #("","","","","") - - - for f = 1 to maxCount do - ( - tempStringArray[1] += cryTools.cryAnim.UI.main.models._v.itemList[i].model[f] + (if f < maxCount then ";" else "") - tempStringArray[2] += cryTools.cryAnim.UI.main.models._v.itemList[i].reference[f] + (if f < maxCount then ";" else "") - tempStringArray[3] += cryTools.cryAnim.UI.main.models._v.itemList[i].parent[f] + (if f < maxCount then ";" else "") - tempStringArray[4] += cryTools.cryAnim.UI.main.models._v.itemList[i].rotation[f] as String + (if f < maxCount then ";" else "") - tempStringArray[5] += cryTools.cryAnim.UI.main.models._v.itemList[i].position[f] as String + (if f < maxCount then ";" else "") - ) - - - lbItemsEntry.listSubItems.Add text:tempStringArray[1] - lbItemsEntry.listSubItems.Add text:tempStringArray[2] - lbItemsEntry.listSubItems.Add text:tempStringArray[3] - lbItemsEntry.listSubItems.Add text:tempStringArray[4] - lbItemsEntry.listSubItems.Add text:tempStringArray[5] - ) - - cryTools.cryAnim.UI.main.models._f.sortList() - ) - - - on lbItems DblClick do - ( - - screenPos = getCursorPos lbItems - tempItem = lbItems.hittest ((screenPos.x-2)*15) ((screenPos.y-2)*15) - - if tempItem != undefined then - ( - try ( destroyDialog cryTools.cryAnim.UI.main.models.editDetails ) catch() - - rollout entryDetailsRO "Entry Details" - ( - label labID "ID :" pos:[8,10] - label labName "Name :" pos:[8,30] - label labExternal "External :" pos:[8,50] - label labModel "Model :" pos:[8,70] - label labReference "Reference :" pos:[8,90] - label labParent "Parent :" pos:[8,110] - label labRotation "Rotation :" pos:[8,130] - label labPosition "Position :" pos:[8,150] - - edittext edID "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.index as String) pos:[70,10] fieldWidth:300 - edittext edName "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.ListSubItems[1].text pos:[70,30] fieldWidth:300 - edittext edExternal "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.ListSubItems[2].text pos:[70,50] fieldWidth:300 - edittext edModel "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.ListSubItems[3].text pos:[70,70] fieldWidth:300 - edittext edReference "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.ListSubItems[4].text pos:[70,90] fieldWidth:300 - edittext edParent "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.ListSubItems[5].text pos:[70,110] fieldWidth:300 - edittext edRotation "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.ListSubItems[6].text pos:[70,130] fieldWidth:300 - edittext edPosition "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem.ListSubItems[7].text pos:[70,150] fieldWidth:300 - - button btnSave "Save" pos:[40,180] height:20 width:80 toolTip:"Save item to item list" - button btnSetOffset "Set Offset" pos:[150,180] height:20 width:80 toolTip:"Generates new offset of the selected item" - button btnCancel "Cancel" pos:[260,180] height:20 width:80 toolTip:"Aborts edit dialog for the selected item" - - - on btnSave pressed do - ( - local tempItem = cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem - - tempItem.text = edID.text - tempItem.ListSubItems[1].text = edName.text - tempItem.ListSubItems[2].text = edExternal.text - tempItem.ListSubItems[3].text = edModel.text - tempItem.ListSubItems[4].text = edReference.text - tempItem.ListSubItems[5].text = edParent.text - tempItem.ListSubItems[6].text = edRotation.text - tempItem.ListSubItems[7].text = edPosition.text - - cryTools.cryAnim.UI.main.models._f.sortList() - - destroyDialog cryTools.cryAnim.UI.main.models.entryDetails - ) - - - - on btnSetOffset pressed do - ( - local tempItem = cryTools.cryAnim.UI.main.models.editItemList.lbItems.SelectedItem - if tempItem != undefined then - ( - local refArray = filterString tempItem.ListSubItems[4].text ";" - local parentArray = filterString tempItem.ListSubItems[5].text ";" - local rotString = "" - local posString = "" - - for i = 1 to refArray.count do - ( - - - local tempObj = (cryTools.cryAnim._f.createSnapshot object:(getNodeByName refArray[i]))[1] - local tempParent = getNodeByName parentArray[i] - - if (tempObj != undefined) and (tempParent != undefined) then - ( - if tempParent.classID[1] != 37157 then - ( - rotString += (in coordsys tempObj tempParent.rotation) as String + (if i < refArray.count then ";" else "") - posString += (in coordsys tempObj tempParent.pos) as String + (if i < refArray.count then ";" else "") - ) - ) - - try (delete tempObj)catch() - ) - - edRotation.text = rotString - edPosition.text = posString - ) - else - ( - messageBox "No Item selected." title:"Reset Offset" - ) - index = undefined - ) - - - - on btnCancel pressed do - ( - destroyDialog cryTools.cryAnim.UI.main.models.entryDetails - ) - - ) - cryTools.cryAnim.UI.main.models.entryDetails = entryDetailsRO - entryDetailsRO = undefined - - createDialog cryTools.cryAnim.UI.main.models.entryDetails 385 210 - - ) - ) - - - - - - on btnAdd pressed do - ( - local tempStringArray = (itemStruct name:"" external:"" model:"" reference:"" parent:"" rotation:"" position:"") - local tempArray = #() - - - local objArray = selectByName title:("Select Nodes to be added") showHidden:true filter:cryTools.cryAnim.UI.main.models._f.selectByNameFilterNode - - if objArray != undefined then - ( - local objLink = #() - - for obj in objArray do - ( - global tempObj = obj - - objLink = selectByName title:("Select " + obj.name + " Reference") showHidden:true single:true filter:cryTools.cryAnim.UI.main.models._f.selectByNameFilterParent - if objLink != undefined then - ( - objRotation = (in coordsys objLink obj.rotation) as String - objPosition = (in coordsys objLink obj.position) as String - - objLink = objLink.name - ) - else - ( - objLink = "" - objRotation = "" - objPosition = "" - ) - - if obj.parent != undefined then - objParent = obj.parent.name - else - objParent = "" - - append tempArray (itemStruct name:obj.name model:obj.name external:obj.name parent:objParent reference:objLink rotation:objRotation position:objPosition ) - ) - tempObj = undefined - ) - - if tempArray.count > 0 then - ( - tempStringArray.name = tempArray[1].name - tempStringArray.external = tempArray[1].external - - for i = 1 to tempArray.count do - ( - tempStringArray.model += tempArray[i].model + (if i != tempArray.count then ";" else "") - tempStringArray.reference += tempArray[i].reference as String + (if i != tempArray.count then ";" else "") - tempStringArray.parent += tempArray[i].parent as String + (if i != tempArray.count then ";" else "") - tempStringArray.rotation += tempArray[i].rotation as String + (if i != tempArray.count then ";" else "") - tempStringArray.position += tempArray[i].position as String + (if i != tempArray.count then ";" else "") - ) - - local lbItemsEntry = lbItems.ListItems.Add text:((lbItems.ListItems.count + 1) as String) - lbItemsEntry.ListSubItems.Add text:tempStringArray.name - lbItemsEntry.ListSubItems.Add text:tempStringArray.external - lbItemsEntry.ListSubItems.Add text:tempStringArray.model - lbItemsEntry.ListSubItems.Add text:tempStringArray.reference - lbItemsEntry.ListSubItems.Add text:tempStringArray.parent - lbItemsEntry.ListSubItems.Add text:tempStringArray.rotation - lbItemsEntry.ListSubItems.Add text:tempStringArray.position - - cryTools.cryAnim.UI.main.models._f.sortList() - ) - ) - - - - - - - on btnSave pressed do - ( - local tempArray = #() - local tempList = #() - - for i = 1 to lbItems.ListItems.count do - ( - local tempItemArray = #() - local tempItem = lbItems.ListItems[i] - for d = 1 to tempItem.ListSubItems.count do - ( - if tempItem.ListSubItems[d].text != "" then tempItemArray[d] = tempItem.ListSubItems[d].text else tempItemArray[d] = " " - ) - - append tempArray (itemStruct name:tempItemArray[1] external:tempItemArray[2] model:(filterString tempItemArray[3] ";") reference:(filterString tempItemArray[4] ";") parent:(filterString tempItemArray[5] ";") rotation:(filterString tempItemArray[6] ";") position:(filterString tempItemArray[7] ";")) - - for f = 1 to tempArray[tempArray.count].model.count do - ( - tempArray[tempArray.count].rotation[f] = execute (tempArray[tempArray.count].rotation[f]) - tempArray[tempArray.count].position[f] = execute (tempArray[tempArray.count].position[f]) - ) - ) - - cryTools.cryAnim.base.iniFile #set #items value:tempArray - - cryTools.cryAnim.UI.main.models._v.itemList = tempArray - - - - for i = 1 to cryTools.cryAnim.UI.main.models._v.itemList.count do - append tempList cryTools.cryAnim.UI.main.models._v.itemList[i].name - - join tempList #("-------------------------------------------", "Edit Entries") - - (cryTools.cryAnim.UI.main._f.getUI "Models" "ddItemSelect").items = tempList - - destroyDialog cryTools.cryAnim.UI.main.models.editItemList - - ) - - on btnDelete pressed do - ( - deleteIndex = 0 - for i = 1 to lbItems.ListItems.count do - ( - try - ( - if lbItems.ListItems[i].selected == true then - lbItems.ListItems.Remove i - ) - catch() - ) - - cryTools.cryAnim.UI.main.models._f.sortList() - ) - - on btnDeleteAll pressed do - ( - lbItems.ListItems.clear() - ) - - - on btnCancel pressed do - ( - destroyDialog cryTools.cryAnim.UI.main.models.editItemList - ) - - - on editItemListRO close do - ( - local tempVar = cryTools.cryAnim.UI.main.models._f.selectItem "" #getIndex - - if tempVar != 0 then - (cryTools.cryAnim.UI.main._f.getUI "Models" "ddItemSelect").selection = tempVar - ) - - ) - cryTools.cryAnim.UI.main.models.editItemList = editItemListRO - editItemListRO = undefined - - createDialog cryTools.cryAnim.UI.main.models.editItemList 443 220 - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.ddItemSelect.selected" ) - ) - - - on btnLoadModel pressed do - ( - try - ( - rcmenu loadModelRC - ( - - menUItem mi1 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 1)) - menUItem mi2 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 2)) - menUItem mi3 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 3)) - menUItem mi4 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 4)) - menUItem mi5 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 5)) - menUItem mi6 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 6)) - menUItem mi7 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 7)) - menUItem mi8 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 8)) - menUItem mi9 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 9)) - menUItem mi10 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 10)) - menUItem mi11 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 11)) - menUItem mi12 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 12)) - menUItem mi13 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 13)) - menUItem mi14 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 14)) - menUItem mi15 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 15)) - menUItem mi16 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 16)) - menUItem mi17 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 17)) - menUItem mi18 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 18)) - menUItem mi19 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 19)) - menUItem mi20 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 20)) - - - seperator miSep checked:false - menUItem miEdit "Edit Entries" checked:false - - - on loadModelRC open do - ( - local tempPathArray = #() - local tempArray = cryTools.cryAnim.base.iniFile #get #models - if tempArray != "" and tempArray != undefined then - ( - mi1.text = cryTools.cryAnim.UI.main.models._f.getEntries 1 tempArray - mi2.text = cryTools.cryAnim.UI.main.models._f.getEntries 2 tempArray - mi3.text = cryTools.cryAnim.UI.main.models._f.getEntries 3 tempArray - mi4.text = cryTools.cryAnim.UI.main.models._f.getEntries 4 tempArray - mi5.text = cryTools.cryAnim.UI.main.models._f.getEntries 5 tempArray - mi6.text = cryTools.cryAnim.UI.main.models._f.getEntries 6 tempArray - mi7.text = cryTools.cryAnim.UI.main.models._f.getEntries 7 tempArray - mi8.text = cryTools.cryAnim.UI.main.models._f.getEntries 8 tempArray - mi9.text = cryTools.cryAnim.UI.main.models._f.getEntries 9 tempArray - mi10.text = cryTools.cryAnim.UI.main.models._f.getEntries 10 tempArray - mi11.text = cryTools.cryAnim.UI.main.models._f.getEntries 11 tempArray - mi12.text = cryTools.cryAnim.UI.main.models._f.getEntries 12 tempArray - mi13.text = cryTools.cryAnim.UI.main.models._f.getEntries 13 tempArray - mi14.text = cryTools.cryAnim.UI.main.models._f.getEntries 14 tempArray - mi15.text = cryTools.cryAnim.UI.main.models._f.getEntries 15 tempArray - mi16.text = cryTools.cryAnim.UI.main.models._f.getEntries 16 tempArray - mi17.text = cryTools.cryAnim.UI.main.models._f.getEntries 17 tempArray - mi18.text = cryTools.cryAnim.UI.main.models._f.getEntries 18 tempArray - mi19.text = cryTools.cryAnim.UI.main.models._f.getEntries 19 tempArray - mi20.text = cryTools.cryAnim.UI.main.models._f.getEntries 20 tempArray - ) - - cryTools.cryAnim._v.various[17] = tempArray - ) - - - - - - - on mi1 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][1]) - on mi2 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][2]) - on mi3 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][3]) - on mi4 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][4]) - on mi5 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][5]) - on mi6 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][6]) - on mi7 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][7]) - on mi8 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][8]) - on mi9 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][9]) - on mi10 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][10]) - on mi11 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][11]) - on mi12 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][12]) - on mi13 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][13]) - on mi14 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][14]) - on mi15 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][15]) - on mi16 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][16]) - on mi17 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][17]) - on mi18 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][18]) - on mi19 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][19]) - on mi20 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][20]) - - - on miEdit picked do - ( - rollout editModelListRO "Edit Model List" - ( - activeXControl lbModels "MSComctlLib.ListViewCtrl" pos:[1,1] height:185 width:440 - button btnSave "Save" pos:[8,195] height:20 width:80 toolTip:"Save model list" - button btnDelete "Delete" pos:[150,195] height:20 width:60 toolTip:"Deletes selected entry" - button btnDeleteAll "Delete All" pos:[220,195] height:20 width:60 toolTip:"Clears whole list" - button btnCancel "Cancel" pos:[350,195] height:20 width:80 toolTip:"Aborts dialog to edit model list" - - - - on editModelListRO open do - ( - lbModels.GridLines = true - lbModels.MousePointer = #ccArrow - lbModels.AllowColumnReorder = true - lbModels.view = #lvwReport - lbModels.LabelEdit = #lvwAutomatic - lbModels.Sorted = true - lbModels.FullRowSelect = true - - tempArray = cryTools.cryAnim.base.iniFile #get #models - if tempArray != "" and tempArray != undefined then - ( - for i = 1 to tempArray.count do - ( - local lbModelsEntry = lbModels.listItems.Add text:tempArray[i].name - lbModelsEntry.listSubItems.Add text:tempArray[i].path - ) - ) - - - lbModels.columnHeaders.Add text:"Name" - lbModels.columnHeaders.Add text:"Path" - ) - - on lbModels DblClick do - ( - screenPos = getCursorPos lbModels - tempItem = lbModels.hittest ((screenPos.x-2)*15) ((screenPos.y-2)*15) - if tempItem != undefined then - ( - for i = 1 to lbModels.ListItems.count do - ( - if lbModels.listItems[i].selected == true then - ( - tempValue = getOpenFileName caption:"Select Model to open" filename:lbModels.ListItems[i].listSubItems[1].text types:"3ds max (*.max)|*.max" - if (tempValue != false) and (tempValue != undefined) then - ( - lbModels.ListItems[i].listSubItems[1].text = tempValue - lbModels.ListItems[i].text = cryTools.cryAnim.base.perforce tempValue #getFilename - ) - ) - ) - ) - else - ( - lastIndex = lbModels.ListItems.count - if lbModels.ListItems.count > 0 then - tempPath = lbModels.ListItems[lastIndex].listSubItems[1].text - else - tempPath = maxFilePath + maxFileName - - tempValue = getOpenFileName caption:"Select Model to open" filename:tempPath types:"3ds max (*.max)|*.max" - if (tempValue != false) and (tempValue != undefined) then - ( - local tempEntry = lbModels.ListItems.Add text:(cryTools.cryAnim.base.perforce tempValue #getFilename) - tempEntry.ListSubItems.Add text:tempValue - ) - ) - ) - - on btnSave pressed do - ( - local tempArray = #() - for i = 1 to lbModels.ListItems.count do - append tempArray (modelPathStruct name:lbModels.ListItems[i].text path:lbModels.ListItems[i].ListSubItems[1].text) - - cryTools.cryAnim.base.iniFile #set #models value:tempArray - - destroyDialog cryTools.cryAnim.UI.main.models.editModelList - ) - - on btnDelete pressed do - ( - deleteIndex = 0 - for i = 1 to lbModels.ListItems.count do - ( - try - ( - if lbModels.ListItems[i].selected == true then - lbModels.ListItems.Remove i - ) - catch() - ) - ) - - on btnDeleteAll pressed do - ( - lbModels.ListItems.clear() - ) - - on btnCancel pressed do - ( - destroyDialog cryTools.cryAnim.UI.main.models.editModelList - ) - - on lbModels BeforeLabelEdit cancel do - ( - enableAccelerators = false - ) - - on lbModels AfterLabelEdit cancel newString do - ( - enableAccelerators = true - ) - - ) - cryTools.cryAnim.UI.main.models.editModelList = editModelListRO - editModelListRO = undefined - - createDialog cryTools.cryAnim.UI.main.models.editModelList 443 220 - ) - - ) - cryTools.cryAnim.UI.main.models.loadModelRC = loadModelRC - loadModelRC = undefined - - registerRightClickMenu cryTools.cryAnim.UI.main.models.loadModelRC - - popUpMenu cryTools.cryAnim.UI.main.models.loadModelRC pos:[(mouse.screenpos[1] - 10), (mouse.screenpos[2] - 10)] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.btnLoadModel.pressed" ) - ) - -) -logOutput "> Created modelsRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 modelsRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 modelsRO -) -catch ( logOutput "!!> Error adding modelsRO to main dialog" ) -modelsRO = undefined - - -logOutput ">> models8.ms loaded" diff --git a/Tools/maxscript/cryAnim/ui/main/models/models9.ms b/Tools/maxscript/cryAnim/ui/main/models/models9.ms deleted file mode 100644 index 26962f691a..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/models/models9.ms +++ /dev/null @@ -1,641 +0,0 @@ ---############################################################################### - --// rollout with elements to control models and items ---############################################################################### -rollout modelsRO "Models" -( - button btnLoadModel "Load Model" pos:[8,8] width:142 height:20 toolTip:"Loads often used models and shows dialog to edit them" - - groupBox gbItems " Items " pos:[2,35] width:153 height:50 - dropDownList ddItemSelect "" pos:[8,55] width:142 height:21 - - - - on modelsRO open do - ( - try - ( - try ( if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Models" "").open = cryTools.cryAnim.base.iniFile #get #modelsRO) catch() - - cryTools.cryAnim.UI.main.models._v.itemList = cryTools.cryAnim.UI.main.models._f.selectItem "" #getList - - local tempListArray = cryTools.cryAnim.UI.main.models._v.itemList - local tempListArray2 = #() - - for i = 1 to tempListArray.count do - tempListArray2[i] = tempListArray[i].name - - - join tempListArray2 #("-------------------------------------------", "Edit Entries") - - ddItemSelect.items = tempListArray2 - - - if (local tempVar = cryTools.cryAnim.UI.main.models._f.selectItem "" #getIndex) != 0 then - ddItemSelect.selection = tempVar - - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.open" ) - ) - - on modelsRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #modelsRO) != value then - cryTools.cryAnim.base.iniFile #set #modelsRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.rolledUp" ) - ) - - - on ddItemSelect selected value do - ( - try - ( - if value < (ddItemSelect.items.count - 1) then - ( - local tempVar = cryTools.cryAnim.UI.main.models._f.selectItem value #set - if tempVar == false then - ddItemSelect.selection = 1 - ) - else - ddItemSelect.selection = ddItemSelect.items.count - - - if ddItemSelect.selection == ddItemSelect.items.count then - ( - try ( destroyDialog cryTools.cryAnim.UI.main.models.editItemList ) catch() - - rollout editItemListRO "Edit Item List" - ( - dotNetControl lbItems "System.Windows.Forms.ListView" pos:[1,1] height:185 width:440 - button btnSave "Save" pos:[8,195] height:20 width:80 toolTip:"Save item list" - button btnAdd "Add" pos:[120,195] height:20 width:60 toolTip:"Adds new entry" - button btnDelete "Delete" pos:[190,195] height:20 width:60 toolTip:"Deletes selected entry" - button btnDeleteAll "Delete All" pos:[260,195] height:20 width:60 toolTip:"Clears whole list" - button btnCancel "Cancel" pos:[350,195] height:20 width:80 toolTip:"Aborts dialog to edit item list" - - - - on editItemListRO open do - ( - lbItems.GridLines = true - lbItems.AllowColumnReorder = true - lbItems.View = lbItems.View.Details - lbItems.LabelEdit = false - lbItems.LabelWrap = true - lbItems.FullRowSelect = true - lbItems.HideSelection = false - lbItems.Sorting = lbItems.Sorting.Ascending - - lbItems.Columns.Add "ID" - lbItems.Columns.Add "Name" - lbItems.Columns.Add "External" - lbItems.Columns.Add "Model" - lbItems.Columns.Add "Reference" - lbItems.Columns.Add "Parent" - lbItems.Columns.Add "Rotation" - lbItems.Columns.Add "Position" - - - - for i = 1 to cryTools.cryAnim.UI.main.models._v.itemList.count do - ( - local lbItemsEntry = lbItems.Items.Add (i as String) - lbItemsEntry.SubItems.Add cryTools.cryAnim.UI.main.models._v.itemList[i].name - lbItemsEntry.SubItems.Add cryTools.cryAnim.UI.main.models._v.itemList[i].external - - local maxCount = cryTools.cryAnim.UI.main.models._v.itemList[i].model.count - tempStringArray = #("","","","","") - - - for f = 1 to maxCount do - ( - tempStringArray[1] += cryTools.cryAnim.UI.main.models._v.itemList[i].model[f] + (if f < maxCount then ";" else "") - tempStringArray[2] += cryTools.cryAnim.UI.main.models._v.itemList[i].reference[f] + (if f < maxCount then ";" else "") - tempStringArray[3] += cryTools.cryAnim.UI.main.models._v.itemList[i].parent[f] + (if f < maxCount then ";" else "") - tempStringArray[4] += cryTools.cryAnim.UI.main.models._v.itemList[i].rotation[f] as String + (if f < maxCount then ";" else "") - tempStringArray[5] += cryTools.cryAnim.UI.main.models._v.itemList[i].position[f] as String + (if f < maxCount then ";" else "") - ) - - lbItemsEntry.SubItems.Add tempStringArray[1] - lbItemsEntry.SubItems.Add tempStringArray[2] - lbItemsEntry.SubItems.Add tempStringArray[3] - lbItemsEntry.SubItems.Add tempStringArray[4] - lbItemsEntry.SubItems.Add tempStringArray[5] - ) - - cryTools.cryAnim.UI.main.models._f.updateExtent() - cryTools.cryAnim.UI.main.models._f.sortList() - ) - - - on lbItems DoubleClick do - ( - - tempItem = lbItems.FocusedItem - tempItem.checked = not tempItem.checked - - if tempItem != undefined then - ( - try ( destroyDialog cryTools.cryAnim.UI.main.models.editDetails ) catch() - - rollout entryDetailsRO "Entry Details" - ( - label labID "ID :" pos:[8,10] - label labName "Name :" pos:[8,30] - label labExternal "External :" pos:[8,50] - label labModel "Model :" pos:[8,70] - label labReference "Reference :" pos:[8,90] - label labParent "Parent :" pos:[8,110] - label labRotation "Rotation :" pos:[8,130] - label labPosition "Position :" pos:[8,150] - - edittext edID "" text:cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.text pos:[70,10] fieldWidth:300 - edittext edName "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.SubItems.item 1).text pos:[70,30] fieldWidth:300 - edittext edExternal "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.SubItems.item 2).text pos:[70,50] fieldWidth:300 - edittext edModel "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.SubItems.item 3).text pos:[70,70] fieldWidth:300 - edittext edReference "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.SubItems.item 4).text pos:[70,90] fieldWidth:300 - edittext edParent "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.SubItems.item 5).text pos:[70,110] fieldWidth:300 - edittext edRotation "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.SubItems.item 6).text pos:[70,130] fieldWidth:300 - edittext edPosition "" text:(cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem.SubItems.item 7).text pos:[70,150] fieldWidth:300 - - button btnSave "Save" pos:[40,180] height:20 width:80 toolTip:"Save item to item list" - button btnSetOffset "Set Offset" pos:[150,180] height:20 width:80 toolTip:"Generates new offset of the selected item" - button btnCancel "Cancel" pos:[260,180] height:20 width:80 toolTip:"Aborts edit dialog for the selected item" - - - on btnSave pressed do - ( - local tempItem = cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem - - tempItem.text = edID.text - (tempItem.SubItems.item 1).text = edName.text - (tempItem.SubItems.item 2).text = edExternal.text - (tempItem.SubItems.item 3).text = edModel.text - (tempItem.SubItems.item 4).text = edReference.text - (tempItem.SubItems.item 5).text = edParent.text - (tempItem.SubItems.item 6).text = edRotation.text - (tempItem.SubItems.item 7).text = edPosition.text - - cryTools.cryAnim.UI.main.models._f.updateExtent() - cryTools.cryAnim.UI.main.models._f.sortList() - - destroyDialog cryTools.cryAnim.UI.main.models.entryDetails - ) - - - on btnSetOffset pressed do - ( - local tempItem = cryTools.cryAnim.UI.main.models.editItemList.lbItems.FocusedItem - if tempItem != undefined then - ( - local refArray = filterString (tempItem.SubItems.item 4).text ";" - local parentArray = filterString (tempItem.SubItems.item 5).text ";" - local rotString = "" - local posString = "" - - for i = 1 to refArray.count do - ( - - - local tempObj = (cryTools.cryAnim._f.createSnapshot object:(getNodeByName refArray[i]))[1] - local tempParent = getNodeByName parentArray[i] - - if (tempObj != undefined) and (tempParent != undefined) then - ( - if tempParent.classID[1] != 37157 then - ( - rotString += (in coordsys tempObj tempParent.rotation) as String + (if i < refArray.count then ";" else "") - posString += (in coordsys tempObj tempParent.pos) as String + (if i < refArray.count then ";" else "") - ) - ) - - try (delete tempObj)catch() - ) - - edRotation.text = rotString - edPosition.text = posString - ) - else - ( - messageBox "No Item selected." title:"Reset Offset" - ) - index = undefined - ) - - - - on btnCancel pressed do - ( - destroyDialog cryTools.cryAnim.UI.main.models.entryDetails - ) - ) - cryTools.cryAnim.UI.main.models.entryDetails = entryDetailsRO - entryDetailsRO = undefined - - createDialog cryTools.cryAnim.UI.main.models.entryDetails 385 210 - - ) - tempItem = undefined - ) - - - - on btnAdd pressed do - ( - local tempStringArray = (itemStruct name:"" external:"" model:"" reference:"" parent:"" rotation:"" position:"") - local tempArray = #() - - - local objArray = selectByName title:("Select Nodes to be added") showHidden:true filter:cryTools.cryAnim.UI.main.models._f.selectByNameFilterNode - - if objArray != undefined then - ( - local objLink = #() - - for obj in objArray do - ( - global tempObj = obj - - objLink = selectByName title:("Select " + obj.name + " Reference") showHidden:true single:true filter:cryTools.cryAnim.UI.main.models._f.selectByNameFilterParent - if objLink != undefined then - ( - objRotation = (in coordsys objLink obj.rotation) as String - objPosition = (in coordsys objLink obj.position) as String - - objLink = objLink.name - ) - else - ( - objLink = "" - objRotation = "" - objPosition = "" - ) - - if obj.parent != undefined then - objParent = obj.parent.name - else - objParent = "" - - append tempArray (itemStruct name:obj.name model:obj.name external:obj.name parent:objParent reference:objLink rotation:objRotation position:objPosition ) - ) - tempObj = undefined - ) - - if tempArray.count > 0 then - ( - tempStringArray.name = tempArray[1].name - tempStringArray.external = tempArray[1].external - - for i = 1 to tempArray.count do - ( - tempStringArray.model += tempArray[i].model + (if i != tempArray.count then ";" else "") - tempStringArray.reference += tempArray[i].reference as String + (if i != tempArray.count then ";" else "") - tempStringArray.parent += tempArray[i].parent as String + (if i != tempArray.count then ";" else "") - tempStringArray.rotation += tempArray[i].rotation as String + (if i != tempArray.count then ";" else "") - tempStringArray.position += tempArray[i].position as String + (if i != tempArray.count then ";" else "") - ) - - local lbItemsEntry = lbItems.Items.Add ((lbItems.Items.count + 1) as String) - lbItemsEntry.SubItems.Add tempStringArray.name - lbItemsEntry.SubItems.Add tempStringArray.external - lbItemsEntry.SubItems.Add tempStringArray.model - lbItemsEntry.SubItems.Add tempStringArray.reference - lbItemsEntry.SubItems.Add tempStringArray.parent - lbItemsEntry.SubItems.Add tempStringArray.rotation - lbItemsEntry.SubItems.Add tempStringArray.position - - cryTools.cryAnim.UI.main.models._f.updateExtent() - cryTools.cryAnim.UI.main.models._f.sortList() - ) - ) - - - - on btnSave pressed do - ( - local tempArray = #() - local tempList = #() - - for i = 0 to (lbItems.Items.count - 1) do - ( - local tempItemArray = #() - local tempItem = lbItems.Items.item i - for d = 1 to (tempItem.SubItems.count - 1) do - ( - if (tempItem.SubItems.item d).text != "" then tempItemArray[d] = (tempItem.SubItems.item d).text else tempItemArray[d] = " " - ) - - append tempArray (itemStruct name:tempItemArray[1] external:tempItemArray[2] model:(filterString tempItemArray[3] ";") reference:(filterString tempItemArray[4] ";") parent:(filterString tempItemArray[5] ";") rotation:(filterString tempItemArray[6] ";") position:(filterString tempItemArray[7] ";")) - - for f = 1 to tempArray[tempArray.count].model.count do - ( - tempArray[tempArray.count].rotation[f] = execute (tempArray[tempArray.count].rotation[f]) - tempArray[tempArray.count].position[f] = execute (tempArray[tempArray.count].position[f]) - ) - ) - - cryTools.cryAnim.base.iniFile #set #items value:tempArray - - cryTools.cryAnim.UI.main.models._v.itemList = tempArray - - - - for i = 1 to cryTools.cryAnim.UI.main.models._v.itemList.count do - append tempList cryTools.cryAnim.UI.main.models._v.itemList[i].name - - join tempList #("-------------------------------------------", "Edit Entries") - - (cryTools.cryAnim.UI.main._f.getUI "Models" "ddItemSelect").items = tempList - - destroyDialog cryTools.cryAnim.UI.main.models.editItemList - - - ) - - on btnDelete pressed do - ( - if lbItems.FocusedItem != undefined then - lbItems.FocusedItem.remove() - - cryTools.cryAnim.UI.main.models._f.updateExtent() - cryTools.cryAnim.UI.main.models._f.sortList() - ) - - on btnDeleteAll pressed do - ( - lbItems.Items.clear() - ) - - - on btnCancel pressed do - ( - (cryTools.cryAnim.UI.main._f.getUI "Models" "ddItemSelect").selection = (cryTools.cryAnim.UI.main._f.getUI "Models" "ddItemSelect").items.count - 1 - destroyDialog cryTools.cryAnim.UI.main.models.editItemList - ) - - - on editItemListRO close do - ( - try - ( - local tempVar = cryTools.cryAnim.UI.main.models._f.selectItem "" #getIndex - - if tempVar != 0 then - (cryTools.cryAnim.UI.main._f.getUI "Models" "ddItemSelect").selection = tempVar - )catch() - ) - ) - cryTools.cryAnim.UI.main.models.editItemList = editItemListRO - editItemListRO = undefined - - createDialog cryTools.cryAnim.UI.main.models.editItemList 443 220 - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.ddItemSelect.selected" ) - ) - - - on btnLoadModel pressed do - ( - try - ( - rcmenu loadModelRC - ( - - menUItem mi1 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 1)) - menUItem mi2 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 2)) - menUItem mi3 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 3)) - menUItem mi4 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 4)) - menUItem mi5 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 5)) - menUItem mi6 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 6)) - menUItem mi7 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 7)) - menUItem mi8 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 8)) - menUItem mi9 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 9)) - menUItem mi10 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 10)) - menUItem mi11 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 11)) - menUItem mi12 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 12)) - menUItem mi13 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 13)) - menUItem mi14 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 14)) - menUItem mi15 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 15)) - menUItem mi16 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 16)) - menUItem mi17 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 17)) - menUItem mi18 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 18)) - menUItem mi19 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 19)) - menUItem mi20 "None" checked:false filter:(fn temp = (cryTools.cryAnim.UI.main.models._f.setVisible 20)) - - - seperator miSep checked:false - menUItem miEdit "Edit Entries" checked:false - - - on loadModelRC open do - ( - tempPathArray = #() - tempArray = cryTools.cryAnim.base.iniFile #get #models - if tempArray != "" and tempArray != undefined then - ( - mi1.text = cryTools.cryAnim.UI.main.models._f.getEntries 1 tempArray - mi2.text = cryTools.cryAnim.UI.main.models._f.getEntries 2 tempArray - mi3.text = cryTools.cryAnim.UI.main.models._f.getEntries 3 tempArray - mi4.text = cryTools.cryAnim.UI.main.models._f.getEntries 4 tempArray - mi5.text = cryTools.cryAnim.UI.main.models._f.getEntries 5 tempArray - mi6.text = cryTools.cryAnim.UI.main.models._f.getEntries 6 tempArray - mi7.text = cryTools.cryAnim.UI.main.models._f.getEntries 7 tempArray - mi8.text = cryTools.cryAnim.UI.main.models._f.getEntries 8 tempArray - mi9.text = cryTools.cryAnim.UI.main.models._f.getEntries 9 tempArray - mi10.text = cryTools.cryAnim.UI.main.models._f.getEntries 10 tempArray - mi11.text = cryTools.cryAnim.UI.main.models._f.getEntries 11 tempArray - mi12.text = cryTools.cryAnim.UI.main.models._f.getEntries 12 tempArray - mi13.text = cryTools.cryAnim.UI.main.models._f.getEntries 13 tempArray - mi14.text = cryTools.cryAnim.UI.main.models._f.getEntries 14 tempArray - mi15.text = cryTools.cryAnim.UI.main.models._f.getEntries 15 tempArray - mi16.text = cryTools.cryAnim.UI.main.models._f.getEntries 16 tempArray - mi17.text = cryTools.cryAnim.UI.main.models._f.getEntries 17 tempArray - mi18.text = cryTools.cryAnim.UI.main.models._f.getEntries 18 tempArray - mi19.text = cryTools.cryAnim.UI.main.models._f.getEntries 19 tempArray - mi20.text = cryTools.cryAnim.UI.main.models._f.getEntries 20 tempArray - ) - - cryTools.cryAnim._v.various[17] = tempArray - ) - - - - - on mi1 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][1]) - on mi2 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][2]) - on mi3 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][3]) - on mi4 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][4]) - on mi5 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][5]) - on mi6 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][6]) - on mi7 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][7]) - on mi8 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][8]) - on mi9 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][9]) - on mi10 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][10]) - on mi11 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][11]) - on mi12 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][12]) - on mi13 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][13]) - on mi14 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][14]) - on mi15 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][15]) - on mi16 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][16]) - on mi17 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][17]) - on mi18 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][18]) - on mi19 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][19]) - on mi20 picked do (cryTools.cryAnim.UI.main.models._f.loadModel cryTools.cryAnim._v.various[17][20]) - - - on miEdit picked do - ( - rollout editModelListRO "Edit Model List" - ( - dotNetControl lbModels "System.Windows.Forms.ListView" pos:[1,1] height:185 width:440 - button btnSave "Save" pos:[8,195] height:20 width:80 toolTip:"Save model list" - button btnAdd "Add" pos:[120,195] height:20 width:60 toolTip:"Add new entry" - button btnDelete "Delete" pos:[190,195] height:20 width:60 toolTip:"Deletes selected entry" - button btnDeleteAll "Delete All" pos:[260,195] height:20 width:60 toolTip:"Clears whole list" - button btnCancel "Cancel" pos:[350,195] height:20 width:80 toolTip:"Aborts dialog to edit model list" - - - - on editModelListRO open do - ( - lbModels.GridLines = true - lbModels.AllowColumnReorder = true - lbModels.View = lbModels.View.Details - lbModels.LabelEdit = true - lbModels.LabelWrap = true - lbModels.FullRowSelect = true - lbModels.HideSelection = false - lbModels.Sorting = lbModels.Sorting.Ascending - - tempArray = cryTools.cryAnim.base.iniFile #get #models - if tempArray != "" and tempArray != undefined then - ( - for i = 1 to tempArray.count do - ( - local lbModelsEntry = lbModels.Items.Add tempArray[i].name - lbModelsEntry.SubItems.Add tempArray[i].path - ) - ) - - - lbModels.Columns.Add "Name" - lbModels.Columns.Add "Path" - - cryTools.cryAnim.UI.main.models._f.updateExtentModel() - ) - - on lbModels DoubleClick do - ( - tempItem = lbModels.FocusedItem - - if tempItem != undefined then - ( - tempValue = getOpenFileName caption:"Select Model to open" filename:(lbModels.FocusedItem.SubItems.item 1).text types:"3ds max (*.max)|*.max" - if (tempValue != false) and (tempValue != undefined) then - ( - (lbModels.FocusedItem.SubItems.item 1).text = tempValue - lbModels.FocusedItem.text = cryTools.cryAnim.base.perforce tempValue #getFilename - ) - ) - else - ( - lastIndex = lbModels.ListItems.count - if lbModels.ListItems.count > 0 then - tempPath = lbModels.ListItems[lastIndex].listSubItems[1].text - else - tempPath = maxFilePath + maxFileName - - tempValue = getOpenFileName caption:"Select Model to open" filename:tempPath types:"3ds max (*.max)|*.max" - if (tempValue != false) and (tempValue != undefined) then - ( - local tempEntry = lbModels.ListItems.Add text:(cryTools.cryAnim.base.perforce tempValue #getFilename) - tempEntry.ListSubItems.Add text:tempValue - ) - ) - - cryTools.cryAnim.UI.main.models._f.updateExtentModel() - ) - - on btnAdd pressed do - ( - lastIndex = (lbModels.Items.count - 1) - if lbModels.Items.count > 0 then - tempPath = ((lbModels.Items.item lastIndex).SubItems.item 1).text - else - tempPath = maxFilePath + maxFileName - - tempValue = getOpenFileName caption:"Select Model to open" filename:tempPath types:"3ds max (*.max)|*.max" - if (tempValue != false) and (tempValue != undefined) then - ( - local tempEntry = lbModels.Items.Add (cryTools.cryAnim.base.perforce tempValue #getFilename) - tempEntry.SubItems.Add tempValue - ) - - cryTools.cryAnim.UI.main.models._f.updateExtentModel() - ) - - on btnSave pressed do - ( - local tempArray = #() - for i = 0 to (lbModels.Items.count - 1) do - append tempArray (modelPathStruct name:(lbModels.Items.item i).text path:((lbModels.Items.item i).SubItems.item 1).text) - - cryTools.cryAnim.base.iniFile #set #models value:tempArray - destroyDialog cryTools.cryAnim.UI.main.models.editModelList - ) - - on btnDelete pressed do - ( - if lbModels.FocusedItem != undefined then - lbModels.FocusedItem.remove() - ) - - on btnDeleteAll pressed do - ( - lbModels.Items.clear() - ) - - on btnCancel pressed do - ( - destroyDialog cryTools.cryAnim.UI.main.models.editModelList - ) - - ) - cryTools.cryAnim.UI.main.models.editModelList = editModelListRO - editModelListRO = undefined - - createDialog cryTools.cryAnim.UI.main.models.editModelList 443 220 - ) - - ) - cryTools.cryAnim.UI.main.models.loadModelRC = loadModelRC - loadModelRC = undefined - - - registerRightClickMenu cryTools.cryAnim.UI.main.models.loadModelRC - - popUpMenu cryTools.cryAnim.UI.main.models.loadModelRC pos:[(mouse.screenpos[1] - 10), (mouse.screenpos[2] - 10)] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.modelsRO.btnLoadModel.pressed" ) - ) -) -logOutput "> Created modelsRO rollout" - - ---try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 modelsRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 modelsRO -) ---catch ( logOutput "!!> Error adding modelsRO to main dialog" ) -modelsRO = undefined - - -logOutput ">> models9.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/muscle.ms b/Tools/maxscript/cryAnim/ui/main/muscle.ms deleted file mode 100644 index 5b8a487c29..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/muscle.ms +++ /dev/null @@ -1,263 +0,0 @@ ---############################################################################### - --// rollout with elements to control models, weapons and other things like nanoMuscles ---############################################################################### -rollout musclesRO "Muscles" -( - groupBox gbMuscles " Muscles " pos:[2,2] width:153 height:62 - - - checkBox chkAutomateMuscles "Auto-Muscles" pos:[8,18] width:90 height:20 checked:true fieldWidth:0 - checkBox chkUseMusclesKeys "Use Keys" pos:[8,38] width:90 height:20 enabled:false fieldWidth:0 - button btnCreateMuscles "Create" pos:[100,16] width:50 height:20 toolTip:"Creates the nano muscles rig on Bip01" - button btnBakeMuscles "Bake" pos:[100,36] width:50 height:20 toolTip:"Bakes down all keys of the muscle bones" - - on musclesRO open do - ( - try - ( - try ( if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Muscles" "").open = cryTools.cryAnim.base.iniFile #get #musclesRO) catch() - - global automateAnimateMuscles = undefined - global useMuscleKeys = undefined - - - nanoConPosArray = #("_Bip01 L rear deltoid01_Con", "_Bip01 L rear deltoid02_Con", "_Bip01 L clavicular deltoid01_Con", "_Bip01 R rear deltoid01_Con", "_Bip01 R rear deltoid02_Con", "_Bip01 R clavicular deltoid01_Con") - nanoConRotArray = #("_Bip01 L knee_Con", "_Bip01 R knee_Con") - - errorOutput = undefined - - for i = 1 to nanoConPosArray.count do - if (getNodeByName nanoConPosArray[i]) == undefined then - errorOutput = true - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.musclesRO.open" ) - ) - - on musclesRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #muscles) != value then - cryTools.cryAnim.base.iniFile #set #muscles - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.musclesRO.rolledUp" ) - ) - - - on chkAutomateMuscles changed value do - ( - try - ( - if chkAutomateMuscles.checked == true then - global automateAnimateMuscles = undefined - else - global automateAnimateMuscles = false - - chkUseMusclesKeys.enabled = not chkAutomateMuscles.checked - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.musclesRO.chkAutomateMuscles.changed" ) - ) - - on chkUseMusclesKeys changed value do - ( - try - ( - if chkUseMusclesKeys.checked == true then - global useMuscleKeys = true - else - global useMuscleKeys = undefined - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.musclesRO.chkUseMusclesKeys.changed" ) - ) - - on btnBakeMuscles pressed do - ( - try - ( - if $'_Bip01 L clavicular deltoid01_LA' != undefined then - ( - if (queryBox "Bake all Muscle Bones?" title:"Muscle Rig") == true then - cryTools.cryAnim.UI.main.loadSave._f.bakeMuscleBones() - ) - else - messageBox "No Muscle Rig on Bip01" title:"Muscle Rig" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.musclesRO.btnBakeMuscles.pressed" ) - ) - - - - on btnCreateMuscles pressed do - ( - try - ( - if $Bip01 != undefined then - ( - if (queryBox "Create MuscleRig for Bip01?" title:"Muscle Rig") == true then - ( - - undo "createMuscleRig" on - ( - $Bip01.controller.figureMode = true - completeRedraw() - - saveSelection = getCurrentSelection() - saveSliderTime = sliderTime - - clearSelection() - - - with redraw off - ( - - Bip01_R_rear_deltoid02_LA = dummy name:"_Bip01 R rear deltoid02_LA" boxsize:[2,2,2] - Bip01_R_clavicular_deltoid01_LA = dummy name:"_Bip01 R clavicular deltoid01_LA" boxsize:[2,2,2] - Bip01_R_rear_deltoid01_LA = dummy name:"_Bip01 R rear deltoid01_LA" boxsize:[2,2,2] - - Bip01_L_rear_deltoid02_LA = dummy name:"_Bip01 L rear deltoid02_LA" boxsize:[2,2,2] - Bip01_L_clavicular_deltoid01_LA = dummy name:"_Bip01 L clavicular deltoid01_LA" boxsize:[2,2,2] - Bip01_L_rear_deltoid01_LA = dummy name:"_Bip01 L rear deltoid01_LA" boxsize:[2,2,2] - - Bip01_R_Clavicle_Con = dummy name:"_Bip01 R Clavicle_Con" pos:$'Bip01 R UpperArm'.transform.pos boxsize:[6,6,6] - Bip01_L_Clavicle_Con = dummy name:"_Bip01 L Clavicle_Con" pos:$'Bip01 L UpperArm'.transform.pos boxsize:[6,6,6] - - Bip01_R_Clavicle_Con.parent = $'Bip01 R Clavicle' - Bip01_L_Clavicle_Con.parent = $'Bip01 L Clavicle' - - - Bip01_R_knee_rotDif = dummy name:"_Bip01 R knee_rotDif" rotation:(inverse($'Bip01 R Calf'.transform.rotation)) pos:$'Bip01 R Calf'.transform.pos boxsize:[3,3,3] - Bip01_L_knee_rotDif = dummy name:"_Bip01 L knee_rotDif" rotation:$'Bip01 L Calf'.transform.rotation pos:$'Bip01 L Calf'.transform.pos boxsize:[3,3,3] - - Bip01_R_knee_rotDif.parent = $'Bip01 R Calf' - Bip01_L_knee_rotDif.parent = $'Bip01 L Calf' - - - - - Bip01_R_knee_Con = dummy name:"_Bip01 R knee_Con" pos:$'Bip01 R Thigh'.transform.pos boxsize:[3,3,3] - Bip01_L_knee_Con = dummy name:"_Bip01 L knee_Con" pos:$'Bip01 L Thigh'.transform.pos boxsize:[3,3,3] - - Bip01_R_knee_Con.parent = $'Bip01 R Thigh' - Bip01_L_knee_Con.parent = $'Bip01 L Thigh' - - - - - Bip01_R_rear_deltoid01_Con = dummy name:"_Bip01 R rear deltoid01_Con" boxsize:[3,3,3] - Bip01_R_rear_deltoid02_Con = dummy name:"_Bip01 R rear deltoid02_Con" boxsize:[3,3,3] - Bip01_R_clavicular_deltoid01_Con = dummy name:"_Bip01 R clavicular deltoid01_Con" boxsize:[3,3,3] - - Bip01_L_rear_deltoid01_Con = dummy name:"_Bip01 L rear deltoid01_Con" boxsize:[3,3,3] - Bip01_L_rear_deltoid02_Con = dummy name:"_Bip01 L rear deltoid02_Con" boxsize:[3,3,3] - Bip01_L_clavicular_deltoid01_Con = dummy name:"_Bip01 L clavicular deltoid01_Con" boxsize:[3,3,3] - - Bip01_R_rear_deltoid01_Con.position.controller = position_script() ; Bip01_R_rear_deltoid01_Con.position.controller.script = "RRear01 = (getVert $NanoSUIt 4068) if automateAnimateMuscles == undefined then ( with animate off $'_Bip01 R rear deltoid01_LA'.pos = RRear01 ) else ( if useMuscleKeys == undefined then ( with animate on $'_Bip01 R rear deltoid01_LA'.pos = RRear01 ) else RRear01 )" - Bip01_R_rear_deltoid02_Con.position.controller = position_script() ; Bip01_R_rear_deltoid02_Con.position.controller.script = "RRear02 = (getVert $NanoSUIt 4221) if automateAnimateMuscles == undefined then ( with animate off $'_Bip01 R rear deltoid02_LA'.pos = RRear02 ) else ( if useMuscleKeys == undefined then ( with animate on $'_Bip01 R rear deltoid02_LA'.pos = RRear02 ) else RRear02 )" - Bip01_R_clavicular_deltoid01_Con.position.controller = position_script() ; Bip01_R_clavicular_deltoid01_Con.position.controller.script = "RFront = (getVert $NanoSUIt 4064) if automateAnimateMuscles == undefined then ( with animate off $'_Bip01 R clavicular deltoid01_LA'.pos = RFront ) else ( if useMuscleKeys == undefined then ( with animate on $'_Bip01 R clavicular deltoid01_LA'.pos = RFront ) else RFront )" - - Bip01_L_rear_deltoid01_Con.position.controller = position_script() ; Bip01_L_rear_deltoid01_Con.position.controller.script = "LRear01 = (getVert $NanoSUIt 3809) if automateAnimateMuscles == undefined then ( with animate off $'_Bip01 L rear deltoid01_LA'.pos = LRear01 ) else ( if useMuscleKeys == undefined then ( with animate on $'_Bip01 L rear deltoid01_LA'.pos = LRear01 ) else LRear01 )" - Bip01_L_rear_deltoid02_Con.position.controller = position_script() ; Bip01_L_rear_deltoid02_Con.position.controller.script = "LRear02 = (getVert $NanoSUIt 3962) if automateAnimateMuscles == undefined then ( with animate off $'_Bip01 L rear deltoid02_LA'.pos = LRear02 ) else ( if useMuscleKeys == undefined then ( with animate on $'_Bip01 L rear deltoid02_LA'.pos = LRear02 ) else LRear02 )" - Bip01_L_clavicular_deltoid01_Con.position.controller = position_script() ; Bip01_L_clavicular_deltoid01_Con.position.controller.script = "LFront = (getVert $NanoSUIt 3805) if automateAnimateMuscles == undefined then ( with animate off $'_Bip01 L clavicular deltoid01_LA'.pos = LFront ) else ( if useMuscleKeys == undefined then ( with animate on $'_Bip01 L clavicular deltoid01_LA'.pos = LFront ) else LFront )" - - - - - Bip01_L_knee_Con.rotation.controller = rotation_script() ; Bip01_L_knee_Con.rotation.controller.script = "fn LKneeMuscles = ( LKneeOriginRot = (quat -0.461687 0.548192 -0.440465 -0.540667) ; LKneeOriginPos = [43.0243,-0.746225,0.291201] ; LrotDiff = (in coordsys $'Bip01 L Thigh' $'_Bip01 L knee_rotDif'.rotation) as eulerangles ; in coordsys $'Bip01 L Thigh' ( $'Bip01 L knee'.rotation = LKneeOriginRot ; $'Bip01 L knee'.pos = LKneeOriginPos ) in coordsys $'Bip01 L knee' (rotate $'Bip01 L knee' (eulerangles (LrotDiff.z / -2) 0 0)) ) if automateAnimateMuscles == undefined then ( with animate off LKneeMuscles() ) else ( if useMusclesKeys == undefined then ( with animate on LKneeMuscles() ) ) ; $'Bip01 L Thigh'.transform.rotation" - Bip01_R_knee_Con.rotation.controller = rotation_script() ; Bip01_R_knee_Con.rotation.controller.script = "fn RKneeMuscles = ( RKneeOriginRot = (quat -0.530717 -0.393879 0.549399 -0.511233) ; RKneeOriginPos = [43.0243,-0.746225,0.291201] ; RrotDiff = (in coordsys $'Bip01 R Thigh' $'_Bip01 R knee_rotDif'.rotation) as eulerangles ; in coordsys $'Bip01 R Thigh' ( $'Bip01 R knee'.rotation = RKneeOriginRot ; $'Bip01 R knee'.pos = RKneeOriginPos ) in coordsys $'Bip01 R knee' (rotate $'Bip01 R knee' (eulerangles (RrotDiff.z / -2) 0 0)) ) if automateAnimateMuscles == undefined then ( with animate off RKneeMuscles() ) else ( if useMusclesKeys == undefined then ( with animate on RKneeMuscles() ) ) ; $'Bip01 R Thigh'.transform.rotation" - - - - Bip01_R_Clavicle_Con.isHidden = true - Bip01_L_Clavicle_Con.isHidden = true - Bip01_R_knee_Con.isHidden = true - Bip01_L_knee_Con.isHidden = true - Bip01_R_knee_rotDif.isHidden = true - Bip01_L_knee_rotDif.isHidden = true - - Bip01_R_rear_deltoid01_Con.isHidden = true - Bip01_R_rear_deltoid02_Con.isHidden = true - Bip01_R_clavicular_deltoid01_Con.isHidden = true - - Bip01_L_rear_deltoid01_Con.isHidden = true - Bip01_L_rear_deltoid02_Con.isHidden = true - Bip01_L_clavicular_deltoid01_Con.isHidden = true - - - -- LOOKAT-SETUP -- - $'Bip01 R rear deltoid01'.transform = (matrix3 [0.800769,0.401167,0.444785] [-0.104045,-0.638128,0.762868] [0.589868,-0.657158,-0.469253] [-15.3582,10.8964,154.478]) - $'Bip01 R rear deltoid02'.transform = (matrix3 [0.864961,0.479963,0.14655] [0.0248794,-0.33268,0.942711] [0.501221,-0.811763,-0.299696] [-13.2617,14.8806,147.713]) - $'Bip01 R clavicular deltoid01'.transform = (matrix3 [0.879667,-0.134998,0.456029] [0.448849,-0.0813437,-0.889898] [0.157229, 0.987502,-0.0109619] [-11.1466,-5.93142,154.513]) - - - $'Bip01 L rear deltoid01'.transform = (matrix3 [0.800769,-0.401167,-0.444785] [-0.104045,0.638128,-0.762868] [0.589868,0.657159,0.469254] [15.3582,10.8963,154.478]) - $'Bip01 L rear deltoid02'.transform = (matrix3 [0.864962,-0.479963,-0.14655] [0.0248793,0.33268,-0.942712] [0.501221,0.811763,0.299697] [13.2617,14.8806,147.713]) - $'Bip01 L clavicular deltoid01'.transform = (matrix3 [0.879666,0.134998,-0.456029] [0.448849,0.0813439,0.889898] [0.157229,-0.987501,0.0109618] [11.1466,-5.93141,154.513]) - - - - - $'Bip01 R rear deltoid01'.rotation.controller = LookAt_constraint lookat_vector_length:0 upnode_world:false pickUpNode:$'_Bip01 R Clavicle_Con' relative:true - $'Bip01 R rear deltoid02'.rotation.controller = LookAt_constraint lookat_vector_length:0 upnode_world:false pickUpNode:$'_Bip01 R Clavicle_Con' relative:true - $'Bip01 R clavicular deltoid01'.rotation.controller = LookAt_constraint lookat_vector_length:0 upnode_world:false pickUpNode:$'_Bip01 R Clavicle_Con' relative:true - - $'Bip01 L rear deltoid01'.rotation.controller = LookAt_constraint lookat_vector_length:0 upnode_world:false pickUpNode:$'_Bip01 R Clavicle_Con' relative:true - $'Bip01 L rear deltoid02'.rotation.controller = LookAt_constraint lookat_vector_length:0 upnode_world:false pickUpNode:$'_Bip01 R Clavicle_Con' relative:true - $'Bip01 L clavicular deltoid01'.rotation.controller = LookAt_constraint lookat_vector_length:0 upnode_world:false pickUpNode:$'_Bip01 R Clavicle_Con' relative:true - - - - - $'Bip01 R rear deltoid01'.rotation.controller.appendTarget $'_Bip01 R rear deltoid01_LA' 100 - $'Bip01 R rear deltoid02'.rotation.controller.appendTarget $'_Bip01 R rear deltoid02_LA' 100 - $'Bip01 R clavicular deltoid01'.rotation.controller.appendTarget $'_Bip01 R clavicular deltoid01_LA' 100 - - $'Bip01 L rear deltoid01'.rotation.controller.appendTarget $'_Bip01 L rear deltoid01_LA' 100 - $'Bip01 L rear deltoid02'.rotation.controller.appendTarget $'_Bip01 L rear deltoid02_LA' 100 - $'Bip01 L clavicular deltoid01'.rotation.controller.appendTarget $'_Bip01 L clavicular deltoid01_LA' 100 - - ) - - completeRedraw() - - $Bip01.controller.figureMode = false - - if sliderTime != animationRange.end then - sliderTime += 1 - else - sliderTime -= 1 - - - sliderTime = saveSliderTime - - for obj in saveSelection do - selectMore obj - - ) - - ) - ) - else - ( - messageBox "No Bip01 in Scene" title:"Error Generating MuscleRig" - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.musclesRO.btnCreateMuscles.pressed" ) - ) -) -logOutput "> Created muscleRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row2 musclesRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 musclesRO rolledUp:true -) -catch ( logOutput "!!> Error adding musclesRO to main dialog" ) -musclesRO = undefined - - -logOutput ">> muscle.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/operation.ms b/Tools/maxscript/cryAnim/ui/main/operation.ms deleted file mode 100644 index 15d858c3a4..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/operation.ms +++ /dev/null @@ -1,332 +0,0 @@ ---############################################################################### - --// rollout to control several operations ---############################################################################### -rollout operationRO "Operation" -( - - button btnStart "Start" pos:[8,8] width:45 height:20 toolTip:"Sets the start time of process" - button btnStop "Stop" pos:[60,8] width:45 height:20 toolTip:"Sets the end time of process" - spinner spnBegin "" pos:[6,35] range:[0,9999,0] type:#integer fieldWidth:35 scale:1 - spinner spnEnd "" pos:[58,35] range:[0,9999,0] type:#integer fieldWidth:35 scale:1 - spinner spnSteps "" pos:[112,35] range:[0,50,1] type:#integer fieldWidth:25 scale:1 - label labSteps "Steps" pos:[115,12] - - --checkbox chkOnlyExistingKeys "Only existing Keys" pos:[8,60] enabled:false - label labSetRange "Set Range:" pos:[6,60] - button btnSetRangeSelection "Selection" pos:[70,57] height:20 width:50 - button btnSetRangeAll "All" pos:[123,57] height:20 width:30 - - groupBox gbOperation "Operation" pos:[2,80] width:153 height:77 - dropDownList ddOperation "" pos:[8,99] width:142 height:21 - label labOperation "To :" pos:[15,124] visible:false - label labDistanceDirection "" pos:[15,124] visible:false align:#left - dropDownList ddOperationTo "" pos:[8,140] width:142 height:21 visible:false - spinner spnDistance "" pos:[8,140] width:142 height:21 range:[-1000,1000,0] visible:false - spinner spnDirection "" pos:[8,140] width:142 height:21 range:[-360,360,180] visible:false - - button btnApply "Apply" pos:[8,129] width:33 height:20 toolTip:"Applies the Operation once" - button btnApplyBeginEnd "Start/Stop" pos:[46,129] width:59 height:20 toolTip:"Applies the Operation for the selected range" - button btnApplyRange "Range" pos:[110,129] width:39 height:20 toolTip:"Applies the Operation for the animation range" - - - - - - - - - on operationRO open do - ( - try - ( - try ( if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Operation" "").open = cryTools.cryAnim.base.iniFile #get #operationRO) catch() - - - operationRO.height = 161 - - ddOperation.items = cryTools.cryAnim.UI.main.operation._f.updateDialog output:#ddOp - ddOperationTo.items = cryTools.cryAnim.UI.main.operation._f.updateDialog output:#ddOpTo - spnBegin.value = animationRange.start.frame - spnEnd.value = animationRange.end.frame - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.open" ) - ) - - - on operationRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #operationRO) != value then - cryTools.cryAnim.base.iniFile #set #operationRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.rolledUp" ) - ) - - - on chkOnlyExistingKeys changed value do - ( - try - ( - spnSteps.enabled = not value - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.chkOnlyExistingKeys.changed" ) - ) - - - - on btnStart pressed do - ( - try - ( - spnBegin.value = sliderTime - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.btnStart.pressed" ) - ) - - on btnStop pressed do - ( - try - ( - spnEnd.value = sliderTime - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.btnStop.pressed" ) - ) - - - - on spnSteps changed value do - ( - try - ( - local diffStartEnd = spnEnd.value - spnBegin.value - if diffStartEnd < 0 then - diffStartEnd -= (diffStartEnd * 2) - - if value > diffStartEnd then - spnSteps.value = diffStartEnd - if spnSteps.value == 0 then spnSteps.value = 1 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.spnSteps.changed" ) - ) - - - on btnSetRangeSelection pressed do - ( - if selection.count > 0 then - ( - local firstKey = 0 - local lastKey = 0 - for obj in selection do - ( - if obj.classID[1] == 37157 then - ( - try - ( - local tempFirstKey = obj.transform.controller.keys[1].time.frame - if tempFirstKey < firstKey then - firstKey = tempFirstKey - )catch() - - try - ( - local tempLastkey = obj.transform.controller.keys[obj.transform.controller.keys.count].time.frame - if tempLastKey > lastKey then - lastKey = tempLastKey - )catch() - - ) - else - ( - - for i = 1 to 3 do - ( - try - ( - - local tempFirstKey = obj.controller[i].keys[1].time.frame - if tempFirstKey < firstKey then - firstKey = tempFirstKey - ) - catch() - - - try - ( - local tempLastkey = obj.controller[i].keys[obj.controller[i].keys.count].time.frame - if tempLastKey > lastKey then - lastKey = tempLastKey - ) - catch() - ) - ) - ) - - if firstKey != lastKey then - animationRange = interval firstKey lastKey - else - print "Error setting new Range" - ) - else - print "Nothing selected." - - ) - - - - on btnSetRangeAll pressed do - ( - local firstKey = 0 - local lastKey = 0 - for obj in Objects do - ( - if obj.classID[1] == 37157 then - ( - try - ( - local tempFirstKey = obj.transform.controller.keys[1].time.frame - if tempFirstKey < firstKey then - firstKey = tempFirstKey - )catch() - - try - ( - local tempLastkey = obj.transform.controller.keys[obj.transform.controller.keys.count].time.frame - if tempLastKey > lastKey then - lastKey = tempLastKey - )catch() - - ) - else - ( - - for i = 1 to 3 do - ( - try - ( - - local tempFirstKey = obj.controller[i].keys[1].time.frame - if tempFirstKey < firstKey then - firstKey = tempFirstKey - ) - catch() - - - try - ( - local tempLastkey = obj.controller[i].keys[obj.controller[i].keys.count].time.frame - if tempLastKey > lastKey then - lastKey = tempLastKey - ) - catch() - ) - ) - ) - - if firstKey != lastKey then - animationRange = interval firstKey lastKey - else - print "Error setting new Range" - - ) - - - - on ddOperation selected value do - ( - try - ( - case value of - ( - 4: ddOperation.selection -= 1 - 7: ddOperation.selection -= 1 - 11: ddOperation.selection -= 1 - ) - cryTools.cryAnim.UI.main.operation._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.ddOperation.selected" ) - ) - - - - - on btnApply pressed do - ( - try - ( - cryTools.cryAnim.UI.main.operation._f.applyOperation ddOperation.selection ddOperationTo.selection sliderTime.frame sliderTime.frame 1 - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.btnApply.pressed" ) - ) - - on btnApplyBeginEnd pressed do - ( - try - ( - if spnBegin.value == spnEnd.value then - ( - messageBox ("'Start' must be unequal to 'End'") title:"Begin/End Operation" - return false - ) - - if spnBegin.value > spnEnd.value then - ( - tempValue = spnBegin.value - spnBegin.value = spnEnd.value - spnEnd.value = tempValue - ) - - local diffBeginEnd = spnEnd.value - spnBegin.value - if diffBeginEnd < 0 then - diffBeginEnd -= (diffBeginEnd * 2) - - if spnSteps.value > diffBeginEnd then - spnSteps.value = diffBeginEnd - - undo "BeginEndOperation" on - ( - local tempAnimationRange = animationRange - animationRange = interval spnBegin.value spnEnd.value - - local tempBool = cryTools.cryAnim.UI.main.operation._f.applyOperation ddOperation.selection ddOperationTo.selection spnBegin.value spnEnd.value spnSteps.value - if tempBool != false then - cryTools.cryAnim.UI.main.operation._f.applyOperation ddOperation.selection ddOperationTo.selection spnEnd.value spnEnd.value 1 - - animationRange = tempAnimationRange - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.btnApplyBeginEnd.pressed" ) - ) - - - on btnApplyRange pressed do - ( - try - ( - undo "RangeOperation" on - ( - tempBool = cryTools.cryAnim.UI.main.operation._f.applyOperation ddOperation.selection ddOperationTo.selection animationRange.start.frame animationRange.end.frame spnSteps.value - if tempBool != false then - cryTools.cryAnim.UI.main.operation._f.applyOperation ddOperation.selection ddOperationTo.selection animationRange.end.frame animationRange.end.frame 1 - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.operationRO.btnApplyRange.pressed" ) - ) -) -logOutput "> Created operationRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 operationRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 operationRO -) -catch ( logOutput "!!> Error adding operationRO to main dialog" ) -operationRO = undefined - - -logOutput ">> operation.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/perforce.ms b/Tools/maxscript/cryAnim/ui/main/perforce.ms deleted file mode 100644 index 10f1cdf5d5..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/perforce.ms +++ /dev/null @@ -1,154 +0,0 @@ ---############################################################################### - --// rollout with all the file control _f like Load Biped File, Save, Export etc. ---############################################################################### -rollout perforceRO "Perforce" -( - timer clock interval:0 active:false - - checkbox chkAutoUpdate "AutoUpdate" pos:[8,8] checked:true - spinner spnAutoUpdateTime "Time " pos:[104,8] range:[0,999,0] width:50 scale:1 type:#integer - - groupBox grpOpen " Open For Edit " pos:[2,33] width:153 height:120 - - label labOpenY "Yes" pos:[82,53] - label labOpenN "No" pos:[107,53] - label labOpenA "Ask" pos:[129,53] - - label labOpenLoad "Load" pos:[14,68] - label labOpenSave "Save" pos:[14,88] - label labOpenExport "Export" pos:[14,108] - label labOpenSaveExport "Save/Export" pos:[14,128] - - radiobuttons radLoadOpen pos:[85,68] labels:#("","","") columns:3 default:3 - radiobuttons radSaveOpen pos:[85,88] labels:#("","","") columns:3 default:3 - radiobuttons radExportOpen pos:[85,108] labels:#("","","") columns:3 default:3 - radiobuttons radSaveExportOpen pos:[85,128] labels:#("","","") columns:3 default:3 - - groupBox grpAdd " Add to Source Control " pos:[2,163] width:153 height:100 - - label labAddY "Yes" pos:[82,183] - label labAddN "No" pos:[107,183] - label labAddA "Ask" pos:[129,183] - - label labAddSave "Save" pos:[14,198] - label labAddExport "Export" pos:[14,218] - label labAddSaveExport "Save/Export" pos:[14,238] - - radiobuttons radSaveAdd pos:[85,198] labels:#("","","") columns:3 default:3 - radiobuttons radExportAdd pos:[85,218] labels:#("","","") columns:3 default:3 - radiobuttons radSaveExportAdd pos:[85,238] labels:#("","","") columns:3 default:3 - - - - on perforceRO open do - ( - try - ( - try ( if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Perforce" "").open = cryTools.cryAnim.base.iniFile #get #perforceRO) catch() - - try chkAutoUpdate.checked = cryTools.cryAnim.base.iniFile #get #autoUpdate catch() - spnAutoUpdateTime.enabled = chkAutoUpdate.checked - try spnAutoUpdateTime.value = cryTools.cryAnim.base.iniFile #get #autoUpdateTime catch() - clock.interval = spnAutoUpdateTime.value * 60000 - - try radLoadOpen.state = cryTools.cryAnim.base.iniFile #get #loadOpen catch() - try radSaveOpen.state = cryTools.cryAnim.base.iniFile #get #saveOpen catch() - try radExportOpen.state = cryTools.cryAnim.base.iniFile #get #exportOpen catch() - try radSaveExportOpen.state = cryTools.cryAnim.base.iniFile #get #saveExportOpen catch() - - try radSaveAdd.state = cryTools.cryAnim.base.iniFile #get #saveAdd catch() - try radExportAdd.state = cryTools.cryAnim.base.iniFile #get #exportAdd catch() - try radSaveExportAdd.state = cryTools.cryAnim.base.iniFile #get #saveExportAdd catch() - - clock.active = chkAutoUpdate.checked - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.perforceRO.open" ) - ) - - - on perforceRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #perforceRO) != value then - cryTools.cryAnim.base.iniFile #set #perforceRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.perforceRO.rolledUp" ) - ) - - - on chkAutoUpdate changed value do - ( - try - ( - clock.active = value - spnAutoUpdateTime.enabled = value - cryTools.cryAnim.base.iniFile #set #autoUpdate - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.perforceRO.chkAutoUpdate.changed" ) - ) - - on clock tick do - ( - try - ( - if spnAutoUpdateTime.value > 0 then - if (local tempVar = cryTools.cryAnim.base.perforce "" #checkLoading) != false then - if cryTools.suppressWarnings == false then - cryTools.cryAnim.base.perforce tempVar #messageOnUpdate - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.perforceRO.clock" ) - ) - - - - on spnAutoUpdateTime changed value do - ( - try - ( - clock.interval = value * 60000 - cryTools.cryAnim.base.iniFile #set #autoUpdateTime - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.perforceRO.spnAutoUpdateTime.changed" ) - ) - - - - on radLoadOpen changed value do - cryTools.cryAnim.base.iniFile #set #loadOpen - - on radSaveOpen changed value do - cryTools.cryAnim.base.iniFile #set #saveOpen - - on radExportOpen changed value do - cryTools.cryAnim.base.iniFile #set #exportOpen - - on radSaveExportOpen changed value do - cryTools.cryAnim.base.iniFile #set #saveExportOpen - - on radSaveAdd changed value do - cryTools.cryAnim.base.iniFile #set #saveAdd - - on radExportAdd changed value do - cryTools.cryAnim.base.iniFile #set #exportAdd - - on radSaveExportAdd changed value do - cryTools.cryAnim.base.iniFile #set #saveExportAdd -) -logOutput "> Created perforceRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row4 perforceRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 perforceRO rolledUp:true -) -catch ( logOutput "!!> Error adding perforceRO to main dialog" ) -perforceRO = undefined - - -logOutput ">> perforce.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/pivot.ms b/Tools/maxscript/cryAnim/ui/main/pivot.ms deleted file mode 100644 index c56036ee07..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/pivot.ms +++ /dev/null @@ -1,155 +0,0 @@ ---############################################################################### - --// rollout with elements to control the pivot align _f ---############################################################################### -rollout pivotRO "Pivot" -( - button btnPivotSelect "Select Pivot" pos:[8,8] width:142 height:20 toolTip:"Creates pivot point selection tool" - groupBox grpPivPos "Pivot Point" pos:[2,38] width:153 height:50 - button btnCreatePivPoint "Create" pos:[8,60] width:65 height:20 toolTip:"Creates pivot point on the selected node" - button btnDeletePivPoint "Delete" pos:[83,60] width:65 height:20 toolTip:"Deletes pivot point of the selected node" - - groupBox gbSnapshot " Snapshot " pos:[2,100] width:153 height:50 - - button btnSingleSnapshot "Single" pos:[8,123] width:66 height:20 toolTip:"Creates snapshot of the current selection" - button btnChildrenSnapshot "+ Children" pos:[84,123] width:66 height:20 toolTip:"Creates grouped snapshot of the current selection with children" - - - on pivotRO open do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then - (cryTools.cryAnim.UI.main._f.getUI "Pivot" "").open = cryTools.cryAnim.base.iniFile #get #pivotRO - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.pivotRO.open" ) - ) - - - - on pivotRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #pivotRO) != value then - cryTools.cryAnim.base.iniFile #set #pivotRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.pivotRO.rolledUp" ) - ) - - - - on btnPivotSelect pressed do - ( - try - ( - if (local selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() ) != undefined then - ( - if selectedBipPart.object.isPivot == true then - ( - undo off - cryTools.cryAnim.align._f.callPivotSelect() - ) - else - print "Pivot Selection not available for this Object" - ) - else - ( - if selection.count > 0 then - print "No Biped Object selected." - else - print "Nothing selected." - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.pivotRO.btnPivotSelect.pressed" ) - ) - - - on btnCreatePivPoint pressed do - ( - try - ( - if (selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() ) != undefined then - ( - if selectedBipPart.pivotSel.index == undefined then - messageBox "Select a Pivot first" title:"Pivot Point" beep:false - else - if (cryTools.cryAnim.UI.main.pivot._f.pivotPoint #check) == true then - ( - if (queryBox "Set new Pivot Point?" title:"Pivot Point" beep:false) == true then - if (cryTools.cryAnim.UI.main.pivot._f.pivotPoint #delete) == true then - cryTools.cryAnim.UI.main.pivot._f.pivotPoint #create - ) - else - cryTools.cryAnim.UI.main.pivot._f.pivotPoint #create - ) - else - ( - if selection.count > 0 then - print "No Biped Object selected." - else - print "Nothing selected" - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.pivotRO.btnCreatePivPoint.pressed" ) - ) - - on btnDeletePivPoint pressed do - ( - try - ( - if (selectedBipPart = cryTools.cryAnim._f.getSelectedBipPart() ) != undefined then - if selectedBipPart.pivotSel.pivPoint.name != undefined then - if (queryBox "Delete Pivot Point?" title:"Pivot Point" beep:false) == true then - cryTools.cryAnim.UI.main.pivot._f.pivotPoint #delete - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.pivotRO.btnDeletePivPoint.pressed" ) - ) - - on btnSingleSnapshot pressed do - ( - try - ( - with animate off - ( - if cryTools.cryAnim._f.createSnapshot() == undefined then - print "Nothing selected" - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.pivotRO.btnSingleSnapshot.pressed" ) - ) - - on btnChildrenSnapshot pressed do - ( - try - ( - with animate off - ( - local baseArray = cryTools.cryAnim._f.createSnapshot children:true - - if baseArray == undefined then - print "Nothing selected" - else - group baseArray prefix:"Snapshot_" - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.pivotRO.btnChildrenSnapshot.pressed" ) - ) -) -logOutput "> Created pivotRO rollout" - - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 pivotRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 pivotRO -) -catch ( logOutput "!!> Error adding pivotRO to main dialog" ) -pivotRO = undefined - - -logOutput ">> pivot.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/pose.ms b/Tools/maxscript/cryAnim/ui/main/pose.ms deleted file mode 100644 index 131d46c6d0..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/pose.ms +++ /dev/null @@ -1,307 +0,0 @@ ---############################################################################### - --// rollout with elements to control the locator ---############################################################################### -rollout poseRO "Pose Manager" -( - groupbox gbCharacters " Characters " pos:[2,5] width:153 height:43 - editText edCharacter "" pos:[29,22] width:80 height:17 - dropdownlist ddCharacter "" pos:[32,20] width:94 height:10 - button btnCreateCharacter "" pos:[8,20] width:21 height:21 images:#((getDir #maxroot + "UI\\Icons\\ParameterCollector_i.bmp"), undefined, 28,6,6,20,20) width:29 height:29 toolTip:"Creates a new Character" - button btnDeleteCharacter "" pos:[128,20] width:21 height:21 images:#((getDir #maxroot + "UI\\Icons\\ParameterCollector_i.bmp"), undefined, 28,8,8,17,17) width:29 height:29 toolTip:"Deletes selected Character" - - - groupbox gbCollections " Collections " pos:[2,55] width:153 height:43 - editText edCollection "" pos:[29,72] width:80 height:17 - dropdownlist ddCollection "" pos:[32,70] width:94 height:10 - button btnCreateCollection "" pos:[8,70] width:21 height:21 images:#((getDir #maxroot + "UI\\Icons\\ParameterCollector_i.bmp"), undefined, 28,6,6,20,20) width:29 height:29 toolTip:"Creates a new Collection" - button btnDeleteCollection "" pos:[128,70] width:21 height:21 images:#((getDir #maxroot + "UI\\Icons\\ParameterCollector_i.bmp"), undefined, 28,8,8,17,17) width:29 height:29 toolTip:"Deletes selected Collection" - - - groupbox gbPoses " Poses " pos:[2,105] width:153 height:63 - editText edPose "" pos:[29,122] width:80 height:17 - dropdownlist ddPose "" pos:[32,120] width:94 height:20 - button btnCreatePose "" pos:[8,120] width:21 height:21 images:#((getDir #maxroot + "UI\\Icons\\ParameterCollector_i.bmp"), undefined, 28,6,6,20,20) width:29 height:29 toolTip:"Creates a new Pose" - button btnDeletePose "" pos:[128,120] width:21 height:21 images:#((getDir #maxroot + "UI\\Icons\\ParameterCollector_i.bmp"), undefined, 28,8,8,17,17) width:29 height:29 toolTip:"Deletes selected Pose" - button btnPastePose "Paste" pos:[38,145] width:80 height:20 - - - groupbox gbPaste " Paste " pos:[2,185] width:153 height:75 - checkbox chkPastePosition "Position" pos:[12,200] checked:true - checkbox chkPasteRotation "Rotation" pos:[12,220] checked:true - checkbox chkControllerValue "Controller Value" pos:[12,240] checked:true - checkbox chkBoneOnly "Nodes Only" pos:[76,200] width:75 - checkbox chkByVelocity "By Velocity" pos:[76,220] - - - groupbox gbPreview " Preview " pos:[2,273] width:153 height:150 - bitmap bmpPreview "" pos:[7,289] width:144 height:110 - checkbox chkNodesOnly "Only Nodes visible" pos:[12,403] checked:true - - groupbox gbNodes " Nodes " pos:[2,435] width:153 height:169 - multilistbox lbNodes "" pos:[7,455] width:143 height:9 - button btnAddNode "Add" pos:[7,578] width:72 height:20 toolText:"Adds new node to the list" - button btnDeleteNode "Delete" pos:[79,578] width:71 height:20 toolText:"Deletes selected node/s" - - - - - - - - - on poseRO open do - ( - try - ( - try ( if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Pose Manager" "").open = cryTools.cryAnim.base.iniFile #get #poseRO) catch() - - cryTools.cryAnim.UI.main.poseManager._f.inputINI() - cryTools.cryAnim.UI.main.poseManager._f.updateList #character initial:true - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.open" ) - ) - - - on poseRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #poseRO) != value then - cryTools.cryAnim.base.iniFile #set #poseRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.rolledUp" ) - ) - - - - - on ddCharacter selected value do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.updateList #character - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.ddCharacter.selected" ) - ) - - - on ddCollection selected value do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.updateList #collection - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.ddCollection.selected" ) - ) - - - on ddPose selected value do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.updateList #default - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.ddPose.selected" ) - ) - - - on btnCreateCharacter pressed do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.createEntry "Character" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnCreateCharacter.pressed" ) - ) - - - on btnDeleteCharacter pressed do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.deleteEntry "Character" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnDeleteCharacter.pressed" ) - ) - - on btnCreateCollection pressed do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.createEntry "Collection" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnCreateCollection.pressed" ) - ) - - on btnDeleteCollection pressed do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.deleteEntry "Collection" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnDeleteCollection.pressed" ) - ) - - on btnCreatePose pressed do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.createEntry "Pose" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnCreatePose.pressed" ) - ) - - on btnDeletePose pressed do - ( - try - ( - cryTools.cryAnim.UI.main.poseManager._f.deleteEntry "Pose" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnDeletePose.pressed" ) - ) - - on edCharacter changed value do - ( - try - ( - if ddCharacter.items.count > 0 then - ( - cryTools.cryAnim.UI.main.poseManager._f.renameEntry "Character" - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.edCharacter.changed" ) - ) - - - - on edCollection changed value do - ( - try - ( - if ddCollection.items.count > 0 then - ( - cryTools.cryAnim.UI.main.poseManager._f.renameEntry "Collection" - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.edCollection.changed" ) - ) - - - - on edPose changed value do - ( - try - ( - if ddPose.items.count > 0 then - ( - cryTools.cryAnim.UI.main.poseManager._f.renameEntry "Pose" - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.edPose.changed" ) - ) - - - - on btnPastePose pressed do - ( - try - ( - if ddPose.items.count > 0 then - ( - undo "Paste Pose" on - cryTools.cryAnim.UI.main.poseManager._f.applyPose() - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnPastePose.pressed" ) - ) - - - - on btnAddNode pressed do - ( - try - ( - if ddCharacter.items.count > 0 then - ( - if selection.count == 0 then - local tempVar = selectByName title:"Add Character Nodes" showHidden:true single:false --filter:filterNodes --// somehow crashes max... - else - local tempVar = getCurrentSelection() - - if classOf tempVar == Array and tempVar.count > 0 then - ( - local tempArray = cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].nodes - for i = 1 to tempVar.count do - if (findItem tempArray tempVar[i].name) == 0 then - append tempArray tempVar[i].name - - tempArray = cryTools.sortRootChildren tempArray - - lbNodes.items = tempArray - cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].nodes = tempArray - - cryTools.cryAnim.UI.main.poseManager._f.outputINI() - ) - else - messageBox "No nodes selected." title:"Error Adding Nodes" - - ) - else - messageBox "No Character in List " title:"Error adding Nodes" - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnAddNode.pressed" ) - ) - - - - on btnDeleteNode pressed do - ( - try - ( - if lbNodes.items.count > 0 then - ( - local poses = cryTools.cryAnim.UI.main.poseManager._v.poses - local saveSelection = lbNodes.selection as Array - local newSelection = (lbNodes.selection as Array)[1] - - lbNodes.selection = #{newSelection} - if newSelection == lbNodes.items.count then lbNodes.selection = #{lbNodes.items.count - 1} - if newSelection == 0 then lbNodes.selection = #{1} - - local newList = #() - local tempArray = cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].nodes - for i = 1 to tempArray.count do - if (findItem saveSelection i) == 0 then - append newList tempArray[i] - - if newList.count > 1 then - newList = cryTools.sortRootChildren newList - - - - lbNodes.items = newList - cryTools.cryAnim.UI.main.poseManager._v.poses[ddCharacter.selection].nodes = newList - - cryTools.cryAnim.UI.main.poseManager._f.outputINI() - ) - ) - catch ( logOutput "!!> Error in cryAnim.UI.main.dialog.poseRO.btnDeleteNode.pressed" ) - ) -) -logOutput "> Created poseRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row3 poseRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 poseRO rolledUp:true -) -catch ( logOutput "!!> Error adding poseRO to main dialog" ) -poseRO = undefined - - -logOutput ">> pose.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/save.ms b/Tools/maxscript/cryAnim/ui/main/save.ms deleted file mode 100644 index 6e3a8e202f..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/save.ms +++ /dev/null @@ -1,711 +0,0 @@ ---############################################################################### - --// rollout with all the file control _f like Load Biped File, Save, Export etc. ---############################################################################### -rollout loadSaveRO "Load / Save / Export" -( - groupBox gbLoad " Load " pos:[2,8] width:153 height:50 - button btnLoad "Load Biped File" pos:[8,31] width:142 height:20 toolTip:"Loads biped file from the working directory or last used file" - - groupBox gbSave " Save / Export " pos:[2,70] width:153 height:315 - - button btnBegin "Start" pos:[8,92] width:46 height:20 toolTip:"Sets the start time to save/export" - button btnEnd "End" pos:[60,92] width:46 height:20 toolTip:"Sets the end time to save/export" - button btnRange "Range" pos:[110,92] width:40 height:20 toolTip:"Sets the range for save/export" - button btnAll "All" pos:[110,113] width:40 height:20 toolTip:"Sets the animation range for save/export" - - spinner spnBegin "" pos:[6,113] range:[0,9999,0] type:#integer fieldWidth:36 - spinner spnEnd "" pos:[58,113] range:[0,9999,0] type:#integer fieldWidth:36 - - - checkbox chkGlobalHuman " GlobalHuman.cal" pos:[12,140] tooltip:"Creates entry in GlobalHuman.cal" checked:false enabled:false - - button btnExportAdd "Add" pos:[8,165] width:66 height:20 toolTip:"Adds a new node to the exporter list" - button btnExportDelete "Delete" pos:[84,165] width:66 height:20 enabled:false toolTip:"Deletes selected node from the exporter list" - listbox lbExport "" pos:[8,190] width:142 height:2 items:#("Bip01") selection:0 enabled:false - - button btnSave "Save" pos:[8,235] width:66 height:20 toolTip:"Saves the biped file" - button btnExport "Export" pos:[84,235] width:66 height:20 toolTip:"Exports to .caf" - button btnSaveExport "Save / Export" pos:[8,265] width:142 height:20 toolTip:"Saves to biped file and exports to .caf" - button btnBatchProcess "Batch Process" pos:[8,360] width:142 height:20 toolTip:"Opens the Batch Process" - - listbox lbStatus "" pos:[8,290] width:142 height:4 - listbox lbStatusFilepath "" pos:[0,0] width:1 height:1 visible:false - - - - on loadSaveRO open do - ( - try - ( - try (if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "").open = cryTools.cryAnim.base.iniFile #get #loadSaveRO) catch() - try cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath = cryTools.cryAnim.base.iniFile #get #loadBiped catch() - - spnBegin.value = animationRange.start.frame - spnEnd.value = animationRange.end.frame - if $Bip01 != undefined then - ( - lbExport.items = #($Bip01.name) - lbExport.selection = 0 - ) - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.open" ) - ) - - on loadSaveRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #loadSaveRO) != value then - cryTools.cryAnim.base.iniFile #set #loadSaveRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.rolledUp" ) - ) - - - - on btnBegin pressed do - ( - try - spnBegin.value = sliderTime - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnBegin.pressed" ) - ) - - on btnEnd pressed do - ( - try - spnEnd.value = sliderTime - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnEnd.pressed" ) - ) - - - on btnRange pressed do - ( - try - ( - spnBegin.value = animationRange.start.frame - spnEnd.value = animationRange.end.frame - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnRange.pressed" ) - ) - - on btnAll pressed do - ( - try - ( - baseBip = cryTools.cryAnim._f.getBaseBip() - if baseBip != undefined then - ( - tempInterval = biped.getCurrentRange baseBip.controller - - spnBegin.value = tempInterval.start.frame - spnEnd.value = tempInterval.end.frame - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnAll.pressed" ) - ) - - on btnExportAdd pressed do - ( - try - ( - if $selection.count > 0 then - ( - local tempArray = lbExport.items - - for obj in $selection do - ( - local exist = false - for i = 1 to lbExport.items.count do - if obj.name == lbExport.items[i] then - exist = true - - if exist == false then - append tempArray obj.name - - ) - - sort tempArray - lbExport.items = tempArray - if tempArray.count > 1 then - - - if tempArray.count > 1 then - ( - local tempInt = findItem tempArray "Bip01" - if tempInt != 0 then - ( - deleteItem tempArray tempInt - lbExport.enabled = true - ) - - lbExport.items = tempArray - - lbExport.selection = 0 - btnExportDelete.enabled = false - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnExportAdd.pressed" ) - ) - - on btnExportDelete pressed do - ( - try - ( - if lbExport.selection > 0 then - ( - local tempArray = lbExport.items - deleteItem tempArray lbExport.selection - sort tempArray - lbExport.items = tempArray - ) - if lbExport.items.count == 0 then - lbExport.items = #($Bip01.name) - - if lbExport.items[1] == "Bip01" then - lbExport.enabled = false - else - lbExport.enabled = true - - lbExport.selection = 0 - btnExportDelete.enabled = false - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnExportDelete.pressed" ) - ) - - on lbExport selected value do - ( - try - ( - if lbExport.items.count <= 1 and lbExport.items[1] == "Bip01" then - ( - lbExport.selection = 0 - btnExportDelete.enabled = false - ) - else - btnExportDelete.enabled = true - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.lbExport.selected" ) - ) - - - on btnLoad pressed do - ( - try - ( - local baseBip = cryTools.cryAnim._f.getBaseBip op:#load - local loadedBiped = undefined - - if baseBip != undefined then - ( - if cryTools.cryAnim.UI.batchProcess._v.fileQue == undefined then - filepath = getOpenFileName filename:cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath types:"Biped (*.bip)|*.bip" - else - filepath = cryTools.cryAnim.UI.batchProcess._v.fileQue - - if filepath != undefined then - ( - tempStatus = undefined - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radLoadOpen").state of - ( - 1: tempStatus = cryTools.cryAnim.base.perforce filepath #open - 2: tempStatus = false - 3: tempStatus = cryTools.cryAnim.base.perforce filepath #checkForLoad - ) - ) - else - tempStatus = false - - if tempStatus != undefined then - ( - local tempFilterFilename = cryTools.cryAnim.base.perforce filepath #getFilename - local tempUndoString = ("L - " + cryTools.cryAnim.base.perforce filepath #getFilename) - undo tempUndoString on - ( - if (loadedBiped = biped.loadBipFile baseBip.controller filepath) == true then - ( - cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath = filepath - cryTools.cryAnim.UI.main.loadSave._v.bipSavePath = filepath - - cryTools.cryAnim.base.iniFile #set #loadBiped - - if (exportPath = cryTools.cryAnim.UI.main._f.checkExport #ProductionToGame filepath) != false then - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = exportPath - - --cryTools.cryAnim.UI.checkExport #createFolder exportPath - - tempInterval = biped.getCurrentRange baseBip.controller - if tempInterval.start == tempInterval.end then - tempInterval.end += 1 - - spnBegin.value = tempInterval.start.frame - spnEnd.value = tempInterval.end.frame - - animationRange = tempInterval - - try (animationRange = biped.getCurrentRange baseBip.controller) catch ( ) - - local itemFound = false - for i = 1 to cryTools.cryAnim.UI.main.models._v.itemList.count do - ( - if (findString filepath cryTools.cryAnim.UI.main.models._v.itemList[i].external) != undefined then - ( - cryTools.cryAnim.UI.main.models._f.selectItem i #set - itemFound = true - ) - ) - if itemFound == false then - cryTools.cryAnim.UI.main.models._f.selectItem 1 #set - - - - tempArray = lbStatus.items - - tempStatusString = "" - if tempStatus == true then - tempStatusString = "L+o" - else - tempStatusString = "L" - - append tempArray (tempStatusString + " - " + tempFilterFilename) - - lbStatus.items = tempArray - lbStatus.selection = tempArray.count - - tempFileArray = lbStatusFilepath.items - append tempFileArray filepath - lbStatusFilepath.items = tempFileArray - - - ) - ) - ) - ) - return #(true, loadedBiped) - ) - else - return #(false, loadedBiped) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnLoad.pressed" ) - ) - - on btnSave pressed do - ( - try - ( - with undo off - ( - local baseBip = cryTools.cryAnim._f.getBaseBip() - if baseBip != undefined then - ( - if cryTools.cryAnim.UI.main.loadSave._v.bipSavePath == (cryTools.cryAnim.UI.main._v.bipWorkingDir + "*.bip") or ((cryTools.cryAnim.UI.main._f.getUI "Settings" "radSavePrompt").state == 1) then - filepath = getSaveFileName filename:cryTools.cryAnim.UI.main.loadSave._v.bipSavePath types:"Biped (*.bip)|*.bip" - else - filepath = cryTools.cryAnim.UI.main.loadSave._v.bipSavePath - - - if filepath != undefined then - ( - local tempFilterFilename = filterString filepath "\\" ; tempFilterFilename = tempFilterFilename[tempFilterFilename.count] - local tempBool = true - - local tempStatus = undefined - - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveOpen").state of - ( - 1: tempStatus = cryTools.cryAnim.base.perforce filepath #open - 2: ( tempStatus = false ; cryTools.cryAnim.base.perforce filepath #setReadMessage ) - 3: tempStatus = cryTools.cryAnim.base.perforce filepath #checkForSave - ) - ) - else - tempStatus = false - - if tempStatus != undefined then - ( - if (animationRange.start != spnBegin.value) or (animationRange.end != spnEnd.value) then - ( - tempInterval = cryTools.cryAnim.UI.main.loadSave._f.checkRange spnBegin.value spnEnd.value - spnBegin.value = tempInterval.start - spnEnd.value = tempInterval.end - ) - - tempBool = biped.saveBipFileSegment baseBip.controller filepath spnBegin.value spnEnd.value #keyPerFrame - - cryTools.cryAnim.UI.main.loadSave._v.bipSavePath = filepath - cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath = filepath - - if (exportPath = cryTools.cryAnim.UI.main._f.checkExport #ProductionToGame filepath) != false then - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = exportPath - - tempArray = lbStatus.items - - local tempStatusString = "" - if tempStatus == true then - tempStatusString = "S+o" - else - tempStatusString = "S" - - append tempArray (tempStatusString + " - " + tempFilterFilename) - lbStatus.items = tempArray - lbStatus.selection = tempArray.count - - tempFileArray = lbStatusFilepath.items - append tempFileArray filepath - lbStatusFilepath.items = tempFileArray - - if (cryTools.cryAnim.UI.main._f.checkExport #save filepath) == true then - ( - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveAdd").state of - ( - 1: cryTools.cryAnim.base.perforce filepath #add - 3: cryTools.cryAnim.base.perforce filepath #checkForAdd - ) - ) - ) - ) - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnSave.pressed" ) - ) - - - - - - - - on btnExport pressed do - ( - try - ( - local baseBip = cryTools.cryAnim._f.getBaseBip() - if baseBip != undefined then - ( - - if (cryTools.cryAnim.UI.main.loadSave._v.cafSavePath == (crytools.BuildPathFull + "Game\Animations\human\*.caf")) or ((cryTools.cryAnim.UI.main._f.getUI "Settings" "radExportPrompt").state == 1) then - filepath = getSaveFileName filename:cryTools.cryAnim.UI.main.loadSave._v.cafSavePath types:"Crytek Bone Animation File (*.caf)|*.caf" - else - filepath = cryTools.cryAnim.UI.main.loadSave._v.cafSavePath - - - - - if filepath != undefined then - ( - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = filepath - - if (cryTools.cryAnim.UI.main._f.checkExport #export filepath) == true then - ( - local tempStatus = undefined - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radExportOpen").state of - ( - 1: tempStatus = cryTools.cryAnim.base.perforce filepath #open - 2: ( tempStatus = false ; cryTools.cryAnim.base.perforce filepath #setReadMessage ) - 3: tempStatus = cryTools.cryAnim.base.perforce filepath #checkForSave - ) - ) - else - tempStatus = false - - if tempStatus != undefined then - ( - try( if $'Bip01 R ForeTwist'.parent != $'Bip01 R Forearm' then $'Bip01 R ForeTwist'.parent = $'Bip01 R Forearm' ) catch() - try( if $'Bip01 L ForeTwist'.parent != $'Bip01 L Forearm' then $'Bip01 L ForeTwist'.parent = $'Bip01 L Forearm' ) catch() - - try (cryTools.cryAnim.UI.main.loadSave._f.bakeMuscleBones() ) catch() - - local tempMode = getCommandPanelTaskMode() - UtilityPanel.OpenUtility CryEngine2_Exporter - local boneList = #() - for i = 1 to lbExport.items.count do - append boneList (getNodeByName lbExport.items[i]) - - csexport.set_bone_list boneList - local tempBool = (csexport.export.export_anim filepath) - while tempBool != OK do ( escapeEnable = true ; sleep 0.1 ) - - local tempFilterFilename = filterString filepath "\\" - - tempArray = lbStatus.items - tempStatusString = "" - if tempStatus == true then - tempStatusString = "E+o" - else - tempStatusString = "E" - - append tempArray (tempStatusString + " - " + tempFilterFilename[tempFilterFilename.count]) - lbStatus.items = tempArray - lbStatus.selection = tempArray.count - - tempFileArray = lbStatusFilepath.items - append tempFileArray filepath - lbStatusFilepath.items = tempFileArray - - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = filepath - setCommandPanelTaskMode mode:tempMode - - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radExportAdd").state of - ( - 1: cryTools.cryAnim.base.perforce filepath #add - 3: cryTools.cryAnim.base.perforce filepath #checkForAdd - ) - ) - ) - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnExport.pressed" ) - ) - - on btnSaveExport pressed do - ( - try - ( - baseBip = cryTools.cryAnim._f.getBaseBip() - if baseBip != undefined then - ( - if (cryTools.cryAnim.UI.main.loadSave._v.bipSavePath == (substring crytools.BuildPathFull 1 (crytools.BuildPathFull.count - 1)) + "_Production\Art\Animation\Human\*.bip") or ((cryTools.cryAnim.UI.main._f.getUI "Settings" "radSaveExportPrompt").state == 1) then - filepath = getSaveFileName filename:cryTools.cryAnim.UI.main.loadSave._v.bipSavePath types:"Biped (*.bip)|*.bip" - else - filepath = cryTools.cryAnim.UI.main.loadSave._v.bipSavePath - - if filepath != undefined then - ( - if (cryTools.cryAnim.UI.main._f.checkExport #saveExport filepath) == true then - ( - local printBool = #(false,false) - - if (exportPath = cryTools.cryAnim.UI.main._f.checkExport #ProductionToGame filepath) != false then - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = exportPath - - local tempFilename = "" - - local tempStatus = undefined - - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportOpen").state of - ( - 1: tempStatus = cryTools.cryAnim.base.perforce filepath #open - 2: ( tempStatus = false ; cryTools.cryAnim.base.perforce filepath #setReadMessage ) - 3: tempStatus = cryTools.cryAnim.base.perforce filepath #checkForSave - ) - ) - else - tempStatus = false - - if tempStatus != undefined then - ( - tempFilterFilename = filterString filepath "\\" - - if (animationRange.start != spnBegin.value) or (animationRange.end != spnEnd.value) then - ( - local tempInterval = cryTools.cryAnim.UI.main.loadSave._f.checkRange spnBegin.value spnEnd.value - spnBegin.value = tempInterval.start - spnEnd.value = tempInterval.end - ) - - biped.saveBipFileSegment baseBip.controller filepath spnBegin.value spnEnd.value #keyPerFrame - cryTools.cryAnim.UI.main.loadSave._v.bipSavePath = filepath - cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath = filepath - - - - - printBool[1] = true - tempFilename = tempFilterFilename[tempFilterFilename.count] - - if (cryTools.cryAnim.UI.main._f.checkExport #save filepath) == true then - - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportAdd").state of - ( - 1: cryTools.cryAnim.base.perforce filepath #add - 3: cryTools.cryAnim.base.perforce filepath #checkForAdd - ) - ) - ) - - local tempStatus = undefined - - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportOpen").state of - ( - 1: tempStatus = cryTools.cryAnim.base.perforce exportPath #open - 2: ( tempStatus = false ; cryTools.cryAnim.base.perforce exportPath #setReadMessage ) - 3: tempStatus = cryTools.cryAnim.base.perforce exportPath #checkForSave - ) - ) - else - tempStatus = false - - if tempStatus != undefined then - ( - /* - tempDirFilter = filterString exportPath "\\" - tempDirString = "" - for i = 1 to (tempDirFilter.count - 1) do - ( - tempDirString += tempDirFilter[i] + "\\" - makeDir tempDirString - ) - */ - - cryTools.cryAnim.UI.main._f.checkExport #createFolder exportPath - - if $'Bip01 R ForeTwist'.parent != $'Bip01 R Forearm' then $'Bip01 R ForeTwist'.parent = $'Bip01 R Forearm' - if $'Bip01 R ForeTwist'.parent != $'Bip01 L Forearm' then $'Bip01 L ForeTwist'.parent = $'Bip01 L Forearm' - - try ( cryTools.cryAnim.UI.main.loadSave._f.bakeMuscleBones() ) catch() - - - local tempMode = getCommandPanelTaskMode() - UtilityPanel.OpenUtility CryEngine2_Exporter - - local boneList = #() - for i = 1 to lbExport.items.count do - append boneList (getNodeByName lbExport.items[i]) - - csexport.set_bone_list boneList - - local tempBool = (csexport.export.export_anim exportPath) - while tempBool != OK do ( escapeEnable = true ; sleep 0.1 ) - - tempFilterFilename = filterString exportPath "\\" - - printBool[2] = true - - setCommandPanelTaskMode mode:tempMode - - if cryTools.cryAnim._v.perforceDir != undefined then - ( - case (cryTools.cryAnim.UI.main._f.getUI "Perforce" "radSaveExportAdd").state of - ( - 1: cryTools.cryAnim.base.perforce exportPath #add - 3: cryTools.cryAnim.base.perforce exportPath #checkForAdd - ) - ) - ) - - - local tempArray = lbStatus.items - local tempString = "" - - if printBool[1] != printBool[2] then - ( - if printBool[1] == true then tempString = "S" - if printBool[2] == true then tempString = "E" - ) - else - ( - tempString = "SE" - ) - - append tempArray (tempString + " - " + tempFilename) - lbStatus.items = tempArray - lbStatus.selection = tempArray.count - - tempFileArray = lbStatusFilepath.items - append tempFileArray filepath - lbStatusFilepath.items = tempFileArray - - ) - ) - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.btnSaveExport.pressed" ) - ) - - - on lbStatus doubleClicked value do - ( - try - ( - try (destroyDialog cryTools.cryAnim.UI.main.loadSave.showSelectedFile) catch() - - rollout showSelectedFile "SelectedFile" - ( - edittext edFilename "" width:(cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents() + 40) - edittext edFilepath "" width:(cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents() + 40) - label labPerforce "Perforce Path:" - edittext edFilepathPerforce "" width:(cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents() + 40) - - on showSelectedFile open do - ( - if cryTools.cryAnim._v.perforceDir == undefined then - ( - labPerforce.visible = false - edFilepathPerforce.visible = false - ) - - local tempSLB = cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "lbStatus" - local tempSFLB = cryTools.cryAnim.UI.main._f.getUI "Load / Save / Export" "lbStatusFilepath" - - local tempSize = getTextExtent tempSFLB.items[tempSLB.selection] - - cryTools.cryAnim.UI.main.loadSave.showSelectedFile.width = (cryTools.cryAnim.UI.main.loadSave._f.getStatusExtents() + 70) - - local tempString = filterString tempSLB.items[tempSLB.selection] " " - local tempString = tempString[tempString.count] - - edFilename.text = tempString - edFilepath.text = tempSFLB.items[tempSLB.selection] - - edFilepathPerforce.text = cryTools.cryAnim.base.perforce tempSFLB.items[tempSLB.selection] #localToDepot - ) - ) - cryTools.cryAnim.UI.main.loadSave.showSelectedFile = showSelectedFile - showSelectedFile = undefined - - createDialog cryTools.cryAnim.UI.main.loadSave.showSelectedFile pos:[(mouse.pos[1]),(mouse.pos[2] + 70)] - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.loadSaveRO.lbStatus.doubleClicked" ) - ) - - - - - on btnbatchProcess pressed do - ( - try - ( - cryTools.cryAnim.UI.batchProcess._f.callDialog() - ) - catch ( logOutput "!!> Error loading batchProcess ms" ) - ) -) -logOutput "> Created loadSaveRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row2 loadSaveRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 loadSaveRO -) -catch ( logOutput "!!> Error adding loadSaveRO to main dialog" ) -loadSaveRO = undefined - - -logOutput ">> save.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/target.ms b/Tools/maxscript/cryAnim/ui/main/target.ms deleted file mode 100644 index 63619cb274..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/target.ms +++ /dev/null @@ -1,186 +0,0 @@ ---############################################################################### - --// rollout with the selection list and what axes to use or if there is an offset ---############################################################################### -rollout targetRO "Target" -( - dropDownList ddSelection "" pos:[8,8] width:144 height:21 - - groupBox grpAxis "Used Axis" pos:[2,37] enabled:false width:153 height:85 --85 -- 107 -- 125 - label labX "X" pos:[38,57] enabled:false - label labY "Y" pos:[65,57] enabled:false - label labZ "Z" pos:[92,57] enabled:false - label labOffset "Offset" pos:[117,57] enabled:false - label labPos "Pos" pos:[10,75] enabled:false - checkbox chkX pos:[36,75] height:16 enabled:false - checkbox chkY pos:[63,75] height:16 enabled:false - checkbox chkZ pos:[90,75] height:16 enabled:false - checkbox chkPosOffset pos:[117,75] height:16 width:15 enabled:false - - label labRot "Rot" pos:[10,98] enabled:false - checkbox chkXRot pos:[36,98] height:16 enabled:false - checkbox chkYRot pos:[63,98] height:16 enabled:false - checkbox chkZRot pos:[90,98] height:16 enabled:false - checkbox chkRotOffset pos:[117,98] height:16 width:15 enabled:false - - button btnSetOffset "S" pos:[137,76] height:37 width:15 enabled:false toolTip:"Retrieve the offset of selected node and selection in the list" - - label labEditOffset1 "1" pos:[8,122] height:20 width:40 visible:false - label labEditOffset2 "2" pos:[8,140] height:20 width:40 visible:false - edittext edOffset1 "" pos:[30,120] fieldWidth:118 visible:false - edittext edOffset2 "" pos:[30,138] fieldWidth:118 visible:false - - timer clock interval:10000 active:true - - label labChange "" pos:[0,0] height:1 enabled:false - - - - on targetRO close do - ( - try - ( - if cryTools.cryAnim._v.various[10] == undefined then - cryTools.cryAnim.base.iniFile #set #visible value:"0" - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.close" ) - ) - - on targetRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #targetRO) != value then - cryTools.cryAnim.base.iniFile #set #targetRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.rolledUp" ) - ) - - - on targetRO open do - ( - try - ( - try ( if (cryTools.cryAnim.base.iniFile #get #rolloutStates) == true then (cryTools.cryAnim.UI.main._f.getUI "Target" "").open = cryTools.cryAnim.base.iniFile #get #targetRO) catch() - (cryTools.cryAnim.UI.main._f.getUI "Target" "").height =128 - - cryTools.cryAnim.UI.main.target._f.updateDDSelection() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.open" ) - ) - - on ddSelection selected value do - ( - try - ( - groupArray = #(\ - grpAxis, labX, labY, labZ, labOffset, \ - labPos, chkX, chkY, chkZ, chkPosOffset, \ - labRot, chkXRot, chkYRot, chkZRot, chkRotOffset ) - - - if ddSelection.selection <= 3 then - ( - cryTools.cryAnim.UI.main.target._f.updateDDSelection op:false - ddSelection.selection = 1 - - if (findString labChange.text "1") == undefined then - labChange.text = "1:Changed" - else - labChange.text = "1:Unchanged" - - - ) - else - ( - cryTools.cryAnim.UI.main.target._f.updateDDSelection op:true - - if (findString labChange.text "2") == undefined then - labChange.text = "2:Changed" - else - labChange.text = "2:Unchanged" - ) - - cryTools.cryAnim.UI.main.operation._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.ddSelection.selected" ) - ) - - - - - - on btnSetOffset pressed do - ( - try - ( - if $selection.count > 0 then - ( - cryTools.cryAnim._v.various[35] = #() - - local tempSnap = cryTools.cryAnim._f.createSnapshot() - for obj in tempSnap do - ( - in coordsys (getNodeByName (cryTools.cryAnim.UI.main._f.getUI "Target" "").ddSelection.selected) - append cryTools.cryAnim._v.various[35] (rotPosStruct rotation:obj.rotation position:obj.pos) - ) - for obj in tempSnap do - delete obj - - cryTools.cryAnim.UI.main.target._f.updateOffset() - - ) - else - messageBox "No Node selected." title:"Set Offset" - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.btnSetOffset.pressed" ) - ) - - on chkPosOffset changed value do - ( - try - cryTools.cryAnim.UI.main.target._f.updateOffset() - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.chkPosOffset.changed" ) - ) - - on chkRotOffset changed value do - ( - try - cryTools.cryAnim.UI.main.target._f.updateOffset() - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.chkRotOffset.changed" ) - ) - - - - - - on edOffset1 entered value do - ( - try - setManualOffset labEditOffset1 edOffset1 - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.edOffset1.entered" ) - ) - - on edOffset2 entered value do - ( - try - setManualOffset labEditOffset2 edOffset2 - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.targetRO.edOffset2.entered" ) - ) -) -logOutput "> Created targetRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 targetRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 targetRO -) -catch ( logOutput "!!> Error adding targetRO to main dialog" ) -targetRO = undefined - - -logOutput ">> target.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryAnim/ui/main/tools.ms b/Tools/maxscript/cryAnim/ui/main/tools.ms deleted file mode 100644 index 34662cc542..0000000000 --- a/Tools/maxscript/cryAnim/ui/main/tools.ms +++ /dev/null @@ -1,204 +0,0 @@ ---############################################################################### - --// rollout with internal control _f like Promt for File when saving, exporting, save+export, or reloading the whole script as well as the perforce control ---############################################################################### -rollout settingsRO "Settings" -( - button btnReload "Reload CryAnim" pos:[8,8] width:142 height:20 toolTip:"Reloads the whole cryAnim script and dialog" - - groupBox grpLoadingDialog " Promt for File " pos:[2,40] width:153 height:100 - - label labPromptN "Yes" pos:[105,60] - label labPromptA "No" pos:[129,60] - - label labPromptSave "Save" pos:[14,75] - label labPromptExport "Export" pos:[14,95] - label labPromptSaveExport "Save/Export" pos:[14,115] - - radiobuttons radSavePrompt pos:[108,75] labels:#("","") columns:2 default:1 - radiobuttons radExportPrompt pos:[108,95] labels:#("","") columns:2 default:1 - radiobuttons radSaveExportPrompt pos:[108,115] labels:#("","") columns:2 default:1 - - - label labWorkingDir "Biped Working Directory :" pos:[10,150] - edittext edWorkingDir "" pos:[4,170] fieldWidth:140 - button btnPickWorkingDir "Pick" pos:[8,190] height:20 width:65 toolTip:"Get the path for the biped working directory" - button btnSetWorkingDir "Set" pos:[85,190] height:20 width:65 toolTip:"Set the path as biped working directory" - - checkbox chkMultiRow "Multi Row Dialog" pos:[10,230] checked:true - checkbox chkRolloutStates "Use Rollout States" pos:[10,250] checked:false - checkbox chkReadOnly "Notify File Attribute" pos:[10,270] checked:true - - --button btnCustomizeRollouts "Customize Rollouts" pos:[8,290] width:142 height:20 - - - - on settingsRO open do - ( - try - ( - try radLoadOpen.state = cryTools.cryAnim.base.iniFile #get #loadOpen catch() - try radSaveOpen.state = cryTools.cryAnim.base.iniFile #get #saveOpen catch() - try radExportOpen.state = cryTools.cryAnim.base.iniFile #get #exportOpen catch() - try radSaveExportOpen.state = cryTools.cryAnim.base.iniFile #get #saveExportOpen catch() - - try radSaveAdd.state = cryTools.cryAnim.base.iniFile #get #saveAdd catch() - try radExportAdd.state = cryTools.cryAnim.base.iniFile #get #exportAdd catch() - try radSaveExportAdd.state = cryTools.cryAnim.base.iniFile #get #saveExportAdd catch() - - try radSavePrompt.state = cryTools.cryAnim.base.iniFile #get #savePrompt catch() - try radExportPrompt.state = cryTools.cryAnim.base.iniFile #get #exportPrompt catch() - try radSaveExportPrompt.state = cryTools.cryAnim.base.iniFile #get #saveExportPrompt catch() - try edWorkingDir.text = cryTools.cryAnim.base.iniFile #get #workingDir catch() - if edWorkingDir.text == "" then - edWorkingDir.text = cryTools.buildPathFull + "Game\\Animations\\" - - cryTools.cryAnim.UI.main._v.bipWorkingDir = edWorkingDir.text - cryTools.cryAnim.UI.main._v.cafWorkingDir = subString crytools.cbapath 1 (crytools.cbapath.count - 14) - - if cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath == "" then - cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath = cryTools.cryAnim.UI.main._v.bipWorkingDir + "*.bip" - - cryTools.cryAnim.UI.main.loadSave._v.bipSavePath = cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath - cryTools.cryAnim.UI.main.loadSave._v.cafSavePath = cryTools.cryAnim.UI.main._v.cafWorkingDir + "*.caf" - - try local multiRow = cryTools.cryAnim.base.iniFile #get #multiRow catch() - if multiRow != "" then chkMultiRow.checked = multiRow - - try chkRolloutStates.checked = cryTools.cryAnim.base.iniFile #get #rolloutStates catch() - try chkReadOnly.checked = cryTools.cryAnim.base.iniFile #get #readOnly catch() - - - if chkRolloutStates.checked == true then - try ( (cryTools.cryAnim.UI.main._f.getUI "Tools" "").open = cryTools.cryAnim.base.iniFile #get #settingsRO ) catch() - - - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.open" ) - ) - - - on settingsRO rolledUp value do - ( - try - ( - if (cryTools.cryAnim.base.iniFile #get #settingsRO) != value then - cryTools.cryAnim.base.iniFile #set #settingsRO - - cryTools.cryAnim.UI.main._f.updateDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.rolledUp" ) - ) - - - on btnReload pressed do - ( - try - cryTools.cryAnim.base.reloadScript() - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.btnReload.pressed" ) - ) - - on btnPickWorkingDir pressed do - ( - try - ( - if cryTools.cryAnim.UI.main._v.bipWorkingDir == "" then - local tempVar = (getSavePath caption:"Project Directory" initialDir:crytools.BuildPathFull) - else - local tempVar = (getSavePath caption:"Project Directory" initialDir:cryTools.cryAnim.UI.main._v.bipWorkingDir) - - if tempVar != undefined then - ( - if tempVar[tempVar.count] != "\\" then - append tempVar "\\" - - edWorkingDir.text = tempVar - ) - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.btnPickWorkingDir.pressed" ) - ) - - on btnSetWorkingDir pressed do - ( - try - ( - cryTools.cryAnim.UI.main._v.bipWorkingDir = edWorkingDir.text - cryTools.cryAnim.UI.main.loadSave._v.bipOpenPath = edWorkingDir.text + ".bip" - cryTools.cryAnim.base.iniFile #set #workingDir - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.btnSetWorkingDir.pressed" ) - ) - - on chkMultiRow changed value do - ( - try - ( - cryTools.cryAnim.base.iniFile #set #multiRow - cryTools.cryAnim.UI.main._f.callDialog() - ) - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.chkMultiRow.changed" ) - ) - - on chkRolloutStates changed value do - ( - try - cryTools.cryAnim.base.iniFile #set #rolloutStates - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.chkRolloutStates.changed" ) - ) - - on chkReadOnly changed value do - ( - try - cryTools.cryAnim.base.iniFile #set #readOnly - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.chkReadOnly.changed" ) - ) - - - - - - on radSavePrompt changed value do - ( - try - cryTools.cryAnim.base.iniFile #set #savePrompt - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.radSavePromt.changed" ) - ) - - on radExportPrompt changed value do - ( - try - cryTools.cryAnim.base.iniFile #set #exportPrompt - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.radExportPrompt.changed" ) - ) - - on radSaveExportPrompt changed value do - ( - try - cryTools.cryAnim.base.iniFile #set #saveExportPrompt - catch ( logOutput "!!> Error in cryTools.cryAnim.UI.main.dialog.settingsRO.radSaveExportPrompt.changed" ) - ) - - - on btnCustomizeRollouts pressed do - ( - cryTools.cryAnim.UI.main.settings._f.callCustomizeDialog() - ) - - -) -logOutput "> Created settingsRO rollout" - - -try -( - if cryTools.cryAnim.base.iniFile #get #multiRow == true then - addSubRollout cryTools.cryAnim.UI.main.dialog.row4 settingsRO - else - addSubRollout cryTools.cryAnim.UI.main.dialog.row1 settingsRO rolledUp:true -) -catch ( logOutput "!!> Error adding settingsRO to main dialog" ) -settingsRO = undefined - - -logOutput ">> tools.ms loaded" \ No newline at end of file diff --git a/Tools/maxscript/cryKey/AddToExportList.ms b/Tools/maxscript/cryKey/AddToExportList.ms deleted file mode 100644 index ebd9115796..0000000000 --- a/Tools/maxscript/cryKey/AddToExportList.ms +++ /dev/null @@ -1,13 +0,0 @@ -max utility mode -UtilityPanel.OpenUtility CryEngine_2_Exporter -for obj in selection do -( - ExprtArr = csexport.export.get_node_list() - for x = 1 to ExprtArr.count do - ( - if ExprtArr[x] == obj then deleteItem ExprtArr x - ) - append ExprtArr obj - csexport.export.set_node_list ExprtArr -) -max modify mode \ No newline at end of file diff --git a/Tools/maxscript/cryKey/LimELoop.ms b/Tools/maxscript/cryKey/LimELoop.ms deleted file mode 100644 index 9266c07432..0000000000 --- a/Tools/maxscript/cryKey/LimELoop.ms +++ /dev/null @@ -1,12 +0,0 @@ --------------------------Limited Edge Loop--------------------------- -if CryModelling == undefined then -( - FileIn (BuildPathFull_crytools + "Tools\\maxscript\\CryModelling.ms") -) - -case subobjectLevel of -( - 1: CryModelling.SelVertLoop() - 2: CryModelling.SelLimELoop () - 4: CryModelling.SelPolyLoop() -) diff --git a/Tools/maxscript/cryKey/LimERing.ms b/Tools/maxscript/cryKey/LimERing.ms deleted file mode 100644 index 5ee0d32c48..0000000000 --- a/Tools/maxscript/cryKey/LimERing.ms +++ /dev/null @@ -1,11 +0,0 @@ --------------------------Limited Edge Ring--------------------------- -if CryModelling == undefined then -( - FileIn (BuildPathFull_crytools + "Tools\\maxscript\\CryModelling.ms") -) - -case subobjectLevel of -( - 1: CryModelling.SelVertRing() - 2: CryModelling.SelLimERing() -) diff --git a/Tools/maxscript/cryKey/LimPLoop.ms b/Tools/maxscript/cryKey/LimPLoop.ms deleted file mode 100644 index 897d294c5a..0000000000 --- a/Tools/maxscript/cryKey/LimPLoop.ms +++ /dev/null @@ -1,7 +0,0 @@ - -------------------------Limited Poly Loop------------------------------ -if CryModelling == undefined then -( - FileIn (BuildPathFull_crytools + "Tools\\maxscript\\CryModelling.ms") -) - -CryModelling.SelPolyLoop() \ No newline at end of file diff --git a/Tools/maxscript/cryKey/LimVLoop.ms b/Tools/maxscript/cryKey/LimVLoop.ms deleted file mode 100644 index aa347957c7..0000000000 --- a/Tools/maxscript/cryKey/LimVLoop.ms +++ /dev/null @@ -1,7 +0,0 @@ - -------------------------Limited Vert Loop---------------------------- -if CryModelling == undefined then -( - FileIn (BuildPathFull_crytools + "Tools\\maxscript\\CryModelling.ms") -) - -CryModelling.SelVertLoop() \ No newline at end of file diff --git a/Tools/maxscript/cryKey/LimVRing.ms b/Tools/maxscript/cryKey/LimVRing.ms deleted file mode 100644 index 0fdfbb71ee..0000000000 --- a/Tools/maxscript/cryKey/LimVRing.ms +++ /dev/null @@ -1,7 +0,0 @@ - -------------------------Limited Vert Ring------------------------------ -if CryModelling == undefined then -( - FileIn (BuildPathFull_crytools + "Tools\\maxscript\\CryModelling.ms") -) - -CryModelling.SelVertRing() \ No newline at end of file diff --git a/Tools/maxscript/cryKey/UVcollapseHorizontal.ms b/Tools/maxscript/cryKey/UVcollapseHorizontal.ms deleted file mode 100644 index 6b49342d1c..0000000000 --- a/Tools/maxscript/cryKey/UVcollapseHorizontal.ms +++ /dev/null @@ -1 +0,0 @@ -$.modifiers[#unwrap_uvw].unwrap2.ScaleSelectedCenter 0.001 1 \ No newline at end of file diff --git a/Tools/maxscript/cryKey/UVcollapseVertical.ms b/Tools/maxscript/cryKey/UVcollapseVertical.ms deleted file mode 100644 index 5b290ddb56..0000000000 --- a/Tools/maxscript/cryKey/UVcollapseVertical.ms +++ /dev/null @@ -1 +0,0 @@ -$.modifiers[#unwrap_uvw].unwrap2.ScaleSelectedCenter 0.001 2 \ No newline at end of file diff --git a/Tools/maxscript/cryKey/UVscaleUniform.ms b/Tools/maxscript/cryKey/UVscaleUniform.ms deleted file mode 100644 index 095d422056..0000000000 --- a/Tools/maxscript/cryKey/UVscaleUniform.ms +++ /dev/null @@ -1 +0,0 @@ -$.modifiers[#unwrap_uvw].unwrap2.ScaleSelectedCenter 0.001 0 \ No newline at end of file diff --git a/Tools/maxscript/cryKey/centerPivot.ms b/Tools/maxscript/cryKey/centerPivot.ms deleted file mode 100644 index 69a5ef117b..0000000000 --- a/Tools/maxscript/cryKey/centerPivot.ms +++ /dev/null @@ -1,5 +0,0 @@ --- centers the pivot of all selected objects (locally per object) -for obj in selection do -( - CenterPivot obj -) \ No newline at end of file diff --git a/Tools/maxscript/cryKey/changeRefCoordsys.ms b/Tools/maxscript/cryKey/changeRefCoordsys.ms deleted file mode 100644 index c7368399be..0000000000 --- a/Tools/maxscript/cryKey/changeRefCoordsys.ms +++ /dev/null @@ -1,8 +0,0 @@ -case getRefCoordSys() of - ( - #local: setRefCoordSys #hybrid - #hybrid: setRefCoordSys #screen - #screen: setRefCoordSys #world - #world: setRefCoordSys #parent - #parent: setRefCoordSys #local - ) \ No newline at end of file diff --git a/Tools/maxscript/cryKey/collapseByLoc.ms b/Tools/maxscript/cryKey/collapseByLoc.ms deleted file mode 100644 index 10029287a0..0000000000 --- a/Tools/maxscript/cryKey/collapseByLoc.ms +++ /dev/null @@ -1,8 +0,0 @@ -try -( - (crytools.retrieveFn "collapseVerts()")() -) -catch -( - print "error." -) \ No newline at end of file diff --git a/Tools/maxscript/cryKey/exportAnim.ms b/Tools/maxscript/cryKey/exportAnim.ms deleted file mode 100644 index cc6ffec309..0000000000 --- a/Tools/maxscript/cryKey/exportAnim.ms +++ /dev/null @@ -1,3 +0,0 @@ -max utility mode -UtilityPanel.OpenUtility CryEngine_2_Exporter -csexport.export.export_anim() \ No newline at end of file diff --git a/Tools/maxscript/cryKey/exportNodes.ms b/Tools/maxscript/cryKey/exportNodes.ms deleted file mode 100644 index 378dab481f..0000000000 --- a/Tools/maxscript/cryKey/exportNodes.ms +++ /dev/null @@ -1,3 +0,0 @@ -max utility mode -UtilityPanel.OpenUtility CryEngine_2_Exporter -csexport.export.export_nodes() \ No newline at end of file diff --git a/Tools/maxscript/cryKey/preserveUVs.ms b/Tools/maxscript/cryKey/preserveUVs.ms deleted file mode 100644 index 5a24361ddc..0000000000 --- a/Tools/maxscript/cryKey/preserveUVs.ms +++ /dev/null @@ -1,8 +0,0 @@ -if $.preserveUVs == true then -( -$.preserveUVs = false -) -else -( -$.preserveUVs = true -) \ No newline at end of file diff --git a/Tools/maxscript/cryKey/resetXformCollapse.ms b/Tools/maxscript/cryKey/resetXformCollapse.ms deleted file mode 100644 index 6c8c16ae55..0000000000 --- a/Tools/maxscript/cryKey/resetXformCollapse.ms +++ /dev/null @@ -1,4 +0,0 @@ - ResetXForm $ - print ($.name + " xforms reset") - modPanel.setCurrentObject $.baseObject - maxOps.CollapseNode $ off \ No newline at end of file diff --git a/Tools/maxscript/cryKey/showVertexAlpha.ms b/Tools/maxscript/cryKey/showVertexAlpha.ms deleted file mode 100644 index baabf68808..0000000000 --- a/Tools/maxscript/cryKey/showVertexAlpha.ms +++ /dev/null @@ -1,22 +0,0 @@ -------Display Vertex Alpha------ -for obj in selection do -( - if obj.showVertexColors == false then - ( - obj.vertexColorType = #alpha - obj.showVertexColors = true - ) - else - ( - if obj.vertexColorType ==#color then - ( - obj.vertexColorType = #alpha - obj.showVertexColors = false - obj.showVertexColors = true - ) - else - ( - obj.showVertexColors = false - ) - ) -) \ No newline at end of file diff --git a/Tools/maxscript/cryKey/showVertexColors.ms b/Tools/maxscript/cryKey/showVertexColors.ms deleted file mode 100644 index 8639c16689..0000000000 --- a/Tools/maxscript/cryKey/showVertexColors.ms +++ /dev/null @@ -1,22 +0,0 @@ -------Display Vertex Colors------- -for obj in selection do -( - if obj.showVertexColors == false then - ( - obj.vertexColorType = #color - obj.showVertexColors = true - ) - else - ( - if obj.vertexColorType ==#alpha then - ( - obj.vertexColorType = #color - obj.showVertexColors = false - obj.showVertexColors = true - ) - else - ( - obj.showVertexColors = false - ) - ) -) \ No newline at end of file diff --git a/Tools/maxscript/docs/AboutCryTools.html b/Tools/maxscript/docs/AboutCryTools.html deleted file mode 100644 index a5b843f313..0000000000 --- a/Tools/maxscript/docs/AboutCryTools.html +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - - - - - - cryTools: About - - - - - - -

cryTools: About

- - -

What are cryTools?

- - -CryTools are a suite of maxscripts -that add functionality to 3D Studio Max that does not currently exist. -Not just basic functionality that 3DS Max is lacking, but also special -functionality and tools that help you troubleshoot, create and manage -assets for cryEngine2 games.
- - -
- - -A Note About Requirements

- - -CryTools currently work with versions 8 and 9 of 3D Studio Max. The -installer can install the cryTiff libs, dlls and plugins for versions -6,7, and CS of Photoshop.
- - -
- - -License

- - -CryTools are free. So I want you to feel free to use the code to learn -or incorporate aspects of the tools into your own freely available -toolsets. They are therefore provided 'as is' and with limited support. -The person who wrote these tools is not a programmer, and the code may -be somewhat obtuse at times, but the tools are pretty solid and -reliable. They have been in use at Crytek for quite some time, if you -have any bugs, please send a description of the bug to Chris@Crytek.de (for CryTools )      Mathias@Crytek.de (for CryAnim )

- - -
-

Features

- - -This is a list of functionality that -has been added to 3DSMax. We have been working on CryTools since Max7, -so some features we have implemented were later added to 3DSMax -(loading FBX onto Biped for example)
- - -
- - -

Tools/Pipeline Integration

- - -Easy Installation
- - -•    One double click installs all tools/files on the users PC setup correctly and working
- - -•    The installer finds Photoshop\3DS Max install dirs and installs cryTools and cryTiff correctly
- - -
- - -Transparency
- - -•    cryTools can automatically check your assets before export to the game, making sure they
- - -•    have the correct shaders applied
- - -•    are free of extra transformations
- - -•    are facing the right world direction
- - -•    and many more requirements that may be overlooked
- - -•    cryTools run from your local build, so tools are updated automatically and frequently
- - -•    cryTools sync via Perforce, AlienBrain, HTTP, or LAN on demand
- - -•    Checks local build for updated exporter or tools and installs them automatically or on demand
- - -
- - -Diagnostics You Care About
- - -•    Show all callbacks and important variables (control panel)
- - -•    Dump all vars in global space currently set/used by cryTools
- - -•    Visual indicator of local/latest build number in control panel or splash screen
- - -•    'Rollback' functionality to rollback to a previous exporter
- - -
- -
-

Animation

- -General
- -
•    Batch convert controllers (example: TCB for CGA)
- -
•    Bake procedural motion to dense keyframe data
-
-Biped Tools

- -
•    Foot / Hand snapshot alignment to custom pivots
- -
•    Move Bip01 to [0,0] / [0,0,0]
-
•    Ability to set planted, sliding or free keys to any biped part for any number of frames
- - -•    Reverse a biped animation (Autodesk added this feature to Max 9)
- - -•    Import FBX data directly on to a biped character (Autodesk added this feature to Max 9)
-•    Reset Rotation
- -
•    Create snapshot / + children
- -
•    Copy transformation
- -
•    Paste transformation / position / rotation
- -
•    Everything is available in the quad menu or for shortcuts
- -
•    The dialog can handle these functions in a time range
- -
- -
Dialog
- -
•    Align selected object to any other object ( rotation, position, create / use offset )
- -•    Compact structure to apply functions
- -
•    Works with time range ( Start / Stop ;  Range )
- -
•    Load often used models to animate with
- -
•    Automatically sets the weapon bone for different kind of weapons (if set)
- -
•    Loads Biped from the working directory ( or last used file )
- -
•    Save Biped directly to the last used biped name
- -
•    Export animation with the Biped name and path structure
- -
•    Save / Export at the same time
- -
•    Perforce control if perforce is installed
- -

- -Batch Exporter
- -•    Supported file types: BIP, FBX, MAX
- -
•    Sub folder selection (will be saved)
- -
•    File Mask selection (will be saved)
- -
•    Export Folder (will be saved)
- -•    Sorted by folders
- -
•    Run pre-export script (if set)
- -
•    Automatic export bone detection (if set)
- -
•    Keep Sub folder structure
- -•    Check the files (without export)
-
•    Add or remove bones and rig elements from thousands of animation assets
- - -•    Manipulate data for thousands of animations (example: flip all assets 180 deg)
-
•    Export logs detailing data about your animation assets/batch export
-
-
-

Animation (deprecated, unsupported)

- - -Biped Tools
- - -•    Rig -Navigator - A synaptic rig element selector (much like Maya, XSI, -Motion Builder, etc). Click a part to select it
- - -•    Syncing of -pose collections sets from Perforce or a network drive on demand, at -Max load or on character load
- - -•    auto-importing animation props and weapons from a build/server
- - -•    Select just biped bones, excluding helper joints
- - -
- - -General Tools
- - -•    RangeView - -View or cycle through Animator-created 'time-tagged' sequences in one -timeline. When a sequence is selected, the timeline beginning/end is -set the the time-tagged range's beginning/ending
- - -•    Mirror first person arm animation from left arm to right or vice versa
- - -•    XAF XML animation file support (character limited)
- - -
- - -Batch Animation Processing
- - -•    Supports biped BIP or XAF (character limited) animation data
- -
- -
-

Character Setup and Rigging

- - -General Tools
- - -•    Zero out rotations for all selected items
- - -•    Snap a pivot to that of another object
- - -•    Select just biped bones, excluding helper joints
- - -•    Make sweeping adjustments to the width/height/taper of multiple selected bones
- - -•    Create arbitrary vertex channels, e.g. multiple vertex color channels
- - -•    Create Phys Skeleton from existing Deforming Skeleton
- - -•    Automated ParentFrame creation
- - -
- - -Character/Animation Diagnostics
- - -•    Create Smart Object template files and export Smart Object template data to the Editor in XML format
- - -•    Select the root of a hierarchy by selecting any member of it
- - -•    Select all children of a node
- - -•    Export data about a hierarchy to listener or a spreadsheet (excel/google spreadsheet)
- - -•    Compare multiple hierarchies
- - -•    Query how many bones in a hierarchy have weights effecting a mesh
- - -•    Output -arbitrary movement data, e.g. output how far a character moves out from -behind cover in an animation, or how high the root is when he is in -prone or behind cover.
- - -•    Output XML CDF attachment data based on the location of an attachment in Max
- - -
- - -
-

Morph Tools

- - -Facial Setup
- - -•    Transfer morphs between unlike topologies
- - -•    Bake morph targets out from a selected head colored, named, and placed in the cryEngine2 standard
- - -•    Bake out an arbitrary number of morphs to geometry with the name of the morph slider
- - -•    Delete selected faces from many morph targets while keeping identical point indices
- - -•    Mirror eye -bone animation from right to left and vice versa when setting up -deformation for procedural eye morphs
- - -
- - -Pose-Driven Morphs
- - -•    Can extract a relative pose shape from a skinned and posed mesh
- - -•    Supports creation of arbitrary corrective shapes for a given pose, as well as the standard sets below
- - -•    Head/Neck
- - -•    Auto-generated fleshy eye morphs
- - -•    Shoulder
- - -
- - -Baking Tools
- - -•    Supports baking of any complex geometric deformation to a sequence of morphs (muscles, cloth, etc..)
- - -•    Set the number of frames to bake, and the number of morphs to generate over those frames
- - -•    Can bake out relative morphs with skin data culled to be pose-driven in cryEngine2
- - -
- - -Diagnostic Tools
- - -•    Dump morpher data to the Listener or an excel spreadsheet
- - -•    MorphManager: an improved morpher interface
- - -
- - -

Artist Tools

- - - - -General Tools
- - -•    Center pivots to the center of each objects bounding box for all selected objects
- - -•    Many commonly used commends, like a button that reset xforms and then collapses a selected object
- - -•    Copy/paste modifiers to multiple objects without instancing
- - -•    UV maipulation tools
- - -
- - -

TD ToolKit

- - -General
- - -•    The cryTools -architecture allows you to install update, or query anything (tools -related) on any users PC
- - -•    Useful -global variables like local build#, latest build#, local build -location, editor path, user preferences, etc
- - -•    You can restrict what tools certain users see based upon their username, network domain, or other data
- - -•    Silently execute dos commands
- - -
- - -Useful Functions
- - -•    Perforce and AlienBrain integration
- - -•    Network -tools to do things like get the current domain, or convert a local -mapped drive letter to its UNC pathname (Autodesk added this feature to -Max 9)
- - -•    General useful fns like converting a string to lowercase, etc..
- - -
- - -CryExport MaxScript Exposure
- - -•    Export functions
- - -o    Get/set node lists for objects and bones
- - -•    Registry functions
- - -•    Silent CMD execution
- - -
- - -
- - -
- - -
- - diff --git a/Tools/maxscript/docs/AnimTools.html b/Tools/maxscript/docs/AnimTools.html deleted file mode 100644 index 728cd60f83..0000000000 --- a/Tools/maxscript/docs/AnimTools.html +++ /dev/null @@ -1,931 +0,0 @@ - - - - - - - - - - - - - - - - - cryTools: AnimTools - - - - - - - -

cryTools: AnimTools

- -Installation
- -Quadmenu Functions
- -Main Dialogue
- -   Selection Rollout
- -   
Operation Rollout
- -
   Pivot Rollout
- -   Misc Rollout
- -   Load/Save/Export Rollout
- -   Perforce Rollout
- -   Tools Rollout
-Model Set-Up
-Batch Export Rollout
-

Installation

- - -

-After initialization of the script in Max, it will also generate entries in the customization dialog: -(Under the MainUI group and in the CryAnim category) -

- -

-cryAnimInstallation.jpg
- - -

- -

-There are all functions available to make a key shortcut or tool bar button.
- - -(most of the functionality is in the quad menu too)

- -

Quadmenu Functions

- - -

-quadmenu.jpg -

- -

-
- - -go_forward bip to [0,0]
- -Takes the Bip01 node to [0,0]. -

- -
-go_forward bip to [0,0,0]
- -Takes the Bip01 node to [0,0,0].

- - -
-go_forward show trajectory
- -Enables the trajectory of the selected node.
- -(
is hidden if no Biped object is selected)
- - -
-go_forward hide trajectories -

-Hides all visible trajectories.
- - (is available if a trajectory is visible) -

- -
-go_forward move to snapshot
- -Moves the selected Biped object to the nearest snapshot (generated out of the same object)
if a pivot point is selected, it keeps the offset of it is disabled if no correct snapshot is in the scene is visible if a Biped object is selected
- -
-
-go_forward move/rotate to snapshot
- -The same as "move to snapshot"
plus Rotation
- -
-
-

-go_forward lock rotation
- -Rotates the object every time it will be moved to the set rotation back
- - -(is visible if a Biped object is in scene)
- - -

- -
-

-go_forward reset rotation
- -Rotates the selected Biped object with the same rotation as the parent object
- - -(is visible if a Biped object is selected)
- - -

- -
-

-go_forward move to floor
- -If the foot is selected, it will be rotated and moved to plant on the ground
- - -(is available if a Biped foot is selected)
- - -

- -
-

-go_forward create snapshot -

- -

-single
- -Creates a snapshot of the selected object
- - -(is visible if an Object is selected)
- - -

- -

-children
- -Creates snapshots of all children of the selected object
- - -(is visible if an Object is selected)
- - -

- -
-

-go_forward copy
- -Copies the position and rotation of the selected objects and stores them into a temporary file in cry_temp folder
- - -(is visible if an Object is selected)
- - -

- -
-

-go_forward paste
- -

- -

transform
- -Pastes the position and rotation from the temporary file to the selected objects
- - -(is visible if the temporary file exists and an Object is selected)
- - -(works for non-Biped nodes too)
- - -

- -

-position
- -Pastes only the position
- - -

- -

-rotation
- -Pastes only the rotation
- - -

- -
-

-go_forward select pivot
- -Starts the pivotSelect tool to select an internal pivot to align with snapshots or pivot points
- - -(is available if hand or foot is selected)

- -

Main Dialog: Selection Rollout

- - -

-dialogSelection.jpg -

- -

-

- -

-led-yellow Drop down List :
- - -In the drop down list you specify the object you want to appy the operation to.
- - -When choosing Update List, the list will be updated with the available nodes in the scene. -

- -

-If the selection is not "--Current Selection--" but an object in the -scene is selected, the axis and offset is available and the Operation rollout will be updated. -

- -

-dialogSelection2.jpg -

- -

 led-yellow Used Axis :
- - -If enabled, you can select which coordinate axis will be used for the operation.
- - -

- -

-led-yellow Offset Set Button :
- - -If enabled, sets the offset from the current selected object and the object selected in the drop down list. -After the offset is generated, the Offset checkboxes are available. -

- -

-led-yellow Offset Axis :
- -If -position is checked, the selected object will be in addition to the -offset aligned to the object set in the list. -With this, the locator can be easily aligned in cycles or other -animations, where the locator has a different position as the object -selected in the list. -

- -

-If rotation is checked, the selected object will be in addition to the offset rotated to the object set in the list. -This helps when animating the locator in animations where the character runs in circles and the locator needs to follow up. -

- -

- -

Main Dialog: Operation Rollout

- -

dialogOperation.jpg -

- -

-led-yellow Start / Stop :
- - -This button sets the range of operation.
- - -The red square box indicates which value will be changed when hitting again.
- - -
- - -led-yellow Steps :
- - -Specify how many steps the operation will use.
- - -(Default is 1) -
- - -
- - -
- - -

- -

led-orange Operation :

- -

If 'Current Selection' is selected in the Selection rollout:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name Operation
Planted Key generates a planted key
Sliding Key generates a sliding key
Free Key generates a free key
-------------------- ------------------------------------------------------------------------------------------------
Move moves the selected Biped object to the nearest snapshot / pivot point
Move / Rotate moves and rotates the selected Biped object
-------------------- ------------------------------------------------------------------------------------------------
Move to Floor if the foot is selected it puts the foot on the floor
Reset Rotation adapts the rotation of the selected objects parent rotation
-------------------- ------------------------------------------------------------------------------------------------
Copy copies the rotation and position of the current selected object
Paste pastes the rotation / position / transform to the current selected object
-------------------- ------------------------------------------------------------------------------------------------
Bip to [0,0] puts Bip01 node to [0,0]
Bip to [0,0,0] puts Bip01 node to [0,0,0]
- - -
- - -
- - -If some Object in the list is selected: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name Operation
Move moves the selected Biped object to the object selected in the list
Line moves the selected Biped object with reference of the selected object in the list along a line
- - -
- - -

-led-yellow Apply
- - -Applies once the selected operation to the selected object. -

- -

-led-yellow Begin / End
- - -Applies the selected operation in the specified range (Start / Stop) and with the given Steps -

- -

-led-yellow Range
- - -Applies the selected operation for the Full animation range with the given Steps

- -

Main Dialog: Pivot Rollout

- - -

- -

- -

dialogPivot.jpgled-yellow Select Pivot
- - -If a foot is selected, you can select which pivot you want to operate with for Move operation.
- - -

- -

-led-yellow Create
- - -Creates a new Pivot Point with the selected pivot.
- - -led-yellow Delete
- - -Deletes the Pivot Point of the selected Biped Object.
- - -led-yellow Single
- - -Creates a single snapshot from the selected Object.
- - -led-yellow + Children
- - -Creates snapshot from the children of the selected Object and integrates them into a group. 

- -

Main Dialog: Misc Rollout

- - -

-dialogMisc.jpg -

- -

-led-yellow Load Model
- - -If a model list is created before, the model selected will be opened (without message box asking to save changes!).
- - -How to maintain models
- - -
- - -

- -

-led-yellow Reset Locator
- - -Rotates and translates the locator to Y+ and [0,0,0] (origin of scene).
- - -
- - -

- -

-led-yellow Weapons Drop Down List
- - -If a weapon list is created before, the weapon selected will be -unhidden, every weapon before will be hidden (needs reference in -weapons_ref.max in tools folder).
- - -How to maintain weapons

- -

-

- -

led-orangeMuscles 

- -led-yellow AutoMuscles
- -If checked and nanoMuscles are in the scene, automatically repositions the look-at targets without animating.

- - -If unchecked and Use Keys is unchecked too, keys will be generated automatically when changing the timeline.
- - -When exporting using the cryAnim tools, the nanoMuscles will be baked automatically by export.
- - -

-led-yellow Use Key
- - -Is available when Auto-Muscles is unchecked.
- - -If nanoMuscles are baked and Use Keys is checked, it will not generate -keys when changing the timeline. Needed when tweaking the bones.
- - -

- -

-led-yellow Create
- - -If there is no nanoMuscles rig available on the character, it will be generated.
- - -

- -

-led-yellow Bake
- - -Bakes the nanoMuscles Keys.
- - -

- -

Main Dialog: Load / Save / Export Rollout

- -

-dialogLoadSave.jpg -

- -

-led-yellow Load Biped File
- - -Prompts a open file dialog where you can choose the biped you want to -load (must have correct file naming: works not without file extension). -

- -

-led-yellow Start / End
- - -Sets the range to save the biped to. -

- -

-led-yellow Range
- - -Sets the current animation range to save the biped to. -

- -

-led-yellow All
- - -Uses the biped range for saving. -

- -

-led-yellow Add
- - -If a bone is currently selected, the bone will be added to the bone export list. -

- -

-led-yellow Delete
- - -If a bone is selected in the list, it will be deleted. -

- -

-led-yellow Save
- - -Prompts a saving file dialog to choose a file where to save the biped to. -

- -

-led-yellow Export
- - -Prompts a saving file dialog to choose a file where to export to.
- - -

- -

-led-yellow Save / Export
- - -Prompts a saving file dialog to choose a file where to save to.
- - -(It will generate automatically the correct path for the CAF file and export the biped.) -

- -

-led-yellow Batch Export
- - -Runs the batch exporter to export .bip or .fbx files.
- - -How to use the batch export -

- -

-

- -

- -

Main Dialog: Perforce Rollout

- - -

-dialogPerforce.jpg -

- -

-led-yellow AutoUpdate
- - -If checked, tries to get latest revision every minute from perforce.
- -
- - -

- -

-led-yellow Notify
- - -If checked, shows a message box if there is a new updated installed.
- -
- -
- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name Y(es) N(o) A(sk)
Open For Edit always open never open prompt message to ask
Add to Source Control always add never add prompt message to ask
- - -

-
- -
- -

- -

Main Dialog: Tools Rollout

- - -

- -

- -

dialogTools.jpgled-yellow Reload Script
- - -Destroys the dialog and runs the loading script to load all necessary files again.
- -
- - -led-yellow Prompt for File
- - -When saving or exporting, a open file dialog pops up to get the file -location the animation should be saved to (works only with extension).
- -
- - -led-yellow Biped Working Directory
- - -Has the path of the directory to use when Save / Exporting animations and will be the default folder when Loading Biped Files.
- - -led-yellow Pick
- - -Opens a dialog to get the directory for the biped files.
- - -led-yellow Set
- - -Assigns the folder path to the variable used internally.
- -
- - -led-yellow Use Rollout States
- - -If checked, remembers the last state (rolled up/down) of the rollouts -and when loading the dialog again, these states will be set.
- - -led-yellow Notify File Attribute
- - -If checked, pops up a message box if the file to save or export to is read-only.
- -

- -

- -

- - - - - - diff --git a/Tools/maxscript/docs/BatchExport.html b/Tools/maxscript/docs/BatchExport.html deleted file mode 100644 index 5e436b10bb..0000000000 --- a/Tools/maxscript/docs/BatchExport.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - cryTools: AnimTools: Batch Exporter Rollout - - - - - - - -

cryTools: AnimTools: Batch Exporter Rollout

-

Main Dialog Batch Export Rollout

- -

- -

-

led-orange Input / Output

-

-led-yellow Source
- -Prompts a open folder dialog where you can choose location of files you want to process.
- -led-yellow PreExport
- -Opens a dialog to define a pre-export script which will be executed -before the actually export begins or after the check is done.
- -led-yellow Export
- -Prompts a open folder dialog where you can choose the location to export the files to.
- -

-

-

-

led-orange Check / Export
-

-

-led-yellow Count
- -Counter of files in the file list or how many files are selected.
- -led-yellow Keep Sub Folders
- -If checked, the sub folder structure will be used, otherwise all files in the list will be exported into the Export folder.
- -led-yellow Config
- -Opens a dialog to config the bone detection. -(How to maintain bone detection)
- -led-yellow Detect
- -If checked, automatically chooses the bone specified in Config with the filename.
- -led-yellow +
- -If checked, shows only bone detected files.
- -led-yellow -
- -If checked, shows only non-bone detected files.
- -led-yellow CHECK
- -Processes the files list, without exporting (opening the file, checking -if the file can be exported and running the pre-export script if -defined).
- -led-yellow BATCH
- -Processes the files list (opening the file, checking if the file can be -exported, running the pre-export script if defined and export the file).

-

- -

- - - - - - diff --git a/Tools/maxscript/docs/ControlPanel.html b/Tools/maxscript/docs/ControlPanel.html deleted file mode 100644 index b8b5efeb6f..0000000000 --- a/Tools/maxscript/docs/ControlPanel.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - cryTools: Control Panel - - -

cryTools: Control Panel

- -

-Control Panel Rollout General Overview
-

-The control panel is a place where -you can set personal preferences specific to your workflow. It is -broken up into four main sections Art, Animation, Misc, and Debug Info.
-
-

Art

-Check for Crytek shader at export [Default: ON]
-With this enabled, when the export button is pressed in the cryExport -utility rollout, cryTools will loop through all objects that are in the -current export list and check all of their materials and submaterials. -cryTools will generate a warning if it finds any non 'Crytek' materials -or any object with no defined material.
-
-Re-parent biped twist bones at export [Default: ON]
-Biped forearm twist bones are parented to the upper arm for some weird -reason. They still work if you reparent them to the lower arm, but on -load they are always reparented to the upper arm. With this enabled, -the twist bones will be re-parented to the lower arm on character -export. This way they do not receive weird double transforms ingame.
-Update: This also reparents upper arm twists now
-
-
-

Animation

-Load Old Animation tools
-When checked, the original CryAnimTools will load when 'CryAnimation' is slected from the drop down.

-
-Do not unparent $weapon_bone children at export [Default: OFF]

-I merged our 'animation rigs' into the main character Max file, because -any time the main character was updated, then the animation rig would -need to be updated. Now we animate on the actual character Max file. -Because of this, there are guns parented to the arms that you can cycle -through from within the Animation Tools. It is important that these -guns not export in the hierarchy. With this option checked, the weapon -objects will be exported, as skeletal nodes.
-
-Update: The following have been removed, but the commented code exists
-Auto-update pose collections on max file open [Default: OFF]
-With this enabled, cryTools -will auto-update pose collections when you load a file. This is useful -when an animation team has a pose collection file somewhere on the -network or in P4. You can also click 'Get Latest P4' to manually sync -to the latest pose collections from the control panel without -restarting.
-
-Sync pose collections at p4 start [Default: OFF]
-In addition to the above, each -animator can have their pose collections updated from a P4 location -every time he opens a maxfile.
-
-
-

Misc

-Suppress all export warnings [Default: OFF]
-This is for advanced users. It disabled all warnings for shader -problems, hierarchy issues; everything. You really shouldn't enable -this unless working on some test items and getting annoyed with export -warnings.
-
-Show splash screen [Default: ON]
-You can disable the splash screen here. It is a good idea to leave the -splash screen up as it has some information like your local -build/latest build and the version number, it is also up only during -the time it takes to load/initialize the tools. The cryTools splash -screen can be closed immediately by clicking anywhere on the screen, -you can also click menu items and things while it is up.
-
-
-

Update/Uninstall/Rollback

-Reload/Install Updates From Your Local Build
-This will reload cryTools, this is useful if you have copied over new -scripts, or updated your scripts via PerForce, AlienBrain, etc...
-
-Retreive Latest Tools/Sync
-When this is pressed, it uses the selected option to look for tools -updates. You need to set up the script to work with your P4 or -AlienBrain servers.
-
-Rollback Exporter
-This rolls back to the last version of the exporter
-
-Uninstall Crytools
-This uninstalls the scripts
-
-LOCAL/LATEST Build
-This shows the local and latest builds. The latest build is queried -from a build server, you will have to point it at your server.
-
-

Debug Info

-dump/remove callbacks
-If you click 'dump callbacks', all the callbacks cryTools has -registered will be echoed to the Maxscript Listener. If you click -'remove callbacks' nothing will happen, you have to right click it to -remove all callbacks cryTools has set. To reload the callbacks, you -must restart max, click 'Check/Install updates from your latest build' -in updateTools, or open the tools that registered the callback (like -riggingTools or animationTools)
-
-dump crytek global vars
-This will dump any global variables set by cryTools. Crytools uses a global struct now and does not set as many global vars
-
-Various debug info
-Here you can check for problems. I echo out a lot of the vars that, -when missing or improperly set, can cause cryTools not to work or load. -I will quickly go through them:
-
-MAX VERSION: Self explanatory
-
-MAX PATH: The 3D Studio Max install path
-
-PROJECT: Internally, this is -taken from your P4 root folder name. At Crytek, we use a naming scheme -like "Game02", "Game04", etc. This allows cryTools to be largely -project independent when syncing tools and things on P4.
-
-DOMAIN: This is returned from a -cryTools function that returns the domain of the network the cryTools -users machine is on. This is useful when creating internal tools, it is -not secure, but it keeps debug stuff and hacks out of the UI.
-
-BUILD PATH: This is the location of the build on the users local machine.
-
-CRYEXPORT.INI PATH: The location of the cryexport.ini file
-
-CRYTOOLS.INI PATH: The location of the crytools.ini file where the control panel settings and various other things are stored.
-
-EDITOR PATH: The local path to the editor.
-
-ROLLBACK STATUS: If 'true', -cryTools is currently operating in a 'rolled back' state, and will not -attempt to get latest versions of the exporter and tools at max start. -'False' indicates normal operation.
-
-LOCAL BUILD #: This is the number of the local build on the users HD.
-
-LATEST BUILD #: This is the latest build number on the server (procedural builds)
-
-LATEST BUILD ON SERVER: This is the filename of the latest build on the server.
-
-
-
- - diff --git a/Tools/maxscript/docs/CryAnimTools.html b/Tools/maxscript/docs/CryAnimTools.html deleted file mode 100644 index b09cc502ab..0000000000 --- a/Tools/maxscript/docs/CryAnimTools.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - cryTools: CryAnimTools - - -

CryAnimTools 

-(CryAnimTools are old and have been -replaced with animTools, they still exist and are accessible through -the Control Panel. This is mainly for reference and some old tools that -were not merged into animTools) -

-CryAnimTools Rollout -

-
-
-

CryPlantKey

-CryPlantKey is one of the first -cryTools written, it is used to plant a node (i.e. foot) in a spot -specified by the animator for a given number of frames.
-
-Key Type
-Here you can set the key type of the keys that are generated. You may -choose from any of the three supported Biped key types: Planted, -Sliding, or Free. Checking 'Only for existing' will only overwrite the -existing keys, if this is unchecked the tool will default to one key -per frame.
-
-Begin/End (Set Range)
-You can set a range either by entering a numeric range, or by clicking -the 'begin' and 'end' buttons to dump the current time into the field.
-
-Use Begin/End - Use Timeline
-Upon pressing either of these, the script will run. When 'Use -Begin/End' is pressed, the values entered in the Begin/End fields will -be used, when pressing 'Use Animation Range', the beginning and ending -of the animation range will be used.
-
-
-

BipedTools

-The BipedTools are an extremely user friendly front end to more laborious Biped-related tasks.
-
-Biped Selection
-At the top you see this drop down menu where you select the biped you -are currently wanting to manipulate. This list is set at the time you -open the Animation tools, if you have imported other biped and would -like to update/refresh the list, click the arrow: < . (less than)
-
-Bip Motion Menu
-This takes you to the motion menu tab for the current biped loaded in the tools.
-
-LoadBIP
-An improved (resizable) BIP file requester for loading animations.
-
-Figure Mode / Hide Biped [Toggles]
-These two checkbuttons are toggles, meaning that when you press 'Figure -Mode' it stays hilighted for the duration that the characte is in -figure mode. 'Hide Biped is one of the most used buttons in the entire -Aniamtion toolset; it just hides the entire skeleton.
-
-In Place Mode [Toggle]
-Clikcing the 'In place Mode' toggle will turn on In Place Mode, which -constrains the motion on X and Y, however, pressing 'X or Y will -constrain the motion to only the selected axis.
-
-Select Only Biped Bones
-Selects the original biped skeleton, and ignores any extra helper bones -that have been added. Useful when you want to load up a pose or do some -motion panel operation to all the original biped bones. (motion panel -biped options will not load if a single non-original biped bone is in -the current selection)
-
-Clamp Timeline
-This clamps the timeline at the current key, if you click 'At Last Key' -it will clamp the timeline at the last keyframe of the currently -selected object.
-
-Reverse Animation to FBX Skeleton
-This will generate a skeleton with our internal FBX naming convention -and it will reverse the current animation onto that skeleton. Just give -the script the start and end frames of the animation you would like to -reverse.
-
-Attach Biped to FBX Skeleton / Delete FBX Skeleton
-This will copy the animation of an imported FBX skeleton with the -correct naming convention to the currently loaded biped. 'Delete FBX -Skeleton' removes the FBX skeleton.
-
-Collections
-This loads Biped pose collections and allows you to manually sync to the latest files from Perforce.
-
-Crysis Rig Navigator
-This acts as a synaptic rig element selector, much like what people are -used to in Maya, XSI, and MotionBuilder. You can click on part of the -rig to select it. When working with multiple bipeds in the same scene, -remember to select the biped you want to manipulate at the top of the -BipedTools rollout.
-
-
-

Internal Tools/Fixes

-Animation Setup
-This drop down menu offers you the choices of none, pistol, rifle, mg, -and law. Upon selecting a weapon, it appears in the character's hand
-
-Add Trooper Weapon Bone
-This adds a correctly oriented trooper weapon bone into the trooper -hierarchy. It was made when Antoine needed to iterate through all -trooper animations and add a central weapon bone.
-
-XAF Import/Export
-This is an XAF importer/exporter for non human characters. The idea was -to save XML Animation files (XAF) for all non human characters like we -do BIPs for humans. I implemented it for the trooper, but Animation -never used it and it does not work for other characters currently.
-
-
-

GeneralTools

-Change Rotation to TCB
-This iterates through all selected objects and changes their rotation -controllers to TCB. It really comes in handy when trying to export -vehicles into CryEngine as CGAs (all moving parts need to be TCB).
-
-Bake Motion to Keys
-Bakes all motion on an object to dense keys (1 key/frame)
-
-
-

RangeView

-This drop down menu is populated by -Animator-created 'time-tagged' sequences. It reads in the names and -allows you to select individual sequences. When a sequence is selected, -the timeline beginning/end is set the the time-tagged range's -beginning/ending.
-
-
-

MirrorArms

-When you press 'Mirror' the animation -from one arm to the other will be mirrored for the frames currently in -the timeline. 'copy/mirror root anim' will also copy the root and -reverse it's animation. Keep in mind that you need to be using the -Crysis first person arms rig, and also that these newly created -keyframes might not tween correctly to other keys outside of the -animation range, so you might want to do all keys at once.
-
-
-

Batch Export

-The Batch Exporter was created to -manipulate many animations at once, and make sweeping changes in -animation data. You can do things like add new procedurally driven -bones to a hierarchy then batch export these bones/animation to 3,000 -animations. You could also flip every animation 180 deg on the Z axis. -The exporter works by loading many BIP animations onto a currently -loaded Biped, and exporting them one by one. This makes it very -flexible, and allows you to generate sweeping changes to the animation -dataset with relative ease.
-
-Specify Modes
-The idea was that here you couls specify modes, switching from a BIP -batch exporter to an XAF batch exporter. That idea has currently been -put on hold, since XAF was not switched to as a standard animation -format for non-human characters.
-
-Batch Folder / Save Folder
-Here you set the Batch Folder that has trhe BIP files you would like to -batch process/export, you also select the Save Folder. Upon selecting -the Batch Folder the Export button should enable with the number of bip -files there are present to be batched.
-
-Batching Mutliple Folders
-If you check the box next to Multiple Folders, the Add to list button -should become active. If you press this, your current Batch/Save -folders will be saved in a que below (Folders to Process in List:). You -can save your que and load old queues you have made.
-
-Generate CAL File
-This would generate a CAL file for the animations you were batch -exporting, making it easier to test them and also would make it so you -did not need to dump those new animations directly into your build. The -CAL file system has changed a lot in the past months, so this may no -longer work.
-
-Log to File
-With this enabled, cryTools will generate a log file to the folder in which you are exporting. Here is an example:
-7/20/2006 12:38:22 PM --- Exporting combat_blinded_nw_01
-7/20/2006 12:38:30 PM --- Exporting combat_blinded_pistol_01
-7/20/2006 12:38:40 PM --- Exporting combat_blinded_rifle_01
-7/20/2006 12:38:52 PM --- Exporting combat_callBase_01
-
-Flip on Z Axis
-This will flip all exported animation on the Z axis. This was used to -convert all out animations from facing -Y direction to +Y direction.
-
-Export RAW CAF Data
-This is somewhat deprecated. It used to export RAW CAF animation data, -but now we use a different RAW format and compression scheme. This -option however, is still here for testing and backwards compatibility.
-
-Save BIP/XAF Files
-With this option enabled, the Batch Exporter will also save the BIP -file when it exports. If you check 'Only Save, No Export, the Batch -Exporter becomes a kind of "Batch Saver" that can step through folders -of BIP files and load them onto a new skeleton and resave them with new -bones or other changes.
-
- -
- - diff --git a/Tools/maxscript/docs/CryArtistTools.html b/Tools/maxscript/docs/CryArtistTools.html deleted file mode 100644 index 45812c7b34..0000000000 --- a/Tools/maxscript/docs/CryArtistTools.html +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - cryTools: CryArtistTools - - - - - - - - -

CryArtistTools

- - - - - -

-CryArtistTools Rollout -

- - - - - -

Artist Tools

- - - - -

General Tools

- - -centerPivot
- - - - -This will cycle through all selected objects and center the pivot of each to the center of the objects respective bounding box.
- - - - -
- - - - -preserveUVs
- - - - -This was a request, which turns on and off 'preserve UVs' when clicked. It has also been exposed as a key binding in cryKeys.
- - - - - -
- - - - -resetXformCollapse
- - - -Upon clicking this, cryTools will -loop through all currently selected objects and quickly resetXform and -then collapse each, one by one.

- - - - -
- - - - -Copy/Paste Modifier
- - - - -When clicking Copy Modifier, the -current modifier will be copied and stored in memory. It can then be -pasted to any number of like objects. This is useful for changing a -base mesh and applying the change to many other meshes with the same -point index (useful for heads/morph targets)
- - - - -

UV Tools

- - - - -By pressing ' < ' or reloading -Artist Tools, it will grab the UV info from the currently selected -object. You can now use the following buttons to manipulate the UV -coordinates. There is the ability to scale selected points to 0 on the -X and Y, or X+Y, and to rotate 90 degrees clockwise and -counterclockwise.
- - - -
- - -
- - - -
-

Diagnostics

- - -

polyStats

- - -polyStats gives realtime face, edge and vert data for any selected object.
- - -
-

CGF Metadata Manager

- - - -This tool is used to set-up breakable/destroyable objects. The data is -set and stored in the objects' User Defined Properties (UDP).
- -
-

Object Properties

- - -

Mass (render geometry property)
- - - - -Mass defines the weight of an object based on real world physics. A value of 0 sets the object to "unmovable". This is used on the basement of -a house for example or the sign pole which should not be movable and -always stay in the original position. When used in brushes and Geom -Entities, this is the final part's mass. When used in regular Entities, -all parts masses are scaled so that their total mass gives the mass -specified in the entity properties. -

- - - -

-Density
- -The engine automatically calculates the mass for an object based on the density and the bounding box of an object. -Can be used alternatively to mass. -

- - - -To set the Mass/Density of an object, check the appropriate checkbox -and set the value. To  apply the setting click "Apply Settings to -Selected" button. If wishing to scale the mass of multiple objects with -different masses, select those objects, set the scale value desired, -and press "Update Data" button.
- - - -
- - - -A forced primitve allows a basic shape be defined for the object based -on it's bounding box. Check the desired shape, and apply settings.
- -
- -
TechNote: You must either define this value or density to ensure the simulation is working correctly.
- - - -
- - - -

Joint Properties

- - - - - -Only -Helpers/Dummies can be joints. Joints hold together pieces of the -breakable objects and define how much force (and what kind of force) is -necessary to break the objects from their joints. -To Set the joint properties enable joint properties and set the needed values for the properties desired. - -

-Limit - limit is a general value for several different kind of forces applied -to the joint. It contains a combination of the values below.
- - - - -

- -

TechNote: This value needs to be defined, otherwise the -simulation will not work correctly. -Crysis Example values: 100 - 500 can be broken by a bullet; 10000 can -be broken by the impact of a driving vehicle or a big explosion. -

- - - -

-The following values are optional and are used to fine tune the "limit" settings.
- - - - -

- -

Bend - maximum torque around an axis perpendicular to the normal. -

- - - -

-Twist - maximum torque around the normal -

- - - -

-Pull - maximum force -applied to the joint’s 1st object against the joint normal (the parts -are "pulled together" as a reaction to external forces pulling them -apart) -

- - - -

-Push - maximum force -applied to the joint's 1st object (i.e. the one whose name is listed -first in the joint's name, or if the names were not specified, the -object the joint's z axis points towards) along the joint normal; joint -normal is the joint's z axis, so for this value to actually be "push -apart" (as a reaction to external forces pressing the parts together), -this axis must be directed inside the 1st object -

- - - -

-Shift - maximum force in the direction perpendicular to normal -

- - - - -TechNote: Remember to press 'Apply Settings' after you have made changes to an objects properties.
- - - -
- - -Scale Properties - To scale the joint properties, select the joints that you need to -scale, check the scale properties checkbox, and check the properties -which you desire to scale. Set the scale value and apply settings to -the objects.
-
-
-

Destroyable Objects

-TechNote: please keep in mind that Destroyable objects should also have Mass/Density
-
-
Main: This is the option to set the submodel's name to be "Main" so that it becomes the (only) pre-destruction submodel.
-

-Remain
: This sets the object's name to "Remain" so it becomes the permanent post-destruction submodel which replaces Main.
-
-generic = count: Causes the piece to be spawned -multiple times in random locations throughout the original model. The -count specifies how many times it is spawned. There can be multiple -generic pieces.
-
-
entity: If object is set to entity, the piece is spawned as a persistent entity. Otherwise, it is spawned as a particle.
-
-
rotaxes = axes: For generic pieces, this generates random rotation. Set this to the axis letter(s), for example, z or xyz, -to cause the piece to rotate randomly about the selected local -axis/axes. If not set, the pieces will spawn in their authored rotation.
-
-
sizevar = var : For generic pieces, this randomises the size of each piece, by a scale of 1-var to 1+var.
-
-
-
-
- - -
- - diff --git a/Tools/maxscript/docs/CryMorphTools.html b/Tools/maxscript/docs/CryMorphTools.html deleted file mode 100644 index ded5bb1fdc..0000000000 --- a/Tools/maxscript/docs/CryMorphTools.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - cryTools: CryMorphTools - - - - - - - -

cryTools: -CryMorphTools

- - -


- -

- -

Tutorials

- -Here are some tutorials -on using the MorphTools:
- -
- -Mirroring Morphs and -Deformation (without altering point index)
- -
- -Transferring Morphs Between -Characters
- -
- -Generating Head LODs with Morph -Targets
- -
- -
-

morphtools rollout -

- -

-Facial Tools

- -Please refer to the -tutorials above about how to use these tools. - -

Auto Generation/Extraction -

- - -When you press 'Load -Morphs from Selected, -the text at the top changes to echo the number of morphs loaded fromt -he selected head/mesh. When using the number of morph targets rigidly -setup for the Crysis pipeline, you can ignore 'dirty output', when you -bake out morphs, they will be arranged by morph set and colored in the -fashion that you are used to. The baked out head meshes will also be -named with their respective morpher name. - -

Enable Dirty Output -- This means that you are exporting a head -or object that does not use the rigid preset structure of the Crysis -facial pipeline. Dirty Output is used when baking -or adding an -arbitrary number of morphs to a selected head or object with a morph -modifier (useful for baking out vertex animation, an example in Crysis -would be the parachute). The morphs created are named using the names -fromt he morph target in the morpher modifier, and they are randomly -colored.

- -

Organize (Align to helpers) -- -will move the heads created to artist specified locations, these -locations are marked by helper dummies with the morph name prefixed by -‘Dummy_’. -The overflow (targets baked out that have no corresponding helper) will -default to a row up top, like the ‘dirty’ output -mode. -

- -

-New Layer: - Enter text defining the name of the -layer you would like the morphs baked to. -

- -

-Add Selected Morphs to Picked - This will ass all -selected morph targets to your picked head. The morphs will be named -after the meshes that created them.

- -

Add organized morphs to head -- will dump all the morphs you created (even overflow) to a new head

- -

Delete Faces from Targets -- You -can load a selection of faces and then delete those same faces from any -number of selected objects. All objects must share the same point -index. Useful for deleting faces on multiple heads. (Used in Crysis to -remove the NK heads, but allow eye animation to be played inside the -Asian Nanosuit helmet.) -

- - -

Mirror Eye Animation - -This -will mirror the procedural eye calibration animation from Left to Right -or Right to Left. This animation is used to bake out eye deformation -targets that are later procedurally driven by look IK. The bone eye rig -must be present in the scene to use this tool. -

- - -

Tech Note: Using -this and many other -facial tools (like non-dirty output above) requires strict adherence to -the CryEngine2 Facial Pipeline, these eye bones have specific names and -those names are used to locate and mirror their animation. -

- -

-Morph Transfer -- This is used to transfer morphs between heads with unlike topologies/ -point indices.

- - - -

Sync-Collapse -by Location

- -

-This tool collapses points by location instead of point index, useful -for creating head LODs and loading those collapsed point sets onto -other heads. Unfortunately, it is no longer supported. Though the code -is there if you have the need and want to check it out. Here is an image -explaining the basic concept, and here -is what the marking looks like.
- -
- -Hide Collapsed -- will hide the points you collapse as you go

- -

Collapse Variations as I Work - -will apply your collapse to all head variations as you work

- -

Mark Collapased Verts -- will mark the verts you have collapsed on all the head variations
- -

- -

Here is the basic workflow:
- -1)   Select the main head you will model on and click -‘Select Main
- -2)   You ‘collapse’ -verts on the main head (two at a time) to make an LOD, then click -‘Save Collapse -Data
- -3)   This then saves an ‘.i2l’ file -with your changes.
- -4)   Open a file with other heads (different -character head)
- -5)   Select all the heads and click ‘Select variations
- -6)   Then click ‘Load Collapse Data’ -and select your ‘.i2l’ -file
- -7)   Then click ‘Apply’.
- -
- -

- -

Pose-Driven -Morphs

- -

Head/Neck

-

Pose-driven morphs allow you to -set different ‘pose vectors’ like ‘look_up’, -‘look_down’, ‘look_left’, -‘look_right’, and so on. Each of these directions, can be -associated with a morph target, so when a characters head rotates left, -the geometry is cleaned up with a nice morph shape that an artist -sculpted just for that position.
-

-

Tech Note: As of right now this only works with Skin. But we have a few heads using the Skin modifier, and we can convert Physique to Skin.
-

-

Usage: First you click ‘Select Character Head’ which will then change to HeadName + ‘Head Loaded
-When you select a pose vector, the ‘Create Pose Shape’ -button now becomes enabled if a pose shape associated with this vector -is not already present. When you click this button it will make a head -snapshot in the position of the vector. Note that we are defining the -vectors, and that this system does not allow for an arbitrary number of -vectors and associated morphs (in engine). Here is what it looks like -if you click ‘Create Pose Shape’ for each vector:

-

poseShape
-
-You can now edit any of these objects. The objects are named: Look_Up_sculpt, Look_Down_sculpt, Look_Right_sculpt, Look_Left_sculpt, Tilt_Left_sculpt, Tilt_Right_sculpt
-
-If you click ‘Add Pose Shape To Morpher’, the tool will generate a relative shape with all of the skinning data culled from it, and apply it to the loaded head.

-

The morphs are added to the Morpher in the following channels:
-1)       Look_Up
-2)       Look_Down
-3)       Look_Right
-4)       Look_Left
-5)       Tilt_Left
-6)       Tilt_Right
-
-You can work on a corrective shape, then click ‘Add Pose Shape To Morpher’ and it will apply your work over the associated channel so that you can test as you go. If you click ‘Extract Relative Pose Shape’, -the tool will spit out a relative morph shape in the position of the -original character head with your sculpt changes (minus all -skinning-related transformations). That looks like so:

-

relativePoseShape
-
-Above, some points on Look_Left_sculpt have been tweaked to give the -neck the volume lost in the skinned rotation. The relative shape was -extracted and we now see it on top of the Morrison head (pink, and -looks like he has a goiter).

-

Facial Editor Setup:

-

facialEditor
-
-So you just set the targets up like so, ignore the naming here.

-

Fleshy Eyes (Auto-Created)

-

This works much the same way as -the tool above, but the eye directions drive a special eye rig. The -look directions are already setup, the character just needs to be -imported into this file, you can then refit the bones to his eyes and -weight them.

-

This rig is located in the following path:
-Tools\maxscript\ref\fleshy_eye_rig.max

- -

Baking Tools

-Bake Deformation to Morphs
-
This is a simple tool, you -load an object that has a deformation applied over time. You then set -the frames in which you want the deformation baked off to morphs, then -the number of morphs you would like it baked to.
-

-

Diagnostic Tools

-Morph Manager
-
This is a better morph rollout that comes from the Max SDK/help docs
-
-Generate Morph List
-
This spits out a list of the morphs for a current object to a list in the Listener. If 'Include Channel Numbers' is checked, channel numbers will also be printed.
-
- - diff --git a/Tools/maxscript/docs/CryRiggingTools.html b/Tools/maxscript/docs/CryRiggingTools.html deleted file mode 100644 index 9f241c48ed..0000000000 --- a/Tools/maxscript/docs/CryRiggingTools.html +++ /dev/null @@ -1,675 +0,0 @@ - - - - - - - - - - - - - cryTools: CryRiggingTools - - - - - - -

cryTools: CryRiggingTools

- - - -

-CryRiggingTools Rollout -

- - -

Internal Tools (some deprecated)

- - -This tools rollout only shows up if the DOMAIN is set as INTERN.CRYTEK.DE -(in the cryTools Control Panel you can see your DOMAIN). These tools -are not secret in any way, they are just quick hacks to make it easier -for artists, animators and TDs to fix issues more easily, and deal with -certain project-specific rigs. Even if you are not in the Crytek offices you can easily enable this code or learn from it, or you can just check out how we patched different problems.
-
-TechNote: Arrrr, these be untested waters with monsters abound! Wear a helmet.
-
- -

Helper Joints

- - -This primarily deals with the Crysis -NanoSuit helper joints, but also covers knees, breasts, and others. -Hide/Show Helper Joints will hide and unhide the joints. Select Helper -Joints will select them and Unselect Helper Joints will deselect them.
- - -

File Fixes/Cleanup

- - -Mirror Weapon Bone
- - -This mirrors and correctly orients -the right weapon bone to the left and renames the new one -alt_weapon_bone01. At the start of Crysis characters only had one -weapon bone (in the right hand), mid way through we decided that we -would add another weapon bone in the left hand.
- - -
- - -Select New Attachment Points
- - -When pressed with nothing checked, -this simply selects the new weapon attachment points. With delete\add -checked, it either adds the new attachment points, or if they are -present, deletes them. With hide\show checked it will hide them, or -show them if they are hidden. After a year and a half of Crysis -development, we decided to add many weapon attachment points to every -human character in the game, that's why this tool was written, the -attachment points added are:
- - -
- - -weaponPos_hurricane
- - -weaponPos_law
- - -weaponPos_rifle01
- - -weaponPos_rifle02
- - -weaponPos_pistol_L_leg
- - -weaponPos_pistol_R_leg
- - -weaponPos_pistol_L_hip
- - -weaponPos_pistol_R_hip
- - -weaponPos_grenade_L_hip
- - -weaponPos_grenade_R_hip
- - -
- - -TechNote: The weapon positions are loaded from the following max file: Tools\maxscript\ref\weapon_positions.max
- - -
- - -Wire FP Hands Twist Bones
- - -This wires up and procedurally drives -twist bones on the Crysis first person arms. When we were pretty far -into development we decided twist bones were needed for correct -pronation/supination of the first person arms. The wiring allowed the -current animation assets to drive the twist bones.
- - -
- - -Comment out Nub Bones
- - -We have many 'nub' bones in our rigs, -these are old holdovers from the Physique era. A nub bone was used to -create a physique link, the same way some rigs have 'end' bones. When -you press this button, the tool will search your scene for the -following named nodes and replace them thusly:
- - -
- - -Bip01 HeadNub - _Bip01 HeadNub
- - -Bip01 R Finger0Nub - _Bip01 R Finger0Nub
- - -Bip01 R Finger1Nub - _Bip01 R Finger1Nub
- - -Bip01 R Finger2Nub - _Bip01 R Finger2Nub
- - -Bip01 R Finger3Nub - _Bip01 R Finger3Nub
- - -Bip01 R Finger4Nub - _Bip01 R Finger4Nub
- - -Bip01 L Finger0Nub - _Bip01 L Finger0Nub
- - -Bip01 L Finger1Nub - _Bip01 L Finger1Nub
- - -Bip01 L Finger2Nub - _Bip01 L Finger2Nub
- - -Bip01 L Finger3Nub - _Bip01 L Finger3Nub
- - -Bip01 L Finger4Nub - _Bip01 L Finger4Nub
- - -Bip01 L Heel - _Bip01 L Heel
- - -Bip01 R Heel - _Bip01 R Heel
- - -Bip01LToeHelper - _Bip01LToeHelper
- - -Bip01RToeHelper - _Bip01RToeHelper
- - -

Locomotion Manager

- - -Extract Data to LocoMan Node
- - -When pressed, this steps through all -the frames of the current biped animation and adds a spedcial 'locoMan' -node that the engine uses to get data about the characters movement and -look direction. The node itself looks like a circle around the hips of -the character (or on the ground) with an arrow breaking through it. The -following check boxes effect how the node is created:
- - -
- - -Lock to X/Y - This will lock the node to the X or Y axis.
- - -
- - -Ignore Root Rotation - This will disable Use Head for Direction and Use Root for Direction, and the locoman node will not rotate at all.
- - -
- - -Restrict to Ground Plane - This will restrict the locoMan node to a Z height of 0, or stick it to the flat ground plane during the animation.
- - -
- - -Use Head for Direction -- This will use the head of the character to point the locoMan node -(you assume that the character is looking the direction you want him to -be facing (useful for most instances the root would mess up (like -prone))
- - -
- - -Use Root for Direction - This will use the pelvis orientation to generate a locoMan node direction.
- - -
- - -Freeze and Lock - When checked this will freeze and lock the locator, if you want to refine it's motion by hand, do not leave this checked.
- - -
- - -Remove Unwanted Bones
- - -When you press this button it will -either remove bones from the Skin modifier of the currently selected -node, or delete them, depending on which checkbox is selected. The -bones removed or deleted are any bones commented out of export ('_' -prefix) and *nub bones.
- - -
- - -

Rigging Tools

- - -

General Tools

- - -matchPivot
- - -Select two objects. When you press this button it will snap the pivot of the second object to that of the first.
- - -
- - -zeroOut Rots
- - -This is a bread and butter tool for -TDs. When you press this, it inserts a point helper in the hierarchy -between the currently selected node and it's parent effectively zeroing -out the selected node's rotations. The new node created has the current -node's name + 'ZERO', example: Bip01 R Hand Phys would have a helper -inserted called Bip01 R Hand PhysZERO. This works for any number of -selected objects.
- - -
- - -Clamp Timeline at Current/Last
- - -This clamps the timeline at the -current key, if you click 'At Last Key' it will clamp the timeline at -the last keyframe of the currently selected object.
- - -

Biped Tools

- - -Figure Mode / Hide Biped [Toggles]
- - -These two checkbuttons are toggles, meaning that when you press 'Figure -Mode' it stays hilighted for the duration that the characte is in -figure mode. 'Hide Biped is one of the most used buttons in the entire -Aniamtion toolset; it just hides the entire skeleton.

- - -
- - -Bip Motion Menu
- - -This takes you to the motion menu tab for the current biped loaded in the tools.

- - -
- - -Select Biped Bones
- - -Selects the original biped skeleton, -and ignores any extra helper bones that have been added. Useful when -you want to load up a pose or do some motion panel operation to all the -original biped bones. (motion panel biped options will not load if a -single non-original biped bone is in the current selection)
- - -
- - -Toggle In Place Mode [Toggle]
- - -Clikcing the 'In place Mode' toggle -will turn on In Place Mode, which constrains the motion on X and Y, -however, pressing 'X or Y will constrain the motion to only the -selected axis.
-

- - -Convert Biped to Bones
- - -This will essentially snapshot out the biped to normal nodes that are no longer Biped related, yet keeping the hierarchy.
-

Rotate Bind Pose

- - -This will rotate Skinned -characters an arbitrary rotation, updating the initial skeletal -positions. It does this by saving the weights, removing skin, rotating -the character and the skel, reset xforming the char, then reapplying -skin and the weights.
- - -

Bone Tools

- - -Adjust Bones
-
This allows you to change the Taper, Width, and Height of any selected bones; great for bone chains, ropes, and tentacles!
- - -
-Convert hierarchy to Bones
-
This will convert a node hierarchy to max bones matching their orientations, positions and hierarchy. 'fromSelected' will generate a hierarchy from the selected node down through all it's children. 'fromRoot' will find the root of the selected node and then convert all it's children to max bones.
- - -

Vertex Tools

- - -This is very much a work in progress. -The exporter cannot currently export arbitrary channels of vertex -colors, but when we can, you can use this to create multiple vertex -color channels per object. ChannelInfo brings up the channel info -spreadsheet so that you can see all the vertex channels. vertexColors -is a toggle that enables/disables vertex color shaded mode. Add -cryChannel to Selected will add a channel named 'cry' to the selected -object, you can store various data here for export.
- - -
-

Physics Setup

- - - - -Create Phys Skeleton
- - -This will create a Phys skeleton from a currently selected skeleton. Just select one node in the skeleton, and press the button.
-
-
Create Parent Frame
- - -This will generate a ParentFrame for -the currently selected node, set it above the node in the hierarchy, -name it appropriately, and hide it.
-
-
- -

Diagnostic Tools

- - -

General Diagnostics

- - -selectRoot/selectChildren
- - -With an object selected selectRoot -will traverse the hierarchy and select the root of the object's -hierarchy, whereas selectChildren will select all children of the -current object.
- - -
- - -numChildren [print]
- - -When pressed, this will echo out the -number of children of a currently selected node. When 'print' is -checked, it will export the names of all children nodes in an -excel-friendly format. This is very useful for comparing and -troubleshooting two character hierarchies.
- - -
- - -Compare Two Hierarchies
- - -Select a root object, then press -'Hierarchy1, then select another root who's hierarchy you would like to -compare and press 'Hierarchy2', any differences in the hierarchies will -be printed to the Listener. The hierarchies are stored as global vars, -so you can click one hierarchy and even load another max file or -character to compare. 'Check Consistency' will check the hierarchy -structure and report any inconsistencies.
- - -
- - -

Physique Diagnostics (removed, exist but commented)

- - -TechNote: This requires the Iphysique (IPhysique.gup) maxscript exposure from the Autodesk Sparks website
- - -
- - -Select Verts that use X bones

- - -This will select vertices in the selected node that use the input number of bones.
- - -
- - -Get Bone Count
- - -This returns the number of bones that -are effecting the selected object's mesh. Not to be confused with the -number of bones a character has. With Character Studio, you need to -have a lot of terminator bones that are often not exported, and have no -weights. This returns all bones weighted to the mesh.
- - -
- - -Initial Pose
- - -This shows the initial pose stored by -Physique at the time the physique modifier is applied. Very useful when -troubleshooting exporter issues.
- - -
- - -Select Verts with 0.0 weight
- - -Selects vertices where the sum of their weights is 0.0
- - -
- - -

Animation Diganostics (removed, exist but commented)

- - -Sometimes you will need to output -character position data or translation data. For instance, AI may want -to know how far a character moves out from behind cover in an -animation, or how high the root is when he is in prone or behind cover. -When you press ?Get Weapon\Root Info? the POS and TRANS boxes will -refresh with data. The POS values are the world Z position (how high) -in cm of the main weapon bone weapon_bone and the root. The TRANS data -is the world translation of the weapon_bone and root during the -animation. You can log this data to a file or to the listener, the -logged info is a bit more detailed. (alt weapon bones or arbitrary -objects) Here is an example of the logged data:
- - -
- - -combat_peekIdle_rifle_rightReverse_01
- - -POSITION
- - -Frame: 0f (hiding)
- - -root 88.846977
- - -weapon_bone 101.276
- - -alt_weapon_bone01 101.601
- - -
- - -Frame: 13f (firing)
- - -root 88.846977
- - -weapon_bone 105.406
- - -alt_weapon_bone01 110.632
- - -
- - -

Attachment\Game Diagnostics (deprecated, you should now use Character Editor for creating attachments)

- - -allows us to align Bone Attachments -in Max and export them to Character Editor (which can be extremely -useful for eyes, and constantly changing aliens). Select an object to -be added to the CDF, enter a name for it (this will be the name of the -bone attachment in Character Editor). Press 'Generate CDF Attachment Data' and it will open a dialogue asking "Is this the bone the CDF is attached to?". If it is the bone the you want associated in the CDF, click 'Yes', if not, click 'No, Pick Bone', then click the correct bone in the Max viewport. Example:
- - - -

-riggind dialog 1 -

- - -

-This will bring you to this next dialogue: -

- - -

-rigging dialog 2 -

- - -f this is the name of the exported -CDF file, then click 'Yes', if it is not, click ?No, let me choose.? -And a file dialogue will open. Find the CDF and click ok. The script -will now pop open a window with a generated line of XML that you can -paste into your CDF file. Here is an example:
- - -
- - -<Attachment AName="Gun" -Binding="J:\Game02\Game\Objects\Characters\Alien\Hunter\face_gun_geo.cdf" -BoneName="face_connector" Position="-0.000635176,-2386.97,643.324" -Rotation="-1,0,0,1.87841" Type="CA_BONE" />
- - -
- - -TechNote: The bone associated with the CDF is taken from the parent -bone (as it should be). The name and directory are taken from the -geometry name and the max save path used by the exporter. Also, the -quaternion values CharEdit needs are WXYZ. Also keep in mind that the -CDF XML format may change, check to see what this exports vs the -current CDF standards before checking assets with XML generated from -this tool into a build.
- - -
- - -
-

Smart Object Tools

- - -Template Generator\Exporter
- - -Select the geometry that you will export as the Smart Object CGF, then click Get Smart Obj Geometry. The button text will now change to reflect the object's name, and Add Start\Stop Locations will not be enabled. When you click Add Start\Stop Locations, -two circles will appear, one red and one green, these denote the start -and stop locations. They are named sequentially following the format 'so_start#' and 'so_end#'. If 'Project on Ground' is checked, in the Editor the two start/stop locations will be projected onto the ground.

-
- - -Exporting Smart Object Data
- - -When you click 'Export Smart Object Data' -is pressed, a window will pop up asking you where you would like to -save the XML file. The file will be named with the name of the Smart -Object (printed in the save dialog). If Flip Around Z Axis is checked, -the XML data exported will be rotated 180 degrees on export. This is -done because all out animations are in -Y yet the engine requires -things in +Y
- - -
- -
-

Reactor Tools

- - -Add Objs to Rigid Body - Adds all selected objects to a picked rigid body node
- - -Add Objs to Fracture - Adds all selected objects to a picked fracture node
- - -
-
-

Bake to Bones

-Bake Deformation to Bones
-If you select verts in a deforming mesh, this will step through the -timeline and add small bones to every vert and animate them throughout -the timeline.
-
-
Blend All Bones
-This will step through all bones in the Skin modifier and do the 'blend' function. This is used for smothing out baked deformation, such as a flag or cloth.

- - -
- - -
- - -
- - -
- - diff --git a/Tools/maxscript/docs/LODMorphs.html b/Tools/maxscript/docs/LODMorphs.html deleted file mode 100644 index a817e3262a..0000000000 --- a/Tools/maxscript/docs/LODMorphs.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - cryTools: MorphTools: Generating Head LODs with Morph Targets - - - - - - - - - -

cryTools: MorphTools: Generating Head LODs with Morph Targets

- - -

In this tutorial I will show you how to transfer your morphs -from LOD0 to LOD1, LOD2 etc.

- - -

Here is my max scene the red head is LOD1 and the black one -LOD0. The orange heads are the morphtargets for LOD0.

- - -

1

- - -

First step, create your LODs

- - -

2

- - - - -

For LOD creation you must do all your changes with an -editable poly modifier.

- - -

It is also good, if you are put a morpher under your -editable poly modifier to test your LOD directly with your morphtargets.

- - -

You are also able to fix UVs by adding a unwrap modifier to -your LOD.

- - - - -

Your setup for LOD 1 should look like this:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

3

- -
- -

Unwrap UVw: for fixing UVs - on LOD1

- -
- -

 

- -
- -

Edit Poly: LOD1

- -
- -

 

- -
- -

Morpher: Morph modifier to - test how your morphs are working with your LOD1- contains all the LOD0 morphs

- -
- -

 

- -
- -

Editable Poly: LOD0

- -
- - - - -

Note: When you are working on the edit poly modifier check -your mesh for unwanted gaps.

- - - - -

If your LOD1 is done open the cryMorphTools and go to the -“Facial Tools”.

- - -

Select your LOD1 and click “Load Morphs From Selected”.

- - -

The tool will load all morphs which are added to the morph -modifier and display you how many morphs are stored.

- - -

When you type in a layer name, all generated morphs will be -moved into this layer. In my example I use Morphs_LOD1.

- - -

Normally your generated meshes are moved next to your source -object. To keep your maxscene tidy you can add dummies to your scene. Name the -dummies, Dummy_+the name of the morph. At example: “Dummy_Lip_funneler”.

- - -

Now activate “Organize” and generated Morphs will be -automatically aligned to the dummies.

- - - - -

After this press Bake Morphs.

- - - - -

4

- - - - -

Here you can see the result. On the left the original LOD0 -morph and on the right the baked LOD1.

- - - - -

5

- - - - diff --git a/Tools/maxscript/docs/MirrorMorphs.html b/Tools/maxscript/docs/MirrorMorphs.html deleted file mode 100644 index 5feda14074..0000000000 --- a/Tools/maxscript/docs/MirrorMorphs.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - cryTools: MorphTools: Mirror Morphs - - - - - - - - -

cryTools: MorphTools: Mirroring Morph Targets

- - -

Mirroring Morphs: Background and Explanation

- - - - -

To save time you should mirror your morphs. But this is not -that easy like it sounds, because you are not able to use the tools which 3D -Studio Max provides. The problem of the 3Ds Max tools, like the Symmetry -modifier is that they don’t keep your vertex index, which is necessary for -morphtargets. Here is an example:

-

I selected a vertex which has the vertex ID 442

- - - - -

Now I add a symmetry modifier to mirror my model and an -editable poly modifier to select the vertex again.

- - -

As you can see, the vertex ID changed to 1432.

- - - - - - - - - - - - -

1
-
-

-

cryTools: Mirror Deformation: Setup

-

To mirror morph targets we created our own tool, which keep -the vertex index. Open CryTools > Cry MorphManager and open Mirror -Deformation.

- - - - - - - - -

2
-
-Here is a little example scene.

- - -

On the left side you see a completely symmetrical mesh. On -the right is an asymmetrical mesh. Now we want to mirror the right side of the -morph(the blue mesh) to the left.

- - - - -

3

- - -

First you have to set your source object. Simply select your -main mesh with the neutral facial expression and press the “Select Source -Object” button. After you did that, the name of the chosen object will be -displayed on the button.

- - - - -

4

- - - - -

Now you have to save the vertices which shall be influenced -by the mirror function. For this select the vertices from one side of the -model, without the vertices in the center of your head and press “Save” to save -your selection.

- - -

After you saved the selection as a file you have to load the -file into max. Press the load button and chose the file which you recently -saved.

- - - - -

5

- - - - -

Next time when you open your maxfile you only have to set -your source object and load the saved selection.

- - -

cryTools: Mirror Deformation: Usage

-

You will notice, that you are now able to use the -right----->left / left----->right buttons.

- - - - - - - - - - -

6
-
If want to mirror you object, select “Same Obj”. To mirror -the right side to the left side press 7

-

8

- - -

To flip you object you have the select “New Obj” instead of -“Same Obj”

- -

- - -

- - - - - - - diff --git a/Tools/maxscript/docs/ModelSetup.html b/Tools/maxscript/docs/ModelSetup.html deleted file mode 100644 index 0f2bec91f9..0000000000 --- a/Tools/maxscript/docs/ModelSetup.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - cryTools: AnimTools: Model Set-Up - - - - - - - -

cryTools: AnimTools: Model Set-Up

- -

How to set up models in the main dialogs Misc rollout

- -

-This tutorial describes how to set up models and how to maintain them. -

-

-In this example I choosed a simple charachter. -

-

-led-yellow 1. Open the dialog and hit Load Model:
-
- -1
- -

-

-led-yellow 2. Select Edit Entries:
-
- -2
- -

-

-led-yellow 3. A dialog should pop up. In the list, double click in an empty line to add a model:
-
- -3
- -

-

-led-yellow 4. In the next window you must select the model you want to add:
-
- -4
- -

-

-led-yellow 5. Now the model should be in the list. To maintain them, double click -on the line with the model or click once to rename the entry name:
-
- -5
- -

-

-led-yellow 6. When the list is saved, the new entry is available when clicking again on Load Model:
-
- -6

-

- -

- - - - - - diff --git a/Tools/maxscript/docs/TDTools.html b/Tools/maxscript/docs/TDTools.html deleted file mode 100644 index 9e5a610a5b..0000000000 --- a/Tools/maxscript/docs/TDTools.html +++ /dev/null @@ -1,680 +0,0 @@ - - - - - - - - - cryTools: TD Tools - - - - - -

cryTools: TD Tools

- - -

External Apps

- -There are some exe's in the root directory (/maxscript)
- -
- -scmd.exe - -this is an app that will silently execute a dos command, this is no -longer used, as the the latest exporter plugin now has this -functionality. In the example below I sync a directory via perforce:
- -
- -scmd ("p4 sync \"" + BuildPathFull_crytools + "Tools\\...\"") true
- -
- -md5.exe - this is a freeware md5 hash generator, it is called from the crytools md5 function.
- -
- -

Global Struct

- -These globally available variables -can be accessed through the crytools struct. Because they are members -of the struct, you must access them through it, for instance: crytools.BuildPathFull
- -
- -_fnStore, _fnStoreIndex, _varStore, _varStoreIndex, - -These are global storage arrays that allow variables and functions to -be stored and passed via the storeFn, retrieveFn, storeVar, retrieveVar -functions. These are never directly accessed.
- -
- -localBuildNumber - returns the number of the local build. (The build that the current crytools /maxscript dir is loaded from)
- -
- -print crytools.localBuildNumber
- -"5571"
- -
- -BuildPathFull - returns string of the artists build path to the bin32 directory
- -
- -print crytools.BuildPathFull
- -"J:\Game02\bin32\"
- -
- -maxDirTxt - returns string of the max root dir.
- -
- -print crytools.MaxDirTxt
- -"C:\3dsmax7\"
- -
- -editorPath - path string to the Editor
- -
- -crytools.editorPath
- -"J:\Game02\bin32\Editor.exe"
- -
- -cryINI - path string to the CryTools INI file
- -
- -crytools.cryINI
- -"C:\Program Files\Autodesk\3ds Max 2008\plugins\CryExport.ini"
- -
- -maxVersionNum - returns the version number of 3D Studio Max that the script is being run on
- -
- -print crytools.maxVersionNum
- -"8"
- -
- -project_name - returns the name of the project the artist resides on, taken from the build path.
- -
- -print crytools.project_name
- -"Game02"
- -
- -latest_build - -returns the name of the latest build on S:\, this global variable is -set from within UpdateTools.ms, which refreshes the 'latest_builds.txt' -stored in cry_temp. This is set to "NET_ERROR" if the location cannot -be found on the network.
- -
- -print crytools.latest_build
- -"Game02(2670)_03_27_FastBuild"
- -
- -latestBuildNumber - -returns the number of the latest build available on S:\, this global -variable is set from within 'UpdateTools.ms', which refreshes the -'latest_builds.txt' stored in cry_temp.
- -
- -print crytools.latestBuildNumber
- -"2670"
- -
- -cryExportPresent - set to true or false based on whether or not the exporter plugin is loaded.
- -
- -print crytools.cryExportPresent
- -true
- -
- -cbaPath - returns string of the CBA path.
- -
- -print crytools.cbaPath
- -"J:\Game02\Game\Animations\Animations.cba"
- -
- -rollback_status - -returns whether or not the exporter is currently rolled back to a -previous version. This is currently stored in rollback_status.ini in -the cryTemp folder.
- -
- -print crytools.rollback_status
- -"false"
- -
- -DOMAIN -- returns the network domain of the network the computer is plugged -into. This is set via GetDNS() once and written to the first line of -cryTools.ini and then read in from there every time at load after. This -var is set by AddCryTools.ms
- -
- -print crytools.DOMAIN
- -"INTERN.CRYTEK.DE"
- -
- -

Functions

- -These functions are added on load within AddCryTools.ms, and made available through the crytools struct.
- -
- -scmd <command> wait - Silently -runs a dos command using the cryengine export plugin -(csexport.export.execute_command_line).
- -
- -crytools.scmd ("mkdir \"" + crytools.maxDirTxt + "cry_temp\\bad\\\"") true
- -OK
- -
- -md5 <filename_string> - Returns -string MD5 hash for file queried, you must feed it a valid file. This -function uses an open source, public domain MD5 executable stored in -the /maxscript folder.
- -
- -crytools.md5 "C:\\WINDOWS\\explorer.exe"
- -"A0732187050030AE399B241436565E64"
- -
- -storeFn <function> -<overwrite> - This stores a function in the global crytools -struct where it can be used by any other script. Overwrite will -overwrite any existing fn with the same name. You use retrieveFn to -retrieve the var you have stored. Here is an example below from the -MorphTools script:
- -
- -cryTools.storeFn collapseVerts true --collapseVerts fn now stored in crytools._fnStore
- -
- -crytools._fnstore
- -#(collapseVerts())
- -
- -crytools.retrieveFn "collapseVerts()")() --now we grab the fn and use it
- -OK
- -
- -storeVar <var> <alias> -<overwrite> - This stores a variable in the global crytools -struct where it can be used by any other script. The 'var' is the item -you are storing, and the 'alias' is the associated name. Overwrite will -overwrite a stored var with the same alias. You use retrieveVar to -retrieve the var you have stored. Here is an example below from the -MorphTools script:
- -
- -cryTools.storeVar $ "obj1" true --selected object now stored in crytools._varStore
- -
- -crytools._varstore
- -#($Box:Box01 @ [-101.424500,-0.000001,25.641026])
- -
- -crytools.retrieveVar "obj1" --now we grab the var
- -$Box:Box01 @ [-101.424500,-0.000001,25.641026]
- -
- -alienBrain -<command_argument_string> - This executes AlienBrain command -arugments from within Studio Max. It is set to execute the command via -a JDK bridge/DOS command. This does not load ALienBrain.exe (or the -long load screen associated with it) and executes the commands -instantly and transparently in the background.
- -
- -crytools.alienBrain "getlatest"
- -
- -or something more complex like:
- -
- -crytools.alienBrain ("ab getlatest -Bin32\Tools\maxscript -s Server3 -d " + project_name + " -u login -p -passwd -forcefileupdate -overwritewritable skip")
- -
- -existFile <filename_string> - Returns true/false whether file exists or not
- -
- -crytools.existFile "C:\\WINDOWS\\explorer.exe"
- -true
- -
- -existDir <filename_string> - Returns true/false whether directory exists or not
- -
- -crytools.existDir "C:\\WINDOWS"
- -true
- -
- -or something more complex like:
- -
- -if (crytools.existDir (maxDirTxt + "cry_temp")) == true then (print "cry_temp exists")
- -"cry_temp exists"
- -
- -getDNS() - Returns the Domain Name -Server of the local network. This uses a dos command to dump and read -ipconfig info from a temp file that is then deleted; so it pops up a -black cmd window for a milisecond when called. CryTools calls this -once, and saves that info in cryTools.ini located in the cryTemp -directory in the max root dir.
- -
- -crytools.getDNS()
- -"INTERN.CRYTEK.DE"
- -
- -MirrorObjs <Obj1> <Obj2> -<MObj> <MAxis> <OAxis> - Function for mirroring joint -orientations over an arbitrary axis. The below example is from -CryAnimationTools.ms, you can look there to see it in use.
- -
- -crytools.MirrorObjs right_arm[i] left_arm[i] $root #x #x
- -
- -matchPivot <Obj1> <Obj2> - Aligns the pivot of an object to that of another
- -
- -crytools.matchPivot $obj1 $obj2
- -
- -findRoot <Obj> - Returns the root of the hierarchy the object is a member of
- -
- -crytools.findroot $'Bip01 L Forearm'
- -$Editable_Mesh:Bip01 @ [0.000000,0.000038,90.368042]
- -
- -getChildren <Obj> - Returns the root of the hierarchy the object is a member of
- -
- -print (crytools.getchildren $'Bip01 L Thigh')
- -$PolyMesh:Bip01 L Calf @ [12.594235,-1.113732,49.932632]
- -$PolyMesh:Bip01 L Foot @ [16.074495,4.691678,9.804122]
- -$Editable_Mesh:Bip01 L Toe0 @ [17.749069,-7.237181,0.444188]
- -$Dummy:_Bip01LToeHelper @ [19.030598,-16.366177,0.444188]
- -$Bone:Bip01 L Toe0Nub @ [19.145245,-17.182899,0.149435]
- -$Bone:Bip01 L Heel @ [16.074499,4.691682,-0.687943]
- -$Editable_Mesh:Bip01 L knee @ [12.464909,-0.477371,47.556950]
- -$Dummy:Bip01 L knee_end @ [13.773256,-8.799936,43.612862]
- -$Editable_Mesh:weaponPos_pistol_L_leg @ [23.779840,-4.798794,68.739929]
- -
- -
- -getBips - Returns the Bipeds in the current scene
- -
- -for obj in crytools.getBips() do print obj.name
- -"Bip01"
- -"Bip02"
- -"Bip03"
- -"Bip04"
- -
- -
- -getBindPoseVertexTarget <targetNode> <sourceNode> <vertexID>
- -
- -
- -CreateBindPoseMorph -<targetNode> <sourceNode> <deleteYN> -<addMorphYN> <channelNum> <extractedNode>
- -
- -
- -inFromUDP <targetNode> - This function reads the User Defined Properties for an object into an array
- -
- -crytools.inFromUDP $
- -#("mass = 110", "capsule")
- -
- -
- -outToUDP <targetNode> -<string_array> <echo> - This function reads/writes to the -User Defined Properties buffer for an object
- -
- -crytools.outToUDP #("I have needed this","for quite some time") $ true
- -"I have needed this
- -for quite some time
- -"
- -
- -getUserPropBuffer $
- -"I have needed this
- -for quite some time
- -"
- -
- -crytools.inFromUDP $
- -#("I have needed this", "for quite some time")
- -
- -
- -local2unc <string> - This will convert a local drive letter to a UNC path
- -
- -crytools.local2unc "p"
- -"\\192.168.0.9\public"
- -crytools.local2unc "k"
- -"\\server2\Artists"
- -
- -
- -forceLowerCase <string> - This will convert a string to lowercase
- -
- -crytools.forceLowerCase "MaSs = 19.9"
- -"mass = 19.9"
- -
- -
- -inFromINI <path> echo - This -will read in a text file line by line and return an array where array -element number corresponds to the line number.
- -
- -crytools.infromINI (crytools.maxDirTxt + "\\plugins\\CryExport.ini") true
- -"[Sandbox]"
- -"path = J:\Game02\Bin32\Editor.exe"
- -"animlistpath = J:\Game02\Game\Animations\Animations.cba"
- -#("[Sandbox]", "path = J:\Game02\Bin32\Editor.exe", "animlistpath = J:\Game02\Game\Animations\Animations.cba")
- -
- -
- -outToINI <data> <path> -echo - This will export an array to a text file line by line where -array element number corresponds to the line number.
- -
- -crytools.outtoini test (crytools.maxDirTxt + "\\plugins\\CryExport.ini") true
- -"[Sandbox]"
- -"path = J:\Game02\Bin32\Editor.exe"
- -"animlistpath = J:\Game02\Game\Animations\Animations.cba"
- -
- -
- -plusR <path> - this will check if the file exists and make it read-only
- -
- -crytools.plusR (crytools.maxDirTxt + "\\plugins\\CryExport.ini")
- -
- -minusR <path> - this will check if the file exists and make it writable
- -
- -crytools.minusR (crytools.maxDirTxt + "\\plugins\\CryExport.ini")
- -
- -objTrajectoryToSpline <obj> - this will create a spline showing the trajectory of all selected objects
- -
- -cutString <string input> <string to cut> - this removes the 'string to cut' from the 'string input'.
- -
- -crytools.cutString "Crysis is a beautiful, meticulously designed game" ", meticulously designed"
- -"Crysis is a beautiful game"
- -
- -vertDistance <pos> <pos> - this will output the distance between two positions in space
- -
- -crytools.vertDistance $Box01.pos $Box02.pos
- -169.997
- -
- -copyPasteController <parentObj> -<selOrChild> <copyWhat> - this will copy and paste a -controller, here is an example from CryRiggingTools:
- -
- -crytools.copyPasteController mObj "children" "rp"
- -
- -sliderMan - this is a fn that works -on a selection callback, when you select a slider manipulator, it -always goes into manipulate mode so that it can be used.
- -
- -

Items Stored In cry_temp\

- -A folder named 'cry_temp' is created by AddCryTools.ms, CryTools store many things in this folder, like the following examples:
- -
- -crytools.ini - This stores -suer-specific options, such as window layout and control panel -settings. I will work to fold some of the other droppings below into -this single INI file. Here are some of the things stored within:
- -
- -DOMAIN:INTERN.CRYTEK.DE
- -WARNMATS:true
- -REPARENT:true
- -SUPPRESS:false
- -NO_UNPARENT_WEAPON:false
- -RIGGING_POS:1396:78
- -ANIMATION_POS:1192:78
- -MORPH_POS:2072:70
- -ARTIST_POS:698:457
- -SPLASH:true
- -UPDATE_COLLECTIONS:false
- -SYNC_COLLECTIONS:false
- -LOADOLDANIMTOOLS:false
- -GENERATEMENU:true
- -
- -latest_builds.txt - When UpdateTools.ms is run, it dumps the latest builds from S:\_Builds\ into this txt file.
- -
- -paths.txt - When CryTools were -installed, the InstallCryTools.vbs created this txt file, it stores the -install path of StudioMax and Photoshop. The first line is always -StudioMax and the second Photoshop.
- -
- -C:\3dsmax7C:\graphics\Adobe Photoshop CS2\Plug-Ins\
- -
- -rollback_status.ini - A value of -true/false is stored in this file. When an artist has rolled back their -exporter, the file is set to 'true', when 'Get Latest Tools From -AlienBrain/Latest Build' is pressed in UpdateTools, rollback status is -set to 'false' because the latest exporter is installed.
- -
- -CryExport7.dlu, Morpher.dlm, -MorpherMXS.dlx - When new copies of these are installed, the prior -versions are saved here, where they can be rolled back to on demand. -Currently, the rollback function only exists for CryExport7.dlu. 
- -
- -
- - diff --git a/Tools/maxscript/docs/TransferMorphs.html b/Tools/maxscript/docs/TransferMorphs.html deleted file mode 100644 index 5c8a7de7b0..0000000000 --- a/Tools/maxscript/docs/TransferMorphs.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - cryTools: MorphTools: Transfer Morphs Between Characters - - - - - - - - - -

cryTools: MorphTools: Transferring Morphs Between Characters

- - - - - - - - - - -

To save time we created a way to bake morphtargets from one -character to another character. This tutorial will show you how you we do this.

- - - - -

 We use for all our head the same topology with the same -vertex index. This allows us to transfer morph targets from one head to another -head.

- - - - -

Here you can see an example for this.

- - - - -

1

- - - - - - - - - - -

Let’s bake the existing morphs from the left guy to the -Asian.
-
-
To do this we open the scene of the head with the existing -morphtargets.

- - -

The black head on the upper left corner is our basehead -without morphs. The blue morphs are symmetrical morphs. The red ones are -asymmetrical morphs.

- - -

The green squares are helpers which I will describe later.

- - - - - - - - - - -

2
-
-
Now we apply a morph modifier to the head with the neutral -expression and add all morphs which shall be baked to the Asian head.

- - -

In this case I add all symmetrical and asymmetrical morphs -to it.

- - - - - - - - - - - - -

3
-
-
Delete all Morphtargets of the afro American and merge the -Asian head into your scene. 

- - -

4

- - - - - - - - - - -

5 
-
-
Normally the UVs of the characters are not matching, -therefore we need to use an inbetween step.

- - - - -
    -
  1. create - a copy of the Asian Head (red wireframe).
  2. -
  3. create - a morpher for the asian head, choose the African head as a morphtarget and - set the vaule to 100%
  4. -
  5. collapse - the morpher modifier (result see below – green wireframe)
  6. -
- - - - -

6

- - -
    -
  1. Copy - the morpher from the African head to the Asian head(green wireframe). - Delete the afrcian head, it is not longer needed.
  2. -
  3.  Add the copy of the Asian head (red wireframe) - as a morph to the existing morpher modifier on the green head and turn the - amount to 100%.
  4. -
- - - - - - -

7 

- - -

Open the CryMorphManager and open the “Facial Tools”

- - -

Select the green head and add click on the “Load Morphs From -Selection” button. The tool will load all morphs which are added to the morph -modifier and display you how many morphs are stored.

- - -

When you activate “Organize” your generated Morphs will be -automatically aligned to the helper. Call the helper for this Dummy_+the name -of the morph. At example: “Dummy_Lip_funneler”.

- - -

All generated morphs will be moved into a new layer. For -this set the name of the new layer into the textbox beside to New Layer.

- - -

Before you press the “Bake Morphs” button, be sure that you -have the head with the morphmodifier selected.

- - -

Now you are ready to generate the morphs.

- - - - -

8

- - -

Note: the bake function will also generate a copy of your -copy(red head) which you loaded into the morph modifier. Just delete it if you -don’t need it.

- - -

Result:

- - - - -

13

- - - - -

14

- -

- - - - - - - - diff --git a/Tools/maxscript/docs/WeaponSetup.html b/Tools/maxscript/docs/WeaponSetup.html deleted file mode 100644 index ca159a409c..0000000000 --- a/Tools/maxscript/docs/WeaponSetup.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - cryTools: AnimTools: Model Set-Up - - - - - - - - -

cryTools: AnimTools: Weapon Set-Up

-

How to set up weapons in the main dialogs Misc rollout

- -

-This tutorial describes how to set up weaons and offsets and how to maintain them. -

-

-In this example I choosed a rifle and opened a character max file with the weapon in it. -

-

-led-yellow 1. Open the dialog and hit Edit Entries:
-
- -1
- -

-

-led-yellow 2. A dialog should pop up. In the list, double click in an empty line to add a weapon:
-
- -2
- -

-

-led-yellow 3. In the next window you must select the model of the weapon you want to add:
-
- -3
- -

-

-led-yellow 4. After this another window pops up where to choose the model to get the offset from (for weapons, normally the hand):
-
- -4
- -

-

-led-yellow 5. Now the weapon should be in the list. To maintain them, double click on the line with the weapon:
-
- -5
- -

-

-led-yellow 6. A new dialog pops up where the entries can be edited. In this -example, I changed the name (displayed in the drop down list) and the -external file reference (used to automatically set up the specific -weapon depending on the file name i.e. combat_run_rifle_forward => -rifle)
-
- -6
- -

-

-led-yellow 7. After saving, the changed should be visible in the list:
-
- -7
- -

-

-led-yellow 8. When the list is saved, the new entry is available in the drop down list:
-
- -8

-

- - -

- - - - - - - diff --git a/Tools/maxscript/docs/images/animationTools.png b/Tools/maxscript/docs/images/animationTools.png deleted file mode 100644 index 3e562733dd..0000000000 --- a/Tools/maxscript/docs/images/animationTools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e92bbf1901351890bead8df6a0aec3b74921e97e0559c369d9fa3213c2b587e6 -size 64693 diff --git a/Tools/maxscript/docs/images/artistTools.png b/Tools/maxscript/docs/images/artistTools.png deleted file mode 100644 index e4ec0db34a..0000000000 --- a/Tools/maxscript/docs/images/artistTools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e33683f4dda1f64e19759b08806e1b96d7abbed5408fbd48bc7291af44eb8e2 -size 8519 diff --git a/Tools/maxscript/docs/images/atools/cryAnimInstallation.jpg b/Tools/maxscript/docs/images/atools/cryAnimInstallation.jpg deleted file mode 100644 index a9e79d24cc..0000000000 --- a/Tools/maxscript/docs/images/atools/cryAnimInstallation.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42d17aac12c7633fcc81f19db50fc6c2f61f76b956928a66447e2f1dd75bc07d -size 59344 diff --git a/Tools/maxscript/docs/images/atools/dialog.jpg b/Tools/maxscript/docs/images/atools/dialog.jpg deleted file mode 100644 index 5cf291ad53..0000000000 --- a/Tools/maxscript/docs/images/atools/dialog.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e3b6c735e289f1c17b4207ae884b0202f5fd1dfe5753996fba87e1ad8896077 -size 18335 diff --git a/Tools/maxscript/docs/images/atools/dialogLoadSave.jpg b/Tools/maxscript/docs/images/atools/dialogLoadSave.jpg deleted file mode 100644 index 76cebd314c..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogLoadSave.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fea60fb6729f3945ce4b7f2222d34aee51d760a7d8fc68ca631139c5c4170737 -size 28314 diff --git a/Tools/maxscript/docs/images/atools/dialogMisc.jpg b/Tools/maxscript/docs/images/atools/dialogMisc.jpg deleted file mode 100644 index c6282bf411..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMisc.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2f281e2f9f1d9036486b3498975f1dd766ff9a4d02ff7b7cc0af1c64136ae18 -size 18806 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscModel1.jpg b/Tools/maxscript/docs/images/atools/dialogMiscModel1.jpg deleted file mode 100644 index 83a20c654b..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscModel1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:962a4a05cd80e020e415627e1375fd1b62dc94ec9f0e6f7a6e11775aa3b7dcd3 -size 14538 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscModel2.jpg b/Tools/maxscript/docs/images/atools/dialogMiscModel2.jpg deleted file mode 100644 index 0c62e3928f..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscModel2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:742ecc2db10b5e52b504d0f45e9523847c580ec2244c30c79bb513a47c82af81 -size 13649 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscModel3.jpg b/Tools/maxscript/docs/images/atools/dialogMiscModel3.jpg deleted file mode 100644 index 1bbd7f5603..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscModel3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d2f71a8097ea9a14888007bcb41a85653995de1982f96d659c657ec3138b03f -size 22163 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscModel4.jpg b/Tools/maxscript/docs/images/atools/dialogMiscModel4.jpg deleted file mode 100644 index 9e750a20e7..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscModel4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc6ba42b6416812bb119cef9ee80180ae5a20d4655da9f6660d65e67df793363 -size 27221 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscModel5.jpg b/Tools/maxscript/docs/images/atools/dialogMiscModel5.jpg deleted file mode 100644 index 3335d6c85b..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscModel5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e487eb14e534fb58c5c43ea3d2e74340d5bc996ca7e82ef34fbe70f9ad67029 -size 27550 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscModel6.jpg b/Tools/maxscript/docs/images/atools/dialogMiscModel6.jpg deleted file mode 100644 index 2367e7c23a..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscModel6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4545ab2cb7fe68ed593c05e7a54fde0531891fa331ff2c0681cc0e89d0a60c06 -size 13879 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon1.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon1.jpg deleted file mode 100644 index 2566ebdc99..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70d298ac06240c53cc363cf7b68de9a830e107f9e1bacb017188932ef6ba034a -size 18019 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon2.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon2.jpg deleted file mode 100644 index 754fc47b62..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f70bcc08c7d12f1113f8ae6d17eab7fc5e0912e203d581722f1e0ad08220b95 -size 26878 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon3.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon3.jpg deleted file mode 100644 index 1312ed62eb..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e4e4b70739b87e6e3bd7262aaa320ff42fe26de61d5b7035cf34bc3fd5405bc -size 70477 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon4.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon4.jpg deleted file mode 100644 index ff5dba84f1..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:067b154666e80254d588389e0ead30a05a270d673787e990de945873c355c6e4 -size 69964 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon5.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon5.jpg deleted file mode 100644 index 9c174dec47..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c8b31ae2e844e77b32bcabe146996544caba9a849f2f08c7645878a8d41e1d8 -size 32734 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon6.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon6.jpg deleted file mode 100644 index aecfbb630b..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c05e0e5955e97d3509c1616e3eb6f362b120a75909ae76103e840576ec56294 -size 28820 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon7.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon7.jpg deleted file mode 100644 index 3f34caffb7..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0333816d0bff20b1884e3d6ecfad100b926a23053b454ea452b15ac014bc51d4 -size 32095 diff --git a/Tools/maxscript/docs/images/atools/dialogMiscWeapon8.jpg b/Tools/maxscript/docs/images/atools/dialogMiscWeapon8.jpg deleted file mode 100644 index 1e2d1beb7e..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogMiscWeapon8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de91adb1008d3b298a63524e7591d8c627893d56566d8426d2bd2e46a31f6143 -size 18007 diff --git a/Tools/maxscript/docs/images/atools/dialogOperation.jpg b/Tools/maxscript/docs/images/atools/dialogOperation.jpg deleted file mode 100644 index b299f86f14..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogOperation.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1b14cba868c9033378069a482a04afb10ab09a3049538b20dadad464769e13e -size 20445 diff --git a/Tools/maxscript/docs/images/atools/dialogPerforce.jpg b/Tools/maxscript/docs/images/atools/dialogPerforce.jpg deleted file mode 100644 index 7be2e5fa49..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogPerforce.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c616954e31d861ba1420552f06c896f52d649bc352646a3b7832578c987dd6bf -size 23376 diff --git a/Tools/maxscript/docs/images/atools/dialogPivot.jpg b/Tools/maxscript/docs/images/atools/dialogPivot.jpg deleted file mode 100644 index 8b1d44ed4a..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogPivot.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bce24a5da1f5df8508545ae75679332847c80b34cef2b8aceedbce9a11b769c0 -size 17168 diff --git a/Tools/maxscript/docs/images/atools/dialogSelection.jpg b/Tools/maxscript/docs/images/atools/dialogSelection.jpg deleted file mode 100644 index 76ddde3cf4..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogSelection.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ff1a723f3b0ffaaad490290d77c7560c6f1510be38ec8d21422935664401201 -size 15638 diff --git a/Tools/maxscript/docs/images/atools/dialogSelection2.jpg b/Tools/maxscript/docs/images/atools/dialogSelection2.jpg deleted file mode 100644 index 7f2ab16235..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogSelection2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8bba45c4b1c6395e3b69b1516e325228569afc2c983129bdeb994386f2bc5ae -size 15749 diff --git a/Tools/maxscript/docs/images/atools/dialogTools.jpg b/Tools/maxscript/docs/images/atools/dialogTools.jpg deleted file mode 100644 index 933679b53c..0000000000 --- a/Tools/maxscript/docs/images/atools/dialogTools.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3aa055ede1dfdd62c90d37c882fd2a9a9fdbde0d70a92b9423a3cdbde92d821 -size 23384 diff --git a/Tools/maxscript/docs/images/atools/go_forward.gif b/Tools/maxscript/docs/images/atools/go_forward.gif deleted file mode 100644 index 3debfe3015..0000000000 --- a/Tools/maxscript/docs/images/atools/go_forward.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7e98e0450bc62594cfc12ce3508b829dcc6a2751f5c63c0547a1b9b328fed62 -size 234 diff --git a/Tools/maxscript/docs/images/atools/led-orange.gif b/Tools/maxscript/docs/images/atools/led-orange.gif deleted file mode 100644 index 606205f3be..0000000000 --- a/Tools/maxscript/docs/images/atools/led-orange.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f6d682be931822900dbe0d5a5b3c558c33608637d418c12c7bfedcb93801884 -size 951 diff --git a/Tools/maxscript/docs/images/atools/led-yellow.gif b/Tools/maxscript/docs/images/atools/led-yellow.gif deleted file mode 100644 index 25f0d362b1..0000000000 --- a/Tools/maxscript/docs/images/atools/led-yellow.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d7cf16caee9de10a67c4fc065b235ee33bd950bf3cad2ddaa0b80bfab48ff96 -size 944 diff --git a/Tools/maxscript/docs/images/atools/quadmenu.jpg b/Tools/maxscript/docs/images/atools/quadmenu.jpg deleted file mode 100644 index 10cdad33b6..0000000000 --- a/Tools/maxscript/docs/images/atools/quadmenu.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b41fb8feba4f64d816195cef9469308c5e12873957d167b8f870b69880fe7dd -size 50578 diff --git a/Tools/maxscript/docs/images/controlpanel.png b/Tools/maxscript/docs/images/controlpanel.png deleted file mode 100644 index cdcb8635af..0000000000 --- a/Tools/maxscript/docs/images/controlpanel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92ce9fd0bd6a4a6ad5a4333de4daa3c9cfb215f3ee640b12b7ade3144205ad4a -size 14419 diff --git a/Tools/maxscript/docs/images/facialEditor_pose.png b/Tools/maxscript/docs/images/facialEditor_pose.png deleted file mode 100644 index f543756d0a..0000000000 --- a/Tools/maxscript/docs/images/facialEditor_pose.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:758bacc01923d7418b36727783b8bdc9936a86738dac8b614afba02bfaf55832 -size 10602 diff --git a/Tools/maxscript/docs/images/lod_morph/image001.jpg b/Tools/maxscript/docs/images/lod_morph/image001.jpg deleted file mode 100644 index 97912359f2..0000000000 --- a/Tools/maxscript/docs/images/lod_morph/image001.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3956250cd1c7a69c0e8d35eae5c68f6e8c4e7dc8be77ef0346a514212de26f71 -size 146923 diff --git a/Tools/maxscript/docs/images/lod_morph/image002.jpg b/Tools/maxscript/docs/images/lod_morph/image002.jpg deleted file mode 100644 index 9336df6fb9..0000000000 --- a/Tools/maxscript/docs/images/lod_morph/image002.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:041c7fe2bec3927d9405fc7751160974d2d986ade5702b8f18db6277833301aa -size 164580 diff --git a/Tools/maxscript/docs/images/lod_morph/image003.jpg b/Tools/maxscript/docs/images/lod_morph/image003.jpg deleted file mode 100644 index dca1a6b595..0000000000 --- a/Tools/maxscript/docs/images/lod_morph/image003.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a0279f5c70a799f1b6ec6480c2ad265729b75d035b1e1e3da1983411fff7c6f -size 7195 diff --git a/Tools/maxscript/docs/images/lod_morph/image004.jpg b/Tools/maxscript/docs/images/lod_morph/image004.jpg deleted file mode 100644 index 92baf96f2c..0000000000 --- a/Tools/maxscript/docs/images/lod_morph/image004.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72944c8011593f1fe22c675a13effd13eccb3cac7b105e8c6d34cd2815536578 -size 30176 diff --git a/Tools/maxscript/docs/images/lod_morph/image005.jpg b/Tools/maxscript/docs/images/lod_morph/image005.jpg deleted file mode 100644 index 7c88233a50..0000000000 --- a/Tools/maxscript/docs/images/lod_morph/image005.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e94ab0949c8aa7646e8b552f2326071da4d4d5f8763e5cad9a4f11e48647dbbd -size 384371 diff --git a/Tools/maxscript/docs/images/lod_morph/image006.jpg b/Tools/maxscript/docs/images/lod_morph/image006.jpg deleted file mode 100644 index 4ccc2c380e..0000000000 --- a/Tools/maxscript/docs/images/lod_morph/image006.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:630f6d191331379ebf685593a74ef673007246c2087307a68ee3288c20a86ff0 -size 69612 diff --git a/Tools/maxscript/docs/images/metsdata_lister.png b/Tools/maxscript/docs/images/metsdata_lister.png deleted file mode 100644 index dbd9f90064..0000000000 --- a/Tools/maxscript/docs/images/metsdata_lister.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56bcfe6088dc4253618d93b58d3b3e89f1992f2398815d8d2ab99d2c29d396b1 -size 9458 diff --git a/Tools/maxscript/docs/images/morphTools.png b/Tools/maxscript/docs/images/morphTools.png deleted file mode 100644 index 11ae598a05..0000000000 --- a/Tools/maxscript/docs/images/morphTools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37aa35a06441c7430ef1fa2c8fdf4b07c9c7ae25d694874393d729afd44712cc -size 24626 diff --git a/Tools/maxscript/docs/images/morph_tut/image001.jpg b/Tools/maxscript/docs/images/morph_tut/image001.jpg deleted file mode 100644 index d6798c685c..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image001.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4d4ff3bdda6fbcebaa036f86f24bb5b71a28c738cd2d74177b8025e6eb696b7 -size 199104 diff --git a/Tools/maxscript/docs/images/morph_tut/image002.jpg b/Tools/maxscript/docs/images/morph_tut/image002.jpg deleted file mode 100644 index 0f969ce434..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image002.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be9c2f4dc81c467a5f73595ab559cceb41c80e497983585c163f03a124f783ab -size 31029 diff --git a/Tools/maxscript/docs/images/morph_tut/image003.jpg b/Tools/maxscript/docs/images/morph_tut/image003.jpg deleted file mode 100644 index fd04e1f1db..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image003.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25282eb37abfb1a0f69aaf62eac49776b286efe35052c662e848e21f842dfd7a -size 108819 diff --git a/Tools/maxscript/docs/images/morph_tut/image004.jpg b/Tools/maxscript/docs/images/morph_tut/image004.jpg deleted file mode 100644 index d8f3926279..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image004.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9ca99099ce269ecfbbfa4324106b6f76691c19971ad5ebe4fe21fccb65eb730 -size 210703 diff --git a/Tools/maxscript/docs/images/morph_tut/image005.jpg b/Tools/maxscript/docs/images/morph_tut/image005.jpg deleted file mode 100644 index 49adb3b6c1..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image005.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b64c5c8207227504454315857d1d7ffb9d6b799c66934e3728521eaa8e6cb81 -size 231251 diff --git a/Tools/maxscript/docs/images/morph_tut/image006.jpg b/Tools/maxscript/docs/images/morph_tut/image006.jpg deleted file mode 100644 index 1ab1fceca0..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image006.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b2dd6119c02068424beff8aecf7067d3cb6f9a0c67c9853352e5a606cc62510 -size 16069 diff --git a/Tools/maxscript/docs/images/morph_tut/image007.jpg b/Tools/maxscript/docs/images/morph_tut/image007.jpg deleted file mode 100644 index f3a936d0f8..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image007.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65f9d155fbcf4591d95a555a986268c5d0b7d1a15df8fe27491e4d82be165b3a -size 1743 diff --git a/Tools/maxscript/docs/images/morph_tut/image008.jpg b/Tools/maxscript/docs/images/morph_tut/image008.jpg deleted file mode 100644 index 408f70f40e..0000000000 --- a/Tools/maxscript/docs/images/morph_tut/image008.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c350812b1fedcd568b3e324963eb0f4214cbbfd7656a032e2d76eb0525df38d -size 303427 diff --git a/Tools/maxscript/docs/images/poseShape.jpg b/Tools/maxscript/docs/images/poseShape.jpg deleted file mode 100644 index 7e6ec67314..0000000000 --- a/Tools/maxscript/docs/images/poseShape.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:776614bdb2f2942bf07ecdd3fa6be3e22fefe2ef773d60b26a2ebfe0acb55fbc -size 65640 diff --git a/Tools/maxscript/docs/images/relativePoseShape.png b/Tools/maxscript/docs/images/relativePoseShape.png deleted file mode 100644 index 713fe39999..0000000000 --- a/Tools/maxscript/docs/images/relativePoseShape.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e80b5117a6d517c3605efa25c078917ae9c97db639ec30a7581a6e967d4fe4b3 -size 16621 diff --git a/Tools/maxscript/docs/images/riggingTools.png b/Tools/maxscript/docs/images/riggingTools.png deleted file mode 100644 index 81882882a0..0000000000 --- a/Tools/maxscript/docs/images/riggingTools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d501e3c0528039ac12396b978fd65e6a1d3a463e931271eaae6068bda49e0c67 -size 12510 diff --git a/Tools/maxscript/docs/images/rigging_dia01.png b/Tools/maxscript/docs/images/rigging_dia01.png deleted file mode 100644 index 914fea8372..0000000000 --- a/Tools/maxscript/docs/images/rigging_dia01.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1430ffae1a486cf08083ca5a8fe5b1aca8719f81aab3ff291c156f66593b9f8 -size 3644 diff --git a/Tools/maxscript/docs/images/rigging_dia02.png b/Tools/maxscript/docs/images/rigging_dia02.png deleted file mode 100644 index 9c8047c4ac..0000000000 --- a/Tools/maxscript/docs/images/rigging_dia02.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5187d9daf0011c7fb84c5ed68b59870c3cf9c7ba58dcc3a9565513555ecf4f6f -size 4915 diff --git a/Tools/maxscript/docs/images/syncLoc.jpg b/Tools/maxscript/docs/images/syncLoc.jpg deleted file mode 100644 index 455bf0535d..0000000000 --- a/Tools/maxscript/docs/images/syncLoc.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab1f1d04a3203a223bbf6c978f67336a4be12bce7ca1a27a5aa93db3a04a2e78 -size 110867 diff --git a/Tools/maxscript/docs/images/syncLoc2.jpg b/Tools/maxscript/docs/images/syncLoc2.jpg deleted file mode 100644 index a1cc680d4e..0000000000 --- a/Tools/maxscript/docs/images/syncLoc2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d18db2e89dea39bfded031f3881976207d2430a659ed27c21359cc101e493681 -size 138782 diff --git a/Tools/maxscript/docs/images/transfer_tut/image001.jpg b/Tools/maxscript/docs/images/transfer_tut/image001.jpg deleted file mode 100644 index 324104a267..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image001.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12ca9da0a4d8b1af54849a407ca0197dd7607c12acc1de8a52e89b23ef1d1a7b -size 329551 diff --git a/Tools/maxscript/docs/images/transfer_tut/image002.jpg b/Tools/maxscript/docs/images/transfer_tut/image002.jpg deleted file mode 100644 index 79d5980bae..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image002.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ade4ff2ab2069b332acb83654938b3517c258f9873b9aadc25053f211ca1ce2 -size 27267 diff --git a/Tools/maxscript/docs/images/transfer_tut/image003.jpg b/Tools/maxscript/docs/images/transfer_tut/image003.jpg deleted file mode 100644 index ce776b3f8b..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image003.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8a8fb5795239282ae3b5868773c8417fdd78d4ce606c60c6f712bd90ced9351 -size 183009 diff --git a/Tools/maxscript/docs/images/transfer_tut/image004.jpg b/Tools/maxscript/docs/images/transfer_tut/image004.jpg deleted file mode 100644 index 164453b4d5..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image004.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e404e5be5c3bbe47bf533f8a5a8227b7390a8ecbfa5d72f70d05a2a0d9f0a452 -size 43603 diff --git a/Tools/maxscript/docs/images/transfer_tut/image005.jpg b/Tools/maxscript/docs/images/transfer_tut/image005.jpg deleted file mode 100644 index 366bcc1dd8..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image005.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fb334ec6937b75687a5b5fe2be4665ba628c6e6f3a689eed226265bf810a0a3 -size 280440 diff --git a/Tools/maxscript/docs/images/transfer_tut/image006.jpg b/Tools/maxscript/docs/images/transfer_tut/image006.jpg deleted file mode 100644 index 1f15716b0d..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image006.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59ef8524a03917f049f578a87b7653b250c13d2df8beaaac3af09649c0aaa84d -size 67482 diff --git a/Tools/maxscript/docs/images/transfer_tut/image007.jpg b/Tools/maxscript/docs/images/transfer_tut/image007.jpg deleted file mode 100644 index aef26503ca..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image007.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e39260bb4f1031dcc966d601a11160f22bc26855121e04f49c1adacaff0651d -size 84979 diff --git a/Tools/maxscript/docs/images/transfer_tut/image008.jpg b/Tools/maxscript/docs/images/transfer_tut/image008.jpg deleted file mode 100644 index d2914717e2..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image008.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f31c8d320cac71ec3427c0170de827cd726325b26c985950b0abfedbf2e6680 -size 40731 diff --git a/Tools/maxscript/docs/images/transfer_tut/image009.jpg b/Tools/maxscript/docs/images/transfer_tut/image009.jpg deleted file mode 100644 index f87e183214..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image009.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec0f5b9e5281f4e6e8f83a2f67ce525294cbaf24ab2e62c038bc79d96a6fcc62 -size 111650 diff --git a/Tools/maxscript/docs/images/transfer_tut/image010.jpg b/Tools/maxscript/docs/images/transfer_tut/image010.jpg deleted file mode 100644 index 5d4866c7d1..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image010.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e4cafb7c38cc45e0d47e348364aa949e175d34010fa900d707b9059e7bcddb9 -size 164283 diff --git a/Tools/maxscript/docs/images/transfer_tut/image011.jpg b/Tools/maxscript/docs/images/transfer_tut/image011.jpg deleted file mode 100644 index c4f236a718..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image011.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf11496887c967fa88e45a1cd32e6fd801c237318ee03f271a63b1390b48dd1d -size 188702 diff --git a/Tools/maxscript/docs/images/transfer_tut/image012.jpg b/Tools/maxscript/docs/images/transfer_tut/image012.jpg deleted file mode 100644 index ea9a1f3eba..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image012.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59ff837cbfc85dbe85244437770c2de791f4f2cf99db214b4ef3b6e8eaedf5eb -size 28776 diff --git a/Tools/maxscript/docs/images/transfer_tut/image013.jpg b/Tools/maxscript/docs/images/transfer_tut/image013.jpg deleted file mode 100644 index 9fabb80a2a..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image013.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d98a2a1af92a7f90b2d32eb3c1b0f5ae59f94c2c256560249dc9cc4c961c27ec -size 208518 diff --git a/Tools/maxscript/docs/images/transfer_tut/image014.jpg b/Tools/maxscript/docs/images/transfer_tut/image014.jpg deleted file mode 100644 index 265eebc8b9..0000000000 --- a/Tools/maxscript/docs/images/transfer_tut/image014.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d350b4c837bbbc3c1ef42f3bae61a495ff91cdf0c82e59289a80d4085eb7fd5 -size 205810 diff --git a/Tools/maxscript/docs/index.html b/Tools/maxscript/docs/index.html deleted file mode 100644 index 9f82ed661b..0000000000 --- a/Tools/maxscript/docs/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - cryTools: Documentation - - - - - - - -

cryTools: Documentation

- - - -

Document Index

- - - -

About Crytools

- - -

AnimTools (old)

- - -

MorphManager

- - -

RiggingTools

- - -

ArtistTools

- - -

CryInfo

- - -

Control Panel

- - -

TD Tools

- - -
- - - -
- - - -
- - - -
- - - -
- - diff --git a/Tools/maxscript/fx/Fur.fx b/Tools/maxscript/fx/Fur.fx deleted file mode 100644 index 0dbf562f20..0000000000 --- a/Tools/maxscript/fx/Fur.fx +++ /dev/null @@ -1,488 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -float4x4 WorldMatrix : World; -float4x4 ViewInverseMatrix : ViewI; -float4x4 ViewMatrix : View; -float4x4 ProjMatrix : Projection; - -int texcoord0 : Texcoord // UVs -< - int Texcoord = 0; - int MapChannel = 1; - string UIWidget = "None"; ->; - -int texcoord1 : Texcoord // Vertex color -< - int Texcoord = 1; - int MapChannel = 0; - string UIWidget = "None"; ->; - -int texcoord2 : Texcoord // Vertex alpha -< - int Texcoord = 2; - int MapChannel = -2; - string UIWidget = "None"; ->; - -float4 PointLight0Pos : Position -< - string UIName = "Point Lamp 0 Position"; - string Object = "PointLight"; - string Space = "World"; - string UIGroup = "Lighting"; -> = {-54.0f, 50.0f, 100.0f, 1.0f}; - -float3 PointLight0Col : Diffuse -< - string UIName = "Point Lamp 0 Color"; - string UIWidget = "Color"; - string Object = "PointLight"; - string UIGroup = "Lighting"; -> = {1.0f, 0.95f, 0.85f}; - -float3 AmbientColor : Ambient -< - string UIName = "Ambient Light"; - string UIWidget = "Color"; - string UIGroup = "Lighting"; -> = {0.07f, 0.07f, 0.07f}; - -// Surface attributes -float Kd -< - string UIName = "Diffuse Brightness"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 1.0; - float UIStep = 0.05; - string UIGroup = "Diffuse"; -> = 1.0; - -float Ks -< - string UIName = "Specular Brightness"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 1.0; - float UIStep = 0.05; - string UIGroup = "Lighting"; -> = 0.6; - -float SpecularExponent : SpecularPower -< - string UIName = "Specular Power"; - string UIWidget = "Slider"; - float UIMin = 1.0; - float UIMax = 128.0; - float UIStep = 1.0; - string UIGroup = "Lighting"; -> = 25.0; - -// Fur parameters and textures -float FurLengthCM -< - string UIName = "Fur Length (cm)"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 100.0; - float UIStep = 0.1; -> = 10.0; - -float FurMaxGravity -< - string UIName = "Fur Maximum Gravity"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 5.0; - float UIStep = 0.01; -> = 2.0; - -float FurStiffness -< - string UIName = "Fur Stiffness"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 1.0; - float UIStep = 0.001; -> = 1.0; - -float FurDensity -< - string UIName = "Fur Density"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 25.0; - float UIStep = 0.1; -> = 5.0; - -float FurBaseIntrusion -< - string UIName = "Fur Base Intrusion"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0; - float UIMax = 1; - float UIStep = 0.001; -> = 0.0; - -float FurCombBias -< - string UIName = "Fur Combing Bias"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0; - float UIMax = 5; - float UIStep = 0.01; -> = 1.0; - -bool UseFurCombing -< - string UIName = "Enable Fur Combing"; - string UIGroup = "Fur Parameters"; -> = true; - -bool UseSecondDiffuse -< - string UIName = "Use Base Fur Diffuse Map"; - string UIGroup = "Fur Parameters"; -> = true; - -texture ColorTexture -< - string ResourceType = "2D"; - string UIName = "Color Texture"; - string UIGroup = "Diffuse"; ->; - -sampler2D ColorSampler = sampler_state -{ - Texture = ; - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; -}; - -texture BaseColorTexture -< - string ResourceType = "2D"; - string UIName = "Fur Tip Color Texture"; - string UIGroup = "Diffuse"; ->; - -sampler2D BaseColorSampler = sampler_state -{ - Texture = ; - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; -}; - -texture FurHeightmap -< - string ResourceType = "2D"; - string UIName = "Fur Heightmap"; - string UIGroup = "Fur Parameters"; ->; - -sampler2D FurHeightmapSampler = sampler_state -{ - Texture = ; - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; -}; - -struct appdata -{ - float3 Position : POSITION; - float2 baseTC : TEXCOORD0; - float3 Color : TEXCOORD1; - float3 Alpha : TEXCOORD2; - float3 Normal : NORMAL; -}; - -struct v2f -{ - float4 HPosition : POSITION; - float4 baseTC : TEXCOORD0; - float3 vView : TEXCOORD1; - half furLength : TEXCOORD2; - float3 LightVec : TEXCOORD3; - float3 WorldNormal : TEXCOORD4; -}; - -float GetFurLength() -{ - // Convert from centimeters to inches - return FurLengthCM * 0.393701; -} - -void ComputeFurCombing(inout float3 vFurComb, float4x4 ObjToWorldMatrix) -{ - // Assumes Z-up coordinates - vFurComb.xyz = 2 * vFurComb.xyz - 1.0; - if (any(step(0.02, abs(vFurComb)))) // Using slop of 0.02, so that 128 / 255 is applied as 0 - { - vFurComb = mul(float4(normalize(vFurComb), 0), ObjToWorldMatrix).xyz; - vFurComb = normalize(vFurComb); - } - else - { - vFurComb = float3(0, 0, 0); - } -} - -void ModifyVertexForShell(inout float4 vPosWorld, float3 vNormWorld, float4x4 ObjToWorldMatrix, half shellDistance, float3 vFurComb, float furLengthScale) -{ - // Stiffness attenuation is quadratic so that the fur tips can bend a lot while the roots move less - half stiffness = (1.0 - FurStiffness); - stiffness *= stiffness; - stiffness *= shellDistance; - - float3 vFurNormal = vNormWorld; - - // Intrude base fur position by a percentage of fur length - vPosWorld.xyz -= vNormWorld * FurBaseIntrusion * furLengthScale * GetFurLength(); - - if (FurStiffness < 1.0 && FurMaxGravity > 0.0) // Apply gravity for this shell - { - float3 vGravityWorld = float3(0, 0, stiffness * -FurMaxGravity); - - float nDotGrav = dot(vFurNormal, vGravityWorld); - - // Compute rejection of G on N: W - N * (G dot N) / (N dot N) - float3 gravProj = vGravityWorld - nDotGrav * vFurNormal; - - vFurNormal = normalize(vFurNormal + gravProj); - } - - if (UseFurCombing) - { - ComputeFurCombing(vFurComb, ObjToWorldMatrix); - - // Restrict fur combing to the hemisphere pointing in the normal direction - float nDotComb = dot(vFurNormal, vFurComb); - if (nDotComb < 0) - { - float3 vNCrossComb = cross(vFurNormal, vFurComb); - float3 vOrthoN = cross(vNCrossComb, vFurNormal); - vFurComb = normalize(vOrthoN); - } - - vFurComb = normalize(vFurComb + vFurNormal); - } - else - { - vFurComb = vFurNormal; - } - - float3 vOffset = lerp(vFurComb, vFurNormal, 1 - pow(shellDistance, FurCombBias)); - vOffset *= GetFurLength() * furLengthScale * shellDistance; - - vPosWorld.xyz += vOffset; -} - -v2f FurVS(appdata IN, uniform half shellProgress) -{ - v2f OUT = (v2f)0; - float3 normal = normalize(IN.Normal); - OUT.WorldNormal = mul(float4(normal, 0), WorldMatrix).xyz; - OUT.WorldNormal = normalize(OUT.WorldNormal); - - float4 posWorld = mul(float4(IN.Position, 1), WorldMatrix); - - ModifyVertexForShell(posWorld, OUT.WorldNormal, WorldMatrix, shellProgress, IN.Color, IN.Alpha.x); - - OUT.LightVec = normalize(PointLight0Pos.xyz - posWorld.xyz); - OUT.baseTC = float4(IN.baseTC, 0, 0); - OUT.vView.xyz = normalize(float3(ViewInverseMatrix[0].w, ViewInverseMatrix[1].w, ViewInverseMatrix[2].w) - posWorld.xyz); - - OUT.HPosition = mul(mul(posWorld, ViewMatrix), ProjMatrix); - OUT.furLength = shellProgress * GetFurLength() * IN.Alpha.x; - - return OUT; -} - -float4 FurPS(v2f IN, uniform half shellProgress) : COLOR -{ - // Clip shells that are too close to the base surface, but ensure that the base pass draws fully - clip((IN.furLength - 0.001) * sign(shellProgress)); - - half furHeight = max(0.01, tex2D(FurHeightmapSampler, IN.baseTC.xy * FurDensity).r); - half strandPercent = smoothstep(0.0, furHeight, shellProgress); - - float3 baseColor = tex2D(BaseColorSampler, IN.baseTC.xy).rgb; - float3 tipColor = tex2D(ColorSampler, IN.baseTC.xy).rgb; - float3 diffuseColor = lerp(baseColor, tipColor, strandPercent); - if (!UseSecondDiffuse) - { - diffuseColor = tipColor; - } - - float3 Nn = IN.WorldNormal; - float3 Vn = IN.vView; - float3 Ln = IN.LightVec; - float3 Hn = normalize(Vn + Ln); - - float4 litV = lit(dot(Ln, Nn), dot(Hn, Nn), SpecularExponent); - float3 diffContrib = (litV.y * Kd) * PointLight0Col * diffuseColor; - float3 specContrib = (Ks * litV.z) * PointLight0Col; - - float3 result = (diffContrib + specContrib); - result += (AmbientColor * diffuseColor); - - half scaledFurLength = 1.0 - strandPercent * strandPercent; - return float4(baseColor, scaledFurLength); -} - -#define furPass(shellProgress, blendEnable) VertexShader = compile vs_3_0 FurVS(shellProgress); \ - PixelShader = compile ps_3_0 FurPS(shellProgress); \ - AlphaBlendEnable = blendEnable; \ - SrcBlend = srcalpha; \ - DestBlend = invsrcalpha - -technique FurLod0 -{ - pass pass00 { furPass(0.0, false); } - - pass pass01 { furPass(0.015625, true); } - pass pass02 { furPass(0.031250, true); } - pass pass03 { furPass(0.046875, true); } - pass pass04 { furPass(0.062500, true); } - pass pass05 { furPass(0.078125, true); } - pass pass06 { furPass(0.093750, true); } - pass pass07 { furPass(0.109375, true); } - pass pass08 { furPass(0.125000, true); } - pass pass09 { furPass(0.140625, true); } - pass pass10 { furPass(0.156250, true); } - pass pass11 { furPass(0.171875, true); } - pass pass12 { furPass(0.187500, true); } - pass pass13 { furPass(0.203125, true); } - pass pass14 { furPass(0.218750, true); } - pass pass15 { furPass(0.234375, true); } - pass pass16 { furPass(0.250000, true); } - pass pass17 { furPass(0.265625, true); } - pass pass18 { furPass(0.281250, true); } - pass pass19 { furPass(0.296875, true); } - pass pass20 { furPass(0.312500, true); } - pass pass21 { furPass(0.328125, true); } - pass pass22 { furPass(0.343750, true); } - pass pass23 { furPass(0.359375, true); } - pass pass24 { furPass(0.375000, true); } - pass pass25 { furPass(0.390625, true); } - pass pass26 { furPass(0.406250, true); } - pass pass27 { furPass(0.421875, true); } - pass pass28 { furPass(0.437500, true); } - pass pass29 { furPass(0.453125, true); } - pass pass30 { furPass(0.468750, true); } - pass pass31 { furPass(0.484375, true); } - pass pass32 { furPass(0.500000, true); } - pass pass33 { furPass(0.515625, true); } - pass pass34 { furPass(0.531250, true); } - pass pass35 { furPass(0.546875, true); } - pass pass36 { furPass(0.562500, true); } - pass pass37 { furPass(0.578125, true); } - pass pass38 { furPass(0.593750, true); } - pass pass39 { furPass(0.609375, true); } - pass pass40 { furPass(0.625000, true); } - pass pass41 { furPass(0.640625, true); } - pass pass42 { furPass(0.656250, true); } - pass pass43 { furPass(0.671875, true); } - pass pass44 { furPass(0.687500, true); } - pass pass45 { furPass(0.703125, true); } - pass pass46 { furPass(0.718750, true); } - pass pass47 { furPass(0.734375, true); } - pass pass48 { furPass(0.750000, true); } - pass pass49 { furPass(0.765625, true); } - pass pass50 { furPass(0.781250, true); } - pass pass51 { furPass(0.796875, true); } - pass pass52 { furPass(0.812500, true); } - pass pass53 { furPass(0.828125, true); } - pass pass54 { furPass(0.843750, true); } - pass pass55 { furPass(0.859375, true); } - pass pass56 { furPass(0.875000, true); } - pass pass57 { furPass(0.890625, true); } - pass pass58 { furPass(0.906250, true); } - pass pass59 { furPass(0.921875, true); } - pass pass60 { furPass(0.937500, true); } - pass pass61 { furPass(0.953125, true); } - pass pass62 { furPass(0.968750, true); } - pass pass63 { furPass(0.984375, true); } - pass pass64 { furPass(1.000000, true); } -} - -technique FurLod1 -{ - pass pass00 { furPass(0.0, false); } - - pass pass01 { furPass(0.031250, true); } - pass pass02 { furPass(0.062500, true); } - pass pass03 { furPass(0.093750, true); } - pass pass04 { furPass(0.125000, true); } - pass pass05 { furPass(0.156250, true); } - pass pass06 { furPass(0.187500, true); } - pass pass07 { furPass(0.218750, true); } - pass pass08 { furPass(0.250000, true); } - pass pass09 { furPass(0.281250, true); } - pass pass10 { furPass(0.312500, true); } - pass pass11 { furPass(0.343750, true); } - pass pass12 { furPass(0.375000, true); } - pass pass13 { furPass(0.406250, true); } - pass pass14 { furPass(0.437500, true); } - pass pass15 { furPass(0.468750, true); } - pass pass16 { furPass(0.500000, true); } - pass pass17 { furPass(0.531250, true); } - pass pass18 { furPass(0.562500, true); } - pass pass19 { furPass(0.593750, true); } - pass pass20 { furPass(0.625000, true); } - pass pass21 { furPass(0.656250, true); } - pass pass22 { furPass(0.687500, true); } - pass pass23 { furPass(0.718750, true); } - pass pass24 { furPass(0.750000, true); } - pass pass25 { furPass(0.781250, true); } - pass pass26 { furPass(0.812500, true); } - pass pass27 { furPass(0.843750, true); } - pass pass28 { furPass(0.875000, true); } - pass pass29 { furPass(0.906250, true); } - pass pass30 { furPass(0.937500, true); } - pass pass31 { furPass(0.968750, true); } - pass pass32 { furPass(1.000000, true); } -} - -technique FurLod2 -{ - pass pass00 { furPass(0.0, false); } - - pass pass01 { furPass(0.062500, true); } - pass pass02 { furPass(0.125000, true); } - pass pass03 { furPass(0.187500, true); } - pass pass04 { furPass(0.250000, true); } - pass pass05 { furPass(0.312500, true); } - pass pass06 { furPass(0.375000, true); } - pass pass07 { furPass(0.437500, true); } - pass pass08 { furPass(0.500000, true); } - pass pass09 { furPass(0.562500, true); } - pass pass10 { furPass(0.625000, true); } - pass pass11 { furPass(0.687500, true); } - pass pass12 { furPass(0.750000, true); } - pass pass13 { furPass(0.812500, true); } - pass pass14 { furPass(0.875000, true); } - pass pass15 { furPass(0.937500, true); } - pass pass16 { furPass(1.000000, true); } -} \ No newline at end of file diff --git a/Tools/maxscript/fx/cryBlendShader.fx b/Tools/maxscript/fx/cryBlendShader.fx deleted file mode 100644 index a6f3b3241b..0000000000 --- a/Tools/maxscript/fx/cryBlendShader.fx +++ /dev/null @@ -1,235 +0,0 @@ -////////////////////////////////////////////////////////////// -//simple Duffuse bump - adapted from the nVidia cgFX samples -//This sample supports Render To Texture and is setup to use -//Mapping channel 3 - it just needs to be uncommented. -////////////////////////////////////////////////////////////// - -float4x4 worldMatrix : World; // World or Model matrix -float4x4 WorldIMatrix : WorldI; // World Inverse or Model Inverse matrix -float4x4 mvpMatrix : WorldViewProj; // Model*View*Projection -float4x4 worldViewMatrix : WorldView; -float4x4 viewInverseMatrix : ViewI; - -// tweakables - -int texcoord0 : Texcoord -< - int Texcoord = 0; - int MapChannel = 1; - string UIWidget = "None"; ->; - -int texcoord1 : Texcoord -< - int Texcoord = 1; - int MapChannel = 0; - string UIWidget = "None"; ->; - -int texcoord2 : Texcoord -< - int Texcoord = 2; - int MapChannel = -2; - string UIWidget = "None"; ->; - -texture diffuseTexture1 : DiffuseMap1 < - string UIName = "DiffuseMap 1"; - int Texcoord = 0; - >; - -texture diffuseTexture2 : DiffuseMap2 < - string UIName = "DiffuseMap 2"; - int Texcoord = 0; - >; - -texture normalMap : NormalMap < - string UIName = "NormalMap"; - int Texcoord = 0; - >; - -bool useLight : UseLight < - string UIName = "Use Light"; - > = 0; - -float4 lightDir : Direction < - string UIName = "Light Direction"; - string Object = "TargetLight"; - int RefID = 0; - > = {-0.577, -0.577, 0.577,1.0}; - -float3 lightCol : LIGHTCOLOR < - string UIName = "Light Color"; - string Object = "TargetLight"; - int RefID = 0; - > = {1.0, 1.0, 1.0}; - -float3 dirtTint : DirtTint < - string UIName = "Dirt Tint"; - > = {1.0, 1.0, 1.0}; - -float dirtStrength : DirtStrength < - string UIName = "Dirt Strength"; - float UIMin = 0.0f; - float UIMax = 1.0f; - float UIStep = 0.01f; - > = 1.0f; - -float dirtMapAlpha : DirtMapAlpha < - string UIName = "Dirt Map Alpha"; - float UIMin = 0.0f; - float UIMax = 1.0f; - float UIStep = 0.01f; - > = 1.0f; - -float dirtTile : DirtTile < - string UIName = "Dirt Tiling"; - float UIMin = 0.0f; - float UIMax = 16.0f; - float UIStep = 0.01f; - > = 1.0f; - -struct a2v { - float4 Position : POSITION; //in object space - float2 UV : TEXCOORD0; // in uv coords - float3 vCol : TEXCOORD1; // in Vertex alpha - float3 Alpha : TEXCOORD2; // in Vertex alpha - float3 Normal : NORMAL; //in object space - float3 T : TANGENT; //in object space - float3 B : BINORMAL; //in object space -}; - -struct v2f { - float4 Position : POSITION; //in projection space - float4 uv : TEXCOORD0; - float4 vCol : TEXCOORD1; - float3 LightVector : TEXCOORD2; - float3 Normal: TEXCOORD3; - float3 LightCol : TEXCOORD4; -}; - -struct f2fb { - float4 col : COLOR; -}; - -v2f DiffuseBumpVS(a2v IN, - uniform float4x4 WorldViewProj, - uniform float4x4 WorldIMatrix, - uniform float4 LightDir, - uniform float3 LightCol) -{ - v2f OUT; - - // pass texture coordinates for fetching the diffuse1 map - float2 uv = IN.UV; - float2 dirtUV = uv * dirtTile; - dirtUV.y -= 1.0f; - - OUT.uv = float4(uv, dirtUV); - - - OUT.vCol = float4(IN.vCol, IN.Alpha.x); - - //OUT.vCol = float4(0,0,0,IN.Alpha.x); - - // compute the 3x3 tranform from tangent space to object space - float3x3 objToTangentSpace; - objToTangentSpace[0] = IN.B; - objToTangentSpace[1] = IN.T; - objToTangentSpace[2] = IN.Normal; - - // transform normal from object space to tangent space and pass it as a color - OUT.Normal.xyz = 0.5 * mul(IN.Normal,objToTangentSpace) + 0.5; - - float4 vertnormLightVec = normalize(LightDir); - - // transform light vector from object space to tangent space and pass it as a color - OUT.LightVector.xyz = mul(objToTangentSpace, vertnormLightVec.xyz ); - OUT.LightCol = LightCol; - - // transform position to projection space - OUT.Position = mul(IN.Position,WorldViewProj).xyzw; - - return OUT; - -} - -f2fb DiffuseBumpPS(v2f IN, - uniform sampler2D DiffuseMap1, - uniform sampler2D DiffuseMap2, - uniform sampler2D NormalMap) -{ - f2fb OUT; - - //fetch base color1 - float4 color = tex2D(DiffuseMap1,IN.uv.xy ); - - //fetch base color2 - float4 color2 = tex2D(DiffuseMap2,IN.uv.zw ); - - //color = lerp(color, color2, (1-IN.vCol.w) * lerp(1, color2.a, dirtAlpha)); - - float blendFac = lerp(1.0f, color2.a, dirtMapAlpha) * dirtStrength * (1.0f - IN.vCol.w); - - color.rgb = lerp(color.rgb, color2.rgb * dirtTint, blendFac); - - //compute final color - OUT.col = color * float4(IN.vCol.xyz, 1); - - if (useLight) - { - //fetch bump normal - - float3 bumpNormal = 2 * (tex2D(NormalMap,IN.uv.xy).xyz-0.5); - - //expand iterated light vector to [-1,1] - float3 lightVector = 2 * (IN.LightVector - 0.5 ); - lightVector = normalize(lightVector); - float3 bump = dot(bumpNormal,lightVector.xyz); - OUT.col *= float4(bump,1) * float4(IN.LightCol,1); - } - - OUT.col.a = 1.0; - - return OUT; -} - -sampler2D diffuseSampler1 = sampler_state -{ - Texture = ; - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; -}; - -sampler2D diffuseSampler2 = sampler_state -{ - Texture = ; - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; -}; - -sampler2D normalSampler = sampler_state -{ - Texture = ; - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; -}; - -//////// techniques //////////////////////////// - -technique Default -{ - - pass p0 - { - ZEnable = true; - ZWriteEnable = true; - CullMode = None; - VertexShader = compile vs_1_1 DiffuseBumpVS(mvpMatrix,WorldIMatrix,lightDir,lightCol); - PixelShader = compile ps_2_0 DiffuseBumpPS(diffuseSampler1,diffuseSampler2,normalSampler); - } -} - diff --git a/Tools/maxscript/icons/90c.png b/Tools/maxscript/icons/90c.png deleted file mode 100644 index a213ba42d1..0000000000 --- a/Tools/maxscript/icons/90c.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21831b7cf3b34c43f9c5482734a8df78e69d795d4ecccb1a9684da241399b7d2 -size 568 diff --git a/Tools/maxscript/icons/90cc.png b/Tools/maxscript/icons/90cc.png deleted file mode 100644 index 928fc2078e..0000000000 --- a/Tools/maxscript/icons/90cc.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fccff8d71eb66ab189400b8de226f17d18c3a0565f8046ff76f5238e619d5175 -size 561 diff --git a/Tools/maxscript/icons/LEloop.png b/Tools/maxscript/icons/LEloop.png deleted file mode 100644 index 26622837ee..0000000000 --- a/Tools/maxscript/icons/LEloop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:060462b1103cea34612f6bae526620229256de71a1859cdf6b36bd81c4d914c3 -size 3308 diff --git a/Tools/maxscript/icons/LEring.png b/Tools/maxscript/icons/LEring.png deleted file mode 100644 index 3b5634920f..0000000000 --- a/Tools/maxscript/icons/LEring.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2db8543ca99a95f709e005aca40495d49f8bc890958dba936e6087138724e2e1 -size 3258 diff --git a/Tools/maxscript/icons/LPloop.png b/Tools/maxscript/icons/LPloop.png deleted file mode 100644 index 7fc1a45b1c..0000000000 --- a/Tools/maxscript/icons/LPloop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c7ef24d260aff9e3a762407604eccb20431309cd03cf8565bdfb0f49c9f29cf -size 2850 diff --git a/Tools/maxscript/icons/LVloop.png b/Tools/maxscript/icons/LVloop.png deleted file mode 100644 index a373912d26..0000000000 --- a/Tools/maxscript/icons/LVloop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cfbd88c22be683248ced0cf43837da44671cd6e91e9f76e5d15684f38f4da14 -size 3292 diff --git a/Tools/maxscript/icons/LVring.png b/Tools/maxscript/icons/LVring.png deleted file mode 100644 index bbfc4c37e6..0000000000 --- a/Tools/maxscript/icons/LVring.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:711e447eb7a6f56af3ce52cc2132d8a9b7db8e85c3b717ce841d3bbb2d60361c -size 2847 diff --git a/Tools/maxscript/icons/scaleHoriz.png b/Tools/maxscript/icons/scaleHoriz.png deleted file mode 100644 index e229175f27..0000000000 --- a/Tools/maxscript/icons/scaleHoriz.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5013c6af39b2a1efc8bf33e94628e70394e2e938295834d0524448aa2c5e39a4 -size 280 diff --git a/Tools/maxscript/icons/scaleUniform.png b/Tools/maxscript/icons/scaleUniform.png deleted file mode 100644 index a339698455..0000000000 --- a/Tools/maxscript/icons/scaleUniform.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dba132156dcb20b0ab72787fa59ccef95b9958a3cacdd68eab7072a5dcd7a578 -size 265 diff --git a/Tools/maxscript/icons/scaleVert.png b/Tools/maxscript/icons/scaleVert.png deleted file mode 100644 index 656741064f..0000000000 --- a/Tools/maxscript/icons/scaleVert.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dd1e8adae94818d5ce7146a2b0f9302e972c664e410228219f7ea965d2ea6bf -size 253 diff --git a/Tools/maxscript/icons/splash.png b/Tools/maxscript/icons/splash.png deleted file mode 100644 index 57205c91b6..0000000000 --- a/Tools/maxscript/icons/splash.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2bbdac033a346859027b7df6e5d53de5dcc568eb8b421cf9c19067c06a74b41 -size 5225 diff --git a/Tools/maxscript/md5.exe b/Tools/maxscript/md5.exe deleted file mode 100644 index 630421aa77..0000000000 --- a/Tools/maxscript/md5.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b7f9a223ac5a8c768287fb9ee321364f8586ea392a3e4f75f48e3edeb936e69 -size 49152 diff --git a/Tools/maxscript/mocapTools.ms b/Tools/maxscript/mocapTools.ms deleted file mode 100644 index 43fff15614..0000000000 --- a/Tools/maxscript/mocapTools.ms +++ /dev/null @@ -1,1011 +0,0 @@ -( - global mocapTools - if mocapTools != undefined do ( closerolloutfloater mocapTools ) - mocapTools = newrolloutfloater "facialMocapTools" 200 780 - - local markerSetArray = #() - local markerOrigLoc = #() - local mocapSetArray = #() - local boneArray = #() - local stabMarkers = #() - - rollout markerData "Marker Data" - ( - checkbutton markerSet "Define Marker Set" - spinner markerSize "Resize Marker Set " width:100 offset:[65,0] enabled: false - button convertPoints "Convert Set to Points" enabled:false - checkbox posOnly "position" offset:[10,0] checked:true - checkbox rotOnly "rotation" offset:[90,-20] - button rexerXforms "Reset Marker Transforms" - group "Reference Markers" - ( - checkbutton spheresOn "Simulate Ref Markers" offset:[-27,0] - checkbox threeMM "3mm" offset:[120,-25] - checkbox fiveMM "5mm" offset:[120,0] checked:true - checkbox onRef "Ref Markers Only" offset:[-5,-15] - ) - group "Stabilization Markers" - ( - checkbutton stabMarkersBtn "Define Stabilization Markers" - button testThresh "Test Integrity" offset:[-35,0] enabled:false - spinner threshSize "mm: " width:60 offset:[27,-22] - checkbox stabLog "output detailed log" align:#center - ) - label nameWarn "UI below requires template naming.." - button colorMarkers "Color Markers" offset:[-25,0] - checkbutton hideMarkers "Hide" offset:[45,-26] - button markerSymmetry "Update Marker Symmetry" - checkbox RL "Right->Left" - checkbox LR "Left->Right" offset:[90,-20] checked:true - group "Bone Tools" - ( - button genBones "Generate Bones" offset:[-40,0] - spinner boneSize "Size: " width:60 offset:[27,-22] - button saveBones "Save Bone Influences" offset:[-26,0] - checkbutton hideBones "Hide" offset:[62,-26] - button loadBones "Load Bone Influences" offset:[-26,0] - ) - - local markerSetArray = #() - local markerOrigLoc = #() - local stabArray = #() - local stabMarkers = #() - - on markerData open do - ( - markerSize.value = 1.0 - boneSize.value = 1.0 - isHidden = false - try - ( - for obj in $*_bone do - ( - if obj.ishidden == true then (isHidden = true) - ) - ) - catch() - if isHidden == true then (hideBones.checked = true) - ) - - on markerSet changed state do - ( - if state == true then - ( - markersetarray = #() - convertPoints.enabled = true - markerSize.enabled = true - - if $ == undefined then - ( - if (queryBox "No markers selected. Generate marker set\n by pair matching existing C3D data?") == true then - ( - textOut = "Markers Found and Added to Marker Set:\n" - n = 0 - testFor = "" - for obj in $C3D* do - ( - if (getnodebyname((filterstring obj.name ":")[2])) != undefined then - ( - append markersetarray (getnodebyname((filterstring obj.name ":")[2])) - textOut += (obj.name + " - " + (obj.position as string) + "\n") - n+=1 - ) - else - ( - append testFor (obj.name + "\n") - ) - ) - - if testFor != "" then - ( - - messagebox ("C3D data present with no matched markers:\n-----------------------------------------------------\n" + testFor) - ) - - textOut2 = (n as string + " ") - append textOut2 textOut - messagebox textOut2 - ) - else - ( - messagebox "No markers selected/found \n('C3D:' prefix search)" - markerSet.checked = false - return undefined - ) - ) - - for obj in selection do - ( - append markerSetArray obj - append markerOrigLoc obj.pos - ) - markerSet.text = ("Marker Set Defined: " + markersetarray.count as string + " Markers") - - --check for points - pcheck = true - for obj in markersetarray do - ( - if obj.classid[1] != 8211 then - ( - pcheck = false - ) - ) - if pcheck == true then - ( - convertpoints.enabled = false - ) - ) - else - ( - markerSet.text = "Define Marker Set" - convertPoints.enabled = false - markerSetArray = #() - markerSize.enabled = false - ) - ) - - on markerSize changed val do - ( - undo "resizeMarkers" on - ( - for obj in markerSetArray do - ( - if obj.classid[1] == 8211 then - ( - obj.size = val - ) - if obj.classid[1] == 8872500 then - ( - obj.boxsize = [val,val,val] - ) - ) - ) - ) - - on boneSize changed val do - ( - for obj in selection do - ( - try - ( - obj.radius = val - origNode = (filterString obj.name "_") - if orignode[3] != "bone" then - ( - print "error: non genBone" - return undefined - ) - - if origNode[1] == "R" then - ( - mirrorNode = (getnodebyname ("L_" + origNode[2] + "_bone")) - mirrorNode.radius = val - ) - if origNode[1] == "L" then - ( - mirrorNode = (getnodebyname ("R_" + origNode[2] + "_bone")) - mirrorNode.radius = val - ) - ) - catch() - ) - ) - - on convertPoints pressed do - ( - undo "convertPoints" on - ( - newMarkerSetArray = #() - local newpoint = "" - for obj in markerSetArray do - ( - if obj.classid[1] != 8211 then - ( - newPoint = point name:obj.name - newPoint.wireColor = (color 255 255 255) - if posOnly.checked == true then - ( - newPoint.position.controller = obj.position.controller - ) - if rotOnly.checked == true then - ( - newPoint.rotation.controller = obj.rotation.controller - ) - delete obj - append newMarkerSetArray newPoint - ) - ) - markerSetArray = newMarkerSetArray - convertPoints.enabled = false - ) - ) - - on rexerXforms pressed do - ( - try - ( - for obj in markerSetArray do - ( - resetXform obj - collapseStack obj - ) - ) - catch() - ) - - on spheresOn changed state do - ( - if spheresOn.checked == true then - ( - undo "refMarkers" on - ( - if markersetarray.count == 0 then - ( - messagebox "No marker set defined" - return undefined - ) - for obj in markersetarray do - ( - new = sphere position:obj.position name:(obj.name + "_testSphere") - new.wirecolor = color 255 255 255 - if threeMM.checked == true then (new.radius = .15) - else (new.radius = .25) - if onRef.checked == true then - ( - new.pos = obj.pos - new.parent = obj - ) - else - ( - try - ( - if (filterstring obj.name ":" )[1] != "C3D" then - ( - new.pos = (getnodebyname ("C3D:" + obj.name)).pos - new.parent = (getnodebyname ("C3D:" + obj.name)) - ) - else - ( - new.parent = obj - ) - ) - catch - ( - print ("no C3D:" + obj.name + " present.") - ) - ) - ) - ) - ) - else - ( - delete $*testSphere - --max hide helper toggle - ) - ) - - on stabMarkersBtn changed state do - ( - if state == true then - ( - if selection.count != 0 then - ( - stabMarkers = #() - for obj in selection do - ( - append stabMarkers obj - ) - stabMarkersBtn.text = (stabMarkers.count as string + " STAB Markers Defined") - testThresh.enabled = true - ) - ) - else - ( - stabMarkersBtn.text = "Define Stabilization Markers" - stabMarkers = #() - testThresh.enabled = false - ) - ) - - on testThresh pressed do - ( - errorText = "" - errorTextArr = #() - stabOut = "" - for obj1 in stabMarkers do - ( - for obj2 in stabMarkers do - ( - test = (crytools.distDiff obj1 obj2 detail:true logOut:true) - append stabOut (obj1.name + ">" + obj2.name + "\n") - append stabOut test[4] - if test[1] > (threshSize.value/10) then - ( - append errorTextArr ((test[1]*10) as string + "mm | Min: " + test[2] as string + " Max: " + test[3] as string + " | " + obj1.name + " <---> " + obj2.name + "\n") - ) - ) - ) - - if errortextArr != #() then - ( - fn compareFN v1 v2 = - ( - local t1 = ((crytools.cutstring (filterstring v1 "|")[1] "mm ") as integer) - local t2 = ((crytools.cutstring (filterstring v2 "|")[1] "mm ") as integer) - local d = t1-t2 - case of - ( - (d < 0.): -1 - (d > 0.): 1 - default: 0 - ) - ) - - qsort errorTextArr compareFN - - errorText = "" - for element in errorTextArr do errorText += element - - errortext = (append ("------------------------------------------------------------------\n") errortext) - errortext = (append ("Error Threshold: " + threshSize.value as string + "mm Frames Tested:" + ((((animationrange.end as integer)/TicksPerFrame)-((animationrange.start as integer)/TicksPerFrame)) as string) + "\n") errortext) - messagebox errortext title:("Stabilization Marker Threshold Warning!") - - if stabLog.checked == true then - ( - savePath = getSaveFileName initialDir:crytools.buildPathFull caption:"Where to dump log:" - if savePath == undefined then - ( - return undefined - ) - else - ( - if (out = createFile savePath) != undefined then - ( - format stabOut to:out - ) - ) - ) - ) - ) - - on genBones pressed do - ( - undo "genBones" on - ( - boneExist = #() - for obj in $* do - ( - test = (filterstring obj.name "_") - if test[test.count] == "bone" then (append boneExist obj) - ) - - if boneExist.count != 0 then - ( - textOut = ("There are " + boneExist.count as string + " existing facial bones.\nRebuild bone definitions from existing bones?") - if (queryBox textOut) == true then - ( - boneArray = boneExist - newFound = "" - for obj in boneArray do (newFound += (obj.name + "\n")) - tellUser = ("Bone Info Rebuilt from " + bonearray.count as string + " Nodes:\n") - append tellUser newFound - messagebox tellUser - return undefined - ) - ) - - if markersetarray.count == 0 then - ( - messagebox "No defined marker set" - return undefined - ) - - for obj in markersetarray do - ( - new = sphere position:obj.position name:(obj.name + "_bone") - new.wirecolor = color 255 255 255 - new.xray = true - new.radius = 1 - new.parent = obj - obj.ishidden = true - ) - ) - ) - - on saveBones pressed do - ( - textOut = #() - for obj in $*_bone do - ( - append textOut (obj.name + "--" + obj.radius as string) - ) - savePath = getSaveFileName initialDir:crytools.buildPathFull caption:"Please select a folder to dump bone info:" - if savePath == undefined then - ( - return undefined - ) - crytools.writeOUT textOut savePath - ) - - on colorMarkers pressed do - ( - try - ( - $C_NOSTIP.wireColor = color 255 0 0 - lips = #($R_LIPCR,$R_LIPUP,$C_LIPUP,$L_LIPUP,$L_LIPLO,$C_LIPLO,$R_LIPLO,$L_LIPCR) - for obj in lips do - ( - obj.wireColor = color 0 0 255 - ) - ) - catch() - ) - - on markerSymmetry pressed do - ( - if markerSetArray == #() then - ( - messagebox "No marker set defined" - return undefined - ) - - undo "markerSymmetry" on - ( - for obj in markerSetArray do - ( - origNode = (filterString obj.name "_") - if RL.checked == true and origNode[1] == "R" then - ( - mirrorNode = (getnodebyname ("L_" + origNode[2])) - mirrorNode.position = [(obj.transform.position.x * -1),obj.transform.position.y,obj.transform.position.z] - ) - if LR.checked == true and origNode[1] == "L" then - ( - mirrorNode = (getnodebyname ("R_" + origNode[2])) - mirrorNode.position = [(obj.transform.position.x * -1),obj.transform.position.y,obj.transform.position.z] - ) - ) - ) - ) - - on RL changed state do - ( - if RL.checked == true then - ( - LR.checked = false - ) - ) - - on LR changed state do - ( - if LR.checked == true then - ( - RL.checked = false - ) - ) - - on threeMM changed state do - ( - if threeMM.checked == true then - ( - fiveMM.checked = false - ) - ) - - on fiveMM changed state do - ( - if fiveMM.checked == true then - ( - threeMM.checked = false - ) - ) - - on hideBones changed state do - ( - if hideBones.checked == true then - ( - for obj in $*_bone do - ( - obj.ishidden = true - ) - ) - else - ( - for obj in $*_bone do - ( - obj.ishidden = false - ) - ) - ) - - on hideMarkers changed state do - ( - if hideMarkers.checked == true then - ( - if markersetarray.count == 0 then - ( - messagebox "No marker set defined" - hidemarkers.checked = false - ) - for obj in markerSetArray do - ( - obj.ishidden = true - ) - ) - else - ( - for obj in markerSetArray do - ( - obj.ishidden = false - ) - ) - ) - - ) - - rollout motionData "Motion Data" - ( - local stabMarkersL = #() - local stabMarkersR = #() - local stabMarkersC = #() - local faceMarkers = #() - local c3dorigloc = #() - - button colorMocap "Prep Incoming C3D Mocap" - button resetMocap "ResetXform Marker Cloud" - group "Stabilization" - ( - checkbutton stabMarkersBtnC "Center Markers" - checkbutton stabMarkersBtnL " Left Markers" offset:[-45,0] - checkbutton stabMarkersBtnR "Right Markers" offset:[45,-26] - checkbutton markersToSTAB "Markers to Stabilize" - button stabilizeMarkers "Stabilize" offset:[-43,0] - checkbox leaveOriginal "Leave Original" checked:true offset:[70,-23] - ) - checkbutton connectMocap "Connect Mocap" offset:[-25,0] - checkbutton hideMocap "Hide" offset:[50,-26] - checkbox gethead "Drive head" checked:false offset:[5,0] enabled:false - checkbox getjaw "Drive Jaw" checked:true offset:[85,-20] - button reduceKeysC3d "ReduceKeys on C3D (0.05)" - - on colorMocap pressed do - ( - --check for root - if $root == undefined then - ( - point name:"root" position:$'C3D:C_NOSTIP'.position - ) - for obj in $C3D* do - ( - if obj.parent != $root then - ( - obj.parent = $root - format "% parented to root" obj.name - ) - ) - - --create layer and color C3D - if (LayerManager.getLayerFromName "C3D") == undefined then - ( - LayerManager.newLayerFromName "C3D" - ) - LM = LayerManager.getLayerFromName "C3D" - for obj in $C3D* do - ( - obj.wirecolor = color 0 255 0 - LM.addnode obj - ) - LM.addnode $root - - --check bone layer - if (LayerManager.getLayerFromName "bip") == undefined then - ( - LayerManager.newLayerFromName "bip" - ) - LM = LayerManager.getLayerFromName "bip" - for obj in $* do - ( - test = (filterstring obj.name "_") - if test[test.count] == "bone" then (LM.addnode obj) - ) - LM.addnode $C_HDB_lookOffset - ) - - on hideMocap changed state do - ( - if hideMocap.checked == true then - ( - for obj in $*C3D* do - ( - obj.ishidden = true - ) - ) - else - ( - for obj in $*C3D* do - ( - obj.ishidden = false - ) - ) - ) - - on resetMocap pressed do - ( - try - ( - for obj in $C3D* do - ( - resetXform obj - collapseStack obj - print (obj.name + " reset") - ) - ) - catch() - ) - - on stabMarkersBtnL changed state do - ( - if stabMarkersBtnL.checked == true then - ( - if selection.count == 0 then - ( - messagebox "Select one or more STAB markers" - stabMarkersBtnL.checked = false - return undefined - ) - else - ( - stabmarkersL = #() - for obj in selection do (append stabMarkersL obj) - stabMarkersBtnL.text = (stabMarkersL.count as string + " L Markers") - ) - ) - else - ( - stabMarkersL = #() - stabMarkersBtnL.text = " Left Markers " - ) - ) - - on stabMarkersBtnR changed state do - ( - if stabMarkersBtnR.checked == true then - ( - if selection.count == 0 then - ( - messagebox "Select one or more STAB markers" - stabMarkersBtnR.checked = false - return undefined - ) - else - ( - stabmarkersR = #() - for obj in selection do (append stabMarkersR obj) - stabMarkersBtnR.text = (stabMarkersR.count as string + " R Markers") - ) - ) - else - ( - stabMarkersR = #() - stabMarkersBtnR.text = " Right Markers " - ) - ) - - on stabMarkersBtnC changed state do - ( - if stabMarkersBtnC.checked == true then - ( - if selection.count == 0 then - ( - messagebox "Select one or more STAB markers" - stabMarkersBtnC.checked = false - return undefined - ) - else - ( - stabmarkersC = #() - for obj in selection do (append stabMarkersC obj) - stabMarkersBtnC.text = (stabMarkersC.count as string + " C Markers") - ) - ) - else - ( - stabMarkers = #() - stabMarkersBtnC.text = "Center Markers" - ) - ) - - on markersToSTAB changed state do - ( - if markersToSTAB.checked == true then - ( - if selection.count == 0 then - ( - messagebox "Nothing selected" - return undefined - ) - else - ( - faceMarkers = #() - for obj in selection do (append faceMarkers obj) - - /*for obj in stabMarkers do - ( - if (finditem faceMarkers obj) != 0 then - ( - messagebox (obj.name + "is a STAB marker and cannot be a faceMarker") - markersToSTAB.checked = false - return undefined - ) - )*/ - - markersToSTAB.text = (faceMarkers.count as string + " Markers to Stabilize") - ) - ) - else - ( - markersToSTAB.text = "Select Markers to Stabilize" - faceMarkers = #() - stabilizeMarkers.enabled = false - ) - ) - - on stabilizeMarkers pressed do - ( - undo "stabilizeMarkers" on - ( - local left - local right - local center - - if $faceAttach != undefined then (delete $faceAttach) - new = point name:"faceAttach" size:2 - new.wirecolor = color 176 26 26 - new.cross = off - new.box = on - new.axistripod = on - - tempMarkers = #() - - for obj in faceMarkers do - ( - new = point name:(obj.name + "_fmTemp") size:2 - new.wirecolor = color 240 234 79 - new.transform = obj.transform - new.cross = off - new.box = on - new.axistripod = off - append tempMarkers new - new.parent = $faceAttach - ) - - for i=animationrange.start to animationrange.end do - ( - with animate on - ( - at time i - ( - left = (crytools.avgArray stabMarkersL nodePos:true) - right = (crytools.avgArray stabMarkersR nodePos:true) - center = (crytools.avgArray stabMarkersC nodePos:true) - $faceAttach.pos = ((left + right)/2) - trans = $faceattach.transform - trans[1] = -(normalize (center-right)) - trans[3] = -(normalize (cross (normalize (center - $faceattach.pos)) trans[1])) - trans[2] = -(normalize (cross trans[1] trans[3])) - $faceAttach.transform = trans - - for obj in tempMarkers do - ( - in coordsys $faceAttach obj.pos = in coordsys $faceAttach (getnodebyname (crytools.cutstring obj.name "_fmTemp")).pos - ) - ) - ) - ) - if leaveOriginal.checked != true then - ( - for obj in facemarkers do - ( - delete obj - ) - for obj in $*_fmTemp do - ( - obj.name = (crytools.cutstring obj.name "_fmTemp") - ) - ) - ) - ) - - on connectMocap changed state do - ( - mocapSetArray = #() - c3dorigLoc = #() - - if connectMocap.checked == true then - ( - connectMocap.text = "Disconnect Mocap" - hideMocap.checked = true - mPair = "" - unFound = "" - msetdef = true - if mocaptools.rollouts[1].markersetarray.count == 0 then (msetdef = false) - if mocaptools.rollouts[1].markerOrigLoc.count == 0 then (msetdef = false) - - for obj in $C3D* do - ( - append c3dorigLoc obj.pos - if (getnodebyname(((filterstring obj.name ":")[2]) + "_bone")) == undefined then - ( - unFound += (obj.name + "\n") - ) - ) - if unfound != "" then (messagebox ("C3D data present with no matched markers/bones:\n-----------------------------------------------------\n" + unFound)) - - undo "connectMocap" on - ( - for obj in $*C3D* do - ( - if getnodebyname((filterstring obj.name ":")[2]) != undefined then - ( - mPair = getnodebyname((filterstring obj.name ":")[2]) - - --rebuild marker info if needed - if msetdef == false then - ( - append markersetarray mPair - append markerOrigLoc mPair.pos - ) - mocaptools.rollouts[1].markerSet.text = ("Marker Set Defined: " + markersetarray.count as string + " Markers") - mocaptools.rollouts[1].markerSet.checked = true - - move obj (mPair.position - obj.position) - append mocapSetArray obj - ) - ) - for obj in markersetarray do (obj.ishidden = true) - ) - - --build constraints - undo "buildConstraints" on - ( - unfound = "" - for obj in $C3D* do - ( - if (getnodebyname ((crytools.cutstring obj.name "C3D:") + "_bone")) == undefined then (unFound += obj.name + "\n") - ) - if unfound != "" then (messagebox ("C3D data present with no matched markers/bones:\n-----------------------------------------------------\n" + unFound)) - - for obj in $C3D* do - ( - if (getnodebyname ((crytools.cutstring obj.name "C3D:") + "_bone")) != undefined then - ( - new = (getnodebyname ((crytools.cutstring obj.name "C3D:") + "_bone")) - new.pos.controller = position_list() - new.pos.controller.Available.controller = Position_Constraint() - new.pos.controller.Position_Constraint.constraints.appendTarget obj 100 - ) - ) - ) - - /*--connect head - if getHead.checked == true then - ( - undo "righead" on - ( - if $'Bip01 Head Target' == undefined then (messagebox "Cannot find 'Bip01 Head Target' mesh.") - head = $'Bip01 Head Target' - - --create aim target - if $C_HDB_lookOffset != undefined then (delete $C_HDB_lookOffset) - new = point rotation:head.rotation position:head.position name:"C_HDB_lookOffset" - new.size = 4.0 - new.wirecolor = (color 14 255 2) - in coordsys local new.position.x = in coordsys new $'C3D:C_HDB'.position.x - new.parent = $'C3D:C_HDB' - - --create aim constraints - head.rotation.controller = rotation_list() - head.rotation.controller.Available.controller = LookAt_Constraint() - head.rotation.controller.LookAt_Constraint.target_axis = 0 - head.rotation.controller.LookAt_Constraint.upnode_world = false - head.rotation.controller.LookAt_Constraint.pickUpNode = $'C3D:C_NOSBRI' - head.rotation.controller.LookAt_Constraint.controller.lookat_vector_length = 14 - head.rotation.controller.LookAt_Constraint.controller.upnode_ctrl = 0 - head.rotation.controller.LookAt_Constraint.appendTarget $'C_HDB_lookOffset' 100.00 - head.rotation.controller.LookAt_Constraint.controller.StoUP_axis = 1 - ) - )*/ - - --connect jaw - if getJaw.checked == true then - ( - undo "rigJaw" on - ( - --create targets - mandible = $'Bip01 Mandible target' - - if $mandibleOrig != undefined then delete ($mandibleOrig) - new = point rotation:mandible.rotation position:mandible.position name:"mandibleOrig" - new.parent = $'Bip01 Head Target' - mandible.parent = new - new.size = 2 - - if $CHIN_origOffset != undefined then (delete $CHIN_origOffset) - new = point rotation:mandible.rotation position:mandible.position name:"CHIN_origOffset" - in coordsys mandible new.position.x = in coordsys mandible $'C3D:C_CHIN'.position.x - new.parent = $mandibleOrig - new.size = 2 - - if $CHIN_lookOffset != undefined then (delete $CHIN_lookOffset) - new = point rotation:mandible.rotation position:mandible.position name:"CHIN_lookOffset" - in coordsys mandible new.position.x = in coordsys mandible $'C3D:C_CHIN'.position.x - new.parent = $'C3D:C_CHIN' - new.size = 2 - - --constrain jaw - jaw = $'Bip01 Mandible target' - if (jaw.rotation.controller as string) != "Controller:Rotation_List" then (jaw.rotation.controller = rotation_list()) - - lookAtController = false - for c in (getsubanimnames jaw.rotation.controller) do - ( - if c == #lookat_controller then (lookatcontroller = true) - ) - - if lookatcontroller == false then (jaw.rotation.controller.Available.controller = LookAt_Constraint()) - jaw.rotation.controller.LookAt_Constraint.target_axis = 0 - jaw.rotation.controller.LookAt_Constraint.upnode_world = true - jaw.rotation.controller.LookAt_Constraint.pickUpNode = $'C3D:C_NOSBRI' - jaw.rotation.controller.LookAt_Constraint.controller.lookat_vector_length = 14 - jaw.rotation.controller.LookAt_Constraint.controller.upnode_ctrl = 0 - jaw.rotation.controller.LookAt_Constraint.appendTarget $'CHIN_lookOffset' 100.00 - jaw.rotation.controller.LookAt_Constraint.controller.StoUP_axis = 1 - jaw.rotation.controller.LookAt_Constraint.controller.StoUP_axisFlip = true - ) - ) - ) - else - ( - c3d = #() - - for obj in $C3D* do - ( - append c3d obj - if (getnodebyname ((crytools.cutstring obj.name "C3D:") + "_bone")) != undefined then - ( - (getnodebyname ((crytools.cutstring obj.name "C3D:") + "_bone")).pos.controller = Position_XYZ() - ) - ) - print c3dorigLoc - for i=1 to c3dorigLoc.count do - ( - c3d[i].position = c3dOrigLoc[i] - ) - - --remove jaw rig - for i=1 to ($'Bip01 Mandible target'.rotation.controller.getCount()) do - ( - if ($'Bip01 Mandible target'.rotation.controller[i] as string) == "SubAnim:LookAt_Constraint" then - ( - $'Bip01 Mandible target'.rotation.controller.delete i - ) - ) - try (delete $'CHIN_lookOffset')catch(print "no CHIN_lookOffset found (delete)") - try(delete $'CHIN_origOffset')catch(print "no CHIN_origOffset found (delete)") - $'Bip01 Mandible target'.rotation.controller = Euler_XYZ() - connectMocap.text = "Connect Mocap" - for obj in markersetarray do (obj.ishidden = false) - ) - ) - - on reduceKeysC3d pressed do - ( - for obj in $C3D* do - ( - reduceKeys obj.pos.controller 0.05 1f - ) - ) - ) - addRollout markerData mocapTools --rolledup:true - addRollout motionData mocapTools -) \ No newline at end of file diff --git a/Tools/maxscript/ref/fleshy_eye_rig.max b/Tools/maxscript/ref/fleshy_eye_rig.max deleted file mode 100644 index 054bdfb54c..0000000000 --- a/Tools/maxscript/ref/fleshy_eye_rig.max +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbd012ce7b49d006af24989853acf480617bfe23136273a1b40913f67ae56134 -size 442368 diff --git a/Tools/maxscript/ref/weapon_positions.max b/Tools/maxscript/ref/weapon_positions.max deleted file mode 100644 index 6638b1f652..0000000000 --- a/Tools/maxscript/ref/weapon_positions.max +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fcef0b54cef45c8823d255b5740071cd9c8ec44ec2e334afe7cad37b47953053 -size 9491456 diff --git a/Tools/maxscript/scmd.exe b/Tools/maxscript/scmd.exe deleted file mode 100644 index 851c8d106a..0000000000 --- a/Tools/maxscript/scmd.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c8bc23a0ded613b67261a915cb2542694c1d13337d78d48cdfc9f14f225192b -size 6656 diff --git a/Tools/maxscript/vidSync.ms b/Tools/maxscript/vidSync.ms deleted file mode 100644 index 067ca9cd6b..0000000000 --- a/Tools/maxscript/vidSync.ms +++ /dev/null @@ -1,66 +0,0 @@ -( - rollout vidSync "vidSync" - ( - fn shuttle = - ( - try - ( - offset = ((currenttime.frame as integer) + vidSync.offset.value) - vidsync.the_bmp.fileName = vidsync.allframes[offset] - vidsync.frameAssoc.text = ("Association: " + (currenttime as string) + " / " + getfilenamefile vidsync.allframes[offset]+\ - "."+vidSync.mediaType+" / "+(((offset/30)/60) as integer) as string+":"+ formattedprint ((mod (offset/30) 60) as integer) format:"02d") - ) - catch(vidsync.frameAssoc.text = ("Association: " + (currenttime as string) + " / " + \ - " *** NO FRAME DATA ***")) - ) - fn getSufFiles suffix path_name = ( return (for file in (getFiles ((getfilenamepath path_name) + "*." + suffix)) collect file)) - - local allframes = #() - local mediaType = "null" - button loadFrameSeq "Load Frame Sequence" align:#left --offset:[-90,0] - spinner offset "Offset:" scale:1 offset:[0,-23] range:[-10000,10000,1] fieldWidth:60 align:#right - bitmap the_bmp height:220 width:300 - label frameAssoc "Association: no video loaded" align:#left - label errorLbl "" align:#center - - on loadFrameSeq pressed do - ( - f = getOpenFileName caption:"Open A Frame of a Sequence:" \ - filename:"f:/" types:"TGA(*.tga)|*.tga|PNG(*.png)|*.png|JPEG(*.jpg)|*.jpg" - if f == undefined then (return undefined) - else - ( - suffix = filterstring f "." - suffix = suffix[suffix.count] - case suffix of - ( - "tga": mediaType = "tga" - "jpg": mediaType = "jpg" - "png": mediaType = "png" - ) - - allFrames = getSufFiles mediaType f - - filepath = allframes[1] - fileData = openBitMap filepath - the_bmp.fileName = filepath - the_bmp.width = fileData.width - the_bmp.height = fileData.height - vidsync.width = fileData.width + 20 - vidsync.height = filedata.height + 60 - vidsync.frameAssoc.pos += [0,((vidsync.height-20)-vidsync.frameAssoc.pos.y)] - shuttle() - registerTimeCallback vidSync.shuttle - ) - ) - on offset changed val do - ( - shuttle() - ) - on vidSync close do - ( - try (unregistertimecallback vidSync.shuttle)catch() - ) - ) - createDialog vidSync width:320 height:280 -) \ No newline at end of file diff --git a/Tools/maya/CryMayaTools/crytekSetup.mel b/Tools/maya/CryMayaTools/crytekSetup.mel deleted file mode 100644 index 0719631eca..0000000000 --- a/Tools/maya/CryMayaTools/crytekSetup.mel +++ /dev/null @@ -1,485 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -global proc crytekSetup() -{ - print "\n#######################\n"; - print "EXECUTING: crytekSetup.mel\n"; - print "#######################\n\n"; - - if(`optionVar -exists "CryToolsPath"`) - { - print ("Tools Path Set To\n"); - print (`optionVar -q "CryToolsPath"`); - } - else - { - optionVar -stringValue "CryOverrideToolsPath" "False"; - optionVar -stringValue "CryOverrideLibsPath" "False"; - optionVar -stringValue "CryToolsPath" "\\\\fs1/TECHART/Tools/"; - optionVar -stringValue "CryLibsPath" "\\\\fs1/TECHART/Tools/libs/"; - } - - global string $CryToolsPath; - $toolsPath = `optionVar -q "CryToolsPath"`; - - // Setting the windows environment variable - // First checking if the variable exists or not, if we dont check it will take longer for maya to start. - string $mayaToolsPath = $toolsPath+"CryMayaTools/"; - - $moduleList = `getFileList -folder $mayaToolsPath -filespec "Cry*"`; - - // Making sure that there are CRY modules otherwise it will prompt the user again. This will have to be changed for Licensees. - if (size($moduleList) != 0) - { - string $subString = substituteAllString($mayaToolsPath, "\\", "/"); - string $s=`getenv "MAYA_SHELF_PATH"`; - string $s2=`getenv "MAYA_SHELF_PATH"`; - print ("\nSHELF PATH: " + $s2 + "\n\n"); - for ($module in $moduleList) - { - if (`filetest -d ($mayaToolsPath+$module)` == 1) - { - putenv "MAYA_SCRIPT_PATH" (`getenv "MAYA_SCRIPT_PATH"`+";"+$mayaToolsPath+$module+"/scripts"); - print (">>MAYA SCRIPT PATH APPEND: " + $mayaToolsPath+$module+"/scripts\n"); - putenv "XBMLANGPATH" (`getenv "XBMLANGPATH"`+";"+$mayaToolsPath+$module+"/icons"); - print (">>MAYA ICON PATH APPEND: " + $mayaToolsPath+$module+"/icons\n"); - } - } - - //run startup.py - string $toolsPath2 = ""; - $toolsPath2 = substituteAllString($mayaToolsPath, "\\", "\\\\"); - $toolsPath2 = substituteAllString($toolsPath2, "/", "\\\\"); - string $exec = "execfile('" + $toolsPath2 + "CryCore\\startup.py"+"')"; - python($exec); - } - else - { - ControlPanel(); - } - print "\n#######################\n"; - print "EXIT: crytekSetup.mel\n\n"; -} - -//************************************************* - -global proc browseToolsPath() -{ - global string $toolsPathTextField; - global string $toolsPathOptions; - - string $result[] = `fileDialog2 -fileMode 3 -dialogStyle 2`; - if(size($result) != 0) - { - textField -edit -tx $result $toolsPathTextField; - radioButtonGrp -edit -select 2 $toolsPathOptions; - } -} - -global proc browseLibsPath() -{ - global string $libsPathTextField; - global string $libsPathOptions; - - string $result[] = `fileDialog2 -fileMode 3 -dialogStyle 2`; - if(size($result) != 0) - { - textField -edit -tx $result $libsPathTextField; - radioButtonGrp -edit -select 2 $libsPathOptions; - - } -} - -proc executeSetPath() -{ - global string $toolsPathOptions; - global string $libsPathOptions; - global string $toolsPathTextField; - global string $controlPanelUI; - global string $libsPathTextField; - global string $informationField; - global string $message; - - if (`radioButtonGrp -q -select $toolsPathOptions` == 1) - { - optionVar -stringValue "CryOverrideToolsPath" "False"; - optionVar -stringValue "CryToolsPath" "\\\\fs1\\TECHART\\Tools\\"; - } - else - { - optionVar -stringValue "CryOverrideToolsPath" "True"; - string $toolspath = `textField -q -tx $toolsPathTextField`; - if( ! endsWith($toolspath, "\\") && ! endsWith($toolspath, "/")) - { - $toolspath += "\\"; - } - $toolspath = substituteAllString($toolspath, "/", "\\"); - optionVar -stringValue "CryToolsPath" $toolspath; - } - - if (`radioButtonGrp -q -select $libsPathOptions` == 1) - { - optionVar -stringValue "CryOverrideLibsPath" "False"; - optionVar -stringValue "CryLibsPath" "\\\\fs1\\TECHART\\Tools\\Libs\\"; - } - else - { - optionVar -stringValue "CryOverrideLibsPath" "True"; - string $libspath = `textField -q -tx $libsPathTextField`; - if( ! endsWith($libspath, "\\") && ! endsWith($libspath, "/")) - { - $libspath += "\\"; - } - $libspath = substituteAllString($libspath, "/", "\\"); - optionVar -stringValue "CryLibsPath" $libspath; - } -} - -global proc setToolsPath() -{ - global string $toolsPathOptions; - global string $libsPathOptions; - global string $toolsPathTextField; - global string $controlPanelUI; - global string $libsPathTextField; - global string $informationField; - global int $oldToolsPathOption; - global int $oldLibsPathOption; - global string $message; - - string $setToolsPath = `textField -q -tx $toolsPathTextField`; - string $setLibsPath = `textField -q -tx $libsPathTextField`; - int $setToolsPathOption = `radioButtonGrp -q -select $toolsPathOptions`; - int $setLibsPathOption = `radioButtonGrp -q -select $libsPathOptions`; - - $message = ""; - - if($setToolsPath != `optionVar -q "CryToolsPath"` || $setLibsPath != `optionVar -q "CryLibsPath"`) - { - if($setToolsPath != `optionVar -q "CryToolsPath"` && $setLibsPath != `optionVar -q "CryLibsPath"`) - { - $message = "You have changed both Tools and Libs paths\n\n"+ "Old Tools path: " + `optionVar -q "CryToolsPath"` + "\nNew Tools path: " + $setToolsPath + "\n" + "\nAnd\n\n" + "Old Libs path: "+ `optionVar -q "CryLibsPath"` + "\nNew Libs path: " + $setLibsPath + "\n"; - print $message; - } - else if($setToolsPath != `optionVar -q "CryToolsPath"`) - { - $message = "Old Tools path: " + `optionVar -q "CryToolsPath"` + "\nNew Tools path: " + $setToolsPath + "\n"; - print $message; - } - else if($setLibsPath != `optionVar -q "CryLibsPath"`) - { - $message = "Old Libs path: "+ `optionVar -q "CryLibsPath"` + "\nNew Libs path: " + $setLibsPath + "\n"; - print $message; - } - } - - if(($setToolsPathOption != $oldToolsPathOption && $oldToolsPathOption != 1) || ($setLibsPathOption != $oldLibsPathOption && $oldLibsPathOption != 1)) - { - if($setToolsPathOption != $oldToolsPathOption && $setLibsPathOption != $oldLibsPathOption && $oldToolsPathOption != 1 && $oldLibsPathOption != 1) - { - $message = "You have changed both paths to server location.\n\\\\fs1\\TECHART\\Tools\\\n"; - print $message; - } - else if($setToolsPathOption != $oldToolsPathOption && $oldToolsPathOption != 1) - { - $message += "\nYou have changed the old Tools path to server location.\n\\\\fs1\\TECHART\\Tools\\\n"; - print $message; - } - else if($setLibsPathOption != $oldLibsPathOption && $oldLibsPathOption != 1) - { - $message += "\nYou have changed the old Libs path to server location.\n\\\\fs1\\TECHART\\Tools\\libs\\\n"; - print $message; - } - } - - if($message == "") - { - print "Neither Tools or Libs Path has changed."; - } - else - { - string $result = `confirmDialog -title "Confirm Change of Path" -message ($message+"\nIs that correct?") - -button "Yes" -button "No" -defaultButton "Yes" - -cancelButton "No" -dismissString "No"`; - if ($result == "Yes") - { - executeSetPath(); - deleteUI $controlPanelUI; - } - - if ($result == "No") - { - print "Nothing changed."; - } - } - - global string $projString; - $projString = ""; - global string $myChecks[]; - for ($i = 0; $i < size($myChecks); $i++) - { - int $sthg = `checkBox -query -value ($myChecks[$i]+"check")`; - if ($sthg) - { - $projString += $myChecks[$i]+":"; - } - eval("global string $" + $myChecks[$i]+ "Val = \"" + $sthg + "\";" ); - } - - optionVar -sv "CryProjects" $projString; - - -//optionVar -exists "CryProjects"; - - print $projString; - string $myProjShelves[]; - $something = `tokenize $projString ":" $myProjShelves`; - print `size($myProjShelves)`; - print $myProjShelves; - global string $toolsPath; - $toolsPath = `optionVar -q "CryToolsPath"`; - string $mayaToolsPath = $toolsPath+"CryMayaTools/"; - $myShelfPaths = $mayaToolsPath + "shelves"; - string $subString = substituteAllString($myShelfPaths, "\\", "/"); - $myShelfPaths = $subString; - $mstr = ""; - for($projShelf in $myProjShelves) - { - if ($projShelf != "") - { - $mstr += ";"+$myShelfPaths+"/"+$projShelf; - } - } - - //print $myShelfPaths; - $pathString = $myShelfPaths+$mstr+";"; - print $pathString; - system("setx MAYA_SHELF_PATH " + $pathString); - -} - -global proc ControlPanel() -{ - global string $controlPanelUI; - global string $toolsPathOptions; - global string $libsPathOptions; - global string $toolsPathTextField; - global string $libsPathTextField; - global int $oldToolsPathOption; - global int $oldLibsPathOption; - - if(`window -exists $controlPanelUI`) - deleteUI $controlPanelUI; - - $controlPanelUI = `window -title "Control Panel" -widthHeight 160 90 -resizeToFitChildren 1`; - frameLayout -label "Tools Path" -borderStyle "etchedOut"; - rowColumnLayout -numberOfColumns 2 -columnWidth 1 170 -columnWidth 2 50 -columnAttach 1 "both" 0 -columnAttach 2 "both" 0; - $toolsPathOptions = `radioButtonGrp -labelArray2 "Server" "Override" -numberOfRadioButtons 2 -select 1 -columnWidth2 80 80`; - text -label ""; - $toolsPathTextField = `textField`; - button -label "Browse" -command "browseToolsPath()"; - setParent ".."; - setParent ".."; - - frameLayout -label "Libs Path" -borderStyle "etchedOut"; - rowColumnLayout -numberOfColumns 2 -columnWidth 1 170 -columnWidth 2 50; - - $libsPathOptions = `radioButtonGrp -labelArray2 "Server" "Override" -numberOfRadioButtons 2 -select 1 -columnWidth2 80 80`; - text -label ""; - $libsPathTextField = `textField`; - button -label "Browse" -command "browseLibsPath()"; - setParent ".."; - setParent ".."; - - - // --------------------Checkboxes for Shelves-------------------- - frameLayout -label "Shelves Paths" -borderStyle "etchedOut"; - rowColumnLayout -numberOfColumns 3 -columnWidth 1 70 -columnWidth 2 70 -columnWidth 3 70; - - global string $myChecks[]; - clear($myChecks); - $toolsPath = `optionVar -q "CryToolsPath"`; - string $shelvesPath = $toolsPath+"CryMayaTools\\shelves\\"; - global string $projectShelvesList[]; - string $projectShelvesList[] = `getFileList -folder $shelvesPath`; - for ($shelf in $projectShelvesList) - { - if (`filetest -d ($shelvesPath+$shelf)` == 1) - { - $myChecks[ size($myChecks) ] = $shelf ; - } - } - - for ($i = 0; $i < size($myChecks); $i++) - { - checkBox -label $myChecks[$i] ($myChecks[$i]+"check"); - print ($myChecks[$i]+"check"+ "\n"); - } - - setParent ".."; - setParent ".."; - - // Setting the checkboxes for the shelves you already have selected - if(`optionVar -exists "CryProjects"`) - { - if(`optionVar -q "CryProjects"` != "") - { - string $CryProjects; - $CryProjects = `optionVar -q "CryProjects"`; - string $setCheckBox[]; - int $tokenValue; - $tokenValue = `tokenize $CryProjects ":" $setCheckBox`; - - for($check in $setCheckBox) - { - if($check != "") - { - eval("checkBox -edit -value 1 " + ($check + "check")); - } - } - } - } - // --------------------Variables of Interest-------------------- - frameLayout -label "Variables Of Interest" -borderStyle "etchedOut"; - $informationField = `scrollField -height 180 -editable false -wordWrap false -text "ALL THE INFORMATION NEEDED WILL BE HERE"`; - button -label "Set" -command "setToolsPath()"; - - // Changing the UI to reflect the settings you have. - if(`optionVar -exists "CryOverrideToolsPath"`) - { - if (`optionVar -q "CryOverrideToolsPath"` == "True") - { - radioButtonGrp -edit -select 2 $toolsPathOptions; - } - textField -edit -it `optionVar -q "CryToolsPath"` $toolsPathTextField; - } - else - { - optionVar -stringValue "CryOverrideToolsPath" "False"; - textField -edit -it `optionVar -q "CryToolsPath"` $toolsPathTextField; - } - - if(`optionVar -exists "CryOverrideLibsPath"`) - { - if (`optionVar -q "CryOverrideLibsPath"` == "True") - { - radioButtonGrp -edit -select 2 $libsPathOptions; - } - textField -edit -it `optionVar -q "CryLibsPath"` $libsPathTextField; - } - else - { - optionVar -stringValue "CryOverrideLibsPath" "False"; - textField -edit -it `optionVar -q "CryLibsPath"` $libsPathTextField; - } - - $oldToolsPathOption = `radioButtonGrp -q -select $toolsPathOptions`; - $oldLibsPathOption = `radioButtonGrp -q -select $libsPathOptions`; - - string $myString; - $myString = ($myString + "TOOLS PATH AND LIBS PATH \n"); - $myString = ($myString + "****************** \n"); - $myString = ($myString + "ToolsPath: " + `optionVar -q "CryToolsPath"` + "\n"); - $myString = ($myString + "LibsPath: " + `optionVar -q "CryLibsPath"` + "\n"); - $myString = ($myString + "overrideToolsPath: " + `optionVar -q "CryOverrideToolsPath"` + "\n"); - $myString = ($myString + "overrideLibsPath: " + `optionVar -q "CryOverrideLibsPath"` + "\n"); - $myString = ($myString + "****************** \n\n"); - - $myString = ($myString + "MAYA_PLUG_IN_PATHS \n"); - $myString = ($myString + "****************** \n"); - $myMPIPString = (`getenv "MAYA_PLUG_IN_PATH"`); - string $buffer[]; - $numTokens = `tokenize $myMPIPString ";" $buffer`; - for($path in $buffer) - { - $myString = ($myString + $path + "\n"); - } - $myString = ($myString + "****************** \n\n"); - - $myString = ($myString + "MAYA_SCRIPT_PATH \n"); - $myString = ($myString + "****************** \n"); - $myMSPString = (`getenv "MAYA_SCRIPT_PATH"`); - string $buffer[]; - $numTokens = `tokenize $myMSPString ";" $buffer`; - for($path in $buffer) - { - $myString = ($myString + $path + "\n"); - } - $myString = ($myString + "****************** \n\n"); - - $myString = ($myString + "XBMLANGPATH/Icon Paths \n"); - $myString = ($myString + "****************** \n"); - $myXBMLPString = (`getenv "XBMLANGPATH"`); - string $buffer[]; - $numTokens = `tokenize $myXBMLPString ";" $buffer`; - for($path in $buffer) - { - $myString = ($myString + $path + "\n"); - } - $myString = ($myString + "****************** \n\n"); - - $myString = ($myString + "MAYA_SHELF_PATH \n"); - $myString = ($myString + "****************** \n"); - $myMSHPString = (`getenv "MAYA_SHELF_PATH"`); - string $buffer[]; - $numTokens = `tokenize $myMSHPString ";" $buffer`; - for($path in $buffer) - { - $myString = ($myString + $path + "\n"); - } - $myString = ($myString + "****************** \n\n"); - - $myString = ($myString + "DEFAULT SETTINGS\n"); - $myString = ($myString + "****************** \n"); - $myString = ($myString + "defaultFileSaveType: " + `optionVar -q "defaultFileSaveType"` + "\n"); - $myString = ($myString + "workingUnitAngularDefault: " + `optionVar -q "workingUnitAngularDefault"` + "\n"); - $myString = ($myString + "workingUnitLinearDefault: " + `optionVar -q "workingUnitLinearDefault"` + "\n"); - $myString = ($myString + "workingUnitTimeDefault: " + `optionVar -q "workingUnitTimeDefault"` + "\n"); - $myString = ($myString + "upAxisDirection: " + `optionVar -q "upAxisDirection"` + "\n"); - $myString = ($myString + "playbackMinRangeDefault: " + `optionVar -q "playbackMinRangeDefault"` + "\n"); - $myString = ($myString + "playbackMinDefault: " + `optionVar -q "playbackMinDefault"` + "\n"); - $myString = ($myString + "maxInfl: " + `optionVar -q "maxInfl"` + "\n"); - $myString = ($myString + "****************** \n\n"); - - $myString = ($myString + "ENV SETTINGS\n"); - $myString = ($myString + "****************** \n"); - // Maya.env File Path - string $filePath; - $filePath = python("import maya.cmds as cmds; cmds.internalVar(usd=True).rsplit(\"/\", 2)[0]"); - $filePath += "/Maya.env"; - - // Open File - $fileId = `fopen $filePath "r"` ; - - // Get The First Line - string $nextLine = `fgetline $fileId` ; - - // Loop Until The String Size Is Zero (No Data) - while (size($nextLine) > 0) - { - // Strip Whitespace From The Beginning And End Of The Line - string $cleanLine = strip($nextLine) ; - $myString = ($myString + $cleanLine + "\n"); - - // Get Next Line And Continue - $nextLine = `fgetline $fileId` ; - } - $myString = ($myString + "****************** \n"); - - // Adding the information to the text field. - scrollField -edit -text $myString $informationField; - - showWindow $controlPanelUI; -} \ No newline at end of file diff --git a/Tools/maya/CryMayaTools/userSetup.mel b/Tools/maya/CryMayaTools/userSetup.mel deleted file mode 100644 index bf0c26c32b..0000000000 --- a/Tools/maya/CryMayaTools/userSetup.mel +++ /dev/null @@ -1,19 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -/*%TECHARTTOOLS%*/ -//$CryMenu = `menu -parent $gMainWindow -label "CryMayaTools" -tearOff true -allowOptionBoxes true`; -//menuItem -label "Control Panel" -annotation "Lumberyard Control Panel" -command "source crytekSetup.mel; ControlPanel;"; -//source crytekSetup.mel; -//crytekSetup; -/*$TECHARTTOOLS$*/ \ No newline at end of file diff --git a/Tools/maya/fx/Fur.cgfx b/Tools/maya/fx/Fur.cgfx deleted file mode 100644 index 56c9693d61..0000000000 --- a/Tools/maya/fx/Fur.cgfx +++ /dev/null @@ -1,465 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -float4x4 WorldMatrix : World ; -float4x4 ViewInverseMatrix : ViewInverse ; -float4x4 ViewMatrix : View ; -float4x4 ProjMatrix : Projection ; - -float4 PointLight0Pos : Position -< - string UIName = "Point Lamp 0 Position"; - string Object = "PointLight"; - string Space = "World"; - string UIGroup = "Lighting"; -> = {-54.0f, 50.0f, 100.0f, 1.0f}; - -float3 PointLight0Col : Diffuse -< - string UIName = "Point Lamp 0 Color"; - string UIWidget = "Color"; - string Object = "PointLight"; - string UIGroup = "Lighting"; -> = {1.0f, 0.95f, 0.85f}; - -float3 AmbientColor : Ambient -< - string UIName = "Ambient Light"; - string UIWidget = "Color"; - string UIGroup = "Lighting"; -> = {0.07f, 0.07f, 0.07f}; - -// Surface attributes -float Kd -< - string UIName = "Diffuse Brightness"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 1.0; - float UIStep = 0.05; - string UIGroup = "Diffuse"; -> = 1.0; - -float Ks -< - string UIName = "Specular Brightness"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 1.0; - float UIStep = 0.05; - string UIGroup = "Lighting"; -> = 0.6; - -float SpecularExponent : SpecularPower -< - string UIName = "Specular Power"; - string UIWidget = "Slider"; - float UIMin = 1.0; - float UIMax = 128.0; - float UIStep = 1.0; - string UIGroup = "Lighting"; -> = 25.0; - -// Fur parameters and textures -float FurLengthCM -< - string UIName = "Fur Length (cm)"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 100.0; - float UIStep = 0.1; -> = 10.0; - -float FurMaxGravity -< - string UIName = "Fur Maximum Gravity"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 5.0; - float UIStep = 0.01; -> = 2.0; - -float FurStiffness -< - string UIName = "Fur Stiffness"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 1.0; - float UIStep = 0.001; -> = 1.0; - -float FurDensity -< - string UIName = "Fur Density"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0.0; - float UIMax = 25.0; - float UIStep = 0.1; -> = 5.0; - -float FurBaseIntrusion -< - string UIName = "Fur Base Intrusion"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0; - float UIMax = 1; - float UIStep = 0.001; -> = 0.0; - -float FurCombBias -< - string UIName = "Fur Combing Bias"; - string UIGroup = "Fur Parameters"; - string UIWidget = "Slider"; - float UIMin = 0; - float UIMax = 5; - float UIStep = 0.01; -> = 1.0; - -bool UseFurCombing -< - string UIName = "Enable Fur Combing"; - string UIGroup = "Fur Parameters"; -> = true; - -bool UseSecondDiffuse -< - string UIName = "Use Base Fur Diffuse Map"; - string UIGroup = "Fur Parameters"; -> = true; - -texture ColorTexture -< - string ResourceType = "2D"; - string UIName = "Color Texture"; - string UIGroup = "Diffuse"; ->; - -sampler2D ColorSampler = sampler_state -{ - Texture = ; - MinFilter = LinearMipMapLinear; - MagFilter = Linear; -}; - -texture BaseColorTexture -< - string ResourceType = "2D"; - string UIName = "Fur Tip Color Texture"; - string UIGroup = "Diffuse"; ->; - -sampler2D BaseColorSampler = sampler_state -{ - Texture = ; - MinFilter = LinearMipMapLinear; - MagFilter = Linear; -}; - -texture FurHeightmap -< - string ResourceType = "2D"; - string UIName = "Fur Heightmap"; - string UIGroup = "Fur Parameters"; ->; - -sampler2D FurHeightmapSampler = sampler_state -{ - Texture = ; - MinFilter = LinearMipMapLinear; - MagFilter = Linear; -}; - -struct appdata -{ - float4 Position : POSITION; - float2 baseTC : TEXCOORD0; - float4 Color : COLOR0; - float3 Normal : NORMAL; -}; - -struct v2f -{ - float4 HPosition : POSITION; - float4 baseTC : TEXCOORD0; - float3 vView : TEXCOORD1; - half furLength : TEXCOORD2; - float3 LightVec : TEXCOORD3; - float3 WorldNormal : TEXCOORD4; -}; - -float GetFurLengthMeters() -{ - return FurLengthCM * 0.01; -} - -void ComputeFurCombing(inout float3 vFurComb, float4x4 ObjToWorldMatrix) -{ - // Assumes Y-up coordinates - vFurComb.xyz = 2 * vFurComb.xyz - 1.0; - if (any(vFurComb)) - { - vFurComb = mul(ObjToWorldMatrix, float4(normalize(vFurComb), 0)).xyz; - vFurComb = normalize(vFurComb); - } -} - -void ModifyVertexForShell(inout float4 vPosWorld, float3 vNormWorld, float4x4 ObjToWorldMatrix, half shellDistance, float3 vFurComb, float furLengthScale) -{ - // Stiffness attenuation is quadratic so that the fur tips can bend a lot while the roots move less - half stiffness = (1.0 - FurStiffness); - stiffness *= stiffness; - stiffness *= shellDistance; - - float3 vFurNormal = vNormWorld; - - // Intrude base fur position by a percentage of fur length - vPosWorld.xyz -= vNormWorld * FurBaseIntrusion * furLengthScale * GetFurLengthMeters(); - - if (FurStiffness < 1.0 && FurMaxGravity > 0.0) // Apply gravity for this shell - { - float3 vGravityWorld = float3(0, stiffness * -FurMaxGravity, 0); - - float nDotGrav = dot(vFurNormal, vGravityWorld); - - // Compute rejection of G on N: W - N * (G dot N) / (N dot N) - float3 gravProj = vGravityWorld - nDotGrav * vFurNormal; - - vFurNormal = normalize(vFurNormal + gravProj); - } - - if (UseFurCombing) - { - ComputeFurCombing(vFurComb, ObjToWorldMatrix); - - // Restrict fur combing to the hemisphere pointing in the normal direction - float nDotComb = dot(vFurNormal, vFurComb); - if (nDotComb < 0) - { - float3 vNCrossComb = cross(vFurNormal, vFurComb); - float3 vOrthoN = cross(vNCrossComb, vFurNormal); - vFurComb = normalize(vOrthoN); - } - - vFurComb = normalize(vFurComb + vFurNormal); - } - else - { - vFurComb = vFurNormal; - } - - float3 vOffset = lerp(vFurComb, vFurNormal, 1 - pow(shellDistance, FurCombBias)); - vOffset *= GetFurLengthMeters() * furLengthScale * shellDistance; - - vPosWorld.xyz += vOffset; -} - -v2f FurVS(appdata IN, - uniform float4 LightPos, - uniform half shellProgress) -{ - v2f OUT = (v2f)0; - float3 normal = normalize(IN.Normal); - OUT.WorldNormal = mul(WorldMatrix, float4(normal, 0)).xyz; - OUT.WorldNormal = normalize(OUT.WorldNormal); - - float4 posWorld = mul(WorldMatrix, float4(IN.Position.xyz, 1)); - - ModifyVertexForShell(posWorld, OUT.WorldNormal, WorldMatrix, shellProgress, IN.Color.xyz, IN.Color.w); - - OUT.LightVec = normalize(LightPos.xyz - posWorld.xyz); - OUT.baseTC = float4(IN.baseTC, 0, 0); - OUT.vView.xyz = normalize(float3(ViewInverseMatrix[0].w, ViewInverseMatrix[1].w, ViewInverseMatrix[2].w) - posWorld.xyz); - - OUT.HPosition = mul(ProjMatrix, mul(ViewMatrix, posWorld)); - OUT.furLength = shellProgress * GetFurLengthMeters() * IN.Color.a; - - return OUT; -} - -float4 FurPS(v2f IN, - uniform float3 LightColor, - uniform half shellProgress) : COLOR -{ - // Clip shells that are too close to the base surface, but ensure that the base pass draws fully - clip((IN.furLength - 0.001) * sign(shellProgress)); - - half furHeight = max(0.01, tex2D(FurHeightmapSampler, IN.baseTC.xy * FurDensity).r); - half strandPercent = smoothstep(0.0, furHeight, shellProgress); - - float3 baseColor = tex2D(BaseColorSampler, IN.baseTC.xy).rgb; - float3 tipColor = tex2D(ColorSampler, IN.baseTC.xy).rgb; - float3 diffuseColor = lerp(baseColor, tipColor, strandPercent); - if (!UseSecondDiffuse) - { - diffuseColor = tipColor; - } - - float3 Nn = IN.WorldNormal; - float3 Vn = IN.vView; - float3 Ln = IN.LightVec; - float3 Hn = normalize(Vn + Ln); - - float4 litV = lit(dot(Ln, Nn), dot(Hn, Nn), SpecularExponent); - float3 diffContrib = (litV.y * Kd) * LightColor * diffuseColor; - float3 specContrib = (Ks * litV.z) * LightColor; - - float3 result = (diffContrib + specContrib); - result += (AmbientColor * diffuseColor); - - half scaledFurLength = 1.0 - strandPercent * strandPercent; - return float4(result, scaledFurLength); -} - -// Techniques -#define furPass(shellProgress, blendEnable) VertexProgram = compile gp5vp FurVS(PointLight0Pos, shellProgress); \ - DepthTestEnable = true; \ - DepthMask = true; \ - CullFaceEnable = false; \ - BlendEnable = blendEnable; \ - BlendFunc = int2(SrcAlpha, InvSrcAlpha); \ - FragmentProgram = compile gp5fp FurPS(PointLight0Col, shellProgress) - -technique FurLod0 -{ - pass pass00 { furPass(0.0, false); } - - pass pass01 { furPass(0.015625, true); } - pass pass02 { furPass(0.031250, true); } - pass pass03 { furPass(0.046875, true); } - pass pass04 { furPass(0.062500, true); } - pass pass05 { furPass(0.078125, true); } - pass pass06 { furPass(0.093750, true); } - pass pass07 { furPass(0.109375, true); } - pass pass08 { furPass(0.125000, true); } - pass pass09 { furPass(0.140625, true); } - pass pass10 { furPass(0.156250, true); } - pass pass11 { furPass(0.171875, true); } - pass pass12 { furPass(0.187500, true); } - pass pass13 { furPass(0.203125, true); } - pass pass14 { furPass(0.218750, true); } - pass pass15 { furPass(0.234375, true); } - pass pass16 { furPass(0.250000, true); } - pass pass17 { furPass(0.265625, true); } - pass pass18 { furPass(0.281250, true); } - pass pass19 { furPass(0.296875, true); } - pass pass20 { furPass(0.312500, true); } - pass pass21 { furPass(0.328125, true); } - pass pass22 { furPass(0.343750, true); } - pass pass23 { furPass(0.359375, true); } - pass pass24 { furPass(0.375000, true); } - pass pass25 { furPass(0.390625, true); } - pass pass26 { furPass(0.406250, true); } - pass pass27 { furPass(0.421875, true); } - pass pass28 { furPass(0.437500, true); } - pass pass29 { furPass(0.453125, true); } - pass pass30 { furPass(0.468750, true); } - pass pass31 { furPass(0.484375, true); } - pass pass32 { furPass(0.500000, true); } - pass pass33 { furPass(0.515625, true); } - pass pass34 { furPass(0.531250, true); } - pass pass35 { furPass(0.546875, true); } - pass pass36 { furPass(0.562500, true); } - pass pass37 { furPass(0.578125, true); } - pass pass38 { furPass(0.593750, true); } - pass pass39 { furPass(0.609375, true); } - pass pass40 { furPass(0.625000, true); } - pass pass41 { furPass(0.640625, true); } - pass pass42 { furPass(0.656250, true); } - pass pass43 { furPass(0.671875, true); } - pass pass44 { furPass(0.687500, true); } - pass pass45 { furPass(0.703125, true); } - pass pass46 { furPass(0.718750, true); } - pass pass47 { furPass(0.734375, true); } - pass pass48 { furPass(0.750000, true); } - pass pass49 { furPass(0.765625, true); } - pass pass50 { furPass(0.781250, true); } - pass pass51 { furPass(0.796875, true); } - pass pass52 { furPass(0.812500, true); } - pass pass53 { furPass(0.828125, true); } - pass pass54 { furPass(0.843750, true); } - pass pass55 { furPass(0.859375, true); } - pass pass56 { furPass(0.875000, true); } - pass pass57 { furPass(0.890625, true); } - pass pass58 { furPass(0.906250, true); } - pass pass59 { furPass(0.921875, true); } - pass pass60 { furPass(0.937500, true); } - pass pass61 { furPass(0.953125, true); } - pass pass62 { furPass(0.968750, true); } - pass pass63 { furPass(0.984375, true); } - pass pass64 { furPass(1.000000, true); } -} - -technique FurLod1 -{ - pass pass00 { furPass(0.0, false); } - - pass pass01 { furPass(0.031250, true); } - pass pass02 { furPass(0.062500, true); } - pass pass03 { furPass(0.093750, true); } - pass pass04 { furPass(0.125000, true); } - pass pass05 { furPass(0.156250, true); } - pass pass06 { furPass(0.187500, true); } - pass pass07 { furPass(0.218750, true); } - pass pass08 { furPass(0.250000, true); } - pass pass09 { furPass(0.281250, true); } - pass pass10 { furPass(0.312500, true); } - pass pass11 { furPass(0.343750, true); } - pass pass12 { furPass(0.375000, true); } - pass pass13 { furPass(0.406250, true); } - pass pass14 { furPass(0.437500, true); } - pass pass15 { furPass(0.468750, true); } - pass pass16 { furPass(0.500000, true); } - pass pass17 { furPass(0.531250, true); } - pass pass18 { furPass(0.562500, true); } - pass pass19 { furPass(0.593750, true); } - pass pass20 { furPass(0.625000, true); } - pass pass21 { furPass(0.656250, true); } - pass pass22 { furPass(0.687500, true); } - pass pass23 { furPass(0.718750, true); } - pass pass24 { furPass(0.750000, true); } - pass pass25 { furPass(0.781250, true); } - pass pass26 { furPass(0.812500, true); } - pass pass27 { furPass(0.843750, true); } - pass pass28 { furPass(0.875000, true); } - pass pass29 { furPass(0.906250, true); } - pass pass30 { furPass(0.937500, true); } - pass pass31 { furPass(0.968750, true); } - pass pass32 { furPass(1.000000, true); } -} - -technique FurLod2 -{ - pass pass00 { furPass(0.0, false); } - - pass pass01 { furPass(0.062500, true); } - pass pass02 { furPass(0.125000, true); } - pass pass03 { furPass(0.187500, true); } - pass pass04 { furPass(0.250000, true); } - pass pass05 { furPass(0.312500, true); } - pass pass06 { furPass(0.375000, true); } - pass pass07 { furPass(0.437500, true); } - pass pass08 { furPass(0.500000, true); } - pass pass09 { furPass(0.562500, true); } - pass pass10 { furPass(0.625000, true); } - pass pass11 { furPass(0.687500, true); } - pass pass12 { furPass(0.750000, true); } - pass pass13 { furPass(0.812500, true); } - pass pass14 { furPass(0.875000, true); } - pass pass15 { furPass(0.937500, true); } - pass pass16 { furPass(1.000000, true); } -} diff --git a/Tools/maya/python/whatisthis.txt b/Tools/maya/python/whatisthis.txt deleted file mode 100644 index d4d6604a48..0000000000 --- a/Tools/maya/python/whatisthis.txt +++ /dev/null @@ -1 +0,0 @@ -This is the place where you must put all your python scripts that you want to add to lumberyard python variable in maya.env \ No newline at end of file diff --git a/Tools/maya/script/AEcryHelperNodeTemplate.mel b/Tools/maya/script/AEcryHelperNodeTemplate.mel deleted file mode 100644 index 63bf8b79f7..0000000000 --- a/Tools/maya/script/AEcryHelperNodeTemplate.mel +++ /dev/null @@ -1,72 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Creates the attribute editor controls for the cryHelperNode - -global proc AEcryHelperNodeTemplate( string $nodeName ) -{ - // Block copied from AEgeometryShapeTemplate.mel - { - editorTemplate -suppress "compInstObjGroups"; - editorTemplate -suppress "ignoreSelfShadowing"; - } - // Block copied from AEgeometryShapeTemplate.mel - { - editorTemplate -beginNoOptimize; - editorTemplate -suppress "castsShadows"; - editorTemplate -suppress "receiveShadows"; - editorTemplate -suppress "motionBlur"; - editorTemplate -suppress "primaryVisibility"; - editorTemplate -suppress "visibleInReflections"; - editorTemplate -suppress "visibleInRefractions"; - editorTemplate -suppress "doubleSided"; - editorTemplate -suppress "opposite"; - editorTemplate -suppress "geometryAntialiasingOverride"; - editorTemplate -suppress "antialiasingLevel"; - editorTemplate -suppress "shadingSamplesOverride"; - editorTemplate -suppress "shadingSamples"; - editorTemplate -suppress "maxShadingSamples"; - editorTemplate -suppress "volumeSamplesOverride"; - editorTemplate -suppress "volumeSamples"; - editorTemplate -suppress "depthJitter"; - editorTemplate -suppress "maxVisibilitySamplesOverride"; - editorTemplate -suppress "maxVisibilitySamples"; - editorTemplate -suppress "boundingBoxScale"; - editorTemplate -suppress "featureDisplacement"; - editorTemplate -suppress "initialSampleRate"; - editorTemplate -suppress "extraSampleRate"; - editorTemplate -suppress "textureThreshold"; - editorTemplate -suppress "normalThreshold"; - editorTemplate -endNoOptimize; - } - - // Suppress the local pos and scale - editorTemplate -suppress "localPosition"; - editorTemplate -suppress "localScale"; - -///////////////////////////////////////////////////////////////////////////////////// - - // Parameters - editorTemplate -beginScrollLayout; - editorTemplate -beginLayout "General Parameters" -collapse false; - editorTemplate -addControl "size"; - editorTemplate -endLayout; - -///////////////////////////////////////////////////////////////////////////////////// - - AEshapeTemplate $nodeName; - - editorTemplate -addExtraControls; - editorTemplate -endScrollLayout; -} - diff --git a/Tools/maya/script/LumberyardAnimationManager.mel b/Tools/maya/script/LumberyardAnimationManager.mel deleted file mode 100644 index e4a3398ca1..0000000000 --- a/Tools/maya/script/LumberyardAnimationManager.mel +++ /dev/null @@ -1,768 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// Shared UI parameters -global int $g_heightPerRow = 29; -global int $g_controlHeight = 22; -global string $g_lastRow = ""; - -LumberyardAnimationManagerLoadDependencies(); - -//! Loads all scripts that the Animation Manager relies on. -global proc LumberyardAnimationManagerLoadDependencies() -{ - eval("source cryAnim.mel"); - eval("source LumberyardUtilities.mel"); -} - -//! Creates the title row for the Animation Manager. -/*! - \note - This will contain the column titles for all animation data. If you choose to customize animation data, and want to expose it to the - Animation Manager, you will want to create a new column here as well as when you create the data. - \sa LumberyardAnimationManagerCreateUIRow() -*/ -proc LumberyardAnimationManagerCreateColumnTitles() -{ - global int $g_controlHeight; - setParent LUMBERYARDANIMATIONMANAGER_MAINLAYOUT; - - rowLayout -numberOfColumns 3 -columnWidth3 35 805 35 -backgroundColor 0.26 0.26 0.26 - -columnAlign 1 "center" -columnAttach 1 "both" 0 - columnAlign 2 "center" -columnAttach 2 "both" 0 - -columnAlign 3 "center" -columnAttach 3 "both" 0; - - // For <> button column - text -height $g_controlHeight -label ""; - - // Main animation columns; - rowLayout -numberOfColumns 6 -columnWidth6 35 35 150 150 150 250 -adjustableColumn 6 -backgroundColor 0.26 0.26 0.26 - -columnAlign 1 "center" -columnAttach 1 "both" 0 -columnAlign 2 "center" -columnAttach 2 "both" 0 - -columnAlign 3 "center" -columnAttach 3 "both" 0 -columnAlign 4 "center" -columnAttach 4 "both" 0 - -columnAlign 5 "center" -columnAttach 5 "both" 0 -columnAlign 6 "center" -columnAttach 6 "both" 0 LUMBERYARDTOOL_ANIMMANAGER_COLUMNTITLES; - { - text -height $g_controlHeight -label "Start"; - text -height $g_controlHeight -label "End"; - text -height $g_controlHeight -label "Name"; - text -height $g_controlHeight -label "Root Node"; - text -height $g_controlHeight -label "Animation Layers"; - text -height $g_controlHeight -label "Export Path"; - setParent ..; - } - - // For the +/X buttons - text -height $g_controlHeight -label ""; -} - -//! Resize the Animation Manager window. -/*! - \param $newExportListHeight The new height for the columnLayout containing the animation export data - \param $newWindowListHeight The new height for the Animation Manager window -*/ -global proc LumberyardAnimationManagerResize(int $newExportListHeight, int $newWindowHeight) -{ - columnLayout -edit -height $newExportListHeight LUMBERYARDANIMATIONMANAGER_EXPORT_SCROLLLAYOUT; - columnLayout -edit -height $newWindowHeight LUMBERYARDANIMATIONMANAGER_MAINLAYOUT; - window -edit -height $newWindowHeight LUMBERYARDANIMATIONMANAGER_WINDOW; -} - -//! Change the height of the Animation Manager and export list by a fixed delta. -/*! - \param $heightDelta Offset to change height of elements by. Can be positive or negative. - \note - This is a utility function used to simplify the logic in several places where determining an offset is - far less expensive than recalculating the desired height from scratch. It should be preferred over - LumberyardAnimationManagerResize in such cases. - \sa LumberyardAnimationManagerResize() -*/ -proc LumberyardAnimationManagerChangeHeight(int $heightDelta) -{ - int $exportListHeight = `columnLayout -query -height LUMBERYARDANIMATIONMANAGER_EXPORT_SCROLLLAYOUT`; - int $windowHeight = `window -query -height LUMBERYARDANIMATIONMANAGER_WINDOW`; - - $windowHeight = $windowHeight + $heightDelta; - $exportListHeight = $exportListHeight + $heightDelta; - - LumberyardAnimationManagerResize($exportListHeight, $windowHeight); -} - -//! Wrapper command used to remove the export data for an animation being managed by the Animation Manager. -/*! - /param $row The name of the row UI element corresponding to the export data to be removed. -*/ -global proc LumberyardAnimationManagerRemoveItem(string $row) -{ - string $managedNode = `rowLayout -query -annotation $row`; - LumberyardUtilitiesDeleteAnimationExport($managedNode); -} - -//! Open a file browser dialog and update the export path for an animation based on selection. -/*! - /param $row The name of the rowLayout UI element corresponding to the export data to be updated. - /param $textField The name of the text field UI element corresponding to the export data to be updated. -*/ -global proc LumberyardAnimationManagerFolderBrowser(string $row, string $textField) -{ - string $managedNode = `rowLayout -query -annotation $row`; - string $currentPath = `LumberyardUtilitiesGetAnimationExportPath $managedNode`; - - if ($currentPath == "") - { - $currentPath = `file -query -sceneName`; - $currentPath = `dirname $currentPath`; - } - - string $result[] = `LumberyardBrowseForPath $currentPath "Set Export Path"`; - // We need to requery this in case this took focus from the name text box - $managedNode = `rowLayout -query -annotation $row`; - - if (size($result) == 1) - { - // Update the UI - textField -edit -text $result[0] $textField; - // Update the data - LumberyardUtilitiesSetAnimationExportPath($managedNode, $result[0]); - } -} - -//! Update the root joint of the export data and the UI based on current selection in Maya. -/*! - /param $row The name of the rowLayout UI element corresponding to the export data to be updated. - /param $textField The name of the textField UI element corresponding to the export data to be updated. -*/ -global proc LumberyardAnimationManagerGetRootJointFromSelection(string $row, string $textField) -{ - string $managedNode = `rowLayout -query -annotation $row`; - string $currentRootJoint = `LumberyardUtilitiesGetAnimationRootJoint $managedNode`; - - $currentRootJoint = `GetRootJointForSelection $currentRootJoint`; - - // Update the UI - textField -edit -text $currentRootJoint $textField; - // Update the data - LumberyardUtilitiesSetAnimationRootJoint($managedNode, $currentRootJoint); -} - -//! Utility function to get the name of a UI control in the nested rowLayouts used in Animation Manager. -/*! - \param $row Root rowLayout corresponding to a single animation export. - \param $indices The sequence of indices used to index into nested rowLayouts. - \note If you are changing the layout in any way, be aware that calls to this function many need to be updated. - \sa LumberyardAnimationManagerGetStartFrame(), LumberyardAnimationManagerGetEndFrame(), LumberyardAnimationManagerGetExportName(), LumberyardAnimationManagerGetRootJoint(), and LumberyardAnimationManagerGetExportPath() -*/ -proc string LumberyardAnimationManagerGetRowControl(string $row, int $indices[]) -{ - string $control = $row; - - if(size($indices) == 0) - { - return ""; - } - - for($index in $indices) - { - if(!`rowLayout -query -exists $control`) - { - return ""; - } - string $children[] = `rowLayout -query -childArray $control`; - if($index >= size($children)) - { - return ""; - } - $control = $control + "|" + $children[$index]; - } - - return $control; -} - -//! Get the value contained in the start frame intField in an animation export rowLayout. -/*! - \param $row The name of the rowLayout UI element containing the intField to query -*/ -global proc int LumberyardAnimationManagerGetStartFrame(string $row) -{ - int $startFrame = -1; - int $controlMapping[] = {1, 0}; - string $control = `LumberyardAnimationManagerGetRowControl $row $controlMapping`; - if($control != "" && `intField -query -exists $control`) - { - $startFrame = `intField -query -value $control`; - } - return $startFrame; -} - -//! Get the value contained in the end frame intField in an animation export rowLayout. -/*! - \param $row The name of the rowLayout UI element containing the intField to query -*/ -global proc int LumberyardAnimationManagerGetEndFrame(string $row) -{ - int $endFrame = -1; - int $controlMapping[] = {1, 1}; - string $control = `LumberyardAnimationManagerGetRowControl $row $controlMapping`; - if($control != "" && `intField -query -exists $control`) - { - $endFrame = `intField -query -value $control`; - } - return $endFrame; -} - -//! Get the value contained in the export name textField in an animation export rowLayout. -/*! - \param $row The name of the rowLayout UI element containing the textField to query -*/ -global proc string LumberyardAnimationManagerGetExportName(string $row) -{ - string $exportName = ""; - int $controlMapping[] = {1, 2}; - string $control = `LumberyardAnimationManagerGetRowControl $row $controlMapping`; - if($control != "" && `textField -query -exists $control`) - { - $exportName = `textField -query -text $control`; - } - return $exportName; -} - -//! Get the value contained in the root joint textField in an animation export rowLayout. -/*! - \param $row The name of the rowLayout UI element containing the textField to query -*/ -global proc string LumberyardAnimationManagerGetRootJoint(string $row) -{ - string $rootJoint = ""; - int $controlMapping[] = {1, 3, 0}; - string $control = `LumberyardAnimationManagerGetRowControl $row $controlMapping`; - if($control != "" && `textField -query -exists $control`) - { - $rootJoint = `textField -query -text $control`; - } - return $rootJoint; -} - -//! Get the value contained in the export path textField in an animation export rowLayout. -/*! - \param $row The name of the rowLayout UI element containing the textField to query -*/ -global proc string LumberyardAnimationManagerGetExportPath(string $row) -{ - string $exportPath = ""; - int $controlMapping[] = {1, 5, 0}; - string $control = `LumberyardAnimationManagerGetRowControl $row $controlMapping`; - if($control != "" && `textField -query -exists $control`) - { - $exportPath = `textField -query -text $control`; - } - return $exportPath; -} - -///////////////////////////////////////////////////////////////////// -// Functions to transmit UI changes to the data backend - -//! Transmit value contained in the start frame UI to the data backend. -/*! - \param $row The name of the rowLayout UI element corresponding to the data to be updated. -*/ -global proc LumberyardAnimationManagerUpdateStartFrame(string $row) -{ - string $managedNode = `rowLayout -query -annotation $row`; - int $startFrame = `LumberyardAnimationManagerGetStartFrame $row`; - LumberyardUtilitiesSetAnimationStartFrame($managedNode, $startFrame); -} - -//! Transmit value contained in the end frame UI to the data backend. -/*! - \param $row The name of the rowLayout UI element corresponding to the data to be updated. -*/ -global proc LumberyardAnimationManagerUpdateEndFrame(string $row) -{ - string $managedNode = `rowLayout -query -annotation $row`; - int $endFrame = `LumberyardAnimationManagerGetEndFrame $row`; - LumberyardUtilitiesSetAnimationEndFrame($managedNode, $endFrame); -} - -//! Transmit value contained in the export name UI to the data backend. -/*! - \param $row The name of the rowLayout UI element corresponding to the data to be updated. -*/ -global proc LumberyardAnimationManagerUpdateExportName(string $row) -{ - string $managedNode = `rowLayout -query -annotation $row`; - - string $newExportName = `LumberyardAnimationManagerGetExportName $row`; - LumberyardUtilitiesSetAnimationExportName( $managedNode, $newExportName); -} - -//! Transmit value contained in the root joint UI to the data backend. -/*! - \param $row The name of the rowLayout UI element corresponding to the data to be updated. -*/ -global proc LumberyardAnimationManagerUpdateRootJoint(string $row) -{ - string $managedNode = `rowLayout -query -annotation $row`; - string $rootJoint = `LumberyardAnimationManagerGetRootJoint $row`; - LumberyardUtilitiesSetAnimationRootJoint($managedNode, $rootJoint); -} - -//! Transmit value contained in the export path UI to the data backend. -/*! - \param $row The name of the rowLayout UI element corresponding to the data to be updated. -*/ -global proc LumberyardAnimationManagerUpdateExportPath(string $row) -{ - string $exportPath = `LumberyardAnimationManagerGetExportPath $row`; - string $managedNode = `rowLayout -query -annotation $row`; - string $finalExportPath = `LumberyardUtilitiesSetAnimationExportPath $managedNode $exportPath`; - if($exportPath != $finalExportPath) - { - int $controlMapping[] = {1, 5, 0}; - string $control = `LumberyardAnimationManagerGetRowControl $row $controlMapping`; - textField -edit -text $finalExportPath $control; - } -} - -//! Sets the animLayer selection in the data backend based on the current UI state. -/*! - \param $row The name of the rowLayout UI element corresponding to the animation export data to update. - \param $layerPullDown the frameLayout containing the UI data that will be transmitted. -*/ -global proc LumberyardAnimationManagerUpdateExportLayers(string $row, string $layerPullDown) -{ - string $managedNode = `rowLayout -query -annotation $row`; - string $children[] = `frameLayout -query -childArray $layerPullDown`; - string $activeLayers[]; - - for($child in $children) - { - string $controls[] = `rowLayout -query -childArray $child`; - int $checked = `checkBox -query -value $controls[0]`; - if($checked) - { - string $layerName = `text -query -label $controls[1]`; - $activeLayers[size($activeLayers)] = $layerName; - } - } - - LumberyardUtilitiesSetAnimationExportLayers($managedNode, $activeLayers); - LumberyardAnimationManagerSetLayerListTitle($row, $layerPullDown); -} - -/////////////////////////////////////////////////////////////////////// -// UI Update calls for layout and default values - -//! Identifies and stores the last export node rowLayout in the Animation Manager. -/*! - /note This stored value is used to poll for default values when creating new rows -*/ -global proc LumberyardAnimationManagerUpdateLastRow() -{ - global string $g_lastRow; - - string $children[] = `columnLayout -query -childArray LUMBERYARDANIMATIONMANAGER_EXPORT_SCROLLLAYOUT`; - - if (size($children) == 0) - { - $g_lastRow = ""; - } - else - { - $g_lastRow = $children[(size($children)) - 1]; - } -} - -//! Gets the default export path for newly added items in the Animation Manager. -/*! - \note - The default path will be that of the last row in the Animation Manager. If there are no - rows present in the Animation Manager, the path will default to the top level path for the engine - installation. (i.e. the directory containing Bin64, Code, etc.) - \todo - Consider setting the default path based on the sys_game_folder in setup.cfg instead of the root - engine path. -*/ -proc string LumberyardAnimationManagerGetDefaultExportPath() -{ - global string $g_lastRow; - string $exportPath = ""; - - if($g_lastRow != "") - { - string $managedNode = `rowLayout -query -annotation $g_lastRow`; - $exportPath = `LumberyardUtilitiesGetAnimationExportPath $managedNode`; - } - - // if this is the first time we create a row, start at the parent directory for the engine - if ($exportPath == "") - { - $exportPath = eval("getenv \"LY_MAYA_PLUG_IN_PATH\""); - // equivalent to ../../../ - for($i = 0; $i < 3; $i++) - { - $exportPath = `dirname $exportPath`; - } - $exportPath = `cryExportFixupPath $exportPath`; - } - - return $exportPath; -} - -//! Gets the default root joint for newly added items in the Animation Manager. -/*! - \note - The default root joint will be that of the last row in the Animation Manager. If there are no - rows present in the Animation Manager, the root joint will default to an empty string. - \todo Consider using selection as default root joint if the first selected item is a joint. -*/ -proc string LumberyardAnimationManagerGetDefaultRootJoint() -{ - global string $g_lastRow; - string $rootJoint = ""; - - if($g_lastRow != "") - { - string $managedNode = `rowLayout -query -annotation $g_lastRow`; - $rootJoint = `LumberyardUtilitiesGetAnimationRootJoint $managedNode`; - } - - return $rootJoint; -} - -//! Calculates the correct UI heights based on the number of animation exports. -/*! - \note - This is only called when first creating the Animation Manager. It is more expensive, and should only be used if you - cannot calculate the size offset. - \sa LumberyardAnimationManagerUpdateHeight() -*/ -global proc LumberyardAnimationManagerUpdateHeight() -{ - global int $g_heightPerRow; - $childCount = `columnLayout -query -numberOfChildren LUMBERYARDANIMATIONMANAGER_EXPORT_SCROLLLAYOUT`; - $newExportListHeight = ($childCount * $g_heightPerRow) + 1; - // For the title and add rows - $childCount = $childCount + 2; - $newWindowHeight = ($childCount * $g_heightPerRow) + 2; - LumberyardAnimationManagerResize $newExportListHeight $newWindowHeight; -} - -//! Get the selected animLayers for an animation export from the data backend. -/*! - \param $row The name of the rowLayout corresponding to the animation export to fetch the data for. -*/ -proc string[] LumberyardAnimationManagerGetSelectedLayers(string $row) -{ - string $managedNode = `rowLayout -query -annotation $row`; - string $exportLayers[] = `LumberyardUtilitiesGetAnimationExportLayers $managedNode`; - - return $exportLayers; -} - -//! Callback to keep the animLayer selections in the UI and data backend synchronized with Maya's animLayer state. -/*! - \note This callback occurs when an animLayer is renamed, moved, deleted, or added. - \todo - This currently forces a full UI redraw, which collapses any open animLayer frameLayouts. We should preserve expanded - state for each row during UI rebuilds. -*/ -global proc LumberyardAnimationManagerUpdateLayers() -{ - LumberyardUtilitiesUpdateAnimationLayers(); - LumberyardAnimationManagerReadExports(); -} - -//! Updates the animLayer frameLayout title based on the number of animLayers selected for an animation export. -/*! - \param $row The name of the UI rowLayout corresponding to the animation export data to query. - \param $layerPullDown The name of the UI frameLayout whose title should be updated. -*/ -global proc LumberyardAnimationManagerSetLayerListTitle(string $row, string $layerPullDown) -{ - string $layers[]; - - $layers = `LumberyardAnimationManagerGetSelectedLayers $row`; - int $count = size($layers); - - string $newTitle = "Select Layers"; - if($count > 0) - { - $newTitle = "Selected "+$count; - } - - frameLayout -edit -label $newTitle $layerPullDown; -} - -//! Callback to fill the animLayer frameLayout when the user expands it. -/*! - \param $row The name of the rowLayout UI element corresponding to the animation export data to fetch. - \param $layerPullDown The frameLayout UI element that will be populated. - \note This will also handle adjusting UI heights to accommodate the number of animLayers displayed. -*/ -global proc LumberyardAnimationManagerExpandLayerList(string $row, string $layerPullDown) -{ - global int $g_controlHeight; - global int $g_heightPerRow; - setParent $layerPullDown; - - string $animLayers[] = `LumberyardUtilitiesGetAnimLayers`; - int $layerCount = size($animLayers); - // +1 to handle frameLayout title - int $newHeight = $g_controlHeight * ($layerCount + 1); - int $parentWidth = `frameLayout -query -width $layerPullDown`; - if($layerCount == 0) - { - $newHeight = $g_controlHeight * 2; - text -align "left" -label "" -width $parentWidth; - } - LumberyardAnimationManagerChangeHeight($newHeight - $g_controlHeight); - frameLayout -edit -height $newHeight $layerPullDown; - rowLayout -edit -height ($newHeight + $g_heightPerRow - $g_controlHeight) $row; - - string $layers[] = `LumberyardAnimationManagerGetSelectedLayers $row`; - - for($i = 0; $i < $layerCount; $i++) - { - int $enabled = ($animLayers[$i] != "BaseAnimation"); - int $value = `stringArrayContains $animLayers[$i] $layers`; - rowLayout -height $g_controlHeight -width $parentWidth -numberOfColumns 2; - checkBox -label "" -value $value -backgroundColor 0.5 0.5 0.5 -enable $enabled -enableBackground $enabled - -changeCommand ("LumberyardAnimationManagerUpdateExportLayers " + $row + " " + $layerPullDown); - text -align "left" -label $animLayers[$i] -width ($parentWidth - $g_controlHeight); - setParent ..; - } -} - -//! Callback used to adjust UI height when user collapses an animLayer frameLayout. -/* - \param $row The name of the rowLayout UI element whose animLayer pulldown is being collapsed - \param $layerPullDown the name of the frameLayout UI element being collapsed -*/ -global proc LumberyardAnimationManagerCollapseLayerList(string $row, string $layerPullDown) -{ - global int $g_controlHeight; - global int $g_heightPerRow; - - int $currentRowHeight = `rowLayout -query -height $row`; - int $heightDiff = $currentRowHeight - $g_heightPerRow; - $heightDiff = 0 - $heightDiff; - - string $children[] = `frameLayout -query -childArray $layerPullDown`; - for($child in $children) - { - deleteUI $child; - } - - LumberyardAnimationManagerChangeHeight($heightDiff); - rowLayout -edit -height $g_heightPerRow $row; - frameLayout -edit -height $g_controlHeight $layerPullDown; -} - -//! Creates a new UI rowLayout in the Animation Manager corresponding to an animation export node. -/*! - \param $exportNode The name of the exportNode in the sceneName - \note - No guarantee is made about avoiding multiple rows referring to the same export node, so it is - incumbent on the caller to ensure that this does not occur. The layout of the UI row is heavily - integrated into several other UI components, so it will need to be updated if any new data is - exposed to the Animation Manager. The row maintains a string reference to the name of the data - node that it corresponds to in the annotation field. It is very important that these nodes are - not renamed outside the tool flow, or the UI will not be able to fetch or manipulate data until - a full UI rebuild. - \sa LumberyardAnimationManagerCreateColumnTitles(), LumberyardAnimationManagerGetRowControl() -*/ -global proc LumberyardAnimationManagerCreateUIRow(string $exportNode) -{ - global int $g_controlHeight; - global string $g_lastRow; - global float $g_UIColor[]; - - if(!`LumberyardUtilitiesAnimationExportIsValid($exportNode)`) - { - return; - } - - int $startFrame = getAttr($exportNode+".startFrame"); - int $endFrame = getAttr($exportNode+".endFrame"); - string $exportName = getAttr($exportNode+".exportName"); - string $rootJoint = getAttr($exportNode+".rootJoint"); - string $exportPath = getAttr($exportNode+".exportPath"); - - setParent LUMBERYARDANIMATIONMANAGER_EXPORT_SCROLLLAYOUT; - - $newRow = `rowLayout -numberOfColumns 3 -columnWidth3 35 805 35 -backgroundColor 0.26 0.26 0.26 - -columnAlign 1 "center" -columnAttach 1 "both" 0 -rowAttach 1 "top" 2 - -columnAlign 2 "center" -columnAttach 2 "both" 0 -rowAttach 2 "top" 0 - -columnAlign 3 "center" -columnAttach 3 "both" 0 -rowAttach 3 "top" 2 -annotation $exportNode`; - - //Sets the start and end frame for an animation export to match the Maya timeline - button -height $g_controlHeight -label "<>" -annotation "Sets the start and end frame for an animation export to match the Maya timeline." -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardUtilitiesSnapAnimationToTimeline " + $exportNode); - - // Main animation columns; - rowLayout -numberOfColumns 6 -columnWidth6 35 35 150 150 150 350 -adjustableColumn 6 -backgroundColor 0.26 0.26 0.26 - -columnAlign 1 "center" -columnAttach 1 "both" 0 -rowAttach 1 "top" 0 - -columnAlign 2 "center" -columnAttach 2 "both" 0 -rowAttach 2 "top" 0 - -columnAlign 3 "center" -columnAttach 3 "both" 0 -rowAttach 3 "top" 0 - -columnAlign 4 "center" -columnAttach 4 "both" 0 -rowAttach 4 "top" 0 - -columnAlign 5 "center" -columnAttach 5 "both" 0 -rowAttach 5 "top" 3 - -columnAlign 6 "center" -columnAttach 6 "both" 0 -rowAttach 6 "top" 0; - { - // Start Frame - string $startFrameControl = `intField -height $g_controlHeight -value $startFrame -backgroundColor 0 0 0 -changeCommand ("LumberyardAnimationManagerUpdateStartFrame " + $newRow)`; - - // End Frame - string $endFrameControl = `intField -height $g_controlHeight -value $endFrame -backgroundColor 0 0 0 -changeCommand ("LumberyardAnimationManagerUpdateEndFrame " + $newRow)`; - - // Export Name - string $exportNameControl = `textField -height $g_controlHeight -text $exportName -backgroundColor 0 0 0 -changeCommand ("LumberyardAnimationManagerUpdateExportName " + $newRow)`; - - // Root Joint - rowLayout -numberOfColumns 2 -columnWidth 128 $g_controlHeight -backgroundColor 0.26 0.26 0.26 - -columnAlign 1 "center" -columnAttach 1 "both" 0 -columnAlign 2 "center" -columnAttach 2 "both" 0; - { - string $rootJointControl = `textField -height $g_controlHeight -width 128 -text $rootJoint -backgroundColor 0 0 0 -changeCommand ("LumberyardAnimationManagerUpdateRootJoint " + $newRow)`; - button -height $g_controlHeight -label "+" -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardAnimationManagerGetRootJointFromSelection " + $newRow + " " + $rootJointControl); - setParent ..; - } - - // Animation Layers - $layerPullDown = `frameLayout -height $g_controlHeight -width 150 -collapsable true -collapse true`; - frameLayout -edit -preExpandCommand ("LumberyardAnimationManagerExpandLayerList " + $newRow + " " + $layerPullDown) $layerPullDown; - frameLayout -edit -preCollapseCommand ("LumberyardAnimationManagerCollapseLayerList " + $newRow + " " + $layerPullDown) $layerPullDown; - LumberyardAnimationManagerSetLayerListTitle($newRow, $layerPullDown); - setParent ..; - - // Export Path - rowLayout -numberOfColumns 2 -columnWidth 228 $g_controlHeight -backgroundColor 0.26 0.26 0.26 - -columnAlign 1 "center" -columnAttach 1 "both" 0 -columnAlign 2 "center" -columnAttach 2 "both" 0; - { - string $exportPathControl = `textField -height $g_controlHeight -width 248 -text $exportPath -backgroundColor 0 0 0 -changeCommand ("LumberyardAnimationManagerUpdateExportPath " + $newRow)`; - iconTextButton -image "icons/lumberyard_folder_icon.png" -height $g_controlHeight -width 20 -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardAnimationManagerFolderBrowser " + $newRow + " " + $exportPathControl); - setParent ..; - } - setParent ..; - } - - button -height $g_controlHeight -label "X" -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardAnimationManagerRemoveItem " + $newRow); - $g_lastRow = $newRow; -} - -//! Creates all required elements when a new animation export is requested. -/*! - \note - Determines the default values for a new node, creates it in the data backend, - and generates the UI elements for it. -*/ -global proc LumberyardAnimationManagerAddNewItem() -{ - int $startFrame = `playbackOptions -query -minTime`; - int $endFrame = `playbackOptions -query -maxTime`; - string $exportName = `LumberyardUtilitiesGetUniqueAnimationName ""`; - string $rootJoint = `LumberyardAnimationManagerGetDefaultRootJoint`; - string $exportPath = `LumberyardAnimationManagerGetDefaultExportPath`; - string $exportLayers[] = `LumberyardUtilitiesGetAnimLayers`; - - LumberyardUtilitiesCreateAnimationExport($startFrame, $endFrame, $exportName, $rootJoint, $exportPath, $exportLayers); - - LumberyardUtilitiesUpdateAnimationUI(); -} - -//! Creates the + button in the lower right of the Animation Manager which will generate new animation exports when clicked -global proc LumberyardAnimationManagerCreateAddButton() -{ - global int $g_controlHeight; - global float $g_UIColor[]; - - if(`rowLayout -exists LUMBERYARDANIMATIONMANAGER_ADDITEM_ROW`) - { - deleteUI LUMBERYARDANIMATIONMANAGER_ADDITEM_ROW; - } - setParent LUMBERYARDANIMATIONMANAGER_MAINLAYOUT; - - rowLayout -numberOfColumns 3 -columnWidth3 35 806 35 -backgroundColor 0.26 0.26 0.26 - -columnAlign 1 "center" -columnAttach 1 "both" 0 - columnAlign 2 "center" -columnAttach 2 "both" 0 - -columnAlign 3 "center" -columnAttach 3 "both" 0 LUMBERYARDANIMATIONMANAGER_ADDITEM_ROW; - { - text -height $g_controlHeight -label ""; - text -height $g_controlHeight -label ""; - button -height $g_controlHeight -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] -label "+" -command ("LumberyardAnimationManagerAddNewItem"); - } -} - -//! Rebuilds the animation export list in the Animation Manager based on the current state of the data backend -/*! - \todo - Move the querying of children of LUMBERYARD_ANIMATIONEXPORT_GROUP to LumberyardUtilities for proper data/UI - separation. -*/ -global proc LumberyardAnimationManagerReadExports() -{ - global string $g_lastRow; - $g_lastRow = ""; - - string $children[] = `columnLayout -query -childArray LUMBERYARDANIMATIONMANAGER_EXPORT_SCROLLLAYOUT`; - for ($child in $children) - { - deleteUI $child; - } - - if(!`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"`) - { - return; - } - - string $exportNodes[] = `listRelatives -children "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - - for($exportNode in $exportNodes) - { - LumberyardAnimationManagerCreateUIRow($exportNode); - } - - LumberyardAnimationManagerUpdateHeight(); - LumberyardAnimationManagerUpdateLastRow(); -} - -//! Creates the Animation Manager window and calls the necessary functions to populate it. -global proc LumberyardAnimationManagerCreateWindow() -{ - if(!`window -exists LUMBERYARDANIMATIONMANAGER_WINDOW`) - { - if(`windowPref -exists LUMBERYARDANIMATIONMANAGER_WINDOW`) - { - windowPref -widthHeight 905 65 - -topLeftCorner `windowPref -query -topEdge LUMBERYARDANIMATIONMANAGER_WINDOW` `windowPref -query -leftEdge LUMBERYARDANIMATIONMANAGER_WINDOW` LUMBERYARDANIMATIONMANAGER_WINDOW; - } - //Picked 900 so that the Animation Manager UI is long enough to fit the information for a typical 1920 x 1080 monitor. For 4K, the user can stretch the UI. - window -titleBar true -title "Lumberyard Animation Manager" -widthHeight 905 65 - -sizeable true -minimizeButton false -maximizeButton false LUMBERYARDANIMATIONMANAGER_WINDOW; - - columnLayout -adjustableColumn true -height 65 -backgroundColor 0.26 0.26 0.26 LUMBERYARDANIMATIONMANAGER_MAINLAYOUT; - { - // Title Bar - LumberyardAnimationManagerCreateColumnTitles(); - setParent LUMBERYARDANIMATIONMANAGER_MAINLAYOUT; - columnLayout -height 1 -backgroundColor 0.26 0.26 0.26 LUMBERYARDANIMATIONMANAGER_EXPORT_SCROLLLAYOUT; - setParent LUMBERYARDANIMATIONMANAGER_MAINLAYOUT; - LumberyardAnimationManagerCreateAddButton(); - } - } - - scriptJob -event "NewSceneOpened" "LumberyardAnimationManagerReadExports" -parent "LUMBERYARDANIMATIONMANAGER_WINDOW"; - scriptJob -event "PostSceneRead" "LumberyardAnimationManagerReadExports" -parent "LUMBERYARDANIMATIONMANAGER_WINDOW"; - scriptJob -event "animLayerRebuild" "LumberyardAnimationManagerUpdateLayers" -parent "LUMBERYARDANIMATIONMANAGER_WINDOW"; - - LumberyardUtilitiesUpdateAnimationLayers(); - LumberyardAnimationManagerReadExports(); - - showWindow LUMBERYARDANIMATIONMANAGER_WINDOW; -} \ No newline at end of file diff --git a/Tools/maya/script/LumberyardAnimationPane.mel b/Tools/maya/script/LumberyardAnimationPane.mel deleted file mode 100644 index e674ba7cb3..0000000000 --- a/Tools/maya/script/LumberyardAnimationPane.mel +++ /dev/null @@ -1,113 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -////////////////////////////// -// Creates the Animation Pane UI - -LumberyardAnimationPaneLoadDependencies(); - -//! Load required scripts for the Lumberyard Animation Pane -global proc LumberyardAnimationPaneLoadDependencies() -{ - eval("source cryAnim.mel"); - eval("source LumberyardAnimationManager.mel"); - eval("source LumberyardAnimationUtilities.mel"); -} - -//! Creates a rowLayout UI item in the Animation Pane corresponding to an animation export -/*! - \param $animationExportNode The animation export node corresponding to the new rowLayout -*/ -proc LumberyardAnimationPaneCreateUIRow(string $animationExportNode) -{ - global int $g_rowItemHeight; - - if($animationExportNode == "") - { - return; - } - - setParent LUMBERYARDTOOL_ANIMATION_LISTBOX; - string $animationExportName = `LumberyardUtilitiesGetAnimationExportName $animationExportNode`; - - rowLayout -numberOfColumns 2 -columnWidth2 19 240 - -height $g_rowItemHeight -columnAttach2 "left" "left" -columnOffset2 4 4; - { - $newCheckBox = `checkBox -label "" -value 1 -backgroundColor 0.5 0.5 0.5`; - connectControl $newCheckBox ($animationExportNode+".shouldExport"); - text -align "left" -label $animationExportName -width 240; - } -} - -//! Create instruction texts for Animation export list and add it -proc LumberyardAnimationCreateInstsructionTexts() -{ - setParent LUMBERYARDTOOL_ANIMATION_LISTBOX; - rowColumnLayout -numberOfRows 1 -rowOffset 1 "top" 45 -columnOffset 1 "both" 80; - text -label "To add an animation, click on Animation Manager"; -} - -//! Gets all animation export names from the data backend and creates the UI elements for them -global proc LumberyardAnimationPaneReadExports() -{ - if (!`LumberyardUtilitiesUpgradeAnimationData`) - { - window -edit -visible false LUMBERYARDTOOL_MAIN_WINDOW; - return; - } - setParent LUMBERYARDTOOL_ANIMATION_LISTBOX; - string $children[] = `scrollLayout -query -childArray LUMBERYARDTOOL_ANIMATION_LISTBOX`; - for ($child in $children) - { - deleteUI $child; - } - - string $exportNodes[] = `LumberyardUtilitiesGetAnimationExportNodes`; - - if (size($exportNodes) == 0) - { - LumberyardAnimationCreateInstsructionTexts; - return; - } - - for($exportNode in $exportNodes) - { - LumberyardAnimationPaneCreateUIRow($exportNode); - } -} - -//! Creates the main Animation Pane UI for the Lumberyard Tool -global proc LumberyardAnimationPaneCreate() -{ - global float $g_UIColor[]; - global int $g_animationHeightDiff; - - setParent LUMBERYARDTOOL_MAIN_LAYOUT; - frameLayout -collapsable true -marginHeight 5 -marginWidth 5 -label "Animation Export" - -collapseCommand ("LumberyardToolResizeWindow " + (-$g_animationHeightDiff)) -expandCommand ("LumberyardToolResizeWindow " + $g_animationHeightDiff) - LUMBERYARDTOOL_ANIMATION_FRAME; - { - columnLayout -adjustableColumn true LUMBERYARDTOOL_ANIMATION_LAYOUT; - { - scrollLayout -height 120 -backgroundColor 0 0 0 -visible true LUMBERYARDTOOL_ANIMATION_LISTBOX; - setParent LUMBERYARDTOOL_ANIMATION_LAYOUT; - button -label "Animation Manager" -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command "LumberyardAnimationManagerCreateWindow" LUMBERYARDTOOL_ANIMATIONMANAGER_BUTTON; - button -label "Export Animations" -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command "LumberyardUtilitiesExportSelectedAnimations 1" LUMBERYARDTOOL_ANIMATIONEXPORT_BUTTON; - } - } - - LumberyardAnimationPaneReadExports(); - scriptJob -event "NewSceneOpened" "LumberyardAnimationPaneReadExports" -parent "LUMBERYARDTOOL_MAIN_WINDOW"; - scriptJob -event "PostSceneRead" "LumberyardAnimationPaneReadExports" -parent "LUMBERYARDTOOL_MAIN_WINDOW"; -} diff --git a/Tools/maya/script/LumberyardAnimationUtilities.mel b/Tools/maya/script/LumberyardAnimationUtilities.mel deleted file mode 100644 index 41640d8a7e..0000000000 --- a/Tools/maya/script/LumberyardAnimationUtilities.mel +++ /dev/null @@ -1,658 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -// List of the current animLayers known to the Utilities, this is -// used to determine operations performed in the Maya main workflow and -// keep the data backend synchronized with it. -global string $g_animLayers[]; - -//! Forces a refresh of the Lumberyard Animation Manager and Lumberyard Animation Pane. -global proc LumberyardUtilitiesUpdateAnimationUI() -{ - if(`window -exists LUMBERYARDANIMATIONMANAGER_WINDOW`) - { - LumberyardAnimationManagerReadExports(); - } - - if(`window -exists LUMBERYARDTOOL_MAIN_WINDOW`) - { - LumberyardAnimationPaneReadExports(); - } -} - -//! Generates a unique animation export name based on a requested name. -/*! - \param $requestedName The desired name that may be changed to guarantee uniqueness. -*/ -global proc string LumberyardUtilitiesGetUniqueAnimationName(string $requestedName) -{ - if ($requestedName == "") - { - $requestedName = "animationExport"; - } - return `LumberyardUtilitiesVerifyAnimationRequestName $requestedName ""`; -} - -//! Verify if requested name is valid and return a proper name for the animation. -/* - \param $requestedName The desired name of the animation. - \param $currentName The current name of the animation. -*/ -global proc string LumberyardUtilitiesVerifyAnimationRequestName(string $requestedName, string $currentName) -{ - return `LumberyardVerifySceneObjectRequestNameWithPrefix $requestedName $currentName "LUMBERYARD_ANIMATIONEXPORT_GROUP|"`; -} - -/////////////////////////////////////////////////////////////////// -// For manipulating layer data - -//! Returns the list of animLayers defined by Maya. -/*! - \note - This will return the identical ordering to Maya, but only if displaying - them newest animLayer first, which is the default view. It will not - guarantee identical ordering for other Maya animLayer displays. -*/ -global proc string[] LumberyardUtilitiesGetAnimLayers() -{ - string $layers[]; - if(`animLayer -query -exists "BaseAnimation"`) - { - $layers = `animLayer -query -children "BaseAnimation"`; - - $layers = `LumberyardUtilitiesReverseStringArray $layers`; - } - $layers[size($layers)] = "BaseAnimation"; - return $layers; -} - -//! This removes the specified animLayers from the active list for all animation exports. -/*! - \param $removeLayers The name of all animLayers that should be removed. -*/ -proc LumberyardUtilitiesRemoveAnimLayers(string $removeLayers[]) -{ - if(`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"`) - { - string $exportNodes[] = `listRelatives -children "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - for($exportNode in $exportNodes) - { - string $exportLayers[] = `LumberyardUtilitiesGetAnimationExportLayers $exportNode`; - $exportLayers = `stringArrayRemove $removeLayers $exportLayers`; - LumberyardUtilitiesSetAnimationExportLayers($exportNode, $exportLayers); - LumberyardUtilitiesUpdateAnimationUI(); - } - } -} - -//! This will update an old animLayer name to a new name for all animation exports' active animLayer list. -/*! - \param $oldName The name of the animLayer to replace. - \param $newName The name that should be stored in its place. -*/ -proc LumberyardUtilitiesRenameAnimLayer(string $oldName, string $newName) -{ - if(`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"`) - { - string $exportNodes[] = `listRelatives -children "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - for($exportNode in $exportNodes) - { - string $exportLayers[] = `LumberyardUtilitiesGetAnimationExportLayers $exportNode`; - int $index = `stringArrayFind $oldName 0 $exportLayers`; - if($index >= 0) - { - $exportLayers[$index] = $newName; - } - LumberyardUtilitiesSetAnimationExportLayers($exportNode, $exportLayers); - LumberyardUtilitiesUpdateAnimationUI(); - } - } -} - -//! Callback which queries Maya animLayer state, and synchronizes the data backend with the current state. -/*! - \note - This should be called whenever an animLayer is added, removed, renamed or deleted in Maya. If animLayer is - manipulated by scripts, this should be called after any operations of these types. -*/ -global proc LumberyardUtilitiesUpdateAnimationLayers() -{ - global string $g_animLayers[]; - string $layers[]; - $layers = `ls -type "animLayer"`; - - if(size($g_animLayers) == size($layers)) - { - // A layer was renamed - string $oldNames[]; - string $newName; - - for($animLayer in $g_animLayers) - { - if(!`stringArrayContains $animLayer $layers`) - { - $oldNames[size($oldNames)] = $animLayer; - } - } - - if(size($oldNames) > 1) - { - print("Warning: Received multiple rename requests in a single operation, removing nodes instead\n"); - LumberyardUtilitiesRemoveAnimLayers($oldNames); - $g_animLayers = $layers; - return; - } - if(size($oldNames) == 0) - { - // No renamed asset found - return; - } - - for($animLayer in $layers) - { - if(!`stringArrayContains $animLayer $g_animLayers`) - { - $newName = $animLayer; - } - } - - LumberyardUtilitiesRenameAnimLayer($oldNames[0], $newName); - } - else if(size($g_animLayers) > size($layers)) - { - // One or more layers were deleted - if(`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"`) - { - string $deletedLayers[]; - for($animLayer in $g_animLayers) - { - if(!`stringArrayContains $animLayer $layers`) - { - // Deleted Layer - $deletedLayers[size($deletedLayers)] = $animLayer; - } - } - - string $exportNodes[] = `listRelatives -children "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - for($exportNode in $exportNodes) - { - LumberyardUtilitiesRemoveAnimLayers($deletedLayers); - } - } - } - - // Store layer list for next AnimLayer operation - $g_animLayers = $layers; -} - -//! Utility function to create a command that will generate correct export behavior based on animLayer settings. -/*! - \param $exportLayerString The string attribute encoding animLayer selections for an animation export. - \note The default behavior is to mute any layers not contained in the exportLayer selections during export. -*/ -proc string LumberyardUtilitiesConvertAnimLayerStringToCommand(string $exportLayerString) -{ - string $exportLayers[] = `stringToStringArray $exportLayerString ","`; - string $validLayers[] = `LumberyardUtilitiesGetAnimLayers`; - string $command = ""; - - for($i = 0; $i < size($validLayers); $i++) - { - if($validLayers[$i] != "BaseAnimation") - { - int $value = !`stringArrayContains $validLayers[$i] $exportLayers`; - $command = $command + "setAttr " + $validLayers[$i] + ".mute " + $value + ";"; - } - } - - - return $command; -} - -//! Upgrades the old Crytek format for animLayer commands into the new Lumberyard format. -/*! - \param $animLayerCommand The animLayer command for an animation export encoded in Crytek format. -*/ -proc string[] LumberyardUtilitiesUpgradeAnimLayerCommand(string $animLayerCommand) -{ - string $animLayers[]; - string $commands[]; - int $numCommands = `tokenize $animLayerCommand ";" $commands`; - - string $elements[]; - - for($i = 0; $i < $numCommands; $i = $i + 2) - { - tokenize $commands[$i] " " $elements; - // Validate for proper command formatting. - if(size($elements) == 3) - { - int $value = (int)$elements[2]; - if($value != 0) - { - tokenize $elements[1] "." $elements; - if(size($elements) == 2) - { - $animLayers[size($animLayers)] = $elements[0]; - } - } - } - } - - return $animLayers; -} - -//! Upgrades old Crytek into properly formatted Lumberyard animation export data. -/*! - \note - The old Crytek format used a single monolithic string that was constantly built and tokenized to store this data. - The data was moved into a node attributes to make it less computationally expensive, as well as easier to read and - manipulate. Note that this is a destructive operation, the old Crytek data is removed to prevent detecting old data - every time the file is opened. - \todo - We may consider backing up the Crytek data in a separate location so it can be restored if it is requested by customers, - but we would prefer to only forward port data in the long term. -*/ -global proc int LumberyardUtilitiesUpgradeAnimationData() -{ - string $exportStringsRaw[] = `cryAnimGetRanges`; - - if(size($exportStringsRaw) >= 1 && $exportStringsRaw[0] != "") - { - string $upgradeChoice = `confirmDialog -title "Upgrade" - -message "Detected old animation data. Do you wish to upgrade it to the new tool format? (This operation will remove the old data)" - -button "Yes" -button "No" -defaultButton "Yes" -cancelButton "No" -dismissString "No"`; - - if($upgradeChoice == "Yes") - { - string $exportStringsRaw[] = `cryAnimGetRanges`; - cryAnimRemoveAllAnimRanges(); - for($exportStringRaw in $exportStringsRaw) - { - string $exportParameters[] = `python("mau.AMZN_DecodeAnimRangeString(\"" + $exportStringRaw + "\")")`; - - string $exportLayers[]; - if(size($exportParameters) >= 6) - { - $exportLayers = `LumberyardUtilitiesUpgradeAnimLayerCommand $exportParameters[5]`; - } - - LumberyardUtilitiesCreateAnimationExport($exportParameters[0], $exportParameters[1], $exportParameters[2], - $exportParameters[3], $exportParameters[4], $exportLayers); - } - } - else - { - return false; - } - } - return true; -} - -//! Creates the node to contain animation export data, and store requested values in the node -/*! - \param $startFrame The first frame to export for the animation - \param $endFrame The last frame to export for the animation - \param $exportName The name of the i_caf file to generate when exporting the animation - \param $rootJoint The root joint to use when exporting the animation. Only joints below the root will be exported. - \param $exportPath The absolute path to store the i_caf when exporting the animation. - \param $exportLayers A list of the layers that should be active (not muted) when exporting the animation. -*/ -global proc LumberyardUtilitiesCreateAnimationExport(int $startFrame, int $endFrame, string $exportName, string $rootJoint, - string $exportPath, string $exportLayers[]) -{ - if(!`objExists "LUMBERYARD_EXPORT_GROUP"`) - { - group -world -empty -name "LUMBERYARD_EXPORT_GROUP"; - } - - - if(!`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"`) - { - group -empty -parent "LUMBERYARD_EXPORT_GROUP" -name "LUMBERYARD_ANIMATIONEXPORT_GROUP"; - } - else - { - string $parents[] = `listRelatives -parent "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - if (!stringArrayContains("LUMBERYARD_EXPORT_GROUP", $parents)) - { - parent ("LUMBERYARD_ANIMATIONEXPORT_GROUP", "LUMBERYARD_EXPORT_GROUP"); - } - } - - string $newExportNode = `createNode "transform" -name AnimationExport -parent "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - addAttr -longName "shouldExport" -attributeType bool $newExportNode; - setAttr ($newExportNode+".shouldExport") 1; - LumberyardUtilitiesSetAnimationStartFrame($newExportNode, $startFrame); - LumberyardUtilitiesSetAnimationEndFrame($newExportNode, $endFrame); - LumberyardUtilitiesSetAnimationExportName($newExportNode, $exportName); - LumberyardUtilitiesSetAnimationRootJoint($newExportNode, $rootJoint); - LumberyardUtilitiesSetAnimationExportPath($newExportNode, $exportPath); - LumberyardUtilitiesSetAnimationExportLayers($newExportNode, $exportLayers); -} - -//! Deletes an animation export and its data -/*! - \param $exportNode The name of the animation export node to delete -*/ -global proc LumberyardUtilitiesDeleteAnimationExport(string $exportNode) -{ - if(!`objExists ("LUMBERYARD_ANIMATIONEXPORT_GROUP|" + $exportNode)`) - { - return; - } - - delete ("LUMBERYARD_ANIMATIONEXPORT_GROUP|" + $exportNode); - LumberyardUtilitiesUpdateAnimationUI(); -} - -//! Returns a list of all animation exports in the scene -global proc string[] LumberyardUtilitiesGetAnimationExportNodes() -{ - string $exportNodes[]; - - if(`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"`) - { - $exportNodes = `listRelatives -children "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - } - - return $exportNodes; -} - -//! Returns true if the animation export node exists, and has all required attributes -/*! - \param $exportNode The name of the animation export node to validate -*/ -global proc int LumberyardUtilitiesAnimationExportIsValid(string $exportNode) -{ - string $fullname = "LUMBERYARD_ANIMATIONEXPORT_GROUP|"+$exportNode; - if (!`objExists $fullname`) - { - return false; - } - - if (!`attributeExists "startFrame" $fullname`) - { - return false; - } - - if (!`attributeExists "endFrame" $fullname`) - { - return false; - } - - if (!`attributeExists "exportName" $fullname`) - { - return false; - } - - if (!`attributeExists "rootJoint" $fullname`) - { - return false; - } - - if(!`attributeExists "exportPath" $fullname`) - { - return false; - } - - return true; - -} - -//! Sets an integer attribute on an animation export node, creating it if needed -/*! - \param $exportNode The node to set the attribute on - \param $attribute The name of the attribute to set - \param $value The value to store in the attribute -*/ -proc LumberyardUtilitiesSetAnimationIntAttr(string $exportNode, string $attribute, int $value) -{ - if(!`attributeExists $attribute $exportNode`) - { - addAttr -longName $attribute -attributeType long $exportNode; - } - - setAttr ("LUMBERYARD_ANIMATIONEXPORT_GROUP|" + $exportNode + "." + $attribute) $value; -} - -//! Sets a string attribute on an animation export node, creating it if needed -/*! - \param $exportNode The node to set the attribute on - \param $attribute The name of the attribute to set - \param $value The value to store in the attribute -*/ -proc LumberyardUtilitiesSetAnimationStringAttr(string $exportNode, string $attribute, string $value) -{ - if(!`attributeExists $attribute $exportNode`) - { - addAttr -longName $attribute -dataType "string" $exportNode; - } - - setAttr -type "string" ("LUMBERYARD_ANIMATIONEXPORT_GROUP|" + $exportNode + "." + $attribute) $value; -} - -//! Gets the value of an animation export node attribute if it exists. If not, returns a default value. -/*! - \param $exportNode The animation export node to fetch the value for. - \param $attribute The name of the attribute to query. - \param $defaultValue The default value that will be returned if the attribute or node are not found. - \note - This always returns a string. The caller is responsible to cast the return value to the appropriate type. -*/ -proc string LumberyardUtilitiesGetAnimationAttr(string $exportNode, string $attribute, string $defaultValue) -{ - string $return = $defaultValue; - - if(`LumberyardUtilitiesAnimationExportIsValid $exportNode`) - { - $return = `getAttr ("LUMBERYARD_ANIMATIONEXPORT_GROUP|" + $exportNode + "." + $attribute) $exportNode`; - } - - return $return; -} - -//! Sets the start frame value for an animation export -/*! - \param $exportNode The name of the animation export node to set the start frame for - \param $startFrame The first frame for the animation export. -*/ -global proc LumberyardUtilitiesSetAnimationStartFrame(string $exportNode, int $startFrame) -{ - LumberyardUtilitiesSetAnimationIntAttr($exportNode, "startFrame", $startFrame); - -} - -//! Gets the start frame value for an animation export -/*! - \param $exportNode The name of the animation export node to get the start frame for -*/ -global proc int LumberyardUtilitiesGetStartFrame(string $exportNode) -{ - string $value = `LumberyardUtilitiesGetAnimationAttr $exportNode "startFrame" "-1"`; - int $intValue = (int)$value; - return $intValue; -} - -//! Sets the end frame value for an animation export -/*! - \param $exportNode The name of the animation export node to set the end frame for - \param $endFrame The last frame for the animation export. -*/ -global proc LumberyardUtilitiesSetAnimationEndFrame(string $exportNode, int $endFrame) -{ - LumberyardUtilitiesSetAnimationIntAttr($exportNode, "endFrame", $endFrame); -} - -//! Gets the end frame value for an animation export -/*! - \param $exportNode The name of the animation export node to get the end frame for -*/ -global proc int LumberyardUtilitiesGetAnimationEndFrame(string $exportNode) -{ - string $value = `LumberyardUtilitiesGetAnimationAttr $exportNode "endFrame" "-1"`; - int $intValue = (int)$value; - return $intValue; -} - -//! Sets the export name value for an animation export -/*! - \param $exportNode The name of the animation export node to set the export name for - \param $exportName The name of the i_caf to create for the animation export. -*/ -global proc string LumberyardUtilitiesSetAnimationExportName(string $exportNode, string $exportName) -{ - LumberyardUtilitiesSetAnimationStringAttr($exportNode, "exportName", $exportName); - if(`window -exists LUMBERYARDTOOL_MAIN_WINDOW`) - { - LumberyardAnimationPaneReadExports(); - } - return $exportName; -} - -//! Gets the export name value for an animation export -/*! - \param $exportNode The name of the animation export node to get the export name for -*/ -global proc string LumberyardUtilitiesGetAnimationExportName(string $exportNode) -{ - return `LumberyardUtilitiesGetAnimationAttr $exportNode "exportName" ""`; -} - -//! Sets the root joint value for an animation export -/*! - \param $exportNode The name of the animation export node to set the root joint for - \param $rootJoint The root joint for the animation export. Only joints below this will be exported. -*/ -global proc LumberyardUtilitiesSetAnimationRootJoint(string $exportNode, string $rootJoint) -{ - LumberyardUtilitiesSetAnimationStringAttr($exportNode, "rootJoint", $rootJoint); -} - -//! Gets the root joint value for an animation export -/*! - \param $exportNode The name of the animation export node to get the root joint for -*/ -global proc string LumberyardUtilitiesGetAnimationRootJoint(string $exportNode) -{ - return `LumberyardUtilitiesGetAnimationAttr $exportNode "rootJoint" ""`; -} - -//! Sets the export layers used for an animation export -/*! - \param $exportNode The name of the animation export node to set the export layers for. - \param $exportLayers A list containing all animLayers that should be active when exporting the animation export. -*/ -global proc LumberyardUtilitiesSetAnimationExportLayers(string $exportNode, string $exportLayers[]) -{ - string $exportLayerString = `stringArrayToString $exportLayers ","`; - LumberyardUtilitiesSetAnimationStringAttr($exportNode, "exportLayers", $exportLayerString); -} - -//! Gets a list of the export layers used for an animation export -/*! - \param $exportNode The name of the animation export node to get the export layers for. -*/ -global proc string[] LumberyardUtilitiesGetAnimationExportLayers(string $exportNode) -{ - string $animLayerString = `LumberyardUtilitiesGetAnimationAttr $exportNode "exportLayers" ""`; - string $animLayers[] = `stringToStringArray $animLayerString ","`; - - if(!`stringArrayContains "BaseAnimation" $animLayers`) - { - $animLayers[size($animLayers)] = "BaseAnimation"; - } - - return $animLayers; -} - -//! Sets the export path value for an animation export -/*! - \param $exportNode The name of the animation export node to set the export path for - \param $exportPath The absolute export path used when generating the i_caf for the animation export. -*/ -global proc string LumberyardUtilitiesSetAnimationExportPath(string $exportNode, string $exportPath) -{ - $exportPath = `cryExportFixupPath $exportPath`; - LumberyardUtilitiesSetAnimationStringAttr($exportNode, "exportPath", $exportPath); - return $exportPath; -} - -//! Gets the export path value for an animation export -/*! - \param $exportNode The name of the animation export node to get the export path for -*/ -global proc string LumberyardUtilitiesGetAnimationExportPath(string $exportNode) -{ - return `LumberyardUtilitiesGetAnimationAttr $exportNode "exportPath" ""`; -} - -////////////////////////////////////////////////////////////////////////// -// Functions tied to buttons - -//! Sets the start and end frame for an animation export to match the Maya timeline -/*! - \param $exportName The name of the animation export node to snap to the Maya timeline. -*/ -global proc LumberyardUtilitiesSnapAnimationToTimeline(string $exportNode) -{ - if(!`LumberyardUtilitiesAnimationExportIsValid $exportNode`) - { - return; - } - - int $startFrame = `playbackOptions -query -minTime`; - int $endFrame = `playbackOptions -query -maxTime`; - setAttr ($exportNode+".startFrame") $startFrame; - setAttr ($exportNode+".endFrame") $endFrame; - - if(`window -exists LUMBERYARDANIMATIONMANAGER_WINDOW`) - { - LumberyardAnimationManagerReadExports(); - } -} - -//! Exports all animation exports that have the shouldExport attribute set to true. -/*! - \param $blockOnWarnings If not zero/false, this will keep Export Progress UI from blocking for user input for warnings. - \note - $blockOnWarnings is only intended for use for batch operations at this time. -*/ -global proc LumberyardUtilitiesExportSelectedAnimations(int $blockOnWarnings) -{ - if(!`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"`) - { - return; - } - - string $children[] = `listRelatives -children "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - - for($child in $children) - { - if(`LumberyardUtilitiesAnimationExportIsValid $child`) - { - string $fullname = "LUMBERYARD_ANIMATIONEXPORT_GROUP|"+$child; - int $shouldExport = `getAttr ($fullname+".shouldExport")`; - if($shouldExport != 0) - { - string $startFrame = `getAttr ($fullname+".startFrame")`; - string $endFrame = `getAttr ($fullname+".endFrame")`; - string $exportName = `getAttr ($fullname+".exportName")`; - string $rootJoint = `getAttr ($fullname+".rootJoint")`; - string $exportPath = `getAttr ($fullname+".exportPath")`; - string $exportLayers = `getAttr ($fullname+".exportLayers")`; - string $layerCommand = `LumberyardUtilitiesConvertAnimLayerStringToCommand $exportLayers`; - cryIssueAnimationExportCommand($startFrame, $endFrame, $exportName, $rootJoint, $exportPath, $layerCommand, $blockOnWarnings, LumberyardExportGetAdditionalExportOptions()); - } - } - } -} \ No newline at end of file diff --git a/Tools/maya/script/LumberyardGeometry.mel b/Tools/maya/script/LumberyardGeometry.mel deleted file mode 100644 index 8a6d0f0a27..0000000000 --- a/Tools/maya/script/LumberyardGeometry.mel +++ /dev/null @@ -1,1459 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -/*! - Geometry Export. -*/ - -global int $s_cgfFileType = 0; -global int $s_cgaFileType = 2; - -LumberyardGeometryLoadDependencies(); - -//! Load geometry dependent source files. -global proc LumberyardGeometryLoadDependencies() -{ - eval("source LumberyardGeometryUtilities.mel"); -} - -//! Get the control name for the export name textField corresponding to a geometry export node. -/*! - \param $itemIndex Index corresponding to the export node item in the list box. -*/ -proc string LumberyardToolGetGeometryListItemName(int $itemIndex) -{ - return ("geometryListItemName" + $itemIndex); -} - -//! Get the control name for the file type optionMenu corresponding to a geometry export node. -/*! - \param $itemIndex Index corresponding to the export node item in the list box. -*/ -proc string LumberyardToolGetGeometryListItemFileType(int $itemIndex) -{ - return ("geometryListItemFileType" + $itemIndex); -} - -//! Get the control name for the export selection checkBox corresponding to a geometry export node. -/*! - \param $itemIndex Index corresponding to the export node item in the list box. -*/ -proc string LumberyardToolGetGeometryListItemCheckBox(int $itemIndex) -{ - return ("geometryListItemCheck" + $itemIndex); -} - -//! Get the control name for the list item row corresponding to a geometry export node. -/*! - \param $itemIndex Index corresponding to the export node item in the list box. -*/ -proc string LumberyardToolGetGeometryListItemRow(int $itemIndex) -{ - return ("geometryListItemRow" + $itemIndex); -} - -//! Get the default type guess for a given geometry export node. -/*! - \param $itemName Name of the export node. -*/ -proc int LumberyardGetGeometryExportNodeDefaultFileType(string $itemName) -{ - // Type indices: CGF: 0; CHR: 1; CGA: 2; SKIN: 3. - if (`objExists $itemName`) - { - string $skinCluster = findRelatedSkinCluster($itemName); - if ($skinCluster == "") - { - if (`nodeType $itemName` == "joint") - { - // Type CHR. - return 1; - } - else - { - // Type CGF. - return 0; - } - } - else - { - // Type SKIN. - return 3; - } - } - return 0; -} - -//! Get the text for setting geometry export type option menu. -proc string LumberyardExportGetFileTypeEnumString() -{ - return "Geometry (.CGF):Skeleton (.CHR):Skin (.SKIN)"; -} - -//! Convert attribute file type to UI enum index -/*! - \param $fileType File type in node attribute. -*/ -proc int LumberyardToolGetEnumIndexFromFileType(int $fileType) -{ - int $enumIndex = $fileType+1; - // Remap CGA to CGF - if($enumIndex == 3) - { - $enumIndex = 1; - } - // Remap SKIN to 3 - else if($enumIndex == 4) - { - $enumIndex = 3; - } - - return $enumIndex; -} - -//! Convert UI enum index to file type -/*! - \param $enumIndex Enum index in UI. -*/ -proc int LumberyardToolGetFileTypeFromEnumIndex(int $enumIndex) -{ - int $fileType = $enumIndex-1; - // Real SKIN file type is 3 - if($fileType == 2) - { - $fileType = 3; - } - - return $fileType; -} - -//! Force change CGA type to CGF -/*! - \param $itemName Export node to check. -*/ -global proc LumberyardToolForceCGAToCGF(string $itemName) -{ - if(`attributeExists "fileType" $itemName`) - { - if(`getAttr ($itemName + ".fileType")` == 2) - { - setAttr ($itemName + ".fileType") 0; - } - } -} - -//! Get the current global geometry export path, which may be overridden by an export node -/* - \param $resolveDefaultPath Boolean indicating whether the default path should be expanded to a logical path if found -*/ -proc string LumberyardToolGetGlobalGeometryExportPath(int $resolveDefaultPath) -{ - global string $g_defaultPathString; - string $filePath = `cryExportGetExportSettingValue "customFilePath"`; - - // If the export setting contains empty or default path, use the scene file location if we are resolving the default path - if($resolveDefaultPath && $filePath == "") - { - string $sceneFullName = `file -query -sceneName`; - $filePath = `dirname $sceneFullName `; - $filePath = `cryExportFixupPath $filePath`; - } - else if($filePath == "") - { - return $g_defaultPathString; - } - - return $filePath; -} - -//! Set custom file path of a geometry export node using folder browser. -/*! - \param $itemIndex Index corresponding to the geometry export node item in the list box. - \todo - Check if we need to supply the mirror change on selected feature. See - cryUtilMirrorChangeOnSelected in cryExportEditCustomNodeExportPath in cryExport.mel. -*/ -global proc LumberyardToolSetGeometryExportNodeCustomPathFromBrowser(int $itemIndex) -{ - if ($itemIndex >= 0) - { - string $result[] = `LumberyardBrowseForPath "" "Set Custom Export Path"`; - if (`size($result)` == 1) - { - $folderPath = $result[0]; - textField -edit -text $folderPath LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_TEXTFIELD; - string $node = `LumberyardToolGetExportNodeNameForItemID $itemIndex`; - setAttr -type "string" ($node + ".NodeCustomExportPath") $folderPath; - } - } -} - -//! Set custom file path of a geometry export node by entering in path text field. -/*! - \param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolSetGeometryExportNodeCustomPathFromTextField(int $itemIndex) -{ - if ($itemIndex >= 0) - { - string $folderPath = `textField -query -text LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_TEXTFIELD`; - $folderPath = `cryExportFixupPath $folderPath`; - string $node = `LumberyardToolGetExportNodeNameForItemID $itemIndex`; - setAttr -type "string" ($node + ".NodeCustomExportPath") $folderPath; - textField -edit -text $folderPath LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_TEXTFIELD; - } -} - -//! Get custom file path of a geometry export node from saved data. -/*! - \param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc string LumberyardToolUpdateGeometryListItemCustomPath(int $itemIndex) -{ - if ($itemIndex >= 0) - { - string $node = `LumberyardToolGetExportNodeNameForItemID $itemIndex`; - if (`attributeExists "NodeCustomExportPath" $node`) - { - string $filePath = `getAttr -asString ($node + ".NodeCustomExportPath")`; - return $filePath; - } - } - return ""; -} - -proc int LumberyardToolHasValidExportTarget(string $itemName) -{ - if(`attributeExists "exportTarget" $itemName`) - { - string $exportTarget = `getAttr ($itemName + ".exportTarget")`; - // the value of exportTarget should always be non-empty, otherwise there is error occurring elsewhere that we need to fix - if(`objExists $exportTarget`) - { - return true; - } - } - - return false; -} - - -//! Create header for Geometry export List and add it -global proc LumberyardToolAddHeaderToGeometryListbox() -{ - global int $g_rowItemHeight; - global int $g_checkColumnWidth; - global int $g_nodeNameColumnWidth; - global int $g_exportNameColumnWidth; - global int $g_exportTypeColumnWidth; - global int $g_deleteExportColumnWidth; - global int $g_boxWidth; - global int $g_listHeaderHeight; - int $fitWidth = $g_boxWidth - 4; - - setParent LUMBERYARDTOOL_GEOMETRY_LISTBOX; - - rowLayout -width $fitWidth -numberOfColumns 5 - -columnWidth5 $g_checkColumnWidth $g_nodeNameColumnWidth $g_exportNameColumnWidth $g_exportTypeColumnWidth $g_deleteExportColumnWidth - -height $g_listHeaderHeight -columnAttach5 "left" "left" "left" "left" "left" - -adjustableColumn 5 -columnOffset5 0 4 4 4 0 -backgroundColor 0.26 0.26 0.26 "header"; - { - text -label ""; - text -label "Node to Export"; - text -label "Export Name"; - text -label "Type"; - text -label ""; - } -} - -//! Create instruction texts for Geometry export list and add it -global proc LumberyardToolAddGeometryInstructionTexts() -{ - global int $g_instructionRowSpace; - - setParent LUMBERYARDTOOL_GEOMETRY_LISTBOX; - rowColumnLayout -numberOfRows 2 -rowOffset 1 "top" 27 -columnOffset 1 "both" 100 -rowSpacing 2 $g_instructionRowSpace; - text -label "To add geometry, select a group, mesh,"; - text -label "or joint and click `Add Selected`"; -} - -//! Create a list item row of a geometry export node and add it to the list box. -/*! - \param $itemName Name of the export node. - \param $itemIndex Index corresponding to the export node item in the list box. - \note This must be run an additional time to detect that an exportTarget has been added, and there is no good way to write a scriptJob that does not intercept every object creation. -*/ -global proc LumberyardToolAddItemToGeometryListbox(string $itemName, int $itemIndex) -{ - global int $g_rowItemHeight; - global string $g_warningIconName; - global float $g_UIColor[]; - global float $g_UIInvalidColor[]; - - global int $g_checkColumnWidth; - global int $g_nodeNameColumnWidth; - global int $g_exportNameColumnWidth; - global int $g_exportTypeColumnWidth; - global int $g_deleteExportColumnWidth; - - int $hasValidTarget = `LumberyardToolHasValidExportTarget $itemName`; - - if(!`attributeExists "shouldExport" $itemName`) - { - addAttr -defaultValue $hasValidTarget -longName "shouldExport" -attributeType "bool" $itemName; - } - - string $tooltip = ""; - if(!$hasValidTarget) - { - $tooltip = "Export target is invalid, please remove this node!"; - } - - setParent LUMBERYARDTOOL_GEOMETRY_LISTBOX; - string $rowName = `LumberyardToolGetGeometryListItemRow($itemIndex)`; - string $checkBoxControl = `LumberyardToolGetGeometryListItemCheckBox($itemIndex)`; - string $textFieldControl = `LumberyardToolGetGeometryListItemName($itemIndex)`; - - rowLayout -numberOfColumns 5 - -columnWidth5 $g_checkColumnWidth $g_nodeNameColumnWidth $g_exportNameColumnWidth $g_exportTypeColumnWidth $g_deleteExportColumnWidth - -height $g_rowItemHeight -columnAttach5 "left" "left" "left" "left" "left" - -columnOffset5 4 0 0 0 4 -annotation $tooltip - $rowName; - { - // Unfortunately, Maya exhibits unexpected behavior when *any* -noBackground command is given - // so we need this branch to remove this command when creating the "Error" case. It also will - // reactivate UI elements that are attached to attributes so we initialize the checkbox connection - // here - if($hasValidTarget) - { - $shouldExport = `getAttr ($itemName + ".shouldExport")`; - - checkBox -label "" -value $shouldExport -enable $hasValidTarget -backgroundColor 0.5 0.5 0.5 $checkBoxControl; - connectControl $checkBoxControl ($itemName + ".shouldExport"); - - string $exportTarget = `getAttr ($itemName + ".exportTarget")`; - textField -text $exportTarget -width $g_nodeNameColumnWidth - -noBackground true - -receiveFocusCommand ("LumberyardToolGeometryListItemOnFocus " + $itemIndex) - -editable false; - } - else - { - iconTextButton -image $g_warningIconName -height $g_rowItemHeight; - - string $exportTarget = `getAttr ($itemName + ".exportTarget")`; - textField -text $exportTarget -width $g_nodeNameColumnWidth - -backgroundColor $g_UIInvalidColor[0] $g_UIInvalidColor[1] $g_UIInvalidColor[2] - -receiveFocusCommand ("LumberyardToolGeometryListItemOnFocus " + $itemIndex) - -editable false; - } - - textField -text `LumberyardToolRemoveLumberyardExportNodePrefix $itemName` -width $g_exportNameColumnWidth - -changeCommand ("LumberyardToolSetExportNodeName " + $itemIndex) - -noBackground true -alwaysInvokeEnterCommandOnReturn 1 - -receiveFocusCommand ("LumberyardToolGeometryListItemOnFocus " + $itemIndex) - $textFieldControl; - - optionMenu -label "" -width $g_exportTypeColumnWidth -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -changeCommand ("LumberyardToolSetGeometryExportNodeFileType " + $itemIndex) `LumberyardToolGetGeometryListItemFileType($itemIndex)`; - { - string $enumString = `LumberyardExportGetFileTypeEnumString`; - string $tokens[]; - $numTokens = `tokenize $enumString ":" $tokens`; - for($i = 0; $i < $numTokens; $i++) - { - menuItem -label $tokens[$i]; - } - LumberyardToolUpdateGeometryListItemFileType $itemIndex; - } - - button -label "X" -backgroundColor 0 0 0 -height 20 -command ("LumberyardToolRemoveGeometryListItem " + $itemIndex); - } - - scriptJob -replacePrevious -nodeDeleted $itemName ("LumberyardToolRefreshGeometryListBoxRemoveNode " + $itemName) -parent $textFieldControl; - scriptJob -attributeChange ($itemName + ".fileType") ("LumberyardToolForceCGAToCGF " + $itemName) -parent $rowName; - scriptJob -replacePrevious -attributeChange ($itemName + ".exportTarget") "LumberyardToolRefreshGeometryListBox" -parent $rowName; - if($hasValidTarget) - { - string $exportTarget = `getAttr ($itemName + ".exportTarget")`; - // the value of exportTarget should always be non-empty, otherwise there is error occurring elsewhere that we need to fix - scriptJob -replacePrevious -nodeDeleted $exportTarget "LumberyardToolRefreshGeometryListBox" -parent $checkBoxControl; - } -} - -global string $g_geometryExtensions[]; - -//! Determines selected geometry export in the UI list box and shows it in explorer if it exists -global proc LumberyardToolViewGeometryInExplorer() -{ - global int $g_currentSelectedGeometryID; - global string $g_geometryExtensions[]; - string $nodeName = LumberyardToolGetExportNodeNameForItemID($g_currentSelectedGeometryID); - - if(`objExists $nodeName` && `attributeExists "fileType" $nodeName`) - { - string $filePath = ""; - - // If we have the NodeCustomExportPath, favor that - if(`attributeExists "NodeCustomExportPath" $nodeName`) - { - $filePath = `getAttr ($nodeName + ".NodeCustomExportPath")`; - } - - // If we don't, or it is not set, favor the scene export path value - if($filePath == "") - { - $filePath = `LumberyardToolGetGlobalGeometryExportPath 1`; - } - - int $extensionIndex = `getAttr ($nodeName + ".fileType")`; - string $fileExtension = $g_geometryExtensions[$extensionIndex]; - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - $fileName = `substitute $lumberyardExportNodePrefix $nodeName ""`; - - cryExportShowInExplorer $filePath ($fileName + "." + $fileExtension); - } -} - -//! Determines selected geometry export in the UI list box and shows it in explorer if it exists -global proc LumberyardToolSelectMayaGeometry() -{ - global int $g_currentSelectedGeometryID; - string $nodeName = LumberyardToolGetExportNodeNameForItemID($g_currentSelectedGeometryID); - - if(`objExists $nodeName`) - { - string $exportTarget = `getAttr ($nodeName + ".exportTarget")`; - if(`objExists $exportTarget`) - { - select $exportTarget; - } - } -} - -//! Create a new geometry export node based on the selection in the scene, and update the list box. -global proc LumberyardToolAddNewGeometryExportNode() -{ - int $fileType = 0; - // TODO: need further investigation: why anyone wants "no group selection"? - int $groupSelection = 1; - int $createGroupNode = 1; - - string $selection[]; - if( $groupSelection ) - { - $selection = `ls -selection`; - } - - string $referencedNodes[]; - string $localNodes[]; - // Check if there is any referenced node. Only local nodes will be exported. - for($item in $selection) - { - if(`referenceQuery -isNodeReferenced $item`) - { - $referencedNodes[`size($referencedNodes)`] = $item; - } - else - { - $localNodes[`size($localNodes)`] = $item; - } - } - - if(size($referencedNodes) > 0) - { - string $warningMessage = "Could not add nodes: "; - for( $referencedNode in $referencedNodes) - { - $warningMessage += $referencedNode + " "; - } - $warningMessage += "to export because they are referenced."; - warning($warningMessage); - } - - // Check if any of the selected local nodes already exists under any LumberyardExportNode - string $exportNodes[] = `LumberyardToolGetGeometryExportNodes`; - for($item in $localNodes) - { - // Check all parents to verify there is no LumberyardExportNode - string $currentItem = $item; - while ($currentItem != "") - { - if (`nodeType $currentItem` == "transform") - { - if (stringArrayContains($currentItem, $exportNodes)) - { - string $message = $item + " is already under geometry export node " + $currentItem + - ". Please delete old node before creating a new one."; - confirmDialog -title "Failed to create a geometry export node" - -message $message -button "OK" -defaultButton "OK" -cancelButton "OK"; - return; - } - } - - string $parents[] = `listRelatives -parent $currentItem`; - $currentItem = ""; - if (size($parents) > 0) - { - // One object should only find one parent. - $currentItem = $parents[0]; - } - } - } - - string $newItem = "empty"; - if (`size($localNodes)` > 0) - { - // Use the first item from the selected local nodes as the default name of the export node. - $newItem = $localNodes[0]; - $fileType = `LumberyardGetGeometryExportNodeDefaultFileType $newItem`; - /* - If it's type CHR, we will find the first attached skin mesh of the skeleton, - and name the CHR node after it with a postfix "_skel". - */ - if ($fileType == 1) - { - string $skinClusters[] = `listConnections -type skinCluster $newItem`; - $newItem = ($newItem + "_skel"); - if (size($skinClusters) > 0) - { - string $bindMeshs[] = `listConnections -type mesh $skinClusters[0]`; - if (size($bindMeshs) > 0) - { - $newItem = ($bindMeshs[0] + "_skel"); - } - } - } - - // Update Maya scene. - cryToolsCreateCryExportNodeCreateCore $newItem $fileType $localNodes; - - // Deselect all list items. - select -clear; - } -} - -//! Remove a geometry export node. -/*! - /param $nodeName Name of the geometry export node. -*/ -global proc LumberyardToolRemoveGeometryExportNode(string $nodeName) -{ - string $groupNames[] = `listRelatives -children -fullPath $nodeName`; - if (size($groupNames) > 0) - { - string $contents[] = `listRelatives -children $groupNames[0]`; - for ($item in $contents) - { - // Unparent the mesh from geometry export node group. - parent -world $item; - } - } - // Remove the group node. - delete $nodeName; - // TODO: if we remove the export node from the scene silently, we should be able to update - // the list box automatically (when the window is focused). - select -clear; -} - -//! Callback function to update geometry export list box when export node or target is deleted from the scene. -global proc LumberyardToolRefreshGeometryListBox() -{ - global int $g_currentSelectedGeometryID; - - LumberyardToolUpdateGeometryListBox(); -} - -//! Callback function to update geometry export list box and remove node from backend data record. -global proc LumberyardToolRefreshGeometryListBoxRemoveNode(string $removeNode) -{ - LumberyardToolDeleteGeometryExportNode $removeNode; - LumberyardToolRefreshGeometryListBox; -} - -//! Callback function to update geometry export list box and reload node from Maya plugin to update record. -global proc LumberyardToolRefreshGeometryListBoxReloadNodes() -{ - LumberyardToolLoadGeometryExportNodes; - LumberyardToolRefreshGeometryListBox; -} - -//! Get the name of geometry export node associated with a list box index. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc string LumberyardToolGetExportNodeNameForItemID(int $itemIndex) -{ - // TODO: consider about saving a local copy of current existing export nodes to reduce - // the cost of polling MayaCryExport for retrieving export nodes. - if ($itemIndex < 0) - { - return ""; - } - string $geomItems[] = `LumberyardToolGetGeometryExportNodes`; - return $geomItems[$itemIndex]; -} - -// Get the index of geometry export node provided its name. -/*! - /param $node Name of the geometry export node. -*/ -global proc int LumberyardToolGetItemIDFromExportNodeName(string $node) -{ - if ($node == "") - { - return -1; - } - string $geomItems[] = `LumberyardToolGetGeometryExportNodes`; - for ($i = 0; $i < `size($geomItems)`; $i++) - { - if ($geomItems[$i] == $node) - { - return $i; - } - } - return -1; -} - -//! Remove a specific geometry export node, and update the list box. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolRemoveGeometryListItem(int $itemIndex) -{ - global int $g_currentSelectedGeometryID; - - // Reset selected item index - $g_currentSelectedGeometryID = -1; - - // Update Maya scene. - LumberyardToolRemoveGeometryExportNode(LumberyardToolGetExportNodeNameForItemID($itemIndex)); -} - -//! Remove the export node prefix from the name. -/*! - /param $name The name to remove prefix. -*/ -global proc string LumberyardToolRemoveLumberyardExportNodePrefix(string $name) -{ - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - string $lumberyardExportNodePrefixLowerCase = `tolower $lumberyardExportNodePrefix`; - if (startsWith($name, $lumberyardExportNodePrefix)) - { - return stringRemovePrefix($name, $lumberyardExportNodePrefix); - } - else if (startsWith($name, $lumberyardExportNodePrefixLowerCase)) - { - return stringRemovePrefix($name, $lumberyardExportNodePrefixLowerCase); - } - return $name; -} - -//! Remove the export node prefix from the name. -/*! - /param $name The name to add prefix. -*/ -global proc string LumberyardToolAddLumberyardExportNodePrefix(string $name) -{ - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - if (!startsWith($name, $lumberyardExportNodePrefix)) - { - return stringAddPrefix($name, $lumberyardExportNodePrefix); - } - return $name; -} - -//! Update the list box with the current geometry export nodes. -global proc LumberyardToolUpdateGeometryListBox() -{ - global int $g_currentSelectedGeometryID; - - setParent LUMBERYARDTOOL_GEOMETRY_LISTBOX; - string $childItems[] = `layout -query -childArray LUMBERYARDTOOL_GEOMETRY_LISTBOX`; - for ($child in $childItems) - { - deleteUI $child; - } - - //Put in the header - LumberyardToolAddHeaderToGeometryListbox(); - - // Get existing geometry export nodes from Maya scene. - string $geomItems[] = `LumberyardToolGetGeometryExportNodes`; - - // Add instruction texts if no geometry export nodes present - if (size($geomItems) == 0) - { - LumberyardToolAddGeometryInstructionTexts; - return; - } - - int $itemIndex = 0; - for ($item in $geomItems) - { - LumberyardToolAddItemToGeometryListbox $item $itemIndex; - $itemIndex++; - } - - //Restore focus highlight - int $currentSelectedItem = $g_currentSelectedGeometryID; - $g_currentSelectedGeometryID = -1; - LumberyardToolGeometryListItemOnFocus $currentSelectedItem; -} - -//! Rename a geometry export node. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolSetExportNodeName(int $itemIndex) -{ - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - string $currentNodeName = `LumberyardToolGetExportNodeNameForItemID($itemIndex)`; - string $currentShortName = `LumberyardToolRemoveLumberyardExportNodePrefix $currentNodeName`; - string $newShortName = `textField -query -text (LumberyardToolGetGeometryListItemName($itemIndex))`; - $newShortName = `LumberyardVerifySceneObjectRequestNameWithPrefix $newShortName $currentShortName $lumberyardExportNodePrefix`; - string $newNodeName = `LumberyardToolAddLumberyardExportNodePrefix $newShortName`; - rename $currentNodeName $newNodeName; - // In case Maya adjusts the name for its own validity check (possible), update the widget to reflect the latest name. - $currentNodeName = `LumberyardToolGetExportNodeNameForItemID($itemIndex)`; - $newShortName = `LumberyardToolRemoveLumberyardExportNodePrefix $currentNodeName`; - textField -edit -text $newShortName (LumberyardToolGetGeometryListItemName($itemIndex)); -} - -//! Change the file type of a geometry export node. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolSetGeometryExportNodeFileType(int $itemIndex) -{ - string $nodeName = `LumberyardToolGetExportNodeNameForItemID($itemIndex)`; - int $newType = LumberyardToolGetFileTypeFromEnumIndex(`optionMenu -query -select (LumberyardToolGetGeometryListItemFileType($itemIndex))`); - setAttr ($nodeName + ".fileType") $newType; -} - -//! Update the selected type in file type menu of a geometry export node. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolUpdateGeometryListItemFileType(int $itemIndex) -{ - string $nodeName = `LumberyardToolGetExportNodeNameForItemID($itemIndex)`; - if (`attributeExists "fileType" $nodeName`) - { - int $currentType = LumberyardToolGetEnumIndexFromFileType(`getAttr ($nodeName + ".fileType")`); - optionMenu -edit -select $currentType `LumberyardToolGetGeometryListItemFileType($itemIndex)`; - } -} - -//! Update the merge nodes attribute of a geometry export node. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolSetGeometryExportNodeMergeNodes(string $itemIndex) -{ - int $value = (`checkBox -query -value LUMBERYARDTOOL_MERGENODES_CHECKBOX` == 0); - string $node = `LumberyardToolGetExportNodeNameForItemID($itemIndex)`; - setAttr ($node + ".DoNotMerge") $value; -} - -//! Callback for change in the Do Not Merge attribute. -/*! - /param $nodeDoNotMergeAttribute string reference to the originating node.attribute that changed. -*/ -global proc LumberyardToolUpdateMergeData(string $nodeDoNotMergeAttribute) -{ - checkBox -edit -value (`getAttr ($nodeDoNotMergeAttribute)` == 0) LUMBERYARDTOOL_MERGENODES_CHECKBOX; -} - -//! Rebuild advance option frame for the selected geometry export node. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolRebuildGeometryAdvancedOptionsFrame(int $itemIndex) -{ - global int $g_boxWidth; - global int $g_buttonSpace; - global float $g_UIColor[]; - - string $childArray[]; - $childArray = `frameLayout -query -childArray LUMBERYARDTOOL_GEOMETRYADVANCEDOPTIONS_FRAME`; - for ($child in $childArray) - { - deleteUI $child; - } - - setParent LUMBERYARDTOOL_GEOMETRYADVANCEDOPTIONS_FRAME; - gridLayout -numberOfColumns 2 -cellWidthHeight ($g_boxWidth / 2 - 4) 20; - { - checkBox -value 0 -label "Merge Nodes" -changeCommand "" LUMBERYARDTOOL_MERGENODES_CHECKBOX; - checkBox -value 0 -label "Vertex Colors" -changeCommand "" LUMBERYARDTOOL_VERTEXCOLORS_CHECKBOX; - checkBox -value 0 -label "8 Weights (skin only)" -changeCommand "" LUMBERYARDTOOL_8WEIGHTS_CHECKBOX; - checkBox -value 0 -label "32 Bit Vertex Precision" -changeCommand "" - -annotation "Activating will add 32 bits of precision to position each vertex accurately when the mesh is located far from its pivot. Note that certain platforms only support 16-bit precision. For more details please see documentation." - LUMBERYARDTOOL_32BITVERTEX_CHECKBOX; - } - - setParent LUMBERYARDTOOL_GEOMETRYADVANCEDOPTIONS_FRAME; - rowColumnLayout -numberOfRows 1 -height 30 -rowOffset 1 "both" 4 -columnSpacing 3 $g_buttonSpace; - text -label "Custom Path" -width 70; - textField -width 190 -text `LumberyardToolUpdateGeometryListItemCustomPath $itemIndex` - -changeCommand ("LumberyardToolSetGeometryExportNodeCustomPathFromTextField " + $itemIndex) - LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_TEXTFIELD; - iconTextButton -image "icons/lumberyard_folder_icon.png" -width 20 -height 18 -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolSetGeometryExportNodeCustomPathFromBrowser " + $itemIndex) - LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_BUTTON; - - - if ($itemIndex != -1) - { - string $node = `LumberyardToolGetExportNodeNameForItemID $itemIndex`; - // TODO: eventually we should change the node attribute from ".DoNotMerge" to ".MergeNodes" - checkBox -edit -value (`getAttr ($node + ".DoNotMerge")` == 0) -changeCommand ("LumberyardToolSetGeometryExportNodeMergeNodes " + $itemIndex) LUMBERYARDTOOL_MERGENODES_CHECKBOX; - connectControl LUMBERYARDTOOL_VERTEXCOLORS_CHECKBOX ($node + ".WriteVertexColours"); - connectControl LUMBERYARDTOOL_8WEIGHTS_CHECKBOX ($node + ".EightWeightsPerVertex"); - connectControl LUMBERYARDTOOL_32BITVERTEX_CHECKBOX ($node + ".UseF32VertexFormat"); - connectControl LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_TEXTFIELD ($node + ".NodeCustomExportPath"); - - scriptJob -replacePrevious -attributeChange ($node + ".DoNotMerge") ("LumberyardToolUpdateMergeData " + $node + ".DoNotMerge") -parent LUMBERYARDTOOL_MERGENODES_CHECKBOX; - - } - else - { - checkBox -edit -enable false LUMBERYARDTOOL_MERGENODES_CHECKBOX; - checkBox -edit -enable false LUMBERYARDTOOL_VERTEXCOLORS_CHECKBOX; - checkBox -edit -enable false LUMBERYARDTOOL_8WEIGHTS_CHECKBOX; - checkBox -edit -enable false LUMBERYARDTOOL_32BITVERTEX_CHECKBOX; - textField -edit -enable false LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_TEXTFIELD; - iconTextButton -edit -enable false LUMBERYARDTOOL_GEOMETRYCUSTOMPATH_BUTTON; - } -} - -// Index of the selected geometry export node. -global int $g_currentSelectedGeometryID = -1; - -//! Update color and Advanced Option frameLayout when a list item is selected. -/*! - /param $itemIndex Index corresponding to the export node item in the list box. -*/ -global proc LumberyardToolGeometryListItemOnFocus(int $itemIndex) -{ - global float $g_highLightColor[]; - global int $g_currentSelectedGeometryID; - - if ($g_currentSelectedGeometryID == $itemIndex) - { - return; - } - $g_currentSelectedGeometryID = $itemIndex; - LumberyardToolRebuildGeometryAdvancedOptionsFrame $itemIndex; - if ($itemIndex == -1) - { - button -edit -enable false LUMBERYARDTOOL_EXPLORERVIEW_BUTTON; - button -edit -enable false LUMBERYARDTOOL_SELECTGEOMETRY_BUTTON; - return; - } - - button -edit -enable true LUMBERYARDTOOL_EXPLORERVIEW_BUTTON; - button -edit -enable true LUMBERYARDTOOL_SELECTGEOMETRY_BUTTON; - - // TODO: this is currently disabled because it prevents the user from creating a new export - // node after selecting any list item. Need to figure out a way to do the focus... - //select `LumberyardToolGetExportNodeNameForItemID $itemIndex`; - int $nodeCount = `LumberyardToolGetGeometryExportNodeCount`; - for ($i = 0; $i < $nodeCount; $i++) - { - if ($i == $itemIndex) - { - rowLayout -edit -backgroundColor $g_highLightColor[0] $g_highLightColor[1] $g_highLightColor[2] `LumberyardToolGetGeometryListItemRow($i)`; - } - else - { - rowLayout -edit -backgroundColor 0 0 0 `LumberyardToolGetGeometryListItemRow($i)`; - } - } -} - -//! Get additional export options. -global proc string LumberyardExportGetAdditionalExportOptions() -{ - string $options; - int $removeNamespaces = `LumberyardGetIntExportSetting "removeNamespaces"`; - // exportANMs is not supported as CGA/ANM support has been removed. - // exportANMs should always be "0" as initialized in LumberyardGeometryOnLoad() - // UI elements that alter the value of exportANMs have been removed - int $exportANMs = `LumberyardGetIntExportSetting "exportANMs"`; - - if ($exportANMs != 0) - { - warning ("ANM export is not supported. exportANMs being disabled."); - cryExportSetExportSettingValue "exportANMs" "0"; - $exportANMS = 0; - } - - $options += "cryExportRemoveNamespaces=" + $removeNamespaces + ";"; - $options += "cryExportExportANMs=" + $exportANMs + ";"; - return $options; -} - -//! Export selected geometry export nodes. -/*! - /param $blockOnWarnings A flag controls whether the export progress window will be automatically - closed if there is any warning. -*/ -global proc LumberyardToolExportCheckedGeometryListItems(int $blockOnWarnings) -{ - string $selectedNodes[]; - int $selectId = 0; - - int $nodeCount = `LumberyardToolGetGeometryExportNodeCount`; - for($i = 0; $i < $nodeCount; $i++) - { - string $selectItemShortName = `textField -query -text (LumberyardToolGetGeometryListItemName($i))`; - $selectNode = `LumberyardToolAddLumberyardExportNodePrefix $selectItemShortName`; - if (`LumberyardToolHasValidExportTarget $selectNode` && - `getAttr ($selectNode + ".shouldExport")`) - { - if (`objExists $selectNode`) - { - $selectedNodes[$selectId] = $selectNode; - $selectId++; - } - } - } - - cryExportGeometry $selectedNodes $blockOnWarnings `LumberyardExportGetAdditionalExportOptions`; -} - -//! Sets the export path for exporting geometry -/*! - \note This currently relies on the old CRYEXPORTSETTINGS base approach (using LUMBERYARD_EXPORT_SETTINGS) for setting default paths -*/ -global proc LumberyardToolUpdateGeometryExportPath() -{ - global string $g_defaultPathString; - string $exportPath = `textField -query -text LUMBERYARDTOOL_GEOMETRYEXPORTPATH_TEXTFIELD`; - - // For empty path make sure UI is updated - if($exportPath == "") - { - LumberyardUtilitiesSetTextToDefaultPath("LUMBERYARDTOOL_GEOMETRYEXPORTPATH_TEXTFIELD"); - } - // For default path, clear the custom path before passing it to the data backend - else if(`gmatch $exportPath $g_defaultPathString`) - { - $exportPath = ""; - } - else - { - $exportPath = `cryExportFixupPath $exportPath`; - textField -edit -text $exportPath LUMBERYARDTOOL_GEOMETRYEXPORTPATH_TEXTFIELD; - } - cryExportSetExportSettingValue "customFilePath" $exportPath; -} - -//! Set the text field of global geometry export path by browsing folder. -global proc LumberyardToolSetGeometryExportPathFromFileBrowser() -{ - string $result[] = `LumberyardBrowseForPath "" "Set Export Path"`; - string $folderPath; - if (size($result) == 1) - { - $folderPath = $result[0]; - textField -edit -text $folderPath LUMBERYARDTOOL_GEOMETRYEXPORTPATH_TEXTFIELD; - LumberyardToolUpdateGeometryExportPath; - } -} - -//! Resize Lumberyard Tool window by collapsing or expanding the geometry frame. -/*! - \param $collapse Whether collapse or expand the geometry frame. -*/ -global proc LumberyardGeometryResizeWindow(int $collapse) -{ - global int $g_geometryHeightDiff; - global int $g_advanceOptionHeightDiff; - int $geometryHeightDiff = $g_geometryHeightDiff; - if (`frameLayout -query -collapse LUMBERYARDTOOL_GEOMETRYADVANCEDOPTIONS_FRAME`) - { - $geometryHeightDiff = $g_geometryHeightDiff - $g_advanceOptionHeightDiff; - } - if ($collapse) - { - $geometryHeightDiff = -$geometryHeightDiff; - } - LumberyardToolResizeWindow $geometryHeightDiff; -} - -//! Collapse geometry advance option frame. -global proc LumberyardGeometryCollapseAdvanceOptionsFrame() -{ - global int $g_advanceOptionHeightDiff; - if (!`frameLayout -query -collapse LUMBERYARDTOOL_GEOMETRYADVANCEDOPTIONS_FRAME`) - { - frameLayout -edit -collapse true LUMBERYARDTOOL_GEOMETRYADVANCEDOPTIONS_FRAME; - LumberyardToolResizeWindow (-$g_advanceOptionHeightDiff); -} -} - -//! Allow user optional upgrade/update path for old format data. Don't allow Lumberyard Tools to work until updated. -global proc int LumberyardToolAttemptDataUpdates() -{ - if( !`LumberyardToolFindAndUpgradeOldStyleExportNodes` ) - { - // Close Lumberyard tools window if user choose not to upgrade. - if( `window -exists LUMBERYARDTOOL_MAIN_WINDOW` ) - { - deleteUI LUMBERYARDTOOL_MAIN_WINDOW; - } - - return false; - } - - if ( !`LumberyardToolFindAndChangeCGAExportTags`) - { - // Close Lumberyard tools window if user choose not to upgrade. - if( `window -exists LUMBERYARDTOOL_MAIN_WINDOW` ) - { - deleteUI LUMBERYARDTOOL_MAIN_WINDOW; - } - - return false; - } - return true; -} - -//! Necessary setup when the Lumberyard Tool is loaded or the scene file is changed. -global proc LumberyardGeometryOnLoad() -{ - global int $g_currentSelectedGeometryID; - $g_currentSelectedGeometryID = -1; - - LumberyardToolLoadGeometryExportNodes; - - if (!`LumberyardToolAttemptDataUpdates`) - { - return; - } - - // CGA/ANM export is not supported (disable) - cryExportSetExportSettingValue "exportANMs" "0"; - - LumberyardToolUpdateGeometryListBox; - button -edit -enable false LUMBERYARDTOOL_EXPLORERVIEW_BUTTON; - button -edit -enable false LUMBERYARDTOOL_SELECTGEOMETRY_BUTTON; - textField -edit -text `LumberyardToolGetGlobalGeometryExportPath 0` LUMBERYARDTOOL_GEOMETRYEXPORTPATH_TEXTFIELD; - LumberyardToolRebuildGeometryAdvancedOptionsFrame $g_currentSelectedGeometryID; -} - -//! Create geometry export main frame. -global proc LumberyardToolCreateGeometryFrame() -{ - global int $g_boxWidth; - global int $g_buttonSpace; - global float $g_UIColor[]; - global string $g_geometryExtensions[]; - $g_geometryExtensions = {"cgf","chr","cga","skin"}; - int $buttonWidth = ($g_boxWidth - ($g_buttonSpace * 2)) / 3; - global int $g_advanceOptionHeightDiff; - - // Create geometry export main frame layout. - frameLayout -collapsable true -marginHeight 5 -marginWidth 5 -label "Geometry Export" - -collapseCommand ("LumberyardGeometryResizeWindow " + 1) -expandCommand ("LumberyardGeometryResizeWindow " + 0) - LUMBERYARDTOOL_GEOMETRY_FRAME; - { - columnLayout -adjustableColumn true LUMBERYARDTOOL_GEOMETRY_LAYOUT; - { - scrollLayout -height 120 -width $g_boxWidth -backgroundColor 0 0 0 -visible true LUMBERYARDTOOL_GEOMETRY_LISTBOX; - - setParent ..; - rowColumnLayout -numberOfRows 1 -width $g_boxWidth -columnSpacing 2 $g_buttonSpace; - button -label "Explorer View" -width $buttonWidth -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -enable false -command ("LumberyardToolViewGeometryInExplorer") LUMBERYARDTOOL_EXPLORERVIEW_BUTTON; - button -label "Select" -width $buttonWidth -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -enable false -command ("LumberyardToolSelectMayaGeometry") LUMBERYARDTOOL_SELECTGEOMETRY_BUTTON; - button -label "Add Selected" -width $buttonWidth -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolAddNewGeometryExportNode"); - - setParent ..; - rowColumnLayout -numberOfRows 1 -height 30 -rowOffset 1 "both" 4 -columnSpacing 3 $g_buttonSpace; - text -label "Export Path" -width 70; - textField -text `LumberyardToolGetGlobalGeometryExportPath 0` -width 200 -changeCommand ("LumberyardToolUpdateGeometryExportPath") - LUMBERYARDTOOL_GEOMETRYEXPORTPATH_TEXTFIELD; - popupMenu; - { - menuItem -label "Reset" -command ("LumberyardResetCustomString LUMBERYARDTOOL_GEOMETRYEXPORTPATH_TEXTFIELD"); - } - iconTextButton -image "icons/lumberyard_folder_icon.png" -width 20 -height 18 -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolSetGeometryExportPathFromFileBrowser"); - - setParent LUMBERYARDTOOL_GEOMETRY_LAYOUT; - frameLayout -collapsable true -collapse false -marginHeight 5 -marginWidth 5 -label "Advanced Options" - -collapseCommand ("LumberyardToolResizeWindow " + (-$g_advanceOptionHeightDiff)) -expandCommand ("LumberyardToolResizeWindow " + $g_advanceOptionHeightDiff) - LUMBERYARDTOOL_GEOMETRYADVANCEDOPTIONS_FRAME; - LumberyardToolRebuildGeometryAdvancedOptionsFrame -1; - - setParent LUMBERYARDTOOL_GEOMETRY_LAYOUT; - button -label "Export Geometry" -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolExportCheckedGeometryListItems 1") LUMBERYARDTOOL_EXPORTGEOMETRY_BUTTON; - } - } - - - - scriptJob -event "NewSceneOpened" "LumberyardGeometryOnLoad" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - scriptJob -event "PostSceneRead" "LumberyardGeometryOnLoad" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - scriptJob -event "DagObjectCreated" "LumberyardToolRefreshGeometryListBoxReloadNodes" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - scriptJob -event "NameChanged" "LumberyardToolRefreshGeometryListBoxReloadNodes" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - - LumberyardGeometryOnLoad; -} - -//! Gets the root of a joint chain given a joint in the hierarchy. -/*! - \param $joint The starting joint used to check the hierarchy. -*/ -proc string LumberyardToolGetRootJointForChild(string $joint) -{ - string $rootJoint = $joint; - string $parentJoints[]; - while($joint != "") - { - $parentJoints = `listRelatives -type "joint" -parent $joint`; - $joint = ""; - for($parentJoint in $parentJoints) - { - $rootJoint = $parentJoint; - $joint = $parentJoint; - } - } - - return $rootJoint; -} - -//! Gets the single root joint associated with a skinCluster. If multiple root joints exists, returns an empty string -/*! - \param $mesh The mesh corresponding to the skinCluster to determine the root joint for -*/ -proc string LumberyardGetRootJointForSkin(string $mesh) -{ - string $skinCluster = findRelatedSkinCluster($mesh); - string $joints[] = `skinCluster -query -influence $skinCluster`; - - string $rootJoints[]; - for($joint in $joints) - { - if(`nodeType $joint` == "joint") - { - string $rootJoint = `LumberyardToolGetRootJointForChild $joint`; - $rootJoints[size($rootJoints)] = $rootJoint; - } - } - - $rootJoints = `stringArrayRemoveDuplicates $rootJoints`; - if(size($rootJoints) == 1) - { - return $rootJoints[0]; - } - - return ""; -} - -//! Determine if an item should be added using the Auto-Detect tool -/*! - \param $item The item to check for adding - \param $currentExportList The list of all items currently being managed by the exporter of the same type as $item -*/ -proc int LumberyardShouldAddItem(string $item, string $currentExportList[]) -{ - // We ignore all non-joint items whose parents are joints, they are likely to be physics meshes - string $parents[] = `listRelatives -parent $item`; - if(`nodeType $item` != "joint" && size($parents) > 0 && `nodeType $parents[0]` == "joint") - { - return false; - } - - // We only add it if it is not already part of an existing export group - return !`stringArrayContains $item $currentExportList`; -} - -//! Automatically detect meshes and skeletons in the scene and create geometry export items for each of them. -/*! - /param $includeMaterial A flag decides whether to detect materials from meshes and create material groups. - /note Optionally, materials may also be detected and put into material groups based on the mesh they are assigned to. -*/ -global proc LumberyardAutoDetectGeometry(int $includeMaterial) -{ - string $transforms[] = `ls -transforms`; - // Selection mask value is set as 12 as referring to polygon. - string $meshes[] = `filterExpand -selectionMask 12 $transforms`; - $meshes = stringArrayRemoveDuplicates($meshes); - - //allow cancel if existing Material Groups exist - if (`LumberyardToolMaterialGroupsExist` && $includeMaterial) - { - string $dialogMessage = "Detected existing Material Groups. Automatic Detection is intended to be " + - "performed on a clean export profile. It may rename material groups, reassign materials, and reorder " + - "materials within groups. Do you wish to proceed?"; - - if(`confirmDialog -title "Lumberyard Exporter" -message $dialogMessage - -button "Yes" -button "No" -defaultButton "Yes" - -cancelButton "No" -dismissString "No"` == "No") - { - return; - } - } - - string $exportNodes[] = `LumberyardToolGetGeometryExportNodes`; - string $exportTargets[]; - string $exportSkeletonRoots[]; - for($exportNode in $exportNodes) - { - if(`attributeExists "exportTarget" $exportNode`) - { - string $exportTarget = `getAttr ($exportNode + ".exportTarget")`; - if(`objExists $exportTarget`) - { - $exportTargets[size($exportTargets)] = $exportTarget; - if(`getAttr ($exportNode + ".fileType")` == 1) - { - if(`nodeType $exportTarget` == "transform") - { - string $joints[] = `listRelatives -type "joint" -children $exportTarget`; - $exportSkeletonRoots[size($exportSkeletonRoots)] = $joints[0]; - } - else if(`nodeType $exportTarget` == "joint") - { - $exportSkeletonRoots[size($exportSkeletonRoots)] = $exportTarget; - } - } - } - } - } - string $exportMeshes[] = `filterExpand -selectionMask 12 $exportTargets`; - - for ($mesh in $meshes) - { - // If we have found a skin, try to add its skeleton as well - if(`LumberyardGetGeometryExportNodeDefaultFileType $mesh` == 3) - { - string $rootJoint = `LumberyardGetRootJointForSkin $mesh`; - if(LumberyardShouldAddItem($rootJoint, $exportSkeletonRoots)) - { - $exportSkeletonRoots[size($exportSkeletonRoots)] = $rootJoint; - select $rootJoint; - LumberyardToolAddNewGeometryExportNode; - } - } - - if(LumberyardShouldAddItem($mesh, $exportMeshes)) - { - select $mesh; - LumberyardToolAddNewGeometryExportNode; - $exportMeshes[size($exportMeshes)] = $mesh; - } - - // Skip adding material groups for skeletons. - if (`LumberyardGetGeometryExportNodeDefaultFileType $mesh` != 1 && $includeMaterial) - { - select $mesh; - LumberyardToolAddMaterials( true ); - } - } -} - -//! Find all old style export nodes. -proc string[] LumberyardToolFindOldStyleExportNodes() -{ - // Get existing geometry export nodes from Maya scene. - string $exportNodes[] = `LumberyardToolGetGeometryExportNodes`; - string $oldStyleExportNodes[]; - - if(`size($exportNodes)`) - { - // Export node should be child of LUMBERYARD_GEOMETRYEXPORT_GROUP - for($exportNode in $exportNodes) - { - if(!`isParentOf LUMBERYARD_GEOMETRYEXPORT_GROUP $exportNode`) - { - $oldStyleExportNodes[`size($oldStyleExportNodes)`] = $exportNode; - continue; - } - // Export node should have exportTarget attribute. - if(!`attributeExists "exportTarget" $exportNode`) - { - $oldStyleExportNodes[`size($oldStyleExportNodes)`] = $exportNode; - continue; - } - - // Export node should have no children. - string $childList[] = `listRelatives -children $exportNode`; - if(`size($childList)`) - { - $oldStyleExportNodes[`size($oldStyleExportNodes)`] = $exportNode; - continue; - } - } - } - // Get existing old named geometry export nodes from Maya scene. - $exportNodes = `cryMayaSupportPlugin gatherOldFormatExportNodes`; - appendStringArray($oldStyleExportNodes, $exportNodes, size($exportNodes)); - - return $oldStyleExportNodes; -} - -//! Upgrade old style export nodes. -proc LumberyardToolUpgradeOldStyleExportNodes( string $oldStyleExportNodes[] ) -{ - // There should be LUMBERYARD_GEOMETRYEXPORT_GROUP - if(!`objExists LUMBERYARD_GEOMETRYEXPORT_GROUP`) - { - // Create LUMBERYARD_EXPORT_GROUP and LUMBERYARD_GEOMETRYEXPORT_GROUP if needed. - if(!`objExists LUMBERYARD_EXPORT_GROUP`) - { - // Create LUMBERYARD_EXPORT_GROUP - group -empty -name LUMBERYARD_EXPORT_GROUP; - } - // Create LUMBERYARD_GEOMETRYEXPORT_GROUP - group -empty -parent LUMBERYARD_EXPORT_GROUP -name LUMBERYARD_GEOMETRYEXPORT_GROUP; - } - - int $needReload = false; - for($exportNode in $oldStyleExportNodes) - { - // Export node should be child of LUMBERYARD_GEOMETRYEXPORT_GROUP - if(!`isParentOf LUMBERYARD_GEOMETRYEXPORT_GROUP $exportNode`) - { - parent $exportNode LUMBERYARD_GEOMETRYEXPORT_GROUP; - } - - if( !`attributeExists "exportTarget" $exportNode` ) - { - addAttr -longName exportTarget -dataType "string" -hidden true $exportNode; - } - - // Export node should have no children. - string $childList[] = `listRelatives -children $exportNode`; - int $childCount = `size($childList)`; - - if($childCount) - { - string $exportTargetName = $childList[0]; - - // Group multiple child nodes into one. - if($childCount > 1) - { - // Get export name. - $exportTargetName = LumberyardToolRemoveLumberyardExportNodePrefix($exportNode); - - group -empty -name $exportTargetName; - parent $childList $exportTargetName; - } - else - { - parent -world $exportTargetName; - } - - setAttr ($exportNode + ".exportTarget") -type "string" $exportTargetName; - } - string $oldNamefilter = LumberyardGetOldExportNodeNamePrefix(); - $oldNamefilter += "*"; - if( `gmatch ($exportNode) $oldNamefilter` ) - { - //change name to Lumberyard node name - string $lumberyardExportNodePrefix= LumberyardGetExportNodeNamePrefix(); - string $oldExportNodePrefix = LumberyardGetOldExportNodeNamePrefix(); - string $newName = `substitute $oldExportNodePrefix $exportNode $lumberyardExportNodePrefix`; - rename $exportNode $newName; - $needReload = true; - } - } - if ($needReload) - { - // reload geometry export node from plugin to ensure correct records of export nodes after upgrade - LumberyardToolLoadGeometryExportNodes; - } -} - -//! Find old style export node and show dialog to confirm upgrade. -global proc int LumberyardToolFindAndUpgradeOldStyleExportNodes() -{ - string $oldStyleExportNodes[] = LumberyardToolFindOldStyleExportNodes(); - - if(`size($oldStyleExportNodes)` == 0) - { - return true; - } - - if(`confirmDialog -title "Lumberyard Exporter" -message "Detected old export data. Do you wish to upgrade to the new tool format? (This operation will remove old data)" - -button "Yes" -button "No" -defaultButton "Yes" - -cancelButton "No" -dismissString "No"` == "No") - { - return false; - } - - LumberyardToolUpgradeOldStyleExportNodes( $oldStyleExportNodes ); - - return true; -} - - -//! Find all CGA export nodes. -proc string[] LumberyardToolFindCGAExportNodes() -{ - // Get existing geometry export nodes from Maya scene. - string $exportNodes[] = `LumberyardToolGetGeometryExportNodes`; - string $CGAExportNodes[]; - - if(`size($exportNodes)`) - { - global int $s_cgaFileType; - for($exportNode in $exportNodes) - { - if((int(getAttr ($exportNode + ".fileType"))) == $s_cgaFileType) - { - $CGAExportNodes[`size($CGAExportNodes)`] = $exportNode; - } - } - } - return $CGAExportNodes; -} - - -//! Find CGAs and show dialog to confirm conversion to CGF. -global proc int LumberyardToolFindAndChangeCGAExportTags() -{ - string $cgaExportNodes[] = LumberyardToolFindCGAExportNodes(); - - if(`size($cgaExportNodes)` == 0) - { - return true; - } - - string $dialogMessage = - "CGA Export Nodes have been found but CGA format is no longer supported. " + - "Update from CGA to CGF is required to use Lumberyard Tools. Do you wish to update now?"; - - if(`confirmDialog -title "Lumberyard Tools- Invalid Data" -message $dialogMessage - -button "Yes" -button "Cancel" -defaultButton "Yes" - -cancelButton "Cancel" -dismissString "Cancel"` == "Cancel") - { - return false; - } - - global int $s_cgfFileType; - for ($exportNode in $cgaExportNodes) - { - setAttr ($exportNode + ".fileType") $s_cgfFileType; - } - - return true; -} diff --git a/Tools/maya/script/LumberyardGeometryUtilities.mel b/Tools/maya/script/LumberyardGeometryUtilities.mel deleted file mode 100644 index 6eccbb1583..0000000000 --- a/Tools/maya/script/LumberyardGeometryUtilities.mel +++ /dev/null @@ -1,51 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -//! Data record of geometry export nodes. -global string $g_geometryExportNodes[]; - -//! Retrieve all lumberyard export nodes by Maya plugin, and save them in the backend data record. -/*! - \note This function is costly as it will traverse through the scene hierarchy to search for nodes. Only use when necessary. - Use LumberyardToolGetGeometryExportNodes instead when you just want to get the record of the nodes. -*/ -global proc LumberyardToolLoadGeometryExportNodes() -{ - global string $g_geometryExportNodes[]; - $g_geometryExportNodes = `cryMayaSupportPlugin gatherExportNodes`; -} - -//! Get export nodes from backend data record. -global proc string[] LumberyardToolGetGeometryExportNodes() -{ - global string $g_geometryExportNodes[]; - return $g_geometryExportNodes; -} - -//! Get the number of export nodes from backend data record. -global proc int LumberyardToolGetGeometryExportNodeCount() -{ - global string $g_geometryExportNodes[]; - return size($g_geometryExportNodes); -} - -//! Delete a export node record from backend data record. -/*! - \param $node the node name to remove from the record. -*/ -global proc LumberyardToolDeleteGeometryExportNode(string $node) -{ - global string $g_geometryExportNodes[]; - string $removeNodes[]; - $removeNodes[0] = $node; - $g_geometryExportNodes = stringArrayRemove($removeNodes, $g_geometryExportNodes); -} \ No newline at end of file diff --git a/Tools/maya/script/LumberyardMaterial.mel b/Tools/maya/script/LumberyardMaterial.mel deleted file mode 100644 index 7e056825f1..0000000000 --- a/Tools/maya/script/LumberyardMaterial.mel +++ /dev/null @@ -1,1506 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -/*! - Material Export. -*/ - -LumberyardMaterialLoadDependencies(); - -global proc LumberyardMaterialLoadDependencies() -{ - eval("source cryMaterial.mel"); -} - -//! Get the name textField of a material group. -/*! - /param $groupIndex The index of the material group. -*/ -proc string LumberyardToolGetMaterialGroupItemName(int $groupIndex) -{ - return ("materialGroupItemName" + $groupIndex); -} - -//! Get the name text field of a material. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -proc string LumberyardToolGetMaterialItemName(int $groupIndex, int $materialIndex) -{ - return ("materialItemName" + $groupIndex + "_" + $materialIndex); -} - -//! Get the row of a material group. -/*! - /param $groupIndex The material group index. -*/ -proc string LumberyardToolGetMaterialGroupItemRow(int $groupIndex) -{ - return ("materialGroupItemRow" + $groupIndex); -} - -//! Get the tree view row item of a material. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -proc string LumberyardToolGetMateriaItemRow(int $groupIndex, int $materialIndex) -{ - return ("materialItemRow" + $groupIndex + "_" + $materialIndex); -} - -//! Get the check box of a material group. -/*! - /param $groupIndex The material group index. -*/ -proc string LumberyardToolGetMaterialGroupItemCheckBoxName(int $groupIndex) -{ - return ("materialGroupItemCheck" + $groupIndex); -} - -// Get the optionMenu of physicalize type of a material. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -proc string LumberyardGetMaterialItemPhysicalizeOptionMenu(int $groupIndex, int $materialIndex) -{ - return ("materialItemPhysicalizeOptionMenu" + $groupIndex + "_" + $materialIndex); -} - -//! Get the current text in the name text field of a material group. -/*! - /param $groupIndex The material group index. -*/ -proc string LumberyardToolGetMaterialGroupItemNameValue(int $groupIndex) -{ - return `textField -query -text (LumberyardToolGetMaterialGroupItemName($groupIndex))`; -} - -//! Get the current text in the name text field of a material. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -proc string LumberyardToolGetMaterialItemNameValue(int $groupIndex, int $materialIndex) -{ - return `textField -query -text (LumberyardToolGetMaterialItemName($groupIndex, $materialIndex))`; -} - -//! Set the text in the name text field of a material group. -/*! - /param $groupIndex The material group index. - /param $value The text value to set. -*/ -proc LumberyardToolSetMaterialGroupItemNameValue(int $groupIndex, string $value) -{ - textField -edit -text $value (LumberyardToolGetMaterialGroupItemName($groupIndex)); -} - -//! Get the text in the name text field of a material. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. - /param $value The text value to set. -*/ -proc LumberyardToolSetMaterialItemNameValue(int $groupIndex, int $materialIndex, string $value) -{ - textField -edit -text $value (LumberyardToolGetMaterialItemName($groupIndex, $materialIndex)); -} - -//! Provide the material physicalized type strings for displaying in option menu. -/*! - /note In saved back-end data, the original physicalized type names are unchanged. It works correctly - since the mapping order of actual types is not changed. -*/ -proc string LumberyardExportGetMaterialPhysicalizeEnumString() -{ - return "No Physics:Default:Proxy No Draw:No Collide:Obstruct"; -} - -//! Get material partition name. -/*! - /note - Ensures that the partition exists, the export selection attribute exists, - and that it contains as many elements as there are material groups. -*/ -proc string LumberyardToolsCreateMaterialPartitionIfNeeded() -{ - string $partitionName = `cryMaterialGetPartitionName`; - - if( !`objExists $partitionName` ) - { - // Create a dummy set and add to new partition to avoid script warning. Remove the dummy set right after partition creation. - sets -name "dummySet1"; - partition -name $partitionName "dummySet1"; - partition -removeSet $partitionName "dummySet1"; - delete "dummySet1"; - } - - if(!`attributeExists "shouldExportArray" $partitionName`) - { - addAttr -dataType Int32Array -longName "shouldExportArray" $partitionName; - } - - return $partitionName; -} - -//! Save checkBox values for material groups to material partition. -/*! - /param $checkBoxStates[] checkBox states of material groups. -*/ -proc LumberyardToolSetMaterialExportSelections(int $checkBoxStates[]) -{ - string $partitionName = `LumberyardToolsCreateMaterialPartitionIfNeeded`; - - string $attributeString = (size($checkBoxStates) + ""); - - for($i = 0; $i < size($checkBoxStates); $i++) - { - $attributeString += (" " + $checkBoxStates[$i]); - } - - string $attributeName = ($partitionName + ".shouldExportArray"); - string $commandString = "setAttr " + $attributeName + " -type Int32Array " + $attributeString; - eval($commandString); -} - -//! Ensures that a checkBox value exists for all material groups. -proc string LumberyardToolEnsureCorrectMaterialGroupData() -{ - string $partitionName = `LumberyardToolsCreateMaterialPartitionIfNeeded`; - - string $materialGroups[] = `partition -query $partitionName`; - int $checkBoxStates[] = `getAttr ($partitionName + ".shouldExportArray")`; - int $needsStoring = false; - - // If there is old data or if the data has been manipulated, set any missing groups to export by default. - while(size($checkBoxStates) < size($materialGroups)) - { - $checkBoxStates[size($checkBoxStates)] = true; - $needsStoring = true; - } - - if($needsStoring) - { - LumberyardToolSetMaterialExportSelections($checkBoxStates); - } - - return $partitionName; -} - -//! Save the selection state of a material group with updated value. -/*! - /param $groupIndex The material group index. - /param $value The updated state of check box. -*/ -proc LumberyardToolSetMaterialGroupExportSelection(int $groupIndex, int $value) -{ - string $partitionName = `LumberyardToolEnsureCorrectMaterialGroupData`; - int $checkBoxValues[] = `getAttr ($partitionName + ".shouldExportArray")`; - - $checkBoxValues[$groupIndex] = $value; - LumberyardToolSetMaterialExportSelections($checkBoxValues); -} - - -//! Get the saved selection states of all material groups. -proc int[] LumberyardToolGetMaterialGroupExportSelections() -{ - string $partitionName = `LumberyardToolEnsureCorrectMaterialGroupData`; - int $checkBoxStates[] = `getAttr ($partitionName + ".shouldExportArray")`; - return $checkBoxStates; -} - -//! Remove the saved selection state of a material group. -/*! - /param $groupIndex The material group index. - /note This should only be called when the group is about to be removed. -*/ -proc LumberyardToolRemoveMaterialGroupExportSelection(int $groupIndex) -{ - string $partitionName = `LumberyardToolEnsureCorrectMaterialGroupData`; - int $checkBoxStates[] = `getAttr ($partitionName + ".shouldExportArray")`; - intArrayRemoveAtIndex($groupIndex, $checkBoxStates); - LumberyardToolSetMaterialExportSelections($checkBoxStates); -} - -//! Ensure a custom export path attribute exists for a material group. -proc int LumberyardToolEnsureCorrectMaterialGroupCustomExportPath(string $materialGroup) -{ - if(`objExists $materialGroup`) - { - if (!`attributeExists "customExportPath" $materialGroup`) - { - addAttr -dataType "string" -longName "customExportPath" $materialGroup; - } - return true; - } - return false; -} - -//! Ensure a custom export path attribute exists for all material groups. -proc LumberyardToolEnsureAllCorrectMaterialGroupCustomExportPath() -{ - string $partitionName = `LumberyardToolsCreateMaterialPartitionIfNeeded`; - - string $materialGroups[] = `partition -query $partitionName`; - for ($materialGroup in $materialGroups) - { - LumberyardToolEnsureCorrectMaterialGroupCustomExportPath $materialGroup; - } -} - -//! Get custom export path attribute value of a material group. -/*! - /param $materialGroup The material group name. -*/ -proc string LumberyardToolGetMaterialGroupCustomExportPath(string $materialGroup) -{ - string $path; - if (`LumberyardToolEnsureCorrectMaterialGroupCustomExportPath $materialGroup`) - { - $path = `getAttr ($materialGroup + ".customExportPath")`; - } - return $path; -} - -//! Set custom export path of the selected material group using folder browser. -global proc LumberyardToolSetMaterialGroupCustomExportPathFromBrowser() -{ - global int $g_currentSelectedMaterialGroupId; - if ($g_currentSelectedMaterialGroupId >= 0) - { - string $selectedGroup = `LumberyardToolGetMaterialGroupItemNameValue $g_currentSelectedMaterialGroupId`; - string $result[] = `LumberyardBrowseForPath "" "Set Custom Export Path"`; - if (`size($result)` == 1) - { - $folderPath = $result[0]; - textField -edit -text $folderPath LUMBERYARDTOOL_MATERIALCUSTOMPATH_TEXTFIELD; - setAttr -type "string" ($selectedGroup + ".customExportPath") $folderPath; - } - } -} - -//! Set custom export path of the selected material group by entering in path text field. -global proc LumberyardToolSetMaterialGroupCustomExportPathFromTextField() -{ - global int $g_currentSelectedMaterialGroupId; - if ($g_currentSelectedMaterialGroupId >= 0) - { - string $selectedGroup = `LumberyardToolGetMaterialGroupItemNameValue $g_currentSelectedMaterialGroupId`; - string $folderPath = `textField -query -text LUMBERYARDTOOL_MATERIALCUSTOMPATH_TEXTFIELD`; - $folderPath = `cryExportFixupPath $folderPath`; - setAttr -type "string" ($selectedGroup + ".customExportPath") $folderPath; - } -} - -//! Get custom export path of the selected material group from saved data. -global proc string LumberyardToolGetSelectedMaterialGroupCustomExportPath() -{ - global int $g_currentSelectedMaterialGroupId; - if ($g_currentSelectedMaterialGroupId >= 0) - { - string $selectedGroup = `LumberyardToolGetMaterialGroupItemNameValue $g_currentSelectedMaterialGroupId`; - return `LumberyardToolGetMaterialGroupCustomExportPath $selectedGroup`; - } - return ""; -} - -//! Are there existing material groups in partition. -global proc int LumberyardToolMaterialGroupsExist() -{ - string $partitionName = `LumberyardToolsCreateMaterialPartitionIfNeeded`; - string $materialGroups[] = `partition -query $partitionName`; - int $materialGroupCount = `size $materialGroups`; - return $materialGroupCount > 0; -} - -//! Consolidate all materials contained in groups into first group -/*! - /param $groups[] List of groups to consolidate into first group -*/ -global proc string LumberyardMaterialConsolidateGroups(string $groups[]) -{ - string $consolidatedGroup = ""; - int $groupCount = `size($groups)`; - - if ($groupCount > 0 ) - { - $consolidatedGroup = $groups[0]; - for( $i = 1; $i < $groupCount; $i++ ) - { - string $shaders[] = `sets -query $groups[$i]`; - cryMaterialRemoveShadersFromGroup $groups[$i] $shaders; - sets -addElement $consolidatedGroup $shaders; - delete $groups[$i]; - } - cryMaterialRebuildGroup $consolidatedGroup; - } - return $consolidatedGroup; -} - -//! Collects an array of groups that currently contain an element in shaderList -/*! - /param $existingGroups[] Result list of groups that have one of the shaders in it - /param $shaderList[] Shaders to look for in existing groups -*/ -global proc LumberyardMaterialCollectExistingGroupsThatContain(string $existingGroups[], string $shaderList[]) -{ - string $partitionName = `cryMaterialGetPartitionName`; - string $materialGroups[]; - $materialGroups = `cryMaterialGetMaterialGroups $partitionName`; - for( $materialGroup in $materialGroups ) - { - for ( $shader in $shaderList) - { - if( `sets -isMember $materialGroup $shader` ) - { - $existingGroups[`size($existingGroups)`] = $materialGroup; - break; - } - } - } -} - -//! Create a material group. -/*! - /param $name The material group name. -*/ -global proc string LumberyardMaterialCreateGroup(string $name) -{ - string $partitionName = `cryMaterialGetPartitionName`; - if(!`objExists $partitionName` ) - { - partition -name $partitionName; - } - - int $defaultName = 0; - if(`size($name)` == 0 ) - { - $name = `cryMaterialGetDefaultGroupName`; - $defaultName = 1; - } - - $newSet = `sets -empty -name $name`; - if( $defaultName == 0 && $newSet != $name ) - { - confirmDialog -title "Create Group" -message ("The group was renamed from `" + $name + "` to `" + $newSet + "` due to a name clash.") -button "OK"; - } - partition -add $partitionName $newSet; - LumberyardToolEnsureCorrectMaterialGroupCustomExportPath $newSet; - return $newSet; -} - -//! Export the selected material groups to specified material export path. -/*! - /param $selectedGroups[] Selected material groups to export. - /param $customFilePath Specified material export path. - /param $showDialogs A flag controls whether to show dialogues for overwrite warnings and how many files are exported. -*/ -global proc LumberyardExportSelectedMaterials(string $selectedGroups[], string $customFilePath, int $showDialogs) -{ - string $partitionName = `cryMaterialGetPartitionName`; - if (!`objExists $partitionName`) - { - partition -name $partitionName; - } - - // Prepare material partition by overwriting it with only selected material groups. - string $cryMaterialGroups[] = `partition -query $partitionName`; - for ($group in $cryMaterialGroups) - { - partition -removeSet $partitionName $group; - } - for ($group in $selectedGroups) - { - partition -addSet $partitionName $group; - } - - // Do exporting work. - cryExportGenerateMaterialFileToFilePath 0 $customFilePath $showDialogs; - - // Restore the original(all) material groups to material partition. - for ($group in $selectedGroups) - { - partition -removeSet $partitionName $group; - } - for ($group in $cryMaterialGroups) - { - partition -addSet $partitionName $group; - } -} - -//! Gather selected materials from Hypershade or selected meshes to a string array -global proc string[] LumberyardMaterialGatherMaterialsFromGeom() -{ - string $collectedMaterials[]; - string $set = `sets -empty`; - if(`objExists $set`) - { - string $selected[]; - $selected = `ls -sl`; - - for($rootNode in $selected) - { - LumberyardMaterialGatherMaterialsFromGeomRecurse $set $rootNode; - } - - //cryMaterialGetGroupShaders handles shaders and materials as equivalent - $collectedMaterials = `cryMaterialGetGroupShaders $set`; - delete $set; - } - return $collectedMaterials; -} - -//! Gather materials from geometry recursively -/*! - /param $set Name of the collection set. - /param $node Root node of recursive search -*/ -global proc LumberyardMaterialGatherMaterialsFromGeomRecurse( string $set, string $node ) -{ - string $shaderEngines[] = `listConnections -type shadingEngine $node`; - for( $shaderEngine in $shaderEngines ) - { - string $shaders[] = `listConnections -type lambert $shaderEngine`; - for( $shader in $shaders ) - { - if( `sets -isMember $set $shader` ) - { - continue; - } - sets -forceElement $set $shader; - } - string $hwShaders[] = `listConnections -type hwShader $shaderEngine`; - for( $hwShader in $hwShaders ) - { - if( `sets -isMember $set $hwShader` ) - { - continue; - } - sets -forceElement $set $hwShader; - } - } - - string $children[]; - string $child; - $children = `listRelatives -children -fullPath $node`; - for ($child in $children) - { - LumberyardMaterialGatherMaterialsFromGeomRecurse $set $child; - } -} - -//! Add materials from string list to a material group. -/*! - /param $materialList List of Materials to be added to group - /param $destGroup Name of destination group in partition -*/ -global proc LumberyardMaterialAssignToPartitionGroup(string $materialList[], string $destinationGroup) -{ - if(`objExists $destinationGroup`) - { - string $partitionName = `cryMaterialGetPartitionName`; - - for ($material in $materialList) - { - cryMaterialMoveShaderToGroupWithPartition $destinationGroup $material $partitionName; - } - } -} - -//! Save the selection state of a material group. -/*! - /param $groupIndex The material group index. -*/ -global proc LumberyardToolUpdateMaterialGroupCheckbox(int $groupIndex) -{ - string $checkBoxName = `LumberyardToolGetMaterialGroupItemCheckBoxName $groupIndex`; - int $value = `checkBox -query -value $checkBoxName`; - LumberyardToolSetMaterialGroupExportSelection($groupIndex, $value); -} - -//! Create a tree view item of a material group item and add it to the tree view. -/*! - /param $groupItem The material group name. - /param $groupIndex The material group index. - /param $shouldExport The export selection state of the group. -*/ -proc LumberyardToolAddGroupItemToMaterialTreeView(string $groupItem, int $groupIndex, int $shouldExport) -{ - global int $g_rowItemHeight; - - setParent LUMBERYARDTOOL_MATERIAL_TREEVIEW; - string $rowFullName = `rowLayout -numberOfColumns 3 -columnWidth3 22 225 19 - -height $g_rowItemHeight -columnAttach3 "left" "left" "left" -columnOffset3 4 0 4 - (LumberyardToolGetMaterialGroupItemRow($groupIndex))`; - { - string $checkBoxName = `LumberyardToolGetMaterialGroupItemCheckBoxName $groupIndex`; - checkBox -label "" -value $shouldExport -backgroundColor 0.5 0.5 0.5 -changeCommand ("LumberyardToolUpdateMaterialGroupCheckbox " + $groupIndex) $checkBoxName; - textField -text $groupItem -width 225 -changeCommand ("LumberyardToolSetMaterialGroupName " + $groupIndex) - -alwaysInvokeEnterCommandOnReturn 1 -noBackground 1 - -receiveFocusCommand ("LumberyardToolMaterialTreeViewGroupItemOnFocus " + $groupIndex) - `LumberyardToolGetMaterialGroupItemName $groupIndex`; - button -label "X" -backgroundColor 0 0 0 -height 20 -command("LumberyardToolRemoveMaterialGroup " + $groupIndex); - } - - scriptJob -replacePrevious -nodeDeleted $groupItem "LumberyardToolUpdateMaterialTreeView" -parent $rowFullName; -} - -//! Create a tree view item of a material and add it to the tree view. -/*! - /param $item The material group name. - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The material index within the group. -*/ -proc string LumberyardToolAddMaterialItemToMaterialTreeView(string $item, int $groupIndex, int $materialIndex) -{ - global int $g_rowItemHeight; - global float $g_UIColor[]; - - setParent LUMBERYARDTOOL_MATERIAL_TREEVIEW; - string $rowFullName = `rowLayout -numberOfColumns 3 -columnWidth3 137 110 19 - -height $g_rowItemHeight -columnAttach3 "right" "left" "left" -columnOffset3 3 0 4 - -dragCallback materialItemDragCallback -dropCallback materialItemDropCallback - (LumberyardToolGetMateriaItemRow($groupIndex, $materialIndex))`; - { - textField -text $item -width 100 -changeCommand ("LumberyardToolSetMaterialName " + $groupIndex + " " + $materialIndex) - -alwaysInvokeEnterCommandOnReturn 1 -noBackground 1 - -receiveFocusCommand ("LumberyardToolMaterialTreeViewMaterialItemOnFocus " + $groupIndex + " " + $materialIndex) - `LumberyardToolGetMaterialItemName $groupIndex $materialIndex`; - optionMenu -label "" -width 110 -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -changeCommand ("LumberyardSetMaterialPhysicalizeType " + $groupIndex + " " + $materialIndex) - (LumberyardGetMaterialItemPhysicalizeOptionMenu($groupIndex, $materialIndex)); - { - string $enumString = `LumberyardExportGetMaterialPhysicalizeEnumString`; - string $tokens[]; - $numTokens = `tokenize $enumString ":" $tokens`; - for ($i = 0; $i < $numTokens; $i++) - { - menuItem -label $tokens[$i]; - } - LumberyardUpdateMaterialTreeViewItemPhysicalizeType $groupIndex $materialIndex; - } - button -label "X" -backgroundColor 0 0 0 -height 20 -command("LumberyardToolRemoveMaterial " + $groupIndex + " " + $materialIndex); - } - - scriptJob -replacePrevious -nodeDeleted $item "LumberyardToolUpdateMaterialTreeView" -parent $rowFullName; - - return $rowFullName; -} - -//! Create instruction texts for Material export list and add it -global proc LumberyardToolAddMaterialInstructionTexts() -{ - global int $g_instructionRowSpace; - - setParent LUMBERYARDTOOL_MATERIAL_TREEVIEW; - rowColumnLayout -numberOfRows 2 -rowOffset 1 "top" 70 -columnOffset 1 "both" 62 -rowSpacing 2 $g_instructionRowSpace; - text -label "Select a mesh or material and click `Add Material`"; - text -label "or create a new material group by clicking `Add Group`"; -} - -//! Check if the materials added to the group contain Maya default material "lambert1". Inform user if found and remove it from the list. -/*! - /param $group Name of material group - /param $materials Materials added to the group -*/ -global proc string[] LumberyardToolCheckDefaultMaterial(string $materials[]) -{ - string $filteredMaterials[]; - int $messageShown = false; - for ($material in $materials) - { - if ($material == "lambert1") - { - if (!$messageShown) - { - string $message = "The Maya default material lambert1 cannot be added, please create a new " + - "material in the Hypershade and assign it to the meshes/faces that use lambert1."; - confirmDialog -title "Error occurred in adding materials to material group" - -message $message -button "OK" -defaultButton "OK" -cancelButton "OK"; - $messageShown = true; - } - } - else - { - $filteredMaterials[`size $filteredMaterials`] = $material; - } - } - return $filteredMaterials; -} - -//! Create a new material group and add selected materials, if any. -global proc LumberyardToolAddNewMaterialGroup() -{ - LumberyardToolAddMaterials( false ); -} - -//! Create a new material group and add selected materials, if any. -global proc LumberyardToolAddMaterials( int $useExistingGroups) -{ - string $materials[] = `LumberyardMaterialGatherMaterialsFromGeom`; - int $createEmptySet = (`size($materials)` == 0); - //Remove Lambert shaders - $materials = `LumberyardToolCheckDefaultMaterial $materials`; - - //if the group contained only the default material, do not create the group. - if (`size ($materials)` == 0 && !$createEmptySet ) - { - return; - } - - string $destinationGroup = ""; - - if ($useExistingGroups) - { - string $existingGroups[]; - LumberyardMaterialCollectExistingGroupsThatContain $existingGroups $materials; - //find existing groups that are involved and combine them. - //If no existing groups are involved then destinationGroup will be "". - $destinationGroup = `LumberyardMaterialConsolidateGroups $existingGroups`; - } - - if ($destinationGroup == "") - { - // make a new group - string $groupName = "new_matGroup"; - if (`size($materials)` > 0) - { - $groupName = $materials[0] + "_matGroup"; - } - $destinationGroup = `LumberyardMaterialCreateGroup $groupName`; - } - - //At this point the materials have not been added, only existing groups have been combined if expected - //materials that are currently not in the group will be added. - LumberyardAddMaterialPhysicalizeTypes $materials; - LumberyardMaterialAssignToPartitionGroup($materials, $destinationGroup); - select -clear; - //if user decided not to move materials and group ends up empty - if ((`sets -query -size $destinationGroup` == 0) && !$createEmptySet ) - { - cryMaterialDeleteGroup $destinationGroup; - return; - } - - LumberyardToolUpdateMaterialTreeView; -} - -//! Create a new material under a specific material group. -/*! - /param $groupIndex The index of the material group that the material will add to. -*/ -global proc LumberyardToolAddNewMaterial(int $groupIndex) -{ - string $groupName = `LumberyardToolGetMaterialGroupItemNameValue $groupIndex`; - string $materials[] = `LumberyardMaterialGatherMaterialsFromGeom`; - select -clear; - $materials = `LumberyardToolCheckDefaultMaterial $materials`; - LumberyardAddMaterialPhysicalizeTypes $materials; - LumberyardMaterialAssignToPartitionGroup($materials, $groupName); - LumberyardToolUpdateMaterialTreeView; -} - -//! Remove a specific material group. -/*! - /param $groupIndex The material group index. -*/ -global proc LumberyardToolRemoveMaterialGroup(int $groupIndex) -{ - string $group = `LumberyardToolGetMaterialGroupItemNameValue $groupIndex`; - string $materials[] = `cryMaterialGetGroupShaders $group`; - LumberyardRemoveMaterialPhysicalizeTypes $materials; - cryMaterialDeleteGroup $group; - LumberyardToolRemoveMaterialGroupExportSelection($groupIndex); - LumberyardToolUpdateMaterialTreeView; -} - -//! Remove a material from a material group. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -global proc LumberyardToolRemoveMaterial(int $groupIndex, int $materialIndex) -{ - string $group = `LumberyardToolGetMaterialGroupItemNameValue $groupIndex`; - string $materials[]; - $materials[0] = `LumberyardToolGetMaterialItemNameValue $groupIndex $materialIndex`; - LumberyardRemoveMaterialPhysicalizeTypes $materials; - cryMaterialRemoveShadersFromGroup $group $materials; - LumberyardToolUpdateMaterialTreeView; -} - -//! Get the material group name from its index. -/*! - /param $groupIndex The material group index. -*/ -global proc string LumberyardToolGetMaterialGroupNameFromItemId(int $groupIndex) -{ - string $partitionName = `cryMaterialGetPartitionName`; - if(`objExists $partitionName`) - { - string $materialGroups[]; - $materialGroups = `partition -query $partitionName`; - if ($groupIndex < `size($materialGroups)`) - { - return $materialGroups[$groupIndex]; - } - } - return ""; -} - -//! Get the material name from its group index and its index within the group. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The material index within the group. -*/ -global proc string LumberyardToolGetMaterialNameFromItemId(int $groupIndex, int $materialIndex) -{ - string $groupName = `LumberyardToolGetMaterialGroupNameFromItemId $groupIndex`; - if ($groupName != "") - { - string $contents[] = `cryMaterialGetGroupShaders $groupName`; - if ($materialIndex < `size($contents)`) - { - return $contents[$materialIndex]; - } - } - return ""; -} - -//! Rename the material group with the value retrieved from its corresponding name textField. -/*! - /param $groupIndex The material group index. -*/ -global proc LumberyardToolSetMaterialGroupName(int $groupIndex) -{ - string $currentMaterialGroupName = `LumberyardToolGetMaterialGroupNameFromItemId $groupIndex`; - string $newMaterialGroupName = `LumberyardToolGetMaterialGroupItemNameValue $groupIndex`; - $newMaterialGroupName = `LumberyardVerifySceneObjectRequestName $newMaterialGroupName $currentMaterialGroupName`; - $currentMaterialGroupName = `rename $currentMaterialGroupName $newMaterialGroupName`; - // In case Maya adjusts the name for its own validity check (possible), update the widget to reflect the latest name. - LumberyardToolSetMaterialGroupItemNameValue $groupIndex $currentMaterialGroupName; -} - -//! Rename the material name with the new name retrieved from the name text field. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -global proc LumberyardToolSetMaterialName(int $groupIndex, int $materialIndex) -{ - string $currentMaterialName = `LumberyardToolGetMaterialNameFromItemId $groupIndex $materialIndex`; - string $newMaterialName = `LumberyardToolGetMaterialItemNameValue $groupIndex $materialIndex`; - $newMaterialName = `LumberyardVerifySceneObjectRequestName $newMaterialName $currentMaterialName`; - $currentMaterialName = `rename $currentMaterialName $newMaterialName`; - // In case Maya adjusts the name for its own validity check (possible), update the widget to reflect the latest name. - LumberyardToolSetMaterialItemNameValue $groupIndex $materialIndex $currentMaterialName; -} - -//! Utility function to determine if a material should be set to ProxyNoDraw physicalize properties by default -/*! - /param $material Name of the material to set default physicalize flags for -*/ -proc int LumberyardIsDefaultProxyNoDraw(string $material) -{ - if(`objExists $material` && `attributeExists "lumberyardPhysMaterial" $material`) - { - return true; - } - - if(`gmatch $material "*[Pp]hys*"`) - { - return true; - } - - return false; -} - -//! Add physicalize attribute to the materials. -/*! - /param $materials The materials that need to add physicalize attribute. -*/ -global proc LumberyardAddMaterialPhysicalizeTypes(string $materials[]) -{ - for ($material in $materials) - { - if (!`attributeExists "physicalise" $material`) - { - cryExportAddEnumAttribute $material "physicalise" `cryExportGetMaterialPhysicalizeEnumString`; - } - - if (LumberyardIsDefaultProxyNoDraw($material)) - { - // ProxyNoDraw = 2 - setAttr ($material + ".physicalise") 2; - } - } -} - -//! Remove physicalize attribute from the materials. -/*! - /param $materials The materials that need to remove physicalize attribute. - /note - We need to remove the physicalize attribute from material when we remove the material from a group - so that in the future, when the material is added again to a group, its physicalize attribute will - be recreated and its default value is "None". -*/ -global proc LumberyardRemoveMaterialPhysicalizeTypes(string $materials[]) -{ - for ($material in $materials) - { - if (`attributeExists "physicalise" $material`) - { - deleteAttr -attribute "physicalise" $material; - } - } -} - -//! Set the physicalize attribute of a material from optionMenu selection. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -global proc LumberyardSetMaterialPhysicalizeType(int $groupIndex, int $materialIndex) -{ - string $materialName = `LumberyardToolGetMaterialNameFromItemId $groupIndex $materialIndex`; - int $newType = (`optionMenu -query -select (LumberyardGetMaterialItemPhysicalizeOptionMenu($groupIndex, $materialIndex))` - 1); - setAttr ($materialName + ".physicalise") $newType; -} - -//! Update the optionMenu selection for the physicalize attribute of a material item. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -global proc LumberyardUpdateMaterialTreeViewItemPhysicalizeType(int $groupIndex, int $materialIndex) -{ - string $materialName = `LumberyardToolGetMaterialNameFromItemId $groupIndex $materialIndex`; - if (`attributeExists "physicalise" $materialName`) - { - int $currentType =(`getAttr ($materialName + ".physicalise")` + 1); - optionMenu -edit -select $currentType `LumberyardGetMaterialItemPhysicalizeOptionMenu $groupIndex $materialIndex`; - } -} - -// Current number of material groups. -global int $g_materialGroupItemCount = 0; - -// Current number of materials. -global int $g_materialItemCount = 0; - -// All tree view material item rows. -global string $g_materialItemRows[]; - -// Full names of all material rows. This is used for drag and drop operations. -global string $g_materialItemRowFullNames[]; - -// Text fields of all materials. -global string $g_materialItemNames[]; - -// Number of materials in each material group. -global int $g_materialInGroupNums[]; - -//! Update material tree view with the current material group settings. -global proc LumberyardToolUpdateMaterialTreeView() -{ - global int $g_materialGroupItemCount; - global int $g_materialItemCount; - global string $g_materialItemRows[]; - global string $g_materialItemRowFullNames[]; - global string $g_materialItemNames[]; - global int $g_materialInGroupNums[]; - global int $g_currentSelectedMaterialGroupId; - global string $g_addMaterialButton; - - // For updating selected item. - string $selectedItem = `LumberyardToolMaterialGetSelectedItem`; - $g_currentSelectedMaterialGroupId = -1; - LumberyardSetSelectedMaterialGlobalId -1 -1; - // - string $childItems[] = `scrollLayout -query -childArray LUMBERYARDTOOL_MATERIAL_TREEVIEW`; - for ($child in $childItems) - { - deleteUI $child; - } - - string $partitionName = `cryMaterialGetPartitionName`; - string $materialGroups[]; - if (!`objExists $partitionName`) - { - // Create a dummy set and add to new partition to avoid script warning. Remove the dummy set right after partition creation. - sets -name "dummySet1"; - partition -name $partitionName "dummySet1"; - partition -removeSet $partitionName "dummySet1"; - delete "dummySet1"; - } - $materialGroups = `partition -query $partitionName`; - $g_materialGroupItemCount = `size($materialGroups)`; - $g_materialItemCount = 0; - - if (size($materialGroups) == 0) - { - LumberyardToolAddMaterialInstructionTexts; - return; - } - - int $checkBoxStates[] = `LumberyardToolGetMaterialGroupExportSelections`; - - for ($i = 0; $i < $g_materialGroupItemCount; $i++) - { - if (`objExists $materialGroups[$i]`) - { - setParent LUMBERYARDTOOL_MATERIAL_TREEVIEW; - - LumberyardToolAddGroupItemToMaterialTreeView $materialGroups[$i] $i $checkBoxStates[$i]; - // For updating selected item. - if ($selectedItem == $materialGroups[$i]) - { - $g_currentSelectedMaterialGroupId = $i; - LumberyardToolMaterialSetHighLightRow `LumberyardToolGetMaterialGroupItemRow $g_currentSelectedMaterialGroupId`; - } - // - string $contents[] = `cryMaterialGetGroupShaders $materialGroups[$i]`; - $g_materialInGroupNums[$i] = size($contents); - for ($j = 0; $j < `size($contents)`; $j++) - { - string $materialName = `cryMaterialUIShaderNameEncode $materialGroups[$i] $contents[$j]`; - $materialName = `cryMaterialUIShaderNameDecode $materialName`; - $g_materialItemRowFullNames[$g_materialItemCount] = `LumberyardToolAddMaterialItemToMaterialTreeView $materialName $i $j`; - // For updating selected item. - $g_materialItemRows[$g_materialItemCount] = `LumberyardToolGetMateriaItemRow $i $j`; - $g_materialItemNames[$g_materialItemCount] = `LumberyardToolGetMaterialItemName $i $j`; - if ($selectedItem == $materialName) - { - LumberyardSetSelectedMaterialGlobalId $i $g_materialItemCount; - LumberyardToolMaterialSetHighLightRow $g_materialItemRows[$g_materialItemCount]; - } - // - $g_materialItemCount++; - } - } - } - - if ($g_currentSelectedMaterialGroupId == -1) - { - button -edit -enable false $g_addMaterialButton; - } -} - -//! Export checked material groups. -/*! - /param $showDialogs A flag controls whether to show a confirmation dialogue about how many files are exported. -*/ -global proc LumberyardToolExportCheckedMaterialGroups(int $showDialogs) -{ - global int $g_materialGroupItemCount; - - string $selectedGroups[]; - int $selectedId = 0; - for ($i = 0; $i < $g_materialGroupItemCount; $i++) - { - if (`checkBox -query -value (LumberyardToolGetMaterialGroupItemCheckBoxName($i))`) - { - string $selectedGroup = `LumberyardToolGetMaterialGroupItemNameValue $i`; - if (`objExists $selectedGroup`) - { - $selectedGroups[$selectedId] = $selectedGroup; - $selectedId++; - } - } - } - LumberyardToolUpdateMaterialExportPath; - string $folderPath = `cryExportGetExportSettingValue "customMaterialFilePath"`; - LumberyardExportSelectedMaterials $selectedGroups $folderPath $showDialogs; -} - -//! Set material export path. -global proc LumberyardToolUpdateMaterialExportPath() -{ - global string $g_defaultPathString; - string $folderPath = `textField -query -text LUMBERYARDTOOL_MATERIALEXPORTPATH_TEXTFIELD`; - - // For empty path, make sure UI is updated - if($folderPath == "") - { - LumberyardUtilitiesSetTextToDefaultPath("LUMBERYARDTOOL_MATERIALEXPORTPATH_TEXTFIELD"); - } - // For default path, make sure empty string is passed to data backend - else if(`gmatch $folderPath $g_defaultPathString` == 1) - { - $folderPath = ""; - } - else - { - $folderPath = `cryExportFixupPath $folderPath`; - textField -edit -text $folderPath LUMBERYARDTOOL_MATERIALEXPORTPATH_TEXTFIELD; - } - cryExportSetExportSettingValue "customMaterialFilePath" $folderPath; -} - -//! Set material export path by browsing folder. -global proc LumberyardToolSetMaterialExportPathFromFileBrowser() -{ - string $result[] = `LumberyardBrowseForPath "" "Set Material Export Path"`; - string $folderPath; - if (size($result) == 1) - { - $folderPath = `cryExportFixupPath $result[0]`; - textField -edit -text $folderPath LUMBERYARDTOOL_MATERIALEXPORTPATH_TEXTFIELD; - LumberyardToolUpdateMaterialExportPath; - } -} - -//! Get material export path from saved back-end data. -proc string LumberyardToolGetMaterialExportPath() -{ - global string $g_defaultPathString; - string $filePath = `cryExportGetExportSettingValue "customMaterialFilePath"`; - - if($filePath == "") - { - $filePath = $g_defaultPathString; - } - - return $filePath; -} - -// Selected material group index. -global int $g_currentSelectedMaterialGroupId = -1; - -// Selected material global index by considering materials from all groups. -global int $g_currentSelectedMaterialId = -1; - -// The index of the owner group of the selected material. -global int $g_currentSelectedMaterialOwnerGroupId = -1; - -//! Record the current selected material global index and the index of the material group that owns that material. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -global proc LumberyardSetSelectedMaterialGlobalId(int $groupIndex, int $materialIndex) -{ - global int $g_currentSelectedMaterialId; - global int $g_currentSelectedMaterialOwnerGroupId; - $g_currentSelectedMaterialId = $materialIndex; - $g_currentSelectedMaterialOwnerGroupId = $groupIndex; -} - -//! Highlight specific item row in material tree view. -/*! - /param $rowName Name of the item row to highlight. -*/ -global proc LumberyardToolMaterialSetHighLightRow(string $rowName) -{ - global float $g_highLightColor[]; - rowLayout -edit -backgroundColor $g_highLightColor[0] $g_highLightColor[1] $g_highLightColor[2] $rowName; -} - -//! Record the current selected material group item. -/*! - /param $groupIndex The material group index. -*/ -global proc LumberyardToolMaterialTreeViewGroupItemOnFocus(int $groupIndex) -{ - global int $g_currentSelectedMaterialGroupId; - global int $g_materialGroupItemCount; - global int $g_materialItemCount; - global string $g_materialItemRows[]; - global string $g_addMaterialButton; - - $g_currentSelectedMaterialGroupId = $groupIndex; - LumberyardSetSelectedMaterialGlobalId -1 -1; - - // Highlight selected material group item. - for ($i = 0; $i < $g_materialGroupItemCount; $i++) - { - if ($i == $groupIndex) - { - LumberyardToolMaterialSetHighLightRow `LumberyardToolGetMaterialGroupItemRow $i`; - } - else - { - rowLayout -edit -backgroundColor 0 0 0 `LumberyardToolGetMaterialGroupItemRow $i`; - } - } - for ($i = 0; $i < $g_materialItemCount; $i++) - { - rowLayout -edit -backgroundColor 0 0 0 $g_materialItemRows[$i]; - } - - button -edit -enable true $g_addMaterialButton; - LumberyardToolUpdateMaterialAdvancedOptionsFrame; -} - -//! Record the current selected material item. -/*! - /param $groupIndex The index of the material group that the material belongs to. - /param $materialIndex The index of the material within the group. -*/ -global proc LumberyardToolMaterialTreeViewMaterialItemOnFocus(int $groupIndex, int $materialIndex) -{ - global int $g_currentSelectedMaterialGroupId; - global int $g_materialGroupItemCount; - global int $g_materialItemCount; - global string $g_materialItemRows[]; - global string $g_addMaterialButton; - - $g_currentSelectedMaterialGroupId = -1; - - // Highlight selected material item. - for ($i = 0; $i < $g_materialGroupItemCount; $i++) - { - rowLayout -edit -backgroundColor 0 0 0 `LumberyardToolGetMaterialGroupItemRow $i`; - } - for ($i = 0; $i < $g_materialItemCount; $i++) - { - if ($g_materialItemRows[$i] == `LumberyardToolGetMateriaItemRow $groupIndex $materialIndex`) - { - LumberyardToolMaterialSetHighLightRow $g_materialItemRows[$i]; - LumberyardSetSelectedMaterialGlobalId $groupIndex $i; - } - else - { - rowLayout -edit -backgroundColor 0 0 0 $g_materialItemRows[$i]; - } - } - - button -edit -enable false $g_addMaterialButton; - LumberyardToolUpdateMaterialAdvancedOptionsFrame; -} - -//! Get the item name on focus from material tree view. -global proc string LumberyardToolMaterialGetSelectedItem() -{ - global int $g_currentSelectedMaterialGroupId; - global int $g_currentSelectedMaterialId; - global string $g_materialItemNames[]; - - if ($g_currentSelectedMaterialGroupId >= 0) - { - if (`textField -exists (LumberyardToolGetMaterialGroupItemName($g_currentSelectedMaterialGroupId))`) - return `LumberyardToolGetMaterialGroupItemNameValue $g_currentSelectedMaterialGroupId`; - } - else if ($g_currentSelectedMaterialId >= 0) - { - if (`textField -exists $g_materialItemNames[$g_currentSelectedMaterialId]`) - { - return `textField -query -text $g_materialItemNames[$g_currentSelectedMaterialId]`; - } - } - return ""; -} - -//! View the selected material or material group item in Hypershade panel. -global proc LumberyardToolOpenSelectedInHyperShade() -{ - global int $g_currentSelectedMaterialGroupId; - global int $g_currentSelectedMaterialId; - global string $g_materialItemNames[]; - - if ($g_currentSelectedMaterialGroupId >= 0) - { - string $currentSelectedMaterialGroupName = `LumberyardToolGetMaterialGroupItemName $g_currentSelectedMaterialGroupId`; - string $currentSelectedMaterialGroup = `textField -query -text $currentSelectedMaterialGroupName`; - select -replace -noExpand $currentSelectedMaterialGroup; - cryMaterialUIOpenHyperShader; - } - else if ($g_currentSelectedMaterialId >= 0) - { - string $currentSelectedMaterialName = $g_materialItemNames[$g_currentSelectedMaterialId]; - string $currentSelectedMaterial = `textField -query -text $currentSelectedMaterialName`; - select $currentSelectedMaterial; - cryMaterialUIOpenHyperShader; - } - else - { - confirmDialog -title "Material" -message ("No material or material group is selected.") -button "OK"; - } -} - -//! Callback function when a material item gets dragged. -/*! - /param $dragControl The material item row being dragged. - /param $x The local x coordinate of the drag material item row. - /param $y The local y coordinate of the drag material item row. - /param $mods Flag indicating whether CTRL and/or SHIFT keys are pressed. -*/ -global proc string[] materialItemDragCallback(string $dragControl, int $x, int $y, int $mods) -{ - string $ret[]; - // Simply return. - return $ret; -} - -//! Repopulate the material item list under a material group item. -/*! - /param $groupIndex the index of the material group. -*/ -global proc LumberyardMaterialUpdateMaterialItemList(int $groupIndex) -{ - string $groupItem = `LumberyardToolGetMaterialGroupItemNameValue $groupIndex`; - string $contents[] = `cryMaterialGetGroupShaders $groupItem`; - for ($i = 0; $i < size($contents); $i++) - { - string $materialName = `cryMaterialUIShaderNameEncode $groupItem $contents[$i]`; - $materialName = `cryMaterialUIShaderNameDecode $materialName`; - textField -edit -text $materialName `LumberyardToolGetMaterialItemName $groupIndex $i`; - LumberyardUpdateMaterialTreeViewItemPhysicalizeType $groupIndex $i; - } -} - -//! Callback function when a material item gets dropped. -/*! - /param $dragControl The material item row being dragged. - /param $dropControl The material item row being dropped. - /param $msgs[] User defined message type. - /param $x The local x coordinate of the drop material item row. - /param $y The local y coordinate of the drop material item row. - /param $type Type of operation: values of 1 == Move, 2 == Copy, 3 == Link. -*/ -global proc materialItemDropCallback(string $dragControl, string $dropControl, string $msgs[], int $x, int $y, int $type) -{ - global string $g_materialItemRowFullNames[]; - global string $g_materialItemNames[]; - global int $g_materialItemCount; - global int $g_materialInGroupNums[]; - global int $g_materialGroupItemCount; - global int $dragRowId = -1; - global int $dropRowId = -1; - global int $g_rowItemHeight; - - // Get the global material index for both drag and drop material items. - for ($i = 0; $i < $g_materialItemCount; $i++) - { - if ($g_materialItemRowFullNames[$i] == $dragControl) - { - $dragRowId = $i; - } - if ($g_materialItemRowFullNames[$i] == $dropControl) - { - $dropRowId = $i; - } - } - - if ($dragRowId >= 0 && $dropRowId >= 0 && $dragRowId != $dropRowId) - { - int $moveGroupId = -1; - int $sum = 0; - for ($i = 0; $i < $g_materialGroupItemCount; $i++) - { - $sum += $g_materialInGroupNums[$i]; - if ($sum > $dragRowId && $sum > $dropRowId) - { - $moveGroupId = $i; - break; - } - // If the materials corresponding to the rowLayouts are members of - // different groups, do not move the material. - else if ($sum > $dragRowId || $sum > $dropRowId) - { - break; - } - } - - if ($moveGroupId >= 0) - { - int $moveSteps = $dropRowId - $dragRowId; - if ($y < ($g_rowItemHeight / 2)) - { - if ($moveSteps > 0) - { - $moveSteps -= 1; - } - } - else - { - if ($moveSteps < 0) - { - $moveSteps += 1; - } - } - - if ($moveSteps != 0) - { - string $currentGroup = `LumberyardToolGetMaterialGroupItemNameValue $moveGroupId`; - string $currentMaterials[]; - $currentMaterials[0] = `textField -query -text $g_materialItemNames[$dragRowId]`; - - if ($moveSteps < 0) - { - while ($moveSteps < 0) - { - cryMaterialMoveShadersUp $currentGroup $currentMaterials; - $moveSteps++; - } - } - else if ($moveSteps > 0) - { - while ($moveSteps > 0) - { - cryMaterialMoveShadersDown $currentGroup $currentMaterials; - $moveSteps--; - } - } - - LumberyardMaterialUpdateMaterialItemList $moveGroupId; - } - } - } -} - -//! Add a new material under the selected material group. -global proc LumberyardAddNewMaterialToGroup() -{ - global int $g_currentSelectedMaterialGroupId; - LumberyardToolAddNewMaterial $g_currentSelectedMaterialGroupId; -} - -//! Necessary setup when the Lumberyard Tool is loaded or the scene file is changed. -global proc LumberyardMaterialOnLoad() -{ - global int $g_currentSelectedMaterialGroupId; - $g_currentSelectedMaterialGroupId = -1; - - LumberyardToolUpdateMaterialTreeView; - textField -edit -text `LumberyardToolGetMaterialExportPath` LUMBERYARDTOOL_MATERIALEXPORTPATH_TEXTFIELD; - LumberyardToolEnsureAllCorrectMaterialGroupCustomExportPath; - LumberyardToolUpdateMaterialAdvancedOptionsFrame; -} - -//! Update the material advance option frame. -global proc LumberyardToolUpdateMaterialAdvancedOptionsFrame() -{ - global int $g_currentSelectedMaterialGroupId; - - if ($g_currentSelectedMaterialGroupId != -1) - { - // Display the custom export path of the selected material group item. - string $customFilePath = `LumberyardToolGetSelectedMaterialGroupCustomExportPath`; - textField -edit -enable true -text $customFilePath LUMBERYARDTOOL_MATERIALCUSTOMPATH_TEXTFIELD; - iconTextButton -edit -enable true LUMBERYARDTOOL_MATERIALCUSTOMPATH_BUTTON; - string $selectedGroup = `LumberyardToolGetMaterialGroupItemNameValue $g_currentSelectedMaterialGroupId`; - connectControl LUMBERYARDTOOL_MATERIALCUSTOMPATH_TEXTFIELD ($selectedGroup + ".customExportPath"); - } - else - { - textField -edit -enable false -text "" LUMBERYARDTOOL_MATERIALCUSTOMPATH_TEXTFIELD; - iconTextButton -edit -enable false LUMBERYARDTOOL_MATERIALCUSTOMPATH_BUTTON; - } -} - -//! Resize Lumberyard Tool window by collapsing or expanding the material frame. -/*! - \param $collapse Whether collapse or expand the material frame. -*/ -global proc LumberyardMaterialResizeWindow(int $collapse) -{ - global int $g_materialHeightDiff; - global int $g_materialAdvanceOptionHeightDiff; - int $materialHeightDiff = $g_materialHeightDiff; - if (`frameLayout -query -collapse LUMBERYARDTOOL_MATERIALADVANCEDOPTIONS_FRAME`) - { - $materialHeightDiff = $g_materialHeightDiff - $g_materialAdvanceOptionHeightDiff; - } - if ($collapse) - { - $materialHeightDiff = -$materialHeightDiff; - } - LumberyardToolResizeWindow $materialHeightDiff; -} - -//! Collapse material advance option frame. -global proc LumberyardMaterialCollapseAdvanceOptionsFrame() -{ - global int $g_materialAdvanceOptionHeightDiff; - if (!`frameLayout -query -collapse LUMBERYARDTOOL_MATERIALADVANCEDOPTIONS_FRAME`) - { - frameLayout -edit -collapse true LUMBERYARDTOOL_MATERIALADVANCEDOPTIONS_FRAME; - LumberyardToolResizeWindow (-$g_materialAdvanceOptionHeightDiff); - } -} - -// The add material button. -global string $g_addMaterialButton; - -//! Create material export main frame. -global proc LumberyardToolCreateMaterialFrame() -{ - global string $g_addMaterialButton; - global int $g_boxWidth; - global int $g_buttonSpace; - global float $g_UIColor[]; - int $buttonWidth = ($g_boxWidth - $g_buttonSpace * 2) / 3; - global int $g_materialHeightDiff; - global int $g_materialAdvanceOptionHeightDiff; - - setParent LUMBERYARDTOOL_MAIN_LAYOUT; - frameLayout -collapsable true -marginHeight 5 -marginWidth 5 -label "Material Export" - -collapseCommand ("LumberyardMaterialResizeWindow " + 1) -expandCommand ("LumberyardMaterialResizeWindow " + 0) - LUMBERYARDTOOL_MATERIAL_FRAME; - { - columnLayout -adjustableColumn true LUMBERYARDTOOL_MATERIAL_LAYOUT; - { - scrollLayout -height 200 -backgroundColor 0 0 0 -visible true LUMBERYARDTOOL_MATERIAL_TREEVIEW; - - setParent ..; - rowColumnLayout -numberOfRows 1 -width $g_boxWidth -columnSpacing 2 $g_buttonSpace; - button -label "Hypershade" -width $buttonWidth -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolOpenSelectedInHyperShade"); - button -label "Add Group" -width $buttonWidth -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolAddNewMaterialGroup"); - $g_addMaterialButton = `button -label "Add Material" -width $buttonWidth -enable false - -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] -command ("LumberyardAddNewMaterialToGroup")`; - - setParent ..; - rowColumnLayout -numberOfRows 1 -height 30 -rowOffset 1 "both" 4 -columnSpacing 3 $g_buttonSpace; - text -label "Export Path" -width 70; - textField -text `LumberyardToolGetMaterialExportPath` -width 200 -changeCommand ("LumberyardToolUpdateMaterialExportPath") - LUMBERYARDTOOL_MATERIALEXPORTPATH_TEXTFIELD; - popupMenu; - { - menuItem -label "Reset" -command ("LumberyardResetCustomString LUMBERYARDTOOL_MATERIALEXPORTPATH_TEXTFIELD"); - } - iconTextButton -image "icons/lumberyard_folder_icon.png" -width 20 -height 18 -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolSetMaterialExportPathFromFileBrowser"); - - // Create Advanced Options frame - setParent LUMBERYARDTOOL_MATERIAL_LAYOUT; - frameLayout -collapsable true -collapse false -marginHeight 5 -marginWidth 5 -label "Advanced Options" - -collapseCommand ("LumberyardToolResizeWindow " + (-$g_materialAdvanceOptionHeightDiff)) -expandCommand ("LumberyardToolResizeWindow " + $g_materialAdvanceOptionHeightDiff) - LUMBERYARDTOOL_MATERIALADVANCEDOPTIONS_FRAME; - rowColumnLayout -numberOfRows 1 -height 30 -rowOffset 1 "both" 4 -columnSpacing 3 $g_buttonSpace; - text -label "Custom Path" -width 70; - textField -width 190 -text `LumberyardToolGetSelectedMaterialGroupCustomExportPath` - -changeCommand ("LumberyardToolSetMaterialGroupCustomExportPathFromTextField") - LUMBERYARDTOOL_MATERIALCUSTOMPATH_TEXTFIELD; - iconTextButton -image "icons/lumberyard_folder_icon.png" -width 20 -height 18 -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolSetMaterialGroupCustomExportPathFromBrowser") - LUMBERYARDTOOL_MATERIALCUSTOMPATH_BUTTON; - LumberyardToolUpdateMaterialAdvancedOptionsFrame; - - setParent LUMBERYARDTOOL_MATERIAL_LAYOUT; - button -label "Export Materials" -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolExportCheckedMaterialGroups 1") LUMBERYARDTOOL_EXPORTMATERIAL_BUTTON; - } - } - - LumberyardMaterialOnLoad; - - scriptJob -event "NewSceneOpened" "LumberyardMaterialOnLoad" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - scriptJob -event "PostSceneRead" "LumberyardMaterialOnLoad" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - scriptJob -event "NameChanged" "LumberyardToolUpdateMaterialTreeView" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; -} diff --git a/Tools/maya/script/LumberyardProxyTool.py b/Tools/maya/script/LumberyardProxyTool.py deleted file mode 100755 index 574f1ab1b9..0000000000 --- a/Tools/maya/script/LumberyardProxyTool.py +++ /dev/null @@ -1,445 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -from maya import cmds -import math -import maya.mel - -#defines the shape labels -g_shapeTypes = ['box', 'capsule', 'sphere'] -g_materialNames = ['mat_proxy_phys', 'no material'] -g_boxIndex = 0 -g_capsuleIndex = 1 -g_sphereIndex = 2 - -g_orientTypes = ['x', 'y', 'z', 'xCenter', 'yCenter', 'zCenter'] -g_defaultOrientTypeIndex = 0 -g_xIndex = 0 -g_yIndex = 1 -g_zIndex = 2 -g_xCenterIndex = 3 -g_yCenterIndex = 4 -g_zCenterIndex = 5 -g_centerString = 'Center' - -########## -##The colors that will be used in the editor -########## -g_UIColor = [0.165, 0.165, 0.165] - -g_defaultMaterialColor = [0, 1, 0] - -########## -##Width and height definitions for ui elements -########## -g_uiProxyWidthColumnWidth = 30 -g_controlHeight = 22 -g_listboxHeight = 35 -g_buttonSpace = 4 -g_rowItemHeight = 22 - -g_uiShapePulldownColumnWidth = 75 -g_uiOrientPulldownColumnWidth = 50 -g_uiMaterialNamePulldownWidth = 120 -g_uiMaterialFieldColumnWidth = 125 -g_scrollBarPadding = 36 - -g_buttonMarginPadding = 10 -g_marginWidth = 5 -g_boxWidth = 400 - -g_uiColumnWidth = [g_uiProxyWidthColumnWidth, g_uiShapePulldownColumnWidth, g_uiOrientPulldownColumnWidth, g_uiMaterialFieldColumnWidth] - - -#TODO: make width/height dynamic -g_windowHeight = 120 -g_windowWidth = 318 - -#default name of display layer where proxies will reside -g_nameOfDisplayLayer = 'lyr_lumberyard_phys' - -#postfix of the physics proxy -g_physPostfix = '_phys'; - -#the default width of proxies -g_proxyShapeDefaultWidth = 10 - -#estimating that the proxy width is 1/10th of the hip height -g_proxyWidthRatioToHeight = 0.1 - -class ProxyObject(object): - - ##This class represents both the variables and the ui of the proxy editor - def __init__(self) : - - #defines the ui of the width text field - self.uiTextFieldWidth = '' - - #defines the value of the width and depth - self.width = g_proxyShapeDefaultWidth - - #defines the ui of the shape drop down ui - self.menuDropDownShape = '' - - #defines this proxy's shape - self.shape = g_shapeTypes[g_boxIndex] - - #defines this proxies material name - self.proxyMaterialName = '' - - #defines the ui used to modify orientation - self.menuDropDownOrient = '' - - #defines the orientation of the proxy - self.objectOrient = g_orientTypes[g_defaultOrientTypeIndex] - - self.menuDropDownMaterialName = '' - -proxyCreationSettings = ProxyObject() - - -def LumberyardProxyTool(): - ##Create the main window. If it exists, delete it, and then create it - if cmds.window('LUMBERYARDTOOL_PROXY_WINDOW', exists=True): - cmds.deleteUI('LUMBERYARDTOOL_PROXY_WINDOW') - - LumberyardProxyToolUI() - -def LumberyardProxyToolUI(): - ##This script defines the window or primary canvas of the ui. - lumberyardProxyWindow = cmds.window('LUMBERYARDTOOL_PROXY_WINDOW', title = "Proxy Tool (Experimental)", sizeable = False, iconName = 'Proxy Tool', widthHeight = (g_windowWidth, g_windowHeight)) - LumberyardToolCreateProxyFrameMain() - cmds.showWindow(lumberyardProxyWindow) - cmds.window(lumberyardProxyWindow, edit = True, widthHeight = (g_windowWidth, g_windowHeight)) - -def LumberyardToolCreateProxyFrameMain(): - ##When the window is first open this is what the user will see - cmds.columnLayout('LUMBERYARDTOOL_PROXY_LAYOUT', adjustableColumn = True) - - cmds.text(height = g_controlHeight, enable = True, font = 'tinyBoldLabelFont', align = 'center', width = g_uiProxyWidthColumnWidth+3, label = 'Select joints and click "Create Proxies"', backgroundColor = g_UIColor) - - cmds.setParent('LUMBERYARDTOOL_PROXY_WINDOW') - - cmds.rowLayout(numberOfColumns = 4, columnWidth4 = g_uiColumnWidth, backgroundColor = g_UIColor) - - #title labels for all the variable categories that we'll have control over - cmds.text(height = g_controlHeight, enable = True, font = 'tinyBoldLabelFont', align = 'left', width = g_uiProxyWidthColumnWidth+3, label = 'width', backgroundColor = g_UIColor) - cmds.text(height = g_controlHeight, enable = True, font = 'tinyBoldLabelFont', align = 'left', width = g_uiShapePulldownColumnWidth, label = 'shape', backgroundColor = g_UIColor) - cmds.text(height = g_controlHeight, enable = True, font = 'tinyBoldLabelFont', align = 'left', width = g_uiOrientPulldownColumnWidth+25, label = 'orient', backgroundColor = g_UIColor) - cmds.text(height = g_controlHeight, enable = True, font = 'tinyBoldLabelFont', align = 'left', width = g_uiMaterialFieldColumnWidth + g_marginWidth, label = 'material name', backgroundColor = g_UIColor) - - ##This is the editable area of the ui that will be populated by our variables. In the beginning it is unpopulated but has instruction on what to do - cmds.setParent('LUMBERYARDTOOL_PROXY_LAYOUT') - cmds.scrollLayout ('LUMBERYARDTOOL_PROXY_LISTBOX', height = g_listboxHeight, width = g_boxWidth , backgroundColor = [0, 0, 0], visible = True) - - cmds.setParent('LUMBERYARDTOOL_PROXY_LISTBOX') - - #create a row - cmds.rowLayout(numberOfColumns = 4, columnWidth4 = g_uiColumnWidth) - - #create the width ui - LumberyardCreateWidthTextField() - - #create the shape ui - LumberyardCreateShapePullDown() - - #create the orient ui - LumberyardCreateOrientPullDown() - - LumberyardCreateMaterialPullDown() - - #create the ui underneath the editable variables window. This is the canvas for our create button - cmds.setParent('LUMBERYARDTOOL_PROXY_LAYOUT') - cmds.setParent('..') - cmds.rowColumnLayout(numberOfRows = 1, width = g_boxWidth , columnSpacing = [1, g_buttonSpace]) - cmds.button(label = 'Create Proxies', width = g_windowWidth-4, command = LumberyardCreateProxies, backgroundColor = g_UIColor) - -def LumberyardCreateWidthTextField(): - ##This function creates the ui element that defines the width and depth of the proxy - - #get the width of the proxy from the class - uiTextFieldProxyWidthValue = g_proxyShapeDefaultWidth - - #create the ui text field - proxyCreationSettings.uiTextFieldWidth = cmds.textField(width = g_uiProxyWidthColumnWidth , backgroundColor = g_UIColor, text = uiTextFieldProxyWidthValue) - - #add a command that will add functionality when the textfield is changed - cmds.textField(proxyCreationSettings.uiTextFieldWidth, edit = True, changeCommand = lambda *args: LumberyardChangeProxyWidth(cmds.textField(proxyCreationSettings.uiTextFieldWidth, query = True, text = True))) - - LumberyardChangeProxyWidth(g_uiProxyWidthColumnWidth) - -def LumberyardChangeProxyWidth(widthInput): - ##This function is run when the width text field is updated - - #get current width - currentWidth = proxyCreationSettings.width - - #determine if this entry is a float - if LumberyardFloatConfirm(widthInput) == True: - - if float(widthInput) > 0: - #if the entry is a float and greater than zero, update the class with the new width - proxyCreationSettings.width = widthInput - - else: - #zero or negative floats are not a valid width value, so revert to previous value - cmds.textField(proxyCreationSettings.uiTextFieldWidth, edit = True, text = currentWidth) - - else: - #if the entry is not a float, revert it to its previous value - cmds.textField(proxyCreationSettings.uiTextFieldWidth, edit = True, text = currentWidth) - -def LumberyardCreateOrientPullDown(): - ##This function creates the ui pulldown for orientation - - #create the ui pulldown - orientOptionPullDown = cmds.optionMenu(label = '', width = g_uiShapePulldownColumnWidth, backgroundColor = g_UIColor, changeCommand = lambda *args: LumberyardProxySetOrientType()) - - #add it to the class - proxyCreationSettings.menuDropDownOrient = orientOptionPullDown - - #populate the pulldown with the predefined orient types - for orient in g_orientTypes: - cmds.menuItem('button_' + orient, label = orient) - - LumberyardProxySetOrientType() - -def LumberyardProxySetOrientType(): - ##This function is launched when the orient value is changed in the editor - - #get the new value from the menu - orientString = (cmds.optionMenu(proxyCreationSettings.menuDropDownOrient, query = True, value = True)) - - #store the new value in the class - proxyCreationSettings.objectOrient = orientString - -def LumberyardCreateShapePullDown(): - ##This function creates the ui pulldown for shape types in the editor - - #create the ui pulldown - shapeOptionPullDown = cmds.optionMenu(label = '', width = g_uiShapePulldownColumnWidth, backgroundColor = g_UIColor,changeCommand = lambda *args: LumberyardProxySetShapeType()) - - #add it to the class - proxyCreationSettings.menuDropDownShape = shapeOptionPullDown - - #populate the pulldown with the predefined shape types - for shapeType in g_shapeTypes: - cmds.menuItem('button_' + shapeType, label = shapeType) - - LumberyardProxySetShapeType() - -def LumberyardCreateMaterialPullDown(): - ##This function creates the ui pulldown for material name - - #create the ui pulldown - materialOptionPullDown = cmds.optionMenu(label = '', width = g_uiMaterialFieldColumnWidth, backgroundColor = g_UIColor, changeCommand = lambda *args: LumberyardProxySetMaterialName()) - - #add it to the class - proxyCreationSettings.menuDropDownMaterialName = materialOptionPullDown - - #populate the pulldown with the predefined materialName types - for materialName in g_materialNames : - cmds.menuItem('button_' + materialName, label = materialName) - - LumberyardProxySetMaterialName() - -def LumberyardProxySetMaterialName(): - - materialNameString = (cmds.optionMenu(proxyCreationSettings.menuDropDownMaterialName, query = True, value = True)) - - proxyCreationSettings.proxyMaterialName = materialNameString - -def LumberyardProxySetShapeType(): - ##This function is launched when the shape value is changed in the editor - - #get the new value from the menu - shapeString = (cmds.optionMenu(proxyCreationSettings.menuDropDownShape, query = True, value = True)) - - #store the new value in the class - proxyCreationSettings.shape = shapeString - -def LumberyardAddMaterialToProxy(inputProxy): - ##This function adds a material to a proxy shape object - - #get the material name from the class - thisMaterialName = proxyCreationSettings.proxyMaterialName - - #get the shading group - shadingGroup = thisMaterialName + 'SG' - - #variable that defines the shader - shader = '' - - #if the material does not exist, create a shader group that supports it - if cmds.objExists(thisMaterialName) == False: - shader = cmds.shadingNode('phong', asShader = True, name = thisMaterialName) - #add attribute that will define this proxy material - cmds.addAttr(shader, longName = 'lumberyardPhysMaterial', defaultValue = 1) - shadingGroup = cmds.sets(renderable = True, noSurfaceShader = True, empty = True, name = shadingGroup) - cmds.connectAttr(shader +'.outColor', shadingGroup + '.surfaceShader') - cmds.setAttr(shader + '.color', g_defaultMaterialColor[0], g_defaultMaterialColor[1], g_defaultMaterialColor[2], type = 'double3') - else: - shader = 'thisMaterialName' - #apply the shading group to the proxy object - cmds.sets(inputProxy[0], edit = True, forceElement = shadingGroup ) - -def CreateProxyPositionFromChildren(jointNode): - #get the children. the joint's children define the length of the proxy - jointChildren = cmds.listRelatives(jointNode, children = True, path = True, type = 'joint') - - #get the joint node's position in world space - jointStartPosition = cmds.xform(jointNode, query = True, worldSpace = True, translation = True) - - #get the average joint position for all of the child joints this will determine the proxy's length - sumOfJointPositionX = 0.0 - sumOfJointPositionY = 0.0 - sumOfJointPositionZ = 0.0 - proxyPositionX = jointStartPosition[0] - proxyPositionY = jointStartPosition[1] - proxyPositionZ = jointStartPosition[2] - - #if a joint has children, find out the length of the average child joints - if (jointChildren): - for jointChild in jointChildren: - jointPositionWorldSpace = cmds.xform( jointChild, query = True, worldSpace = True, translation = True) - sumOfJointPositionX = sumOfJointPositionX + jointPositionWorldSpace[0] - sumOfJointPositionY = sumOfJointPositionY + jointPositionWorldSpace[1] - sumOfJointPositionZ = sumOfJointPositionZ + jointPositionWorldSpace[2] - averageJointPositionX = sumOfJointPositionX / len(jointChildren) - averageJointPositionY = sumOfJointPositionY / len(jointChildren) - averageJointPositionZ = sumOfJointPositionZ / len(jointChildren) - #move to the midpoint of joint and averaged child joints - proxyPositionX = ((averageJointPositionX + jointStartPosition[0])/2) - proxyPositionY = ((averageJointPositionY + jointStartPosition[1])/2) - proxyPositionZ = ((averageJointPositionZ + jointStartPosition[2])/2) - - proxyPosition = [proxyPositionX, proxyPositionY, proxyPositionZ] - return proxyPosition - -def LumberyardCreateProxies(*args): - ##This function creates the proxy objects and parents them to joints - - #create display layers for proxy's visibility to easily be toggled - LumberyardCreateProxyLayer() - - #variable for the display layer - layerPhys = g_nameOfDisplayLayer - - #make a list of all of the selected objects - selectedObjects = cmds.ls(selection = True) - - #if nothing is selected throw a warning - if (len(selectedObjects) == 0): - cmds.warning('No joints selected. Select Joints and press the Add Joints button.') - - else: - for selectedObject in selectedObjects: - - if cmds.objectType(selectedObject, isType = 'joint' ) == True: - - shapeOfProxy = proxyCreationSettings.shape - - #get the joint node's position in world space - jointStartPosition = cmds.xform(selectedObject, query = True, worldSpace = True, translation = True) - proxyPosition = jointStartPosition - proxyWidth = float(proxyCreationSettings.width) - proxyLength = proxyWidth - - if (g_centerString in proxyCreationSettings.objectOrient) == False: - - proxyPosition = CreateProxyPositionFromChildren(selectedObject) - - #find out the length of the average child joints - distanceBetweenPoints = math.sqrt(math.pow((jointStartPosition[0] - proxyPosition[0]), 2) + math.pow((jointStartPosition[1] - proxyPosition[1]) ,2) + math.pow((jointStartPosition[2] - proxyPosition[2]), 2)) - proxyLength = distanceBetweenPoints * 2 - - #create the proxy shape - if (shapeOfProxy == g_shapeTypes[g_boxIndex]): - proxyShape = cmds.polyCube(height = proxyLength, width = proxyWidth, depth = proxyWidth, createUVs = 1,constructionHistory = True) - else: - proxyRadius = proxyWidth/2 - if (shapeOfProxy == g_shapeTypes[g_capsuleIndex]): - if (proxyLength > proxyWidth): - proxyShape = cmds.polyCylinder(radius = proxyRadius, height = proxyLength - (proxyRadius *2), roundCap = True, subdivisionsCaps = 3) - else: - proxyShape = cmds.polySphere(radius = proxyRadius * 2, subdivisionsAxis = 16, subdivisionsHeight = 16) - else: - proxyShape = cmds.polySphere(radius = proxyRadius * 2, subdivisionsAxis = 16, subdivisionsHeight = 16) - - #add object to the phys display layer - cmds.editDisplayLayerMembers( layerPhys, proxyShape[0]) - - #add an attribute to easily find our created proxy - cmds.addAttr(proxyShape, longName = 'lumberyardPhysProxy', defaultValue = 1) - - #add material to proxy - if (proxyCreationSettings.proxyMaterialName != 'no material'): - - LumberyardAddMaterialToProxy(proxyShape) - - #add orientation to proxy - LumberyardOrientProxy(proxyShape[0]) - - #move proxy into place - cmds.move(proxyPosition[0], proxyPosition[1], proxyPosition[2], proxyShape, worldSpace = True) - - #orient the proxy so its aiming toward the parent joint. can we do this with vector math instead? - aimConsProxy = cmds.aimConstraint(selectedObject, proxyShape) - cmds.delete(aimConsProxy) - orientConsProxy = cmds.orientConstraint(selectedObject, proxyShape, skip = 'none') - cmds.delete(orientConsProxy) - - #if the orient pulldown defines this as a center, center its orient on the joint. - if (g_centerString in proxyCreationSettings.objectOrient): - cmds.move(jointStartPosition[0], jointStartPosition[1],jointStartPosition[2], proxyShape[0], worldSpace = True) - else: - cmds.move(jointStartPosition[0], jointStartPosition[1], jointStartPosition[2], proxyShape[0] + ".scalePivot", proxyShape[0] + ".rotatePivot", worldSpace = True) - - #parent it to the joint - cmds.parent(proxyShape[0], selectedObject) - - #freeze the proxy. this will zero out its translate values relative to its parent joint - cmds.makeIdentity(proxyShape[0], apply = True, scale = 1, rotate = 1, translate = 1, normal = 0) - - #delete construction history - cmds.delete(proxyShape[0],constructionHistory=True) - - #rename the proxy with the proper name - cmds.rename(proxyShape[0], selectedObject + g_physPostfix) - else: - cmds.warning(selectedObject + " is not a joint. No proxy created.") - -def LumberyardOrientProxy(proxyObjectInput): - ##This function orients the proxy based on the settings in the editor ui - - if proxyCreationSettings.objectOrient == g_orientTypes[g_xIndex] or proxyCreationSettings.objectOrient == g_orientTypes[g_xCenterIndex]: - cmds.xform(proxyObjectInput, rotateAxis = [0, 90, 90]) - - if proxyCreationSettings.objectOrient == g_orientTypes[g_yIndex] or proxyCreationSettings.objectOrient == g_orientTypes[g_yCenterIndex]: - cmds.xform(proxyObjectInput, rotateAxis = [0, 0, 0]) - - if proxyCreationSettings.objectOrient == g_orientTypes[g_zIndex] or proxyCreationSettings.objectOrient == g_orientTypes[g_zCenterIndex]: - cmds.xform(proxyObjectInput, rotateAxis = [90, 0, 0]) - -def LumberyardCreateProxyLayer(): - ##This function creates a layer for our proxy objects so visibility may be easily toggled - #if there is not already a display layer for the proxies, create one - if cmds.objExists(g_nameOfDisplayLayer) == False: - cmds.createDisplayLayer(name = g_nameOfDisplayLayer) - -def LumberyardFloatConfirm(inputString): - ##This function checks to see if the entered string is a float value and returns true or false - try: - float(inputString) - except ValueError: - return False - else: - return True - \ No newline at end of file diff --git a/Tools/maya/script/LumberyardTool.mel b/Tools/maya/script/LumberyardTool.mel deleted file mode 100644 index 4613a1ab59..0000000000 --- a/Tools/maya/script/LumberyardTool.mel +++ /dev/null @@ -1,363 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -///////////////////////////////////////////////////////////////////////////////// -// -// LYExport.mel -// -// UI code for improved Maya exporter -// -// Description: this file contains code for creating the new improved Maya exporter (called -// as "Lumberyard Tools" with primarily the UI change, plus some underlying functional change), -// reference link: https://wiki.labcollab.net/confluence/display/lmbr/Improved+Maya+Exporter -// The new Maya exporter consolidates the massive windows existed in the original CryTek -// exporter into a unified one. It will improve the efficiency of artist workflow of -// exporting asserts from Maya. This file is still under development in parallel with the -// CryTek exporter (allow co-exist), and will eventually replace the current CryTek exporter as a -// last step. -// -///////////////////////////////////////////////////////////////////////////////// - -LumberyardToolLoadDependencies(); - -//! Load dependencies for using their global functions -/*! - \todo Add LumberyardValidator to script dependencies if it is added to the window controls -*/ -global proc LumberyardToolLoadDependencies() -{ - eval("source cryValidate.mel"); - eval("source cryAnim.mel"); - eval("source cryMaterial.mel"); - eval("source cryExport.mel"); - eval("source cryTools.mel"); - eval("source cryUDP.mel"); - eval("source degraded_faces_check.mel"); - eval("source cryPivot.mel"); - eval("source cryAlembic.mel"); - if( !`cryPluginIsLoaded` ) - { - cryLoadPluginQuiet; - } - - eval("source LumberyardUIStyle.mel"); - eval("source LumberyardUtilities.mel"); - eval("source LumberyardAnimationPane.mel"); - eval("source LumberyardGeometry.mel"); - eval("source LumberyardMaterial.mel"); - //eval("source LumberyardValidator.mel"); -} - -//! Utility function to call cryPivotRun function with the correct parameters -global proc LumberyardToolOriginToPivot() -{ - int $centerPivots = `menuItem -query -checkBox LUMBERYARD_CENTER_PIVOTS_CHECKBOX`; - cryPivotRun($centerPivots); -} - -//! Creates the top menu bar for the Lumberyard Tools window -/*! - \param $versionString The version of the plugin mll (used in the Help toolbar menu to display version number) - \todo - Determine whether Output Attachment Helpers functionality is still valid, - and reactivate if it is. -*/ -proc LumberyardToolCreateToolMenuBar(string $versionString) -{ - menuBarLayout; - // Tools Menu - string $toolsMenu = `menu -label "Tools" LUMBERYARD_TOOLS_MENU`; - - // temporarily remove Auto Add Geometry related to LMBR-13573 - /* - menuItem -label "Auto Add Geometry" -subMenu true; - { - menuItem -label "Execute" -enable true -command ("LumberyardAutoAddAll"); - menuItem -divider true; - menuItem -label "Include materials" -checkBox true -enable true autoAddMaterialsCheckbox; - setParent -menu $toolsMenu; - } - menuItem -divider true; - */ - menuItem -label "Add Scene Root" -command ("LumberyardUtilitiesAddSceneRoot"); - menuItem -label "Move Origin to Pivot" -subMenu true; - { - menuItem -label "Execute" -command ("LumberyardToolOriginToPivot"); - menuItem -divider true; - menuItem -label "Center Pivots" -checkBox false LUMBERYARD_CENTER_PIVOTS_CHECKBOX; - setParent -menu $toolsMenu; - } - menuItem -label "Zero Joint Rotations" -command ("cryAnimZeroJointRotation"); - //menuItem -label "Output Attachment Helpers" -command ("cryOutputAttachmentHelpers"); - menuItem -divider true; - menuItem -label "Add Attributes" -command ("cryExportAddAttributes"); - menuItem -label "User Defined Properties..." -command ("cryUDPWindow"); - menuItem -divider true; - menuItem -label "Polygon Check" -command ("cryCheckFaces"); - menuItem -divider true; - menuItem -label "Prepare Alembic materials" -command ("cryAlembic_prepareMaterials"); - menuItem -label "Export Selected to Alembic..." -command ("cryAlembic_export"); - menuItem -divider true; - menuItem -label "Joint Proxy Editor (Experimental)..." -command ("LumberyardStartJointProxyEditor"); - menuItem -divider true; - menuItem -label "Validator..." -command ("cryValidateComplete"); - - // Options Menu - menu -label "Options"; - menuItem -label "Remove Name Spaces" -checkBox false -enable true - -command ("LumberyardToolSetRemoveNamespaces") LUMBERYARD_REMOVE_NAMESPACES_CHECKBOX; - - // Help Menu - menu -label "Help" -helpMenu true; - menuItem -label "Online Documentation" -enable true - -command ("LumberyardToolSetOpenHelp"); - - LumberyardToolLoadMenuCheckBoxValues; - setParent ..; - - scriptJob -event "NewSceneOpened" "LumberyardToolHandleSceneChange" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - scriptJob -event "PostSceneRead" "LumberyardToolHandleSceneChange" -parent "LUMBERYARDTOOL_MAIN_LAYOUT"; - -} - -//! Utility function to call LumberyardAutoDetectGeometry with the correct parameters -global proc LumberyardAutoAddAll() -{ - int $includeMaterial = `menuItem -query -checkBox autoAddMaterialsCheckbox`; - LumberyardAutoDetectGeometry $includeMaterial; -} - -global proc LumberyardStartJointProxyEditor() -{ - //reload() call is used during development so that the python gets recompiled each time it is opened - python ("import LumberyardProxyTool; reload(LumberyardProxyTool); LumberyardProxyTool.LumberyardProxyTool()"); -} - -//! Update Remove Namespaces option value in back-end data with checkBox value. -global proc LumberyardToolSetRemoveNamespaces() -{ - int $removeNamespaces = `menuItem -query -checkBox LUMBERYARD_REMOVE_NAMESPACES_CHECKBOX`; - cryExportSetExportSettingValue "removeNamespaces" $removeNamespaces; -} - -//! Open up the online documentation website at the maya tools section -global proc LumberyardToolSetOpenHelp() -{ - launch -webPage "https://docs.aws.amazon.com/console/lumberyard/userguide/lumberyard-maya-tools"; -} - -//! Find old style export settings node and show dialog to confirm upgrade. -global proc int LumberyardToolFindAndUpgradeOldStyleExportSettingsNode() -{ - if (`objExists CRYEXPORTSETTINGS`) - { - string $dialogMessage = "Detected old export SETTINGS data. Do you wish to upgrade " + - "to the new tool format? (This operation will remove old data)"; - if(`confirmDialog -title "Lumberyard Exporter" -message $dialogMessage - -button "Yes" -button "No" -defaultButton "Yes" - -cancelButton "No" -dismissString "No"` == "No") - { - return false; - } - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - //there is potential for the new settings node to be generated first by other event handlers - //before this code is run to update so delete the new one. - //If the CRYEXPORTSETTINGS is there then the newly generated settings has no information in it - if (`objExists $exportSettingsNode`) - { - delete $exportSettingsNode; - } - if( !`objExists LUMBERYARD_EXPORT_GROUP` ) - { - // Create LUMBERYARD_EXPORT_GROUP - group -empty -name LUMBERYARD_EXPORT_GROUP; - } - rename CRYEXPORTSETTINGS $exportSettingsNode; - parent ($exportSettingsNode, "LUMBERYARD_EXPORT_GROUP"); - } - return true; -} - -//! Find old style export settings node and show dialog to confirm upgrade. -global proc int LumberyardToolFindAndUpgradeOldStyleExportAnimationNode() -{ - if (`objExists "LUMBERYARD_ANIMATIONEXPORT_GROUP"` ) - { - string $parents[] = `listRelatives -parent "LUMBERYARD_ANIMATIONEXPORT_GROUP"`; - if (!stringArrayContains("LUMBERYARD_EXPORT_GROUP", $parents)) - { - string $dialogMessage = "Detected old export Animation data. Do you wish to upgrade " + - "to the new tool format? (This operation will move LUMBERYARD_ANIMATIONEXPORT_GROUP under LUMBERYARD_EXPORT_GROUP)"; - if(`confirmDialog -title "Lumberyard Exporter" -message $dialogMessage - -button "Yes" -button "No" -defaultButton "Yes" - -cancelButton "No" -dismissString "No"` == "No") - { - return false; - } - - if( !`objExists "LUMBERYARD_EXPORT_GROUP"` ) - { - //Create LUMBERYARD_EXPORT_GROUP - group -empty -name "LUMBERYARD_EXPORT_GROUP"; - } - - parent ("LUMBERYARD_ANIMATIONEXPORT_GROUP", "LUMBERYARD_EXPORT_GROUP"); - } - } - return true; -} - -global proc LumberyardToolHandleSceneChange() -{ - if (!LumberyardToolFindAndUpgradeOldStyleExportSettingsNode()) - { - // Close Lumberyard tools window if user choose not to upgrade. - if( `window -exists LUMBERYARDTOOL_MAIN_WINDOW` ) - { - deleteUI LUMBERYARDTOOL_MAIN_WINDOW; - } - return; - } - - if (!LumberyardToolFindAndUpgradeOldStyleExportAnimationNode()) - { - // Close Lumberyard tools window if user choose not to upgrade. - if( `window -exists LUMBERYARDTOOL_MAIN_WINDOW` ) - { - deleteUI LUMBERYARDTOOL_MAIN_WINDOW; - } - return; - } - LumberyardToolLoadMenuCheckBoxValues(); -} - -//! Update the menu checkBox values with saved back-end data. -global proc LumberyardToolLoadMenuCheckBoxValues() -{ - if (`cryExportGetExportSettingValue "removeNamespaces"` == "") - { - cryExportSetExportSettingValue "removeNamespaces" 1; - } - int $removeNamespaces = `LumberyardGetIntExportSetting "removeNamespaces"`; - menuItem -edit -checkBox $removeNamespaces LUMBERYARD_REMOVE_NAMESPACES_CHECKBOX; -} - -///////////////////////////////////////////////////////////////////////////////// -// -// Lumberyard Tool Main Window -// -///////////////////////////////////////////////////////////////////////////////// - -//! Utility function to call the export function for all asset types, ignoring warnings -global proc LumberyardToolExportAll() -{ - LumberyardToolExportCheckedGeometryListItems(0); - LumberyardToolExportCheckedMaterialGroups(0); - LumberyardUtilitiesExportSelectedAnimations(0); -} - -//! Resize Lumberyard Tool window with a height change -/*! - \param $heightDiff The difference of window height for change -*/ -global proc LumberyardToolResizeWindow(int $heightDiff) -{ - int $height = `window -query -height LUMBERYARDTOOL_MAIN_WINDOW` + $heightDiff; - window -edit -height $height LUMBERYARDTOOL_MAIN_WINDOW; -} - -//! Creates the main UI window for the Lumberyard Tools and call creation for all sub-elements -/*! - \todo Add validator UI to the main window once it has been hooked to the validation output -*/ -proc LumberyardToolCreateWindow() -{ - global float $g_UIColor[]; - if (!LumberyardToolFindAndUpgradeOldStyleExportSettingsNode()) - { - return; - } - - if (!LumberyardToolFindAndUpgradeOldStyleExportAnimationNode()) - { - return; - } - - int $windowExists = `window -exists LUMBERYARDTOOL_MAIN_WINDOW`; - if(!$windowExists) - { - if (!`LumberyardToolAttemptDataUpdates`) - { - return; - } - if(`windowPref -exists LUMBERYARDTOOL_MAIN_WINDOW`) - { - windowPref -topLeftCorner `windowPref -query -topEdge LUMBERYARDTOOL_MAIN_WINDOW` `windowPref -query -leftEdge LUMBERYARDTOOL_MAIN_WINDOW` LUMBERYARDTOOL_MAIN_WINDOW; - } - print("\nGetting plugin info...\n"); - string $pluginName = `cryGetPluginName`; - print("PluginName: " + $pluginName + "\n"); - string $pluginVersionString = `pluginInfo -query -version $pluginName`; - print("PluginVersion: " + $pluginVersionString + "\n"); - window -titleBar true -title "Lumberyard Tools" -sizeable true -minimizeButton false -maximizeButton false LUMBERYARDTOOL_MAIN_WINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - $collayout = `columnLayout -adjustableColumn true -rowSpacing 15 LUMBERYARDTOOL_MAIN_LAYOUT`; - - LumberyardToolCreateToolMenuBar($pluginVersionString); - - LumberyardToolCreateGeometryFrame; - - LumberyardToolCreateMaterialFrame; - - LumberyardAnimationPaneCreate; - - setParent LUMBERYARDTOOL_MAIN_LAYOUT; - button -height 44 -label "Export All" -backgroundColor $g_UIColor[0] $g_UIColor[1] $g_UIColor[2] - -command ("LumberyardToolExportAll"); - - //LumberyardToolCreateValidatorFrame; - } - showWindow LUMBERYARDTOOL_MAIN_WINDOW; - - if(!$windowExists) - { - // Collapsing Advance Options has to go after the window is shown, otherwise the - // interpreted current window size to based on will not be correct. - LumberyardGeometryCollapseAdvanceOptionsFrame; - LumberyardMaterialCollapseAdvanceOptionsFrame; - } -} - -//! Load maya plugin (.mll) file and create the main window of Lumberyard Tools if plugin loads successfully -global proc LumberyardToolWindow() -{ - string $pluginName = `cryGetPluginName`; - if( catchQuiet( `pluginInfo -query -version $pluginName` )) - { - error("Plugin `" + $pluginName + "` could not be found."); - } - - LumberyardToolLoadGeometryExportNodes; - - if( !`LumberyardToolFindAndUpgradeOldStyleExportNodes` ) - { - return; - } - - if( !`LumberyardUtilitiesUpgradeAnimationData` ) - { - return; - } - - LumberyardToolCreateWindow(); -} diff --git a/Tools/maya/script/LumberyardUIStyle.mel b/Tools/maya/script/LumberyardUIStyle.mel deleted file mode 100644 index 7ab73030fe..0000000000 --- a/Tools/maya/script/LumberyardUIStyle.mel +++ /dev/null @@ -1,58 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -///////////////////////////////////////////////////////////////////////////////// -// -// UI property values -// -///////////////////////////////////////////////////////////////////////////////// - -global int $g_boxWidth = 400; // width of display box (list box, tree view) -global int $g_rowItemHeight = 22; // row height of items in display box -global int $g_buttonSpace = 4; // space width between two buttons - -global float $g_UIColor[]; // color for UI buttons/option menus -global float $g_highLightColor[]; // highlight color of items in display box - -global string $g_warningIconName = "icons/lumberyard_warning.svg"; - -global string $g_defaultPathString = ""; - -global int $g_geometryHeightDiff = 320; // the height difference of geometry frame between collapse and expand -global int $g_advanceOptionHeightDiff = 88; // the height difference of advance option frame between collapse and expand -global int $g_materialAdvanceOptionHeightDiff = 42; // the height difference of material advance option frame between collapse and expand -global int $g_materialHeightDiff = 354; // the height difference of material frame between collapse and expand -global int $g_animationHeightDiff = 180; // the height difference of animation frame between collapse and expand -global int $g_instructionRowSpace = 10; - -//values for Geometry List display -global int $g_checkColumnWidth = 22; -global int $g_nodeNameColumnWidth = 115; -global int $g_exportNameColumnWidth = 110; -global int $g_exportTypeColumnWidth = 110; -global int $g_deleteExportColumnWidth = 15; -global int $g_listHeaderHeight = 18; - -LumberyardCalculateUIValues(); - -///////////////////////////////////////////////////////////////////////////////// -// Create UI related values -global proc LumberyardCalculateUIValues() -{ - global float $g_UIColor[]; - global float $g_UIInvalidColor[]; - global float $g_highLightColor[]; - - $g_UIColor = {0.165, 0.165, 0.165}; - $g_UIInvalidColor = {0.89, 0.49, 0.49}; - $g_highLightColor = {0.11, 0.46, 0.81}; -} \ No newline at end of file diff --git a/Tools/maya/script/LumberyardUtilities.mel b/Tools/maya/script/LumberyardUtilities.mel deleted file mode 100644 index 7d9bd9cccf..0000000000 --- a/Tools/maya/script/LumberyardUtilities.mel +++ /dev/null @@ -1,182 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -///////////////////////////////////////////////////// -// Common Utility functions for the Lumberyard Tool - -LumberyardUtilitiesLoadDependencies(); - -//! Loads the script files that this script is dependent upon -global proc LumberyardUtilitiesLoadDependencies() -{ - eval("source LumberyardUIStyle.mel"); -} - -//! Reset the file path textField to default value. -/*! - \param $controlName The name of the textFiled to reset value. -*/ -global proc LumberyardUtilitiesSetTextToDefaultPath(string $controlName) -{ - global string $g_defaultPathString; - textField -edit -text $g_defaultPathString $controlName; -} - -//! Utility script to reverse the order of the strings contained in an array -/*! - \param $array The array of strings to reverse -*/ -global proc string[] LumberyardUtilitiesReverseStringArray(string $array[]) -{ - string $reverseArray[]; - - if(size($array) > 0) - { - int $newCount = 0; - - for($i = size($array) - 1; $i >= 0; $i--) - { - $reverseArray[$newCount] = $array[$i]; - $newCount++; - } - } - - return $reverseArray; -} - -//! Adds a SceneRoot entity as a curve displaying the axes -global proc LumberyardUtilitiesAddSceneRoot() -{ - if(!`objExists "SceneRoot"`) - { - string $sceneRootCurve = `curve -degree 1 - -point 1 0 0 -point 1.049582 0 0.000590718 -point 1.010888 0 0.0685401 -point 1.033656 0 0.0685401 - -point 1.067513 0 0.0178139 -point 1.10137 0 0.0685401 -point 1.124137 0 0.0685401 - -point 1.085562 0 0.000590718 -point 1.124255 0 -0.0673587 -point 1.101487 0 -0.0673587 - -point 1.067631 0 -0.0165146 -point 1.033656 0 -0.0673587 -point 1.010888 0 -0.0673587 - -point 1.049582 0 0.000590718 -point 1 0 0 -point 0.75 0 -0.25 -point 0.75 0 -0.125 -point 0 0 -0.125 - -point -0.125 0 0 -point -0.125 0 0.125 -point -0.125 0 0.75 -point -0.25 0 0.75 -point 0 0 1 - -point 0.000344241 0 1.03654 -point -0.0436663 0 0.99124 -point -0.0723325 0 0.99124 - -point -0.0723325 0 1.104489 -point -0.0496827 0 1.104489 -point -0.0496827 0 1.015423 - -point 0.0370236 0 1.104489 -point 0.0635663 0 1.104489 -point 0.0635663 0 0.99879 - -point 0.0409165 0 0.99879 -point 0.0409165 0 1.0783 -point 0.000344241 0 1.03654 -point 0 0 1 - -point 0.25 0 0.75 -point 0.125 0 0.75 -point 0.125 0 0.125 -point 0.125 0 0 -point 0.125 0.75 0 - -point 0.25 0.75 0 -point 0 1 0 -point -0.000470898 1.056641 0 -point 0.0774559 1.005923 0 - -point 0.0774559 1.026439 0 -point 0.012561 1.065182 0 -point 0.0774559 1.107272 0 - -point 0.0774559 1.124266 0 -point -0.000470898 1.073547 0 -point -0.0577933 1.073547 0 - -point -0.0577933 1.056641 0 -point -0.000470898 1.056641 0 -point 0 1 0 -point -0.25 0.75 0 - -point -0.125 0.75 0 -point -0.125 0 0 -point -0.125 0 0.75 -point -0.25 0 0.75 -point 0 0 1 - -point 0.25 0 0.75 -point 0.125 0 0.75 -point 0.125 0 0.125 -point 0.75 0 0.125 -point 0.75 0 0.25 - -point 1 0 0 - -knot 0 -knot 1 -knot 2 -knot 3 -knot 4 -knot 5 -knot 6 -knot 7 -knot 8 -knot 9 -knot 10 -knot 11 -knot 12 -knot 13 -knot 14 - -knot 15 -knot 16 -knot 17 -knot 18 -knot 19 -knot 20 -knot 21 -knot 22 -knot 23 -knot 24 -knot 25 -knot 26 -knot 27 - -knot 28 -knot 29 -knot 30 -knot 31 -knot 32 -knot 33 -knot 34 -knot 35 -knot 36 -knot 37 -knot 38 -knot 39 -knot 40 - -knot 41 -knot 42 -knot 43 -knot 44 -knot 45 -knot 46 -knot 47 -knot 48 -knot 49 -knot 50 -knot 51 -knot 52 -knot 53 - -knot 54 -knot 55 -knot 56 -knot 57 -knot 58 -knot 59 -knot 60 -knot 61 -knot 62 -knot 63 -knot 64 -knot 65 - -name "SceneRoot"`; - - rotate -90 180 0 $sceneRootCurve; - } -} - -//! Fetches an export setting of integer or boolean type -/*! - \param $settingName The name of the setting to fetch the value of -*/ -global proc int LumberyardGetIntExportSetting(string $settingName) -{ - string $settingValue = `cryExportGetExportSettingValue $settingName`; - if ($settingValue == "") - { - return 0; - } - return $settingValue; -} - -//! Helper function to do path fixup and open a file browser -/*! - \param $startingFolder The folder to open the file browser at (relative paths will use scene file as basis) - \param $caption The caption to display on the file browser window -*/ -global proc string[] LumberyardBrowseForPath(string $startingFolder, string $caption) -{ - // Convert to absolute path expected by fileDialog2 - string $returnPath[]; - $startingFolder = `cryExportRelativeToAbsolutePath $startingFolder`; - string $result[] = `fileDialog2 -fileMode 3 -startingDirectory $startingFolder -caption $caption - -fileFilter ("Directories only (*)")`; - if (size($result) == 1) - { - // Convert back to relative path - $returnPath[0] = `cryExportFixupPath $result[0]`; - } - - return $returnPath; -} - -//! Verify if requested name is valid and return a proper name for the scene object. -/* - \param $requestedName The desired name of the object. - \param $currentName The current name of the object. - \param $prefix The prefix that will need to add to the requested name when verify its uniqueness in scene. -*/ -global proc string LumberyardVerifySceneObjectRequestNameWithPrefix(string $requestedName, string $currentName, string $prefix) -{ - if ($requestedName == "" || $requestedName == $currentName) - { - return $currentName; - } - - string $firstLetter = `substring $requestedName 1 1`; - string $letterMatch = `match "[A-Z;a-z]" $firstLetter`; - if ($letterMatch == "") - { - return $currentName; - } - - string $uniqueName = $requestedName; - int $i = 1; - while (`objExists ($prefix + $uniqueName)`) - { - $uniqueName = $requestedName + $i; - $i++; - } - return $uniqueName; -} - -//! Verify if requested name is valid and return a proper name for the scene object. -/* - \param $requestedName The desired name of the object. - \param $currentName The current name of the object. -*/ -global proc string LumberyardVerifySceneObjectRequestName(string $requestedName, string $currentName) -{ - return `LumberyardVerifySceneObjectRequestNameWithPrefix $requestedName $currentName ""`; -} - -//! Provide the name of the export settings node from a unified source -global proc string LumberyardGetExportSettingNodeName() -{ - return "LUMBERYARD_EXPORT_SETTINGS"; -} - -//! Provide the name of the export settings node from a unified source -global proc string LumberyardGetExportNodeNamePrefix() -{ - return "LumberyardExportNode_"; -} - -//! Provide the name of the export settings node from a unified source -global proc string LumberyardGetOldExportNodeNamePrefix() -{ - return "cryExportNode_"; -} \ No newline at end of file diff --git a/Tools/maya/script/LumberyardValidator.mel b/Tools/maya/script/LumberyardValidator.mel deleted file mode 100644 index b42d387893..0000000000 --- a/Tools/maya/script/LumberyardValidator.mel +++ /dev/null @@ -1,82 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -///////////////////////////////////////////////////////////////////////////////// -// -// Validator -// -///////////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////////// -// Create a row in the validator list box -global proc LumberyardValidatorCreateRow(int $messageType, int $enableFocus, string $messageText) -{ - setParent LUMBERYARDTOOL_VALIDATOR_LISTBOX; - rowLayout -numberOfColumns 2 -columnWidth2 240 15 -rowAttach 2 "bottom" 0; - { - string $text = `text -wordWrap true -backgroundColor .95 .85 .65 -width 240 -align "left" - -label $messageText`; - string $button = `button -label "<>" -width 15 -backgroundColor 0.5 0.5 0.5 - -command ("print \"Focus works!\"")`; - - // warning type - if ($messageType == 0) - { - text -edit -backgroundColor .95 .85 .65 $text; - } - // error type - else - { - text -edit -backgroundColor .95 .65 .65 $text; - } - - if ($enableFocus) - { - button -edit -enable true $button; - } - else - { - button -edit -enable false $button; - } - } -} - -///////////////////////////////////////////////////////////////////////////////// -// Run the validator to get problem messages -global proc LumberyardValidatorValidate() -{ - string $childItems[] = `scrollLayout -query -childArray LUMBERYARDTOOL_VALIDATOR_LISTBOX`; - for ($child in $childItems) - { - deleteUI $child; - } - // give example messages - LumberyardValidatorCreateRow 0 0 "This is a warning example. This is a warning example. This is a warning example. This is a warning example."; - LumberyardValidatorCreateRow 1 1 "This is an error example. This is an error example. This is an error example. This is an error example."; -} - -///////////////////////////////////////////////////////////////////////////////// -// Create validator frame -global proc LumberyardToolCreateValidatorFrame() -{ - setParent LUMBERYARDTOOL_MAIN_LAYOUT; - frameLayout -collapsable false -borderStyle "etchedOut" -marginHeight 5 -marginWidth 5 - -label "Validator" LUMBERYARDTOOL_VALIDATOR_FRAME; - { - columnLayout -adjustableColumn true LUMBERYARDTOOL_VALIDATOR_LAYOUT; - { - scrollLayout -height 120 -backgroundColor 0 0 0 -visible true LUMBERYARDTOOL_VALIDATOR_LISTBOX; - } - setParent LUMBERYARDTOOL_VALIDATOR_FRAME; - button -label "Validate" -command ("LumberyardValidatorValidate") LUMBERYARDTOOL_VALIDATE_BUTTON; - } -} \ No newline at end of file diff --git a/Tools/maya/script/MayaCryExportOpts.mel b/Tools/maya/script/MayaCryExportOpts.mel deleted file mode 100644 index bf25334a49..0000000000 --- a/Tools/maya/script/MayaCryExportOpts.mel +++ /dev/null @@ -1,60 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -/* - Script to control the options for the Maya Cry Exporter. -*/ - -global proc int MayaCryExportOpts(string $parent,string $action,string $initialSettings,string $resultCallback ) -{ - int $bResult = 0; - if($action == "post") - { - //////////////////////////////////// - // Create the controls - setParent $parent; - - setUITemplate -pushTemplate DefaultTemplate; - - formLayout -e -visible false optionsBoxForm; - { - } - setParent ..; - - //////////////////////////////////// - // Now set to current settings. - - formLayout -e -visible true optionsBoxForm; - - setUITemplate -popTemplate; - - $bResult = 1; - } - else if ($action == "query") - { - ///////////////////////////////////// - // Build the command string - $currentOptions = ""; - print( "Options: " + $currentOptions + "\n" ); - - eval($resultCallback+" \""+$currentOptions+"\""); - - $bResult = 1; - } - else - { - $bResult = 0; - } - - return $bResult; -} - diff --git a/Tools/maya/script/cryAlembic.mel b/Tools/maya/script/cryAlembic.mel deleted file mode 100644 index 873cecc26e..0000000000 --- a/Tools/maya/script/cryAlembic.mel +++ /dev/null @@ -1,50 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// "Prepare Materials for Alembic Export" -// "import cryAlembic\ncryAlembic.renameShadingEngines()\ncryAlembic.enforcePerFaceAssignment()" -// -// "Export Alembic for Lumberyard" -// "from maya import cmds\nimport cryAlembic\n\ncryAlembic.exportAlembicForGeomCache(cmds.ls(sl = 1))" - -proc preparePyEnv() -{ - string $pycmd = "try:\n" + - " import cryAlembic\n" + - "except:\n" + - " import sys\n" + - " print('could not import cry maya tools! trying to setup environment...')\n" + - " paths = [p for p in os.environ['MAYA_SCRIPT_PATH'].split(';') if p.lower().endswith('/tools/melscript')]\n" + - " crypath = ''\n" + - " for p in paths:\n" + - " if os.path.exists('%s/%s' % (p, 'cryAlembic.py')):\n" + - " print('found \"/Tools/melScript\" path')\n" + - " crypath = p\n" + - " break\n" + - " if crypath not in [p.replace('\\\\','/').lower() for p in sys.path]:\n" + - " sys.path.append(crypath)\n" + - " print('added \"/Tools/melScript\" path to py paths')\n"; - python($pycmd); -} - -global proc cryAlembic_prepareMaterials() -{ - preparePyEnv(); - python("import cryAlembic\ncryAlembic.renameShadingEngines()\ncryAlembic.enforcePerFaceAssignment()"); -} - -global proc cryAlembic_export() -{ - preparePyEnv(); - python("import cryAlembic\ncryAlembic.exportAlembicForGeomCache()"); -} diff --git a/Tools/maya/script/cryAlembic.py b/Tools/maya/script/cryAlembic.py deleted file mode 100755 index 21c2dbd661..0000000000 --- a/Tools/maya/script/cryAlembic.py +++ /dev/null @@ -1,203 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -from maya import cmds -from time import time -import cryDecorators -import sys - -import logging -logging.basicConfig() -log = logging.getLogger(__name__) -#log.setLevel(logging.DEBUG) - -standardSGs = set(['initialParticleSE', 'initialShadingGroup']) - - -def renameShadingEngines(lstShadingEngines=None): - ''' - Renames ShadingEngines, to match their material's name. - This is required, because maya exports FaceSets from ShadingEngines - and GeomCaches derives material IDs from FaceSets. - ''' - - if not lstShadingEngines: - lstShadingEngines = cmds.ls(type="shadingEngine") - elif isinstance(lstShadingEngines, basestring): - lstShadingEngines = [lstShadingEngines] - - # can't rename standard shading engines - lstShadingEngines = list(set(lstShadingEngines) - standardSGs) - - if not lstShadingEngines: - return [] - - log.info("Renaming ShadingEngines...") - log.debug(" %s" % ', '.join(lstShadingEngines)) - - for i in range(len(lstShadingEngines)): - lstMaterials = cmds.listConnections("%s.surfaceShader" % lstShadingEngines[i], d=False, s=True, p=False) - if lstMaterials: - log.debug(" Materials: %s" % ', '.join(lstMaterials)) - dgMaterial = lstMaterials[0] - destName = "%sSG" % dgMaterial - if lstShadingEngines[i] == destName: - continue - - log.debug("Renaming " + lstShadingEngines[i] + " to " + destName + " ...") - try: - lstShadingEngines[i] = cmds.rename(lstShadingEngines[i], destName) - print('lstShadingEngines[i]: %s' % lstShadingEngines[i]) - except: - log.debug(" !!! FAILED TO RENAME !!!") - else: - log.debug("No material found for shadingEngine: " + lstShadingEngines[i]) - return lstShadingEngines - - -def enforcePerFaceAssignment(lstShadingEngines=None): - ''' - Workaround for Maya 2014/2015 bug. - Ensures that ShadingEngines contain only faces, rather than full shapes. - Alembic 1.1.5 contains a bug, so that it doesn't export FaceSets - for objects where the entire shape is in the ShadingEngine. - ''' - if lstShadingEngines is None: - lstShadingEngines = cmds.ls(type="shadingEngine") - else: - if isinstance(lstShadingEngines, basestring): - lstShadingEngines = [lstShadingEngines] - - # cant apply per face assignment on standardSGs - lstShadingEngines = set(lstShadingEngines) - standardSGs - - if not lstShadingEngines: - return False - - log.info("Enforcing per-face material assignment ...") - - for dgShadingEngine in lstShadingEngines: - log.debug(" shadingEngine: " + dgShadingEngine) - - lstSetMembers = cmds.sets(dgShadingEngine, q=True) - if not lstSetMembers: - continue - - for sSetMember in lstSetMembers: - if ".f[" not in sSetMember: - log.debug(" Converting shape-assignment to face-assignment: " + sSetMember) - # make sure sSetMember is a mesh! - meshMember = cmds.ls(cmds.listHistory(sSetMember), type='mesh') - if not meshMember: - log.debug('SetMember "%s" (from %s) did not yield a mesh!' % sSetMember, dgShadingEngine) - continue - meshMember = meshMember[0] - try: - #iFaceCount = cmds.polyEvaluate(meshMember, f=True) - #sFaces = meshMember + ".f[0:" + str(iFaceCount - 1) + "]" - sFaces = "%s.f[*]" % meshMember - # nasty hack: temporarily apply default material - # to generate objectGroup datastructures - if dgShadingEngine not in standardSGs: - cmds.sets("%s.f[0]" % meshMember, e=True, fe="initialShadingGroup") - cmds.sets(sFaces, e=1, fe=dgShadingEngine) - # remove original member from that we added all faces if still in - if cmds.sets(sSetMember, isMember=dgShadingEngine): - cmds.sets(sSetMember, rm=dgShadingEngine) - except StandardError, error: - log.error(error) - log.debug("Failed to all faces to material for object: " + sSetMember + "!") - log.debug(sys.exc_info()) - - # fix for abc import which throws per face warnings if you have - # get connected visible shapes - connMesh = set(cmds.ls(cmds.listConnections('%s.dagSetMembers' % dgShadingEngine, shapes=True), type='mesh')) - connMesh = set([m for m in connMesh if not cmds.getAttr('%s.intermediateObject' % m)]) - shapeMembers = set(cmds.ls(lstSetMembers, s=True, dag=True, o=True)) - # find nodes connected to dagSetMembers but are not members - nonMemberShapes = list(connMesh - shapeMembers) - if nonMemberShapes: - log.debug('ShadingEngine "%s" has false member connection to mesh shape: %s' - % (dgShadingEngine, ', '.join(nonMemberShapes))) - # find out exact connection and disconnect - for shape in nonMemberShapes: - conns = cmds.listConnections(shape, type='shadingEngine', c=True, p=True) - for i in range(1, len(conns), 2): - if conns[i].startswith('%s.dagSetMembers' % dgShadingEngine): - log.debug('unplugging "%s" from "%s"' % (conns[i - 1], conns[i])) - cmds.disconnectAttr(conns[i - 1], conns[i]) - - return True - -@cryDecorators.pluginDependency("AbcExport.mll") -def exportAlembicForGeomCache(nodes=[]): - ''' - Exports objects to Alembic with settings required for GeomCache pipeline. - ''' - if not nodes: - nodes = cmds.ls(sl=True, tr=True) - if not nodes: - log.error('Select some transforms to export!') - return - - selMesh, selSGs = getMeshAndSGs(nodes) - if not selMesh: - log.error('No meshes found to export!') - - if selSGs.intersection(standardSGs): - log.warning('Selected objects have default materials applied! Please replace!') - - #lstFilePath = cmds.fileDialog2(cap="Export Alembic for GeomCache", ff="*.abc", ds=1, fm=0, dir=(cmds.workspace(q=1, rd=1))) - lstFilePath = cmds.fileDialog2(cap="Export Alembic for GeomCache", fileFilter="Alembic .abc (*.abc)", fileMode=0) - if not lstFilePath: - return - - t0 = time() - selSGs = renameShadingEngines(selSGs) - enforcePerFaceAssignment(selSGs) - - sOptions = "-frameRange %s %s" % (cmds.playbackOptions(q=1, min=1), cmds.playbackOptions(q=1, max=1)) - sOptions += " -uvWrite -writeColorSets -writeFaceSets -writeVisibility " - sOptions += ' '.join(['-root %s' % n for n in nodes]) - sOptions += ' -file "%s"' % lstFilePath[0] - log.debug("AbcExport params:\n\t%s" % sOptions) - - log.info('Exporting file: "%s" ...' % lstFilePath[0]) - try: - cmds.AbcExport(jobArg=sOptions) - except StandardError, error: - log.error(error) - log.debug(sys.exc_info()) - - log.info('Export finished! %ssec' % round(time() - t0, 1)) - - -def getMeshAndSGs(nodes=[]): - """ - filters visible mesh shapes from given or selected nodes and returns - them with thier shading groups - """ - if not nodes: - nodes = cmds.ls(sl=True) - if not nodes: - return None, None - selMesh = set(cmds.ls(cmds.listRelatives(nodes, allDescendents=True), type='mesh')) - selMesh = [m for m in selMesh if not cmds.getAttr('%s.intermediateObject' % m)] - if not selMesh: - return None, None - selSGs = set(cmds.ls(cmds.listConnections(selMesh), type='shadingEngine')) - return selMesh, selSGs - - -def prepareMaterials(*args): - """inline call for Ui""" - mesh, sgs = getMeshAndSGs() - sgs= renameShadingEngines(sgs) - enforcePerFaceAssignment(sgs) diff --git a/Tools/maya/script/cryAnim.mel b/Tools/maya/script/cryAnim.mel deleted file mode 100644 index 61987b7335..0000000000 --- a/Tools/maya/script/cryAnim.mel +++ /dev/null @@ -1,1082 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -//////////////////////////////////////////////////////////////////// -// -// CryAnim.mel -// -// Libraries for exporting animation for the cry exporter -// -////////////////////////////////////////////////////////////////////// -python( "import mayaAnimUtilities as mau" ); - -// keeping track of the last folder -global string $cryAnimArrangeLastPath = ""; - -//obsolete -global proc cryAnimZeroJointRotation() -{ - string $response = `confirmDialog -title "Lumberyard Animation" -message ("This will try to remove any rotation and set the joint-orientation to\nzero on the selected joints by pushing it down to the joints children.") -button "OK" -button "Cancel"`; - if( $response != "OK" ) - { - return; - } - - string $selected[] = `ls -sl`; - - if( size($selected) == 0 ) - { - confirmDialog -title "Lumberyard Animation" -message ("No nodes are selected.") -button "OK"; - return; - } - - string $tempGroup = `group -empty -name "cryAnimTempGroup"`; - for( $node in $selected ) - { - if( `objectType $node` == "joint" ) - { - string $children[]; - - // Unparent all children - $children = `listRelatives -children -fullPath $node`; - for ($child in $children) - { - parent $child $tempGroup; - } - - // Make sure the attributes are unlocked and set the rotation and joint orientation to 0 - setAttr -lock off ($node+".rotateX"); - setAttr -lock off ($node+".rotateY"); - setAttr -lock off ($node+".rotateZ"); - setAttr -lock off ($node+".jointOrientX"); - setAttr -lock off ($node+".jointOrientY"); - setAttr -lock off ($node+".jointOrientZ"); - setAttr ($node+".rotateX") 0; - setAttr ($node+".rotateY") 0; - setAttr ($node+".rotateZ") 0; - setAttr ($node+".jointOrientX") 0; - setAttr ($node+".jointOrientY") 0; - setAttr ($node+".jointOrientZ") 0; - - // Re-parent the children - $children = `listRelatives -children -fullPath $tempGroup`; - for ($child in $children) - { - parent $child $node; - } - } - else - { - confirmDialog -title "Lumberyard Animation" -message ("Node `"+$node+"` is not a joint.") -button "OK"; - } - } - - delete $tempGroup; - select $selected; -} - - -///////////////////////////////////////////////////////////////////////// -// These save and load functions need to be merged into a setting system -// of some sort thats sharded with the export window etc. -///////////////////////////////////////////////////////////////////////// -// Load from the AnimRanges field in the settings node -global proc cryAnimManagerLoadSettings() -{ - if( `control -exists CRYANIMMANAGER_ANIMRANGES` ) - { - textScrollList -e -removeAll CRYANIMMANAGER_ANIMRANGES; - string $rangesString = `cryAnimLoadRangesString`; - string $tokens[]; - $numTokens = `tokenize $rangesString "," $tokens`; - if( $numTokens != 0 ) - { - for( $i = 0;$i<$numTokens;$i++ ) - { - if( size($tokens[$i]) > 0 ) - { - textScrollList -e -append $tokens[$i] CRYANIMMANAGER_ANIMRANGES; - } - } - } - } -} - -// Save to the AnimRanges field in the settings node -global proc cryAnimManagerSaveSettings() -{ - string $rangesString = ""; - string $animRanges[]; - $animRanges = `textScrollList -q -allItems CRYANIMMANAGER_ANIMRANGES`; - for( $i = 0;$i 0 ) $rangesString += ","; - $rangesString += $animRanges[$i]; - } - - cryAnimSaveRangesString $rangesString; -} - -global proc animManagerAddAnimRangeCloseWindow() -{ - deleteUI -window CRYANIMMANAGER_ADDRANGEWINDOW; -} - -proc int animManagerAnimRangeValidate( int $editEntry, string $name, int $start, int $end, string $rootNode, string $path ) -{ - int $editIndex = $editEntry; - - int $rangeCount = `cryAnimGetNumRanges`; - string $animRanges[] = `cryAnimGetRanges`; - - // Make sure there is not a range with the same name already in the list - for( $i = 0;$i<$rangeCount;$i++ ) - { - string $decode[]; - //bypassing c++ code - //$decode = `cryExportDecodeRangeString $animRanges[$i]`; - $decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $animRanges[$i] + "\")"); - if( size($decode) >= 5 ) - { - if(( `strcmp $decode[2] $name` == 0 )&&(`strcmp $decode[4] $path` == 0)) - { - if( $i != $editIndex ) - { - confirmDialog -title "Anim Range" -message "A range with that name already exists." -button "Ok"; - return 0; - } - } - } - } - - // Make sure the root node is valid - if( `size($rootNode)` != 0 ) - { - string $rootNodes[]; - $numRoots = `tokenize $rootNode ";" $rootNodes`; - - for( $root in $rootNodes ) - { - $foundRoots = `ls $root`; - if( `size($foundRoots)` == 0 ) - { - confirmDialog -title "Anim Range" -message "The root node could not be found." -button "Ok"; - return 0; - } - else if( `size($foundRoots)` > 1 ) - { - confirmDialog -title "Anim Range" -message "Root node name matches more than one node." -button "Ok"; - return 0; - } - else - { - string $tokens[]; - $numTokens = `tokenize $root "|" $tokens`; - string $nodeNameLC = `tolower $tokens[$numTokens-1]`; - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - - if( `objectType -isType "joint" $root` == 0 && `startsWith $nodeNameLC $lumberyardExportNodePrefix` == 0 ) - { - confirmDialog -title "Anim Range" -message "The root node needs to be a joint or a `LumberyardExportNode`." -button "Ok"; - return 0; - } - } - } - } - - return 1; -} - -global proc addAnimRangeUseCurrent() -{ - setMinMaxPlayback ADDRANGE_START ADDRANGE_END; - - string $lumberyardExportNodes[]; - $lumberyardExportNodes = `cryMayaSupportPlugin gatherExportNodes selectedOnly`; - - if ( size($lumberyardExportNodes) == 1 ) - { - string $tokens[]; - $numTokens = `tokenize $lumberyardExportNodes[0] "_" $tokens`; - if ( $numTokens > 1 ) - { - textField -e -text $tokens[1] ADDRANGE_NAME; - } - } -} - -global proc string GetRootJointForSelection(string $defaultRootJoint) -{ - string $rootJointString = $defaultRootJoint; - string $selected[]; - $selected = `ls -sl -l`; - if( `size($selected)` > 0 ) - { - int $selectedCount = size($selected); - - $rootJointString = ""; - for( $i = 0; $i < $selectedCount; $i++ ) - { - string $rootJoint = $selected[$i]; - - string $tokens[]; - $numTokens = `tokenize $rootJoint "|" $tokens`; - string $nodeNameLC = `tolower $tokens[$numTokens-1]`; - - string $rootJointStrip = $rootJoint; - if( `startsWith $rootJoint "|"` ) // Remove the leading `|` - { - $length = size($rootJoint); - $rootJointStrip = `substring $rootJoint 2 $length`; - } - - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - if( `objectType -isType "joint" $rootJoint` || `startsWith $nodeNameLC $lumberyardExportNodePrefix`) - { - if( $i > 0 ) - { - $rootJointString += (";"); - } - $rootJointString += $rootJointStrip; - } - } - } - - return $rootJointString; -} - -global proc selectAnimRangeRoot() -{ - string $rootNodeString = `textField -query -text ADDRANGE_ROOTNODE`; - $rootNodeString = `GetRootJointForSelection $rootNodeString`; - textField -e -text $rootNodeString ADDRANGE_ROOTNODE; -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -global proc animManagerAddAnimRangeAdd( int $editEntry ) -{ - string $name = strip(`textField -q -text ADDRANGE_NAME`); - int $start = `floatField -q -value ADDRANGE_START`; - int $end = `floatField -q -value ADDRANGE_END`; - string $root = `textField -q -text ADDRANGE_ROOTNODE`; - string $path = `textField -q -text ADDRANGE_PATH`; - if( size($name) == 0 ) - $name = "noName"; - - string $currentLayerSettings = `textField -q -text ADDRANGE_ADDLAYERINFO`; - - if( `animManagerAnimRangeValidate $editEntry $name $start $end $root $path` ) - { - string $rangeString = `cryAnimFormatRangeString $start $end $name $root $path $currentLayerSettings`; - - if( $editEntry >= 0 ) - { - cryAnimReplaceRange $editEntry $rangeString; - } - else - { - cryAnimAddRange $rangeString; - } - animManagerAddAnimRangeCloseWindow; - cryAnimManagerLoadSettings; - cryAnimPopulateRangeList; - cryExportUpdateExportLists; - } -} - - - - -global proc cryAnimManagerSetAnimLayerInfo() -{ - string $layers = cryReturnActiveAnimLayers(); - textField -e -text $layers ADDRANGE_ADDLAYERINFO; -} - - - - -global proc cryAnimManagerClearAnimLayerInfo() -{ - textField -e -text "" ADDRANGE_ADDLAYERINFO; -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -global proc cryAnimManagerSetPathText() -{ - global string $cryAnimArrangeLastPath; - string $folderPath = `textField -q -text ADDRANGE_PATH`; - $folderPath = `cryExportFixupPath $folderPath`; - - // do not save empty paths e.g. if the user cancels - $cryAnimArrangeLastPath = $folderPath; - textField -e -text $folderPath ADDRANGE_PATH; -} - -// parameter name: $editEntry -// value range: >= -1 -// -1: when the function is called for "New" an animation range item; -// >= 0: when the function is called for "Edit" an existed animation range item, -// the value is the id of the item in the list. -// It is used for retrieving the animation range item from the list for editing -// its folder path. -global proc cryAnimManagerBrowseForFolder( int $editEntry ) -{ - global string $cryAnimArrangeLastPath; - - // if this is the first time we browse for folder, - // start at the path that the scene file is located - if ($cryAnimArrangeLastPath == "") - { - $cryAnimArrangeLastPath = `file -q -sceneName`; - $cryAnimArrangeLastPath = `dirname $cryAnimArrangeLastPath`; - } - - string $startingFolder = $cryAnimArrangeLastPath; - - int $numRanges = `cryAnimGetNumRanges`; - string $ranges[] = `cryAnimGetRanges`; - - // get the previously assigned path of a specific animation item, - // if it's not in "NEW" mode (which will take -1 as $editEntry) - if( $editEntry != -1 && $numRanges > 0 ) - { - string $editText = $ranges[$editEntry]; - string $decode[]; - //bypassing C++ code - //$decode = `cryExportDecodeRangeString $editText`; - $decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $editText + "\")"); - if( size($decode) >= 5 ) - { - string $animPath = $decode[4]; - $startingFolder = `cryExportFixupPath $animPath`; - $cryAnimArrangeLastPath = $startingFolder; - } - } - - string $absPath = `cryExportRelativeToAbsolutePath $startingFolder`; - string $result[] = `fileDialog2 -fileMode 3 -startingDirectory $absPath -fileFilter ("Directories only (*)")`; - - if( size($result) == 1 ) - { - textField -e -text $result[0] ADDRANGE_PATH; - cryAnimManagerSetPathText(); - } -} - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -global proc cryAnimManagerEditAnimRangeWin( int $mode, int $editEntry ) -{ - if( $mode == 0 || $mode == 1 ) - { - if(!`window -ex CRYANIMMANAGER_ADDRANGEWINDOW`) - { - if(`windowPref -exists CRYANIMMANAGER_ADDRANGEWINDOW`) - { - windowPref -wh 473 210 -tlc `windowPref -q -topEdge CRYANIMMANAGER_ADDRANGEWINDOW` `windowPref -q -leftEdge CRYANIMMANAGER_ADDRANGEWINDOW` CRYANIMMANAGER_ADDRANGEWINDOW; - } - window -titleBar true -title "Add Anim Range" -widthHeight 460 210 -sizeable false -mnb false -mxb false CRYANIMMANAGER_ADDRANGEWINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - $collayout = `columnLayout -rowSpacing 5 -adjustableColumn true`; - - button -label "Use Range From Time Slider" -command ("addAnimRangeUseCurrent"); - $rcLayout = `rowColumnLayout -numberOfColumns 4 -columnAttach 1 "right" 0 -columnWidth 1 110 -columnWidth 2 200 -columnWidth 3 70 -columnWidth 4 70 - -columnSpacing 2 5 -columnSpacing 3 5`; - { - text -label "Name"; - textField -text "New" ADDRANGE_NAME; - text -label ""; - text -label ""; - - text -label "Start Frame"; - float $animStartTime = `playbackOptions -q -ast`; - floatField -precision 0 -step 1 -value $animStartTime ADDRANGE_START; - text -label ""; - text -label ""; - - text -label "End Frame"; - float $animEndTime = `playbackOptions -q -aet`; - floatField -precision 0 -step 1 -value $animEndTime ADDRANGE_END; - text -label ""; - text -label ""; - - text -label "Root"; - textField -text "" ADDRANGE_ROOTNODE; - $rootButton = `button -label "Select" -command ("selectAnimRangeRoot")`; - text -label ""; - - text -label "Path"; - global string $cryAnimArrangeLastPath; - textField -text $cryAnimArrangeLastPath -changeCommand("cryAnimManagerSetPathText ") ADDRANGE_PATH; // use the last browsed path as the default path for a new animation range item - button -label "Browse" -command ("cryAnimManagerBrowseForFolder "+$editEntry); - text -label ""; - - text -label "Anim Layer Commands"; - textField -text "" ADDRANGE_ADDLAYERINFO; - button -label "Set" -command ("cryAnimManagerSetAnimLayerInfo"); - button -label "Clear" -command ("cryAnimManagerClearAnimLayerInfo"); - - } - setParent ..; - - setParent ..; - string $addText = "Add"; - if( $mode == 1 ) $addText = "Edit"; - $addbutton = `button -label $addText -command ("animManagerAddAnimRangeAdd "+$editEntry)`; - $cancelbutton = `button -label "Cancel" -command ("animManagerAddAnimRangeCloseWindow")`; - setParent ..; - - formLayout -edit - -attachForm $collayout "top" 5 - -attachForm $collayout "left" 5 - -attachForm $collayout "right" 5 - -attachNone $collayout "bottom" - - -attachForm $addbutton "bottom" 5 - -attachForm $addbutton "left" 5 - -attachPosition $addbutton "right" 5 50 - -attachNone $addbutton "top" - - -attachForm $cancelbutton "bottom" 5 - -attachPosition $cancelbutton "left" 5 50 - -attachForm $cancelbutton "right" 5 - -attachNone $cancelbutton "top" - $layout1; - - if( $mode == 1 ) - { - // Fill out the window with the selected entry - int $numRanges = `cryAnimGetNumRanges`; - string $ranges[] = `cryAnimGetRanges`; - if( $editEntry >= 0 && $editEntry < $numRanges ) - { - string $editText = $ranges[$editEntry]; - string $decode[]; - //bypassing c++ code - //$decode = `cryExportDecodeRangeString $editText`; - $decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $editText + "\")"); - if( size($decode) >= 5 ) - { - int $animStart = $decode[0]; - int $animEnd = $decode[1]; - string $animName = $decode[2]; - string $animRoot = $decode[3]; - string $animPath = $decode[4]; - string $animLayers = $decode[5]; - - textField -e -text $animName ADDRANGE_NAME; - floatField -e -value $animStart ADDRANGE_START; - floatField -e -value $animEnd ADDRANGE_END; - textField -e -text $animRoot ADDRANGE_ROOTNODE; - textField -e -text $animPath ADDRANGE_PATH; - textField -e -text $animLayers ADDRANGE_ADDLAYERINFO; - } - } - } - - showWindow CRYANIMMANAGER_ADDRANGEWINDOW; - } - } - else if( $mode == 2 ) - { - // Remove indexed item - cryAnimRemoveAnimRange $editEntry; - cryAnimManagerLoadSettings; - cryAnimPopulateRangeList; - cryExportUpdateExportLists; - } - else if( $mode == 3 ) - { - // Remove all items - string $response = `confirmDialog -title "Lumberyard Animation" -message ("Delete all animations?") -button "Yes" -button "No"`; - if( $response == "Yes" ) - { - cryAnimRemoveAllAnimRanges; - cryAnimManagerLoadSettings; - cryAnimPopulateRangeList; - cryExportUpdateExportLists; - } - } -} - -global proc cryAnimManagerSelectRoots( string $rootNodes ) -{ - string $rootTokens[]; - $numTokens = `tokenize $rootNodes ";" $rootTokens`; - - select -clear; - for( $root in $rootTokens ) - { - select -add $root; - } -} - -global proc cryAnimManagerCopyRangeText( string $rangeText ) -{ - cryMayaSupportPlugin copyToClipboard $rangeText; -} - -global proc cryAnimManagerEditAnimRange( int $mode ) -{ - int $editEntry = -1; - - if( $mode == 1 || $mode == 2 ) - { - int $selectedArray[]; - $selectedArray = `textScrollList -q -selectIndexedItem CRYANIMMANAGER_ANIMRANGES`; - if( size($selectedArray) == 1 ) - { - // Subtract 1 as the list is 1 based but the array is 0 based - $editEntry = ($selectedArray[0] - 1); - } - else - { - confirmDialog -title "Error" -message "No anim range is selected." -button "Ok" -defaultButton "Ok"; - return; - } - } - cryAnimManagerEditAnimRangeWin $mode $editEntry; -} - - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -global proc cryAnimManagerAnimRangesDClick( int $inIndex ) -{ - int $index = $inIndex; - if( `control -q -exists CRYANIMMANAGER_ANIMRANGES` ) - { - int $selectedArray[]; - $selectedArray = `textScrollList -q -selectIndexedItem CRYANIMMANAGER_ANIMRANGES`; - if( size($selectedArray) == 1 ) - $index = $selectedArray[0] - 1; - } - - int $numRanges = `cryAnimGetNumRanges`; - string $ranges[] = `cryAnimGetRanges`; - - if( $index >= 0 && $index < $numRanges ) - { - string $decode[]; - //bypassing c++ function - //$decode = cryExportDecodeRangeString( $ranges[$index] ); - $decode = `python("mau.AMZN_DecodeAnimRangeString(\"" + $ranges[$index] + "\")")`; - string $animStart = $decode[0]; - string $animEnd = $decode[1]; - - playbackOptions -min $animStart -max $animEnd; - currentTime $animStart; - } -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -global proc cryAnimManagerUICloseWindow() -{ - //cryAnimManagerSaveSettings; // Removed as we should only save when something changes. - deleteUI -window CRYANIMMANAGER_WINDOW; -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -proc string cryAnimCreateParentRowLayout() -{ - $rowname = `rowLayout -numberOfColumns 4 -columnWidth4 20 100 65 65 -adjustableColumn 2 - -columnAlign 2 "left" -columnAlign 3 "center" -columnAlign 4 "center" - -columnAttach 3 "both" 0 -columnAttach 4 "both" 0 -bgc .4 .4 .4`; - - return $rowname; -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -proc string cryAnimCreateChildRowLoyout() -{ - $rowname = `rowLayout -numberOfColumns 6 -columnWidth6 35 35 150 150 250 85 -adjustableColumn 5 -bgc .4 .4 .4 - -columnAlign 1 "center" -columnAttach 1 "both" 0 - -columnAlign 2 "center" -columnAttach 2 "both" 0 - -columnAlign 3 "center" -columnAttach 3 "both" 0 - -columnAlign 4 "center" -columnAttach 4 "both" 0 - -columnAlign 5 "center" -columnAttach 5 "both" 0 - -columnAlign 6 "center" -columnAttach 6 "both" 0`; - - return $rowname; -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -proc cryAnimAddRangeToList( string $range, int $rangeNum ) -{ - if( !`control -q -exists CRYANIM_COLUMNLAYOUT` ) - return; - - setParent CRYANIM_COLUMNLAYOUT; - $rowName = `cryAnimCreateParentRowLayout`; - { - button -label "#" -command ("cryAnimManagerAnimRangesDClick "+$rangeNum); - - string $rootNodes = ""; - cryAnimCreateChildRowLoyout; - { - string $decode[]; - //bypassing c++ code - //$decode = `cryExportDecodeRangeString $range`; - $decode = `python("mau.AMZN_DecodeAnimRangeString(\"" + $range + "\")")`; - if( size($decode) >= 5 ) - { - text -h 22 -label ($decode[0]) -bgc .5 .55 .5; - text -h 22 -label ($decode[1]) -bgc .5 .5 .55; - text -h 22 -label ($decode[2]) -bgc .5 .55 .5; - text -h 22 -label ($decode[3]) -bgc .5 .5 .55; - text -h 22 -label ($decode[4]) -bgc .5 .55 .5; - - if ($decode[5] != "") - text -h 22 -label "Set" -bgc .5 .55 .55; - else - text -h 22 -label "Not Set" -bgc .5 .55 .55; - $rootNodes = $decode[3]; - } - - //$messageText = `text -h 22 -label (" "+$range)`; - } - setParent ..; - - button -align "center" -label "Edit" -command ( "cryAnimManagerEditAnimRangeWin 1 "+$rangeNum ); - button -align "center" -label "Delete" -command ( "cryAnimManagerEditAnimRangeWin 2 "+$rangeNum ); - - popupMenu -parent $rowName -button 3; - { - menuItem -label "Select root nodes" -command ( "cryAnimManagerSelectRoots \""+$rootNodes+"\"" ); - menuItem -divider true; - menuItem -label "Copy range text" -command ( "cryAnimManagerCopyRangeText \""+$range+"\"" ); - menuItem -divider true; - menuItem -label "Show in Explorer" -command ( "cryExportAnimIndexShowInExplorer "+$rangeNum ); - menuItem -divider true; - menuItem -label "Find Anims" -command ("cryAnimManagerFindAnims"); - } - } - setParent ..; -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -global proc cryAnimPopulateRangeList() -{ - if( !`control -q -exists CRYANIM_COLUMNLAYOUT` ) - return; - - setParent CRYANIM_COLUMNLAYOUT; - string $childControls[]; - $childControls = `layout -q -childArray CRYANIM_COLUMNLAYOUT`; - - for( $child in $childControls ) - { - deleteUI $child; - } - - int $numRanges = `cryAnimGetNumRanges`; - string $ranges[] = `cryAnimGetRanges`; - - cryAnimCreateParentRowLayout; - { - text -h 10 -label ""; - cryAnimCreateChildRowLoyout; - { - text -h 10 -label "Start"; - text -h 10 -label "End"; - text -h 10 -label "Name"; - text -h 10 -label "Root Node"; - text -h 10 -label "Export Path"; - text -h 10 -label "Layers"; - } - setParent ..; - text -h 10 -label ""; - text -h 10 -label ""; - } - setParent ..; - separator -height 2 -style "in"; - - if( $numRanges > 0 ) - { - int $rangeNum = 0; - for( $range in $ranges ) - { - cryAnimAddRangeToList $range $rangeNum; - $rangeNum++; - } - } -} - -// This function is currently not being called from anywhere. It is related to the old system of storing animations. -global proc cryAnimManagerFindAnims() -{ - string $namespaces[] = `namespaceInfo -listOnlyNamespaces`; - - int $foundNode = 0; - - for($namespace in $namespaces ) - { - string $settingsName = $namespace + ":" + LumberyardGetExportSettingNodeName(); - if( `objExists $settingsName` ) - { - if( `attributeExists "AnimRanges" $settingsName` ) - { - string $rangesString = `getAttr ($settingsName+".AnimRanges")`; - - print("Ranges String `"+$rangesString+"`\n"); - - string $rangeTokens[]; - $numTokens = `tokenize $rangesString "," $rangeTokens`; - - $foundNode = 1; - string $response = `confirmDialog -title "Lumberyard Animation" -message ("Found "+$numTokens+" animations on node "+$settingsName+". Merge them with the animations from this scene?") -button "Yes" -button "No"`; - if( $response == "Yes" ) - { - for( $range in $rangeTokens ) - { - cryAnimAddRange $range; - } - } - } - } - } - - if( $foundNode == 0 ) - { - confirmDialog -title "Lumberyard Animation" -message ("No referanced settings nodes were found that contain animation ranges.") -button "OK"; - } - else - { - cryAnimPopulateRangeList; - } -} - - - -////////////////////////////// -// -// ui function -// -////////////////////////////// -proc createCryAnimManagerWindow() -{ - if(!`window -ex CRYANIMMANAGER_WINDOW`) - { - if(`windowPref -exists CRYANIMMANAGER_WINDOW`) - { - windowPref -wh 1100 600 -tlc `windowPref -q -topEdge CRYANIMMANAGER_WINDOW` `windowPref -q -leftEdge CRYANIMMANAGER_WINDOW` CRYANIMMANAGER_WINDOW; - //windowPref -remove CRYANIMMANAGER_WINDOW; - } - window -titleBar true -title "Lumberyard Animation Manager" -widthHeight 1100 600 -sizeable true -mnb false -mxb false CRYANIMMANAGER_WINDOW; - - formLayout -numberOfDivisions 100 -visible false CRYANIM_FORMLAYOUT; - { - scrollLayout -childResizable true -hst 0 -vst 15 -height 1 -bgc .4 .4 .4 CRYANIM_SCROLLLAYOUT; - { - popupMenu CRYANIMMANAGER_FORMIDMENU; - { - menuItem -label "Find Anims" -command ("cryAnimManagerFindAnims"); - } - columnLayout -adjustableColumn true -columnOffset "both" 5 -rowSpacing 5 -bgc .4 .4 .4 CRYANIM_COLUMNLAYOUT; - { - } - setParent ..; - } - setParent ..; - - button -label "New" -command("cryAnimManagerEditAnimRangeWin 0 -1") CRYANIM_NEW; - button -label "Delete All" -command("cryAnimManagerEditAnimRangeWin 3 -1") CRYANIM_DELETEALL; - button -label "Close" -command ("cryAnimManagerUICloseWindow") CRYANIM_CLOSE; - } - formLayout -edit - -attachForm CRYANIM_NEW "top" 5 - -attachForm CRYANIM_NEW "left" 5 - -attachPosition CRYANIM_NEW "right" 5 50 - -attachNone CRYANIM_NEW "bottom" - - -attachForm CRYANIM_DELETEALL "top" 5 - -attachPosition CRYANIM_DELETEALL "left" 5 50 - -attachForm CRYANIM_DELETEALL "right" 5 - -attachNone CRYANIM_DELETEALL "bottom" - - -attachControl CRYANIM_SCROLLLAYOUT "top" 5 CRYANIM_NEW - -attachForm CRYANIM_SCROLLLAYOUT "left" 5 - -attachForm CRYANIM_SCROLLLAYOUT "right" 5 - -attachControl CRYANIM_SCROLLLAYOUT "bottom" 5 CRYANIM_CLOSE - - -attachForm CRYANIM_CLOSE "bottom" 5 - -attachForm CRYANIM_CLOSE "left" 5 - -attachForm CRYANIM_CLOSE "right" 5 - -attachNone CRYANIM_CLOSE "top" - CRYANIM_FORMLAYOUT; - } - - cryAnimPopulateRangeList; - - formLayout -e -visible true CRYANIM_FORMLAYOUT; - - scriptJob -event "NewSceneOpened" "cryAnimPopulateRangeList" -p "CRYANIMMANAGER_WINDOW"; - scriptJob -event "PostSceneRead" "cryAnimPopulateRangeList" -p "CRYANIMMANAGER_WINDOW"; - - showWindow CRYANIMMANAGER_WINDOW; -} - -proc cryAnimSourceDependencies() -{ - eval("source cryExport.mel"); - eval("source LumberyardUtilities.mel"); -} - -global proc cryAnimManagerWin() -{ - //cryAnimManagerUpgradeSettingsString; - - cryAnimSourceDependencies; - createCryAnimManagerWindow; -} - -///////////////////////////////////////////////////////////////////////// -// Generic anim access functions -///////////////////////////////////////////////////////////////////////// -global proc string cryAnimLoadRangesString() -{ - string $rangesString = ""; - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - if( `objExists $exportSettingsNode` ) - { - if( `attributeExists "AnimRanges" $exportSettingsNode` ) - { - $rangesString = `getAttr ($exportSettingsNode+".AnimRanges")`; - } - } - return $rangesString; -} - -global proc cryAnimSaveRangesString( string $rangesString ) -{ - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - // Create the node if it dosen't exist - if( !`objExists $exportSettingsNode` ) - { - select -clear; - string $settingsNode = `group -empty`; - rename $settingsNode $exportSettingsNode; - select -clear; - } - - if( `objExists $exportSettingsNode` ) - { - if( !`attributeExists "AnimRanges" $exportSettingsNode` ) - { - addAttr -ln "AnimRanges" -dt "string" $exportSettingsNode; - } - setAttr ($exportSettingsNode+".AnimRanges") -type "string" $rangesString; - } -} - -global proc cryAnimSaveRangesStringArray( string $ranges[] ) -{ - string $rangesString = ""; - int $count = 0; - for( $range in $ranges ) - { - if( $count > 0 ) $rangesString += ","; - $rangesString += $range; - $count++; - } - - cryAnimSaveRangesString $rangesString; -} - -global proc int cryAnimGetNumRanges() -{ - string $rangesString = `cryAnimLoadRangesString`; - string $tokens[]; - $numTokens = `tokenize $rangesString "," $tokens`; - - // We still get 1 token even if the string is empty, so test for that and make sure we return 0 as the range count - if( $numTokens == 1 && size($tokens[0]) == 0 ) - $numTokens = 0; - - return $numTokens; -} - -global proc string[] cryAnimGetRanges() -{ - string $rangesString = `cryAnimLoadRangesString`; - string $tokens[]; - $numTokens = `tokenize $rangesString "," $tokens`; - return $tokens; -} - -global proc string[] cryAnimGetRangeNames() -{ - string $animRanges[]; - $animRanges = `cryAnimGetRanges`; - int $rangeCount = `cryAnimGetNumRanges`; - string $animNames[]; - - for( $i = 0;$i<$rangeCount;$i++ ) - { - string $decode[]; - //bypassing plug-in command for python script - //$decode = `cryExportDecodeRangeString $animRanges[$i]`; - $decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $animRanges[$i] + "\")"); - if( size($decode) >= 5 ) - { - $animNames[$i] = $decode[2]; - } - } - - return $animNames; -} - -global proc cryAnimRemoveAnimRange( int $index ) -{ - int $numRanges = `cryAnimGetNumRanges`; - if( $index >= 0 && $index < $numRanges ) - { - string $ranges[] = `cryAnimGetRanges`; - stringArrayRemoveAtIndex $index $ranges; - cryAnimSaveRangesStringArray $ranges; - } -} - -global proc cryAnimRemoveAllAnimRanges() -{ - int $numRanges = `cryAnimGetNumRanges`; - if( $numRanges > 0 ) - { - cryAnimSaveRangesString ""; - } -} - -global proc cryAnimReplaceRange( int $index, string $rangeString ) -{ - int $numRanges = `cryAnimGetNumRanges`; - if( $index >= 0 && $index < $numRanges ) - { - string $ranges[] = `cryAnimGetRanges`; - - $ranges[$index] = $rangeString; - - cryAnimSaveRangesStringArray $ranges; - } -} - - - -//modified 12/15/2014 to include layers -global proc string cryAnimFormatRangeString( string $start, string $end, string $name, string $root, string $path, string $layers ) -{ - string $rangeString = ("[" + $start + "-" + $end + "] - " + $name + " - " + $root + " - " + $path ); - - if($layers != "") - $rangeString = ($rangeString + " - " + $layers); - - return $rangeString; -} - -global proc cryAnimAddRange( string $rangeString ) -{ - int $numRanges = `cryAnimGetNumRanges`; - string $ranges[] = `cryAnimGetRanges`; - - for( $range in $ranges ) - { - if( `strcmp $range $rangeString` == 0 ) // An identical range is already in the ranges list. - { - return; - } - } - - $ranges[$numRanges] = $rangeString; - - cryAnimSaveRangesStringArray $ranges; -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// returns the current status of the anim layers -// returns name of anim layer, whether layer is set to mute or solo -// returns data as a mel command that can be executed to restore the settings -// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -global proc string cryReturnActiveAnimLayers() -{ - string $sel[] = `ls -type "animLayer"`; - - string $returnString = ""; - - for($cur in $sel) - { - int $mute = `getAttr ($cur + ".mute")`; - int $solo = `getAttr ($cur + ".solo")`; - - string $layer = ("setAttr " + $cur + ".mute " + $mute + ";setAttr " + $cur + ".solo " + $solo + ";"); - $returnString = $returnString+$layer; - - } - - return $returnString; - -} \ No newline at end of file diff --git a/Tools/maya/script/cryDecorators.py b/Tools/maya/script/cryDecorators.py deleted file mode 100755 index 2298a94301..0000000000 --- a/Tools/maya/script/cryDecorators.py +++ /dev/null @@ -1,69 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -from maya import cmds -from functools import wraps -import inspect - -import logging -logging.basicConfig() -log = logging.getLogger(__name__) -log.setLevel(logging.DEBUG) - -def pluginDependency(sPlugin, bEnableAutoLoad=False, bErrorOnFailure=False): - ''' - This is a decorator, to be used with functions that expect a certain plugin to be loaded. - If the required plugin is not already loaded, it will try to load it, before calling the decorated function. - If the plugin cannot be loaded, it will raise an exception and return None without calling the decorated function. - - The plugin's name needs to be supplied as a string, like so: - @pluginDepdendency("myPlugin.mll) - def myFunction(): - # do things... - ''' - print('sPlugin: %s' % sPlugin) - - def decorator(fFunction): - @wraps(fFunction) - def wrapper(*args, **kwargs): - # check for plugin and try to load it if necessary - bPluginLoaded = False - - if not cmds.pluginInfo(sPlugin, query=True, loaded=True): - log.debug("Plugin not loaded. Attempting to load: " + sPlugin) - - try: - cmds.loadPlugin(sPlugin) - if bEnableAutoLoad: - cmds.pluginInfo(sPlugin, edit=True, autoload=True) - bPluginLoaded = True - except Exception as eException: - sModule = (inspect.getmodule(fFunction)).__name__ - #sFile = inspect.getsourcefile(fFunction) - #sLine = (inspect.getsourcelines(fFunction))[-1] - sMessage = str(eException) + "Aborting function call: " + sModule + "." + fFunction.__name__ - - if bErrorOnFailure: - cmds.error(sMessage) - else: - cmds.warning(sMessage) - else: - bPluginLoaded = True - - if bPluginLoaded: - log.debug("Plugin loaded. Continuing function: " + fFunction.__name__) - - return fFunction(*args, **kwargs) - else: - return None - - return wrapper - - return decorator \ No newline at end of file diff --git a/Tools/maya/script/cryExport.mel b/Tools/maya/script/cryExport.mel deleted file mode 100644 index 3fb053b079..0000000000 --- a/Tools/maya/script/cryExport.mel +++ /dev/null @@ -1,1867 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -///////////////////////////////////////////////////////////////////////////////// -// -// CryExport.mel -// -// library for general export into the CryEngine -// -// last modified 1/13/2014 br C. R. Morgan -// -////////////////////////////////////////////////////////////////////////////////////// - -//source "cryValidate.mel"; -//source "cryAnim.mel"; -source "LumberyardGeometry.mel"; -cryExportSourceDependencies(); -python( "import mayaAnimUtilities as mau" ); - -global string $dummyPlaneMat = "dummyPlane_mat"; -global string $dummyPlaneMatGroup = "dummyPlane_mat_group"; - -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -// General utils -global proc int cryUtilOptionVarBool( string $optionVar ) -{ - int $value = 0; - if(`optionVar -exists $optionVar` ) - { - $value = `optionVar -q $optionVar`; - } - return $value; -} - -proc cryUtilMirrorChangeOnSelectedCore( string $nodeAttribute ) -{ - string $tokens[]; - $numTokens = `tokenize $nodeAttribute "." $tokens`; - - //print $nodeAttribute; - - if( $numTokens == 2 ) - { - $value = `getAttr $nodeAttribute`; - string $type = `getAttr -type $nodeAttribute`; - - string $selected[] = `ls -sl`; - for( $node in $selected ) - { - if($type == "string") - setAttr -type "string" ($node+"."+$tokens[1]) $value; - else - setAttr ($node+"."+$tokens[1]) $value; - } - } -} -global proc cryUtilMirrorChangeOnSelected( string $nodeAttribute ) -{ - if( catchQuiet( `cryUtilMirrorChangeOnSelectedCore $nodeAttribute` ) ) - { - warning "Failed to copy change to all selected nodes."; - } -} - -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -// Plugin loading and unloading -global proc string cryGetPluginName() -{ - string $version = `about -version`; - - string $pluginName = "MayaCryExport2"; - - int $use64 = 0; - - if( `gmatch $version "*2009*"` == 1 ) - $pluginName += "2009"; - else if( `gmatch $version "*2010*"` == 1 ) - $pluginName += "2010"; - else if( `gmatch $version "*2011*"` == 1 ) - $pluginName += "2011"; - else if( `gmatch $version "*2012*"` == 1 ) - $pluginName += "2012"; - else if( `gmatch $version "*2013*"` == 1 ) - { - if (int(`about -api`)<=201349) - $pluginName += "2013"; - else - error "No current Plugin Compiled for Maya2013Ext build"; - } - else if( `gmatch $version "*2014*"` == 1 ) - { - $pluginName += "2014"; - $use64 = 1; - } - else if( `gmatch $version "*2015*"` == 1 ) - { - $pluginName += "2015"; - $use64 = 1; - } - else if( `gmatch $version "*2016*"` == 1 ) - { - $pluginName += "2016"; - $use64 = 1; - } - else if( `gmatch $version "*2017*"` == 1 ) - { - $pluginName += "2017"; - $use64 = 1; - } - - if( `gmatch $version "*x64*"` == 1 ) - $use64 = 1; - - if( $use64 == 1 ) - $pluginName += "_64"; - - $pluginName += ".mll"; - - return $pluginName; -} - -global proc int cryLoadPluginQuiet() -{ - string $pluginName = `cryGetPluginName`; - - string $pluginPathString = `getenv MAYA_PLUG_IN_PATH`; - string $pluginPathArray[]; - $pluginPathArray = stringToStringArray($pluginPathString, ";"); - - int $pluginLoaded = 0; - for( $pluginPath in $pluginPathArray ) - { - string $fullPluginName = ( $pluginPath + "/" + $pluginName ); - if( !catchQuiet( `loadPlugin -quiet $fullPluginName` ) ) - { - $pluginLoaded = 1; - pluginInfo -edit -autoload true $pluginName; - loadPlugin -quiet $pluginName; // Load again to make sure the autoload take's effect. - print( "Loaded Lumberyard plugin from `" + $fullPluginName + "`." ); - break; - } - } - - return $pluginLoaded; -} - -global proc cryLoadPlugin( ) -{ - if( `cryLoadPluginQuiet` == 0 ) - { - string $pluginName = `cryGetPluginName`; - confirmDialog -title "Lumberyard Export" -message ("Plugin `"+$pluginName+"` could not be found.") -button "OK"; - } -} - -global proc cryUnloadPlugin() -{ - string $pluginName = `cryGetPluginName`; - - if( catchQuiet( `pluginInfo -edit -autoload false $pluginName` ) ) - { - confirmDialog -title "Lumberyard Export" -message ("Plugin `"+$pluginName+"` could not be found.") -button "OK"; - } - else - { - evalDeferred( "unloadPlugin " + $pluginName ); - } -} - -global proc int cryPluginIsLoaded() -{ - string $pluginArray[]; - $pluginArray = `pluginInfo -query -listPlugins`; - for( $pluginName in $pluginArray ) - { - if( startsWith( $pluginName, "MayaCryExport" ) ) - return 1; - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -proc int cryExportGetInstalledBuildCount( ) -{ - string $rootList = `cryMayaSupportPlugin getEngineRootList`; - string $roots[]; - $numRoots = `tokenize $rootList ";" $roots`; - return $numRoots; -} - -proc string[] cryExportGetInstalledBuildInfo( int $index ) -{ - string $return[]; - string $rootList = `cryMayaSupportPlugin getEngineRootList`; - string $roots[]; - $numRoots = `tokenize $rootList ";" $roots`; - if( $index < $numRoots ) - { - string $tokens[]; - $numTokens = `tokenize $roots[$index] "," $tokens`; - - if( $numTokens == 2 ) - { - $return[0] = $tokens[0]; - $return[1] = $tokens[1]; - } - } - return $return; -} - -proc string cryExportGetInstalledBuildEntry( int $index ) -{ - string $buildInfo[] = `cryExportGetInstalledBuildInfo $index`; - string $entry = ""; - if( size($buildInfo) == 2 && size($buildInfo[0]) > 0 && size($buildInfo[1]) > 0 ) - $entry = ($buildInfo[0] + " - (" + $buildInfo[1] + ")"); - return $entry; -} - -proc string[] cryExportDecodeRCSelectionString( string $selectionString ) -{ - string $return[]; - - if( `gmatch $selectionString "<*>"` == 0 ) - { - // Extract the build path from the entry in the enum menu. - string $tokens[]; - $numTokens = `tokenize $selectionString "(" $tokens`; - if( $numTokens == 2 ) - { - string $rcName = $tokens[0]; - if( size($rcName) > 3 ) - $rcName = `substring $rcName 1 (size($rcName)-3)`; - $numTokens = `tokenize $tokens[1] ")" $tokens`; - if( $numTokens == 1 ) - { - string $buildPath = $tokens[0]; - $return[1] = $buildPath; - $return[0] = $rcName; - } - } - } - return $return; -} - -proc int cryExportSceneHasValidName() -{ - string $sceneName; - $sceneName = `file -q -sceneName`; - if( size($sceneName) == 0 ) - return 0; - - return 1; -} - -proc int cryExportGetExportNodeCount() -{ - - string $exportNodes[]; - $exportNodes = `cryMayaSupportPlugin gatherExportNodes`; - int $exportNodeCount = size($exportNodes); - - return $exportNodeCount; -} - -global proc cryValidateComplete() -{ - source cryValidate.mel; - if( !`cryPluginIsLoaded` ) - cryLoadPluginQuiet; - - if( !`cryPluginIsLoaded` ) - { - confirmDialog -title "Lumberyard Export" -message "The MayaCryExport plugin is not loaded." -button "OK"; - } - else - { - cryValidatePlugin complete; - } -} - -global proc int cryExportCheckStatus() -{ - if( !`cryPluginIsLoaded` ) - cryLoadPluginQuiet; - int $pluginLoaded = `cryPluginIsLoaded`; - if( !$pluginLoaded ) - confirmDialog -title "Lumberyard Export" -message "The MayaCryExport plugin is not loaded." -button "OK"; - - int $validSceneName = `cryExportSceneHasValidName`; - if( !$validSceneName ) - confirmDialog -title "Lumberyard Export" -message "The current scene needs to be saved before you can export." -button "OK"; - - return $pluginLoaded && $validSceneName; -} - -global proc string cryExportRelativeToAbsolutePath( string $inPath ) -{ - // Get the current path of the scene - string $currentPath = `file -q -sceneName`; - $currentPath = `dirname $currentPath`; - // Ensure consistent formatting on the input path - string $path = `fromNativePath $inPath`; - - // Break both into a series of path tokens - string $currentPathTokens[]; - $currentNumTokens = `tokenize $currentPath "/" $currentPathTokens`; - string $pathTokens[]; - $pathNumTokens = `tokenize $path "/" $pathTokens`; - - for( $pathToken in $pathTokens ) - { - if($pathToken == "..") - { - $currentNumTokens--; - } - else if($pathToken != ".") - { - $currentPathTokens[$currentNumTokens] = $pathToken; - $currentNumTokens++; - } - } - - string $returnPath = ""; - for($i = 0; $i < $currentNumTokens; $i++) - { - $returnPath += ($currentPathTokens[$i] + "/"); - } - return $returnPath; -} - -global proc string cryExportFixupPath( string $inPath ) -{ - string $currentPath = `file -q -sceneName`; - string $path = `fromNativePath $inPath`; - $currentPath = `dirname $currentPath`; - - string $currentPathTokens[]; - $currentNumTokens = `tokenize $currentPath "/" $currentPathTokens`; - string $pathTokens[]; - $pathNumTokens = `tokenize $path "/" $pathTokens`; - - string $outPath = ""; - $minTokens = `min $currentNumTokens ($pathNumTokens-1)`; - - for( $i=0;$i<$minTokens;$i++ ) - { - $pathTokens[$i] = `tolower $pathTokens[$i]`; - $currentPathTokens[$i] = `tolower $currentPathTokens[$i]`; - if( `strcmp $pathTokens[$i] $currentPathTokens[$i]` != 0 ) - break; - } - if( $i == 0 ) - { - $outPath = $inPath; - } - else - { - for( $j=$i;$j<$currentNumTokens;$j++ ) - $outPath += "../"; - for( $j=$i;$j<$pathNumTokens;$j++ ) - $outPath += ($pathTokens[$j] + "/"); - } - - { // To remove the trailing `/` if there is one. - string $filename = `basename $outPath ""`; - $outPath = `dirname $outPath`; - if($outPath != "") - { - if (endsWith($outPath, "/")) - { - $outPath += $filename; - } - else - { - $outPath += ("/" + $filename); - } - } - else - { - $outPath = $filename; - } - } - - return $outPath; -} - -global proc string[] cryExportDecodeRangeString( string $animRange ) -{ - string $decode[]; - //$decode = `cryMayaSupportPlugin decodeAnimRangeString $animRange`; - - //bypassing crytek plug-in function - $decode = `python("mau.AMZN_DecodeAnimRangeString(\"" + $animRange + "\")")`; - - /*for( $i = 0;$i 0 && size($decode[1]) > 0) - { - $options += "customRCPath=" + $decode[1] + ";"; - } - } - - return $options; -} - -proc string cryExportGetGeometryExportSettings() -{ - string $options = ""; - $options += "cryExportType=geom" + ";"; - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - if((`objExists $exportSettingsNode`)&&(`attributeExists "ExportSettings" $exportSettingsNode`)) - { - //tokenizes the export settings - string $attributeName = $exportSettingsNode + ".ExportSettings"; - string $temp = `getAttr -as $attributeName`; - string $tempBuffer[]; - tokenize $temp ";" $tempBuffer; - - for ($entry in $tempBuffer) - { - string $customFilePathTest = $entry; - if(`gmatch $customFilePathTest "customFilePath=*"`) - { - string $newBuffer[]; - tokenize $customFilePathTest "=" $newBuffer; - - if((size($newBuffer) == 2)&&( $newBuffer[1] != "")) - $options += "cryExportCustomFilePath=" + $newBuffer[1] + ";"; - break; - } - } - } - - // Only export selected materials - $options += "crySelectedMaterialsOnly=1;"; - - return $options; -} - -proc cryExportGeometryUISelection() -{ - string $selectedNodes[] = `textScrollList -q -selectItem CRYEXPORT_EXPORTNODES`; - if( size($selectedNodes) == 0 ) - { - $selectedNodes = `textScrollList -q -allItems CRYEXPORT_EXPORTNODES`; - } - - cryExportGeometry $selectedNodes 1 `cryExportGetAdditionalExportOptions`; -} - -// No checking in here. This function should only be called after the validate has passed. -global proc cryExportGeometry(string $selectedNodes[], int $blockOnWarnings, string $additionalOptions) -{ - if( size($selectedNodes) == 0 ) - { - return; - } - string $options = `cryExportGetGeometryExportSettings`; - // Added the selected nodes option if needed. - if( size($selectedNodes) > 0 ) - { - $options += "selectedExportNodes="; - for( $i = 0; $i < size($selectedNodes); $i++ ) - { - if( $i > 0 ) - { - $options += ","; - } - $options += ($selectedNodes[$i]); - } - $options += ";"; - if( $blockOnWarnings == 0 ) - { - $options += "quiet=warnings;"; - } - } - // Add dummy plane for skeleton if needed - string $dummyPlaneArray[] = `cryExportCheckAndAddDummyPlane $selectedNodes`; - - $options += $additionalOptions; - - print("Export Options : `"+$options+"`\n"); - file -op $options -typ "MayaCryExport" -pr -ea "dummyExportName"; - - // Remove added dummy plane for skeleton - cryExportRemoveDummyPlane $dummyPlaneArray; -} - -// Check if any export node contains a skeleton but no mesh (the mesh should be skinned to the skeleton). -// If so, add a dummy plane mesh to that node and skin it to the skeleton. -// Parameter selectedExportNodes: list of export nodes to export -global proc string[] cryExportCheckAndAddDummyPlane(string $selectedExportNodes[]) -{ - global string $dummyPlaneMat; - global string $dummyPlaneMatGroup; - string $dummyPlaneArray[]; - int $planeId = 0; - for ($exportNode in $selectedExportNodes) - { - string $exportTarget = `getAttr ($exportNode + ".exportTarget")`; - int $hasSkel = `nodeType $exportTarget` == "joint"; - int $hasMesh = false; - string $skelName; - - if ($hasSkel) - { - // The export target is a root bone, use it - $skelName = $exportTarget; - } - else - { - $hasMesh = `nodeType $exportTarget` == "transform" && size(`listRelatives -shapes $exportTarget`) > 0; - if (!$hasMesh) - { - string $allContentNodes[] = `listRelatives -fullPath -children $exportTarget`; - for ($contentNode in $allContentNodes) - { - if (`nodeType $contentNode` == "transform") - { - $hasMesh = true; - } - if (`nodeType $contentNode` == "joint") - { - $hasSkel = true; - $skelName = $contentNode; - } - } - } - } - - // if this export contains a skeleton but no mesh, - // create a mesh and skin it to the skeleton - if ($hasSkel && !$hasMesh) - { - string $shortName[] = `ls $skelName`; - string $dummyPlane = ($shortName[0] + "_dummyPlane"); - polyPlane -n $dummyPlane -w 1 -h 1 -sx 1 -sy 1; - float $pos[] = `xform -q -ws -t $skelName`; - move -absolute $pos[0] $pos[1] $pos[2] $dummyPlane; - skinCluster $skelName $dummyPlane; - addAttr -ln "skelRoot" -dt "string" $dummyPlane; - setAttr -type "string" ($dummyPlane + ".skelRoot") $skelName; - addAttr -ln "exportNode" -dt "string" $dummyPlane; - setAttr -type "string" ($dummyPlane + ".exportNode") $exportNode; - if( $exportTarget == $skelName ) - { - // Selected node is skeleton root bone, change exportTarget to dummy plane. - setAttr -type "string" ($exportNode + ".exportTarget") $dummyPlane; - } - else - { - // Add dummy plane to group node - parent $dummyPlane $exportTarget; - parent -world $skelName; - } - - // create a material for dummy plane if not any - if (size(`ls $dummyPlaneMat`) == 0) - { - shadingNode -asShader lambert -name $dummyPlaneMat; - // Note: even though the dummy plane is using "Proxy" No Draw type material, - // it won't make the plane as physics proxy, but just make it invisible. - cryExportAddEnumAttribute $dummyPlaneMat "physicalise" `cryExportGetMaterialPhysicalizeEnumString`; - // ProxyNoDraw = 2 - setAttr ($dummyPlaneMat + ".physicalise") 2; - cryMaterialCreateGroup $dummyPlaneMatGroup; - cryMaterialMoveShaderToGroup $dummyPlaneMatGroup $dummyPlaneMat; - cryMaterialRebuildGroup $dummyPlaneMatGroup; - } - select -r $dummyPlane; - hyperShade -assign $dummyPlaneMat; - $dummyPlaneArray[$planeId] = $dummyPlane; - $planeId++; - - string $exportPath = `cryExportGetExportSettingValue "customFilePath"`; - if (`attributeExists "NodeCustomExportPath" $exportNode`) - { - string $nodePath = `getAttr ($exportNode + ".NodeCustomExportPath")`; - if ($nodePath != "") - { - $exportPath = $nodePath; - } - } - cryExportGenerateMaterialFileToFilePath true $exportPath 1; - } - } - return $dummyPlaneArray; -} - -// Remove formerly added dummy mesh plane for the skeleton -// Parameter dummyPlaneArray: list of added dummy planes -global proc cryExportRemoveDummyPlane(string $dummyPlaneArray[]) -{ - global string $dummyPlaneMat; - global string $dummyPlaneMatGroup; - - for ($dummyPlane in $dummyPlaneArray) - { - string $skelRoot = `getAttr -asString ($dummyPlane + ".skelRoot")`; - string $exportNode = `getAttr -asString ($dummyPlane + ".exportNode")`; - string $groupNode[] = `listRelatives -p $dummyPlane`; - if( size($groupNode) == 0 ) - { - // When there is no group for skeleton, we create dummy plane in world space so it has no parent. - // The exportTarget is re-targeted so we need to revert it back. - setAttr -type "string" ($exportNode + ".exportTarget") $skelRoot; - } - else - { - parent $skelRoot $groupNode[0]; - } - delete $dummyPlane; - } - // delete the shader and material group - if (size(`ls $dummyPlaneMatGroup`) != 0) - { - cryMaterialDeleteGroup $dummyPlaneMatGroup; - } - if (size(`ls $dummyPlaneMat`) != 0) - { - delete $dummyPlaneMat; - } - // remove the relevant shader engine assets - string $dummyPlaneMatSGArray[] = `ls -type shadingEngine ($dummyPlaneMat + "*")`; - for ($dummyPlaneMatSG in $dummyPlaneMatSGArray) - { - delete $dummyPlaneMatSG; - } -} - -global proc cryExportValidateAndExport() -{ - cryExportSaveSettings; - if( `cryExportCheckStatus` ) - { - cryExportGeometryUISelection; - } -} - -global proc cryExportGenerateMaterialFileToFilePath(int $isSkeletonDummyPlaneMeshMaterial, string $customFilePath, int $showDialogs) -{ - if( `cryExportCheckStatus` ) - { - string $options = ""; - $options += "cryExportType=material" + ";"; - - // if the custom path is not empty, then append the customFilePath option - if($customFilePath != "") - { - $options += "cryExportCustomFilePath=" + $customFilePath + ";"; - } - - // Only export selected materials - $options += "crySelectedMaterialsOnly=1;"; - - if ($isSkeletonDummyPlaneMeshMaterial) - { - $options += "skeletonDummyPlaneMesh=1;"; - } - - if ($showDialogs == 0) - { - $options += "quiet=warnings;"; - } - - print("Export Material Options: `"+$options+"`\n"); - - if( catchQuiet( `file -op $options -typ "MayaCryExport" -pr -ea "dummyExportName"` ) ) - { - confirmDialog -title "Lumberyard Export" -message ("Failed to write material file.") -button "OK"; - } - } -} - -global proc cryExportGenerateMaterialFile(int $isSkeletonDummyPlaneMeshMaterial) -{ - string $customFilePath = `textFieldButtonGrp -q -text CRYEXPORT_CUSTOMFILEPATH`; - if( `gmatch $customFilePath "<*>"` ) - { - $customFilePath = ""; - } - cryExportGenerateMaterialFileToFilePath $isSkeletonDummyPlaneMeshMaterial $customFilePath 1; -} - -global proc cryExportExportAnim(int $selectedIndices[]) -{ - if( `cryExportCheckStatus` ) - { - string $animRanges[]; - $animRanges = `cryAnimGetRanges`; - int $rangeCount = `cryAnimGetNumRanges`; - - //store original layer settings - string $originalLayerSettings = cryReturnActiveAnimLayers(); - - //int $selectedIndices[] = `textScrollList -q -selectIndexedItem CRYEXPORT_ANIMRANGES`; - if (size($selectedIndices) == 0) - { - for ($count = 0; $count<$rangeCount; $count++) - { - $selectedIndices[$count] = ($count+1); - } - } - - //iterate through animRanges - for ($selectionIndex = 0; $selectionIndex < size($selectedIndices); $selectionIndex++) - { - int $animIndex = $selectedIndices[$selectionIndex]-1; - string $animRange = $animRanges[$animIndex]; - - print( "Exporting anim range :: `" + $animRange + "`\n"); - - string $decode[]; - //bypassing c++ code with python call - //$decode = `cryExportDecodeRangeString $animRange`; - $decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $animRange + "\")"); - if (size($decode) >= 5) - { - - //pre-export commands here - //assuming item 5 in array are animLayers commands - string $layerCommand = ""; - if ((size($decode) > 5) && ($decode[5] != "")) - { - $layerCommand = $decode[5]; - } - else if($originalLayerSettings != "") - { - $layerCommand = $originalLayerSettings; - } - - string $animStart = $decode[0]; - string $animEnd = $decode[1]; - string $animName = $decode[2]; - string $animRoot = $decode[3]; - string $animPath = $decode[4]; - - cryIssueAnimationExportCommand($animStart, $animEnd, $animName, $animRoot, $animPath, $layerCommand, 1, cryExportGetAdditionalExportOptions()); - } - } - - //resetting animLayers - if($originalLayerSettings != "") - { - eval($originalLayerSettings); - } - } -} - -global proc cryIssueAnimationExportCommand(string $startFrame, string $endFrame, string $exportName, string $rootJoint, string $exportPath, string $layerCommand, int $blockOnWarnings, string $additionalOptions) -{ - if($layerCommand != "") - { - eval($layerCommand); - } - - string $options = ""; - $options += "cryExportCustomAnimStartFrame=" + $startFrame +";"; - $options += "cryExportCustomAnimEndFrame=" + $endFrame + ";"; - $options += "cryExportType=customAnim" + ";"; - $options += "cryExportCustomName=" + $exportName + ";"; - $options += "cryExportCustomAnimRootNode=" + $rootJoint + ";"; - $options += "cryExportCustomFilePath=" + $exportPath + ";"; - - $options += "cryExportAnimIndex=" + 0 +";"; - - if($blockOnWarnings == 0) - { - $options += "quiet=warnings;"; - } - - $options += $additionalOptions; - - file -op $options -typ "MayaCryExport" -pr -ea "dummyExportName"; -} - -global proc cryExportRebuildControls( ) -{ - string $selectedNodes[]; - $selectedNodes = `ls -sl`; - - if( !`layout -exists CRYEXPORT_NODEOPTIONSFRAME` ) - { - return; - } - - setParent CRYEXPORT_NODEOPTIONSFRAME; - - // Delete all children - string $childArray[]; - $childArray = `layout -q -childArray CRYEXPORT_NODEOPTIONSFRAME`; - for( $child in $childArray ) - { - deleteUI $child; - } - - columnLayout -adjustableColumn true; - { - if( size($selectedNodes) > 0 ) - { - string $node = $selectedNodes[0]; - string $lowerNode = tolower( $node ); - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - if( startsWith( $lowerNode, $lumberyardExportNodePrefix ) ) - { - if( `attributeExists "fileType" $node` ) - { - string $nodeAttribute = ($node+".fileType"); - attrEnumOptionMenu -label "File Type" -attribute $nodeAttribute -changeCommand ("cryUtilMirrorChangeOnSelected "+$nodeAttribute); - } - if( `attributeExists "DoNotMerge" $node` ) - { - string $control = `checkBox -label "Do Not Merge Nodes"`; - string $nodeAttribute = ($node+".DoNotMerge"); - connectControl $control $nodeAttribute; - checkBox -e -changeCommand ("cryUtilMirrorChangeOnSelected "+$nodeAttribute) $control; - } - if( `attributeExists "WriteVertexColours" $node` ) - { - string $control = `checkBox -label "Write Vertex Colours"`; - string $nodeAttribute = ($node+".WriteVertexColours"); - connectControl $control $nodeAttribute; - checkBox -e -changeCommand ("cryUtilMirrorChangeOnSelected "+$nodeAttribute) $control; - } - if( `attributeExists "UseF32VertexFormat" $node` ) - { - string $control = `checkBox -label "32 Bit Vertex Format"`; - string $nodeAttribute = ($node+".UseF32VertexFormat"); - connectControl $control $nodeAttribute; - checkBox -e -changeCommand ("cryUtilMirrorChangeOnSelected "+$nodeAttribute) $control; - } - if( `attributeExists "EightWeightsPerVertex" $node` ) - { - string $control = `checkBox -label "Export with 8 weights (SKIN only)"`; - string $nodeAttribute = ($node+".EightWeightsPerVertex"); - connectControl $control $nodeAttribute; - checkBox -e -changeCommand ("cryUtilMirrorChangeOnSelected "+$nodeAttribute) $control; - } - if( `attributeExists "NodeCustomExportPath" $node` ) - { - rowLayout -numberOfColumns 3; - { - text -label "Custom Export Path"; - string $nodeAttribute = ($node+".NodeCustomExportPath"); - textField -width 160 -cc ("setAttr -type \"string\"" + $nodeAttribute + "`textField -q -text CRYEXPORT_NODECUSTOMEXPORTPATH`; cryUtilMirrorChangeOnSelected(\"" + $nodeAttribute +"\")") CRYEXPORT_NODECUSTOMEXPORTPATH; - - button -label ".." -command ("fileBrowserDialog -m 4 -fc \"cryExportEditCustomNodeExportPath\" -ft \"\" -an \"\" -om \"Import\""); - string $plugName = "NodeCustomExportPath"; - string $currentString = `getAttr -asString ($node + "." + $plugName)`; - textField -e -text $currentString CRYEXPORT_NODECUSTOMEXPORTPATH; - textField -e -annotation $currentString CRYEXPORT_NODECUSTOMEXPORTPATH; - } - setParent ..; - } - } - } - } - setParent ..; -} - -global proc cryExportAddEnumAttribute( string $node, string $plugName, string $inEnumList ) -{ - // First, expand the enumList if it dosn't have `=` in it. e.g. "one:two:tree" --> "one=0:two=1:three=2" - string $enumList = $inEnumList; - if( !`gmatch $inEnumList "*=*"` ) - { - string $tempString = ""; - string $tokens[]; - $numTokens = `tokenize $inEnumList ":" $tokens`; - for( $i = 0;$i<$numTokens;$i++ ) - { - if( $i > 0 ) $tempString += ":"; - $tempString += ($tokens[$i] + "=" + $i); - } - $enumList = $tempString; - } - - // Now add the enum - int $exists = eval("attributeExists " + $plugName + " " + $node); - string $currentString = ""; - - // We need to delete the attribute if it already exists in case the options have changed - if( $exists == true ) - { - $currentString = eval("getAttr -asString " + $node + "." + $plugName); - eval("deleteAttr -at " + $plugName + " " + $node); - } - - string $cmd = ("addAttr -dv 0 -ln " + $plugName + " -at enum -enumName \""); - $cmd += $enumList; - $cmd += "\" " + $node; - eval( $cmd ); - - // If it existed before, reselect the entry - if( $exists == true ) - { - string $enums = `addAttr -q -enumName ($node+"."+$plugName)`; - string $tokens[]; - $numTokens = `tokenize $enums ":" $tokens`; - for( $i = 0;$i<$numTokens;$i++ ) - { - if( $tokens[$i] == $currentString ) - { - eval("setAttr " + $node + "." + $plugName + " " + $i); - break; - } - } - } -} - -proc cryExportAddShaderAttributes() -{ - string $shaderNodes[]; - $shaderNodes = `ls -type lambert -type hwShader`; - - for( $shader in $shaderNodes ) - { - // Add the physics enum - cryExportAddEnumAttribute $shader "physicalise" `cryExportGetMaterialPhysicalizeEnumString`; - } -} - -global proc string cryExportGetFileTypeEnumString() -{ - return "Geometry (.CGF):Character (.CHR):Animated Geometry (.CGA):Character Skin (.SKIN)"; -} - -global proc string cryExportGetMaterialPhysicalizeEnumString() -{ - return "None:Default:ProxyNoDraw:NoCollide:Obstruct"; -} - -proc cryExportAddNodeAttributes() -{ - ///////////////////////////////////////// - // Add attributes to LumberyardExportNodes - string $nodes[]; - $nodes = `cryMayaSupportPlugin gatherExportNodes`; - for( $node in $nodes ) - { - // Add the export type combo. - cryExportAddEnumAttribute $node "fileType" `cryExportGetFileTypeEnumString`; - - // Add the `Do not merge` option - if( !`attributeExists "DoNotMerge" $node` ) - addAttr -dv 1 -ln DoNotMerge -at "bool" $node; - // Add the `Write Vertex Colours` option - if( !`attributeExists "WriteVertexColours" $node` ) - addAttr -dv 1 -ln WriteVertexColours -at "bool" $node; - if ( !`attributeExists "EightWeightsPerVertex" $node` ) - addAttr -dv 0 -ln EightWeightsPerVertex -at "bool" $node; - if( !`attributeExists "UseF32VertexFormat" $node` ) - addAttr -dv 0 -ln UseF32VertexFormat -at "bool" $node; - // Add the `Custom Export Path` option - if( !`attributeExists "NodeCustomExportPath" $node` ) - addAttr -ln NodeCustomExportPath -dt "string" $node; - // Add export target and hide it - if( !`attributeExists "exportTarget" $node` ) - addAttr -ln exportTarget -dt "string" -hidden false $node; - } - - ///////////////////////////////////////// - // Add attributes to joints - $nodes = `ls "_joint*"`; - for( $node in $nodes ) - { - // NOTE:: Removed for now. Use the UDP window instead. - - // Add the limit attribute - //if( !`attributeExists "limit" $node` ) - // addAttr -dv 100 -ln limit -at "long" $node; - } - - ///////////////////////////////////////// - // Add group attributes - $nodes = `ls "*_group"`; - for( $node in $nodes ) - { - // NOTE:: Removed for now. Use the UDP window instead. - - // Add the Mass attribute - //if( !`attributeExists "mass" $node` ) - // addAttr -dv 10 -ln mass -at "long" $node; - - // Add the entity attribute - //if( !`attributeExists "entity" $node` ) - // addAttr -ln entity -at "bool" $node; - } - - ///////////////////////////////////////// - // Add attribute to real joints - $nodes = `ls -type joint`; - for( $node in $nodes ) - { - if( !`attributeExists "rotXLimited" $node` ) - addAttr -ln "rotXLimited" -at bool $node; - if( !`attributeExists "rotYLimited" $node` ) - addAttr -ln "rotYLimited" -at bool $node; - if( !`attributeExists "rotZLimited" $node` ) - addAttr -ln "rotZLimited" -at bool $node; - - if( !`attributeExists "rotLimitMin" $node` ) - { - addAttr -ln "rotLimitMin" -at float3 $node; - addAttr -ln "rotLimitMinX" -at "float" -p "rotLimitMin" $node; - addAttr -ln "rotLimitMinY" -at "float" -p "rotLimitMin" $node; - addAttr -ln "rotLimitMinZ" -at "float" -p "rotLimitMin" $node; - setAttr -type float3 ($node+".rotLimitMin") 0 0 0; - } - if( !`attributeExists "rotLimitMax" $node` ) - { - addAttr -ln "rotLimitMax" -at float3 $node; - addAttr -ln "rotLimitMaxX" -at "float" -p "rotLimitMax" $node; - addAttr -ln "rotLimitMaxY" -at "float" -p "rotLimitMax" $node; - addAttr -ln "rotLimitMaxZ" -at "float" -p "rotLimitMax" $node; - setAttr -type float3 ($node+".rotLimitMax") 0 0 0; - } - - if( !`attributeExists "spring" $node` ) - { - addAttr -ln "spring" -at float3 $node; - addAttr -ln "springX" -at "float" -p "spring" $node; - addAttr -ln "springY" -at "float" -p "spring" $node; - addAttr -ln "springZ" -at "float" -p "spring" $node; - setAttr -type float3 ($node+".spring") 0 0 0; - } - if( !`attributeExists "springTension" $node` ) - { - addAttr -ln "springTension" -at float3 $node; - addAttr -ln "springTensionX" -at "float" -p "springTension" $node; - addAttr -ln "springTensionY" -at "float" -p "springTension" $node; - addAttr -ln "springTensionZ" -at "float" -p "springTension" $node; - setAttr -type float3 ($node+".springTension") 1 1 1; - } - if( !`attributeExists "damping" $node` ) - { - addAttr -ln "damping" -at float3 $node; - addAttr -ln "dampingX" -at "float" -p "damping" $node; - addAttr -ln "dampingY" -at "float" -p "damping" $node; - addAttr -ln "dampingZ" -at "float" -p "damping" $node; - setAttr -type float3 ($node+".damping") 1 1 1; - } - } -} - -global proc cryExportAddAttributes() -{ - cryExportAddShaderAttributes; - cryExportAddNodeAttributes; - - cryExportRebuildControls; -} - -global proc int cryExportEditCustomNodeExportPath( string $folderPath, string $fileType ) -{ - if( `control -exists CRYEXPORT_NODECUSTOMEXPORTPATH` ) - { - $folderPath = `cryExportFixupPath $folderPath`; - textField -e -text $folderPath CRYEXPORT_NODECUSTOMEXPORTPATH; - - $selectedNodes = `ls -sl`; - string $node = $selectedNodes[0]; - string $nodeAttribute = ($node+".NodeCustomExportPath"); - setAttr -type "string" $nodeAttribute $folderPath; - - cryUtilMirrorChangeOnSelected $nodeAttribute; - } - return 1; -} - -global proc cryExportResetCustomString( string $controlName ) -{ - textFieldButtonGrp -e -text "" $controlName; -} - -global proc cryExportShowInExplorer( string $folderName, string $fileName ) -{ - if(startString($folderName, 1) == ".") - { - $folderName = `cryExportRelativeToAbsolutePath $folderName`; - } - - if (!`filetest -d $folderName`) - error("location does not exist! :'" + $folderName + "'"); - - if ($fileName == "") - { - system( "explorer \"" + toNativePath($folderName) + "\"" ); - return; - } - - if ($fileName != "" && !`filetest -f ($folderName+"/"+$fileName)`) - { - warning("file: '" + $fileName + "' does not exist! Opening folder..."); - system( "explorer \"" + toNativePath($folderName) + "\"" ); - return; - } - - system( "explorer /select,\"" + toNativePath($folderName + $fileName) + "\"" ); -} - -global proc cryExportGeomShowInExplorer( ) -{ - int $validSceneName = `cryExportSceneHasValidName`; - if( !$validSceneName ) - { - confirmDialog -title "Lumberyard Export" -message "The scene needs to be saved first." -button "OK"; - } - else - { - string $sceneFullName = `file -q -sceneName`; - string $scenePath = `dirname $sceneFullName `; - string $sceneName = `file -q -shortName -sceneName`; - - string $exportExt = ".dae.zip"; - string $ext = `fileExtension( $sceneName )`; - string $base = `basename $sceneName ("."+$ext)`; - string $fileName = ($base+$exportExt); - - // Attempt to find the name of the game file so we can select that. - if( `control -exists CRYEXPORT_EXPORTNODES`) - { - string $exportNodes[] = `textScrollList -q -si CRYEXPORT_EXPORTNODES`; - if( size($exportNodes) ) - { - string $exportNode = $exportNodes[0]; - string $lNode = `tolower($exportNode)`; - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - string $filter = $lumberyardExportNodePrefix + "*"; - if (gmatch($lNode, $filter)) - { - $objName = substring($exportNode, 15, size($exportNode)); - $nodes = `ls -long $exportNode`; - if( size($nodes) == 0 ) error( "CryExport: Node `"+$exportNode+"` does not exist." ); - if( size($nodes) > 1 ) warning( "CryExport: Multiple nodes named `" + $exportNode + "`."); - - string $fileTypes[] = {"cgf","chr","cga","skin"}; - string $fileType = $fileTypes[0]; - if (`attributeQuery -node $nodes[0] -exists "fileType"`) - $fileType = $fileTypes[ int(getAttr($nodes[0] + ".fileType")) ]; - - $fileName = ($objName + "." + $fileType); - } - } - } - - string $folderName = $scenePath; - string $customFilePath = `textFieldButtonGrp -q -text CRYEXPORT_CUSTOMFILEPATH`; - if( `gmatch $customFilePath "<*>"` == 0 ) - { - $folderName = $customFilePath; - } - - if( size($folderName) > 2 && `gmatch $folderName "?:*"` == 0 ) - { - $folderName = ($scenePath + "/" + $folderName); - } - - cryExportShowInExplorer $folderName $fileName; - } -} - -global proc cryExportAnimIndexShowInExplorer( int $animIndex ) -{ - int $rangeCount = `cryAnimGetNumRanges`; - - if( $animIndex < $rangeCount ) - { - string $animRanges[]; - $animRanges = `cryAnimGetRanges`; - string $animRange = $animRanges[$animIndex]; - - string $decode[]; - //bypassing c++ call with python call - //$decode = `cryExportDecodeRangeString $animRange`; - $decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $animRange + "\")"); - if( size($decode) >= 5 ) - { - string $animName = $decode[2]; - string $animPath = $decode[4]; - - string $folderName = $animPath; - if( size($animPath) > 2 && `gmatch $animPath "?:*"` == 0 ) - { - string $sceneFullName = `file -q -sceneName`; - string $scenePath = `dirname $sceneFullName `; - - $folderName = ($scenePath + "/" + $folderName); - } - - string $exportExt = ".dae.zip"; - string $fileName = ($animName+$exportExt); - - cryExportShowInExplorer $folderName $fileName; - } - } -} - -global proc cryExportAnimShowInExplorer() -{ - int $selected[] = `textScrollList -q -selectIndexedItem CRYEXPORT_ANIMRANGES`; - if( size($selected) == 0 ) - { - error("Lumberyard Export: You need to have an anim selected first!"); - } - else - { - int $animIndex = $selected[0]-1; - cryExportAnimIndexShowInExplorer $animIndex; - } -} - -global proc int cryExportAnimRangeIsSelected( int $rangeIndex ) -{ - if( `control -exists CRYEXPORT_ANIMRANGES`) - { - int $selected[] = `textScrollList -q -selectIndexedItem CRYEXPORT_ANIMRANGES`; - - if( size($selected) > 0 ) - { - for( $i in $selected ) - { - if( $rangeIndex == $i ) - return 1; - } - return 0; - } - return 1; // If no ranges were selected, then all are for export - } - return -1; // Not able to check. -} - -global proc cryExportUpdateWidgets() -{ - // Update the state of the anim ranges list - int $selected[] = `textScrollList -q -selectIndexedItem CRYEXPORT_ANIMRANGES`; - if( size($selected) > 0 ) - { - button -e -label "Export Selected Anims" CRYEXPORT_EXPORTANIMBUTTON; - button -e -en 1 CRYEXPORT_EXPORTANIMSHOWBUTTON; - } - else - { - button -e -label "Export All Anims" CRYEXPORT_EXPORTANIMBUTTON; - button -e -en 0 CRYEXPORT_EXPORTANIMSHOWBUTTON; - } - - // Update the state of the export node list - $selected = `textScrollList -q -selectIndexedItem CRYEXPORT_EXPORTNODES`; - if( size($selected) > 0 ) - button -e -label "Export Selected" CRYEXPORT_EXPORTGEOMBUTTON; - else - button -e -label "Export All" CRYEXPORT_EXPORTGEOMBUTTON; - - // Update the state of the other controls - if( `control -ex CRYEXPORT_ADDITIVEPOSEFRAMEOPTION` ) - { - int $poseOption = `checkBox -q -value CRYEXPORT_ADDITIVEPOSEFRAMEOPTION`; - intField -e -enable $poseOption CRYEXPORT_ADDITIVEPOSEFRAMEINDEX; - } -} - -global proc cryExportSetExportPathFromBrowser() -{ - string $result[] = `fileDialog2 -fileMode 3 -caption "Set Export Path"`; - string $folderPath; - if (`size($result)` == 0) - { - $folderPath = ""; - } - else - { - $folderPath = `cryExportFixupPath $result[0]`; - } - textFieldButtonGrp -edit -text $folderPath CRYEXPORT_CUSTOMFILEPATH; - // Need to explicitly call save setting here in order to save export path in back-end data. - cryExportSaveSettings; -} - -proc createCryExportWindow() -{ - if(!`window -ex CRYEXPORT_WINDOW`) - { - if(`windowPref -exists CRYEXPORT_WINDOW`) - { - windowPref -tlc `windowPref -q -topEdge CRYEXPORT_WINDOW` `windowPref -q -leftEdge CRYEXPORT_WINDOW` CRYEXPORT_WINDOW; - //windowPref -remove CRYEXPORT_WINDOW; - } - print("\nGetting plugin info...\n"); - string $pluginName = `cryGetPluginName`; - print("PluginName: " + $pluginName + "\n"); - string $pluginVersionString = `pluginInfo -query -version $pluginName`; - print("PluginVersion: " + $pluginVersionString + "\n"); - window -titleBar true -title ("Lumberyard Export - v"+$pluginVersionString) -sizeable false -mnb false -mxb false CRYEXPORT_WINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - $collayout = `columnLayout -adjustableColumn true -rowSpacing 15`; - button -label "Add Attributes" -command ("cryExportAddAttributes"); - - { - frameLayout -borderStyle "etchedOut" -marginHeight 5 -marginWidth 5 -label "Geometry Export" CRYEXPORT_GEOMEXPORTFRAME; - columnLayout -adjustableColumn true; - { - textFieldButtonGrp -label "Export Path" -cc "cryExportSaveSettings" -buttonLabel ".." -cw3 70 50 15 -ct3 "right" "both" "both" -co3 2 2 0 -adj 2 - -buttonCommand ("cryExportSetExportPathFromBrowser") CRYEXPORT_CUSTOMFILEPATH; - popupMenu; - { - menuItem -label "Reset" -c ("cryExportResetCustomString CRYEXPORT_CUSTOMFILEPATH"); - } - textScrollList -height 80 -selectCommand ("cryExportUpdateWidgets") -allowMultiSelection true CRYEXPORT_EXPORTNODES; - popupMenu; - { - menuItem -label "Clear Selection" -c ("textScrollList -e -deselectAll CRYEXPORT_EXPORTNODES; cryExportUpdateWidgets;"); - menuItem -label "Refresh List" -c ("cryExportUpdateExportLists;"); - } - button -label "Export All" -command ("cryExportValidateAndExport") CRYEXPORT_EXPORTGEOMBUTTON; - button -label "Show in Explorer" -command ("cryExportGeomShowInExplorer"); - } - setParent ..; - setParent ..; - } - - { - frameLayout -borderStyle "etchedOut" -marginHeight 5 -marginWidth 5 -label "Material Export" CRYEXPORT_MATERIALFRAME; - columnLayout -adjustableColumn true; - { - button -label "Generate Material Files" -command ("cryExportGenerateMaterialFile false"); - } - setParent ..; - setParent ..; - } - - { - frameLayout -borderStyle "etchedOut" -marginHeight 5 -marginWidth 5 -label "Anim Export" CRYEXPORT_ANIMEXPORTFRAME; - columnLayout -adjustableColumn true; - { - textScrollList -height 80 -selectCommand ("cryExportUpdateWidgets") -allowMultiSelection true CRYEXPORT_ANIMRANGES; - popupMenu; - { - menuItem -label "Clear Selection" -c ("textScrollList -e -deselectAll CRYEXPORT_ANIMRANGES; cryExportUpdateWidgets;"); - menuItem -label "Refresh List" -c ("cryExportUpdateExportLists;"); - } - button -label "Export Selected Anims" -command ("cryExportExportAnim(`textScrollList -q -selectIndexedItem CRYEXPORT_ANIMRANGES`)") CRYEXPORT_EXPORTANIMBUTTON; - button -label "Show in Explorer" -command ("cryExportAnimShowInExplorer") -en 0 CRYEXPORT_EXPORTANIMSHOWBUTTON; - button -label "Anim Manager" -command ("cryAnimManagerWin") CRYEXPORT_EXPORTANIMMANAGERBUTTON; - } - setParent ..; - setParent ..; - } - - { - frameLayout -borderStyle "etchedOut" -marginHeight 5 -marginWidth 5 -label "Export Options" CRYEXPORT_EXPORTOPTIONSFRAME; - checkBox -value 1 -label "Remove Namespaces" -cc "cryExportSaveSettings" CRYEXPORT_REMOVENAMESPACES; - checkBox -value 1 -label "Export ANM's with CGA's." -cc "cryExportSaveSettings" CRYEXPORT_EXPORTANMS; - rowLayout -numberOfColumns 2 -columnWidth2 150 75 -columnOffset2 -1 0 -columnAttach2 "both" "both" -adjustableColumn 2; - { - checkBox -value 0 -label "Add pose frame" -annotation "Add the numbered frame to the start of all animations. Used for additive animations." -cc "cryExportUpdateWidgets" CRYEXPORT_ADDITIVEPOSEFRAMEOPTION; - intField CRYEXPORT_ADDITIVEPOSEFRAMEINDEX; - } - setParent ..; - - // Enabled by default for now. - //if( `cryUtilOptionVarBool "cryExportAllowRCSlection"` == 1 ) - { - optionMenu -width 240 -label "RC" CRYEXPORT_RCSELECTIONMENU; - } - - setParent ..; - } - - { - frameLayout -borderStyle "etchedOut" -marginHeight 5 -marginWidth 5 -label "Node Options" CRYEXPORT_NODEOPTIONSFRAME; - cryExportRebuildControls; - setParent ..; - } - - setParent ..; - $closebutton = `button -label "Close" -command ("cryExportCloseWindow")`; - setParent ..; - - formLayout -edit - -attachForm $collayout "top" 5 - -attachForm $collayout "left" 5 - -attachForm $collayout "right" 5 - -attachNone $collayout "bottom" - - -attachForm $closebutton "bottom" 5 - -attachForm $closebutton "left" 5 - -attachForm $closebutton "right" 5 - -attachNone $closebutton "top" - $layout1; - - cryExportUpdateExportLists; - cryExportLoadSettings; - - scriptJob -event "SelectionChanged" "cryExportRebuildControls" -p "CRYEXPORT_WINDOW"; - - string $events[] = `scriptJob -listEvents`; - - if( `stringArrayContains "NewSceneOpened" $events` == 1 ) - { - scriptJob -event "NewSceneOpened" "cryExportUpdateExportLists" -p "CRYEXPORT_WINDOW"; - } - if( `stringArrayContains "PostSceneRead" $events` == 1 ) - { - scriptJob -event "PostSceneRead" "cryExportUpdateExportLists" -p "CRYEXPORT_WINDOW"; - } - } - - // Update the export button text - cryExportUpdateWidgets; - showWindow CRYEXPORT_WINDOW; -} - -global proc cryExportUpdateExportLists() -{ - - // Update the anim ranges - if( `control -ex CRYEXPORT_ANIMRANGES` ) - { - string $selected[] = `textScrollList -q -selectItem CRYEXPORT_ANIMRANGES`; - textScrollList -e -removeAll CRYEXPORT_ANIMRANGES; - int $numRanges = `cryAnimGetNumRanges`; - string $animRanges[] = `cryAnimGetRangeNames`; - for( $i = 0;$i<$numRanges;$i++ ) - textScrollList -e -append $animRanges[$i] CRYEXPORT_ANIMRANGES; - // Reselect - for( $item in $selected ) - catchQuiet( `textScrollList -e -selectItem $item CRYEXPORT_ANIMRANGES` ); - } - if( `control -ex CRYEXPORT_EXPORTNODES` ) - { - string $selected[] = `textScrollList -q -selectItem CRYEXPORT_EXPORTNODES`; - textScrollList -e -removeAll CRYEXPORT_EXPORTNODES; - string $exportNodes[] = `cryMayaSupportPlugin gatherExportNodes`; - - for( $node in $exportNodes ) - textScrollList -e -append $node CRYEXPORT_EXPORTNODES; - // Reselect - for( $item in $selected ) - catchQuiet( `textScrollList -e -selectItem $item CRYEXPORT_EXPORTNODES` ); - } - // Update the RC selection list - if( `control -ex CRYEXPORT_RCSELECTIONMENU` ) - { - int $selected = `optionMenu -q -select CRYEXPORT_RCSELECTIONMENU`; - string $children[] = `optionMenu -q -itemListLong CRYEXPORT_RCSELECTIONMENU`; - for( $child in $children ) - deleteUI $child; - - menuItem -p CRYEXPORT_RCSELECTIONMENU -label ""; - $numRoots = `cryExportGetInstalledBuildCount`; - for( $index = 0;$index<$numRoots;$index++ ) - { - string $entry = `cryExportGetInstalledBuildEntry $index`; - menuItem -p CRYEXPORT_RCSELECTIONMENU -label $entry; - } - // Reselect - if( $selected > 0 ) - optionMenu -e -select $selected CRYEXPORT_RCSELECTIONMENU; - } -} - -// Get the index of the named build in the menu items of the dropdown. 1 based. -proc int cryExportInstalledBuildEntryFromBuildName( string $buildName ) -{ - if( `control -exists CRYEXPORT_RCSELECTIONMENU`) - { - string $entries[] = `optionMenu -q -itemListLong CRYEXPORT_RCSELECTIONMENU`; - - for( $index = 0;$index" CRYEXPORT_CUSTOMFILEPATH; - - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - if( `objExists $exportSettingsNode` ) - { - if( `attributeExists "ExportSettings" $exportSettingsNode` ) - { - string $settingsString = `getAttr ($exportSettingsNode+".ExportSettings")`; - string $settings[]; - $numSettings = `tokenize $settingsString ";" $settings`; - - for( $setting in $settings ) - { - string $tokens[]; - $numTokens = `tokenize $setting "=," $tokens`; - if( $numTokens >= 2 ) - { - if( `strcmp $tokens[0] "customFilePath"` == 0 ) - { - textFieldButtonGrp -e -text $tokens[1] CRYEXPORT_CUSTOMFILEPATH; - } - else if( `strcmp $tokens[0] "removeNamespaces"` == 0 ) - { - int $value = $tokens[1]; - checkBox -e -value $value CRYEXPORT_REMOVENAMESPACES; - } - else if( `strcmp $tokens[0] "exportANMs"` == 0 ) - { - int $value = $tokens[1]; - checkBox -e -value $value CRYEXPORT_EXPORTANMS; - } - else if( `strcmp $tokens[0] "addPoseFrame"` == 0 ) - { - int $value = $tokens[1]; - checkBox -e -value $value CRYEXPORT_ADDITIVEPOSEFRAMEOPTION; - } - else if( `strcmp $tokens[0] "poseFrameIndex"` == 0 ) - { - int $value = $tokens[1]; - intField -e -value $value CRYEXPORT_ADDITIVEPOSEFRAMEINDEX; - } - else if( `strcmp $tokens[0] "selectedRC"` == 0 ) - { - string $value = $tokens[1]; - int $entry = `cryExportInstalledBuildEntryFromBuildName $value`; - if( `control -exists CRYEXPORT_RCSELECTIONMENU`) - { - string $array[] = `optionMenu -q -itemListLong CRYEXPORT_RCSELECTIONMENU`; - optionMenu -e -select $entry CRYEXPORT_RCSELECTIONMENU; - } - } - } - } - } - } -} - -global proc cryExportSetExportSettingValue(string $key, string $value) -{ - if( !`objExists LUMBERYARD_EXPORT_GROUP` ) - { - // Create LUMBERYARD_EXPORT_GROUP - group -empty -name LUMBERYARD_EXPORT_GROUP; - } - - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - - if( !`objExists $exportSettingsNode` ) - { - select -clear; - string $settingsNode = `group -empty -parent LUMBERYARD_EXPORT_GROUP`; - rename $settingsNode $exportSettingsNode; - select -clear; - } - - if( !`attributeExists "ExportSettings" $exportSettingsNode` ) - { - addAttr -ln "ExportSettings" -dt "string" $exportSettingsNode; - } - - string $settingsString = `getAttr ($exportSettingsNode+".ExportSettings")`; - string $settings[]; - $settings = `stringToStringArray $settingsString ";"`; - - $settingsString = ""; - int $foundSetting = false; - for( $i = 0; $i < size($settings); $i++ ) - { - string $keyValuePair[]; - int $itemCount = `tokenize $settings[$i] "=" $keyValuePair`; - // We expect all settings to be in the format "key=value" - if($itemCount == 2) - { - if($key == $keyValuePair[0]) - { - if($value == "") - { - //Indicates that the KVP should be removed - stringArrayRemoveAtIndex $i $settings; - } - else - { - $settings[$i] = ($key + "=" + $value); - } - $foundSetting = true; - } - } - $settingsString += $settings[$i] + ";"; - } - - // If we are trying to set an uninitialized setting, append it to the end. - if(!$foundSetting && $value != "") - { - $settingsString += ($key + "=" + $value); - } - - setAttr -type "string" ($exportSettingsNode + ".ExportSettings") $settingsString; -} - -global proc string cryExportGetExportSettingValue(string $key) -{ - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - if( !`objExists $exportSettingsNode` ) - { - return ""; - } - - if( !`attributeExists "ExportSettings" $exportSettingsNode` ) - { - return ""; - } - - string $settingsString = `getAttr ($exportSettingsNode+".ExportSettings")`; - string $settings[]; - $settings = `stringToStringArray $settingsString ";"`; - - for( $i = 0; $i < size($settings); $i++ ) - { - string $keyValuePair[]; - int $itemCount = `tokenize $settings[$i] "=" $keyValuePair`; - // We expect all settings to be in the format "key=value" - if($itemCount == 2) - { - if($key == $keyValuePair[0]) - { - return $keyValuePair[1]; - } - } - } - - return ""; -} - -//! Save UI settings to the Settings node -/*! - \note ExportSettings string format is `=[;=]..` -*/ -global proc cryExportSaveSettings() -{ - string $exportSettingsNode = LumberyardGetExportSettingNodeName(); - // Create the node if it dosen't exist - if( !`objExists $exportSettingsNode` ) - { - select -clear; - string $settingsNode = `group -empty`; - rename $settingsNode $exportSettingsNode; - select -clear; - } - - if( `objExists $exportSettingsNode` ) - { - if( !`attributeExists "ExportSettings" $exportSettingsNode` ) - { - addAttr -ln "ExportSettings" -dt "string" $exportSettingsNode; - } - - string $settings = ""; - - { // Custom file path - string $customFilePath = `textFieldButtonGrp -q -text CRYEXPORT_CUSTOMFILEPATH`; - if( `gmatch $customFilePath "<*>"` == 0 ) - $settings += "customFilePath=" + $customFilePath + ";"; - } - - { // Remove name spaces - int $removeNamespaces = `checkBox -q -value CRYEXPORT_REMOVENAMESPACES`; - $settings += "removeNamespaces=" + $removeNamespaces + ";"; - } - - { // Export ANM's with CGA's - int $exportANMs = `checkBox -q -value CRYEXPORT_EXPORTANMS`; - $settings += "exportANMs=" + $exportANMs + ";"; - } - - { // Add pose frame - int $addPoseFrame = `checkBox -q -value CRYEXPORT_ADDITIVEPOSEFRAMEOPTION`; - $settings += "addPoseFrame=" + $addPoseFrame + ";"; - } - - { // Add pose frame index - int $poseFrameIndex = `intField -q -value CRYEXPORT_ADDITIVEPOSEFRAMEINDEX`; - $settings += "poseFrameIndex=" + $poseFrameIndex + ";"; - } - - { // RC selection - if( `control -exists CRYEXPORT_RCSELECTIONMENU`) - { - string $selectedRC = `optionMenu -q -v CRYEXPORT_RCSELECTIONMENU`; - string $decode[] = `cryExportDecodeRCSelectionString $selectedRC`; - if( size($decode) == 2 && size($decode[0]) > 0 && size($decode[1]) > 0) - $settings += "selectedRC=" + $decode[0] + ";"; - } - } - - setAttr ($exportSettingsNode+".ExportSettings") -type "string" $settings; - - } -} -///////////////////////////////////////////////////////////////////////// - -global proc cryExportSourceDependencies() -{ - eval("source cryValidate.mel"); - eval("source cryAnim.mel"); - eval("source cryMaterial.mel"); - eval("source LumberyardUtilities.mel"); - if( !`cryPluginIsLoaded` ) - cryLoadPluginQuiet; -} - -global proc cryExportWin() -{ - //cryExportSourceDependencies; - - string $pluginName = `cryGetPluginName`; - if( catchQuiet( `pluginInfo -query -version $pluginName` )) - error("Plugin `" + $pluginName + "` could not be found."); - - if( !`LumberyardToolFindAndUpgradeOldStyleExportNodes` ) - { - return; - } - - createCryExportWindow(); -} - -proc BlendshapeJointExportSetup(string $node, string $root) -{ - string $connections[] = `listConnections -s 0 -d 1 -p 1 -type "blendShape" -connections 1 $node`; - - for($i = 0; $i < size($connections); $i = $i + 2) - { - string $curAttr = $connections[$i]; - string $curDest = $connections[$i+1]; - string $buffer[]; - string $namespace[]; - tokenize $curDest "." $buffer; - tokenize $curAttr ":" $namespace; - - string $finalName = $buffer[1] + "_blendWeightVertex"; - if( size($namespace) > 1 ) - { - $finalName = $namespace[0] + ":" + $finalName; - } - - if(!`objExists $finalName`) - { - //create multDiv node - string $multDiv = `shadingNode -asUtility multiplyDivide`; - connectAttr $curAttr ($multDiv + ".input1X"); - setAttr ($multDiv + ".input2X") 100; - - //create joint - - string $joint = `joint -p 0 0 0 -name $finalName`; - addAttr -ln "cryControlJoint" -at "bool" -dv 1 $joint; - parent $joint $root; - connectAttr ($multDiv + ".outputX") ($joint + ".tx"); - } - } -} - -proc RemoveBlendshapeJointExport(string $node) -{ - string $connections[] = `listConnections -s 1 -d 1 -type "multiplyDivide" $node`; - delete $connections; - delete $node; -} - -global proc DeleteBlendShapeControlExports(string $root) -{ - string $prevSel[] = `ls -sl`; - select -r $root; - string $childNodes[] = `ls -sl -dag`; - - for($node in $childNodes) - { - string $cryTempAttr = $node+".cryControlJoint"; - if(`objExists $cryTempAttr`) - { - if(`getAttr $cryTempAttr`) - { - RemoveBlendshapeJointExport $node; - } - } - } - - select $prevSel; -} - -global proc CreateBlendShapeControlExports(string $root) -{ - string $prevSel[] = `ls -sl`; - select -r $root; - string $childNodes[] = `ls -sl -dag`; - - for($node in $childNodes) - { - string $cryExportAttr = $node+".cryFloatExport"; - if(`objExists $cryExportAttr`) - { - if(`getAttr $cryExportAttr`) - { - BlendshapeJointExportSetup $node $root; - } - } - } - - select $prevSel; -} \ No newline at end of file diff --git a/Tools/maya/script/cryFBX.mel b/Tools/maya/script/cryFBX.mel deleted file mode 100644 index cd99b09ca3..0000000000 --- a/Tools/maya/script/cryFBX.mel +++ /dev/null @@ -1,243 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// By sorting the node names based on the string length we know that a leaf node will always be in the list before it's parent. -proc cryFBXSortNodeNamesLeafFirst( string $inNodes[] ) -{ - int $numNodes = size($inNodes); - string $temp; - for( $i = 0;$i<$numNodes-1;$i++ ) - { - int $swap = 0; - for( $j = 0;$j<$numNodes-1-$i;$j++ ) - { - int $jLength = size($inNodes[$j]); - int $j1Length = size($inNodes[$j+1]); - - if( $j1Length > $jLength ) - { - $temp = $inNodes[$j]; - $inNodes[$j] = $inNodes[$j+1]; - $inNodes[$j+1] = $temp; - $swap = 1; - } - } - if( $swap == 0 ) - break; - } -} - -proc string cryFBXCleanupDollars( string $node, string $newNodeName ) -{ - string $dollarString = "FBXASC036"; // FBX importer replaces `$` with this string. - while ( $newNodeName != ( $newNodeName = `substitute $dollarString $newNodeName "_"` ) ); - return $newNodeName; -} - -proc string cryFBXCleanupHashes( string $node, string $newNodeName ) -{ - string $hashString = "FBXASC035"; // FBX importer replaces `#` with this string. - while ( $newNodeName != ( $newNodeName = `substitute $hashString $newNodeName "_"` ) ); - return $newNodeName; -} - -proc string cryFBXCleanupSpaces( string $node, string $newNodeName ) -{ - string $spaceString = "FBXASC032"; // FBX importer replaces ` ` with this string. - while ( $newNodeName != ( $newNodeName = `substitute $spaceString $newNodeName "__"` ) ); - return $newNodeName; -} - -proc string cryFBXCleanupParentheses( string $node, string $newNodeName ) -{ - string $openBraceString = "FBXASC040"; // FBX importer replaces `(` with this string. - string $closeBraceString = "FBXASC041"; // FBX importer replaces `)` with this string. - while ( $newNodeName != ( $newNodeName = `substitute $openBraceString $newNodeName "_"` ) ); - while ( $newNodeName != ( $newNodeName = `substitute $closeBraceString $newNodeName "_"` ) ); - return $newNodeName; -} - -proc string cryFBXCleanupGroup( string $node, string $newNodeName ) -{ - string $pathTokens[]; - $pathTokens = `stringToStringArray $node "|"`; - int $pathLength = `size($pathTokens)`; - - if( $pathLength > 1 && `endsWith $newNodeName "_group"` == 0 && `startsWith $newNodeName "_joint"` == 0 ) - { - $newNodeName = ($newNodeName + "_group"); - } - return $newNodeName; -} - -proc string cryFBXCleanupExportNode( string $node, string $newNodeName ) -{ - string $pathTokens[]; - $pathTokens = `stringToStringArray $node "|"`; - int $pathLength = `size($pathTokens)`; - - if( $pathLength == 1 ) - { - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - $newNodeName = $lumberyardExportNodePrefix + $newNodeName; - } - return $newNodeName; -} - -proc cryFBXCleanupAttributes( string $node ) -{ - string $attrs[]; - $attrs = `listAttr -userDefined $node`; - - for( $attr in $attrs ) - { - // Some of the attributes from MAX seem to have a `3DSMAX` suffix... - if( `endsWith $attr "3DSMAX"` == 1 ) - { - int $attrNameLength = `size($attr)`; - string $newAttrName = `substring $attr 1 ($attrNameLength-6)`; - catchQuiet( `renameAttr ($node+"."+$attr) $newAttrName` ); - } - } -} - -proc int cryFBXCleanupIsSelected( string $nodeName ) -{ - string $selected[]; - $selected = `ls -sl $nodeName`; - - if( size($selected) > 0 ) - { - return true; - } - - // Check to see if the nodes parent is selected. - string $parent = `firstParentOf $nodeName`; - if( size($parent) > 0 ) - { - return `cryFBXCleanupIsSelected $parent`; - } - - return false; -} - -proc cryFBXCleanupProcess( int $renameSelectedRootsOnly ) -{ - string $allNodes[]; - $allNodes = `ls -l -type "transform" -type "mesh"`; - - cryFBXSortNodeNamesLeafFirst $allNodes; - - string $node; - for( $node in $allNodes ) - { - string $nodeType = `nodeType $node`; - - string $pathTokens[]; - $pathTokens = `stringToStringArray $node "|"`; - string $nodeName = $pathTokens[size($pathTokens)-1]; - - cryFBXCleanupAttributes $node; - - int $renameExportNode = 1; - if( $renameSelectedRootsOnly && !`cryFBXCleanupIsSelected $nodeName` ) - $renameExportNode = 0; - - string $newNodeName = $nodeName; - $newNodeName = `cryFBXCleanupDollars $node $newNodeName`; - $newNodeName = `cryFBXCleanupHashes $node $newNodeName`; - $newNodeName = `cryFBXCleanupSpaces $node $newNodeName`; - $newNodeName = `cryFBXCleanupParentheses $node $newNodeName`; - - if( $renameExportNode && `strcmp $nodeType "mesh"` != 0 ) - { - $newNodeName = `cryFBXCleanupExportNode $node $newNodeName`; - $newNodeName = `cryFBXCleanupGroup $node $newNodeName`; - } - - if( $newNodeName != $nodeName ) - { - catchQuiet( $newNodeName = `rename -ignoreShape $node $newNodeName` ); - } - } -} - -global proc cryFBXCleanupUDP( ) -{ - string $udpAttributeName = "UDP"; - - string $allNodes[]; - $allNodes = `ls -l`; - for( $node in $allNodes ) - { - if (`attributeExists $udpAttributeName $node`) - { - string $nodeUDP = `getAttr ($node+"."+$udpAttributeName)`; - while( 1 ) - { - string $newUDP = `substitute "&cr;&lf;" $nodeUDP "\n"`; - if( `strcmp $newUDP $nodeUDP` == 0 ) - break; - $nodeUDP = $newUDP; - } - setAttr -type "string" ($node+"."+$udpAttributeName) $nodeUDP; - } - } -} - -proc cryFBXCleanup() -{ - string $selected[]; - $selected = `ls -sl`; - - int $renameSelectedRootsOnly = 1; - string $message = ""; - if( size($selected) == 0 ) - { - $message = "This will cleanup the node names created when importing an FBX scene from Max.\nAll root nodes will be renamed using the Lumberyard export node prefix.\nIf this is not what you want to do, click Cancel, select the export nodes and rerun this script."; - $renameSelectedRootsOnly = 0; - } - else - { - $message = "This will cleanup the node names created when importing an FBX scene from Max.\nOnly the selected root nodes will be renamed using the Lumberyard export node prefix."; - $renameSelectedRootsOnly = 1; - } - - string $result = `confirmDialog -title "Lumberyard FBX" -message $message -button "Ok" -button "Cancel" -defaultButton "Ok" -cancelButton "Cancel" -dismissString "Cancel"`; - - if( $result == "Ok" ) - { - cryFBXCleanupProcess( $renameSelectedRootsOnly ); - - cryFBXCleanupUDP; - - string $nodes[]; - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - string $filter = $lumberyardExportNodePrefix + "*"; - $nodes = `ls $filter`; - - // Add any attributes to the newly renamed nodes. - cryExportAddAttributes; - } -} - -proc cryFBXSourceDependencies() -{ - eval("source cryExport.mel"); -} - -global proc cryFBX() -{ - cryFBXSourceDependencies; - cryFBXCleanup; -} \ No newline at end of file diff --git a/Tools/maya/script/cryMaterial.mel b/Tools/maya/script/cryMaterial.mel deleted file mode 100644 index da7fd75bd7..0000000000 --- a/Tools/maya/script/cryMaterial.mel +++ /dev/null @@ -1,926 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -global proc string cryMaterialGetPartitionName() -{ - return "cryMaterials"; -} - -global proc string cryMaterialGetDefaultGroupName() -{ - return "newMaterialGroup1"; -} - -global proc string cryMaterialCreateGroup( string $name ) -{ - string $partitionName = `cryMaterialGetPartitionName`; - if( !`objExists $partitionName` ) - { - partition -name $partitionName; - } - - int $defaultName = 0; - if( `size($name)` == 0 ) - { - $name = `cryMaterialGetDefaultGroupName`; - $defaultName = 1; - } - - $newSet = `sets -empty -name $name`; - if( $defaultName == 0 && $newSet != $name ) - { - confirmDialog -title "Create Group" -message ("The group was renamed from `" + $name + "` to `" + $newSet + "` due to a name clash.") -button "OK"; - } - partition -add $partitionName $newSet; - return $newSet; -} - -global proc string cryMaterialCreateShader( string $name ) -{ - string $newShader; - $newShader = `shadingNode -asShader phong`; - string $renamed = `rename $newShader $name`; - return $renamed; -} - -global proc string[] cryMaterialGetMaterialGroups(string $partitionName) -{ - string $materialGroups[]; - - if( `objExists $partitionName` ) - { - if( `objectType -isType "partition" $partitionName` ) - { - $materialGroups = `partition -q $partitionName`; - } - } - return $materialGroups; -} - -global proc string[] cryMaterialGetGroupShaders( string $group) -{ - // It seems that the sets command dosen't always return the list in the right order. - // The shaders should be connected to the dnSetMembers plug. - // List connections seems to get them in the right order. - string $contents[]; - $contents = `listConnections ($group+".dnSetMembers")`; - //$contents = `sets -q -nodesOnly $group`; - return $contents; -} - -global proc cryMaterialRebuildGroup( string $group ) -{ - // Rebuild the set's connections to remove any gaps in the dnSetMembers array - string $contents[]; - $contents = `cryMaterialGetGroupShaders $group`; - - // Remove all connections - for( $shader in $contents ) - { - string $dests[]; - $dests = `connectionInfo -destinationFromSource ($shader+".message")`; - for( $dest in $dests ) - { - if( `gmatch ($dest) ($group+".dnSetMembers*")` ) - disconnectAttr ($shader+".message") ($dest); - } - } - - // Recreate connections - int $connectionCount = 0; - for( $shader in $contents ) - { - connectAttr ($shader+".message") ($group+".dnSetMembers["+$connectionCount+"]"); - $connectionCount++; - } -} - -global proc cryMaterialDeleteGroup( string $group ) -{ - delete $group; -} - -global proc cryMaterialMoveShaderToGroupWithPartition( string $group, string $shader, string $partitionName ) -{ - // If it's already a member of this group just return. - if( `sets -isMember $group $shader` ) - { - return; - } - - // The forceElement option on the sets command dosn't seem to be working so we have - // to remove the shader from any other groups. - string $materialGroups[]; - $materialGroups = `cryMaterialGetMaterialGroups $partitionName`; - int $doAdd = 1; - for( $materialGroup in $materialGroups ) - { - if( `sets -isMember $materialGroup $shader` ) - { - string $result = `confirmDialog -title "Move Shader" -message ("Shader `"+$shader+"` is already in group `"+$materialGroup+"`. Do you want to move it to group `"+$group+"`?") - -button "Yes" -button "No" -defaultButton "Yes" -cancelButton "No" -dismissString "No"`; - - if( $result == "Yes" ) - { - string $shaders[]; - $shaders[0] = $shader; - cryMaterialRemoveShadersFromGroup $materialGroup $shaders; - } - else - { - $doAdd = 0; - } - } - } - - if( $doAdd == 1 ) - { - print("Add shader to group `"+$shader+"` -> `"+$group+"`\n"); - sets -forceElement $group $shader; - cryMaterialRebuildGroup $group; - } -} - -global proc cryMaterialMoveShaderToGroup( string $group, string $shader ) -{ - cryMaterialMoveShaderToGroupWithPartition $group $shader `cryMaterialGetPartitionName`; -} - -global proc cryMatrialAddSelectedShadersToGroup( string $group ) -{ - if( `objExists $group` ) - { - string $selected[]; - $selected = `ls -sl`; - for( $object in $selected ) - { - if( `objectType -isType "lambert" $object` || `objectType -isType "phong" $object` || `objectType -isType "blinn" $object` || `objectType -isAType "hwShader" $object` ) - { - cryMaterialMoveShaderToGroup $group $object; - } - } - cryMaterialRebuildGroup $group; - } -} - -global proc cryMaterialAddShadersFromGeomToGroupRecurse( string $group, string $node, string $partitionName ) -{ - string $shaderEngines[] = `listConnections -type shadingEngine $node`; - for( $se in $shaderEngines ) - { - string $shaders[] = `listConnections -type lambert $se`; - for( $shader in $shaders ) - { - cryMaterialMoveShaderToGroupWithPartition $group $shader $partitionName; - } - string $hwShaders[] = `listConnections -type hwShader $se`; - for( $hwShader in $hwShaders ) - { - cryMaterialMoveShaderToGroupWithPartition $group $hwShader $partitionName; - } - } - - string $children[]; - string $child; - $children = `listRelatives -children -fullPath $node`; - for ($child in $children) - { - cryMaterialAddShadersFromGeomToGroupRecurse $group $child $partitionName; - } -} - -global proc cryMaterialAddShadersFromGeomToGroup( string $group ) -{ - if( `objExists $group` ) - { - string $selected[]; - $selected = `ls -sl`; - - for( $rootNode in $selected ) - { - cryMaterialAddShadersFromGeomToGroupRecurse $group $rootNode `cryMaterialGetPartitionName`; - } - } -} - -global proc cryMaterialRemoveShadersFromGroup( string $group, string $shaders[] ) -{ - if( `objExists $group` ) - { - for( $shader in $shaders ) - { - if( `sets -isMember $group $shader` ) - { - print("Remove shader from group `"+$shader+"` <- `"+$group+"`\n"); - sets -edit -remove $group $shader; - } - } - cryMaterialRebuildGroup $group; - } -} - -global proc cryMaterialMoveShadersUp( string $group, string $inShaders[] ) -{ - // Rebuild the group to make sure the content index and the connection index match - cryMaterialRebuildGroup $group; - string $shaders[]; - $shaders = `cryMaterialGetGroupShaders $group`; - - // Sort shaders array - string $sortedInShaders[]; - for( $shader in $shaders ) - { - for( $inShader in $inShaders ) - { - if( $inShader == $shader ) - $sortedInShaders[`size($sortedInShaders)`] = $shader; - } - } - - if( `size($sortedInShaders)` != `size($inShaders)` ) - print("Error sorting shaders\n"); - - - int $numInShaders = `size($sortedInShaders)`; - int $numShaders = `size($shaders)`; - for( $i = 0;$i<$numInShaders;$i++ ) - { - int $swapped = 0; - string $inShader = $inShaders[$i]; - - for( $j = 1;$j<$numShaders;$j++ ) - { - string $shader = $shaders[$j]; - if( $inShader == $shader ) - { - string $shaderM1 = $shaders[$j-1]; - if( !`stringArrayContains $shaderM1 $sortedInShaders` ) - { - // Swap $shader and $shaderM1 - disconnectAttr ($shader+".message") ($group+".dnSetMembers["+$j+"]"); - disconnectAttr ($shaderM1+".message") ($group+".dnSetMembers["+($j-1)+"]"); - connectAttr ($shader+".message") ($group+".dnSetMembers["+($j-1)+"]"); - connectAttr ($shaderM1+".message") ($group+".dnSetMembers["+$j+"]"); - $swapped = 1; - break; - } - } - } - if( $swapped ) - { - $shaders = `cryMaterialGetGroupShaders $group`; - } - } - - // Rebuild again though it shouldn't be needed - cryMaterialRebuildGroup $group; -} - -global proc cryMaterialMoveShadersDown( string $group, string $inShaders[] ) -{ - // Rebuild the group to make sure the content index and the connection index match - cryMaterialRebuildGroup $group; - string $shaders[]; - $shaders = `cryMaterialGetGroupShaders $group`; - - // Sort shaders array - string $sortedInShaders[]; - for( $shader in $shaders ) - { - for( $inShader in $inShaders ) - { - if( $inShader == $shader ) - $sortedInShaders[`size($sortedInShaders)`] = $shader; - } - } - - if( `size($sortedInShaders)` != `size($inShaders)` ) - print("Error sorting shaders\n"); - - int $numInShaders = `size($sortedInShaders)`; - int $numShaders = `size($shaders)`; - for( $i = $numInShaders-1;$i>=0;$i-- ) - { - int $swapped = 0; - string $inShader = $inShaders[$i]; - - for( $j = $numShaders-2;$j>=0;$j-- ) - { - string $shader = $shaders[$j]; - if( $inShader == $shader ) - { - string $shaderP1 = $shaders[$j+1]; - if( !`stringArrayContains $shaderP1 $sortedInShaders` ) - { - // Swap $shader and $shaderM1 - disconnectAttr ($shader+".message") ($group+".dnSetMembers["+$j+"]"); - disconnectAttr ($shaderP1+".message") ($group+".dnSetMembers["+($j+1)+"]"); - connectAttr ($shader+".message") ($group+".dnSetMembers["+($j+1)+"]"); - connectAttr ($shaderP1+".message") ($group+".dnSetMembers["+$j+"]"); - $swapped = 1; - break; - } - } - } - if( $swapped ) - { - $shaders = `cryMaterialGetGroupShaders $group`; - } - } - - // Rebuild again though it shouldn't be needed - cryMaterialRebuildGroup $group; -} - -////////////////////////////////////////////////////////////////////// -// Cry Material UI -////////////////////////////////////////////////////////////////////// -global proc cryMaterialUICloseWindow() -{ - deleteUI -window CRYMATERIAL_WINDOW; -} - -global proc string cryMaterialUIShaderNameEncode( string $group, string $shader ) -{ - string $contents[]; - $contents = `cryMaterialGetGroupShaders $group`; - int $shaderIndex = 0; - for( $i = 0;$i 0 ) - { - for( $selectedNode in $selectedNodes ) - { - string $lowerNode = tolower( $selectedNode ); - if( startsWith( $lowerNode, $lumberyardExportNodePrefix ) ) - { - int $start = size($lumberyardExportNodePrefix)+1; - int $end = size($selectedNode); - $name = `substring $selectedNode $start $end`; - break; - } - } - } - - string $result = `promptDialog -title "Create Group" -message "Enter group name:" -text $name -button "OK" -button "Cancel" -defaultButton "OK" -cancelButton "Cancel" -dismissString "Cancel"`; - - if ($result == "OK") - { - $name = `promptDialog -query -text`; - if( `size($name)` == 0 ) - $name = `cryMaterialGetDefaultGroupName`; - string $newGroup = `cryMaterialCreateGroup $name`; - cryMaterialAddShadersFromGeomToGroup $newGroup; - cryMaterialUIRebuild; - } -} - -global proc cryMaterialUIReadMaterial() -{ - if( `cryPluginIsLoaded` == 0 ) - { - confirmDialog -title "Read Material" -message ("Can't read a material as the Lumberyard plugin isn't loaded.") -button "OK"; - } - else - { - string $currentPath = `file -q -sceneName`; - $currentPath = `dirname $currentPath`; - string $startingFolder = $currentPath; - - string $absPath = `cryExportRelativeToAbsolutePath $startingFolder`; - string $inFiles[] = `fileDialog2 -fileMode 1 -startingDirectory $absPath -fileFilter ("Material Files (*.mtl)")`; - if( size($inFiles) > 0 ) - { - string $option1 = "readMaterial"; - string $option2 = $inFiles[0]; - - if( catchQuiet( `cryMayaSupportPlugin $option1 $option2` ) ) - { - confirmDialog -title "Read Material" -message ("Failed to read material file `"+$inFiles[0]+"`.") -button "OK"; - } - - cryMaterialUIRebuild; - } - } -} - -global proc cryMaterialUIRenameGroup() -{ - string $currentName = `cryMaterialUIGetSelectedGroup`; - string $result = `promptDialog -title "Rename Group" -message "Enter new group name:" -text $currentName -button "OK" -button "Cancel" -defaultButton "OK" -cancelButton "Cancel" -dismissString "Cancel"`; - - if ($result == "OK") - { - string $name = `promptDialog -query -text`; - if( `size($name)` != 0 ) - { - string $newName; - $newName = `rename $currentName $name`; - if( $newName != $name ) - { - confirmDialog -title "Rename Group" -message ("The group was renamed from `" + $name + "` to `" + $newName + "` due to a name clash.") -button "OK"; - } - cryMaterialUIRebuild; - textScrollList -e -selectItem $name CRYMATERIAL_GROUPLIST; - cryMaterialUIUpdateShaderList; - } - } -} - -global proc cryMaterialUIRenameShader() -{ - string $currentShaders[] = `cryMaterialUIGetSelectedShaders`; - if( size($currentShaders) > 0 ) - { - string $currentName = $currentShaders[0]; - string $result = `promptDialog -title "Rename Shader" -message "Enter new shader name:" -text $currentName -button "OK" -button "Cancel" -defaultButton "OK" -cancelButton "Cancel" -dismissString "Cancel"`; - - if ($result == "OK") - { - string $name = `promptDialog -query -text`; - if( `size($name)` != 0 ) - { - rename $currentName $name; - int $selectedItems[] = `textScrollList -q -selectIndexedItem CRYMATERIAL_SHADERLIST`; - cryMaterialUIRebuild; - cryMaterialUIUpdateShaderList; - textScrollList -e -selectIndexedItem $selectedItems[0] CRYMATERIAL_SHADERLIST; - } - } - } -} - -global proc cryMaterialUIDeleteGroup( int $deleteAllGroups ) -{ - string $answer = "Yes"; - if( $deleteAllGroups ) - $answer = `confirmDialog -title "Lumberyard Material" -message ("Delete all material groups?") -button "Yes" -button "No"`; - if( $answer == "Yes" ) - { - string $selected[]; - if( $deleteAllGroups ) - $selected = `textScrollList -q -allItems CRYMATERIAL_GROUPLIST`; - else - $selected = `textScrollList -q -selectItem CRYMATERIAL_GROUPLIST`; - - for( $i = 0;$i 0 ) - { - select $currentShaders; - cryMaterialUIOpenHyperShader; - } - else - { - confirmDialog -title "Material" -message ("No shaders are selected.") -button "OK"; - } -} - -global proc cryMaterialUIOpenGroupInHyperShade( ) -{ - string $currentGroup = `cryMaterialUIGetSelectedGroup`; - if( `size($currentGroup)` > 0 ) - { - select -r -ne $currentGroup; - cryMaterialUIOpenHyperShader; - } - else - { - confirmDialog -title "Material" -message ("No group is selected.") -button "OK"; - } -} - -global proc cryMaterialUISelectShader() -{ - string $currentShaders[] = `cryMaterialUIGetSelectedShaders`; - if( `size($currentShaders)` == 0 ) - { - confirmDialog -title "Material" -message ("No shaders are selected.") -button "OK"; - return; - } - if( `size($currentShaders)` > 1 ) - { - confirmDialog -title "Material" -message ("Too many shaders are selected. Select only 1.") -button "OK"; - return; - } - - select $currentShaders[0]; -} - -global proc cryMaterialUICreateNewShader() -{ - string $newShader = `cryMaterialCreateShader("newShader")`; - - string $currentGroup = `cryMaterialUIGetSelectedGroup`; - cryMaterialMoveShaderToGroup $currentGroup $newShader; - - cryMaterialUIRebuild; -} - -global proc cryMaterialUISelectObjectsWithMaterialGroup() -{ - string $currentGroup = `cryMaterialUIGetSelectedGroup`; - if( `size($currentGroup)` > 0 ) - { - string $groupShaders[] = `cryMaterialGetGroupShaders $currentGroup`; - - if( `size($groupShaders)` > 0 ) - { - select -r $groupShaders; - hyperShade -objects ""; - } - else - { - confirmDialog -title "Material" -message ("The selected group has no shaders.") -button "OK"; - } - } - else - { - confirmDialog -title "Material" -message ("No material group selected.") -button "OK"; - } -} - -global proc cryMaterialUISelectObjectsWithMaterial() -{ - string $currentShaders[] = `cryMaterialUIGetSelectedShaders`; - if( `size($currentShaders)` > 0 ) - { - select -r $currentShaders; - hyperShade -objects ""; - } - else - { - confirmDialog -title "Material" -message ("No shaders are selected.") -button "OK"; - } -} - -global proc cryMaterialUIAssignMaterialToSelection() -{ - string $currentShaders[] = `cryMaterialUIGetSelectedShaders`; - if( `size($currentShaders)` == 0 ) - { - confirmDialog -title "Material" -message ("No shaders are selected.") -button "OK"; - return; - } - if( `size($currentShaders)` > 1 ) - { - confirmDialog -title "Material" -message ("Too many shaders are selected. Select only 1.") -button "OK"; - return; - } - - hyperShade -assign $currentShaders[0]; -} - -global proc cryMaterialUIOpenInAttributeEditor( ) -{ - string $currentShaders[] = `cryMaterialUIGetSelectedShaders`; - if( `size($currentShaders)` == 0 ) - { - confirmDialog -title "Material" -message ("No shaders are selected.") -button "OK"; - return; - } - if( `size($currentShaders)` > 1 ) - { - confirmDialog -title "Material" -message ("Too many shaders are selected. Select only 1.") -button "OK"; - return; - } - - select $currentShaders[0]; - autoUpdateAttrEd; - openAEWindow; -} - -global proc cryMaterialUIUpdateShaderList() -{ - string $currentGroup = `cryMaterialUIGetSelectedGroup`; - - string $selected[]; - $selected = `cryMaterialUIGetSelectedShaders`; - - textScrollList -e -removeAll CRYMATERIAL_SHADERLIST; - if( `objExists $currentGroup` ) - { - string $contents[]; - $contents = `cryMaterialGetGroupShaders $currentGroup`; - - for( $shader in $contents ) - { - string $shaderName = `cryMaterialUIShaderNameEncode $currentGroup $shader`; - textScrollList -e -append $shaderName CRYMATERIAL_SHADERLIST; - } - - string $newSelected[]; - for( $item in $selected ) - { - $newSelected[size($newSelected)] = $item; - } - cryMaterialUIShaderListSelect $newSelected; - } -} - -global proc cryMaterialUIRebuild() -{ - // Don't clear the shader list is here or the slection will be lost when moving the shaders up and down etc. - // It should be cleared in the caller when needed. - //textScrollList -e -removeAll CRYMATERIAL_SHADERLIST; - - $partitionName = `cryMaterialGetPartitionName`; - - if( `objExists $partitionName` ) - { - string $materialGroups[]; - $materialGroups = `partition -q $partitionName`; - - string $selected[]; - $selected = `textScrollList -q -selectItem CRYMATERIAL_GROUPLIST`; - - textScrollList -e -removeAll CRYMATERIAL_GROUPLIST; - - for( $materialGroup in $materialGroups ) - { - textScrollList -e -append $materialGroup CRYMATERIAL_GROUPLIST; - } - - if( `size($materialGroups)` > 0 ) - { - if( `size($selected)` > 0 ) - { - for( $item in $selected ) - { - if( `stringArrayContains $item $materialGroups` ) - textScrollList -e -selectItem $item CRYMATERIAL_GROUPLIST; - } - } - else - { - textScrollList -e -selectIndexedItem 1 CRYMATERIAL_GROUPLIST; - } - } - - cryMaterialUIUpdateShaderList; - } -} - -proc createCryMaterialWindow() -{ - if(!`window -ex CRYMATERIAL_WINDOW`) - { - if(`windowPref -exists CRYMATERIAL_WINDOW`) - { - windowPref -wh 500 410 -tlc `windowPref -q -topEdge CRYMATERIAL_WINDOW` `windowPref -q -leftEdge CRYMATERIAL_WINDOW` CRYMATERIAL_WINDOW; - //windowPref -remove CRYMATERIAL_WINDOW; - } - window -titleBar true -title "Material Groups" -widthHeight 500 410 -sizeable true -mnb false -mxb false CRYMATERIAL_WINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - { - text -height 30 -font "boldLabelFont" -label "Material Groups" CRYMATERIAL_GROUPSLABEL; - textScrollList -allowMultiSelection false -selectCommand "cryMaterialUIUpdateShaderList" - -deleteKeyCommand "cryMaterialUIDeleteGroup 0" -doubleClickCommand "cryMaterialUIRenameGroup" -width 20 CRYMATERIAL_GROUPLIST; - popupMenu; - { - menuItem -label "Select Objects With MaterialGroup" -command "cryMaterialUISelectObjectsWithMaterialGroup"; - menuItem -divider true; - menuItem -label "Rename Group" -command "cryMaterialUIRenameGroup"; - menuItem -label "View in HyperShade" -command "cryMaterialUIOpenGroupInHyperShade"; - } - - text -height 30 -font "boldLabelFont" -label "Shaders" CRYMATERIAL_SHADERSLABEL; - textScrollList -allowMultiSelection true -deleteKeyCommand "cryMaterialUIRemoveShaders" - -doubleClickCommand "cryMaterialUIRenameShader" -width 20 CRYMATERIAL_SHADERLIST; - popupMenu; - { - menuItem -label "Select Shader" -command "cryMaterialUISelectShader"; - menuItem -divider true; - menuItem -label "Open Shader In Attribute Editor" -command "cryMaterialUIOpenInAttributeEditor"; - menuItem -label "Select Objects With Material" -command "cryMaterialUISelectObjectsWithMaterial"; - menuItem -divider true; - menuItem -label "Assign Material To Selection" -command "cryMaterialUIAssignMaterialToSelection"; - menuItem -divider true; - menuItem -label "Create New Shader" -command "cryMaterialUICreateNewShader"; - } - - columnLayout -adjustableColumn true CRYMATERIAL_GROUPCOL; - { - button -label "Create Group" -command "cryMaterialUICreateGroup"; - button -label "Create Group From Selection" -command "cryMaterialUICreateGroupFromSelection"; - button -label "Rename Selected Group" -command "cryMaterialUIRenameGroup"; - button -label "Read Material File" -command "cryMaterialUIReadMaterial"; - button -label "View Selected Group in HyperShade" -command "cryMaterialUIOpenGroupInHyperShade"; - } - setParent ..; - columnLayout -adjustableColumn true CRYMATERIAL_SHADERCOL; - { - button -label "Add Selected Shaders" -command "cryMaterialUIAddSelectedShaders"; - button -label "Add Shaders From Selected Geom" -command "cryMaterialUIAddShadersFromGeom"; - button -label "Move Shaders Up" -command "cryMaterialUIMoveShadersUp"; - button -label "Move Shaders Down" -command "cryMaterialUIMoveShadersDown"; - button -label "View Selected Shaders in HyperShade" -command "cryMaterialUIOpenShaderInHyperShade"; - } - setParent ..; - } - $closebutton = `button -label "Close" -command ("cryMaterialUICloseWindow")`; - setParent ..; - - formLayout -edit - -attachForm CRYMATERIAL_GROUPSLABEL "top" 5 - -attachForm CRYMATERIAL_GROUPSLABEL "left" 5 - -attachPosition CRYMATERIAL_GROUPSLABEL "right" 5 50 - -attachNone CRYMATERIAL_GROUPSLABEL "bottom" - - -attachForm CRYMATERIAL_SHADERSLABEL "top" 5 - -attachPosition CRYMATERIAL_SHADERSLABEL "left" 5 50 - -attachForm CRYMATERIAL_SHADERSLABEL "right" 5 - -attachNone CRYMATERIAL_SHADERSLABEL "bottom" - - -attachControl CRYMATERIAL_GROUPLIST "top" 5 CRYMATERIAL_GROUPSLABEL - -attachForm CRYMATERIAL_GROUPLIST "left" 5 - -attachPosition CRYMATERIAL_GROUPLIST "right" 5 50 - -attachControl CRYMATERIAL_GROUPLIST "bottom" 5 CRYMATERIAL_GROUPCOL - - -attachControl CRYMATERIAL_SHADERLIST "top" 5 CRYMATERIAL_SHADERSLABEL - -attachPosition CRYMATERIAL_SHADERLIST "left" 5 50 - -attachForm CRYMATERIAL_SHADERLIST "right" 5 - -attachControl CRYMATERIAL_SHADERLIST "bottom" 5 CRYMATERIAL_SHADERCOL - - - -attachNone CRYMATERIAL_GROUPCOL "top" - -attachForm CRYMATERIAL_GROUPCOL "left" 5 - -attachPosition CRYMATERIAL_GROUPCOL "right" 5 50 - -attachControl CRYMATERIAL_GROUPCOL "bottom" 5 $closebutton - - -attachNone CRYMATERIAL_SHADERCOL "top" - -attachPosition CRYMATERIAL_SHADERCOL "left" 5 50 - -attachForm CRYMATERIAL_SHADERCOL "right" 5 - -attachControl CRYMATERIAL_SHADERCOL "bottom" 5 $closebutton - - -attachForm $closebutton "bottom" 5 - -attachForm $closebutton "left" 5 - -attachForm $closebutton "right" 5 - -attachNone $closebutton "top" - $layout1; - } - - cryMaterialUIRebuild; - - showWindow CRYMATERIAL_WINDOW; -} - -proc cryMaterialSourceDependencies() -{ - eval("source cryExport.mel"); -} - -global proc cryMaterialWin() -{ - cryMaterialSourceDependencies; - createCryMaterialWindow(); -} \ No newline at end of file diff --git a/Tools/maya/script/cryPivot.mel b/Tools/maya/script/cryPivot.mel deleted file mode 100644 index 886ed10686..0000000000 --- a/Tools/maya/script/cryPivot.mel +++ /dev/null @@ -1,161 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -proc int cryPivotTranslationLocked( string $node ) -{ - if( `attributeExists "translate" $node` ) - { - if( `getAttr -lock ($node+".translateX")` || `getAttr -lock ($node+".translateY")` || `getAttr -lock ($node+".translateZ")` ) - return 1; - } - return 0; -} - -global proc int cryPivotRecurseMoveNode(int $centrePivots,string $node,vector $offset) -{ - float $fpivot[]; - vector $pivot; - - if(`attributeExists "intermediateObject" $node`) - { - if(`getAttr ($node+".intermediateObject")` == 1 ) - return 1; // Stop processing this node but carry on with siblings. - } - - if( `cryPivotTranslationLocked $node` ) - { - confirmDialog -title "Lumberyard Pivot" -message ("Failure. The node `"+$node+"` has locked transform attributes.") -button "OK" -defaultButton "OK"; - return 0; // Fail. Exit all the way up the recusion. - } - - if(`nodeType $node` == "transform") - { - if( $centrePivots == 1 ) - { - xform -centerPivots -preserve true $node; - } - - $fpivot = `xform -q -os -rotatePivot $node`; - xform -r -translation ($fpivot[0] - $offset.x) ($fpivot[1] - $offset.y) ($fpivot[2] - $offset.z) $node; - xform -os -pivots (0) (0) (0) $node; - $offset = <<$fpivot[0],$fpivot[1],$fpivot[2]>>; - } - else if(`nodeType $node` == "mesh") - { - int $eval[] = `polyEvaluate -v $node`; - $vertCount = $eval[0]; - move -r (-$offset.x) (-$offset.y) (-$offset.z) ($node+".vtx[0:"+$vertCount+"]"); - } - - string $children[]; - string $child; - $children = `listRelatives -children -fullPath $node`; - for ($child in $children) - { - if( `cryPivotRecurseMoveNode $centrePivots $child $offset` == 0 ) - { - return 0; // Fail. Exit all the way up the recursion - } - } - - return 1; // Success. -} - -global proc cryPivotCloseWindow() -{ - if(`window -ex CRYPIVOT_WINDOW`) - { - deleteUI -window CRYPIVOT_WINDOW; - } -} - -global proc cryPivotClickedRun() -{ - int $centrePivots = 0; - if(`window -ex CRYPIVOT_WINDOW`) - { - $centrePivots = `checkBox -q -v CRYPIVOT_CENTREPIVOTS`; - } - - cryPivotRun($centrePivots); -} - -global proc cryPivotRun(int $centrePivots) -{ - $sellist = `ls -sl -long`; - - if(size($sellist) != 1) - { - confirmDialog -title "Lumberyard Pivot" -message "Wrong number of nodes selected, expected 1." -button "OK" -defaultButton "OK"; - return; - } - - cryPivotCloseWindow; - - string $node = $sellist[0]; - if( `cryPivotRecurseMoveNode $centrePivots $node <<0,0,0>>` == 1 ) - { - confirmDialog -title "Lumberyard Pivot" -message "Origins set sucessfully." -button "OK" -defaultButton "OK"; - } -} - -proc cryPivotOptionWindow() -{ - if(!`window -ex CRYPIVOT_WINDOW`) - { - if(`windowPref -exists CRYPIVOT_WINDOW`) - { - windowPref -wh 400 110 -tlc `windowPref -q -topEdge CRYPIVOT_WINDOW` `windowPref -q -leftEdge CRYPIVOT_WINDOW` CRYPIVOT_WINDOW; - //windowPref -remove CRYPIVOT_WINDOW; - } - window -titleBar true -title "Fixup Node Origins" -widthHeight 400 110 -sizeable true -mnb false -mxb false CRYPIVOT_WINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - { - columnLayout -adjustableColumn true CRYPIVOT_COL; - { - text -align "left" -label "This will move the origin of the selected node to it's pivot position.\nThe centre pivot option will centre the pivot point before moving the origin."; - text -label ""; - checkBox -label "Centre Pivots" -align "center" CRYPIVOT_CENTREPIVOTS; - } - setParent ..; - } - $runbutton = `button -label "Run" -command ("cryPivotClickedRun")`; - $cancelbutton = `button -label "Cancel" -command ("cryPivotCloseWindow")`; - setParent ..; - - formLayout -edit - -attachForm CRYPIVOT_COL "top" 5 - -attachForm CRYPIVOT_COL "left" 5 - -attachForm CRYPIVOT_COL "right" 5 - -attachControl CRYPIVOT_COL "bottom" 5 $cancelbutton - - -attachForm $runbutton "bottom" 5 - -attachForm $runbutton "left" 5 - -attachPosition $runbutton "right" 5 50 - -attachNone $runbutton "top" - - -attachForm $cancelbutton "bottom" 5 - -attachPosition $cancelbutton "left" 5 50 - -attachForm $cancelbutton "right" 5 - -attachNone $cancelbutton "top" - $layout1; - } - - showWindow CRYPIVOT_WINDOW; -} - -global proc cryPivot() -{ - cryPivotOptionWindow; -} \ No newline at end of file diff --git a/Tools/maya/script/cryTools.mel b/Tools/maya/script/cryTools.mel deleted file mode 100644 index dfe0f4797f..0000000000 --- a/Tools/maya/script/cryTools.mel +++ /dev/null @@ -1,571 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -global proc cryToolsCreateCryExportNodeCloseWindow() -{ - deleteUI -window CRYNEWEXPORTNODE_WINDOW; -} - -global proc string cryToolsCreateCryExportNodeCreateCore( string $name, int $fileType, string $contents[] ) -{ - // check selection - for( $content in $contents ) - { - string $type = `nodeType $content`; - if( $type != "transform" && $type != "joint" ) - { - warning( "Selected node " + $content + " is not valid for exporting!" ); - return ""; - } - } - - string $targetName = $contents[0]; - - // Create/Adjust group properly - // If there are multiple contents, need to create a group - string $groupPostfix = "_group"; - if( size( $contents ) > 1 ) - { - if( `confirmDialog -title "Lumberyard Exporter" -message "A group node will be created for selected nodes. Scene hierarchy will be modified." - -button "Confirm" -button "Cancel" -defaultButton "Confirm" - -cancelButton "Cancel" -dismissString "Cancel"` == "Confirm" ) - { - $targetName = `group -empty -name ($name + $groupPostfix)`; - xform -objectSpace -pivots 0 0 0 $targetName; - - // Add contents to group node - for( $item in $contents ) - { - parent $item $targetName; - } - } - else - { - // User cancelled operation, do nothing and return - return ""; - } - } - // Else if it's a group, attempt to add "_group" postfix if it lacks - else if (`nodeType $contents[0]` == "transform" && size(`listRelatives -type "mesh" -children $contents[0]`) == 0) - { - if ( !endsWith($contents[0], $groupPostfix) && !endsWith($contents[0], "_helper") ) - { - string $message = "Renaming this group node with a `_group` postfix will allow a more predictable export. Would you like to rename this node to `" + $contents[0] + "_group`?"; - string $action = `confirmDialog -title "Lumberyard Exporter" -message $message - -button "Rename" -button "Ignore" -button "Cancel" -defaultButton "Rename" - -cancelButton "Cancel" -dismissString "Cancel"`; - if ($action == "Rename") - { - $targetName = `rename $contents[0] ($contents[0] + $groupPostfix)`; - } - else if ($action == "Cancel") - { - // User cancels operation, do nothing and return - return ""; - } - // If choose "Ignore", keep the original name - } - } - - // Create LUMBERYARD_EXPORT_GROUP and LUMBERYARD_GEOMETRYEXPORT_GROUP if needed. - if( !`objExists LUMBERYARD_EXPORT_GROUP` ) - { - // Create LUMBERYARD_EXPORT_GROUP - group -empty -name LUMBERYARD_EXPORT_GROUP; - } - if( !`objExists LUMBERYARD_GEOMETRYEXPORT_GROUP` ) - { - // Create LUMBERYARD_GEOMETRYEXPORT_GROUP - group -empty -parent LUMBERYARD_EXPORT_GROUP -name LUMBERYARD_GEOMETRYEXPORT_GROUP; - } - - // Create the new node and make sure it's transforms are zeroed - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - string $fullName = $lumberyardExportNodePrefix + $name; - $newExportNode = `group -empty -name $fullName -parent LUMBERYARD_GEOMETRYEXPORT_GROUP`; - xform -objectSpace -pivots 0 0 0 $newExportNode; - - // Add attributes to all nodes - cryExportAddAttributes; - - // Set file type - setAttr ($newExportNode+".fileType") ($fileType); - // Set export target. - string $longName[] = `ls -long $targetName`; - // Exporter plugin expects leading | stripped from long paths - $targetName = `substring $longName[0] 2 (size($longName[0]))`; - setAttr ($newExportNode+".exportTarget") -type "string" ($targetName); - - cryExportUpdateExportLists; - - return $newExportNode; -} - -global proc cryToolsCreateCryExportNodeCreate() -{ - if(`window -ex CRYNEWEXPORTNODE_WINDOW`) - { - // Create the new node and make sure it's transforms are zeroed - string $name = `textField -q -text CRYTOOLS_NEWEXPORTNODE_NAME`; - - // Set the fileType. Subtract 1 as the optionMenu index is 1 based and the attr is 0 based. - int $fileType = `optionMenu -q -select CRYNEWEXPORTNODE_FILETYPE`; - $fileType -= 1; - - int $groupSelection = `checkBox -q -value CRYNEWEXPORTNODE_GROUPSELECTION`; - - string $selection[]; - if( $groupSelection ) - { - $selection = `ls -sl`; - } - - cryToolsCreateCryExportNodeCreateCore $name $fileType $selection; - - cryToolsCreateCryExportNodeCloseWindow; - } -} - -global proc cryToolsCreateCryExportNode( int $quietMode ) -{ - string $newName = "New"; - string $selection[] = `ls -sl`; - int $hasSelection = size($selection) > 0; - if( $hasSelection ) - { - $newName = $selection[0]; - } - - if( $quietMode ) - { - int $fileType = 0; - string $selection[] = `ls -sl`; - cryToolsCreateCryExportNodeCreateCore $newName $fileType $selection; - } - else if(!`window -ex CRYNEWEXPORTNODE_WINDOW`) - { - int $pluginLoaded = `cryPluginIsLoaded`; - if( !$pluginLoaded ) - { - confirmDialog -title "Lumberyard Export" -message "The MayaCryExport plugin is not loaded." -button "OK"; - return; - } - - if(`windowPref -exists CRYNEWEXPORTNODE_WINDOW`) - { - windowPref -wh 400 150 -tlc `windowPref -q -topEdge CRYNEWEXPORTNODE_WINDOW` `windowPref -q -leftEdge CRYNEWEXPORTNODE_WINDOW` CRYNEWEXPORTNODE_WINDOW; - //windowPref -remove CRYNEWEXPORTNODE_WINDOW; - } - window -titleBar true -title "Create CryExportNode" -widthHeight 400 180 -sizeable false -mnb false -mxb false CRYNEWEXPORTNODE_WINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - { - columnLayout -adjustableColumn true -rowSpacing 10 CRYNEWEXPORTNODE_MAINCOL; - { - rowLayout -numberOfColumns 2 -columnAttach 1 "right" 5 -columnWidth 1 100 -columnWidth 2 200 CRYNEWEXPORTNODE_NAMEROW; - { - text -label "Name"; - textField -text $newName CRYTOOLS_NEWEXPORTNODE_NAME; - } - setParent ..; - rowLayout -numberOfColumns 2 -columnAttach 1 "right" 5 -columnWidth 1 100 -columnWidth 2 200 CRYNEWEXPORTNODE_FILETYPEROW; - { - text -label "File Type"; - optionMenu CRYNEWEXPORTNODE_FILETYPE; - { - string $enumString = `cryExportGetFileTypeEnumString`; - string $tokens[]; - $numTokens = `tokenize $enumString ":" $tokens`; - for( $i = 0;$i<$numTokens;$i++ ) - { - menuItem -label $tokens[$i]; - } - } - } - setParent ..; - rowLayout -numberOfColumns 2 -columnAttach 1 "right" 5 -columnWidth 1 100 -columnWidth 2 200 CRYNEWEXPORTNODE_GROUPSELECTIONROW; - { - text ""; - string $annotation = "Moves the currently selected items into the new export node."; - checkBox -annotation $annotation -value $hasSelection -label "Group Selection" CRYNEWEXPORTNODE_GROUPSELECTION; - } - setParent ..; - rowLayout -numberOfColumns 2 -columnAttach 1 "right" 5 -columnWidth 1 100 -columnWidth 2 200 CRYNEWEXPORTNODE_CREATEGROUPNODEROW; - { - text ""; - string $annotation = "Create a `_group` node and put it under the new export node. If you also have `Group Selection` checked the selected items will be put under the `_group` node."; - checkBox -annotation $annotation -value true -label "Create `_group` node" CRYNEWEXPORTNODE_CREATEGROUPNODE; - } - setParent ..; - } - setParent ..; - } - $createbutton = `button -label "Create" -command ("cryToolsCreateCryExportNodeCreate")`; - $closebutton = `button -label "Close" -command ("cryToolsCreateCryExportNodeCloseWindow")`; - setParent ..; - - formLayout -edit - -attachForm CRYNEWEXPORTNODE_MAINCOL "top" 15 - -attachForm CRYNEWEXPORTNODE_MAINCOL "left" 5 - -attachForm CRYNEWEXPORTNODE_MAINCOL "right" 5 - -attachControl CRYNEWEXPORTNODE_MAINCOL "bottom" 5 $closebutton - - -attachForm $createbutton "bottom" 5 - -attachForm $createbutton "left" 5 - -attachPosition $createbutton "right" 5 50 - -attachNone $createbutton "top" - -attachForm $closebutton "bottom" 5 - -attachPosition $closebutton "left" 5 50 - -attachForm $closebutton "right" 5 - -attachNone $closebutton "top" - $layout1; - - showWindow CRYNEWEXPORTNODE_WINDOW; - } - else - { - showWindow CRYNEWEXPORTNODE_WINDOW; - } -} - -global proc cryToolsCreateMultipleCryExportNodes() -{ - string $result = `confirmDialog -title "Lumberyard Tools" -message "Create an export node and group for each of the selected nodes?" -button "Yes" -button "Cancel" -defaultButton "Yes" -cancelButton "Cancel" -dismissString "Cancel"`; - if( $result != "Yes" ) - return; - - string $newName = "New"; - int $fileType = 0; - string $selection[] = `ls -sl`; - - string $newExportNodes[]; - for( $item in $selection ) - { - string $itemArray[]; - $itemArray[0] = $item; - string $newName = $item; - - string $newExportNode = `cryToolsCreateCryExportNodeCreateCore $newName $fileType $itemArray`; - $newExportNodes[size($newExportNodes)] = $newExportNode; - } - - select -cl; - for( $node in $newExportNodes ) - { - select -add $node; - } -} - -global proc cryToolsCreateCryHelperNode() -{ - string $newNode = `createNode cryHelperNode`; - string $newParent = firstParentOf($newNode); - - rename $newNode "cryHelperShape#"; - rename $newParent "cryHelper#"; -} - -global proc cryToolsFixCameraPivots() -{ - string $cameras[] = `ls -l -sl -type camera`; - if( size($cameras) == 0 ) - { - string $message = "This will attempt to reset the pivots for all cameras in the scene."; - string $result = `confirmDialog -title "Lumberyard Tools" -message $message -button "Ok" -button "Cancel" -defaultButton "Ok" -cancelButton "Cancel" -dismissString "Cancel"`; - if( $result != "Ok" ) - return; - - $cameras = `ls -l -type camera`; - } - - for( $camera in $cameras ) - { - string $camParent = firstParentOf($camera); - if( `nodeType $camParent` == "transform" ) - { - vector $rotPivTrans = `getAttr ($camParent+".rotatePivotTranslate")`; - - catchQuiet( `setAttr ($camParent+".rotatePivotTranslate") 0 0 0` ); - catchQuiet( `setAttr ($camParent+".scalePivotTranslate") 0 0 0` ); - catchQuiet( `setAttr ($camParent+".rotatePivot") 0 0 0` ); - catchQuiet( `setAttr ($camParent+".scalePivot") 0 0 0` ); - - catchQuiet( `xform -r -translation ($rotPivTrans.x) ($rotPivTrans.y) ($rotPivTrans.z) $camParent` ); - } - } -} - - -// Convert units and remove the postfixes. -proc float cryToolsConvertUnit( float $inVal, string $from, string $to ) -{ - string $floatStr = `convertUnit -f $from -t $to (""+$inVal)`; - - $floatStr = `substitute "m" $floatStr ""`; - $floatStr = `substitute "rad" $floatStr ""`; - - float $f = $floatStr; - - return $f; -} - -global proc cryOutputAttachmentHelpers() -{ - print("======== Begin Attachment Helpers ========\n"); - - string $selected[] = `ls -sl`; - for( $item in $selected ) - { - string $useItem = ""; - if( `objectType $item` == "locator" ) - { - string $parents[] = `listRelatives -parent $item`; - if( size($parents) > 0 ) - { - $count = stringArrayContains($parents[0], $selected); - if( $count == 0 ) // Dont process this locator if the parent node is alos in the selected list. - $useItem = $parents[0]; - } - } - else - { - string $children[] = `listRelatives -children $item`; - for( $child in $children ) - { - if( `objectType $child` == "locator" ) - { - $useItem = $item; - break; - } - } - } - - string $currentLinearUnit = `currentUnit -q -fullName -linear`; - string $currentAngleUnit = `currentUnit -q -fullName -angle`; - - if( size($useItem) > 0 && `objectType $useItem` == "transform" ) - { - float $trans[] = `xform -q -translation $useItem`; - float $rot[] = `xform -q -rotation $useItem`; - - $trans[0] = `cryToolsConvertUnit $trans[0] $currentLinearUnit "meter"`; - $trans[1] = `cryToolsConvertUnit $trans[1] $currentLinearUnit "meter"`; - $trans[2] = `cryToolsConvertUnit $trans[2] $currentLinearUnit "meter"`; - - $rot[0] = `cryToolsConvertUnit $rot[0] $currentAngleUnit "radian"`; - $rot[1] = `cryToolsConvertUnit $rot[1] $currentAngleUnit "radian"`; - $rot[2] = `cryToolsConvertUnit $rot[2] $currentAngleUnit "radian"`; - - string $quatStr = `cryMayaSupportPlugin convertToQuat $rot[0] $rot[1] $rot[2]`; - - string $tokens[]; - $numTokens = `tokenize $quatStr " " $tokens`; - if( $numTokens == 4 ) - { - float $quat[]; - - $quat[0] = $tokens[0]; - $quat[1] = $tokens[1]; - $quat[2] = $tokens[2]; - $quat[3] = $tokens[3]; - - string $output = (" "); - - print ($output + "\n"); - } - } - } - print("======== End Attachment Helpers ========\n"); -} - -////////////////////////////////////////////////////////////////////// -// Cry Tools Menu -////////////////////////////////////////////////////////////////////// -global proc cryToolsRemoveMenu() -{ - if( `control -q -exists CRYTOOLS_MENU` ) - { - deleteUI -menu CRYTOOLS_MENU; - } -} - -proc createCryToolsMenu() -{ - // Remove the menu first - cryToolsRemoveMenu; - - global string $gMainWindow; - - setParent $gMainWindow; - menu -l "Lumberyard Tools" -p MayaWindow -to 1 -aob true CRYTOOLS_MENU; - - menuItem -label "Create LumberyardExportNode" -command "cryToolsCreateCryExportNode 0"; - menuItem -label "Create CryHelperNode" -command "cryToolsCreateCryHelperNode"; - menuItem -divider true; - menuItem -label "Zero Joint Rotations" -command "cryAnimZeroJointRotation"; - menuItem -label "Anim Manager" -command "cryAnimManagerWin"; - menuItem -label "Output Attachment Helpers" -command "cryOutputAttachmentHelpers"; - menuItem -divider true; - menuItem -label "Load Plug-in" -command "cryLoadPlugin"; - menuItem -label "Unload Plug-in" -command "cryUnloadPlugin"; - menuItem -divider true; - menuItem -label "Reset Camera Pivots" -command "cryToolsFixCameraPivots"; -} - -////////////////////////////////////////////////////////////////////// -// Cry Tools UI -////////////////////////////////////////////////////////////////////// -global proc cryToolsUICloseWindow() -{ - deleteUI -window CRYTOOLS_WINDOW; -} - -proc createCryToolsWindow() -{ - if(!`window -ex CRYTOOLS_WINDOW`) - { - if(`windowPref -exists CRYTOOLS_WINDOW`) - { - windowPref -wh 200 480 -tlc `windowPref -q -topEdge CRYTOOLS_WINDOW` `windowPref -q -leftEdge CRYTOOLS_WINDOW` CRYTOOLS_WINDOW; - //windowPref -remove CRYTOOLS_WINDOW; - } - window -titleBar true -title "Lumberyard Tools" -widthHeight 200 480 -sizeable true -mnb false -mxb false CRYTOOLS_WINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - { - columnLayout -adjustableColumn true -rowSpacing 15 CRYTOOLS_MAINCOL; - { - frameLayout -label "Node Tools" -borderStyle "out" -collapsable true -marginHeight 5 -marginWidth 5; - { - columnLayout -adjustableColumn true -rowSpacing 5; - { - button -label "Create LumberyardExportNode" -command "cryToolsCreateCryExportNode 0"; - button -label "Create Multiple LumberyardExportNodes" -command "cryToolsCreateMultipleCryExportNodes"; - button -label "Create CryHelperNode" -command "cryToolsCreateCryHelperNode"; - } - setParent ..; - } - setParent ..; - - frameLayout -label "Animation Tools" -borderStyle "out" -collapsable true -marginHeight 5 -marginWidth 5; - { - columnLayout -adjustableColumn true -rowSpacing 5; - { - button -label "Zero Joint Rotations" -command "cryAnimZeroJointRotation"; - button -label "Anim Manager" -command "cryAnimManagerWin"; - button -label "Output Attachment Helpers" -command "cryOutputAttachmentHelpers"; - } - setParent ..; - } - setParent ..; - - frameLayout -label "Plug-in Tools" -borderStyle "out" -collapsable true -marginHeight 5 -marginWidth 5; - { - columnLayout -adjustableColumn true -rowSpacing 5; - { - button -label "Load Plug-in" -command "cryLoadPlugin"; - button -label "Unload Plug-in" -command "cryUnloadPlugin"; - } - setParent ..; - } - setParent ..; - - frameLayout -label "Helpers" -borderStyle "out" -collapsable true -marginHeight 5 -marginWidth 5; - { - columnLayout -adjustableColumn true -rowSpacing 5; - { - button -label "Reset Camera Pivots" -command "cryToolsFixCameraPivots"; - } - setParent ..; - } - setParent ..; - } - setParent ..; - } - $closebutton = `button -label "Close" -command ("cryToolsUICloseWindow")`; - setParent ..; - - formLayout -edit - -attachForm CRYTOOLS_MAINCOL "top" 5 - -attachForm CRYTOOLS_MAINCOL "left" 5 - -attachForm CRYTOOLS_MAINCOL "right" 5 - -attachControl CRYTOOLS_MAINCOL "bottom" 5 $closebutton - - -attachForm $closebutton "bottom" 5 - -attachForm $closebutton "left" 5 - -attachForm $closebutton "right" 5 - -attachNone $closebutton "top" - $layout1; - } - - showWindow CRYTOOLS_WINDOW; -} - -////////////////////////////////////////////////////////////////////// -// Window and menu creation entry functions. -////////////////////////////////////////////////////////////////////// -proc cryToolsSourceDependencies() -{ - eval("source cryExport.mel"); - eval("source cryAnim.mel"); - eval("source LumberyardUtilities.mel"); - //eval("source cryExportSettings.mel"); -} - -global proc cryToolsWin() -{ - cryToolsSourceDependencies; - createCryToolsWindow; -} - -global proc cryToolsMenu() -{ - cryToolsSourceDependencies; - createCryToolsMenu; -} - -global proc cryToolsMenuRemove() -{ - cryToolsRemoveMenu; -} - -////////////////////////////////////////////////////////////////////// -// Shelf functions. -////////////////////////////////////////////////////////////////////// -global proc string cryToolsGetShelfNameFromScriptName( string $scriptName ) -{ - string $shelfName = $scriptName; - string $tokens[]; - $numTokens = `tokenize $scriptName "_." $tokens`; - if( $numTokens == 3 ) - { - $shelfName = $tokens[1]; - } - return $shelfName; -} - -global proc cryToolsLoadShelf( string $scriptName ) -{ - string $shelfName = `cryToolsGetShelfNameFromScriptName $scriptName`; - if (`shelfLayout -exists $shelfName`) - { - deleteUI $shelfName; - } - evalDeferred( "loadNewShelf "+$scriptName ); -} \ No newline at end of file diff --git a/Tools/maya/script/cryUDP.mel b/Tools/maya/script/cryUDP.mel deleted file mode 100644 index 7450413e88..0000000000 --- a/Tools/maya/script/cryUDP.mel +++ /dev/null @@ -1,157 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// This script needs to know its own mel name. If you change the file name, change this. -global string $cryUDP_nameOfScript = "cryUDP.mel"; - - - - -global proc UDPCloseWindow() -{ - if(`window -ex CRYUDP_WINDOW`) - deleteUI -window CRYUDP_WINDOW; -} - -global proc UDPSave(string $value) -{ - string $selected[]; - $selected = `ls -sl`; - if( size($selected) > 0 ) - { - string $node = $selected[0]; - - // Add the UDP attribute - if( !`attributeExists "UDP" $node` ) - addAttr -ln UDP -dt "string" $node; - - //string $value = `scrollField -q -text UDP_LINES`; - setAttr -type "string" ($node+".UDP") $value; - - //button -e -enable false UDP_SAVEBUTTON; - } -} - - - -global proc UDPUpdate() -{ - int $set = 0; - string $selected[]; - $selected = `ls -sl`; - string $nodeName = ""; - if( size($selected) > 0 ) - { - string $node = $selected[0]; - $nodeName = $node; - - if( `attributeExists "UDP" $node` ) - { - string $value = `getAttr ($node+".UDP")`; - scrollField -e -text $value UDP_LINES; - $set = 1; - } - } - if( $set == 0 ) - scrollField -e -text "" UDP_LINES; - - text -e -label (" Node : " + $nodeName) UDP_NODE; - - button -e -enable false UDP_SAVEBUTTON; -} - - -global proc cryPopulatePopup() -{ - string $scriptPath = `whatIs "cryUDP.mel"`; - string $path = `match "[^ ]*$" $scriptPath`; - $path = dirname($path); - string $textFile = $path + "/cryUDP_Values.txt"; - print $textFile; - print "\n"; - - $fileId=`fopen $textFile "r"`; - - string $nextLine = `fgetline $fileId`; - while ( size( $nextLine ) > 0 ) - { - //$nextLine = ($nextLine + "\n"); - string $noReturn = `substitute "\n" $nextLine ""`; - print ("scrollField -e -it " + $noReturn + " -ip 0 UDP_LINES;\n"); - menuItem -label $nextLine -c ("scrollField -e -it \"" + $noReturn + "\" -ip 0 UDP_LINES; scrollField -e -it \"\\n\" -ip 0 UDP_LINES;") -parent UDP_OPTIONMENU; - $nextLine = `fgetline $fileId`; - } - - - fclose $fileId; -} - - -global proc cryUDPWindow( ) -{ - if(!`window -ex CRYUDP_WINDOW`) - { - if(`windowPref -exists CRYUDP_WINDOW`) - { - windowPref -wh 350 210 -tlc `windowPref -q -topEdge CRYUDP_WINDOW` `windowPref -q -leftEdge CRYUDP_WINDOW` CRYUDP_WINDOW; - } - window -titleBar true -title "User Defined Properties" -widthHeight 350 210 -sizeable false -mnb false -mxb false CRYUDP_WINDOW; - - $layout1 = `formLayout -numberOfDivisions 100`; - - text -label "Node : " -align "left" -font "boldLabelFont" UDP_NODE; - - scrollField -keyPressCommand ("button -e -enable true UDP_SAVEBUTTON") UDP_LINES; - - popupMenu -parent UDP_LINES UDP_OPTIONMENU; - //menuItem -label "test\n" -c "scrollField -e -it test -ip 0 UDP_LINES;" -parent UDP_OPTIONMENU; - cryPopulatePopup(); - - button -label "Save" -command ("UDPSave(`scrollField -q -text UDP_LINES`); button -e -enable false UDP_SAVEBUTTON;") UDP_SAVEBUTTON; - button -label "Close" -command ("UDPCloseWindow") UDP_CLOSEBUTTON; - setParent ..; - - formLayout -edit - -attachForm UDP_NODE "top" 5 - -attachForm UDP_NODE "left" 5 - -attachForm UDP_NODE "right" 5 - -attachNone UDP_NODE "bottom" - - //-attachControl UDP_OPTIONMENU "top" 5 UDP_NODE - //-attachForm UDP_OPTIONMENU "left" 5 - //-attachForm UDP_OPTIONMENU "right" 5 - //-attachControl UDP_OPTIONMENU "bottom" 5 UDP_LINES - - -attachControl UDP_LINES "top" 5 UDP_NODE - -attachForm UDP_LINES "left" 5 - -attachForm UDP_LINES "right" 5 - -attachControl UDP_LINES "bottom" 5 UDP_SAVEBUTTON - - -attachControl UDP_SAVEBUTTON "bottom" 5 UDP_CLOSEBUTTON - -attachForm UDP_SAVEBUTTON "left" 5 - -attachForm UDP_SAVEBUTTON "right" 5 - -attachNone UDP_SAVEBUTTON "top" - - -attachForm UDP_CLOSEBUTTON "bottom" 5 - -attachForm UDP_CLOSEBUTTON "left" 5 - -attachForm UDP_CLOSEBUTTON "right" 5 - -attachNone UDP_CLOSEBUTTON "top" - $layout1; - - UDPUpdate(); - - showWindow CRYUDP_WINDOW; - - scriptJob -event "SelectionChanged" "UDPUpdate" -parent "CRYUDP_WINDOW"; - } -} \ No newline at end of file diff --git a/Tools/maya/script/cryUDP_Values.txt b/Tools/maya/script/cryUDP_Values.txt deleted file mode 100644 index 5e118ff747..0000000000 --- a/Tools/maya/script/cryUDP_Values.txt +++ /dev/null @@ -1,36 +0,0 @@ -no_explosion_occlusion -other_rendermesh -colltype_player -box -cylinder -capsule -sphere -notaprim -no_hit_refinement -dynamic -entity -gameplay_critical -player_can_break -childof_unbroken -mass= -density= -pieces= -limit= -bend= -twist= -pull= -push= -shift= -constraint_limit= -constraint_minang= -consrtaint_maxang= -constraint_damping= -consrtaint_collides= -stiffness= -hardness= -max_stretch= -max_impulse= -skin_dist= -thickness= -notaprim -explosion_scale= \ No newline at end of file diff --git a/Tools/maya/script/cryValidate.mel b/Tools/maya/script/cryValidate.mel deleted file mode 100644 index 4fb4d66189..0000000000 --- a/Tools/maya/script/cryValidate.mel +++ /dev/null @@ -1,599 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -global int $g_enableValidateHelpWindow = false; - -proc string cryValidateGetMessageList() -{ - string $s; - $s = `cryValidatePlugin messages getMessageList`; - return $s; -} - -global proc string[] cryValidateDecodeMessageString( string $message ) -{ - string $decode[]; - string $tokens[]; - $numTokens = `tokenize $message "," $tokens`; - if( $numTokens == 5 ) - { - $decode[0] = $tokens[0]; // Enable - $decode[1] = $tokens[1]; // IsCritical - $decode[2] = $tokens[2]; // MessageType - $decode[3] = $tokens[3]; // FocusNode - $decode[4] = $tokens[4]; // MessageText - } - - return $decode; -} - -proc int cryValidateAllowExport() -{ - string $s; - $s = `cryValidatePlugin messages messageSource`; - if( $s == "EXPORT" ) - return 1; - - return 0; -} - -proc cryValidateShowIgnoreState() -{ - // Disable the messages in the list - string $s; - $s = `cryValidateGetMessageList`; - - string $messages[]; - $messageCount = `tokenize $s ";" $messages`; - - string $childControls[]; - $childControls = `layout -q -childArray CRYVALIDATE_COLUMNLAYOUT`; - - layout -e -visible 0 CRYVALIDATE_COLUMNLAYOUT; - int $allDisabled = 1; - if( size($s) > 0 ) - { - int $childNum = 0; - for( $message in $messages ) - { - string $decode[]; - $decode = `cryValidateDecodeMessageString $message`; - - $child = $childControls[$childNum]; - - string $rowChildren[]; - $rowChildren = `layout -q -childArray $child`; - - int $enable = $decode[0]; - $enable = 1-$enable; - int $isCritical = $decode[1]; - - float $colG = .85; - if( $isCritical ) - $colG = .65; - - $messageControl = $rowChildren[0]; - - if( $enable == 1 ) - { - control -e -enable true -bgc .95 $colG .65 $messageControl; - $allDisabled = 0; - } - else - { - control -e -enable false -bgc .4 .4 .4 $messageControl; - } - - $childNum++; - } - } - - // Disable the export button if all the errors haven't been ignored. - if( $allDisabled ) - { - button -e -enable true CRYVALIDATE_EXPORT; - } - else - { - button -e -enable false CRYVALIDATE_EXPORT; - } - - layout -e -visible 1 CRYVALIDATE_COLUMNLAYOUT; -} - -global proc cryValidateCopyMessageText( string $messageText ) -{ - cryMayaSupportPlugin copyToClipboard $messageText; -} - -proc cryValidatePopulateMessageList() -{ - global int $g_enableValidateHelpWindow; - - setParent CRYVALIDATE_COLUMNLAYOUT; - string $childControls[]; - $childControls = `layout -q -childArray CRYVALIDATE_COLUMNLAYOUT`; - - for( $child in $childControls ) - { - deleteUI $child; - } - - string $s; - $s = `cryValidateGetMessageList`; - - if( size($s) > 0 ) - { - string $messages[]; - $messageCount = `tokenize $s ";" $messages`; - - int $messageNum = 0; - for( $message in $messages ) - { - string $decode[]; - $decode = `cryValidateDecodeMessageString $message`; - string $messageType = $decode[2]; - - $rowName = `rowLayout -numberOfColumns 3 -columnWidth3 300 65 65 -adjustableColumn 1 -columnAlign 1 "left" - -columnAlign 2 "center" -columnAlign 3 "center" - -columnAttach 2 "both" 0 -columnAttach 3 "both" 0 -bgc .4 .4 .4`; - { - int $isCritical = $decode[1]; - int $hasFocus = 1; - if( size($decode[3]) == 0 || $decode[3] == "*" ) - $hasFocus = 0; - int $allowIgnoreAllType = 1; - if( $isCritical ) - $allowIgnoreAllType = 0; - - int $allowExport = `cryValidateAllowExport`; - int $showIgnore = 1; - if( $allowExport == 0 ) - $showIgnore = 0; - - string $messageText = $decode[4]; - $messageTextControl = `text -h 22 -label (" "+$messageText)`; - $ignoreButton = `button -align "center" -label "Ignore" -enable (1-$isCritical) -command ( "cryValidateIgnoreMessage "+$messageNum )`; - $focusButton = `button -align "center" -label "Focus" -enable $hasFocus -command ( "cryValidateFocus \""+$decode[3]+"\"" )`; - - if( $showIgnore == 0 ) - { - button -e -visible false $ignoreButton; - rowLayout -e -columnWidth 2 1 $rowName; - } - - popupMenu -parent $rowName -button 3 CRYVALIDATE_IDMENU; - { - menuItem -label "Copy message text" -command ( "cryValidateCopyMessageText \""+$messageText+"\"" ); - menuItem -divider true; - if( $showIgnore == 1 ) - { - menuItem -label "Ignore" -enable (1-$isCritical) -command ( "cryValidateIgnoreMessage "+$messageNum ); - menuItem -label "Ignore all messages of this type" -enable $allowIgnoreAllType -command ( "cryValidateIgnoreMessageType "+$messageNum ); - menuItem -divider true; - } - menuItem -label "Focus" -enable $hasFocus -command ( "cryValidateFocus \""+$decode[3]+"\"" ); - menuItem -divider true; - menuItem -label "Validate Message Settings" -command ("cryValidateMessageControl \""+$decode[2]+"\""); - if ($g_enableValidateHelpWindow) - { - menuItem -label "Validate Help" -command ("cryValidateHelpWindow"); - } - if( `cryValidateFixCanFix $messageType` ) - { - menuItem -divider true; - menuItem -label "Auto Fix Problem" -command("cryValidateFix " +$messageType+" \""+$decode[3]+"\""); - } - } - } - setParent ..; - $messageNum++; - } - } - else - { - text -label "No validate messages." -align "center" -bgc .4 .4 .4; - } - - cryValidateShowIgnoreState; -} - -global proc cryValidateIgnoreMessage( int $messageNum ) -{ - cryValidatePlugin messages ignoreMessage $messageNum; - cryValidateShowIgnoreState; -} - -global proc cryValidateIgnoreMessageType( int $inMessageNum ) -{ - string $s; - $s = `cryValidateGetMessageList`; - if( size($s) > 0 ) - { - string $messages[]; - $messageCount = `tokenize $s ";" $messages`; - - string $inMessageType = ""; - if( $inMessageNum < size($messages) ) - { - string $message = $messages[$inMessageNum]; - string $decode[]; - $decode = `cryValidateDecodeMessageString $message`; - $inMessageType = $decode[2]; - } - - int $messageNum = 0; - for( $message in $messages ) - { - string $decode[]; - $decode = `cryValidateDecodeMessageString $message`; - string $messageType = $decode[2]; - if( $messageType == $inMessageType ) - { - cryValidatePlugin messages ignoreMessage $messageNum; - } - $messageNum++; - } - } - cryValidateShowIgnoreState; -} - -global proc cryValidateFocus( string $focusNode ) -{ - if( `startsWith $focusNode "loc"` ) - { - string $tokens[]; - $numTokens = `tokenize $focusNode ":" $tokens`; - - if( $numTokens == 4 ) // Should be "loc x y z" - { - string $userUnit = `currentUnit -q -linear`; - // It seems that some RC errors give values that are 100 times smaller then meters. TODO: work out whats going on with RC. - float $x = (float)(`strip $tokens[1]`) * 100.0; - float $y = (float)(`strip $tokens[2]`) * 100.0; - float $z = (float)(`strip $tokens[3]`) * 100.0; - - // Convert to the current UI unit. - $x = `convertUnit -fromUnit "meter" -toUnit $userUnit (""+$x)`; // Need to concat it to a string as convertUnit will only work with a string - $y = `convertUnit -fromUnit "meter" -toUnit $userUnit (""+$y)`; - $z = `convertUnit -fromUnit "meter" -toUnit $userUnit (""+$z)`; - - // Swap for y-up if needed - if( `upAxis -q -axis` == "y" ) - { - $temp = $y; - $y = $z; - $z = -$temp; - } - - string $focusLocatorName = "CRYFOCUSLOCATOR"; - if( !`objExists $focusLocatorName` ) - { - spaceLocator -p 0 0 0 -absolute -n $focusLocatorName; - xform -absolute -translation $x $y $z $focusLocatorName; - } - else - { - spaceLocator -e -p 0 0 0 -absolute $focusLocatorName; - xform -absolute -translation $x $y $z $focusLocatorName; - } - - select $focusLocatorName; - fitPanel -selected; - } - } - else if( $focusNode != "*" ) - { - eval("select -r "+$focusNode); - } -} - -global proc cryValidateCloseWindow() -{ - if( `window -exists CRYVALIDATE_WINDOW` ) - { - deleteUI -window CRYVALIDATE_WINDOW; - } -} - -global proc cryValidateCloseAndReset() -{ - cryValidateCloseWindow; - cryValidatePlugin reset; // Remove all messages and un-mark any ignored ones. -} - -global proc cryValidateExport() -{ - // Tell the exporter to use the same options as the last time it was run. - string $options = ""; - $options += "cryExportType=postValidateReexport" + ";"; - - file -op $options -typ "MayaCryExport" -pr -ea "dummyExportName"; -} - -global proc cryValidateRevalidate() -{ - cryValidateCloseWindow; - evalDeferred( "cryValidatePlugin recheck" ); -} - -global proc cryValidateCreateControls( int $selected ) -{ - global int $g_enableValidateHelpWindow; - // Save the window prefs. We need to do this as the window will move to the location in the prefs when - // the main form layout is deleted. - windowPref -saveAll; - - if( `layout -exists CRYVALIDATE_FORMLAYOUT` ) - return; - - formLayout -numberOfDivisions 100 -visible false CRYVALIDATE_FORMLAYOUT; - { - popupMenu -button 3 CRYVALIDATE_FORMIDMENU; - { - menuItem -label "Validate Message Settings" -command ("cryValidateMessageControl \"\""); - if ($g_enableValidateHelpWindow) - { - menuItem -label "Validate Help" -command ("cryValidateHelpWindow"); - } - } - scrollLayout -childResizable true -hst 0 -vst 15 -bgc .4 .4 .4 CRYVALIDATE_SCROLLLAYOUT; - { - columnLayout -adjustableColumn true -columnOffset "both" 5 -rowSpacing 5 -bgc .4 .4 .4 CRYVALIDATE_COLUMNLAYOUT; - { - } - setParent ..; - } - setParent ..; - - button -label "Continue Export" -command ("cryValidateExport") CRYVALIDATE_EXPORT; - button -label "Re-Validate" -command ("cryValidateRevalidate") CRYVALIDATE_REVALIDATE; - button -label "Close" -command ("cryValidateCloseAndReset") CRYVALIDATE_CLOSE; - } - - // Show or hide the export button - int $enableExport = `cryValidateAllowExport`; - int $firstAttach = 0; - int $secondAttach = 0; - if( $enableExport ) - { - button -e -visible true CRYVALIDATE_EXPORT; - $firstAttach = 33; - $secondAttach = 66; - } - else - { - button -e -visible false CRYVALIDATE_EXPORT; - $firstAttach = 0; - $secondAttach = 50; - } - - formLayout -edit - -attachForm CRYVALIDATE_SCROLLLAYOUT "top" 5 - -attachForm CRYVALIDATE_SCROLLLAYOUT "left" 5 - -attachForm CRYVALIDATE_SCROLLLAYOUT "right" 5 - -attachControl CRYVALIDATE_SCROLLLAYOUT "bottom" 5 CRYVALIDATE_CLOSE - - -attachForm CRYVALIDATE_EXPORT "bottom" 5 - -attachForm CRYVALIDATE_EXPORT "left" 5 - -attachPosition CRYVALIDATE_EXPORT "right" 5 $firstAttach - -attachNone CRYVALIDATE_EXPORT "top" - - -attachForm CRYVALIDATE_REVALIDATE "bottom" 5 - -attachPosition CRYVALIDATE_REVALIDATE "left" 5 $firstAttach - -attachPosition CRYVALIDATE_REVALIDATE "right" 5 $secondAttach - -attachNone CRYVALIDATE_REVALIDATE "top" - - -attachForm CRYVALIDATE_CLOSE "bottom" 5 - -attachPosition CRYVALIDATE_CLOSE "left" 5 $secondAttach - -attachForm CRYVALIDATE_CLOSE "right" 5 - -attachNone CRYVALIDATE_CLOSE "top" - CRYVALIDATE_FORMLAYOUT; - - cryValidatePopulateMessageList; - - formLayout -e -visible true CRYVALIDATE_FORMLAYOUT; -} - -proc cryValidateCreateWindow() -{ - global int $g_enableValidateHelpWindow; - // If the window exists but is not visible, close it - and reset the messages. - if( `window -ex CRYVALIDATE_WINDOW` && !`window -q -vis CRYVALIDATE_WINDOW`) - { - cryValidateCloseAndReset; - } - - if(!`window -ex CRYVALIDATE_WINDOW`) - { - if(`windowPref -exists CRYVALIDATE_WINDOW`) - { - windowPref -wh 800 400 -tlc `windowPref -q -topEdge CRYVALIDATE_WINDOW` `windowPref -q -leftEdge CRYVALIDATE_WINDOW` CRYVALIDATE_WINDOW; - //windowPref -remove CRYVALIDATE_WINDOW; - } - window -titleBar true -title "Lumberyard Validate" -sizeable true -mnb false -mxb false CRYVALIDATE_WINDOW; - - cryValidateCreateControls 0; - - showWindow CRYVALIDATE_WINDOW; - - int $dontShow = `cryValidateHelpLoadDontShow`; - if( !$dontShow && $g_enableValidateHelpWindow ) - { - cryValidateHelpWindow; - } - } - else - { - cryValidatePopulateMessageList; - } -} - -proc cryValidateSourceDependencies() -{ - //eval("source cryExport.mel"); // Removed from here as resourcing the script will it is running is causing heap corruption in OpenMaya.dll - eval("source cryValidateFix.mel"); - - if( !`cryPluginIsLoaded` ) - cryLoadPluginQuiet; -} - -global proc cryValidate( ) -{ - cryValidateSourceDependencies(); - cryValidateCreateWindow(); -} - -global proc cryValidateRunBasic( ) -{ - cryValidateSourceDependencies(); - cryValidatePlugin basic silentIfClean; -} - -global proc cryValidateRunComplete( ) -{ - cryValidateSourceDependencies(); - cryValidatePlugin complete silentIfClean; -} - -global proc string cryValidateIsMessageWindowVisible() -{ - // Window has to be open and visible - if( `window -ex CRYVALIDATE_WINDOW` && `window -q -vis CRYVALIDATE_WINDOW`) - { - return "1"; - } - return "0"; -} - -// Progress window. -global proc cryValidateProgressUpdate( string $text, float $amount ) -{ - progressWindow -edit -progress $amount -status ("Validating:" + $amount+"%"+" : "+$text); -} - -global proc cryValidateProgressCloseWindow() -{ - progressWindow -endProgress; -} - -global proc cryValidateProgress( ) -{ - int $amount = 0; - progressWindow -title "Validating" -progress $amount -status " Validating: 0% " -isInterruptable false; -} - -////////////////////////////////// -// Help Window -////////////////////////////////// -global proc cryValidateHelpSaveDontShow( int $value ) -{ - optionVar -iv "cryValidateHelpDontShow" $value; -} - -global proc int cryValidateHelpLoadDontShow( ) -{ - int $value = 0; - if(`optionVar -exists "cryValidateHelpDontShow"` ) - { - $value = `optionVar -q "cryValidateHelpDontShow"`; - } - return $value; -} - -global proc cryValidateHelpCloseWindow() -{ - if( `control -exists CRYVALIDATEHELP_DONTSHOW` ) - { - int $value = `checkBox -q -value CRYVALIDATEHELP_DONTSHOW`; - cryValidateHelpSaveDontShow $value; - } - - deleteUI -window CRYVALIDATEHELP_WINDOW; -} - -global proc cryValidateMessageHelp( string $messageType ) -{ - cryMayaSupportPlugin start "http://confluence/display/SNT/Maya+Validate+Message+Help#groupNodeHasNoChildren"; -} - -global proc cryValidateHelpWindow( ) -{ - if(!`window -ex CRYVALIDATEHELP_WINDOW`) - { - if(`windowPref -exists CRYVALIDATEHELP_WINDOW`) - { - windowPref -remove CRYVALIDATEHELP_WINDOW; - } - window -widthHeight 750 450 -titleBar true -title "Lumberyard Validate Help" -sizeable true -mnb false -mxb false CRYVALIDATEHELP_WINDOW; - - formLayout -numberOfDivisions 100 -visible false CRYVALIDATEHELP_FORMLAYOUT; - { - string $helpText = "Export Validation.\n\n"; - $helpText += "The validation runs before the exporter. If the validation produces any messages the export will be stopped and no files are written. You can also run the validation from the Crytek shelf.\n\n"; - $helpText += "There are two types of messages produced by the validation, critical and ignorable. If there are any critical messages you can't export until they are fixed. Ignorable messages can be ignored but will come back the next time the validation is run. They really should be fixed as well as it will be annoying to have to ignore them every time for every export.\n\n"; - $helpText += "\nIgnoring Messages.\n\n"; - $helpText += "If the scene has ignorable messages, the validate window will pop up when the `Export` button is clicked. If you ignore the messages you can conplete the export by clicking the `Continue Export` at the bottom of the validate window. \nSo the process is:\n - Click `Export`.\n - 'Ignore' messages.\n - Click `Continue Export`.\n - Wait for the export to finish.\n - Close validate window.\nIf there are no messages to display the validate window is not shown and the export happens with the first click of the `Export` button.\n\n"; - $helpText += "\nFocus Button.\n\n"; - $helpText += "There is also a `Focus` button. This will select the node or component that caused the message and make it easier the find the problem. The focus button will be grayed out if there is nothing to focus on.\n\n"; - scrollField -editable false -wordWrap true -text $helpText CRYVALIDATEHELP_HELPTEXT; - checkBox -label "Don't show this dialog again." CRYVALIDATEHELP_DONTSHOW; - button -label "Close" -command ("cryValidateHelpCloseWindow;") CRYVALIDATEHELP_CLOSE; - } - setParent ..; - - formLayout -edit - -attachForm CRYVALIDATEHELP_HELPTEXT "top" 5 - -attachForm CRYVALIDATEHELP_HELPTEXT "left" 5 - -attachForm CRYVALIDATEHELP_HELPTEXT "right" 5 - -attachControl CRYVALIDATEHELP_HELPTEXT "bottom" 5 CRYVALIDATEHELP_DONTSHOW - - -attachNone CRYVALIDATEHELP_DONTSHOW "top" - -attachForm CRYVALIDATEHELP_DONTSHOW "left" 5 - -attachForm CRYVALIDATEHELP_DONTSHOW "right" 5 - -attachControl CRYVALIDATEHELP_DONTSHOW "bottom" 5 CRYVALIDATEHELP_CLOSE - - -attachNone CRYVALIDATEHELP_CLOSE "top" - -attachForm CRYVALIDATEHELP_CLOSE "left" 5 - -attachForm CRYVALIDATEHELP_CLOSE "right" 5 - -attachForm CRYVALIDATEHELP_CLOSE "bottom" 5 - CRYVALIDATEHELP_FORMLAYOUT; - - int $dontShow = `cryValidateHelpLoadDontShow`; - checkBox -edit -value $dontShow CRYVALIDATEHELP_DONTSHOW; - - showWindow CRYVALIDATEHELP_WINDOW; - } -} - -////////////////////////////////// -// This function is only here to use as a debug tool. -// There is no way to get to this function though the UI. -////////////////////////////////// -global proc cryValidateDebugIgnoreAll( ) -{ - string $s; - $s = `cryValidateGetMessageList`; - if( size($s) > 0 ) - { - string $messages[]; - $messageCount = `tokenize $s ";" $messages`; - - for( $i = 0;$i<$messageCount;$i ++ ) - { - cryValidatePlugin messages ignoreMessage $i; - } - - } - cryValidateShowIgnoreState; -} diff --git a/Tools/maya/script/cryValidateFix.mel b/Tools/maya/script/cryValidateFix.mel deleted file mode 100644 index 955f00a6ca..0000000000 --- a/Tools/maya/script/cryValidateFix.mel +++ /dev/null @@ -1,149 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -global proc int cryValidateFixCanFix(string $messageType) -{ - if( strcmp($messageType, "llShouldNotInheritTrans") == 0 ) - return 1; - else if( strcmp($messageType, "exportNodeNotTopLevel") == 0 ) - return 0; - else if( strcmp($messageType, "InvalidUDPChars") == 0 ) - return 1; - else if( strcmp($messageType, "meshWeightsNot1") == 0 ) - return 1; - else if( strcmp($messageType, "groupNodeNotOnGrid") == 0 ) - return 1; - return 0; -} - -global proc cryValidateFix( string $messageType, string $focusNode) -{ - if( `objExists $focusNode` == 0 ) - { - return; - } - - if( strcmp($messageType, "llShouldNotInheritTrans") == 0 ) - { - cryValidateFixShouldNotInheritTransform $focusNode; - } - else if( strcmp($messageType, "exportNodeNotTopLevel") == 0 ) - { - cryValidateFixExportNodeNotTopLevel $focusNode; - } - else if( strcmp($messageType, "InvalidUDPChars") == 0 ) - { - cryValidateFixInvalidUDPChars $focusNode; - } - else if( strcmp($messageType, "meshWeightsNot1") == 0 ) - { - cryValidateFixWeightsNotNormalised $focusNode; - } - else if( strcmp($messageType, "groupNodeNotOnGrid") == 0 ) - { - cryValidateFixGroupNodeNotOnGrid $focusNode; - } -} - -////////////////////////////////////////////////////////////////////// -// Fix functions -////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////// -// Joint node should not inhert the trasform of it's parent. Used for locamotion locators etc. -global proc cryValidateFixShouldNotInheritTransform(string $node) -{ - setAttr ($node+".inheritsTransform") 0; -} - -////////////////////////////////////////////////////////////////////// -// Export node is not top level -global proc cryValidateFixExportNodeNotTopLevel(string $node) -{ - string $pathTokens[]; - $pathCount = `tokenize $node "|" $pathTokens`; - - print("Path `"+$node+"` :: Count "+$pathCount); - if( $pathCount == 2 ) - { - confirmDialog -title "Lumberyard Auto Fix" -message ("Should the node `"+$pathTokens[0]+"` be the scene root node. If so we can rename it to `SceneRoot`.") -button "OK"; - - // TODO: Finish this...... - } -} - -////////////////////////////////////////////////////////////////////// -// Invalid characters in the UDP -global proc cryValidateFixInvalidUDPChars(string $node) -{ - string $udpAttributeName = "UDP"; - if (`attributeExists $udpAttributeName $node`) - { - string $nodeUDP = `getAttr ($node+"."+$udpAttributeName)`; - - // Remove both carriage return and linefeed - while( 1 ) - { - string $newUDP = `substitute "&cr;&lf;" $nodeUDP "\n"`; - if( `strcmp $newUDP $nodeUDP` == 0 ) - break; - $nodeUDP = $newUDP; - } - - // Remove carriage return - while( 1 ) - { - string $newUDP = `substitute "&cr;" $nodeUDP "\n"`; - if( `strcmp $newUDP $nodeUDP` == 0 ) - break; - $nodeUDP = $newUDP; - } - - // Remove linefeed - while( 1 ) - { - string $newUDP = `substitute "&lf;" $nodeUDP "\n"`; - if( `strcmp $newUDP $nodeUDP` == 0 ) - break; - $nodeUDP = $newUDP; - } - - setAttr -type "string" ($node+"."+$udpAttributeName) $nodeUDP; - } -} - -////////////////////////////////////////////////////////////////////// -// Vertex weights not normalised, dont add up to 1. -global proc cryValidateFixWeightsNotNormalised(string $focusNode) -{ - string $currentSelection[] = `ls -sl`; - - eval("select -r "+$focusNode); - eval("doNormalizeWeightsArgList 1 {\"4\"}"); - - select -r $currentSelection; -} - -////////////////////////////////////////////////////////////////////// -// Group node is not aligned to the grid -global proc cryValidateFixGroupNodeNotOnGrid(string $node) -{ - float $gridSize = 1.0; - vector $v = `xform -q -worldSpace -rotatePivot $node`; - - float $xVal = floor($v.x+0.5); - float $yVal = floor($v.y+0.5); - float $zVal = floor($v.z+0.5); - - xform -worldSpace -rotatePivot $xVal $yVal $zVal $node; -} \ No newline at end of file diff --git a/Tools/maya/script/cryValidateMessageControl.mel b/Tools/maya/script/cryValidateMessageControl.mel deleted file mode 100644 index facbbca62a..0000000000 --- a/Tools/maya/script/cryValidateMessageControl.mel +++ /dev/null @@ -1,255 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -global proc cryValidateMessageControlClose() -{ - if( `window -exists CRYVALIDATEMESSAGECONTROL_WINDOW` ) - { - deleteUI -window CRYVALIDATEMESSAGECONTROL_WINDOW; - } -} - -proc string cryValidateMessageControlGetMessageData() -{ - string $s; - // messageType, MessageDesc, ignorable, disabled - //$s = "messageType1,Message Description 1,1,1;messageType1,Message Description 2,1,1;messageType1,Message Description 3,1,1;messageType1,Message Description 4,1,1;"; - - $s = `cryValidatePlugin messages getMessageData`; - return $s; -} - -global proc string[] cryValidateMessageControlDecodeMessageDataString( string $messageData ) -{ - string $decode[]; - string $tokens[]; - $numTokens = `tokenize $messageData "," $tokens`; - if( $numTokens == 5 ) - { - $decode[0] = $tokens[0]; // Message Type - $decode[1] = $tokens[1]; // Message Desc - $decode[2] = $tokens[2]; // Editable - $decode[3] = $tokens[3]; // Ignorable - $decode[4] = $tokens[4]; // Disabled - } - - return $decode; -} - -global proc cryValidateMessageControlSettingChange() -{ - global int $cryValidateMessageControlSettingsHaveChanged = 0; - $cryValidateMessageControlSettingsHaveChanged = 1; - - if( `control -exists CRYVALIDATEMESSAGECONTROL_SAVE` ) - { - button -e -enable true CRYVALIDATEMESSAGECONTROL_SAVE; - } -} - -proc cryValidateMessageControlPopulateMessageList() -{ - global string $g_validateMessageControlHiLight = ""; - - setParent CRYVALIDATEMESSAGECONTROL_COLUMNLAYOUT; - string $childControls[]; - $childControls = `layout -q -childArray CRYVALIDATEMESSAGECONTROL_COLUMNLAYOUT`; - - for( $child in $childControls ) - { - deleteUI $child; - } - - string $s; - $s = `cryValidateMessageControlGetMessageData`; - - if( size($s) > 0 ) - { - string $messages[]; - $messageCount = `tokenize $s ";" $messages`; - - int $messageNum = 0; - for( $message in $messages ) - { - string $decode[]; - $decode = `cryValidateMessageControlDecodeMessageDataString $message`; - string $messageType = $decode[0]; - string $messageDesc = $decode[1]; - int $editable = $decode[2]; - int $ignorable = $decode[3]; - int $disabled = $decode[4]; - - setParent CRYVALIDATEMESSAGECONTROL_COLUMNLAYOUT; - print("Message `"+$message+"` MessageType `"+$messageType+"`\n"); - $rowName = `rowLayout -numberOfColumns 3 -columnWidth3 200 80 80 -adjustableColumn 1 -columnAlign 1 "left" - -columnAlign 2 "center" -columnAlign 3 "center" - -columnAttach 2 "both" 0 -columnAttach 3 "both" 0 -bgc .4 .4 .4 - $messageType`; // Name the rowLayout with the messageType so we know what it's about. - - // If we launched the settings widow using a perticular message, hilight it. - if( $g_validateMessageControlHiLight != "" ) - { - if( `strcmp $g_validateMessageControlHiLight $messageType` == 0 ) - rowLayout -edit -bgc .45 .45 .45 $messageType; - } - - { - string $messageText = $messageDesc; - if( size($messageText) == 0 || $messageText == " " ) - $messageText = "* Message With No Description *"; - $messageTextControl = `text -h 22 -label (" " + $messageText)`; - - checkBox -v $ignorable -label "Ignorable" -enable $editable -cc("cryValidateMessageControlSettingChange"); - checkBox -v $disabled -label "Disabled" -enable $editable -cc("cryValidateMessageControlSettingChange"); - } - setParent ..; - $messageNum++; - } - } - else - { - text -label "No validate messages." -align "center" -bgc .4 .4 .4; - } -} - -proc cryValidateMessageControlCreateWindow() -{ - // If the window exists but is not visible, close it - and reset the messages. - if( `window -ex CRYVALIDATEMESSAGECONTROL_WINDOW` && !`window -q -vis CRYVALIDATEMESSAGECONTROL_WINDOW`) - { - cryValidateCloseAndReset; - } - - if(!`window -ex CRYVALIDATEMESSAGECONTROL_WINDOW`) - { - if(`windowPref -exists CRYVALIDATEMESSAGECONTROL_WINDOW`) - { - windowPref -wh 800 400 -tlc `windowPref -q -topEdge CRYVALIDATEMESSAGECONTROL_WINDOW` `windowPref -q -leftEdge CRYVALIDATEMESSAGECONTROL_WINDOW` CRYVALIDATEMESSAGECONTROL_WINDOW; - //windowPref -remove CRYVALIDATEMESSAGECONTROL_WINDOW; - } - window -titleBar true -title "Lumberyard Validate Messages" -wh 800 400 -sizeable true -mnb false -mxb false CRYVALIDATEMESSAGECONTROL_WINDOW; - - formLayout -numberOfDivisions 100 -visible false CRYVALIDATEMESSAGECONTROL_FORMLAYOUT; - { - scrollLayout -childResizable true -hst 0 -vst 15 -bgc .4 .4 .4 CRYVALIDATEMESSAGECONTROL_SCROLLLAYOUT; - { - columnLayout -adjustableColumn true -columnOffset "both" 5 -rowSpacing 5 -bgc .4 .4 .4 CRYVALIDATEMESSAGECONTROL_COLUMNLAYOUT; - { - } - setParent ..; - } - setParent ..; - - button -label "Reset to Defaults" -command ("cryValidateMessageControlReset") CRYVALIDATEMESSAGECONTROL_RESET; - button -label "Save" -enable false -command ("cryValidateMessageControlSave") CRYVALIDATEMESSAGECONTROL_SAVE; - button -label "Close" -command ("cryValidateMessageControlClose") CRYVALIDATEMESSAGECONTROL_CLOSE; - } - - formLayout -edit - -attachForm CRYVALIDATEMESSAGECONTROL_SCROLLLAYOUT "top" 5 - -attachForm CRYVALIDATEMESSAGECONTROL_SCROLLLAYOUT "left" 5 - -attachForm CRYVALIDATEMESSAGECONTROL_SCROLLLAYOUT "right" 5 - -attachControl CRYVALIDATEMESSAGECONTROL_SCROLLLAYOUT "bottom" 5 CRYVALIDATEMESSAGECONTROL_CLOSE - - -attachForm CRYVALIDATEMESSAGECONTROL_RESET "bottom" 5 - -attachForm CRYVALIDATEMESSAGECONTROL_RESET "left" 5 - -attachPosition CRYVALIDATEMESSAGECONTROL_RESET "right" 5 33 - -attachNone CRYVALIDATEMESSAGECONTROL_RESET "top" - - -attachForm CRYVALIDATEMESSAGECONTROL_SAVE "bottom" 5 - -attachPosition CRYVALIDATEMESSAGECONTROL_SAVE "left" 5 33 - -attachPosition CRYVALIDATEMESSAGECONTROL_SAVE "right" 5 66 - -attachNone CRYVALIDATEMESSAGECONTROL_SAVE "top" - - -attachForm CRYVALIDATEMESSAGECONTROL_CLOSE "bottom" 5 - -attachPosition CRYVALIDATEMESSAGECONTROL_CLOSE "left" 5 66 - -attachForm CRYVALIDATEMESSAGECONTROL_CLOSE "right" 5 - -attachNone CRYVALIDATEMESSAGECONTROL_CLOSE "top" - - CRYVALIDATEMESSAGECONTROL_FORMLAYOUT; - - // Make sure the latest data is loaded before populating the list. - cryValidatePlugin messages loadMessageData; - cryValidateMessageControlPopulateMessageList; - - showWindow CRYVALIDATEMESSAGECONTROL_WINDOW; - } -} - -global proc cryValidateMessageControl( string $hilightMessageType ) -{ - global string $g_validateMessageControlHiLight = ""; - $g_validateMessageControlHiLight = $hilightMessageType; - - cryValidateMessageControlCreateWindow( ); -} - -///////////////////////////////////////////////////////// -// Util functions for saving/reseting etc. -///////////////////////////////////////////////////////// -global proc cryValidateMessageControlReset() -{ - cryValidatePlugin messages resetMessageData; - // Populate the list without reloading the data. It will need to be saved before the optionVar string will get changed. - cryValidateMessageControlPopulateMessageList; - //cryValidateMessageControlSave; - - if( `control -exists CRYVALIDATEMESSAGECONTROL_SAVE` ) - { - button -e -enable true CRYVALIDATEMESSAGECONTROL_SAVE; - } -} - -global proc cryValidateMessageControlSave() -{ - string $s = ""; - - setParent CRYVALIDATEMESSAGECONTROL_COLUMNLAYOUT; - string $childControls[]; - $childControls = `layout -q -childArray CRYVALIDATEMESSAGECONTROL_COLUMNLAYOUT`; - - for( $child in $childControls ) - { - string $messageType = ""; - - // Get the messageType from the rowLayout name - { - string $layoutName = `layout -q -fullPathName $child`; - string $tokens[]; - $numTokens = `tokenize $layoutName "|" $tokens`; - if( $numTokens > 0 ) - $messageType = $tokens[$numTokens-1]; - } - - string $rowChildren[]; - $rowChildren = `layout -q -childArray $child`; - - int $ignorable = `checkBox -q -v $rowChildren[1]`; - int $disabled = `checkBox -q -v $rowChildren[2]`; - - - if( size($s) > 0 ) - $s += ";"; - $s += ($messageType+","+$ignorable+","+$disabled); - - //print ("Type : "+$messageType+","+$ignorable+","+$disabled+"\n"); - - } - - optionVar -sv "cryValidateMessageControl" $s; - - if( `control -exists CRYVALIDATEMESSAGECONTROL_SAVE` ) - { - button -e -enable false CRYVALIDATEMESSAGECONTROL_SAVE; - } -} diff --git a/Tools/maya/script/degraded_faces_check.mel b/Tools/maya/script/degraded_faces_check.mel deleted file mode 100644 index c292eb7a02..0000000000 --- a/Tools/maya/script/degraded_faces_check.mel +++ /dev/null @@ -1,22 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -source LumberyardUtilities.mel; - -global proc cryCheckFaces() -{ - string $exportNodes[]; - string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix(); - string $filterString = $lumberyardExportNodePrefix + "*"; - $exportNodes = `ls $filterString`; - cryMayaCheckDegradedFaces($exportNodes[0]); -} diff --git a/Tools/maya/script/icons/abc_geomcache_export.png b/Tools/maya/script/icons/abc_geomcache_export.png deleted file mode 100644 index 8c52722104..0000000000 --- a/Tools/maya/script/icons/abc_geomcache_export.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fb28ea1ba9b6cb797e3fd43e25f7006f9e17894cf92643dd881e4d46311a2be -size 2396 diff --git a/Tools/maya/script/icons/abc_material_preparation.png b/Tools/maya/script/icons/abc_material_preparation.png deleted file mode 100644 index 58618170f5..0000000000 --- a/Tools/maya/script/icons/abc_material_preparation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e1ca7e844948678fab6facc5649c97f250700ef6a4f86d2033359752ab6102b -size 2562 diff --git a/Tools/maya/script/icons/cryAnim.bmp b/Tools/maya/script/icons/cryAnim.bmp deleted file mode 100644 index 5cd221e039..0000000000 --- a/Tools/maya/script/icons/cryAnim.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46da8efc6a474ce1281d244b4ab8cbc6690fc58923a3e23301cfb25736da473b -size 3128 diff --git a/Tools/maya/script/icons/cryCheck.bmp b/Tools/maya/script/icons/cryCheck.bmp deleted file mode 100644 index ff88da9cf4..0000000000 --- a/Tools/maya/script/icons/cryCheck.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d6600e43df930b7654a91e8b5c859b2e91f13a1f0a2f038d013e20eb9db4ede -size 3128 diff --git a/Tools/maya/script/icons/cryControlPanel.png b/Tools/maya/script/icons/cryControlPanel.png deleted file mode 100644 index e5c79afffd..0000000000 --- a/Tools/maya/script/icons/cryControlPanel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c95053ff6f1e0754062339945a06d712484b4d071a426b5b43587cb40b6e12d -size 4982 diff --git a/Tools/maya/script/icons/cryExport.bmp b/Tools/maya/script/icons/cryExport.bmp deleted file mode 100644 index 97d35d5174..0000000000 --- a/Tools/maya/script/icons/cryExport.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc709962ee61b6e7a7700c10114f3324357a82c28e20da7cec74a0d30c343a8c -size 3128 diff --git a/Tools/maya/script/icons/cryFBX.bmp b/Tools/maya/script/icons/cryFBX.bmp deleted file mode 100644 index 228ab029c0..0000000000 --- a/Tools/maya/script/icons/cryFBX.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cd194c785de0045a5d4c968e01cd5261b24936c5ad02c35cb8da17bd5bc218e -size 3128 diff --git a/Tools/maya/script/icons/cryLoad.bmp b/Tools/maya/script/icons/cryLoad.bmp deleted file mode 100644 index 5eca800ecc..0000000000 --- a/Tools/maya/script/icons/cryLoad.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a7eaac2b71e39fc7208f8d56b9e93f889c5a8fae014b1ae7c4ef4ede80b0c8b -size 3128 diff --git a/Tools/maya/script/icons/cryMaterial.bmp b/Tools/maya/script/icons/cryMaterial.bmp deleted file mode 100644 index 6358124833..0000000000 --- a/Tools/maya/script/icons/cryMaterial.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27be4c06bc4f0139e4ccf24ac06d5f8caf4e66b3ff82a31d65bde3b47039ded9 -size 3128 diff --git a/Tools/maya/script/icons/cryPivot.bmp b/Tools/maya/script/icons/cryPivot.bmp deleted file mode 100644 index f0b8a9d15b..0000000000 --- a/Tools/maya/script/icons/cryPivot.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83e99647d347fdfae0087c5bbce06379ecbc0a19bcc524a6aa681d787e13758e -size 3128 diff --git a/Tools/maya/script/icons/cryTools.bmp b/Tools/maya/script/icons/cryTools.bmp deleted file mode 100644 index 9fc2fa17a1..0000000000 --- a/Tools/maya/script/icons/cryTools.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89f0427e8174ae52137f4e579e730b08adba600f93021080f1cfa2b76d59faf -size 3128 diff --git a/Tools/maya/script/icons/cryUdp.bmp b/Tools/maya/script/icons/cryUdp.bmp deleted file mode 100644 index 1206016860..0000000000 --- a/Tools/maya/script/icons/cryUdp.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f23e4e5af6fac6a9925a99a0dc28b57d95a094eaaff37c31c1c1482bbc0461d7 -size 3128 diff --git a/Tools/maya/script/icons/cryUnload.bmp b/Tools/maya/script/icons/cryUnload.bmp deleted file mode 100644 index 81ecae6e41..0000000000 --- a/Tools/maya/script/icons/cryUnload.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed1f2c8b2e488bc55a40bc7a37131bca01d8001a1e012c038d96265061bdc234 -size 3128 diff --git a/Tools/maya/script/icons/cryValidate.bmp b/Tools/maya/script/icons/cryValidate.bmp deleted file mode 100644 index 906f734568..0000000000 --- a/Tools/maya/script/icons/cryValidate.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:919a401ec0751fdc1b66e3434b7eada8f9d7d5f5ec20ed7683d864bba22ef542 -size 3128 diff --git a/Tools/maya/script/icons/lumberyard_folder_icon.png b/Tools/maya/script/icons/lumberyard_folder_icon.png deleted file mode 100644 index 3d46679985..0000000000 --- a/Tools/maya/script/icons/lumberyard_folder_icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ac176b706b8560db1d6ce793ee397ac07d99785d2a93980c663c85daf619db9 -size 621 diff --git a/Tools/maya/script/icons/lumberyard_icon.png b/Tools/maya/script/icons/lumberyard_icon.png deleted file mode 100644 index 9a6bb74beb..0000000000 --- a/Tools/maya/script/icons/lumberyard_icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62e26e0df5c03e6c085d5aba5726d625f4995217d615d5f6c2edb25e68902d27 -size 18738 diff --git a/Tools/maya/script/icons/lumberyard_warning.svg b/Tools/maya/script/icons/lumberyard_warning.svg deleted file mode 100644 index a56af93376..0000000000 --- a/Tools/maya/script/icons/lumberyard_warning.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/Tools/maya/script/mayaAnimUtilities.py b/Tools/maya/script/mayaAnimUtilities.py deleted file mode 100755 index 2757b5d3d4..0000000000 --- a/Tools/maya/script/mayaAnimUtilities.py +++ /dev/null @@ -1,96 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -################################################################################################################ -# -# mayaAnimUtilities.py -# -# replaces mayaAnimUtilities.cpp -# -# contains two functons -# - AMZN_GetTimeFromFrame -# Takes frame number as input -# Returns time based on current Maya settings -# -# - AMZN_DecodeAnimRangeString -# Takes string as parameter representing Maya export settings -# Returns array with values parced out -# -################################################################################################################ - - - - - - - - -################################################################################################################ -# -# PURPOSE: To return the current time from a given frame -# -# PROCEDURE: Using C++ api calls, create new MTime entity -# Set the MTime entity to the current unit of time and current frame -# returns the current time in secconds -# -# PRESUMPTIONS: original c++ used MTime.as, which does not currently seem to be supported in Python -# looks like MTime.asUnits is equivalent function -# -################################################################################################################# -import maya.OpenMaya as om - -def AMZN_GetTimeFromFrame(frame): - time = om.MTime() - - time.setUnit( time.uiUnit() ) - time.setValue( frame ) - - #original c++ uses MTime.as - #as far as I can tell, MTime.asUnits is synonimous - return time.asUnits(om.MTime.kSeconds) - - - - - -################################################################################################################ -# -# PURPOSE: To parse out the string containing the animation export options -# -# PROCEDURE: First we split the string up via it's sentinal value " - ", then we take the first -# element, which is the frame range, and pull out the start and end frames. We then -# add them all back into one string -# -# PRESUMPTIONS: 1) the items in the string are seperated by an " - " value -# 2) that there are no " - ' values in things lke path names (wasn't my idea for a sentinal value) -# 3) that the first element in the string is the time range in the format [startFrame-endFrame] -# -################################################################################################################# -def AMZN_DecodeAnimRangeString(str): - - returnArray = [] - - #split the export options by the sentinal value - splitBySentinal = str.split(" - ") - - #first item in the array is the time range, need to parce out the numbers from the string - timeRange = splitBySentinal[0] - timeRange = timeRange.translate(None, '[]') - splitTimeRange = timeRange.split("-") - - del splitBySentinal[0] - #print splitBySentinal - - returnArray.extend(splitTimeRange) - returnArray.extend(splitBySentinal) - - return returnArray - #print returnArray - \ No newline at end of file diff --git a/Tools/maya/script/shelf_Lumberyard.mel b/Tools/maya/script/shelf_Lumberyard.mel deleted file mode 100644 index bf0e1373a8..0000000000 --- a/Tools/maya/script/shelf_Lumberyard.mel +++ /dev/null @@ -1,42 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -global proc shelf_Lumberyard () -{ - shelfButton - -enableCommandRepeat 1 - -enable 1 - -width 35 - -height 35 - -manage 1 - -visible 1 - -preventOverride 0 - -annotation "Lumberyard Tools" - -enableBackground 0 - -align "center" - -label "Lumberyard Tools" - -labelOffset 0 - -font "plainLabelFont" - -overlayLabelColor 0.8 0.8 0.8 - -overlayLabelBackColor 0 0 0 0.2 - -image "lumberyard_icon.png" - -image1 "lumberyard_icon.png" - -style "iconOnly" - -marginWidth 1 - -marginHeight 1 - -command "source LumberyardTool.mel;\r\nLumberyardToolWindow;" - -sourceType "mel" - -commandRepeatable 1 - -flat 1 - ; - -} diff --git a/Tools/melscript/crySceneRoot.mel b/Tools/melscript/crySceneRoot.mel deleted file mode 100644 index 83986c44d3..0000000000 --- a/Tools/melscript/crySceneRoot.mel +++ /dev/null @@ -1,51 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -proc preparePyEnv() -{ - string $pycmd = - "try:\n" + - " import crySceneRoot\n" + - "except:\n" + - " import os\n" + - " import sys\n" + - " print('Could not import crySceneRoot.py! Trying to setup environment...')\n" + - " paths = [p for p in os.environ['MAYA_SCRIPT_PATH'].split(';') if p.lower().endswith('/tools/melscript')]\n" + - " crypath = ''\n" + - " for p in paths:\n" + - " if os.path.exists('%s/%s' % (p, 'crySceneRoot.py')):\n" + - " print('found \"/Tools/melScript\" path')\n" + - " crypath = p\n" + - " break\n" + - " if crypath not in [p.replace('\\\\','/').lower() for p in sys.path]:\n" + - " sys.path.append(crypath)\n" + - " print('added \"/Tools/melScript\" path to py paths')\n"; - python($pycmd); -} - -global proc cryMakeSceneRoot(int $naturalOrientation) -{ - preparePyEnv(); - - string $value = "False"; - if ($naturalOrientation) - { - $value = "True"; - } - - string $pycmd = - "import crySceneRoot\n" + - "crySceneRoot.cryMakeSceneRoot(" + $value + ")\n"; - - python($pycmd); -} diff --git a/Tools/melscript/crySceneRoot.py b/Tools/melscript/crySceneRoot.py deleted file mode 100755 index c88fe5a441..0000000000 --- a/Tools/melscript/crySceneRoot.py +++ /dev/null @@ -1,119 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -import maya.cmds as cmds - - -def crySetTransform(nodeName, translate, rotate): - for i in xrange(3): - cmds.setAttr(nodeName + '.translate' + 'XYZ'[i], translate[i]) - cmds.setAttr(nodeName + '.rotate' + 'XYZ'[i], rotate[i]) - - -def crySetParent(parentName, oldNodeName, newNodeName): - cmds.parent(oldNodeName, parentName) - cmds.rename(parentName + '|' + oldNodeName, newNodeName) - -# naturalOrientation == True: -# Front View shows face of a character. -# naturalOrientation == False: -# Front View shows back of a character. Mimics cryexporter for 3dsMax. -def cryMakeSceneRoot(naturalOrientation): - root_name = 'SceneRoot' - - if cmds.objExists(root_name): - parents = cmds.listRelatives(root_name, p=True) - if parents: - cmds.confirmDialog( - title='CryTools', - message='{0} node has a parent - it is not recommended.\nPlease delete the node {0} or move it to the top of the scene graph.'.format(root_name), - button=['Ok',], - defaultButton='Ok') - cmds.select(root_name, r=True) - return - - children = cmds.listRelatives(root_name, c=True) - if children and sorted(children) != sorted(['forward', 'up']): - cmds.confirmDialog( - title='CryTools', - message='A *non-standard* node {0} is found - it is not supported.\nPlease delete the node {0}.'.format(root_name), - button=['Ok',], - defaultButton='Ok') - cmds.select(root_name, r=True) - return - - cmds.delete(root_name, hi='all') - - # Creating SceneRoot node - - cmds.createNode('transform', n=root_name) - - # Creating geometry of SceneRoot, - # including in-scene text labels for the axes. - - # Note that 'size' is actually a scaler, not a real size - size = 1.4 - - shaft_length = 60.0 * size - shaft_radius = 2.0 * size - arrowhead_length = 13.0 * size - arrowhead_radius = 6.0 * size - sphere_radius = 7.0 * size - font_size = 40.0 * size - font = "Arial|h-" + str(font_size) + "|w400|c0" - - obj = cmds.createNode('transform') - crySetParent(root_name, obj, 'forward') - obj = cmds.createNode('transform') - crySetParent(root_name, obj, 'up') - - obj = cmds.polyCylinder(ch=True, o=True, ax=(0, 1, 0), r=shaft_radius, h=shaft_length, sc=1, cuv=3, sx=4) - crySetTransform(obj[0], [0.0, shaft_length * 0.5, 0.0], [0.0, 0.0, 0.0]) - crySetParent(root_name+'|forward', obj[0], "shaft"); - obj = cmds.polyCylinder(ch=True, o=True, ax=(0, 0, 1), r=shaft_radius, h=shaft_length, sc=1, cuv=3, sx=4) - crySetTransform(obj[0], [0.0, 0.0, shaft_length * 0.5], [0.0, 0.0, 0.0]) - crySetParent(root_name+'|up', obj[0], "shaft"); - - obj = cmds.polyCone(ch=True, o=True, ax=(0, 1, 0), r=arrowhead_radius, h=arrowhead_length, cuv=3, sx=6) - crySetTransform(obj[0], [0.0, shaft_length + arrowhead_length * 0.5, 0.0], [0.0, 0.0, 0.0]) - crySetParent(root_name+'|forward', obj[0], "arrowhead") - obj = cmds.polySphere(ch=True, o=True, r=sphere_radius, sx=8, sy=8) - crySetTransform(obj[0], [0.0, 0.0, shaft_length + sphere_radius * 0.5], [90.0, 0.0, 0.0]) - crySetParent(root_name+'|up', obj[0], "sphere") - - obj = cmds.textCurves(f=font, t="Forward") - crySetTransform(obj[0], [-2.0 * shaft_radius, 0.1 * shaft_length, 0.0], [0.0, 0.0, 90.0]) - crySetParent(root_name+'|forward', obj[0], "text") - obj = cmds.textCurves(f=font, t="Up") - crySetTransform(obj[0], [-2.0 * shaft_radius, 0.0, 0.7 * shaft_length], [0.0, 90.0, 90.0]) - crySetParent(root_name+'|up', obj[0], "text") - - cmds.select(root_name+'|forward', hi=True) - cmds.polyColorPerVertex(rgb=(0.0, 0.6, 0.0), a=1, cdo=True) - cmds.select(root_name+'|up', hi=True) - cmds.polyColorPerVertex(rgb=(0.0, 0.0, 1.0), a=1, cdo=True) - - # Setting orientation of SceneRoot node - - if cmds.upAxis(q=True, axis=True) == "z": - if naturalOrientation: - crySetTransform(root_name, [0, 0, 0], [0, 0, 180.0]) - else: - crySetTransform(root_name, [0, 0, 0], [0, 0, 0]) - else: - if naturalOrientation: - crySetTransform(root_name, [0, 0, 0], [90.0, 0, 180.0]) - else: - crySetTransform(root_name, [0, 0, 0], [-90.0, 0, 0]) - - # Selecting SceneRoot node to let the user see that something happened and/or - # to help the user delete/hide/etc. the node. - cmds.select(root_name, r=True) - diff --git a/Tools/motionbuilder/CryReName.py b/Tools/motionbuilder/CryReName.py deleted file mode 100755 index b4f4c7f0d1..0000000000 --- a/Tools/motionbuilder/CryReName.py +++ /dev/null @@ -1,46 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -from pyfbsdk import * - -def UnselAll(): - selModels = FBModelList() - FBGetSelectedModels (selModels, None, True) - for model in selModels: - model.Selected = False; - del(selModels) - - -UnselAll() - -Models = FBModelList() -Skeleton = list() -FBGetSelectedModels (Models, None, False) - -for model in Models: - if model.ClassName() == 'FBModelSkeleton': - Skeleton.append(model) - -Deter = FBFindModelByName("Bip01").Children[0].Name.split(":") - -for i in range(len(Skeleton)): - if Deter[1][5] == " ": - SplName = Skeleton[i].Name.split(":") - SplName[1] = SplName[1].replace(" ","_") - Skeleton[i].Name = SplName[0] + ":" + SplName[1] - else: - SplName = Skeleton[i].Name.split(":") - if SplName[1][0] == "_": - SplName[1] = SplName[1].replace("_"," ") - SplName[1] = SplName[1].replace(" ","_",1) - Skeleton[i].Name = SplName[0] + ":" + SplName[1] - else: - SplName[1] = SplName[1].replace("_"," ") - Skeleton[i].Name = SplName[0] + ":" + SplName[1] diff --git a/Tools/motionbuilder/cryLib.py b/Tools/motionbuilder/cryLib.py deleted file mode 100755 index 48d31c4e3e..0000000000 --- a/Tools/motionbuilder/cryLib.py +++ /dev/null @@ -1,139 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -#cryLib.py -#some useful functions and classes - -from pyfbsdk import * -from euclid import * - -#casts point3 strings to pyEuclid vectors -def vec3(point3): - return Vector3(point3[0], point3[1], point3[2]) - -#casts a pyEuclid vector to FBVector3d -def fbv(point3): - return FBVector3d(point3.x, point3.y, point3.z) - -#returns average position of an FBModelList as FBVector3d -def avgPos(models): - mLen = len(models) - if mLen == 1: - return models[0].Translation - total = vec3(models[0].Translation) - for i in range (1, mLen): - total += vec3(models[i].Translation) - avgTranslation = total/mLen - return fbv(avgTranslation) - -#returns an array of models when given an array of model names -#useful with external apps/telnetlib ui -def modelsFromStrings(modelNames): - output = [] - for name in modelNames: - output.append(FBFindModelByName(name)) - return output - -#stabilizes face markers, input 4 FBModelList arrays, leaveOrig for lraving original markers -def stab(right,left,center,markers,leaveOrig): - - pMatrix = FBMatrix() - lSystem=FBSystem() - lScene = lSystem.Scene - newMarkers = [] - - def faceOrient(): - lScene.Evaluate() - - Rpos = vec3(avgPos(right)) - Lpos = vec3(avgPos(left)) - Cpos = vec3(avgPos(center)) - - faceAttach.GetMatrix(pMatrix) - xVec = (Cpos - Rpos) - xVec = xVec.normalize() - zVec = ((Cpos - vec3(faceAttach.Translation)).normalize()).cross(xVec) - zVec = zVec.normalize() - yVec = xVec.cross(zVec) - yVec = yVec.normalize() - facePos = (Rpos + Lpos)/2 - - pMatrix[0] = xVec.x - pMatrix[1] = xVec.y - pMatrix[2] = xVec.z - - pMatrix[4] = yVec.x - pMatrix[5] = yVec.y - pMatrix[6] = yVec.z - - pMatrix[8] = zVec.x - pMatrix[9] = zVec.y - pMatrix[10] = zVec.z - - pMatrix[12] = facePos.x - pMatrix[13] = facePos.y - pMatrix[14] = facePos.z - - faceAttach.SetMatrix(pMatrix,FBModelTransformationMatrix.kModelTransformation,True) - lScene.Evaluate() - - def keyTransRot(animNodeList): - for lNode in animNodeList: - if (lNode.Name == 'Lcl Translation'): - lNode.KeyCandidate() - if (lNode.Name == 'Lcl Rotation'): - lNode.KeyCandidate() - - Rpos = vec3(avgPos(right)) - Lpos = vec3(avgPos(left)) - Cpos = vec3(avgPos(center)) - - faceAttach = FBModelNull("faceAttach") - faceAttach.Show = True - faceAttach.Translation = fbv((Rpos + Lpos)/2) - faceOrient() - - for obj in markers: - new = FBModelNull(obj.Name + '_stab') - newTran = vec3(obj.Translation) - new.Translation = fbv(newTran) - new.Show = True - new.Size = 20 - new.Parent = faceAttach - newMarkers.append(new) - - Take = lScene.Takes[1] - FStart = int(Take.LocalTimeSpan.GetStart().GetFrame(True)) - FStop = int(Take.LocalTimeSpan.GetStop().GetFrame(True)+1) - lPlayerControl = FBPlayerControl() - lPlayerControl.GotoStart() - - animNodes = faceAttach.AnimationNode.Nodes - - lFbp = FBProgress() - lFbp.Caption = "Stabilization" - lFbp.Text = "Progress..." - - for frame in range(FStart,FStop): - - faceOrient() - - for m in range (0,len(newMarkers)): - markerAnimNodes = newMarkers[m].AnimationNode.Nodes - newMarkers[m].SetVector(markers[m].Translation.Data) - lScene.Evaluate() - keyTransRot(markerAnimNodes) - - keyTransRot(animNodes) - - lPlayerControl.StepForward() - lVal = (frame/FStop)*10 - lFbp.Percent = lVal - diff --git a/Tools/motionbuilder/cryRetarget.py b/Tools/motionbuilder/cryRetarget.py deleted file mode 100755 index df5296732c..0000000000 --- a/Tools/motionbuilder/cryRetarget.py +++ /dev/null @@ -1,83 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -from pyfbsdk import FBSystem, FBFilePopup, FBFilePopupStyle, FBFolderPopup, FBFbxManager, FBFbxManagerLoadAnimationMethod, FBPlotOptions, FBCharacterPlotWhere,FBFindModelByName, FBModelList, FBGetSelectedModels - -# Lets define the actual loading and retargetting function - -def LoadAndRetAnim (FileLoc,pOptions): - manager = FBFbxManager() - Char = FBSystem().Scene.Characters[0] - manager.LoadAnimationOnCharacter(FileLoc,Char,0,0,1,1,FBFbxManagerLoadAnimationMethod.kFBFbxManagerLoadConnect,pOptions,0,0,0) - Char.PlotAnimation(FBCharacterPlotWhere.kFBCharacterPlotOnControlRig,pOptions) - Char.PlotAnimation(FBCharacterPlotWhere.kFBCharacterPlotOnSkeleton,pOptions) - del (manager, Char) - -# Unselect all function -def UnselAll(): - selModels = FBModelList() - FBGetSelectedModels (selModels, None, True) - for model in selModels: - model.Selected = False; - del(selModels) - -# For the purpose of being able to clean up the file later on, we need to have -# all of the objects in the scene which need to stay there, be held in memory - -UnselAll() - -StartList = FBModelList() -StartListNames = list() -FBGetSelectedModels (StartList, None, False) -for model in StartList: - StartListNames.append(model.Name) - -# Now we need to assign animation plot options - -pOpt = FBPlotOptions() -pOpt.UseConstantKeyReducer = False -pOpt.PlotAllTakes = True - -#Filter needs to be set, otherwise it will crash - -FileOpen = FBFilePopup() -FileOpen.Filter = '*.fbx' -FileOpen.Caption = "Select the animation to Retarget" -FileOpen.Style = FBFilePopupStyle.kFBFilePopupOpen -FileOpen.Path = r'J:\temp' - -if FileOpen.Execute(): - File = FileOpen.FullFilename - LoadAndRetAnim (File, pOpt) -else: - print 'CANCEL' - -#Get rid of imported trash - -for name in StartListNames: - FBFindModelByName(name).Selected = True - -EndList = FBModelList() -FBGetSelectedModels (EndList, None, False) -for model in EndList: - model.FBDelete() - -UnselAll() -#for i in EndListNames: -# a = FBFindModelByName(i) -# a.FBDelete() - -FBSystem().Scene.Characters[1].Components[0].FBDelete() -FBSystem().Scene.Characters[1].FBDelete() - -# Cleanup. - -del(StartList, StartListNames, EndList, EndListNames) -del(FBSystem, FBFilePopup, FBFilePopupStyle, FBFolderPopup, FBFbxManager, FBFbxManagerLoadAnimationMethod, FBPlotOptions, FBCharacterPlotWhere,FBFindModelByName, FBModelList, FBGetSelectedModels) \ No newline at end of file diff --git a/Tools/motionbuilder/setResolutionHD.py b/Tools/motionbuilder/setResolutionHD.py deleted file mode 100755 index c0fc06b881..0000000000 --- a/Tools/motionbuilder/setResolutionHD.py +++ /dev/null @@ -1,27 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -from pyfbsdk import * - -lSystem = FBSystem() - -myCamera = FBCamera('charCamera') -myCamera.Parent = FBFindModelByName('Bip01') -myCamera.Show = True -myCamera.Selected = True - -FBApplication().SwitchViewerCamera(myCamera) - -myCamera.FrameSizeMode = FBCameraFrameSizeMode.kFBFrameSizeFixedResolution - -myCamera.ResolutionHeight = 1080 -myCamera.ResolutionWidth = 1920 -myCamera.PixelAspectRatio = 1 -myCamera.UseFrameColor = True \ No newline at end of file diff --git a/Tools/motionbuilder/stab_ui.py b/Tools/motionbuilder/stab_ui.py deleted file mode 100755 index d513802fda..0000000000 --- a/Tools/motionbuilder/stab_ui.py +++ /dev/null @@ -1,267 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -#An example implementation for communicating with MotionBuilder -#through the Python Remote Server -# -# -#Christopher Evans - Apr 2008 - -import wx -import telnetlib -import win32gui -import win32com.client -import os -import sys -import time -import traceback - -def process_is_running(proc_name): - #From Adam Pletcher's "Python for Tech Artsts" (http://www.volition-inc.com/gdc/) - import win32pdh - - proc_name = os.path.splitext(proc_name)[0].lower() - - junk, instances = win32pdh.EnumObjectItems(None,None,'Process', win32pdh.PERF_DETAIL_WIZARD) - - for proc_inst in instances: - if (proc_inst.lower() == proc_name): - return True - - return False - -class MB_Sub_Frame(wx.Frame): - #This comes from Adam Pletcher's "Python for Tech Artsts" free GDC course materials - - _top_mb_window_handle = None - - def __init__(self, parent, app, id=-1, title="Motion Builder Tool", pos=(60, 120), size=(350, 200), name='frame', resize=True, style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.FRAME_NO_TASKBAR): - - wx.Frame.__init__(self, parent, id, title, pos, size, style) - - self.app = app - self.panel = None - - self.initialPosOffset = pos - self._runningModal = False - - # resizable windows is the default in wxPython, but we allow caller to override that. - if (not resize): - wx.Frame.ToggleWindowStyle(self, wx.RESIZE_BORDER) - - # Tool window's background color. This should be made to match the user's BG color in Max. - bg_color = (197, 197, 197) - - self.SetBackgroundStyle(wx.BG_STYLE_COLOUR) - self.SetBackgroundColour(wx.Color(bg_color[0], bg_color[1], bg_color[2])) - - # Event Bindings - self.Bind(wx.EVT_CLOSE, self.on_close) - - @classmethod - def create(cls, *args, **kw): - """ - Call this static class method to create a new instance of your subframe. - This will use the 3dsmax window as a parent for the current frame. - Limitation: If > 1 copy of 3dsmax is open, uses the first one it finds. - Could probably be fixed, however. - """ - if (not process_is_running('motionbuilder.exe')): - raise WindowsError('*** ERROR: MotionBuilder is not running') - else: - app = wx.GetApp() - - if (app == None): - app = wx.App(redirect=False) - - val = MB_Sub_Frame._get_top_mb_window() - topHandle = val[0] - - if (topHandle == None): - raise WindowsError('*** ERROR: Motion Builder window handle not found.') - else: - windowPos = val[1] - - toolFrame = wx.PreFrame() - toolFrame.AssociateHandle(topHandle) - toolFrame.PostCreate(toolFrame) - app.SetTopWindow(toolFrame) - - try: - frame = cls(toolFrame, app, *args, **kw) - frame.Show(True) - - except: - print cls.__name__ - print traceback.format_exc() - frame = None - - toolFrame.DissociateHandle() - - return frame - - @staticmethod - def _get_top_mb_window(): - if MB_Sub_Frame._top_mb_window_handle is not None: - return MB_Sub_Frame._top_mb_window_handle - - # EnumWindows requires a callback function - def callback(handle, winList): - winList.append(handle) - return True - - # Get list of open windows - windows = [] - win32gui.EnumWindows(callback, windows) - - # Find window belonging to 3ds Max - for handle in windows: - title = win32gui.GetWindowText(handle) - if ('MotionBuilder 7.5' in title): - # Maximize the window if it's minimized - import win32con - window = win32gui.ShowWindow(handle, win32con.SW_MAXIMIZE) - - # Get upper left desktop coords of MB window - pos = win32gui.GetWindowRect(handle)[:2] - - # Set handle id in our instance - MB_Sub_Frame._top_mb_window_handle = handle - - return (handle, pos) - # MB window not found - return None - - def on_close(self, evt): - """ - Event handler for EVT_CLOSE event. - """ - self.Show(False) - self.Destroy() - win32gui.DestroyWindow(self.GetHandle()) - - # Regular wx Destroy waits for the application to destroy the window. - # Since there is no wxApp running, we do it ourselves. - win32gui.SetFocus(MB_Sub_Frame._top_mb_window_handle) - - def show_modal_dialog(self, dlg): - """ - Method to display a modal dialog that also disables the 3dsmax window. - """ - mb_disabled = self._runningModal # Save enabled state, so we can restore it when this modal dialog is done - - if (not mb_disabled): - self._runningModal = True - top = MB_Sub_Frame._top_mb_window_handle # get MB window handle - win32gui.EnableWindow(top, False) # disable it - - ret_val = dlg.ShowModal() # show our dialog - won't continue until dialog is closed - - if (not mb_disabled): # enables 3dsmax window again, if it was enabled when this dialog started - win32gui.EnableWindow(top, True) - self._runningModal = False - - return ret_val - -#------------------------------------------------------------------------------------------------------------------------ - -host = telnetlib.Telnet("127.0.0.1", 4242) - -def mbPipe(command): - host.read_until('>>>', .01) - #write the command - host.write(command + '\n') - print ('Sending>>> '+ command) - #read all data returned - raw = str(host.read_until('>>>', .1)) - #removing garbage i don't want - raw = raw.replace('\n\r>>>','') - raw = raw.replace('\r','') - rawArr = raw.split('\n') - #cleanArr = [item.replace('\r', '') for item in rawArr] - return rawArr - -def getSelection(): - selectedItems = [] - mbPipe("selectedModels = FBModelList()") - mbPipe("FBGetSelectedModels(selectedModels,None,True)") - for item in (mbPipe("for item in selectedModels: print item.Name")): - selectedItems.append(item) - return selectedItems - -class MyFrame(MB_Sub_Frame): - rStabMarkers = [] - lStabMarkers = [] - cStabMarkers = [] - mSetMarkers = [] - - def __init__(self,parent,app): - # create a frame, no parent, default to wxID_ANY - MB_Sub_Frame.__init__(self, parent, app, id=-1, title='Face Stabilization',pos=(300, 150), size=(200, 190)) - - self.rStab = wx.Button(self, id=-1, label='Right STAB Markers',pos=(8, 8), size=(175, 28)) - self.rStab.Bind(wx.EVT_BUTTON,self.rStabClick) - self.rStab.SetToolTip(wx.ToolTip("Select 1+ Right Stabilization Markers and Press")) - - self.lStab = wx.Button(self, id=-1, label='Left STAB Markers',pos=(8, 38), size=(175, 28)) - self.lStab.Bind(wx.EVT_BUTTON, self.lStabClick) - self.lStab.SetToolTip(wx.ToolTip("Select 1+ Left Stabilization Markers and Press")) - - self.cStab = wx.Button(self, id=-1, label='Center STAB Markers',pos=(8, 68), size=(175, 28)) - self.cStab.Bind( wx.EVT_BUTTON, self.cStabClick ) - self.cStab.SetToolTip(wx.ToolTip("Select 1+ Center Stabilization Markers")) - - self.markerSet = wx.Button(self, id=-1, label='Markers to Stabilize',pos=(8, 98), size=(175, 28)) - self.markerSet.Bind(wx.EVT_BUTTON, self.markerSetClick) - self.markerSet.SetToolTip(wx.ToolTip("Select All Markers to Stabilize")) - - self.stabilize = wx.Button(self, id=-1, label='Stabilize Markerset',pos=(8, 128), size=(175, 28)) - self.stabilize.Bind(wx.EVT_BUTTON, self.stabilizeClick) - self.stabilize.SetToolTip(wx.ToolTip("Press to Stabilize the Markers")) - - def rStabClick(self,event): - self.rStabMarkers = getSelection() - print str(self.rStabMarkers) - self.rStab.Label = (str(len(self.rStabMarkers)) + " Right Markers") - - def lStabClick(self,event): - self.lStabMarkers = getSelection() - print str(self.lStabMarkers) - self.lStab.Label = (str(len(self.lStabMarkers)) + " Light Markers") - - def cStabClick(self,event): - self.cStabMarkers = getSelection() - print str(self.cStabMarkers) - self.cStab.Label = (str(len(self.cStabMarkers)) + " Center Markers") - - def markerSetClick(self,event): - self.mSetMarkers = getSelection() - print str(self.mSetMarkers) - self.markerSet.Label = (str(len(self.mSetMarkers)) + " Markers to Stabilize") - - def stabilizeClick(self,event): - mbPipe('from euclid import *') - mbPipe('from cryLib import *') - mbPipe('rStab = modelsFromStrings(' + str(self.rStabMarkers) + ')') - mbPipe('lStab = modelsFromStrings(' + str(self.lStabMarkers) + ')') - mbPipe('cStab = modelsFromStrings(' + str(self.cStabMarkers) + ')') - mbPipe('markerset = modelsFromStrings(' + str(self.mSetMarkers) + ')') - mbPipe('stab(rStab,lStab,cStab,markerset,False)') - - def on_close(self, event): - #This method is bound by MB_Sub_Frame to the EVT_CLOSE event. - print 'Shutting down...' - host.close() - self.user_exit = True - self.Destroy() - -application = wx.PySimpleApp() -window = MyFrame.create() -application.MainLoop() diff --git a/cmake/3rdParty/Findexpat.cmake b/cmake/3rdParty/Findexpat.cmake deleted file mode 100644 index 57d5108ec8..0000000000 --- a/cmake/3rdParty/Findexpat.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME expat - VERSION 2.1.0-pkg.3 - INCLUDE_DIRECTORIES lib -) diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index 47258b9a7f..c0c023c2cd 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -17,11 +17,14 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-multiplatform TARGETS Rap ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) +ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) # platform-specific: ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev1-android TARGETS AWSNativeSDK PACKAGE_HASH 3612d8397700cb3a585405440aec2a393843baa506ef8821d0a9b29162fb1854) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-android TARGETS PhysX PACKAGE_HASH 9c494576c2d4ff04dee5a9e092fcd9d5af4b2845f15ffdfcaabb0dbc5b88a7a9) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-android TARGETS mikkelsen PACKAGE_HASH 075e8e4940884971063b5a9963014e2e517246fa269c07c7dc55b8cf2cd99705) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-android TARGETS googletest PACKAGE_HASH 95671be75287a61c9533452835c3647e9c1b30f81b34b43bcb0ec1997cc23894) -ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev1-android TARGETS GoogleBenchmark PACKAGE_HASH c8f479370c8935845d5bd98c5e871d0819c8849e3077e91275c7191bd71d08b2) +ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-android TARGETS GoogleBenchmark PACKAGE_HASH 20b46e572211a69d7d94ddad1c89ec37bb958711d6ad4025368ac89ea83078fb) +ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev1-android TARGETS libsamplerate PACKAGE_HASH cf94df05c1a18ea17b1f576a86c33a1d45652e688b5797ecf3a83192391c929f) diff --git a/cmake/3rdParty/Platform/Android/cmake_android_files.cmake b/cmake/3rdParty/Platform/Android/cmake_android_files.cmake index 427ac93a18..aea8054ab1 100644 --- a/cmake/3rdParty/Platform/Android/cmake_android_files.cmake +++ b/cmake/3rdParty/Platform/Android/cmake_android_files.cmake @@ -12,7 +12,6 @@ set(FILES BuiltInPackages_android.cmake civetweb_android.cmake - expat_android.cmake FreeType2_android.cmake VkValidation_android.cmake Wwise_android.cmake diff --git a/cmake/3rdParty/Platform/Android/expat_android.cmake b/cmake/3rdParty/Platform/Android/expat_android.cmake deleted file mode 100644 index dd5e48e4da..0000000000 --- a/cmake/3rdParty/Platform/Android/expat_android.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(EXPAT_LIBS ${BASE_PATH}/build/win_x64/android_ndk_r12/android-21/arm64-v8a/clang-3.8/$,debug,release>/libexpat.a) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index 28ed49e1d1..e3decd3370 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -24,9 +24,11 @@ ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARG ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) +ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform TARGETS PVRTexTool PACKAGE_HASH d0d6da61c7557de0d2c71fc35ba56c3be49555b703f0e853d4c58225537acf1e) @@ -35,6 +37,7 @@ ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev1-linux TARGETS AWSN ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-linux TARGETS PhysX PACKAGE_HASH e3ca36106a8dbf1524709f8bb82d520920ebd3ff3a92672d382efff406c75ee3) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-linux TARGETS mikkelsen PACKAGE_HASH 5973b1e71a64633588eecdb5b5c06ca0081f7be97230f6ef64365cbda315b9c8) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-linux TARGETS googletest PACKAGE_HASH 7b7ad330f369450c316a4c4592d17fbb4c14c731c95bd8f37757203e8c2bbc1b) -ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev1-linux TARGETS GoogleBenchmark PACKAGE_HASH e794530c60bd1ecb5f224a346091f23c8fdeb4cfd7ba70b5195d6d2e276447e3) +ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-linux TARGETS GoogleBenchmark PACKAGE_HASH 4038878f337fc7e0274f0230f71851b385b2e0327c495fc3dd3d1c18a807928d) ly_associate_package(PACKAGE_NAME unwind-1.2.1-linux TARGETS unwind PACKAGE_HASH 3453265fb056e25432f611a61546a25f60388e315515ad39007b5925dd054a77) ly_associate_package(PACKAGE_NAME qt-5.15.2-linux TARGETS Qt PACKAGE_HASH 3857fbb2fc5581cdb71d80a7f9298c83ef06073d4e1ccd86a32b4f88782b6f14) +ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev1-linux TARGETS libsamplerate PACKAGE_HASH 9fbf284c5952607c679a7c3ddac18fa608a1b316b8ff735d5225c0618e06c562) diff --git a/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake b/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake index 400b99827d..b991f1a008 100644 --- a/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake +++ b/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake @@ -16,7 +16,6 @@ set(FILES Clang_linux.cmake dyad_linux.cmake etc2comp_linux.cmake - expat_linux.cmake FbxSdk_linux.cmake FreeType2_linux.cmake OpenSSL_linux.cmake diff --git a/cmake/3rdParty/Platform/Linux/expat_linux.cmake b/cmake/3rdParty/Platform/Linux/expat_linux.cmake deleted file mode 100644 index aac6f699d4..0000000000 --- a/cmake/3rdParty/Platform/Linux/expat_linux.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(EXPAT_LIBS ${BASE_PATH}/build/linux/clang-3.4/$,debug,release>/libexpat.a) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index 28e7f8a5f8..199b522924 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -25,13 +25,15 @@ ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform ly_associate_package(PACKAGE_NAME mcpp-2.7.2_az.1-rev1-multiplatform TARGETS mcpp PACKAGE_HASH df75586f2ab4c0e4dca6361fb536ec07bd2fc43f4fa1490c3ef83623001023d8) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) ly_associate_package(PACKAGE_NAME SPIRVCross-2020.04.20-rev1-multiplatform TARGETS SPIRVCross PACKAGE_HASH 7c8c0eaa0166c26745c62d2238525af7e27ac058a5db3defdbaec1878e8798dd) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-2020.08.07-rev1-multiplatform TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 04a6850ce03d4c16e19ed206f7093d885276dfb74047e6aa99f0a834c8b7cc73) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxcAz-5.0.0_az-rev1-multiplatform TARGETS DirectXShaderCompilerDxcAz PACKAGE_HASH 94f24989a7a371d840b513aa5ffaff02747b3d19b119bc1f899427e29978f753) -ly_associate_package(PACKAGE_NAME azslc-1.7.19-rev1-multiplatform TARGETS azslc PACKAGE_HASH e7649ba4a9190a82512f9aaad1b4318fbdf09384c533d2e3cc15c8440e65bd4a) +ly_associate_package(PACKAGE_NAME azslc-1.7.20-rev1-multiplatform TARGETS azslc PACKAGE_HASH 45d55f28bea2ef823ed3204f60df52e5e329f42923923d4555fdbdf3bea0af60) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) +ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform TARGETS PVRTexTool PACKAGE_HASH d0d6da61c7557de0d2c71fc35ba56c3be49555b703f0e853d4c58225537acf1e) @@ -40,5 +42,6 @@ ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev1-mac TARGETS AWS ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-mac TARGETS PhysX PACKAGE_HASH 149f5e9b44bd27291b1c4772f5e89a1e0efa88eef73c7e0b188935ed4d0c4a70) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-mac TARGETS mikkelsen PACKAGE_HASH 83af99ca8bee123684ad254263add556f0cf49486c0b3e32e6d303535714e505) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-mac TARGETS googletest PACKAGE_HASH cbf020d5ef976c5db8b6e894c6c63151ade85ed98e7c502729dd20172acae5a8) -ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev1-mac TARGETS GoogleBenchmark PACKAGE_HASH d81817701931508c8aa4efc61852d3d9c5672e43d2f68df645ab56251da43119) +ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-mac TARGETS GoogleBenchmark PACKAGE_HASH ad25de0146769c91e179953d845de2bec8ed4a691f973f47e3eb37639381f665) ly_associate_package(PACKAGE_NAME qt-5.15.2-mac TARGETS Qt PACKAGE_HASH ac248833d65838e4bcef50f30c9ff02ba9464ff64b9ada52de2ad6045d38baec) +ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev1-mac TARGETS libsamplerate PACKAGE_HASH a72fd871915760c3b94df30186c9df906440c38ed38e58717f70a24c677c7b4b) diff --git a/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake b/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake index c531066871..5c7065a053 100644 --- a/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake +++ b/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake @@ -15,7 +15,6 @@ set(FILES Clang_mac.cmake DirectXShaderCompiler_mac.cmake etc2comp_mac.cmake - expat_mac.cmake FbxSdk_mac.cmake FreeType2_mac.cmake OpenSSL_mac.cmake diff --git a/cmake/3rdParty/Platform/Mac/expat_mac.cmake b/cmake/3rdParty/Platform/Mac/expat_mac.cmake deleted file mode 100644 index 50131ed133..0000000000 --- a/cmake/3rdParty/Platform/Mac/expat_mac.cmake +++ /dev/null @@ -1,13 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(EXPAT_LIBS ${BASE_PATH}/build/osx/darwin-clang-703.0.31/$,debug,release>/libexpat.a) - diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 983b6d9b38..32f523e623 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -25,23 +25,27 @@ ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform ly_associate_package(PACKAGE_NAME mcpp-2.7.2_az.1-rev1-multiplatform TARGETS mcpp PACKAGE_HASH df75586f2ab4c0e4dca6361fb536ec07bd2fc43f4fa1490c3ef83623001023d8) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) ly_associate_package(PACKAGE_NAME SPIRVCross-2020.04.20-rev1-multiplatform TARGETS SPIRVCross PACKAGE_HASH 7c8c0eaa0166c26745c62d2238525af7e27ac058a5db3defdbaec1878e8798dd) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-2020.08.07-rev1-multiplatform TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 04a6850ce03d4c16e19ed206f7093d885276dfb74047e6aa99f0a834c8b7cc73) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxcAz-5.0.0_az-rev1-multiplatform TARGETS DirectXShaderCompilerDxcAz PACKAGE_HASH 94f24989a7a371d840b513aa5ffaff02747b3d19b119bc1f899427e29978f753) -ly_associate_package(PACKAGE_NAME azslc-1.7.19-rev1-multiplatform TARGETS azslc PACKAGE_HASH e7649ba4a9190a82512f9aaad1b4318fbdf09384c533d2e3cc15c8440e65bd4a) +ly_associate_package(PACKAGE_NAME azslc-1.7.20-rev1-multiplatform TARGETS azslc PACKAGE_HASH 45d55f28bea2ef823ed3204f60df52e5e329f42923923d4555fdbdf3bea0af60) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) +ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) ly_associate_package(PACKAGE_NAME Blast-1.1.7-rev1-multiplatform TARGETS Blast PACKAGE_HASH 36b8f393bcd25d0f85cfc7a831ebbdac881e6054c4f0735649966aa6aa86e6f0) ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform TARGETS PVRTexTool PACKAGE_HASH d0d6da61c7557de0d2c71fc35ba56c3be49555b703f0e853d4c58225537acf1e) + # platform-specific: ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev1-windows TARGETS AWSNativeSDK PACKAGE_HASH 58e199f253a28964b96056ed4a6db06216fcde14a96d6d94b0d6ad3437516bdc) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-windows TARGETS PhysX PACKAGE_HASH 198bed89d1aae7caaf5dadba24cee56235fe41725d004b64040d4e50d0f3aa1a) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-windows TARGETS mikkelsen PACKAGE_HASH 872c4d245a1c86139aa929f2b465b63ea4ea55b04ced50309135dd4597457a4e) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-windows TARGETS googletest PACKAGE_HASH 7e8f03ae8a01563124e3daa06386f25a2b311c10bb95bff05cae6c41eff83837) -ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev1-windows TARGETS GoogleBenchmark PACKAGE_HASH 1cca6d83d43b3d1f2abf39b12485bca33b47ee4c3def85ed2513b3c8656b14ec) +ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-windows TARGETS GoogleBenchmark PACKAGE_HASH 0c94ca69ae8e7e4aab8e90032b5c82c5964410429f3dd9dbb1f9bf4fe032b1d4) ly_associate_package(PACKAGE_NAME d3dx12-headers-rev1-windows TARGETS d3dx12 PACKAGE_HASH 088c637159fba4a3e4c0cf08fb4921906fd4cca498939bd239db7c54b5b2f804) ly_associate_package(PACKAGE_NAME pyside2-qt-5.15.1-rev2-windows TARGETS pyside2 PACKAGE_HASH c90f3efcc7c10e79b22a33467855ad861f9dbd2e909df27a5cba9db9fa3edd0f) -ly_associate_package(PACKAGE_NAME openimageio-2.1.16.0-rev1-windows TARGETS openimageio PACKAGE_HASH b9f6d6df180ad240b9f17a68c1862c7d8f38234de0e692e83116254b0ee467e5) +ly_associate_package(PACKAGE_NAME openimageio-2.1.16.0-rev1-windows TARGETS OpenImageIO PACKAGE_HASH b9f6d6df180ad240b9f17a68c1862c7d8f38234de0e692e83116254b0ee467e5) ly_associate_package(PACKAGE_NAME qt-5.15.2-windows TARGETS Qt PACKAGE_HASH edaf954c647c99727bfd313dab2959803d2df0873914bb96368c3d8286eed6d9) +ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev1-windows TARGETS libsamplerate PACKAGE_HASH 3dcf883d22dc9c99866eeed7bed3ede7ab1fbcbce16c45fdb1174c1c6ab7e358) diff --git a/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake b/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake index 49b7b68c61..5a16784824 100644 --- a/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake +++ b/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake @@ -17,7 +17,6 @@ set(FILES DirectXShaderCompiler_windows.cmake dyad_windows.cmake etc2comp_windows.cmake - expat_windows.cmake FbxSdk_windows.cmake FreeType2_windows.cmake libav_windows.cmake diff --git a/cmake/3rdParty/Platform/Windows/expat_windows.cmake b/cmake/3rdParty/Platform/Windows/expat_windows.cmake deleted file mode 100644 index 7528e35168..0000000000 --- a/cmake/3rdParty/Platform/Windows/expat_windows.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(EXPAT_LIBS ${BASE_PATH}/build/win_x64/vc140/$,debug,release>/expat.lib) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index 63c8b6bb17..931d3472a7 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -17,13 +17,15 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-multiplatform TARGETS Rap ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) +ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) # platform-specific: ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev1-ios TARGETS AWSNativeSDK PACKAGE_HASH 9e1956b5bb10762cdb84a981dcd356419078f4296ffbc8c55717bc3f53b09d69) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-ios TARGETS PhysX PACKAGE_HASH a2a48a09128337c72b9c2c1b8f43187c6c914e8509c9c6cd91810108748d7e09) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-ios TARGETS mikkelsen PACKAGE_HASH 976aaa3ccd8582346132a10af253822ccc5d5bcc9ea5ba44d27848f65ee88a8a) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-ios TARGETS googletest PACKAGE_HASH 2f121ad9784c0ab73dfaa58e1fee05440a82a07cc556bec162eeb407688111a7) -ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev1-ios TARGETS GoogleBenchmark PACKAGE_HASH c37f4d78bf3713c57f611427bdc3bc8f2a0b1118ccd13b07d97c64dafea4c8c8) - +ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-ios TARGETS GoogleBenchmark PACKAGE_HASH c2ffaed2b658892b1bcf81dee4b44cd1cb09fc78d55584ef5cb8ab87f2d8d1ae) +ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev1-ios TARGETS libsamplerate PACKAGE_HASH 126ab8335f3aa12322665c51d6cb144195b9b9e4c9f5a5d3fc1b560025cc772d) diff --git a/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake b/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake index b0188ac808..78d8219424 100644 --- a/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake +++ b/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake @@ -11,7 +11,6 @@ set(FILES BuiltInPackages_ios.cmake - expat_ios.cmake FreeType2_ios.cmake OpenSSL_ios.cmake RadTelemetry_ios.cmake diff --git a/cmake/3rdParty/Platform/iOS/expat_ios.cmake b/cmake/3rdParty/Platform/iOS/expat_ios.cmake deleted file mode 100644 index 007fe9ed70..0000000000 --- a/cmake/3rdParty/Platform/iOS/expat_ios.cmake +++ /dev/null @@ -1,13 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(EXPAT_LIBS ${BASE_PATH}/build/osx/ios-clang-703.0.31/$,debug,release>/libexpat.a) - diff --git a/cmake/3rdParty/cmake_files.cmake b/cmake/3rdParty/cmake_files.cmake index c98110ae2b..95ce60e48a 100644 --- a/cmake/3rdParty/cmake_files.cmake +++ b/cmake/3rdParty/cmake_files.cmake @@ -17,7 +17,6 @@ set(FILES FindDirectXShaderCompiler.cmake Finddyad.cmake Findetc2comp.cmake - Findexpat.cmake FindFbxSdk.cmake FindFreeType2.cmake Findlibav.cmake diff --git a/cmake/3rdPartyPackages.cmake b/cmake/3rdPartyPackages.cmake index 2219ded0aa..75a9f1a2cb 100644 --- a/cmake/3rdPartyPackages.cmake +++ b/cmake/3rdPartyPackages.cmake @@ -44,9 +44,15 @@ endif() # or checked into source control so that others on the same project can avoid re-downloading set(LY_PACKAGE_KEEP_AFTER_DOWNLOADING TRUE CACHE BOOL "If enabled, packages will be kept after downloading them for later re-use") set(LY_PACKAGE_DOWNLOAD_CACHE_LOCATION ${LY_3RDPARTY_PATH}/downloaded_packages CACHE PATH "You can make it store the packages in a folder of your choosing") +if (DEFINED ENV{LY_PACKAGE_DOWNLOAD_CACHE_LOCATION}) + set(LY_PACKAGE_DOWNLOAD_CACHE_LOCATION $ENV{LY_PACKAGE_DOWNLOAD_CACHE_LOCATION}) +endif() # LY_PACKAGE_UNPACK_LOCATION - you can change this to any path reachable. set(LY_PACKAGE_UNPACK_LOCATION ${LY_3RDPARTY_PATH}/packages CACHE PATH "Location to unpack downloaded packages to") +if (DEFINED ENV{LY_PACKAGE_UNPACK_LOCATION}) + set(LY_PACKAGE_UNPACK_LOCATION $ENV{LY_PACKAGE_UNPACK_LOCATION}) +endif() # note that sometimes the user configures first without populating LY_3RDPARTY_PATH # in that case, we'll try overwriting the cache value, only if it is blank: @@ -273,18 +279,22 @@ function(ly_package_internal_download_package package_name url_variable) # remove the status code and treat the rest of the list as the error. list(REMOVE_AT results 0) set(current_error_message "Error from server ${server_url} - ${status_code} - ${results}") + #strip whitespace + string(REGEX REPLACE "[ \t\r\n]$" "" current_error_message "${current_error_message}") list(APPEND error_messages "${current_error_message}") - # we can't keep the file, sometimes it makes a zero-byte file! file(REMOVE ${download_target}) - ly_package_message(${current_error_message}) endif() endforeach() - message(SEND_ERROR "ly_package: - Unable to find package ${package_name} on any download server. Enable LY_PACKAGE_DEBUG to debug") - # only output errors if all servers failed and we found it nowhere: + # note that we FATAL_ERROR here because otherwise, some of the packages we provide would fall through + # and use unknown versions possibly present somewhere in the user's system - but if we wanted that to happen + # we wouldn't have used a ly-package-association in the first place! Continuing from there would just cause + # a cascade of errors even harder to track down. + set(final_error_message "ly_package: - Unable to get package ${package_name} from any download server. Enable LY_PACKAGE_DEBUG to debug.") foreach(error_message ${error_messages}) - message(STATUS "${error_message}") + set(final_error_message "${final_error_message}\n${error_message}") endforeach() + message(FATAL_ERROR "${final_error_message}") endfunction() # parse_sha256sums_line @@ -497,7 +507,12 @@ function(ly_force_download_package package_name) ly_package_message(STATUS "ly_package: - downloading package '${package_name}' to '${final_folder}'") ly_package_internal_download_package(${package_name} ${temp_download_target}) - # the above call actually aborts this function if it fails, so its not necessary to check here. + # The above function will try every download location, with retries, so by the time we get here, the + # operation is either done, or has completely failed. + if (NOT EXISTS ${temp_download_target}) + # the system will have already issued errors, no need to issue more. + return() + endif() else() ly_package_message(STATUS "ly_package: - package already correct hash ${temp_download_target}, re-using") endif() @@ -578,9 +593,7 @@ function(ly_enable_package package_name) ly_force_download_package(${package_name}) endif() - if(NOT ${package_name}_VALIDATED) - message(FATAL_ERROR "ly_package: Package ${package_name} could not be found or downloaded. Expect build errors. Enable LY_PACKAGE_DEBUG to debug.") - else() + if(${package_name}_VALIDATED) set_property(GLOBAL PROPERTY LY_${package_name}_VALIDATED TRUE) # this message is unconditional as it will help prove that the package even was # attempted to be mounted using our package system. In the absence of this message diff --git a/cmake/Configurations.cmake b/cmake/Configurations.cmake index e3386b06e8..88ebfb8913 100644 --- a/cmake/Configurations.cmake +++ b/cmake/Configurations.cmake @@ -176,13 +176,13 @@ unset(_isMultiConfig) # to append to the CMAKE_*_LINKER_FLAGS_PROFILE variables in the parent scope when it runs foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) string(TOUPPER ${conf} UCONF) - ly_set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} ar") - ly_set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} libraries") - ly_set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} executables") - ly_set(CMAKE_STATIC_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the archiver for ${conf}") - ly_set(CMAKE_MODULE_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating a module library for ${conf}") - ly_set(CMAKE_SHARED_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating a shared library for ${conf}") - ly_set(CMAKE_EXE_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating an executable for ${conf}") + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} ar") + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} libraries") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${UCONF} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${conf} CACHE PATH "Installation directory for ${conf} executables") + set(CMAKE_STATIC_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the archiver for ${conf}") + set(CMAKE_MODULE_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating a module library for ${conf}") + set(CMAKE_SHARED_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating a shared library for ${conf}") + set(CMAKE_EXE_LINKER_FLAGS_${UCONF} CACHE STRING "Flags to pass to the linker when creating an executable for ${conf}") endforeach() # flags are defined per platform, follow platform files under Platform//Configurations_.cmake diff --git a/cmake/Deployment.cmake b/cmake/Deployment.cmake index db51ff2e97..9f2a4a67c5 100644 --- a/cmake/Deployment.cmake +++ b/cmake/Deployment.cmake @@ -11,7 +11,7 @@ # Define options that control the different options for deployment for target platforms -ly_set(LY_ASSET_DEPLOY_MODE "LOOSE" CACHE STRING "Set the Asset deployment when deploying to the target platform (LOOSE, PAK, VFS)") -ly_set(LY_OVERRIDE_PAK_FOLDER_ROOT "" CACHE STRING "Optional root path to where Pak file folders are stored. By default, blank will use a predefined 'paks' root.") +set(LY_ASSET_DEPLOY_MODE "LOOSE" CACHE STRING "Set the Asset deployment when deploying to the target platform (LOOSE, PAK, VFS)") +set(LY_OVERRIDE_PAK_FOLDER_ROOT "" CACHE STRING "Optional root path to where Pak file folders are stored. By default, blank will use a predefined 'paks' root.") diff --git a/cmake/LYTestWrappers.cmake b/cmake/LYTestWrappers.cmake index d329c0f0ac..4f8d0bc169 100644 --- a/cmake/LYTestWrappers.cmake +++ b/cmake/LYTestWrappers.cmake @@ -246,7 +246,6 @@ endfunction() # \arg:NAME name of the test-module to register with CTest # \arg:PATH path to the file (or dir) containing pytest-based tests # \arg:PYTEST_MARKS (optional) extra pytest marker filtering string (see pytest arg "-m") -# Used to sub-filter test modules beyond suite tags (marks for pytest.mark.SUITE_XXX are automatically filtered based on arg TEST_SUITE) # \arg:EXTRA_ARGS (optional) additional arguments to pass to PyTest, should not include pytest marks (value for "-m" should be passed to PYTEST_MARKS) # \arg:TEST_SERIAL (bool) disable parallel execution alongside other test modules, important when this test depends on shared resources or environment state # \arg:TEST_REQUIRES (optional) list of system resources needed by the tests in this module. Used to filter out execution when those system resources are not available. For example, 'gpu' @@ -269,25 +268,15 @@ function(ly_add_pytest) cmake_parse_arguments(ly_add_pytest "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - if(NOT ly_add_pytest_PATH) message(FATAL_ERROR "Must supply a value for PATH to tests") endif() - if (ly_add_pytest_TEST_SUITE AND NOT ly_add_pytest_TEST_SUITE STREQUAL "main") - # When a suite is specified, the test will only run things with that suite's pytest mark - set(suite_marker "SUITE_${ly_add_pytest_TEST_SUITE}") - else() - # when main or no suite is specified, everything not in other suites will run: main is default - set(suite_marker "(not SUITE_smoke and not SUITE_periodic and not SUITE_benchmark and not SUITE_sandbox)") - endif() if(ly_add_pytest_PYTEST_MARKS) # Suite marker args added by non_ide_params will duplicate those set by custom_marks_args # however resetting flags is safe and overrides with the final value set set(custom_marks_args "-m" "${ly_add_pytest_PYTEST_MARKS}") - set(suite_marker "${suite_marker} and (${ly_add_pytest_PYTEST_MARKS})") endif() - set(non_ide_params "-m" "${suite_marker}") string(REPLACE "::" "_" pytest_report_directory "${PYTEST_XML_OUTPUT_DIR}/${ly_add_pytest_NAME}.xml") @@ -297,7 +286,6 @@ function(ly_add_pytest) LABELS FRAMEWORK_pytest TEST_COMMAND ${LY_PYTEST_EXECUTABLE} ${ly_add_pytest_PATH} ${ly_add_pytest_EXTRA_ARGS} --junitxml=${pytest_report_directory} ${custom_marks_args} TEST_LIBRARY pytest - NON_IDE_PARAMS ${non_ide_params} COMPONENT ${ly_add_pytest_COMPONENT} ${ly_add_pytest_UNPARSED_ARGUMENTS} ) diff --git a/cmake/LySet.cmake b/cmake/LySet.cmake index eaede5b07d..c282418cc3 100644 --- a/cmake/LySet.cmake +++ b/cmake/LySet.cmake @@ -18,9 +18,9 @@ endif() # where CMAKE_SOURCE_DIR != CMAKE_CURRENT_LIST_DIR (e.g. when the engine's cmake # files are included from a project) # -macro(ly_set) - set(${ARGN}) +macro(ly_set name) + set(${name} "${ARGN}") if(LY_PARENT_SCOPE) - set(${ARGN} PARENT_SCOPE) + set(${name} "${ARGN}" PARENT_SCOPE) endif() endmacro() diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index 022d7ae972..3f1e3b8669 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -60,7 +60,6 @@ ly_append_configurations_options( # Disabling these warnings while they get fixed /wd4018 # signed/unsigned mismatch - /wd4115 # named type definition in parentheses /wd4121 # alignment of a member was sensitive to packing /wd4189 # local variable is initialized but not referenced /wd4201 # nonstandard extension used: nameless struct/union @@ -73,18 +72,14 @@ ly_append_configurations_options( /wd4310 # cast truncates constant value /wd4324 # structure was padded due to alignment specifier /wd4366 # the result of unary operator may be unaligned - /wd4373 # previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers /wd4389 # comparison, signed/unsigned mismatch /wd4436 # the result of unary operator may be unaligned /wd4450 # declaration hides global declaration /wd4457 # declaration hides function parameter /wd4459 # declaration hides global declaration - /wd4463 # overflow, assigning 1 to bit-field can only hold values from -1 to 0 /wd4701 # potentially unintialized local variable /wd4702 # unreachable code - /wd4703 # potentially unitialized local pointer variable /wd4706 # assignment with conditional expression - /wd4913 # user defined binary operator ',' exists but no overload could convert all operands # Enabling warnings that are disabled by default from /W4 # https://docs.microsoft.com/en-us/cpp/preprocessor/compiler-warnings-that-are-off-by-default?view=vs-2019 @@ -139,7 +134,7 @@ ly_append_configurations_options( /INCREMENTAL:NO ) -ly_set(LY_BUILD_WITH_INCREMENTAL_LINKING_DEBUG TRUE CACHE BOOL "Indicates if incremental linking is used in debug configurations (default = TRUE)") +set(LY_BUILD_WITH_INCREMENTAL_LINKING_DEBUG TRUE CACHE BOOL "Indicates if incremental linking is used in debug configurations (default = TRUE)") if(LY_BUILD_WITH_INCREMENTAL_LINKING_DEBUG) ly_append_configurations_options( COMPILATION_DEBUG diff --git a/cmake/Projects.cmake b/cmake/Projects.cmake index 0113edc1be..139c2a24d1 100644 --- a/cmake/Projects.cmake +++ b/cmake/Projects.cmake @@ -13,7 +13,7 @@ include_guard() -set(LY_PROJECTS "" CACHE STRING "List of projects to enable, this can be a relative path to the engine root or an absolute path") +set(LY_PROJECTS "${LY_PROJECTS}" CACHE STRING "List of projects to enable, this can be a relative path to the engine root or an absolute path") #! ly_add_target_dependencies: adds module load dependencies for this target. # @@ -82,12 +82,13 @@ endfunction() # \arg:PROJECT_NAME name of the game project # \arg:TARGETS names of the targets to associate the dependencies to # \arg:DEPENDENCIES_FILES file(s) that contains the runtime dependencies the TARGETS will be associated to +# \arg:DEPENDENT_TARGETS additional list of targets should be added as load-time dependencies for the TARGETS list # function(ly_add_project_dependencies) set(options) set(oneValueArgs PROJECT_NAME) - set(multiValueArgs TARGETS DEPENDENCIES_FILES) + set(multiValueArgs TARGETS DEPENDENCIES_FILES DEPENDENT_TARGETS) cmake_parse_arguments(ly_add_project_dependencies "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -100,6 +101,7 @@ function(ly_add_project_dependencies) PREFIX ${ly_add_project_dependencies_PROJECT_NAME} TARGETS ${ly_add_project_dependencies_TARGETS} DEPENDENCIES_FILES ${ly_add_project_dependencies_DEPENDENCIES_FILES} + DEPENDENT_TARGETS ${ly_add_project_dependencies_DEPENDENT_TARGETS} ) endfunction() diff --git a/cmake/Tools/Platform/Android/android_deployment.py b/cmake/Tools/Platform/Android/android_deployment.py index 957bb8833e..8a76270df1 100755 --- a/cmake/Tools/Platform/Android/android_deployment.py +++ b/cmake/Tools/Platform/Android/android_deployment.py @@ -51,7 +51,7 @@ class AndroidDeployment(object): DEPLOY_ASSETS_ONLY = 'ASSETS' DEPLOY_BOTH = 'BOTH' - def __init__(self, dev_root, build_dir, configuration, android_device_filter, clean_deploy, android_sdk_path, deployment_type, game_name=None, asset_mode=None, asset_type=None, embedded_assets=True): + def __init__(self, dev_root, build_dir, configuration, android_device_filter, clean_deploy, android_sdk_path, deployment_type, game_name=None, asset_mode=None, asset_type=None, embedded_assets=True, is_unit_test=False): """ Initialize the Android Deployment Worker @@ -60,10 +60,11 @@ class AndroidDeployment(object): :param clean_deploy: Option to clean the target device's assets before deploying the game's assets from the host :param android_sdk_path: Path to the android SDK (to use the adb tool) :param deployment_type: The type of deployment (DEPLOY_APK_ONLY, DEPLOY_ASSETS_ONLY, or DEPLOY_BOTH) - :param game_name: The name of the game whoses assets are being deployed. None if is_test_project is True + :param game_name: The name of the game whose assets are being deployed. None if is_test_project is True :param asset_mode: The asset mode of deployment (LOOSE, PAK, VFS). None if is_test_project is True :param asset_type: The asset type (for android, 'es3'). None if is_test_project is True :param embedded_assets: Boolean to indicate if the assets are embedded in the APK or not + :param is_unit_test: Boolean to indicate if this is a unit test deployment """ self.dev_root = pathlib.Path(dev_root) @@ -84,7 +85,7 @@ class AndroidDeployment(object): self.deployment_type = deployment_type - self.is_test_project = game_name == android_support.TEST_RUNNER_PROJECT + self.is_test_project = is_unit_test if not self.is_test_project: @@ -96,7 +97,7 @@ class AndroidDeployment(object): if asset_mode == 'PAK': self.local_asset_path = self.dev_root / 'Pak' / f'{game_name.lower()}_{asset_type}_paks' else: - self.local_asset_path = self.dev_root / game_name / 'Cache' / asset_type + self.local_asset_path = self.dev_root / game_name / 'Cache' / asset_type assert game_name is not None, f"'game_name' is required" self.game_name = game_name diff --git a/cmake/Tools/Platform/Android/android_support.py b/cmake/Tools/Platform/Android/android_support.py index a262d6f0c9..d98aee177c 100755 --- a/cmake/Tools/Platform/Android/android_support.py +++ b/cmake/Tools/Platform/Android/android_support.py @@ -118,8 +118,10 @@ class AndroidProjectManifestEnvironment(object): # Extract the key attributes we need to process and build up our environment table project_json = json.loads(project_properties_content) - project_name = project_json['project_name'] - product_name = project_json['product_name'] + project_name = project_json.get('project_name') + if not project_name: + raise common.LmbrCmdError(f"Missing required 'project_name' from project.json for project at '{str(project_path)}'") + product_name = project_json.get('product_name', project_name) game_project_android_settings = project_json['android_settings'] @@ -303,7 +305,7 @@ asset_deploy_type={asset_type} [android] android_sdk_path={android_sdk_path} embed_assets_in_apk={embed_assets_in_apk} - +is_unit_test={is_unit_test} """ NATIVE_CMAKE_SECTION_ANDROID_FORMAT = """ @@ -311,7 +313,7 @@ NATIVE_CMAKE_SECTION_ANDROID_FORMAT = """ cmake {{ buildStagingDirectory "." version "{cmake_version}" - path "{relative_cmakelist_path}" + path "{absolute_cmakelist_path}" }} }} """ @@ -377,7 +379,7 @@ dependencies {{ OVERRIDE_JAVA_SOURCESET_STR = """ java {{ - srcDirs = ['{relative_azandroid_path}', 'src/main/java'] + srcDirs = ['{absolute_azandroid_path}', 'src/main/java'] }} """ @@ -425,7 +427,8 @@ class AndroidProjectGenerator(object): def __init__(self, engine_root, build_dir, android_ndk_path, android_sdk_path, android_sdk_version, android_ndk_platform, project_path, third_party_path, cmake_version, override_cmake_path, override_gradle_path, override_ninja_path, - android_sdk_build_tool_version, include_assets_in_apk, asset_mode, asset_type, signing_config, is_test_project=False): + android_sdk_build_tool_version, include_assets_in_apk, asset_mode, asset_type, signing_config, is_test_project=False, + overwrite_existing=True): """ Initialize the object with all the required parameters needed to create an Android Project. The parameters should be verified before initializing this object @@ -447,6 +450,7 @@ class AndroidProjectGenerator(object): :param asset_type: :param signing_config: Optional signing configuration arguments :param is_test_project: Flag to indicate if this is a unit test runner project. (If true, project_path, asset_mode, asset_type, and include_assets_in_apk are ignored) + :param overwrite_existing: Flag to overwrite existing project files when being generated, or skip if they already exist. """ self.env = {} @@ -488,6 +492,8 @@ class AndroidProjectGenerator(object): self.is_test_project = is_test_project + self.overwrite_existing = overwrite_existing + def execute(self): """ Execute the android project creation workflow @@ -513,25 +519,23 @@ class AndroidProjectGenerator(object): # Generate the gradle build script self.create_file_from_project_template(src_template_file='root.build.gradle.in', template_env=root_gradle_env, - dst_file=self.build_dir / 'build.gradle', - overwrite_existing=True) + dst_file=self.build_dir / 'build.gradle') self.write_settings_gradle(project_names) self.prepare_gradle_wrapper() - def create_file_from_project_template(self, src_template_file, template_env, dst_file, overwrite_existing): + def create_file_from_project_template(self, src_template_file, template_env, dst_file): """ Create a file from an android template file :param src_template_file: The name of the template file that is located under Code/Tools/Android/ProjectBuilder :param template_env: The dictionary that contains the template substitution values :param dst_file: The target concrete file to write to - :param overwrite_existing: Flag to indicate overwriting an existing file or not """ src_template_file_path = self.android_project_builder_path / src_template_file - if not dst_file.exists() or overwrite_existing: + if not dst_file.exists() or self.overwrite_existing: default_local_properties_content = common.load_template_file(template_file_path=src_template_file_path, template_env=template_env) @@ -571,11 +575,12 @@ class AndroidProjectGenerator(object): if self.is_test_project: platform_settings_content = PLATFORM_SETTINGS_FORMAT.format(generation_timestamp=str(datetime.datetime.now().strftime("%c")), platform='android', - project_path=TEST_RUNNER_PROJECT, + project_path=self.project_path, asset_mode='', asset_type='', android_sdk_path=str(self.android_sdk_path), - embed_assets_in_apk=True) + embed_assets_in_apk=True, + is_unit_test=True) else: platform_settings_content = PLATFORM_SETTINGS_FORMAT.format(generation_timestamp=str(datetime.datetime.now().strftime("%c")), platform='android', @@ -583,7 +588,8 @@ class AndroidProjectGenerator(object): asset_mode=self.asset_mode, asset_type=self.asset_type, android_sdk_path=str(self.android_sdk_path), - embed_assets_in_apk=str(self.include_assets_in_apk)) + embed_assets_in_apk=str(self.include_assets_in_apk), + is_unit_test=False) platform_settings_file = self.build_dir / 'platform.settings' platform_settings_file.open('w').write(platform_settings_content) @@ -604,13 +610,12 @@ class AndroidProjectGenerator(object): "GENERATION_TIMESTAMP": str(datetime.datetime.now().strftime("%c")), "ANDROID_NDK_PATH": template_android_ndk_path, "ANDROID_SDK_PATH": template_android_sdk_path, - "CMAKE_DIR_LINE": f'cmake.dir="{template_cmake_path}"' if template_cmake_path else '' + "CMAKE_DIR_LINE": f'cmake.dir={template_cmake_path}' if template_cmake_path else '' } self.create_file_from_project_template(src_template_file='local.properties.in', template_env=local_properties_env, - dst_file=self.build_dir / 'local.properties', - overwrite_existing=False) + dst_file=self.build_dir / 'local.properties') def patch_and_transfer_android_libs(self): """ @@ -653,7 +658,7 @@ class AndroidProjectGenerator(object): .format(libName, ", ".join(string.Template(path).substitute(self.env) for path in value['srcDir']))) if 'patches' in value: - lib_to_patch = self._Library(libName, src_dir, self.signing_config) + lib_to_patch = self._Library(libName, src_dir, self.overwrite_existing, self.signing_config) for patch in value['patches']: file_to_patch = self._File(patch['path']) for change in patch['changes']: @@ -716,17 +721,17 @@ class AndroidProjectGenerator(object): gradle_build_env = dict() - engine_root_as_path= pathlib.PurePath(self.engine_root) + engine_root_as_path= pathlib.Path(self.engine_root) - relative_cmakelist_path = (engine_root_as_path / 'CMakeLists.txt').as_posix() - relative_azandroid_path = (engine_root_as_path / 'Code/Framework/AzAndroid/java').as_posix() + absolute_cmakelist_path = (engine_root_as_path / 'CMakeLists.txt').resolve().as_posix() + absolute_azandroid_path = (engine_root_as_path / 'Code/Framework/AzAndroid/java').resolve().as_posix() gradle_build_env['TARGET_TYPE'] = 'application' gradle_build_env['PROJECT_DEPENDENCIES'] = PROJECT_DEPENDENCIES_VALUE_FORMAT.format(dependencies='\n'.join(gradle_project_dependencies)) - gradle_build_env['NATIVE_CMAKE_SECTION_ANDROID'] = NATIVE_CMAKE_SECTION_ANDROID_FORMAT.format(cmake_version=str(self.cmake_version), relative_cmakelist_path=relative_cmakelist_path) + gradle_build_env['NATIVE_CMAKE_SECTION_ANDROID'] = NATIVE_CMAKE_SECTION_ANDROID_FORMAT.format(cmake_version=str(self.cmake_version), absolute_cmakelist_path=absolute_cmakelist_path) gradle_build_env['NATIVE_CMAKE_SECTION_DEFAULT_CONFIG'] = NATIVE_CMAKE_SECTION_DEFAULT_CONFIG_NDK_FORMAT_STR.format(abi=ANDROID_ARCH) - gradle_build_env['OVERRIDE_JAVA_SOURCESET'] = OVERRIDE_JAVA_SOURCESET_STR.format(relative_azandroid_path=relative_azandroid_path) + gradle_build_env['OVERRIDE_JAVA_SOURCESET'] = OVERRIDE_JAVA_SOURCESET_STR.format(absolute_azandroid_path=absolute_azandroid_path) gradle_build_env['OPTIONAL_JNI_SRC_LIB_SET'] = ', "outputs/native-lib"' @@ -782,14 +787,14 @@ class AndroidProjectGenerator(object): gradle_build_env[f'CUSTOM_APPLY_ASSET_LAYOUT_{native_config_upper}_TASK'] = \ CUSTOM_GRADLE_COPY_NATIVE_CONFIG_BUILD_ARTIFACTS_FORMAT_STR.format(config=native_config, config_lower=native_config_lower, - asset_layout_folder=(self.project_path / self.build_dir / 'app/src/main/assets').as_posix(), + asset_layout_folder=(self.build_dir / 'app/src/main/assets').as_posix(), file_includes='Test.Assets/**/*.*') else: # Copy over settings registry files from the Registry folder with build output directory gradle_build_env[f'CUSTOM_APPLY_ASSET_LAYOUT_{native_config_upper}_TASK'] = \ CUSTOM_GRADLE_COPY_NATIVE_CONFIG_BUILD_ARTIFACTS_FORMAT_STR.format(config=native_config, config_lower=native_config_lower, - asset_layout_folder=(self.project_path / self.build_dir / 'app/src/main/assets').as_posix(), + asset_layout_folder=(self.build_dir / 'app/src/main/assets').as_posix(), file_includes='**/Registry/*.setreg') if self.include_assets_in_apk: @@ -800,7 +805,7 @@ class AndroidProjectGenerator(object): asset_type=self.asset_type, project_path=self.project_path.as_posix(), asset_mode=self.asset_mode if native_config != 'Release' else 'PAK', - asset_layout_folder=common.normalize_path_for_settings(self.project_path / self.build_dir / 'app/src/main/assets'), + asset_layout_folder=common.normalize_path_for_settings(self.build_dir / 'app/src/main/assets'), config=native_config) else: gradle_build_env[f'CUSTOM_APPLY_ASSET_LAYOUT_{native_config_upper}_TASK'] = '' @@ -821,11 +826,9 @@ class AndroidProjectGenerator(object): gradle_build_env['SIGNING_CONFIGS'] = "" az_android_gradle_file = az_android_dst_path / 'build.gradle' - if not az_android_gradle_file.exists(): - self.create_file_from_project_template(src_template_file='build.gradle.in', - template_env=gradle_build_env, - dst_file=az_android_dst_path / 'build.gradle', - overwrite_existing=False) + self.create_file_from_project_template(src_template_file='build.gradle.in', + template_env=gradle_build_env, + dst_file=az_android_dst_path / 'build.gradle') # Generate a AndroidManifest.xml and write to ${az_android_dst_path}/src/main/AndroidManifest.xml dest_src_main_path = az_android_dst_path / 'src/main' @@ -837,8 +840,7 @@ class AndroidProjectGenerator(object): is_test=self.is_test_project) self.create_file_from_project_template(src_template_file=ANDROID_MANIFEST_FILE, template_env=az_android_package_env, - dst_file=dest_src_main_path / ANDROID_MANIFEST_FILE, - overwrite_existing=False) + dst_file=dest_src_main_path / ANDROID_MANIFEST_FILE) # Apply the 'android_builder.json' rules to copy over additional files to the target self.apply_android_builder_rules(az_android_dst_path=az_android_dst_path, @@ -878,8 +880,7 @@ class AndroidProjectGenerator(object): gradle_properties_file = self.build_dir / 'gradle.properties' self.create_file_from_project_template(src_template_file='gradle.properties.in', template_env=grade_properties_env, - dst_file=gradle_properties_file, - overwrite_existing=False) + dst_file=gradle_properties_file) logging.info("Generated gradle.properties -> %s", str(gradle_properties_file.resolve())) def apply_android_builder_rules(self, az_android_dst_path, az_android_package_env): @@ -1161,10 +1162,11 @@ class AndroidProjectGenerator(object): """ Library class to manage the library node in android_libraries.json """ - def __init__(self, name, path, signing_config=None): + def __init__(self, name, path, overwrite_existing, signing_config=None): self.name = name self.path = path self.signing_config = signing_config + self.overwrite_existing = overwrite_existing self.patch_files = [] self.dependencies = [] self.build_dependencies = [] @@ -1230,7 +1232,7 @@ class AndroidProjectGenerator(object): build_gradle_content = common.load_template_file(template_file_path=android_project_builder_path / 'build.gradle.in', template_env=build_gradle_env) dest_gradle_script_file = dst_path / 'build.gradle' - if not dest_gradle_script_file.exists(): + if not dest_gradle_script_file.exists() or self.overwrite_existing: dest_gradle_script_file.write_text(build_gradle_content, encoding=common.DEFAULT_TEXT_WRITE_ENCODING, errors=common.ENCODING_ERROR_HANDLINGS) diff --git a/cmake/Tools/Platform/Android/deploy_android.py b/cmake/Tools/Platform/Android/deploy_android.py index 231f823334..e8707fd5c3 100755 --- a/cmake/Tools/Platform/Android/deploy_android.py +++ b/cmake/Tools/Platform/Android/deploy_android.py @@ -59,7 +59,10 @@ def validate_android_deployment_arguments(build_dir_name): embedded_assets = embedded_assets_str.lower() in ('t', 'true', '1') - return build_dir, game_name, platform_settings.asset_deploy_mode, platform_settings.asset_deploy_type, android_sdk_path, embedded_assets + is_unit_test_str = getattr(platform_settings, 'is_unit_test', 'False') + is_unit_test = is_unit_test_str.lower() in ('t', 'true', '1') + + return build_dir, game_name, platform_settings.asset_deploy_mode, platform_settings.asset_deploy_type, android_sdk_path, embedded_assets, is_unit_test def main(args): @@ -96,7 +99,7 @@ def main(args): logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG if parsed_args.debug else logging.INFO) - build_dir, game_project, asset_mode, asset_type, android_sdk_path, embedded_assets = validate_android_deployment_arguments(build_dir_name=parsed_args.build_dir) + build_dir, game_project, asset_mode, asset_type, android_sdk_path, embedded_assets, is_unit_test = validate_android_deployment_arguments(build_dir_name=parsed_args.build_dir) deployment = android_deployment.AndroidDeployment(dev_root=ROOT_DEV_PATH, build_dir=build_dir, @@ -108,7 +111,8 @@ def main(args): android_device_filter=parsed_args.device_id_filter, clean_deploy=parsed_args.clean, android_sdk_path=android_sdk_path, - deployment_type=parsed_args.deployment_type) + deployment_type=parsed_args.deployment_type, + is_unit_test=is_unit_test) deployment.execute() diff --git a/cmake/Tools/Platform/Android/generate_android_project.py b/cmake/Tools/Platform/Android/generate_android_project.py index f9da1e4a02..28c6d7c601 100755 --- a/cmake/Tools/Platform/Android/generate_android_project.py +++ b/cmake/Tools/Platform/Android/generate_android_project.py @@ -238,6 +238,10 @@ def main(args): action='store_true', help='Generate a unit test APK instead of a game APK.') + parser.add_argument('--overwrite-existing', + action='store_true', + help='Option to overwrite existing scripts in the target build folder if they exist already.') + parsed_args = parser.parse_args(args) wrap_parsed_args(parsed_args) @@ -266,16 +270,11 @@ def main(args): verified_android_ndk_platform, verified_android_ndk_path = android_support.verify_android_ndk(android_ndk_platform=parsed_args.get_argument(ANDROID_NDK_PLATFORM_ARGUMENT_NAME), argument_name=ANDROID_NDK_ARGUMENT_NAME, override_android_ndk_path=parsed_args.get_argument(ANDROID_NDK_ARGUMENT_NAME)) - if parsed_args.unit_test or parsed_args.project_path == android_support.TEST_RUNNER_PROJECT: - verified_project_path = android_support.TEST_RUNNER_PROJECT - _, verified_engine_root = common.verify_project_and_engine_root(project_root=None, - engine_root=parsed_args.dev_root) - is_test_project = True - else: - # Verify the engine root path and project path - verified_project_path, verified_engine_root = common.verify_project_and_engine_root(project_root=parsed_args.project_path, + + # Verify the engine root path and project path + verified_project_path, verified_engine_root = common.verify_project_and_engine_root(project_root=parsed_args.project_path, engine_root=parsed_args.engine_root) - is_test_project = False + is_test_project = parsed_args.unit_test # Verify the 3rd Party Root Path third_party_path = pathlib.Path(parsed_args.third_party_path) / '3rdParty.txt' @@ -315,7 +314,8 @@ def main(args): asset_mode=parsed_args.get_argument(ASSET_MODE_ARGUMENT_NAME), asset_type=parsed_args.get_argument(ASSET_TYPE_ARGUMENT_NAME), signing_config=signing_config, - is_test_project=is_test_project) + is_test_project=is_test_project, + overwrite_existing=parsed_args.overwrite_existing) generator.execute() diff --git a/cmake/Tools/Platform/Android/launch_android_test.py b/cmake/Tools/Platform/Android/launch_android_test.py index cbb8a22bd0..8f82a6086c 100755 --- a/cmake/Tools/Platform/Android/launch_android_test.py +++ b/cmake/Tools/Platform/Android/launch_android_test.py @@ -60,8 +60,9 @@ def validate_android_test_build_dir(build_dir, configuration): platform_settings = common.PlatformSettings(build_path) if not platform_settings.projects: raise common.LmbrCmdError("Missing required platform settings object from build directory.") - game_name = platform_settings.projects[0] - if game_name != TEST_PROJECT: + is_unit_test_str = getattr(platform_settings, 'is_unit_test', 'False') + is_unit_test = is_unit_test_str.lower() in ('t', 'true', '1') + if not is_unit_test: raise common.LmbrCmdError("Invalid android build folder for tests.") # Construct and validate the path to the native binaries that are built for the APK based on the input confiugration diff --git a/cmake/Tools/add_remove_gem.py b/cmake/Tools/add_remove_gem.py index 01f8a7f12f..fab488bdbc 100755 --- a/cmake/Tools/add_remove_gem.py +++ b/cmake/Tools/add_remove_gem.py @@ -13,6 +13,7 @@ import argparse import logging import os import sys +import pathlib from cmake.Tools import utils from cmake.Tools import common @@ -22,21 +23,17 @@ logging.basicConfig() def add_gem_dependency(cmake_file: str, - gem_name: str) -> int: + gem_target: str) -> int: """ adds a gem dependency to a cmake file :param cmake_file: path to the cmake file - :param gem_name: name of the gem to add + :param gem_target: name of the cmake target :return: 0 for success or non 0 failure code """ if not os.path.isfile(cmake_file): logger.error(f'Failed to locate cmake file {cmake_file}') return 1 - if not utils.validate_identifier(gem_name): - logger.error(f'{gem_name} is not a valid gem name') - return 1 - # on a line by basis, see if there already is Gem::{gem_name} # find the first occurrence of a gem, copy its formatting and replace # the gem name with the new one and append it @@ -45,11 +42,11 @@ def add_gem_dependency(cmake_file: str, added = False with open(cmake_file, 'r') as s: for line in s: - if f'Gem::{gem_name}' in line: - logger.warning(f'{gem_name} is already a gem dependency.') + if f'Gem::{gem_target}' in line: + logger.warning(f'{gem_target} is already a gem dependency.') return 0 if not added and r'Gem::' in line: - new_gem = ' ' * line.find(r'Gem::') + f'Gem::{gem_name}\n' + new_gem = ' ' * line.find(r'Gem::') + f'Gem::{gem_target}\n' t_data.append(new_gem) added = True t_data.append(line) @@ -61,13 +58,16 @@ def add_gem_dependency(cmake_file: str, for line in t_data: index = index + 1 if r'set(GEM_DEPENDENCIES' in line: - t_data.insert(index, f' Gem::{gem_name}\n') + t_data.insert(index, f' Gem::{gem_target}\n') added = True break + # if we didn't add it then it's not here, add a whole new one if not added: - logger.error(f'{cmake_file} is malformed.') - return 1 + t_data.append('\n') + t_data.append('set(GEM_DEPENDENCIES\n') + t_data.append(f' Gem::{gem_target}\n') + t_data.append(')\n') # write the cmake os.unlink(cmake_file) @@ -77,10 +77,12 @@ def add_gem_dependency(cmake_file: str, return 0 -def get_project_gem_list(project_path: str) -> set: - runtime_gems = get_gem_list(get_runtime_cmake(project_path)) - tool_gems = get_gem_list(get_tool_cmake(project_path)) - return runtime_gems.union(tool_gems) +def get_project_gem_list(project_path: str, + platform: str = 'Common') -> set: + runtime_gems = get_gem_list(get_dependencies_cmake(project_path, 'runtime', platform)) + tool_gems = get_gem_list(get_dependencies_cmake(project_path, 'tool', platform)) + server_gems = get_gem_list(get_dependencies_cmake(project_path, 'server', platform)) + return runtime_gems.union(tool_gems.union(server_gems)) def get_gem_list(cmake_file: str) -> set: @@ -106,11 +108,11 @@ def get_gem_list(cmake_file: str) -> set: def remove_gem_dependency(cmake_file: str, - gem_name: str) -> int: + gem_target: str) -> int: """ removes a gem dependency from a cmake file :param cmake_file: path to the cmake file - :param gem_name: name of the gem to remove + :param gem_target: cmake target name :return: 0 for success or non 0 failure code """ if not os.path.isfile(cmake_file): @@ -123,13 +125,13 @@ def remove_gem_dependency(cmake_file: str, removed = False with open(cmake_file, 'r') as s: for line in s: - if f'Gem::{gem_name}' in line: + if f'Gem::{gem_target}' in line: removed = True else: t_data.append(line) if not removed: - logger.error(f'Failed to remove Gem::{gem_name} from cmake file {cmake_file}') + logger.error(f'Failed to remove Gem::{gem_target} from cmake file {cmake_file}') return 1 # write the cmake @@ -221,26 +223,25 @@ def remove_gem_subdir(cmake_file: str, return 0 -def get_runtime_cmake(project_path: str) -> str: +def get_dependencies_cmake(project_path: str, + dependency_type: str = 'runtime', + platform: str = 'Common') -> str: if not project_path: return '' - dependencies_file = 'runtime_dependencies.cmake' - gem_path = os.path.join(project_path, 'Gem', 'Code', dependencies_file) - if os.path.isfile(gem_path): - return gem_path - return os.path.join(project_path, 'Code', dependencies_file) - - -def get_tool_cmake(project_path: str) -> str: - if not project_path: - return '' - dependencies_file = 'tool_dependencies.cmake' - gem_path = os.path.join(project_path, 'Gem', 'Code', dependencies_file) - if os.path.isfile(gem_path): - return gem_path - return os.path.join(project_path, 'Code', dependencies_file) - + if platform == 'Common': + dependencies_file = f'{dependency_type}_dependencies.cmake' + gem_path = os.path.join(project_path, 'Gem', 'Code', dependencies_file) + if os.path.isfile(gem_path): + return gem_path + return os.path.join(project_path, 'Code', dependencies_file) + else: + dependencies_file = f'{platform.lower()}_{dependency_type}_dependencies.cmake' + gem_path = os.path.join(project_path, 'Gem', 'Code', 'Platform', platform, dependencies_file) + if os.path.isfile(gem_path): + return gem_path + return os.path.join(project_path, 'Code', 'Platform', platform, dependencies_file) +# this function is making some not so good assumptions about gem naming def find_all_gems(gem_folder_list: list) -> list: """ Find all Modules which appear to be gems living within a list of folders @@ -300,26 +301,58 @@ def find_all_gems(gem_folder_list: list) -> list: return sorted(list(module_gems.values()), key=lambda x: x.get('Name')) +def find_gem_modules(gem_folder: str) -> list: + """ + Find all gem modules which appear to be gems living in this folder + :param gem_folder: the folder to walk down + :return: list of gem targets + """ + module_identifiers = [ + 'MODULE', + 'GEM_MODULE', + '${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}' + ] + modules = [] + for root, dirs, files in os.walk(gem_folder): + for file in files: + if file == 'CMakeLists.txt': + with open(os.path.join(root, file), 'r') as s: + for line in s: + trimmed = line.lstrip() + if trimmed.startswith('NAME '): + trimmed = trimmed.rstrip(' \n') + split_trimmed = trimmed.split(' ') + if len(split_trimmed) == 3 and split_trimmed[2] in module_identifiers: + modules.append(split_trimmed[1]) + return modules + + def add_remove_gem(add: bool, dev_root: str, gem_path: str, + gem_target: str, project_path: str, + dependencies_file: str or None, project_restricted_path: str = 'restricted', - runtime_dependency: bool = True, - tool_dependency: bool = True, - remove_gem_from_cmake: bool = False, - gem_name: str = None) -> int: + runtime_dependency: bool = False, + tool_dependency: bool = False, + server_dependency: bool = False, + platforms: str = 'Common', + gem_cmake: str = None) -> int: """ add a gem to a project :param add: should we add a gem, if false we remove a gem :param dev_root: the dev root of the engine :param gem_path: path to the gem to add + :param gem_target: the name of teh cmake gem module :param project_path: path to the project to add the gem to + :param dependencies_file: if this dependency goes/is in a specific file :param project_restricted_path: path to the projects restricted folder - :param runtime_dependency: optional bool to specify this is a runtime gem for the game, default is true - :param tool_dependency: optional bool to specify this is a tool gem for the editor, default is true - :param remove_gem_from_cmake: optional bool to specify that this gem should be removed from the Gems/ CMakeLists.txt - :param gem_name: optional str specifying a gem name. Default is derived based on base_name of gem_path + :param runtime_dependency: bool to specify this is a runtime gem for the game + :param tool_dependency: bool to specify this is a tool gem for the editor + :param server_dependency: bool to specify this is a server gem for the server + :param platforms: str to specify common or which specific platforms + :param gem_cmake: str to specify that this gem should be removed from the Gems/CMakeLists.txt :return: 0 for success or non 0 failure code """ @@ -327,10 +360,10 @@ def add_remove_gem(add: bool, if not dev_root: logger.error('Dev root cannot be empty.') return 1 - dev_root = dev_root.replace('\\', '/') if not os.path.isabs(dev_root): dev_root = os.path.abspath(dev_root) - if not os.path.isdir(dev_root): + dev_root = pathlib.Path(dev_root) + if not dev_root.is_dir(): logger.error(f'Dev root {dev_root} is not a folder.') return 1 @@ -338,17 +371,18 @@ def add_remove_gem(add: bool, if not project_path: logger.error('Project path cannot be empty.') return 1 - project_path = project_path.replace('\\', '/') if not os.path.isabs(project_path): project_path = f'{dev_root}/{project_path}' - if not os.path.isdir(project_path): + project_path = pathlib.Path(project_path) + if not project_path.is_dir(): logger.error(f'Project path {project_path} is not a folder.') return 1 project_restricted_path = project_restricted_path.replace('\\', '/') if not os.path.isabs(project_restricted_path): project_restricted_path = f'{dev_root}/{project_restricted_path}' - if not os.path.isdir(project_restricted_path): + project_restricted_path = pathlib.Path(project_restricted_path) + if not project_restricted_path.is_dir(): logger.error(f'Project Restricted path {project_restricted_path} is not a folder.') return 1 @@ -356,85 +390,116 @@ def add_remove_gem(add: bool, if not gem_path: logger.error('Gem path cannot be empty.') return 1 - gem_path = gem_path.replace('\\', '/') - - # gem path can be absolute or relative to the Gems folder under the dev root - if os.path.isabs(gem_path): - gem_root = gem_path - else: - gem_root = f'{dev_root}/Gems/{gem_path}' - + if not os.path.isabs(gem_path): + gem_path = f'{dev_root}/Gems/{gem_path}' + gem_path = pathlib.Path(gem_path) # make sure this gem already exists if we're adding. We can always remove a gem. - if add and not os.path.isdir(gem_root): - logger.error(f'{gem_root} dir does not exist.') + if add and not gem_path.is_dir(): + logger.error(f'{gem_path} dir does not exist.') return 1 - # gem name is now the last component of the gem root - gem_name = gem_name or os.path.basename(gem_root) - if not utils.validate_identifier(gem_name): - logger.error(f'{gem_name} is not a valid Gem name.') + # find all available modules in this gem_path + modules = find_gem_modules(gem_path) + if len(modules) == 0: + logger.error(f'No gem modules found.') return 1 - # if the project path is absolute use it, if not make it relative to the dev root - if os.path.isabs(project_path): - project_root = project_path - else: - project_root = f'{dev_root}/{project_path}' - if not os.path.isdir(project_root): - logger.error(f'Project {project_root} does not exist.') + # if gem target not specified, see if there is only 1 module + if not gem_target: + if len(modules) == 1: + gem_target = modules[0] + else: + logger.error(f'Gem target not specified: {modules}') + return 1 + elif gem_target not in modules: + logger.error(f'Gem target not in gem modules: {modules}') return 1 - # if the user has not specified either we will assume they meant both - if not runtime_dependency and not tool_dependency: + # gem cmake list text file is assumed to be in the parent folder is not specified + if add or isinstance(gem_cmake, str): + if not gem_cmake: + gem_cmake = gem_path.parent / 'CMakeLists.txt' + if not os.path.isabs(gem_cmake): + gem_cmake = f'{dev_root}/{gem_cmake}' + gem_cmake = pathlib.Path(gem_cmake) + if not gem_cmake.is_file(): + logger.error(f'CMakeLists.txt file {gem_cmake} does not exist.') + return 1 + + # if the user has not specified either we will assume they meant the most common which is runtime + if not runtime_dependency and not tool_dependency and not server_dependency and not dependencies_file: + logger.warning("Dependency type not specified: Assuming '--runtime-dependency'") runtime_dependency = True - tool_dependency = True ret_val = 0 - if runtime_dependency: - # make sure this is a project has a runtime_dependencies.cmake file - - project_runtime_dependencies_file = get_runtime_cmake(project_root) - - if not os.path.isfile(project_runtime_dependencies_file): - project_runtime_dependencies_file = f'{project_root}/Gem/Code/runtime_dependencies.cmake' - if not os.path.isfile(project_runtime_dependencies_file): - logger.error(f'Runtime dependencies file {project_runtime_dependencies_file} is not present.') - return 1 - + # if the user has specified the dependencies file then ignore the runtime_dependency and tool_dependency flags + if dependencies_file: + dependencies_file = pathlib.Path(dependencies_file) + # make sure this is a project has a dependencies_file + if not dependencies_file.is_file(): + logger.error(f'Dependencies file {dependencies_file} is not present.') + return 1 if add: # add the dependency - ret_val = add_gem_dependency(project_runtime_dependencies_file, gem_name) - + ret_val = add_gem_dependency(dependencies_file, gem_target) else: # remove the dependency - ret_val = remove_gem_dependency(project_runtime_dependencies_file, gem_name) - - # Tool dependencies should still attempt to remove even if removing the runtime failed (It may not be added as a - # runtime, no reason to force the user to re request) - if (ret_val == 0 or not add) and tool_dependency: - # make sure this is a project has a tool_dependencies.cmake file - - project_tool_dependencies_file = get_tool_cmake(project_root) - if not os.path.isfile(project_tool_dependencies_file): - project_tool_dependencies_file = f'{project_root}/Gem/Code/tool_dependencies.cmake' - if not os.path.isfile(project_tool_dependencies_file): - logger.error(f'Tool dependencies file {project_tool_dependencies_file} is not present.') - return 1 - - if add: - # add the dependency - ret_val = add_gem_dependency(project_tool_dependencies_file, gem_name) + ret_val = remove_gem_dependency(dependencies_file, gem_target) + else: + if ',' in platforms: + platforms = platforms.split(',') else: - # remove the dependency - ret_val = remove_gem_dependency(project_tool_dependencies_file, gem_name) + platforms = [platforms] + for platform in platforms: + if runtime_dependency: + # make sure this is a project has a runtime_dependencies.cmake file + project_runtime_dependencies_file = pathlib.Path(get_dependencies_cmake(project_path, 'runtime', platform)) + if not project_runtime_dependencies_file.is_file(): + logger.error(f'Runtime dependencies file {project_runtime_dependencies_file} is not present.') + return 1 + + if add: + # add the dependency + ret_val = add_gem_dependency(project_runtime_dependencies_file, gem_target) + else: + # remove the dependency + ret_val = remove_gem_dependency(project_runtime_dependencies_file, gem_target) + + if (ret_val == 0 or not add) and tool_dependency: + # make sure this is a project has a tool_dependencies.cmake file + project_tool_dependencies_file = pathlib.Path(get_dependencies_cmake(project_path, 'tool', platform)) + if not project_tool_dependencies_file.is_file(): + logger.error(f'Tool dependencies file {project_tool_dependencies_file} is not present.') + return 1 + + if add: + # add the dependency + ret_val = add_gem_dependency(project_tool_dependencies_file, gem_target) + else: + # remove the dependency + ret_val = remove_gem_dependency(project_tool_dependencies_file, gem_target) + + if (ret_val == 0 or not add) and server_dependency: + # make sure this is a project has a tool_dependencies.cmake file + project_server_dependencies_file = pathlib.Path(get_dependencies_cmake(project_path, 'server', platform)) + if not project_server_dependencies_file.is_file(): + logger.error(f'Server dependencies file {project_server_dependencies_file} is not present.') + return 1 + + if add: + # add the dependency + ret_val = add_gem_dependency(project_server_dependencies_file, gem_target) + else: + # remove the dependency + ret_val = remove_gem_dependency(project_server_dependencies_file, gem_target) if add: # add the gem subdir to the CMakeList.txt - ret_val = add_gem_subdir(f'{gem_root}/../CMakeLists.txt', gem_name) - elif remove_gem_from_cmake: + ret_val = add_gem_subdir(gem_cmake, gem_path.name) + elif gem_cmake: # remove the gem subdir from the CMakeList.txt - ret_val = remove_gem_subdir(f'{gem_root}/../CMakeLists.txt', gem_name) + ret_val = remove_gem_subdir(gem_cmake, gem_path.name) return ret_val @@ -443,21 +508,30 @@ def _run_add_gem(args: argparse) -> int: return add_remove_gem(True, common.determine_engine_root(), args.gem_path, + args.gem_target, args.project_path, + args.dependencies_file, args.project_restricted_path, args.runtime_dependency, - args.tool_dependency) + args.tool_dependency, + args.server_dependency, + args.platforms, + args.add_to_cmake) def _run_remove_gem(args: argparse) -> int: return add_remove_gem(False, common.determine_engine_root(), args.gem_path, + args.gem_target, args.project_path, + args.dependencies_file, args.project_restricted_path, args.runtime_dependency, args.tool_dependency, - args.remove_gem_from_cmake) + args.server_dependency, + args.platforms, + args.remove_from_cmake) def add_args(parser, subparsers) -> None: @@ -471,7 +545,7 @@ def add_args(parser, subparsers) -> None: :param parser: the caller instantiates a parser and passes it in here :param subparsers: the caller instantiates subparsers and passes it in here """ - add_gem_subparser = subparsers.add_parser('add_gem') + add_gem_subparser = subparsers.add_parser('add-gem') add_gem_subparser.add_argument('-pp', '--project-path', type=str, required=True, help='The path to the project, can be absolute or dev root relative') add_gem_subparser.add_argument('-prp', '--project-restricted-path', type=str, required=False, @@ -480,17 +554,32 @@ def add_args(parser, subparsers) -> None: ' relative') add_gem_subparser.add_argument('-gp', '--gem-path', type=str, required=True, help='The path to the gem, can be absolute or dev root/Gems relative') - add_gem_subparser.add_argument('-rd', '--runtime-dependency', type=bool, - help='Optional toggle if this gem should only be added as a runtime dependency' - ' and not tool dependency. If neither is specified then the gem is added' - ' to both.') - add_gem_subparser.add_argument('-td', '--tool-dependency', type=bool, - help='Optional toggle if this gem should only be added as a tool dependency' - ' and not a runtime dependency. If neither is specified then the gem is' - ' added to both.') + add_gem_subparser.add_argument('-gt', '--gem-target', type=str, required=False, + help='The cmake target name to add. If not specified it will assume gem_name') + add_gem_subparser.add_argument('-df', '--dependencies-file', type=str, required=False, + help='The cmake dependencies file in which the gem dependencies are specified.' + 'If not specified it will assume ') + add_gem_subparser.add_argument('-rd', '--runtime-dependency', action='store_true', required=False, + default=False, + help='Optional toggle if this gem should be added as a runtime dependency') + add_gem_subparser.add_argument('-td', '--tool-dependency', action='store_true', required=False, + default=False, + help='Optional toggle if this gem should be added as a tool dependency') + add_gem_subparser.add_argument('-sd', '--server-dependency', action='store_true', required=False, + default=False, + help='Optional toggle if this gem should be added as a server dependency') + add_gem_subparser.add_argument('-pl', '--platforms', type=str, required=False, + default='Common', + help='Optional list of platforms this gem should be added to.' + ' Ex. --platforms Mac,Windows,Linux') + add_gem_subparser.add_argument('-a', '--add-to-cmake', type=str, required=False, + default=None, + help='Add the gem folder to the CMakeLists.txt so that it builds. If not' + ' specified it will assume the CMakeLists.txt file in the parent folder of' + ' the gem_path.') add_gem_subparser.set_defaults(func=_run_add_gem) - remove_gem_subparser = subparsers.add_parser('remove_gem') + remove_gem_subparser = subparsers.add_parser('remove-gem') remove_gem_subparser.add_argument('-pp', '--project-path', type=str, required=True, help='The path to the project, can be absolute or dev root relative') remove_gem_subparser.add_argument('-prp', '--project-restricted-path', type=str, required=False, @@ -499,18 +588,29 @@ def add_args(parser, subparsers) -> None: ' relative') remove_gem_subparser.add_argument('-gp', '--gem-path', type=str, required=True, help='The path to the gem, can be absolute or dev root/Gems relative') - remove_gem_subparser.add_argument('-rd', '--runtime-dependency', type=bool, - help='Optional toggle if this gem should only be removed as a runtime dependency' - ' and not tool dependency. If neither is specified then the gem is removed' - ' from both.') - remove_gem_subparser.add_argument('-td', '--tool-dependency', type=bool, - help='Optional toggle if this gem should only be removed as a tool dependency' - ' and not a runtime dependency. If neither is specified then the gem is' - ' removed from both.') - remove_gem_subparser.add_argument('-r', '--remove-gem-from-cmake', action='store_true', required=False, + remove_gem_subparser.add_argument('-gt', '--gem-target', type=str, required=False, + help='The cmake target name to add. If not specified it will assume gem_name') + remove_gem_subparser.add_argument('-df', '--dependencies-file', type=str, required=False, + help='The cmake dependencies file in which the gem dependencies are specified.' + 'If not specified it will assume ') + remove_gem_subparser.add_argument('-rd', '--runtime-dependency', action='store_true', required=False, + default=False, + help='Optional toggle if this gem should be removed as a runtime dependency') + remove_gem_subparser.add_argument('-td', '--tool-dependency', action='store_true', required=False, + default=False, + help='Optional toggle if this gem should be removed as a server dependency') + remove_gem_subparser.add_argument('-sd', '--server-dependency', action='store_true', required=False, default=False, - help='Remove the gem from the Gem\'s CMakeLists.txt so it will no longer ' - 'build.') + help='Optional toggle if this gem should be removed as a server dependency') + remove_gem_subparser.add_argument('-pl', '--platforms', type=str, required=False, + default='Common', + help='Optional list of platforms this gem should be removed from' + ' Ex. --platforms Mac,Windows,Linux') + remove_gem_subparser.add_argument('-r', '--remove-from-cmake', type=str, required=False, + default=None, + help='Remove the gem folder from the CMakeLists.txt that includes it so that it ' + 'no longer builds build. If not specified it will assume you dont want to' + ' remove it.') remove_gem_subparser.set_defaults(func=_run_remove_gem) diff --git a/cmake/Tools/common.py b/cmake/Tools/common.py index b174983bb1..1f53c37c49 100755 --- a/cmake/Tools/common.py +++ b/cmake/Tools/common.py @@ -628,7 +628,7 @@ def get_test_module_registry(build_dir_path): test_module_items = unit_test_json['Amazon'] for _, test_module_item in test_module_items.items(): - module_file = test_module_item['Module'] + module_file = test_module_item['Modules'] dep_modules.append(module_file) except FileNotFoundError: diff --git a/cmake/Tools/current_project.py b/cmake/Tools/current_project.py index 10d6b73ffa..8be18fd3c9 100755 --- a/cmake/Tools/current_project.py +++ b/cmake/Tools/current_project.py @@ -88,10 +88,10 @@ def add_args(parser, subparsers) -> None: :param parser: the caller instantiates a parser and passes it in here :param subparsers: the caller instantiates subparsers and passes it in here """ - get_current_project_subparser = subparsers.add_parser('get_current_project') + get_current_project_subparser = subparsers.add_parser('get-current-project') get_current_project_subparser.set_defaults(func=_run_get_current_project) - set_current_project_subparser = subparsers.add_parser('set_current_project') + set_current_project_subparser = subparsers.add_parser('set-current-project') set_current_project_subparser.add_argument('-pp', '--project-path', required=True, help='The path to the project, can be absolute or dev root relative') set_current_project_subparser.set_defaults(func=_run_set_current_project) diff --git a/cmake/Tools/engine_template.py b/cmake/Tools/engine_template.py index 754546f21e..bf1ca93e57 100755 --- a/cmake/Tools/engine_template.py +++ b/cmake/Tools/engine_template.py @@ -416,11 +416,16 @@ def create_template(dev_root: str, source_restricted_path = source_restricted_path.replace('\\', '/') if not os.path.isabs(source_restricted_path): source_restricted_path = f'{dev_root}/{source_restricted_path}' + if not os.path.isdir(source_restricted_path): + logger.error(f'Src restricted path {source_restricted_path} is not a folder.') + return 1 # template_restricted_path template_restricted_path = template_restricted_path.replace('\\', '/') if not os.path.isabs(template_restricted_path): template_restricted_path = f'{dev_root}/{template_restricted_path}' + if not os.path.isdir(template_restricted_path): + os.makedirs(template_restricted_path) # source restricted relative source_restricted_platform_relative_path = source_restricted_platform_relative_path.replace('\\', '/') @@ -1009,11 +1014,16 @@ def create_from_template(dev_root: str, destination_restricted_path = destination_restricted_path.replace('\\', '/') if not os.path.isabs(destination_restricted_path): destination_restricted_path = f'{dev_root}/{destination_restricted_path}' + if not os.path.isdir(destination_restricted_path): + os.makedirs(destination_restricted_path) # template_restricted_path template_restricted_path = template_restricted_path.replace('\\', '/') if not os.path.isabs(template_restricted_path): template_restricted_path = f'{dev_root}/{template_restricted_path}' + if not os.path.isdir(template_restricted_path): + logger.error(f'Template restricted path {template_restricted_path} is not a folder.') + return 1 # destination restricted relative destination_restricted_platform_relative_path = destination_restricted_platform_relative_path.replace('\\', '/') @@ -1125,11 +1135,16 @@ def create_project(dev_root: str, project_restricted_path = project_restricted_path.replace('\\', '/') if not os.path.isabs(project_restricted_path): project_restricted_path = f'{dev_root}/{project_restricted_path}' + if not os.path.isdir(project_restricted_path): + os.makedirs(project_restricted_path) # template_restricted_path template_restricted_path = template_restricted_path.replace('\\', '/') if not os.path.isabs(template_restricted_path): template_restricted_path = f'{dev_root}/{template_restricted_path}' + if not os.path.isdir(template_restricted_path): + logger.error(f'Template restricted path {template_restricted_path} is not a folder.') + return 1 # project restricted relative project_restricted_platform_relative_path = project_restricted_platform_relative_path.replace('\\', '/') @@ -1295,11 +1310,16 @@ def create_gem(dev_root: str, gem_restricted_path = gem_restricted_path.replace('\\', '/') if not os.path.isabs(gem_restricted_path): gem_restricted_path = f'{dev_root}/{gem_restricted_path}' + if not os.path.isdir(gem_restricted_path): + os.makedirs(gem_restricted_path) # template_restricted_path template_restricted_path = template_restricted_path.replace('\\', '/') if not os.path.isabs(template_restricted_path): template_restricted_path = f'{dev_root}/{template_restricted_path}' + if not os.path.isdir(template_restricted_path): + logger.error(f'Template restricted path {template_restricted_path} is not a folder.') + return 1 # gem restricted relative gem_restricted_platform_relative_path = gem_restricted_platform_relative_path.replace('\\', '/') @@ -1424,13 +1444,13 @@ def add_args(parser, subparsers) -> None: invoked locally or aggregated by a central python file. Ex. Directly run from this file alone with: python engine_template.py create_gem --gem-path TestGem OR - lmbr.py can aggregate commands by importing engine_template, - call add_args and execute: python lmbr.py create_gem --gem-path TestGem + o3de.py can aggregate commands by importing engine_template, + call add_args and execute: python o3de.py create_gem --gem-path TestGem :param parser: the caller instantiates a parser and passes it in here :param subparsers: the caller instantiates subparsers and passes it in here """ # turn a directory into a template - create_template_subparser = subparsers.add_parser('create_template') + create_template_subparser = subparsers.add_parser('create-template') create_template_subparser.add_argument('-sp', '--source-path', type=str, required=True, help='The path to the source that you want to make into a template,' ' can be absolute or dev root relative.' @@ -1471,7 +1491,7 @@ def add_args(parser, subparsers) -> None: help='Should the template keep the restricted platforms in the template, or' ' create the restricted files in the restricted folder, default is' ' False') - create_template_subparser.add_argument('-kl', '--keep-license_text', action='store_true', + create_template_subparser.add_argument('-kl', '--keep-license-text', action='store_true', default=False, help='Should license text be kept in the instantiation,' ' default is False') @@ -1486,7 +1506,7 @@ def add_args(parser, subparsers) -> None: create_template_subparser.set_defaults(func=_run_create_template) # creation from a template - create_from_template_subparser = subparsers.add_parser('create_from_template') + create_from_template_subparser = subparsers.add_parser('create-from-template') create_from_template_subparser.add_argument('-dp', '--destination-path', type=str, required=True, help='The path to where you want the template instantiated,' ' can be absolute or dev root relative.' @@ -1526,7 +1546,7 @@ def add_args(parser, subparsers) -> None: help='Should the instance keep the restricted platforms in the instance,' ' or create the restricted files in the restricted folder, default' ' is False') - create_from_template_subparser.add_argument('-kl', '--keep-license_text', action='store_true', + create_from_template_subparser.add_argument('-kl', '--keep-license-text', action='store_true', default=False, help='Should license text be kept in the instantiation,' ' default is False') @@ -1541,7 +1561,7 @@ def add_args(parser, subparsers) -> None: create_from_template_subparser.set_defaults(func=_run_create_from_template) # creation of a project from a template (like create from template but makes project assumptions) - create_project_subparser = subparsers.add_parser('create_project') + create_project_subparser = subparsers.add_parser('create-project') create_project_subparser.add_argument('-pp', '--project-path', type=str, required=True, help='The name of the project you wish to create from the template,' ' can be an absolute path or dev root relative.' @@ -1581,7 +1601,7 @@ def add_args(parser, subparsers) -> None: default=False, help='Should the new project keep the restricted platforms in the project, or' 'create the restricted files in the restricted folder, default is False') - create_project_subparser.add_argument('-kl', '--keep-license_text', action='store_true', + create_project_subparser.add_argument('-kl', '--keep-license-text', action='store_true', default=False, help='Should license text be kept in the instantiation, default is False') create_project_subparser.add_argument('-r', '--replace', required=False, @@ -1607,7 +1627,7 @@ def add_args(parser, subparsers) -> None: create_project_subparser.set_defaults(func=_run_create_project) # creation of a gem from a template (like create from template but makes gem assumptions) - create_gem_subparser = subparsers.add_parser('create_gem') + create_gem_subparser = subparsers.add_parser('create-gem') create_gem_subparser.add_argument('-gp', '--gem-path', type=str, required=True, help='The path to the gem you want to create, can be absolute or dev root/Gems' ' relative.' @@ -1656,7 +1676,7 @@ def add_args(parser, subparsers) -> None: default=False, help='Should the new gem keep the restricted platforms in the project, or' 'create the restricted files in the restricted folder, default is False') - create_gem_subparser.add_argument('-kl', '--keep-license_text', action='store_true', + create_gem_subparser.add_argument('-kl', '--keep-license-text', action='store_true', default=False, help='Should license text be kept in the instantiation, default is False') create_gem_subparser.add_argument('--system-component-class-id', type=utils.validate_uuid4, required=False, diff --git a/cmake/Tools/registration.py b/cmake/Tools/registration.py index 04da331bf5..c16a712859 100755 --- a/cmake/Tools/registration.py +++ b/cmake/Tools/registration.py @@ -25,6 +25,53 @@ logger = logging.getLogger() logging.basicConfig() +def backup(file_name): + index = 0 + renamed = False + while not renamed: + backup_file_name = pathlib.Path(str(file_name) + '.bak' + str(index)) + if not backup_file_name.is_file(): + file_name = pathlib.Path(file_name) + file_name.rename(backup_file_name) + renamed = True + +def register_shipped_engine_o3de_objects(): + # register this engines shipped projects, gems and templates + engine_path = get_this_engine_path() + for root, dirs, files in os.walk(engine_path / 'AtomSampleViewer', topdown=False): + for name in files: + if name == 'project.json': + register(project_path=root) + elif name == 'gem.json': + register(gem_path=root) + elif name == 'template.json': + register(template_path=root) + + for root, dirs, files in os.walk(engine_path / 'AtomTest', topdown=False): + for name in files: + if name == 'project.json': + register(project_path=root) + elif name == 'gem.json': + register(gem_path=root) + elif name == 'template.json': + register(template_path=root) + + for root, dirs, files in os.walk(engine_path / 'Gems', topdown=False): + for name in files: + if name == 'gem.json': + register(gem_path=root) + + engine_templates = os.listdir(engine_path / 'Templates') + for engine_template in engine_templates: + register(template_path=engine_path / 'Templates' / engine_template) + + engine_projects = os.listdir(engine_path) + for engine_project in engine_projects: + engine_project_json = engine_path / engine_project / 'project.json' + if engine_project_json.is_file(): + register(project_path=engine_path / engine_project) + + def get_this_engine_path(): return pathlib.Path(os.path.realpath(__file__)).parent.parent.parent @@ -40,8 +87,9 @@ def get_o3de_folder(): def get_o3de_cache(): - cache_path = get_o3de_folder() / 'cache' - return cache_path + cache_folder = get_o3de_folder() / 'cache' + cache_folder.mkdir(parents=True, exist_ok=True) + return cache_folder def get_o3de_registry(): @@ -53,7 +101,6 @@ def get_o3de_registry(): json_data = {} json_data.update({'repo_name': f'{username}'}) json_data.update({'origin': get_o3de_folder().as_posix()}) - json_data.update({'root': ''}) json_data.update({'engines': []}) json_data.update({'projects': []}) json_data.update({'gems': []}) @@ -71,41 +118,6 @@ def get_o3de_registry(): with registry_path.open('w') as s: s.write(json.dumps(json_data, indent=4)) - # register this engines shipped gems and templates - engine_path = get_this_engine_path() - for root, dirs, files in os.walk(engine_path / 'AtomSampleViewer', topdown=False): - for name in files: - if name == 'project.json': - register(project_path=root) - elif name == 'gem.json': - register(gem_path=root) - elif name == 'template.json': - register(template_path=root) - - for root, dirs, files in os.walk(engine_path / 'AtomTest', topdown=False): - for name in files: - if name == 'project.json': - register(project_path=root) - elif name == 'gem.json': - register(gem_path=root) - elif name == 'template.json': - register(template_path=root) - - for root, dirs, files in os.walk(engine_path / 'Gems', topdown=False): - for name in files: - if name == 'gem.json': - register(gem_path=root) - - engine_templates = os.listdir(engine_path / 'Templates') - for engine_template in engine_templates: - register(template_path=engine_path / 'Templates' / engine_template) - - engine_projects = os.listdir(engine_path) - for engine_project in engine_projects: - engine_project_json = engine_path / engine_project / 'project.json' - if engine_project_json.is_file(): - register(project_path=engine_path / engine_project) - return registry_path @@ -125,22 +137,27 @@ def register_engine_path(json_data, if not engine_path: logger.error(f'Engine path cannot be empty.') return 1 + + while engine_path in json_data['engines']: + json_data['engines'].remove(engine_path) engine_path = pathlib.Path(engine_path) + while engine_path.as_posix() in json_data['engines']: + json_data['engines'].remove(engine_path.as_posix()) + + if remove: + logger.warn(f'Removing Engine path {engine_path}.') + return 0 + if not engine_path.is_dir(): logger.error(f'Engine path {engine_path} does not exist.') return 1 + engine_json = engine_path / 'engine.json' if not valid_o3de_engine_json(engine_json): logger.error(f'Engine json {engine_json} is not valid.') return 1 - engine_path = engine_path.as_posix() - engines = json_data['engines'] - - if engine_path in engines and remove: - engines.remove(engine_path) - elif not engine_path in engines: - engines.append(engine_path) + json_data['engines'].insert(0, engine_path.as_posix()) return 0 @@ -151,22 +168,27 @@ def register_gem_path(json_data, if not gem_path: logger.error(f'Gem path cannot be empty.') return 1 + + while gem_path in json_data['gems']: + json_data['gems'].remove(gem_path) gem_path = pathlib.Path(gem_path) + while gem_path.as_posix() in json_data['gems']: + json_data['gems'].remove(gem_path.as_posix()) + + if remove: + logger.warn(f'Removing Gem path {gem_path}.') + return 0 + if not gem_path.is_dir(): logger.error(f'Gem path {gem_path} does not exist.') return 1 + gem_json = gem_path / 'gem.json' if not valid_o3de_gem_json(gem_json): logger.error(f'Gem json {gem_json} is not valid.') return 1 - gem_path = gem_path.as_posix() - gems = json_data['gems'] - - if gem_path in gems and remove: - gems.remove(gem_path) - elif not gem_path in gems: - gems.append(gem_path) + json_data['gems'].insert(0, gem_path.as_posix()) return 0 @@ -177,22 +199,27 @@ def register_project_path(json_data, if not project_path: logger.error(f'Project path cannot be empty.') return 1 + + while project_path in json_data['projects']: + json_data['projects'].remove(project_path) project_path = pathlib.Path(project_path) + while project_path.as_posix() in json_data['projects']: + json_data['projects'].remove(project_path.as_posix()) + + if remove: + logger.warn(f'Removing Project path {project_path}.') + return 0 + if not project_path.is_dir(): logger.error(f'Project path {project_path} does not exist.') return 1 + project_json = project_path / 'project.json' if not valid_o3de_project_json(project_json): logger.error(f'Project json {project_json} is not valid.') return 1 - project_path = project_path.as_posix() - projects = json_data['projects'] - - if project_path in projects and remove: - projects.remove(project_path) - elif not project_path in projects: - projects.append(project_path) + json_data['projects'].insert(0, project_path.as_posix()) # registering a project has the additional step of setting the project.json 'engine' field this_engine_json = get_this_engine_path() / 'engine.json' @@ -216,43 +243,70 @@ def register_project_path(json_data, return 0 -def backup(file_name): - index = 0 - renamed = False - while not renamed: - backup_file_name = pathlib.Path(str(file_name) + '.bak' + str(index)) - if not backup_file_name.is_file(): - file_name = pathlib.Path(file_name) - file_name.rename(backup_file_name) - renamed = True - - def register_template_path(json_data, template_path: str, remove: bool = False) -> int: if not template_path: logger.error(f'Template path cannot be empty.') return 1 + + while template_path in json_data['templates']: + json_data['templates'].remove(template_path) template_path = pathlib.Path(template_path) + while template_path.as_posix() in json_data['templates']: + json_data['templates'].remove(template_path.as_posix()) + + if remove: + logger.warn(f'Removing Template path {template_path}.') + return 0 + if not template_path.is_dir(): logger.error(f'Template path {template_path} does not exist.') return 1 + template_json = template_path / 'template.json' if not valid_o3de_template_json(template_json): logger.error(f'Template json {template_json} is not valid.') return 1 - template_path = template_path.as_posix() - templates = json_data['templates'] - - if template_path in templates and remove: - templates.remove(template_path) - elif not template_path in templates: - templates.append(template_path) + json_data['templates'].insert(0, template_path.as_posix()) return 0 +def register_repo(json_data, + repo_uri: str, + remove: bool = False) -> int: + if not repo_uri: + logger.error(f'Repo URI cannot be empty.') + return 1 + + while repo_uri in json_data['repos']: + json_data['repos'].remove(repo_uri) + + if remove: + logger.warn(f'Removing repo uri {repo_uri}.') + + if remove: + result = refresh_repos() + else: + repo_hash = hashlib.md5(repo_uri.encode()) + cache_folder = get_o3de_cache() + cache_file = cache_folder / str(repo_hash.hexdigest() + '.json') + parsed_uri = urllib.parse.urlparse(repo_uri) + + if parsed_uri.scheme == 'http' or parsed_uri.scheme == 'https' or parsed_uri.scheme == 'ftp' or parsed_uri.scheme == 'ftps': + result = 0 # a function that processes the uri and returns result + if not result: + json_data['repos'].insert(0, repo_uri) + else: + repo_uri = pathlib.Path(repo_uri) + json_data['repos'].insert(0, repo_uri.as_posix()) + result = 0 + + return result + + def valid_o3de_manifest_json(file_name: str) -> bool: try: file_name = pathlib.Path(file_name) @@ -262,15 +316,11 @@ def valid_o3de_manifest_json(file_name: str) -> bool: json_data = json.load(f) test = json_data['repo_name'] test = json_data['origin'] - test = json_data['root'] test = json_data['engines'] test = json_data['projects'] test = json_data['gems'] test = json_data['templates'] test = json_data['repos'] - test = json_data['default_projects_folder'] - test = json_data['default_gems_folder'] - test = json_data['default_templates_folder'] except Exception as e: return False @@ -333,44 +383,6 @@ def valid_o3de_template_json(file_name: str) -> bool: return True -def register_repo(json_data, - repo_uri: str, - remove: bool = False) -> int: - if not repo_uri: - logger.error(f'Repo URI cannot be empty.') - return 1 - - repos = json_data['repos'] - repo_hash = hashlib.md5(repo_uri.encode()) - cache_folder = get_o3de_cache() - cache_folder.mkdir(parents=True, exist_ok=True) - cache_file = cache_folder / str(repo_hash.hexdigest() + '.json') - - result = 0 - - if remove: - if repo_uri in repos: - repos.remove(repo_uri) - result = refresh_repos() - else: - if not repo_uri in repos: - parsed_uri = urllib.parse.urlparse(repo_uri) - - result = 0 # for now - #if parsed_uri.scheme == 'http': - # result = download_o3de_manifest_http(parsed_uri, cache_file) - #elif parsed_uri.scheme == 'https': - # result = download_o3de_manifest_https(parsed_uri, cache_file) - #elif parsed_uri.scheme == 'ftp': - # result = download_o3de_manifest_ftp(parsed_uri, cache_file) - #elif parsed_uri.scheme == 'ftps': - # result = download_o3de_manifest_ftps(parsed_uri, cache_file) - #else: - # result = copy_o3de_manifest(repo_uri, cache_file) - - return result - - def register_default_projects_folder(json_data, default_projects_folder: str, remove: bool = False) -> int: @@ -481,13 +493,13 @@ def register(engine_path: str = None, return 1 result = register_repo(json_data, repo_uri, remove) - elif isinstance(engine_path, str) or isinstance(engine_path, pathlib.PurePath): + elif isinstance(default_projects_folder, str) or isinstance(default_projects_folder, pathlib.PurePath): result = register_default_projects_folder(json_data, default_projects_folder, remove) - elif isinstance(engine_path, str) or isinstance(engine_path, pathlib.PurePath): + elif isinstance(default_gems_folder, str) or isinstance(default_gems_folder, pathlib.PurePath): result = register_default_gems_folder(json_data, default_gems_folder, remove) - elif isinstance(engine_path, str) or isinstance(engine_path, pathlib.PurePath): + elif isinstance(default_templates_folder, str) or isinstance(default_templates_folder, pathlib.PurePath): result = register_default_templates_folder(json_data, default_templates_folder, remove) if not result: @@ -496,6 +508,51 @@ def register(engine_path: str = None, return 0 +def remove_invalid_o3de_objects(): + json_data = load_o3de_registry() + + for engine in json_data['engines']: + if not valid_o3de_engine_json(pathlib.Path(engine) / 'engine.json'): + logger.warn(f"Engine path {engine} is invalid.") + register(engine_path=engine, remove=True) + + for project in json_data['projects']: + if not valid_o3de_project_json(pathlib.Path(project) / 'project.json'): + logger.warn(f"Project path {project} is invalid.") + register(project_path=project, remove=True) + + for gem in json_data['gems']: + if not valid_o3de_gem_json(pathlib.Path(gem) / 'gem.json'): + logger.warn(f"Gem path {gem} is invalid.") + register(gem_path=gem, remove=True) + + for template in json_data['templates']: + if not valid_o3de_template_json(pathlib.Path(template) / 'template.json'): + logger.warn(f"Template path {template} is invalid.") + register(template_path=template, remove=True) + + default_projects_folder = pathlib.Path(json_data['default_projects_folder']) + if not default_projects_folder.is_dir(): + new_default_projects_folder = get_home_folder() / 'my_o3de/projects' + new_default_projects_folder.mkdir(parents=True, exist_ok=True) + logger.warn(f"Default projects folder {default_projects_folder} is invalid. Set default {new_default_projects_folder}") + register(default_projects_folder=new_default_projects_folder.as_posix()) + + default_gems_folder = pathlib.Path(json_data['default_gems_folder']) + if not default_gems_folder.is_dir(): + new_default_gems_folder = get_home_folder() / 'my_o3de/gems' + new_default_gems_folder.mkdir(parents=True, exist_ok=True) + logger.warn(f"Default gems folder {default_gems_folder} is invalid. Set default {new_default_gems_folder}") + register(default_gems_folder=new_default_gems_folder.as_posix()) + + default_templates_folder = pathlib.Path(json_data['default_templates_folder']) + if not default_templates_folder.is_dir(): + new_default_templates_folder = get_home_folder() / 'my_o3de/templates' + new_default_templates_folder.mkdir(parents=True, exist_ok=True) + logger.warn(f"Default templates folder {default_templates_folder} is invalid. Set default {new_default_templates_folder}") + register(default_templates_folder=new_default_templates_folder.as_posix()) + + def refresh_repos() -> int: json_data = load_o3de_registry() cache_folder = get_o3de_cache() @@ -504,15 +561,18 @@ def refresh_repos() -> int: if len(json_data['repos']) == 0: return 0 + result = 0 last_failure = 0 for repo_uri in json_data['repos']: repo_hash = hashlib.md5(repo_uri.encode()) cache_file = cache_folder / str(repo_hash.hexdigest() + '.json') parsed_uri = urllib.parse.urlparse(repo_uri) - last_failure = 0 + last_failure = 0 # download and validate the repo_uri + if not last_failure: + result = 1 - return last_failure + return result def get_registered(engine_name: str = None, @@ -663,6 +723,16 @@ def print_repos(json_data: str, def register_show_engines(verbose: int): json_data = load_o3de_registry() + del json_data['repo_name'] + del json_data['origin'] + del json_data['projects'] + del json_data['gems'] + del json_data['templates'] + del json_data['repos'] + del json_data['default_projects_folder'] + del json_data['default_gems_folder'] + del json_data['default_templates_folder'] + print(json.dumps(json_data, indent=4)) print_engines(json_data, verbose) @@ -671,6 +741,8 @@ def register_show_engines(verbose: int): def register_show_projects(verbose: int): json_data = load_o3de_registry() + del json_data['repo_name'] + del json_data['origin'] del json_data['engines'] del json_data['gems'] del json_data['templates'] @@ -687,6 +759,8 @@ def register_show_projects(verbose: int): def register_show_gems(verbose: int): json_data = load_o3de_registry() + del json_data['repo_name'] + del json_data['origin'] del json_data['engines'] del json_data['projects'] del json_data['templates'] @@ -703,6 +777,8 @@ def register_show_gems(verbose: int): def register_show_templates(verbose: int): json_data = load_o3de_registry() + del json_data['repo_name'] + del json_data['origin'] del json_data['engines'] del json_data['projects'] del json_data['gems'] @@ -719,6 +795,8 @@ def register_show_templates(verbose: int): def register_show_repos(verbose: int): json_data = load_o3de_registry() + del json_data['repo_name'] + del json_data['origin'] del json_data['engines'] del json_data['projects'] del json_data['gems'] @@ -922,10 +1000,12 @@ def register_show_aggregate(verbose: int): def _run_register(args: argparse) -> int: if args.update: + remove_invalid_o3de_objects() return refresh_repos() else: if args.this_engine: register(engine_path=get_this_engine_path()) + register_shipped_engine_o3de_objects() else: return register(args.engine_path, args.project_path, @@ -1023,8 +1103,7 @@ def add_args(parser, subparsers) -> None: group.add_argument('-u', '--update', action='store_true', required=False, default=False, help='Refresh the repo cache.') - - register_subparser.add_argument('-r', '--remove', type=bool, required=False, + register_subparser.add_argument('-r', '--remove', action='store_true', required=False, default=False, help='Remove entry.') @@ -1049,7 +1128,6 @@ def add_args(parser, subparsers) -> None: group.add_argument('-r', '--repos', action='store_true', required=False, default=False, help='Just the local repos. Ignores repos.') - group.add_argument('-a', '--aggregate', action='store_true', required=False, default=False, help='Combine all repos into a single list of resources.') diff --git a/cmake/cmake_files.cmake b/cmake/cmake_files.cmake index a3b978ed79..03b6c1d990 100644 --- a/cmake/cmake_files.cmake +++ b/cmake/cmake_files.cmake @@ -20,6 +20,7 @@ set(FILES FileUtil.cmake Findo3de.cmake LyAutoGen.cmake + LySet.cmake LYTestWrappers.cmake LYPython.cmake LYWrappers.cmake diff --git a/license_spectra_private_preview.txt b/license_spectra_private_preview.txt deleted file mode 100644 index 7748e6705a..0000000000 --- a/license_spectra_private_preview.txt +++ /dev/null @@ -1,26 +0,0 @@ -Amazon Project Spectra Private Preview -Copyright (c) 2016-2021 Amazon Technologies, Inc., its affiliates or licensors. All Rights Reserved. - -************************************* -CONFIDENTIAL - LIMITED RELEASE SOFTWARE - SUBJECT TO NONDISCLOSURE TERMS - -Project Spectra is a confidential, pre-release project. Without the prior written consent of Amazon, you may not disclose it or its existence to any third party that is not part of the Open 3D Engine project (each, a "Project Participant"). Please see the terms of your/your organization's nondisclosure agreement with Amazon for detailed terms. By accessing this software, you agree to these terms. - -Each Project Participant acknowledges that other Project Participants may now have, or in the future may develop or receive, information that is the same as, or similar to, Project Spectra without having breached an obligation of confidentiality to the other. Nothing in these terms (a) prevents a Project Participant from using, for any purpose and without compensating other Project Participants (or Amazon), information retained in the unaided memory of a Project Participant's personnel who have had access to Project Spectra or (b) obligates Project Participants to restrict the scope of employment of the Project Participant's Personnel; provided, however, that this section does not create a license under any copyright or patent of Amazon or any Project Participant. - -If you provide any suggestions, ideas, or other feedback in connection with Project Spectra ("Feedback"), all Project Participants will be entitled to use the Feedback without restriction. You agree to license any pull requests or other submissions of copyrighted material related to Project Spectra under the Apache 2.0 and MIT licenses. - -All materials are made available on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied. Do not remove or modify any license notices. - -************************************* -THIRD PARTY COMPONENTS - -Project Spectra requires the use of and makes available to you software and assets that have been developed by third parties and are subject to separate license terms (such as code licensed under an open source license), including the materials provided in \3rdParty. It is your responsibility to obtain and comply with the applicable licenses, along with any platform policies that may apply to you. Information on third party materials, and the applicable license terms, are referenced in or included with the materials, such as in separate LICENSE.txt files accompanying the materials. - -Please note that certain materials are subject to "copyleft" licenses, which require distribution of source code, including: -- Qt Toolkit https://github.com/qtproject/, which is subject to the GNU Lesser General Public License version 3 (with certain exceptions, see \3rdParty\Qt\). A copy of the source code for Qt Toolkit may be found at https://s3-us-west-2.amazonaws.com/ly-legal/LicenseConformance/Qt/Src.zip -- Chardet https://chardet.github.io/, which is subject to the GNU Lesser General Public License version 2.1. A copy of the source code may be found in \3rdParty\AWS\AWSPythonSDK\1.2.1\botocore\vendored\requests\packages\. - -This software contains Autodesk(R) FBX(R) code developed by Autodesk, Inc. Copyright 2013 Autodesk, Inc. All rights, reserved. Such code is provided "as is" and Autodesk, Inc. disclaims any and all warranties, whether express or implied, including without limitation the implied warranties of merchantability, fitness for a particular purpose or non-infringement of third party rights. In no event shall Autodesk, Inc. be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of such code. - -This product includes components of the PowerVR Tools Software from Imagination Technologies Limited. diff --git a/scripts/build/bootstrap/incremental_build_util.py b/scripts/build/bootstrap/incremental_build_util.py index 30d35280bf..d7e0d623c3 100755 --- a/scripts/build/bootstrap/incremental_build_util.py +++ b/scripts/build/bootstrap/incremental_build_util.py @@ -21,7 +21,6 @@ import sys import tempfile import traceback -IAM_ROLE_NAME = 'ec2-jenkins-node' DEFAULT_REGION = 'us-west-2' DEFAULT_DISK_SIZE = 300 DEFAULT_DISK_TYPE = 'gp2' @@ -129,41 +128,8 @@ def get_pipeline_and_branch(pipeline, branch): pipeline_and_branch = pipeline_and_branch.replace('/','_').replace('\\','_') return pipeline_and_branch -def get_iam_role_credentials(role_name): - security_metadata = None - try: - response = urllib2.urlopen( - 'http://169.254.169.254/latest/meta-data/iam/security-credentials/{0}'.format(role_name)).read() - security_metadata = ast.literal_eval(response) - except: - print 'Unable to get iam role credentials' - print traceback.print_exc() - - return security_metadata - - def get_ec2_client(region): - credentials = None - try: - response = urllib2.urlopen( - 'http://169.254.169.254/latest/meta-data/iam/security-credentials/{0}'.format(IAM_ROLE_NAME)).read() - credentials = ast.literal_eval(response) - except Exception as e: - print e.message - error('Error: Unable to get IAM rols credentials, please contact ly-build@ for help.') - - keys = ['AccessKeyId', 'SecretAccessKey', 'Token'] - for key in keys: - if key not in credentials: - error('Error: Unable to find {0} in get_iam_role_credentials response {1}'.format(key, credentials)) - - aws_access_key_id = credentials['AccessKeyId'] - aws_secret_access_key = credentials['SecretAccessKey'] - aws_session_token = credentials['Token'] - - client = boto3.client('ec2', region_name=region, aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key, - aws_session_token=aws_session_token) + client = boto3.client('ec2', region_name=region) return client diff --git a/scripts/build/tools/delete_stale_ebs.py b/scripts/build/tools/delete_stale_ebs.py new file mode 100644 index 0000000000..bbcd0f0611 --- /dev/null +++ b/scripts/build/tools/delete_stale_ebs.py @@ -0,0 +1,137 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import os +import requests +import traceback +import boto3 +import json +from datetime import datetime +from requests.auth import HTTPBasicAuth +from urllib.parse import unquote + + +class JenkinsAPIClient: + def __init__(self, jenkins_base_url, jenkins_username, jenkins_api_token): + self.jenkins_base_url = jenkins_base_url.rstrip('/') + self.jenkins_username = jenkins_username + self.jenkins_api_token = jenkins_api_token + + def get(self, url, retry=1): + for i in range(retry): + try: + response = requests.get(url, auth=HTTPBasicAuth(self.jenkins_username, self.jenkins_api_token)) + if response.ok: + return response.json() + except Exception: + traceback.print_exc() + print(f'WARN: Get request {url} failed, retying....') + print(f'WARN: Get request {url} failed, see exception for more details.') + + def get_pipeline(self, pipeline_name): + url = f'{self.jenkins_base_url}/job/{pipeline_name}/api/json' + # Use retry because Jenkins API call sometimes may fail when Jenkins server is on high load + return self.get(url, retry=3) + + def get_branch_job(self, pipeline_name, branch_name): + url = f'{self.jenkins_base_url}/blue/rest/organizations/jenkins/pipelines/{pipeline_name}/branches/{branch_name}' + # Use retry because Jenkins API call sometimes may fail when Jenkins server is on high load + return self.get(url, retry=3) + + +def delete_branch_ebs_volumes(branch_name): + """ + Make a fake branch deleted event and invoke the lambda function that we use to delete branch EBS volumes after a branch is deleted. + """ + # Unescape branch name as it's URL encoded + branch_name = unquote(branch_name) + input = { + "detail": { + "event": "referenceDeleted", + "repositoryName": "Lumberyard", + "referenceName": branch_name + } + } + client = boto3.client('lambda') + # Invoke lambda function "AutoDeleteEBS-Lambda" asynchronously. + # This lambda function can have 1000 concurrent runs. + # we will setup a SQS/SNS queue to process the events if the event number exceeds the function capacity. + client.invoke( + FunctionName='AutoDeleteEBS-Lambda', + InvocationType='Event', + Payload=json.dumps(input), + ) + + +def delete_old_branch_ebs_volumes(env): + """ + Check last run time of each branch build, if it exceeds the retention days, delete the EBS volumes that are tied to the branch. + """ + branch_volumes_deleted = [] + jenkins_client = JenkinsAPIClient(env['JENKINS_URL'], env['JENKINS_USERNAME'], env['JENKINS_API_TOKEN']) + today_date = datetime.today().date() + pipeline_name = env['PIPELINE_NAME'] + pipeline_job = jenkins_client.get_pipeline(pipeline_name) + if not pipeline_job: + print(f'ERROR: Cannot get data of pipeline job {pipeline_name}.') + exit(1) + branch_jobs = pipeline_job.get('jobs', []) + retention_days = int(env['RETENTION_DAYS']) + for branch_job in branch_jobs: + branch_name = branch_job['name'] + branch_job = jenkins_client.get_branch_job(pipeline_name, branch_name) + if not branch_job: + print(f'WARN: Cannot get data of {branch_name} job , skipping branch {pipeline_name}.') + continue + latest_run = branch_job.get('latestRun') + # If the job hasn't run, then there is no EBS volumes tied to that job + if latest_run: + latest_run_start_time = latest_run.get('startTime') + latest_run_datetime = datetime.strptime(latest_run_start_time, '%Y-%m-%dT%H:%M:%S.%f%z') + # Convert startTime to local timezone to compare, because Jenkins server may use a different timezone. + latest_run_date = latest_run_datetime.astimezone().date() + date_diff = today_date - latest_run_date + if date_diff.days > retention_days: + print(f'Branch {branch_name} job hasn\'t run for over {retention_days} days, deleting the EBS volumes of this branch...') + delete_branch_ebs_volumes(branch_name) + branch_volumes_deleted.append(branch_name) + print('Deleted EBS volumes for branches:') + print('\n'.join(branch_volumes_deleted)) + + +def get_required_env(env, keys): + success = True + for key in keys: + try: + env[key] = os.environ[key].strip() + except KeyError: + print(f'ERROR: {key} is not set in environment variable') + success = False + return success + + +def main(): + env = {} + required_env_list = [ + 'JENKINS_URL', + 'JENKINS_USERNAME', + 'JENKINS_API_TOKEN', + 'PIPELINE_NAME', + 'RETENTION_DAYS' + ] + if not get_required_env(env, required_env_list): + print('ERROR: Required environment variable is not set, see log for more details.') + + delete_old_branch_ebs_volumes(env) + + +if __name__ == "__main__": + main() diff --git a/scripts/commit_validation/commit_validation/commit_validation.py b/scripts/commit_validation/commit_validation/commit_validation.py index cfe20d3b94..8bdc81b470 100755 --- a/scripts/commit_validation/commit_validation/commit_validation.py +++ b/scripts/commit_validation/commit_validation/commit_validation.py @@ -178,13 +178,15 @@ EXCLUDED_VALIDATION_PATTERNS = [ '*/External/*', 'build', 'Cache', + '*/Code/Framework/AzCore/azgnmx/azgnmx/*', 'Code/Tools/CryFXC', 'Code/Tools/HLSLCrossCompiler', 'Code/Tools/HLSLCrossCompilerMETAL', - 'Code/Tools/UniversalRemoteConsole', 'Docs', 'python/runtime', 'restricted/*/Tools/*RemoteControl', 'Tools/3dsmax', 'Tools/Crashpad', + '*/user/Cache/*', + '*/user/log/*', ] diff --git a/scripts/commit_validation/commit_validation/pal_allowedlist.txt b/scripts/commit_validation/commit_validation/pal_allowedlist.txt index f72eb717a0..3b1dfdb3b9 100644 --- a/scripts/commit_validation/commit_validation/pal_allowedlist.txt +++ b/scripts/commit_validation/commit_validation/pal_allowedlist.txt @@ -63,5 +63,4 @@ */Gems/SaveData/Code/Tests/SaveDataTest.cpp */Gems/WhiteBox/Code/Source/Rendering/Legacy/WhiteBoxLegacyRenderMesh.cpp */restricted/*/Code/Framework/AzCore/AzCore/AzCore_Traits_*.h -*/SamplesProject/Gem/Code/Source/MetastreamTest/MetastreamTest.cpp */Tools/CryDeprecation/precompile_check_defines.h diff --git a/scripts/commit_validation/commit_validation/tests/validators/test_unicode_validator.py b/scripts/commit_validation/commit_validation/tests/validators/test_unicode_validator.py new file mode 100644 index 0000000000..f6773b4ddf --- /dev/null +++ b/scripts/commit_validation/commit_validation/tests/validators/test_unicode_validator.py @@ -0,0 +1,50 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import unittest +from unittest.mock import patch, mock_open + +from commit_validation.tests.mocks.mock_commit import MockCommit +from commit_validation.validators.unicode_validator import UnicodeValidator + + +class UnicodeValidatorTests(unittest.TestCase): + + @patch('builtins.open', mock_open(read_data='This file contains no unicode characters')) + def test_fileWithNoUnicode_passes(self): + commit = MockCommit(files=['/someCppFile.cpp']) + error_list = [] + self.assertTrue(UnicodeValidator().run(commit, error_list)) + self.assertEqual(len(error_list), 0, f"Unexpected errors: {error_list}") + + @patch('builtins.open', mock_open(read_data='This file contains unicode character \u2318')) + def test_fileWithUnicode_fails(self): + commit = MockCommit(files=['/someCppFile.cpp']) + error_list = [] + self.assertFalse(UnicodeValidator().run(commit, error_list)) + self.assertNotEqual(len(error_list), 0, f"Errors were expected but none were returned.") + + @patch('builtins.open', mock_open(read_data='This file contains unicode character \u2318')) + def test_fileExtensionIgnored_passes(self): + commit = MockCommit(files=['/someCppFile.somerandomextension']) + error_list = [] + self.assertTrue(UnicodeValidator().run(commit, error_list)) + self.assertEqual(len(error_list), 0, f"Unexpected errors: {error_list}") + + @patch('builtins.open', mock_open(read_data='This file contains unicode character: \\u2318')) + def test_fileWithEscapedUnicode_passes(self): + commit = MockCommit(files=['/someCppFile.cpp']) + error_list = [] + self.assertTrue(UnicodeValidator().run(commit, error_list)) + self.assertEqual(len(error_list), 0, f"Unexpected errors: {error_list}") + +if __name__ == '__main__': + unittest.main() diff --git a/scripts/commit_validation/commit_validation/validators/unicode_validator.py b/scripts/commit_validation/commit_validation/validators/unicode_validator.py new file mode 100644 index 0000000000..ca3e9502df --- /dev/null +++ b/scripts/commit_validation/commit_validation/validators/unicode_validator.py @@ -0,0 +1,54 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import fnmatch +import os.path +from typing import Type, List + +from commit_validation.commit_validation import Commit, CommitValidator, IsFileSkipped, SOURCE_AND_SCRIPT_FILE_EXTENSIONS, EXCLUDED_VALIDATION_PATTERNS, VERBOSE + +allowed_chars = { + 0xAD, # '_' + 0xAE, # '®' + 0xB0, # '°' +} +class UnicodeValidator(CommitValidator): + """A file-level validator that makes sure a file does not contain unicode characters""" + + def run(self, commit: Commit, errors: List[str]) -> bool: + for file_name in commit.get_files(): + if IsFileSkipped(file_name): + if VERBOSE: print(f'{file_name}::{self.__class__.__name__} SKIPPED UnicodeValidator - File excluded based on extension.') + continue + + for pattern in EXCLUDED_VALIDATION_PATTERNS: + if fnmatch.fnmatch(file_name, pattern): + if VERBOSE: print(f'{file_name} SKIPPED UnicodeValidator - Validation pattern excluded on path.') + break + else: + with open(file_name, 'r', encoding='utf-8', errors='strict') as fh: + linecount = 1 + for line in fh: + columncount = 0 + for ch in line: + ord_ch = ord(ch) + if ord_ch > 127 and ord_ch not in allowed_chars: + error_message = str(f'{file_name}::{self.__class__.__name__}:{linecount},{columncount} FAILED - Source file contains unicode character, replace with \\u{ord_ch:X}.') + errors.append(error_message) + if VERBOSE: print(error_message) + columncount += 1 + linecount += 1 + + return (not errors) + +def get_validator() -> Type[UnicodeValidator]: + """Returns the validator class for this module""" + return UnicodeValidator diff --git a/scripts/commit_validation/fix_unicode.py b/scripts/commit_validation/fix_unicode.py new file mode 100644 index 0000000000..1b54c936a1 --- /dev/null +++ b/scripts/commit_validation/fix_unicode.py @@ -0,0 +1,75 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import argparse +import fnmatch +import os + +handled_file_patterns = [ + '*.c', '*.cc', '*.cpp', '*.cxx', '*.h', '*.hpp', '*.hxx', '*.inl', '*.m', '*.mm', '*.cs', '*.java', + '*.py', '*.lua', '*.bat', '*.cmd', '*.sh', '*.js', + '*.cmake', 'CMakeLists.txt' +] +replacement_map = { + 0xA0: ' ', + 0xA6: '|', + 0x2019: '\'', + 0x2014: '-', + 0x2191: '^', + 0x2212: '-', + 0x2217: '*', + 0x2248: 'is close to', + 0xFEFF: '', +} + +def fixUnicode(input_file): + try: + basename = os.path.basename(input_file) + for pattern in handled_file_patterns: + if fnmatch.fnmatch(basename, pattern): + with open(input_file, 'r', encoding='utf-8', errors='replace') as fh: + fileContents = fh.read() + modified = False + for uni, repl in replacement_map.items(): + uni_str = chr(uni) + if uni_str in fileContents: + fileContents = fileContents.replace(uni_str, repl) + modified = True + if modified: + with open(input_file, 'w') as destination_file: + destination_file.writelines(fileContents) + print(f'[INFO] Patched {input_file}') + break + + except (IOError, UnicodeDecodeError) as err: + print('[ERROR] reading {}: {}'.format(input_file, err)) + return + +def main(): + """script main function""" + parser = argparse.ArgumentParser(description='This script replaces unicode characters, some of them are replaced for spaces (e.g. xA0), others are replaced with the escape sequence', + formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument('file_or_dir', type=str, nargs='+', + help='list of files or directories to search within for files to fix up unicode characters') + + args = parser.parse_args() + + for input_file in args.file_or_dir: + if os.path.isdir(input_file): + for dp, dn, filenames in os.walk(input_file): + for f in filenames: + fixUnicode(os.path.join(dp, f)) + else: + fixUnicode(input_file) + +#entrypoint +if __name__ == '__main__': + main() diff --git a/scripts/project_manager/projects.py b/scripts/project_manager/projects.py index 89457997fb..e48439dade 100755 --- a/scripts/project_manager/projects.py +++ b/scripts/project_manager/projects.py @@ -384,11 +384,18 @@ class ProjectDialog(QObject): :return: None """ remove_gems = self.get_selected_project_gems() + for this_gem in remove_gems: gem_path = self.path_for_gem(this_gem) - add_remove_gem.add_remove_gem(False, engine_path, gem_path or os.path.join(engine_path, 'Gems', this_gem), - self.path_for_selection(), gem_name=this_gem) - + add_remove_gem.add_remove_gem(add=False, + dev_root=engine_path, + gem_path=gem_path or os.path.join(engine_path, 'Gems', this_gem), + gem_target=this_gem, + project_path=self.path_for_selection(), + dependencies_file=None, + runtime_dependency=True, + tool_dependency=True, + server_dependency=True) self.update_gems() def manage_gems_handler(self): @@ -455,10 +462,15 @@ class ProjectDialog(QObject): if not gem_info: logger.error(f'Unknown gem {this_gem}!') continue - add_remove_gem.add_remove_gem(True, engine_path, this_gem[1], self.path_for_selection(), - gem_name=gem_info.get('Name'), + add_remove_gem.add_remove_gem(add=True, + dev_root=engine_path, + gem_path=this_gem[1], + gem_target=gem_info.get('Name'), + project_path=self.path_for_selection(), + dependencies_file=None, runtime_dependency=gem_info.get('Runtime', False), - tool_dependency=gem_info.get('Tools', False)) + tool_dependency=gem_info.get('Tools', False), + server_dependency=gem_info.get('Tools', False)) self.update_gems() def create_project_handler(self): diff --git a/scripts/project_manager/pyside.py b/scripts/project_manager/pyside.py index 03bccd53fa..80bf327f9b 100755 --- a/scripts/project_manager/pyside.py +++ b/scripts/project_manager/pyside.py @@ -29,6 +29,7 @@ def add_pyside_environment(bin_path): old_env = os.environ.copy() binaries_path = Path(os.path.normpath(bin_path)) platforms_path = binaries_path.joinpath("platforms") + logger.info(f'Adding binaries path {binaries_path}') os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = str(platforms_path) path = os.environ['PATH']